Add tests derived from VK-GL-CTS

This adds SPIR-V assembly and WGSL tests derived from VK-GL-CTS commit
571256871c2e2f03995373e1e4a02958d8cd8cf5. The following procedure was
followed:

- Those .amber files in VK-GL-CTS wholly owned by Google were
  identified

- All GLSL and SPIR-V shaders were extracted from the Amber files and
  converted into SPIR-V binaries

- The compact-ids pass of spirv-opt was applied to each binary

- Duplicate binaries were removed

- spirv-opt -O was used to obtain an optimized version of each remaining
  binary, with duplicates discarded

- Binaries that failed validation using spirv-val with target
  environment SPIR-V 1.3 were discarded

- Those binaries that tint could not successfully convert into WGSL were
  put aside for further investigation

- SPIR-V assembly versions of the remaining binaries are included in
  this CL

- test-runner with -generate-expected and -generate-skip was used to
  generate expected .spvasm, .msl, .hlsl and .wgsl outputs for these
  SPIR-V assembly tests

- Each successfully-generated .expected.wgsl is included in this CL
  again, as a WGLSL test

- test-runner with -generate-expected and -generate-skip was used again,
  to generate expected outputs for these WGSL tests

Change-Id: Ibe9baf2729cf97e0b633db9a426f53362a5de540
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/58842
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
diff --git a/test/vk-gl-cts/api/descriptor_set/descriptor_set_layout_binding/layout_binding_order/0.spvasm b/test/vk-gl-cts/api/descriptor_set/descriptor_set_layout_binding/layout_binding_order/0.spvasm
new file mode 100644
index 0000000..ec35bd5
--- /dev/null
+++ b/test/vk-gl-cts/api/descriptor_set/descriptor_set_layout_binding/layout_binding_order/0.spvasm
@@ -0,0 +1,75 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main"
+               OpExecutionMode %main LocalSize 1 1 1
+               OpSource GLSL 430
+               OpName %main "main"
+               OpName %result "result"
+               OpMemberName %result 0 "res0"
+               OpMemberName %result 1 "res1"
+               OpMemberName %result 2 "res2"
+               OpName %_ ""
+               OpName %block0 "block0"
+               OpMemberName %block0 0 "data0"
+               OpName %__0 ""
+               OpName %block1 "block1"
+               OpMemberName %block1 0 "data1"
+               OpName %__1 ""
+               OpName %block2 "block2"
+               OpMemberName %block2 0 "data2"
+               OpName %__2 ""
+               OpMemberDecorate %result 0 Offset 0
+               OpMemberDecorate %result 1 Offset 4
+               OpMemberDecorate %result 2 Offset 8
+               OpDecorate %result Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 3
+               OpMemberDecorate %block0 0 Offset 0
+               OpDecorate %block0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpMemberDecorate %block1 0 Offset 0
+               OpDecorate %block1 Block
+               OpDecorate %__1 DescriptorSet 0
+               OpDecorate %__1 Binding 1
+               OpMemberDecorate %block2 0 Offset 0
+               OpDecorate %block2 Block
+               OpDecorate %__2 DescriptorSet 0
+               OpDecorate %__2 Binding 2
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+     %result = OpTypeStruct %int %int %int
+%_ptr_StorageBuffer_result = OpTypePointer StorageBuffer %result
+          %_ = OpVariable %_ptr_StorageBuffer_result StorageBuffer
+      %int_0 = OpConstant %int 0
+     %block0 = OpTypeStruct %int
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+        %__0 = OpVariable %_ptr_Uniform_block0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+      %int_1 = OpConstant %int 1
+     %block1 = OpTypeStruct %int
+%_ptr_Uniform_block1 = OpTypePointer Uniform %block1
+        %__1 = OpVariable %_ptr_Uniform_block1 Uniform
+      %int_2 = OpConstant %int 2
+     %block2 = OpTypeStruct %int
+%_ptr_Uniform_block2 = OpTypePointer Uniform %block2
+        %__2 = OpVariable %_ptr_Uniform_block2 Uniform
+       %main = OpFunction %void None %12
+         %23 = OpLabel
+         %24 = OpAccessChain %_ptr_Uniform_int %__0 %int_0
+         %25 = OpLoad %int %24
+         %26 = OpAccessChain %_ptr_StorageBuffer_int %_ %int_0
+               OpStore %26 %25
+         %27 = OpAccessChain %_ptr_Uniform_int %__1 %int_0
+         %28 = OpLoad %int %27
+         %29 = OpAccessChain %_ptr_StorageBuffer_int %_ %int_1
+               OpStore %29 %28
+         %30 = OpAccessChain %_ptr_Uniform_int %__2 %int_0
+         %31 = OpLoad %int %30
+         %32 = OpAccessChain %_ptr_StorageBuffer_int %_ %int_2
+               OpStore %32 %31
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/api/descriptor_set/descriptor_set_layout_binding/layout_binding_order/0.spvasm.expected.hlsl b/test/vk-gl-cts/api/descriptor_set/descriptor_set_layout_binding/layout_binding_order/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..970956b
--- /dev/null
+++ b/test/vk-gl-cts/api/descriptor_set/descriptor_set_layout_binding/layout_binding_order/0.spvasm.expected.hlsl
@@ -0,0 +1,26 @@
+RWByteAddressBuffer x_4 : register(u3, space0);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[1];
+};
+cbuffer cbuffer_x_10 : register(b2, space0) {
+  uint4 x_10[1];
+};
+
+void main_1() {
+  const int x_25 = asint(x_6[0].x);
+  x_4.Store(0u, asuint(x_25));
+  const int x_28 = asint(x_8[0].x);
+  x_4.Store(4u, asuint(x_28));
+  const int x_31 = asint(x_10[0].x);
+  x_4.Store(8u, asuint(x_31));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void main() {
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/api/descriptor_set/descriptor_set_layout_binding/layout_binding_order/0.spvasm.expected.msl b/test/vk-gl-cts/api/descriptor_set/descriptor_set_layout_binding/layout_binding_order/0.spvasm.expected.msl
new file mode 100644
index 0000000..396f33d
--- /dev/null
+++ b/test/vk-gl-cts/api/descriptor_set/descriptor_set_layout_binding/layout_binding_order/0.spvasm.expected.msl
@@ -0,0 +1,33 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct result {
+  /* 0x0000 */ int res0;
+  /* 0x0004 */ int res1;
+  /* 0x0008 */ int res2;
+};
+struct block0 {
+  /* 0x0000 */ int data0;
+};
+struct block1 {
+  /* 0x0000 */ int data1;
+};
+struct block2 {
+  /* 0x0000 */ int data2;
+};
+
+void main_1(constant block0& x_6, constant block1& x_8, constant block2& x_10, device result& x_4) {
+  int const x_25 = x_6.data0;
+  x_4.res0 = x_25;
+  int const x_28 = x_8.data1;
+  x_4.res1 = x_28;
+  int const x_31 = x_10.data2;
+  x_4.res2 = x_31;
+  return;
+}
+
+kernel void tint_symbol(constant block0& x_6 [[buffer(0)]], constant block1& x_8 [[buffer(1)]], constant block2& x_10 [[buffer(2)]], device result& x_4 [[buffer(3)]]) {
+  main_1(x_6, x_8, x_10, x_4);
+  return;
+}
+
diff --git a/test/vk-gl-cts/api/descriptor_set/descriptor_set_layout_binding/layout_binding_order/0.spvasm.expected.spvasm b/test/vk-gl-cts/api/descriptor_set/descriptor_set_layout_binding/layout_binding_order/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..bd8b189
--- /dev/null
+++ b/test/vk-gl-cts/api/descriptor_set/descriptor_set_layout_binding/layout_binding_order/0.spvasm.expected.spvasm
@@ -0,0 +1,88 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 36
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main"
+               OpExecutionMode %main LocalSize 1 1 1
+               OpName %result "result"
+               OpMemberName %result 0 "res0"
+               OpMemberName %result 1 "res1"
+               OpMemberName %result 2 "res2"
+               OpName %x_4 "x_4"
+               OpName %block0 "block0"
+               OpMemberName %block0 0 "data0"
+               OpName %x_6 "x_6"
+               OpName %block1 "block1"
+               OpMemberName %block1 0 "data1"
+               OpName %x_8 "x_8"
+               OpName %block2 "block2"
+               OpMemberName %block2 0 "data2"
+               OpName %x_10 "x_10"
+               OpName %main_1 "main_1"
+               OpName %main "main"
+               OpDecorate %result Block
+               OpMemberDecorate %result 0 Offset 0
+               OpMemberDecorate %result 1 Offset 4
+               OpMemberDecorate %result 2 Offset 8
+               OpDecorate %x_4 DescriptorSet 0
+               OpDecorate %x_4 Binding 3
+               OpDecorate %block0 Block
+               OpMemberDecorate %block0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %block1 Block
+               OpMemberDecorate %block1 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %block2 Block
+               OpMemberDecorate %block2 0 Offset 0
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 2
+        %int = OpTypeInt 32 1
+     %result = OpTypeStruct %int %int %int
+%_ptr_StorageBuffer_result = OpTypePointer StorageBuffer %result
+        %x_4 = OpVariable %_ptr_StorageBuffer_result StorageBuffer
+     %block0 = OpTypeStruct %int
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+        %x_6 = OpVariable %_ptr_Uniform_block0 Uniform
+     %block1 = OpTypeStruct %int
+%_ptr_Uniform_block1 = OpTypePointer Uniform %block1
+        %x_8 = OpVariable %_ptr_Uniform_block1 Uniform
+     %block2 = OpTypeStruct %int
+%_ptr_Uniform_block2 = OpTypePointer Uniform %block2
+       %x_10 = OpVariable %_ptr_Uniform_block2 Uniform
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+         %21 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0
+         %22 = OpLoad %int %21
+         %24 = OpAccessChain %_ptr_StorageBuffer_int %x_4 %uint_0
+               OpStore %24 %22
+         %25 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0
+         %26 = OpLoad %int %25
+         %28 = OpAccessChain %_ptr_StorageBuffer_int %x_4 %uint_1
+               OpStore %28 %26
+         %29 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0
+         %30 = OpLoad %int %29
+         %32 = OpAccessChain %_ptr_StorageBuffer_int %x_4 %uint_2
+               OpStore %32 %30
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %34 = OpLabel
+         %35 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/api/descriptor_set/descriptor_set_layout_binding/layout_binding_order/0.spvasm.expected.wgsl b/test/vk-gl-cts/api/descriptor_set/descriptor_set_layout_binding/layout_binding_order/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..7f8a2d7
--- /dev/null
+++ b/test/vk-gl-cts/api/descriptor_set/descriptor_set_layout_binding/layout_binding_order/0.spvasm.expected.wgsl
@@ -0,0 +1,44 @@
+[[block]]
+struct result {
+  res0 : i32;
+  res1 : i32;
+  res2 : i32;
+};
+
+[[block]]
+struct block0 {
+  data0 : i32;
+};
+
+[[block]]
+struct block1 {
+  data1 : i32;
+};
+
+[[block]]
+struct block2 {
+  data2 : i32;
+};
+
+[[group(0), binding(3)]] var<storage, read_write> x_4 : result;
+
+[[group(0), binding(0)]] var<uniform> x_6 : block0;
+
+[[group(0), binding(1)]] var<uniform> x_8 : block1;
+
+[[group(0), binding(2)]] var<uniform> x_10 : block2;
+
+fn main_1() {
+  let x_25 : i32 = x_6.data0;
+  x_4.res0 = x_25;
+  let x_28 : i32 = x_8.data1;
+  x_4.res1 = x_28;
+  let x_31 : i32 = x_10.data2;
+  x_4.res2 = x_31;
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main() {
+  main_1();
+}
diff --git a/test/vk-gl-cts/api/descriptor_set/descriptor_set_layout_binding/layout_binding_order/0.wgsl b/test/vk-gl-cts/api/descriptor_set/descriptor_set_layout_binding/layout_binding_order/0.wgsl
new file mode 100644
index 0000000..7f8a2d7
--- /dev/null
+++ b/test/vk-gl-cts/api/descriptor_set/descriptor_set_layout_binding/layout_binding_order/0.wgsl
@@ -0,0 +1,44 @@
+[[block]]
+struct result {
+  res0 : i32;
+  res1 : i32;
+  res2 : i32;
+};
+
+[[block]]
+struct block0 {
+  data0 : i32;
+};
+
+[[block]]
+struct block1 {
+  data1 : i32;
+};
+
+[[block]]
+struct block2 {
+  data2 : i32;
+};
+
+[[group(0), binding(3)]] var<storage, read_write> x_4 : result;
+
+[[group(0), binding(0)]] var<uniform> x_6 : block0;
+
+[[group(0), binding(1)]] var<uniform> x_8 : block1;
+
+[[group(0), binding(2)]] var<uniform> x_10 : block2;
+
+fn main_1() {
+  let x_25 : i32 = x_6.data0;
+  x_4.res0 = x_25;
+  let x_28 : i32 = x_8.data1;
+  x_4.res1 = x_28;
+  let x_31 : i32 = x_10.data2;
+  x_4.res2 = x_31;
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main() {
+  main_1();
+}
diff --git a/test/vk-gl-cts/api/descriptor_set/descriptor_set_layout_binding/layout_binding_order/0.wgsl.expected.hlsl b/test/vk-gl-cts/api/descriptor_set/descriptor_set_layout_binding/layout_binding_order/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..970956b
--- /dev/null
+++ b/test/vk-gl-cts/api/descriptor_set/descriptor_set_layout_binding/layout_binding_order/0.wgsl.expected.hlsl
@@ -0,0 +1,26 @@
+RWByteAddressBuffer x_4 : register(u3, space0);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[1];
+};
+cbuffer cbuffer_x_10 : register(b2, space0) {
+  uint4 x_10[1];
+};
+
+void main_1() {
+  const int x_25 = asint(x_6[0].x);
+  x_4.Store(0u, asuint(x_25));
+  const int x_28 = asint(x_8[0].x);
+  x_4.Store(4u, asuint(x_28));
+  const int x_31 = asint(x_10[0].x);
+  x_4.Store(8u, asuint(x_31));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void main() {
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/api/descriptor_set/descriptor_set_layout_binding/layout_binding_order/0.wgsl.expected.msl b/test/vk-gl-cts/api/descriptor_set/descriptor_set_layout_binding/layout_binding_order/0.wgsl.expected.msl
new file mode 100644
index 0000000..396f33d
--- /dev/null
+++ b/test/vk-gl-cts/api/descriptor_set/descriptor_set_layout_binding/layout_binding_order/0.wgsl.expected.msl
@@ -0,0 +1,33 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct result {
+  /* 0x0000 */ int res0;
+  /* 0x0004 */ int res1;
+  /* 0x0008 */ int res2;
+};
+struct block0 {
+  /* 0x0000 */ int data0;
+};
+struct block1 {
+  /* 0x0000 */ int data1;
+};
+struct block2 {
+  /* 0x0000 */ int data2;
+};
+
+void main_1(constant block0& x_6, constant block1& x_8, constant block2& x_10, device result& x_4) {
+  int const x_25 = x_6.data0;
+  x_4.res0 = x_25;
+  int const x_28 = x_8.data1;
+  x_4.res1 = x_28;
+  int const x_31 = x_10.data2;
+  x_4.res2 = x_31;
+  return;
+}
+
+kernel void tint_symbol(constant block0& x_6 [[buffer(0)]], constant block1& x_8 [[buffer(1)]], constant block2& x_10 [[buffer(2)]], device result& x_4 [[buffer(3)]]) {
+  main_1(x_6, x_8, x_10, x_4);
+  return;
+}
+
diff --git a/test/vk-gl-cts/api/descriptor_set/descriptor_set_layout_binding/layout_binding_order/0.wgsl.expected.spvasm b/test/vk-gl-cts/api/descriptor_set/descriptor_set_layout_binding/layout_binding_order/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..bd8b189
--- /dev/null
+++ b/test/vk-gl-cts/api/descriptor_set/descriptor_set_layout_binding/layout_binding_order/0.wgsl.expected.spvasm
@@ -0,0 +1,88 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 36
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main"
+               OpExecutionMode %main LocalSize 1 1 1
+               OpName %result "result"
+               OpMemberName %result 0 "res0"
+               OpMemberName %result 1 "res1"
+               OpMemberName %result 2 "res2"
+               OpName %x_4 "x_4"
+               OpName %block0 "block0"
+               OpMemberName %block0 0 "data0"
+               OpName %x_6 "x_6"
+               OpName %block1 "block1"
+               OpMemberName %block1 0 "data1"
+               OpName %x_8 "x_8"
+               OpName %block2 "block2"
+               OpMemberName %block2 0 "data2"
+               OpName %x_10 "x_10"
+               OpName %main_1 "main_1"
+               OpName %main "main"
+               OpDecorate %result Block
+               OpMemberDecorate %result 0 Offset 0
+               OpMemberDecorate %result 1 Offset 4
+               OpMemberDecorate %result 2 Offset 8
+               OpDecorate %x_4 DescriptorSet 0
+               OpDecorate %x_4 Binding 3
+               OpDecorate %block0 Block
+               OpMemberDecorate %block0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %block1 Block
+               OpMemberDecorate %block1 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %block2 Block
+               OpMemberDecorate %block2 0 Offset 0
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 2
+        %int = OpTypeInt 32 1
+     %result = OpTypeStruct %int %int %int
+%_ptr_StorageBuffer_result = OpTypePointer StorageBuffer %result
+        %x_4 = OpVariable %_ptr_StorageBuffer_result StorageBuffer
+     %block0 = OpTypeStruct %int
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+        %x_6 = OpVariable %_ptr_Uniform_block0 Uniform
+     %block1 = OpTypeStruct %int
+%_ptr_Uniform_block1 = OpTypePointer Uniform %block1
+        %x_8 = OpVariable %_ptr_Uniform_block1 Uniform
+     %block2 = OpTypeStruct %int
+%_ptr_Uniform_block2 = OpTypePointer Uniform %block2
+       %x_10 = OpVariable %_ptr_Uniform_block2 Uniform
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+         %21 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0
+         %22 = OpLoad %int %21
+         %24 = OpAccessChain %_ptr_StorageBuffer_int %x_4 %uint_0
+               OpStore %24 %22
+         %25 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0
+         %26 = OpLoad %int %25
+         %28 = OpAccessChain %_ptr_StorageBuffer_int %x_4 %uint_1
+               OpStore %28 %26
+         %29 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0
+         %30 = OpLoad %int %29
+         %32 = OpAccessChain %_ptr_StorageBuffer_int %x_4 %uint_2
+               OpStore %32 %30
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %34 = OpLabel
+         %35 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/api/descriptor_set/descriptor_set_layout_binding/layout_binding_order/0.wgsl.expected.wgsl b/test/vk-gl-cts/api/descriptor_set/descriptor_set_layout_binding/layout_binding_order/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..7f8a2d7
--- /dev/null
+++ b/test/vk-gl-cts/api/descriptor_set/descriptor_set_layout_binding/layout_binding_order/0.wgsl.expected.wgsl
@@ -0,0 +1,44 @@
+[[block]]
+struct result {
+  res0 : i32;
+  res1 : i32;
+  res2 : i32;
+};
+
+[[block]]
+struct block0 {
+  data0 : i32;
+};
+
+[[block]]
+struct block1 {
+  data1 : i32;
+};
+
+[[block]]
+struct block2 {
+  data2 : i32;
+};
+
+[[group(0), binding(3)]] var<storage, read_write> x_4 : result;
+
+[[group(0), binding(0)]] var<uniform> x_6 : block0;
+
+[[group(0), binding(1)]] var<uniform> x_8 : block1;
+
+[[group(0), binding(2)]] var<uniform> x_10 : block2;
+
+fn main_1() {
+  let x_25 : i32 = x_6.data0;
+  x_4.res0 = x_25;
+  let x_28 : i32 = x_8.data1;
+  x_4.res1 = x_28;
+  let x_31 : i32 = x_10.data2;
+  x_4.res2 = x_31;
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main() {
+  main_1();
+}
diff --git a/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_compute/0.spvasm b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_compute/0.spvasm
new file mode 100644
index 0000000..1fb15a6
--- /dev/null
+++ b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_compute/0.spvasm
@@ -0,0 +1,35 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main"
+               OpExecutionMode %main LocalSize 1 1 1
+               OpSource GLSL 430
+               OpName %main "main"
+               OpName %block0 "block0"
+               OpMemberName %block0 0 "data"
+               OpName %_ ""
+               OpMemberDecorate %block0 0 Offset 0
+               OpDecorate %block0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+       %void = OpTypeVoid
+          %6 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+     %block0 = OpTypeStruct %v4float
+%_ptr_StorageBuffer_block0 = OpTypePointer StorageBuffer %block0
+          %_ = OpVariable %_ptr_StorageBuffer_block0 StorageBuffer
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+    %float_4 = OpConstant %float 4
+         %16 = OpConstantComposite %v4float %float_1 %float_2 %float_3 %float_4
+%_ptr_StorageBuffer_v4float = OpTypePointer StorageBuffer %v4float
+       %main = OpFunction %void None %6
+         %18 = OpLabel
+         %19 = OpAccessChain %_ptr_StorageBuffer_v4float %_ %int_0
+               OpStore %19 %16
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_compute/0.spvasm.expected.hlsl b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_compute/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..a5513da
--- /dev/null
+++ b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_compute/0.spvasm.expected.hlsl
@@ -0,0 +1,12 @@
+RWByteAddressBuffer x_4 : register(u1, space0);
+
+void main_1() {
+  x_4.Store4(0u, asuint(float4(1.0f, 2.0f, 3.0f, 4.0f)));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void main() {
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_compute/0.spvasm.expected.msl b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_compute/0.spvasm.expected.msl
new file mode 100644
index 0000000..a410fd8
--- /dev/null
+++ b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_compute/0.spvasm.expected.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct block0 {
+  /* 0x0000 */ packed_float4 data;
+};
+
+void main_1(device block0& x_4) {
+  x_4.data = float4(1.0f, 2.0f, 3.0f, 4.0f);
+  return;
+}
+
+kernel void tint_symbol(device block0& x_4 [[buffer(1)]]) {
+  main_1(x_4);
+  return;
+}
+
diff --git a/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_compute/0.spvasm.expected.spvasm b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_compute/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..9494d1f
--- /dev/null
+++ b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_compute/0.spvasm.expected.spvasm
@@ -0,0 +1,44 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 22
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main"
+               OpExecutionMode %main LocalSize 1 1 1
+               OpName %block0 "block0"
+               OpMemberName %block0 0 "data"
+               OpName %x_4 "x_4"
+               OpName %main_1 "main_1"
+               OpName %main "main"
+               OpDecorate %block0 Block
+               OpMemberDecorate %block0 0 Offset 0
+               OpDecorate %x_4 DescriptorSet 0
+               OpDecorate %x_4 Binding 1
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+     %block0 = OpTypeStruct %v4float
+%_ptr_StorageBuffer_block0 = OpTypePointer StorageBuffer %block0
+        %x_4 = OpVariable %_ptr_StorageBuffer_block0 StorageBuffer
+       %void = OpTypeVoid
+          %6 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_StorageBuffer_v4float = OpTypePointer StorageBuffer %v4float
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+    %float_4 = OpConstant %float 4
+         %18 = OpConstantComposite %v4float %float_1 %float_2 %float_3 %float_4
+     %main_1 = OpFunction %void None %6
+          %9 = OpLabel
+         %13 = OpAccessChain %_ptr_StorageBuffer_v4float %x_4 %uint_0
+               OpStore %13 %18
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %6
+         %20 = OpLabel
+         %21 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_compute/0.spvasm.expected.wgsl b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_compute/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..40325a2
--- /dev/null
+++ b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_compute/0.spvasm.expected.wgsl
@@ -0,0 +1,16 @@
+[[block]]
+struct block0 {
+  data : vec4<f32>;
+};
+
+[[group(0), binding(1)]] var<storage, read_write> x_4 : block0;
+
+fn main_1() {
+  x_4.data = vec4<f32>(1.0, 2.0, 3.0, 4.0);
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main() {
+  main_1();
+}
diff --git a/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_compute/0.wgsl b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_compute/0.wgsl
new file mode 100644
index 0000000..40325a2
--- /dev/null
+++ b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_compute/0.wgsl
@@ -0,0 +1,16 @@
+[[block]]
+struct block0 {
+  data : vec4<f32>;
+};
+
+[[group(0), binding(1)]] var<storage, read_write> x_4 : block0;
+
+fn main_1() {
+  x_4.data = vec4<f32>(1.0, 2.0, 3.0, 4.0);
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main() {
+  main_1();
+}
diff --git a/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_compute/0.wgsl.expected.hlsl b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_compute/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..a5513da
--- /dev/null
+++ b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_compute/0.wgsl.expected.hlsl
@@ -0,0 +1,12 @@
+RWByteAddressBuffer x_4 : register(u1, space0);
+
+void main_1() {
+  x_4.Store4(0u, asuint(float4(1.0f, 2.0f, 3.0f, 4.0f)));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void main() {
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_compute/0.wgsl.expected.msl b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_compute/0.wgsl.expected.msl
new file mode 100644
index 0000000..a410fd8
--- /dev/null
+++ b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_compute/0.wgsl.expected.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct block0 {
+  /* 0x0000 */ packed_float4 data;
+};
+
+void main_1(device block0& x_4) {
+  x_4.data = float4(1.0f, 2.0f, 3.0f, 4.0f);
+  return;
+}
+
+kernel void tint_symbol(device block0& x_4 [[buffer(1)]]) {
+  main_1(x_4);
+  return;
+}
+
diff --git a/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_compute/0.wgsl.expected.spvasm b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_compute/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..9494d1f
--- /dev/null
+++ b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_compute/0.wgsl.expected.spvasm
@@ -0,0 +1,44 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 22
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main"
+               OpExecutionMode %main LocalSize 1 1 1
+               OpName %block0 "block0"
+               OpMemberName %block0 0 "data"
+               OpName %x_4 "x_4"
+               OpName %main_1 "main_1"
+               OpName %main "main"
+               OpDecorate %block0 Block
+               OpMemberDecorate %block0 0 Offset 0
+               OpDecorate %x_4 DescriptorSet 0
+               OpDecorate %x_4 Binding 1
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+     %block0 = OpTypeStruct %v4float
+%_ptr_StorageBuffer_block0 = OpTypePointer StorageBuffer %block0
+        %x_4 = OpVariable %_ptr_StorageBuffer_block0 StorageBuffer
+       %void = OpTypeVoid
+          %6 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_StorageBuffer_v4float = OpTypePointer StorageBuffer %v4float
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+    %float_4 = OpConstant %float 4
+         %18 = OpConstantComposite %v4float %float_1 %float_2 %float_3 %float_4
+     %main_1 = OpFunction %void None %6
+          %9 = OpLabel
+         %13 = OpAccessChain %_ptr_StorageBuffer_v4float %x_4 %uint_0
+               OpStore %13 %18
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %6
+         %20 = OpLabel
+         %21 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_compute/0.wgsl.expected.wgsl b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_compute/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..40325a2
--- /dev/null
+++ b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_compute/0.wgsl.expected.wgsl
@@ -0,0 +1,16 @@
+[[block]]
+struct block0 {
+  data : vec4<f32>;
+};
+
+[[group(0), binding(1)]] var<storage, read_write> x_4 : block0;
+
+fn main_1() {
+  x_4.data = vec4<f32>(1.0, 2.0, 3.0, 4.0);
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main() {
+  main_1();
+}
diff --git a/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/0.spvasm b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/0.spvasm
new file mode 100644
index 0000000..3747c38
--- /dev/null
+++ b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/0.spvasm
@@ -0,0 +1,56 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %_ %position %frag_color
+               OpSource GLSL 430
+               OpName %main "main"
+               OpName %gl_PerVertex "gl_PerVertex"
+               OpMemberName %gl_PerVertex 0 "gl_Position"
+               OpMemberName %gl_PerVertex 1 "gl_PointSize"
+               OpMemberName %gl_PerVertex 2 "gl_ClipDistance"
+               OpName %_ ""
+               OpName %position "position"
+               OpName %frag_color "frag_color"
+               OpName %block0 "block0"
+               OpMemberName %block0 0 "in_color"
+               OpName %__0 ""
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+               OpDecorate %position Location 0
+               OpDecorate %frag_color Location 0
+               OpMemberDecorate %block0 0 Offset 0
+               OpDecorate %block0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+   %position = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %frag_color = OpVariable %_ptr_Output_v4float Output
+     %block0 = OpTypeStruct %v4float
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+        %__0 = OpVariable %_ptr_Uniform_block0 Uniform
+%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
+       %main = OpFunction %void None %10
+         %23 = OpLabel
+         %24 = OpLoad %v4float %position
+         %25 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+               OpStore %25 %24
+         %26 = OpAccessChain %_ptr_Uniform_v4float %__0 %int_0
+         %27 = OpLoad %v4float %26
+               OpStore %frag_color %27
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/0.spvasm.expected.hlsl b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..3b1f34a
--- /dev/null
+++ b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/0.spvasm.expected.hlsl
@@ -0,0 +1,34 @@
+static float4 position = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 frag_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[1];
+};
+static float4 gl_Position = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  gl_Position = position;
+  const float4 x_27 = asfloat(x_8[0]);
+  frag_color = x_27;
+  return;
+}
+
+struct main_out {
+  float4 gl_Position;
+  float4 frag_color_1;
+};
+struct tint_symbol_1 {
+  float4 position_param : TEXCOORD0;
+};
+struct tint_symbol_2 {
+  float4 frag_color_1 : TEXCOORD0;
+  float4 gl_Position : SV_Position;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 position_param = tint_symbol.position_param;
+  position = position_param;
+  main_1();
+  const main_out tint_symbol_3 = {gl_Position, frag_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.frag_color_1, tint_symbol_3.gl_Position};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/0.spvasm.expected.msl b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/0.spvasm.expected.msl
new file mode 100644
index 0000000..de2d334
--- /dev/null
+++ b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/0.spvasm.expected.msl
@@ -0,0 +1,38 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct block0 {
+  /* 0x0000 */ packed_float4 in_color;
+};
+struct main_out {
+  float4 gl_Position;
+  float4 frag_color_1;
+};
+struct tint_symbol_2 {
+  float4 position_param [[attribute(0)]];
+};
+struct tint_symbol_3 {
+  float4 frag_color_1 [[user(locn0)]];
+  float4 gl_Position [[position]];
+};
+
+void main_1(constant block0& x_8, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7, thread float4* const tint_symbol_8) {
+  float4 const x_24 = *(tint_symbol_6);
+  *(tint_symbol_7) = x_24;
+  float4 const x_27 = x_8.in_color;
+  *(tint_symbol_8) = x_27;
+  return;
+}
+
+vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]], constant block0& x_8 [[buffer(1)]]) {
+  thread float4 tint_symbol_9 = 0.0f;
+  thread float4 tint_symbol_10 = 0.0f;
+  thread float4 tint_symbol_11 = 0.0f;
+  float4 const position_param = tint_symbol_1.position_param;
+  tint_symbol_9 = position_param;
+  main_1(x_8, &(tint_symbol_9), &(tint_symbol_10), &(tint_symbol_11));
+  main_out const tint_symbol_4 = {.gl_Position=tint_symbol_10, .frag_color_1=tint_symbol_11};
+  tint_symbol_3 const tint_symbol_5 = {.frag_color_1=tint_symbol_4.frag_color_1, .gl_Position=tint_symbol_4.gl_Position};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/0.spvasm.expected.spvasm b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..a0529db
--- /dev/null
+++ b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/0.spvasm.expected.spvasm
@@ -0,0 +1,92 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 45
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %tint_pointsize %tint_symbol %tint_symbol_2 %tint_symbol_3
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %position "position"
+               OpName %frag_color "frag_color"
+               OpName %block0 "block0"
+               OpMemberName %block0 0 "in_color"
+               OpName %x_8 "x_8"
+               OpName %gl_Position "gl_Position"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "gl_Position"
+               OpMemberName %main_out 1 "frag_color_1"
+               OpName %tint_symbol_4 "tint_symbol_4"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpDecorate %block0 Block
+               OpMemberDecorate %block0 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_2 BuiltIn Position
+               OpDecorate %tint_symbol_3 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+   %position = OpVariable %_ptr_Private_v4float Private %8
+ %frag_color = OpVariable %_ptr_Private_v4float Private %8
+     %block0 = OpTypeStruct %v4float
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+        %x_8 = OpVariable %_ptr_Uniform_block0 Uniform
+%gl_Position = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %8
+%tint_symbol_3 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
+   %main_out = OpTypeStruct %v4float %v4float
+         %29 = OpTypeFunction %void %main_out
+    %float_1 = OpConstant %float 1
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+         %23 = OpLoad %v4float %position
+               OpStore %gl_Position %23
+         %27 = OpAccessChain %_ptr_Uniform_v4float %x_8 %uint_0
+         %28 = OpLoad %v4float %27
+               OpStore %frag_color %28
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_4 = OpFunction %void None %29
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %33 = OpLabel
+         %34 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %34
+         %35 = OpCompositeExtract %v4float %tint_symbol_1 1
+               OpStore %tint_symbol_3 %35
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+         %37 = OpLabel
+               OpStore %tint_pointsize %float_1
+         %39 = OpLoad %v4float %tint_symbol
+               OpStore %position %39
+         %40 = OpFunctionCall %void %main_1
+         %42 = OpLoad %v4float %gl_Position
+         %43 = OpLoad %v4float %frag_color
+         %44 = OpCompositeConstruct %main_out %42 %43
+         %41 = OpFunctionCall %void %tint_symbol_4 %44
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/0.spvasm.expected.wgsl b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..1b98fae
--- /dev/null
+++ b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/0.spvasm.expected.wgsl
@@ -0,0 +1,34 @@
+[[block]]
+struct block0 {
+  in_color : vec4<f32>;
+};
+
+var<private> position : vec4<f32>;
+
+var<private> frag_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_8 : block0;
+
+var<private> gl_Position : vec4<f32>;
+
+fn main_1() {
+  let x_24 : vec4<f32> = position;
+  gl_Position = x_24;
+  let x_27 : vec4<f32> = x_8.in_color;
+  frag_color = x_27;
+  return;
+}
+
+struct main_out {
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+  [[location(0)]]
+  frag_color_1 : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] position_param : vec4<f32>) -> main_out {
+  position = position_param;
+  main_1();
+  return main_out(gl_Position, frag_color);
+}
diff --git a/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/0.wgsl b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/0.wgsl
new file mode 100644
index 0000000..1b98fae
--- /dev/null
+++ b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/0.wgsl
@@ -0,0 +1,34 @@
+[[block]]
+struct block0 {
+  in_color : vec4<f32>;
+};
+
+var<private> position : vec4<f32>;
+
+var<private> frag_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_8 : block0;
+
+var<private> gl_Position : vec4<f32>;
+
+fn main_1() {
+  let x_24 : vec4<f32> = position;
+  gl_Position = x_24;
+  let x_27 : vec4<f32> = x_8.in_color;
+  frag_color = x_27;
+  return;
+}
+
+struct main_out {
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+  [[location(0)]]
+  frag_color_1 : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] position_param : vec4<f32>) -> main_out {
+  position = position_param;
+  main_1();
+  return main_out(gl_Position, frag_color);
+}
diff --git a/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/0.wgsl.expected.hlsl b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..3b1f34a
--- /dev/null
+++ b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/0.wgsl.expected.hlsl
@@ -0,0 +1,34 @@
+static float4 position = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 frag_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[1];
+};
+static float4 gl_Position = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  gl_Position = position;
+  const float4 x_27 = asfloat(x_8[0]);
+  frag_color = x_27;
+  return;
+}
+
+struct main_out {
+  float4 gl_Position;
+  float4 frag_color_1;
+};
+struct tint_symbol_1 {
+  float4 position_param : TEXCOORD0;
+};
+struct tint_symbol_2 {
+  float4 frag_color_1 : TEXCOORD0;
+  float4 gl_Position : SV_Position;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 position_param = tint_symbol.position_param;
+  position = position_param;
+  main_1();
+  const main_out tint_symbol_3 = {gl_Position, frag_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.frag_color_1, tint_symbol_3.gl_Position};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/0.wgsl.expected.msl b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/0.wgsl.expected.msl
new file mode 100644
index 0000000..de2d334
--- /dev/null
+++ b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/0.wgsl.expected.msl
@@ -0,0 +1,38 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct block0 {
+  /* 0x0000 */ packed_float4 in_color;
+};
+struct main_out {
+  float4 gl_Position;
+  float4 frag_color_1;
+};
+struct tint_symbol_2 {
+  float4 position_param [[attribute(0)]];
+};
+struct tint_symbol_3 {
+  float4 frag_color_1 [[user(locn0)]];
+  float4 gl_Position [[position]];
+};
+
+void main_1(constant block0& x_8, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7, thread float4* const tint_symbol_8) {
+  float4 const x_24 = *(tint_symbol_6);
+  *(tint_symbol_7) = x_24;
+  float4 const x_27 = x_8.in_color;
+  *(tint_symbol_8) = x_27;
+  return;
+}
+
+vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]], constant block0& x_8 [[buffer(1)]]) {
+  thread float4 tint_symbol_9 = 0.0f;
+  thread float4 tint_symbol_10 = 0.0f;
+  thread float4 tint_symbol_11 = 0.0f;
+  float4 const position_param = tint_symbol_1.position_param;
+  tint_symbol_9 = position_param;
+  main_1(x_8, &(tint_symbol_9), &(tint_symbol_10), &(tint_symbol_11));
+  main_out const tint_symbol_4 = {.gl_Position=tint_symbol_10, .frag_color_1=tint_symbol_11};
+  tint_symbol_3 const tint_symbol_5 = {.frag_color_1=tint_symbol_4.frag_color_1, .gl_Position=tint_symbol_4.gl_Position};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/0.wgsl.expected.spvasm b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..a0529db
--- /dev/null
+++ b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/0.wgsl.expected.spvasm
@@ -0,0 +1,92 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 45
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %tint_pointsize %tint_symbol %tint_symbol_2 %tint_symbol_3
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %position "position"
+               OpName %frag_color "frag_color"
+               OpName %block0 "block0"
+               OpMemberName %block0 0 "in_color"
+               OpName %x_8 "x_8"
+               OpName %gl_Position "gl_Position"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "gl_Position"
+               OpMemberName %main_out 1 "frag_color_1"
+               OpName %tint_symbol_4 "tint_symbol_4"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpDecorate %block0 Block
+               OpMemberDecorate %block0 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_2 BuiltIn Position
+               OpDecorate %tint_symbol_3 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+   %position = OpVariable %_ptr_Private_v4float Private %8
+ %frag_color = OpVariable %_ptr_Private_v4float Private %8
+     %block0 = OpTypeStruct %v4float
+%_ptr_Uniform_block0 = OpTypePointer Uniform %block0
+        %x_8 = OpVariable %_ptr_Uniform_block0 Uniform
+%gl_Position = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %8
+%tint_symbol_3 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
+   %main_out = OpTypeStruct %v4float %v4float
+         %29 = OpTypeFunction %void %main_out
+    %float_1 = OpConstant %float 1
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+         %23 = OpLoad %v4float %position
+               OpStore %gl_Position %23
+         %27 = OpAccessChain %_ptr_Uniform_v4float %x_8 %uint_0
+         %28 = OpLoad %v4float %27
+               OpStore %frag_color %28
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_4 = OpFunction %void None %29
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %33 = OpLabel
+         %34 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %34
+         %35 = OpCompositeExtract %v4float %tint_symbol_1 1
+               OpStore %tint_symbol_3 %35
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+         %37 = OpLabel
+               OpStore %tint_pointsize %float_1
+         %39 = OpLoad %v4float %tint_symbol
+               OpStore %position %39
+         %40 = OpFunctionCall %void %main_1
+         %42 = OpLoad %v4float %gl_Position
+         %43 = OpLoad %v4float %frag_color
+         %44 = OpCompositeConstruct %main_out %42 %43
+         %41 = OpFunctionCall %void %tint_symbol_4 %44
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/0.wgsl.expected.wgsl b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..1b98fae
--- /dev/null
+++ b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/0.wgsl.expected.wgsl
@@ -0,0 +1,34 @@
+[[block]]
+struct block0 {
+  in_color : vec4<f32>;
+};
+
+var<private> position : vec4<f32>;
+
+var<private> frag_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_8 : block0;
+
+var<private> gl_Position : vec4<f32>;
+
+fn main_1() {
+  let x_24 : vec4<f32> = position;
+  gl_Position = x_24;
+  let x_27 : vec4<f32> = x_8.in_color;
+  frag_color = x_27;
+  return;
+}
+
+struct main_out {
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+  [[location(0)]]
+  frag_color_1 : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] position_param : vec4<f32>) -> main_out {
+  position = position_param;
+  main_1();
+  return main_out(gl_Position, frag_color);
+}
diff --git a/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/1.spvasm b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/1.spvasm
new file mode 100644
index 0000000..8c4be60
--- /dev/null
+++ b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/1.spvasm
@@ -0,0 +1,25 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %final_color %frag_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource GLSL 430
+               OpName %main "main"
+               OpName %final_color "final_color"
+               OpName %frag_color "frag_color"
+               OpDecorate %final_color Location 0
+               OpDecorate %frag_color Location 0
+       %void = OpTypeVoid
+          %6 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%final_color = OpVariable %_ptr_Output_v4float Output
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+ %frag_color = OpVariable %_ptr_Input_v4float Input
+       %main = OpFunction %void None %6
+         %11 = OpLabel
+         %12 = OpLoad %v4float %frag_color
+               OpStore %final_color %12
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/1.spvasm.expected.hlsl b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..acf1be9
--- /dev/null
+++ b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/1.spvasm.expected.hlsl
@@ -0,0 +1,26 @@
+static float4 final_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 frag_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  final_color = frag_color;
+  return;
+}
+
+struct main_out {
+  float4 final_color_1;
+};
+struct tint_symbol_1 {
+  float4 frag_color_param : TEXCOORD0;
+};
+struct tint_symbol_2 {
+  float4 final_color_1 : SV_Target0;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 frag_color_param = tint_symbol.frag_color_param;
+  frag_color = frag_color_param;
+  main_1();
+  const main_out tint_symbol_3 = {final_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.final_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/1.spvasm.expected.msl b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/1.spvasm.expected.msl
new file mode 100644
index 0000000..838993a
--- /dev/null
+++ b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/1.spvasm.expected.msl
@@ -0,0 +1,30 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 final_color_1;
+};
+struct tint_symbol_2 {
+  float4 frag_color_param [[user(locn0)]];
+};
+struct tint_symbol_3 {
+  float4 final_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  float4 const x_12 = *(tint_symbol_6);
+  *(tint_symbol_7) = x_12;
+  return;
+}
+
+fragment tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  float4 const frag_color_param = tint_symbol_1.frag_color_param;
+  tint_symbol_8 = frag_color_param;
+  main_1(&(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_4 = {.final_color_1=tint_symbol_9};
+  tint_symbol_3 const tint_symbol_5 = {.final_color_1=tint_symbol_4.final_color_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/1.spvasm.expected.spvasm b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..dd25b21
--- /dev/null
+++ b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/1.spvasm.expected.spvasm
@@ -0,0 +1,59 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 29
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %final_color "final_color"
+               OpName %frag_color "frag_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "final_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%final_color = OpVariable %_ptr_Private_v4float Private %5
+ %frag_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+   %main_out = OpTypeStruct %v4float
+         %16 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+         %15 = OpLoad %v4float %frag_color
+               OpStore %final_color %15
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %16
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %20 = OpLabel
+         %21 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %21
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %23 = OpLabel
+         %24 = OpLoad %v4float %tint_symbol
+               OpStore %frag_color %24
+         %25 = OpFunctionCall %void %main_1
+         %27 = OpLoad %v4float %final_color
+         %28 = OpCompositeConstruct %main_out %27
+         %26 = OpFunctionCall %void %tint_symbol_3 %28
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/1.spvasm.expected.wgsl b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..0901c1f
--- /dev/null
+++ b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/1.spvasm.expected.wgsl
@@ -0,0 +1,21 @@
+var<private> final_color : vec4<f32>;
+
+var<private> frag_color : vec4<f32>;
+
+fn main_1() {
+  let x_12 : vec4<f32> = frag_color;
+  final_color = x_12;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  final_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[location(0)]] frag_color_param : vec4<f32>) -> main_out {
+  frag_color = frag_color_param;
+  main_1();
+  return main_out(final_color);
+}
diff --git a/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/1.wgsl b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/1.wgsl
new file mode 100644
index 0000000..0901c1f
--- /dev/null
+++ b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/1.wgsl
@@ -0,0 +1,21 @@
+var<private> final_color : vec4<f32>;
+
+var<private> frag_color : vec4<f32>;
+
+fn main_1() {
+  let x_12 : vec4<f32> = frag_color;
+  final_color = x_12;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  final_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[location(0)]] frag_color_param : vec4<f32>) -> main_out {
+  frag_color = frag_color_param;
+  main_1();
+  return main_out(final_color);
+}
diff --git a/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/1.wgsl.expected.hlsl b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..acf1be9
--- /dev/null
+++ b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/1.wgsl.expected.hlsl
@@ -0,0 +1,26 @@
+static float4 final_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 frag_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  final_color = frag_color;
+  return;
+}
+
+struct main_out {
+  float4 final_color_1;
+};
+struct tint_symbol_1 {
+  float4 frag_color_param : TEXCOORD0;
+};
+struct tint_symbol_2 {
+  float4 final_color_1 : SV_Target0;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 frag_color_param = tint_symbol.frag_color_param;
+  frag_color = frag_color_param;
+  main_1();
+  const main_out tint_symbol_3 = {final_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.final_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/1.wgsl.expected.msl b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/1.wgsl.expected.msl
new file mode 100644
index 0000000..838993a
--- /dev/null
+++ b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/1.wgsl.expected.msl
@@ -0,0 +1,30 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 final_color_1;
+};
+struct tint_symbol_2 {
+  float4 frag_color_param [[user(locn0)]];
+};
+struct tint_symbol_3 {
+  float4 final_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  float4 const x_12 = *(tint_symbol_6);
+  *(tint_symbol_7) = x_12;
+  return;
+}
+
+fragment tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  float4 const frag_color_param = tint_symbol_1.frag_color_param;
+  tint_symbol_8 = frag_color_param;
+  main_1(&(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_4 = {.final_color_1=tint_symbol_9};
+  tint_symbol_3 const tint_symbol_5 = {.final_color_1=tint_symbol_4.final_color_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/1.wgsl.expected.spvasm b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..dd25b21
--- /dev/null
+++ b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/1.wgsl.expected.spvasm
@@ -0,0 +1,59 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 29
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %final_color "final_color"
+               OpName %frag_color "frag_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "final_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%final_color = OpVariable %_ptr_Private_v4float Private %5
+ %frag_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+   %main_out = OpTypeStruct %v4float
+         %16 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+         %15 = OpLoad %v4float %frag_color
+               OpStore %final_color %15
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %16
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %20 = OpLabel
+         %21 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %21
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %23 = OpLabel
+         %24 = OpLoad %v4float %tint_symbol
+               OpStore %frag_color %24
+         %25 = OpFunctionCall %void %main_1
+         %27 = OpLoad %v4float %final_color
+         %28 = OpCompositeConstruct %main_out %27
+         %26 = OpFunctionCall %void %tint_symbol_3 %28
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/1.wgsl.expected.wgsl b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..0901c1f
--- /dev/null
+++ b/test/vk-gl-cts/binding_model/dynamic_offset/shader_reuse_differing_layout_graphics/1.wgsl.expected.wgsl
@@ -0,0 +1,21 @@
+var<private> final_color : vec4<f32>;
+
+var<private> frag_color : vec4<f32>;
+
+fn main_1() {
+  let x_12 : vec4<f32> = frag_color;
+  final_color = x_12;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  final_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[location(0)]] frag_color_param : vec4<f32>) -> main_out {
+  frag_color = frag_color_param;
+  main_1();
+  return main_out(final_color);
+}
diff --git a/test/vk-gl-cts/combined_operations/negintdivand/0-opt.spvasm b/test/vk-gl-cts/combined_operations/negintdivand/0-opt.spvasm
new file mode 100644
index 0000000..a3139e6
--- /dev/null
+++ b/test/vk-gl-cts/combined_operations/negintdivand/0-opt.spvasm
@@ -0,0 +1,46 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %_ %position %frag_color
+               OpSource GLSL 430
+               OpName %main "main"
+               OpName %gl_PerVertex "gl_PerVertex"
+               OpMemberName %gl_PerVertex 0 "gl_Position"
+               OpMemberName %gl_PerVertex 1 "gl_PointSize"
+               OpMemberName %gl_PerVertex 2 "gl_ClipDistance"
+               OpName %_ ""
+               OpName %position "position"
+               OpName %frag_color "frag_color"
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+               OpDecorate %position Location 0
+               OpDecorate %frag_color Location 1
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+   %position = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %frag_color = OpVariable %_ptr_Output_v4float Output
+  %float_0_5 = OpConstant %float 0.5
+       %main = OpFunction %void None %8
+         %20 = OpLabel
+         %21 = OpLoad %v4float %position
+         %22 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+               OpStore %22 %21
+         %23 = OpLoad %v4float %position
+         %24 = OpVectorTimesScalar %v4float %23 %float_0_5
+               OpStore %frag_color %24
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/combined_operations/negintdivand/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/combined_operations/negintdivand/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..3cc9cde
--- /dev/null
+++ b/test/vk-gl-cts/combined_operations/negintdivand/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,30 @@
+static float4 position = float4(0.0f, 0.0f, 0.0f, 0.0f);
+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() {
+  gl_Position = position;
+  frag_color = (position * 0.5f);
+  return;
+}
+
+struct main_out {
+  float4 gl_Position;
+  float4 frag_color_1;
+};
+struct tint_symbol_1 {
+  float4 position_param : TEXCOORD0;
+};
+struct tint_symbol_2 {
+  float4 frag_color_1 : TEXCOORD1;
+  float4 gl_Position : SV_Position;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 position_param = tint_symbol.position_param;
+  position = position_param;
+  main_1();
+  const main_out tint_symbol_3 = {gl_Position, frag_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.frag_color_1, tint_symbol_3.gl_Position};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/combined_operations/negintdivand/0-opt.spvasm.expected.msl b/test/vk-gl-cts/combined_operations/negintdivand/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..2ce3e85
--- /dev/null
+++ b/test/vk-gl-cts/combined_operations/negintdivand/0-opt.spvasm.expected.msl
@@ -0,0 +1,35 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 gl_Position;
+  float4 frag_color_1;
+};
+struct tint_symbol_2 {
+  float4 position_param [[attribute(0)]];
+};
+struct tint_symbol_3 {
+  float4 frag_color_1 [[user(locn1)]];
+  float4 gl_Position [[position]];
+};
+
+void main_1(thread float4* const tint_symbol_6, thread float4* const tint_symbol_7, thread float4* const tint_symbol_8) {
+  float4 const x_21 = *(tint_symbol_6);
+  *(tint_symbol_7) = x_21;
+  float4 const x_23 = *(tint_symbol_6);
+  *(tint_symbol_8) = (x_23 * 0.5f);
+  return;
+}
+
+vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread float4 tint_symbol_9 = 0.0f;
+  thread float4 tint_symbol_10 = 0.0f;
+  thread float4 tint_symbol_11 = 0.0f;
+  float4 const position_param = tint_symbol_1.position_param;
+  tint_symbol_9 = position_param;
+  main_1(&(tint_symbol_9), &(tint_symbol_10), &(tint_symbol_11));
+  main_out const tint_symbol_4 = {.gl_Position=tint_symbol_10, .frag_color_1=tint_symbol_11};
+  tint_symbol_3 const tint_symbol_5 = {.frag_color_1=tint_symbol_4.frag_color_1, .gl_Position=tint_symbol_4.gl_Position};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/combined_operations/negintdivand/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/combined_operations/negintdivand/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..ee8e353
--- /dev/null
+++ b/test/vk-gl-cts/combined_operations/negintdivand/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,79 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 40
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %tint_pointsize %tint_symbol %tint_symbol_2 %tint_symbol_3
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %position "position"
+               OpName %frag_color "frag_color"
+               OpName %gl_Position "gl_Position"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "gl_Position"
+               OpMemberName %main_out 1 "frag_color_1"
+               OpName %tint_symbol_4 "tint_symbol_4"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_2 BuiltIn Position
+               OpDecorate %tint_symbol_3 Location 1
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+   %position = OpVariable %_ptr_Private_v4float Private %8
+ %frag_color = OpVariable %_ptr_Private_v4float Private %8
+%gl_Position = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %8
+%tint_symbol_3 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %16 = OpTypeFunction %void
+  %float_0_5 = OpConstant %float 0.5
+   %main_out = OpTypeStruct %v4float %v4float
+         %24 = OpTypeFunction %void %main_out
+    %float_1 = OpConstant %float 1
+     %main_1 = OpFunction %void None %16
+         %19 = OpLabel
+         %20 = OpLoad %v4float %position
+               OpStore %gl_Position %20
+         %21 = OpLoad %v4float %position
+         %23 = OpVectorTimesScalar %v4float %21 %float_0_5
+               OpStore %frag_color %23
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_4 = OpFunction %void None %24
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %28 = OpLabel
+         %29 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %29
+         %30 = OpCompositeExtract %v4float %tint_symbol_1 1
+               OpStore %tint_symbol_3 %30
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %16
+         %32 = OpLabel
+               OpStore %tint_pointsize %float_1
+         %34 = OpLoad %v4float %tint_symbol
+               OpStore %position %34
+         %35 = OpFunctionCall %void %main_1
+         %37 = OpLoad %v4float %gl_Position
+         %38 = OpLoad %v4float %frag_color
+         %39 = OpCompositeConstruct %main_out %37 %38
+         %36 = OpFunctionCall %void %tint_symbol_4 %39
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/combined_operations/negintdivand/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/combined_operations/negintdivand/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..b9cc524
--- /dev/null
+++ b/test/vk-gl-cts/combined_operations/negintdivand/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,27 @@
+var<private> position : vec4<f32>;
+
+var<private> frag_color : vec4<f32>;
+
+var<private> gl_Position : vec4<f32>;
+
+fn main_1() {
+  let x_21 : vec4<f32> = position;
+  gl_Position = x_21;
+  let x_23 : vec4<f32> = position;
+  frag_color = (x_23 * 0.5);
+  return;
+}
+
+struct main_out {
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+  [[location(1)]]
+  frag_color_1 : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] position_param : vec4<f32>) -> main_out {
+  position = position_param;
+  main_1();
+  return main_out(gl_Position, frag_color);
+}
diff --git a/test/vk-gl-cts/combined_operations/negintdivand/0-opt.wgsl b/test/vk-gl-cts/combined_operations/negintdivand/0-opt.wgsl
new file mode 100644
index 0000000..b9cc524
--- /dev/null
+++ b/test/vk-gl-cts/combined_operations/negintdivand/0-opt.wgsl
@@ -0,0 +1,27 @@
+var<private> position : vec4<f32>;
+
+var<private> frag_color : vec4<f32>;
+
+var<private> gl_Position : vec4<f32>;
+
+fn main_1() {
+  let x_21 : vec4<f32> = position;
+  gl_Position = x_21;
+  let x_23 : vec4<f32> = position;
+  frag_color = (x_23 * 0.5);
+  return;
+}
+
+struct main_out {
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+  [[location(1)]]
+  frag_color_1 : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] position_param : vec4<f32>) -> main_out {
+  position = position_param;
+  main_1();
+  return main_out(gl_Position, frag_color);
+}
diff --git a/test/vk-gl-cts/combined_operations/negintdivand/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/combined_operations/negintdivand/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..3cc9cde
--- /dev/null
+++ b/test/vk-gl-cts/combined_operations/negintdivand/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,30 @@
+static float4 position = float4(0.0f, 0.0f, 0.0f, 0.0f);
+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() {
+  gl_Position = position;
+  frag_color = (position * 0.5f);
+  return;
+}
+
+struct main_out {
+  float4 gl_Position;
+  float4 frag_color_1;
+};
+struct tint_symbol_1 {
+  float4 position_param : TEXCOORD0;
+};
+struct tint_symbol_2 {
+  float4 frag_color_1 : TEXCOORD1;
+  float4 gl_Position : SV_Position;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 position_param = tint_symbol.position_param;
+  position = position_param;
+  main_1();
+  const main_out tint_symbol_3 = {gl_Position, frag_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.frag_color_1, tint_symbol_3.gl_Position};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/combined_operations/negintdivand/0-opt.wgsl.expected.msl b/test/vk-gl-cts/combined_operations/negintdivand/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..2ce3e85
--- /dev/null
+++ b/test/vk-gl-cts/combined_operations/negintdivand/0-opt.wgsl.expected.msl
@@ -0,0 +1,35 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 gl_Position;
+  float4 frag_color_1;
+};
+struct tint_symbol_2 {
+  float4 position_param [[attribute(0)]];
+};
+struct tint_symbol_3 {
+  float4 frag_color_1 [[user(locn1)]];
+  float4 gl_Position [[position]];
+};
+
+void main_1(thread float4* const tint_symbol_6, thread float4* const tint_symbol_7, thread float4* const tint_symbol_8) {
+  float4 const x_21 = *(tint_symbol_6);
+  *(tint_symbol_7) = x_21;
+  float4 const x_23 = *(tint_symbol_6);
+  *(tint_symbol_8) = (x_23 * 0.5f);
+  return;
+}
+
+vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread float4 tint_symbol_9 = 0.0f;
+  thread float4 tint_symbol_10 = 0.0f;
+  thread float4 tint_symbol_11 = 0.0f;
+  float4 const position_param = tint_symbol_1.position_param;
+  tint_symbol_9 = position_param;
+  main_1(&(tint_symbol_9), &(tint_symbol_10), &(tint_symbol_11));
+  main_out const tint_symbol_4 = {.gl_Position=tint_symbol_10, .frag_color_1=tint_symbol_11};
+  tint_symbol_3 const tint_symbol_5 = {.frag_color_1=tint_symbol_4.frag_color_1, .gl_Position=tint_symbol_4.gl_Position};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/combined_operations/negintdivand/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/combined_operations/negintdivand/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..ee8e353
--- /dev/null
+++ b/test/vk-gl-cts/combined_operations/negintdivand/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,79 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 40
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %tint_pointsize %tint_symbol %tint_symbol_2 %tint_symbol_3
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %position "position"
+               OpName %frag_color "frag_color"
+               OpName %gl_Position "gl_Position"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "gl_Position"
+               OpMemberName %main_out 1 "frag_color_1"
+               OpName %tint_symbol_4 "tint_symbol_4"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_2 BuiltIn Position
+               OpDecorate %tint_symbol_3 Location 1
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+   %position = OpVariable %_ptr_Private_v4float Private %8
+ %frag_color = OpVariable %_ptr_Private_v4float Private %8
+%gl_Position = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %8
+%tint_symbol_3 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %16 = OpTypeFunction %void
+  %float_0_5 = OpConstant %float 0.5
+   %main_out = OpTypeStruct %v4float %v4float
+         %24 = OpTypeFunction %void %main_out
+    %float_1 = OpConstant %float 1
+     %main_1 = OpFunction %void None %16
+         %19 = OpLabel
+         %20 = OpLoad %v4float %position
+               OpStore %gl_Position %20
+         %21 = OpLoad %v4float %position
+         %23 = OpVectorTimesScalar %v4float %21 %float_0_5
+               OpStore %frag_color %23
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_4 = OpFunction %void None %24
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %28 = OpLabel
+         %29 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %29
+         %30 = OpCompositeExtract %v4float %tint_symbol_1 1
+               OpStore %tint_symbol_3 %30
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %16
+         %32 = OpLabel
+               OpStore %tint_pointsize %float_1
+         %34 = OpLoad %v4float %tint_symbol
+               OpStore %position %34
+         %35 = OpFunctionCall %void %main_1
+         %37 = OpLoad %v4float %gl_Position
+         %38 = OpLoad %v4float %frag_color
+         %39 = OpCompositeConstruct %main_out %37 %38
+         %36 = OpFunctionCall %void %tint_symbol_4 %39
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/combined_operations/negintdivand/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/combined_operations/negintdivand/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..b9cc524
--- /dev/null
+++ b/test/vk-gl-cts/combined_operations/negintdivand/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,27 @@
+var<private> position : vec4<f32>;
+
+var<private> frag_color : vec4<f32>;
+
+var<private> gl_Position : vec4<f32>;
+
+fn main_1() {
+  let x_21 : vec4<f32> = position;
+  gl_Position = x_21;
+  let x_23 : vec4<f32> = position;
+  frag_color = (x_23 * 0.5);
+  return;
+}
+
+struct main_out {
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+  [[location(1)]]
+  frag_color_1 : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] position_param : vec4<f32>) -> main_out {
+  position = position_param;
+  main_1();
+  return main_out(gl_Position, frag_color);
+}
diff --git a/test/vk-gl-cts/combined_operations/negintdivand/1.spvasm b/test/vk-gl-cts/combined_operations/negintdivand/1.spvasm
new file mode 100644
index 0000000..2496d10
--- /dev/null
+++ b/test/vk-gl-cts/combined_operations/negintdivand/1.spvasm
@@ -0,0 +1,59 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %frag_color %color_out
+               OpExecutionMode %main OriginUpperLeft
+               OpSource GLSL 430
+               OpName %main "main"
+               OpName %iv "iv"
+               OpName %frag_color "frag_color"
+               OpName %color_out "color_out"
+               OpDecorate %frag_color Location 1
+               OpDecorate %color_out Location 0
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+ %frag_color = OpVariable %_ptr_Input_v4float Input
+    %v2float = OpTypeVector %float 2
+  %float_256 = OpConstant %float 256
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_2 = OpConstant %int 2
+     %int_64 = OpConstant %int 64
+       %bool = OpTypeBool
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+  %color_out = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %25 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %26 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+       %main = OpFunction %void None %7
+         %27 = OpLabel
+         %iv = OpVariable %_ptr_Function_v2int Function
+         %28 = OpLoad %v4float %frag_color
+         %29 = OpVectorShuffle %v2float %28 %28 0 1
+         %30 = OpVectorTimesScalar %v2float %29 %float_256
+         %31 = OpConvertFToS %v2int %30
+               OpStore %iv %31
+         %32 = OpAccessChain %_ptr_Function_int %iv %uint_1
+         %33 = OpLoad %int %32
+         %34 = OpSDiv %int %33 %int_2
+         %35 = OpBitwiseAnd %int %34 %int_64
+         %36 = OpIEqual %bool %35 %int_64
+               OpSelectionMerge %37 None
+               OpBranchConditional %36 %38 %39
+         %38 = OpLabel
+               OpStore %color_out %25
+               OpBranch %37
+         %39 = OpLabel
+               OpStore %color_out %26
+               OpBranch %37
+         %37 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/combined_operations/negintdivand/1.spvasm.expected.hlsl b/test/vk-gl-cts/combined_operations/negintdivand/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..15b4ff6
--- /dev/null
+++ b/test/vk-gl-cts/combined_operations/negintdivand/1.spvasm.expected.hlsl
@@ -0,0 +1,34 @@
+static float4 frag_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 color_out = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int2 iv = int2(0, 0);
+  const float4 x_28 = frag_color;
+  iv = int2((float2(x_28.x, x_28.y) * 256.0f));
+  const int x_33 = iv.y;
+  if ((((x_33 / 2) & 64) == 64)) {
+    color_out = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    color_out = float4(0.0f, 1.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 color_out_1;
+};
+struct tint_symbol_1 {
+  float4 frag_color_param : TEXCOORD1;
+};
+struct tint_symbol_2 {
+  float4 color_out_1 : SV_Target0;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 frag_color_param = tint_symbol.frag_color_param;
+  frag_color = frag_color_param;
+  main_1();
+  const main_out tint_symbol_3 = {color_out};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.color_out_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/combined_operations/negintdivand/1.spvasm.expected.msl b/test/vk-gl-cts/combined_operations/negintdivand/1.spvasm.expected.msl
new file mode 100644
index 0000000..ae8e6eb
--- /dev/null
+++ b/test/vk-gl-cts/combined_operations/negintdivand/1.spvasm.expected.msl
@@ -0,0 +1,37 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 color_out_1;
+};
+struct tint_symbol_2 {
+  float4 frag_color_param [[user(locn1)]];
+};
+struct tint_symbol_3 {
+  float4 color_out_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  int2 iv = 0;
+  float4 const x_28 = *(tint_symbol_6);
+  iv = int2((float2(x_28.x, x_28.y) * 256.0f));
+  int const x_33 = iv.y;
+  if ((((x_33 / 2) & 64) == 64)) {
+    *(tint_symbol_7) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_7) = float4(0.0f, 1.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  float4 const frag_color_param = tint_symbol_1.frag_color_param;
+  tint_symbol_8 = frag_color_param;
+  main_1(&(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_4 = {.color_out_1=tint_symbol_9};
+  tint_symbol_3 const tint_symbol_5 = {.color_out_1=tint_symbol_4.color_out_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/combined_operations/negintdivand/1.spvasm.expected.spvasm b/test/vk-gl-cts/combined_operations/negintdivand/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..6d6715e
--- /dev/null
+++ b/test/vk-gl-cts/combined_operations/negintdivand/1.spvasm.expected.spvasm
@@ -0,0 +1,96 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 59
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %frag_color "frag_color"
+               OpName %color_out "color_out"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %iv "iv"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "color_out_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol Location 1
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+ %frag_color = OpVariable %_ptr_Private_v4float Private %5
+  %color_out = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %19 = OpConstantNull %v2int
+    %v2float = OpTypeVector %float 2
+  %float_256 = OpConstant %float 256
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_2 = OpConstant %int 2
+     %int_64 = OpConstant %int 64
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %44 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %45 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+         %46 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+         %iv = OpVariable %_ptr_Function_v2int Function %19
+         %20 = OpLoad %v4float %frag_color
+         %23 = OpCompositeExtract %float %20 0
+         %24 = OpCompositeExtract %float %20 1
+         %25 = OpCompositeConstruct %v2float %23 %24
+         %27 = OpVectorTimesScalar %v2float %25 %float_256
+         %21 = OpConvertFToS %v2int %27
+               OpStore %iv %21
+         %31 = OpAccessChain %_ptr_Function_int %iv %uint_1
+         %32 = OpLoad %int %31
+         %34 = OpSDiv %int %32 %int_2
+         %36 = OpBitwiseAnd %int %34 %int_64
+         %37 = OpIEqual %bool %36 %int_64
+               OpSelectionMerge %39 None
+               OpBranchConditional %37 %40 %41
+         %40 = OpLabel
+               OpStore %color_out %44
+               OpBranch %39
+         %41 = OpLabel
+               OpStore %color_out %45
+               OpBranch %39
+         %39 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %46
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %50 = OpLabel
+         %51 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %51
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %53 = OpLabel
+         %54 = OpLoad %v4float %tint_symbol
+               OpStore %frag_color %54
+         %55 = OpFunctionCall %void %main_1
+         %57 = OpLoad %v4float %color_out
+         %58 = OpCompositeConstruct %main_out %57
+         %56 = OpFunctionCall %void %tint_symbol_3 %58
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/combined_operations/negintdivand/1.spvasm.expected.wgsl b/test/vk-gl-cts/combined_operations/negintdivand/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..cbbd626
--- /dev/null
+++ b/test/vk-gl-cts/combined_operations/negintdivand/1.spvasm.expected.wgsl
@@ -0,0 +1,28 @@
+var<private> frag_color : vec4<f32>;
+
+var<private> color_out : vec4<f32>;
+
+fn main_1() {
+  var iv : vec2<i32>;
+  let x_28 : vec4<f32> = frag_color;
+  iv = vec2<i32>((vec2<f32>(x_28.x, x_28.y) * 256.0));
+  let x_33 : i32 = iv.y;
+  if ((((x_33 / 2) & 64) == 64)) {
+    color_out = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    color_out = vec4<f32>(0.0, 1.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  color_out_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[location(1)]] frag_color_param : vec4<f32>) -> main_out {
+  frag_color = frag_color_param;
+  main_1();
+  return main_out(color_out);
+}
diff --git a/test/vk-gl-cts/combined_operations/negintdivand/1.wgsl b/test/vk-gl-cts/combined_operations/negintdivand/1.wgsl
new file mode 100644
index 0000000..cbbd626
--- /dev/null
+++ b/test/vk-gl-cts/combined_operations/negintdivand/1.wgsl
@@ -0,0 +1,28 @@
+var<private> frag_color : vec4<f32>;
+
+var<private> color_out : vec4<f32>;
+
+fn main_1() {
+  var iv : vec2<i32>;
+  let x_28 : vec4<f32> = frag_color;
+  iv = vec2<i32>((vec2<f32>(x_28.x, x_28.y) * 256.0));
+  let x_33 : i32 = iv.y;
+  if ((((x_33 / 2) & 64) == 64)) {
+    color_out = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    color_out = vec4<f32>(0.0, 1.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  color_out_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[location(1)]] frag_color_param : vec4<f32>) -> main_out {
+  frag_color = frag_color_param;
+  main_1();
+  return main_out(color_out);
+}
diff --git a/test/vk-gl-cts/combined_operations/negintdivand/1.wgsl.expected.hlsl b/test/vk-gl-cts/combined_operations/negintdivand/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..15b4ff6
--- /dev/null
+++ b/test/vk-gl-cts/combined_operations/negintdivand/1.wgsl.expected.hlsl
@@ -0,0 +1,34 @@
+static float4 frag_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 color_out = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int2 iv = int2(0, 0);
+  const float4 x_28 = frag_color;
+  iv = int2((float2(x_28.x, x_28.y) * 256.0f));
+  const int x_33 = iv.y;
+  if ((((x_33 / 2) & 64) == 64)) {
+    color_out = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    color_out = float4(0.0f, 1.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 color_out_1;
+};
+struct tint_symbol_1 {
+  float4 frag_color_param : TEXCOORD1;
+};
+struct tint_symbol_2 {
+  float4 color_out_1 : SV_Target0;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 frag_color_param = tint_symbol.frag_color_param;
+  frag_color = frag_color_param;
+  main_1();
+  const main_out tint_symbol_3 = {color_out};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.color_out_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/combined_operations/negintdivand/1.wgsl.expected.msl b/test/vk-gl-cts/combined_operations/negintdivand/1.wgsl.expected.msl
new file mode 100644
index 0000000..ae8e6eb
--- /dev/null
+++ b/test/vk-gl-cts/combined_operations/negintdivand/1.wgsl.expected.msl
@@ -0,0 +1,37 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 color_out_1;
+};
+struct tint_symbol_2 {
+  float4 frag_color_param [[user(locn1)]];
+};
+struct tint_symbol_3 {
+  float4 color_out_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  int2 iv = 0;
+  float4 const x_28 = *(tint_symbol_6);
+  iv = int2((float2(x_28.x, x_28.y) * 256.0f));
+  int const x_33 = iv.y;
+  if ((((x_33 / 2) & 64) == 64)) {
+    *(tint_symbol_7) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_7) = float4(0.0f, 1.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  float4 const frag_color_param = tint_symbol_1.frag_color_param;
+  tint_symbol_8 = frag_color_param;
+  main_1(&(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_4 = {.color_out_1=tint_symbol_9};
+  tint_symbol_3 const tint_symbol_5 = {.color_out_1=tint_symbol_4.color_out_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/combined_operations/negintdivand/1.wgsl.expected.spvasm b/test/vk-gl-cts/combined_operations/negintdivand/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..6d6715e
--- /dev/null
+++ b/test/vk-gl-cts/combined_operations/negintdivand/1.wgsl.expected.spvasm
@@ -0,0 +1,96 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 59
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %frag_color "frag_color"
+               OpName %color_out "color_out"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %iv "iv"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "color_out_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol Location 1
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+ %frag_color = OpVariable %_ptr_Private_v4float Private %5
+  %color_out = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %19 = OpConstantNull %v2int
+    %v2float = OpTypeVector %float 2
+  %float_256 = OpConstant %float 256
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_2 = OpConstant %int 2
+     %int_64 = OpConstant %int 64
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %44 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %45 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+         %46 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+         %iv = OpVariable %_ptr_Function_v2int Function %19
+         %20 = OpLoad %v4float %frag_color
+         %23 = OpCompositeExtract %float %20 0
+         %24 = OpCompositeExtract %float %20 1
+         %25 = OpCompositeConstruct %v2float %23 %24
+         %27 = OpVectorTimesScalar %v2float %25 %float_256
+         %21 = OpConvertFToS %v2int %27
+               OpStore %iv %21
+         %31 = OpAccessChain %_ptr_Function_int %iv %uint_1
+         %32 = OpLoad %int %31
+         %34 = OpSDiv %int %32 %int_2
+         %36 = OpBitwiseAnd %int %34 %int_64
+         %37 = OpIEqual %bool %36 %int_64
+               OpSelectionMerge %39 None
+               OpBranchConditional %37 %40 %41
+         %40 = OpLabel
+               OpStore %color_out %44
+               OpBranch %39
+         %41 = OpLabel
+               OpStore %color_out %45
+               OpBranch %39
+         %39 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %46
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %50 = OpLabel
+         %51 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %51
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %53 = OpLabel
+         %54 = OpLoad %v4float %tint_symbol
+               OpStore %frag_color %54
+         %55 = OpFunctionCall %void %main_1
+         %57 = OpLoad %v4float %color_out
+         %58 = OpCompositeConstruct %main_out %57
+         %56 = OpFunctionCall %void %tint_symbol_3 %58
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/combined_operations/negintdivand/1.wgsl.expected.wgsl b/test/vk-gl-cts/combined_operations/negintdivand/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..cbbd626
--- /dev/null
+++ b/test/vk-gl-cts/combined_operations/negintdivand/1.wgsl.expected.wgsl
@@ -0,0 +1,28 @@
+var<private> frag_color : vec4<f32>;
+
+var<private> color_out : vec4<f32>;
+
+fn main_1() {
+  var iv : vec2<i32>;
+  let x_28 : vec4<f32> = frag_color;
+  iv = vec2<i32>((vec2<f32>(x_28.x, x_28.y) * 256.0));
+  let x_33 : i32 = iv.y;
+  if ((((x_33 / 2) & 64) == 64)) {
+    color_out = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    color_out = vec4<f32>(0.0, 1.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  color_out_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[location(1)]] frag_color_param : vec4<f32>) -> main_out {
+  frag_color = frag_color_param;
+  main_1();
+  return main_out(color_out);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/access-new-vector-inside-if-condition/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/access-new-vector-inside-if-condition/0-opt.spvasm
new file mode 100644
index 0000000..cdbcbc0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/access-new-vector-inside-if-condition/0-opt.spvasm
@@ -0,0 +1,44 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %x "x"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %x RelaxedPrecision
+               OpDecorate %5 RelaxedPrecision
+               OpDecorate %6 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+    %float_1 = OpConstant %float 1
+         %15 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+      %int_3 = OpConstant %int 3
+       %bool = OpTypeBool
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %20 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %8
+         %21 = OpLabel
+          %x = OpVariable %_ptr_Function_int Function
+               OpStore %x %int_0
+          %5 = OpLoad %int %x
+          %6 = OpExtInst %int %1 SClamp %5 %int_0 %int_3
+         %22 = OpVectorExtractDynamic %float %15 %6
+         %23 = OpFOrdGreaterThanEqual %bool %22 %float_1
+               OpSelectionMerge %24 None
+               OpBranchConditional %23 %25 %24
+         %25 = OpLabel
+               OpBranch %24
+         %24 = OpLabel
+               OpStore %_GLF_color %20
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/access-new-vector-inside-if-condition/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/access-new-vector-inside-if-condition/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..485db30
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/access-new-vector-inside-if-condition/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,24 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int x = 0;
+  x = 0;
+  if ((float4(1.0f, 1.0f, 1.0f, 1.0f)[clamp(x, 0, 3)] >= 1.0f)) {
+  }
+  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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/access-new-vector-inside-if-condition/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/access-new-vector-inside-if-condition/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..b9d21c3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/access-new-vector-inside-if-condition/0-opt.spvasm.expected.msl
@@ -0,0 +1,28 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  int x = 0;
+  x = 0;
+  int const x_5 = x;
+  if ((float4(1.0f, 1.0f, 1.0f, 1.0f)[clamp(x_5, 0, 3)] >= 1.0f)) {
+  }
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/access-new-vector-inside-if-condition/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/access-new-vector-inside-if-condition/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..ee25aef
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/access-new-vector-inside-if-condition/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,73 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 42
+; Schema: 0
+               OpCapability Shader
+         %21 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x "x"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %15 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+    %float_1 = OpConstant %float 1
+         %19 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+      %int_3 = OpConstant %int 3
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+         %29 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %30 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %x = OpVariable %_ptr_Function_int Function %15
+               OpStore %x %int_0
+         %17 = OpLoad %int %x
+         %20 = OpExtInst %int %21 SClamp %17 %int_0 %int_3
+         %23 = OpVectorExtractDynamic %float %19 %20
+         %24 = OpFOrdGreaterThanEqual %bool %23 %float_1
+               OpSelectionMerge %26 None
+               OpBranchConditional %24 %27 %26
+         %27 = OpLabel
+               OpBranch %26
+         %26 = OpLabel
+               OpStore %x_GLF_color %29
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %30
+%tint_symbol = OpFunctionParameter %main_out
+         %34 = OpLabel
+         %35 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %35
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %37 = OpLabel
+         %38 = OpFunctionCall %void %main_1
+         %40 = OpLoad %v4float %x_GLF_color
+         %41 = OpCompositeConstruct %main_out %40
+         %39 = OpFunctionCall %void %tint_symbol_2 %41
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/access-new-vector-inside-if-condition/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/access-new-vector-inside-if-condition/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..8432d48
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/access-new-vector-inside-if-condition/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,22 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x : i32;
+  x = 0;
+  let x_5 : i32 = x;
+  if ((vec4<f32>(1.0, 1.0, 1.0, 1.0)[clamp(x_5, 0, 3)] >= 1.0)) {
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/access-new-vector-inside-if-condition/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/access-new-vector-inside-if-condition/0-opt.wgsl
new file mode 100644
index 0000000..8432d48
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/access-new-vector-inside-if-condition/0-opt.wgsl
@@ -0,0 +1,22 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x : i32;
+  x = 0;
+  let x_5 : i32 = x;
+  if ((vec4<f32>(1.0, 1.0, 1.0, 1.0)[clamp(x_5, 0, 3)] >= 1.0)) {
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/access-new-vector-inside-if-condition/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/access-new-vector-inside-if-condition/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..485db30
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/access-new-vector-inside-if-condition/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,24 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int x = 0;
+  x = 0;
+  if ((float4(1.0f, 1.0f, 1.0f, 1.0f)[clamp(x, 0, 3)] >= 1.0f)) {
+  }
+  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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/access-new-vector-inside-if-condition/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/access-new-vector-inside-if-condition/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..b9d21c3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/access-new-vector-inside-if-condition/0-opt.wgsl.expected.msl
@@ -0,0 +1,28 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  int x = 0;
+  x = 0;
+  int const x_5 = x;
+  if ((float4(1.0f, 1.0f, 1.0f, 1.0f)[clamp(x_5, 0, 3)] >= 1.0f)) {
+  }
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/access-new-vector-inside-if-condition/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/access-new-vector-inside-if-condition/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..ee25aef
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/access-new-vector-inside-if-condition/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,73 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 42
+; Schema: 0
+               OpCapability Shader
+         %21 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x "x"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %15 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+    %float_1 = OpConstant %float 1
+         %19 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+      %int_3 = OpConstant %int 3
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+         %29 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %30 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %x = OpVariable %_ptr_Function_int Function %15
+               OpStore %x %int_0
+         %17 = OpLoad %int %x
+         %20 = OpExtInst %int %21 SClamp %17 %int_0 %int_3
+         %23 = OpVectorExtractDynamic %float %19 %20
+         %24 = OpFOrdGreaterThanEqual %bool %23 %float_1
+               OpSelectionMerge %26 None
+               OpBranchConditional %24 %27 %26
+         %27 = OpLabel
+               OpBranch %26
+         %26 = OpLabel
+               OpStore %x_GLF_color %29
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %30
+%tint_symbol = OpFunctionParameter %main_out
+         %34 = OpLabel
+         %35 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %35
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %37 = OpLabel
+         %38 = OpFunctionCall %void %main_1
+         %40 = OpLoad %v4float %x_GLF_color
+         %41 = OpCompositeConstruct %main_out %40
+         %39 = OpFunctionCall %void %tint_symbol_2 %41
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/access-new-vector-inside-if-condition/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/access-new-vector-inside-if-condition/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..8432d48
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/access-new-vector-inside-if-condition/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,22 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x : i32;
+  x = 0;
+  let x_5 : i32 = x;
+  if ((vec4<f32>(1.0, 1.0, 1.0, 1.0)[clamp(x_5, 0, 3)] >= 1.0)) {
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/always-discarding-function/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/always-discarding-function/0-opt.spvasm
new file mode 100644
index 0000000..f43761b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/always-discarding-function/0-opt.spvasm
@@ -0,0 +1,244 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %tmp_struct "tmp_struct"
+               OpMemberName %tmp_struct 0 "nmb"
+               OpName %binarySearch_struct_tmp_struct_i1_1_1_ "binarySearch(struct-tmp_struct-i1[1]1;"
+               OpName %obj "obj"
+               OpName %one "one"
+               OpName %zero "zero"
+               OpName %tmp_float "tmp_float"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %color "color"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %tmp_struct 0 RelaxedPrecision
+               OpDecorate %binarySearch_struct_tmp_struct_i1_1_1_ RelaxedPrecision
+               OpDecorate %one RelaxedPrecision
+               OpDecorate %zero RelaxedPrecision
+               OpDecorate %13 RelaxedPrecision
+               OpDecorate %14 RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %15 RelaxedPrecision
+               OpDecorate %16 RelaxedPrecision
+               OpDecorate %17 RelaxedPrecision
+               OpDecorate %18 RelaxedPrecision
+               OpDecorate %19 RelaxedPrecision
+               OpDecorate %20 RelaxedPrecision
+               OpDecorate %21 RelaxedPrecision
+               OpDecorate %22 RelaxedPrecision
+               OpDecorate %23 RelaxedPrecision
+               OpDecorate %24 RelaxedPrecision
+               OpDecorate %25 RelaxedPrecision
+               OpDecorate %26 RelaxedPrecision
+               OpDecorate %27 RelaxedPrecision
+               OpDecorate %28 RelaxedPrecision
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_int_uint_1 = OpTypeArray %int %uint_1
+ %tmp_struct = OpTypeStruct %_arr_int_uint_1
+%_ptr_Function_tmp_struct = OpTypePointer Function %tmp_struct
+         %36 = OpTypeFunction %int %_ptr_Function_tmp_struct
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+     %int_10 = OpConstant %int 10
+       %bool = OpTypeBool
+      %int_0 = OpConstant %int 0
+     %int_n1 = OpConstant %int -1
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %53 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+    %float_1 = OpConstant %float 1
+         %55 = OpConstantComposite %v2float %float_1 %float_1
+     %uint_0 = OpConstant %uint 0
+         %57 = OpUndef %tmp_struct
+      %false = OpConstantFalse %bool
+%_ptr_Function_bool = OpTypePointer Function %bool
+       %true = OpConstantTrue %bool
+         %61 = OpConstantNull %_arr_int_uint_1
+%_ptr_Function__arr_int_uint_1 = OpTypePointer Function %_arr_int_uint_1
+         %63 = OpUndef %int
+         %64 = OpUndef %bool
+         %65 = OpUndef %int
+         %66 = OpUndef %bool
+       %main = OpFunction %void None %30
+         %67 = OpLabel
+         %24 = OpVariable %_ptr_Function__arr_int_uint_1 Function
+         %68 = OpVariable %_ptr_Function_bool Function %false
+         %17 = OpVariable %_ptr_Function_int Function
+         %18 = OpVariable %_ptr_Function_int Function
+         %19 = OpVariable %_ptr_Function_int Function
+         %20 = OpVariable %_ptr_Function_int Function
+         %69 = OpVariable %_ptr_Function_bool Function %false
+  %tmp_float = OpVariable %_ptr_Function_float Function
+      %color = OpVariable %_ptr_Function_v3float Function
+               OpBranch %70
+         %70 = OpLabel
+               OpLoopMerge %71 %72 None
+               OpBranch %73
+         %73 = OpLabel
+         %74 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %75 = OpLoad %float %74
+               OpStore %tmp_float %75
+         %76 = OpCompositeConstruct %v3float %75 %75 %75
+               OpStore %color %76
+         %77 = OpCompositeExtract %_arr_int_uint_1 %57 0
+               OpStore %24 %77
+               OpStore %68 %false
+               OpBranch %78
+         %78 = OpLabel
+         %79 = OpPhi %bool %false %73 %64 %80
+               OpLoopMerge %81 %80 None
+               OpBranch %82
+         %82 = OpLabel
+               OpStore %18 %int_1
+               OpBranch %83
+         %83 = OpLabel
+         %21 = OpPhi %int %int_1 %82 %22 %84
+               OpLoopMerge %85 %84 None
+               OpBranch %86
+         %86 = OpLabel
+         %87 = OpSGreaterThan %bool %21 %int_10
+               OpBranchConditional %87 %88 %85
+         %88 = OpLabel
+         %22 = OpISub %int %21 %int_1
+               OpStore %19 %22
+         %89 = OpAccessChain %_ptr_Function_int %24 %22
+         %23 = OpLoad %int %89
+         %90 = OpIEqual %bool %23 %int_1
+               OpSelectionMerge %91 None
+               OpBranchConditional %90 %92 %91
+         %92 = OpLabel
+               OpStore %68 %true
+               OpStore %17 %int_1
+               OpBranch %85
+         %91 = OpLabel
+               OpStore %18 %22
+               OpBranch %84
+         %84 = OpLabel
+               OpBranch %83
+         %85 = OpLabel
+         %25 = OpPhi %int %63 %86 %int_1 %92
+         %93 = OpPhi %bool %79 %86 %true %92
+               OpSelectionMerge %94 None
+               OpBranchConditional %93 %81 %94
+         %94 = OpLabel
+               OpStore %68 %true
+               OpStore %17 %int_n1
+               OpBranch %81
+         %80 = OpLabel
+               OpBranch %78
+         %81 = OpLabel
+         %26 = OpPhi %int %25 %85 %int_n1 %94
+               OpStore %20 %26
+         %95 = OpIEqual %bool %26 %int_n1
+               OpSelectionMerge %96 None
+               OpBranchConditional %95 %97 %98
+         %97 = OpLabel
+               OpKill
+         %98 = OpLabel
+               OpStore %_GLF_color %53
+         %99 = OpVectorShuffle %v2float %76 %76 1 2
+        %100 = OpFAdd %v2float %99 %55
+        %101 = OpVectorShuffle %v3float %76 %100 0 3 4
+               OpStore %color %101
+        %102 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+        %103 = OpLoad %float %102
+        %104 = OpFOrdGreaterThan %bool %103 %float_1
+               OpSelectionMerge %105 None
+               OpBranchConditional %104 %106 %105
+        %106 = OpLabel
+               OpStore %69 %true
+               OpBranch %71
+        %105 = OpLabel
+               OpBranch %96
+         %96 = OpLabel
+        %107 = OpCompositeExtract %float %101 0
+        %108 = OpCompositeExtract %float %101 1
+        %109 = OpCompositeExtract %float %101 2
+        %110 = OpCompositeConstruct %v4float %107 %108 %109 %float_1
+               OpStore %_GLF_color %110
+               OpStore %69 %true
+               OpBranch %71
+         %72 = OpLabel
+               OpBranch %70
+         %71 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%binarySearch_struct_tmp_struct_i1_1_1_ = OpFunction %int None %36
+        %obj = OpFunctionParameter %_ptr_Function_tmp_struct
+        %111 = OpLabel
+        %112 = OpVariable %_ptr_Function_bool Function %false
+         %16 = OpVariable %_ptr_Function_int Function
+        %one = OpVariable %_ptr_Function_int Function
+       %zero = OpVariable %_ptr_Function_int Function
+               OpBranch %113
+        %113 = OpLabel
+        %114 = OpPhi %bool %false %111 %66 %115
+               OpLoopMerge %116 %115 None
+               OpBranch %117
+        %117 = OpLabel
+               OpStore %one %int_1
+               OpBranch %118
+        %118 = OpLabel
+         %15 = OpPhi %int %int_1 %117 %13 %119
+               OpLoopMerge %120 %119 None
+               OpBranch %121
+        %121 = OpLabel
+        %122 = OpSGreaterThan %bool %15 %int_10
+               OpBranchConditional %122 %123 %120
+        %123 = OpLabel
+         %13 = OpISub %int %15 %int_1
+               OpStore %zero %13
+        %124 = OpAccessChain %_ptr_Function_int %obj %int_0 %13
+         %14 = OpLoad %int %124
+        %125 = OpIEqual %bool %14 %int_1
+               OpSelectionMerge %126 None
+               OpBranchConditional %125 %127 %126
+        %127 = OpLabel
+               OpStore %112 %true
+               OpStore %16 %int_1
+               OpBranch %120
+        %126 = OpLabel
+               OpStore %one %13
+               OpBranch %119
+        %119 = OpLabel
+               OpBranch %118
+        %120 = OpLabel
+         %27 = OpPhi %int %65 %121 %int_1 %127
+        %128 = OpPhi %bool %114 %121 %true %127
+               OpSelectionMerge %129 None
+               OpBranchConditional %128 %116 %129
+        %129 = OpLabel
+               OpStore %112 %true
+               OpStore %16 %int_n1
+               OpBranch %116
+        %115 = OpLabel
+               OpBranch %113
+        %116 = OpLabel
+         %28 = OpPhi %int %27 %120 %int_n1 %129
+               OpReturnValue %28
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/always-discarding-function/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/always-discarding-function/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..f0e2766
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/always-discarding-function/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,168 @@
+struct tmp_struct {
+  int nmb[1];
+};
+
+cbuffer cbuffer_x_11 : register(b0, space0) {
+  uint4 x_11[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int x_24[1] = (int[1])0;
+  bool x_68 = false;
+  int x_17 = 0;
+  int x_18 = 0;
+  int x_19 = 0;
+  int x_20 = 0;
+  bool x_69 = false;
+  float tmp_float = 0.0f;
+  float3 color = float3(0.0f, 0.0f, 0.0f);
+  while (true) {
+    int x_25 = 0;
+    float3 x_101 = float3(0.0f, 0.0f, 0.0f);
+    bool x_79_phi = false;
+    int x_26_phi = 0;
+    const float x_75 = asfloat(x_11[0].y);
+    tmp_float = x_75;
+    const float3 x_76 = float3(x_75, x_75, x_75);
+    color = x_76;
+    const int tint_symbol_3[1] = {0};
+    const tmp_struct tint_symbol_4 = {tint_symbol_3};
+    x_24 = tint_symbol_4.nmb;
+    x_68 = false;
+    x_79_phi = false;
+    while (true) {
+      int x_21_phi = 0;
+      int x_25_phi = 0;
+      bool x_93_phi = false;
+      const bool x_79 = x_79_phi;
+      x_18 = 1;
+      x_21_phi = 1;
+      while (true) {
+        const int x_21 = x_21_phi;
+        x_25_phi = 0;
+        x_93_phi = x_79;
+        if ((x_21 > 10)) {
+        } else {
+          break;
+        }
+        const int x_22 = (x_21 - 1);
+        x_19 = x_22;
+        const int x_23 = x_24[x_22];
+        if ((x_23 == 1)) {
+          x_68 = true;
+          x_17 = 1;
+          x_25_phi = 1;
+          x_93_phi = true;
+          break;
+        }
+        x_18 = x_22;
+        {
+          x_21_phi = x_22;
+        }
+      }
+      x_25 = x_25_phi;
+      const bool x_93 = x_93_phi;
+      x_26_phi = x_25;
+      if (x_93) {
+        break;
+      }
+      x_68 = true;
+      x_17 = -1;
+      x_26_phi = -1;
+      break;
+      {
+        x_79_phi = false;
+      }
+    }
+    const int x_26 = x_26_phi;
+    x_20 = x_26;
+    if ((x_26 == -1)) {
+      discard;
+    } else {
+      x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+      const float2 x_100 = (float2(x_76.y, x_76.z) + float2(1.0f, 1.0f));
+      x_101 = float3(x_76.x, x_100.x, x_100.y);
+      color = x_101;
+      const float x_103 = asfloat(x_11[0].x);
+      if ((x_103 > 1.0f)) {
+        x_69 = true;
+        break;
+      }
+    }
+    x_GLF_color = float4(x_101.x, x_101.y, x_101.z, 1.0f);
+    x_69 = true;
+    break;
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
+int binarySearch_struct_tmp_struct_i1_1_1_(inout tmp_struct obj) {
+  bool x_112 = false;
+  int x_16 = 0;
+  int one = 0;
+  int zero = 0;
+  int x_27 = 0;
+  bool x_114_phi = false;
+  int x_28_phi = 0;
+  x_114_phi = false;
+  while (true) {
+    int x_15_phi = 0;
+    int x_27_phi = 0;
+    bool x_128_phi = false;
+    const bool x_114 = x_114_phi;
+    one = 1;
+    x_15_phi = 1;
+    while (true) {
+      const int x_15 = x_15_phi;
+      x_27_phi = 0;
+      x_128_phi = x_114;
+      if ((x_15 > 10)) {
+      } else {
+        break;
+      }
+      const int x_13 = (x_15 - 1);
+      zero = x_13;
+      const int x_14 = obj.nmb[x_13];
+      if ((x_14 == 1)) {
+        x_112 = true;
+        x_16 = 1;
+        x_27_phi = 1;
+        x_128_phi = true;
+        break;
+      }
+      one = x_13;
+      {
+        x_15_phi = x_13;
+      }
+    }
+    x_27 = x_27_phi;
+    const bool x_128 = x_128_phi;
+    x_28_phi = x_27;
+    if (x_128) {
+      break;
+    }
+    x_112 = true;
+    x_16 = -1;
+    x_28_phi = -1;
+    break;
+    {
+      x_114_phi = false;
+    }
+  }
+  return x_28_phi;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/always-discarding-function/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/always-discarding-function/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..5262879
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/always-discarding-function/0-opt.spvasm.expected.msl
@@ -0,0 +1,174 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  int arr[1];
+};
+struct tmp_struct {
+  tint_array_wrapper nmb;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_11, thread float4* const tint_symbol_6) {
+  tint_array_wrapper x_24 = {};
+  bool x_68 = false;
+  int x_17 = 0;
+  int x_18 = 0;
+  int x_19 = 0;
+  int x_20 = 0;
+  bool x_69 = false;
+  float tmp_float = 0.0f;
+  float3 color = 0.0f;
+  while (true) {
+    int x_25 = 0;
+    float3 x_101 = 0.0f;
+    bool x_79_phi = false;
+    int x_26_phi = 0;
+    float const x_75 = x_11.injectionSwitch.y;
+    tmp_float = x_75;
+    float3 const x_76 = float3(x_75, x_75, x_75);
+    color = x_76;
+    tint_array_wrapper const tint_symbol_3 = {.arr={0}};
+    tmp_struct const tint_symbol_4 = {.nmb=tint_symbol_3};
+    x_24 = tint_symbol_4.nmb;
+    x_68 = false;
+    x_79_phi = false;
+    while (true) {
+      int x_21_phi = 0;
+      int x_25_phi = 0;
+      bool x_93_phi = false;
+      bool const x_79 = x_79_phi;
+      x_18 = 1;
+      x_21_phi = 1;
+      while (true) {
+        int const x_21 = x_21_phi;
+        x_25_phi = 0;
+        x_93_phi = x_79;
+        if ((x_21 > 10)) {
+        } else {
+          break;
+        }
+        int const x_22 = (x_21 - 1);
+        x_19 = x_22;
+        int const x_23 = x_24.arr[x_22];
+        if ((x_23 == 1)) {
+          x_68 = true;
+          x_17 = 1;
+          x_25_phi = 1;
+          x_93_phi = true;
+          break;
+        }
+        x_18 = x_22;
+        {
+          x_21_phi = x_22;
+        }
+      }
+      x_25 = x_25_phi;
+      bool const x_93 = x_93_phi;
+      x_26_phi = x_25;
+      if (x_93) {
+        break;
+      }
+      x_68 = true;
+      x_17 = -1;
+      x_26_phi = -1;
+      break;
+      {
+        x_79_phi = false;
+      }
+    }
+    int const x_26 = x_26_phi;
+    x_20 = x_26;
+    if ((x_26 == -1)) {
+      discard_fragment();
+    } else {
+      *(tint_symbol_6) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+      float2 const x_100 = (float2(x_76.y, x_76.z) + float2(1.0f, 1.0f));
+      x_101 = float3(x_76.x, x_100.x, x_100.y);
+      color = x_101;
+      float const x_103 = x_11.injectionSwitch.x;
+      if ((x_103 > 1.0f)) {
+        x_69 = true;
+        break;
+      }
+    }
+    *(tint_symbol_6) = float4(x_101.x, x_101.y, x_101.z, 1.0f);
+    x_69 = true;
+    break;
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_11 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  main_1(x_11, &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
+int binarySearch_struct_tmp_struct_i1_1_1_(thread tmp_struct* const obj) {
+  bool x_112 = false;
+  int x_16 = 0;
+  int one = 0;
+  int zero = 0;
+  int x_27 = 0;
+  bool x_114_phi = false;
+  int x_28_phi = 0;
+  x_114_phi = false;
+  while (true) {
+    int x_15_phi = 0;
+    int x_27_phi = 0;
+    bool x_128_phi = false;
+    bool const x_114 = x_114_phi;
+    one = 1;
+    x_15_phi = 1;
+    while (true) {
+      int const x_15 = x_15_phi;
+      x_27_phi = 0;
+      x_128_phi = x_114;
+      if ((x_15 > 10)) {
+      } else {
+        break;
+      }
+      int const x_13 = (x_15 - 1);
+      zero = x_13;
+      int const x_14 = (*(obj)).nmb.arr[x_13];
+      if ((x_14 == 1)) {
+        x_112 = true;
+        x_16 = 1;
+        x_27_phi = 1;
+        x_128_phi = true;
+        break;
+      }
+      one = x_13;
+      {
+        x_15_phi = x_13;
+      }
+    }
+    x_27 = x_27_phi;
+    bool const x_128 = x_128_phi;
+    x_28_phi = x_27;
+    if (x_128) {
+      break;
+    }
+    x_112 = true;
+    x_16 = -1;
+    x_28_phi = -1;
+    break;
+    {
+      x_114_phi = false;
+    }
+  }
+  int const x_28 = x_28_phi;
+  return x_28;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/always-discarding-function/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/always-discarding-function/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..18ca5d5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/always-discarding-function/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,345 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 177
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_11 "x_11"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_24 "x_24"
+               OpName %x_68 "x_68"
+               OpName %x_17 "x_17"
+               OpName %x_18 "x_18"
+               OpName %x_19 "x_19"
+               OpName %x_20 "x_20"
+               OpName %x_69 "x_69"
+               OpName %tmp_float "tmp_float"
+               OpName %color "color"
+               OpName %x_25 "x_25"
+               OpName %x_101 "x_101"
+               OpName %x_79_phi "x_79_phi"
+               OpName %x_26_phi "x_26_phi"
+               OpName %tmp_struct "tmp_struct"
+               OpMemberName %tmp_struct 0 "nmb"
+               OpName %x_21_phi "x_21_phi"
+               OpName %x_25_phi "x_25_phi"
+               OpName %x_93_phi "x_93_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpName %binarySearch_struct_tmp_struct_i1_1_1_ "binarySearch_struct_tmp_struct_i1_1_1_"
+               OpName %obj "obj"
+               OpName %x_112 "x_112"
+               OpName %x_16 "x_16"
+               OpName %one "one"
+               OpName %zero "zero"
+               OpName %x_27 "x_27"
+               OpName %x_114_phi "x_114_phi"
+               OpName %x_28_phi "x_28_phi"
+               OpName %x_15_phi "x_15_phi"
+               OpName %x_27_phi "x_27_phi"
+               OpName %x_128_phi "x_128_phi"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_11 NonWritable
+               OpDecorate %x_11 DescriptorSet 0
+               OpDecorate %x_11 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_1 ArrayStride 4
+               OpMemberDecorate %tmp_struct 0 Offset 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_11 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_int_uint_1 = OpTypeArray %int %uint_1
+%_ptr_Function__arr_int_uint_1 = OpTypePointer Function %_arr_int_uint_1
+         %22 = OpConstantNull %_arr_int_uint_1
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %27 = OpConstantNull %bool
+%_ptr_Function_int = OpTypePointer Function %int
+         %30 = OpConstantNull %int
+%_ptr_Function_float = OpTypePointer Function %float
+         %37 = OpConstantNull %float
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %41 = OpConstantNull %v3float
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+ %tmp_struct = OpTypeStruct %_arr_int_uint_1
+      %int_0 = OpConstant %int 0
+         %57 = OpConstantComposite %_arr_int_uint_1 %int_0
+         %58 = OpConstantComposite %tmp_struct %57
+      %int_1 = OpConstant %int 1
+     %int_10 = OpConstant %int 10
+       %true = OpConstantTrue %bool
+     %int_n1 = OpConstant %int -1
+    %float_0 = OpConstant %float 0
+         %98 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+    %float_1 = OpConstant %float 1
+        %103 = OpConstantComposite %v2float %float_1 %float_1
+     %uint_2 = OpConstant %uint 2
+   %main_out = OpTypeStruct %v4float
+        %123 = OpTypeFunction %void %main_out
+%_ptr_Function_tmp_struct = OpTypePointer Function %tmp_struct
+        %135 = OpTypeFunction %int %_ptr_Function_tmp_struct
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+       %x_24 = OpVariable %_ptr_Function__arr_int_uint_1 Function %22
+       %x_68 = OpVariable %_ptr_Function_bool Function %27
+       %x_17 = OpVariable %_ptr_Function_int Function %30
+       %x_18 = OpVariable %_ptr_Function_int Function %30
+       %x_19 = OpVariable %_ptr_Function_int Function %30
+       %x_20 = OpVariable %_ptr_Function_int Function %30
+       %x_69 = OpVariable %_ptr_Function_bool Function %27
+  %tmp_float = OpVariable %_ptr_Function_float Function %37
+      %color = OpVariable %_ptr_Function_v3float Function %41
+       %x_25 = OpVariable %_ptr_Function_int Function %30
+      %x_101 = OpVariable %_ptr_Function_v3float Function %41
+   %x_79_phi = OpVariable %_ptr_Function_bool Function %27
+   %x_26_phi = OpVariable %_ptr_Function_int Function %30
+   %x_21_phi = OpVariable %_ptr_Function_int Function %30
+   %x_25_phi = OpVariable %_ptr_Function_int Function %30
+   %x_93_phi = OpVariable %_ptr_Function_bool Function %27
+               OpStore %x_68 %false
+               OpStore %x_69 %false
+               OpBranch %42
+         %42 = OpLabel
+               OpLoopMerge %43 %44 None
+               OpBranch %45
+         %45 = OpLabel
+         %52 = OpAccessChain %_ptr_Uniform_float %x_11 %uint_0 %uint_1
+         %53 = OpLoad %float %52
+               OpStore %tmp_float %53
+         %54 = OpCompositeConstruct %v3float %53 %53 %53
+               OpStore %color %54
+         %59 = OpCompositeExtract %_arr_int_uint_1 %58 0
+               OpStore %x_24 %59
+               OpStore %x_68 %false
+               OpStore %x_79_phi %false
+               OpBranch %60
+         %60 = OpLabel
+               OpLoopMerge %61 %62 None
+               OpBranch %63
+         %63 = OpLabel
+         %67 = OpLoad %bool %x_79_phi
+               OpStore %x_18 %int_1
+               OpStore %x_21_phi %int_1
+               OpBranch %69
+         %69 = OpLabel
+               OpLoopMerge %70 %71 None
+               OpBranch %72
+         %72 = OpLabel
+         %73 = OpLoad %int %x_21_phi
+               OpStore %x_25_phi %int_0
+               OpStore %x_93_phi %67
+         %75 = OpSGreaterThan %bool %73 %int_10
+               OpSelectionMerge %76 None
+               OpBranchConditional %75 %77 %78
+         %77 = OpLabel
+               OpBranch %76
+         %78 = OpLabel
+               OpBranch %70
+         %76 = OpLabel
+         %79 = OpISub %int %73 %int_1
+               OpStore %x_19 %79
+         %80 = OpAccessChain %_ptr_Function_int %x_24 %79
+         %81 = OpLoad %int %80
+         %82 = OpIEqual %bool %81 %int_1
+               OpSelectionMerge %83 None
+               OpBranchConditional %82 %84 %83
+         %84 = OpLabel
+               OpStore %x_68 %true
+               OpStore %x_17 %int_1
+               OpStore %x_25_phi %int_1
+               OpStore %x_93_phi %true
+               OpBranch %70
+         %83 = OpLabel
+               OpStore %x_18 %79
+               OpBranch %71
+         %71 = OpLabel
+               OpStore %x_21_phi %79
+               OpBranch %69
+         %70 = OpLabel
+         %86 = OpLoad %int %x_25_phi
+               OpStore %x_25 %86
+         %87 = OpLoad %bool %x_93_phi
+         %88 = OpLoad %int %x_25
+               OpStore %x_26_phi %88
+               OpSelectionMerge %89 None
+               OpBranchConditional %87 %90 %89
+         %90 = OpLabel
+               OpBranch %61
+         %89 = OpLabel
+               OpStore %x_68 %true
+               OpStore %x_17 %int_n1
+               OpStore %x_26_phi %int_n1
+               OpBranch %61
+         %62 = OpLabel
+               OpStore %x_79_phi %false
+               OpBranch %60
+         %61 = OpLabel
+         %92 = OpLoad %int %x_26_phi
+               OpStore %x_20 %92
+         %93 = OpIEqual %bool %92 %int_n1
+               OpSelectionMerge %94 None
+               OpBranchConditional %93 %95 %96
+         %95 = OpLabel
+               OpKill
+         %96 = OpLabel
+               OpStore %x_GLF_color %98
+         %99 = OpCompositeExtract %float %54 1
+        %100 = OpCompositeExtract %float %54 2
+        %101 = OpCompositeConstruct %v2float %99 %100
+        %104 = OpFAdd %v2float %101 %103
+        %105 = OpCompositeExtract %float %54 0
+        %106 = OpCompositeExtract %float %104 0
+        %107 = OpCompositeExtract %float %104 1
+        %108 = OpCompositeConstruct %v3float %105 %106 %107
+               OpStore %x_101 %108
+        %109 = OpLoad %v3float %x_101
+               OpStore %color %109
+        %110 = OpAccessChain %_ptr_Uniform_float %x_11 %uint_0 %uint_0
+        %111 = OpLoad %float %110
+        %112 = OpFOrdGreaterThan %bool %111 %float_1
+               OpSelectionMerge %113 None
+               OpBranchConditional %112 %114 %113
+        %114 = OpLabel
+               OpStore %x_69 %true
+               OpBranch %43
+        %113 = OpLabel
+               OpBranch %94
+         %94 = OpLabel
+        %115 = OpAccessChain %_ptr_Function_float %x_101 %uint_0
+        %116 = OpLoad %float %115
+        %117 = OpAccessChain %_ptr_Function_float %x_101 %uint_1
+        %118 = OpLoad %float %117
+        %120 = OpAccessChain %_ptr_Function_float %x_101 %uint_2
+        %121 = OpLoad %float %120
+        %122 = OpCompositeConstruct %v4float %116 %118 %121 %float_1
+               OpStore %x_GLF_color %122
+               OpStore %x_69 %true
+               OpBranch %43
+         %44 = OpLabel
+               OpBranch %42
+         %43 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %123
+%tint_symbol = OpFunctionParameter %main_out
+        %127 = OpLabel
+        %128 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %128
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+        %130 = OpLabel
+        %131 = OpFunctionCall %void %main_1
+        %133 = OpLoad %v4float %x_GLF_color
+        %134 = OpCompositeConstruct %main_out %133
+        %132 = OpFunctionCall %void %tint_symbol_2 %134
+               OpReturn
+               OpFunctionEnd
+%binarySearch_struct_tmp_struct_i1_1_1_ = OpFunction %int None %135
+        %obj = OpFunctionParameter %_ptr_Function_tmp_struct
+        %139 = OpLabel
+      %x_112 = OpVariable %_ptr_Function_bool Function %27
+       %x_16 = OpVariable %_ptr_Function_int Function %30
+        %one = OpVariable %_ptr_Function_int Function %30
+       %zero = OpVariable %_ptr_Function_int Function %30
+       %x_27 = OpVariable %_ptr_Function_int Function %30
+  %x_114_phi = OpVariable %_ptr_Function_bool Function %27
+   %x_28_phi = OpVariable %_ptr_Function_int Function %30
+   %x_15_phi = OpVariable %_ptr_Function_int Function %30
+   %x_27_phi = OpVariable %_ptr_Function_int Function %30
+  %x_128_phi = OpVariable %_ptr_Function_bool Function %27
+               OpStore %x_112 %false
+               OpStore %x_114_phi %false
+               OpBranch %147
+        %147 = OpLabel
+               OpLoopMerge %148 %149 None
+               OpBranch %150
+        %150 = OpLabel
+        %154 = OpLoad %bool %x_114_phi
+               OpStore %one %int_1
+               OpStore %x_15_phi %int_1
+               OpBranch %155
+        %155 = OpLabel
+               OpLoopMerge %156 %157 None
+               OpBranch %158
+        %158 = OpLabel
+        %159 = OpLoad %int %x_15_phi
+               OpStore %x_27_phi %int_0
+               OpStore %x_128_phi %154
+        %160 = OpSGreaterThan %bool %159 %int_10
+               OpSelectionMerge %161 None
+               OpBranchConditional %160 %162 %163
+        %162 = OpLabel
+               OpBranch %161
+        %163 = OpLabel
+               OpBranch %156
+        %161 = OpLabel
+        %164 = OpISub %int %159 %int_1
+               OpStore %zero %164
+        %166 = OpAccessChain %_ptr_Function_int %obj %uint_0 %164
+        %167 = OpLoad %int %166
+        %168 = OpIEqual %bool %167 %int_1
+               OpSelectionMerge %169 None
+               OpBranchConditional %168 %170 %169
+        %170 = OpLabel
+               OpStore %x_112 %true
+               OpStore %x_16 %int_1
+               OpStore %x_27_phi %int_1
+               OpStore %x_128_phi %true
+               OpBranch %156
+        %169 = OpLabel
+               OpStore %one %164
+               OpBranch %157
+        %157 = OpLabel
+               OpStore %x_15_phi %164
+               OpBranch %155
+        %156 = OpLabel
+        %171 = OpLoad %int %x_27_phi
+               OpStore %x_27 %171
+        %172 = OpLoad %bool %x_128_phi
+        %173 = OpLoad %int %x_27
+               OpStore %x_28_phi %173
+               OpSelectionMerge %174 None
+               OpBranchConditional %172 %175 %174
+        %175 = OpLabel
+               OpBranch %148
+        %174 = OpLabel
+               OpStore %x_112 %true
+               OpStore %x_16 %int_n1
+               OpStore %x_28_phi %int_n1
+               OpBranch %148
+        %149 = OpLabel
+               OpStore %x_114_phi %false
+               OpBranch %147
+        %148 = OpLabel
+        %176 = OpLoad %int %x_28_phi
+               OpReturnValue %176
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/always-discarding-function/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/always-discarding-function/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..58324d8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/always-discarding-function/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,172 @@
+struct tmp_struct {
+  nmb : array<i32, 1>;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_11 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_24 : array<i32, 1>;
+  var x_68 : bool = false;
+  var x_17 : i32;
+  var x_18 : i32;
+  var x_19 : i32;
+  var x_20 : i32;
+  var x_69 : bool = false;
+  var tmp_float : f32;
+  var color : vec3<f32>;
+  loop {
+    var x_25 : i32;
+    var x_101 : vec3<f32>;
+    var x_79_phi : bool;
+    var x_26_phi : i32;
+    let x_75 : f32 = x_11.injectionSwitch.y;
+    tmp_float = x_75;
+    let x_76 : vec3<f32> = vec3<f32>(x_75, x_75, x_75);
+    color = x_76;
+    x_24 = tmp_struct(array<i32, 1>(0)).nmb;
+    x_68 = false;
+    x_79_phi = false;
+    loop {
+      var x_21_phi : i32;
+      var x_25_phi : i32;
+      var x_93_phi : bool;
+      let x_79 : bool = x_79_phi;
+      x_18 = 1;
+      x_21_phi = 1;
+      loop {
+        let x_21 : i32 = x_21_phi;
+        x_25_phi = 0;
+        x_93_phi = x_79;
+        if ((x_21 > 10)) {
+        } else {
+          break;
+        }
+        let x_22 : i32 = (x_21 - 1);
+        x_19 = x_22;
+        let x_23 : i32 = x_24[x_22];
+        if ((x_23 == 1)) {
+          x_68 = true;
+          x_17 = 1;
+          x_25_phi = 1;
+          x_93_phi = true;
+          break;
+        }
+        x_18 = x_22;
+
+        continuing {
+          x_21_phi = x_22;
+        }
+      }
+      x_25 = x_25_phi;
+      let x_93 : bool = x_93_phi;
+      x_26_phi = x_25;
+      if (x_93) {
+        break;
+      }
+      x_68 = true;
+      x_17 = -1;
+      x_26_phi = -1;
+      break;
+
+      continuing {
+        x_79_phi = false;
+      }
+    }
+    let x_26 : i32 = x_26_phi;
+    x_20 = x_26;
+    if ((x_26 == -1)) {
+      discard;
+    } else {
+      x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+      let x_100 : vec2<f32> = (vec2<f32>(x_76.y, x_76.z) + vec2<f32>(1.0, 1.0));
+      x_101 = vec3<f32>(x_76.x, x_100.x, x_100.y);
+      color = x_101;
+      let x_103 : f32 = x_11.injectionSwitch.x;
+      if ((x_103 > 1.0)) {
+        x_69 = true;
+        break;
+      }
+    }
+    x_GLF_color = vec4<f32>(x_101.x, x_101.y, x_101.z, 1.0);
+    x_69 = true;
+    break;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+fn binarySearch_struct_tmp_struct_i1_1_1_(obj : ptr<function, tmp_struct>) -> i32 {
+  var x_112 : bool = false;
+  var x_16 : i32;
+  var one : i32;
+  var zero : i32;
+  var x_27 : i32;
+  var x_114_phi : bool;
+  var x_28_phi : i32;
+  x_114_phi = false;
+  loop {
+    var x_15_phi : i32;
+    var x_27_phi : i32;
+    var x_128_phi : bool;
+    let x_114 : bool = x_114_phi;
+    one = 1;
+    x_15_phi = 1;
+    loop {
+      let x_15 : i32 = x_15_phi;
+      x_27_phi = 0;
+      x_128_phi = x_114;
+      if ((x_15 > 10)) {
+      } else {
+        break;
+      }
+      let x_13 : i32 = (x_15 - 1);
+      zero = x_13;
+      let x_14 : i32 = (*(obj)).nmb[x_13];
+      if ((x_14 == 1)) {
+        x_112 = true;
+        x_16 = 1;
+        x_27_phi = 1;
+        x_128_phi = true;
+        break;
+      }
+      one = x_13;
+
+      continuing {
+        x_15_phi = x_13;
+      }
+    }
+    x_27 = x_27_phi;
+    let x_128 : bool = x_128_phi;
+    x_28_phi = x_27;
+    if (x_128) {
+      break;
+    }
+    x_112 = true;
+    x_16 = -1;
+    x_28_phi = -1;
+    break;
+
+    continuing {
+      x_114_phi = false;
+    }
+  }
+  let x_28 : i32 = x_28_phi;
+  return x_28;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/always-discarding-function/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/always-discarding-function/0-opt.wgsl
new file mode 100644
index 0000000..58324d8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/always-discarding-function/0-opt.wgsl
@@ -0,0 +1,172 @@
+struct tmp_struct {
+  nmb : array<i32, 1>;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_11 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_24 : array<i32, 1>;
+  var x_68 : bool = false;
+  var x_17 : i32;
+  var x_18 : i32;
+  var x_19 : i32;
+  var x_20 : i32;
+  var x_69 : bool = false;
+  var tmp_float : f32;
+  var color : vec3<f32>;
+  loop {
+    var x_25 : i32;
+    var x_101 : vec3<f32>;
+    var x_79_phi : bool;
+    var x_26_phi : i32;
+    let x_75 : f32 = x_11.injectionSwitch.y;
+    tmp_float = x_75;
+    let x_76 : vec3<f32> = vec3<f32>(x_75, x_75, x_75);
+    color = x_76;
+    x_24 = tmp_struct(array<i32, 1>(0)).nmb;
+    x_68 = false;
+    x_79_phi = false;
+    loop {
+      var x_21_phi : i32;
+      var x_25_phi : i32;
+      var x_93_phi : bool;
+      let x_79 : bool = x_79_phi;
+      x_18 = 1;
+      x_21_phi = 1;
+      loop {
+        let x_21 : i32 = x_21_phi;
+        x_25_phi = 0;
+        x_93_phi = x_79;
+        if ((x_21 > 10)) {
+        } else {
+          break;
+        }
+        let x_22 : i32 = (x_21 - 1);
+        x_19 = x_22;
+        let x_23 : i32 = x_24[x_22];
+        if ((x_23 == 1)) {
+          x_68 = true;
+          x_17 = 1;
+          x_25_phi = 1;
+          x_93_phi = true;
+          break;
+        }
+        x_18 = x_22;
+
+        continuing {
+          x_21_phi = x_22;
+        }
+      }
+      x_25 = x_25_phi;
+      let x_93 : bool = x_93_phi;
+      x_26_phi = x_25;
+      if (x_93) {
+        break;
+      }
+      x_68 = true;
+      x_17 = -1;
+      x_26_phi = -1;
+      break;
+
+      continuing {
+        x_79_phi = false;
+      }
+    }
+    let x_26 : i32 = x_26_phi;
+    x_20 = x_26;
+    if ((x_26 == -1)) {
+      discard;
+    } else {
+      x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+      let x_100 : vec2<f32> = (vec2<f32>(x_76.y, x_76.z) + vec2<f32>(1.0, 1.0));
+      x_101 = vec3<f32>(x_76.x, x_100.x, x_100.y);
+      color = x_101;
+      let x_103 : f32 = x_11.injectionSwitch.x;
+      if ((x_103 > 1.0)) {
+        x_69 = true;
+        break;
+      }
+    }
+    x_GLF_color = vec4<f32>(x_101.x, x_101.y, x_101.z, 1.0);
+    x_69 = true;
+    break;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+fn binarySearch_struct_tmp_struct_i1_1_1_(obj : ptr<function, tmp_struct>) -> i32 {
+  var x_112 : bool = false;
+  var x_16 : i32;
+  var one : i32;
+  var zero : i32;
+  var x_27 : i32;
+  var x_114_phi : bool;
+  var x_28_phi : i32;
+  x_114_phi = false;
+  loop {
+    var x_15_phi : i32;
+    var x_27_phi : i32;
+    var x_128_phi : bool;
+    let x_114 : bool = x_114_phi;
+    one = 1;
+    x_15_phi = 1;
+    loop {
+      let x_15 : i32 = x_15_phi;
+      x_27_phi = 0;
+      x_128_phi = x_114;
+      if ((x_15 > 10)) {
+      } else {
+        break;
+      }
+      let x_13 : i32 = (x_15 - 1);
+      zero = x_13;
+      let x_14 : i32 = (*(obj)).nmb[x_13];
+      if ((x_14 == 1)) {
+        x_112 = true;
+        x_16 = 1;
+        x_27_phi = 1;
+        x_128_phi = true;
+        break;
+      }
+      one = x_13;
+
+      continuing {
+        x_15_phi = x_13;
+      }
+    }
+    x_27 = x_27_phi;
+    let x_128 : bool = x_128_phi;
+    x_28_phi = x_27;
+    if (x_128) {
+      break;
+    }
+    x_112 = true;
+    x_16 = -1;
+    x_28_phi = -1;
+    break;
+
+    continuing {
+      x_114_phi = false;
+    }
+  }
+  let x_28 : i32 = x_28_phi;
+  return x_28;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/always-discarding-function/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/always-discarding-function/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..f0e2766
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/always-discarding-function/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,168 @@
+struct tmp_struct {
+  int nmb[1];
+};
+
+cbuffer cbuffer_x_11 : register(b0, space0) {
+  uint4 x_11[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int x_24[1] = (int[1])0;
+  bool x_68 = false;
+  int x_17 = 0;
+  int x_18 = 0;
+  int x_19 = 0;
+  int x_20 = 0;
+  bool x_69 = false;
+  float tmp_float = 0.0f;
+  float3 color = float3(0.0f, 0.0f, 0.0f);
+  while (true) {
+    int x_25 = 0;
+    float3 x_101 = float3(0.0f, 0.0f, 0.0f);
+    bool x_79_phi = false;
+    int x_26_phi = 0;
+    const float x_75 = asfloat(x_11[0].y);
+    tmp_float = x_75;
+    const float3 x_76 = float3(x_75, x_75, x_75);
+    color = x_76;
+    const int tint_symbol_3[1] = {0};
+    const tmp_struct tint_symbol_4 = {tint_symbol_3};
+    x_24 = tint_symbol_4.nmb;
+    x_68 = false;
+    x_79_phi = false;
+    while (true) {
+      int x_21_phi = 0;
+      int x_25_phi = 0;
+      bool x_93_phi = false;
+      const bool x_79 = x_79_phi;
+      x_18 = 1;
+      x_21_phi = 1;
+      while (true) {
+        const int x_21 = x_21_phi;
+        x_25_phi = 0;
+        x_93_phi = x_79;
+        if ((x_21 > 10)) {
+        } else {
+          break;
+        }
+        const int x_22 = (x_21 - 1);
+        x_19 = x_22;
+        const int x_23 = x_24[x_22];
+        if ((x_23 == 1)) {
+          x_68 = true;
+          x_17 = 1;
+          x_25_phi = 1;
+          x_93_phi = true;
+          break;
+        }
+        x_18 = x_22;
+        {
+          x_21_phi = x_22;
+        }
+      }
+      x_25 = x_25_phi;
+      const bool x_93 = x_93_phi;
+      x_26_phi = x_25;
+      if (x_93) {
+        break;
+      }
+      x_68 = true;
+      x_17 = -1;
+      x_26_phi = -1;
+      break;
+      {
+        x_79_phi = false;
+      }
+    }
+    const int x_26 = x_26_phi;
+    x_20 = x_26;
+    if ((x_26 == -1)) {
+      discard;
+    } else {
+      x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+      const float2 x_100 = (float2(x_76.y, x_76.z) + float2(1.0f, 1.0f));
+      x_101 = float3(x_76.x, x_100.x, x_100.y);
+      color = x_101;
+      const float x_103 = asfloat(x_11[0].x);
+      if ((x_103 > 1.0f)) {
+        x_69 = true;
+        break;
+      }
+    }
+    x_GLF_color = float4(x_101.x, x_101.y, x_101.z, 1.0f);
+    x_69 = true;
+    break;
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
+int binarySearch_struct_tmp_struct_i1_1_1_(inout tmp_struct obj) {
+  bool x_112 = false;
+  int x_16 = 0;
+  int one = 0;
+  int zero = 0;
+  int x_27 = 0;
+  bool x_114_phi = false;
+  int x_28_phi = 0;
+  x_114_phi = false;
+  while (true) {
+    int x_15_phi = 0;
+    int x_27_phi = 0;
+    bool x_128_phi = false;
+    const bool x_114 = x_114_phi;
+    one = 1;
+    x_15_phi = 1;
+    while (true) {
+      const int x_15 = x_15_phi;
+      x_27_phi = 0;
+      x_128_phi = x_114;
+      if ((x_15 > 10)) {
+      } else {
+        break;
+      }
+      const int x_13 = (x_15 - 1);
+      zero = x_13;
+      const int x_14 = obj.nmb[x_13];
+      if ((x_14 == 1)) {
+        x_112 = true;
+        x_16 = 1;
+        x_27_phi = 1;
+        x_128_phi = true;
+        break;
+      }
+      one = x_13;
+      {
+        x_15_phi = x_13;
+      }
+    }
+    x_27 = x_27_phi;
+    const bool x_128 = x_128_phi;
+    x_28_phi = x_27;
+    if (x_128) {
+      break;
+    }
+    x_112 = true;
+    x_16 = -1;
+    x_28_phi = -1;
+    break;
+    {
+      x_114_phi = false;
+    }
+  }
+  return x_28_phi;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/always-discarding-function/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/always-discarding-function/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..5262879
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/always-discarding-function/0-opt.wgsl.expected.msl
@@ -0,0 +1,174 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  int arr[1];
+};
+struct tmp_struct {
+  tint_array_wrapper nmb;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_11, thread float4* const tint_symbol_6) {
+  tint_array_wrapper x_24 = {};
+  bool x_68 = false;
+  int x_17 = 0;
+  int x_18 = 0;
+  int x_19 = 0;
+  int x_20 = 0;
+  bool x_69 = false;
+  float tmp_float = 0.0f;
+  float3 color = 0.0f;
+  while (true) {
+    int x_25 = 0;
+    float3 x_101 = 0.0f;
+    bool x_79_phi = false;
+    int x_26_phi = 0;
+    float const x_75 = x_11.injectionSwitch.y;
+    tmp_float = x_75;
+    float3 const x_76 = float3(x_75, x_75, x_75);
+    color = x_76;
+    tint_array_wrapper const tint_symbol_3 = {.arr={0}};
+    tmp_struct const tint_symbol_4 = {.nmb=tint_symbol_3};
+    x_24 = tint_symbol_4.nmb;
+    x_68 = false;
+    x_79_phi = false;
+    while (true) {
+      int x_21_phi = 0;
+      int x_25_phi = 0;
+      bool x_93_phi = false;
+      bool const x_79 = x_79_phi;
+      x_18 = 1;
+      x_21_phi = 1;
+      while (true) {
+        int const x_21 = x_21_phi;
+        x_25_phi = 0;
+        x_93_phi = x_79;
+        if ((x_21 > 10)) {
+        } else {
+          break;
+        }
+        int const x_22 = (x_21 - 1);
+        x_19 = x_22;
+        int const x_23 = x_24.arr[x_22];
+        if ((x_23 == 1)) {
+          x_68 = true;
+          x_17 = 1;
+          x_25_phi = 1;
+          x_93_phi = true;
+          break;
+        }
+        x_18 = x_22;
+        {
+          x_21_phi = x_22;
+        }
+      }
+      x_25 = x_25_phi;
+      bool const x_93 = x_93_phi;
+      x_26_phi = x_25;
+      if (x_93) {
+        break;
+      }
+      x_68 = true;
+      x_17 = -1;
+      x_26_phi = -1;
+      break;
+      {
+        x_79_phi = false;
+      }
+    }
+    int const x_26 = x_26_phi;
+    x_20 = x_26;
+    if ((x_26 == -1)) {
+      discard_fragment();
+    } else {
+      *(tint_symbol_6) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+      float2 const x_100 = (float2(x_76.y, x_76.z) + float2(1.0f, 1.0f));
+      x_101 = float3(x_76.x, x_100.x, x_100.y);
+      color = x_101;
+      float const x_103 = x_11.injectionSwitch.x;
+      if ((x_103 > 1.0f)) {
+        x_69 = true;
+        break;
+      }
+    }
+    *(tint_symbol_6) = float4(x_101.x, x_101.y, x_101.z, 1.0f);
+    x_69 = true;
+    break;
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_11 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  main_1(x_11, &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
+int binarySearch_struct_tmp_struct_i1_1_1_(thread tmp_struct* const obj) {
+  bool x_112 = false;
+  int x_16 = 0;
+  int one = 0;
+  int zero = 0;
+  int x_27 = 0;
+  bool x_114_phi = false;
+  int x_28_phi = 0;
+  x_114_phi = false;
+  while (true) {
+    int x_15_phi = 0;
+    int x_27_phi = 0;
+    bool x_128_phi = false;
+    bool const x_114 = x_114_phi;
+    one = 1;
+    x_15_phi = 1;
+    while (true) {
+      int const x_15 = x_15_phi;
+      x_27_phi = 0;
+      x_128_phi = x_114;
+      if ((x_15 > 10)) {
+      } else {
+        break;
+      }
+      int const x_13 = (x_15 - 1);
+      zero = x_13;
+      int const x_14 = (*(obj)).nmb.arr[x_13];
+      if ((x_14 == 1)) {
+        x_112 = true;
+        x_16 = 1;
+        x_27_phi = 1;
+        x_128_phi = true;
+        break;
+      }
+      one = x_13;
+      {
+        x_15_phi = x_13;
+      }
+    }
+    x_27 = x_27_phi;
+    bool const x_128 = x_128_phi;
+    x_28_phi = x_27;
+    if (x_128) {
+      break;
+    }
+    x_112 = true;
+    x_16 = -1;
+    x_28_phi = -1;
+    break;
+    {
+      x_114_phi = false;
+    }
+  }
+  int const x_28 = x_28_phi;
+  return x_28;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/always-discarding-function/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/always-discarding-function/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..18ca5d5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/always-discarding-function/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,345 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 177
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_11 "x_11"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_24 "x_24"
+               OpName %x_68 "x_68"
+               OpName %x_17 "x_17"
+               OpName %x_18 "x_18"
+               OpName %x_19 "x_19"
+               OpName %x_20 "x_20"
+               OpName %x_69 "x_69"
+               OpName %tmp_float "tmp_float"
+               OpName %color "color"
+               OpName %x_25 "x_25"
+               OpName %x_101 "x_101"
+               OpName %x_79_phi "x_79_phi"
+               OpName %x_26_phi "x_26_phi"
+               OpName %tmp_struct "tmp_struct"
+               OpMemberName %tmp_struct 0 "nmb"
+               OpName %x_21_phi "x_21_phi"
+               OpName %x_25_phi "x_25_phi"
+               OpName %x_93_phi "x_93_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpName %binarySearch_struct_tmp_struct_i1_1_1_ "binarySearch_struct_tmp_struct_i1_1_1_"
+               OpName %obj "obj"
+               OpName %x_112 "x_112"
+               OpName %x_16 "x_16"
+               OpName %one "one"
+               OpName %zero "zero"
+               OpName %x_27 "x_27"
+               OpName %x_114_phi "x_114_phi"
+               OpName %x_28_phi "x_28_phi"
+               OpName %x_15_phi "x_15_phi"
+               OpName %x_27_phi "x_27_phi"
+               OpName %x_128_phi "x_128_phi"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_11 NonWritable
+               OpDecorate %x_11 DescriptorSet 0
+               OpDecorate %x_11 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_1 ArrayStride 4
+               OpMemberDecorate %tmp_struct 0 Offset 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_11 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_int_uint_1 = OpTypeArray %int %uint_1
+%_ptr_Function__arr_int_uint_1 = OpTypePointer Function %_arr_int_uint_1
+         %22 = OpConstantNull %_arr_int_uint_1
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %27 = OpConstantNull %bool
+%_ptr_Function_int = OpTypePointer Function %int
+         %30 = OpConstantNull %int
+%_ptr_Function_float = OpTypePointer Function %float
+         %37 = OpConstantNull %float
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %41 = OpConstantNull %v3float
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+ %tmp_struct = OpTypeStruct %_arr_int_uint_1
+      %int_0 = OpConstant %int 0
+         %57 = OpConstantComposite %_arr_int_uint_1 %int_0
+         %58 = OpConstantComposite %tmp_struct %57
+      %int_1 = OpConstant %int 1
+     %int_10 = OpConstant %int 10
+       %true = OpConstantTrue %bool
+     %int_n1 = OpConstant %int -1
+    %float_0 = OpConstant %float 0
+         %98 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+    %float_1 = OpConstant %float 1
+        %103 = OpConstantComposite %v2float %float_1 %float_1
+     %uint_2 = OpConstant %uint 2
+   %main_out = OpTypeStruct %v4float
+        %123 = OpTypeFunction %void %main_out
+%_ptr_Function_tmp_struct = OpTypePointer Function %tmp_struct
+        %135 = OpTypeFunction %int %_ptr_Function_tmp_struct
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+       %x_24 = OpVariable %_ptr_Function__arr_int_uint_1 Function %22
+       %x_68 = OpVariable %_ptr_Function_bool Function %27
+       %x_17 = OpVariable %_ptr_Function_int Function %30
+       %x_18 = OpVariable %_ptr_Function_int Function %30
+       %x_19 = OpVariable %_ptr_Function_int Function %30
+       %x_20 = OpVariable %_ptr_Function_int Function %30
+       %x_69 = OpVariable %_ptr_Function_bool Function %27
+  %tmp_float = OpVariable %_ptr_Function_float Function %37
+      %color = OpVariable %_ptr_Function_v3float Function %41
+       %x_25 = OpVariable %_ptr_Function_int Function %30
+      %x_101 = OpVariable %_ptr_Function_v3float Function %41
+   %x_79_phi = OpVariable %_ptr_Function_bool Function %27
+   %x_26_phi = OpVariable %_ptr_Function_int Function %30
+   %x_21_phi = OpVariable %_ptr_Function_int Function %30
+   %x_25_phi = OpVariable %_ptr_Function_int Function %30
+   %x_93_phi = OpVariable %_ptr_Function_bool Function %27
+               OpStore %x_68 %false
+               OpStore %x_69 %false
+               OpBranch %42
+         %42 = OpLabel
+               OpLoopMerge %43 %44 None
+               OpBranch %45
+         %45 = OpLabel
+         %52 = OpAccessChain %_ptr_Uniform_float %x_11 %uint_0 %uint_1
+         %53 = OpLoad %float %52
+               OpStore %tmp_float %53
+         %54 = OpCompositeConstruct %v3float %53 %53 %53
+               OpStore %color %54
+         %59 = OpCompositeExtract %_arr_int_uint_1 %58 0
+               OpStore %x_24 %59
+               OpStore %x_68 %false
+               OpStore %x_79_phi %false
+               OpBranch %60
+         %60 = OpLabel
+               OpLoopMerge %61 %62 None
+               OpBranch %63
+         %63 = OpLabel
+         %67 = OpLoad %bool %x_79_phi
+               OpStore %x_18 %int_1
+               OpStore %x_21_phi %int_1
+               OpBranch %69
+         %69 = OpLabel
+               OpLoopMerge %70 %71 None
+               OpBranch %72
+         %72 = OpLabel
+         %73 = OpLoad %int %x_21_phi
+               OpStore %x_25_phi %int_0
+               OpStore %x_93_phi %67
+         %75 = OpSGreaterThan %bool %73 %int_10
+               OpSelectionMerge %76 None
+               OpBranchConditional %75 %77 %78
+         %77 = OpLabel
+               OpBranch %76
+         %78 = OpLabel
+               OpBranch %70
+         %76 = OpLabel
+         %79 = OpISub %int %73 %int_1
+               OpStore %x_19 %79
+         %80 = OpAccessChain %_ptr_Function_int %x_24 %79
+         %81 = OpLoad %int %80
+         %82 = OpIEqual %bool %81 %int_1
+               OpSelectionMerge %83 None
+               OpBranchConditional %82 %84 %83
+         %84 = OpLabel
+               OpStore %x_68 %true
+               OpStore %x_17 %int_1
+               OpStore %x_25_phi %int_1
+               OpStore %x_93_phi %true
+               OpBranch %70
+         %83 = OpLabel
+               OpStore %x_18 %79
+               OpBranch %71
+         %71 = OpLabel
+               OpStore %x_21_phi %79
+               OpBranch %69
+         %70 = OpLabel
+         %86 = OpLoad %int %x_25_phi
+               OpStore %x_25 %86
+         %87 = OpLoad %bool %x_93_phi
+         %88 = OpLoad %int %x_25
+               OpStore %x_26_phi %88
+               OpSelectionMerge %89 None
+               OpBranchConditional %87 %90 %89
+         %90 = OpLabel
+               OpBranch %61
+         %89 = OpLabel
+               OpStore %x_68 %true
+               OpStore %x_17 %int_n1
+               OpStore %x_26_phi %int_n1
+               OpBranch %61
+         %62 = OpLabel
+               OpStore %x_79_phi %false
+               OpBranch %60
+         %61 = OpLabel
+         %92 = OpLoad %int %x_26_phi
+               OpStore %x_20 %92
+         %93 = OpIEqual %bool %92 %int_n1
+               OpSelectionMerge %94 None
+               OpBranchConditional %93 %95 %96
+         %95 = OpLabel
+               OpKill
+         %96 = OpLabel
+               OpStore %x_GLF_color %98
+         %99 = OpCompositeExtract %float %54 1
+        %100 = OpCompositeExtract %float %54 2
+        %101 = OpCompositeConstruct %v2float %99 %100
+        %104 = OpFAdd %v2float %101 %103
+        %105 = OpCompositeExtract %float %54 0
+        %106 = OpCompositeExtract %float %104 0
+        %107 = OpCompositeExtract %float %104 1
+        %108 = OpCompositeConstruct %v3float %105 %106 %107
+               OpStore %x_101 %108
+        %109 = OpLoad %v3float %x_101
+               OpStore %color %109
+        %110 = OpAccessChain %_ptr_Uniform_float %x_11 %uint_0 %uint_0
+        %111 = OpLoad %float %110
+        %112 = OpFOrdGreaterThan %bool %111 %float_1
+               OpSelectionMerge %113 None
+               OpBranchConditional %112 %114 %113
+        %114 = OpLabel
+               OpStore %x_69 %true
+               OpBranch %43
+        %113 = OpLabel
+               OpBranch %94
+         %94 = OpLabel
+        %115 = OpAccessChain %_ptr_Function_float %x_101 %uint_0
+        %116 = OpLoad %float %115
+        %117 = OpAccessChain %_ptr_Function_float %x_101 %uint_1
+        %118 = OpLoad %float %117
+        %120 = OpAccessChain %_ptr_Function_float %x_101 %uint_2
+        %121 = OpLoad %float %120
+        %122 = OpCompositeConstruct %v4float %116 %118 %121 %float_1
+               OpStore %x_GLF_color %122
+               OpStore %x_69 %true
+               OpBranch %43
+         %44 = OpLabel
+               OpBranch %42
+         %43 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %123
+%tint_symbol = OpFunctionParameter %main_out
+        %127 = OpLabel
+        %128 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %128
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+        %130 = OpLabel
+        %131 = OpFunctionCall %void %main_1
+        %133 = OpLoad %v4float %x_GLF_color
+        %134 = OpCompositeConstruct %main_out %133
+        %132 = OpFunctionCall %void %tint_symbol_2 %134
+               OpReturn
+               OpFunctionEnd
+%binarySearch_struct_tmp_struct_i1_1_1_ = OpFunction %int None %135
+        %obj = OpFunctionParameter %_ptr_Function_tmp_struct
+        %139 = OpLabel
+      %x_112 = OpVariable %_ptr_Function_bool Function %27
+       %x_16 = OpVariable %_ptr_Function_int Function %30
+        %one = OpVariable %_ptr_Function_int Function %30
+       %zero = OpVariable %_ptr_Function_int Function %30
+       %x_27 = OpVariable %_ptr_Function_int Function %30
+  %x_114_phi = OpVariable %_ptr_Function_bool Function %27
+   %x_28_phi = OpVariable %_ptr_Function_int Function %30
+   %x_15_phi = OpVariable %_ptr_Function_int Function %30
+   %x_27_phi = OpVariable %_ptr_Function_int Function %30
+  %x_128_phi = OpVariable %_ptr_Function_bool Function %27
+               OpStore %x_112 %false
+               OpStore %x_114_phi %false
+               OpBranch %147
+        %147 = OpLabel
+               OpLoopMerge %148 %149 None
+               OpBranch %150
+        %150 = OpLabel
+        %154 = OpLoad %bool %x_114_phi
+               OpStore %one %int_1
+               OpStore %x_15_phi %int_1
+               OpBranch %155
+        %155 = OpLabel
+               OpLoopMerge %156 %157 None
+               OpBranch %158
+        %158 = OpLabel
+        %159 = OpLoad %int %x_15_phi
+               OpStore %x_27_phi %int_0
+               OpStore %x_128_phi %154
+        %160 = OpSGreaterThan %bool %159 %int_10
+               OpSelectionMerge %161 None
+               OpBranchConditional %160 %162 %163
+        %162 = OpLabel
+               OpBranch %161
+        %163 = OpLabel
+               OpBranch %156
+        %161 = OpLabel
+        %164 = OpISub %int %159 %int_1
+               OpStore %zero %164
+        %166 = OpAccessChain %_ptr_Function_int %obj %uint_0 %164
+        %167 = OpLoad %int %166
+        %168 = OpIEqual %bool %167 %int_1
+               OpSelectionMerge %169 None
+               OpBranchConditional %168 %170 %169
+        %170 = OpLabel
+               OpStore %x_112 %true
+               OpStore %x_16 %int_1
+               OpStore %x_27_phi %int_1
+               OpStore %x_128_phi %true
+               OpBranch %156
+        %169 = OpLabel
+               OpStore %one %164
+               OpBranch %157
+        %157 = OpLabel
+               OpStore %x_15_phi %164
+               OpBranch %155
+        %156 = OpLabel
+        %171 = OpLoad %int %x_27_phi
+               OpStore %x_27 %171
+        %172 = OpLoad %bool %x_128_phi
+        %173 = OpLoad %int %x_27
+               OpStore %x_28_phi %173
+               OpSelectionMerge %174 None
+               OpBranchConditional %172 %175 %174
+        %175 = OpLabel
+               OpBranch %148
+        %174 = OpLabel
+               OpStore %x_112 %true
+               OpStore %x_16 %int_n1
+               OpStore %x_28_phi %int_n1
+               OpBranch %148
+        %149 = OpLabel
+               OpStore %x_114_phi %false
+               OpBranch %147
+        %148 = OpLabel
+        %176 = OpLoad %int %x_28_phi
+               OpReturnValue %176
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/always-discarding-function/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/always-discarding-function/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..58324d8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/always-discarding-function/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,172 @@
+struct tmp_struct {
+  nmb : array<i32, 1>;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_11 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_24 : array<i32, 1>;
+  var x_68 : bool = false;
+  var x_17 : i32;
+  var x_18 : i32;
+  var x_19 : i32;
+  var x_20 : i32;
+  var x_69 : bool = false;
+  var tmp_float : f32;
+  var color : vec3<f32>;
+  loop {
+    var x_25 : i32;
+    var x_101 : vec3<f32>;
+    var x_79_phi : bool;
+    var x_26_phi : i32;
+    let x_75 : f32 = x_11.injectionSwitch.y;
+    tmp_float = x_75;
+    let x_76 : vec3<f32> = vec3<f32>(x_75, x_75, x_75);
+    color = x_76;
+    x_24 = tmp_struct(array<i32, 1>(0)).nmb;
+    x_68 = false;
+    x_79_phi = false;
+    loop {
+      var x_21_phi : i32;
+      var x_25_phi : i32;
+      var x_93_phi : bool;
+      let x_79 : bool = x_79_phi;
+      x_18 = 1;
+      x_21_phi = 1;
+      loop {
+        let x_21 : i32 = x_21_phi;
+        x_25_phi = 0;
+        x_93_phi = x_79;
+        if ((x_21 > 10)) {
+        } else {
+          break;
+        }
+        let x_22 : i32 = (x_21 - 1);
+        x_19 = x_22;
+        let x_23 : i32 = x_24[x_22];
+        if ((x_23 == 1)) {
+          x_68 = true;
+          x_17 = 1;
+          x_25_phi = 1;
+          x_93_phi = true;
+          break;
+        }
+        x_18 = x_22;
+
+        continuing {
+          x_21_phi = x_22;
+        }
+      }
+      x_25 = x_25_phi;
+      let x_93 : bool = x_93_phi;
+      x_26_phi = x_25;
+      if (x_93) {
+        break;
+      }
+      x_68 = true;
+      x_17 = -1;
+      x_26_phi = -1;
+      break;
+
+      continuing {
+        x_79_phi = false;
+      }
+    }
+    let x_26 : i32 = x_26_phi;
+    x_20 = x_26;
+    if ((x_26 == -1)) {
+      discard;
+    } else {
+      x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+      let x_100 : vec2<f32> = (vec2<f32>(x_76.y, x_76.z) + vec2<f32>(1.0, 1.0));
+      x_101 = vec3<f32>(x_76.x, x_100.x, x_100.y);
+      color = x_101;
+      let x_103 : f32 = x_11.injectionSwitch.x;
+      if ((x_103 > 1.0)) {
+        x_69 = true;
+        break;
+      }
+    }
+    x_GLF_color = vec4<f32>(x_101.x, x_101.y, x_101.z, 1.0);
+    x_69 = true;
+    break;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+fn binarySearch_struct_tmp_struct_i1_1_1_(obj : ptr<function, tmp_struct>) -> i32 {
+  var x_112 : bool = false;
+  var x_16 : i32;
+  var one : i32;
+  var zero : i32;
+  var x_27 : i32;
+  var x_114_phi : bool;
+  var x_28_phi : i32;
+  x_114_phi = false;
+  loop {
+    var x_15_phi : i32;
+    var x_27_phi : i32;
+    var x_128_phi : bool;
+    let x_114 : bool = x_114_phi;
+    one = 1;
+    x_15_phi = 1;
+    loop {
+      let x_15 : i32 = x_15_phi;
+      x_27_phi = 0;
+      x_128_phi = x_114;
+      if ((x_15 > 10)) {
+      } else {
+        break;
+      }
+      let x_13 : i32 = (x_15 - 1);
+      zero = x_13;
+      let x_14 : i32 = (*(obj)).nmb[x_13];
+      if ((x_14 == 1)) {
+        x_112 = true;
+        x_16 = 1;
+        x_27_phi = 1;
+        x_128_phi = true;
+        break;
+      }
+      one = x_13;
+
+      continuing {
+        x_15_phi = x_13;
+      }
+    }
+    x_27 = x_27_phi;
+    let x_128 : bool = x_128_phi;
+    x_28_phi = x_27;
+    if (x_128) {
+      break;
+    }
+    x_112 = true;
+    x_16 = -1;
+    x_28_phi = -1;
+    break;
+
+    continuing {
+      x_114_phi = false;
+    }
+  }
+  let x_28 : i32 = x_28_phi;
+  return x_28;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/arr-value-set-to-arr-value-squared/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/arr-value-set-to-arr-value-squared/0-opt.spvasm
new file mode 100644
index 0000000..323b987
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/arr-value-set-to-arr-value-squared/0-opt.spvasm
@@ -0,0 +1,315 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %swap_i1_i1_ "swap(i1;i1;"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %performPartition_i1_i1_ "performPartition(i1;i1;"
+               OpName %l "l"
+               OpName %h "h"
+               OpName %quicksort_ "quicksort("
+               OpName %temp "temp"
+               OpName %QuicksortObject "QuicksortObject"
+               OpMemberName %QuicksortObject 0 "numbers"
+               OpName %obj "obj"
+               OpName %pivot "pivot"
+               OpName %i_0 "i"
+               OpName %j_0 "j"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %param_1 "param"
+               OpName %param_2 "param"
+               OpName %l_0 "l"
+               OpName %h_0 "h"
+               OpName %top "top"
+               OpName %stack "stack"
+               OpName %p "p"
+               OpName %param_3 "param"
+               OpName %param_4 "param"
+               OpName %i_1 "i"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpDecorate %_GLF_color Location 0
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+       %void = OpTypeVoid
+         %32 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %35 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+         %36 = OpTypeFunction %int %_ptr_Function_int %_ptr_Function_int
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%QuicksortObject = OpTypeStruct %_arr_int_uint_10
+%_ptr_Private_QuicksortObject = OpTypePointer Private %QuicksortObject
+        %obj = OpVariable %_ptr_Private_QuicksortObject Private
+      %int_0 = OpConstant %int 0
+%_ptr_Private_int = OpTypePointer Private %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %int_9 = OpConstant %int 9
+     %int_n1 = OpConstant %int -1
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+     %int_10 = OpConstant %int 10
+      %int_4 = OpConstant %int 4
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %55 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %56 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+       %main = OpFunction %void None %32
+         %59 = OpLabel
+        %i_1 = OpVariable %_ptr_Function_int Function
+               OpStore %i_1 %int_0
+               OpBranch %60
+         %60 = OpLabel
+               OpLoopMerge %61 %62 None
+               OpBranch %63
+         %63 = OpLabel
+         %64 = OpLoad %int %i_1
+         %65 = OpSLessThan %bool %64 %int_10
+               OpBranchConditional %65 %66 %61
+         %66 = OpLabel
+         %67 = OpLoad %int %i_1
+         %68 = OpLoad %int %i_1
+         %69 = OpISub %int %int_10 %68
+         %70 = OpAccessChain %_ptr_Private_int %obj %int_0 %67
+               OpStore %70 %69
+         %71 = OpLoad %int %i_1
+         %72 = OpLoad %int %i_1
+         %73 = OpAccessChain %_ptr_Private_int %obj %int_0 %72
+         %74 = OpLoad %int %73
+         %75 = OpLoad %int %i_1
+         %76 = OpAccessChain %_ptr_Private_int %obj %int_0 %75
+         %77 = OpLoad %int %76
+         %78 = OpIMul %int %74 %77
+         %79 = OpAccessChain %_ptr_Private_int %obj %int_0 %71
+               OpStore %79 %78
+               OpBranch %62
+         %62 = OpLabel
+         %80 = OpLoad %int %i_1
+         %81 = OpIAdd %int %80 %int_1
+               OpStore %i_1 %81
+               OpBranch %60
+         %61 = OpLabel
+         %82 = OpFunctionCall %void %quicksort_
+         %83 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_0
+         %84 = OpLoad %int %83
+         %85 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_4
+         %86 = OpLoad %int %85
+         %87 = OpSLessThan %bool %84 %86
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %90
+         %89 = OpLabel
+               OpStore %_GLF_color %55
+               OpBranch %88
+         %90 = OpLabel
+               OpStore %_GLF_color %56
+               OpBranch %88
+         %88 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%swap_i1_i1_ = OpFunction %void None %35
+          %i = OpFunctionParameter %_ptr_Function_int
+          %j = OpFunctionParameter %_ptr_Function_int
+         %91 = OpLabel
+       %temp = OpVariable %_ptr_Function_int Function
+         %92 = OpLoad %int %i
+         %93 = OpAccessChain %_ptr_Private_int %obj %int_0 %92
+         %94 = OpLoad %int %93
+               OpStore %temp %94
+         %95 = OpLoad %int %i
+         %96 = OpLoad %int %j
+         %97 = OpAccessChain %_ptr_Private_int %obj %int_0 %96
+         %98 = OpLoad %int %97
+         %99 = OpAccessChain %_ptr_Private_int %obj %int_0 %95
+               OpStore %99 %98
+        %100 = OpLoad %int %j
+        %101 = OpLoad %int %temp
+        %102 = OpAccessChain %_ptr_Private_int %obj %int_0 %100
+               OpStore %102 %101
+               OpReturn
+               OpFunctionEnd
+%performPartition_i1_i1_ = OpFunction %int None %36
+          %l = OpFunctionParameter %_ptr_Function_int
+          %h = OpFunctionParameter %_ptr_Function_int
+        %103 = OpLabel
+      %pivot = OpVariable %_ptr_Function_int Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+        %j_0 = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_int Function
+    %param_0 = OpVariable %_ptr_Function_int Function
+    %param_1 = OpVariable %_ptr_Function_int Function
+    %param_2 = OpVariable %_ptr_Function_int Function
+        %104 = OpLoad %int %h
+        %105 = OpAccessChain %_ptr_Private_int %obj %int_0 %104
+        %106 = OpLoad %int %105
+               OpStore %pivot %106
+        %107 = OpLoad %int %l
+        %108 = OpISub %int %107 %int_1
+               OpStore %i_0 %108
+        %109 = OpLoad %int %l
+               OpStore %j_0 %109
+               OpBranch %110
+        %110 = OpLabel
+               OpLoopMerge %111 %112 None
+               OpBranch %113
+        %113 = OpLabel
+        %114 = OpLoad %int %j_0
+        %115 = OpLoad %int %h
+        %116 = OpISub %int %115 %int_1
+        %117 = OpSLessThanEqual %bool %114 %116
+               OpBranchConditional %117 %118 %111
+        %118 = OpLabel
+        %119 = OpLoad %int %j_0
+        %120 = OpAccessChain %_ptr_Private_int %obj %int_0 %119
+        %121 = OpLoad %int %120
+        %122 = OpLoad %int %pivot
+        %123 = OpSLessThanEqual %bool %121 %122
+               OpSelectionMerge %124 None
+               OpBranchConditional %123 %125 %124
+        %125 = OpLabel
+        %126 = OpLoad %int %i_0
+        %127 = OpIAdd %int %126 %int_1
+               OpStore %i_0 %127
+        %128 = OpLoad %int %i_0
+               OpStore %param %128
+        %129 = OpLoad %int %j_0
+               OpStore %param_0 %129
+        %130 = OpFunctionCall %void %swap_i1_i1_ %param %param_0
+               OpBranch %124
+        %124 = OpLabel
+               OpBranch %112
+        %112 = OpLabel
+        %131 = OpLoad %int %j_0
+        %132 = OpIAdd %int %131 %int_1
+               OpStore %j_0 %132
+               OpBranch %110
+        %111 = OpLabel
+        %133 = OpLoad %int %i_0
+        %134 = OpIAdd %int %133 %int_1
+               OpStore %param_1 %134
+        %135 = OpLoad %int %h
+               OpStore %param_2 %135
+        %136 = OpFunctionCall %void %swap_i1_i1_ %param_1 %param_2
+        %137 = OpLoad %int %i_0
+        %138 = OpIAdd %int %137 %int_1
+               OpReturnValue %138
+               OpFunctionEnd
+ %quicksort_ = OpFunction %void None %32
+        %139 = OpLabel
+        %l_0 = OpVariable %_ptr_Function_int Function
+        %h_0 = OpVariable %_ptr_Function_int Function
+        %top = OpVariable %_ptr_Function_int Function
+      %stack = OpVariable %_ptr_Function__arr_int_uint_10 Function
+          %p = OpVariable %_ptr_Function_int Function
+    %param_3 = OpVariable %_ptr_Function_int Function
+    %param_4 = OpVariable %_ptr_Function_int Function
+               OpStore %l_0 %int_0
+               OpStore %h_0 %int_9
+               OpStore %top %int_n1
+        %140 = OpLoad %int %top
+        %141 = OpIAdd %int %140 %int_1
+               OpStore %top %141
+        %142 = OpLoad %int %l_0
+        %143 = OpAccessChain %_ptr_Function_int %stack %141
+               OpStore %143 %142
+        %144 = OpLoad %int %top
+        %145 = OpIAdd %int %144 %int_1
+               OpStore %top %145
+        %146 = OpLoad %int %h_0
+        %147 = OpAccessChain %_ptr_Function_int %stack %145
+               OpStore %147 %146
+               OpBranch %148
+        %148 = OpLabel
+               OpLoopMerge %149 %150 None
+               OpBranch %151
+        %151 = OpLabel
+        %152 = OpLoad %int %top
+        %153 = OpSGreaterThanEqual %bool %152 %int_0
+               OpBranchConditional %153 %154 %149
+        %154 = OpLabel
+        %155 = OpLoad %int %top
+        %156 = OpISub %int %155 %int_1
+               OpStore %top %156
+        %157 = OpAccessChain %_ptr_Function_int %stack %155
+        %158 = OpLoad %int %157
+               OpStore %h_0 %158
+        %159 = OpLoad %int %top
+        %160 = OpISub %int %159 %int_1
+               OpStore %top %160
+        %161 = OpAccessChain %_ptr_Function_int %stack %159
+        %162 = OpLoad %int %161
+               OpStore %l_0 %162
+        %163 = OpLoad %int %l_0
+               OpStore %param_3 %163
+        %164 = OpLoad %int %h_0
+               OpStore %param_4 %164
+        %165 = OpFunctionCall %int %performPartition_i1_i1_ %param_3 %param_4
+               OpStore %p %165
+        %166 = OpLoad %int %p
+        %167 = OpISub %int %166 %int_1
+        %168 = OpLoad %int %l_0
+        %169 = OpSGreaterThan %bool %167 %168
+               OpSelectionMerge %170 None
+               OpBranchConditional %169 %171 %170
+        %171 = OpLabel
+        %172 = OpLoad %int %top
+        %173 = OpIAdd %int %172 %int_1
+               OpStore %top %173
+        %174 = OpLoad %int %l_0
+        %175 = OpAccessChain %_ptr_Function_int %stack %173
+               OpStore %175 %174
+        %176 = OpLoad %int %top
+        %177 = OpIAdd %int %176 %int_1
+               OpStore %top %177
+        %178 = OpLoad %int %p
+        %179 = OpISub %int %178 %int_1
+        %180 = OpAccessChain %_ptr_Function_int %stack %177
+               OpStore %180 %179
+               OpBranch %170
+        %170 = OpLabel
+        %181 = OpLoad %int %p
+        %182 = OpIAdd %int %181 %int_1
+        %183 = OpLoad %int %h_0
+        %184 = OpSLessThan %bool %182 %183
+               OpSelectionMerge %185 None
+               OpBranchConditional %184 %186 %185
+        %186 = OpLabel
+        %187 = OpLoad %int %top
+        %188 = OpIAdd %int %187 %int_1
+               OpStore %top %188
+        %189 = OpLoad %int %p
+        %190 = OpIAdd %int %189 %int_1
+        %191 = OpAccessChain %_ptr_Function_int %stack %188
+               OpStore %191 %190
+        %192 = OpLoad %int %top
+        %193 = OpIAdd %int %192 %int_1
+               OpStore %top %193
+        %194 = OpLoad %int %h_0
+        %195 = OpAccessChain %_ptr_Function_int %stack %193
+               OpStore %195 %194
+               OpBranch %185
+        %185 = OpLabel
+               OpBranch %150
+        %150 = OpLabel
+               OpBranch %148
+        %149 = OpLabel
+               OpReturn
+               OpFunctionEnd
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
new file mode 100644
index 0000000..2e1f778
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/arr-value-set-to-arr-value-squared/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,154 @@
+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;
+  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;
+  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;
+  {
+    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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/arr-value-set-to-arr-value-squared/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/arr-value-set-to-arr-value-squared/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..3bf51a5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/arr-value-set-to-arr-value-squared/0-opt.spvasm.expected.msl
@@ -0,0 +1,198 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct QuicksortObject {
+  tint_array_wrapper numbers;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void swap_i1_i1_(thread int* const i, thread int* const j, thread QuicksortObject* const tint_symbol_4) {
+  int temp = 0;
+  int const x_92 = *(i);
+  int const x_94 = (*(tint_symbol_4)).numbers.arr[x_92];
+  temp = x_94;
+  int const x_95 = *(i);
+  int const x_96 = *(j);
+  int const x_98 = (*(tint_symbol_4)).numbers.arr[x_96];
+  (*(tint_symbol_4)).numbers.arr[x_95] = x_98;
+  int const x_100 = *(j);
+  int const x_101 = temp;
+  (*(tint_symbol_4)).numbers.arr[x_100] = x_101;
+  return;
+}
+
+int performPartition_i1_i1_(thread int* const l, thread int* const h, thread QuicksortObject* const tint_symbol_5) {
+  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;
+  int const x_104 = *(h);
+  int const x_106 = (*(tint_symbol_5)).numbers.arr[x_104];
+  pivot = x_106;
+  int const x_107 = *(l);
+  i_1 = (x_107 - 1);
+  int const x_109 = *(l);
+  j_1 = x_109;
+  while (true) {
+    int const x_114 = j_1;
+    int const x_115 = *(h);
+    if ((x_114 <= (x_115 - 1))) {
+    } else {
+      break;
+    }
+    int const x_119 = j_1;
+    int const x_121 = (*(tint_symbol_5)).numbers.arr[x_119];
+    int const x_122 = pivot;
+    if ((x_121 <= x_122)) {
+      int const x_126 = i_1;
+      i_1 = (x_126 + 1);
+      int const x_128 = i_1;
+      param = x_128;
+      int const x_129 = j_1;
+      param_1 = x_129;
+      swap_i1_i1_(&(param), &(param_1), tint_symbol_5);
+    }
+    {
+      int const x_131 = j_1;
+      j_1 = (x_131 + 1);
+    }
+  }
+  int const x_133 = i_1;
+  param_2 = (x_133 + 1);
+  int const x_135 = *(h);
+  param_3 = x_135;
+  swap_i1_i1_(&(param_2), &(param_3), tint_symbol_5);
+  int const x_137 = i_1;
+  return (x_137 + 1);
+}
+
+void quicksort_(thread QuicksortObject* const tint_symbol_6) {
+  int l_1 = 0;
+  int h_1 = 0;
+  int top = 0;
+  tint_array_wrapper stack = {};
+  int p = 0;
+  int param_4 = 0;
+  int param_5 = 0;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  int const x_140 = top;
+  int const x_141 = (x_140 + 1);
+  top = x_141;
+  int const x_142 = l_1;
+  stack.arr[x_141] = x_142;
+  int const x_144 = top;
+  int const x_145 = (x_144 + 1);
+  top = x_145;
+  int const x_146 = h_1;
+  stack.arr[x_145] = x_146;
+  while (true) {
+    int const x_152 = top;
+    if ((x_152 >= 0)) {
+    } else {
+      break;
+    }
+    int const x_155 = top;
+    top = (x_155 - 1);
+    int const x_158 = stack.arr[x_155];
+    h_1 = x_158;
+    int const x_159 = top;
+    top = (x_159 - 1);
+    int const x_162 = stack.arr[x_159];
+    l_1 = x_162;
+    int const x_163 = l_1;
+    param_4 = x_163;
+    int const x_164 = h_1;
+    param_5 = x_164;
+    int const x_165 = performPartition_i1_i1_(&(param_4), &(param_5), tint_symbol_6);
+    p = x_165;
+    int const x_166 = p;
+    int const x_168 = l_1;
+    if (((x_166 - 1) > x_168)) {
+      int const x_172 = top;
+      int const x_173 = (x_172 + 1);
+      top = x_173;
+      int const x_174 = l_1;
+      stack.arr[x_173] = x_174;
+      int const x_176 = top;
+      int const x_177 = (x_176 + 1);
+      top = x_177;
+      int const x_178 = p;
+      stack.arr[x_177] = (x_178 - 1);
+    }
+    int const x_181 = p;
+    int const x_183 = h_1;
+    if (((x_181 + 1) < x_183)) {
+      int const x_187 = top;
+      int const x_188 = (x_187 + 1);
+      top = x_188;
+      int const x_189 = p;
+      stack.arr[x_188] = (x_189 + 1);
+      int const x_192 = top;
+      int const x_193 = (x_192 + 1);
+      top = x_193;
+      int const x_194 = h_1;
+      stack.arr[x_193] = x_194;
+    }
+  }
+  return;
+}
+
+void main_1(thread QuicksortObject* const tint_symbol_7, thread float4* const tint_symbol_8) {
+  int i_2 = 0;
+  i_2 = 0;
+  while (true) {
+    int const x_64 = i_2;
+    if ((x_64 < 10)) {
+    } else {
+      break;
+    }
+    int const x_67 = i_2;
+    int const x_68 = i_2;
+    (*(tint_symbol_7)).numbers.arr[x_67] = (10 - x_68);
+    int const x_71 = i_2;
+    int const x_72 = i_2;
+    int const x_74 = (*(tint_symbol_7)).numbers.arr[x_72];
+    int const x_75 = i_2;
+    int const x_77 = (*(tint_symbol_7)).numbers.arr[x_75];
+    (*(tint_symbol_7)).numbers.arr[x_71] = (x_74 * x_77);
+    {
+      int const x_80 = i_2;
+      i_2 = (x_80 + 1);
+    }
+  }
+  quicksort_(tint_symbol_7);
+  int const x_84 = (*(tint_symbol_7)).numbers.arr[0];
+  int const x_86 = (*(tint_symbol_7)).numbers.arr[4];
+  if ((x_84 < x_86)) {
+    *(tint_symbol_8) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_8) = float4(0.0f, 1.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread QuicksortObject tint_symbol_9 = {};
+  thread float4 tint_symbol_10 = 0.0f;
+  main_1(&(tint_symbol_9), &(tint_symbol_10));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_10};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/arr-value-set-to-arr-value-squared/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/arr-value-set-to-arr-value-squared/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..7a0c9e6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/arr-value-set-to-arr-value-squared/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,367 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 235
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %QuicksortObject "QuicksortObject"
+               OpMemberName %QuicksortObject 0 "numbers"
+               OpName %obj "obj"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_30 "x_30"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %swap_i1_i1_ "swap_i1_i1_"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %temp "temp"
+               OpName %performPartition_i1_i1_ "performPartition_i1_i1_"
+               OpName %l "l"
+               OpName %h "h"
+               OpName %pivot "pivot"
+               OpName %i_1 "i_1"
+               OpName %j_1 "j_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %quicksort_ "quicksort_"
+               OpName %l_1 "l_1"
+               OpName %h_1 "h_1"
+               OpName %top "top"
+               OpName %stack "stack"
+               OpName %p "p"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpName %main_1 "main_1"
+               OpName %i_2 "i_2"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpMemberDecorate %QuicksortObject 0 Offset 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_30 NonWritable
+               OpDecorate %x_30 DescriptorSet 0
+               OpDecorate %x_30 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%QuicksortObject = OpTypeStruct %_arr_int_uint_10
+%_ptr_Private_QuicksortObject = OpTypePointer Private %QuicksortObject
+          %8 = OpConstantNull %QuicksortObject
+        %obj = OpVariable %_ptr_Private_QuicksortObject Private %8
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %13 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %13
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_30 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %13
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+         %20 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+         %28 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_int = OpTypePointer Private %int
+         %46 = OpTypeFunction %int %_ptr_Function_int %_ptr_Function_int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+        %106 = OpTypeFunction %void
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+        %114 = OpConstantNull %_arr_int_uint_10
+      %int_0 = OpConstant %int 0
+      %int_9 = OpConstant %int 9
+     %int_n1 = OpConstant %int -1
+     %int_10 = OpConstant %int 10
+      %int_4 = OpConstant %int 4
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+        %221 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %222 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %223 = OpTypeFunction %void %main_out
+%swap_i1_i1_ = OpFunction %void None %20
+          %i = OpFunctionParameter %_ptr_Function_int
+          %j = OpFunctionParameter %_ptr_Function_int
+         %26 = OpLabel
+       %temp = OpVariable %_ptr_Function_int Function %28
+         %30 = OpLoad %int %i
+         %33 = OpAccessChain %_ptr_Private_int %obj %uint_0 %30
+         %34 = OpLoad %int %33
+               OpStore %temp %34
+         %36 = OpLoad %int %i
+         %38 = OpLoad %int %j
+         %39 = OpAccessChain %_ptr_Private_int %obj %uint_0 %38
+         %40 = OpLoad %int %39
+         %41 = OpAccessChain %_ptr_Private_int %obj %uint_0 %36
+               OpStore %41 %40
+         %43 = OpLoad %int %j
+         %44 = OpLoad %int %temp
+         %45 = OpAccessChain %_ptr_Private_int %obj %uint_0 %43
+               OpStore %45 %44
+               OpReturn
+               OpFunctionEnd
+%performPartition_i1_i1_ = OpFunction %int None %46
+          %l = OpFunctionParameter %_ptr_Function_int
+          %h = OpFunctionParameter %_ptr_Function_int
+         %50 = OpLabel
+      %pivot = OpVariable %_ptr_Function_int Function %28
+        %i_1 = OpVariable %_ptr_Function_int Function %28
+        %j_1 = OpVariable %_ptr_Function_int Function %28
+      %param = OpVariable %_ptr_Function_int Function %28
+    %param_1 = OpVariable %_ptr_Function_int Function %28
+    %param_2 = OpVariable %_ptr_Function_int Function %28
+    %param_3 = OpVariable %_ptr_Function_int Function %28
+         %59 = OpLoad %int %h
+         %60 = OpAccessChain %_ptr_Private_int %obj %uint_0 %59
+         %61 = OpLoad %int %60
+               OpStore %pivot %61
+         %63 = OpLoad %int %l
+         %65 = OpISub %int %63 %int_1
+               OpStore %i_1 %65
+         %67 = OpLoad %int %l
+               OpStore %j_1 %67
+               OpBranch %68
+         %68 = OpLabel
+               OpLoopMerge %69 %70 None
+               OpBranch %71
+         %71 = OpLabel
+         %72 = OpLoad %int %j_1
+         %74 = OpLoad %int %h
+         %75 = OpISub %int %74 %int_1
+         %76 = OpSLessThanEqual %bool %72 %75
+               OpSelectionMerge %78 None
+               OpBranchConditional %76 %79 %80
+         %79 = OpLabel
+               OpBranch %78
+         %80 = OpLabel
+               OpBranch %69
+         %78 = OpLabel
+         %81 = OpLoad %int %j_1
+         %82 = OpAccessChain %_ptr_Private_int %obj %uint_0 %81
+         %83 = OpLoad %int %82
+         %84 = OpLoad %int %pivot
+         %85 = OpSLessThanEqual %bool %83 %84
+               OpSelectionMerge %86 None
+               OpBranchConditional %85 %87 %86
+         %87 = OpLabel
+         %88 = OpLoad %int %i_1
+         %89 = OpIAdd %int %88 %int_1
+               OpStore %i_1 %89
+         %90 = OpLoad %int %i_1
+               OpStore %param %90
+         %91 = OpLoad %int %j_1
+               OpStore %param_1 %91
+         %92 = OpFunctionCall %void %swap_i1_i1_ %param %param_1
+               OpBranch %86
+         %86 = OpLabel
+               OpBranch %70
+         %70 = OpLabel
+         %95 = OpLoad %int %j_1
+         %96 = OpIAdd %int %95 %int_1
+               OpStore %j_1 %96
+               OpBranch %68
+         %69 = OpLabel
+         %97 = OpLoad %int %i_1
+         %98 = OpIAdd %int %97 %int_1
+               OpStore %param_2 %98
+        %100 = OpLoad %int %h
+               OpStore %param_3 %100
+        %101 = OpFunctionCall %void %swap_i1_i1_ %param_2 %param_3
+        %104 = OpLoad %int %i_1
+        %105 = OpIAdd %int %104 %int_1
+               OpReturnValue %105
+               OpFunctionEnd
+ %quicksort_ = OpFunction %void None %106
+        %108 = OpLabel
+        %l_1 = OpVariable %_ptr_Function_int Function %28
+        %h_1 = OpVariable %_ptr_Function_int Function %28
+        %top = OpVariable %_ptr_Function_int Function %28
+      %stack = OpVariable %_ptr_Function__arr_int_uint_10 Function %114
+          %p = OpVariable %_ptr_Function_int Function %28
+    %param_4 = OpVariable %_ptr_Function_int Function %28
+    %param_5 = OpVariable %_ptr_Function_int Function %28
+               OpStore %l_1 %int_0
+               OpStore %h_1 %int_9
+               OpStore %top %int_n1
+        %121 = OpLoad %int %top
+        %122 = OpIAdd %int %121 %int_1
+               OpStore %top %122
+        %123 = OpLoad %int %l_1
+        %124 = OpAccessChain %_ptr_Function_int %stack %122
+               OpStore %124 %123
+        %125 = OpLoad %int %top
+        %126 = OpIAdd %int %125 %int_1
+               OpStore %top %126
+        %127 = OpLoad %int %h_1
+        %128 = OpAccessChain %_ptr_Function_int %stack %126
+               OpStore %128 %127
+               OpBranch %129
+        %129 = OpLabel
+               OpLoopMerge %130 %131 None
+               OpBranch %132
+        %132 = OpLabel
+        %133 = OpLoad %int %top
+        %134 = OpSGreaterThanEqual %bool %133 %int_0
+               OpSelectionMerge %135 None
+               OpBranchConditional %134 %136 %137
+        %136 = OpLabel
+               OpBranch %135
+        %137 = OpLabel
+               OpBranch %130
+        %135 = OpLabel
+        %138 = OpLoad %int %top
+        %139 = OpISub %int %138 %int_1
+               OpStore %top %139
+        %140 = OpAccessChain %_ptr_Function_int %stack %138
+        %141 = OpLoad %int %140
+               OpStore %h_1 %141
+        %142 = OpLoad %int %top
+        %143 = OpISub %int %142 %int_1
+               OpStore %top %143
+        %144 = OpAccessChain %_ptr_Function_int %stack %142
+        %145 = OpLoad %int %144
+               OpStore %l_1 %145
+        %146 = OpLoad %int %l_1
+               OpStore %param_4 %146
+        %147 = OpLoad %int %h_1
+               OpStore %param_5 %147
+        %148 = OpFunctionCall %int %performPartition_i1_i1_ %param_4 %param_5
+               OpStore %p %148
+        %151 = OpLoad %int %p
+        %152 = OpLoad %int %l_1
+        %153 = OpISub %int %151 %int_1
+        %154 = OpSGreaterThan %bool %153 %152
+               OpSelectionMerge %155 None
+               OpBranchConditional %154 %156 %155
+        %156 = OpLabel
+        %157 = OpLoad %int %top
+        %158 = OpIAdd %int %157 %int_1
+               OpStore %top %158
+        %159 = OpLoad %int %l_1
+        %160 = OpAccessChain %_ptr_Function_int %stack %158
+               OpStore %160 %159
+        %161 = OpLoad %int %top
+        %162 = OpIAdd %int %161 %int_1
+               OpStore %top %162
+        %163 = OpLoad %int %p
+        %164 = OpAccessChain %_ptr_Function_int %stack %162
+        %165 = OpISub %int %163 %int_1
+               OpStore %164 %165
+               OpBranch %155
+        %155 = OpLabel
+        %166 = OpLoad %int %p
+        %167 = OpLoad %int %h_1
+        %168 = OpIAdd %int %166 %int_1
+        %169 = OpSLessThan %bool %168 %167
+               OpSelectionMerge %170 None
+               OpBranchConditional %169 %171 %170
+        %171 = OpLabel
+        %172 = OpLoad %int %top
+        %173 = OpIAdd %int %172 %int_1
+               OpStore %top %173
+        %174 = OpLoad %int %p
+        %175 = OpAccessChain %_ptr_Function_int %stack %173
+        %176 = OpIAdd %int %174 %int_1
+               OpStore %175 %176
+        %177 = OpLoad %int %top
+        %178 = OpIAdd %int %177 %int_1
+               OpStore %top %178
+        %179 = OpLoad %int %h_1
+        %180 = OpAccessChain %_ptr_Function_int %stack %178
+               OpStore %180 %179
+               OpBranch %170
+        %170 = OpLabel
+               OpBranch %131
+        %131 = OpLabel
+               OpBranch %129
+        %130 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %106
+        %182 = OpLabel
+        %i_2 = OpVariable %_ptr_Function_int Function %28
+               OpStore %i_2 %int_0
+               OpBranch %184
+        %184 = OpLabel
+               OpLoopMerge %185 %186 None
+               OpBranch %187
+        %187 = OpLabel
+        %188 = OpLoad %int %i_2
+        %190 = OpSLessThan %bool %188 %int_10
+               OpSelectionMerge %191 None
+               OpBranchConditional %190 %192 %193
+        %192 = OpLabel
+               OpBranch %191
+        %193 = OpLabel
+               OpBranch %185
+        %191 = OpLabel
+        %194 = OpLoad %int %i_2
+        %195 = OpLoad %int %i_2
+        %196 = OpAccessChain %_ptr_Private_int %obj %uint_0 %194
+        %197 = OpISub %int %int_10 %195
+               OpStore %196 %197
+        %198 = OpLoad %int %i_2
+        %199 = OpLoad %int %i_2
+        %200 = OpAccessChain %_ptr_Private_int %obj %uint_0 %199
+        %201 = OpLoad %int %200
+        %202 = OpLoad %int %i_2
+        %203 = OpAccessChain %_ptr_Private_int %obj %uint_0 %202
+        %204 = OpLoad %int %203
+        %205 = OpAccessChain %_ptr_Private_int %obj %uint_0 %198
+        %206 = OpIMul %int %201 %204
+               OpStore %205 %206
+               OpBranch %186
+        %186 = OpLabel
+        %207 = OpLoad %int %i_2
+        %208 = OpIAdd %int %207 %int_1
+               OpStore %i_2 %208
+               OpBranch %184
+        %185 = OpLabel
+        %209 = OpFunctionCall %void %quicksort_
+        %210 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_0
+        %211 = OpLoad %int %210
+        %213 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_4
+        %214 = OpLoad %int %213
+        %215 = OpSLessThan %bool %211 %214
+               OpSelectionMerge %216 None
+               OpBranchConditional %215 %217 %218
+        %217 = OpLabel
+               OpStore %x_GLF_color %221
+               OpBranch %216
+        %218 = OpLabel
+               OpStore %x_GLF_color %222
+               OpBranch %216
+        %216 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %223
+%tint_symbol = OpFunctionParameter %main_out
+        %227 = OpLabel
+        %228 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %228
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %106
+        %230 = OpLabel
+        %231 = OpFunctionCall %void %main_1
+        %233 = OpLoad %v4float %x_GLF_color
+        %234 = OpCompositeConstruct %main_out %233
+        %232 = OpFunctionCall %void %tint_symbol_2 %234
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/arr-value-set-to-arr-value-squared/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/arr-value-set-to-arr-value-squared/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..03cd2ba
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/arr-value-set-to-arr-value-squared/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,197 @@
+struct QuicksortObject {
+  numbers : array<i32, 10>;
+};
+
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> obj : QuicksortObject;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_30 : buf0;
+
+fn swap_i1_i1_(i : ptr<function, i32>, j : ptr<function, i32>) {
+  var temp : i32;
+  let x_92 : i32 = *(i);
+  let x_94 : i32 = obj.numbers[x_92];
+  temp = x_94;
+  let x_95 : i32 = *(i);
+  let x_96 : i32 = *(j);
+  let x_98 : i32 = obj.numbers[x_96];
+  obj.numbers[x_95] = x_98;
+  let x_100 : i32 = *(j);
+  let x_101 : i32 = temp;
+  obj.numbers[x_100] = x_101;
+  return;
+}
+
+fn performPartition_i1_i1_(l : ptr<function, i32>, h : ptr<function, i32>) -> i32 {
+  var pivot : i32;
+  var i_1 : i32;
+  var j_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  var param_3 : i32;
+  let x_104 : i32 = *(h);
+  let x_106 : i32 = obj.numbers[x_104];
+  pivot = x_106;
+  let x_107 : i32 = *(l);
+  i_1 = (x_107 - 1);
+  let x_109 : i32 = *(l);
+  j_1 = x_109;
+  loop {
+    let x_114 : i32 = j_1;
+    let x_115 : i32 = *(h);
+    if ((x_114 <= (x_115 - 1))) {
+    } else {
+      break;
+    }
+    let x_119 : i32 = j_1;
+    let x_121 : i32 = obj.numbers[x_119];
+    let x_122 : i32 = pivot;
+    if ((x_121 <= x_122)) {
+      let x_126 : i32 = i_1;
+      i_1 = (x_126 + 1);
+      let x_128 : i32 = i_1;
+      param = x_128;
+      let x_129 : i32 = j_1;
+      param_1 = x_129;
+      swap_i1_i1_(&(param), &(param_1));
+    }
+
+    continuing {
+      let x_131 : i32 = j_1;
+      j_1 = (x_131 + 1);
+    }
+  }
+  let x_133 : i32 = i_1;
+  param_2 = (x_133 + 1);
+  let x_135 : i32 = *(h);
+  param_3 = x_135;
+  swap_i1_i1_(&(param_2), &(param_3));
+  let x_137 : i32 = i_1;
+  return (x_137 + 1);
+}
+
+fn quicksort_() {
+  var l_1 : i32;
+  var h_1 : i32;
+  var top : i32;
+  var stack : array<i32, 10>;
+  var p : i32;
+  var param_4 : i32;
+  var param_5 : i32;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  let x_140 : i32 = top;
+  let x_141 : i32 = (x_140 + 1);
+  top = x_141;
+  let x_142 : i32 = l_1;
+  stack[x_141] = x_142;
+  let x_144 : i32 = top;
+  let x_145 : i32 = (x_144 + 1);
+  top = x_145;
+  let x_146 : i32 = h_1;
+  stack[x_145] = x_146;
+  loop {
+    let x_152 : i32 = top;
+    if ((x_152 >= 0)) {
+    } else {
+      break;
+    }
+    let x_155 : i32 = top;
+    top = (x_155 - 1);
+    let x_158 : i32 = stack[x_155];
+    h_1 = x_158;
+    let x_159 : i32 = top;
+    top = (x_159 - 1);
+    let x_162 : i32 = stack[x_159];
+    l_1 = x_162;
+    let x_163 : i32 = l_1;
+    param_4 = x_163;
+    let x_164 : i32 = h_1;
+    param_5 = x_164;
+    let x_165 : i32 = performPartition_i1_i1_(&(param_4), &(param_5));
+    p = x_165;
+    let x_166 : i32 = p;
+    let x_168 : i32 = l_1;
+    if (((x_166 - 1) > x_168)) {
+      let x_172 : i32 = top;
+      let x_173 : i32 = (x_172 + 1);
+      top = x_173;
+      let x_174 : i32 = l_1;
+      stack[x_173] = x_174;
+      let x_176 : i32 = top;
+      let x_177 : i32 = (x_176 + 1);
+      top = x_177;
+      let x_178 : i32 = p;
+      stack[x_177] = (x_178 - 1);
+    }
+    let x_181 : i32 = p;
+    let x_183 : i32 = h_1;
+    if (((x_181 + 1) < x_183)) {
+      let x_187 : i32 = top;
+      let x_188 : i32 = (x_187 + 1);
+      top = x_188;
+      let x_189 : i32 = p;
+      stack[x_188] = (x_189 + 1);
+      let x_192 : i32 = top;
+      let x_193 : i32 = (x_192 + 1);
+      top = x_193;
+      let x_194 : i32 = h_1;
+      stack[x_193] = x_194;
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_2 : i32;
+  i_2 = 0;
+  loop {
+    let x_64 : i32 = i_2;
+    if ((x_64 < 10)) {
+    } else {
+      break;
+    }
+    let x_67 : i32 = i_2;
+    let x_68 : i32 = i_2;
+    obj.numbers[x_67] = (10 - x_68);
+    let x_71 : i32 = i_2;
+    let x_72 : i32 = i_2;
+    let x_74 : i32 = obj.numbers[x_72];
+    let x_75 : i32 = i_2;
+    let x_77 : i32 = obj.numbers[x_75];
+    obj.numbers[x_71] = (x_74 * x_77);
+
+    continuing {
+      let x_80 : i32 = i_2;
+      i_2 = (x_80 + 1);
+    }
+  }
+  quicksort_();
+  let x_84 : i32 = obj.numbers[0];
+  let x_86 : i32 = obj.numbers[4];
+  if ((x_84 < x_86)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 1.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/arr-value-set-to-arr-value-squared/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/arr-value-set-to-arr-value-squared/0-opt.wgsl
new file mode 100644
index 0000000..03cd2ba
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/arr-value-set-to-arr-value-squared/0-opt.wgsl
@@ -0,0 +1,197 @@
+struct QuicksortObject {
+  numbers : array<i32, 10>;
+};
+
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> obj : QuicksortObject;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_30 : buf0;
+
+fn swap_i1_i1_(i : ptr<function, i32>, j : ptr<function, i32>) {
+  var temp : i32;
+  let x_92 : i32 = *(i);
+  let x_94 : i32 = obj.numbers[x_92];
+  temp = x_94;
+  let x_95 : i32 = *(i);
+  let x_96 : i32 = *(j);
+  let x_98 : i32 = obj.numbers[x_96];
+  obj.numbers[x_95] = x_98;
+  let x_100 : i32 = *(j);
+  let x_101 : i32 = temp;
+  obj.numbers[x_100] = x_101;
+  return;
+}
+
+fn performPartition_i1_i1_(l : ptr<function, i32>, h : ptr<function, i32>) -> i32 {
+  var pivot : i32;
+  var i_1 : i32;
+  var j_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  var param_3 : i32;
+  let x_104 : i32 = *(h);
+  let x_106 : i32 = obj.numbers[x_104];
+  pivot = x_106;
+  let x_107 : i32 = *(l);
+  i_1 = (x_107 - 1);
+  let x_109 : i32 = *(l);
+  j_1 = x_109;
+  loop {
+    let x_114 : i32 = j_1;
+    let x_115 : i32 = *(h);
+    if ((x_114 <= (x_115 - 1))) {
+    } else {
+      break;
+    }
+    let x_119 : i32 = j_1;
+    let x_121 : i32 = obj.numbers[x_119];
+    let x_122 : i32 = pivot;
+    if ((x_121 <= x_122)) {
+      let x_126 : i32 = i_1;
+      i_1 = (x_126 + 1);
+      let x_128 : i32 = i_1;
+      param = x_128;
+      let x_129 : i32 = j_1;
+      param_1 = x_129;
+      swap_i1_i1_(&(param), &(param_1));
+    }
+
+    continuing {
+      let x_131 : i32 = j_1;
+      j_1 = (x_131 + 1);
+    }
+  }
+  let x_133 : i32 = i_1;
+  param_2 = (x_133 + 1);
+  let x_135 : i32 = *(h);
+  param_3 = x_135;
+  swap_i1_i1_(&(param_2), &(param_3));
+  let x_137 : i32 = i_1;
+  return (x_137 + 1);
+}
+
+fn quicksort_() {
+  var l_1 : i32;
+  var h_1 : i32;
+  var top : i32;
+  var stack : array<i32, 10>;
+  var p : i32;
+  var param_4 : i32;
+  var param_5 : i32;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  let x_140 : i32 = top;
+  let x_141 : i32 = (x_140 + 1);
+  top = x_141;
+  let x_142 : i32 = l_1;
+  stack[x_141] = x_142;
+  let x_144 : i32 = top;
+  let x_145 : i32 = (x_144 + 1);
+  top = x_145;
+  let x_146 : i32 = h_1;
+  stack[x_145] = x_146;
+  loop {
+    let x_152 : i32 = top;
+    if ((x_152 >= 0)) {
+    } else {
+      break;
+    }
+    let x_155 : i32 = top;
+    top = (x_155 - 1);
+    let x_158 : i32 = stack[x_155];
+    h_1 = x_158;
+    let x_159 : i32 = top;
+    top = (x_159 - 1);
+    let x_162 : i32 = stack[x_159];
+    l_1 = x_162;
+    let x_163 : i32 = l_1;
+    param_4 = x_163;
+    let x_164 : i32 = h_1;
+    param_5 = x_164;
+    let x_165 : i32 = performPartition_i1_i1_(&(param_4), &(param_5));
+    p = x_165;
+    let x_166 : i32 = p;
+    let x_168 : i32 = l_1;
+    if (((x_166 - 1) > x_168)) {
+      let x_172 : i32 = top;
+      let x_173 : i32 = (x_172 + 1);
+      top = x_173;
+      let x_174 : i32 = l_1;
+      stack[x_173] = x_174;
+      let x_176 : i32 = top;
+      let x_177 : i32 = (x_176 + 1);
+      top = x_177;
+      let x_178 : i32 = p;
+      stack[x_177] = (x_178 - 1);
+    }
+    let x_181 : i32 = p;
+    let x_183 : i32 = h_1;
+    if (((x_181 + 1) < x_183)) {
+      let x_187 : i32 = top;
+      let x_188 : i32 = (x_187 + 1);
+      top = x_188;
+      let x_189 : i32 = p;
+      stack[x_188] = (x_189 + 1);
+      let x_192 : i32 = top;
+      let x_193 : i32 = (x_192 + 1);
+      top = x_193;
+      let x_194 : i32 = h_1;
+      stack[x_193] = x_194;
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_2 : i32;
+  i_2 = 0;
+  loop {
+    let x_64 : i32 = i_2;
+    if ((x_64 < 10)) {
+    } else {
+      break;
+    }
+    let x_67 : i32 = i_2;
+    let x_68 : i32 = i_2;
+    obj.numbers[x_67] = (10 - x_68);
+    let x_71 : i32 = i_2;
+    let x_72 : i32 = i_2;
+    let x_74 : i32 = obj.numbers[x_72];
+    let x_75 : i32 = i_2;
+    let x_77 : i32 = obj.numbers[x_75];
+    obj.numbers[x_71] = (x_74 * x_77);
+
+    continuing {
+      let x_80 : i32 = i_2;
+      i_2 = (x_80 + 1);
+    }
+  }
+  quicksort_();
+  let x_84 : i32 = obj.numbers[0];
+  let x_86 : i32 = obj.numbers[4];
+  if ((x_84 < x_86)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 1.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
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
new file mode 100644
index 0000000..2e1f778
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/arr-value-set-to-arr-value-squared/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,154 @@
+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;
+  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;
+  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;
+  {
+    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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/arr-value-set-to-arr-value-squared/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/arr-value-set-to-arr-value-squared/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..3bf51a5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/arr-value-set-to-arr-value-squared/0-opt.wgsl.expected.msl
@@ -0,0 +1,198 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct QuicksortObject {
+  tint_array_wrapper numbers;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void swap_i1_i1_(thread int* const i, thread int* const j, thread QuicksortObject* const tint_symbol_4) {
+  int temp = 0;
+  int const x_92 = *(i);
+  int const x_94 = (*(tint_symbol_4)).numbers.arr[x_92];
+  temp = x_94;
+  int const x_95 = *(i);
+  int const x_96 = *(j);
+  int const x_98 = (*(tint_symbol_4)).numbers.arr[x_96];
+  (*(tint_symbol_4)).numbers.arr[x_95] = x_98;
+  int const x_100 = *(j);
+  int const x_101 = temp;
+  (*(tint_symbol_4)).numbers.arr[x_100] = x_101;
+  return;
+}
+
+int performPartition_i1_i1_(thread int* const l, thread int* const h, thread QuicksortObject* const tint_symbol_5) {
+  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;
+  int const x_104 = *(h);
+  int const x_106 = (*(tint_symbol_5)).numbers.arr[x_104];
+  pivot = x_106;
+  int const x_107 = *(l);
+  i_1 = (x_107 - 1);
+  int const x_109 = *(l);
+  j_1 = x_109;
+  while (true) {
+    int const x_114 = j_1;
+    int const x_115 = *(h);
+    if ((x_114 <= (x_115 - 1))) {
+    } else {
+      break;
+    }
+    int const x_119 = j_1;
+    int const x_121 = (*(tint_symbol_5)).numbers.arr[x_119];
+    int const x_122 = pivot;
+    if ((x_121 <= x_122)) {
+      int const x_126 = i_1;
+      i_1 = (x_126 + 1);
+      int const x_128 = i_1;
+      param = x_128;
+      int const x_129 = j_1;
+      param_1 = x_129;
+      swap_i1_i1_(&(param), &(param_1), tint_symbol_5);
+    }
+    {
+      int const x_131 = j_1;
+      j_1 = (x_131 + 1);
+    }
+  }
+  int const x_133 = i_1;
+  param_2 = (x_133 + 1);
+  int const x_135 = *(h);
+  param_3 = x_135;
+  swap_i1_i1_(&(param_2), &(param_3), tint_symbol_5);
+  int const x_137 = i_1;
+  return (x_137 + 1);
+}
+
+void quicksort_(thread QuicksortObject* const tint_symbol_6) {
+  int l_1 = 0;
+  int h_1 = 0;
+  int top = 0;
+  tint_array_wrapper stack = {};
+  int p = 0;
+  int param_4 = 0;
+  int param_5 = 0;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  int const x_140 = top;
+  int const x_141 = (x_140 + 1);
+  top = x_141;
+  int const x_142 = l_1;
+  stack.arr[x_141] = x_142;
+  int const x_144 = top;
+  int const x_145 = (x_144 + 1);
+  top = x_145;
+  int const x_146 = h_1;
+  stack.arr[x_145] = x_146;
+  while (true) {
+    int const x_152 = top;
+    if ((x_152 >= 0)) {
+    } else {
+      break;
+    }
+    int const x_155 = top;
+    top = (x_155 - 1);
+    int const x_158 = stack.arr[x_155];
+    h_1 = x_158;
+    int const x_159 = top;
+    top = (x_159 - 1);
+    int const x_162 = stack.arr[x_159];
+    l_1 = x_162;
+    int const x_163 = l_1;
+    param_4 = x_163;
+    int const x_164 = h_1;
+    param_5 = x_164;
+    int const x_165 = performPartition_i1_i1_(&(param_4), &(param_5), tint_symbol_6);
+    p = x_165;
+    int const x_166 = p;
+    int const x_168 = l_1;
+    if (((x_166 - 1) > x_168)) {
+      int const x_172 = top;
+      int const x_173 = (x_172 + 1);
+      top = x_173;
+      int const x_174 = l_1;
+      stack.arr[x_173] = x_174;
+      int const x_176 = top;
+      int const x_177 = (x_176 + 1);
+      top = x_177;
+      int const x_178 = p;
+      stack.arr[x_177] = (x_178 - 1);
+    }
+    int const x_181 = p;
+    int const x_183 = h_1;
+    if (((x_181 + 1) < x_183)) {
+      int const x_187 = top;
+      int const x_188 = (x_187 + 1);
+      top = x_188;
+      int const x_189 = p;
+      stack.arr[x_188] = (x_189 + 1);
+      int const x_192 = top;
+      int const x_193 = (x_192 + 1);
+      top = x_193;
+      int const x_194 = h_1;
+      stack.arr[x_193] = x_194;
+    }
+  }
+  return;
+}
+
+void main_1(thread QuicksortObject* const tint_symbol_7, thread float4* const tint_symbol_8) {
+  int i_2 = 0;
+  i_2 = 0;
+  while (true) {
+    int const x_64 = i_2;
+    if ((x_64 < 10)) {
+    } else {
+      break;
+    }
+    int const x_67 = i_2;
+    int const x_68 = i_2;
+    (*(tint_symbol_7)).numbers.arr[x_67] = (10 - x_68);
+    int const x_71 = i_2;
+    int const x_72 = i_2;
+    int const x_74 = (*(tint_symbol_7)).numbers.arr[x_72];
+    int const x_75 = i_2;
+    int const x_77 = (*(tint_symbol_7)).numbers.arr[x_75];
+    (*(tint_symbol_7)).numbers.arr[x_71] = (x_74 * x_77);
+    {
+      int const x_80 = i_2;
+      i_2 = (x_80 + 1);
+    }
+  }
+  quicksort_(tint_symbol_7);
+  int const x_84 = (*(tint_symbol_7)).numbers.arr[0];
+  int const x_86 = (*(tint_symbol_7)).numbers.arr[4];
+  if ((x_84 < x_86)) {
+    *(tint_symbol_8) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_8) = float4(0.0f, 1.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread QuicksortObject tint_symbol_9 = {};
+  thread float4 tint_symbol_10 = 0.0f;
+  main_1(&(tint_symbol_9), &(tint_symbol_10));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_10};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/arr-value-set-to-arr-value-squared/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/arr-value-set-to-arr-value-squared/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..7a0c9e6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/arr-value-set-to-arr-value-squared/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,367 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 235
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %QuicksortObject "QuicksortObject"
+               OpMemberName %QuicksortObject 0 "numbers"
+               OpName %obj "obj"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_30 "x_30"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %swap_i1_i1_ "swap_i1_i1_"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %temp "temp"
+               OpName %performPartition_i1_i1_ "performPartition_i1_i1_"
+               OpName %l "l"
+               OpName %h "h"
+               OpName %pivot "pivot"
+               OpName %i_1 "i_1"
+               OpName %j_1 "j_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %quicksort_ "quicksort_"
+               OpName %l_1 "l_1"
+               OpName %h_1 "h_1"
+               OpName %top "top"
+               OpName %stack "stack"
+               OpName %p "p"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpName %main_1 "main_1"
+               OpName %i_2 "i_2"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpMemberDecorate %QuicksortObject 0 Offset 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_30 NonWritable
+               OpDecorate %x_30 DescriptorSet 0
+               OpDecorate %x_30 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%QuicksortObject = OpTypeStruct %_arr_int_uint_10
+%_ptr_Private_QuicksortObject = OpTypePointer Private %QuicksortObject
+          %8 = OpConstantNull %QuicksortObject
+        %obj = OpVariable %_ptr_Private_QuicksortObject Private %8
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %13 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %13
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_30 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %13
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+         %20 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+         %28 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_int = OpTypePointer Private %int
+         %46 = OpTypeFunction %int %_ptr_Function_int %_ptr_Function_int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+        %106 = OpTypeFunction %void
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+        %114 = OpConstantNull %_arr_int_uint_10
+      %int_0 = OpConstant %int 0
+      %int_9 = OpConstant %int 9
+     %int_n1 = OpConstant %int -1
+     %int_10 = OpConstant %int 10
+      %int_4 = OpConstant %int 4
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+        %221 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %222 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %223 = OpTypeFunction %void %main_out
+%swap_i1_i1_ = OpFunction %void None %20
+          %i = OpFunctionParameter %_ptr_Function_int
+          %j = OpFunctionParameter %_ptr_Function_int
+         %26 = OpLabel
+       %temp = OpVariable %_ptr_Function_int Function %28
+         %30 = OpLoad %int %i
+         %33 = OpAccessChain %_ptr_Private_int %obj %uint_0 %30
+         %34 = OpLoad %int %33
+               OpStore %temp %34
+         %36 = OpLoad %int %i
+         %38 = OpLoad %int %j
+         %39 = OpAccessChain %_ptr_Private_int %obj %uint_0 %38
+         %40 = OpLoad %int %39
+         %41 = OpAccessChain %_ptr_Private_int %obj %uint_0 %36
+               OpStore %41 %40
+         %43 = OpLoad %int %j
+         %44 = OpLoad %int %temp
+         %45 = OpAccessChain %_ptr_Private_int %obj %uint_0 %43
+               OpStore %45 %44
+               OpReturn
+               OpFunctionEnd
+%performPartition_i1_i1_ = OpFunction %int None %46
+          %l = OpFunctionParameter %_ptr_Function_int
+          %h = OpFunctionParameter %_ptr_Function_int
+         %50 = OpLabel
+      %pivot = OpVariable %_ptr_Function_int Function %28
+        %i_1 = OpVariable %_ptr_Function_int Function %28
+        %j_1 = OpVariable %_ptr_Function_int Function %28
+      %param = OpVariable %_ptr_Function_int Function %28
+    %param_1 = OpVariable %_ptr_Function_int Function %28
+    %param_2 = OpVariable %_ptr_Function_int Function %28
+    %param_3 = OpVariable %_ptr_Function_int Function %28
+         %59 = OpLoad %int %h
+         %60 = OpAccessChain %_ptr_Private_int %obj %uint_0 %59
+         %61 = OpLoad %int %60
+               OpStore %pivot %61
+         %63 = OpLoad %int %l
+         %65 = OpISub %int %63 %int_1
+               OpStore %i_1 %65
+         %67 = OpLoad %int %l
+               OpStore %j_1 %67
+               OpBranch %68
+         %68 = OpLabel
+               OpLoopMerge %69 %70 None
+               OpBranch %71
+         %71 = OpLabel
+         %72 = OpLoad %int %j_1
+         %74 = OpLoad %int %h
+         %75 = OpISub %int %74 %int_1
+         %76 = OpSLessThanEqual %bool %72 %75
+               OpSelectionMerge %78 None
+               OpBranchConditional %76 %79 %80
+         %79 = OpLabel
+               OpBranch %78
+         %80 = OpLabel
+               OpBranch %69
+         %78 = OpLabel
+         %81 = OpLoad %int %j_1
+         %82 = OpAccessChain %_ptr_Private_int %obj %uint_0 %81
+         %83 = OpLoad %int %82
+         %84 = OpLoad %int %pivot
+         %85 = OpSLessThanEqual %bool %83 %84
+               OpSelectionMerge %86 None
+               OpBranchConditional %85 %87 %86
+         %87 = OpLabel
+         %88 = OpLoad %int %i_1
+         %89 = OpIAdd %int %88 %int_1
+               OpStore %i_1 %89
+         %90 = OpLoad %int %i_1
+               OpStore %param %90
+         %91 = OpLoad %int %j_1
+               OpStore %param_1 %91
+         %92 = OpFunctionCall %void %swap_i1_i1_ %param %param_1
+               OpBranch %86
+         %86 = OpLabel
+               OpBranch %70
+         %70 = OpLabel
+         %95 = OpLoad %int %j_1
+         %96 = OpIAdd %int %95 %int_1
+               OpStore %j_1 %96
+               OpBranch %68
+         %69 = OpLabel
+         %97 = OpLoad %int %i_1
+         %98 = OpIAdd %int %97 %int_1
+               OpStore %param_2 %98
+        %100 = OpLoad %int %h
+               OpStore %param_3 %100
+        %101 = OpFunctionCall %void %swap_i1_i1_ %param_2 %param_3
+        %104 = OpLoad %int %i_1
+        %105 = OpIAdd %int %104 %int_1
+               OpReturnValue %105
+               OpFunctionEnd
+ %quicksort_ = OpFunction %void None %106
+        %108 = OpLabel
+        %l_1 = OpVariable %_ptr_Function_int Function %28
+        %h_1 = OpVariable %_ptr_Function_int Function %28
+        %top = OpVariable %_ptr_Function_int Function %28
+      %stack = OpVariable %_ptr_Function__arr_int_uint_10 Function %114
+          %p = OpVariable %_ptr_Function_int Function %28
+    %param_4 = OpVariable %_ptr_Function_int Function %28
+    %param_5 = OpVariable %_ptr_Function_int Function %28
+               OpStore %l_1 %int_0
+               OpStore %h_1 %int_9
+               OpStore %top %int_n1
+        %121 = OpLoad %int %top
+        %122 = OpIAdd %int %121 %int_1
+               OpStore %top %122
+        %123 = OpLoad %int %l_1
+        %124 = OpAccessChain %_ptr_Function_int %stack %122
+               OpStore %124 %123
+        %125 = OpLoad %int %top
+        %126 = OpIAdd %int %125 %int_1
+               OpStore %top %126
+        %127 = OpLoad %int %h_1
+        %128 = OpAccessChain %_ptr_Function_int %stack %126
+               OpStore %128 %127
+               OpBranch %129
+        %129 = OpLabel
+               OpLoopMerge %130 %131 None
+               OpBranch %132
+        %132 = OpLabel
+        %133 = OpLoad %int %top
+        %134 = OpSGreaterThanEqual %bool %133 %int_0
+               OpSelectionMerge %135 None
+               OpBranchConditional %134 %136 %137
+        %136 = OpLabel
+               OpBranch %135
+        %137 = OpLabel
+               OpBranch %130
+        %135 = OpLabel
+        %138 = OpLoad %int %top
+        %139 = OpISub %int %138 %int_1
+               OpStore %top %139
+        %140 = OpAccessChain %_ptr_Function_int %stack %138
+        %141 = OpLoad %int %140
+               OpStore %h_1 %141
+        %142 = OpLoad %int %top
+        %143 = OpISub %int %142 %int_1
+               OpStore %top %143
+        %144 = OpAccessChain %_ptr_Function_int %stack %142
+        %145 = OpLoad %int %144
+               OpStore %l_1 %145
+        %146 = OpLoad %int %l_1
+               OpStore %param_4 %146
+        %147 = OpLoad %int %h_1
+               OpStore %param_5 %147
+        %148 = OpFunctionCall %int %performPartition_i1_i1_ %param_4 %param_5
+               OpStore %p %148
+        %151 = OpLoad %int %p
+        %152 = OpLoad %int %l_1
+        %153 = OpISub %int %151 %int_1
+        %154 = OpSGreaterThan %bool %153 %152
+               OpSelectionMerge %155 None
+               OpBranchConditional %154 %156 %155
+        %156 = OpLabel
+        %157 = OpLoad %int %top
+        %158 = OpIAdd %int %157 %int_1
+               OpStore %top %158
+        %159 = OpLoad %int %l_1
+        %160 = OpAccessChain %_ptr_Function_int %stack %158
+               OpStore %160 %159
+        %161 = OpLoad %int %top
+        %162 = OpIAdd %int %161 %int_1
+               OpStore %top %162
+        %163 = OpLoad %int %p
+        %164 = OpAccessChain %_ptr_Function_int %stack %162
+        %165 = OpISub %int %163 %int_1
+               OpStore %164 %165
+               OpBranch %155
+        %155 = OpLabel
+        %166 = OpLoad %int %p
+        %167 = OpLoad %int %h_1
+        %168 = OpIAdd %int %166 %int_1
+        %169 = OpSLessThan %bool %168 %167
+               OpSelectionMerge %170 None
+               OpBranchConditional %169 %171 %170
+        %171 = OpLabel
+        %172 = OpLoad %int %top
+        %173 = OpIAdd %int %172 %int_1
+               OpStore %top %173
+        %174 = OpLoad %int %p
+        %175 = OpAccessChain %_ptr_Function_int %stack %173
+        %176 = OpIAdd %int %174 %int_1
+               OpStore %175 %176
+        %177 = OpLoad %int %top
+        %178 = OpIAdd %int %177 %int_1
+               OpStore %top %178
+        %179 = OpLoad %int %h_1
+        %180 = OpAccessChain %_ptr_Function_int %stack %178
+               OpStore %180 %179
+               OpBranch %170
+        %170 = OpLabel
+               OpBranch %131
+        %131 = OpLabel
+               OpBranch %129
+        %130 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %106
+        %182 = OpLabel
+        %i_2 = OpVariable %_ptr_Function_int Function %28
+               OpStore %i_2 %int_0
+               OpBranch %184
+        %184 = OpLabel
+               OpLoopMerge %185 %186 None
+               OpBranch %187
+        %187 = OpLabel
+        %188 = OpLoad %int %i_2
+        %190 = OpSLessThan %bool %188 %int_10
+               OpSelectionMerge %191 None
+               OpBranchConditional %190 %192 %193
+        %192 = OpLabel
+               OpBranch %191
+        %193 = OpLabel
+               OpBranch %185
+        %191 = OpLabel
+        %194 = OpLoad %int %i_2
+        %195 = OpLoad %int %i_2
+        %196 = OpAccessChain %_ptr_Private_int %obj %uint_0 %194
+        %197 = OpISub %int %int_10 %195
+               OpStore %196 %197
+        %198 = OpLoad %int %i_2
+        %199 = OpLoad %int %i_2
+        %200 = OpAccessChain %_ptr_Private_int %obj %uint_0 %199
+        %201 = OpLoad %int %200
+        %202 = OpLoad %int %i_2
+        %203 = OpAccessChain %_ptr_Private_int %obj %uint_0 %202
+        %204 = OpLoad %int %203
+        %205 = OpAccessChain %_ptr_Private_int %obj %uint_0 %198
+        %206 = OpIMul %int %201 %204
+               OpStore %205 %206
+               OpBranch %186
+        %186 = OpLabel
+        %207 = OpLoad %int %i_2
+        %208 = OpIAdd %int %207 %int_1
+               OpStore %i_2 %208
+               OpBranch %184
+        %185 = OpLabel
+        %209 = OpFunctionCall %void %quicksort_
+        %210 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_0
+        %211 = OpLoad %int %210
+        %213 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_4
+        %214 = OpLoad %int %213
+        %215 = OpSLessThan %bool %211 %214
+               OpSelectionMerge %216 None
+               OpBranchConditional %215 %217 %218
+        %217 = OpLabel
+               OpStore %x_GLF_color %221
+               OpBranch %216
+        %218 = OpLabel
+               OpStore %x_GLF_color %222
+               OpBranch %216
+        %216 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %223
+%tint_symbol = OpFunctionParameter %main_out
+        %227 = OpLabel
+        %228 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %228
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %106
+        %230 = OpLabel
+        %231 = OpFunctionCall %void %main_1
+        %233 = OpLoad %v4float %x_GLF_color
+        %234 = OpCompositeConstruct %main_out %233
+        %232 = OpFunctionCall %void %tint_symbol_2 %234
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/arr-value-set-to-arr-value-squared/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/arr-value-set-to-arr-value-squared/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..03cd2ba
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/arr-value-set-to-arr-value-squared/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,197 @@
+struct QuicksortObject {
+  numbers : array<i32, 10>;
+};
+
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> obj : QuicksortObject;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_30 : buf0;
+
+fn swap_i1_i1_(i : ptr<function, i32>, j : ptr<function, i32>) {
+  var temp : i32;
+  let x_92 : i32 = *(i);
+  let x_94 : i32 = obj.numbers[x_92];
+  temp = x_94;
+  let x_95 : i32 = *(i);
+  let x_96 : i32 = *(j);
+  let x_98 : i32 = obj.numbers[x_96];
+  obj.numbers[x_95] = x_98;
+  let x_100 : i32 = *(j);
+  let x_101 : i32 = temp;
+  obj.numbers[x_100] = x_101;
+  return;
+}
+
+fn performPartition_i1_i1_(l : ptr<function, i32>, h : ptr<function, i32>) -> i32 {
+  var pivot : i32;
+  var i_1 : i32;
+  var j_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  var param_3 : i32;
+  let x_104 : i32 = *(h);
+  let x_106 : i32 = obj.numbers[x_104];
+  pivot = x_106;
+  let x_107 : i32 = *(l);
+  i_1 = (x_107 - 1);
+  let x_109 : i32 = *(l);
+  j_1 = x_109;
+  loop {
+    let x_114 : i32 = j_1;
+    let x_115 : i32 = *(h);
+    if ((x_114 <= (x_115 - 1))) {
+    } else {
+      break;
+    }
+    let x_119 : i32 = j_1;
+    let x_121 : i32 = obj.numbers[x_119];
+    let x_122 : i32 = pivot;
+    if ((x_121 <= x_122)) {
+      let x_126 : i32 = i_1;
+      i_1 = (x_126 + 1);
+      let x_128 : i32 = i_1;
+      param = x_128;
+      let x_129 : i32 = j_1;
+      param_1 = x_129;
+      swap_i1_i1_(&(param), &(param_1));
+    }
+
+    continuing {
+      let x_131 : i32 = j_1;
+      j_1 = (x_131 + 1);
+    }
+  }
+  let x_133 : i32 = i_1;
+  param_2 = (x_133 + 1);
+  let x_135 : i32 = *(h);
+  param_3 = x_135;
+  swap_i1_i1_(&(param_2), &(param_3));
+  let x_137 : i32 = i_1;
+  return (x_137 + 1);
+}
+
+fn quicksort_() {
+  var l_1 : i32;
+  var h_1 : i32;
+  var top : i32;
+  var stack : array<i32, 10>;
+  var p : i32;
+  var param_4 : i32;
+  var param_5 : i32;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  let x_140 : i32 = top;
+  let x_141 : i32 = (x_140 + 1);
+  top = x_141;
+  let x_142 : i32 = l_1;
+  stack[x_141] = x_142;
+  let x_144 : i32 = top;
+  let x_145 : i32 = (x_144 + 1);
+  top = x_145;
+  let x_146 : i32 = h_1;
+  stack[x_145] = x_146;
+  loop {
+    let x_152 : i32 = top;
+    if ((x_152 >= 0)) {
+    } else {
+      break;
+    }
+    let x_155 : i32 = top;
+    top = (x_155 - 1);
+    let x_158 : i32 = stack[x_155];
+    h_1 = x_158;
+    let x_159 : i32 = top;
+    top = (x_159 - 1);
+    let x_162 : i32 = stack[x_159];
+    l_1 = x_162;
+    let x_163 : i32 = l_1;
+    param_4 = x_163;
+    let x_164 : i32 = h_1;
+    param_5 = x_164;
+    let x_165 : i32 = performPartition_i1_i1_(&(param_4), &(param_5));
+    p = x_165;
+    let x_166 : i32 = p;
+    let x_168 : i32 = l_1;
+    if (((x_166 - 1) > x_168)) {
+      let x_172 : i32 = top;
+      let x_173 : i32 = (x_172 + 1);
+      top = x_173;
+      let x_174 : i32 = l_1;
+      stack[x_173] = x_174;
+      let x_176 : i32 = top;
+      let x_177 : i32 = (x_176 + 1);
+      top = x_177;
+      let x_178 : i32 = p;
+      stack[x_177] = (x_178 - 1);
+    }
+    let x_181 : i32 = p;
+    let x_183 : i32 = h_1;
+    if (((x_181 + 1) < x_183)) {
+      let x_187 : i32 = top;
+      let x_188 : i32 = (x_187 + 1);
+      top = x_188;
+      let x_189 : i32 = p;
+      stack[x_188] = (x_189 + 1);
+      let x_192 : i32 = top;
+      let x_193 : i32 = (x_192 + 1);
+      top = x_193;
+      let x_194 : i32 = h_1;
+      stack[x_193] = x_194;
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_2 : i32;
+  i_2 = 0;
+  loop {
+    let x_64 : i32 = i_2;
+    if ((x_64 < 10)) {
+    } else {
+      break;
+    }
+    let x_67 : i32 = i_2;
+    let x_68 : i32 = i_2;
+    obj.numbers[x_67] = (10 - x_68);
+    let x_71 : i32 = i_2;
+    let x_72 : i32 = i_2;
+    let x_74 : i32 = obj.numbers[x_72];
+    let x_75 : i32 = i_2;
+    let x_77 : i32 = obj.numbers[x_75];
+    obj.numbers[x_71] = (x_74 * x_77);
+
+    continuing {
+      let x_80 : i32 = i_2;
+      i_2 = (x_80 + 1);
+    }
+  }
+  quicksort_();
+  let x_84 : i32 = obj.numbers[0];
+  let x_86 : i32 = obj.numbers[4];
+  if ((x_84 < x_86)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 1.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/array-idx-multiplied-by-for-loop-idx/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/array-idx-multiplied-by-for-loop-idx/0-opt.spvasm
new file mode 100644
index 0000000..13024f7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/array-idx-multiplied-by-for-loop-idx/0-opt.spvasm
@@ -0,0 +1,188 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %func_ "func("
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %x "x"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %data "data"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+         %15 = OpTypeFunction %float
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_1 = OpConstant %float 1
+       %bool = OpTypeBool
+    %float_5 = OpConstant %float 5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_int = OpTypePointer Function %int
+    %float_0 = OpConstant %float 0
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+    %uint_17 = OpConstant %uint 17
+%_arr_v2float_uint_17 = OpTypeArray %v2float %uint_17
+%_ptr_Function__arr_v2float_uint_17 = OpTypePointer Function %_arr_v2float_uint_17
+%_ptr_Function_float = OpTypePointer Function %float
+     %int_15 = OpConstant %int 15
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %40 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %41 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+      %int_1 = OpConstant %int 1
+       %main = OpFunction %void None %13
+         %43 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+          %j = OpVariable %_ptr_Function_int Function
+       %data = OpVariable %_ptr_Function__arr_v2float_uint_17 Function
+               OpStore %i %int_0
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %48 = OpLoad %int %i
+         %49 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %50 = OpLoad %float %49
+         %51 = OpConvertFToS %int %50
+         %52 = OpIAdd %int %int_4 %51
+         %53 = OpSLessThan %bool %48 %52
+               OpBranchConditional %53 %54 %45
+         %54 = OpLabel
+         %55 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %56 = OpLoad %float %55
+         %57 = OpFOrdGreaterThanEqual %bool %56 %float_0
+               OpSelectionMerge %58 None
+               OpBranchConditional %57 %59 %58
+         %59 = OpLabel
+               OpStore %j %int_0
+               OpBranch %60
+         %60 = OpLabel
+               OpLoopMerge %61 %62 None
+               OpBranch %63
+         %63 = OpLabel
+         %64 = OpLoad %int %j
+         %65 = OpSLessThan %bool %64 %int_4
+               OpBranchConditional %65 %66 %61
+         %66 = OpLabel
+         %67 = OpLoad %int %j
+         %68 = OpIMul %int %int_4 %67
+         %69 = OpLoad %int %i
+         %70 = OpIAdd %int %68 %69
+         %71 = OpFunctionCall %float %func_
+         %72 = OpAccessChain %_ptr_Function_float %data %70 %uint_0
+               OpStore %72 %71
+         %73 = OpAccessChain %_ptr_Function_float %data %int_0 %uint_0
+         %74 = OpLoad %float %73
+         %75 = OpFOrdEqual %bool %74 %float_5
+         %76 = OpLogicalNot %bool %75
+               OpSelectionMerge %77 None
+               OpBranchConditional %76 %78 %77
+         %78 = OpLabel
+         %79 = OpAccessChain %_ptr_Function_float %data %int_15 %uint_0
+         %80 = OpLoad %float %79
+         %81 = OpFOrdEqual %bool %80 %float_5
+               OpBranch %77
+         %77 = OpLabel
+         %82 = OpPhi %bool %75 %66 %81 %78
+               OpSelectionMerge %83 None
+               OpBranchConditional %82 %84 %85
+         %84 = OpLabel
+               OpStore %_GLF_color %40
+               OpBranch %83
+         %85 = OpLabel
+               OpStore %_GLF_color %41
+               OpBranch %83
+         %83 = OpLabel
+         %86 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %87 = OpLoad %float %86
+         %88 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %89 = OpLoad %float %88
+         %90 = OpFOrdGreaterThan %bool %87 %89
+               OpSelectionMerge %91 None
+               OpBranchConditional %90 %92 %91
+         %92 = OpLabel
+               OpReturn
+         %91 = OpLabel
+               OpBranch %62
+         %62 = OpLabel
+         %93 = OpLoad %int %j
+         %94 = OpIAdd %int %93 %int_1
+               OpStore %j %94
+               OpBranch %60
+         %61 = OpLabel
+               OpBranch %58
+         %58 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+         %95 = OpLoad %int %i
+         %96 = OpIAdd %int %95 %int_1
+               OpStore %i %96
+               OpBranch %44
+         %45 = OpLabel
+               OpReturn
+               OpFunctionEnd
+      %func_ = OpFunction %float None %15
+         %97 = OpLabel
+          %x = OpVariable %_ptr_Function_int Function
+         %98 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %99 = OpLoad %float %98
+        %100 = OpFOrdLessThan %bool %99 %float_1
+               OpSelectionMerge %101 None
+               OpBranchConditional %100 %102 %101
+        %102 = OpLabel
+               OpReturnValue %float_5
+        %101 = OpLabel
+        %103 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+        %104 = OpLoad %float %103
+        %105 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+        %106 = OpLoad %float %105
+        %107 = OpFOrdGreaterThan %bool %104 %106
+               OpSelectionMerge %108 None
+               OpBranchConditional %107 %109 %108
+        %109 = OpLabel
+               OpReturnValue %float_1
+        %108 = OpLabel
+        %110 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+        %111 = OpLoad %float %110
+        %112 = OpConvertFToS %int %111
+               OpStore %x %112
+        %113 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+        %114 = OpLoad %float %113
+        %115 = OpExtInst %float %1 FClamp %114 %float_0 %float_1
+        %116 = OpConvertFToS %int %115
+        %117 = OpIMul %int %116 %int_3
+        %118 = OpLoad %int %x
+        %119 = OpIAdd %int %118 %117
+               OpStore %x %119
+        %120 = OpLoad %int %x
+        %121 = OpConvertSToF %float %120
+        %122 = OpFAdd %float %float_5 %121
+               OpReturnValue %122
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/array-idx-multiplied-by-for-loop-idx/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/array-idx-multiplied-by-for-loop-idx/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..b29e01e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/array-idx-multiplied-by-for-loop-idx/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,98 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+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);
+
+float func_() {
+  int x = 0;
+  const float x_99 = gl_FragCoord.x;
+  if ((x_99 < 1.0f)) {
+    return 5.0f;
+  }
+  const float x_104 = asfloat(x_7[0].x);
+  const float x_106 = asfloat(x_7[0].y);
+  if ((x_104 > x_106)) {
+    return 1.0f;
+  }
+  const float x_111 = asfloat(x_7[0].x);
+  x = int(x_111);
+  const float x_114 = asfloat(x_7[0].x);
+  x = (x + (int(clamp(x_114, 0.0f, 1.0f)) * 3));
+  return (5.0f + float(x));
+}
+
+void main_1() {
+  int i = 0;
+  int j = 0;
+  float2 data[17] = (float2[17])0;
+  i = 0;
+  while (true) {
+    const int x_48 = i;
+    const float x_50 = asfloat(x_7[0].x);
+    if ((x_48 < (4 + int(x_50)))) {
+    } else {
+      break;
+    }
+    const float x_56 = gl_FragCoord.x;
+    if ((x_56 >= 0.0f)) {
+      j = 0;
+      while (true) {
+        bool x_81 = false;
+        bool x_82_phi = false;
+        if ((j < 4)) {
+        } else {
+          break;
+        }
+        const int x_67 = j;
+        const int x_69 = i;
+        const float x_71 = func_();
+        data[((4 * x_67) + x_69)].x = x_71;
+        const float x_74 = data[0].x;
+        const bool x_75 = (x_74 == 5.0f);
+        x_82_phi = x_75;
+        if (!(x_75)) {
+          const float x_80 = data[15].x;
+          x_81 = (x_80 == 5.0f);
+          x_82_phi = x_81;
+        }
+        if (x_82_phi) {
+          x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+        } else {
+          x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        }
+        const float x_87 = asfloat(x_7[0].x);
+        const float x_89 = asfloat(x_7[0].y);
+        if ((x_87 > x_89)) {
+          return;
+        }
+        {
+          j = (j + 1);
+        }
+      }
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/array-idx-multiplied-by-for-loop-idx/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/array-idx-multiplied-by-for-loop-idx/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..4eedfbc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/array-idx-multiplied-by-for-loop-idx/0-opt.spvasm.expected.msl
@@ -0,0 +1,106 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  float2 arr[17];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float func_(constant buf0& x_7, thread float4* const tint_symbol_5) {
+  int x = 0;
+  float const x_99 = (*(tint_symbol_5)).x;
+  if ((x_99 < 1.0f)) {
+    return 5.0f;
+  }
+  float const x_104 = x_7.injectionSwitch.x;
+  float const x_106 = x_7.injectionSwitch.y;
+  if ((x_104 > x_106)) {
+    return 1.0f;
+  }
+  float const x_111 = x_7.injectionSwitch.x;
+  x = int(x_111);
+  float const x_114 = x_7.injectionSwitch.x;
+  int const x_118 = x;
+  x = (x_118 + (int(clamp(x_114, 0.0f, 1.0f)) * 3));
+  int const x_120 = x;
+  return (5.0f + float(x_120));
+}
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  int i = 0;
+  int j = 0;
+  tint_array_wrapper data = {};
+  i = 0;
+  while (true) {
+    int const x_48 = i;
+    float const x_50 = x_7.injectionSwitch.x;
+    if ((x_48 < (4 + int(x_50)))) {
+    } else {
+      break;
+    }
+    float const x_56 = (*(tint_symbol_6)).x;
+    if ((x_56 >= 0.0f)) {
+      j = 0;
+      while (true) {
+        bool x_81 = false;
+        bool x_82_phi = false;
+        int const x_64 = j;
+        if ((x_64 < 4)) {
+        } else {
+          break;
+        }
+        int const x_67 = j;
+        int const x_69 = i;
+        float const x_71 = func_(x_7, tint_symbol_6);
+        data.arr[((4 * x_67) + x_69)].x = x_71;
+        float const x_74 = data.arr[0].x;
+        bool const x_75 = (x_74 == 5.0f);
+        x_82_phi = x_75;
+        if (!(x_75)) {
+          float const x_80 = data.arr[15].x;
+          x_81 = (x_80 == 5.0f);
+          x_82_phi = x_81;
+        }
+        bool const x_82 = x_82_phi;
+        if (x_82) {
+          *(tint_symbol_7) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+        } else {
+          *(tint_symbol_7) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        }
+        float const x_87 = x_7.injectionSwitch.x;
+        float const x_89 = x_7.injectionSwitch.y;
+        if ((x_87 > x_89)) {
+          return;
+        }
+        {
+          int const x_93 = j;
+          j = (x_93 + 1);
+        }
+      }
+    }
+    {
+      int const x_95 = i;
+      i = (x_95 + 1);
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_7, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/array-idx-multiplied-by-for-loop-idx/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/array-idx-multiplied-by-for-loop-idx/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..068c255
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/array-idx-multiplied-by-for-loop-idx/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,247 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 151
+; Schema: 0
+               OpCapability Shader
+         %50 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %func_ "func_"
+               OpName %x "x"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %data "data"
+               OpName %x_81 "x_81"
+               OpName %x_82_phi "x_82_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v2float_uint_17 ArrayStride 8
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+         %15 = OpTypeFunction %float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_1 = OpConstant %float 1
+       %bool = OpTypeBool
+    %float_5 = OpConstant %float 5
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+    %float_0 = OpConstant %float 0
+      %int_3 = OpConstant %int 3
+       %void = OpTypeVoid
+         %58 = OpTypeFunction %void
+    %uint_17 = OpConstant %uint 17
+%_arr_v2float_uint_17 = OpTypeArray %v2float %uint_17
+%_ptr_Function__arr_v2float_uint_17 = OpTypePointer Function %_arr_v2float_uint_17
+         %68 = OpConstantNull %_arr_v2float_uint_17
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %95 = OpConstantNull %bool
+%_ptr_Function_float = OpTypePointer Function %float
+     %int_15 = OpConstant %int 15
+        %124 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %125 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+        %138 = OpTypeFunction %void %main_out
+      %func_ = OpFunction %float None %15
+         %17 = OpLabel
+          %x = OpVariable %_ptr_Function_int Function %21
+         %25 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %26 = OpLoad %float %25
+         %28 = OpFOrdLessThan %bool %26 %float_1
+               OpSelectionMerge %30 None
+               OpBranchConditional %28 %31 %30
+         %31 = OpLabel
+               OpReturnValue %float_5
+         %30 = OpLabel
+         %34 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_0
+         %35 = OpLoad %float %34
+         %37 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_1
+         %38 = OpLoad %float %37
+         %39 = OpFOrdGreaterThan %bool %35 %38
+               OpSelectionMerge %40 None
+               OpBranchConditional %39 %41 %40
+         %41 = OpLabel
+               OpReturnValue %float_1
+         %40 = OpLabel
+         %42 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_0
+         %43 = OpLoad %float %42
+         %44 = OpConvertFToS %int %43
+               OpStore %x %44
+         %45 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_0
+         %46 = OpLoad %float %45
+         %47 = OpLoad %int %x
+         %49 = OpExtInst %float %50 NClamp %46 %float_0 %float_1
+         %48 = OpConvertFToS %int %49
+         %53 = OpIMul %int %48 %int_3
+         %54 = OpIAdd %int %47 %53
+               OpStore %x %54
+         %55 = OpLoad %int %x
+         %56 = OpConvertSToF %float %55
+         %57 = OpFAdd %float %float_5 %56
+               OpReturnValue %57
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %58
+         %61 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %21
+          %j = OpVariable %_ptr_Function_int Function %21
+       %data = OpVariable %_ptr_Function__arr_v2float_uint_17 Function %68
+       %x_81 = OpVariable %_ptr_Function_bool Function %95
+   %x_82_phi = OpVariable %_ptr_Function_bool Function %95
+               OpStore %i %int_0
+               OpBranch %70
+         %70 = OpLabel
+               OpLoopMerge %71 %72 None
+               OpBranch %73
+         %73 = OpLabel
+         %74 = OpLoad %int %i
+         %75 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_0
+         %76 = OpLoad %float %75
+         %78 = OpConvertFToS %int %76
+         %79 = OpIAdd %int %int_4 %78
+         %80 = OpSLessThan %bool %74 %79
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %83
+         %82 = OpLabel
+               OpBranch %81
+         %83 = OpLabel
+               OpBranch %71
+         %81 = OpLabel
+         %84 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %85 = OpLoad %float %84
+         %86 = OpFOrdGreaterThanEqual %bool %85 %float_0
+               OpSelectionMerge %87 None
+               OpBranchConditional %86 %88 %87
+         %88 = OpLabel
+               OpStore %j %int_0
+               OpBranch %89
+         %89 = OpLabel
+               OpLoopMerge %90 %91 None
+               OpBranch %92
+         %92 = OpLabel
+         %97 = OpLoad %int %j
+         %98 = OpSLessThan %bool %97 %int_4
+               OpSelectionMerge %99 None
+               OpBranchConditional %98 %100 %101
+        %100 = OpLabel
+               OpBranch %99
+        %101 = OpLabel
+               OpBranch %90
+         %99 = OpLabel
+        %102 = OpLoad %int %j
+        %103 = OpLoad %int %i
+        %104 = OpFunctionCall %float %func_
+        %105 = OpIMul %int %int_4 %102
+        %106 = OpIAdd %int %105 %103
+        %108 = OpAccessChain %_ptr_Function_float %data %106 %uint_0
+               OpStore %108 %104
+        %109 = OpAccessChain %_ptr_Function_float %data %int_0 %uint_0
+        %110 = OpLoad %float %109
+        %111 = OpFOrdEqual %bool %110 %float_5
+               OpStore %x_82_phi %111
+        %112 = OpLogicalNot %bool %111
+               OpSelectionMerge %113 None
+               OpBranchConditional %112 %114 %113
+        %114 = OpLabel
+        %116 = OpAccessChain %_ptr_Function_float %data %int_15 %uint_0
+        %117 = OpLoad %float %116
+        %118 = OpFOrdEqual %bool %117 %float_5
+               OpStore %x_81 %118
+        %119 = OpLoad %bool %x_81
+               OpStore %x_82_phi %119
+               OpBranch %113
+        %113 = OpLabel
+        %120 = OpLoad %bool %x_82_phi
+               OpSelectionMerge %121 None
+               OpBranchConditional %120 %122 %123
+        %122 = OpLabel
+               OpStore %x_GLF_color %124
+               OpBranch %121
+        %123 = OpLabel
+               OpStore %x_GLF_color %125
+               OpBranch %121
+        %121 = OpLabel
+        %126 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_0
+        %127 = OpLoad %float %126
+        %128 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_1
+        %129 = OpLoad %float %128
+        %130 = OpFOrdGreaterThan %bool %127 %129
+               OpSelectionMerge %131 None
+               OpBranchConditional %130 %132 %131
+        %132 = OpLabel
+               OpReturn
+        %131 = OpLabel
+               OpBranch %91
+         %91 = OpLabel
+        %133 = OpLoad %int %j
+        %135 = OpIAdd %int %133 %int_1
+               OpStore %j %135
+               OpBranch %89
+         %90 = OpLabel
+               OpBranch %87
+         %87 = OpLabel
+               OpBranch %72
+         %72 = OpLabel
+        %136 = OpLoad %int %i
+        %137 = OpIAdd %int %136 %int_1
+               OpStore %i %137
+               OpBranch %70
+         %71 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %138
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %142 = OpLabel
+        %143 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %143
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %58
+        %145 = OpLabel
+        %146 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %146
+        %147 = OpFunctionCall %void %main_1
+        %149 = OpLoad %v4float %x_GLF_color
+        %150 = OpCompositeConstruct %main_out %149
+        %148 = OpFunctionCall %void %tint_symbol_3 %150
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/array-idx-multiplied-by-for-loop-idx/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/array-idx-multiplied-by-for-loop-idx/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..430c6db
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/array-idx-multiplied-by-for-loop-idx/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,104 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> f32 {
+  var x : i32;
+  let x_99 : f32 = gl_FragCoord.x;
+  if ((x_99 < 1.0)) {
+    return 5.0;
+  }
+  let x_104 : f32 = x_7.injectionSwitch.x;
+  let x_106 : f32 = x_7.injectionSwitch.y;
+  if ((x_104 > x_106)) {
+    return 1.0;
+  }
+  let x_111 : f32 = x_7.injectionSwitch.x;
+  x = i32(x_111);
+  let x_114 : f32 = x_7.injectionSwitch.x;
+  let x_118 : i32 = x;
+  x = (x_118 + (i32(clamp(x_114, 0.0, 1.0)) * 3));
+  let x_120 : i32 = x;
+  return (5.0 + f32(x_120));
+}
+
+fn main_1() {
+  var i : i32;
+  var j : i32;
+  var data : array<vec2<f32>, 17>;
+  i = 0;
+  loop {
+    let x_48 : i32 = i;
+    let x_50 : f32 = x_7.injectionSwitch.x;
+    if ((x_48 < (4 + i32(x_50)))) {
+    } else {
+      break;
+    }
+    let x_56 : f32 = gl_FragCoord.x;
+    if ((x_56 >= 0.0)) {
+      j = 0;
+      loop {
+        var x_81 : bool;
+        var x_82_phi : bool;
+        let x_64 : i32 = j;
+        if ((x_64 < 4)) {
+        } else {
+          break;
+        }
+        let x_67 : i32 = j;
+        let x_69 : i32 = i;
+        let x_71 : f32 = func_();
+        data[((4 * x_67) + x_69)].x = x_71;
+        let x_74 : f32 = data[0].x;
+        let x_75 : bool = (x_74 == 5.0);
+        x_82_phi = x_75;
+        if (!(x_75)) {
+          let x_80 : f32 = data[15].x;
+          x_81 = (x_80 == 5.0);
+          x_82_phi = x_81;
+        }
+        let x_82 : bool = x_82_phi;
+        if (x_82) {
+          x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+        } else {
+          x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+        }
+        let x_87 : f32 = x_7.injectionSwitch.x;
+        let x_89 : f32 = x_7.injectionSwitch.y;
+        if ((x_87 > x_89)) {
+          return;
+        }
+
+        continuing {
+          let x_93 : i32 = j;
+          j = (x_93 + 1);
+        }
+      }
+    }
+
+    continuing {
+      let x_95 : i32 = i;
+      i = (x_95 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/array-idx-multiplied-by-for-loop-idx/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/array-idx-multiplied-by-for-loop-idx/0-opt.wgsl
new file mode 100644
index 0000000..430c6db
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/array-idx-multiplied-by-for-loop-idx/0-opt.wgsl
@@ -0,0 +1,104 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> f32 {
+  var x : i32;
+  let x_99 : f32 = gl_FragCoord.x;
+  if ((x_99 < 1.0)) {
+    return 5.0;
+  }
+  let x_104 : f32 = x_7.injectionSwitch.x;
+  let x_106 : f32 = x_7.injectionSwitch.y;
+  if ((x_104 > x_106)) {
+    return 1.0;
+  }
+  let x_111 : f32 = x_7.injectionSwitch.x;
+  x = i32(x_111);
+  let x_114 : f32 = x_7.injectionSwitch.x;
+  let x_118 : i32 = x;
+  x = (x_118 + (i32(clamp(x_114, 0.0, 1.0)) * 3));
+  let x_120 : i32 = x;
+  return (5.0 + f32(x_120));
+}
+
+fn main_1() {
+  var i : i32;
+  var j : i32;
+  var data : array<vec2<f32>, 17>;
+  i = 0;
+  loop {
+    let x_48 : i32 = i;
+    let x_50 : f32 = x_7.injectionSwitch.x;
+    if ((x_48 < (4 + i32(x_50)))) {
+    } else {
+      break;
+    }
+    let x_56 : f32 = gl_FragCoord.x;
+    if ((x_56 >= 0.0)) {
+      j = 0;
+      loop {
+        var x_81 : bool;
+        var x_82_phi : bool;
+        let x_64 : i32 = j;
+        if ((x_64 < 4)) {
+        } else {
+          break;
+        }
+        let x_67 : i32 = j;
+        let x_69 : i32 = i;
+        let x_71 : f32 = func_();
+        data[((4 * x_67) + x_69)].x = x_71;
+        let x_74 : f32 = data[0].x;
+        let x_75 : bool = (x_74 == 5.0);
+        x_82_phi = x_75;
+        if (!(x_75)) {
+          let x_80 : f32 = data[15].x;
+          x_81 = (x_80 == 5.0);
+          x_82_phi = x_81;
+        }
+        let x_82 : bool = x_82_phi;
+        if (x_82) {
+          x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+        } else {
+          x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+        }
+        let x_87 : f32 = x_7.injectionSwitch.x;
+        let x_89 : f32 = x_7.injectionSwitch.y;
+        if ((x_87 > x_89)) {
+          return;
+        }
+
+        continuing {
+          let x_93 : i32 = j;
+          j = (x_93 + 1);
+        }
+      }
+    }
+
+    continuing {
+      let x_95 : i32 = i;
+      i = (x_95 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/array-idx-multiplied-by-for-loop-idx/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/array-idx-multiplied-by-for-loop-idx/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..b29e01e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/array-idx-multiplied-by-for-loop-idx/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,98 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+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);
+
+float func_() {
+  int x = 0;
+  const float x_99 = gl_FragCoord.x;
+  if ((x_99 < 1.0f)) {
+    return 5.0f;
+  }
+  const float x_104 = asfloat(x_7[0].x);
+  const float x_106 = asfloat(x_7[0].y);
+  if ((x_104 > x_106)) {
+    return 1.0f;
+  }
+  const float x_111 = asfloat(x_7[0].x);
+  x = int(x_111);
+  const float x_114 = asfloat(x_7[0].x);
+  x = (x + (int(clamp(x_114, 0.0f, 1.0f)) * 3));
+  return (5.0f + float(x));
+}
+
+void main_1() {
+  int i = 0;
+  int j = 0;
+  float2 data[17] = (float2[17])0;
+  i = 0;
+  while (true) {
+    const int x_48 = i;
+    const float x_50 = asfloat(x_7[0].x);
+    if ((x_48 < (4 + int(x_50)))) {
+    } else {
+      break;
+    }
+    const float x_56 = gl_FragCoord.x;
+    if ((x_56 >= 0.0f)) {
+      j = 0;
+      while (true) {
+        bool x_81 = false;
+        bool x_82_phi = false;
+        if ((j < 4)) {
+        } else {
+          break;
+        }
+        const int x_67 = j;
+        const int x_69 = i;
+        const float x_71 = func_();
+        data[((4 * x_67) + x_69)].x = x_71;
+        const float x_74 = data[0].x;
+        const bool x_75 = (x_74 == 5.0f);
+        x_82_phi = x_75;
+        if (!(x_75)) {
+          const float x_80 = data[15].x;
+          x_81 = (x_80 == 5.0f);
+          x_82_phi = x_81;
+        }
+        if (x_82_phi) {
+          x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+        } else {
+          x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        }
+        const float x_87 = asfloat(x_7[0].x);
+        const float x_89 = asfloat(x_7[0].y);
+        if ((x_87 > x_89)) {
+          return;
+        }
+        {
+          j = (j + 1);
+        }
+      }
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/array-idx-multiplied-by-for-loop-idx/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/array-idx-multiplied-by-for-loop-idx/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..4eedfbc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/array-idx-multiplied-by-for-loop-idx/0-opt.wgsl.expected.msl
@@ -0,0 +1,106 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  float2 arr[17];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float func_(constant buf0& x_7, thread float4* const tint_symbol_5) {
+  int x = 0;
+  float const x_99 = (*(tint_symbol_5)).x;
+  if ((x_99 < 1.0f)) {
+    return 5.0f;
+  }
+  float const x_104 = x_7.injectionSwitch.x;
+  float const x_106 = x_7.injectionSwitch.y;
+  if ((x_104 > x_106)) {
+    return 1.0f;
+  }
+  float const x_111 = x_7.injectionSwitch.x;
+  x = int(x_111);
+  float const x_114 = x_7.injectionSwitch.x;
+  int const x_118 = x;
+  x = (x_118 + (int(clamp(x_114, 0.0f, 1.0f)) * 3));
+  int const x_120 = x;
+  return (5.0f + float(x_120));
+}
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  int i = 0;
+  int j = 0;
+  tint_array_wrapper data = {};
+  i = 0;
+  while (true) {
+    int const x_48 = i;
+    float const x_50 = x_7.injectionSwitch.x;
+    if ((x_48 < (4 + int(x_50)))) {
+    } else {
+      break;
+    }
+    float const x_56 = (*(tint_symbol_6)).x;
+    if ((x_56 >= 0.0f)) {
+      j = 0;
+      while (true) {
+        bool x_81 = false;
+        bool x_82_phi = false;
+        int const x_64 = j;
+        if ((x_64 < 4)) {
+        } else {
+          break;
+        }
+        int const x_67 = j;
+        int const x_69 = i;
+        float const x_71 = func_(x_7, tint_symbol_6);
+        data.arr[((4 * x_67) + x_69)].x = x_71;
+        float const x_74 = data.arr[0].x;
+        bool const x_75 = (x_74 == 5.0f);
+        x_82_phi = x_75;
+        if (!(x_75)) {
+          float const x_80 = data.arr[15].x;
+          x_81 = (x_80 == 5.0f);
+          x_82_phi = x_81;
+        }
+        bool const x_82 = x_82_phi;
+        if (x_82) {
+          *(tint_symbol_7) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+        } else {
+          *(tint_symbol_7) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        }
+        float const x_87 = x_7.injectionSwitch.x;
+        float const x_89 = x_7.injectionSwitch.y;
+        if ((x_87 > x_89)) {
+          return;
+        }
+        {
+          int const x_93 = j;
+          j = (x_93 + 1);
+        }
+      }
+    }
+    {
+      int const x_95 = i;
+      i = (x_95 + 1);
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_7, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/array-idx-multiplied-by-for-loop-idx/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/array-idx-multiplied-by-for-loop-idx/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..068c255
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/array-idx-multiplied-by-for-loop-idx/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,247 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 151
+; Schema: 0
+               OpCapability Shader
+         %50 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %func_ "func_"
+               OpName %x "x"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %data "data"
+               OpName %x_81 "x_81"
+               OpName %x_82_phi "x_82_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v2float_uint_17 ArrayStride 8
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+         %15 = OpTypeFunction %float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_1 = OpConstant %float 1
+       %bool = OpTypeBool
+    %float_5 = OpConstant %float 5
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+    %float_0 = OpConstant %float 0
+      %int_3 = OpConstant %int 3
+       %void = OpTypeVoid
+         %58 = OpTypeFunction %void
+    %uint_17 = OpConstant %uint 17
+%_arr_v2float_uint_17 = OpTypeArray %v2float %uint_17
+%_ptr_Function__arr_v2float_uint_17 = OpTypePointer Function %_arr_v2float_uint_17
+         %68 = OpConstantNull %_arr_v2float_uint_17
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %95 = OpConstantNull %bool
+%_ptr_Function_float = OpTypePointer Function %float
+     %int_15 = OpConstant %int 15
+        %124 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %125 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+        %138 = OpTypeFunction %void %main_out
+      %func_ = OpFunction %float None %15
+         %17 = OpLabel
+          %x = OpVariable %_ptr_Function_int Function %21
+         %25 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %26 = OpLoad %float %25
+         %28 = OpFOrdLessThan %bool %26 %float_1
+               OpSelectionMerge %30 None
+               OpBranchConditional %28 %31 %30
+         %31 = OpLabel
+               OpReturnValue %float_5
+         %30 = OpLabel
+         %34 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_0
+         %35 = OpLoad %float %34
+         %37 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_1
+         %38 = OpLoad %float %37
+         %39 = OpFOrdGreaterThan %bool %35 %38
+               OpSelectionMerge %40 None
+               OpBranchConditional %39 %41 %40
+         %41 = OpLabel
+               OpReturnValue %float_1
+         %40 = OpLabel
+         %42 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_0
+         %43 = OpLoad %float %42
+         %44 = OpConvertFToS %int %43
+               OpStore %x %44
+         %45 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_0
+         %46 = OpLoad %float %45
+         %47 = OpLoad %int %x
+         %49 = OpExtInst %float %50 NClamp %46 %float_0 %float_1
+         %48 = OpConvertFToS %int %49
+         %53 = OpIMul %int %48 %int_3
+         %54 = OpIAdd %int %47 %53
+               OpStore %x %54
+         %55 = OpLoad %int %x
+         %56 = OpConvertSToF %float %55
+         %57 = OpFAdd %float %float_5 %56
+               OpReturnValue %57
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %58
+         %61 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %21
+          %j = OpVariable %_ptr_Function_int Function %21
+       %data = OpVariable %_ptr_Function__arr_v2float_uint_17 Function %68
+       %x_81 = OpVariable %_ptr_Function_bool Function %95
+   %x_82_phi = OpVariable %_ptr_Function_bool Function %95
+               OpStore %i %int_0
+               OpBranch %70
+         %70 = OpLabel
+               OpLoopMerge %71 %72 None
+               OpBranch %73
+         %73 = OpLabel
+         %74 = OpLoad %int %i
+         %75 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_0
+         %76 = OpLoad %float %75
+         %78 = OpConvertFToS %int %76
+         %79 = OpIAdd %int %int_4 %78
+         %80 = OpSLessThan %bool %74 %79
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %83
+         %82 = OpLabel
+               OpBranch %81
+         %83 = OpLabel
+               OpBranch %71
+         %81 = OpLabel
+         %84 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %85 = OpLoad %float %84
+         %86 = OpFOrdGreaterThanEqual %bool %85 %float_0
+               OpSelectionMerge %87 None
+               OpBranchConditional %86 %88 %87
+         %88 = OpLabel
+               OpStore %j %int_0
+               OpBranch %89
+         %89 = OpLabel
+               OpLoopMerge %90 %91 None
+               OpBranch %92
+         %92 = OpLabel
+         %97 = OpLoad %int %j
+         %98 = OpSLessThan %bool %97 %int_4
+               OpSelectionMerge %99 None
+               OpBranchConditional %98 %100 %101
+        %100 = OpLabel
+               OpBranch %99
+        %101 = OpLabel
+               OpBranch %90
+         %99 = OpLabel
+        %102 = OpLoad %int %j
+        %103 = OpLoad %int %i
+        %104 = OpFunctionCall %float %func_
+        %105 = OpIMul %int %int_4 %102
+        %106 = OpIAdd %int %105 %103
+        %108 = OpAccessChain %_ptr_Function_float %data %106 %uint_0
+               OpStore %108 %104
+        %109 = OpAccessChain %_ptr_Function_float %data %int_0 %uint_0
+        %110 = OpLoad %float %109
+        %111 = OpFOrdEqual %bool %110 %float_5
+               OpStore %x_82_phi %111
+        %112 = OpLogicalNot %bool %111
+               OpSelectionMerge %113 None
+               OpBranchConditional %112 %114 %113
+        %114 = OpLabel
+        %116 = OpAccessChain %_ptr_Function_float %data %int_15 %uint_0
+        %117 = OpLoad %float %116
+        %118 = OpFOrdEqual %bool %117 %float_5
+               OpStore %x_81 %118
+        %119 = OpLoad %bool %x_81
+               OpStore %x_82_phi %119
+               OpBranch %113
+        %113 = OpLabel
+        %120 = OpLoad %bool %x_82_phi
+               OpSelectionMerge %121 None
+               OpBranchConditional %120 %122 %123
+        %122 = OpLabel
+               OpStore %x_GLF_color %124
+               OpBranch %121
+        %123 = OpLabel
+               OpStore %x_GLF_color %125
+               OpBranch %121
+        %121 = OpLabel
+        %126 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_0
+        %127 = OpLoad %float %126
+        %128 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_1
+        %129 = OpLoad %float %128
+        %130 = OpFOrdGreaterThan %bool %127 %129
+               OpSelectionMerge %131 None
+               OpBranchConditional %130 %132 %131
+        %132 = OpLabel
+               OpReturn
+        %131 = OpLabel
+               OpBranch %91
+         %91 = OpLabel
+        %133 = OpLoad %int %j
+        %135 = OpIAdd %int %133 %int_1
+               OpStore %j %135
+               OpBranch %89
+         %90 = OpLabel
+               OpBranch %87
+         %87 = OpLabel
+               OpBranch %72
+         %72 = OpLabel
+        %136 = OpLoad %int %i
+        %137 = OpIAdd %int %136 %int_1
+               OpStore %i %137
+               OpBranch %70
+         %71 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %138
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %142 = OpLabel
+        %143 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %143
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %58
+        %145 = OpLabel
+        %146 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %146
+        %147 = OpFunctionCall %void %main_1
+        %149 = OpLoad %v4float %x_GLF_color
+        %150 = OpCompositeConstruct %main_out %149
+        %148 = OpFunctionCall %void %tint_symbol_3 %150
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/array-idx-multiplied-by-for-loop-idx/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/array-idx-multiplied-by-for-loop-idx/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..430c6db
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/array-idx-multiplied-by-for-loop-idx/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,104 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> f32 {
+  var x : i32;
+  let x_99 : f32 = gl_FragCoord.x;
+  if ((x_99 < 1.0)) {
+    return 5.0;
+  }
+  let x_104 : f32 = x_7.injectionSwitch.x;
+  let x_106 : f32 = x_7.injectionSwitch.y;
+  if ((x_104 > x_106)) {
+    return 1.0;
+  }
+  let x_111 : f32 = x_7.injectionSwitch.x;
+  x = i32(x_111);
+  let x_114 : f32 = x_7.injectionSwitch.x;
+  let x_118 : i32 = x;
+  x = (x_118 + (i32(clamp(x_114, 0.0, 1.0)) * 3));
+  let x_120 : i32 = x;
+  return (5.0 + f32(x_120));
+}
+
+fn main_1() {
+  var i : i32;
+  var j : i32;
+  var data : array<vec2<f32>, 17>;
+  i = 0;
+  loop {
+    let x_48 : i32 = i;
+    let x_50 : f32 = x_7.injectionSwitch.x;
+    if ((x_48 < (4 + i32(x_50)))) {
+    } else {
+      break;
+    }
+    let x_56 : f32 = gl_FragCoord.x;
+    if ((x_56 >= 0.0)) {
+      j = 0;
+      loop {
+        var x_81 : bool;
+        var x_82_phi : bool;
+        let x_64 : i32 = j;
+        if ((x_64 < 4)) {
+        } else {
+          break;
+        }
+        let x_67 : i32 = j;
+        let x_69 : i32 = i;
+        let x_71 : f32 = func_();
+        data[((4 * x_67) + x_69)].x = x_71;
+        let x_74 : f32 = data[0].x;
+        let x_75 : bool = (x_74 == 5.0);
+        x_82_phi = x_75;
+        if (!(x_75)) {
+          let x_80 : f32 = data[15].x;
+          x_81 = (x_80 == 5.0);
+          x_82_phi = x_81;
+        }
+        let x_82 : bool = x_82_phi;
+        if (x_82) {
+          x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+        } else {
+          x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+        }
+        let x_87 : f32 = x_7.injectionSwitch.x;
+        let x_89 : f32 = x_7.injectionSwitch.y;
+        if ((x_87 > x_89)) {
+          return;
+        }
+
+        continuing {
+          let x_93 : i32 = j;
+          j = (x_93 + 1);
+        }
+      }
+    }
+
+    continuing {
+      let x_95 : i32 = i;
+      i = (x_95 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array-2/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array-2/0-opt.spvasm
new file mode 100644
index 0000000..8f8a7d6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array-2/0-opt.spvasm
@@ -0,0 +1,194 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %func_i1_ "func(i1;"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %data "data"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %temp "temp"
+               OpName %i "i"
+               OpName %i_0 "i"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %float = OpTypeFloat 32
+         %19 = OpTypeFunction %float %_ptr_Function_int
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_9 = OpConstant %uint 9
+%_arr_int_uint_9 = OpTypeArray %int %uint_9
+%_ptr_Private__arr_int_uint_9 = OpTypePointer Private %_arr_int_uint_9
+       %data = OpVariable %_ptr_Private__arr_int_uint_9 Private
+      %int_5 = OpConstant %int 5
+%_ptr_Private_int = OpTypePointer Private %int
+      %int_2 = OpConstant %int 2
+      %int_4 = OpConstant %int 4
+      %int_6 = OpConstant %int 6
+      %int_8 = OpConstant %int 8
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+     %uint_7 = OpConstant %uint 7
+%_arr_int_uint_7 = OpTypeArray %int %uint_7
+%_ptr_Private__arr_int_uint_7 = OpTypePointer Private %_arr_int_uint_7
+       %temp = OpVariable %_ptr_Private__arr_int_uint_7 Private
+      %int_3 = OpConstant %int 3
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %44 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %45 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %15
+         %46 = OpLabel
+        %i_0 = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_int Function
+    %param_0 = OpVariable %_ptr_Function_int Function
+               OpStore %i_0 %int_0
+               OpBranch %47
+         %47 = OpLabel
+               OpLoopMerge %48 %49 None
+               OpBranch %50
+         %50 = OpLabel
+         %51 = OpLoad %int %i_0
+         %52 = OpSLessThan %bool %51 %int_6
+               OpBranchConditional %52 %53 %48
+         %53 = OpLabel
+         %54 = OpLoad %int %i_0
+               OpStore %param %54
+         %55 = OpFunctionCall %float %func_i1_ %param
+         %56 = OpLoad %int %i_0
+               OpStore %param_0 %56
+         %57 = OpFunctionCall %float %func_i1_ %param_0
+         %58 = OpFOrdEqual %bool %57 %float_1
+               OpSelectionMerge %59 None
+               OpBranchConditional %58 %60 %61
+         %60 = OpLabel
+               OpStore %_GLF_color %44
+               OpBranch %59
+         %61 = OpLabel
+               OpStore %_GLF_color %45
+               OpBranch %59
+         %59 = OpLabel
+               OpBranch %49
+         %49 = OpLabel
+         %62 = OpLoad %int %i_0
+         %63 = OpIAdd %int %62 %int_1
+               OpStore %i_0 %63
+               OpBranch %47
+         %48 = OpLabel
+               OpReturn
+               OpFunctionEnd
+   %func_i1_ = OpFunction %float None %19
+          %a = OpFunctionParameter %_ptr_Function_int
+         %64 = OpLabel
+          %b = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+               OpStore %b %int_0
+         %65 = OpAccessChain %_ptr_Private_int %data %int_0
+               OpStore %65 %int_5
+         %66 = OpAccessChain %_ptr_Private_int %data %int_2
+               OpStore %66 %int_0
+         %67 = OpAccessChain %_ptr_Private_int %data %int_4
+               OpStore %67 %int_0
+         %68 = OpAccessChain %_ptr_Private_int %data %int_6
+               OpStore %68 %int_0
+         %69 = OpAccessChain %_ptr_Private_int %data %int_8
+               OpStore %69 %int_0
+         %70 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %71 = OpLoad %float %70
+         %72 = OpFOrdGreaterThanEqual %bool %71 %float_0
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %74 %73
+         %74 = OpLabel
+               OpBranch %75
+         %75 = OpLabel
+               OpLoopMerge %76 %77 None
+               OpBranch %78
+         %78 = OpLabel
+         %79 = OpLoad %int %b
+         %80 = OpLoad %int %a
+         %81 = OpSLessThanEqual %bool %79 %80
+               OpBranchConditional %81 %82 %76
+         %82 = OpLabel
+         %83 = OpLoad %int %b
+         %84 = OpSLessThanEqual %bool %83 %int_5
+               OpSelectionMerge %85 None
+               OpBranchConditional %84 %86 %85
+         %86 = OpLabel
+         %87 = OpLoad %int %b
+         %88 = OpLoad %int %b
+         %89 = OpAccessChain %_ptr_Private_int %data %88
+         %90 = OpLoad %int %89
+         %91 = OpAccessChain %_ptr_Private_int %temp %87
+               OpStore %91 %90
+         %92 = OpLoad %int %b
+         %93 = OpIAdd %int %92 %int_2
+               OpStore %b %93
+               OpBranch %85
+         %85 = OpLabel
+               OpBranch %77
+         %77 = OpLabel
+               OpBranch %75
+         %76 = OpLabel
+               OpBranch %73
+         %73 = OpLabel
+               OpStore %i %int_0
+               OpBranch %94
+         %94 = OpLabel
+               OpLoopMerge %95 %96 None
+               OpBranch %97
+         %97 = OpLabel
+         %98 = OpLoad %int %i
+         %99 = OpSLessThan %bool %98 %int_3
+               OpBranchConditional %99 %100 %95
+        %100 = OpLabel
+        %101 = OpLoad %int %i
+        %102 = OpAccessChain %_ptr_Private_int %temp %int_0
+        %103 = OpLoad %int %102
+        %104 = OpIAdd %int %103 %int_1
+        %105 = OpAccessChain %_ptr_Private_int %data %101
+               OpStore %105 %104
+               OpBranch %96
+         %96 = OpLabel
+        %106 = OpLoad %int %i
+        %107 = OpIAdd %int %106 %int_1
+               OpStore %i %107
+               OpBranch %94
+         %95 = OpLabel
+        %108 = OpAccessChain %_ptr_Private_int %temp %int_0
+        %109 = OpLoad %int %108
+        %110 = OpIEqual %bool %109 %int_5
+               OpSelectionMerge %111 None
+               OpBranchConditional %110 %112 %111
+        %112 = OpLabel
+        %113 = OpAccessChain %_ptr_Private_int %data %int_0
+        %114 = OpLoad %int %113
+        %115 = OpIEqual %bool %114 %int_6
+               OpBranch %111
+        %111 = OpLabel
+        %116 = OpPhi %bool %110 %95 %115 %112
+               OpSelectionMerge %117 None
+               OpBranchConditional %116 %118 %119
+        %118 = OpLabel
+               OpReturnValue %float_1
+        %119 = OpLabel
+               OpReturnValue %float_0
+        %117 = OpLabel
+               OpUnreachable
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array-2/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array-2/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..b2bb718
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array-2/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,96 @@
+static int data[9] = (int[9])0;
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static int temp[7] = (int[7])0;
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float func_i1_(inout int a) {
+  int b = 0;
+  int i = 0;
+  bool x_115 = false;
+  bool x_116_phi = false;
+  b = 0;
+  data[0] = 5;
+  data[2] = 0;
+  data[4] = 0;
+  data[6] = 0;
+  data[8] = 0;
+  const float x_71 = gl_FragCoord.x;
+  if ((x_71 >= 0.0f)) {
+    while (true) {
+      const int x_79 = b;
+      const int x_80 = a;
+      if ((x_79 <= x_80)) {
+      } else {
+        break;
+      }
+      if ((b <= 5)) {
+        const int x_87 = b;
+        const int x_90 = data[b];
+        temp[x_87] = x_90;
+        b = (b + 2);
+      }
+    }
+  }
+  i = 0;
+  {
+    for(; (i < 3); i = (i + 1)) {
+      const int x_101 = i;
+      const int x_103 = temp[0];
+      data[x_101] = (x_103 + 1);
+    }
+  }
+  const int x_109 = temp[0];
+  const bool x_110 = (x_109 == 5);
+  x_116_phi = x_110;
+  if (x_110) {
+    const int x_114 = data[0];
+    x_115 = (x_114 == 6);
+    x_116_phi = x_115;
+  }
+  if (x_116_phi) {
+    return 1.0f;
+  } else {
+    return 0.0f;
+  }
+  return 0.0f;
+}
+
+void main_1() {
+  int i_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  i_1 = 0;
+  {
+    for(; (i_1 < 6); i_1 = (i_1 + 1)) {
+      param = i_1;
+      const float x_55 = func_i1_(param);
+      param_1 = i_1;
+      const float x_57 = func_i1_(param_1);
+      if ((x_57 == 1.0f)) {
+        x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+      } else {
+        x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array-2/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array-2/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..106d158
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array-2/0-opt.spvasm.expected.msl
@@ -0,0 +1,121 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  int arr[9];
+};
+struct tint_array_wrapper_1 {
+  int arr[7];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float func_i1_(thread int* const a, thread tint_array_wrapper* const tint_symbol_5, thread float4* const tint_symbol_6, thread tint_array_wrapper_1* const tint_symbol_7) {
+  int b = 0;
+  int i = 0;
+  bool x_115 = false;
+  bool x_116_phi = false;
+  b = 0;
+  (*(tint_symbol_5)).arr[0] = 5;
+  (*(tint_symbol_5)).arr[2] = 0;
+  (*(tint_symbol_5)).arr[4] = 0;
+  (*(tint_symbol_5)).arr[6] = 0;
+  (*(tint_symbol_5)).arr[8] = 0;
+  float const x_71 = (*(tint_symbol_6)).x;
+  if ((x_71 >= 0.0f)) {
+    while (true) {
+      int const x_79 = b;
+      int const x_80 = *(a);
+      if ((x_79 <= x_80)) {
+      } else {
+        break;
+      }
+      int const x_83 = b;
+      if ((x_83 <= 5)) {
+        int const x_87 = b;
+        int const x_88 = b;
+        int const x_90 = (*(tint_symbol_5)).arr[x_88];
+        (*(tint_symbol_7)).arr[x_87] = x_90;
+        int const x_92 = b;
+        b = (x_92 + 2);
+      }
+    }
+  }
+  i = 0;
+  while (true) {
+    int const x_98 = i;
+    if ((x_98 < 3)) {
+    } else {
+      break;
+    }
+    int const x_101 = i;
+    int const x_103 = (*(tint_symbol_7)).arr[0];
+    (*(tint_symbol_5)).arr[x_101] = (x_103 + 1);
+    {
+      int const x_106 = i;
+      i = (x_106 + 1);
+    }
+  }
+  int const x_109 = (*(tint_symbol_7)).arr[0];
+  bool const x_110 = (x_109 == 5);
+  x_116_phi = x_110;
+  if (x_110) {
+    int const x_114 = (*(tint_symbol_5)).arr[0];
+    x_115 = (x_114 == 6);
+    x_116_phi = x_115;
+  }
+  bool const x_116 = x_116_phi;
+  if (x_116) {
+    return 1.0f;
+  } else {
+    return 0.0f;
+  }
+  return 0.0f;
+}
+
+void main_1(thread tint_array_wrapper* const tint_symbol_8, thread float4* const tint_symbol_9, thread tint_array_wrapper_1* const tint_symbol_10, thread float4* const tint_symbol_11) {
+  int i_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  i_1 = 0;
+  while (true) {
+    int const x_51 = i_1;
+    if ((x_51 < 6)) {
+    } else {
+      break;
+    }
+    int const x_54 = i_1;
+    param = x_54;
+    float const x_55 = func_i1_(&(param), tint_symbol_8, tint_symbol_9, tint_symbol_10);
+    int const x_56 = i_1;
+    param_1 = x_56;
+    float const x_57 = func_i1_(&(param_1), tint_symbol_8, tint_symbol_9, tint_symbol_10);
+    if ((x_57 == 1.0f)) {
+      *(tint_symbol_11) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    } else {
+      *(tint_symbol_11) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    }
+    {
+      int const x_62 = i_1;
+      i_1 = (x_62 + 1);
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_12 = 0.0f;
+  thread tint_array_wrapper tint_symbol_13 = {};
+  thread tint_array_wrapper_1 tint_symbol_14 = {};
+  thread float4 tint_symbol_15 = 0.0f;
+  tint_symbol_12 = gl_FragCoord_param;
+  main_1(&(tint_symbol_13), &(tint_symbol_12), &(tint_symbol_14), &(tint_symbol_15));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_15};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array-2/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array-2/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..0129c00
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array-2/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,258 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 153
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %data "data"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %temp "temp"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %func_i1_ "func_i1_"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %i "i"
+               OpName %x_115 "x_115"
+               OpName %x_116_phi "x_116_phi"
+               OpName %main_1 "main_1"
+               OpName %i_1 "i_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %_arr_int_uint_9 ArrayStride 4
+               OpDecorate %_arr_int_uint_7 ArrayStride 4
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_9 = OpConstant %uint 9
+%_arr_int_uint_9 = OpTypeArray %int %uint_9
+%_ptr_Private__arr_int_uint_9 = OpTypePointer Private %_arr_int_uint_9
+          %7 = OpConstantNull %_arr_int_uint_9
+       %data = OpVariable %_ptr_Private__arr_int_uint_9 Private %7
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %12
+     %uint_7 = OpConstant %uint 7
+%_arr_int_uint_7 = OpTypeArray %int %uint_7
+%_ptr_Private__arr_int_uint_7 = OpTypePointer Private %_arr_int_uint_7
+         %17 = OpConstantNull %_arr_int_uint_7
+       %temp = OpVariable %_ptr_Private__arr_int_uint_7 Private %17
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %12
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpTypeFunction %float %_ptr_Function_int
+         %29 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %34 = OpConstantNull %bool
+      %int_0 = OpConstant %int 0
+%_ptr_Private_int = OpTypePointer Private %int
+      %int_5 = OpConstant %int 5
+      %int_2 = OpConstant %int 2
+      %int_4 = OpConstant %int 4
+      %int_6 = OpConstant %int 6
+      %int_8 = OpConstant %int 8
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+      %int_3 = OpConstant %int 3
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+       %void = OpTypeVoid
+        %110 = OpTypeFunction %void
+        %136 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %137 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+        %140 = OpTypeFunction %void %main_out
+   %func_i1_ = OpFunction %float None %23
+          %a = OpFunctionParameter %_ptr_Function_int
+         %27 = OpLabel
+          %b = OpVariable %_ptr_Function_int Function %29
+          %i = OpVariable %_ptr_Function_int Function %29
+      %x_115 = OpVariable %_ptr_Function_bool Function %34
+  %x_116_phi = OpVariable %_ptr_Function_bool Function %34
+               OpStore %b %int_0
+         %38 = OpAccessChain %_ptr_Private_int %data %int_0
+               OpStore %38 %int_5
+         %41 = OpAccessChain %_ptr_Private_int %data %int_2
+               OpStore %41 %int_0
+         %43 = OpAccessChain %_ptr_Private_int %data %int_4
+               OpStore %43 %int_0
+         %45 = OpAccessChain %_ptr_Private_int %data %int_6
+               OpStore %45 %int_0
+         %47 = OpAccessChain %_ptr_Private_int %data %int_8
+               OpStore %47 %int_0
+         %50 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %51 = OpLoad %float %50
+         %53 = OpFOrdGreaterThanEqual %bool %51 %float_0
+               OpSelectionMerge %54 None
+               OpBranchConditional %53 %55 %54
+         %55 = OpLabel
+               OpBranch %56
+         %56 = OpLabel
+               OpLoopMerge %57 %58 None
+               OpBranch %59
+         %59 = OpLabel
+         %60 = OpLoad %int %b
+         %62 = OpLoad %int %a
+         %63 = OpSLessThanEqual %bool %60 %62
+               OpSelectionMerge %64 None
+               OpBranchConditional %63 %65 %66
+         %65 = OpLabel
+               OpBranch %64
+         %66 = OpLabel
+               OpBranch %57
+         %64 = OpLabel
+         %67 = OpLoad %int %b
+         %68 = OpSLessThanEqual %bool %67 %int_5
+               OpSelectionMerge %69 None
+               OpBranchConditional %68 %70 %69
+         %70 = OpLabel
+         %71 = OpLoad %int %b
+         %72 = OpLoad %int %b
+         %73 = OpAccessChain %_ptr_Private_int %data %72
+         %74 = OpLoad %int %73
+         %75 = OpAccessChain %_ptr_Private_int %temp %71
+               OpStore %75 %74
+         %76 = OpLoad %int %b
+         %77 = OpIAdd %int %76 %int_2
+               OpStore %b %77
+               OpBranch %69
+         %69 = OpLabel
+               OpBranch %58
+         %58 = OpLabel
+               OpBranch %56
+         %57 = OpLabel
+               OpBranch %54
+         %54 = OpLabel
+               OpStore %i %int_0
+               OpBranch %78
+         %78 = OpLabel
+               OpLoopMerge %79 %80 None
+               OpBranch %81
+         %81 = OpLabel
+         %82 = OpLoad %int %i
+         %84 = OpSLessThan %bool %82 %int_3
+               OpSelectionMerge %85 None
+               OpBranchConditional %84 %86 %87
+         %86 = OpLabel
+               OpBranch %85
+         %87 = OpLabel
+               OpBranch %79
+         %85 = OpLabel
+         %88 = OpLoad %int %i
+         %89 = OpAccessChain %_ptr_Private_int %temp %int_0
+         %90 = OpLoad %int %89
+         %91 = OpAccessChain %_ptr_Private_int %data %88
+         %93 = OpIAdd %int %90 %int_1
+               OpStore %91 %93
+               OpBranch %80
+         %80 = OpLabel
+         %94 = OpLoad %int %i
+         %95 = OpIAdd %int %94 %int_1
+               OpStore %i %95
+               OpBranch %78
+         %79 = OpLabel
+         %96 = OpAccessChain %_ptr_Private_int %temp %int_0
+         %97 = OpLoad %int %96
+         %98 = OpIEqual %bool %97 %int_5
+               OpStore %x_116_phi %98
+               OpSelectionMerge %99 None
+               OpBranchConditional %98 %100 %99
+        %100 = OpLabel
+        %101 = OpAccessChain %_ptr_Private_int %data %int_0
+        %102 = OpLoad %int %101
+        %103 = OpIEqual %bool %102 %int_6
+               OpStore %x_115 %103
+        %104 = OpLoad %bool %x_115
+               OpStore %x_116_phi %104
+               OpBranch %99
+         %99 = OpLabel
+        %105 = OpLoad %bool %x_116_phi
+               OpSelectionMerge %106 None
+               OpBranchConditional %105 %107 %108
+        %107 = OpLabel
+               OpReturnValue %float_1
+        %108 = OpLabel
+               OpReturnValue %float_0
+        %106 = OpLabel
+               OpReturnValue %float_0
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %110
+        %113 = OpLabel
+        %i_1 = OpVariable %_ptr_Function_int Function %29
+      %param = OpVariable %_ptr_Function_int Function %29
+    %param_1 = OpVariable %_ptr_Function_int Function %29
+               OpStore %i_1 %int_0
+               OpBranch %117
+        %117 = OpLabel
+               OpLoopMerge %118 %119 None
+               OpBranch %120
+        %120 = OpLabel
+        %121 = OpLoad %int %i_1
+        %122 = OpSLessThan %bool %121 %int_6
+               OpSelectionMerge %123 None
+               OpBranchConditional %122 %124 %125
+        %124 = OpLabel
+               OpBranch %123
+        %125 = OpLabel
+               OpBranch %118
+        %123 = OpLabel
+        %126 = OpLoad %int %i_1
+               OpStore %param %126
+        %127 = OpFunctionCall %float %func_i1_ %param
+        %129 = OpLoad %int %i_1
+               OpStore %param_1 %129
+        %130 = OpFunctionCall %float %func_i1_ %param_1
+        %132 = OpFOrdEqual %bool %130 %float_1
+               OpSelectionMerge %133 None
+               OpBranchConditional %132 %134 %135
+        %134 = OpLabel
+               OpStore %x_GLF_color %136
+               OpBranch %133
+        %135 = OpLabel
+               OpStore %x_GLF_color %137
+               OpBranch %133
+        %133 = OpLabel
+               OpBranch %119
+        %119 = OpLabel
+        %138 = OpLoad %int %i_1
+        %139 = OpIAdd %int %138 %int_1
+               OpStore %i_1 %139
+               OpBranch %117
+        %118 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %140
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %144 = OpLabel
+        %145 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %145
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %110
+        %147 = OpLabel
+        %148 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %148
+        %149 = OpFunctionCall %void %main_1
+        %151 = OpLoad %v4float %x_GLF_color
+        %152 = OpCompositeConstruct %main_out %151
+        %150 = OpFunctionCall %void %tint_symbol_3 %152
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array-2/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array-2/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..a09f0d4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array-2/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,114 @@
+var<private> data : array<i32, 9>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> temp : array<i32, 7>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_i1_(a : ptr<function, i32>) -> f32 {
+  var b : i32;
+  var i : i32;
+  var x_115 : bool;
+  var x_116_phi : bool;
+  b = 0;
+  data[0] = 5;
+  data[2] = 0;
+  data[4] = 0;
+  data[6] = 0;
+  data[8] = 0;
+  let x_71 : f32 = gl_FragCoord.x;
+  if ((x_71 >= 0.0)) {
+    loop {
+      let x_79 : i32 = b;
+      let x_80 : i32 = *(a);
+      if ((x_79 <= x_80)) {
+      } else {
+        break;
+      }
+      let x_83 : i32 = b;
+      if ((x_83 <= 5)) {
+        let x_87 : i32 = b;
+        let x_88 : i32 = b;
+        let x_90 : i32 = data[x_88];
+        temp[x_87] = x_90;
+        let x_92 : i32 = b;
+        b = (x_92 + 2);
+      }
+    }
+  }
+  i = 0;
+  loop {
+    let x_98 : i32 = i;
+    if ((x_98 < 3)) {
+    } else {
+      break;
+    }
+    let x_101 : i32 = i;
+    let x_103 : i32 = temp[0];
+    data[x_101] = (x_103 + 1);
+
+    continuing {
+      let x_106 : i32 = i;
+      i = (x_106 + 1);
+    }
+  }
+  let x_109 : i32 = temp[0];
+  let x_110 : bool = (x_109 == 5);
+  x_116_phi = x_110;
+  if (x_110) {
+    let x_114 : i32 = data[0];
+    x_115 = (x_114 == 6);
+    x_116_phi = x_115;
+  }
+  let x_116 : bool = x_116_phi;
+  if (x_116) {
+    return 1.0;
+  } else {
+    return 0.0;
+  }
+  return 0.0;
+}
+
+fn main_1() {
+  var i_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  i_1 = 0;
+  loop {
+    let x_51 : i32 = i_1;
+    if ((x_51 < 6)) {
+    } else {
+      break;
+    }
+    let x_54 : i32 = i_1;
+    param = x_54;
+    let x_55 : f32 = func_i1_(&(param));
+    let x_56 : i32 = i_1;
+    param_1 = x_56;
+    let x_57 : f32 = func_i1_(&(param_1));
+    if ((x_57 == 1.0)) {
+      x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    } else {
+      x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+    }
+
+    continuing {
+      let x_62 : i32 = i_1;
+      i_1 = (x_62 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array-2/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array-2/0-opt.wgsl
new file mode 100644
index 0000000..a09f0d4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array-2/0-opt.wgsl
@@ -0,0 +1,114 @@
+var<private> data : array<i32, 9>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> temp : array<i32, 7>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_i1_(a : ptr<function, i32>) -> f32 {
+  var b : i32;
+  var i : i32;
+  var x_115 : bool;
+  var x_116_phi : bool;
+  b = 0;
+  data[0] = 5;
+  data[2] = 0;
+  data[4] = 0;
+  data[6] = 0;
+  data[8] = 0;
+  let x_71 : f32 = gl_FragCoord.x;
+  if ((x_71 >= 0.0)) {
+    loop {
+      let x_79 : i32 = b;
+      let x_80 : i32 = *(a);
+      if ((x_79 <= x_80)) {
+      } else {
+        break;
+      }
+      let x_83 : i32 = b;
+      if ((x_83 <= 5)) {
+        let x_87 : i32 = b;
+        let x_88 : i32 = b;
+        let x_90 : i32 = data[x_88];
+        temp[x_87] = x_90;
+        let x_92 : i32 = b;
+        b = (x_92 + 2);
+      }
+    }
+  }
+  i = 0;
+  loop {
+    let x_98 : i32 = i;
+    if ((x_98 < 3)) {
+    } else {
+      break;
+    }
+    let x_101 : i32 = i;
+    let x_103 : i32 = temp[0];
+    data[x_101] = (x_103 + 1);
+
+    continuing {
+      let x_106 : i32 = i;
+      i = (x_106 + 1);
+    }
+  }
+  let x_109 : i32 = temp[0];
+  let x_110 : bool = (x_109 == 5);
+  x_116_phi = x_110;
+  if (x_110) {
+    let x_114 : i32 = data[0];
+    x_115 = (x_114 == 6);
+    x_116_phi = x_115;
+  }
+  let x_116 : bool = x_116_phi;
+  if (x_116) {
+    return 1.0;
+  } else {
+    return 0.0;
+  }
+  return 0.0;
+}
+
+fn main_1() {
+  var i_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  i_1 = 0;
+  loop {
+    let x_51 : i32 = i_1;
+    if ((x_51 < 6)) {
+    } else {
+      break;
+    }
+    let x_54 : i32 = i_1;
+    param = x_54;
+    let x_55 : f32 = func_i1_(&(param));
+    let x_56 : i32 = i_1;
+    param_1 = x_56;
+    let x_57 : f32 = func_i1_(&(param_1));
+    if ((x_57 == 1.0)) {
+      x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    } else {
+      x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+    }
+
+    continuing {
+      let x_62 : i32 = i_1;
+      i_1 = (x_62 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array-2/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array-2/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..b2bb718
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array-2/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,96 @@
+static int data[9] = (int[9])0;
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static int temp[7] = (int[7])0;
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float func_i1_(inout int a) {
+  int b = 0;
+  int i = 0;
+  bool x_115 = false;
+  bool x_116_phi = false;
+  b = 0;
+  data[0] = 5;
+  data[2] = 0;
+  data[4] = 0;
+  data[6] = 0;
+  data[8] = 0;
+  const float x_71 = gl_FragCoord.x;
+  if ((x_71 >= 0.0f)) {
+    while (true) {
+      const int x_79 = b;
+      const int x_80 = a;
+      if ((x_79 <= x_80)) {
+      } else {
+        break;
+      }
+      if ((b <= 5)) {
+        const int x_87 = b;
+        const int x_90 = data[b];
+        temp[x_87] = x_90;
+        b = (b + 2);
+      }
+    }
+  }
+  i = 0;
+  {
+    for(; (i < 3); i = (i + 1)) {
+      const int x_101 = i;
+      const int x_103 = temp[0];
+      data[x_101] = (x_103 + 1);
+    }
+  }
+  const int x_109 = temp[0];
+  const bool x_110 = (x_109 == 5);
+  x_116_phi = x_110;
+  if (x_110) {
+    const int x_114 = data[0];
+    x_115 = (x_114 == 6);
+    x_116_phi = x_115;
+  }
+  if (x_116_phi) {
+    return 1.0f;
+  } else {
+    return 0.0f;
+  }
+  return 0.0f;
+}
+
+void main_1() {
+  int i_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  i_1 = 0;
+  {
+    for(; (i_1 < 6); i_1 = (i_1 + 1)) {
+      param = i_1;
+      const float x_55 = func_i1_(param);
+      param_1 = i_1;
+      const float x_57 = func_i1_(param_1);
+      if ((x_57 == 1.0f)) {
+        x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+      } else {
+        x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array-2/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array-2/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..106d158
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array-2/0-opt.wgsl.expected.msl
@@ -0,0 +1,121 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  int arr[9];
+};
+struct tint_array_wrapper_1 {
+  int arr[7];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float func_i1_(thread int* const a, thread tint_array_wrapper* const tint_symbol_5, thread float4* const tint_symbol_6, thread tint_array_wrapper_1* const tint_symbol_7) {
+  int b = 0;
+  int i = 0;
+  bool x_115 = false;
+  bool x_116_phi = false;
+  b = 0;
+  (*(tint_symbol_5)).arr[0] = 5;
+  (*(tint_symbol_5)).arr[2] = 0;
+  (*(tint_symbol_5)).arr[4] = 0;
+  (*(tint_symbol_5)).arr[6] = 0;
+  (*(tint_symbol_5)).arr[8] = 0;
+  float const x_71 = (*(tint_symbol_6)).x;
+  if ((x_71 >= 0.0f)) {
+    while (true) {
+      int const x_79 = b;
+      int const x_80 = *(a);
+      if ((x_79 <= x_80)) {
+      } else {
+        break;
+      }
+      int const x_83 = b;
+      if ((x_83 <= 5)) {
+        int const x_87 = b;
+        int const x_88 = b;
+        int const x_90 = (*(tint_symbol_5)).arr[x_88];
+        (*(tint_symbol_7)).arr[x_87] = x_90;
+        int const x_92 = b;
+        b = (x_92 + 2);
+      }
+    }
+  }
+  i = 0;
+  while (true) {
+    int const x_98 = i;
+    if ((x_98 < 3)) {
+    } else {
+      break;
+    }
+    int const x_101 = i;
+    int const x_103 = (*(tint_symbol_7)).arr[0];
+    (*(tint_symbol_5)).arr[x_101] = (x_103 + 1);
+    {
+      int const x_106 = i;
+      i = (x_106 + 1);
+    }
+  }
+  int const x_109 = (*(tint_symbol_7)).arr[0];
+  bool const x_110 = (x_109 == 5);
+  x_116_phi = x_110;
+  if (x_110) {
+    int const x_114 = (*(tint_symbol_5)).arr[0];
+    x_115 = (x_114 == 6);
+    x_116_phi = x_115;
+  }
+  bool const x_116 = x_116_phi;
+  if (x_116) {
+    return 1.0f;
+  } else {
+    return 0.0f;
+  }
+  return 0.0f;
+}
+
+void main_1(thread tint_array_wrapper* const tint_symbol_8, thread float4* const tint_symbol_9, thread tint_array_wrapper_1* const tint_symbol_10, thread float4* const tint_symbol_11) {
+  int i_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  i_1 = 0;
+  while (true) {
+    int const x_51 = i_1;
+    if ((x_51 < 6)) {
+    } else {
+      break;
+    }
+    int const x_54 = i_1;
+    param = x_54;
+    float const x_55 = func_i1_(&(param), tint_symbol_8, tint_symbol_9, tint_symbol_10);
+    int const x_56 = i_1;
+    param_1 = x_56;
+    float const x_57 = func_i1_(&(param_1), tint_symbol_8, tint_symbol_9, tint_symbol_10);
+    if ((x_57 == 1.0f)) {
+      *(tint_symbol_11) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    } else {
+      *(tint_symbol_11) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    }
+    {
+      int const x_62 = i_1;
+      i_1 = (x_62 + 1);
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_12 = 0.0f;
+  thread tint_array_wrapper tint_symbol_13 = {};
+  thread tint_array_wrapper_1 tint_symbol_14 = {};
+  thread float4 tint_symbol_15 = 0.0f;
+  tint_symbol_12 = gl_FragCoord_param;
+  main_1(&(tint_symbol_13), &(tint_symbol_12), &(tint_symbol_14), &(tint_symbol_15));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_15};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array-2/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array-2/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..0129c00
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array-2/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,258 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 153
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %data "data"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %temp "temp"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %func_i1_ "func_i1_"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %i "i"
+               OpName %x_115 "x_115"
+               OpName %x_116_phi "x_116_phi"
+               OpName %main_1 "main_1"
+               OpName %i_1 "i_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %_arr_int_uint_9 ArrayStride 4
+               OpDecorate %_arr_int_uint_7 ArrayStride 4
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_9 = OpConstant %uint 9
+%_arr_int_uint_9 = OpTypeArray %int %uint_9
+%_ptr_Private__arr_int_uint_9 = OpTypePointer Private %_arr_int_uint_9
+          %7 = OpConstantNull %_arr_int_uint_9
+       %data = OpVariable %_ptr_Private__arr_int_uint_9 Private %7
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %12
+     %uint_7 = OpConstant %uint 7
+%_arr_int_uint_7 = OpTypeArray %int %uint_7
+%_ptr_Private__arr_int_uint_7 = OpTypePointer Private %_arr_int_uint_7
+         %17 = OpConstantNull %_arr_int_uint_7
+       %temp = OpVariable %_ptr_Private__arr_int_uint_7 Private %17
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %12
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpTypeFunction %float %_ptr_Function_int
+         %29 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %34 = OpConstantNull %bool
+      %int_0 = OpConstant %int 0
+%_ptr_Private_int = OpTypePointer Private %int
+      %int_5 = OpConstant %int 5
+      %int_2 = OpConstant %int 2
+      %int_4 = OpConstant %int 4
+      %int_6 = OpConstant %int 6
+      %int_8 = OpConstant %int 8
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+      %int_3 = OpConstant %int 3
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+       %void = OpTypeVoid
+        %110 = OpTypeFunction %void
+        %136 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %137 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+        %140 = OpTypeFunction %void %main_out
+   %func_i1_ = OpFunction %float None %23
+          %a = OpFunctionParameter %_ptr_Function_int
+         %27 = OpLabel
+          %b = OpVariable %_ptr_Function_int Function %29
+          %i = OpVariable %_ptr_Function_int Function %29
+      %x_115 = OpVariable %_ptr_Function_bool Function %34
+  %x_116_phi = OpVariable %_ptr_Function_bool Function %34
+               OpStore %b %int_0
+         %38 = OpAccessChain %_ptr_Private_int %data %int_0
+               OpStore %38 %int_5
+         %41 = OpAccessChain %_ptr_Private_int %data %int_2
+               OpStore %41 %int_0
+         %43 = OpAccessChain %_ptr_Private_int %data %int_4
+               OpStore %43 %int_0
+         %45 = OpAccessChain %_ptr_Private_int %data %int_6
+               OpStore %45 %int_0
+         %47 = OpAccessChain %_ptr_Private_int %data %int_8
+               OpStore %47 %int_0
+         %50 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %51 = OpLoad %float %50
+         %53 = OpFOrdGreaterThanEqual %bool %51 %float_0
+               OpSelectionMerge %54 None
+               OpBranchConditional %53 %55 %54
+         %55 = OpLabel
+               OpBranch %56
+         %56 = OpLabel
+               OpLoopMerge %57 %58 None
+               OpBranch %59
+         %59 = OpLabel
+         %60 = OpLoad %int %b
+         %62 = OpLoad %int %a
+         %63 = OpSLessThanEqual %bool %60 %62
+               OpSelectionMerge %64 None
+               OpBranchConditional %63 %65 %66
+         %65 = OpLabel
+               OpBranch %64
+         %66 = OpLabel
+               OpBranch %57
+         %64 = OpLabel
+         %67 = OpLoad %int %b
+         %68 = OpSLessThanEqual %bool %67 %int_5
+               OpSelectionMerge %69 None
+               OpBranchConditional %68 %70 %69
+         %70 = OpLabel
+         %71 = OpLoad %int %b
+         %72 = OpLoad %int %b
+         %73 = OpAccessChain %_ptr_Private_int %data %72
+         %74 = OpLoad %int %73
+         %75 = OpAccessChain %_ptr_Private_int %temp %71
+               OpStore %75 %74
+         %76 = OpLoad %int %b
+         %77 = OpIAdd %int %76 %int_2
+               OpStore %b %77
+               OpBranch %69
+         %69 = OpLabel
+               OpBranch %58
+         %58 = OpLabel
+               OpBranch %56
+         %57 = OpLabel
+               OpBranch %54
+         %54 = OpLabel
+               OpStore %i %int_0
+               OpBranch %78
+         %78 = OpLabel
+               OpLoopMerge %79 %80 None
+               OpBranch %81
+         %81 = OpLabel
+         %82 = OpLoad %int %i
+         %84 = OpSLessThan %bool %82 %int_3
+               OpSelectionMerge %85 None
+               OpBranchConditional %84 %86 %87
+         %86 = OpLabel
+               OpBranch %85
+         %87 = OpLabel
+               OpBranch %79
+         %85 = OpLabel
+         %88 = OpLoad %int %i
+         %89 = OpAccessChain %_ptr_Private_int %temp %int_0
+         %90 = OpLoad %int %89
+         %91 = OpAccessChain %_ptr_Private_int %data %88
+         %93 = OpIAdd %int %90 %int_1
+               OpStore %91 %93
+               OpBranch %80
+         %80 = OpLabel
+         %94 = OpLoad %int %i
+         %95 = OpIAdd %int %94 %int_1
+               OpStore %i %95
+               OpBranch %78
+         %79 = OpLabel
+         %96 = OpAccessChain %_ptr_Private_int %temp %int_0
+         %97 = OpLoad %int %96
+         %98 = OpIEqual %bool %97 %int_5
+               OpStore %x_116_phi %98
+               OpSelectionMerge %99 None
+               OpBranchConditional %98 %100 %99
+        %100 = OpLabel
+        %101 = OpAccessChain %_ptr_Private_int %data %int_0
+        %102 = OpLoad %int %101
+        %103 = OpIEqual %bool %102 %int_6
+               OpStore %x_115 %103
+        %104 = OpLoad %bool %x_115
+               OpStore %x_116_phi %104
+               OpBranch %99
+         %99 = OpLabel
+        %105 = OpLoad %bool %x_116_phi
+               OpSelectionMerge %106 None
+               OpBranchConditional %105 %107 %108
+        %107 = OpLabel
+               OpReturnValue %float_1
+        %108 = OpLabel
+               OpReturnValue %float_0
+        %106 = OpLabel
+               OpReturnValue %float_0
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %110
+        %113 = OpLabel
+        %i_1 = OpVariable %_ptr_Function_int Function %29
+      %param = OpVariable %_ptr_Function_int Function %29
+    %param_1 = OpVariable %_ptr_Function_int Function %29
+               OpStore %i_1 %int_0
+               OpBranch %117
+        %117 = OpLabel
+               OpLoopMerge %118 %119 None
+               OpBranch %120
+        %120 = OpLabel
+        %121 = OpLoad %int %i_1
+        %122 = OpSLessThan %bool %121 %int_6
+               OpSelectionMerge %123 None
+               OpBranchConditional %122 %124 %125
+        %124 = OpLabel
+               OpBranch %123
+        %125 = OpLabel
+               OpBranch %118
+        %123 = OpLabel
+        %126 = OpLoad %int %i_1
+               OpStore %param %126
+        %127 = OpFunctionCall %float %func_i1_ %param
+        %129 = OpLoad %int %i_1
+               OpStore %param_1 %129
+        %130 = OpFunctionCall %float %func_i1_ %param_1
+        %132 = OpFOrdEqual %bool %130 %float_1
+               OpSelectionMerge %133 None
+               OpBranchConditional %132 %134 %135
+        %134 = OpLabel
+               OpStore %x_GLF_color %136
+               OpBranch %133
+        %135 = OpLabel
+               OpStore %x_GLF_color %137
+               OpBranch %133
+        %133 = OpLabel
+               OpBranch %119
+        %119 = OpLabel
+        %138 = OpLoad %int %i_1
+        %139 = OpIAdd %int %138 %int_1
+               OpStore %i_1 %139
+               OpBranch %117
+        %118 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %140
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %144 = OpLabel
+        %145 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %145
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %110
+        %147 = OpLabel
+        %148 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %148
+        %149 = OpFunctionCall %void %main_1
+        %151 = OpLoad %v4float %x_GLF_color
+        %152 = OpCompositeConstruct %main_out %151
+        %150 = OpFunctionCall %void %tint_symbol_3 %152
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array-2/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array-2/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..a09f0d4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array-2/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,114 @@
+var<private> data : array<i32, 9>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> temp : array<i32, 7>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_i1_(a : ptr<function, i32>) -> f32 {
+  var b : i32;
+  var i : i32;
+  var x_115 : bool;
+  var x_116_phi : bool;
+  b = 0;
+  data[0] = 5;
+  data[2] = 0;
+  data[4] = 0;
+  data[6] = 0;
+  data[8] = 0;
+  let x_71 : f32 = gl_FragCoord.x;
+  if ((x_71 >= 0.0)) {
+    loop {
+      let x_79 : i32 = b;
+      let x_80 : i32 = *(a);
+      if ((x_79 <= x_80)) {
+      } else {
+        break;
+      }
+      let x_83 : i32 = b;
+      if ((x_83 <= 5)) {
+        let x_87 : i32 = b;
+        let x_88 : i32 = b;
+        let x_90 : i32 = data[x_88];
+        temp[x_87] = x_90;
+        let x_92 : i32 = b;
+        b = (x_92 + 2);
+      }
+    }
+  }
+  i = 0;
+  loop {
+    let x_98 : i32 = i;
+    if ((x_98 < 3)) {
+    } else {
+      break;
+    }
+    let x_101 : i32 = i;
+    let x_103 : i32 = temp[0];
+    data[x_101] = (x_103 + 1);
+
+    continuing {
+      let x_106 : i32 = i;
+      i = (x_106 + 1);
+    }
+  }
+  let x_109 : i32 = temp[0];
+  let x_110 : bool = (x_109 == 5);
+  x_116_phi = x_110;
+  if (x_110) {
+    let x_114 : i32 = data[0];
+    x_115 = (x_114 == 6);
+    x_116_phi = x_115;
+  }
+  let x_116 : bool = x_116_phi;
+  if (x_116) {
+    return 1.0;
+  } else {
+    return 0.0;
+  }
+  return 0.0;
+}
+
+fn main_1() {
+  var i_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  i_1 = 0;
+  loop {
+    let x_51 : i32 = i_1;
+    if ((x_51 < 6)) {
+    } else {
+      break;
+    }
+    let x_54 : i32 = i_1;
+    param = x_54;
+    let x_55 : f32 = func_i1_(&(param));
+    let x_56 : i32 = i_1;
+    param_1 = x_56;
+    let x_57 : f32 = func_i1_(&(param_1));
+    if ((x_57 == 1.0)) {
+      x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    } else {
+      x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+    }
+
+    continuing {
+      let x_62 : i32 = i_1;
+      i_1 = (x_62 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array/0-opt.spvasm
new file mode 100644
index 0000000..ff91ed1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array/0-opt.spvasm
@@ -0,0 +1,159 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %func_i1_ "func(i1;"
+               OpName %x "x"
+               OpName %a "a"
+               OpName %data "data"
+               OpName %temp "temp"
+               OpName %i "i"
+               OpName %_GLF_color "_GLF_color"
+               OpName %i_0 "i"
+               OpName %param "param"
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %16 = OpTypeFunction %void %_ptr_Function_int
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_9 = OpConstant %uint 9
+%_arr_int_uint_9 = OpTypeArray %int %uint_9
+%_ptr_Function__arr_int_uint_9 = OpTypePointer Function %_arr_int_uint_9
+      %int_5 = OpConstant %int 5
+       %bool = OpTypeBool
+     %int_10 = OpConstant %int 10
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+%_ptr_Function__arr_int_uint_2 = OpTypePointer Function %_arr_int_uint_2
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+      %int_6 = OpConstant %int 6
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %36 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %37 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %13
+         %38 = OpLabel
+        %i_0 = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_int Function
+               OpStore %i_0 %int_1
+               OpBranch %39
+         %39 = OpLabel
+               OpLoopMerge %40 %41 None
+               OpBranch %42
+         %42 = OpLabel
+         %43 = OpLoad %int %i_0
+         %44 = OpSLessThan %bool %43 %int_6
+               OpBranchConditional %44 %45 %40
+         %45 = OpLabel
+         %46 = OpLoad %int %i_0
+               OpStore %param %46
+         %47 = OpFunctionCall %void %func_i1_ %param
+               OpBranch %41
+         %41 = OpLabel
+         %48 = OpLoad %int %i_0
+         %49 = OpIAdd %int %48 %int_1
+               OpStore %i_0 %49
+               OpBranch %39
+         %40 = OpLabel
+               OpReturn
+               OpFunctionEnd
+   %func_i1_ = OpFunction %void None %16
+          %x = OpFunctionParameter %_ptr_Function_int
+         %50 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+       %data = OpVariable %_ptr_Function__arr_int_uint_9 Function
+       %temp = OpVariable %_ptr_Function__arr_int_uint_2 Function
+          %i = OpVariable %_ptr_Function_int Function
+               OpStore %a %int_0
+         %51 = OpAccessChain %_ptr_Function_int %data %int_0
+               OpStore %51 %int_5
+               OpBranch %52
+         %52 = OpLabel
+               OpLoopMerge %53 %54 None
+               OpBranch %55
+         %55 = OpLabel
+         %56 = OpLoad %int %a
+         %57 = OpLoad %int %x
+         %58 = OpSLessThanEqual %bool %56 %57
+               OpBranchConditional %58 %59 %53
+         %59 = OpLabel
+         %60 = OpLoad %int %a
+         %61 = OpSLessThanEqual %bool %60 %int_10
+               OpSelectionMerge %62 None
+               OpBranchConditional %61 %63 %62
+         %63 = OpLabel
+         %64 = OpLoad %int %a
+         %65 = OpExtInst %int %1 SMin %64 %int_1
+         %66 = OpLoad %int %a
+         %67 = OpExtInst %int %1 SMin %66 %int_0
+         %68 = OpAccessChain %_ptr_Function_int %data %67
+         %69 = OpLoad %int %68
+         %70 = OpAccessChain %_ptr_Function_int %temp %65
+               OpStore %70 %69
+         %71 = OpLoad %int %a
+         %72 = OpIAdd %int %71 %int_1
+               OpStore %a %72
+               OpBranch %62
+         %62 = OpLabel
+               OpBranch %54
+         %54 = OpLabel
+               OpBranch %52
+         %53 = OpLabel
+               OpStore %i %int_0
+               OpBranch %73
+         %73 = OpLabel
+               OpLoopMerge %74 %75 None
+               OpBranch %76
+         %76 = OpLabel
+         %77 = OpLoad %int %i
+         %78 = OpSLessThan %bool %77 %int_2
+               OpBranchConditional %78 %79 %74
+         %79 = OpLabel
+         %80 = OpLoad %int %i
+         %81 = OpAccessChain %_ptr_Function_int %temp %int_0
+         %82 = OpLoad %int %81
+         %83 = OpLoad %int %i
+         %84 = OpIAdd %int %82 %83
+         %85 = OpAccessChain %_ptr_Function_int %data %80
+               OpStore %85 %84
+               OpBranch %75
+         %75 = OpLabel
+         %86 = OpLoad %int %i
+         %87 = OpIAdd %int %86 %int_1
+               OpStore %i %87
+               OpBranch %73
+         %74 = OpLabel
+         %88 = OpAccessChain %_ptr_Function_int %data %int_0
+         %89 = OpLoad %int %88
+         %90 = OpIEqual %bool %89 %int_5
+               OpSelectionMerge %91 None
+               OpBranchConditional %90 %92 %91
+         %92 = OpLabel
+         %93 = OpAccessChain %_ptr_Function_int %data %int_1
+         %94 = OpLoad %int %93
+         %95 = OpIEqual %bool %94 %int_6
+               OpBranch %91
+         %91 = OpLabel
+         %96 = OpPhi %bool %90 %74 %95 %92
+               OpSelectionMerge %97 None
+               OpBranchConditional %96 %98 %99
+         %98 = OpLabel
+               OpStore %_GLF_color %36
+               OpBranch %97
+         %99 = OpLabel
+               OpStore %_GLF_color %37
+               OpBranch %97
+         %97 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..86ba9e9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,75 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void func_i1_(inout int x) {
+  int a = 0;
+  int data[9] = (int[9])0;
+  int temp[2] = (int[2])0;
+  int i = 0;
+  bool x_95 = false;
+  bool x_96_phi = false;
+  a = 0;
+  data[0] = 5;
+  while (true) {
+    const int x_56 = a;
+    const int x_57 = x;
+    if ((x_56 <= x_57)) {
+    } else {
+      break;
+    }
+    if ((a <= 10)) {
+      const int x_64 = a;
+      const int x_69 = data[min(a, 0)];
+      temp[min(x_64, 1)] = x_69;
+      a = (a + 1);
+    }
+  }
+  i = 0;
+  {
+    for(; (i < 2); i = (i + 1)) {
+      const int x_80 = i;
+      const int x_82 = temp[0];
+      data[x_80] = (x_82 + i);
+    }
+  }
+  const int x_89 = data[0];
+  const bool x_90 = (x_89 == 5);
+  x_96_phi = x_90;
+  if (x_90) {
+    const int x_94 = data[1];
+    x_95 = (x_94 == 6);
+    x_96_phi = x_95;
+  }
+  if (x_96_phi) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+void main_1() {
+  int i_1 = 0;
+  int param = 0;
+  i_1 = 1;
+  {
+    for(; (i_1 < 6); i_1 = (i_1 + 1)) {
+      param = i_1;
+      func_i1_(param);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..8260441
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array/0-opt.spvasm.expected.msl
@@ -0,0 +1,104 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  int arr[9];
+};
+struct tint_array_wrapper_1 {
+  int arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void func_i1_(thread int* const x, thread float4* const tint_symbol_4) {
+  int a = 0;
+  tint_array_wrapper data = {};
+  tint_array_wrapper_1 temp = {};
+  int i = 0;
+  bool x_95 = false;
+  bool x_96_phi = false;
+  a = 0;
+  data.arr[0] = 5;
+  while (true) {
+    int const x_56 = a;
+    int const x_57 = *(x);
+    if ((x_56 <= x_57)) {
+    } else {
+      break;
+    }
+    int const x_60 = a;
+    if ((x_60 <= 10)) {
+      int const x_64 = a;
+      int const x_66 = a;
+      int const x_69 = data.arr[min(x_66, 0)];
+      temp.arr[min(x_64, 1)] = x_69;
+      int const x_71 = a;
+      a = (x_71 + 1);
+    }
+  }
+  i = 0;
+  while (true) {
+    int const x_77 = i;
+    if ((x_77 < 2)) {
+    } else {
+      break;
+    }
+    int const x_80 = i;
+    int const x_82 = temp.arr[0];
+    int const x_83 = i;
+    data.arr[x_80] = (x_82 + x_83);
+    {
+      int const x_86 = i;
+      i = (x_86 + 1);
+    }
+  }
+  int const x_89 = data.arr[0];
+  bool const x_90 = (x_89 == 5);
+  x_96_phi = x_90;
+  if (x_90) {
+    int const x_94 = data.arr[1];
+    x_95 = (x_94 == 6);
+    x_96_phi = x_95;
+  }
+  bool const x_96 = x_96_phi;
+  if (x_96) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+void main_1(thread float4* const tint_symbol_5) {
+  int i_1 = 0;
+  int param = 0;
+  i_1 = 1;
+  while (true) {
+    int const x_43 = i_1;
+    if ((x_43 < 6)) {
+    } else {
+      break;
+    }
+    int const x_46 = i_1;
+    param = x_46;
+    func_i1_(&(param), tint_symbol_5);
+    {
+      int const x_48 = i_1;
+      i_1 = (x_48 + 1);
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(&(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..8945024
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,220 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 131
+; Schema: 0
+               OpCapability Shader
+         %56 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_i1_ "func_i1_"
+               OpName %x "x"
+               OpName %a "a"
+               OpName %data "data"
+               OpName %temp "temp"
+               OpName %i "i"
+               OpName %x_95 "x_95"
+               OpName %x_96_phi "x_96_phi"
+               OpName %main_1 "main_1"
+               OpName %i_1 "i_1"
+               OpName %param "param"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_9 ArrayStride 4
+               OpDecorate %_arr_int_uint_2 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+          %8 = OpTypeFunction %void %_ptr_Function_int
+         %16 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_9 = OpConstant %uint 9
+%_arr_int_uint_9 = OpTypeArray %int %uint_9
+%_ptr_Function__arr_int_uint_9 = OpTypePointer Function %_arr_int_uint_9
+         %22 = OpConstantNull %_arr_int_uint_9
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+%_ptr_Function__arr_int_uint_2 = OpTypePointer Function %_arr_int_uint_2
+         %27 = OpConstantNull %_arr_int_uint_2
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %32 = OpConstantNull %bool
+      %int_0 = OpConstant %int 0
+      %int_5 = OpConstant %int 5
+     %int_10 = OpConstant %int 10
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+      %int_6 = OpConstant %int 6
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %98 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %99 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+        %100 = OpTypeFunction %void
+   %main_out = OpTypeStruct %v4float
+        %119 = OpTypeFunction %void %main_out
+   %func_i1_ = OpFunction %void None %8
+          %x = OpFunctionParameter %_ptr_Function_int
+         %14 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %16
+       %data = OpVariable %_ptr_Function__arr_int_uint_9 Function %22
+       %temp = OpVariable %_ptr_Function__arr_int_uint_2 Function %27
+          %i = OpVariable %_ptr_Function_int Function %16
+       %x_95 = OpVariable %_ptr_Function_bool Function %32
+   %x_96_phi = OpVariable %_ptr_Function_bool Function %32
+               OpStore %a %int_0
+         %35 = OpAccessChain %_ptr_Function_int %data %int_0
+               OpStore %35 %int_5
+               OpBranch %37
+         %37 = OpLabel
+               OpLoopMerge %38 %39 None
+               OpBranch %40
+         %40 = OpLabel
+         %41 = OpLoad %int %a
+         %43 = OpLoad %int %x
+         %44 = OpSLessThanEqual %bool %41 %43
+               OpSelectionMerge %45 None
+               OpBranchConditional %44 %46 %47
+         %46 = OpLabel
+               OpBranch %45
+         %47 = OpLabel
+               OpBranch %38
+         %45 = OpLabel
+         %48 = OpLoad %int %a
+         %50 = OpSLessThanEqual %bool %48 %int_10
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %51
+         %52 = OpLabel
+         %53 = OpLoad %int %a
+         %54 = OpLoad %int %a
+         %55 = OpExtInst %int %56 SMin %54 %int_0
+         %57 = OpAccessChain %_ptr_Function_int %data %55
+         %58 = OpLoad %int %57
+         %59 = OpExtInst %int %56 SMin %53 %int_1
+         %61 = OpAccessChain %_ptr_Function_int %temp %59
+               OpStore %61 %58
+         %62 = OpLoad %int %a
+         %63 = OpIAdd %int %62 %int_1
+               OpStore %a %63
+               OpBranch %51
+         %51 = OpLabel
+               OpBranch %39
+         %39 = OpLabel
+               OpBranch %37
+         %38 = OpLabel
+               OpStore %i %int_0
+               OpBranch %64
+         %64 = OpLabel
+               OpLoopMerge %65 %66 None
+               OpBranch %67
+         %67 = OpLabel
+         %68 = OpLoad %int %i
+         %70 = OpSLessThan %bool %68 %int_2
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %73
+         %72 = OpLabel
+               OpBranch %71
+         %73 = OpLabel
+               OpBranch %65
+         %71 = OpLabel
+         %74 = OpLoad %int %i
+         %75 = OpAccessChain %_ptr_Function_int %temp %int_0
+         %76 = OpLoad %int %75
+         %77 = OpLoad %int %i
+         %78 = OpAccessChain %_ptr_Function_int %data %74
+         %79 = OpIAdd %int %76 %77
+               OpStore %78 %79
+               OpBranch %66
+         %66 = OpLabel
+         %80 = OpLoad %int %i
+         %81 = OpIAdd %int %80 %int_1
+               OpStore %i %81
+               OpBranch %64
+         %65 = OpLabel
+         %82 = OpAccessChain %_ptr_Function_int %data %int_0
+         %83 = OpLoad %int %82
+         %84 = OpIEqual %bool %83 %int_5
+               OpStore %x_96_phi %84
+               OpSelectionMerge %85 None
+               OpBranchConditional %84 %86 %85
+         %86 = OpLabel
+         %87 = OpAccessChain %_ptr_Function_int %data %int_1
+         %88 = OpLoad %int %87
+         %90 = OpIEqual %bool %88 %int_6
+               OpStore %x_95 %90
+         %91 = OpLoad %bool %x_95
+               OpStore %x_96_phi %91
+               OpBranch %85
+         %85 = OpLabel
+         %92 = OpLoad %bool %x_96_phi
+               OpSelectionMerge %93 None
+               OpBranchConditional %92 %94 %95
+         %94 = OpLabel
+               OpStore %x_GLF_color %98
+               OpBranch %93
+         %95 = OpLabel
+               OpStore %x_GLF_color %99
+               OpBranch %93
+         %93 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %100
+        %102 = OpLabel
+        %i_1 = OpVariable %_ptr_Function_int Function %16
+      %param = OpVariable %_ptr_Function_int Function %16
+               OpStore %i_1 %int_1
+               OpBranch %105
+        %105 = OpLabel
+               OpLoopMerge %106 %107 None
+               OpBranch %108
+        %108 = OpLabel
+        %109 = OpLoad %int %i_1
+        %110 = OpSLessThan %bool %109 %int_6
+               OpSelectionMerge %111 None
+               OpBranchConditional %110 %112 %113
+        %112 = OpLabel
+               OpBranch %111
+        %113 = OpLabel
+               OpBranch %106
+        %111 = OpLabel
+        %114 = OpLoad %int %i_1
+               OpStore %param %114
+        %115 = OpFunctionCall %void %func_i1_ %param
+               OpBranch %107
+        %107 = OpLabel
+        %117 = OpLoad %int %i_1
+        %118 = OpIAdd %int %117 %int_1
+               OpStore %i_1 %118
+               OpBranch %105
+        %106 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %119
+%tint_symbol = OpFunctionParameter %main_out
+        %123 = OpLabel
+        %124 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %124
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %100
+        %126 = OpLabel
+        %127 = OpFunctionCall %void %main_1
+        %129 = OpLoad %v4float %x_GLF_color
+        %130 = OpCompositeConstruct %main_out %129
+        %128 = OpFunctionCall %void %tint_symbol_2 %130
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..19735ee
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,94 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_i1_(x : ptr<function, i32>) {
+  var a : i32;
+  var data : array<i32, 9>;
+  var temp : array<i32, 2>;
+  var i : i32;
+  var x_95 : bool;
+  var x_96_phi : bool;
+  a = 0;
+  data[0] = 5;
+  loop {
+    let x_56 : i32 = a;
+    let x_57 : i32 = *(x);
+    if ((x_56 <= x_57)) {
+    } else {
+      break;
+    }
+    let x_60 : i32 = a;
+    if ((x_60 <= 10)) {
+      let x_64 : i32 = a;
+      let x_66 : i32 = a;
+      let x_69 : i32 = data[min(x_66, 0)];
+      temp[min(x_64, 1)] = x_69;
+      let x_71 : i32 = a;
+      a = (x_71 + 1);
+    }
+  }
+  i = 0;
+  loop {
+    let x_77 : i32 = i;
+    if ((x_77 < 2)) {
+    } else {
+      break;
+    }
+    let x_80 : i32 = i;
+    let x_82 : i32 = temp[0];
+    let x_83 : i32 = i;
+    data[x_80] = (x_82 + x_83);
+
+    continuing {
+      let x_86 : i32 = i;
+      i = (x_86 + 1);
+    }
+  }
+  let x_89 : i32 = data[0];
+  let x_90 : bool = (x_89 == 5);
+  x_96_phi = x_90;
+  if (x_90) {
+    let x_94 : i32 = data[1];
+    x_95 = (x_94 == 6);
+    x_96_phi = x_95;
+  }
+  let x_96 : bool = x_96_phi;
+  if (x_96) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+fn main_1() {
+  var i_1 : i32;
+  var param : i32;
+  i_1 = 1;
+  loop {
+    let x_43 : i32 = i_1;
+    if ((x_43 < 6)) {
+    } else {
+      break;
+    }
+    let x_46 : i32 = i_1;
+    param = x_46;
+    func_i1_(&(param));
+
+    continuing {
+      let x_48 : i32 = i_1;
+      i_1 = (x_48 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array/0-opt.wgsl
new file mode 100644
index 0000000..19735ee
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array/0-opt.wgsl
@@ -0,0 +1,94 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_i1_(x : ptr<function, i32>) {
+  var a : i32;
+  var data : array<i32, 9>;
+  var temp : array<i32, 2>;
+  var i : i32;
+  var x_95 : bool;
+  var x_96_phi : bool;
+  a = 0;
+  data[0] = 5;
+  loop {
+    let x_56 : i32 = a;
+    let x_57 : i32 = *(x);
+    if ((x_56 <= x_57)) {
+    } else {
+      break;
+    }
+    let x_60 : i32 = a;
+    if ((x_60 <= 10)) {
+      let x_64 : i32 = a;
+      let x_66 : i32 = a;
+      let x_69 : i32 = data[min(x_66, 0)];
+      temp[min(x_64, 1)] = x_69;
+      let x_71 : i32 = a;
+      a = (x_71 + 1);
+    }
+  }
+  i = 0;
+  loop {
+    let x_77 : i32 = i;
+    if ((x_77 < 2)) {
+    } else {
+      break;
+    }
+    let x_80 : i32 = i;
+    let x_82 : i32 = temp[0];
+    let x_83 : i32 = i;
+    data[x_80] = (x_82 + x_83);
+
+    continuing {
+      let x_86 : i32 = i;
+      i = (x_86 + 1);
+    }
+  }
+  let x_89 : i32 = data[0];
+  let x_90 : bool = (x_89 == 5);
+  x_96_phi = x_90;
+  if (x_90) {
+    let x_94 : i32 = data[1];
+    x_95 = (x_94 == 6);
+    x_96_phi = x_95;
+  }
+  let x_96 : bool = x_96_phi;
+  if (x_96) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+fn main_1() {
+  var i_1 : i32;
+  var param : i32;
+  i_1 = 1;
+  loop {
+    let x_43 : i32 = i_1;
+    if ((x_43 < 6)) {
+    } else {
+      break;
+    }
+    let x_46 : i32 = i_1;
+    param = x_46;
+    func_i1_(&(param));
+
+    continuing {
+      let x_48 : i32 = i_1;
+      i_1 = (x_48 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..86ba9e9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,75 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void func_i1_(inout int x) {
+  int a = 0;
+  int data[9] = (int[9])0;
+  int temp[2] = (int[2])0;
+  int i = 0;
+  bool x_95 = false;
+  bool x_96_phi = false;
+  a = 0;
+  data[0] = 5;
+  while (true) {
+    const int x_56 = a;
+    const int x_57 = x;
+    if ((x_56 <= x_57)) {
+    } else {
+      break;
+    }
+    if ((a <= 10)) {
+      const int x_64 = a;
+      const int x_69 = data[min(a, 0)];
+      temp[min(x_64, 1)] = x_69;
+      a = (a + 1);
+    }
+  }
+  i = 0;
+  {
+    for(; (i < 2); i = (i + 1)) {
+      const int x_80 = i;
+      const int x_82 = temp[0];
+      data[x_80] = (x_82 + i);
+    }
+  }
+  const int x_89 = data[0];
+  const bool x_90 = (x_89 == 5);
+  x_96_phi = x_90;
+  if (x_90) {
+    const int x_94 = data[1];
+    x_95 = (x_94 == 6);
+    x_96_phi = x_95;
+  }
+  if (x_96_phi) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+void main_1() {
+  int i_1 = 0;
+  int param = 0;
+  i_1 = 1;
+  {
+    for(; (i_1 < 6); i_1 = (i_1 + 1)) {
+      param = i_1;
+      func_i1_(param);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..8260441
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array/0-opt.wgsl.expected.msl
@@ -0,0 +1,104 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  int arr[9];
+};
+struct tint_array_wrapper_1 {
+  int arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void func_i1_(thread int* const x, thread float4* const tint_symbol_4) {
+  int a = 0;
+  tint_array_wrapper data = {};
+  tint_array_wrapper_1 temp = {};
+  int i = 0;
+  bool x_95 = false;
+  bool x_96_phi = false;
+  a = 0;
+  data.arr[0] = 5;
+  while (true) {
+    int const x_56 = a;
+    int const x_57 = *(x);
+    if ((x_56 <= x_57)) {
+    } else {
+      break;
+    }
+    int const x_60 = a;
+    if ((x_60 <= 10)) {
+      int const x_64 = a;
+      int const x_66 = a;
+      int const x_69 = data.arr[min(x_66, 0)];
+      temp.arr[min(x_64, 1)] = x_69;
+      int const x_71 = a;
+      a = (x_71 + 1);
+    }
+  }
+  i = 0;
+  while (true) {
+    int const x_77 = i;
+    if ((x_77 < 2)) {
+    } else {
+      break;
+    }
+    int const x_80 = i;
+    int const x_82 = temp.arr[0];
+    int const x_83 = i;
+    data.arr[x_80] = (x_82 + x_83);
+    {
+      int const x_86 = i;
+      i = (x_86 + 1);
+    }
+  }
+  int const x_89 = data.arr[0];
+  bool const x_90 = (x_89 == 5);
+  x_96_phi = x_90;
+  if (x_90) {
+    int const x_94 = data.arr[1];
+    x_95 = (x_94 == 6);
+    x_96_phi = x_95;
+  }
+  bool const x_96 = x_96_phi;
+  if (x_96) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+void main_1(thread float4* const tint_symbol_5) {
+  int i_1 = 0;
+  int param = 0;
+  i_1 = 1;
+  while (true) {
+    int const x_43 = i_1;
+    if ((x_43 < 6)) {
+    } else {
+      break;
+    }
+    int const x_46 = i_1;
+    param = x_46;
+    func_i1_(&(param), tint_symbol_5);
+    {
+      int const x_48 = i_1;
+      i_1 = (x_48 + 1);
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(&(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..8945024
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,220 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 131
+; Schema: 0
+               OpCapability Shader
+         %56 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_i1_ "func_i1_"
+               OpName %x "x"
+               OpName %a "a"
+               OpName %data "data"
+               OpName %temp "temp"
+               OpName %i "i"
+               OpName %x_95 "x_95"
+               OpName %x_96_phi "x_96_phi"
+               OpName %main_1 "main_1"
+               OpName %i_1 "i_1"
+               OpName %param "param"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_9 ArrayStride 4
+               OpDecorate %_arr_int_uint_2 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+          %8 = OpTypeFunction %void %_ptr_Function_int
+         %16 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_9 = OpConstant %uint 9
+%_arr_int_uint_9 = OpTypeArray %int %uint_9
+%_ptr_Function__arr_int_uint_9 = OpTypePointer Function %_arr_int_uint_9
+         %22 = OpConstantNull %_arr_int_uint_9
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+%_ptr_Function__arr_int_uint_2 = OpTypePointer Function %_arr_int_uint_2
+         %27 = OpConstantNull %_arr_int_uint_2
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %32 = OpConstantNull %bool
+      %int_0 = OpConstant %int 0
+      %int_5 = OpConstant %int 5
+     %int_10 = OpConstant %int 10
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+      %int_6 = OpConstant %int 6
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %98 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %99 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+        %100 = OpTypeFunction %void
+   %main_out = OpTypeStruct %v4float
+        %119 = OpTypeFunction %void %main_out
+   %func_i1_ = OpFunction %void None %8
+          %x = OpFunctionParameter %_ptr_Function_int
+         %14 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %16
+       %data = OpVariable %_ptr_Function__arr_int_uint_9 Function %22
+       %temp = OpVariable %_ptr_Function__arr_int_uint_2 Function %27
+          %i = OpVariable %_ptr_Function_int Function %16
+       %x_95 = OpVariable %_ptr_Function_bool Function %32
+   %x_96_phi = OpVariable %_ptr_Function_bool Function %32
+               OpStore %a %int_0
+         %35 = OpAccessChain %_ptr_Function_int %data %int_0
+               OpStore %35 %int_5
+               OpBranch %37
+         %37 = OpLabel
+               OpLoopMerge %38 %39 None
+               OpBranch %40
+         %40 = OpLabel
+         %41 = OpLoad %int %a
+         %43 = OpLoad %int %x
+         %44 = OpSLessThanEqual %bool %41 %43
+               OpSelectionMerge %45 None
+               OpBranchConditional %44 %46 %47
+         %46 = OpLabel
+               OpBranch %45
+         %47 = OpLabel
+               OpBranch %38
+         %45 = OpLabel
+         %48 = OpLoad %int %a
+         %50 = OpSLessThanEqual %bool %48 %int_10
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %51
+         %52 = OpLabel
+         %53 = OpLoad %int %a
+         %54 = OpLoad %int %a
+         %55 = OpExtInst %int %56 SMin %54 %int_0
+         %57 = OpAccessChain %_ptr_Function_int %data %55
+         %58 = OpLoad %int %57
+         %59 = OpExtInst %int %56 SMin %53 %int_1
+         %61 = OpAccessChain %_ptr_Function_int %temp %59
+               OpStore %61 %58
+         %62 = OpLoad %int %a
+         %63 = OpIAdd %int %62 %int_1
+               OpStore %a %63
+               OpBranch %51
+         %51 = OpLabel
+               OpBranch %39
+         %39 = OpLabel
+               OpBranch %37
+         %38 = OpLabel
+               OpStore %i %int_0
+               OpBranch %64
+         %64 = OpLabel
+               OpLoopMerge %65 %66 None
+               OpBranch %67
+         %67 = OpLabel
+         %68 = OpLoad %int %i
+         %70 = OpSLessThan %bool %68 %int_2
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %73
+         %72 = OpLabel
+               OpBranch %71
+         %73 = OpLabel
+               OpBranch %65
+         %71 = OpLabel
+         %74 = OpLoad %int %i
+         %75 = OpAccessChain %_ptr_Function_int %temp %int_0
+         %76 = OpLoad %int %75
+         %77 = OpLoad %int %i
+         %78 = OpAccessChain %_ptr_Function_int %data %74
+         %79 = OpIAdd %int %76 %77
+               OpStore %78 %79
+               OpBranch %66
+         %66 = OpLabel
+         %80 = OpLoad %int %i
+         %81 = OpIAdd %int %80 %int_1
+               OpStore %i %81
+               OpBranch %64
+         %65 = OpLabel
+         %82 = OpAccessChain %_ptr_Function_int %data %int_0
+         %83 = OpLoad %int %82
+         %84 = OpIEqual %bool %83 %int_5
+               OpStore %x_96_phi %84
+               OpSelectionMerge %85 None
+               OpBranchConditional %84 %86 %85
+         %86 = OpLabel
+         %87 = OpAccessChain %_ptr_Function_int %data %int_1
+         %88 = OpLoad %int %87
+         %90 = OpIEqual %bool %88 %int_6
+               OpStore %x_95 %90
+         %91 = OpLoad %bool %x_95
+               OpStore %x_96_phi %91
+               OpBranch %85
+         %85 = OpLabel
+         %92 = OpLoad %bool %x_96_phi
+               OpSelectionMerge %93 None
+               OpBranchConditional %92 %94 %95
+         %94 = OpLabel
+               OpStore %x_GLF_color %98
+               OpBranch %93
+         %95 = OpLabel
+               OpStore %x_GLF_color %99
+               OpBranch %93
+         %93 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %100
+        %102 = OpLabel
+        %i_1 = OpVariable %_ptr_Function_int Function %16
+      %param = OpVariable %_ptr_Function_int Function %16
+               OpStore %i_1 %int_1
+               OpBranch %105
+        %105 = OpLabel
+               OpLoopMerge %106 %107 None
+               OpBranch %108
+        %108 = OpLabel
+        %109 = OpLoad %int %i_1
+        %110 = OpSLessThan %bool %109 %int_6
+               OpSelectionMerge %111 None
+               OpBranchConditional %110 %112 %113
+        %112 = OpLabel
+               OpBranch %111
+        %113 = OpLabel
+               OpBranch %106
+        %111 = OpLabel
+        %114 = OpLoad %int %i_1
+               OpStore %param %114
+        %115 = OpFunctionCall %void %func_i1_ %param
+               OpBranch %107
+        %107 = OpLabel
+        %117 = OpLoad %int %i_1
+        %118 = OpIAdd %int %117 %int_1
+               OpStore %i_1 %118
+               OpBranch %105
+        %106 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %119
+%tint_symbol = OpFunctionParameter %main_out
+        %123 = OpLabel
+        %124 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %124
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %100
+        %126 = OpLabel
+        %127 = OpFunctionCall %void %main_1
+        %129 = OpLoad %v4float %x_GLF_color
+        %130 = OpCompositeConstruct %main_out %129
+        %128 = OpFunctionCall %void %tint_symbol_2 %130
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..19735ee
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/assign-array-value-to-another-array/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,94 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_i1_(x : ptr<function, i32>) {
+  var a : i32;
+  var data : array<i32, 9>;
+  var temp : array<i32, 2>;
+  var i : i32;
+  var x_95 : bool;
+  var x_96_phi : bool;
+  a = 0;
+  data[0] = 5;
+  loop {
+    let x_56 : i32 = a;
+    let x_57 : i32 = *(x);
+    if ((x_56 <= x_57)) {
+    } else {
+      break;
+    }
+    let x_60 : i32 = a;
+    if ((x_60 <= 10)) {
+      let x_64 : i32 = a;
+      let x_66 : i32 = a;
+      let x_69 : i32 = data[min(x_66, 0)];
+      temp[min(x_64, 1)] = x_69;
+      let x_71 : i32 = a;
+      a = (x_71 + 1);
+    }
+  }
+  i = 0;
+  loop {
+    let x_77 : i32 = i;
+    if ((x_77 < 2)) {
+    } else {
+      break;
+    }
+    let x_80 : i32 = i;
+    let x_82 : i32 = temp[0];
+    let x_83 : i32 = i;
+    data[x_80] = (x_82 + x_83);
+
+    continuing {
+      let x_86 : i32 = i;
+      i = (x_86 + 1);
+    }
+  }
+  let x_89 : i32 = data[0];
+  let x_90 : bool = (x_89 == 5);
+  x_96_phi = x_90;
+  if (x_90) {
+    let x_94 : i32 = data[1];
+    x_95 = (x_94 == 6);
+    x_96_phi = x_95;
+  }
+  let x_96 : bool = x_96_phi;
+  if (x_96) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+fn main_1() {
+  var i_1 : i32;
+  var param : i32;
+  i_1 = 1;
+  loop {
+    let x_43 : i32 = i_1;
+    if ((x_43 < 6)) {
+    } else {
+      break;
+    }
+    let x_46 : i32 = i_1;
+    param = x_46;
+    func_i1_(&(param));
+
+    continuing {
+      let x_48 : i32 = i_1;
+      i_1 = (x_48 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/barrier-in-loop-with-break/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/barrier-in-loop-with-break/0-opt.spvasm
new file mode 100644
index 0000000..ae7a96f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/barrier-in-loop-with-break/0-opt.spvasm
@@ -0,0 +1,125 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main" %gl_LocalInvocationID
+               OpExecutionMode %main LocalSize 16 1 1
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %lid "lid"
+               OpName %gl_LocalInvocationID "gl_LocalInvocationID"
+               OpName %val "val"
+               OpName %doesNotMatter "doesNotMatter"
+               OpMemberName %doesNotMatter 0 "global_seed"
+               OpMemberName %doesNotMatter 1 "data"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "injectionSwitch"
+               OpName %__0 ""
+               OpDecorate %gl_LocalInvocationID BuiltIn LocalInvocationId
+               OpDecorate %_runtimearr_int ArrayStride 4
+               OpMemberDecorate %doesNotMatter 0 Offset 0
+               OpMemberDecorate %doesNotMatter 1 Offset 4
+               OpDecorate %doesNotMatter BufferBlock
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%gl_LocalInvocationID = OpVariable %_ptr_Input_v3uint Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_runtimearr_int = OpTypeRuntimeArray %int
+%doesNotMatter = OpTypeStruct %int %_runtimearr_int
+%_ptr_Uniform_doesNotMatter = OpTypePointer Uniform %doesNotMatter
+          %_ = OpVariable %_ptr_Uniform_doesNotMatter Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+  %float_100 = OpConstant %float 100
+     %uint_2 = OpConstant %uint 2
+   %uint_264 = OpConstant %uint 264
+     %int_42 = OpConstant %int 42
+    %uint_16 = OpConstant %uint 16
+     %uint_1 = OpConstant %uint 1
+%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_16 %uint_1 %uint_1
+       %main = OpFunction %void None %14
+         %38 = OpLabel
+        %lid = OpVariable %_ptr_Function_int Function
+        %val = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+         %39 = OpAccessChain %_ptr_Input_uint %gl_LocalInvocationID %uint_0
+         %40 = OpLoad %uint %39
+         %41 = OpBitcast %int %40
+               OpStore %lid %41
+         %42 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %43 = OpLoad %int %42
+               OpStore %val %43
+               OpStore %i %int_0
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %48 = OpLoad %int %i
+         %49 = OpSLessThan %bool %48 %int_2
+               OpBranchConditional %49 %50 %45
+         %50 = OpLabel
+         %51 = OpLoad %int %lid
+         %52 = OpSGreaterThan %bool %51 %int_0
+               OpSelectionMerge %53 None
+               OpBranchConditional %52 %54 %53
+         %54 = OpLabel
+         %55 = OpLoad %int %lid
+         %56 = OpISub %int %55 %int_1
+         %57 = OpAccessChain %_ptr_Uniform_int %_ %int_1 %56
+         %58 = OpLoad %int %57
+         %59 = OpLoad %int %val
+         %60 = OpIAdd %int %59 %58
+               OpStore %val %60
+         %61 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %uint_0
+         %62 = OpLoad %float %61
+         %63 = OpFOrdGreaterThan %bool %62 %float_100
+               OpSelectionMerge %64 None
+               OpBranchConditional %63 %65 %64
+         %65 = OpLabel
+               OpBranch %45
+         %64 = OpLabel
+               OpBranch %53
+         %53 = OpLabel
+               OpControlBarrier %uint_2 %uint_2 %uint_264
+               OpBranch %46
+         %46 = OpLabel
+         %66 = OpLoad %int %i
+         %67 = OpIAdd %int %66 %int_1
+               OpStore %i %67
+               OpBranch %44
+         %45 = OpLabel
+         %68 = OpLoad %int %lid
+         %69 = OpIEqual %bool %68 %int_0
+               OpSelectionMerge %70 None
+               OpBranchConditional %69 %71 %70
+         %71 = OpLabel
+         %72 = OpAccessChain %_ptr_Uniform_int %_ %int_1 %int_0
+               OpStore %72 %int_42
+               OpBranch %70
+         %70 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/barrier-in-loop-with-break/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/barrier-in-loop-with-break/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..9ed54bc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/barrier-in-loop-with-break/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,45 @@
+static uint3 gl_LocalInvocationID = uint3(0u, 0u, 0u);
+RWByteAddressBuffer x_7 : register(u0, space0);
+cbuffer cbuffer_x_10 : register(b1, space0) {
+  uint4 x_10[1];
+};
+
+void main_1() {
+  int lid = 0;
+  int val = 0;
+  int i = 0;
+  const uint x_40 = gl_LocalInvocationID.x;
+  lid = asint(x_40);
+  const int x_43 = asint(x_7.Load(0u));
+  val = x_43;
+  i = 0;
+  {
+    for(; (i < 2); i = (i + 1)) {
+      if ((lid > 0)) {
+        const int x_58 = asint(x_7.Load((4u + (4u * uint((lid - 1))))));
+        val = (val + x_58);
+        const float x_62 = asfloat(x_10[0].x);
+        if ((x_62 > 100.0f)) {
+          break;
+        }
+      }
+      GroupMemoryBarrierWithGroupSync();
+    }
+  }
+  if ((lid == 0)) {
+    x_7.Store((4u + (4u * uint(0))), asuint(42));
+  }
+  return;
+}
+
+struct tint_symbol_1 {
+  uint3 gl_LocalInvocationID_param : SV_GroupThreadID;
+};
+
+[numthreads(16, 1, 1)]
+void main(tint_symbol_1 tint_symbol) {
+  const uint3 gl_LocalInvocationID_param = tint_symbol.gl_LocalInvocationID_param;
+  gl_LocalInvocationID = gl_LocalInvocationID_param;
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/barrier-in-loop-with-break/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/barrier-in-loop-with-break/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..99eb99a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/barrier-in-loop-with-break/0-opt.spvasm.expected.msl
@@ -0,0 +1,57 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct doesNotMatter {
+  /* 0x0000 */ int global_seed;
+  /* 0x0004 */ int data[1];
+};
+struct buf1 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+
+void main_1(constant buf1& x_10, device doesNotMatter& x_7, thread uint3* const tint_symbol_2) {
+  int lid = 0;
+  int val = 0;
+  int i = 0;
+  uint const x_40 = (*(tint_symbol_2)).x;
+  lid = as_type<int>(x_40);
+  int const x_43 = x_7.global_seed;
+  val = x_43;
+  i = 0;
+  while (true) {
+    int const x_48 = i;
+    if ((x_48 < 2)) {
+    } else {
+      break;
+    }
+    int const x_51 = lid;
+    if ((x_51 > 0)) {
+      int const x_55 = lid;
+      int const x_58 = x_7.data[(x_55 - 1)];
+      int const x_59 = val;
+      val = (x_59 + x_58);
+      float const x_62 = x_10.injectionSwitch.x;
+      if ((x_62 > 100.0f)) {
+        break;
+      }
+    }
+    threadgroup_barrier(mem_flags::mem_threadgroup);
+    {
+      int const x_66 = i;
+      i = (x_66 + 1);
+    }
+  }
+  int const x_68 = lid;
+  if ((x_68 == 0)) {
+    x_7.data[0] = 42;
+  }
+  return;
+}
+
+kernel void tint_symbol(uint3 gl_LocalInvocationID_param [[thread_position_in_threadgroup]], constant buf1& x_10 [[buffer(1)]], device doesNotMatter& x_7 [[buffer(0)]]) {
+  thread uint3 tint_symbol_3 = 0u;
+  tint_symbol_3 = gl_LocalInvocationID_param;
+  main_1(x_10, x_7, &(tint_symbol_3));
+  return;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/barrier-in-loop-with-break/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/barrier-in-loop-with-break/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..552cb1b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/barrier-in-loop-with-break/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,144 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 81
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main" %tint_symbol
+               OpExecutionMode %main LocalSize 16 1 1
+               OpName %gl_LocalInvocationID "gl_LocalInvocationID"
+               OpName %doesNotMatter "doesNotMatter"
+               OpMemberName %doesNotMatter 0 "global_seed"
+               OpMemberName %doesNotMatter 1 "data"
+               OpName %x_7 "x_7"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "injectionSwitch"
+               OpName %x_10 "x_10"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main_1 "main_1"
+               OpName %lid "lid"
+               OpName %val "val"
+               OpName %i "i"
+               OpName %main "main"
+               OpDecorate %doesNotMatter Block
+               OpMemberDecorate %doesNotMatter 0 Offset 0
+               OpMemberDecorate %doesNotMatter 1 Offset 4
+               OpDecorate %_runtimearr_int ArrayStride 4
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 1
+               OpDecorate %tint_symbol BuiltIn LocalInvocationId
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Private_v3uint = OpTypePointer Private %v3uint
+          %5 = OpConstantNull %v3uint
+%gl_LocalInvocationID = OpVariable %_ptr_Private_v3uint Private %5
+        %int = OpTypeInt 32 1
+%_runtimearr_int = OpTypeRuntimeArray %int
+%doesNotMatter = OpTypeStruct %int %_runtimearr_int
+%_ptr_StorageBuffer_doesNotMatter = OpTypePointer StorageBuffer %doesNotMatter
+        %x_7 = OpVariable %_ptr_StorageBuffer_doesNotMatter StorageBuffer
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_10 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%tint_symbol = OpVariable %_ptr_Input_v3uint Input
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %24 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_uint = OpTypePointer Private %uint
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+     %uint_1 = OpConstant %uint 1
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+  %float_100 = OpConstant %float 100
+     %uint_2 = OpConstant %uint 2
+   %uint_264 = OpConstant %uint 264
+     %int_42 = OpConstant %int 42
+     %main_1 = OpFunction %void None %18
+         %21 = OpLabel
+        %lid = OpVariable %_ptr_Function_int Function %24
+        %val = OpVariable %_ptr_Function_int Function %24
+          %i = OpVariable %_ptr_Function_int Function %24
+         %29 = OpAccessChain %_ptr_Private_uint %gl_LocalInvocationID %uint_0
+         %30 = OpLoad %uint %29
+         %31 = OpBitcast %int %30
+               OpStore %lid %31
+         %33 = OpAccessChain %_ptr_StorageBuffer_int %x_7 %uint_0
+         %34 = OpLoad %int %33
+               OpStore %val %34
+               OpStore %i %int_0
+               OpBranch %36
+         %36 = OpLabel
+               OpLoopMerge %37 %38 None
+               OpBranch %39
+         %39 = OpLabel
+         %40 = OpLoad %int %i
+         %42 = OpSLessThan %bool %40 %int_2
+               OpSelectionMerge %44 None
+               OpBranchConditional %42 %45 %46
+         %45 = OpLabel
+               OpBranch %44
+         %46 = OpLabel
+               OpBranch %37
+         %44 = OpLabel
+         %47 = OpLoad %int %lid
+         %48 = OpSGreaterThan %bool %47 %int_0
+               OpSelectionMerge %49 None
+               OpBranchConditional %48 %50 %49
+         %50 = OpLabel
+         %51 = OpLoad %int %lid
+         %54 = OpISub %int %51 %int_1
+         %55 = OpAccessChain %_ptr_StorageBuffer_int %x_7 %uint_1 %54
+         %56 = OpLoad %int %55
+         %57 = OpLoad %int %val
+         %58 = OpIAdd %int %57 %56
+               OpStore %val %58
+         %60 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %uint_0
+         %61 = OpLoad %float %60
+         %63 = OpFOrdGreaterThan %bool %61 %float_100
+               OpSelectionMerge %64 None
+               OpBranchConditional %63 %65 %64
+         %65 = OpLabel
+               OpBranch %37
+         %64 = OpLabel
+               OpBranch %49
+         %49 = OpLabel
+               OpControlBarrier %uint_2 %uint_2 %uint_264
+               OpBranch %38
+         %38 = OpLabel
+         %69 = OpLoad %int %i
+         %70 = OpIAdd %int %69 %int_1
+               OpStore %i %70
+               OpBranch %36
+         %37 = OpLabel
+         %71 = OpLoad %int %lid
+         %72 = OpIEqual %bool %71 %int_0
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %74 %73
+         %74 = OpLabel
+         %75 = OpAccessChain %_ptr_StorageBuffer_int %x_7 %uint_1 %int_0
+               OpStore %75 %int_42
+               OpBranch %73
+         %73 = OpLabel
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %18
+         %78 = OpLabel
+         %79 = OpLoad %v3uint %tint_symbol
+               OpStore %gl_LocalInvocationID %79
+         %80 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/barrier-in-loop-with-break/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/barrier-in-loop-with-break/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..f57b088
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/barrier-in-loop-with-break/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,64 @@
+type RTArr = [[stride(4)]] array<i32>;
+
+[[block]]
+struct doesNotMatter {
+  global_seed : i32;
+  data : RTArr;
+};
+
+[[block]]
+struct buf1 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> gl_LocalInvocationID : vec3<u32>;
+
+[[group(0), binding(0)]] var<storage, read_write> x_7 : doesNotMatter;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+fn main_1() {
+  var lid : i32;
+  var val : i32;
+  var i : i32;
+  let x_40 : u32 = gl_LocalInvocationID.x;
+  lid = bitcast<i32>(x_40);
+  let x_43 : i32 = x_7.global_seed;
+  val = x_43;
+  i = 0;
+  loop {
+    let x_48 : i32 = i;
+    if ((x_48 < 2)) {
+    } else {
+      break;
+    }
+    let x_51 : i32 = lid;
+    if ((x_51 > 0)) {
+      let x_55 : i32 = lid;
+      let x_58 : i32 = x_7.data[(x_55 - 1)];
+      let x_59 : i32 = val;
+      val = (x_59 + x_58);
+      let x_62 : f32 = x_10.injectionSwitch.x;
+      if ((x_62 > 100.0)) {
+        break;
+      }
+    }
+    workgroupBarrier();
+
+    continuing {
+      let x_66 : i32 = i;
+      i = (x_66 + 1);
+    }
+  }
+  let x_68 : i32 = lid;
+  if ((x_68 == 0)) {
+    x_7.data[0] = 42;
+  }
+  return;
+}
+
+[[stage(compute), workgroup_size(16, 1, 1)]]
+fn main([[builtin(local_invocation_id)]] gl_LocalInvocationID_param : vec3<u32>) {
+  gl_LocalInvocationID = gl_LocalInvocationID_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/barrier-in-loop-with-break/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/barrier-in-loop-with-break/0-opt.wgsl
new file mode 100644
index 0000000..f57b088
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/barrier-in-loop-with-break/0-opt.wgsl
@@ -0,0 +1,64 @@
+type RTArr = [[stride(4)]] array<i32>;
+
+[[block]]
+struct doesNotMatter {
+  global_seed : i32;
+  data : RTArr;
+};
+
+[[block]]
+struct buf1 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> gl_LocalInvocationID : vec3<u32>;
+
+[[group(0), binding(0)]] var<storage, read_write> x_7 : doesNotMatter;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+fn main_1() {
+  var lid : i32;
+  var val : i32;
+  var i : i32;
+  let x_40 : u32 = gl_LocalInvocationID.x;
+  lid = bitcast<i32>(x_40);
+  let x_43 : i32 = x_7.global_seed;
+  val = x_43;
+  i = 0;
+  loop {
+    let x_48 : i32 = i;
+    if ((x_48 < 2)) {
+    } else {
+      break;
+    }
+    let x_51 : i32 = lid;
+    if ((x_51 > 0)) {
+      let x_55 : i32 = lid;
+      let x_58 : i32 = x_7.data[(x_55 - 1)];
+      let x_59 : i32 = val;
+      val = (x_59 + x_58);
+      let x_62 : f32 = x_10.injectionSwitch.x;
+      if ((x_62 > 100.0)) {
+        break;
+      }
+    }
+    workgroupBarrier();
+
+    continuing {
+      let x_66 : i32 = i;
+      i = (x_66 + 1);
+    }
+  }
+  let x_68 : i32 = lid;
+  if ((x_68 == 0)) {
+    x_7.data[0] = 42;
+  }
+  return;
+}
+
+[[stage(compute), workgroup_size(16, 1, 1)]]
+fn main([[builtin(local_invocation_id)]] gl_LocalInvocationID_param : vec3<u32>) {
+  gl_LocalInvocationID = gl_LocalInvocationID_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/barrier-in-loop-with-break/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/barrier-in-loop-with-break/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..9ed54bc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/barrier-in-loop-with-break/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,45 @@
+static uint3 gl_LocalInvocationID = uint3(0u, 0u, 0u);
+RWByteAddressBuffer x_7 : register(u0, space0);
+cbuffer cbuffer_x_10 : register(b1, space0) {
+  uint4 x_10[1];
+};
+
+void main_1() {
+  int lid = 0;
+  int val = 0;
+  int i = 0;
+  const uint x_40 = gl_LocalInvocationID.x;
+  lid = asint(x_40);
+  const int x_43 = asint(x_7.Load(0u));
+  val = x_43;
+  i = 0;
+  {
+    for(; (i < 2); i = (i + 1)) {
+      if ((lid > 0)) {
+        const int x_58 = asint(x_7.Load((4u + (4u * uint((lid - 1))))));
+        val = (val + x_58);
+        const float x_62 = asfloat(x_10[0].x);
+        if ((x_62 > 100.0f)) {
+          break;
+        }
+      }
+      GroupMemoryBarrierWithGroupSync();
+    }
+  }
+  if ((lid == 0)) {
+    x_7.Store((4u + (4u * uint(0))), asuint(42));
+  }
+  return;
+}
+
+struct tint_symbol_1 {
+  uint3 gl_LocalInvocationID_param : SV_GroupThreadID;
+};
+
+[numthreads(16, 1, 1)]
+void main(tint_symbol_1 tint_symbol) {
+  const uint3 gl_LocalInvocationID_param = tint_symbol.gl_LocalInvocationID_param;
+  gl_LocalInvocationID = gl_LocalInvocationID_param;
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/barrier-in-loop-with-break/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/barrier-in-loop-with-break/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..99eb99a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/barrier-in-loop-with-break/0-opt.wgsl.expected.msl
@@ -0,0 +1,57 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct doesNotMatter {
+  /* 0x0000 */ int global_seed;
+  /* 0x0004 */ int data[1];
+};
+struct buf1 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+
+void main_1(constant buf1& x_10, device doesNotMatter& x_7, thread uint3* const tint_symbol_2) {
+  int lid = 0;
+  int val = 0;
+  int i = 0;
+  uint const x_40 = (*(tint_symbol_2)).x;
+  lid = as_type<int>(x_40);
+  int const x_43 = x_7.global_seed;
+  val = x_43;
+  i = 0;
+  while (true) {
+    int const x_48 = i;
+    if ((x_48 < 2)) {
+    } else {
+      break;
+    }
+    int const x_51 = lid;
+    if ((x_51 > 0)) {
+      int const x_55 = lid;
+      int const x_58 = x_7.data[(x_55 - 1)];
+      int const x_59 = val;
+      val = (x_59 + x_58);
+      float const x_62 = x_10.injectionSwitch.x;
+      if ((x_62 > 100.0f)) {
+        break;
+      }
+    }
+    threadgroup_barrier(mem_flags::mem_threadgroup);
+    {
+      int const x_66 = i;
+      i = (x_66 + 1);
+    }
+  }
+  int const x_68 = lid;
+  if ((x_68 == 0)) {
+    x_7.data[0] = 42;
+  }
+  return;
+}
+
+kernel void tint_symbol(uint3 gl_LocalInvocationID_param [[thread_position_in_threadgroup]], constant buf1& x_10 [[buffer(1)]], device doesNotMatter& x_7 [[buffer(0)]]) {
+  thread uint3 tint_symbol_3 = 0u;
+  tint_symbol_3 = gl_LocalInvocationID_param;
+  main_1(x_10, x_7, &(tint_symbol_3));
+  return;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/barrier-in-loop-with-break/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/barrier-in-loop-with-break/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..552cb1b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/barrier-in-loop-with-break/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,144 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 81
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main" %tint_symbol
+               OpExecutionMode %main LocalSize 16 1 1
+               OpName %gl_LocalInvocationID "gl_LocalInvocationID"
+               OpName %doesNotMatter "doesNotMatter"
+               OpMemberName %doesNotMatter 0 "global_seed"
+               OpMemberName %doesNotMatter 1 "data"
+               OpName %x_7 "x_7"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "injectionSwitch"
+               OpName %x_10 "x_10"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main_1 "main_1"
+               OpName %lid "lid"
+               OpName %val "val"
+               OpName %i "i"
+               OpName %main "main"
+               OpDecorate %doesNotMatter Block
+               OpMemberDecorate %doesNotMatter 0 Offset 0
+               OpMemberDecorate %doesNotMatter 1 Offset 4
+               OpDecorate %_runtimearr_int ArrayStride 4
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 1
+               OpDecorate %tint_symbol BuiltIn LocalInvocationId
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Private_v3uint = OpTypePointer Private %v3uint
+          %5 = OpConstantNull %v3uint
+%gl_LocalInvocationID = OpVariable %_ptr_Private_v3uint Private %5
+        %int = OpTypeInt 32 1
+%_runtimearr_int = OpTypeRuntimeArray %int
+%doesNotMatter = OpTypeStruct %int %_runtimearr_int
+%_ptr_StorageBuffer_doesNotMatter = OpTypePointer StorageBuffer %doesNotMatter
+        %x_7 = OpVariable %_ptr_StorageBuffer_doesNotMatter StorageBuffer
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_10 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%tint_symbol = OpVariable %_ptr_Input_v3uint Input
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %24 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_uint = OpTypePointer Private %uint
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+     %uint_1 = OpConstant %uint 1
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+  %float_100 = OpConstant %float 100
+     %uint_2 = OpConstant %uint 2
+   %uint_264 = OpConstant %uint 264
+     %int_42 = OpConstant %int 42
+     %main_1 = OpFunction %void None %18
+         %21 = OpLabel
+        %lid = OpVariable %_ptr_Function_int Function %24
+        %val = OpVariable %_ptr_Function_int Function %24
+          %i = OpVariable %_ptr_Function_int Function %24
+         %29 = OpAccessChain %_ptr_Private_uint %gl_LocalInvocationID %uint_0
+         %30 = OpLoad %uint %29
+         %31 = OpBitcast %int %30
+               OpStore %lid %31
+         %33 = OpAccessChain %_ptr_StorageBuffer_int %x_7 %uint_0
+         %34 = OpLoad %int %33
+               OpStore %val %34
+               OpStore %i %int_0
+               OpBranch %36
+         %36 = OpLabel
+               OpLoopMerge %37 %38 None
+               OpBranch %39
+         %39 = OpLabel
+         %40 = OpLoad %int %i
+         %42 = OpSLessThan %bool %40 %int_2
+               OpSelectionMerge %44 None
+               OpBranchConditional %42 %45 %46
+         %45 = OpLabel
+               OpBranch %44
+         %46 = OpLabel
+               OpBranch %37
+         %44 = OpLabel
+         %47 = OpLoad %int %lid
+         %48 = OpSGreaterThan %bool %47 %int_0
+               OpSelectionMerge %49 None
+               OpBranchConditional %48 %50 %49
+         %50 = OpLabel
+         %51 = OpLoad %int %lid
+         %54 = OpISub %int %51 %int_1
+         %55 = OpAccessChain %_ptr_StorageBuffer_int %x_7 %uint_1 %54
+         %56 = OpLoad %int %55
+         %57 = OpLoad %int %val
+         %58 = OpIAdd %int %57 %56
+               OpStore %val %58
+         %60 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %uint_0
+         %61 = OpLoad %float %60
+         %63 = OpFOrdGreaterThan %bool %61 %float_100
+               OpSelectionMerge %64 None
+               OpBranchConditional %63 %65 %64
+         %65 = OpLabel
+               OpBranch %37
+         %64 = OpLabel
+               OpBranch %49
+         %49 = OpLabel
+               OpControlBarrier %uint_2 %uint_2 %uint_264
+               OpBranch %38
+         %38 = OpLabel
+         %69 = OpLoad %int %i
+         %70 = OpIAdd %int %69 %int_1
+               OpStore %i %70
+               OpBranch %36
+         %37 = OpLabel
+         %71 = OpLoad %int %lid
+         %72 = OpIEqual %bool %71 %int_0
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %74 %73
+         %74 = OpLabel
+         %75 = OpAccessChain %_ptr_StorageBuffer_int %x_7 %uint_1 %int_0
+               OpStore %75 %int_42
+               OpBranch %73
+         %73 = OpLabel
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %18
+         %78 = OpLabel
+         %79 = OpLoad %v3uint %tint_symbol
+               OpStore %gl_LocalInvocationID %79
+         %80 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/barrier-in-loop-with-break/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/barrier-in-loop-with-break/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..f57b088
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/barrier-in-loop-with-break/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,64 @@
+type RTArr = [[stride(4)]] array<i32>;
+
+[[block]]
+struct doesNotMatter {
+  global_seed : i32;
+  data : RTArr;
+};
+
+[[block]]
+struct buf1 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> gl_LocalInvocationID : vec3<u32>;
+
+[[group(0), binding(0)]] var<storage, read_write> x_7 : doesNotMatter;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+fn main_1() {
+  var lid : i32;
+  var val : i32;
+  var i : i32;
+  let x_40 : u32 = gl_LocalInvocationID.x;
+  lid = bitcast<i32>(x_40);
+  let x_43 : i32 = x_7.global_seed;
+  val = x_43;
+  i = 0;
+  loop {
+    let x_48 : i32 = i;
+    if ((x_48 < 2)) {
+    } else {
+      break;
+    }
+    let x_51 : i32 = lid;
+    if ((x_51 > 0)) {
+      let x_55 : i32 = lid;
+      let x_58 : i32 = x_7.data[(x_55 - 1)];
+      let x_59 : i32 = val;
+      val = (x_59 + x_58);
+      let x_62 : f32 = x_10.injectionSwitch.x;
+      if ((x_62 > 100.0)) {
+        break;
+      }
+    }
+    workgroupBarrier();
+
+    continuing {
+      let x_66 : i32 = i;
+      i = (x_66 + 1);
+    }
+  }
+  let x_68 : i32 = lid;
+  if ((x_68 == 0)) {
+    x_7.data[0] = 42;
+  }
+  return;
+}
+
+[[stage(compute), workgroup_size(16, 1, 1)]]
+fn main([[builtin(local_invocation_id)]] gl_LocalInvocationID_param : vec3<u32>) {
+  gl_LocalInvocationID = gl_LocalInvocationID_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/break-in-do-while-with-nested-if/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/break-in-do-while-with-nested-if/0-opt.spvasm
new file mode 100644
index 0000000..e46b7c4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/break-in-do-while-with-nested-if/0-opt.spvasm
@@ -0,0 +1,68 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %GLF_live12c5 "GLF_live12c5"
+               OpDecorate %_GLF_color Location 0
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %14 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+      %false = OpConstantFalse %bool
+       %main = OpFunction %void None %8
+         %25 = OpLabel
+%GLF_live12c5 = OpVariable %_ptr_Function_bool Function
+               OpStore %_GLF_color %14
+               OpBranch %26
+         %26 = OpLabel
+               OpLoopMerge %27 %28 None
+               OpBranch %29
+         %29 = OpLabel
+         %30 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %31 = OpLoad %float %30
+         %32 = OpFOrdLessThan %bool %31 %float_0
+               OpSelectionMerge %33 None
+               OpBranchConditional %32 %34 %33
+         %34 = OpLabel
+               OpStore %GLF_live12c5 %false
+         %35 = OpLoad %bool %GLF_live12c5
+               OpSelectionMerge %36 None
+               OpBranchConditional %35 %37 %28
+         %37 = OpLabel
+               OpBranch %28
+         %36 = OpLabel
+               OpBranch %28
+         %28 = OpLabel
+               OpBranchConditional %false %26 %27
+         %33 = OpLabel
+               OpBranch %27
+         %27 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/break-in-do-while-with-nested-if/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/break-in-do-while-with-nested-if/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..896cc41
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/break-in-do-while-with-nested-if/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,61 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+
+void main_1() {
+  bool GLF_live12c5 = false;
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  while (true) {
+    const float x_31 = asfloat(x_5[0].y);
+    if ((x_31 < 0.0f)) {
+      GLF_live12c5 = false;
+      if (GLF_live12c5) {
+        {
+          if (false) {
+          } else {
+            break;
+          }
+        }
+        continue;
+      } else {
+        {
+          if (false) {
+          } else {
+            break;
+          }
+        }
+        continue;
+      }
+      {
+        if (false) {
+        } else {
+          break;
+        }
+      }
+      continue;
+    }
+    break;
+    {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/break-in-do-while-with-nested-if/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/break-in-do-while-with-nested-if/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..f5bdadc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/break-in-do-while-with-nested-if/0-opt.spvasm.expected.msl
@@ -0,0 +1,65 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  bool GLF_live12c5 = false;
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  while (true) {
+    float const x_31 = x_5.injectionSwitch.y;
+    if ((x_31 < 0.0f)) {
+      GLF_live12c5 = false;
+      bool const x_35 = GLF_live12c5;
+      if (x_35) {
+        {
+          if (false) {
+          } else {
+            break;
+          }
+        }
+        continue;
+      } else {
+        {
+          if (false) {
+          } else {
+            break;
+          }
+        }
+        continue;
+      }
+      {
+        if (false) {
+        } else {
+          break;
+        }
+      }
+      continue;
+    }
+    break;
+    {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/break-in-do-while-with-nested-if/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/break-in-do-while-with-nested-if/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..84e6aca
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/break-in-do-while-with-nested-if/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,113 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 56
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_5 "x_5"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %GLF_live12c5 "GLF_live12c5"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %19 = OpConstantNull %bool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %22 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %false = OpConstantFalse %bool
+   %main_out = OpTypeStruct %v4float
+         %44 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+%GLF_live12c5 = OpVariable %_ptr_Function_bool Function %19
+               OpStore %x_GLF_color %22
+               OpBranch %23
+         %23 = OpLabel
+               OpLoopMerge %24 %25 None
+               OpBranch %26
+         %26 = OpLabel
+         %31 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %uint_1
+         %32 = OpLoad %float %31
+         %33 = OpFOrdLessThan %bool %32 %float_0
+               OpSelectionMerge %34 None
+               OpBranchConditional %33 %35 %34
+         %35 = OpLabel
+               OpStore %GLF_live12c5 %false
+         %37 = OpLoad %bool %GLF_live12c5
+               OpSelectionMerge %38 None
+               OpBranchConditional %37 %39 %40
+         %39 = OpLabel
+               OpBranch %25
+         %40 = OpLabel
+               OpBranch %25
+         %38 = OpLabel
+               OpBranch %25
+         %34 = OpLabel
+               OpBranch %24
+         %25 = OpLabel
+               OpSelectionMerge %41 None
+               OpBranchConditional %false %42 %43
+         %42 = OpLabel
+               OpBranch %41
+         %43 = OpLabel
+               OpBranch %24
+         %41 = OpLabel
+               OpBranch %23
+         %24 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %44
+%tint_symbol = OpFunctionParameter %main_out
+         %48 = OpLabel
+         %49 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %49
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %51 = OpLabel
+         %52 = OpFunctionCall %void %main_1
+         %54 = OpLoad %v4float %x_GLF_color
+         %55 = OpCompositeConstruct %main_out %54
+         %53 = OpFunctionCall %void %tint_symbol_2 %55
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 25[%25] is not post dominated by the back-edge block 41[%41]
+  %41 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/break-in-do-while-with-nested-if/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/break-in-do-while-with-nested-if/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..4e7bacd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/break-in-do-while-with-nested-if/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,46 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+fn main_1() {
+  var GLF_live12c5 : bool;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  loop {
+    let x_31 : f32 = x_5.injectionSwitch.y;
+    if ((x_31 < 0.0)) {
+      GLF_live12c5 = false;
+      let x_35 : bool = GLF_live12c5;
+      if (x_35) {
+        continue;
+      } else {
+        continue;
+      }
+      continue;
+    }
+    break;
+
+    continuing {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/break-in-do-while-with-nested-if/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/break-in-do-while-with-nested-if/0-opt.wgsl
new file mode 100644
index 0000000..4e7bacd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/break-in-do-while-with-nested-if/0-opt.wgsl
@@ -0,0 +1,46 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+fn main_1() {
+  var GLF_live12c5 : bool;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  loop {
+    let x_31 : f32 = x_5.injectionSwitch.y;
+    if ((x_31 < 0.0)) {
+      GLF_live12c5 = false;
+      let x_35 : bool = GLF_live12c5;
+      if (x_35) {
+        continue;
+      } else {
+        continue;
+      }
+      continue;
+    }
+    break;
+
+    continuing {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/break-in-do-while-with-nested-if/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/break-in-do-while-with-nested-if/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..896cc41
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/break-in-do-while-with-nested-if/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,61 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+
+void main_1() {
+  bool GLF_live12c5 = false;
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  while (true) {
+    const float x_31 = asfloat(x_5[0].y);
+    if ((x_31 < 0.0f)) {
+      GLF_live12c5 = false;
+      if (GLF_live12c5) {
+        {
+          if (false) {
+          } else {
+            break;
+          }
+        }
+        continue;
+      } else {
+        {
+          if (false) {
+          } else {
+            break;
+          }
+        }
+        continue;
+      }
+      {
+        if (false) {
+        } else {
+          break;
+        }
+      }
+      continue;
+    }
+    break;
+    {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/break-in-do-while-with-nested-if/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/break-in-do-while-with-nested-if/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..f5bdadc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/break-in-do-while-with-nested-if/0-opt.wgsl.expected.msl
@@ -0,0 +1,65 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  bool GLF_live12c5 = false;
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  while (true) {
+    float const x_31 = x_5.injectionSwitch.y;
+    if ((x_31 < 0.0f)) {
+      GLF_live12c5 = false;
+      bool const x_35 = GLF_live12c5;
+      if (x_35) {
+        {
+          if (false) {
+          } else {
+            break;
+          }
+        }
+        continue;
+      } else {
+        {
+          if (false) {
+          } else {
+            break;
+          }
+        }
+        continue;
+      }
+      {
+        if (false) {
+        } else {
+          break;
+        }
+      }
+      continue;
+    }
+    break;
+    {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/break-in-do-while-with-nested-if/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/break-in-do-while-with-nested-if/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..84e6aca
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/break-in-do-while-with-nested-if/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,113 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 56
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_5 "x_5"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %GLF_live12c5 "GLF_live12c5"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %19 = OpConstantNull %bool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %22 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %false = OpConstantFalse %bool
+   %main_out = OpTypeStruct %v4float
+         %44 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+%GLF_live12c5 = OpVariable %_ptr_Function_bool Function %19
+               OpStore %x_GLF_color %22
+               OpBranch %23
+         %23 = OpLabel
+               OpLoopMerge %24 %25 None
+               OpBranch %26
+         %26 = OpLabel
+         %31 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %uint_1
+         %32 = OpLoad %float %31
+         %33 = OpFOrdLessThan %bool %32 %float_0
+               OpSelectionMerge %34 None
+               OpBranchConditional %33 %35 %34
+         %35 = OpLabel
+               OpStore %GLF_live12c5 %false
+         %37 = OpLoad %bool %GLF_live12c5
+               OpSelectionMerge %38 None
+               OpBranchConditional %37 %39 %40
+         %39 = OpLabel
+               OpBranch %25
+         %40 = OpLabel
+               OpBranch %25
+         %38 = OpLabel
+               OpBranch %25
+         %34 = OpLabel
+               OpBranch %24
+         %25 = OpLabel
+               OpSelectionMerge %41 None
+               OpBranchConditional %false %42 %43
+         %42 = OpLabel
+               OpBranch %41
+         %43 = OpLabel
+               OpBranch %24
+         %41 = OpLabel
+               OpBranch %23
+         %24 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %44
+%tint_symbol = OpFunctionParameter %main_out
+         %48 = OpLabel
+         %49 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %49
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %51 = OpLabel
+         %52 = OpFunctionCall %void %main_1
+         %54 = OpLoad %v4float %x_GLF_color
+         %55 = OpCompositeConstruct %main_out %54
+         %53 = OpFunctionCall %void %tint_symbol_2 %55
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 25[%25] is not post dominated by the back-edge block 41[%41]
+  %41 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/break-in-do-while-with-nested-if/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/break-in-do-while-with-nested-if/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..4e7bacd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/break-in-do-while-with-nested-if/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,46 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+fn main_1() {
+  var GLF_live12c5 : bool;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  loop {
+    let x_31 : f32 = x_5.injectionSwitch.y;
+    if ((x_31 < 0.0)) {
+      GLF_live12c5 = false;
+      let x_35 : bool = GLF_live12c5;
+      if (x_35) {
+        continue;
+      } else {
+        continue;
+      }
+      continue;
+    }
+    break;
+
+    continuing {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/call-function-with-discard/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/call-function-with-discard/0-opt.spvasm
new file mode 100644
index 0000000..d6c3f47
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/call-function-with-discard/0-opt.spvasm
@@ -0,0 +1,59 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %func_ "func("
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %float_1 = OpConstant %float 1
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %19 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+      %false = OpConstantFalse %bool
+         %21 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %8
+         %22 = OpLabel
+               OpStore %_GLF_color %19
+               OpBranch %23
+         %23 = OpLabel
+         %24 = OpFunctionCall %void %func_
+               OpLoopMerge %25 %23 None
+               OpBranchConditional %false %23 %25
+         %25 = OpLabel
+               OpStore %_GLF_color %21
+               OpReturn
+               OpFunctionEnd
+      %func_ = OpFunction %void None %8
+         %26 = OpLabel
+         %27 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %28 = OpLoad %float %27
+         %29 = OpFOrdGreaterThan %bool %float_1 %28
+               OpSelectionMerge %30 None
+               OpBranchConditional %29 %31 %30
+         %31 = OpLabel
+               OpKill
+         %30 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/call-function-with-discard/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/call-function-with-discard/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..993c3df
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/call-function-with-discard/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,39 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void func_() {
+  const float x_28 = asfloat(x_6[0].x);
+  if ((1.0f > x_28)) {
+    discard;
+  }
+  return;
+}
+
+void main_1() {
+  x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  while (true) {
+    func_();
+    if (false) {
+    } else {
+      break;
+    }
+  }
+  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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/call-function-with-discard/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/call-function-with-discard/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..54b06ad
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/call-function-with-discard/0-opt.spvasm.expected.msl
@@ -0,0 +1,42 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void func_(constant buf0& x_6) {
+  float const x_28 = x_6.one;
+  if ((1.0f > x_28)) {
+    discard_fragment();
+  }
+  return;
+}
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  while (true) {
+    func_(x_6);
+    if (false) {
+    } else {
+      break;
+    }
+  }
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/call-function-with-discard/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/call-function-with-discard/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..5378d74
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/call-function-with-discard/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,101 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 51
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_ "func_"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+         %28 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+      %false = OpConstantFalse %bool
+         %38 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %39 = OpTypeFunction %void %main_out
+      %func_ = OpFunction %void None %11
+         %14 = OpLabel
+         %18 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0
+         %19 = OpLoad %float %18
+         %21 = OpFOrdGreaterThan %bool %float_1 %19
+               OpSelectionMerge %23 None
+               OpBranchConditional %21 %24 %23
+         %24 = OpLabel
+               OpKill
+         %23 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %11
+         %26 = OpLabel
+               OpStore %x_GLF_color %28
+               OpBranch %29
+         %29 = OpLabel
+               OpLoopMerge %30 %31 None
+               OpBranch %32
+         %32 = OpLabel
+         %33 = OpFunctionCall %void %func_
+               OpSelectionMerge %35 None
+               OpBranchConditional %false %36 %37
+         %36 = OpLabel
+               OpBranch %35
+         %37 = OpLabel
+               OpBranch %30
+         %35 = OpLabel
+               OpBranch %31
+         %31 = OpLabel
+               OpBranch %29
+         %30 = OpLabel
+               OpStore %x_GLF_color %38
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %39
+%tint_symbol = OpFunctionParameter %main_out
+         %43 = OpLabel
+         %44 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %44
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %46 = OpLabel
+         %47 = OpFunctionCall %void %main_1
+         %49 = OpLoad %v4float %x_GLF_color
+         %50 = OpCompositeConstruct %main_out %49
+         %48 = OpFunctionCall %void %tint_symbol_2 %50
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/call-function-with-discard/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/call-function-with-discard/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..64f1aaa
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/call-function-with-discard/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,40 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() {
+  let x_28 : f32 = x_6.one;
+  if ((1.0 > x_28)) {
+    discard;
+  }
+  return;
+}
+
+fn main_1() {
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  loop {
+    func_();
+    if (false) {
+    } else {
+      break;
+    }
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/call-function-with-discard/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/call-function-with-discard/0-opt.wgsl
new file mode 100644
index 0000000..64f1aaa
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/call-function-with-discard/0-opt.wgsl
@@ -0,0 +1,40 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() {
+  let x_28 : f32 = x_6.one;
+  if ((1.0 > x_28)) {
+    discard;
+  }
+  return;
+}
+
+fn main_1() {
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  loop {
+    func_();
+    if (false) {
+    } else {
+      break;
+    }
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/call-function-with-discard/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/call-function-with-discard/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..993c3df
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/call-function-with-discard/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,39 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void func_() {
+  const float x_28 = asfloat(x_6[0].x);
+  if ((1.0f > x_28)) {
+    discard;
+  }
+  return;
+}
+
+void main_1() {
+  x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  while (true) {
+    func_();
+    if (false) {
+    } else {
+      break;
+    }
+  }
+  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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/call-function-with-discard/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/call-function-with-discard/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..54b06ad
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/call-function-with-discard/0-opt.wgsl.expected.msl
@@ -0,0 +1,42 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void func_(constant buf0& x_6) {
+  float const x_28 = x_6.one;
+  if ((1.0f > x_28)) {
+    discard_fragment();
+  }
+  return;
+}
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  while (true) {
+    func_(x_6);
+    if (false) {
+    } else {
+      break;
+    }
+  }
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/call-function-with-discard/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/call-function-with-discard/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..5378d74
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/call-function-with-discard/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,101 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 51
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_ "func_"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+         %28 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+      %false = OpConstantFalse %bool
+         %38 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %39 = OpTypeFunction %void %main_out
+      %func_ = OpFunction %void None %11
+         %14 = OpLabel
+         %18 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0
+         %19 = OpLoad %float %18
+         %21 = OpFOrdGreaterThan %bool %float_1 %19
+               OpSelectionMerge %23 None
+               OpBranchConditional %21 %24 %23
+         %24 = OpLabel
+               OpKill
+         %23 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %11
+         %26 = OpLabel
+               OpStore %x_GLF_color %28
+               OpBranch %29
+         %29 = OpLabel
+               OpLoopMerge %30 %31 None
+               OpBranch %32
+         %32 = OpLabel
+         %33 = OpFunctionCall %void %func_
+               OpSelectionMerge %35 None
+               OpBranchConditional %false %36 %37
+         %36 = OpLabel
+               OpBranch %35
+         %37 = OpLabel
+               OpBranch %30
+         %35 = OpLabel
+               OpBranch %31
+         %31 = OpLabel
+               OpBranch %29
+         %30 = OpLabel
+               OpStore %x_GLF_color %38
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %39
+%tint_symbol = OpFunctionParameter %main_out
+         %43 = OpLabel
+         %44 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %44
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %46 = OpLabel
+         %47 = OpFunctionCall %void %main_1
+         %49 = OpLoad %v4float %x_GLF_color
+         %50 = OpCompositeConstruct %main_out %49
+         %48 = OpFunctionCall %void %tint_symbol_2 %50
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/call-function-with-discard/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/call-function-with-discard/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..64f1aaa
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/call-function-with-discard/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,40 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() {
+  let x_28 : f32 = x_6.one;
+  if ((1.0 > x_28)) {
+    discard;
+  }
+  return;
+}
+
+fn main_1() {
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  loop {
+    func_();
+    if (false) {
+    } else {
+      break;
+    }
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.spvasm
new file mode 100644
index 0000000..07f5e01
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.spvasm
@@ -0,0 +1,93 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %data "data"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %data RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %7 RelaxedPrecision
+               OpDecorate %8 RelaxedPrecision
+               OpDecorate %9 RelaxedPrecision
+               OpDecorate %10 RelaxedPrecision
+               OpDecorate %11 RelaxedPrecision
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+         %31 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+    %float_0 = OpConstant %float 0
+         %33 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+      %int_2 = OpConstant %int 2
+       %main = OpFunction %void None %13
+         %36 = OpLabel
+       %data = OpVariable %_ptr_Function__arr_int_uint_10 Function
+         %37 = OpAccessChain %_ptr_Function_int %data %int_1
+          %7 = OpLoad %int %37
+         %38 = OpSLessThan %bool %int_1 %7
+         %10 = OpSelect %int %38 %int_2 %int_1
+               OpBranch %39
+         %39 = OpLabel
+         %40 = OpPhi %int %int_1 %36 %41 %42
+         %11 = OpPhi %int %10 %36 %8 %42
+         %43 = OpSLessThan %bool %11 %int_3
+               OpLoopMerge %44 %42 None
+               OpBranchConditional %43 %45 %44
+         %45 = OpLabel
+          %8 = OpIAdd %int %11 %int_1
+         %46 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %47 = OpLoad %float %46
+         %48 = OpConvertFToS %int %47
+               OpSelectionMerge %49 None
+               OpSwitch %48 %50 19 %51 38 %52 23 %52 78 %53
+         %50 = OpLabel
+               OpBranch %42
+         %51 = OpLabel
+          %9 = OpIAdd %int %40 %int_1
+               OpBranch %52
+         %52 = OpLabel
+         %54 = OpPhi %int %40 %45 %9 %51
+               OpBranch %42
+         %53 = OpLabel
+               OpStore %_GLF_color %31
+               OpBranch %50
+         %49 = OpLabel
+               OpBranch %42
+         %42 = OpLabel
+         %41 = OpPhi %int %40 %50 %54 %52 %int_0 %49
+               OpBranch %39
+         %44 = OpLabel
+         %55 = OpAccessChain %_ptr_Function_int %data %40
+               OpStore %55 %int_1
+               OpStore %_GLF_color %33
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..1dab6f0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,85 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int data[10] = (int[10])0;
+  int x_40 = 0;
+  int x_40_phi = 0;
+  int x_11_phi = 0;
+  const int x_7 = data[1];
+  const int x_10 = ((1 < x_7) ? 2 : 1);
+  x_40_phi = 1;
+  x_11_phi = x_10;
+  while (true) {
+    int x_54 = 0;
+    int x_41 = 0;
+    int x_41_phi = 0;
+    x_40 = x_40_phi;
+    const int x_11 = x_11_phi;
+    if ((x_11 < 3)) {
+    } else {
+      break;
+    }
+    int x_54_phi = 0;
+    const int x_8 = (x_11 + 1);
+    const float x_47 = asfloat(x_6[0].x);
+    x_54_phi = x_40;
+    switch(int(x_47)) {
+      case 78: {
+        x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+        /* fallthrough */
+      }
+      case 19: {
+        x_54_phi = asint((x_40 + asint(1)));
+        /* fallthrough */
+      }
+      case 23:
+      case 38: {
+        x_54 = x_54_phi;
+        x_41_phi = x_54;
+        {
+          x_41 = x_41_phi;
+          x_40_phi = x_41;
+          x_11_phi = x_8;
+        }
+        continue;
+        break;
+      }
+      default: {
+        x_41_phi = x_40;
+        {
+          x_41 = x_41_phi;
+          x_40_phi = x_41;
+          x_11_phi = x_8;
+        }
+        continue;
+        break;
+      }
+    }
+    x_41_phi = 0;
+    {
+      x_41 = x_41_phi;
+      x_40_phi = x_41;
+      x_11_phi = x_8;
+    }
+  }
+  data[x_40] = 1;
+  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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..1063af2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.spvasm.expected.msl
@@ -0,0 +1,91 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  tint_array_wrapper data = {};
+  int x_40 = 0;
+  int x_40_phi = 0;
+  int x_11_phi = 0;
+  int const x_7 = data.arr[1];
+  int const x_10 = select(1, 2, (1 < x_7));
+  x_40_phi = 1;
+  x_11_phi = x_10;
+  while (true) {
+    int x_54 = 0;
+    int x_41 = 0;
+    int x_41_phi = 0;
+    x_40 = x_40_phi;
+    int const x_11 = x_11_phi;
+    if ((x_11 < 3)) {
+    } else {
+      break;
+    }
+    int x_54_phi = 0;
+    int const x_8 = (x_11 + 1);
+    float const x_47 = x_6.injectionSwitch.x;
+    x_54_phi = x_40;
+    switch(int(x_47)) {
+      case 78: {
+        *(tint_symbol_4) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+        /* fallthrough */
+      }
+      case 19: {
+        x_54_phi = as_type<int>((x_40 + as_type<int>(1)));
+        /* fallthrough */
+      }
+      case 23:
+      case 38: {
+        x_54 = x_54_phi;
+        x_41_phi = x_54;
+        {
+          x_41 = x_41_phi;
+          x_40_phi = x_41;
+          x_11_phi = x_8;
+        }
+        continue;
+        break;
+      }
+      default: {
+        x_41_phi = x_40;
+        {
+          x_41 = x_41_phi;
+          x_40_phi = x_41;
+          x_11_phi = x_8;
+        }
+        continue;
+        break;
+      }
+    }
+    x_41_phi = 0;
+    {
+      x_41 = x_41_phi;
+      x_40_phi = x_41;
+      x_11_phi = x_8;
+    }
+  }
+  data.arr[x_40] = 1;
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..556a05f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,162 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 90
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %data "data"
+               OpName %x_40 "x_40"
+               OpName %x_40_phi "x_40_phi"
+               OpName %x_11_phi "x_11_phi"
+               OpName %x_54 "x_54"
+               OpName %x_41 "x_41"
+               OpName %x_41_phi "x_41_phi"
+               OpName %x_54_phi "x_54_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+         %22 = OpConstantNull %_arr_int_uint_10
+%_ptr_Function_int = OpTypePointer Function %int
+         %25 = OpConstantNull %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+         %63 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+      %int_0 = OpConstant %int 0
+    %float_0 = OpConstant %float 0
+         %77 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %78 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+       %data = OpVariable %_ptr_Function__arr_int_uint_10 Function %22
+       %x_40 = OpVariable %_ptr_Function_int Function %25
+   %x_40_phi = OpVariable %_ptr_Function_int Function %25
+   %x_11_phi = OpVariable %_ptr_Function_int Function %25
+       %x_54 = OpVariable %_ptr_Function_int Function %25
+       %x_41 = OpVariable %_ptr_Function_int Function %25
+   %x_41_phi = OpVariable %_ptr_Function_int Function %25
+   %x_54_phi = OpVariable %_ptr_Function_int Function %25
+         %29 = OpAccessChain %_ptr_Function_int %data %int_1
+         %30 = OpLoad %int %29
+         %32 = OpSLessThan %bool %int_1 %30
+         %31 = OpSelect %int %32 %int_2 %int_1
+               OpStore %x_40_phi %int_1
+               OpStore %x_11_phi %31
+               OpBranch %35
+         %35 = OpLabel
+               OpLoopMerge %36 %37 None
+               OpBranch %38
+         %38 = OpLabel
+         %42 = OpLoad %int %x_40_phi
+               OpStore %x_40 %42
+         %43 = OpLoad %int %x_11_phi
+         %45 = OpSLessThan %bool %43 %int_3
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %48
+         %47 = OpLabel
+               OpBranch %46
+         %48 = OpLabel
+               OpBranch %36
+         %46 = OpLabel
+         %50 = OpIAdd %int %43 %int_1
+         %53 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+         %54 = OpLoad %float %53
+         %55 = OpLoad %int %x_40
+               OpStore %x_54_phi %55
+         %57 = OpConvertFToS %int %54
+               OpSelectionMerge %56 None
+               OpSwitch %57 %58 78 %59 19 %60 23 %61 38 %61
+         %59 = OpLabel
+               OpStore %x_GLF_color %63
+               OpBranch %60
+         %60 = OpLabel
+         %65 = OpLoad %int %x_40
+         %66 = OpCopyObject %int %int_1
+         %67 = OpIAdd %int %65 %66
+         %64 = OpCopyObject %int %67
+               OpStore %x_54_phi %64
+               OpBranch %61
+         %61 = OpLabel
+         %68 = OpLoad %int %x_54_phi
+               OpStore %x_54 %68
+         %69 = OpLoad %int %x_54
+               OpStore %x_41_phi %69
+               OpBranch %37
+         %58 = OpLabel
+         %70 = OpLoad %int %x_40
+               OpStore %x_41_phi %70
+               OpBranch %37
+         %56 = OpLabel
+               OpStore %x_41_phi %int_0
+               OpBranch %37
+         %37 = OpLabel
+         %72 = OpLoad %int %x_41_phi
+               OpStore %x_41 %72
+         %73 = OpLoad %int %x_41
+               OpStore %x_40_phi %73
+               OpStore %x_11_phi %50
+               OpBranch %35
+         %36 = OpLabel
+         %74 = OpLoad %int %x_40
+         %75 = OpAccessChain %_ptr_Function_int %data %74
+               OpStore %75 %int_1
+               OpStore %x_GLF_color %77
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %78
+%tint_symbol = OpFunctionParameter %main_out
+         %82 = OpLabel
+         %83 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %83
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %85 = OpLabel
+         %86 = OpFunctionCall %void %main_1
+         %88 = OpLoad %v4float %x_GLF_color
+         %89 = OpCompositeConstruct %main_out %88
+         %87 = OpFunctionCall %void %tint_symbol_2 %89
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..e49880e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,74 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var data : array<i32, 10>;
+  var x_40 : i32;
+  var x_40_phi : i32;
+  var x_11_phi : i32;
+  let x_7 : i32 = data[1];
+  let x_10 : i32 = select(1, 2, (1 < x_7));
+  x_40_phi = 1;
+  x_11_phi = x_10;
+  loop {
+    var x_54 : i32;
+    var x_41 : i32;
+    var x_41_phi : i32;
+    x_40 = x_40_phi;
+    let x_11 : i32 = x_11_phi;
+    if ((x_11 < 3)) {
+    } else {
+      break;
+    }
+    var x_54_phi : i32;
+    let x_8 : i32 = (x_11 + 1);
+    let x_47 : f32 = x_6.injectionSwitch.x;
+    x_54_phi = x_40;
+    switch(i32(x_47)) {
+      case 78: {
+        x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+        fallthrough;
+      }
+      case 19: {
+        x_54_phi = bitcast<i32>((x_40 + bitcast<i32>(1)));
+        fallthrough;
+      }
+      case 23, 38: {
+        x_54 = x_54_phi;
+        x_41_phi = x_54;
+        continue;
+      }
+      default: {
+        x_41_phi = x_40;
+        continue;
+      }
+    }
+    x_41_phi = 0;
+
+    continuing {
+      x_41 = x_41_phi;
+      x_40_phi = x_41;
+      x_11_phi = x_8;
+    }
+  }
+  data[x_40] = 1;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.wgsl
new file mode 100644
index 0000000..e49880e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.wgsl
@@ -0,0 +1,74 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var data : array<i32, 10>;
+  var x_40 : i32;
+  var x_40_phi : i32;
+  var x_11_phi : i32;
+  let x_7 : i32 = data[1];
+  let x_10 : i32 = select(1, 2, (1 < x_7));
+  x_40_phi = 1;
+  x_11_phi = x_10;
+  loop {
+    var x_54 : i32;
+    var x_41 : i32;
+    var x_41_phi : i32;
+    x_40 = x_40_phi;
+    let x_11 : i32 = x_11_phi;
+    if ((x_11 < 3)) {
+    } else {
+      break;
+    }
+    var x_54_phi : i32;
+    let x_8 : i32 = (x_11 + 1);
+    let x_47 : f32 = x_6.injectionSwitch.x;
+    x_54_phi = x_40;
+    switch(i32(x_47)) {
+      case 78: {
+        x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+        fallthrough;
+      }
+      case 19: {
+        x_54_phi = bitcast<i32>((x_40 + bitcast<i32>(1)));
+        fallthrough;
+      }
+      case 23, 38: {
+        x_54 = x_54_phi;
+        x_41_phi = x_54;
+        continue;
+      }
+      default: {
+        x_41_phi = x_40;
+        continue;
+      }
+    }
+    x_41_phi = 0;
+
+    continuing {
+      x_41 = x_41_phi;
+      x_40_phi = x_41;
+      x_11_phi = x_8;
+    }
+  }
+  data[x_40] = 1;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..1dab6f0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,85 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int data[10] = (int[10])0;
+  int x_40 = 0;
+  int x_40_phi = 0;
+  int x_11_phi = 0;
+  const int x_7 = data[1];
+  const int x_10 = ((1 < x_7) ? 2 : 1);
+  x_40_phi = 1;
+  x_11_phi = x_10;
+  while (true) {
+    int x_54 = 0;
+    int x_41 = 0;
+    int x_41_phi = 0;
+    x_40 = x_40_phi;
+    const int x_11 = x_11_phi;
+    if ((x_11 < 3)) {
+    } else {
+      break;
+    }
+    int x_54_phi = 0;
+    const int x_8 = (x_11 + 1);
+    const float x_47 = asfloat(x_6[0].x);
+    x_54_phi = x_40;
+    switch(int(x_47)) {
+      case 78: {
+        x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+        /* fallthrough */
+      }
+      case 19: {
+        x_54_phi = asint((x_40 + asint(1)));
+        /* fallthrough */
+      }
+      case 23:
+      case 38: {
+        x_54 = x_54_phi;
+        x_41_phi = x_54;
+        {
+          x_41 = x_41_phi;
+          x_40_phi = x_41;
+          x_11_phi = x_8;
+        }
+        continue;
+        break;
+      }
+      default: {
+        x_41_phi = x_40;
+        {
+          x_41 = x_41_phi;
+          x_40_phi = x_41;
+          x_11_phi = x_8;
+        }
+        continue;
+        break;
+      }
+    }
+    x_41_phi = 0;
+    {
+      x_41 = x_41_phi;
+      x_40_phi = x_41;
+      x_11_phi = x_8;
+    }
+  }
+  data[x_40] = 1;
+  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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..1063af2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.wgsl.expected.msl
@@ -0,0 +1,91 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  tint_array_wrapper data = {};
+  int x_40 = 0;
+  int x_40_phi = 0;
+  int x_11_phi = 0;
+  int const x_7 = data.arr[1];
+  int const x_10 = select(1, 2, (1 < x_7));
+  x_40_phi = 1;
+  x_11_phi = x_10;
+  while (true) {
+    int x_54 = 0;
+    int x_41 = 0;
+    int x_41_phi = 0;
+    x_40 = x_40_phi;
+    int const x_11 = x_11_phi;
+    if ((x_11 < 3)) {
+    } else {
+      break;
+    }
+    int x_54_phi = 0;
+    int const x_8 = (x_11 + 1);
+    float const x_47 = x_6.injectionSwitch.x;
+    x_54_phi = x_40;
+    switch(int(x_47)) {
+      case 78: {
+        *(tint_symbol_4) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+        /* fallthrough */
+      }
+      case 19: {
+        x_54_phi = as_type<int>((x_40 + as_type<int>(1)));
+        /* fallthrough */
+      }
+      case 23:
+      case 38: {
+        x_54 = x_54_phi;
+        x_41_phi = x_54;
+        {
+          x_41 = x_41_phi;
+          x_40_phi = x_41;
+          x_11_phi = x_8;
+        }
+        continue;
+        break;
+      }
+      default: {
+        x_41_phi = x_40;
+        {
+          x_41 = x_41_phi;
+          x_40_phi = x_41;
+          x_11_phi = x_8;
+        }
+        continue;
+        break;
+      }
+    }
+    x_41_phi = 0;
+    {
+      x_41 = x_41_phi;
+      x_40_phi = x_41;
+      x_11_phi = x_8;
+    }
+  }
+  data.arr[x_40] = 1;
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..556a05f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,162 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 90
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %data "data"
+               OpName %x_40 "x_40"
+               OpName %x_40_phi "x_40_phi"
+               OpName %x_11_phi "x_11_phi"
+               OpName %x_54 "x_54"
+               OpName %x_41 "x_41"
+               OpName %x_41_phi "x_41_phi"
+               OpName %x_54_phi "x_54_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+         %22 = OpConstantNull %_arr_int_uint_10
+%_ptr_Function_int = OpTypePointer Function %int
+         %25 = OpConstantNull %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+         %63 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+      %int_0 = OpConstant %int 0
+    %float_0 = OpConstant %float 0
+         %77 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %78 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+       %data = OpVariable %_ptr_Function__arr_int_uint_10 Function %22
+       %x_40 = OpVariable %_ptr_Function_int Function %25
+   %x_40_phi = OpVariable %_ptr_Function_int Function %25
+   %x_11_phi = OpVariable %_ptr_Function_int Function %25
+       %x_54 = OpVariable %_ptr_Function_int Function %25
+       %x_41 = OpVariable %_ptr_Function_int Function %25
+   %x_41_phi = OpVariable %_ptr_Function_int Function %25
+   %x_54_phi = OpVariable %_ptr_Function_int Function %25
+         %29 = OpAccessChain %_ptr_Function_int %data %int_1
+         %30 = OpLoad %int %29
+         %32 = OpSLessThan %bool %int_1 %30
+         %31 = OpSelect %int %32 %int_2 %int_1
+               OpStore %x_40_phi %int_1
+               OpStore %x_11_phi %31
+               OpBranch %35
+         %35 = OpLabel
+               OpLoopMerge %36 %37 None
+               OpBranch %38
+         %38 = OpLabel
+         %42 = OpLoad %int %x_40_phi
+               OpStore %x_40 %42
+         %43 = OpLoad %int %x_11_phi
+         %45 = OpSLessThan %bool %43 %int_3
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %48
+         %47 = OpLabel
+               OpBranch %46
+         %48 = OpLabel
+               OpBranch %36
+         %46 = OpLabel
+         %50 = OpIAdd %int %43 %int_1
+         %53 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+         %54 = OpLoad %float %53
+         %55 = OpLoad %int %x_40
+               OpStore %x_54_phi %55
+         %57 = OpConvertFToS %int %54
+               OpSelectionMerge %56 None
+               OpSwitch %57 %58 78 %59 19 %60 23 %61 38 %61
+         %59 = OpLabel
+               OpStore %x_GLF_color %63
+               OpBranch %60
+         %60 = OpLabel
+         %65 = OpLoad %int %x_40
+         %66 = OpCopyObject %int %int_1
+         %67 = OpIAdd %int %65 %66
+         %64 = OpCopyObject %int %67
+               OpStore %x_54_phi %64
+               OpBranch %61
+         %61 = OpLabel
+         %68 = OpLoad %int %x_54_phi
+               OpStore %x_54 %68
+         %69 = OpLoad %int %x_54
+               OpStore %x_41_phi %69
+               OpBranch %37
+         %58 = OpLabel
+         %70 = OpLoad %int %x_40
+               OpStore %x_41_phi %70
+               OpBranch %37
+         %56 = OpLabel
+               OpStore %x_41_phi %int_0
+               OpBranch %37
+         %37 = OpLabel
+         %72 = OpLoad %int %x_41_phi
+               OpStore %x_41 %72
+         %73 = OpLoad %int %x_41
+               OpStore %x_40_phi %73
+               OpStore %x_11_phi %50
+               OpBranch %35
+         %36 = OpLabel
+         %74 = OpLoad %int %x_40
+         %75 = OpAccessChain %_ptr_Function_int %data %74
+               OpStore %75 %int_1
+               OpStore %x_GLF_color %77
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %78
+%tint_symbol = OpFunctionParameter %main_out
+         %82 = OpLabel
+         %83 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %83
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %85 = OpLabel
+         %86 = OpFunctionCall %void %main_1
+         %88 = OpLoad %v4float %x_GLF_color
+         %89 = OpCompositeConstruct %main_out %88
+         %87 = OpFunctionCall %void %tint_symbol_2 %89
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..e49880e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,74 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var data : array<i32, 10>;
+  var x_40 : i32;
+  var x_40_phi : i32;
+  var x_11_phi : i32;
+  let x_7 : i32 = data[1];
+  let x_10 : i32 = select(1, 2, (1 < x_7));
+  x_40_phi = 1;
+  x_11_phi = x_10;
+  loop {
+    var x_54 : i32;
+    var x_41 : i32;
+    var x_41_phi : i32;
+    x_40 = x_40_phi;
+    let x_11 : i32 = x_11_phi;
+    if ((x_11 < 3)) {
+    } else {
+      break;
+    }
+    var x_54_phi : i32;
+    let x_8 : i32 = (x_11 + 1);
+    let x_47 : f32 = x_6.injectionSwitch.x;
+    x_54_phi = x_40;
+    switch(i32(x_47)) {
+      case 78: {
+        x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+        fallthrough;
+      }
+      case 19: {
+        x_54_phi = bitcast<i32>((x_40 + bitcast<i32>(1)));
+        fallthrough;
+      }
+      case 23, 38: {
+        x_54 = x_54_phi;
+        x_41_phi = x_54;
+        continue;
+      }
+      default: {
+        x_41_phi = x_40;
+        continue;
+      }
+    }
+    x_41_phi = 0;
+
+    continuing {
+      x_41 = x_41_phi;
+      x_40_phi = x_41;
+      x_11_phi = x_8;
+    }
+  }
+  data[x_40] = 1;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/color-set-in-for-loop/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/color-set-in-for-loop/0-opt.spvasm
new file mode 100644
index 0000000..79f78a2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/color-set-in-for-loop/0-opt.spvasm
@@ -0,0 +1,62 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %22 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+         %23 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %7
+         %24 = OpLabel
+         %25 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %26 = OpLoad %float %25
+         %27 = OpFOrdGreaterThan %bool %26 %float_1
+               OpSelectionMerge %28 None
+               OpBranchConditional %27 %29 %28
+         %29 = OpLabel
+               OpBranch %30
+         %30 = OpLabel
+               OpLoopMerge %31 %32 None
+               OpBranch %33
+         %33 = OpLabel
+               OpBranch %34
+         %34 = OpLabel
+               OpStore %_GLF_color %22
+               OpBranch %32
+         %32 = OpLabel
+               OpBranch %30
+         %31 = OpLabel
+               OpUnreachable
+         %28 = OpLabel
+               OpStore %_GLF_color %23
+               OpReturn
+               OpFunctionEnd
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
new file mode 100755
index 0000000..4f12524
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/color-set-in-for-loop/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,38 @@
+SKIP: FAILED
+
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const float x_26 = asfloat(x_5[0].x);
+  if ((x_26 > 1.0f)) {
+    while (true) {
+      x_GLF_color = float4(0.0f, 0.0f, 0.0f, 1.0f);
+    }
+    return;
+  }
+  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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
+error: validation errors
+T:\tmp\u2wg.0:25: error: Loop must have break.
+Validation failed.
+
+
+
diff --git a/test/vk-gl-cts/graphicsfuzz/color-set-in-for-loop/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/color-set-in-for-loop/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..7bf030e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/color-set-in-for-loop/0-opt.spvasm.expected.msl
@@ -0,0 +1,33 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  float const x_26 = x_5.injectionSwitch.x;
+  if ((x_26 > 1.0f)) {
+    while (true) {
+      *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 1.0f);
+    }
+    return;
+  }
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/color-set-in-for-loop/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/color-set-in-for-loop/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..5ae61bc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/color-set-in-for-loop/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,88 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 45
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+         %31 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+         %32 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %33 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+         %19 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %uint_0
+         %20 = OpLoad %float %19
+         %22 = OpFOrdGreaterThan %bool %20 %float_1
+               OpSelectionMerge %24 None
+               OpBranchConditional %22 %25 %24
+         %25 = OpLabel
+               OpBranch %26
+         %26 = OpLabel
+               OpLoopMerge %27 %28 None
+               OpBranch %29
+         %29 = OpLabel
+               OpStore %x_GLF_color %31
+               OpBranch %28
+         %28 = OpLabel
+               OpBranch %26
+         %27 = OpLabel
+               OpReturn
+         %24 = OpLabel
+               OpStore %x_GLF_color %32
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %33
+%tint_symbol = OpFunctionParameter %main_out
+         %37 = OpLabel
+         %38 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %38
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %40 = OpLabel
+         %41 = OpFunctionCall %void %main_1
+         %43 = OpLoad %v4float %x_GLF_color
+         %44 = OpCompositeConstruct %main_out %43
+         %42 = OpFunctionCall %void %tint_symbol_2 %44
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/color-set-in-for-loop/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/color-set-in-for-loop/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..1d247e7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/color-set-in-for-loop/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,31 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_26 : f32 = x_5.injectionSwitch.x;
+  if ((x_26 > 1.0)) {
+    loop {
+      x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+    }
+    return;
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/color-set-in-for-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/color-set-in-for-loop/0-opt.wgsl
new file mode 100644
index 0000000..1d247e7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/color-set-in-for-loop/0-opt.wgsl
@@ -0,0 +1,31 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_26 : f32 = x_5.injectionSwitch.x;
+  if ((x_26 > 1.0)) {
+    loop {
+      x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+    }
+    return;
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
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
new file mode 100755
index 0000000..a19c1f6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/color-set-in-for-loop/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,38 @@
+SKIP: FAILED
+
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const float x_26 = asfloat(x_5[0].x);
+  if ((x_26 > 1.0f)) {
+    while (true) {
+      x_GLF_color = float4(0.0f, 0.0f, 0.0f, 1.0f);
+    }
+    return;
+  }
+  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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
+error: validation errors
+T:\tmp\uc0s.0:25: error: Loop must have break.
+Validation failed.
+
+
+
diff --git a/test/vk-gl-cts/graphicsfuzz/color-set-in-for-loop/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/color-set-in-for-loop/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..7bf030e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/color-set-in-for-loop/0-opt.wgsl.expected.msl
@@ -0,0 +1,33 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  float const x_26 = x_5.injectionSwitch.x;
+  if ((x_26 > 1.0f)) {
+    while (true) {
+      *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 1.0f);
+    }
+    return;
+  }
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/color-set-in-for-loop/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/color-set-in-for-loop/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..5ae61bc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/color-set-in-for-loop/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,88 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 45
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+         %31 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+         %32 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %33 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+         %19 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %uint_0
+         %20 = OpLoad %float %19
+         %22 = OpFOrdGreaterThan %bool %20 %float_1
+               OpSelectionMerge %24 None
+               OpBranchConditional %22 %25 %24
+         %25 = OpLabel
+               OpBranch %26
+         %26 = OpLabel
+               OpLoopMerge %27 %28 None
+               OpBranch %29
+         %29 = OpLabel
+               OpStore %x_GLF_color %31
+               OpBranch %28
+         %28 = OpLabel
+               OpBranch %26
+         %27 = OpLabel
+               OpReturn
+         %24 = OpLabel
+               OpStore %x_GLF_color %32
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %33
+%tint_symbol = OpFunctionParameter %main_out
+         %37 = OpLabel
+         %38 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %38
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %40 = OpLabel
+         %41 = OpFunctionCall %void %main_1
+         %43 = OpLoad %v4float %x_GLF_color
+         %44 = OpCompositeConstruct %main_out %43
+         %42 = OpFunctionCall %void %tint_symbol_2 %44
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/color-set-in-for-loop/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/color-set-in-for-loop/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..1d247e7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/color-set-in-for-loop/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,31 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_26 : f32 = x_5.injectionSwitch.x;
+  if ((x_26 > 1.0)) {
+    loop {
+      x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+    }
+    return;
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/color-write-in-loop/0.spvasm b/test/vk-gl-cts/graphicsfuzz/color-write-in-loop/0.spvasm
new file mode 100644
index 0000000..4154ff3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/color-write-in-loop/0.spvasm
@@ -0,0 +1,100 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %S "S"
+               OpMemberName %S 0 "f0"
+               OpMemberName %S 1 "f1"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %S 0 RelaxedPrecision
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %6 RelaxedPrecision
+               OpDecorate %7 RelaxedPrecision
+               OpDecorate %8 RelaxedPrecision
+               OpDecorate %9 RelaxedPrecision
+               OpDecorate %10 RelaxedPrecision
+               OpDecorate %11 RelaxedPrecision
+               OpDecorate %12 RelaxedPrecision
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+%mat4v3float = OpTypeMatrix %v3float 4
+          %S = OpTypeStruct %int %mat4v3float
+      %int_0 = OpConstant %int 0
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %22 = OpConstantComposite %v3float %float_1 %float_0 %float_0
+         %23 = OpConstantComposite %v3float %float_0 %float_1 %float_0
+         %24 = OpConstantComposite %v3float %float_0 %float_0 %float_1
+         %25 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+         %26 = OpConstantComposite %mat4v3float %22 %23 %24 %25
+         %27 = OpConstantComposite %S %int_0 %26
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %37 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+   %int_1000 = OpConstant %int 1000
+         %39 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %14
+         %40 = OpLabel
+               OpBranch %41
+         %41 = OpLabel
+               OpLoopMerge %42 %43 None
+               OpBranch %44
+         %44 = OpLabel
+         %45 = OpPhi %S %27 %41 %46 %47
+         %11 = OpPhi %int %int_0 %41 %9 %47
+         %48 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %49 = OpLoad %float %48
+         %50 = OpFOrdEqual %bool %49 %float_0
+         %51 = OpSelect %int %50 %int_1 %int_2
+         %52 = OpSLessThan %bool %11 %51
+               OpLoopMerge %53 %47 None
+               OpBranchConditional %52 %47 %53
+         %47 = OpLabel
+               OpStore %_GLF_color %37
+          %7 = OpCompositeExtract %int %45 0
+          %8 = OpIAdd %int %7 %int_1
+         %46 = OpCompositeInsert %S %8 %45 0
+          %9 = OpIAdd %int %11 %int_1
+               OpBranch %44
+         %53 = OpLabel
+         %10 = OpCompositeExtract %int %45 0
+         %54 = OpSLessThan %bool %10 %int_1000
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %55
+         %56 = OpLabel
+               OpBranch %42
+         %55 = OpLabel
+               OpBranch %42
+         %43 = OpLabel
+               OpBranch %41
+         %42 = OpLabel
+               OpBranch %57
+         %57 = OpLabel
+         %12 = OpPhi %int %int_0 %42 %6 %58
+         %59 = OpSLessThan %bool %12 %51
+               OpLoopMerge %60 %58 None
+               OpBranchConditional %59 %58 %60
+         %58 = OpLabel
+               OpStore %_GLF_color %39
+          %6 = OpIAdd %int %12 %int_1
+               OpBranch %57
+         %60 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/color-write-in-loop/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/color-write-in-loop/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..f98d1d7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/color-write-in-loop/0.spvasm.expected.hlsl
@@ -0,0 +1,78 @@
+struct S {
+  int f0;
+  float4x3 f1;
+};
+
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int x_51 = 0;
+  int x_12_phi = 0;
+  while (true) {
+    S x_45 = (S)0;
+    S x_45_phi = (S)0;
+    int x_11_phi = 0;
+    const S tint_symbol_4 = {0, float4x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f), float3(0.0f, 0.0f, 0.0f))};
+    x_45_phi = tint_symbol_4;
+    x_11_phi = 0;
+    while (true) {
+      S x_46 = (S)0;
+      int x_9 = 0;
+      x_45 = x_45_phi;
+      const int x_11 = x_11_phi;
+      const float x_49 = gl_FragCoord.x;
+      x_51 = ((x_49 == 0.0f) ? 1 : 2);
+      if ((x_11 < x_51)) {
+      } else {
+        break;
+      }
+      {
+        x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+        x_46 = x_45;
+        x_46.f0 = (x_45.f0 + 1);
+        x_9 = (x_11 + 1);
+        x_45_phi = x_46;
+        x_11_phi = x_9;
+      }
+    }
+    if ((x_45.f0 < 1000)) {
+      break;
+    }
+    break;
+  }
+  x_12_phi = 0;
+  while (true) {
+    int x_6 = 0;
+    const int x_12 = x_12_phi;
+    if ((x_12 < x_51)) {
+    } else {
+      break;
+    }
+    {
+      x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+      x_6 = (x_12 + 1);
+      x_12_phi = x_6;
+    }
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/color-write-in-loop/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/color-write-in-loop/0.spvasm.expected.msl
new file mode 100644
index 0000000..734666e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/color-write-in-loop/0.spvasm.expected.msl
@@ -0,0 +1,76 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  int f0;
+  float4x3 f1;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  int x_51 = 0;
+  int x_12_phi = 0;
+  while (true) {
+    S x_45 = {};
+    S x_45_phi = {};
+    int x_11_phi = 0;
+    S const tint_symbol_4 = {.f0=0, .f1=float4x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f), float3(0.0f, 0.0f, 0.0f))};
+    x_45_phi = tint_symbol_4;
+    x_11_phi = 0;
+    while (true) {
+      S x_46 = {};
+      int x_9 = 0;
+      x_45 = x_45_phi;
+      int const x_11 = x_11_phi;
+      float const x_49 = (*(tint_symbol_6)).x;
+      x_51 = select(2, 1, (x_49 == 0.0f));
+      if ((x_11 < x_51)) {
+      } else {
+        break;
+      }
+      {
+        *(tint_symbol_7) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+        x_46 = x_45;
+        x_46.f0 = (x_45.f0 + 1);
+        x_9 = (x_11 + 1);
+        x_45_phi = x_46;
+        x_11_phi = x_9;
+      }
+    }
+    if ((x_45.f0 < 1000)) {
+      break;
+    }
+    break;
+  }
+  x_12_phi = 0;
+  while (true) {
+    int x_6 = 0;
+    int const x_12 = x_12_phi;
+    if ((x_12 < x_51)) {
+    } else {
+      break;
+    }
+    {
+      *(tint_symbol_7) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+      x_6 = (x_12 + 1);
+      x_12_phi = x_6;
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(&(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/color-write-in-loop/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/color-write-in-loop/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..c5af5ad
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/color-write-in-loop/0.spvasm.expected.spvasm
@@ -0,0 +1,190 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 106
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %x_51 "x_51"
+               OpName %x_12_phi "x_12_phi"
+               OpName %S "S"
+               OpMemberName %S 0 "f0"
+               OpMemberName %S 1 "f1"
+               OpName %x_45 "x_45"
+               OpName %x_45_phi "x_45_phi"
+               OpName %x_11_phi "x_11_phi"
+               OpName %x_46 "x_46"
+               OpName %x_9 "x_9"
+               OpName %x_6 "x_6"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %S 0 Offset 0
+               OpMemberDecorate %S 1 Offset 16
+               OpMemberDecorate %S 1 ColMajor
+               OpMemberDecorate %S 1 MatrixStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+    %v3float = OpTypeVector %float 3
+%mat4v3float = OpTypeMatrix %v3float 4
+          %S = OpTypeStruct %int %mat4v3float
+%_ptr_Function_S = OpTypePointer Function %S
+         %29 = OpConstantNull %S
+      %int_0 = OpConstant %int 0
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %35 = OpConstantComposite %v3float %float_1 %float_0 %float_0
+         %36 = OpConstantComposite %v3float %float_0 %float_1 %float_0
+         %37 = OpConstantComposite %v3float %float_0 %float_0 %float_1
+         %38 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+         %39 = OpConstantComposite %mat4v3float %35 %36 %37 %38
+         %40 = OpConstantComposite %S %int_0 %39
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+         %64 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+   %int_1000 = OpConstant %int 1000
+         %90 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %93 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+       %x_51 = OpVariable %_ptr_Function_int Function %18
+   %x_12_phi = OpVariable %_ptr_Function_int Function %18
+       %x_45 = OpVariable %_ptr_Function_S Function %29
+   %x_45_phi = OpVariable %_ptr_Function_S Function %29
+   %x_11_phi = OpVariable %_ptr_Function_int Function %18
+       %x_46 = OpVariable %_ptr_Function_S Function %29
+        %x_9 = OpVariable %_ptr_Function_int Function %18
+        %x_6 = OpVariable %_ptr_Function_int Function %18
+               OpBranch %20
+         %20 = OpLabel
+               OpLoopMerge %21 %22 None
+               OpBranch %23
+         %23 = OpLabel
+               OpStore %x_45_phi %40
+               OpStore %x_11_phi %int_0
+               OpBranch %41
+         %41 = OpLabel
+               OpLoopMerge %42 %43 None
+               OpBranch %44
+         %44 = OpLabel
+         %47 = OpLoad %S %x_45_phi
+               OpStore %x_45 %47
+         %48 = OpLoad %int %x_11_phi
+         %52 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %53 = OpLoad %float %52
+         %55 = OpFOrdEqual %bool %53 %float_0
+         %54 = OpSelect %int %55 %int_1 %int_2
+               OpStore %x_51 %54
+         %59 = OpLoad %int %x_51
+         %60 = OpSLessThan %bool %48 %59
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %63
+         %62 = OpLabel
+               OpBranch %61
+         %63 = OpLabel
+               OpBranch %42
+         %61 = OpLabel
+               OpBranch %43
+         %43 = OpLabel
+               OpStore %x_GLF_color %64
+         %65 = OpLoad %S %x_45
+               OpStore %x_46 %65
+         %66 = OpAccessChain %_ptr_Function_int %x_46 %uint_0
+         %67 = OpAccessChain %_ptr_Function_int %x_45 %uint_0
+         %68 = OpLoad %int %67
+         %69 = OpIAdd %int %68 %int_1
+               OpStore %66 %69
+         %70 = OpIAdd %int %48 %int_1
+               OpStore %x_9 %70
+         %71 = OpLoad %S %x_46
+               OpStore %x_45_phi %71
+         %72 = OpLoad %int %x_9
+               OpStore %x_11_phi %72
+               OpBranch %41
+         %42 = OpLabel
+         %73 = OpAccessChain %_ptr_Function_int %x_45 %uint_0
+         %74 = OpLoad %int %73
+         %76 = OpSLessThan %bool %74 %int_1000
+               OpSelectionMerge %77 None
+               OpBranchConditional %76 %78 %77
+         %78 = OpLabel
+               OpBranch %21
+         %77 = OpLabel
+               OpBranch %21
+         %22 = OpLabel
+               OpBranch %20
+         %21 = OpLabel
+               OpStore %x_12_phi %int_0
+               OpBranch %79
+         %79 = OpLabel
+               OpLoopMerge %80 %81 None
+               OpBranch %82
+         %82 = OpLabel
+         %84 = OpLoad %int %x_12_phi
+         %85 = OpLoad %int %x_51
+         %86 = OpSLessThan %bool %84 %85
+               OpSelectionMerge %87 None
+               OpBranchConditional %86 %88 %89
+         %88 = OpLabel
+               OpBranch %87
+         %89 = OpLabel
+               OpBranch %80
+         %87 = OpLabel
+               OpBranch %81
+         %81 = OpLabel
+               OpStore %x_GLF_color %90
+         %91 = OpIAdd %int %84 %int_1
+               OpStore %x_6 %91
+         %92 = OpLoad %int %x_6
+               OpStore %x_12_phi %92
+               OpBranch %79
+         %80 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %93
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %97 = OpLabel
+         %98 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %98
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+        %100 = OpLabel
+        %101 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %101
+        %102 = OpFunctionCall %void %main_1
+        %104 = OpLoad %v4float %x_GLF_color
+        %105 = OpCompositeConstruct %main_out %104
+        %103 = OpFunctionCall %void %tint_symbol_3 %105
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/color-write-in-loop/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/color-write-in-loop/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..088c0f8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/color-write-in-loop/0.spvasm.expected.wgsl
@@ -0,0 +1,73 @@
+struct S {
+  f0 : i32;
+  f1 : mat4x3<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_51 : i32;
+  var x_12_phi : i32;
+  loop {
+    var x_45 : S;
+    var x_45_phi : S;
+    var x_11_phi : i32;
+    x_45_phi = S(0, mat4x3<f32>(vec3<f32>(1.0, 0.0, 0.0), vec3<f32>(0.0, 1.0, 0.0), vec3<f32>(0.0, 0.0, 1.0), vec3<f32>(0.0, 0.0, 0.0)));
+    x_11_phi = 0;
+    loop {
+      var x_46 : S;
+      var x_9 : i32;
+      x_45 = x_45_phi;
+      let x_11 : i32 = x_11_phi;
+      let x_49 : f32 = gl_FragCoord.x;
+      x_51 = select(2, 1, (x_49 == 0.0));
+      if ((x_11 < x_51)) {
+      } else {
+        break;
+      }
+
+      continuing {
+        x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+        x_46 = x_45;
+        x_46.f0 = (x_45.f0 + 1);
+        x_9 = (x_11 + 1);
+        x_45_phi = x_46;
+        x_11_phi = x_9;
+      }
+    }
+    if ((x_45.f0 < 1000)) {
+      break;
+    }
+    break;
+  }
+  x_12_phi = 0;
+  loop {
+    var x_6 : i32;
+    let x_12 : i32 = x_12_phi;
+    if ((x_12 < x_51)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+      x_6 = (x_12 + 1);
+      x_12_phi = x_6;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/color-write-in-loop/0.wgsl b/test/vk-gl-cts/graphicsfuzz/color-write-in-loop/0.wgsl
new file mode 100644
index 0000000..088c0f8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/color-write-in-loop/0.wgsl
@@ -0,0 +1,73 @@
+struct S {
+  f0 : i32;
+  f1 : mat4x3<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_51 : i32;
+  var x_12_phi : i32;
+  loop {
+    var x_45 : S;
+    var x_45_phi : S;
+    var x_11_phi : i32;
+    x_45_phi = S(0, mat4x3<f32>(vec3<f32>(1.0, 0.0, 0.0), vec3<f32>(0.0, 1.0, 0.0), vec3<f32>(0.0, 0.0, 1.0), vec3<f32>(0.0, 0.0, 0.0)));
+    x_11_phi = 0;
+    loop {
+      var x_46 : S;
+      var x_9 : i32;
+      x_45 = x_45_phi;
+      let x_11 : i32 = x_11_phi;
+      let x_49 : f32 = gl_FragCoord.x;
+      x_51 = select(2, 1, (x_49 == 0.0));
+      if ((x_11 < x_51)) {
+      } else {
+        break;
+      }
+
+      continuing {
+        x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+        x_46 = x_45;
+        x_46.f0 = (x_45.f0 + 1);
+        x_9 = (x_11 + 1);
+        x_45_phi = x_46;
+        x_11_phi = x_9;
+      }
+    }
+    if ((x_45.f0 < 1000)) {
+      break;
+    }
+    break;
+  }
+  x_12_phi = 0;
+  loop {
+    var x_6 : i32;
+    let x_12 : i32 = x_12_phi;
+    if ((x_12 < x_51)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+      x_6 = (x_12 + 1);
+      x_12_phi = x_6;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/color-write-in-loop/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/color-write-in-loop/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..f98d1d7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/color-write-in-loop/0.wgsl.expected.hlsl
@@ -0,0 +1,78 @@
+struct S {
+  int f0;
+  float4x3 f1;
+};
+
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int x_51 = 0;
+  int x_12_phi = 0;
+  while (true) {
+    S x_45 = (S)0;
+    S x_45_phi = (S)0;
+    int x_11_phi = 0;
+    const S tint_symbol_4 = {0, float4x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f), float3(0.0f, 0.0f, 0.0f))};
+    x_45_phi = tint_symbol_4;
+    x_11_phi = 0;
+    while (true) {
+      S x_46 = (S)0;
+      int x_9 = 0;
+      x_45 = x_45_phi;
+      const int x_11 = x_11_phi;
+      const float x_49 = gl_FragCoord.x;
+      x_51 = ((x_49 == 0.0f) ? 1 : 2);
+      if ((x_11 < x_51)) {
+      } else {
+        break;
+      }
+      {
+        x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+        x_46 = x_45;
+        x_46.f0 = (x_45.f0 + 1);
+        x_9 = (x_11 + 1);
+        x_45_phi = x_46;
+        x_11_phi = x_9;
+      }
+    }
+    if ((x_45.f0 < 1000)) {
+      break;
+    }
+    break;
+  }
+  x_12_phi = 0;
+  while (true) {
+    int x_6 = 0;
+    const int x_12 = x_12_phi;
+    if ((x_12 < x_51)) {
+    } else {
+      break;
+    }
+    {
+      x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+      x_6 = (x_12 + 1);
+      x_12_phi = x_6;
+    }
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/color-write-in-loop/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/color-write-in-loop/0.wgsl.expected.msl
new file mode 100644
index 0000000..734666e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/color-write-in-loop/0.wgsl.expected.msl
@@ -0,0 +1,76 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  int f0;
+  float4x3 f1;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  int x_51 = 0;
+  int x_12_phi = 0;
+  while (true) {
+    S x_45 = {};
+    S x_45_phi = {};
+    int x_11_phi = 0;
+    S const tint_symbol_4 = {.f0=0, .f1=float4x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f), float3(0.0f, 0.0f, 0.0f))};
+    x_45_phi = tint_symbol_4;
+    x_11_phi = 0;
+    while (true) {
+      S x_46 = {};
+      int x_9 = 0;
+      x_45 = x_45_phi;
+      int const x_11 = x_11_phi;
+      float const x_49 = (*(tint_symbol_6)).x;
+      x_51 = select(2, 1, (x_49 == 0.0f));
+      if ((x_11 < x_51)) {
+      } else {
+        break;
+      }
+      {
+        *(tint_symbol_7) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+        x_46 = x_45;
+        x_46.f0 = (x_45.f0 + 1);
+        x_9 = (x_11 + 1);
+        x_45_phi = x_46;
+        x_11_phi = x_9;
+      }
+    }
+    if ((x_45.f0 < 1000)) {
+      break;
+    }
+    break;
+  }
+  x_12_phi = 0;
+  while (true) {
+    int x_6 = 0;
+    int const x_12 = x_12_phi;
+    if ((x_12 < x_51)) {
+    } else {
+      break;
+    }
+    {
+      *(tint_symbol_7) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+      x_6 = (x_12 + 1);
+      x_12_phi = x_6;
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(&(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/color-write-in-loop/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/color-write-in-loop/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..c5af5ad
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/color-write-in-loop/0.wgsl.expected.spvasm
@@ -0,0 +1,190 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 106
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %x_51 "x_51"
+               OpName %x_12_phi "x_12_phi"
+               OpName %S "S"
+               OpMemberName %S 0 "f0"
+               OpMemberName %S 1 "f1"
+               OpName %x_45 "x_45"
+               OpName %x_45_phi "x_45_phi"
+               OpName %x_11_phi "x_11_phi"
+               OpName %x_46 "x_46"
+               OpName %x_9 "x_9"
+               OpName %x_6 "x_6"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %S 0 Offset 0
+               OpMemberDecorate %S 1 Offset 16
+               OpMemberDecorate %S 1 ColMajor
+               OpMemberDecorate %S 1 MatrixStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+    %v3float = OpTypeVector %float 3
+%mat4v3float = OpTypeMatrix %v3float 4
+          %S = OpTypeStruct %int %mat4v3float
+%_ptr_Function_S = OpTypePointer Function %S
+         %29 = OpConstantNull %S
+      %int_0 = OpConstant %int 0
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %35 = OpConstantComposite %v3float %float_1 %float_0 %float_0
+         %36 = OpConstantComposite %v3float %float_0 %float_1 %float_0
+         %37 = OpConstantComposite %v3float %float_0 %float_0 %float_1
+         %38 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+         %39 = OpConstantComposite %mat4v3float %35 %36 %37 %38
+         %40 = OpConstantComposite %S %int_0 %39
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+         %64 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+   %int_1000 = OpConstant %int 1000
+         %90 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %93 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+       %x_51 = OpVariable %_ptr_Function_int Function %18
+   %x_12_phi = OpVariable %_ptr_Function_int Function %18
+       %x_45 = OpVariable %_ptr_Function_S Function %29
+   %x_45_phi = OpVariable %_ptr_Function_S Function %29
+   %x_11_phi = OpVariable %_ptr_Function_int Function %18
+       %x_46 = OpVariable %_ptr_Function_S Function %29
+        %x_9 = OpVariable %_ptr_Function_int Function %18
+        %x_6 = OpVariable %_ptr_Function_int Function %18
+               OpBranch %20
+         %20 = OpLabel
+               OpLoopMerge %21 %22 None
+               OpBranch %23
+         %23 = OpLabel
+               OpStore %x_45_phi %40
+               OpStore %x_11_phi %int_0
+               OpBranch %41
+         %41 = OpLabel
+               OpLoopMerge %42 %43 None
+               OpBranch %44
+         %44 = OpLabel
+         %47 = OpLoad %S %x_45_phi
+               OpStore %x_45 %47
+         %48 = OpLoad %int %x_11_phi
+         %52 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %53 = OpLoad %float %52
+         %55 = OpFOrdEqual %bool %53 %float_0
+         %54 = OpSelect %int %55 %int_1 %int_2
+               OpStore %x_51 %54
+         %59 = OpLoad %int %x_51
+         %60 = OpSLessThan %bool %48 %59
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %63
+         %62 = OpLabel
+               OpBranch %61
+         %63 = OpLabel
+               OpBranch %42
+         %61 = OpLabel
+               OpBranch %43
+         %43 = OpLabel
+               OpStore %x_GLF_color %64
+         %65 = OpLoad %S %x_45
+               OpStore %x_46 %65
+         %66 = OpAccessChain %_ptr_Function_int %x_46 %uint_0
+         %67 = OpAccessChain %_ptr_Function_int %x_45 %uint_0
+         %68 = OpLoad %int %67
+         %69 = OpIAdd %int %68 %int_1
+               OpStore %66 %69
+         %70 = OpIAdd %int %48 %int_1
+               OpStore %x_9 %70
+         %71 = OpLoad %S %x_46
+               OpStore %x_45_phi %71
+         %72 = OpLoad %int %x_9
+               OpStore %x_11_phi %72
+               OpBranch %41
+         %42 = OpLabel
+         %73 = OpAccessChain %_ptr_Function_int %x_45 %uint_0
+         %74 = OpLoad %int %73
+         %76 = OpSLessThan %bool %74 %int_1000
+               OpSelectionMerge %77 None
+               OpBranchConditional %76 %78 %77
+         %78 = OpLabel
+               OpBranch %21
+         %77 = OpLabel
+               OpBranch %21
+         %22 = OpLabel
+               OpBranch %20
+         %21 = OpLabel
+               OpStore %x_12_phi %int_0
+               OpBranch %79
+         %79 = OpLabel
+               OpLoopMerge %80 %81 None
+               OpBranch %82
+         %82 = OpLabel
+         %84 = OpLoad %int %x_12_phi
+         %85 = OpLoad %int %x_51
+         %86 = OpSLessThan %bool %84 %85
+               OpSelectionMerge %87 None
+               OpBranchConditional %86 %88 %89
+         %88 = OpLabel
+               OpBranch %87
+         %89 = OpLabel
+               OpBranch %80
+         %87 = OpLabel
+               OpBranch %81
+         %81 = OpLabel
+               OpStore %x_GLF_color %90
+         %91 = OpIAdd %int %84 %int_1
+               OpStore %x_6 %91
+         %92 = OpLoad %int %x_6
+               OpStore %x_12_phi %92
+               OpBranch %79
+         %80 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %93
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %97 = OpLabel
+         %98 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %98
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+        %100 = OpLabel
+        %101 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %101
+        %102 = OpFunctionCall %void %main_1
+        %104 = OpLoad %v4float %x_GLF_color
+        %105 = OpCompositeConstruct %main_out %104
+        %103 = OpFunctionCall %void %tint_symbol_3 %105
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/color-write-in-loop/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/color-write-in-loop/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..088c0f8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/color-write-in-loop/0.wgsl.expected.wgsl
@@ -0,0 +1,73 @@
+struct S {
+  f0 : i32;
+  f1 : mat4x3<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_51 : i32;
+  var x_12_phi : i32;
+  loop {
+    var x_45 : S;
+    var x_45_phi : S;
+    var x_11_phi : i32;
+    x_45_phi = S(0, mat4x3<f32>(vec3<f32>(1.0, 0.0, 0.0), vec3<f32>(0.0, 1.0, 0.0), vec3<f32>(0.0, 0.0, 1.0), vec3<f32>(0.0, 0.0, 0.0)));
+    x_11_phi = 0;
+    loop {
+      var x_46 : S;
+      var x_9 : i32;
+      x_45 = x_45_phi;
+      let x_11 : i32 = x_11_phi;
+      let x_49 : f32 = gl_FragCoord.x;
+      x_51 = select(2, 1, (x_49 == 0.0));
+      if ((x_11 < x_51)) {
+      } else {
+        break;
+      }
+
+      continuing {
+        x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+        x_46 = x_45;
+        x_46.f0 = (x_45.f0 + 1);
+        x_9 = (x_11 + 1);
+        x_45_phi = x_46;
+        x_11_phi = x_9;
+      }
+    }
+    if ((x_45.f0 < 1000)) {
+      break;
+    }
+    break;
+  }
+  x_12_phi = 0;
+  loop {
+    var x_6 : i32;
+    let x_12 : i32 = x_12_phi;
+    if ((x_12 < x_51)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+      x_6 = (x_12 + 1);
+      x_12_phi = x_6;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/conditional-return-in-infinite-while/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/conditional-return-in-infinite-while/0-opt.spvasm
new file mode 100644
index 0000000..c9c5d6f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/conditional-return-in-infinite-while/0-opt.spvasm
@@ -0,0 +1,100 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %GLF_live6search_ "GLF_live6search("
+               OpName %GLF_live6index "GLF_live6index"
+               OpName %GLF_live6currentNode "GLF_live6currentNode"
+               OpName %GLF_live6tree "GLF_live6tree"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %GLF_live6search_ RelaxedPrecision
+               OpDecorate %GLF_live6index RelaxedPrecision
+               OpDecorate %GLF_live6currentNode RelaxedPrecision
+               OpDecorate %GLF_live6tree RelaxedPrecision
+               OpDecorate %10 RelaxedPrecision
+               OpDecorate %11 RelaxedPrecision
+               OpDecorate %12 RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %13 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+         %17 = OpTypeFunction %int
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Private__arr_int_uint_10 = OpTypePointer Private %_arr_int_uint_10
+%GLF_live6tree = OpVariable %_ptr_Private__arr_int_uint_10 Private
+%_ptr_Private_int = OpTypePointer Private %int
+      %int_1 = OpConstant %int 1
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %37 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %15
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %40 = OpLoad %float %39
+         %41 = OpFOrdGreaterThan %bool %40 %float_1
+               OpSelectionMerge %42 None
+               OpBranchConditional %41 %43 %42
+         %43 = OpLabel
+         %13 = OpFunctionCall %int %GLF_live6search_
+               OpBranch %42
+         %42 = OpLabel
+               OpStore %_GLF_color %37
+               OpReturn
+               OpFunctionEnd
+%GLF_live6search_ = OpFunction %int None %17
+         %44 = OpLabel
+%GLF_live6index = OpVariable %_ptr_Function_int Function
+%GLF_live6currentNode = OpVariable %_ptr_Function_int Function
+               OpStore %GLF_live6index %int_0
+               OpBranch %45
+         %45 = OpLabel
+               OpLoopMerge %46 %47 None
+               OpBranch %48
+         %48 = OpLabel
+               OpBranchConditional %true %49 %46
+         %49 = OpLabel
+         %10 = OpLoad %int %GLF_live6index
+         %50 = OpAccessChain %_ptr_Private_int %GLF_live6tree %10
+         %11 = OpLoad %int %50
+               OpStore %GLF_live6currentNode %11
+         %12 = OpLoad %int %GLF_live6currentNode
+         %51 = OpINotEqual %bool %12 %int_1
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %52
+         %53 = OpLabel
+               OpReturnValue %int_1
+         %52 = OpLabel
+               OpStore %GLF_live6index %int_1
+               OpBranch %47
+         %47 = OpLabel
+               OpBranch %45
+         %46 = OpLabel
+               OpReturnValue %int_1
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/conditional-return-in-infinite-while/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/conditional-return-in-infinite-while/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..626404f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/conditional-return-in-infinite-while/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,47 @@
+static int GLF_live6tree[10] = (int[10])0;
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+int GLF_live6search_() {
+  int GLF_live6index = 0;
+  int GLF_live6currentNode = 0;
+  GLF_live6index = 0;
+  while (true) {
+    if (true) {
+    } else {
+      break;
+    }
+    const int x_11 = GLF_live6tree[GLF_live6index];
+    GLF_live6currentNode = x_11;
+    if ((GLF_live6currentNode != 1)) {
+      return 1;
+    }
+    GLF_live6index = 1;
+  }
+  return 1;
+}
+
+void main_1() {
+  const float x_40 = asfloat(x_9[0].x);
+  if ((x_40 > 1.0f)) {
+    const int x_13 = GLF_live6search_();
+  }
+  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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/conditional-return-in-infinite-while/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/conditional-return-in-infinite-while/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..8e00df9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/conditional-return-in-infinite-while/0-opt.spvasm.expected.msl
@@ -0,0 +1,55 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int GLF_live6search_(thread tint_array_wrapper* const tint_symbol_4) {
+  int GLF_live6index = 0;
+  int GLF_live6currentNode = 0;
+  GLF_live6index = 0;
+  while (true) {
+    if (true) {
+    } else {
+      break;
+    }
+    int const x_10 = GLF_live6index;
+    int const x_11 = (*(tint_symbol_4)).arr[x_10];
+    GLF_live6currentNode = x_11;
+    int const x_12 = GLF_live6currentNode;
+    if ((x_12 != 1)) {
+      return 1;
+    }
+    GLF_live6index = 1;
+  }
+  return 1;
+}
+
+void main_1(constant buf0& x_9, thread tint_array_wrapper* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float const x_40 = x_9.injectionSwitch.x;
+  if ((x_40 > 1.0f)) {
+    int const x_13 = GLF_live6search_(tint_symbol_5);
+  }
+  *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_9 [[buffer(0)]]) {
+  thread tint_array_wrapper tint_symbol_7 = {};
+  thread float4 tint_symbol_8 = 0.0f;
+  main_1(x_9, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/conditional-return-in-infinite-while/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/conditional-return-in-infinite-while/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..3e841df
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/conditional-return-in-infinite-while/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,131 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 72
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %GLF_live6tree "GLF_live6tree"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %GLF_live6search_ "GLF_live6search_"
+               OpName %GLF_live6index "GLF_live6index"
+               OpName %GLF_live6currentNode "GLF_live6currentNode"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Private__arr_int_uint_10 = OpTypePointer Private %_arr_int_uint_10
+          %7 = OpConstantNull %_arr_int_uint_10
+%GLF_live6tree = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %16
+         %19 = OpTypeFunction %int
+%_ptr_Function_int = OpTypePointer Function %int
+         %24 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+%_ptr_Private_int = OpTypePointer Private %int
+      %int_1 = OpConstant %int 1
+       %void = OpTypeVoid
+         %45 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %59 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %60 = OpTypeFunction %void %main_out
+%GLF_live6search_ = OpFunction %int None %19
+         %21 = OpLabel
+%GLF_live6index = OpVariable %_ptr_Function_int Function %24
+%GLF_live6currentNode = OpVariable %_ptr_Function_int Function %24
+               OpStore %GLF_live6index %int_0
+               OpBranch %27
+         %27 = OpLabel
+               OpLoopMerge %28 %29 None
+               OpBranch %30
+         %30 = OpLabel
+               OpSelectionMerge %33 None
+               OpBranchConditional %true %34 %35
+         %34 = OpLabel
+               OpBranch %33
+         %35 = OpLabel
+               OpBranch %28
+         %33 = OpLabel
+         %36 = OpLoad %int %GLF_live6index
+         %38 = OpAccessChain %_ptr_Private_int %GLF_live6tree %36
+         %39 = OpLoad %int %38
+               OpStore %GLF_live6currentNode %39
+         %40 = OpLoad %int %GLF_live6currentNode
+         %42 = OpINotEqual %bool %40 %int_1
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %43
+         %44 = OpLabel
+               OpReturnValue %int_1
+         %43 = OpLabel
+               OpStore %GLF_live6index %int_1
+               OpBranch %29
+         %29 = OpLabel
+               OpBranch %27
+         %28 = OpLabel
+               OpReturnValue %int_1
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %45
+         %48 = OpLabel
+         %51 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_0
+         %52 = OpLoad %float %51
+         %54 = OpFOrdGreaterThan %bool %52 %float_1
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %55
+         %56 = OpLabel
+         %57 = OpFunctionCall %int %GLF_live6search_
+               OpBranch %55
+         %55 = OpLabel
+               OpStore %x_GLF_color %59
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %60
+%tint_symbol = OpFunctionParameter %main_out
+         %64 = OpLabel
+         %65 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %65
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %45
+         %67 = OpLabel
+         %68 = OpFunctionCall %void %main_1
+         %70 = OpLoad %v4float %x_GLF_color
+         %71 = OpCompositeConstruct %main_out %70
+         %69 = OpFunctionCall %void %tint_symbol_2 %71
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/conditional-return-in-infinite-while/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/conditional-return-in-infinite-while/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..bd10f84
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/conditional-return-in-infinite-while/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,51 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> GLF_live6tree : array<i32, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn GLF_live6search_() -> i32 {
+  var GLF_live6index : i32;
+  var GLF_live6currentNode : i32;
+  GLF_live6index = 0;
+  loop {
+    if (true) {
+    } else {
+      break;
+    }
+    let x_10 : i32 = GLF_live6index;
+    let x_11 : i32 = GLF_live6tree[x_10];
+    GLF_live6currentNode = x_11;
+    let x_12 : i32 = GLF_live6currentNode;
+    if ((x_12 != 1)) {
+      return 1;
+    }
+    GLF_live6index = 1;
+  }
+  return 1;
+}
+
+fn main_1() {
+  let x_40 : f32 = x_9.injectionSwitch.x;
+  if ((x_40 > 1.0)) {
+    let x_13 : i32 = GLF_live6search_();
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/conditional-return-in-infinite-while/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/conditional-return-in-infinite-while/0-opt.wgsl
new file mode 100644
index 0000000..bd10f84
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/conditional-return-in-infinite-while/0-opt.wgsl
@@ -0,0 +1,51 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> GLF_live6tree : array<i32, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn GLF_live6search_() -> i32 {
+  var GLF_live6index : i32;
+  var GLF_live6currentNode : i32;
+  GLF_live6index = 0;
+  loop {
+    if (true) {
+    } else {
+      break;
+    }
+    let x_10 : i32 = GLF_live6index;
+    let x_11 : i32 = GLF_live6tree[x_10];
+    GLF_live6currentNode = x_11;
+    let x_12 : i32 = GLF_live6currentNode;
+    if ((x_12 != 1)) {
+      return 1;
+    }
+    GLF_live6index = 1;
+  }
+  return 1;
+}
+
+fn main_1() {
+  let x_40 : f32 = x_9.injectionSwitch.x;
+  if ((x_40 > 1.0)) {
+    let x_13 : i32 = GLF_live6search_();
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/conditional-return-in-infinite-while/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/conditional-return-in-infinite-while/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..626404f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/conditional-return-in-infinite-while/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,47 @@
+static int GLF_live6tree[10] = (int[10])0;
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+int GLF_live6search_() {
+  int GLF_live6index = 0;
+  int GLF_live6currentNode = 0;
+  GLF_live6index = 0;
+  while (true) {
+    if (true) {
+    } else {
+      break;
+    }
+    const int x_11 = GLF_live6tree[GLF_live6index];
+    GLF_live6currentNode = x_11;
+    if ((GLF_live6currentNode != 1)) {
+      return 1;
+    }
+    GLF_live6index = 1;
+  }
+  return 1;
+}
+
+void main_1() {
+  const float x_40 = asfloat(x_9[0].x);
+  if ((x_40 > 1.0f)) {
+    const int x_13 = GLF_live6search_();
+  }
+  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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/conditional-return-in-infinite-while/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/conditional-return-in-infinite-while/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..8e00df9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/conditional-return-in-infinite-while/0-opt.wgsl.expected.msl
@@ -0,0 +1,55 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int GLF_live6search_(thread tint_array_wrapper* const tint_symbol_4) {
+  int GLF_live6index = 0;
+  int GLF_live6currentNode = 0;
+  GLF_live6index = 0;
+  while (true) {
+    if (true) {
+    } else {
+      break;
+    }
+    int const x_10 = GLF_live6index;
+    int const x_11 = (*(tint_symbol_4)).arr[x_10];
+    GLF_live6currentNode = x_11;
+    int const x_12 = GLF_live6currentNode;
+    if ((x_12 != 1)) {
+      return 1;
+    }
+    GLF_live6index = 1;
+  }
+  return 1;
+}
+
+void main_1(constant buf0& x_9, thread tint_array_wrapper* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float const x_40 = x_9.injectionSwitch.x;
+  if ((x_40 > 1.0f)) {
+    int const x_13 = GLF_live6search_(tint_symbol_5);
+  }
+  *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_9 [[buffer(0)]]) {
+  thread tint_array_wrapper tint_symbol_7 = {};
+  thread float4 tint_symbol_8 = 0.0f;
+  main_1(x_9, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/conditional-return-in-infinite-while/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/conditional-return-in-infinite-while/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..3e841df
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/conditional-return-in-infinite-while/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,131 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 72
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %GLF_live6tree "GLF_live6tree"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %GLF_live6search_ "GLF_live6search_"
+               OpName %GLF_live6index "GLF_live6index"
+               OpName %GLF_live6currentNode "GLF_live6currentNode"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Private__arr_int_uint_10 = OpTypePointer Private %_arr_int_uint_10
+          %7 = OpConstantNull %_arr_int_uint_10
+%GLF_live6tree = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %16
+         %19 = OpTypeFunction %int
+%_ptr_Function_int = OpTypePointer Function %int
+         %24 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+%_ptr_Private_int = OpTypePointer Private %int
+      %int_1 = OpConstant %int 1
+       %void = OpTypeVoid
+         %45 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %59 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %60 = OpTypeFunction %void %main_out
+%GLF_live6search_ = OpFunction %int None %19
+         %21 = OpLabel
+%GLF_live6index = OpVariable %_ptr_Function_int Function %24
+%GLF_live6currentNode = OpVariable %_ptr_Function_int Function %24
+               OpStore %GLF_live6index %int_0
+               OpBranch %27
+         %27 = OpLabel
+               OpLoopMerge %28 %29 None
+               OpBranch %30
+         %30 = OpLabel
+               OpSelectionMerge %33 None
+               OpBranchConditional %true %34 %35
+         %34 = OpLabel
+               OpBranch %33
+         %35 = OpLabel
+               OpBranch %28
+         %33 = OpLabel
+         %36 = OpLoad %int %GLF_live6index
+         %38 = OpAccessChain %_ptr_Private_int %GLF_live6tree %36
+         %39 = OpLoad %int %38
+               OpStore %GLF_live6currentNode %39
+         %40 = OpLoad %int %GLF_live6currentNode
+         %42 = OpINotEqual %bool %40 %int_1
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %43
+         %44 = OpLabel
+               OpReturnValue %int_1
+         %43 = OpLabel
+               OpStore %GLF_live6index %int_1
+               OpBranch %29
+         %29 = OpLabel
+               OpBranch %27
+         %28 = OpLabel
+               OpReturnValue %int_1
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %45
+         %48 = OpLabel
+         %51 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_0
+         %52 = OpLoad %float %51
+         %54 = OpFOrdGreaterThan %bool %52 %float_1
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %55
+         %56 = OpLabel
+         %57 = OpFunctionCall %int %GLF_live6search_
+               OpBranch %55
+         %55 = OpLabel
+               OpStore %x_GLF_color %59
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %60
+%tint_symbol = OpFunctionParameter %main_out
+         %64 = OpLabel
+         %65 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %65
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %45
+         %67 = OpLabel
+         %68 = OpFunctionCall %void %main_1
+         %70 = OpLoad %v4float %x_GLF_color
+         %71 = OpCompositeConstruct %main_out %70
+         %69 = OpFunctionCall %void %tint_symbol_2 %71
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/conditional-return-in-infinite-while/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/conditional-return-in-infinite-while/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..bd10f84
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/conditional-return-in-infinite-while/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,51 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> GLF_live6tree : array<i32, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn GLF_live6search_() -> i32 {
+  var GLF_live6index : i32;
+  var GLF_live6currentNode : i32;
+  GLF_live6index = 0;
+  loop {
+    if (true) {
+    } else {
+      break;
+    }
+    let x_10 : i32 = GLF_live6index;
+    let x_11 : i32 = GLF_live6tree[x_10];
+    GLF_live6currentNode = x_11;
+    let x_12 : i32 = GLF_live6currentNode;
+    if ((x_12 != 1)) {
+      return 1;
+    }
+    GLF_live6index = 1;
+  }
+  return 1;
+}
+
+fn main_1() {
+  let x_40 : f32 = x_9.injectionSwitch.x;
+  if ((x_40 > 1.0)) {
+    let x_13 : i32 = GLF_live6search_();
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.spvasm
new file mode 100644
index 0000000..0cc68a0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.spvasm
@@ -0,0 +1,627 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %drawShape_vf2_ "drawShape(vf2;"
+               OpName %pos "pos"
+               OpName %c2 "c2"
+               OpName %c3 "c3"
+               OpName %c4 "c4"
+               OpName %c5 "c5"
+               OpName %c6 "c6"
+               OpName %GLF_live4i "GLF_live4i"
+               OpName %GLF_live4_looplimiter5 "GLF_live4_looplimiter5"
+               OpName %GLF_live7m42 "GLF_live7m42"
+               OpName %GLF_live7m33 "GLF_live7m33"
+               OpName %GLF_live7cols "GLF_live7cols"
+               OpName %GLF_live7_looplimiter3 "GLF_live7_looplimiter3"
+               OpName %GLF_live7rows "GLF_live7rows"
+               OpName %GLF_live7_looplimiter2 "GLF_live7_looplimiter2"
+               OpName %GLF_live7_looplimiter1 "GLF_live7_looplimiter1"
+               OpName %GLF_live7c "GLF_live7c"
+               OpName %GLF_live7r "GLF_live7r"
+               OpName %GLF_live7_looplimiter0 "GLF_live7_looplimiter0"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %GLF_live7sum_index "GLF_live7sum_index"
+               OpName %GLF_live7_looplimiter7 "GLF_live7_looplimiter7"
+               OpName %GLF_live7cols_0 "GLF_live7cols"
+               OpName %GLF_live7rows_0 "GLF_live7rows"
+               OpName %GLF_live7sums "GLF_live7sums"
+               OpName %GLF_live7c_0 "GLF_live7c"
+               OpName %GLF_live7r_0 "GLF_live7r"
+               OpName %indexable "indexable"
+               OpName %position "position"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %i "i"
+               OpName %param_1 "param"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %GLF_live4i RelaxedPrecision
+               OpDecorate %39 RelaxedPrecision
+               OpDecorate %GLF_live4_looplimiter5 RelaxedPrecision
+               OpDecorate %40 RelaxedPrecision
+               OpDecorate %41 RelaxedPrecision
+               OpDecorate %42 RelaxedPrecision
+               OpDecorate %GLF_live7cols RelaxedPrecision
+               OpDecorate %43 RelaxedPrecision
+               OpDecorate %GLF_live7_looplimiter3 RelaxedPrecision
+               OpDecorate %44 RelaxedPrecision
+               OpDecorate %45 RelaxedPrecision
+               OpDecorate %46 RelaxedPrecision
+               OpDecorate %GLF_live7rows RelaxedPrecision
+               OpDecorate %47 RelaxedPrecision
+               OpDecorate %GLF_live7_looplimiter2 RelaxedPrecision
+               OpDecorate %48 RelaxedPrecision
+               OpDecorate %49 RelaxedPrecision
+               OpDecorate %50 RelaxedPrecision
+               OpDecorate %GLF_live7_looplimiter1 RelaxedPrecision
+               OpDecorate %GLF_live7c RelaxedPrecision
+               OpDecorate %51 RelaxedPrecision
+               OpDecorate %52 RelaxedPrecision
+               OpDecorate %53 RelaxedPrecision
+               OpDecorate %54 RelaxedPrecision
+               OpDecorate %GLF_live7r RelaxedPrecision
+               OpDecorate %55 RelaxedPrecision
+               OpDecorate %GLF_live7_looplimiter0 RelaxedPrecision
+               OpDecorate %56 RelaxedPrecision
+               OpDecorate %57 RelaxedPrecision
+               OpDecorate %58 RelaxedPrecision
+               OpDecorate %59 RelaxedPrecision
+               OpDecorate %60 RelaxedPrecision
+               OpDecorate %61 RelaxedPrecision
+               OpDecorate %62 RelaxedPrecision
+               OpDecorate %63 RelaxedPrecision
+               OpDecorate %64 RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %65 RelaxedPrecision
+               OpDecorate %66 RelaxedPrecision
+               OpDecorate %67 RelaxedPrecision
+               OpDecorate %68 RelaxedPrecision
+               OpDecorate %69 RelaxedPrecision
+               OpDecorate %70 RelaxedPrecision
+               OpDecorate %71 RelaxedPrecision
+               OpDecorate %72 RelaxedPrecision
+               OpDecorate %73 RelaxedPrecision
+               OpDecorate %74 RelaxedPrecision
+               OpDecorate %75 RelaxedPrecision
+               OpDecorate %76 RelaxedPrecision
+               OpDecorate %77 RelaxedPrecision
+               OpDecorate %78 RelaxedPrecision
+               OpDecorate %GLF_live7sum_index RelaxedPrecision
+               OpDecorate %GLF_live7_looplimiter7 RelaxedPrecision
+               OpDecorate %GLF_live7cols_0 RelaxedPrecision
+               OpDecorate %79 RelaxedPrecision
+               OpDecorate %80 RelaxedPrecision
+               OpDecorate %81 RelaxedPrecision
+               OpDecorate %82 RelaxedPrecision
+               OpDecorate %GLF_live7rows_0 RelaxedPrecision
+               OpDecorate %83 RelaxedPrecision
+               OpDecorate %84 RelaxedPrecision
+               OpDecorate %85 RelaxedPrecision
+               OpDecorate %GLF_live7c_0 RelaxedPrecision
+               OpDecorate %86 RelaxedPrecision
+               OpDecorate %GLF_live7r_0 RelaxedPrecision
+               OpDecorate %87 RelaxedPrecision
+               OpDecorate %88 RelaxedPrecision
+               OpDecorate %89 RelaxedPrecision
+               OpDecorate %90 RelaxedPrecision
+               OpDecorate %91 RelaxedPrecision
+               OpDecorate %92 RelaxedPrecision
+               OpDecorate %93 RelaxedPrecision
+               OpDecorate %94 RelaxedPrecision
+               OpDecorate %95 RelaxedPrecision
+               OpDecorate %96 RelaxedPrecision
+               OpDecorate %97 RelaxedPrecision
+               OpDecorate %98 RelaxedPrecision
+               OpDecorate %99 RelaxedPrecision
+               OpDecorate %100 RelaxedPrecision
+               OpDecorate %101 RelaxedPrecision
+               OpDecorate %102 RelaxedPrecision
+               OpDecorate %103 RelaxedPrecision
+               OpDecorate %104 RelaxedPrecision
+               OpDecorate %105 RelaxedPrecision
+               OpDecorate %106 RelaxedPrecision
+               OpDecorate %107 RelaxedPrecision
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %i RelaxedPrecision
+               OpDecorate %108 RelaxedPrecision
+               OpDecorate %109 RelaxedPrecision
+               OpDecorate %110 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+        %112 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+    %v3float = OpTypeVector %float 3
+        %117 = OpTypeFunction %v3float %_ptr_Function_v2float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_1 = OpConstant %float 1
+        %124 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+     %uint_1 = OpConstant %uint 1
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+      %int_7 = OpConstant %int 7
+      %int_1 = OpConstant %int 1
+%mat4v2float = OpTypeMatrix %v2float 4
+%_ptr_Function_mat4v2float = OpTypePointer Function %mat4v2float
+    %float_0 = OpConstant %float 0
+        %135 = OpConstantComposite %v2float %float_1 %float_0
+        %136 = OpConstantComposite %v2float %float_0 %float_1
+        %137 = OpConstantComposite %v2float %float_0 %float_0
+        %138 = OpConstantComposite %mat4v2float %135 %136 %137 %135
+%mat3v3float = OpTypeMatrix %v3float 3
+%_ptr_Function_mat3v3float = OpTypePointer Function %mat3v3float
+        %141 = OpConstantComposite %v3float %float_1 %float_0 %float_0
+        %142 = OpConstantComposite %v3float %float_0 %float_1 %float_0
+        %143 = OpConstantComposite %v3float %float_0 %float_0 %float_1
+        %144 = OpConstantComposite %mat3v3float %141 %142 %143
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_9 = OpConstant %uint 9
+%_arr_float_uint_9 = OpTypeArray %float %uint_9
+%_ptr_Function__arr_float_uint_9 = OpTypePointer Function %_arr_float_uint_9
+      %int_9 = OpConstant %int 9
+    %float_2 = OpConstant %float 2
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+     %int_25 = OpConstant %int 25
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+        %158 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %112
+        %159 = OpLabel
+   %position = OpVariable %_ptr_Function_v2float Function
+      %param = OpVariable %_ptr_Function_v2float Function
+    %param_0 = OpVariable %_ptr_Function_v2float Function
+          %i = OpVariable %_ptr_Function_int Function
+    %param_1 = OpVariable %_ptr_Function_v2float Function
+        %160 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+        %161 = OpLoad %float %160
+        %162 = OpFOrdGreaterThanEqual %bool %161 %float_2
+               OpSelectionMerge %163 None
+               OpBranchConditional %162 %164 %163
+        %164 = OpLabel
+        %165 = OpLoad %v4float %gl_FragCoord
+        %166 = OpVectorShuffle %v2float %165 %165 0 1
+               OpStore %position %166
+        %167 = OpLoad %v2float %position
+               OpStore %param %167
+        %168 = OpFunctionCall %v3float %drawShape_vf2_ %param
+        %169 = OpLoad %v2float %position
+               OpStore %param_0 %169
+        %170 = OpFunctionCall %v3float %drawShape_vf2_ %param_0
+               OpStore %i %int_25
+               OpBranch %171
+        %171 = OpLabel
+               OpLoopMerge %172 %173 None
+               OpBranch %174
+        %174 = OpLabel
+        %108 = OpLoad %int %i
+        %175 = OpSGreaterThan %bool %108 %int_0
+               OpBranchConditional %175 %176 %172
+        %176 = OpLabel
+        %177 = OpLoad %v2float %position
+               OpStore %param_1 %177
+        %178 = OpFunctionCall %v3float %drawShape_vf2_ %param_1
+               OpBranch %173
+        %173 = OpLabel
+        %109 = OpLoad %int %i
+        %110 = OpISub %int %109 %int_1
+               OpStore %i %110
+               OpBranch %171
+        %172 = OpLabel
+               OpBranch %163
+        %163 = OpLabel
+               OpStore %_GLF_color %158
+               OpReturn
+               OpFunctionEnd
+%drawShape_vf2_ = OpFunction %v3float None %117
+        %pos = OpFunctionParameter %_ptr_Function_v2float
+        %179 = OpLabel
+         %c2 = OpVariable %_ptr_Function_bool Function
+         %c3 = OpVariable %_ptr_Function_bool Function
+         %c4 = OpVariable %_ptr_Function_bool Function
+         %c5 = OpVariable %_ptr_Function_bool Function
+         %c6 = OpVariable %_ptr_Function_bool Function
+ %GLF_live4i = OpVariable %_ptr_Function_int Function
+%GLF_live4_looplimiter5 = OpVariable %_ptr_Function_int Function
+%GLF_live7m42 = OpVariable %_ptr_Function_mat4v2float Function
+%GLF_live7m33 = OpVariable %_ptr_Function_mat3v3float Function
+%GLF_live7cols = OpVariable %_ptr_Function_int Function
+%GLF_live7_looplimiter3 = OpVariable %_ptr_Function_int Function
+%GLF_live7rows = OpVariable %_ptr_Function_int Function
+%GLF_live7_looplimiter2 = OpVariable %_ptr_Function_int Function
+%GLF_live7_looplimiter1 = OpVariable %_ptr_Function_int Function
+ %GLF_live7c = OpVariable %_ptr_Function_int Function
+ %GLF_live7r = OpVariable %_ptr_Function_int Function
+%GLF_live7_looplimiter0 = OpVariable %_ptr_Function_int Function
+%GLF_live7sum_index = OpVariable %_ptr_Function_int Function
+%GLF_live7_looplimiter7 = OpVariable %_ptr_Function_int Function
+%GLF_live7cols_0 = OpVariable %_ptr_Function_int Function
+%GLF_live7rows_0 = OpVariable %_ptr_Function_int Function
+%GLF_live7sums = OpVariable %_ptr_Function__arr_float_uint_9 Function
+%GLF_live7c_0 = OpVariable %_ptr_Function_int Function
+%GLF_live7r_0 = OpVariable %_ptr_Function_int Function
+        %180 = OpVariable %_ptr_Function_int Function
+  %indexable = OpVariable %_ptr_Function_mat3v3float Function
+        %181 = OpAccessChain %_ptr_Function_float %pos %uint_0
+        %182 = OpLoad %float %181
+        %183 = OpFOrdGreaterThan %bool %182 %float_1
+               OpStore %c2 %183
+        %184 = OpLoad %bool %c2
+               OpSelectionMerge %185 None
+               OpBranchConditional %184 %186 %185
+        %186 = OpLabel
+               OpReturnValue %124
+        %185 = OpLabel
+        %187 = OpAccessChain %_ptr_Function_float %pos %uint_1
+        %188 = OpLoad %float %187
+        %189 = OpFOrdLessThan %bool %188 %float_1
+               OpStore %c3 %189
+        %190 = OpLoad %bool %c3
+               OpSelectionMerge %191 None
+               OpBranchConditional %190 %192 %191
+        %192 = OpLabel
+               OpReturnValue %124
+        %191 = OpLabel
+        %193 = OpAccessChain %_ptr_Function_float %pos %uint_1
+        %194 = OpLoad %float %193
+        %195 = OpFOrdGreaterThan %bool %194 %float_1
+               OpStore %c4 %195
+        %196 = OpLoad %bool %c4
+               OpSelectionMerge %197 None
+               OpBranchConditional %196 %198 %197
+        %198 = OpLabel
+               OpReturnValue %124
+        %197 = OpLabel
+        %199 = OpAccessChain %_ptr_Function_float %pos %uint_0
+        %200 = OpLoad %float %199
+        %201 = OpFOrdLessThan %bool %200 %float_1
+               OpStore %c5 %201
+        %202 = OpLoad %bool %c5
+               OpSelectionMerge %203 None
+               OpBranchConditional %202 %204 %203
+        %204 = OpLabel
+               OpReturnValue %124
+        %203 = OpLabel
+        %205 = OpAccessChain %_ptr_Function_float %pos %uint_0
+        %206 = OpLoad %float %205
+        %207 = OpFAdd %float %206 %float_1
+        %208 = OpFOrdGreaterThan %bool %207 %float_1
+               OpStore %c6 %208
+        %209 = OpLoad %bool %c6
+               OpSelectionMerge %210 None
+               OpBranchConditional %209 %211 %210
+        %211 = OpLabel
+               OpReturnValue %124
+        %210 = OpLabel
+               OpStore %GLF_live4i %int_0
+               OpBranch %212
+        %212 = OpLabel
+               OpLoopMerge %213 %214 None
+               OpBranch %215
+        %215 = OpLabel
+         %39 = OpLoad %int %GLF_live4i
+        %216 = OpSLessThan %bool %39 %int_4
+               OpBranchConditional %216 %217 %213
+        %217 = OpLabel
+         %40 = OpLoad %int %GLF_live4_looplimiter5
+        %218 = OpSGreaterThanEqual %bool %40 %int_7
+               OpSelectionMerge %219 None
+               OpBranchConditional %218 %220 %219
+        %220 = OpLabel
+               OpBranch %213
+        %219 = OpLabel
+         %41 = OpLoad %int %GLF_live4_looplimiter5
+         %42 = OpIAdd %int %41 %int_1
+               OpStore %GLF_live4_looplimiter5 %42
+               OpStore %GLF_live7m42 %138
+               OpStore %GLF_live7m33 %144
+               OpStore %GLF_live7cols %int_2
+               OpBranch %221
+        %221 = OpLabel
+               OpLoopMerge %222 %223 None
+               OpBranch %224
+        %224 = OpLabel
+         %43 = OpLoad %int %GLF_live7cols
+        %225 = OpSLessThan %bool %43 %int_4
+               OpBranchConditional %225 %226 %222
+        %226 = OpLabel
+         %44 = OpLoad %int %GLF_live7_looplimiter3
+        %227 = OpSGreaterThanEqual %bool %44 %int_7
+               OpSelectionMerge %228 None
+               OpBranchConditional %227 %229 %228
+        %229 = OpLabel
+               OpBranch %222
+        %228 = OpLabel
+         %45 = OpLoad %int %GLF_live7_looplimiter3
+         %46 = OpIAdd %int %45 %int_1
+               OpStore %GLF_live7_looplimiter3 %46
+               OpStore %GLF_live7rows %int_2
+               OpBranch %230
+        %230 = OpLabel
+               OpLoopMerge %231 %232 None
+               OpBranch %233
+        %233 = OpLabel
+         %47 = OpLoad %int %GLF_live7rows
+        %234 = OpSLessThan %bool %47 %int_4
+               OpBranchConditional %234 %235 %231
+        %235 = OpLabel
+         %48 = OpLoad %int %GLF_live7_looplimiter2
+        %236 = OpSGreaterThanEqual %bool %48 %int_7
+               OpSelectionMerge %237 None
+               OpBranchConditional %236 %238 %237
+        %238 = OpLabel
+               OpBranch %231
+        %237 = OpLabel
+         %49 = OpLoad %int %GLF_live7_looplimiter2
+         %50 = OpIAdd %int %49 %int_1
+               OpStore %GLF_live7_looplimiter2 %50
+               OpStore %GLF_live7_looplimiter1 %int_0
+               OpStore %GLF_live7c %int_0
+               OpBranch %239
+        %239 = OpLabel
+               OpLoopMerge %240 %241 None
+               OpBranch %242
+        %242 = OpLabel
+         %51 = OpLoad %int %GLF_live7c
+        %243 = OpSLessThan %bool %51 %int_3
+               OpBranchConditional %243 %244 %240
+        %244 = OpLabel
+         %52 = OpLoad %int %GLF_live7_looplimiter1
+        %245 = OpSGreaterThanEqual %bool %52 %int_7
+               OpSelectionMerge %246 None
+               OpBranchConditional %245 %247 %246
+        %247 = OpLabel
+               OpBranch %240
+        %246 = OpLabel
+         %53 = OpLoad %int %GLF_live7_looplimiter1
+         %54 = OpIAdd %int %53 %int_1
+               OpStore %GLF_live7_looplimiter1 %54
+               OpStore %GLF_live7r %int_0
+               OpBranch %248
+        %248 = OpLabel
+               OpLoopMerge %249 %250 None
+               OpBranch %251
+        %251 = OpLabel
+         %55 = OpLoad %int %GLF_live7r
+        %252 = OpSLessThan %bool %55 %int_2
+               OpBranchConditional %252 %253 %249
+        %253 = OpLabel
+         %56 = OpLoad %int %GLF_live7_looplimiter0
+        %254 = OpSGreaterThanEqual %bool %56 %int_7
+               OpSelectionMerge %255 None
+               OpBranchConditional %254 %256 %255
+        %256 = OpLabel
+               OpBranch %249
+        %255 = OpLabel
+         %57 = OpLoad %int %GLF_live7_looplimiter0
+         %58 = OpIAdd %int %57 %int_1
+               OpStore %GLF_live7_looplimiter0 %58
+         %59 = OpLoad %int %GLF_live7c
+        %257 = OpSGreaterThanEqual %bool %59 %int_0
+         %60 = OpLoad %int %GLF_live7c
+        %258 = OpSLessThan %bool %60 %int_3
+        %259 = OpLogicalAnd %bool %257 %258
+         %61 = OpLoad %int %GLF_live7c
+        %260 = OpSelect %int %259 %61 %int_0
+         %62 = OpLoad %int %GLF_live7r
+        %261 = OpSGreaterThanEqual %bool %62 %int_0
+         %63 = OpLoad %int %GLF_live7r
+        %262 = OpSLessThan %bool %63 %int_3
+        %263 = OpLogicalAnd %bool %261 %262
+         %64 = OpLoad %int %GLF_live7r
+        %264 = OpSelect %int %263 %64 %int_0
+        %265 = OpAccessChain %_ptr_Function_float %GLF_live7m33 %260 %264
+               OpStore %265 %float_1
+        %266 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+        %267 = OpLoad %float %266
+        %268 = OpFOrdGreaterThan %bool %float_0 %267
+               OpSelectionMerge %269 None
+               OpBranchConditional %268 %270 %271
+        %270 = OpLabel
+               OpBranch %269
+        %271 = OpLabel
+         %65 = OpLoad %int %GLF_live7c
+        %272 = OpSGreaterThanEqual %bool %65 %int_0
+         %66 = OpLoad %int %GLF_live7c
+        %273 = OpSLessThan %bool %66 %int_4
+        %274 = OpLogicalAnd %bool %272 %273
+         %67 = OpLoad %int %GLF_live7c
+        %275 = OpSelect %int %274 %67 %int_0
+         %68 = OpLoad %int %GLF_live7r
+        %276 = OpSGreaterThanEqual %bool %68 %int_0
+         %69 = OpLoad %int %GLF_live7r
+        %277 = OpSLessThan %bool %69 %int_2
+        %278 = OpLogicalAnd %bool %276 %277
+         %70 = OpLoad %int %GLF_live7r
+        %279 = OpSelect %int %278 %70 %int_0
+        %280 = OpAccessChain %_ptr_Function_float %GLF_live7m42 %275 %279
+               OpStore %280 %float_1
+               OpBranch %269
+        %269 = OpLabel
+               OpBranch %250
+        %250 = OpLabel
+         %71 = OpLoad %int %GLF_live7r
+         %72 = OpIAdd %int %71 %int_1
+               OpStore %GLF_live7r %72
+               OpBranch %248
+        %249 = OpLabel
+               OpBranch %241
+        %241 = OpLabel
+         %73 = OpLoad %int %GLF_live7c
+         %74 = OpIAdd %int %73 %int_1
+               OpStore %GLF_live7c %74
+               OpBranch %239
+        %240 = OpLabel
+               OpBranch %232
+        %232 = OpLabel
+         %75 = OpLoad %int %GLF_live7rows
+         %76 = OpIAdd %int %75 %int_1
+               OpStore %GLF_live7rows %76
+               OpBranch %230
+        %231 = OpLabel
+               OpBranch %223
+        %223 = OpLabel
+         %77 = OpLoad %int %GLF_live7cols
+         %78 = OpIAdd %int %77 %int_1
+               OpStore %GLF_live7cols %78
+               OpBranch %221
+        %222 = OpLabel
+               OpStore %GLF_live7sum_index %int_0
+               OpStore %GLF_live7_looplimiter7 %int_0
+               OpStore %GLF_live7cols_0 %int_2
+               OpBranch %281
+        %281 = OpLabel
+               OpLoopMerge %282 %283 None
+               OpBranch %284
+        %284 = OpLabel
+         %79 = OpLoad %int %GLF_live7cols_0
+        %285 = OpSLessThan %bool %79 %int_4
+               OpBranchConditional %285 %286 %282
+        %286 = OpLabel
+         %80 = OpLoad %int %GLF_live7_looplimiter7
+        %287 = OpSGreaterThanEqual %bool %80 %int_7
+               OpSelectionMerge %288 None
+               OpBranchConditional %287 %289 %288
+        %289 = OpLabel
+               OpBranch %282
+        %288 = OpLabel
+         %81 = OpLoad %int %GLF_live7_looplimiter7
+         %82 = OpIAdd %int %81 %int_1
+               OpStore %GLF_live7_looplimiter7 %82
+               OpStore %GLF_live7rows_0 %int_2
+         %83 = OpLoad %int %GLF_live7sum_index
+        %290 = OpSGreaterThanEqual %bool %83 %int_0
+         %84 = OpLoad %int %GLF_live7sum_index
+        %291 = OpSLessThan %bool %84 %int_9
+        %292 = OpLogicalAnd %bool %290 %291
+         %85 = OpLoad %int %GLF_live7sum_index
+        %293 = OpSelect %int %292 %85 %int_0
+        %294 = OpAccessChain %_ptr_Function_float %GLF_live7sums %293
+               OpStore %294 %float_0
+               OpStore %GLF_live7c_0 %int_0
+               OpBranch %295
+        %295 = OpLabel
+               OpLoopMerge %296 %297 None
+               OpBranch %298
+        %298 = OpLabel
+         %86 = OpLoad %int %GLF_live7c_0
+        %299 = OpSLessThan %bool %86 %int_1
+               OpBranchConditional %299 %300 %296
+        %300 = OpLabel
+               OpStore %GLF_live7r_0 %int_0
+               OpBranch %301
+        %301 = OpLabel
+               OpLoopMerge %302 %303 None
+               OpBranch %304
+        %304 = OpLabel
+         %87 = OpLoad %int %GLF_live7r_0
+         %88 = OpLoad %int %GLF_live7rows_0
+        %305 = OpSLessThan %bool %87 %88
+               OpBranchConditional %305 %306 %302
+        %306 = OpLabel
+         %89 = OpLoad %int %GLF_live7sum_index
+        %307 = OpSGreaterThanEqual %bool %89 %int_0
+         %90 = OpLoad %int %GLF_live7sum_index
+        %308 = OpSLessThan %bool %90 %int_9
+        %309 = OpLogicalAnd %bool %307 %308
+         %91 = OpLoad %int %GLF_live7sum_index
+        %310 = OpSelect %int %309 %91 %int_0
+        %311 = OpLoad %mat3v3float %GLF_live7m33
+        %312 = OpTranspose %mat3v3float %311
+         %92 = OpLoad %int %GLF_live7c_0
+        %313 = OpSLessThan %bool %92 %int_3
+               OpSelectionMerge %314 None
+               OpBranchConditional %313 %315 %316
+        %315 = OpLabel
+               OpStore %180 %int_1
+               OpBranch %314
+        %316 = OpLabel
+        %317 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+        %318 = OpLoad %float %317
+        %319 = OpConvertFToS %int %318
+               OpStore %180 %319
+               OpBranch %314
+        %314 = OpLabel
+        %320 = OpLoad %int %180
+         %93 = OpLoad %int %GLF_live7r_0
+        %321 = OpSLessThan %bool %93 %int_3
+        %322 = OpSelect %int %321 %int_1 %int_0
+               OpStore %indexable %312
+        %323 = OpAccessChain %_ptr_Function_float %indexable %320 %322
+        %324 = OpLoad %float %323
+        %325 = OpAccessChain %_ptr_Function_float %GLF_live7sums %310
+        %326 = OpLoad %float %325
+        %327 = OpFAdd %float %326 %324
+        %328 = OpAccessChain %_ptr_Function_float %GLF_live7sums %310
+               OpStore %328 %327
+         %94 = OpLoad %int %GLF_live7sum_index
+        %329 = OpSGreaterThanEqual %bool %94 %int_0
+         %95 = OpLoad %int %GLF_live7sum_index
+        %330 = OpSLessThan %bool %95 %int_9
+        %331 = OpLogicalAnd %bool %329 %330
+         %96 = OpLoad %int %GLF_live7sum_index
+        %332 = OpSelect %int %331 %96 %int_0
+         %97 = OpLoad %int %GLF_live7r_0
+        %333 = OpAccessChain %_ptr_Function_float %GLF_live7m42 %int_1 %97
+        %334 = OpLoad %float %333
+        %335 = OpAccessChain %_ptr_Function_float %GLF_live7sums %332
+        %336 = OpLoad %float %335
+        %337 = OpFAdd %float %336 %334
+        %338 = OpAccessChain %_ptr_Function_float %GLF_live7sums %332
+               OpStore %338 %337
+               OpBranch %303
+        %303 = OpLabel
+         %98 = OpLoad %int %GLF_live7r_0
+         %99 = OpIAdd %int %98 %int_1
+               OpStore %GLF_live7r_0 %99
+               OpBranch %301
+        %302 = OpLabel
+               OpBranch %297
+        %297 = OpLabel
+        %100 = OpLoad %int %GLF_live7c_0
+        %101 = OpIAdd %int %100 %int_1
+               OpStore %GLF_live7c_0 %101
+               OpBranch %295
+        %296 = OpLabel
+        %102 = OpLoad %int %GLF_live7sum_index
+        %103 = OpIAdd %int %102 %int_1
+               OpStore %GLF_live7sum_index %103
+               OpBranch %283
+        %283 = OpLabel
+        %104 = OpLoad %int %GLF_live7cols_0
+        %105 = OpIAdd %int %104 %int_1
+               OpStore %GLF_live7cols_0 %105
+               OpBranch %281
+        %282 = OpLabel
+               OpBranch %214
+        %214 = OpLabel
+        %106 = OpLoad %int %GLF_live4i
+        %107 = OpIAdd %int %106 %int_1
+               OpStore %GLF_live4i %107
+               OpBranch %212
+        %213 = OpLabel
+               OpReturnValue %124
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..1907070
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,237 @@
+void set_float3(inout float3 vec, int idx, float val) {
+  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
+}
+
+void set_float2(inout float2 vec, int idx, float val) {
+  vec = (idx.xx == int2(0, 1)) ? val.xx : vec;
+}
+
+cbuffer cbuffer_x_25 : register(b0, space0) {
+  uint4 x_25[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float3 drawShape_vf2_(inout float2 pos) {
+  bool c2 = false;
+  bool c3 = false;
+  bool c4 = false;
+  bool c5 = false;
+  bool c6 = false;
+  int GLF_live4i = 0;
+  int GLF_live4_looplimiter5 = 0;
+  float4x2 GLF_live7m42 = float4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  float3x3 GLF_live7m33 = float3x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  int GLF_live7cols = 0;
+  int GLF_live7_looplimiter3 = 0;
+  int GLF_live7rows = 0;
+  int GLF_live7_looplimiter2 = 0;
+  int GLF_live7_looplimiter1 = 0;
+  int GLF_live7c = 0;
+  int GLF_live7r = 0;
+  int GLF_live7_looplimiter0 = 0;
+  int GLF_live7sum_index = 0;
+  int GLF_live7_looplimiter7 = 0;
+  int GLF_live7cols_1 = 0;
+  int GLF_live7rows_1 = 0;
+  float GLF_live7sums[9] = (float[9])0;
+  int GLF_live7c_1 = 0;
+  int GLF_live7r_1 = 0;
+  int x_180 = 0;
+  float3x3 indexable = float3x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  const float x_182 = pos.x;
+  c2 = (x_182 > 1.0f);
+  if (c2) {
+    return float3(1.0f, 1.0f, 1.0f);
+  }
+  const float x_188 = pos.y;
+  c3 = (x_188 < 1.0f);
+  if (c3) {
+    return float3(1.0f, 1.0f, 1.0f);
+  }
+  const float x_194 = pos.y;
+  c4 = (x_194 > 1.0f);
+  if (c4) {
+    return float3(1.0f, 1.0f, 1.0f);
+  }
+  const float x_200 = pos.x;
+  c5 = (x_200 < 1.0f);
+  if (c5) {
+    return float3(1.0f, 1.0f, 1.0f);
+  }
+  const float x_206 = pos.x;
+  c6 = ((x_206 + 1.0f) > 1.0f);
+  if (c6) {
+    return float3(1.0f, 1.0f, 1.0f);
+  }
+  GLF_live4i = 0;
+  {
+    for(; (GLF_live4i < 4); GLF_live4i = (GLF_live4i + 1)) {
+      if ((GLF_live4_looplimiter5 >= 7)) {
+        break;
+      }
+      GLF_live4_looplimiter5 = (GLF_live4_looplimiter5 + 1);
+      GLF_live7m42 = float4x2(float2(1.0f, 0.0f), float2(0.0f, 1.0f), float2(0.0f, 0.0f), float2(1.0f, 0.0f));
+      GLF_live7m33 = float3x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f));
+      GLF_live7cols = 2;
+      {
+        for(; (GLF_live7cols < 4); GLF_live7cols = (GLF_live7cols + 1)) {
+          if ((GLF_live7_looplimiter3 >= 7)) {
+            break;
+          }
+          GLF_live7_looplimiter3 = (GLF_live7_looplimiter3 + 1);
+          GLF_live7rows = 2;
+          {
+            for(; (GLF_live7rows < 4); GLF_live7rows = (GLF_live7rows + 1)) {
+              if ((GLF_live7_looplimiter2 >= 7)) {
+                break;
+              }
+              GLF_live7_looplimiter2 = (GLF_live7_looplimiter2 + 1);
+              GLF_live7_looplimiter1 = 0;
+              GLF_live7c = 0;
+              {
+                for(; (GLF_live7c < 3); GLF_live7c = (GLF_live7c + 1)) {
+                  if ((GLF_live7_looplimiter1 >= 7)) {
+                    break;
+                  }
+                  GLF_live7_looplimiter1 = (GLF_live7_looplimiter1 + 1);
+                  GLF_live7r = 0;
+                  {
+                    for(; (GLF_live7r < 2); GLF_live7r = (GLF_live7r + 1)) {
+                      if ((GLF_live7_looplimiter0 >= 7)) {
+                        break;
+                      }
+                      GLF_live7_looplimiter0 = (GLF_live7_looplimiter0 + 1);
+                      bool tint_tmp = (GLF_live7c >= 0);
+                      if (tint_tmp) {
+                        tint_tmp = (GLF_live7c < 3);
+                      }
+                      bool tint_tmp_1 = (GLF_live7r >= 0);
+                      if (tint_tmp_1) {
+                        tint_tmp_1 = (GLF_live7r < 3);
+                      }
+                      set_float3(GLF_live7m33[((tint_tmp) ? GLF_live7c : 0)], ((tint_tmp_1) ? GLF_live7r : 0), 1.0f);
+                      const float x_267 = asfloat(x_25[0].y);
+                      if ((0.0f > x_267)) {
+                      } else {
+                        bool tint_tmp_2 = (GLF_live7c >= 0);
+                        if (tint_tmp_2) {
+                          tint_tmp_2 = (GLF_live7c < 4);
+                        }
+                        bool tint_tmp_3 = (GLF_live7r >= 0);
+                        if (tint_tmp_3) {
+                          tint_tmp_3 = (GLF_live7r < 2);
+                        }
+                        set_float2(GLF_live7m42[((tint_tmp_2) ? GLF_live7c : 0)], ((tint_tmp_3) ? GLF_live7r : 0), 1.0f);
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+      GLF_live7sum_index = 0;
+      GLF_live7_looplimiter7 = 0;
+      GLF_live7cols_1 = 2;
+      {
+        for(; (GLF_live7cols_1 < 4); GLF_live7cols_1 = (GLF_live7cols_1 + 1)) {
+          if ((GLF_live7_looplimiter7 >= 7)) {
+            break;
+          }
+          GLF_live7_looplimiter7 = (GLF_live7_looplimiter7 + 1);
+          GLF_live7rows_1 = 2;
+          bool tint_tmp_4 = (GLF_live7sum_index >= 0);
+          if (tint_tmp_4) {
+            tint_tmp_4 = (GLF_live7sum_index < 9);
+          }
+          GLF_live7sums[((tint_tmp_4) ? GLF_live7sum_index : 0)] = 0.0f;
+          GLF_live7c_1 = 0;
+          {
+            for(; (GLF_live7c_1 < 1); GLF_live7c_1 = (GLF_live7c_1 + 1)) {
+              GLF_live7r_1 = 0;
+              {
+                for(; (GLF_live7r_1 < GLF_live7rows_1); GLF_live7r_1 = (GLF_live7r_1 + 1)) {
+                  bool tint_tmp_5 = (GLF_live7sum_index >= 0);
+                  if (tint_tmp_5) {
+                    tint_tmp_5 = (GLF_live7sum_index < 9);
+                  }
+                  const int x_310 = ((tint_tmp_5) ? GLF_live7sum_index : 0);
+                  const float3x3 x_312 = transpose(GLF_live7m33);
+                  if ((GLF_live7c_1 < 3)) {
+                    x_180 = 1;
+                  } else {
+                    const float x_318 = asfloat(x_25[0].x);
+                    x_180 = int(x_318);
+                  }
+                  const int x_320 = x_180;
+                  const int x_93 = GLF_live7r_1;
+                  indexable = x_312;
+                  const float x_324 = indexable[x_320][((x_93 < 3) ? 1 : 0)];
+                  const float x_326 = GLF_live7sums[x_310];
+                  GLF_live7sums[x_310] = (x_326 + x_324);
+                  bool tint_tmp_6 = (GLF_live7sum_index >= 0);
+                  if (tint_tmp_6) {
+                    tint_tmp_6 = (GLF_live7sum_index < 9);
+                  }
+                  const int x_332 = ((tint_tmp_6) ? GLF_live7sum_index : 0);
+                  const float x_334 = GLF_live7m42[1][GLF_live7r_1];
+                  const float x_336 = GLF_live7sums[x_332];
+                  GLF_live7sums[x_332] = (x_336 + x_334);
+                }
+              }
+            }
+          }
+          GLF_live7sum_index = (GLF_live7sum_index + 1);
+        }
+      }
+    }
+  }
+  return float3(1.0f, 1.0f, 1.0f);
+}
+
+void main_1() {
+  float2 position = float2(0.0f, 0.0f);
+  float2 param = float2(0.0f, 0.0f);
+  float2 param_1 = float2(0.0f, 0.0f);
+  int i = 0;
+  float2 param_2 = float2(0.0f, 0.0f);
+  const float x_161 = asfloat(x_25[0].x);
+  if ((x_161 >= 2.0f)) {
+    const float4 x_165 = gl_FragCoord;
+    position = float2(x_165.x, x_165.y);
+    param = position;
+    const float3 x_168 = drawShape_vf2_(param);
+    param_1 = position;
+    const float3 x_170 = drawShape_vf2_(param_1);
+    i = 25;
+    {
+      for(; (i > 0); i = (i - 1)) {
+        param_2 = position;
+        const float3 x_178 = drawShape_vf2_(param_2);
+      }
+    }
+  }
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..9f3a7ed
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.spvasm.expected.msl
@@ -0,0 +1,312 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  float arr[9];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float3 drawShape_vf2_(constant buf0& x_25, thread float2* const pos) {
+  bool c2 = false;
+  bool c3 = false;
+  bool c4 = false;
+  bool c5 = false;
+  bool c6 = false;
+  int GLF_live4i = 0;
+  int GLF_live4_looplimiter5 = 0;
+  float4x2 GLF_live7m42 = float4x2(0.0f);
+  float3x3 GLF_live7m33 = float3x3(0.0f);
+  int GLF_live7cols = 0;
+  int GLF_live7_looplimiter3 = 0;
+  int GLF_live7rows = 0;
+  int GLF_live7_looplimiter2 = 0;
+  int GLF_live7_looplimiter1 = 0;
+  int GLF_live7c = 0;
+  int GLF_live7r = 0;
+  int GLF_live7_looplimiter0 = 0;
+  int GLF_live7sum_index = 0;
+  int GLF_live7_looplimiter7 = 0;
+  int GLF_live7cols_1 = 0;
+  int GLF_live7rows_1 = 0;
+  tint_array_wrapper GLF_live7sums = {};
+  int GLF_live7c_1 = 0;
+  int GLF_live7r_1 = 0;
+  int x_180 = 0;
+  float3x3 indexable = float3x3(0.0f);
+  float const x_182 = (*(pos)).x;
+  c2 = (x_182 > 1.0f);
+  bool const x_184 = c2;
+  if (x_184) {
+    return float3(1.0f, 1.0f, 1.0f);
+  }
+  float const x_188 = (*(pos)).y;
+  c3 = (x_188 < 1.0f);
+  bool const x_190 = c3;
+  if (x_190) {
+    return float3(1.0f, 1.0f, 1.0f);
+  }
+  float const x_194 = (*(pos)).y;
+  c4 = (x_194 > 1.0f);
+  bool const x_196 = c4;
+  if (x_196) {
+    return float3(1.0f, 1.0f, 1.0f);
+  }
+  float const x_200 = (*(pos)).x;
+  c5 = (x_200 < 1.0f);
+  bool const x_202 = c5;
+  if (x_202) {
+    return float3(1.0f, 1.0f, 1.0f);
+  }
+  float const x_206 = (*(pos)).x;
+  c6 = ((x_206 + 1.0f) > 1.0f);
+  bool const x_209 = c6;
+  if (x_209) {
+    return float3(1.0f, 1.0f, 1.0f);
+  }
+  GLF_live4i = 0;
+  while (true) {
+    int const x_39 = GLF_live4i;
+    if ((x_39 < 4)) {
+    } else {
+      break;
+    }
+    int const x_40 = GLF_live4_looplimiter5;
+    if ((x_40 >= 7)) {
+      break;
+    }
+    int const x_41 = GLF_live4_looplimiter5;
+    GLF_live4_looplimiter5 = (x_41 + 1);
+    GLF_live7m42 = float4x2(float2(1.0f, 0.0f), float2(0.0f, 1.0f), float2(0.0f, 0.0f), float2(1.0f, 0.0f));
+    GLF_live7m33 = float3x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f));
+    GLF_live7cols = 2;
+    while (true) {
+      int const x_43 = GLF_live7cols;
+      if ((x_43 < 4)) {
+      } else {
+        break;
+      }
+      int const x_44 = GLF_live7_looplimiter3;
+      if ((x_44 >= 7)) {
+        break;
+      }
+      int const x_45 = GLF_live7_looplimiter3;
+      GLF_live7_looplimiter3 = (x_45 + 1);
+      GLF_live7rows = 2;
+      while (true) {
+        int const x_47 = GLF_live7rows;
+        if ((x_47 < 4)) {
+        } else {
+          break;
+        }
+        int const x_48 = GLF_live7_looplimiter2;
+        if ((x_48 >= 7)) {
+          break;
+        }
+        int const x_49 = GLF_live7_looplimiter2;
+        GLF_live7_looplimiter2 = (x_49 + 1);
+        GLF_live7_looplimiter1 = 0;
+        GLF_live7c = 0;
+        while (true) {
+          int const x_51 = GLF_live7c;
+          if ((x_51 < 3)) {
+          } else {
+            break;
+          }
+          int const x_52 = GLF_live7_looplimiter1;
+          if ((x_52 >= 7)) {
+            break;
+          }
+          int const x_53 = GLF_live7_looplimiter1;
+          GLF_live7_looplimiter1 = (x_53 + 1);
+          GLF_live7r = 0;
+          while (true) {
+            int const x_55 = GLF_live7r;
+            if ((x_55 < 2)) {
+            } else {
+              break;
+            }
+            int const x_56 = GLF_live7_looplimiter0;
+            if ((x_56 >= 7)) {
+              break;
+            }
+            int const x_57 = GLF_live7_looplimiter0;
+            GLF_live7_looplimiter0 = (x_57 + 1);
+            int const x_59 = GLF_live7c;
+            int const x_60 = GLF_live7c;
+            int const x_61 = GLF_live7c;
+            int const x_62 = GLF_live7r;
+            int const x_63 = GLF_live7r;
+            int const x_64 = GLF_live7r;
+            GLF_live7m33[select(0, x_61, ((x_59 >= 0) && (x_60 < 3)))][select(0, x_64, ((x_62 >= 0) && (x_63 < 3)))] = 1.0f;
+            float const x_267 = x_25.injectionSwitch.y;
+            if ((0.0f > x_267)) {
+            } else {
+              int const x_65 = GLF_live7c;
+              int const x_66 = GLF_live7c;
+              int const x_67 = GLF_live7c;
+              int const x_68 = GLF_live7r;
+              int const x_69 = GLF_live7r;
+              int const x_70 = GLF_live7r;
+              GLF_live7m42[select(0, x_67, ((x_65 >= 0) && (x_66 < 4)))][select(0, x_70, ((x_68 >= 0) && (x_69 < 2)))] = 1.0f;
+            }
+            {
+              int const x_71 = GLF_live7r;
+              GLF_live7r = (x_71 + 1);
+            }
+          }
+          {
+            int const x_73 = GLF_live7c;
+            GLF_live7c = (x_73 + 1);
+          }
+        }
+        {
+          int const x_75 = GLF_live7rows;
+          GLF_live7rows = (x_75 + 1);
+        }
+      }
+      {
+        int const x_77 = GLF_live7cols;
+        GLF_live7cols = (x_77 + 1);
+      }
+    }
+    GLF_live7sum_index = 0;
+    GLF_live7_looplimiter7 = 0;
+    GLF_live7cols_1 = 2;
+    while (true) {
+      int const x_79 = GLF_live7cols_1;
+      if ((x_79 < 4)) {
+      } else {
+        break;
+      }
+      int const x_80 = GLF_live7_looplimiter7;
+      if ((x_80 >= 7)) {
+        break;
+      }
+      int const x_81 = GLF_live7_looplimiter7;
+      GLF_live7_looplimiter7 = (x_81 + 1);
+      GLF_live7rows_1 = 2;
+      int const x_83 = GLF_live7sum_index;
+      int const x_84 = GLF_live7sum_index;
+      int const x_85 = GLF_live7sum_index;
+      GLF_live7sums.arr[select(0, x_85, ((x_83 >= 0) && (x_84 < 9)))] = 0.0f;
+      GLF_live7c_1 = 0;
+      while (true) {
+        int const x_86 = GLF_live7c_1;
+        if ((x_86 < 1)) {
+        } else {
+          break;
+        }
+        GLF_live7r_1 = 0;
+        while (true) {
+          int const x_87 = GLF_live7r_1;
+          int const x_88 = GLF_live7rows_1;
+          if ((x_87 < x_88)) {
+          } else {
+            break;
+          }
+          int const x_89 = GLF_live7sum_index;
+          int const x_90 = GLF_live7sum_index;
+          int const x_91 = GLF_live7sum_index;
+          int const x_310 = select(0, x_91, ((x_89 >= 0) && (x_90 < 9)));
+          float3x3 const x_311 = GLF_live7m33;
+          float3x3 const x_312 = transpose(x_311);
+          int const x_92 = GLF_live7c_1;
+          if ((x_92 < 3)) {
+            x_180 = 1;
+          } else {
+            float const x_318 = x_25.injectionSwitch.x;
+            x_180 = int(x_318);
+          }
+          int const x_320 = x_180;
+          int const x_93 = GLF_live7r_1;
+          indexable = x_312;
+          float const x_324 = indexable[x_320][select(0, 1, (x_93 < 3))];
+          float const x_326 = GLF_live7sums.arr[x_310];
+          GLF_live7sums.arr[x_310] = (x_326 + x_324);
+          int const x_94 = GLF_live7sum_index;
+          int const x_95 = GLF_live7sum_index;
+          int const x_96 = GLF_live7sum_index;
+          int const x_332 = select(0, x_96, ((x_94 >= 0) && (x_95 < 9)));
+          int const x_97 = GLF_live7r_1;
+          float const x_334 = GLF_live7m42[1][x_97];
+          float const x_336 = GLF_live7sums.arr[x_332];
+          GLF_live7sums.arr[x_332] = (x_336 + x_334);
+          {
+            int const x_98 = GLF_live7r_1;
+            GLF_live7r_1 = (x_98 + 1);
+          }
+        }
+        {
+          int const x_100 = GLF_live7c_1;
+          GLF_live7c_1 = (x_100 + 1);
+        }
+      }
+      int const x_102 = GLF_live7sum_index;
+      GLF_live7sum_index = (x_102 + 1);
+      {
+        int const x_104 = GLF_live7cols_1;
+        GLF_live7cols_1 = (x_104 + 1);
+      }
+    }
+    {
+      int const x_106 = GLF_live4i;
+      GLF_live4i = (x_106 + 1);
+    }
+  }
+  return float3(1.0f, 1.0f, 1.0f);
+}
+
+void main_1(constant buf0& x_25, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float2 position = 0.0f;
+  float2 param = 0.0f;
+  float2 param_1 = 0.0f;
+  int i = 0;
+  float2 param_2 = 0.0f;
+  float const x_161 = x_25.injectionSwitch.x;
+  if ((x_161 >= 2.0f)) {
+    float4 const x_165 = *(tint_symbol_5);
+    position = float2(x_165.x, x_165.y);
+    float2 const x_167 = position;
+    param = x_167;
+    float3 const x_168 = drawShape_vf2_(x_25, &(param));
+    float2 const x_169 = position;
+    param_1 = x_169;
+    float3 const x_170 = drawShape_vf2_(x_25, &(param_1));
+    i = 25;
+    while (true) {
+      int const x_108 = i;
+      if ((x_108 > 0)) {
+      } else {
+        break;
+      }
+      float2 const x_177 = position;
+      param_2 = x_177;
+      float3 const x_178 = drawShape_vf2_(x_25, &(param_2));
+      {
+        int const x_109 = i;
+        i = (x_109 - 1);
+      }
+    }
+  }
+  *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_25 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_25, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..694e352
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,663 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 403
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_25 "x_25"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %drawShape_vf2_ "drawShape_vf2_"
+               OpName %pos "pos"
+               OpName %c2 "c2"
+               OpName %c3 "c3"
+               OpName %c4 "c4"
+               OpName %c5 "c5"
+               OpName %c6 "c6"
+               OpName %GLF_live4i "GLF_live4i"
+               OpName %GLF_live4_looplimiter5 "GLF_live4_looplimiter5"
+               OpName %GLF_live7m42 "GLF_live7m42"
+               OpName %GLF_live7m33 "GLF_live7m33"
+               OpName %GLF_live7cols "GLF_live7cols"
+               OpName %GLF_live7_looplimiter3 "GLF_live7_looplimiter3"
+               OpName %GLF_live7rows "GLF_live7rows"
+               OpName %GLF_live7_looplimiter2 "GLF_live7_looplimiter2"
+               OpName %GLF_live7_looplimiter1 "GLF_live7_looplimiter1"
+               OpName %GLF_live7c "GLF_live7c"
+               OpName %GLF_live7r "GLF_live7r"
+               OpName %GLF_live7_looplimiter0 "GLF_live7_looplimiter0"
+               OpName %GLF_live7sum_index "GLF_live7sum_index"
+               OpName %GLF_live7_looplimiter7 "GLF_live7_looplimiter7"
+               OpName %GLF_live7cols_1 "GLF_live7cols_1"
+               OpName %GLF_live7rows_1 "GLF_live7rows_1"
+               OpName %GLF_live7sums "GLF_live7sums"
+               OpName %GLF_live7c_1 "GLF_live7c_1"
+               OpName %GLF_live7r_1 "GLF_live7r_1"
+               OpName %x_180 "x_180"
+               OpName %indexable "indexable"
+               OpName %main_1 "main_1"
+               OpName %position "position"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %i "i"
+               OpName %param_2 "param_2"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_25 NonWritable
+               OpDecorate %x_25 DescriptorSet 0
+               OpDecorate %x_25 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_float_uint_9 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_25 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %15 = OpTypeFunction %v3float %_ptr_Function_v2float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %24 = OpConstantNull %bool
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %32 = OpConstantNull %int
+%mat4v2float = OpTypeMatrix %v2float 4
+%_ptr_Function_mat4v2float = OpTypePointer Function %mat4v2float
+         %37 = OpConstantNull %mat4v2float
+%mat3v3float = OpTypeMatrix %v3float 3
+%_ptr_Function_mat3v3float = OpTypePointer Function %mat3v3float
+         %41 = OpConstantNull %mat3v3float
+       %uint = OpTypeInt 32 0
+     %uint_9 = OpConstant %uint 9
+%_arr_float_uint_9 = OpTypeArray %float %uint_9
+%_ptr_Function__arr_float_uint_9 = OpTypePointer Function %_arr_float_uint_9
+         %59 = OpConstantNull %_arr_float_uint_9
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_1 = OpConstant %float 1
+         %74 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+     %uint_1 = OpConstant %uint 1
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+      %int_7 = OpConstant %int 7
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+        %125 = OpConstantComposite %v2float %float_1 %float_0
+        %126 = OpConstantComposite %v2float %float_0 %float_1
+        %127 = OpConstantComposite %v2float %float_0 %float_0
+        %128 = OpConstantComposite %mat4v2float %125 %126 %127 %125
+        %129 = OpConstantComposite %v3float %float_1 %float_0 %float_0
+        %130 = OpConstantComposite %v3float %float_0 %float_1 %float_0
+        %131 = OpConstantComposite %v3float %float_0 %float_0 %float_1
+        %132 = OpConstantComposite %mat3v3float %129 %130 %131
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_9 = OpConstant %int 9
+       %void = OpTypeVoid
+        %348 = OpTypeFunction %void
+        %353 = OpConstantNull %v2float
+    %float_2 = OpConstant %float 2
+     %int_25 = OpConstant %int 25
+        %389 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %390 = OpTypeFunction %void %main_out
+%drawShape_vf2_ = OpFunction %v3float None %15
+        %pos = OpFunctionParameter %_ptr_Function_v2float
+         %20 = OpLabel
+         %c2 = OpVariable %_ptr_Function_bool Function %24
+         %c3 = OpVariable %_ptr_Function_bool Function %24
+         %c4 = OpVariable %_ptr_Function_bool Function %24
+         %c5 = OpVariable %_ptr_Function_bool Function %24
+         %c6 = OpVariable %_ptr_Function_bool Function %24
+ %GLF_live4i = OpVariable %_ptr_Function_int Function %32
+%GLF_live4_looplimiter5 = OpVariable %_ptr_Function_int Function %32
+%GLF_live7m42 = OpVariable %_ptr_Function_mat4v2float Function %37
+%GLF_live7m33 = OpVariable %_ptr_Function_mat3v3float Function %41
+%GLF_live7cols = OpVariable %_ptr_Function_int Function %32
+%GLF_live7_looplimiter3 = OpVariable %_ptr_Function_int Function %32
+%GLF_live7rows = OpVariable %_ptr_Function_int Function %32
+%GLF_live7_looplimiter2 = OpVariable %_ptr_Function_int Function %32
+%GLF_live7_looplimiter1 = OpVariable %_ptr_Function_int Function %32
+ %GLF_live7c = OpVariable %_ptr_Function_int Function %32
+ %GLF_live7r = OpVariable %_ptr_Function_int Function %32
+%GLF_live7_looplimiter0 = OpVariable %_ptr_Function_int Function %32
+%GLF_live7sum_index = OpVariable %_ptr_Function_int Function %32
+%GLF_live7_looplimiter7 = OpVariable %_ptr_Function_int Function %32
+%GLF_live7cols_1 = OpVariable %_ptr_Function_int Function %32
+%GLF_live7rows_1 = OpVariable %_ptr_Function_int Function %32
+%GLF_live7sums = OpVariable %_ptr_Function__arr_float_uint_9 Function %59
+%GLF_live7c_1 = OpVariable %_ptr_Function_int Function %32
+%GLF_live7r_1 = OpVariable %_ptr_Function_int Function %32
+      %x_180 = OpVariable %_ptr_Function_int Function %32
+  %indexable = OpVariable %_ptr_Function_mat3v3float Function %41
+         %67 = OpAccessChain %_ptr_Function_float %pos %uint_0
+         %68 = OpLoad %float %67
+         %70 = OpFOrdGreaterThan %bool %68 %float_1
+               OpStore %c2 %70
+         %71 = OpLoad %bool %c2
+               OpSelectionMerge %72 None
+               OpBranchConditional %71 %73 %72
+         %73 = OpLabel
+               OpReturnValue %74
+         %72 = OpLabel
+         %77 = OpAccessChain %_ptr_Function_float %pos %uint_1
+         %78 = OpLoad %float %77
+         %79 = OpFOrdLessThan %bool %78 %float_1
+               OpStore %c3 %79
+         %80 = OpLoad %bool %c3
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %81
+         %82 = OpLabel
+               OpReturnValue %74
+         %81 = OpLabel
+         %84 = OpAccessChain %_ptr_Function_float %pos %uint_1
+         %85 = OpLoad %float %84
+         %86 = OpFOrdGreaterThan %bool %85 %float_1
+               OpStore %c4 %86
+         %87 = OpLoad %bool %c4
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %88
+         %89 = OpLabel
+               OpReturnValue %74
+         %88 = OpLabel
+         %91 = OpAccessChain %_ptr_Function_float %pos %uint_0
+         %92 = OpLoad %float %91
+         %93 = OpFOrdLessThan %bool %92 %float_1
+               OpStore %c5 %93
+         %94 = OpLoad %bool %c5
+               OpSelectionMerge %95 None
+               OpBranchConditional %94 %96 %95
+         %96 = OpLabel
+               OpReturnValue %74
+         %95 = OpLabel
+         %98 = OpAccessChain %_ptr_Function_float %pos %uint_0
+         %99 = OpLoad %float %98
+        %100 = OpFAdd %float %99 %float_1
+        %101 = OpFOrdGreaterThan %bool %100 %float_1
+               OpStore %c6 %101
+        %102 = OpLoad %bool %c6
+               OpSelectionMerge %103 None
+               OpBranchConditional %102 %104 %103
+        %104 = OpLabel
+               OpReturnValue %74
+        %103 = OpLabel
+               OpStore %GLF_live4i %int_0
+               OpBranch %106
+        %106 = OpLabel
+               OpLoopMerge %107 %108 None
+               OpBranch %109
+        %109 = OpLabel
+        %110 = OpLoad %int %GLF_live4i
+        %112 = OpSLessThan %bool %110 %int_4
+               OpSelectionMerge %113 None
+               OpBranchConditional %112 %114 %115
+        %114 = OpLabel
+               OpBranch %113
+        %115 = OpLabel
+               OpBranch %107
+        %113 = OpLabel
+        %116 = OpLoad %int %GLF_live4_looplimiter5
+        %118 = OpSGreaterThanEqual %bool %116 %int_7
+               OpSelectionMerge %119 None
+               OpBranchConditional %118 %120 %119
+        %120 = OpLabel
+               OpBranch %107
+        %119 = OpLabel
+        %121 = OpLoad %int %GLF_live4_looplimiter5
+        %123 = OpIAdd %int %121 %int_1
+               OpStore %GLF_live4_looplimiter5 %123
+               OpStore %GLF_live7m42 %128
+               OpStore %GLF_live7m33 %132
+               OpStore %GLF_live7cols %int_2
+               OpBranch %134
+        %134 = OpLabel
+               OpLoopMerge %135 %136 None
+               OpBranch %137
+        %137 = OpLabel
+        %138 = OpLoad %int %GLF_live7cols
+        %139 = OpSLessThan %bool %138 %int_4
+               OpSelectionMerge %140 None
+               OpBranchConditional %139 %141 %142
+        %141 = OpLabel
+               OpBranch %140
+        %142 = OpLabel
+               OpBranch %135
+        %140 = OpLabel
+        %143 = OpLoad %int %GLF_live7_looplimiter3
+        %144 = OpSGreaterThanEqual %bool %143 %int_7
+               OpSelectionMerge %145 None
+               OpBranchConditional %144 %146 %145
+        %146 = OpLabel
+               OpBranch %135
+        %145 = OpLabel
+        %147 = OpLoad %int %GLF_live7_looplimiter3
+        %148 = OpIAdd %int %147 %int_1
+               OpStore %GLF_live7_looplimiter3 %148
+               OpStore %GLF_live7rows %int_2
+               OpBranch %149
+        %149 = OpLabel
+               OpLoopMerge %150 %151 None
+               OpBranch %152
+        %152 = OpLabel
+        %153 = OpLoad %int %GLF_live7rows
+        %154 = OpSLessThan %bool %153 %int_4
+               OpSelectionMerge %155 None
+               OpBranchConditional %154 %156 %157
+        %156 = OpLabel
+               OpBranch %155
+        %157 = OpLabel
+               OpBranch %150
+        %155 = OpLabel
+        %158 = OpLoad %int %GLF_live7_looplimiter2
+        %159 = OpSGreaterThanEqual %bool %158 %int_7
+               OpSelectionMerge %160 None
+               OpBranchConditional %159 %161 %160
+        %161 = OpLabel
+               OpBranch %150
+        %160 = OpLabel
+        %162 = OpLoad %int %GLF_live7_looplimiter2
+        %163 = OpIAdd %int %162 %int_1
+               OpStore %GLF_live7_looplimiter2 %163
+               OpStore %GLF_live7_looplimiter1 %int_0
+               OpStore %GLF_live7c %int_0
+               OpBranch %164
+        %164 = OpLabel
+               OpLoopMerge %165 %166 None
+               OpBranch %167
+        %167 = OpLabel
+        %168 = OpLoad %int %GLF_live7c
+        %170 = OpSLessThan %bool %168 %int_3
+               OpSelectionMerge %171 None
+               OpBranchConditional %170 %172 %173
+        %172 = OpLabel
+               OpBranch %171
+        %173 = OpLabel
+               OpBranch %165
+        %171 = OpLabel
+        %174 = OpLoad %int %GLF_live7_looplimiter1
+        %175 = OpSGreaterThanEqual %bool %174 %int_7
+               OpSelectionMerge %176 None
+               OpBranchConditional %175 %177 %176
+        %177 = OpLabel
+               OpBranch %165
+        %176 = OpLabel
+        %178 = OpLoad %int %GLF_live7_looplimiter1
+        %179 = OpIAdd %int %178 %int_1
+               OpStore %GLF_live7_looplimiter1 %179
+               OpStore %GLF_live7r %int_0
+               OpBranch %180
+        %180 = OpLabel
+               OpLoopMerge %181 %182 None
+               OpBranch %183
+        %183 = OpLabel
+        %184 = OpLoad %int %GLF_live7r
+        %185 = OpSLessThan %bool %184 %int_2
+               OpSelectionMerge %186 None
+               OpBranchConditional %185 %187 %188
+        %187 = OpLabel
+               OpBranch %186
+        %188 = OpLabel
+               OpBranch %181
+        %186 = OpLabel
+        %189 = OpLoad %int %GLF_live7_looplimiter0
+        %190 = OpSGreaterThanEqual %bool %189 %int_7
+               OpSelectionMerge %191 None
+               OpBranchConditional %190 %192 %191
+        %192 = OpLabel
+               OpBranch %181
+        %191 = OpLabel
+        %193 = OpLoad %int %GLF_live7_looplimiter0
+        %194 = OpIAdd %int %193 %int_1
+               OpStore %GLF_live7_looplimiter0 %194
+        %195 = OpLoad %int %GLF_live7c
+        %196 = OpLoad %int %GLF_live7c
+        %197 = OpLoad %int %GLF_live7c
+        %198 = OpLoad %int %GLF_live7r
+        %199 = OpLoad %int %GLF_live7r
+        %200 = OpLoad %int %GLF_live7r
+        %202 = OpSGreaterThanEqual %bool %195 %int_0
+               OpSelectionMerge %203 None
+               OpBranchConditional %202 %204 %203
+        %204 = OpLabel
+        %205 = OpSLessThan %bool %196 %int_3
+               OpBranch %203
+        %203 = OpLabel
+        %206 = OpPhi %bool %202 %191 %205 %204
+        %201 = OpSelect %int %206 %197 %int_0
+        %208 = OpSGreaterThanEqual %bool %198 %int_0
+               OpSelectionMerge %209 None
+               OpBranchConditional %208 %210 %209
+        %210 = OpLabel
+        %211 = OpSLessThan %bool %199 %int_3
+               OpBranch %209
+        %209 = OpLabel
+        %212 = OpPhi %bool %208 %203 %211 %210
+        %207 = OpSelect %int %212 %200 %int_0
+        %213 = OpAccessChain %_ptr_Function_float %GLF_live7m33 %201 %207
+               OpStore %213 %float_1
+        %215 = OpAccessChain %_ptr_Uniform_float %x_25 %uint_0 %uint_1
+        %216 = OpLoad %float %215
+        %217 = OpFOrdGreaterThan %bool %float_0 %216
+               OpSelectionMerge %218 None
+               OpBranchConditional %217 %219 %220
+        %219 = OpLabel
+               OpBranch %218
+        %220 = OpLabel
+        %221 = OpLoad %int %GLF_live7c
+        %222 = OpLoad %int %GLF_live7c
+        %223 = OpLoad %int %GLF_live7c
+        %224 = OpLoad %int %GLF_live7r
+        %225 = OpLoad %int %GLF_live7r
+        %226 = OpLoad %int %GLF_live7r
+        %228 = OpSGreaterThanEqual %bool %221 %int_0
+               OpSelectionMerge %229 None
+               OpBranchConditional %228 %230 %229
+        %230 = OpLabel
+        %231 = OpSLessThan %bool %222 %int_4
+               OpBranch %229
+        %229 = OpLabel
+        %232 = OpPhi %bool %228 %220 %231 %230
+        %227 = OpSelect %int %232 %223 %int_0
+        %234 = OpSGreaterThanEqual %bool %224 %int_0
+               OpSelectionMerge %235 None
+               OpBranchConditional %234 %236 %235
+        %236 = OpLabel
+        %237 = OpSLessThan %bool %225 %int_2
+               OpBranch %235
+        %235 = OpLabel
+        %238 = OpPhi %bool %234 %229 %237 %236
+        %233 = OpSelect %int %238 %226 %int_0
+        %239 = OpAccessChain %_ptr_Function_float %GLF_live7m42 %227 %233
+               OpStore %239 %float_1
+               OpBranch %218
+        %218 = OpLabel
+               OpBranch %182
+        %182 = OpLabel
+        %240 = OpLoad %int %GLF_live7r
+        %241 = OpIAdd %int %240 %int_1
+               OpStore %GLF_live7r %241
+               OpBranch %180
+        %181 = OpLabel
+               OpBranch %166
+        %166 = OpLabel
+        %242 = OpLoad %int %GLF_live7c
+        %243 = OpIAdd %int %242 %int_1
+               OpStore %GLF_live7c %243
+               OpBranch %164
+        %165 = OpLabel
+               OpBranch %151
+        %151 = OpLabel
+        %244 = OpLoad %int %GLF_live7rows
+        %245 = OpIAdd %int %244 %int_1
+               OpStore %GLF_live7rows %245
+               OpBranch %149
+        %150 = OpLabel
+               OpBranch %136
+        %136 = OpLabel
+        %246 = OpLoad %int %GLF_live7cols
+        %247 = OpIAdd %int %246 %int_1
+               OpStore %GLF_live7cols %247
+               OpBranch %134
+        %135 = OpLabel
+               OpStore %GLF_live7sum_index %int_0
+               OpStore %GLF_live7_looplimiter7 %int_0
+               OpStore %GLF_live7cols_1 %int_2
+               OpBranch %248
+        %248 = OpLabel
+               OpLoopMerge %249 %250 None
+               OpBranch %251
+        %251 = OpLabel
+        %252 = OpLoad %int %GLF_live7cols_1
+        %253 = OpSLessThan %bool %252 %int_4
+               OpSelectionMerge %254 None
+               OpBranchConditional %253 %255 %256
+        %255 = OpLabel
+               OpBranch %254
+        %256 = OpLabel
+               OpBranch %249
+        %254 = OpLabel
+        %257 = OpLoad %int %GLF_live7_looplimiter7
+        %258 = OpSGreaterThanEqual %bool %257 %int_7
+               OpSelectionMerge %259 None
+               OpBranchConditional %258 %260 %259
+        %260 = OpLabel
+               OpBranch %249
+        %259 = OpLabel
+        %261 = OpLoad %int %GLF_live7_looplimiter7
+        %262 = OpIAdd %int %261 %int_1
+               OpStore %GLF_live7_looplimiter7 %262
+               OpStore %GLF_live7rows_1 %int_2
+        %263 = OpLoad %int %GLF_live7sum_index
+        %264 = OpLoad %int %GLF_live7sum_index
+        %265 = OpLoad %int %GLF_live7sum_index
+        %267 = OpSGreaterThanEqual %bool %263 %int_0
+               OpSelectionMerge %268 None
+               OpBranchConditional %267 %269 %268
+        %269 = OpLabel
+        %271 = OpSLessThan %bool %264 %int_9
+               OpBranch %268
+        %268 = OpLabel
+        %272 = OpPhi %bool %267 %259 %271 %269
+        %266 = OpSelect %int %272 %265 %int_0
+        %273 = OpAccessChain %_ptr_Function_float %GLF_live7sums %266
+               OpStore %273 %float_0
+               OpStore %GLF_live7c_1 %int_0
+               OpBranch %274
+        %274 = OpLabel
+               OpLoopMerge %275 %276 None
+               OpBranch %277
+        %277 = OpLabel
+        %278 = OpLoad %int %GLF_live7c_1
+        %279 = OpSLessThan %bool %278 %int_1
+               OpSelectionMerge %280 None
+               OpBranchConditional %279 %281 %282
+        %281 = OpLabel
+               OpBranch %280
+        %282 = OpLabel
+               OpBranch %275
+        %280 = OpLabel
+               OpStore %GLF_live7r_1 %int_0
+               OpBranch %283
+        %283 = OpLabel
+               OpLoopMerge %284 %285 None
+               OpBranch %286
+        %286 = OpLabel
+        %287 = OpLoad %int %GLF_live7r_1
+        %288 = OpLoad %int %GLF_live7rows_1
+        %289 = OpSLessThan %bool %287 %288
+               OpSelectionMerge %290 None
+               OpBranchConditional %289 %291 %292
+        %291 = OpLabel
+               OpBranch %290
+        %292 = OpLabel
+               OpBranch %284
+        %290 = OpLabel
+        %293 = OpLoad %int %GLF_live7sum_index
+        %294 = OpLoad %int %GLF_live7sum_index
+        %295 = OpLoad %int %GLF_live7sum_index
+        %297 = OpSGreaterThanEqual %bool %293 %int_0
+               OpSelectionMerge %298 None
+               OpBranchConditional %297 %299 %298
+        %299 = OpLabel
+        %300 = OpSLessThan %bool %294 %int_9
+               OpBranch %298
+        %298 = OpLabel
+        %301 = OpPhi %bool %297 %290 %300 %299
+        %296 = OpSelect %int %301 %295 %int_0
+        %302 = OpLoad %mat3v3float %GLF_live7m33
+        %303 = OpTranspose %mat3v3float %302
+        %304 = OpLoad %int %GLF_live7c_1
+        %305 = OpSLessThan %bool %304 %int_3
+               OpSelectionMerge %306 None
+               OpBranchConditional %305 %307 %308
+        %307 = OpLabel
+               OpStore %x_180 %int_1
+               OpBranch %306
+        %308 = OpLabel
+        %309 = OpAccessChain %_ptr_Uniform_float %x_25 %uint_0 %uint_0
+        %310 = OpLoad %float %309
+        %311 = OpConvertFToS %int %310
+               OpStore %x_180 %311
+               OpBranch %306
+        %306 = OpLabel
+        %312 = OpLoad %int %x_180
+        %313 = OpLoad %int %GLF_live7r_1
+               OpStore %indexable %303
+        %315 = OpSLessThan %bool %313 %int_3
+        %314 = OpSelect %int %315 %int_1 %int_0
+        %316 = OpAccessChain %_ptr_Function_float %indexable %312 %314
+        %317 = OpLoad %float %316
+        %318 = OpAccessChain %_ptr_Function_float %GLF_live7sums %296
+        %319 = OpLoad %float %318
+        %320 = OpAccessChain %_ptr_Function_float %GLF_live7sums %296
+        %321 = OpFAdd %float %319 %317
+               OpStore %320 %321
+        %322 = OpLoad %int %GLF_live7sum_index
+        %323 = OpLoad %int %GLF_live7sum_index
+        %324 = OpLoad %int %GLF_live7sum_index
+        %326 = OpSGreaterThanEqual %bool %322 %int_0
+               OpSelectionMerge %327 None
+               OpBranchConditional %326 %328 %327
+        %328 = OpLabel
+        %329 = OpSLessThan %bool %323 %int_9
+               OpBranch %327
+        %327 = OpLabel
+        %330 = OpPhi %bool %326 %306 %329 %328
+        %325 = OpSelect %int %330 %324 %int_0
+        %331 = OpLoad %int %GLF_live7r_1
+        %332 = OpAccessChain %_ptr_Function_float %GLF_live7m42 %int_1 %331
+        %333 = OpLoad %float %332
+        %334 = OpAccessChain %_ptr_Function_float %GLF_live7sums %325
+        %335 = OpLoad %float %334
+        %336 = OpAccessChain %_ptr_Function_float %GLF_live7sums %325
+        %337 = OpFAdd %float %335 %333
+               OpStore %336 %337
+               OpBranch %285
+        %285 = OpLabel
+        %338 = OpLoad %int %GLF_live7r_1
+        %339 = OpIAdd %int %338 %int_1
+               OpStore %GLF_live7r_1 %339
+               OpBranch %283
+        %284 = OpLabel
+               OpBranch %276
+        %276 = OpLabel
+        %340 = OpLoad %int %GLF_live7c_1
+        %341 = OpIAdd %int %340 %int_1
+               OpStore %GLF_live7c_1 %341
+               OpBranch %274
+        %275 = OpLabel
+        %342 = OpLoad %int %GLF_live7sum_index
+        %343 = OpIAdd %int %342 %int_1
+               OpStore %GLF_live7sum_index %343
+               OpBranch %250
+        %250 = OpLabel
+        %344 = OpLoad %int %GLF_live7cols_1
+        %345 = OpIAdd %int %344 %int_1
+               OpStore %GLF_live7cols_1 %345
+               OpBranch %248
+        %249 = OpLabel
+               OpBranch %108
+        %108 = OpLabel
+        %346 = OpLoad %int %GLF_live4i
+        %347 = OpIAdd %int %346 %int_1
+               OpStore %GLF_live4i %347
+               OpBranch %106
+        %107 = OpLabel
+               OpReturnValue %74
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %348
+        %351 = OpLabel
+   %position = OpVariable %_ptr_Function_v2float Function %353
+      %param = OpVariable %_ptr_Function_v2float Function %353
+    %param_1 = OpVariable %_ptr_Function_v2float Function %353
+          %i = OpVariable %_ptr_Function_int Function %32
+    %param_2 = OpVariable %_ptr_Function_v2float Function %353
+        %358 = OpAccessChain %_ptr_Uniform_float %x_25 %uint_0 %uint_0
+        %359 = OpLoad %float %358
+        %361 = OpFOrdGreaterThanEqual %bool %359 %float_2
+               OpSelectionMerge %362 None
+               OpBranchConditional %361 %363 %362
+        %363 = OpLabel
+        %364 = OpLoad %v4float %gl_FragCoord
+        %365 = OpCompositeExtract %float %364 0
+        %366 = OpCompositeExtract %float %364 1
+        %367 = OpCompositeConstruct %v2float %365 %366
+               OpStore %position %367
+        %368 = OpLoad %v2float %position
+               OpStore %param %368
+        %369 = OpFunctionCall %v3float %drawShape_vf2_ %param
+        %371 = OpLoad %v2float %position
+               OpStore %param_1 %371
+        %372 = OpFunctionCall %v3float %drawShape_vf2_ %param_1
+               OpStore %i %int_25
+               OpBranch %375
+        %375 = OpLabel
+               OpLoopMerge %376 %377 None
+               OpBranch %378
+        %378 = OpLabel
+        %379 = OpLoad %int %i
+        %380 = OpSGreaterThan %bool %379 %int_0
+               OpSelectionMerge %381 None
+               OpBranchConditional %380 %382 %383
+        %382 = OpLabel
+               OpBranch %381
+        %383 = OpLabel
+               OpBranch %376
+        %381 = OpLabel
+        %384 = OpLoad %v2float %position
+               OpStore %param_2 %384
+        %385 = OpFunctionCall %v3float %drawShape_vf2_ %param_2
+               OpBranch %377
+        %377 = OpLabel
+        %387 = OpLoad %int %i
+        %388 = OpISub %int %387 %int_1
+               OpStore %i %388
+               OpBranch %375
+        %376 = OpLabel
+               OpBranch %362
+        %362 = OpLabel
+               OpStore %x_GLF_color %389
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %390
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %394 = OpLabel
+        %395 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %395
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %348
+        %397 = OpLabel
+        %398 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %398
+        %399 = OpFunctionCall %void %main_1
+        %401 = OpLoad %v4float %x_GLF_color
+        %402 = OpCompositeConstruct %main_out %401
+        %400 = OpFunctionCall %void %tint_symbol_3 %402
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..9ca6d37
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,317 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_25 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn drawShape_vf2_(pos : ptr<function, vec2<f32>>) -> vec3<f32> {
+  var c2 : bool;
+  var c3 : bool;
+  var c4 : bool;
+  var c5 : bool;
+  var c6 : bool;
+  var GLF_live4i : i32;
+  var GLF_live4_looplimiter5 : i32;
+  var GLF_live7m42 : mat4x2<f32>;
+  var GLF_live7m33 : mat3x3<f32>;
+  var GLF_live7cols : i32;
+  var GLF_live7_looplimiter3 : i32;
+  var GLF_live7rows : i32;
+  var GLF_live7_looplimiter2 : i32;
+  var GLF_live7_looplimiter1 : i32;
+  var GLF_live7c : i32;
+  var GLF_live7r : i32;
+  var GLF_live7_looplimiter0 : i32;
+  var GLF_live7sum_index : i32;
+  var GLF_live7_looplimiter7 : i32;
+  var GLF_live7cols_1 : i32;
+  var GLF_live7rows_1 : i32;
+  var GLF_live7sums : array<f32, 9>;
+  var GLF_live7c_1 : i32;
+  var GLF_live7r_1 : i32;
+  var x_180 : i32;
+  var indexable : mat3x3<f32>;
+  let x_182 : f32 = (*(pos)).x;
+  c2 = (x_182 > 1.0);
+  let x_184 : bool = c2;
+  if (x_184) {
+    return vec3<f32>(1.0, 1.0, 1.0);
+  }
+  let x_188 : f32 = (*(pos)).y;
+  c3 = (x_188 < 1.0);
+  let x_190 : bool = c3;
+  if (x_190) {
+    return vec3<f32>(1.0, 1.0, 1.0);
+  }
+  let x_194 : f32 = (*(pos)).y;
+  c4 = (x_194 > 1.0);
+  let x_196 : bool = c4;
+  if (x_196) {
+    return vec3<f32>(1.0, 1.0, 1.0);
+  }
+  let x_200 : f32 = (*(pos)).x;
+  c5 = (x_200 < 1.0);
+  let x_202 : bool = c5;
+  if (x_202) {
+    return vec3<f32>(1.0, 1.0, 1.0);
+  }
+  let x_206 : f32 = (*(pos)).x;
+  c6 = ((x_206 + 1.0) > 1.0);
+  let x_209 : bool = c6;
+  if (x_209) {
+    return vec3<f32>(1.0, 1.0, 1.0);
+  }
+  GLF_live4i = 0;
+  loop {
+    let x_39 : i32 = GLF_live4i;
+    if ((x_39 < 4)) {
+    } else {
+      break;
+    }
+    let x_40 : i32 = GLF_live4_looplimiter5;
+    if ((x_40 >= 7)) {
+      break;
+    }
+    let x_41 : i32 = GLF_live4_looplimiter5;
+    GLF_live4_looplimiter5 = (x_41 + 1);
+    GLF_live7m42 = mat4x2<f32>(vec2<f32>(1.0, 0.0), vec2<f32>(0.0, 1.0), vec2<f32>(0.0, 0.0), vec2<f32>(1.0, 0.0));
+    GLF_live7m33 = mat3x3<f32>(vec3<f32>(1.0, 0.0, 0.0), vec3<f32>(0.0, 1.0, 0.0), vec3<f32>(0.0, 0.0, 1.0));
+    GLF_live7cols = 2;
+    loop {
+      let x_43 : i32 = GLF_live7cols;
+      if ((x_43 < 4)) {
+      } else {
+        break;
+      }
+      let x_44 : i32 = GLF_live7_looplimiter3;
+      if ((x_44 >= 7)) {
+        break;
+      }
+      let x_45 : i32 = GLF_live7_looplimiter3;
+      GLF_live7_looplimiter3 = (x_45 + 1);
+      GLF_live7rows = 2;
+      loop {
+        let x_47 : i32 = GLF_live7rows;
+        if ((x_47 < 4)) {
+        } else {
+          break;
+        }
+        let x_48 : i32 = GLF_live7_looplimiter2;
+        if ((x_48 >= 7)) {
+          break;
+        }
+        let x_49 : i32 = GLF_live7_looplimiter2;
+        GLF_live7_looplimiter2 = (x_49 + 1);
+        GLF_live7_looplimiter1 = 0;
+        GLF_live7c = 0;
+        loop {
+          let x_51 : i32 = GLF_live7c;
+          if ((x_51 < 3)) {
+          } else {
+            break;
+          }
+          let x_52 : i32 = GLF_live7_looplimiter1;
+          if ((x_52 >= 7)) {
+            break;
+          }
+          let x_53 : i32 = GLF_live7_looplimiter1;
+          GLF_live7_looplimiter1 = (x_53 + 1);
+          GLF_live7r = 0;
+          loop {
+            let x_55 : i32 = GLF_live7r;
+            if ((x_55 < 2)) {
+            } else {
+              break;
+            }
+            let x_56 : i32 = GLF_live7_looplimiter0;
+            if ((x_56 >= 7)) {
+              break;
+            }
+            let x_57 : i32 = GLF_live7_looplimiter0;
+            GLF_live7_looplimiter0 = (x_57 + 1);
+            let x_59 : i32 = GLF_live7c;
+            let x_60 : i32 = GLF_live7c;
+            let x_61 : i32 = GLF_live7c;
+            let x_62 : i32 = GLF_live7r;
+            let x_63 : i32 = GLF_live7r;
+            let x_64 : i32 = GLF_live7r;
+            GLF_live7m33[select(0, x_61, ((x_59 >= 0) && (x_60 < 3)))][select(0, x_64, ((x_62 >= 0) && (x_63 < 3)))] = 1.0;
+            let x_267 : f32 = x_25.injectionSwitch.y;
+            if ((0.0 > x_267)) {
+            } else {
+              let x_65 : i32 = GLF_live7c;
+              let x_66 : i32 = GLF_live7c;
+              let x_67 : i32 = GLF_live7c;
+              let x_68 : i32 = GLF_live7r;
+              let x_69 : i32 = GLF_live7r;
+              let x_70 : i32 = GLF_live7r;
+              GLF_live7m42[select(0, x_67, ((x_65 >= 0) && (x_66 < 4)))][select(0, x_70, ((x_68 >= 0) && (x_69 < 2)))] = 1.0;
+            }
+
+            continuing {
+              let x_71 : i32 = GLF_live7r;
+              GLF_live7r = (x_71 + 1);
+            }
+          }
+
+          continuing {
+            let x_73 : i32 = GLF_live7c;
+            GLF_live7c = (x_73 + 1);
+          }
+        }
+
+        continuing {
+          let x_75 : i32 = GLF_live7rows;
+          GLF_live7rows = (x_75 + 1);
+        }
+      }
+
+      continuing {
+        let x_77 : i32 = GLF_live7cols;
+        GLF_live7cols = (x_77 + 1);
+      }
+    }
+    GLF_live7sum_index = 0;
+    GLF_live7_looplimiter7 = 0;
+    GLF_live7cols_1 = 2;
+    loop {
+      let x_79 : i32 = GLF_live7cols_1;
+      if ((x_79 < 4)) {
+      } else {
+        break;
+      }
+      let x_80 : i32 = GLF_live7_looplimiter7;
+      if ((x_80 >= 7)) {
+        break;
+      }
+      let x_81 : i32 = GLF_live7_looplimiter7;
+      GLF_live7_looplimiter7 = (x_81 + 1);
+      GLF_live7rows_1 = 2;
+      let x_83 : i32 = GLF_live7sum_index;
+      let x_84 : i32 = GLF_live7sum_index;
+      let x_85 : i32 = GLF_live7sum_index;
+      GLF_live7sums[select(0, x_85, ((x_83 >= 0) && (x_84 < 9)))] = 0.0;
+      GLF_live7c_1 = 0;
+      loop {
+        let x_86 : i32 = GLF_live7c_1;
+        if ((x_86 < 1)) {
+        } else {
+          break;
+        }
+        GLF_live7r_1 = 0;
+        loop {
+          let x_87 : i32 = GLF_live7r_1;
+          let x_88 : i32 = GLF_live7rows_1;
+          if ((x_87 < x_88)) {
+          } else {
+            break;
+          }
+          let x_89 : i32 = GLF_live7sum_index;
+          let x_90 : i32 = GLF_live7sum_index;
+          let x_91 : i32 = GLF_live7sum_index;
+          let x_310 : i32 = select(0, x_91, ((x_89 >= 0) && (x_90 < 9)));
+          let x_311 : mat3x3<f32> = GLF_live7m33;
+          let x_312 : mat3x3<f32> = transpose(x_311);
+          let x_92 : i32 = GLF_live7c_1;
+          if ((x_92 < 3)) {
+            x_180 = 1;
+          } else {
+            let x_318 : f32 = x_25.injectionSwitch.x;
+            x_180 = i32(x_318);
+          }
+          let x_320 : i32 = x_180;
+          let x_93 : i32 = GLF_live7r_1;
+          indexable = x_312;
+          let x_324 : f32 = indexable[x_320][select(0, 1, (x_93 < 3))];
+          let x_326 : f32 = GLF_live7sums[x_310];
+          GLF_live7sums[x_310] = (x_326 + x_324);
+          let x_94 : i32 = GLF_live7sum_index;
+          let x_95 : i32 = GLF_live7sum_index;
+          let x_96 : i32 = GLF_live7sum_index;
+          let x_332 : i32 = select(0, x_96, ((x_94 >= 0) && (x_95 < 9)));
+          let x_97 : i32 = GLF_live7r_1;
+          let x_334 : f32 = GLF_live7m42[1][x_97];
+          let x_336 : f32 = GLF_live7sums[x_332];
+          GLF_live7sums[x_332] = (x_336 + x_334);
+
+          continuing {
+            let x_98 : i32 = GLF_live7r_1;
+            GLF_live7r_1 = (x_98 + 1);
+          }
+        }
+
+        continuing {
+          let x_100 : i32 = GLF_live7c_1;
+          GLF_live7c_1 = (x_100 + 1);
+        }
+      }
+      let x_102 : i32 = GLF_live7sum_index;
+      GLF_live7sum_index = (x_102 + 1);
+
+      continuing {
+        let x_104 : i32 = GLF_live7cols_1;
+        GLF_live7cols_1 = (x_104 + 1);
+      }
+    }
+
+    continuing {
+      let x_106 : i32 = GLF_live4i;
+      GLF_live4i = (x_106 + 1);
+    }
+  }
+  return vec3<f32>(1.0, 1.0, 1.0);
+}
+
+fn main_1() {
+  var position : vec2<f32>;
+  var param : vec2<f32>;
+  var param_1 : vec2<f32>;
+  var i : i32;
+  var param_2 : vec2<f32>;
+  let x_161 : f32 = x_25.injectionSwitch.x;
+  if ((x_161 >= 2.0)) {
+    let x_165 : vec4<f32> = gl_FragCoord;
+    position = vec2<f32>(x_165.x, x_165.y);
+    let x_167 : vec2<f32> = position;
+    param = x_167;
+    let x_168 : vec3<f32> = drawShape_vf2_(&(param));
+    let x_169 : vec2<f32> = position;
+    param_1 = x_169;
+    let x_170 : vec3<f32> = drawShape_vf2_(&(param_1));
+    i = 25;
+    loop {
+      let x_108 : i32 = i;
+      if ((x_108 > 0)) {
+      } else {
+        break;
+      }
+      let x_177 : vec2<f32> = position;
+      param_2 = x_177;
+      let x_178 : vec3<f32> = drawShape_vf2_(&(param_2));
+
+      continuing {
+        let x_109 : i32 = i;
+        i = (x_109 - 1);
+      }
+    }
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.wgsl
new file mode 100644
index 0000000..9ca6d37
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.wgsl
@@ -0,0 +1,317 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_25 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn drawShape_vf2_(pos : ptr<function, vec2<f32>>) -> vec3<f32> {
+  var c2 : bool;
+  var c3 : bool;
+  var c4 : bool;
+  var c5 : bool;
+  var c6 : bool;
+  var GLF_live4i : i32;
+  var GLF_live4_looplimiter5 : i32;
+  var GLF_live7m42 : mat4x2<f32>;
+  var GLF_live7m33 : mat3x3<f32>;
+  var GLF_live7cols : i32;
+  var GLF_live7_looplimiter3 : i32;
+  var GLF_live7rows : i32;
+  var GLF_live7_looplimiter2 : i32;
+  var GLF_live7_looplimiter1 : i32;
+  var GLF_live7c : i32;
+  var GLF_live7r : i32;
+  var GLF_live7_looplimiter0 : i32;
+  var GLF_live7sum_index : i32;
+  var GLF_live7_looplimiter7 : i32;
+  var GLF_live7cols_1 : i32;
+  var GLF_live7rows_1 : i32;
+  var GLF_live7sums : array<f32, 9>;
+  var GLF_live7c_1 : i32;
+  var GLF_live7r_1 : i32;
+  var x_180 : i32;
+  var indexable : mat3x3<f32>;
+  let x_182 : f32 = (*(pos)).x;
+  c2 = (x_182 > 1.0);
+  let x_184 : bool = c2;
+  if (x_184) {
+    return vec3<f32>(1.0, 1.0, 1.0);
+  }
+  let x_188 : f32 = (*(pos)).y;
+  c3 = (x_188 < 1.0);
+  let x_190 : bool = c3;
+  if (x_190) {
+    return vec3<f32>(1.0, 1.0, 1.0);
+  }
+  let x_194 : f32 = (*(pos)).y;
+  c4 = (x_194 > 1.0);
+  let x_196 : bool = c4;
+  if (x_196) {
+    return vec3<f32>(1.0, 1.0, 1.0);
+  }
+  let x_200 : f32 = (*(pos)).x;
+  c5 = (x_200 < 1.0);
+  let x_202 : bool = c5;
+  if (x_202) {
+    return vec3<f32>(1.0, 1.0, 1.0);
+  }
+  let x_206 : f32 = (*(pos)).x;
+  c6 = ((x_206 + 1.0) > 1.0);
+  let x_209 : bool = c6;
+  if (x_209) {
+    return vec3<f32>(1.0, 1.0, 1.0);
+  }
+  GLF_live4i = 0;
+  loop {
+    let x_39 : i32 = GLF_live4i;
+    if ((x_39 < 4)) {
+    } else {
+      break;
+    }
+    let x_40 : i32 = GLF_live4_looplimiter5;
+    if ((x_40 >= 7)) {
+      break;
+    }
+    let x_41 : i32 = GLF_live4_looplimiter5;
+    GLF_live4_looplimiter5 = (x_41 + 1);
+    GLF_live7m42 = mat4x2<f32>(vec2<f32>(1.0, 0.0), vec2<f32>(0.0, 1.0), vec2<f32>(0.0, 0.0), vec2<f32>(1.0, 0.0));
+    GLF_live7m33 = mat3x3<f32>(vec3<f32>(1.0, 0.0, 0.0), vec3<f32>(0.0, 1.0, 0.0), vec3<f32>(0.0, 0.0, 1.0));
+    GLF_live7cols = 2;
+    loop {
+      let x_43 : i32 = GLF_live7cols;
+      if ((x_43 < 4)) {
+      } else {
+        break;
+      }
+      let x_44 : i32 = GLF_live7_looplimiter3;
+      if ((x_44 >= 7)) {
+        break;
+      }
+      let x_45 : i32 = GLF_live7_looplimiter3;
+      GLF_live7_looplimiter3 = (x_45 + 1);
+      GLF_live7rows = 2;
+      loop {
+        let x_47 : i32 = GLF_live7rows;
+        if ((x_47 < 4)) {
+        } else {
+          break;
+        }
+        let x_48 : i32 = GLF_live7_looplimiter2;
+        if ((x_48 >= 7)) {
+          break;
+        }
+        let x_49 : i32 = GLF_live7_looplimiter2;
+        GLF_live7_looplimiter2 = (x_49 + 1);
+        GLF_live7_looplimiter1 = 0;
+        GLF_live7c = 0;
+        loop {
+          let x_51 : i32 = GLF_live7c;
+          if ((x_51 < 3)) {
+          } else {
+            break;
+          }
+          let x_52 : i32 = GLF_live7_looplimiter1;
+          if ((x_52 >= 7)) {
+            break;
+          }
+          let x_53 : i32 = GLF_live7_looplimiter1;
+          GLF_live7_looplimiter1 = (x_53 + 1);
+          GLF_live7r = 0;
+          loop {
+            let x_55 : i32 = GLF_live7r;
+            if ((x_55 < 2)) {
+            } else {
+              break;
+            }
+            let x_56 : i32 = GLF_live7_looplimiter0;
+            if ((x_56 >= 7)) {
+              break;
+            }
+            let x_57 : i32 = GLF_live7_looplimiter0;
+            GLF_live7_looplimiter0 = (x_57 + 1);
+            let x_59 : i32 = GLF_live7c;
+            let x_60 : i32 = GLF_live7c;
+            let x_61 : i32 = GLF_live7c;
+            let x_62 : i32 = GLF_live7r;
+            let x_63 : i32 = GLF_live7r;
+            let x_64 : i32 = GLF_live7r;
+            GLF_live7m33[select(0, x_61, ((x_59 >= 0) && (x_60 < 3)))][select(0, x_64, ((x_62 >= 0) && (x_63 < 3)))] = 1.0;
+            let x_267 : f32 = x_25.injectionSwitch.y;
+            if ((0.0 > x_267)) {
+            } else {
+              let x_65 : i32 = GLF_live7c;
+              let x_66 : i32 = GLF_live7c;
+              let x_67 : i32 = GLF_live7c;
+              let x_68 : i32 = GLF_live7r;
+              let x_69 : i32 = GLF_live7r;
+              let x_70 : i32 = GLF_live7r;
+              GLF_live7m42[select(0, x_67, ((x_65 >= 0) && (x_66 < 4)))][select(0, x_70, ((x_68 >= 0) && (x_69 < 2)))] = 1.0;
+            }
+
+            continuing {
+              let x_71 : i32 = GLF_live7r;
+              GLF_live7r = (x_71 + 1);
+            }
+          }
+
+          continuing {
+            let x_73 : i32 = GLF_live7c;
+            GLF_live7c = (x_73 + 1);
+          }
+        }
+
+        continuing {
+          let x_75 : i32 = GLF_live7rows;
+          GLF_live7rows = (x_75 + 1);
+        }
+      }
+
+      continuing {
+        let x_77 : i32 = GLF_live7cols;
+        GLF_live7cols = (x_77 + 1);
+      }
+    }
+    GLF_live7sum_index = 0;
+    GLF_live7_looplimiter7 = 0;
+    GLF_live7cols_1 = 2;
+    loop {
+      let x_79 : i32 = GLF_live7cols_1;
+      if ((x_79 < 4)) {
+      } else {
+        break;
+      }
+      let x_80 : i32 = GLF_live7_looplimiter7;
+      if ((x_80 >= 7)) {
+        break;
+      }
+      let x_81 : i32 = GLF_live7_looplimiter7;
+      GLF_live7_looplimiter7 = (x_81 + 1);
+      GLF_live7rows_1 = 2;
+      let x_83 : i32 = GLF_live7sum_index;
+      let x_84 : i32 = GLF_live7sum_index;
+      let x_85 : i32 = GLF_live7sum_index;
+      GLF_live7sums[select(0, x_85, ((x_83 >= 0) && (x_84 < 9)))] = 0.0;
+      GLF_live7c_1 = 0;
+      loop {
+        let x_86 : i32 = GLF_live7c_1;
+        if ((x_86 < 1)) {
+        } else {
+          break;
+        }
+        GLF_live7r_1 = 0;
+        loop {
+          let x_87 : i32 = GLF_live7r_1;
+          let x_88 : i32 = GLF_live7rows_1;
+          if ((x_87 < x_88)) {
+          } else {
+            break;
+          }
+          let x_89 : i32 = GLF_live7sum_index;
+          let x_90 : i32 = GLF_live7sum_index;
+          let x_91 : i32 = GLF_live7sum_index;
+          let x_310 : i32 = select(0, x_91, ((x_89 >= 0) && (x_90 < 9)));
+          let x_311 : mat3x3<f32> = GLF_live7m33;
+          let x_312 : mat3x3<f32> = transpose(x_311);
+          let x_92 : i32 = GLF_live7c_1;
+          if ((x_92 < 3)) {
+            x_180 = 1;
+          } else {
+            let x_318 : f32 = x_25.injectionSwitch.x;
+            x_180 = i32(x_318);
+          }
+          let x_320 : i32 = x_180;
+          let x_93 : i32 = GLF_live7r_1;
+          indexable = x_312;
+          let x_324 : f32 = indexable[x_320][select(0, 1, (x_93 < 3))];
+          let x_326 : f32 = GLF_live7sums[x_310];
+          GLF_live7sums[x_310] = (x_326 + x_324);
+          let x_94 : i32 = GLF_live7sum_index;
+          let x_95 : i32 = GLF_live7sum_index;
+          let x_96 : i32 = GLF_live7sum_index;
+          let x_332 : i32 = select(0, x_96, ((x_94 >= 0) && (x_95 < 9)));
+          let x_97 : i32 = GLF_live7r_1;
+          let x_334 : f32 = GLF_live7m42[1][x_97];
+          let x_336 : f32 = GLF_live7sums[x_332];
+          GLF_live7sums[x_332] = (x_336 + x_334);
+
+          continuing {
+            let x_98 : i32 = GLF_live7r_1;
+            GLF_live7r_1 = (x_98 + 1);
+          }
+        }
+
+        continuing {
+          let x_100 : i32 = GLF_live7c_1;
+          GLF_live7c_1 = (x_100 + 1);
+        }
+      }
+      let x_102 : i32 = GLF_live7sum_index;
+      GLF_live7sum_index = (x_102 + 1);
+
+      continuing {
+        let x_104 : i32 = GLF_live7cols_1;
+        GLF_live7cols_1 = (x_104 + 1);
+      }
+    }
+
+    continuing {
+      let x_106 : i32 = GLF_live4i;
+      GLF_live4i = (x_106 + 1);
+    }
+  }
+  return vec3<f32>(1.0, 1.0, 1.0);
+}
+
+fn main_1() {
+  var position : vec2<f32>;
+  var param : vec2<f32>;
+  var param_1 : vec2<f32>;
+  var i : i32;
+  var param_2 : vec2<f32>;
+  let x_161 : f32 = x_25.injectionSwitch.x;
+  if ((x_161 >= 2.0)) {
+    let x_165 : vec4<f32> = gl_FragCoord;
+    position = vec2<f32>(x_165.x, x_165.y);
+    let x_167 : vec2<f32> = position;
+    param = x_167;
+    let x_168 : vec3<f32> = drawShape_vf2_(&(param));
+    let x_169 : vec2<f32> = position;
+    param_1 = x_169;
+    let x_170 : vec3<f32> = drawShape_vf2_(&(param_1));
+    i = 25;
+    loop {
+      let x_108 : i32 = i;
+      if ((x_108 > 0)) {
+      } else {
+        break;
+      }
+      let x_177 : vec2<f32> = position;
+      param_2 = x_177;
+      let x_178 : vec3<f32> = drawShape_vf2_(&(param_2));
+
+      continuing {
+        let x_109 : i32 = i;
+        i = (x_109 - 1);
+      }
+    }
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..1907070
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,237 @@
+void set_float3(inout float3 vec, int idx, float val) {
+  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
+}
+
+void set_float2(inout float2 vec, int idx, float val) {
+  vec = (idx.xx == int2(0, 1)) ? val.xx : vec;
+}
+
+cbuffer cbuffer_x_25 : register(b0, space0) {
+  uint4 x_25[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float3 drawShape_vf2_(inout float2 pos) {
+  bool c2 = false;
+  bool c3 = false;
+  bool c4 = false;
+  bool c5 = false;
+  bool c6 = false;
+  int GLF_live4i = 0;
+  int GLF_live4_looplimiter5 = 0;
+  float4x2 GLF_live7m42 = float4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  float3x3 GLF_live7m33 = float3x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  int GLF_live7cols = 0;
+  int GLF_live7_looplimiter3 = 0;
+  int GLF_live7rows = 0;
+  int GLF_live7_looplimiter2 = 0;
+  int GLF_live7_looplimiter1 = 0;
+  int GLF_live7c = 0;
+  int GLF_live7r = 0;
+  int GLF_live7_looplimiter0 = 0;
+  int GLF_live7sum_index = 0;
+  int GLF_live7_looplimiter7 = 0;
+  int GLF_live7cols_1 = 0;
+  int GLF_live7rows_1 = 0;
+  float GLF_live7sums[9] = (float[9])0;
+  int GLF_live7c_1 = 0;
+  int GLF_live7r_1 = 0;
+  int x_180 = 0;
+  float3x3 indexable = float3x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  const float x_182 = pos.x;
+  c2 = (x_182 > 1.0f);
+  if (c2) {
+    return float3(1.0f, 1.0f, 1.0f);
+  }
+  const float x_188 = pos.y;
+  c3 = (x_188 < 1.0f);
+  if (c3) {
+    return float3(1.0f, 1.0f, 1.0f);
+  }
+  const float x_194 = pos.y;
+  c4 = (x_194 > 1.0f);
+  if (c4) {
+    return float3(1.0f, 1.0f, 1.0f);
+  }
+  const float x_200 = pos.x;
+  c5 = (x_200 < 1.0f);
+  if (c5) {
+    return float3(1.0f, 1.0f, 1.0f);
+  }
+  const float x_206 = pos.x;
+  c6 = ((x_206 + 1.0f) > 1.0f);
+  if (c6) {
+    return float3(1.0f, 1.0f, 1.0f);
+  }
+  GLF_live4i = 0;
+  {
+    for(; (GLF_live4i < 4); GLF_live4i = (GLF_live4i + 1)) {
+      if ((GLF_live4_looplimiter5 >= 7)) {
+        break;
+      }
+      GLF_live4_looplimiter5 = (GLF_live4_looplimiter5 + 1);
+      GLF_live7m42 = float4x2(float2(1.0f, 0.0f), float2(0.0f, 1.0f), float2(0.0f, 0.0f), float2(1.0f, 0.0f));
+      GLF_live7m33 = float3x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f));
+      GLF_live7cols = 2;
+      {
+        for(; (GLF_live7cols < 4); GLF_live7cols = (GLF_live7cols + 1)) {
+          if ((GLF_live7_looplimiter3 >= 7)) {
+            break;
+          }
+          GLF_live7_looplimiter3 = (GLF_live7_looplimiter3 + 1);
+          GLF_live7rows = 2;
+          {
+            for(; (GLF_live7rows < 4); GLF_live7rows = (GLF_live7rows + 1)) {
+              if ((GLF_live7_looplimiter2 >= 7)) {
+                break;
+              }
+              GLF_live7_looplimiter2 = (GLF_live7_looplimiter2 + 1);
+              GLF_live7_looplimiter1 = 0;
+              GLF_live7c = 0;
+              {
+                for(; (GLF_live7c < 3); GLF_live7c = (GLF_live7c + 1)) {
+                  if ((GLF_live7_looplimiter1 >= 7)) {
+                    break;
+                  }
+                  GLF_live7_looplimiter1 = (GLF_live7_looplimiter1 + 1);
+                  GLF_live7r = 0;
+                  {
+                    for(; (GLF_live7r < 2); GLF_live7r = (GLF_live7r + 1)) {
+                      if ((GLF_live7_looplimiter0 >= 7)) {
+                        break;
+                      }
+                      GLF_live7_looplimiter0 = (GLF_live7_looplimiter0 + 1);
+                      bool tint_tmp = (GLF_live7c >= 0);
+                      if (tint_tmp) {
+                        tint_tmp = (GLF_live7c < 3);
+                      }
+                      bool tint_tmp_1 = (GLF_live7r >= 0);
+                      if (tint_tmp_1) {
+                        tint_tmp_1 = (GLF_live7r < 3);
+                      }
+                      set_float3(GLF_live7m33[((tint_tmp) ? GLF_live7c : 0)], ((tint_tmp_1) ? GLF_live7r : 0), 1.0f);
+                      const float x_267 = asfloat(x_25[0].y);
+                      if ((0.0f > x_267)) {
+                      } else {
+                        bool tint_tmp_2 = (GLF_live7c >= 0);
+                        if (tint_tmp_2) {
+                          tint_tmp_2 = (GLF_live7c < 4);
+                        }
+                        bool tint_tmp_3 = (GLF_live7r >= 0);
+                        if (tint_tmp_3) {
+                          tint_tmp_3 = (GLF_live7r < 2);
+                        }
+                        set_float2(GLF_live7m42[((tint_tmp_2) ? GLF_live7c : 0)], ((tint_tmp_3) ? GLF_live7r : 0), 1.0f);
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+      GLF_live7sum_index = 0;
+      GLF_live7_looplimiter7 = 0;
+      GLF_live7cols_1 = 2;
+      {
+        for(; (GLF_live7cols_1 < 4); GLF_live7cols_1 = (GLF_live7cols_1 + 1)) {
+          if ((GLF_live7_looplimiter7 >= 7)) {
+            break;
+          }
+          GLF_live7_looplimiter7 = (GLF_live7_looplimiter7 + 1);
+          GLF_live7rows_1 = 2;
+          bool tint_tmp_4 = (GLF_live7sum_index >= 0);
+          if (tint_tmp_4) {
+            tint_tmp_4 = (GLF_live7sum_index < 9);
+          }
+          GLF_live7sums[((tint_tmp_4) ? GLF_live7sum_index : 0)] = 0.0f;
+          GLF_live7c_1 = 0;
+          {
+            for(; (GLF_live7c_1 < 1); GLF_live7c_1 = (GLF_live7c_1 + 1)) {
+              GLF_live7r_1 = 0;
+              {
+                for(; (GLF_live7r_1 < GLF_live7rows_1); GLF_live7r_1 = (GLF_live7r_1 + 1)) {
+                  bool tint_tmp_5 = (GLF_live7sum_index >= 0);
+                  if (tint_tmp_5) {
+                    tint_tmp_5 = (GLF_live7sum_index < 9);
+                  }
+                  const int x_310 = ((tint_tmp_5) ? GLF_live7sum_index : 0);
+                  const float3x3 x_312 = transpose(GLF_live7m33);
+                  if ((GLF_live7c_1 < 3)) {
+                    x_180 = 1;
+                  } else {
+                    const float x_318 = asfloat(x_25[0].x);
+                    x_180 = int(x_318);
+                  }
+                  const int x_320 = x_180;
+                  const int x_93 = GLF_live7r_1;
+                  indexable = x_312;
+                  const float x_324 = indexable[x_320][((x_93 < 3) ? 1 : 0)];
+                  const float x_326 = GLF_live7sums[x_310];
+                  GLF_live7sums[x_310] = (x_326 + x_324);
+                  bool tint_tmp_6 = (GLF_live7sum_index >= 0);
+                  if (tint_tmp_6) {
+                    tint_tmp_6 = (GLF_live7sum_index < 9);
+                  }
+                  const int x_332 = ((tint_tmp_6) ? GLF_live7sum_index : 0);
+                  const float x_334 = GLF_live7m42[1][GLF_live7r_1];
+                  const float x_336 = GLF_live7sums[x_332];
+                  GLF_live7sums[x_332] = (x_336 + x_334);
+                }
+              }
+            }
+          }
+          GLF_live7sum_index = (GLF_live7sum_index + 1);
+        }
+      }
+    }
+  }
+  return float3(1.0f, 1.0f, 1.0f);
+}
+
+void main_1() {
+  float2 position = float2(0.0f, 0.0f);
+  float2 param = float2(0.0f, 0.0f);
+  float2 param_1 = float2(0.0f, 0.0f);
+  int i = 0;
+  float2 param_2 = float2(0.0f, 0.0f);
+  const float x_161 = asfloat(x_25[0].x);
+  if ((x_161 >= 2.0f)) {
+    const float4 x_165 = gl_FragCoord;
+    position = float2(x_165.x, x_165.y);
+    param = position;
+    const float3 x_168 = drawShape_vf2_(param);
+    param_1 = position;
+    const float3 x_170 = drawShape_vf2_(param_1);
+    i = 25;
+    {
+      for(; (i > 0); i = (i - 1)) {
+        param_2 = position;
+        const float3 x_178 = drawShape_vf2_(param_2);
+      }
+    }
+  }
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..9f3a7ed
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.wgsl.expected.msl
@@ -0,0 +1,312 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  float arr[9];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float3 drawShape_vf2_(constant buf0& x_25, thread float2* const pos) {
+  bool c2 = false;
+  bool c3 = false;
+  bool c4 = false;
+  bool c5 = false;
+  bool c6 = false;
+  int GLF_live4i = 0;
+  int GLF_live4_looplimiter5 = 0;
+  float4x2 GLF_live7m42 = float4x2(0.0f);
+  float3x3 GLF_live7m33 = float3x3(0.0f);
+  int GLF_live7cols = 0;
+  int GLF_live7_looplimiter3 = 0;
+  int GLF_live7rows = 0;
+  int GLF_live7_looplimiter2 = 0;
+  int GLF_live7_looplimiter1 = 0;
+  int GLF_live7c = 0;
+  int GLF_live7r = 0;
+  int GLF_live7_looplimiter0 = 0;
+  int GLF_live7sum_index = 0;
+  int GLF_live7_looplimiter7 = 0;
+  int GLF_live7cols_1 = 0;
+  int GLF_live7rows_1 = 0;
+  tint_array_wrapper GLF_live7sums = {};
+  int GLF_live7c_1 = 0;
+  int GLF_live7r_1 = 0;
+  int x_180 = 0;
+  float3x3 indexable = float3x3(0.0f);
+  float const x_182 = (*(pos)).x;
+  c2 = (x_182 > 1.0f);
+  bool const x_184 = c2;
+  if (x_184) {
+    return float3(1.0f, 1.0f, 1.0f);
+  }
+  float const x_188 = (*(pos)).y;
+  c3 = (x_188 < 1.0f);
+  bool const x_190 = c3;
+  if (x_190) {
+    return float3(1.0f, 1.0f, 1.0f);
+  }
+  float const x_194 = (*(pos)).y;
+  c4 = (x_194 > 1.0f);
+  bool const x_196 = c4;
+  if (x_196) {
+    return float3(1.0f, 1.0f, 1.0f);
+  }
+  float const x_200 = (*(pos)).x;
+  c5 = (x_200 < 1.0f);
+  bool const x_202 = c5;
+  if (x_202) {
+    return float3(1.0f, 1.0f, 1.0f);
+  }
+  float const x_206 = (*(pos)).x;
+  c6 = ((x_206 + 1.0f) > 1.0f);
+  bool const x_209 = c6;
+  if (x_209) {
+    return float3(1.0f, 1.0f, 1.0f);
+  }
+  GLF_live4i = 0;
+  while (true) {
+    int const x_39 = GLF_live4i;
+    if ((x_39 < 4)) {
+    } else {
+      break;
+    }
+    int const x_40 = GLF_live4_looplimiter5;
+    if ((x_40 >= 7)) {
+      break;
+    }
+    int const x_41 = GLF_live4_looplimiter5;
+    GLF_live4_looplimiter5 = (x_41 + 1);
+    GLF_live7m42 = float4x2(float2(1.0f, 0.0f), float2(0.0f, 1.0f), float2(0.0f, 0.0f), float2(1.0f, 0.0f));
+    GLF_live7m33 = float3x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f));
+    GLF_live7cols = 2;
+    while (true) {
+      int const x_43 = GLF_live7cols;
+      if ((x_43 < 4)) {
+      } else {
+        break;
+      }
+      int const x_44 = GLF_live7_looplimiter3;
+      if ((x_44 >= 7)) {
+        break;
+      }
+      int const x_45 = GLF_live7_looplimiter3;
+      GLF_live7_looplimiter3 = (x_45 + 1);
+      GLF_live7rows = 2;
+      while (true) {
+        int const x_47 = GLF_live7rows;
+        if ((x_47 < 4)) {
+        } else {
+          break;
+        }
+        int const x_48 = GLF_live7_looplimiter2;
+        if ((x_48 >= 7)) {
+          break;
+        }
+        int const x_49 = GLF_live7_looplimiter2;
+        GLF_live7_looplimiter2 = (x_49 + 1);
+        GLF_live7_looplimiter1 = 0;
+        GLF_live7c = 0;
+        while (true) {
+          int const x_51 = GLF_live7c;
+          if ((x_51 < 3)) {
+          } else {
+            break;
+          }
+          int const x_52 = GLF_live7_looplimiter1;
+          if ((x_52 >= 7)) {
+            break;
+          }
+          int const x_53 = GLF_live7_looplimiter1;
+          GLF_live7_looplimiter1 = (x_53 + 1);
+          GLF_live7r = 0;
+          while (true) {
+            int const x_55 = GLF_live7r;
+            if ((x_55 < 2)) {
+            } else {
+              break;
+            }
+            int const x_56 = GLF_live7_looplimiter0;
+            if ((x_56 >= 7)) {
+              break;
+            }
+            int const x_57 = GLF_live7_looplimiter0;
+            GLF_live7_looplimiter0 = (x_57 + 1);
+            int const x_59 = GLF_live7c;
+            int const x_60 = GLF_live7c;
+            int const x_61 = GLF_live7c;
+            int const x_62 = GLF_live7r;
+            int const x_63 = GLF_live7r;
+            int const x_64 = GLF_live7r;
+            GLF_live7m33[select(0, x_61, ((x_59 >= 0) && (x_60 < 3)))][select(0, x_64, ((x_62 >= 0) && (x_63 < 3)))] = 1.0f;
+            float const x_267 = x_25.injectionSwitch.y;
+            if ((0.0f > x_267)) {
+            } else {
+              int const x_65 = GLF_live7c;
+              int const x_66 = GLF_live7c;
+              int const x_67 = GLF_live7c;
+              int const x_68 = GLF_live7r;
+              int const x_69 = GLF_live7r;
+              int const x_70 = GLF_live7r;
+              GLF_live7m42[select(0, x_67, ((x_65 >= 0) && (x_66 < 4)))][select(0, x_70, ((x_68 >= 0) && (x_69 < 2)))] = 1.0f;
+            }
+            {
+              int const x_71 = GLF_live7r;
+              GLF_live7r = (x_71 + 1);
+            }
+          }
+          {
+            int const x_73 = GLF_live7c;
+            GLF_live7c = (x_73 + 1);
+          }
+        }
+        {
+          int const x_75 = GLF_live7rows;
+          GLF_live7rows = (x_75 + 1);
+        }
+      }
+      {
+        int const x_77 = GLF_live7cols;
+        GLF_live7cols = (x_77 + 1);
+      }
+    }
+    GLF_live7sum_index = 0;
+    GLF_live7_looplimiter7 = 0;
+    GLF_live7cols_1 = 2;
+    while (true) {
+      int const x_79 = GLF_live7cols_1;
+      if ((x_79 < 4)) {
+      } else {
+        break;
+      }
+      int const x_80 = GLF_live7_looplimiter7;
+      if ((x_80 >= 7)) {
+        break;
+      }
+      int const x_81 = GLF_live7_looplimiter7;
+      GLF_live7_looplimiter7 = (x_81 + 1);
+      GLF_live7rows_1 = 2;
+      int const x_83 = GLF_live7sum_index;
+      int const x_84 = GLF_live7sum_index;
+      int const x_85 = GLF_live7sum_index;
+      GLF_live7sums.arr[select(0, x_85, ((x_83 >= 0) && (x_84 < 9)))] = 0.0f;
+      GLF_live7c_1 = 0;
+      while (true) {
+        int const x_86 = GLF_live7c_1;
+        if ((x_86 < 1)) {
+        } else {
+          break;
+        }
+        GLF_live7r_1 = 0;
+        while (true) {
+          int const x_87 = GLF_live7r_1;
+          int const x_88 = GLF_live7rows_1;
+          if ((x_87 < x_88)) {
+          } else {
+            break;
+          }
+          int const x_89 = GLF_live7sum_index;
+          int const x_90 = GLF_live7sum_index;
+          int const x_91 = GLF_live7sum_index;
+          int const x_310 = select(0, x_91, ((x_89 >= 0) && (x_90 < 9)));
+          float3x3 const x_311 = GLF_live7m33;
+          float3x3 const x_312 = transpose(x_311);
+          int const x_92 = GLF_live7c_1;
+          if ((x_92 < 3)) {
+            x_180 = 1;
+          } else {
+            float const x_318 = x_25.injectionSwitch.x;
+            x_180 = int(x_318);
+          }
+          int const x_320 = x_180;
+          int const x_93 = GLF_live7r_1;
+          indexable = x_312;
+          float const x_324 = indexable[x_320][select(0, 1, (x_93 < 3))];
+          float const x_326 = GLF_live7sums.arr[x_310];
+          GLF_live7sums.arr[x_310] = (x_326 + x_324);
+          int const x_94 = GLF_live7sum_index;
+          int const x_95 = GLF_live7sum_index;
+          int const x_96 = GLF_live7sum_index;
+          int const x_332 = select(0, x_96, ((x_94 >= 0) && (x_95 < 9)));
+          int const x_97 = GLF_live7r_1;
+          float const x_334 = GLF_live7m42[1][x_97];
+          float const x_336 = GLF_live7sums.arr[x_332];
+          GLF_live7sums.arr[x_332] = (x_336 + x_334);
+          {
+            int const x_98 = GLF_live7r_1;
+            GLF_live7r_1 = (x_98 + 1);
+          }
+        }
+        {
+          int const x_100 = GLF_live7c_1;
+          GLF_live7c_1 = (x_100 + 1);
+        }
+      }
+      int const x_102 = GLF_live7sum_index;
+      GLF_live7sum_index = (x_102 + 1);
+      {
+        int const x_104 = GLF_live7cols_1;
+        GLF_live7cols_1 = (x_104 + 1);
+      }
+    }
+    {
+      int const x_106 = GLF_live4i;
+      GLF_live4i = (x_106 + 1);
+    }
+  }
+  return float3(1.0f, 1.0f, 1.0f);
+}
+
+void main_1(constant buf0& x_25, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float2 position = 0.0f;
+  float2 param = 0.0f;
+  float2 param_1 = 0.0f;
+  int i = 0;
+  float2 param_2 = 0.0f;
+  float const x_161 = x_25.injectionSwitch.x;
+  if ((x_161 >= 2.0f)) {
+    float4 const x_165 = *(tint_symbol_5);
+    position = float2(x_165.x, x_165.y);
+    float2 const x_167 = position;
+    param = x_167;
+    float3 const x_168 = drawShape_vf2_(x_25, &(param));
+    float2 const x_169 = position;
+    param_1 = x_169;
+    float3 const x_170 = drawShape_vf2_(x_25, &(param_1));
+    i = 25;
+    while (true) {
+      int const x_108 = i;
+      if ((x_108 > 0)) {
+      } else {
+        break;
+      }
+      float2 const x_177 = position;
+      param_2 = x_177;
+      float3 const x_178 = drawShape_vf2_(x_25, &(param_2));
+      {
+        int const x_109 = i;
+        i = (x_109 - 1);
+      }
+    }
+  }
+  *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_25 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_25, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..694e352
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,663 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 403
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_25 "x_25"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %drawShape_vf2_ "drawShape_vf2_"
+               OpName %pos "pos"
+               OpName %c2 "c2"
+               OpName %c3 "c3"
+               OpName %c4 "c4"
+               OpName %c5 "c5"
+               OpName %c6 "c6"
+               OpName %GLF_live4i "GLF_live4i"
+               OpName %GLF_live4_looplimiter5 "GLF_live4_looplimiter5"
+               OpName %GLF_live7m42 "GLF_live7m42"
+               OpName %GLF_live7m33 "GLF_live7m33"
+               OpName %GLF_live7cols "GLF_live7cols"
+               OpName %GLF_live7_looplimiter3 "GLF_live7_looplimiter3"
+               OpName %GLF_live7rows "GLF_live7rows"
+               OpName %GLF_live7_looplimiter2 "GLF_live7_looplimiter2"
+               OpName %GLF_live7_looplimiter1 "GLF_live7_looplimiter1"
+               OpName %GLF_live7c "GLF_live7c"
+               OpName %GLF_live7r "GLF_live7r"
+               OpName %GLF_live7_looplimiter0 "GLF_live7_looplimiter0"
+               OpName %GLF_live7sum_index "GLF_live7sum_index"
+               OpName %GLF_live7_looplimiter7 "GLF_live7_looplimiter7"
+               OpName %GLF_live7cols_1 "GLF_live7cols_1"
+               OpName %GLF_live7rows_1 "GLF_live7rows_1"
+               OpName %GLF_live7sums "GLF_live7sums"
+               OpName %GLF_live7c_1 "GLF_live7c_1"
+               OpName %GLF_live7r_1 "GLF_live7r_1"
+               OpName %x_180 "x_180"
+               OpName %indexable "indexable"
+               OpName %main_1 "main_1"
+               OpName %position "position"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %i "i"
+               OpName %param_2 "param_2"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_25 NonWritable
+               OpDecorate %x_25 DescriptorSet 0
+               OpDecorate %x_25 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_float_uint_9 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_25 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %15 = OpTypeFunction %v3float %_ptr_Function_v2float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %24 = OpConstantNull %bool
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %32 = OpConstantNull %int
+%mat4v2float = OpTypeMatrix %v2float 4
+%_ptr_Function_mat4v2float = OpTypePointer Function %mat4v2float
+         %37 = OpConstantNull %mat4v2float
+%mat3v3float = OpTypeMatrix %v3float 3
+%_ptr_Function_mat3v3float = OpTypePointer Function %mat3v3float
+         %41 = OpConstantNull %mat3v3float
+       %uint = OpTypeInt 32 0
+     %uint_9 = OpConstant %uint 9
+%_arr_float_uint_9 = OpTypeArray %float %uint_9
+%_ptr_Function__arr_float_uint_9 = OpTypePointer Function %_arr_float_uint_9
+         %59 = OpConstantNull %_arr_float_uint_9
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_1 = OpConstant %float 1
+         %74 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+     %uint_1 = OpConstant %uint 1
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+      %int_7 = OpConstant %int 7
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+        %125 = OpConstantComposite %v2float %float_1 %float_0
+        %126 = OpConstantComposite %v2float %float_0 %float_1
+        %127 = OpConstantComposite %v2float %float_0 %float_0
+        %128 = OpConstantComposite %mat4v2float %125 %126 %127 %125
+        %129 = OpConstantComposite %v3float %float_1 %float_0 %float_0
+        %130 = OpConstantComposite %v3float %float_0 %float_1 %float_0
+        %131 = OpConstantComposite %v3float %float_0 %float_0 %float_1
+        %132 = OpConstantComposite %mat3v3float %129 %130 %131
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_9 = OpConstant %int 9
+       %void = OpTypeVoid
+        %348 = OpTypeFunction %void
+        %353 = OpConstantNull %v2float
+    %float_2 = OpConstant %float 2
+     %int_25 = OpConstant %int 25
+        %389 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %390 = OpTypeFunction %void %main_out
+%drawShape_vf2_ = OpFunction %v3float None %15
+        %pos = OpFunctionParameter %_ptr_Function_v2float
+         %20 = OpLabel
+         %c2 = OpVariable %_ptr_Function_bool Function %24
+         %c3 = OpVariable %_ptr_Function_bool Function %24
+         %c4 = OpVariable %_ptr_Function_bool Function %24
+         %c5 = OpVariable %_ptr_Function_bool Function %24
+         %c6 = OpVariable %_ptr_Function_bool Function %24
+ %GLF_live4i = OpVariable %_ptr_Function_int Function %32
+%GLF_live4_looplimiter5 = OpVariable %_ptr_Function_int Function %32
+%GLF_live7m42 = OpVariable %_ptr_Function_mat4v2float Function %37
+%GLF_live7m33 = OpVariable %_ptr_Function_mat3v3float Function %41
+%GLF_live7cols = OpVariable %_ptr_Function_int Function %32
+%GLF_live7_looplimiter3 = OpVariable %_ptr_Function_int Function %32
+%GLF_live7rows = OpVariable %_ptr_Function_int Function %32
+%GLF_live7_looplimiter2 = OpVariable %_ptr_Function_int Function %32
+%GLF_live7_looplimiter1 = OpVariable %_ptr_Function_int Function %32
+ %GLF_live7c = OpVariable %_ptr_Function_int Function %32
+ %GLF_live7r = OpVariable %_ptr_Function_int Function %32
+%GLF_live7_looplimiter0 = OpVariable %_ptr_Function_int Function %32
+%GLF_live7sum_index = OpVariable %_ptr_Function_int Function %32
+%GLF_live7_looplimiter7 = OpVariable %_ptr_Function_int Function %32
+%GLF_live7cols_1 = OpVariable %_ptr_Function_int Function %32
+%GLF_live7rows_1 = OpVariable %_ptr_Function_int Function %32
+%GLF_live7sums = OpVariable %_ptr_Function__arr_float_uint_9 Function %59
+%GLF_live7c_1 = OpVariable %_ptr_Function_int Function %32
+%GLF_live7r_1 = OpVariable %_ptr_Function_int Function %32
+      %x_180 = OpVariable %_ptr_Function_int Function %32
+  %indexable = OpVariable %_ptr_Function_mat3v3float Function %41
+         %67 = OpAccessChain %_ptr_Function_float %pos %uint_0
+         %68 = OpLoad %float %67
+         %70 = OpFOrdGreaterThan %bool %68 %float_1
+               OpStore %c2 %70
+         %71 = OpLoad %bool %c2
+               OpSelectionMerge %72 None
+               OpBranchConditional %71 %73 %72
+         %73 = OpLabel
+               OpReturnValue %74
+         %72 = OpLabel
+         %77 = OpAccessChain %_ptr_Function_float %pos %uint_1
+         %78 = OpLoad %float %77
+         %79 = OpFOrdLessThan %bool %78 %float_1
+               OpStore %c3 %79
+         %80 = OpLoad %bool %c3
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %81
+         %82 = OpLabel
+               OpReturnValue %74
+         %81 = OpLabel
+         %84 = OpAccessChain %_ptr_Function_float %pos %uint_1
+         %85 = OpLoad %float %84
+         %86 = OpFOrdGreaterThan %bool %85 %float_1
+               OpStore %c4 %86
+         %87 = OpLoad %bool %c4
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %88
+         %89 = OpLabel
+               OpReturnValue %74
+         %88 = OpLabel
+         %91 = OpAccessChain %_ptr_Function_float %pos %uint_0
+         %92 = OpLoad %float %91
+         %93 = OpFOrdLessThan %bool %92 %float_1
+               OpStore %c5 %93
+         %94 = OpLoad %bool %c5
+               OpSelectionMerge %95 None
+               OpBranchConditional %94 %96 %95
+         %96 = OpLabel
+               OpReturnValue %74
+         %95 = OpLabel
+         %98 = OpAccessChain %_ptr_Function_float %pos %uint_0
+         %99 = OpLoad %float %98
+        %100 = OpFAdd %float %99 %float_1
+        %101 = OpFOrdGreaterThan %bool %100 %float_1
+               OpStore %c6 %101
+        %102 = OpLoad %bool %c6
+               OpSelectionMerge %103 None
+               OpBranchConditional %102 %104 %103
+        %104 = OpLabel
+               OpReturnValue %74
+        %103 = OpLabel
+               OpStore %GLF_live4i %int_0
+               OpBranch %106
+        %106 = OpLabel
+               OpLoopMerge %107 %108 None
+               OpBranch %109
+        %109 = OpLabel
+        %110 = OpLoad %int %GLF_live4i
+        %112 = OpSLessThan %bool %110 %int_4
+               OpSelectionMerge %113 None
+               OpBranchConditional %112 %114 %115
+        %114 = OpLabel
+               OpBranch %113
+        %115 = OpLabel
+               OpBranch %107
+        %113 = OpLabel
+        %116 = OpLoad %int %GLF_live4_looplimiter5
+        %118 = OpSGreaterThanEqual %bool %116 %int_7
+               OpSelectionMerge %119 None
+               OpBranchConditional %118 %120 %119
+        %120 = OpLabel
+               OpBranch %107
+        %119 = OpLabel
+        %121 = OpLoad %int %GLF_live4_looplimiter5
+        %123 = OpIAdd %int %121 %int_1
+               OpStore %GLF_live4_looplimiter5 %123
+               OpStore %GLF_live7m42 %128
+               OpStore %GLF_live7m33 %132
+               OpStore %GLF_live7cols %int_2
+               OpBranch %134
+        %134 = OpLabel
+               OpLoopMerge %135 %136 None
+               OpBranch %137
+        %137 = OpLabel
+        %138 = OpLoad %int %GLF_live7cols
+        %139 = OpSLessThan %bool %138 %int_4
+               OpSelectionMerge %140 None
+               OpBranchConditional %139 %141 %142
+        %141 = OpLabel
+               OpBranch %140
+        %142 = OpLabel
+               OpBranch %135
+        %140 = OpLabel
+        %143 = OpLoad %int %GLF_live7_looplimiter3
+        %144 = OpSGreaterThanEqual %bool %143 %int_7
+               OpSelectionMerge %145 None
+               OpBranchConditional %144 %146 %145
+        %146 = OpLabel
+               OpBranch %135
+        %145 = OpLabel
+        %147 = OpLoad %int %GLF_live7_looplimiter3
+        %148 = OpIAdd %int %147 %int_1
+               OpStore %GLF_live7_looplimiter3 %148
+               OpStore %GLF_live7rows %int_2
+               OpBranch %149
+        %149 = OpLabel
+               OpLoopMerge %150 %151 None
+               OpBranch %152
+        %152 = OpLabel
+        %153 = OpLoad %int %GLF_live7rows
+        %154 = OpSLessThan %bool %153 %int_4
+               OpSelectionMerge %155 None
+               OpBranchConditional %154 %156 %157
+        %156 = OpLabel
+               OpBranch %155
+        %157 = OpLabel
+               OpBranch %150
+        %155 = OpLabel
+        %158 = OpLoad %int %GLF_live7_looplimiter2
+        %159 = OpSGreaterThanEqual %bool %158 %int_7
+               OpSelectionMerge %160 None
+               OpBranchConditional %159 %161 %160
+        %161 = OpLabel
+               OpBranch %150
+        %160 = OpLabel
+        %162 = OpLoad %int %GLF_live7_looplimiter2
+        %163 = OpIAdd %int %162 %int_1
+               OpStore %GLF_live7_looplimiter2 %163
+               OpStore %GLF_live7_looplimiter1 %int_0
+               OpStore %GLF_live7c %int_0
+               OpBranch %164
+        %164 = OpLabel
+               OpLoopMerge %165 %166 None
+               OpBranch %167
+        %167 = OpLabel
+        %168 = OpLoad %int %GLF_live7c
+        %170 = OpSLessThan %bool %168 %int_3
+               OpSelectionMerge %171 None
+               OpBranchConditional %170 %172 %173
+        %172 = OpLabel
+               OpBranch %171
+        %173 = OpLabel
+               OpBranch %165
+        %171 = OpLabel
+        %174 = OpLoad %int %GLF_live7_looplimiter1
+        %175 = OpSGreaterThanEqual %bool %174 %int_7
+               OpSelectionMerge %176 None
+               OpBranchConditional %175 %177 %176
+        %177 = OpLabel
+               OpBranch %165
+        %176 = OpLabel
+        %178 = OpLoad %int %GLF_live7_looplimiter1
+        %179 = OpIAdd %int %178 %int_1
+               OpStore %GLF_live7_looplimiter1 %179
+               OpStore %GLF_live7r %int_0
+               OpBranch %180
+        %180 = OpLabel
+               OpLoopMerge %181 %182 None
+               OpBranch %183
+        %183 = OpLabel
+        %184 = OpLoad %int %GLF_live7r
+        %185 = OpSLessThan %bool %184 %int_2
+               OpSelectionMerge %186 None
+               OpBranchConditional %185 %187 %188
+        %187 = OpLabel
+               OpBranch %186
+        %188 = OpLabel
+               OpBranch %181
+        %186 = OpLabel
+        %189 = OpLoad %int %GLF_live7_looplimiter0
+        %190 = OpSGreaterThanEqual %bool %189 %int_7
+               OpSelectionMerge %191 None
+               OpBranchConditional %190 %192 %191
+        %192 = OpLabel
+               OpBranch %181
+        %191 = OpLabel
+        %193 = OpLoad %int %GLF_live7_looplimiter0
+        %194 = OpIAdd %int %193 %int_1
+               OpStore %GLF_live7_looplimiter0 %194
+        %195 = OpLoad %int %GLF_live7c
+        %196 = OpLoad %int %GLF_live7c
+        %197 = OpLoad %int %GLF_live7c
+        %198 = OpLoad %int %GLF_live7r
+        %199 = OpLoad %int %GLF_live7r
+        %200 = OpLoad %int %GLF_live7r
+        %202 = OpSGreaterThanEqual %bool %195 %int_0
+               OpSelectionMerge %203 None
+               OpBranchConditional %202 %204 %203
+        %204 = OpLabel
+        %205 = OpSLessThan %bool %196 %int_3
+               OpBranch %203
+        %203 = OpLabel
+        %206 = OpPhi %bool %202 %191 %205 %204
+        %201 = OpSelect %int %206 %197 %int_0
+        %208 = OpSGreaterThanEqual %bool %198 %int_0
+               OpSelectionMerge %209 None
+               OpBranchConditional %208 %210 %209
+        %210 = OpLabel
+        %211 = OpSLessThan %bool %199 %int_3
+               OpBranch %209
+        %209 = OpLabel
+        %212 = OpPhi %bool %208 %203 %211 %210
+        %207 = OpSelect %int %212 %200 %int_0
+        %213 = OpAccessChain %_ptr_Function_float %GLF_live7m33 %201 %207
+               OpStore %213 %float_1
+        %215 = OpAccessChain %_ptr_Uniform_float %x_25 %uint_0 %uint_1
+        %216 = OpLoad %float %215
+        %217 = OpFOrdGreaterThan %bool %float_0 %216
+               OpSelectionMerge %218 None
+               OpBranchConditional %217 %219 %220
+        %219 = OpLabel
+               OpBranch %218
+        %220 = OpLabel
+        %221 = OpLoad %int %GLF_live7c
+        %222 = OpLoad %int %GLF_live7c
+        %223 = OpLoad %int %GLF_live7c
+        %224 = OpLoad %int %GLF_live7r
+        %225 = OpLoad %int %GLF_live7r
+        %226 = OpLoad %int %GLF_live7r
+        %228 = OpSGreaterThanEqual %bool %221 %int_0
+               OpSelectionMerge %229 None
+               OpBranchConditional %228 %230 %229
+        %230 = OpLabel
+        %231 = OpSLessThan %bool %222 %int_4
+               OpBranch %229
+        %229 = OpLabel
+        %232 = OpPhi %bool %228 %220 %231 %230
+        %227 = OpSelect %int %232 %223 %int_0
+        %234 = OpSGreaterThanEqual %bool %224 %int_0
+               OpSelectionMerge %235 None
+               OpBranchConditional %234 %236 %235
+        %236 = OpLabel
+        %237 = OpSLessThan %bool %225 %int_2
+               OpBranch %235
+        %235 = OpLabel
+        %238 = OpPhi %bool %234 %229 %237 %236
+        %233 = OpSelect %int %238 %226 %int_0
+        %239 = OpAccessChain %_ptr_Function_float %GLF_live7m42 %227 %233
+               OpStore %239 %float_1
+               OpBranch %218
+        %218 = OpLabel
+               OpBranch %182
+        %182 = OpLabel
+        %240 = OpLoad %int %GLF_live7r
+        %241 = OpIAdd %int %240 %int_1
+               OpStore %GLF_live7r %241
+               OpBranch %180
+        %181 = OpLabel
+               OpBranch %166
+        %166 = OpLabel
+        %242 = OpLoad %int %GLF_live7c
+        %243 = OpIAdd %int %242 %int_1
+               OpStore %GLF_live7c %243
+               OpBranch %164
+        %165 = OpLabel
+               OpBranch %151
+        %151 = OpLabel
+        %244 = OpLoad %int %GLF_live7rows
+        %245 = OpIAdd %int %244 %int_1
+               OpStore %GLF_live7rows %245
+               OpBranch %149
+        %150 = OpLabel
+               OpBranch %136
+        %136 = OpLabel
+        %246 = OpLoad %int %GLF_live7cols
+        %247 = OpIAdd %int %246 %int_1
+               OpStore %GLF_live7cols %247
+               OpBranch %134
+        %135 = OpLabel
+               OpStore %GLF_live7sum_index %int_0
+               OpStore %GLF_live7_looplimiter7 %int_0
+               OpStore %GLF_live7cols_1 %int_2
+               OpBranch %248
+        %248 = OpLabel
+               OpLoopMerge %249 %250 None
+               OpBranch %251
+        %251 = OpLabel
+        %252 = OpLoad %int %GLF_live7cols_1
+        %253 = OpSLessThan %bool %252 %int_4
+               OpSelectionMerge %254 None
+               OpBranchConditional %253 %255 %256
+        %255 = OpLabel
+               OpBranch %254
+        %256 = OpLabel
+               OpBranch %249
+        %254 = OpLabel
+        %257 = OpLoad %int %GLF_live7_looplimiter7
+        %258 = OpSGreaterThanEqual %bool %257 %int_7
+               OpSelectionMerge %259 None
+               OpBranchConditional %258 %260 %259
+        %260 = OpLabel
+               OpBranch %249
+        %259 = OpLabel
+        %261 = OpLoad %int %GLF_live7_looplimiter7
+        %262 = OpIAdd %int %261 %int_1
+               OpStore %GLF_live7_looplimiter7 %262
+               OpStore %GLF_live7rows_1 %int_2
+        %263 = OpLoad %int %GLF_live7sum_index
+        %264 = OpLoad %int %GLF_live7sum_index
+        %265 = OpLoad %int %GLF_live7sum_index
+        %267 = OpSGreaterThanEqual %bool %263 %int_0
+               OpSelectionMerge %268 None
+               OpBranchConditional %267 %269 %268
+        %269 = OpLabel
+        %271 = OpSLessThan %bool %264 %int_9
+               OpBranch %268
+        %268 = OpLabel
+        %272 = OpPhi %bool %267 %259 %271 %269
+        %266 = OpSelect %int %272 %265 %int_0
+        %273 = OpAccessChain %_ptr_Function_float %GLF_live7sums %266
+               OpStore %273 %float_0
+               OpStore %GLF_live7c_1 %int_0
+               OpBranch %274
+        %274 = OpLabel
+               OpLoopMerge %275 %276 None
+               OpBranch %277
+        %277 = OpLabel
+        %278 = OpLoad %int %GLF_live7c_1
+        %279 = OpSLessThan %bool %278 %int_1
+               OpSelectionMerge %280 None
+               OpBranchConditional %279 %281 %282
+        %281 = OpLabel
+               OpBranch %280
+        %282 = OpLabel
+               OpBranch %275
+        %280 = OpLabel
+               OpStore %GLF_live7r_1 %int_0
+               OpBranch %283
+        %283 = OpLabel
+               OpLoopMerge %284 %285 None
+               OpBranch %286
+        %286 = OpLabel
+        %287 = OpLoad %int %GLF_live7r_1
+        %288 = OpLoad %int %GLF_live7rows_1
+        %289 = OpSLessThan %bool %287 %288
+               OpSelectionMerge %290 None
+               OpBranchConditional %289 %291 %292
+        %291 = OpLabel
+               OpBranch %290
+        %292 = OpLabel
+               OpBranch %284
+        %290 = OpLabel
+        %293 = OpLoad %int %GLF_live7sum_index
+        %294 = OpLoad %int %GLF_live7sum_index
+        %295 = OpLoad %int %GLF_live7sum_index
+        %297 = OpSGreaterThanEqual %bool %293 %int_0
+               OpSelectionMerge %298 None
+               OpBranchConditional %297 %299 %298
+        %299 = OpLabel
+        %300 = OpSLessThan %bool %294 %int_9
+               OpBranch %298
+        %298 = OpLabel
+        %301 = OpPhi %bool %297 %290 %300 %299
+        %296 = OpSelect %int %301 %295 %int_0
+        %302 = OpLoad %mat3v3float %GLF_live7m33
+        %303 = OpTranspose %mat3v3float %302
+        %304 = OpLoad %int %GLF_live7c_1
+        %305 = OpSLessThan %bool %304 %int_3
+               OpSelectionMerge %306 None
+               OpBranchConditional %305 %307 %308
+        %307 = OpLabel
+               OpStore %x_180 %int_1
+               OpBranch %306
+        %308 = OpLabel
+        %309 = OpAccessChain %_ptr_Uniform_float %x_25 %uint_0 %uint_0
+        %310 = OpLoad %float %309
+        %311 = OpConvertFToS %int %310
+               OpStore %x_180 %311
+               OpBranch %306
+        %306 = OpLabel
+        %312 = OpLoad %int %x_180
+        %313 = OpLoad %int %GLF_live7r_1
+               OpStore %indexable %303
+        %315 = OpSLessThan %bool %313 %int_3
+        %314 = OpSelect %int %315 %int_1 %int_0
+        %316 = OpAccessChain %_ptr_Function_float %indexable %312 %314
+        %317 = OpLoad %float %316
+        %318 = OpAccessChain %_ptr_Function_float %GLF_live7sums %296
+        %319 = OpLoad %float %318
+        %320 = OpAccessChain %_ptr_Function_float %GLF_live7sums %296
+        %321 = OpFAdd %float %319 %317
+               OpStore %320 %321
+        %322 = OpLoad %int %GLF_live7sum_index
+        %323 = OpLoad %int %GLF_live7sum_index
+        %324 = OpLoad %int %GLF_live7sum_index
+        %326 = OpSGreaterThanEqual %bool %322 %int_0
+               OpSelectionMerge %327 None
+               OpBranchConditional %326 %328 %327
+        %328 = OpLabel
+        %329 = OpSLessThan %bool %323 %int_9
+               OpBranch %327
+        %327 = OpLabel
+        %330 = OpPhi %bool %326 %306 %329 %328
+        %325 = OpSelect %int %330 %324 %int_0
+        %331 = OpLoad %int %GLF_live7r_1
+        %332 = OpAccessChain %_ptr_Function_float %GLF_live7m42 %int_1 %331
+        %333 = OpLoad %float %332
+        %334 = OpAccessChain %_ptr_Function_float %GLF_live7sums %325
+        %335 = OpLoad %float %334
+        %336 = OpAccessChain %_ptr_Function_float %GLF_live7sums %325
+        %337 = OpFAdd %float %335 %333
+               OpStore %336 %337
+               OpBranch %285
+        %285 = OpLabel
+        %338 = OpLoad %int %GLF_live7r_1
+        %339 = OpIAdd %int %338 %int_1
+               OpStore %GLF_live7r_1 %339
+               OpBranch %283
+        %284 = OpLabel
+               OpBranch %276
+        %276 = OpLabel
+        %340 = OpLoad %int %GLF_live7c_1
+        %341 = OpIAdd %int %340 %int_1
+               OpStore %GLF_live7c_1 %341
+               OpBranch %274
+        %275 = OpLabel
+        %342 = OpLoad %int %GLF_live7sum_index
+        %343 = OpIAdd %int %342 %int_1
+               OpStore %GLF_live7sum_index %343
+               OpBranch %250
+        %250 = OpLabel
+        %344 = OpLoad %int %GLF_live7cols_1
+        %345 = OpIAdd %int %344 %int_1
+               OpStore %GLF_live7cols_1 %345
+               OpBranch %248
+        %249 = OpLabel
+               OpBranch %108
+        %108 = OpLabel
+        %346 = OpLoad %int %GLF_live4i
+        %347 = OpIAdd %int %346 %int_1
+               OpStore %GLF_live4i %347
+               OpBranch %106
+        %107 = OpLabel
+               OpReturnValue %74
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %348
+        %351 = OpLabel
+   %position = OpVariable %_ptr_Function_v2float Function %353
+      %param = OpVariable %_ptr_Function_v2float Function %353
+    %param_1 = OpVariable %_ptr_Function_v2float Function %353
+          %i = OpVariable %_ptr_Function_int Function %32
+    %param_2 = OpVariable %_ptr_Function_v2float Function %353
+        %358 = OpAccessChain %_ptr_Uniform_float %x_25 %uint_0 %uint_0
+        %359 = OpLoad %float %358
+        %361 = OpFOrdGreaterThanEqual %bool %359 %float_2
+               OpSelectionMerge %362 None
+               OpBranchConditional %361 %363 %362
+        %363 = OpLabel
+        %364 = OpLoad %v4float %gl_FragCoord
+        %365 = OpCompositeExtract %float %364 0
+        %366 = OpCompositeExtract %float %364 1
+        %367 = OpCompositeConstruct %v2float %365 %366
+               OpStore %position %367
+        %368 = OpLoad %v2float %position
+               OpStore %param %368
+        %369 = OpFunctionCall %v3float %drawShape_vf2_ %param
+        %371 = OpLoad %v2float %position
+               OpStore %param_1 %371
+        %372 = OpFunctionCall %v3float %drawShape_vf2_ %param_1
+               OpStore %i %int_25
+               OpBranch %375
+        %375 = OpLabel
+               OpLoopMerge %376 %377 None
+               OpBranch %378
+        %378 = OpLabel
+        %379 = OpLoad %int %i
+        %380 = OpSGreaterThan %bool %379 %int_0
+               OpSelectionMerge %381 None
+               OpBranchConditional %380 %382 %383
+        %382 = OpLabel
+               OpBranch %381
+        %383 = OpLabel
+               OpBranch %376
+        %381 = OpLabel
+        %384 = OpLoad %v2float %position
+               OpStore %param_2 %384
+        %385 = OpFunctionCall %v3float %drawShape_vf2_ %param_2
+               OpBranch %377
+        %377 = OpLabel
+        %387 = OpLoad %int %i
+        %388 = OpISub %int %387 %int_1
+               OpStore %i %388
+               OpBranch %375
+        %376 = OpLabel
+               OpBranch %362
+        %362 = OpLabel
+               OpStore %x_GLF_color %389
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %390
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %394 = OpLabel
+        %395 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %395
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %348
+        %397 = OpLabel
+        %398 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %398
+        %399 = OpFunctionCall %void %main_1
+        %401 = OpLoad %v4float %x_GLF_color
+        %402 = OpCompositeConstruct %main_out %401
+        %400 = OpFunctionCall %void %tint_symbol_3 %402
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..9ca6d37
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,317 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_25 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn drawShape_vf2_(pos : ptr<function, vec2<f32>>) -> vec3<f32> {
+  var c2 : bool;
+  var c3 : bool;
+  var c4 : bool;
+  var c5 : bool;
+  var c6 : bool;
+  var GLF_live4i : i32;
+  var GLF_live4_looplimiter5 : i32;
+  var GLF_live7m42 : mat4x2<f32>;
+  var GLF_live7m33 : mat3x3<f32>;
+  var GLF_live7cols : i32;
+  var GLF_live7_looplimiter3 : i32;
+  var GLF_live7rows : i32;
+  var GLF_live7_looplimiter2 : i32;
+  var GLF_live7_looplimiter1 : i32;
+  var GLF_live7c : i32;
+  var GLF_live7r : i32;
+  var GLF_live7_looplimiter0 : i32;
+  var GLF_live7sum_index : i32;
+  var GLF_live7_looplimiter7 : i32;
+  var GLF_live7cols_1 : i32;
+  var GLF_live7rows_1 : i32;
+  var GLF_live7sums : array<f32, 9>;
+  var GLF_live7c_1 : i32;
+  var GLF_live7r_1 : i32;
+  var x_180 : i32;
+  var indexable : mat3x3<f32>;
+  let x_182 : f32 = (*(pos)).x;
+  c2 = (x_182 > 1.0);
+  let x_184 : bool = c2;
+  if (x_184) {
+    return vec3<f32>(1.0, 1.0, 1.0);
+  }
+  let x_188 : f32 = (*(pos)).y;
+  c3 = (x_188 < 1.0);
+  let x_190 : bool = c3;
+  if (x_190) {
+    return vec3<f32>(1.0, 1.0, 1.0);
+  }
+  let x_194 : f32 = (*(pos)).y;
+  c4 = (x_194 > 1.0);
+  let x_196 : bool = c4;
+  if (x_196) {
+    return vec3<f32>(1.0, 1.0, 1.0);
+  }
+  let x_200 : f32 = (*(pos)).x;
+  c5 = (x_200 < 1.0);
+  let x_202 : bool = c5;
+  if (x_202) {
+    return vec3<f32>(1.0, 1.0, 1.0);
+  }
+  let x_206 : f32 = (*(pos)).x;
+  c6 = ((x_206 + 1.0) > 1.0);
+  let x_209 : bool = c6;
+  if (x_209) {
+    return vec3<f32>(1.0, 1.0, 1.0);
+  }
+  GLF_live4i = 0;
+  loop {
+    let x_39 : i32 = GLF_live4i;
+    if ((x_39 < 4)) {
+    } else {
+      break;
+    }
+    let x_40 : i32 = GLF_live4_looplimiter5;
+    if ((x_40 >= 7)) {
+      break;
+    }
+    let x_41 : i32 = GLF_live4_looplimiter5;
+    GLF_live4_looplimiter5 = (x_41 + 1);
+    GLF_live7m42 = mat4x2<f32>(vec2<f32>(1.0, 0.0), vec2<f32>(0.0, 1.0), vec2<f32>(0.0, 0.0), vec2<f32>(1.0, 0.0));
+    GLF_live7m33 = mat3x3<f32>(vec3<f32>(1.0, 0.0, 0.0), vec3<f32>(0.0, 1.0, 0.0), vec3<f32>(0.0, 0.0, 1.0));
+    GLF_live7cols = 2;
+    loop {
+      let x_43 : i32 = GLF_live7cols;
+      if ((x_43 < 4)) {
+      } else {
+        break;
+      }
+      let x_44 : i32 = GLF_live7_looplimiter3;
+      if ((x_44 >= 7)) {
+        break;
+      }
+      let x_45 : i32 = GLF_live7_looplimiter3;
+      GLF_live7_looplimiter3 = (x_45 + 1);
+      GLF_live7rows = 2;
+      loop {
+        let x_47 : i32 = GLF_live7rows;
+        if ((x_47 < 4)) {
+        } else {
+          break;
+        }
+        let x_48 : i32 = GLF_live7_looplimiter2;
+        if ((x_48 >= 7)) {
+          break;
+        }
+        let x_49 : i32 = GLF_live7_looplimiter2;
+        GLF_live7_looplimiter2 = (x_49 + 1);
+        GLF_live7_looplimiter1 = 0;
+        GLF_live7c = 0;
+        loop {
+          let x_51 : i32 = GLF_live7c;
+          if ((x_51 < 3)) {
+          } else {
+            break;
+          }
+          let x_52 : i32 = GLF_live7_looplimiter1;
+          if ((x_52 >= 7)) {
+            break;
+          }
+          let x_53 : i32 = GLF_live7_looplimiter1;
+          GLF_live7_looplimiter1 = (x_53 + 1);
+          GLF_live7r = 0;
+          loop {
+            let x_55 : i32 = GLF_live7r;
+            if ((x_55 < 2)) {
+            } else {
+              break;
+            }
+            let x_56 : i32 = GLF_live7_looplimiter0;
+            if ((x_56 >= 7)) {
+              break;
+            }
+            let x_57 : i32 = GLF_live7_looplimiter0;
+            GLF_live7_looplimiter0 = (x_57 + 1);
+            let x_59 : i32 = GLF_live7c;
+            let x_60 : i32 = GLF_live7c;
+            let x_61 : i32 = GLF_live7c;
+            let x_62 : i32 = GLF_live7r;
+            let x_63 : i32 = GLF_live7r;
+            let x_64 : i32 = GLF_live7r;
+            GLF_live7m33[select(0, x_61, ((x_59 >= 0) && (x_60 < 3)))][select(0, x_64, ((x_62 >= 0) && (x_63 < 3)))] = 1.0;
+            let x_267 : f32 = x_25.injectionSwitch.y;
+            if ((0.0 > x_267)) {
+            } else {
+              let x_65 : i32 = GLF_live7c;
+              let x_66 : i32 = GLF_live7c;
+              let x_67 : i32 = GLF_live7c;
+              let x_68 : i32 = GLF_live7r;
+              let x_69 : i32 = GLF_live7r;
+              let x_70 : i32 = GLF_live7r;
+              GLF_live7m42[select(0, x_67, ((x_65 >= 0) && (x_66 < 4)))][select(0, x_70, ((x_68 >= 0) && (x_69 < 2)))] = 1.0;
+            }
+
+            continuing {
+              let x_71 : i32 = GLF_live7r;
+              GLF_live7r = (x_71 + 1);
+            }
+          }
+
+          continuing {
+            let x_73 : i32 = GLF_live7c;
+            GLF_live7c = (x_73 + 1);
+          }
+        }
+
+        continuing {
+          let x_75 : i32 = GLF_live7rows;
+          GLF_live7rows = (x_75 + 1);
+        }
+      }
+
+      continuing {
+        let x_77 : i32 = GLF_live7cols;
+        GLF_live7cols = (x_77 + 1);
+      }
+    }
+    GLF_live7sum_index = 0;
+    GLF_live7_looplimiter7 = 0;
+    GLF_live7cols_1 = 2;
+    loop {
+      let x_79 : i32 = GLF_live7cols_1;
+      if ((x_79 < 4)) {
+      } else {
+        break;
+      }
+      let x_80 : i32 = GLF_live7_looplimiter7;
+      if ((x_80 >= 7)) {
+        break;
+      }
+      let x_81 : i32 = GLF_live7_looplimiter7;
+      GLF_live7_looplimiter7 = (x_81 + 1);
+      GLF_live7rows_1 = 2;
+      let x_83 : i32 = GLF_live7sum_index;
+      let x_84 : i32 = GLF_live7sum_index;
+      let x_85 : i32 = GLF_live7sum_index;
+      GLF_live7sums[select(0, x_85, ((x_83 >= 0) && (x_84 < 9)))] = 0.0;
+      GLF_live7c_1 = 0;
+      loop {
+        let x_86 : i32 = GLF_live7c_1;
+        if ((x_86 < 1)) {
+        } else {
+          break;
+        }
+        GLF_live7r_1 = 0;
+        loop {
+          let x_87 : i32 = GLF_live7r_1;
+          let x_88 : i32 = GLF_live7rows_1;
+          if ((x_87 < x_88)) {
+          } else {
+            break;
+          }
+          let x_89 : i32 = GLF_live7sum_index;
+          let x_90 : i32 = GLF_live7sum_index;
+          let x_91 : i32 = GLF_live7sum_index;
+          let x_310 : i32 = select(0, x_91, ((x_89 >= 0) && (x_90 < 9)));
+          let x_311 : mat3x3<f32> = GLF_live7m33;
+          let x_312 : mat3x3<f32> = transpose(x_311);
+          let x_92 : i32 = GLF_live7c_1;
+          if ((x_92 < 3)) {
+            x_180 = 1;
+          } else {
+            let x_318 : f32 = x_25.injectionSwitch.x;
+            x_180 = i32(x_318);
+          }
+          let x_320 : i32 = x_180;
+          let x_93 : i32 = GLF_live7r_1;
+          indexable = x_312;
+          let x_324 : f32 = indexable[x_320][select(0, 1, (x_93 < 3))];
+          let x_326 : f32 = GLF_live7sums[x_310];
+          GLF_live7sums[x_310] = (x_326 + x_324);
+          let x_94 : i32 = GLF_live7sum_index;
+          let x_95 : i32 = GLF_live7sum_index;
+          let x_96 : i32 = GLF_live7sum_index;
+          let x_332 : i32 = select(0, x_96, ((x_94 >= 0) && (x_95 < 9)));
+          let x_97 : i32 = GLF_live7r_1;
+          let x_334 : f32 = GLF_live7m42[1][x_97];
+          let x_336 : f32 = GLF_live7sums[x_332];
+          GLF_live7sums[x_332] = (x_336 + x_334);
+
+          continuing {
+            let x_98 : i32 = GLF_live7r_1;
+            GLF_live7r_1 = (x_98 + 1);
+          }
+        }
+
+        continuing {
+          let x_100 : i32 = GLF_live7c_1;
+          GLF_live7c_1 = (x_100 + 1);
+        }
+      }
+      let x_102 : i32 = GLF_live7sum_index;
+      GLF_live7sum_index = (x_102 + 1);
+
+      continuing {
+        let x_104 : i32 = GLF_live7cols_1;
+        GLF_live7cols_1 = (x_104 + 1);
+      }
+    }
+
+    continuing {
+      let x_106 : i32 = GLF_live4i;
+      GLF_live4i = (x_106 + 1);
+    }
+  }
+  return vec3<f32>(1.0, 1.0, 1.0);
+}
+
+fn main_1() {
+  var position : vec2<f32>;
+  var param : vec2<f32>;
+  var param_1 : vec2<f32>;
+  var i : i32;
+  var param_2 : vec2<f32>;
+  let x_161 : f32 = x_25.injectionSwitch.x;
+  if ((x_161 >= 2.0)) {
+    let x_165 : vec4<f32> = gl_FragCoord;
+    position = vec2<f32>(x_165.x, x_165.y);
+    let x_167 : vec2<f32> = position;
+    param = x_167;
+    let x_168 : vec3<f32> = drawShape_vf2_(&(param));
+    let x_169 : vec2<f32> = position;
+    param_1 = x_169;
+    let x_170 : vec3<f32> = drawShape_vf2_(&(param_1));
+    i = 25;
+    loop {
+      let x_108 : i32 = i;
+      if ((x_108 > 0)) {
+      } else {
+        break;
+      }
+      let x_177 : vec2<f32> = position;
+      param_2 = x_177;
+      let x_178 : vec3<f32> = drawShape_vf2_(&(param_2));
+
+      continuing {
+        let x_109 : i32 = i;
+        i = (x_109 - 1);
+      }
+    }
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cosh-return-inf-unused/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cosh-return-inf-unused/0-opt.spvasm
new file mode 100644
index 0000000..92880f1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cosh-return-inf-unused/0-opt.spvasm
@@ -0,0 +1,223 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %func_i1_ "func(i1;"
+               OpName %b "b"
+               OpName %ndx "ndx"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %i "i"
+               OpName %_GLF_color "_GLF_color"
+               OpName %f "f"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %_ ""
+               OpName %param "param"
+               OpName %x "x"
+               OpName %param_0 "param"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+       %void = OpTypeVoid
+         %16 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %float = OpTypeFloat 32
+         %20 = OpTypeFunction %float %_ptr_Function_int
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_0 = OpConstant %float 0
+    %v2float = OpTypeVector %float 2
+    %float_1 = OpConstant %float 1
+  %float_800 = OpConstant %float 800
+         %33 = OpConstantComposite %v2float %float_1 %float_800
+      %int_1 = OpConstant %int 1
+    %float_3 = OpConstant %float 3
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %37 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+    %float_5 = OpConstant %float 5
+         %39 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+%_ptr_Output_float = OpTypePointer Output %float
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %int_65 = OpConstant %int 65
+     %int_10 = OpConstant %int 10
+         %47 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %16
+         %48 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function
+      %param = OpVariable %_ptr_Function_int Function
+          %x = OpVariable %_ptr_Function_int Function
+    %param_0 = OpVariable %_ptr_Function_int Function
+               OpStore %_GLF_color %39
+               OpStore %f %float_0
+               OpBranch %49
+         %49 = OpLabel
+               OpLoopMerge %50 %51 None
+               OpBranch %52
+         %52 = OpLabel
+         %53 = OpAccessChain %_ptr_Output_float %_GLF_color %uint_1
+         %54 = OpLoad %float %53
+         %55 = OpConvertFToS %int %54
+         %56 = OpSLessThan %bool %55 %int_0
+               OpSelectionMerge %57 None
+               OpBranchConditional %56 %58 %59
+         %58 = OpLabel
+               OpKill
+         %59 = OpLabel
+         %60 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %61 = OpLoad %float %60
+         %62 = OpConvertFToS %int %61
+               OpStore %param %62
+         %63 = OpFunctionCall %float %func_i1_ %param
+               OpStore %f %63
+               OpBranch %57
+         %57 = OpLabel
+         %64 = OpAccessChain %_ptr_Output_float %_GLF_color %uint_1
+         %65 = OpLoad %float %64
+         %66 = OpConvertFToS %int %65
+         %67 = OpSGreaterThan %bool %66 %int_65
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %68
+         %69 = OpLabel
+               OpKill
+         %68 = OpLabel
+               OpStore %x %int_0
+               OpBranch %70
+         %70 = OpLabel
+               OpLoopMerge %71 %72 None
+               OpBranch %73
+         %73 = OpLabel
+         %74 = OpLoad %int %x
+         %75 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %76 = OpLoad %float %75
+         %77 = OpConvertFToS %int %76
+         %78 = OpIAdd %int %77 %int_1
+         %79 = OpSLessThan %bool %74 %78
+               OpBranchConditional %79 %80 %71
+         %80 = OpLabel
+         %81 = OpLoad %int %x
+         %82 = OpIAdd %int %81 %int_10
+               OpStore %param_0 %82
+         %83 = OpFunctionCall %float %func_i1_ %param_0
+               OpStore %f %83
+               OpBranch %72
+         %72 = OpLabel
+         %84 = OpLoad %int %x
+         %85 = OpIAdd %int %84 %int_1
+               OpStore %x %85
+               OpBranch %70
+         %71 = OpLabel
+               OpBranch %51
+         %51 = OpLabel
+         %86 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %87 = OpLoad %float %86
+         %88 = OpConvertFToS %int %87
+         %89 = OpSGreaterThan %bool %88 %int_1
+               OpBranchConditional %89 %49 %50
+         %50 = OpLabel
+         %90 = OpLoad %float %f
+         %91 = OpFOrdEqual %bool %90 %float_3
+               OpSelectionMerge %92 None
+               OpBranchConditional %91 %93 %94
+         %93 = OpLabel
+               OpStore %_GLF_color %47
+               OpBranch %92
+         %94 = OpLabel
+               OpStore %_GLF_color %37
+               OpBranch %92
+         %92 = OpLabel
+               OpReturn
+               OpFunctionEnd
+   %func_i1_ = OpFunction %float None %20
+          %b = OpFunctionParameter %_ptr_Function_int
+         %95 = OpLabel
+        %ndx = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+               OpStore %ndx %int_0
+               OpBranch %96
+         %96 = OpLabel
+               OpLoopMerge %97 %98 None
+               OpBranch %99
+         %99 = OpLabel
+        %100 = OpLoad %int %ndx
+        %101 = OpSLessThan %bool %100 %int_2
+               OpBranchConditional %101 %102 %97
+        %102 = OpLabel
+        %103 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+        %104 = OpLoad %float %103
+        %105 = OpFOrdLessThan %bool %104 %float_0
+               OpSelectionMerge %106 None
+               OpBranchConditional %105 %107 %106
+        %107 = OpLabel
+               OpStore %i %int_0
+               OpBranch %108
+        %108 = OpLabel
+               OpLoopMerge %109 %110 None
+               OpBranch %111
+        %111 = OpLabel
+        %112 = OpLoad %int %i
+        %113 = OpSLessThan %bool %112 %int_2
+               OpBranchConditional %113 %114 %109
+        %114 = OpLabel
+        %115 = OpExtInst %v2float %1 Cosh %33
+        %116 = OpCompositeExtract %float %115 0
+        %117 = OpConvertFToS %int %116
+        %118 = OpSLessThanEqual %bool %117 %int_1
+               OpSelectionMerge %119 None
+               OpBranchConditional %118 %120 %119
+        %120 = OpLabel
+               OpKill
+        %119 = OpLabel
+               OpBranch %110
+        %110 = OpLabel
+        %121 = OpLoad %int %i
+        %122 = OpIAdd %int %121 %int_1
+               OpStore %i %122
+               OpBranch %108
+        %109 = OpLabel
+               OpBranch %106
+        %106 = OpLabel
+               OpBranch %98
+         %98 = OpLabel
+        %123 = OpLoad %int %ndx
+        %124 = OpIAdd %int %123 %int_1
+               OpStore %ndx %124
+               OpBranch %96
+         %97 = OpLabel
+        %125 = OpLoad %int %b
+        %126 = OpSGreaterThan %bool %125 %int_1
+               OpSelectionMerge %127 None
+               OpBranchConditional %126 %128 %127
+        %128 = OpLabel
+               OpReturnValue %float_3
+        %127 = OpLabel
+        %129 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+        %130 = OpLoad %float %129
+        %131 = OpFOrdLessThan %bool %130 %float_0
+               OpSelectionMerge %132 None
+               OpBranchConditional %131 %133 %132
+        %133 = OpLabel
+               OpStore %_GLF_color %37
+               OpBranch %132
+        %132 = OpLabel
+               OpReturnValue %float_5
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cosh-return-inf-unused/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cosh-return-inf-unused/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..96c79d3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cosh-return-inf-unused/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,106 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_11 : register(b0, space0) {
+  uint4 x_11[1];
+};
+
+float func_i1_(inout int b) {
+  int ndx = 0;
+  int i = 0;
+  ndx = 0;
+  {
+    for(; (ndx < 2); ndx = (ndx + 1)) {
+      const float x_104 = gl_FragCoord.x;
+      if ((x_104 < 0.0f)) {
+        i = 0;
+        {
+          for(; (i < 2); i = (i + 1)) {
+            if ((int(cosh(float2(1.0f, 800.0f)).x) <= 1)) {
+              discard;
+            }
+          }
+        }
+      }
+    }
+  }
+  const int x_125 = b;
+  if ((x_125 > 1)) {
+    return 3.0f;
+  }
+  const float x_130 = gl_FragCoord.x;
+  if ((x_130 < 0.0f)) {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return 5.0f;
+}
+
+void main_1() {
+  float f = 0.0f;
+  int param = 0;
+  int x_1 = 0;
+  int param_1 = 0;
+  x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  f = 0.0f;
+  while (true) {
+    const float x_54 = x_GLF_color.y;
+    if ((int(x_54) < 0)) {
+      discard;
+    } else {
+      const float x_61 = asfloat(x_11[0].x);
+      param = int(x_61);
+      const float x_63 = func_i1_(param);
+      f = x_63;
+    }
+    const float x_65 = x_GLF_color.y;
+    if ((int(x_65) > 65)) {
+      discard;
+    }
+    x_1 = 0;
+    while (true) {
+      const int x_74 = x_1;
+      const float x_76 = asfloat(x_11[0].x);
+      if ((x_74 < (int(x_76) + 1))) {
+      } else {
+        break;
+      }
+      param_1 = (x_1 + 10);
+      const float x_83 = func_i1_(param_1);
+      f = x_83;
+      {
+        x_1 = (x_1 + 1);
+      }
+    }
+    {
+      const float x_87 = asfloat(x_11[0].x);
+      if ((int(x_87) > 1)) {
+      } else {
+        break;
+      }
+    }
+  }
+  if ((f == 3.0f)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cosh-return-inf-unused/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cosh-return-inf-unused/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..d5ad884
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cosh-return-inf-unused/0-opt.spvasm.expected.msl
@@ -0,0 +1,122 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float zero;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float func_i1_(thread int* const b, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int ndx = 0;
+  int i = 0;
+  ndx = 0;
+  while (true) {
+    int const x_100 = ndx;
+    if ((x_100 < 2)) {
+    } else {
+      break;
+    }
+    float const x_104 = (*(tint_symbol_5)).x;
+    if ((x_104 < 0.0f)) {
+      i = 0;
+      while (true) {
+        int const x_112 = i;
+        if ((x_112 < 2)) {
+        } else {
+          break;
+        }
+        if ((int(cosh(float2(1.0f, 800.0f)).x) <= 1)) {
+          discard_fragment();
+        }
+        {
+          int const x_121 = i;
+          i = (x_121 + 1);
+        }
+      }
+    }
+    {
+      int const x_123 = ndx;
+      ndx = (x_123 + 1);
+    }
+  }
+  int const x_125 = *(b);
+  if ((x_125 > 1)) {
+    return 3.0f;
+  }
+  float const x_130 = (*(tint_symbol_5)).x;
+  if ((x_130 < 0.0f)) {
+    *(tint_symbol_6) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return 5.0f;
+}
+
+void main_1(constant buf0& x_11, thread float4* const tint_symbol_7, thread float4* const tint_symbol_8) {
+  float f = 0.0f;
+  int param = 0;
+  int x_1 = 0;
+  int param_1 = 0;
+  *(tint_symbol_7) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  f = 0.0f;
+  while (true) {
+    float const x_54 = (*(tint_symbol_7)).y;
+    if ((int(x_54) < 0)) {
+      discard_fragment();
+    } else {
+      float const x_61 = x_11.zero;
+      param = int(x_61);
+      float const x_63 = func_i1_(&(param), tint_symbol_8, tint_symbol_7);
+      f = x_63;
+    }
+    float const x_65 = (*(tint_symbol_7)).y;
+    if ((int(x_65) > 65)) {
+      discard_fragment();
+    }
+    x_1 = 0;
+    while (true) {
+      int const x_74 = x_1;
+      float const x_76 = x_11.zero;
+      if ((x_74 < (int(x_76) + 1))) {
+      } else {
+        break;
+      }
+      int const x_81 = x_1;
+      param_1 = (x_81 + 10);
+      float const x_83 = func_i1_(&(param_1), tint_symbol_8, tint_symbol_7);
+      f = x_83;
+      {
+        int const x_84 = x_1;
+        x_1 = (x_84 + 1);
+      }
+    }
+    {
+      float const x_87 = x_11.zero;
+      if ((int(x_87) > 1)) {
+      } else {
+        break;
+      }
+    }
+  }
+  float const x_90 = f;
+  if ((x_90 == 3.0f)) {
+    *(tint_symbol_7) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_7) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_11 [[buffer(0)]]) {
+  thread float4 tint_symbol_9 = 0.0f;
+  thread float4 tint_symbol_10 = 0.0f;
+  tint_symbol_9 = gl_FragCoord_param;
+  main_1(x_11, &(tint_symbol_10), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_10};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cosh-return-inf-unused/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cosh-return-inf-unused/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..e54f592
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cosh-return-inf-unused/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,287 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 164
+; Schema: 0
+               OpCapability Shader
+         %56 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %x_11 "x_11"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %func_i1_ "func_i1_"
+               OpName %b "b"
+               OpName %ndx "ndx"
+               OpName %i "i"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %param "param"
+               OpName %x "x"
+               OpName %param_1 "param_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_11 NonWritable
+               OpDecorate %x_11 DescriptorSet 0
+               OpDecorate %x_11 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_11 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %14 = OpTypeFunction %float %_ptr_Function_int
+         %21 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+    %v2float = OpTypeVector %float 2
+    %float_1 = OpConstant %float 1
+  %float_800 = OpConstant %float 800
+         %59 = OpConstantComposite %v2float %float_1 %float_800
+      %int_1 = OpConstant %int 1
+    %float_3 = OpConstant %float 3
+         %80 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+    %float_5 = OpConstant %float 5
+       %void = OpTypeVoid
+         %82 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %88 = OpConstantNull %float
+         %92 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %int_65 = OpConstant %int 65
+     %int_10 = OpConstant %int 10
+        %150 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %151 = OpTypeFunction %void %main_out
+   %func_i1_ = OpFunction %float None %14
+          %b = OpFunctionParameter %_ptr_Function_int
+         %19 = OpLabel
+        %ndx = OpVariable %_ptr_Function_int Function %21
+          %i = OpVariable %_ptr_Function_int Function %21
+               OpStore %ndx %int_0
+               OpBranch %24
+         %24 = OpLabel
+               OpLoopMerge %25 %26 None
+               OpBranch %27
+         %27 = OpLabel
+         %28 = OpLoad %int %ndx
+         %30 = OpSLessThan %bool %28 %int_2
+               OpSelectionMerge %32 None
+               OpBranchConditional %30 %33 %34
+         %33 = OpLabel
+               OpBranch %32
+         %34 = OpLabel
+               OpBranch %25
+         %32 = OpLabel
+         %38 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %39 = OpLoad %float %38
+         %41 = OpFOrdLessThan %bool %39 %float_0
+               OpSelectionMerge %42 None
+               OpBranchConditional %41 %43 %42
+         %43 = OpLabel
+               OpStore %i %int_0
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %48 = OpLoad %int %i
+         %49 = OpSLessThan %bool %48 %int_2
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %52
+         %51 = OpLabel
+               OpBranch %50
+         %52 = OpLabel
+               OpBranch %45
+         %50 = OpLabel
+         %54 = OpExtInst %v2float %56 Cosh %59
+         %60 = OpCompositeExtract %float %54 0
+         %53 = OpConvertFToS %int %60
+         %62 = OpSLessThanEqual %bool %53 %int_1
+               OpSelectionMerge %63 None
+               OpBranchConditional %62 %64 %63
+         %64 = OpLabel
+               OpKill
+         %63 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+         %65 = OpLoad %int %i
+         %66 = OpIAdd %int %65 %int_1
+               OpStore %i %66
+               OpBranch %44
+         %45 = OpLabel
+               OpBranch %42
+         %42 = OpLabel
+               OpBranch %26
+         %26 = OpLabel
+         %67 = OpLoad %int %ndx
+         %68 = OpIAdd %int %67 %int_1
+               OpStore %ndx %68
+               OpBranch %24
+         %25 = OpLabel
+         %70 = OpLoad %int %b
+         %71 = OpSGreaterThan %bool %70 %int_1
+               OpSelectionMerge %72 None
+               OpBranchConditional %71 %73 %72
+         %73 = OpLabel
+               OpReturnValue %float_3
+         %72 = OpLabel
+         %75 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %76 = OpLoad %float %75
+         %77 = OpFOrdLessThan %bool %76 %float_0
+               OpSelectionMerge %78 None
+               OpBranchConditional %77 %79 %78
+         %79 = OpLabel
+               OpStore %x_GLF_color %80
+               OpBranch %78
+         %78 = OpLabel
+               OpReturnValue %float_5
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %82
+         %85 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %88
+      %param = OpVariable %_ptr_Function_int Function %21
+          %x = OpVariable %_ptr_Function_int Function %21
+    %param_1 = OpVariable %_ptr_Function_int Function %21
+               OpStore %x_GLF_color %92
+               OpStore %f %float_0
+               OpBranch %93
+         %93 = OpLabel
+               OpLoopMerge %94 %95 None
+               OpBranch %96
+         %96 = OpLabel
+         %98 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_1
+         %99 = OpLoad %float %98
+        %100 = OpConvertFToS %int %99
+        %101 = OpSLessThan %bool %100 %int_0
+               OpSelectionMerge %102 None
+               OpBranchConditional %101 %103 %104
+        %103 = OpLabel
+               OpKill
+        %104 = OpLabel
+        %106 = OpAccessChain %_ptr_Uniform_float %x_11 %uint_0
+        %107 = OpLoad %float %106
+        %108 = OpConvertFToS %int %107
+               OpStore %param %108
+        %109 = OpFunctionCall %float %func_i1_ %param
+               OpStore %f %109
+               OpBranch %102
+        %102 = OpLabel
+        %111 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_1
+        %112 = OpLoad %float %111
+        %113 = OpConvertFToS %int %112
+        %115 = OpSGreaterThan %bool %113 %int_65
+               OpSelectionMerge %116 None
+               OpBranchConditional %115 %117 %116
+        %117 = OpLabel
+               OpKill
+        %116 = OpLabel
+               OpStore %x %int_0
+               OpBranch %118
+        %118 = OpLabel
+               OpLoopMerge %119 %120 None
+               OpBranch %121
+        %121 = OpLabel
+        %122 = OpLoad %int %x
+        %123 = OpAccessChain %_ptr_Uniform_float %x_11 %uint_0
+        %124 = OpLoad %float %123
+        %125 = OpConvertFToS %int %124
+        %126 = OpIAdd %int %125 %int_1
+        %127 = OpSLessThan %bool %122 %126
+               OpSelectionMerge %128 None
+               OpBranchConditional %127 %129 %130
+        %129 = OpLabel
+               OpBranch %128
+        %130 = OpLabel
+               OpBranch %119
+        %128 = OpLabel
+        %131 = OpLoad %int %x
+        %133 = OpIAdd %int %131 %int_10
+               OpStore %param_1 %133
+        %134 = OpFunctionCall %float %func_i1_ %param_1
+               OpStore %f %134
+               OpBranch %120
+        %120 = OpLabel
+        %136 = OpLoad %int %x
+        %137 = OpIAdd %int %136 %int_1
+               OpStore %x %137
+               OpBranch %118
+        %119 = OpLabel
+               OpBranch %95
+         %95 = OpLabel
+        %138 = OpAccessChain %_ptr_Uniform_float %x_11 %uint_0
+        %139 = OpLoad %float %138
+        %140 = OpConvertFToS %int %139
+        %141 = OpSGreaterThan %bool %140 %int_1
+               OpSelectionMerge %142 None
+               OpBranchConditional %141 %143 %144
+        %143 = OpLabel
+               OpBranch %142
+        %144 = OpLabel
+               OpBranch %94
+        %142 = OpLabel
+               OpBranch %93
+         %94 = OpLabel
+        %145 = OpLoad %float %f
+        %146 = OpFOrdEqual %bool %145 %float_3
+               OpSelectionMerge %147 None
+               OpBranchConditional %146 %148 %149
+        %148 = OpLabel
+               OpStore %x_GLF_color %150
+               OpBranch %147
+        %149 = OpLabel
+               OpStore %x_GLF_color %80
+               OpBranch %147
+        %147 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %151
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %155 = OpLabel
+        %156 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %156
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %82
+        %158 = OpLabel
+        %159 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %159
+        %160 = OpFunctionCall %void %main_1
+        %162 = OpLoad %v4float %x_GLF_color
+        %163 = OpCompositeConstruct %main_out %162
+        %161 = OpFunctionCall %void %tint_symbol_3 %163
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 95[%95] is not post dominated by the back-edge block 142[%142]
+  %142 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cosh-return-inf-unused/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cosh-return-inf-unused/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..a6a3d97
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cosh-return-inf-unused/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,125 @@
+[[block]]
+struct buf0 {
+  zero : f32;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_11 : buf0;
+
+fn func_i1_(b : ptr<function, i32>) -> f32 {
+  var ndx : i32;
+  var i : i32;
+  ndx = 0;
+  loop {
+    let x_100 : i32 = ndx;
+    if ((x_100 < 2)) {
+    } else {
+      break;
+    }
+    let x_104 : f32 = gl_FragCoord.x;
+    if ((x_104 < 0.0)) {
+      i = 0;
+      loop {
+        let x_112 : i32 = i;
+        if ((x_112 < 2)) {
+        } else {
+          break;
+        }
+        if ((i32(cosh(vec2<f32>(1.0, 800.0)).x) <= 1)) {
+          discard;
+        }
+
+        continuing {
+          let x_121 : i32 = i;
+          i = (x_121 + 1);
+        }
+      }
+    }
+
+    continuing {
+      let x_123 : i32 = ndx;
+      ndx = (x_123 + 1);
+    }
+  }
+  let x_125 : i32 = *(b);
+  if ((x_125 > 1)) {
+    return 3.0;
+  }
+  let x_130 : f32 = gl_FragCoord.x;
+  if ((x_130 < 0.0)) {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return 5.0;
+}
+
+fn main_1() {
+  var f : f32;
+  var param : i32;
+  var x : i32;
+  var param_1 : i32;
+  x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+  f = 0.0;
+  loop {
+    let x_54 : f32 = x_GLF_color.y;
+    if ((i32(x_54) < 0)) {
+      discard;
+    } else {
+      let x_61 : f32 = x_11.zero;
+      param = i32(x_61);
+      let x_63 : f32 = func_i1_(&(param));
+      f = x_63;
+    }
+    let x_65 : f32 = x_GLF_color.y;
+    if ((i32(x_65) > 65)) {
+      discard;
+    }
+    x = 0;
+    loop {
+      let x_74 : i32 = x;
+      let x_76 : f32 = x_11.zero;
+      if ((x_74 < (i32(x_76) + 1))) {
+      } else {
+        break;
+      }
+      let x_81 : i32 = x;
+      param_1 = (x_81 + 10);
+      let x_83 : f32 = func_i1_(&(param_1));
+      f = x_83;
+
+      continuing {
+        let x_84 : i32 = x;
+        x = (x_84 + 1);
+      }
+    }
+
+    continuing {
+      let x_87 : f32 = x_11.zero;
+      if ((i32(x_87) > 1)) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_90 : f32 = f;
+  if ((x_90 == 3.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cosh-return-inf-unused/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cosh-return-inf-unused/0-opt.wgsl
new file mode 100644
index 0000000..a6a3d97
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cosh-return-inf-unused/0-opt.wgsl
@@ -0,0 +1,125 @@
+[[block]]
+struct buf0 {
+  zero : f32;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_11 : buf0;
+
+fn func_i1_(b : ptr<function, i32>) -> f32 {
+  var ndx : i32;
+  var i : i32;
+  ndx = 0;
+  loop {
+    let x_100 : i32 = ndx;
+    if ((x_100 < 2)) {
+    } else {
+      break;
+    }
+    let x_104 : f32 = gl_FragCoord.x;
+    if ((x_104 < 0.0)) {
+      i = 0;
+      loop {
+        let x_112 : i32 = i;
+        if ((x_112 < 2)) {
+        } else {
+          break;
+        }
+        if ((i32(cosh(vec2<f32>(1.0, 800.0)).x) <= 1)) {
+          discard;
+        }
+
+        continuing {
+          let x_121 : i32 = i;
+          i = (x_121 + 1);
+        }
+      }
+    }
+
+    continuing {
+      let x_123 : i32 = ndx;
+      ndx = (x_123 + 1);
+    }
+  }
+  let x_125 : i32 = *(b);
+  if ((x_125 > 1)) {
+    return 3.0;
+  }
+  let x_130 : f32 = gl_FragCoord.x;
+  if ((x_130 < 0.0)) {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return 5.0;
+}
+
+fn main_1() {
+  var f : f32;
+  var param : i32;
+  var x : i32;
+  var param_1 : i32;
+  x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+  f = 0.0;
+  loop {
+    let x_54 : f32 = x_GLF_color.y;
+    if ((i32(x_54) < 0)) {
+      discard;
+    } else {
+      let x_61 : f32 = x_11.zero;
+      param = i32(x_61);
+      let x_63 : f32 = func_i1_(&(param));
+      f = x_63;
+    }
+    let x_65 : f32 = x_GLF_color.y;
+    if ((i32(x_65) > 65)) {
+      discard;
+    }
+    x = 0;
+    loop {
+      let x_74 : i32 = x;
+      let x_76 : f32 = x_11.zero;
+      if ((x_74 < (i32(x_76) + 1))) {
+      } else {
+        break;
+      }
+      let x_81 : i32 = x;
+      param_1 = (x_81 + 10);
+      let x_83 : f32 = func_i1_(&(param_1));
+      f = x_83;
+
+      continuing {
+        let x_84 : i32 = x;
+        x = (x_84 + 1);
+      }
+    }
+
+    continuing {
+      let x_87 : f32 = x_11.zero;
+      if ((i32(x_87) > 1)) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_90 : f32 = f;
+  if ((x_90 == 3.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cosh-return-inf-unused/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cosh-return-inf-unused/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..96c79d3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cosh-return-inf-unused/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,106 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_11 : register(b0, space0) {
+  uint4 x_11[1];
+};
+
+float func_i1_(inout int b) {
+  int ndx = 0;
+  int i = 0;
+  ndx = 0;
+  {
+    for(; (ndx < 2); ndx = (ndx + 1)) {
+      const float x_104 = gl_FragCoord.x;
+      if ((x_104 < 0.0f)) {
+        i = 0;
+        {
+          for(; (i < 2); i = (i + 1)) {
+            if ((int(cosh(float2(1.0f, 800.0f)).x) <= 1)) {
+              discard;
+            }
+          }
+        }
+      }
+    }
+  }
+  const int x_125 = b;
+  if ((x_125 > 1)) {
+    return 3.0f;
+  }
+  const float x_130 = gl_FragCoord.x;
+  if ((x_130 < 0.0f)) {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return 5.0f;
+}
+
+void main_1() {
+  float f = 0.0f;
+  int param = 0;
+  int x_1 = 0;
+  int param_1 = 0;
+  x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  f = 0.0f;
+  while (true) {
+    const float x_54 = x_GLF_color.y;
+    if ((int(x_54) < 0)) {
+      discard;
+    } else {
+      const float x_61 = asfloat(x_11[0].x);
+      param = int(x_61);
+      const float x_63 = func_i1_(param);
+      f = x_63;
+    }
+    const float x_65 = x_GLF_color.y;
+    if ((int(x_65) > 65)) {
+      discard;
+    }
+    x_1 = 0;
+    while (true) {
+      const int x_74 = x_1;
+      const float x_76 = asfloat(x_11[0].x);
+      if ((x_74 < (int(x_76) + 1))) {
+      } else {
+        break;
+      }
+      param_1 = (x_1 + 10);
+      const float x_83 = func_i1_(param_1);
+      f = x_83;
+      {
+        x_1 = (x_1 + 1);
+      }
+    }
+    {
+      const float x_87 = asfloat(x_11[0].x);
+      if ((int(x_87) > 1)) {
+      } else {
+        break;
+      }
+    }
+  }
+  if ((f == 3.0f)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cosh-return-inf-unused/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cosh-return-inf-unused/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..d5ad884
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cosh-return-inf-unused/0-opt.wgsl.expected.msl
@@ -0,0 +1,122 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float zero;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float func_i1_(thread int* const b, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int ndx = 0;
+  int i = 0;
+  ndx = 0;
+  while (true) {
+    int const x_100 = ndx;
+    if ((x_100 < 2)) {
+    } else {
+      break;
+    }
+    float const x_104 = (*(tint_symbol_5)).x;
+    if ((x_104 < 0.0f)) {
+      i = 0;
+      while (true) {
+        int const x_112 = i;
+        if ((x_112 < 2)) {
+        } else {
+          break;
+        }
+        if ((int(cosh(float2(1.0f, 800.0f)).x) <= 1)) {
+          discard_fragment();
+        }
+        {
+          int const x_121 = i;
+          i = (x_121 + 1);
+        }
+      }
+    }
+    {
+      int const x_123 = ndx;
+      ndx = (x_123 + 1);
+    }
+  }
+  int const x_125 = *(b);
+  if ((x_125 > 1)) {
+    return 3.0f;
+  }
+  float const x_130 = (*(tint_symbol_5)).x;
+  if ((x_130 < 0.0f)) {
+    *(tint_symbol_6) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return 5.0f;
+}
+
+void main_1(constant buf0& x_11, thread float4* const tint_symbol_7, thread float4* const tint_symbol_8) {
+  float f = 0.0f;
+  int param = 0;
+  int x_1 = 0;
+  int param_1 = 0;
+  *(tint_symbol_7) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  f = 0.0f;
+  while (true) {
+    float const x_54 = (*(tint_symbol_7)).y;
+    if ((int(x_54) < 0)) {
+      discard_fragment();
+    } else {
+      float const x_61 = x_11.zero;
+      param = int(x_61);
+      float const x_63 = func_i1_(&(param), tint_symbol_8, tint_symbol_7);
+      f = x_63;
+    }
+    float const x_65 = (*(tint_symbol_7)).y;
+    if ((int(x_65) > 65)) {
+      discard_fragment();
+    }
+    x_1 = 0;
+    while (true) {
+      int const x_74 = x_1;
+      float const x_76 = x_11.zero;
+      if ((x_74 < (int(x_76) + 1))) {
+      } else {
+        break;
+      }
+      int const x_81 = x_1;
+      param_1 = (x_81 + 10);
+      float const x_83 = func_i1_(&(param_1), tint_symbol_8, tint_symbol_7);
+      f = x_83;
+      {
+        int const x_84 = x_1;
+        x_1 = (x_84 + 1);
+      }
+    }
+    {
+      float const x_87 = x_11.zero;
+      if ((int(x_87) > 1)) {
+      } else {
+        break;
+      }
+    }
+  }
+  float const x_90 = f;
+  if ((x_90 == 3.0f)) {
+    *(tint_symbol_7) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_7) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_11 [[buffer(0)]]) {
+  thread float4 tint_symbol_9 = 0.0f;
+  thread float4 tint_symbol_10 = 0.0f;
+  tint_symbol_9 = gl_FragCoord_param;
+  main_1(x_11, &(tint_symbol_10), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_10};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cosh-return-inf-unused/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cosh-return-inf-unused/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..e54f592
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cosh-return-inf-unused/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,287 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 164
+; Schema: 0
+               OpCapability Shader
+         %56 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %x_11 "x_11"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %func_i1_ "func_i1_"
+               OpName %b "b"
+               OpName %ndx "ndx"
+               OpName %i "i"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %param "param"
+               OpName %x "x"
+               OpName %param_1 "param_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_11 NonWritable
+               OpDecorate %x_11 DescriptorSet 0
+               OpDecorate %x_11 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_11 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %14 = OpTypeFunction %float %_ptr_Function_int
+         %21 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+    %v2float = OpTypeVector %float 2
+    %float_1 = OpConstant %float 1
+  %float_800 = OpConstant %float 800
+         %59 = OpConstantComposite %v2float %float_1 %float_800
+      %int_1 = OpConstant %int 1
+    %float_3 = OpConstant %float 3
+         %80 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+    %float_5 = OpConstant %float 5
+       %void = OpTypeVoid
+         %82 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %88 = OpConstantNull %float
+         %92 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %int_65 = OpConstant %int 65
+     %int_10 = OpConstant %int 10
+        %150 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %151 = OpTypeFunction %void %main_out
+   %func_i1_ = OpFunction %float None %14
+          %b = OpFunctionParameter %_ptr_Function_int
+         %19 = OpLabel
+        %ndx = OpVariable %_ptr_Function_int Function %21
+          %i = OpVariable %_ptr_Function_int Function %21
+               OpStore %ndx %int_0
+               OpBranch %24
+         %24 = OpLabel
+               OpLoopMerge %25 %26 None
+               OpBranch %27
+         %27 = OpLabel
+         %28 = OpLoad %int %ndx
+         %30 = OpSLessThan %bool %28 %int_2
+               OpSelectionMerge %32 None
+               OpBranchConditional %30 %33 %34
+         %33 = OpLabel
+               OpBranch %32
+         %34 = OpLabel
+               OpBranch %25
+         %32 = OpLabel
+         %38 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %39 = OpLoad %float %38
+         %41 = OpFOrdLessThan %bool %39 %float_0
+               OpSelectionMerge %42 None
+               OpBranchConditional %41 %43 %42
+         %43 = OpLabel
+               OpStore %i %int_0
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %48 = OpLoad %int %i
+         %49 = OpSLessThan %bool %48 %int_2
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %52
+         %51 = OpLabel
+               OpBranch %50
+         %52 = OpLabel
+               OpBranch %45
+         %50 = OpLabel
+         %54 = OpExtInst %v2float %56 Cosh %59
+         %60 = OpCompositeExtract %float %54 0
+         %53 = OpConvertFToS %int %60
+         %62 = OpSLessThanEqual %bool %53 %int_1
+               OpSelectionMerge %63 None
+               OpBranchConditional %62 %64 %63
+         %64 = OpLabel
+               OpKill
+         %63 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+         %65 = OpLoad %int %i
+         %66 = OpIAdd %int %65 %int_1
+               OpStore %i %66
+               OpBranch %44
+         %45 = OpLabel
+               OpBranch %42
+         %42 = OpLabel
+               OpBranch %26
+         %26 = OpLabel
+         %67 = OpLoad %int %ndx
+         %68 = OpIAdd %int %67 %int_1
+               OpStore %ndx %68
+               OpBranch %24
+         %25 = OpLabel
+         %70 = OpLoad %int %b
+         %71 = OpSGreaterThan %bool %70 %int_1
+               OpSelectionMerge %72 None
+               OpBranchConditional %71 %73 %72
+         %73 = OpLabel
+               OpReturnValue %float_3
+         %72 = OpLabel
+         %75 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %76 = OpLoad %float %75
+         %77 = OpFOrdLessThan %bool %76 %float_0
+               OpSelectionMerge %78 None
+               OpBranchConditional %77 %79 %78
+         %79 = OpLabel
+               OpStore %x_GLF_color %80
+               OpBranch %78
+         %78 = OpLabel
+               OpReturnValue %float_5
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %82
+         %85 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %88
+      %param = OpVariable %_ptr_Function_int Function %21
+          %x = OpVariable %_ptr_Function_int Function %21
+    %param_1 = OpVariable %_ptr_Function_int Function %21
+               OpStore %x_GLF_color %92
+               OpStore %f %float_0
+               OpBranch %93
+         %93 = OpLabel
+               OpLoopMerge %94 %95 None
+               OpBranch %96
+         %96 = OpLabel
+         %98 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_1
+         %99 = OpLoad %float %98
+        %100 = OpConvertFToS %int %99
+        %101 = OpSLessThan %bool %100 %int_0
+               OpSelectionMerge %102 None
+               OpBranchConditional %101 %103 %104
+        %103 = OpLabel
+               OpKill
+        %104 = OpLabel
+        %106 = OpAccessChain %_ptr_Uniform_float %x_11 %uint_0
+        %107 = OpLoad %float %106
+        %108 = OpConvertFToS %int %107
+               OpStore %param %108
+        %109 = OpFunctionCall %float %func_i1_ %param
+               OpStore %f %109
+               OpBranch %102
+        %102 = OpLabel
+        %111 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_1
+        %112 = OpLoad %float %111
+        %113 = OpConvertFToS %int %112
+        %115 = OpSGreaterThan %bool %113 %int_65
+               OpSelectionMerge %116 None
+               OpBranchConditional %115 %117 %116
+        %117 = OpLabel
+               OpKill
+        %116 = OpLabel
+               OpStore %x %int_0
+               OpBranch %118
+        %118 = OpLabel
+               OpLoopMerge %119 %120 None
+               OpBranch %121
+        %121 = OpLabel
+        %122 = OpLoad %int %x
+        %123 = OpAccessChain %_ptr_Uniform_float %x_11 %uint_0
+        %124 = OpLoad %float %123
+        %125 = OpConvertFToS %int %124
+        %126 = OpIAdd %int %125 %int_1
+        %127 = OpSLessThan %bool %122 %126
+               OpSelectionMerge %128 None
+               OpBranchConditional %127 %129 %130
+        %129 = OpLabel
+               OpBranch %128
+        %130 = OpLabel
+               OpBranch %119
+        %128 = OpLabel
+        %131 = OpLoad %int %x
+        %133 = OpIAdd %int %131 %int_10
+               OpStore %param_1 %133
+        %134 = OpFunctionCall %float %func_i1_ %param_1
+               OpStore %f %134
+               OpBranch %120
+        %120 = OpLabel
+        %136 = OpLoad %int %x
+        %137 = OpIAdd %int %136 %int_1
+               OpStore %x %137
+               OpBranch %118
+        %119 = OpLabel
+               OpBranch %95
+         %95 = OpLabel
+        %138 = OpAccessChain %_ptr_Uniform_float %x_11 %uint_0
+        %139 = OpLoad %float %138
+        %140 = OpConvertFToS %int %139
+        %141 = OpSGreaterThan %bool %140 %int_1
+               OpSelectionMerge %142 None
+               OpBranchConditional %141 %143 %144
+        %143 = OpLabel
+               OpBranch %142
+        %144 = OpLabel
+               OpBranch %94
+        %142 = OpLabel
+               OpBranch %93
+         %94 = OpLabel
+        %145 = OpLoad %float %f
+        %146 = OpFOrdEqual %bool %145 %float_3
+               OpSelectionMerge %147 None
+               OpBranchConditional %146 %148 %149
+        %148 = OpLabel
+               OpStore %x_GLF_color %150
+               OpBranch %147
+        %149 = OpLabel
+               OpStore %x_GLF_color %80
+               OpBranch %147
+        %147 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %151
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %155 = OpLabel
+        %156 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %156
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %82
+        %158 = OpLabel
+        %159 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %159
+        %160 = OpFunctionCall %void %main_1
+        %162 = OpLoad %v4float %x_GLF_color
+        %163 = OpCompositeConstruct %main_out %162
+        %161 = OpFunctionCall %void %tint_symbol_3 %163
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 95[%95] is not post dominated by the back-edge block 142[%142]
+  %142 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cosh-return-inf-unused/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cosh-return-inf-unused/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..a6a3d97
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cosh-return-inf-unused/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,125 @@
+[[block]]
+struct buf0 {
+  zero : f32;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_11 : buf0;
+
+fn func_i1_(b : ptr<function, i32>) -> f32 {
+  var ndx : i32;
+  var i : i32;
+  ndx = 0;
+  loop {
+    let x_100 : i32 = ndx;
+    if ((x_100 < 2)) {
+    } else {
+      break;
+    }
+    let x_104 : f32 = gl_FragCoord.x;
+    if ((x_104 < 0.0)) {
+      i = 0;
+      loop {
+        let x_112 : i32 = i;
+        if ((x_112 < 2)) {
+        } else {
+          break;
+        }
+        if ((i32(cosh(vec2<f32>(1.0, 800.0)).x) <= 1)) {
+          discard;
+        }
+
+        continuing {
+          let x_121 : i32 = i;
+          i = (x_121 + 1);
+        }
+      }
+    }
+
+    continuing {
+      let x_123 : i32 = ndx;
+      ndx = (x_123 + 1);
+    }
+  }
+  let x_125 : i32 = *(b);
+  if ((x_125 > 1)) {
+    return 3.0;
+  }
+  let x_130 : f32 = gl_FragCoord.x;
+  if ((x_130 < 0.0)) {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return 5.0;
+}
+
+fn main_1() {
+  var f : f32;
+  var param : i32;
+  var x : i32;
+  var param_1 : i32;
+  x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+  f = 0.0;
+  loop {
+    let x_54 : f32 = x_GLF_color.y;
+    if ((i32(x_54) < 0)) {
+      discard;
+    } else {
+      let x_61 : f32 = x_11.zero;
+      param = i32(x_61);
+      let x_63 : f32 = func_i1_(&(param));
+      f = x_63;
+    }
+    let x_65 : f32 = x_GLF_color.y;
+    if ((i32(x_65) > 65)) {
+      discard;
+    }
+    x = 0;
+    loop {
+      let x_74 : i32 = x;
+      let x_76 : f32 = x_11.zero;
+      if ((x_74 < (i32(x_76) + 1))) {
+      } else {
+        break;
+      }
+      let x_81 : i32 = x;
+      param_1 = (x_81 + 10);
+      let x_83 : f32 = func_i1_(&(param_1));
+      f = x_83;
+
+      continuing {
+        let x_84 : i32 = x;
+        x = (x_84 + 1);
+      }
+    }
+
+    continuing {
+      let x_87 : f32 = x_11.zero;
+      if ((i32(x_87) > 1)) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_90 : f32 = f;
+  if ((x_90 == 3.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-access-array-dot/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-access-array-dot/0-opt.spvasm
new file mode 100644
index 0000000..efa8502
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-access-array-dot/0-opt.spvasm
@@ -0,0 +1,133 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %numbers "numbers"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpName %b "b"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_3_0 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+%_ptr_Function__arr_int_uint_3 = OpTypePointer Function %_arr_int_uint_3
+%_arr_int_uint_3_0 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3_0
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+    %float_0 = OpConstant %float 0
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf0 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+%_ptr_Function_float = OpTypePointer Function %float
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %14
+         %36 = OpLabel
+    %numbers = OpVariable %_ptr_Function__arr_int_uint_3 Function
+          %a = OpVariable %_ptr_Function_v2float Function
+          %b = OpVariable %_ptr_Function_float Function
+         %37 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %38 = OpLoad %int %37
+         %39 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %40 = OpLoad %int %39
+         %41 = OpAccessChain %_ptr_Function_int %numbers %38
+               OpStore %41 %40
+         %42 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %43 = OpLoad %int %42
+         %44 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %45 = OpLoad %int %44
+         %46 = OpAccessChain %_ptr_Function_int %numbers %43
+               OpStore %46 %45
+         %47 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %48 = OpLoad %int %47
+         %49 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %50 = OpLoad %int %49
+         %51 = OpAccessChain %_ptr_Function_int %numbers %48
+               OpStore %51 %50
+         %52 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %53 = OpLoad %int %52
+         %54 = OpConvertSToF %float %53
+         %55 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_2
+         %56 = OpLoad %float %55
+         %57 = OpFOrdLessThan %bool %float_0 %56
+         %58 = OpSelect %int %57 %int_1 %int_2
+         %59 = OpAccessChain %_ptr_Function_int %numbers %58
+         %60 = OpLoad %int %59
+         %61 = OpConvertSToF %float %60
+         %62 = OpCompositeConstruct %v2float %54 %61
+               OpStore %a %62
+         %63 = OpLoad %v2float %a
+         %64 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_1
+         %65 = OpLoad %float %64
+         %66 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_1
+         %67 = OpLoad %float %66
+         %68 = OpCompositeConstruct %v2float %65 %67
+         %69 = OpDot %float %63 %68
+               OpStore %b %69
+         %70 = OpLoad %float %b
+         %71 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %72 = OpLoad %float %71
+         %73 = OpFOrdEqual %bool %70 %72
+               OpSelectionMerge %74 None
+               OpBranchConditional %73 %75 %76
+         %75 = OpLabel
+         %77 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %78 = OpLoad %int %77
+         %79 = OpConvertSToF %float %78
+         %80 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %81 = OpLoad %int %80
+         %82 = OpConvertSToF %float %81
+         %83 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %84 = OpLoad %int %83
+         %85 = OpConvertSToF %float %84
+         %86 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %87 = OpLoad %int %86
+         %88 = OpConvertSToF %float %87
+         %89 = OpCompositeConstruct %v4float %79 %82 %85 %88
+               OpStore %_GLF_color %89
+               OpBranch %74
+         %76 = OpLabel
+         %90 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %91 = OpLoad %int %90
+         %92 = OpConvertSToF %float %91
+         %93 = OpCompositeConstruct %v4float %92 %92 %92 %92
+               OpStore %_GLF_color %93
+               OpBranch %74
+         %74 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-access-array-dot/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-access-array-dot/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..01b699a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-access-array-dot/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,65 @@
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[3];
+};
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int numbers[3] = (int[3])0;
+  float2 a = float2(0.0f, 0.0f);
+  float b = 0.0f;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_38 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_40 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  numbers[x_38] = x_40;
+  const int x_43 = asint(x_6[1].x);
+  const int x_45 = asint(x_6[1].x);
+  numbers[x_43] = x_45;
+  const int x_48 = asint(x_6[2].x);
+  const int x_50 = asint(x_6[2].x);
+  numbers[x_48] = x_50;
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const int x_53 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  const float x_56 = asfloat(x_9[2].x);
+  const int x_60 = numbers[((0.0f < x_56) ? 1 : 2)];
+  a = float2(float(x_53), float(x_60));
+  const float2 x_63 = a;
+  const float x_65 = asfloat(x_9[1].x);
+  const float x_67 = asfloat(x_9[1].x);
+  b = dot(x_63, float2(x_65, x_67));
+  const float x_70 = b;
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const float x_72 = asfloat(x_9[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  if ((x_70 == x_72)) {
+    const int x_78 = asint(x_6[1].x);
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_81 = asint(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const int x_84 = asint(x_6[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    const int x_87 = asint(x_6[1].x);
+    x_GLF_color = float4(float(x_78), float(x_81), float(x_84), float(x_87));
+  } else {
+    const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+    const int x_91 = asint(x_6[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+    const float x_92 = float(x_91);
+    x_GLF_color = float4(x_92, x_92, x_92, x_92);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-access-array-dot/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-access-array-dot/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..1545462
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-access-array-dot/0-opt.spvasm.expected.msl
@@ -0,0 +1,78 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct tint_array_wrapper_2 {
+  int arr[3];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_9, thread float4* const tint_symbol_4) {
+  tint_array_wrapper_2 numbers = {};
+  float2 a = 0.0f;
+  float b = 0.0f;
+  int const x_38 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_40 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  numbers.arr[x_38] = x_40;
+  int const x_43 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_45 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  numbers.arr[x_43] = x_45;
+  int const x_48 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_50 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  numbers.arr[x_48] = x_50;
+  int const x_53 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  float const x_56 = x_9.x_GLF_uniform_float_values.arr[2].el;
+  int const x_60 = numbers.arr[select(2, 1, (0.0f < x_56))];
+  a = float2(float(x_53), float(x_60));
+  float2 const x_63 = a;
+  float const x_65 = x_9.x_GLF_uniform_float_values.arr[1].el;
+  float const x_67 = x_9.x_GLF_uniform_float_values.arr[1].el;
+  b = dot(x_63, float2(x_65, x_67));
+  float const x_70 = b;
+  float const x_72 = x_9.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_70 == x_72)) {
+    int const x_78 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_81 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_84 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_87 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_78), float(x_81), float(x_84), float(x_87));
+  } else {
+    int const x_91 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    float const x_92 = float(x_91);
+    *(tint_symbol_4) = float4(x_92, x_92, x_92, x_92);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-access-array-dot/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-access-array-dot/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..cad1211
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-access-array-dot/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,170 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 112
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %numbers "numbers"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_3_0 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %float = OpTypeFloat 32
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf0 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %16
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_arr_int_uint_3_0 = OpTypeArray %int %uint_3
+%_ptr_Function__arr_int_uint_3_0 = OpTypePointer Function %_arr_int_uint_3_0
+         %26 = OpConstantNull %_arr_int_uint_3_0
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %30 = OpConstantNull %v2float
+%_ptr_Function_float = OpTypePointer Function %float
+         %33 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %v4float
+        %100 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+    %numbers = OpVariable %_ptr_Function__arr_int_uint_3_0 Function %26
+          %a = OpVariable %_ptr_Function_v2float Function %30
+          %b = OpVariable %_ptr_Function_float Function %33
+         %37 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %38 = OpLoad %int %37
+         %39 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %40 = OpLoad %int %39
+         %42 = OpAccessChain %_ptr_Function_int %numbers %38
+               OpStore %42 %40
+         %44 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %45 = OpLoad %int %44
+         %46 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %47 = OpLoad %int %46
+         %48 = OpAccessChain %_ptr_Function_int %numbers %45
+               OpStore %48 %47
+         %50 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %51 = OpLoad %int %50
+         %52 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %53 = OpLoad %int %52
+         %54 = OpAccessChain %_ptr_Function_int %numbers %51
+               OpStore %54 %53
+         %55 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %56 = OpLoad %int %55
+         %58 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_2
+         %59 = OpLoad %float %58
+         %62 = OpFOrdLessThan %bool %float_0 %59
+         %60 = OpSelect %int %62 %int_1 %int_2
+         %64 = OpAccessChain %_ptr_Function_int %numbers %60
+         %65 = OpLoad %int %64
+         %66 = OpConvertSToF %float %56
+         %67 = OpConvertSToF %float %65
+         %68 = OpCompositeConstruct %v2float %66 %67
+               OpStore %a %68
+         %69 = OpLoad %v2float %a
+         %70 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_1
+         %71 = OpLoad %float %70
+         %72 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_1
+         %73 = OpLoad %float %72
+         %75 = OpCompositeConstruct %v2float %71 %73
+         %74 = OpDot %float %69 %75
+               OpStore %b %74
+         %76 = OpLoad %float %b
+         %77 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_0
+         %78 = OpLoad %float %77
+         %79 = OpFOrdEqual %bool %76 %78
+               OpSelectionMerge %80 None
+               OpBranchConditional %79 %81 %82
+         %81 = OpLabel
+         %83 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %84 = OpLoad %int %83
+         %85 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %88 = OpLoad %int %87
+         %89 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %90 = OpLoad %int %89
+         %91 = OpConvertSToF %float %84
+         %92 = OpConvertSToF %float %86
+         %93 = OpConvertSToF %float %88
+         %94 = OpConvertSToF %float %90
+         %95 = OpCompositeConstruct %v4float %91 %92 %93 %94
+               OpStore %x_GLF_color %95
+               OpBranch %80
+         %82 = OpLabel
+         %96 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %97 = OpLoad %int %96
+         %98 = OpConvertSToF %float %97
+         %99 = OpCompositeConstruct %v4float %98 %98 %98 %98
+               OpStore %x_GLF_color %99
+               OpBranch %80
+         %80 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %100
+%tint_symbol = OpFunctionParameter %main_out
+        %104 = OpLabel
+        %105 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %105
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+        %107 = OpLabel
+        %108 = OpFunctionCall %void %main_1
+        %110 = OpLoad %v4float %x_GLF_color
+        %111 = OpCompositeConstruct %main_out %110
+        %109 = OpFunctionCall %void %tint_symbol_2 %111
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-access-array-dot/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-access-array-dot/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..a706204
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-access-array-dot/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,67 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var numbers : array<i32, 3>;
+  var a : vec2<f32>;
+  var b : f32;
+  let x_38 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_40 : i32 = x_6.x_GLF_uniform_int_values[0];
+  numbers[x_38] = x_40;
+  let x_43 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_45 : i32 = x_6.x_GLF_uniform_int_values[1];
+  numbers[x_43] = x_45;
+  let x_48 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_50 : i32 = x_6.x_GLF_uniform_int_values[2];
+  numbers[x_48] = x_50;
+  let x_53 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_56 : f32 = x_9.x_GLF_uniform_float_values[2];
+  let x_60 : i32 = numbers[select(2, 1, (0.0 < x_56))];
+  a = vec2<f32>(f32(x_53), f32(x_60));
+  let x_63 : vec2<f32> = a;
+  let x_65 : f32 = x_9.x_GLF_uniform_float_values[1];
+  let x_67 : f32 = x_9.x_GLF_uniform_float_values[1];
+  b = dot(x_63, vec2<f32>(x_65, x_67));
+  let x_70 : f32 = b;
+  let x_72 : f32 = x_9.x_GLF_uniform_float_values[0];
+  if ((x_70 == x_72)) {
+    let x_78 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_81 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_84 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_87 : i32 = x_6.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_78), f32(x_81), f32(x_84), f32(x_87));
+  } else {
+    let x_91 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_92 : f32 = f32(x_91);
+    x_GLF_color = vec4<f32>(x_92, x_92, x_92, x_92);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-access-array-dot/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-access-array-dot/0-opt.wgsl
new file mode 100644
index 0000000..a706204
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-access-array-dot/0-opt.wgsl
@@ -0,0 +1,67 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var numbers : array<i32, 3>;
+  var a : vec2<f32>;
+  var b : f32;
+  let x_38 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_40 : i32 = x_6.x_GLF_uniform_int_values[0];
+  numbers[x_38] = x_40;
+  let x_43 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_45 : i32 = x_6.x_GLF_uniform_int_values[1];
+  numbers[x_43] = x_45;
+  let x_48 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_50 : i32 = x_6.x_GLF_uniform_int_values[2];
+  numbers[x_48] = x_50;
+  let x_53 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_56 : f32 = x_9.x_GLF_uniform_float_values[2];
+  let x_60 : i32 = numbers[select(2, 1, (0.0 < x_56))];
+  a = vec2<f32>(f32(x_53), f32(x_60));
+  let x_63 : vec2<f32> = a;
+  let x_65 : f32 = x_9.x_GLF_uniform_float_values[1];
+  let x_67 : f32 = x_9.x_GLF_uniform_float_values[1];
+  b = dot(x_63, vec2<f32>(x_65, x_67));
+  let x_70 : f32 = b;
+  let x_72 : f32 = x_9.x_GLF_uniform_float_values[0];
+  if ((x_70 == x_72)) {
+    let x_78 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_81 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_84 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_87 : i32 = x_6.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_78), f32(x_81), f32(x_84), f32(x_87));
+  } else {
+    let x_91 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_92 : f32 = f32(x_91);
+    x_GLF_color = vec4<f32>(x_92, x_92, x_92, x_92);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-access-array-dot/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-access-array-dot/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..01b699a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-access-array-dot/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,65 @@
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[3];
+};
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int numbers[3] = (int[3])0;
+  float2 a = float2(0.0f, 0.0f);
+  float b = 0.0f;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_38 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_40 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  numbers[x_38] = x_40;
+  const int x_43 = asint(x_6[1].x);
+  const int x_45 = asint(x_6[1].x);
+  numbers[x_43] = x_45;
+  const int x_48 = asint(x_6[2].x);
+  const int x_50 = asint(x_6[2].x);
+  numbers[x_48] = x_50;
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const int x_53 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  const float x_56 = asfloat(x_9[2].x);
+  const int x_60 = numbers[((0.0f < x_56) ? 1 : 2)];
+  a = float2(float(x_53), float(x_60));
+  const float2 x_63 = a;
+  const float x_65 = asfloat(x_9[1].x);
+  const float x_67 = asfloat(x_9[1].x);
+  b = dot(x_63, float2(x_65, x_67));
+  const float x_70 = b;
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const float x_72 = asfloat(x_9[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  if ((x_70 == x_72)) {
+    const int x_78 = asint(x_6[1].x);
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_81 = asint(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const int x_84 = asint(x_6[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    const int x_87 = asint(x_6[1].x);
+    x_GLF_color = float4(float(x_78), float(x_81), float(x_84), float(x_87));
+  } else {
+    const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+    const int x_91 = asint(x_6[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+    const float x_92 = float(x_91);
+    x_GLF_color = float4(x_92, x_92, x_92, x_92);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-access-array-dot/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-access-array-dot/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..1545462
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-access-array-dot/0-opt.wgsl.expected.msl
@@ -0,0 +1,78 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct tint_array_wrapper_2 {
+  int arr[3];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_9, thread float4* const tint_symbol_4) {
+  tint_array_wrapper_2 numbers = {};
+  float2 a = 0.0f;
+  float b = 0.0f;
+  int const x_38 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_40 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  numbers.arr[x_38] = x_40;
+  int const x_43 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_45 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  numbers.arr[x_43] = x_45;
+  int const x_48 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_50 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  numbers.arr[x_48] = x_50;
+  int const x_53 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  float const x_56 = x_9.x_GLF_uniform_float_values.arr[2].el;
+  int const x_60 = numbers.arr[select(2, 1, (0.0f < x_56))];
+  a = float2(float(x_53), float(x_60));
+  float2 const x_63 = a;
+  float const x_65 = x_9.x_GLF_uniform_float_values.arr[1].el;
+  float const x_67 = x_9.x_GLF_uniform_float_values.arr[1].el;
+  b = dot(x_63, float2(x_65, x_67));
+  float const x_70 = b;
+  float const x_72 = x_9.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_70 == x_72)) {
+    int const x_78 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_81 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_84 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_87 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_78), float(x_81), float(x_84), float(x_87));
+  } else {
+    int const x_91 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    float const x_92 = float(x_91);
+    *(tint_symbol_4) = float4(x_92, x_92, x_92, x_92);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-access-array-dot/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-access-array-dot/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..cad1211
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-access-array-dot/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,170 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 112
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %numbers "numbers"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_3_0 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %float = OpTypeFloat 32
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf0 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %16
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_arr_int_uint_3_0 = OpTypeArray %int %uint_3
+%_ptr_Function__arr_int_uint_3_0 = OpTypePointer Function %_arr_int_uint_3_0
+         %26 = OpConstantNull %_arr_int_uint_3_0
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %30 = OpConstantNull %v2float
+%_ptr_Function_float = OpTypePointer Function %float
+         %33 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %v4float
+        %100 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+    %numbers = OpVariable %_ptr_Function__arr_int_uint_3_0 Function %26
+          %a = OpVariable %_ptr_Function_v2float Function %30
+          %b = OpVariable %_ptr_Function_float Function %33
+         %37 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %38 = OpLoad %int %37
+         %39 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %40 = OpLoad %int %39
+         %42 = OpAccessChain %_ptr_Function_int %numbers %38
+               OpStore %42 %40
+         %44 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %45 = OpLoad %int %44
+         %46 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %47 = OpLoad %int %46
+         %48 = OpAccessChain %_ptr_Function_int %numbers %45
+               OpStore %48 %47
+         %50 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %51 = OpLoad %int %50
+         %52 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %53 = OpLoad %int %52
+         %54 = OpAccessChain %_ptr_Function_int %numbers %51
+               OpStore %54 %53
+         %55 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %56 = OpLoad %int %55
+         %58 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_2
+         %59 = OpLoad %float %58
+         %62 = OpFOrdLessThan %bool %float_0 %59
+         %60 = OpSelect %int %62 %int_1 %int_2
+         %64 = OpAccessChain %_ptr_Function_int %numbers %60
+         %65 = OpLoad %int %64
+         %66 = OpConvertSToF %float %56
+         %67 = OpConvertSToF %float %65
+         %68 = OpCompositeConstruct %v2float %66 %67
+               OpStore %a %68
+         %69 = OpLoad %v2float %a
+         %70 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_1
+         %71 = OpLoad %float %70
+         %72 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_1
+         %73 = OpLoad %float %72
+         %75 = OpCompositeConstruct %v2float %71 %73
+         %74 = OpDot %float %69 %75
+               OpStore %b %74
+         %76 = OpLoad %float %b
+         %77 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_0
+         %78 = OpLoad %float %77
+         %79 = OpFOrdEqual %bool %76 %78
+               OpSelectionMerge %80 None
+               OpBranchConditional %79 %81 %82
+         %81 = OpLabel
+         %83 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %84 = OpLoad %int %83
+         %85 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %88 = OpLoad %int %87
+         %89 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %90 = OpLoad %int %89
+         %91 = OpConvertSToF %float %84
+         %92 = OpConvertSToF %float %86
+         %93 = OpConvertSToF %float %88
+         %94 = OpConvertSToF %float %90
+         %95 = OpCompositeConstruct %v4float %91 %92 %93 %94
+               OpStore %x_GLF_color %95
+               OpBranch %80
+         %82 = OpLabel
+         %96 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %97 = OpLoad %int %96
+         %98 = OpConvertSToF %float %97
+         %99 = OpCompositeConstruct %v4float %98 %98 %98 %98
+               OpStore %x_GLF_color %99
+               OpBranch %80
+         %80 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %100
+%tint_symbol = OpFunctionParameter %main_out
+        %104 = OpLabel
+        %105 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %105
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+        %107 = OpLabel
+        %108 = OpFunctionCall %void %main_1
+        %110 = OpLoad %v4float %x_GLF_color
+        %111 = OpCompositeConstruct %main_out %110
+        %109 = OpFunctionCall %void %tint_symbol_2 %111
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-access-array-dot/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-access-array-dot/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..a706204
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-access-array-dot/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,67 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var numbers : array<i32, 3>;
+  var a : vec2<f32>;
+  var b : f32;
+  let x_38 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_40 : i32 = x_6.x_GLF_uniform_int_values[0];
+  numbers[x_38] = x_40;
+  let x_43 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_45 : i32 = x_6.x_GLF_uniform_int_values[1];
+  numbers[x_43] = x_45;
+  let x_48 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_50 : i32 = x_6.x_GLF_uniform_int_values[2];
+  numbers[x_48] = x_50;
+  let x_53 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_56 : f32 = x_9.x_GLF_uniform_float_values[2];
+  let x_60 : i32 = numbers[select(2, 1, (0.0 < x_56))];
+  a = vec2<f32>(f32(x_53), f32(x_60));
+  let x_63 : vec2<f32> = a;
+  let x_65 : f32 = x_9.x_GLF_uniform_float_values[1];
+  let x_67 : f32 = x_9.x_GLF_uniform_float_values[1];
+  b = dot(x_63, vec2<f32>(x_65, x_67));
+  let x_70 : f32 = b;
+  let x_72 : f32 = x_9.x_GLF_uniform_float_values[0];
+  if ((x_70 == x_72)) {
+    let x_78 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_81 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_84 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_87 : i32 = x_6.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_78), f32(x_81), f32(x_84), f32(x_87));
+  } else {
+    let x_91 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_92 : f32 = f32(x_91);
+    x_GLF_color = vec4<f32>(x_92, x_92, x_92, x_92);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-analysis-reachable-from-many/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-analysis-reachable-from-many/0-opt.spvasm
new file mode 100644
index 0000000..2fd2194
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-analysis-reachable-from-many/0-opt.spvasm
@@ -0,0 +1,123 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %func_ "func("
+               OpName %s "s"
+               OpName %i "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %_ ""
+               OpName %j "j"
+               OpName %c "c"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+         %14 = OpTypeFunction %float
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_2 = OpConstant %float 2
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+    %float_3 = OpConstant %float 3
+     %int_10 = OpConstant %int 10
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+    %float_5 = OpConstant %float 5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %32 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %12
+         %33 = OpLabel
+          %c = OpVariable %_ptr_Function_v4float Function
+         %34 = OpFunctionCall %float %func_
+         %35 = OpCompositeConstruct %v4float %34 %float_0 %float_0 %float_1
+               OpStore %c %35
+         %36 = OpFunctionCall %float %func_
+         %37 = OpFOrdEqual %bool %36 %float_5
+               OpSelectionMerge %38 None
+               OpBranchConditional %37 %39 %40
+         %39 = OpLabel
+         %41 = OpLoad %v4float %c
+               OpStore %_GLF_color %41
+               OpBranch %38
+         %40 = OpLabel
+               OpStore %_GLF_color %32
+               OpBranch %38
+         %38 = OpLabel
+               OpReturn
+               OpFunctionEnd
+      %func_ = OpFunction %float None %14
+         %42 = OpLabel
+          %s = OpVariable %_ptr_Function_float Function
+          %i = OpVariable %_ptr_Function_int Function
+          %j = OpVariable %_ptr_Function_int Function
+               OpStore %s %float_2
+               OpStore %i %int_0
+               OpBranch %43
+         %43 = OpLabel
+               OpLoopMerge %44 %45 None
+               OpBranch %46
+         %46 = OpLabel
+         %47 = OpLoad %int %i
+         %48 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %49 = OpLoad %int %48
+         %50 = OpIAdd %int %49 %int_1
+         %51 = OpSLessThan %bool %47 %50
+               OpBranchConditional %51 %52 %44
+         %52 = OpLabel
+         %53 = OpLoad %float %s
+         %54 = OpFAdd %float %53 %float_3
+               OpStore %s %54
+               OpStore %j %int_0
+               OpBranch %55
+         %55 = OpLabel
+               OpLoopMerge %56 %57 None
+               OpBranch %58
+         %58 = OpLabel
+         %59 = OpLoad %int %j
+         %60 = OpSLessThan %bool %59 %int_10
+               OpBranchConditional %60 %61 %56
+         %61 = OpLabel
+         %62 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %63 = OpLoad %int %62
+         %64 = OpIEqual %bool %63 %int_1
+               OpSelectionMerge %65 None
+               OpBranchConditional %64 %66 %65
+         %66 = OpLabel
+               OpKill
+         %65 = OpLabel
+               OpBranch %57
+         %57 = OpLabel
+         %67 = OpLoad %int %j
+         %68 = OpIAdd %int %67 %int_1
+               OpStore %j %68
+               OpBranch %55
+         %56 = OpLabel
+               OpBranch %45
+         %45 = OpLabel
+         %69 = OpLoad %int %i
+         %70 = OpIAdd %int %69 %int_1
+               OpStore %i %70
+               OpBranch %43
+         %44 = OpLabel
+         %71 = OpLoad %float %s
+               OpReturnValue %71
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-analysis-reachable-from-many/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-analysis-reachable-from-many/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..897064d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-analysis-reachable-from-many/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,61 @@
+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);
+
+float func_() {
+  float s = 0.0f;
+  int i = 0;
+  int j = 0;
+  s = 2.0f;
+  i = 0;
+  while (true) {
+    const int x_47 = i;
+    const int x_49 = asint(x_8[0].x);
+    if ((x_47 < (x_49 + 1))) {
+    } else {
+      break;
+    }
+    s = (s + 3.0f);
+    j = 0;
+    {
+      for(; (j < 10); j = (j + 1)) {
+        const int x_63 = asint(x_8[0].x);
+        if ((x_63 == 1)) {
+          discard;
+        }
+      }
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  return s;
+}
+
+void main_1() {
+  float4 c = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  const float x_34 = func_();
+  c = float4(x_34, 0.0f, 0.0f, 1.0f);
+  const float x_36 = func_();
+  if ((x_36 == 5.0f)) {
+    x_GLF_color = c;
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-analysis-reachable-from-many/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-analysis-reachable-from-many/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..9140262
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-analysis-reachable-from-many/0-opt.spvasm.expected.msl
@@ -0,0 +1,75 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int zero;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float func_(constant buf0& x_8) {
+  float s = 0.0f;
+  int i = 0;
+  int j = 0;
+  s = 2.0f;
+  i = 0;
+  while (true) {
+    int const x_47 = i;
+    int const x_49 = x_8.zero;
+    if ((x_47 < (x_49 + 1))) {
+    } else {
+      break;
+    }
+    float const x_53 = s;
+    s = (x_53 + 3.0f);
+    j = 0;
+    while (true) {
+      int const x_59 = j;
+      if ((x_59 < 10)) {
+      } else {
+        break;
+      }
+      int const x_63 = x_8.zero;
+      if ((x_63 == 1)) {
+        discard_fragment();
+      }
+      {
+        int const x_67 = j;
+        j = (x_67 + 1);
+      }
+    }
+    {
+      int const x_69 = i;
+      i = (x_69 + 1);
+    }
+  }
+  float const x_71 = s;
+  return x_71;
+}
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_4) {
+  float4 c = 0.0f;
+  float const x_34 = func_(x_8);
+  c = float4(x_34, 0.0f, 0.0f, 1.0f);
+  float const x_36 = func_(x_8);
+  if ((x_36 == 5.0f)) {
+    float4 const x_41 = c;
+    *(tint_symbol_4) = x_41;
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-analysis-reachable-from-many/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-analysis-reachable-from-many/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..d7c1363
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-analysis-reachable-from-many/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,168 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 94
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_ "func_"
+               OpName %s "s"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %main_1 "main_1"
+               OpName %c "c"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+         %12 = OpTypeFunction %float
+%_ptr_Function_float = OpTypePointer Function %float
+         %17 = OpConstantNull %float
+%_ptr_Function_int = OpTypePointer Function %int
+         %20 = OpConstantNull %int
+    %float_2 = OpConstant %float 2
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+    %float_3 = OpConstant %float 3
+     %int_10 = OpConstant %int 10
+       %void = OpTypeVoid
+         %64 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+    %float_5 = OpConstant %float 5
+         %81 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %82 = OpTypeFunction %void %main_out
+      %func_ = OpFunction %float None %12
+         %14 = OpLabel
+          %s = OpVariable %_ptr_Function_float Function %17
+          %i = OpVariable %_ptr_Function_int Function %20
+          %j = OpVariable %_ptr_Function_int Function %20
+               OpStore %s %float_2
+               OpStore %i %int_0
+               OpBranch %24
+         %24 = OpLabel
+               OpLoopMerge %25 %26 None
+               OpBranch %27
+         %27 = OpLabel
+         %28 = OpLoad %int %i
+         %32 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0
+         %33 = OpLoad %int %32
+         %35 = OpIAdd %int %33 %int_1
+         %36 = OpSLessThan %bool %28 %35
+               OpSelectionMerge %38 None
+               OpBranchConditional %36 %39 %40
+         %39 = OpLabel
+               OpBranch %38
+         %40 = OpLabel
+               OpBranch %25
+         %38 = OpLabel
+         %41 = OpLoad %float %s
+         %43 = OpFAdd %float %41 %float_3
+               OpStore %s %43
+               OpStore %j %int_0
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %48 = OpLoad %int %j
+         %50 = OpSLessThan %bool %48 %int_10
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %53
+         %52 = OpLabel
+               OpBranch %51
+         %53 = OpLabel
+               OpBranch %45
+         %51 = OpLabel
+         %54 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0
+         %55 = OpLoad %int %54
+         %56 = OpIEqual %bool %55 %int_1
+               OpSelectionMerge %57 None
+               OpBranchConditional %56 %58 %57
+         %58 = OpLabel
+               OpKill
+         %57 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+         %59 = OpLoad %int %j
+         %60 = OpIAdd %int %59 %int_1
+               OpStore %j %60
+               OpBranch %44
+         %45 = OpLabel
+               OpBranch %26
+         %26 = OpLabel
+         %61 = OpLoad %int %i
+         %62 = OpIAdd %int %61 %int_1
+               OpStore %i %62
+               OpBranch %24
+         %25 = OpLabel
+         %63 = OpLoad %float %s
+               OpReturnValue %63
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %64
+         %67 = OpLabel
+          %c = OpVariable %_ptr_Function_v4float Function %9
+         %70 = OpFunctionCall %float %func_
+         %73 = OpCompositeConstruct %v4float %70 %float_0 %float_0 %float_1
+               OpStore %c %73
+         %74 = OpFunctionCall %float %func_
+         %76 = OpFOrdEqual %bool %74 %float_5
+               OpSelectionMerge %77 None
+               OpBranchConditional %76 %78 %79
+         %78 = OpLabel
+         %80 = OpLoad %v4float %c
+               OpStore %x_GLF_color %80
+               OpBranch %77
+         %79 = OpLabel
+               OpStore %x_GLF_color %81
+               OpBranch %77
+         %77 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %82
+%tint_symbol = OpFunctionParameter %main_out
+         %86 = OpLabel
+         %87 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %87
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %64
+         %89 = OpLabel
+         %90 = OpFunctionCall %void %main_1
+         %92 = OpLoad %v4float %x_GLF_color
+         %93 = OpCompositeConstruct %main_out %92
+         %91 = OpFunctionCall %void %tint_symbol_2 %93
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-analysis-reachable-from-many/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-analysis-reachable-from-many/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..f8b40bd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-analysis-reachable-from-many/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,75 @@
+[[block]]
+struct buf0 {
+  zero : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> f32 {
+  var s : f32;
+  var i : i32;
+  var j : i32;
+  s = 2.0;
+  i = 0;
+  loop {
+    let x_47 : i32 = i;
+    let x_49 : i32 = x_8.zero;
+    if ((x_47 < (x_49 + 1))) {
+    } else {
+      break;
+    }
+    let x_53 : f32 = s;
+    s = (x_53 + 3.0);
+    j = 0;
+    loop {
+      let x_59 : i32 = j;
+      if ((x_59 < 10)) {
+      } else {
+        break;
+      }
+      let x_63 : i32 = x_8.zero;
+      if ((x_63 == 1)) {
+        discard;
+      }
+
+      continuing {
+        let x_67 : i32 = j;
+        j = (x_67 + 1);
+      }
+    }
+
+    continuing {
+      let x_69 : i32 = i;
+      i = (x_69 + 1);
+    }
+  }
+  let x_71 : f32 = s;
+  return x_71;
+}
+
+fn main_1() {
+  var c : vec4<f32>;
+  let x_34 : f32 = func_();
+  c = vec4<f32>(x_34, 0.0, 0.0, 1.0);
+  let x_36 : f32 = func_();
+  if ((x_36 == 5.0)) {
+    let x_41 : vec4<f32> = c;
+    x_GLF_color = x_41;
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-analysis-reachable-from-many/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-analysis-reachable-from-many/0-opt.wgsl
new file mode 100644
index 0000000..f8b40bd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-analysis-reachable-from-many/0-opt.wgsl
@@ -0,0 +1,75 @@
+[[block]]
+struct buf0 {
+  zero : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> f32 {
+  var s : f32;
+  var i : i32;
+  var j : i32;
+  s = 2.0;
+  i = 0;
+  loop {
+    let x_47 : i32 = i;
+    let x_49 : i32 = x_8.zero;
+    if ((x_47 < (x_49 + 1))) {
+    } else {
+      break;
+    }
+    let x_53 : f32 = s;
+    s = (x_53 + 3.0);
+    j = 0;
+    loop {
+      let x_59 : i32 = j;
+      if ((x_59 < 10)) {
+      } else {
+        break;
+      }
+      let x_63 : i32 = x_8.zero;
+      if ((x_63 == 1)) {
+        discard;
+      }
+
+      continuing {
+        let x_67 : i32 = j;
+        j = (x_67 + 1);
+      }
+    }
+
+    continuing {
+      let x_69 : i32 = i;
+      i = (x_69 + 1);
+    }
+  }
+  let x_71 : f32 = s;
+  return x_71;
+}
+
+fn main_1() {
+  var c : vec4<f32>;
+  let x_34 : f32 = func_();
+  c = vec4<f32>(x_34, 0.0, 0.0, 1.0);
+  let x_36 : f32 = func_();
+  if ((x_36 == 5.0)) {
+    let x_41 : vec4<f32> = c;
+    x_GLF_color = x_41;
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-analysis-reachable-from-many/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-analysis-reachable-from-many/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..897064d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-analysis-reachable-from-many/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,61 @@
+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);
+
+float func_() {
+  float s = 0.0f;
+  int i = 0;
+  int j = 0;
+  s = 2.0f;
+  i = 0;
+  while (true) {
+    const int x_47 = i;
+    const int x_49 = asint(x_8[0].x);
+    if ((x_47 < (x_49 + 1))) {
+    } else {
+      break;
+    }
+    s = (s + 3.0f);
+    j = 0;
+    {
+      for(; (j < 10); j = (j + 1)) {
+        const int x_63 = asint(x_8[0].x);
+        if ((x_63 == 1)) {
+          discard;
+        }
+      }
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  return s;
+}
+
+void main_1() {
+  float4 c = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  const float x_34 = func_();
+  c = float4(x_34, 0.0f, 0.0f, 1.0f);
+  const float x_36 = func_();
+  if ((x_36 == 5.0f)) {
+    x_GLF_color = c;
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-analysis-reachable-from-many/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-analysis-reachable-from-many/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..9140262
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-analysis-reachable-from-many/0-opt.wgsl.expected.msl
@@ -0,0 +1,75 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int zero;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float func_(constant buf0& x_8) {
+  float s = 0.0f;
+  int i = 0;
+  int j = 0;
+  s = 2.0f;
+  i = 0;
+  while (true) {
+    int const x_47 = i;
+    int const x_49 = x_8.zero;
+    if ((x_47 < (x_49 + 1))) {
+    } else {
+      break;
+    }
+    float const x_53 = s;
+    s = (x_53 + 3.0f);
+    j = 0;
+    while (true) {
+      int const x_59 = j;
+      if ((x_59 < 10)) {
+      } else {
+        break;
+      }
+      int const x_63 = x_8.zero;
+      if ((x_63 == 1)) {
+        discard_fragment();
+      }
+      {
+        int const x_67 = j;
+        j = (x_67 + 1);
+      }
+    }
+    {
+      int const x_69 = i;
+      i = (x_69 + 1);
+    }
+  }
+  float const x_71 = s;
+  return x_71;
+}
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_4) {
+  float4 c = 0.0f;
+  float const x_34 = func_(x_8);
+  c = float4(x_34, 0.0f, 0.0f, 1.0f);
+  float const x_36 = func_(x_8);
+  if ((x_36 == 5.0f)) {
+    float4 const x_41 = c;
+    *(tint_symbol_4) = x_41;
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-analysis-reachable-from-many/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-analysis-reachable-from-many/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..d7c1363
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-analysis-reachable-from-many/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,168 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 94
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_ "func_"
+               OpName %s "s"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %main_1 "main_1"
+               OpName %c "c"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+         %12 = OpTypeFunction %float
+%_ptr_Function_float = OpTypePointer Function %float
+         %17 = OpConstantNull %float
+%_ptr_Function_int = OpTypePointer Function %int
+         %20 = OpConstantNull %int
+    %float_2 = OpConstant %float 2
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+    %float_3 = OpConstant %float 3
+     %int_10 = OpConstant %int 10
+       %void = OpTypeVoid
+         %64 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+    %float_5 = OpConstant %float 5
+         %81 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %82 = OpTypeFunction %void %main_out
+      %func_ = OpFunction %float None %12
+         %14 = OpLabel
+          %s = OpVariable %_ptr_Function_float Function %17
+          %i = OpVariable %_ptr_Function_int Function %20
+          %j = OpVariable %_ptr_Function_int Function %20
+               OpStore %s %float_2
+               OpStore %i %int_0
+               OpBranch %24
+         %24 = OpLabel
+               OpLoopMerge %25 %26 None
+               OpBranch %27
+         %27 = OpLabel
+         %28 = OpLoad %int %i
+         %32 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0
+         %33 = OpLoad %int %32
+         %35 = OpIAdd %int %33 %int_1
+         %36 = OpSLessThan %bool %28 %35
+               OpSelectionMerge %38 None
+               OpBranchConditional %36 %39 %40
+         %39 = OpLabel
+               OpBranch %38
+         %40 = OpLabel
+               OpBranch %25
+         %38 = OpLabel
+         %41 = OpLoad %float %s
+         %43 = OpFAdd %float %41 %float_3
+               OpStore %s %43
+               OpStore %j %int_0
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %48 = OpLoad %int %j
+         %50 = OpSLessThan %bool %48 %int_10
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %53
+         %52 = OpLabel
+               OpBranch %51
+         %53 = OpLabel
+               OpBranch %45
+         %51 = OpLabel
+         %54 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0
+         %55 = OpLoad %int %54
+         %56 = OpIEqual %bool %55 %int_1
+               OpSelectionMerge %57 None
+               OpBranchConditional %56 %58 %57
+         %58 = OpLabel
+               OpKill
+         %57 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+         %59 = OpLoad %int %j
+         %60 = OpIAdd %int %59 %int_1
+               OpStore %j %60
+               OpBranch %44
+         %45 = OpLabel
+               OpBranch %26
+         %26 = OpLabel
+         %61 = OpLoad %int %i
+         %62 = OpIAdd %int %61 %int_1
+               OpStore %i %62
+               OpBranch %24
+         %25 = OpLabel
+         %63 = OpLoad %float %s
+               OpReturnValue %63
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %64
+         %67 = OpLabel
+          %c = OpVariable %_ptr_Function_v4float Function %9
+         %70 = OpFunctionCall %float %func_
+         %73 = OpCompositeConstruct %v4float %70 %float_0 %float_0 %float_1
+               OpStore %c %73
+         %74 = OpFunctionCall %float %func_
+         %76 = OpFOrdEqual %bool %74 %float_5
+               OpSelectionMerge %77 None
+               OpBranchConditional %76 %78 %79
+         %78 = OpLabel
+         %80 = OpLoad %v4float %c
+               OpStore %x_GLF_color %80
+               OpBranch %77
+         %79 = OpLabel
+               OpStore %x_GLF_color %81
+               OpBranch %77
+         %77 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %82
+%tint_symbol = OpFunctionParameter %main_out
+         %86 = OpLabel
+         %87 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %87
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %64
+         %89 = OpLabel
+         %90 = OpFunctionCall %void %main_1
+         %92 = OpLoad %v4float %x_GLF_color
+         %93 = OpCompositeConstruct %main_out %92
+         %91 = OpFunctionCall %void %tint_symbol_2 %93
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-analysis-reachable-from-many/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-analysis-reachable-from-many/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..f8b40bd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-analysis-reachable-from-many/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,75 @@
+[[block]]
+struct buf0 {
+  zero : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> f32 {
+  var s : f32;
+  var i : i32;
+  var j : i32;
+  s = 2.0;
+  i = 0;
+  loop {
+    let x_47 : i32 = i;
+    let x_49 : i32 = x_8.zero;
+    if ((x_47 < (x_49 + 1))) {
+    } else {
+      break;
+    }
+    let x_53 : f32 = s;
+    s = (x_53 + 3.0);
+    j = 0;
+    loop {
+      let x_59 : i32 = j;
+      if ((x_59 < 10)) {
+      } else {
+        break;
+      }
+      let x_63 : i32 = x_8.zero;
+      if ((x_63 == 1)) {
+        discard;
+      }
+
+      continuing {
+        let x_67 : i32 = j;
+        j = (x_67 + 1);
+      }
+    }
+
+    continuing {
+      let x_69 : i32 = i;
+      i = (x_69 + 1);
+    }
+  }
+  let x_71 : f32 = s;
+  return x_71;
+}
+
+fn main_1() {
+  var c : vec4<f32>;
+  let x_34 : f32 = func_();
+  c = vec4<f32>(x_34, 0.0, 0.0, 1.0);
+  let x_36 : f32 = func_();
+  if ((x_36 == 5.0)) {
+    let x_41 : vec4<f32> = c;
+    x_GLF_color = x_41;
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-and-even-numbers-from-fragcoord/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-and-even-numbers-from-fragcoord/0-opt.spvasm
new file mode 100644
index 0000000..e055b34
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-and-even-numbers-from-fragcoord/0-opt.spvasm
@@ -0,0 +1,117 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %v "v"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf1 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+    %v2float = OpTypeVector %float 2
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+%_ptr_Function_int = OpTypePointer Function %int
+     %uint_0 = OpConstant %uint 0
+       %main = OpFunction %void None %13
+         %37 = OpLabel
+          %v = OpVariable %_ptr_Function_v2int Function
+         %38 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %39 = OpLoad %float %38
+         %40 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %41 = OpLoad %float %40
+         %42 = OpFOrdLessThan %bool %39 %41
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %45
+         %44 = OpLabel
+         %46 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %47 = OpLoad %int %46
+         %48 = OpConvertSToF %float %47
+         %49 = OpCompositeConstruct %v4float %48 %48 %48 %48
+               OpStore %_GLF_color %49
+               OpBranch %43
+         %45 = OpLabel
+         %50 = OpLoad %v4float %gl_FragCoord
+         %51 = OpVectorShuffle %v2float %50 %50 0 1
+         %52 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %53 = OpLoad %float %52
+         %54 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %55 = OpLoad %float %54
+         %56 = OpCompositeConstruct %v2float %53 %55
+         %57 = OpFSub %v2float %51 %56
+         %58 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %59 = OpLoad %float %58
+         %60 = OpVectorTimesScalar %v2float %57 %59
+         %61 = OpConvertFToS %v2int %60
+               OpStore %v %61
+         %62 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %63 = OpLoad %float %62
+         %64 = OpAccessChain %_ptr_Function_int %v %uint_1
+         %65 = OpLoad %int %64
+         %66 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %67 = OpLoad %int %66
+         %68 = OpISub %int %65 %67
+         %69 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %70 = OpLoad %int %69
+         %71 = OpBitwiseAnd %int %68 %70
+         %72 = OpConvertSToF %float %71
+         %73 = OpAccessChain %_ptr_Function_int %v %uint_0
+         %74 = OpLoad %int %73
+         %75 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %76 = OpLoad %int %75
+         %77 = OpBitwiseAnd %int %74 %76
+         %78 = OpConvertSToF %float %77
+         %79 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %80 = OpLoad %float %79
+         %81 = OpCompositeConstruct %v4float %63 %72 %78 %80
+               OpStore %_GLF_color %81
+               OpBranch %43
+         %43 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-and-even-numbers-from-fragcoord/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-and-even-numbers-from-fragcoord/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..810c81c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-and-even-numbers-from-fragcoord/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,56 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[2];
+};
+
+void main_1() {
+  int2 v = int2(0, 0);
+  const float x_39 = gl_FragCoord.y;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_41 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  if ((x_39 < x_41)) {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_47 = asint(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const float x_48 = float(x_47);
+    x_GLF_color = float4(x_48, x_48, x_48, x_48);
+  } else {
+    const float4 x_50 = gl_FragCoord;
+    const float x_53 = asfloat(x_6[1].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const float x_55 = asfloat(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const float x_59 = asfloat(x_6[2].x);
+    v = int2(((float2(x_50.x, x_50.y) - float2(x_53, x_55)) * x_59));
+    const float x_63 = asfloat(x_6[1].x);
+    const int x_65 = v.y;
+    const int x_67 = asint(x_8[1].x);
+    const int x_70 = asint(x_8[1].x);
+    const int x_74 = v.x;
+    const int x_76 = asint(x_8[1].x);
+    const float x_80 = asfloat(x_6[1].x);
+    x_GLF_color = float4(x_63, float(((x_65 - x_67) & x_70)), float((x_74 & x_76)), x_80);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-and-even-numbers-from-fragcoord/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-and-even-numbers-from-fragcoord/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..4c716f0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-and-even-numbers-from-fragcoord/0-opt.spvasm.expected.msl
@@ -0,0 +1,66 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_8, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int2 v = 0;
+  float const x_39 = (*(tint_symbol_5)).y;
+  float const x_41 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_39 < x_41)) {
+    int const x_47 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    float const x_48 = float(x_47);
+    *(tint_symbol_6) = float4(x_48, x_48, x_48, x_48);
+  } else {
+    float4 const x_50 = *(tint_symbol_5);
+    float const x_53 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    float const x_55 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    float const x_59 = x_6.x_GLF_uniform_float_values.arr[2].el;
+    v = int2(((float2(x_50.x, x_50.y) - float2(x_53, x_55)) * x_59));
+    float const x_63 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    int const x_65 = v.y;
+    int const x_67 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    int const x_70 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    int const x_74 = v.x;
+    int const x_76 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    float const x_80 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    *(tint_symbol_6) = float4(x_63, float(((x_65 - x_67) & x_70)), float((x_74 & x_76)), x_80);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf1& x_6 [[buffer(1)]], constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_6, x_8, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-and-even-numbers-from-fragcoord/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-and-even-numbers-from-fragcoord/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..c4e8344
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-and-even-numbers-from-fragcoord/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,156 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 101
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_8 "x_8"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %v "v"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf1 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %30 = OpConstantNull %v2int
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_int = OpTypePointer Function %int
+   %main_out = OpTypeStruct %v4float
+         %88 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %23
+         %26 = OpLabel
+          %v = OpVariable %_ptr_Function_v2int Function %30
+         %33 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %34 = OpLoad %float %33
+         %38 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %39 = OpLoad %float %38
+         %40 = OpFOrdLessThan %bool %34 %39
+               OpSelectionMerge %42 None
+               OpBranchConditional %40 %43 %44
+         %43 = OpLabel
+         %46 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %47 = OpLoad %int %46
+         %48 = OpConvertSToF %float %47
+         %49 = OpCompositeConstruct %v4float %48 %48 %48 %48
+               OpStore %x_GLF_color %49
+               OpBranch %42
+         %44 = OpLabel
+         %50 = OpLoad %v4float %gl_FragCoord
+         %52 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %53 = OpLoad %float %52
+         %54 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %55 = OpLoad %float %54
+         %57 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %58 = OpLoad %float %57
+         %61 = OpCompositeExtract %float %50 0
+         %62 = OpCompositeExtract %float %50 1
+         %63 = OpCompositeConstruct %v2float %61 %62
+         %64 = OpCompositeConstruct %v2float %53 %55
+         %65 = OpFSub %v2float %63 %64
+         %66 = OpVectorTimesScalar %v2float %65 %58
+         %59 = OpConvertFToS %v2int %66
+               OpStore %v %59
+         %67 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %68 = OpLoad %float %67
+         %70 = OpAccessChain %_ptr_Function_int %v %uint_1
+         %71 = OpLoad %int %70
+         %72 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %73 = OpLoad %int %72
+         %74 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %75 = OpLoad %int %74
+         %76 = OpAccessChain %_ptr_Function_int %v %uint_0
+         %77 = OpLoad %int %76
+         %78 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %79 = OpLoad %int %78
+         %80 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %81 = OpLoad %float %80
+         %83 = OpISub %int %71 %73
+         %84 = OpBitwiseAnd %int %83 %75
+         %82 = OpConvertSToF %float %84
+         %86 = OpBitwiseAnd %int %77 %79
+         %85 = OpConvertSToF %float %86
+         %87 = OpCompositeConstruct %v4float %68 %82 %85 %81
+               OpStore %x_GLF_color %87
+               OpBranch %42
+         %42 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %88
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %92 = OpLabel
+         %93 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %93
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %23
+         %95 = OpLabel
+         %96 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %96
+         %97 = OpFunctionCall %void %main_1
+         %99 = OpLoad %v4float %x_GLF_color
+        %100 = OpCompositeConstruct %main_out %99
+         %98 = OpFunctionCall %void %tint_symbol_3 %100
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-and-even-numbers-from-fragcoord/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-and-even-numbers-from-fragcoord/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..9a549c4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-and-even-numbers-from-fragcoord/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,59 @@
+type Arr = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+fn main_1() {
+  var v : vec2<i32>;
+  let x_39 : f32 = gl_FragCoord.y;
+  let x_41 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if ((x_39 < x_41)) {
+    let x_47 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_48 : f32 = f32(x_47);
+    x_GLF_color = vec4<f32>(x_48, x_48, x_48, x_48);
+  } else {
+    let x_50 : vec4<f32> = gl_FragCoord;
+    let x_53 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_55 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_59 : f32 = x_6.x_GLF_uniform_float_values[2];
+    v = vec2<i32>(((vec2<f32>(x_50.x, x_50.y) - vec2<f32>(x_53, x_55)) * x_59));
+    let x_63 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_65 : i32 = v.y;
+    let x_67 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_70 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_74 : i32 = v.x;
+    let x_76 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_80 : f32 = x_6.x_GLF_uniform_float_values[1];
+    x_GLF_color = vec4<f32>(x_63, f32(((x_65 - x_67) & x_70)), f32((x_74 & x_76)), x_80);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-and-even-numbers-from-fragcoord/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-and-even-numbers-from-fragcoord/0-opt.wgsl
new file mode 100644
index 0000000..9a549c4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-and-even-numbers-from-fragcoord/0-opt.wgsl
@@ -0,0 +1,59 @@
+type Arr = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+fn main_1() {
+  var v : vec2<i32>;
+  let x_39 : f32 = gl_FragCoord.y;
+  let x_41 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if ((x_39 < x_41)) {
+    let x_47 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_48 : f32 = f32(x_47);
+    x_GLF_color = vec4<f32>(x_48, x_48, x_48, x_48);
+  } else {
+    let x_50 : vec4<f32> = gl_FragCoord;
+    let x_53 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_55 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_59 : f32 = x_6.x_GLF_uniform_float_values[2];
+    v = vec2<i32>(((vec2<f32>(x_50.x, x_50.y) - vec2<f32>(x_53, x_55)) * x_59));
+    let x_63 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_65 : i32 = v.y;
+    let x_67 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_70 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_74 : i32 = v.x;
+    let x_76 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_80 : f32 = x_6.x_GLF_uniform_float_values[1];
+    x_GLF_color = vec4<f32>(x_63, f32(((x_65 - x_67) & x_70)), f32((x_74 & x_76)), x_80);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-and-even-numbers-from-fragcoord/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-and-even-numbers-from-fragcoord/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..810c81c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-and-even-numbers-from-fragcoord/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,56 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[2];
+};
+
+void main_1() {
+  int2 v = int2(0, 0);
+  const float x_39 = gl_FragCoord.y;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_41 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  if ((x_39 < x_41)) {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_47 = asint(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const float x_48 = float(x_47);
+    x_GLF_color = float4(x_48, x_48, x_48, x_48);
+  } else {
+    const float4 x_50 = gl_FragCoord;
+    const float x_53 = asfloat(x_6[1].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const float x_55 = asfloat(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const float x_59 = asfloat(x_6[2].x);
+    v = int2(((float2(x_50.x, x_50.y) - float2(x_53, x_55)) * x_59));
+    const float x_63 = asfloat(x_6[1].x);
+    const int x_65 = v.y;
+    const int x_67 = asint(x_8[1].x);
+    const int x_70 = asint(x_8[1].x);
+    const int x_74 = v.x;
+    const int x_76 = asint(x_8[1].x);
+    const float x_80 = asfloat(x_6[1].x);
+    x_GLF_color = float4(x_63, float(((x_65 - x_67) & x_70)), float((x_74 & x_76)), x_80);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-and-even-numbers-from-fragcoord/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-and-even-numbers-from-fragcoord/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..4c716f0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-and-even-numbers-from-fragcoord/0-opt.wgsl.expected.msl
@@ -0,0 +1,66 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_8, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int2 v = 0;
+  float const x_39 = (*(tint_symbol_5)).y;
+  float const x_41 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_39 < x_41)) {
+    int const x_47 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    float const x_48 = float(x_47);
+    *(tint_symbol_6) = float4(x_48, x_48, x_48, x_48);
+  } else {
+    float4 const x_50 = *(tint_symbol_5);
+    float const x_53 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    float const x_55 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    float const x_59 = x_6.x_GLF_uniform_float_values.arr[2].el;
+    v = int2(((float2(x_50.x, x_50.y) - float2(x_53, x_55)) * x_59));
+    float const x_63 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    int const x_65 = v.y;
+    int const x_67 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    int const x_70 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    int const x_74 = v.x;
+    int const x_76 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    float const x_80 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    *(tint_symbol_6) = float4(x_63, float(((x_65 - x_67) & x_70)), float((x_74 & x_76)), x_80);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf1& x_6 [[buffer(1)]], constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_6, x_8, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-and-even-numbers-from-fragcoord/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-and-even-numbers-from-fragcoord/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..c4e8344
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-and-even-numbers-from-fragcoord/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,156 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 101
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_8 "x_8"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %v "v"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf1 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %30 = OpConstantNull %v2int
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_int = OpTypePointer Function %int
+   %main_out = OpTypeStruct %v4float
+         %88 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %23
+         %26 = OpLabel
+          %v = OpVariable %_ptr_Function_v2int Function %30
+         %33 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %34 = OpLoad %float %33
+         %38 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %39 = OpLoad %float %38
+         %40 = OpFOrdLessThan %bool %34 %39
+               OpSelectionMerge %42 None
+               OpBranchConditional %40 %43 %44
+         %43 = OpLabel
+         %46 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %47 = OpLoad %int %46
+         %48 = OpConvertSToF %float %47
+         %49 = OpCompositeConstruct %v4float %48 %48 %48 %48
+               OpStore %x_GLF_color %49
+               OpBranch %42
+         %44 = OpLabel
+         %50 = OpLoad %v4float %gl_FragCoord
+         %52 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %53 = OpLoad %float %52
+         %54 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %55 = OpLoad %float %54
+         %57 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %58 = OpLoad %float %57
+         %61 = OpCompositeExtract %float %50 0
+         %62 = OpCompositeExtract %float %50 1
+         %63 = OpCompositeConstruct %v2float %61 %62
+         %64 = OpCompositeConstruct %v2float %53 %55
+         %65 = OpFSub %v2float %63 %64
+         %66 = OpVectorTimesScalar %v2float %65 %58
+         %59 = OpConvertFToS %v2int %66
+               OpStore %v %59
+         %67 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %68 = OpLoad %float %67
+         %70 = OpAccessChain %_ptr_Function_int %v %uint_1
+         %71 = OpLoad %int %70
+         %72 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %73 = OpLoad %int %72
+         %74 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %75 = OpLoad %int %74
+         %76 = OpAccessChain %_ptr_Function_int %v %uint_0
+         %77 = OpLoad %int %76
+         %78 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %79 = OpLoad %int %78
+         %80 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %81 = OpLoad %float %80
+         %83 = OpISub %int %71 %73
+         %84 = OpBitwiseAnd %int %83 %75
+         %82 = OpConvertSToF %float %84
+         %86 = OpBitwiseAnd %int %77 %79
+         %85 = OpConvertSToF %float %86
+         %87 = OpCompositeConstruct %v4float %68 %82 %85 %81
+               OpStore %x_GLF_color %87
+               OpBranch %42
+         %42 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %88
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %92 = OpLabel
+         %93 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %93
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %23
+         %95 = OpLabel
+         %96 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %96
+         %97 = OpFunctionCall %void %main_1
+         %99 = OpLoad %v4float %x_GLF_color
+        %100 = OpCompositeConstruct %main_out %99
+         %98 = OpFunctionCall %void %tint_symbol_3 %100
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-and-even-numbers-from-fragcoord/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-and-even-numbers-from-fragcoord/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..9a549c4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-and-even-numbers-from-fragcoord/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,59 @@
+type Arr = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+fn main_1() {
+  var v : vec2<i32>;
+  let x_39 : f32 = gl_FragCoord.y;
+  let x_41 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if ((x_39 < x_41)) {
+    let x_47 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_48 : f32 = f32(x_47);
+    x_GLF_color = vec4<f32>(x_48, x_48, x_48, x_48);
+  } else {
+    let x_50 : vec4<f32> = gl_FragCoord;
+    let x_53 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_55 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_59 : f32 = x_6.x_GLF_uniform_float_values[2];
+    v = vec2<i32>(((vec2<f32>(x_50.x, x_50.y) - vec2<f32>(x_53, x_55)) * x_59));
+    let x_63 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_65 : i32 = v.y;
+    let x_67 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_70 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_74 : i32 = v.x;
+    let x_76 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_80 : f32 = x_6.x_GLF_uniform_float_values[1];
+    x_GLF_color = vec4<f32>(x_63, f32(((x_65 - x_67) & x_70)), f32((x_74 & x_76)), x_80);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-acos-ldexp/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-acos-ldexp/0-opt.spvasm
new file mode 100644
index 0000000..5f64bee
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-acos-ldexp/0-opt.spvasm
@@ -0,0 +1,72 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %v "v"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "two"
+               OpName %_ ""
+               OpName %d "d"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+%float_0_100000001 = OpConstant %float 0.100000001
+         %14 = OpConstantComposite %v2float %float_0_100000001 %float_0_100000001
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_float = OpTypePointer Function %float
+%float_1_15927994 = OpConstant %float 1.15927994
+%float_0_64349997 = OpConstant %float 0.64349997
+         %24 = OpConstantComposite %v2float %float_1_15927994 %float_0_64349997
+%float_0_00999999978 = OpConstant %float 0.00999999978
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %31 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %32 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %9
+         %33 = OpLabel
+          %v = OpVariable %_ptr_Function_v2float Function
+          %d = OpVariable %_ptr_Function_float Function
+         %34 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %35 = OpLoad %int %34
+         %36 = OpCompositeConstruct %v2int %35 %int_3
+         %37 = OpExtInst %v2float %1 Ldexp %14 %36
+         %38 = OpExtInst %v2float %1 Acos %37
+               OpStore %v %38
+         %39 = OpLoad %v2float %v
+         %40 = OpExtInst %float %1 Distance %39 %24
+               OpStore %d %40
+         %41 = OpLoad %float %d
+         %42 = OpFOrdLessThan %bool %41 %float_0_00999999978
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %45
+         %44 = OpLabel
+               OpStore %_GLF_color %31
+               OpBranch %43
+         %45 = OpLabel
+               OpStore %_GLF_color %32
+               OpBranch %43
+         %43 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-acos-ldexp/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-acos-ldexp/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..7f591b1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-acos-ldexp/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,32 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2 v = float2(0.0f, 0.0f);
+  float d = 0.0f;
+  const int x_35 = asint(x_6[0].x);
+  v = acos(ldexp(float2(0.100000001f, 0.100000001f), int2(x_35, 3)));
+  d = distance(v, float2(1.159279943f, 0.64349997f));
+  if ((d < 0.01f)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-acos-ldexp/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-acos-ldexp/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..7cbea1f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-acos-ldexp/0-opt.spvasm.expected.msl
@@ -0,0 +1,37 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int two;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float2 v = 0.0f;
+  float d = 0.0f;
+  int const x_35 = x_6.two;
+  v = acos(ldexp(float2(0.100000001f, 0.100000001f), int2(x_35, 3)));
+  float2 const x_39 = v;
+  d = distance(x_39, float2(1.159279943f, 0.64349997f));
+  float const x_41 = d;
+  if ((x_41 < 0.01f)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-acos-ldexp/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-acos-ldexp/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..abe5509
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-acos-ldexp/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,107 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 64
+; Schema: 0
+               OpCapability Shader
+         %29 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "two"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v "v"
+               OpName %d "d"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %19 = OpConstantNull %v2float
+%_ptr_Function_float = OpTypePointer Function %float
+         %22 = OpConstantNull %float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%float_0_100000001 = OpConstant %float 0.100000001
+         %32 = OpConstantComposite %v2float %float_0_100000001 %float_0_100000001
+      %v2int = OpTypeVector %int 2
+      %int_3 = OpConstant %int 3
+%float_1_15927994 = OpConstant %float 1.15927994
+%float_0_64349997 = OpConstant %float 0.64349997
+         %40 = OpConstantComposite %v2float %float_1_15927994 %float_0_64349997
+%float_0_00999999978 = OpConstant %float 0.00999999978
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %50 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %51 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %52 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %v = OpVariable %_ptr_Function_v2float Function %19
+          %d = OpVariable %_ptr_Function_float Function %22
+         %26 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0
+         %27 = OpLoad %int %26
+         %35 = OpCompositeConstruct %v2int %27 %int_3
+         %30 = OpExtInst %v2float %29 Ldexp %32 %35
+         %28 = OpExtInst %v2float %29 Acos %30
+               OpStore %v %28
+         %36 = OpLoad %v2float %v
+         %37 = OpExtInst %float %29 Distance %36 %40
+               OpStore %d %37
+         %41 = OpLoad %float %d
+         %43 = OpFOrdLessThan %bool %41 %float_0_00999999978
+               OpSelectionMerge %45 None
+               OpBranchConditional %43 %46 %47
+         %46 = OpLabel
+               OpStore %x_GLF_color %50
+               OpBranch %45
+         %47 = OpLabel
+               OpStore %x_GLF_color %51
+               OpBranch %45
+         %45 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %52
+%tint_symbol = OpFunctionParameter %main_out
+         %56 = OpLabel
+         %57 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %57
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %59 = OpLabel
+         %60 = OpFunctionCall %void %main_1
+         %62 = OpLoad %v4float %x_GLF_color
+         %63 = OpCompositeConstruct %main_out %62
+         %61 = OpFunctionCall %void %tint_symbol_2 %63
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-acos-ldexp/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-acos-ldexp/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..eb29614
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-acos-ldexp/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,35 @@
+[[block]]
+struct buf0 {
+  two : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v : vec2<f32>;
+  var d : f32;
+  let x_35 : i32 = x_6.two;
+  v = acos(ldexp(vec2<f32>(0.100000001, 0.100000001), vec2<i32>(x_35, 3)));
+  let x_39 : vec2<f32> = v;
+  d = distance(x_39, vec2<f32>(1.159279943, 0.64349997));
+  let x_41 : f32 = d;
+  if ((x_41 < 0.01)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-acos-ldexp/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-acos-ldexp/0-opt.wgsl
new file mode 100644
index 0000000..eb29614
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-acos-ldexp/0-opt.wgsl
@@ -0,0 +1,35 @@
+[[block]]
+struct buf0 {
+  two : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v : vec2<f32>;
+  var d : f32;
+  let x_35 : i32 = x_6.two;
+  v = acos(ldexp(vec2<f32>(0.100000001, 0.100000001), vec2<i32>(x_35, 3)));
+  let x_39 : vec2<f32> = v;
+  d = distance(x_39, vec2<f32>(1.159279943, 0.64349997));
+  let x_41 : f32 = d;
+  if ((x_41 < 0.01)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-acos-ldexp/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-acos-ldexp/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..7f591b1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-acos-ldexp/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,32 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2 v = float2(0.0f, 0.0f);
+  float d = 0.0f;
+  const int x_35 = asint(x_6[0].x);
+  v = acos(ldexp(float2(0.100000001f, 0.100000001f), int2(x_35, 3)));
+  d = distance(v, float2(1.159279943f, 0.64349997f));
+  if ((d < 0.01f)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-acos-ldexp/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-acos-ldexp/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..7cbea1f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-acos-ldexp/0-opt.wgsl.expected.msl
@@ -0,0 +1,37 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int two;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float2 v = 0.0f;
+  float d = 0.0f;
+  int const x_35 = x_6.two;
+  v = acos(ldexp(float2(0.100000001f, 0.100000001f), int2(x_35, 3)));
+  float2 const x_39 = v;
+  d = distance(x_39, float2(1.159279943f, 0.64349997f));
+  float const x_41 = d;
+  if ((x_41 < 0.01f)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-acos-ldexp/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-acos-ldexp/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..abe5509
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-acos-ldexp/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,107 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 64
+; Schema: 0
+               OpCapability Shader
+         %29 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "two"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v "v"
+               OpName %d "d"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %19 = OpConstantNull %v2float
+%_ptr_Function_float = OpTypePointer Function %float
+         %22 = OpConstantNull %float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%float_0_100000001 = OpConstant %float 0.100000001
+         %32 = OpConstantComposite %v2float %float_0_100000001 %float_0_100000001
+      %v2int = OpTypeVector %int 2
+      %int_3 = OpConstant %int 3
+%float_1_15927994 = OpConstant %float 1.15927994
+%float_0_64349997 = OpConstant %float 0.64349997
+         %40 = OpConstantComposite %v2float %float_1_15927994 %float_0_64349997
+%float_0_00999999978 = OpConstant %float 0.00999999978
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %50 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %51 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %52 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %v = OpVariable %_ptr_Function_v2float Function %19
+          %d = OpVariable %_ptr_Function_float Function %22
+         %26 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0
+         %27 = OpLoad %int %26
+         %35 = OpCompositeConstruct %v2int %27 %int_3
+         %30 = OpExtInst %v2float %29 Ldexp %32 %35
+         %28 = OpExtInst %v2float %29 Acos %30
+               OpStore %v %28
+         %36 = OpLoad %v2float %v
+         %37 = OpExtInst %float %29 Distance %36 %40
+               OpStore %d %37
+         %41 = OpLoad %float %d
+         %43 = OpFOrdLessThan %bool %41 %float_0_00999999978
+               OpSelectionMerge %45 None
+               OpBranchConditional %43 %46 %47
+         %46 = OpLabel
+               OpStore %x_GLF_color %50
+               OpBranch %45
+         %47 = OpLabel
+               OpStore %x_GLF_color %51
+               OpBranch %45
+         %45 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %52
+%tint_symbol = OpFunctionParameter %main_out
+         %56 = OpLabel
+         %57 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %57
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %59 = OpLabel
+         %60 = OpFunctionCall %void %main_1
+         %62 = OpLoad %v4float %x_GLF_color
+         %63 = OpCompositeConstruct %main_out %62
+         %61 = OpFunctionCall %void %tint_symbol_2 %63
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-acos-ldexp/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-acos-ldexp/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..eb29614
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-acos-ldexp/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,35 @@
+[[block]]
+struct buf0 {
+  two : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v : vec2<f32>;
+  var d : f32;
+  let x_35 : i32 = x_6.two;
+  v = acos(ldexp(vec2<f32>(0.100000001, 0.100000001), vec2<i32>(x_35, 3)));
+  let x_39 : vec2<f32> = v;
+  d = distance(x_39, vec2<f32>(1.159279943, 0.64349997));
+  let x_41 : f32 = d;
+  if ((x_41 < 0.01)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mix-nan/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mix-nan/0-opt.spvasm
new file mode 100644
index 0000000..835b595
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mix-nan/0-opt.spvasm
@@ -0,0 +1,143 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %nan "nan"
+               OpName %undefined "undefined"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_10 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+        %int = OpTypeInt 32 1
+     %int_n1 = OpConstant %int -1
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+       %buf1 = OpTypeStruct %_arr_int_uint_10
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+       %bool = OpTypeBool
+      %int_9 = OpConstant %int 9
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+      %int_8 = OpConstant %int 8
+       %main = OpFunction %void None %13
+         %40 = OpLabel
+        %nan = OpVariable %_ptr_Function_float Function
+  %undefined = OpVariable %_ptr_Function_v4float Function
+         %41 = OpBitcast %float %int_n1
+               OpStore %nan %41
+         %42 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %43 = OpLoad %int %42
+         %44 = OpConvertSToF %float %43
+         %45 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %46 = OpLoad %int %45
+         %47 = OpConvertSToF %float %46
+         %48 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %49 = OpLoad %int %48
+         %50 = OpConvertSToF %float %49
+         %51 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %52 = OpLoad %int %51
+         %53 = OpConvertSToF %float %52
+         %54 = OpCompositeConstruct %v4float %44 %47 %50 %53
+         %55 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_4
+         %56 = OpLoad %int %55
+         %57 = OpConvertSToF %float %56
+         %58 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_5
+         %59 = OpLoad %int %58
+         %60 = OpConvertSToF %float %59
+         %61 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_6
+         %62 = OpLoad %int %61
+         %63 = OpConvertSToF %float %62
+         %64 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_7
+         %65 = OpLoad %int %64
+         %66 = OpConvertSToF %float %65
+         %67 = OpCompositeConstruct %v4float %57 %60 %63 %66
+         %68 = OpLoad %float %nan
+         %69 = OpCompositeConstruct %v4float %68 %68 %68 %68
+         %70 = OpExtInst %v4float %1 FMix %54 %67 %69
+               OpStore %undefined %70
+         %71 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %72 = OpLoad %int %71
+         %73 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_9
+         %74 = OpLoad %int %73
+         %75 = OpIEqual %bool %72 %74
+         %76 = OpLogicalNot %bool %75
+               OpSelectionMerge %77 None
+               OpBranchConditional %76 %78 %77
+         %78 = OpLabel
+         %79 = OpAccessChain %_ptr_Function_float %undefined %uint_0
+         %80 = OpLoad %float %79
+         %81 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %82 = OpLoad %float %81
+         %83 = OpFOrdGreaterThan %bool %80 %82
+               OpBranch %77
+         %77 = OpLabel
+         %84 = OpPhi %bool %75 %40 %83 %78
+               OpSelectionMerge %85 None
+               OpBranchConditional %84 %86 %87
+         %86 = OpLabel
+         %88 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %89 = OpLoad %int %88
+         %90 = OpConvertSToF %float %89
+         %91 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_8
+         %92 = OpLoad %int %91
+         %93 = OpConvertSToF %float %92
+         %94 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_8
+         %95 = OpLoad %int %94
+         %96 = OpConvertSToF %float %95
+         %97 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %98 = OpLoad %int %97
+         %99 = OpConvertSToF %float %98
+        %100 = OpCompositeConstruct %v4float %90 %93 %96 %99
+               OpStore %_GLF_color %100
+               OpBranch %85
+         %87 = OpLabel
+        %101 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_8
+        %102 = OpLoad %int %101
+        %103 = OpConvertSToF %float %102
+        %104 = OpCompositeConstruct %v4float %103 %103 %103 %103
+               OpStore %_GLF_color %104
+               OpBranch %85
+         %85 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mix-nan/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mix-nan/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..b8826cf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mix-nan/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,66 @@
+cbuffer cbuffer_x_7 : register(b1, space0) {
+  uint4 x_7[10];
+};
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float nan = 0.0f;
+  float4 undefined = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  bool x_83 = false;
+  bool x_84_phi = false;
+  nan = asfloat(-1);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_43 = asint(x_7[scalar_offset / 4][scalar_offset % 4]);
+  const int x_46 = asint(x_7[1].x);
+  const int x_49 = asint(x_7[2].x);
+  const int x_52 = asint(x_7[3].x);
+  const int x_56 = asint(x_7[4].x);
+  const int x_59 = asint(x_7[5].x);
+  const int x_62 = asint(x_7[6].x);
+  const int x_65 = asint(x_7[7].x);
+  const float x_68 = nan;
+  undefined = lerp(float4(float(x_43), float(x_46), float(x_49), float(x_52)), float4(float(x_56), float(x_59), float(x_62), float(x_65)), float4(x_68, x_68, x_68, x_68));
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_72 = asint(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const int x_74 = asint(x_7[9].x);
+  const bool x_75 = (x_72 == x_74);
+  x_84_phi = x_75;
+  if (!(x_75)) {
+    const float x_80 = undefined.x;
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const float x_82 = asfloat(x_9[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    x_83 = (x_80 > x_82);
+    x_84_phi = x_83;
+  }
+  if (x_84_phi) {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_89 = asint(x_7[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const int x_92 = asint(x_7[8].x);
+    const int x_95 = asint(x_7[8].x);
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_98 = asint(x_7[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    x_GLF_color = float4(float(x_89), float(x_92), float(x_95), float(x_98));
+  } else {
+    const int x_102 = asint(x_7[8].x);
+    const float x_103 = float(x_102);
+    x_GLF_color = float4(x_103, x_103, x_103, x_103);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mix-nan/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mix-nan/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..95cc7fb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mix-nan/0-opt.spvasm.expected.msl
@@ -0,0 +1,79 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[10];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_7, constant buf0& x_9, thread float4* const tint_symbol_4) {
+  float nan = 0.0f;
+  float4 undefined = 0.0f;
+  bool x_83 = false;
+  bool x_84_phi = false;
+  nan = as_type<float>(-1);
+  int const x_43 = x_7.x_GLF_uniform_int_values.arr[0].el;
+  int const x_46 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  int const x_49 = x_7.x_GLF_uniform_int_values.arr[2].el;
+  int const x_52 = x_7.x_GLF_uniform_int_values.arr[3].el;
+  int const x_56 = x_7.x_GLF_uniform_int_values.arr[4].el;
+  int const x_59 = x_7.x_GLF_uniform_int_values.arr[5].el;
+  int const x_62 = x_7.x_GLF_uniform_int_values.arr[6].el;
+  int const x_65 = x_7.x_GLF_uniform_int_values.arr[7].el;
+  float const x_68 = nan;
+  undefined = mix(float4(float(x_43), float(x_46), float(x_49), float(x_52)), float4(float(x_56), float(x_59), float(x_62), float(x_65)), float4(x_68, x_68, x_68, x_68));
+  int const x_72 = x_7.x_GLF_uniform_int_values.arr[0].el;
+  int const x_74 = x_7.x_GLF_uniform_int_values.arr[9].el;
+  bool const x_75 = (x_72 == x_74);
+  x_84_phi = x_75;
+  if (!(x_75)) {
+    float const x_80 = undefined.x;
+    float const x_82 = x_9.x_GLF_uniform_float_values.arr[0].el;
+    x_83 = (x_80 > x_82);
+    x_84_phi = x_83;
+  }
+  bool const x_84 = x_84_phi;
+  if (x_84) {
+    int const x_89 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_92 = x_7.x_GLF_uniform_int_values.arr[8].el;
+    int const x_95 = x_7.x_GLF_uniform_int_values.arr[8].el;
+    int const x_98 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_89), float(x_92), float(x_95), float(x_98));
+  } else {
+    int const x_102 = x_7.x_GLF_uniform_int_values.arr[8].el;
+    float const x_103 = float(x_102);
+    *(tint_symbol_4) = float4(x_103, x_103, x_103, x_103);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_7 [[buffer(1)]], constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mix-nan/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mix-nan/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..a076bbb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mix-nan/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,187 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 126
+; Schema: 0
+               OpCapability Shader
+         %64 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %nan "nan"
+               OpName %undefined "undefined"
+               OpName %x_83 "x_83"
+               OpName %x_84_phi "x_84_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+       %buf1 = OpTypeStruct %_arr_int_uint_10
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_7 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %float = OpTypeFloat 32
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %26 = OpConstantNull %float
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %32 = OpConstantNull %bool
+     %int_n1 = OpConstant %int -1
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_9 = OpConstant %int 9
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_8 = OpConstant %int 8
+   %main_out = OpTypeStruct %v4float
+        %114 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+        %nan = OpVariable %_ptr_Function_float Function %26
+  %undefined = OpVariable %_ptr_Function_v4float Function %17
+       %x_83 = OpVariable %_ptr_Function_bool Function %32
+   %x_84_phi = OpVariable %_ptr_Function_bool Function %32
+         %34 = OpBitcast %float %int_n1
+               OpStore %nan %34
+         %39 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %40 = OpLoad %int %39
+         %42 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %43 = OpLoad %int %42
+         %45 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %46 = OpLoad %int %45
+         %48 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_3
+         %49 = OpLoad %int %48
+         %51 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_4
+         %52 = OpLoad %int %51
+         %54 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_5
+         %55 = OpLoad %int %54
+         %57 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_6
+         %58 = OpLoad %int %57
+         %60 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_7
+         %61 = OpLoad %int %60
+         %62 = OpLoad %float %nan
+         %65 = OpConvertSToF %float %40
+         %66 = OpConvertSToF %float %43
+         %67 = OpConvertSToF %float %46
+         %68 = OpConvertSToF %float %49
+         %69 = OpCompositeConstruct %v4float %65 %66 %67 %68
+         %70 = OpConvertSToF %float %52
+         %71 = OpConvertSToF %float %55
+         %72 = OpConvertSToF %float %58
+         %73 = OpConvertSToF %float %61
+         %74 = OpCompositeConstruct %v4float %70 %71 %72 %73
+         %75 = OpCompositeConstruct %v4float %62 %62 %62 %62
+         %63 = OpExtInst %v4float %64 FMix %69 %74 %75
+               OpStore %undefined %63
+         %76 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %77 = OpLoad %int %76
+         %79 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_9
+         %80 = OpLoad %int %79
+         %81 = OpIEqual %bool %77 %80
+               OpStore %x_84_phi %81
+         %82 = OpLogicalNot %bool %81
+               OpSelectionMerge %83 None
+               OpBranchConditional %82 %84 %83
+         %84 = OpLabel
+         %85 = OpAccessChain %_ptr_Function_float %undefined %uint_0
+         %86 = OpLoad %float %85
+         %88 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_0
+         %89 = OpLoad %float %88
+         %90 = OpFOrdGreaterThan %bool %86 %89
+               OpStore %x_83 %90
+         %91 = OpLoad %bool %x_83
+               OpStore %x_84_phi %91
+               OpBranch %83
+         %83 = OpLabel
+         %92 = OpLoad %bool %x_84_phi
+               OpSelectionMerge %93 None
+               OpBranchConditional %92 %94 %95
+         %94 = OpLabel
+         %96 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %97 = OpLoad %int %96
+         %99 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_8
+        %100 = OpLoad %int %99
+        %101 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_8
+        %102 = OpLoad %int %101
+        %103 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+        %104 = OpLoad %int %103
+        %105 = OpConvertSToF %float %97
+        %106 = OpConvertSToF %float %100
+        %107 = OpConvertSToF %float %102
+        %108 = OpConvertSToF %float %104
+        %109 = OpCompositeConstruct %v4float %105 %106 %107 %108
+               OpStore %x_GLF_color %109
+               OpBranch %93
+         %95 = OpLabel
+        %110 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_8
+        %111 = OpLoad %int %110
+        %112 = OpConvertSToF %float %111
+        %113 = OpCompositeConstruct %v4float %112 %112 %112 %112
+               OpStore %x_GLF_color %113
+               OpBranch %93
+         %93 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %114
+%tint_symbol = OpFunctionParameter %main_out
+        %118 = OpLabel
+        %119 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %119
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %121 = OpLabel
+        %122 = OpFunctionCall %void %main_1
+        %124 = OpLoad %v4float %x_GLF_color
+        %125 = OpCompositeConstruct %main_out %124
+        %123 = OpFunctionCall %void %tint_symbol_2 %125
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mix-nan/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mix-nan/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..a59f8d8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mix-nan/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,71 @@
+type Arr = [[stride(16)]] array<i32, 10>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var nan : f32;
+  var undefined : vec4<f32>;
+  var x_83 : bool;
+  var x_84_phi : bool;
+  nan = bitcast<f32>(-1);
+  let x_43 : i32 = x_7.x_GLF_uniform_int_values[0];
+  let x_46 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_49 : i32 = x_7.x_GLF_uniform_int_values[2];
+  let x_52 : i32 = x_7.x_GLF_uniform_int_values[3];
+  let x_56 : i32 = x_7.x_GLF_uniform_int_values[4];
+  let x_59 : i32 = x_7.x_GLF_uniform_int_values[5];
+  let x_62 : i32 = x_7.x_GLF_uniform_int_values[6];
+  let x_65 : i32 = x_7.x_GLF_uniform_int_values[7];
+  let x_68 : f32 = nan;
+  undefined = mix(vec4<f32>(f32(x_43), f32(x_46), f32(x_49), f32(x_52)), vec4<f32>(f32(x_56), f32(x_59), f32(x_62), f32(x_65)), vec4<f32>(x_68, x_68, x_68, x_68));
+  let x_72 : i32 = x_7.x_GLF_uniform_int_values[0];
+  let x_74 : i32 = x_7.x_GLF_uniform_int_values[9];
+  let x_75 : bool = (x_72 == x_74);
+  x_84_phi = x_75;
+  if (!(x_75)) {
+    let x_80 : f32 = undefined.x;
+    let x_82 : f32 = x_9.x_GLF_uniform_float_values[0];
+    x_83 = (x_80 > x_82);
+    x_84_phi = x_83;
+  }
+  let x_84 : bool = x_84_phi;
+  if (x_84) {
+    let x_89 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_92 : i32 = x_7.x_GLF_uniform_int_values[8];
+    let x_95 : i32 = x_7.x_GLF_uniform_int_values[8];
+    let x_98 : i32 = x_7.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_89), f32(x_92), f32(x_95), f32(x_98));
+  } else {
+    let x_102 : i32 = x_7.x_GLF_uniform_int_values[8];
+    let x_103 : f32 = f32(x_102);
+    x_GLF_color = vec4<f32>(x_103, x_103, x_103, x_103);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mix-nan/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mix-nan/0-opt.wgsl
new file mode 100644
index 0000000..a59f8d8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mix-nan/0-opt.wgsl
@@ -0,0 +1,71 @@
+type Arr = [[stride(16)]] array<i32, 10>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var nan : f32;
+  var undefined : vec4<f32>;
+  var x_83 : bool;
+  var x_84_phi : bool;
+  nan = bitcast<f32>(-1);
+  let x_43 : i32 = x_7.x_GLF_uniform_int_values[0];
+  let x_46 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_49 : i32 = x_7.x_GLF_uniform_int_values[2];
+  let x_52 : i32 = x_7.x_GLF_uniform_int_values[3];
+  let x_56 : i32 = x_7.x_GLF_uniform_int_values[4];
+  let x_59 : i32 = x_7.x_GLF_uniform_int_values[5];
+  let x_62 : i32 = x_7.x_GLF_uniform_int_values[6];
+  let x_65 : i32 = x_7.x_GLF_uniform_int_values[7];
+  let x_68 : f32 = nan;
+  undefined = mix(vec4<f32>(f32(x_43), f32(x_46), f32(x_49), f32(x_52)), vec4<f32>(f32(x_56), f32(x_59), f32(x_62), f32(x_65)), vec4<f32>(x_68, x_68, x_68, x_68));
+  let x_72 : i32 = x_7.x_GLF_uniform_int_values[0];
+  let x_74 : i32 = x_7.x_GLF_uniform_int_values[9];
+  let x_75 : bool = (x_72 == x_74);
+  x_84_phi = x_75;
+  if (!(x_75)) {
+    let x_80 : f32 = undefined.x;
+    let x_82 : f32 = x_9.x_GLF_uniform_float_values[0];
+    x_83 = (x_80 > x_82);
+    x_84_phi = x_83;
+  }
+  let x_84 : bool = x_84_phi;
+  if (x_84) {
+    let x_89 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_92 : i32 = x_7.x_GLF_uniform_int_values[8];
+    let x_95 : i32 = x_7.x_GLF_uniform_int_values[8];
+    let x_98 : i32 = x_7.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_89), f32(x_92), f32(x_95), f32(x_98));
+  } else {
+    let x_102 : i32 = x_7.x_GLF_uniform_int_values[8];
+    let x_103 : f32 = f32(x_102);
+    x_GLF_color = vec4<f32>(x_103, x_103, x_103, x_103);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mix-nan/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mix-nan/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..b8826cf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mix-nan/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,66 @@
+cbuffer cbuffer_x_7 : register(b1, space0) {
+  uint4 x_7[10];
+};
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float nan = 0.0f;
+  float4 undefined = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  bool x_83 = false;
+  bool x_84_phi = false;
+  nan = asfloat(-1);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_43 = asint(x_7[scalar_offset / 4][scalar_offset % 4]);
+  const int x_46 = asint(x_7[1].x);
+  const int x_49 = asint(x_7[2].x);
+  const int x_52 = asint(x_7[3].x);
+  const int x_56 = asint(x_7[4].x);
+  const int x_59 = asint(x_7[5].x);
+  const int x_62 = asint(x_7[6].x);
+  const int x_65 = asint(x_7[7].x);
+  const float x_68 = nan;
+  undefined = lerp(float4(float(x_43), float(x_46), float(x_49), float(x_52)), float4(float(x_56), float(x_59), float(x_62), float(x_65)), float4(x_68, x_68, x_68, x_68));
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_72 = asint(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const int x_74 = asint(x_7[9].x);
+  const bool x_75 = (x_72 == x_74);
+  x_84_phi = x_75;
+  if (!(x_75)) {
+    const float x_80 = undefined.x;
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const float x_82 = asfloat(x_9[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    x_83 = (x_80 > x_82);
+    x_84_phi = x_83;
+  }
+  if (x_84_phi) {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_89 = asint(x_7[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const int x_92 = asint(x_7[8].x);
+    const int x_95 = asint(x_7[8].x);
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_98 = asint(x_7[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    x_GLF_color = float4(float(x_89), float(x_92), float(x_95), float(x_98));
+  } else {
+    const int x_102 = asint(x_7[8].x);
+    const float x_103 = float(x_102);
+    x_GLF_color = float4(x_103, x_103, x_103, x_103);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mix-nan/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mix-nan/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..95cc7fb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mix-nan/0-opt.wgsl.expected.msl
@@ -0,0 +1,79 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[10];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_7, constant buf0& x_9, thread float4* const tint_symbol_4) {
+  float nan = 0.0f;
+  float4 undefined = 0.0f;
+  bool x_83 = false;
+  bool x_84_phi = false;
+  nan = as_type<float>(-1);
+  int const x_43 = x_7.x_GLF_uniform_int_values.arr[0].el;
+  int const x_46 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  int const x_49 = x_7.x_GLF_uniform_int_values.arr[2].el;
+  int const x_52 = x_7.x_GLF_uniform_int_values.arr[3].el;
+  int const x_56 = x_7.x_GLF_uniform_int_values.arr[4].el;
+  int const x_59 = x_7.x_GLF_uniform_int_values.arr[5].el;
+  int const x_62 = x_7.x_GLF_uniform_int_values.arr[6].el;
+  int const x_65 = x_7.x_GLF_uniform_int_values.arr[7].el;
+  float const x_68 = nan;
+  undefined = mix(float4(float(x_43), float(x_46), float(x_49), float(x_52)), float4(float(x_56), float(x_59), float(x_62), float(x_65)), float4(x_68, x_68, x_68, x_68));
+  int const x_72 = x_7.x_GLF_uniform_int_values.arr[0].el;
+  int const x_74 = x_7.x_GLF_uniform_int_values.arr[9].el;
+  bool const x_75 = (x_72 == x_74);
+  x_84_phi = x_75;
+  if (!(x_75)) {
+    float const x_80 = undefined.x;
+    float const x_82 = x_9.x_GLF_uniform_float_values.arr[0].el;
+    x_83 = (x_80 > x_82);
+    x_84_phi = x_83;
+  }
+  bool const x_84 = x_84_phi;
+  if (x_84) {
+    int const x_89 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_92 = x_7.x_GLF_uniform_int_values.arr[8].el;
+    int const x_95 = x_7.x_GLF_uniform_int_values.arr[8].el;
+    int const x_98 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_89), float(x_92), float(x_95), float(x_98));
+  } else {
+    int const x_102 = x_7.x_GLF_uniform_int_values.arr[8].el;
+    float const x_103 = float(x_102);
+    *(tint_symbol_4) = float4(x_103, x_103, x_103, x_103);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_7 [[buffer(1)]], constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mix-nan/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mix-nan/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..a076bbb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mix-nan/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,187 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 126
+; Schema: 0
+               OpCapability Shader
+         %64 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %nan "nan"
+               OpName %undefined "undefined"
+               OpName %x_83 "x_83"
+               OpName %x_84_phi "x_84_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+       %buf1 = OpTypeStruct %_arr_int_uint_10
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_7 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %float = OpTypeFloat 32
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %26 = OpConstantNull %float
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %32 = OpConstantNull %bool
+     %int_n1 = OpConstant %int -1
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_9 = OpConstant %int 9
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_8 = OpConstant %int 8
+   %main_out = OpTypeStruct %v4float
+        %114 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+        %nan = OpVariable %_ptr_Function_float Function %26
+  %undefined = OpVariable %_ptr_Function_v4float Function %17
+       %x_83 = OpVariable %_ptr_Function_bool Function %32
+   %x_84_phi = OpVariable %_ptr_Function_bool Function %32
+         %34 = OpBitcast %float %int_n1
+               OpStore %nan %34
+         %39 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %40 = OpLoad %int %39
+         %42 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %43 = OpLoad %int %42
+         %45 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %46 = OpLoad %int %45
+         %48 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_3
+         %49 = OpLoad %int %48
+         %51 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_4
+         %52 = OpLoad %int %51
+         %54 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_5
+         %55 = OpLoad %int %54
+         %57 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_6
+         %58 = OpLoad %int %57
+         %60 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_7
+         %61 = OpLoad %int %60
+         %62 = OpLoad %float %nan
+         %65 = OpConvertSToF %float %40
+         %66 = OpConvertSToF %float %43
+         %67 = OpConvertSToF %float %46
+         %68 = OpConvertSToF %float %49
+         %69 = OpCompositeConstruct %v4float %65 %66 %67 %68
+         %70 = OpConvertSToF %float %52
+         %71 = OpConvertSToF %float %55
+         %72 = OpConvertSToF %float %58
+         %73 = OpConvertSToF %float %61
+         %74 = OpCompositeConstruct %v4float %70 %71 %72 %73
+         %75 = OpCompositeConstruct %v4float %62 %62 %62 %62
+         %63 = OpExtInst %v4float %64 FMix %69 %74 %75
+               OpStore %undefined %63
+         %76 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %77 = OpLoad %int %76
+         %79 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_9
+         %80 = OpLoad %int %79
+         %81 = OpIEqual %bool %77 %80
+               OpStore %x_84_phi %81
+         %82 = OpLogicalNot %bool %81
+               OpSelectionMerge %83 None
+               OpBranchConditional %82 %84 %83
+         %84 = OpLabel
+         %85 = OpAccessChain %_ptr_Function_float %undefined %uint_0
+         %86 = OpLoad %float %85
+         %88 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_0
+         %89 = OpLoad %float %88
+         %90 = OpFOrdGreaterThan %bool %86 %89
+               OpStore %x_83 %90
+         %91 = OpLoad %bool %x_83
+               OpStore %x_84_phi %91
+               OpBranch %83
+         %83 = OpLabel
+         %92 = OpLoad %bool %x_84_phi
+               OpSelectionMerge %93 None
+               OpBranchConditional %92 %94 %95
+         %94 = OpLabel
+         %96 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %97 = OpLoad %int %96
+         %99 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_8
+        %100 = OpLoad %int %99
+        %101 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_8
+        %102 = OpLoad %int %101
+        %103 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+        %104 = OpLoad %int %103
+        %105 = OpConvertSToF %float %97
+        %106 = OpConvertSToF %float %100
+        %107 = OpConvertSToF %float %102
+        %108 = OpConvertSToF %float %104
+        %109 = OpCompositeConstruct %v4float %105 %106 %107 %108
+               OpStore %x_GLF_color %109
+               OpBranch %93
+         %95 = OpLabel
+        %110 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_8
+        %111 = OpLoad %int %110
+        %112 = OpConvertSToF %float %111
+        %113 = OpCompositeConstruct %v4float %112 %112 %112 %112
+               OpStore %x_GLF_color %113
+               OpBranch %93
+         %93 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %114
+%tint_symbol = OpFunctionParameter %main_out
+        %118 = OpLabel
+        %119 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %119
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %121 = OpLabel
+        %122 = OpFunctionCall %void %main_1
+        %124 = OpLoad %v4float %x_GLF_color
+        %125 = OpCompositeConstruct %main_out %124
+        %123 = OpFunctionCall %void %tint_symbol_2 %125
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mix-nan/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mix-nan/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..a59f8d8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mix-nan/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,71 @@
+type Arr = [[stride(16)]] array<i32, 10>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var nan : f32;
+  var undefined : vec4<f32>;
+  var x_83 : bool;
+  var x_84_phi : bool;
+  nan = bitcast<f32>(-1);
+  let x_43 : i32 = x_7.x_GLF_uniform_int_values[0];
+  let x_46 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_49 : i32 = x_7.x_GLF_uniform_int_values[2];
+  let x_52 : i32 = x_7.x_GLF_uniform_int_values[3];
+  let x_56 : i32 = x_7.x_GLF_uniform_int_values[4];
+  let x_59 : i32 = x_7.x_GLF_uniform_int_values[5];
+  let x_62 : i32 = x_7.x_GLF_uniform_int_values[6];
+  let x_65 : i32 = x_7.x_GLF_uniform_int_values[7];
+  let x_68 : f32 = nan;
+  undefined = mix(vec4<f32>(f32(x_43), f32(x_46), f32(x_49), f32(x_52)), vec4<f32>(f32(x_56), f32(x_59), f32(x_62), f32(x_65)), vec4<f32>(x_68, x_68, x_68, x_68));
+  let x_72 : i32 = x_7.x_GLF_uniform_int_values[0];
+  let x_74 : i32 = x_7.x_GLF_uniform_int_values[9];
+  let x_75 : bool = (x_72 == x_74);
+  x_84_phi = x_75;
+  if (!(x_75)) {
+    let x_80 : f32 = undefined.x;
+    let x_82 : f32 = x_9.x_GLF_uniform_float_values[0];
+    x_83 = (x_80 > x_82);
+    x_84_phi = x_83;
+  }
+  let x_84 : bool = x_84_phi;
+  if (x_84) {
+    let x_89 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_92 : i32 = x_7.x_GLF_uniform_int_values[8];
+    let x_95 : i32 = x_7.x_GLF_uniform_int_values[8];
+    let x_98 : i32 = x_7.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_89), f32(x_92), f32(x_95), f32(x_98));
+  } else {
+    let x_102 : i32 = x_7.x_GLF_uniform_int_values[8];
+    let x_103 : f32 = f32(x_102);
+    x_GLF_color = vec4<f32>(x_103, x_103, x_103, x_103);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mod-zero/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mod-zero/0-opt.spvasm
new file mode 100644
index 0000000..995d851
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mod-zero/0-opt.spvasm
@@ -0,0 +1,114 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %undefined "undefined"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf1 0 RelaxedPrecision
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %10 RelaxedPrecision
+               OpDecorate %11 RelaxedPrecision
+               OpDecorate %12 RelaxedPrecision
+               OpDecorate %13 RelaxedPrecision
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %15 RelaxedPrecision
+               OpDecorate %16 RelaxedPrecision
+               OpDecorate %17 RelaxedPrecision
+               OpDecorate %18 RelaxedPrecision
+               OpDecorate %19 RelaxedPrecision
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_5 = OpConstant %float 5
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %21
+         %39 = OpLabel
+  %undefined = OpVariable %_ptr_Function_float Function
+         %40 = OpFMod %float %float_5 %float_0
+               OpStore %undefined %40
+         %41 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %10 = OpLoad %int %41
+         %42 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %11 = OpLoad %int %42
+         %43 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %12 = OpLoad %int %43
+         %13 = OpIAdd %int %11 %12
+         %44 = OpIEqual %bool %10 %13
+         %45 = OpLogicalNot %bool %44
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %46
+         %47 = OpLabel
+         %48 = OpLoad %float %undefined
+         %49 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %50 = OpLoad %float %49
+         %51 = OpFOrdGreaterThan %bool %48 %50
+               OpBranch %46
+         %46 = OpLabel
+         %52 = OpPhi %bool %44 %39 %51 %47
+               OpSelectionMerge %53 None
+               OpBranchConditional %52 %54 %55
+         %54 = OpLabel
+         %56 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %15 = OpLoad %int %56
+         %57 = OpConvertSToF %float %15
+         %58 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %16 = OpLoad %int %58
+         %59 = OpConvertSToF %float %16
+         %60 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %17 = OpLoad %int %60
+         %61 = OpConvertSToF %float %17
+         %62 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %18 = OpLoad %int %62
+         %63 = OpConvertSToF %float %18
+         %64 = OpCompositeConstruct %v4float %57 %59 %61 %63
+               OpStore %_GLF_color %64
+               OpBranch %53
+         %55 = OpLabel
+         %65 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %19 = OpLoad %int %65
+         %66 = OpConvertSToF %float %19
+         %67 = OpCompositeConstruct %v4float %66 %66 %66 %66
+               OpStore %_GLF_color %67
+               OpBranch %53
+         %53 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mod-zero/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mod-zero/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..84838ef
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mod-zero/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,56 @@
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[3];
+};
+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);
+
+void main_1() {
+  float undefined = 0.0f;
+  bool x_51 = false;
+  bool x_52_phi = false;
+  undefined = (5.0f % 0.0f);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_10 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_11 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const int x_12 = asint(x_6[1].x);
+  const bool x_44 = (x_10 == (x_11 + x_12));
+  x_52_phi = x_44;
+  if (!(x_44)) {
+    const float x_48 = undefined;
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const float x_50 = asfloat(x_8[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    x_51 = (x_48 > x_50);
+    x_52_phi = x_51;
+  }
+  if (x_52_phi) {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_15 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const int x_16 = asint(x_6[1].x);
+    const int x_17 = asint(x_6[1].x);
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_18 = asint(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    x_GLF_color = float4(float(x_15), float(x_16), float(x_17), float(x_18));
+  } else {
+    const int x_19 = asint(x_6[1].x);
+    const float x_66 = float(x_19);
+    x_GLF_color = float4(x_66, x_66, x_66, x_66);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mod-zero/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mod-zero/0-opt.spvasm.expected.msl
new file mode 100755
index 0000000..ad2c3ca
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mod-zero/0-opt.spvasm.expected.msl
@@ -0,0 +1,76 @@
+SKIP: FAILED
+
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_8, thread float4* const tint_symbol_4) {
+  float undefined = 0.0f;
+  bool x_51 = false;
+  bool x_52_phi = false;
+  undefined = (5.0f % 0.0f);
+  int const x_10 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_11 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_12 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  bool const x_44 = (x_10 == (x_11 + x_12));
+  x_52_phi = x_44;
+  if (!(x_44)) {
+    float const x_48 = undefined;
+    float const x_50 = x_8.x_GLF_uniform_float_values.arr[0].el;
+    x_51 = (x_48 > x_50);
+    x_52_phi = x_51;
+  }
+  bool const x_52 = x_52_phi;
+  if (x_52) {
+    int const x_15 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_16 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_17 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_18 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_15), float(x_16), float(x_17), float(x_18));
+  } else {
+    int const x_19 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    float const x_66 = float(x_19);
+    *(tint_symbol_4) = float4(x_66, x_66, x_66, x_66);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
+T:\tmp\u348.0.metal:35:21: error: invalid operands to binary expression ('float' and 'float')
+  undefined = (5.0f % 0.0f);
+               ~~~~ ^ ~~~~
+1 error generated.
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mod-zero/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mod-zero/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..042259a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mod-zero/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,148 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 89
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %undefined "undefined"
+               OpName %x_51 "x_51"
+               OpName %x_52_phi "x_52_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %float = OpTypeFloat 32
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %26 = OpConstantNull %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %30 = OpConstantNull %bool
+    %float_5 = OpConstant %float 5
+    %float_0 = OpConstant %float 0
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+   %main_out = OpTypeStruct %v4float
+         %77 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+  %undefined = OpVariable %_ptr_Function_float Function %26
+       %x_51 = OpVariable %_ptr_Function_bool Function %30
+   %x_52_phi = OpVariable %_ptr_Function_bool Function %30
+         %34 = OpFMod %float %float_5 %float_0
+               OpStore %undefined %34
+         %38 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %39 = OpLoad %int %38
+         %40 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %41 = OpLoad %int %40
+         %43 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %44 = OpLoad %int %43
+         %45 = OpIAdd %int %41 %44
+         %46 = OpIEqual %bool %39 %45
+               OpStore %x_52_phi %46
+         %47 = OpLogicalNot %bool %46
+               OpSelectionMerge %48 None
+               OpBranchConditional %47 %49 %48
+         %49 = OpLabel
+         %50 = OpLoad %float %undefined
+         %52 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %53 = OpLoad %float %52
+         %54 = OpFOrdGreaterThan %bool %50 %53
+               OpStore %x_51 %54
+         %55 = OpLoad %bool %x_51
+               OpStore %x_52_phi %55
+               OpBranch %48
+         %48 = OpLabel
+         %56 = OpLoad %bool %x_52_phi
+               OpSelectionMerge %57 None
+               OpBranchConditional %56 %58 %59
+         %58 = OpLabel
+         %60 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %61 = OpLoad %int %60
+         %62 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %63 = OpLoad %int %62
+         %64 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %65 = OpLoad %int %64
+         %66 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %67 = OpLoad %int %66
+         %68 = OpConvertSToF %float %61
+         %69 = OpConvertSToF %float %63
+         %70 = OpConvertSToF %float %65
+         %71 = OpConvertSToF %float %67
+         %72 = OpCompositeConstruct %v4float %68 %69 %70 %71
+               OpStore %x_GLF_color %72
+               OpBranch %57
+         %59 = OpLabel
+         %73 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %74 = OpLoad %int %73
+         %75 = OpConvertSToF %float %74
+         %76 = OpCompositeConstruct %v4float %75 %75 %75 %75
+               OpStore %x_GLF_color %76
+               OpBranch %57
+         %57 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %77
+%tint_symbol = OpFunctionParameter %main_out
+         %81 = OpLabel
+         %82 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %82
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+         %84 = OpLabel
+         %85 = OpFunctionCall %void %main_1
+         %87 = OpLoad %v4float %x_GLF_color
+         %88 = OpCompositeConstruct %main_out %87
+         %86 = OpFunctionCall %void %tint_symbol_2 %88
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mod-zero/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mod-zero/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..ee6f6f7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mod-zero/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,61 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var undefined : f32;
+  var x_51 : bool;
+  var x_52_phi : bool;
+  undefined = (5.0 % 0.0);
+  let x_10 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_11 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_12 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_44 : bool = (x_10 == (x_11 + x_12));
+  x_52_phi = x_44;
+  if (!(x_44)) {
+    let x_48 : f32 = undefined;
+    let x_50 : f32 = x_8.x_GLF_uniform_float_values[0];
+    x_51 = (x_48 > x_50);
+    x_52_phi = x_51;
+  }
+  let x_52 : bool = x_52_phi;
+  if (x_52) {
+    let x_15 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_16 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_17 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_18 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_15), f32(x_16), f32(x_17), f32(x_18));
+  } else {
+    let x_19 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_66 : f32 = f32(x_19);
+    x_GLF_color = vec4<f32>(x_66, x_66, x_66, x_66);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mod-zero/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mod-zero/0-opt.wgsl
new file mode 100644
index 0000000..ee6f6f7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mod-zero/0-opt.wgsl
@@ -0,0 +1,61 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var undefined : f32;
+  var x_51 : bool;
+  var x_52_phi : bool;
+  undefined = (5.0 % 0.0);
+  let x_10 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_11 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_12 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_44 : bool = (x_10 == (x_11 + x_12));
+  x_52_phi = x_44;
+  if (!(x_44)) {
+    let x_48 : f32 = undefined;
+    let x_50 : f32 = x_8.x_GLF_uniform_float_values[0];
+    x_51 = (x_48 > x_50);
+    x_52_phi = x_51;
+  }
+  let x_52 : bool = x_52_phi;
+  if (x_52) {
+    let x_15 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_16 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_17 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_18 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_15), f32(x_16), f32(x_17), f32(x_18));
+  } else {
+    let x_19 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_66 : f32 = f32(x_19);
+    x_GLF_color = vec4<f32>(x_66, x_66, x_66, x_66);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mod-zero/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mod-zero/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..84838ef
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mod-zero/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,56 @@
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[3];
+};
+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);
+
+void main_1() {
+  float undefined = 0.0f;
+  bool x_51 = false;
+  bool x_52_phi = false;
+  undefined = (5.0f % 0.0f);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_10 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_11 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const int x_12 = asint(x_6[1].x);
+  const bool x_44 = (x_10 == (x_11 + x_12));
+  x_52_phi = x_44;
+  if (!(x_44)) {
+    const float x_48 = undefined;
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const float x_50 = asfloat(x_8[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    x_51 = (x_48 > x_50);
+    x_52_phi = x_51;
+  }
+  if (x_52_phi) {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_15 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const int x_16 = asint(x_6[1].x);
+    const int x_17 = asint(x_6[1].x);
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_18 = asint(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    x_GLF_color = float4(float(x_15), float(x_16), float(x_17), float(x_18));
+  } else {
+    const int x_19 = asint(x_6[1].x);
+    const float x_66 = float(x_19);
+    x_GLF_color = float4(x_66, x_66, x_66, x_66);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mod-zero/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mod-zero/0-opt.wgsl.expected.msl
new file mode 100755
index 0000000..201dc73
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mod-zero/0-opt.wgsl.expected.msl
@@ -0,0 +1,76 @@
+SKIP: FAILED
+
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_8, thread float4* const tint_symbol_4) {
+  float undefined = 0.0f;
+  bool x_51 = false;
+  bool x_52_phi = false;
+  undefined = (5.0f % 0.0f);
+  int const x_10 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_11 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_12 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  bool const x_44 = (x_10 == (x_11 + x_12));
+  x_52_phi = x_44;
+  if (!(x_44)) {
+    float const x_48 = undefined;
+    float const x_50 = x_8.x_GLF_uniform_float_values.arr[0].el;
+    x_51 = (x_48 > x_50);
+    x_52_phi = x_51;
+  }
+  bool const x_52 = x_52_phi;
+  if (x_52) {
+    int const x_15 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_16 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_17 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_18 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_15), float(x_16), float(x_17), float(x_18));
+  } else {
+    int const x_19 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    float const x_66 = float(x_19);
+    *(tint_symbol_4) = float4(x_66, x_66, x_66, x_66);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
+T:\tmp\u5b0.0.metal:35:21: error: invalid operands to binary expression ('float' and 'float')
+  undefined = (5.0f % 0.0f);
+               ~~~~ ^ ~~~~
+1 error generated.
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mod-zero/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mod-zero/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..042259a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mod-zero/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,148 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 89
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %undefined "undefined"
+               OpName %x_51 "x_51"
+               OpName %x_52_phi "x_52_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %float = OpTypeFloat 32
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %26 = OpConstantNull %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %30 = OpConstantNull %bool
+    %float_5 = OpConstant %float 5
+    %float_0 = OpConstant %float 0
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+   %main_out = OpTypeStruct %v4float
+         %77 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+  %undefined = OpVariable %_ptr_Function_float Function %26
+       %x_51 = OpVariable %_ptr_Function_bool Function %30
+   %x_52_phi = OpVariable %_ptr_Function_bool Function %30
+         %34 = OpFMod %float %float_5 %float_0
+               OpStore %undefined %34
+         %38 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %39 = OpLoad %int %38
+         %40 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %41 = OpLoad %int %40
+         %43 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %44 = OpLoad %int %43
+         %45 = OpIAdd %int %41 %44
+         %46 = OpIEqual %bool %39 %45
+               OpStore %x_52_phi %46
+         %47 = OpLogicalNot %bool %46
+               OpSelectionMerge %48 None
+               OpBranchConditional %47 %49 %48
+         %49 = OpLabel
+         %50 = OpLoad %float %undefined
+         %52 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %53 = OpLoad %float %52
+         %54 = OpFOrdGreaterThan %bool %50 %53
+               OpStore %x_51 %54
+         %55 = OpLoad %bool %x_51
+               OpStore %x_52_phi %55
+               OpBranch %48
+         %48 = OpLabel
+         %56 = OpLoad %bool %x_52_phi
+               OpSelectionMerge %57 None
+               OpBranchConditional %56 %58 %59
+         %58 = OpLabel
+         %60 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %61 = OpLoad %int %60
+         %62 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %63 = OpLoad %int %62
+         %64 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %65 = OpLoad %int %64
+         %66 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %67 = OpLoad %int %66
+         %68 = OpConvertSToF %float %61
+         %69 = OpConvertSToF %float %63
+         %70 = OpConvertSToF %float %65
+         %71 = OpConvertSToF %float %67
+         %72 = OpCompositeConstruct %v4float %68 %69 %70 %71
+               OpStore %x_GLF_color %72
+               OpBranch %57
+         %59 = OpLabel
+         %73 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %74 = OpLoad %int %73
+         %75 = OpConvertSToF %float %74
+         %76 = OpCompositeConstruct %v4float %75 %75 %75 %75
+               OpStore %x_GLF_color %76
+               OpBranch %57
+         %57 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %77
+%tint_symbol = OpFunctionParameter %main_out
+         %81 = OpLabel
+         %82 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %82
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+         %84 = OpLabel
+         %85 = OpFunctionCall %void %main_1
+         %87 = OpLoad %v4float %x_GLF_color
+         %88 = OpCompositeConstruct %main_out %87
+         %86 = OpFunctionCall %void %tint_symbol_2 %88
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mod-zero/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mod-zero/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..ee6f6f7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-mod-zero/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,61 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var undefined : f32;
+  var x_51 : bool;
+  var x_52_phi : bool;
+  undefined = (5.0 % 0.0);
+  let x_10 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_11 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_12 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_44 : bool = (x_10 == (x_11 + x_12));
+  x_52_phi = x_44;
+  if (!(x_44)) {
+    let x_48 : f32 = undefined;
+    let x_50 : f32 = x_8.x_GLF_uniform_float_values[0];
+    x_51 = (x_48 > x_50);
+    x_52_phi = x_51;
+  }
+  let x_52 : bool = x_52_phi;
+  if (x_52) {
+    let x_15 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_16 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_17 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_18 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_15), f32(x_16), f32(x_17), f32(x_18));
+  } else {
+    let x_19 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_66 : f32 = f32(x_19);
+    x_GLF_color = vec4<f32>(x_66, x_66, x_66, x_66);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-module-small-number/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-module-small-number/0-opt.spvasm
new file mode 100644
index 0000000..00788a0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-module-small-number/0-opt.spvasm
@@ -0,0 +1,147 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %f0 "f0"
+               OpName %s1 "s1"
+               OpName %f1 "f1"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+   %float_10 = OpConstant %float 10
+%float_9_99999997en07 = OpConstant %float 9.99999997e-07
+%float_0x1_b38fb8pn127 = OpConstant %float 0x1.b38fb8p-127
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+%float_0_99000001 = OpConstant %float 0.99000001
+%float_0_00999999978 = OpConstant %float 0.00999999978
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+       %main = OpFunction %void None %14
+         %36 = OpLabel
+         %f0 = OpVariable %_ptr_Function_float Function
+         %s1 = OpVariable %_ptr_Function_float Function
+         %f1 = OpVariable %_ptr_Function_float Function
+         %37 = OpFMod %float %float_10 %float_9_99999997en07
+               OpStore %f0 %37
+               OpStore %s1 %float_0x1_b38fb8pn127
+         %38 = OpLoad %float %s1
+         %39 = OpFOrdEqual %bool %38 %float_0
+               OpSelectionMerge %40 None
+               OpBranchConditional %39 %41 %40
+         %41 = OpLabel
+               OpStore %s1 %float_1
+               OpBranch %40
+         %40 = OpLabel
+         %42 = OpLoad %float %s1
+         %43 = OpFMod %float %float_10 %42
+               OpStore %f1 %43
+         %44 = OpLoad %float %f1
+         %45 = OpIsInf %bool %44
+         %46 = OpLoad %float %s1
+         %47 = OpFOrdEqual %bool %46 %float_1
+         %48 = OpLogicalOr %bool %45 %47
+         %49 = OpLogicalNot %bool %48
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %50
+         %51 = OpLabel
+         %52 = OpLoad %float %f0
+         %53 = OpLoad %float %f1
+         %54 = OpFOrdEqual %bool %52 %53
+         %55 = OpLogicalNot %bool %54
+               OpSelectionMerge %56 None
+               OpBranchConditional %55 %57 %56
+         %57 = OpLabel
+         %58 = OpLoad %float %f0
+         %59 = OpFOrdGreaterThan %bool %58 %float_0_99000001
+         %60 = OpLoad %float %f0
+         %61 = OpFOrdLessThan %bool %60 %float_0_00999999978
+         %62 = OpLogicalAnd %bool %59 %61
+               OpBranch %56
+         %56 = OpLabel
+         %63 = OpPhi %bool %54 %51 %62 %57
+         %64 = OpLogicalNot %bool %63
+               OpSelectionMerge %65 None
+               OpBranchConditional %64 %66 %65
+         %66 = OpLabel
+         %67 = OpLoad %float %f1
+         %68 = OpFOrdGreaterThan %bool %67 %float_0_99000001
+         %69 = OpLoad %float %f1
+         %70 = OpFOrdLessThan %bool %69 %float_0_00999999978
+         %71 = OpLogicalAnd %bool %68 %70
+               OpBranch %65
+         %65 = OpLabel
+         %72 = OpPhi %bool %63 %56 %71 %66
+               OpBranch %50
+         %50 = OpLabel
+         %73 = OpPhi %bool %48 %40 %72 %65
+         %74 = OpLoad %float %f1
+         %75 = OpFOrdEqual %bool %74 %float_10
+         %76 = OpLogicalOr %bool %73 %75
+               OpSelectionMerge %77 None
+               OpBranchConditional %76 %78 %79
+         %78 = OpLabel
+         %80 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %81 = OpLoad %int %80
+         %82 = OpConvertSToF %float %81
+         %83 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %84 = OpLoad %int %83
+         %85 = OpConvertSToF %float %84
+         %86 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %87 = OpLoad %int %86
+         %88 = OpConvertSToF %float %87
+         %89 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %90 = OpLoad %int %89
+         %91 = OpConvertSToF %float %90
+         %92 = OpCompositeConstruct %v4float %82 %85 %88 %91
+               OpStore %_GLF_color %92
+               OpBranch %77
+         %79 = OpLabel
+         %93 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %94 = OpLoad %int %93
+         %95 = OpConvertSToF %float %94
+         %96 = OpCompositeConstruct %v4float %95 %95 %95 %95
+               OpStore %_GLF_color %96
+               OpBranch %77
+         %77 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-module-small-number/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-module-small-number/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..134d1e5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-module-small-number/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,88 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[2];
+};
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[1];
+};
+
+void main_1() {
+  float f0 = 0.0f;
+  float s1 = 0.0f;
+  float f1 = 0.0f;
+  bool x_72 = false;
+  bool x_73_phi = false;
+  f0 = (10.0f % 0.000001f);
+  s1 = 9.99999935e-39f;
+  if ((s1 == 0.0f)) {
+    s1 = 1.0f;
+  }
+  bool x_62 = false;
+  bool x_71 = false;
+  bool x_63_phi = false;
+  bool x_72_phi = false;
+  f1 = (10.0f % s1);
+  bool tint_tmp = isinf(f1);
+  if (!tint_tmp) {
+    tint_tmp = (s1 == 1.0f);
+  }
+  const bool x_48 = (tint_tmp);
+  x_73_phi = x_48;
+  if (!(x_48)) {
+    const bool x_54 = (f0 == f1);
+    x_63_phi = x_54;
+    if (!(x_54)) {
+      bool tint_tmp_1 = (f0 > 0.99000001f);
+      if (tint_tmp_1) {
+        tint_tmp_1 = (f0 < 0.01f);
+      }
+      x_62 = (tint_tmp_1);
+      x_63_phi = x_62;
+    }
+    const bool x_63 = x_63_phi;
+    x_72_phi = x_63;
+    if (!(x_63)) {
+      bool tint_tmp_2 = (f1 > 0.99000001f);
+      if (tint_tmp_2) {
+        tint_tmp_2 = (f1 < 0.01f);
+      }
+      x_71 = (tint_tmp_2);
+      x_72_phi = x_71;
+    }
+    x_72 = x_72_phi;
+    x_73_phi = x_72;
+  }
+  bool tint_tmp_3 = x_73_phi;
+  if (!tint_tmp_3) {
+    tint_tmp_3 = (f1 == 10.0f);
+  }
+  if ((tint_tmp_3)) {
+    const int x_81 = asint(x_8[1].x);
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_84 = asint(x_8[scalar_offset / 4][scalar_offset % 4]);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_87 = asint(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const int x_90 = asint(x_8[1].x);
+    x_GLF_color = float4(float(x_81), float(x_84), float(x_87), float(x_90));
+  } else {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_94 = asint(x_8[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const float x_95 = float(x_94);
+    x_GLF_color = float4(x_95, x_95, x_95, x_95);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-module-small-number/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-module-small-number/0-opt.spvasm.expected.msl
new file mode 100755
index 0000000..b44e5d5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-module-small-number/0-opt.spvasm.expected.msl
@@ -0,0 +1,108 @@
+SKIP: FAILED
+
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_8, thread float4* const tint_symbol_4) {
+  float f0 = 0.0f;
+  float s1 = 0.0f;
+  float f1 = 0.0f;
+  bool x_72 = false;
+  bool x_73_phi = false;
+  f0 = (10.0f % 0.000001f);
+  s1 = 9.99999935e-39f;
+  float const x_38 = s1;
+  if ((x_38 == 0.0f)) {
+    s1 = 1.0f;
+  }
+  bool x_62 = false;
+  bool x_71 = false;
+  bool x_63_phi = false;
+  bool x_72_phi = false;
+  float const x_42 = s1;
+  f1 = (10.0f % x_42);
+  float const x_44 = f1;
+  float const x_46 = s1;
+  bool const x_48 = (isinf(x_44) || (x_46 == 1.0f));
+  x_73_phi = x_48;
+  if (!(x_48)) {
+    float const x_52 = f0;
+    float const x_53 = f1;
+    bool const x_54 = (x_52 == x_53);
+    x_63_phi = x_54;
+    if (!(x_54)) {
+      float const x_58 = f0;
+      float const x_60 = f0;
+      x_62 = ((x_58 > 0.99000001f) && (x_60 < 0.01f));
+      x_63_phi = x_62;
+    }
+    bool const x_63 = x_63_phi;
+    x_72_phi = x_63;
+    if (!(x_63)) {
+      float const x_67 = f1;
+      float const x_69 = f1;
+      x_71 = ((x_67 > 0.99000001f) && (x_69 < 0.01f));
+      x_72_phi = x_71;
+    }
+    x_72 = x_72_phi;
+    x_73_phi = x_72;
+  }
+  bool const x_73 = x_73_phi;
+  float const x_74 = f1;
+  if ((x_73 || (x_74 == 10.0f))) {
+    int const x_81 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    int const x_84 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    int const x_87 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    int const x_90 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_81), float(x_84), float(x_87), float(x_90));
+  } else {
+    int const x_94 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    float const x_95 = float(x_94);
+    *(tint_symbol_4) = float4(x_95, x_95, x_95, x_95);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_8 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
+T:\tmp\u3v4.0.metal:37:15: error: invalid operands to binary expression ('float' and 'float')
+  f0 = (10.0f % 0.000001f);
+        ~~~~~ ^ ~~~~~~~~~
+T:\tmp\u3v4.0.metal:48:15: error: invalid operands to binary expression ('float' and 'const float')
+  f1 = (10.0f % x_42);
+        ~~~~~ ^ ~~~~
+2 errors generated.
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-module-small-number/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-module-small-number/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..f597477
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-module-small-number/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,227 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 132
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_8 "x_8"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_10 "x_10"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f0 "f0"
+               OpName %s1 "s1"
+               OpName %f1 "f1"
+               OpName %x_72 "x_72"
+               OpName %x_73_phi "x_73_phi"
+               OpName %x_62 "x_62"
+               OpName %x_71 "x_71"
+               OpName %x_63_phi "x_63_phi"
+               OpName %x_72_phi "x_72_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %26 = OpConstantNull %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %32 = OpConstantNull %bool
+   %float_10 = OpConstant %float 10
+%float_9_99999997en07 = OpConstant %float 9.99999997e-07
+%float_0x1_b38fb8pn127 = OpConstant %float 0x1.b38fb8p-127
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+%float_0_99000001 = OpConstant %float 0.99000001
+%float_0_00999999978 = OpConstant %float 0.00999999978
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+   %main_out = OpTypeStruct %v4float
+        %120 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+         %f0 = OpVariable %_ptr_Function_float Function %26
+         %s1 = OpVariable %_ptr_Function_float Function %26
+         %f1 = OpVariable %_ptr_Function_float Function %26
+       %x_72 = OpVariable %_ptr_Function_bool Function %32
+   %x_73_phi = OpVariable %_ptr_Function_bool Function %32
+       %x_62 = OpVariable %_ptr_Function_bool Function %32
+       %x_71 = OpVariable %_ptr_Function_bool Function %32
+   %x_63_phi = OpVariable %_ptr_Function_bool Function %32
+   %x_72_phi = OpVariable %_ptr_Function_bool Function %32
+         %36 = OpFMod %float %float_10 %float_9_99999997en07
+               OpStore %f0 %36
+               OpStore %s1 %float_0x1_b38fb8pn127
+         %38 = OpLoad %float %s1
+         %40 = OpFOrdEqual %bool %38 %float_0
+               OpSelectionMerge %41 None
+               OpBranchConditional %40 %42 %41
+         %42 = OpLabel
+               OpStore %s1 %float_1
+               OpBranch %41
+         %41 = OpLabel
+         %48 = OpLoad %float %s1
+         %49 = OpFMod %float %float_10 %48
+               OpStore %f1 %49
+         %50 = OpLoad %float %f1
+         %51 = OpLoad %float %s1
+         %52 = OpIsInf %bool %50
+               OpSelectionMerge %53 None
+               OpBranchConditional %52 %53 %54
+         %54 = OpLabel
+         %55 = OpFOrdEqual %bool %51 %float_1
+               OpBranch %53
+         %53 = OpLabel
+         %56 = OpPhi %bool %52 %41 %55 %54
+               OpStore %x_73_phi %56
+         %57 = OpLogicalNot %bool %56
+               OpSelectionMerge %58 None
+               OpBranchConditional %57 %59 %58
+         %59 = OpLabel
+         %60 = OpLoad %float %f0
+         %61 = OpLoad %float %f1
+         %62 = OpFOrdEqual %bool %60 %61
+               OpStore %x_63_phi %62
+         %63 = OpLogicalNot %bool %62
+               OpSelectionMerge %64 None
+               OpBranchConditional %63 %65 %64
+         %65 = OpLabel
+         %66 = OpLoad %float %f0
+         %67 = OpLoad %float %f0
+         %69 = OpFOrdGreaterThan %bool %66 %float_0_99000001
+               OpSelectionMerge %70 None
+               OpBranchConditional %69 %71 %70
+         %71 = OpLabel
+         %73 = OpFOrdLessThan %bool %67 %float_0_00999999978
+               OpBranch %70
+         %70 = OpLabel
+         %74 = OpPhi %bool %69 %65 %73 %71
+               OpStore %x_62 %74
+         %75 = OpLoad %bool %x_62
+               OpStore %x_63_phi %75
+               OpBranch %64
+         %64 = OpLabel
+         %76 = OpLoad %bool %x_63_phi
+               OpStore %x_72_phi %76
+         %77 = OpLogicalNot %bool %76
+               OpSelectionMerge %78 None
+               OpBranchConditional %77 %79 %78
+         %79 = OpLabel
+         %80 = OpLoad %float %f1
+         %81 = OpLoad %float %f1
+         %82 = OpFOrdGreaterThan %bool %80 %float_0_99000001
+               OpSelectionMerge %83 None
+               OpBranchConditional %82 %84 %83
+         %84 = OpLabel
+         %85 = OpFOrdLessThan %bool %81 %float_0_00999999978
+               OpBranch %83
+         %83 = OpLabel
+         %86 = OpPhi %bool %82 %79 %85 %84
+               OpStore %x_71 %86
+         %87 = OpLoad %bool %x_71
+               OpStore %x_72_phi %87
+               OpBranch %78
+         %78 = OpLabel
+         %88 = OpLoad %bool %x_72_phi
+               OpStore %x_72 %88
+         %89 = OpLoad %bool %x_72
+               OpStore %x_73_phi %89
+               OpBranch %58
+         %58 = OpLabel
+         %90 = OpLoad %bool %x_73_phi
+         %91 = OpLoad %float %f1
+               OpSelectionMerge %92 None
+               OpBranchConditional %90 %92 %93
+         %93 = OpLabel
+         %94 = OpFOrdEqual %bool %91 %float_10
+               OpBranch %92
+         %92 = OpLabel
+         %95 = OpPhi %bool %90 %58 %94 %93
+               OpSelectionMerge %96 None
+               OpBranchConditional %95 %97 %98
+         %97 = OpLabel
+        %102 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+        %103 = OpLoad %int %102
+        %105 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+        %106 = OpLoad %int %105
+        %107 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+        %108 = OpLoad %int %107
+        %109 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+        %110 = OpLoad %int %109
+        %111 = OpConvertSToF %float %103
+        %112 = OpConvertSToF %float %106
+        %113 = OpConvertSToF %float %108
+        %114 = OpConvertSToF %float %110
+        %115 = OpCompositeConstruct %v4float %111 %112 %113 %114
+               OpStore %x_GLF_color %115
+               OpBranch %96
+         %98 = OpLabel
+        %116 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+        %117 = OpLoad %int %116
+        %118 = OpConvertSToF %float %117
+        %119 = OpCompositeConstruct %v4float %118 %118 %118 %118
+               OpStore %x_GLF_color %119
+               OpBranch %96
+         %96 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %120
+%tint_symbol = OpFunctionParameter %main_out
+        %124 = OpLabel
+        %125 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %125
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %127 = OpLabel
+        %128 = OpFunctionCall %void %main_1
+        %130 = OpLoad %v4float %x_GLF_color
+        %131 = OpCompositeConstruct %main_out %130
+        %129 = OpFunctionCall %void %tint_symbol_2 %131
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-module-small-number/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-module-small-number/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..8b2ad19
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-module-small-number/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,90 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+fn main_1() {
+  var f0 : f32;
+  var s1 : f32;
+  var f1 : f32;
+  var x_72 : bool;
+  var x_73_phi : bool;
+  f0 = (10.0 % 0.000001);
+  s1 = 0x1.b38fb8p-127;
+  let x_38 : f32 = s1;
+  if ((x_38 == 0.0)) {
+    s1 = 1.0;
+  }
+  var x_62 : bool;
+  var x_71 : bool;
+  var x_63_phi : bool;
+  var x_72_phi : bool;
+  let x_42 : f32 = s1;
+  f1 = (10.0 % x_42);
+  let x_44 : f32 = f1;
+  let x_46 : f32 = s1;
+  let x_48 : bool = (isInf(x_44) || (x_46 == 1.0));
+  x_73_phi = x_48;
+  if (!(x_48)) {
+    let x_52 : f32 = f0;
+    let x_53 : f32 = f1;
+    let x_54 : bool = (x_52 == x_53);
+    x_63_phi = x_54;
+    if (!(x_54)) {
+      let x_58 : f32 = f0;
+      let x_60 : f32 = f0;
+      x_62 = ((x_58 > 0.99000001) && (x_60 < 0.01));
+      x_63_phi = x_62;
+    }
+    let x_63 : bool = x_63_phi;
+    x_72_phi = x_63;
+    if (!(x_63)) {
+      let x_67 : f32 = f1;
+      let x_69 : f32 = f1;
+      x_71 = ((x_67 > 0.99000001) && (x_69 < 0.01));
+      x_72_phi = x_71;
+    }
+    x_72 = x_72_phi;
+    x_73_phi = x_72;
+  }
+  let x_73 : bool = x_73_phi;
+  let x_74 : f32 = f1;
+  if ((x_73 || (x_74 == 10.0))) {
+    let x_81 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_84 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_87 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_90 : i32 = x_8.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_81), f32(x_84), f32(x_87), f32(x_90));
+  } else {
+    let x_94 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_95 : f32 = f32(x_94);
+    x_GLF_color = vec4<f32>(x_95, x_95, x_95, x_95);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-module-small-number/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-module-small-number/0-opt.wgsl
new file mode 100644
index 0000000..8b2ad19
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-module-small-number/0-opt.wgsl
@@ -0,0 +1,90 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+fn main_1() {
+  var f0 : f32;
+  var s1 : f32;
+  var f1 : f32;
+  var x_72 : bool;
+  var x_73_phi : bool;
+  f0 = (10.0 % 0.000001);
+  s1 = 0x1.b38fb8p-127;
+  let x_38 : f32 = s1;
+  if ((x_38 == 0.0)) {
+    s1 = 1.0;
+  }
+  var x_62 : bool;
+  var x_71 : bool;
+  var x_63_phi : bool;
+  var x_72_phi : bool;
+  let x_42 : f32 = s1;
+  f1 = (10.0 % x_42);
+  let x_44 : f32 = f1;
+  let x_46 : f32 = s1;
+  let x_48 : bool = (isInf(x_44) || (x_46 == 1.0));
+  x_73_phi = x_48;
+  if (!(x_48)) {
+    let x_52 : f32 = f0;
+    let x_53 : f32 = f1;
+    let x_54 : bool = (x_52 == x_53);
+    x_63_phi = x_54;
+    if (!(x_54)) {
+      let x_58 : f32 = f0;
+      let x_60 : f32 = f0;
+      x_62 = ((x_58 > 0.99000001) && (x_60 < 0.01));
+      x_63_phi = x_62;
+    }
+    let x_63 : bool = x_63_phi;
+    x_72_phi = x_63;
+    if (!(x_63)) {
+      let x_67 : f32 = f1;
+      let x_69 : f32 = f1;
+      x_71 = ((x_67 > 0.99000001) && (x_69 < 0.01));
+      x_72_phi = x_71;
+    }
+    x_72 = x_72_phi;
+    x_73_phi = x_72;
+  }
+  let x_73 : bool = x_73_phi;
+  let x_74 : f32 = f1;
+  if ((x_73 || (x_74 == 10.0))) {
+    let x_81 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_84 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_87 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_90 : i32 = x_8.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_81), f32(x_84), f32(x_87), f32(x_90));
+  } else {
+    let x_94 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_95 : f32 = f32(x_94);
+    x_GLF_color = vec4<f32>(x_95, x_95, x_95, x_95);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-module-small-number/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-module-small-number/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..0fdd32b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-module-small-number/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,6 @@
+SKIP: FAILED
+
+graphicsfuzz/cov-apfloat-module-small-number/0-opt.wgsl:28:19 error: expected ';' for assignment statement
+  s1 = 0x1.b38fb8p-127;
+                  ^^^^
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-module-small-number/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-module-small-number/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..0fdd32b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-module-small-number/0-opt.wgsl.expected.msl
@@ -0,0 +1,6 @@
+SKIP: FAILED
+
+graphicsfuzz/cov-apfloat-module-small-number/0-opt.wgsl:28:19 error: expected ';' for assignment statement
+  s1 = 0x1.b38fb8p-127;
+                  ^^^^
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-module-small-number/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-module-small-number/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..0fdd32b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-module-small-number/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,6 @@
+SKIP: FAILED
+
+graphicsfuzz/cov-apfloat-module-small-number/0-opt.wgsl:28:19 error: expected ';' for assignment statement
+  s1 = 0x1.b38fb8p-127;
+                  ^^^^
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-module-small-number/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-module-small-number/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..0fdd32b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-module-small-number/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+SKIP: FAILED
+
+graphicsfuzz/cov-apfloat-module-small-number/0-opt.wgsl:28:19 error: expected ';' for assignment statement
+  s1 = 0x1.b38fb8p-127;
+                  ^^^^
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-reflect-denorm/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-reflect-denorm/0-opt.spvasm
new file mode 100644
index 0000000..4a6ac9d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-reflect-denorm/0-opt.spvasm
@@ -0,0 +1,130 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %I "I"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %N "N"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpName %R "R"
+               OpName %ref "ref"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_5 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_int_uint_5 = OpTypeArray %int %uint_5
+       %buf0 = OpTypeStruct %_arr_int_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+ %uint_92985 = OpConstant %uint 92985
+     %v4uint = OpTypeVector %uint 4
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf1 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+  %float_0_5 = OpConstant %float 0.5
+         %35 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_0_5
+       %bool = OpTypeBool
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %15
+         %38 = OpLabel
+          %I = OpVariable %_ptr_Function_v4float Function
+          %N = OpVariable %_ptr_Function_v4float Function
+          %R = OpVariable %_ptr_Function_v4float Function
+        %ref = OpVariable %_ptr_Function_v4float Function
+         %39 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %40 = OpLoad %int %39
+         %41 = OpBitcast %uint %40
+         %42 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %43 = OpLoad %int %42
+         %44 = OpBitcast %uint %43
+         %45 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_4
+         %46 = OpLoad %int %45
+         %47 = OpBitcast %uint %46
+         %48 = OpCompositeConstruct %v4uint %41 %44 %47 %uint_92985
+         %49 = OpBitcast %v4float %48
+               OpStore %I %49
+         %50 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_1
+         %51 = OpLoad %float %50
+         %52 = OpCompositeConstruct %v4float %51 %51 %51 %51
+               OpStore %N %52
+         %53 = OpLoad %v4float %I
+         %54 = OpExtInst %v4float %1 Reflect %53 %35
+               OpStore %R %54
+         %55 = OpLoad %v4float %I
+         %56 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_2
+         %57 = OpLoad %float %56
+         %58 = OpLoad %v4float %N
+         %59 = OpLoad %v4float %I
+         %60 = OpDot %float %58 %59
+         %61 = OpFMul %float %57 %60
+         %62 = OpLoad %v4float %N
+         %63 = OpVectorTimesScalar %v4float %62 %61
+         %64 = OpFSub %v4float %55 %63
+               OpStore %ref %64
+         %65 = OpLoad %v4float %R
+         %66 = OpLoad %v4float %ref
+         %67 = OpExtInst %float %1 Distance %65 %66
+         %68 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %69 = OpLoad %float %68
+         %70 = OpFOrdLessThan %bool %67 %69
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %73
+         %72 = OpLabel
+         %74 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %75 = OpLoad %int %74
+         %76 = OpConvertSToF %float %75
+         %77 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %78 = OpLoad %int %77
+         %79 = OpConvertSToF %float %78
+         %80 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %81 = OpLoad %int %80
+         %82 = OpConvertSToF %float %81
+         %83 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %84 = OpLoad %int %83
+         %85 = OpConvertSToF %float %84
+         %86 = OpCompositeConstruct %v4float %76 %79 %82 %85
+               OpStore %_GLF_color %86
+               OpBranch %71
+         %73 = OpLabel
+         %87 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %88 = OpLoad %int %87
+         %89 = OpConvertSToF %float %88
+         %90 = OpCompositeConstruct %v4float %89 %89 %89 %89
+               OpStore %_GLF_color %90
+               OpBranch %71
+         %71 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-reflect-denorm/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-reflect-denorm/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..9136c66
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-reflect-denorm/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,71 @@
+SKIP: FAILED
+
+
+type Arr = [[stride(16)]] array<i32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var I : vec4<f32>;
+  var N : vec4<f32>;
+  var R : vec4<f32>;
+  var ref : vec4<f32>;
+  let x_40 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_43 : i32 = x_6.x_GLF_uniform_int_values[3];
+  let x_46 : i32 = x_6.x_GLF_uniform_int_values[4];
+  I = bitcast<vec4<f32>>(vec4<u32>(bitcast<u32>(x_40), bitcast<u32>(x_43), bitcast<u32>(x_46), 92985u));
+  let x_51 : f32 = x_9.x_GLF_uniform_float_values[1];
+  N = vec4<f32>(x_51, x_51, x_51, x_51);
+  let x_53 : vec4<f32> = I;
+  R = reflect(x_53, vec4<f32>(0.5, 0.5, 0.5, 0.5));
+  let x_55 : vec4<f32> = I;
+  let x_57 : f32 = x_9.x_GLF_uniform_float_values[2];
+  let x_58 : vec4<f32> = N;
+  let x_59 : vec4<f32> = I;
+  let x_62 : vec4<f32> = N;
+  ref = (x_55 - (x_62 * (x_57 * dot(x_58, x_59))));
+  let x_65 : vec4<f32> = R;
+  let x_66 : vec4<f32> = ref;
+  let x_69 : f32 = x_9.x_GLF_uniform_float_values[0];
+  if ((distance(x_65, x_66) < x_69)) {
+    let x_75 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_78 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_81 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_84 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_75), f32(x_78), f32(x_81), f32(x_84));
+  } else {
+    let x_88 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_89 : f32 = f32(x_88);
+    x_GLF_color = vec4<f32>(x_89, x_89, x_89, x_89);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+Failed to generate: error: Unable to do bitcast to type __vec_4__f32
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-reflect-denorm/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-reflect-denorm/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..9237c80
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-reflect-denorm/0-opt.spvasm.expected.msl
@@ -0,0 +1,74 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[5];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_9, thread float4* const tint_symbol_4) {
+  float4 I = 0.0f;
+  float4 N = 0.0f;
+  float4 R = 0.0f;
+  float4 ref = 0.0f;
+  int const x_40 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_43 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  int const x_46 = x_6.x_GLF_uniform_int_values.arr[4].el;
+  I = as_type<float4>(uint4(as_type<uint>(x_40), as_type<uint>(x_43), as_type<uint>(x_46), 92985u));
+  float const x_51 = x_9.x_GLF_uniform_float_values.arr[1].el;
+  N = float4(x_51, x_51, x_51, x_51);
+  float4 const x_53 = I;
+  R = reflect(x_53, float4(0.5f, 0.5f, 0.5f, 0.5f));
+  float4 const x_55 = I;
+  float const x_57 = x_9.x_GLF_uniform_float_values.arr[2].el;
+  float4 const x_58 = N;
+  float4 const x_59 = I;
+  float4 const x_62 = N;
+  ref = (x_55 - (x_62 * (x_57 * dot(x_58, x_59))));
+  float4 const x_65 = R;
+  float4 const x_66 = ref;
+  float const x_69 = x_9.x_GLF_uniform_float_values.arr[0].el;
+  if ((distance(x_65, x_66) < x_69)) {
+    int const x_75 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_78 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_81 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_84 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_75), float(x_78), float(x_81), float(x_84));
+  } else {
+    int const x_88 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    float const x_89 = float(x_88);
+    *(tint_symbol_4) = float4(x_89, x_89, x_89, x_89);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_9 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-reflect-denorm/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-reflect-denorm/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..dcddef3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-reflect-denorm/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,164 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 107
+; Schema: 0
+               OpCapability Shader
+         %54 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %I "I"
+               OpName %N "N"
+               OpName %R "R"
+               OpName %ref "ref"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_5 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_int_uint_5 = OpTypeArray %int %uint_5
+       %buf0 = OpTypeStruct %_arr_int_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf1 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_9 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_0 = OpConstant %uint 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+     %v4uint = OpTypeVector %uint 4
+ %uint_92985 = OpConstant %uint 92985
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+  %float_0_5 = OpConstant %float 0.5
+         %56 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_0_5
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %v4float
+         %95 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+          %I = OpVariable %_ptr_Function_v4float Function %17
+          %N = OpVariable %_ptr_Function_v4float Function %17
+          %R = OpVariable %_ptr_Function_v4float Function %17
+        %ref = OpVariable %_ptr_Function_v4float Function %17
+         %32 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %33 = OpLoad %int %32
+         %35 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %36 = OpLoad %int %35
+         %38 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+         %39 = OpLoad %int %38
+         %42 = OpBitcast %uint %33
+         %43 = OpBitcast %uint %36
+         %44 = OpBitcast %uint %39
+         %46 = OpCompositeConstruct %v4uint %42 %43 %44 %uint_92985
+         %40 = OpBitcast %v4float %46
+               OpStore %I %40
+         %49 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_1
+         %50 = OpLoad %float %49
+         %51 = OpCompositeConstruct %v4float %50 %50 %50 %50
+               OpStore %N %51
+         %52 = OpLoad %v4float %I
+         %53 = OpExtInst %v4float %54 Reflect %52 %56
+               OpStore %R %53
+         %57 = OpLoad %v4float %I
+         %58 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_2
+         %59 = OpLoad %float %58
+         %60 = OpLoad %v4float %N
+         %61 = OpLoad %v4float %I
+         %62 = OpLoad %v4float %N
+         %63 = OpDot %float %60 %61
+         %64 = OpFMul %float %59 %63
+         %65 = OpVectorTimesScalar %v4float %62 %64
+         %66 = OpFSub %v4float %57 %65
+               OpStore %ref %66
+         %67 = OpLoad %v4float %R
+         %68 = OpLoad %v4float %ref
+         %70 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_0
+         %71 = OpLoad %float %70
+         %72 = OpExtInst %float %54 Distance %67 %68
+         %73 = OpFOrdLessThan %bool %72 %71
+               OpSelectionMerge %75 None
+               OpBranchConditional %73 %76 %77
+         %76 = OpLabel
+         %78 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %79 = OpLoad %int %78
+         %80 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %81 = OpLoad %int %80
+         %82 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %83 = OpLoad %int %82
+         %84 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %85 = OpLoad %int %84
+         %86 = OpConvertSToF %float %79
+         %87 = OpConvertSToF %float %81
+         %88 = OpConvertSToF %float %83
+         %89 = OpConvertSToF %float %85
+         %90 = OpCompositeConstruct %v4float %86 %87 %88 %89
+               OpStore %x_GLF_color %90
+               OpBranch %75
+         %77 = OpLabel
+         %91 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %92 = OpLoad %int %91
+         %93 = OpConvertSToF %float %92
+         %94 = OpCompositeConstruct %v4float %93 %93 %93 %93
+               OpStore %x_GLF_color %94
+               OpBranch %75
+         %75 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %95
+%tint_symbol = OpFunctionParameter %main_out
+         %99 = OpLabel
+        %100 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %100
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %102 = OpLabel
+        %103 = OpFunctionCall %void %main_1
+        %105 = OpLoad %v4float %x_GLF_color
+        %106 = OpCompositeConstruct %main_out %105
+        %104 = OpFunctionCall %void %tint_symbol_2 %106
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-reflect-denorm/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-reflect-denorm/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..c992ddc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-reflect-denorm/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,66 @@
+type Arr = [[stride(16)]] array<i32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var I : vec4<f32>;
+  var N : vec4<f32>;
+  var R : vec4<f32>;
+  var ref : vec4<f32>;
+  let x_40 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_43 : i32 = x_6.x_GLF_uniform_int_values[3];
+  let x_46 : i32 = x_6.x_GLF_uniform_int_values[4];
+  I = bitcast<vec4<f32>>(vec4<u32>(bitcast<u32>(x_40), bitcast<u32>(x_43), bitcast<u32>(x_46), 92985u));
+  let x_51 : f32 = x_9.x_GLF_uniform_float_values[1];
+  N = vec4<f32>(x_51, x_51, x_51, x_51);
+  let x_53 : vec4<f32> = I;
+  R = reflect(x_53, vec4<f32>(0.5, 0.5, 0.5, 0.5));
+  let x_55 : vec4<f32> = I;
+  let x_57 : f32 = x_9.x_GLF_uniform_float_values[2];
+  let x_58 : vec4<f32> = N;
+  let x_59 : vec4<f32> = I;
+  let x_62 : vec4<f32> = N;
+  ref = (x_55 - (x_62 * (x_57 * dot(x_58, x_59))));
+  let x_65 : vec4<f32> = R;
+  let x_66 : vec4<f32> = ref;
+  let x_69 : f32 = x_9.x_GLF_uniform_float_values[0];
+  if ((distance(x_65, x_66) < x_69)) {
+    let x_75 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_78 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_81 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_84 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_75), f32(x_78), f32(x_81), f32(x_84));
+  } else {
+    let x_88 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_89 : f32 = f32(x_88);
+    x_GLF_color = vec4<f32>(x_89, x_89, x_89, x_89);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-reflect-denorm/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-reflect-denorm/0-opt.wgsl
new file mode 100644
index 0000000..c992ddc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-reflect-denorm/0-opt.wgsl
@@ -0,0 +1,66 @@
+type Arr = [[stride(16)]] array<i32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var I : vec4<f32>;
+  var N : vec4<f32>;
+  var R : vec4<f32>;
+  var ref : vec4<f32>;
+  let x_40 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_43 : i32 = x_6.x_GLF_uniform_int_values[3];
+  let x_46 : i32 = x_6.x_GLF_uniform_int_values[4];
+  I = bitcast<vec4<f32>>(vec4<u32>(bitcast<u32>(x_40), bitcast<u32>(x_43), bitcast<u32>(x_46), 92985u));
+  let x_51 : f32 = x_9.x_GLF_uniform_float_values[1];
+  N = vec4<f32>(x_51, x_51, x_51, x_51);
+  let x_53 : vec4<f32> = I;
+  R = reflect(x_53, vec4<f32>(0.5, 0.5, 0.5, 0.5));
+  let x_55 : vec4<f32> = I;
+  let x_57 : f32 = x_9.x_GLF_uniform_float_values[2];
+  let x_58 : vec4<f32> = N;
+  let x_59 : vec4<f32> = I;
+  let x_62 : vec4<f32> = N;
+  ref = (x_55 - (x_62 * (x_57 * dot(x_58, x_59))));
+  let x_65 : vec4<f32> = R;
+  let x_66 : vec4<f32> = ref;
+  let x_69 : f32 = x_9.x_GLF_uniform_float_values[0];
+  if ((distance(x_65, x_66) < x_69)) {
+    let x_75 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_78 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_81 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_84 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_75), f32(x_78), f32(x_81), f32(x_84));
+  } else {
+    let x_88 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_89 : f32 = f32(x_88);
+    x_GLF_color = vec4<f32>(x_89, x_89, x_89, x_89);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-reflect-denorm/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-reflect-denorm/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..9136c66
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-reflect-denorm/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,71 @@
+SKIP: FAILED
+
+
+type Arr = [[stride(16)]] array<i32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var I : vec4<f32>;
+  var N : vec4<f32>;
+  var R : vec4<f32>;
+  var ref : vec4<f32>;
+  let x_40 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_43 : i32 = x_6.x_GLF_uniform_int_values[3];
+  let x_46 : i32 = x_6.x_GLF_uniform_int_values[4];
+  I = bitcast<vec4<f32>>(vec4<u32>(bitcast<u32>(x_40), bitcast<u32>(x_43), bitcast<u32>(x_46), 92985u));
+  let x_51 : f32 = x_9.x_GLF_uniform_float_values[1];
+  N = vec4<f32>(x_51, x_51, x_51, x_51);
+  let x_53 : vec4<f32> = I;
+  R = reflect(x_53, vec4<f32>(0.5, 0.5, 0.5, 0.5));
+  let x_55 : vec4<f32> = I;
+  let x_57 : f32 = x_9.x_GLF_uniform_float_values[2];
+  let x_58 : vec4<f32> = N;
+  let x_59 : vec4<f32> = I;
+  let x_62 : vec4<f32> = N;
+  ref = (x_55 - (x_62 * (x_57 * dot(x_58, x_59))));
+  let x_65 : vec4<f32> = R;
+  let x_66 : vec4<f32> = ref;
+  let x_69 : f32 = x_9.x_GLF_uniform_float_values[0];
+  if ((distance(x_65, x_66) < x_69)) {
+    let x_75 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_78 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_81 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_84 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_75), f32(x_78), f32(x_81), f32(x_84));
+  } else {
+    let x_88 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_89 : f32 = f32(x_88);
+    x_GLF_color = vec4<f32>(x_89, x_89, x_89, x_89);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+Failed to generate: error: Unable to do bitcast to type __vec_4__f32
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-reflect-denorm/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-reflect-denorm/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..9237c80
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-reflect-denorm/0-opt.wgsl.expected.msl
@@ -0,0 +1,74 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[5];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_9, thread float4* const tint_symbol_4) {
+  float4 I = 0.0f;
+  float4 N = 0.0f;
+  float4 R = 0.0f;
+  float4 ref = 0.0f;
+  int const x_40 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_43 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  int const x_46 = x_6.x_GLF_uniform_int_values.arr[4].el;
+  I = as_type<float4>(uint4(as_type<uint>(x_40), as_type<uint>(x_43), as_type<uint>(x_46), 92985u));
+  float const x_51 = x_9.x_GLF_uniform_float_values.arr[1].el;
+  N = float4(x_51, x_51, x_51, x_51);
+  float4 const x_53 = I;
+  R = reflect(x_53, float4(0.5f, 0.5f, 0.5f, 0.5f));
+  float4 const x_55 = I;
+  float const x_57 = x_9.x_GLF_uniform_float_values.arr[2].el;
+  float4 const x_58 = N;
+  float4 const x_59 = I;
+  float4 const x_62 = N;
+  ref = (x_55 - (x_62 * (x_57 * dot(x_58, x_59))));
+  float4 const x_65 = R;
+  float4 const x_66 = ref;
+  float const x_69 = x_9.x_GLF_uniform_float_values.arr[0].el;
+  if ((distance(x_65, x_66) < x_69)) {
+    int const x_75 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_78 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_81 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_84 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_75), float(x_78), float(x_81), float(x_84));
+  } else {
+    int const x_88 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    float const x_89 = float(x_88);
+    *(tint_symbol_4) = float4(x_89, x_89, x_89, x_89);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_9 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-reflect-denorm/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-reflect-denorm/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..dcddef3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-reflect-denorm/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,164 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 107
+; Schema: 0
+               OpCapability Shader
+         %54 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %I "I"
+               OpName %N "N"
+               OpName %R "R"
+               OpName %ref "ref"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_5 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_int_uint_5 = OpTypeArray %int %uint_5
+       %buf0 = OpTypeStruct %_arr_int_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf1 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_9 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_0 = OpConstant %uint 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+     %v4uint = OpTypeVector %uint 4
+ %uint_92985 = OpConstant %uint 92985
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+  %float_0_5 = OpConstant %float 0.5
+         %56 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_0_5
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %v4float
+         %95 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+          %I = OpVariable %_ptr_Function_v4float Function %17
+          %N = OpVariable %_ptr_Function_v4float Function %17
+          %R = OpVariable %_ptr_Function_v4float Function %17
+        %ref = OpVariable %_ptr_Function_v4float Function %17
+         %32 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %33 = OpLoad %int %32
+         %35 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %36 = OpLoad %int %35
+         %38 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+         %39 = OpLoad %int %38
+         %42 = OpBitcast %uint %33
+         %43 = OpBitcast %uint %36
+         %44 = OpBitcast %uint %39
+         %46 = OpCompositeConstruct %v4uint %42 %43 %44 %uint_92985
+         %40 = OpBitcast %v4float %46
+               OpStore %I %40
+         %49 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_1
+         %50 = OpLoad %float %49
+         %51 = OpCompositeConstruct %v4float %50 %50 %50 %50
+               OpStore %N %51
+         %52 = OpLoad %v4float %I
+         %53 = OpExtInst %v4float %54 Reflect %52 %56
+               OpStore %R %53
+         %57 = OpLoad %v4float %I
+         %58 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_2
+         %59 = OpLoad %float %58
+         %60 = OpLoad %v4float %N
+         %61 = OpLoad %v4float %I
+         %62 = OpLoad %v4float %N
+         %63 = OpDot %float %60 %61
+         %64 = OpFMul %float %59 %63
+         %65 = OpVectorTimesScalar %v4float %62 %64
+         %66 = OpFSub %v4float %57 %65
+               OpStore %ref %66
+         %67 = OpLoad %v4float %R
+         %68 = OpLoad %v4float %ref
+         %70 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_0
+         %71 = OpLoad %float %70
+         %72 = OpExtInst %float %54 Distance %67 %68
+         %73 = OpFOrdLessThan %bool %72 %71
+               OpSelectionMerge %75 None
+               OpBranchConditional %73 %76 %77
+         %76 = OpLabel
+         %78 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %79 = OpLoad %int %78
+         %80 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %81 = OpLoad %int %80
+         %82 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %83 = OpLoad %int %82
+         %84 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %85 = OpLoad %int %84
+         %86 = OpConvertSToF %float %79
+         %87 = OpConvertSToF %float %81
+         %88 = OpConvertSToF %float %83
+         %89 = OpConvertSToF %float %85
+         %90 = OpCompositeConstruct %v4float %86 %87 %88 %89
+               OpStore %x_GLF_color %90
+               OpBranch %75
+         %77 = OpLabel
+         %91 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %92 = OpLoad %int %91
+         %93 = OpConvertSToF %float %92
+         %94 = OpCompositeConstruct %v4float %93 %93 %93 %93
+               OpStore %x_GLF_color %94
+               OpBranch %75
+         %75 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %95
+%tint_symbol = OpFunctionParameter %main_out
+         %99 = OpLabel
+        %100 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %100
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %102 = OpLabel
+        %103 = OpFunctionCall %void %main_1
+        %105 = OpLoad %v4float %x_GLF_color
+        %106 = OpCompositeConstruct %main_out %105
+        %104 = OpFunctionCall %void %tint_symbol_2 %106
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-reflect-denorm/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-reflect-denorm/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..c992ddc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-reflect-denorm/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,66 @@
+type Arr = [[stride(16)]] array<i32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var I : vec4<f32>;
+  var N : vec4<f32>;
+  var R : vec4<f32>;
+  var ref : vec4<f32>;
+  let x_40 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_43 : i32 = x_6.x_GLF_uniform_int_values[3];
+  let x_46 : i32 = x_6.x_GLF_uniform_int_values[4];
+  I = bitcast<vec4<f32>>(vec4<u32>(bitcast<u32>(x_40), bitcast<u32>(x_43), bitcast<u32>(x_46), 92985u));
+  let x_51 : f32 = x_9.x_GLF_uniform_float_values[1];
+  N = vec4<f32>(x_51, x_51, x_51, x_51);
+  let x_53 : vec4<f32> = I;
+  R = reflect(x_53, vec4<f32>(0.5, 0.5, 0.5, 0.5));
+  let x_55 : vec4<f32> = I;
+  let x_57 : f32 = x_9.x_GLF_uniform_float_values[2];
+  let x_58 : vec4<f32> = N;
+  let x_59 : vec4<f32> = I;
+  let x_62 : vec4<f32> = N;
+  ref = (x_55 - (x_62 * (x_57 * dot(x_58, x_59))));
+  let x_65 : vec4<f32> = R;
+  let x_66 : vec4<f32> = ref;
+  let x_69 : f32 = x_9.x_GLF_uniform_float_values[0];
+  if ((distance(x_65, x_66) < x_69)) {
+    let x_75 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_78 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_81 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_84 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_75), f32(x_78), f32(x_81), f32(x_84));
+  } else {
+    let x_88 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_89 : f32 = f32(x_88);
+    x_GLF_color = vec4<f32>(x_89, x_89, x_89, x_89);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-sinh-negative-log2/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-sinh-negative-log2/0-opt.spvasm
new file mode 100644
index 0000000..f4303dd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-sinh-negative-log2/0-opt.spvasm
@@ -0,0 +1,105 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %undefined "undefined"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %10 RelaxedPrecision
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %12 RelaxedPrecision
+               OpDecorate %13 RelaxedPrecision
+               OpDecorate %14 RelaxedPrecision
+               OpDecorate %15 RelaxedPrecision
+               OpDecorate %16 RelaxedPrecision
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+%float_0x1_8p_128 = OpConstant %float 0x1.8p+128
+       %bool = OpTypeBool
+        %int = OpTypeInt 32 1
+      %int_1 = OpConstant %int 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf1 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %18
+         %35 = OpLabel
+  %undefined = OpVariable %_ptr_Function_float Function
+         %36 = OpExtInst %float %1 Sinh %float_0x1_8p_128
+               OpStore %undefined %36
+         %37 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %10 = OpLoad %int %37
+         %38 = OpIEqual %bool %int_1 %10
+         %39 = OpLogicalNot %bool %38
+               OpSelectionMerge %40 None
+               OpBranchConditional %39 %41 %40
+         %41 = OpLabel
+         %42 = OpLoad %float %undefined
+         %43 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %44 = OpLoad %float %43
+         %45 = OpFOrdGreaterThan %bool %42 %44
+               OpBranch %40
+         %40 = OpLabel
+         %46 = OpPhi %bool %38 %35 %45 %41
+               OpSelectionMerge %47 None
+               OpBranchConditional %46 %48 %49
+         %48 = OpLabel
+         %50 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %12 = OpLoad %int %50
+         %51 = OpConvertSToF %float %12
+         %52 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %13 = OpLoad %int %52
+         %53 = OpConvertSToF %float %13
+         %54 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %14 = OpLoad %int %54
+         %55 = OpConvertSToF %float %14
+         %56 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %15 = OpLoad %int %56
+         %57 = OpConvertSToF %float %15
+         %58 = OpCompositeConstruct %v4float %51 %53 %55 %57
+               OpStore %_GLF_color %58
+               OpBranch %47
+         %49 = OpLabel
+         %59 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %16 = OpLoad %int %59
+         %60 = OpConvertSToF %float %16
+         %61 = OpCompositeConstruct %v4float %60 %60 %60 %60
+               OpStore %_GLF_color %61
+               OpBranch %47
+         %47 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-sinh-negative-log2/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-sinh-negative-log2/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..ed5eaec
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-sinh-negative-log2/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,53 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float undefined = 0.0f;
+  bool x_45 = false;
+  bool x_46_phi = false;
+  undefined = sinh(asfloat(0x7fc00000u));
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_10 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const bool x_38 = (1 == x_10);
+  x_46_phi = x_38;
+  if (!(x_38)) {
+    const float x_42 = undefined;
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const float x_44 = asfloat(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    x_45 = (x_42 > x_44);
+    x_46_phi = x_45;
+  }
+  if (x_46_phi) {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_12 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_13 = asint(x_6[1].x);
+    const int x_14 = asint(x_6[1].x);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_15 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    x_GLF_color = float4(float(x_12), float(x_13), float(x_14), float(x_15));
+  } else {
+    const int x_16 = asint(x_6[1].x);
+    const float x_60 = float(x_16);
+    x_GLF_color = float4(x_60, x_60, x_60, x_60);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-sinh-negative-log2/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-sinh-negative-log2/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..bea3fa4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-sinh-negative-log2/0-opt.spvasm.expected.msl
@@ -0,0 +1,67 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_8, thread float4* const tint_symbol_4) {
+  float undefined = 0.0f;
+  bool x_45 = false;
+  bool x_46_phi = false;
+  undefined = sinh(NAN);
+  int const x_10 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  bool const x_38 = (1 == x_10);
+  x_46_phi = x_38;
+  if (!(x_38)) {
+    float const x_42 = undefined;
+    float const x_44 = x_8.x_GLF_uniform_float_values.arr[0].el;
+    x_45 = (x_42 > x_44);
+    x_46_phi = x_45;
+  }
+  bool const x_46 = x_46_phi;
+  if (x_46) {
+    int const x_12 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_13 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_14 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_15 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_12), float(x_13), float(x_14), float(x_15));
+  } else {
+    int const x_16 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    float const x_60 = float(x_16);
+    *(tint_symbol_4) = float4(x_60, x_60, x_60, x_60);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_8 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-sinh-negative-log2/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-sinh-negative-log2/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..c418795
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-sinh-negative-log2/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,143 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 84
+; Schema: 0
+               OpCapability Shader
+         %33 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %undefined "undefined"
+               OpName %x_45 "x_45"
+               OpName %x_46_phi "x_46_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf1 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %26 = OpConstantNull %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %30 = OpConstantNull %bool
+%float_0x1_8p_128 = OpConstant %float 0x1.8p+128
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+   %main_out = OpTypeStruct %v4float
+         %72 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+  %undefined = OpVariable %_ptr_Function_float Function %26
+       %x_45 = OpVariable %_ptr_Function_bool Function %30
+   %x_46_phi = OpVariable %_ptr_Function_bool Function %30
+         %32 = OpExtInst %float %33 Sinh %float_0x1_8p_128
+               OpStore %undefined %32
+         %38 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %39 = OpLoad %int %38
+         %41 = OpIEqual %bool %int_1 %39
+               OpStore %x_46_phi %41
+         %42 = OpLogicalNot %bool %41
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %43
+         %44 = OpLabel
+         %45 = OpLoad %float %undefined
+         %47 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %48 = OpLoad %float %47
+         %49 = OpFOrdGreaterThan %bool %45 %48
+               OpStore %x_45 %49
+         %50 = OpLoad %bool %x_45
+               OpStore %x_46_phi %50
+               OpBranch %43
+         %43 = OpLabel
+         %51 = OpLoad %bool %x_46_phi
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %54
+         %53 = OpLabel
+         %55 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %56 = OpLoad %int %55
+         %57 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %58 = OpLoad %int %57
+         %59 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %60 = OpLoad %int %59
+         %61 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %62 = OpLoad %int %61
+         %63 = OpConvertSToF %float %56
+         %64 = OpConvertSToF %float %58
+         %65 = OpConvertSToF %float %60
+         %66 = OpConvertSToF %float %62
+         %67 = OpCompositeConstruct %v4float %63 %64 %65 %66
+               OpStore %x_GLF_color %67
+               OpBranch %52
+         %54 = OpLabel
+         %68 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %69 = OpLoad %int %68
+         %70 = OpConvertSToF %float %69
+         %71 = OpCompositeConstruct %v4float %70 %70 %70 %70
+               OpStore %x_GLF_color %71
+               OpBranch %52
+         %52 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %72
+%tint_symbol = OpFunctionParameter %main_out
+         %76 = OpLabel
+         %77 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %77
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+         %79 = OpLabel
+         %80 = OpFunctionCall %void %main_1
+         %82 = OpLoad %v4float %x_GLF_color
+         %83 = OpCompositeConstruct %main_out %82
+         %81 = OpFunctionCall %void %tint_symbol_2 %83
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-sinh-negative-log2/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-sinh-negative-log2/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..09b3c27
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-sinh-negative-log2/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,59 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var undefined : f32;
+  var x_45 : bool;
+  var x_46_phi : bool;
+  undefined = sinh(0x1.8p+128);
+  let x_10 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_38 : bool = (1 == x_10);
+  x_46_phi = x_38;
+  if (!(x_38)) {
+    let x_42 : f32 = undefined;
+    let x_44 : f32 = x_8.x_GLF_uniform_float_values[0];
+    x_45 = (x_42 > x_44);
+    x_46_phi = x_45;
+  }
+  let x_46 : bool = x_46_phi;
+  if (x_46) {
+    let x_12 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_13 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_14 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_15 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_12), f32(x_13), f32(x_14), f32(x_15));
+  } else {
+    let x_16 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_60 : f32 = f32(x_16);
+    x_GLF_color = vec4<f32>(x_60, x_60, x_60, x_60);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-sinh-negative-log2/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-sinh-negative-log2/0-opt.wgsl
new file mode 100644
index 0000000..09b3c27
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-sinh-negative-log2/0-opt.wgsl
@@ -0,0 +1,59 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var undefined : f32;
+  var x_45 : bool;
+  var x_46_phi : bool;
+  undefined = sinh(0x1.8p+128);
+  let x_10 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_38 : bool = (1 == x_10);
+  x_46_phi = x_38;
+  if (!(x_38)) {
+    let x_42 : f32 = undefined;
+    let x_44 : f32 = x_8.x_GLF_uniform_float_values[0];
+    x_45 = (x_42 > x_44);
+    x_46_phi = x_45;
+  }
+  let x_46 : bool = x_46_phi;
+  if (x_46) {
+    let x_12 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_13 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_14 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_15 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_12), f32(x_13), f32(x_14), f32(x_15));
+  } else {
+    let x_16 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_60 : f32 = f32(x_16);
+    x_GLF_color = vec4<f32>(x_60, x_60, x_60, x_60);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-sinh-negative-log2/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-sinh-negative-log2/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..7b92bee
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-sinh-negative-log2/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,6 @@
+SKIP: FAILED
+
+graphicsfuzz/cov-apfloat-sinh-negative-log2/0-opt.wgsl:25:23 error: expected ')' for function call
+  undefined = sinh(0x1.8p+128);
+                      ^^
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-sinh-negative-log2/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-sinh-negative-log2/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..7b92bee
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-sinh-negative-log2/0-opt.wgsl.expected.msl
@@ -0,0 +1,6 @@
+SKIP: FAILED
+
+graphicsfuzz/cov-apfloat-sinh-negative-log2/0-opt.wgsl:25:23 error: expected ')' for function call
+  undefined = sinh(0x1.8p+128);
+                      ^^
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-sinh-negative-log2/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-sinh-negative-log2/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..7b92bee
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-sinh-negative-log2/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,6 @@
+SKIP: FAILED
+
+graphicsfuzz/cov-apfloat-sinh-negative-log2/0-opt.wgsl:25:23 error: expected ')' for function call
+  undefined = sinh(0x1.8p+128);
+                      ^^
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-sinh-negative-log2/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-sinh-negative-log2/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..7b92bee
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-sinh-negative-log2/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+SKIP: FAILED
+
+graphicsfuzz/cov-apfloat-sinh-negative-log2/0-opt.wgsl:25:23 error: expected ')' for function call
+  undefined = sinh(0x1.8p+128);
+                      ^^
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-tanh/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-tanh/0-opt.spvasm
new file mode 100644
index 0000000..f4ea14e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-tanh/0-opt.spvasm
@@ -0,0 +1,70 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %v "v"
+               OpName %dist1 "dist1"
+               OpName %dist2 "dist2"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+    %float_4 = OpConstant %float 4
+         %16 = OpConstantComposite %v4float %float_1 %float_2 %float_3 %float_4
+%_ptr_Function_float = OpTypePointer Function %float
+%float_0_761590004 = OpConstant %float 0.761590004
+%float_0_964030027 = OpConstant %float 0.964030027
+%float_0_995050013 = OpConstant %float 0.995050013
+%float_0_999329984 = OpConstant %float 0.999329984
+         %22 = OpConstantComposite %v4float %float_0_761590004 %float_0_964030027 %float_0_995050013 %float_0_999329984
+%float_0_100000001 = OpConstant %float 0.100000001
+       %bool = OpTypeBool
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %27 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %28 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %8
+         %29 = OpLabel
+          %v = OpVariable %_ptr_Function_v4float Function
+      %dist1 = OpVariable %_ptr_Function_float Function
+      %dist2 = OpVariable %_ptr_Function_float Function
+               OpStore %v %16
+         %30 = OpLoad %v4float %v
+         %31 = OpExtInst %v4float %1 Tanh %30
+         %32 = OpLoad %v4float %v
+         %33 = OpExtInst %v4float %1 Sinh %32
+         %34 = OpLoad %v4float %v
+         %35 = OpExtInst %v4float %1 Cosh %34
+         %36 = OpFDiv %v4float %33 %35
+         %37 = OpExtInst %float %1 Distance %31 %36
+               OpStore %dist1 %37
+         %38 = OpLoad %v4float %v
+         %39 = OpExtInst %v4float %1 Tanh %38
+         %40 = OpExtInst %float %1 Distance %39 %22
+               OpStore %dist2 %40
+         %41 = OpLoad %float %dist1
+         %42 = OpFOrdLessThan %bool %41 %float_0_100000001
+         %43 = OpLoad %float %dist2
+         %44 = OpFOrdLessThan %bool %43 %float_0_100000001
+         %45 = OpLogicalAnd %bool %42 %44
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %48
+         %47 = OpLabel
+               OpStore %_GLF_color %27
+               OpBranch %46
+         %48 = OpLabel
+               OpStore %_GLF_color %28
+               OpBranch %46
+         %46 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-tanh/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-tanh/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..5cb60bd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-tanh/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,34 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 v = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float dist1 = 0.0f;
+  float dist2 = 0.0f;
+  v = float4(1.0f, 2.0f, 3.0f, 4.0f);
+  dist1 = distance(tanh(v), (sinh(v) / cosh(v)));
+  dist2 = distance(tanh(v), float4(0.761590004f, 0.964030027f, 0.995050013f, 0.999329984f));
+  bool tint_tmp = (dist1 < 0.100000001f);
+  if (tint_tmp) {
+    tint_tmp = (dist2 < 0.100000001f);
+  }
+  if ((tint_tmp)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-tanh/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-tanh/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..3b940f3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-tanh/0-opt.spvasm.expected.msl
@@ -0,0 +1,39 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  float4 v = 0.0f;
+  float dist1 = 0.0f;
+  float dist2 = 0.0f;
+  v = float4(1.0f, 2.0f, 3.0f, 4.0f);
+  float4 const x_30 = v;
+  float4 const x_32 = v;
+  float4 const x_34 = v;
+  dist1 = distance(tanh(x_30), (sinh(x_32) / cosh(x_34)));
+  float4 const x_38 = v;
+  dist2 = distance(tanh(x_38), float4(0.761590004f, 0.964030027f, 0.995050013f, 0.999329984f));
+  float const x_41 = dist1;
+  float const x_43 = dist2;
+  if (((x_41 < 0.100000001f) && (x_43 < 0.100000001f))) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-tanh/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-tanh/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..1f2f4f7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-tanh/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,107 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 67
+; Schema: 0
+               OpCapability Shader
+         %27 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v "v"
+               OpName %dist1 "dist1"
+               OpName %dist2 "dist2"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%_ptr_Function_float = OpTypePointer Function %float
+         %16 = OpConstantNull %float
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+    %float_4 = OpConstant %float 4
+         %22 = OpConstantComposite %v4float %float_1 %float_2 %float_3 %float_4
+%float_0_761590004 = OpConstant %float 0.761590004
+%float_0_964030027 = OpConstant %float 0.964030027
+%float_0_995050013 = OpConstant %float 0.995050013
+%float_0_999329984 = OpConstant %float 0.999329984
+         %39 = OpConstantComposite %v4float %float_0_761590004 %float_0_964030027 %float_0_995050013 %float_0_999329984
+%float_0_100000001 = OpConstant %float 0.100000001
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+         %53 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %54 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %55 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %v = OpVariable %_ptr_Function_v4float Function %5
+      %dist1 = OpVariable %_ptr_Function_float Function %16
+      %dist2 = OpVariable %_ptr_Function_float Function %16
+               OpStore %v %22
+         %23 = OpLoad %v4float %v
+         %24 = OpLoad %v4float %v
+         %25 = OpLoad %v4float %v
+         %28 = OpExtInst %v4float %27 Tanh %23
+         %29 = OpExtInst %v4float %27 Sinh %24
+         %30 = OpExtInst %v4float %27 Cosh %25
+         %31 = OpFDiv %v4float %29 %30
+         %26 = OpExtInst %float %27 Distance %28 %31
+               OpStore %dist1 %26
+         %32 = OpLoad %v4float %v
+         %34 = OpExtInst %v4float %27 Tanh %32
+         %33 = OpExtInst %float %27 Distance %34 %39
+               OpStore %dist2 %33
+         %40 = OpLoad %float %dist1
+         %41 = OpLoad %float %dist2
+         %43 = OpFOrdLessThan %bool %40 %float_0_100000001
+               OpSelectionMerge %45 None
+               OpBranchConditional %43 %46 %45
+         %46 = OpLabel
+         %47 = OpFOrdLessThan %bool %41 %float_0_100000001
+               OpBranch %45
+         %45 = OpLabel
+         %48 = OpPhi %bool %43 %11 %47 %46
+               OpSelectionMerge %49 None
+               OpBranchConditional %48 %50 %51
+         %50 = OpLabel
+               OpStore %x_GLF_color %53
+               OpBranch %49
+         %51 = OpLabel
+               OpStore %x_GLF_color %54
+               OpBranch %49
+         %49 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %55
+%tint_symbol = OpFunctionParameter %main_out
+         %59 = OpLabel
+         %60 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %60
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %62 = OpLabel
+         %63 = OpFunctionCall %void %main_1
+         %65 = OpLoad %v4float %x_GLF_color
+         %66 = OpCompositeConstruct %main_out %65
+         %64 = OpFunctionCall %void %tint_symbol_2 %66
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-tanh/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-tanh/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..8bcb3a5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-tanh/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,33 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v : vec4<f32>;
+  var dist1 : f32;
+  var dist2 : f32;
+  v = vec4<f32>(1.0, 2.0, 3.0, 4.0);
+  let x_30 : vec4<f32> = v;
+  let x_32 : vec4<f32> = v;
+  let x_34 : vec4<f32> = v;
+  dist1 = distance(tanh(x_30), (sinh(x_32) / cosh(x_34)));
+  let x_38 : vec4<f32> = v;
+  dist2 = distance(tanh(x_38), vec4<f32>(0.761590004, 0.964030027, 0.995050013, 0.999329984));
+  let x_41 : f32 = dist1;
+  let x_43 : f32 = dist2;
+  if (((x_41 < 0.100000001) && (x_43 < 0.100000001))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-tanh/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-tanh/0-opt.wgsl
new file mode 100644
index 0000000..8bcb3a5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-tanh/0-opt.wgsl
@@ -0,0 +1,33 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v : vec4<f32>;
+  var dist1 : f32;
+  var dist2 : f32;
+  v = vec4<f32>(1.0, 2.0, 3.0, 4.0);
+  let x_30 : vec4<f32> = v;
+  let x_32 : vec4<f32> = v;
+  let x_34 : vec4<f32> = v;
+  dist1 = distance(tanh(x_30), (sinh(x_32) / cosh(x_34)));
+  let x_38 : vec4<f32> = v;
+  dist2 = distance(tanh(x_38), vec4<f32>(0.761590004, 0.964030027, 0.995050013, 0.999329984));
+  let x_41 : f32 = dist1;
+  let x_43 : f32 = dist2;
+  if (((x_41 < 0.100000001) && (x_43 < 0.100000001))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-tanh/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-tanh/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..5cb60bd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-tanh/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,34 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 v = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float dist1 = 0.0f;
+  float dist2 = 0.0f;
+  v = float4(1.0f, 2.0f, 3.0f, 4.0f);
+  dist1 = distance(tanh(v), (sinh(v) / cosh(v)));
+  dist2 = distance(tanh(v), float4(0.761590004f, 0.964030027f, 0.995050013f, 0.999329984f));
+  bool tint_tmp = (dist1 < 0.100000001f);
+  if (tint_tmp) {
+    tint_tmp = (dist2 < 0.100000001f);
+  }
+  if ((tint_tmp)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-tanh/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-tanh/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..3b940f3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-tanh/0-opt.wgsl.expected.msl
@@ -0,0 +1,39 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  float4 v = 0.0f;
+  float dist1 = 0.0f;
+  float dist2 = 0.0f;
+  v = float4(1.0f, 2.0f, 3.0f, 4.0f);
+  float4 const x_30 = v;
+  float4 const x_32 = v;
+  float4 const x_34 = v;
+  dist1 = distance(tanh(x_30), (sinh(x_32) / cosh(x_34)));
+  float4 const x_38 = v;
+  dist2 = distance(tanh(x_38), float4(0.761590004f, 0.964030027f, 0.995050013f, 0.999329984f));
+  float const x_41 = dist1;
+  float const x_43 = dist2;
+  if (((x_41 < 0.100000001f) && (x_43 < 0.100000001f))) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-tanh/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-tanh/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..1f2f4f7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-tanh/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,107 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 67
+; Schema: 0
+               OpCapability Shader
+         %27 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v "v"
+               OpName %dist1 "dist1"
+               OpName %dist2 "dist2"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%_ptr_Function_float = OpTypePointer Function %float
+         %16 = OpConstantNull %float
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+    %float_4 = OpConstant %float 4
+         %22 = OpConstantComposite %v4float %float_1 %float_2 %float_3 %float_4
+%float_0_761590004 = OpConstant %float 0.761590004
+%float_0_964030027 = OpConstant %float 0.964030027
+%float_0_995050013 = OpConstant %float 0.995050013
+%float_0_999329984 = OpConstant %float 0.999329984
+         %39 = OpConstantComposite %v4float %float_0_761590004 %float_0_964030027 %float_0_995050013 %float_0_999329984
+%float_0_100000001 = OpConstant %float 0.100000001
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+         %53 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %54 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %55 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %v = OpVariable %_ptr_Function_v4float Function %5
+      %dist1 = OpVariable %_ptr_Function_float Function %16
+      %dist2 = OpVariable %_ptr_Function_float Function %16
+               OpStore %v %22
+         %23 = OpLoad %v4float %v
+         %24 = OpLoad %v4float %v
+         %25 = OpLoad %v4float %v
+         %28 = OpExtInst %v4float %27 Tanh %23
+         %29 = OpExtInst %v4float %27 Sinh %24
+         %30 = OpExtInst %v4float %27 Cosh %25
+         %31 = OpFDiv %v4float %29 %30
+         %26 = OpExtInst %float %27 Distance %28 %31
+               OpStore %dist1 %26
+         %32 = OpLoad %v4float %v
+         %34 = OpExtInst %v4float %27 Tanh %32
+         %33 = OpExtInst %float %27 Distance %34 %39
+               OpStore %dist2 %33
+         %40 = OpLoad %float %dist1
+         %41 = OpLoad %float %dist2
+         %43 = OpFOrdLessThan %bool %40 %float_0_100000001
+               OpSelectionMerge %45 None
+               OpBranchConditional %43 %46 %45
+         %46 = OpLabel
+         %47 = OpFOrdLessThan %bool %41 %float_0_100000001
+               OpBranch %45
+         %45 = OpLabel
+         %48 = OpPhi %bool %43 %11 %47 %46
+               OpSelectionMerge %49 None
+               OpBranchConditional %48 %50 %51
+         %50 = OpLabel
+               OpStore %x_GLF_color %53
+               OpBranch %49
+         %51 = OpLabel
+               OpStore %x_GLF_color %54
+               OpBranch %49
+         %49 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %55
+%tint_symbol = OpFunctionParameter %main_out
+         %59 = OpLabel
+         %60 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %60
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %62 = OpLabel
+         %63 = OpFunctionCall %void %main_1
+         %65 = OpLoad %v4float %x_GLF_color
+         %66 = OpCompositeConstruct %main_out %65
+         %64 = OpFunctionCall %void %tint_symbol_2 %66
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-tanh/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-tanh/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..8bcb3a5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-tanh/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,33 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v : vec4<f32>;
+  var dist1 : f32;
+  var dist2 : f32;
+  v = vec4<f32>(1.0, 2.0, 3.0, 4.0);
+  let x_30 : vec4<f32> = v;
+  let x_32 : vec4<f32> = v;
+  let x_34 : vec4<f32> = v;
+  dist1 = distance(tanh(x_30), (sinh(x_32) / cosh(x_34)));
+  let x_38 : vec4<f32> = v;
+  dist2 = distance(tanh(x_38), vec4<f32>(0.761590004, 0.964030027, 0.995050013, 0.999329984));
+  let x_41 : f32 = dist1;
+  let x_43 : f32 = dist2;
+  if (((x_41 < 0.100000001) && (x_43 < 0.100000001))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-undefined-matrix-mul/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-undefined-matrix-mul/0-opt.spvasm
new file mode 100644
index 0000000..65b9079
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-undefined-matrix-mul/0-opt.spvasm
@@ -0,0 +1,228 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %m0 "m0"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %m1 "m1"
+               OpName %undefined "undefined"
+               OpName %defined "defined"
+               OpName %v0 "v0"
+               OpName %v1 "v1"
+               OpName %v2 "v2"
+               OpName %v3 "v3"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpDecorate %_arr_int_uint_12 ArrayStride 16
+               OpMemberDecorate %buf1 0 RelaxedPrecision
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %17 RelaxedPrecision
+               OpDecorate %18 RelaxedPrecision
+               OpDecorate %19 RelaxedPrecision
+               OpDecorate %20 RelaxedPrecision
+               OpDecorate %21 RelaxedPrecision
+               OpDecorate %22 RelaxedPrecision
+               OpDecorate %23 RelaxedPrecision
+               OpDecorate %24 RelaxedPrecision
+               OpDecorate %25 RelaxedPrecision
+               OpDecorate %26 RelaxedPrecision
+               OpDecorate %27 RelaxedPrecision
+               OpDecorate %28 RelaxedPrecision
+               OpDecorate %29 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %30 RelaxedPrecision
+               OpDecorate %31 RelaxedPrecision
+               OpDecorate %32 RelaxedPrecision
+               OpDecorate %33 RelaxedPrecision
+               OpDecorate %34 RelaxedPrecision
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+       %void = OpTypeVoid
+         %37 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%mat3v4float = OpTypeMatrix %v4float 3
+%_ptr_Function_mat3v4float = OpTypePointer Function %mat3v4float
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_12 = OpConstant %uint 12
+%_arr_int_uint_12 = OpTypeArray %int %uint_12
+       %buf1 = OpTypeStruct %_arr_int_uint_12
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+    %float_4 = OpConstant %float 4
+     %int_10 = OpConstant %int 10
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+    %float_8 = OpConstant %float 8
+     %int_11 = OpConstant %int 11
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %64 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+      %v3int = OpTypeVector %int 3
+    %int_500 = OpConstant %int 500
+         %67 = OpConstantComposite %v3int %int_500 %int_500 %int_500
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+       %bool = OpTypeBool
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+      %int_9 = OpConstant %int 9
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Output_float = OpTypePointer Output %float
+       %main = OpFunction %void None %37
+         %78 = OpLabel
+         %m0 = OpVariable %_ptr_Function_mat3v4float Function
+         %m1 = OpVariable %_ptr_Function_mat3v4float Function
+  %undefined = OpVariable %_ptr_Function_v3float Function
+    %defined = OpVariable %_ptr_Function_v3float Function
+         %v0 = OpVariable %_ptr_Function_v4float Function
+         %v1 = OpVariable %_ptr_Function_v4float Function
+         %v2 = OpVariable %_ptr_Function_v4float Function
+         %v3 = OpVariable %_ptr_Function_v4float Function
+         %79 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_4
+         %17 = OpLoad %int %79
+         %80 = OpConvertSToF %float %17
+         %81 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_5
+         %18 = OpLoad %int %81
+         %82 = OpConvertSToF %float %18
+         %83 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_6
+         %19 = OpLoad %int %83
+         %84 = OpConvertSToF %float %19
+         %85 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_10
+         %20 = OpLoad %int %85
+         %86 = OpConvertSToF %float %20
+         %87 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_7
+         %21 = OpLoad %int %87
+         %88 = OpConvertSToF %float %21
+         %89 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_8
+         %22 = OpLoad %int %89
+         %90 = OpConvertSToF %float %22
+         %91 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_11
+         %23 = OpLoad %int %91
+         %92 = OpConvertSToF %float %23
+         %93 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %24 = OpLoad %int %93
+         %94 = OpConvertSToF %float %24
+         %95 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %25 = OpLoad %int %95
+         %96 = OpConvertSToF %float %25
+         %97 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %26 = OpLoad %int %97
+         %98 = OpConvertSToF %float %26
+         %99 = OpCompositeConstruct %v4float %80 %82 %84 %float_4
+        %100 = OpCompositeConstruct %v4float %86 %88 %90 %float_8
+        %101 = OpCompositeConstruct %v4float %92 %94 %96 %98
+        %102 = OpCompositeConstruct %mat3v4float %99 %100 %101
+               OpStore %m0 %102
+        %103 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_4
+         %27 = OpLoad %int %103
+        %104 = OpConvertSToF %float %27
+        %105 = OpCompositeConstruct %v4float %104 %float_0 %float_0 %float_0
+        %106 = OpCompositeConstruct %v4float %float_0 %104 %float_0 %float_0
+        %107 = OpCompositeConstruct %v4float %float_0 %float_0 %104 %float_0
+        %108 = OpCompositeConstruct %mat3v4float %105 %106 %107
+               OpStore %m1 %108
+        %109 = OpExtInst %v3float %1 Ldexp %64 %67
+               OpStore %undefined %109
+        %110 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_4
+         %28 = OpLoad %int %110
+        %111 = OpConvertSToF %float %28
+        %112 = OpCompositeConstruct %v3float %111 %111 %111
+        %113 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %29 = OpLoad %int %113
+        %114 = OpCompositeConstruct %v3int %29 %29 %29
+        %115 = OpExtInst %v3float %1 Ldexp %112 %114
+               OpStore %defined %115
+        %116 = OpLoad %mat3v4float %m0
+        %117 = OpLoad %v3float %undefined
+        %118 = OpMatrixTimesVector %v4float %116 %117
+               OpStore %v0 %118
+        %119 = OpLoad %mat3v4float %m1
+        %120 = OpLoad %v3float %undefined
+        %121 = OpMatrixTimesVector %v4float %119 %120
+               OpStore %v1 %121
+        %122 = OpLoad %mat3v4float %m0
+        %123 = OpLoad %v3float %defined
+        %124 = OpMatrixTimesVector %v4float %122 %123
+               OpStore %v2 %124
+        %125 = OpLoad %mat3v4float %m1
+        %126 = OpLoad %v3float %defined
+        %127 = OpMatrixTimesVector %v4float %125 %126
+               OpStore %v3 %127
+        %128 = OpAccessChain %_ptr_Function_float %v2 %uint_0
+        %129 = OpLoad %float %128
+        %130 = OpAccessChain %_ptr_Function_float %v3 %uint_0
+        %131 = OpLoad %float %130
+        %132 = OpFOrdGreaterThan %bool %129 %131
+               OpSelectionMerge %133 None
+               OpBranchConditional %132 %134 %135
+        %134 = OpLabel
+        %136 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_4
+         %30 = OpLoad %int %136
+        %137 = OpConvertSToF %float %30
+        %138 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_9
+         %31 = OpLoad %int %138
+        %139 = OpConvertSToF %float %31
+        %140 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_9
+         %32 = OpLoad %int %140
+        %141 = OpConvertSToF %float %32
+        %142 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_4
+         %33 = OpLoad %int %142
+        %143 = OpConvertSToF %float %33
+        %144 = OpCompositeConstruct %v4float %137 %139 %141 %143
+               OpStore %_GLF_color %144
+               OpBranch %133
+        %135 = OpLabel
+        %145 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_9
+         %34 = OpLoad %int %145
+        %146 = OpConvertSToF %float %34
+        %147 = OpCompositeConstruct %v4float %146 %146 %146 %146
+               OpStore %_GLF_color %147
+               OpBranch %133
+        %133 = OpLabel
+        %148 = OpAccessChain %_ptr_Function_float %v0 %uint_0
+        %149 = OpLoad %float %148
+        %150 = OpAccessChain %_ptr_Function_float %v1 %uint_0
+        %151 = OpLoad %float %150
+        %152 = OpFOrdLessThan %bool %149 %151
+               OpSelectionMerge %153 None
+               OpBranchConditional %152 %154 %153
+        %154 = OpLabel
+        %155 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+        %156 = OpLoad %float %155
+        %157 = OpAccessChain %_ptr_Output_float %_GLF_color %uint_1
+               OpStore %157 %156
+               OpBranch %153
+        %153 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-undefined-matrix-mul/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-undefined-matrix-mul/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..4a1c25c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-undefined-matrix-mul/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,77 @@
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[12];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_15 : register(b0, space0) {
+  uint4 x_15[1];
+};
+
+void main_1() {
+  float3x4 m0 = float3x4(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  float3x4 m1 = float3x4(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  float3 undefined = float3(0.0f, 0.0f, 0.0f);
+  float3 defined = float3(0.0f, 0.0f, 0.0f);
+  float4 v0 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 v1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 v2 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 v3 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  const int x_17 = asint(x_6[4].x);
+  const int x_18 = asint(x_6[5].x);
+  const int x_19 = asint(x_6[6].x);
+  const int x_20 = asint(x_6[10].x);
+  const int x_21 = asint(x_6[7].x);
+  const int x_22 = asint(x_6[8].x);
+  const int x_23 = asint(x_6[11].x);
+  const int x_24 = asint(x_6[1].x);
+  const int x_25 = asint(x_6[2].x);
+  const int x_26 = asint(x_6[3].x);
+  m0 = float3x4(float4(float(x_17), float(x_18), float(x_19), 4.0f), float4(float(x_20), float(x_21), float(x_22), 8.0f), float4(float(x_23), float(x_24), float(x_25), float(x_26)));
+  const int x_27 = asint(x_6[4].x);
+  const float x_104 = float(x_27);
+  m1 = float3x4(float4(x_104, 0.0f, 0.0f, 0.0f), float4(0.0f, x_104, 0.0f, 0.0f), float4(0.0f, 0.0f, x_104, 0.0f));
+  undefined = ldexp(float3(1.0f, 1.0f, 1.0f), int3(500, 500, 500));
+  const int x_28 = asint(x_6[4].x);
+  const float x_111 = float(x_28);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_29 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  defined = ldexp(float3(x_111, x_111, x_111), int3(x_29, x_29, x_29));
+  v0 = mul(undefined, m0);
+  v1 = mul(undefined, m1);
+  v2 = mul(defined, m0);
+  v3 = mul(defined, m1);
+  const float x_129 = v2.x;
+  const float x_131 = v3.x;
+  if ((x_129 > x_131)) {
+    const int x_30 = asint(x_6[4].x);
+    const int x_31 = asint(x_6[9].x);
+    const int x_32 = asint(x_6[9].x);
+    const int x_33 = asint(x_6[4].x);
+    x_GLF_color = float4(float(x_30), float(x_31), float(x_32), float(x_33));
+  } else {
+    const int x_34 = asint(x_6[9].x);
+    const float x_146 = float(x_34);
+    x_GLF_color = float4(x_146, x_146, x_146, x_146);
+  }
+  const float x_149 = v0.x;
+  const float x_151 = v1.x;
+  if ((x_149 < x_151)) {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const float x_156 = asfloat(x_15[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    x_GLF_color.y = x_156;
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-undefined-matrix-mul/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-undefined-matrix-mul/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..8009725
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-undefined-matrix-mul/0-opt.spvasm.expected.msl
@@ -0,0 +1,100 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[12];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_15, thread float4* const tint_symbol_4) {
+  float3x4 m0 = float3x4(0.0f);
+  float3x4 m1 = float3x4(0.0f);
+  float3 undefined = 0.0f;
+  float3 defined = 0.0f;
+  float4 v0 = 0.0f;
+  float4 v1 = 0.0f;
+  float4 v2 = 0.0f;
+  float4 v3 = 0.0f;
+  int const x_17 = x_6.x_GLF_uniform_int_values.arr[4].el;
+  int const x_18 = x_6.x_GLF_uniform_int_values.arr[5].el;
+  int const x_19 = x_6.x_GLF_uniform_int_values.arr[6].el;
+  int const x_20 = x_6.x_GLF_uniform_int_values.arr[10].el;
+  int const x_21 = x_6.x_GLF_uniform_int_values.arr[7].el;
+  int const x_22 = x_6.x_GLF_uniform_int_values.arr[8].el;
+  int const x_23 = x_6.x_GLF_uniform_int_values.arr[11].el;
+  int const x_24 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_25 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_26 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  m0 = float3x4(float4(float(x_17), float(x_18), float(x_19), 4.0f), float4(float(x_20), float(x_21), float(x_22), 8.0f), float4(float(x_23), float(x_24), float(x_25), float(x_26)));
+  int const x_27 = x_6.x_GLF_uniform_int_values.arr[4].el;
+  float const x_104 = float(x_27);
+  m1 = float3x4(float4(x_104, 0.0f, 0.0f, 0.0f), float4(0.0f, x_104, 0.0f, 0.0f), float4(0.0f, 0.0f, x_104, 0.0f));
+  undefined = ldexp(float3(1.0f, 1.0f, 1.0f), int3(500, 500, 500));
+  int const x_28 = x_6.x_GLF_uniform_int_values.arr[4].el;
+  float const x_111 = float(x_28);
+  int const x_29 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  defined = ldexp(float3(x_111, x_111, x_111), int3(x_29, x_29, x_29));
+  float3x4 const x_116 = m0;
+  float3 const x_117 = undefined;
+  v0 = (x_116 * x_117);
+  float3x4 const x_119 = m1;
+  float3 const x_120 = undefined;
+  v1 = (x_119 * x_120);
+  float3x4 const x_122 = m0;
+  float3 const x_123 = defined;
+  v2 = (x_122 * x_123);
+  float3x4 const x_125 = m1;
+  float3 const x_126 = defined;
+  v3 = (x_125 * x_126);
+  float const x_129 = v2.x;
+  float const x_131 = v3.x;
+  if ((x_129 > x_131)) {
+    int const x_30 = x_6.x_GLF_uniform_int_values.arr[4].el;
+    int const x_31 = x_6.x_GLF_uniform_int_values.arr[9].el;
+    int const x_32 = x_6.x_GLF_uniform_int_values.arr[9].el;
+    int const x_33 = x_6.x_GLF_uniform_int_values.arr[4].el;
+    *(tint_symbol_4) = float4(float(x_30), float(x_31), float(x_32), float(x_33));
+  } else {
+    int const x_34 = x_6.x_GLF_uniform_int_values.arr[9].el;
+    float const x_146 = float(x_34);
+    *(tint_symbol_4) = float4(x_146, x_146, x_146, x_146);
+  }
+  float const x_149 = v0.x;
+  float const x_151 = v1.x;
+  if ((x_149 < x_151)) {
+    float const x_156 = x_15.x_GLF_uniform_float_values.arr[0].el;
+    (*(tint_symbol_4)).y = x_156;
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_15 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_15, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-undefined-matrix-mul/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-undefined-matrix-mul/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..5f8230b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-undefined-matrix-mul/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,244 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 175
+; Schema: 0
+               OpCapability Shader
+         %96 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_15 "x_15"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %m0 "m0"
+               OpName %m1 "m1"
+               OpName %undefined "undefined"
+               OpName %defined "defined"
+               OpName %v0 "v0"
+               OpName %v1 "v1"
+               OpName %v2 "v2"
+               OpName %v3 "v3"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_12 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_15 NonWritable
+               OpDecorate %x_15 DescriptorSet 0
+               OpDecorate %x_15 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_12 = OpConstant %uint 12
+%_arr_int_uint_12 = OpTypeArray %int %uint_12
+       %buf1 = OpTypeStruct %_arr_int_uint_12
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_15 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%mat3v4float = OpTypeMatrix %v4float 3
+%_ptr_Function_mat3v4float = OpTypePointer Function %mat3v4float
+         %27 = OpConstantNull %mat3v4float
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %32 = OpConstantNull %v3float
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_0 = OpConstant %uint 0
+      %int_4 = OpConstant %int 4
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+     %int_10 = OpConstant %int 10
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+     %int_11 = OpConstant %int 11
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+    %float_4 = OpConstant %float 4
+    %float_8 = OpConstant %float 8
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %98 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+      %v3int = OpTypeVector %int 3
+    %int_500 = OpConstant %int 500
+        %101 = OpConstantComposite %v3int %int_500 %int_500 %int_500
+      %int_0 = OpConstant %int 0
+%_ptr_Function_float = OpTypePointer Function %float
+       %bool = OpTypeBool
+      %int_9 = OpConstant %int 9
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Private_float = OpTypePointer Private %float
+   %main_out = OpTypeStruct %v4float
+        %163 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+         %m0 = OpVariable %_ptr_Function_mat3v4float Function %27
+         %m1 = OpVariable %_ptr_Function_mat3v4float Function %27
+  %undefined = OpVariable %_ptr_Function_v3float Function %32
+    %defined = OpVariable %_ptr_Function_v3float Function %32
+         %v0 = OpVariable %_ptr_Function_v4float Function %12
+         %v1 = OpVariable %_ptr_Function_v4float Function %12
+         %v2 = OpVariable %_ptr_Function_v4float Function %12
+         %v3 = OpVariable %_ptr_Function_v4float Function %12
+         %42 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+         %43 = OpLoad %int %42
+         %45 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_5
+         %46 = OpLoad %int %45
+         %48 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_6
+         %49 = OpLoad %int %48
+         %51 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_10
+         %52 = OpLoad %int %51
+         %54 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_7
+         %55 = OpLoad %int %54
+         %57 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_8
+         %58 = OpLoad %int %57
+         %60 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_11
+         %61 = OpLoad %int %60
+         %63 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %64 = OpLoad %int %63
+         %66 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %67 = OpLoad %int %66
+         %69 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %70 = OpLoad %int %69
+         %71 = OpConvertSToF %float %43
+         %72 = OpConvertSToF %float %46
+         %73 = OpConvertSToF %float %49
+         %75 = OpCompositeConstruct %v4float %71 %72 %73 %float_4
+         %76 = OpConvertSToF %float %52
+         %77 = OpConvertSToF %float %55
+         %78 = OpConvertSToF %float %58
+         %80 = OpCompositeConstruct %v4float %76 %77 %78 %float_8
+         %81 = OpConvertSToF %float %61
+         %82 = OpConvertSToF %float %64
+         %83 = OpConvertSToF %float %67
+         %84 = OpConvertSToF %float %70
+         %85 = OpCompositeConstruct %v4float %81 %82 %83 %84
+         %86 = OpCompositeConstruct %mat3v4float %75 %80 %85
+               OpStore %m0 %86
+         %87 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+         %88 = OpLoad %int %87
+         %89 = OpConvertSToF %float %88
+         %91 = OpCompositeConstruct %v4float %89 %float_0 %float_0 %float_0
+         %92 = OpCompositeConstruct %v4float %float_0 %89 %float_0 %float_0
+         %93 = OpCompositeConstruct %v4float %float_0 %float_0 %89 %float_0
+         %94 = OpCompositeConstruct %mat3v4float %91 %92 %93
+               OpStore %m1 %94
+         %95 = OpExtInst %v3float %96 Ldexp %98 %101
+               OpStore %undefined %95
+        %102 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+        %103 = OpLoad %int %102
+        %104 = OpConvertSToF %float %103
+        %106 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %107 = OpLoad %int %106
+        %109 = OpCompositeConstruct %v3float %104 %104 %104
+        %110 = OpCompositeConstruct %v3int %107 %107 %107
+        %108 = OpExtInst %v3float %96 Ldexp %109 %110
+               OpStore %defined %108
+        %111 = OpLoad %mat3v4float %m0
+        %112 = OpLoad %v3float %undefined
+        %113 = OpMatrixTimesVector %v4float %111 %112
+               OpStore %v0 %113
+        %114 = OpLoad %mat3v4float %m1
+        %115 = OpLoad %v3float %undefined
+        %116 = OpMatrixTimesVector %v4float %114 %115
+               OpStore %v1 %116
+        %117 = OpLoad %mat3v4float %m0
+        %118 = OpLoad %v3float %defined
+        %119 = OpMatrixTimesVector %v4float %117 %118
+               OpStore %v2 %119
+        %120 = OpLoad %mat3v4float %m1
+        %121 = OpLoad %v3float %defined
+        %122 = OpMatrixTimesVector %v4float %120 %121
+               OpStore %v3 %122
+        %124 = OpAccessChain %_ptr_Function_float %v2 %uint_0
+        %125 = OpLoad %float %124
+        %126 = OpAccessChain %_ptr_Function_float %v3 %uint_0
+        %127 = OpLoad %float %126
+        %128 = OpFOrdGreaterThan %bool %125 %127
+               OpSelectionMerge %130 None
+               OpBranchConditional %128 %131 %132
+        %131 = OpLabel
+        %133 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+        %134 = OpLoad %int %133
+        %136 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_9
+        %137 = OpLoad %int %136
+        %138 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_9
+        %139 = OpLoad %int %138
+        %140 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+        %141 = OpLoad %int %140
+        %142 = OpConvertSToF %float %134
+        %143 = OpConvertSToF %float %137
+        %144 = OpConvertSToF %float %139
+        %145 = OpConvertSToF %float %141
+        %146 = OpCompositeConstruct %v4float %142 %143 %144 %145
+               OpStore %x_GLF_color %146
+               OpBranch %130
+        %132 = OpLabel
+        %147 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_9
+        %148 = OpLoad %int %147
+        %149 = OpConvertSToF %float %148
+        %150 = OpCompositeConstruct %v4float %149 %149 %149 %149
+               OpStore %x_GLF_color %150
+               OpBranch %130
+        %130 = OpLabel
+        %151 = OpAccessChain %_ptr_Function_float %v0 %uint_0
+        %152 = OpLoad %float %151
+        %153 = OpAccessChain %_ptr_Function_float %v1 %uint_0
+        %154 = OpLoad %float %153
+        %155 = OpFOrdLessThan %bool %152 %154
+               OpSelectionMerge %156 None
+               OpBranchConditional %155 %157 %156
+        %157 = OpLabel
+        %159 = OpAccessChain %_ptr_Uniform_float %x_15 %uint_0 %int_0
+        %160 = OpLoad %float %159
+        %162 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_1
+               OpStore %162 %160
+               OpBranch %156
+        %156 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %163
+%tint_symbol = OpFunctionParameter %main_out
+        %167 = OpLabel
+        %168 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %168
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %170 = OpLabel
+        %171 = OpFunctionCall %void %main_1
+        %173 = OpLoad %v4float %x_GLF_color
+        %174 = OpCompositeConstruct %main_out %173
+        %172 = OpFunctionCall %void %tint_symbol_2 %174
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-undefined-matrix-mul/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-undefined-matrix-mul/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..e298a8c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-undefined-matrix-mul/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,92 @@
+type Arr = [[stride(16)]] array<i32, 12>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_15 : buf0;
+
+fn main_1() {
+  var m0 : mat3x4<f32>;
+  var m1 : mat3x4<f32>;
+  var undefined : vec3<f32>;
+  var defined : vec3<f32>;
+  var v0 : vec4<f32>;
+  var v1 : vec4<f32>;
+  var v2 : vec4<f32>;
+  var v3 : vec4<f32>;
+  let x_17 : i32 = x_6.x_GLF_uniform_int_values[4];
+  let x_18 : i32 = x_6.x_GLF_uniform_int_values[5];
+  let x_19 : i32 = x_6.x_GLF_uniform_int_values[6];
+  let x_20 : i32 = x_6.x_GLF_uniform_int_values[10];
+  let x_21 : i32 = x_6.x_GLF_uniform_int_values[7];
+  let x_22 : i32 = x_6.x_GLF_uniform_int_values[8];
+  let x_23 : i32 = x_6.x_GLF_uniform_int_values[11];
+  let x_24 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_25 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_26 : i32 = x_6.x_GLF_uniform_int_values[3];
+  m0 = mat3x4<f32>(vec4<f32>(f32(x_17), f32(x_18), f32(x_19), 4.0), vec4<f32>(f32(x_20), f32(x_21), f32(x_22), 8.0), vec4<f32>(f32(x_23), f32(x_24), f32(x_25), f32(x_26)));
+  let x_27 : i32 = x_6.x_GLF_uniform_int_values[4];
+  let x_104 : f32 = f32(x_27);
+  m1 = mat3x4<f32>(vec4<f32>(x_104, 0.0, 0.0, 0.0), vec4<f32>(0.0, x_104, 0.0, 0.0), vec4<f32>(0.0, 0.0, x_104, 0.0));
+  undefined = ldexp(vec3<f32>(1.0, 1.0, 1.0), vec3<i32>(500, 500, 500));
+  let x_28 : i32 = x_6.x_GLF_uniform_int_values[4];
+  let x_111 : f32 = f32(x_28);
+  let x_29 : i32 = x_6.x_GLF_uniform_int_values[0];
+  defined = ldexp(vec3<f32>(x_111, x_111, x_111), vec3<i32>(x_29, x_29, x_29));
+  let x_116 : mat3x4<f32> = m0;
+  let x_117 : vec3<f32> = undefined;
+  v0 = (x_116 * x_117);
+  let x_119 : mat3x4<f32> = m1;
+  let x_120 : vec3<f32> = undefined;
+  v1 = (x_119 * x_120);
+  let x_122 : mat3x4<f32> = m0;
+  let x_123 : vec3<f32> = defined;
+  v2 = (x_122 * x_123);
+  let x_125 : mat3x4<f32> = m1;
+  let x_126 : vec3<f32> = defined;
+  v3 = (x_125 * x_126);
+  let x_129 : f32 = v2.x;
+  let x_131 : f32 = v3.x;
+  if ((x_129 > x_131)) {
+    let x_30 : i32 = x_6.x_GLF_uniform_int_values[4];
+    let x_31 : i32 = x_6.x_GLF_uniform_int_values[9];
+    let x_32 : i32 = x_6.x_GLF_uniform_int_values[9];
+    let x_33 : i32 = x_6.x_GLF_uniform_int_values[4];
+    x_GLF_color = vec4<f32>(f32(x_30), f32(x_31), f32(x_32), f32(x_33));
+  } else {
+    let x_34 : i32 = x_6.x_GLF_uniform_int_values[9];
+    let x_146 : f32 = f32(x_34);
+    x_GLF_color = vec4<f32>(x_146, x_146, x_146, x_146);
+  }
+  let x_149 : f32 = v0.x;
+  let x_151 : f32 = v1.x;
+  if ((x_149 < x_151)) {
+    let x_156 : f32 = x_15.x_GLF_uniform_float_values[0];
+    x_GLF_color.y = x_156;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-undefined-matrix-mul/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-undefined-matrix-mul/0-opt.wgsl
new file mode 100644
index 0000000..e298a8c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-undefined-matrix-mul/0-opt.wgsl
@@ -0,0 +1,92 @@
+type Arr = [[stride(16)]] array<i32, 12>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_15 : buf0;
+
+fn main_1() {
+  var m0 : mat3x4<f32>;
+  var m1 : mat3x4<f32>;
+  var undefined : vec3<f32>;
+  var defined : vec3<f32>;
+  var v0 : vec4<f32>;
+  var v1 : vec4<f32>;
+  var v2 : vec4<f32>;
+  var v3 : vec4<f32>;
+  let x_17 : i32 = x_6.x_GLF_uniform_int_values[4];
+  let x_18 : i32 = x_6.x_GLF_uniform_int_values[5];
+  let x_19 : i32 = x_6.x_GLF_uniform_int_values[6];
+  let x_20 : i32 = x_6.x_GLF_uniform_int_values[10];
+  let x_21 : i32 = x_6.x_GLF_uniform_int_values[7];
+  let x_22 : i32 = x_6.x_GLF_uniform_int_values[8];
+  let x_23 : i32 = x_6.x_GLF_uniform_int_values[11];
+  let x_24 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_25 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_26 : i32 = x_6.x_GLF_uniform_int_values[3];
+  m0 = mat3x4<f32>(vec4<f32>(f32(x_17), f32(x_18), f32(x_19), 4.0), vec4<f32>(f32(x_20), f32(x_21), f32(x_22), 8.0), vec4<f32>(f32(x_23), f32(x_24), f32(x_25), f32(x_26)));
+  let x_27 : i32 = x_6.x_GLF_uniform_int_values[4];
+  let x_104 : f32 = f32(x_27);
+  m1 = mat3x4<f32>(vec4<f32>(x_104, 0.0, 0.0, 0.0), vec4<f32>(0.0, x_104, 0.0, 0.0), vec4<f32>(0.0, 0.0, x_104, 0.0));
+  undefined = ldexp(vec3<f32>(1.0, 1.0, 1.0), vec3<i32>(500, 500, 500));
+  let x_28 : i32 = x_6.x_GLF_uniform_int_values[4];
+  let x_111 : f32 = f32(x_28);
+  let x_29 : i32 = x_6.x_GLF_uniform_int_values[0];
+  defined = ldexp(vec3<f32>(x_111, x_111, x_111), vec3<i32>(x_29, x_29, x_29));
+  let x_116 : mat3x4<f32> = m0;
+  let x_117 : vec3<f32> = undefined;
+  v0 = (x_116 * x_117);
+  let x_119 : mat3x4<f32> = m1;
+  let x_120 : vec3<f32> = undefined;
+  v1 = (x_119 * x_120);
+  let x_122 : mat3x4<f32> = m0;
+  let x_123 : vec3<f32> = defined;
+  v2 = (x_122 * x_123);
+  let x_125 : mat3x4<f32> = m1;
+  let x_126 : vec3<f32> = defined;
+  v3 = (x_125 * x_126);
+  let x_129 : f32 = v2.x;
+  let x_131 : f32 = v3.x;
+  if ((x_129 > x_131)) {
+    let x_30 : i32 = x_6.x_GLF_uniform_int_values[4];
+    let x_31 : i32 = x_6.x_GLF_uniform_int_values[9];
+    let x_32 : i32 = x_6.x_GLF_uniform_int_values[9];
+    let x_33 : i32 = x_6.x_GLF_uniform_int_values[4];
+    x_GLF_color = vec4<f32>(f32(x_30), f32(x_31), f32(x_32), f32(x_33));
+  } else {
+    let x_34 : i32 = x_6.x_GLF_uniform_int_values[9];
+    let x_146 : f32 = f32(x_34);
+    x_GLF_color = vec4<f32>(x_146, x_146, x_146, x_146);
+  }
+  let x_149 : f32 = v0.x;
+  let x_151 : f32 = v1.x;
+  if ((x_149 < x_151)) {
+    let x_156 : f32 = x_15.x_GLF_uniform_float_values[0];
+    x_GLF_color.y = x_156;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-undefined-matrix-mul/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-undefined-matrix-mul/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..4a1c25c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-undefined-matrix-mul/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,77 @@
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[12];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_15 : register(b0, space0) {
+  uint4 x_15[1];
+};
+
+void main_1() {
+  float3x4 m0 = float3x4(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  float3x4 m1 = float3x4(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  float3 undefined = float3(0.0f, 0.0f, 0.0f);
+  float3 defined = float3(0.0f, 0.0f, 0.0f);
+  float4 v0 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 v1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 v2 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 v3 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  const int x_17 = asint(x_6[4].x);
+  const int x_18 = asint(x_6[5].x);
+  const int x_19 = asint(x_6[6].x);
+  const int x_20 = asint(x_6[10].x);
+  const int x_21 = asint(x_6[7].x);
+  const int x_22 = asint(x_6[8].x);
+  const int x_23 = asint(x_6[11].x);
+  const int x_24 = asint(x_6[1].x);
+  const int x_25 = asint(x_6[2].x);
+  const int x_26 = asint(x_6[3].x);
+  m0 = float3x4(float4(float(x_17), float(x_18), float(x_19), 4.0f), float4(float(x_20), float(x_21), float(x_22), 8.0f), float4(float(x_23), float(x_24), float(x_25), float(x_26)));
+  const int x_27 = asint(x_6[4].x);
+  const float x_104 = float(x_27);
+  m1 = float3x4(float4(x_104, 0.0f, 0.0f, 0.0f), float4(0.0f, x_104, 0.0f, 0.0f), float4(0.0f, 0.0f, x_104, 0.0f));
+  undefined = ldexp(float3(1.0f, 1.0f, 1.0f), int3(500, 500, 500));
+  const int x_28 = asint(x_6[4].x);
+  const float x_111 = float(x_28);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_29 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  defined = ldexp(float3(x_111, x_111, x_111), int3(x_29, x_29, x_29));
+  v0 = mul(undefined, m0);
+  v1 = mul(undefined, m1);
+  v2 = mul(defined, m0);
+  v3 = mul(defined, m1);
+  const float x_129 = v2.x;
+  const float x_131 = v3.x;
+  if ((x_129 > x_131)) {
+    const int x_30 = asint(x_6[4].x);
+    const int x_31 = asint(x_6[9].x);
+    const int x_32 = asint(x_6[9].x);
+    const int x_33 = asint(x_6[4].x);
+    x_GLF_color = float4(float(x_30), float(x_31), float(x_32), float(x_33));
+  } else {
+    const int x_34 = asint(x_6[9].x);
+    const float x_146 = float(x_34);
+    x_GLF_color = float4(x_146, x_146, x_146, x_146);
+  }
+  const float x_149 = v0.x;
+  const float x_151 = v1.x;
+  if ((x_149 < x_151)) {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const float x_156 = asfloat(x_15[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    x_GLF_color.y = x_156;
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-undefined-matrix-mul/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-undefined-matrix-mul/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..8009725
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-undefined-matrix-mul/0-opt.wgsl.expected.msl
@@ -0,0 +1,100 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[12];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_15, thread float4* const tint_symbol_4) {
+  float3x4 m0 = float3x4(0.0f);
+  float3x4 m1 = float3x4(0.0f);
+  float3 undefined = 0.0f;
+  float3 defined = 0.0f;
+  float4 v0 = 0.0f;
+  float4 v1 = 0.0f;
+  float4 v2 = 0.0f;
+  float4 v3 = 0.0f;
+  int const x_17 = x_6.x_GLF_uniform_int_values.arr[4].el;
+  int const x_18 = x_6.x_GLF_uniform_int_values.arr[5].el;
+  int const x_19 = x_6.x_GLF_uniform_int_values.arr[6].el;
+  int const x_20 = x_6.x_GLF_uniform_int_values.arr[10].el;
+  int const x_21 = x_6.x_GLF_uniform_int_values.arr[7].el;
+  int const x_22 = x_6.x_GLF_uniform_int_values.arr[8].el;
+  int const x_23 = x_6.x_GLF_uniform_int_values.arr[11].el;
+  int const x_24 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_25 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_26 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  m0 = float3x4(float4(float(x_17), float(x_18), float(x_19), 4.0f), float4(float(x_20), float(x_21), float(x_22), 8.0f), float4(float(x_23), float(x_24), float(x_25), float(x_26)));
+  int const x_27 = x_6.x_GLF_uniform_int_values.arr[4].el;
+  float const x_104 = float(x_27);
+  m1 = float3x4(float4(x_104, 0.0f, 0.0f, 0.0f), float4(0.0f, x_104, 0.0f, 0.0f), float4(0.0f, 0.0f, x_104, 0.0f));
+  undefined = ldexp(float3(1.0f, 1.0f, 1.0f), int3(500, 500, 500));
+  int const x_28 = x_6.x_GLF_uniform_int_values.arr[4].el;
+  float const x_111 = float(x_28);
+  int const x_29 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  defined = ldexp(float3(x_111, x_111, x_111), int3(x_29, x_29, x_29));
+  float3x4 const x_116 = m0;
+  float3 const x_117 = undefined;
+  v0 = (x_116 * x_117);
+  float3x4 const x_119 = m1;
+  float3 const x_120 = undefined;
+  v1 = (x_119 * x_120);
+  float3x4 const x_122 = m0;
+  float3 const x_123 = defined;
+  v2 = (x_122 * x_123);
+  float3x4 const x_125 = m1;
+  float3 const x_126 = defined;
+  v3 = (x_125 * x_126);
+  float const x_129 = v2.x;
+  float const x_131 = v3.x;
+  if ((x_129 > x_131)) {
+    int const x_30 = x_6.x_GLF_uniform_int_values.arr[4].el;
+    int const x_31 = x_6.x_GLF_uniform_int_values.arr[9].el;
+    int const x_32 = x_6.x_GLF_uniform_int_values.arr[9].el;
+    int const x_33 = x_6.x_GLF_uniform_int_values.arr[4].el;
+    *(tint_symbol_4) = float4(float(x_30), float(x_31), float(x_32), float(x_33));
+  } else {
+    int const x_34 = x_6.x_GLF_uniform_int_values.arr[9].el;
+    float const x_146 = float(x_34);
+    *(tint_symbol_4) = float4(x_146, x_146, x_146, x_146);
+  }
+  float const x_149 = v0.x;
+  float const x_151 = v1.x;
+  if ((x_149 < x_151)) {
+    float const x_156 = x_15.x_GLF_uniform_float_values.arr[0].el;
+    (*(tint_symbol_4)).y = x_156;
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_15 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_15, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-undefined-matrix-mul/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-undefined-matrix-mul/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..5f8230b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-undefined-matrix-mul/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,244 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 175
+; Schema: 0
+               OpCapability Shader
+         %96 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_15 "x_15"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %m0 "m0"
+               OpName %m1 "m1"
+               OpName %undefined "undefined"
+               OpName %defined "defined"
+               OpName %v0 "v0"
+               OpName %v1 "v1"
+               OpName %v2 "v2"
+               OpName %v3 "v3"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_12 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_15 NonWritable
+               OpDecorate %x_15 DescriptorSet 0
+               OpDecorate %x_15 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_12 = OpConstant %uint 12
+%_arr_int_uint_12 = OpTypeArray %int %uint_12
+       %buf1 = OpTypeStruct %_arr_int_uint_12
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_15 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%mat3v4float = OpTypeMatrix %v4float 3
+%_ptr_Function_mat3v4float = OpTypePointer Function %mat3v4float
+         %27 = OpConstantNull %mat3v4float
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %32 = OpConstantNull %v3float
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_0 = OpConstant %uint 0
+      %int_4 = OpConstant %int 4
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+     %int_10 = OpConstant %int 10
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+     %int_11 = OpConstant %int 11
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+    %float_4 = OpConstant %float 4
+    %float_8 = OpConstant %float 8
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %98 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+      %v3int = OpTypeVector %int 3
+    %int_500 = OpConstant %int 500
+        %101 = OpConstantComposite %v3int %int_500 %int_500 %int_500
+      %int_0 = OpConstant %int 0
+%_ptr_Function_float = OpTypePointer Function %float
+       %bool = OpTypeBool
+      %int_9 = OpConstant %int 9
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Private_float = OpTypePointer Private %float
+   %main_out = OpTypeStruct %v4float
+        %163 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+         %m0 = OpVariable %_ptr_Function_mat3v4float Function %27
+         %m1 = OpVariable %_ptr_Function_mat3v4float Function %27
+  %undefined = OpVariable %_ptr_Function_v3float Function %32
+    %defined = OpVariable %_ptr_Function_v3float Function %32
+         %v0 = OpVariable %_ptr_Function_v4float Function %12
+         %v1 = OpVariable %_ptr_Function_v4float Function %12
+         %v2 = OpVariable %_ptr_Function_v4float Function %12
+         %v3 = OpVariable %_ptr_Function_v4float Function %12
+         %42 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+         %43 = OpLoad %int %42
+         %45 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_5
+         %46 = OpLoad %int %45
+         %48 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_6
+         %49 = OpLoad %int %48
+         %51 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_10
+         %52 = OpLoad %int %51
+         %54 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_7
+         %55 = OpLoad %int %54
+         %57 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_8
+         %58 = OpLoad %int %57
+         %60 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_11
+         %61 = OpLoad %int %60
+         %63 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %64 = OpLoad %int %63
+         %66 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %67 = OpLoad %int %66
+         %69 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %70 = OpLoad %int %69
+         %71 = OpConvertSToF %float %43
+         %72 = OpConvertSToF %float %46
+         %73 = OpConvertSToF %float %49
+         %75 = OpCompositeConstruct %v4float %71 %72 %73 %float_4
+         %76 = OpConvertSToF %float %52
+         %77 = OpConvertSToF %float %55
+         %78 = OpConvertSToF %float %58
+         %80 = OpCompositeConstruct %v4float %76 %77 %78 %float_8
+         %81 = OpConvertSToF %float %61
+         %82 = OpConvertSToF %float %64
+         %83 = OpConvertSToF %float %67
+         %84 = OpConvertSToF %float %70
+         %85 = OpCompositeConstruct %v4float %81 %82 %83 %84
+         %86 = OpCompositeConstruct %mat3v4float %75 %80 %85
+               OpStore %m0 %86
+         %87 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+         %88 = OpLoad %int %87
+         %89 = OpConvertSToF %float %88
+         %91 = OpCompositeConstruct %v4float %89 %float_0 %float_0 %float_0
+         %92 = OpCompositeConstruct %v4float %float_0 %89 %float_0 %float_0
+         %93 = OpCompositeConstruct %v4float %float_0 %float_0 %89 %float_0
+         %94 = OpCompositeConstruct %mat3v4float %91 %92 %93
+               OpStore %m1 %94
+         %95 = OpExtInst %v3float %96 Ldexp %98 %101
+               OpStore %undefined %95
+        %102 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+        %103 = OpLoad %int %102
+        %104 = OpConvertSToF %float %103
+        %106 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %107 = OpLoad %int %106
+        %109 = OpCompositeConstruct %v3float %104 %104 %104
+        %110 = OpCompositeConstruct %v3int %107 %107 %107
+        %108 = OpExtInst %v3float %96 Ldexp %109 %110
+               OpStore %defined %108
+        %111 = OpLoad %mat3v4float %m0
+        %112 = OpLoad %v3float %undefined
+        %113 = OpMatrixTimesVector %v4float %111 %112
+               OpStore %v0 %113
+        %114 = OpLoad %mat3v4float %m1
+        %115 = OpLoad %v3float %undefined
+        %116 = OpMatrixTimesVector %v4float %114 %115
+               OpStore %v1 %116
+        %117 = OpLoad %mat3v4float %m0
+        %118 = OpLoad %v3float %defined
+        %119 = OpMatrixTimesVector %v4float %117 %118
+               OpStore %v2 %119
+        %120 = OpLoad %mat3v4float %m1
+        %121 = OpLoad %v3float %defined
+        %122 = OpMatrixTimesVector %v4float %120 %121
+               OpStore %v3 %122
+        %124 = OpAccessChain %_ptr_Function_float %v2 %uint_0
+        %125 = OpLoad %float %124
+        %126 = OpAccessChain %_ptr_Function_float %v3 %uint_0
+        %127 = OpLoad %float %126
+        %128 = OpFOrdGreaterThan %bool %125 %127
+               OpSelectionMerge %130 None
+               OpBranchConditional %128 %131 %132
+        %131 = OpLabel
+        %133 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+        %134 = OpLoad %int %133
+        %136 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_9
+        %137 = OpLoad %int %136
+        %138 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_9
+        %139 = OpLoad %int %138
+        %140 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+        %141 = OpLoad %int %140
+        %142 = OpConvertSToF %float %134
+        %143 = OpConvertSToF %float %137
+        %144 = OpConvertSToF %float %139
+        %145 = OpConvertSToF %float %141
+        %146 = OpCompositeConstruct %v4float %142 %143 %144 %145
+               OpStore %x_GLF_color %146
+               OpBranch %130
+        %132 = OpLabel
+        %147 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_9
+        %148 = OpLoad %int %147
+        %149 = OpConvertSToF %float %148
+        %150 = OpCompositeConstruct %v4float %149 %149 %149 %149
+               OpStore %x_GLF_color %150
+               OpBranch %130
+        %130 = OpLabel
+        %151 = OpAccessChain %_ptr_Function_float %v0 %uint_0
+        %152 = OpLoad %float %151
+        %153 = OpAccessChain %_ptr_Function_float %v1 %uint_0
+        %154 = OpLoad %float %153
+        %155 = OpFOrdLessThan %bool %152 %154
+               OpSelectionMerge %156 None
+               OpBranchConditional %155 %157 %156
+        %157 = OpLabel
+        %159 = OpAccessChain %_ptr_Uniform_float %x_15 %uint_0 %int_0
+        %160 = OpLoad %float %159
+        %162 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_1
+               OpStore %162 %160
+               OpBranch %156
+        %156 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %163
+%tint_symbol = OpFunctionParameter %main_out
+        %167 = OpLabel
+        %168 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %168
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %170 = OpLabel
+        %171 = OpFunctionCall %void %main_1
+        %173 = OpLoad %v4float %x_GLF_color
+        %174 = OpCompositeConstruct %main_out %173
+        %172 = OpFunctionCall %void %tint_symbol_2 %174
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-undefined-matrix-mul/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-undefined-matrix-mul/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..e298a8c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-undefined-matrix-mul/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,92 @@
+type Arr = [[stride(16)]] array<i32, 12>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_15 : buf0;
+
+fn main_1() {
+  var m0 : mat3x4<f32>;
+  var m1 : mat3x4<f32>;
+  var undefined : vec3<f32>;
+  var defined : vec3<f32>;
+  var v0 : vec4<f32>;
+  var v1 : vec4<f32>;
+  var v2 : vec4<f32>;
+  var v3 : vec4<f32>;
+  let x_17 : i32 = x_6.x_GLF_uniform_int_values[4];
+  let x_18 : i32 = x_6.x_GLF_uniform_int_values[5];
+  let x_19 : i32 = x_6.x_GLF_uniform_int_values[6];
+  let x_20 : i32 = x_6.x_GLF_uniform_int_values[10];
+  let x_21 : i32 = x_6.x_GLF_uniform_int_values[7];
+  let x_22 : i32 = x_6.x_GLF_uniform_int_values[8];
+  let x_23 : i32 = x_6.x_GLF_uniform_int_values[11];
+  let x_24 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_25 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_26 : i32 = x_6.x_GLF_uniform_int_values[3];
+  m0 = mat3x4<f32>(vec4<f32>(f32(x_17), f32(x_18), f32(x_19), 4.0), vec4<f32>(f32(x_20), f32(x_21), f32(x_22), 8.0), vec4<f32>(f32(x_23), f32(x_24), f32(x_25), f32(x_26)));
+  let x_27 : i32 = x_6.x_GLF_uniform_int_values[4];
+  let x_104 : f32 = f32(x_27);
+  m1 = mat3x4<f32>(vec4<f32>(x_104, 0.0, 0.0, 0.0), vec4<f32>(0.0, x_104, 0.0, 0.0), vec4<f32>(0.0, 0.0, x_104, 0.0));
+  undefined = ldexp(vec3<f32>(1.0, 1.0, 1.0), vec3<i32>(500, 500, 500));
+  let x_28 : i32 = x_6.x_GLF_uniform_int_values[4];
+  let x_111 : f32 = f32(x_28);
+  let x_29 : i32 = x_6.x_GLF_uniform_int_values[0];
+  defined = ldexp(vec3<f32>(x_111, x_111, x_111), vec3<i32>(x_29, x_29, x_29));
+  let x_116 : mat3x4<f32> = m0;
+  let x_117 : vec3<f32> = undefined;
+  v0 = (x_116 * x_117);
+  let x_119 : mat3x4<f32> = m1;
+  let x_120 : vec3<f32> = undefined;
+  v1 = (x_119 * x_120);
+  let x_122 : mat3x4<f32> = m0;
+  let x_123 : vec3<f32> = defined;
+  v2 = (x_122 * x_123);
+  let x_125 : mat3x4<f32> = m1;
+  let x_126 : vec3<f32> = defined;
+  v3 = (x_125 * x_126);
+  let x_129 : f32 = v2.x;
+  let x_131 : f32 = v3.x;
+  if ((x_129 > x_131)) {
+    let x_30 : i32 = x_6.x_GLF_uniform_int_values[4];
+    let x_31 : i32 = x_6.x_GLF_uniform_int_values[9];
+    let x_32 : i32 = x_6.x_GLF_uniform_int_values[9];
+    let x_33 : i32 = x_6.x_GLF_uniform_int_values[4];
+    x_GLF_color = vec4<f32>(f32(x_30), f32(x_31), f32(x_32), f32(x_33));
+  } else {
+    let x_34 : i32 = x_6.x_GLF_uniform_int_values[9];
+    let x_146 : f32 = f32(x_34);
+    x_GLF_color = vec4<f32>(x_146, x_146, x_146, x_146);
+  }
+  let x_149 : f32 = v0.x;
+  let x_151 : f32 = v1.x;
+  if ((x_149 < x_151)) {
+    let x_156 : f32 = x_15.x_GLF_uniform_float_values[0];
+    x_GLF_color.y = x_156;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-unpackunorm-loop/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-unpackunorm-loop/0-opt.spvasm
new file mode 100644
index 0000000..7853f53
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-unpackunorm-loop/0-opt.spvasm
@@ -0,0 +1,100 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %i "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %v "v"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+   %uint_100 = OpConstant %uint 100
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %10
+         %28 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+          %v = OpVariable %_ptr_Function_v4float Function
+         %29 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %30 = OpLoad %int %29
+               OpStore %i %30
+               OpBranch %31
+         %31 = OpLabel
+               OpLoopMerge %32 %33 None
+               OpBranch %34
+         %34 = OpLabel
+         %35 = OpLoad %int %i
+         %36 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %37 = OpLoad %int %36
+         %38 = OpSLessThan %bool %35 %37
+               OpBranchConditional %38 %39 %32
+         %39 = OpLabel
+         %40 = OpExtInst %v4float %1 UnpackUnorm4x8 %uint_100
+               OpStore %v %40
+         %41 = OpAccessChain %_ptr_Function_float %v %uint_0
+         %42 = OpLoad %float %41
+         %43 = OpConvertFToS %int %42
+         %44 = OpLoad %int %i
+         %45 = OpSGreaterThan %bool %43 %44
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %46
+         %47 = OpLabel
+         %48 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %49 = OpLoad %int %48
+         %50 = OpConvertSToF %float %49
+         %51 = OpCompositeConstruct %v4float %50 %50 %50 %50
+               OpStore %_GLF_color %51
+               OpReturn
+         %46 = OpLabel
+               OpBranch %33
+         %33 = OpLabel
+         %52 = OpLoad %int %i
+         %53 = OpIAdd %int %52 %int_1
+               OpStore %i %53
+               OpBranch %31
+         %32 = OpLabel
+         %54 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %55 = OpLoad %int %54
+         %56 = OpConvertSToF %float %55
+         %57 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %58 = OpLoad %int %57
+         %59 = OpConvertSToF %float %58
+         %60 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %61 = OpLoad %int %60
+         %62 = OpConvertSToF %float %61
+         %63 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %64 = OpLoad %int %63
+         %65 = OpConvertSToF %float %64
+         %66 = OpCompositeConstruct %v4float %56 %59 %62 %65
+               OpStore %_GLF_color %66
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-unpackunorm-loop/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-unpackunorm-loop/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..7fc33ee
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-unpackunorm-loop/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,58 @@
+float4 tint_unpack4x8unorm(uint param_0) {
+  uint j = param_0;
+  uint4 i = uint4(j & 0xff, (j >> 8) & 0xff, (j >> 16) & 0xff, j >> 24);
+  return float4(i) / 255.0;
+}
+
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int i = 0;
+  float4 v = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  const int x_30 = asint(x_6[1].x);
+  i = x_30;
+  while (true) {
+    const int x_35 = i;
+    const int x_37 = asint(x_6[2].x);
+    if ((x_35 < x_37)) {
+    } else {
+      break;
+    }
+    v = tint_unpack4x8unorm(100u);
+    const float x_42 = v.x;
+    if ((int(x_42) > i)) {
+      const int x_49 = asint(x_6[1].x);
+      const float x_50 = float(x_49);
+      x_GLF_color = float4(x_50, x_50, x_50, x_50);
+      return;
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_55 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const int x_58 = asint(x_6[1].x);
+  const int x_61 = asint(x_6[1].x);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_64 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  x_GLF_color = float4(float(x_55), float(x_58), float(x_61), float(x_64));
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-unpackunorm-loop/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-unpackunorm-loop/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..5daa237
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-unpackunorm-loop/0-opt.spvasm.expected.msl
@@ -0,0 +1,62 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int i = 0;
+  float4 v = 0.0f;
+  int const x_30 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  i = x_30;
+  while (true) {
+    int const x_35 = i;
+    int const x_37 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    if ((x_35 < x_37)) {
+    } else {
+      break;
+    }
+    v = unpack_unorm4x8_to_float(100u);
+    float const x_42 = v.x;
+    int const x_44 = i;
+    if ((int(x_42) > x_44)) {
+      int const x_49 = x_6.x_GLF_uniform_int_values.arr[1].el;
+      float const x_50 = float(x_49);
+      *(tint_symbol_4) = float4(x_50, x_50, x_50, x_50);
+      return;
+    }
+    {
+      int const x_52 = i;
+      i = (x_52 + 1);
+    }
+  }
+  int const x_55 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_58 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_61 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_64 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  *(tint_symbol_4) = float4(float(x_55), float(x_58), float(x_61), float(x_64));
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-unpackunorm-loop/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-unpackunorm-loop/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..1b6c2cf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-unpackunorm-loop/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,138 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 85
+; Schema: 0
+               OpCapability Shader
+         %43 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %v "v"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+   %uint_100 = OpConstant %uint 100
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_0 = OpConstant %int 0
+   %main_out = OpTypeStruct %v4float
+         %73 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %21
+          %v = OpVariable %_ptr_Function_v4float Function %12
+         %27 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %28 = OpLoad %int %27
+               OpStore %i %28
+               OpBranch %29
+         %29 = OpLabel
+               OpLoopMerge %30 %31 None
+               OpBranch %32
+         %32 = OpLabel
+         %33 = OpLoad %int %i
+         %35 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %36 = OpLoad %int %35
+         %37 = OpSLessThan %bool %33 %36
+               OpSelectionMerge %39 None
+               OpBranchConditional %37 %40 %41
+         %40 = OpLabel
+               OpBranch %39
+         %41 = OpLabel
+               OpBranch %30
+         %39 = OpLabel
+         %42 = OpExtInst %v4float %43 UnpackUnorm4x8 %uint_100
+               OpStore %v %42
+         %46 = OpAccessChain %_ptr_Function_float %v %uint_0
+         %47 = OpLoad %float %46
+         %48 = OpLoad %int %i
+         %49 = OpConvertFToS %int %47
+         %50 = OpSGreaterThan %bool %49 %48
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %51
+         %52 = OpLabel
+         %53 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %54 = OpLoad %int %53
+         %55 = OpConvertSToF %float %54
+         %56 = OpCompositeConstruct %v4float %55 %55 %55 %55
+               OpStore %x_GLF_color %56
+               OpReturn
+         %51 = OpLabel
+               OpBranch %31
+         %31 = OpLabel
+         %57 = OpLoad %int %i
+         %58 = OpIAdd %int %57 %int_1
+               OpStore %i %58
+               OpBranch %29
+         %30 = OpLabel
+         %60 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %61 = OpLoad %int %60
+         %62 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %63 = OpLoad %int %62
+         %64 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %65 = OpLoad %int %64
+         %66 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %67 = OpLoad %int %66
+         %68 = OpConvertSToF %float %61
+         %69 = OpConvertSToF %float %63
+         %70 = OpConvertSToF %float %65
+         %71 = OpConvertSToF %float %67
+         %72 = OpCompositeConstruct %v4float %68 %69 %70 %71
+               OpStore %x_GLF_color %72
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %73
+%tint_symbol = OpFunctionParameter %main_out
+         %77 = OpLabel
+         %78 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %78
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %80 = OpLabel
+         %81 = OpFunctionCall %void %main_1
+         %83 = OpLoad %v4float %x_GLF_color
+         %84 = OpCompositeConstruct %main_out %83
+         %82 = OpFunctionCall %void %tint_symbol_2 %84
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-unpackunorm-loop/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-unpackunorm-loop/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..a67101b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-unpackunorm-loop/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,56 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  var v : vec4<f32>;
+  let x_30 : i32 = x_6.x_GLF_uniform_int_values[1];
+  i = x_30;
+  loop {
+    let x_35 : i32 = i;
+    let x_37 : i32 = x_6.x_GLF_uniform_int_values[2];
+    if ((x_35 < x_37)) {
+    } else {
+      break;
+    }
+    v = unpack4x8unorm(100u);
+    let x_42 : f32 = v.x;
+    let x_44 : i32 = i;
+    if ((i32(x_42) > x_44)) {
+      let x_49 : i32 = x_6.x_GLF_uniform_int_values[1];
+      let x_50 : f32 = f32(x_49);
+      x_GLF_color = vec4<f32>(x_50, x_50, x_50, x_50);
+      return;
+    }
+
+    continuing {
+      let x_52 : i32 = i;
+      i = (x_52 + 1);
+    }
+  }
+  let x_55 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_58 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_61 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_64 : i32 = x_6.x_GLF_uniform_int_values[0];
+  x_GLF_color = vec4<f32>(f32(x_55), f32(x_58), f32(x_61), f32(x_64));
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-unpackunorm-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-unpackunorm-loop/0-opt.wgsl
new file mode 100644
index 0000000..a67101b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-unpackunorm-loop/0-opt.wgsl
@@ -0,0 +1,56 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  var v : vec4<f32>;
+  let x_30 : i32 = x_6.x_GLF_uniform_int_values[1];
+  i = x_30;
+  loop {
+    let x_35 : i32 = i;
+    let x_37 : i32 = x_6.x_GLF_uniform_int_values[2];
+    if ((x_35 < x_37)) {
+    } else {
+      break;
+    }
+    v = unpack4x8unorm(100u);
+    let x_42 : f32 = v.x;
+    let x_44 : i32 = i;
+    if ((i32(x_42) > x_44)) {
+      let x_49 : i32 = x_6.x_GLF_uniform_int_values[1];
+      let x_50 : f32 = f32(x_49);
+      x_GLF_color = vec4<f32>(x_50, x_50, x_50, x_50);
+      return;
+    }
+
+    continuing {
+      let x_52 : i32 = i;
+      i = (x_52 + 1);
+    }
+  }
+  let x_55 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_58 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_61 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_64 : i32 = x_6.x_GLF_uniform_int_values[0];
+  x_GLF_color = vec4<f32>(f32(x_55), f32(x_58), f32(x_61), f32(x_64));
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-unpackunorm-loop/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-unpackunorm-loop/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..7fc33ee
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-unpackunorm-loop/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,58 @@
+float4 tint_unpack4x8unorm(uint param_0) {
+  uint j = param_0;
+  uint4 i = uint4(j & 0xff, (j >> 8) & 0xff, (j >> 16) & 0xff, j >> 24);
+  return float4(i) / 255.0;
+}
+
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int i = 0;
+  float4 v = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  const int x_30 = asint(x_6[1].x);
+  i = x_30;
+  while (true) {
+    const int x_35 = i;
+    const int x_37 = asint(x_6[2].x);
+    if ((x_35 < x_37)) {
+    } else {
+      break;
+    }
+    v = tint_unpack4x8unorm(100u);
+    const float x_42 = v.x;
+    if ((int(x_42) > i)) {
+      const int x_49 = asint(x_6[1].x);
+      const float x_50 = float(x_49);
+      x_GLF_color = float4(x_50, x_50, x_50, x_50);
+      return;
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_55 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const int x_58 = asint(x_6[1].x);
+  const int x_61 = asint(x_6[1].x);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_64 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  x_GLF_color = float4(float(x_55), float(x_58), float(x_61), float(x_64));
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-unpackunorm-loop/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-unpackunorm-loop/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..5daa237
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-unpackunorm-loop/0-opt.wgsl.expected.msl
@@ -0,0 +1,62 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int i = 0;
+  float4 v = 0.0f;
+  int const x_30 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  i = x_30;
+  while (true) {
+    int const x_35 = i;
+    int const x_37 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    if ((x_35 < x_37)) {
+    } else {
+      break;
+    }
+    v = unpack_unorm4x8_to_float(100u);
+    float const x_42 = v.x;
+    int const x_44 = i;
+    if ((int(x_42) > x_44)) {
+      int const x_49 = x_6.x_GLF_uniform_int_values.arr[1].el;
+      float const x_50 = float(x_49);
+      *(tint_symbol_4) = float4(x_50, x_50, x_50, x_50);
+      return;
+    }
+    {
+      int const x_52 = i;
+      i = (x_52 + 1);
+    }
+  }
+  int const x_55 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_58 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_61 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_64 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  *(tint_symbol_4) = float4(float(x_55), float(x_58), float(x_61), float(x_64));
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-unpackunorm-loop/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-unpackunorm-loop/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..1b6c2cf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-unpackunorm-loop/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,138 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 85
+; Schema: 0
+               OpCapability Shader
+         %43 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %v "v"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+   %uint_100 = OpConstant %uint 100
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_0 = OpConstant %int 0
+   %main_out = OpTypeStruct %v4float
+         %73 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %21
+          %v = OpVariable %_ptr_Function_v4float Function %12
+         %27 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %28 = OpLoad %int %27
+               OpStore %i %28
+               OpBranch %29
+         %29 = OpLabel
+               OpLoopMerge %30 %31 None
+               OpBranch %32
+         %32 = OpLabel
+         %33 = OpLoad %int %i
+         %35 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %36 = OpLoad %int %35
+         %37 = OpSLessThan %bool %33 %36
+               OpSelectionMerge %39 None
+               OpBranchConditional %37 %40 %41
+         %40 = OpLabel
+               OpBranch %39
+         %41 = OpLabel
+               OpBranch %30
+         %39 = OpLabel
+         %42 = OpExtInst %v4float %43 UnpackUnorm4x8 %uint_100
+               OpStore %v %42
+         %46 = OpAccessChain %_ptr_Function_float %v %uint_0
+         %47 = OpLoad %float %46
+         %48 = OpLoad %int %i
+         %49 = OpConvertFToS %int %47
+         %50 = OpSGreaterThan %bool %49 %48
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %51
+         %52 = OpLabel
+         %53 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %54 = OpLoad %int %53
+         %55 = OpConvertSToF %float %54
+         %56 = OpCompositeConstruct %v4float %55 %55 %55 %55
+               OpStore %x_GLF_color %56
+               OpReturn
+         %51 = OpLabel
+               OpBranch %31
+         %31 = OpLabel
+         %57 = OpLoad %int %i
+         %58 = OpIAdd %int %57 %int_1
+               OpStore %i %58
+               OpBranch %29
+         %30 = OpLabel
+         %60 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %61 = OpLoad %int %60
+         %62 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %63 = OpLoad %int %62
+         %64 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %65 = OpLoad %int %64
+         %66 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %67 = OpLoad %int %66
+         %68 = OpConvertSToF %float %61
+         %69 = OpConvertSToF %float %63
+         %70 = OpConvertSToF %float %65
+         %71 = OpConvertSToF %float %67
+         %72 = OpCompositeConstruct %v4float %68 %69 %70 %71
+               OpStore %x_GLF_color %72
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %73
+%tint_symbol = OpFunctionParameter %main_out
+         %77 = OpLabel
+         %78 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %78
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %80 = OpLabel
+         %81 = OpFunctionCall %void %main_1
+         %83 = OpLoad %v4float %x_GLF_color
+         %84 = OpCompositeConstruct %main_out %83
+         %82 = OpFunctionCall %void %tint_symbol_2 %84
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-unpackunorm-loop/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-unpackunorm-loop/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..a67101b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-unpackunorm-loop/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,56 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  var v : vec4<f32>;
+  let x_30 : i32 = x_6.x_GLF_uniform_int_values[1];
+  i = x_30;
+  loop {
+    let x_35 : i32 = i;
+    let x_37 : i32 = x_6.x_GLF_uniform_int_values[2];
+    if ((x_35 < x_37)) {
+    } else {
+      break;
+    }
+    v = unpack4x8unorm(100u);
+    let x_42 : f32 = v.x;
+    let x_44 : i32 = i;
+    if ((i32(x_42) > x_44)) {
+      let x_49 : i32 = x_6.x_GLF_uniform_int_values[1];
+      let x_50 : f32 = f32(x_49);
+      x_GLF_color = vec4<f32>(x_50, x_50, x_50, x_50);
+      return;
+    }
+
+    continuing {
+      let x_52 : i32 = i;
+      i = (x_52 + 1);
+    }
+  }
+  let x_55 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_58 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_61 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_64 : i32 = x_6.x_GLF_uniform_int_values[0];
+  x_GLF_color = vec4<f32>(f32(x_55), f32(x_58), f32(x_61), f32(x_64));
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-array-accesses-clamp/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-array-accesses-clamp/0-opt.spvasm
new file mode 100644
index 0000000..28c1c7a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-array-accesses-clamp/0-opt.spvasm
@@ -0,0 +1,133 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %arr "arr"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %a "a"
+               OpName %b "b"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpName %c "c"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_3_0 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %16 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+%_ptr_Function__arr_int_uint_3 = OpTypePointer Function %_arr_int_uint_3
+%_arr_int_uint_3_0 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3_0
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_int = OpTypePointer Function %int
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf1 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %16
+         %38 = OpLabel
+        %arr = OpVariable %_ptr_Function__arr_int_uint_3 Function
+          %a = OpVariable %_ptr_Function_int Function
+          %b = OpVariable %_ptr_Function_int Function
+          %c = OpVariable %_ptr_Function_int Function
+         %39 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %40 = OpLoad %int %39
+         %41 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %42 = OpLoad %int %41
+         %43 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %44 = OpLoad %int %43
+         %45 = OpCompositeConstruct %_arr_int_uint_3 %40 %42 %44
+               OpStore %arr %45
+         %46 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %47 = OpLoad %int %46
+         %48 = OpAccessChain %_ptr_Function_int %arr %47
+         %49 = OpLoad %int %48
+               OpStore %a %49
+         %50 = OpLoad %int %a
+         %51 = OpISub %int %50 %int_1
+               OpStore %b %51
+         %52 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %53 = OpLoad %float %52
+         %54 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %55 = OpLoad %float %54
+         %56 = OpFOrdLessThan %bool %53 %55
+               OpSelectionMerge %57 None
+               OpBranchConditional %56 %58 %57
+         %58 = OpLabel
+         %59 = OpLoad %int %b
+         %60 = OpIAdd %int %59 %int_1
+               OpStore %b %60
+               OpBranch %57
+         %57 = OpLabel
+         %61 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %62 = OpLoad %int %61
+               OpStore %c %62
+         %63 = OpLoad %int %c
+         %64 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %65 = OpLoad %int %64
+         %66 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %67 = OpLoad %int %66
+         %68 = OpExtInst %int %1 SClamp %63 %65 %67
+         %69 = OpLoad %int %b
+         %70 = OpAccessChain %_ptr_Function_int %arr %68
+               OpStore %70 %69
+         %71 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %72 = OpLoad %int %71
+         %73 = OpAccessChain %_ptr_Function_int %arr %72
+         %74 = OpLoad %int %73
+         %75 = OpConvertSToF %float %74
+         %76 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %77 = OpLoad %int %76
+         %78 = OpAccessChain %_ptr_Function_int %arr %77
+         %79 = OpLoad %int %78
+         %80 = OpConvertSToF %float %79
+         %81 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %82 = OpLoad %int %81
+         %83 = OpAccessChain %_ptr_Function_int %arr %82
+         %84 = OpLoad %int %83
+         %85 = OpConvertSToF %float %84
+         %86 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %87 = OpLoad %int %86
+         %88 = OpAccessChain %_ptr_Function_int %arr %87
+         %89 = OpLoad %int %88
+         %90 = OpConvertSToF %float %89
+         %91 = OpCompositeConstruct %v4float %75 %80 %85 %90
+               OpStore %_GLF_color %91
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-array-accesses-clamp/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-array-accesses-clamp/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..82c801a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-array-accesses-clamp/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,68 @@
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[3];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_11 : register(b1, space0) {
+  uint4 x_11[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int arr[3] = (int[3])0;
+  int a = 0;
+  int b = 0;
+  int c = 0;
+  const int x_40 = asint(x_7[1].x);
+  const int x_42 = asint(x_7[1].x);
+  const int x_44 = asint(x_7[1].x);
+  const int tint_symbol_6[3] = {x_40, x_42, x_44};
+  arr = tint_symbol_6;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_47 = asint(x_7[scalar_offset / 4][scalar_offset % 4]);
+  const int x_49 = arr[x_47];
+  a = x_49;
+  b = (a - 1);
+  const float x_53 = gl_FragCoord.x;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_55 = asfloat(x_11[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_53 < x_55)) {
+    b = (b + 1);
+  }
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const int x_62 = asint(x_7[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  c = x_62;
+  const int x_63 = c;
+  const int x_65 = asint(x_7[1].x);
+  const int x_67 = asint(x_7[2].x);
+  arr[clamp(x_63, x_65, x_67)] = b;
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const int x_72 = asint(x_7[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  const int x_74 = arr[x_72];
+  const int x_77 = asint(x_7[1].x);
+  const int x_79 = arr[x_77];
+  const int x_82 = asint(x_7[1].x);
+  const int x_84 = arr[x_82];
+  const int x_87 = asint(x_7[2].x);
+  const int x_89 = arr[x_87];
+  x_GLF_color = float4(float(x_74), float(x_79), float(x_84), float(x_89));
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_7 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_7;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-array-accesses-clamp/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-array-accesses-clamp/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..76666da
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-array-accesses-clamp/0-opt.spvasm.expected.msl
@@ -0,0 +1,83 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct tint_array_wrapper_2 {
+  int arr[3];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, constant buf1& x_11, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  tint_array_wrapper_2 arr = {};
+  int a = 0;
+  int b = 0;
+  int c = 0;
+  int const x_40 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  int const x_42 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  int const x_44 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  tint_array_wrapper_2 const tint_symbol_4 = {.arr={x_40, x_42, x_44}};
+  arr = tint_symbol_4;
+  int const x_47 = x_7.x_GLF_uniform_int_values.arr[0].el;
+  int const x_49 = arr.arr[x_47];
+  a = x_49;
+  int const x_50 = a;
+  b = (x_50 - 1);
+  float const x_53 = (*(tint_symbol_6)).x;
+  float const x_55 = x_11.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_53 < x_55)) {
+    int const x_59 = b;
+    b = (x_59 + 1);
+  }
+  int const x_62 = x_7.x_GLF_uniform_int_values.arr[0].el;
+  c = x_62;
+  int const x_63 = c;
+  int const x_65 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  int const x_67 = x_7.x_GLF_uniform_int_values.arr[2].el;
+  int const x_69 = b;
+  arr.arr[clamp(x_63, x_65, x_67)] = x_69;
+  int const x_72 = x_7.x_GLF_uniform_int_values.arr[0].el;
+  int const x_74 = arr.arr[x_72];
+  int const x_77 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  int const x_79 = arr.arr[x_77];
+  int const x_82 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  int const x_84 = arr.arr[x_82];
+  int const x_87 = x_7.x_GLF_uniform_int_values.arr[2].el;
+  int const x_89 = arr.arr[x_87];
+  *(tint_symbol_7) = float4(float(x_74), float(x_79), float(x_84), float(x_89));
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]], constant buf1& x_11 [[buffer(1)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_7, x_11, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-array-accesses-clamp/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-array-accesses-clamp/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..5b91fa9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-array-accesses-clamp/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,173 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 111
+; Schema: 0
+               OpCapability Shader
+         %75 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_11 "x_11"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %arr "arr"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_11 NonWritable
+               OpDecorate %x_11 DescriptorSet 0
+               OpDecorate %x_11 Binding 1
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_int_uint_3_0 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %12
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf1 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_11 = OpVariable %_ptr_Uniform_buf1 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+%_arr_int_uint_3_0 = OpTypeArray %int %uint_3
+%_ptr_Function__arr_int_uint_3_0 = OpTypePointer Function %_arr_int_uint_3_0
+         %30 = OpConstantNull %_arr_int_uint_3_0
+%_ptr_Function_int = OpTypePointer Function %int
+         %33 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+%_ptr_Private_float = OpTypePointer Private %float
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+         %98 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %23
+         %26 = OpLabel
+        %arr = OpVariable %_ptr_Function__arr_int_uint_3_0 Function %30
+          %a = OpVariable %_ptr_Function_int Function %33
+          %b = OpVariable %_ptr_Function_int Function %33
+          %c = OpVariable %_ptr_Function_int Function %33
+         %39 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %40 = OpLoad %int %39
+         %41 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %42 = OpLoad %int %41
+         %43 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %44 = OpLoad %int %43
+         %45 = OpCompositeConstruct %_arr_int_uint_3_0 %40 %42 %44
+               OpStore %arr %45
+         %47 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %48 = OpLoad %int %47
+         %49 = OpAccessChain %_ptr_Function_int %arr %48
+         %50 = OpLoad %int %49
+               OpStore %a %50
+         %51 = OpLoad %int %a
+         %52 = OpISub %int %51 %int_1
+               OpStore %b %52
+         %54 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %55 = OpLoad %float %54
+         %57 = OpAccessChain %_ptr_Uniform_float %x_11 %uint_0 %int_0
+         %58 = OpLoad %float %57
+         %59 = OpFOrdLessThan %bool %55 %58
+               OpSelectionMerge %61 None
+               OpBranchConditional %59 %62 %61
+         %62 = OpLabel
+         %63 = OpLoad %int %b
+         %64 = OpIAdd %int %63 %int_1
+               OpStore %b %64
+               OpBranch %61
+         %61 = OpLabel
+         %65 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %66 = OpLoad %int %65
+               OpStore %c %66
+         %67 = OpLoad %int %c
+         %68 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %69 = OpLoad %int %68
+         %71 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %72 = OpLoad %int %71
+         %73 = OpLoad %int %b
+         %74 = OpExtInst %int %75 SClamp %67 %69 %72
+         %76 = OpAccessChain %_ptr_Function_int %arr %74
+               OpStore %76 %73
+         %77 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %78 = OpLoad %int %77
+         %79 = OpAccessChain %_ptr_Function_int %arr %78
+         %80 = OpLoad %int %79
+         %81 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %82 = OpLoad %int %81
+         %83 = OpAccessChain %_ptr_Function_int %arr %82
+         %84 = OpLoad %int %83
+         %85 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_Function_int %arr %86
+         %88 = OpLoad %int %87
+         %89 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %90 = OpLoad %int %89
+         %91 = OpAccessChain %_ptr_Function_int %arr %90
+         %92 = OpLoad %int %91
+         %93 = OpConvertSToF %float %80
+         %94 = OpConvertSToF %float %84
+         %95 = OpConvertSToF %float %88
+         %96 = OpConvertSToF %float %92
+         %97 = OpCompositeConstruct %v4float %93 %94 %95 %96
+               OpStore %x_GLF_color %97
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %98
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %102 = OpLabel
+        %103 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %103
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %23
+        %105 = OpLabel
+        %106 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %106
+        %107 = OpFunctionCall %void %main_1
+        %109 = OpLoad %v4float %x_GLF_color
+        %110 = OpCompositeConstruct %main_out %109
+        %108 = OpFunctionCall %void %tint_symbol_3 %110
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-array-accesses-clamp/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-array-accesses-clamp/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..eac5611
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-array-accesses-clamp/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,72 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_11 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var arr : array<i32, 3>;
+  var a : i32;
+  var b : i32;
+  var c : i32;
+  let x_40 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_42 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_44 : i32 = x_7.x_GLF_uniform_int_values[1];
+  arr = array<i32, 3>(x_40, x_42, x_44);
+  let x_47 : i32 = x_7.x_GLF_uniform_int_values[0];
+  let x_49 : i32 = arr[x_47];
+  a = x_49;
+  let x_50 : i32 = a;
+  b = (x_50 - 1);
+  let x_53 : f32 = gl_FragCoord.x;
+  let x_55 : f32 = x_11.x_GLF_uniform_float_values[0];
+  if ((x_53 < x_55)) {
+    let x_59 : i32 = b;
+    b = (x_59 + 1);
+  }
+  let x_62 : i32 = x_7.x_GLF_uniform_int_values[0];
+  c = x_62;
+  let x_63 : i32 = c;
+  let x_65 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_67 : i32 = x_7.x_GLF_uniform_int_values[2];
+  let x_69 : i32 = b;
+  arr[clamp(x_63, x_65, x_67)] = x_69;
+  let x_72 : i32 = x_7.x_GLF_uniform_int_values[0];
+  let x_74 : i32 = arr[x_72];
+  let x_77 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_79 : i32 = arr[x_77];
+  let x_82 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_84 : i32 = arr[x_82];
+  let x_87 : i32 = x_7.x_GLF_uniform_int_values[2];
+  let x_89 : i32 = arr[x_87];
+  x_GLF_color = vec4<f32>(f32(x_74), f32(x_79), f32(x_84), f32(x_89));
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-array-accesses-clamp/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-array-accesses-clamp/0-opt.wgsl
new file mode 100644
index 0000000..eac5611
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-array-accesses-clamp/0-opt.wgsl
@@ -0,0 +1,72 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_11 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var arr : array<i32, 3>;
+  var a : i32;
+  var b : i32;
+  var c : i32;
+  let x_40 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_42 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_44 : i32 = x_7.x_GLF_uniform_int_values[1];
+  arr = array<i32, 3>(x_40, x_42, x_44);
+  let x_47 : i32 = x_7.x_GLF_uniform_int_values[0];
+  let x_49 : i32 = arr[x_47];
+  a = x_49;
+  let x_50 : i32 = a;
+  b = (x_50 - 1);
+  let x_53 : f32 = gl_FragCoord.x;
+  let x_55 : f32 = x_11.x_GLF_uniform_float_values[0];
+  if ((x_53 < x_55)) {
+    let x_59 : i32 = b;
+    b = (x_59 + 1);
+  }
+  let x_62 : i32 = x_7.x_GLF_uniform_int_values[0];
+  c = x_62;
+  let x_63 : i32 = c;
+  let x_65 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_67 : i32 = x_7.x_GLF_uniform_int_values[2];
+  let x_69 : i32 = b;
+  arr[clamp(x_63, x_65, x_67)] = x_69;
+  let x_72 : i32 = x_7.x_GLF_uniform_int_values[0];
+  let x_74 : i32 = arr[x_72];
+  let x_77 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_79 : i32 = arr[x_77];
+  let x_82 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_84 : i32 = arr[x_82];
+  let x_87 : i32 = x_7.x_GLF_uniform_int_values[2];
+  let x_89 : i32 = arr[x_87];
+  x_GLF_color = vec4<f32>(f32(x_74), f32(x_79), f32(x_84), f32(x_89));
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-array-accesses-clamp/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-array-accesses-clamp/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..82c801a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-array-accesses-clamp/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,68 @@
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[3];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_11 : register(b1, space0) {
+  uint4 x_11[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int arr[3] = (int[3])0;
+  int a = 0;
+  int b = 0;
+  int c = 0;
+  const int x_40 = asint(x_7[1].x);
+  const int x_42 = asint(x_7[1].x);
+  const int x_44 = asint(x_7[1].x);
+  const int tint_symbol_6[3] = {x_40, x_42, x_44};
+  arr = tint_symbol_6;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_47 = asint(x_7[scalar_offset / 4][scalar_offset % 4]);
+  const int x_49 = arr[x_47];
+  a = x_49;
+  b = (a - 1);
+  const float x_53 = gl_FragCoord.x;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_55 = asfloat(x_11[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_53 < x_55)) {
+    b = (b + 1);
+  }
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const int x_62 = asint(x_7[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  c = x_62;
+  const int x_63 = c;
+  const int x_65 = asint(x_7[1].x);
+  const int x_67 = asint(x_7[2].x);
+  arr[clamp(x_63, x_65, x_67)] = b;
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const int x_72 = asint(x_7[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  const int x_74 = arr[x_72];
+  const int x_77 = asint(x_7[1].x);
+  const int x_79 = arr[x_77];
+  const int x_82 = asint(x_7[1].x);
+  const int x_84 = arr[x_82];
+  const int x_87 = asint(x_7[2].x);
+  const int x_89 = arr[x_87];
+  x_GLF_color = float4(float(x_74), float(x_79), float(x_84), float(x_89));
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_7 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_7;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-array-accesses-clamp/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-array-accesses-clamp/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..76666da
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-array-accesses-clamp/0-opt.wgsl.expected.msl
@@ -0,0 +1,83 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct tint_array_wrapper_2 {
+  int arr[3];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, constant buf1& x_11, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  tint_array_wrapper_2 arr = {};
+  int a = 0;
+  int b = 0;
+  int c = 0;
+  int const x_40 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  int const x_42 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  int const x_44 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  tint_array_wrapper_2 const tint_symbol_4 = {.arr={x_40, x_42, x_44}};
+  arr = tint_symbol_4;
+  int const x_47 = x_7.x_GLF_uniform_int_values.arr[0].el;
+  int const x_49 = arr.arr[x_47];
+  a = x_49;
+  int const x_50 = a;
+  b = (x_50 - 1);
+  float const x_53 = (*(tint_symbol_6)).x;
+  float const x_55 = x_11.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_53 < x_55)) {
+    int const x_59 = b;
+    b = (x_59 + 1);
+  }
+  int const x_62 = x_7.x_GLF_uniform_int_values.arr[0].el;
+  c = x_62;
+  int const x_63 = c;
+  int const x_65 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  int const x_67 = x_7.x_GLF_uniform_int_values.arr[2].el;
+  int const x_69 = b;
+  arr.arr[clamp(x_63, x_65, x_67)] = x_69;
+  int const x_72 = x_7.x_GLF_uniform_int_values.arr[0].el;
+  int const x_74 = arr.arr[x_72];
+  int const x_77 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  int const x_79 = arr.arr[x_77];
+  int const x_82 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  int const x_84 = arr.arr[x_82];
+  int const x_87 = x_7.x_GLF_uniform_int_values.arr[2].el;
+  int const x_89 = arr.arr[x_87];
+  *(tint_symbol_7) = float4(float(x_74), float(x_79), float(x_84), float(x_89));
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]], constant buf1& x_11 [[buffer(1)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_7, x_11, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-array-accesses-clamp/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-array-accesses-clamp/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..5b91fa9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-array-accesses-clamp/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,173 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 111
+; Schema: 0
+               OpCapability Shader
+         %75 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_11 "x_11"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %arr "arr"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_11 NonWritable
+               OpDecorate %x_11 DescriptorSet 0
+               OpDecorate %x_11 Binding 1
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_int_uint_3_0 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %12
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf1 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_11 = OpVariable %_ptr_Uniform_buf1 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+%_arr_int_uint_3_0 = OpTypeArray %int %uint_3
+%_ptr_Function__arr_int_uint_3_0 = OpTypePointer Function %_arr_int_uint_3_0
+         %30 = OpConstantNull %_arr_int_uint_3_0
+%_ptr_Function_int = OpTypePointer Function %int
+         %33 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+%_ptr_Private_float = OpTypePointer Private %float
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+         %98 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %23
+         %26 = OpLabel
+        %arr = OpVariable %_ptr_Function__arr_int_uint_3_0 Function %30
+          %a = OpVariable %_ptr_Function_int Function %33
+          %b = OpVariable %_ptr_Function_int Function %33
+          %c = OpVariable %_ptr_Function_int Function %33
+         %39 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %40 = OpLoad %int %39
+         %41 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %42 = OpLoad %int %41
+         %43 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %44 = OpLoad %int %43
+         %45 = OpCompositeConstruct %_arr_int_uint_3_0 %40 %42 %44
+               OpStore %arr %45
+         %47 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %48 = OpLoad %int %47
+         %49 = OpAccessChain %_ptr_Function_int %arr %48
+         %50 = OpLoad %int %49
+               OpStore %a %50
+         %51 = OpLoad %int %a
+         %52 = OpISub %int %51 %int_1
+               OpStore %b %52
+         %54 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %55 = OpLoad %float %54
+         %57 = OpAccessChain %_ptr_Uniform_float %x_11 %uint_0 %int_0
+         %58 = OpLoad %float %57
+         %59 = OpFOrdLessThan %bool %55 %58
+               OpSelectionMerge %61 None
+               OpBranchConditional %59 %62 %61
+         %62 = OpLabel
+         %63 = OpLoad %int %b
+         %64 = OpIAdd %int %63 %int_1
+               OpStore %b %64
+               OpBranch %61
+         %61 = OpLabel
+         %65 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %66 = OpLoad %int %65
+               OpStore %c %66
+         %67 = OpLoad %int %c
+         %68 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %69 = OpLoad %int %68
+         %71 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %72 = OpLoad %int %71
+         %73 = OpLoad %int %b
+         %74 = OpExtInst %int %75 SClamp %67 %69 %72
+         %76 = OpAccessChain %_ptr_Function_int %arr %74
+               OpStore %76 %73
+         %77 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %78 = OpLoad %int %77
+         %79 = OpAccessChain %_ptr_Function_int %arr %78
+         %80 = OpLoad %int %79
+         %81 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %82 = OpLoad %int %81
+         %83 = OpAccessChain %_ptr_Function_int %arr %82
+         %84 = OpLoad %int %83
+         %85 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_Function_int %arr %86
+         %88 = OpLoad %int %87
+         %89 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %90 = OpLoad %int %89
+         %91 = OpAccessChain %_ptr_Function_int %arr %90
+         %92 = OpLoad %int %91
+         %93 = OpConvertSToF %float %80
+         %94 = OpConvertSToF %float %84
+         %95 = OpConvertSToF %float %88
+         %96 = OpConvertSToF %float %92
+         %97 = OpCompositeConstruct %v4float %93 %94 %95 %96
+               OpStore %x_GLF_color %97
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %98
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %102 = OpLabel
+        %103 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %103
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %23
+        %105 = OpLabel
+        %106 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %106
+        %107 = OpFunctionCall %void %main_1
+        %109 = OpLoad %v4float %x_GLF_color
+        %110 = OpCompositeConstruct %main_out %109
+        %108 = OpFunctionCall %void %tint_symbol_3 %110
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-array-accesses-clamp/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-array-accesses-clamp/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..eac5611
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-array-accesses-clamp/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,72 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_11 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var arr : array<i32, 3>;
+  var a : i32;
+  var b : i32;
+  var c : i32;
+  let x_40 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_42 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_44 : i32 = x_7.x_GLF_uniform_int_values[1];
+  arr = array<i32, 3>(x_40, x_42, x_44);
+  let x_47 : i32 = x_7.x_GLF_uniform_int_values[0];
+  let x_49 : i32 = arr[x_47];
+  a = x_49;
+  let x_50 : i32 = a;
+  b = (x_50 - 1);
+  let x_53 : f32 = gl_FragCoord.x;
+  let x_55 : f32 = x_11.x_GLF_uniform_float_values[0];
+  if ((x_53 < x_55)) {
+    let x_59 : i32 = b;
+    b = (x_59 + 1);
+  }
+  let x_62 : i32 = x_7.x_GLF_uniform_int_values[0];
+  c = x_62;
+  let x_63 : i32 = c;
+  let x_65 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_67 : i32 = x_7.x_GLF_uniform_int_values[2];
+  let x_69 : i32 = b;
+  arr[clamp(x_63, x_65, x_67)] = x_69;
+  let x_72 : i32 = x_7.x_GLF_uniform_int_values[0];
+  let x_74 : i32 = arr[x_72];
+  let x_77 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_79 : i32 = arr[x_77];
+  let x_82 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_84 : i32 = arr[x_82];
+  let x_87 : i32 = x_7.x_GLF_uniform_int_values[2];
+  let x_89 : i32 = arr[x_87];
+  x_GLF_color = vec4<f32>(f32(x_74), f32(x_79), f32(x_84), f32(x_89));
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-array-copies-loops-with-limiters/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-array-copies-loops-with-limiters/0-opt.spvasm
new file mode 100644
index 0000000..973f76c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-array-copies-loops-with-limiters/0-opt.spvasm
@@ -0,0 +1,401 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %arr0 "arr0"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %arr1 "arr1"
+               OpName %a "a"
+               OpName %limiter0 "limiter0"
+               OpName %limiter1 "limiter1"
+               OpName %b "b"
+               OpName %limiter2 "limiter2"
+               OpName %limiter3 "limiter3"
+               OpName %d "d"
+               OpName %ref0 "ref0"
+               OpName %ref1 "ref1"
+               OpName %_GLF_color "_GLF_color"
+               OpName %i "i"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "one"
+               OpName %__0 ""
+               OpDecorate %_arr_int_uint_20 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+       %void = OpTypeVoid
+         %22 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+    %uint_20 = OpConstant %uint 20
+%_arr_int_uint_20 = OpTypeArray %int %uint_20
+       %buf0 = OpTypeStruct %_arr_int_uint_20
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+      %int_3 = OpConstant %int 3
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+      %int_9 = OpConstant %int 9
+     %int_10 = OpConstant %int 10
+      %int_1 = OpConstant %int 1
+     %int_12 = OpConstant %int 12
+     %int_15 = OpConstant %int 15
+     %int_16 = OpConstant %int 16
+     %int_17 = OpConstant %int 17
+     %int_13 = OpConstant %int 13
+     %int_14 = OpConstant %int 14
+     %int_11 = OpConstant %int 11
+     %int_18 = OpConstant %int 18
+     %int_19 = OpConstant %int 19
+%_ptr_Function_int = OpTypePointer Function %int
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %buf1 = OpTypeStruct %int
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+       %main = OpFunction %void None %22
+         %57 = OpLabel
+       %arr0 = OpVariable %_ptr_Function__arr_int_uint_10 Function
+       %arr1 = OpVariable %_ptr_Function__arr_int_uint_10 Function
+          %a = OpVariable %_ptr_Function_int Function
+   %limiter0 = OpVariable %_ptr_Function_int Function
+   %limiter1 = OpVariable %_ptr_Function_int Function
+          %b = OpVariable %_ptr_Function_int Function
+   %limiter2 = OpVariable %_ptr_Function_int Function
+   %limiter3 = OpVariable %_ptr_Function_int Function
+          %d = OpVariable %_ptr_Function_int Function
+       %ref0 = OpVariable %_ptr_Function__arr_int_uint_10 Function
+       %ref1 = OpVariable %_ptr_Function__arr_int_uint_10 Function
+          %i = OpVariable %_ptr_Function_int Function
+         %58 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %59 = OpLoad %int %58
+         %60 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %61 = OpLoad %int %60
+         %62 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_4
+         %63 = OpLoad %int %62
+         %64 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_5
+         %65 = OpLoad %int %64
+         %66 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_6
+         %67 = OpLoad %int %66
+         %68 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_7
+         %69 = OpLoad %int %68
+         %70 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_8
+         %71 = OpLoad %int %70
+         %72 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_9
+         %73 = OpLoad %int %72
+         %74 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %75 = OpLoad %int %74
+         %76 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_10
+         %77 = OpLoad %int %76
+         %78 = OpCompositeConstruct %_arr_int_uint_10 %59 %61 %63 %65 %67 %69 %71 %73 %75 %77
+               OpStore %arr0 %78
+         %79 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %80 = OpLoad %int %79
+         %81 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_12
+         %82 = OpLoad %int %81
+         %83 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_15
+         %84 = OpLoad %int %83
+         %85 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_16
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_17
+         %88 = OpLoad %int %87
+         %89 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_13
+         %90 = OpLoad %int %89
+         %91 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_14
+         %92 = OpLoad %int %91
+         %93 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_11
+         %94 = OpLoad %int %93
+         %95 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_18
+         %96 = OpLoad %int %95
+         %97 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_19
+         %98 = OpLoad %int %97
+         %99 = OpCompositeConstruct %_arr_int_uint_10 %80 %82 %84 %86 %88 %90 %92 %94 %96 %98
+               OpStore %arr1 %99
+        %100 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_8
+        %101 = OpLoad %int %100
+               OpStore %a %101
+               OpBranch %102
+        %102 = OpLabel
+               OpLoopMerge %103 %104 None
+               OpBranch %105
+        %105 = OpLabel
+        %106 = OpLoad %int %a
+        %107 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+        %108 = OpLoad %int %107
+        %109 = OpSLessThan %bool %106 %108
+               OpBranchConditional %109 %110 %103
+        %110 = OpLabel
+        %111 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+        %112 = OpLoad %int %111
+               OpStore %limiter0 %112
+               OpBranch %113
+        %113 = OpLabel
+               OpLoopMerge %114 %115 None
+               OpBranch %116
+        %116 = OpLabel
+        %117 = OpLoad %int %limiter0
+        %118 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_4
+        %119 = OpLoad %int %118
+        %120 = OpSLessThan %bool %117 %119
+               OpBranchConditional %120 %121 %114
+        %121 = OpLabel
+        %122 = OpLoad %int %limiter0
+        %123 = OpIAdd %int %122 %int_1
+               OpStore %limiter0 %123
+        %124 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+        %125 = OpLoad %int %124
+               OpStore %limiter1 %125
+        %126 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+        %127 = OpLoad %int %126
+               OpStore %b %127
+               OpBranch %128
+        %128 = OpLabel
+               OpLoopMerge %129 %130 None
+               OpBranch %131
+        %131 = OpLabel
+        %132 = OpLoad %int %b
+        %133 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+        %134 = OpLoad %int %133
+        %135 = OpSLessThan %bool %132 %134
+               OpBranchConditional %135 %136 %129
+        %136 = OpLabel
+        %137 = OpLoad %int %limiter1
+        %138 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_5
+        %139 = OpLoad %int %138
+        %140 = OpSGreaterThan %bool %137 %139
+               OpSelectionMerge %141 None
+               OpBranchConditional %140 %142 %141
+        %142 = OpLabel
+               OpBranch %129
+        %141 = OpLabel
+        %143 = OpLoad %int %limiter1
+        %144 = OpIAdd %int %143 %int_1
+               OpStore %limiter1 %144
+        %145 = OpLoad %int %b
+        %146 = OpLoad %int %a
+        %147 = OpAccessChain %_ptr_Function_int %arr1 %146
+        %148 = OpLoad %int %147
+        %149 = OpAccessChain %_ptr_Function_int %arr0 %145
+               OpStore %149 %148
+               OpBranch %130
+        %130 = OpLabel
+        %150 = OpLoad %int %b
+        %151 = OpIAdd %int %150 %int_1
+               OpStore %b %151
+               OpBranch %128
+        %129 = OpLabel
+               OpBranch %115
+        %115 = OpLabel
+               OpBranch %113
+        %114 = OpLabel
+               OpStore %limiter2 %int_0
+               OpBranch %152
+        %152 = OpLabel
+               OpLoopMerge %153 %154 None
+               OpBranch %155
+        %155 = OpLabel
+        %156 = OpLoad %int %limiter2
+        %157 = OpSLessThan %bool %156 %int_5
+               OpBranchConditional %157 %158 %153
+        %158 = OpLabel
+        %159 = OpLoad %int %limiter2
+        %160 = OpIAdd %int %159 %int_1
+               OpStore %limiter2 %160
+        %161 = OpAccessChain %_ptr_Function_int %arr1 %int_1
+        %162 = OpLoad %int %161
+        %163 = OpAccessChain %_ptr_Function_int %arr0 %int_1
+               OpStore %163 %162
+               OpBranch %154
+        %154 = OpLabel
+               OpBranch %152
+        %153 = OpLabel
+               OpBranch %164
+        %164 = OpLabel
+               OpLoopMerge %165 %166 None
+               OpBranch %167
+        %167 = OpLabel
+               OpStore %limiter3 %int_0
+               OpStore %d %int_0
+               OpBranch %168
+        %168 = OpLabel
+               OpLoopMerge %169 %170 None
+               OpBranch %171
+        %171 = OpLabel
+        %172 = OpLoad %int %d
+        %173 = OpSLessThan %bool %172 %int_10
+               OpBranchConditional %173 %174 %169
+        %174 = OpLabel
+        %175 = OpLoad %int %limiter3
+        %176 = OpSGreaterThan %bool %175 %int_4
+               OpSelectionMerge %177 None
+               OpBranchConditional %176 %178 %177
+        %178 = OpLabel
+               OpBranch %169
+        %177 = OpLabel
+        %179 = OpLoad %int %limiter3
+        %180 = OpIAdd %int %179 %int_1
+               OpStore %limiter3 %180
+        %181 = OpLoad %int %d
+        %182 = OpLoad %int %d
+        %183 = OpAccessChain %_ptr_Function_int %arr0 %182
+        %184 = OpLoad %int %183
+        %185 = OpAccessChain %_ptr_Function_int %arr1 %181
+               OpStore %185 %184
+               OpBranch %170
+        %170 = OpLabel
+        %186 = OpLoad %int %d
+        %187 = OpIAdd %int %186 %int_1
+               OpStore %d %187
+               OpBranch %168
+        %169 = OpLabel
+               OpBranch %166
+        %166 = OpLabel
+        %188 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+        %189 = OpLoad %int %188
+        %190 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+        %191 = OpLoad %int %190
+        %192 = OpIEqual %bool %189 %191
+               OpBranchConditional %192 %164 %165
+        %165 = OpLabel
+               OpBranch %104
+        %104 = OpLabel
+        %193 = OpLoad %int %a
+        %194 = OpIAdd %int %193 %int_1
+               OpStore %a %194
+               OpBranch %102
+        %103 = OpLabel
+        %195 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_11
+        %196 = OpLoad %int %195
+        %197 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_12
+        %198 = OpLoad %int %197
+        %199 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_11
+        %200 = OpLoad %int %199
+        %201 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_5
+        %202 = OpLoad %int %201
+        %203 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_6
+        %204 = OpLoad %int %203
+        %205 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_7
+        %206 = OpLoad %int %205
+        %207 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_8
+        %208 = OpLoad %int %207
+        %209 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_9
+        %210 = OpLoad %int %209
+        %211 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+        %212 = OpLoad %int %211
+        %213 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_10
+        %214 = OpLoad %int %213
+        %215 = OpCompositeConstruct %_arr_int_uint_10 %196 %198 %200 %202 %204 %206 %208 %210 %212 %214
+               OpStore %ref0 %215
+        %216 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_11
+        %217 = OpLoad %int %216
+        %218 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_12
+        %219 = OpLoad %int %218
+        %220 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_11
+        %221 = OpLoad %int %220
+        %222 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_5
+        %223 = OpLoad %int %222
+        %224 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_6
+        %225 = OpLoad %int %224
+        %226 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_13
+        %227 = OpLoad %int %226
+        %228 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_14
+        %229 = OpLoad %int %228
+        %230 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_11
+        %231 = OpLoad %int %230
+        %232 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_18
+        %233 = OpLoad %int %232
+        %234 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_19
+        %235 = OpLoad %int %234
+        %236 = OpCompositeConstruct %_arr_int_uint_10 %217 %219 %221 %223 %225 %227 %229 %231 %233 %235
+               OpStore %ref1 %236
+        %237 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+        %238 = OpLoad %int %237
+        %239 = OpConvertSToF %float %238
+        %240 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+        %241 = OpLoad %int %240
+        %242 = OpConvertSToF %float %241
+        %243 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+        %244 = OpLoad %int %243
+        %245 = OpConvertSToF %float %244
+        %246 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+        %247 = OpLoad %int %246
+        %248 = OpConvertSToF %float %247
+        %249 = OpCompositeConstruct %v4float %239 %242 %245 %248
+               OpStore %_GLF_color %249
+        %250 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+        %251 = OpLoad %int %250
+               OpStore %i %251
+               OpBranch %252
+        %252 = OpLabel
+               OpLoopMerge %253 %254 None
+               OpBranch %255
+        %255 = OpLabel
+        %256 = OpLoad %int %i
+        %257 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+        %258 = OpLoad %int %257
+        %259 = OpSLessThan %bool %256 %258
+               OpBranchConditional %259 %260 %253
+        %260 = OpLabel
+        %261 = OpLoad %int %i
+        %262 = OpAccessChain %_ptr_Function_int %arr0 %261
+        %263 = OpLoad %int %262
+        %264 = OpLoad %int %i
+        %265 = OpAccessChain %_ptr_Function_int %ref0 %264
+        %266 = OpLoad %int %265
+        %267 = OpINotEqual %bool %263 %266
+        %268 = OpLogicalNot %bool %267
+               OpSelectionMerge %269 None
+               OpBranchConditional %268 %270 %269
+        %270 = OpLabel
+        %271 = OpLoad %int %i
+        %272 = OpAccessChain %_ptr_Function_int %arr1 %271
+        %273 = OpLoad %int %272
+        %274 = OpLoad %int %i
+        %275 = OpAccessChain %_ptr_Function_int %ref1 %274
+        %276 = OpLoad %int %275
+        %277 = OpINotEqual %bool %273 %276
+               OpBranch %269
+        %269 = OpLabel
+        %278 = OpPhi %bool %267 %260 %277 %270
+               OpSelectionMerge %279 None
+               OpBranchConditional %278 %280 %279
+        %280 = OpLabel
+        %281 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+        %282 = OpLoad %int %281
+        %283 = OpConvertSToF %float %282
+        %284 = OpCompositeConstruct %v4float %283 %283 %283 %283
+               OpStore %_GLF_color %284
+               OpBranch %279
+        %279 = OpLabel
+               OpBranch %254
+        %254 = OpLabel
+        %285 = OpLoad %int %i
+        %286 = OpIAdd %int %285 %int_1
+               OpStore %i %286
+               OpBranch %252
+        %253 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-array-copies-loops-with-limiters/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-array-copies-loops-with-limiters/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..de01a1a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-array-copies-loops-with-limiters/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,204 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[20];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_19 : register(b1, space0) {
+  uint4 x_19[1];
+};
+
+void main_1() {
+  int arr0[10] = (int[10])0;
+  int arr1[10] = (int[10])0;
+  int a = 0;
+  int limiter0 = 0;
+  int limiter1 = 0;
+  int b = 0;
+  int limiter2 = 0;
+  int limiter3 = 0;
+  int d = 0;
+  int ref0[10] = (int[10])0;
+  int ref1[10] = (int[10])0;
+  int i = 0;
+  const int x_59 = asint(x_6[3].x);
+  const int x_61 = asint(x_6[2].x);
+  const int x_63 = asint(x_6[4].x);
+  const int x_65 = asint(x_6[5].x);
+  const int x_67 = asint(x_6[6].x);
+  const int x_69 = asint(x_6[7].x);
+  const int x_71 = asint(x_6[8].x);
+  const int x_73 = asint(x_6[9].x);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_75 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const int x_77 = asint(x_6[10].x);
+  const int tint_symbol_3[10] = {x_59, x_61, x_63, x_65, x_67, x_69, x_71, x_73, x_75, x_77};
+  arr0 = tint_symbol_3;
+  const int x_80 = asint(x_6[1].x);
+  const int x_82 = asint(x_6[12].x);
+  const int x_84 = asint(x_6[15].x);
+  const int x_86 = asint(x_6[16].x);
+  const int x_88 = asint(x_6[17].x);
+  const int x_90 = asint(x_6[13].x);
+  const int x_92 = asint(x_6[14].x);
+  const int x_94 = asint(x_6[11].x);
+  const int x_96 = asint(x_6[18].x);
+  const int x_98 = asint(x_6[19].x);
+  const int tint_symbol_4[10] = {x_80, x_82, x_84, x_86, x_88, x_90, x_92, x_94, x_96, x_98};
+  arr1 = tint_symbol_4;
+  const int x_101 = asint(x_6[8].x);
+  a = x_101;
+  while (true) {
+    const int x_106 = a;
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_108 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    if ((x_106 < x_108)) {
+    } else {
+      break;
+    }
+    const int x_112 = asint(x_6[3].x);
+    limiter0 = x_112;
+    while (true) {
+      const int x_117 = limiter0;
+      const int x_119 = asint(x_6[4].x);
+      if ((x_117 < x_119)) {
+      } else {
+        break;
+      }
+      limiter0 = (limiter0 + 1);
+      const int x_125 = asint(x_6[2].x);
+      limiter1 = x_125;
+      const int x_127 = asint(x_6[3].x);
+      b = x_127;
+      while (true) {
+        const int x_132 = b;
+        const int x_134 = asint(x_6[1].x);
+        if ((x_132 < x_134)) {
+        } else {
+          break;
+        }
+        const int x_137 = limiter1;
+        const int x_139 = asint(x_6[5].x);
+        if ((x_137 > x_139)) {
+          break;
+        }
+        limiter1 = (limiter1 + 1);
+        const int x_145 = b;
+        const int x_148 = arr1[a];
+        arr0[x_145] = x_148;
+        {
+          b = (b + 1);
+        }
+      }
+    }
+    limiter2 = 0;
+    while (true) {
+      if ((limiter2 < 5)) {
+      } else {
+        break;
+      }
+      limiter2 = (limiter2 + 1);
+      const int x_162 = arr1[1];
+      arr0[1] = x_162;
+    }
+    while (true) {
+      limiter3 = 0;
+      d = 0;
+      {
+        for(; (d < 10); d = (d + 1)) {
+          if ((limiter3 > 4)) {
+            break;
+          }
+          limiter3 = (limiter3 + 1);
+          const int x_181 = d;
+          const int x_184 = arr0[d];
+          arr1[x_181] = x_184;
+        }
+      }
+      {
+        const int x_189 = asint(x_6[2].x);
+        const int x_191 = asint(x_6[3].x);
+        if ((x_189 == x_191)) {
+        } else {
+          break;
+        }
+      }
+    }
+    {
+      a = (a + 1);
+    }
+  }
+  const int x_196 = asint(x_6[11].x);
+  const int x_198 = asint(x_6[12].x);
+  const int x_200 = asint(x_6[11].x);
+  const int x_202 = asint(x_6[5].x);
+  const int x_204 = asint(x_6[6].x);
+  const int x_206 = asint(x_6[7].x);
+  const int x_208 = asint(x_6[8].x);
+  const int x_210 = asint(x_6[9].x);
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const int x_212 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  const int x_214 = asint(x_6[10].x);
+  const int tint_symbol_5[10] = {x_196, x_198, x_200, x_202, x_204, x_206, x_208, x_210, x_212, x_214};
+  ref0 = tint_symbol_5;
+  const int x_217 = asint(x_6[11].x);
+  const int x_219 = asint(x_6[12].x);
+  const int x_221 = asint(x_6[11].x);
+  const int x_223 = asint(x_6[5].x);
+  const int x_225 = asint(x_6[6].x);
+  const int x_227 = asint(x_6[13].x);
+  const int x_229 = asint(x_6[14].x);
+  const int x_231 = asint(x_6[11].x);
+  const int x_233 = asint(x_6[18].x);
+  const int x_235 = asint(x_6[19].x);
+  const int tint_symbol_6[10] = {x_217, x_219, x_221, x_223, x_225, x_227, x_229, x_231, x_233, x_235};
+  ref1 = tint_symbol_6;
+  const int x_238 = asint(x_6[2].x);
+  const int x_241 = asint(x_6[3].x);
+  const int x_244 = asint(x_6[3].x);
+  const int x_247 = asint(x_6[2].x);
+  x_GLF_color = float4(float(x_238), float(x_241), float(x_244), float(x_247));
+  const int x_251 = asint(x_6[3].x);
+  i = x_251;
+  while (true) {
+    bool x_277 = false;
+    bool x_278_phi = false;
+    const int x_256 = i;
+    const int x_258 = asint(x_6[1].x);
+    if ((x_256 < x_258)) {
+    } else {
+      break;
+    }
+    const int x_263 = arr0[i];
+    const int x_266 = ref0[i];
+    const bool x_267 = (x_263 != x_266);
+    x_278_phi = x_267;
+    if (!(x_267)) {
+      const int x_273 = arr1[i];
+      const int x_276 = ref1[i];
+      x_277 = (x_273 != x_276);
+      x_278_phi = x_277;
+    }
+    if (x_278_phi) {
+      const int x_282 = asint(x_6[3].x);
+      const float x_283 = float(x_282);
+      x_GLF_color = float4(x_283, x_283, x_283, x_283);
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_7 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_7;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-array-copies-loops-with-limiters/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-array-copies-loops-with-limiters/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..417083d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-array-copies-loops-with-limiters/0-opt.spvasm.expected.msl
@@ -0,0 +1,237 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[20];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct buf1 {
+  /* 0x0000 */ int one;
+};
+struct tint_array_wrapper_1 {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_8) {
+  tint_array_wrapper_1 arr0 = {};
+  tint_array_wrapper_1 arr1 = {};
+  int a = 0;
+  int limiter0 = 0;
+  int limiter1 = 0;
+  int b = 0;
+  int limiter2 = 0;
+  int limiter3 = 0;
+  int d = 0;
+  tint_array_wrapper_1 ref0 = {};
+  tint_array_wrapper_1 ref1 = {};
+  int i = 0;
+  int const x_59 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  int const x_61 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_63 = x_6.x_GLF_uniform_int_values.arr[4].el;
+  int const x_65 = x_6.x_GLF_uniform_int_values.arr[5].el;
+  int const x_67 = x_6.x_GLF_uniform_int_values.arr[6].el;
+  int const x_69 = x_6.x_GLF_uniform_int_values.arr[7].el;
+  int const x_71 = x_6.x_GLF_uniform_int_values.arr[8].el;
+  int const x_73 = x_6.x_GLF_uniform_int_values.arr[9].el;
+  int const x_75 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_77 = x_6.x_GLF_uniform_int_values.arr[10].el;
+  tint_array_wrapper_1 const tint_symbol_3 = {.arr={x_59, x_61, x_63, x_65, x_67, x_69, x_71, x_73, x_75, x_77}};
+  arr0 = tint_symbol_3;
+  int const x_80 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_82 = x_6.x_GLF_uniform_int_values.arr[12].el;
+  int const x_84 = x_6.x_GLF_uniform_int_values.arr[15].el;
+  int const x_86 = x_6.x_GLF_uniform_int_values.arr[16].el;
+  int const x_88 = x_6.x_GLF_uniform_int_values.arr[17].el;
+  int const x_90 = x_6.x_GLF_uniform_int_values.arr[13].el;
+  int const x_92 = x_6.x_GLF_uniform_int_values.arr[14].el;
+  int const x_94 = x_6.x_GLF_uniform_int_values.arr[11].el;
+  int const x_96 = x_6.x_GLF_uniform_int_values.arr[18].el;
+  int const x_98 = x_6.x_GLF_uniform_int_values.arr[19].el;
+  tint_array_wrapper_1 const tint_symbol_4 = {.arr={x_80, x_82, x_84, x_86, x_88, x_90, x_92, x_94, x_96, x_98}};
+  arr1 = tint_symbol_4;
+  int const x_101 = x_6.x_GLF_uniform_int_values.arr[8].el;
+  a = x_101;
+  while (true) {
+    int const x_106 = a;
+    int const x_108 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_106 < x_108)) {
+    } else {
+      break;
+    }
+    int const x_112 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    limiter0 = x_112;
+    while (true) {
+      int const x_117 = limiter0;
+      int const x_119 = x_6.x_GLF_uniform_int_values.arr[4].el;
+      if ((x_117 < x_119)) {
+      } else {
+        break;
+      }
+      int const x_122 = limiter0;
+      limiter0 = (x_122 + 1);
+      int const x_125 = x_6.x_GLF_uniform_int_values.arr[2].el;
+      limiter1 = x_125;
+      int const x_127 = x_6.x_GLF_uniform_int_values.arr[3].el;
+      b = x_127;
+      while (true) {
+        int const x_132 = b;
+        int const x_134 = x_6.x_GLF_uniform_int_values.arr[1].el;
+        if ((x_132 < x_134)) {
+        } else {
+          break;
+        }
+        int const x_137 = limiter1;
+        int const x_139 = x_6.x_GLF_uniform_int_values.arr[5].el;
+        if ((x_137 > x_139)) {
+          break;
+        }
+        int const x_143 = limiter1;
+        limiter1 = (x_143 + 1);
+        int const x_145 = b;
+        int const x_146 = a;
+        int const x_148 = arr1.arr[x_146];
+        arr0.arr[x_145] = x_148;
+        {
+          int const x_150 = b;
+          b = (x_150 + 1);
+        }
+      }
+    }
+    limiter2 = 0;
+    while (true) {
+      int const x_156 = limiter2;
+      if ((x_156 < 5)) {
+      } else {
+        break;
+      }
+      int const x_159 = limiter2;
+      limiter2 = (x_159 + 1);
+      int const x_162 = arr1.arr[1];
+      arr0.arr[1] = x_162;
+    }
+    while (true) {
+      limiter3 = 0;
+      d = 0;
+      while (true) {
+        int const x_172 = d;
+        if ((x_172 < 10)) {
+        } else {
+          break;
+        }
+        int const x_175 = limiter3;
+        if ((x_175 > 4)) {
+          break;
+        }
+        int const x_179 = limiter3;
+        limiter3 = (x_179 + 1);
+        int const x_181 = d;
+        int const x_182 = d;
+        int const x_184 = arr0.arr[x_182];
+        arr1.arr[x_181] = x_184;
+        {
+          int const x_186 = d;
+          d = (x_186 + 1);
+        }
+      }
+      {
+        int const x_189 = x_6.x_GLF_uniform_int_values.arr[2].el;
+        int const x_191 = x_6.x_GLF_uniform_int_values.arr[3].el;
+        if ((x_189 == x_191)) {
+        } else {
+          break;
+        }
+      }
+    }
+    {
+      int const x_193 = a;
+      a = (x_193 + 1);
+    }
+  }
+  int const x_196 = x_6.x_GLF_uniform_int_values.arr[11].el;
+  int const x_198 = x_6.x_GLF_uniform_int_values.arr[12].el;
+  int const x_200 = x_6.x_GLF_uniform_int_values.arr[11].el;
+  int const x_202 = x_6.x_GLF_uniform_int_values.arr[5].el;
+  int const x_204 = x_6.x_GLF_uniform_int_values.arr[6].el;
+  int const x_206 = x_6.x_GLF_uniform_int_values.arr[7].el;
+  int const x_208 = x_6.x_GLF_uniform_int_values.arr[8].el;
+  int const x_210 = x_6.x_GLF_uniform_int_values.arr[9].el;
+  int const x_212 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_214 = x_6.x_GLF_uniform_int_values.arr[10].el;
+  tint_array_wrapper_1 const tint_symbol_5 = {.arr={x_196, x_198, x_200, x_202, x_204, x_206, x_208, x_210, x_212, x_214}};
+  ref0 = tint_symbol_5;
+  int const x_217 = x_6.x_GLF_uniform_int_values.arr[11].el;
+  int const x_219 = x_6.x_GLF_uniform_int_values.arr[12].el;
+  int const x_221 = x_6.x_GLF_uniform_int_values.arr[11].el;
+  int const x_223 = x_6.x_GLF_uniform_int_values.arr[5].el;
+  int const x_225 = x_6.x_GLF_uniform_int_values.arr[6].el;
+  int const x_227 = x_6.x_GLF_uniform_int_values.arr[13].el;
+  int const x_229 = x_6.x_GLF_uniform_int_values.arr[14].el;
+  int const x_231 = x_6.x_GLF_uniform_int_values.arr[11].el;
+  int const x_233 = x_6.x_GLF_uniform_int_values.arr[18].el;
+  int const x_235 = x_6.x_GLF_uniform_int_values.arr[19].el;
+  tint_array_wrapper_1 const tint_symbol_6 = {.arr={x_217, x_219, x_221, x_223, x_225, x_227, x_229, x_231, x_233, x_235}};
+  ref1 = tint_symbol_6;
+  int const x_238 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_241 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  int const x_244 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  int const x_247 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  *(tint_symbol_8) = float4(float(x_238), float(x_241), float(x_244), float(x_247));
+  int const x_251 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  i = x_251;
+  while (true) {
+    bool x_277 = false;
+    bool x_278_phi = false;
+    int const x_256 = i;
+    int const x_258 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    if ((x_256 < x_258)) {
+    } else {
+      break;
+    }
+    int const x_261 = i;
+    int const x_263 = arr0.arr[x_261];
+    int const x_264 = i;
+    int const x_266 = ref0.arr[x_264];
+    bool const x_267 = (x_263 != x_266);
+    x_278_phi = x_267;
+    if (!(x_267)) {
+      int const x_271 = i;
+      int const x_273 = arr1.arr[x_271];
+      int const x_274 = i;
+      int const x_276 = ref1.arr[x_274];
+      x_277 = (x_273 != x_276);
+      x_278_phi = x_277;
+    }
+    bool const x_278 = x_278_phi;
+    if (x_278) {
+      int const x_282 = x_6.x_GLF_uniform_int_values.arr[3].el;
+      float const x_283 = float(x_282);
+      *(tint_symbol_8) = float4(x_283, x_283, x_283, x_283);
+    }
+    {
+      int const x_285 = i;
+      i = (x_285 + 1);
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_9 = 0.0f;
+  main_1(x_6, &(tint_symbol_9));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_1 const tint_symbol_7 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_7;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-array-copies-loops-with-limiters/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-array-copies-loops-with-limiters/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..db432fc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-array-copies-loops-with-limiters/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,489 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 324
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "one"
+               OpName %x_19 "x_19"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %arr0 "arr0"
+               OpName %arr1 "arr1"
+               OpName %a "a"
+               OpName %limiter0 "limiter0"
+               OpName %limiter1 "limiter1"
+               OpName %b "b"
+               OpName %limiter2 "limiter2"
+               OpName %limiter3 "limiter3"
+               OpName %d "d"
+               OpName %ref0 "ref0"
+               OpName %ref1 "ref1"
+               OpName %i "i"
+               OpName %x_277 "x_277"
+               OpName %x_278_phi "x_278_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_20 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_19 NonWritable
+               OpDecorate %x_19 DescriptorSet 0
+               OpDecorate %x_19 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_20 = OpConstant %uint 20
+%_arr_int_uint_20 = OpTypeArray %int %uint_20
+       %buf0 = OpTypeStruct %_arr_int_uint_20
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+       %buf1 = OpTypeStruct %int
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_19 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+         %26 = OpConstantNull %_arr_int_uint_10
+%_ptr_Function_int = OpTypePointer Function %int
+         %30 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_3 = OpConstant %int 3
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+      %int_9 = OpConstant %int 9
+      %int_0 = OpConstant %int 0
+     %int_10 = OpConstant %int 10
+      %int_1 = OpConstant %int 1
+     %int_12 = OpConstant %int 12
+     %int_15 = OpConstant %int 15
+     %int_16 = OpConstant %int 16
+     %int_17 = OpConstant %int 17
+     %int_13 = OpConstant %int 13
+     %int_14 = OpConstant %int 14
+     %int_11 = OpConstant %int 11
+     %int_18 = OpConstant %int 18
+     %int_19 = OpConstant %int 19
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+        %276 = OpConstantNull %bool
+   %main_out = OpTypeStruct %v4float
+        %312 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %18
+         %21 = OpLabel
+       %arr0 = OpVariable %_ptr_Function__arr_int_uint_10 Function %26
+       %arr1 = OpVariable %_ptr_Function__arr_int_uint_10 Function %26
+          %a = OpVariable %_ptr_Function_int Function %30
+   %limiter0 = OpVariable %_ptr_Function_int Function %30
+   %limiter1 = OpVariable %_ptr_Function_int Function %30
+          %b = OpVariable %_ptr_Function_int Function %30
+   %limiter2 = OpVariable %_ptr_Function_int Function %30
+   %limiter3 = OpVariable %_ptr_Function_int Function %30
+          %d = OpVariable %_ptr_Function_int Function %30
+       %ref0 = OpVariable %_ptr_Function__arr_int_uint_10 Function %26
+       %ref1 = OpVariable %_ptr_Function__arr_int_uint_10 Function %26
+          %i = OpVariable %_ptr_Function_int Function %30
+      %x_277 = OpVariable %_ptr_Function_bool Function %276
+  %x_278_phi = OpVariable %_ptr_Function_bool Function %276
+         %43 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %44 = OpLoad %int %43
+         %46 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %47 = OpLoad %int %46
+         %49 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+         %50 = OpLoad %int %49
+         %52 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_5
+         %53 = OpLoad %int %52
+         %55 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_6
+         %56 = OpLoad %int %55
+         %58 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_7
+         %59 = OpLoad %int %58
+         %61 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_8
+         %62 = OpLoad %int %61
+         %64 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_9
+         %65 = OpLoad %int %64
+         %67 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %68 = OpLoad %int %67
+         %70 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_10
+         %71 = OpLoad %int %70
+         %72 = OpCompositeConstruct %_arr_int_uint_10 %44 %47 %50 %53 %56 %59 %62 %65 %68 %71
+               OpStore %arr0 %72
+         %74 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %75 = OpLoad %int %74
+         %77 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_12
+         %78 = OpLoad %int %77
+         %80 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_15
+         %81 = OpLoad %int %80
+         %83 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_16
+         %84 = OpLoad %int %83
+         %86 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_17
+         %87 = OpLoad %int %86
+         %89 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_13
+         %90 = OpLoad %int %89
+         %92 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_14
+         %93 = OpLoad %int %92
+         %95 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_11
+         %96 = OpLoad %int %95
+         %98 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_18
+         %99 = OpLoad %int %98
+        %101 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_19
+        %102 = OpLoad %int %101
+        %103 = OpCompositeConstruct %_arr_int_uint_10 %75 %78 %81 %84 %87 %90 %93 %96 %99 %102
+               OpStore %arr1 %103
+        %104 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_8
+        %105 = OpLoad %int %104
+               OpStore %a %105
+               OpBranch %106
+        %106 = OpLabel
+               OpLoopMerge %107 %108 None
+               OpBranch %109
+        %109 = OpLabel
+        %110 = OpLoad %int %a
+        %111 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %112 = OpLoad %int %111
+        %113 = OpSLessThan %bool %110 %112
+               OpSelectionMerge %115 None
+               OpBranchConditional %113 %116 %117
+        %116 = OpLabel
+               OpBranch %115
+        %117 = OpLabel
+               OpBranch %107
+        %115 = OpLabel
+        %118 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+        %119 = OpLoad %int %118
+               OpStore %limiter0 %119
+               OpBranch %120
+        %120 = OpLabel
+               OpLoopMerge %121 %122 None
+               OpBranch %123
+        %123 = OpLabel
+        %124 = OpLoad %int %limiter0
+        %125 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+        %126 = OpLoad %int %125
+        %127 = OpSLessThan %bool %124 %126
+               OpSelectionMerge %128 None
+               OpBranchConditional %127 %129 %130
+        %129 = OpLabel
+               OpBranch %128
+        %130 = OpLabel
+               OpBranch %121
+        %128 = OpLabel
+        %131 = OpLoad %int %limiter0
+        %132 = OpIAdd %int %131 %int_1
+               OpStore %limiter0 %132
+        %133 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %134 = OpLoad %int %133
+               OpStore %limiter1 %134
+        %135 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+        %136 = OpLoad %int %135
+               OpStore %b %136
+               OpBranch %137
+        %137 = OpLabel
+               OpLoopMerge %138 %139 None
+               OpBranch %140
+        %140 = OpLabel
+        %141 = OpLoad %int %b
+        %142 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %143 = OpLoad %int %142
+        %144 = OpSLessThan %bool %141 %143
+               OpSelectionMerge %145 None
+               OpBranchConditional %144 %146 %147
+        %146 = OpLabel
+               OpBranch %145
+        %147 = OpLabel
+               OpBranch %138
+        %145 = OpLabel
+        %148 = OpLoad %int %limiter1
+        %149 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_5
+        %150 = OpLoad %int %149
+        %151 = OpSGreaterThan %bool %148 %150
+               OpSelectionMerge %152 None
+               OpBranchConditional %151 %153 %152
+        %153 = OpLabel
+               OpBranch %138
+        %152 = OpLabel
+        %154 = OpLoad %int %limiter1
+        %155 = OpIAdd %int %154 %int_1
+               OpStore %limiter1 %155
+        %156 = OpLoad %int %b
+        %157 = OpLoad %int %a
+        %158 = OpAccessChain %_ptr_Function_int %arr1 %157
+        %159 = OpLoad %int %158
+        %160 = OpAccessChain %_ptr_Function_int %arr0 %156
+               OpStore %160 %159
+               OpBranch %139
+        %139 = OpLabel
+        %161 = OpLoad %int %b
+        %162 = OpIAdd %int %161 %int_1
+               OpStore %b %162
+               OpBranch %137
+        %138 = OpLabel
+               OpBranch %122
+        %122 = OpLabel
+               OpBranch %120
+        %121 = OpLabel
+               OpStore %limiter2 %int_0
+               OpBranch %163
+        %163 = OpLabel
+               OpLoopMerge %164 %165 None
+               OpBranch %166
+        %166 = OpLabel
+        %167 = OpLoad %int %limiter2
+        %168 = OpSLessThan %bool %167 %int_5
+               OpSelectionMerge %169 None
+               OpBranchConditional %168 %170 %171
+        %170 = OpLabel
+               OpBranch %169
+        %171 = OpLabel
+               OpBranch %164
+        %169 = OpLabel
+        %172 = OpLoad %int %limiter2
+        %173 = OpIAdd %int %172 %int_1
+               OpStore %limiter2 %173
+        %174 = OpAccessChain %_ptr_Function_int %arr1 %int_1
+        %175 = OpLoad %int %174
+        %176 = OpAccessChain %_ptr_Function_int %arr0 %int_1
+               OpStore %176 %175
+               OpBranch %165
+        %165 = OpLabel
+               OpBranch %163
+        %164 = OpLabel
+               OpBranch %177
+        %177 = OpLabel
+               OpLoopMerge %178 %179 None
+               OpBranch %180
+        %180 = OpLabel
+               OpStore %limiter3 %int_0
+               OpStore %d %int_0
+               OpBranch %181
+        %181 = OpLabel
+               OpLoopMerge %182 %183 None
+               OpBranch %184
+        %184 = OpLabel
+        %185 = OpLoad %int %d
+        %186 = OpSLessThan %bool %185 %int_10
+               OpSelectionMerge %187 None
+               OpBranchConditional %186 %188 %189
+        %188 = OpLabel
+               OpBranch %187
+        %189 = OpLabel
+               OpBranch %182
+        %187 = OpLabel
+        %190 = OpLoad %int %limiter3
+        %191 = OpSGreaterThan %bool %190 %int_4
+               OpSelectionMerge %192 None
+               OpBranchConditional %191 %193 %192
+        %193 = OpLabel
+               OpBranch %182
+        %192 = OpLabel
+        %194 = OpLoad %int %limiter3
+        %195 = OpIAdd %int %194 %int_1
+               OpStore %limiter3 %195
+        %196 = OpLoad %int %d
+        %197 = OpLoad %int %d
+        %198 = OpAccessChain %_ptr_Function_int %arr0 %197
+        %199 = OpLoad %int %198
+        %200 = OpAccessChain %_ptr_Function_int %arr1 %196
+               OpStore %200 %199
+               OpBranch %183
+        %183 = OpLabel
+        %201 = OpLoad %int %d
+        %202 = OpIAdd %int %201 %int_1
+               OpStore %d %202
+               OpBranch %181
+        %182 = OpLabel
+               OpBranch %179
+        %179 = OpLabel
+        %203 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %204 = OpLoad %int %203
+        %205 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+        %206 = OpLoad %int %205
+        %207 = OpIEqual %bool %204 %206
+               OpSelectionMerge %208 None
+               OpBranchConditional %207 %209 %210
+        %209 = OpLabel
+               OpBranch %208
+        %210 = OpLabel
+               OpBranch %178
+        %208 = OpLabel
+               OpBranch %177
+        %178 = OpLabel
+               OpBranch %108
+        %108 = OpLabel
+        %211 = OpLoad %int %a
+        %212 = OpIAdd %int %211 %int_1
+               OpStore %a %212
+               OpBranch %106
+        %107 = OpLabel
+        %213 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_11
+        %214 = OpLoad %int %213
+        %215 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_12
+        %216 = OpLoad %int %215
+        %217 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_11
+        %218 = OpLoad %int %217
+        %219 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_5
+        %220 = OpLoad %int %219
+        %221 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_6
+        %222 = OpLoad %int %221
+        %223 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_7
+        %224 = OpLoad %int %223
+        %225 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_8
+        %226 = OpLoad %int %225
+        %227 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_9
+        %228 = OpLoad %int %227
+        %229 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %230 = OpLoad %int %229
+        %231 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_10
+        %232 = OpLoad %int %231
+        %233 = OpCompositeConstruct %_arr_int_uint_10 %214 %216 %218 %220 %222 %224 %226 %228 %230 %232
+               OpStore %ref0 %233
+        %234 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_11
+        %235 = OpLoad %int %234
+        %236 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_12
+        %237 = OpLoad %int %236
+        %238 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_11
+        %239 = OpLoad %int %238
+        %240 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_5
+        %241 = OpLoad %int %240
+        %242 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_6
+        %243 = OpLoad %int %242
+        %244 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_13
+        %245 = OpLoad %int %244
+        %246 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_14
+        %247 = OpLoad %int %246
+        %248 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_11
+        %249 = OpLoad %int %248
+        %250 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_18
+        %251 = OpLoad %int %250
+        %252 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_19
+        %253 = OpLoad %int %252
+        %254 = OpCompositeConstruct %_arr_int_uint_10 %235 %237 %239 %241 %243 %245 %247 %249 %251 %253
+               OpStore %ref1 %254
+        %255 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %256 = OpLoad %int %255
+        %257 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+        %258 = OpLoad %int %257
+        %259 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+        %260 = OpLoad %int %259
+        %261 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %262 = OpLoad %int %261
+        %263 = OpConvertSToF %float %256
+        %264 = OpConvertSToF %float %258
+        %265 = OpConvertSToF %float %260
+        %266 = OpConvertSToF %float %262
+        %267 = OpCompositeConstruct %v4float %263 %264 %265 %266
+               OpStore %x_GLF_color %267
+        %268 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+        %269 = OpLoad %int %268
+               OpStore %i %269
+               OpBranch %270
+        %270 = OpLabel
+               OpLoopMerge %271 %272 None
+               OpBranch %273
+        %273 = OpLabel
+        %278 = OpLoad %int %i
+        %279 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %280 = OpLoad %int %279
+        %281 = OpSLessThan %bool %278 %280
+               OpSelectionMerge %282 None
+               OpBranchConditional %281 %283 %284
+        %283 = OpLabel
+               OpBranch %282
+        %284 = OpLabel
+               OpBranch %271
+        %282 = OpLabel
+        %285 = OpLoad %int %i
+        %286 = OpAccessChain %_ptr_Function_int %arr0 %285
+        %287 = OpLoad %int %286
+        %288 = OpLoad %int %i
+        %289 = OpAccessChain %_ptr_Function_int %ref0 %288
+        %290 = OpLoad %int %289
+        %291 = OpINotEqual %bool %287 %290
+               OpStore %x_278_phi %291
+        %292 = OpLogicalNot %bool %291
+               OpSelectionMerge %293 None
+               OpBranchConditional %292 %294 %293
+        %294 = OpLabel
+        %295 = OpLoad %int %i
+        %296 = OpAccessChain %_ptr_Function_int %arr1 %295
+        %297 = OpLoad %int %296
+        %298 = OpLoad %int %i
+        %299 = OpAccessChain %_ptr_Function_int %ref1 %298
+        %300 = OpLoad %int %299
+        %301 = OpINotEqual %bool %297 %300
+               OpStore %x_277 %301
+        %302 = OpLoad %bool %x_277
+               OpStore %x_278_phi %302
+               OpBranch %293
+        %293 = OpLabel
+        %303 = OpLoad %bool %x_278_phi
+               OpSelectionMerge %304 None
+               OpBranchConditional %303 %305 %304
+        %305 = OpLabel
+        %306 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+        %307 = OpLoad %int %306
+        %308 = OpConvertSToF %float %307
+        %309 = OpCompositeConstruct %v4float %308 %308 %308 %308
+               OpStore %x_GLF_color %309
+               OpBranch %304
+        %304 = OpLabel
+               OpBranch %272
+        %272 = OpLabel
+        %310 = OpLoad %int %i
+        %311 = OpIAdd %int %310 %int_1
+               OpStore %i %311
+               OpBranch %270
+        %271 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %312
+%tint_symbol = OpFunctionParameter %main_out
+        %316 = OpLabel
+        %317 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %317
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %18
+        %319 = OpLabel
+        %320 = OpFunctionCall %void %main_1
+        %322 = OpLoad %v4float %x_GLF_color
+        %323 = OpCompositeConstruct %main_out %322
+        %321 = OpFunctionCall %void %tint_symbol_2 %323
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 179[%179] is not post dominated by the back-edge block 208[%208]
+  %208 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-array-copies-loops-with-limiters/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-array-copies-loops-with-limiters/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..60a0604
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-array-copies-loops-with-limiters/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,232 @@
+type Arr = [[stride(16)]] array<i32, 20>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[block]]
+struct buf1 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_19 : buf1;
+
+fn main_1() {
+  var arr0 : array<i32, 10>;
+  var arr1 : array<i32, 10>;
+  var a : i32;
+  var limiter0 : i32;
+  var limiter1 : i32;
+  var b : i32;
+  var limiter2 : i32;
+  var limiter3 : i32;
+  var d : i32;
+  var ref0 : array<i32, 10>;
+  var ref1 : array<i32, 10>;
+  var i : i32;
+  let x_59 : i32 = x_6.x_GLF_uniform_int_values[3];
+  let x_61 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_63 : i32 = x_6.x_GLF_uniform_int_values[4];
+  let x_65 : i32 = x_6.x_GLF_uniform_int_values[5];
+  let x_67 : i32 = x_6.x_GLF_uniform_int_values[6];
+  let x_69 : i32 = x_6.x_GLF_uniform_int_values[7];
+  let x_71 : i32 = x_6.x_GLF_uniform_int_values[8];
+  let x_73 : i32 = x_6.x_GLF_uniform_int_values[9];
+  let x_75 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_77 : i32 = x_6.x_GLF_uniform_int_values[10];
+  arr0 = array<i32, 10>(x_59, x_61, x_63, x_65, x_67, x_69, x_71, x_73, x_75, x_77);
+  let x_80 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_82 : i32 = x_6.x_GLF_uniform_int_values[12];
+  let x_84 : i32 = x_6.x_GLF_uniform_int_values[15];
+  let x_86 : i32 = x_6.x_GLF_uniform_int_values[16];
+  let x_88 : i32 = x_6.x_GLF_uniform_int_values[17];
+  let x_90 : i32 = x_6.x_GLF_uniform_int_values[13];
+  let x_92 : i32 = x_6.x_GLF_uniform_int_values[14];
+  let x_94 : i32 = x_6.x_GLF_uniform_int_values[11];
+  let x_96 : i32 = x_6.x_GLF_uniform_int_values[18];
+  let x_98 : i32 = x_6.x_GLF_uniform_int_values[19];
+  arr1 = array<i32, 10>(x_80, x_82, x_84, x_86, x_88, x_90, x_92, x_94, x_96, x_98);
+  let x_101 : i32 = x_6.x_GLF_uniform_int_values[8];
+  a = x_101;
+  loop {
+    let x_106 : i32 = a;
+    let x_108 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_106 < x_108)) {
+    } else {
+      break;
+    }
+    let x_112 : i32 = x_6.x_GLF_uniform_int_values[3];
+    limiter0 = x_112;
+    loop {
+      let x_117 : i32 = limiter0;
+      let x_119 : i32 = x_6.x_GLF_uniform_int_values[4];
+      if ((x_117 < x_119)) {
+      } else {
+        break;
+      }
+      let x_122 : i32 = limiter0;
+      limiter0 = (x_122 + 1);
+      let x_125 : i32 = x_6.x_GLF_uniform_int_values[2];
+      limiter1 = x_125;
+      let x_127 : i32 = x_6.x_GLF_uniform_int_values[3];
+      b = x_127;
+      loop {
+        let x_132 : i32 = b;
+        let x_134 : i32 = x_6.x_GLF_uniform_int_values[1];
+        if ((x_132 < x_134)) {
+        } else {
+          break;
+        }
+        let x_137 : i32 = limiter1;
+        let x_139 : i32 = x_6.x_GLF_uniform_int_values[5];
+        if ((x_137 > x_139)) {
+          break;
+        }
+        let x_143 : i32 = limiter1;
+        limiter1 = (x_143 + 1);
+        let x_145 : i32 = b;
+        let x_146 : i32 = a;
+        let x_148 : i32 = arr1[x_146];
+        arr0[x_145] = x_148;
+
+        continuing {
+          let x_150 : i32 = b;
+          b = (x_150 + 1);
+        }
+      }
+    }
+    limiter2 = 0;
+    loop {
+      let x_156 : i32 = limiter2;
+      if ((x_156 < 5)) {
+      } else {
+        break;
+      }
+      let x_159 : i32 = limiter2;
+      limiter2 = (x_159 + 1);
+      let x_162 : i32 = arr1[1];
+      arr0[1] = x_162;
+    }
+    loop {
+      limiter3 = 0;
+      d = 0;
+      loop {
+        let x_172 : i32 = d;
+        if ((x_172 < 10)) {
+        } else {
+          break;
+        }
+        let x_175 : i32 = limiter3;
+        if ((x_175 > 4)) {
+          break;
+        }
+        let x_179 : i32 = limiter3;
+        limiter3 = (x_179 + 1);
+        let x_181 : i32 = d;
+        let x_182 : i32 = d;
+        let x_184 : i32 = arr0[x_182];
+        arr1[x_181] = x_184;
+
+        continuing {
+          let x_186 : i32 = d;
+          d = (x_186 + 1);
+        }
+      }
+
+      continuing {
+        let x_189 : i32 = x_6.x_GLF_uniform_int_values[2];
+        let x_191 : i32 = x_6.x_GLF_uniform_int_values[3];
+        if ((x_189 == x_191)) {
+        } else {
+          break;
+        }
+      }
+    }
+
+    continuing {
+      let x_193 : i32 = a;
+      a = (x_193 + 1);
+    }
+  }
+  let x_196 : i32 = x_6.x_GLF_uniform_int_values[11];
+  let x_198 : i32 = x_6.x_GLF_uniform_int_values[12];
+  let x_200 : i32 = x_6.x_GLF_uniform_int_values[11];
+  let x_202 : i32 = x_6.x_GLF_uniform_int_values[5];
+  let x_204 : i32 = x_6.x_GLF_uniform_int_values[6];
+  let x_206 : i32 = x_6.x_GLF_uniform_int_values[7];
+  let x_208 : i32 = x_6.x_GLF_uniform_int_values[8];
+  let x_210 : i32 = x_6.x_GLF_uniform_int_values[9];
+  let x_212 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_214 : i32 = x_6.x_GLF_uniform_int_values[10];
+  ref0 = array<i32, 10>(x_196, x_198, x_200, x_202, x_204, x_206, x_208, x_210, x_212, x_214);
+  let x_217 : i32 = x_6.x_GLF_uniform_int_values[11];
+  let x_219 : i32 = x_6.x_GLF_uniform_int_values[12];
+  let x_221 : i32 = x_6.x_GLF_uniform_int_values[11];
+  let x_223 : i32 = x_6.x_GLF_uniform_int_values[5];
+  let x_225 : i32 = x_6.x_GLF_uniform_int_values[6];
+  let x_227 : i32 = x_6.x_GLF_uniform_int_values[13];
+  let x_229 : i32 = x_6.x_GLF_uniform_int_values[14];
+  let x_231 : i32 = x_6.x_GLF_uniform_int_values[11];
+  let x_233 : i32 = x_6.x_GLF_uniform_int_values[18];
+  let x_235 : i32 = x_6.x_GLF_uniform_int_values[19];
+  ref1 = array<i32, 10>(x_217, x_219, x_221, x_223, x_225, x_227, x_229, x_231, x_233, x_235);
+  let x_238 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_241 : i32 = x_6.x_GLF_uniform_int_values[3];
+  let x_244 : i32 = x_6.x_GLF_uniform_int_values[3];
+  let x_247 : i32 = x_6.x_GLF_uniform_int_values[2];
+  x_GLF_color = vec4<f32>(f32(x_238), f32(x_241), f32(x_244), f32(x_247));
+  let x_251 : i32 = x_6.x_GLF_uniform_int_values[3];
+  i = x_251;
+  loop {
+    var x_277 : bool;
+    var x_278_phi : bool;
+    let x_256 : i32 = i;
+    let x_258 : i32 = x_6.x_GLF_uniform_int_values[1];
+    if ((x_256 < x_258)) {
+    } else {
+      break;
+    }
+    let x_261 : i32 = i;
+    let x_263 : i32 = arr0[x_261];
+    let x_264 : i32 = i;
+    let x_266 : i32 = ref0[x_264];
+    let x_267 : bool = (x_263 != x_266);
+    x_278_phi = x_267;
+    if (!(x_267)) {
+      let x_271 : i32 = i;
+      let x_273 : i32 = arr1[x_271];
+      let x_274 : i32 = i;
+      let x_276 : i32 = ref1[x_274];
+      x_277 = (x_273 != x_276);
+      x_278_phi = x_277;
+    }
+    let x_278 : bool = x_278_phi;
+    if (x_278) {
+      let x_282 : i32 = x_6.x_GLF_uniform_int_values[3];
+      let x_283 : f32 = f32(x_282);
+      x_GLF_color = vec4<f32>(x_283, x_283, x_283, x_283);
+    }
+
+    continuing {
+      let x_285 : i32 = i;
+      i = (x_285 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-array-copies-loops-with-limiters/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-array-copies-loops-with-limiters/0-opt.wgsl
new file mode 100644
index 0000000..60a0604
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-array-copies-loops-with-limiters/0-opt.wgsl
@@ -0,0 +1,232 @@
+type Arr = [[stride(16)]] array<i32, 20>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[block]]
+struct buf1 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_19 : buf1;
+
+fn main_1() {
+  var arr0 : array<i32, 10>;
+  var arr1 : array<i32, 10>;
+  var a : i32;
+  var limiter0 : i32;
+  var limiter1 : i32;
+  var b : i32;
+  var limiter2 : i32;
+  var limiter3 : i32;
+  var d : i32;
+  var ref0 : array<i32, 10>;
+  var ref1 : array<i32, 10>;
+  var i : i32;
+  let x_59 : i32 = x_6.x_GLF_uniform_int_values[3];
+  let x_61 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_63 : i32 = x_6.x_GLF_uniform_int_values[4];
+  let x_65 : i32 = x_6.x_GLF_uniform_int_values[5];
+  let x_67 : i32 = x_6.x_GLF_uniform_int_values[6];
+  let x_69 : i32 = x_6.x_GLF_uniform_int_values[7];
+  let x_71 : i32 = x_6.x_GLF_uniform_int_values[8];
+  let x_73 : i32 = x_6.x_GLF_uniform_int_values[9];
+  let x_75 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_77 : i32 = x_6.x_GLF_uniform_int_values[10];
+  arr0 = array<i32, 10>(x_59, x_61, x_63, x_65, x_67, x_69, x_71, x_73, x_75, x_77);
+  let x_80 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_82 : i32 = x_6.x_GLF_uniform_int_values[12];
+  let x_84 : i32 = x_6.x_GLF_uniform_int_values[15];
+  let x_86 : i32 = x_6.x_GLF_uniform_int_values[16];
+  let x_88 : i32 = x_6.x_GLF_uniform_int_values[17];
+  let x_90 : i32 = x_6.x_GLF_uniform_int_values[13];
+  let x_92 : i32 = x_6.x_GLF_uniform_int_values[14];
+  let x_94 : i32 = x_6.x_GLF_uniform_int_values[11];
+  let x_96 : i32 = x_6.x_GLF_uniform_int_values[18];
+  let x_98 : i32 = x_6.x_GLF_uniform_int_values[19];
+  arr1 = array<i32, 10>(x_80, x_82, x_84, x_86, x_88, x_90, x_92, x_94, x_96, x_98);
+  let x_101 : i32 = x_6.x_GLF_uniform_int_values[8];
+  a = x_101;
+  loop {
+    let x_106 : i32 = a;
+    let x_108 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_106 < x_108)) {
+    } else {
+      break;
+    }
+    let x_112 : i32 = x_6.x_GLF_uniform_int_values[3];
+    limiter0 = x_112;
+    loop {
+      let x_117 : i32 = limiter0;
+      let x_119 : i32 = x_6.x_GLF_uniform_int_values[4];
+      if ((x_117 < x_119)) {
+      } else {
+        break;
+      }
+      let x_122 : i32 = limiter0;
+      limiter0 = (x_122 + 1);
+      let x_125 : i32 = x_6.x_GLF_uniform_int_values[2];
+      limiter1 = x_125;
+      let x_127 : i32 = x_6.x_GLF_uniform_int_values[3];
+      b = x_127;
+      loop {
+        let x_132 : i32 = b;
+        let x_134 : i32 = x_6.x_GLF_uniform_int_values[1];
+        if ((x_132 < x_134)) {
+        } else {
+          break;
+        }
+        let x_137 : i32 = limiter1;
+        let x_139 : i32 = x_6.x_GLF_uniform_int_values[5];
+        if ((x_137 > x_139)) {
+          break;
+        }
+        let x_143 : i32 = limiter1;
+        limiter1 = (x_143 + 1);
+        let x_145 : i32 = b;
+        let x_146 : i32 = a;
+        let x_148 : i32 = arr1[x_146];
+        arr0[x_145] = x_148;
+
+        continuing {
+          let x_150 : i32 = b;
+          b = (x_150 + 1);
+        }
+      }
+    }
+    limiter2 = 0;
+    loop {
+      let x_156 : i32 = limiter2;
+      if ((x_156 < 5)) {
+      } else {
+        break;
+      }
+      let x_159 : i32 = limiter2;
+      limiter2 = (x_159 + 1);
+      let x_162 : i32 = arr1[1];
+      arr0[1] = x_162;
+    }
+    loop {
+      limiter3 = 0;
+      d = 0;
+      loop {
+        let x_172 : i32 = d;
+        if ((x_172 < 10)) {
+        } else {
+          break;
+        }
+        let x_175 : i32 = limiter3;
+        if ((x_175 > 4)) {
+          break;
+        }
+        let x_179 : i32 = limiter3;
+        limiter3 = (x_179 + 1);
+        let x_181 : i32 = d;
+        let x_182 : i32 = d;
+        let x_184 : i32 = arr0[x_182];
+        arr1[x_181] = x_184;
+
+        continuing {
+          let x_186 : i32 = d;
+          d = (x_186 + 1);
+        }
+      }
+
+      continuing {
+        let x_189 : i32 = x_6.x_GLF_uniform_int_values[2];
+        let x_191 : i32 = x_6.x_GLF_uniform_int_values[3];
+        if ((x_189 == x_191)) {
+        } else {
+          break;
+        }
+      }
+    }
+
+    continuing {
+      let x_193 : i32 = a;
+      a = (x_193 + 1);
+    }
+  }
+  let x_196 : i32 = x_6.x_GLF_uniform_int_values[11];
+  let x_198 : i32 = x_6.x_GLF_uniform_int_values[12];
+  let x_200 : i32 = x_6.x_GLF_uniform_int_values[11];
+  let x_202 : i32 = x_6.x_GLF_uniform_int_values[5];
+  let x_204 : i32 = x_6.x_GLF_uniform_int_values[6];
+  let x_206 : i32 = x_6.x_GLF_uniform_int_values[7];
+  let x_208 : i32 = x_6.x_GLF_uniform_int_values[8];
+  let x_210 : i32 = x_6.x_GLF_uniform_int_values[9];
+  let x_212 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_214 : i32 = x_6.x_GLF_uniform_int_values[10];
+  ref0 = array<i32, 10>(x_196, x_198, x_200, x_202, x_204, x_206, x_208, x_210, x_212, x_214);
+  let x_217 : i32 = x_6.x_GLF_uniform_int_values[11];
+  let x_219 : i32 = x_6.x_GLF_uniform_int_values[12];
+  let x_221 : i32 = x_6.x_GLF_uniform_int_values[11];
+  let x_223 : i32 = x_6.x_GLF_uniform_int_values[5];
+  let x_225 : i32 = x_6.x_GLF_uniform_int_values[6];
+  let x_227 : i32 = x_6.x_GLF_uniform_int_values[13];
+  let x_229 : i32 = x_6.x_GLF_uniform_int_values[14];
+  let x_231 : i32 = x_6.x_GLF_uniform_int_values[11];
+  let x_233 : i32 = x_6.x_GLF_uniform_int_values[18];
+  let x_235 : i32 = x_6.x_GLF_uniform_int_values[19];
+  ref1 = array<i32, 10>(x_217, x_219, x_221, x_223, x_225, x_227, x_229, x_231, x_233, x_235);
+  let x_238 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_241 : i32 = x_6.x_GLF_uniform_int_values[3];
+  let x_244 : i32 = x_6.x_GLF_uniform_int_values[3];
+  let x_247 : i32 = x_6.x_GLF_uniform_int_values[2];
+  x_GLF_color = vec4<f32>(f32(x_238), f32(x_241), f32(x_244), f32(x_247));
+  let x_251 : i32 = x_6.x_GLF_uniform_int_values[3];
+  i = x_251;
+  loop {
+    var x_277 : bool;
+    var x_278_phi : bool;
+    let x_256 : i32 = i;
+    let x_258 : i32 = x_6.x_GLF_uniform_int_values[1];
+    if ((x_256 < x_258)) {
+    } else {
+      break;
+    }
+    let x_261 : i32 = i;
+    let x_263 : i32 = arr0[x_261];
+    let x_264 : i32 = i;
+    let x_266 : i32 = ref0[x_264];
+    let x_267 : bool = (x_263 != x_266);
+    x_278_phi = x_267;
+    if (!(x_267)) {
+      let x_271 : i32 = i;
+      let x_273 : i32 = arr1[x_271];
+      let x_274 : i32 = i;
+      let x_276 : i32 = ref1[x_274];
+      x_277 = (x_273 != x_276);
+      x_278_phi = x_277;
+    }
+    let x_278 : bool = x_278_phi;
+    if (x_278) {
+      let x_282 : i32 = x_6.x_GLF_uniform_int_values[3];
+      let x_283 : f32 = f32(x_282);
+      x_GLF_color = vec4<f32>(x_283, x_283, x_283, x_283);
+    }
+
+    continuing {
+      let x_285 : i32 = i;
+      i = (x_285 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-array-copies-loops-with-limiters/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-array-copies-loops-with-limiters/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..de01a1a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-array-copies-loops-with-limiters/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,204 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[20];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_19 : register(b1, space0) {
+  uint4 x_19[1];
+};
+
+void main_1() {
+  int arr0[10] = (int[10])0;
+  int arr1[10] = (int[10])0;
+  int a = 0;
+  int limiter0 = 0;
+  int limiter1 = 0;
+  int b = 0;
+  int limiter2 = 0;
+  int limiter3 = 0;
+  int d = 0;
+  int ref0[10] = (int[10])0;
+  int ref1[10] = (int[10])0;
+  int i = 0;
+  const int x_59 = asint(x_6[3].x);
+  const int x_61 = asint(x_6[2].x);
+  const int x_63 = asint(x_6[4].x);
+  const int x_65 = asint(x_6[5].x);
+  const int x_67 = asint(x_6[6].x);
+  const int x_69 = asint(x_6[7].x);
+  const int x_71 = asint(x_6[8].x);
+  const int x_73 = asint(x_6[9].x);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_75 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const int x_77 = asint(x_6[10].x);
+  const int tint_symbol_3[10] = {x_59, x_61, x_63, x_65, x_67, x_69, x_71, x_73, x_75, x_77};
+  arr0 = tint_symbol_3;
+  const int x_80 = asint(x_6[1].x);
+  const int x_82 = asint(x_6[12].x);
+  const int x_84 = asint(x_6[15].x);
+  const int x_86 = asint(x_6[16].x);
+  const int x_88 = asint(x_6[17].x);
+  const int x_90 = asint(x_6[13].x);
+  const int x_92 = asint(x_6[14].x);
+  const int x_94 = asint(x_6[11].x);
+  const int x_96 = asint(x_6[18].x);
+  const int x_98 = asint(x_6[19].x);
+  const int tint_symbol_4[10] = {x_80, x_82, x_84, x_86, x_88, x_90, x_92, x_94, x_96, x_98};
+  arr1 = tint_symbol_4;
+  const int x_101 = asint(x_6[8].x);
+  a = x_101;
+  while (true) {
+    const int x_106 = a;
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_108 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    if ((x_106 < x_108)) {
+    } else {
+      break;
+    }
+    const int x_112 = asint(x_6[3].x);
+    limiter0 = x_112;
+    while (true) {
+      const int x_117 = limiter0;
+      const int x_119 = asint(x_6[4].x);
+      if ((x_117 < x_119)) {
+      } else {
+        break;
+      }
+      limiter0 = (limiter0 + 1);
+      const int x_125 = asint(x_6[2].x);
+      limiter1 = x_125;
+      const int x_127 = asint(x_6[3].x);
+      b = x_127;
+      while (true) {
+        const int x_132 = b;
+        const int x_134 = asint(x_6[1].x);
+        if ((x_132 < x_134)) {
+        } else {
+          break;
+        }
+        const int x_137 = limiter1;
+        const int x_139 = asint(x_6[5].x);
+        if ((x_137 > x_139)) {
+          break;
+        }
+        limiter1 = (limiter1 + 1);
+        const int x_145 = b;
+        const int x_148 = arr1[a];
+        arr0[x_145] = x_148;
+        {
+          b = (b + 1);
+        }
+      }
+    }
+    limiter2 = 0;
+    while (true) {
+      if ((limiter2 < 5)) {
+      } else {
+        break;
+      }
+      limiter2 = (limiter2 + 1);
+      const int x_162 = arr1[1];
+      arr0[1] = x_162;
+    }
+    while (true) {
+      limiter3 = 0;
+      d = 0;
+      {
+        for(; (d < 10); d = (d + 1)) {
+          if ((limiter3 > 4)) {
+            break;
+          }
+          limiter3 = (limiter3 + 1);
+          const int x_181 = d;
+          const int x_184 = arr0[d];
+          arr1[x_181] = x_184;
+        }
+      }
+      {
+        const int x_189 = asint(x_6[2].x);
+        const int x_191 = asint(x_6[3].x);
+        if ((x_189 == x_191)) {
+        } else {
+          break;
+        }
+      }
+    }
+    {
+      a = (a + 1);
+    }
+  }
+  const int x_196 = asint(x_6[11].x);
+  const int x_198 = asint(x_6[12].x);
+  const int x_200 = asint(x_6[11].x);
+  const int x_202 = asint(x_6[5].x);
+  const int x_204 = asint(x_6[6].x);
+  const int x_206 = asint(x_6[7].x);
+  const int x_208 = asint(x_6[8].x);
+  const int x_210 = asint(x_6[9].x);
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const int x_212 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  const int x_214 = asint(x_6[10].x);
+  const int tint_symbol_5[10] = {x_196, x_198, x_200, x_202, x_204, x_206, x_208, x_210, x_212, x_214};
+  ref0 = tint_symbol_5;
+  const int x_217 = asint(x_6[11].x);
+  const int x_219 = asint(x_6[12].x);
+  const int x_221 = asint(x_6[11].x);
+  const int x_223 = asint(x_6[5].x);
+  const int x_225 = asint(x_6[6].x);
+  const int x_227 = asint(x_6[13].x);
+  const int x_229 = asint(x_6[14].x);
+  const int x_231 = asint(x_6[11].x);
+  const int x_233 = asint(x_6[18].x);
+  const int x_235 = asint(x_6[19].x);
+  const int tint_symbol_6[10] = {x_217, x_219, x_221, x_223, x_225, x_227, x_229, x_231, x_233, x_235};
+  ref1 = tint_symbol_6;
+  const int x_238 = asint(x_6[2].x);
+  const int x_241 = asint(x_6[3].x);
+  const int x_244 = asint(x_6[3].x);
+  const int x_247 = asint(x_6[2].x);
+  x_GLF_color = float4(float(x_238), float(x_241), float(x_244), float(x_247));
+  const int x_251 = asint(x_6[3].x);
+  i = x_251;
+  while (true) {
+    bool x_277 = false;
+    bool x_278_phi = false;
+    const int x_256 = i;
+    const int x_258 = asint(x_6[1].x);
+    if ((x_256 < x_258)) {
+    } else {
+      break;
+    }
+    const int x_263 = arr0[i];
+    const int x_266 = ref0[i];
+    const bool x_267 = (x_263 != x_266);
+    x_278_phi = x_267;
+    if (!(x_267)) {
+      const int x_273 = arr1[i];
+      const int x_276 = ref1[i];
+      x_277 = (x_273 != x_276);
+      x_278_phi = x_277;
+    }
+    if (x_278_phi) {
+      const int x_282 = asint(x_6[3].x);
+      const float x_283 = float(x_282);
+      x_GLF_color = float4(x_283, x_283, x_283, x_283);
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_7 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_7;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-array-copies-loops-with-limiters/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-array-copies-loops-with-limiters/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..417083d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-array-copies-loops-with-limiters/0-opt.wgsl.expected.msl
@@ -0,0 +1,237 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[20];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct buf1 {
+  /* 0x0000 */ int one;
+};
+struct tint_array_wrapper_1 {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_8) {
+  tint_array_wrapper_1 arr0 = {};
+  tint_array_wrapper_1 arr1 = {};
+  int a = 0;
+  int limiter0 = 0;
+  int limiter1 = 0;
+  int b = 0;
+  int limiter2 = 0;
+  int limiter3 = 0;
+  int d = 0;
+  tint_array_wrapper_1 ref0 = {};
+  tint_array_wrapper_1 ref1 = {};
+  int i = 0;
+  int const x_59 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  int const x_61 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_63 = x_6.x_GLF_uniform_int_values.arr[4].el;
+  int const x_65 = x_6.x_GLF_uniform_int_values.arr[5].el;
+  int const x_67 = x_6.x_GLF_uniform_int_values.arr[6].el;
+  int const x_69 = x_6.x_GLF_uniform_int_values.arr[7].el;
+  int const x_71 = x_6.x_GLF_uniform_int_values.arr[8].el;
+  int const x_73 = x_6.x_GLF_uniform_int_values.arr[9].el;
+  int const x_75 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_77 = x_6.x_GLF_uniform_int_values.arr[10].el;
+  tint_array_wrapper_1 const tint_symbol_3 = {.arr={x_59, x_61, x_63, x_65, x_67, x_69, x_71, x_73, x_75, x_77}};
+  arr0 = tint_symbol_3;
+  int const x_80 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_82 = x_6.x_GLF_uniform_int_values.arr[12].el;
+  int const x_84 = x_6.x_GLF_uniform_int_values.arr[15].el;
+  int const x_86 = x_6.x_GLF_uniform_int_values.arr[16].el;
+  int const x_88 = x_6.x_GLF_uniform_int_values.arr[17].el;
+  int const x_90 = x_6.x_GLF_uniform_int_values.arr[13].el;
+  int const x_92 = x_6.x_GLF_uniform_int_values.arr[14].el;
+  int const x_94 = x_6.x_GLF_uniform_int_values.arr[11].el;
+  int const x_96 = x_6.x_GLF_uniform_int_values.arr[18].el;
+  int const x_98 = x_6.x_GLF_uniform_int_values.arr[19].el;
+  tint_array_wrapper_1 const tint_symbol_4 = {.arr={x_80, x_82, x_84, x_86, x_88, x_90, x_92, x_94, x_96, x_98}};
+  arr1 = tint_symbol_4;
+  int const x_101 = x_6.x_GLF_uniform_int_values.arr[8].el;
+  a = x_101;
+  while (true) {
+    int const x_106 = a;
+    int const x_108 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_106 < x_108)) {
+    } else {
+      break;
+    }
+    int const x_112 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    limiter0 = x_112;
+    while (true) {
+      int const x_117 = limiter0;
+      int const x_119 = x_6.x_GLF_uniform_int_values.arr[4].el;
+      if ((x_117 < x_119)) {
+      } else {
+        break;
+      }
+      int const x_122 = limiter0;
+      limiter0 = (x_122 + 1);
+      int const x_125 = x_6.x_GLF_uniform_int_values.arr[2].el;
+      limiter1 = x_125;
+      int const x_127 = x_6.x_GLF_uniform_int_values.arr[3].el;
+      b = x_127;
+      while (true) {
+        int const x_132 = b;
+        int const x_134 = x_6.x_GLF_uniform_int_values.arr[1].el;
+        if ((x_132 < x_134)) {
+        } else {
+          break;
+        }
+        int const x_137 = limiter1;
+        int const x_139 = x_6.x_GLF_uniform_int_values.arr[5].el;
+        if ((x_137 > x_139)) {
+          break;
+        }
+        int const x_143 = limiter1;
+        limiter1 = (x_143 + 1);
+        int const x_145 = b;
+        int const x_146 = a;
+        int const x_148 = arr1.arr[x_146];
+        arr0.arr[x_145] = x_148;
+        {
+          int const x_150 = b;
+          b = (x_150 + 1);
+        }
+      }
+    }
+    limiter2 = 0;
+    while (true) {
+      int const x_156 = limiter2;
+      if ((x_156 < 5)) {
+      } else {
+        break;
+      }
+      int const x_159 = limiter2;
+      limiter2 = (x_159 + 1);
+      int const x_162 = arr1.arr[1];
+      arr0.arr[1] = x_162;
+    }
+    while (true) {
+      limiter3 = 0;
+      d = 0;
+      while (true) {
+        int const x_172 = d;
+        if ((x_172 < 10)) {
+        } else {
+          break;
+        }
+        int const x_175 = limiter3;
+        if ((x_175 > 4)) {
+          break;
+        }
+        int const x_179 = limiter3;
+        limiter3 = (x_179 + 1);
+        int const x_181 = d;
+        int const x_182 = d;
+        int const x_184 = arr0.arr[x_182];
+        arr1.arr[x_181] = x_184;
+        {
+          int const x_186 = d;
+          d = (x_186 + 1);
+        }
+      }
+      {
+        int const x_189 = x_6.x_GLF_uniform_int_values.arr[2].el;
+        int const x_191 = x_6.x_GLF_uniform_int_values.arr[3].el;
+        if ((x_189 == x_191)) {
+        } else {
+          break;
+        }
+      }
+    }
+    {
+      int const x_193 = a;
+      a = (x_193 + 1);
+    }
+  }
+  int const x_196 = x_6.x_GLF_uniform_int_values.arr[11].el;
+  int const x_198 = x_6.x_GLF_uniform_int_values.arr[12].el;
+  int const x_200 = x_6.x_GLF_uniform_int_values.arr[11].el;
+  int const x_202 = x_6.x_GLF_uniform_int_values.arr[5].el;
+  int const x_204 = x_6.x_GLF_uniform_int_values.arr[6].el;
+  int const x_206 = x_6.x_GLF_uniform_int_values.arr[7].el;
+  int const x_208 = x_6.x_GLF_uniform_int_values.arr[8].el;
+  int const x_210 = x_6.x_GLF_uniform_int_values.arr[9].el;
+  int const x_212 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_214 = x_6.x_GLF_uniform_int_values.arr[10].el;
+  tint_array_wrapper_1 const tint_symbol_5 = {.arr={x_196, x_198, x_200, x_202, x_204, x_206, x_208, x_210, x_212, x_214}};
+  ref0 = tint_symbol_5;
+  int const x_217 = x_6.x_GLF_uniform_int_values.arr[11].el;
+  int const x_219 = x_6.x_GLF_uniform_int_values.arr[12].el;
+  int const x_221 = x_6.x_GLF_uniform_int_values.arr[11].el;
+  int const x_223 = x_6.x_GLF_uniform_int_values.arr[5].el;
+  int const x_225 = x_6.x_GLF_uniform_int_values.arr[6].el;
+  int const x_227 = x_6.x_GLF_uniform_int_values.arr[13].el;
+  int const x_229 = x_6.x_GLF_uniform_int_values.arr[14].el;
+  int const x_231 = x_6.x_GLF_uniform_int_values.arr[11].el;
+  int const x_233 = x_6.x_GLF_uniform_int_values.arr[18].el;
+  int const x_235 = x_6.x_GLF_uniform_int_values.arr[19].el;
+  tint_array_wrapper_1 const tint_symbol_6 = {.arr={x_217, x_219, x_221, x_223, x_225, x_227, x_229, x_231, x_233, x_235}};
+  ref1 = tint_symbol_6;
+  int const x_238 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_241 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  int const x_244 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  int const x_247 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  *(tint_symbol_8) = float4(float(x_238), float(x_241), float(x_244), float(x_247));
+  int const x_251 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  i = x_251;
+  while (true) {
+    bool x_277 = false;
+    bool x_278_phi = false;
+    int const x_256 = i;
+    int const x_258 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    if ((x_256 < x_258)) {
+    } else {
+      break;
+    }
+    int const x_261 = i;
+    int const x_263 = arr0.arr[x_261];
+    int const x_264 = i;
+    int const x_266 = ref0.arr[x_264];
+    bool const x_267 = (x_263 != x_266);
+    x_278_phi = x_267;
+    if (!(x_267)) {
+      int const x_271 = i;
+      int const x_273 = arr1.arr[x_271];
+      int const x_274 = i;
+      int const x_276 = ref1.arr[x_274];
+      x_277 = (x_273 != x_276);
+      x_278_phi = x_277;
+    }
+    bool const x_278 = x_278_phi;
+    if (x_278) {
+      int const x_282 = x_6.x_GLF_uniform_int_values.arr[3].el;
+      float const x_283 = float(x_282);
+      *(tint_symbol_8) = float4(x_283, x_283, x_283, x_283);
+    }
+    {
+      int const x_285 = i;
+      i = (x_285 + 1);
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_9 = 0.0f;
+  main_1(x_6, &(tint_symbol_9));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_1 const tint_symbol_7 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_7;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-array-copies-loops-with-limiters/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-array-copies-loops-with-limiters/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..db432fc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-array-copies-loops-with-limiters/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,489 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 324
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "one"
+               OpName %x_19 "x_19"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %arr0 "arr0"
+               OpName %arr1 "arr1"
+               OpName %a "a"
+               OpName %limiter0 "limiter0"
+               OpName %limiter1 "limiter1"
+               OpName %b "b"
+               OpName %limiter2 "limiter2"
+               OpName %limiter3 "limiter3"
+               OpName %d "d"
+               OpName %ref0 "ref0"
+               OpName %ref1 "ref1"
+               OpName %i "i"
+               OpName %x_277 "x_277"
+               OpName %x_278_phi "x_278_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_20 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_19 NonWritable
+               OpDecorate %x_19 DescriptorSet 0
+               OpDecorate %x_19 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_20 = OpConstant %uint 20
+%_arr_int_uint_20 = OpTypeArray %int %uint_20
+       %buf0 = OpTypeStruct %_arr_int_uint_20
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+       %buf1 = OpTypeStruct %int
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_19 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+         %26 = OpConstantNull %_arr_int_uint_10
+%_ptr_Function_int = OpTypePointer Function %int
+         %30 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_3 = OpConstant %int 3
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+      %int_9 = OpConstant %int 9
+      %int_0 = OpConstant %int 0
+     %int_10 = OpConstant %int 10
+      %int_1 = OpConstant %int 1
+     %int_12 = OpConstant %int 12
+     %int_15 = OpConstant %int 15
+     %int_16 = OpConstant %int 16
+     %int_17 = OpConstant %int 17
+     %int_13 = OpConstant %int 13
+     %int_14 = OpConstant %int 14
+     %int_11 = OpConstant %int 11
+     %int_18 = OpConstant %int 18
+     %int_19 = OpConstant %int 19
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+        %276 = OpConstantNull %bool
+   %main_out = OpTypeStruct %v4float
+        %312 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %18
+         %21 = OpLabel
+       %arr0 = OpVariable %_ptr_Function__arr_int_uint_10 Function %26
+       %arr1 = OpVariable %_ptr_Function__arr_int_uint_10 Function %26
+          %a = OpVariable %_ptr_Function_int Function %30
+   %limiter0 = OpVariable %_ptr_Function_int Function %30
+   %limiter1 = OpVariable %_ptr_Function_int Function %30
+          %b = OpVariable %_ptr_Function_int Function %30
+   %limiter2 = OpVariable %_ptr_Function_int Function %30
+   %limiter3 = OpVariable %_ptr_Function_int Function %30
+          %d = OpVariable %_ptr_Function_int Function %30
+       %ref0 = OpVariable %_ptr_Function__arr_int_uint_10 Function %26
+       %ref1 = OpVariable %_ptr_Function__arr_int_uint_10 Function %26
+          %i = OpVariable %_ptr_Function_int Function %30
+      %x_277 = OpVariable %_ptr_Function_bool Function %276
+  %x_278_phi = OpVariable %_ptr_Function_bool Function %276
+         %43 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %44 = OpLoad %int %43
+         %46 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %47 = OpLoad %int %46
+         %49 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+         %50 = OpLoad %int %49
+         %52 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_5
+         %53 = OpLoad %int %52
+         %55 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_6
+         %56 = OpLoad %int %55
+         %58 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_7
+         %59 = OpLoad %int %58
+         %61 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_8
+         %62 = OpLoad %int %61
+         %64 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_9
+         %65 = OpLoad %int %64
+         %67 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %68 = OpLoad %int %67
+         %70 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_10
+         %71 = OpLoad %int %70
+         %72 = OpCompositeConstruct %_arr_int_uint_10 %44 %47 %50 %53 %56 %59 %62 %65 %68 %71
+               OpStore %arr0 %72
+         %74 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %75 = OpLoad %int %74
+         %77 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_12
+         %78 = OpLoad %int %77
+         %80 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_15
+         %81 = OpLoad %int %80
+         %83 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_16
+         %84 = OpLoad %int %83
+         %86 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_17
+         %87 = OpLoad %int %86
+         %89 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_13
+         %90 = OpLoad %int %89
+         %92 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_14
+         %93 = OpLoad %int %92
+         %95 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_11
+         %96 = OpLoad %int %95
+         %98 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_18
+         %99 = OpLoad %int %98
+        %101 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_19
+        %102 = OpLoad %int %101
+        %103 = OpCompositeConstruct %_arr_int_uint_10 %75 %78 %81 %84 %87 %90 %93 %96 %99 %102
+               OpStore %arr1 %103
+        %104 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_8
+        %105 = OpLoad %int %104
+               OpStore %a %105
+               OpBranch %106
+        %106 = OpLabel
+               OpLoopMerge %107 %108 None
+               OpBranch %109
+        %109 = OpLabel
+        %110 = OpLoad %int %a
+        %111 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %112 = OpLoad %int %111
+        %113 = OpSLessThan %bool %110 %112
+               OpSelectionMerge %115 None
+               OpBranchConditional %113 %116 %117
+        %116 = OpLabel
+               OpBranch %115
+        %117 = OpLabel
+               OpBranch %107
+        %115 = OpLabel
+        %118 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+        %119 = OpLoad %int %118
+               OpStore %limiter0 %119
+               OpBranch %120
+        %120 = OpLabel
+               OpLoopMerge %121 %122 None
+               OpBranch %123
+        %123 = OpLabel
+        %124 = OpLoad %int %limiter0
+        %125 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+        %126 = OpLoad %int %125
+        %127 = OpSLessThan %bool %124 %126
+               OpSelectionMerge %128 None
+               OpBranchConditional %127 %129 %130
+        %129 = OpLabel
+               OpBranch %128
+        %130 = OpLabel
+               OpBranch %121
+        %128 = OpLabel
+        %131 = OpLoad %int %limiter0
+        %132 = OpIAdd %int %131 %int_1
+               OpStore %limiter0 %132
+        %133 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %134 = OpLoad %int %133
+               OpStore %limiter1 %134
+        %135 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+        %136 = OpLoad %int %135
+               OpStore %b %136
+               OpBranch %137
+        %137 = OpLabel
+               OpLoopMerge %138 %139 None
+               OpBranch %140
+        %140 = OpLabel
+        %141 = OpLoad %int %b
+        %142 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %143 = OpLoad %int %142
+        %144 = OpSLessThan %bool %141 %143
+               OpSelectionMerge %145 None
+               OpBranchConditional %144 %146 %147
+        %146 = OpLabel
+               OpBranch %145
+        %147 = OpLabel
+               OpBranch %138
+        %145 = OpLabel
+        %148 = OpLoad %int %limiter1
+        %149 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_5
+        %150 = OpLoad %int %149
+        %151 = OpSGreaterThan %bool %148 %150
+               OpSelectionMerge %152 None
+               OpBranchConditional %151 %153 %152
+        %153 = OpLabel
+               OpBranch %138
+        %152 = OpLabel
+        %154 = OpLoad %int %limiter1
+        %155 = OpIAdd %int %154 %int_1
+               OpStore %limiter1 %155
+        %156 = OpLoad %int %b
+        %157 = OpLoad %int %a
+        %158 = OpAccessChain %_ptr_Function_int %arr1 %157
+        %159 = OpLoad %int %158
+        %160 = OpAccessChain %_ptr_Function_int %arr0 %156
+               OpStore %160 %159
+               OpBranch %139
+        %139 = OpLabel
+        %161 = OpLoad %int %b
+        %162 = OpIAdd %int %161 %int_1
+               OpStore %b %162
+               OpBranch %137
+        %138 = OpLabel
+               OpBranch %122
+        %122 = OpLabel
+               OpBranch %120
+        %121 = OpLabel
+               OpStore %limiter2 %int_0
+               OpBranch %163
+        %163 = OpLabel
+               OpLoopMerge %164 %165 None
+               OpBranch %166
+        %166 = OpLabel
+        %167 = OpLoad %int %limiter2
+        %168 = OpSLessThan %bool %167 %int_5
+               OpSelectionMerge %169 None
+               OpBranchConditional %168 %170 %171
+        %170 = OpLabel
+               OpBranch %169
+        %171 = OpLabel
+               OpBranch %164
+        %169 = OpLabel
+        %172 = OpLoad %int %limiter2
+        %173 = OpIAdd %int %172 %int_1
+               OpStore %limiter2 %173
+        %174 = OpAccessChain %_ptr_Function_int %arr1 %int_1
+        %175 = OpLoad %int %174
+        %176 = OpAccessChain %_ptr_Function_int %arr0 %int_1
+               OpStore %176 %175
+               OpBranch %165
+        %165 = OpLabel
+               OpBranch %163
+        %164 = OpLabel
+               OpBranch %177
+        %177 = OpLabel
+               OpLoopMerge %178 %179 None
+               OpBranch %180
+        %180 = OpLabel
+               OpStore %limiter3 %int_0
+               OpStore %d %int_0
+               OpBranch %181
+        %181 = OpLabel
+               OpLoopMerge %182 %183 None
+               OpBranch %184
+        %184 = OpLabel
+        %185 = OpLoad %int %d
+        %186 = OpSLessThan %bool %185 %int_10
+               OpSelectionMerge %187 None
+               OpBranchConditional %186 %188 %189
+        %188 = OpLabel
+               OpBranch %187
+        %189 = OpLabel
+               OpBranch %182
+        %187 = OpLabel
+        %190 = OpLoad %int %limiter3
+        %191 = OpSGreaterThan %bool %190 %int_4
+               OpSelectionMerge %192 None
+               OpBranchConditional %191 %193 %192
+        %193 = OpLabel
+               OpBranch %182
+        %192 = OpLabel
+        %194 = OpLoad %int %limiter3
+        %195 = OpIAdd %int %194 %int_1
+               OpStore %limiter3 %195
+        %196 = OpLoad %int %d
+        %197 = OpLoad %int %d
+        %198 = OpAccessChain %_ptr_Function_int %arr0 %197
+        %199 = OpLoad %int %198
+        %200 = OpAccessChain %_ptr_Function_int %arr1 %196
+               OpStore %200 %199
+               OpBranch %183
+        %183 = OpLabel
+        %201 = OpLoad %int %d
+        %202 = OpIAdd %int %201 %int_1
+               OpStore %d %202
+               OpBranch %181
+        %182 = OpLabel
+               OpBranch %179
+        %179 = OpLabel
+        %203 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %204 = OpLoad %int %203
+        %205 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+        %206 = OpLoad %int %205
+        %207 = OpIEqual %bool %204 %206
+               OpSelectionMerge %208 None
+               OpBranchConditional %207 %209 %210
+        %209 = OpLabel
+               OpBranch %208
+        %210 = OpLabel
+               OpBranch %178
+        %208 = OpLabel
+               OpBranch %177
+        %178 = OpLabel
+               OpBranch %108
+        %108 = OpLabel
+        %211 = OpLoad %int %a
+        %212 = OpIAdd %int %211 %int_1
+               OpStore %a %212
+               OpBranch %106
+        %107 = OpLabel
+        %213 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_11
+        %214 = OpLoad %int %213
+        %215 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_12
+        %216 = OpLoad %int %215
+        %217 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_11
+        %218 = OpLoad %int %217
+        %219 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_5
+        %220 = OpLoad %int %219
+        %221 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_6
+        %222 = OpLoad %int %221
+        %223 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_7
+        %224 = OpLoad %int %223
+        %225 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_8
+        %226 = OpLoad %int %225
+        %227 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_9
+        %228 = OpLoad %int %227
+        %229 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %230 = OpLoad %int %229
+        %231 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_10
+        %232 = OpLoad %int %231
+        %233 = OpCompositeConstruct %_arr_int_uint_10 %214 %216 %218 %220 %222 %224 %226 %228 %230 %232
+               OpStore %ref0 %233
+        %234 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_11
+        %235 = OpLoad %int %234
+        %236 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_12
+        %237 = OpLoad %int %236
+        %238 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_11
+        %239 = OpLoad %int %238
+        %240 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_5
+        %241 = OpLoad %int %240
+        %242 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_6
+        %243 = OpLoad %int %242
+        %244 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_13
+        %245 = OpLoad %int %244
+        %246 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_14
+        %247 = OpLoad %int %246
+        %248 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_11
+        %249 = OpLoad %int %248
+        %250 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_18
+        %251 = OpLoad %int %250
+        %252 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_19
+        %253 = OpLoad %int %252
+        %254 = OpCompositeConstruct %_arr_int_uint_10 %235 %237 %239 %241 %243 %245 %247 %249 %251 %253
+               OpStore %ref1 %254
+        %255 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %256 = OpLoad %int %255
+        %257 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+        %258 = OpLoad %int %257
+        %259 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+        %260 = OpLoad %int %259
+        %261 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %262 = OpLoad %int %261
+        %263 = OpConvertSToF %float %256
+        %264 = OpConvertSToF %float %258
+        %265 = OpConvertSToF %float %260
+        %266 = OpConvertSToF %float %262
+        %267 = OpCompositeConstruct %v4float %263 %264 %265 %266
+               OpStore %x_GLF_color %267
+        %268 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+        %269 = OpLoad %int %268
+               OpStore %i %269
+               OpBranch %270
+        %270 = OpLabel
+               OpLoopMerge %271 %272 None
+               OpBranch %273
+        %273 = OpLabel
+        %278 = OpLoad %int %i
+        %279 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %280 = OpLoad %int %279
+        %281 = OpSLessThan %bool %278 %280
+               OpSelectionMerge %282 None
+               OpBranchConditional %281 %283 %284
+        %283 = OpLabel
+               OpBranch %282
+        %284 = OpLabel
+               OpBranch %271
+        %282 = OpLabel
+        %285 = OpLoad %int %i
+        %286 = OpAccessChain %_ptr_Function_int %arr0 %285
+        %287 = OpLoad %int %286
+        %288 = OpLoad %int %i
+        %289 = OpAccessChain %_ptr_Function_int %ref0 %288
+        %290 = OpLoad %int %289
+        %291 = OpINotEqual %bool %287 %290
+               OpStore %x_278_phi %291
+        %292 = OpLogicalNot %bool %291
+               OpSelectionMerge %293 None
+               OpBranchConditional %292 %294 %293
+        %294 = OpLabel
+        %295 = OpLoad %int %i
+        %296 = OpAccessChain %_ptr_Function_int %arr1 %295
+        %297 = OpLoad %int %296
+        %298 = OpLoad %int %i
+        %299 = OpAccessChain %_ptr_Function_int %ref1 %298
+        %300 = OpLoad %int %299
+        %301 = OpINotEqual %bool %297 %300
+               OpStore %x_277 %301
+        %302 = OpLoad %bool %x_277
+               OpStore %x_278_phi %302
+               OpBranch %293
+        %293 = OpLabel
+        %303 = OpLoad %bool %x_278_phi
+               OpSelectionMerge %304 None
+               OpBranchConditional %303 %305 %304
+        %305 = OpLabel
+        %306 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+        %307 = OpLoad %int %306
+        %308 = OpConvertSToF %float %307
+        %309 = OpCompositeConstruct %v4float %308 %308 %308 %308
+               OpStore %x_GLF_color %309
+               OpBranch %304
+        %304 = OpLabel
+               OpBranch %272
+        %272 = OpLabel
+        %310 = OpLoad %int %i
+        %311 = OpIAdd %int %310 %int_1
+               OpStore %i %311
+               OpBranch %270
+        %271 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %312
+%tint_symbol = OpFunctionParameter %main_out
+        %316 = OpLabel
+        %317 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %317
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %18
+        %319 = OpLabel
+        %320 = OpFunctionCall %void %main_1
+        %322 = OpLoad %v4float %x_GLF_color
+        %323 = OpCompositeConstruct %main_out %322
+        %321 = OpFunctionCall %void %tint_symbol_2 %323
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 179[%179] is not post dominated by the back-edge block 208[%208]
+  %208 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-array-copies-loops-with-limiters/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-array-copies-loops-with-limiters/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..60a0604
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-array-copies-loops-with-limiters/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,232 @@
+type Arr = [[stride(16)]] array<i32, 20>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[block]]
+struct buf1 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_19 : buf1;
+
+fn main_1() {
+  var arr0 : array<i32, 10>;
+  var arr1 : array<i32, 10>;
+  var a : i32;
+  var limiter0 : i32;
+  var limiter1 : i32;
+  var b : i32;
+  var limiter2 : i32;
+  var limiter3 : i32;
+  var d : i32;
+  var ref0 : array<i32, 10>;
+  var ref1 : array<i32, 10>;
+  var i : i32;
+  let x_59 : i32 = x_6.x_GLF_uniform_int_values[3];
+  let x_61 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_63 : i32 = x_6.x_GLF_uniform_int_values[4];
+  let x_65 : i32 = x_6.x_GLF_uniform_int_values[5];
+  let x_67 : i32 = x_6.x_GLF_uniform_int_values[6];
+  let x_69 : i32 = x_6.x_GLF_uniform_int_values[7];
+  let x_71 : i32 = x_6.x_GLF_uniform_int_values[8];
+  let x_73 : i32 = x_6.x_GLF_uniform_int_values[9];
+  let x_75 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_77 : i32 = x_6.x_GLF_uniform_int_values[10];
+  arr0 = array<i32, 10>(x_59, x_61, x_63, x_65, x_67, x_69, x_71, x_73, x_75, x_77);
+  let x_80 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_82 : i32 = x_6.x_GLF_uniform_int_values[12];
+  let x_84 : i32 = x_6.x_GLF_uniform_int_values[15];
+  let x_86 : i32 = x_6.x_GLF_uniform_int_values[16];
+  let x_88 : i32 = x_6.x_GLF_uniform_int_values[17];
+  let x_90 : i32 = x_6.x_GLF_uniform_int_values[13];
+  let x_92 : i32 = x_6.x_GLF_uniform_int_values[14];
+  let x_94 : i32 = x_6.x_GLF_uniform_int_values[11];
+  let x_96 : i32 = x_6.x_GLF_uniform_int_values[18];
+  let x_98 : i32 = x_6.x_GLF_uniform_int_values[19];
+  arr1 = array<i32, 10>(x_80, x_82, x_84, x_86, x_88, x_90, x_92, x_94, x_96, x_98);
+  let x_101 : i32 = x_6.x_GLF_uniform_int_values[8];
+  a = x_101;
+  loop {
+    let x_106 : i32 = a;
+    let x_108 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_106 < x_108)) {
+    } else {
+      break;
+    }
+    let x_112 : i32 = x_6.x_GLF_uniform_int_values[3];
+    limiter0 = x_112;
+    loop {
+      let x_117 : i32 = limiter0;
+      let x_119 : i32 = x_6.x_GLF_uniform_int_values[4];
+      if ((x_117 < x_119)) {
+      } else {
+        break;
+      }
+      let x_122 : i32 = limiter0;
+      limiter0 = (x_122 + 1);
+      let x_125 : i32 = x_6.x_GLF_uniform_int_values[2];
+      limiter1 = x_125;
+      let x_127 : i32 = x_6.x_GLF_uniform_int_values[3];
+      b = x_127;
+      loop {
+        let x_132 : i32 = b;
+        let x_134 : i32 = x_6.x_GLF_uniform_int_values[1];
+        if ((x_132 < x_134)) {
+        } else {
+          break;
+        }
+        let x_137 : i32 = limiter1;
+        let x_139 : i32 = x_6.x_GLF_uniform_int_values[5];
+        if ((x_137 > x_139)) {
+          break;
+        }
+        let x_143 : i32 = limiter1;
+        limiter1 = (x_143 + 1);
+        let x_145 : i32 = b;
+        let x_146 : i32 = a;
+        let x_148 : i32 = arr1[x_146];
+        arr0[x_145] = x_148;
+
+        continuing {
+          let x_150 : i32 = b;
+          b = (x_150 + 1);
+        }
+      }
+    }
+    limiter2 = 0;
+    loop {
+      let x_156 : i32 = limiter2;
+      if ((x_156 < 5)) {
+      } else {
+        break;
+      }
+      let x_159 : i32 = limiter2;
+      limiter2 = (x_159 + 1);
+      let x_162 : i32 = arr1[1];
+      arr0[1] = x_162;
+    }
+    loop {
+      limiter3 = 0;
+      d = 0;
+      loop {
+        let x_172 : i32 = d;
+        if ((x_172 < 10)) {
+        } else {
+          break;
+        }
+        let x_175 : i32 = limiter3;
+        if ((x_175 > 4)) {
+          break;
+        }
+        let x_179 : i32 = limiter3;
+        limiter3 = (x_179 + 1);
+        let x_181 : i32 = d;
+        let x_182 : i32 = d;
+        let x_184 : i32 = arr0[x_182];
+        arr1[x_181] = x_184;
+
+        continuing {
+          let x_186 : i32 = d;
+          d = (x_186 + 1);
+        }
+      }
+
+      continuing {
+        let x_189 : i32 = x_6.x_GLF_uniform_int_values[2];
+        let x_191 : i32 = x_6.x_GLF_uniform_int_values[3];
+        if ((x_189 == x_191)) {
+        } else {
+          break;
+        }
+      }
+    }
+
+    continuing {
+      let x_193 : i32 = a;
+      a = (x_193 + 1);
+    }
+  }
+  let x_196 : i32 = x_6.x_GLF_uniform_int_values[11];
+  let x_198 : i32 = x_6.x_GLF_uniform_int_values[12];
+  let x_200 : i32 = x_6.x_GLF_uniform_int_values[11];
+  let x_202 : i32 = x_6.x_GLF_uniform_int_values[5];
+  let x_204 : i32 = x_6.x_GLF_uniform_int_values[6];
+  let x_206 : i32 = x_6.x_GLF_uniform_int_values[7];
+  let x_208 : i32 = x_6.x_GLF_uniform_int_values[8];
+  let x_210 : i32 = x_6.x_GLF_uniform_int_values[9];
+  let x_212 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_214 : i32 = x_6.x_GLF_uniform_int_values[10];
+  ref0 = array<i32, 10>(x_196, x_198, x_200, x_202, x_204, x_206, x_208, x_210, x_212, x_214);
+  let x_217 : i32 = x_6.x_GLF_uniform_int_values[11];
+  let x_219 : i32 = x_6.x_GLF_uniform_int_values[12];
+  let x_221 : i32 = x_6.x_GLF_uniform_int_values[11];
+  let x_223 : i32 = x_6.x_GLF_uniform_int_values[5];
+  let x_225 : i32 = x_6.x_GLF_uniform_int_values[6];
+  let x_227 : i32 = x_6.x_GLF_uniform_int_values[13];
+  let x_229 : i32 = x_6.x_GLF_uniform_int_values[14];
+  let x_231 : i32 = x_6.x_GLF_uniform_int_values[11];
+  let x_233 : i32 = x_6.x_GLF_uniform_int_values[18];
+  let x_235 : i32 = x_6.x_GLF_uniform_int_values[19];
+  ref1 = array<i32, 10>(x_217, x_219, x_221, x_223, x_225, x_227, x_229, x_231, x_233, x_235);
+  let x_238 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_241 : i32 = x_6.x_GLF_uniform_int_values[3];
+  let x_244 : i32 = x_6.x_GLF_uniform_int_values[3];
+  let x_247 : i32 = x_6.x_GLF_uniform_int_values[2];
+  x_GLF_color = vec4<f32>(f32(x_238), f32(x_241), f32(x_244), f32(x_247));
+  let x_251 : i32 = x_6.x_GLF_uniform_int_values[3];
+  i = x_251;
+  loop {
+    var x_277 : bool;
+    var x_278_phi : bool;
+    let x_256 : i32 = i;
+    let x_258 : i32 = x_6.x_GLF_uniform_int_values[1];
+    if ((x_256 < x_258)) {
+    } else {
+      break;
+    }
+    let x_261 : i32 = i;
+    let x_263 : i32 = arr0[x_261];
+    let x_264 : i32 = i;
+    let x_266 : i32 = ref0[x_264];
+    let x_267 : bool = (x_263 != x_266);
+    x_278_phi = x_267;
+    if (!(x_267)) {
+      let x_271 : i32 = i;
+      let x_273 : i32 = arr1[x_271];
+      let x_274 : i32 = i;
+      let x_276 : i32 = ref1[x_274];
+      x_277 = (x_273 != x_276);
+      x_278_phi = x_277;
+    }
+    let x_278 : bool = x_278_phi;
+    if (x_278) {
+      let x_282 : i32 = x_6.x_GLF_uniform_int_values[3];
+      let x_283 : f32 = f32(x_282);
+      x_GLF_color = vec4<f32>(x_283, x_283, x_283, x_283);
+    }
+
+    continuing {
+      let x_285 : i32 = i;
+      i = (x_285 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-asin-undefined-smoothstep/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-asin-undefined-smoothstep/0-opt.spvasm
new file mode 100644
index 0000000..c686e93
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-asin-undefined-smoothstep/0-opt.spvasm
@@ -0,0 +1,154 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %v1 "v1"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %v2 "v2"
+               OpName %v3 "v3"
+               OpName %v4 "v4"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_7 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %uint = OpTypeInt 32 0
+     %uint_7 = OpConstant %uint 7
+%_arr_float_uint_7 = OpTypeArray %float %uint_7
+       %buf0 = OpTypeStruct %_arr_float_uint_7
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%float_1_57079637 = OpConstant %float 1.57079637
+%float_1_11976957 = OpConstant %float 1.11976957
+%float_0x1_8p_128 = OpConstant %float 0x1.8p+128
+%float_0_927295208 = OpConstant %float 0.927295208
+         %27 = OpConstantComposite %v4float %float_1_57079637 %float_1_11976957 %float_0x1_8p_128 %float_0_927295208
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %bool = OpTypeBool
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+     %uint_1 = OpConstant %uint 1
+      %int_3 = OpConstant %int 3
+      %int_6 = OpConstant %int 6
+     %uint_3 = OpConstant %uint 3
+      %int_1 = OpConstant %int 1
+       %main = OpFunction %void None %12
+         %39 = OpLabel
+         %v1 = OpVariable %_ptr_Function_v4float Function
+         %v2 = OpVariable %_ptr_Function_v4float Function
+         %v3 = OpVariable %_ptr_Function_v4float Function
+         %v4 = OpVariable %_ptr_Function_v4float Function
+         %40 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %41 = OpLoad %float %40
+         %42 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %43 = OpLoad %float %42
+         %44 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %45 = OpLoad %float %44
+         %46 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %47 = OpLoad %float %46
+         %48 = OpCompositeConstruct %v4float %41 %43 %45 %47
+               OpStore %v1 %48
+               OpStore %v2 %27
+         %49 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %50 = OpLoad %float %49
+         %51 = OpCompositeConstruct %v4float %50 %50 %50 %50
+               OpStore %v3 %51
+         %52 = OpLoad %v4float %v1
+         %53 = OpLoad %v4float %v2
+         %54 = OpLoad %v4float %v3
+         %55 = OpExtInst %v4float %1 SmoothStep %52 %53 %54
+               OpStore %v4 %55
+         %56 = OpLoad %v4float %v4
+         %57 = OpVectorShuffle %v4float %56 %56 0 1 3 0
+               OpStore %_GLF_color %57
+         %58 = OpAccessChain %_ptr_Function_float %v4 %uint_0
+         %59 = OpLoad %float %58
+         %60 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_4
+         %61 = OpLoad %float %60
+         %62 = OpFOrdGreaterThan %bool %59 %61
+               OpSelectionMerge %63 None
+               OpBranchConditional %62 %64 %63
+         %64 = OpLabel
+         %65 = OpAccessChain %_ptr_Function_float %v4 %uint_0
+         %66 = OpLoad %float %65
+         %67 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_5
+         %68 = OpLoad %float %67
+         %69 = OpFOrdLessThan %bool %66 %68
+               OpBranch %63
+         %63 = OpLabel
+         %70 = OpPhi %bool %62 %39 %69 %64
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %71
+         %72 = OpLabel
+         %73 = OpAccessChain %_ptr_Function_float %v4 %uint_1
+         %74 = OpLoad %float %73
+         %75 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_3
+         %76 = OpLoad %float %75
+         %77 = OpFOrdGreaterThan %bool %74 %76
+               OpBranch %71
+         %71 = OpLabel
+         %78 = OpPhi %bool %70 %63 %77 %72
+               OpSelectionMerge %79 None
+               OpBranchConditional %78 %80 %79
+         %80 = OpLabel
+         %81 = OpAccessChain %_ptr_Function_float %v4 %uint_1
+         %82 = OpLoad %float %81
+         %83 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_6
+         %84 = OpLoad %float %83
+         %85 = OpFOrdLessThan %bool %82 %84
+               OpBranch %79
+         %79 = OpLabel
+         %86 = OpPhi %bool %78 %71 %85 %80
+               OpSelectionMerge %87 None
+               OpBranchConditional %86 %88 %87
+         %88 = OpLabel
+         %89 = OpAccessChain %_ptr_Function_float %v4 %uint_3
+         %90 = OpLoad %float %89
+         %91 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %92 = OpLoad %float %91
+         %93 = OpFOrdEqual %bool %90 %92
+               OpBranch %87
+         %87 = OpLabel
+         %94 = OpPhi %bool %86 %79 %93 %88
+               OpSelectionMerge %95 None
+               OpBranchConditional %94 %96 %97
+         %96 = OpLabel
+         %98 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %99 = OpLoad %float %98
+        %100 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+        %101 = OpLoad %float %100
+        %102 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+        %103 = OpLoad %float %102
+        %104 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+        %105 = OpLoad %float %104
+        %106 = OpCompositeConstruct %v4float %99 %101 %103 %105
+               OpStore %_GLF_color %106
+               OpBranch %95
+         %97 = OpLabel
+        %107 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+        %108 = OpLoad %float %107
+        %109 = OpCompositeConstruct %v4float %108 %108 %108 %108
+               OpStore %_GLF_color %109
+               OpBranch %95
+         %95 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-asin-undefined-smoothstep/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-asin-undefined-smoothstep/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..841bebf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-asin-undefined-smoothstep/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,94 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[7];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 v1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 v2 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 v3 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 v4 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  bool x_69 = false;
+  bool x_77 = false;
+  bool x_85 = false;
+  bool x_93 = false;
+  bool x_70_phi = false;
+  bool x_78_phi = false;
+  bool x_86_phi = false;
+  bool x_94_phi = false;
+  const float x_41 = asfloat(x_6[2].x);
+  const float x_43 = asfloat(x_6[2].x);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_45 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const float x_47 = asfloat(x_6[2].x);
+  v1 = float4(x_41, x_43, x_45, x_47);
+  v2 = float4(1.570796371f, 1.119769573f, asfloat(0x7fc00000u), 0.927295208f);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_50 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  v3 = float4(x_50, x_50, x_50, x_50);
+  v4 = smoothstep(v1, v2, v3);
+  const float4 x_56 = v4;
+  x_GLF_color = float4(x_56.x, x_56.y, x_56.w, x_56.x);
+  const float x_59 = v4.x;
+  const float x_61 = asfloat(x_6[4].x);
+  const bool x_62 = (x_59 > x_61);
+  x_70_phi = x_62;
+  if (x_62) {
+    const float x_66 = v4.x;
+    const float x_68 = asfloat(x_6[5].x);
+    x_69 = (x_66 < x_68);
+    x_70_phi = x_69;
+  }
+  const bool x_70 = x_70_phi;
+  x_78_phi = x_70;
+  if (x_70) {
+    const float x_74 = v4.y;
+    const float x_76 = asfloat(x_6[3].x);
+    x_77 = (x_74 > x_76);
+    x_78_phi = x_77;
+  }
+  const bool x_78 = x_78_phi;
+  x_86_phi = x_78;
+  if (x_78) {
+    const float x_82 = v4.y;
+    const float x_84 = asfloat(x_6[6].x);
+    x_85 = (x_82 < x_84);
+    x_86_phi = x_85;
+  }
+  const bool x_86 = x_86_phi;
+  x_94_phi = x_86;
+  if (x_86) {
+    const float x_90 = v4.w;
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const float x_92 = asfloat(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    x_93 = (x_90 == x_92);
+    x_94_phi = x_93;
+  }
+  if (x_94_phi) {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const float x_99 = asfloat(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const float x_101 = asfloat(x_6[1].x);
+    const float x_103 = asfloat(x_6[1].x);
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const float x_105 = asfloat(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    x_GLF_color = float4(x_99, x_101, x_103, x_105);
+  } else {
+    const float x_108 = asfloat(x_6[1].x);
+    x_GLF_color = float4(x_108, x_108, x_108, x_108);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-asin-undefined-smoothstep/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-asin-undefined-smoothstep/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..f541d0e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-asin-undefined-smoothstep/0-opt.spvasm.expected.msl
@@ -0,0 +1,103 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[7];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float4 v1 = 0.0f;
+  float4 v2 = 0.0f;
+  float4 v3 = 0.0f;
+  float4 v4 = 0.0f;
+  bool x_69 = false;
+  bool x_77 = false;
+  bool x_85 = false;
+  bool x_93 = false;
+  bool x_70_phi = false;
+  bool x_78_phi = false;
+  bool x_86_phi = false;
+  bool x_94_phi = false;
+  float const x_41 = x_6.x_GLF_uniform_float_values.arr[2].el;
+  float const x_43 = x_6.x_GLF_uniform_float_values.arr[2].el;
+  float const x_45 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_47 = x_6.x_GLF_uniform_float_values.arr[2].el;
+  v1 = float4(x_41, x_43, x_45, x_47);
+  v2 = float4(1.570796371f, 1.119769573f, NAN, 0.927295208f);
+  float const x_50 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  v3 = float4(x_50, x_50, x_50, x_50);
+  float4 const x_52 = v1;
+  float4 const x_53 = v2;
+  float4 const x_54 = v3;
+  v4 = smoothstep(x_52, x_53, x_54);
+  float4 const x_56 = v4;
+  *(tint_symbol_4) = float4(x_56.x, x_56.y, x_56.w, x_56.x);
+  float const x_59 = v4.x;
+  float const x_61 = x_6.x_GLF_uniform_float_values.arr[4].el;
+  bool const x_62 = (x_59 > x_61);
+  x_70_phi = x_62;
+  if (x_62) {
+    float const x_66 = v4.x;
+    float const x_68 = x_6.x_GLF_uniform_float_values.arr[5].el;
+    x_69 = (x_66 < x_68);
+    x_70_phi = x_69;
+  }
+  bool const x_70 = x_70_phi;
+  x_78_phi = x_70;
+  if (x_70) {
+    float const x_74 = v4.y;
+    float const x_76 = x_6.x_GLF_uniform_float_values.arr[3].el;
+    x_77 = (x_74 > x_76);
+    x_78_phi = x_77;
+  }
+  bool const x_78 = x_78_phi;
+  x_86_phi = x_78;
+  if (x_78) {
+    float const x_82 = v4.y;
+    float const x_84 = x_6.x_GLF_uniform_float_values.arr[6].el;
+    x_85 = (x_82 < x_84);
+    x_86_phi = x_85;
+  }
+  bool const x_86 = x_86_phi;
+  x_94_phi = x_86;
+  if (x_86) {
+    float const x_90 = v4.w;
+    float const x_92 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    x_93 = (x_90 == x_92);
+    x_94_phi = x_93;
+  }
+  bool const x_94 = x_94_phi;
+  if (x_94) {
+    float const x_99 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    float const x_101 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    float const x_103 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    float const x_105 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    *(tint_symbol_4) = float4(x_99, x_101, x_103, x_105);
+  } else {
+    float const x_108 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    *(tint_symbol_4) = float4(x_108, x_108, x_108, x_108);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-asin-undefined-smoothstep/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-asin-undefined-smoothstep/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..f43127a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-asin-undefined-smoothstep/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,224 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 143
+; Schema: 0
+               OpCapability Shader
+         %60 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v1 "v1"
+               OpName %v2 "v2"
+               OpName %v3 "v3"
+               OpName %v4 "v4"
+               OpName %x_69 "x_69"
+               OpName %x_77 "x_77"
+               OpName %x_85 "x_85"
+               OpName %x_93 "x_93"
+               OpName %x_70_phi "x_70_phi"
+               OpName %x_78_phi "x_78_phi"
+               OpName %x_86_phi "x_86_phi"
+               OpName %x_94_phi "x_94_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_7 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_7 = OpConstant %uint 7
+%_arr_float_uint_7 = OpTypeArray %float %uint_7
+       %buf0 = OpTypeStruct %_arr_float_uint_7
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %11 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %11
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %11
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %26 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+        %int = OpTypeInt 32 1
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_0 = OpConstant %int 0
+%float_1_57079637 = OpConstant %float 1.57079637
+%float_1_11976957 = OpConstant %float 1.11976957
+%float_0x1_8p_128 = OpConstant %float 0x1.8p+128
+%float_0_927295208 = OpConstant %float 0.927295208
+         %52 = OpConstantComposite %v4float %float_1_57079637 %float_1_11976957 %float_0x1_8p_128 %float_0_927295208
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+     %uint_1 = OpConstant %uint 1
+      %int_3 = OpConstant %int 3
+      %int_6 = OpConstant %int 6
+     %uint_3 = OpConstant %uint 3
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+        %131 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+         %v1 = OpVariable %_ptr_Function_v4float Function %11
+         %v2 = OpVariable %_ptr_Function_v4float Function %11
+         %v3 = OpVariable %_ptr_Function_v4float Function %11
+         %v4 = OpVariable %_ptr_Function_v4float Function %11
+       %x_69 = OpVariable %_ptr_Function_bool Function %26
+       %x_77 = OpVariable %_ptr_Function_bool Function %26
+       %x_85 = OpVariable %_ptr_Function_bool Function %26
+       %x_93 = OpVariable %_ptr_Function_bool Function %26
+   %x_70_phi = OpVariable %_ptr_Function_bool Function %26
+   %x_78_phi = OpVariable %_ptr_Function_bool Function %26
+   %x_86_phi = OpVariable %_ptr_Function_bool Function %26
+   %x_94_phi = OpVariable %_ptr_Function_bool Function %26
+         %38 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %39 = OpLoad %float %38
+         %40 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %41 = OpLoad %float %40
+         %43 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %44 = OpLoad %float %43
+         %45 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %46 = OpLoad %float %45
+         %47 = OpCompositeConstruct %v4float %39 %41 %44 %46
+               OpStore %v1 %47
+               OpStore %v2 %52
+         %53 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %54 = OpLoad %float %53
+         %55 = OpCompositeConstruct %v4float %54 %54 %54 %54
+               OpStore %v3 %55
+         %56 = OpLoad %v4float %v1
+         %57 = OpLoad %v4float %v2
+         %58 = OpLoad %v4float %v3
+         %59 = OpExtInst %v4float %60 SmoothStep %56 %57 %58
+               OpStore %v4 %59
+         %61 = OpLoad %v4float %v4
+         %62 = OpCompositeExtract %float %61 0
+         %63 = OpCompositeExtract %float %61 1
+         %64 = OpCompositeExtract %float %61 3
+         %65 = OpCompositeExtract %float %61 0
+         %66 = OpCompositeConstruct %v4float %62 %63 %64 %65
+               OpStore %x_GLF_color %66
+         %68 = OpAccessChain %_ptr_Function_float %v4 %uint_0
+         %69 = OpLoad %float %68
+         %71 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_4
+         %72 = OpLoad %float %71
+         %73 = OpFOrdGreaterThan %bool %69 %72
+               OpStore %x_70_phi %73
+               OpSelectionMerge %74 None
+               OpBranchConditional %73 %75 %74
+         %75 = OpLabel
+         %76 = OpAccessChain %_ptr_Function_float %v4 %uint_0
+         %77 = OpLoad %float %76
+         %79 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_5
+         %80 = OpLoad %float %79
+         %81 = OpFOrdLessThan %bool %77 %80
+               OpStore %x_69 %81
+         %82 = OpLoad %bool %x_69
+               OpStore %x_70_phi %82
+               OpBranch %74
+         %74 = OpLabel
+         %83 = OpLoad %bool %x_70_phi
+               OpStore %x_78_phi %83
+               OpSelectionMerge %84 None
+               OpBranchConditional %83 %85 %84
+         %85 = OpLabel
+         %87 = OpAccessChain %_ptr_Function_float %v4 %uint_1
+         %88 = OpLoad %float %87
+         %90 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+         %91 = OpLoad %float %90
+         %92 = OpFOrdGreaterThan %bool %88 %91
+               OpStore %x_77 %92
+         %93 = OpLoad %bool %x_77
+               OpStore %x_78_phi %93
+               OpBranch %84
+         %84 = OpLabel
+         %94 = OpLoad %bool %x_78_phi
+               OpStore %x_86_phi %94
+               OpSelectionMerge %95 None
+               OpBranchConditional %94 %96 %95
+         %96 = OpLabel
+         %97 = OpAccessChain %_ptr_Function_float %v4 %uint_1
+         %98 = OpLoad %float %97
+        %100 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_6
+        %101 = OpLoad %float %100
+        %102 = OpFOrdLessThan %bool %98 %101
+               OpStore %x_85 %102
+        %103 = OpLoad %bool %x_85
+               OpStore %x_86_phi %103
+               OpBranch %95
+         %95 = OpLabel
+        %104 = OpLoad %bool %x_86_phi
+               OpStore %x_94_phi %104
+               OpSelectionMerge %105 None
+               OpBranchConditional %104 %106 %105
+        %106 = OpLabel
+        %108 = OpAccessChain %_ptr_Function_float %v4 %uint_3
+        %109 = OpLoad %float %108
+        %110 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+        %111 = OpLoad %float %110
+        %112 = OpFOrdEqual %bool %109 %111
+               OpStore %x_93 %112
+        %113 = OpLoad %bool %x_93
+               OpStore %x_94_phi %113
+               OpBranch %105
+        %105 = OpLabel
+        %114 = OpLoad %bool %x_94_phi
+               OpSelectionMerge %115 None
+               OpBranchConditional %114 %116 %117
+        %116 = OpLabel
+        %118 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+        %119 = OpLoad %float %118
+        %121 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+        %122 = OpLoad %float %121
+        %123 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+        %124 = OpLoad %float %123
+        %125 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+        %126 = OpLoad %float %125
+        %127 = OpCompositeConstruct %v4float %119 %122 %124 %126
+               OpStore %x_GLF_color %127
+               OpBranch %115
+        %117 = OpLabel
+        %128 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+        %129 = OpLoad %float %128
+        %130 = OpCompositeConstruct %v4float %129 %129 %129 %129
+               OpStore %x_GLF_color %130
+               OpBranch %115
+        %115 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %131
+%tint_symbol = OpFunctionParameter %main_out
+        %135 = OpLabel
+        %136 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %136
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+        %138 = OpLabel
+        %139 = OpFunctionCall %void %main_1
+        %141 = OpLoad %v4float %x_GLF_color
+        %142 = OpCompositeConstruct %main_out %141
+        %140 = OpFunctionCall %void %tint_symbol_2 %142
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-asin-undefined-smoothstep/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-asin-undefined-smoothstep/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..32f966d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-asin-undefined-smoothstep/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,96 @@
+type Arr = [[stride(16)]] array<f32, 7>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v1 : vec4<f32>;
+  var v2 : vec4<f32>;
+  var v3 : vec4<f32>;
+  var v4 : vec4<f32>;
+  var x_69 : bool;
+  var x_77 : bool;
+  var x_85 : bool;
+  var x_93 : bool;
+  var x_70_phi : bool;
+  var x_78_phi : bool;
+  var x_86_phi : bool;
+  var x_94_phi : bool;
+  let x_41 : f32 = x_6.x_GLF_uniform_float_values[2];
+  let x_43 : f32 = x_6.x_GLF_uniform_float_values[2];
+  let x_45 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_47 : f32 = x_6.x_GLF_uniform_float_values[2];
+  v1 = vec4<f32>(x_41, x_43, x_45, x_47);
+  v2 = vec4<f32>(1.570796371, 1.119769573, 0x1.8p+128, 0.927295208);
+  let x_50 : f32 = x_6.x_GLF_uniform_float_values[0];
+  v3 = vec4<f32>(x_50, x_50, x_50, x_50);
+  let x_52 : vec4<f32> = v1;
+  let x_53 : vec4<f32> = v2;
+  let x_54 : vec4<f32> = v3;
+  v4 = smoothStep(x_52, x_53, x_54);
+  let x_56 : vec4<f32> = v4;
+  x_GLF_color = vec4<f32>(x_56.x, x_56.y, x_56.w, x_56.x);
+  let x_59 : f32 = v4.x;
+  let x_61 : f32 = x_6.x_GLF_uniform_float_values[4];
+  let x_62 : bool = (x_59 > x_61);
+  x_70_phi = x_62;
+  if (x_62) {
+    let x_66 : f32 = v4.x;
+    let x_68 : f32 = x_6.x_GLF_uniform_float_values[5];
+    x_69 = (x_66 < x_68);
+    x_70_phi = x_69;
+  }
+  let x_70 : bool = x_70_phi;
+  x_78_phi = x_70;
+  if (x_70) {
+    let x_74 : f32 = v4.y;
+    let x_76 : f32 = x_6.x_GLF_uniform_float_values[3];
+    x_77 = (x_74 > x_76);
+    x_78_phi = x_77;
+  }
+  let x_78 : bool = x_78_phi;
+  x_86_phi = x_78;
+  if (x_78) {
+    let x_82 : f32 = v4.y;
+    let x_84 : f32 = x_6.x_GLF_uniform_float_values[6];
+    x_85 = (x_82 < x_84);
+    x_86_phi = x_85;
+  }
+  let x_86 : bool = x_86_phi;
+  x_94_phi = x_86;
+  if (x_86) {
+    let x_90 : f32 = v4.w;
+    let x_92 : f32 = x_6.x_GLF_uniform_float_values[0];
+    x_93 = (x_90 == x_92);
+    x_94_phi = x_93;
+  }
+  let x_94 : bool = x_94_phi;
+  if (x_94) {
+    let x_99 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_101 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_103 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_105 : f32 = x_6.x_GLF_uniform_float_values[0];
+    x_GLF_color = vec4<f32>(x_99, x_101, x_103, x_105);
+  } else {
+    let x_108 : f32 = x_6.x_GLF_uniform_float_values[1];
+    x_GLF_color = vec4<f32>(x_108, x_108, x_108, x_108);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-asin-undefined-smoothstep/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-asin-undefined-smoothstep/0-opt.wgsl
new file mode 100644
index 0000000..32f966d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-asin-undefined-smoothstep/0-opt.wgsl
@@ -0,0 +1,96 @@
+type Arr = [[stride(16)]] array<f32, 7>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v1 : vec4<f32>;
+  var v2 : vec4<f32>;
+  var v3 : vec4<f32>;
+  var v4 : vec4<f32>;
+  var x_69 : bool;
+  var x_77 : bool;
+  var x_85 : bool;
+  var x_93 : bool;
+  var x_70_phi : bool;
+  var x_78_phi : bool;
+  var x_86_phi : bool;
+  var x_94_phi : bool;
+  let x_41 : f32 = x_6.x_GLF_uniform_float_values[2];
+  let x_43 : f32 = x_6.x_GLF_uniform_float_values[2];
+  let x_45 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_47 : f32 = x_6.x_GLF_uniform_float_values[2];
+  v1 = vec4<f32>(x_41, x_43, x_45, x_47);
+  v2 = vec4<f32>(1.570796371, 1.119769573, 0x1.8p+128, 0.927295208);
+  let x_50 : f32 = x_6.x_GLF_uniform_float_values[0];
+  v3 = vec4<f32>(x_50, x_50, x_50, x_50);
+  let x_52 : vec4<f32> = v1;
+  let x_53 : vec4<f32> = v2;
+  let x_54 : vec4<f32> = v3;
+  v4 = smoothStep(x_52, x_53, x_54);
+  let x_56 : vec4<f32> = v4;
+  x_GLF_color = vec4<f32>(x_56.x, x_56.y, x_56.w, x_56.x);
+  let x_59 : f32 = v4.x;
+  let x_61 : f32 = x_6.x_GLF_uniform_float_values[4];
+  let x_62 : bool = (x_59 > x_61);
+  x_70_phi = x_62;
+  if (x_62) {
+    let x_66 : f32 = v4.x;
+    let x_68 : f32 = x_6.x_GLF_uniform_float_values[5];
+    x_69 = (x_66 < x_68);
+    x_70_phi = x_69;
+  }
+  let x_70 : bool = x_70_phi;
+  x_78_phi = x_70;
+  if (x_70) {
+    let x_74 : f32 = v4.y;
+    let x_76 : f32 = x_6.x_GLF_uniform_float_values[3];
+    x_77 = (x_74 > x_76);
+    x_78_phi = x_77;
+  }
+  let x_78 : bool = x_78_phi;
+  x_86_phi = x_78;
+  if (x_78) {
+    let x_82 : f32 = v4.y;
+    let x_84 : f32 = x_6.x_GLF_uniform_float_values[6];
+    x_85 = (x_82 < x_84);
+    x_86_phi = x_85;
+  }
+  let x_86 : bool = x_86_phi;
+  x_94_phi = x_86;
+  if (x_86) {
+    let x_90 : f32 = v4.w;
+    let x_92 : f32 = x_6.x_GLF_uniform_float_values[0];
+    x_93 = (x_90 == x_92);
+    x_94_phi = x_93;
+  }
+  let x_94 : bool = x_94_phi;
+  if (x_94) {
+    let x_99 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_101 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_103 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_105 : f32 = x_6.x_GLF_uniform_float_values[0];
+    x_GLF_color = vec4<f32>(x_99, x_101, x_103, x_105);
+  } else {
+    let x_108 : f32 = x_6.x_GLF_uniform_float_values[1];
+    x_GLF_color = vec4<f32>(x_108, x_108, x_108, x_108);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-asin-undefined-smoothstep/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-asin-undefined-smoothstep/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..62792b6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-asin-undefined-smoothstep/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,6 @@
+SKIP: FAILED
+
+graphicsfuzz/cov-asin-undefined-smoothstep/0-opt.wgsl:30:47 error: expected ')' for type constructor
+  v2 = vec4<f32>(1.570796371, 1.119769573, 0x1.8p+128, 0.927295208);
+                                              ^^
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-asin-undefined-smoothstep/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-asin-undefined-smoothstep/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..62792b6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-asin-undefined-smoothstep/0-opt.wgsl.expected.msl
@@ -0,0 +1,6 @@
+SKIP: FAILED
+
+graphicsfuzz/cov-asin-undefined-smoothstep/0-opt.wgsl:30:47 error: expected ')' for type constructor
+  v2 = vec4<f32>(1.570796371, 1.119769573, 0x1.8p+128, 0.927295208);
+                                              ^^
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-asin-undefined-smoothstep/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-asin-undefined-smoothstep/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..62792b6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-asin-undefined-smoothstep/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,6 @@
+SKIP: FAILED
+
+graphicsfuzz/cov-asin-undefined-smoothstep/0-opt.wgsl:30:47 error: expected ')' for type constructor
+  v2 = vec4<f32>(1.570796371, 1.119769573, 0x1.8p+128, 0.927295208);
+                                              ^^
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-asin-undefined-smoothstep/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-asin-undefined-smoothstep/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..62792b6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-asin-undefined-smoothstep/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+SKIP: FAILED
+
+graphicsfuzz/cov-asin-undefined-smoothstep/0-opt.wgsl:30:47 error: expected ')' for type constructor
+  v2 = vec4<f32>(1.570796371, 1.119769573, 0x1.8p+128, 0.927295208);
+                                              ^^
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-atan-trunc-vec4/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-atan-trunc-vec4/0-opt.spvasm
new file mode 100644
index 0000000..d25e5e5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-atan-trunc-vec4/0-opt.spvasm
@@ -0,0 +1,116 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %v "v"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %f "f"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%float_n621_596008 = OpConstant %float -621.596008
+%_ptr_Function_float = OpTypePointer Function %float
+       %bool = OpTypeBool
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %13
+         %30 = OpLabel
+          %v = OpVariable %_ptr_Function_v4float Function
+          %f = OpVariable %_ptr_Function_float Function
+         %31 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %32 = OpLoad %int %31
+         %33 = OpConvertSToF %float %32
+         %34 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %35 = OpLoad %int %34
+         %36 = OpConvertSToF %float %35
+         %37 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %38 = OpLoad %int %37
+         %39 = OpConvertSToF %float %38
+         %40 = OpCompositeConstruct %v4float %33 %36 %float_n621_596008 %39
+               OpStore %v %40
+         %41 = OpLoad %v4float %v
+         %42 = OpExtInst %v4float %1 Trunc %41
+         %43 = OpExtInst %v4float %1 Atan %42
+         %44 = OpCompositeExtract %float %43 2
+               OpStore %f %44
+         %45 = OpLoad %float %f
+         %46 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %47 = OpLoad %float %46
+         %48 = OpFNegate %float %47
+         %49 = OpFOrdGreaterThan %bool %45 %48
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %50
+         %51 = OpLabel
+         %52 = OpLoad %float %f
+         %53 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_1
+         %54 = OpLoad %float %53
+         %55 = OpFNegate %float %54
+         %56 = OpFOrdLessThan %bool %52 %55
+               OpBranch %50
+         %50 = OpLabel
+         %57 = OpPhi %bool %49 %30 %56 %51
+               OpSelectionMerge %58 None
+               OpBranchConditional %57 %59 %60
+         %59 = OpLabel
+         %61 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %62 = OpLoad %int %61
+         %63 = OpConvertSToF %float %62
+         %64 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %65 = OpLoad %int %64
+         %66 = OpConvertSToF %float %65
+         %67 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %68 = OpLoad %int %67
+         %69 = OpConvertSToF %float %68
+         %70 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %71 = OpLoad %int %70
+         %72 = OpConvertSToF %float %71
+         %73 = OpCompositeConstruct %v4float %63 %66 %69 %72
+               OpStore %_GLF_color %73
+               OpBranch %58
+         %60 = OpLabel
+         %74 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %75 = OpLoad %int %74
+         %76 = OpConvertSToF %float %75
+         %77 = OpCompositeConstruct %v4float %76 %76 %76 %76
+               OpStore %_GLF_color %77
+               OpBranch %58
+         %58 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-atan-trunc-vec4/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-atan-trunc-vec4/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..be0338b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-atan-trunc-vec4/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,62 @@
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[2];
+};
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 v = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float f = 0.0f;
+  bool x_56 = false;
+  bool x_57_phi = false;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_32 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_35 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const int x_38 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  v = float4(float(x_32), float(x_35), -621.596008301f, float(x_38));
+  f = atan(trunc(v)).z;
+  const float x_45 = f;
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const float x_47 = asfloat(x_9[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  const bool x_49 = (x_45 > -(x_47));
+  x_57_phi = x_49;
+  if (x_49) {
+    const float x_52 = f;
+    const float x_54 = asfloat(x_9[1].x);
+    x_56 = (x_52 < -(x_54));
+    x_57_phi = x_56;
+  }
+  if (x_57_phi) {
+    const int x_62 = asint(x_6[1].x);
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_65 = asint(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const int x_68 = asint(x_6[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    const int x_71 = asint(x_6[1].x);
+    x_GLF_color = float4(float(x_62), float(x_65), float(x_68), float(x_71));
+  } else {
+    const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+    const int x_75 = asint(x_6[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+    const float x_76 = float(x_75);
+    x_GLF_color = float4(x_76, x_76, x_76, x_76);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-atan-trunc-vec4/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-atan-trunc-vec4/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..7559de0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-atan-trunc-vec4/0-opt.spvasm.expected.msl
@@ -0,0 +1,74 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_9, thread float4* const tint_symbol_4) {
+  float4 v = 0.0f;
+  float f = 0.0f;
+  bool x_56 = false;
+  bool x_57_phi = false;
+  int const x_32 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_35 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_38 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  v = float4(float(x_32), float(x_35), -621.596008301f, float(x_38));
+  float4 const x_41 = v;
+  f = atan(trunc(x_41)).z;
+  float const x_45 = f;
+  float const x_47 = x_9.x_GLF_uniform_float_values.arr[0].el;
+  bool const x_49 = (x_45 > -(x_47));
+  x_57_phi = x_49;
+  if (x_49) {
+    float const x_52 = f;
+    float const x_54 = x_9.x_GLF_uniform_float_values.arr[1].el;
+    x_56 = (x_52 < -(x_54));
+    x_57_phi = x_56;
+  }
+  bool const x_57 = x_57_phi;
+  if (x_57) {
+    int const x_62 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_65 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_68 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_71 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_62), float(x_65), float(x_68), float(x_71));
+  } else {
+    int const x_75 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    float const x_76 = float(x_75);
+    *(tint_symbol_4) = float4(x_76, x_76, x_76, x_76);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-atan-trunc-vec4/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-atan-trunc-vec4/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..f01fd57
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-atan-trunc-vec4/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,161 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 100
+; Schema: 0
+               OpCapability Shader
+         %49 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v "v"
+               OpName %f "f"
+               OpName %x_56 "x_56"
+               OpName %x_57_phi "x_57_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %float = OpTypeFloat 32
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %16
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%_ptr_Function_float = OpTypePointer Function %float
+         %27 = OpConstantNull %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %31 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%float_n621_596008 = OpConstant %float -621.596008
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %88 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+          %v = OpVariable %_ptr_Function_v4float Function %16
+          %f = OpVariable %_ptr_Function_float Function %27
+       %x_56 = OpVariable %_ptr_Function_bool Function %31
+   %x_57_phi = OpVariable %_ptr_Function_bool Function %31
+         %36 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %37 = OpLoad %int %36
+         %38 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %39 = OpLoad %int %38
+         %40 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %41 = OpLoad %int %40
+         %42 = OpConvertSToF %float %37
+         %43 = OpConvertSToF %float %39
+         %45 = OpConvertSToF %float %41
+         %46 = OpCompositeConstruct %v4float %42 %43 %float_n621_596008 %45
+               OpStore %v %46
+         %47 = OpLoad %v4float %v
+         %50 = OpExtInst %v4float %49 Trunc %47
+         %48 = OpExtInst %v4float %49 Atan %50
+         %51 = OpCompositeExtract %float %48 2
+               OpStore %f %51
+         %52 = OpLoad %float %f
+         %54 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_0
+         %55 = OpLoad %float %54
+         %56 = OpFNegate %float %55
+         %57 = OpFOrdGreaterThan %bool %52 %56
+               OpStore %x_57_phi %57
+               OpSelectionMerge %58 None
+               OpBranchConditional %57 %59 %58
+         %59 = OpLabel
+         %60 = OpLoad %float %f
+         %62 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_1
+         %63 = OpLoad %float %62
+         %64 = OpFNegate %float %63
+         %65 = OpFOrdLessThan %bool %60 %64
+               OpStore %x_56 %65
+         %66 = OpLoad %bool %x_56
+               OpStore %x_57_phi %66
+               OpBranch %58
+         %58 = OpLabel
+         %67 = OpLoad %bool %x_57_phi
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %70
+         %69 = OpLabel
+         %71 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %72 = OpLoad %int %71
+         %73 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %74 = OpLoad %int %73
+         %75 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %76 = OpLoad %int %75
+         %77 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %78 = OpLoad %int %77
+         %79 = OpConvertSToF %float %72
+         %80 = OpConvertSToF %float %74
+         %81 = OpConvertSToF %float %76
+         %82 = OpConvertSToF %float %78
+         %83 = OpCompositeConstruct %v4float %79 %80 %81 %82
+               OpStore %x_GLF_color %83
+               OpBranch %68
+         %70 = OpLabel
+         %84 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %85 = OpLoad %int %84
+         %86 = OpConvertSToF %float %85
+         %87 = OpCompositeConstruct %v4float %86 %86 %86 %86
+               OpStore %x_GLF_color %87
+               OpBranch %68
+         %68 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %88
+%tint_symbol = OpFunctionParameter %main_out
+         %92 = OpLabel
+         %93 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %93
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+         %95 = OpLabel
+         %96 = OpFunctionCall %void %main_1
+         %98 = OpLoad %v4float %x_GLF_color
+         %99 = OpCompositeConstruct %main_out %98
+         %97 = OpFunctionCall %void %tint_symbol_2 %99
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-atan-trunc-vec4/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-atan-trunc-vec4/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..0ac797e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-atan-trunc-vec4/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,66 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v : vec4<f32>;
+  var f : f32;
+  var x_56 : bool;
+  var x_57_phi : bool;
+  let x_32 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_35 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_38 : i32 = x_6.x_GLF_uniform_int_values[0];
+  v = vec4<f32>(f32(x_32), f32(x_35), -621.596008301, f32(x_38));
+  let x_41 : vec4<f32> = v;
+  f = atan(trunc(x_41)).z;
+  let x_45 : f32 = f;
+  let x_47 : f32 = x_9.x_GLF_uniform_float_values[0];
+  let x_49 : bool = (x_45 > -(x_47));
+  x_57_phi = x_49;
+  if (x_49) {
+    let x_52 : f32 = f;
+    let x_54 : f32 = x_9.x_GLF_uniform_float_values[1];
+    x_56 = (x_52 < -(x_54));
+    x_57_phi = x_56;
+  }
+  let x_57 : bool = x_57_phi;
+  if (x_57) {
+    let x_62 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_65 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_68 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_71 : i32 = x_6.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_62), f32(x_65), f32(x_68), f32(x_71));
+  } else {
+    let x_75 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_76 : f32 = f32(x_75);
+    x_GLF_color = vec4<f32>(x_76, x_76, x_76, x_76);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-atan-trunc-vec4/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-atan-trunc-vec4/0-opt.wgsl
new file mode 100644
index 0000000..0ac797e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-atan-trunc-vec4/0-opt.wgsl
@@ -0,0 +1,66 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v : vec4<f32>;
+  var f : f32;
+  var x_56 : bool;
+  var x_57_phi : bool;
+  let x_32 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_35 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_38 : i32 = x_6.x_GLF_uniform_int_values[0];
+  v = vec4<f32>(f32(x_32), f32(x_35), -621.596008301, f32(x_38));
+  let x_41 : vec4<f32> = v;
+  f = atan(trunc(x_41)).z;
+  let x_45 : f32 = f;
+  let x_47 : f32 = x_9.x_GLF_uniform_float_values[0];
+  let x_49 : bool = (x_45 > -(x_47));
+  x_57_phi = x_49;
+  if (x_49) {
+    let x_52 : f32 = f;
+    let x_54 : f32 = x_9.x_GLF_uniform_float_values[1];
+    x_56 = (x_52 < -(x_54));
+    x_57_phi = x_56;
+  }
+  let x_57 : bool = x_57_phi;
+  if (x_57) {
+    let x_62 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_65 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_68 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_71 : i32 = x_6.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_62), f32(x_65), f32(x_68), f32(x_71));
+  } else {
+    let x_75 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_76 : f32 = f32(x_75);
+    x_GLF_color = vec4<f32>(x_76, x_76, x_76, x_76);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-atan-trunc-vec4/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-atan-trunc-vec4/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..be0338b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-atan-trunc-vec4/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,62 @@
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[2];
+};
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 v = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float f = 0.0f;
+  bool x_56 = false;
+  bool x_57_phi = false;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_32 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_35 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const int x_38 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  v = float4(float(x_32), float(x_35), -621.596008301f, float(x_38));
+  f = atan(trunc(v)).z;
+  const float x_45 = f;
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const float x_47 = asfloat(x_9[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  const bool x_49 = (x_45 > -(x_47));
+  x_57_phi = x_49;
+  if (x_49) {
+    const float x_52 = f;
+    const float x_54 = asfloat(x_9[1].x);
+    x_56 = (x_52 < -(x_54));
+    x_57_phi = x_56;
+  }
+  if (x_57_phi) {
+    const int x_62 = asint(x_6[1].x);
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_65 = asint(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const int x_68 = asint(x_6[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    const int x_71 = asint(x_6[1].x);
+    x_GLF_color = float4(float(x_62), float(x_65), float(x_68), float(x_71));
+  } else {
+    const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+    const int x_75 = asint(x_6[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+    const float x_76 = float(x_75);
+    x_GLF_color = float4(x_76, x_76, x_76, x_76);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-atan-trunc-vec4/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-atan-trunc-vec4/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..7559de0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-atan-trunc-vec4/0-opt.wgsl.expected.msl
@@ -0,0 +1,74 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_9, thread float4* const tint_symbol_4) {
+  float4 v = 0.0f;
+  float f = 0.0f;
+  bool x_56 = false;
+  bool x_57_phi = false;
+  int const x_32 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_35 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_38 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  v = float4(float(x_32), float(x_35), -621.596008301f, float(x_38));
+  float4 const x_41 = v;
+  f = atan(trunc(x_41)).z;
+  float const x_45 = f;
+  float const x_47 = x_9.x_GLF_uniform_float_values.arr[0].el;
+  bool const x_49 = (x_45 > -(x_47));
+  x_57_phi = x_49;
+  if (x_49) {
+    float const x_52 = f;
+    float const x_54 = x_9.x_GLF_uniform_float_values.arr[1].el;
+    x_56 = (x_52 < -(x_54));
+    x_57_phi = x_56;
+  }
+  bool const x_57 = x_57_phi;
+  if (x_57) {
+    int const x_62 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_65 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_68 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_71 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_62), float(x_65), float(x_68), float(x_71));
+  } else {
+    int const x_75 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    float const x_76 = float(x_75);
+    *(tint_symbol_4) = float4(x_76, x_76, x_76, x_76);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-atan-trunc-vec4/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-atan-trunc-vec4/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..f01fd57
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-atan-trunc-vec4/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,161 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 100
+; Schema: 0
+               OpCapability Shader
+         %49 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v "v"
+               OpName %f "f"
+               OpName %x_56 "x_56"
+               OpName %x_57_phi "x_57_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %float = OpTypeFloat 32
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %16
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%_ptr_Function_float = OpTypePointer Function %float
+         %27 = OpConstantNull %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %31 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%float_n621_596008 = OpConstant %float -621.596008
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %88 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+          %v = OpVariable %_ptr_Function_v4float Function %16
+          %f = OpVariable %_ptr_Function_float Function %27
+       %x_56 = OpVariable %_ptr_Function_bool Function %31
+   %x_57_phi = OpVariable %_ptr_Function_bool Function %31
+         %36 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %37 = OpLoad %int %36
+         %38 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %39 = OpLoad %int %38
+         %40 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %41 = OpLoad %int %40
+         %42 = OpConvertSToF %float %37
+         %43 = OpConvertSToF %float %39
+         %45 = OpConvertSToF %float %41
+         %46 = OpCompositeConstruct %v4float %42 %43 %float_n621_596008 %45
+               OpStore %v %46
+         %47 = OpLoad %v4float %v
+         %50 = OpExtInst %v4float %49 Trunc %47
+         %48 = OpExtInst %v4float %49 Atan %50
+         %51 = OpCompositeExtract %float %48 2
+               OpStore %f %51
+         %52 = OpLoad %float %f
+         %54 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_0
+         %55 = OpLoad %float %54
+         %56 = OpFNegate %float %55
+         %57 = OpFOrdGreaterThan %bool %52 %56
+               OpStore %x_57_phi %57
+               OpSelectionMerge %58 None
+               OpBranchConditional %57 %59 %58
+         %59 = OpLabel
+         %60 = OpLoad %float %f
+         %62 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_1
+         %63 = OpLoad %float %62
+         %64 = OpFNegate %float %63
+         %65 = OpFOrdLessThan %bool %60 %64
+               OpStore %x_56 %65
+         %66 = OpLoad %bool %x_56
+               OpStore %x_57_phi %66
+               OpBranch %58
+         %58 = OpLabel
+         %67 = OpLoad %bool %x_57_phi
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %70
+         %69 = OpLabel
+         %71 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %72 = OpLoad %int %71
+         %73 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %74 = OpLoad %int %73
+         %75 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %76 = OpLoad %int %75
+         %77 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %78 = OpLoad %int %77
+         %79 = OpConvertSToF %float %72
+         %80 = OpConvertSToF %float %74
+         %81 = OpConvertSToF %float %76
+         %82 = OpConvertSToF %float %78
+         %83 = OpCompositeConstruct %v4float %79 %80 %81 %82
+               OpStore %x_GLF_color %83
+               OpBranch %68
+         %70 = OpLabel
+         %84 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %85 = OpLoad %int %84
+         %86 = OpConvertSToF %float %85
+         %87 = OpCompositeConstruct %v4float %86 %86 %86 %86
+               OpStore %x_GLF_color %87
+               OpBranch %68
+         %68 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %88
+%tint_symbol = OpFunctionParameter %main_out
+         %92 = OpLabel
+         %93 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %93
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+         %95 = OpLabel
+         %96 = OpFunctionCall %void %main_1
+         %98 = OpLoad %v4float %x_GLF_color
+         %99 = OpCompositeConstruct %main_out %98
+         %97 = OpFunctionCall %void %tint_symbol_2 %99
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-atan-trunc-vec4/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-atan-trunc-vec4/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..0ac797e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-atan-trunc-vec4/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,66 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v : vec4<f32>;
+  var f : f32;
+  var x_56 : bool;
+  var x_57_phi : bool;
+  let x_32 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_35 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_38 : i32 = x_6.x_GLF_uniform_int_values[0];
+  v = vec4<f32>(f32(x_32), f32(x_35), -621.596008301, f32(x_38));
+  let x_41 : vec4<f32> = v;
+  f = atan(trunc(x_41)).z;
+  let x_45 : f32 = f;
+  let x_47 : f32 = x_9.x_GLF_uniform_float_values[0];
+  let x_49 : bool = (x_45 > -(x_47));
+  x_57_phi = x_49;
+  if (x_49) {
+    let x_52 : f32 = f;
+    let x_54 : f32 = x_9.x_GLF_uniform_float_values[1];
+    x_56 = (x_52 < -(x_54));
+    x_57_phi = x_56;
+  }
+  let x_57 : bool = x_57_phi;
+  if (x_57) {
+    let x_62 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_65 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_68 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_71 : i32 = x_6.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_62), f32(x_65), f32(x_68), f32(x_71));
+  } else {
+    let x_75 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_76 : f32 = f32(x_75);
+    x_GLF_color = vec4<f32>(x_76, x_76, x_76, x_76);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-basic-block-discard-in-function/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-basic-block-discard-in-function/0-opt.spvasm
new file mode 100644
index 0000000..3fa5b16
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-basic-block-discard-in-function/0-opt.spvasm
@@ -0,0 +1,90 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %func_i1_ "func(i1;"
+               OpName %x "x"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %_ ""
+               OpName %param "param"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %15 = OpTypeFunction %int %_ptr_Function_int
+     %int_10 = OpConstant %int 10
+       %bool = OpTypeBool
+      %int_0 = OpConstant %int 0
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+      %int_4 = OpConstant %int 4
+      %int_3 = OpConstant %int 3
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %29 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %30 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %12
+         %31 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+          %b = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_int Function
+               OpStore %a %int_0
+         %32 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %33 = OpLoad %int %32
+               OpStore %b %33
+               OpBranch %34
+         %34 = OpLabel
+         %35 = OpPhi %int %33 %31 %36 %34
+               OpStore %param %35
+         %37 = OpFunctionCall %int %func_i1_ %param
+               OpStore %a %37
+         %36 = OpIAdd %int %35 %int_1
+               OpStore %b %36
+         %38 = OpSLessThan %bool %36 %int_4
+               OpLoopMerge %39 %34 None
+               OpBranchConditional %38 %34 %39
+         %39 = OpLabel
+         %40 = OpIEqual %bool %37 %int_3
+               OpSelectionMerge %41 None
+               OpBranchConditional %40 %42 %43
+         %42 = OpLabel
+               OpStore %_GLF_color %29
+               OpBranch %41
+         %43 = OpLabel
+               OpStore %_GLF_color %30
+               OpBranch %41
+         %41 = OpLabel
+               OpReturn
+               OpFunctionEnd
+   %func_i1_ = OpFunction %int None %15
+          %x = OpFunctionParameter %_ptr_Function_int
+         %44 = OpLabel
+         %45 = OpLoad %int %x
+         %46 = OpIEqual %bool %45 %int_10
+               OpSelectionMerge %47 None
+               OpBranchConditional %46 %48 %47
+         %48 = OpLabel
+               OpKill
+         %47 = OpLabel
+         %49 = OpLoad %int %x
+               OpReturnValue %49
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-basic-block-discard-in-function/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-basic-block-discard-in-function/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..8477479
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-basic-block-discard-in-function/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,58 @@
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+int func_i1_(inout int x) {
+  const int x_45 = x;
+  if ((x_45 == 10)) {
+    discard;
+  }
+  const int x_49 = x;
+  return x_49;
+}
+
+void main_1() {
+  int a = 0;
+  int b = 0;
+  int param = 0;
+  int x_37 = 0;
+  int x_35_phi = 0;
+  a = 0;
+  const int x_33 = asint(x_9[0].x);
+  b = x_33;
+  x_35_phi = x_33;
+  while (true) {
+    const int x_35 = x_35_phi;
+    param = x_35;
+    x_37 = func_i1_(param);
+    a = x_37;
+    const int x_36 = (x_35 + 1);
+    b = x_36;
+    x_35_phi = x_36;
+    if ((x_36 < 4)) {
+    } else {
+      break;
+    }
+  }
+  if ((x_37 == asint(3))) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-basic-block-discard-in-function/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-basic-block-discard-in-function/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..66a656e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-basic-block-discard-in-function/0-opt.spvasm.expected.msl
@@ -0,0 +1,61 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int zero;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int func_i1_(thread int* const x) {
+  int const x_45 = *(x);
+  if ((x_45 == 10)) {
+    discard_fragment();
+  }
+  int const x_49 = *(x);
+  return x_49;
+}
+
+void main_1(constant buf0& x_9, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int b = 0;
+  int param = 0;
+  int x_37 = 0;
+  int x_35_phi = 0;
+  a = 0;
+  int const x_33 = x_9.zero;
+  b = x_33;
+  x_35_phi = x_33;
+  while (true) {
+    int const x_35 = x_35_phi;
+    param = x_35;
+    x_37 = func_i1_(&(param));
+    a = x_37;
+    int const x_36 = (x_35 + 1);
+    b = x_36;
+    x_35_phi = x_36;
+    if ((x_36 < 4)) {
+    } else {
+      break;
+    }
+  }
+  if ((x_37 == as_type<int>(3))) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-basic-block-discard-in-function/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-basic-block-discard-in-function/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..f8a6cea
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-basic-block-discard-in-function/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,145 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 80
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_i1_ "func_i1_"
+               OpName %x "x"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %param "param"
+               OpName %x_37 "x_37"
+               OpName %x_35_phi "x_35_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+%_ptr_Function_int = OpTypePointer Function %int
+         %12 = OpTypeFunction %int %_ptr_Function_int
+     %int_10 = OpConstant %int 10
+       %bool = OpTypeBool
+       %void = OpTypeVoid
+         %26 = OpTypeFunction %void
+         %31 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+      %int_4 = OpConstant %int 4
+      %int_3 = OpConstant %int 3
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %66 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %67 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %68 = OpTypeFunction %void %main_out
+   %func_i1_ = OpFunction %int None %12
+          %x = OpFunctionParameter %_ptr_Function_int
+         %16 = OpLabel
+         %18 = OpLoad %int %x
+         %20 = OpIEqual %bool %18 %int_10
+               OpSelectionMerge %22 None
+               OpBranchConditional %20 %23 %22
+         %23 = OpLabel
+               OpKill
+         %22 = OpLabel
+         %25 = OpLoad %int %x
+               OpReturnValue %25
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %26
+         %29 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %31
+          %b = OpVariable %_ptr_Function_int Function %31
+      %param = OpVariable %_ptr_Function_int Function %31
+       %x_37 = OpVariable %_ptr_Function_int Function %31
+   %x_35_phi = OpVariable %_ptr_Function_int Function %31
+               OpStore %a %int_0
+         %40 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0
+         %41 = OpLoad %int %40
+               OpStore %b %41
+               OpStore %x_35_phi %41
+               OpBranch %42
+         %42 = OpLabel
+               OpLoopMerge %43 %44 None
+               OpBranch %45
+         %45 = OpLabel
+         %46 = OpLoad %int %x_35_phi
+               OpStore %param %46
+         %47 = OpFunctionCall %int %func_i1_ %param
+               OpStore %x_37 %47
+         %49 = OpLoad %int %x_37
+               OpStore %a %49
+         %51 = OpIAdd %int %46 %int_1
+               OpStore %b %51
+               OpStore %x_35_phi %51
+         %53 = OpSLessThan %bool %51 %int_4
+               OpSelectionMerge %54 None
+               OpBranchConditional %53 %55 %56
+         %55 = OpLabel
+               OpBranch %54
+         %56 = OpLabel
+               OpBranch %43
+         %54 = OpLabel
+               OpBranch %44
+         %44 = OpLabel
+               OpBranch %42
+         %43 = OpLabel
+         %57 = OpLoad %int %x_37
+         %58 = OpCopyObject %int %int_3
+         %60 = OpIEqual %bool %57 %58
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %63
+         %62 = OpLabel
+               OpStore %x_GLF_color %66
+               OpBranch %61
+         %63 = OpLabel
+               OpStore %x_GLF_color %67
+               OpBranch %61
+         %61 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %68
+%tint_symbol = OpFunctionParameter %main_out
+         %72 = OpLabel
+         %73 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %73
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %26
+         %75 = OpLabel
+         %76 = OpFunctionCall %void %main_1
+         %78 = OpLoad %v4float %x_GLF_color
+         %79 = OpCompositeConstruct %main_out %78
+         %77 = OpFunctionCall %void %tint_symbol_2 %79
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-basic-block-discard-in-function/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-basic-block-discard-in-function/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..39b2064
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-basic-block-discard-in-function/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,59 @@
+[[block]]
+struct buf0 {
+  zero : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_i1_(x : ptr<function, i32>) -> i32 {
+  let x_45 : i32 = *(x);
+  if ((x_45 == 10)) {
+    discard;
+  }
+  let x_49 : i32 = *(x);
+  return x_49;
+}
+
+fn main_1() {
+  var a : i32;
+  var b : i32;
+  var param : i32;
+  var x_37 : i32;
+  var x_35_phi : i32;
+  a = 0;
+  let x_33 : i32 = x_9.zero;
+  b = x_33;
+  x_35_phi = x_33;
+  loop {
+    let x_35 : i32 = x_35_phi;
+    param = x_35;
+    x_37 = func_i1_(&(param));
+    a = x_37;
+    let x_36 : i32 = (x_35 + 1);
+    b = x_36;
+    x_35_phi = x_36;
+    if ((x_36 < 4)) {
+    } else {
+      break;
+    }
+  }
+  if ((x_37 == bitcast<i32>(3))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-basic-block-discard-in-function/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-basic-block-discard-in-function/0-opt.wgsl
new file mode 100644
index 0000000..39b2064
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-basic-block-discard-in-function/0-opt.wgsl
@@ -0,0 +1,59 @@
+[[block]]
+struct buf0 {
+  zero : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_i1_(x : ptr<function, i32>) -> i32 {
+  let x_45 : i32 = *(x);
+  if ((x_45 == 10)) {
+    discard;
+  }
+  let x_49 : i32 = *(x);
+  return x_49;
+}
+
+fn main_1() {
+  var a : i32;
+  var b : i32;
+  var param : i32;
+  var x_37 : i32;
+  var x_35_phi : i32;
+  a = 0;
+  let x_33 : i32 = x_9.zero;
+  b = x_33;
+  x_35_phi = x_33;
+  loop {
+    let x_35 : i32 = x_35_phi;
+    param = x_35;
+    x_37 = func_i1_(&(param));
+    a = x_37;
+    let x_36 : i32 = (x_35 + 1);
+    b = x_36;
+    x_35_phi = x_36;
+    if ((x_36 < 4)) {
+    } else {
+      break;
+    }
+  }
+  if ((x_37 == bitcast<i32>(3))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-basic-block-discard-in-function/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-basic-block-discard-in-function/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..8477479
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-basic-block-discard-in-function/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,58 @@
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+int func_i1_(inout int x) {
+  const int x_45 = x;
+  if ((x_45 == 10)) {
+    discard;
+  }
+  const int x_49 = x;
+  return x_49;
+}
+
+void main_1() {
+  int a = 0;
+  int b = 0;
+  int param = 0;
+  int x_37 = 0;
+  int x_35_phi = 0;
+  a = 0;
+  const int x_33 = asint(x_9[0].x);
+  b = x_33;
+  x_35_phi = x_33;
+  while (true) {
+    const int x_35 = x_35_phi;
+    param = x_35;
+    x_37 = func_i1_(param);
+    a = x_37;
+    const int x_36 = (x_35 + 1);
+    b = x_36;
+    x_35_phi = x_36;
+    if ((x_36 < 4)) {
+    } else {
+      break;
+    }
+  }
+  if ((x_37 == asint(3))) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-basic-block-discard-in-function/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-basic-block-discard-in-function/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..66a656e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-basic-block-discard-in-function/0-opt.wgsl.expected.msl
@@ -0,0 +1,61 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int zero;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int func_i1_(thread int* const x) {
+  int const x_45 = *(x);
+  if ((x_45 == 10)) {
+    discard_fragment();
+  }
+  int const x_49 = *(x);
+  return x_49;
+}
+
+void main_1(constant buf0& x_9, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int b = 0;
+  int param = 0;
+  int x_37 = 0;
+  int x_35_phi = 0;
+  a = 0;
+  int const x_33 = x_9.zero;
+  b = x_33;
+  x_35_phi = x_33;
+  while (true) {
+    int const x_35 = x_35_phi;
+    param = x_35;
+    x_37 = func_i1_(&(param));
+    a = x_37;
+    int const x_36 = (x_35 + 1);
+    b = x_36;
+    x_35_phi = x_36;
+    if ((x_36 < 4)) {
+    } else {
+      break;
+    }
+  }
+  if ((x_37 == as_type<int>(3))) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-basic-block-discard-in-function/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-basic-block-discard-in-function/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..f8a6cea
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-basic-block-discard-in-function/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,145 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 80
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_i1_ "func_i1_"
+               OpName %x "x"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %param "param"
+               OpName %x_37 "x_37"
+               OpName %x_35_phi "x_35_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+%_ptr_Function_int = OpTypePointer Function %int
+         %12 = OpTypeFunction %int %_ptr_Function_int
+     %int_10 = OpConstant %int 10
+       %bool = OpTypeBool
+       %void = OpTypeVoid
+         %26 = OpTypeFunction %void
+         %31 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+      %int_4 = OpConstant %int 4
+      %int_3 = OpConstant %int 3
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %66 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %67 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %68 = OpTypeFunction %void %main_out
+   %func_i1_ = OpFunction %int None %12
+          %x = OpFunctionParameter %_ptr_Function_int
+         %16 = OpLabel
+         %18 = OpLoad %int %x
+         %20 = OpIEqual %bool %18 %int_10
+               OpSelectionMerge %22 None
+               OpBranchConditional %20 %23 %22
+         %23 = OpLabel
+               OpKill
+         %22 = OpLabel
+         %25 = OpLoad %int %x
+               OpReturnValue %25
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %26
+         %29 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %31
+          %b = OpVariable %_ptr_Function_int Function %31
+      %param = OpVariable %_ptr_Function_int Function %31
+       %x_37 = OpVariable %_ptr_Function_int Function %31
+   %x_35_phi = OpVariable %_ptr_Function_int Function %31
+               OpStore %a %int_0
+         %40 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0
+         %41 = OpLoad %int %40
+               OpStore %b %41
+               OpStore %x_35_phi %41
+               OpBranch %42
+         %42 = OpLabel
+               OpLoopMerge %43 %44 None
+               OpBranch %45
+         %45 = OpLabel
+         %46 = OpLoad %int %x_35_phi
+               OpStore %param %46
+         %47 = OpFunctionCall %int %func_i1_ %param
+               OpStore %x_37 %47
+         %49 = OpLoad %int %x_37
+               OpStore %a %49
+         %51 = OpIAdd %int %46 %int_1
+               OpStore %b %51
+               OpStore %x_35_phi %51
+         %53 = OpSLessThan %bool %51 %int_4
+               OpSelectionMerge %54 None
+               OpBranchConditional %53 %55 %56
+         %55 = OpLabel
+               OpBranch %54
+         %56 = OpLabel
+               OpBranch %43
+         %54 = OpLabel
+               OpBranch %44
+         %44 = OpLabel
+               OpBranch %42
+         %43 = OpLabel
+         %57 = OpLoad %int %x_37
+         %58 = OpCopyObject %int %int_3
+         %60 = OpIEqual %bool %57 %58
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %63
+         %62 = OpLabel
+               OpStore %x_GLF_color %66
+               OpBranch %61
+         %63 = OpLabel
+               OpStore %x_GLF_color %67
+               OpBranch %61
+         %61 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %68
+%tint_symbol = OpFunctionParameter %main_out
+         %72 = OpLabel
+         %73 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %73
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %26
+         %75 = OpLabel
+         %76 = OpFunctionCall %void %main_1
+         %78 = OpLoad %v4float %x_GLF_color
+         %79 = OpCompositeConstruct %main_out %78
+         %77 = OpFunctionCall %void %tint_symbol_2 %79
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-basic-block-discard-in-function/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-basic-block-discard-in-function/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..39b2064
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-basic-block-discard-in-function/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,59 @@
+[[block]]
+struct buf0 {
+  zero : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_i1_(x : ptr<function, i32>) -> i32 {
+  let x_45 : i32 = *(x);
+  if ((x_45 == 10)) {
+    discard;
+  }
+  let x_49 : i32 = *(x);
+  return x_49;
+}
+
+fn main_1() {
+  var a : i32;
+  var b : i32;
+  var param : i32;
+  var x_37 : i32;
+  var x_35_phi : i32;
+  a = 0;
+  let x_33 : i32 = x_9.zero;
+  b = x_33;
+  x_35_phi = x_33;
+  loop {
+    let x_35 : i32 = x_35_phi;
+    param = x_35;
+    x_37 = func_i1_(&(param));
+    a = x_37;
+    let x_36 : i32 = (x_35 + 1);
+    b = x_36;
+    x_35_phi = x_36;
+    if ((x_36 < 4)) {
+    } else {
+      break;
+    }
+  }
+  if ((x_37 == bitcast<i32>(3))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.spvasm
new file mode 100644
index 0000000..08cec7e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.spvasm
@@ -0,0 +1,133 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %f1_ "f1("
+               OpName %a "a"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %a_0 "a"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %16 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+         %18 = OpTypeFunction %int
+%_ptr_Function_int = OpTypePointer Function %int
+    %int_256 = OpConstant %int 256
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %16
+         %37 = OpLabel
+        %a_0 = OpVariable %_ptr_Function_int Function
+         %38 = OpFunctionCall %int %f1_
+               OpStore %a_0 %38
+         %39 = OpLoad %int %a_0
+         %40 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %41 = OpLoad %int %40
+         %42 = OpIEqual %bool %39 %41
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %45
+         %44 = OpLabel
+         %46 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %47 = OpLoad %int %46
+         %48 = OpConvertSToF %float %47
+         %49 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %50 = OpLoad %int %49
+         %51 = OpConvertSToF %float %50
+         %52 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %53 = OpLoad %int %52
+         %54 = OpConvertSToF %float %53
+         %55 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %56 = OpLoad %int %55
+         %57 = OpConvertSToF %float %56
+         %58 = OpCompositeConstruct %v4float %48 %51 %54 %57
+               OpStore %_GLF_color %58
+               OpBranch %43
+         %45 = OpLabel
+         %59 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %60 = OpLoad %int %59
+         %61 = OpConvertSToF %float %60
+         %62 = OpCompositeConstruct %v4float %61 %61 %61 %61
+               OpStore %_GLF_color %62
+               OpBranch %43
+         %43 = OpLabel
+               OpReturn
+               OpFunctionEnd
+        %f1_ = OpFunction %int None %18
+         %63 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+               OpStore %a %int_256
+         %64 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %65 = OpLoad %float %64
+         %66 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %67 = OpLoad %float %66
+         %68 = OpFOrdGreaterThan %bool %65 %67
+               OpSelectionMerge %69 None
+               OpBranchConditional %68 %70 %69
+         %70 = OpLabel
+         %71 = OpLoad %int %a
+         %72 = OpIAdd %int %71 %int_1
+               OpStore %a %72
+               OpBranch %69
+         %69 = OpLabel
+         %73 = OpLoad %int %a
+         %74 = OpBitCount %int %73
+               OpStore %i %74
+         %75 = OpLoad %int %i
+         %76 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %77 = OpLoad %int %76
+         %78 = OpSLessThan %bool %75 %77
+               OpSelectionMerge %79 None
+               OpBranchConditional %78 %80 %79
+         %80 = OpLabel
+         %81 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %82 = OpLoad %int %81
+               OpReturnValue %82
+         %79 = OpLabel
+         %83 = OpLoad %int %i
+               OpReturnValue %83
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..ff5511e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,71 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[1];
+};
+cbuffer cbuffer_x_11 : register(b1, space0) {
+  uint4 x_11[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+int f1_() {
+  int a = 0;
+  int i = 0;
+  a = 256;
+  const float x_65 = gl_FragCoord.y;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_67 = asfloat(x_8[scalar_offset / 4][scalar_offset % 4]);
+  if ((x_65 > x_67)) {
+    a = (a + 1);
+  }
+  i = countbits(a);
+  const int x_75 = i;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_77 = asint(x_11[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_75 < x_77)) {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_82 = asint(x_11[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    return x_82;
+  }
+  return i;
+}
+
+void main_1() {
+  int a_1 = 0;
+  const int x_38 = f1_();
+  a_1 = x_38;
+  const int x_39 = a_1;
+  const int x_41 = asint(x_11[2].x);
+  if ((x_39 == x_41)) {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_47 = asint(x_11[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const int x_50 = asint(x_11[1].x);
+    const int x_53 = asint(x_11[1].x);
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_56 = asint(x_11[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    x_GLF_color = float4(float(x_47), float(x_50), float(x_53), float(x_56));
+  } else {
+    const int x_60 = asint(x_11[1].x);
+    const float x_61 = float(x_60);
+    x_GLF_color = float4(x_61, x_61, x_61, x_61);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..cbab4db
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.spvasm.expected.msl
@@ -0,0 +1,82 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int f1_(constant buf0& x_8, constant buf1& x_11, thread float4* const tint_symbol_5) {
+  int a = 0;
+  int i = 0;
+  a = 256;
+  float const x_65 = (*(tint_symbol_5)).y;
+  float const x_67 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_65 > x_67)) {
+    int const x_71 = a;
+    a = (x_71 + 1);
+  }
+  int const x_73 = a;
+  i = popcount(x_73);
+  int const x_75 = i;
+  int const x_77 = x_11.x_GLF_uniform_int_values.arr[0].el;
+  if ((x_75 < x_77)) {
+    int const x_82 = x_11.x_GLF_uniform_int_values.arr[0].el;
+    return x_82;
+  }
+  int const x_83 = i;
+  return x_83;
+}
+
+void main_1(constant buf0& x_8, constant buf1& x_11, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  int a_1 = 0;
+  int const x_38 = f1_(x_8, x_11, tint_symbol_6);
+  a_1 = x_38;
+  int const x_39 = a_1;
+  int const x_41 = x_11.x_GLF_uniform_int_values.arr[2].el;
+  if ((x_39 == x_41)) {
+    int const x_47 = x_11.x_GLF_uniform_int_values.arr[0].el;
+    int const x_50 = x_11.x_GLF_uniform_int_values.arr[1].el;
+    int const x_53 = x_11.x_GLF_uniform_int_values.arr[1].el;
+    int const x_56 = x_11.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_7) = float4(float(x_47), float(x_50), float(x_53), float(x_56));
+  } else {
+    int const x_60 = x_11.x_GLF_uniform_int_values.arr[1].el;
+    float const x_61 = float(x_60);
+    *(tint_symbol_7) = float4(x_61, x_61, x_61, x_61);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_8 [[buffer(0)]], constant buf1& x_11 [[buffer(1)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_8, x_11, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..f6ad901
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,171 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 102
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_11 "x_11"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %f1_ "f1_"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %main_1 "main_1"
+               OpName %a_1 "a_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_11 NonWritable
+               OpDecorate %x_11 DescriptorSet 0
+               OpDecorate %x_11 Binding 1
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_11 = OpVariable %_ptr_Uniform_buf1 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+         %23 = OpTypeFunction %int
+%_ptr_Function_int = OpTypePointer Function %int
+         %28 = OpConstantNull %int
+    %int_256 = OpConstant %int 256
+%_ptr_Private_float = OpTypePointer Private %float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %void = OpTypeVoid
+         %58 = OpTypeFunction %void
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+         %89 = OpTypeFunction %void %main_out
+        %f1_ = OpFunction %int None %23
+         %25 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %28
+          %i = OpVariable %_ptr_Function_int Function %28
+               OpStore %a %int_256
+         %32 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %33 = OpLoad %float %32
+         %37 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %38 = OpLoad %float %37
+         %39 = OpFOrdGreaterThan %bool %33 %38
+               OpSelectionMerge %41 None
+               OpBranchConditional %39 %42 %41
+         %42 = OpLabel
+         %43 = OpLoad %int %a
+         %45 = OpIAdd %int %43 %int_1
+               OpStore %a %45
+               OpBranch %41
+         %41 = OpLabel
+         %46 = OpLoad %int %a
+         %47 = OpBitCount %int %46
+               OpStore %i %47
+         %48 = OpLoad %int %i
+         %50 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+         %51 = OpLoad %int %50
+         %52 = OpSLessThan %bool %48 %51
+               OpSelectionMerge %53 None
+               OpBranchConditional %52 %54 %53
+         %54 = OpLabel
+         %55 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+         %56 = OpLoad %int %55
+               OpReturnValue %56
+         %53 = OpLabel
+         %57 = OpLoad %int %i
+               OpReturnValue %57
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %58
+         %61 = OpLabel
+        %a_1 = OpVariable %_ptr_Function_int Function %28
+         %63 = OpFunctionCall %int %f1_
+               OpStore %a_1 %63
+         %64 = OpLoad %int %a_1
+         %66 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_2
+         %67 = OpLoad %int %66
+         %68 = OpIEqual %bool %64 %67
+               OpSelectionMerge %69 None
+               OpBranchConditional %68 %70 %71
+         %70 = OpLabel
+         %72 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+         %73 = OpLoad %int %72
+         %74 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+         %75 = OpLoad %int %74
+         %76 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+         %77 = OpLoad %int %76
+         %78 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+         %79 = OpLoad %int %78
+         %80 = OpConvertSToF %float %73
+         %81 = OpConvertSToF %float %75
+         %82 = OpConvertSToF %float %77
+         %83 = OpConvertSToF %float %79
+         %84 = OpCompositeConstruct %v4float %80 %81 %82 %83
+               OpStore %x_GLF_color %84
+               OpBranch %69
+         %71 = OpLabel
+         %85 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+         %86 = OpLoad %int %85
+         %87 = OpConvertSToF %float %86
+         %88 = OpCompositeConstruct %v4float %87 %87 %87 %87
+               OpStore %x_GLF_color %88
+               OpBranch %69
+         %69 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %89
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %93 = OpLabel
+         %94 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %94
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %58
+         %96 = OpLabel
+         %97 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %97
+         %98 = OpFunctionCall %void %main_1
+        %100 = OpLoad %v4float %x_GLF_color
+        %101 = OpCompositeConstruct %main_out %100
+         %99 = OpFunctionCall %void %tint_symbol_3 %101
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..a14b4cb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,75 @@
+type Arr = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_11 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn f1_() -> i32 {
+  var a : i32;
+  var i : i32;
+  a = 256;
+  let x_65 : f32 = gl_FragCoord.y;
+  let x_67 : f32 = x_8.x_GLF_uniform_float_values[0];
+  if ((x_65 > x_67)) {
+    let x_71 : i32 = a;
+    a = (x_71 + 1);
+  }
+  let x_73 : i32 = a;
+  i = countOneBits(x_73);
+  let x_75 : i32 = i;
+  let x_77 : i32 = x_11.x_GLF_uniform_int_values[0];
+  if ((x_75 < x_77)) {
+    let x_82 : i32 = x_11.x_GLF_uniform_int_values[0];
+    return x_82;
+  }
+  let x_83 : i32 = i;
+  return x_83;
+}
+
+fn main_1() {
+  var a_1 : i32;
+  let x_38 : i32 = f1_();
+  a_1 = x_38;
+  let x_39 : i32 = a_1;
+  let x_41 : i32 = x_11.x_GLF_uniform_int_values[2];
+  if ((x_39 == x_41)) {
+    let x_47 : i32 = x_11.x_GLF_uniform_int_values[0];
+    let x_50 : i32 = x_11.x_GLF_uniform_int_values[1];
+    let x_53 : i32 = x_11.x_GLF_uniform_int_values[1];
+    let x_56 : i32 = x_11.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_47), f32(x_50), f32(x_53), f32(x_56));
+  } else {
+    let x_60 : i32 = x_11.x_GLF_uniform_int_values[1];
+    let x_61 : f32 = f32(x_60);
+    x_GLF_color = vec4<f32>(x_61, x_61, x_61, x_61);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.wgsl
new file mode 100644
index 0000000..a14b4cb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.wgsl
@@ -0,0 +1,75 @@
+type Arr = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_11 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn f1_() -> i32 {
+  var a : i32;
+  var i : i32;
+  a = 256;
+  let x_65 : f32 = gl_FragCoord.y;
+  let x_67 : f32 = x_8.x_GLF_uniform_float_values[0];
+  if ((x_65 > x_67)) {
+    let x_71 : i32 = a;
+    a = (x_71 + 1);
+  }
+  let x_73 : i32 = a;
+  i = countOneBits(x_73);
+  let x_75 : i32 = i;
+  let x_77 : i32 = x_11.x_GLF_uniform_int_values[0];
+  if ((x_75 < x_77)) {
+    let x_82 : i32 = x_11.x_GLF_uniform_int_values[0];
+    return x_82;
+  }
+  let x_83 : i32 = i;
+  return x_83;
+}
+
+fn main_1() {
+  var a_1 : i32;
+  let x_38 : i32 = f1_();
+  a_1 = x_38;
+  let x_39 : i32 = a_1;
+  let x_41 : i32 = x_11.x_GLF_uniform_int_values[2];
+  if ((x_39 == x_41)) {
+    let x_47 : i32 = x_11.x_GLF_uniform_int_values[0];
+    let x_50 : i32 = x_11.x_GLF_uniform_int_values[1];
+    let x_53 : i32 = x_11.x_GLF_uniform_int_values[1];
+    let x_56 : i32 = x_11.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_47), f32(x_50), f32(x_53), f32(x_56));
+  } else {
+    let x_60 : i32 = x_11.x_GLF_uniform_int_values[1];
+    let x_61 : f32 = f32(x_60);
+    x_GLF_color = vec4<f32>(x_61, x_61, x_61, x_61);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..ff5511e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,71 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[1];
+};
+cbuffer cbuffer_x_11 : register(b1, space0) {
+  uint4 x_11[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+int f1_() {
+  int a = 0;
+  int i = 0;
+  a = 256;
+  const float x_65 = gl_FragCoord.y;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_67 = asfloat(x_8[scalar_offset / 4][scalar_offset % 4]);
+  if ((x_65 > x_67)) {
+    a = (a + 1);
+  }
+  i = countbits(a);
+  const int x_75 = i;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_77 = asint(x_11[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_75 < x_77)) {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_82 = asint(x_11[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    return x_82;
+  }
+  return i;
+}
+
+void main_1() {
+  int a_1 = 0;
+  const int x_38 = f1_();
+  a_1 = x_38;
+  const int x_39 = a_1;
+  const int x_41 = asint(x_11[2].x);
+  if ((x_39 == x_41)) {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_47 = asint(x_11[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const int x_50 = asint(x_11[1].x);
+    const int x_53 = asint(x_11[1].x);
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_56 = asint(x_11[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    x_GLF_color = float4(float(x_47), float(x_50), float(x_53), float(x_56));
+  } else {
+    const int x_60 = asint(x_11[1].x);
+    const float x_61 = float(x_60);
+    x_GLF_color = float4(x_61, x_61, x_61, x_61);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..cbab4db
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.wgsl.expected.msl
@@ -0,0 +1,82 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int f1_(constant buf0& x_8, constant buf1& x_11, thread float4* const tint_symbol_5) {
+  int a = 0;
+  int i = 0;
+  a = 256;
+  float const x_65 = (*(tint_symbol_5)).y;
+  float const x_67 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_65 > x_67)) {
+    int const x_71 = a;
+    a = (x_71 + 1);
+  }
+  int const x_73 = a;
+  i = popcount(x_73);
+  int const x_75 = i;
+  int const x_77 = x_11.x_GLF_uniform_int_values.arr[0].el;
+  if ((x_75 < x_77)) {
+    int const x_82 = x_11.x_GLF_uniform_int_values.arr[0].el;
+    return x_82;
+  }
+  int const x_83 = i;
+  return x_83;
+}
+
+void main_1(constant buf0& x_8, constant buf1& x_11, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  int a_1 = 0;
+  int const x_38 = f1_(x_8, x_11, tint_symbol_6);
+  a_1 = x_38;
+  int const x_39 = a_1;
+  int const x_41 = x_11.x_GLF_uniform_int_values.arr[2].el;
+  if ((x_39 == x_41)) {
+    int const x_47 = x_11.x_GLF_uniform_int_values.arr[0].el;
+    int const x_50 = x_11.x_GLF_uniform_int_values.arr[1].el;
+    int const x_53 = x_11.x_GLF_uniform_int_values.arr[1].el;
+    int const x_56 = x_11.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_7) = float4(float(x_47), float(x_50), float(x_53), float(x_56));
+  } else {
+    int const x_60 = x_11.x_GLF_uniform_int_values.arr[1].el;
+    float const x_61 = float(x_60);
+    *(tint_symbol_7) = float4(x_61, x_61, x_61, x_61);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_8 [[buffer(0)]], constant buf1& x_11 [[buffer(1)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_8, x_11, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..f6ad901
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,171 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 102
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_11 "x_11"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %f1_ "f1_"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %main_1 "main_1"
+               OpName %a_1 "a_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_11 NonWritable
+               OpDecorate %x_11 DescriptorSet 0
+               OpDecorate %x_11 Binding 1
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_11 = OpVariable %_ptr_Uniform_buf1 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+         %23 = OpTypeFunction %int
+%_ptr_Function_int = OpTypePointer Function %int
+         %28 = OpConstantNull %int
+    %int_256 = OpConstant %int 256
+%_ptr_Private_float = OpTypePointer Private %float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %void = OpTypeVoid
+         %58 = OpTypeFunction %void
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+         %89 = OpTypeFunction %void %main_out
+        %f1_ = OpFunction %int None %23
+         %25 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %28
+          %i = OpVariable %_ptr_Function_int Function %28
+               OpStore %a %int_256
+         %32 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %33 = OpLoad %float %32
+         %37 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %38 = OpLoad %float %37
+         %39 = OpFOrdGreaterThan %bool %33 %38
+               OpSelectionMerge %41 None
+               OpBranchConditional %39 %42 %41
+         %42 = OpLabel
+         %43 = OpLoad %int %a
+         %45 = OpIAdd %int %43 %int_1
+               OpStore %a %45
+               OpBranch %41
+         %41 = OpLabel
+         %46 = OpLoad %int %a
+         %47 = OpBitCount %int %46
+               OpStore %i %47
+         %48 = OpLoad %int %i
+         %50 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+         %51 = OpLoad %int %50
+         %52 = OpSLessThan %bool %48 %51
+               OpSelectionMerge %53 None
+               OpBranchConditional %52 %54 %53
+         %54 = OpLabel
+         %55 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+         %56 = OpLoad %int %55
+               OpReturnValue %56
+         %53 = OpLabel
+         %57 = OpLoad %int %i
+               OpReturnValue %57
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %58
+         %61 = OpLabel
+        %a_1 = OpVariable %_ptr_Function_int Function %28
+         %63 = OpFunctionCall %int %f1_
+               OpStore %a_1 %63
+         %64 = OpLoad %int %a_1
+         %66 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_2
+         %67 = OpLoad %int %66
+         %68 = OpIEqual %bool %64 %67
+               OpSelectionMerge %69 None
+               OpBranchConditional %68 %70 %71
+         %70 = OpLabel
+         %72 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+         %73 = OpLoad %int %72
+         %74 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+         %75 = OpLoad %int %74
+         %76 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+         %77 = OpLoad %int %76
+         %78 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+         %79 = OpLoad %int %78
+         %80 = OpConvertSToF %float %73
+         %81 = OpConvertSToF %float %75
+         %82 = OpConvertSToF %float %77
+         %83 = OpConvertSToF %float %79
+         %84 = OpCompositeConstruct %v4float %80 %81 %82 %83
+               OpStore %x_GLF_color %84
+               OpBranch %69
+         %71 = OpLabel
+         %85 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+         %86 = OpLoad %int %85
+         %87 = OpConvertSToF %float %86
+         %88 = OpCompositeConstruct %v4float %87 %87 %87 %87
+               OpStore %x_GLF_color %88
+               OpBranch %69
+         %69 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %89
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %93 = OpLabel
+         %94 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %94
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %58
+         %96 = OpLabel
+         %97 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %97
+         %98 = OpFunctionCall %void %main_1
+        %100 = OpLoad %v4float %x_GLF_color
+        %101 = OpCompositeConstruct %main_out %100
+         %99 = OpFunctionCall %void %tint_symbol_3 %101
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..a14b4cb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-bitcount/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,75 @@
+type Arr = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_11 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn f1_() -> i32 {
+  var a : i32;
+  var i : i32;
+  a = 256;
+  let x_65 : f32 = gl_FragCoord.y;
+  let x_67 : f32 = x_8.x_GLF_uniform_float_values[0];
+  if ((x_65 > x_67)) {
+    let x_71 : i32 = a;
+    a = (x_71 + 1);
+  }
+  let x_73 : i32 = a;
+  i = countOneBits(x_73);
+  let x_75 : i32 = i;
+  let x_77 : i32 = x_11.x_GLF_uniform_int_values[0];
+  if ((x_75 < x_77)) {
+    let x_82 : i32 = x_11.x_GLF_uniform_int_values[0];
+    return x_82;
+  }
+  let x_83 : i32 = i;
+  return x_83;
+}
+
+fn main_1() {
+  var a_1 : i32;
+  let x_38 : i32 = f1_();
+  a_1 = x_38;
+  let x_39 : i32 = a_1;
+  let x_41 : i32 = x_11.x_GLF_uniform_int_values[2];
+  if ((x_39 == x_41)) {
+    let x_47 : i32 = x_11.x_GLF_uniform_int_values[0];
+    let x_50 : i32 = x_11.x_GLF_uniform_int_values[1];
+    let x_53 : i32 = x_11.x_GLF_uniform_int_values[1];
+    let x_56 : i32 = x_11.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_47), f32(x_50), f32(x_53), f32(x_56));
+  } else {
+    let x_60 : i32 = x_11.x_GLF_uniform_int_values[1];
+    let x_61 : f32 = f32(x_60);
+    x_GLF_color = vec4<f32>(x_61, x_61, x_61, x_61);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-bitfieldreverse-loop-limit-underflow/0.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-bitfieldreverse-loop-limit-underflow/0.spvasm
new file mode 100644
index 0000000..cc1186f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-bitfieldreverse-loop-limit-underflow/0.spvasm
@@ -0,0 +1,91 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %int_1 = OpConstant %int 1
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+      %int_3 = OpConstant %int 3
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %8
+         %22 = OpLabel
+         %23 = OpBitReverse %int %int_1
+         %24 = OpExtInst %int %1 SMin %int_1 %23
+         %25 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %26 = OpLoad %int %25
+               OpBranch %27
+         %27 = OpLabel
+         %28 = OpPhi %int %26 %22 %29 %30
+         %31 = OpPhi %int %int_1 %22 %32 %30
+         %33 = OpISub %int %24 %int_1
+         %34 = OpSLessThanEqual %bool %31 %33
+               OpLoopMerge %35 %30 None
+               OpBranchConditional %34 %36 %35
+         %36 = OpLabel
+         %29 = OpIAdd %int %28 %31
+         %37 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %38 = OpLoad %int %37
+         %39 = OpIEqual %bool %38 %int_1
+               OpSelectionMerge %40 None
+               OpBranchConditional %39 %41 %40
+         %41 = OpLabel
+               OpBranch %35
+         %40 = OpLabel
+               OpBranch %30
+         %30 = OpLabel
+         %32 = OpIAdd %int %31 %int_1
+               OpBranch %27
+         %35 = OpLabel
+         %42 = OpPhi %int %28 %27 %29 %41
+         %43 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %44 = OpLoad %int %43
+         %45 = OpIEqual %bool %42 %44
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %48
+         %47 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %50 = OpLoad %int %49
+         %51 = OpConvertSToF %float %50
+         %52 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %53 = OpLoad %int %52
+         %54 = OpConvertSToF %float %53
+         %55 = OpCompositeConstruct %v4float %51 %54 %54 %51
+               OpStore %_GLF_color %55
+               OpBranch %46
+         %48 = OpLabel
+         %56 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %57 = OpLoad %int %56
+         %58 = OpConvertSToF %float %57
+         %59 = OpCompositeConstruct %v4float %58 %58 %58 %58
+               OpStore %_GLF_color %59
+               OpBranch %46
+         %46 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-bitfieldreverse-loop-limit-underflow/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-bitfieldreverse-loop-limit-underflow/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..d241a8e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-bitfieldreverse-loop-limit-underflow/0.spvasm.expected.hlsl
@@ -0,0 +1,67 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int x_28 = 0;
+  int x_29 = 0;
+  int x_28_phi = 0;
+  int x_31_phi = 0;
+  int x_42_phi = 0;
+  const int x_24 = min(1, reversebits(1));
+  const int x_26 = asint(x_5[3].x);
+  x_28_phi = x_26;
+  x_31_phi = 1;
+  while (true) {
+    int x_32 = 0;
+    x_28 = x_28_phi;
+    const int x_31 = x_31_phi;
+    x_42_phi = x_28;
+    if ((x_31 <= (x_24 - 1))) {
+    } else {
+      break;
+    }
+    x_29 = asint((x_28 + asint(x_31)));
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_38 = asint(x_5[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_38 == 1)) {
+      x_42_phi = x_29;
+      break;
+    }
+    {
+      x_32 = (x_31 + 1);
+      x_28_phi = x_29;
+      x_31_phi = x_32;
+    }
+  }
+  const int x_42 = x_42_phi;
+  const int x_44 = asint(x_5[2].x);
+  if ((x_42 == x_44)) {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_50 = asint(x_5[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const float x_51 = float(x_50);
+    const int x_53 = asint(x_5[1].x);
+    const float x_54 = float(x_53);
+    x_GLF_color = float4(x_51, x_54, x_54, x_51);
+  } else {
+    const int x_57 = asint(x_5[1].x);
+    const float x_58 = float(x_57);
+    x_GLF_color = float4(x_58, x_58, x_58, x_58);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-bitfieldreverse-loop-limit-underflow/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-bitfieldreverse-loop-limit-underflow/0.spvasm.expected.msl
new file mode 100644
index 0000000..971d8fe
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-bitfieldreverse-loop-limit-underflow/0.spvasm.expected.msl
@@ -0,0 +1,75 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  int x_28 = 0;
+  int x_29 = 0;
+  int x_28_phi = 0;
+  int x_31_phi = 0;
+  int x_42_phi = 0;
+  int const x_24 = min(1, reverse_bits(1));
+  int const x_26 = x_5.x_GLF_uniform_int_values.arr[3].el;
+  x_28_phi = x_26;
+  x_31_phi = 1;
+  while (true) {
+    int x_32 = 0;
+    x_28 = x_28_phi;
+    int const x_31 = x_31_phi;
+    x_42_phi = x_28;
+    if ((x_31 <= (x_24 - 1))) {
+    } else {
+      break;
+    }
+    x_29 = as_type<int>((x_28 + as_type<int>(x_31)));
+    int const x_38 = x_5.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_38 == 1)) {
+      x_42_phi = x_29;
+      break;
+    }
+    {
+      x_32 = (x_31 + 1);
+      x_28_phi = x_29;
+      x_31_phi = x_32;
+    }
+  }
+  int const x_42 = x_42_phi;
+  int const x_44 = x_5.x_GLF_uniform_int_values.arr[2].el;
+  if ((x_42 == x_44)) {
+    int const x_50 = x_5.x_GLF_uniform_int_values.arr[0].el;
+    float const x_51 = float(x_50);
+    int const x_53 = x_5.x_GLF_uniform_int_values.arr[1].el;
+    float const x_54 = float(x_53);
+    *(tint_symbol_4) = float4(x_51, x_54, x_54, x_51);
+  } else {
+    int const x_57 = x_5.x_GLF_uniform_int_values.arr[1].el;
+    float const x_58 = float(x_57);
+    *(tint_symbol_4) = float4(x_58, x_58, x_58, x_58);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-bitfieldreverse-loop-limit-underflow/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-bitfieldreverse-loop-limit-underflow/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..5d23f77
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-bitfieldreverse-loop-limit-underflow/0.spvasm.expected.spvasm
@@ -0,0 +1,161 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 94
+; Schema: 0
+               OpCapability Shader
+         %27 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_28 "x_28"
+               OpName %x_29 "x_29"
+               OpName %x_28_phi "x_28_phi"
+               OpName %x_31_phi "x_31_phi"
+               OpName %x_42_phi "x_42_phi"
+               OpName %x_32 "x_32"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+      %int_1 = OpConstant %int 1
+     %uint_0 = OpConstant %uint 0
+      %int_3 = OpConstant %int 3
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+         %82 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+       %x_28 = OpVariable %_ptr_Function_int Function %21
+       %x_29 = OpVariable %_ptr_Function_int Function %21
+   %x_28_phi = OpVariable %_ptr_Function_int Function %21
+   %x_31_phi = OpVariable %_ptr_Function_int Function %21
+   %x_42_phi = OpVariable %_ptr_Function_int Function %21
+       %x_32 = OpVariable %_ptr_Function_int Function %21
+         %29 = OpBitReverse %int %int_1
+         %26 = OpExtInst %int %27 SMin %int_1 %29
+         %33 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_3
+         %34 = OpLoad %int %33
+               OpStore %x_28_phi %34
+               OpStore %x_31_phi %int_1
+               OpBranch %35
+         %35 = OpLabel
+               OpLoopMerge %36 %37 None
+               OpBranch %38
+         %38 = OpLabel
+         %40 = OpLoad %int %x_28_phi
+               OpStore %x_28 %40
+         %41 = OpLoad %int %x_31_phi
+         %42 = OpLoad %int %x_28
+               OpStore %x_42_phi %42
+         %43 = OpISub %int %26 %int_1
+         %44 = OpSLessThanEqual %bool %41 %43
+               OpSelectionMerge %46 None
+               OpBranchConditional %44 %47 %48
+         %47 = OpLabel
+               OpBranch %46
+         %48 = OpLabel
+               OpBranch %36
+         %46 = OpLabel
+         %50 = OpLoad %int %x_28
+         %51 = OpCopyObject %int %41
+         %52 = OpIAdd %int %50 %51
+         %49 = OpCopyObject %int %52
+               OpStore %x_29 %49
+         %54 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %55 = OpLoad %int %54
+         %56 = OpIEqual %bool %55 %int_1
+               OpSelectionMerge %57 None
+               OpBranchConditional %56 %58 %57
+         %58 = OpLabel
+         %59 = OpLoad %int %x_29
+               OpStore %x_42_phi %59
+               OpBranch %36
+         %57 = OpLabel
+               OpBranch %37
+         %37 = OpLabel
+         %60 = OpIAdd %int %41 %int_1
+               OpStore %x_32 %60
+         %61 = OpLoad %int %x_29
+               OpStore %x_28_phi %61
+         %62 = OpLoad %int %x_32
+               OpStore %x_31_phi %62
+               OpBranch %35
+         %36 = OpLabel
+         %63 = OpLoad %int %x_42_phi
+         %65 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_2
+         %66 = OpLoad %int %65
+         %67 = OpIEqual %bool %63 %66
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %70
+         %69 = OpLabel
+         %71 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %72 = OpLoad %int %71
+         %73 = OpConvertSToF %float %72
+         %74 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %75 = OpLoad %int %74
+         %76 = OpConvertSToF %float %75
+         %77 = OpCompositeConstruct %v4float %73 %76 %76 %73
+               OpStore %x_GLF_color %77
+               OpBranch %68
+         %70 = OpLabel
+         %78 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %79 = OpLoad %int %78
+         %80 = OpConvertSToF %float %79
+         %81 = OpCompositeConstruct %v4float %80 %80 %80 %80
+               OpStore %x_GLF_color %81
+               OpBranch %68
+         %68 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %82
+%tint_symbol = OpFunctionParameter %main_out
+         %86 = OpLabel
+         %87 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %87
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %89 = OpLabel
+         %90 = OpFunctionCall %void %main_1
+         %92 = OpLoad %v4float %x_GLF_color
+         %93 = OpCompositeConstruct %main_out %92
+         %91 = OpFunctionCall %void %tint_symbol_2 %93
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-bitfieldreverse-loop-limit-underflow/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-bitfieldreverse-loop-limit-underflow/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..c0b46ef
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-bitfieldreverse-loop-limit-underflow/0.spvasm.expected.wgsl
@@ -0,0 +1,69 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_28 : i32;
+  var x_29 : i32;
+  var x_28_phi : i32;
+  var x_31_phi : i32;
+  var x_42_phi : i32;
+  let x_24 : i32 = min(1, reverseBits(1));
+  let x_26 : i32 = x_5.x_GLF_uniform_int_values[3];
+  x_28_phi = x_26;
+  x_31_phi = 1;
+  loop {
+    var x_32 : i32;
+    x_28 = x_28_phi;
+    let x_31 : i32 = x_31_phi;
+    x_42_phi = x_28;
+    if ((x_31 <= (x_24 - 1))) {
+    } else {
+      break;
+    }
+    x_29 = bitcast<i32>((x_28 + bitcast<i32>(x_31)));
+    let x_38 : i32 = x_5.x_GLF_uniform_int_values[0];
+    if ((x_38 == 1)) {
+      x_42_phi = x_29;
+      break;
+    }
+
+    continuing {
+      x_32 = (x_31 + 1);
+      x_28_phi = x_29;
+      x_31_phi = x_32;
+    }
+  }
+  let x_42 : i32 = x_42_phi;
+  let x_44 : i32 = x_5.x_GLF_uniform_int_values[2];
+  if ((x_42 == x_44)) {
+    let x_50 : i32 = x_5.x_GLF_uniform_int_values[0];
+    let x_51 : f32 = f32(x_50);
+    let x_53 : i32 = x_5.x_GLF_uniform_int_values[1];
+    let x_54 : f32 = f32(x_53);
+    x_GLF_color = vec4<f32>(x_51, x_54, x_54, x_51);
+  } else {
+    let x_57 : i32 = x_5.x_GLF_uniform_int_values[1];
+    let x_58 : f32 = f32(x_57);
+    x_GLF_color = vec4<f32>(x_58, x_58, x_58, x_58);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-bitfieldreverse-loop-limit-underflow/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-bitfieldreverse-loop-limit-underflow/0.wgsl
new file mode 100644
index 0000000..c0b46ef
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-bitfieldreverse-loop-limit-underflow/0.wgsl
@@ -0,0 +1,69 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_28 : i32;
+  var x_29 : i32;
+  var x_28_phi : i32;
+  var x_31_phi : i32;
+  var x_42_phi : i32;
+  let x_24 : i32 = min(1, reverseBits(1));
+  let x_26 : i32 = x_5.x_GLF_uniform_int_values[3];
+  x_28_phi = x_26;
+  x_31_phi = 1;
+  loop {
+    var x_32 : i32;
+    x_28 = x_28_phi;
+    let x_31 : i32 = x_31_phi;
+    x_42_phi = x_28;
+    if ((x_31 <= (x_24 - 1))) {
+    } else {
+      break;
+    }
+    x_29 = bitcast<i32>((x_28 + bitcast<i32>(x_31)));
+    let x_38 : i32 = x_5.x_GLF_uniform_int_values[0];
+    if ((x_38 == 1)) {
+      x_42_phi = x_29;
+      break;
+    }
+
+    continuing {
+      x_32 = (x_31 + 1);
+      x_28_phi = x_29;
+      x_31_phi = x_32;
+    }
+  }
+  let x_42 : i32 = x_42_phi;
+  let x_44 : i32 = x_5.x_GLF_uniform_int_values[2];
+  if ((x_42 == x_44)) {
+    let x_50 : i32 = x_5.x_GLF_uniform_int_values[0];
+    let x_51 : f32 = f32(x_50);
+    let x_53 : i32 = x_5.x_GLF_uniform_int_values[1];
+    let x_54 : f32 = f32(x_53);
+    x_GLF_color = vec4<f32>(x_51, x_54, x_54, x_51);
+  } else {
+    let x_57 : i32 = x_5.x_GLF_uniform_int_values[1];
+    let x_58 : f32 = f32(x_57);
+    x_GLF_color = vec4<f32>(x_58, x_58, x_58, x_58);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-bitfieldreverse-loop-limit-underflow/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-bitfieldreverse-loop-limit-underflow/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..d241a8e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-bitfieldreverse-loop-limit-underflow/0.wgsl.expected.hlsl
@@ -0,0 +1,67 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int x_28 = 0;
+  int x_29 = 0;
+  int x_28_phi = 0;
+  int x_31_phi = 0;
+  int x_42_phi = 0;
+  const int x_24 = min(1, reversebits(1));
+  const int x_26 = asint(x_5[3].x);
+  x_28_phi = x_26;
+  x_31_phi = 1;
+  while (true) {
+    int x_32 = 0;
+    x_28 = x_28_phi;
+    const int x_31 = x_31_phi;
+    x_42_phi = x_28;
+    if ((x_31 <= (x_24 - 1))) {
+    } else {
+      break;
+    }
+    x_29 = asint((x_28 + asint(x_31)));
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_38 = asint(x_5[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_38 == 1)) {
+      x_42_phi = x_29;
+      break;
+    }
+    {
+      x_32 = (x_31 + 1);
+      x_28_phi = x_29;
+      x_31_phi = x_32;
+    }
+  }
+  const int x_42 = x_42_phi;
+  const int x_44 = asint(x_5[2].x);
+  if ((x_42 == x_44)) {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_50 = asint(x_5[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const float x_51 = float(x_50);
+    const int x_53 = asint(x_5[1].x);
+    const float x_54 = float(x_53);
+    x_GLF_color = float4(x_51, x_54, x_54, x_51);
+  } else {
+    const int x_57 = asint(x_5[1].x);
+    const float x_58 = float(x_57);
+    x_GLF_color = float4(x_58, x_58, x_58, x_58);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-bitfieldreverse-loop-limit-underflow/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-bitfieldreverse-loop-limit-underflow/0.wgsl.expected.msl
new file mode 100644
index 0000000..971d8fe
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-bitfieldreverse-loop-limit-underflow/0.wgsl.expected.msl
@@ -0,0 +1,75 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  int x_28 = 0;
+  int x_29 = 0;
+  int x_28_phi = 0;
+  int x_31_phi = 0;
+  int x_42_phi = 0;
+  int const x_24 = min(1, reverse_bits(1));
+  int const x_26 = x_5.x_GLF_uniform_int_values.arr[3].el;
+  x_28_phi = x_26;
+  x_31_phi = 1;
+  while (true) {
+    int x_32 = 0;
+    x_28 = x_28_phi;
+    int const x_31 = x_31_phi;
+    x_42_phi = x_28;
+    if ((x_31 <= (x_24 - 1))) {
+    } else {
+      break;
+    }
+    x_29 = as_type<int>((x_28 + as_type<int>(x_31)));
+    int const x_38 = x_5.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_38 == 1)) {
+      x_42_phi = x_29;
+      break;
+    }
+    {
+      x_32 = (x_31 + 1);
+      x_28_phi = x_29;
+      x_31_phi = x_32;
+    }
+  }
+  int const x_42 = x_42_phi;
+  int const x_44 = x_5.x_GLF_uniform_int_values.arr[2].el;
+  if ((x_42 == x_44)) {
+    int const x_50 = x_5.x_GLF_uniform_int_values.arr[0].el;
+    float const x_51 = float(x_50);
+    int const x_53 = x_5.x_GLF_uniform_int_values.arr[1].el;
+    float const x_54 = float(x_53);
+    *(tint_symbol_4) = float4(x_51, x_54, x_54, x_51);
+  } else {
+    int const x_57 = x_5.x_GLF_uniform_int_values.arr[1].el;
+    float const x_58 = float(x_57);
+    *(tint_symbol_4) = float4(x_58, x_58, x_58, x_58);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-bitfieldreverse-loop-limit-underflow/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-bitfieldreverse-loop-limit-underflow/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..5d23f77
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-bitfieldreverse-loop-limit-underflow/0.wgsl.expected.spvasm
@@ -0,0 +1,161 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 94
+; Schema: 0
+               OpCapability Shader
+         %27 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_28 "x_28"
+               OpName %x_29 "x_29"
+               OpName %x_28_phi "x_28_phi"
+               OpName %x_31_phi "x_31_phi"
+               OpName %x_42_phi "x_42_phi"
+               OpName %x_32 "x_32"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+      %int_1 = OpConstant %int 1
+     %uint_0 = OpConstant %uint 0
+      %int_3 = OpConstant %int 3
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+         %82 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+       %x_28 = OpVariable %_ptr_Function_int Function %21
+       %x_29 = OpVariable %_ptr_Function_int Function %21
+   %x_28_phi = OpVariable %_ptr_Function_int Function %21
+   %x_31_phi = OpVariable %_ptr_Function_int Function %21
+   %x_42_phi = OpVariable %_ptr_Function_int Function %21
+       %x_32 = OpVariable %_ptr_Function_int Function %21
+         %29 = OpBitReverse %int %int_1
+         %26 = OpExtInst %int %27 SMin %int_1 %29
+         %33 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_3
+         %34 = OpLoad %int %33
+               OpStore %x_28_phi %34
+               OpStore %x_31_phi %int_1
+               OpBranch %35
+         %35 = OpLabel
+               OpLoopMerge %36 %37 None
+               OpBranch %38
+         %38 = OpLabel
+         %40 = OpLoad %int %x_28_phi
+               OpStore %x_28 %40
+         %41 = OpLoad %int %x_31_phi
+         %42 = OpLoad %int %x_28
+               OpStore %x_42_phi %42
+         %43 = OpISub %int %26 %int_1
+         %44 = OpSLessThanEqual %bool %41 %43
+               OpSelectionMerge %46 None
+               OpBranchConditional %44 %47 %48
+         %47 = OpLabel
+               OpBranch %46
+         %48 = OpLabel
+               OpBranch %36
+         %46 = OpLabel
+         %50 = OpLoad %int %x_28
+         %51 = OpCopyObject %int %41
+         %52 = OpIAdd %int %50 %51
+         %49 = OpCopyObject %int %52
+               OpStore %x_29 %49
+         %54 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %55 = OpLoad %int %54
+         %56 = OpIEqual %bool %55 %int_1
+               OpSelectionMerge %57 None
+               OpBranchConditional %56 %58 %57
+         %58 = OpLabel
+         %59 = OpLoad %int %x_29
+               OpStore %x_42_phi %59
+               OpBranch %36
+         %57 = OpLabel
+               OpBranch %37
+         %37 = OpLabel
+         %60 = OpIAdd %int %41 %int_1
+               OpStore %x_32 %60
+         %61 = OpLoad %int %x_29
+               OpStore %x_28_phi %61
+         %62 = OpLoad %int %x_32
+               OpStore %x_31_phi %62
+               OpBranch %35
+         %36 = OpLabel
+         %63 = OpLoad %int %x_42_phi
+         %65 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_2
+         %66 = OpLoad %int %65
+         %67 = OpIEqual %bool %63 %66
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %70
+         %69 = OpLabel
+         %71 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %72 = OpLoad %int %71
+         %73 = OpConvertSToF %float %72
+         %74 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %75 = OpLoad %int %74
+         %76 = OpConvertSToF %float %75
+         %77 = OpCompositeConstruct %v4float %73 %76 %76 %73
+               OpStore %x_GLF_color %77
+               OpBranch %68
+         %70 = OpLabel
+         %78 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %79 = OpLoad %int %78
+         %80 = OpConvertSToF %float %79
+         %81 = OpCompositeConstruct %v4float %80 %80 %80 %80
+               OpStore %x_GLF_color %81
+               OpBranch %68
+         %68 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %82
+%tint_symbol = OpFunctionParameter %main_out
+         %86 = OpLabel
+         %87 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %87
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %89 = OpLabel
+         %90 = OpFunctionCall %void %main_1
+         %92 = OpLoad %v4float %x_GLF_color
+         %93 = OpCompositeConstruct %main_out %92
+         %91 = OpFunctionCall %void %tint_symbol_2 %93
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-bitfieldreverse-loop-limit-underflow/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-bitfieldreverse-loop-limit-underflow/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..c0b46ef
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-bitfieldreverse-loop-limit-underflow/0.wgsl.expected.wgsl
@@ -0,0 +1,69 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_28 : i32;
+  var x_29 : i32;
+  var x_28_phi : i32;
+  var x_31_phi : i32;
+  var x_42_phi : i32;
+  let x_24 : i32 = min(1, reverseBits(1));
+  let x_26 : i32 = x_5.x_GLF_uniform_int_values[3];
+  x_28_phi = x_26;
+  x_31_phi = 1;
+  loop {
+    var x_32 : i32;
+    x_28 = x_28_phi;
+    let x_31 : i32 = x_31_phi;
+    x_42_phi = x_28;
+    if ((x_31 <= (x_24 - 1))) {
+    } else {
+      break;
+    }
+    x_29 = bitcast<i32>((x_28 + bitcast<i32>(x_31)));
+    let x_38 : i32 = x_5.x_GLF_uniform_int_values[0];
+    if ((x_38 == 1)) {
+      x_42_phi = x_29;
+      break;
+    }
+
+    continuing {
+      x_32 = (x_31 + 1);
+      x_28_phi = x_29;
+      x_31_phi = x_32;
+    }
+  }
+  let x_42 : i32 = x_42_phi;
+  let x_44 : i32 = x_5.x_GLF_uniform_int_values[2];
+  if ((x_42 == x_44)) {
+    let x_50 : i32 = x_5.x_GLF_uniform_int_values[0];
+    let x_51 : f32 = f32(x_50);
+    let x_53 : i32 = x_5.x_GLF_uniform_int_values[1];
+    let x_54 : f32 = f32(x_53);
+    x_GLF_color = vec4<f32>(x_51, x_54, x_54, x_51);
+  } else {
+    let x_57 : i32 = x_5.x_GLF_uniform_int_values[1];
+    let x_58 : f32 = f32(x_57);
+    x_GLF_color = vec4<f32>(x_58, x_58, x_58, x_58);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-bitwise-inverse-uniform-condition/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-bitwise-inverse-uniform-condition/0-opt.spvasm
new file mode 100644
index 0000000..5b2a258
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-bitwise-inverse-uniform-condition/0-opt.spvasm
@@ -0,0 +1,119 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "zero"
+               OpName %_ ""
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %__1 ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %buf2 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 2
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__1 DescriptorSet 0
+               OpDecorate %__1 Binding 1
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %float = OpTypeFloat 32
+       %buf2 = OpTypeStruct %float
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+          %_ = OpVariable %_ptr_Uniform_buf2 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+       %bool = OpTypeBool
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__1 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %14
+         %31 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+         %32 = OpVariable %_ptr_Function_int Function
+         %33 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %34 = OpLoad %float %33
+         %35 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %36 = OpLoad %float %35
+         %37 = OpFOrdLessThan %bool %34 %36
+               OpSelectionMerge %38 None
+               OpBranchConditional %37 %39 %40
+         %39 = OpLabel
+         %41 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_1
+         %42 = OpLoad %int %41
+               OpStore %32 %42
+               OpBranch %38
+         %40 = OpLabel
+         %43 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_0
+         %44 = OpLoad %int %43
+               OpStore %32 %44
+               OpBranch %38
+         %38 = OpLabel
+         %45 = OpLoad %int %32
+         %46 = OpBitwiseOr %int %45 %int_1
+         %47 = OpNot %int %46
+               OpStore %a %47
+         %48 = OpLoad %int %a
+         %49 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_0
+         %50 = OpLoad %int %49
+         %51 = OpNot %int %50
+         %52 = OpIEqual %bool %48 %51
+               OpSelectionMerge %53 None
+               OpBranchConditional %52 %54 %55
+         %54 = OpLabel
+         %56 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_0
+         %57 = OpLoad %int %56
+         %58 = OpConvertSToF %float %57
+         %59 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_1
+         %60 = OpLoad %int %59
+         %61 = OpConvertSToF %float %60
+         %62 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_1
+         %63 = OpLoad %int %62
+         %64 = OpConvertSToF %float %63
+         %65 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_0
+         %66 = OpLoad %int %65
+         %67 = OpConvertSToF %float %66
+         %68 = OpCompositeConstruct %v4float %58 %61 %64 %67
+               OpStore %_GLF_color %68
+               OpBranch %53
+         %55 = OpLabel
+         %69 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_1
+         %70 = OpLoad %int %69
+         %71 = OpConvertSToF %float %70
+         %72 = OpCompositeConstruct %v4float %71 %71 %71 %71
+               OpStore %_GLF_color %72
+               OpBranch %53
+         %53 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-bitwise-inverse-uniform-condition/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-bitwise-inverse-uniform-condition/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..53fa4d4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-bitwise-inverse-uniform-condition/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,58 @@
+cbuffer cbuffer_x_6 : register(b2, space0) {
+  uint4 x_6[1];
+};
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[1];
+};
+cbuffer cbuffer_x_10 : register(b1, space0) {
+  uint4 x_10[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  int x_32 = 0;
+  const float x_34 = asfloat(x_6[0].x);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_36 = asfloat(x_8[scalar_offset / 4][scalar_offset % 4]);
+  if ((x_34 < x_36)) {
+    const int x_42 = asint(x_10[1].x);
+    x_32 = x_42;
+  } else {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_44 = asint(x_10[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    x_32 = x_44;
+  }
+  a = ~((x_32 | 1));
+  const int x_48 = a;
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const int x_50 = asint(x_10[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  if ((x_48 == ~(x_50))) {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_57 = asint(x_10[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const int x_60 = asint(x_10[1].x);
+    const int x_63 = asint(x_10[1].x);
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_66 = asint(x_10[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    x_GLF_color = float4(float(x_57), float(x_60), float(x_63), float(x_66));
+  } else {
+    const int x_70 = asint(x_10[1].x);
+    const float x_71 = float(x_70);
+    x_GLF_color = float4(x_71, x_71, x_71, x_71);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-bitwise-inverse-uniform-condition/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-bitwise-inverse-uniform-condition/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..d5bab81
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-bitwise-inverse-uniform-condition/0-opt.spvasm.expected.msl
@@ -0,0 +1,71 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf2 {
+  /* 0x0000 */ float zero;
+};
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf2& x_6, constant buf0& x_8, constant buf1& x_10, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int x_32 = 0;
+  float const x_34 = x_6.zero;
+  float const x_36 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_34 < x_36)) {
+    int const x_42 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    x_32 = x_42;
+  } else {
+    int const x_44 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    x_32 = x_44;
+  }
+  int const x_45 = x_32;
+  a = ~((x_45 | 1));
+  int const x_48 = a;
+  int const x_50 = x_10.x_GLF_uniform_int_values.arr[0].el;
+  if ((x_48 == ~(x_50))) {
+    int const x_57 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    int const x_60 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_63 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_66 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_57), float(x_60), float(x_63), float(x_66));
+  } else {
+    int const x_70 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    float const x_71 = float(x_70);
+    *(tint_symbol_4) = float4(x_71, x_71, x_71, x_71);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf2& x_6 [[buffer(2)]], constant buf0& x_8 [[buffer(0)]], constant buf1& x_10 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-bitwise-inverse-uniform-condition/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-bitwise-inverse-uniform-condition/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..2144540
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-bitwise-inverse-uniform-condition/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,155 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 89
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "zero"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %x_32 "x_32"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf2 Block
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 2
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf2 = OpTypeStruct %float
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+        %x_6 = OpVariable %_ptr_Uniform_buf2 Uniform
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_10 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %20 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %20
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %20
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+         %77 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %23
+         %26 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %29
+       %x_32 = OpVariable %_ptr_Function_int Function %29
+         %33 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0
+         %34 = OpLoad %float %33
+         %36 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %37 = OpLoad %float %36
+         %38 = OpFOrdLessThan %bool %34 %37
+               OpSelectionMerge %40 None
+               OpBranchConditional %38 %41 %42
+         %41 = OpLabel
+         %45 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %46 = OpLoad %int %45
+               OpStore %x_32 %46
+               OpBranch %40
+         %42 = OpLabel
+         %47 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %48 = OpLoad %int %47
+               OpStore %x_32 %48
+               OpBranch %40
+         %40 = OpLabel
+         %49 = OpLoad %int %x_32
+         %51 = OpBitwiseOr %int %49 %int_1
+         %50 = OpNot %int %51
+               OpStore %a %50
+         %52 = OpLoad %int %a
+         %53 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %54 = OpLoad %int %53
+         %55 = OpNot %int %54
+         %56 = OpIEqual %bool %52 %55
+               OpSelectionMerge %57 None
+               OpBranchConditional %56 %58 %59
+         %58 = OpLabel
+         %60 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %61 = OpLoad %int %60
+         %62 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %63 = OpLoad %int %62
+         %64 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %65 = OpLoad %int %64
+         %66 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %67 = OpLoad %int %66
+         %68 = OpConvertSToF %float %61
+         %69 = OpConvertSToF %float %63
+         %70 = OpConvertSToF %float %65
+         %71 = OpConvertSToF %float %67
+         %72 = OpCompositeConstruct %v4float %68 %69 %70 %71
+               OpStore %x_GLF_color %72
+               OpBranch %57
+         %59 = OpLabel
+         %73 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %74 = OpLoad %int %73
+         %75 = OpConvertSToF %float %74
+         %76 = OpCompositeConstruct %v4float %75 %75 %75 %75
+               OpStore %x_GLF_color %76
+               OpBranch %57
+         %57 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %77
+%tint_symbol = OpFunctionParameter %main_out
+         %81 = OpLabel
+         %82 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %82
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %23
+         %84 = OpLabel
+         %85 = OpFunctionCall %void %main_1
+         %87 = OpLoad %v4float %x_GLF_color
+         %88 = OpCompositeConstruct %main_out %87
+         %86 = OpFunctionCall %void %tint_symbol_2 %88
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-bitwise-inverse-uniform-condition/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-bitwise-inverse-uniform-condition/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..1e307de
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-bitwise-inverse-uniform-condition/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,67 @@
+[[block]]
+struct buf2 {
+  zero : f32;
+};
+
+type Arr = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(2)]] var<uniform> x_6 : buf2;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var x_32 : i32;
+  let x_34 : f32 = x_6.zero;
+  let x_36 : f32 = x_8.x_GLF_uniform_float_values[0];
+  if ((x_34 < x_36)) {
+    let x_42 : i32 = x_10.x_GLF_uniform_int_values[1];
+    x_32 = x_42;
+  } else {
+    let x_44 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_32 = x_44;
+  }
+  let x_45 : i32 = x_32;
+  a = ~((x_45 | 1));
+  let x_48 : i32 = a;
+  let x_50 : i32 = x_10.x_GLF_uniform_int_values[0];
+  if ((x_48 == ~(x_50))) {
+    let x_57 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_60 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_63 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_66 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_57), f32(x_60), f32(x_63), f32(x_66));
+  } else {
+    let x_70 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_71 : f32 = f32(x_70);
+    x_GLF_color = vec4<f32>(x_71, x_71, x_71, x_71);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-bitwise-inverse-uniform-condition/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-bitwise-inverse-uniform-condition/0-opt.wgsl
new file mode 100644
index 0000000..1e307de
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-bitwise-inverse-uniform-condition/0-opt.wgsl
@@ -0,0 +1,67 @@
+[[block]]
+struct buf2 {
+  zero : f32;
+};
+
+type Arr = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(2)]] var<uniform> x_6 : buf2;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var x_32 : i32;
+  let x_34 : f32 = x_6.zero;
+  let x_36 : f32 = x_8.x_GLF_uniform_float_values[0];
+  if ((x_34 < x_36)) {
+    let x_42 : i32 = x_10.x_GLF_uniform_int_values[1];
+    x_32 = x_42;
+  } else {
+    let x_44 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_32 = x_44;
+  }
+  let x_45 : i32 = x_32;
+  a = ~((x_45 | 1));
+  let x_48 : i32 = a;
+  let x_50 : i32 = x_10.x_GLF_uniform_int_values[0];
+  if ((x_48 == ~(x_50))) {
+    let x_57 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_60 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_63 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_66 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_57), f32(x_60), f32(x_63), f32(x_66));
+  } else {
+    let x_70 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_71 : f32 = f32(x_70);
+    x_GLF_color = vec4<f32>(x_71, x_71, x_71, x_71);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-bitwise-inverse-uniform-condition/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-bitwise-inverse-uniform-condition/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..53fa4d4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-bitwise-inverse-uniform-condition/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,58 @@
+cbuffer cbuffer_x_6 : register(b2, space0) {
+  uint4 x_6[1];
+};
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[1];
+};
+cbuffer cbuffer_x_10 : register(b1, space0) {
+  uint4 x_10[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  int x_32 = 0;
+  const float x_34 = asfloat(x_6[0].x);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_36 = asfloat(x_8[scalar_offset / 4][scalar_offset % 4]);
+  if ((x_34 < x_36)) {
+    const int x_42 = asint(x_10[1].x);
+    x_32 = x_42;
+  } else {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_44 = asint(x_10[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    x_32 = x_44;
+  }
+  a = ~((x_32 | 1));
+  const int x_48 = a;
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const int x_50 = asint(x_10[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  if ((x_48 == ~(x_50))) {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_57 = asint(x_10[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const int x_60 = asint(x_10[1].x);
+    const int x_63 = asint(x_10[1].x);
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_66 = asint(x_10[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    x_GLF_color = float4(float(x_57), float(x_60), float(x_63), float(x_66));
+  } else {
+    const int x_70 = asint(x_10[1].x);
+    const float x_71 = float(x_70);
+    x_GLF_color = float4(x_71, x_71, x_71, x_71);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-bitwise-inverse-uniform-condition/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-bitwise-inverse-uniform-condition/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..d5bab81
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-bitwise-inverse-uniform-condition/0-opt.wgsl.expected.msl
@@ -0,0 +1,71 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf2 {
+  /* 0x0000 */ float zero;
+};
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf2& x_6, constant buf0& x_8, constant buf1& x_10, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int x_32 = 0;
+  float const x_34 = x_6.zero;
+  float const x_36 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_34 < x_36)) {
+    int const x_42 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    x_32 = x_42;
+  } else {
+    int const x_44 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    x_32 = x_44;
+  }
+  int const x_45 = x_32;
+  a = ~((x_45 | 1));
+  int const x_48 = a;
+  int const x_50 = x_10.x_GLF_uniform_int_values.arr[0].el;
+  if ((x_48 == ~(x_50))) {
+    int const x_57 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    int const x_60 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_63 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_66 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_57), float(x_60), float(x_63), float(x_66));
+  } else {
+    int const x_70 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    float const x_71 = float(x_70);
+    *(tint_symbol_4) = float4(x_71, x_71, x_71, x_71);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf2& x_6 [[buffer(2)]], constant buf0& x_8 [[buffer(0)]], constant buf1& x_10 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-bitwise-inverse-uniform-condition/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-bitwise-inverse-uniform-condition/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..2144540
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-bitwise-inverse-uniform-condition/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,155 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 89
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "zero"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %x_32 "x_32"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf2 Block
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 2
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf2 = OpTypeStruct %float
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+        %x_6 = OpVariable %_ptr_Uniform_buf2 Uniform
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_10 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %20 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %20
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %20
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+         %77 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %23
+         %26 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %29
+       %x_32 = OpVariable %_ptr_Function_int Function %29
+         %33 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0
+         %34 = OpLoad %float %33
+         %36 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %37 = OpLoad %float %36
+         %38 = OpFOrdLessThan %bool %34 %37
+               OpSelectionMerge %40 None
+               OpBranchConditional %38 %41 %42
+         %41 = OpLabel
+         %45 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %46 = OpLoad %int %45
+               OpStore %x_32 %46
+               OpBranch %40
+         %42 = OpLabel
+         %47 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %48 = OpLoad %int %47
+               OpStore %x_32 %48
+               OpBranch %40
+         %40 = OpLabel
+         %49 = OpLoad %int %x_32
+         %51 = OpBitwiseOr %int %49 %int_1
+         %50 = OpNot %int %51
+               OpStore %a %50
+         %52 = OpLoad %int %a
+         %53 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %54 = OpLoad %int %53
+         %55 = OpNot %int %54
+         %56 = OpIEqual %bool %52 %55
+               OpSelectionMerge %57 None
+               OpBranchConditional %56 %58 %59
+         %58 = OpLabel
+         %60 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %61 = OpLoad %int %60
+         %62 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %63 = OpLoad %int %62
+         %64 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %65 = OpLoad %int %64
+         %66 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %67 = OpLoad %int %66
+         %68 = OpConvertSToF %float %61
+         %69 = OpConvertSToF %float %63
+         %70 = OpConvertSToF %float %65
+         %71 = OpConvertSToF %float %67
+         %72 = OpCompositeConstruct %v4float %68 %69 %70 %71
+               OpStore %x_GLF_color %72
+               OpBranch %57
+         %59 = OpLabel
+         %73 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %74 = OpLoad %int %73
+         %75 = OpConvertSToF %float %74
+         %76 = OpCompositeConstruct %v4float %75 %75 %75 %75
+               OpStore %x_GLF_color %76
+               OpBranch %57
+         %57 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %77
+%tint_symbol = OpFunctionParameter %main_out
+         %81 = OpLabel
+         %82 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %82
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %23
+         %84 = OpLabel
+         %85 = OpFunctionCall %void %main_1
+         %87 = OpLoad %v4float %x_GLF_color
+         %88 = OpCompositeConstruct %main_out %87
+         %86 = OpFunctionCall %void %tint_symbol_2 %88
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-bitwise-inverse-uniform-condition/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-bitwise-inverse-uniform-condition/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..1e307de
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-bitwise-inverse-uniform-condition/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,67 @@
+[[block]]
+struct buf2 {
+  zero : f32;
+};
+
+type Arr = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(2)]] var<uniform> x_6 : buf2;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var x_32 : i32;
+  let x_34 : f32 = x_6.zero;
+  let x_36 : f32 = x_8.x_GLF_uniform_float_values[0];
+  if ((x_34 < x_36)) {
+    let x_42 : i32 = x_10.x_GLF_uniform_int_values[1];
+    x_32 = x_42;
+  } else {
+    let x_44 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_32 = x_44;
+  }
+  let x_45 : i32 = x_32;
+  a = ~((x_45 | 1));
+  let x_48 : i32 = a;
+  let x_50 : i32 = x_10.x_GLF_uniform_int_values[0];
+  if ((x_48 == ~(x_50))) {
+    let x_57 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_60 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_63 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_66 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_57), f32(x_60), f32(x_63), f32(x_66));
+  } else {
+    let x_70 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_71 : f32 = f32(x_70);
+    x_GLF_color = vec4<f32>(x_71, x_71, x_71, x_71);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.spvasm
new file mode 100644
index 0000000..a53bb72
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.spvasm
@@ -0,0 +1,229 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %c "c"
+               OpName %a "a"
+               OpName %i1 "i1"
+               OpName %i2 "i2"
+               OpName %i3 "i3"
+               OpName %i4 "i4"
+               OpName %i5 "i5"
+               OpName %i6 "i6"
+               OpName %i7 "i7"
+               OpName %i8 "i8"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %16 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %22 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+     %int_17 = OpConstant %int 17
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+   %float_n1 = OpConstant %float -1
+     %uint_1 = OpConstant %uint 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %16
+         %37 = OpLabel
+          %c = OpVariable %_ptr_Function_v4float Function
+          %a = OpVariable %_ptr_Function_int Function
+         %i1 = OpVariable %_ptr_Function_int Function
+         %i2 = OpVariable %_ptr_Function_int Function
+         %i3 = OpVariable %_ptr_Function_int Function
+         %i4 = OpVariable %_ptr_Function_int Function
+         %i5 = OpVariable %_ptr_Function_int Function
+         %i6 = OpVariable %_ptr_Function_int Function
+         %i7 = OpVariable %_ptr_Function_int Function
+         %i8 = OpVariable %_ptr_Function_int Function
+               OpStore %c %22
+               OpStore %a %int_0
+               OpBranch %38
+         %38 = OpLabel
+               OpLoopMerge %39 %40 None
+               OpBranch %41
+         %41 = OpLabel
+               OpBranch %42
+         %42 = OpLabel
+               OpLoopMerge %43 %44 None
+               OpBranch %45
+         %45 = OpLabel
+         %46 = OpLoad %int %a
+         %47 = OpAccessChain %_ptr_Function_float %c %46
+               OpStore %47 %float_1
+               OpStore %i1 %int_0
+               OpBranch %48
+         %48 = OpLabel
+               OpLoopMerge %49 %50 None
+               OpBranch %51
+         %51 = OpLabel
+         %52 = OpLoad %int %i1
+         %53 = OpSLessThan %bool %52 %int_1
+               OpBranchConditional %53 %54 %49
+         %54 = OpLabel
+               OpStore %i2 %int_0
+               OpBranch %55
+         %55 = OpLabel
+               OpLoopMerge %56 %57 None
+               OpBranch %58
+         %58 = OpLabel
+         %59 = OpLoad %int %i2
+         %60 = OpSLessThan %bool %59 %int_1
+               OpBranchConditional %60 %61 %56
+         %61 = OpLabel
+               OpStore %i3 %int_0
+               OpBranch %62
+         %62 = OpLabel
+               OpLoopMerge %63 %64 None
+               OpBranch %65
+         %65 = OpLabel
+         %66 = OpLoad %int %i3
+         %67 = OpSLessThan %bool %66 %int_1
+               OpBranchConditional %67 %68 %63
+         %68 = OpLabel
+               OpStore %i4 %int_0
+               OpBranch %69
+         %69 = OpLabel
+               OpLoopMerge %70 %71 None
+               OpBranch %72
+         %72 = OpLabel
+         %73 = OpLoad %int %i4
+         %74 = OpSLessThan %bool %73 %int_1
+               OpBranchConditional %74 %75 %70
+         %75 = OpLabel
+               OpStore %i5 %int_0
+               OpBranch %76
+         %76 = OpLabel
+               OpLoopMerge %77 %78 None
+               OpBranch %79
+         %79 = OpLabel
+         %80 = OpLoad %int %i5
+         %81 = OpSLessThan %bool %80 %int_1
+               OpBranchConditional %81 %82 %77
+         %82 = OpLabel
+               OpStore %i6 %int_0
+               OpBranch %83
+         %83 = OpLabel
+               OpLoopMerge %84 %85 None
+               OpBranch %86
+         %86 = OpLabel
+         %87 = OpLoad %int %i6
+         %88 = OpSLessThan %bool %87 %int_1
+               OpBranchConditional %88 %89 %84
+         %89 = OpLabel
+               OpStore %i7 %int_0
+               OpBranch %90
+         %90 = OpLabel
+               OpLoopMerge %91 %92 None
+               OpBranch %93
+         %93 = OpLabel
+         %94 = OpLoad %int %i7
+         %95 = OpSLessThan %bool %94 %int_1
+               OpBranchConditional %95 %96 %91
+         %96 = OpLabel
+               OpStore %i8 %int_0
+               OpBranch %97
+         %97 = OpLabel
+               OpLoopMerge %98 %99 None
+               OpBranch %100
+        %100 = OpLabel
+        %101 = OpLoad %int %i8
+        %102 = OpSLessThan %bool %101 %int_17
+               OpBranchConditional %102 %103 %98
+        %103 = OpLabel
+        %104 = OpLoad %int %a
+        %105 = OpIAdd %int %104 %int_1
+               OpStore %a %105
+               OpBranch %99
+         %99 = OpLabel
+        %106 = OpLoad %int %i8
+        %107 = OpIAdd %int %106 %int_1
+               OpStore %i8 %107
+               OpBranch %97
+         %98 = OpLabel
+               OpBranch %92
+         %92 = OpLabel
+        %108 = OpLoad %int %i7
+        %109 = OpIAdd %int %108 %int_1
+               OpStore %i7 %109
+               OpBranch %90
+         %91 = OpLabel
+               OpBranch %85
+         %85 = OpLabel
+        %110 = OpLoad %int %i6
+        %111 = OpIAdd %int %110 %int_1
+               OpStore %i6 %111
+               OpBranch %83
+         %84 = OpLabel
+               OpBranch %78
+         %78 = OpLabel
+        %112 = OpLoad %int %i5
+        %113 = OpIAdd %int %112 %int_1
+               OpStore %i5 %113
+               OpBranch %76
+         %77 = OpLabel
+               OpBranch %71
+         %71 = OpLabel
+        %114 = OpLoad %int %i4
+        %115 = OpIAdd %int %114 %int_1
+               OpStore %i4 %115
+               OpBranch %69
+         %70 = OpLabel
+               OpBranch %64
+         %64 = OpLabel
+        %116 = OpLoad %int %i3
+        %117 = OpIAdd %int %116 %int_1
+               OpStore %i3 %117
+               OpBranch %62
+         %63 = OpLabel
+               OpBranch %57
+         %57 = OpLabel
+        %118 = OpLoad %int %i2
+        %119 = OpIAdd %int %118 %int_1
+               OpStore %i2 %119
+               OpBranch %55
+         %56 = OpLabel
+               OpBranch %50
+         %50 = OpLabel
+        %120 = OpLoad %int %i1
+        %121 = OpIAdd %int %120 %int_1
+               OpStore %i1 %121
+               OpBranch %48
+         %49 = OpLabel
+               OpBranch %44
+         %44 = OpLabel
+        %122 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+        %123 = OpLoad %float %122
+        %124 = OpFOrdLessThan %bool %123 %float_n1
+               OpBranchConditional %124 %42 %43
+         %43 = OpLabel
+               OpBranch %40
+         %40 = OpLabel
+        %125 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %126 = OpLoad %float %125
+        %127 = OpFOrdLessThan %bool %126 %float_n1
+               OpBranchConditional %127 %38 %39
+         %39 = OpLabel
+        %128 = OpLoad %v4float %c
+               OpStore %_GLF_color %128
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..400e058
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,102 @@
+void set_float4(inout float4 vec, int idx, float val) {
+  vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
+}
+
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 c = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int a = 0;
+  int i1 = 0;
+  int i2 = 0;
+  int i3 = 0;
+  int i4 = 0;
+  int i5 = 0;
+  int i6 = 0;
+  int i7 = 0;
+  int i8_1 = 0;
+  c = float4(0.0f, 0.0f, 0.0f, 1.0f);
+  a = 0;
+  while (true) {
+    while (true) {
+      set_float4(c, a, 1.0f);
+      i1 = 0;
+      {
+        for(; (i1 < 1); i1 = (i1 + 1)) {
+          i2 = 0;
+          {
+            for(; (i2 < 1); i2 = (i2 + 1)) {
+              i3 = 0;
+              {
+                for(; (i3 < 1); i3 = (i3 + 1)) {
+                  i4 = 0;
+                  {
+                    for(; (i4 < 1); i4 = (i4 + 1)) {
+                      i5 = 0;
+                      {
+                        for(; (i5 < 1); i5 = (i5 + 1)) {
+                          i6 = 0;
+                          {
+                            for(; (i6 < 1); i6 = (i6 + 1)) {
+                              i7 = 0;
+                              {
+                                for(; (i7 < 1); i7 = (i7 + 1)) {
+                                  i8_1 = 0;
+                                  {
+                                    for(; (i8_1 < 17); i8_1 = (i8_1 + 1)) {
+                                      a = (a + 1);
+                                    }
+                                  }
+                                }
+                              }
+                            }
+                          }
+                        }
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+      {
+        const float x_123 = gl_FragCoord.x;
+        if ((x_123 < -1.0f)) {
+        } else {
+          break;
+        }
+      }
+    }
+    {
+      const float x_126 = gl_FragCoord.y;
+      if ((x_126 < -1.0f)) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_GLF_color = c;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..5e6ba53
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.spvasm.expected.msl
@@ -0,0 +1,156 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float4 c = 0.0f;
+  int a = 0;
+  int i1 = 0;
+  int i2 = 0;
+  int i3 = 0;
+  int i4 = 0;
+  int i5 = 0;
+  int i6 = 0;
+  int i7 = 0;
+  int i8_1 = 0;
+  c = float4(0.0f, 0.0f, 0.0f, 1.0f);
+  a = 0;
+  while (true) {
+    while (true) {
+      int const x_46 = a;
+      c[x_46] = 1.0f;
+      i1 = 0;
+      while (true) {
+        int const x_52 = i1;
+        if ((x_52 < 1)) {
+        } else {
+          break;
+        }
+        i2 = 0;
+        while (true) {
+          int const x_59 = i2;
+          if ((x_59 < 1)) {
+          } else {
+            break;
+          }
+          i3 = 0;
+          while (true) {
+            int const x_66 = i3;
+            if ((x_66 < 1)) {
+            } else {
+              break;
+            }
+            i4 = 0;
+            while (true) {
+              int const x_73 = i4;
+              if ((x_73 < 1)) {
+              } else {
+                break;
+              }
+              i5 = 0;
+              while (true) {
+                int const x_80 = i5;
+                if ((x_80 < 1)) {
+                } else {
+                  break;
+                }
+                i6 = 0;
+                while (true) {
+                  int const x_87 = i6;
+                  if ((x_87 < 1)) {
+                  } else {
+                    break;
+                  }
+                  i7 = 0;
+                  while (true) {
+                    int const x_94 = i7;
+                    if ((x_94 < 1)) {
+                    } else {
+                      break;
+                    }
+                    i8_1 = 0;
+                    while (true) {
+                      int const x_101 = i8_1;
+                      if ((x_101 < 17)) {
+                      } else {
+                        break;
+                      }
+                      int const x_104 = a;
+                      a = (x_104 + 1);
+                      {
+                        int const x_106 = i8_1;
+                        i8_1 = (x_106 + 1);
+                      }
+                    }
+                    {
+                      int const x_108 = i7;
+                      i7 = (x_108 + 1);
+                    }
+                  }
+                  {
+                    int const x_110 = i6;
+                    i6 = (x_110 + 1);
+                  }
+                }
+                {
+                  int const x_112 = i5;
+                  i5 = (x_112 + 1);
+                }
+              }
+              {
+                int const x_114 = i4;
+                i4 = (x_114 + 1);
+              }
+            }
+            {
+              int const x_116 = i3;
+              i3 = (x_116 + 1);
+            }
+          }
+          {
+            int const x_118 = i2;
+            i2 = (x_118 + 1);
+          }
+        }
+        {
+          int const x_120 = i1;
+          i1 = (x_120 + 1);
+        }
+      }
+      {
+        float const x_123 = (*(tint_symbol_5)).x;
+        if ((x_123 < -1.0f)) {
+        } else {
+          break;
+        }
+      }
+    }
+    {
+      float const x_126 = (*(tint_symbol_5)).y;
+      if ((x_126 < -1.0f)) {
+      } else {
+        break;
+      }
+    }
+  }
+  float4 const x_128 = c;
+  *(tint_symbol_6) = x_128;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(&(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..dde7eba
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,323 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 168
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %c "c"
+               OpName %a "a"
+               OpName %i1 "i1"
+               OpName %i2 "i2"
+               OpName %i3 "i3"
+               OpName %i4 "i4"
+               OpName %i5 "i5"
+               OpName %i6 "i6"
+               OpName %i7 "i7"
+               OpName %i8_1 "i8_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %20 = OpConstantNull %int
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %31 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+      %int_0 = OpConstant %int 0
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+     %int_17 = OpConstant %int 17
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+   %float_n1 = OpConstant %float -1
+     %uint_1 = OpConstant %uint 1
+   %main_out = OpTypeStruct %v4float
+        %155 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+          %c = OpVariable %_ptr_Function_v4float Function %5
+          %a = OpVariable %_ptr_Function_int Function %20
+         %i1 = OpVariable %_ptr_Function_int Function %20
+         %i2 = OpVariable %_ptr_Function_int Function %20
+         %i3 = OpVariable %_ptr_Function_int Function %20
+         %i4 = OpVariable %_ptr_Function_int Function %20
+         %i5 = OpVariable %_ptr_Function_int Function %20
+         %i6 = OpVariable %_ptr_Function_int Function %20
+         %i7 = OpVariable %_ptr_Function_int Function %20
+       %i8_1 = OpVariable %_ptr_Function_int Function %20
+               OpStore %c %31
+               OpStore %a %int_0
+               OpBranch %33
+         %33 = OpLabel
+               OpLoopMerge %34 %35 None
+               OpBranch %36
+         %36 = OpLabel
+               OpBranch %37
+         %37 = OpLabel
+               OpLoopMerge %38 %39 None
+               OpBranch %40
+         %40 = OpLabel
+         %41 = OpLoad %int %a
+         %43 = OpAccessChain %_ptr_Function_float %c %41
+               OpStore %43 %float_1
+               OpStore %i1 %int_0
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %48 = OpLoad %int %i1
+         %50 = OpSLessThan %bool %48 %int_1
+               OpSelectionMerge %52 None
+               OpBranchConditional %50 %53 %54
+         %53 = OpLabel
+               OpBranch %52
+         %54 = OpLabel
+               OpBranch %45
+         %52 = OpLabel
+               OpStore %i2 %int_0
+               OpBranch %55
+         %55 = OpLabel
+               OpLoopMerge %56 %57 None
+               OpBranch %58
+         %58 = OpLabel
+         %59 = OpLoad %int %i2
+         %60 = OpSLessThan %bool %59 %int_1
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %63
+         %62 = OpLabel
+               OpBranch %61
+         %63 = OpLabel
+               OpBranch %56
+         %61 = OpLabel
+               OpStore %i3 %int_0
+               OpBranch %64
+         %64 = OpLabel
+               OpLoopMerge %65 %66 None
+               OpBranch %67
+         %67 = OpLabel
+         %68 = OpLoad %int %i3
+         %69 = OpSLessThan %bool %68 %int_1
+               OpSelectionMerge %70 None
+               OpBranchConditional %69 %71 %72
+         %71 = OpLabel
+               OpBranch %70
+         %72 = OpLabel
+               OpBranch %65
+         %70 = OpLabel
+               OpStore %i4 %int_0
+               OpBranch %73
+         %73 = OpLabel
+               OpLoopMerge %74 %75 None
+               OpBranch %76
+         %76 = OpLabel
+         %77 = OpLoad %int %i4
+         %78 = OpSLessThan %bool %77 %int_1
+               OpSelectionMerge %79 None
+               OpBranchConditional %78 %80 %81
+         %80 = OpLabel
+               OpBranch %79
+         %81 = OpLabel
+               OpBranch %74
+         %79 = OpLabel
+               OpStore %i5 %int_0
+               OpBranch %82
+         %82 = OpLabel
+               OpLoopMerge %83 %84 None
+               OpBranch %85
+         %85 = OpLabel
+         %86 = OpLoad %int %i5
+         %87 = OpSLessThan %bool %86 %int_1
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %90
+         %89 = OpLabel
+               OpBranch %88
+         %90 = OpLabel
+               OpBranch %83
+         %88 = OpLabel
+               OpStore %i6 %int_0
+               OpBranch %91
+         %91 = OpLabel
+               OpLoopMerge %92 %93 None
+               OpBranch %94
+         %94 = OpLabel
+         %95 = OpLoad %int %i6
+         %96 = OpSLessThan %bool %95 %int_1
+               OpSelectionMerge %97 None
+               OpBranchConditional %96 %98 %99
+         %98 = OpLabel
+               OpBranch %97
+         %99 = OpLabel
+               OpBranch %92
+         %97 = OpLabel
+               OpStore %i7 %int_0
+               OpBranch %100
+        %100 = OpLabel
+               OpLoopMerge %101 %102 None
+               OpBranch %103
+        %103 = OpLabel
+        %104 = OpLoad %int %i7
+        %105 = OpSLessThan %bool %104 %int_1
+               OpSelectionMerge %106 None
+               OpBranchConditional %105 %107 %108
+        %107 = OpLabel
+               OpBranch %106
+        %108 = OpLabel
+               OpBranch %101
+        %106 = OpLabel
+               OpStore %i8_1 %int_0
+               OpBranch %109
+        %109 = OpLabel
+               OpLoopMerge %110 %111 None
+               OpBranch %112
+        %112 = OpLabel
+        %113 = OpLoad %int %i8_1
+        %115 = OpSLessThan %bool %113 %int_17
+               OpSelectionMerge %116 None
+               OpBranchConditional %115 %117 %118
+        %117 = OpLabel
+               OpBranch %116
+        %118 = OpLabel
+               OpBranch %110
+        %116 = OpLabel
+        %119 = OpLoad %int %a
+        %120 = OpIAdd %int %119 %int_1
+               OpStore %a %120
+               OpBranch %111
+        %111 = OpLabel
+        %121 = OpLoad %int %i8_1
+        %122 = OpIAdd %int %121 %int_1
+               OpStore %i8_1 %122
+               OpBranch %109
+        %110 = OpLabel
+               OpBranch %102
+        %102 = OpLabel
+        %123 = OpLoad %int %i7
+        %124 = OpIAdd %int %123 %int_1
+               OpStore %i7 %124
+               OpBranch %100
+        %101 = OpLabel
+               OpBranch %93
+         %93 = OpLabel
+        %125 = OpLoad %int %i6
+        %126 = OpIAdd %int %125 %int_1
+               OpStore %i6 %126
+               OpBranch %91
+         %92 = OpLabel
+               OpBranch %84
+         %84 = OpLabel
+        %127 = OpLoad %int %i5
+        %128 = OpIAdd %int %127 %int_1
+               OpStore %i5 %128
+               OpBranch %82
+         %83 = OpLabel
+               OpBranch %75
+         %75 = OpLabel
+        %129 = OpLoad %int %i4
+        %130 = OpIAdd %int %129 %int_1
+               OpStore %i4 %130
+               OpBranch %73
+         %74 = OpLabel
+               OpBranch %66
+         %66 = OpLabel
+        %131 = OpLoad %int %i3
+        %132 = OpIAdd %int %131 %int_1
+               OpStore %i3 %132
+               OpBranch %64
+         %65 = OpLabel
+               OpBranch %57
+         %57 = OpLabel
+        %133 = OpLoad %int %i2
+        %134 = OpIAdd %int %133 %int_1
+               OpStore %i2 %134
+               OpBranch %55
+         %56 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+        %135 = OpLoad %int %i1
+        %136 = OpIAdd %int %135 %int_1
+               OpStore %i1 %136
+               OpBranch %44
+         %45 = OpLabel
+               OpBranch %39
+         %39 = OpLabel
+        %140 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+        %141 = OpLoad %float %140
+        %143 = OpFOrdLessThan %bool %141 %float_n1
+               OpSelectionMerge %144 None
+               OpBranchConditional %143 %145 %146
+        %145 = OpLabel
+               OpBranch %144
+        %146 = OpLabel
+               OpBranch %38
+        %144 = OpLabel
+               OpBranch %37
+         %38 = OpLabel
+               OpBranch %35
+         %35 = OpLabel
+        %148 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %149 = OpLoad %float %148
+        %150 = OpFOrdLessThan %bool %149 %float_n1
+               OpSelectionMerge %151 None
+               OpBranchConditional %150 %152 %153
+        %152 = OpLabel
+               OpBranch %151
+        %153 = OpLabel
+               OpBranch %34
+        %151 = OpLabel
+               OpBranch %33
+         %34 = OpLabel
+        %154 = OpLoad %v4float %c
+               OpStore %x_GLF_color %154
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %155
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %159 = OpLabel
+        %160 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %160
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+        %162 = OpLabel
+        %163 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %163
+        %164 = OpFunctionCall %void %main_1
+        %166 = OpLoad %v4float %x_GLF_color
+        %167 = OpCompositeConstruct %main_out %166
+        %165 = OpFunctionCall %void %tint_symbol_3 %167
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 35[%35] is not post dominated by the back-edge block 151[%151]
+  %151 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..73515b9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,161 @@
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var c : vec4<f32>;
+  var a : i32;
+  var i1 : i32;
+  var i2 : i32;
+  var i3 : i32;
+  var i4 : i32;
+  var i5 : i32;
+  var i6 : i32;
+  var i7 : i32;
+  var i8_1 : i32;
+  c = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  a = 0;
+  loop {
+    loop {
+      let x_46 : i32 = a;
+      c[x_46] = 1.0;
+      i1 = 0;
+      loop {
+        let x_52 : i32 = i1;
+        if ((x_52 < 1)) {
+        } else {
+          break;
+        }
+        i2 = 0;
+        loop {
+          let x_59 : i32 = i2;
+          if ((x_59 < 1)) {
+          } else {
+            break;
+          }
+          i3 = 0;
+          loop {
+            let x_66 : i32 = i3;
+            if ((x_66 < 1)) {
+            } else {
+              break;
+            }
+            i4 = 0;
+            loop {
+              let x_73 : i32 = i4;
+              if ((x_73 < 1)) {
+              } else {
+                break;
+              }
+              i5 = 0;
+              loop {
+                let x_80 : i32 = i5;
+                if ((x_80 < 1)) {
+                } else {
+                  break;
+                }
+                i6 = 0;
+                loop {
+                  let x_87 : i32 = i6;
+                  if ((x_87 < 1)) {
+                  } else {
+                    break;
+                  }
+                  i7 = 0;
+                  loop {
+                    let x_94 : i32 = i7;
+                    if ((x_94 < 1)) {
+                    } else {
+                      break;
+                    }
+                    i8_1 = 0;
+                    loop {
+                      let x_101 : i32 = i8_1;
+                      if ((x_101 < 17)) {
+                      } else {
+                        break;
+                      }
+                      let x_104 : i32 = a;
+                      a = (x_104 + 1);
+
+                      continuing {
+                        let x_106 : i32 = i8_1;
+                        i8_1 = (x_106 + 1);
+                      }
+                    }
+
+                    continuing {
+                      let x_108 : i32 = i7;
+                      i7 = (x_108 + 1);
+                    }
+                  }
+
+                  continuing {
+                    let x_110 : i32 = i6;
+                    i6 = (x_110 + 1);
+                  }
+                }
+
+                continuing {
+                  let x_112 : i32 = i5;
+                  i5 = (x_112 + 1);
+                }
+              }
+
+              continuing {
+                let x_114 : i32 = i4;
+                i4 = (x_114 + 1);
+              }
+            }
+
+            continuing {
+              let x_116 : i32 = i3;
+              i3 = (x_116 + 1);
+            }
+          }
+
+          continuing {
+            let x_118 : i32 = i2;
+            i2 = (x_118 + 1);
+          }
+        }
+
+        continuing {
+          let x_120 : i32 = i1;
+          i1 = (x_120 + 1);
+        }
+      }
+
+      continuing {
+        let x_123 : f32 = gl_FragCoord.x;
+        if ((x_123 < -1.0)) {
+        } else {
+          break;
+        }
+      }
+    }
+
+    continuing {
+      let x_126 : f32 = gl_FragCoord.y;
+      if ((x_126 < -1.0)) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_128 : vec4<f32> = c;
+  x_GLF_color = x_128;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.wgsl
new file mode 100644
index 0000000..73515b9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.wgsl
@@ -0,0 +1,161 @@
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var c : vec4<f32>;
+  var a : i32;
+  var i1 : i32;
+  var i2 : i32;
+  var i3 : i32;
+  var i4 : i32;
+  var i5 : i32;
+  var i6 : i32;
+  var i7 : i32;
+  var i8_1 : i32;
+  c = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  a = 0;
+  loop {
+    loop {
+      let x_46 : i32 = a;
+      c[x_46] = 1.0;
+      i1 = 0;
+      loop {
+        let x_52 : i32 = i1;
+        if ((x_52 < 1)) {
+        } else {
+          break;
+        }
+        i2 = 0;
+        loop {
+          let x_59 : i32 = i2;
+          if ((x_59 < 1)) {
+          } else {
+            break;
+          }
+          i3 = 0;
+          loop {
+            let x_66 : i32 = i3;
+            if ((x_66 < 1)) {
+            } else {
+              break;
+            }
+            i4 = 0;
+            loop {
+              let x_73 : i32 = i4;
+              if ((x_73 < 1)) {
+              } else {
+                break;
+              }
+              i5 = 0;
+              loop {
+                let x_80 : i32 = i5;
+                if ((x_80 < 1)) {
+                } else {
+                  break;
+                }
+                i6 = 0;
+                loop {
+                  let x_87 : i32 = i6;
+                  if ((x_87 < 1)) {
+                  } else {
+                    break;
+                  }
+                  i7 = 0;
+                  loop {
+                    let x_94 : i32 = i7;
+                    if ((x_94 < 1)) {
+                    } else {
+                      break;
+                    }
+                    i8_1 = 0;
+                    loop {
+                      let x_101 : i32 = i8_1;
+                      if ((x_101 < 17)) {
+                      } else {
+                        break;
+                      }
+                      let x_104 : i32 = a;
+                      a = (x_104 + 1);
+
+                      continuing {
+                        let x_106 : i32 = i8_1;
+                        i8_1 = (x_106 + 1);
+                      }
+                    }
+
+                    continuing {
+                      let x_108 : i32 = i7;
+                      i7 = (x_108 + 1);
+                    }
+                  }
+
+                  continuing {
+                    let x_110 : i32 = i6;
+                    i6 = (x_110 + 1);
+                  }
+                }
+
+                continuing {
+                  let x_112 : i32 = i5;
+                  i5 = (x_112 + 1);
+                }
+              }
+
+              continuing {
+                let x_114 : i32 = i4;
+                i4 = (x_114 + 1);
+              }
+            }
+
+            continuing {
+              let x_116 : i32 = i3;
+              i3 = (x_116 + 1);
+            }
+          }
+
+          continuing {
+            let x_118 : i32 = i2;
+            i2 = (x_118 + 1);
+          }
+        }
+
+        continuing {
+          let x_120 : i32 = i1;
+          i1 = (x_120 + 1);
+        }
+      }
+
+      continuing {
+        let x_123 : f32 = gl_FragCoord.x;
+        if ((x_123 < -1.0)) {
+        } else {
+          break;
+        }
+      }
+    }
+
+    continuing {
+      let x_126 : f32 = gl_FragCoord.y;
+      if ((x_126 < -1.0)) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_128 : vec4<f32> = c;
+  x_GLF_color = x_128;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..400e058
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,102 @@
+void set_float4(inout float4 vec, int idx, float val) {
+  vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
+}
+
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 c = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int a = 0;
+  int i1 = 0;
+  int i2 = 0;
+  int i3 = 0;
+  int i4 = 0;
+  int i5 = 0;
+  int i6 = 0;
+  int i7 = 0;
+  int i8_1 = 0;
+  c = float4(0.0f, 0.0f, 0.0f, 1.0f);
+  a = 0;
+  while (true) {
+    while (true) {
+      set_float4(c, a, 1.0f);
+      i1 = 0;
+      {
+        for(; (i1 < 1); i1 = (i1 + 1)) {
+          i2 = 0;
+          {
+            for(; (i2 < 1); i2 = (i2 + 1)) {
+              i3 = 0;
+              {
+                for(; (i3 < 1); i3 = (i3 + 1)) {
+                  i4 = 0;
+                  {
+                    for(; (i4 < 1); i4 = (i4 + 1)) {
+                      i5 = 0;
+                      {
+                        for(; (i5 < 1); i5 = (i5 + 1)) {
+                          i6 = 0;
+                          {
+                            for(; (i6 < 1); i6 = (i6 + 1)) {
+                              i7 = 0;
+                              {
+                                for(; (i7 < 1); i7 = (i7 + 1)) {
+                                  i8_1 = 0;
+                                  {
+                                    for(; (i8_1 < 17); i8_1 = (i8_1 + 1)) {
+                                      a = (a + 1);
+                                    }
+                                  }
+                                }
+                              }
+                            }
+                          }
+                        }
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+      {
+        const float x_123 = gl_FragCoord.x;
+        if ((x_123 < -1.0f)) {
+        } else {
+          break;
+        }
+      }
+    }
+    {
+      const float x_126 = gl_FragCoord.y;
+      if ((x_126 < -1.0f)) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_GLF_color = c;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..5e6ba53
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.wgsl.expected.msl
@@ -0,0 +1,156 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float4 c = 0.0f;
+  int a = 0;
+  int i1 = 0;
+  int i2 = 0;
+  int i3 = 0;
+  int i4 = 0;
+  int i5 = 0;
+  int i6 = 0;
+  int i7 = 0;
+  int i8_1 = 0;
+  c = float4(0.0f, 0.0f, 0.0f, 1.0f);
+  a = 0;
+  while (true) {
+    while (true) {
+      int const x_46 = a;
+      c[x_46] = 1.0f;
+      i1 = 0;
+      while (true) {
+        int const x_52 = i1;
+        if ((x_52 < 1)) {
+        } else {
+          break;
+        }
+        i2 = 0;
+        while (true) {
+          int const x_59 = i2;
+          if ((x_59 < 1)) {
+          } else {
+            break;
+          }
+          i3 = 0;
+          while (true) {
+            int const x_66 = i3;
+            if ((x_66 < 1)) {
+            } else {
+              break;
+            }
+            i4 = 0;
+            while (true) {
+              int const x_73 = i4;
+              if ((x_73 < 1)) {
+              } else {
+                break;
+              }
+              i5 = 0;
+              while (true) {
+                int const x_80 = i5;
+                if ((x_80 < 1)) {
+                } else {
+                  break;
+                }
+                i6 = 0;
+                while (true) {
+                  int const x_87 = i6;
+                  if ((x_87 < 1)) {
+                  } else {
+                    break;
+                  }
+                  i7 = 0;
+                  while (true) {
+                    int const x_94 = i7;
+                    if ((x_94 < 1)) {
+                    } else {
+                      break;
+                    }
+                    i8_1 = 0;
+                    while (true) {
+                      int const x_101 = i8_1;
+                      if ((x_101 < 17)) {
+                      } else {
+                        break;
+                      }
+                      int const x_104 = a;
+                      a = (x_104 + 1);
+                      {
+                        int const x_106 = i8_1;
+                        i8_1 = (x_106 + 1);
+                      }
+                    }
+                    {
+                      int const x_108 = i7;
+                      i7 = (x_108 + 1);
+                    }
+                  }
+                  {
+                    int const x_110 = i6;
+                    i6 = (x_110 + 1);
+                  }
+                }
+                {
+                  int const x_112 = i5;
+                  i5 = (x_112 + 1);
+                }
+              }
+              {
+                int const x_114 = i4;
+                i4 = (x_114 + 1);
+              }
+            }
+            {
+              int const x_116 = i3;
+              i3 = (x_116 + 1);
+            }
+          }
+          {
+            int const x_118 = i2;
+            i2 = (x_118 + 1);
+          }
+        }
+        {
+          int const x_120 = i1;
+          i1 = (x_120 + 1);
+        }
+      }
+      {
+        float const x_123 = (*(tint_symbol_5)).x;
+        if ((x_123 < -1.0f)) {
+        } else {
+          break;
+        }
+      }
+    }
+    {
+      float const x_126 = (*(tint_symbol_5)).y;
+      if ((x_126 < -1.0f)) {
+      } else {
+        break;
+      }
+    }
+  }
+  float4 const x_128 = c;
+  *(tint_symbol_6) = x_128;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(&(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..dde7eba
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,323 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 168
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %c "c"
+               OpName %a "a"
+               OpName %i1 "i1"
+               OpName %i2 "i2"
+               OpName %i3 "i3"
+               OpName %i4 "i4"
+               OpName %i5 "i5"
+               OpName %i6 "i6"
+               OpName %i7 "i7"
+               OpName %i8_1 "i8_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %20 = OpConstantNull %int
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %31 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+      %int_0 = OpConstant %int 0
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+     %int_17 = OpConstant %int 17
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+   %float_n1 = OpConstant %float -1
+     %uint_1 = OpConstant %uint 1
+   %main_out = OpTypeStruct %v4float
+        %155 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+          %c = OpVariable %_ptr_Function_v4float Function %5
+          %a = OpVariable %_ptr_Function_int Function %20
+         %i1 = OpVariable %_ptr_Function_int Function %20
+         %i2 = OpVariable %_ptr_Function_int Function %20
+         %i3 = OpVariable %_ptr_Function_int Function %20
+         %i4 = OpVariable %_ptr_Function_int Function %20
+         %i5 = OpVariable %_ptr_Function_int Function %20
+         %i6 = OpVariable %_ptr_Function_int Function %20
+         %i7 = OpVariable %_ptr_Function_int Function %20
+       %i8_1 = OpVariable %_ptr_Function_int Function %20
+               OpStore %c %31
+               OpStore %a %int_0
+               OpBranch %33
+         %33 = OpLabel
+               OpLoopMerge %34 %35 None
+               OpBranch %36
+         %36 = OpLabel
+               OpBranch %37
+         %37 = OpLabel
+               OpLoopMerge %38 %39 None
+               OpBranch %40
+         %40 = OpLabel
+         %41 = OpLoad %int %a
+         %43 = OpAccessChain %_ptr_Function_float %c %41
+               OpStore %43 %float_1
+               OpStore %i1 %int_0
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %48 = OpLoad %int %i1
+         %50 = OpSLessThan %bool %48 %int_1
+               OpSelectionMerge %52 None
+               OpBranchConditional %50 %53 %54
+         %53 = OpLabel
+               OpBranch %52
+         %54 = OpLabel
+               OpBranch %45
+         %52 = OpLabel
+               OpStore %i2 %int_0
+               OpBranch %55
+         %55 = OpLabel
+               OpLoopMerge %56 %57 None
+               OpBranch %58
+         %58 = OpLabel
+         %59 = OpLoad %int %i2
+         %60 = OpSLessThan %bool %59 %int_1
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %63
+         %62 = OpLabel
+               OpBranch %61
+         %63 = OpLabel
+               OpBranch %56
+         %61 = OpLabel
+               OpStore %i3 %int_0
+               OpBranch %64
+         %64 = OpLabel
+               OpLoopMerge %65 %66 None
+               OpBranch %67
+         %67 = OpLabel
+         %68 = OpLoad %int %i3
+         %69 = OpSLessThan %bool %68 %int_1
+               OpSelectionMerge %70 None
+               OpBranchConditional %69 %71 %72
+         %71 = OpLabel
+               OpBranch %70
+         %72 = OpLabel
+               OpBranch %65
+         %70 = OpLabel
+               OpStore %i4 %int_0
+               OpBranch %73
+         %73 = OpLabel
+               OpLoopMerge %74 %75 None
+               OpBranch %76
+         %76 = OpLabel
+         %77 = OpLoad %int %i4
+         %78 = OpSLessThan %bool %77 %int_1
+               OpSelectionMerge %79 None
+               OpBranchConditional %78 %80 %81
+         %80 = OpLabel
+               OpBranch %79
+         %81 = OpLabel
+               OpBranch %74
+         %79 = OpLabel
+               OpStore %i5 %int_0
+               OpBranch %82
+         %82 = OpLabel
+               OpLoopMerge %83 %84 None
+               OpBranch %85
+         %85 = OpLabel
+         %86 = OpLoad %int %i5
+         %87 = OpSLessThan %bool %86 %int_1
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %90
+         %89 = OpLabel
+               OpBranch %88
+         %90 = OpLabel
+               OpBranch %83
+         %88 = OpLabel
+               OpStore %i6 %int_0
+               OpBranch %91
+         %91 = OpLabel
+               OpLoopMerge %92 %93 None
+               OpBranch %94
+         %94 = OpLabel
+         %95 = OpLoad %int %i6
+         %96 = OpSLessThan %bool %95 %int_1
+               OpSelectionMerge %97 None
+               OpBranchConditional %96 %98 %99
+         %98 = OpLabel
+               OpBranch %97
+         %99 = OpLabel
+               OpBranch %92
+         %97 = OpLabel
+               OpStore %i7 %int_0
+               OpBranch %100
+        %100 = OpLabel
+               OpLoopMerge %101 %102 None
+               OpBranch %103
+        %103 = OpLabel
+        %104 = OpLoad %int %i7
+        %105 = OpSLessThan %bool %104 %int_1
+               OpSelectionMerge %106 None
+               OpBranchConditional %105 %107 %108
+        %107 = OpLabel
+               OpBranch %106
+        %108 = OpLabel
+               OpBranch %101
+        %106 = OpLabel
+               OpStore %i8_1 %int_0
+               OpBranch %109
+        %109 = OpLabel
+               OpLoopMerge %110 %111 None
+               OpBranch %112
+        %112 = OpLabel
+        %113 = OpLoad %int %i8_1
+        %115 = OpSLessThan %bool %113 %int_17
+               OpSelectionMerge %116 None
+               OpBranchConditional %115 %117 %118
+        %117 = OpLabel
+               OpBranch %116
+        %118 = OpLabel
+               OpBranch %110
+        %116 = OpLabel
+        %119 = OpLoad %int %a
+        %120 = OpIAdd %int %119 %int_1
+               OpStore %a %120
+               OpBranch %111
+        %111 = OpLabel
+        %121 = OpLoad %int %i8_1
+        %122 = OpIAdd %int %121 %int_1
+               OpStore %i8_1 %122
+               OpBranch %109
+        %110 = OpLabel
+               OpBranch %102
+        %102 = OpLabel
+        %123 = OpLoad %int %i7
+        %124 = OpIAdd %int %123 %int_1
+               OpStore %i7 %124
+               OpBranch %100
+        %101 = OpLabel
+               OpBranch %93
+         %93 = OpLabel
+        %125 = OpLoad %int %i6
+        %126 = OpIAdd %int %125 %int_1
+               OpStore %i6 %126
+               OpBranch %91
+         %92 = OpLabel
+               OpBranch %84
+         %84 = OpLabel
+        %127 = OpLoad %int %i5
+        %128 = OpIAdd %int %127 %int_1
+               OpStore %i5 %128
+               OpBranch %82
+         %83 = OpLabel
+               OpBranch %75
+         %75 = OpLabel
+        %129 = OpLoad %int %i4
+        %130 = OpIAdd %int %129 %int_1
+               OpStore %i4 %130
+               OpBranch %73
+         %74 = OpLabel
+               OpBranch %66
+         %66 = OpLabel
+        %131 = OpLoad %int %i3
+        %132 = OpIAdd %int %131 %int_1
+               OpStore %i3 %132
+               OpBranch %64
+         %65 = OpLabel
+               OpBranch %57
+         %57 = OpLabel
+        %133 = OpLoad %int %i2
+        %134 = OpIAdd %int %133 %int_1
+               OpStore %i2 %134
+               OpBranch %55
+         %56 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+        %135 = OpLoad %int %i1
+        %136 = OpIAdd %int %135 %int_1
+               OpStore %i1 %136
+               OpBranch %44
+         %45 = OpLabel
+               OpBranch %39
+         %39 = OpLabel
+        %140 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+        %141 = OpLoad %float %140
+        %143 = OpFOrdLessThan %bool %141 %float_n1
+               OpSelectionMerge %144 None
+               OpBranchConditional %143 %145 %146
+        %145 = OpLabel
+               OpBranch %144
+        %146 = OpLabel
+               OpBranch %38
+        %144 = OpLabel
+               OpBranch %37
+         %38 = OpLabel
+               OpBranch %35
+         %35 = OpLabel
+        %148 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %149 = OpLoad %float %148
+        %150 = OpFOrdLessThan %bool %149 %float_n1
+               OpSelectionMerge %151 None
+               OpBranchConditional %150 %152 %153
+        %152 = OpLabel
+               OpBranch %151
+        %153 = OpLabel
+               OpBranch %34
+        %151 = OpLabel
+               OpBranch %33
+         %34 = OpLabel
+        %154 = OpLoad %v4float %c
+               OpStore %x_GLF_color %154
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %155
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %159 = OpLabel
+        %160 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %160
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+        %162 = OpLabel
+        %163 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %163
+        %164 = OpFunctionCall %void %main_1
+        %166 = OpLoad %v4float %x_GLF_color
+        %167 = OpCompositeConstruct %main_out %166
+        %165 = OpFunctionCall %void %tint_symbol_3 %167
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 35[%35] is not post dominated by the back-edge block 151[%151]
+  %151 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..73515b9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-blockfrequency-several-for-loops/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,161 @@
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var c : vec4<f32>;
+  var a : i32;
+  var i1 : i32;
+  var i2 : i32;
+  var i3 : i32;
+  var i4 : i32;
+  var i5 : i32;
+  var i6 : i32;
+  var i7 : i32;
+  var i8_1 : i32;
+  c = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  a = 0;
+  loop {
+    loop {
+      let x_46 : i32 = a;
+      c[x_46] = 1.0;
+      i1 = 0;
+      loop {
+        let x_52 : i32 = i1;
+        if ((x_52 < 1)) {
+        } else {
+          break;
+        }
+        i2 = 0;
+        loop {
+          let x_59 : i32 = i2;
+          if ((x_59 < 1)) {
+          } else {
+            break;
+          }
+          i3 = 0;
+          loop {
+            let x_66 : i32 = i3;
+            if ((x_66 < 1)) {
+            } else {
+              break;
+            }
+            i4 = 0;
+            loop {
+              let x_73 : i32 = i4;
+              if ((x_73 < 1)) {
+              } else {
+                break;
+              }
+              i5 = 0;
+              loop {
+                let x_80 : i32 = i5;
+                if ((x_80 < 1)) {
+                } else {
+                  break;
+                }
+                i6 = 0;
+                loop {
+                  let x_87 : i32 = i6;
+                  if ((x_87 < 1)) {
+                  } else {
+                    break;
+                  }
+                  i7 = 0;
+                  loop {
+                    let x_94 : i32 = i7;
+                    if ((x_94 < 1)) {
+                    } else {
+                      break;
+                    }
+                    i8_1 = 0;
+                    loop {
+                      let x_101 : i32 = i8_1;
+                      if ((x_101 < 17)) {
+                      } else {
+                        break;
+                      }
+                      let x_104 : i32 = a;
+                      a = (x_104 + 1);
+
+                      continuing {
+                        let x_106 : i32 = i8_1;
+                        i8_1 = (x_106 + 1);
+                      }
+                    }
+
+                    continuing {
+                      let x_108 : i32 = i7;
+                      i7 = (x_108 + 1);
+                    }
+                  }
+
+                  continuing {
+                    let x_110 : i32 = i6;
+                    i6 = (x_110 + 1);
+                  }
+                }
+
+                continuing {
+                  let x_112 : i32 = i5;
+                  i5 = (x_112 + 1);
+                }
+              }
+
+              continuing {
+                let x_114 : i32 = i4;
+                i4 = (x_114 + 1);
+              }
+            }
+
+            continuing {
+              let x_116 : i32 = i3;
+              i3 = (x_116 + 1);
+            }
+          }
+
+          continuing {
+            let x_118 : i32 = i2;
+            i2 = (x_118 + 1);
+          }
+        }
+
+        continuing {
+          let x_120 : i32 = i1;
+          i1 = (x_120 + 1);
+        }
+      }
+
+      continuing {
+        let x_123 : f32 = gl_FragCoord.x;
+        if ((x_123 < -1.0)) {
+        } else {
+          break;
+        }
+      }
+    }
+
+    continuing {
+      let x_126 : f32 = gl_FragCoord.y;
+      if ((x_126 < -1.0)) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_128 : vec4<f32> = c;
+  x_GLF_color = x_128;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-branch-probability-identity-matrix/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-branch-probability-identity-matrix/0-opt.spvasm
new file mode 100644
index 0000000..6808a31
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-branch-probability-identity-matrix/0-opt.spvasm
@@ -0,0 +1,296 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %sums "sums"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %d "d"
+               OpName %indexable "indexable"
+               OpName %indexable_0 "indexable"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpMemberDecorate %buf1 0 RelaxedPrecision
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %16 RelaxedPrecision
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %18 RelaxedPrecision
+               OpDecorate %a RelaxedPrecision
+               OpDecorate %19 RelaxedPrecision
+               OpDecorate %20 RelaxedPrecision
+               OpDecorate %21 RelaxedPrecision
+               OpDecorate %b RelaxedPrecision
+               OpDecorate %22 RelaxedPrecision
+               OpDecorate %23 RelaxedPrecision
+               OpDecorate %24 RelaxedPrecision
+               OpDecorate %c RelaxedPrecision
+               OpDecorate %25 RelaxedPrecision
+               OpDecorate %26 RelaxedPrecision
+               OpDecorate %27 RelaxedPrecision
+               OpDecorate %d RelaxedPrecision
+               OpDecorate %28 RelaxedPrecision
+               OpDecorate %29 RelaxedPrecision
+               OpDecorate %30 RelaxedPrecision
+               OpDecorate %31 RelaxedPrecision
+               OpDecorate %32 RelaxedPrecision
+               OpDecorate %33 RelaxedPrecision
+               OpDecorate %34 RelaxedPrecision
+               OpDecorate %35 RelaxedPrecision
+               OpDecorate %36 RelaxedPrecision
+               OpDecorate %37 RelaxedPrecision
+               OpDecorate %38 RelaxedPrecision
+               OpDecorate %39 RelaxedPrecision
+               OpDecorate %40 RelaxedPrecision
+               OpDecorate %41 RelaxedPrecision
+               OpDecorate %42 RelaxedPrecision
+               OpDecorate %43 RelaxedPrecision
+               OpDecorate %44 RelaxedPrecision
+               OpDecorate %45 RelaxedPrecision
+               OpDecorate %46 RelaxedPrecision
+               OpDecorate %47 RelaxedPrecision
+               OpDecorate %48 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %49 RelaxedPrecision
+               OpDecorate %50 RelaxedPrecision
+               OpDecorate %51 RelaxedPrecision
+               OpDecorate %52 RelaxedPrecision
+               OpDecorate %53 RelaxedPrecision
+       %void = OpTypeVoid
+         %55 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+%_ptr_Function__arr_float_uint_2 = OpTypePointer Function %_arr_float_uint_2
+        %int = OpTypeInt 32 1
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf1 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf0 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_2 = OpConstant %int 2
+%_ptr_Function_int = OpTypePointer Function %int
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+    %v2float = OpTypeVector %float 2
+%mat2v2float = OpTypeMatrix %v2float 2
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+%_ptr_Function_mat2v2float = OpTypePointer Function %mat2v2float
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %55
+         %82 = OpLabel
+       %sums = OpVariable %_ptr_Function__arr_float_uint_2 Function
+          %a = OpVariable %_ptr_Function_int Function
+          %b = OpVariable %_ptr_Function_int Function
+          %c = OpVariable %_ptr_Function_int Function
+          %d = OpVariable %_ptr_Function_int Function
+  %indexable = OpVariable %_ptr_Function_mat2v2float Function
+%indexable_0 = OpVariable %_ptr_Function_mat2v2float Function
+         %83 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %16 = OpLoad %int %83
+         %84 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %85 = OpLoad %float %84
+         %86 = OpFNegate %float %85
+         %87 = OpAccessChain %_ptr_Function_float %sums %16
+               OpStore %87 %86
+         %88 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %18 = OpLoad %int %88
+         %89 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %90 = OpLoad %float %89
+         %91 = OpFNegate %float %90
+         %92 = OpAccessChain %_ptr_Function_float %sums %18
+               OpStore %92 %91
+         %93 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %19 = OpLoad %int %93
+               OpStore %a %19
+               OpBranch %94
+         %94 = OpLabel
+               OpLoopMerge %95 %96 None
+               OpBranch %97
+         %97 = OpLabel
+         %20 = OpLoad %int %a
+         %98 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %21 = OpLoad %int %98
+         %99 = OpSLessThan %bool %20 %21
+               OpBranchConditional %99 %100 %95
+        %100 = OpLabel
+        %101 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %22 = OpLoad %int %101
+               OpStore %b %22
+               OpBranch %102
+        %102 = OpLabel
+               OpLoopMerge %103 %104 None
+               OpBranch %105
+        %105 = OpLabel
+         %23 = OpLoad %int %b
+        %106 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %24 = OpLoad %int %106
+        %107 = OpSLessThan %bool %23 %24
+               OpBranchConditional %107 %108 %103
+        %108 = OpLabel
+        %109 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %25 = OpLoad %int %109
+               OpStore %c %25
+               OpBranch %110
+        %110 = OpLabel
+               OpLoopMerge %111 %112 None
+               OpBranch %113
+        %113 = OpLabel
+         %26 = OpLoad %int %c
+         %27 = OpLoad %int %a
+        %114 = OpSLessThanEqual %bool %26 %27
+               OpBranchConditional %114 %115 %111
+        %115 = OpLabel
+        %116 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %28 = OpLoad %int %116
+               OpStore %d %28
+               OpBranch %117
+        %117 = OpLabel
+               OpLoopMerge %118 %119 None
+               OpBranch %120
+        %120 = OpLabel
+         %29 = OpLoad %int %d
+        %121 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %30 = OpLoad %int %121
+        %122 = OpSLessThan %bool %29 %30
+               OpBranchConditional %122 %123 %118
+        %123 = OpLabel
+         %31 = OpLoad %int %a
+        %124 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %32 = OpLoad %int %124
+        %125 = OpConvertSToF %float %32
+        %126 = OpCompositeConstruct %v2float %125 %float_0
+        %127 = OpCompositeConstruct %v2float %float_0 %125
+        %128 = OpCompositeConstruct %mat2v2float %126 %127
+         %33 = OpLoad %int %c
+        %129 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %34 = OpLoad %int %129
+               OpStore %indexable %128
+        %130 = OpAccessChain %_ptr_Function_float %indexable %33 %34
+        %131 = OpLoad %float %130
+        %132 = OpAccessChain %_ptr_Function_float %sums %31
+               OpStore %132 %131
+         %35 = OpLoad %int %a
+        %133 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %36 = OpLoad %int %133
+        %134 = OpConvertSToF %float %36
+        %135 = OpCompositeConstruct %v2float %134 %float_0
+        %136 = OpCompositeConstruct %v2float %float_0 %134
+        %137 = OpCompositeConstruct %mat2v2float %135 %136
+         %37 = OpLoad %int %c
+        %138 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %38 = OpLoad %int %138
+               OpStore %indexable_0 %137
+        %139 = OpAccessChain %_ptr_Function_float %indexable_0 %37 %38
+        %140 = OpLoad %float %139
+        %141 = OpAccessChain %_ptr_Function_float %sums %35
+        %142 = OpLoad %float %141
+        %143 = OpFAdd %float %142 %140
+        %144 = OpAccessChain %_ptr_Function_float %sums %35
+               OpStore %144 %143
+               OpBranch %119
+        %119 = OpLabel
+         %39 = OpLoad %int %d
+         %40 = OpIAdd %int %39 %int_1
+               OpStore %d %40
+               OpBranch %117
+        %118 = OpLabel
+               OpBranch %112
+        %112 = OpLabel
+         %41 = OpLoad %int %c
+         %42 = OpIAdd %int %41 %int_1
+               OpStore %c %42
+               OpBranch %110
+        %111 = OpLabel
+               OpBranch %104
+        %104 = OpLabel
+         %43 = OpLoad %int %b
+         %44 = OpIAdd %int %43 %int_1
+               OpStore %b %44
+               OpBranch %102
+        %103 = OpLabel
+               OpBranch %96
+         %96 = OpLabel
+         %45 = OpLoad %int %a
+         %46 = OpIAdd %int %45 %int_1
+               OpStore %a %46
+               OpBranch %94
+         %95 = OpLabel
+        %145 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %47 = OpLoad %int %145
+        %146 = OpAccessChain %_ptr_Function_float %sums %47
+        %147 = OpLoad %float %146
+        %148 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_1
+        %149 = OpLoad %float %148
+        %150 = OpFOrdEqual %bool %147 %149
+               OpSelectionMerge %151 None
+               OpBranchConditional %150 %152 %151
+        %152 = OpLabel
+        %153 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %48 = OpLoad %int %153
+        %154 = OpAccessChain %_ptr_Function_float %sums %48
+        %155 = OpLoad %float %154
+        %156 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_2
+        %157 = OpLoad %float %156
+        %158 = OpFOrdEqual %bool %155 %157
+               OpBranch %151
+        %151 = OpLabel
+        %159 = OpPhi %bool %150 %95 %158 %152
+               OpSelectionMerge %160 None
+               OpBranchConditional %159 %161 %162
+        %161 = OpLabel
+        %163 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %49 = OpLoad %int %163
+        %164 = OpConvertSToF %float %49
+        %165 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %50 = OpLoad %int %165
+        %166 = OpConvertSToF %float %50
+        %167 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %51 = OpLoad %int %167
+        %168 = OpConvertSToF %float %51
+        %169 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %52 = OpLoad %int %169
+        %170 = OpConvertSToF %float %52
+        %171 = OpCompositeConstruct %v4float %164 %166 %168 %170
+               OpStore %_GLF_color %171
+               OpBranch %160
+        %162 = OpLabel
+        %172 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %53 = OpLoad %int %172
+        %173 = OpConvertSToF %float %53
+        %174 = OpCompositeConstruct %v4float %173 %173 %173 %173
+               OpStore %_GLF_color %174
+               OpBranch %160
+        %160 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-branch-probability-identity-matrix/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-branch-probability-identity-matrix/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..2d3af22
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-branch-probability-identity-matrix/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,128 @@
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[4];
+};
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float sums[2] = (float[2])0;
+  int a = 0;
+  int b = 0;
+  int c = 0;
+  int d = 0;
+  float2x2 indexable = float2x2(0.0f, 0.0f, 0.0f, 0.0f);
+  float2x2 indexable_1 = float2x2(0.0f, 0.0f, 0.0f, 0.0f);
+  bool x_158 = false;
+  bool x_159_phi = false;
+  const int x_16 = asint(x_6[1].x);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_85 = asfloat(x_8[scalar_offset / 4][scalar_offset % 4]);
+  sums[x_16] = -(x_85);
+  const int x_18 = asint(x_6[2].x);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_90 = asfloat(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  sums[x_18] = -(x_90);
+  const int x_19 = asint(x_6[1].x);
+  a = x_19;
+  while (true) {
+    const int x_20 = a;
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_21 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    if ((x_20 < x_21)) {
+    } else {
+      break;
+    }
+    const int x_22 = asint(x_6[1].x);
+    b = x_22;
+    while (true) {
+      const int x_23 = b;
+      const int x_24 = asint(x_6[3].x);
+      if ((x_23 < x_24)) {
+      } else {
+        break;
+      }
+      const int x_25 = asint(x_6[1].x);
+      c = x_25;
+      {
+        for(; (c <= a); c = (c + 1)) {
+          const int x_28 = asint(x_6[1].x);
+          d = x_28;
+          while (true) {
+            const int x_29 = d;
+            const int x_30 = asint(x_6[3].x);
+            if ((x_29 < x_30)) {
+            } else {
+              break;
+            }
+            const int x_31 = a;
+            const int x_32 = asint(x_6[2].x);
+            const float x_125 = float(x_32);
+            const int x_33 = c;
+            const int x_34 = asint(x_6[2].x);
+            indexable = float2x2(float2(x_125, 0.0f), float2(0.0f, x_125));
+            const float x_131 = indexable[x_33][x_34];
+            sums[x_31] = x_131;
+            const int x_35 = a;
+            const int x_36 = asint(x_6[2].x);
+            const float x_134 = float(x_36);
+            const int x_37 = c;
+            const int x_38 = asint(x_6[2].x);
+            indexable_1 = float2x2(float2(x_134, 0.0f), float2(0.0f, x_134));
+            const float x_140 = indexable_1[x_37][x_38];
+            const float x_142 = sums[x_35];
+            sums[x_35] = (x_142 + x_140);
+            {
+              d = (d + 1);
+            }
+          }
+        }
+      }
+      {
+        b = (b + 1);
+      }
+    }
+    {
+      a = (a + 1);
+    }
+  }
+  const int x_47 = asint(x_6[1].x);
+  const float x_147 = sums[x_47];
+  const float x_149 = asfloat(x_8[1].x);
+  const bool x_150 = (x_147 == x_149);
+  x_159_phi = x_150;
+  if (x_150) {
+    const int x_48 = asint(x_6[2].x);
+    const float x_155 = sums[x_48];
+    const float x_157 = asfloat(x_8[2].x);
+    x_158 = (x_155 == x_157);
+    x_159_phi = x_158;
+  }
+  if (x_159_phi) {
+    const int x_49 = asint(x_6[2].x);
+    const int x_50 = asint(x_6[1].x);
+    const int x_51 = asint(x_6[1].x);
+    const int x_52 = asint(x_6[2].x);
+    x_GLF_color = float4(float(x_49), float(x_50), float(x_51), float(x_52));
+  } else {
+    const int x_53 = asint(x_6[1].x);
+    const float x_173 = float(x_53);
+    x_GLF_color = float4(x_173, x_173, x_173, x_173);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-branch-probability-identity-matrix/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-branch-probability-identity-matrix/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..ed07fe7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-branch-probability-identity-matrix/0-opt.spvasm.expected.msl
@@ -0,0 +1,157 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct tint_array_wrapper_2 {
+  float arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_8, thread float4* const tint_symbol_4) {
+  tint_array_wrapper_2 sums = {};
+  int a = 0;
+  int b = 0;
+  int c = 0;
+  int d = 0;
+  float2x2 indexable = float2x2(0.0f);
+  float2x2 indexable_1 = float2x2(0.0f);
+  bool x_158 = false;
+  bool x_159_phi = false;
+  int const x_16 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  float const x_85 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  sums.arr[x_16] = -(x_85);
+  int const x_18 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  float const x_90 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  sums.arr[x_18] = -(x_90);
+  int const x_19 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  a = x_19;
+  while (true) {
+    int const x_20 = a;
+    int const x_21 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_20 < x_21)) {
+    } else {
+      break;
+    }
+    int const x_22 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    b = x_22;
+    while (true) {
+      int const x_23 = b;
+      int const x_24 = x_6.x_GLF_uniform_int_values.arr[3].el;
+      if ((x_23 < x_24)) {
+      } else {
+        break;
+      }
+      int const x_25 = x_6.x_GLF_uniform_int_values.arr[1].el;
+      c = x_25;
+      while (true) {
+        int const x_26 = c;
+        int const x_27 = a;
+        if ((x_26 <= x_27)) {
+        } else {
+          break;
+        }
+        int const x_28 = x_6.x_GLF_uniform_int_values.arr[1].el;
+        d = x_28;
+        while (true) {
+          int const x_29 = d;
+          int const x_30 = x_6.x_GLF_uniform_int_values.arr[3].el;
+          if ((x_29 < x_30)) {
+          } else {
+            break;
+          }
+          int const x_31 = a;
+          int const x_32 = x_6.x_GLF_uniform_int_values.arr[2].el;
+          float const x_125 = float(x_32);
+          int const x_33 = c;
+          int const x_34 = x_6.x_GLF_uniform_int_values.arr[2].el;
+          indexable = float2x2(float2(x_125, 0.0f), float2(0.0f, x_125));
+          float const x_131 = indexable[x_33][x_34];
+          sums.arr[x_31] = x_131;
+          int const x_35 = a;
+          int const x_36 = x_6.x_GLF_uniform_int_values.arr[2].el;
+          float const x_134 = float(x_36);
+          int const x_37 = c;
+          int const x_38 = x_6.x_GLF_uniform_int_values.arr[2].el;
+          indexable_1 = float2x2(float2(x_134, 0.0f), float2(0.0f, x_134));
+          float const x_140 = indexable_1[x_37][x_38];
+          float const x_142 = sums.arr[x_35];
+          sums.arr[x_35] = (x_142 + x_140);
+          {
+            int const x_39 = d;
+            d = (x_39 + 1);
+          }
+        }
+        {
+          int const x_41 = c;
+          c = (x_41 + 1);
+        }
+      }
+      {
+        int const x_43 = b;
+        b = (x_43 + 1);
+      }
+    }
+    {
+      int const x_45 = a;
+      a = (x_45 + 1);
+    }
+  }
+  int const x_47 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  float const x_147 = sums.arr[x_47];
+  float const x_149 = x_8.x_GLF_uniform_float_values.arr[1].el;
+  bool const x_150 = (x_147 == x_149);
+  x_159_phi = x_150;
+  if (x_150) {
+    int const x_48 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    float const x_155 = sums.arr[x_48];
+    float const x_157 = x_8.x_GLF_uniform_float_values.arr[2].el;
+    x_158 = (x_155 == x_157);
+    x_159_phi = x_158;
+  }
+  bool const x_159 = x_159_phi;
+  if (x_159) {
+    int const x_49 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_50 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_51 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_52 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    *(tint_symbol_4) = float4(float(x_49), float(x_50), float(x_51), float(x_52));
+  } else {
+    int const x_53 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    float const x_173 = float(x_53);
+    *(tint_symbol_4) = float4(x_173, x_173, x_173, x_173);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-branch-probability-identity-matrix/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-branch-probability-identity-matrix/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..7c6e615
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-branch-probability-identity-matrix/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,320 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 205
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %sums "sums"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %d "d"
+               OpName %indexable "indexable"
+               OpName %indexable_1 "indexable_1"
+               OpName %x_158 "x_158"
+               OpName %x_159_phi "x_159_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf1 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %float = OpTypeFloat 32
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf0 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+%_ptr_Function__arr_float_uint_2 = OpTypePointer Function %_arr_float_uint_2
+         %28 = OpConstantNull %_arr_float_uint_2
+%_ptr_Function_int = OpTypePointer Function %int
+         %31 = OpConstantNull %int
+    %v2float = OpTypeVector %float 2
+%mat2v2float = OpTypeMatrix %v2float 2
+%_ptr_Function_mat2v2float = OpTypePointer Function %mat2v2float
+         %39 = OpConstantNull %mat2v2float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %44 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+    %float_0 = OpConstant %float 0
+   %main_out = OpTypeStruct %v4float
+        %193 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+       %sums = OpVariable %_ptr_Function__arr_float_uint_2 Function %28
+          %a = OpVariable %_ptr_Function_int Function %31
+          %b = OpVariable %_ptr_Function_int Function %31
+          %c = OpVariable %_ptr_Function_int Function %31
+          %d = OpVariable %_ptr_Function_int Function %31
+  %indexable = OpVariable %_ptr_Function_mat2v2float Function %39
+%indexable_1 = OpVariable %_ptr_Function_mat2v2float Function %39
+      %x_158 = OpVariable %_ptr_Function_bool Function %44
+  %x_159_phi = OpVariable %_ptr_Function_bool Function %44
+         %49 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %50 = OpLoad %int %49
+         %53 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %54 = OpLoad %float %53
+         %56 = OpAccessChain %_ptr_Function_float %sums %50
+         %57 = OpFNegate %float %54
+               OpStore %56 %57
+         %59 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %60 = OpLoad %int %59
+         %61 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %62 = OpLoad %float %61
+         %63 = OpAccessChain %_ptr_Function_float %sums %60
+         %64 = OpFNegate %float %62
+               OpStore %63 %64
+         %65 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %66 = OpLoad %int %65
+               OpStore %a %66
+               OpBranch %67
+         %67 = OpLabel
+               OpLoopMerge %68 %69 None
+               OpBranch %70
+         %70 = OpLabel
+         %71 = OpLoad %int %a
+         %72 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %73 = OpLoad %int %72
+         %74 = OpSLessThan %bool %71 %73
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %77
+         %76 = OpLabel
+               OpBranch %75
+         %77 = OpLabel
+               OpBranch %68
+         %75 = OpLabel
+         %78 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %79 = OpLoad %int %78
+               OpStore %b %79
+               OpBranch %80
+         %80 = OpLabel
+               OpLoopMerge %81 %82 None
+               OpBranch %83
+         %83 = OpLabel
+         %84 = OpLoad %int %b
+         %86 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %87 = OpLoad %int %86
+         %88 = OpSLessThan %bool %84 %87
+               OpSelectionMerge %89 None
+               OpBranchConditional %88 %90 %91
+         %90 = OpLabel
+               OpBranch %89
+         %91 = OpLabel
+               OpBranch %81
+         %89 = OpLabel
+         %92 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %93 = OpLoad %int %92
+               OpStore %c %93
+               OpBranch %94
+         %94 = OpLabel
+               OpLoopMerge %95 %96 None
+               OpBranch %97
+         %97 = OpLabel
+         %98 = OpLoad %int %c
+         %99 = OpLoad %int %a
+        %100 = OpSLessThanEqual %bool %98 %99
+               OpSelectionMerge %101 None
+               OpBranchConditional %100 %102 %103
+        %102 = OpLabel
+               OpBranch %101
+        %103 = OpLabel
+               OpBranch %95
+        %101 = OpLabel
+        %104 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %105 = OpLoad %int %104
+               OpStore %d %105
+               OpBranch %106
+        %106 = OpLabel
+               OpLoopMerge %107 %108 None
+               OpBranch %109
+        %109 = OpLabel
+        %110 = OpLoad %int %d
+        %111 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+        %112 = OpLoad %int %111
+        %113 = OpSLessThan %bool %110 %112
+               OpSelectionMerge %114 None
+               OpBranchConditional %113 %115 %116
+        %115 = OpLabel
+               OpBranch %114
+        %116 = OpLabel
+               OpBranch %107
+        %114 = OpLabel
+        %117 = OpLoad %int %a
+        %118 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %119 = OpLoad %int %118
+        %120 = OpConvertSToF %float %119
+        %121 = OpLoad %int %c
+        %122 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %123 = OpLoad %int %122
+        %125 = OpCompositeConstruct %v2float %120 %float_0
+        %126 = OpCompositeConstruct %v2float %float_0 %120
+        %127 = OpCompositeConstruct %mat2v2float %125 %126
+               OpStore %indexable %127
+        %128 = OpAccessChain %_ptr_Function_float %indexable %121 %123
+        %129 = OpLoad %float %128
+        %130 = OpAccessChain %_ptr_Function_float %sums %117
+               OpStore %130 %129
+        %131 = OpLoad %int %a
+        %132 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %133 = OpLoad %int %132
+        %134 = OpConvertSToF %float %133
+        %135 = OpLoad %int %c
+        %136 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %137 = OpLoad %int %136
+        %138 = OpCompositeConstruct %v2float %134 %float_0
+        %139 = OpCompositeConstruct %v2float %float_0 %134
+        %140 = OpCompositeConstruct %mat2v2float %138 %139
+               OpStore %indexable_1 %140
+        %141 = OpAccessChain %_ptr_Function_float %indexable_1 %135 %137
+        %142 = OpLoad %float %141
+        %143 = OpAccessChain %_ptr_Function_float %sums %131
+        %144 = OpLoad %float %143
+        %145 = OpAccessChain %_ptr_Function_float %sums %131
+        %146 = OpFAdd %float %144 %142
+               OpStore %145 %146
+               OpBranch %108
+        %108 = OpLabel
+        %147 = OpLoad %int %d
+        %148 = OpIAdd %int %147 %int_1
+               OpStore %d %148
+               OpBranch %106
+        %107 = OpLabel
+               OpBranch %96
+         %96 = OpLabel
+        %149 = OpLoad %int %c
+        %150 = OpIAdd %int %149 %int_1
+               OpStore %c %150
+               OpBranch %94
+         %95 = OpLabel
+               OpBranch %82
+         %82 = OpLabel
+        %151 = OpLoad %int %b
+        %152 = OpIAdd %int %151 %int_1
+               OpStore %b %152
+               OpBranch %80
+         %81 = OpLabel
+               OpBranch %69
+         %69 = OpLabel
+        %153 = OpLoad %int %a
+        %154 = OpIAdd %int %153 %int_1
+               OpStore %a %154
+               OpBranch %67
+         %68 = OpLabel
+        %155 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %156 = OpLoad %int %155
+        %157 = OpAccessChain %_ptr_Function_float %sums %156
+        %158 = OpLoad %float %157
+        %159 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+        %160 = OpLoad %float %159
+        %161 = OpFOrdEqual %bool %158 %160
+               OpStore %x_159_phi %161
+               OpSelectionMerge %162 None
+               OpBranchConditional %161 %163 %162
+        %163 = OpLabel
+        %164 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %165 = OpLoad %int %164
+        %166 = OpAccessChain %_ptr_Function_float %sums %165
+        %167 = OpLoad %float %166
+        %168 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_2
+        %169 = OpLoad %float %168
+        %170 = OpFOrdEqual %bool %167 %169
+               OpStore %x_158 %170
+        %171 = OpLoad %bool %x_158
+               OpStore %x_159_phi %171
+               OpBranch %162
+        %162 = OpLabel
+        %172 = OpLoad %bool %x_159_phi
+               OpSelectionMerge %173 None
+               OpBranchConditional %172 %174 %175
+        %174 = OpLabel
+        %176 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %177 = OpLoad %int %176
+        %178 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %179 = OpLoad %int %178
+        %180 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %181 = OpLoad %int %180
+        %182 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %183 = OpLoad %int %182
+        %184 = OpConvertSToF %float %177
+        %185 = OpConvertSToF %float %179
+        %186 = OpConvertSToF %float %181
+        %187 = OpConvertSToF %float %183
+        %188 = OpCompositeConstruct %v4float %184 %185 %186 %187
+               OpStore %x_GLF_color %188
+               OpBranch %173
+        %175 = OpLabel
+        %189 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %190 = OpLoad %int %189
+        %191 = OpConvertSToF %float %190
+        %192 = OpCompositeConstruct %v4float %191 %191 %191 %191
+               OpStore %x_GLF_color %192
+               OpBranch %173
+        %173 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %193
+%tint_symbol = OpFunctionParameter %main_out
+        %197 = OpLabel
+        %198 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %198
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %200 = OpLabel
+        %201 = OpFunctionCall %void %main_1
+        %203 = OpLoad %v4float %x_GLF_color
+        %204 = OpCompositeConstruct %main_out %203
+        %202 = OpFunctionCall %void %tint_symbol_2 %204
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-branch-probability-identity-matrix/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-branch-probability-identity-matrix/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..83081ec
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-branch-probability-identity-matrix/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,150 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var sums : array<f32, 2>;
+  var a : i32;
+  var b : i32;
+  var c : i32;
+  var d : i32;
+  var indexable : mat2x2<f32>;
+  var indexable_1 : mat2x2<f32>;
+  var x_158 : bool;
+  var x_159_phi : bool;
+  let x_16 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_85 : f32 = x_8.x_GLF_uniform_float_values[0];
+  sums[x_16] = -(x_85);
+  let x_18 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_90 : f32 = x_8.x_GLF_uniform_float_values[0];
+  sums[x_18] = -(x_90);
+  let x_19 : i32 = x_6.x_GLF_uniform_int_values[1];
+  a = x_19;
+  loop {
+    let x_20 : i32 = a;
+    let x_21 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_20 < x_21)) {
+    } else {
+      break;
+    }
+    let x_22 : i32 = x_6.x_GLF_uniform_int_values[1];
+    b = x_22;
+    loop {
+      let x_23 : i32 = b;
+      let x_24 : i32 = x_6.x_GLF_uniform_int_values[3];
+      if ((x_23 < x_24)) {
+      } else {
+        break;
+      }
+      let x_25 : i32 = x_6.x_GLF_uniform_int_values[1];
+      c = x_25;
+      loop {
+        let x_26 : i32 = c;
+        let x_27 : i32 = a;
+        if ((x_26 <= x_27)) {
+        } else {
+          break;
+        }
+        let x_28 : i32 = x_6.x_GLF_uniform_int_values[1];
+        d = x_28;
+        loop {
+          let x_29 : i32 = d;
+          let x_30 : i32 = x_6.x_GLF_uniform_int_values[3];
+          if ((x_29 < x_30)) {
+          } else {
+            break;
+          }
+          let x_31 : i32 = a;
+          let x_32 : i32 = x_6.x_GLF_uniform_int_values[2];
+          let x_125 : f32 = f32(x_32);
+          let x_33 : i32 = c;
+          let x_34 : i32 = x_6.x_GLF_uniform_int_values[2];
+          indexable = mat2x2<f32>(vec2<f32>(x_125, 0.0), vec2<f32>(0.0, x_125));
+          let x_131 : f32 = indexable[x_33][x_34];
+          sums[x_31] = x_131;
+          let x_35 : i32 = a;
+          let x_36 : i32 = x_6.x_GLF_uniform_int_values[2];
+          let x_134 : f32 = f32(x_36);
+          let x_37 : i32 = c;
+          let x_38 : i32 = x_6.x_GLF_uniform_int_values[2];
+          indexable_1 = mat2x2<f32>(vec2<f32>(x_134, 0.0), vec2<f32>(0.0, x_134));
+          let x_140 : f32 = indexable_1[x_37][x_38];
+          let x_142 : f32 = sums[x_35];
+          sums[x_35] = (x_142 + x_140);
+
+          continuing {
+            let x_39 : i32 = d;
+            d = (x_39 + 1);
+          }
+        }
+
+        continuing {
+          let x_41 : i32 = c;
+          c = (x_41 + 1);
+        }
+      }
+
+      continuing {
+        let x_43 : i32 = b;
+        b = (x_43 + 1);
+      }
+    }
+
+    continuing {
+      let x_45 : i32 = a;
+      a = (x_45 + 1);
+    }
+  }
+  let x_47 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_147 : f32 = sums[x_47];
+  let x_149 : f32 = x_8.x_GLF_uniform_float_values[1];
+  let x_150 : bool = (x_147 == x_149);
+  x_159_phi = x_150;
+  if (x_150) {
+    let x_48 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_155 : f32 = sums[x_48];
+    let x_157 : f32 = x_8.x_GLF_uniform_float_values[2];
+    x_158 = (x_155 == x_157);
+    x_159_phi = x_158;
+  }
+  let x_159 : bool = x_159_phi;
+  if (x_159) {
+    let x_49 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_50 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_51 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_52 : i32 = x_6.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_49), f32(x_50), f32(x_51), f32(x_52));
+  } else {
+    let x_53 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_173 : f32 = f32(x_53);
+    x_GLF_color = vec4<f32>(x_173, x_173, x_173, x_173);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-branch-probability-identity-matrix/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-branch-probability-identity-matrix/0-opt.wgsl
new file mode 100644
index 0000000..83081ec
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-branch-probability-identity-matrix/0-opt.wgsl
@@ -0,0 +1,150 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var sums : array<f32, 2>;
+  var a : i32;
+  var b : i32;
+  var c : i32;
+  var d : i32;
+  var indexable : mat2x2<f32>;
+  var indexable_1 : mat2x2<f32>;
+  var x_158 : bool;
+  var x_159_phi : bool;
+  let x_16 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_85 : f32 = x_8.x_GLF_uniform_float_values[0];
+  sums[x_16] = -(x_85);
+  let x_18 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_90 : f32 = x_8.x_GLF_uniform_float_values[0];
+  sums[x_18] = -(x_90);
+  let x_19 : i32 = x_6.x_GLF_uniform_int_values[1];
+  a = x_19;
+  loop {
+    let x_20 : i32 = a;
+    let x_21 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_20 < x_21)) {
+    } else {
+      break;
+    }
+    let x_22 : i32 = x_6.x_GLF_uniform_int_values[1];
+    b = x_22;
+    loop {
+      let x_23 : i32 = b;
+      let x_24 : i32 = x_6.x_GLF_uniform_int_values[3];
+      if ((x_23 < x_24)) {
+      } else {
+        break;
+      }
+      let x_25 : i32 = x_6.x_GLF_uniform_int_values[1];
+      c = x_25;
+      loop {
+        let x_26 : i32 = c;
+        let x_27 : i32 = a;
+        if ((x_26 <= x_27)) {
+        } else {
+          break;
+        }
+        let x_28 : i32 = x_6.x_GLF_uniform_int_values[1];
+        d = x_28;
+        loop {
+          let x_29 : i32 = d;
+          let x_30 : i32 = x_6.x_GLF_uniform_int_values[3];
+          if ((x_29 < x_30)) {
+          } else {
+            break;
+          }
+          let x_31 : i32 = a;
+          let x_32 : i32 = x_6.x_GLF_uniform_int_values[2];
+          let x_125 : f32 = f32(x_32);
+          let x_33 : i32 = c;
+          let x_34 : i32 = x_6.x_GLF_uniform_int_values[2];
+          indexable = mat2x2<f32>(vec2<f32>(x_125, 0.0), vec2<f32>(0.0, x_125));
+          let x_131 : f32 = indexable[x_33][x_34];
+          sums[x_31] = x_131;
+          let x_35 : i32 = a;
+          let x_36 : i32 = x_6.x_GLF_uniform_int_values[2];
+          let x_134 : f32 = f32(x_36);
+          let x_37 : i32 = c;
+          let x_38 : i32 = x_6.x_GLF_uniform_int_values[2];
+          indexable_1 = mat2x2<f32>(vec2<f32>(x_134, 0.0), vec2<f32>(0.0, x_134));
+          let x_140 : f32 = indexable_1[x_37][x_38];
+          let x_142 : f32 = sums[x_35];
+          sums[x_35] = (x_142 + x_140);
+
+          continuing {
+            let x_39 : i32 = d;
+            d = (x_39 + 1);
+          }
+        }
+
+        continuing {
+          let x_41 : i32 = c;
+          c = (x_41 + 1);
+        }
+      }
+
+      continuing {
+        let x_43 : i32 = b;
+        b = (x_43 + 1);
+      }
+    }
+
+    continuing {
+      let x_45 : i32 = a;
+      a = (x_45 + 1);
+    }
+  }
+  let x_47 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_147 : f32 = sums[x_47];
+  let x_149 : f32 = x_8.x_GLF_uniform_float_values[1];
+  let x_150 : bool = (x_147 == x_149);
+  x_159_phi = x_150;
+  if (x_150) {
+    let x_48 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_155 : f32 = sums[x_48];
+    let x_157 : f32 = x_8.x_GLF_uniform_float_values[2];
+    x_158 = (x_155 == x_157);
+    x_159_phi = x_158;
+  }
+  let x_159 : bool = x_159_phi;
+  if (x_159) {
+    let x_49 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_50 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_51 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_52 : i32 = x_6.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_49), f32(x_50), f32(x_51), f32(x_52));
+  } else {
+    let x_53 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_173 : f32 = f32(x_53);
+    x_GLF_color = vec4<f32>(x_173, x_173, x_173, x_173);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-branch-probability-identity-matrix/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-branch-probability-identity-matrix/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..2d3af22
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-branch-probability-identity-matrix/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,128 @@
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[4];
+};
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float sums[2] = (float[2])0;
+  int a = 0;
+  int b = 0;
+  int c = 0;
+  int d = 0;
+  float2x2 indexable = float2x2(0.0f, 0.0f, 0.0f, 0.0f);
+  float2x2 indexable_1 = float2x2(0.0f, 0.0f, 0.0f, 0.0f);
+  bool x_158 = false;
+  bool x_159_phi = false;
+  const int x_16 = asint(x_6[1].x);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_85 = asfloat(x_8[scalar_offset / 4][scalar_offset % 4]);
+  sums[x_16] = -(x_85);
+  const int x_18 = asint(x_6[2].x);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_90 = asfloat(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  sums[x_18] = -(x_90);
+  const int x_19 = asint(x_6[1].x);
+  a = x_19;
+  while (true) {
+    const int x_20 = a;
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_21 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    if ((x_20 < x_21)) {
+    } else {
+      break;
+    }
+    const int x_22 = asint(x_6[1].x);
+    b = x_22;
+    while (true) {
+      const int x_23 = b;
+      const int x_24 = asint(x_6[3].x);
+      if ((x_23 < x_24)) {
+      } else {
+        break;
+      }
+      const int x_25 = asint(x_6[1].x);
+      c = x_25;
+      {
+        for(; (c <= a); c = (c + 1)) {
+          const int x_28 = asint(x_6[1].x);
+          d = x_28;
+          while (true) {
+            const int x_29 = d;
+            const int x_30 = asint(x_6[3].x);
+            if ((x_29 < x_30)) {
+            } else {
+              break;
+            }
+            const int x_31 = a;
+            const int x_32 = asint(x_6[2].x);
+            const float x_125 = float(x_32);
+            const int x_33 = c;
+            const int x_34 = asint(x_6[2].x);
+            indexable = float2x2(float2(x_125, 0.0f), float2(0.0f, x_125));
+            const float x_131 = indexable[x_33][x_34];
+            sums[x_31] = x_131;
+            const int x_35 = a;
+            const int x_36 = asint(x_6[2].x);
+            const float x_134 = float(x_36);
+            const int x_37 = c;
+            const int x_38 = asint(x_6[2].x);
+            indexable_1 = float2x2(float2(x_134, 0.0f), float2(0.0f, x_134));
+            const float x_140 = indexable_1[x_37][x_38];
+            const float x_142 = sums[x_35];
+            sums[x_35] = (x_142 + x_140);
+            {
+              d = (d + 1);
+            }
+          }
+        }
+      }
+      {
+        b = (b + 1);
+      }
+    }
+    {
+      a = (a + 1);
+    }
+  }
+  const int x_47 = asint(x_6[1].x);
+  const float x_147 = sums[x_47];
+  const float x_149 = asfloat(x_8[1].x);
+  const bool x_150 = (x_147 == x_149);
+  x_159_phi = x_150;
+  if (x_150) {
+    const int x_48 = asint(x_6[2].x);
+    const float x_155 = sums[x_48];
+    const float x_157 = asfloat(x_8[2].x);
+    x_158 = (x_155 == x_157);
+    x_159_phi = x_158;
+  }
+  if (x_159_phi) {
+    const int x_49 = asint(x_6[2].x);
+    const int x_50 = asint(x_6[1].x);
+    const int x_51 = asint(x_6[1].x);
+    const int x_52 = asint(x_6[2].x);
+    x_GLF_color = float4(float(x_49), float(x_50), float(x_51), float(x_52));
+  } else {
+    const int x_53 = asint(x_6[1].x);
+    const float x_173 = float(x_53);
+    x_GLF_color = float4(x_173, x_173, x_173, x_173);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-branch-probability-identity-matrix/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-branch-probability-identity-matrix/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..ed07fe7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-branch-probability-identity-matrix/0-opt.wgsl.expected.msl
@@ -0,0 +1,157 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct tint_array_wrapper_2 {
+  float arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_8, thread float4* const tint_symbol_4) {
+  tint_array_wrapper_2 sums = {};
+  int a = 0;
+  int b = 0;
+  int c = 0;
+  int d = 0;
+  float2x2 indexable = float2x2(0.0f);
+  float2x2 indexable_1 = float2x2(0.0f);
+  bool x_158 = false;
+  bool x_159_phi = false;
+  int const x_16 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  float const x_85 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  sums.arr[x_16] = -(x_85);
+  int const x_18 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  float const x_90 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  sums.arr[x_18] = -(x_90);
+  int const x_19 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  a = x_19;
+  while (true) {
+    int const x_20 = a;
+    int const x_21 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_20 < x_21)) {
+    } else {
+      break;
+    }
+    int const x_22 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    b = x_22;
+    while (true) {
+      int const x_23 = b;
+      int const x_24 = x_6.x_GLF_uniform_int_values.arr[3].el;
+      if ((x_23 < x_24)) {
+      } else {
+        break;
+      }
+      int const x_25 = x_6.x_GLF_uniform_int_values.arr[1].el;
+      c = x_25;
+      while (true) {
+        int const x_26 = c;
+        int const x_27 = a;
+        if ((x_26 <= x_27)) {
+        } else {
+          break;
+        }
+        int const x_28 = x_6.x_GLF_uniform_int_values.arr[1].el;
+        d = x_28;
+        while (true) {
+          int const x_29 = d;
+          int const x_30 = x_6.x_GLF_uniform_int_values.arr[3].el;
+          if ((x_29 < x_30)) {
+          } else {
+            break;
+          }
+          int const x_31 = a;
+          int const x_32 = x_6.x_GLF_uniform_int_values.arr[2].el;
+          float const x_125 = float(x_32);
+          int const x_33 = c;
+          int const x_34 = x_6.x_GLF_uniform_int_values.arr[2].el;
+          indexable = float2x2(float2(x_125, 0.0f), float2(0.0f, x_125));
+          float const x_131 = indexable[x_33][x_34];
+          sums.arr[x_31] = x_131;
+          int const x_35 = a;
+          int const x_36 = x_6.x_GLF_uniform_int_values.arr[2].el;
+          float const x_134 = float(x_36);
+          int const x_37 = c;
+          int const x_38 = x_6.x_GLF_uniform_int_values.arr[2].el;
+          indexable_1 = float2x2(float2(x_134, 0.0f), float2(0.0f, x_134));
+          float const x_140 = indexable_1[x_37][x_38];
+          float const x_142 = sums.arr[x_35];
+          sums.arr[x_35] = (x_142 + x_140);
+          {
+            int const x_39 = d;
+            d = (x_39 + 1);
+          }
+        }
+        {
+          int const x_41 = c;
+          c = (x_41 + 1);
+        }
+      }
+      {
+        int const x_43 = b;
+        b = (x_43 + 1);
+      }
+    }
+    {
+      int const x_45 = a;
+      a = (x_45 + 1);
+    }
+  }
+  int const x_47 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  float const x_147 = sums.arr[x_47];
+  float const x_149 = x_8.x_GLF_uniform_float_values.arr[1].el;
+  bool const x_150 = (x_147 == x_149);
+  x_159_phi = x_150;
+  if (x_150) {
+    int const x_48 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    float const x_155 = sums.arr[x_48];
+    float const x_157 = x_8.x_GLF_uniform_float_values.arr[2].el;
+    x_158 = (x_155 == x_157);
+    x_159_phi = x_158;
+  }
+  bool const x_159 = x_159_phi;
+  if (x_159) {
+    int const x_49 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_50 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_51 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_52 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    *(tint_symbol_4) = float4(float(x_49), float(x_50), float(x_51), float(x_52));
+  } else {
+    int const x_53 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    float const x_173 = float(x_53);
+    *(tint_symbol_4) = float4(x_173, x_173, x_173, x_173);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-branch-probability-identity-matrix/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-branch-probability-identity-matrix/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..7c6e615
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-branch-probability-identity-matrix/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,320 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 205
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %sums "sums"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %d "d"
+               OpName %indexable "indexable"
+               OpName %indexable_1 "indexable_1"
+               OpName %x_158 "x_158"
+               OpName %x_159_phi "x_159_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf1 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %float = OpTypeFloat 32
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf0 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+%_ptr_Function__arr_float_uint_2 = OpTypePointer Function %_arr_float_uint_2
+         %28 = OpConstantNull %_arr_float_uint_2
+%_ptr_Function_int = OpTypePointer Function %int
+         %31 = OpConstantNull %int
+    %v2float = OpTypeVector %float 2
+%mat2v2float = OpTypeMatrix %v2float 2
+%_ptr_Function_mat2v2float = OpTypePointer Function %mat2v2float
+         %39 = OpConstantNull %mat2v2float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %44 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+    %float_0 = OpConstant %float 0
+   %main_out = OpTypeStruct %v4float
+        %193 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+       %sums = OpVariable %_ptr_Function__arr_float_uint_2 Function %28
+          %a = OpVariable %_ptr_Function_int Function %31
+          %b = OpVariable %_ptr_Function_int Function %31
+          %c = OpVariable %_ptr_Function_int Function %31
+          %d = OpVariable %_ptr_Function_int Function %31
+  %indexable = OpVariable %_ptr_Function_mat2v2float Function %39
+%indexable_1 = OpVariable %_ptr_Function_mat2v2float Function %39
+      %x_158 = OpVariable %_ptr_Function_bool Function %44
+  %x_159_phi = OpVariable %_ptr_Function_bool Function %44
+         %49 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %50 = OpLoad %int %49
+         %53 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %54 = OpLoad %float %53
+         %56 = OpAccessChain %_ptr_Function_float %sums %50
+         %57 = OpFNegate %float %54
+               OpStore %56 %57
+         %59 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %60 = OpLoad %int %59
+         %61 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %62 = OpLoad %float %61
+         %63 = OpAccessChain %_ptr_Function_float %sums %60
+         %64 = OpFNegate %float %62
+               OpStore %63 %64
+         %65 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %66 = OpLoad %int %65
+               OpStore %a %66
+               OpBranch %67
+         %67 = OpLabel
+               OpLoopMerge %68 %69 None
+               OpBranch %70
+         %70 = OpLabel
+         %71 = OpLoad %int %a
+         %72 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %73 = OpLoad %int %72
+         %74 = OpSLessThan %bool %71 %73
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %77
+         %76 = OpLabel
+               OpBranch %75
+         %77 = OpLabel
+               OpBranch %68
+         %75 = OpLabel
+         %78 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %79 = OpLoad %int %78
+               OpStore %b %79
+               OpBranch %80
+         %80 = OpLabel
+               OpLoopMerge %81 %82 None
+               OpBranch %83
+         %83 = OpLabel
+         %84 = OpLoad %int %b
+         %86 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %87 = OpLoad %int %86
+         %88 = OpSLessThan %bool %84 %87
+               OpSelectionMerge %89 None
+               OpBranchConditional %88 %90 %91
+         %90 = OpLabel
+               OpBranch %89
+         %91 = OpLabel
+               OpBranch %81
+         %89 = OpLabel
+         %92 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %93 = OpLoad %int %92
+               OpStore %c %93
+               OpBranch %94
+         %94 = OpLabel
+               OpLoopMerge %95 %96 None
+               OpBranch %97
+         %97 = OpLabel
+         %98 = OpLoad %int %c
+         %99 = OpLoad %int %a
+        %100 = OpSLessThanEqual %bool %98 %99
+               OpSelectionMerge %101 None
+               OpBranchConditional %100 %102 %103
+        %102 = OpLabel
+               OpBranch %101
+        %103 = OpLabel
+               OpBranch %95
+        %101 = OpLabel
+        %104 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %105 = OpLoad %int %104
+               OpStore %d %105
+               OpBranch %106
+        %106 = OpLabel
+               OpLoopMerge %107 %108 None
+               OpBranch %109
+        %109 = OpLabel
+        %110 = OpLoad %int %d
+        %111 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+        %112 = OpLoad %int %111
+        %113 = OpSLessThan %bool %110 %112
+               OpSelectionMerge %114 None
+               OpBranchConditional %113 %115 %116
+        %115 = OpLabel
+               OpBranch %114
+        %116 = OpLabel
+               OpBranch %107
+        %114 = OpLabel
+        %117 = OpLoad %int %a
+        %118 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %119 = OpLoad %int %118
+        %120 = OpConvertSToF %float %119
+        %121 = OpLoad %int %c
+        %122 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %123 = OpLoad %int %122
+        %125 = OpCompositeConstruct %v2float %120 %float_0
+        %126 = OpCompositeConstruct %v2float %float_0 %120
+        %127 = OpCompositeConstruct %mat2v2float %125 %126
+               OpStore %indexable %127
+        %128 = OpAccessChain %_ptr_Function_float %indexable %121 %123
+        %129 = OpLoad %float %128
+        %130 = OpAccessChain %_ptr_Function_float %sums %117
+               OpStore %130 %129
+        %131 = OpLoad %int %a
+        %132 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %133 = OpLoad %int %132
+        %134 = OpConvertSToF %float %133
+        %135 = OpLoad %int %c
+        %136 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %137 = OpLoad %int %136
+        %138 = OpCompositeConstruct %v2float %134 %float_0
+        %139 = OpCompositeConstruct %v2float %float_0 %134
+        %140 = OpCompositeConstruct %mat2v2float %138 %139
+               OpStore %indexable_1 %140
+        %141 = OpAccessChain %_ptr_Function_float %indexable_1 %135 %137
+        %142 = OpLoad %float %141
+        %143 = OpAccessChain %_ptr_Function_float %sums %131
+        %144 = OpLoad %float %143
+        %145 = OpAccessChain %_ptr_Function_float %sums %131
+        %146 = OpFAdd %float %144 %142
+               OpStore %145 %146
+               OpBranch %108
+        %108 = OpLabel
+        %147 = OpLoad %int %d
+        %148 = OpIAdd %int %147 %int_1
+               OpStore %d %148
+               OpBranch %106
+        %107 = OpLabel
+               OpBranch %96
+         %96 = OpLabel
+        %149 = OpLoad %int %c
+        %150 = OpIAdd %int %149 %int_1
+               OpStore %c %150
+               OpBranch %94
+         %95 = OpLabel
+               OpBranch %82
+         %82 = OpLabel
+        %151 = OpLoad %int %b
+        %152 = OpIAdd %int %151 %int_1
+               OpStore %b %152
+               OpBranch %80
+         %81 = OpLabel
+               OpBranch %69
+         %69 = OpLabel
+        %153 = OpLoad %int %a
+        %154 = OpIAdd %int %153 %int_1
+               OpStore %a %154
+               OpBranch %67
+         %68 = OpLabel
+        %155 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %156 = OpLoad %int %155
+        %157 = OpAccessChain %_ptr_Function_float %sums %156
+        %158 = OpLoad %float %157
+        %159 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+        %160 = OpLoad %float %159
+        %161 = OpFOrdEqual %bool %158 %160
+               OpStore %x_159_phi %161
+               OpSelectionMerge %162 None
+               OpBranchConditional %161 %163 %162
+        %163 = OpLabel
+        %164 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %165 = OpLoad %int %164
+        %166 = OpAccessChain %_ptr_Function_float %sums %165
+        %167 = OpLoad %float %166
+        %168 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_2
+        %169 = OpLoad %float %168
+        %170 = OpFOrdEqual %bool %167 %169
+               OpStore %x_158 %170
+        %171 = OpLoad %bool %x_158
+               OpStore %x_159_phi %171
+               OpBranch %162
+        %162 = OpLabel
+        %172 = OpLoad %bool %x_159_phi
+               OpSelectionMerge %173 None
+               OpBranchConditional %172 %174 %175
+        %174 = OpLabel
+        %176 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %177 = OpLoad %int %176
+        %178 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %179 = OpLoad %int %178
+        %180 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %181 = OpLoad %int %180
+        %182 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %183 = OpLoad %int %182
+        %184 = OpConvertSToF %float %177
+        %185 = OpConvertSToF %float %179
+        %186 = OpConvertSToF %float %181
+        %187 = OpConvertSToF %float %183
+        %188 = OpCompositeConstruct %v4float %184 %185 %186 %187
+               OpStore %x_GLF_color %188
+               OpBranch %173
+        %175 = OpLabel
+        %189 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %190 = OpLoad %int %189
+        %191 = OpConvertSToF %float %190
+        %192 = OpCompositeConstruct %v4float %191 %191 %191 %191
+               OpStore %x_GLF_color %192
+               OpBranch %173
+        %173 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %193
+%tint_symbol = OpFunctionParameter %main_out
+        %197 = OpLabel
+        %198 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %198
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %200 = OpLabel
+        %201 = OpFunctionCall %void %main_1
+        %203 = OpLoad %v4float %x_GLF_color
+        %204 = OpCompositeConstruct %main_out %203
+        %202 = OpFunctionCall %void %tint_symbol_2 %204
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-branch-probability-identity-matrix/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-branch-probability-identity-matrix/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..83081ec
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-branch-probability-identity-matrix/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,150 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var sums : array<f32, 2>;
+  var a : i32;
+  var b : i32;
+  var c : i32;
+  var d : i32;
+  var indexable : mat2x2<f32>;
+  var indexable_1 : mat2x2<f32>;
+  var x_158 : bool;
+  var x_159_phi : bool;
+  let x_16 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_85 : f32 = x_8.x_GLF_uniform_float_values[0];
+  sums[x_16] = -(x_85);
+  let x_18 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_90 : f32 = x_8.x_GLF_uniform_float_values[0];
+  sums[x_18] = -(x_90);
+  let x_19 : i32 = x_6.x_GLF_uniform_int_values[1];
+  a = x_19;
+  loop {
+    let x_20 : i32 = a;
+    let x_21 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_20 < x_21)) {
+    } else {
+      break;
+    }
+    let x_22 : i32 = x_6.x_GLF_uniform_int_values[1];
+    b = x_22;
+    loop {
+      let x_23 : i32 = b;
+      let x_24 : i32 = x_6.x_GLF_uniform_int_values[3];
+      if ((x_23 < x_24)) {
+      } else {
+        break;
+      }
+      let x_25 : i32 = x_6.x_GLF_uniform_int_values[1];
+      c = x_25;
+      loop {
+        let x_26 : i32 = c;
+        let x_27 : i32 = a;
+        if ((x_26 <= x_27)) {
+        } else {
+          break;
+        }
+        let x_28 : i32 = x_6.x_GLF_uniform_int_values[1];
+        d = x_28;
+        loop {
+          let x_29 : i32 = d;
+          let x_30 : i32 = x_6.x_GLF_uniform_int_values[3];
+          if ((x_29 < x_30)) {
+          } else {
+            break;
+          }
+          let x_31 : i32 = a;
+          let x_32 : i32 = x_6.x_GLF_uniform_int_values[2];
+          let x_125 : f32 = f32(x_32);
+          let x_33 : i32 = c;
+          let x_34 : i32 = x_6.x_GLF_uniform_int_values[2];
+          indexable = mat2x2<f32>(vec2<f32>(x_125, 0.0), vec2<f32>(0.0, x_125));
+          let x_131 : f32 = indexable[x_33][x_34];
+          sums[x_31] = x_131;
+          let x_35 : i32 = a;
+          let x_36 : i32 = x_6.x_GLF_uniform_int_values[2];
+          let x_134 : f32 = f32(x_36);
+          let x_37 : i32 = c;
+          let x_38 : i32 = x_6.x_GLF_uniform_int_values[2];
+          indexable_1 = mat2x2<f32>(vec2<f32>(x_134, 0.0), vec2<f32>(0.0, x_134));
+          let x_140 : f32 = indexable_1[x_37][x_38];
+          let x_142 : f32 = sums[x_35];
+          sums[x_35] = (x_142 + x_140);
+
+          continuing {
+            let x_39 : i32 = d;
+            d = (x_39 + 1);
+          }
+        }
+
+        continuing {
+          let x_41 : i32 = c;
+          c = (x_41 + 1);
+        }
+      }
+
+      continuing {
+        let x_43 : i32 = b;
+        b = (x_43 + 1);
+      }
+    }
+
+    continuing {
+      let x_45 : i32 = a;
+      a = (x_45 + 1);
+    }
+  }
+  let x_47 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_147 : f32 = sums[x_47];
+  let x_149 : f32 = x_8.x_GLF_uniform_float_values[1];
+  let x_150 : bool = (x_147 == x_149);
+  x_159_phi = x_150;
+  if (x_150) {
+    let x_48 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_155 : f32 = sums[x_48];
+    let x_157 : f32 = x_8.x_GLF_uniform_float_values[2];
+    x_158 = (x_155 == x_157);
+    x_159_phi = x_158;
+  }
+  let x_159 : bool = x_159_phi;
+  if (x_159) {
+    let x_49 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_50 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_51 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_52 : i32 = x_6.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_49), f32(x_50), f32(x_51), f32(x_52));
+  } else {
+    let x_53 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_173 : f32 = f32(x_53);
+    x_GLF_color = vec4<f32>(x_173, x_173, x_173, x_173);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cast-float-to-int-and-back/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-cast-float-to-int-and-back/0-opt.spvasm
new file mode 100644
index 0000000..f91310b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cast-float-to-int-and-back/0-opt.spvasm
@@ -0,0 +1,74 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %f "f"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+%float_142_699997 = OpConstant %float 142.699997
+        %int = OpTypeInt 32 1
+  %float_100 = OpConstant %float 100
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %main = OpFunction %void None %9
+         %24 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function
+               OpStore %f %float_142_699997
+         %25 = OpLoad %float %f
+         %26 = OpConvertFToS %int %25
+         %27 = OpConvertSToF %float %26
+         %28 = OpFOrdGreaterThan %bool %27 %float_100
+               OpSelectionMerge %29 None
+               OpBranchConditional %28 %30 %31
+         %30 = OpLabel
+         %32 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %33 = OpLoad %int %32
+         %34 = OpConvertSToF %float %33
+         %35 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %36 = OpLoad %int %35
+         %37 = OpConvertSToF %float %36
+         %38 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %39 = OpLoad %int %38
+         %40 = OpConvertSToF %float %39
+         %41 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %42 = OpLoad %int %41
+         %43 = OpConvertSToF %float %42
+         %44 = OpCompositeConstruct %v4float %34 %37 %40 %43
+               OpStore %_GLF_color %44
+               OpBranch %29
+         %31 = OpLabel
+         %45 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %46 = OpLoad %int %45
+         %47 = OpConvertSToF %float %46
+         %48 = OpCompositeConstruct %v4float %47 %47 %47 %47
+               OpStore %_GLF_color %48
+               OpBranch %29
+         %29 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cast-float-to-int-and-back/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-cast-float-to-int-and-back/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..77a66e8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cast-float-to-int-and-back/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,38 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+
+void main_1() {
+  float f = 0.0f;
+  f = 142.699996948f;
+  if ((float(int(f)) > 100.0f)) {
+    const int x_33 = asint(x_6[1].x);
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_36 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_39 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const int x_42 = asint(x_6[1].x);
+    x_GLF_color = float4(float(x_33), float(x_36), float(x_39), float(x_42));
+  } else {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_46 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const float x_47 = float(x_46);
+    x_GLF_color = float4(x_47, x_47, x_47, x_47);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cast-float-to-int-and-back/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-cast-float-to-int-and-back/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..739634a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cast-float-to-int-and-back/0-opt.spvasm.expected.msl
@@ -0,0 +1,46 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float f = 0.0f;
+  f = 142.699996948f;
+  float const x_25 = f;
+  if ((float(int(x_25)) > 100.0f)) {
+    int const x_33 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_36 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_39 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_42 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_33), float(x_36), float(x_39), float(x_42));
+  } else {
+    int const x_46 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    float const x_47 = float(x_46);
+    *(tint_symbol_4) = float4(x_47, x_47, x_47, x_47);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cast-float-to-int-and-back/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-cast-float-to-int-and-back/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..7f8bc30
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cast-float-to-int-and-back/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,107 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 65
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %21 = OpConstantNull %float
+%float_142_699997 = OpConstant %float 142.699997
+  %float_100 = OpConstant %float 100
+       %bool = OpTypeBool
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+   %main_out = OpTypeStruct %v4float
+         %53 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %21
+               OpStore %f %float_142_699997
+         %23 = OpLoad %float %f
+         %25 = OpConvertFToS %int %23
+         %24 = OpConvertSToF %float %25
+         %27 = OpFOrdGreaterThan %bool %24 %float_100
+               OpSelectionMerge %29 None
+               OpBranchConditional %27 %30 %31
+         %30 = OpLabel
+         %35 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %36 = OpLoad %int %35
+         %38 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %39 = OpLoad %int %38
+         %40 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %41 = OpLoad %int %40
+         %42 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %43 = OpLoad %int %42
+         %44 = OpConvertSToF %float %36
+         %45 = OpConvertSToF %float %39
+         %46 = OpConvertSToF %float %41
+         %47 = OpConvertSToF %float %43
+         %48 = OpCompositeConstruct %v4float %44 %45 %46 %47
+               OpStore %x_GLF_color %48
+               OpBranch %29
+         %31 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %50 = OpLoad %int %49
+         %51 = OpConvertSToF %float %50
+         %52 = OpCompositeConstruct %v4float %51 %51 %51 %51
+               OpStore %x_GLF_color %52
+               OpBranch %29
+         %29 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %53
+%tint_symbol = OpFunctionParameter %main_out
+         %57 = OpLabel
+         %58 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %58
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %60 = OpLabel
+         %61 = OpFunctionCall %void %main_1
+         %63 = OpLoad %v4float %x_GLF_color
+         %64 = OpCompositeConstruct %main_out %63
+         %62 = OpFunctionCall %void %tint_symbol_2 %64
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cast-float-to-int-and-back/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-cast-float-to-int-and-back/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..f7217b1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cast-float-to-int-and-back/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,39 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+fn main_1() {
+  var f : f32;
+  f = 142.699996948;
+  let x_25 : f32 = f;
+  if ((f32(i32(x_25)) > 100.0)) {
+    let x_33 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_36 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_39 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_42 : i32 = x_6.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_33), f32(x_36), f32(x_39), f32(x_42));
+  } else {
+    let x_46 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_47 : f32 = f32(x_46);
+    x_GLF_color = vec4<f32>(x_47, x_47, x_47, x_47);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cast-float-to-int-and-back/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-cast-float-to-int-and-back/0-opt.wgsl
new file mode 100644
index 0000000..f7217b1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cast-float-to-int-and-back/0-opt.wgsl
@@ -0,0 +1,39 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+fn main_1() {
+  var f : f32;
+  f = 142.699996948;
+  let x_25 : f32 = f;
+  if ((f32(i32(x_25)) > 100.0)) {
+    let x_33 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_36 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_39 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_42 : i32 = x_6.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_33), f32(x_36), f32(x_39), f32(x_42));
+  } else {
+    let x_46 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_47 : f32 = f32(x_46);
+    x_GLF_color = vec4<f32>(x_47, x_47, x_47, x_47);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cast-float-to-int-and-back/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-cast-float-to-int-and-back/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..77a66e8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cast-float-to-int-and-back/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,38 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+
+void main_1() {
+  float f = 0.0f;
+  f = 142.699996948f;
+  if ((float(int(f)) > 100.0f)) {
+    const int x_33 = asint(x_6[1].x);
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_36 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_39 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const int x_42 = asint(x_6[1].x);
+    x_GLF_color = float4(float(x_33), float(x_36), float(x_39), float(x_42));
+  } else {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_46 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const float x_47 = float(x_46);
+    x_GLF_color = float4(x_47, x_47, x_47, x_47);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cast-float-to-int-and-back/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-cast-float-to-int-and-back/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..739634a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cast-float-to-int-and-back/0-opt.wgsl.expected.msl
@@ -0,0 +1,46 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float f = 0.0f;
+  f = 142.699996948f;
+  float const x_25 = f;
+  if ((float(int(x_25)) > 100.0f)) {
+    int const x_33 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_36 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_39 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_42 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_33), float(x_36), float(x_39), float(x_42));
+  } else {
+    int const x_46 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    float const x_47 = float(x_46);
+    *(tint_symbol_4) = float4(x_47, x_47, x_47, x_47);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cast-float-to-int-and-back/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-cast-float-to-int-and-back/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..7f8bc30
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cast-float-to-int-and-back/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,107 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 65
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %21 = OpConstantNull %float
+%float_142_699997 = OpConstant %float 142.699997
+  %float_100 = OpConstant %float 100
+       %bool = OpTypeBool
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+   %main_out = OpTypeStruct %v4float
+         %53 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %21
+               OpStore %f %float_142_699997
+         %23 = OpLoad %float %f
+         %25 = OpConvertFToS %int %23
+         %24 = OpConvertSToF %float %25
+         %27 = OpFOrdGreaterThan %bool %24 %float_100
+               OpSelectionMerge %29 None
+               OpBranchConditional %27 %30 %31
+         %30 = OpLabel
+         %35 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %36 = OpLoad %int %35
+         %38 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %39 = OpLoad %int %38
+         %40 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %41 = OpLoad %int %40
+         %42 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %43 = OpLoad %int %42
+         %44 = OpConvertSToF %float %36
+         %45 = OpConvertSToF %float %39
+         %46 = OpConvertSToF %float %41
+         %47 = OpConvertSToF %float %43
+         %48 = OpCompositeConstruct %v4float %44 %45 %46 %47
+               OpStore %x_GLF_color %48
+               OpBranch %29
+         %31 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %50 = OpLoad %int %49
+         %51 = OpConvertSToF %float %50
+         %52 = OpCompositeConstruct %v4float %51 %51 %51 %51
+               OpStore %x_GLF_color %52
+               OpBranch %29
+         %29 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %53
+%tint_symbol = OpFunctionParameter %main_out
+         %57 = OpLabel
+         %58 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %58
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %60 = OpLabel
+         %61 = OpFunctionCall %void %main_1
+         %63 = OpLoad %v4float %x_GLF_color
+         %64 = OpCompositeConstruct %main_out %63
+         %62 = OpFunctionCall %void %tint_symbol_2 %64
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cast-float-to-int-and-back/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-cast-float-to-int-and-back/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..f7217b1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cast-float-to-int-and-back/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,39 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+fn main_1() {
+  var f : f32;
+  f = 142.699996948;
+  let x_25 : f32 = f;
+  if ((f32(i32(x_25)) > 100.0)) {
+    let x_33 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_36 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_39 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_42 : i32 = x_6.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_33), f32(x_36), f32(x_39), f32(x_42));
+  } else {
+    let x_46 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_47 : f32 = f32(x_46);
+    x_GLF_color = vec4<f32>(x_47, x_47, x_47, x_47);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-loop-limit-increment-float-array/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-clamp-loop-limit-increment-float-array/0-opt.spvasm
new file mode 100644
index 0000000..c832ba4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-loop-limit-increment-float-array/0-opt.spvasm
@@ -0,0 +1,148 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %sums "sums"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %indexable "indexable"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+%_ptr_Function__arr_float_uint_3 = OpTypePointer Function %_arr_float_uint_3
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_int = OpTypePointer Function %int
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%mat2v4float = OpTypeMatrix %v4float 2
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+      %int_1 = OpConstant %int 1
+%_ptr_Function_mat2v4float = OpTypePointer Function %mat2v4float
+%_ptr_Function_float = OpTypePointer Function %float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %14
+         %38 = OpLabel
+       %sums = OpVariable %_ptr_Function__arr_float_uint_3 Function
+          %i = OpVariable %_ptr_Function_int Function
+  %indexable = OpVariable %_ptr_Function_mat2v4float Function
+         %39 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %40 = OpLoad %float %39
+         %41 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %42 = OpLoad %float %41
+         %43 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %44 = OpLoad %float %43
+         %45 = OpCompositeConstruct %_arr_float_uint_3 %40 %42 %44
+               OpStore %sums %45
+               OpStore %i %int_0
+               OpBranch %46
+         %46 = OpLabel
+               OpLoopMerge %47 %48 None
+               OpBranch %49
+         %49 = OpLabel
+         %50 = OpLoad %int %i
+         %51 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %52 = OpLoad %int %51
+         %53 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %54 = OpLoad %int %53
+         %55 = OpExtInst %int %1 SClamp %52 %54 %int_2
+         %56 = OpSLessThan %bool %50 %55
+               OpBranchConditional %56 %57 %47
+         %57 = OpLabel
+         %58 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %59 = OpLoad %int %58
+         %60 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %61 = OpLoad %float %60
+         %62 = OpCompositeConstruct %v4float %61 %float_0 %float_0 %float_0
+         %63 = OpCompositeConstruct %v4float %float_0 %61 %float_0 %float_0
+         %64 = OpCompositeConstruct %mat2v4float %62 %63
+         %65 = OpLoad %int %i
+         %66 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %67 = OpLoad %int %66
+               OpStore %indexable %64
+         %68 = OpAccessChain %_ptr_Function_float %indexable %65 %67
+         %69 = OpLoad %float %68
+         %70 = OpAccessChain %_ptr_Function_float %sums %59
+         %71 = OpLoad %float %70
+         %72 = OpFAdd %float %71 %69
+         %73 = OpAccessChain %_ptr_Function_float %sums %59
+               OpStore %73 %72
+               OpBranch %48
+         %48 = OpLabel
+         %74 = OpLoad %int %i
+         %75 = OpIAdd %int %74 %int_1
+               OpStore %i %75
+               OpBranch %46
+         %47 = OpLabel
+         %76 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %77 = OpLoad %int %76
+         %78 = OpAccessChain %_ptr_Function_float %sums %77
+         %79 = OpLoad %float %78
+         %80 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %81 = OpLoad %float %80
+         %82 = OpFOrdEqual %bool %79 %81
+               OpSelectionMerge %83 None
+               OpBranchConditional %82 %84 %85
+         %84 = OpLabel
+         %86 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %87 = OpLoad %int %86
+         %88 = OpConvertSToF %float %87
+         %89 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %90 = OpLoad %int %89
+         %91 = OpConvertSToF %float %90
+         %92 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %93 = OpLoad %int %92
+         %94 = OpConvertSToF %float %93
+         %95 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %96 = OpLoad %int %95
+         %97 = OpConvertSToF %float %96
+         %98 = OpCompositeConstruct %v4float %88 %91 %94 %97
+               OpStore %_GLF_color %98
+               OpBranch %83
+         %85 = OpLabel
+         %99 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %100 = OpLoad %int %99
+        %101 = OpConvertSToF %float %100
+        %102 = OpCompositeConstruct %v4float %101 %101 %101 %101
+               OpStore %_GLF_color %102
+               OpBranch %83
+         %83 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-loop-limit-increment-float-array/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-loop-limit-increment-float-array/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..d99ee63
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-loop-limit-increment-float-array/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,76 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+cbuffer cbuffer_x_9 : register(b1, space0) {
+  uint4 x_9[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float sums[3] = (float[3])0;
+  int i = 0;
+  float2x4 indexable = float2x4(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_40 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_42 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const float x_44 = asfloat(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  const float tint_symbol_4[3] = {x_40, x_42, x_44};
+  sums = tint_symbol_4;
+  i = 0;
+  while (true) {
+    const int x_50 = i;
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_52 = asint(x_9[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_54 = asint(x_9[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    if ((x_50 < clamp(x_52, x_54, 2))) {
+    } else {
+      break;
+    }
+    const int x_59 = asint(x_9[2].x);
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const float x_61 = asfloat(x_6[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    const int x_65 = i;
+    const int x_67 = asint(x_9[1].x);
+    indexable = float2x4(float4(x_61, 0.0f, 0.0f, 0.0f), float4(0.0f, x_61, 0.0f, 0.0f));
+    const float x_69 = indexable[x_65][x_67];
+    const float x_71 = sums[x_59];
+    sums[x_59] = (x_71 + x_69);
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_77 = asint(x_9[2].x);
+  const float x_79 = sums[x_77];
+  const float x_81 = asfloat(x_6[1].x);
+  if ((x_79 == x_81)) {
+    const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+    const int x_87 = asint(x_9[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+    const int x_90 = asint(x_9[1].x);
+    const int x_93 = asint(x_9[1].x);
+    const uint scalar_offset_7 = ((16u * uint(0))) / 4;
+    const int x_96 = asint(x_9[scalar_offset_7 / 4][scalar_offset_7 % 4]);
+    x_GLF_color = float4(float(x_87), float(x_90), float(x_93), float(x_96));
+  } else {
+    const int x_100 = asint(x_9[1].x);
+    const float x_101 = float(x_100);
+    x_GLF_color = float4(x_101, x_101, x_101, x_101);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-loop-limit-increment-float-array/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-loop-limit-increment-float-array/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..d993da9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-loop-limit-increment-float-array/0-opt.spvasm.expected.msl
@@ -0,0 +1,89 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_2 {
+  float arr[3];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_9, thread float4* const tint_symbol_5) {
+  tint_array_wrapper_2 sums = {};
+  int i = 0;
+  float2x4 indexable = float2x4(0.0f);
+  float const x_40 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_42 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_44 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  tint_array_wrapper_2 const tint_symbol_3 = {.arr={x_40, x_42, x_44}};
+  sums = tint_symbol_3;
+  i = 0;
+  while (true) {
+    int const x_50 = i;
+    int const x_52 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    int const x_54 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_50 < clamp(x_52, x_54, 2))) {
+    } else {
+      break;
+    }
+    int const x_59 = x_9.x_GLF_uniform_int_values.arr[2].el;
+    float const x_61 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    int const x_65 = i;
+    int const x_67 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    indexable = float2x4(float4(x_61, 0.0f, 0.0f, 0.0f), float4(0.0f, x_61, 0.0f, 0.0f));
+    float const x_69 = indexable[x_65][x_67];
+    float const x_71 = sums.arr[x_59];
+    sums.arr[x_59] = (x_71 + x_69);
+    {
+      int const x_74 = i;
+      i = (x_74 + 1);
+    }
+  }
+  int const x_77 = x_9.x_GLF_uniform_int_values.arr[2].el;
+  float const x_79 = sums.arr[x_77];
+  float const x_81 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  if ((x_79 == x_81)) {
+    int const x_87 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    int const x_90 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_93 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_96 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_5) = float4(float(x_87), float(x_90), float(x_93), float(x_96));
+  } else {
+    int const x_100 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    float const x_101 = float(x_100);
+    *(tint_symbol_5) = float4(x_101, x_101, x_101, x_101);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_9 [[buffer(1)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-loop-limit-increment-float-array/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-clamp-loop-limit-increment-float-array/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..9bb7464
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-loop-limit-increment-float-array/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,190 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 123
+; Schema: 0
+               OpCapability Shader
+         %56 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %sums "sums"
+               OpName %i "i"
+               OpName %indexable "indexable"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_9 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+%_ptr_Function__arr_float_uint_3 = OpTypePointer Function %_arr_float_uint_3
+         %27 = OpConstantNull %_arr_float_uint_3
+%_ptr_Function_int = OpTypePointer Function %int
+         %30 = OpConstantNull %int
+%mat2v4float = OpTypeMatrix %v4float 2
+%_ptr_Function_mat2v4float = OpTypePointer Function %mat2v4float
+         %34 = OpConstantNull %mat2v4float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+%_ptr_Function_float = OpTypePointer Function %float
+   %main_out = OpTypeStruct %v4float
+        %111 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+       %sums = OpVariable %_ptr_Function__arr_float_uint_3 Function %27
+          %i = OpVariable %_ptr_Function_int Function %30
+  %indexable = OpVariable %_ptr_Function_mat2v4float Function %34
+         %38 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %39 = OpLoad %float %38
+         %40 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %41 = OpLoad %float %40
+         %42 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %43 = OpLoad %float %42
+         %44 = OpCompositeConstruct %_arr_float_uint_3 %39 %41 %43
+               OpStore %sums %44
+               OpStore %i %int_0
+               OpBranch %45
+         %45 = OpLabel
+               OpLoopMerge %46 %47 None
+               OpBranch %48
+         %48 = OpLabel
+         %49 = OpLoad %int %i
+         %51 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %52 = OpLoad %int %51
+         %53 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %54 = OpLoad %int %53
+         %55 = OpExtInst %int %56 SClamp %52 %54 %int_2
+         %58 = OpSLessThan %bool %49 %55
+               OpSelectionMerge %60 None
+               OpBranchConditional %58 %61 %62
+         %61 = OpLabel
+               OpBranch %60
+         %62 = OpLabel
+               OpBranch %46
+         %60 = OpLabel
+         %63 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_2
+         %64 = OpLoad %int %63
+         %65 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %66 = OpLoad %float %65
+         %67 = OpLoad %int %i
+         %69 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %70 = OpLoad %int %69
+         %72 = OpCompositeConstruct %v4float %66 %float_0 %float_0 %float_0
+         %73 = OpCompositeConstruct %v4float %float_0 %66 %float_0 %float_0
+         %74 = OpCompositeConstruct %mat2v4float %72 %73
+               OpStore %indexable %74
+         %76 = OpAccessChain %_ptr_Function_float %indexable %67 %70
+         %77 = OpLoad %float %76
+         %78 = OpAccessChain %_ptr_Function_float %sums %64
+         %79 = OpLoad %float %78
+         %80 = OpAccessChain %_ptr_Function_float %sums %64
+         %81 = OpFAdd %float %79 %77
+               OpStore %80 %81
+               OpBranch %47
+         %47 = OpLabel
+         %82 = OpLoad %int %i
+         %83 = OpIAdd %int %82 %int_1
+               OpStore %i %83
+               OpBranch %45
+         %46 = OpLabel
+         %84 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_2
+         %85 = OpLoad %int %84
+         %86 = OpAccessChain %_ptr_Function_float %sums %85
+         %87 = OpLoad %float %86
+         %88 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %89 = OpLoad %float %88
+         %90 = OpFOrdEqual %bool %87 %89
+               OpSelectionMerge %91 None
+               OpBranchConditional %90 %92 %93
+         %92 = OpLabel
+         %94 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %95 = OpLoad %int %94
+         %96 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %97 = OpLoad %int %96
+         %98 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %99 = OpLoad %int %98
+        %100 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+        %101 = OpLoad %int %100
+        %102 = OpConvertSToF %float %95
+        %103 = OpConvertSToF %float %97
+        %104 = OpConvertSToF %float %99
+        %105 = OpConvertSToF %float %101
+        %106 = OpCompositeConstruct %v4float %102 %103 %104 %105
+               OpStore %x_GLF_color %106
+               OpBranch %91
+         %93 = OpLabel
+        %107 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+        %108 = OpLoad %int %107
+        %109 = OpConvertSToF %float %108
+        %110 = OpCompositeConstruct %v4float %109 %109 %109 %109
+               OpStore %x_GLF_color %110
+               OpBranch %91
+         %91 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %111
+%tint_symbol = OpFunctionParameter %main_out
+        %115 = OpLabel
+        %116 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %116
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %118 = OpLabel
+        %119 = OpFunctionCall %void %main_1
+        %121 = OpLoad %v4float %x_GLF_color
+        %122 = OpCompositeConstruct %main_out %121
+        %120 = OpFunctionCall %void %tint_symbol_2 %122
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-loop-limit-increment-float-array/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-loop-limit-increment-float-array/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..07d81cb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-loop-limit-increment-float-array/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,78 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var sums : array<f32, 3>;
+  var i : i32;
+  var indexable : mat2x4<f32>;
+  let x_40 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_42 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_44 : f32 = x_6.x_GLF_uniform_float_values[0];
+  sums = array<f32, 3>(x_40, x_42, x_44);
+  i = 0;
+  loop {
+    let x_50 : i32 = i;
+    let x_52 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_54 : i32 = x_9.x_GLF_uniform_int_values[0];
+    if ((x_50 < clamp(x_52, x_54, 2))) {
+    } else {
+      break;
+    }
+    let x_59 : i32 = x_9.x_GLF_uniform_int_values[2];
+    let x_61 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_65 : i32 = i;
+    let x_67 : i32 = x_9.x_GLF_uniform_int_values[1];
+    indexable = mat2x4<f32>(vec4<f32>(x_61, 0.0, 0.0, 0.0), vec4<f32>(0.0, x_61, 0.0, 0.0));
+    let x_69 : f32 = indexable[x_65][x_67];
+    let x_71 : f32 = sums[x_59];
+    sums[x_59] = (x_71 + x_69);
+
+    continuing {
+      let x_74 : i32 = i;
+      i = (x_74 + 1);
+    }
+  }
+  let x_77 : i32 = x_9.x_GLF_uniform_int_values[2];
+  let x_79 : f32 = sums[x_77];
+  let x_81 : f32 = x_6.x_GLF_uniform_float_values[1];
+  if ((x_79 == x_81)) {
+    let x_87 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_90 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_93 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_96 : i32 = x_9.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_87), f32(x_90), f32(x_93), f32(x_96));
+  } else {
+    let x_100 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_101 : f32 = f32(x_100);
+    x_GLF_color = vec4<f32>(x_101, x_101, x_101, x_101);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-loop-limit-increment-float-array/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-loop-limit-increment-float-array/0-opt.wgsl
new file mode 100644
index 0000000..07d81cb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-loop-limit-increment-float-array/0-opt.wgsl
@@ -0,0 +1,78 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var sums : array<f32, 3>;
+  var i : i32;
+  var indexable : mat2x4<f32>;
+  let x_40 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_42 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_44 : f32 = x_6.x_GLF_uniform_float_values[0];
+  sums = array<f32, 3>(x_40, x_42, x_44);
+  i = 0;
+  loop {
+    let x_50 : i32 = i;
+    let x_52 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_54 : i32 = x_9.x_GLF_uniform_int_values[0];
+    if ((x_50 < clamp(x_52, x_54, 2))) {
+    } else {
+      break;
+    }
+    let x_59 : i32 = x_9.x_GLF_uniform_int_values[2];
+    let x_61 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_65 : i32 = i;
+    let x_67 : i32 = x_9.x_GLF_uniform_int_values[1];
+    indexable = mat2x4<f32>(vec4<f32>(x_61, 0.0, 0.0, 0.0), vec4<f32>(0.0, x_61, 0.0, 0.0));
+    let x_69 : f32 = indexable[x_65][x_67];
+    let x_71 : f32 = sums[x_59];
+    sums[x_59] = (x_71 + x_69);
+
+    continuing {
+      let x_74 : i32 = i;
+      i = (x_74 + 1);
+    }
+  }
+  let x_77 : i32 = x_9.x_GLF_uniform_int_values[2];
+  let x_79 : f32 = sums[x_77];
+  let x_81 : f32 = x_6.x_GLF_uniform_float_values[1];
+  if ((x_79 == x_81)) {
+    let x_87 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_90 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_93 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_96 : i32 = x_9.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_87), f32(x_90), f32(x_93), f32(x_96));
+  } else {
+    let x_100 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_101 : f32 = f32(x_100);
+    x_GLF_color = vec4<f32>(x_101, x_101, x_101, x_101);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-loop-limit-increment-float-array/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-loop-limit-increment-float-array/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..d99ee63
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-loop-limit-increment-float-array/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,76 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+cbuffer cbuffer_x_9 : register(b1, space0) {
+  uint4 x_9[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float sums[3] = (float[3])0;
+  int i = 0;
+  float2x4 indexable = float2x4(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_40 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_42 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const float x_44 = asfloat(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  const float tint_symbol_4[3] = {x_40, x_42, x_44};
+  sums = tint_symbol_4;
+  i = 0;
+  while (true) {
+    const int x_50 = i;
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_52 = asint(x_9[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_54 = asint(x_9[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    if ((x_50 < clamp(x_52, x_54, 2))) {
+    } else {
+      break;
+    }
+    const int x_59 = asint(x_9[2].x);
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const float x_61 = asfloat(x_6[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    const int x_65 = i;
+    const int x_67 = asint(x_9[1].x);
+    indexable = float2x4(float4(x_61, 0.0f, 0.0f, 0.0f), float4(0.0f, x_61, 0.0f, 0.0f));
+    const float x_69 = indexable[x_65][x_67];
+    const float x_71 = sums[x_59];
+    sums[x_59] = (x_71 + x_69);
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_77 = asint(x_9[2].x);
+  const float x_79 = sums[x_77];
+  const float x_81 = asfloat(x_6[1].x);
+  if ((x_79 == x_81)) {
+    const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+    const int x_87 = asint(x_9[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+    const int x_90 = asint(x_9[1].x);
+    const int x_93 = asint(x_9[1].x);
+    const uint scalar_offset_7 = ((16u * uint(0))) / 4;
+    const int x_96 = asint(x_9[scalar_offset_7 / 4][scalar_offset_7 % 4]);
+    x_GLF_color = float4(float(x_87), float(x_90), float(x_93), float(x_96));
+  } else {
+    const int x_100 = asint(x_9[1].x);
+    const float x_101 = float(x_100);
+    x_GLF_color = float4(x_101, x_101, x_101, x_101);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-loop-limit-increment-float-array/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-loop-limit-increment-float-array/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..d993da9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-loop-limit-increment-float-array/0-opt.wgsl.expected.msl
@@ -0,0 +1,89 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_2 {
+  float arr[3];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_9, thread float4* const tint_symbol_5) {
+  tint_array_wrapper_2 sums = {};
+  int i = 0;
+  float2x4 indexable = float2x4(0.0f);
+  float const x_40 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_42 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_44 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  tint_array_wrapper_2 const tint_symbol_3 = {.arr={x_40, x_42, x_44}};
+  sums = tint_symbol_3;
+  i = 0;
+  while (true) {
+    int const x_50 = i;
+    int const x_52 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    int const x_54 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_50 < clamp(x_52, x_54, 2))) {
+    } else {
+      break;
+    }
+    int const x_59 = x_9.x_GLF_uniform_int_values.arr[2].el;
+    float const x_61 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    int const x_65 = i;
+    int const x_67 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    indexable = float2x4(float4(x_61, 0.0f, 0.0f, 0.0f), float4(0.0f, x_61, 0.0f, 0.0f));
+    float const x_69 = indexable[x_65][x_67];
+    float const x_71 = sums.arr[x_59];
+    sums.arr[x_59] = (x_71 + x_69);
+    {
+      int const x_74 = i;
+      i = (x_74 + 1);
+    }
+  }
+  int const x_77 = x_9.x_GLF_uniform_int_values.arr[2].el;
+  float const x_79 = sums.arr[x_77];
+  float const x_81 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  if ((x_79 == x_81)) {
+    int const x_87 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    int const x_90 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_93 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_96 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_5) = float4(float(x_87), float(x_90), float(x_93), float(x_96));
+  } else {
+    int const x_100 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    float const x_101 = float(x_100);
+    *(tint_symbol_5) = float4(x_101, x_101, x_101, x_101);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_9 [[buffer(1)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-loop-limit-increment-float-array/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-clamp-loop-limit-increment-float-array/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..9bb7464
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-loop-limit-increment-float-array/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,190 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 123
+; Schema: 0
+               OpCapability Shader
+         %56 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %sums "sums"
+               OpName %i "i"
+               OpName %indexable "indexable"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_9 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+%_ptr_Function__arr_float_uint_3 = OpTypePointer Function %_arr_float_uint_3
+         %27 = OpConstantNull %_arr_float_uint_3
+%_ptr_Function_int = OpTypePointer Function %int
+         %30 = OpConstantNull %int
+%mat2v4float = OpTypeMatrix %v4float 2
+%_ptr_Function_mat2v4float = OpTypePointer Function %mat2v4float
+         %34 = OpConstantNull %mat2v4float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+%_ptr_Function_float = OpTypePointer Function %float
+   %main_out = OpTypeStruct %v4float
+        %111 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+       %sums = OpVariable %_ptr_Function__arr_float_uint_3 Function %27
+          %i = OpVariable %_ptr_Function_int Function %30
+  %indexable = OpVariable %_ptr_Function_mat2v4float Function %34
+         %38 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %39 = OpLoad %float %38
+         %40 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %41 = OpLoad %float %40
+         %42 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %43 = OpLoad %float %42
+         %44 = OpCompositeConstruct %_arr_float_uint_3 %39 %41 %43
+               OpStore %sums %44
+               OpStore %i %int_0
+               OpBranch %45
+         %45 = OpLabel
+               OpLoopMerge %46 %47 None
+               OpBranch %48
+         %48 = OpLabel
+         %49 = OpLoad %int %i
+         %51 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %52 = OpLoad %int %51
+         %53 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %54 = OpLoad %int %53
+         %55 = OpExtInst %int %56 SClamp %52 %54 %int_2
+         %58 = OpSLessThan %bool %49 %55
+               OpSelectionMerge %60 None
+               OpBranchConditional %58 %61 %62
+         %61 = OpLabel
+               OpBranch %60
+         %62 = OpLabel
+               OpBranch %46
+         %60 = OpLabel
+         %63 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_2
+         %64 = OpLoad %int %63
+         %65 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %66 = OpLoad %float %65
+         %67 = OpLoad %int %i
+         %69 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %70 = OpLoad %int %69
+         %72 = OpCompositeConstruct %v4float %66 %float_0 %float_0 %float_0
+         %73 = OpCompositeConstruct %v4float %float_0 %66 %float_0 %float_0
+         %74 = OpCompositeConstruct %mat2v4float %72 %73
+               OpStore %indexable %74
+         %76 = OpAccessChain %_ptr_Function_float %indexable %67 %70
+         %77 = OpLoad %float %76
+         %78 = OpAccessChain %_ptr_Function_float %sums %64
+         %79 = OpLoad %float %78
+         %80 = OpAccessChain %_ptr_Function_float %sums %64
+         %81 = OpFAdd %float %79 %77
+               OpStore %80 %81
+               OpBranch %47
+         %47 = OpLabel
+         %82 = OpLoad %int %i
+         %83 = OpIAdd %int %82 %int_1
+               OpStore %i %83
+               OpBranch %45
+         %46 = OpLabel
+         %84 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_2
+         %85 = OpLoad %int %84
+         %86 = OpAccessChain %_ptr_Function_float %sums %85
+         %87 = OpLoad %float %86
+         %88 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %89 = OpLoad %float %88
+         %90 = OpFOrdEqual %bool %87 %89
+               OpSelectionMerge %91 None
+               OpBranchConditional %90 %92 %93
+         %92 = OpLabel
+         %94 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %95 = OpLoad %int %94
+         %96 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %97 = OpLoad %int %96
+         %98 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %99 = OpLoad %int %98
+        %100 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+        %101 = OpLoad %int %100
+        %102 = OpConvertSToF %float %95
+        %103 = OpConvertSToF %float %97
+        %104 = OpConvertSToF %float %99
+        %105 = OpConvertSToF %float %101
+        %106 = OpCompositeConstruct %v4float %102 %103 %104 %105
+               OpStore %x_GLF_color %106
+               OpBranch %91
+         %93 = OpLabel
+        %107 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+        %108 = OpLoad %int %107
+        %109 = OpConvertSToF %float %108
+        %110 = OpCompositeConstruct %v4float %109 %109 %109 %109
+               OpStore %x_GLF_color %110
+               OpBranch %91
+         %91 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %111
+%tint_symbol = OpFunctionParameter %main_out
+        %115 = OpLabel
+        %116 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %116
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %118 = OpLabel
+        %119 = OpFunctionCall %void %main_1
+        %121 = OpLoad %v4float %x_GLF_color
+        %122 = OpCompositeConstruct %main_out %121
+        %120 = OpFunctionCall %void %tint_symbol_2 %122
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-loop-limit-increment-float-array/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-loop-limit-increment-float-array/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..07d81cb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-loop-limit-increment-float-array/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,78 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var sums : array<f32, 3>;
+  var i : i32;
+  var indexable : mat2x4<f32>;
+  let x_40 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_42 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_44 : f32 = x_6.x_GLF_uniform_float_values[0];
+  sums = array<f32, 3>(x_40, x_42, x_44);
+  i = 0;
+  loop {
+    let x_50 : i32 = i;
+    let x_52 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_54 : i32 = x_9.x_GLF_uniform_int_values[0];
+    if ((x_50 < clamp(x_52, x_54, 2))) {
+    } else {
+      break;
+    }
+    let x_59 : i32 = x_9.x_GLF_uniform_int_values[2];
+    let x_61 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_65 : i32 = i;
+    let x_67 : i32 = x_9.x_GLF_uniform_int_values[1];
+    indexable = mat2x4<f32>(vec4<f32>(x_61, 0.0, 0.0, 0.0), vec4<f32>(0.0, x_61, 0.0, 0.0));
+    let x_69 : f32 = indexable[x_65][x_67];
+    let x_71 : f32 = sums[x_59];
+    sums[x_59] = (x_71 + x_69);
+
+    continuing {
+      let x_74 : i32 = i;
+      i = (x_74 + 1);
+    }
+  }
+  let x_77 : i32 = x_9.x_GLF_uniform_int_values[2];
+  let x_79 : f32 = sums[x_77];
+  let x_81 : f32 = x_6.x_GLF_uniform_float_values[1];
+  if ((x_79 == x_81)) {
+    let x_87 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_90 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_93 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_96 : i32 = x_9.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_87), f32(x_90), f32(x_93), f32(x_96));
+  } else {
+    let x_100 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_101 : f32 = f32(x_100);
+    x_GLF_color = vec4<f32>(x_101, x_101, x_101, x_101);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-lower-limit-from-always-false/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-clamp-lower-limit-from-always-false/0-opt.spvasm
new file mode 100644
index 0000000..3b37d9a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-lower-limit-from-always-false/0-opt.spvasm
@@ -0,0 +1,97 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_1 = OpConstant %float 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+    %float_0 = OpConstant %float 0
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %main = OpFunction %void None %13
+         %31 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function
+          %b = OpVariable %_ptr_Function_float Function
+               OpStore %a %float_1
+         %32 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %33 = OpLoad %float %32
+         %34 = OpLoad %float %a
+         %35 = OpSelect %float %false %34 %float_0
+         %36 = OpExtInst %float %1 FClamp %33 %35 %float_1
+               OpStore %b %36
+         %37 = OpLoad %float %b
+         %38 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %39 = OpLoad %float %38
+         %40 = OpFOrdEqual %bool %37 %39
+               OpSelectionMerge %41 None
+               OpBranchConditional %40 %42 %43
+         %42 = OpLabel
+         %44 = OpLoad %float %b
+         %45 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %46 = OpLoad %float %45
+         %47 = OpFMul %float %44 %46
+         %48 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %49 = OpLoad %int %48
+         %50 = OpConvertSToF %float %49
+         %51 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %52 = OpLoad %int %51
+         %53 = OpConvertSToF %float %52
+         %54 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %55 = OpLoad %int %54
+         %56 = OpConvertSToF %float %55
+         %57 = OpCompositeConstruct %v4float %47 %50 %53 %56
+               OpStore %_GLF_color %57
+               OpBranch %41
+         %43 = OpLabel
+         %58 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %59 = OpLoad %int %58
+         %60 = OpConvertSToF %float %59
+         %61 = OpCompositeConstruct %v4float %60 %60 %60 %60
+               OpStore %_GLF_color %61
+               OpBranch %41
+         %41 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-lower-limit-from-always-false/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-lower-limit-from-always-false/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..9f5ecd9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-lower-limit-from-always-false/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,48 @@
+cbuffer cbuffer_x_7 : register(b1, space0) {
+  uint4 x_7[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[2];
+};
+
+void main_1() {
+  float a = 0.0f;
+  float b = 0.0f;
+  a = 1.0f;
+  const float x_33 = asfloat(x_7[1].x);
+  b = clamp(x_33, (false ? a : 0.0f), 1.0f);
+  const float x_37 = b;
+  const float x_39 = asfloat(x_7[1].x);
+  if ((x_37 == x_39)) {
+    const float x_44 = b;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const float x_46 = asfloat(x_7[scalar_offset / 4][scalar_offset % 4]);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_49 = asint(x_9[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_52 = asint(x_9[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_55 = asint(x_9[1].x);
+    x_GLF_color = float4((x_44 * x_46), float(x_49), float(x_52), float(x_55));
+  } else {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_59 = asint(x_9[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const float x_60 = float(x_59);
+    x_GLF_color = float4(x_60, x_60, x_60, x_60);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-lower-limit-from-always-false/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-lower-limit-from-always-false/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..526c96a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-lower-limit-from-always-false/0-opt.spvasm.expected.msl
@@ -0,0 +1,62 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_7, constant buf0& x_9, thread float4* const tint_symbol_4) {
+  float a = 0.0f;
+  float b = 0.0f;
+  a = 1.0f;
+  float const x_33 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  float const x_34 = a;
+  b = clamp(x_33, select(0.0f, x_34, false), 1.0f);
+  float const x_37 = b;
+  float const x_39 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  if ((x_37 == x_39)) {
+    float const x_44 = b;
+    float const x_46 = x_7.x_GLF_uniform_float_values.arr[0].el;
+    int const x_49 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    int const x_52 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    int const x_55 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4((x_44 * x_46), float(x_49), float(x_52), float(x_55));
+  } else {
+    int const x_59 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    float const x_60 = float(x_59);
+    *(tint_symbol_4) = float4(x_60, x_60, x_60, x_60);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_7 [[buffer(1)]], constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-lower-limit-from-always-false/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-clamp-lower-limit-from-always-false/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..81d2e09
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-lower-limit-from-always-false/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,132 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 79
+; Schema: 0
+               OpCapability Shader
+         %35 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_7 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %11 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %11
+        %int = OpTypeInt 32 1
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %11
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %25 = OpConstantNull %float
+    %float_1 = OpConstant %float 1
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+    %float_0 = OpConstant %float 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+         %67 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function %25
+          %b = OpVariable %_ptr_Function_float Function %25
+               OpStore %a %float_1
+         %31 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %32 = OpLoad %float %31
+         %33 = OpLoad %float %a
+         %36 = OpSelect %float %false %33 %float_0
+         %34 = OpExtInst %float %35 NClamp %32 %36 %float_1
+               OpStore %b %34
+         %40 = OpLoad %float %b
+         %41 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %42 = OpLoad %float %41
+         %43 = OpFOrdEqual %bool %40 %42
+               OpSelectionMerge %44 None
+               OpBranchConditional %43 %45 %46
+         %45 = OpLabel
+         %47 = OpLoad %float %b
+         %49 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %50 = OpLoad %float %49
+         %52 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %53 = OpLoad %int %52
+         %54 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %55 = OpLoad %int %54
+         %56 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %57 = OpLoad %int %56
+         %58 = OpFMul %float %47 %50
+         %59 = OpConvertSToF %float %53
+         %60 = OpConvertSToF %float %55
+         %61 = OpConvertSToF %float %57
+         %62 = OpCompositeConstruct %v4float %58 %59 %60 %61
+               OpStore %x_GLF_color %62
+               OpBranch %44
+         %46 = OpLabel
+         %63 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %64 = OpLoad %int %63
+         %65 = OpConvertSToF %float %64
+         %66 = OpCompositeConstruct %v4float %65 %65 %65 %65
+               OpStore %x_GLF_color %66
+               OpBranch %44
+         %44 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %67
+%tint_symbol = OpFunctionParameter %main_out
+         %71 = OpLabel
+         %72 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %72
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+         %74 = OpLabel
+         %75 = OpFunctionCall %void %main_1
+         %77 = OpLoad %v4float %x_GLF_color
+         %78 = OpCompositeConstruct %main_out %77
+         %76 = OpFunctionCall %void %tint_symbol_2 %78
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-lower-limit-from-always-false/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-lower-limit-from-always-false/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..883179d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-lower-limit-from-always-false/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,54 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+fn main_1() {
+  var a : f32;
+  var b : f32;
+  a = 1.0;
+  let x_33 : f32 = x_7.x_GLF_uniform_float_values[1];
+  let x_34 : f32 = a;
+  b = clamp(x_33, select(0.0, x_34, false), 1.0);
+  let x_37 : f32 = b;
+  let x_39 : f32 = x_7.x_GLF_uniform_float_values[1];
+  if ((x_37 == x_39)) {
+    let x_44 : f32 = b;
+    let x_46 : f32 = x_7.x_GLF_uniform_float_values[0];
+    let x_49 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_52 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_55 : i32 = x_9.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>((x_44 * x_46), f32(x_49), f32(x_52), f32(x_55));
+  } else {
+    let x_59 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_60 : f32 = f32(x_59);
+    x_GLF_color = vec4<f32>(x_60, x_60, x_60, x_60);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-lower-limit-from-always-false/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-lower-limit-from-always-false/0-opt.wgsl
new file mode 100644
index 0000000..883179d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-lower-limit-from-always-false/0-opt.wgsl
@@ -0,0 +1,54 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+fn main_1() {
+  var a : f32;
+  var b : f32;
+  a = 1.0;
+  let x_33 : f32 = x_7.x_GLF_uniform_float_values[1];
+  let x_34 : f32 = a;
+  b = clamp(x_33, select(0.0, x_34, false), 1.0);
+  let x_37 : f32 = b;
+  let x_39 : f32 = x_7.x_GLF_uniform_float_values[1];
+  if ((x_37 == x_39)) {
+    let x_44 : f32 = b;
+    let x_46 : f32 = x_7.x_GLF_uniform_float_values[0];
+    let x_49 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_52 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_55 : i32 = x_9.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>((x_44 * x_46), f32(x_49), f32(x_52), f32(x_55));
+  } else {
+    let x_59 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_60 : f32 = f32(x_59);
+    x_GLF_color = vec4<f32>(x_60, x_60, x_60, x_60);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-lower-limit-from-always-false/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-lower-limit-from-always-false/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..9f5ecd9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-lower-limit-from-always-false/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,48 @@
+cbuffer cbuffer_x_7 : register(b1, space0) {
+  uint4 x_7[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[2];
+};
+
+void main_1() {
+  float a = 0.0f;
+  float b = 0.0f;
+  a = 1.0f;
+  const float x_33 = asfloat(x_7[1].x);
+  b = clamp(x_33, (false ? a : 0.0f), 1.0f);
+  const float x_37 = b;
+  const float x_39 = asfloat(x_7[1].x);
+  if ((x_37 == x_39)) {
+    const float x_44 = b;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const float x_46 = asfloat(x_7[scalar_offset / 4][scalar_offset % 4]);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_49 = asint(x_9[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_52 = asint(x_9[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_55 = asint(x_9[1].x);
+    x_GLF_color = float4((x_44 * x_46), float(x_49), float(x_52), float(x_55));
+  } else {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_59 = asint(x_9[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const float x_60 = float(x_59);
+    x_GLF_color = float4(x_60, x_60, x_60, x_60);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-lower-limit-from-always-false/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-lower-limit-from-always-false/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..526c96a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-lower-limit-from-always-false/0-opt.wgsl.expected.msl
@@ -0,0 +1,62 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_7, constant buf0& x_9, thread float4* const tint_symbol_4) {
+  float a = 0.0f;
+  float b = 0.0f;
+  a = 1.0f;
+  float const x_33 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  float const x_34 = a;
+  b = clamp(x_33, select(0.0f, x_34, false), 1.0f);
+  float const x_37 = b;
+  float const x_39 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  if ((x_37 == x_39)) {
+    float const x_44 = b;
+    float const x_46 = x_7.x_GLF_uniform_float_values.arr[0].el;
+    int const x_49 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    int const x_52 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    int const x_55 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4((x_44 * x_46), float(x_49), float(x_52), float(x_55));
+  } else {
+    int const x_59 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    float const x_60 = float(x_59);
+    *(tint_symbol_4) = float4(x_60, x_60, x_60, x_60);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_7 [[buffer(1)]], constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-lower-limit-from-always-false/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-clamp-lower-limit-from-always-false/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..81d2e09
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-lower-limit-from-always-false/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,132 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 79
+; Schema: 0
+               OpCapability Shader
+         %35 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_7 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %11 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %11
+        %int = OpTypeInt 32 1
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %11
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %25 = OpConstantNull %float
+    %float_1 = OpConstant %float 1
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+    %float_0 = OpConstant %float 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+         %67 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function %25
+          %b = OpVariable %_ptr_Function_float Function %25
+               OpStore %a %float_1
+         %31 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %32 = OpLoad %float %31
+         %33 = OpLoad %float %a
+         %36 = OpSelect %float %false %33 %float_0
+         %34 = OpExtInst %float %35 NClamp %32 %36 %float_1
+               OpStore %b %34
+         %40 = OpLoad %float %b
+         %41 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %42 = OpLoad %float %41
+         %43 = OpFOrdEqual %bool %40 %42
+               OpSelectionMerge %44 None
+               OpBranchConditional %43 %45 %46
+         %45 = OpLabel
+         %47 = OpLoad %float %b
+         %49 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %50 = OpLoad %float %49
+         %52 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %53 = OpLoad %int %52
+         %54 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %55 = OpLoad %int %54
+         %56 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %57 = OpLoad %int %56
+         %58 = OpFMul %float %47 %50
+         %59 = OpConvertSToF %float %53
+         %60 = OpConvertSToF %float %55
+         %61 = OpConvertSToF %float %57
+         %62 = OpCompositeConstruct %v4float %58 %59 %60 %61
+               OpStore %x_GLF_color %62
+               OpBranch %44
+         %46 = OpLabel
+         %63 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %64 = OpLoad %int %63
+         %65 = OpConvertSToF %float %64
+         %66 = OpCompositeConstruct %v4float %65 %65 %65 %65
+               OpStore %x_GLF_color %66
+               OpBranch %44
+         %44 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %67
+%tint_symbol = OpFunctionParameter %main_out
+         %71 = OpLabel
+         %72 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %72
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+         %74 = OpLabel
+         %75 = OpFunctionCall %void %main_1
+         %77 = OpLoad %v4float %x_GLF_color
+         %78 = OpCompositeConstruct %main_out %77
+         %76 = OpFunctionCall %void %tint_symbol_2 %78
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-lower-limit-from-always-false/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-lower-limit-from-always-false/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..883179d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-lower-limit-from-always-false/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,54 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+fn main_1() {
+  var a : f32;
+  var b : f32;
+  a = 1.0;
+  let x_33 : f32 = x_7.x_GLF_uniform_float_values[1];
+  let x_34 : f32 = a;
+  b = clamp(x_33, select(0.0, x_34, false), 1.0);
+  let x_37 : f32 = b;
+  let x_39 : f32 = x_7.x_GLF_uniform_float_values[1];
+  if ((x_37 == x_39)) {
+    let x_44 : f32 = b;
+    let x_46 : f32 = x_7.x_GLF_uniform_float_values[0];
+    let x_49 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_52 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_55 : i32 = x_9.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>((x_44 * x_46), f32(x_49), f32(x_52), f32(x_55));
+  } else {
+    let x_59 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_60 : f32 = f32(x_59);
+    x_GLF_color = vec4<f32>(x_60, x_60, x_60, x_60);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.spvasm
new file mode 100644
index 0000000..4885ce2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.spvasm
@@ -0,0 +1,184 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %v "v"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_5 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_int_uint_5 = OpTypeArray %int %uint_5
+       %buf1 = OpTypeStruct %_arr_int_uint_5
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_4 = OpConstant %int 4
+       %bool = OpTypeBool
+%mat4v4float = OpTypeMatrix %v4float 4
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_float = OpTypePointer Function %float
+     %v4bool = OpTypeVector %bool 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %13
+         %38 = OpLabel
+          %v = OpVariable %_ptr_Function_v4float Function
+          %i = OpVariable %_ptr_Function_int Function
+         %39 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %40 = OpLoad %int %39
+         %41 = OpConvertSToF %float %40
+         %42 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %43 = OpLoad %int %42
+         %44 = OpConvertSToF %float %43
+         %45 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %46 = OpLoad %int %45
+         %47 = OpConvertSToF %float %46
+         %48 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %49 = OpLoad %int %48
+         %50 = OpConvertSToF %float %49
+         %51 = OpCompositeConstruct %v4float %41 %44 %47 %50
+               OpStore %v %51
+         %52 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_4
+         %53 = OpLoad %int %52
+               OpStore %i %53
+               OpBranch %54
+         %54 = OpLabel
+               OpLoopMerge %55 %56 None
+               OpBranch %57
+         %57 = OpLabel
+         %58 = OpLoad %int %i
+         %59 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %60 = OpLoad %int %59
+         %61 = OpSLessThan %bool %58 %60
+               OpBranchConditional %61 %62 %55
+         %62 = OpLabel
+         %63 = OpLoad %v4float %v
+         %64 = OpLoad %v4float %v
+         %65 = OpLoad %v4float %v
+         %66 = OpLoad %v4float %v
+         %67 = OpCompositeExtract %float %63 0
+         %68 = OpCompositeExtract %float %63 1
+         %69 = OpCompositeExtract %float %63 2
+         %70 = OpCompositeExtract %float %63 3
+         %71 = OpCompositeExtract %float %64 0
+         %72 = OpCompositeExtract %float %64 1
+         %73 = OpCompositeExtract %float %64 2
+         %74 = OpCompositeExtract %float %64 3
+         %75 = OpCompositeExtract %float %65 0
+         %76 = OpCompositeExtract %float %65 1
+         %77 = OpCompositeExtract %float %65 2
+         %78 = OpCompositeExtract %float %65 3
+         %79 = OpCompositeExtract %float %66 0
+         %80 = OpCompositeExtract %float %66 1
+         %81 = OpCompositeExtract %float %66 2
+         %82 = OpCompositeExtract %float %66 3
+         %83 = OpCompositeConstruct %v4float %67 %68 %69 %70
+         %84 = OpCompositeConstruct %v4float %71 %72 %73 %74
+         %85 = OpCompositeConstruct %v4float %75 %76 %77 %78
+         %86 = OpCompositeConstruct %v4float %79 %80 %81 %82
+         %87 = OpCompositeConstruct %mat4v4float %83 %84 %85 %86
+         %88 = OpLoad %int %i
+         %89 = OpCompositeExtract %v4float %87 0
+         %90 = OpVectorExtractDynamic %float %89 %88
+         %91 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %92 = OpLoad %float %91
+         %93 = OpFOrdGreaterThan %bool %90 %92
+               OpSelectionMerge %94 None
+               OpBranchConditional %93 %95 %94
+         %95 = OpLabel
+         %96 = OpLoad %int %i
+         %97 = OpLoad %v4float %v
+         %98 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_1
+         %99 = OpLoad %float %98
+        %100 = OpCompositeConstruct %v4float %99 %99 %99 %99
+        %101 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+        %102 = OpLoad %float %101
+        %103 = OpCompositeConstruct %v4float %102 %102 %102 %102
+        %104 = OpExtInst %v4float %1 FClamp %97 %100 %103
+        %105 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+        %106 = OpLoad %int %105
+        %107 = OpVectorExtractDynamic %float %104 %106
+        %108 = OpAccessChain %_ptr_Function_float %v %96
+               OpStore %108 %107
+               OpBranch %94
+         %94 = OpLabel
+               OpBranch %56
+         %56 = OpLabel
+        %109 = OpLoad %int %i
+        %110 = OpIAdd %int %109 %int_1
+               OpStore %i %110
+               OpBranch %54
+         %55 = OpLabel
+        %111 = OpLoad %v4float %v
+        %112 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+        %113 = OpLoad %int %112
+        %114 = OpConvertSToF %float %113
+        %115 = OpCompositeConstruct %v4float %114 %114 %114 %114
+        %116 = OpFOrdEqual %v4bool %111 %115
+        %117 = OpAll %bool %116
+               OpSelectionMerge %118 None
+               OpBranchConditional %117 %119 %120
+        %119 = OpLabel
+        %121 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+        %122 = OpLoad %int %121
+        %123 = OpConvertSToF %float %122
+        %124 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_4
+        %125 = OpLoad %int %124
+        %126 = OpConvertSToF %float %125
+        %127 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_4
+        %128 = OpLoad %int %127
+        %129 = OpConvertSToF %float %128
+        %130 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+        %131 = OpLoad %int %130
+        %132 = OpConvertSToF %float %131
+        %133 = OpCompositeConstruct %v4float %123 %126 %129 %132
+               OpStore %_GLF_color %133
+               OpBranch %118
+        %120 = OpLabel
+        %134 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_4
+        %135 = OpLoad %int %134
+        %136 = OpConvertSToF %float %135
+        %137 = OpCompositeConstruct %v4float %136 %136 %136 %136
+               OpStore %_GLF_color %137
+               OpBranch %118
+        %118 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..2f20f12
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,81 @@
+void set_float4(inout float4 vec, int idx, float val) {
+  vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
+}
+
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[5];
+};
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 v = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int i = 0;
+  const int x_40 = asint(x_6[1].x);
+  const int x_43 = asint(x_6[2].x);
+  const int x_46 = asint(x_6[3].x);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_49 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  v = float4(float(x_40), float(x_43), float(x_46), float(x_49));
+  const int x_53 = asint(x_6[4].x);
+  i = x_53;
+  while (true) {
+    const int x_58 = i;
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_60 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    if ((x_58 < x_60)) {
+    } else {
+      break;
+    }
+    const float4 x_63 = v;
+    const float4 x_64 = v;
+    const float4 x_65 = v;
+    const float4 x_66 = v;
+    const int x_88 = i;
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const float x_92 = asfloat(x_9[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    if ((float4x4(float4(x_63.x, x_63.y, x_63.z, x_63.w), float4(x_64.x, x_64.y, x_64.z, x_64.w), float4(x_65.x, x_65.y, x_65.z, x_65.w), float4(x_66.x, x_66.y, x_66.z, x_66.w))[0u][x_88] > x_92)) {
+      const int x_96 = i;
+      const float4 x_97 = v;
+      const float x_99 = asfloat(x_9[1].x);
+      const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+      const float x_102 = asfloat(x_9[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+      const int x_106 = asint(x_6[1].x);
+      set_float4(v, x_96, clamp(x_97, float4(x_99, x_99, x_99, x_99), float4(x_102, x_102, x_102, x_102))[x_106]);
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  const float4 x_111 = v;
+  const int x_113 = asint(x_6[1].x);
+  const float x_114 = float(x_113);
+  if (all((x_111 == float4(x_114, x_114, x_114, x_114)))) {
+    const int x_122 = asint(x_6[1].x);
+    const int x_125 = asint(x_6[4].x);
+    const int x_128 = asint(x_6[4].x);
+    const int x_131 = asint(x_6[1].x);
+    x_GLF_color = float4(float(x_122), float(x_125), float(x_128), float(x_131));
+  } else {
+    const int x_135 = asint(x_6[4].x);
+    const float x_136 = float(x_135);
+    x_GLF_color = float4(x_136, x_136, x_136, x_136);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..3c693a4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.spvasm.expected.msl
@@ -0,0 +1,91 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[5];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_9, thread float4* const tint_symbol_4) {
+  float4 v = 0.0f;
+  int i = 0;
+  int const x_40 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_43 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_46 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  int const x_49 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  v = float4(float(x_40), float(x_43), float(x_46), float(x_49));
+  int const x_53 = x_6.x_GLF_uniform_int_values.arr[4].el;
+  i = x_53;
+  while (true) {
+    int const x_58 = i;
+    int const x_60 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_58 < x_60)) {
+    } else {
+      break;
+    }
+    float4 const x_63 = v;
+    float4 const x_64 = v;
+    float4 const x_65 = v;
+    float4 const x_66 = v;
+    int const x_88 = i;
+    float const x_92 = x_9.x_GLF_uniform_float_values.arr[0].el;
+    if ((float4x4(float4(x_63.x, x_63.y, x_63.z, x_63.w), float4(x_64.x, x_64.y, x_64.z, x_64.w), float4(x_65.x, x_65.y, x_65.z, x_65.w), float4(x_66.x, x_66.y, x_66.z, x_66.w))[0u][x_88] > x_92)) {
+      int const x_96 = i;
+      float4 const x_97 = v;
+      float const x_99 = x_9.x_GLF_uniform_float_values.arr[1].el;
+      float const x_102 = x_9.x_GLF_uniform_float_values.arr[0].el;
+      int const x_106 = x_6.x_GLF_uniform_int_values.arr[1].el;
+      v[x_96] = clamp(x_97, float4(x_99, x_99, x_99, x_99), float4(x_102, x_102, x_102, x_102))[x_106];
+    }
+    {
+      int const x_109 = i;
+      i = (x_109 + 1);
+    }
+  }
+  float4 const x_111 = v;
+  int const x_113 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  float const x_114 = float(x_113);
+  if (all((x_111 == float4(x_114, x_114, x_114, x_114)))) {
+    int const x_122 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_125 = x_6.x_GLF_uniform_int_values.arr[4].el;
+    int const x_128 = x_6.x_GLF_uniform_int_values.arr[4].el;
+    int const x_131 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_122), float(x_125), float(x_128), float(x_131));
+  } else {
+    int const x_135 = x_6.x_GLF_uniform_int_values.arr[4].el;
+    float const x_136 = float(x_135);
+    *(tint_symbol_4) = float4(x_136, x_136, x_136, x_136);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..fa87ce8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,222 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 155
+; Schema: 0
+               OpCapability Shader
+        %109 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v "v"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_5 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_int_uint_5 = OpTypeArray %int %uint_5
+       %buf1 = OpTypeStruct %_arr_int_uint_5
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %float = OpTypeFloat 32
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%_ptr_Function_int = OpTypePointer Function %int
+         %28 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+       %bool = OpTypeBool
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%mat4v4float = OpTypeMatrix %v4float 4
+%_ptr_Function_float = OpTypePointer Function %float
+     %v4bool = OpTypeVector %bool 4
+   %main_out = OpTypeStruct %v4float
+        %143 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+          %v = OpVariable %_ptr_Function_v4float Function %17
+          %i = OpVariable %_ptr_Function_int Function %28
+         %32 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %33 = OpLoad %int %32
+         %35 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %36 = OpLoad %int %35
+         %38 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %39 = OpLoad %int %38
+         %41 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %42 = OpLoad %int %41
+         %43 = OpConvertSToF %float %33
+         %44 = OpConvertSToF %float %36
+         %45 = OpConvertSToF %float %39
+         %46 = OpConvertSToF %float %42
+         %47 = OpCompositeConstruct %v4float %43 %44 %45 %46
+               OpStore %v %47
+         %49 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+         %50 = OpLoad %int %49
+               OpStore %i %50
+               OpBranch %51
+         %51 = OpLabel
+               OpLoopMerge %52 %53 None
+               OpBranch %54
+         %54 = OpLabel
+         %55 = OpLoad %int %i
+         %56 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %57 = OpLoad %int %56
+         %58 = OpSLessThan %bool %55 %57
+               OpSelectionMerge %60 None
+               OpBranchConditional %58 %61 %62
+         %61 = OpLabel
+               OpBranch %60
+         %62 = OpLabel
+               OpBranch %52
+         %60 = OpLabel
+         %63 = OpLoad %v4float %v
+         %64 = OpLoad %v4float %v
+         %65 = OpLoad %v4float %v
+         %66 = OpLoad %v4float %v
+         %67 = OpLoad %int %i
+         %69 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_0
+         %70 = OpLoad %float %69
+         %72 = OpCompositeExtract %float %63 0
+         %73 = OpCompositeExtract %float %63 1
+         %74 = OpCompositeExtract %float %63 2
+         %75 = OpCompositeExtract %float %63 3
+         %76 = OpCompositeConstruct %v4float %72 %73 %74 %75
+         %77 = OpCompositeExtract %float %64 0
+         %78 = OpCompositeExtract %float %64 1
+         %79 = OpCompositeExtract %float %64 2
+         %80 = OpCompositeExtract %float %64 3
+         %81 = OpCompositeConstruct %v4float %77 %78 %79 %80
+         %82 = OpCompositeExtract %float %65 0
+         %83 = OpCompositeExtract %float %65 1
+         %84 = OpCompositeExtract %float %65 2
+         %85 = OpCompositeExtract %float %65 3
+         %86 = OpCompositeConstruct %v4float %82 %83 %84 %85
+         %87 = OpCompositeExtract %float %66 0
+         %88 = OpCompositeExtract %float %66 1
+         %89 = OpCompositeExtract %float %66 2
+         %90 = OpCompositeExtract %float %66 3
+         %91 = OpCompositeConstruct %v4float %87 %88 %89 %90
+         %92 = OpCompositeConstruct %mat4v4float %76 %81 %86 %91
+         %93 = OpCompositeExtract %v4float %92 0
+         %94 = OpVectorExtractDynamic %float %93 %67
+         %95 = OpFOrdGreaterThan %bool %94 %70
+               OpSelectionMerge %96 None
+               OpBranchConditional %95 %97 %96
+         %97 = OpLabel
+         %98 = OpLoad %int %i
+         %99 = OpLoad %v4float %v
+        %100 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_1
+        %101 = OpLoad %float %100
+        %102 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_0
+        %103 = OpLoad %float %102
+        %104 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %105 = OpLoad %int %104
+        %107 = OpAccessChain %_ptr_Function_float %v %98
+        %110 = OpCompositeConstruct %v4float %101 %101 %101 %101
+        %111 = OpCompositeConstruct %v4float %103 %103 %103 %103
+        %108 = OpExtInst %v4float %109 NClamp %99 %110 %111
+        %112 = OpVectorExtractDynamic %float %108 %105
+               OpStore %107 %112
+               OpBranch %96
+         %96 = OpLabel
+               OpBranch %53
+         %53 = OpLabel
+        %113 = OpLoad %int %i
+        %114 = OpIAdd %int %113 %int_1
+               OpStore %i %114
+               OpBranch %51
+         %52 = OpLabel
+        %115 = OpLoad %v4float %v
+        %116 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %117 = OpLoad %int %116
+        %118 = OpConvertSToF %float %117
+        %120 = OpCompositeConstruct %v4float %118 %118 %118 %118
+        %121 = OpFOrdEqual %v4bool %115 %120
+        %119 = OpAll %bool %121
+               OpSelectionMerge %123 None
+               OpBranchConditional %119 %124 %125
+        %124 = OpLabel
+        %126 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %127 = OpLoad %int %126
+        %128 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+        %129 = OpLoad %int %128
+        %130 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+        %131 = OpLoad %int %130
+        %132 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %133 = OpLoad %int %132
+        %134 = OpConvertSToF %float %127
+        %135 = OpConvertSToF %float %129
+        %136 = OpConvertSToF %float %131
+        %137 = OpConvertSToF %float %133
+        %138 = OpCompositeConstruct %v4float %134 %135 %136 %137
+               OpStore %x_GLF_color %138
+               OpBranch %123
+        %125 = OpLabel
+        %139 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+        %140 = OpLoad %int %139
+        %141 = OpConvertSToF %float %140
+        %142 = OpCompositeConstruct %v4float %141 %141 %141 %141
+               OpStore %x_GLF_color %142
+               OpBranch %123
+        %123 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %143
+%tint_symbol = OpFunctionParameter %main_out
+        %147 = OpLabel
+        %148 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %148
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %150 = OpLabel
+        %151 = OpFunctionCall %void %main_1
+        %153 = OpLoad %v4float %x_GLF_color
+        %154 = OpCompositeConstruct %main_out %153
+        %152 = OpFunctionCall %void %tint_symbol_2 %154
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..667c5e6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,84 @@
+type Arr = [[stride(16)]] array<i32, 5>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v : vec4<f32>;
+  var i : i32;
+  let x_40 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_43 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_46 : i32 = x_6.x_GLF_uniform_int_values[3];
+  let x_49 : i32 = x_6.x_GLF_uniform_int_values[0];
+  v = vec4<f32>(f32(x_40), f32(x_43), f32(x_46), f32(x_49));
+  let x_53 : i32 = x_6.x_GLF_uniform_int_values[4];
+  i = x_53;
+  loop {
+    let x_58 : i32 = i;
+    let x_60 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_58 < x_60)) {
+    } else {
+      break;
+    }
+    let x_63 : vec4<f32> = v;
+    let x_64 : vec4<f32> = v;
+    let x_65 : vec4<f32> = v;
+    let x_66 : vec4<f32> = v;
+    let x_88 : i32 = i;
+    let x_92 : f32 = x_9.x_GLF_uniform_float_values[0];
+    if ((mat4x4<f32>(vec4<f32>(x_63.x, x_63.y, x_63.z, x_63.w), vec4<f32>(x_64.x, x_64.y, x_64.z, x_64.w), vec4<f32>(x_65.x, x_65.y, x_65.z, x_65.w), vec4<f32>(x_66.x, x_66.y, x_66.z, x_66.w))[0u][x_88] > x_92)) {
+      let x_96 : i32 = i;
+      let x_97 : vec4<f32> = v;
+      let x_99 : f32 = x_9.x_GLF_uniform_float_values[1];
+      let x_102 : f32 = x_9.x_GLF_uniform_float_values[0];
+      let x_106 : i32 = x_6.x_GLF_uniform_int_values[1];
+      v[x_96] = clamp(x_97, vec4<f32>(x_99, x_99, x_99, x_99), vec4<f32>(x_102, x_102, x_102, x_102))[x_106];
+    }
+
+    continuing {
+      let x_109 : i32 = i;
+      i = (x_109 + 1);
+    }
+  }
+  let x_111 : vec4<f32> = v;
+  let x_113 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_114 : f32 = f32(x_113);
+  if (all((x_111 == vec4<f32>(x_114, x_114, x_114, x_114)))) {
+    let x_122 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_125 : i32 = x_6.x_GLF_uniform_int_values[4];
+    let x_128 : i32 = x_6.x_GLF_uniform_int_values[4];
+    let x_131 : i32 = x_6.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_122), f32(x_125), f32(x_128), f32(x_131));
+  } else {
+    let x_135 : i32 = x_6.x_GLF_uniform_int_values[4];
+    let x_136 : f32 = f32(x_135);
+    x_GLF_color = vec4<f32>(x_136, x_136, x_136, x_136);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.wgsl
new file mode 100644
index 0000000..667c5e6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.wgsl
@@ -0,0 +1,84 @@
+type Arr = [[stride(16)]] array<i32, 5>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v : vec4<f32>;
+  var i : i32;
+  let x_40 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_43 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_46 : i32 = x_6.x_GLF_uniform_int_values[3];
+  let x_49 : i32 = x_6.x_GLF_uniform_int_values[0];
+  v = vec4<f32>(f32(x_40), f32(x_43), f32(x_46), f32(x_49));
+  let x_53 : i32 = x_6.x_GLF_uniform_int_values[4];
+  i = x_53;
+  loop {
+    let x_58 : i32 = i;
+    let x_60 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_58 < x_60)) {
+    } else {
+      break;
+    }
+    let x_63 : vec4<f32> = v;
+    let x_64 : vec4<f32> = v;
+    let x_65 : vec4<f32> = v;
+    let x_66 : vec4<f32> = v;
+    let x_88 : i32 = i;
+    let x_92 : f32 = x_9.x_GLF_uniform_float_values[0];
+    if ((mat4x4<f32>(vec4<f32>(x_63.x, x_63.y, x_63.z, x_63.w), vec4<f32>(x_64.x, x_64.y, x_64.z, x_64.w), vec4<f32>(x_65.x, x_65.y, x_65.z, x_65.w), vec4<f32>(x_66.x, x_66.y, x_66.z, x_66.w))[0u][x_88] > x_92)) {
+      let x_96 : i32 = i;
+      let x_97 : vec4<f32> = v;
+      let x_99 : f32 = x_9.x_GLF_uniform_float_values[1];
+      let x_102 : f32 = x_9.x_GLF_uniform_float_values[0];
+      let x_106 : i32 = x_6.x_GLF_uniform_int_values[1];
+      v[x_96] = clamp(x_97, vec4<f32>(x_99, x_99, x_99, x_99), vec4<f32>(x_102, x_102, x_102, x_102))[x_106];
+    }
+
+    continuing {
+      let x_109 : i32 = i;
+      i = (x_109 + 1);
+    }
+  }
+  let x_111 : vec4<f32> = v;
+  let x_113 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_114 : f32 = f32(x_113);
+  if (all((x_111 == vec4<f32>(x_114, x_114, x_114, x_114)))) {
+    let x_122 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_125 : i32 = x_6.x_GLF_uniform_int_values[4];
+    let x_128 : i32 = x_6.x_GLF_uniform_int_values[4];
+    let x_131 : i32 = x_6.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_122), f32(x_125), f32(x_128), f32(x_131));
+  } else {
+    let x_135 : i32 = x_6.x_GLF_uniform_int_values[4];
+    let x_136 : f32 = f32(x_135);
+    x_GLF_color = vec4<f32>(x_136, x_136, x_136, x_136);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..2f20f12
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,81 @@
+void set_float4(inout float4 vec, int idx, float val) {
+  vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
+}
+
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[5];
+};
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 v = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int i = 0;
+  const int x_40 = asint(x_6[1].x);
+  const int x_43 = asint(x_6[2].x);
+  const int x_46 = asint(x_6[3].x);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_49 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  v = float4(float(x_40), float(x_43), float(x_46), float(x_49));
+  const int x_53 = asint(x_6[4].x);
+  i = x_53;
+  while (true) {
+    const int x_58 = i;
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_60 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    if ((x_58 < x_60)) {
+    } else {
+      break;
+    }
+    const float4 x_63 = v;
+    const float4 x_64 = v;
+    const float4 x_65 = v;
+    const float4 x_66 = v;
+    const int x_88 = i;
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const float x_92 = asfloat(x_9[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    if ((float4x4(float4(x_63.x, x_63.y, x_63.z, x_63.w), float4(x_64.x, x_64.y, x_64.z, x_64.w), float4(x_65.x, x_65.y, x_65.z, x_65.w), float4(x_66.x, x_66.y, x_66.z, x_66.w))[0u][x_88] > x_92)) {
+      const int x_96 = i;
+      const float4 x_97 = v;
+      const float x_99 = asfloat(x_9[1].x);
+      const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+      const float x_102 = asfloat(x_9[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+      const int x_106 = asint(x_6[1].x);
+      set_float4(v, x_96, clamp(x_97, float4(x_99, x_99, x_99, x_99), float4(x_102, x_102, x_102, x_102))[x_106]);
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  const float4 x_111 = v;
+  const int x_113 = asint(x_6[1].x);
+  const float x_114 = float(x_113);
+  if (all((x_111 == float4(x_114, x_114, x_114, x_114)))) {
+    const int x_122 = asint(x_6[1].x);
+    const int x_125 = asint(x_6[4].x);
+    const int x_128 = asint(x_6[4].x);
+    const int x_131 = asint(x_6[1].x);
+    x_GLF_color = float4(float(x_122), float(x_125), float(x_128), float(x_131));
+  } else {
+    const int x_135 = asint(x_6[4].x);
+    const float x_136 = float(x_135);
+    x_GLF_color = float4(x_136, x_136, x_136, x_136);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..3c693a4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.wgsl.expected.msl
@@ -0,0 +1,91 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[5];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_9, thread float4* const tint_symbol_4) {
+  float4 v = 0.0f;
+  int i = 0;
+  int const x_40 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_43 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_46 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  int const x_49 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  v = float4(float(x_40), float(x_43), float(x_46), float(x_49));
+  int const x_53 = x_6.x_GLF_uniform_int_values.arr[4].el;
+  i = x_53;
+  while (true) {
+    int const x_58 = i;
+    int const x_60 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_58 < x_60)) {
+    } else {
+      break;
+    }
+    float4 const x_63 = v;
+    float4 const x_64 = v;
+    float4 const x_65 = v;
+    float4 const x_66 = v;
+    int const x_88 = i;
+    float const x_92 = x_9.x_GLF_uniform_float_values.arr[0].el;
+    if ((float4x4(float4(x_63.x, x_63.y, x_63.z, x_63.w), float4(x_64.x, x_64.y, x_64.z, x_64.w), float4(x_65.x, x_65.y, x_65.z, x_65.w), float4(x_66.x, x_66.y, x_66.z, x_66.w))[0u][x_88] > x_92)) {
+      int const x_96 = i;
+      float4 const x_97 = v;
+      float const x_99 = x_9.x_GLF_uniform_float_values.arr[1].el;
+      float const x_102 = x_9.x_GLF_uniform_float_values.arr[0].el;
+      int const x_106 = x_6.x_GLF_uniform_int_values.arr[1].el;
+      v[x_96] = clamp(x_97, float4(x_99, x_99, x_99, x_99), float4(x_102, x_102, x_102, x_102))[x_106];
+    }
+    {
+      int const x_109 = i;
+      i = (x_109 + 1);
+    }
+  }
+  float4 const x_111 = v;
+  int const x_113 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  float const x_114 = float(x_113);
+  if (all((x_111 == float4(x_114, x_114, x_114, x_114)))) {
+    int const x_122 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_125 = x_6.x_GLF_uniform_int_values.arr[4].el;
+    int const x_128 = x_6.x_GLF_uniform_int_values.arr[4].el;
+    int const x_131 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_122), float(x_125), float(x_128), float(x_131));
+  } else {
+    int const x_135 = x_6.x_GLF_uniform_int_values.arr[4].el;
+    float const x_136 = float(x_135);
+    *(tint_symbol_4) = float4(x_136, x_136, x_136, x_136);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..fa87ce8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,222 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 155
+; Schema: 0
+               OpCapability Shader
+        %109 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v "v"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_5 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_int_uint_5 = OpTypeArray %int %uint_5
+       %buf1 = OpTypeStruct %_arr_int_uint_5
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %float = OpTypeFloat 32
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%_ptr_Function_int = OpTypePointer Function %int
+         %28 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+       %bool = OpTypeBool
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%mat4v4float = OpTypeMatrix %v4float 4
+%_ptr_Function_float = OpTypePointer Function %float
+     %v4bool = OpTypeVector %bool 4
+   %main_out = OpTypeStruct %v4float
+        %143 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+          %v = OpVariable %_ptr_Function_v4float Function %17
+          %i = OpVariable %_ptr_Function_int Function %28
+         %32 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %33 = OpLoad %int %32
+         %35 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %36 = OpLoad %int %35
+         %38 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %39 = OpLoad %int %38
+         %41 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %42 = OpLoad %int %41
+         %43 = OpConvertSToF %float %33
+         %44 = OpConvertSToF %float %36
+         %45 = OpConvertSToF %float %39
+         %46 = OpConvertSToF %float %42
+         %47 = OpCompositeConstruct %v4float %43 %44 %45 %46
+               OpStore %v %47
+         %49 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+         %50 = OpLoad %int %49
+               OpStore %i %50
+               OpBranch %51
+         %51 = OpLabel
+               OpLoopMerge %52 %53 None
+               OpBranch %54
+         %54 = OpLabel
+         %55 = OpLoad %int %i
+         %56 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %57 = OpLoad %int %56
+         %58 = OpSLessThan %bool %55 %57
+               OpSelectionMerge %60 None
+               OpBranchConditional %58 %61 %62
+         %61 = OpLabel
+               OpBranch %60
+         %62 = OpLabel
+               OpBranch %52
+         %60 = OpLabel
+         %63 = OpLoad %v4float %v
+         %64 = OpLoad %v4float %v
+         %65 = OpLoad %v4float %v
+         %66 = OpLoad %v4float %v
+         %67 = OpLoad %int %i
+         %69 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_0
+         %70 = OpLoad %float %69
+         %72 = OpCompositeExtract %float %63 0
+         %73 = OpCompositeExtract %float %63 1
+         %74 = OpCompositeExtract %float %63 2
+         %75 = OpCompositeExtract %float %63 3
+         %76 = OpCompositeConstruct %v4float %72 %73 %74 %75
+         %77 = OpCompositeExtract %float %64 0
+         %78 = OpCompositeExtract %float %64 1
+         %79 = OpCompositeExtract %float %64 2
+         %80 = OpCompositeExtract %float %64 3
+         %81 = OpCompositeConstruct %v4float %77 %78 %79 %80
+         %82 = OpCompositeExtract %float %65 0
+         %83 = OpCompositeExtract %float %65 1
+         %84 = OpCompositeExtract %float %65 2
+         %85 = OpCompositeExtract %float %65 3
+         %86 = OpCompositeConstruct %v4float %82 %83 %84 %85
+         %87 = OpCompositeExtract %float %66 0
+         %88 = OpCompositeExtract %float %66 1
+         %89 = OpCompositeExtract %float %66 2
+         %90 = OpCompositeExtract %float %66 3
+         %91 = OpCompositeConstruct %v4float %87 %88 %89 %90
+         %92 = OpCompositeConstruct %mat4v4float %76 %81 %86 %91
+         %93 = OpCompositeExtract %v4float %92 0
+         %94 = OpVectorExtractDynamic %float %93 %67
+         %95 = OpFOrdGreaterThan %bool %94 %70
+               OpSelectionMerge %96 None
+               OpBranchConditional %95 %97 %96
+         %97 = OpLabel
+         %98 = OpLoad %int %i
+         %99 = OpLoad %v4float %v
+        %100 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_1
+        %101 = OpLoad %float %100
+        %102 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_0
+        %103 = OpLoad %float %102
+        %104 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %105 = OpLoad %int %104
+        %107 = OpAccessChain %_ptr_Function_float %v %98
+        %110 = OpCompositeConstruct %v4float %101 %101 %101 %101
+        %111 = OpCompositeConstruct %v4float %103 %103 %103 %103
+        %108 = OpExtInst %v4float %109 NClamp %99 %110 %111
+        %112 = OpVectorExtractDynamic %float %108 %105
+               OpStore %107 %112
+               OpBranch %96
+         %96 = OpLabel
+               OpBranch %53
+         %53 = OpLabel
+        %113 = OpLoad %int %i
+        %114 = OpIAdd %int %113 %int_1
+               OpStore %i %114
+               OpBranch %51
+         %52 = OpLabel
+        %115 = OpLoad %v4float %v
+        %116 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %117 = OpLoad %int %116
+        %118 = OpConvertSToF %float %117
+        %120 = OpCompositeConstruct %v4float %118 %118 %118 %118
+        %121 = OpFOrdEqual %v4bool %115 %120
+        %119 = OpAll %bool %121
+               OpSelectionMerge %123 None
+               OpBranchConditional %119 %124 %125
+        %124 = OpLabel
+        %126 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %127 = OpLoad %int %126
+        %128 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+        %129 = OpLoad %int %128
+        %130 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+        %131 = OpLoad %int %130
+        %132 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %133 = OpLoad %int %132
+        %134 = OpConvertSToF %float %127
+        %135 = OpConvertSToF %float %129
+        %136 = OpConvertSToF %float %131
+        %137 = OpConvertSToF %float %133
+        %138 = OpCompositeConstruct %v4float %134 %135 %136 %137
+               OpStore %x_GLF_color %138
+               OpBranch %123
+        %125 = OpLabel
+        %139 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+        %140 = OpLoad %int %139
+        %141 = OpConvertSToF %float %140
+        %142 = OpCompositeConstruct %v4float %141 %141 %141 %141
+               OpStore %x_GLF_color %142
+               OpBranch %123
+        %123 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %143
+%tint_symbol = OpFunctionParameter %main_out
+        %147 = OpLabel
+        %148 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %148
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %150 = OpLabel
+        %151 = OpFunctionCall %void %main_1
+        %153 = OpLoad %v4float %x_GLF_color
+        %154 = OpCompositeConstruct %main_out %153
+        %152 = OpFunctionCall %void %tint_symbol_2 %154
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..667c5e6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-component-condition-using-matrix/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,84 @@
+type Arr = [[stride(16)]] array<i32, 5>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v : vec4<f32>;
+  var i : i32;
+  let x_40 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_43 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_46 : i32 = x_6.x_GLF_uniform_int_values[3];
+  let x_49 : i32 = x_6.x_GLF_uniform_int_values[0];
+  v = vec4<f32>(f32(x_40), f32(x_43), f32(x_46), f32(x_49));
+  let x_53 : i32 = x_6.x_GLF_uniform_int_values[4];
+  i = x_53;
+  loop {
+    let x_58 : i32 = i;
+    let x_60 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_58 < x_60)) {
+    } else {
+      break;
+    }
+    let x_63 : vec4<f32> = v;
+    let x_64 : vec4<f32> = v;
+    let x_65 : vec4<f32> = v;
+    let x_66 : vec4<f32> = v;
+    let x_88 : i32 = i;
+    let x_92 : f32 = x_9.x_GLF_uniform_float_values[0];
+    if ((mat4x4<f32>(vec4<f32>(x_63.x, x_63.y, x_63.z, x_63.w), vec4<f32>(x_64.x, x_64.y, x_64.z, x_64.w), vec4<f32>(x_65.x, x_65.y, x_65.z, x_65.w), vec4<f32>(x_66.x, x_66.y, x_66.z, x_66.w))[0u][x_88] > x_92)) {
+      let x_96 : i32 = i;
+      let x_97 : vec4<f32> = v;
+      let x_99 : f32 = x_9.x_GLF_uniform_float_values[1];
+      let x_102 : f32 = x_9.x_GLF_uniform_float_values[0];
+      let x_106 : i32 = x_6.x_GLF_uniform_int_values[1];
+      v[x_96] = clamp(x_97, vec4<f32>(x_99, x_99, x_99, x_99), vec4<f32>(x_102, x_102, x_102, x_102))[x_106];
+    }
+
+    continuing {
+      let x_109 : i32 = i;
+      i = (x_109 + 1);
+    }
+  }
+  let x_111 : vec4<f32> = v;
+  let x_113 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_114 : f32 = f32(x_113);
+  if (all((x_111 == vec4<f32>(x_114, x_114, x_114, x_114)))) {
+    let x_122 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_125 : i32 = x_6.x_GLF_uniform_int_values[4];
+    let x_128 : i32 = x_6.x_GLF_uniform_int_values[4];
+    let x_131 : i32 = x_6.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_122), f32(x_125), f32(x_128), f32(x_131));
+  } else {
+    let x_135 : i32 = x_6.x_GLF_uniform_int_values[4];
+    let x_136 : f32 = f32(x_135);
+    x_GLF_color = vec4<f32>(x_136, x_136, x_136, x_136);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-element-ceil-negative/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-element-ceil-negative/0-opt.spvasm
new file mode 100644
index 0000000..b12b364
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-element-ceil-negative/0-opt.spvasm
@@ -0,0 +1,106 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %v0 "v0"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %v1 "v1"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%float_n580_015015 = OpConstant %float -580.015015
+  %float_100 = OpConstant %float 100
+         %26 = OpConstantComposite %v2float %float_100 %float_100
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_float = OpTypePointer Function %float
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %main = OpFunction %void None %13
+         %34 = OpLabel
+         %v0 = OpVariable %_ptr_Function_v2float Function
+         %v1 = OpVariable %_ptr_Function_v2float Function
+         %35 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %36 = OpLoad %float %35
+         %37 = OpCompositeConstruct %v2float %36 %float_n580_015015
+               OpStore %v0 %37
+         %38 = OpLoad %v2float %v0
+         %39 = OpExtInst %v2float %1 Ceil %38
+         %40 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %41 = OpLoad %float %40
+         %42 = OpFNegate %float %41
+         %43 = OpCompositeConstruct %v2float %42 %42
+         %44 = OpExtInst %v2float %1 FClamp %39 %43 %26
+               OpStore %v1 %44
+         %45 = OpAccessChain %_ptr_Function_float %v1 %uint_1
+         %46 = OpLoad %float %45
+         %47 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %48 = OpLoad %float %47
+         %49 = OpFNegate %float %48
+         %50 = OpFOrdEqual %bool %46 %49
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %53
+         %52 = OpLabel
+         %54 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %55 = OpLoad %int %54
+         %56 = OpConvertSToF %float %55
+         %57 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %58 = OpLoad %int %57
+         %59 = OpConvertSToF %float %58
+         %60 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %61 = OpLoad %int %60
+         %62 = OpConvertSToF %float %61
+         %63 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %64 = OpLoad %int %63
+         %65 = OpConvertSToF %float %64
+         %66 = OpCompositeConstruct %v4float %56 %59 %62 %65
+               OpStore %_GLF_color %66
+               OpBranch %51
+         %53 = OpLabel
+         %67 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %68 = OpLoad %int %67
+         %69 = OpConvertSToF %float %68
+         %70 = OpCompositeConstruct %v4float %69 %69 %69 %69
+               OpStore %_GLF_color %70
+               OpBranch %51
+         %51 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-element-ceil-negative/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-element-ceil-negative/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..50ae4f3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-element-ceil-negative/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,50 @@
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[2];
+};
+
+void main_1() {
+  float2 v0 = float2(0.0f, 0.0f);
+  float2 v1 = float2(0.0f, 0.0f);
+  const float x_36 = asfloat(x_6[1].x);
+  v0 = float2(x_36, -580.015014648f);
+  const float2 x_38 = v0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_41 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const float x_42 = -(x_41);
+  v1 = clamp(ceil(x_38), float2(x_42, x_42), float2(100.0f, 100.0f));
+  const float x_46 = v1.y;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_48 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_46 == -(x_48))) {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_55 = asint(x_9[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_58 = asint(x_9[1].x);
+    const int x_61 = asint(x_9[1].x);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_64 = asint(x_9[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    x_GLF_color = float4(float(x_55), float(x_58), float(x_61), float(x_64));
+  } else {
+    const int x_68 = asint(x_9[1].x);
+    const float x_69 = float(x_68);
+    x_GLF_color = float4(x_69, x_69, x_69, x_69);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-element-ceil-negative/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-element-ceil-negative/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..79fe600
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-element-ceil-negative/0-opt.spvasm.expected.msl
@@ -0,0 +1,63 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_9, thread float4* const tint_symbol_4) {
+  float2 v0 = 0.0f;
+  float2 v1 = 0.0f;
+  float const x_36 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  v0 = float2(x_36, -580.015014648f);
+  float2 const x_38 = v0;
+  float const x_41 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_42 = -(x_41);
+  v1 = clamp(ceil(x_38), float2(x_42, x_42), float2(100.0f, 100.0f));
+  float const x_46 = v1.y;
+  float const x_48 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_46 == -(x_48))) {
+    int const x_55 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    int const x_58 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_61 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_64 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_55), float(x_58), float(x_61), float(x_64));
+  } else {
+    int const x_68 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    float const x_69 = float(x_68);
+    *(tint_symbol_4) = float4(x_69, x_69, x_69, x_69);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-element-ceil-negative/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-element-ceil-negative/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..5cf6c3e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-element-ceil-negative/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,141 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 88
+; Schema: 0
+               OpCapability Shader
+         %41 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v0 "v0"
+               OpName %v1 "v1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %11 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %11
+        %int = OpTypeInt 32 1
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %11
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %26 = OpConstantNull %v2float
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%float_n580_015015 = OpConstant %float -580.015015
+      %int_0 = OpConstant %int 0
+  %float_100 = OpConstant %float 100
+         %45 = OpConstantComposite %v2float %float_100 %float_100
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_float = OpTypePointer Function %float
+       %bool = OpTypeBool
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+         %76 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+         %v0 = OpVariable %_ptr_Function_v2float Function %26
+         %v1 = OpVariable %_ptr_Function_v2float Function %26
+         %31 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %32 = OpLoad %float %31
+         %34 = OpCompositeConstruct %v2float %32 %float_n580_015015
+               OpStore %v0 %34
+         %35 = OpLoad %v2float %v0
+         %37 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %38 = OpLoad %float %37
+         %39 = OpFNegate %float %38
+         %42 = OpExtInst %v2float %41 Ceil %35
+         %43 = OpCompositeConstruct %v2float %39 %39
+         %40 = OpExtInst %v2float %41 NClamp %42 %43 %45
+               OpStore %v1 %40
+         %48 = OpAccessChain %_ptr_Function_float %v1 %uint_1
+         %49 = OpLoad %float %48
+         %50 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %51 = OpLoad %float %50
+         %52 = OpFNegate %float %51
+         %53 = OpFOrdEqual %bool %49 %52
+               OpSelectionMerge %55 None
+               OpBranchConditional %53 %56 %57
+         %56 = OpLabel
+         %59 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %60 = OpLoad %int %59
+         %61 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %62 = OpLoad %int %61
+         %63 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %64 = OpLoad %int %63
+         %65 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %66 = OpLoad %int %65
+         %67 = OpConvertSToF %float %60
+         %68 = OpConvertSToF %float %62
+         %69 = OpConvertSToF %float %64
+         %70 = OpConvertSToF %float %66
+         %71 = OpCompositeConstruct %v4float %67 %68 %69 %70
+               OpStore %x_GLF_color %71
+               OpBranch %55
+         %57 = OpLabel
+         %72 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %73 = OpLoad %int %72
+         %74 = OpConvertSToF %float %73
+         %75 = OpCompositeConstruct %v4float %74 %74 %74 %74
+               OpStore %x_GLF_color %75
+               OpBranch %55
+         %55 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %76
+%tint_symbol = OpFunctionParameter %main_out
+         %80 = OpLabel
+         %81 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %81
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+         %83 = OpLabel
+         %84 = OpFunctionCall %void %main_1
+         %86 = OpLoad %v4float %x_GLF_color
+         %87 = OpCompositeConstruct %main_out %86
+         %85 = OpFunctionCall %void %tint_symbol_2 %87
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-element-ceil-negative/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-element-ceil-negative/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..bc87bc8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-element-ceil-negative/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,55 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+fn main_1() {
+  var v0 : vec2<f32>;
+  var v1 : vec2<f32>;
+  let x_36 : f32 = x_6.x_GLF_uniform_float_values[1];
+  v0 = vec2<f32>(x_36, -580.015014648);
+  let x_38 : vec2<f32> = v0;
+  let x_41 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_42 : f32 = -(x_41);
+  v1 = clamp(ceil(x_38), vec2<f32>(x_42, x_42), vec2<f32>(100.0, 100.0));
+  let x_46 : f32 = v1.y;
+  let x_48 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if ((x_46 == -(x_48))) {
+    let x_55 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_58 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_61 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_64 : i32 = x_9.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_55), f32(x_58), f32(x_61), f32(x_64));
+  } else {
+    let x_68 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_69 : f32 = f32(x_68);
+    x_GLF_color = vec4<f32>(x_69, x_69, x_69, x_69);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-element-ceil-negative/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-element-ceil-negative/0-opt.wgsl
new file mode 100644
index 0000000..bc87bc8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-element-ceil-negative/0-opt.wgsl
@@ -0,0 +1,55 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+fn main_1() {
+  var v0 : vec2<f32>;
+  var v1 : vec2<f32>;
+  let x_36 : f32 = x_6.x_GLF_uniform_float_values[1];
+  v0 = vec2<f32>(x_36, -580.015014648);
+  let x_38 : vec2<f32> = v0;
+  let x_41 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_42 : f32 = -(x_41);
+  v1 = clamp(ceil(x_38), vec2<f32>(x_42, x_42), vec2<f32>(100.0, 100.0));
+  let x_46 : f32 = v1.y;
+  let x_48 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if ((x_46 == -(x_48))) {
+    let x_55 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_58 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_61 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_64 : i32 = x_9.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_55), f32(x_58), f32(x_61), f32(x_64));
+  } else {
+    let x_68 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_69 : f32 = f32(x_68);
+    x_GLF_color = vec4<f32>(x_69, x_69, x_69, x_69);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-element-ceil-negative/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-element-ceil-negative/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..50ae4f3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-element-ceil-negative/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,50 @@
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[2];
+};
+
+void main_1() {
+  float2 v0 = float2(0.0f, 0.0f);
+  float2 v1 = float2(0.0f, 0.0f);
+  const float x_36 = asfloat(x_6[1].x);
+  v0 = float2(x_36, -580.015014648f);
+  const float2 x_38 = v0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_41 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const float x_42 = -(x_41);
+  v1 = clamp(ceil(x_38), float2(x_42, x_42), float2(100.0f, 100.0f));
+  const float x_46 = v1.y;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_48 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_46 == -(x_48))) {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_55 = asint(x_9[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_58 = asint(x_9[1].x);
+    const int x_61 = asint(x_9[1].x);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_64 = asint(x_9[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    x_GLF_color = float4(float(x_55), float(x_58), float(x_61), float(x_64));
+  } else {
+    const int x_68 = asint(x_9[1].x);
+    const float x_69 = float(x_68);
+    x_GLF_color = float4(x_69, x_69, x_69, x_69);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-element-ceil-negative/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-element-ceil-negative/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..79fe600
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-element-ceil-negative/0-opt.wgsl.expected.msl
@@ -0,0 +1,63 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_9, thread float4* const tint_symbol_4) {
+  float2 v0 = 0.0f;
+  float2 v1 = 0.0f;
+  float const x_36 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  v0 = float2(x_36, -580.015014648f);
+  float2 const x_38 = v0;
+  float const x_41 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_42 = -(x_41);
+  v1 = clamp(ceil(x_38), float2(x_42, x_42), float2(100.0f, 100.0f));
+  float const x_46 = v1.y;
+  float const x_48 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_46 == -(x_48))) {
+    int const x_55 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    int const x_58 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_61 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_64 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_55), float(x_58), float(x_61), float(x_64));
+  } else {
+    int const x_68 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    float const x_69 = float(x_68);
+    *(tint_symbol_4) = float4(x_69, x_69, x_69, x_69);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-element-ceil-negative/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-element-ceil-negative/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..5cf6c3e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-element-ceil-negative/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,141 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 88
+; Schema: 0
+               OpCapability Shader
+         %41 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v0 "v0"
+               OpName %v1 "v1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %11 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %11
+        %int = OpTypeInt 32 1
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %11
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %26 = OpConstantNull %v2float
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%float_n580_015015 = OpConstant %float -580.015015
+      %int_0 = OpConstant %int 0
+  %float_100 = OpConstant %float 100
+         %45 = OpConstantComposite %v2float %float_100 %float_100
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_float = OpTypePointer Function %float
+       %bool = OpTypeBool
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+         %76 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+         %v0 = OpVariable %_ptr_Function_v2float Function %26
+         %v1 = OpVariable %_ptr_Function_v2float Function %26
+         %31 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %32 = OpLoad %float %31
+         %34 = OpCompositeConstruct %v2float %32 %float_n580_015015
+               OpStore %v0 %34
+         %35 = OpLoad %v2float %v0
+         %37 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %38 = OpLoad %float %37
+         %39 = OpFNegate %float %38
+         %42 = OpExtInst %v2float %41 Ceil %35
+         %43 = OpCompositeConstruct %v2float %39 %39
+         %40 = OpExtInst %v2float %41 NClamp %42 %43 %45
+               OpStore %v1 %40
+         %48 = OpAccessChain %_ptr_Function_float %v1 %uint_1
+         %49 = OpLoad %float %48
+         %50 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %51 = OpLoad %float %50
+         %52 = OpFNegate %float %51
+         %53 = OpFOrdEqual %bool %49 %52
+               OpSelectionMerge %55 None
+               OpBranchConditional %53 %56 %57
+         %56 = OpLabel
+         %59 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %60 = OpLoad %int %59
+         %61 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %62 = OpLoad %int %61
+         %63 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %64 = OpLoad %int %63
+         %65 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %66 = OpLoad %int %65
+         %67 = OpConvertSToF %float %60
+         %68 = OpConvertSToF %float %62
+         %69 = OpConvertSToF %float %64
+         %70 = OpConvertSToF %float %66
+         %71 = OpCompositeConstruct %v4float %67 %68 %69 %70
+               OpStore %x_GLF_color %71
+               OpBranch %55
+         %57 = OpLabel
+         %72 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %73 = OpLoad %int %72
+         %74 = OpConvertSToF %float %73
+         %75 = OpCompositeConstruct %v4float %74 %74 %74 %74
+               OpStore %x_GLF_color %75
+               OpBranch %55
+         %55 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %76
+%tint_symbol = OpFunctionParameter %main_out
+         %80 = OpLabel
+         %81 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %81
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+         %83 = OpLabel
+         %84 = OpFunctionCall %void %main_1
+         %86 = OpLoad %v4float %x_GLF_color
+         %87 = OpCompositeConstruct %main_out %86
+         %85 = OpFunctionCall %void %tint_symbol_2 %87
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-element-ceil-negative/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-element-ceil-negative/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..bc87bc8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-element-ceil-negative/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,55 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+fn main_1() {
+  var v0 : vec2<f32>;
+  var v1 : vec2<f32>;
+  let x_36 : f32 = x_6.x_GLF_uniform_float_values[1];
+  v0 = vec2<f32>(x_36, -580.015014648);
+  let x_38 : vec2<f32> = v0;
+  let x_41 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_42 : f32 = -(x_41);
+  v1 = clamp(ceil(x_38), vec2<f32>(x_42, x_42), vec2<f32>(100.0, 100.0));
+  let x_46 : f32 = v1.y;
+  let x_48 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if ((x_46 == -(x_48))) {
+    let x_55 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_58 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_61 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_64 : i32 = x_9.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_55), f32(x_58), f32(x_61), f32(x_64));
+  } else {
+    let x_68 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_69 : f32 = f32(x_68);
+    x_GLF_color = vec4<f32>(x_69, x_69, x_69, x_69);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-variable-negative-offset/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-variable-negative-offset/0-opt.spvasm
new file mode 100644
index 0000000..2f7516b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-variable-negative-offset/0-opt.spvasm
@@ -0,0 +1,110 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %v0 "v0"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %v1 "v1"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf1 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%float_3_79999995 = OpConstant %float 3.79999995
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+     %v2bool = OpTypeVector %bool 2
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %main = OpFunction %void None %13
+         %35 = OpLabel
+         %v0 = OpVariable %_ptr_Function_v2float Function
+         %v1 = OpVariable %_ptr_Function_v2float Function
+         %36 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %37 = OpLoad %float %36
+         %38 = OpCompositeConstruct %v2float %37 %float_3_79999995
+               OpStore %v0 %38
+         %39 = OpLoad %v2float %v0
+         %40 = OpCompositeConstruct %v2float %float_1 %float_1
+         %41 = OpFSub %v2float %39 %40
+         %42 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %43 = OpLoad %float %42
+         %44 = OpCompositeConstruct %v2float %float_0 %float_0
+         %45 = OpCompositeConstruct %v2float %43 %43
+         %46 = OpExtInst %v2float %1 FClamp %41 %44 %45
+               OpStore %v1 %46
+         %47 = OpLoad %v2float %v1
+         %48 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %49 = OpLoad %float %48
+         %50 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %51 = OpLoad %float %50
+         %52 = OpCompositeConstruct %v2float %49 %51
+         %53 = OpFOrdEqual %v2bool %47 %52
+         %54 = OpAll %bool %53
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %57
+         %56 = OpLabel
+         %58 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %59 = OpLoad %int %58
+         %60 = OpConvertSToF %float %59
+         %61 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %62 = OpLoad %int %61
+         %63 = OpConvertSToF %float %62
+         %64 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %65 = OpLoad %int %64
+         %66 = OpConvertSToF %float %65
+         %67 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %68 = OpLoad %int %67
+         %69 = OpConvertSToF %float %68
+         %70 = OpCompositeConstruct %v4float %60 %63 %66 %69
+               OpStore %_GLF_color %70
+               OpBranch %55
+         %57 = OpLabel
+         %71 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %72 = OpLoad %int %71
+         %73 = OpConvertSToF %float %72
+         %74 = OpCompositeConstruct %v4float %73 %73 %73 %73
+               OpStore %_GLF_color %74
+               OpBranch %55
+         %55 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-variable-negative-offset/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-variable-negative-offset/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..8f6279c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-variable-negative-offset/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,49 @@
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[2];
+};
+
+void main_1() {
+  float2 v0 = float2(0.0f, 0.0f);
+  float2 v1 = float2(0.0f, 0.0f);
+  const float x_37 = asfloat(x_6[2].x);
+  v0 = float2(x_37, 3.799999952f);
+  const float2 x_39 = v0;
+  const float x_43 = asfloat(x_6[1].x);
+  v1 = clamp((x_39 - float2(1.0f, 1.0f)), float2(0.0f, 0.0f), float2(x_43, x_43));
+  const float2 x_47 = v1;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_49 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const float x_51 = asfloat(x_6[1].x);
+  if (all((x_47 == float2(x_49, x_51)))) {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_59 = asint(x_9[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const int x_62 = asint(x_9[1].x);
+    const int x_65 = asint(x_9[1].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_68 = asint(x_9[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    x_GLF_color = float4(float(x_59), float(x_62), float(x_65), float(x_68));
+  } else {
+    const int x_72 = asint(x_9[1].x);
+    const float x_73 = float(x_72);
+    x_GLF_color = float4(x_73, x_73, x_73, x_73);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-variable-negative-offset/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-variable-negative-offset/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..154e812
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-variable-negative-offset/0-opt.spvasm.expected.msl
@@ -0,0 +1,63 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_9, thread float4* const tint_symbol_4) {
+  float2 v0 = 0.0f;
+  float2 v1 = 0.0f;
+  float const x_37 = x_6.x_GLF_uniform_float_values.arr[2].el;
+  v0 = float2(x_37, 3.799999952f);
+  float2 const x_39 = v0;
+  float const x_43 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  v1 = clamp((x_39 - float2(1.0f, 1.0f)), float2(0.0f, 0.0f), float2(x_43, x_43));
+  float2 const x_47 = v1;
+  float const x_49 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_51 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  if (all((x_47 == float2(x_49, x_51)))) {
+    int const x_59 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    int const x_62 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_65 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_68 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_59), float(x_62), float(x_65), float(x_68));
+  } else {
+    int const x_72 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    float const x_73 = float(x_72);
+    *(tint_symbol_4) = float4(x_73, x_73, x_73, x_73);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-variable-negative-offset/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-variable-negative-offset/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..758face
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-variable-negative-offset/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,145 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 92
+; Schema: 0
+               OpCapability Shader
+         %41 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v0 "v0"
+               OpName %v1 "v1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf1 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %11 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %11
+        %int = OpTypeInt 32 1
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %11
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %27 = OpConstantNull %v2float
+     %uint_0 = OpConstant %uint 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%float_3_79999995 = OpConstant %float 3.79999995
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+         %43 = OpConstantComposite %v2float %float_1 %float_1
+    %float_0 = OpConstant %float 0
+         %46 = OpConstantComposite %v2float %float_0 %float_0
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+     %v2bool = OpTypeVector %bool 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+         %80 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+         %v0 = OpVariable %_ptr_Function_v2float Function %27
+         %v1 = OpVariable %_ptr_Function_v2float Function %27
+         %32 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %33 = OpLoad %float %32
+         %35 = OpCompositeConstruct %v2float %33 %float_3_79999995
+               OpStore %v0 %35
+         %36 = OpLoad %v2float %v0
+         %38 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %39 = OpLoad %float %38
+         %44 = OpFSub %v2float %36 %43
+         %47 = OpCompositeConstruct %v2float %39 %39
+         %40 = OpExtInst %v2float %41 NClamp %44 %46 %47
+               OpStore %v1 %40
+         %48 = OpLoad %v2float %v1
+         %50 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %51 = OpLoad %float %50
+         %52 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %53 = OpLoad %float %52
+         %56 = OpCompositeConstruct %v2float %51 %53
+         %57 = OpFOrdEqual %v2bool %48 %56
+         %54 = OpAll %bool %57
+               OpSelectionMerge %59 None
+               OpBranchConditional %54 %60 %61
+         %60 = OpLabel
+         %63 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %64 = OpLoad %int %63
+         %65 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %66 = OpLoad %int %65
+         %67 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %68 = OpLoad %int %67
+         %69 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %70 = OpLoad %int %69
+         %71 = OpConvertSToF %float %64
+         %72 = OpConvertSToF %float %66
+         %73 = OpConvertSToF %float %68
+         %74 = OpConvertSToF %float %70
+         %75 = OpCompositeConstruct %v4float %71 %72 %73 %74
+               OpStore %x_GLF_color %75
+               OpBranch %59
+         %61 = OpLabel
+         %76 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %77 = OpLoad %int %76
+         %78 = OpConvertSToF %float %77
+         %79 = OpCompositeConstruct %v4float %78 %78 %78 %78
+               OpStore %x_GLF_color %79
+               OpBranch %59
+         %59 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %80
+%tint_symbol = OpFunctionParameter %main_out
+         %84 = OpLabel
+         %85 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %85
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+         %87 = OpLabel
+         %88 = OpFunctionCall %void %main_1
+         %90 = OpLoad %v4float %x_GLF_color
+         %91 = OpCompositeConstruct %main_out %90
+         %89 = OpFunctionCall %void %tint_symbol_2 %91
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-variable-negative-offset/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-variable-negative-offset/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..fa52af1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-variable-negative-offset/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,55 @@
+type Arr = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+fn main_1() {
+  var v0 : vec2<f32>;
+  var v1 : vec2<f32>;
+  let x_37 : f32 = x_6.x_GLF_uniform_float_values[2];
+  v0 = vec2<f32>(x_37, 3.799999952);
+  let x_39 : vec2<f32> = v0;
+  let x_43 : f32 = x_6.x_GLF_uniform_float_values[1];
+  v1 = clamp((x_39 - vec2<f32>(1.0, 1.0)), vec2<f32>(0.0, 0.0), vec2<f32>(x_43, x_43));
+  let x_47 : vec2<f32> = v1;
+  let x_49 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_51 : f32 = x_6.x_GLF_uniform_float_values[1];
+  if (all((x_47 == vec2<f32>(x_49, x_51)))) {
+    let x_59 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_62 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_65 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_68 : i32 = x_9.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_59), f32(x_62), f32(x_65), f32(x_68));
+  } else {
+    let x_72 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_73 : f32 = f32(x_72);
+    x_GLF_color = vec4<f32>(x_73, x_73, x_73, x_73);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-variable-negative-offset/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-variable-negative-offset/0-opt.wgsl
new file mode 100644
index 0000000..fa52af1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-variable-negative-offset/0-opt.wgsl
@@ -0,0 +1,55 @@
+type Arr = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+fn main_1() {
+  var v0 : vec2<f32>;
+  var v1 : vec2<f32>;
+  let x_37 : f32 = x_6.x_GLF_uniform_float_values[2];
+  v0 = vec2<f32>(x_37, 3.799999952);
+  let x_39 : vec2<f32> = v0;
+  let x_43 : f32 = x_6.x_GLF_uniform_float_values[1];
+  v1 = clamp((x_39 - vec2<f32>(1.0, 1.0)), vec2<f32>(0.0, 0.0), vec2<f32>(x_43, x_43));
+  let x_47 : vec2<f32> = v1;
+  let x_49 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_51 : f32 = x_6.x_GLF_uniform_float_values[1];
+  if (all((x_47 == vec2<f32>(x_49, x_51)))) {
+    let x_59 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_62 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_65 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_68 : i32 = x_9.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_59), f32(x_62), f32(x_65), f32(x_68));
+  } else {
+    let x_72 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_73 : f32 = f32(x_72);
+    x_GLF_color = vec4<f32>(x_73, x_73, x_73, x_73);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-variable-negative-offset/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-variable-negative-offset/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..8f6279c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-variable-negative-offset/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,49 @@
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[2];
+};
+
+void main_1() {
+  float2 v0 = float2(0.0f, 0.0f);
+  float2 v1 = float2(0.0f, 0.0f);
+  const float x_37 = asfloat(x_6[2].x);
+  v0 = float2(x_37, 3.799999952f);
+  const float2 x_39 = v0;
+  const float x_43 = asfloat(x_6[1].x);
+  v1 = clamp((x_39 - float2(1.0f, 1.0f)), float2(0.0f, 0.0f), float2(x_43, x_43));
+  const float2 x_47 = v1;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_49 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const float x_51 = asfloat(x_6[1].x);
+  if (all((x_47 == float2(x_49, x_51)))) {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_59 = asint(x_9[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const int x_62 = asint(x_9[1].x);
+    const int x_65 = asint(x_9[1].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_68 = asint(x_9[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    x_GLF_color = float4(float(x_59), float(x_62), float(x_65), float(x_68));
+  } else {
+    const int x_72 = asint(x_9[1].x);
+    const float x_73 = float(x_72);
+    x_GLF_color = float4(x_73, x_73, x_73, x_73);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-variable-negative-offset/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-variable-negative-offset/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..154e812
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-variable-negative-offset/0-opt.wgsl.expected.msl
@@ -0,0 +1,63 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_9, thread float4* const tint_symbol_4) {
+  float2 v0 = 0.0f;
+  float2 v1 = 0.0f;
+  float const x_37 = x_6.x_GLF_uniform_float_values.arr[2].el;
+  v0 = float2(x_37, 3.799999952f);
+  float2 const x_39 = v0;
+  float const x_43 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  v1 = clamp((x_39 - float2(1.0f, 1.0f)), float2(0.0f, 0.0f), float2(x_43, x_43));
+  float2 const x_47 = v1;
+  float const x_49 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_51 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  if (all((x_47 == float2(x_49, x_51)))) {
+    int const x_59 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    int const x_62 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_65 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_68 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_59), float(x_62), float(x_65), float(x_68));
+  } else {
+    int const x_72 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    float const x_73 = float(x_72);
+    *(tint_symbol_4) = float4(x_73, x_73, x_73, x_73);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-variable-negative-offset/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-variable-negative-offset/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..758face
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-variable-negative-offset/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,145 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 92
+; Schema: 0
+               OpCapability Shader
+         %41 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v0 "v0"
+               OpName %v1 "v1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf1 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %11 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %11
+        %int = OpTypeInt 32 1
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %11
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %27 = OpConstantNull %v2float
+     %uint_0 = OpConstant %uint 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%float_3_79999995 = OpConstant %float 3.79999995
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+         %43 = OpConstantComposite %v2float %float_1 %float_1
+    %float_0 = OpConstant %float 0
+         %46 = OpConstantComposite %v2float %float_0 %float_0
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+     %v2bool = OpTypeVector %bool 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+         %80 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+         %v0 = OpVariable %_ptr_Function_v2float Function %27
+         %v1 = OpVariable %_ptr_Function_v2float Function %27
+         %32 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %33 = OpLoad %float %32
+         %35 = OpCompositeConstruct %v2float %33 %float_3_79999995
+               OpStore %v0 %35
+         %36 = OpLoad %v2float %v0
+         %38 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %39 = OpLoad %float %38
+         %44 = OpFSub %v2float %36 %43
+         %47 = OpCompositeConstruct %v2float %39 %39
+         %40 = OpExtInst %v2float %41 NClamp %44 %46 %47
+               OpStore %v1 %40
+         %48 = OpLoad %v2float %v1
+         %50 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %51 = OpLoad %float %50
+         %52 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %53 = OpLoad %float %52
+         %56 = OpCompositeConstruct %v2float %51 %53
+         %57 = OpFOrdEqual %v2bool %48 %56
+         %54 = OpAll %bool %57
+               OpSelectionMerge %59 None
+               OpBranchConditional %54 %60 %61
+         %60 = OpLabel
+         %63 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %64 = OpLoad %int %63
+         %65 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %66 = OpLoad %int %65
+         %67 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %68 = OpLoad %int %67
+         %69 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %70 = OpLoad %int %69
+         %71 = OpConvertSToF %float %64
+         %72 = OpConvertSToF %float %66
+         %73 = OpConvertSToF %float %68
+         %74 = OpConvertSToF %float %70
+         %75 = OpCompositeConstruct %v4float %71 %72 %73 %74
+               OpStore %x_GLF_color %75
+               OpBranch %59
+         %61 = OpLabel
+         %76 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %77 = OpLoad %int %76
+         %78 = OpConvertSToF %float %77
+         %79 = OpCompositeConstruct %v4float %78 %78 %78 %78
+               OpStore %x_GLF_color %79
+               OpBranch %59
+         %59 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %80
+%tint_symbol = OpFunctionParameter %main_out
+         %84 = OpLabel
+         %85 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %85
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+         %87 = OpLabel
+         %88 = OpFunctionCall %void %main_1
+         %90 = OpLoad %v4float %x_GLF_color
+         %91 = OpCompositeConstruct %main_out %90
+         %89 = OpFunctionCall %void %tint_symbol_2 %91
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-variable-negative-offset/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-variable-negative-offset/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..fa52af1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clamp-vector-variable-negative-offset/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,55 @@
+type Arr = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+fn main_1() {
+  var v0 : vec2<f32>;
+  var v1 : vec2<f32>;
+  let x_37 : f32 = x_6.x_GLF_uniform_float_values[2];
+  v0 = vec2<f32>(x_37, 3.799999952);
+  let x_39 : vec2<f32> = v0;
+  let x_43 : f32 = x_6.x_GLF_uniform_float_values[1];
+  v1 = clamp((x_39 - vec2<f32>(1.0, 1.0)), vec2<f32>(0.0, 0.0), vec2<f32>(x_43, x_43));
+  let x_47 : vec2<f32> = v1;
+  let x_49 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_51 : f32 = x_6.x_GLF_uniform_float_values[1];
+  if (all((x_47 == vec2<f32>(x_49, x_51)))) {
+    let x_59 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_62 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_65 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_68 : i32 = x_9.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_59), f32(x_62), f32(x_65), f32(x_68));
+  } else {
+    let x_72 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_73 : f32 = f32(x_72);
+    x_GLF_color = vec4<f32>(x_73, x_73, x_73, x_73);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clear-yz-inside-condition/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-clear-yz-inside-condition/0-opt.spvasm
new file mode 100644
index 0000000..197686f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clear-yz-inside-condition/0-opt.spvasm
@@ -0,0 +1,95 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %v0 "v0"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %v1 "v1"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "zero"
+               OpName %__0 ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+       %buf1 = OpTypeStruct %float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %12
+         %30 = OpLabel
+         %v0 = OpVariable %_ptr_Function_v2float Function
+         %v1 = OpVariable %_ptr_Function_v4float Function
+         %31 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %32 = OpLoad %float %31
+         %33 = OpCompositeConstruct %v2float %32 %32
+               OpStore %v0 %33
+         %34 = OpAccessChain %_ptr_Function_float %v0 %uint_0
+         %35 = OpLoad %float %34
+         %36 = OpCompositeConstruct %v4float %35 %35 %35 %35
+               OpStore %v1 %36
+         %37 = OpAccessChain %_ptr_Uniform_float %__0 %int_0
+         %38 = OpLoad %float %37
+         %39 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %40 = OpLoad %float %39
+         %41 = OpFUnordNotEqual %bool %38 %40
+               OpSelectionMerge %42 None
+               OpBranchConditional %41 %43 %44
+         %43 = OpLabel
+         %45 = OpAccessChain %_ptr_Uniform_float %__0 %int_0
+         %46 = OpLoad %float %45
+         %47 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %48 = OpLoad %float %47
+         %49 = OpFOrdEqual %bool %46 %48
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %50
+         %51 = OpLabel
+               OpReturn
+         %50 = OpLabel
+         %52 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %53 = OpLoad %float %52
+         %54 = OpVectorShuffle %v2float %36 %36 1 2
+         %55 = OpCompositeConstruct %v2float %53 %53
+         %56 = OpFSub %v2float %54 %55
+         %57 = OpVectorShuffle %v4float %36 %56 0 4 5 3
+               OpStore %v1 %57
+               OpBranch %42
+         %44 = OpLabel
+               OpKill
+         %42 = OpLabel
+               OpStore %_GLF_color %57
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clear-yz-inside-condition/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-clear-yz-inside-condition/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..011b17f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clear-yz-inside-condition/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,52 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+cbuffer cbuffer_x_9 : register(b1, space0) {
+  uint4 x_9[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2 v0 = float2(0.0f, 0.0f);
+  float4 v1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 x_57 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_32 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  v0 = float2(x_32, x_32);
+  const float x_35 = v0.x;
+  const float4 x_36 = float4(x_35, x_35, x_35, x_35);
+  v1 = x_36;
+  const float x_38 = asfloat(x_9[0].x);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_40 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if (!((x_38 == x_40))) {
+    const float x_46 = asfloat(x_9[0].x);
+    const float x_48 = asfloat(x_6[1].x);
+    if ((x_46 == x_48)) {
+      return;
+    }
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const float x_53 = asfloat(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const float2 x_56 = (float2(x_36.y, x_36.z) - float2(x_53, x_53));
+    x_57 = float4(x_36.x, x_56.x, x_56.y, x_36.w);
+    v1 = x_57;
+  } else {
+    discard;
+  }
+  x_GLF_color = x_57;
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clear-yz-inside-condition/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-clear-yz-inside-condition/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..ef7e17e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clear-yz-inside-condition/0-opt.spvasm.expected.msl
@@ -0,0 +1,59 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct buf1 {
+  /* 0x0000 */ float zero;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_9, thread float4* const tint_symbol_4) {
+  float2 v0 = 0.0f;
+  float4 v1 = 0.0f;
+  float4 x_57 = 0.0f;
+  float const x_32 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  v0 = float2(x_32, x_32);
+  float const x_35 = v0.x;
+  float4 const x_36 = float4(x_35, x_35, x_35, x_35);
+  v1 = x_36;
+  float const x_38 = x_9.zero;
+  float const x_40 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  if (!((x_38 == x_40))) {
+    float const x_46 = x_9.zero;
+    float const x_48 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    if ((x_46 == x_48)) {
+      return;
+    }
+    float const x_53 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    float2 const x_56 = (float2(x_36.y, x_36.z) - float2(x_53, x_53));
+    x_57 = float4(x_36.x, x_56.x, x_56.y, x_36.w);
+    v1 = x_57;
+  } else {
+    discard_fragment();
+  }
+  *(tint_symbol_4) = x_57;
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_9 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clear-yz-inside-condition/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-clear-yz-inside-condition/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..2a2cc7e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clear-yz-inside-condition/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,140 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 83
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "zero"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v0 "v0"
+               OpName %v1 "v1"
+               OpName %x_57 "x_57"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+       %buf1 = OpTypeStruct %float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_9 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %14 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %14
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %14
+       %void = OpTypeVoid
+         %17 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %24 = OpConstantNull %v2float
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_0 = OpConstant %uint 0
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_float = OpTypePointer Function %float
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %71 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %17
+         %20 = OpLabel
+         %v0 = OpVariable %_ptr_Function_v2float Function %24
+         %v1 = OpVariable %_ptr_Function_v4float Function %14
+       %x_57 = OpVariable %_ptr_Function_v4float Function %14
+         %32 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %33 = OpLoad %float %32
+         %34 = OpCompositeConstruct %v2float %33 %33
+               OpStore %v0 %34
+         %36 = OpAccessChain %_ptr_Function_float %v0 %uint_0
+         %37 = OpLoad %float %36
+         %38 = OpCompositeConstruct %v4float %37 %37 %37 %37
+               OpStore %v1 %38
+         %39 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0
+         %40 = OpLoad %float %39
+         %41 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %42 = OpLoad %float %41
+         %44 = OpFOrdEqual %bool %40 %42
+         %43 = OpLogicalNot %bool %44
+               OpSelectionMerge %46 None
+               OpBranchConditional %43 %47 %48
+         %47 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0
+         %50 = OpLoad %float %49
+         %52 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %53 = OpLoad %float %52
+         %54 = OpFOrdEqual %bool %50 %53
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %55
+         %56 = OpLabel
+               OpReturn
+         %55 = OpLabel
+         %57 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %58 = OpLoad %float %57
+         %59 = OpCompositeExtract %float %38 1
+         %60 = OpCompositeExtract %float %38 2
+         %61 = OpCompositeConstruct %v2float %59 %60
+         %62 = OpCompositeConstruct %v2float %58 %58
+         %63 = OpFSub %v2float %61 %62
+         %64 = OpCompositeExtract %float %38 0
+         %65 = OpCompositeExtract %float %63 0
+         %66 = OpCompositeExtract %float %63 1
+         %67 = OpCompositeExtract %float %38 3
+         %68 = OpCompositeConstruct %v4float %64 %65 %66 %67
+               OpStore %x_57 %68
+         %69 = OpLoad %v4float %x_57
+               OpStore %v1 %69
+               OpBranch %46
+         %48 = OpLabel
+               OpKill
+         %46 = OpLabel
+         %70 = OpLoad %v4float %x_57
+               OpStore %x_GLF_color %70
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %71
+%tint_symbol = OpFunctionParameter %main_out
+         %75 = OpLabel
+         %76 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %76
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %17
+         %78 = OpLabel
+         %79 = OpFunctionCall %void %main_1
+         %81 = OpLoad %v4float %x_GLF_color
+         %82 = OpCompositeConstruct %main_out %81
+         %80 = OpFunctionCall %void %tint_symbol_2 %82
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clear-yz-inside-condition/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-clear-yz-inside-condition/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..edebd91
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clear-yz-inside-condition/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,56 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[block]]
+struct buf1 {
+  zero : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v0 : vec2<f32>;
+  var v1 : vec4<f32>;
+  var x_57 : vec4<f32>;
+  let x_32 : f32 = x_6.x_GLF_uniform_float_values[0];
+  v0 = vec2<f32>(x_32, x_32);
+  let x_35 : f32 = v0.x;
+  let x_36 : vec4<f32> = vec4<f32>(x_35, x_35, x_35, x_35);
+  v1 = x_36;
+  let x_38 : f32 = x_9.zero;
+  let x_40 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if (!((x_38 == x_40))) {
+    let x_46 : f32 = x_9.zero;
+    let x_48 : f32 = x_6.x_GLF_uniform_float_values[1];
+    if ((x_46 == x_48)) {
+      return;
+    }
+    let x_53 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_56 : vec2<f32> = (vec2<f32>(x_36.y, x_36.z) - vec2<f32>(x_53, x_53));
+    x_57 = vec4<f32>(x_36.x, x_56.x, x_56.y, x_36.w);
+    v1 = x_57;
+  } else {
+    discard;
+  }
+  x_GLF_color = x_57;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clear-yz-inside-condition/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-clear-yz-inside-condition/0-opt.wgsl
new file mode 100644
index 0000000..edebd91
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clear-yz-inside-condition/0-opt.wgsl
@@ -0,0 +1,56 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[block]]
+struct buf1 {
+  zero : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v0 : vec2<f32>;
+  var v1 : vec4<f32>;
+  var x_57 : vec4<f32>;
+  let x_32 : f32 = x_6.x_GLF_uniform_float_values[0];
+  v0 = vec2<f32>(x_32, x_32);
+  let x_35 : f32 = v0.x;
+  let x_36 : vec4<f32> = vec4<f32>(x_35, x_35, x_35, x_35);
+  v1 = x_36;
+  let x_38 : f32 = x_9.zero;
+  let x_40 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if (!((x_38 == x_40))) {
+    let x_46 : f32 = x_9.zero;
+    let x_48 : f32 = x_6.x_GLF_uniform_float_values[1];
+    if ((x_46 == x_48)) {
+      return;
+    }
+    let x_53 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_56 : vec2<f32> = (vec2<f32>(x_36.y, x_36.z) - vec2<f32>(x_53, x_53));
+    x_57 = vec4<f32>(x_36.x, x_56.x, x_56.y, x_36.w);
+    v1 = x_57;
+  } else {
+    discard;
+  }
+  x_GLF_color = x_57;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clear-yz-inside-condition/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-clear-yz-inside-condition/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..011b17f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clear-yz-inside-condition/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,52 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+cbuffer cbuffer_x_9 : register(b1, space0) {
+  uint4 x_9[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2 v0 = float2(0.0f, 0.0f);
+  float4 v1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 x_57 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_32 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  v0 = float2(x_32, x_32);
+  const float x_35 = v0.x;
+  const float4 x_36 = float4(x_35, x_35, x_35, x_35);
+  v1 = x_36;
+  const float x_38 = asfloat(x_9[0].x);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_40 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if (!((x_38 == x_40))) {
+    const float x_46 = asfloat(x_9[0].x);
+    const float x_48 = asfloat(x_6[1].x);
+    if ((x_46 == x_48)) {
+      return;
+    }
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const float x_53 = asfloat(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const float2 x_56 = (float2(x_36.y, x_36.z) - float2(x_53, x_53));
+    x_57 = float4(x_36.x, x_56.x, x_56.y, x_36.w);
+    v1 = x_57;
+  } else {
+    discard;
+  }
+  x_GLF_color = x_57;
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clear-yz-inside-condition/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-clear-yz-inside-condition/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..ef7e17e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clear-yz-inside-condition/0-opt.wgsl.expected.msl
@@ -0,0 +1,59 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct buf1 {
+  /* 0x0000 */ float zero;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_9, thread float4* const tint_symbol_4) {
+  float2 v0 = 0.0f;
+  float4 v1 = 0.0f;
+  float4 x_57 = 0.0f;
+  float const x_32 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  v0 = float2(x_32, x_32);
+  float const x_35 = v0.x;
+  float4 const x_36 = float4(x_35, x_35, x_35, x_35);
+  v1 = x_36;
+  float const x_38 = x_9.zero;
+  float const x_40 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  if (!((x_38 == x_40))) {
+    float const x_46 = x_9.zero;
+    float const x_48 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    if ((x_46 == x_48)) {
+      return;
+    }
+    float const x_53 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    float2 const x_56 = (float2(x_36.y, x_36.z) - float2(x_53, x_53));
+    x_57 = float4(x_36.x, x_56.x, x_56.y, x_36.w);
+    v1 = x_57;
+  } else {
+    discard_fragment();
+  }
+  *(tint_symbol_4) = x_57;
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_9 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clear-yz-inside-condition/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-clear-yz-inside-condition/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..2a2cc7e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clear-yz-inside-condition/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,140 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 83
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "zero"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v0 "v0"
+               OpName %v1 "v1"
+               OpName %x_57 "x_57"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+       %buf1 = OpTypeStruct %float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_9 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %14 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %14
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %14
+       %void = OpTypeVoid
+         %17 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %24 = OpConstantNull %v2float
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_0 = OpConstant %uint 0
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_float = OpTypePointer Function %float
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %71 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %17
+         %20 = OpLabel
+         %v0 = OpVariable %_ptr_Function_v2float Function %24
+         %v1 = OpVariable %_ptr_Function_v4float Function %14
+       %x_57 = OpVariable %_ptr_Function_v4float Function %14
+         %32 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %33 = OpLoad %float %32
+         %34 = OpCompositeConstruct %v2float %33 %33
+               OpStore %v0 %34
+         %36 = OpAccessChain %_ptr_Function_float %v0 %uint_0
+         %37 = OpLoad %float %36
+         %38 = OpCompositeConstruct %v4float %37 %37 %37 %37
+               OpStore %v1 %38
+         %39 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0
+         %40 = OpLoad %float %39
+         %41 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %42 = OpLoad %float %41
+         %44 = OpFOrdEqual %bool %40 %42
+         %43 = OpLogicalNot %bool %44
+               OpSelectionMerge %46 None
+               OpBranchConditional %43 %47 %48
+         %47 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0
+         %50 = OpLoad %float %49
+         %52 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %53 = OpLoad %float %52
+         %54 = OpFOrdEqual %bool %50 %53
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %55
+         %56 = OpLabel
+               OpReturn
+         %55 = OpLabel
+         %57 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %58 = OpLoad %float %57
+         %59 = OpCompositeExtract %float %38 1
+         %60 = OpCompositeExtract %float %38 2
+         %61 = OpCompositeConstruct %v2float %59 %60
+         %62 = OpCompositeConstruct %v2float %58 %58
+         %63 = OpFSub %v2float %61 %62
+         %64 = OpCompositeExtract %float %38 0
+         %65 = OpCompositeExtract %float %63 0
+         %66 = OpCompositeExtract %float %63 1
+         %67 = OpCompositeExtract %float %38 3
+         %68 = OpCompositeConstruct %v4float %64 %65 %66 %67
+               OpStore %x_57 %68
+         %69 = OpLoad %v4float %x_57
+               OpStore %v1 %69
+               OpBranch %46
+         %48 = OpLabel
+               OpKill
+         %46 = OpLabel
+         %70 = OpLoad %v4float %x_57
+               OpStore %x_GLF_color %70
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %71
+%tint_symbol = OpFunctionParameter %main_out
+         %75 = OpLabel
+         %76 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %76
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %17
+         %78 = OpLabel
+         %79 = OpFunctionCall %void %main_1
+         %81 = OpLoad %v4float %x_GLF_color
+         %82 = OpCompositeConstruct %main_out %81
+         %80 = OpFunctionCall %void %tint_symbol_2 %82
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-clear-yz-inside-condition/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-clear-yz-inside-condition/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..edebd91
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-clear-yz-inside-condition/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,56 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[block]]
+struct buf1 {
+  zero : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v0 : vec2<f32>;
+  var v1 : vec4<f32>;
+  var x_57 : vec4<f32>;
+  let x_32 : f32 = x_6.x_GLF_uniform_float_values[0];
+  v0 = vec2<f32>(x_32, x_32);
+  let x_35 : f32 = v0.x;
+  let x_36 : vec4<f32> = vec4<f32>(x_35, x_35, x_35, x_35);
+  v1 = x_36;
+  let x_38 : f32 = x_9.zero;
+  let x_40 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if (!((x_38 == x_40))) {
+    let x_46 : f32 = x_9.zero;
+    let x_48 : f32 = x_6.x_GLF_uniform_float_values[1];
+    if ((x_46 == x_48)) {
+      return;
+    }
+    let x_53 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_56 : vec2<f32> = (vec2<f32>(x_36.y, x_36.z) - vec2<f32>(x_53, x_53));
+    x_57 = vec4<f32>(x_36.x, x_56.x, x_56.y, x_36.w);
+    v1 = x_57;
+  } else {
+    discard;
+  }
+  x_GLF_color = x_57;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-color-output-undefined-in-unexecuted-branch/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-color-output-undefined-in-unexecuted-branch/0-opt.spvasm
new file mode 100644
index 0000000..1fae8ca
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-color-output-undefined-in-unexecuted-branch/0-opt.spvasm
@@ -0,0 +1,243 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %func0_ "func0("
+               OpName %func1_ "func1("
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %tmp "tmp"
+               OpName %_GLF_color "_GLF_color"
+               OpName %a "a"
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %buf3 "buf3"
+               OpMemberName %buf3 0 "three"
+               OpName %__1 ""
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_uint_values"
+               OpName %__2 ""
+               OpName %a_0 "a"
+               OpName %i "i"
+               OpName %j "j"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %buf2 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 2
+               OpMemberDecorate %buf3 0 Offset 0
+               OpDecorate %buf3 Block
+               OpDecorate %__1 DescriptorSet 0
+               OpDecorate %__1 Binding 3
+               OpDecorate %_arr_uint_uint_1 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__2 DescriptorSet 0
+               OpDecorate %__2 Binding 0
+       %void = OpTypeVoid
+         %24 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+         %26 = OpTypeFunction %int
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf1 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+%_ptr_Function_int = OpTypePointer Function %int
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf2 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+        %__0 = OpVariable %_ptr_Uniform_buf2 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+       %buf3 = OpTypeStruct %int
+%_ptr_Uniform_buf3 = OpTypePointer Uniform %buf3
+        %__1 = OpVariable %_ptr_Uniform_buf3 Uniform
+      %int_2 = OpConstant %int 2
+     %uint_1 = OpConstant %uint 1
+%_arr_uint_uint_1 = OpTypeArray %uint %uint_1
+       %buf0 = OpTypeStruct %_arr_uint_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__2 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+      %int_5 = OpConstant %int 5
+     %uint_2 = OpConstant %uint 2
+%_ptr_Output_float = OpTypePointer Output %float
+       %main = OpFunction %void None %24
+         %54 = OpLabel
+        %a_0 = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+          %j = OpVariable %_ptr_Function_int Function
+         %55 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %56 = OpLoad %float %55
+         %57 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %58 = OpLoad %float %57
+         %59 = OpFOrdGreaterThan %bool %56 %58
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %62
+         %61 = OpLabel
+         %63 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %64 = OpLoad %float %63
+         %65 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %66 = OpLoad %float %65
+         %67 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %68 = OpLoad %float %67
+         %69 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %70 = OpLoad %float %69
+         %71 = OpCompositeConstruct %v4float %64 %66 %68 %70
+               OpStore %_GLF_color %71
+               OpBranch %60
+         %62 = OpLabel
+         %72 = OpAccessChain %_ptr_Uniform_uint %__2 %int_0 %int_0
+         %73 = OpLoad %uint %72
+         %74 = OpExtInst %v4float %1 UnpackSnorm4x8 %73
+               OpStore %_GLF_color %74
+               OpBranch %60
+         %60 = OpLabel
+         %75 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %76 = OpLoad %int %75
+               OpStore %a_0 %76
+               OpStore %i %int_0
+               OpBranch %77
+         %77 = OpLabel
+               OpLoopMerge %78 %79 None
+               OpBranch %80
+         %80 = OpLabel
+         %81 = OpLoad %int %i
+         %82 = OpSLessThan %bool %81 %int_5
+               OpBranchConditional %82 %83 %78
+         %83 = OpLabel
+               OpStore %j %int_0
+               OpBranch %84
+         %84 = OpLabel
+               OpLoopMerge %85 %86 None
+               OpBranch %87
+         %87 = OpLabel
+         %88 = OpLoad %int %j
+         %89 = OpSLessThan %bool %88 %int_2
+               OpBranchConditional %89 %90 %85
+         %90 = OpLabel
+         %91 = OpFunctionCall %int %func1_
+         %92 = OpLoad %int %a_0
+         %93 = OpIAdd %int %92 %91
+               OpStore %a_0 %93
+               OpBranch %86
+         %86 = OpLabel
+         %94 = OpLoad %int %j
+         %95 = OpIAdd %int %94 %int_1
+               OpStore %j %95
+               OpBranch %84
+         %85 = OpLabel
+               OpBranch %79
+         %79 = OpLabel
+         %96 = OpLoad %int %i
+         %97 = OpIAdd %int %96 %int_1
+               OpStore %i %97
+               OpBranch %77
+         %78 = OpLabel
+         %98 = OpLoad %int %a_0
+         %99 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+        %100 = OpLoad %int %99
+        %101 = OpIEqual %bool %98 %100
+               OpSelectionMerge %102 None
+               OpBranchConditional %101 %103 %102
+        %103 = OpLabel
+        %104 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+        %105 = OpLoad %float %104
+        %106 = OpAccessChain %_ptr_Output_float %_GLF_color %uint_2
+        %107 = OpLoad %float %106
+        %108 = OpFSub %float %107 %105
+        %109 = OpAccessChain %_ptr_Output_float %_GLF_color %uint_2
+               OpStore %109 %108
+               OpBranch %102
+        %102 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %func0_ = OpFunction %void None %24
+        %110 = OpLabel
+        %tmp = OpVariable %_ptr_Function_v4float Function
+        %111 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+        %112 = OpLoad %float %111
+        %113 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+        %114 = OpLoad %float %113
+        %115 = OpFOrdGreaterThan %bool %112 %114
+               OpSelectionMerge %116 None
+               OpBranchConditional %115 %117 %116
+        %117 = OpLabel
+        %118 = OpLoad %v4float %_GLF_color
+               OpStore %tmp %118
+               OpBranch %116
+        %116 = OpLabel
+        %119 = OpLoad %v4float %tmp
+               OpStore %_GLF_color %119
+               OpReturn
+               OpFunctionEnd
+     %func1_ = OpFunction %int None %26
+        %120 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+        %121 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %122 = OpLoad %int %121
+               OpStore %a %122
+               OpBranch %123
+        %123 = OpLabel
+               OpLoopMerge %124 %125 None
+               OpBranch %126
+        %126 = OpLabel
+        %127 = OpLoad %int %a
+        %128 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_3
+        %129 = OpLoad %int %128
+        %130 = OpSLessThan %bool %127 %129
+               OpBranchConditional %130 %131 %124
+        %131 = OpLabel
+        %132 = OpAccessChain %_ptr_Uniform_int %__1 %int_0
+        %133 = OpLoad %int %132
+        %134 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %135 = OpLoad %int %134
+        %136 = OpSGreaterThan %bool %133 %135
+               OpSelectionMerge %137 None
+               OpBranchConditional %136 %138 %139
+        %138 = OpLabel
+        %140 = OpFunctionCall %void %func0_
+        %141 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_3
+        %142 = OpLoad %int %141
+               OpStore %a %142
+               OpBranch %137
+        %139 = OpLabel
+        %143 = OpFunctionCall %void %func0_
+               OpBranch %137
+        %137 = OpLabel
+               OpBranch %125
+        %125 = OpLabel
+               OpBranch %123
+        %124 = OpLabel
+        %144 = OpLoad %int %a
+               OpReturnValue %144
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-color-output-undefined-in-unexecuted-branch/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-color-output-undefined-in-unexecuted-branch/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..9ea252e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-color-output-undefined-in-unexecuted-branch/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,119 @@
+float4 tint_unpack4x8snorm(uint param_0) {
+  int j = int(param_0);
+  int4 i = int4(j << 24, j << 16, j << 8, j) >> 24;
+  return clamp(float4(i) / 127.0, -1.0, 1.0);
+}
+
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_12 : register(b2, space0) {
+  uint4 x_12[4];
+};
+cbuffer cbuffer_x_14 : register(b3, space0) {
+  uint4 x_14[1];
+};
+cbuffer cbuffer_x_16 : register(b0, space0) {
+  uint4 x_16[1];
+};
+
+void func0_() {
+  float4 tmp = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  const float x_112 = gl_FragCoord.x;
+  const float x_114 = asfloat(x_8[1].x);
+  if ((x_112 > x_114)) {
+    tmp = x_GLF_color;
+  }
+  x_GLF_color = tmp;
+  return;
+}
+
+int func1_() {
+  int a = 0;
+  const int x_122 = asint(x_12[1].x);
+  a = x_122;
+  while (true) {
+    const int x_127 = a;
+    const int x_129 = asint(x_12[3].x);
+    if ((x_127 < x_129)) {
+    } else {
+      break;
+    }
+    const int x_133 = asint(x_14[0].x);
+    const int x_135 = asint(x_12[1].x);
+    if ((x_133 > x_135)) {
+      func0_();
+      const int x_142 = asint(x_12[3].x);
+      a = x_142;
+    } else {
+      func0_();
+    }
+  }
+  return a;
+}
+
+void main_1() {
+  int a_1 = 0;
+  int i = 0;
+  int j = 0;
+  const float x_56 = gl_FragCoord.x;
+  const float x_58 = asfloat(x_8[1].x);
+  if ((x_56 > x_58)) {
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const float x_64 = asfloat(x_8[scalar_offset / 4][scalar_offset % 4]);
+    const float x_66 = asfloat(x_8[1].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const float x_68 = asfloat(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const float x_70 = asfloat(x_8[2].x);
+    x_GLF_color = float4(x_64, x_66, x_68, x_70);
+  } else {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const uint x_73 = x_16[scalar_offset_2 / 4][scalar_offset_2 % 4];
+    x_GLF_color = tint_unpack4x8snorm(x_73);
+  }
+  const int x_76 = asint(x_12[2].x);
+  a_1 = x_76;
+  i = 0;
+  {
+    for(; (i < 5); i = (i + 1)) {
+      j = 0;
+      {
+        for(; (j < 2); j = (j + 1)) {
+          const int x_91 = func1_();
+          a_1 = (a_1 + x_91);
+        }
+      }
+    }
+  }
+  const int x_98 = a_1;
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const int x_100 = asint(x_12[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  if ((x_98 == x_100)) {
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const float x_105 = asfloat(x_8[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const float x_107 = x_GLF_color.z;
+    x_GLF_color.z = (x_107 - x_105);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_8 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_8;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-color-output-undefined-in-unexecuted-branch/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-color-output-undefined-in-unexecuted-branch/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..1cbfbfa
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-color-output-undefined-in-unexecuted-branch/0-opt.spvasm.expected.msl
@@ -0,0 +1,146 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[4];
+};
+struct buf2 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct buf3 {
+  /* 0x0000 */ int three;
+};
+struct tint_padded_array_element_2 {
+  /* 0x0000 */ uint el;
+  /* 0x0004 */ int8_t tint_pad_2[12];
+};
+struct tint_array_wrapper_2 {
+  /* 0x0000 */ tint_padded_array_element_2 arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_2 x_GLF_uniform_uint_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void func0_(constant buf1& x_8, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float4 tmp = 0.0f;
+  float const x_112 = (*(tint_symbol_5)).x;
+  float const x_114 = x_8.x_GLF_uniform_float_values.arr[1].el;
+  if ((x_112 > x_114)) {
+    float4 const x_118 = *(tint_symbol_6);
+    tmp = x_118;
+  }
+  float4 const x_119 = tmp;
+  *(tint_symbol_6) = x_119;
+  return;
+}
+
+int func1_(constant buf2& x_12, constant buf3& x_14, constant buf1& x_8, thread float4* const tint_symbol_7, thread float4* const tint_symbol_8) {
+  int a = 0;
+  int const x_122 = x_12.x_GLF_uniform_int_values.arr[1].el;
+  a = x_122;
+  while (true) {
+    int const x_127 = a;
+    int const x_129 = x_12.x_GLF_uniform_int_values.arr[3].el;
+    if ((x_127 < x_129)) {
+    } else {
+      break;
+    }
+    int const x_133 = x_14.three;
+    int const x_135 = x_12.x_GLF_uniform_int_values.arr[1].el;
+    if ((x_133 > x_135)) {
+      func0_(x_8, tint_symbol_7, tint_symbol_8);
+      int const x_142 = x_12.x_GLF_uniform_int_values.arr[3].el;
+      a = x_142;
+    } else {
+      func0_(x_8, tint_symbol_7, tint_symbol_8);
+    }
+  }
+  int const x_144 = a;
+  return x_144;
+}
+
+void main_1(constant buf1& x_8, constant buf0& x_16, constant buf2& x_12, constant buf3& x_14, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10) {
+  int a_1 = 0;
+  int i = 0;
+  int j = 0;
+  float const x_56 = (*(tint_symbol_9)).x;
+  float const x_58 = x_8.x_GLF_uniform_float_values.arr[1].el;
+  if ((x_56 > x_58)) {
+    float const x_64 = x_8.x_GLF_uniform_float_values.arr[0].el;
+    float const x_66 = x_8.x_GLF_uniform_float_values.arr[1].el;
+    float const x_68 = x_8.x_GLF_uniform_float_values.arr[0].el;
+    float const x_70 = x_8.x_GLF_uniform_float_values.arr[2].el;
+    *(tint_symbol_10) = float4(x_64, x_66, x_68, x_70);
+  } else {
+    uint const x_73 = x_16.x_GLF_uniform_uint_values.arr[0].el;
+    *(tint_symbol_10) = unpack_snorm4x8_to_float(x_73);
+  }
+  int const x_76 = x_12.x_GLF_uniform_int_values.arr[2].el;
+  a_1 = x_76;
+  i = 0;
+  while (true) {
+    int const x_81 = i;
+    if ((x_81 < 5)) {
+    } else {
+      break;
+    }
+    j = 0;
+    while (true) {
+      int const x_88 = j;
+      if ((x_88 < 2)) {
+      } else {
+        break;
+      }
+      int const x_91 = func1_(x_12, x_14, x_8, tint_symbol_9, tint_symbol_10);
+      int const x_92 = a_1;
+      a_1 = (x_92 + x_91);
+      {
+        int const x_94 = j;
+        j = (x_94 + 1);
+      }
+    }
+    {
+      int const x_96 = i;
+      i = (x_96 + 1);
+    }
+  }
+  int const x_98 = a_1;
+  int const x_100 = x_12.x_GLF_uniform_int_values.arr[0].el;
+  if ((x_98 == x_100)) {
+    float const x_105 = x_8.x_GLF_uniform_float_values.arr[0].el;
+    float const x_107 = (*(tint_symbol_10)).z;
+    (*(tint_symbol_10)).z = (x_107 - x_105);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf1& x_8 [[buffer(1)]], constant buf0& x_16 [[buffer(0)]], constant buf2& x_12 [[buffer(2)]], constant buf3& x_14 [[buffer(3)]]) {
+  thread float4 tint_symbol_11 = 0.0f;
+  thread float4 tint_symbol_12 = 0.0f;
+  tint_symbol_11 = gl_FragCoord_param;
+  main_1(x_8, x_16, x_12, x_14, &(tint_symbol_11), &(tint_symbol_12));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_12};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-color-output-undefined-in-unexecuted-branch/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-color-output-undefined-in-unexecuted-branch/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..aa2284f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-color-output-undefined-in-unexecuted-branch/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,297 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 168
+; Schema: 0
+               OpCapability Shader
+        %113 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "x_GLF_uniform_int_values"
+               OpName %x_12 "x_12"
+               OpName %buf3 "buf3"
+               OpMemberName %buf3 0 "three"
+               OpName %x_14 "x_14"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_uint_values"
+               OpName %x_16 "x_16"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %func0_ "func0_"
+               OpName %tmp "tmp"
+               OpName %func1_ "func1_"
+               OpName %a "a"
+               OpName %main_1 "main_1"
+               OpName %a_1 "a_1"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %buf2 Block
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_12 NonWritable
+               OpDecorate %x_12 DescriptorSet 0
+               OpDecorate %x_12 Binding 2
+               OpDecorate %buf3 Block
+               OpMemberDecorate %buf3 0 Offset 0
+               OpDecorate %x_14 NonWritable
+               OpDecorate %x_14 DescriptorSet 0
+               OpDecorate %x_14 Binding 3
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_uint_uint_1 ArrayStride 16
+               OpDecorate %x_16 NonWritable
+               OpDecorate %x_16 DescriptorSet 0
+               OpDecorate %x_16 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf1 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf2 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+       %x_12 = OpVariable %_ptr_Uniform_buf2 Uniform
+       %buf3 = OpTypeStruct %int
+%_ptr_Uniform_buf3 = OpTypePointer Uniform %buf3
+       %x_14 = OpVariable %_ptr_Uniform_buf3 Uniform
+     %uint_1 = OpConstant %uint 1
+%_arr_uint_uint_1 = OpTypeArray %uint %uint_1
+       %buf0 = OpTypeStruct %_arr_uint_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_16 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %31 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+         %51 = OpTypeFunction %int
+%_ptr_Function_int = OpTypePointer Function %int
+         %56 = OpConstantNull %int
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+      %int_5 = OpConstant %int 5
+     %uint_2 = OpConstant %uint 2
+   %main_out = OpTypeStruct %v4float
+        %155 = OpTypeFunction %void %main_out
+     %func0_ = OpFunction %void None %31
+         %34 = OpLabel
+        %tmp = OpVariable %_ptr_Function_v4float Function %5
+         %39 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %40 = OpLoad %float %39
+         %43 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+         %44 = OpLoad %float %43
+         %45 = OpFOrdGreaterThan %bool %40 %44
+               OpSelectionMerge %47 None
+               OpBranchConditional %45 %48 %47
+         %48 = OpLabel
+         %49 = OpLoad %v4float %x_GLF_color
+               OpStore %tmp %49
+               OpBranch %47
+         %47 = OpLabel
+         %50 = OpLoad %v4float %tmp
+               OpStore %x_GLF_color %50
+               OpReturn
+               OpFunctionEnd
+     %func1_ = OpFunction %int None %51
+         %53 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %56
+         %58 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_1
+         %59 = OpLoad %int %58
+               OpStore %a %59
+               OpBranch %60
+         %60 = OpLabel
+               OpLoopMerge %61 %62 None
+               OpBranch %63
+         %63 = OpLabel
+         %64 = OpLoad %int %a
+         %66 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_3
+         %67 = OpLoad %int %66
+         %68 = OpSLessThan %bool %64 %67
+               OpSelectionMerge %69 None
+               OpBranchConditional %68 %70 %71
+         %70 = OpLabel
+               OpBranch %69
+         %71 = OpLabel
+               OpBranch %61
+         %69 = OpLabel
+         %72 = OpAccessChain %_ptr_Uniform_int %x_14 %uint_0
+         %73 = OpLoad %int %72
+         %74 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_1
+         %75 = OpLoad %int %74
+         %76 = OpSGreaterThan %bool %73 %75
+               OpSelectionMerge %77 None
+               OpBranchConditional %76 %78 %79
+         %78 = OpLabel
+         %80 = OpFunctionCall %void %func0_
+         %81 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_3
+         %82 = OpLoad %int %81
+               OpStore %a %82
+               OpBranch %77
+         %79 = OpLabel
+         %83 = OpFunctionCall %void %func0_
+               OpBranch %77
+         %77 = OpLabel
+               OpBranch %62
+         %62 = OpLabel
+               OpBranch %60
+         %61 = OpLabel
+         %84 = OpLoad %int %a
+               OpReturnValue %84
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %31
+         %86 = OpLabel
+        %a_1 = OpVariable %_ptr_Function_int Function %56
+          %i = OpVariable %_ptr_Function_int Function %56
+          %j = OpVariable %_ptr_Function_int Function %56
+         %90 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %91 = OpLoad %float %90
+         %92 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+         %93 = OpLoad %float %92
+         %94 = OpFOrdGreaterThan %bool %91 %93
+               OpSelectionMerge %95 None
+               OpBranchConditional %94 %96 %97
+         %96 = OpLabel
+         %99 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+        %100 = OpLoad %float %99
+        %101 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+        %102 = OpLoad %float %101
+        %103 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+        %104 = OpLoad %float %103
+        %106 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_2
+        %107 = OpLoad %float %106
+        %108 = OpCompositeConstruct %v4float %100 %102 %104 %107
+               OpStore %x_GLF_color %108
+               OpBranch %95
+         %97 = OpLabel
+        %110 = OpAccessChain %_ptr_Uniform_uint %x_16 %uint_0 %int_0
+        %111 = OpLoad %uint %110
+        %112 = OpExtInst %v4float %113 UnpackSnorm4x8 %111
+               OpStore %x_GLF_color %112
+               OpBranch %95
+         %95 = OpLabel
+        %114 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_2
+        %115 = OpLoad %int %114
+               OpStore %a_1 %115
+               OpStore %i %int_0
+               OpBranch %116
+        %116 = OpLabel
+               OpLoopMerge %117 %118 None
+               OpBranch %119
+        %119 = OpLabel
+        %120 = OpLoad %int %i
+        %122 = OpSLessThan %bool %120 %int_5
+               OpSelectionMerge %123 None
+               OpBranchConditional %122 %124 %125
+        %124 = OpLabel
+               OpBranch %123
+        %125 = OpLabel
+               OpBranch %117
+        %123 = OpLabel
+               OpStore %j %int_0
+               OpBranch %126
+        %126 = OpLabel
+               OpLoopMerge %127 %128 None
+               OpBranch %129
+        %129 = OpLabel
+        %130 = OpLoad %int %j
+        %131 = OpSLessThan %bool %130 %int_2
+               OpSelectionMerge %132 None
+               OpBranchConditional %131 %133 %134
+        %133 = OpLabel
+               OpBranch %132
+        %134 = OpLabel
+               OpBranch %127
+        %132 = OpLabel
+        %135 = OpFunctionCall %int %func1_
+        %136 = OpLoad %int %a_1
+        %137 = OpIAdd %int %136 %135
+               OpStore %a_1 %137
+               OpBranch %128
+        %128 = OpLabel
+        %138 = OpLoad %int %j
+        %139 = OpIAdd %int %138 %int_1
+               OpStore %j %139
+               OpBranch %126
+        %127 = OpLabel
+               OpBranch %118
+        %118 = OpLabel
+        %140 = OpLoad %int %i
+        %141 = OpIAdd %int %140 %int_1
+               OpStore %i %141
+               OpBranch %116
+        %117 = OpLabel
+        %142 = OpLoad %int %a_1
+        %143 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_0
+        %144 = OpLoad %int %143
+        %145 = OpIEqual %bool %142 %144
+               OpSelectionMerge %146 None
+               OpBranchConditional %145 %147 %146
+        %147 = OpLabel
+        %148 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+        %149 = OpLoad %float %148
+        %151 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_2
+        %152 = OpLoad %float %151
+        %153 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_2
+        %154 = OpFSub %float %152 %149
+               OpStore %153 %154
+               OpBranch %146
+        %146 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %155
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %159 = OpLabel
+        %160 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %160
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %31
+        %162 = OpLabel
+        %163 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %163
+        %164 = OpFunctionCall %void %main_1
+        %166 = OpLoad %v4float %x_GLF_color
+        %167 = OpCompositeConstruct %main_out %166
+        %165 = OpFunctionCall %void %tint_symbol_3 %167
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-color-output-undefined-in-unexecuted-branch/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-color-output-undefined-in-unexecuted-branch/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..771813e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-color-output-undefined-in-unexecuted-branch/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,144 @@
+type Arr = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf2 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[block]]
+struct buf3 {
+  three : i32;
+};
+
+type Arr_2 = [[stride(16)]] array<u32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_uint_values : Arr_2;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(2)]] var<uniform> x_12 : buf2;
+
+[[group(0), binding(3)]] var<uniform> x_14 : buf3;
+
+[[group(0), binding(0)]] var<uniform> x_16 : buf0;
+
+fn func0_() {
+  var tmp : vec4<f32>;
+  let x_112 : f32 = gl_FragCoord.x;
+  let x_114 : f32 = x_8.x_GLF_uniform_float_values[1];
+  if ((x_112 > x_114)) {
+    let x_118 : vec4<f32> = x_GLF_color;
+    tmp = x_118;
+  }
+  let x_119 : vec4<f32> = tmp;
+  x_GLF_color = x_119;
+  return;
+}
+
+fn func1_() -> i32 {
+  var a : i32;
+  let x_122 : i32 = x_12.x_GLF_uniform_int_values[1];
+  a = x_122;
+  loop {
+    let x_127 : i32 = a;
+    let x_129 : i32 = x_12.x_GLF_uniform_int_values[3];
+    if ((x_127 < x_129)) {
+    } else {
+      break;
+    }
+    let x_133 : i32 = x_14.three;
+    let x_135 : i32 = x_12.x_GLF_uniform_int_values[1];
+    if ((x_133 > x_135)) {
+      func0_();
+      let x_142 : i32 = x_12.x_GLF_uniform_int_values[3];
+      a = x_142;
+    } else {
+      func0_();
+    }
+  }
+  let x_144 : i32 = a;
+  return x_144;
+}
+
+fn main_1() {
+  var a_1 : i32;
+  var i : i32;
+  var j : i32;
+  let x_56 : f32 = gl_FragCoord.x;
+  let x_58 : f32 = x_8.x_GLF_uniform_float_values[1];
+  if ((x_56 > x_58)) {
+    let x_64 : f32 = x_8.x_GLF_uniform_float_values[0];
+    let x_66 : f32 = x_8.x_GLF_uniform_float_values[1];
+    let x_68 : f32 = x_8.x_GLF_uniform_float_values[0];
+    let x_70 : f32 = x_8.x_GLF_uniform_float_values[2];
+    x_GLF_color = vec4<f32>(x_64, x_66, x_68, x_70);
+  } else {
+    let x_73 : u32 = x_16.x_GLF_uniform_uint_values[0];
+    x_GLF_color = unpack4x8snorm(x_73);
+  }
+  let x_76 : i32 = x_12.x_GLF_uniform_int_values[2];
+  a_1 = x_76;
+  i = 0;
+  loop {
+    let x_81 : i32 = i;
+    if ((x_81 < 5)) {
+    } else {
+      break;
+    }
+    j = 0;
+    loop {
+      let x_88 : i32 = j;
+      if ((x_88 < 2)) {
+      } else {
+        break;
+      }
+      let x_91 : i32 = func1_();
+      let x_92 : i32 = a_1;
+      a_1 = (x_92 + x_91);
+
+      continuing {
+        let x_94 : i32 = j;
+        j = (x_94 + 1);
+      }
+    }
+
+    continuing {
+      let x_96 : i32 = i;
+      i = (x_96 + 1);
+    }
+  }
+  let x_98 : i32 = a_1;
+  let x_100 : i32 = x_12.x_GLF_uniform_int_values[0];
+  if ((x_98 == x_100)) {
+    let x_105 : f32 = x_8.x_GLF_uniform_float_values[0];
+    let x_107 : f32 = x_GLF_color.z;
+    x_GLF_color.z = (x_107 - x_105);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-color-output-undefined-in-unexecuted-branch/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-color-output-undefined-in-unexecuted-branch/0-opt.wgsl
new file mode 100644
index 0000000..771813e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-color-output-undefined-in-unexecuted-branch/0-opt.wgsl
@@ -0,0 +1,144 @@
+type Arr = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf2 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[block]]
+struct buf3 {
+  three : i32;
+};
+
+type Arr_2 = [[stride(16)]] array<u32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_uint_values : Arr_2;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(2)]] var<uniform> x_12 : buf2;
+
+[[group(0), binding(3)]] var<uniform> x_14 : buf3;
+
+[[group(0), binding(0)]] var<uniform> x_16 : buf0;
+
+fn func0_() {
+  var tmp : vec4<f32>;
+  let x_112 : f32 = gl_FragCoord.x;
+  let x_114 : f32 = x_8.x_GLF_uniform_float_values[1];
+  if ((x_112 > x_114)) {
+    let x_118 : vec4<f32> = x_GLF_color;
+    tmp = x_118;
+  }
+  let x_119 : vec4<f32> = tmp;
+  x_GLF_color = x_119;
+  return;
+}
+
+fn func1_() -> i32 {
+  var a : i32;
+  let x_122 : i32 = x_12.x_GLF_uniform_int_values[1];
+  a = x_122;
+  loop {
+    let x_127 : i32 = a;
+    let x_129 : i32 = x_12.x_GLF_uniform_int_values[3];
+    if ((x_127 < x_129)) {
+    } else {
+      break;
+    }
+    let x_133 : i32 = x_14.three;
+    let x_135 : i32 = x_12.x_GLF_uniform_int_values[1];
+    if ((x_133 > x_135)) {
+      func0_();
+      let x_142 : i32 = x_12.x_GLF_uniform_int_values[3];
+      a = x_142;
+    } else {
+      func0_();
+    }
+  }
+  let x_144 : i32 = a;
+  return x_144;
+}
+
+fn main_1() {
+  var a_1 : i32;
+  var i : i32;
+  var j : i32;
+  let x_56 : f32 = gl_FragCoord.x;
+  let x_58 : f32 = x_8.x_GLF_uniform_float_values[1];
+  if ((x_56 > x_58)) {
+    let x_64 : f32 = x_8.x_GLF_uniform_float_values[0];
+    let x_66 : f32 = x_8.x_GLF_uniform_float_values[1];
+    let x_68 : f32 = x_8.x_GLF_uniform_float_values[0];
+    let x_70 : f32 = x_8.x_GLF_uniform_float_values[2];
+    x_GLF_color = vec4<f32>(x_64, x_66, x_68, x_70);
+  } else {
+    let x_73 : u32 = x_16.x_GLF_uniform_uint_values[0];
+    x_GLF_color = unpack4x8snorm(x_73);
+  }
+  let x_76 : i32 = x_12.x_GLF_uniform_int_values[2];
+  a_1 = x_76;
+  i = 0;
+  loop {
+    let x_81 : i32 = i;
+    if ((x_81 < 5)) {
+    } else {
+      break;
+    }
+    j = 0;
+    loop {
+      let x_88 : i32 = j;
+      if ((x_88 < 2)) {
+      } else {
+        break;
+      }
+      let x_91 : i32 = func1_();
+      let x_92 : i32 = a_1;
+      a_1 = (x_92 + x_91);
+
+      continuing {
+        let x_94 : i32 = j;
+        j = (x_94 + 1);
+      }
+    }
+
+    continuing {
+      let x_96 : i32 = i;
+      i = (x_96 + 1);
+    }
+  }
+  let x_98 : i32 = a_1;
+  let x_100 : i32 = x_12.x_GLF_uniform_int_values[0];
+  if ((x_98 == x_100)) {
+    let x_105 : f32 = x_8.x_GLF_uniform_float_values[0];
+    let x_107 : f32 = x_GLF_color.z;
+    x_GLF_color.z = (x_107 - x_105);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-color-output-undefined-in-unexecuted-branch/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-color-output-undefined-in-unexecuted-branch/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..9ea252e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-color-output-undefined-in-unexecuted-branch/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,119 @@
+float4 tint_unpack4x8snorm(uint param_0) {
+  int j = int(param_0);
+  int4 i = int4(j << 24, j << 16, j << 8, j) >> 24;
+  return clamp(float4(i) / 127.0, -1.0, 1.0);
+}
+
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_12 : register(b2, space0) {
+  uint4 x_12[4];
+};
+cbuffer cbuffer_x_14 : register(b3, space0) {
+  uint4 x_14[1];
+};
+cbuffer cbuffer_x_16 : register(b0, space0) {
+  uint4 x_16[1];
+};
+
+void func0_() {
+  float4 tmp = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  const float x_112 = gl_FragCoord.x;
+  const float x_114 = asfloat(x_8[1].x);
+  if ((x_112 > x_114)) {
+    tmp = x_GLF_color;
+  }
+  x_GLF_color = tmp;
+  return;
+}
+
+int func1_() {
+  int a = 0;
+  const int x_122 = asint(x_12[1].x);
+  a = x_122;
+  while (true) {
+    const int x_127 = a;
+    const int x_129 = asint(x_12[3].x);
+    if ((x_127 < x_129)) {
+    } else {
+      break;
+    }
+    const int x_133 = asint(x_14[0].x);
+    const int x_135 = asint(x_12[1].x);
+    if ((x_133 > x_135)) {
+      func0_();
+      const int x_142 = asint(x_12[3].x);
+      a = x_142;
+    } else {
+      func0_();
+    }
+  }
+  return a;
+}
+
+void main_1() {
+  int a_1 = 0;
+  int i = 0;
+  int j = 0;
+  const float x_56 = gl_FragCoord.x;
+  const float x_58 = asfloat(x_8[1].x);
+  if ((x_56 > x_58)) {
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const float x_64 = asfloat(x_8[scalar_offset / 4][scalar_offset % 4]);
+    const float x_66 = asfloat(x_8[1].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const float x_68 = asfloat(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const float x_70 = asfloat(x_8[2].x);
+    x_GLF_color = float4(x_64, x_66, x_68, x_70);
+  } else {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const uint x_73 = x_16[scalar_offset_2 / 4][scalar_offset_2 % 4];
+    x_GLF_color = tint_unpack4x8snorm(x_73);
+  }
+  const int x_76 = asint(x_12[2].x);
+  a_1 = x_76;
+  i = 0;
+  {
+    for(; (i < 5); i = (i + 1)) {
+      j = 0;
+      {
+        for(; (j < 2); j = (j + 1)) {
+          const int x_91 = func1_();
+          a_1 = (a_1 + x_91);
+        }
+      }
+    }
+  }
+  const int x_98 = a_1;
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const int x_100 = asint(x_12[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  if ((x_98 == x_100)) {
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const float x_105 = asfloat(x_8[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const float x_107 = x_GLF_color.z;
+    x_GLF_color.z = (x_107 - x_105);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_8 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_8;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-color-output-undefined-in-unexecuted-branch/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-color-output-undefined-in-unexecuted-branch/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..1cbfbfa
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-color-output-undefined-in-unexecuted-branch/0-opt.wgsl.expected.msl
@@ -0,0 +1,146 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[4];
+};
+struct buf2 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct buf3 {
+  /* 0x0000 */ int three;
+};
+struct tint_padded_array_element_2 {
+  /* 0x0000 */ uint el;
+  /* 0x0004 */ int8_t tint_pad_2[12];
+};
+struct tint_array_wrapper_2 {
+  /* 0x0000 */ tint_padded_array_element_2 arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_2 x_GLF_uniform_uint_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void func0_(constant buf1& x_8, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float4 tmp = 0.0f;
+  float const x_112 = (*(tint_symbol_5)).x;
+  float const x_114 = x_8.x_GLF_uniform_float_values.arr[1].el;
+  if ((x_112 > x_114)) {
+    float4 const x_118 = *(tint_symbol_6);
+    tmp = x_118;
+  }
+  float4 const x_119 = tmp;
+  *(tint_symbol_6) = x_119;
+  return;
+}
+
+int func1_(constant buf2& x_12, constant buf3& x_14, constant buf1& x_8, thread float4* const tint_symbol_7, thread float4* const tint_symbol_8) {
+  int a = 0;
+  int const x_122 = x_12.x_GLF_uniform_int_values.arr[1].el;
+  a = x_122;
+  while (true) {
+    int const x_127 = a;
+    int const x_129 = x_12.x_GLF_uniform_int_values.arr[3].el;
+    if ((x_127 < x_129)) {
+    } else {
+      break;
+    }
+    int const x_133 = x_14.three;
+    int const x_135 = x_12.x_GLF_uniform_int_values.arr[1].el;
+    if ((x_133 > x_135)) {
+      func0_(x_8, tint_symbol_7, tint_symbol_8);
+      int const x_142 = x_12.x_GLF_uniform_int_values.arr[3].el;
+      a = x_142;
+    } else {
+      func0_(x_8, tint_symbol_7, tint_symbol_8);
+    }
+  }
+  int const x_144 = a;
+  return x_144;
+}
+
+void main_1(constant buf1& x_8, constant buf0& x_16, constant buf2& x_12, constant buf3& x_14, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10) {
+  int a_1 = 0;
+  int i = 0;
+  int j = 0;
+  float const x_56 = (*(tint_symbol_9)).x;
+  float const x_58 = x_8.x_GLF_uniform_float_values.arr[1].el;
+  if ((x_56 > x_58)) {
+    float const x_64 = x_8.x_GLF_uniform_float_values.arr[0].el;
+    float const x_66 = x_8.x_GLF_uniform_float_values.arr[1].el;
+    float const x_68 = x_8.x_GLF_uniform_float_values.arr[0].el;
+    float const x_70 = x_8.x_GLF_uniform_float_values.arr[2].el;
+    *(tint_symbol_10) = float4(x_64, x_66, x_68, x_70);
+  } else {
+    uint const x_73 = x_16.x_GLF_uniform_uint_values.arr[0].el;
+    *(tint_symbol_10) = unpack_snorm4x8_to_float(x_73);
+  }
+  int const x_76 = x_12.x_GLF_uniform_int_values.arr[2].el;
+  a_1 = x_76;
+  i = 0;
+  while (true) {
+    int const x_81 = i;
+    if ((x_81 < 5)) {
+    } else {
+      break;
+    }
+    j = 0;
+    while (true) {
+      int const x_88 = j;
+      if ((x_88 < 2)) {
+      } else {
+        break;
+      }
+      int const x_91 = func1_(x_12, x_14, x_8, tint_symbol_9, tint_symbol_10);
+      int const x_92 = a_1;
+      a_1 = (x_92 + x_91);
+      {
+        int const x_94 = j;
+        j = (x_94 + 1);
+      }
+    }
+    {
+      int const x_96 = i;
+      i = (x_96 + 1);
+    }
+  }
+  int const x_98 = a_1;
+  int const x_100 = x_12.x_GLF_uniform_int_values.arr[0].el;
+  if ((x_98 == x_100)) {
+    float const x_105 = x_8.x_GLF_uniform_float_values.arr[0].el;
+    float const x_107 = (*(tint_symbol_10)).z;
+    (*(tint_symbol_10)).z = (x_107 - x_105);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf1& x_8 [[buffer(1)]], constant buf0& x_16 [[buffer(0)]], constant buf2& x_12 [[buffer(2)]], constant buf3& x_14 [[buffer(3)]]) {
+  thread float4 tint_symbol_11 = 0.0f;
+  thread float4 tint_symbol_12 = 0.0f;
+  tint_symbol_11 = gl_FragCoord_param;
+  main_1(x_8, x_16, x_12, x_14, &(tint_symbol_11), &(tint_symbol_12));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_12};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-color-output-undefined-in-unexecuted-branch/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-color-output-undefined-in-unexecuted-branch/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..aa2284f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-color-output-undefined-in-unexecuted-branch/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,297 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 168
+; Schema: 0
+               OpCapability Shader
+        %113 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "x_GLF_uniform_int_values"
+               OpName %x_12 "x_12"
+               OpName %buf3 "buf3"
+               OpMemberName %buf3 0 "three"
+               OpName %x_14 "x_14"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_uint_values"
+               OpName %x_16 "x_16"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %func0_ "func0_"
+               OpName %tmp "tmp"
+               OpName %func1_ "func1_"
+               OpName %a "a"
+               OpName %main_1 "main_1"
+               OpName %a_1 "a_1"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %buf2 Block
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_12 NonWritable
+               OpDecorate %x_12 DescriptorSet 0
+               OpDecorate %x_12 Binding 2
+               OpDecorate %buf3 Block
+               OpMemberDecorate %buf3 0 Offset 0
+               OpDecorate %x_14 NonWritable
+               OpDecorate %x_14 DescriptorSet 0
+               OpDecorate %x_14 Binding 3
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_uint_uint_1 ArrayStride 16
+               OpDecorate %x_16 NonWritable
+               OpDecorate %x_16 DescriptorSet 0
+               OpDecorate %x_16 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf1 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf2 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+       %x_12 = OpVariable %_ptr_Uniform_buf2 Uniform
+       %buf3 = OpTypeStruct %int
+%_ptr_Uniform_buf3 = OpTypePointer Uniform %buf3
+       %x_14 = OpVariable %_ptr_Uniform_buf3 Uniform
+     %uint_1 = OpConstant %uint 1
+%_arr_uint_uint_1 = OpTypeArray %uint %uint_1
+       %buf0 = OpTypeStruct %_arr_uint_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_16 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %31 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+         %51 = OpTypeFunction %int
+%_ptr_Function_int = OpTypePointer Function %int
+         %56 = OpConstantNull %int
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+      %int_5 = OpConstant %int 5
+     %uint_2 = OpConstant %uint 2
+   %main_out = OpTypeStruct %v4float
+        %155 = OpTypeFunction %void %main_out
+     %func0_ = OpFunction %void None %31
+         %34 = OpLabel
+        %tmp = OpVariable %_ptr_Function_v4float Function %5
+         %39 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %40 = OpLoad %float %39
+         %43 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+         %44 = OpLoad %float %43
+         %45 = OpFOrdGreaterThan %bool %40 %44
+               OpSelectionMerge %47 None
+               OpBranchConditional %45 %48 %47
+         %48 = OpLabel
+         %49 = OpLoad %v4float %x_GLF_color
+               OpStore %tmp %49
+               OpBranch %47
+         %47 = OpLabel
+         %50 = OpLoad %v4float %tmp
+               OpStore %x_GLF_color %50
+               OpReturn
+               OpFunctionEnd
+     %func1_ = OpFunction %int None %51
+         %53 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %56
+         %58 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_1
+         %59 = OpLoad %int %58
+               OpStore %a %59
+               OpBranch %60
+         %60 = OpLabel
+               OpLoopMerge %61 %62 None
+               OpBranch %63
+         %63 = OpLabel
+         %64 = OpLoad %int %a
+         %66 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_3
+         %67 = OpLoad %int %66
+         %68 = OpSLessThan %bool %64 %67
+               OpSelectionMerge %69 None
+               OpBranchConditional %68 %70 %71
+         %70 = OpLabel
+               OpBranch %69
+         %71 = OpLabel
+               OpBranch %61
+         %69 = OpLabel
+         %72 = OpAccessChain %_ptr_Uniform_int %x_14 %uint_0
+         %73 = OpLoad %int %72
+         %74 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_1
+         %75 = OpLoad %int %74
+         %76 = OpSGreaterThan %bool %73 %75
+               OpSelectionMerge %77 None
+               OpBranchConditional %76 %78 %79
+         %78 = OpLabel
+         %80 = OpFunctionCall %void %func0_
+         %81 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_3
+         %82 = OpLoad %int %81
+               OpStore %a %82
+               OpBranch %77
+         %79 = OpLabel
+         %83 = OpFunctionCall %void %func0_
+               OpBranch %77
+         %77 = OpLabel
+               OpBranch %62
+         %62 = OpLabel
+               OpBranch %60
+         %61 = OpLabel
+         %84 = OpLoad %int %a
+               OpReturnValue %84
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %31
+         %86 = OpLabel
+        %a_1 = OpVariable %_ptr_Function_int Function %56
+          %i = OpVariable %_ptr_Function_int Function %56
+          %j = OpVariable %_ptr_Function_int Function %56
+         %90 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %91 = OpLoad %float %90
+         %92 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+         %93 = OpLoad %float %92
+         %94 = OpFOrdGreaterThan %bool %91 %93
+               OpSelectionMerge %95 None
+               OpBranchConditional %94 %96 %97
+         %96 = OpLabel
+         %99 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+        %100 = OpLoad %float %99
+        %101 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+        %102 = OpLoad %float %101
+        %103 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+        %104 = OpLoad %float %103
+        %106 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_2
+        %107 = OpLoad %float %106
+        %108 = OpCompositeConstruct %v4float %100 %102 %104 %107
+               OpStore %x_GLF_color %108
+               OpBranch %95
+         %97 = OpLabel
+        %110 = OpAccessChain %_ptr_Uniform_uint %x_16 %uint_0 %int_0
+        %111 = OpLoad %uint %110
+        %112 = OpExtInst %v4float %113 UnpackSnorm4x8 %111
+               OpStore %x_GLF_color %112
+               OpBranch %95
+         %95 = OpLabel
+        %114 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_2
+        %115 = OpLoad %int %114
+               OpStore %a_1 %115
+               OpStore %i %int_0
+               OpBranch %116
+        %116 = OpLabel
+               OpLoopMerge %117 %118 None
+               OpBranch %119
+        %119 = OpLabel
+        %120 = OpLoad %int %i
+        %122 = OpSLessThan %bool %120 %int_5
+               OpSelectionMerge %123 None
+               OpBranchConditional %122 %124 %125
+        %124 = OpLabel
+               OpBranch %123
+        %125 = OpLabel
+               OpBranch %117
+        %123 = OpLabel
+               OpStore %j %int_0
+               OpBranch %126
+        %126 = OpLabel
+               OpLoopMerge %127 %128 None
+               OpBranch %129
+        %129 = OpLabel
+        %130 = OpLoad %int %j
+        %131 = OpSLessThan %bool %130 %int_2
+               OpSelectionMerge %132 None
+               OpBranchConditional %131 %133 %134
+        %133 = OpLabel
+               OpBranch %132
+        %134 = OpLabel
+               OpBranch %127
+        %132 = OpLabel
+        %135 = OpFunctionCall %int %func1_
+        %136 = OpLoad %int %a_1
+        %137 = OpIAdd %int %136 %135
+               OpStore %a_1 %137
+               OpBranch %128
+        %128 = OpLabel
+        %138 = OpLoad %int %j
+        %139 = OpIAdd %int %138 %int_1
+               OpStore %j %139
+               OpBranch %126
+        %127 = OpLabel
+               OpBranch %118
+        %118 = OpLabel
+        %140 = OpLoad %int %i
+        %141 = OpIAdd %int %140 %int_1
+               OpStore %i %141
+               OpBranch %116
+        %117 = OpLabel
+        %142 = OpLoad %int %a_1
+        %143 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_0
+        %144 = OpLoad %int %143
+        %145 = OpIEqual %bool %142 %144
+               OpSelectionMerge %146 None
+               OpBranchConditional %145 %147 %146
+        %147 = OpLabel
+        %148 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+        %149 = OpLoad %float %148
+        %151 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_2
+        %152 = OpLoad %float %151
+        %153 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_2
+        %154 = OpFSub %float %152 %149
+               OpStore %153 %154
+               OpBranch %146
+        %146 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %155
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %159 = OpLabel
+        %160 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %160
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %31
+        %162 = OpLabel
+        %163 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %163
+        %164 = OpFunctionCall %void %main_1
+        %166 = OpLoad %v4float %x_GLF_color
+        %167 = OpCompositeConstruct %main_out %166
+        %165 = OpFunctionCall %void %tint_symbol_3 %167
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-color-output-undefined-in-unexecuted-branch/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-color-output-undefined-in-unexecuted-branch/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..771813e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-color-output-undefined-in-unexecuted-branch/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,144 @@
+type Arr = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf2 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[block]]
+struct buf3 {
+  three : i32;
+};
+
+type Arr_2 = [[stride(16)]] array<u32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_uint_values : Arr_2;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(2)]] var<uniform> x_12 : buf2;
+
+[[group(0), binding(3)]] var<uniform> x_14 : buf3;
+
+[[group(0), binding(0)]] var<uniform> x_16 : buf0;
+
+fn func0_() {
+  var tmp : vec4<f32>;
+  let x_112 : f32 = gl_FragCoord.x;
+  let x_114 : f32 = x_8.x_GLF_uniform_float_values[1];
+  if ((x_112 > x_114)) {
+    let x_118 : vec4<f32> = x_GLF_color;
+    tmp = x_118;
+  }
+  let x_119 : vec4<f32> = tmp;
+  x_GLF_color = x_119;
+  return;
+}
+
+fn func1_() -> i32 {
+  var a : i32;
+  let x_122 : i32 = x_12.x_GLF_uniform_int_values[1];
+  a = x_122;
+  loop {
+    let x_127 : i32 = a;
+    let x_129 : i32 = x_12.x_GLF_uniform_int_values[3];
+    if ((x_127 < x_129)) {
+    } else {
+      break;
+    }
+    let x_133 : i32 = x_14.three;
+    let x_135 : i32 = x_12.x_GLF_uniform_int_values[1];
+    if ((x_133 > x_135)) {
+      func0_();
+      let x_142 : i32 = x_12.x_GLF_uniform_int_values[3];
+      a = x_142;
+    } else {
+      func0_();
+    }
+  }
+  let x_144 : i32 = a;
+  return x_144;
+}
+
+fn main_1() {
+  var a_1 : i32;
+  var i : i32;
+  var j : i32;
+  let x_56 : f32 = gl_FragCoord.x;
+  let x_58 : f32 = x_8.x_GLF_uniform_float_values[1];
+  if ((x_56 > x_58)) {
+    let x_64 : f32 = x_8.x_GLF_uniform_float_values[0];
+    let x_66 : f32 = x_8.x_GLF_uniform_float_values[1];
+    let x_68 : f32 = x_8.x_GLF_uniform_float_values[0];
+    let x_70 : f32 = x_8.x_GLF_uniform_float_values[2];
+    x_GLF_color = vec4<f32>(x_64, x_66, x_68, x_70);
+  } else {
+    let x_73 : u32 = x_16.x_GLF_uniform_uint_values[0];
+    x_GLF_color = unpack4x8snorm(x_73);
+  }
+  let x_76 : i32 = x_12.x_GLF_uniform_int_values[2];
+  a_1 = x_76;
+  i = 0;
+  loop {
+    let x_81 : i32 = i;
+    if ((x_81 < 5)) {
+    } else {
+      break;
+    }
+    j = 0;
+    loop {
+      let x_88 : i32 = j;
+      if ((x_88 < 2)) {
+      } else {
+        break;
+      }
+      let x_91 : i32 = func1_();
+      let x_92 : i32 = a_1;
+      a_1 = (x_92 + x_91);
+
+      continuing {
+        let x_94 : i32 = j;
+        j = (x_94 + 1);
+      }
+    }
+
+    continuing {
+      let x_96 : i32 = i;
+      i = (x_96 + 1);
+    }
+  }
+  let x_98 : i32 = a_1;
+  let x_100 : i32 = x_12.x_GLF_uniform_int_values[0];
+  if ((x_98 == x_100)) {
+    let x_105 : f32 = x_8.x_GLF_uniform_float_values[0];
+    let x_107 : f32 = x_GLF_color.z;
+    x_GLF_color.z = (x_107 - x_105);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-color-overwrite-identity-matrix-multiply/0.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-color-overwrite-identity-matrix-multiply/0.spvasm
new file mode 100644
index 0000000..75c8e10
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-color-overwrite-identity-matrix-multiply/0.spvasm
@@ -0,0 +1,93 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_arr_float_uint_5 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+     %uint_5 = OpConstant %uint 5
+%_arr_float_uint_5 = OpTypeArray %float %uint_5
+       %buf0 = OpTypeStruct %_arr_float_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+      %int_2 = OpConstant %int 2
+     %uint_1 = OpConstant %uint 1
+      %int_4 = OpConstant %int 4
+      %int_3 = OpConstant %int 3
+      %int_1 = OpConstant %int 1
+   %float_10 = OpConstant %float 10
+%mat4v4float = OpTypeMatrix %v4float 4
+    %float_0 = OpConstant %float 0
+       %main = OpFunction %void None %9
+         %31 = OpLabel
+         %32 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %33 = OpLoad %float %32
+         %34 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %35 = OpLoad %float %34
+         %36 = OpFOrdGreaterThan %bool %33 %35
+               OpSelectionMerge %37 None
+               OpBranchConditional %36 %38 %37
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %40 = OpLoad %float %39
+         %41 = OpCompositeConstruct %v4float %40 %40 %40 %40
+               OpStore %_GLF_color %41
+         %42 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %43 = OpLoad %float %42
+         %44 = OpFOrdGreaterThan %bool %43 %35
+               OpSelectionMerge %45 None
+               OpBranchConditional %44 %46 %45
+         %46 = OpLabel
+         %47 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_4
+         %48 = OpLoad %float %47
+         %49 = OpCompositeConstruct %v4float %48 %48 %48 %48
+               OpStore %_GLF_color %49
+               OpBranch %45
+         %45 = OpLabel
+         %50 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_3
+         %51 = OpLoad %float %50
+         %52 = OpCompositeConstruct %v4float %51 %51 %51 %51
+               OpStore %_GLF_color %52
+               OpBranch %37
+         %37 = OpLabel
+         %53 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %54 = OpLoad %float %53
+         %55 = OpCompositeConstruct %v4float %35 %54 %54 %float_10
+               OpStore %_GLF_color %55
+         %56 = OpCompositeConstruct %v4float %35 %float_0 %float_0 %float_0
+         %57 = OpCompositeConstruct %v4float %float_0 %35 %float_0 %float_0
+         %58 = OpCompositeConstruct %v4float %float_0 %float_0 %35 %float_0
+         %59 = OpCompositeConstruct %v4float %float_0 %float_0 %float_0 %35
+         %60 = OpCompositeConstruct %mat4v4float %56 %57 %58 %59
+         %61 = OpLoad %v4float %_GLF_color
+         %62 = OpMatrixTimesVector %v4float %60 %61
+               OpStore %_GLF_color %62
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-color-overwrite-identity-matrix-multiply/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-color-overwrite-identity-matrix-multiply/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..87a0b35
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-color-overwrite-identity-matrix-multiply/0.spvasm.expected.hlsl
@@ -0,0 +1,45 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[5];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const float x_33 = gl_FragCoord.x;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_35 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  if ((x_33 > x_35)) {
+    const float x_40 = asfloat(x_6[2].x);
+    x_GLF_color = float4(x_40, x_40, x_40, x_40);
+    const float x_43 = gl_FragCoord.y;
+    if ((x_43 > x_35)) {
+      const float x_48 = asfloat(x_6[4].x);
+      x_GLF_color = float4(x_48, x_48, x_48, x_48);
+    }
+    const float x_51 = asfloat(x_6[3].x);
+    x_GLF_color = float4(x_51, x_51, x_51, x_51);
+  }
+  const float x_54 = asfloat(x_6[1].x);
+  x_GLF_color = float4(x_35, x_54, x_54, 10.0f);
+  x_GLF_color = mul(x_GLF_color, float4x4(float4(x_35, 0.0f, 0.0f, 0.0f), float4(0.0f, x_35, 0.0f, 0.0f), float4(0.0f, 0.0f, x_35, 0.0f), float4(0.0f, 0.0f, 0.0f, x_35)));
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-color-overwrite-identity-matrix-multiply/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-color-overwrite-identity-matrix-multiply/0.spvasm.expected.msl
new file mode 100644
index 0000000..1102160
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-color-overwrite-identity-matrix-multiply/0.spvasm.expected.msl
@@ -0,0 +1,51 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[5];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float const x_33 = (*(tint_symbol_5)).x;
+  float const x_35 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_33 > x_35)) {
+    float const x_40 = x_6.x_GLF_uniform_float_values.arr[2].el;
+    *(tint_symbol_6) = float4(x_40, x_40, x_40, x_40);
+    float const x_43 = (*(tint_symbol_5)).y;
+    if ((x_43 > x_35)) {
+      float const x_48 = x_6.x_GLF_uniform_float_values.arr[4].el;
+      *(tint_symbol_6) = float4(x_48, x_48, x_48, x_48);
+    }
+    float const x_51 = x_6.x_GLF_uniform_float_values.arr[3].el;
+    *(tint_symbol_6) = float4(x_51, x_51, x_51, x_51);
+  }
+  float const x_54 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  *(tint_symbol_6) = float4(x_35, x_54, x_54, 10.0f);
+  float4 const x_61 = *(tint_symbol_6);
+  *(tint_symbol_6) = (float4x4(float4(x_35, 0.0f, 0.0f, 0.0f), float4(0.0f, x_35, 0.0f, 0.0f), float4(0.0f, 0.0f, x_35, 0.0f), float4(0.0f, 0.0f, 0.0f, x_35)) * x_61);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-color-overwrite-identity-matrix-multiply/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-color-overwrite-identity-matrix-multiply/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..71352d2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-color-overwrite-identity-matrix-multiply/0.spvasm.expected.spvasm
@@ -0,0 +1,128 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 79
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_5 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_float_uint_5 = OpTypeArray %float %uint_5
+       %buf0 = OpTypeStruct %_arr_float_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %17 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+     %uint_1 = OpConstant %uint 1
+      %int_4 = OpConstant %int 4
+      %int_3 = OpConstant %int 3
+      %int_1 = OpConstant %int 1
+   %float_10 = OpConstant %float 10
+%mat4v4float = OpTypeMatrix %v4float 4
+    %float_0 = OpConstant %float 0
+   %main_out = OpTypeStruct %v4float
+         %66 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %17
+         %20 = OpLabel
+         %23 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %24 = OpLoad %float %23
+         %28 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %29 = OpLoad %float %28
+         %30 = OpFOrdGreaterThan %bool %24 %29
+               OpSelectionMerge %32 None
+               OpBranchConditional %30 %33 %32
+         %33 = OpLabel
+         %35 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %36 = OpLoad %float %35
+         %37 = OpCompositeConstruct %v4float %36 %36 %36 %36
+               OpStore %x_GLF_color %37
+         %39 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %40 = OpLoad %float %39
+         %41 = OpFOrdGreaterThan %bool %40 %29
+               OpSelectionMerge %42 None
+               OpBranchConditional %41 %43 %42
+         %43 = OpLabel
+         %45 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_4
+         %46 = OpLoad %float %45
+         %47 = OpCompositeConstruct %v4float %46 %46 %46 %46
+               OpStore %x_GLF_color %47
+               OpBranch %42
+         %42 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+         %50 = OpLoad %float %49
+         %51 = OpCompositeConstruct %v4float %50 %50 %50 %50
+               OpStore %x_GLF_color %51
+               OpBranch %32
+         %32 = OpLabel
+         %53 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %54 = OpLoad %float %53
+         %56 = OpCompositeConstruct %v4float %29 %54 %54 %float_10
+               OpStore %x_GLF_color %56
+         %57 = OpLoad %v4float %x_GLF_color
+         %60 = OpCompositeConstruct %v4float %29 %float_0 %float_0 %float_0
+         %61 = OpCompositeConstruct %v4float %float_0 %29 %float_0 %float_0
+         %62 = OpCompositeConstruct %v4float %float_0 %float_0 %29 %float_0
+         %63 = OpCompositeConstruct %v4float %float_0 %float_0 %float_0 %29
+         %64 = OpCompositeConstruct %mat4v4float %60 %61 %62 %63
+         %65 = OpMatrixTimesVector %v4float %64 %57
+               OpStore %x_GLF_color %65
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %66
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %70 = OpLabel
+         %71 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %71
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %17
+         %73 = OpLabel
+         %74 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %74
+         %75 = OpFunctionCall %void %main_1
+         %77 = OpLoad %v4float %x_GLF_color
+         %78 = OpCompositeConstruct %main_out %77
+         %76 = OpFunctionCall %void %tint_symbol_3 %78
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-color-overwrite-identity-matrix-multiply/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-color-overwrite-identity-matrix-multiply/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..4b6e9c8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-color-overwrite-identity-matrix-multiply/0.spvasm.expected.wgsl
@@ -0,0 +1,45 @@
+type Arr = [[stride(16)]] array<f32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_33 : f32 = gl_FragCoord.x;
+  let x_35 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if ((x_33 > x_35)) {
+    let x_40 : f32 = x_6.x_GLF_uniform_float_values[2];
+    x_GLF_color = vec4<f32>(x_40, x_40, x_40, x_40);
+    let x_43 : f32 = gl_FragCoord.y;
+    if ((x_43 > x_35)) {
+      let x_48 : f32 = x_6.x_GLF_uniform_float_values[4];
+      x_GLF_color = vec4<f32>(x_48, x_48, x_48, x_48);
+    }
+    let x_51 : f32 = x_6.x_GLF_uniform_float_values[3];
+    x_GLF_color = vec4<f32>(x_51, x_51, x_51, x_51);
+  }
+  let x_54 : f32 = x_6.x_GLF_uniform_float_values[1];
+  x_GLF_color = vec4<f32>(x_35, x_54, x_54, 10.0);
+  let x_61 : vec4<f32> = x_GLF_color;
+  x_GLF_color = (mat4x4<f32>(vec4<f32>(x_35, 0.0, 0.0, 0.0), vec4<f32>(0.0, x_35, 0.0, 0.0), vec4<f32>(0.0, 0.0, x_35, 0.0), vec4<f32>(0.0, 0.0, 0.0, x_35)) * x_61);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-color-overwrite-identity-matrix-multiply/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-color-overwrite-identity-matrix-multiply/0.wgsl
new file mode 100644
index 0000000..4b6e9c8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-color-overwrite-identity-matrix-multiply/0.wgsl
@@ -0,0 +1,45 @@
+type Arr = [[stride(16)]] array<f32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_33 : f32 = gl_FragCoord.x;
+  let x_35 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if ((x_33 > x_35)) {
+    let x_40 : f32 = x_6.x_GLF_uniform_float_values[2];
+    x_GLF_color = vec4<f32>(x_40, x_40, x_40, x_40);
+    let x_43 : f32 = gl_FragCoord.y;
+    if ((x_43 > x_35)) {
+      let x_48 : f32 = x_6.x_GLF_uniform_float_values[4];
+      x_GLF_color = vec4<f32>(x_48, x_48, x_48, x_48);
+    }
+    let x_51 : f32 = x_6.x_GLF_uniform_float_values[3];
+    x_GLF_color = vec4<f32>(x_51, x_51, x_51, x_51);
+  }
+  let x_54 : f32 = x_6.x_GLF_uniform_float_values[1];
+  x_GLF_color = vec4<f32>(x_35, x_54, x_54, 10.0);
+  let x_61 : vec4<f32> = x_GLF_color;
+  x_GLF_color = (mat4x4<f32>(vec4<f32>(x_35, 0.0, 0.0, 0.0), vec4<f32>(0.0, x_35, 0.0, 0.0), vec4<f32>(0.0, 0.0, x_35, 0.0), vec4<f32>(0.0, 0.0, 0.0, x_35)) * x_61);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-color-overwrite-identity-matrix-multiply/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-color-overwrite-identity-matrix-multiply/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..87a0b35
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-color-overwrite-identity-matrix-multiply/0.wgsl.expected.hlsl
@@ -0,0 +1,45 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[5];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const float x_33 = gl_FragCoord.x;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_35 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  if ((x_33 > x_35)) {
+    const float x_40 = asfloat(x_6[2].x);
+    x_GLF_color = float4(x_40, x_40, x_40, x_40);
+    const float x_43 = gl_FragCoord.y;
+    if ((x_43 > x_35)) {
+      const float x_48 = asfloat(x_6[4].x);
+      x_GLF_color = float4(x_48, x_48, x_48, x_48);
+    }
+    const float x_51 = asfloat(x_6[3].x);
+    x_GLF_color = float4(x_51, x_51, x_51, x_51);
+  }
+  const float x_54 = asfloat(x_6[1].x);
+  x_GLF_color = float4(x_35, x_54, x_54, 10.0f);
+  x_GLF_color = mul(x_GLF_color, float4x4(float4(x_35, 0.0f, 0.0f, 0.0f), float4(0.0f, x_35, 0.0f, 0.0f), float4(0.0f, 0.0f, x_35, 0.0f), float4(0.0f, 0.0f, 0.0f, x_35)));
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-color-overwrite-identity-matrix-multiply/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-color-overwrite-identity-matrix-multiply/0.wgsl.expected.msl
new file mode 100644
index 0000000..1102160
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-color-overwrite-identity-matrix-multiply/0.wgsl.expected.msl
@@ -0,0 +1,51 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[5];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float const x_33 = (*(tint_symbol_5)).x;
+  float const x_35 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_33 > x_35)) {
+    float const x_40 = x_6.x_GLF_uniform_float_values.arr[2].el;
+    *(tint_symbol_6) = float4(x_40, x_40, x_40, x_40);
+    float const x_43 = (*(tint_symbol_5)).y;
+    if ((x_43 > x_35)) {
+      float const x_48 = x_6.x_GLF_uniform_float_values.arr[4].el;
+      *(tint_symbol_6) = float4(x_48, x_48, x_48, x_48);
+    }
+    float const x_51 = x_6.x_GLF_uniform_float_values.arr[3].el;
+    *(tint_symbol_6) = float4(x_51, x_51, x_51, x_51);
+  }
+  float const x_54 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  *(tint_symbol_6) = float4(x_35, x_54, x_54, 10.0f);
+  float4 const x_61 = *(tint_symbol_6);
+  *(tint_symbol_6) = (float4x4(float4(x_35, 0.0f, 0.0f, 0.0f), float4(0.0f, x_35, 0.0f, 0.0f), float4(0.0f, 0.0f, x_35, 0.0f), float4(0.0f, 0.0f, 0.0f, x_35)) * x_61);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-color-overwrite-identity-matrix-multiply/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-color-overwrite-identity-matrix-multiply/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..71352d2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-color-overwrite-identity-matrix-multiply/0.wgsl.expected.spvasm
@@ -0,0 +1,128 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 79
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_5 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_float_uint_5 = OpTypeArray %float %uint_5
+       %buf0 = OpTypeStruct %_arr_float_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %17 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+     %uint_1 = OpConstant %uint 1
+      %int_4 = OpConstant %int 4
+      %int_3 = OpConstant %int 3
+      %int_1 = OpConstant %int 1
+   %float_10 = OpConstant %float 10
+%mat4v4float = OpTypeMatrix %v4float 4
+    %float_0 = OpConstant %float 0
+   %main_out = OpTypeStruct %v4float
+         %66 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %17
+         %20 = OpLabel
+         %23 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %24 = OpLoad %float %23
+         %28 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %29 = OpLoad %float %28
+         %30 = OpFOrdGreaterThan %bool %24 %29
+               OpSelectionMerge %32 None
+               OpBranchConditional %30 %33 %32
+         %33 = OpLabel
+         %35 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %36 = OpLoad %float %35
+         %37 = OpCompositeConstruct %v4float %36 %36 %36 %36
+               OpStore %x_GLF_color %37
+         %39 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %40 = OpLoad %float %39
+         %41 = OpFOrdGreaterThan %bool %40 %29
+               OpSelectionMerge %42 None
+               OpBranchConditional %41 %43 %42
+         %43 = OpLabel
+         %45 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_4
+         %46 = OpLoad %float %45
+         %47 = OpCompositeConstruct %v4float %46 %46 %46 %46
+               OpStore %x_GLF_color %47
+               OpBranch %42
+         %42 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+         %50 = OpLoad %float %49
+         %51 = OpCompositeConstruct %v4float %50 %50 %50 %50
+               OpStore %x_GLF_color %51
+               OpBranch %32
+         %32 = OpLabel
+         %53 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %54 = OpLoad %float %53
+         %56 = OpCompositeConstruct %v4float %29 %54 %54 %float_10
+               OpStore %x_GLF_color %56
+         %57 = OpLoad %v4float %x_GLF_color
+         %60 = OpCompositeConstruct %v4float %29 %float_0 %float_0 %float_0
+         %61 = OpCompositeConstruct %v4float %float_0 %29 %float_0 %float_0
+         %62 = OpCompositeConstruct %v4float %float_0 %float_0 %29 %float_0
+         %63 = OpCompositeConstruct %v4float %float_0 %float_0 %float_0 %29
+         %64 = OpCompositeConstruct %mat4v4float %60 %61 %62 %63
+         %65 = OpMatrixTimesVector %v4float %64 %57
+               OpStore %x_GLF_color %65
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %66
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %70 = OpLabel
+         %71 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %71
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %17
+         %73 = OpLabel
+         %74 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %74
+         %75 = OpFunctionCall %void %main_1
+         %77 = OpLoad %v4float %x_GLF_color
+         %78 = OpCompositeConstruct %main_out %77
+         %76 = OpFunctionCall %void %tint_symbol_3 %78
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-color-overwrite-identity-matrix-multiply/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-color-overwrite-identity-matrix-multiply/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..4b6e9c8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-color-overwrite-identity-matrix-multiply/0.wgsl.expected.wgsl
@@ -0,0 +1,45 @@
+type Arr = [[stride(16)]] array<f32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_33 : f32 = gl_FragCoord.x;
+  let x_35 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if ((x_33 > x_35)) {
+    let x_40 : f32 = x_6.x_GLF_uniform_float_values[2];
+    x_GLF_color = vec4<f32>(x_40, x_40, x_40, x_40);
+    let x_43 : f32 = gl_FragCoord.y;
+    if ((x_43 > x_35)) {
+      let x_48 : f32 = x_6.x_GLF_uniform_float_values[4];
+      x_GLF_color = vec4<f32>(x_48, x_48, x_48, x_48);
+    }
+    let x_51 : f32 = x_6.x_GLF_uniform_float_values[3];
+    x_GLF_color = vec4<f32>(x_51, x_51, x_51, x_51);
+  }
+  let x_54 : f32 = x_6.x_GLF_uniform_float_values[1];
+  x_GLF_color = vec4<f32>(x_35, x_54, x_54, 10.0);
+  let x_61 : vec4<f32> = x_GLF_color;
+  x_GLF_color = (mat4x4<f32>(vec4<f32>(x_35, 0.0, 0.0, 0.0), vec4<f32>(0.0, x_35, 0.0, 0.0), vec4<f32>(0.0, 0.0, x_35, 0.0), vec4<f32>(0.0, 0.0, 0.0, x_35)) * x_61);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-combine-and-or-xor-gt-lt/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-combine-and-or-xor-gt-lt/0-opt.spvasm
new file mode 100644
index 0000000..6982d41
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-combine-and-or-xor-gt-lt/0-opt.spvasm
@@ -0,0 +1,112 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %b "b"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "v1"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %10 RelaxedPrecision
+               OpDecorate %11 RelaxedPrecision
+               OpDecorate %12 RelaxedPrecision
+               OpDecorate %13 RelaxedPrecision
+               OpDecorate %14 RelaxedPrecision
+       %void = OpTypeVoid
+         %16 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+       %true = OpConstantTrue %bool
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+      %false = OpConstantFalse %bool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %main = OpFunction %void None %16
+         %36 = OpLabel
+          %b = OpVariable %_ptr_Function_bool Function
+               OpStore %b %true
+         %37 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %38 = OpLoad %float %37
+         %39 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %40 = OpLoad %float %39
+         %41 = OpFOrdGreaterThan %bool %38 %40
+               OpSelectionMerge %42 None
+               OpBranchConditional %41 %43 %42
+         %43 = OpLabel
+         %44 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %45 = OpLoad %float %44
+         %46 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %47 = OpLoad %float %46
+         %48 = OpFOrdLessThan %bool %45 %47
+               OpSelectionMerge %49 None
+               OpBranchConditional %48 %50 %49
+         %50 = OpLabel
+               OpStore %b %false
+               OpBranch %49
+         %49 = OpLabel
+               OpBranch %42
+         %42 = OpLabel
+         %51 = OpLoad %bool %b
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %54
+         %53 = OpLabel
+         %55 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %10 = OpLoad %int %55
+         %56 = OpConvertSToF %float %10
+         %57 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %11 = OpLoad %int %57
+         %58 = OpConvertSToF %float %11
+         %59 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %12 = OpLoad %int %59
+         %60 = OpConvertSToF %float %12
+         %61 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %13 = OpLoad %int %61
+         %62 = OpConvertSToF %float %13
+         %63 = OpCompositeConstruct %v4float %56 %58 %60 %62
+               OpStore %_GLF_color %63
+               OpBranch %52
+         %54 = OpLabel
+         %64 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %14 = OpLoad %int %64
+         %65 = OpConvertSToF %float %14
+         %66 = OpCompositeConstruct %v4float %65 %65 %65 %65
+               OpStore %_GLF_color %66
+               OpBranch %52
+         %52 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-combine-and-or-xor-gt-lt/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-combine-and-or-xor-gt-lt/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..f628868
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-combine-and-or-xor-gt-lt/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,49 @@
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[2];
+};
+
+void main_1() {
+  bool b = false;
+  b = true;
+  const float x_38 = asfloat(x_6[0].x);
+  const float x_40 = asfloat(x_6[0].y);
+  if ((x_38 > x_40)) {
+    const float x_45 = asfloat(x_6[0].x);
+    const float x_47 = asfloat(x_6[0].y);
+    if ((x_45 < x_47)) {
+      b = false;
+    }
+  }
+  if (b) {
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_10 = asint(x_8[scalar_offset / 4][scalar_offset % 4]);
+    const int x_11 = asint(x_8[1].x);
+    const int x_12 = asint(x_8[1].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_13 = asint(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    x_GLF_color = float4(float(x_10), float(x_11), float(x_12), float(x_13));
+  } else {
+    const int x_14 = asint(x_8[1].x);
+    const float x_65 = float(x_14);
+    x_GLF_color = float4(x_65, x_65, x_65, x_65);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-combine-and-or-xor-gt-lt/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-combine-and-or-xor-gt-lt/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..944acdb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-combine-and-or-xor-gt-lt/0-opt.spvasm.expected.msl
@@ -0,0 +1,58 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf1 {
+  /* 0x0000 */ packed_float2 v1;
+};
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_8, thread float4* const tint_symbol_4) {
+  bool b = false;
+  b = true;
+  float const x_38 = x_6.v1.x;
+  float const x_40 = x_6.v1.y;
+  if ((x_38 > x_40)) {
+    float const x_45 = x_6.v1.x;
+    float const x_47 = x_6.v1.y;
+    if ((x_45 < x_47)) {
+      b = false;
+    }
+  }
+  bool const x_51 = b;
+  if (x_51) {
+    int const x_10 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    int const x_11 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    int const x_12 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    int const x_13 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_10), float(x_11), float(x_12), float(x_13));
+  } else {
+    int const x_14 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    float const x_65 = float(x_14);
+    *(tint_symbol_4) = float4(x_65, x_65, x_65, x_65);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-combine-and-or-xor-gt-lt/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-combine-and-or-xor-gt-lt/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..f5af17d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-combine-and-or-xor-gt-lt/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,139 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 82
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "v1"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_8 "x_8"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %b "b"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %26 = OpConstantNull %bool
+       %true = OpConstantTrue %bool
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+      %false = OpConstantFalse %bool
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %70 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+          %b = OpVariable %_ptr_Function_bool Function %26
+               OpStore %b %true
+         %30 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+         %31 = OpLoad %float %30
+         %33 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %34 = OpLoad %float %33
+         %35 = OpFOrdGreaterThan %bool %31 %34
+               OpSelectionMerge %36 None
+               OpBranchConditional %35 %37 %36
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+         %39 = OpLoad %float %38
+         %40 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %41 = OpLoad %float %40
+         %42 = OpFOrdLessThan %bool %39 %41
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %43
+         %44 = OpLabel
+               OpStore %b %false
+               OpBranch %43
+         %43 = OpLabel
+               OpBranch %36
+         %36 = OpLabel
+         %46 = OpLoad %bool %b
+               OpSelectionMerge %47 None
+               OpBranchConditional %46 %48 %49
+         %48 = OpLabel
+         %52 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %53 = OpLoad %int %52
+         %55 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %56 = OpLoad %int %55
+         %57 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %58 = OpLoad %int %57
+         %59 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %60 = OpLoad %int %59
+         %61 = OpConvertSToF %float %53
+         %62 = OpConvertSToF %float %56
+         %63 = OpConvertSToF %float %58
+         %64 = OpConvertSToF %float %60
+         %65 = OpCompositeConstruct %v4float %61 %62 %63 %64
+               OpStore %x_GLF_color %65
+               OpBranch %47
+         %49 = OpLabel
+         %66 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %67 = OpLoad %int %66
+         %68 = OpConvertSToF %float %67
+         %69 = OpCompositeConstruct %v4float %68 %68 %68 %68
+               OpStore %x_GLF_color %69
+               OpBranch %47
+         %47 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %70
+%tint_symbol = OpFunctionParameter %main_out
+         %74 = OpLabel
+         %75 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %75
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+         %77 = OpLabel
+         %78 = OpFunctionCall %void %main_1
+         %80 = OpLoad %v4float %x_GLF_color
+         %81 = OpCompositeConstruct %main_out %80
+         %79 = OpFunctionCall %void %tint_symbol_2 %81
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-combine-and-or-xor-gt-lt/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-combine-and-or-xor-gt-lt/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..5cf4af4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-combine-and-or-xor-gt-lt/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,55 @@
+[[block]]
+struct buf1 {
+  v1 : vec2<f32>;
+};
+
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+fn main_1() {
+  var b : bool;
+  b = true;
+  let x_38 : f32 = x_6.v1.x;
+  let x_40 : f32 = x_6.v1.y;
+  if ((x_38 > x_40)) {
+    let x_45 : f32 = x_6.v1.x;
+    let x_47 : f32 = x_6.v1.y;
+    if ((x_45 < x_47)) {
+      b = false;
+    }
+  }
+  let x_51 : bool = b;
+  if (x_51) {
+    let x_10 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_11 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_12 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_13 : i32 = x_8.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_10), f32(x_11), f32(x_12), f32(x_13));
+  } else {
+    let x_14 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_65 : f32 = f32(x_14);
+    x_GLF_color = vec4<f32>(x_65, x_65, x_65, x_65);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-combine-and-or-xor-gt-lt/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-combine-and-or-xor-gt-lt/0-opt.wgsl
new file mode 100644
index 0000000..5cf4af4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-combine-and-or-xor-gt-lt/0-opt.wgsl
@@ -0,0 +1,55 @@
+[[block]]
+struct buf1 {
+  v1 : vec2<f32>;
+};
+
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+fn main_1() {
+  var b : bool;
+  b = true;
+  let x_38 : f32 = x_6.v1.x;
+  let x_40 : f32 = x_6.v1.y;
+  if ((x_38 > x_40)) {
+    let x_45 : f32 = x_6.v1.x;
+    let x_47 : f32 = x_6.v1.y;
+    if ((x_45 < x_47)) {
+      b = false;
+    }
+  }
+  let x_51 : bool = b;
+  if (x_51) {
+    let x_10 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_11 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_12 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_13 : i32 = x_8.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_10), f32(x_11), f32(x_12), f32(x_13));
+  } else {
+    let x_14 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_65 : f32 = f32(x_14);
+    x_GLF_color = vec4<f32>(x_65, x_65, x_65, x_65);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-combine-and-or-xor-gt-lt/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-combine-and-or-xor-gt-lt/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..f628868
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-combine-and-or-xor-gt-lt/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,49 @@
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[2];
+};
+
+void main_1() {
+  bool b = false;
+  b = true;
+  const float x_38 = asfloat(x_6[0].x);
+  const float x_40 = asfloat(x_6[0].y);
+  if ((x_38 > x_40)) {
+    const float x_45 = asfloat(x_6[0].x);
+    const float x_47 = asfloat(x_6[0].y);
+    if ((x_45 < x_47)) {
+      b = false;
+    }
+  }
+  if (b) {
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_10 = asint(x_8[scalar_offset / 4][scalar_offset % 4]);
+    const int x_11 = asint(x_8[1].x);
+    const int x_12 = asint(x_8[1].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_13 = asint(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    x_GLF_color = float4(float(x_10), float(x_11), float(x_12), float(x_13));
+  } else {
+    const int x_14 = asint(x_8[1].x);
+    const float x_65 = float(x_14);
+    x_GLF_color = float4(x_65, x_65, x_65, x_65);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-combine-and-or-xor-gt-lt/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-combine-and-or-xor-gt-lt/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..944acdb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-combine-and-or-xor-gt-lt/0-opt.wgsl.expected.msl
@@ -0,0 +1,58 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf1 {
+  /* 0x0000 */ packed_float2 v1;
+};
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_8, thread float4* const tint_symbol_4) {
+  bool b = false;
+  b = true;
+  float const x_38 = x_6.v1.x;
+  float const x_40 = x_6.v1.y;
+  if ((x_38 > x_40)) {
+    float const x_45 = x_6.v1.x;
+    float const x_47 = x_6.v1.y;
+    if ((x_45 < x_47)) {
+      b = false;
+    }
+  }
+  bool const x_51 = b;
+  if (x_51) {
+    int const x_10 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    int const x_11 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    int const x_12 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    int const x_13 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_10), float(x_11), float(x_12), float(x_13));
+  } else {
+    int const x_14 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    float const x_65 = float(x_14);
+    *(tint_symbol_4) = float4(x_65, x_65, x_65, x_65);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-combine-and-or-xor-gt-lt/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-combine-and-or-xor-gt-lt/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..f5af17d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-combine-and-or-xor-gt-lt/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,139 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 82
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "v1"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_8 "x_8"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %b "b"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %26 = OpConstantNull %bool
+       %true = OpConstantTrue %bool
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+      %false = OpConstantFalse %bool
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %70 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+          %b = OpVariable %_ptr_Function_bool Function %26
+               OpStore %b %true
+         %30 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+         %31 = OpLoad %float %30
+         %33 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %34 = OpLoad %float %33
+         %35 = OpFOrdGreaterThan %bool %31 %34
+               OpSelectionMerge %36 None
+               OpBranchConditional %35 %37 %36
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+         %39 = OpLoad %float %38
+         %40 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %41 = OpLoad %float %40
+         %42 = OpFOrdLessThan %bool %39 %41
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %43
+         %44 = OpLabel
+               OpStore %b %false
+               OpBranch %43
+         %43 = OpLabel
+               OpBranch %36
+         %36 = OpLabel
+         %46 = OpLoad %bool %b
+               OpSelectionMerge %47 None
+               OpBranchConditional %46 %48 %49
+         %48 = OpLabel
+         %52 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %53 = OpLoad %int %52
+         %55 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %56 = OpLoad %int %55
+         %57 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %58 = OpLoad %int %57
+         %59 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %60 = OpLoad %int %59
+         %61 = OpConvertSToF %float %53
+         %62 = OpConvertSToF %float %56
+         %63 = OpConvertSToF %float %58
+         %64 = OpConvertSToF %float %60
+         %65 = OpCompositeConstruct %v4float %61 %62 %63 %64
+               OpStore %x_GLF_color %65
+               OpBranch %47
+         %49 = OpLabel
+         %66 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %67 = OpLoad %int %66
+         %68 = OpConvertSToF %float %67
+         %69 = OpCompositeConstruct %v4float %68 %68 %68 %68
+               OpStore %x_GLF_color %69
+               OpBranch %47
+         %47 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %70
+%tint_symbol = OpFunctionParameter %main_out
+         %74 = OpLabel
+         %75 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %75
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+         %77 = OpLabel
+         %78 = OpFunctionCall %void %main_1
+         %80 = OpLoad %v4float %x_GLF_color
+         %81 = OpCompositeConstruct %main_out %80
+         %79 = OpFunctionCall %void %tint_symbol_2 %81
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-combine-and-or-xor-gt-lt/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-combine-and-or-xor-gt-lt/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..5cf4af4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-combine-and-or-xor-gt-lt/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,55 @@
+[[block]]
+struct buf1 {
+  v1 : vec2<f32>;
+};
+
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+fn main_1() {
+  var b : bool;
+  b = true;
+  let x_38 : f32 = x_6.v1.x;
+  let x_40 : f32 = x_6.v1.y;
+  if ((x_38 > x_40)) {
+    let x_45 : f32 = x_6.v1.x;
+    let x_47 : f32 = x_6.v1.y;
+    if ((x_45 < x_47)) {
+      b = false;
+    }
+  }
+  let x_51 : bool = b;
+  if (x_51) {
+    let x_10 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_11 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_12 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_13 : i32 = x_8.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_10), f32(x_11), f32(x_12), f32(x_13));
+  } else {
+    let x_14 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_65 : f32 = f32(x_14);
+    x_GLF_color = vec4<f32>(x_65, x_65, x_65, x_65);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-condition-loop-index-bitwise-not/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-condition-loop-index-bitwise-not/0-opt.spvasm
new file mode 100644
index 0000000..483ac64
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-condition-loop-index-bitwise-not/0-opt.spvasm
@@ -0,0 +1,109 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %10
+         %24 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+         %25 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %26 = OpLoad %int %25
+               OpStore %a %26
+         %27 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %28 = OpLoad %int %27
+               OpStore %i %28
+               OpBranch %29
+         %29 = OpLabel
+               OpLoopMerge %30 %31 None
+               OpBranch %32
+         %32 = OpLabel
+         %33 = OpLoad %int %i
+         %34 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %35 = OpLoad %int %34
+         %36 = OpSLessThan %bool %33 %35
+               OpBranchConditional %36 %37 %30
+         %37 = OpLabel
+         %38 = OpLoad %int %i
+         %39 = OpNot %int %38
+         %40 = OpINotEqual %bool %39 %int_0
+               OpSelectionMerge %41 None
+               OpBranchConditional %40 %42 %41
+         %42 = OpLabel
+         %43 = OpLoad %int %a
+         %44 = OpIAdd %int %43 %int_1
+               OpStore %a %44
+               OpBranch %41
+         %41 = OpLabel
+               OpBranch %31
+         %31 = OpLabel
+         %45 = OpLoad %int %i
+         %46 = OpIAdd %int %45 %int_1
+               OpStore %i %46
+               OpBranch %29
+         %30 = OpLabel
+         %47 = OpLoad %int %a
+         %48 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %49 = OpLoad %int %48
+         %50 = OpIEqual %bool %47 %49
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %53
+         %52 = OpLabel
+         %54 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %55 = OpLoad %int %54
+         %56 = OpConvertSToF %float %55
+         %57 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %58 = OpLoad %int %57
+         %59 = OpConvertSToF %float %58
+         %60 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %61 = OpLoad %int %60
+         %62 = OpConvertSToF %float %61
+         %63 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %64 = OpLoad %int %63
+         %65 = OpConvertSToF %float %64
+         %66 = OpCompositeConstruct %v4float %56 %59 %62 %65
+               OpStore %_GLF_color %66
+               OpBranch %51
+         %53 = OpLabel
+         %67 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %68 = OpLoad %int %67
+         %69 = OpConvertSToF %float %68
+         %70 = OpCompositeConstruct %v4float %69 %69 %69 %69
+               OpStore %_GLF_color %70
+               OpBranch %51
+         %51 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-condition-loop-index-bitwise-not/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-condition-loop-index-bitwise-not/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..6d029f8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-condition-loop-index-bitwise-not/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,57 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  int i = 0;
+  const int x_26 = asint(x_6[1].x);
+  a = x_26;
+  const int x_28 = asint(x_6[1].x);
+  i = x_28;
+  while (true) {
+    const int x_33 = i;
+    const int x_35 = asint(x_6[2].x);
+    if ((x_33 < x_35)) {
+    } else {
+      break;
+    }
+    if ((~(i) != 0)) {
+      a = (a + 1);
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_47 = a;
+  const int x_49 = asint(x_6[2].x);
+  if ((x_47 == x_49)) {
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_55 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+    const int x_58 = asint(x_6[1].x);
+    const int x_61 = asint(x_6[1].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_64 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    x_GLF_color = float4(float(x_55), float(x_58), float(x_61), float(x_64));
+  } else {
+    const int x_68 = asint(x_6[1].x);
+    const float x_69 = float(x_68);
+    x_GLF_color = float4(x_69, x_69, x_69, x_69);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-condition-loop-index-bitwise-not/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-condition-loop-index-bitwise-not/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..374c16d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-condition-loop-index-bitwise-not/0-opt.spvasm.expected.msl
@@ -0,0 +1,68 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int i = 0;
+  int const x_26 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  a = x_26;
+  int const x_28 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  i = x_28;
+  while (true) {
+    int const x_33 = i;
+    int const x_35 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    if ((x_33 < x_35)) {
+    } else {
+      break;
+    }
+    int const x_38 = i;
+    if ((~(x_38) != 0)) {
+      int const x_43 = a;
+      a = (x_43 + 1);
+    }
+    {
+      int const x_45 = i;
+      i = (x_45 + 1);
+    }
+  }
+  int const x_47 = a;
+  int const x_49 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  if ((x_47 == x_49)) {
+    int const x_55 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_58 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_61 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_64 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_55), float(x_58), float(x_61), float(x_64));
+  } else {
+    int const x_68 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    float const x_69 = float(x_68);
+    *(tint_symbol_4) = float4(x_69, x_69, x_69, x_69);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-condition-loop-index-bitwise-not/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-condition-loop-index-bitwise-not/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..2f722c4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-condition-loop-index-bitwise-not/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,147 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 89
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+      %int_0 = OpConstant %int 0
+   %main_out = OpTypeStruct %v4float
+         %77 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+          %i = OpVariable %_ptr_Function_int Function %21
+         %26 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %27 = OpLoad %int %26
+               OpStore %a %27
+         %28 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %29 = OpLoad %int %28
+               OpStore %i %29
+               OpBranch %30
+         %30 = OpLabel
+               OpLoopMerge %31 %32 None
+               OpBranch %33
+         %33 = OpLabel
+         %34 = OpLoad %int %i
+         %36 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %37 = OpLoad %int %36
+         %38 = OpSLessThan %bool %34 %37
+               OpSelectionMerge %40 None
+               OpBranchConditional %38 %41 %42
+         %41 = OpLabel
+               OpBranch %40
+         %42 = OpLabel
+               OpBranch %31
+         %40 = OpLabel
+         %43 = OpLoad %int %i
+         %44 = OpNot %int %43
+         %46 = OpINotEqual %bool %44 %int_0
+               OpSelectionMerge %47 None
+               OpBranchConditional %46 %48 %47
+         %48 = OpLabel
+         %49 = OpLoad %int %a
+         %50 = OpIAdd %int %49 %int_1
+               OpStore %a %50
+               OpBranch %47
+         %47 = OpLabel
+               OpBranch %32
+         %32 = OpLabel
+         %51 = OpLoad %int %i
+         %52 = OpIAdd %int %51 %int_1
+               OpStore %i %52
+               OpBranch %30
+         %31 = OpLabel
+         %53 = OpLoad %int %a
+         %54 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %55 = OpLoad %int %54
+         %56 = OpIEqual %bool %53 %55
+               OpSelectionMerge %57 None
+               OpBranchConditional %56 %58 %59
+         %58 = OpLabel
+         %60 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %61 = OpLoad %int %60
+         %62 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %63 = OpLoad %int %62
+         %64 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %65 = OpLoad %int %64
+         %66 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %67 = OpLoad %int %66
+         %68 = OpConvertSToF %float %61
+         %69 = OpConvertSToF %float %63
+         %70 = OpConvertSToF %float %65
+         %71 = OpConvertSToF %float %67
+         %72 = OpCompositeConstruct %v4float %68 %69 %70 %71
+               OpStore %x_GLF_color %72
+               OpBranch %57
+         %59 = OpLabel
+         %73 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %74 = OpLoad %int %73
+         %75 = OpConvertSToF %float %74
+         %76 = OpCompositeConstruct %v4float %75 %75 %75 %75
+               OpStore %x_GLF_color %76
+               OpBranch %57
+         %57 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %77
+%tint_symbol = OpFunctionParameter %main_out
+         %81 = OpLabel
+         %82 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %82
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %84 = OpLabel
+         %85 = OpFunctionCall %void %main_1
+         %87 = OpLoad %v4float %x_GLF_color
+         %88 = OpCompositeConstruct %main_out %87
+         %86 = OpFunctionCall %void %tint_symbol_2 %88
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-condition-loop-index-bitwise-not/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-condition-loop-index-bitwise-not/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..0900dc7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-condition-loop-index-bitwise-not/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,62 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  let x_26 : i32 = x_6.x_GLF_uniform_int_values[1];
+  a = x_26;
+  let x_28 : i32 = x_6.x_GLF_uniform_int_values[1];
+  i = x_28;
+  loop {
+    let x_33 : i32 = i;
+    let x_35 : i32 = x_6.x_GLF_uniform_int_values[2];
+    if ((x_33 < x_35)) {
+    } else {
+      break;
+    }
+    let x_38 : i32 = i;
+    if ((~(x_38) != 0)) {
+      let x_43 : i32 = a;
+      a = (x_43 + 1);
+    }
+
+    continuing {
+      let x_45 : i32 = i;
+      i = (x_45 + 1);
+    }
+  }
+  let x_47 : i32 = a;
+  let x_49 : i32 = x_6.x_GLF_uniform_int_values[2];
+  if ((x_47 == x_49)) {
+    let x_55 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_58 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_61 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_64 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_55), f32(x_58), f32(x_61), f32(x_64));
+  } else {
+    let x_68 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_69 : f32 = f32(x_68);
+    x_GLF_color = vec4<f32>(x_69, x_69, x_69, x_69);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-condition-loop-index-bitwise-not/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-condition-loop-index-bitwise-not/0-opt.wgsl
new file mode 100644
index 0000000..0900dc7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-condition-loop-index-bitwise-not/0-opt.wgsl
@@ -0,0 +1,62 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  let x_26 : i32 = x_6.x_GLF_uniform_int_values[1];
+  a = x_26;
+  let x_28 : i32 = x_6.x_GLF_uniform_int_values[1];
+  i = x_28;
+  loop {
+    let x_33 : i32 = i;
+    let x_35 : i32 = x_6.x_GLF_uniform_int_values[2];
+    if ((x_33 < x_35)) {
+    } else {
+      break;
+    }
+    let x_38 : i32 = i;
+    if ((~(x_38) != 0)) {
+      let x_43 : i32 = a;
+      a = (x_43 + 1);
+    }
+
+    continuing {
+      let x_45 : i32 = i;
+      i = (x_45 + 1);
+    }
+  }
+  let x_47 : i32 = a;
+  let x_49 : i32 = x_6.x_GLF_uniform_int_values[2];
+  if ((x_47 == x_49)) {
+    let x_55 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_58 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_61 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_64 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_55), f32(x_58), f32(x_61), f32(x_64));
+  } else {
+    let x_68 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_69 : f32 = f32(x_68);
+    x_GLF_color = vec4<f32>(x_69, x_69, x_69, x_69);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-condition-loop-index-bitwise-not/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-condition-loop-index-bitwise-not/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..6d029f8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-condition-loop-index-bitwise-not/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,57 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  int i = 0;
+  const int x_26 = asint(x_6[1].x);
+  a = x_26;
+  const int x_28 = asint(x_6[1].x);
+  i = x_28;
+  while (true) {
+    const int x_33 = i;
+    const int x_35 = asint(x_6[2].x);
+    if ((x_33 < x_35)) {
+    } else {
+      break;
+    }
+    if ((~(i) != 0)) {
+      a = (a + 1);
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_47 = a;
+  const int x_49 = asint(x_6[2].x);
+  if ((x_47 == x_49)) {
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_55 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+    const int x_58 = asint(x_6[1].x);
+    const int x_61 = asint(x_6[1].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_64 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    x_GLF_color = float4(float(x_55), float(x_58), float(x_61), float(x_64));
+  } else {
+    const int x_68 = asint(x_6[1].x);
+    const float x_69 = float(x_68);
+    x_GLF_color = float4(x_69, x_69, x_69, x_69);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-condition-loop-index-bitwise-not/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-condition-loop-index-bitwise-not/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..374c16d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-condition-loop-index-bitwise-not/0-opt.wgsl.expected.msl
@@ -0,0 +1,68 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int i = 0;
+  int const x_26 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  a = x_26;
+  int const x_28 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  i = x_28;
+  while (true) {
+    int const x_33 = i;
+    int const x_35 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    if ((x_33 < x_35)) {
+    } else {
+      break;
+    }
+    int const x_38 = i;
+    if ((~(x_38) != 0)) {
+      int const x_43 = a;
+      a = (x_43 + 1);
+    }
+    {
+      int const x_45 = i;
+      i = (x_45 + 1);
+    }
+  }
+  int const x_47 = a;
+  int const x_49 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  if ((x_47 == x_49)) {
+    int const x_55 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_58 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_61 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_64 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_55), float(x_58), float(x_61), float(x_64));
+  } else {
+    int const x_68 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    float const x_69 = float(x_68);
+    *(tint_symbol_4) = float4(x_69, x_69, x_69, x_69);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-condition-loop-index-bitwise-not/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-condition-loop-index-bitwise-not/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..2f722c4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-condition-loop-index-bitwise-not/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,147 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 89
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+      %int_0 = OpConstant %int 0
+   %main_out = OpTypeStruct %v4float
+         %77 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+          %i = OpVariable %_ptr_Function_int Function %21
+         %26 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %27 = OpLoad %int %26
+               OpStore %a %27
+         %28 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %29 = OpLoad %int %28
+               OpStore %i %29
+               OpBranch %30
+         %30 = OpLabel
+               OpLoopMerge %31 %32 None
+               OpBranch %33
+         %33 = OpLabel
+         %34 = OpLoad %int %i
+         %36 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %37 = OpLoad %int %36
+         %38 = OpSLessThan %bool %34 %37
+               OpSelectionMerge %40 None
+               OpBranchConditional %38 %41 %42
+         %41 = OpLabel
+               OpBranch %40
+         %42 = OpLabel
+               OpBranch %31
+         %40 = OpLabel
+         %43 = OpLoad %int %i
+         %44 = OpNot %int %43
+         %46 = OpINotEqual %bool %44 %int_0
+               OpSelectionMerge %47 None
+               OpBranchConditional %46 %48 %47
+         %48 = OpLabel
+         %49 = OpLoad %int %a
+         %50 = OpIAdd %int %49 %int_1
+               OpStore %a %50
+               OpBranch %47
+         %47 = OpLabel
+               OpBranch %32
+         %32 = OpLabel
+         %51 = OpLoad %int %i
+         %52 = OpIAdd %int %51 %int_1
+               OpStore %i %52
+               OpBranch %30
+         %31 = OpLabel
+         %53 = OpLoad %int %a
+         %54 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %55 = OpLoad %int %54
+         %56 = OpIEqual %bool %53 %55
+               OpSelectionMerge %57 None
+               OpBranchConditional %56 %58 %59
+         %58 = OpLabel
+         %60 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %61 = OpLoad %int %60
+         %62 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %63 = OpLoad %int %62
+         %64 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %65 = OpLoad %int %64
+         %66 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %67 = OpLoad %int %66
+         %68 = OpConvertSToF %float %61
+         %69 = OpConvertSToF %float %63
+         %70 = OpConvertSToF %float %65
+         %71 = OpConvertSToF %float %67
+         %72 = OpCompositeConstruct %v4float %68 %69 %70 %71
+               OpStore %x_GLF_color %72
+               OpBranch %57
+         %59 = OpLabel
+         %73 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %74 = OpLoad %int %73
+         %75 = OpConvertSToF %float %74
+         %76 = OpCompositeConstruct %v4float %75 %75 %75 %75
+               OpStore %x_GLF_color %76
+               OpBranch %57
+         %57 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %77
+%tint_symbol = OpFunctionParameter %main_out
+         %81 = OpLabel
+         %82 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %82
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %84 = OpLabel
+         %85 = OpFunctionCall %void %main_1
+         %87 = OpLoad %v4float %x_GLF_color
+         %88 = OpCompositeConstruct %main_out %87
+         %86 = OpFunctionCall %void %tint_symbol_2 %88
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-condition-loop-index-bitwise-not/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-condition-loop-index-bitwise-not/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..0900dc7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-condition-loop-index-bitwise-not/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,62 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  let x_26 : i32 = x_6.x_GLF_uniform_int_values[1];
+  a = x_26;
+  let x_28 : i32 = x_6.x_GLF_uniform_int_values[1];
+  i = x_28;
+  loop {
+    let x_33 : i32 = i;
+    let x_35 : i32 = x_6.x_GLF_uniform_int_values[2];
+    if ((x_33 < x_35)) {
+    } else {
+      break;
+    }
+    let x_38 : i32 = i;
+    if ((~(x_38) != 0)) {
+      let x_43 : i32 = a;
+      a = (x_43 + 1);
+    }
+
+    continuing {
+      let x_45 : i32 = i;
+      i = (x_45 + 1);
+    }
+  }
+  let x_47 : i32 = a;
+  let x_49 : i32 = x_6.x_GLF_uniform_int_values[2];
+  if ((x_47 == x_49)) {
+    let x_55 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_58 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_61 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_64 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_55), f32(x_58), f32(x_61), f32(x_64));
+  } else {
+    let x_68 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_69 : f32 = f32(x_68);
+    x_GLF_color = vec4<f32>(x_69, x_69, x_69, x_69);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-conditional-discard-inside-loop/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-conditional-discard-inside-loop/0-opt.spvasm
new file mode 100644
index 0000000..92b329d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-conditional-discard-inside-loop/0-opt.spvasm
@@ -0,0 +1,126 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %a "a"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "injectionSwitch"
+               OpName %__0 ""
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %__1 ""
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %buf2 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 2
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__1 DescriptorSet 0
+               OpDecorate %__1 Binding 1
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+    %v2float = OpTypeVector %float 2
+       %buf2 = OpTypeStruct %v2float
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+        %__0 = OpVariable %_ptr_Uniform_buf2 Uniform
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf1 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__1 = OpVariable %_ptr_Uniform_buf1 Uniform
+       %main = OpFunction %void None %15
+         %36 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+               OpStore %a %int_1
+         %37 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %38 = OpLoad %int %37
+         %39 = OpConvertSToF %float %38
+         %40 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %41 = OpLoad %int %40
+         %42 = OpConvertSToF %float %41
+         %43 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %44 = OpLoad %int %43
+         %45 = OpConvertSToF %float %44
+         %46 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %47 = OpLoad %int %46
+         %48 = OpConvertSToF %float %47
+         %49 = OpCompositeConstruct %v4float %39 %42 %45 %48
+               OpStore %_GLF_color %49
+         %50 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %51 = OpLoad %int %50
+               OpStore %i %51
+               OpBranch %52
+         %52 = OpLabel
+               OpLoopMerge %53 %54 None
+               OpBranch %55
+         %55 = OpLabel
+         %56 = OpLoad %int %i
+         %57 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %58 = OpLoad %int %57
+         %59 = OpSLessThan %bool %56 %58
+               OpBranchConditional %59 %60 %53
+         %60 = OpLabel
+         %61 = OpLoad %int %a
+         %62 = OpIAdd %int %61 %int_1
+               OpStore %a %62
+         %63 = OpSGreaterThan %bool %61 %int_3
+               OpSelectionMerge %64 None
+               OpBranchConditional %63 %65 %64
+         %65 = OpLabel
+               OpBranch %53
+         %64 = OpLabel
+         %66 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %uint_0
+         %67 = OpLoad %float %66
+         %68 = OpAccessChain %_ptr_Uniform_float %__1 %int_0 %int_0
+         %69 = OpLoad %float %68
+         %70 = OpFOrdGreaterThan %bool %67 %69
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %71
+         %72 = OpLabel
+               OpKill
+         %71 = OpLabel
+               OpBranch %54
+         %54 = OpLabel
+         %73 = OpLoad %int %i
+         %74 = OpIAdd %int %73 %int_1
+               OpStore %i %74
+               OpBranch %52
+         %53 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-conditional-discard-inside-loop/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-conditional-discard-inside-loop/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..8a9fa57
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-conditional-discard-inside-loop/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,62 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[3];
+};
+cbuffer cbuffer_x_9 : register(b2, space0) {
+  uint4 x_9[1];
+};
+cbuffer cbuffer_x_11 : register(b1, space0) {
+  uint4 x_11[1];
+};
+
+void main_1() {
+  int a = 0;
+  int i = 0;
+  a = 1;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_38 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const int x_41 = asint(x_6[1].x);
+  const int x_44 = asint(x_6[1].x);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_47 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  x_GLF_color = float4(float(x_38), float(x_41), float(x_44), float(x_47));
+  const int x_51 = asint(x_6[1].x);
+  i = x_51;
+  while (true) {
+    const int x_56 = i;
+    const int x_58 = asint(x_6[2].x);
+    if ((x_56 < x_58)) {
+    } else {
+      break;
+    }
+    const int x_61 = a;
+    a = (x_61 + 1);
+    if ((x_61 > 3)) {
+      break;
+    }
+    const float x_67 = asfloat(x_9[0].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const float x_69 = asfloat(x_11[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    if ((x_67 > x_69)) {
+      discard;
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-conditional-discard-inside-loop/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-conditional-discard-inside-loop/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..51c4567
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-conditional-discard-inside-loop/0-opt.spvasm.expected.msl
@@ -0,0 +1,77 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct buf2 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf2& x_9, constant buf1& x_11, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int i = 0;
+  a = 1;
+  int const x_38 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_41 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_44 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_47 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  *(tint_symbol_4) = float4(float(x_38), float(x_41), float(x_44), float(x_47));
+  int const x_51 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  i = x_51;
+  while (true) {
+    int const x_56 = i;
+    int const x_58 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    if ((x_56 < x_58)) {
+    } else {
+      break;
+    }
+    int const x_61 = a;
+    a = (x_61 + 1);
+    if ((x_61 > 3)) {
+      break;
+    }
+    float const x_67 = x_9.injectionSwitch.x;
+    float const x_69 = x_11.x_GLF_uniform_float_values.arr[0].el;
+    if ((x_67 > x_69)) {
+      discard_fragment();
+    }
+    {
+      int const x_73 = i;
+      i = (x_73 + 1);
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf2& x_9 [[buffer(2)]], constant buf1& x_11 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_9, x_11, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-conditional-discard-inside-loop/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-conditional-discard-inside-loop/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..978adb0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-conditional-discard-inside-loop/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,165 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 92
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "injectionSwitch"
+               OpName %x_9 "x_9"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_11 "x_11"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf2 Block
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 2
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_11 NonWritable
+               OpDecorate %x_11 DescriptorSet 0
+               OpDecorate %x_11 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v2float = OpTypeVector %float 2
+       %buf2 = OpTypeStruct %v2float
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+        %x_9 = OpVariable %_ptr_Uniform_buf2 Uniform
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf1 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_11 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %24 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %30 = OpConstantNull %int
+      %int_1 = OpConstant %int 1
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+   %main_out = OpTypeStruct %v4float
+         %80 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %24
+         %27 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %30
+          %i = OpVariable %_ptr_Function_int Function %30
+               OpStore %a %int_1
+         %36 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %37 = OpLoad %int %36
+         %38 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %39 = OpLoad %int %38
+         %40 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %41 = OpLoad %int %40
+         %42 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %43 = OpLoad %int %42
+         %44 = OpConvertSToF %float %37
+         %45 = OpConvertSToF %float %39
+         %46 = OpConvertSToF %float %41
+         %47 = OpConvertSToF %float %43
+         %48 = OpCompositeConstruct %v4float %44 %45 %46 %47
+               OpStore %x_GLF_color %48
+         %49 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %50 = OpLoad %int %49
+               OpStore %i %50
+               OpBranch %51
+         %51 = OpLabel
+               OpLoopMerge %52 %53 None
+               OpBranch %54
+         %54 = OpLabel
+         %55 = OpLoad %int %i
+         %57 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %58 = OpLoad %int %57
+         %59 = OpSLessThan %bool %55 %58
+               OpSelectionMerge %61 None
+               OpBranchConditional %59 %62 %63
+         %62 = OpLabel
+               OpBranch %61
+         %63 = OpLabel
+               OpBranch %52
+         %61 = OpLabel
+         %64 = OpLoad %int %a
+         %65 = OpIAdd %int %64 %int_1
+               OpStore %a %65
+         %67 = OpSGreaterThan %bool %64 %int_3
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %68
+         %69 = OpLabel
+               OpBranch %52
+         %68 = OpLabel
+         %71 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_0
+         %72 = OpLoad %float %71
+         %73 = OpAccessChain %_ptr_Uniform_float %x_11 %uint_0 %int_0
+         %74 = OpLoad %float %73
+         %75 = OpFOrdGreaterThan %bool %72 %74
+               OpSelectionMerge %76 None
+               OpBranchConditional %75 %77 %76
+         %77 = OpLabel
+               OpKill
+         %76 = OpLabel
+               OpBranch %53
+         %53 = OpLabel
+         %78 = OpLoad %int %i
+         %79 = OpIAdd %int %78 %int_1
+               OpStore %i %79
+               OpBranch %51
+         %52 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %80
+%tint_symbol = OpFunctionParameter %main_out
+         %84 = OpLabel
+         %85 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %85
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %24
+         %87 = OpLabel
+         %88 = OpFunctionCall %void %main_1
+         %90 = OpLoad %v4float %x_GLF_color
+         %91 = OpCompositeConstruct %main_out %90
+         %89 = OpFunctionCall %void %tint_symbol_2 %91
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-conditional-discard-inside-loop/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-conditional-discard-inside-loop/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..aa0d3ab
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-conditional-discard-inside-loop/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,74 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[block]]
+struct buf2 {
+  injectionSwitch : vec2<f32>;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(2)]] var<uniform> x_9 : buf2;
+
+[[group(0), binding(1)]] var<uniform> x_11 : buf1;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  a = 1;
+  let x_38 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_41 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_44 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_47 : i32 = x_6.x_GLF_uniform_int_values[0];
+  x_GLF_color = vec4<f32>(f32(x_38), f32(x_41), f32(x_44), f32(x_47));
+  let x_51 : i32 = x_6.x_GLF_uniform_int_values[1];
+  i = x_51;
+  loop {
+    let x_56 : i32 = i;
+    let x_58 : i32 = x_6.x_GLF_uniform_int_values[2];
+    if ((x_56 < x_58)) {
+    } else {
+      break;
+    }
+    let x_61 : i32 = a;
+    a = (x_61 + 1);
+    if ((x_61 > 3)) {
+      break;
+    }
+    let x_67 : f32 = x_9.injectionSwitch.x;
+    let x_69 : f32 = x_11.x_GLF_uniform_float_values[0];
+    if ((x_67 > x_69)) {
+      discard;
+    }
+
+    continuing {
+      let x_73 : i32 = i;
+      i = (x_73 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-conditional-discard-inside-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-conditional-discard-inside-loop/0-opt.wgsl
new file mode 100644
index 0000000..aa0d3ab
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-conditional-discard-inside-loop/0-opt.wgsl
@@ -0,0 +1,74 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[block]]
+struct buf2 {
+  injectionSwitch : vec2<f32>;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(2)]] var<uniform> x_9 : buf2;
+
+[[group(0), binding(1)]] var<uniform> x_11 : buf1;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  a = 1;
+  let x_38 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_41 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_44 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_47 : i32 = x_6.x_GLF_uniform_int_values[0];
+  x_GLF_color = vec4<f32>(f32(x_38), f32(x_41), f32(x_44), f32(x_47));
+  let x_51 : i32 = x_6.x_GLF_uniform_int_values[1];
+  i = x_51;
+  loop {
+    let x_56 : i32 = i;
+    let x_58 : i32 = x_6.x_GLF_uniform_int_values[2];
+    if ((x_56 < x_58)) {
+    } else {
+      break;
+    }
+    let x_61 : i32 = a;
+    a = (x_61 + 1);
+    if ((x_61 > 3)) {
+      break;
+    }
+    let x_67 : f32 = x_9.injectionSwitch.x;
+    let x_69 : f32 = x_11.x_GLF_uniform_float_values[0];
+    if ((x_67 > x_69)) {
+      discard;
+    }
+
+    continuing {
+      let x_73 : i32 = i;
+      i = (x_73 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-conditional-discard-inside-loop/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-conditional-discard-inside-loop/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..8a9fa57
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-conditional-discard-inside-loop/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,62 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[3];
+};
+cbuffer cbuffer_x_9 : register(b2, space0) {
+  uint4 x_9[1];
+};
+cbuffer cbuffer_x_11 : register(b1, space0) {
+  uint4 x_11[1];
+};
+
+void main_1() {
+  int a = 0;
+  int i = 0;
+  a = 1;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_38 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const int x_41 = asint(x_6[1].x);
+  const int x_44 = asint(x_6[1].x);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_47 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  x_GLF_color = float4(float(x_38), float(x_41), float(x_44), float(x_47));
+  const int x_51 = asint(x_6[1].x);
+  i = x_51;
+  while (true) {
+    const int x_56 = i;
+    const int x_58 = asint(x_6[2].x);
+    if ((x_56 < x_58)) {
+    } else {
+      break;
+    }
+    const int x_61 = a;
+    a = (x_61 + 1);
+    if ((x_61 > 3)) {
+      break;
+    }
+    const float x_67 = asfloat(x_9[0].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const float x_69 = asfloat(x_11[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    if ((x_67 > x_69)) {
+      discard;
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-conditional-discard-inside-loop/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-conditional-discard-inside-loop/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..51c4567
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-conditional-discard-inside-loop/0-opt.wgsl.expected.msl
@@ -0,0 +1,77 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct buf2 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf2& x_9, constant buf1& x_11, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int i = 0;
+  a = 1;
+  int const x_38 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_41 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_44 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_47 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  *(tint_symbol_4) = float4(float(x_38), float(x_41), float(x_44), float(x_47));
+  int const x_51 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  i = x_51;
+  while (true) {
+    int const x_56 = i;
+    int const x_58 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    if ((x_56 < x_58)) {
+    } else {
+      break;
+    }
+    int const x_61 = a;
+    a = (x_61 + 1);
+    if ((x_61 > 3)) {
+      break;
+    }
+    float const x_67 = x_9.injectionSwitch.x;
+    float const x_69 = x_11.x_GLF_uniform_float_values.arr[0].el;
+    if ((x_67 > x_69)) {
+      discard_fragment();
+    }
+    {
+      int const x_73 = i;
+      i = (x_73 + 1);
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf2& x_9 [[buffer(2)]], constant buf1& x_11 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_9, x_11, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-conditional-discard-inside-loop/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-conditional-discard-inside-loop/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..978adb0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-conditional-discard-inside-loop/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,165 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 92
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "injectionSwitch"
+               OpName %x_9 "x_9"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_11 "x_11"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf2 Block
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 2
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_11 NonWritable
+               OpDecorate %x_11 DescriptorSet 0
+               OpDecorate %x_11 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v2float = OpTypeVector %float 2
+       %buf2 = OpTypeStruct %v2float
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+        %x_9 = OpVariable %_ptr_Uniform_buf2 Uniform
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf1 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_11 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %24 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %30 = OpConstantNull %int
+      %int_1 = OpConstant %int 1
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+   %main_out = OpTypeStruct %v4float
+         %80 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %24
+         %27 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %30
+          %i = OpVariable %_ptr_Function_int Function %30
+               OpStore %a %int_1
+         %36 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %37 = OpLoad %int %36
+         %38 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %39 = OpLoad %int %38
+         %40 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %41 = OpLoad %int %40
+         %42 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %43 = OpLoad %int %42
+         %44 = OpConvertSToF %float %37
+         %45 = OpConvertSToF %float %39
+         %46 = OpConvertSToF %float %41
+         %47 = OpConvertSToF %float %43
+         %48 = OpCompositeConstruct %v4float %44 %45 %46 %47
+               OpStore %x_GLF_color %48
+         %49 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %50 = OpLoad %int %49
+               OpStore %i %50
+               OpBranch %51
+         %51 = OpLabel
+               OpLoopMerge %52 %53 None
+               OpBranch %54
+         %54 = OpLabel
+         %55 = OpLoad %int %i
+         %57 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %58 = OpLoad %int %57
+         %59 = OpSLessThan %bool %55 %58
+               OpSelectionMerge %61 None
+               OpBranchConditional %59 %62 %63
+         %62 = OpLabel
+               OpBranch %61
+         %63 = OpLabel
+               OpBranch %52
+         %61 = OpLabel
+         %64 = OpLoad %int %a
+         %65 = OpIAdd %int %64 %int_1
+               OpStore %a %65
+         %67 = OpSGreaterThan %bool %64 %int_3
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %68
+         %69 = OpLabel
+               OpBranch %52
+         %68 = OpLabel
+         %71 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_0
+         %72 = OpLoad %float %71
+         %73 = OpAccessChain %_ptr_Uniform_float %x_11 %uint_0 %int_0
+         %74 = OpLoad %float %73
+         %75 = OpFOrdGreaterThan %bool %72 %74
+               OpSelectionMerge %76 None
+               OpBranchConditional %75 %77 %76
+         %77 = OpLabel
+               OpKill
+         %76 = OpLabel
+               OpBranch %53
+         %53 = OpLabel
+         %78 = OpLoad %int %i
+         %79 = OpIAdd %int %78 %int_1
+               OpStore %i %79
+               OpBranch %51
+         %52 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %80
+%tint_symbol = OpFunctionParameter %main_out
+         %84 = OpLabel
+         %85 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %85
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %24
+         %87 = OpLabel
+         %88 = OpFunctionCall %void %main_1
+         %90 = OpLoad %v4float %x_GLF_color
+         %91 = OpCompositeConstruct %main_out %90
+         %89 = OpFunctionCall %void %tint_symbol_2 %91
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-conditional-discard-inside-loop/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-conditional-discard-inside-loop/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..aa0d3ab
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-conditional-discard-inside-loop/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,74 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[block]]
+struct buf2 {
+  injectionSwitch : vec2<f32>;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(2)]] var<uniform> x_9 : buf2;
+
+[[group(0), binding(1)]] var<uniform> x_11 : buf1;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  a = 1;
+  let x_38 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_41 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_44 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_47 : i32 = x_6.x_GLF_uniform_int_values[0];
+  x_GLF_color = vec4<f32>(f32(x_38), f32(x_41), f32(x_44), f32(x_47));
+  let x_51 : i32 = x_6.x_GLF_uniform_int_values[1];
+  i = x_51;
+  loop {
+    let x_56 : i32 = i;
+    let x_58 : i32 = x_6.x_GLF_uniform_int_values[2];
+    if ((x_56 < x_58)) {
+    } else {
+      break;
+    }
+    let x_61 : i32 = a;
+    a = (x_61 + 1);
+    if ((x_61 > 3)) {
+      break;
+    }
+    let x_67 : f32 = x_9.injectionSwitch.x;
+    let x_69 : f32 = x_11.x_GLF_uniform_float_values[0];
+    if ((x_67 > x_69)) {
+      discard;
+    }
+
+    continuing {
+      let x_73 : i32 = i;
+      i = (x_73 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-ceil-vec4/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-ceil-vec4/0-opt.spvasm
new file mode 100644
index 0000000..84990a8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-ceil-vec4/0-opt.spvasm
@@ -0,0 +1,65 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %v "v"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "quarter"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%float_424_113007 = OpConstant %float 424.113007
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%float_1_29999995 = OpConstant %float 1.29999995
+%float_19_6200008 = OpConstant %float 19.6200008
+  %float_425 = OpConstant %float 425
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+   %float_20 = OpConstant %float 20
+         %23 = OpConstantComposite %v4float %float_425 %float_1 %float_2 %float_20
+       %bool = OpTypeBool
+     %v4bool = OpTypeVector %bool 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %28 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %29 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %8
+         %30 = OpLabel
+          %v = OpVariable %_ptr_Function_v4float Function
+         %31 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %32 = OpLoad %float %31
+         %33 = OpCompositeConstruct %v4float %float_424_113007 %32 %float_1_29999995 %float_19_6200008
+         %34 = OpExtInst %v4float %1 Ceil %33
+               OpStore %v %34
+         %35 = OpLoad %v4float %v
+         %36 = OpFOrdEqual %v4bool %35 %23
+         %37 = OpAll %bool %36
+               OpSelectionMerge %38 None
+               OpBranchConditional %37 %39 %40
+         %39 = OpLabel
+               OpStore %_GLF_color %28
+               OpBranch %38
+         %40 = OpLabel
+               OpStore %_GLF_color %29
+               OpBranch %38
+         %38 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-ceil-vec4/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-ceil-vec4/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..1009de2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-ceil-vec4/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,30 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 v = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  const float x_32 = asfloat(x_6[0].x);
+  v = ceil(float4(424.113006592f, x_32, 1.299999952f, 19.620000839f));
+  if (all((v == float4(425.0f, 1.0f, 2.0f, 20.0f)))) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-ceil-vec4/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-ceil-vec4/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..8e6db1d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-ceil-vec4/0-opt.spvasm.expected.msl
@@ -0,0 +1,34 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float quarter;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float4 v = 0.0f;
+  float const x_32 = x_6.quarter;
+  v = ceil(float4(424.113006592f, x_32, 1.299999952f, 19.620000839f));
+  float4 const x_35 = v;
+  if (all((x_35 == float4(425.0f, 1.0f, 2.0f, 20.0f)))) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-ceil-vec4/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-ceil-vec4/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..c4f9009
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-ceil-vec4/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,97 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 56
+; Schema: 0
+               OpCapability Shader
+         %23 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "quarter"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v "v"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%float_424_113007 = OpConstant %float 424.113007
+%float_1_29999995 = OpConstant %float 1.29999995
+%float_19_6200008 = OpConstant %float 19.6200008
+       %bool = OpTypeBool
+  %float_425 = OpConstant %float 425
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+   %float_20 = OpConstant %float 20
+         %35 = OpConstantComposite %v4float %float_425 %float_1 %float_2 %float_20
+     %v4bool = OpTypeVector %bool 4
+    %float_0 = OpConstant %float 0
+         %42 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %43 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %44 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+          %v = OpVariable %_ptr_Function_v4float Function %8
+         %20 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0
+         %21 = OpLoad %float %20
+         %27 = OpCompositeConstruct %v4float %float_424_113007 %21 %float_1_29999995 %float_19_6200008
+         %22 = OpExtInst %v4float %23 Ceil %27
+               OpStore %v %22
+         %28 = OpLoad %v4float %v
+         %36 = OpFOrdEqual %v4bool %28 %35
+         %29 = OpAll %bool %36
+               OpSelectionMerge %38 None
+               OpBranchConditional %29 %39 %40
+         %39 = OpLabel
+               OpStore %x_GLF_color %42
+               OpBranch %38
+         %40 = OpLabel
+               OpStore %x_GLF_color %43
+               OpBranch %38
+         %38 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %44
+%tint_symbol = OpFunctionParameter %main_out
+         %48 = OpLabel
+         %49 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %49
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %51 = OpLabel
+         %52 = OpFunctionCall %void %main_1
+         %54 = OpLoad %v4float %x_GLF_color
+         %55 = OpCompositeConstruct %main_out %54
+         %53 = OpFunctionCall %void %tint_symbol_2 %55
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-ceil-vec4/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-ceil-vec4/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..cb4aa38
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-ceil-vec4/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,32 @@
+[[block]]
+struct buf0 {
+  quarter : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v : vec4<f32>;
+  let x_32 : f32 = x_6.quarter;
+  v = ceil(vec4<f32>(424.113006592, x_32, 1.299999952, 19.620000839));
+  let x_35 : vec4<f32> = v;
+  if (all((x_35 == vec4<f32>(425.0, 1.0, 2.0, 20.0)))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-ceil-vec4/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-ceil-vec4/0-opt.wgsl
new file mode 100644
index 0000000..cb4aa38
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-ceil-vec4/0-opt.wgsl
@@ -0,0 +1,32 @@
+[[block]]
+struct buf0 {
+  quarter : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v : vec4<f32>;
+  let x_32 : f32 = x_6.quarter;
+  v = ceil(vec4<f32>(424.113006592, x_32, 1.299999952, 19.620000839));
+  let x_35 : vec4<f32> = v;
+  if (all((x_35 == vec4<f32>(425.0, 1.0, 2.0, 20.0)))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-ceil-vec4/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-ceil-vec4/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..1009de2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-ceil-vec4/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,30 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 v = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  const float x_32 = asfloat(x_6[0].x);
+  v = ceil(float4(424.113006592f, x_32, 1.299999952f, 19.620000839f));
+  if (all((v == float4(425.0f, 1.0f, 2.0f, 20.0f)))) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-ceil-vec4/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-ceil-vec4/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..8e6db1d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-ceil-vec4/0-opt.wgsl.expected.msl
@@ -0,0 +1,34 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float quarter;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float4 v = 0.0f;
+  float const x_32 = x_6.quarter;
+  v = ceil(float4(424.113006592f, x_32, 1.299999952f, 19.620000839f));
+  float4 const x_35 = v;
+  if (all((x_35 == float4(425.0f, 1.0f, 2.0f, 20.0f)))) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-ceil-vec4/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-ceil-vec4/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..c4f9009
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-ceil-vec4/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,97 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 56
+; Schema: 0
+               OpCapability Shader
+         %23 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "quarter"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v "v"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%float_424_113007 = OpConstant %float 424.113007
+%float_1_29999995 = OpConstant %float 1.29999995
+%float_19_6200008 = OpConstant %float 19.6200008
+       %bool = OpTypeBool
+  %float_425 = OpConstant %float 425
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+   %float_20 = OpConstant %float 20
+         %35 = OpConstantComposite %v4float %float_425 %float_1 %float_2 %float_20
+     %v4bool = OpTypeVector %bool 4
+    %float_0 = OpConstant %float 0
+         %42 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %43 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %44 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+          %v = OpVariable %_ptr_Function_v4float Function %8
+         %20 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0
+         %21 = OpLoad %float %20
+         %27 = OpCompositeConstruct %v4float %float_424_113007 %21 %float_1_29999995 %float_19_6200008
+         %22 = OpExtInst %v4float %23 Ceil %27
+               OpStore %v %22
+         %28 = OpLoad %v4float %v
+         %36 = OpFOrdEqual %v4bool %28 %35
+         %29 = OpAll %bool %36
+               OpSelectionMerge %38 None
+               OpBranchConditional %29 %39 %40
+         %39 = OpLabel
+               OpStore %x_GLF_color %42
+               OpBranch %38
+         %40 = OpLabel
+               OpStore %x_GLF_color %43
+               OpBranch %38
+         %38 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %44
+%tint_symbol = OpFunctionParameter %main_out
+         %48 = OpLabel
+         %49 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %49
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %51 = OpLabel
+         %52 = OpFunctionCall %void %main_1
+         %54 = OpLoad %v4float %x_GLF_color
+         %55 = OpCompositeConstruct %main_out %54
+         %53 = OpFunctionCall %void %tint_symbol_2 %55
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-ceil-vec4/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-ceil-vec4/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..cb4aa38
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-ceil-vec4/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,32 @@
+[[block]]
+struct buf0 {
+  quarter : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v : vec4<f32>;
+  let x_32 : f32 = x_6.quarter;
+  v = ceil(vec4<f32>(424.113006592, x_32, 1.299999952, 19.620000839));
+  let x_35 : vec4<f32> = v;
+  if (all((x_35 == vec4<f32>(425.0, 1.0, 2.0, 20.0)))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-inside-while/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-inside-while/0-opt.spvasm
new file mode 100644
index 0000000..12e9e7b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-inside-while/0-opt.spvasm
@@ -0,0 +1,72 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+      %int_5 = OpConstant %int 5
+      %int_9 = OpConstant %int 9
+       %bool = OpTypeBool
+     %int_10 = OpConstant %int 10
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %21 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %22 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %7
+         %23 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+          %j = OpVariable %_ptr_Function_int Function
+               OpStore %i %int_0
+               OpStore %j %int_1
+               OpBranch %24
+         %24 = OpLabel
+               OpLoopMerge %25 %26 None
+               OpBranch %27
+         %27 = OpLabel
+         %28 = OpLoad %int %i
+         %29 = OpLoad %int %j
+         %30 = OpExtInst %int %1 SClamp %29 %int_5 %int_9
+         %31 = OpSLessThan %bool %28 %30
+               OpBranchConditional %31 %32 %25
+         %32 = OpLabel
+         %33 = OpLoad %int %i
+         %34 = OpIAdd %int %33 %int_1
+               OpStore %i %34
+         %35 = OpLoad %int %j
+         %36 = OpIAdd %int %35 %int_1
+               OpStore %j %36
+               OpBranch %26
+         %26 = OpLabel
+               OpBranch %24
+         %25 = OpLabel
+         %37 = OpLoad %int %i
+         %38 = OpIEqual %bool %37 %int_9
+         %39 = OpLoad %int %j
+         %40 = OpIEqual %bool %39 %int_10
+         %41 = OpLogicalAnd %bool %38 %40
+               OpSelectionMerge %42 None
+               OpBranchConditional %41 %43 %44
+         %43 = OpLabel
+               OpStore %_GLF_color %21
+               OpBranch %42
+         %44 = OpLabel
+               OpStore %_GLF_color %22
+               OpBranch %42
+         %42 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-inside-while/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-inside-while/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..cef004d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-inside-while/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,40 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int i = 0;
+  int j = 0;
+  i = 0;
+  j = 1;
+  while (true) {
+    if ((i < clamp(j, 5, 9))) {
+    } else {
+      break;
+    }
+    i = (i + 1);
+    j = (j + 1);
+  }
+  bool tint_tmp = (i == 9);
+  if (tint_tmp) {
+    tint_tmp = (j == 10);
+  }
+  if ((tint_tmp)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-inside-while/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-inside-while/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..35f0b9c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-inside-while/0-opt.spvasm.expected.msl
@@ -0,0 +1,45 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  int i = 0;
+  int j = 0;
+  i = 0;
+  j = 1;
+  while (true) {
+    int const x_28 = i;
+    int const x_29 = j;
+    if ((x_28 < clamp(x_29, 5, 9))) {
+    } else {
+      break;
+    }
+    int const x_33 = i;
+    i = (x_33 + 1);
+    int const x_35 = j;
+    j = (x_35 + 1);
+  }
+  int const x_37 = i;
+  int const x_39 = j;
+  if (((x_37 == 9) && (x_39 == 10))) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-inside-while/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-inside-while/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..99a8be5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-inside-while/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,114 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 65
+; Schema: 0
+               OpCapability Shader
+         %26 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %15 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+      %int_5 = OpConstant %int 5
+      %int_9 = OpConstant %int 9
+       %bool = OpTypeBool
+     %int_10 = OpConstant %int 10
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %51 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %52 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %53 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %15
+          %j = OpVariable %_ptr_Function_int Function %15
+               OpStore %i %int_0
+               OpStore %j %int_1
+               OpBranch %19
+         %19 = OpLabel
+               OpLoopMerge %20 %21 None
+               OpBranch %22
+         %22 = OpLabel
+         %23 = OpLoad %int %i
+         %24 = OpLoad %int %j
+         %25 = OpExtInst %int %26 SClamp %24 %int_5 %int_9
+         %29 = OpSLessThan %bool %23 %25
+               OpSelectionMerge %31 None
+               OpBranchConditional %29 %32 %33
+         %32 = OpLabel
+               OpBranch %31
+         %33 = OpLabel
+               OpBranch %20
+         %31 = OpLabel
+         %34 = OpLoad %int %i
+         %35 = OpIAdd %int %34 %int_1
+               OpStore %i %35
+         %36 = OpLoad %int %j
+         %37 = OpIAdd %int %36 %int_1
+               OpStore %j %37
+               OpBranch %21
+         %21 = OpLabel
+               OpBranch %19
+         %20 = OpLabel
+         %38 = OpLoad %int %i
+         %39 = OpLoad %int %j
+         %40 = OpIEqual %bool %38 %int_9
+               OpSelectionMerge %41 None
+               OpBranchConditional %40 %42 %41
+         %42 = OpLabel
+         %44 = OpIEqual %bool %39 %int_10
+               OpBranch %41
+         %41 = OpLabel
+         %45 = OpPhi %bool %40 %20 %44 %42
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %48
+         %47 = OpLabel
+               OpStore %x_GLF_color %51
+               OpBranch %46
+         %48 = OpLabel
+               OpStore %x_GLF_color %52
+               OpBranch %46
+         %46 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %53
+%tint_symbol = OpFunctionParameter %main_out
+         %57 = OpLabel
+         %58 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %58
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %60 = OpLabel
+         %61 = OpFunctionCall %void %main_1
+         %63 = OpLoad %v4float %x_GLF_color
+         %64 = OpCompositeConstruct %main_out %63
+         %62 = OpFunctionCall %void %tint_symbol_2 %64
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-inside-while/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-inside-while/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..367bf40
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-inside-while/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,39 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  var j : i32;
+  i = 0;
+  j = 1;
+  loop {
+    let x_28 : i32 = i;
+    let x_29 : i32 = j;
+    if ((x_28 < clamp(x_29, 5, 9))) {
+    } else {
+      break;
+    }
+    let x_33 : i32 = i;
+    i = (x_33 + 1);
+    let x_35 : i32 = j;
+    j = (x_35 + 1);
+  }
+  let x_37 : i32 = i;
+  let x_39 : i32 = j;
+  if (((x_37 == 9) && (x_39 == 10))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-inside-while/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-inside-while/0-opt.wgsl
new file mode 100644
index 0000000..367bf40
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-inside-while/0-opt.wgsl
@@ -0,0 +1,39 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  var j : i32;
+  i = 0;
+  j = 1;
+  loop {
+    let x_28 : i32 = i;
+    let x_29 : i32 = j;
+    if ((x_28 < clamp(x_29, 5, 9))) {
+    } else {
+      break;
+    }
+    let x_33 : i32 = i;
+    i = (x_33 + 1);
+    let x_35 : i32 = j;
+    j = (x_35 + 1);
+  }
+  let x_37 : i32 = i;
+  let x_39 : i32 = j;
+  if (((x_37 == 9) && (x_39 == 10))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-inside-while/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-inside-while/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..cef004d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-inside-while/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,40 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int i = 0;
+  int j = 0;
+  i = 0;
+  j = 1;
+  while (true) {
+    if ((i < clamp(j, 5, 9))) {
+    } else {
+      break;
+    }
+    i = (i + 1);
+    j = (j + 1);
+  }
+  bool tint_tmp = (i == 9);
+  if (tint_tmp) {
+    tint_tmp = (j == 10);
+  }
+  if ((tint_tmp)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-inside-while/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-inside-while/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..35f0b9c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-inside-while/0-opt.wgsl.expected.msl
@@ -0,0 +1,45 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  int i = 0;
+  int j = 0;
+  i = 0;
+  j = 1;
+  while (true) {
+    int const x_28 = i;
+    int const x_29 = j;
+    if ((x_28 < clamp(x_29, 5, 9))) {
+    } else {
+      break;
+    }
+    int const x_33 = i;
+    i = (x_33 + 1);
+    int const x_35 = j;
+    j = (x_35 + 1);
+  }
+  int const x_37 = i;
+  int const x_39 = j;
+  if (((x_37 == 9) && (x_39 == 10))) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-inside-while/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-inside-while/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..99a8be5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-inside-while/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,114 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 65
+; Schema: 0
+               OpCapability Shader
+         %26 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %15 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+      %int_5 = OpConstant %int 5
+      %int_9 = OpConstant %int 9
+       %bool = OpTypeBool
+     %int_10 = OpConstant %int 10
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %51 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %52 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %53 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %15
+          %j = OpVariable %_ptr_Function_int Function %15
+               OpStore %i %int_0
+               OpStore %j %int_1
+               OpBranch %19
+         %19 = OpLabel
+               OpLoopMerge %20 %21 None
+               OpBranch %22
+         %22 = OpLabel
+         %23 = OpLoad %int %i
+         %24 = OpLoad %int %j
+         %25 = OpExtInst %int %26 SClamp %24 %int_5 %int_9
+         %29 = OpSLessThan %bool %23 %25
+               OpSelectionMerge %31 None
+               OpBranchConditional %29 %32 %33
+         %32 = OpLabel
+               OpBranch %31
+         %33 = OpLabel
+               OpBranch %20
+         %31 = OpLabel
+         %34 = OpLoad %int %i
+         %35 = OpIAdd %int %34 %int_1
+               OpStore %i %35
+         %36 = OpLoad %int %j
+         %37 = OpIAdd %int %36 %int_1
+               OpStore %j %37
+               OpBranch %21
+         %21 = OpLabel
+               OpBranch %19
+         %20 = OpLabel
+         %38 = OpLoad %int %i
+         %39 = OpLoad %int %j
+         %40 = OpIEqual %bool %38 %int_9
+               OpSelectionMerge %41 None
+               OpBranchConditional %40 %42 %41
+         %42 = OpLabel
+         %44 = OpIEqual %bool %39 %int_10
+               OpBranch %41
+         %41 = OpLabel
+         %45 = OpPhi %bool %40 %20 %44 %42
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %48
+         %47 = OpLabel
+               OpStore %x_GLF_color %51
+               OpBranch %46
+         %48 = OpLabel
+               OpStore %x_GLF_color %52
+               OpBranch %46
+         %46 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %53
+%tint_symbol = OpFunctionParameter %main_out
+         %57 = OpLabel
+         %58 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %58
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %60 = OpLabel
+         %61 = OpFunctionCall %void %main_1
+         %63 = OpLoad %v4float %x_GLF_color
+         %64 = OpCompositeConstruct %main_out %63
+         %62 = OpFunctionCall %void %tint_symbol_2 %64
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-inside-while/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-inside-while/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..367bf40
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-inside-while/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,39 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  var j : i32;
+  i = 0;
+  j = 1;
+  loop {
+    let x_28 : i32 = i;
+    let x_29 : i32 = j;
+    if ((x_28 < clamp(x_29, 5, 9))) {
+    } else {
+      break;
+    }
+    let x_33 : i32 = i;
+    i = (x_33 + 1);
+    let x_35 : i32 = j;
+    j = (x_35 + 1);
+  }
+  let x_37 : i32 = i;
+  let x_39 : i32 = j;
+  if (((x_37 == 9) && (x_39 == 10))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-min/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-min/0-opt.spvasm
new file mode 100644
index 0000000..8bcd480
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-min/0-opt.spvasm
@@ -0,0 +1,58 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %float_2 = OpConstant %float 2
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+   %float_n1 = OpConstant %float -1
+    %float_0 = OpConstant %float 0
+    %v4float = OpTypeVector %float 4
+         %18 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %bool = OpTypeBool
+     %v4bool = OpTypeVector %bool 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %22 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %7
+         %23 = OpLabel
+         %24 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %25 = OpLoad %float %24
+         %26 = OpExtInst %float %1 FClamp %float_2 %25 %float_1
+         %27 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %28 = OpLoad %float %27
+         %29 = OpExtInst %float %1 FClamp %float_n1 %float_0 %28
+         %30 = OpCompositeConstruct %v4float %26 %29 %float_0 %float_1
+         %31 = OpFOrdNotEqual %v4bool %30 %18
+         %32 = OpAny %bool %31
+               OpSelectionMerge %33 None
+               OpBranchConditional %32 %34 %35
+         %34 = OpLabel
+               OpStore %_GLF_color %22
+               OpBranch %33
+         %35 = OpLabel
+               OpStore %_GLF_color %18
+               OpBranch %33
+         %33 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-min/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-min/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..94f03e4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-min/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,29 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const float x_25 = asfloat(x_5[0].x);
+  const float x_28 = asfloat(x_5[0].x);
+  if (any((float4(clamp(2.0f, x_25, 1.0f), clamp(-1.0f, 0.0f, x_28), 0.0f, 1.0f) != float4(1.0f, 0.0f, 0.0f, 1.0f)))) {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  } else {
+    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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-min/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-min/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..53f9786
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-min/0-opt.spvasm.expected.msl
@@ -0,0 +1,32 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float zero;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  float const x_25 = x_5.zero;
+  float const x_28 = x_5.zero;
+  if (any((float4(clamp(2.0f, x_25, 1.0f), clamp(-1.0f, 0.0f, x_28), 0.0f, 1.0f) != float4(1.0f, 0.0f, 0.0f, 1.0f)))) {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  } else {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-min/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-min/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..694832d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-min/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,90 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 51
+; Schema: 0
+               OpCapability Shader
+         %25 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+    %float_2 = OpConstant %float 2
+    %float_1 = OpConstant %float 1
+   %float_n1 = OpConstant %float -1
+    %float_0 = OpConstant %float 0
+         %32 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+     %v4bool = OpTypeVector %bool 4
+         %38 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %39 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+         %18 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0
+         %19 = OpLoad %float %18
+         %20 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0
+         %21 = OpLoad %float %20
+         %24 = OpExtInst %float %25 NClamp %float_2 %19 %float_1
+         %28 = OpExtInst %float %25 NClamp %float_n1 %float_0 %21
+         %31 = OpCompositeConstruct %v4float %24 %28 %float_0 %float_1
+         %33 = OpFOrdNotEqual %v4bool %31 %32
+         %22 = OpAny %bool %33
+               OpSelectionMerge %35 None
+               OpBranchConditional %22 %36 %37
+         %36 = OpLabel
+               OpStore %x_GLF_color %38
+               OpBranch %35
+         %37 = OpLabel
+               OpStore %x_GLF_color %32
+               OpBranch %35
+         %35 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %39
+%tint_symbol = OpFunctionParameter %main_out
+         %43 = OpLabel
+         %44 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %44
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %46 = OpLabel
+         %47 = OpFunctionCall %void %main_1
+         %49 = OpLoad %v4float %x_GLF_color
+         %50 = OpCompositeConstruct %main_out %49
+         %48 = OpFunctionCall %void %tint_symbol_2 %50
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-min/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-min/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..ad25a06
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-min/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,30 @@
+[[block]]
+struct buf0 {
+  zero : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_25 : f32 = x_5.zero;
+  let x_28 : f32 = x_5.zero;
+  if (any((vec4<f32>(clamp(2.0, x_25, 1.0), clamp(-1.0, 0.0, x_28), 0.0, 1.0) != vec4<f32>(1.0, 0.0, 0.0, 1.0)))) {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-min/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-min/0-opt.wgsl
new file mode 100644
index 0000000..ad25a06
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-min/0-opt.wgsl
@@ -0,0 +1,30 @@
+[[block]]
+struct buf0 {
+  zero : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_25 : f32 = x_5.zero;
+  let x_28 : f32 = x_5.zero;
+  if (any((vec4<f32>(clamp(2.0, x_25, 1.0), clamp(-1.0, 0.0, x_28), 0.0, 1.0) != vec4<f32>(1.0, 0.0, 0.0, 1.0)))) {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-min/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-min/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..94f03e4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-min/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,29 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const float x_25 = asfloat(x_5[0].x);
+  const float x_28 = asfloat(x_5[0].x);
+  if (any((float4(clamp(2.0f, x_25, 1.0f), clamp(-1.0f, 0.0f, x_28), 0.0f, 1.0f) != float4(1.0f, 0.0f, 0.0f, 1.0f)))) {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  } else {
+    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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-min/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-min/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..53f9786
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-min/0-opt.wgsl.expected.msl
@@ -0,0 +1,32 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float zero;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  float const x_25 = x_5.zero;
+  float const x_28 = x_5.zero;
+  if (any((float4(clamp(2.0f, x_25, 1.0f), clamp(-1.0f, 0.0f, x_28), 0.0f, 1.0f) != float4(1.0f, 0.0f, 0.0f, 1.0f)))) {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  } else {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-min/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-min/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..694832d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-min/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,90 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 51
+; Schema: 0
+               OpCapability Shader
+         %25 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+    %float_2 = OpConstant %float 2
+    %float_1 = OpConstant %float 1
+   %float_n1 = OpConstant %float -1
+    %float_0 = OpConstant %float 0
+         %32 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+     %v4bool = OpTypeVector %bool 4
+         %38 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %39 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+         %18 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0
+         %19 = OpLoad %float %18
+         %20 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0
+         %21 = OpLoad %float %20
+         %24 = OpExtInst %float %25 NClamp %float_2 %19 %float_1
+         %28 = OpExtInst %float %25 NClamp %float_n1 %float_0 %21
+         %31 = OpCompositeConstruct %v4float %24 %28 %float_0 %float_1
+         %33 = OpFOrdNotEqual %v4bool %31 %32
+         %22 = OpAny %bool %33
+               OpSelectionMerge %35 None
+               OpBranchConditional %22 %36 %37
+         %36 = OpLabel
+               OpStore %x_GLF_color %38
+               OpBranch %35
+         %37 = OpLabel
+               OpStore %x_GLF_color %32
+               OpBranch %35
+         %35 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %39
+%tint_symbol = OpFunctionParameter %main_out
+         %43 = OpLabel
+         %44 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %44
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %46 = OpLabel
+         %47 = OpFunctionCall %void %main_1
+         %49 = OpLoad %v4float %x_GLF_color
+         %50 = OpCompositeConstruct %main_out %49
+         %48 = OpFunctionCall %void %tint_symbol_2 %50
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-min/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-min/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..ad25a06
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-min/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,30 @@
+[[block]]
+struct buf0 {
+  zero : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_25 : f32 = x_5.zero;
+  let x_28 : f32 = x_5.zero;
+  if (any((vec4<f32>(clamp(2.0, x_25, 1.0), clamp(-1.0, 0.0, x_28), 0.0, 1.0) != vec4<f32>(1.0, 0.0, 0.0, 1.0)))) {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-vs-original/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-vs-original/0-opt.spvasm
new file mode 100644
index 0000000..148690a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-vs-original/0-opt.spvasm
@@ -0,0 +1,59 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpName %f "f"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %_ ""
+               OpDecorate %_GLF_color Location 0
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %13 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+%_ptr_Function_float = OpTypePointer Function %float
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+       %bool = OpTypeBool
+       %main = OpFunction %void None %8
+         %21 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function
+               OpStore %_GLF_color %13
+         %22 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %23 = OpLoad %float %22
+         %24 = OpExtInst %float %1 FClamp %23 %float_1 %float_1
+               OpStore %f %24
+         %25 = OpLoad %float %f
+         %26 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %27 = OpLoad %float %26
+         %28 = OpFOrdGreaterThan %bool %25 %27
+               OpSelectionMerge %29 None
+               OpBranchConditional %28 %30 %31
+         %30 = OpLabel
+               OpStore %_GLF_color %13
+               OpBranch %29
+         %31 = OpLabel
+         %32 = OpLoad %float %f
+         %33 = OpCompositeConstruct %v4float %32 %float_0 %float_0 %float_1
+               OpStore %_GLF_color %33
+               OpBranch %29
+         %29 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-vs-original/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-vs-original/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..e17c5d1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-vs-original/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,33 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+
+void main_1() {
+  float f = 0.0f;
+  x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  const float x_23 = asfloat(x_6[0].x);
+  f = clamp(x_23, 1.0f, 1.0f);
+  const float x_25 = f;
+  const float x_27 = asfloat(x_6[0].x);
+  if ((x_25 > x_27)) {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  } else {
+    x_GLF_color = float4(f, 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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-vs-original/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-vs-original/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..8239923
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-vs-original/0-opt.spvasm.expected.msl
@@ -0,0 +1,37 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float f = 0.0f;
+  *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float const x_23 = x_6.one;
+  f = clamp(x_23, 1.0f, 1.0f);
+  float const x_25 = f;
+  float const x_27 = x_6.one;
+  if ((x_25 > x_27)) {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  } else {
+    float const x_32 = f;
+    *(tint_symbol_4) = float4(x_32, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-vs-original/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-vs-original/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..fa00ca6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-vs-original/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,92 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 50
+; Schema: 0
+               OpCapability Shader
+         %26 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_6 "x_6"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %17 = OpConstantNull %float
+    %float_0 = OpConstant %float 0
+         %19 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %v4float
+         %38 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %17
+               OpStore %x_GLF_color %19
+         %23 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0
+         %24 = OpLoad %float %23
+         %25 = OpExtInst %float %26 NClamp %24 %float_1 %float_1
+               OpStore %f %25
+         %28 = OpLoad %float %f
+         %29 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0
+         %30 = OpLoad %float %29
+         %31 = OpFOrdGreaterThan %bool %28 %30
+               OpSelectionMerge %33 None
+               OpBranchConditional %31 %34 %35
+         %34 = OpLabel
+               OpStore %x_GLF_color %19
+               OpBranch %33
+         %35 = OpLabel
+         %36 = OpLoad %float %f
+         %37 = OpCompositeConstruct %v4float %36 %float_0 %float_0 %float_1
+               OpStore %x_GLF_color %37
+               OpBranch %33
+         %33 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %38
+%tint_symbol = OpFunctionParameter %main_out
+         %42 = OpLabel
+         %43 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %43
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %45 = OpLabel
+         %46 = OpFunctionCall %void %main_1
+         %48 = OpLoad %v4float %x_GLF_color
+         %49 = OpCompositeConstruct %main_out %48
+         %47 = OpFunctionCall %void %tint_symbol_2 %49
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-vs-original/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-vs-original/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..5b41038
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-vs-original/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,35 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+fn main_1() {
+  var f : f32;
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  let x_23 : f32 = x_6.one;
+  f = clamp(x_23, 1.0, 1.0);
+  let x_25 : f32 = f;
+  let x_27 : f32 = x_6.one;
+  if ((x_25 > x_27)) {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  } else {
+    let x_32 : f32 = f;
+    x_GLF_color = vec4<f32>(x_32, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-vs-original/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-vs-original/0-opt.wgsl
new file mode 100644
index 0000000..5b41038
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-vs-original/0-opt.wgsl
@@ -0,0 +1,35 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+fn main_1() {
+  var f : f32;
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  let x_23 : f32 = x_6.one;
+  f = clamp(x_23, 1.0, 1.0);
+  let x_25 : f32 = f;
+  let x_27 : f32 = x_6.one;
+  if ((x_25 > x_27)) {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  } else {
+    let x_32 : f32 = f;
+    x_GLF_color = vec4<f32>(x_32, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-vs-original/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-vs-original/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..e17c5d1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-vs-original/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,33 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+
+void main_1() {
+  float f = 0.0f;
+  x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  const float x_23 = asfloat(x_6[0].x);
+  f = clamp(x_23, 1.0f, 1.0f);
+  const float x_25 = f;
+  const float x_27 = asfloat(x_6[0].x);
+  if ((x_25 > x_27)) {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  } else {
+    x_GLF_color = float4(f, 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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-vs-original/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-vs-original/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..8239923
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-vs-original/0-opt.wgsl.expected.msl
@@ -0,0 +1,37 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float f = 0.0f;
+  *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float const x_23 = x_6.one;
+  f = clamp(x_23, 1.0f, 1.0f);
+  float const x_25 = f;
+  float const x_27 = x_6.one;
+  if ((x_25 > x_27)) {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  } else {
+    float const x_32 = f;
+    *(tint_symbol_4) = float4(x_32, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-vs-original/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-vs-original/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..fa00ca6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-vs-original/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,92 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 50
+; Schema: 0
+               OpCapability Shader
+         %26 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_6 "x_6"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %17 = OpConstantNull %float
+    %float_0 = OpConstant %float 0
+         %19 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %v4float
+         %38 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %17
+               OpStore %x_GLF_color %19
+         %23 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0
+         %24 = OpLoad %float %23
+         %25 = OpExtInst %float %26 NClamp %24 %float_1 %float_1
+               OpStore %f %25
+         %28 = OpLoad %float %f
+         %29 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0
+         %30 = OpLoad %float %29
+         %31 = OpFOrdGreaterThan %bool %28 %30
+               OpSelectionMerge %33 None
+               OpBranchConditional %31 %34 %35
+         %34 = OpLabel
+               OpStore %x_GLF_color %19
+               OpBranch %33
+         %35 = OpLabel
+         %36 = OpLoad %float %f
+         %37 = OpCompositeConstruct %v4float %36 %float_0 %float_0 %float_1
+               OpStore %x_GLF_color %37
+               OpBranch %33
+         %33 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %38
+%tint_symbol = OpFunctionParameter %main_out
+         %42 = OpLabel
+         %43 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %43
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %45 = OpLabel
+         %46 = OpFunctionCall %void %main_1
+         %48 = OpLoad %v4float %x_GLF_color
+         %49 = OpCompositeConstruct %main_out %48
+         %47 = OpFunctionCall %void %tint_symbol_2 %49
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-vs-original/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-vs-original/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..5b41038
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-vs-original/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,35 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+fn main_1() {
+  var f : f32;
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  let x_23 : f32 = x_6.one;
+  f = clamp(x_23, 1.0, 1.0);
+  let x_25 : f32 = f;
+  let x_27 : f32 = x_6.one;
+  if ((x_25 > x_27)) {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  } else {
+    let x_32 : f32 = f;
+    x_GLF_color = vec4<f32>(x_32, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp/0-opt.spvasm
new file mode 100644
index 0000000..35ba5e2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp/0-opt.spvasm
@@ -0,0 +1,66 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "fourtytwo"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+    %float_1 = OpConstant %float 1
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+   %float_42 = OpConstant %float 42
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %19 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+         %20 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %7
+         %21 = OpLabel
+         %22 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %23 = OpLoad %float %22
+         %24 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %25 = OpLoad %float %24
+         %26 = OpExtInst %float %1 FClamp %float_1 %23 %25
+         %27 = OpFOrdGreaterThan %bool %26 %float_42
+         %28 = OpLogicalNot %bool %27
+               OpSelectionMerge %29 None
+               OpBranchConditional %28 %30 %29
+         %30 = OpLabel
+         %31 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %32 = OpLoad %float %31
+         %33 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %34 = OpLoad %float %33
+         %35 = OpExtInst %float %1 FClamp %float_1 %32 %34
+         %36 = OpFOrdLessThan %bool %35 %float_42
+               OpBranch %29
+         %29 = OpLabel
+         %37 = OpPhi %bool %27 %21 %36 %30
+               OpSelectionMerge %38 None
+               OpBranchConditional %37 %39 %40
+         %39 = OpLabel
+               OpStore %_GLF_color %19
+               OpBranch %38
+         %40 = OpLabel
+               OpStore %_GLF_color %20
+               OpBranch %38
+         %38 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..88c1339
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,39 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  bool x_36 = false;
+  bool x_37_phi = false;
+  const float x_23 = asfloat(x_5[0].x);
+  const float x_25 = asfloat(x_5[0].x);
+  const bool x_27 = (clamp(1.0f, x_23, x_25) > 42.0f);
+  x_37_phi = x_27;
+  if (!(x_27)) {
+    const float x_32 = asfloat(x_5[0].x);
+    const float x_34 = asfloat(x_5[0].x);
+    x_36 = (clamp(1.0f, x_32, x_34) < 42.0f);
+    x_37_phi = x_36;
+  }
+  if (x_37_phi) {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  } else {
+    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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..d8002a7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp/0-opt.spvasm.expected.msl
@@ -0,0 +1,43 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float fourtytwo;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  bool x_36 = false;
+  bool x_37_phi = false;
+  float const x_23 = x_5.fourtytwo;
+  float const x_25 = x_5.fourtytwo;
+  bool const x_27 = (clamp(1.0f, x_23, x_25) > 42.0f);
+  x_37_phi = x_27;
+  if (!(x_27)) {
+    float const x_32 = x_5.fourtytwo;
+    float const x_34 = x_5.fourtytwo;
+    x_36 = (clamp(1.0f, x_32, x_34) < 42.0f);
+    x_37_phi = x_36;
+  }
+  bool const x_37 = x_37_phi;
+  if (x_37) {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  } else {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..b6f79eb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,108 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 61
+; Schema: 0
+               OpCapability Shader
+         %28 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "fourtytwo"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_36 "x_36"
+               OpName %x_37_phi "x_37_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %18 = OpConstantNull %bool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+   %float_42 = OpConstant %float 42
+    %float_0 = OpConstant %float 0
+         %47 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+         %48 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %49 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+       %x_36 = OpVariable %_ptr_Function_bool Function %18
+   %x_37_phi = OpVariable %_ptr_Function_bool Function %18
+         %23 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0
+         %24 = OpLoad %float %23
+         %25 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0
+         %26 = OpLoad %float %25
+         %27 = OpExtInst %float %28 NClamp %float_1 %24 %26
+         %31 = OpFOrdGreaterThan %bool %27 %float_42
+               OpStore %x_37_phi %31
+         %32 = OpLogicalNot %bool %31
+               OpSelectionMerge %33 None
+               OpBranchConditional %32 %34 %33
+         %34 = OpLabel
+         %35 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0
+         %36 = OpLoad %float %35
+         %37 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0
+         %38 = OpLoad %float %37
+         %39 = OpExtInst %float %28 NClamp %float_1 %36 %38
+         %40 = OpFOrdLessThan %bool %39 %float_42
+               OpStore %x_36 %40
+         %41 = OpLoad %bool %x_36
+               OpStore %x_37_phi %41
+               OpBranch %33
+         %33 = OpLabel
+         %42 = OpLoad %bool %x_37_phi
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %45
+         %44 = OpLabel
+               OpStore %x_GLF_color %47
+               OpBranch %43
+         %45 = OpLabel
+               OpStore %x_GLF_color %48
+               OpBranch %43
+         %43 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %49
+%tint_symbol = OpFunctionParameter %main_out
+         %53 = OpLabel
+         %54 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %54
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %56 = OpLabel
+         %57 = OpFunctionCall %void %main_1
+         %59 = OpLoad %v4float %x_GLF_color
+         %60 = OpCompositeConstruct %main_out %59
+         %58 = OpFunctionCall %void %tint_symbol_2 %60
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..4969baa
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,41 @@
+[[block]]
+struct buf0 {
+  fourtytwo : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_36 : bool;
+  var x_37_phi : bool;
+  let x_23 : f32 = x_5.fourtytwo;
+  let x_25 : f32 = x_5.fourtytwo;
+  let x_27 : bool = (clamp(1.0, x_23, x_25) > 42.0);
+  x_37_phi = x_27;
+  if (!(x_27)) {
+    let x_32 : f32 = x_5.fourtytwo;
+    let x_34 : f32 = x_5.fourtytwo;
+    x_36 = (clamp(1.0, x_32, x_34) < 42.0);
+    x_37_phi = x_36;
+  }
+  let x_37 : bool = x_37_phi;
+  if (x_37) {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp/0-opt.wgsl
new file mode 100644
index 0000000..4969baa
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp/0-opt.wgsl
@@ -0,0 +1,41 @@
+[[block]]
+struct buf0 {
+  fourtytwo : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_36 : bool;
+  var x_37_phi : bool;
+  let x_23 : f32 = x_5.fourtytwo;
+  let x_25 : f32 = x_5.fourtytwo;
+  let x_27 : bool = (clamp(1.0, x_23, x_25) > 42.0);
+  x_37_phi = x_27;
+  if (!(x_27)) {
+    let x_32 : f32 = x_5.fourtytwo;
+    let x_34 : f32 = x_5.fourtytwo;
+    x_36 = (clamp(1.0, x_32, x_34) < 42.0);
+    x_37_phi = x_36;
+  }
+  let x_37 : bool = x_37_phi;
+  if (x_37) {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..88c1339
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,39 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  bool x_36 = false;
+  bool x_37_phi = false;
+  const float x_23 = asfloat(x_5[0].x);
+  const float x_25 = asfloat(x_5[0].x);
+  const bool x_27 = (clamp(1.0f, x_23, x_25) > 42.0f);
+  x_37_phi = x_27;
+  if (!(x_27)) {
+    const float x_32 = asfloat(x_5[0].x);
+    const float x_34 = asfloat(x_5[0].x);
+    x_36 = (clamp(1.0f, x_32, x_34) < 42.0f);
+    x_37_phi = x_36;
+  }
+  if (x_37_phi) {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  } else {
+    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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..d8002a7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp/0-opt.wgsl.expected.msl
@@ -0,0 +1,43 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float fourtytwo;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  bool x_36 = false;
+  bool x_37_phi = false;
+  float const x_23 = x_5.fourtytwo;
+  float const x_25 = x_5.fourtytwo;
+  bool const x_27 = (clamp(1.0f, x_23, x_25) > 42.0f);
+  x_37_phi = x_27;
+  if (!(x_27)) {
+    float const x_32 = x_5.fourtytwo;
+    float const x_34 = x_5.fourtytwo;
+    x_36 = (clamp(1.0f, x_32, x_34) < 42.0f);
+    x_37_phi = x_36;
+  }
+  bool const x_37 = x_37_phi;
+  if (x_37) {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  } else {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..b6f79eb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,108 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 61
+; Schema: 0
+               OpCapability Shader
+         %28 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "fourtytwo"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_36 "x_36"
+               OpName %x_37_phi "x_37_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %18 = OpConstantNull %bool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+   %float_42 = OpConstant %float 42
+    %float_0 = OpConstant %float 0
+         %47 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+         %48 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %49 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+       %x_36 = OpVariable %_ptr_Function_bool Function %18
+   %x_37_phi = OpVariable %_ptr_Function_bool Function %18
+         %23 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0
+         %24 = OpLoad %float %23
+         %25 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0
+         %26 = OpLoad %float %25
+         %27 = OpExtInst %float %28 NClamp %float_1 %24 %26
+         %31 = OpFOrdGreaterThan %bool %27 %float_42
+               OpStore %x_37_phi %31
+         %32 = OpLogicalNot %bool %31
+               OpSelectionMerge %33 None
+               OpBranchConditional %32 %34 %33
+         %34 = OpLabel
+         %35 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0
+         %36 = OpLoad %float %35
+         %37 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0
+         %38 = OpLoad %float %37
+         %39 = OpExtInst %float %28 NClamp %float_1 %36 %38
+         %40 = OpFOrdLessThan %bool %39 %float_42
+               OpStore %x_36 %40
+         %41 = OpLoad %bool %x_36
+               OpStore %x_37_phi %41
+               OpBranch %33
+         %33 = OpLabel
+         %42 = OpLoad %bool %x_37_phi
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %45
+         %44 = OpLabel
+               OpStore %x_GLF_color %47
+               OpBranch %43
+         %45 = OpLabel
+               OpStore %x_GLF_color %48
+               OpBranch %43
+         %43 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %49
+%tint_symbol = OpFunctionParameter %main_out
+         %53 = OpLabel
+         %54 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %54
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %56 = OpLabel
+         %57 = OpFunctionCall %void %main_1
+         %59 = OpLoad %v4float %x_GLF_color
+         %60 = OpCompositeConstruct %main_out %59
+         %58 = OpFunctionCall %void %tint_symbol_2 %60
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..4969baa
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,41 @@
+[[block]]
+struct buf0 {
+  fourtytwo : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_36 : bool;
+  var x_37_phi : bool;
+  let x_23 : f32 = x_5.fourtytwo;
+  let x_25 : f32 = x_5.fourtytwo;
+  let x_27 : bool = (clamp(1.0, x_23, x_25) > 42.0);
+  x_37_phi = x_27;
+  if (!(x_27)) {
+    let x_32 : f32 = x_5.fourtytwo;
+    let x_34 : f32 = x_5.fourtytwo;
+    x_36 = (clamp(1.0, x_32, x_34) < 42.0);
+    x_37_phi = x_36;
+  }
+  let x_37 : bool = x_37_phi;
+  if (x_37) {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-dot-condition-true/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-dot-condition-true/0-opt.spvasm
new file mode 100644
index 0000000..00630f9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-dot-condition-true/0-opt.spvasm
@@ -0,0 +1,46 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %one "one"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %6 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_1 = OpConstant %float 1
+    %v2float = OpTypeVector %float 2
+    %float_2 = OpConstant %float 2
+         %12 = OpConstantComposite %v2float %float_2 %float_1
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+    %float_0 = OpConstant %float 0
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %18 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+         %19 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %6
+         %20 = OpLabel
+        %one = OpVariable %_ptr_Function_float Function
+               OpStore %one %float_1
+         %21 = OpLoad %float %one
+         %22 = OpSelect %float %true %float_0 %21
+         %23 = OpCompositeConstruct %v2float %float_1 %22
+         %24 = OpDot %float %12 %23
+         %25 = OpFOrdNotEqual %bool %24 %float_2
+               OpSelectionMerge %26 None
+               OpBranchConditional %25 %27 %28
+         %27 = OpLabel
+               OpStore %_GLF_color %18
+               OpBranch %26
+         %28 = OpLabel
+               OpStore %_GLF_color %19
+               OpBranch %26
+         %26 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-dot-condition-true/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-dot-condition-true/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..5c12f10
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-dot-condition-true/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,26 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float one = 0.0f;
+  one = 1.0f;
+  if ((dot(float2(2.0f, 1.0f), float2(1.0f, (true ? 0.0f : one))) != 2.0f)) {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  } else {
+    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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-dot-condition-true/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-dot-condition-true/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..a096be9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-dot-condition-true/0-opt.spvasm.expected.msl
@@ -0,0 +1,30 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  float one = 0.0f;
+  one = 1.0f;
+  float const x_21 = one;
+  if ((dot(float2(2.0f, 1.0f), float2(1.0f, select(x_21, 0.0f, true))) != 2.0f)) {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  } else {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-dot-condition-true/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-dot-condition-true/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..0e37e00
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-dot-condition-true/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,77 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 44
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %one "one"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %14 = OpConstantNull %float
+    %float_1 = OpConstant %float 1
+    %v2float = OpTypeVector %float 2
+    %float_2 = OpConstant %float 2
+         %20 = OpConstantComposite %v2float %float_2 %float_1
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+    %float_0 = OpConstant %float 0
+         %30 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+         %31 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %32 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+        %one = OpVariable %_ptr_Function_float Function %14
+               OpStore %one %float_1
+         %16 = OpLoad %float %one
+         %21 = OpSelect %float %true %float_0 %16
+         %25 = OpCompositeConstruct %v2float %float_1 %21
+         %17 = OpDot %float %20 %25
+         %26 = OpFOrdNotEqual %bool %17 %float_2
+               OpSelectionMerge %27 None
+               OpBranchConditional %26 %28 %29
+         %28 = OpLabel
+               OpStore %x_GLF_color %30
+               OpBranch %27
+         %29 = OpLabel
+               OpStore %x_GLF_color %31
+               OpBranch %27
+         %27 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %32
+%tint_symbol = OpFunctionParameter %main_out
+         %36 = OpLabel
+         %37 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %37
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %39 = OpLabel
+         %40 = OpFunctionCall %void %main_1
+         %42 = OpLoad %v4float %x_GLF_color
+         %43 = OpCompositeConstruct %main_out %42
+         %41 = OpFunctionCall %void %tint_symbol_2 %43
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-dot-condition-true/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-dot-condition-true/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..2617e9c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-dot-condition-true/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,24 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var one : f32;
+  one = 1.0;
+  let x_21 : f32 = one;
+  if ((dot(vec2<f32>(2.0, 1.0), vec2<f32>(1.0, select(x_21, 0.0, true))) != 2.0)) {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-dot-condition-true/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-dot-condition-true/0-opt.wgsl
new file mode 100644
index 0000000..2617e9c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-dot-condition-true/0-opt.wgsl
@@ -0,0 +1,24 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var one : f32;
+  one = 1.0;
+  let x_21 : f32 = one;
+  if ((dot(vec2<f32>(2.0, 1.0), vec2<f32>(1.0, select(x_21, 0.0, true))) != 2.0)) {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-dot-condition-true/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-dot-condition-true/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..5c12f10
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-dot-condition-true/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,26 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float one = 0.0f;
+  one = 1.0f;
+  if ((dot(float2(2.0f, 1.0f), float2(1.0f, (true ? 0.0f : one))) != 2.0f)) {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  } else {
+    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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-dot-condition-true/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-dot-condition-true/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..a096be9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-dot-condition-true/0-opt.wgsl.expected.msl
@@ -0,0 +1,30 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  float one = 0.0f;
+  one = 1.0f;
+  float const x_21 = one;
+  if ((dot(float2(2.0f, 1.0f), float2(1.0f, select(x_21, 0.0f, true))) != 2.0f)) {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  } else {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-dot-condition-true/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-dot-condition-true/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..0e37e00
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-dot-condition-true/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,77 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 44
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %one "one"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %14 = OpConstantNull %float
+    %float_1 = OpConstant %float 1
+    %v2float = OpTypeVector %float 2
+    %float_2 = OpConstant %float 2
+         %20 = OpConstantComposite %v2float %float_2 %float_1
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+    %float_0 = OpConstant %float 0
+         %30 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+         %31 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %32 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+        %one = OpVariable %_ptr_Function_float Function %14
+               OpStore %one %float_1
+         %16 = OpLoad %float %one
+         %21 = OpSelect %float %true %float_0 %16
+         %25 = OpCompositeConstruct %v2float %float_1 %21
+         %17 = OpDot %float %20 %25
+         %26 = OpFOrdNotEqual %bool %17 %float_2
+               OpSelectionMerge %27 None
+               OpBranchConditional %26 %28 %29
+         %28 = OpLabel
+               OpStore %x_GLF_color %30
+               OpBranch %27
+         %29 = OpLabel
+               OpStore %x_GLF_color %31
+               OpBranch %27
+         %27 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %32
+%tint_symbol = OpFunctionParameter %main_out
+         %36 = OpLabel
+         %37 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %37
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %39 = OpLabel
+         %40 = OpFunctionCall %void %main_1
+         %42 = OpLoad %v4float %x_GLF_color
+         %43 = OpCompositeConstruct %main_out %42
+         %41 = OpFunctionCall %void %tint_symbol_2 %43
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-dot-condition-true/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-dot-condition-true/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..2617e9c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-dot-condition-true/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,24 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var one : f32;
+  one = 1.0;
+  let x_21 : f32 = one;
+  if ((dot(vec2<f32>(2.0, 1.0), vec2<f32>(1.0, select(x_21, 0.0, true))) != 2.0)) {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-gte-const-first/0.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-gte-const-first/0.spvasm
new file mode 100644
index 0000000..82fac22
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-gte-const-first/0.spvasm
@@ -0,0 +1,62 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %float_3 = OpConstant %float 3
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %25 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %26 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %8
+         %27 = OpLabel
+         %28 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %29 = OpLoad %float %28
+         %30 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %31 = OpLoad %float %30
+         %32 = OpFAdd %float %float_2 %31
+         %33 = OpExtInst %float %1 FClamp %29 %float_1 %32
+         %34 = OpFOrdGreaterThanEqual %bool %float_3 %33
+               OpSelectionMerge %35 None
+               OpBranchConditional %34 %36 %37
+         %36 = OpLabel
+               OpStore %_GLF_color %25
+               OpBranch %35
+         %37 = OpLabel
+               OpStore %_GLF_color %26
+               OpBranch %35
+         %35 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-gte-const-first/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-gte-const-first/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..1ca0a69
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-gte-const-first/0.spvasm.expected.hlsl
@@ -0,0 +1,35 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const float x_29 = gl_FragCoord.x;
+  const float x_31 = asfloat(x_6[0].x);
+  if ((3.0f >= clamp(x_29, 1.0f, (2.0f + x_31)))) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-gte-const-first/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-gte-const-first/0.spvasm.expected.msl
new file mode 100644
index 0000000..6dd8555
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-gte-const-first/0.spvasm.expected.msl
@@ -0,0 +1,34 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float const x_29 = (*(tint_symbol_5)).x;
+  float const x_31 = x_6.one;
+  if ((3.0f >= clamp(x_29, 1.0f, (2.0f + x_31)))) {
+    *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_6) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-gte-const-first/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-gte-const-first/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..b16c6e2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-gte-const-first/0.spvasm.expected.spvasm
@@ -0,0 +1,96 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 53
+; Schema: 0
+               OpCapability Shader
+         %28 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_3 = OpConstant %float 3
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+         %38 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %39 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %40 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+         %21 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %22 = OpLoad %float %21
+         %24 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0
+         %25 = OpLoad %float %24
+         %31 = OpFAdd %float %float_2 %25
+         %27 = OpExtInst %float %28 NClamp %22 %float_1 %31
+         %32 = OpFOrdGreaterThanEqual %bool %float_3 %27
+               OpSelectionMerge %34 None
+               OpBranchConditional %32 %35 %36
+         %35 = OpLabel
+               OpStore %x_GLF_color %38
+               OpBranch %34
+         %36 = OpLabel
+               OpStore %x_GLF_color %39
+               OpBranch %34
+         %34 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %40
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %44 = OpLabel
+         %45 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %45
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %47 = OpLabel
+         %48 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %48
+         %49 = OpFunctionCall %void %main_1
+         %51 = OpLoad %v4float %x_GLF_color
+         %52 = OpCompositeConstruct %main_out %51
+         %50 = OpFunctionCall %void %tint_symbol_3 %52
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-gte-const-first/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-gte-const-first/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..12d7ca4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-gte-const-first/0.spvasm.expected.wgsl
@@ -0,0 +1,33 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_29 : f32 = gl_FragCoord.x;
+  let x_31 : f32 = x_6.one;
+  if ((3.0 >= clamp(x_29, 1.0, (2.0 + x_31)))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-gte-const-first/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-gte-const-first/0.wgsl
new file mode 100644
index 0000000..12d7ca4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-gte-const-first/0.wgsl
@@ -0,0 +1,33 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_29 : f32 = gl_FragCoord.x;
+  let x_31 : f32 = x_6.one;
+  if ((3.0 >= clamp(x_29, 1.0, (2.0 + x_31)))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-gte-const-first/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-gte-const-first/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..1ca0a69
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-gte-const-first/0.wgsl.expected.hlsl
@@ -0,0 +1,35 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const float x_29 = gl_FragCoord.x;
+  const float x_31 = asfloat(x_6[0].x);
+  if ((3.0f >= clamp(x_29, 1.0f, (2.0f + x_31)))) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-gte-const-first/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-gte-const-first/0.wgsl.expected.msl
new file mode 100644
index 0000000..6dd8555
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-gte-const-first/0.wgsl.expected.msl
@@ -0,0 +1,34 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float const x_29 = (*(tint_symbol_5)).x;
+  float const x_31 = x_6.one;
+  if ((3.0f >= clamp(x_29, 1.0f, (2.0f + x_31)))) {
+    *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_6) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-gte-const-first/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-gte-const-first/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..b16c6e2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-gte-const-first/0.wgsl.expected.spvasm
@@ -0,0 +1,96 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 53
+; Schema: 0
+               OpCapability Shader
+         %28 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_3 = OpConstant %float 3
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+         %38 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %39 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %40 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+         %21 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %22 = OpLoad %float %21
+         %24 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0
+         %25 = OpLoad %float %24
+         %31 = OpFAdd %float %float_2 %25
+         %27 = OpExtInst %float %28 NClamp %22 %float_1 %31
+         %32 = OpFOrdGreaterThanEqual %bool %float_3 %27
+               OpSelectionMerge %34 None
+               OpBranchConditional %32 %35 %36
+         %35 = OpLabel
+               OpStore %x_GLF_color %38
+               OpBranch %34
+         %36 = OpLabel
+               OpStore %x_GLF_color %39
+               OpBranch %34
+         %34 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %40
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %44 = OpLabel
+         %45 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %45
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %47 = OpLabel
+         %48 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %48
+         %49 = OpFunctionCall %void %main_1
+         %51 = OpLoad %v4float %x_GLF_color
+         %52 = OpCompositeConstruct %main_out %51
+         %50 = OpFunctionCall %void %tint_symbol_3 %52
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-gte-const-first/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-gte-const-first/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..12d7ca4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-gte-const-first/0.wgsl.expected.wgsl
@@ -0,0 +1,33 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_29 : f32 = gl_FragCoord.x;
+  let x_31 : f32 = x_6.one;
+  if ((3.0 >= clamp(x_29, 1.0, (2.0 + x_31)))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-min-as-loop-range/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-min-as-loop-range/0-opt.spvasm
new file mode 100644
index 0000000..a02f599
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-min-as-loop-range/0-opt.spvasm
@@ -0,0 +1,133 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %highSigned "highSigned"
+               OpName %highUnsigned "highUnsigned"
+               OpName %i "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %_ ""
+               OpName %data "data"
+               OpName %i_0 "i"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+       %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+     %uint_2 = OpConstant %uint 2
+      %int_0 = OpConstant %int 0
+     %int_10 = OpConstant %int 10
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+%_ptr_Function__arr_int_uint_2 = OpTypePointer Function %_arr_int_uint_2
+      %int_5 = OpConstant %int 5
+     %uint_1 = OpConstant %uint 1
+    %uint_10 = OpConstant %uint 10
+      %int_6 = OpConstant %int 6
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %35 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %36 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %12
+         %37 = OpLabel
+ %highSigned = OpVariable %_ptr_Function_int Function
+%highUnsigned = OpVariable %_ptr_Function_uint Function
+          %i = OpVariable %_ptr_Function_int Function
+       %data = OpVariable %_ptr_Function__arr_int_uint_2 Function
+        %i_0 = OpVariable %_ptr_Function_uint Function
+               OpStore %highSigned %int_1
+               OpStore %highUnsigned %uint_2
+               OpStore %i %int_0
+               OpBranch %38
+         %38 = OpLabel
+               OpLoopMerge %39 %40 None
+               OpBranch %41
+         %41 = OpLabel
+         %42 = OpLoad %int %i
+         %43 = OpLoad %int %highSigned
+         %44 = OpExtInst %int %1 SMin %int_10 %43
+         %45 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %46 = OpLoad %int %45
+         %47 = OpIAdd %int %44 %46
+         %48 = OpSLessThan %bool %42 %47
+               OpBranchConditional %48 %49 %39
+         %49 = OpLabel
+         %50 = OpLoad %int %i
+         %51 = OpAccessChain %_ptr_Function_int %data %50
+               OpStore %51 %int_5
+               OpBranch %40
+         %40 = OpLabel
+         %52 = OpLoad %int %i
+         %53 = OpIAdd %int %52 %int_1
+               OpStore %i %53
+               OpBranch %38
+         %39 = OpLabel
+               OpStore %i_0 %uint_1
+               OpBranch %54
+         %54 = OpLabel
+               OpLoopMerge %55 %56 None
+               OpBranch %57
+         %57 = OpLabel
+         %58 = OpLoad %uint %i_0
+         %59 = OpLoad %uint %highUnsigned
+         %60 = OpExtInst %uint %1 UMin %uint_10 %59
+         %61 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %62 = OpLoad %int %61
+         %63 = OpBitcast %uint %62
+         %64 = OpIAdd %uint %60 %63
+         %65 = OpULessThan %bool %58 %64
+               OpBranchConditional %65 %66 %55
+         %66 = OpLabel
+         %67 = OpLoad %uint %i_0
+         %68 = OpAccessChain %_ptr_Function_int %data %67
+               OpStore %68 %int_6
+               OpBranch %56
+         %56 = OpLabel
+         %69 = OpLoad %uint %i_0
+         %70 = OpIAdd %uint %69 %int_1
+               OpStore %i_0 %70
+               OpBranch %54
+         %55 = OpLabel
+         %71 = OpAccessChain %_ptr_Function_int %data %int_0
+         %72 = OpLoad %int %71
+         %73 = OpIEqual %bool %72 %int_5
+               OpSelectionMerge %74 None
+               OpBranchConditional %73 %75 %74
+         %75 = OpLabel
+         %76 = OpAccessChain %_ptr_Function_int %data %int_1
+         %77 = OpLoad %int %76
+         %78 = OpIEqual %bool %77 %int_6
+               OpBranch %74
+         %74 = OpLabel
+         %79 = OpPhi %bool %73 %55 %78 %75
+               OpSelectionMerge %80 None
+               OpBranchConditional %79 %81 %82
+         %81 = OpLabel
+               OpStore %_GLF_color %35
+               OpBranch %80
+         %82 = OpLabel
+               OpStore %_GLF_color %36
+               OpBranch %80
+         %80 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-min-as-loop-range/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-min-as-loop-range/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..fa2f460
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-min-as-loop-range/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,72 @@
+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);
+
+void main_1() {
+  int highSigned = 0;
+  uint highUnsigned = 0u;
+  int i = 0;
+  int data[2] = (int[2])0;
+  uint i_1 = 0u;
+  bool x_78 = false;
+  bool x_79_phi = false;
+  highSigned = 1;
+  highUnsigned = 2u;
+  i = 0;
+  while (true) {
+    const int x_42 = i;
+    const int x_43 = highSigned;
+    const int x_46 = asint(x_8[0].x);
+    if ((x_42 < (min(10, x_43) + x_46))) {
+    } else {
+      break;
+    }
+    data[i] = 5;
+    {
+      i = (i + 1);
+    }
+  }
+  i_1 = 1u;
+  while (true) {
+    const uint x_58 = i_1;
+    const uint x_59 = highUnsigned;
+    const int x_62 = asint(x_8[0].x);
+    if ((x_58 < (min(10u, x_59) + asuint(x_62)))) {
+    } else {
+      break;
+    }
+    data[i_1] = 6;
+    {
+      i_1 = (i_1 + asuint(1));
+    }
+  }
+  const int x_72 = data[0];
+  const bool x_73 = (x_72 == 5);
+  x_79_phi = x_73;
+  if (x_73) {
+    const int x_77 = data[1];
+    x_78 = (x_77 == 6);
+    x_79_phi = x_78;
+  }
+  if (x_79_phi) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-min-as-loop-range/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-min-as-loop-range/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..b29ecd0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-min-as-loop-range/0-opt.spvasm.expected.msl
@@ -0,0 +1,83 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int zero;
+};
+struct tint_array_wrapper {
+  int arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_4) {
+  int highSigned = 0;
+  uint highUnsigned = 0u;
+  int i = 0;
+  tint_array_wrapper data = {};
+  uint i_1 = 0u;
+  bool x_78 = false;
+  bool x_79_phi = false;
+  highSigned = 1;
+  highUnsigned = 2u;
+  i = 0;
+  while (true) {
+    int const x_42 = i;
+    int const x_43 = highSigned;
+    int const x_46 = x_8.zero;
+    if ((x_42 < (min(10, x_43) + x_46))) {
+    } else {
+      break;
+    }
+    int const x_50 = i;
+    data.arr[x_50] = 5;
+    {
+      int const x_52 = i;
+      i = (x_52 + 1);
+    }
+  }
+  i_1 = 1u;
+  while (true) {
+    uint const x_58 = i_1;
+    uint const x_59 = highUnsigned;
+    int const x_62 = x_8.zero;
+    if ((x_58 < (min(10u, x_59) + as_type<uint>(x_62)))) {
+    } else {
+      break;
+    }
+    uint const x_67 = i_1;
+    data.arr[x_67] = 6;
+    {
+      uint const x_69 = i_1;
+      i_1 = (x_69 + as_type<uint>(1));
+    }
+  }
+  int const x_72 = data.arr[0];
+  bool const x_73 = (x_72 == 5);
+  x_79_phi = x_73;
+  if (x_73) {
+    int const x_77 = data.arr[1];
+    x_78 = (x_77 == 6);
+    x_79_phi = x_78;
+  }
+  bool const x_79 = x_79_phi;
+  if (x_79) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-min-as-loop-range/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-min-as-loop-range/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..1144dfa
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-min-as-loop-range/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,191 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 112
+; Schema: 0
+               OpCapability Shader
+         %48 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %highSigned "highSigned"
+               OpName %highUnsigned "highUnsigned"
+               OpName %i "i"
+               OpName %data "data"
+               OpName %i_1 "i_1"
+               OpName %x_78 "x_78"
+               OpName %x_79_phi "x_79_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+         %22 = OpConstantNull %uint
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+%_ptr_Function__arr_int_uint_2 = OpTypePointer Function %_arr_int_uint_2
+         %28 = OpConstantNull %_arr_int_uint_2
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %33 = OpConstantNull %bool
+      %int_1 = OpConstant %int 1
+      %int_0 = OpConstant %int 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+     %int_10 = OpConstant %int 10
+      %int_5 = OpConstant %int 5
+     %uint_1 = OpConstant %uint 1
+    %uint_10 = OpConstant %uint 10
+      %int_6 = OpConstant %int 6
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %98 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %99 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+        %100 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+ %highSigned = OpVariable %_ptr_Function_int Function %18
+%highUnsigned = OpVariable %_ptr_Function_uint Function %22
+          %i = OpVariable %_ptr_Function_int Function %18
+       %data = OpVariable %_ptr_Function__arr_int_uint_2 Function %28
+        %i_1 = OpVariable %_ptr_Function_uint Function %22
+       %x_78 = OpVariable %_ptr_Function_bool Function %33
+   %x_79_phi = OpVariable %_ptr_Function_bool Function %33
+               OpStore %highSigned %int_1
+               OpStore %highUnsigned %uint_2
+               OpStore %i %int_0
+               OpBranch %37
+         %37 = OpLabel
+               OpLoopMerge %38 %39 None
+               OpBranch %40
+         %40 = OpLabel
+         %41 = OpLoad %int %i
+         %42 = OpLoad %int %highSigned
+         %45 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0
+         %46 = OpLoad %int %45
+         %47 = OpExtInst %int %48 SMin %int_10 %42
+         %50 = OpIAdd %int %47 %46
+         %51 = OpSLessThan %bool %41 %50
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %54
+         %53 = OpLabel
+               OpBranch %52
+         %54 = OpLabel
+               OpBranch %38
+         %52 = OpLabel
+         %55 = OpLoad %int %i
+         %56 = OpAccessChain %_ptr_Function_int %data %55
+               OpStore %56 %int_5
+               OpBranch %39
+         %39 = OpLabel
+         %58 = OpLoad %int %i
+         %59 = OpIAdd %int %58 %int_1
+               OpStore %i %59
+               OpBranch %37
+         %38 = OpLabel
+               OpStore %i_1 %uint_1
+               OpBranch %61
+         %61 = OpLabel
+               OpLoopMerge %62 %63 None
+               OpBranch %64
+         %64 = OpLabel
+         %65 = OpLoad %uint %i_1
+         %66 = OpLoad %uint %highUnsigned
+         %67 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0
+         %68 = OpLoad %int %67
+         %69 = OpExtInst %uint %48 UMin %uint_10 %66
+         %71 = OpBitcast %uint %68
+         %72 = OpIAdd %uint %69 %71
+         %73 = OpULessThan %bool %65 %72
+               OpSelectionMerge %74 None
+               OpBranchConditional %73 %75 %76
+         %75 = OpLabel
+               OpBranch %74
+         %76 = OpLabel
+               OpBranch %62
+         %74 = OpLabel
+         %77 = OpLoad %uint %i_1
+         %78 = OpAccessChain %_ptr_Function_int %data %77
+               OpStore %78 %int_6
+               OpBranch %63
+         %63 = OpLabel
+         %80 = OpLoad %uint %i_1
+         %81 = OpBitcast %uint %int_1
+         %82 = OpIAdd %uint %80 %81
+               OpStore %i_1 %82
+               OpBranch %61
+         %62 = OpLabel
+         %83 = OpAccessChain %_ptr_Function_int %data %int_0
+         %84 = OpLoad %int %83
+         %85 = OpIEqual %bool %84 %int_5
+               OpStore %x_79_phi %85
+               OpSelectionMerge %86 None
+               OpBranchConditional %85 %87 %86
+         %87 = OpLabel
+         %88 = OpAccessChain %_ptr_Function_int %data %int_1
+         %89 = OpLoad %int %88
+         %90 = OpIEqual %bool %89 %int_6
+               OpStore %x_78 %90
+         %91 = OpLoad %bool %x_78
+               OpStore %x_79_phi %91
+               OpBranch %86
+         %86 = OpLabel
+         %92 = OpLoad %bool %x_79_phi
+               OpSelectionMerge %93 None
+               OpBranchConditional %92 %94 %95
+         %94 = OpLabel
+               OpStore %x_GLF_color %98
+               OpBranch %93
+         %95 = OpLabel
+               OpStore %x_GLF_color %99
+               OpBranch %93
+         %93 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %100
+%tint_symbol = OpFunctionParameter %main_out
+        %104 = OpLabel
+        %105 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %105
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+        %107 = OpLabel
+        %108 = OpFunctionCall %void %main_1
+        %110 = OpLoad %v4float %x_GLF_color
+        %111 = OpCompositeConstruct %main_out %110
+        %109 = OpFunctionCall %void %tint_symbol_2 %111
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-min-as-loop-range/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-min-as-loop-range/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..1ba10ec
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-min-as-loop-range/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,80 @@
+[[block]]
+struct buf0 {
+  zero : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var highSigned : i32;
+  var highUnsigned : u32;
+  var i : i32;
+  var data : array<i32, 2>;
+  var i_1 : u32;
+  var x_78 : bool;
+  var x_79_phi : bool;
+  highSigned = 1;
+  highUnsigned = 2u;
+  i = 0;
+  loop {
+    let x_42 : i32 = i;
+    let x_43 : i32 = highSigned;
+    let x_46 : i32 = x_8.zero;
+    if ((x_42 < (min(10, x_43) + x_46))) {
+    } else {
+      break;
+    }
+    let x_50 : i32 = i;
+    data[x_50] = 5;
+
+    continuing {
+      let x_52 : i32 = i;
+      i = (x_52 + 1);
+    }
+  }
+  i_1 = 1u;
+  loop {
+    let x_58 : u32 = i_1;
+    let x_59 : u32 = highUnsigned;
+    let x_62 : i32 = x_8.zero;
+    if ((x_58 < (min(10u, x_59) + bitcast<u32>(x_62)))) {
+    } else {
+      break;
+    }
+    let x_67 : u32 = i_1;
+    data[x_67] = 6;
+
+    continuing {
+      let x_69 : u32 = i_1;
+      i_1 = (x_69 + bitcast<u32>(1));
+    }
+  }
+  let x_72 : i32 = data[0];
+  let x_73 : bool = (x_72 == 5);
+  x_79_phi = x_73;
+  if (x_73) {
+    let x_77 : i32 = data[1];
+    x_78 = (x_77 == 6);
+    x_79_phi = x_78;
+  }
+  let x_79 : bool = x_79_phi;
+  if (x_79) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-min-as-loop-range/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-min-as-loop-range/0-opt.wgsl
new file mode 100644
index 0000000..1ba10ec
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-min-as-loop-range/0-opt.wgsl
@@ -0,0 +1,80 @@
+[[block]]
+struct buf0 {
+  zero : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var highSigned : i32;
+  var highUnsigned : u32;
+  var i : i32;
+  var data : array<i32, 2>;
+  var i_1 : u32;
+  var x_78 : bool;
+  var x_79_phi : bool;
+  highSigned = 1;
+  highUnsigned = 2u;
+  i = 0;
+  loop {
+    let x_42 : i32 = i;
+    let x_43 : i32 = highSigned;
+    let x_46 : i32 = x_8.zero;
+    if ((x_42 < (min(10, x_43) + x_46))) {
+    } else {
+      break;
+    }
+    let x_50 : i32 = i;
+    data[x_50] = 5;
+
+    continuing {
+      let x_52 : i32 = i;
+      i = (x_52 + 1);
+    }
+  }
+  i_1 = 1u;
+  loop {
+    let x_58 : u32 = i_1;
+    let x_59 : u32 = highUnsigned;
+    let x_62 : i32 = x_8.zero;
+    if ((x_58 < (min(10u, x_59) + bitcast<u32>(x_62)))) {
+    } else {
+      break;
+    }
+    let x_67 : u32 = i_1;
+    data[x_67] = 6;
+
+    continuing {
+      let x_69 : u32 = i_1;
+      i_1 = (x_69 + bitcast<u32>(1));
+    }
+  }
+  let x_72 : i32 = data[0];
+  let x_73 : bool = (x_72 == 5);
+  x_79_phi = x_73;
+  if (x_73) {
+    let x_77 : i32 = data[1];
+    x_78 = (x_77 == 6);
+    x_79_phi = x_78;
+  }
+  let x_79 : bool = x_79_phi;
+  if (x_79) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-min-as-loop-range/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-min-as-loop-range/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..fa2f460
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-min-as-loop-range/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,72 @@
+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);
+
+void main_1() {
+  int highSigned = 0;
+  uint highUnsigned = 0u;
+  int i = 0;
+  int data[2] = (int[2])0;
+  uint i_1 = 0u;
+  bool x_78 = false;
+  bool x_79_phi = false;
+  highSigned = 1;
+  highUnsigned = 2u;
+  i = 0;
+  while (true) {
+    const int x_42 = i;
+    const int x_43 = highSigned;
+    const int x_46 = asint(x_8[0].x);
+    if ((x_42 < (min(10, x_43) + x_46))) {
+    } else {
+      break;
+    }
+    data[i] = 5;
+    {
+      i = (i + 1);
+    }
+  }
+  i_1 = 1u;
+  while (true) {
+    const uint x_58 = i_1;
+    const uint x_59 = highUnsigned;
+    const int x_62 = asint(x_8[0].x);
+    if ((x_58 < (min(10u, x_59) + asuint(x_62)))) {
+    } else {
+      break;
+    }
+    data[i_1] = 6;
+    {
+      i_1 = (i_1 + asuint(1));
+    }
+  }
+  const int x_72 = data[0];
+  const bool x_73 = (x_72 == 5);
+  x_79_phi = x_73;
+  if (x_73) {
+    const int x_77 = data[1];
+    x_78 = (x_77 == 6);
+    x_79_phi = x_78;
+  }
+  if (x_79_phi) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-min-as-loop-range/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-min-as-loop-range/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..b29ecd0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-min-as-loop-range/0-opt.wgsl.expected.msl
@@ -0,0 +1,83 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int zero;
+};
+struct tint_array_wrapper {
+  int arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_4) {
+  int highSigned = 0;
+  uint highUnsigned = 0u;
+  int i = 0;
+  tint_array_wrapper data = {};
+  uint i_1 = 0u;
+  bool x_78 = false;
+  bool x_79_phi = false;
+  highSigned = 1;
+  highUnsigned = 2u;
+  i = 0;
+  while (true) {
+    int const x_42 = i;
+    int const x_43 = highSigned;
+    int const x_46 = x_8.zero;
+    if ((x_42 < (min(10, x_43) + x_46))) {
+    } else {
+      break;
+    }
+    int const x_50 = i;
+    data.arr[x_50] = 5;
+    {
+      int const x_52 = i;
+      i = (x_52 + 1);
+    }
+  }
+  i_1 = 1u;
+  while (true) {
+    uint const x_58 = i_1;
+    uint const x_59 = highUnsigned;
+    int const x_62 = x_8.zero;
+    if ((x_58 < (min(10u, x_59) + as_type<uint>(x_62)))) {
+    } else {
+      break;
+    }
+    uint const x_67 = i_1;
+    data.arr[x_67] = 6;
+    {
+      uint const x_69 = i_1;
+      i_1 = (x_69 + as_type<uint>(1));
+    }
+  }
+  int const x_72 = data.arr[0];
+  bool const x_73 = (x_72 == 5);
+  x_79_phi = x_73;
+  if (x_73) {
+    int const x_77 = data.arr[1];
+    x_78 = (x_77 == 6);
+    x_79_phi = x_78;
+  }
+  bool const x_79 = x_79_phi;
+  if (x_79) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-min-as-loop-range/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-min-as-loop-range/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..1144dfa
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-min-as-loop-range/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,191 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 112
+; Schema: 0
+               OpCapability Shader
+         %48 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %highSigned "highSigned"
+               OpName %highUnsigned "highUnsigned"
+               OpName %i "i"
+               OpName %data "data"
+               OpName %i_1 "i_1"
+               OpName %x_78 "x_78"
+               OpName %x_79_phi "x_79_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+         %22 = OpConstantNull %uint
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+%_ptr_Function__arr_int_uint_2 = OpTypePointer Function %_arr_int_uint_2
+         %28 = OpConstantNull %_arr_int_uint_2
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %33 = OpConstantNull %bool
+      %int_1 = OpConstant %int 1
+      %int_0 = OpConstant %int 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+     %int_10 = OpConstant %int 10
+      %int_5 = OpConstant %int 5
+     %uint_1 = OpConstant %uint 1
+    %uint_10 = OpConstant %uint 10
+      %int_6 = OpConstant %int 6
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %98 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %99 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+        %100 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+ %highSigned = OpVariable %_ptr_Function_int Function %18
+%highUnsigned = OpVariable %_ptr_Function_uint Function %22
+          %i = OpVariable %_ptr_Function_int Function %18
+       %data = OpVariable %_ptr_Function__arr_int_uint_2 Function %28
+        %i_1 = OpVariable %_ptr_Function_uint Function %22
+       %x_78 = OpVariable %_ptr_Function_bool Function %33
+   %x_79_phi = OpVariable %_ptr_Function_bool Function %33
+               OpStore %highSigned %int_1
+               OpStore %highUnsigned %uint_2
+               OpStore %i %int_0
+               OpBranch %37
+         %37 = OpLabel
+               OpLoopMerge %38 %39 None
+               OpBranch %40
+         %40 = OpLabel
+         %41 = OpLoad %int %i
+         %42 = OpLoad %int %highSigned
+         %45 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0
+         %46 = OpLoad %int %45
+         %47 = OpExtInst %int %48 SMin %int_10 %42
+         %50 = OpIAdd %int %47 %46
+         %51 = OpSLessThan %bool %41 %50
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %54
+         %53 = OpLabel
+               OpBranch %52
+         %54 = OpLabel
+               OpBranch %38
+         %52 = OpLabel
+         %55 = OpLoad %int %i
+         %56 = OpAccessChain %_ptr_Function_int %data %55
+               OpStore %56 %int_5
+               OpBranch %39
+         %39 = OpLabel
+         %58 = OpLoad %int %i
+         %59 = OpIAdd %int %58 %int_1
+               OpStore %i %59
+               OpBranch %37
+         %38 = OpLabel
+               OpStore %i_1 %uint_1
+               OpBranch %61
+         %61 = OpLabel
+               OpLoopMerge %62 %63 None
+               OpBranch %64
+         %64 = OpLabel
+         %65 = OpLoad %uint %i_1
+         %66 = OpLoad %uint %highUnsigned
+         %67 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0
+         %68 = OpLoad %int %67
+         %69 = OpExtInst %uint %48 UMin %uint_10 %66
+         %71 = OpBitcast %uint %68
+         %72 = OpIAdd %uint %69 %71
+         %73 = OpULessThan %bool %65 %72
+               OpSelectionMerge %74 None
+               OpBranchConditional %73 %75 %76
+         %75 = OpLabel
+               OpBranch %74
+         %76 = OpLabel
+               OpBranch %62
+         %74 = OpLabel
+         %77 = OpLoad %uint %i_1
+         %78 = OpAccessChain %_ptr_Function_int %data %77
+               OpStore %78 %int_6
+               OpBranch %63
+         %63 = OpLabel
+         %80 = OpLoad %uint %i_1
+         %81 = OpBitcast %uint %int_1
+         %82 = OpIAdd %uint %80 %81
+               OpStore %i_1 %82
+               OpBranch %61
+         %62 = OpLabel
+         %83 = OpAccessChain %_ptr_Function_int %data %int_0
+         %84 = OpLoad %int %83
+         %85 = OpIEqual %bool %84 %int_5
+               OpStore %x_79_phi %85
+               OpSelectionMerge %86 None
+               OpBranchConditional %85 %87 %86
+         %87 = OpLabel
+         %88 = OpAccessChain %_ptr_Function_int %data %int_1
+         %89 = OpLoad %int %88
+         %90 = OpIEqual %bool %89 %int_6
+               OpStore %x_78 %90
+         %91 = OpLoad %bool %x_78
+               OpStore %x_79_phi %91
+               OpBranch %86
+         %86 = OpLabel
+         %92 = OpLoad %bool %x_79_phi
+               OpSelectionMerge %93 None
+               OpBranchConditional %92 %94 %95
+         %94 = OpLabel
+               OpStore %x_GLF_color %98
+               OpBranch %93
+         %95 = OpLabel
+               OpStore %x_GLF_color %99
+               OpBranch %93
+         %93 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %100
+%tint_symbol = OpFunctionParameter %main_out
+        %104 = OpLabel
+        %105 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %105
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+        %107 = OpLabel
+        %108 = OpFunctionCall %void %main_1
+        %110 = OpLoad %v4float %x_GLF_color
+        %111 = OpCompositeConstruct %main_out %110
+        %109 = OpFunctionCall %void %tint_symbol_2 %111
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-min-as-loop-range/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-min-as-loop-range/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..1ba10ec
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-min-as-loop-range/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,80 @@
+[[block]]
+struct buf0 {
+  zero : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var highSigned : i32;
+  var highUnsigned : u32;
+  var i : i32;
+  var data : array<i32, 2>;
+  var i_1 : u32;
+  var x_78 : bool;
+  var x_79_phi : bool;
+  highSigned = 1;
+  highUnsigned = 2u;
+  i = 0;
+  loop {
+    let x_42 : i32 = i;
+    let x_43 : i32 = highSigned;
+    let x_46 : i32 = x_8.zero;
+    if ((x_42 < (min(10, x_43) + x_46))) {
+    } else {
+      break;
+    }
+    let x_50 : i32 = i;
+    data[x_50] = 5;
+
+    continuing {
+      let x_52 : i32 = i;
+      i = (x_52 + 1);
+    }
+  }
+  i_1 = 1u;
+  loop {
+    let x_58 : u32 = i_1;
+    let x_59 : u32 = highUnsigned;
+    let x_62 : i32 = x_8.zero;
+    if ((x_58 < (min(10u, x_59) + bitcast<u32>(x_62)))) {
+    } else {
+      break;
+    }
+    let x_67 : u32 = i_1;
+    data[x_67] = 6;
+
+    continuing {
+      let x_69 : u32 = i_1;
+      i_1 = (x_69 + bitcast<u32>(1));
+    }
+  }
+  let x_72 : i32 = data[0];
+  let x_73 : bool = (x_72 == 5);
+  x_79_phi = x_73;
+  if (x_73) {
+    let x_77 : i32 = data[1];
+    x_78 = (x_77 == 6);
+    x_79_phi = x_78;
+  }
+  let x_79 : bool = x_79_phi;
+  if (x_79) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-mod-one-one-lte/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-mod-one-one-lte/0-opt.spvasm
new file mode 100644
index 0000000..ffceb4b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-mod-one-one-lte/0-opt.spvasm
@@ -0,0 +1,65 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %float_1 = OpConstant %float 1
+%float_0_00999999978 = OpConstant %float 0.00999999978
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %main = OpFunction %void None %8
+         %22 = OpLabel
+         %23 = OpFMod %float %float_1 %float_1
+         %24 = OpFOrdLessThanEqual %bool %23 %float_0_00999999978
+               OpSelectionMerge %25 None
+               OpBranchConditional %24 %26 %27
+         %26 = OpLabel
+         %28 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %29 = OpLoad %int %28
+         %30 = OpConvertSToF %float %29
+         %31 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %32 = OpLoad %int %31
+         %33 = OpConvertSToF %float %32
+         %34 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %35 = OpLoad %int %34
+         %36 = OpConvertSToF %float %35
+         %37 = OpCompositeConstruct %v4float %float_1 %30 %33 %36
+               OpStore %_GLF_color %37
+               OpBranch %25
+         %27 = OpLabel
+         %38 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %39 = OpLoad %int %38
+         %40 = OpConvertSToF %float %39
+         %41 = OpCompositeConstruct %v4float %40 %40 %40 %40
+               OpStore %_GLF_color %41
+               OpBranch %25
+         %25 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-mod-one-one-lte/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-mod-one-one-lte/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..4cb3c14
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-mod-one-one-lte/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,35 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[2];
+};
+
+void main_1() {
+  if (((1.0f % 1.0f) <= 0.01f)) {
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_29 = asint(x_5[scalar_offset / 4][scalar_offset % 4]);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_32 = asint(x_5[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const int x_35 = asint(x_5[1].x);
+    x_GLF_color = float4(1.0f, float(x_29), float(x_32), float(x_35));
+  } else {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_39 = asint(x_5[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const float x_40 = float(x_39);
+    x_GLF_color = float4(x_40, x_40, x_40, x_40);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-mod-one-one-lte/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-mod-one-one-lte/0-opt.spvasm.expected.msl
new file mode 100755
index 0000000..e2d1f94
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-mod-one-one-lte/0-opt.spvasm.expected.msl
@@ -0,0 +1,49 @@
+SKIP: FAILED
+
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  if (((1.0f % 1.0f) <= 0.01f)) {
+    int const x_29 = x_5.x_GLF_uniform_int_values.arr[0].el;
+    int const x_32 = x_5.x_GLF_uniform_int_values.arr[0].el;
+    int const x_35 = x_5.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(1.0f, float(x_29), float(x_32), float(x_35));
+  } else {
+    int const x_39 = x_5.x_GLF_uniform_int_values.arr[0].el;
+    float const x_40 = float(x_39);
+    *(tint_symbol_4) = float4(x_40, x_40, x_40, x_40);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
+T:\tmp\u8zg.0.metal:22:14: error: invalid operands to binary expression ('float' and 'float')
+  if (((1.0f % 1.0f) <= 0.01f)) {
+        ~~~~ ^ ~~~~
+1 error generated.
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-mod-one-one-lte/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-mod-one-one-lte/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..1f59503
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-mod-one-one-lte/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,97 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 57
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_5 "x_5"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+    %float_1 = OpConstant %float 1
+%float_0_00999999978 = OpConstant %float 0.00999999978
+       %bool = OpTypeBool
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %45 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+         %20 = OpFMod %float %float_1 %float_1
+         %22 = OpFOrdLessThanEqual %bool %20 %float_0_00999999978
+               OpSelectionMerge %24 None
+               OpBranchConditional %22 %25 %26
+         %25 = OpLabel
+         %30 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %31 = OpLoad %int %30
+         %32 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %33 = OpLoad %int %32
+         %35 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %36 = OpLoad %int %35
+         %37 = OpConvertSToF %float %31
+         %38 = OpConvertSToF %float %33
+         %39 = OpConvertSToF %float %36
+         %40 = OpCompositeConstruct %v4float %float_1 %37 %38 %39
+               OpStore %x_GLF_color %40
+               OpBranch %24
+         %26 = OpLabel
+         %41 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %42 = OpLoad %int %41
+         %43 = OpConvertSToF %float %42
+         %44 = OpCompositeConstruct %v4float %43 %43 %43 %43
+               OpStore %x_GLF_color %44
+               OpBranch %24
+         %24 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %45
+%tint_symbol = OpFunctionParameter %main_out
+         %49 = OpLabel
+         %50 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %50
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %52 = OpLabel
+         %53 = OpFunctionCall %void %main_1
+         %55 = OpLoad %v4float %x_GLF_color
+         %56 = OpCompositeConstruct %main_out %55
+         %54 = OpFunctionCall %void %tint_symbol_2 %56
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-mod-one-one-lte/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-mod-one-one-lte/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..020e0e9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-mod-one-one-lte/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,35 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+fn main_1() {
+  if (((1.0 % 1.0) <= 0.01)) {
+    let x_29 : i32 = x_5.x_GLF_uniform_int_values[0];
+    let x_32 : i32 = x_5.x_GLF_uniform_int_values[0];
+    let x_35 : i32 = x_5.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(1.0, f32(x_29), f32(x_32), f32(x_35));
+  } else {
+    let x_39 : i32 = x_5.x_GLF_uniform_int_values[0];
+    let x_40 : f32 = f32(x_39);
+    x_GLF_color = vec4<f32>(x_40, x_40, x_40, x_40);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-mod-one-one-lte/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-mod-one-one-lte/0-opt.wgsl
new file mode 100644
index 0000000..020e0e9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-mod-one-one-lte/0-opt.wgsl
@@ -0,0 +1,35 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+fn main_1() {
+  if (((1.0 % 1.0) <= 0.01)) {
+    let x_29 : i32 = x_5.x_GLF_uniform_int_values[0];
+    let x_32 : i32 = x_5.x_GLF_uniform_int_values[0];
+    let x_35 : i32 = x_5.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(1.0, f32(x_29), f32(x_32), f32(x_35));
+  } else {
+    let x_39 : i32 = x_5.x_GLF_uniform_int_values[0];
+    let x_40 : f32 = f32(x_39);
+    x_GLF_color = vec4<f32>(x_40, x_40, x_40, x_40);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-mod-one-one-lte/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-mod-one-one-lte/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..4cb3c14
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-mod-one-one-lte/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,35 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[2];
+};
+
+void main_1() {
+  if (((1.0f % 1.0f) <= 0.01f)) {
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_29 = asint(x_5[scalar_offset / 4][scalar_offset % 4]);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_32 = asint(x_5[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const int x_35 = asint(x_5[1].x);
+    x_GLF_color = float4(1.0f, float(x_29), float(x_32), float(x_35));
+  } else {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_39 = asint(x_5[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const float x_40 = float(x_39);
+    x_GLF_color = float4(x_40, x_40, x_40, x_40);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-mod-one-one-lte/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-mod-one-one-lte/0-opt.wgsl.expected.msl
new file mode 100755
index 0000000..5e4bde3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-mod-one-one-lte/0-opt.wgsl.expected.msl
@@ -0,0 +1,49 @@
+SKIP: FAILED
+
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  if (((1.0f % 1.0f) <= 0.01f)) {
+    int const x_29 = x_5.x_GLF_uniform_int_values.arr[0].el;
+    int const x_32 = x_5.x_GLF_uniform_int_values.arr[0].el;
+    int const x_35 = x_5.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(1.0f, float(x_29), float(x_32), float(x_35));
+  } else {
+    int const x_39 = x_5.x_GLF_uniform_int_values.arr[0].el;
+    float const x_40 = float(x_39);
+    *(tint_symbol_4) = float4(x_40, x_40, x_40, x_40);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
+T:\tmp\u180.0.metal:22:14: error: invalid operands to binary expression ('float' and 'float')
+  if (((1.0f % 1.0f) <= 0.01f)) {
+        ~~~~ ^ ~~~~
+1 error generated.
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-mod-one-one-lte/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-mod-one-one-lte/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..1f59503
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-mod-one-one-lte/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,97 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 57
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_5 "x_5"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+    %float_1 = OpConstant %float 1
+%float_0_00999999978 = OpConstant %float 0.00999999978
+       %bool = OpTypeBool
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %45 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+         %20 = OpFMod %float %float_1 %float_1
+         %22 = OpFOrdLessThanEqual %bool %20 %float_0_00999999978
+               OpSelectionMerge %24 None
+               OpBranchConditional %22 %25 %26
+         %25 = OpLabel
+         %30 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %31 = OpLoad %int %30
+         %32 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %33 = OpLoad %int %32
+         %35 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %36 = OpLoad %int %35
+         %37 = OpConvertSToF %float %31
+         %38 = OpConvertSToF %float %33
+         %39 = OpConvertSToF %float %36
+         %40 = OpCompositeConstruct %v4float %float_1 %37 %38 %39
+               OpStore %x_GLF_color %40
+               OpBranch %24
+         %26 = OpLabel
+         %41 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %42 = OpLoad %int %41
+         %43 = OpConvertSToF %float %42
+         %44 = OpCompositeConstruct %v4float %43 %43 %43 %43
+               OpStore %x_GLF_color %44
+               OpBranch %24
+         %24 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %45
+%tint_symbol = OpFunctionParameter %main_out
+         %49 = OpLabel
+         %50 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %50
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %52 = OpLabel
+         %53 = OpFunctionCall %void %main_1
+         %55 = OpLoad %v4float %x_GLF_color
+         %56 = OpCompositeConstruct %main_out %55
+         %54 = OpFunctionCall %void %tint_symbol_2 %56
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-mod-one-one-lte/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-mod-one-one-lte/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..020e0e9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-mod-one-one-lte/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,35 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+fn main_1() {
+  if (((1.0 % 1.0) <= 0.01)) {
+    let x_29 : i32 = x_5.x_GLF_uniform_int_values[0];
+    let x_32 : i32 = x_5.x_GLF_uniform_int_values[0];
+    let x_35 : i32 = x_5.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(1.0, f32(x_29), f32(x_32), f32(x_35));
+  } else {
+    let x_39 : i32 = x_5.x_GLF_uniform_int_values[0];
+    let x_40 : f32 = f32(x_39);
+    x_GLF_color = vec4<f32>(x_40, x_40, x_40, x_40);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-pow-large-exp/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-pow-large-exp/0-opt.spvasm
new file mode 100644
index 0000000..78defc8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-pow-large-exp/0-opt.spvasm
@@ -0,0 +1,106 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %f "f"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+%float_40_3300018 = OpConstant %float 40.3300018
+    %float_1 = OpConstant %float 1
+        %int = OpTypeInt 32 1
+  %int_98980 = OpConstant %int 98980
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf1 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %12
+         %31 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function
+         %32 = OpExtInst %float %1 Ldexp %float_1 %int_98980
+         %33 = OpExtInst %float %1 Pow %float_40_3300018 %32
+               OpStore %f %33
+         %34 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %35 = OpLoad %int %34
+         %36 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %37 = OpLoad %int %36
+         %38 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %39 = OpLoad %int %38
+         %40 = OpIAdd %int %37 %39
+         %41 = OpIEqual %bool %35 %40
+         %42 = OpLogicalNot %bool %41
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %43
+         %44 = OpLabel
+         %45 = OpLoad %float %f
+         %46 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %47 = OpLoad %float %46
+         %48 = OpFOrdGreaterThan %bool %45 %47
+               OpBranch %43
+         %43 = OpLabel
+         %49 = OpPhi %bool %41 %31 %48 %44
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %52
+         %51 = OpLabel
+         %53 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %54 = OpLoad %int %53
+         %55 = OpConvertSToF %float %54
+         %56 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %57 = OpLoad %int %56
+         %58 = OpConvertSToF %float %57
+         %59 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %60 = OpLoad %int %59
+         %61 = OpConvertSToF %float %60
+         %62 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %63 = OpLoad %int %62
+         %64 = OpConvertSToF %float %63
+         %65 = OpCompositeConstruct %v4float %55 %58 %61 %64
+               OpStore %_GLF_color %65
+               OpBranch %50
+         %52 = OpLabel
+         %66 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %67 = OpLoad %int %66
+         %68 = OpConvertSToF %float %67
+         %69 = OpCompositeConstruct %v4float %68 %68 %68 %68
+               OpStore %_GLF_color %69
+               OpBranch %50
+         %50 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-pow-large-exp/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-pow-large-exp/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..f6a50e2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-pow-large-exp/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,56 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float f = 0.0f;
+  bool x_48 = false;
+  bool x_49_phi = false;
+  f = pow(40.330001831f, ldexp(1.0f, 98980));
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_35 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_37 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const int x_39 = asint(x_6[1].x);
+  const bool x_41 = (x_35 == (x_37 + x_39));
+  x_49_phi = x_41;
+  if (!(x_41)) {
+    const float x_45 = f;
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const float x_47 = asfloat(x_8[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    x_48 = (x_45 > x_47);
+    x_49_phi = x_48;
+  }
+  if (x_49_phi) {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_54 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const int x_57 = asint(x_6[1].x);
+    const int x_60 = asint(x_6[1].x);
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_63 = asint(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    x_GLF_color = float4(float(x_54), float(x_57), float(x_60), float(x_63));
+  } else {
+    const int x_67 = asint(x_6[1].x);
+    const float x_68 = float(x_67);
+    x_GLF_color = float4(x_68, x_68, x_68, x_68);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-pow-large-exp/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-pow-large-exp/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..b0caa47
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-pow-large-exp/0-opt.spvasm.expected.msl
@@ -0,0 +1,69 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_8, thread float4* const tint_symbol_4) {
+  float f = 0.0f;
+  bool x_48 = false;
+  bool x_49_phi = false;
+  f = pow(40.330001831f, ldexp(1.0f, 98980));
+  int const x_35 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_37 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_39 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  bool const x_41 = (x_35 == (x_37 + x_39));
+  x_49_phi = x_41;
+  if (!(x_41)) {
+    float const x_45 = f;
+    float const x_47 = x_8.x_GLF_uniform_float_values.arr[0].el;
+    x_48 = (x_45 > x_47);
+    x_49_phi = x_48;
+  }
+  bool const x_49 = x_49_phi;
+  if (x_49) {
+    int const x_54 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_57 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_60 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_63 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_54), float(x_57), float(x_60), float(x_63));
+  } else {
+    int const x_67 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    float const x_68 = float(x_67);
+    *(tint_symbol_4) = float4(x_68, x_68, x_68, x_68);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_8 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-pow-large-exp/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-pow-large-exp/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..fc4fc19
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-pow-large-exp/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,151 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 92
+; Schema: 0
+               OpCapability Shader
+         %33 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %x_48 "x_48"
+               OpName %x_49_phi "x_49_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf1 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %26 = OpConstantNull %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %30 = OpConstantNull %bool
+%float_40_3300018 = OpConstant %float 40.3300018
+    %float_1 = OpConstant %float 1
+  %int_98980 = OpConstant %int 98980
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+   %main_out = OpTypeStruct %v4float
+         %80 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %26
+       %x_48 = OpVariable %_ptr_Function_bool Function %30
+   %x_49_phi = OpVariable %_ptr_Function_bool Function %30
+         %35 = OpExtInst %float %33 Ldexp %float_1 %int_98980
+         %32 = OpExtInst %float %33 Pow %float_40_3300018 %35
+               OpStore %f %32
+         %41 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %42 = OpLoad %int %41
+         %43 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %44 = OpLoad %int %43
+         %46 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %47 = OpLoad %int %46
+         %48 = OpIAdd %int %44 %47
+         %49 = OpIEqual %bool %42 %48
+               OpStore %x_49_phi %49
+         %50 = OpLogicalNot %bool %49
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %51
+         %52 = OpLabel
+         %53 = OpLoad %float %f
+         %55 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %56 = OpLoad %float %55
+         %57 = OpFOrdGreaterThan %bool %53 %56
+               OpStore %x_48 %57
+         %58 = OpLoad %bool %x_48
+               OpStore %x_49_phi %58
+               OpBranch %51
+         %51 = OpLabel
+         %59 = OpLoad %bool %x_49_phi
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %62
+         %61 = OpLabel
+         %63 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %64 = OpLoad %int %63
+         %65 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %66 = OpLoad %int %65
+         %67 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %68 = OpLoad %int %67
+         %69 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %70 = OpLoad %int %69
+         %71 = OpConvertSToF %float %64
+         %72 = OpConvertSToF %float %66
+         %73 = OpConvertSToF %float %68
+         %74 = OpConvertSToF %float %70
+         %75 = OpCompositeConstruct %v4float %71 %72 %73 %74
+               OpStore %x_GLF_color %75
+               OpBranch %60
+         %62 = OpLabel
+         %76 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %77 = OpLoad %int %76
+         %78 = OpConvertSToF %float %77
+         %79 = OpCompositeConstruct %v4float %78 %78 %78 %78
+               OpStore %x_GLF_color %79
+               OpBranch %60
+         %60 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %80
+%tint_symbol = OpFunctionParameter %main_out
+         %84 = OpLabel
+         %85 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %85
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+         %87 = OpLabel
+         %88 = OpFunctionCall %void %main_1
+         %90 = OpLoad %v4float %x_GLF_color
+         %91 = OpCompositeConstruct %main_out %90
+         %89 = OpFunctionCall %void %tint_symbol_2 %91
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-pow-large-exp/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-pow-large-exp/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..5f17cf5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-pow-large-exp/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,61 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  var x_48 : bool;
+  var x_49_phi : bool;
+  f = pow(40.330001831, ldexp(1.0, 98980));
+  let x_35 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_37 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_39 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_41 : bool = (x_35 == (x_37 + x_39));
+  x_49_phi = x_41;
+  if (!(x_41)) {
+    let x_45 : f32 = f;
+    let x_47 : f32 = x_8.x_GLF_uniform_float_values[0];
+    x_48 = (x_45 > x_47);
+    x_49_phi = x_48;
+  }
+  let x_49 : bool = x_49_phi;
+  if (x_49) {
+    let x_54 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_57 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_60 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_63 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_54), f32(x_57), f32(x_60), f32(x_63));
+  } else {
+    let x_67 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_68 : f32 = f32(x_67);
+    x_GLF_color = vec4<f32>(x_68, x_68, x_68, x_68);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-pow-large-exp/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-pow-large-exp/0-opt.wgsl
new file mode 100644
index 0000000..5f17cf5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-pow-large-exp/0-opt.wgsl
@@ -0,0 +1,61 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  var x_48 : bool;
+  var x_49_phi : bool;
+  f = pow(40.330001831, ldexp(1.0, 98980));
+  let x_35 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_37 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_39 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_41 : bool = (x_35 == (x_37 + x_39));
+  x_49_phi = x_41;
+  if (!(x_41)) {
+    let x_45 : f32 = f;
+    let x_47 : f32 = x_8.x_GLF_uniform_float_values[0];
+    x_48 = (x_45 > x_47);
+    x_49_phi = x_48;
+  }
+  let x_49 : bool = x_49_phi;
+  if (x_49) {
+    let x_54 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_57 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_60 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_63 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_54), f32(x_57), f32(x_60), f32(x_63));
+  } else {
+    let x_67 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_68 : f32 = f32(x_67);
+    x_GLF_color = vec4<f32>(x_68, x_68, x_68, x_68);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-pow-large-exp/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-pow-large-exp/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..f6a50e2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-pow-large-exp/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,56 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float f = 0.0f;
+  bool x_48 = false;
+  bool x_49_phi = false;
+  f = pow(40.330001831f, ldexp(1.0f, 98980));
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_35 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_37 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const int x_39 = asint(x_6[1].x);
+  const bool x_41 = (x_35 == (x_37 + x_39));
+  x_49_phi = x_41;
+  if (!(x_41)) {
+    const float x_45 = f;
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const float x_47 = asfloat(x_8[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    x_48 = (x_45 > x_47);
+    x_49_phi = x_48;
+  }
+  if (x_49_phi) {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_54 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const int x_57 = asint(x_6[1].x);
+    const int x_60 = asint(x_6[1].x);
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_63 = asint(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    x_GLF_color = float4(float(x_54), float(x_57), float(x_60), float(x_63));
+  } else {
+    const int x_67 = asint(x_6[1].x);
+    const float x_68 = float(x_67);
+    x_GLF_color = float4(x_68, x_68, x_68, x_68);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-pow-large-exp/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-pow-large-exp/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..b0caa47
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-pow-large-exp/0-opt.wgsl.expected.msl
@@ -0,0 +1,69 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_8, thread float4* const tint_symbol_4) {
+  float f = 0.0f;
+  bool x_48 = false;
+  bool x_49_phi = false;
+  f = pow(40.330001831f, ldexp(1.0f, 98980));
+  int const x_35 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_37 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_39 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  bool const x_41 = (x_35 == (x_37 + x_39));
+  x_49_phi = x_41;
+  if (!(x_41)) {
+    float const x_45 = f;
+    float const x_47 = x_8.x_GLF_uniform_float_values.arr[0].el;
+    x_48 = (x_45 > x_47);
+    x_49_phi = x_48;
+  }
+  bool const x_49 = x_49_phi;
+  if (x_49) {
+    int const x_54 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_57 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_60 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_63 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_54), float(x_57), float(x_60), float(x_63));
+  } else {
+    int const x_67 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    float const x_68 = float(x_67);
+    *(tint_symbol_4) = float4(x_68, x_68, x_68, x_68);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_8 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-pow-large-exp/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-pow-large-exp/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..fc4fc19
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-pow-large-exp/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,151 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 92
+; Schema: 0
+               OpCapability Shader
+         %33 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %x_48 "x_48"
+               OpName %x_49_phi "x_49_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf1 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %26 = OpConstantNull %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %30 = OpConstantNull %bool
+%float_40_3300018 = OpConstant %float 40.3300018
+    %float_1 = OpConstant %float 1
+  %int_98980 = OpConstant %int 98980
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+   %main_out = OpTypeStruct %v4float
+         %80 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %26
+       %x_48 = OpVariable %_ptr_Function_bool Function %30
+   %x_49_phi = OpVariable %_ptr_Function_bool Function %30
+         %35 = OpExtInst %float %33 Ldexp %float_1 %int_98980
+         %32 = OpExtInst %float %33 Pow %float_40_3300018 %35
+               OpStore %f %32
+         %41 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %42 = OpLoad %int %41
+         %43 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %44 = OpLoad %int %43
+         %46 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %47 = OpLoad %int %46
+         %48 = OpIAdd %int %44 %47
+         %49 = OpIEqual %bool %42 %48
+               OpStore %x_49_phi %49
+         %50 = OpLogicalNot %bool %49
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %51
+         %52 = OpLabel
+         %53 = OpLoad %float %f
+         %55 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %56 = OpLoad %float %55
+         %57 = OpFOrdGreaterThan %bool %53 %56
+               OpStore %x_48 %57
+         %58 = OpLoad %bool %x_48
+               OpStore %x_49_phi %58
+               OpBranch %51
+         %51 = OpLabel
+         %59 = OpLoad %bool %x_49_phi
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %62
+         %61 = OpLabel
+         %63 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %64 = OpLoad %int %63
+         %65 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %66 = OpLoad %int %65
+         %67 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %68 = OpLoad %int %67
+         %69 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %70 = OpLoad %int %69
+         %71 = OpConvertSToF %float %64
+         %72 = OpConvertSToF %float %66
+         %73 = OpConvertSToF %float %68
+         %74 = OpConvertSToF %float %70
+         %75 = OpCompositeConstruct %v4float %71 %72 %73 %74
+               OpStore %x_GLF_color %75
+               OpBranch %60
+         %62 = OpLabel
+         %76 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %77 = OpLoad %int %76
+         %78 = OpConvertSToF %float %77
+         %79 = OpCompositeConstruct %v4float %78 %78 %78 %78
+               OpStore %x_GLF_color %79
+               OpBranch %60
+         %60 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %80
+%tint_symbol = OpFunctionParameter %main_out
+         %84 = OpLabel
+         %85 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %85
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+         %87 = OpLabel
+         %88 = OpFunctionCall %void %main_1
+         %90 = OpLoad %v4float %x_GLF_color
+         %91 = OpCompositeConstruct %main_out %90
+         %89 = OpFunctionCall %void %tint_symbol_2 %91
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-pow-large-exp/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-pow-large-exp/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..5f17cf5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-pow-large-exp/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,61 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  var x_48 : bool;
+  var x_49_phi : bool;
+  f = pow(40.330001831, ldexp(1.0, 98980));
+  let x_35 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_37 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_39 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_41 : bool = (x_35 == (x_37 + x_39));
+  x_49_phi = x_41;
+  if (!(x_41)) {
+    let x_45 : f32 = f;
+    let x_47 : f32 = x_8.x_GLF_uniform_float_values[0];
+    x_48 = (x_45 > x_47);
+    x_49_phi = x_48;
+  }
+  let x_49 : bool = x_49_phi;
+  if (x_49) {
+    let x_54 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_57 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_60 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_63 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_54), f32(x_57), f32(x_60), f32(x_63));
+  } else {
+    let x_67 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_68 : f32 = f32(x_67);
+    x_GLF_color = vec4<f32>(x_68, x_68, x_68, x_68);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-same-condition/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-same-condition/0-opt.spvasm
new file mode 100644
index 0000000..aa75585
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-same-condition/0-opt.spvasm
@@ -0,0 +1,83 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %_ ""
+               OpDecorate %_GLF_color Location 0
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %12 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %bool = OpTypeBool
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+         %19 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+         %20 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %7
+         %21 = OpLabel
+               OpStore %_GLF_color %12
+         %22 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %23 = OpLoad %float %22
+         %24 = OpFOrdLessThan %bool %23 %float_0
+         %25 = OpLogicalNot %bool %24
+               OpSelectionMerge %26 None
+               OpBranchConditional %25 %27 %26
+         %27 = OpLabel
+         %28 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %29 = OpLoad %float %28
+         %30 = OpFOrdLessThan %bool %29 %float_1
+               OpBranch %26
+         %26 = OpLabel
+         %31 = OpPhi %bool %24 %21 %30 %27
+               OpSelectionMerge %32 None
+               OpBranchConditional %31 %33 %32
+         %33 = OpLabel
+               OpReturn
+         %32 = OpLabel
+         %34 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %35 = OpLoad %float %34
+         %36 = OpFOrdLessThan %bool %35 %float_0
+               OpSelectionMerge %37 None
+               OpBranchConditional %36 %38 %39
+         %38 = OpLabel
+               OpBranch %40
+         %40 = OpLabel
+               OpLoopMerge %41 %42 None
+               OpBranch %43
+         %43 = OpLabel
+         %44 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %45 = OpLoad %float %44
+         %46 = OpFOrdLessThan %bool %45 %float_0
+               OpBranchConditional %46 %47 %41
+         %47 = OpLabel
+               OpStore %_GLF_color %19
+               OpBranch %41
+         %42 = OpLabel
+               OpBranch %40
+         %41 = OpLabel
+               OpBranch %37
+         %39 = OpLabel
+               OpStore %_GLF_color %20
+               OpBranch %37
+         %37 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-same-condition/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-same-condition/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..40ad3c7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-same-condition/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,50 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+
+void main_1() {
+  bool x_30 = false;
+  bool x_31_phi = false;
+  x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  const float x_23 = asfloat(x_5[0].x);
+  const bool x_24 = (x_23 < 0.0f);
+  x_31_phi = x_24;
+  if (!(x_24)) {
+    const float x_29 = asfloat(x_5[0].x);
+    x_30 = (x_29 < 1.0f);
+    x_31_phi = x_30;
+  }
+  if (x_31_phi) {
+    return;
+  }
+  const float x_35 = asfloat(x_5[0].x);
+  if ((x_35 < 0.0f)) {
+    while (true) {
+      const float x_45 = asfloat(x_5[0].x);
+      if ((x_45 < 0.0f)) {
+      } else {
+        break;
+      }
+      x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+      break;
+    }
+  } else {
+    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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-same-condition/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-same-condition/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..526a975
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-same-condition/0-opt.spvasm.expected.msl
@@ -0,0 +1,54 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  bool x_30 = false;
+  bool x_31_phi = false;
+  *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float const x_23 = x_5.one;
+  bool const x_24 = (x_23 < 0.0f);
+  x_31_phi = x_24;
+  if (!(x_24)) {
+    float const x_29 = x_5.one;
+    x_30 = (x_29 < 1.0f);
+    x_31_phi = x_30;
+  }
+  bool const x_31 = x_31_phi;
+  if (x_31) {
+    return;
+  }
+  float const x_35 = x_5.one;
+  if ((x_35 < 0.0f)) {
+    while (true) {
+      float const x_45 = x_5.one;
+      if ((x_45 < 0.0f)) {
+      } else {
+        break;
+      }
+      *(tint_symbol_4) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+      break;
+    }
+  } else {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-same-condition/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-same-condition/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..ed5bd9f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-same-condition/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,129 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 69
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_5 "x_5"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_30 "x_30"
+               OpName %x_31_phi "x_31_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %18 = OpConstantNull %bool
+    %float_0 = OpConstant %float 0
+         %21 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+         %55 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+         %56 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %57 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+       %x_30 = OpVariable %_ptr_Function_bool Function %18
+   %x_31_phi = OpVariable %_ptr_Function_bool Function %18
+               OpStore %x_GLF_color %21
+         %25 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0
+         %26 = OpLoad %float %25
+         %27 = OpFOrdLessThan %bool %26 %float_0
+               OpStore %x_31_phi %27
+         %28 = OpLogicalNot %bool %27
+               OpSelectionMerge %29 None
+               OpBranchConditional %28 %30 %29
+         %30 = OpLabel
+         %31 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0
+         %32 = OpLoad %float %31
+         %34 = OpFOrdLessThan %bool %32 %float_1
+               OpStore %x_30 %34
+         %35 = OpLoad %bool %x_30
+               OpStore %x_31_phi %35
+               OpBranch %29
+         %29 = OpLabel
+         %36 = OpLoad %bool %x_31_phi
+               OpSelectionMerge %37 None
+               OpBranchConditional %36 %38 %37
+         %38 = OpLabel
+               OpReturn
+         %37 = OpLabel
+         %39 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0
+         %40 = OpLoad %float %39
+         %41 = OpFOrdLessThan %bool %40 %float_0
+               OpSelectionMerge %42 None
+               OpBranchConditional %41 %43 %44
+         %43 = OpLabel
+               OpBranch %45
+         %45 = OpLabel
+               OpLoopMerge %46 %47 None
+               OpBranch %48
+         %48 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0
+         %50 = OpLoad %float %49
+         %51 = OpFOrdLessThan %bool %50 %float_0
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %54
+         %53 = OpLabel
+               OpBranch %52
+         %54 = OpLabel
+               OpBranch %46
+         %52 = OpLabel
+               OpStore %x_GLF_color %55
+               OpBranch %46
+         %47 = OpLabel
+               OpBranch %45
+         %46 = OpLabel
+               OpBranch %42
+         %44 = OpLabel
+               OpStore %x_GLF_color %56
+               OpBranch %42
+         %42 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %57
+%tint_symbol = OpFunctionParameter %main_out
+         %61 = OpLabel
+         %62 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %62
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %64 = OpLabel
+         %65 = OpFunctionCall %void %main_1
+         %67 = OpLoad %v4float %x_GLF_color
+         %68 = OpCompositeConstruct %main_out %67
+         %66 = OpFunctionCall %void %tint_symbol_2 %68
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-same-condition/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-same-condition/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..c41a337
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-same-condition/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,52 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+fn main_1() {
+  var x_30 : bool;
+  var x_31_phi : bool;
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  let x_23 : f32 = x_5.one;
+  let x_24 : bool = (x_23 < 0.0);
+  x_31_phi = x_24;
+  if (!(x_24)) {
+    let x_29 : f32 = x_5.one;
+    x_30 = (x_29 < 1.0);
+    x_31_phi = x_30;
+  }
+  let x_31 : bool = x_31_phi;
+  if (x_31) {
+    return;
+  }
+  let x_35 : f32 = x_5.one;
+  if ((x_35 < 0.0)) {
+    loop {
+      let x_45 : f32 = x_5.one;
+      if ((x_45 < 0.0)) {
+      } else {
+        break;
+      }
+      x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+      break;
+    }
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-same-condition/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-same-condition/0-opt.wgsl
new file mode 100644
index 0000000..c41a337
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-same-condition/0-opt.wgsl
@@ -0,0 +1,52 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+fn main_1() {
+  var x_30 : bool;
+  var x_31_phi : bool;
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  let x_23 : f32 = x_5.one;
+  let x_24 : bool = (x_23 < 0.0);
+  x_31_phi = x_24;
+  if (!(x_24)) {
+    let x_29 : f32 = x_5.one;
+    x_30 = (x_29 < 1.0);
+    x_31_phi = x_30;
+  }
+  let x_31 : bool = x_31_phi;
+  if (x_31) {
+    return;
+  }
+  let x_35 : f32 = x_5.one;
+  if ((x_35 < 0.0)) {
+    loop {
+      let x_45 : f32 = x_5.one;
+      if ((x_45 < 0.0)) {
+      } else {
+        break;
+      }
+      x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+      break;
+    }
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-same-condition/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-same-condition/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..40ad3c7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-same-condition/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,50 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+
+void main_1() {
+  bool x_30 = false;
+  bool x_31_phi = false;
+  x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  const float x_23 = asfloat(x_5[0].x);
+  const bool x_24 = (x_23 < 0.0f);
+  x_31_phi = x_24;
+  if (!(x_24)) {
+    const float x_29 = asfloat(x_5[0].x);
+    x_30 = (x_29 < 1.0f);
+    x_31_phi = x_30;
+  }
+  if (x_31_phi) {
+    return;
+  }
+  const float x_35 = asfloat(x_5[0].x);
+  if ((x_35 < 0.0f)) {
+    while (true) {
+      const float x_45 = asfloat(x_5[0].x);
+      if ((x_45 < 0.0f)) {
+      } else {
+        break;
+      }
+      x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+      break;
+    }
+  } else {
+    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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-same-condition/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-same-condition/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..526a975
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-same-condition/0-opt.wgsl.expected.msl
@@ -0,0 +1,54 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  bool x_30 = false;
+  bool x_31_phi = false;
+  *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float const x_23 = x_5.one;
+  bool const x_24 = (x_23 < 0.0f);
+  x_31_phi = x_24;
+  if (!(x_24)) {
+    float const x_29 = x_5.one;
+    x_30 = (x_29 < 1.0f);
+    x_31_phi = x_30;
+  }
+  bool const x_31 = x_31_phi;
+  if (x_31) {
+    return;
+  }
+  float const x_35 = x_5.one;
+  if ((x_35 < 0.0f)) {
+    while (true) {
+      float const x_45 = x_5.one;
+      if ((x_45 < 0.0f)) {
+      } else {
+        break;
+      }
+      *(tint_symbol_4) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+      break;
+    }
+  } else {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-same-condition/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-same-condition/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..ed5bd9f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-same-condition/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,129 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 69
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_5 "x_5"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_30 "x_30"
+               OpName %x_31_phi "x_31_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %18 = OpConstantNull %bool
+    %float_0 = OpConstant %float 0
+         %21 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+         %55 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+         %56 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %57 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+       %x_30 = OpVariable %_ptr_Function_bool Function %18
+   %x_31_phi = OpVariable %_ptr_Function_bool Function %18
+               OpStore %x_GLF_color %21
+         %25 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0
+         %26 = OpLoad %float %25
+         %27 = OpFOrdLessThan %bool %26 %float_0
+               OpStore %x_31_phi %27
+         %28 = OpLogicalNot %bool %27
+               OpSelectionMerge %29 None
+               OpBranchConditional %28 %30 %29
+         %30 = OpLabel
+         %31 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0
+         %32 = OpLoad %float %31
+         %34 = OpFOrdLessThan %bool %32 %float_1
+               OpStore %x_30 %34
+         %35 = OpLoad %bool %x_30
+               OpStore %x_31_phi %35
+               OpBranch %29
+         %29 = OpLabel
+         %36 = OpLoad %bool %x_31_phi
+               OpSelectionMerge %37 None
+               OpBranchConditional %36 %38 %37
+         %38 = OpLabel
+               OpReturn
+         %37 = OpLabel
+         %39 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0
+         %40 = OpLoad %float %39
+         %41 = OpFOrdLessThan %bool %40 %float_0
+               OpSelectionMerge %42 None
+               OpBranchConditional %41 %43 %44
+         %43 = OpLabel
+               OpBranch %45
+         %45 = OpLabel
+               OpLoopMerge %46 %47 None
+               OpBranch %48
+         %48 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0
+         %50 = OpLoad %float %49
+         %51 = OpFOrdLessThan %bool %50 %float_0
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %54
+         %53 = OpLabel
+               OpBranch %52
+         %54 = OpLabel
+               OpBranch %46
+         %52 = OpLabel
+               OpStore %x_GLF_color %55
+               OpBranch %46
+         %47 = OpLabel
+               OpBranch %45
+         %46 = OpLabel
+               OpBranch %42
+         %44 = OpLabel
+               OpStore %x_GLF_color %56
+               OpBranch %42
+         %42 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %57
+%tint_symbol = OpFunctionParameter %main_out
+         %61 = OpLabel
+         %62 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %62
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %64 = OpLabel
+         %65 = OpFunctionCall %void %main_1
+         %67 = OpLoad %v4float %x_GLF_color
+         %68 = OpCompositeConstruct %main_out %67
+         %66 = OpFunctionCall %void %tint_symbol_2 %68
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-same-condition/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-same-condition/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..c41a337
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-same-condition/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,52 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+fn main_1() {
+  var x_30 : bool;
+  var x_31_phi : bool;
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  let x_23 : f32 = x_5.one;
+  let x_24 : bool = (x_23 < 0.0);
+  x_31_phi = x_24;
+  if (!(x_24)) {
+    let x_29 : f32 = x_5.one;
+    x_30 = (x_29 < 1.0);
+    x_31_phi = x_30;
+  }
+  let x_31 : bool = x_31_phi;
+  if (x_31) {
+    return;
+  }
+  let x_35 : f32 = x_5.one;
+  if ((x_35 < 0.0)) {
+    loop {
+      let x_45 : f32 = x_5.one;
+      if ((x_45 < 0.0)) {
+      } else {
+        break;
+      }
+      x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+      break;
+    }
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-sinh-inf/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-sinh-inf/0-opt.spvasm
new file mode 100644
index 0000000..7abb413
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-sinh-inf/0-opt.spvasm
@@ -0,0 +1,70 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %f "f"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+%float_724_322021 = OpConstant %float 724.322021
+       %bool = OpTypeBool
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %25 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %26 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %8
+         %27 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function
+         %28 = OpExtInst %float %1 Sinh %float_724_322021
+               OpStore %f %28
+         %29 = OpLoad %float %f
+         %30 = OpIsInf %bool %29
+         %31 = OpLogicalNot %bool %30
+               OpSelectionMerge %32 None
+               OpBranchConditional %31 %33 %32
+         %33 = OpLabel
+         %34 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %35 = OpLoad %float %34
+         %36 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %37 = OpLoad %float %36
+         %38 = OpFOrdLessThan %bool %35 %37
+               OpBranch %32
+         %32 = OpLabel
+         %39 = OpPhi %bool %30 %27 %38 %33
+               OpSelectionMerge %40 None
+               OpBranchConditional %39 %41 %42
+         %41 = OpLabel
+               OpStore %_GLF_color %25
+               OpBranch %40
+         %42 = OpLabel
+               OpStore %_GLF_color %26
+               OpBranch %40
+         %40 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-sinh-inf/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-sinh-inf/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..3b7aff0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-sinh-inf/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,39 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float f = 0.0f;
+  bool x_38 = false;
+  bool x_39_phi = false;
+  f = sinh(724.322021484f);
+  const bool x_30 = isinf(f);
+  x_39_phi = x_30;
+  if (!(x_30)) {
+    const float x_35 = asfloat(x_6[0].x);
+    const float x_37 = asfloat(x_6[0].y);
+    x_38 = (x_35 < x_37);
+    x_39_phi = x_38;
+  }
+  if (x_39_phi) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-sinh-inf/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-sinh-inf/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..1396285
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-sinh-inf/0-opt.spvasm.expected.msl
@@ -0,0 +1,44 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float f = 0.0f;
+  bool x_38 = false;
+  bool x_39_phi = false;
+  f = sinh(724.322021484f);
+  float const x_29 = f;
+  bool const x_30 = isinf(x_29);
+  x_39_phi = x_30;
+  if (!(x_30)) {
+    float const x_35 = x_6.injectionSwitch.x;
+    float const x_37 = x_6.injectionSwitch.y;
+    x_38 = (x_35 < x_37);
+    x_39_phi = x_38;
+  }
+  bool const x_39 = x_39_phi;
+  if (x_39) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-sinh-inf/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-sinh-inf/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..78fda08
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-sinh-inf/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,111 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 62
+; Schema: 0
+               OpCapability Shader
+         %25 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %x_38 "x_38"
+               OpName %x_39_phi "x_39_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %18 = OpConstantNull %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %22 = OpConstantNull %bool
+%float_724_322021 = OpConstant %float 724.322021
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %48 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %49 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %50 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %18
+       %x_38 = OpVariable %_ptr_Function_bool Function %22
+   %x_39_phi = OpVariable %_ptr_Function_bool Function %22
+         %24 = OpExtInst %float %25 Sinh %float_724_322021
+               OpStore %f %24
+         %27 = OpLoad %float %f
+         %28 = OpIsInf %bool %27
+               OpStore %x_39_phi %28
+         %29 = OpLogicalNot %bool %28
+               OpSelectionMerge %30 None
+               OpBranchConditional %29 %31 %30
+         %31 = OpLabel
+         %35 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+         %36 = OpLoad %float %35
+         %38 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %39 = OpLoad %float %38
+         %40 = OpFOrdLessThan %bool %36 %39
+               OpStore %x_38 %40
+         %41 = OpLoad %bool %x_38
+               OpStore %x_39_phi %41
+               OpBranch %30
+         %30 = OpLabel
+         %42 = OpLoad %bool %x_39_phi
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %45
+         %44 = OpLabel
+               OpStore %x_GLF_color %48
+               OpBranch %43
+         %45 = OpLabel
+               OpStore %x_GLF_color %49
+               OpBranch %43
+         %43 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %50
+%tint_symbol = OpFunctionParameter %main_out
+         %54 = OpLabel
+         %55 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %55
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %57 = OpLabel
+         %58 = OpFunctionCall %void %main_1
+         %60 = OpLoad %v4float %x_GLF_color
+         %61 = OpCompositeConstruct %main_out %60
+         %59 = OpFunctionCall %void %tint_symbol_2 %61
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-sinh-inf/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-sinh-inf/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..39460bf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-sinh-inf/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,42 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  var x_38 : bool;
+  var x_39_phi : bool;
+  f = sinh(724.322021484);
+  let x_29 : f32 = f;
+  let x_30 : bool = isInf(x_29);
+  x_39_phi = x_30;
+  if (!(x_30)) {
+    let x_35 : f32 = x_6.injectionSwitch.x;
+    let x_37 : f32 = x_6.injectionSwitch.y;
+    x_38 = (x_35 < x_37);
+    x_39_phi = x_38;
+  }
+  let x_39 : bool = x_39_phi;
+  if (x_39) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-sinh-inf/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-sinh-inf/0-opt.wgsl
new file mode 100644
index 0000000..39460bf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-sinh-inf/0-opt.wgsl
@@ -0,0 +1,42 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  var x_38 : bool;
+  var x_39_phi : bool;
+  f = sinh(724.322021484);
+  let x_29 : f32 = f;
+  let x_30 : bool = isInf(x_29);
+  x_39_phi = x_30;
+  if (!(x_30)) {
+    let x_35 : f32 = x_6.injectionSwitch.x;
+    let x_37 : f32 = x_6.injectionSwitch.y;
+    x_38 = (x_35 < x_37);
+    x_39_phi = x_38;
+  }
+  let x_39 : bool = x_39_phi;
+  if (x_39) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-sinh-inf/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-sinh-inf/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..3b7aff0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-sinh-inf/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,39 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float f = 0.0f;
+  bool x_38 = false;
+  bool x_39_phi = false;
+  f = sinh(724.322021484f);
+  const bool x_30 = isinf(f);
+  x_39_phi = x_30;
+  if (!(x_30)) {
+    const float x_35 = asfloat(x_6[0].x);
+    const float x_37 = asfloat(x_6[0].y);
+    x_38 = (x_35 < x_37);
+    x_39_phi = x_38;
+  }
+  if (x_39_phi) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-sinh-inf/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-sinh-inf/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..1396285
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-sinh-inf/0-opt.wgsl.expected.msl
@@ -0,0 +1,44 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float f = 0.0f;
+  bool x_38 = false;
+  bool x_39_phi = false;
+  f = sinh(724.322021484f);
+  float const x_29 = f;
+  bool const x_30 = isinf(x_29);
+  x_39_phi = x_30;
+  if (!(x_30)) {
+    float const x_35 = x_6.injectionSwitch.x;
+    float const x_37 = x_6.injectionSwitch.y;
+    x_38 = (x_35 < x_37);
+    x_39_phi = x_38;
+  }
+  bool const x_39 = x_39_phi;
+  if (x_39) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-sinh-inf/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-sinh-inf/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..78fda08
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-sinh-inf/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,111 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 62
+; Schema: 0
+               OpCapability Shader
+         %25 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %x_38 "x_38"
+               OpName %x_39_phi "x_39_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %18 = OpConstantNull %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %22 = OpConstantNull %bool
+%float_724_322021 = OpConstant %float 724.322021
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %48 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %49 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %50 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %18
+       %x_38 = OpVariable %_ptr_Function_bool Function %22
+   %x_39_phi = OpVariable %_ptr_Function_bool Function %22
+         %24 = OpExtInst %float %25 Sinh %float_724_322021
+               OpStore %f %24
+         %27 = OpLoad %float %f
+         %28 = OpIsInf %bool %27
+               OpStore %x_39_phi %28
+         %29 = OpLogicalNot %bool %28
+               OpSelectionMerge %30 None
+               OpBranchConditional %29 %31 %30
+         %31 = OpLabel
+         %35 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+         %36 = OpLoad %float %35
+         %38 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %39 = OpLoad %float %38
+         %40 = OpFOrdLessThan %bool %36 %39
+               OpStore %x_38 %40
+         %41 = OpLoad %bool %x_38
+               OpStore %x_39_phi %41
+               OpBranch %30
+         %30 = OpLabel
+         %42 = OpLoad %bool %x_39_phi
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %45
+         %44 = OpLabel
+               OpStore %x_GLF_color %48
+               OpBranch %43
+         %45 = OpLabel
+               OpStore %x_GLF_color %49
+               OpBranch %43
+         %43 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %50
+%tint_symbol = OpFunctionParameter %main_out
+         %54 = OpLabel
+         %55 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %55
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %57 = OpLabel
+         %58 = OpFunctionCall %void %main_1
+         %60 = OpLoad %v4float %x_GLF_color
+         %61 = OpCompositeConstruct %main_out %60
+         %59 = OpFunctionCall %void %tint_symbol_2 %61
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-sinh-inf/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-sinh-inf/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..39460bf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-sinh-inf/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,42 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  var x_38 : bool;
+  var x_39_phi : bool;
+  f = sinh(724.322021484);
+  let x_29 : f32 = f;
+  let x_30 : bool = isInf(x_29);
+  x_39_phi = x_30;
+  if (!(x_30)) {
+    let x_35 : f32 = x_6.injectionSwitch.x;
+    let x_37 : f32 = x_6.injectionSwitch.y;
+    x_38 = (x_35 < x_37);
+    x_39_phi = x_38;
+  }
+  let x_39 : bool = x_39_phi;
+  if (x_39) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-vector-shuffle/0.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-vector-shuffle/0.spvasm
new file mode 100644
index 0000000..db63815
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-vector-shuffle/0.spvasm
@@ -0,0 +1,68 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %4 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %5 RelaxedPrecision
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+    %float_0 = OpConstant %float 0
+         %15 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+    %float_1 = OpConstant %float 1
+    %v2float = OpTypeVector %float 2
+      %int_1 = OpConstant %int 1
+    %float_2 = OpConstant %float 2
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %21 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %22 = OpUndef %v2float
+         %23 = OpConstantNull %v4float
+       %main = OpFunction %void None %7
+         %24 = OpLabel
+               OpBranch %25
+         %25 = OpLabel
+         %26 = OpPhi %v2float %22 %24 %27 %28
+          %5 = OpPhi %int %int_2 %24 %4 %28
+         %29 = OpSLessThan %bool %5 %int_3
+               OpLoopMerge %30 %28 None
+               OpBranchConditional %29 %28 %30
+         %28 = OpLabel
+         %31 = OpConvertSToF %float %5
+         %32 = OpCompositeConstruct %v2float %float_1 %31
+         %27 = OpVectorShuffle %v2float %32 %23 0 1
+          %4 = OpIAdd %int %5 %int_1
+               OpBranch %25
+         %30 = OpLabel
+         %33 = OpCompositeExtract %float %26 0
+         %34 = OpFOrdNotEqual %bool %33 %float_1
+         %35 = OpLogicalNot %bool %34
+               OpSelectionMerge %36 None
+               OpBranchConditional %35 %37 %36
+         %37 = OpLabel
+         %38 = OpCompositeExtract %float %26 1
+         %39 = OpFOrdNotEqual %bool %38 %float_2
+               OpBranch %36
+         %36 = OpLabel
+         %40 = OpPhi %bool %34 %30 %39 %37
+               OpSelectionMerge %41 None
+               OpBranchConditional %40 %42 %43
+         %42 = OpLabel
+               OpStore %_GLF_color %15
+               OpBranch %41
+         %43 = OpLabel
+               OpStore %_GLF_color %21
+               OpBranch %41
+         %41 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-vector-shuffle/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-vector-shuffle/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..527fc4b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-vector-shuffle/0.spvasm.expected.hlsl
@@ -0,0 +1,54 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2 x_26 = float2(0.0f, 0.0f);
+  bool x_39 = false;
+  float2 x_26_phi = float2(0.0f, 0.0f);
+  int x_5_phi = 0;
+  bool x_40_phi = false;
+  x_26_phi = float2(0.0f, 0.0f);
+  x_5_phi = 2;
+  while (true) {
+    float2 x_27 = float2(0.0f, 0.0f);
+    int x_4 = 0;
+    x_26 = x_26_phi;
+    const int x_5 = x_5_phi;
+    if ((x_5 < 3)) {
+    } else {
+      break;
+    }
+    {
+      const float2 x_32 = float2(1.0f, float(x_5));
+      x_27 = float2(x_32.x, x_32.y);
+      x_4 = (x_5 + 1);
+      x_26_phi = x_27;
+      x_5_phi = x_4;
+    }
+  }
+  const bool x_34 = (x_26.x != 1.0f);
+  x_40_phi = x_34;
+  if (!(x_34)) {
+    x_39 = (x_26.y != 2.0f);
+    x_40_phi = x_39;
+  }
+  if (x_40_phi) {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  } else {
+    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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-vector-shuffle/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-vector-shuffle/0.spvasm.expected.msl
new file mode 100644
index 0000000..3a57b28
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-vector-shuffle/0.spvasm.expected.msl
@@ -0,0 +1,58 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  float2 x_26 = 0.0f;
+  bool x_39 = false;
+  float2 x_26_phi = 0.0f;
+  int x_5_phi = 0;
+  bool x_40_phi = false;
+  x_26_phi = float2(0.0f, 0.0f);
+  x_5_phi = 2;
+  while (true) {
+    float2 x_27 = 0.0f;
+    int x_4 = 0;
+    x_26 = x_26_phi;
+    int const x_5 = x_5_phi;
+    if ((x_5 < 3)) {
+    } else {
+      break;
+    }
+    {
+      float2 const x_32 = float2(1.0f, float(x_5));
+      x_27 = float2(x_32.x, x_32.y);
+      x_4 = (x_5 + 1);
+      x_26_phi = x_27;
+      x_5_phi = x_4;
+    }
+  }
+  bool const x_34 = (x_26.x != 1.0f);
+  x_40_phi = x_34;
+  if (!(x_34)) {
+    x_39 = (x_26.y != 2.0f);
+    x_40_phi = x_39;
+  }
+  bool const x_40 = x_40_phi;
+  if (x_40) {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  } else {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-vector-shuffle/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-vector-shuffle/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..5d950f1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-vector-shuffle/0.spvasm.expected.spvasm
@@ -0,0 +1,145 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 85
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_26 "x_26"
+               OpName %x_39 "x_39"
+               OpName %x_26_phi "x_26_phi"
+               OpName %x_5_phi "x_5_phi"
+               OpName %x_40_phi "x_40_phi"
+               OpName %x_27 "x_27"
+               OpName %x_4 "x_4"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %15 = OpConstantNull %v2float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %19 = OpConstantNull %bool
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %24 = OpConstantNull %int
+    %float_0 = OpConstant %float 0
+         %27 = OpConstantComposite %v2float %float_0 %float_0
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+    %float_1 = OpConstant %float 1
+      %int_1 = OpConstant %int 1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+    %float_2 = OpConstant %float 2
+         %71 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+         %72 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %73 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+       %x_26 = OpVariable %_ptr_Function_v2float Function %15
+       %x_39 = OpVariable %_ptr_Function_bool Function %19
+   %x_26_phi = OpVariable %_ptr_Function_v2float Function %15
+    %x_5_phi = OpVariable %_ptr_Function_int Function %24
+   %x_40_phi = OpVariable %_ptr_Function_bool Function %19
+       %x_27 = OpVariable %_ptr_Function_v2float Function %15
+        %x_4 = OpVariable %_ptr_Function_int Function %24
+               OpStore %x_26_phi %27
+               OpStore %x_5_phi %int_2
+               OpBranch %29
+         %29 = OpLabel
+               OpLoopMerge %30 %31 None
+               OpBranch %32
+         %32 = OpLabel
+         %35 = OpLoad %v2float %x_26_phi
+               OpStore %x_26 %35
+         %36 = OpLoad %int %x_5_phi
+         %38 = OpSLessThan %bool %36 %int_3
+               OpSelectionMerge %39 None
+               OpBranchConditional %38 %40 %41
+         %40 = OpLabel
+               OpBranch %39
+         %41 = OpLabel
+               OpBranch %30
+         %39 = OpLabel
+               OpBranch %31
+         %31 = OpLabel
+         %43 = OpConvertSToF %float %36
+         %44 = OpCompositeConstruct %v2float %float_1 %43
+         %45 = OpCompositeExtract %float %44 0
+         %46 = OpCompositeExtract %float %44 1
+         %47 = OpCompositeConstruct %v2float %45 %46
+               OpStore %x_27 %47
+         %49 = OpIAdd %int %36 %int_1
+               OpStore %x_4 %49
+         %50 = OpLoad %v2float %x_27
+               OpStore %x_26_phi %50
+         %51 = OpLoad %int %x_4
+               OpStore %x_5_phi %51
+               OpBranch %29
+         %30 = OpLabel
+         %55 = OpAccessChain %_ptr_Function_float %x_26 %uint_0
+         %56 = OpLoad %float %55
+         %57 = OpFOrdNotEqual %bool %56 %float_1
+               OpStore %x_40_phi %57
+         %58 = OpLogicalNot %bool %57
+               OpSelectionMerge %59 None
+               OpBranchConditional %58 %60 %59
+         %60 = OpLabel
+         %62 = OpAccessChain %_ptr_Function_float %x_26 %uint_1
+         %63 = OpLoad %float %62
+         %65 = OpFOrdNotEqual %bool %63 %float_2
+               OpStore %x_39 %65
+         %66 = OpLoad %bool %x_39
+               OpStore %x_40_phi %66
+               OpBranch %59
+         %59 = OpLabel
+         %67 = OpLoad %bool %x_40_phi
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %70
+         %69 = OpLabel
+               OpStore %x_GLF_color %71
+               OpBranch %68
+         %70 = OpLabel
+               OpStore %x_GLF_color %72
+               OpBranch %68
+         %68 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %73
+%tint_symbol = OpFunctionParameter %main_out
+         %77 = OpLabel
+         %78 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %78
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %80 = OpLabel
+         %81 = OpFunctionCall %void %main_1
+         %83 = OpLoad %v4float %x_GLF_color
+         %84 = OpCompositeConstruct %main_out %83
+         %82 = OpFunctionCall %void %tint_symbol_2 %84
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-vector-shuffle/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-vector-shuffle/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..2d4b641
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-vector-shuffle/0.spvasm.expected.wgsl
@@ -0,0 +1,53 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_26 : vec2<f32>;
+  var x_39 : bool;
+  var x_26_phi : vec2<f32>;
+  var x_5_phi : i32;
+  var x_40_phi : bool;
+  x_26_phi = vec2<f32>(0.0, 0.0);
+  x_5_phi = 2;
+  loop {
+    var x_27 : vec2<f32>;
+    var x_4 : i32;
+    x_26 = x_26_phi;
+    let x_5 : i32 = x_5_phi;
+    if ((x_5 < 3)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_32 : vec2<f32> = vec2<f32>(1.0, f32(x_5));
+      x_27 = vec2<f32>(x_32.x, x_32.y);
+      x_4 = (x_5 + 1);
+      x_26_phi = x_27;
+      x_5_phi = x_4;
+    }
+  }
+  let x_34 : bool = (x_26.x != 1.0);
+  x_40_phi = x_34;
+  if (!(x_34)) {
+    x_39 = (x_26.y != 2.0);
+    x_40_phi = x_39;
+  }
+  let x_40 : bool = x_40_phi;
+  if (x_40) {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-vector-shuffle/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-vector-shuffle/0.wgsl
new file mode 100644
index 0000000..2d4b641
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-vector-shuffle/0.wgsl
@@ -0,0 +1,53 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_26 : vec2<f32>;
+  var x_39 : bool;
+  var x_26_phi : vec2<f32>;
+  var x_5_phi : i32;
+  var x_40_phi : bool;
+  x_26_phi = vec2<f32>(0.0, 0.0);
+  x_5_phi = 2;
+  loop {
+    var x_27 : vec2<f32>;
+    var x_4 : i32;
+    x_26 = x_26_phi;
+    let x_5 : i32 = x_5_phi;
+    if ((x_5 < 3)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_32 : vec2<f32> = vec2<f32>(1.0, f32(x_5));
+      x_27 = vec2<f32>(x_32.x, x_32.y);
+      x_4 = (x_5 + 1);
+      x_26_phi = x_27;
+      x_5_phi = x_4;
+    }
+  }
+  let x_34 : bool = (x_26.x != 1.0);
+  x_40_phi = x_34;
+  if (!(x_34)) {
+    x_39 = (x_26.y != 2.0);
+    x_40_phi = x_39;
+  }
+  let x_40 : bool = x_40_phi;
+  if (x_40) {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-vector-shuffle/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-vector-shuffle/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..527fc4b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-vector-shuffle/0.wgsl.expected.hlsl
@@ -0,0 +1,54 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2 x_26 = float2(0.0f, 0.0f);
+  bool x_39 = false;
+  float2 x_26_phi = float2(0.0f, 0.0f);
+  int x_5_phi = 0;
+  bool x_40_phi = false;
+  x_26_phi = float2(0.0f, 0.0f);
+  x_5_phi = 2;
+  while (true) {
+    float2 x_27 = float2(0.0f, 0.0f);
+    int x_4 = 0;
+    x_26 = x_26_phi;
+    const int x_5 = x_5_phi;
+    if ((x_5 < 3)) {
+    } else {
+      break;
+    }
+    {
+      const float2 x_32 = float2(1.0f, float(x_5));
+      x_27 = float2(x_32.x, x_32.y);
+      x_4 = (x_5 + 1);
+      x_26_phi = x_27;
+      x_5_phi = x_4;
+    }
+  }
+  const bool x_34 = (x_26.x != 1.0f);
+  x_40_phi = x_34;
+  if (!(x_34)) {
+    x_39 = (x_26.y != 2.0f);
+    x_40_phi = x_39;
+  }
+  if (x_40_phi) {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  } else {
+    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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-vector-shuffle/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-vector-shuffle/0.wgsl.expected.msl
new file mode 100644
index 0000000..3a57b28
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-vector-shuffle/0.wgsl.expected.msl
@@ -0,0 +1,58 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  float2 x_26 = 0.0f;
+  bool x_39 = false;
+  float2 x_26_phi = 0.0f;
+  int x_5_phi = 0;
+  bool x_40_phi = false;
+  x_26_phi = float2(0.0f, 0.0f);
+  x_5_phi = 2;
+  while (true) {
+    float2 x_27 = 0.0f;
+    int x_4 = 0;
+    x_26 = x_26_phi;
+    int const x_5 = x_5_phi;
+    if ((x_5 < 3)) {
+    } else {
+      break;
+    }
+    {
+      float2 const x_32 = float2(1.0f, float(x_5));
+      x_27 = float2(x_32.x, x_32.y);
+      x_4 = (x_5 + 1);
+      x_26_phi = x_27;
+      x_5_phi = x_4;
+    }
+  }
+  bool const x_34 = (x_26.x != 1.0f);
+  x_40_phi = x_34;
+  if (!(x_34)) {
+    x_39 = (x_26.y != 2.0f);
+    x_40_phi = x_39;
+  }
+  bool const x_40 = x_40_phi;
+  if (x_40) {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  } else {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-vector-shuffle/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-vector-shuffle/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..5d950f1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-vector-shuffle/0.wgsl.expected.spvasm
@@ -0,0 +1,145 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 85
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_26 "x_26"
+               OpName %x_39 "x_39"
+               OpName %x_26_phi "x_26_phi"
+               OpName %x_5_phi "x_5_phi"
+               OpName %x_40_phi "x_40_phi"
+               OpName %x_27 "x_27"
+               OpName %x_4 "x_4"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %15 = OpConstantNull %v2float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %19 = OpConstantNull %bool
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %24 = OpConstantNull %int
+    %float_0 = OpConstant %float 0
+         %27 = OpConstantComposite %v2float %float_0 %float_0
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+    %float_1 = OpConstant %float 1
+      %int_1 = OpConstant %int 1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+    %float_2 = OpConstant %float 2
+         %71 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+         %72 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %73 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+       %x_26 = OpVariable %_ptr_Function_v2float Function %15
+       %x_39 = OpVariable %_ptr_Function_bool Function %19
+   %x_26_phi = OpVariable %_ptr_Function_v2float Function %15
+    %x_5_phi = OpVariable %_ptr_Function_int Function %24
+   %x_40_phi = OpVariable %_ptr_Function_bool Function %19
+       %x_27 = OpVariable %_ptr_Function_v2float Function %15
+        %x_4 = OpVariable %_ptr_Function_int Function %24
+               OpStore %x_26_phi %27
+               OpStore %x_5_phi %int_2
+               OpBranch %29
+         %29 = OpLabel
+               OpLoopMerge %30 %31 None
+               OpBranch %32
+         %32 = OpLabel
+         %35 = OpLoad %v2float %x_26_phi
+               OpStore %x_26 %35
+         %36 = OpLoad %int %x_5_phi
+         %38 = OpSLessThan %bool %36 %int_3
+               OpSelectionMerge %39 None
+               OpBranchConditional %38 %40 %41
+         %40 = OpLabel
+               OpBranch %39
+         %41 = OpLabel
+               OpBranch %30
+         %39 = OpLabel
+               OpBranch %31
+         %31 = OpLabel
+         %43 = OpConvertSToF %float %36
+         %44 = OpCompositeConstruct %v2float %float_1 %43
+         %45 = OpCompositeExtract %float %44 0
+         %46 = OpCompositeExtract %float %44 1
+         %47 = OpCompositeConstruct %v2float %45 %46
+               OpStore %x_27 %47
+         %49 = OpIAdd %int %36 %int_1
+               OpStore %x_4 %49
+         %50 = OpLoad %v2float %x_27
+               OpStore %x_26_phi %50
+         %51 = OpLoad %int %x_4
+               OpStore %x_5_phi %51
+               OpBranch %29
+         %30 = OpLabel
+         %55 = OpAccessChain %_ptr_Function_float %x_26 %uint_0
+         %56 = OpLoad %float %55
+         %57 = OpFOrdNotEqual %bool %56 %float_1
+               OpStore %x_40_phi %57
+         %58 = OpLogicalNot %bool %57
+               OpSelectionMerge %59 None
+               OpBranchConditional %58 %60 %59
+         %60 = OpLabel
+         %62 = OpAccessChain %_ptr_Function_float %x_26 %uint_1
+         %63 = OpLoad %float %62
+         %65 = OpFOrdNotEqual %bool %63 %float_2
+               OpStore %x_39 %65
+         %66 = OpLoad %bool %x_39
+               OpStore %x_40_phi %66
+               OpBranch %59
+         %59 = OpLabel
+         %67 = OpLoad %bool %x_40_phi
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %70
+         %69 = OpLabel
+               OpStore %x_GLF_color %71
+               OpBranch %68
+         %70 = OpLabel
+               OpStore %x_GLF_color %72
+               OpBranch %68
+         %68 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %73
+%tint_symbol = OpFunctionParameter %main_out
+         %77 = OpLabel
+         %78 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %78
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %80 = OpLabel
+         %81 = OpFunctionCall %void %main_1
+         %83 = OpLoad %v4float %x_GLF_color
+         %84 = OpCompositeConstruct %main_out %83
+         %82 = OpFunctionCall %void %tint_symbol_2 %84
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-vector-shuffle/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-vector-shuffle/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..2d4b641
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-vector-shuffle/0.wgsl.expected.wgsl
@@ -0,0 +1,53 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_26 : vec2<f32>;
+  var x_39 : bool;
+  var x_26_phi : vec2<f32>;
+  var x_5_phi : i32;
+  var x_40_phi : bool;
+  x_26_phi = vec2<f32>(0.0, 0.0);
+  x_5_phi = 2;
+  loop {
+    var x_27 : vec2<f32>;
+    var x_4 : i32;
+    x_26 = x_26_phi;
+    let x_5 : i32 = x_5_phi;
+    if ((x_5 < 3)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_32 : vec2<f32> = vec2<f32>(1.0, f32(x_5));
+      x_27 = vec2<f32>(x_32.x, x_32.y);
+      x_4 = (x_5 + 1);
+      x_26_phi = x_27;
+      x_5_phi = x_4;
+    }
+  }
+  let x_34 : bool = (x_26.x != 1.0);
+  x_40_phi = x_34;
+  if (!(x_34)) {
+    x_39 = (x_26.y != 2.0);
+    x_40_phi = x_39;
+  }
+  let x_40 : bool = x_40_phi;
+  if (x_40) {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-constant-folding-atan-over-tanh/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-constant-folding-atan-over-tanh/0-opt.spvasm
new file mode 100644
index 0000000..432d78b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-constant-folding-atan-over-tanh/0-opt.spvasm
@@ -0,0 +1,46 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %f "f"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %6 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_1 = OpConstant %float 1
+%float_0_910000026 = OpConstant %float 0.910000026
+       %bool = OpTypeBool
+%float_0_930000007 = OpConstant %float 0.930000007
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %16 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %17 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %6
+         %18 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function
+         %19 = OpExtInst %float %1 Tanh %float_1
+         %20 = OpExtInst %float %1 Atan2 %float_1 %19
+               OpStore %f %20
+         %21 = OpLoad %float %f
+         %22 = OpFOrdGreaterThan %bool %21 %float_0_910000026
+         %23 = OpLoad %float %f
+         %24 = OpFOrdLessThan %bool %23 %float_0_930000007
+         %25 = OpLogicalAnd %bool %22 %24
+               OpSelectionMerge %26 None
+               OpBranchConditional %25 %27 %28
+         %27 = OpLabel
+               OpStore %_GLF_color %16
+               OpBranch %26
+         %28 = OpLabel
+               OpStore %_GLF_color %17
+               OpBranch %26
+         %26 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-constant-folding-atan-over-tanh/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-constant-folding-atan-over-tanh/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..c627f2d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-constant-folding-atan-over-tanh/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,30 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float f = 0.0f;
+  f = atan2(1.0f, tanh(1.0f));
+  bool tint_tmp = (f > 0.910000026f);
+  if (tint_tmp) {
+    tint_tmp = (f < 0.930000007f);
+  }
+  if ((tint_tmp)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-constant-folding-atan-over-tanh/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-constant-folding-atan-over-tanh/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..2bef818
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-constant-folding-atan-over-tanh/0-opt.spvasm.expected.msl
@@ -0,0 +1,31 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  float f = 0.0f;
+  f = atan2(1.0f, tanh(1.0f));
+  float const x_21 = f;
+  float const x_23 = f;
+  if (((x_21 > 0.910000026f) && (x_23 < 0.930000007f))) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-constant-folding-atan-over-tanh/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-constant-folding-atan-over-tanh/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..b1523b5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-constant-folding-atan-over-tanh/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,83 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 47
+; Schema: 0
+               OpCapability Shader
+         %16 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %14 = OpConstantNull %float
+    %float_1 = OpConstant %float 1
+%float_0_910000026 = OpConstant %float 0.910000026
+       %bool = OpTypeBool
+%float_0_930000007 = OpConstant %float 0.930000007
+    %float_0 = OpConstant %float 0
+         %33 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %34 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %35 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %14
+         %18 = OpExtInst %float %16 Tanh %float_1
+         %15 = OpExtInst %float %16 Atan2 %float_1 %18
+               OpStore %f %15
+         %19 = OpLoad %float %f
+         %20 = OpLoad %float %f
+         %22 = OpFOrdGreaterThan %bool %19 %float_0_910000026
+               OpSelectionMerge %24 None
+               OpBranchConditional %22 %25 %24
+         %25 = OpLabel
+         %27 = OpFOrdLessThan %bool %20 %float_0_930000007
+               OpBranch %24
+         %24 = OpLabel
+         %28 = OpPhi %bool %22 %11 %27 %25
+               OpSelectionMerge %29 None
+               OpBranchConditional %28 %30 %31
+         %30 = OpLabel
+               OpStore %x_GLF_color %33
+               OpBranch %29
+         %31 = OpLabel
+               OpStore %x_GLF_color %34
+               OpBranch %29
+         %29 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %35
+%tint_symbol = OpFunctionParameter %main_out
+         %39 = OpLabel
+         %40 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %40
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %42 = OpLabel
+         %43 = OpFunctionCall %void %main_1
+         %45 = OpLoad %v4float %x_GLF_color
+         %46 = OpCompositeConstruct %main_out %45
+         %44 = OpFunctionCall %void %tint_symbol_2 %46
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-constant-folding-atan-over-tanh/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-constant-folding-atan-over-tanh/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..aa69903
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-constant-folding-atan-over-tanh/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,25 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  f = atan2(1.0, tanh(1.0));
+  let x_21 : f32 = f;
+  let x_23 : f32 = f;
+  if (((x_21 > 0.910000026) && (x_23 < 0.930000007))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-constant-folding-atan-over-tanh/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-constant-folding-atan-over-tanh/0-opt.wgsl
new file mode 100644
index 0000000..aa69903
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-constant-folding-atan-over-tanh/0-opt.wgsl
@@ -0,0 +1,25 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  f = atan2(1.0, tanh(1.0));
+  let x_21 : f32 = f;
+  let x_23 : f32 = f;
+  if (((x_21 > 0.910000026) && (x_23 < 0.930000007))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-constant-folding-atan-over-tanh/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-constant-folding-atan-over-tanh/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..c627f2d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-constant-folding-atan-over-tanh/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,30 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float f = 0.0f;
+  f = atan2(1.0f, tanh(1.0f));
+  bool tint_tmp = (f > 0.910000026f);
+  if (tint_tmp) {
+    tint_tmp = (f < 0.930000007f);
+  }
+  if ((tint_tmp)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-constant-folding-atan-over-tanh/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-constant-folding-atan-over-tanh/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..2bef818
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-constant-folding-atan-over-tanh/0-opt.wgsl.expected.msl
@@ -0,0 +1,31 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  float f = 0.0f;
+  f = atan2(1.0f, tanh(1.0f));
+  float const x_21 = f;
+  float const x_23 = f;
+  if (((x_21 > 0.910000026f) && (x_23 < 0.930000007f))) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-constant-folding-atan-over-tanh/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-constant-folding-atan-over-tanh/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..b1523b5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-constant-folding-atan-over-tanh/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,83 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 47
+; Schema: 0
+               OpCapability Shader
+         %16 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %14 = OpConstantNull %float
+    %float_1 = OpConstant %float 1
+%float_0_910000026 = OpConstant %float 0.910000026
+       %bool = OpTypeBool
+%float_0_930000007 = OpConstant %float 0.930000007
+    %float_0 = OpConstant %float 0
+         %33 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %34 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %35 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %14
+         %18 = OpExtInst %float %16 Tanh %float_1
+         %15 = OpExtInst %float %16 Atan2 %float_1 %18
+               OpStore %f %15
+         %19 = OpLoad %float %f
+         %20 = OpLoad %float %f
+         %22 = OpFOrdGreaterThan %bool %19 %float_0_910000026
+               OpSelectionMerge %24 None
+               OpBranchConditional %22 %25 %24
+         %25 = OpLabel
+         %27 = OpFOrdLessThan %bool %20 %float_0_930000007
+               OpBranch %24
+         %24 = OpLabel
+         %28 = OpPhi %bool %22 %11 %27 %25
+               OpSelectionMerge %29 None
+               OpBranchConditional %28 %30 %31
+         %30 = OpLabel
+               OpStore %x_GLF_color %33
+               OpBranch %29
+         %31 = OpLabel
+               OpStore %x_GLF_color %34
+               OpBranch %29
+         %29 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %35
+%tint_symbol = OpFunctionParameter %main_out
+         %39 = OpLabel
+         %40 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %40
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %42 = OpLabel
+         %43 = OpFunctionCall %void %main_1
+         %45 = OpLoad %v4float %x_GLF_color
+         %46 = OpCompositeConstruct %main_out %45
+         %44 = OpFunctionCall %void %tint_symbol_2 %46
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-constant-folding-atan-over-tanh/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-constant-folding-atan-over-tanh/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..aa69903
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-constant-folding-atan-over-tanh/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,25 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  f = atan2(1.0, tanh(1.0));
+  let x_21 : f32 = f;
+  let x_23 : f32 = f;
+  if (((x_21 > 0.910000026) && (x_23 < 0.930000007))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-constants-combine-add-sub/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-constants-combine-add-sub/0-opt.spvasm
new file mode 100644
index 0000000..69c2747
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-constants-combine-add-sub/0-opt.spvasm
@@ -0,0 +1,154 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %func_f1_ "func(f1;"
+               OpName %f "f"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %b "b"
+               OpName %i "i"
+               OpName %param "param"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_5 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+        %int = OpTypeInt 32 1
+         %18 = OpTypeFunction %int %_ptr_Function_float
+%_ptr_Function_int = OpTypePointer Function %int
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_int_uint_5 = OpTypeArray %int %uint_5
+       %buf0 = OpTypeStruct %_arr_int_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+      %int_4 = OpConstant %int 4
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+%float_0_699999988 = OpConstant %float 0.699999988
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %14
+         %33 = OpLabel
+      %param = OpVariable %_ptr_Function_float Function
+               OpStore %param %float_0_699999988
+         %34 = OpFunctionCall %int %func_f1_ %param
+         %35 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %36 = OpLoad %int %35
+         %37 = OpIEqual %bool %34 %36
+               OpSelectionMerge %38 None
+               OpBranchConditional %37 %39 %40
+         %39 = OpLabel
+         %41 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %42 = OpLoad %int %41
+         %43 = OpConvertSToF %float %42
+         %44 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %45 = OpLoad %int %44
+         %46 = OpConvertSToF %float %45
+         %47 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %48 = OpLoad %int %47
+         %49 = OpConvertSToF %float %48
+         %50 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %51 = OpLoad %int %50
+         %52 = OpConvertSToF %float %51
+         %53 = OpCompositeConstruct %v4float %43 %46 %49 %52
+               OpStore %_GLF_color %53
+               OpBranch %38
+         %40 = OpLabel
+         %54 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %55 = OpLoad %int %54
+         %56 = OpConvertSToF %float %55
+         %57 = OpCompositeConstruct %v4float %56 %56 %56 %56
+               OpStore %_GLF_color %57
+               OpBranch %38
+         %38 = OpLabel
+               OpReturn
+               OpFunctionEnd
+   %func_f1_ = OpFunction %int None %18
+          %f = OpFunctionParameter %_ptr_Function_float
+         %58 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+          %b = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+         %59 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %60 = OpLoad %int %59
+               OpStore %a %60
+         %61 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %62 = OpLoad %int %61
+               OpStore %b %62
+         %63 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %64 = OpLoad %int %63
+               OpStore %i %64
+               OpBranch %65
+         %65 = OpLabel
+               OpLoopMerge %66 %67 None
+               OpBranch %68
+         %68 = OpLabel
+         %69 = OpLoad %int %i
+         %70 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_4
+         %71 = OpLoad %int %70
+         %72 = OpSLessThan %bool %69 %71
+               OpBranchConditional %72 %73 %66
+         %73 = OpLabel
+         %74 = OpLoad %int %a
+         %75 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %76 = OpLoad %int %75
+         %77 = OpSGreaterThan %bool %74 %76
+               OpSelectionMerge %78 None
+               OpBranchConditional %77 %79 %78
+         %79 = OpLabel
+               OpBranch %66
+         %78 = OpLabel
+         %80 = OpLoad %float %f
+         %81 = OpConvertFToS %int %80
+         %82 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %83 = OpLoad %int %82
+         %84 = OpSDiv %int %83 %int_2
+         %85 = OpISub %int %81 %84
+         %86 = OpLoad %int %i
+         %87 = OpIAdd %int %85 %86
+               OpStore %a %87
+         %88 = OpLoad %int %b
+         %89 = OpIAdd %int %88 %int_1
+               OpStore %b %89
+               OpBranch %67
+         %67 = OpLabel
+         %90 = OpLoad %int %i
+         %91 = OpIAdd %int %90 %int_1
+               OpStore %i %91
+               OpBranch %65
+         %66 = OpLabel
+         %92 = OpLoad %int %b
+         %93 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %94 = OpLoad %int %93
+         %95 = OpIEqual %bool %92 %94
+               OpSelectionMerge %96 None
+               OpBranchConditional %95 %97 %98
+         %97 = OpLabel
+         %99 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+        %100 = OpLoad %int %99
+               OpReturnValue %100
+         %98 = OpLabel
+        %101 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+        %102 = OpLoad %int %101
+               OpReturnValue %102
+         %96 = OpLabel
+               OpUnreachable
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-constants-combine-add-sub/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-constants-combine-add-sub/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..b8364d7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-constants-combine-add-sub/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,80 @@
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[5];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+int func_f1_(inout float f) {
+  int a = 0;
+  int b = 0;
+  int i = 0;
+  const int x_60 = asint(x_8[1].x);
+  a = x_60;
+  const int x_62 = asint(x_8[2].x);
+  b = x_62;
+  const int x_64 = asint(x_8[2].x);
+  i = x_64;
+  while (true) {
+    const int x_69 = i;
+    const int x_71 = asint(x_8[4].x);
+    if ((x_69 < x_71)) {
+    } else {
+      break;
+    }
+    const int x_74 = a;
+    const int x_76 = asint(x_8[3].x);
+    if ((x_74 > x_76)) {
+      break;
+    }
+    const float x_80 = f;
+    const int x_83 = asint(x_8[1].x);
+    a = ((int(x_80) - (x_83 / 2)) + i);
+    b = (b + 1);
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_92 = b;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_94 = asint(x_8[scalar_offset / 4][scalar_offset % 4]);
+  if ((x_92 == x_94)) {
+    const int x_100 = asint(x_8[1].x);
+    return x_100;
+  } else {
+    const int x_102 = asint(x_8[2].x);
+    return x_102;
+  }
+  return 0;
+}
+
+void main_1() {
+  float param = 0.0f;
+  param = 0.699999988f;
+  const int x_34 = func_f1_(param);
+  const int x_36 = asint(x_8[1].x);
+  if ((x_34 == x_36)) {
+    const int x_42 = asint(x_8[1].x);
+    const int x_45 = asint(x_8[2].x);
+    const int x_48 = asint(x_8[2].x);
+    const int x_51 = asint(x_8[1].x);
+    x_GLF_color = float4(float(x_42), float(x_45), float(x_48), float(x_51));
+  } else {
+    const int x_55 = asint(x_8[2].x);
+    const float x_56 = float(x_55);
+    x_GLF_color = float4(x_56, x_56, x_56, x_56);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-constants-combine-add-sub/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-constants-combine-add-sub/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..e105e07
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-constants-combine-add-sub/0-opt.spvasm.expected.msl
@@ -0,0 +1,92 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[5];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int func_f1_(constant buf0& x_8, thread float* const f) {
+  int a = 0;
+  int b = 0;
+  int i = 0;
+  int const x_60 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  a = x_60;
+  int const x_62 = x_8.x_GLF_uniform_int_values.arr[2].el;
+  b = x_62;
+  int const x_64 = x_8.x_GLF_uniform_int_values.arr[2].el;
+  i = x_64;
+  while (true) {
+    int const x_69 = i;
+    int const x_71 = x_8.x_GLF_uniform_int_values.arr[4].el;
+    if ((x_69 < x_71)) {
+    } else {
+      break;
+    }
+    int const x_74 = a;
+    int const x_76 = x_8.x_GLF_uniform_int_values.arr[3].el;
+    if ((x_74 > x_76)) {
+      break;
+    }
+    float const x_80 = *(f);
+    int const x_83 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    int const x_86 = i;
+    a = ((int(x_80) - (x_83 / 2)) + x_86);
+    int const x_88 = b;
+    b = (x_88 + 1);
+    {
+      int const x_90 = i;
+      i = (x_90 + 1);
+    }
+  }
+  int const x_92 = b;
+  int const x_94 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  if ((x_92 == x_94)) {
+    int const x_100 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    return x_100;
+  } else {
+    int const x_102 = x_8.x_GLF_uniform_int_values.arr[2].el;
+    return x_102;
+  }
+  return 0;
+}
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_4) {
+  float param = 0.0f;
+  param = 0.699999988f;
+  int const x_34 = func_f1_(x_8, &(param));
+  int const x_36 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_34 == x_36)) {
+    int const x_42 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    int const x_45 = x_8.x_GLF_uniform_int_values.arr[2].el;
+    int const x_48 = x_8.x_GLF_uniform_int_values.arr[2].el;
+    int const x_51 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_42), float(x_45), float(x_48), float(x_51));
+  } else {
+    int const x_55 = x_8.x_GLF_uniform_int_values.arr[2].el;
+    float const x_56 = float(x_55);
+    *(tint_symbol_4) = float4(x_56, x_56, x_56, x_56);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-constants-combine-add-sub/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-constants-combine-add-sub/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..769deeb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-constants-combine-add-sub/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,193 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 124
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_f1_ "func_f1_"
+               OpName %f "f"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %i "i"
+               OpName %main_1 "main_1"
+               OpName %param "param"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_5 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_int_uint_5 = OpTypeArray %int %uint_5
+       %buf0 = OpTypeStruct %_arr_int_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+%_ptr_Function_float = OpTypePointer Function %float
+         %15 = OpTypeFunction %int %_ptr_Function_float
+%_ptr_Function_int = OpTypePointer Function %int
+         %22 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+      %int_4 = OpConstant %int 4
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+      %int_0 = OpConstant %int 0
+       %void = OpTypeVoid
+         %80 = OpTypeFunction %void
+         %85 = OpConstantNull %float
+%float_0_699999988 = OpConstant %float 0.699999988
+   %main_out = OpTypeStruct %v4float
+        %112 = OpTypeFunction %void %main_out
+   %func_f1_ = OpFunction %int None %15
+          %f = OpFunctionParameter %_ptr_Function_float
+         %19 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %22
+          %b = OpVariable %_ptr_Function_int Function %22
+          %i = OpVariable %_ptr_Function_int Function %22
+         %28 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %29 = OpLoad %int %28
+               OpStore %a %29
+         %31 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+         %32 = OpLoad %int %31
+               OpStore %b %32
+         %33 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+         %34 = OpLoad %int %33
+               OpStore %i %34
+               OpBranch %35
+         %35 = OpLabel
+               OpLoopMerge %36 %37 None
+               OpBranch %38
+         %38 = OpLabel
+         %39 = OpLoad %int %i
+         %41 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_4
+         %42 = OpLoad %int %41
+         %43 = OpSLessThan %bool %39 %42
+               OpSelectionMerge %45 None
+               OpBranchConditional %43 %46 %47
+         %46 = OpLabel
+               OpBranch %45
+         %47 = OpLabel
+               OpBranch %36
+         %45 = OpLabel
+         %48 = OpLoad %int %a
+         %50 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_3
+         %51 = OpLoad %int %50
+         %52 = OpSGreaterThan %bool %48 %51
+               OpSelectionMerge %53 None
+               OpBranchConditional %52 %54 %53
+         %54 = OpLabel
+               OpBranch %36
+         %53 = OpLabel
+         %56 = OpLoad %float %f
+         %57 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %58 = OpLoad %int %57
+         %59 = OpLoad %int %i
+         %60 = OpConvertFToS %int %56
+         %61 = OpSDiv %int %58 %int_2
+         %62 = OpISub %int %60 %61
+         %63 = OpIAdd %int %62 %59
+               OpStore %a %63
+         %64 = OpLoad %int %b
+         %65 = OpIAdd %int %64 %int_1
+               OpStore %b %65
+               OpBranch %37
+         %37 = OpLabel
+         %66 = OpLoad %int %i
+         %67 = OpIAdd %int %66 %int_1
+               OpStore %i %67
+               OpBranch %35
+         %36 = OpLabel
+         %68 = OpLoad %int %b
+         %70 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %71 = OpLoad %int %70
+         %72 = OpIEqual %bool %68 %71
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %74 %75
+         %74 = OpLabel
+         %76 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %77 = OpLoad %int %76
+               OpReturnValue %77
+         %75 = OpLabel
+         %78 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+         %79 = OpLoad %int %78
+               OpReturnValue %79
+         %73 = OpLabel
+               OpReturnValue %int_0
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %80
+         %83 = OpLabel
+      %param = OpVariable %_ptr_Function_float Function %85
+               OpStore %param %float_0_699999988
+         %87 = OpFunctionCall %int %func_f1_ %param
+         %89 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %90 = OpLoad %int %89
+         %91 = OpIEqual %bool %87 %90
+               OpSelectionMerge %92 None
+               OpBranchConditional %91 %93 %94
+         %93 = OpLabel
+         %95 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %96 = OpLoad %int %95
+         %97 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+         %98 = OpLoad %int %97
+         %99 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+        %100 = OpLoad %int %99
+        %101 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+        %102 = OpLoad %int %101
+        %103 = OpConvertSToF %float %96
+        %104 = OpConvertSToF %float %98
+        %105 = OpConvertSToF %float %100
+        %106 = OpConvertSToF %float %102
+        %107 = OpCompositeConstruct %v4float %103 %104 %105 %106
+               OpStore %x_GLF_color %107
+               OpBranch %92
+         %94 = OpLabel
+        %108 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+        %109 = OpLoad %int %108
+        %110 = OpConvertSToF %float %109
+        %111 = OpCompositeConstruct %v4float %110 %110 %110 %110
+               OpStore %x_GLF_color %111
+               OpBranch %92
+         %92 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %112
+%tint_symbol = OpFunctionParameter %main_out
+        %116 = OpLabel
+        %117 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %117
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %80
+        %119 = OpLabel
+        %120 = OpFunctionCall %void %main_1
+        %122 = OpLoad %v4float %x_GLF_color
+        %123 = OpCompositeConstruct %main_out %122
+        %121 = OpFunctionCall %void %tint_symbol_2 %123
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-constants-combine-add-sub/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-constants-combine-add-sub/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..e697708
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-constants-combine-add-sub/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,86 @@
+type Arr = [[stride(16)]] array<i32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_f1_(f : ptr<function, f32>) -> i32 {
+  var a : i32;
+  var b : i32;
+  var i : i32;
+  let x_60 : i32 = x_8.x_GLF_uniform_int_values[1];
+  a = x_60;
+  let x_62 : i32 = x_8.x_GLF_uniform_int_values[2];
+  b = x_62;
+  let x_64 : i32 = x_8.x_GLF_uniform_int_values[2];
+  i = x_64;
+  loop {
+    let x_69 : i32 = i;
+    let x_71 : i32 = x_8.x_GLF_uniform_int_values[4];
+    if ((x_69 < x_71)) {
+    } else {
+      break;
+    }
+    let x_74 : i32 = a;
+    let x_76 : i32 = x_8.x_GLF_uniform_int_values[3];
+    if ((x_74 > x_76)) {
+      break;
+    }
+    let x_80 : f32 = *(f);
+    let x_83 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_86 : i32 = i;
+    a = ((i32(x_80) - (x_83 / 2)) + x_86);
+    let x_88 : i32 = b;
+    b = (x_88 + 1);
+
+    continuing {
+      let x_90 : i32 = i;
+      i = (x_90 + 1);
+    }
+  }
+  let x_92 : i32 = b;
+  let x_94 : i32 = x_8.x_GLF_uniform_int_values[0];
+  if ((x_92 == x_94)) {
+    let x_100 : i32 = x_8.x_GLF_uniform_int_values[1];
+    return x_100;
+  } else {
+    let x_102 : i32 = x_8.x_GLF_uniform_int_values[2];
+    return x_102;
+  }
+  return 0;
+}
+
+fn main_1() {
+  var param : f32;
+  param = 0.699999988;
+  let x_34 : i32 = func_f1_(&(param));
+  let x_36 : i32 = x_8.x_GLF_uniform_int_values[1];
+  if ((x_34 == x_36)) {
+    let x_42 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_45 : i32 = x_8.x_GLF_uniform_int_values[2];
+    let x_48 : i32 = x_8.x_GLF_uniform_int_values[2];
+    let x_51 : i32 = x_8.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_42), f32(x_45), f32(x_48), f32(x_51));
+  } else {
+    let x_55 : i32 = x_8.x_GLF_uniform_int_values[2];
+    let x_56 : f32 = f32(x_55);
+    x_GLF_color = vec4<f32>(x_56, x_56, x_56, x_56);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-constants-combine-add-sub/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-constants-combine-add-sub/0-opt.wgsl
new file mode 100644
index 0000000..e697708
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-constants-combine-add-sub/0-opt.wgsl
@@ -0,0 +1,86 @@
+type Arr = [[stride(16)]] array<i32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_f1_(f : ptr<function, f32>) -> i32 {
+  var a : i32;
+  var b : i32;
+  var i : i32;
+  let x_60 : i32 = x_8.x_GLF_uniform_int_values[1];
+  a = x_60;
+  let x_62 : i32 = x_8.x_GLF_uniform_int_values[2];
+  b = x_62;
+  let x_64 : i32 = x_8.x_GLF_uniform_int_values[2];
+  i = x_64;
+  loop {
+    let x_69 : i32 = i;
+    let x_71 : i32 = x_8.x_GLF_uniform_int_values[4];
+    if ((x_69 < x_71)) {
+    } else {
+      break;
+    }
+    let x_74 : i32 = a;
+    let x_76 : i32 = x_8.x_GLF_uniform_int_values[3];
+    if ((x_74 > x_76)) {
+      break;
+    }
+    let x_80 : f32 = *(f);
+    let x_83 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_86 : i32 = i;
+    a = ((i32(x_80) - (x_83 / 2)) + x_86);
+    let x_88 : i32 = b;
+    b = (x_88 + 1);
+
+    continuing {
+      let x_90 : i32 = i;
+      i = (x_90 + 1);
+    }
+  }
+  let x_92 : i32 = b;
+  let x_94 : i32 = x_8.x_GLF_uniform_int_values[0];
+  if ((x_92 == x_94)) {
+    let x_100 : i32 = x_8.x_GLF_uniform_int_values[1];
+    return x_100;
+  } else {
+    let x_102 : i32 = x_8.x_GLF_uniform_int_values[2];
+    return x_102;
+  }
+  return 0;
+}
+
+fn main_1() {
+  var param : f32;
+  param = 0.699999988;
+  let x_34 : i32 = func_f1_(&(param));
+  let x_36 : i32 = x_8.x_GLF_uniform_int_values[1];
+  if ((x_34 == x_36)) {
+    let x_42 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_45 : i32 = x_8.x_GLF_uniform_int_values[2];
+    let x_48 : i32 = x_8.x_GLF_uniform_int_values[2];
+    let x_51 : i32 = x_8.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_42), f32(x_45), f32(x_48), f32(x_51));
+  } else {
+    let x_55 : i32 = x_8.x_GLF_uniform_int_values[2];
+    let x_56 : f32 = f32(x_55);
+    x_GLF_color = vec4<f32>(x_56, x_56, x_56, x_56);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-constants-combine-add-sub/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-constants-combine-add-sub/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..b8364d7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-constants-combine-add-sub/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,80 @@
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[5];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+int func_f1_(inout float f) {
+  int a = 0;
+  int b = 0;
+  int i = 0;
+  const int x_60 = asint(x_8[1].x);
+  a = x_60;
+  const int x_62 = asint(x_8[2].x);
+  b = x_62;
+  const int x_64 = asint(x_8[2].x);
+  i = x_64;
+  while (true) {
+    const int x_69 = i;
+    const int x_71 = asint(x_8[4].x);
+    if ((x_69 < x_71)) {
+    } else {
+      break;
+    }
+    const int x_74 = a;
+    const int x_76 = asint(x_8[3].x);
+    if ((x_74 > x_76)) {
+      break;
+    }
+    const float x_80 = f;
+    const int x_83 = asint(x_8[1].x);
+    a = ((int(x_80) - (x_83 / 2)) + i);
+    b = (b + 1);
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_92 = b;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_94 = asint(x_8[scalar_offset / 4][scalar_offset % 4]);
+  if ((x_92 == x_94)) {
+    const int x_100 = asint(x_8[1].x);
+    return x_100;
+  } else {
+    const int x_102 = asint(x_8[2].x);
+    return x_102;
+  }
+  return 0;
+}
+
+void main_1() {
+  float param = 0.0f;
+  param = 0.699999988f;
+  const int x_34 = func_f1_(param);
+  const int x_36 = asint(x_8[1].x);
+  if ((x_34 == x_36)) {
+    const int x_42 = asint(x_8[1].x);
+    const int x_45 = asint(x_8[2].x);
+    const int x_48 = asint(x_8[2].x);
+    const int x_51 = asint(x_8[1].x);
+    x_GLF_color = float4(float(x_42), float(x_45), float(x_48), float(x_51));
+  } else {
+    const int x_55 = asint(x_8[2].x);
+    const float x_56 = float(x_55);
+    x_GLF_color = float4(x_56, x_56, x_56, x_56);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-constants-combine-add-sub/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-constants-combine-add-sub/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..e105e07
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-constants-combine-add-sub/0-opt.wgsl.expected.msl
@@ -0,0 +1,92 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[5];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int func_f1_(constant buf0& x_8, thread float* const f) {
+  int a = 0;
+  int b = 0;
+  int i = 0;
+  int const x_60 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  a = x_60;
+  int const x_62 = x_8.x_GLF_uniform_int_values.arr[2].el;
+  b = x_62;
+  int const x_64 = x_8.x_GLF_uniform_int_values.arr[2].el;
+  i = x_64;
+  while (true) {
+    int const x_69 = i;
+    int const x_71 = x_8.x_GLF_uniform_int_values.arr[4].el;
+    if ((x_69 < x_71)) {
+    } else {
+      break;
+    }
+    int const x_74 = a;
+    int const x_76 = x_8.x_GLF_uniform_int_values.arr[3].el;
+    if ((x_74 > x_76)) {
+      break;
+    }
+    float const x_80 = *(f);
+    int const x_83 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    int const x_86 = i;
+    a = ((int(x_80) - (x_83 / 2)) + x_86);
+    int const x_88 = b;
+    b = (x_88 + 1);
+    {
+      int const x_90 = i;
+      i = (x_90 + 1);
+    }
+  }
+  int const x_92 = b;
+  int const x_94 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  if ((x_92 == x_94)) {
+    int const x_100 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    return x_100;
+  } else {
+    int const x_102 = x_8.x_GLF_uniform_int_values.arr[2].el;
+    return x_102;
+  }
+  return 0;
+}
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_4) {
+  float param = 0.0f;
+  param = 0.699999988f;
+  int const x_34 = func_f1_(x_8, &(param));
+  int const x_36 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_34 == x_36)) {
+    int const x_42 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    int const x_45 = x_8.x_GLF_uniform_int_values.arr[2].el;
+    int const x_48 = x_8.x_GLF_uniform_int_values.arr[2].el;
+    int const x_51 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_42), float(x_45), float(x_48), float(x_51));
+  } else {
+    int const x_55 = x_8.x_GLF_uniform_int_values.arr[2].el;
+    float const x_56 = float(x_55);
+    *(tint_symbol_4) = float4(x_56, x_56, x_56, x_56);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-constants-combine-add-sub/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-constants-combine-add-sub/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..769deeb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-constants-combine-add-sub/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,193 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 124
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_f1_ "func_f1_"
+               OpName %f "f"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %i "i"
+               OpName %main_1 "main_1"
+               OpName %param "param"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_5 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_int_uint_5 = OpTypeArray %int %uint_5
+       %buf0 = OpTypeStruct %_arr_int_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+%_ptr_Function_float = OpTypePointer Function %float
+         %15 = OpTypeFunction %int %_ptr_Function_float
+%_ptr_Function_int = OpTypePointer Function %int
+         %22 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+      %int_4 = OpConstant %int 4
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+      %int_0 = OpConstant %int 0
+       %void = OpTypeVoid
+         %80 = OpTypeFunction %void
+         %85 = OpConstantNull %float
+%float_0_699999988 = OpConstant %float 0.699999988
+   %main_out = OpTypeStruct %v4float
+        %112 = OpTypeFunction %void %main_out
+   %func_f1_ = OpFunction %int None %15
+          %f = OpFunctionParameter %_ptr_Function_float
+         %19 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %22
+          %b = OpVariable %_ptr_Function_int Function %22
+          %i = OpVariable %_ptr_Function_int Function %22
+         %28 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %29 = OpLoad %int %28
+               OpStore %a %29
+         %31 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+         %32 = OpLoad %int %31
+               OpStore %b %32
+         %33 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+         %34 = OpLoad %int %33
+               OpStore %i %34
+               OpBranch %35
+         %35 = OpLabel
+               OpLoopMerge %36 %37 None
+               OpBranch %38
+         %38 = OpLabel
+         %39 = OpLoad %int %i
+         %41 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_4
+         %42 = OpLoad %int %41
+         %43 = OpSLessThan %bool %39 %42
+               OpSelectionMerge %45 None
+               OpBranchConditional %43 %46 %47
+         %46 = OpLabel
+               OpBranch %45
+         %47 = OpLabel
+               OpBranch %36
+         %45 = OpLabel
+         %48 = OpLoad %int %a
+         %50 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_3
+         %51 = OpLoad %int %50
+         %52 = OpSGreaterThan %bool %48 %51
+               OpSelectionMerge %53 None
+               OpBranchConditional %52 %54 %53
+         %54 = OpLabel
+               OpBranch %36
+         %53 = OpLabel
+         %56 = OpLoad %float %f
+         %57 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %58 = OpLoad %int %57
+         %59 = OpLoad %int %i
+         %60 = OpConvertFToS %int %56
+         %61 = OpSDiv %int %58 %int_2
+         %62 = OpISub %int %60 %61
+         %63 = OpIAdd %int %62 %59
+               OpStore %a %63
+         %64 = OpLoad %int %b
+         %65 = OpIAdd %int %64 %int_1
+               OpStore %b %65
+               OpBranch %37
+         %37 = OpLabel
+         %66 = OpLoad %int %i
+         %67 = OpIAdd %int %66 %int_1
+               OpStore %i %67
+               OpBranch %35
+         %36 = OpLabel
+         %68 = OpLoad %int %b
+         %70 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %71 = OpLoad %int %70
+         %72 = OpIEqual %bool %68 %71
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %74 %75
+         %74 = OpLabel
+         %76 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %77 = OpLoad %int %76
+               OpReturnValue %77
+         %75 = OpLabel
+         %78 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+         %79 = OpLoad %int %78
+               OpReturnValue %79
+         %73 = OpLabel
+               OpReturnValue %int_0
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %80
+         %83 = OpLabel
+      %param = OpVariable %_ptr_Function_float Function %85
+               OpStore %param %float_0_699999988
+         %87 = OpFunctionCall %int %func_f1_ %param
+         %89 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %90 = OpLoad %int %89
+         %91 = OpIEqual %bool %87 %90
+               OpSelectionMerge %92 None
+               OpBranchConditional %91 %93 %94
+         %93 = OpLabel
+         %95 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %96 = OpLoad %int %95
+         %97 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+         %98 = OpLoad %int %97
+         %99 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+        %100 = OpLoad %int %99
+        %101 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+        %102 = OpLoad %int %101
+        %103 = OpConvertSToF %float %96
+        %104 = OpConvertSToF %float %98
+        %105 = OpConvertSToF %float %100
+        %106 = OpConvertSToF %float %102
+        %107 = OpCompositeConstruct %v4float %103 %104 %105 %106
+               OpStore %x_GLF_color %107
+               OpBranch %92
+         %94 = OpLabel
+        %108 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+        %109 = OpLoad %int %108
+        %110 = OpConvertSToF %float %109
+        %111 = OpCompositeConstruct %v4float %110 %110 %110 %110
+               OpStore %x_GLF_color %111
+               OpBranch %92
+         %92 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %112
+%tint_symbol = OpFunctionParameter %main_out
+        %116 = OpLabel
+        %117 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %117
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %80
+        %119 = OpLabel
+        %120 = OpFunctionCall %void %main_1
+        %122 = OpLoad %v4float %x_GLF_color
+        %123 = OpCompositeConstruct %main_out %122
+        %121 = OpFunctionCall %void %tint_symbol_2 %123
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-constants-combine-add-sub/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-constants-combine-add-sub/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..e697708
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-constants-combine-add-sub/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,86 @@
+type Arr = [[stride(16)]] array<i32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_f1_(f : ptr<function, f32>) -> i32 {
+  var a : i32;
+  var b : i32;
+  var i : i32;
+  let x_60 : i32 = x_8.x_GLF_uniform_int_values[1];
+  a = x_60;
+  let x_62 : i32 = x_8.x_GLF_uniform_int_values[2];
+  b = x_62;
+  let x_64 : i32 = x_8.x_GLF_uniform_int_values[2];
+  i = x_64;
+  loop {
+    let x_69 : i32 = i;
+    let x_71 : i32 = x_8.x_GLF_uniform_int_values[4];
+    if ((x_69 < x_71)) {
+    } else {
+      break;
+    }
+    let x_74 : i32 = a;
+    let x_76 : i32 = x_8.x_GLF_uniform_int_values[3];
+    if ((x_74 > x_76)) {
+      break;
+    }
+    let x_80 : f32 = *(f);
+    let x_83 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_86 : i32 = i;
+    a = ((i32(x_80) - (x_83 / 2)) + x_86);
+    let x_88 : i32 = b;
+    b = (x_88 + 1);
+
+    continuing {
+      let x_90 : i32 = i;
+      i = (x_90 + 1);
+    }
+  }
+  let x_92 : i32 = b;
+  let x_94 : i32 = x_8.x_GLF_uniform_int_values[0];
+  if ((x_92 == x_94)) {
+    let x_100 : i32 = x_8.x_GLF_uniform_int_values[1];
+    return x_100;
+  } else {
+    let x_102 : i32 = x_8.x_GLF_uniform_int_values[2];
+    return x_102;
+  }
+  return 0;
+}
+
+fn main_1() {
+  var param : f32;
+  param = 0.699999988;
+  let x_34 : i32 = func_f1_(&(param));
+  let x_36 : i32 = x_8.x_GLF_uniform_int_values[1];
+  if ((x_34 == x_36)) {
+    let x_42 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_45 : i32 = x_8.x_GLF_uniform_int_values[2];
+    let x_48 : i32 = x_8.x_GLF_uniform_int_values[2];
+    let x_51 : i32 = x_8.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_42), f32(x_45), f32(x_48), f32(x_51));
+  } else {
+    let x_55 : i32 = x_8.x_GLF_uniform_int_values[2];
+    let x_56 : f32 = f32(x_55);
+    x_GLF_color = vec4<f32>(x_56, x_56, x_56, x_56);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-constants-mix-uniform/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-constants-mix-uniform/0-opt.spvasm
new file mode 100644
index 0000000..f316c31
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-constants-mix-uniform/0-opt.spvasm
@@ -0,0 +1,66 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %mixed "mixed"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+    %float_1 = OpConstant %float 1
+         %13 = OpConstantComposite %v2float %float_1 %float_1
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+  %float_0_5 = OpConstant %float 0.5
+       %bool = OpTypeBool
+     %v2bool = OpTypeVector %bool 2
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_0 = OpConstant %float 0
+         %27 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %8
+         %28 = OpLabel
+      %mixed = OpVariable %_ptr_Function_v2float Function
+         %29 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+         %30 = OpLoad %v2float %29
+         %31 = OpCompositeConstruct %v2float %float_0_5 %float_0_5
+         %32 = OpExtInst %v2float %1 FMix %13 %30 %31
+               OpStore %mixed %32
+         %33 = OpLoad %v2float %mixed
+         %34 = OpFOrdEqual %v2bool %33 %13
+         %35 = OpAll %bool %34
+               OpSelectionMerge %36 None
+               OpBranchConditional %35 %37 %38
+         %37 = OpLabel
+         %39 = OpAccessChain %_ptr_Function_float %mixed %uint_0
+         %40 = OpLoad %float %39
+         %41 = OpCompositeConstruct %v4float %40 %float_0 %float_0 %float_1
+               OpStore %_GLF_color %41
+               OpBranch %36
+         %38 = OpLabel
+               OpStore %_GLF_color %27
+               OpBranch %36
+         %36 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-constants-mix-uniform/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-constants-mix-uniform/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..e67d2bc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-constants-mix-uniform/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,31 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2 mixed = float2(0.0f, 0.0f);
+  const float2 x_30 = asfloat(x_6[0].xy);
+  mixed = lerp(float2(1.0f, 1.0f), x_30, float2(0.5f, 0.5f));
+  if (all((mixed == float2(1.0f, 1.0f)))) {
+    const float x_40 = mixed.x;
+    x_GLF_color = float4(x_40, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-constants-mix-uniform/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-constants-mix-uniform/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..b48da79
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-constants-mix-uniform/0-opt.spvasm.expected.msl
@@ -0,0 +1,35 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float2 mixed = 0.0f;
+  float2 const x_30 = x_6.one;
+  mixed = mix(float2(1.0f, 1.0f), x_30, float2(0.5f, 0.5f));
+  float2 const x_33 = mixed;
+  if (all((x_33 == float2(1.0f, 1.0f)))) {
+    float const x_40 = mixed.x;
+    *(tint_symbol_4) = float4(x_40, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-constants-mix-uniform/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-constants-mix-uniform/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..cfefd60
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-constants-mix-uniform/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,97 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 56
+; Schema: 0
+               OpCapability Shader
+         %25 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %mixed "mixed"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %18 = OpConstantNull %v2float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_1 = OpConstant %float 1
+         %27 = OpConstantComposite %v2float %float_1 %float_1
+  %float_0_5 = OpConstant %float 0.5
+         %29 = OpConstantComposite %v2float %float_0_5 %float_0_5
+       %bool = OpTypeBool
+     %v2bool = OpTypeVector %bool 2
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_0 = OpConstant %float 0
+         %43 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %44 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+      %mixed = OpVariable %_ptr_Function_v2float Function %18
+         %22 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %23 = OpLoad %v2float %22
+         %24 = OpExtInst %v2float %25 FMix %27 %23 %29
+               OpStore %mixed %24
+         %30 = OpLoad %v2float %mixed
+         %33 = OpFOrdEqual %v2bool %30 %27
+         %31 = OpAll %bool %33
+               OpSelectionMerge %35 None
+               OpBranchConditional %31 %36 %37
+         %36 = OpLabel
+         %39 = OpAccessChain %_ptr_Function_float %mixed %uint_0
+         %40 = OpLoad %float %39
+         %42 = OpCompositeConstruct %v4float %40 %float_0 %float_0 %float_1
+               OpStore %x_GLF_color %42
+               OpBranch %35
+         %37 = OpLabel
+               OpStore %x_GLF_color %43
+               OpBranch %35
+         %35 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %44
+%tint_symbol = OpFunctionParameter %main_out
+         %48 = OpLabel
+         %49 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %49
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %51 = OpLabel
+         %52 = OpFunctionCall %void %main_1
+         %54 = OpLoad %v4float %x_GLF_color
+         %55 = OpCompositeConstruct %main_out %54
+         %53 = OpFunctionCall %void %tint_symbol_2 %55
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-constants-mix-uniform/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-constants-mix-uniform/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..04be2cd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-constants-mix-uniform/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,33 @@
+[[block]]
+struct buf0 {
+  one : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var mixed : vec2<f32>;
+  let x_30 : vec2<f32> = x_6.one;
+  mixed = mix(vec2<f32>(1.0, 1.0), x_30, vec2<f32>(0.5, 0.5));
+  let x_33 : vec2<f32> = mixed;
+  if (all((x_33 == vec2<f32>(1.0, 1.0)))) {
+    let x_40 : f32 = mixed.x;
+    x_GLF_color = vec4<f32>(x_40, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-constants-mix-uniform/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-constants-mix-uniform/0-opt.wgsl
new file mode 100644
index 0000000..04be2cd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-constants-mix-uniform/0-opt.wgsl
@@ -0,0 +1,33 @@
+[[block]]
+struct buf0 {
+  one : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var mixed : vec2<f32>;
+  let x_30 : vec2<f32> = x_6.one;
+  mixed = mix(vec2<f32>(1.0, 1.0), x_30, vec2<f32>(0.5, 0.5));
+  let x_33 : vec2<f32> = mixed;
+  if (all((x_33 == vec2<f32>(1.0, 1.0)))) {
+    let x_40 : f32 = mixed.x;
+    x_GLF_color = vec4<f32>(x_40, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-constants-mix-uniform/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-constants-mix-uniform/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..e67d2bc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-constants-mix-uniform/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,31 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2 mixed = float2(0.0f, 0.0f);
+  const float2 x_30 = asfloat(x_6[0].xy);
+  mixed = lerp(float2(1.0f, 1.0f), x_30, float2(0.5f, 0.5f));
+  if (all((mixed == float2(1.0f, 1.0f)))) {
+    const float x_40 = mixed.x;
+    x_GLF_color = float4(x_40, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-constants-mix-uniform/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-constants-mix-uniform/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..b48da79
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-constants-mix-uniform/0-opt.wgsl.expected.msl
@@ -0,0 +1,35 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float2 mixed = 0.0f;
+  float2 const x_30 = x_6.one;
+  mixed = mix(float2(1.0f, 1.0f), x_30, float2(0.5f, 0.5f));
+  float2 const x_33 = mixed;
+  if (all((x_33 == float2(1.0f, 1.0f)))) {
+    float const x_40 = mixed.x;
+    *(tint_symbol_4) = float4(x_40, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-constants-mix-uniform/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-constants-mix-uniform/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..cfefd60
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-constants-mix-uniform/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,97 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 56
+; Schema: 0
+               OpCapability Shader
+         %25 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %mixed "mixed"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %18 = OpConstantNull %v2float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_1 = OpConstant %float 1
+         %27 = OpConstantComposite %v2float %float_1 %float_1
+  %float_0_5 = OpConstant %float 0.5
+         %29 = OpConstantComposite %v2float %float_0_5 %float_0_5
+       %bool = OpTypeBool
+     %v2bool = OpTypeVector %bool 2
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_0 = OpConstant %float 0
+         %43 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %44 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+      %mixed = OpVariable %_ptr_Function_v2float Function %18
+         %22 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %23 = OpLoad %v2float %22
+         %24 = OpExtInst %v2float %25 FMix %27 %23 %29
+               OpStore %mixed %24
+         %30 = OpLoad %v2float %mixed
+         %33 = OpFOrdEqual %v2bool %30 %27
+         %31 = OpAll %bool %33
+               OpSelectionMerge %35 None
+               OpBranchConditional %31 %36 %37
+         %36 = OpLabel
+         %39 = OpAccessChain %_ptr_Function_float %mixed %uint_0
+         %40 = OpLoad %float %39
+         %42 = OpCompositeConstruct %v4float %40 %float_0 %float_0 %float_1
+               OpStore %x_GLF_color %42
+               OpBranch %35
+         %37 = OpLabel
+               OpStore %x_GLF_color %43
+               OpBranch %35
+         %35 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %44
+%tint_symbol = OpFunctionParameter %main_out
+         %48 = OpLabel
+         %49 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %49
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %51 = OpLabel
+         %52 = OpFunctionCall %void %main_1
+         %54 = OpLoad %v4float %x_GLF_color
+         %55 = OpCompositeConstruct %main_out %54
+         %53 = OpFunctionCall %void %tint_symbol_2 %55
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-constants-mix-uniform/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-constants-mix-uniform/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..04be2cd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-constants-mix-uniform/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,33 @@
+[[block]]
+struct buf0 {
+  one : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var mixed : vec2<f32>;
+  let x_30 : vec2<f32> = x_6.one;
+  mixed = mix(vec2<f32>(1.0, 1.0), x_30, vec2<f32>(0.5, 0.5));
+  let x_33 : vec2<f32> = mixed;
+  if (all((x_33 == vec2<f32>(1.0, 1.0)))) {
+    let x_40 : f32 = mixed.x;
+    x_GLF_color = vec4<f32>(x_40, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-continue-break-discard-return-in-loop/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-continue-break-discard-return-in-loop/0-opt.spvasm
new file mode 100644
index 0000000..89e69f3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-continue-break-discard-return-in-loop/0-opt.spvasm
@@ -0,0 +1,109 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "zero"
+               OpName %__0 ""
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %buf1 = OpTypeStruct %int
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+      %false = OpConstantFalse %bool
+       %main = OpFunction %void None %10
+         %26 = OpLabel
+         %27 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %28 = OpLoad %int %27
+         %29 = OpConvertSToF %float %28
+         %30 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %31 = OpLoad %int %30
+         %32 = OpConvertSToF %float %31
+         %33 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %34 = OpLoad %int %33
+         %35 = OpConvertSToF %float %34
+         %36 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %37 = OpLoad %int %36
+         %38 = OpConvertSToF %float %37
+         %39 = OpCompositeConstruct %v4float %29 %32 %35 %38
+               OpStore %_GLF_color %39
+               OpBranch %40
+         %40 = OpLabel
+               OpLoopMerge %41 %42 None
+               OpBranch %43
+         %43 = OpLabel
+         %44 = OpAccessChain %_ptr_Uniform_int %__0 %int_0
+         %45 = OpLoad %int %44
+         %46 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %47 = OpLoad %int %46
+         %48 = OpIEqual %bool %45 %47
+               OpSelectionMerge %49 None
+               OpBranchConditional %48 %50 %49
+         %50 = OpLabel
+               OpBranch %42
+         %49 = OpLabel
+         %51 = OpAccessChain %_ptr_Uniform_int %__0 %int_0
+         %52 = OpLoad %int %51
+         %53 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %54 = OpLoad %int %53
+         %55 = OpIEqual %bool %52 %54
+               OpSelectionMerge %56 None
+               OpBranchConditional %55 %57 %56
+         %57 = OpLabel
+               OpBranch %41
+         %56 = OpLabel
+         %58 = OpAccessChain %_ptr_Uniform_int %__0 %int_0
+         %59 = OpLoad %int %58
+         %60 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %61 = OpLoad %int %60
+         %62 = OpIEqual %bool %59 %61
+               OpSelectionMerge %63 None
+               OpBranchConditional %62 %64 %63
+         %64 = OpLabel
+               OpKill
+         %63 = OpLabel
+               OpReturn
+         %42 = OpLabel
+               OpBranchConditional %false %40 %41
+         %41 = OpLabel
+         %65 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %66 = OpLoad %int %65
+         %67 = OpConvertSToF %float %66
+         %68 = OpCompositeConstruct %v4float %67 %67 %67 %67
+               OpStore %_GLF_color %68
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-continue-break-discard-return-in-loop/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-continue-break-discard-return-in-loop/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..ad30a5c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-continue-break-discard-return-in-loop/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,66 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[4];
+};
+cbuffer cbuffer_x_7 : register(b1, space0) {
+  uint4 x_7[1];
+};
+
+void main_1() {
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_28 = asint(x_5[scalar_offset / 4][scalar_offset % 4]);
+  const int x_31 = asint(x_5[1].x);
+  const int x_34 = asint(x_5[1].x);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_37 = asint(x_5[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  x_GLF_color = float4(float(x_28), float(x_31), float(x_34), float(x_37));
+  while (true) {
+    const int x_45 = asint(x_7[0].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_47 = asint(x_5[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    if ((x_45 == x_47)) {
+      {
+        if (false) {
+        } else {
+          break;
+        }
+      }
+      continue;
+    }
+    const int x_52 = asint(x_7[0].x);
+    const int x_54 = asint(x_5[2].x);
+    if ((x_52 == x_54)) {
+      break;
+    }
+    const int x_59 = asint(x_7[0].x);
+    const int x_61 = asint(x_5[3].x);
+    if ((x_59 == x_61)) {
+      discard;
+    }
+    return;
+    {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  const int x_66 = asint(x_5[1].x);
+  const float x_67 = float(x_66);
+  x_GLF_color = float4(x_67, x_67, x_67, x_67);
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-continue-break-discard-return-in-loop/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-continue-break-discard-return-in-loop/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..fc4bcb7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-continue-break-discard-return-in-loop/0-opt.spvasm.expected.msl
@@ -0,0 +1,73 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct buf1 {
+  /* 0x0000 */ int zero;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, constant buf1& x_7, thread float4* const tint_symbol_4) {
+  int const x_28 = x_5.x_GLF_uniform_int_values.arr[0].el;
+  int const x_31 = x_5.x_GLF_uniform_int_values.arr[1].el;
+  int const x_34 = x_5.x_GLF_uniform_int_values.arr[1].el;
+  int const x_37 = x_5.x_GLF_uniform_int_values.arr[0].el;
+  *(tint_symbol_4) = float4(float(x_28), float(x_31), float(x_34), float(x_37));
+  while (true) {
+    int const x_45 = x_7.zero;
+    int const x_47 = x_5.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_45 == x_47)) {
+      {
+        if (false) {
+        } else {
+          break;
+        }
+      }
+      continue;
+    }
+    int const x_52 = x_7.zero;
+    int const x_54 = x_5.x_GLF_uniform_int_values.arr[2].el;
+    if ((x_52 == x_54)) {
+      break;
+    }
+    int const x_59 = x_7.zero;
+    int const x_61 = x_5.x_GLF_uniform_int_values.arr[3].el;
+    if ((x_59 == x_61)) {
+      discard_fragment();
+    }
+    return;
+    {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  int const x_66 = x_5.x_GLF_uniform_int_values.arr[1].el;
+  float const x_67 = float(x_66);
+  *(tint_symbol_4) = float4(x_67, x_67, x_67, x_67);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]], constant buf1& x_7 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-continue-break-discard-return-in-loop/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-continue-break-discard-return-in-loop/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..4c0d3dc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-continue-break-discard-return-in-loop/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,154 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 87
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_5 "x_5"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "zero"
+               OpName %x_7 "x_7"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+       %buf1 = OpTypeStruct %int
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_7 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+      %false = OpConstantFalse %bool
+   %main_out = OpTypeStruct %v4float
+         %75 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %18
+         %21 = OpLabel
+         %25 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %26 = OpLoad %int %25
+         %28 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %29 = OpLoad %int %28
+         %30 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %31 = OpLoad %int %30
+         %32 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %33 = OpLoad %int %32
+         %34 = OpConvertSToF %float %26
+         %35 = OpConvertSToF %float %29
+         %36 = OpConvertSToF %float %31
+         %37 = OpConvertSToF %float %33
+         %38 = OpCompositeConstruct %v4float %34 %35 %36 %37
+               OpStore %x_GLF_color %38
+               OpBranch %39
+         %39 = OpLabel
+               OpLoopMerge %40 %41 None
+               OpBranch %42
+         %42 = OpLabel
+         %43 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %44 = OpLoad %int %43
+         %45 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %46 = OpLoad %int %45
+         %47 = OpIEqual %bool %44 %46
+               OpSelectionMerge %49 None
+               OpBranchConditional %47 %50 %49
+         %50 = OpLabel
+               OpBranch %41
+         %49 = OpLabel
+         %51 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %52 = OpLoad %int %51
+         %54 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_2
+         %55 = OpLoad %int %54
+         %56 = OpIEqual %bool %52 %55
+               OpSelectionMerge %57 None
+               OpBranchConditional %56 %58 %57
+         %58 = OpLabel
+               OpBranch %40
+         %57 = OpLabel
+         %59 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %60 = OpLoad %int %59
+         %62 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_3
+         %63 = OpLoad %int %62
+         %64 = OpIEqual %bool %60 %63
+               OpSelectionMerge %65 None
+               OpBranchConditional %64 %66 %65
+         %66 = OpLabel
+               OpKill
+         %65 = OpLabel
+               OpReturn
+         %41 = OpLabel
+               OpSelectionMerge %68 None
+               OpBranchConditional %false %69 %70
+         %69 = OpLabel
+               OpBranch %68
+         %70 = OpLabel
+               OpBranch %40
+         %68 = OpLabel
+               OpBranch %39
+         %40 = OpLabel
+         %71 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %72 = OpLoad %int %71
+         %73 = OpConvertSToF %float %72
+         %74 = OpCompositeConstruct %v4float %73 %73 %73 %73
+               OpStore %x_GLF_color %74
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %75
+%tint_symbol = OpFunctionParameter %main_out
+         %79 = OpLabel
+         %80 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %80
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %18
+         %82 = OpLabel
+         %83 = OpFunctionCall %void %main_1
+         %85 = OpLoad %v4float %x_GLF_color
+         %86 = OpCompositeConstruct %main_out %85
+         %84 = OpFunctionCall %void %tint_symbol_2 %86
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 41[%41] is not post dominated by the back-edge block 68[%68]
+  %68 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-continue-break-discard-return-in-loop/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-continue-break-discard-return-in-loop/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..8e2cdde
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-continue-break-discard-return-in-loop/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,65 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[block]]
+struct buf1 {
+  zero : i32;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+fn main_1() {
+  let x_28 : i32 = x_5.x_GLF_uniform_int_values[0];
+  let x_31 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_34 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_37 : i32 = x_5.x_GLF_uniform_int_values[0];
+  x_GLF_color = vec4<f32>(f32(x_28), f32(x_31), f32(x_34), f32(x_37));
+  loop {
+    let x_45 : i32 = x_7.zero;
+    let x_47 : i32 = x_5.x_GLF_uniform_int_values[0];
+    if ((x_45 == x_47)) {
+      continue;
+    }
+    let x_52 : i32 = x_7.zero;
+    let x_54 : i32 = x_5.x_GLF_uniform_int_values[2];
+    if ((x_52 == x_54)) {
+      break;
+    }
+    let x_59 : i32 = x_7.zero;
+    let x_61 : i32 = x_5.x_GLF_uniform_int_values[3];
+    if ((x_59 == x_61)) {
+      discard;
+    }
+    return;
+
+    continuing {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_66 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_67 : f32 = f32(x_66);
+  x_GLF_color = vec4<f32>(x_67, x_67, x_67, x_67);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-continue-break-discard-return-in-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-continue-break-discard-return-in-loop/0-opt.wgsl
new file mode 100644
index 0000000..8e2cdde
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-continue-break-discard-return-in-loop/0-opt.wgsl
@@ -0,0 +1,65 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[block]]
+struct buf1 {
+  zero : i32;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+fn main_1() {
+  let x_28 : i32 = x_5.x_GLF_uniform_int_values[0];
+  let x_31 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_34 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_37 : i32 = x_5.x_GLF_uniform_int_values[0];
+  x_GLF_color = vec4<f32>(f32(x_28), f32(x_31), f32(x_34), f32(x_37));
+  loop {
+    let x_45 : i32 = x_7.zero;
+    let x_47 : i32 = x_5.x_GLF_uniform_int_values[0];
+    if ((x_45 == x_47)) {
+      continue;
+    }
+    let x_52 : i32 = x_7.zero;
+    let x_54 : i32 = x_5.x_GLF_uniform_int_values[2];
+    if ((x_52 == x_54)) {
+      break;
+    }
+    let x_59 : i32 = x_7.zero;
+    let x_61 : i32 = x_5.x_GLF_uniform_int_values[3];
+    if ((x_59 == x_61)) {
+      discard;
+    }
+    return;
+
+    continuing {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_66 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_67 : f32 = f32(x_66);
+  x_GLF_color = vec4<f32>(x_67, x_67, x_67, x_67);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-continue-break-discard-return-in-loop/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-continue-break-discard-return-in-loop/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..ad30a5c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-continue-break-discard-return-in-loop/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,66 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[4];
+};
+cbuffer cbuffer_x_7 : register(b1, space0) {
+  uint4 x_7[1];
+};
+
+void main_1() {
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_28 = asint(x_5[scalar_offset / 4][scalar_offset % 4]);
+  const int x_31 = asint(x_5[1].x);
+  const int x_34 = asint(x_5[1].x);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_37 = asint(x_5[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  x_GLF_color = float4(float(x_28), float(x_31), float(x_34), float(x_37));
+  while (true) {
+    const int x_45 = asint(x_7[0].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_47 = asint(x_5[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    if ((x_45 == x_47)) {
+      {
+        if (false) {
+        } else {
+          break;
+        }
+      }
+      continue;
+    }
+    const int x_52 = asint(x_7[0].x);
+    const int x_54 = asint(x_5[2].x);
+    if ((x_52 == x_54)) {
+      break;
+    }
+    const int x_59 = asint(x_7[0].x);
+    const int x_61 = asint(x_5[3].x);
+    if ((x_59 == x_61)) {
+      discard;
+    }
+    return;
+    {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  const int x_66 = asint(x_5[1].x);
+  const float x_67 = float(x_66);
+  x_GLF_color = float4(x_67, x_67, x_67, x_67);
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-continue-break-discard-return-in-loop/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-continue-break-discard-return-in-loop/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..fc4bcb7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-continue-break-discard-return-in-loop/0-opt.wgsl.expected.msl
@@ -0,0 +1,73 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct buf1 {
+  /* 0x0000 */ int zero;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, constant buf1& x_7, thread float4* const tint_symbol_4) {
+  int const x_28 = x_5.x_GLF_uniform_int_values.arr[0].el;
+  int const x_31 = x_5.x_GLF_uniform_int_values.arr[1].el;
+  int const x_34 = x_5.x_GLF_uniform_int_values.arr[1].el;
+  int const x_37 = x_5.x_GLF_uniform_int_values.arr[0].el;
+  *(tint_symbol_4) = float4(float(x_28), float(x_31), float(x_34), float(x_37));
+  while (true) {
+    int const x_45 = x_7.zero;
+    int const x_47 = x_5.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_45 == x_47)) {
+      {
+        if (false) {
+        } else {
+          break;
+        }
+      }
+      continue;
+    }
+    int const x_52 = x_7.zero;
+    int const x_54 = x_5.x_GLF_uniform_int_values.arr[2].el;
+    if ((x_52 == x_54)) {
+      break;
+    }
+    int const x_59 = x_7.zero;
+    int const x_61 = x_5.x_GLF_uniform_int_values.arr[3].el;
+    if ((x_59 == x_61)) {
+      discard_fragment();
+    }
+    return;
+    {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  int const x_66 = x_5.x_GLF_uniform_int_values.arr[1].el;
+  float const x_67 = float(x_66);
+  *(tint_symbol_4) = float4(x_67, x_67, x_67, x_67);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]], constant buf1& x_7 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-continue-break-discard-return-in-loop/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-continue-break-discard-return-in-loop/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..4c0d3dc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-continue-break-discard-return-in-loop/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,154 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 87
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_5 "x_5"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "zero"
+               OpName %x_7 "x_7"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+       %buf1 = OpTypeStruct %int
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_7 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+      %false = OpConstantFalse %bool
+   %main_out = OpTypeStruct %v4float
+         %75 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %18
+         %21 = OpLabel
+         %25 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %26 = OpLoad %int %25
+         %28 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %29 = OpLoad %int %28
+         %30 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %31 = OpLoad %int %30
+         %32 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %33 = OpLoad %int %32
+         %34 = OpConvertSToF %float %26
+         %35 = OpConvertSToF %float %29
+         %36 = OpConvertSToF %float %31
+         %37 = OpConvertSToF %float %33
+         %38 = OpCompositeConstruct %v4float %34 %35 %36 %37
+               OpStore %x_GLF_color %38
+               OpBranch %39
+         %39 = OpLabel
+               OpLoopMerge %40 %41 None
+               OpBranch %42
+         %42 = OpLabel
+         %43 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %44 = OpLoad %int %43
+         %45 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %46 = OpLoad %int %45
+         %47 = OpIEqual %bool %44 %46
+               OpSelectionMerge %49 None
+               OpBranchConditional %47 %50 %49
+         %50 = OpLabel
+               OpBranch %41
+         %49 = OpLabel
+         %51 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %52 = OpLoad %int %51
+         %54 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_2
+         %55 = OpLoad %int %54
+         %56 = OpIEqual %bool %52 %55
+               OpSelectionMerge %57 None
+               OpBranchConditional %56 %58 %57
+         %58 = OpLabel
+               OpBranch %40
+         %57 = OpLabel
+         %59 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %60 = OpLoad %int %59
+         %62 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_3
+         %63 = OpLoad %int %62
+         %64 = OpIEqual %bool %60 %63
+               OpSelectionMerge %65 None
+               OpBranchConditional %64 %66 %65
+         %66 = OpLabel
+               OpKill
+         %65 = OpLabel
+               OpReturn
+         %41 = OpLabel
+               OpSelectionMerge %68 None
+               OpBranchConditional %false %69 %70
+         %69 = OpLabel
+               OpBranch %68
+         %70 = OpLabel
+               OpBranch %40
+         %68 = OpLabel
+               OpBranch %39
+         %40 = OpLabel
+         %71 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %72 = OpLoad %int %71
+         %73 = OpConvertSToF %float %72
+         %74 = OpCompositeConstruct %v4float %73 %73 %73 %73
+               OpStore %x_GLF_color %74
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %75
+%tint_symbol = OpFunctionParameter %main_out
+         %79 = OpLabel
+         %80 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %80
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %18
+         %82 = OpLabel
+         %83 = OpFunctionCall %void %main_1
+         %85 = OpLoad %v4float %x_GLF_color
+         %86 = OpCompositeConstruct %main_out %85
+         %84 = OpFunctionCall %void %tint_symbol_2 %86
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 41[%41] is not post dominated by the back-edge block 68[%68]
+  %68 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-continue-break-discard-return-in-loop/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-continue-break-discard-return-in-loop/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..8e2cdde
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-continue-break-discard-return-in-loop/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,65 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[block]]
+struct buf1 {
+  zero : i32;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+fn main_1() {
+  let x_28 : i32 = x_5.x_GLF_uniform_int_values[0];
+  let x_31 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_34 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_37 : i32 = x_5.x_GLF_uniform_int_values[0];
+  x_GLF_color = vec4<f32>(f32(x_28), f32(x_31), f32(x_34), f32(x_37));
+  loop {
+    let x_45 : i32 = x_7.zero;
+    let x_47 : i32 = x_5.x_GLF_uniform_int_values[0];
+    if ((x_45 == x_47)) {
+      continue;
+    }
+    let x_52 : i32 = x_7.zero;
+    let x_54 : i32 = x_5.x_GLF_uniform_int_values[2];
+    if ((x_52 == x_54)) {
+      break;
+    }
+    let x_59 : i32 = x_7.zero;
+    let x_61 : i32 = x_5.x_GLF_uniform_int_values[3];
+    if ((x_59 == x_61)) {
+      discard;
+    }
+    return;
+
+    continuing {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_66 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_67 : f32 = f32(x_66);
+  x_GLF_color = vec4<f32>(x_67, x_67, x_67, x_67);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-func-argument/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-func-argument/0-opt.spvasm
new file mode 100644
index 0000000..ce81748
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-func-argument/0-opt.spvasm
@@ -0,0 +1,173 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %Array "Array"
+               OpMemberName %Array 0 "values"
+               OpName %func_struct_Array_i1_2_1_ "func(struct-Array-i1[2]1;"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %_ ""
+               OpName %param "param"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %Array 0 RelaxedPrecision
+               OpDecorate %func_struct_Array_i1_2_1_ RelaxedPrecision
+               OpMemberDecorate %buf0 0 RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %10 RelaxedPrecision
+               OpDecorate %11 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %12 RelaxedPrecision
+               OpDecorate %13 RelaxedPrecision
+               OpDecorate %14 RelaxedPrecision
+               OpDecorate %15 RelaxedPrecision
+               OpDecorate %16 RelaxedPrecision
+               OpDecorate %17 RelaxedPrecision
+               OpDecorate %18 RelaxedPrecision
+               OpDecorate %19 RelaxedPrecision
+               OpDecorate %20 RelaxedPrecision
+       %void = OpTypeVoid
+         %22 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+      %Array = OpTypeStruct %_arr_int_uint_2
+%_ptr_Function_Array = OpTypePointer Function %Array
+         %28 = OpTypeFunction %int %_ptr_Function_Array
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+      %int_0 = OpConstant %int 0
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %41 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %42 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+      %false = OpConstantFalse %bool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %45 = OpUndef %Array
+         %46 = OpUndef %int
+         %47 = OpUndef %bool
+         %48 = OpConstantNull %_arr_int_uint_2
+       %main = OpFunction %void None %22
+         %49 = OpLabel
+         %50 = OpVariable %_ptr_Function_bool Function %false
+         %15 = OpVariable %_ptr_Function_int Function
+         %16 = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_Array Function
+               OpStore %param %45
+               OpStore %50 %false
+               OpBranch %51
+         %51 = OpLabel
+               OpLoopMerge %52 %53 None
+               OpBranch %54
+         %54 = OpLabel
+               OpLoopMerge %55 %56 None
+               OpBranch %57
+         %57 = OpLabel
+         %58 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %17 = OpLoad %int %58
+         %59 = OpAccessChain %_ptr_Function_int %param %int_0 %17
+         %18 = OpLoad %int %59
+         %60 = OpIEqual %bool %18 %int_1
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %61
+         %62 = OpLabel
+               OpStore %50 %true
+               OpStore %15 %int_1
+               OpBranch %55
+         %61 = OpLabel
+               OpBranch %55
+         %56 = OpLabel
+               OpBranch %54
+         %55 = OpLabel
+         %19 = OpPhi %int %int_1 %62 %46 %61
+         %63 = OpPhi %bool %true %62 %false %61
+               OpSelectionMerge %64 None
+               OpBranchConditional %63 %52 %64
+         %64 = OpLabel
+               OpStore %50 %true
+               OpStore %15 %int_1
+               OpBranch %52
+         %53 = OpLabel
+               OpBranch %51
+         %52 = OpLabel
+         %20 = OpPhi %int %19 %55 %int_1 %64
+               OpStore %16 %20
+         %65 = OpIEqual %bool %20 %int_1
+               OpSelectionMerge %66 None
+               OpBranchConditional %65 %67 %68
+         %68 = OpLabel
+               OpStore %_GLF_color %42
+               OpBranch %66
+         %67 = OpLabel
+               OpStore %_GLF_color %41
+               OpBranch %66
+         %66 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%func_struct_Array_i1_2_1_ = OpFunction %int None %28
+          %a = OpFunctionParameter %_ptr_Function_Array
+         %69 = OpLabel
+         %70 = OpVariable %_ptr_Function_bool Function %false
+         %12 = OpVariable %_ptr_Function_int Function
+               OpBranch %71
+         %71 = OpLabel
+         %72 = OpPhi %bool %false %69 %47 %73
+               OpLoopMerge %74 %73 None
+               OpBranch %75
+         %75 = OpLabel
+               OpBranch %76
+         %76 = OpLabel
+         %77 = OpPhi %bool %72 %75 %47 %78
+               OpLoopMerge %79 %78 None
+               OpBranch %80
+         %80 = OpLabel
+               OpBranch %81
+         %81 = OpLabel
+         %82 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %10 = OpLoad %int %82
+         %83 = OpAccessChain %_ptr_Function_int %a %int_0 %10
+         %11 = OpLoad %int %83
+         %84 = OpIEqual %bool %11 %int_1
+               OpSelectionMerge %85 None
+               OpBranchConditional %84 %86 %85
+         %86 = OpLabel
+               OpStore %70 %true
+               OpStore %12 %int_1
+               OpBranch %79
+         %85 = OpLabel
+               OpBranch %79
+         %78 = OpLabel
+               OpBranch %76
+         %79 = OpLabel
+         %13 = OpPhi %int %int_1 %86 %46 %85
+         %87 = OpPhi %bool %true %86 %77 %85
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %74 %88
+         %88 = OpLabel
+               OpStore %70 %true
+               OpStore %12 %int_1
+               OpBranch %74
+         %73 = OpLabel
+               OpBranch %71
+         %74 = OpLabel
+         %14 = OpPhi %int %13 %79 %int_1 %88
+               OpReturnValue %14
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-func-argument/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-func-argument/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..fc32950
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-func-argument/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,119 @@
+struct Array {
+  int values[2];
+};
+
+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);
+
+void main_1() {
+  bool x_50 = false;
+  int x_15 = 0;
+  int x_16 = 0;
+  Array param = (Array)0;
+  int x_19 = 0;
+  int x_20_phi = 0;
+  const int tint_symbol_3[2] = {0, 0};
+  const Array tint_symbol_4 = {tint_symbol_3};
+  param = tint_symbol_4;
+  x_50 = false;
+  while (true) {
+    int x_19_phi = 0;
+    bool x_63_phi = false;
+    while (true) {
+      const int x_17 = asint(x_8[0].x);
+      const int x_18 = param.values[x_17];
+      if ((x_18 == 1)) {
+        x_50 = true;
+        x_15 = 1;
+        x_19_phi = 1;
+        x_63_phi = true;
+        break;
+      }
+      x_19_phi = 0;
+      x_63_phi = false;
+      break;
+    }
+    x_19 = x_19_phi;
+    const bool x_63 = x_63_phi;
+    x_20_phi = x_19;
+    if (x_63) {
+      break;
+    }
+    x_50 = true;
+    x_15 = 1;
+    x_20_phi = 1;
+    break;
+  }
+  const int x_20 = x_20_phi;
+  x_16 = x_20;
+  if ((x_20 == 1)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
+int func_struct_Array_i1_2_1_(inout Array a) {
+  bool x_70 = false;
+  int x_12 = 0;
+  int x_13 = 0;
+  bool x_72_phi = false;
+  int x_14_phi = 0;
+  x_72_phi = false;
+  while (true) {
+    bool x_77 = false;
+    bool x_77_phi = false;
+    int x_13_phi = 0;
+    bool x_87_phi = false;
+    x_77_phi = x_72_phi;
+    while (true) {
+      x_77 = x_77_phi;
+      const int x_10 = asint(x_8[0].x);
+      const int x_11 = a.values[x_10];
+      if ((x_11 == 1)) {
+        x_70 = true;
+        x_12 = 1;
+        x_13_phi = 1;
+        x_87_phi = true;
+        break;
+      }
+      x_13_phi = 0;
+      x_87_phi = x_77;
+      break;
+      {
+        x_77_phi = false;
+      }
+    }
+    x_13 = x_13_phi;
+    const bool x_87 = x_87_phi;
+    x_14_phi = x_13;
+    if (x_87) {
+      break;
+    }
+    x_70 = true;
+    x_12 = 1;
+    x_14_phi = 1;
+    break;
+    {
+      x_72_phi = false;
+    }
+  }
+  return x_14_phi;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-func-argument/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-func-argument/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..a3005e8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-func-argument/0-opt.spvasm.expected.msl
@@ -0,0 +1,126 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  int arr[2];
+};
+struct Array {
+  tint_array_wrapper values;
+};
+struct buf0 {
+  /* 0x0000 */ int zero;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_6) {
+  bool x_50 = false;
+  int x_15 = 0;
+  int x_16 = 0;
+  Array param = {};
+  int x_19 = 0;
+  int x_20_phi = 0;
+  tint_array_wrapper const tint_symbol_3 = {.arr={0, 0}};
+  Array const tint_symbol_4 = {.values=tint_symbol_3};
+  param = tint_symbol_4;
+  x_50 = false;
+  while (true) {
+    int x_19_phi = 0;
+    bool x_63_phi = false;
+    while (true) {
+      int const x_17 = x_8.zero;
+      int const x_18 = param.values.arr[x_17];
+      if ((x_18 == 1)) {
+        x_50 = true;
+        x_15 = 1;
+        x_19_phi = 1;
+        x_63_phi = true;
+        break;
+      }
+      x_19_phi = 0;
+      x_63_phi = false;
+      break;
+    }
+    x_19 = x_19_phi;
+    bool const x_63 = x_63_phi;
+    x_20_phi = x_19;
+    if (x_63) {
+      break;
+    }
+    x_50 = true;
+    x_15 = 1;
+    x_20_phi = 1;
+    break;
+  }
+  int const x_20 = x_20_phi;
+  x_16 = x_20;
+  if ((x_20 == 1)) {
+    *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_6) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  main_1(x_8, &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
+int func_struct_Array_i1_2_1_(constant buf0& x_8, thread Array* const a) {
+  bool x_70 = false;
+  int x_12 = 0;
+  int x_13 = 0;
+  bool x_72_phi = false;
+  int x_14_phi = 0;
+  x_72_phi = false;
+  while (true) {
+    bool x_77 = false;
+    bool x_77_phi = false;
+    int x_13_phi = 0;
+    bool x_87_phi = false;
+    bool const x_72 = x_72_phi;
+    x_77_phi = x_72;
+    while (true) {
+      x_77 = x_77_phi;
+      int const x_10 = x_8.zero;
+      int const x_11 = (*(a)).values.arr[x_10];
+      if ((x_11 == 1)) {
+        x_70 = true;
+        x_12 = 1;
+        x_13_phi = 1;
+        x_87_phi = true;
+        break;
+      }
+      x_13_phi = 0;
+      x_87_phi = x_77;
+      break;
+      {
+        x_77_phi = false;
+      }
+    }
+    x_13 = x_13_phi;
+    bool const x_87 = x_87_phi;
+    x_14_phi = x_13;
+    if (x_87) {
+      break;
+    }
+    x_70 = true;
+    x_12 = 1;
+    x_14_phi = 1;
+    break;
+    {
+      x_72_phi = false;
+    }
+  }
+  int const x_14 = x_14_phi;
+  return x_14;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-func-argument/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-func-argument/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..b34c579
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-func-argument/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,249 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 122
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_50 "x_50"
+               OpName %x_15 "x_15"
+               OpName %x_16 "x_16"
+               OpName %Array "Array"
+               OpMemberName %Array 0 "values"
+               OpName %param "param"
+               OpName %x_19 "x_19"
+               OpName %x_20_phi "x_20_phi"
+               OpName %x_19_phi "x_19_phi"
+               OpName %x_63_phi "x_63_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpName %func_struct_Array_i1_2_1_ "func_struct_Array_i1_2_1_"
+               OpName %a "a"
+               OpName %x_70 "x_70"
+               OpName %x_12 "x_12"
+               OpName %x_13 "x_13"
+               OpName %x_72_phi "x_72_phi"
+               OpName %x_14_phi "x_14_phi"
+               OpName %x_77 "x_77"
+               OpName %x_77_phi "x_77_phi"
+               OpName %x_13_phi "x_13_phi"
+               OpName %x_87_phi "x_87_phi"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %Array 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %20 = OpConstantNull %bool
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+      %Array = OpTypeStruct %_arr_int_uint_2
+%_ptr_Function_Array = OpTypePointer Function %Array
+         %31 = OpConstantNull %Array
+      %int_0 = OpConstant %int 0
+         %35 = OpConstantComposite %_arr_int_uint_2 %int_0 %int_0
+         %36 = OpConstantComposite %Array %35
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %true = OpConstantTrue %bool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %70 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %71 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %72 = OpTypeFunction %void %main_out
+         %84 = OpTypeFunction %int %_ptr_Function_Array
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+       %x_50 = OpVariable %_ptr_Function_bool Function %20
+       %x_15 = OpVariable %_ptr_Function_int Function %23
+       %x_16 = OpVariable %_ptr_Function_int Function %23
+      %param = OpVariable %_ptr_Function_Array Function %31
+       %x_19 = OpVariable %_ptr_Function_int Function %23
+   %x_20_phi = OpVariable %_ptr_Function_int Function %23
+   %x_19_phi = OpVariable %_ptr_Function_int Function %23
+   %x_63_phi = OpVariable %_ptr_Function_bool Function %20
+               OpStore %x_50 %false
+               OpStore %param %36
+               OpStore %x_50 %false
+               OpBranch %37
+         %37 = OpLabel
+               OpLoopMerge %38 %39 None
+               OpBranch %40
+         %40 = OpLabel
+               OpBranch %43
+         %43 = OpLabel
+               OpLoopMerge %44 %45 None
+               OpBranch %46
+         %46 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0
+         %50 = OpLoad %int %49
+         %51 = OpAccessChain %_ptr_Function_int %param %uint_0 %50
+         %52 = OpLoad %int %51
+         %54 = OpIEqual %bool %52 %int_1
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %55
+         %56 = OpLabel
+               OpStore %x_50 %true
+               OpStore %x_15 %int_1
+               OpStore %x_19_phi %int_1
+               OpStore %x_63_phi %true
+               OpBranch %44
+         %55 = OpLabel
+               OpStore %x_19_phi %int_0
+               OpStore %x_63_phi %false
+               OpBranch %44
+         %45 = OpLabel
+               OpBranch %43
+         %44 = OpLabel
+         %58 = OpLoad %int %x_19_phi
+               OpStore %x_19 %58
+         %59 = OpLoad %bool %x_63_phi
+         %60 = OpLoad %int %x_19
+               OpStore %x_20_phi %60
+               OpSelectionMerge %61 None
+               OpBranchConditional %59 %62 %61
+         %62 = OpLabel
+               OpBranch %38
+         %61 = OpLabel
+               OpStore %x_50 %true
+               OpStore %x_15 %int_1
+               OpStore %x_20_phi %int_1
+               OpBranch %38
+         %39 = OpLabel
+               OpBranch %37
+         %38 = OpLabel
+         %63 = OpLoad %int %x_20_phi
+               OpStore %x_16 %63
+         %64 = OpIEqual %bool %63 %int_1
+               OpSelectionMerge %65 None
+               OpBranchConditional %64 %66 %67
+         %66 = OpLabel
+               OpStore %x_GLF_color %70
+               OpBranch %65
+         %67 = OpLabel
+               OpStore %x_GLF_color %71
+               OpBranch %65
+         %65 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %72
+%tint_symbol = OpFunctionParameter %main_out
+         %76 = OpLabel
+         %77 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %77
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %79 = OpLabel
+         %80 = OpFunctionCall %void %main_1
+         %82 = OpLoad %v4float %x_GLF_color
+         %83 = OpCompositeConstruct %main_out %82
+         %81 = OpFunctionCall %void %tint_symbol_2 %83
+               OpReturn
+               OpFunctionEnd
+%func_struct_Array_i1_2_1_ = OpFunction %int None %84
+          %a = OpFunctionParameter %_ptr_Function_Array
+         %87 = OpLabel
+       %x_70 = OpVariable %_ptr_Function_bool Function %20
+       %x_12 = OpVariable %_ptr_Function_int Function %23
+       %x_13 = OpVariable %_ptr_Function_int Function %23
+   %x_72_phi = OpVariable %_ptr_Function_bool Function %20
+   %x_14_phi = OpVariable %_ptr_Function_int Function %23
+       %x_77 = OpVariable %_ptr_Function_bool Function %20
+   %x_77_phi = OpVariable %_ptr_Function_bool Function %20
+   %x_13_phi = OpVariable %_ptr_Function_int Function %23
+   %x_87_phi = OpVariable %_ptr_Function_bool Function %20
+               OpStore %x_70 %false
+               OpStore %x_72_phi %false
+               OpBranch %93
+         %93 = OpLabel
+               OpLoopMerge %94 %95 None
+               OpBranch %96
+         %96 = OpLabel
+        %101 = OpLoad %bool %x_72_phi
+               OpStore %x_77_phi %101
+               OpBranch %102
+        %102 = OpLabel
+               OpLoopMerge %103 %104 None
+               OpBranch %105
+        %105 = OpLabel
+        %106 = OpLoad %bool %x_77_phi
+               OpStore %x_77 %106
+        %107 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0
+        %108 = OpLoad %int %107
+        %110 = OpAccessChain %_ptr_Function_int %a %uint_0 %108
+        %111 = OpLoad %int %110
+        %112 = OpIEqual %bool %111 %int_1
+               OpSelectionMerge %113 None
+               OpBranchConditional %112 %114 %113
+        %114 = OpLabel
+               OpStore %x_70 %true
+               OpStore %x_12 %int_1
+               OpStore %x_13_phi %int_1
+               OpStore %x_87_phi %true
+               OpBranch %103
+        %113 = OpLabel
+               OpStore %x_13_phi %int_0
+        %115 = OpLoad %bool %x_77
+               OpStore %x_87_phi %115
+               OpBranch %103
+        %104 = OpLabel
+               OpStore %x_77_phi %false
+               OpBranch %102
+        %103 = OpLabel
+        %116 = OpLoad %int %x_13_phi
+               OpStore %x_13 %116
+        %117 = OpLoad %bool %x_87_phi
+        %118 = OpLoad %int %x_13
+               OpStore %x_14_phi %118
+               OpSelectionMerge %119 None
+               OpBranchConditional %117 %120 %119
+        %120 = OpLabel
+               OpBranch %94
+        %119 = OpLabel
+               OpStore %x_70 %true
+               OpStore %x_12 %int_1
+               OpStore %x_14_phi %int_1
+               OpBranch %94
+         %95 = OpLabel
+               OpStore %x_72_phi %false
+               OpBranch %93
+         %94 = OpLabel
+        %121 = OpLoad %int %x_14_phi
+               OpReturnValue %121
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-func-argument/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-func-argument/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..c3fe68b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-func-argument/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,122 @@
+struct Array {
+  values : array<i32, 2>;
+};
+
+[[block]]
+struct buf0 {
+  zero : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_50 : bool = false;
+  var x_15 : i32;
+  var x_16 : i32;
+  var param : Array;
+  var x_19 : i32;
+  var x_20_phi : i32;
+  param = Array(array<i32, 2>(0, 0));
+  x_50 = false;
+  loop {
+    var x_19_phi : i32;
+    var x_63_phi : bool;
+    loop {
+      let x_17 : i32 = x_8.zero;
+      let x_18 : i32 = param.values[x_17];
+      if ((x_18 == 1)) {
+        x_50 = true;
+        x_15 = 1;
+        x_19_phi = 1;
+        x_63_phi = true;
+        break;
+      }
+      x_19_phi = 0;
+      x_63_phi = false;
+      break;
+    }
+    x_19 = x_19_phi;
+    let x_63 : bool = x_63_phi;
+    x_20_phi = x_19;
+    if (x_63) {
+      break;
+    }
+    x_50 = true;
+    x_15 = 1;
+    x_20_phi = 1;
+    break;
+  }
+  let x_20 : i32 = x_20_phi;
+  x_16 = x_20;
+  if ((x_20 == 1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+fn func_struct_Array_i1_2_1_(a : ptr<function, Array>) -> i32 {
+  var x_70 : bool = false;
+  var x_12 : i32;
+  var x_13 : i32;
+  var x_72_phi : bool;
+  var x_14_phi : i32;
+  x_72_phi = false;
+  loop {
+    var x_77 : bool;
+    var x_77_phi : bool;
+    var x_13_phi : i32;
+    var x_87_phi : bool;
+    let x_72 : bool = x_72_phi;
+    x_77_phi = x_72;
+    loop {
+      x_77 = x_77_phi;
+      let x_10 : i32 = x_8.zero;
+      let x_11 : i32 = (*(a)).values[x_10];
+      if ((x_11 == 1)) {
+        x_70 = true;
+        x_12 = 1;
+        x_13_phi = 1;
+        x_87_phi = true;
+        break;
+      }
+      x_13_phi = 0;
+      x_87_phi = x_77;
+      break;
+
+      continuing {
+        x_77_phi = false;
+      }
+    }
+    x_13 = x_13_phi;
+    let x_87 : bool = x_87_phi;
+    x_14_phi = x_13;
+    if (x_87) {
+      break;
+    }
+    x_70 = true;
+    x_12 = 1;
+    x_14_phi = 1;
+    break;
+
+    continuing {
+      x_72_phi = false;
+    }
+  }
+  let x_14 : i32 = x_14_phi;
+  return x_14;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-func-argument/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-func-argument/0-opt.wgsl
new file mode 100644
index 0000000..c3fe68b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-func-argument/0-opt.wgsl
@@ -0,0 +1,122 @@
+struct Array {
+  values : array<i32, 2>;
+};
+
+[[block]]
+struct buf0 {
+  zero : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_50 : bool = false;
+  var x_15 : i32;
+  var x_16 : i32;
+  var param : Array;
+  var x_19 : i32;
+  var x_20_phi : i32;
+  param = Array(array<i32, 2>(0, 0));
+  x_50 = false;
+  loop {
+    var x_19_phi : i32;
+    var x_63_phi : bool;
+    loop {
+      let x_17 : i32 = x_8.zero;
+      let x_18 : i32 = param.values[x_17];
+      if ((x_18 == 1)) {
+        x_50 = true;
+        x_15 = 1;
+        x_19_phi = 1;
+        x_63_phi = true;
+        break;
+      }
+      x_19_phi = 0;
+      x_63_phi = false;
+      break;
+    }
+    x_19 = x_19_phi;
+    let x_63 : bool = x_63_phi;
+    x_20_phi = x_19;
+    if (x_63) {
+      break;
+    }
+    x_50 = true;
+    x_15 = 1;
+    x_20_phi = 1;
+    break;
+  }
+  let x_20 : i32 = x_20_phi;
+  x_16 = x_20;
+  if ((x_20 == 1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+fn func_struct_Array_i1_2_1_(a : ptr<function, Array>) -> i32 {
+  var x_70 : bool = false;
+  var x_12 : i32;
+  var x_13 : i32;
+  var x_72_phi : bool;
+  var x_14_phi : i32;
+  x_72_phi = false;
+  loop {
+    var x_77 : bool;
+    var x_77_phi : bool;
+    var x_13_phi : i32;
+    var x_87_phi : bool;
+    let x_72 : bool = x_72_phi;
+    x_77_phi = x_72;
+    loop {
+      x_77 = x_77_phi;
+      let x_10 : i32 = x_8.zero;
+      let x_11 : i32 = (*(a)).values[x_10];
+      if ((x_11 == 1)) {
+        x_70 = true;
+        x_12 = 1;
+        x_13_phi = 1;
+        x_87_phi = true;
+        break;
+      }
+      x_13_phi = 0;
+      x_87_phi = x_77;
+      break;
+
+      continuing {
+        x_77_phi = false;
+      }
+    }
+    x_13 = x_13_phi;
+    let x_87 : bool = x_87_phi;
+    x_14_phi = x_13;
+    if (x_87) {
+      break;
+    }
+    x_70 = true;
+    x_12 = 1;
+    x_14_phi = 1;
+    break;
+
+    continuing {
+      x_72_phi = false;
+    }
+  }
+  let x_14 : i32 = x_14_phi;
+  return x_14;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-func-argument/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-func-argument/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..fc32950
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-func-argument/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,119 @@
+struct Array {
+  int values[2];
+};
+
+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);
+
+void main_1() {
+  bool x_50 = false;
+  int x_15 = 0;
+  int x_16 = 0;
+  Array param = (Array)0;
+  int x_19 = 0;
+  int x_20_phi = 0;
+  const int tint_symbol_3[2] = {0, 0};
+  const Array tint_symbol_4 = {tint_symbol_3};
+  param = tint_symbol_4;
+  x_50 = false;
+  while (true) {
+    int x_19_phi = 0;
+    bool x_63_phi = false;
+    while (true) {
+      const int x_17 = asint(x_8[0].x);
+      const int x_18 = param.values[x_17];
+      if ((x_18 == 1)) {
+        x_50 = true;
+        x_15 = 1;
+        x_19_phi = 1;
+        x_63_phi = true;
+        break;
+      }
+      x_19_phi = 0;
+      x_63_phi = false;
+      break;
+    }
+    x_19 = x_19_phi;
+    const bool x_63 = x_63_phi;
+    x_20_phi = x_19;
+    if (x_63) {
+      break;
+    }
+    x_50 = true;
+    x_15 = 1;
+    x_20_phi = 1;
+    break;
+  }
+  const int x_20 = x_20_phi;
+  x_16 = x_20;
+  if ((x_20 == 1)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
+int func_struct_Array_i1_2_1_(inout Array a) {
+  bool x_70 = false;
+  int x_12 = 0;
+  int x_13 = 0;
+  bool x_72_phi = false;
+  int x_14_phi = 0;
+  x_72_phi = false;
+  while (true) {
+    bool x_77 = false;
+    bool x_77_phi = false;
+    int x_13_phi = 0;
+    bool x_87_phi = false;
+    x_77_phi = x_72_phi;
+    while (true) {
+      x_77 = x_77_phi;
+      const int x_10 = asint(x_8[0].x);
+      const int x_11 = a.values[x_10];
+      if ((x_11 == 1)) {
+        x_70 = true;
+        x_12 = 1;
+        x_13_phi = 1;
+        x_87_phi = true;
+        break;
+      }
+      x_13_phi = 0;
+      x_87_phi = x_77;
+      break;
+      {
+        x_77_phi = false;
+      }
+    }
+    x_13 = x_13_phi;
+    const bool x_87 = x_87_phi;
+    x_14_phi = x_13;
+    if (x_87) {
+      break;
+    }
+    x_70 = true;
+    x_12 = 1;
+    x_14_phi = 1;
+    break;
+    {
+      x_72_phi = false;
+    }
+  }
+  return x_14_phi;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-func-argument/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-func-argument/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..a3005e8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-func-argument/0-opt.wgsl.expected.msl
@@ -0,0 +1,126 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  int arr[2];
+};
+struct Array {
+  tint_array_wrapper values;
+};
+struct buf0 {
+  /* 0x0000 */ int zero;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_6) {
+  bool x_50 = false;
+  int x_15 = 0;
+  int x_16 = 0;
+  Array param = {};
+  int x_19 = 0;
+  int x_20_phi = 0;
+  tint_array_wrapper const tint_symbol_3 = {.arr={0, 0}};
+  Array const tint_symbol_4 = {.values=tint_symbol_3};
+  param = tint_symbol_4;
+  x_50 = false;
+  while (true) {
+    int x_19_phi = 0;
+    bool x_63_phi = false;
+    while (true) {
+      int const x_17 = x_8.zero;
+      int const x_18 = param.values.arr[x_17];
+      if ((x_18 == 1)) {
+        x_50 = true;
+        x_15 = 1;
+        x_19_phi = 1;
+        x_63_phi = true;
+        break;
+      }
+      x_19_phi = 0;
+      x_63_phi = false;
+      break;
+    }
+    x_19 = x_19_phi;
+    bool const x_63 = x_63_phi;
+    x_20_phi = x_19;
+    if (x_63) {
+      break;
+    }
+    x_50 = true;
+    x_15 = 1;
+    x_20_phi = 1;
+    break;
+  }
+  int const x_20 = x_20_phi;
+  x_16 = x_20;
+  if ((x_20 == 1)) {
+    *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_6) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  main_1(x_8, &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
+int func_struct_Array_i1_2_1_(constant buf0& x_8, thread Array* const a) {
+  bool x_70 = false;
+  int x_12 = 0;
+  int x_13 = 0;
+  bool x_72_phi = false;
+  int x_14_phi = 0;
+  x_72_phi = false;
+  while (true) {
+    bool x_77 = false;
+    bool x_77_phi = false;
+    int x_13_phi = 0;
+    bool x_87_phi = false;
+    bool const x_72 = x_72_phi;
+    x_77_phi = x_72;
+    while (true) {
+      x_77 = x_77_phi;
+      int const x_10 = x_8.zero;
+      int const x_11 = (*(a)).values.arr[x_10];
+      if ((x_11 == 1)) {
+        x_70 = true;
+        x_12 = 1;
+        x_13_phi = 1;
+        x_87_phi = true;
+        break;
+      }
+      x_13_phi = 0;
+      x_87_phi = x_77;
+      break;
+      {
+        x_77_phi = false;
+      }
+    }
+    x_13 = x_13_phi;
+    bool const x_87 = x_87_phi;
+    x_14_phi = x_13;
+    if (x_87) {
+      break;
+    }
+    x_70 = true;
+    x_12 = 1;
+    x_14_phi = 1;
+    break;
+    {
+      x_72_phi = false;
+    }
+  }
+  int const x_14 = x_14_phi;
+  return x_14;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-func-argument/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-func-argument/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..b34c579
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-func-argument/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,249 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 122
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_50 "x_50"
+               OpName %x_15 "x_15"
+               OpName %x_16 "x_16"
+               OpName %Array "Array"
+               OpMemberName %Array 0 "values"
+               OpName %param "param"
+               OpName %x_19 "x_19"
+               OpName %x_20_phi "x_20_phi"
+               OpName %x_19_phi "x_19_phi"
+               OpName %x_63_phi "x_63_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpName %func_struct_Array_i1_2_1_ "func_struct_Array_i1_2_1_"
+               OpName %a "a"
+               OpName %x_70 "x_70"
+               OpName %x_12 "x_12"
+               OpName %x_13 "x_13"
+               OpName %x_72_phi "x_72_phi"
+               OpName %x_14_phi "x_14_phi"
+               OpName %x_77 "x_77"
+               OpName %x_77_phi "x_77_phi"
+               OpName %x_13_phi "x_13_phi"
+               OpName %x_87_phi "x_87_phi"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %Array 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %20 = OpConstantNull %bool
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+      %Array = OpTypeStruct %_arr_int_uint_2
+%_ptr_Function_Array = OpTypePointer Function %Array
+         %31 = OpConstantNull %Array
+      %int_0 = OpConstant %int 0
+         %35 = OpConstantComposite %_arr_int_uint_2 %int_0 %int_0
+         %36 = OpConstantComposite %Array %35
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %true = OpConstantTrue %bool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %70 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %71 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %72 = OpTypeFunction %void %main_out
+         %84 = OpTypeFunction %int %_ptr_Function_Array
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+       %x_50 = OpVariable %_ptr_Function_bool Function %20
+       %x_15 = OpVariable %_ptr_Function_int Function %23
+       %x_16 = OpVariable %_ptr_Function_int Function %23
+      %param = OpVariable %_ptr_Function_Array Function %31
+       %x_19 = OpVariable %_ptr_Function_int Function %23
+   %x_20_phi = OpVariable %_ptr_Function_int Function %23
+   %x_19_phi = OpVariable %_ptr_Function_int Function %23
+   %x_63_phi = OpVariable %_ptr_Function_bool Function %20
+               OpStore %x_50 %false
+               OpStore %param %36
+               OpStore %x_50 %false
+               OpBranch %37
+         %37 = OpLabel
+               OpLoopMerge %38 %39 None
+               OpBranch %40
+         %40 = OpLabel
+               OpBranch %43
+         %43 = OpLabel
+               OpLoopMerge %44 %45 None
+               OpBranch %46
+         %46 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0
+         %50 = OpLoad %int %49
+         %51 = OpAccessChain %_ptr_Function_int %param %uint_0 %50
+         %52 = OpLoad %int %51
+         %54 = OpIEqual %bool %52 %int_1
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %55
+         %56 = OpLabel
+               OpStore %x_50 %true
+               OpStore %x_15 %int_1
+               OpStore %x_19_phi %int_1
+               OpStore %x_63_phi %true
+               OpBranch %44
+         %55 = OpLabel
+               OpStore %x_19_phi %int_0
+               OpStore %x_63_phi %false
+               OpBranch %44
+         %45 = OpLabel
+               OpBranch %43
+         %44 = OpLabel
+         %58 = OpLoad %int %x_19_phi
+               OpStore %x_19 %58
+         %59 = OpLoad %bool %x_63_phi
+         %60 = OpLoad %int %x_19
+               OpStore %x_20_phi %60
+               OpSelectionMerge %61 None
+               OpBranchConditional %59 %62 %61
+         %62 = OpLabel
+               OpBranch %38
+         %61 = OpLabel
+               OpStore %x_50 %true
+               OpStore %x_15 %int_1
+               OpStore %x_20_phi %int_1
+               OpBranch %38
+         %39 = OpLabel
+               OpBranch %37
+         %38 = OpLabel
+         %63 = OpLoad %int %x_20_phi
+               OpStore %x_16 %63
+         %64 = OpIEqual %bool %63 %int_1
+               OpSelectionMerge %65 None
+               OpBranchConditional %64 %66 %67
+         %66 = OpLabel
+               OpStore %x_GLF_color %70
+               OpBranch %65
+         %67 = OpLabel
+               OpStore %x_GLF_color %71
+               OpBranch %65
+         %65 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %72
+%tint_symbol = OpFunctionParameter %main_out
+         %76 = OpLabel
+         %77 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %77
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %79 = OpLabel
+         %80 = OpFunctionCall %void %main_1
+         %82 = OpLoad %v4float %x_GLF_color
+         %83 = OpCompositeConstruct %main_out %82
+         %81 = OpFunctionCall %void %tint_symbol_2 %83
+               OpReturn
+               OpFunctionEnd
+%func_struct_Array_i1_2_1_ = OpFunction %int None %84
+          %a = OpFunctionParameter %_ptr_Function_Array
+         %87 = OpLabel
+       %x_70 = OpVariable %_ptr_Function_bool Function %20
+       %x_12 = OpVariable %_ptr_Function_int Function %23
+       %x_13 = OpVariable %_ptr_Function_int Function %23
+   %x_72_phi = OpVariable %_ptr_Function_bool Function %20
+   %x_14_phi = OpVariable %_ptr_Function_int Function %23
+       %x_77 = OpVariable %_ptr_Function_bool Function %20
+   %x_77_phi = OpVariable %_ptr_Function_bool Function %20
+   %x_13_phi = OpVariable %_ptr_Function_int Function %23
+   %x_87_phi = OpVariable %_ptr_Function_bool Function %20
+               OpStore %x_70 %false
+               OpStore %x_72_phi %false
+               OpBranch %93
+         %93 = OpLabel
+               OpLoopMerge %94 %95 None
+               OpBranch %96
+         %96 = OpLabel
+        %101 = OpLoad %bool %x_72_phi
+               OpStore %x_77_phi %101
+               OpBranch %102
+        %102 = OpLabel
+               OpLoopMerge %103 %104 None
+               OpBranch %105
+        %105 = OpLabel
+        %106 = OpLoad %bool %x_77_phi
+               OpStore %x_77 %106
+        %107 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0
+        %108 = OpLoad %int %107
+        %110 = OpAccessChain %_ptr_Function_int %a %uint_0 %108
+        %111 = OpLoad %int %110
+        %112 = OpIEqual %bool %111 %int_1
+               OpSelectionMerge %113 None
+               OpBranchConditional %112 %114 %113
+        %114 = OpLabel
+               OpStore %x_70 %true
+               OpStore %x_12 %int_1
+               OpStore %x_13_phi %int_1
+               OpStore %x_87_phi %true
+               OpBranch %103
+        %113 = OpLabel
+               OpStore %x_13_phi %int_0
+        %115 = OpLoad %bool %x_77
+               OpStore %x_87_phi %115
+               OpBranch %103
+        %104 = OpLabel
+               OpStore %x_77_phi %false
+               OpBranch %102
+        %103 = OpLabel
+        %116 = OpLoad %int %x_13_phi
+               OpStore %x_13 %116
+        %117 = OpLoad %bool %x_87_phi
+        %118 = OpLoad %int %x_13
+               OpStore %x_14_phi %118
+               OpSelectionMerge %119 None
+               OpBranchConditional %117 %120 %119
+        %120 = OpLabel
+               OpBranch %94
+        %119 = OpLabel
+               OpStore %x_70 %true
+               OpStore %x_12 %int_1
+               OpStore %x_14_phi %int_1
+               OpBranch %94
+         %95 = OpLabel
+               OpStore %x_72_phi %false
+               OpBranch %93
+         %94 = OpLabel
+        %121 = OpLoad %int %x_14_phi
+               OpReturnValue %121
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-func-argument/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-func-argument/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..c3fe68b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-func-argument/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,122 @@
+struct Array {
+  values : array<i32, 2>;
+};
+
+[[block]]
+struct buf0 {
+  zero : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_50 : bool = false;
+  var x_15 : i32;
+  var x_16 : i32;
+  var param : Array;
+  var x_19 : i32;
+  var x_20_phi : i32;
+  param = Array(array<i32, 2>(0, 0));
+  x_50 = false;
+  loop {
+    var x_19_phi : i32;
+    var x_63_phi : bool;
+    loop {
+      let x_17 : i32 = x_8.zero;
+      let x_18 : i32 = param.values[x_17];
+      if ((x_18 == 1)) {
+        x_50 = true;
+        x_15 = 1;
+        x_19_phi = 1;
+        x_63_phi = true;
+        break;
+      }
+      x_19_phi = 0;
+      x_63_phi = false;
+      break;
+    }
+    x_19 = x_19_phi;
+    let x_63 : bool = x_63_phi;
+    x_20_phi = x_19;
+    if (x_63) {
+      break;
+    }
+    x_50 = true;
+    x_15 = 1;
+    x_20_phi = 1;
+    break;
+  }
+  let x_20 : i32 = x_20_phi;
+  x_16 = x_20;
+  if ((x_20 == 1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+fn func_struct_Array_i1_2_1_(a : ptr<function, Array>) -> i32 {
+  var x_70 : bool = false;
+  var x_12 : i32;
+  var x_13 : i32;
+  var x_72_phi : bool;
+  var x_14_phi : i32;
+  x_72_phi = false;
+  loop {
+    var x_77 : bool;
+    var x_77_phi : bool;
+    var x_13_phi : i32;
+    var x_87_phi : bool;
+    let x_72 : bool = x_72_phi;
+    x_77_phi = x_72;
+    loop {
+      x_77 = x_77_phi;
+      let x_10 : i32 = x_8.zero;
+      let x_11 : i32 = (*(a)).values[x_10];
+      if ((x_11 == 1)) {
+        x_70 = true;
+        x_12 = 1;
+        x_13_phi = 1;
+        x_87_phi = true;
+        break;
+      }
+      x_13_phi = 0;
+      x_87_phi = x_77;
+      break;
+
+      continuing {
+        x_77_phi = false;
+      }
+    }
+    x_13 = x_13_phi;
+    let x_87 : bool = x_87_phi;
+    x_14_phi = x_13;
+    if (x_87) {
+      break;
+    }
+    x_70 = true;
+    x_12 = 1;
+    x_14_phi = 1;
+    break;
+
+    continuing {
+      x_72_phi = false;
+    }
+  }
+  let x_14 : i32 = x_14_phi;
+  return x_14;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-no-stores/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-no-stores/0-opt.spvasm
new file mode 100644
index 0000000..ba041ef
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-no-stores/0-opt.spvasm
@@ -0,0 +1,77 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %Array "Array"
+               OpMemberName %Array 0 "values"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %_ ""
+               OpName %b "b"
+               OpName %one "one"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %Array 0 RelaxedPrecision
+               OpMemberDecorate %buf0 0 RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %10 RelaxedPrecision
+               OpDecorate %11 RelaxedPrecision
+               OpDecorate %12 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+      %Array = OpTypeStruct %_arr_int_uint_2
+%_ptr_Function_Array = OpTypePointer Function %Array
+      %int_0 = OpConstant %int 0
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %14
+         %32 = OpLabel
+          %a = OpVariable %_ptr_Function_Array Function
+          %b = OpVariable %_ptr_Function_Array Function
+        %one = OpVariable %_ptr_Function_float Function
+         %33 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %10 = OpLoad %int %33
+         %34 = OpAccessChain %_ptr_Function_int %a %int_0 %10
+               OpStore %34 %int_1
+         %35 = OpLoad %Array %a
+               OpStore %b %35
+               OpStore %one %float_0
+         %36 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %11 = OpLoad %int %36
+         %37 = OpAccessChain %_ptr_Function_int %b %int_0 %11
+         %12 = OpLoad %int %37
+         %38 = OpIEqual %bool %12 %int_1
+               OpSelectionMerge %39 None
+               OpBranchConditional %38 %40 %39
+         %40 = OpLabel
+               OpStore %one %float_1
+               OpBranch %39
+         %39 = OpLabel
+         %41 = OpLoad %float %one
+         %42 = OpCompositeConstruct %v4float %41 %float_0 %float_0 %float_1
+               OpStore %_GLF_color %42
+               OpReturn
+               OpFunctionEnd
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
new file mode 100644
index 0000000..3be4868
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-no-stores/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,39 @@
+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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-no-stores/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-no-stores/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..92b1932
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-no-stores/0-opt.spvasm.expected.msl
@@ -0,0 +1,46 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  int arr[2];
+};
+struct Array {
+  tint_array_wrapper values;
+};
+struct buf0 {
+  /* 0x0000 */ int zero;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_4) {
+  Array a = {};
+  Array b = {};
+  float one = 0.0f;
+  int const x_10 = x_7.zero;
+  a.values.arr[x_10] = 1;
+  Array const x_35 = a;
+  b = x_35;
+  one = 0.0f;
+  int const x_11 = x_7.zero;
+  int const x_12 = b.values.arr[x_11];
+  if ((x_12 == 1)) {
+    one = 1.0f;
+  }
+  float const x_41 = one;
+  *(tint_symbol_4) = float4(x_41, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-no-stores/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-no-stores/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..71364d1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-no-stores/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,107 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 59
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %Array "Array"
+               OpMemberName %Array 0 "values"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %one "one"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %Array 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+      %Array = OpTypeStruct %_arr_int_uint_2
+%_ptr_Function_Array = OpTypePointer Function %Array
+         %22 = OpConstantNull %Array
+%_ptr_Function_float = OpTypePointer Function %float
+         %26 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+         %47 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %a = OpVariable %_ptr_Function_Array Function %22
+          %b = OpVariable %_ptr_Function_Array Function %22
+        %one = OpVariable %_ptr_Function_float Function %26
+         %29 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %30 = OpLoad %int %29
+         %32 = OpAccessChain %_ptr_Function_int %a %uint_0 %30
+               OpStore %32 %int_1
+         %34 = OpLoad %Array %a
+               OpStore %b %34
+               OpStore %one %float_0
+         %36 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %37 = OpLoad %int %36
+         %38 = OpAccessChain %_ptr_Function_int %b %uint_0 %37
+         %39 = OpLoad %int %38
+         %40 = OpIEqual %bool %39 %int_1
+               OpSelectionMerge %42 None
+               OpBranchConditional %40 %43 %42
+         %43 = OpLabel
+               OpStore %one %float_1
+               OpBranch %42
+         %42 = OpLabel
+         %45 = OpLoad %float %one
+         %46 = OpCompositeConstruct %v4float %45 %float_0 %float_0 %float_1
+               OpStore %x_GLF_color %46
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %47
+%tint_symbol = OpFunctionParameter %main_out
+         %51 = OpLabel
+         %52 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %52
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %54 = OpLabel
+         %55 = OpFunctionCall %void %main_1
+         %57 = OpLoad %v4float %x_GLF_color
+         %58 = OpCompositeConstruct %main_out %57
+         %56 = OpFunctionCall %void %tint_symbol_2 %58
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-no-stores/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-no-stores/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..6e13d32
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-no-stores/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,42 @@
+struct Array {
+  values : array<i32, 2>;
+};
+
+[[block]]
+struct buf0 {
+  zero : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : Array;
+  var b : Array;
+  var one : f32;
+  let x_10 : i32 = x_7.zero;
+  a.values[x_10] = 1;
+  let x_35 : Array = a;
+  b = x_35;
+  one = 0.0;
+  let x_11 : i32 = x_7.zero;
+  let x_12 : i32 = b.values[x_11];
+  if ((x_12 == 1)) {
+    one = 1.0;
+  }
+  let x_41 : f32 = one;
+  x_GLF_color = vec4<f32>(x_41, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-no-stores/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-no-stores/0-opt.wgsl
new file mode 100644
index 0000000..6e13d32
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-no-stores/0-opt.wgsl
@@ -0,0 +1,42 @@
+struct Array {
+  values : array<i32, 2>;
+};
+
+[[block]]
+struct buf0 {
+  zero : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : Array;
+  var b : Array;
+  var one : f32;
+  let x_10 : i32 = x_7.zero;
+  a.values[x_10] = 1;
+  let x_35 : Array = a;
+  b = x_35;
+  one = 0.0;
+  let x_11 : i32 = x_7.zero;
+  let x_12 : i32 = b.values[x_11];
+  if ((x_12 == 1)) {
+    one = 1.0;
+  }
+  let x_41 : f32 = one;
+  x_GLF_color = vec4<f32>(x_41, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
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
new file mode 100644
index 0000000..3be4868
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-no-stores/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,39 @@
+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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-no-stores/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-no-stores/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..92b1932
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-no-stores/0-opt.wgsl.expected.msl
@@ -0,0 +1,46 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  int arr[2];
+};
+struct Array {
+  tint_array_wrapper values;
+};
+struct buf0 {
+  /* 0x0000 */ int zero;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_4) {
+  Array a = {};
+  Array b = {};
+  float one = 0.0f;
+  int const x_10 = x_7.zero;
+  a.values.arr[x_10] = 1;
+  Array const x_35 = a;
+  b = x_35;
+  one = 0.0f;
+  int const x_11 = x_7.zero;
+  int const x_12 = b.values.arr[x_11];
+  if ((x_12 == 1)) {
+    one = 1.0f;
+  }
+  float const x_41 = one;
+  *(tint_symbol_4) = float4(x_41, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-no-stores/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-no-stores/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..71364d1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-no-stores/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,107 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 59
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %Array "Array"
+               OpMemberName %Array 0 "values"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %one "one"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %Array 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+      %Array = OpTypeStruct %_arr_int_uint_2
+%_ptr_Function_Array = OpTypePointer Function %Array
+         %22 = OpConstantNull %Array
+%_ptr_Function_float = OpTypePointer Function %float
+         %26 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+         %47 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %a = OpVariable %_ptr_Function_Array Function %22
+          %b = OpVariable %_ptr_Function_Array Function %22
+        %one = OpVariable %_ptr_Function_float Function %26
+         %29 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %30 = OpLoad %int %29
+         %32 = OpAccessChain %_ptr_Function_int %a %uint_0 %30
+               OpStore %32 %int_1
+         %34 = OpLoad %Array %a
+               OpStore %b %34
+               OpStore %one %float_0
+         %36 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %37 = OpLoad %int %36
+         %38 = OpAccessChain %_ptr_Function_int %b %uint_0 %37
+         %39 = OpLoad %int %38
+         %40 = OpIEqual %bool %39 %int_1
+               OpSelectionMerge %42 None
+               OpBranchConditional %40 %43 %42
+         %43 = OpLabel
+               OpStore %one %float_1
+               OpBranch %42
+         %42 = OpLabel
+         %45 = OpLoad %float %one
+         %46 = OpCompositeConstruct %v4float %45 %float_0 %float_0 %float_1
+               OpStore %x_GLF_color %46
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %47
+%tint_symbol = OpFunctionParameter %main_out
+         %51 = OpLabel
+         %52 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %52
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %54 = OpLabel
+         %55 = OpFunctionCall %void %main_1
+         %57 = OpLoad %v4float %x_GLF_color
+         %58 = OpCompositeConstruct %main_out %57
+         %56 = OpFunctionCall %void %tint_symbol_2 %58
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-no-stores/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-no-stores/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..6e13d32
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-no-stores/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,42 @@
+struct Array {
+  values : array<i32, 2>;
+};
+
+[[block]]
+struct buf0 {
+  zero : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : Array;
+  var b : Array;
+  var one : f32;
+  let x_10 : i32 = x_7.zero;
+  a.values[x_10] = 1;
+  let x_35 : Array = a;
+  b = x_35;
+  one = 0.0;
+  let x_11 : i32 = x_7.zero;
+  let x_12 : i32 = b.values[x_11];
+  if ((x_12 == 1)) {
+    one = 1.0;
+  }
+  let x_41 : f32 = one;
+  x_GLF_color = vec4<f32>(x_41, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-param-uniform/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-param-uniform/0-opt.spvasm
new file mode 100644
index 0000000..68ef2be
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-param-uniform/0-opt.spvasm
@@ -0,0 +1,181 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %Array "Array"
+               OpMemberName %Array 0 "values"
+               OpName %func_struct_Array_i1_2_1_ "func(struct-Array-i1[2]1;"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %_ ""
+               OpName %param "param"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %Array 0 RelaxedPrecision
+               OpDecorate %func_struct_Array_i1_2_1_ RelaxedPrecision
+               OpMemberDecorate %buf0 0 RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %10 RelaxedPrecision
+               OpDecorate %11 RelaxedPrecision
+               OpDecorate %12 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %13 RelaxedPrecision
+               OpDecorate %14 RelaxedPrecision
+               OpDecorate %15 RelaxedPrecision
+               OpDecorate %16 RelaxedPrecision
+               OpDecorate %17 RelaxedPrecision
+               OpDecorate %18 RelaxedPrecision
+               OpDecorate %19 RelaxedPrecision
+               OpDecorate %20 RelaxedPrecision
+               OpDecorate %21 RelaxedPrecision
+               OpDecorate %22 RelaxedPrecision
+               OpDecorate %23 RelaxedPrecision
+       %void = OpTypeVoid
+         %25 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+      %Array = OpTypeStruct %_arr_int_uint_2
+%_ptr_Function_Array = OpTypePointer Function %Array
+         %31 = OpTypeFunction %int %_ptr_Function_Array
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+      %int_0 = OpConstant %int 0
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_int = OpTypePointer Function %int
+     %int_42 = OpConstant %int 42
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %44 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %45 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+      %false = OpConstantFalse %bool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %48 = OpUndef %int
+         %49 = OpUndef %bool
+%_ptr_Function__arr_int_uint_2 = OpTypePointer Function %_arr_int_uint_2
+       %main = OpFunction %void None %25
+         %51 = OpLabel
+         %52 = OpVariable %_ptr_Function_bool Function %false
+         %17 = OpVariable %_ptr_Function_int Function
+         %18 = OpVariable %_ptr_Function_int Function
+         %16 = OpVariable %_ptr_Function__arr_int_uint_2 Function
+      %param = OpVariable %_ptr_Function_Array Function
+         %53 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %12 = OpLoad %int %53
+         %22 = OpLoad %_arr_int_uint_2 %16
+         %23 = OpCompositeInsert %_arr_int_uint_2 %12 %22 0
+               OpStore %16 %23
+         %54 = OpLoad %_arr_int_uint_2 %16
+         %55 = OpCompositeConstruct %Array %54
+               OpStore %param %55
+               OpStore %52 %false
+               OpBranch %56
+         %56 = OpLabel
+               OpLoopMerge %57 %58 None
+               OpBranch %59
+         %59 = OpLabel
+               OpLoopMerge %60 %61 None
+               OpBranch %62
+         %62 = OpLabel
+         %63 = OpAccessChain %_ptr_Function_int %param %int_0 %12
+         %19 = OpLoad %int %63
+         %64 = OpIEqual %bool %19 %int_0
+               OpSelectionMerge %65 None
+               OpBranchConditional %64 %66 %65
+         %66 = OpLabel
+               OpStore %52 %true
+               OpStore %17 %int_42
+               OpBranch %60
+         %65 = OpLabel
+               OpBranch %60
+         %61 = OpLabel
+               OpBranch %59
+         %60 = OpLabel
+         %20 = OpPhi %int %int_42 %66 %48 %65
+         %67 = OpPhi %bool %true %66 %false %65
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %57 %68
+         %68 = OpLabel
+               OpStore %52 %true
+               OpStore %17 %int_42
+               OpBranch %57
+         %58 = OpLabel
+               OpBranch %56
+         %57 = OpLabel
+         %21 = OpPhi %int %20 %60 %int_42 %68
+               OpStore %18 %21
+         %69 = OpIEqual %bool %21 %int_42
+               OpSelectionMerge %70 None
+               OpBranchConditional %69 %71 %72
+         %72 = OpLabel
+               OpStore %_GLF_color %45
+               OpBranch %70
+         %71 = OpLabel
+               OpStore %_GLF_color %44
+               OpBranch %70
+         %70 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%func_struct_Array_i1_2_1_ = OpFunction %int None %31
+          %a = OpFunctionParameter %_ptr_Function_Array
+         %73 = OpLabel
+         %74 = OpVariable %_ptr_Function_bool Function %false
+         %13 = OpVariable %_ptr_Function_int Function
+               OpBranch %75
+         %75 = OpLabel
+         %76 = OpPhi %bool %false %73 %49 %77
+               OpLoopMerge %78 %77 None
+               OpBranch %79
+         %79 = OpLabel
+               OpBranch %80
+         %80 = OpLabel
+         %81 = OpPhi %bool %76 %79 %49 %82
+               OpLoopMerge %83 %82 None
+               OpBranch %84
+         %84 = OpLabel
+               OpBranch %85
+         %85 = OpLabel
+         %86 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %10 = OpLoad %int %86
+         %87 = OpAccessChain %_ptr_Function_int %a %int_0 %10
+         %11 = OpLoad %int %87
+         %88 = OpIEqual %bool %11 %int_0
+               OpSelectionMerge %89 None
+               OpBranchConditional %88 %90 %89
+         %90 = OpLabel
+               OpStore %74 %true
+               OpStore %13 %int_42
+               OpBranch %83
+         %89 = OpLabel
+               OpBranch %83
+         %82 = OpLabel
+               OpBranch %80
+         %83 = OpLabel
+         %14 = OpPhi %int %int_42 %90 %48 %89
+         %91 = OpPhi %bool %true %90 %81 %89
+               OpSelectionMerge %92 None
+               OpBranchConditional %91 %78 %92
+         %92 = OpLabel
+               OpStore %74 %true
+               OpStore %13 %int_42
+               OpBranch %78
+         %77 = OpLabel
+               OpBranch %75
+         %78 = OpLabel
+         %15 = OpPhi %int %14 %83 %int_42 %92
+               OpReturnValue %15
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-param-uniform/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-param-uniform/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..e7e6754
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-param-uniform/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,122 @@
+struct Array {
+  int values[2];
+};
+
+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);
+
+void main_1() {
+  bool x_52 = false;
+  int x_17 = 0;
+  int x_18 = 0;
+  int x_16[2] = (int[2])0;
+  Array param = (Array)0;
+  int x_20 = 0;
+  int x_21_phi = 0;
+  const int x_12 = asint(x_8[0].x);
+  int x_23_1[2] = x_16;
+  x_23_1[0u] = x_12;
+  x_16 = x_23_1;
+  const Array tint_symbol_3 = {x_16};
+  param = tint_symbol_3;
+  x_52 = false;
+  while (true) {
+    int x_20_phi = 0;
+    bool x_67_phi = false;
+    while (true) {
+      const int x_19 = param.values[x_12];
+      if ((x_19 == 0)) {
+        x_52 = true;
+        x_17 = 42;
+        x_20_phi = 42;
+        x_67_phi = true;
+        break;
+      }
+      x_20_phi = 0;
+      x_67_phi = false;
+      break;
+    }
+    x_20 = x_20_phi;
+    const bool x_67 = x_67_phi;
+    x_21_phi = x_20;
+    if (x_67) {
+      break;
+    }
+    x_52 = true;
+    x_17 = 42;
+    x_21_phi = 42;
+    break;
+  }
+  const int x_21 = x_21_phi;
+  x_18 = x_21;
+  if ((x_21 == 42)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
+int func_struct_Array_i1_2_1_(inout Array a) {
+  bool x_74 = false;
+  int x_13 = 0;
+  int x_14 = 0;
+  bool x_76_phi = false;
+  int x_15_phi = 0;
+  x_76_phi = false;
+  while (true) {
+    bool x_81 = false;
+    bool x_81_phi = false;
+    int x_14_phi = 0;
+    bool x_91_phi = false;
+    x_81_phi = x_76_phi;
+    while (true) {
+      x_81 = x_81_phi;
+      const int x_10 = asint(x_8[0].x);
+      const int x_11 = a.values[x_10];
+      if ((x_11 == 0)) {
+        x_74 = true;
+        x_13 = 42;
+        x_14_phi = 42;
+        x_91_phi = true;
+        break;
+      }
+      x_14_phi = 0;
+      x_91_phi = x_81;
+      break;
+      {
+        x_81_phi = false;
+      }
+    }
+    x_14 = x_14_phi;
+    const bool x_91 = x_91_phi;
+    x_15_phi = x_14;
+    if (x_91) {
+      break;
+    }
+    x_74 = true;
+    x_13 = 42;
+    x_15_phi = 42;
+    break;
+    {
+      x_76_phi = false;
+    }
+  }
+  return x_15_phi;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-param-uniform/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-param-uniform/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..d77e254
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-param-uniform/0-opt.spvasm.expected.msl
@@ -0,0 +1,132 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  int arr[2];
+};
+struct Array {
+  tint_array_wrapper values;
+};
+struct buf0 {
+  /* 0x0000 */ int zero;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_5) {
+  bool x_52 = false;
+  int x_17 = 0;
+  int x_18 = 0;
+  tint_array_wrapper x_16 = {};
+  Array param = {};
+  int x_20 = 0;
+  int x_21_phi = 0;
+  int const x_12 = x_8.zero;
+  tint_array_wrapper const x_22 = x_16;
+  tint_array_wrapper x_23_1 = x_22;
+  x_23_1.arr[0u] = x_12;
+  tint_array_wrapper const x_23 = x_23_1;
+  x_16 = x_23;
+  tint_array_wrapper const x_54 = x_16;
+  Array const tint_symbol_3 = {.values=x_54};
+  param = tint_symbol_3;
+  x_52 = false;
+  while (true) {
+    int x_20_phi = 0;
+    bool x_67_phi = false;
+    while (true) {
+      int const x_19 = param.values.arr[x_12];
+      if ((x_19 == 0)) {
+        x_52 = true;
+        x_17 = 42;
+        x_20_phi = 42;
+        x_67_phi = true;
+        break;
+      }
+      x_20_phi = 0;
+      x_67_phi = false;
+      break;
+    }
+    x_20 = x_20_phi;
+    bool const x_67 = x_67_phi;
+    x_21_phi = x_20;
+    if (x_67) {
+      break;
+    }
+    x_52 = true;
+    x_17 = 42;
+    x_21_phi = 42;
+    break;
+  }
+  int const x_21 = x_21_phi;
+  x_18 = x_21;
+  if ((x_21 == 42)) {
+    *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_5) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_8, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
+int func_struct_Array_i1_2_1_(constant buf0& x_8, thread Array* const a) {
+  bool x_74 = false;
+  int x_13 = 0;
+  int x_14 = 0;
+  bool x_76_phi = false;
+  int x_15_phi = 0;
+  x_76_phi = false;
+  while (true) {
+    bool x_81 = false;
+    bool x_81_phi = false;
+    int x_14_phi = 0;
+    bool x_91_phi = false;
+    bool const x_76 = x_76_phi;
+    x_81_phi = x_76;
+    while (true) {
+      x_81 = x_81_phi;
+      int const x_10 = x_8.zero;
+      int const x_11 = (*(a)).values.arr[x_10];
+      if ((x_11 == 0)) {
+        x_74 = true;
+        x_13 = 42;
+        x_14_phi = 42;
+        x_91_phi = true;
+        break;
+      }
+      x_14_phi = 0;
+      x_91_phi = x_81;
+      break;
+      {
+        x_81_phi = false;
+      }
+    }
+    x_14 = x_14_phi;
+    bool const x_91 = x_91_phi;
+    x_15_phi = x_14;
+    if (x_91) {
+      break;
+    }
+    x_74 = true;
+    x_13 = 42;
+    x_15_phi = 42;
+    break;
+    {
+      x_76_phi = false;
+    }
+  }
+  int const x_15 = x_15_phi;
+  return x_15;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-param-uniform/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-param-uniform/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..83f6e26
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-param-uniform/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,261 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 129
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_52 "x_52"
+               OpName %x_17 "x_17"
+               OpName %x_18 "x_18"
+               OpName %x_16 "x_16"
+               OpName %Array "Array"
+               OpMemberName %Array 0 "values"
+               OpName %param "param"
+               OpName %x_20 "x_20"
+               OpName %x_21_phi "x_21_phi"
+               OpName %x_23_1 "x_23_1"
+               OpName %x_20_phi "x_20_phi"
+               OpName %x_67_phi "x_67_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpName %func_struct_Array_i1_2_1_ "func_struct_Array_i1_2_1_"
+               OpName %a "a"
+               OpName %x_74 "x_74"
+               OpName %x_13 "x_13"
+               OpName %x_14 "x_14"
+               OpName %x_76_phi "x_76_phi"
+               OpName %x_15_phi "x_15_phi"
+               OpName %x_81 "x_81"
+               OpName %x_81_phi "x_81_phi"
+               OpName %x_14_phi "x_14_phi"
+               OpName %x_91_phi "x_91_phi"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 4
+               OpMemberDecorate %Array 0 Offset 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %20 = OpConstantNull %bool
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+%_ptr_Function__arr_int_uint_2 = OpTypePointer Function %_arr_int_uint_2
+         %30 = OpConstantNull %_arr_int_uint_2
+      %Array = OpTypeStruct %_arr_int_uint_2
+%_ptr_Function_Array = OpTypePointer Function %Array
+         %34 = OpConstantNull %Array
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %true = OpConstantTrue %bool
+     %int_42 = OpConstant %int 42
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %77 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %78 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %79 = OpTypeFunction %void %main_out
+         %91 = OpTypeFunction %int %_ptr_Function_Array
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+       %x_52 = OpVariable %_ptr_Function_bool Function %20
+       %x_17 = OpVariable %_ptr_Function_int Function %23
+       %x_18 = OpVariable %_ptr_Function_int Function %23
+       %x_16 = OpVariable %_ptr_Function__arr_int_uint_2 Function %30
+      %param = OpVariable %_ptr_Function_Array Function %34
+       %x_20 = OpVariable %_ptr_Function_int Function %23
+   %x_21_phi = OpVariable %_ptr_Function_int Function %23
+     %x_23_1 = OpVariable %_ptr_Function__arr_int_uint_2 Function %30
+   %x_20_phi = OpVariable %_ptr_Function_int Function %23
+   %x_67_phi = OpVariable %_ptr_Function_bool Function %20
+               OpStore %x_52 %false
+         %39 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0
+         %40 = OpLoad %int %39
+         %41 = OpLoad %_arr_int_uint_2 %x_16
+               OpStore %x_23_1 %41
+         %43 = OpAccessChain %_ptr_Function_int %x_23_1 %uint_0
+               OpStore %43 %40
+         %44 = OpLoad %_arr_int_uint_2 %x_23_1
+               OpStore %x_16 %44
+         %45 = OpLoad %_arr_int_uint_2 %x_16
+         %46 = OpCompositeConstruct %Array %45
+               OpStore %param %46
+               OpStore %x_52 %false
+               OpBranch %47
+         %47 = OpLabel
+               OpLoopMerge %48 %49 None
+               OpBranch %50
+         %50 = OpLabel
+               OpBranch %53
+         %53 = OpLabel
+               OpLoopMerge %54 %55 None
+               OpBranch %56
+         %56 = OpLabel
+         %57 = OpAccessChain %_ptr_Function_int %param %uint_0 %40
+         %58 = OpLoad %int %57
+         %60 = OpIEqual %bool %58 %int_0
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %61
+         %62 = OpLabel
+               OpStore %x_52 %true
+               OpStore %x_17 %int_42
+               OpStore %x_20_phi %int_42
+               OpStore %x_67_phi %true
+               OpBranch %54
+         %61 = OpLabel
+               OpStore %x_20_phi %int_0
+               OpStore %x_67_phi %false
+               OpBranch %54
+         %55 = OpLabel
+               OpBranch %53
+         %54 = OpLabel
+         %65 = OpLoad %int %x_20_phi
+               OpStore %x_20 %65
+         %66 = OpLoad %bool %x_67_phi
+         %67 = OpLoad %int %x_20
+               OpStore %x_21_phi %67
+               OpSelectionMerge %68 None
+               OpBranchConditional %66 %69 %68
+         %69 = OpLabel
+               OpBranch %48
+         %68 = OpLabel
+               OpStore %x_52 %true
+               OpStore %x_17 %int_42
+               OpStore %x_21_phi %int_42
+               OpBranch %48
+         %49 = OpLabel
+               OpBranch %47
+         %48 = OpLabel
+         %70 = OpLoad %int %x_21_phi
+               OpStore %x_18 %70
+         %71 = OpIEqual %bool %70 %int_42
+               OpSelectionMerge %72 None
+               OpBranchConditional %71 %73 %74
+         %73 = OpLabel
+               OpStore %x_GLF_color %77
+               OpBranch %72
+         %74 = OpLabel
+               OpStore %x_GLF_color %78
+               OpBranch %72
+         %72 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %79
+%tint_symbol = OpFunctionParameter %main_out
+         %83 = OpLabel
+         %84 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %84
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %86 = OpLabel
+         %87 = OpFunctionCall %void %main_1
+         %89 = OpLoad %v4float %x_GLF_color
+         %90 = OpCompositeConstruct %main_out %89
+         %88 = OpFunctionCall %void %tint_symbol_2 %90
+               OpReturn
+               OpFunctionEnd
+%func_struct_Array_i1_2_1_ = OpFunction %int None %91
+          %a = OpFunctionParameter %_ptr_Function_Array
+         %94 = OpLabel
+       %x_74 = OpVariable %_ptr_Function_bool Function %20
+       %x_13 = OpVariable %_ptr_Function_int Function %23
+       %x_14 = OpVariable %_ptr_Function_int Function %23
+   %x_76_phi = OpVariable %_ptr_Function_bool Function %20
+   %x_15_phi = OpVariable %_ptr_Function_int Function %23
+       %x_81 = OpVariable %_ptr_Function_bool Function %20
+   %x_81_phi = OpVariable %_ptr_Function_bool Function %20
+   %x_14_phi = OpVariable %_ptr_Function_int Function %23
+   %x_91_phi = OpVariable %_ptr_Function_bool Function %20
+               OpStore %x_74 %false
+               OpStore %x_76_phi %false
+               OpBranch %100
+        %100 = OpLabel
+               OpLoopMerge %101 %102 None
+               OpBranch %103
+        %103 = OpLabel
+        %108 = OpLoad %bool %x_76_phi
+               OpStore %x_81_phi %108
+               OpBranch %109
+        %109 = OpLabel
+               OpLoopMerge %110 %111 None
+               OpBranch %112
+        %112 = OpLabel
+        %113 = OpLoad %bool %x_81_phi
+               OpStore %x_81 %113
+        %114 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0
+        %115 = OpLoad %int %114
+        %117 = OpAccessChain %_ptr_Function_int %a %uint_0 %115
+        %118 = OpLoad %int %117
+        %119 = OpIEqual %bool %118 %int_0
+               OpSelectionMerge %120 None
+               OpBranchConditional %119 %121 %120
+        %121 = OpLabel
+               OpStore %x_74 %true
+               OpStore %x_13 %int_42
+               OpStore %x_14_phi %int_42
+               OpStore %x_91_phi %true
+               OpBranch %110
+        %120 = OpLabel
+               OpStore %x_14_phi %int_0
+        %122 = OpLoad %bool %x_81
+               OpStore %x_91_phi %122
+               OpBranch %110
+        %111 = OpLabel
+               OpStore %x_81_phi %false
+               OpBranch %109
+        %110 = OpLabel
+        %123 = OpLoad %int %x_14_phi
+               OpStore %x_14 %123
+        %124 = OpLoad %bool %x_91_phi
+        %125 = OpLoad %int %x_14
+               OpStore %x_15_phi %125
+               OpSelectionMerge %126 None
+               OpBranchConditional %124 %127 %126
+        %127 = OpLabel
+               OpBranch %101
+        %126 = OpLabel
+               OpStore %x_74 %true
+               OpStore %x_13 %int_42
+               OpStore %x_15_phi %int_42
+               OpBranch %101
+        %102 = OpLabel
+               OpStore %x_76_phi %false
+               OpBranch %100
+        %101 = OpLabel
+        %128 = OpLoad %int %x_15_phi
+               OpReturnValue %128
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-param-uniform/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-param-uniform/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..29debc5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-param-uniform/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,129 @@
+struct Array {
+  values : array<i32, 2>;
+};
+
+[[block]]
+struct buf0 {
+  zero : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_52 : bool = false;
+  var x_17 : i32;
+  var x_18 : i32;
+  var x_16 : array<i32, 2>;
+  var param : Array;
+  var x_20 : i32;
+  var x_21_phi : i32;
+  let x_12 : i32 = x_8.zero;
+  let x_22 : array<i32, 2> = x_16;
+  var x_23_1 : array<i32, 2> = x_22;
+  x_23_1[0u] = x_12;
+  let x_23 : array<i32, 2> = x_23_1;
+  x_16 = x_23;
+  let x_54 : array<i32, 2> = x_16;
+  param = Array(x_54);
+  x_52 = false;
+  loop {
+    var x_20_phi : i32;
+    var x_67_phi : bool;
+    loop {
+      let x_19 : i32 = param.values[x_12];
+      if ((x_19 == 0)) {
+        x_52 = true;
+        x_17 = 42;
+        x_20_phi = 42;
+        x_67_phi = true;
+        break;
+      }
+      x_20_phi = 0;
+      x_67_phi = false;
+      break;
+    }
+    x_20 = x_20_phi;
+    let x_67 : bool = x_67_phi;
+    x_21_phi = x_20;
+    if (x_67) {
+      break;
+    }
+    x_52 = true;
+    x_17 = 42;
+    x_21_phi = 42;
+    break;
+  }
+  let x_21 : i32 = x_21_phi;
+  x_18 = x_21;
+  if ((x_21 == 42)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+fn func_struct_Array_i1_2_1_(a : ptr<function, Array>) -> i32 {
+  var x_74 : bool = false;
+  var x_13 : i32;
+  var x_14 : i32;
+  var x_76_phi : bool;
+  var x_15_phi : i32;
+  x_76_phi = false;
+  loop {
+    var x_81 : bool;
+    var x_81_phi : bool;
+    var x_14_phi : i32;
+    var x_91_phi : bool;
+    let x_76 : bool = x_76_phi;
+    x_81_phi = x_76;
+    loop {
+      x_81 = x_81_phi;
+      let x_10 : i32 = x_8.zero;
+      let x_11 : i32 = (*(a)).values[x_10];
+      if ((x_11 == 0)) {
+        x_74 = true;
+        x_13 = 42;
+        x_14_phi = 42;
+        x_91_phi = true;
+        break;
+      }
+      x_14_phi = 0;
+      x_91_phi = x_81;
+      break;
+
+      continuing {
+        x_81_phi = false;
+      }
+    }
+    x_14 = x_14_phi;
+    let x_91 : bool = x_91_phi;
+    x_15_phi = x_14;
+    if (x_91) {
+      break;
+    }
+    x_74 = true;
+    x_13 = 42;
+    x_15_phi = 42;
+    break;
+
+    continuing {
+      x_76_phi = false;
+    }
+  }
+  let x_15 : i32 = x_15_phi;
+  return x_15;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-param-uniform/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-param-uniform/0-opt.wgsl
new file mode 100644
index 0000000..29debc5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-param-uniform/0-opt.wgsl
@@ -0,0 +1,129 @@
+struct Array {
+  values : array<i32, 2>;
+};
+
+[[block]]
+struct buf0 {
+  zero : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_52 : bool = false;
+  var x_17 : i32;
+  var x_18 : i32;
+  var x_16 : array<i32, 2>;
+  var param : Array;
+  var x_20 : i32;
+  var x_21_phi : i32;
+  let x_12 : i32 = x_8.zero;
+  let x_22 : array<i32, 2> = x_16;
+  var x_23_1 : array<i32, 2> = x_22;
+  x_23_1[0u] = x_12;
+  let x_23 : array<i32, 2> = x_23_1;
+  x_16 = x_23;
+  let x_54 : array<i32, 2> = x_16;
+  param = Array(x_54);
+  x_52 = false;
+  loop {
+    var x_20_phi : i32;
+    var x_67_phi : bool;
+    loop {
+      let x_19 : i32 = param.values[x_12];
+      if ((x_19 == 0)) {
+        x_52 = true;
+        x_17 = 42;
+        x_20_phi = 42;
+        x_67_phi = true;
+        break;
+      }
+      x_20_phi = 0;
+      x_67_phi = false;
+      break;
+    }
+    x_20 = x_20_phi;
+    let x_67 : bool = x_67_phi;
+    x_21_phi = x_20;
+    if (x_67) {
+      break;
+    }
+    x_52 = true;
+    x_17 = 42;
+    x_21_phi = 42;
+    break;
+  }
+  let x_21 : i32 = x_21_phi;
+  x_18 = x_21;
+  if ((x_21 == 42)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+fn func_struct_Array_i1_2_1_(a : ptr<function, Array>) -> i32 {
+  var x_74 : bool = false;
+  var x_13 : i32;
+  var x_14 : i32;
+  var x_76_phi : bool;
+  var x_15_phi : i32;
+  x_76_phi = false;
+  loop {
+    var x_81 : bool;
+    var x_81_phi : bool;
+    var x_14_phi : i32;
+    var x_91_phi : bool;
+    let x_76 : bool = x_76_phi;
+    x_81_phi = x_76;
+    loop {
+      x_81 = x_81_phi;
+      let x_10 : i32 = x_8.zero;
+      let x_11 : i32 = (*(a)).values[x_10];
+      if ((x_11 == 0)) {
+        x_74 = true;
+        x_13 = 42;
+        x_14_phi = 42;
+        x_91_phi = true;
+        break;
+      }
+      x_14_phi = 0;
+      x_91_phi = x_81;
+      break;
+
+      continuing {
+        x_81_phi = false;
+      }
+    }
+    x_14 = x_14_phi;
+    let x_91 : bool = x_91_phi;
+    x_15_phi = x_14;
+    if (x_91) {
+      break;
+    }
+    x_74 = true;
+    x_13 = 42;
+    x_15_phi = 42;
+    break;
+
+    continuing {
+      x_76_phi = false;
+    }
+  }
+  let x_15 : i32 = x_15_phi;
+  return x_15;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-param-uniform/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-param-uniform/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..e7e6754
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-param-uniform/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,122 @@
+struct Array {
+  int values[2];
+};
+
+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);
+
+void main_1() {
+  bool x_52 = false;
+  int x_17 = 0;
+  int x_18 = 0;
+  int x_16[2] = (int[2])0;
+  Array param = (Array)0;
+  int x_20 = 0;
+  int x_21_phi = 0;
+  const int x_12 = asint(x_8[0].x);
+  int x_23_1[2] = x_16;
+  x_23_1[0u] = x_12;
+  x_16 = x_23_1;
+  const Array tint_symbol_3 = {x_16};
+  param = tint_symbol_3;
+  x_52 = false;
+  while (true) {
+    int x_20_phi = 0;
+    bool x_67_phi = false;
+    while (true) {
+      const int x_19 = param.values[x_12];
+      if ((x_19 == 0)) {
+        x_52 = true;
+        x_17 = 42;
+        x_20_phi = 42;
+        x_67_phi = true;
+        break;
+      }
+      x_20_phi = 0;
+      x_67_phi = false;
+      break;
+    }
+    x_20 = x_20_phi;
+    const bool x_67 = x_67_phi;
+    x_21_phi = x_20;
+    if (x_67) {
+      break;
+    }
+    x_52 = true;
+    x_17 = 42;
+    x_21_phi = 42;
+    break;
+  }
+  const int x_21 = x_21_phi;
+  x_18 = x_21;
+  if ((x_21 == 42)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
+int func_struct_Array_i1_2_1_(inout Array a) {
+  bool x_74 = false;
+  int x_13 = 0;
+  int x_14 = 0;
+  bool x_76_phi = false;
+  int x_15_phi = 0;
+  x_76_phi = false;
+  while (true) {
+    bool x_81 = false;
+    bool x_81_phi = false;
+    int x_14_phi = 0;
+    bool x_91_phi = false;
+    x_81_phi = x_76_phi;
+    while (true) {
+      x_81 = x_81_phi;
+      const int x_10 = asint(x_8[0].x);
+      const int x_11 = a.values[x_10];
+      if ((x_11 == 0)) {
+        x_74 = true;
+        x_13 = 42;
+        x_14_phi = 42;
+        x_91_phi = true;
+        break;
+      }
+      x_14_phi = 0;
+      x_91_phi = x_81;
+      break;
+      {
+        x_81_phi = false;
+      }
+    }
+    x_14 = x_14_phi;
+    const bool x_91 = x_91_phi;
+    x_15_phi = x_14;
+    if (x_91) {
+      break;
+    }
+    x_74 = true;
+    x_13 = 42;
+    x_15_phi = 42;
+    break;
+    {
+      x_76_phi = false;
+    }
+  }
+  return x_15_phi;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-param-uniform/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-param-uniform/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..d77e254
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-param-uniform/0-opt.wgsl.expected.msl
@@ -0,0 +1,132 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  int arr[2];
+};
+struct Array {
+  tint_array_wrapper values;
+};
+struct buf0 {
+  /* 0x0000 */ int zero;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_5) {
+  bool x_52 = false;
+  int x_17 = 0;
+  int x_18 = 0;
+  tint_array_wrapper x_16 = {};
+  Array param = {};
+  int x_20 = 0;
+  int x_21_phi = 0;
+  int const x_12 = x_8.zero;
+  tint_array_wrapper const x_22 = x_16;
+  tint_array_wrapper x_23_1 = x_22;
+  x_23_1.arr[0u] = x_12;
+  tint_array_wrapper const x_23 = x_23_1;
+  x_16 = x_23;
+  tint_array_wrapper const x_54 = x_16;
+  Array const tint_symbol_3 = {.values=x_54};
+  param = tint_symbol_3;
+  x_52 = false;
+  while (true) {
+    int x_20_phi = 0;
+    bool x_67_phi = false;
+    while (true) {
+      int const x_19 = param.values.arr[x_12];
+      if ((x_19 == 0)) {
+        x_52 = true;
+        x_17 = 42;
+        x_20_phi = 42;
+        x_67_phi = true;
+        break;
+      }
+      x_20_phi = 0;
+      x_67_phi = false;
+      break;
+    }
+    x_20 = x_20_phi;
+    bool const x_67 = x_67_phi;
+    x_21_phi = x_20;
+    if (x_67) {
+      break;
+    }
+    x_52 = true;
+    x_17 = 42;
+    x_21_phi = 42;
+    break;
+  }
+  int const x_21 = x_21_phi;
+  x_18 = x_21;
+  if ((x_21 == 42)) {
+    *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_5) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_8, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
+int func_struct_Array_i1_2_1_(constant buf0& x_8, thread Array* const a) {
+  bool x_74 = false;
+  int x_13 = 0;
+  int x_14 = 0;
+  bool x_76_phi = false;
+  int x_15_phi = 0;
+  x_76_phi = false;
+  while (true) {
+    bool x_81 = false;
+    bool x_81_phi = false;
+    int x_14_phi = 0;
+    bool x_91_phi = false;
+    bool const x_76 = x_76_phi;
+    x_81_phi = x_76;
+    while (true) {
+      x_81 = x_81_phi;
+      int const x_10 = x_8.zero;
+      int const x_11 = (*(a)).values.arr[x_10];
+      if ((x_11 == 0)) {
+        x_74 = true;
+        x_13 = 42;
+        x_14_phi = 42;
+        x_91_phi = true;
+        break;
+      }
+      x_14_phi = 0;
+      x_91_phi = x_81;
+      break;
+      {
+        x_81_phi = false;
+      }
+    }
+    x_14 = x_14_phi;
+    bool const x_91 = x_91_phi;
+    x_15_phi = x_14;
+    if (x_91) {
+      break;
+    }
+    x_74 = true;
+    x_13 = 42;
+    x_15_phi = 42;
+    break;
+    {
+      x_76_phi = false;
+    }
+  }
+  int const x_15 = x_15_phi;
+  return x_15;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-param-uniform/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-param-uniform/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..83f6e26
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-param-uniform/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,261 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 129
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_52 "x_52"
+               OpName %x_17 "x_17"
+               OpName %x_18 "x_18"
+               OpName %x_16 "x_16"
+               OpName %Array "Array"
+               OpMemberName %Array 0 "values"
+               OpName %param "param"
+               OpName %x_20 "x_20"
+               OpName %x_21_phi "x_21_phi"
+               OpName %x_23_1 "x_23_1"
+               OpName %x_20_phi "x_20_phi"
+               OpName %x_67_phi "x_67_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpName %func_struct_Array_i1_2_1_ "func_struct_Array_i1_2_1_"
+               OpName %a "a"
+               OpName %x_74 "x_74"
+               OpName %x_13 "x_13"
+               OpName %x_14 "x_14"
+               OpName %x_76_phi "x_76_phi"
+               OpName %x_15_phi "x_15_phi"
+               OpName %x_81 "x_81"
+               OpName %x_81_phi "x_81_phi"
+               OpName %x_14_phi "x_14_phi"
+               OpName %x_91_phi "x_91_phi"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 4
+               OpMemberDecorate %Array 0 Offset 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %20 = OpConstantNull %bool
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+%_ptr_Function__arr_int_uint_2 = OpTypePointer Function %_arr_int_uint_2
+         %30 = OpConstantNull %_arr_int_uint_2
+      %Array = OpTypeStruct %_arr_int_uint_2
+%_ptr_Function_Array = OpTypePointer Function %Array
+         %34 = OpConstantNull %Array
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %true = OpConstantTrue %bool
+     %int_42 = OpConstant %int 42
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %77 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %78 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %79 = OpTypeFunction %void %main_out
+         %91 = OpTypeFunction %int %_ptr_Function_Array
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+       %x_52 = OpVariable %_ptr_Function_bool Function %20
+       %x_17 = OpVariable %_ptr_Function_int Function %23
+       %x_18 = OpVariable %_ptr_Function_int Function %23
+       %x_16 = OpVariable %_ptr_Function__arr_int_uint_2 Function %30
+      %param = OpVariable %_ptr_Function_Array Function %34
+       %x_20 = OpVariable %_ptr_Function_int Function %23
+   %x_21_phi = OpVariable %_ptr_Function_int Function %23
+     %x_23_1 = OpVariable %_ptr_Function__arr_int_uint_2 Function %30
+   %x_20_phi = OpVariable %_ptr_Function_int Function %23
+   %x_67_phi = OpVariable %_ptr_Function_bool Function %20
+               OpStore %x_52 %false
+         %39 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0
+         %40 = OpLoad %int %39
+         %41 = OpLoad %_arr_int_uint_2 %x_16
+               OpStore %x_23_1 %41
+         %43 = OpAccessChain %_ptr_Function_int %x_23_1 %uint_0
+               OpStore %43 %40
+         %44 = OpLoad %_arr_int_uint_2 %x_23_1
+               OpStore %x_16 %44
+         %45 = OpLoad %_arr_int_uint_2 %x_16
+         %46 = OpCompositeConstruct %Array %45
+               OpStore %param %46
+               OpStore %x_52 %false
+               OpBranch %47
+         %47 = OpLabel
+               OpLoopMerge %48 %49 None
+               OpBranch %50
+         %50 = OpLabel
+               OpBranch %53
+         %53 = OpLabel
+               OpLoopMerge %54 %55 None
+               OpBranch %56
+         %56 = OpLabel
+         %57 = OpAccessChain %_ptr_Function_int %param %uint_0 %40
+         %58 = OpLoad %int %57
+         %60 = OpIEqual %bool %58 %int_0
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %61
+         %62 = OpLabel
+               OpStore %x_52 %true
+               OpStore %x_17 %int_42
+               OpStore %x_20_phi %int_42
+               OpStore %x_67_phi %true
+               OpBranch %54
+         %61 = OpLabel
+               OpStore %x_20_phi %int_0
+               OpStore %x_67_phi %false
+               OpBranch %54
+         %55 = OpLabel
+               OpBranch %53
+         %54 = OpLabel
+         %65 = OpLoad %int %x_20_phi
+               OpStore %x_20 %65
+         %66 = OpLoad %bool %x_67_phi
+         %67 = OpLoad %int %x_20
+               OpStore %x_21_phi %67
+               OpSelectionMerge %68 None
+               OpBranchConditional %66 %69 %68
+         %69 = OpLabel
+               OpBranch %48
+         %68 = OpLabel
+               OpStore %x_52 %true
+               OpStore %x_17 %int_42
+               OpStore %x_21_phi %int_42
+               OpBranch %48
+         %49 = OpLabel
+               OpBranch %47
+         %48 = OpLabel
+         %70 = OpLoad %int %x_21_phi
+               OpStore %x_18 %70
+         %71 = OpIEqual %bool %70 %int_42
+               OpSelectionMerge %72 None
+               OpBranchConditional %71 %73 %74
+         %73 = OpLabel
+               OpStore %x_GLF_color %77
+               OpBranch %72
+         %74 = OpLabel
+               OpStore %x_GLF_color %78
+               OpBranch %72
+         %72 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %79
+%tint_symbol = OpFunctionParameter %main_out
+         %83 = OpLabel
+         %84 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %84
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %86 = OpLabel
+         %87 = OpFunctionCall %void %main_1
+         %89 = OpLoad %v4float %x_GLF_color
+         %90 = OpCompositeConstruct %main_out %89
+         %88 = OpFunctionCall %void %tint_symbol_2 %90
+               OpReturn
+               OpFunctionEnd
+%func_struct_Array_i1_2_1_ = OpFunction %int None %91
+          %a = OpFunctionParameter %_ptr_Function_Array
+         %94 = OpLabel
+       %x_74 = OpVariable %_ptr_Function_bool Function %20
+       %x_13 = OpVariable %_ptr_Function_int Function %23
+       %x_14 = OpVariable %_ptr_Function_int Function %23
+   %x_76_phi = OpVariable %_ptr_Function_bool Function %20
+   %x_15_phi = OpVariable %_ptr_Function_int Function %23
+       %x_81 = OpVariable %_ptr_Function_bool Function %20
+   %x_81_phi = OpVariable %_ptr_Function_bool Function %20
+   %x_14_phi = OpVariable %_ptr_Function_int Function %23
+   %x_91_phi = OpVariable %_ptr_Function_bool Function %20
+               OpStore %x_74 %false
+               OpStore %x_76_phi %false
+               OpBranch %100
+        %100 = OpLabel
+               OpLoopMerge %101 %102 None
+               OpBranch %103
+        %103 = OpLabel
+        %108 = OpLoad %bool %x_76_phi
+               OpStore %x_81_phi %108
+               OpBranch %109
+        %109 = OpLabel
+               OpLoopMerge %110 %111 None
+               OpBranch %112
+        %112 = OpLabel
+        %113 = OpLoad %bool %x_81_phi
+               OpStore %x_81 %113
+        %114 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0
+        %115 = OpLoad %int %114
+        %117 = OpAccessChain %_ptr_Function_int %a %uint_0 %115
+        %118 = OpLoad %int %117
+        %119 = OpIEqual %bool %118 %int_0
+               OpSelectionMerge %120 None
+               OpBranchConditional %119 %121 %120
+        %121 = OpLabel
+               OpStore %x_74 %true
+               OpStore %x_13 %int_42
+               OpStore %x_14_phi %int_42
+               OpStore %x_91_phi %true
+               OpBranch %110
+        %120 = OpLabel
+               OpStore %x_14_phi %int_0
+        %122 = OpLoad %bool %x_81
+               OpStore %x_91_phi %122
+               OpBranch %110
+        %111 = OpLabel
+               OpStore %x_81_phi %false
+               OpBranch %109
+        %110 = OpLabel
+        %123 = OpLoad %int %x_14_phi
+               OpStore %x_14 %123
+        %124 = OpLoad %bool %x_91_phi
+        %125 = OpLoad %int %x_14
+               OpStore %x_15_phi %125
+               OpSelectionMerge %126 None
+               OpBranchConditional %124 %127 %126
+        %127 = OpLabel
+               OpBranch %101
+        %126 = OpLabel
+               OpStore %x_74 %true
+               OpStore %x_13 %int_42
+               OpStore %x_15_phi %int_42
+               OpBranch %101
+        %102 = OpLabel
+               OpStore %x_76_phi %false
+               OpBranch %100
+        %101 = OpLabel
+        %128 = OpLoad %int %x_15_phi
+               OpReturnValue %128
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-param-uniform/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-param-uniform/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..29debc5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-copy-prop-arrays-param-uniform/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,129 @@
+struct Array {
+  values : array<i32, 2>;
+};
+
+[[block]]
+struct buf0 {
+  zero : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_52 : bool = false;
+  var x_17 : i32;
+  var x_18 : i32;
+  var x_16 : array<i32, 2>;
+  var param : Array;
+  var x_20 : i32;
+  var x_21_phi : i32;
+  let x_12 : i32 = x_8.zero;
+  let x_22 : array<i32, 2> = x_16;
+  var x_23_1 : array<i32, 2> = x_22;
+  x_23_1[0u] = x_12;
+  let x_23 : array<i32, 2> = x_23_1;
+  x_16 = x_23;
+  let x_54 : array<i32, 2> = x_16;
+  param = Array(x_54);
+  x_52 = false;
+  loop {
+    var x_20_phi : i32;
+    var x_67_phi : bool;
+    loop {
+      let x_19 : i32 = param.values[x_12];
+      if ((x_19 == 0)) {
+        x_52 = true;
+        x_17 = 42;
+        x_20_phi = 42;
+        x_67_phi = true;
+        break;
+      }
+      x_20_phi = 0;
+      x_67_phi = false;
+      break;
+    }
+    x_20 = x_20_phi;
+    let x_67 : bool = x_67_phi;
+    x_21_phi = x_20;
+    if (x_67) {
+      break;
+    }
+    x_52 = true;
+    x_17 = 42;
+    x_21_phi = 42;
+    break;
+  }
+  let x_21 : i32 = x_21_phi;
+  x_18 = x_21;
+  if ((x_21 == 42)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+fn func_struct_Array_i1_2_1_(a : ptr<function, Array>) -> i32 {
+  var x_74 : bool = false;
+  var x_13 : i32;
+  var x_14 : i32;
+  var x_76_phi : bool;
+  var x_15_phi : i32;
+  x_76_phi = false;
+  loop {
+    var x_81 : bool;
+    var x_81_phi : bool;
+    var x_14_phi : i32;
+    var x_91_phi : bool;
+    let x_76 : bool = x_76_phi;
+    x_81_phi = x_76;
+    loop {
+      x_81 = x_81_phi;
+      let x_10 : i32 = x_8.zero;
+      let x_11 : i32 = (*(a)).values[x_10];
+      if ((x_11 == 0)) {
+        x_74 = true;
+        x_13 = 42;
+        x_14_phi = 42;
+        x_91_phi = true;
+        break;
+      }
+      x_14_phi = 0;
+      x_91_phi = x_81;
+      break;
+
+      continuing {
+        x_81_phi = false;
+      }
+    }
+    x_14 = x_14_phi;
+    let x_91 : bool = x_91_phi;
+    x_15_phi = x_14;
+    if (x_91) {
+      break;
+    }
+    x_74 = true;
+    x_13 = 42;
+    x_15_phi = 42;
+    break;
+
+    continuing {
+      x_76_phi = false;
+    }
+  }
+  let x_15 : i32 = x_15_phi;
+  return x_15;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cosh-clamped-to-one/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-cosh-clamped-to-one/0-opt.spvasm
new file mode 100644
index 0000000..2fe322f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cosh-clamped-to-one/0-opt.spvasm
@@ -0,0 +1,76 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %v "v"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_1 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+    %float_1 = OpConstant %float 1
+         %17 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+%_arr_int_uint_1 = OpTypeArray %int %uint_1
+       %buf1 = OpTypeStruct %_arr_int_uint_1
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+     %uint_2 = OpConstant %uint 2
+       %main = OpFunction %void None %12
+         %30 = OpLabel
+          %v = OpVariable %_ptr_Function_v4float Function
+         %31 = OpExtInst %v4float %1 Cosh %17
+         %32 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %33 = OpLoad %float %32
+         %34 = OpCompositeConstruct %v4float %33 %33 %33 %33
+         %35 = OpCompositeConstruct %v4float %float_1 %float_1 %float_1 %float_1
+         %36 = OpExtInst %v4float %1 FClamp %31 %34 %35
+               OpStore %v %36
+         %37 = OpAccessChain %_ptr_Function_float %v %uint_0
+         %38 = OpLoad %float %37
+         %39 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %40 = OpLoad %int %39
+         %41 = OpConvertSToF %float %40
+         %42 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %43 = OpLoad %int %42
+         %44 = OpConvertSToF %float %43
+         %45 = OpAccessChain %_ptr_Function_float %v %uint_2
+         %46 = OpLoad %float %45
+         %47 = OpCompositeConstruct %v4float %38 %41 %44 %46
+               OpStore %_GLF_color %47
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cosh-clamped-to-one/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-cosh-clamped-to-one/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..7223823
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cosh-clamped-to-one/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,36 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[1];
+};
+
+void main_1() {
+  float4 v = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_33 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  v = clamp(cosh(float4(1.0f, 1.0f, 1.0f, 1.0f)), float4(x_33, x_33, x_33, x_33), float4(1.0f, 1.0f, 1.0f, 1.0f));
+  const float x_38 = v.x;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_40 = asint(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const int x_43 = asint(x_8[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  const float x_46 = v.z;
+  x_GLF_color = float4(x_38, float(x_40), float(x_43), x_46);
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cosh-clamped-to-one/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-cosh-clamped-to-one/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..2b232fc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cosh-clamped-to-one/0-opt.spvasm.expected.msl
@@ -0,0 +1,50 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_8, thread float4* const tint_symbol_4) {
+  float4 v = 0.0f;
+  float const x_33 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  v = clamp(cosh(float4(1.0f, 1.0f, 1.0f, 1.0f)), float4(x_33, x_33, x_33, x_33), float4(1.0f, 1.0f, 1.0f, 1.0f));
+  float const x_38 = v.x;
+  int const x_40 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  int const x_43 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  float const x_46 = v.z;
+  *(tint_symbol_4) = float4(x_38, float(x_40), float(x_43), x_46);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_8 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cosh-clamped-to-one/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-cosh-clamped-to-one/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..e90552e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cosh-clamped-to-one/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,108 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 62
+; Schema: 0
+               OpCapability Shader
+         %31 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_8 "x_8"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v "v"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_1 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %11 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %11
+        %int = OpTypeInt 32 1
+%_arr_int_uint_1 = OpTypeArray %int %uint_1
+       %buf1 = OpTypeStruct %_arr_int_uint_1
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %11
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+         %34 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+%_ptr_Function_float = OpTypePointer Function %float
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+     %uint_2 = OpConstant %uint 2
+   %main_out = OpTypeStruct %v4float
+         %50 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+          %v = OpVariable %_ptr_Function_v4float Function %11
+         %28 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %29 = OpLoad %float %28
+         %32 = OpExtInst %v4float %31 Cosh %34
+         %35 = OpCompositeConstruct %v4float %29 %29 %29 %29
+         %30 = OpExtInst %v4float %31 NClamp %32 %35 %34
+               OpStore %v %30
+         %37 = OpAccessChain %_ptr_Function_float %v %uint_0
+         %38 = OpLoad %float %37
+         %40 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %41 = OpLoad %int %40
+         %42 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %43 = OpLoad %int %42
+         %45 = OpAccessChain %_ptr_Function_float %v %uint_2
+         %46 = OpLoad %float %45
+         %47 = OpConvertSToF %float %41
+         %48 = OpConvertSToF %float %43
+         %49 = OpCompositeConstruct %v4float %38 %47 %48 %46
+               OpStore %x_GLF_color %49
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %50
+%tint_symbol = OpFunctionParameter %main_out
+         %54 = OpLabel
+         %55 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %55
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+         %57 = OpLabel
+         %58 = OpFunctionCall %void %main_1
+         %60 = OpLoad %v4float %x_GLF_color
+         %61 = OpCompositeConstruct %main_out %60
+         %59 = OpFunctionCall %void %tint_symbol_2 %61
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cosh-clamped-to-one/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-cosh-clamped-to-one/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..b0081f2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cosh-clamped-to-one/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,42 @@
+type Arr = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 1>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+fn main_1() {
+  var v : vec4<f32>;
+  let x_33 : f32 = x_6.x_GLF_uniform_float_values[0];
+  v = clamp(cosh(vec4<f32>(1.0, 1.0, 1.0, 1.0)), vec4<f32>(x_33, x_33, x_33, x_33), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+  let x_38 : f32 = v.x;
+  let x_40 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_43 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_46 : f32 = v.z;
+  x_GLF_color = vec4<f32>(x_38, f32(x_40), f32(x_43), x_46);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cosh-clamped-to-one/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-cosh-clamped-to-one/0-opt.wgsl
new file mode 100644
index 0000000..b0081f2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cosh-clamped-to-one/0-opt.wgsl
@@ -0,0 +1,42 @@
+type Arr = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 1>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+fn main_1() {
+  var v : vec4<f32>;
+  let x_33 : f32 = x_6.x_GLF_uniform_float_values[0];
+  v = clamp(cosh(vec4<f32>(1.0, 1.0, 1.0, 1.0)), vec4<f32>(x_33, x_33, x_33, x_33), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+  let x_38 : f32 = v.x;
+  let x_40 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_43 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_46 : f32 = v.z;
+  x_GLF_color = vec4<f32>(x_38, f32(x_40), f32(x_43), x_46);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cosh-clamped-to-one/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-cosh-clamped-to-one/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..7223823
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cosh-clamped-to-one/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,36 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[1];
+};
+
+void main_1() {
+  float4 v = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_33 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  v = clamp(cosh(float4(1.0f, 1.0f, 1.0f, 1.0f)), float4(x_33, x_33, x_33, x_33), float4(1.0f, 1.0f, 1.0f, 1.0f));
+  const float x_38 = v.x;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_40 = asint(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const int x_43 = asint(x_8[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  const float x_46 = v.z;
+  x_GLF_color = float4(x_38, float(x_40), float(x_43), x_46);
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cosh-clamped-to-one/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-cosh-clamped-to-one/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..2b232fc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cosh-clamped-to-one/0-opt.wgsl.expected.msl
@@ -0,0 +1,50 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_8, thread float4* const tint_symbol_4) {
+  float4 v = 0.0f;
+  float const x_33 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  v = clamp(cosh(float4(1.0f, 1.0f, 1.0f, 1.0f)), float4(x_33, x_33, x_33, x_33), float4(1.0f, 1.0f, 1.0f, 1.0f));
+  float const x_38 = v.x;
+  int const x_40 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  int const x_43 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  float const x_46 = v.z;
+  *(tint_symbol_4) = float4(x_38, float(x_40), float(x_43), x_46);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_8 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cosh-clamped-to-one/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-cosh-clamped-to-one/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..e90552e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cosh-clamped-to-one/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,108 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 62
+; Schema: 0
+               OpCapability Shader
+         %31 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_8 "x_8"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v "v"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_1 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %11 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %11
+        %int = OpTypeInt 32 1
+%_arr_int_uint_1 = OpTypeArray %int %uint_1
+       %buf1 = OpTypeStruct %_arr_int_uint_1
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %11
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+         %34 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+%_ptr_Function_float = OpTypePointer Function %float
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+     %uint_2 = OpConstant %uint 2
+   %main_out = OpTypeStruct %v4float
+         %50 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+          %v = OpVariable %_ptr_Function_v4float Function %11
+         %28 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %29 = OpLoad %float %28
+         %32 = OpExtInst %v4float %31 Cosh %34
+         %35 = OpCompositeConstruct %v4float %29 %29 %29 %29
+         %30 = OpExtInst %v4float %31 NClamp %32 %35 %34
+               OpStore %v %30
+         %37 = OpAccessChain %_ptr_Function_float %v %uint_0
+         %38 = OpLoad %float %37
+         %40 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %41 = OpLoad %int %40
+         %42 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %43 = OpLoad %int %42
+         %45 = OpAccessChain %_ptr_Function_float %v %uint_2
+         %46 = OpLoad %float %45
+         %47 = OpConvertSToF %float %41
+         %48 = OpConvertSToF %float %43
+         %49 = OpCompositeConstruct %v4float %38 %47 %48 %46
+               OpStore %x_GLF_color %49
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %50
+%tint_symbol = OpFunctionParameter %main_out
+         %54 = OpLabel
+         %55 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %55
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+         %57 = OpLabel
+         %58 = OpFunctionCall %void %main_1
+         %60 = OpLoad %v4float %x_GLF_color
+         %61 = OpCompositeConstruct %main_out %60
+         %59 = OpFunctionCall %void %tint_symbol_2 %61
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cosh-clamped-to-one/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-cosh-clamped-to-one/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..b0081f2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cosh-clamped-to-one/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,42 @@
+type Arr = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 1>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+fn main_1() {
+  var v : vec4<f32>;
+  let x_33 : f32 = x_6.x_GLF_uniform_float_values[0];
+  v = clamp(cosh(vec4<f32>(1.0, 1.0, 1.0, 1.0)), vec4<f32>(x_33, x_33, x_33, x_33), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+  let x_38 : f32 = v.x;
+  let x_40 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_43 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_46 : f32 = v.z;
+  x_GLF_color = vec4<f32>(x_38, f32(x_40), f32(x_43), x_46);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/0-opt.spvasm
new file mode 100644
index 0000000..1fa7ee6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/0-opt.spvasm
@@ -0,0 +1,181 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %b "b"
+               OpName %_GLF_color "_GLF_color"
+               OpName %i "i"
+               OpName %i_0 "i"
+               OpName %i_1 "i"
+               OpName %indexable "indexable"
+               OpDecorate %_arr_int_uint_5 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_int_uint_5 = OpTypeArray %int %uint_5
+       %buf0 = OpTypeStruct %_arr_int_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+      %false = OpConstantFalse %bool
+      %int_4 = OpConstant %int 4
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+%_ptr_Function__arr_int_uint_2 = OpTypePointer Function %_arr_int_uint_2
+       %main = OpFunction %void None %14
+         %34 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+          %b = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+        %i_1 = OpVariable %_ptr_Function_int Function
+  %indexable = OpVariable %_ptr_Function__arr_int_uint_2 Function
+         %35 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %36 = OpLoad %int %35
+               OpStore %a %36
+         %37 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %38 = OpLoad %int %37
+               OpStore %b %38
+         %39 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %40 = OpLoad %int %39
+         %41 = OpConvertSToF %float %40
+         %42 = OpCompositeConstruct %v4float %41 %41 %41 %41
+               OpStore %_GLF_color %42
+         %43 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %44 = OpLoad %int %43
+               OpStore %i %44
+               OpBranch %45
+         %45 = OpLabel
+               OpLoopMerge %46 %47 None
+               OpBranch %48
+         %48 = OpLabel
+         %49 = OpLoad %int %i
+         %50 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %51 = OpLoad %int %50
+         %52 = OpSLessThan %bool %49 %51
+               OpBranchConditional %52 %53 %46
+         %53 = OpLabel
+         %54 = OpLoad %int %i
+         %55 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %56 = OpLoad %int %55
+         %57 = OpSGreaterThan %bool %54 %56
+               OpSelectionMerge %58 None
+               OpBranchConditional %57 %59 %58
+         %59 = OpLabel
+         %60 = OpLoad %int %a
+         %61 = OpIAdd %int %60 %int_1
+               OpStore %a %61
+               OpSelectionMerge %62 None
+               OpBranchConditional %false %63 %62
+         %63 = OpLabel
+         %64 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %65 = OpLoad %int %64
+               OpStore %i_0 %65
+               OpBranch %66
+         %66 = OpLabel
+               OpLoopMerge %67 %68 None
+               OpBranch %69
+         %69 = OpLabel
+         %70 = OpLoad %int %i_0
+         %71 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %72 = OpLoad %int %71
+         %73 = OpSLessThan %bool %70 %72
+               OpBranchConditional %73 %74 %67
+         %74 = OpLabel
+               OpReturn
+         %68 = OpLabel
+               OpBranch %66
+         %67 = OpLabel
+               OpBranch %62
+         %62 = OpLabel
+               OpBranch %58
+         %58 = OpLabel
+               OpBranch %47
+         %47 = OpLabel
+         %75 = OpLoad %int %i
+         %76 = OpIAdd %int %75 %int_1
+               OpStore %i %76
+               OpBranch %45
+         %46 = OpLabel
+         %77 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %78 = OpLoad %int %77
+               OpStore %i_1 %78
+               OpBranch %79
+         %79 = OpLabel
+               OpLoopMerge %80 %81 None
+               OpBranch %82
+         %82 = OpLabel
+         %83 = OpLoad %int %i_1
+         %84 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %85 = OpLoad %int %84
+         %86 = OpSLessThan %bool %83 %85
+               OpBranchConditional %86 %87 %80
+         %87 = OpLabel
+         %88 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %89 = OpLoad %int %88
+         %90 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_4
+         %91 = OpLoad %int %90
+         %92 = OpCompositeConstruct %_arr_int_uint_2 %89 %91
+         %93 = OpLoad %int %b
+               OpStore %indexable %92
+         %94 = OpAccessChain %_ptr_Function_int %indexable %93
+         %95 = OpLoad %int %94
+         %96 = OpLoad %int %a
+         %97 = OpIAdd %int %96 %95
+               OpStore %a %97
+               OpBranch %81
+         %81 = OpLabel
+         %98 = OpLoad %int %i_1
+         %99 = OpIAdd %int %98 %int_1
+               OpStore %i_1 %99
+               OpBranch %79
+         %80 = OpLabel
+        %100 = OpLoad %int %a
+        %101 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+        %102 = OpLoad %int %101
+        %103 = OpIEqual %bool %100 %102
+               OpSelectionMerge %104 None
+               OpBranchConditional %103 %105 %104
+        %105 = OpLabel
+        %106 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+        %107 = OpLoad %int %106
+        %108 = OpConvertSToF %float %107
+        %109 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+        %110 = OpLoad %int %109
+        %111 = OpConvertSToF %float %110
+        %112 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+        %113 = OpLoad %int %112
+        %114 = OpConvertSToF %float %113
+        %115 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+        %116 = OpLoad %int %115
+        %117 = OpConvertSToF %float %116
+        %118 = OpCompositeConstruct %v4float %108 %111 %114 %117
+               OpStore %_GLF_color %118
+               OpBranch %104
+        %104 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..773f4d4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,98 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[5];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  int b = 0;
+  int i = 0;
+  int i_1 = 0;
+  int i_2 = 0;
+  int indexable[2] = (int[2])0;
+  const int x_36 = asint(x_6[2].x);
+  a = x_36;
+  const int x_38 = asint(x_6[3].x);
+  b = x_38;
+  const int x_40 = asint(x_6[2].x);
+  const float x_41 = float(x_40);
+  x_GLF_color = float4(x_41, x_41, x_41, x_41);
+  const int x_44 = asint(x_6[2].x);
+  i = x_44;
+  while (true) {
+    const int x_49 = i;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_51 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_49 < x_51)) {
+    } else {
+      break;
+    }
+    const int x_54 = i;
+    const int x_56 = asint(x_6[3].x);
+    if ((x_54 > x_56)) {
+      a = (a + 1);
+      if (false) {
+        const int x_65 = asint(x_6[2].x);
+        i_1 = x_65;
+        while (true) {
+          const int x_70 = i_1;
+          const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+          const int x_72 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+          if ((x_70 < x_72)) {
+          } else {
+            break;
+          }
+          return;
+        }
+      }
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_78 = asint(x_6[2].x);
+  i_2 = x_78;
+  while (true) {
+    const int x_83 = i_2;
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_85 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    if ((x_83 < x_85)) {
+    } else {
+      break;
+    }
+    const int x_89 = asint(x_6[3].x);
+    const int x_91 = asint(x_6[4].x);
+    const int x_93 = b;
+    const int tint_symbol_3[2] = {x_89, x_91};
+    indexable = tint_symbol_3;
+    const int x_95 = indexable[x_93];
+    a = (a + x_95);
+    {
+      i_2 = (i_2 + 1);
+    }
+  }
+  const int x_100 = a;
+  const int x_102 = asint(x_6[1].x);
+  if ((x_100 == x_102)) {
+    const int x_107 = asint(x_6[3].x);
+    const int x_110 = asint(x_6[2].x);
+    const int x_113 = asint(x_6[2].x);
+    const int x_116 = asint(x_6[3].x);
+    x_GLF_color = float4(float(x_107), float(x_110), float(x_113), float(x_116));
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..604ed91
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/0-opt.spvasm.expected.msl
@@ -0,0 +1,112 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[5];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_1 {
+  int arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_5) {
+  int a = 0;
+  int b = 0;
+  int i = 0;
+  int i_1 = 0;
+  int i_2 = 0;
+  tint_array_wrapper_1 indexable = {};
+  int const x_36 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  a = x_36;
+  int const x_38 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  b = x_38;
+  int const x_40 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  float const x_41 = float(x_40);
+  *(tint_symbol_5) = float4(x_41, x_41, x_41, x_41);
+  int const x_44 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  i = x_44;
+  while (true) {
+    int const x_49 = i;
+    int const x_51 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_49 < x_51)) {
+    } else {
+      break;
+    }
+    int const x_54 = i;
+    int const x_56 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    if ((x_54 > x_56)) {
+      int const x_60 = a;
+      a = (x_60 + 1);
+      if (false) {
+        int const x_65 = x_6.x_GLF_uniform_int_values.arr[2].el;
+        i_1 = x_65;
+        while (true) {
+          int const x_70 = i_1;
+          int const x_72 = x_6.x_GLF_uniform_int_values.arr[0].el;
+          if ((x_70 < x_72)) {
+          } else {
+            break;
+          }
+          return;
+        }
+      }
+    }
+    {
+      int const x_75 = i;
+      i = (x_75 + 1);
+    }
+  }
+  int const x_78 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  i_2 = x_78;
+  while (true) {
+    int const x_83 = i_2;
+    int const x_85 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_83 < x_85)) {
+    } else {
+      break;
+    }
+    int const x_89 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    int const x_91 = x_6.x_GLF_uniform_int_values.arr[4].el;
+    int const x_93 = b;
+    tint_array_wrapper_1 const tint_symbol_3 = {.arr={x_89, x_91}};
+    indexable = tint_symbol_3;
+    int const x_95 = indexable.arr[x_93];
+    int const x_96 = a;
+    a = (x_96 + x_95);
+    {
+      int const x_98 = i_2;
+      i_2 = (x_98 + 1);
+    }
+  }
+  int const x_100 = a;
+  int const x_102 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_100 == x_102)) {
+    int const x_107 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    int const x_110 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_113 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_116 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    *(tint_symbol_5) = float4(float(x_107), float(x_110), float(x_113), float(x_116));
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_6, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..fe39eb7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,231 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 142
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %i "i"
+               OpName %i_1 "i_1"
+               OpName %i_2 "i_2"
+               OpName %indexable "indexable"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_5 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_int_uint_5 = OpTypeArray %int %uint_5
+       %buf0 = OpTypeStruct %_arr_int_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+%_ptr_Function__arr_int_uint_2 = OpTypePointer Function %_arr_int_uint_2
+         %30 = OpConstantNull %_arr_int_uint_2
+     %uint_0 = OpConstant %uint 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+      %false = OpConstantFalse %bool
+      %int_4 = OpConstant %int 4
+   %main_out = OpTypeStruct %v4float
+        %130 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+          %b = OpVariable %_ptr_Function_int Function %21
+          %i = OpVariable %_ptr_Function_int Function %21
+        %i_1 = OpVariable %_ptr_Function_int Function %21
+        %i_2 = OpVariable %_ptr_Function_int Function %21
+  %indexable = OpVariable %_ptr_Function__arr_int_uint_2 Function %30
+         %34 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %35 = OpLoad %int %34
+               OpStore %a %35
+         %37 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %38 = OpLoad %int %37
+               OpStore %b %38
+         %39 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %40 = OpLoad %int %39
+         %41 = OpConvertSToF %float %40
+         %42 = OpCompositeConstruct %v4float %41 %41 %41 %41
+               OpStore %x_GLF_color %42
+         %43 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %44 = OpLoad %int %43
+               OpStore %i %44
+               OpBranch %45
+         %45 = OpLabel
+               OpLoopMerge %46 %47 None
+               OpBranch %48
+         %48 = OpLabel
+         %49 = OpLoad %int %i
+         %51 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %52 = OpLoad %int %51
+         %53 = OpSLessThan %bool %49 %52
+               OpSelectionMerge %55 None
+               OpBranchConditional %53 %56 %57
+         %56 = OpLabel
+               OpBranch %55
+         %57 = OpLabel
+               OpBranch %46
+         %55 = OpLabel
+         %58 = OpLoad %int %i
+         %59 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %60 = OpLoad %int %59
+         %61 = OpSGreaterThan %bool %58 %60
+               OpSelectionMerge %62 None
+               OpBranchConditional %61 %63 %62
+         %63 = OpLabel
+         %64 = OpLoad %int %a
+         %66 = OpIAdd %int %64 %int_1
+               OpStore %a %66
+               OpSelectionMerge %68 None
+               OpBranchConditional %false %69 %68
+         %69 = OpLabel
+         %70 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %71 = OpLoad %int %70
+               OpStore %i_1 %71
+               OpBranch %72
+         %72 = OpLabel
+               OpLoopMerge %73 %74 None
+               OpBranch %75
+         %75 = OpLabel
+         %76 = OpLoad %int %i_1
+         %77 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %78 = OpLoad %int %77
+         %79 = OpSLessThan %bool %76 %78
+               OpSelectionMerge %80 None
+               OpBranchConditional %79 %81 %82
+         %81 = OpLabel
+               OpBranch %80
+         %82 = OpLabel
+               OpBranch %73
+         %80 = OpLabel
+               OpReturn
+         %74 = OpLabel
+               OpBranch %72
+         %73 = OpLabel
+               OpBranch %68
+         %68 = OpLabel
+               OpBranch %62
+         %62 = OpLabel
+               OpBranch %47
+         %47 = OpLabel
+         %83 = OpLoad %int %i
+         %84 = OpIAdd %int %83 %int_1
+               OpStore %i %84
+               OpBranch %45
+         %46 = OpLabel
+         %85 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %86 = OpLoad %int %85
+               OpStore %i_2 %86
+               OpBranch %87
+         %87 = OpLabel
+               OpLoopMerge %88 %89 None
+               OpBranch %90
+         %90 = OpLabel
+         %91 = OpLoad %int %i_2
+         %92 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %93 = OpLoad %int %92
+         %94 = OpSLessThan %bool %91 %93
+               OpSelectionMerge %95 None
+               OpBranchConditional %94 %96 %97
+         %96 = OpLabel
+               OpBranch %95
+         %97 = OpLabel
+               OpBranch %88
+         %95 = OpLabel
+         %98 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %99 = OpLoad %int %98
+        %101 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+        %102 = OpLoad %int %101
+        %103 = OpLoad %int %b
+        %104 = OpCompositeConstruct %_arr_int_uint_2 %99 %102
+               OpStore %indexable %104
+        %105 = OpAccessChain %_ptr_Function_int %indexable %103
+        %106 = OpLoad %int %105
+        %107 = OpLoad %int %a
+        %108 = OpIAdd %int %107 %106
+               OpStore %a %108
+               OpBranch %89
+         %89 = OpLabel
+        %109 = OpLoad %int %i_2
+        %110 = OpIAdd %int %109 %int_1
+               OpStore %i_2 %110
+               OpBranch %87
+         %88 = OpLabel
+        %111 = OpLoad %int %a
+        %112 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %113 = OpLoad %int %112
+        %114 = OpIEqual %bool %111 %113
+               OpSelectionMerge %115 None
+               OpBranchConditional %114 %116 %115
+        %116 = OpLabel
+        %117 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+        %118 = OpLoad %int %117
+        %119 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %120 = OpLoad %int %119
+        %121 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %122 = OpLoad %int %121
+        %123 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+        %124 = OpLoad %int %123
+        %125 = OpConvertSToF %float %118
+        %126 = OpConvertSToF %float %120
+        %127 = OpConvertSToF %float %122
+        %128 = OpConvertSToF %float %124
+        %129 = OpCompositeConstruct %v4float %125 %126 %127 %128
+               OpStore %x_GLF_color %129
+               OpBranch %115
+        %115 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %130
+%tint_symbol = OpFunctionParameter %main_out
+        %134 = OpLabel
+        %135 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %135
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %137 = OpLabel
+        %138 = OpFunctionCall %void %main_1
+        %140 = OpLoad %v4float %x_GLF_color
+        %141 = OpCompositeConstruct %main_out %140
+        %139 = OpFunctionCall %void %tint_symbol_2 %141
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..723c264
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,103 @@
+type Arr = [[stride(16)]] array<i32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var b : i32;
+  var i : i32;
+  var i_1 : i32;
+  var i_2 : i32;
+  var indexable : array<i32, 2>;
+  let x_36 : i32 = x_6.x_GLF_uniform_int_values[2];
+  a = x_36;
+  let x_38 : i32 = x_6.x_GLF_uniform_int_values[3];
+  b = x_38;
+  let x_40 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_41 : f32 = f32(x_40);
+  x_GLF_color = vec4<f32>(x_41, x_41, x_41, x_41);
+  let x_44 : i32 = x_6.x_GLF_uniform_int_values[2];
+  i = x_44;
+  loop {
+    let x_49 : i32 = i;
+    let x_51 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_49 < x_51)) {
+    } else {
+      break;
+    }
+    let x_54 : i32 = i;
+    let x_56 : i32 = x_6.x_GLF_uniform_int_values[3];
+    if ((x_54 > x_56)) {
+      let x_60 : i32 = a;
+      a = (x_60 + 1);
+      if (false) {
+        let x_65 : i32 = x_6.x_GLF_uniform_int_values[2];
+        i_1 = x_65;
+        loop {
+          let x_70 : i32 = i_1;
+          let x_72 : i32 = x_6.x_GLF_uniform_int_values[0];
+          if ((x_70 < x_72)) {
+          } else {
+            break;
+          }
+          return;
+        }
+      }
+    }
+
+    continuing {
+      let x_75 : i32 = i;
+      i = (x_75 + 1);
+    }
+  }
+  let x_78 : i32 = x_6.x_GLF_uniform_int_values[2];
+  i_2 = x_78;
+  loop {
+    let x_83 : i32 = i_2;
+    let x_85 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_83 < x_85)) {
+    } else {
+      break;
+    }
+    let x_89 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_91 : i32 = x_6.x_GLF_uniform_int_values[4];
+    let x_93 : i32 = b;
+    indexable = array<i32, 2>(x_89, x_91);
+    let x_95 : i32 = indexable[x_93];
+    let x_96 : i32 = a;
+    a = (x_96 + x_95);
+
+    continuing {
+      let x_98 : i32 = i_2;
+      i_2 = (x_98 + 1);
+    }
+  }
+  let x_100 : i32 = a;
+  let x_102 : i32 = x_6.x_GLF_uniform_int_values[1];
+  if ((x_100 == x_102)) {
+    let x_107 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_110 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_113 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_116 : i32 = x_6.x_GLF_uniform_int_values[3];
+    x_GLF_color = vec4<f32>(f32(x_107), f32(x_110), f32(x_113), f32(x_116));
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/0-opt.wgsl
new file mode 100644
index 0000000..723c264
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/0-opt.wgsl
@@ -0,0 +1,103 @@
+type Arr = [[stride(16)]] array<i32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var b : i32;
+  var i : i32;
+  var i_1 : i32;
+  var i_2 : i32;
+  var indexable : array<i32, 2>;
+  let x_36 : i32 = x_6.x_GLF_uniform_int_values[2];
+  a = x_36;
+  let x_38 : i32 = x_6.x_GLF_uniform_int_values[3];
+  b = x_38;
+  let x_40 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_41 : f32 = f32(x_40);
+  x_GLF_color = vec4<f32>(x_41, x_41, x_41, x_41);
+  let x_44 : i32 = x_6.x_GLF_uniform_int_values[2];
+  i = x_44;
+  loop {
+    let x_49 : i32 = i;
+    let x_51 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_49 < x_51)) {
+    } else {
+      break;
+    }
+    let x_54 : i32 = i;
+    let x_56 : i32 = x_6.x_GLF_uniform_int_values[3];
+    if ((x_54 > x_56)) {
+      let x_60 : i32 = a;
+      a = (x_60 + 1);
+      if (false) {
+        let x_65 : i32 = x_6.x_GLF_uniform_int_values[2];
+        i_1 = x_65;
+        loop {
+          let x_70 : i32 = i_1;
+          let x_72 : i32 = x_6.x_GLF_uniform_int_values[0];
+          if ((x_70 < x_72)) {
+          } else {
+            break;
+          }
+          return;
+        }
+      }
+    }
+
+    continuing {
+      let x_75 : i32 = i;
+      i = (x_75 + 1);
+    }
+  }
+  let x_78 : i32 = x_6.x_GLF_uniform_int_values[2];
+  i_2 = x_78;
+  loop {
+    let x_83 : i32 = i_2;
+    let x_85 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_83 < x_85)) {
+    } else {
+      break;
+    }
+    let x_89 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_91 : i32 = x_6.x_GLF_uniform_int_values[4];
+    let x_93 : i32 = b;
+    indexable = array<i32, 2>(x_89, x_91);
+    let x_95 : i32 = indexable[x_93];
+    let x_96 : i32 = a;
+    a = (x_96 + x_95);
+
+    continuing {
+      let x_98 : i32 = i_2;
+      i_2 = (x_98 + 1);
+    }
+  }
+  let x_100 : i32 = a;
+  let x_102 : i32 = x_6.x_GLF_uniform_int_values[1];
+  if ((x_100 == x_102)) {
+    let x_107 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_110 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_113 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_116 : i32 = x_6.x_GLF_uniform_int_values[3];
+    x_GLF_color = vec4<f32>(f32(x_107), f32(x_110), f32(x_113), f32(x_116));
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..773f4d4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,98 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[5];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  int b = 0;
+  int i = 0;
+  int i_1 = 0;
+  int i_2 = 0;
+  int indexable[2] = (int[2])0;
+  const int x_36 = asint(x_6[2].x);
+  a = x_36;
+  const int x_38 = asint(x_6[3].x);
+  b = x_38;
+  const int x_40 = asint(x_6[2].x);
+  const float x_41 = float(x_40);
+  x_GLF_color = float4(x_41, x_41, x_41, x_41);
+  const int x_44 = asint(x_6[2].x);
+  i = x_44;
+  while (true) {
+    const int x_49 = i;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_51 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_49 < x_51)) {
+    } else {
+      break;
+    }
+    const int x_54 = i;
+    const int x_56 = asint(x_6[3].x);
+    if ((x_54 > x_56)) {
+      a = (a + 1);
+      if (false) {
+        const int x_65 = asint(x_6[2].x);
+        i_1 = x_65;
+        while (true) {
+          const int x_70 = i_1;
+          const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+          const int x_72 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+          if ((x_70 < x_72)) {
+          } else {
+            break;
+          }
+          return;
+        }
+      }
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_78 = asint(x_6[2].x);
+  i_2 = x_78;
+  while (true) {
+    const int x_83 = i_2;
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_85 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    if ((x_83 < x_85)) {
+    } else {
+      break;
+    }
+    const int x_89 = asint(x_6[3].x);
+    const int x_91 = asint(x_6[4].x);
+    const int x_93 = b;
+    const int tint_symbol_3[2] = {x_89, x_91};
+    indexable = tint_symbol_3;
+    const int x_95 = indexable[x_93];
+    a = (a + x_95);
+    {
+      i_2 = (i_2 + 1);
+    }
+  }
+  const int x_100 = a;
+  const int x_102 = asint(x_6[1].x);
+  if ((x_100 == x_102)) {
+    const int x_107 = asint(x_6[3].x);
+    const int x_110 = asint(x_6[2].x);
+    const int x_113 = asint(x_6[2].x);
+    const int x_116 = asint(x_6[3].x);
+    x_GLF_color = float4(float(x_107), float(x_110), float(x_113), float(x_116));
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..604ed91
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/0-opt.wgsl.expected.msl
@@ -0,0 +1,112 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[5];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_1 {
+  int arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_5) {
+  int a = 0;
+  int b = 0;
+  int i = 0;
+  int i_1 = 0;
+  int i_2 = 0;
+  tint_array_wrapper_1 indexable = {};
+  int const x_36 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  a = x_36;
+  int const x_38 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  b = x_38;
+  int const x_40 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  float const x_41 = float(x_40);
+  *(tint_symbol_5) = float4(x_41, x_41, x_41, x_41);
+  int const x_44 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  i = x_44;
+  while (true) {
+    int const x_49 = i;
+    int const x_51 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_49 < x_51)) {
+    } else {
+      break;
+    }
+    int const x_54 = i;
+    int const x_56 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    if ((x_54 > x_56)) {
+      int const x_60 = a;
+      a = (x_60 + 1);
+      if (false) {
+        int const x_65 = x_6.x_GLF_uniform_int_values.arr[2].el;
+        i_1 = x_65;
+        while (true) {
+          int const x_70 = i_1;
+          int const x_72 = x_6.x_GLF_uniform_int_values.arr[0].el;
+          if ((x_70 < x_72)) {
+          } else {
+            break;
+          }
+          return;
+        }
+      }
+    }
+    {
+      int const x_75 = i;
+      i = (x_75 + 1);
+    }
+  }
+  int const x_78 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  i_2 = x_78;
+  while (true) {
+    int const x_83 = i_2;
+    int const x_85 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_83 < x_85)) {
+    } else {
+      break;
+    }
+    int const x_89 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    int const x_91 = x_6.x_GLF_uniform_int_values.arr[4].el;
+    int const x_93 = b;
+    tint_array_wrapper_1 const tint_symbol_3 = {.arr={x_89, x_91}};
+    indexable = tint_symbol_3;
+    int const x_95 = indexable.arr[x_93];
+    int const x_96 = a;
+    a = (x_96 + x_95);
+    {
+      int const x_98 = i_2;
+      i_2 = (x_98 + 1);
+    }
+  }
+  int const x_100 = a;
+  int const x_102 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_100 == x_102)) {
+    int const x_107 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    int const x_110 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_113 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_116 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    *(tint_symbol_5) = float4(float(x_107), float(x_110), float(x_113), float(x_116));
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_6, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..fe39eb7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,231 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 142
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %i "i"
+               OpName %i_1 "i_1"
+               OpName %i_2 "i_2"
+               OpName %indexable "indexable"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_5 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_int_uint_5 = OpTypeArray %int %uint_5
+       %buf0 = OpTypeStruct %_arr_int_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+%_ptr_Function__arr_int_uint_2 = OpTypePointer Function %_arr_int_uint_2
+         %30 = OpConstantNull %_arr_int_uint_2
+     %uint_0 = OpConstant %uint 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+      %false = OpConstantFalse %bool
+      %int_4 = OpConstant %int 4
+   %main_out = OpTypeStruct %v4float
+        %130 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+          %b = OpVariable %_ptr_Function_int Function %21
+          %i = OpVariable %_ptr_Function_int Function %21
+        %i_1 = OpVariable %_ptr_Function_int Function %21
+        %i_2 = OpVariable %_ptr_Function_int Function %21
+  %indexable = OpVariable %_ptr_Function__arr_int_uint_2 Function %30
+         %34 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %35 = OpLoad %int %34
+               OpStore %a %35
+         %37 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %38 = OpLoad %int %37
+               OpStore %b %38
+         %39 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %40 = OpLoad %int %39
+         %41 = OpConvertSToF %float %40
+         %42 = OpCompositeConstruct %v4float %41 %41 %41 %41
+               OpStore %x_GLF_color %42
+         %43 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %44 = OpLoad %int %43
+               OpStore %i %44
+               OpBranch %45
+         %45 = OpLabel
+               OpLoopMerge %46 %47 None
+               OpBranch %48
+         %48 = OpLabel
+         %49 = OpLoad %int %i
+         %51 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %52 = OpLoad %int %51
+         %53 = OpSLessThan %bool %49 %52
+               OpSelectionMerge %55 None
+               OpBranchConditional %53 %56 %57
+         %56 = OpLabel
+               OpBranch %55
+         %57 = OpLabel
+               OpBranch %46
+         %55 = OpLabel
+         %58 = OpLoad %int %i
+         %59 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %60 = OpLoad %int %59
+         %61 = OpSGreaterThan %bool %58 %60
+               OpSelectionMerge %62 None
+               OpBranchConditional %61 %63 %62
+         %63 = OpLabel
+         %64 = OpLoad %int %a
+         %66 = OpIAdd %int %64 %int_1
+               OpStore %a %66
+               OpSelectionMerge %68 None
+               OpBranchConditional %false %69 %68
+         %69 = OpLabel
+         %70 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %71 = OpLoad %int %70
+               OpStore %i_1 %71
+               OpBranch %72
+         %72 = OpLabel
+               OpLoopMerge %73 %74 None
+               OpBranch %75
+         %75 = OpLabel
+         %76 = OpLoad %int %i_1
+         %77 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %78 = OpLoad %int %77
+         %79 = OpSLessThan %bool %76 %78
+               OpSelectionMerge %80 None
+               OpBranchConditional %79 %81 %82
+         %81 = OpLabel
+               OpBranch %80
+         %82 = OpLabel
+               OpBranch %73
+         %80 = OpLabel
+               OpReturn
+         %74 = OpLabel
+               OpBranch %72
+         %73 = OpLabel
+               OpBranch %68
+         %68 = OpLabel
+               OpBranch %62
+         %62 = OpLabel
+               OpBranch %47
+         %47 = OpLabel
+         %83 = OpLoad %int %i
+         %84 = OpIAdd %int %83 %int_1
+               OpStore %i %84
+               OpBranch %45
+         %46 = OpLabel
+         %85 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %86 = OpLoad %int %85
+               OpStore %i_2 %86
+               OpBranch %87
+         %87 = OpLabel
+               OpLoopMerge %88 %89 None
+               OpBranch %90
+         %90 = OpLabel
+         %91 = OpLoad %int %i_2
+         %92 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %93 = OpLoad %int %92
+         %94 = OpSLessThan %bool %91 %93
+               OpSelectionMerge %95 None
+               OpBranchConditional %94 %96 %97
+         %96 = OpLabel
+               OpBranch %95
+         %97 = OpLabel
+               OpBranch %88
+         %95 = OpLabel
+         %98 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %99 = OpLoad %int %98
+        %101 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+        %102 = OpLoad %int %101
+        %103 = OpLoad %int %b
+        %104 = OpCompositeConstruct %_arr_int_uint_2 %99 %102
+               OpStore %indexable %104
+        %105 = OpAccessChain %_ptr_Function_int %indexable %103
+        %106 = OpLoad %int %105
+        %107 = OpLoad %int %a
+        %108 = OpIAdd %int %107 %106
+               OpStore %a %108
+               OpBranch %89
+         %89 = OpLabel
+        %109 = OpLoad %int %i_2
+        %110 = OpIAdd %int %109 %int_1
+               OpStore %i_2 %110
+               OpBranch %87
+         %88 = OpLabel
+        %111 = OpLoad %int %a
+        %112 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %113 = OpLoad %int %112
+        %114 = OpIEqual %bool %111 %113
+               OpSelectionMerge %115 None
+               OpBranchConditional %114 %116 %115
+        %116 = OpLabel
+        %117 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+        %118 = OpLoad %int %117
+        %119 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %120 = OpLoad %int %119
+        %121 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %122 = OpLoad %int %121
+        %123 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+        %124 = OpLoad %int %123
+        %125 = OpConvertSToF %float %118
+        %126 = OpConvertSToF %float %120
+        %127 = OpConvertSToF %float %122
+        %128 = OpConvertSToF %float %124
+        %129 = OpCompositeConstruct %v4float %125 %126 %127 %128
+               OpStore %x_GLF_color %129
+               OpBranch %115
+        %115 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %130
+%tint_symbol = OpFunctionParameter %main_out
+        %134 = OpLabel
+        %135 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %135
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %137 = OpLabel
+        %138 = OpFunctionCall %void %main_1
+        %140 = OpLoad %v4float %x_GLF_color
+        %141 = OpCompositeConstruct %main_out %140
+        %139 = OpFunctionCall %void %tint_symbol_2 %141
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..723c264
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,103 @@
+type Arr = [[stride(16)]] array<i32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var b : i32;
+  var i : i32;
+  var i_1 : i32;
+  var i_2 : i32;
+  var indexable : array<i32, 2>;
+  let x_36 : i32 = x_6.x_GLF_uniform_int_values[2];
+  a = x_36;
+  let x_38 : i32 = x_6.x_GLF_uniform_int_values[3];
+  b = x_38;
+  let x_40 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_41 : f32 = f32(x_40);
+  x_GLF_color = vec4<f32>(x_41, x_41, x_41, x_41);
+  let x_44 : i32 = x_6.x_GLF_uniform_int_values[2];
+  i = x_44;
+  loop {
+    let x_49 : i32 = i;
+    let x_51 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_49 < x_51)) {
+    } else {
+      break;
+    }
+    let x_54 : i32 = i;
+    let x_56 : i32 = x_6.x_GLF_uniform_int_values[3];
+    if ((x_54 > x_56)) {
+      let x_60 : i32 = a;
+      a = (x_60 + 1);
+      if (false) {
+        let x_65 : i32 = x_6.x_GLF_uniform_int_values[2];
+        i_1 = x_65;
+        loop {
+          let x_70 : i32 = i_1;
+          let x_72 : i32 = x_6.x_GLF_uniform_int_values[0];
+          if ((x_70 < x_72)) {
+          } else {
+            break;
+          }
+          return;
+        }
+      }
+    }
+
+    continuing {
+      let x_75 : i32 = i;
+      i = (x_75 + 1);
+    }
+  }
+  let x_78 : i32 = x_6.x_GLF_uniform_int_values[2];
+  i_2 = x_78;
+  loop {
+    let x_83 : i32 = i_2;
+    let x_85 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_83 < x_85)) {
+    } else {
+      break;
+    }
+    let x_89 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_91 : i32 = x_6.x_GLF_uniform_int_values[4];
+    let x_93 : i32 = b;
+    indexable = array<i32, 2>(x_89, x_91);
+    let x_95 : i32 = indexable[x_93];
+    let x_96 : i32 = a;
+    a = (x_96 + x_95);
+
+    continuing {
+      let x_98 : i32 = i_2;
+      i_2 = (x_98 + 1);
+    }
+  }
+  let x_100 : i32 = a;
+  let x_102 : i32 = x_6.x_GLF_uniform_int_values[1];
+  if ((x_100 == x_102)) {
+    let x_107 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_110 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_113 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_116 : i32 = x_6.x_GLF_uniform_int_values[3];
+    x_GLF_color = vec4<f32>(f32(x_107), f32(x_110), f32(x_113), f32(x_116));
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/1.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/1.spvasm
new file mode 100644
index 0000000..305dd5c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/1.spvasm
@@ -0,0 +1,130 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %_GLF_color "_GLF_color"
+               OpName %i "i"
+               OpName %i_0 "i"
+               OpName %i_1 "i"
+               OpName %indexable "indexable"
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %20 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+     %int_10 = OpConstant %int 10
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+      %int_2 = OpConstant %int 2
+         %28 = OpConstantComposite %_arr_int_uint_2 %int_1 %int_2
+%_ptr_Function__arr_int_uint_2 = OpTypePointer Function %_arr_int_uint_2
+     %int_28 = OpConstant %int 28
+    %float_1 = OpConstant %float 1
+         %32 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %11
+         %33 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+          %b = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+        %i_1 = OpVariable %_ptr_Function_int Function
+  %indexable = OpVariable %_ptr_Function__arr_int_uint_2 Function
+               OpStore %a %int_0
+               OpStore %b %int_1
+               OpStore %_GLF_color %20
+               OpStore %i %int_0
+               OpBranch %34
+         %34 = OpLabel
+               OpLoopMerge %35 %36 None
+               OpBranch %37
+         %37 = OpLabel
+         %38 = OpLoad %int %i
+         %39 = OpSLessThan %bool %38 %int_10
+               OpBranchConditional %39 %40 %35
+         %40 = OpLabel
+         %41 = OpLoad %int %i
+         %42 = OpSGreaterThan %bool %41 %int_1
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %43
+         %44 = OpLabel
+         %45 = OpLoad %int %a
+         %46 = OpIAdd %int %45 %int_1
+               OpStore %a %46
+               OpSelectionMerge %47 None
+               OpBranchConditional %false %48 %47
+         %48 = OpLabel
+               OpStore %i_0 %int_0
+               OpBranch %49
+         %49 = OpLabel
+               OpLoopMerge %50 %51 None
+               OpBranch %52
+         %52 = OpLabel
+         %53 = OpLoad %int %i_0
+         %54 = OpSLessThan %bool %53 %int_10
+               OpBranchConditional %54 %55 %50
+         %55 = OpLabel
+               OpReturn
+         %51 = OpLabel
+               OpBranch %49
+         %50 = OpLabel
+               OpBranch %47
+         %47 = OpLabel
+               OpBranch %43
+         %43 = OpLabel
+               OpBranch %36
+         %36 = OpLabel
+         %56 = OpLoad %int %i
+         %57 = OpIAdd %int %56 %int_1
+               OpStore %i %57
+               OpBranch %34
+         %35 = OpLabel
+               OpStore %i_1 %int_0
+               OpBranch %58
+         %58 = OpLabel
+               OpLoopMerge %59 %60 None
+               OpBranch %61
+         %61 = OpLabel
+         %62 = OpLoad %int %i_1
+         %63 = OpSLessThan %bool %62 %int_10
+               OpBranchConditional %63 %64 %59
+         %64 = OpLabel
+         %65 = OpLoad %int %b
+               OpStore %indexable %28
+         %66 = OpAccessChain %_ptr_Function_int %indexable %65
+         %67 = OpLoad %int %66
+         %68 = OpLoad %int %a
+         %69 = OpIAdd %int %68 %67
+               OpStore %a %69
+               OpBranch %60
+         %60 = OpLabel
+         %70 = OpLoad %int %i_1
+         %71 = OpIAdd %int %70 %int_1
+               OpStore %i_1 %71
+               OpBranch %58
+         %59 = OpLabel
+         %72 = OpLoad %int %a
+         %73 = OpIEqual %bool %72 %int_28
+               OpSelectionMerge %74 None
+               OpBranchConditional %73 %75 %74
+         %75 = OpLabel
+               OpStore %_GLF_color %32
+               OpBranch %74
+         %74 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..f8fc44b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/1.spvasm.expected.hlsl
@@ -0,0 +1,59 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  int b = 0;
+  int i = 0;
+  int i_1 = 0;
+  int i_2 = 0;
+  int indexable[2] = (int[2])0;
+  a = 0;
+  b = 1;
+  x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  i = 0;
+  {
+    for(; (i < 10); i = (i + 1)) {
+      if ((i > 1)) {
+        a = (a + 1);
+        if (false) {
+          i_1 = 0;
+          while (true) {
+            if ((i_1 < 10)) {
+            } else {
+              break;
+            }
+            return;
+          }
+        }
+      }
+    }
+  }
+  i_2 = 0;
+  {
+    for(; (i_2 < 10); i_2 = (i_2 + 1)) {
+      const int x_65 = b;
+      const int tint_symbol_2[2] = {1, 2};
+      indexable = tint_symbol_2;
+      const int x_67 = indexable[x_65];
+      a = (a + x_67);
+    }
+  }
+  if ((a == 28)) {
+    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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/1.spvasm.expected.msl
new file mode 100644
index 0000000..030119e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/1.spvasm.expected.msl
@@ -0,0 +1,84 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  int arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_5) {
+  int a = 0;
+  int b = 0;
+  int i = 0;
+  int i_1 = 0;
+  int i_2 = 0;
+  tint_array_wrapper indexable = {};
+  a = 0;
+  b = 1;
+  *(tint_symbol_5) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  i = 0;
+  while (true) {
+    int const x_38 = i;
+    if ((x_38 < 10)) {
+    } else {
+      break;
+    }
+    int const x_41 = i;
+    if ((x_41 > 1)) {
+      int const x_45 = a;
+      a = (x_45 + 1);
+      if (false) {
+        i_1 = 0;
+        while (true) {
+          int const x_53 = i_1;
+          if ((x_53 < 10)) {
+          } else {
+            break;
+          }
+          return;
+        }
+      }
+    }
+    {
+      int const x_56 = i;
+      i = (x_56 + 1);
+    }
+  }
+  i_2 = 0;
+  while (true) {
+    int const x_62 = i_2;
+    if ((x_62 < 10)) {
+    } else {
+      break;
+    }
+    int const x_65 = b;
+    tint_array_wrapper const tint_symbol_3 = {.arr={1, 2}};
+    indexable = tint_symbol_3;
+    int const x_67 = indexable.arr[x_65];
+    int const x_68 = a;
+    a = (x_68 + x_67);
+    {
+      int const x_70 = i_2;
+      i_2 = (x_70 + 1);
+    }
+  }
+  int const x_72 = a;
+  if ((x_72 == 28)) {
+    *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(&(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..cb6d107
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/1.spvasm.expected.spvasm
@@ -0,0 +1,178 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 98
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %i "i"
+               OpName %i_1 "i_1"
+               OpName %i_2 "i_2"
+               OpName %indexable "indexable"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %15 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+%_ptr_Function__arr_int_uint_2 = OpTypePointer Function %_arr_int_uint_2
+         %25 = OpConstantNull %_arr_int_uint_2
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+         %29 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+     %int_10 = OpConstant %int 10
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+      %int_2 = OpConstant %int 2
+         %72 = OpConstantComposite %_arr_int_uint_2 %int_1 %int_2
+     %int_28 = OpConstant %int 28
+    %float_1 = OpConstant %float 1
+         %85 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %86 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %15
+          %b = OpVariable %_ptr_Function_int Function %15
+          %i = OpVariable %_ptr_Function_int Function %15
+        %i_1 = OpVariable %_ptr_Function_int Function %15
+        %i_2 = OpVariable %_ptr_Function_int Function %15
+  %indexable = OpVariable %_ptr_Function__arr_int_uint_2 Function %25
+               OpStore %a %int_0
+               OpStore %b %int_1
+               OpStore %x_GLF_color %29
+               OpStore %i %int_0
+               OpBranch %30
+         %30 = OpLabel
+               OpLoopMerge %31 %32 None
+               OpBranch %33
+         %33 = OpLabel
+         %34 = OpLoad %int %i
+         %36 = OpSLessThan %bool %34 %int_10
+               OpSelectionMerge %38 None
+               OpBranchConditional %36 %39 %40
+         %39 = OpLabel
+               OpBranch %38
+         %40 = OpLabel
+               OpBranch %31
+         %38 = OpLabel
+         %41 = OpLoad %int %i
+         %42 = OpSGreaterThan %bool %41 %int_1
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %43
+         %44 = OpLabel
+         %45 = OpLoad %int %a
+         %46 = OpIAdd %int %45 %int_1
+               OpStore %a %46
+               OpSelectionMerge %48 None
+               OpBranchConditional %false %49 %48
+         %49 = OpLabel
+               OpStore %i_1 %int_0
+               OpBranch %50
+         %50 = OpLabel
+               OpLoopMerge %51 %52 None
+               OpBranch %53
+         %53 = OpLabel
+         %54 = OpLoad %int %i_1
+         %55 = OpSLessThan %bool %54 %int_10
+               OpSelectionMerge %56 None
+               OpBranchConditional %55 %57 %58
+         %57 = OpLabel
+               OpBranch %56
+         %58 = OpLabel
+               OpBranch %51
+         %56 = OpLabel
+               OpReturn
+         %52 = OpLabel
+               OpBranch %50
+         %51 = OpLabel
+               OpBranch %48
+         %48 = OpLabel
+               OpBranch %43
+         %43 = OpLabel
+               OpBranch %32
+         %32 = OpLabel
+         %59 = OpLoad %int %i
+         %60 = OpIAdd %int %59 %int_1
+               OpStore %i %60
+               OpBranch %30
+         %31 = OpLabel
+               OpStore %i_2 %int_0
+               OpBranch %61
+         %61 = OpLabel
+               OpLoopMerge %62 %63 None
+               OpBranch %64
+         %64 = OpLabel
+         %65 = OpLoad %int %i_2
+         %66 = OpSLessThan %bool %65 %int_10
+               OpSelectionMerge %67 None
+               OpBranchConditional %66 %68 %69
+         %68 = OpLabel
+               OpBranch %67
+         %69 = OpLabel
+               OpBranch %62
+         %67 = OpLabel
+         %70 = OpLoad %int %b
+               OpStore %indexable %72
+         %73 = OpAccessChain %_ptr_Function_int %indexable %70
+         %74 = OpLoad %int %73
+         %75 = OpLoad %int %a
+         %76 = OpIAdd %int %75 %74
+               OpStore %a %76
+               OpBranch %63
+         %63 = OpLabel
+         %77 = OpLoad %int %i_2
+         %78 = OpIAdd %int %77 %int_1
+               OpStore %i_2 %78
+               OpBranch %61
+         %62 = OpLabel
+         %79 = OpLoad %int %a
+         %81 = OpIEqual %bool %79 %int_28
+               OpSelectionMerge %82 None
+               OpBranchConditional %81 %83 %82
+         %83 = OpLabel
+               OpStore %x_GLF_color %85
+               OpBranch %82
+         %82 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %86
+%tint_symbol = OpFunctionParameter %main_out
+         %90 = OpLabel
+         %91 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %91
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %93 = OpLabel
+         %94 = OpFunctionCall %void %main_1
+         %96 = OpLoad %v4float %x_GLF_color
+         %97 = OpCompositeConstruct %main_out %96
+         %95 = OpFunctionCall %void %tint_symbol_2 %97
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..c7c18d1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/1.spvasm.expected.wgsl
@@ -0,0 +1,76 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var b : i32;
+  var i : i32;
+  var i_1 : i32;
+  var i_2 : i32;
+  var indexable : array<i32, 2>;
+  a = 0;
+  b = 1;
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  i = 0;
+  loop {
+    let x_38 : i32 = i;
+    if ((x_38 < 10)) {
+    } else {
+      break;
+    }
+    let x_41 : i32 = i;
+    if ((x_41 > 1)) {
+      let x_45 : i32 = a;
+      a = (x_45 + 1);
+      if (false) {
+        i_1 = 0;
+        loop {
+          let x_53 : i32 = i_1;
+          if ((x_53 < 10)) {
+          } else {
+            break;
+          }
+          return;
+        }
+      }
+    }
+
+    continuing {
+      let x_56 : i32 = i;
+      i = (x_56 + 1);
+    }
+  }
+  i_2 = 0;
+  loop {
+    let x_62 : i32 = i_2;
+    if ((x_62 < 10)) {
+    } else {
+      break;
+    }
+    let x_65 : i32 = b;
+    indexable = array<i32, 2>(1, 2);
+    let x_67 : i32 = indexable[x_65];
+    let x_68 : i32 = a;
+    a = (x_68 + x_67);
+
+    continuing {
+      let x_70 : i32 = i_2;
+      i_2 = (x_70 + 1);
+    }
+  }
+  let x_72 : i32 = a;
+  if ((x_72 == 28)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/1.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/1.wgsl
new file mode 100644
index 0000000..c7c18d1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/1.wgsl
@@ -0,0 +1,76 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var b : i32;
+  var i : i32;
+  var i_1 : i32;
+  var i_2 : i32;
+  var indexable : array<i32, 2>;
+  a = 0;
+  b = 1;
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  i = 0;
+  loop {
+    let x_38 : i32 = i;
+    if ((x_38 < 10)) {
+    } else {
+      break;
+    }
+    let x_41 : i32 = i;
+    if ((x_41 > 1)) {
+      let x_45 : i32 = a;
+      a = (x_45 + 1);
+      if (false) {
+        i_1 = 0;
+        loop {
+          let x_53 : i32 = i_1;
+          if ((x_53 < 10)) {
+          } else {
+            break;
+          }
+          return;
+        }
+      }
+    }
+
+    continuing {
+      let x_56 : i32 = i;
+      i = (x_56 + 1);
+    }
+  }
+  i_2 = 0;
+  loop {
+    let x_62 : i32 = i_2;
+    if ((x_62 < 10)) {
+    } else {
+      break;
+    }
+    let x_65 : i32 = b;
+    indexable = array<i32, 2>(1, 2);
+    let x_67 : i32 = indexable[x_65];
+    let x_68 : i32 = a;
+    a = (x_68 + x_67);
+
+    continuing {
+      let x_70 : i32 = i_2;
+      i_2 = (x_70 + 1);
+    }
+  }
+  let x_72 : i32 = a;
+  if ((x_72 == 28)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..f8fc44b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/1.wgsl.expected.hlsl
@@ -0,0 +1,59 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  int b = 0;
+  int i = 0;
+  int i_1 = 0;
+  int i_2 = 0;
+  int indexable[2] = (int[2])0;
+  a = 0;
+  b = 1;
+  x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  i = 0;
+  {
+    for(; (i < 10); i = (i + 1)) {
+      if ((i > 1)) {
+        a = (a + 1);
+        if (false) {
+          i_1 = 0;
+          while (true) {
+            if ((i_1 < 10)) {
+            } else {
+              break;
+            }
+            return;
+          }
+        }
+      }
+    }
+  }
+  i_2 = 0;
+  {
+    for(; (i_2 < 10); i_2 = (i_2 + 1)) {
+      const int x_65 = b;
+      const int tint_symbol_2[2] = {1, 2};
+      indexable = tint_symbol_2;
+      const int x_67 = indexable[x_65];
+      a = (a + x_67);
+    }
+  }
+  if ((a == 28)) {
+    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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/1.wgsl.expected.msl
new file mode 100644
index 0000000..030119e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/1.wgsl.expected.msl
@@ -0,0 +1,84 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  int arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_5) {
+  int a = 0;
+  int b = 0;
+  int i = 0;
+  int i_1 = 0;
+  int i_2 = 0;
+  tint_array_wrapper indexable = {};
+  a = 0;
+  b = 1;
+  *(tint_symbol_5) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  i = 0;
+  while (true) {
+    int const x_38 = i;
+    if ((x_38 < 10)) {
+    } else {
+      break;
+    }
+    int const x_41 = i;
+    if ((x_41 > 1)) {
+      int const x_45 = a;
+      a = (x_45 + 1);
+      if (false) {
+        i_1 = 0;
+        while (true) {
+          int const x_53 = i_1;
+          if ((x_53 < 10)) {
+          } else {
+            break;
+          }
+          return;
+        }
+      }
+    }
+    {
+      int const x_56 = i;
+      i = (x_56 + 1);
+    }
+  }
+  i_2 = 0;
+  while (true) {
+    int const x_62 = i_2;
+    if ((x_62 < 10)) {
+    } else {
+      break;
+    }
+    int const x_65 = b;
+    tint_array_wrapper const tint_symbol_3 = {.arr={1, 2}};
+    indexable = tint_symbol_3;
+    int const x_67 = indexable.arr[x_65];
+    int const x_68 = a;
+    a = (x_68 + x_67);
+    {
+      int const x_70 = i_2;
+      i_2 = (x_70 + 1);
+    }
+  }
+  int const x_72 = a;
+  if ((x_72 == 28)) {
+    *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(&(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..cb6d107
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/1.wgsl.expected.spvasm
@@ -0,0 +1,178 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 98
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %i "i"
+               OpName %i_1 "i_1"
+               OpName %i_2 "i_2"
+               OpName %indexable "indexable"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %15 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+%_ptr_Function__arr_int_uint_2 = OpTypePointer Function %_arr_int_uint_2
+         %25 = OpConstantNull %_arr_int_uint_2
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+         %29 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+     %int_10 = OpConstant %int 10
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+      %int_2 = OpConstant %int 2
+         %72 = OpConstantComposite %_arr_int_uint_2 %int_1 %int_2
+     %int_28 = OpConstant %int 28
+    %float_1 = OpConstant %float 1
+         %85 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %86 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %15
+          %b = OpVariable %_ptr_Function_int Function %15
+          %i = OpVariable %_ptr_Function_int Function %15
+        %i_1 = OpVariable %_ptr_Function_int Function %15
+        %i_2 = OpVariable %_ptr_Function_int Function %15
+  %indexable = OpVariable %_ptr_Function__arr_int_uint_2 Function %25
+               OpStore %a %int_0
+               OpStore %b %int_1
+               OpStore %x_GLF_color %29
+               OpStore %i %int_0
+               OpBranch %30
+         %30 = OpLabel
+               OpLoopMerge %31 %32 None
+               OpBranch %33
+         %33 = OpLabel
+         %34 = OpLoad %int %i
+         %36 = OpSLessThan %bool %34 %int_10
+               OpSelectionMerge %38 None
+               OpBranchConditional %36 %39 %40
+         %39 = OpLabel
+               OpBranch %38
+         %40 = OpLabel
+               OpBranch %31
+         %38 = OpLabel
+         %41 = OpLoad %int %i
+         %42 = OpSGreaterThan %bool %41 %int_1
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %43
+         %44 = OpLabel
+         %45 = OpLoad %int %a
+         %46 = OpIAdd %int %45 %int_1
+               OpStore %a %46
+               OpSelectionMerge %48 None
+               OpBranchConditional %false %49 %48
+         %49 = OpLabel
+               OpStore %i_1 %int_0
+               OpBranch %50
+         %50 = OpLabel
+               OpLoopMerge %51 %52 None
+               OpBranch %53
+         %53 = OpLabel
+         %54 = OpLoad %int %i_1
+         %55 = OpSLessThan %bool %54 %int_10
+               OpSelectionMerge %56 None
+               OpBranchConditional %55 %57 %58
+         %57 = OpLabel
+               OpBranch %56
+         %58 = OpLabel
+               OpBranch %51
+         %56 = OpLabel
+               OpReturn
+         %52 = OpLabel
+               OpBranch %50
+         %51 = OpLabel
+               OpBranch %48
+         %48 = OpLabel
+               OpBranch %43
+         %43 = OpLabel
+               OpBranch %32
+         %32 = OpLabel
+         %59 = OpLoad %int %i
+         %60 = OpIAdd %int %59 %int_1
+               OpStore %i %60
+               OpBranch %30
+         %31 = OpLabel
+               OpStore %i_2 %int_0
+               OpBranch %61
+         %61 = OpLabel
+               OpLoopMerge %62 %63 None
+               OpBranch %64
+         %64 = OpLabel
+         %65 = OpLoad %int %i_2
+         %66 = OpSLessThan %bool %65 %int_10
+               OpSelectionMerge %67 None
+               OpBranchConditional %66 %68 %69
+         %68 = OpLabel
+               OpBranch %67
+         %69 = OpLabel
+               OpBranch %62
+         %67 = OpLabel
+         %70 = OpLoad %int %b
+               OpStore %indexable %72
+         %73 = OpAccessChain %_ptr_Function_int %indexable %70
+         %74 = OpLoad %int %73
+         %75 = OpLoad %int %a
+         %76 = OpIAdd %int %75 %74
+               OpStore %a %76
+               OpBranch %63
+         %63 = OpLabel
+         %77 = OpLoad %int %i_2
+         %78 = OpIAdd %int %77 %int_1
+               OpStore %i_2 %78
+               OpBranch %61
+         %62 = OpLabel
+         %79 = OpLoad %int %a
+         %81 = OpIEqual %bool %79 %int_28
+               OpSelectionMerge %82 None
+               OpBranchConditional %81 %83 %82
+         %83 = OpLabel
+               OpStore %x_GLF_color %85
+               OpBranch %82
+         %82 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %86
+%tint_symbol = OpFunctionParameter %main_out
+         %90 = OpLabel
+         %91 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %91
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %93 = OpLabel
+         %94 = OpFunctionCall %void %main_1
+         %96 = OpLoad %v4float %x_GLF_color
+         %97 = OpCompositeConstruct %main_out %96
+         %95 = OpFunctionCall %void %tint_symbol_2 %97
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..c7c18d1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-cumulate-loops-unreachable/1.wgsl.expected.wgsl
@@ -0,0 +1,76 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var b : i32;
+  var i : i32;
+  var i_1 : i32;
+  var i_2 : i32;
+  var indexable : array<i32, 2>;
+  a = 0;
+  b = 1;
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  i = 0;
+  loop {
+    let x_38 : i32 = i;
+    if ((x_38 < 10)) {
+    } else {
+      break;
+    }
+    let x_41 : i32 = i;
+    if ((x_41 > 1)) {
+      let x_45 : i32 = a;
+      a = (x_45 + 1);
+      if (false) {
+        i_1 = 0;
+        loop {
+          let x_53 : i32 = i_1;
+          if ((x_53 < 10)) {
+          } else {
+            break;
+          }
+          return;
+        }
+      }
+    }
+
+    continuing {
+      let x_56 : i32 = i;
+      i = (x_56 + 1);
+    }
+  }
+  i_2 = 0;
+  loop {
+    let x_62 : i32 = i_2;
+    if ((x_62 < 10)) {
+    } else {
+      break;
+    }
+    let x_65 : i32 = b;
+    indexable = array<i32, 2>(1, 2);
+    let x_67 : i32 = indexable[x_65];
+    let x_68 : i32 = a;
+    a = (x_68 + x_67);
+
+    continuing {
+      let x_70 : i32 = i_2;
+      i_2 = (x_70 + 1);
+    }
+  }
+  let x_72 : i32 = a;
+  if ((x_72 == 28)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-clamp-undefined-access-array/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-clamp-undefined-access-array/0-opt.spvasm
new file mode 100644
index 0000000..2509f0f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-clamp-undefined-access-array/0-opt.spvasm
@@ -0,0 +1,146 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %A1 "A1"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %b "b"
+               OpName %c "c"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_3_0 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+%_ptr_Function__arr_float_uint_3 = OpTypePointer Function %_arr_float_uint_3
+%_arr_float_uint_3_0 = OpTypeArray %float %uint_3
+       %buf1 = OpTypeStruct %_arr_float_uint_3_0
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+%_ptr_Function_int = OpTypePointer Function %int
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_float = OpTypePointer Function %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %15
+         %35 = OpLabel
+         %A1 = OpVariable %_ptr_Function__arr_float_uint_3 Function
+          %a = OpVariable %_ptr_Function_int Function
+          %b = OpVariable %_ptr_Function_float Function
+          %c = OpVariable %_ptr_Function_bool Function
+         %36 = OpVariable %_ptr_Function_bool Function
+         %37 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %38 = OpLoad %float %37
+         %39 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %40 = OpLoad %float %39
+         %41 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %42 = OpLoad %float %41
+         %43 = OpCompositeConstruct %_arr_float_uint_3 %38 %40 %42
+               OpStore %A1 %43
+         %44 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %45 = OpLoad %int %44
+         %46 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %47 = OpLoad %int %46
+         %48 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %49 = OpLoad %int %48
+         %50 = OpExtInst %int %1 SClamp %45 %47 %49
+               OpStore %a %50
+         %51 = OpLoad %int %a
+         %52 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %53 = OpLoad %int %52
+         %54 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %55 = OpLoad %int %54
+         %56 = OpExtInst %int %1 SClamp %51 %53 %55
+         %57 = OpAccessChain %_ptr_Function_float %A1 %56
+         %58 = OpLoad %float %57
+               OpStore %b %58
+         %59 = OpLoad %float %b
+         %60 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %61 = OpLoad %int %60
+         %62 = OpAccessChain %_ptr_Function_float %A1 %61
+         %63 = OpLoad %float %62
+         %64 = OpFOrdLessThan %bool %59 %63
+               OpSelectionMerge %65 None
+               OpBranchConditional %64 %66 %67
+         %66 = OpLabel
+         %68 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %69 = OpLoad %float %68
+         %70 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %71 = OpLoad %float %70
+         %72 = OpFOrdGreaterThan %bool %69 %71
+               OpStore %36 %72
+               OpBranch %65
+         %67 = OpLabel
+         %73 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %74 = OpLoad %float %73
+         %75 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %76 = OpLoad %int %75
+         %77 = OpAccessChain %_ptr_Function_float %A1 %76
+         %78 = OpLoad %float %77
+         %79 = OpFOrdLessThan %bool %74 %78
+               OpStore %36 %79
+               OpBranch %65
+         %65 = OpLabel
+         %80 = OpLoad %bool %36
+               OpStore %c %80
+         %81 = OpLoad %bool %c
+               OpSelectionMerge %82 None
+               OpBranchConditional %81 %83 %84
+         %83 = OpLabel
+         %85 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %86 = OpLoad %int %85
+         %87 = OpConvertSToF %float %86
+         %88 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %89 = OpLoad %int %88
+         %90 = OpConvertSToF %float %89
+         %91 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %92 = OpLoad %int %91
+         %93 = OpConvertSToF %float %92
+         %94 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %95 = OpLoad %int %94
+         %96 = OpConvertSToF %float %95
+         %97 = OpCompositeConstruct %v4float %87 %90 %93 %96
+               OpStore %_GLF_color %97
+               OpBranch %82
+         %84 = OpLabel
+         %98 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %99 = OpLoad %float %98
+        %100 = OpCompositeConstruct %v4float %99 %99 %99 %99
+               OpStore %_GLF_color %100
+               OpBranch %82
+         %82 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-clamp-undefined-access-array/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-clamp-undefined-access-array/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..ee0a08b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-clamp-undefined-access-array/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,77 @@
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[3];
+};
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float A1[3] = (float[3])0;
+  int a = 0;
+  float b = 0.0f;
+  bool c = false;
+  bool x_36 = false;
+  const float x_38 = asfloat(x_6[2].x);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_40 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const float x_42 = asfloat(x_6[1].x);
+  const float tint_symbol_4[3] = {x_38, x_40, x_42};
+  A1 = tint_symbol_4;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_45 = asint(x_9[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const int x_47 = asint(x_9[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  const int x_49 = asint(x_9[1].x);
+  a = clamp(x_45, x_47, x_49);
+  const int x_51 = a;
+  const int x_53 = asint(x_9[1].x);
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const int x_55 = asint(x_9[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  const float x_58 = A1[clamp(x_51, x_53, x_55)];
+  b = x_58;
+  const float x_59 = b;
+  const int x_61 = asint(x_9[1].x);
+  const float x_63 = A1[x_61];
+  if ((x_59 < x_63)) {
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const float x_69 = asfloat(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const float x_71 = asfloat(x_6[2].x);
+    x_36 = (x_69 > x_71);
+  } else {
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const float x_74 = asfloat(x_6[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    const int x_76 = asint(x_9[2].x);
+    const float x_78 = A1[x_76];
+    x_36 = (x_74 < x_78);
+  }
+  c = x_36;
+  if (c) {
+    const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+    const int x_86 = asint(x_9[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+    const int x_89 = asint(x_9[1].x);
+    const int x_92 = asint(x_9[1].x);
+    const uint scalar_offset_7 = ((16u * uint(0))) / 4;
+    const int x_95 = asint(x_9[scalar_offset_7 / 4][scalar_offset_7 % 4]);
+    x_GLF_color = float4(float(x_86), float(x_89), float(x_92), float(x_95));
+  } else {
+    const uint scalar_offset_8 = ((16u * uint(0))) / 4;
+    const float x_99 = asfloat(x_6[scalar_offset_8 / 4][scalar_offset_8 % 4]);
+    x_GLF_color = float4(x_99, x_99, x_99, x_99);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-clamp-undefined-access-array/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-clamp-undefined-access-array/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..6b19b36
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-clamp-undefined-access-array/0-opt.spvasm.expected.msl
@@ -0,0 +1,90 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_2 {
+  float arr[3];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_9, thread float4* const tint_symbol_5) {
+  tint_array_wrapper_2 A1 = {};
+  int a = 0;
+  float b = 0.0f;
+  bool c = false;
+  bool x_36 = false;
+  float const x_38 = x_6.x_GLF_uniform_float_values.arr[2].el;
+  float const x_40 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_42 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  tint_array_wrapper_2 const tint_symbol_3 = {.arr={x_38, x_40, x_42}};
+  A1 = tint_symbol_3;
+  int const x_45 = x_9.x_GLF_uniform_int_values.arr[0].el;
+  int const x_47 = x_9.x_GLF_uniform_int_values.arr[0].el;
+  int const x_49 = x_9.x_GLF_uniform_int_values.arr[1].el;
+  a = clamp(x_45, x_47, x_49);
+  int const x_51 = a;
+  int const x_53 = x_9.x_GLF_uniform_int_values.arr[1].el;
+  int const x_55 = x_9.x_GLF_uniform_int_values.arr[0].el;
+  float const x_58 = A1.arr[clamp(x_51, x_53, x_55)];
+  b = x_58;
+  float const x_59 = b;
+  int const x_61 = x_9.x_GLF_uniform_int_values.arr[1].el;
+  float const x_63 = A1.arr[x_61];
+  if ((x_59 < x_63)) {
+    float const x_69 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    float const x_71 = x_6.x_GLF_uniform_float_values.arr[2].el;
+    x_36 = (x_69 > x_71);
+  } else {
+    float const x_74 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    int const x_76 = x_9.x_GLF_uniform_int_values.arr[2].el;
+    float const x_78 = A1.arr[x_76];
+    x_36 = (x_74 < x_78);
+  }
+  bool const x_80 = x_36;
+  c = x_80;
+  bool const x_81 = c;
+  if (x_81) {
+    int const x_86 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    int const x_89 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_92 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_95 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_5) = float4(float(x_86), float(x_89), float(x_92), float(x_95));
+  } else {
+    float const x_99 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    *(tint_symbol_5) = float4(x_99, x_99, x_99, x_99);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-clamp-undefined-access-array/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-clamp-undefined-access-array/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..5e0a897
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-clamp-undefined-access-array/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,186 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 121
+; Schema: 0
+               OpCapability Shader
+         %58 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %A1 "A1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %x_36 "x_36"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_float_uint_3_0 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf1 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %16
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_arr_float_uint_3_0 = OpTypeArray %float %uint_3
+%_ptr_Function__arr_float_uint_3_0 = OpTypePointer Function %_arr_float_uint_3_0
+         %26 = OpConstantNull %_arr_float_uint_3_0
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpConstantNull %int
+%_ptr_Function_float = OpTypePointer Function %float
+         %32 = OpConstantNull %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %36 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+        %109 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+         %A1 = OpVariable %_ptr_Function__arr_float_uint_3_0 Function %26
+          %a = OpVariable %_ptr_Function_int Function %29
+          %b = OpVariable %_ptr_Function_float Function %32
+          %c = OpVariable %_ptr_Function_bool Function %36
+       %x_36 = OpVariable %_ptr_Function_bool Function %36
+         %41 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %42 = OpLoad %float %41
+         %44 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %45 = OpLoad %float %44
+         %47 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %48 = OpLoad %float %47
+         %49 = OpCompositeConstruct %_arr_float_uint_3_0 %42 %45 %48
+               OpStore %A1 %49
+         %51 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %52 = OpLoad %int %51
+         %53 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %54 = OpLoad %int %53
+         %55 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %56 = OpLoad %int %55
+         %57 = OpExtInst %int %58 SClamp %52 %54 %56
+               OpStore %a %57
+         %59 = OpLoad %int %a
+         %60 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %61 = OpLoad %int %60
+         %62 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %63 = OpLoad %int %62
+         %64 = OpExtInst %int %58 SClamp %59 %61 %63
+         %65 = OpAccessChain %_ptr_Function_float %A1 %64
+         %66 = OpLoad %float %65
+               OpStore %b %66
+         %67 = OpLoad %float %b
+         %68 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %69 = OpLoad %int %68
+         %70 = OpAccessChain %_ptr_Function_float %A1 %69
+         %71 = OpLoad %float %70
+         %72 = OpFOrdLessThan %bool %67 %71
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %74 %75
+         %74 = OpLabel
+         %76 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %77 = OpLoad %float %76
+         %78 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %79 = OpLoad %float %78
+         %80 = OpFOrdGreaterThan %bool %77 %79
+               OpStore %x_36 %80
+               OpBranch %73
+         %75 = OpLabel
+         %81 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %82 = OpLoad %float %81
+         %83 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_2
+         %84 = OpLoad %int %83
+         %85 = OpAccessChain %_ptr_Function_float %A1 %84
+         %86 = OpLoad %float %85
+         %87 = OpFOrdLessThan %bool %82 %86
+               OpStore %x_36 %87
+               OpBranch %73
+         %73 = OpLabel
+         %88 = OpLoad %bool %x_36
+               OpStore %c %88
+         %89 = OpLoad %bool %c
+               OpSelectionMerge %90 None
+               OpBranchConditional %89 %91 %92
+         %91 = OpLabel
+         %93 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %94 = OpLoad %int %93
+         %95 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %96 = OpLoad %int %95
+         %97 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %98 = OpLoad %int %97
+         %99 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+        %100 = OpLoad %int %99
+        %101 = OpConvertSToF %float %94
+        %102 = OpConvertSToF %float %96
+        %103 = OpConvertSToF %float %98
+        %104 = OpConvertSToF %float %100
+        %105 = OpCompositeConstruct %v4float %101 %102 %103 %104
+               OpStore %x_GLF_color %105
+               OpBranch %90
+         %92 = OpLabel
+        %106 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+        %107 = OpLoad %float %106
+        %108 = OpCompositeConstruct %v4float %107 %107 %107 %107
+               OpStore %x_GLF_color %108
+               OpBranch %90
+         %90 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %109
+%tint_symbol = OpFunctionParameter %main_out
+        %113 = OpLabel
+        %114 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %114
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+        %116 = OpLabel
+        %117 = OpFunctionCall %void %main_1
+        %119 = OpLoad %v4float %x_GLF_color
+        %120 = OpCompositeConstruct %main_out %119
+        %118 = OpFunctionCall %void %tint_symbol_2 %120
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-clamp-undefined-access-array/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-clamp-undefined-access-array/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..f6f65a6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-clamp-undefined-access-array/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,78 @@
+type Arr = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var A1 : array<f32, 3>;
+  var a : i32;
+  var b : f32;
+  var c : bool;
+  var x_36 : bool;
+  let x_38 : f32 = x_6.x_GLF_uniform_float_values[2];
+  let x_40 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_42 : f32 = x_6.x_GLF_uniform_float_values[1];
+  A1 = array<f32, 3>(x_38, x_40, x_42);
+  let x_45 : i32 = x_9.x_GLF_uniform_int_values[0];
+  let x_47 : i32 = x_9.x_GLF_uniform_int_values[0];
+  let x_49 : i32 = x_9.x_GLF_uniform_int_values[1];
+  a = clamp(x_45, x_47, x_49);
+  let x_51 : i32 = a;
+  let x_53 : i32 = x_9.x_GLF_uniform_int_values[1];
+  let x_55 : i32 = x_9.x_GLF_uniform_int_values[0];
+  let x_58 : f32 = A1[clamp(x_51, x_53, x_55)];
+  b = x_58;
+  let x_59 : f32 = b;
+  let x_61 : i32 = x_9.x_GLF_uniform_int_values[1];
+  let x_63 : f32 = A1[x_61];
+  if ((x_59 < x_63)) {
+    let x_69 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_71 : f32 = x_6.x_GLF_uniform_float_values[2];
+    x_36 = (x_69 > x_71);
+  } else {
+    let x_74 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_76 : i32 = x_9.x_GLF_uniform_int_values[2];
+    let x_78 : f32 = A1[x_76];
+    x_36 = (x_74 < x_78);
+  }
+  let x_80 : bool = x_36;
+  c = x_80;
+  let x_81 : bool = c;
+  if (x_81) {
+    let x_86 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_89 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_92 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_95 : i32 = x_9.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_86), f32(x_89), f32(x_92), f32(x_95));
+  } else {
+    let x_99 : f32 = x_6.x_GLF_uniform_float_values[0];
+    x_GLF_color = vec4<f32>(x_99, x_99, x_99, x_99);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-clamp-undefined-access-array/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-clamp-undefined-access-array/0-opt.wgsl
new file mode 100644
index 0000000..f6f65a6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-clamp-undefined-access-array/0-opt.wgsl
@@ -0,0 +1,78 @@
+type Arr = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var A1 : array<f32, 3>;
+  var a : i32;
+  var b : f32;
+  var c : bool;
+  var x_36 : bool;
+  let x_38 : f32 = x_6.x_GLF_uniform_float_values[2];
+  let x_40 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_42 : f32 = x_6.x_GLF_uniform_float_values[1];
+  A1 = array<f32, 3>(x_38, x_40, x_42);
+  let x_45 : i32 = x_9.x_GLF_uniform_int_values[0];
+  let x_47 : i32 = x_9.x_GLF_uniform_int_values[0];
+  let x_49 : i32 = x_9.x_GLF_uniform_int_values[1];
+  a = clamp(x_45, x_47, x_49);
+  let x_51 : i32 = a;
+  let x_53 : i32 = x_9.x_GLF_uniform_int_values[1];
+  let x_55 : i32 = x_9.x_GLF_uniform_int_values[0];
+  let x_58 : f32 = A1[clamp(x_51, x_53, x_55)];
+  b = x_58;
+  let x_59 : f32 = b;
+  let x_61 : i32 = x_9.x_GLF_uniform_int_values[1];
+  let x_63 : f32 = A1[x_61];
+  if ((x_59 < x_63)) {
+    let x_69 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_71 : f32 = x_6.x_GLF_uniform_float_values[2];
+    x_36 = (x_69 > x_71);
+  } else {
+    let x_74 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_76 : i32 = x_9.x_GLF_uniform_int_values[2];
+    let x_78 : f32 = A1[x_76];
+    x_36 = (x_74 < x_78);
+  }
+  let x_80 : bool = x_36;
+  c = x_80;
+  let x_81 : bool = c;
+  if (x_81) {
+    let x_86 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_89 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_92 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_95 : i32 = x_9.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_86), f32(x_89), f32(x_92), f32(x_95));
+  } else {
+    let x_99 : f32 = x_6.x_GLF_uniform_float_values[0];
+    x_GLF_color = vec4<f32>(x_99, x_99, x_99, x_99);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-clamp-undefined-access-array/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-clamp-undefined-access-array/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..ee0a08b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-clamp-undefined-access-array/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,77 @@
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[3];
+};
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float A1[3] = (float[3])0;
+  int a = 0;
+  float b = 0.0f;
+  bool c = false;
+  bool x_36 = false;
+  const float x_38 = asfloat(x_6[2].x);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_40 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const float x_42 = asfloat(x_6[1].x);
+  const float tint_symbol_4[3] = {x_38, x_40, x_42};
+  A1 = tint_symbol_4;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_45 = asint(x_9[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const int x_47 = asint(x_9[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  const int x_49 = asint(x_9[1].x);
+  a = clamp(x_45, x_47, x_49);
+  const int x_51 = a;
+  const int x_53 = asint(x_9[1].x);
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const int x_55 = asint(x_9[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  const float x_58 = A1[clamp(x_51, x_53, x_55)];
+  b = x_58;
+  const float x_59 = b;
+  const int x_61 = asint(x_9[1].x);
+  const float x_63 = A1[x_61];
+  if ((x_59 < x_63)) {
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const float x_69 = asfloat(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const float x_71 = asfloat(x_6[2].x);
+    x_36 = (x_69 > x_71);
+  } else {
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const float x_74 = asfloat(x_6[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    const int x_76 = asint(x_9[2].x);
+    const float x_78 = A1[x_76];
+    x_36 = (x_74 < x_78);
+  }
+  c = x_36;
+  if (c) {
+    const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+    const int x_86 = asint(x_9[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+    const int x_89 = asint(x_9[1].x);
+    const int x_92 = asint(x_9[1].x);
+    const uint scalar_offset_7 = ((16u * uint(0))) / 4;
+    const int x_95 = asint(x_9[scalar_offset_7 / 4][scalar_offset_7 % 4]);
+    x_GLF_color = float4(float(x_86), float(x_89), float(x_92), float(x_95));
+  } else {
+    const uint scalar_offset_8 = ((16u * uint(0))) / 4;
+    const float x_99 = asfloat(x_6[scalar_offset_8 / 4][scalar_offset_8 % 4]);
+    x_GLF_color = float4(x_99, x_99, x_99, x_99);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-clamp-undefined-access-array/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-clamp-undefined-access-array/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..6b19b36
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-clamp-undefined-access-array/0-opt.wgsl.expected.msl
@@ -0,0 +1,90 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_2 {
+  float arr[3];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_9, thread float4* const tint_symbol_5) {
+  tint_array_wrapper_2 A1 = {};
+  int a = 0;
+  float b = 0.0f;
+  bool c = false;
+  bool x_36 = false;
+  float const x_38 = x_6.x_GLF_uniform_float_values.arr[2].el;
+  float const x_40 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_42 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  tint_array_wrapper_2 const tint_symbol_3 = {.arr={x_38, x_40, x_42}};
+  A1 = tint_symbol_3;
+  int const x_45 = x_9.x_GLF_uniform_int_values.arr[0].el;
+  int const x_47 = x_9.x_GLF_uniform_int_values.arr[0].el;
+  int const x_49 = x_9.x_GLF_uniform_int_values.arr[1].el;
+  a = clamp(x_45, x_47, x_49);
+  int const x_51 = a;
+  int const x_53 = x_9.x_GLF_uniform_int_values.arr[1].el;
+  int const x_55 = x_9.x_GLF_uniform_int_values.arr[0].el;
+  float const x_58 = A1.arr[clamp(x_51, x_53, x_55)];
+  b = x_58;
+  float const x_59 = b;
+  int const x_61 = x_9.x_GLF_uniform_int_values.arr[1].el;
+  float const x_63 = A1.arr[x_61];
+  if ((x_59 < x_63)) {
+    float const x_69 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    float const x_71 = x_6.x_GLF_uniform_float_values.arr[2].el;
+    x_36 = (x_69 > x_71);
+  } else {
+    float const x_74 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    int const x_76 = x_9.x_GLF_uniform_int_values.arr[2].el;
+    float const x_78 = A1.arr[x_76];
+    x_36 = (x_74 < x_78);
+  }
+  bool const x_80 = x_36;
+  c = x_80;
+  bool const x_81 = c;
+  if (x_81) {
+    int const x_86 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    int const x_89 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_92 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_95 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_5) = float4(float(x_86), float(x_89), float(x_92), float(x_95));
+  } else {
+    float const x_99 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    *(tint_symbol_5) = float4(x_99, x_99, x_99, x_99);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-clamp-undefined-access-array/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-clamp-undefined-access-array/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..5e0a897
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-clamp-undefined-access-array/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,186 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 121
+; Schema: 0
+               OpCapability Shader
+         %58 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %A1 "A1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %x_36 "x_36"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_float_uint_3_0 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf1 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %16
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_arr_float_uint_3_0 = OpTypeArray %float %uint_3
+%_ptr_Function__arr_float_uint_3_0 = OpTypePointer Function %_arr_float_uint_3_0
+         %26 = OpConstantNull %_arr_float_uint_3_0
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpConstantNull %int
+%_ptr_Function_float = OpTypePointer Function %float
+         %32 = OpConstantNull %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %36 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+        %109 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+         %A1 = OpVariable %_ptr_Function__arr_float_uint_3_0 Function %26
+          %a = OpVariable %_ptr_Function_int Function %29
+          %b = OpVariable %_ptr_Function_float Function %32
+          %c = OpVariable %_ptr_Function_bool Function %36
+       %x_36 = OpVariable %_ptr_Function_bool Function %36
+         %41 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %42 = OpLoad %float %41
+         %44 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %45 = OpLoad %float %44
+         %47 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %48 = OpLoad %float %47
+         %49 = OpCompositeConstruct %_arr_float_uint_3_0 %42 %45 %48
+               OpStore %A1 %49
+         %51 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %52 = OpLoad %int %51
+         %53 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %54 = OpLoad %int %53
+         %55 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %56 = OpLoad %int %55
+         %57 = OpExtInst %int %58 SClamp %52 %54 %56
+               OpStore %a %57
+         %59 = OpLoad %int %a
+         %60 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %61 = OpLoad %int %60
+         %62 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %63 = OpLoad %int %62
+         %64 = OpExtInst %int %58 SClamp %59 %61 %63
+         %65 = OpAccessChain %_ptr_Function_float %A1 %64
+         %66 = OpLoad %float %65
+               OpStore %b %66
+         %67 = OpLoad %float %b
+         %68 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %69 = OpLoad %int %68
+         %70 = OpAccessChain %_ptr_Function_float %A1 %69
+         %71 = OpLoad %float %70
+         %72 = OpFOrdLessThan %bool %67 %71
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %74 %75
+         %74 = OpLabel
+         %76 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %77 = OpLoad %float %76
+         %78 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %79 = OpLoad %float %78
+         %80 = OpFOrdGreaterThan %bool %77 %79
+               OpStore %x_36 %80
+               OpBranch %73
+         %75 = OpLabel
+         %81 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %82 = OpLoad %float %81
+         %83 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_2
+         %84 = OpLoad %int %83
+         %85 = OpAccessChain %_ptr_Function_float %A1 %84
+         %86 = OpLoad %float %85
+         %87 = OpFOrdLessThan %bool %82 %86
+               OpStore %x_36 %87
+               OpBranch %73
+         %73 = OpLabel
+         %88 = OpLoad %bool %x_36
+               OpStore %c %88
+         %89 = OpLoad %bool %c
+               OpSelectionMerge %90 None
+               OpBranchConditional %89 %91 %92
+         %91 = OpLabel
+         %93 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %94 = OpLoad %int %93
+         %95 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %96 = OpLoad %int %95
+         %97 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %98 = OpLoad %int %97
+         %99 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+        %100 = OpLoad %int %99
+        %101 = OpConvertSToF %float %94
+        %102 = OpConvertSToF %float %96
+        %103 = OpConvertSToF %float %98
+        %104 = OpConvertSToF %float %100
+        %105 = OpCompositeConstruct %v4float %101 %102 %103 %104
+               OpStore %x_GLF_color %105
+               OpBranch %90
+         %92 = OpLabel
+        %106 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+        %107 = OpLoad %float %106
+        %108 = OpCompositeConstruct %v4float %107 %107 %107 %107
+               OpStore %x_GLF_color %108
+               OpBranch %90
+         %90 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %109
+%tint_symbol = OpFunctionParameter %main_out
+        %113 = OpLabel
+        %114 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %114
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+        %116 = OpLabel
+        %117 = OpFunctionCall %void %main_1
+        %119 = OpLoad %v4float %x_GLF_color
+        %120 = OpCompositeConstruct %main_out %119
+        %118 = OpFunctionCall %void %tint_symbol_2 %120
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-clamp-undefined-access-array/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-clamp-undefined-access-array/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..f6f65a6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-clamp-undefined-access-array/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,78 @@
+type Arr = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var A1 : array<f32, 3>;
+  var a : i32;
+  var b : f32;
+  var c : bool;
+  var x_36 : bool;
+  let x_38 : f32 = x_6.x_GLF_uniform_float_values[2];
+  let x_40 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_42 : f32 = x_6.x_GLF_uniform_float_values[1];
+  A1 = array<f32, 3>(x_38, x_40, x_42);
+  let x_45 : i32 = x_9.x_GLF_uniform_int_values[0];
+  let x_47 : i32 = x_9.x_GLF_uniform_int_values[0];
+  let x_49 : i32 = x_9.x_GLF_uniform_int_values[1];
+  a = clamp(x_45, x_47, x_49);
+  let x_51 : i32 = a;
+  let x_53 : i32 = x_9.x_GLF_uniform_int_values[1];
+  let x_55 : i32 = x_9.x_GLF_uniform_int_values[0];
+  let x_58 : f32 = A1[clamp(x_51, x_53, x_55)];
+  b = x_58;
+  let x_59 : f32 = b;
+  let x_61 : i32 = x_9.x_GLF_uniform_int_values[1];
+  let x_63 : f32 = A1[x_61];
+  if ((x_59 < x_63)) {
+    let x_69 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_71 : f32 = x_6.x_GLF_uniform_float_values[2];
+    x_36 = (x_69 > x_71);
+  } else {
+    let x_74 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_76 : i32 = x_9.x_GLF_uniform_int_values[2];
+    let x_78 : f32 = A1[x_76];
+    x_36 = (x_74 < x_78);
+  }
+  let x_80 : bool = x_36;
+  c = x_80;
+  let x_81 : bool = c;
+  if (x_81) {
+    let x_86 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_89 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_92 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_95 : i32 = x_9.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_86), f32(x_89), f32(x_92), f32(x_95));
+  } else {
+    let x_99 : f32 = x_6.x_GLF_uniform_float_values[0];
+    x_GLF_color = vec4<f32>(x_99, x_99, x_99, x_99);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.spvasm
new file mode 100644
index 0000000..0d7bd95
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.spvasm
@@ -0,0 +1,128 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %v "v"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+      %int_3 = OpConstant %int 3
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_int = OpTypePointer Function %int
+       %bool = OpTypeBool
+    %v3float = OpTypeVector %float 3
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+     %v3uint = OpTypeVector %uint 3
+         %28 = OpConstantComposite %v3uint %uint_0 %uint_1 %uint_2
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+     %v4bool = OpTypeVector %bool 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %10
+         %34 = OpLabel
+          %v = OpVariable %_ptr_Function_v4float Function
+          %i = OpVariable %_ptr_Function_int Function
+         %35 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %36 = OpLoad %int %35
+         %37 = OpConvertSToF %float %36
+         %38 = OpCompositeConstruct %v4float %37 %37 %37 %37
+               OpStore %v %38
+         %39 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %40 = OpLoad %int %39
+               OpStore %i %40
+               OpBranch %41
+         %41 = OpLabel
+               OpLoopMerge %42 %43 None
+               OpBranch %44
+         %44 = OpLabel
+         %45 = OpLoad %int %i
+         %46 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %47 = OpLoad %int %46
+         %48 = OpSLessThan %bool %45 %47
+               OpBranchConditional %48 %49 %42
+         %49 = OpLabel
+         %50 = OpLoad %int %i
+         %51 = OpLoad %int %i
+         %52 = OpConvertSToF %float %51
+         %53 = OpVectorExtractDynamic %uint %28 %50
+         %54 = OpAccessChain %_ptr_Function_float %v %53
+               OpStore %54 %52
+               OpBranch %43
+         %43 = OpLabel
+         %55 = OpLoad %int %i
+         %56 = OpIAdd %int %55 %int_1
+               OpStore %i %56
+               OpBranch %41
+         %42 = OpLabel
+         %57 = OpLoad %v4float %v
+         %58 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %59 = OpLoad %int %58
+         %60 = OpConvertSToF %float %59
+         %61 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %62 = OpLoad %int %61
+         %63 = OpConvertSToF %float %62
+         %64 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %65 = OpLoad %int %64
+         %66 = OpConvertSToF %float %65
+         %67 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %68 = OpLoad %int %67
+         %69 = OpConvertSToF %float %68
+         %70 = OpCompositeConstruct %v4float %60 %63 %66 %69
+         %71 = OpFOrdEqual %v4bool %57 %70
+         %72 = OpAll %bool %71
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %74 %75
+         %74 = OpLabel
+         %76 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %77 = OpLoad %int %76
+         %78 = OpConvertSToF %float %77
+         %79 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %80 = OpLoad %int %79
+         %81 = OpConvertSToF %float %80
+         %82 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %83 = OpLoad %int %82
+         %84 = OpConvertSToF %float %83
+         %85 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %86 = OpLoad %int %85
+         %87 = OpConvertSToF %float %86
+         %88 = OpCompositeConstruct %v4float %78 %81 %84 %87
+               OpStore %_GLF_color %88
+               OpBranch %73
+         %75 = OpLabel
+         %89 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %90 = OpLoad %int %89
+         %91 = OpConvertSToF %float %90
+         %92 = OpCompositeConstruct %v4float %91 %91 %91 %91
+               OpStore %_GLF_color %92
+               OpBranch %73
+         %73 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..a8ef20d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,66 @@
+void set_float4(inout float4 vec, int idx, float val) {
+  vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
+}
+
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 v = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int i = 0;
+  const int x_36 = asint(x_6[3].x);
+  const float x_37 = float(x_36);
+  v = float4(x_37, x_37, x_37, x_37);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_40 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  i = x_40;
+  while (true) {
+    const int x_45 = i;
+    const int x_47 = asint(x_6[3].x);
+    if ((x_45 < x_47)) {
+    } else {
+      break;
+    }
+    set_float4(v, uint3(0u, 1u, 2u)[i], float(i));
+    {
+      i = (i + 1);
+    }
+  }
+  const float4 x_57 = v;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_59 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const int x_62 = asint(x_6[1].x);
+  const int x_65 = asint(x_6[2].x);
+  const int x_68 = asint(x_6[3].x);
+  if (all((x_57 == float4(float(x_59), float(x_62), float(x_65), float(x_68))))) {
+    const int x_77 = asint(x_6[1].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_80 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_83 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const int x_86 = asint(x_6[1].x);
+    x_GLF_color = float4(float(x_77), float(x_80), float(x_83), float(x_86));
+  } else {
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_90 = asint(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const float x_91 = float(x_90);
+    x_GLF_color = float4(x_91, x_91, x_91, x_91);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..3d744a3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.spvasm.expected.msl
@@ -0,0 +1,70 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float4 v = 0.0f;
+  int i = 0;
+  int const x_36 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  float const x_37 = float(x_36);
+  v = float4(x_37, x_37, x_37, x_37);
+  int const x_40 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  i = x_40;
+  while (true) {
+    int const x_45 = i;
+    int const x_47 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    if ((x_45 < x_47)) {
+    } else {
+      break;
+    }
+    int const x_50 = i;
+    int const x_51 = i;
+    v[uint3(0u, 1u, 2u)[x_50]] = float(x_51);
+    {
+      int const x_55 = i;
+      i = (x_55 + 1);
+    }
+  }
+  float4 const x_57 = v;
+  int const x_59 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_62 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_65 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_68 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  if (all((x_57 == float4(float(x_59), float(x_62), float(x_65), float(x_68))))) {
+    int const x_77 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_80 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_83 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_86 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_77), float(x_80), float(x_83), float(x_86));
+  } else {
+    int const x_90 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    float const x_91 = float(x_90);
+    *(tint_symbol_4) = float4(x_91, x_91, x_91, x_91);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..72cbcba
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,164 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 109
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v "v"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_3 = OpConstant %int 3
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+     %v3uint = OpTypeVector %uint 3
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+         %51 = OpConstantComposite %v3uint %uint_0 %uint_1 %uint_2
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+     %v4bool = OpTypeVector %bool 4
+   %main_out = OpTypeStruct %v4float
+         %97 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %v = OpVariable %_ptr_Function_v4float Function %12
+          %i = OpVariable %_ptr_Function_int Function %23
+         %27 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %28 = OpLoad %int %27
+         %29 = OpConvertSToF %float %28
+         %30 = OpCompositeConstruct %v4float %29 %29 %29 %29
+               OpStore %v %30
+         %32 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %33 = OpLoad %int %32
+               OpStore %i %33
+               OpBranch %34
+         %34 = OpLabel
+               OpLoopMerge %35 %36 None
+               OpBranch %37
+         %37 = OpLabel
+         %38 = OpLoad %int %i
+         %39 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %40 = OpLoad %int %39
+         %41 = OpSLessThan %bool %38 %40
+               OpSelectionMerge %43 None
+               OpBranchConditional %41 %44 %45
+         %44 = OpLabel
+               OpBranch %43
+         %45 = OpLabel
+               OpBranch %35
+         %43 = OpLabel
+         %46 = OpLoad %int %i
+         %47 = OpLoad %int %i
+         %52 = OpVectorExtractDynamic %uint %51 %46
+         %54 = OpAccessChain %_ptr_Function_float %v %52
+         %55 = OpConvertSToF %float %47
+               OpStore %54 %55
+               OpBranch %36
+         %36 = OpLabel
+         %56 = OpLoad %int %i
+         %58 = OpIAdd %int %56 %int_1
+               OpStore %i %58
+               OpBranch %34
+         %35 = OpLabel
+         %59 = OpLoad %v4float %v
+         %60 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %61 = OpLoad %int %60
+         %62 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %63 = OpLoad %int %62
+         %65 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %66 = OpLoad %int %65
+         %67 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %68 = OpLoad %int %67
+         %70 = OpConvertSToF %float %61
+         %71 = OpConvertSToF %float %63
+         %72 = OpConvertSToF %float %66
+         %73 = OpConvertSToF %float %68
+         %74 = OpCompositeConstruct %v4float %70 %71 %72 %73
+         %75 = OpFOrdEqual %v4bool %59 %74
+         %69 = OpAll %bool %75
+               OpSelectionMerge %77 None
+               OpBranchConditional %69 %78 %79
+         %78 = OpLabel
+         %80 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %81 = OpLoad %int %80
+         %82 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %83 = OpLoad %int %82
+         %84 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %85 = OpLoad %int %84
+         %86 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %87 = OpLoad %int %86
+         %88 = OpConvertSToF %float %81
+         %89 = OpConvertSToF %float %83
+         %90 = OpConvertSToF %float %85
+         %91 = OpConvertSToF %float %87
+         %92 = OpCompositeConstruct %v4float %88 %89 %90 %91
+               OpStore %x_GLF_color %92
+               OpBranch %77
+         %79 = OpLabel
+         %93 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %94 = OpLoad %int %93
+         %95 = OpConvertSToF %float %94
+         %96 = OpCompositeConstruct %v4float %95 %95 %95 %95
+               OpStore %x_GLF_color %96
+               OpBranch %77
+         %77 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %97
+%tint_symbol = OpFunctionParameter %main_out
+        %101 = OpLabel
+        %102 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %102
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %104 = OpLabel
+        %105 = OpFunctionCall %void %main_1
+        %107 = OpLoad %v4float %x_GLF_color
+        %108 = OpCompositeConstruct %main_out %107
+        %106 = OpFunctionCall %void %tint_symbol_2 %108
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..f495ad7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,64 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v : vec4<f32>;
+  var i : i32;
+  let x_36 : i32 = x_6.x_GLF_uniform_int_values[3];
+  let x_37 : f32 = f32(x_36);
+  v = vec4<f32>(x_37, x_37, x_37, x_37);
+  let x_40 : i32 = x_6.x_GLF_uniform_int_values[0];
+  i = x_40;
+  loop {
+    let x_45 : i32 = i;
+    let x_47 : i32 = x_6.x_GLF_uniform_int_values[3];
+    if ((x_45 < x_47)) {
+    } else {
+      break;
+    }
+    let x_50 : i32 = i;
+    let x_51 : i32 = i;
+    v[vec3<u32>(0u, 1u, 2u)[x_50]] = f32(x_51);
+
+    continuing {
+      let x_55 : i32 = i;
+      i = (x_55 + 1);
+    }
+  }
+  let x_57 : vec4<f32> = v;
+  let x_59 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_62 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_65 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_68 : i32 = x_6.x_GLF_uniform_int_values[3];
+  if (all((x_57 == vec4<f32>(f32(x_59), f32(x_62), f32(x_65), f32(x_68))))) {
+    let x_77 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_80 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_83 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_86 : i32 = x_6.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_77), f32(x_80), f32(x_83), f32(x_86));
+  } else {
+    let x_90 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_91 : f32 = f32(x_90);
+    x_GLF_color = vec4<f32>(x_91, x_91, x_91, x_91);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.wgsl
new file mode 100644
index 0000000..f495ad7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.wgsl
@@ -0,0 +1,64 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v : vec4<f32>;
+  var i : i32;
+  let x_36 : i32 = x_6.x_GLF_uniform_int_values[3];
+  let x_37 : f32 = f32(x_36);
+  v = vec4<f32>(x_37, x_37, x_37, x_37);
+  let x_40 : i32 = x_6.x_GLF_uniform_int_values[0];
+  i = x_40;
+  loop {
+    let x_45 : i32 = i;
+    let x_47 : i32 = x_6.x_GLF_uniform_int_values[3];
+    if ((x_45 < x_47)) {
+    } else {
+      break;
+    }
+    let x_50 : i32 = i;
+    let x_51 : i32 = i;
+    v[vec3<u32>(0u, 1u, 2u)[x_50]] = f32(x_51);
+
+    continuing {
+      let x_55 : i32 = i;
+      i = (x_55 + 1);
+    }
+  }
+  let x_57 : vec4<f32> = v;
+  let x_59 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_62 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_65 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_68 : i32 = x_6.x_GLF_uniform_int_values[3];
+  if (all((x_57 == vec4<f32>(f32(x_59), f32(x_62), f32(x_65), f32(x_68))))) {
+    let x_77 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_80 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_83 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_86 : i32 = x_6.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_77), f32(x_80), f32(x_83), f32(x_86));
+  } else {
+    let x_90 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_91 : f32 = f32(x_90);
+    x_GLF_color = vec4<f32>(x_91, x_91, x_91, x_91);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..a8ef20d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,66 @@
+void set_float4(inout float4 vec, int idx, float val) {
+  vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
+}
+
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 v = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int i = 0;
+  const int x_36 = asint(x_6[3].x);
+  const float x_37 = float(x_36);
+  v = float4(x_37, x_37, x_37, x_37);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_40 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  i = x_40;
+  while (true) {
+    const int x_45 = i;
+    const int x_47 = asint(x_6[3].x);
+    if ((x_45 < x_47)) {
+    } else {
+      break;
+    }
+    set_float4(v, uint3(0u, 1u, 2u)[i], float(i));
+    {
+      i = (i + 1);
+    }
+  }
+  const float4 x_57 = v;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_59 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const int x_62 = asint(x_6[1].x);
+  const int x_65 = asint(x_6[2].x);
+  const int x_68 = asint(x_6[3].x);
+  if (all((x_57 == float4(float(x_59), float(x_62), float(x_65), float(x_68))))) {
+    const int x_77 = asint(x_6[1].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_80 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_83 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const int x_86 = asint(x_6[1].x);
+    x_GLF_color = float4(float(x_77), float(x_80), float(x_83), float(x_86));
+  } else {
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_90 = asint(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const float x_91 = float(x_90);
+    x_GLF_color = float4(x_91, x_91, x_91, x_91);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..3d744a3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.wgsl.expected.msl
@@ -0,0 +1,70 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float4 v = 0.0f;
+  int i = 0;
+  int const x_36 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  float const x_37 = float(x_36);
+  v = float4(x_37, x_37, x_37, x_37);
+  int const x_40 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  i = x_40;
+  while (true) {
+    int const x_45 = i;
+    int const x_47 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    if ((x_45 < x_47)) {
+    } else {
+      break;
+    }
+    int const x_50 = i;
+    int const x_51 = i;
+    v[uint3(0u, 1u, 2u)[x_50]] = float(x_51);
+    {
+      int const x_55 = i;
+      i = (x_55 + 1);
+    }
+  }
+  float4 const x_57 = v;
+  int const x_59 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_62 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_65 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_68 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  if (all((x_57 == float4(float(x_59), float(x_62), float(x_65), float(x_68))))) {
+    int const x_77 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_80 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_83 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_86 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_77), float(x_80), float(x_83), float(x_86));
+  } else {
+    int const x_90 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    float const x_91 = float(x_90);
+    *(tint_symbol_4) = float4(x_91, x_91, x_91, x_91);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..72cbcba
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,164 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 109
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v "v"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_3 = OpConstant %int 3
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+     %v3uint = OpTypeVector %uint 3
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+         %51 = OpConstantComposite %v3uint %uint_0 %uint_1 %uint_2
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+     %v4bool = OpTypeVector %bool 4
+   %main_out = OpTypeStruct %v4float
+         %97 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %v = OpVariable %_ptr_Function_v4float Function %12
+          %i = OpVariable %_ptr_Function_int Function %23
+         %27 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %28 = OpLoad %int %27
+         %29 = OpConvertSToF %float %28
+         %30 = OpCompositeConstruct %v4float %29 %29 %29 %29
+               OpStore %v %30
+         %32 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %33 = OpLoad %int %32
+               OpStore %i %33
+               OpBranch %34
+         %34 = OpLabel
+               OpLoopMerge %35 %36 None
+               OpBranch %37
+         %37 = OpLabel
+         %38 = OpLoad %int %i
+         %39 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %40 = OpLoad %int %39
+         %41 = OpSLessThan %bool %38 %40
+               OpSelectionMerge %43 None
+               OpBranchConditional %41 %44 %45
+         %44 = OpLabel
+               OpBranch %43
+         %45 = OpLabel
+               OpBranch %35
+         %43 = OpLabel
+         %46 = OpLoad %int %i
+         %47 = OpLoad %int %i
+         %52 = OpVectorExtractDynamic %uint %51 %46
+         %54 = OpAccessChain %_ptr_Function_float %v %52
+         %55 = OpConvertSToF %float %47
+               OpStore %54 %55
+               OpBranch %36
+         %36 = OpLabel
+         %56 = OpLoad %int %i
+         %58 = OpIAdd %int %56 %int_1
+               OpStore %i %58
+               OpBranch %34
+         %35 = OpLabel
+         %59 = OpLoad %v4float %v
+         %60 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %61 = OpLoad %int %60
+         %62 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %63 = OpLoad %int %62
+         %65 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %66 = OpLoad %int %65
+         %67 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %68 = OpLoad %int %67
+         %70 = OpConvertSToF %float %61
+         %71 = OpConvertSToF %float %63
+         %72 = OpConvertSToF %float %66
+         %73 = OpConvertSToF %float %68
+         %74 = OpCompositeConstruct %v4float %70 %71 %72 %73
+         %75 = OpFOrdEqual %v4bool %59 %74
+         %69 = OpAll %bool %75
+               OpSelectionMerge %77 None
+               OpBranchConditional %69 %78 %79
+         %78 = OpLabel
+         %80 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %81 = OpLoad %int %80
+         %82 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %83 = OpLoad %int %82
+         %84 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %85 = OpLoad %int %84
+         %86 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %87 = OpLoad %int %86
+         %88 = OpConvertSToF %float %81
+         %89 = OpConvertSToF %float %83
+         %90 = OpConvertSToF %float %85
+         %91 = OpConvertSToF %float %87
+         %92 = OpCompositeConstruct %v4float %88 %89 %90 %91
+               OpStore %x_GLF_color %92
+               OpBranch %77
+         %79 = OpLabel
+         %93 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %94 = OpLoad %int %93
+         %95 = OpConvertSToF %float %94
+         %96 = OpCompositeConstruct %v4float %95 %95 %95 %95
+               OpStore %x_GLF_color %96
+               OpBranch %77
+         %77 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %97
+%tint_symbol = OpFunctionParameter %main_out
+        %101 = OpLabel
+        %102 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %102
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %104 = OpLabel
+        %105 = OpFunctionCall %void %main_1
+        %107 = OpLoad %v4float %x_GLF_color
+        %108 = OpCompositeConstruct %main_out %107
+        %106 = OpFunctionCall %void %tint_symbol_2 %108
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..f495ad7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-combine-casts-legalize-vector-types-xyz-swizzle-for-loop/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,64 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v : vec4<f32>;
+  var i : i32;
+  let x_36 : i32 = x_6.x_GLF_uniform_int_values[3];
+  let x_37 : f32 = f32(x_36);
+  v = vec4<f32>(x_37, x_37, x_37, x_37);
+  let x_40 : i32 = x_6.x_GLF_uniform_int_values[0];
+  i = x_40;
+  loop {
+    let x_45 : i32 = i;
+    let x_47 : i32 = x_6.x_GLF_uniform_int_values[3];
+    if ((x_45 < x_47)) {
+    } else {
+      break;
+    }
+    let x_50 : i32 = i;
+    let x_51 : i32 = i;
+    v[vec3<u32>(0u, 1u, 2u)[x_50]] = f32(x_51);
+
+    continuing {
+      let x_55 : i32 = i;
+      i = (x_55 + 1);
+    }
+  }
+  let x_57 : vec4<f32> = v;
+  let x_59 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_62 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_65 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_68 : i32 = x_6.x_GLF_uniform_int_values[3];
+  if (all((x_57 == vec4<f32>(f32(x_59), f32(x_62), f32(x_65), f32(x_68))))) {
+    let x_77 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_80 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_83 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_86 : i32 = x_6.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_77), f32(x_80), f32(x_83), f32(x_86));
+  } else {
+    let x_90 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_91 : f32 = f32(x_90);
+    x_GLF_color = vec4<f32>(x_91, x_91, x_91, x_91);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-glf_color/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-glf_color/0-opt.spvasm
new file mode 100644
index 0000000..2e8e153
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-glf_color/0-opt.spvasm
@@ -0,0 +1,163 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %func_f1_ "func(f1;"
+               OpName %b "b"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %a "a"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_float_uint_4 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %15 RelaxedPrecision
+               OpDecorate %16 RelaxedPrecision
+               OpDecorate %17 RelaxedPrecision
+               OpDecorate %18 RelaxedPrecision
+               OpDecorate %19 RelaxedPrecision
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+         %24 = OpTypeFunction %float %_ptr_Function_float
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+       %buf1 = OpTypeStruct %_arr_float_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+     %v4bool = OpTypeVector %bool 4
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %main = OpFunction %void None %21
+         %42 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function
+      %param = OpVariable %_ptr_Function_float Function
+    %param_0 = OpVariable %_ptr_Function_float Function
+         %43 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %44 = OpLoad %float %43
+               OpStore %param %44
+         %45 = OpFunctionCall %float %func_f1_ %param
+               OpStore %a %45
+         %46 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %47 = OpLoad %float %46
+         %48 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %49 = OpLoad %float %48
+         %50 = OpFAdd %float %47 %49
+               OpStore %param_0 %50
+         %51 = OpFunctionCall %float %func_f1_ %param_0
+         %52 = OpLoad %float %a
+         %53 = OpFAdd %float %52 %51
+               OpStore %a %53
+         %54 = OpLoad %float %a
+         %55 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_3
+         %56 = OpLoad %float %55
+         %57 = OpFOrdEqual %bool %54 %56
+               OpSelectionMerge %58 None
+               OpBranchConditional %57 %59 %58
+         %59 = OpLabel
+         %60 = OpLoad %v4float %_GLF_color
+         %61 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %62 = OpLoad %float %61
+         %63 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %64 = OpLoad %float %63
+         %65 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %66 = OpLoad %float %65
+         %67 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %68 = OpLoad %float %67
+         %69 = OpCompositeConstruct %v4float %62 %64 %66 %68
+         %70 = OpFOrdEqual %v4bool %60 %69
+         %71 = OpAll %bool %70
+               OpBranch %58
+         %58 = OpLabel
+         %72 = OpPhi %bool %57 %42 %71 %59
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %74 %75
+         %74 = OpLabel
+         %76 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %15 = OpLoad %int %76
+         %77 = OpConvertSToF %float %15
+         %78 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %16 = OpLoad %int %78
+         %79 = OpConvertSToF %float %16
+         %80 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %17 = OpLoad %int %80
+         %81 = OpConvertSToF %float %17
+         %82 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %18 = OpLoad %int %82
+         %83 = OpConvertSToF %float %18
+         %84 = OpCompositeConstruct %v4float %77 %79 %81 %83
+               OpStore %_GLF_color %84
+               OpBranch %73
+         %75 = OpLabel
+         %85 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %19 = OpLoad %int %85
+         %86 = OpConvertSToF %float %19
+         %87 = OpCompositeConstruct %v4float %86 %86 %86 %86
+               OpStore %_GLF_color %87
+               OpBranch %73
+         %73 = OpLabel
+               OpReturn
+               OpFunctionEnd
+   %func_f1_ = OpFunction %float None %24
+          %b = OpFunctionParameter %_ptr_Function_float
+         %88 = OpLabel
+         %89 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %90 = OpLoad %float %89
+         %91 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %92 = OpLoad %float %91
+         %93 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %94 = OpLoad %float %93
+         %95 = OpCompositeConstruct %v4float %90 %92 %94 %float_1
+               OpStore %_GLF_color %95
+         %96 = OpLoad %v4float %_GLF_color
+               OpStore %_GLF_color %96
+         %97 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %98 = OpLoad %float %97
+         %99 = OpLoad %float %b
+        %100 = OpFOrdGreaterThanEqual %bool %98 %99
+               OpSelectionMerge %101 None
+               OpBranchConditional %100 %102 %101
+        %102 = OpLabel
+        %103 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+        %104 = OpLoad %float %103
+               OpReturnValue %104
+        %101 = OpLabel
+        %105 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+        %106 = OpLoad %float %105
+               OpReturnValue %106
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-glf_color/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-glf_color/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..4152b78
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-glf_color/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,91 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_7 : register(b1, space0) {
+  uint4 x_7[4];
+};
+cbuffer cbuffer_x_12 : register(b0, space0) {
+  uint4 x_12[2];
+};
+
+float func_f1_(inout float b) {
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_90 = asfloat(x_7[scalar_offset / 4][scalar_offset % 4]);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_92 = asfloat(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const float x_94 = asfloat(x_7[1].x);
+  x_GLF_color = float4(x_90, x_92, x_94, 1.0f);
+  x_GLF_color = x_GLF_color;
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const float x_98 = asfloat(x_7[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  const float x_99 = b;
+  if ((x_98 >= x_99)) {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const float x_104 = asfloat(x_7[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    return x_104;
+  }
+  const float x_106 = asfloat(x_7[2].x);
+  return x_106;
+}
+
+void main_1() {
+  float a = 0.0f;
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  bool x_71 = false;
+  bool x_72_phi = false;
+  const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+  const float x_44 = asfloat(x_7[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+  param = x_44;
+  const float x_45 = func_f1_(param);
+  a = x_45;
+  const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+  const float x_47 = asfloat(x_7[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+  const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+  const float x_49 = asfloat(x_7[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+  param_1 = (x_47 + x_49);
+  const float x_51 = func_f1_(param_1);
+  a = (a + x_51);
+  const float x_54 = a;
+  const float x_56 = asfloat(x_7[3].x);
+  const bool x_57 = (x_54 == x_56);
+  x_72_phi = x_57;
+  if (x_57) {
+    const float4 x_60 = x_GLF_color;
+    const uint scalar_offset_7 = ((16u * uint(0))) / 4;
+    const float x_62 = asfloat(x_7[scalar_offset_7 / 4][scalar_offset_7 % 4]);
+    const uint scalar_offset_8 = ((16u * uint(0))) / 4;
+    const float x_64 = asfloat(x_7[scalar_offset_8 / 4][scalar_offset_8 % 4]);
+    const float x_66 = asfloat(x_7[1].x);
+    const uint scalar_offset_9 = ((16u * uint(0))) / 4;
+    const float x_68 = asfloat(x_7[scalar_offset_9 / 4][scalar_offset_9 % 4]);
+    x_71 = all((x_60 == float4(x_62, x_64, x_66, x_68)));
+    x_72_phi = x_71;
+  }
+  if (x_72_phi) {
+    const uint scalar_offset_10 = ((16u * uint(0))) / 4;
+    const int x_15 = asint(x_12[scalar_offset_10 / 4][scalar_offset_10 % 4]);
+    const int x_16 = asint(x_12[1].x);
+    const int x_17 = asint(x_12[1].x);
+    const uint scalar_offset_11 = ((16u * uint(0))) / 4;
+    const int x_18 = asint(x_12[scalar_offset_11 / 4][scalar_offset_11 % 4]);
+    x_GLF_color = float4(float(x_15), float(x_16), float(x_17), float(x_18));
+  } else {
+    const int x_19 = asint(x_12[1].x);
+    const float x_86 = float(x_19);
+    x_GLF_color = float4(x_86, x_86, x_86, x_86);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-glf_color/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-glf_color/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..3242c11
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-glf_color/0-opt.spvasm.expected.msl
@@ -0,0 +1,99 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float func_f1_(constant buf1& x_7, thread float* const b, thread float4* const tint_symbol_4) {
+  float const x_90 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  float const x_92 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  float const x_94 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  *(tint_symbol_4) = float4(x_90, x_92, x_94, 1.0f);
+  float4 const x_96 = *(tint_symbol_4);
+  *(tint_symbol_4) = x_96;
+  float const x_98 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  float const x_99 = *(b);
+  if ((x_98 >= x_99)) {
+    float const x_104 = x_7.x_GLF_uniform_float_values.arr[0].el;
+    return x_104;
+  }
+  float const x_106 = x_7.x_GLF_uniform_float_values.arr[2].el;
+  return x_106;
+}
+
+void main_1(constant buf1& x_7, constant buf0& x_12, thread float4* const tint_symbol_5) {
+  float a = 0.0f;
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  bool x_71 = false;
+  bool x_72_phi = false;
+  float const x_44 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  param = x_44;
+  float const x_45 = func_f1_(x_7, &(param), tint_symbol_5);
+  a = x_45;
+  float const x_47 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  float const x_49 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  param_1 = (x_47 + x_49);
+  float const x_51 = func_f1_(x_7, &(param_1), tint_symbol_5);
+  float const x_52 = a;
+  a = (x_52 + x_51);
+  float const x_54 = a;
+  float const x_56 = x_7.x_GLF_uniform_float_values.arr[3].el;
+  bool const x_57 = (x_54 == x_56);
+  x_72_phi = x_57;
+  if (x_57) {
+    float4 const x_60 = *(tint_symbol_5);
+    float const x_62 = x_7.x_GLF_uniform_float_values.arr[0].el;
+    float const x_64 = x_7.x_GLF_uniform_float_values.arr[0].el;
+    float const x_66 = x_7.x_GLF_uniform_float_values.arr[1].el;
+    float const x_68 = x_7.x_GLF_uniform_float_values.arr[0].el;
+    x_71 = all((x_60 == float4(x_62, x_64, x_66, x_68)));
+    x_72_phi = x_71;
+  }
+  bool const x_72 = x_72_phi;
+  if (x_72) {
+    int const x_15 = x_12.x_GLF_uniform_int_values.arr[0].el;
+    int const x_16 = x_12.x_GLF_uniform_int_values.arr[1].el;
+    int const x_17 = x_12.x_GLF_uniform_int_values.arr[1].el;
+    int const x_18 = x_12.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_5) = float4(float(x_15), float(x_16), float(x_17), float(x_18));
+  } else {
+    int const x_19 = x_12.x_GLF_uniform_int_values.arr[1].el;
+    float const x_86 = float(x_19);
+    *(tint_symbol_5) = float4(x_86, x_86, x_86, x_86);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_7 [[buffer(1)]], constant buf0& x_12 [[buffer(0)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_7, x_12, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-glf_color/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-glf_color/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..862ad1a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-glf_color/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,201 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 131
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_7 "x_7"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_12 "x_12"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_f1_ "func_f1_"
+               OpName %b "b"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %x_71 "x_71"
+               OpName %x_72_phi "x_72_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_4 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_12 NonWritable
+               OpDecorate %x_12 DescriptorSet 0
+               OpDecorate %x_12 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+       %buf1 = OpTypeStruct %_arr_float_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_7 = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_12 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Function_float = OpTypePointer Function %float
+         %20 = OpTypeFunction %float %_ptr_Function_float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+       %void = OpTypeVoid
+         %51 = OpTypeFunction %void
+         %56 = OpConstantNull %float
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %61 = OpConstantNull %bool
+      %int_3 = OpConstant %int 3
+     %v4bool = OpTypeVector %bool 4
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+        %119 = OpTypeFunction %void %main_out
+   %func_f1_ = OpFunction %float None %20
+          %b = OpFunctionParameter %_ptr_Function_float
+         %24 = OpLabel
+         %28 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %29 = OpLoad %float %28
+         %30 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %31 = OpLoad %float %30
+         %33 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %34 = OpLoad %float %33
+         %36 = OpCompositeConstruct %v4float %29 %31 %34 %float_1
+               OpStore %x_GLF_color %36
+         %37 = OpLoad %v4float %x_GLF_color
+               OpStore %x_GLF_color %37
+         %38 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %39 = OpLoad %float %38
+         %41 = OpLoad %float %b
+         %42 = OpFOrdGreaterThanEqual %bool %39 %41
+               OpSelectionMerge %44 None
+               OpBranchConditional %42 %45 %44
+         %45 = OpLabel
+         %46 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %47 = OpLoad %float %46
+               OpReturnValue %47
+         %44 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_2
+         %50 = OpLoad %float %49
+               OpReturnValue %50
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %51
+         %54 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function %56
+      %param = OpVariable %_ptr_Function_float Function %56
+    %param_1 = OpVariable %_ptr_Function_float Function %56
+       %x_71 = OpVariable %_ptr_Function_bool Function %61
+   %x_72_phi = OpVariable %_ptr_Function_bool Function %61
+         %63 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %64 = OpLoad %float %63
+               OpStore %param %64
+         %65 = OpFunctionCall %float %func_f1_ %param
+               OpStore %a %65
+         %67 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %68 = OpLoad %float %67
+         %69 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %70 = OpLoad %float %69
+         %71 = OpFAdd %float %68 %70
+               OpStore %param_1 %71
+         %72 = OpFunctionCall %float %func_f1_ %param_1
+         %74 = OpLoad %float %a
+         %75 = OpFAdd %float %74 %72
+               OpStore %a %75
+         %76 = OpLoad %float %a
+         %78 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_3
+         %79 = OpLoad %float %78
+         %80 = OpFOrdEqual %bool %76 %79
+               OpStore %x_72_phi %80
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %81
+         %82 = OpLabel
+         %83 = OpLoad %v4float %x_GLF_color
+         %84 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %85 = OpLoad %float %84
+         %86 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %87 = OpLoad %float %86
+         %88 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %89 = OpLoad %float %88
+         %90 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %91 = OpLoad %float %90
+         %93 = OpCompositeConstruct %v4float %85 %87 %89 %91
+         %94 = OpFOrdEqual %v4bool %83 %93
+         %92 = OpAll %bool %94
+               OpStore %x_71 %92
+         %96 = OpLoad %bool %x_71
+               OpStore %x_72_phi %96
+               OpBranch %81
+         %81 = OpLabel
+         %97 = OpLoad %bool %x_72_phi
+               OpSelectionMerge %98 None
+               OpBranchConditional %97 %99 %100
+         %99 = OpLabel
+        %102 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_0
+        %103 = OpLoad %int %102
+        %104 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_1
+        %105 = OpLoad %int %104
+        %106 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_1
+        %107 = OpLoad %int %106
+        %108 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_0
+        %109 = OpLoad %int %108
+        %110 = OpConvertSToF %float %103
+        %111 = OpConvertSToF %float %105
+        %112 = OpConvertSToF %float %107
+        %113 = OpConvertSToF %float %109
+        %114 = OpCompositeConstruct %v4float %110 %111 %112 %113
+               OpStore %x_GLF_color %114
+               OpBranch %98
+        %100 = OpLabel
+        %115 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_1
+        %116 = OpLoad %int %115
+        %117 = OpConvertSToF %float %116
+        %118 = OpCompositeConstruct %v4float %117 %117 %117 %117
+               OpStore %x_GLF_color %118
+               OpBranch %98
+         %98 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %119
+%tint_symbol = OpFunctionParameter %main_out
+        %123 = OpLabel
+        %124 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %124
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %51
+        %126 = OpLabel
+        %127 = OpFunctionCall %void %main_1
+        %129 = OpLoad %v4float %x_GLF_color
+        %130 = OpCompositeConstruct %main_out %129
+        %128 = OpFunctionCall %void %tint_symbol_2 %130
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-glf_color/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-glf_color/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..f0938fc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-glf_color/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,91 @@
+type Arr = [[stride(16)]] array<f32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_12 : buf0;
+
+fn func_f1_(b : ptr<function, f32>) -> f32 {
+  let x_90 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_92 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_94 : f32 = x_7.x_GLF_uniform_float_values[1];
+  x_GLF_color = vec4<f32>(x_90, x_92, x_94, 1.0);
+  let x_96 : vec4<f32> = x_GLF_color;
+  x_GLF_color = x_96;
+  let x_98 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_99 : f32 = *(b);
+  if ((x_98 >= x_99)) {
+    let x_104 : f32 = x_7.x_GLF_uniform_float_values[0];
+    return x_104;
+  }
+  let x_106 : f32 = x_7.x_GLF_uniform_float_values[2];
+  return x_106;
+}
+
+fn main_1() {
+  var a : f32;
+  var param : f32;
+  var param_1 : f32;
+  var x_71 : bool;
+  var x_72_phi : bool;
+  let x_44 : f32 = x_7.x_GLF_uniform_float_values[0];
+  param = x_44;
+  let x_45 : f32 = func_f1_(&(param));
+  a = x_45;
+  let x_47 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_49 : f32 = x_7.x_GLF_uniform_float_values[0];
+  param_1 = (x_47 + x_49);
+  let x_51 : f32 = func_f1_(&(param_1));
+  let x_52 : f32 = a;
+  a = (x_52 + x_51);
+  let x_54 : f32 = a;
+  let x_56 : f32 = x_7.x_GLF_uniform_float_values[3];
+  let x_57 : bool = (x_54 == x_56);
+  x_72_phi = x_57;
+  if (x_57) {
+    let x_60 : vec4<f32> = x_GLF_color;
+    let x_62 : f32 = x_7.x_GLF_uniform_float_values[0];
+    let x_64 : f32 = x_7.x_GLF_uniform_float_values[0];
+    let x_66 : f32 = x_7.x_GLF_uniform_float_values[1];
+    let x_68 : f32 = x_7.x_GLF_uniform_float_values[0];
+    x_71 = all((x_60 == vec4<f32>(x_62, x_64, x_66, x_68)));
+    x_72_phi = x_71;
+  }
+  let x_72 : bool = x_72_phi;
+  if (x_72) {
+    let x_15 : i32 = x_12.x_GLF_uniform_int_values[0];
+    let x_16 : i32 = x_12.x_GLF_uniform_int_values[1];
+    let x_17 : i32 = x_12.x_GLF_uniform_int_values[1];
+    let x_18 : i32 = x_12.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_15), f32(x_16), f32(x_17), f32(x_18));
+  } else {
+    let x_19 : i32 = x_12.x_GLF_uniform_int_values[1];
+    let x_86 : f32 = f32(x_19);
+    x_GLF_color = vec4<f32>(x_86, x_86, x_86, x_86);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-glf_color/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-glf_color/0-opt.wgsl
new file mode 100644
index 0000000..f0938fc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-glf_color/0-opt.wgsl
@@ -0,0 +1,91 @@
+type Arr = [[stride(16)]] array<f32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_12 : buf0;
+
+fn func_f1_(b : ptr<function, f32>) -> f32 {
+  let x_90 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_92 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_94 : f32 = x_7.x_GLF_uniform_float_values[1];
+  x_GLF_color = vec4<f32>(x_90, x_92, x_94, 1.0);
+  let x_96 : vec4<f32> = x_GLF_color;
+  x_GLF_color = x_96;
+  let x_98 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_99 : f32 = *(b);
+  if ((x_98 >= x_99)) {
+    let x_104 : f32 = x_7.x_GLF_uniform_float_values[0];
+    return x_104;
+  }
+  let x_106 : f32 = x_7.x_GLF_uniform_float_values[2];
+  return x_106;
+}
+
+fn main_1() {
+  var a : f32;
+  var param : f32;
+  var param_1 : f32;
+  var x_71 : bool;
+  var x_72_phi : bool;
+  let x_44 : f32 = x_7.x_GLF_uniform_float_values[0];
+  param = x_44;
+  let x_45 : f32 = func_f1_(&(param));
+  a = x_45;
+  let x_47 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_49 : f32 = x_7.x_GLF_uniform_float_values[0];
+  param_1 = (x_47 + x_49);
+  let x_51 : f32 = func_f1_(&(param_1));
+  let x_52 : f32 = a;
+  a = (x_52 + x_51);
+  let x_54 : f32 = a;
+  let x_56 : f32 = x_7.x_GLF_uniform_float_values[3];
+  let x_57 : bool = (x_54 == x_56);
+  x_72_phi = x_57;
+  if (x_57) {
+    let x_60 : vec4<f32> = x_GLF_color;
+    let x_62 : f32 = x_7.x_GLF_uniform_float_values[0];
+    let x_64 : f32 = x_7.x_GLF_uniform_float_values[0];
+    let x_66 : f32 = x_7.x_GLF_uniform_float_values[1];
+    let x_68 : f32 = x_7.x_GLF_uniform_float_values[0];
+    x_71 = all((x_60 == vec4<f32>(x_62, x_64, x_66, x_68)));
+    x_72_phi = x_71;
+  }
+  let x_72 : bool = x_72_phi;
+  if (x_72) {
+    let x_15 : i32 = x_12.x_GLF_uniform_int_values[0];
+    let x_16 : i32 = x_12.x_GLF_uniform_int_values[1];
+    let x_17 : i32 = x_12.x_GLF_uniform_int_values[1];
+    let x_18 : i32 = x_12.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_15), f32(x_16), f32(x_17), f32(x_18));
+  } else {
+    let x_19 : i32 = x_12.x_GLF_uniform_int_values[1];
+    let x_86 : f32 = f32(x_19);
+    x_GLF_color = vec4<f32>(x_86, x_86, x_86, x_86);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-glf_color/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-glf_color/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..4152b78
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-glf_color/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,91 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_7 : register(b1, space0) {
+  uint4 x_7[4];
+};
+cbuffer cbuffer_x_12 : register(b0, space0) {
+  uint4 x_12[2];
+};
+
+float func_f1_(inout float b) {
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_90 = asfloat(x_7[scalar_offset / 4][scalar_offset % 4]);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_92 = asfloat(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const float x_94 = asfloat(x_7[1].x);
+  x_GLF_color = float4(x_90, x_92, x_94, 1.0f);
+  x_GLF_color = x_GLF_color;
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const float x_98 = asfloat(x_7[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  const float x_99 = b;
+  if ((x_98 >= x_99)) {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const float x_104 = asfloat(x_7[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    return x_104;
+  }
+  const float x_106 = asfloat(x_7[2].x);
+  return x_106;
+}
+
+void main_1() {
+  float a = 0.0f;
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  bool x_71 = false;
+  bool x_72_phi = false;
+  const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+  const float x_44 = asfloat(x_7[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+  param = x_44;
+  const float x_45 = func_f1_(param);
+  a = x_45;
+  const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+  const float x_47 = asfloat(x_7[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+  const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+  const float x_49 = asfloat(x_7[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+  param_1 = (x_47 + x_49);
+  const float x_51 = func_f1_(param_1);
+  a = (a + x_51);
+  const float x_54 = a;
+  const float x_56 = asfloat(x_7[3].x);
+  const bool x_57 = (x_54 == x_56);
+  x_72_phi = x_57;
+  if (x_57) {
+    const float4 x_60 = x_GLF_color;
+    const uint scalar_offset_7 = ((16u * uint(0))) / 4;
+    const float x_62 = asfloat(x_7[scalar_offset_7 / 4][scalar_offset_7 % 4]);
+    const uint scalar_offset_8 = ((16u * uint(0))) / 4;
+    const float x_64 = asfloat(x_7[scalar_offset_8 / 4][scalar_offset_8 % 4]);
+    const float x_66 = asfloat(x_7[1].x);
+    const uint scalar_offset_9 = ((16u * uint(0))) / 4;
+    const float x_68 = asfloat(x_7[scalar_offset_9 / 4][scalar_offset_9 % 4]);
+    x_71 = all((x_60 == float4(x_62, x_64, x_66, x_68)));
+    x_72_phi = x_71;
+  }
+  if (x_72_phi) {
+    const uint scalar_offset_10 = ((16u * uint(0))) / 4;
+    const int x_15 = asint(x_12[scalar_offset_10 / 4][scalar_offset_10 % 4]);
+    const int x_16 = asint(x_12[1].x);
+    const int x_17 = asint(x_12[1].x);
+    const uint scalar_offset_11 = ((16u * uint(0))) / 4;
+    const int x_18 = asint(x_12[scalar_offset_11 / 4][scalar_offset_11 % 4]);
+    x_GLF_color = float4(float(x_15), float(x_16), float(x_17), float(x_18));
+  } else {
+    const int x_19 = asint(x_12[1].x);
+    const float x_86 = float(x_19);
+    x_GLF_color = float4(x_86, x_86, x_86, x_86);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-glf_color/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-glf_color/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..3242c11
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-glf_color/0-opt.wgsl.expected.msl
@@ -0,0 +1,99 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float func_f1_(constant buf1& x_7, thread float* const b, thread float4* const tint_symbol_4) {
+  float const x_90 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  float const x_92 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  float const x_94 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  *(tint_symbol_4) = float4(x_90, x_92, x_94, 1.0f);
+  float4 const x_96 = *(tint_symbol_4);
+  *(tint_symbol_4) = x_96;
+  float const x_98 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  float const x_99 = *(b);
+  if ((x_98 >= x_99)) {
+    float const x_104 = x_7.x_GLF_uniform_float_values.arr[0].el;
+    return x_104;
+  }
+  float const x_106 = x_7.x_GLF_uniform_float_values.arr[2].el;
+  return x_106;
+}
+
+void main_1(constant buf1& x_7, constant buf0& x_12, thread float4* const tint_symbol_5) {
+  float a = 0.0f;
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  bool x_71 = false;
+  bool x_72_phi = false;
+  float const x_44 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  param = x_44;
+  float const x_45 = func_f1_(x_7, &(param), tint_symbol_5);
+  a = x_45;
+  float const x_47 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  float const x_49 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  param_1 = (x_47 + x_49);
+  float const x_51 = func_f1_(x_7, &(param_1), tint_symbol_5);
+  float const x_52 = a;
+  a = (x_52 + x_51);
+  float const x_54 = a;
+  float const x_56 = x_7.x_GLF_uniform_float_values.arr[3].el;
+  bool const x_57 = (x_54 == x_56);
+  x_72_phi = x_57;
+  if (x_57) {
+    float4 const x_60 = *(tint_symbol_5);
+    float const x_62 = x_7.x_GLF_uniform_float_values.arr[0].el;
+    float const x_64 = x_7.x_GLF_uniform_float_values.arr[0].el;
+    float const x_66 = x_7.x_GLF_uniform_float_values.arr[1].el;
+    float const x_68 = x_7.x_GLF_uniform_float_values.arr[0].el;
+    x_71 = all((x_60 == float4(x_62, x_64, x_66, x_68)));
+    x_72_phi = x_71;
+  }
+  bool const x_72 = x_72_phi;
+  if (x_72) {
+    int const x_15 = x_12.x_GLF_uniform_int_values.arr[0].el;
+    int const x_16 = x_12.x_GLF_uniform_int_values.arr[1].el;
+    int const x_17 = x_12.x_GLF_uniform_int_values.arr[1].el;
+    int const x_18 = x_12.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_5) = float4(float(x_15), float(x_16), float(x_17), float(x_18));
+  } else {
+    int const x_19 = x_12.x_GLF_uniform_int_values.arr[1].el;
+    float const x_86 = float(x_19);
+    *(tint_symbol_5) = float4(x_86, x_86, x_86, x_86);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_7 [[buffer(1)]], constant buf0& x_12 [[buffer(0)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_7, x_12, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-glf_color/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-glf_color/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..862ad1a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-glf_color/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,201 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 131
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_7 "x_7"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_12 "x_12"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_f1_ "func_f1_"
+               OpName %b "b"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %x_71 "x_71"
+               OpName %x_72_phi "x_72_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_4 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_12 NonWritable
+               OpDecorate %x_12 DescriptorSet 0
+               OpDecorate %x_12 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+       %buf1 = OpTypeStruct %_arr_float_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_7 = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_12 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Function_float = OpTypePointer Function %float
+         %20 = OpTypeFunction %float %_ptr_Function_float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+       %void = OpTypeVoid
+         %51 = OpTypeFunction %void
+         %56 = OpConstantNull %float
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %61 = OpConstantNull %bool
+      %int_3 = OpConstant %int 3
+     %v4bool = OpTypeVector %bool 4
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+        %119 = OpTypeFunction %void %main_out
+   %func_f1_ = OpFunction %float None %20
+          %b = OpFunctionParameter %_ptr_Function_float
+         %24 = OpLabel
+         %28 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %29 = OpLoad %float %28
+         %30 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %31 = OpLoad %float %30
+         %33 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %34 = OpLoad %float %33
+         %36 = OpCompositeConstruct %v4float %29 %31 %34 %float_1
+               OpStore %x_GLF_color %36
+         %37 = OpLoad %v4float %x_GLF_color
+               OpStore %x_GLF_color %37
+         %38 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %39 = OpLoad %float %38
+         %41 = OpLoad %float %b
+         %42 = OpFOrdGreaterThanEqual %bool %39 %41
+               OpSelectionMerge %44 None
+               OpBranchConditional %42 %45 %44
+         %45 = OpLabel
+         %46 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %47 = OpLoad %float %46
+               OpReturnValue %47
+         %44 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_2
+         %50 = OpLoad %float %49
+               OpReturnValue %50
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %51
+         %54 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function %56
+      %param = OpVariable %_ptr_Function_float Function %56
+    %param_1 = OpVariable %_ptr_Function_float Function %56
+       %x_71 = OpVariable %_ptr_Function_bool Function %61
+   %x_72_phi = OpVariable %_ptr_Function_bool Function %61
+         %63 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %64 = OpLoad %float %63
+               OpStore %param %64
+         %65 = OpFunctionCall %float %func_f1_ %param
+               OpStore %a %65
+         %67 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %68 = OpLoad %float %67
+         %69 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %70 = OpLoad %float %69
+         %71 = OpFAdd %float %68 %70
+               OpStore %param_1 %71
+         %72 = OpFunctionCall %float %func_f1_ %param_1
+         %74 = OpLoad %float %a
+         %75 = OpFAdd %float %74 %72
+               OpStore %a %75
+         %76 = OpLoad %float %a
+         %78 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_3
+         %79 = OpLoad %float %78
+         %80 = OpFOrdEqual %bool %76 %79
+               OpStore %x_72_phi %80
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %81
+         %82 = OpLabel
+         %83 = OpLoad %v4float %x_GLF_color
+         %84 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %85 = OpLoad %float %84
+         %86 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %87 = OpLoad %float %86
+         %88 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %89 = OpLoad %float %88
+         %90 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %91 = OpLoad %float %90
+         %93 = OpCompositeConstruct %v4float %85 %87 %89 %91
+         %94 = OpFOrdEqual %v4bool %83 %93
+         %92 = OpAll %bool %94
+               OpStore %x_71 %92
+         %96 = OpLoad %bool %x_71
+               OpStore %x_72_phi %96
+               OpBranch %81
+         %81 = OpLabel
+         %97 = OpLoad %bool %x_72_phi
+               OpSelectionMerge %98 None
+               OpBranchConditional %97 %99 %100
+         %99 = OpLabel
+        %102 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_0
+        %103 = OpLoad %int %102
+        %104 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_1
+        %105 = OpLoad %int %104
+        %106 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_1
+        %107 = OpLoad %int %106
+        %108 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_0
+        %109 = OpLoad %int %108
+        %110 = OpConvertSToF %float %103
+        %111 = OpConvertSToF %float %105
+        %112 = OpConvertSToF %float %107
+        %113 = OpConvertSToF %float %109
+        %114 = OpCompositeConstruct %v4float %110 %111 %112 %113
+               OpStore %x_GLF_color %114
+               OpBranch %98
+        %100 = OpLabel
+        %115 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_1
+        %116 = OpLoad %int %115
+        %117 = OpConvertSToF %float %116
+        %118 = OpCompositeConstruct %v4float %117 %117 %117 %117
+               OpStore %x_GLF_color %118
+               OpBranch %98
+         %98 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %119
+%tint_symbol = OpFunctionParameter %main_out
+        %123 = OpLabel
+        %124 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %124
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %51
+        %126 = OpLabel
+        %127 = OpFunctionCall %void %main_1
+        %129 = OpLoad %v4float %x_GLF_color
+        %130 = OpCompositeConstruct %main_out %129
+        %128 = OpFunctionCall %void %tint_symbol_2 %130
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-glf_color/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-glf_color/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..f0938fc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-glf_color/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,91 @@
+type Arr = [[stride(16)]] array<f32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_12 : buf0;
+
+fn func_f1_(b : ptr<function, f32>) -> f32 {
+  let x_90 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_92 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_94 : f32 = x_7.x_GLF_uniform_float_values[1];
+  x_GLF_color = vec4<f32>(x_90, x_92, x_94, 1.0);
+  let x_96 : vec4<f32> = x_GLF_color;
+  x_GLF_color = x_96;
+  let x_98 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_99 : f32 = *(b);
+  if ((x_98 >= x_99)) {
+    let x_104 : f32 = x_7.x_GLF_uniform_float_values[0];
+    return x_104;
+  }
+  let x_106 : f32 = x_7.x_GLF_uniform_float_values[2];
+  return x_106;
+}
+
+fn main_1() {
+  var a : f32;
+  var param : f32;
+  var param_1 : f32;
+  var x_71 : bool;
+  var x_72_phi : bool;
+  let x_44 : f32 = x_7.x_GLF_uniform_float_values[0];
+  param = x_44;
+  let x_45 : f32 = func_f1_(&(param));
+  a = x_45;
+  let x_47 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_49 : f32 = x_7.x_GLF_uniform_float_values[0];
+  param_1 = (x_47 + x_49);
+  let x_51 : f32 = func_f1_(&(param_1));
+  let x_52 : f32 = a;
+  a = (x_52 + x_51);
+  let x_54 : f32 = a;
+  let x_56 : f32 = x_7.x_GLF_uniform_float_values[3];
+  let x_57 : bool = (x_54 == x_56);
+  x_72_phi = x_57;
+  if (x_57) {
+    let x_60 : vec4<f32> = x_GLF_color;
+    let x_62 : f32 = x_7.x_GLF_uniform_float_values[0];
+    let x_64 : f32 = x_7.x_GLF_uniform_float_values[0];
+    let x_66 : f32 = x_7.x_GLF_uniform_float_values[1];
+    let x_68 : f32 = x_7.x_GLF_uniform_float_values[0];
+    x_71 = all((x_60 == vec4<f32>(x_62, x_64, x_66, x_68)));
+    x_72_phi = x_71;
+  }
+  let x_72 : bool = x_72_phi;
+  if (x_72) {
+    let x_15 : i32 = x_12.x_GLF_uniform_int_values[0];
+    let x_16 : i32 = x_12.x_GLF_uniform_int_values[1];
+    let x_17 : i32 = x_12.x_GLF_uniform_int_values[1];
+    let x_18 : i32 = x_12.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_15), f32(x_16), f32(x_17), f32(x_18));
+  } else {
+    let x_19 : i32 = x_12.x_GLF_uniform_int_values[1];
+    let x_86 : f32 = f32(x_19);
+    x_GLF_color = vec4<f32>(x_86, x_86, x_86, x_86);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-increment-color/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-increment-color/0-opt.spvasm
new file mode 100644
index 0000000..296caae
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-increment-color/0-opt.spvasm
@@ -0,0 +1,90 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_4 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+       %buf0 = OpTypeStruct %_arr_float_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_3 = OpConstant %int 3
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+     %uint_0 = OpConstant %uint 0
+%_ptr_Output_float = OpTypePointer Output %float
+      %int_2 = OpConstant %int 2
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+       %main = OpFunction %void None %9
+         %28 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function
+         %29 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %30 = OpLoad %float %29
+               OpStore %a %30
+         %31 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_3
+         %32 = OpLoad %float %31
+         %33 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %34 = OpLoad %float %33
+         %35 = OpFOrdGreaterThan %bool %32 %34
+               OpSelectionMerge %36 None
+               OpBranchConditional %35 %37 %36
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %39 = OpLoad %float %38
+         %40 = OpLoad %float %a
+         %41 = OpFAdd %float %40 %39
+               OpStore %a %41
+         %42 = OpLoad %float %a
+         %43 = OpCompositeConstruct %v4float %42 %42 %42 %42
+               OpStore %_GLF_color %43
+         %44 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_3
+         %45 = OpLoad %float %44
+         %46 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %47 = OpLoad %float %46
+         %48 = OpFOrdGreaterThan %bool %45 %47
+               OpSelectionMerge %49 None
+               OpBranchConditional %48 %50 %49
+         %50 = OpLabel
+         %51 = OpAccessChain %_ptr_Output_float %_GLF_color %uint_0
+         %52 = OpLoad %float %51
+         %53 = OpLoad %float %a
+         %54 = OpFAdd %float %53 %52
+               OpStore %a %54
+         %55 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %56 = OpLoad %float %55
+         %57 = OpCompositeConstruct %v4float %56 %56 %56 %56
+               OpStore %_GLF_color %57
+               OpBranch %49
+         %49 = OpLabel
+               OpBranch %36
+         %36 = OpLabel
+         %58 = OpLoad %float %a
+         %59 = OpCompositeConstruct %v4float %58 %float_0 %float_0 %float_1
+               OpStore %_GLF_color %59
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-increment-color/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-increment-color/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..fdbd6e9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-increment-color/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,44 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float a = 0.0f;
+  const float x_30 = asfloat(x_6[1].x);
+  a = x_30;
+  const float x_32 = asfloat(x_6[3].x);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_34 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  if ((x_32 > x_34)) {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const float x_39 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    a = (a + x_39);
+    const float x_42 = a;
+    x_GLF_color = float4(x_42, x_42, x_42, x_42);
+    const float x_45 = asfloat(x_6[3].x);
+    const float x_47 = asfloat(x_6[1].x);
+    if ((x_45 > x_47)) {
+      const float x_52 = x_GLF_color.x;
+      a = (a + x_52);
+      const float x_56 = asfloat(x_6[2].x);
+      x_GLF_color = float4(x_56, x_56, x_56, x_56);
+    }
+  }
+  x_GLF_color = float4(a, 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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-increment-color/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-increment-color/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..b989bf7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-increment-color/0-opt.spvasm.expected.msl
@@ -0,0 +1,55 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float a = 0.0f;
+  float const x_30 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  a = x_30;
+  float const x_32 = x_6.x_GLF_uniform_float_values.arr[3].el;
+  float const x_34 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_32 > x_34)) {
+    float const x_39 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    float const x_40 = a;
+    a = (x_40 + x_39);
+    float const x_42 = a;
+    *(tint_symbol_4) = float4(x_42, x_42, x_42, x_42);
+    float const x_45 = x_6.x_GLF_uniform_float_values.arr[3].el;
+    float const x_47 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    if ((x_45 > x_47)) {
+      float const x_52 = (*(tint_symbol_4)).x;
+      float const x_53 = a;
+      a = (x_53 + x_52);
+      float const x_56 = x_6.x_GLF_uniform_float_values.arr[2].el;
+      *(tint_symbol_4) = float4(x_56, x_56, x_56, x_56);
+    }
+  }
+  float const x_58 = a;
+  *(tint_symbol_4) = float4(x_58, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-increment-color/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-increment-color/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..57160b2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-increment-color/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,122 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 75
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_4 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+       %buf0 = OpTypeStruct %_arr_float_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %11 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %11
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %11
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %20 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+        %int = OpTypeInt 32 1
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_3 = OpConstant %int 3
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+%_ptr_Private_float = OpTypePointer Private %float
+      %int_2 = OpConstant %int 2
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+         %63 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function %20
+         %25 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %26 = OpLoad %float %25
+               OpStore %a %26
+         %28 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+         %29 = OpLoad %float %28
+         %31 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %32 = OpLoad %float %31
+         %33 = OpFOrdGreaterThan %bool %29 %32
+               OpSelectionMerge %35 None
+               OpBranchConditional %33 %36 %35
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %38 = OpLoad %float %37
+         %39 = OpLoad %float %a
+         %40 = OpFAdd %float %39 %38
+               OpStore %a %40
+         %41 = OpLoad %float %a
+         %42 = OpCompositeConstruct %v4float %41 %41 %41 %41
+               OpStore %x_GLF_color %42
+         %43 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+         %44 = OpLoad %float %43
+         %45 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %46 = OpLoad %float %45
+         %47 = OpFOrdGreaterThan %bool %44 %46
+               OpSelectionMerge %48 None
+               OpBranchConditional %47 %49 %48
+         %49 = OpLabel
+         %51 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_0
+         %52 = OpLoad %float %51
+         %53 = OpLoad %float %a
+         %54 = OpFAdd %float %53 %52
+               OpStore %a %54
+         %56 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %57 = OpLoad %float %56
+         %58 = OpCompositeConstruct %v4float %57 %57 %57 %57
+               OpStore %x_GLF_color %58
+               OpBranch %48
+         %48 = OpLabel
+               OpBranch %35
+         %35 = OpLabel
+         %59 = OpLoad %float %a
+         %62 = OpCompositeConstruct %v4float %59 %float_0 %float_0 %float_1
+               OpStore %x_GLF_color %62
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %63
+%tint_symbol = OpFunctionParameter %main_out
+         %67 = OpLabel
+         %68 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %68
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %70 = OpLabel
+         %71 = OpFunctionCall %void %main_1
+         %73 = OpLoad %v4float %x_GLF_color
+         %74 = OpCompositeConstruct %main_out %73
+         %72 = OpFunctionCall %void %tint_symbol_2 %74
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-increment-color/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-increment-color/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..3598a77
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-increment-color/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,48 @@
+type Arr = [[stride(16)]] array<f32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : f32;
+  let x_30 : f32 = x_6.x_GLF_uniform_float_values[1];
+  a = x_30;
+  let x_32 : f32 = x_6.x_GLF_uniform_float_values[3];
+  let x_34 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if ((x_32 > x_34)) {
+    let x_39 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_40 : f32 = a;
+    a = (x_40 + x_39);
+    let x_42 : f32 = a;
+    x_GLF_color = vec4<f32>(x_42, x_42, x_42, x_42);
+    let x_45 : f32 = x_6.x_GLF_uniform_float_values[3];
+    let x_47 : f32 = x_6.x_GLF_uniform_float_values[1];
+    if ((x_45 > x_47)) {
+      let x_52 : f32 = x_GLF_color.x;
+      let x_53 : f32 = a;
+      a = (x_53 + x_52);
+      let x_56 : f32 = x_6.x_GLF_uniform_float_values[2];
+      x_GLF_color = vec4<f32>(x_56, x_56, x_56, x_56);
+    }
+  }
+  let x_58 : f32 = a;
+  x_GLF_color = vec4<f32>(x_58, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-increment-color/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-increment-color/0-opt.wgsl
new file mode 100644
index 0000000..3598a77
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-increment-color/0-opt.wgsl
@@ -0,0 +1,48 @@
+type Arr = [[stride(16)]] array<f32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : f32;
+  let x_30 : f32 = x_6.x_GLF_uniform_float_values[1];
+  a = x_30;
+  let x_32 : f32 = x_6.x_GLF_uniform_float_values[3];
+  let x_34 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if ((x_32 > x_34)) {
+    let x_39 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_40 : f32 = a;
+    a = (x_40 + x_39);
+    let x_42 : f32 = a;
+    x_GLF_color = vec4<f32>(x_42, x_42, x_42, x_42);
+    let x_45 : f32 = x_6.x_GLF_uniform_float_values[3];
+    let x_47 : f32 = x_6.x_GLF_uniform_float_values[1];
+    if ((x_45 > x_47)) {
+      let x_52 : f32 = x_GLF_color.x;
+      let x_53 : f32 = a;
+      a = (x_53 + x_52);
+      let x_56 : f32 = x_6.x_GLF_uniform_float_values[2];
+      x_GLF_color = vec4<f32>(x_56, x_56, x_56, x_56);
+    }
+  }
+  let x_58 : f32 = a;
+  x_GLF_color = vec4<f32>(x_58, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-increment-color/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-increment-color/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..fdbd6e9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-increment-color/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,44 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float a = 0.0f;
+  const float x_30 = asfloat(x_6[1].x);
+  a = x_30;
+  const float x_32 = asfloat(x_6[3].x);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_34 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  if ((x_32 > x_34)) {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const float x_39 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    a = (a + x_39);
+    const float x_42 = a;
+    x_GLF_color = float4(x_42, x_42, x_42, x_42);
+    const float x_45 = asfloat(x_6[3].x);
+    const float x_47 = asfloat(x_6[1].x);
+    if ((x_45 > x_47)) {
+      const float x_52 = x_GLF_color.x;
+      a = (a + x_52);
+      const float x_56 = asfloat(x_6[2].x);
+      x_GLF_color = float4(x_56, x_56, x_56, x_56);
+    }
+  }
+  x_GLF_color = float4(a, 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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-increment-color/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-increment-color/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..b989bf7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-increment-color/0-opt.wgsl.expected.msl
@@ -0,0 +1,55 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float a = 0.0f;
+  float const x_30 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  a = x_30;
+  float const x_32 = x_6.x_GLF_uniform_float_values.arr[3].el;
+  float const x_34 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_32 > x_34)) {
+    float const x_39 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    float const x_40 = a;
+    a = (x_40 + x_39);
+    float const x_42 = a;
+    *(tint_symbol_4) = float4(x_42, x_42, x_42, x_42);
+    float const x_45 = x_6.x_GLF_uniform_float_values.arr[3].el;
+    float const x_47 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    if ((x_45 > x_47)) {
+      float const x_52 = (*(tint_symbol_4)).x;
+      float const x_53 = a;
+      a = (x_53 + x_52);
+      float const x_56 = x_6.x_GLF_uniform_float_values.arr[2].el;
+      *(tint_symbol_4) = float4(x_56, x_56, x_56, x_56);
+    }
+  }
+  float const x_58 = a;
+  *(tint_symbol_4) = float4(x_58, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-increment-color/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-increment-color/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..57160b2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-increment-color/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,122 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 75
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_4 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+       %buf0 = OpTypeStruct %_arr_float_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %11 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %11
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %11
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %20 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+        %int = OpTypeInt 32 1
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_3 = OpConstant %int 3
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+%_ptr_Private_float = OpTypePointer Private %float
+      %int_2 = OpConstant %int 2
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+         %63 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function %20
+         %25 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %26 = OpLoad %float %25
+               OpStore %a %26
+         %28 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+         %29 = OpLoad %float %28
+         %31 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %32 = OpLoad %float %31
+         %33 = OpFOrdGreaterThan %bool %29 %32
+               OpSelectionMerge %35 None
+               OpBranchConditional %33 %36 %35
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %38 = OpLoad %float %37
+         %39 = OpLoad %float %a
+         %40 = OpFAdd %float %39 %38
+               OpStore %a %40
+         %41 = OpLoad %float %a
+         %42 = OpCompositeConstruct %v4float %41 %41 %41 %41
+               OpStore %x_GLF_color %42
+         %43 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+         %44 = OpLoad %float %43
+         %45 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %46 = OpLoad %float %45
+         %47 = OpFOrdGreaterThan %bool %44 %46
+               OpSelectionMerge %48 None
+               OpBranchConditional %47 %49 %48
+         %49 = OpLabel
+         %51 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_0
+         %52 = OpLoad %float %51
+         %53 = OpLoad %float %a
+         %54 = OpFAdd %float %53 %52
+               OpStore %a %54
+         %56 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %57 = OpLoad %float %56
+         %58 = OpCompositeConstruct %v4float %57 %57 %57 %57
+               OpStore %x_GLF_color %58
+               OpBranch %48
+         %48 = OpLabel
+               OpBranch %35
+         %35 = OpLabel
+         %59 = OpLoad %float %a
+         %62 = OpCompositeConstruct %v4float %59 %float_0 %float_0 %float_1
+               OpStore %x_GLF_color %62
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %63
+%tint_symbol = OpFunctionParameter %main_out
+         %67 = OpLabel
+         %68 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %68
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %70 = OpLabel
+         %71 = OpFunctionCall %void %main_1
+         %73 = OpLoad %v4float %x_GLF_color
+         %74 = OpCompositeConstruct %main_out %73
+         %72 = OpFunctionCall %void %tint_symbol_2 %74
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-increment-color/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-increment-color/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..3598a77
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-increment-color/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,48 @@
+type Arr = [[stride(16)]] array<f32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : f32;
+  let x_30 : f32 = x_6.x_GLF_uniform_float_values[1];
+  a = x_30;
+  let x_32 : f32 = x_6.x_GLF_uniform_float_values[3];
+  let x_34 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if ((x_32 > x_34)) {
+    let x_39 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_40 : f32 = a;
+    a = (x_40 + x_39);
+    let x_42 : f32 = a;
+    x_GLF_color = vec4<f32>(x_42, x_42, x_42, x_42);
+    let x_45 : f32 = x_6.x_GLF_uniform_float_values[3];
+    let x_47 : f32 = x_6.x_GLF_uniform_float_values[1];
+    if ((x_45 > x_47)) {
+      let x_52 : f32 = x_GLF_color.x;
+      let x_53 : f32 = a;
+      a = (x_53 + x_52);
+      let x_56 : f32 = x_6.x_GLF_uniform_float_values[2];
+      x_GLF_color = vec4<f32>(x_56, x_56, x_56, x_56);
+    }
+  }
+  let x_58 : f32 = a;
+  x_GLF_color = vec4<f32>(x_58, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-loop-bitfieldreverse/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-loop-bitfieldreverse/0-opt.spvasm
new file mode 100644
index 0000000..8abfc55
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-loop-bitfieldreverse/0-opt.spvasm
@@ -0,0 +1,103 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %10
+         %25 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+         %26 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %27 = OpLoad %int %26
+               OpStore %a %27
+         %28 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %29 = OpLoad %int %28
+         %30 = OpSNegate %int %29
+               OpStore %i %30
+               OpBranch %31
+         %31 = OpLabel
+               OpLoopMerge %32 %33 None
+               OpBranch %34
+         %34 = OpLabel
+         %35 = OpLoad %int %i
+         %36 = OpIAdd %int %35 %int_1
+               OpStore %i %36
+         %37 = OpBitReverse %int %36
+         %38 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %39 = OpLoad %int %38
+         %40 = OpSLessThanEqual %bool %37 %39
+               OpBranchConditional %40 %41 %32
+         %41 = OpLabel
+         %42 = OpLoad %int %a
+         %43 = OpIAdd %int %42 %int_1
+               OpStore %a %43
+               OpBranch %33
+         %33 = OpLabel
+               OpBranch %31
+         %32 = OpLabel
+         %44 = OpLoad %int %a
+         %45 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %46 = OpLoad %int %45
+         %47 = OpIEqual %bool %44 %46
+               OpSelectionMerge %48 None
+               OpBranchConditional %47 %49 %50
+         %49 = OpLabel
+         %51 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %52 = OpLoad %int %51
+         %53 = OpConvertSToF %float %52
+         %54 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %55 = OpLoad %int %54
+         %56 = OpConvertSToF %float %55
+         %57 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %58 = OpLoad %int %57
+         %59 = OpConvertSToF %float %58
+         %60 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %61 = OpLoad %int %60
+         %62 = OpConvertSToF %float %61
+         %63 = OpCompositeConstruct %v4float %53 %56 %59 %62
+               OpStore %_GLF_color %63
+               OpBranch %48
+         %50 = OpLabel
+         %64 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %65 = OpLoad %int %64
+         %66 = OpConvertSToF %float %65
+         %67 = OpCompositeConstruct %v4float %66 %66 %66 %66
+               OpStore %_GLF_color %67
+               OpBranch %48
+         %48 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-loop-bitfieldreverse/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-loop-bitfieldreverse/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..eacc3f8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-loop-bitfieldreverse/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,52 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  int i = 0;
+  const int x_27 = asint(x_6[1].x);
+  a = x_27;
+  const int x_29 = asint(x_6[3].x);
+  i = -(x_29);
+  while (true) {
+    const int x_36 = (i + 1);
+    i = x_36;
+    const int x_39 = asint(x_6[2].x);
+    if ((reversebits(x_36) <= x_39)) {
+    } else {
+      break;
+    }
+    a = (a + 1);
+  }
+  const int x_44 = a;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_46 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  if ((x_44 == x_46)) {
+    const int x_52 = asint(x_6[2].x);
+    const int x_55 = asint(x_6[1].x);
+    const int x_58 = asint(x_6[1].x);
+    const int x_61 = asint(x_6[2].x);
+    x_GLF_color = float4(float(x_52), float(x_55), float(x_58), float(x_61));
+  } else {
+    const int x_65 = asint(x_6[1].x);
+    const float x_66 = float(x_65);
+    x_GLF_color = float4(x_66, x_66, x_66, x_66);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-loop-bitfieldreverse/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-loop-bitfieldreverse/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..f8f6e26
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-loop-bitfieldreverse/0-opt.spvasm.expected.msl
@@ -0,0 +1,63 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int i = 0;
+  int const x_27 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  a = x_27;
+  int const x_29 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  i = -(x_29);
+  while (true) {
+    int const x_35 = i;
+    int const x_36 = (x_35 + 1);
+    i = x_36;
+    int const x_39 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    if ((reverse_bits(x_36) <= x_39)) {
+    } else {
+      break;
+    }
+    int const x_42 = a;
+    a = (x_42 + 1);
+  }
+  int const x_44 = a;
+  int const x_46 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  if ((x_44 == x_46)) {
+    int const x_52 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_55 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_58 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_61 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    *(tint_symbol_4) = float4(float(x_52), float(x_55), float(x_58), float(x_61));
+  } else {
+    int const x_65 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    float const x_66 = float(x_65);
+    *(tint_symbol_4) = float4(x_66, x_66, x_66, x_66);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-loop-bitfieldreverse/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-loop-bitfieldreverse/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..9d357a5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-loop-bitfieldreverse/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,141 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 86
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+      %int_0 = OpConstant %int 0
+   %main_out = OpTypeStruct %v4float
+         %74 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+          %i = OpVariable %_ptr_Function_int Function %21
+         %26 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %27 = OpLoad %int %26
+               OpStore %a %27
+         %29 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %30 = OpLoad %int %29
+         %31 = OpSNegate %int %30
+               OpStore %i %31
+               OpBranch %32
+         %32 = OpLabel
+               OpLoopMerge %33 %34 None
+               OpBranch %35
+         %35 = OpLabel
+         %36 = OpLoad %int %i
+         %37 = OpIAdd %int %36 %int_1
+               OpStore %i %37
+         %39 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %40 = OpLoad %int %39
+         %41 = OpBitReverse %int %37
+         %42 = OpSLessThanEqual %bool %41 %40
+               OpSelectionMerge %44 None
+               OpBranchConditional %42 %45 %46
+         %45 = OpLabel
+               OpBranch %44
+         %46 = OpLabel
+               OpBranch %33
+         %44 = OpLabel
+         %47 = OpLoad %int %a
+         %48 = OpIAdd %int %47 %int_1
+               OpStore %a %48
+               OpBranch %34
+         %34 = OpLabel
+               OpBranch %32
+         %33 = OpLabel
+         %49 = OpLoad %int %a
+         %51 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %52 = OpLoad %int %51
+         %53 = OpIEqual %bool %49 %52
+               OpSelectionMerge %54 None
+               OpBranchConditional %53 %55 %56
+         %55 = OpLabel
+         %57 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %58 = OpLoad %int %57
+         %59 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %60 = OpLoad %int %59
+         %61 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %62 = OpLoad %int %61
+         %63 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %64 = OpLoad %int %63
+         %65 = OpConvertSToF %float %58
+         %66 = OpConvertSToF %float %60
+         %67 = OpConvertSToF %float %62
+         %68 = OpConvertSToF %float %64
+         %69 = OpCompositeConstruct %v4float %65 %66 %67 %68
+               OpStore %x_GLF_color %69
+               OpBranch %54
+         %56 = OpLabel
+         %70 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %71 = OpLoad %int %70
+         %72 = OpConvertSToF %float %71
+         %73 = OpCompositeConstruct %v4float %72 %72 %72 %72
+               OpStore %x_GLF_color %73
+               OpBranch %54
+         %54 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %74
+%tint_symbol = OpFunctionParameter %main_out
+         %78 = OpLabel
+         %79 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %79
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %81 = OpLabel
+         %82 = OpFunctionCall %void %main_1
+         %84 = OpLoad %v4float %x_GLF_color
+         %85 = OpCompositeConstruct %main_out %84
+         %83 = OpFunctionCall %void %tint_symbol_2 %85
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-loop-bitfieldreverse/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-loop-bitfieldreverse/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..e594013
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-loop-bitfieldreverse/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,56 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  let x_27 : i32 = x_6.x_GLF_uniform_int_values[1];
+  a = x_27;
+  let x_29 : i32 = x_6.x_GLF_uniform_int_values[3];
+  i = -(x_29);
+  loop {
+    let x_35 : i32 = i;
+    let x_36 : i32 = (x_35 + 1);
+    i = x_36;
+    let x_39 : i32 = x_6.x_GLF_uniform_int_values[2];
+    if ((reverseBits(x_36) <= x_39)) {
+    } else {
+      break;
+    }
+    let x_42 : i32 = a;
+    a = (x_42 + 1);
+  }
+  let x_44 : i32 = a;
+  let x_46 : i32 = x_6.x_GLF_uniform_int_values[0];
+  if ((x_44 == x_46)) {
+    let x_52 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_55 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_58 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_61 : i32 = x_6.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_52), f32(x_55), f32(x_58), f32(x_61));
+  } else {
+    let x_65 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_66 : f32 = f32(x_65);
+    x_GLF_color = vec4<f32>(x_66, x_66, x_66, x_66);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-loop-bitfieldreverse/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-loop-bitfieldreverse/0-opt.wgsl
new file mode 100644
index 0000000..e594013
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-loop-bitfieldreverse/0-opt.wgsl
@@ -0,0 +1,56 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  let x_27 : i32 = x_6.x_GLF_uniform_int_values[1];
+  a = x_27;
+  let x_29 : i32 = x_6.x_GLF_uniform_int_values[3];
+  i = -(x_29);
+  loop {
+    let x_35 : i32 = i;
+    let x_36 : i32 = (x_35 + 1);
+    i = x_36;
+    let x_39 : i32 = x_6.x_GLF_uniform_int_values[2];
+    if ((reverseBits(x_36) <= x_39)) {
+    } else {
+      break;
+    }
+    let x_42 : i32 = a;
+    a = (x_42 + 1);
+  }
+  let x_44 : i32 = a;
+  let x_46 : i32 = x_6.x_GLF_uniform_int_values[0];
+  if ((x_44 == x_46)) {
+    let x_52 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_55 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_58 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_61 : i32 = x_6.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_52), f32(x_55), f32(x_58), f32(x_61));
+  } else {
+    let x_65 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_66 : f32 = f32(x_65);
+    x_GLF_color = vec4<f32>(x_66, x_66, x_66, x_66);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-loop-bitfieldreverse/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-loop-bitfieldreverse/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..eacc3f8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-loop-bitfieldreverse/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,52 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  int i = 0;
+  const int x_27 = asint(x_6[1].x);
+  a = x_27;
+  const int x_29 = asint(x_6[3].x);
+  i = -(x_29);
+  while (true) {
+    const int x_36 = (i + 1);
+    i = x_36;
+    const int x_39 = asint(x_6[2].x);
+    if ((reversebits(x_36) <= x_39)) {
+    } else {
+      break;
+    }
+    a = (a + 1);
+  }
+  const int x_44 = a;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_46 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  if ((x_44 == x_46)) {
+    const int x_52 = asint(x_6[2].x);
+    const int x_55 = asint(x_6[1].x);
+    const int x_58 = asint(x_6[1].x);
+    const int x_61 = asint(x_6[2].x);
+    x_GLF_color = float4(float(x_52), float(x_55), float(x_58), float(x_61));
+  } else {
+    const int x_65 = asint(x_6[1].x);
+    const float x_66 = float(x_65);
+    x_GLF_color = float4(x_66, x_66, x_66, x_66);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-loop-bitfieldreverse/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-loop-bitfieldreverse/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..f8f6e26
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-loop-bitfieldreverse/0-opt.wgsl.expected.msl
@@ -0,0 +1,63 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int i = 0;
+  int const x_27 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  a = x_27;
+  int const x_29 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  i = -(x_29);
+  while (true) {
+    int const x_35 = i;
+    int const x_36 = (x_35 + 1);
+    i = x_36;
+    int const x_39 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    if ((reverse_bits(x_36) <= x_39)) {
+    } else {
+      break;
+    }
+    int const x_42 = a;
+    a = (x_42 + 1);
+  }
+  int const x_44 = a;
+  int const x_46 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  if ((x_44 == x_46)) {
+    int const x_52 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_55 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_58 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_61 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    *(tint_symbol_4) = float4(float(x_52), float(x_55), float(x_58), float(x_61));
+  } else {
+    int const x_65 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    float const x_66 = float(x_65);
+    *(tint_symbol_4) = float4(x_66, x_66, x_66, x_66);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-loop-bitfieldreverse/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-loop-bitfieldreverse/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..9d357a5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-loop-bitfieldreverse/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,141 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 86
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+      %int_0 = OpConstant %int 0
+   %main_out = OpTypeStruct %v4float
+         %74 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+          %i = OpVariable %_ptr_Function_int Function %21
+         %26 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %27 = OpLoad %int %26
+               OpStore %a %27
+         %29 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %30 = OpLoad %int %29
+         %31 = OpSNegate %int %30
+               OpStore %i %31
+               OpBranch %32
+         %32 = OpLabel
+               OpLoopMerge %33 %34 None
+               OpBranch %35
+         %35 = OpLabel
+         %36 = OpLoad %int %i
+         %37 = OpIAdd %int %36 %int_1
+               OpStore %i %37
+         %39 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %40 = OpLoad %int %39
+         %41 = OpBitReverse %int %37
+         %42 = OpSLessThanEqual %bool %41 %40
+               OpSelectionMerge %44 None
+               OpBranchConditional %42 %45 %46
+         %45 = OpLabel
+               OpBranch %44
+         %46 = OpLabel
+               OpBranch %33
+         %44 = OpLabel
+         %47 = OpLoad %int %a
+         %48 = OpIAdd %int %47 %int_1
+               OpStore %a %48
+               OpBranch %34
+         %34 = OpLabel
+               OpBranch %32
+         %33 = OpLabel
+         %49 = OpLoad %int %a
+         %51 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %52 = OpLoad %int %51
+         %53 = OpIEqual %bool %49 %52
+               OpSelectionMerge %54 None
+               OpBranchConditional %53 %55 %56
+         %55 = OpLabel
+         %57 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %58 = OpLoad %int %57
+         %59 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %60 = OpLoad %int %59
+         %61 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %62 = OpLoad %int %61
+         %63 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %64 = OpLoad %int %63
+         %65 = OpConvertSToF %float %58
+         %66 = OpConvertSToF %float %60
+         %67 = OpConvertSToF %float %62
+         %68 = OpConvertSToF %float %64
+         %69 = OpCompositeConstruct %v4float %65 %66 %67 %68
+               OpStore %x_GLF_color %69
+               OpBranch %54
+         %56 = OpLabel
+         %70 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %71 = OpLoad %int %70
+         %72 = OpConvertSToF %float %71
+         %73 = OpCompositeConstruct %v4float %72 %72 %72 %72
+               OpStore %x_GLF_color %73
+               OpBranch %54
+         %54 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %74
+%tint_symbol = OpFunctionParameter %main_out
+         %78 = OpLabel
+         %79 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %79
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %81 = OpLabel
+         %82 = OpFunctionCall %void %main_1
+         %84 = OpLoad %v4float %x_GLF_color
+         %85 = OpCompositeConstruct %main_out %84
+         %83 = OpFunctionCall %void %tint_symbol_2 %85
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-loop-bitfieldreverse/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-loop-bitfieldreverse/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..e594013
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-loop-bitfieldreverse/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,56 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  let x_27 : i32 = x_6.x_GLF_uniform_int_values[1];
+  a = x_27;
+  let x_29 : i32 = x_6.x_GLF_uniform_int_values[3];
+  i = -(x_29);
+  loop {
+    let x_35 : i32 = i;
+    let x_36 : i32 = (x_35 + 1);
+    i = x_36;
+    let x_39 : i32 = x_6.x_GLF_uniform_int_values[2];
+    if ((reverseBits(x_36) <= x_39)) {
+    } else {
+      break;
+    }
+    let x_42 : i32 = a;
+    a = (x_42 + 1);
+  }
+  let x_44 : i32 = a;
+  let x_46 : i32 = x_6.x_GLF_uniform_int_values[0];
+  if ((x_44 == x_46)) {
+    let x_52 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_55 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_58 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_61 : i32 = x_6.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_52), f32(x_55), f32(x_58), f32(x_61));
+  } else {
+    let x_65 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_66 : f32 = f32(x_65);
+    x_GLF_color = vec4<f32>(x_66, x_66, x_66, x_66);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-neg-div-pow2/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-neg-div-pow2/0-opt.spvasm
new file mode 100644
index 0000000..b9e06f2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-neg-div-pow2/0-opt.spvasm
@@ -0,0 +1,106 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %i "i"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "ten"
+               OpName %_ ""
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "minusEight"
+               OpName %__0 ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+       %buf1 = OpTypeStruct %int
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_5 = OpConstant %int 5
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+     %int_n4 = OpConstant %int -4
+      %int_1 = OpConstant %int 1
+      %int_3 = OpConstant %int 3
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %29 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %30 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %12
+         %31 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+          %b = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+               OpStore %a %int_0
+               OpStore %b %int_0
+               OpStore %i %int_0
+               OpBranch %32
+         %32 = OpLabel
+               OpLoopMerge %33 %34 None
+               OpBranch %35
+         %35 = OpLabel
+         %36 = OpLoad %int %i
+         %37 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %38 = OpLoad %int %37
+         %39 = OpSLessThan %bool %36 %38
+               OpBranchConditional %39 %40 %33
+         %40 = OpLabel
+         %41 = OpLoad %int %a
+         %42 = OpSGreaterThan %bool %41 %int_5
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %43
+         %44 = OpLabel
+               OpBranch %33
+         %43 = OpLabel
+         %45 = OpAccessChain %_ptr_Uniform_int %__0 %int_0
+         %46 = OpLoad %int %45
+         %47 = OpSDiv %int %46 %int_n4
+         %48 = OpLoad %int %a
+         %49 = OpIAdd %int %48 %47
+               OpStore %a %49
+         %50 = OpLoad %int %b
+         %51 = OpIAdd %int %50 %int_1
+               OpStore %b %51
+               OpBranch %34
+         %34 = OpLabel
+         %52 = OpLoad %int %i
+         %53 = OpIAdd %int %52 %int_1
+               OpStore %i %53
+               OpBranch %32
+         %33 = OpLabel
+         %54 = OpLoad %int %b
+         %55 = OpIEqual %bool %54 %int_3
+               OpSelectionMerge %56 None
+               OpBranchConditional %55 %57 %58
+         %57 = OpLabel
+               OpStore %_GLF_color %29
+               OpBranch %56
+         %58 = OpLabel
+               OpStore %_GLF_color %30
+               OpBranch %56
+         %56 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-neg-div-pow2/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-neg-div-pow2/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..7c9249e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-neg-div-pow2/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,53 @@
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[1];
+};
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  int b = 0;
+  int i = 0;
+  a = 0;
+  b = 0;
+  i = 0;
+  while (true) {
+    const int x_36 = i;
+    const int x_38 = asint(x_8[0].x);
+    if ((x_36 < x_38)) {
+    } else {
+      break;
+    }
+    if ((a > 5)) {
+      break;
+    }
+    const int x_46 = asint(x_10[0].x);
+    a = (a + (x_46 / -4));
+    b = (b + 1);
+    {
+      i = (i + 1);
+    }
+  }
+  if ((b == 3)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-neg-div-pow2/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-neg-div-pow2/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..673c478
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-neg-div-pow2/0-opt.spvasm.expected.msl
@@ -0,0 +1,61 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf1 {
+  /* 0x0000 */ int ten;
+};
+struct buf0 {
+  /* 0x0000 */ int minusEight;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_8, constant buf0& x_10, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int b = 0;
+  int i = 0;
+  a = 0;
+  b = 0;
+  i = 0;
+  while (true) {
+    int const x_36 = i;
+    int const x_38 = x_8.ten;
+    if ((x_36 < x_38)) {
+    } else {
+      break;
+    }
+    int const x_41 = a;
+    if ((x_41 > 5)) {
+      break;
+    }
+    int const x_46 = x_10.minusEight;
+    int const x_48 = a;
+    a = (x_48 + (x_46 / -4));
+    int const x_50 = b;
+    b = (x_50 + 1);
+    {
+      int const x_52 = i;
+      i = (x_52 + 1);
+    }
+  }
+  int const x_54 = b;
+  if ((x_54 == 3)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_8 [[buffer(1)]], constant buf0& x_10 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_8, x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-neg-div-pow2/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-neg-div-pow2/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..b50c135
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-neg-div-pow2/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,146 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 78
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "ten"
+               OpName %x_8 "x_8"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "minusEight"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf1 = OpTypeStruct %int
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_5 = OpConstant %int 5
+     %int_n4 = OpConstant %int -4
+      %int_1 = OpConstant %int 1
+      %int_3 = OpConstant %int 3
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %64 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %65 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %66 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+          %b = OpVariable %_ptr_Function_int Function %21
+          %i = OpVariable %_ptr_Function_int Function %21
+               OpStore %a %int_0
+               OpStore %b %int_0
+               OpStore %i %int_0
+               OpBranch %25
+         %25 = OpLabel
+               OpLoopMerge %26 %27 None
+               OpBranch %28
+         %28 = OpLabel
+         %29 = OpLoad %int %i
+         %33 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0
+         %34 = OpLoad %int %33
+         %35 = OpSLessThan %bool %29 %34
+               OpSelectionMerge %37 None
+               OpBranchConditional %35 %38 %39
+         %38 = OpLabel
+               OpBranch %37
+         %39 = OpLabel
+               OpBranch %26
+         %37 = OpLabel
+         %40 = OpLoad %int %a
+         %42 = OpSGreaterThan %bool %40 %int_5
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %43
+         %44 = OpLabel
+               OpBranch %26
+         %43 = OpLabel
+         %45 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0
+         %46 = OpLoad %int %45
+         %47 = OpLoad %int %a
+         %49 = OpSDiv %int %46 %int_n4
+         %50 = OpIAdd %int %47 %49
+               OpStore %a %50
+         %51 = OpLoad %int %b
+         %53 = OpIAdd %int %51 %int_1
+               OpStore %b %53
+               OpBranch %27
+         %27 = OpLabel
+         %54 = OpLoad %int %i
+         %55 = OpIAdd %int %54 %int_1
+               OpStore %i %55
+               OpBranch %25
+         %26 = OpLabel
+         %56 = OpLoad %int %b
+         %58 = OpIEqual %bool %56 %int_3
+               OpSelectionMerge %59 None
+               OpBranchConditional %58 %60 %61
+         %60 = OpLabel
+               OpStore %x_GLF_color %64
+               OpBranch %59
+         %61 = OpLabel
+               OpStore %x_GLF_color %65
+               OpBranch %59
+         %59 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %66
+%tint_symbol = OpFunctionParameter %main_out
+         %70 = OpLabel
+         %71 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %71
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %73 = OpLabel
+         %74 = OpFunctionCall %void %main_1
+         %76 = OpLoad %v4float %x_GLF_color
+         %77 = OpCompositeConstruct %main_out %76
+         %75 = OpFunctionCall %void %tint_symbol_2 %77
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-neg-div-pow2/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-neg-div-pow2/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..7a99cd9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-neg-div-pow2/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,64 @@
+[[block]]
+struct buf1 {
+  ten : i32;
+};
+
+[[block]]
+struct buf0 {
+  minusEight : i32;
+};
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var b : i32;
+  var i : i32;
+  a = 0;
+  b = 0;
+  i = 0;
+  loop {
+    let x_36 : i32 = i;
+    let x_38 : i32 = x_8.ten;
+    if ((x_36 < x_38)) {
+    } else {
+      break;
+    }
+    let x_41 : i32 = a;
+    if ((x_41 > 5)) {
+      break;
+    }
+    let x_46 : i32 = x_10.minusEight;
+    let x_48 : i32 = a;
+    a = (x_48 + (x_46 / -4));
+    let x_50 : i32 = b;
+    b = (x_50 + 1);
+
+    continuing {
+      let x_52 : i32 = i;
+      i = (x_52 + 1);
+    }
+  }
+  let x_54 : i32 = b;
+  if ((x_54 == 3)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-neg-div-pow2/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-neg-div-pow2/0-opt.wgsl
new file mode 100644
index 0000000..7a99cd9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-neg-div-pow2/0-opt.wgsl
@@ -0,0 +1,64 @@
+[[block]]
+struct buf1 {
+  ten : i32;
+};
+
+[[block]]
+struct buf0 {
+  minusEight : i32;
+};
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var b : i32;
+  var i : i32;
+  a = 0;
+  b = 0;
+  i = 0;
+  loop {
+    let x_36 : i32 = i;
+    let x_38 : i32 = x_8.ten;
+    if ((x_36 < x_38)) {
+    } else {
+      break;
+    }
+    let x_41 : i32 = a;
+    if ((x_41 > 5)) {
+      break;
+    }
+    let x_46 : i32 = x_10.minusEight;
+    let x_48 : i32 = a;
+    a = (x_48 + (x_46 / -4));
+    let x_50 : i32 = b;
+    b = (x_50 + 1);
+
+    continuing {
+      let x_52 : i32 = i;
+      i = (x_52 + 1);
+    }
+  }
+  let x_54 : i32 = b;
+  if ((x_54 == 3)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-neg-div-pow2/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-neg-div-pow2/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..7c9249e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-neg-div-pow2/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,53 @@
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[1];
+};
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  int b = 0;
+  int i = 0;
+  a = 0;
+  b = 0;
+  i = 0;
+  while (true) {
+    const int x_36 = i;
+    const int x_38 = asint(x_8[0].x);
+    if ((x_36 < x_38)) {
+    } else {
+      break;
+    }
+    if ((a > 5)) {
+      break;
+    }
+    const int x_46 = asint(x_10[0].x);
+    a = (a + (x_46 / -4));
+    b = (b + 1);
+    {
+      i = (i + 1);
+    }
+  }
+  if ((b == 3)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-neg-div-pow2/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-neg-div-pow2/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..673c478
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-neg-div-pow2/0-opt.wgsl.expected.msl
@@ -0,0 +1,61 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf1 {
+  /* 0x0000 */ int ten;
+};
+struct buf0 {
+  /* 0x0000 */ int minusEight;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_8, constant buf0& x_10, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int b = 0;
+  int i = 0;
+  a = 0;
+  b = 0;
+  i = 0;
+  while (true) {
+    int const x_36 = i;
+    int const x_38 = x_8.ten;
+    if ((x_36 < x_38)) {
+    } else {
+      break;
+    }
+    int const x_41 = a;
+    if ((x_41 > 5)) {
+      break;
+    }
+    int const x_46 = x_10.minusEight;
+    int const x_48 = a;
+    a = (x_48 + (x_46 / -4));
+    int const x_50 = b;
+    b = (x_50 + 1);
+    {
+      int const x_52 = i;
+      i = (x_52 + 1);
+    }
+  }
+  int const x_54 = b;
+  if ((x_54 == 3)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_8 [[buffer(1)]], constant buf0& x_10 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_8, x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-neg-div-pow2/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-neg-div-pow2/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..b50c135
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-neg-div-pow2/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,146 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 78
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "ten"
+               OpName %x_8 "x_8"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "minusEight"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf1 = OpTypeStruct %int
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_5 = OpConstant %int 5
+     %int_n4 = OpConstant %int -4
+      %int_1 = OpConstant %int 1
+      %int_3 = OpConstant %int 3
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %64 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %65 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %66 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+          %b = OpVariable %_ptr_Function_int Function %21
+          %i = OpVariable %_ptr_Function_int Function %21
+               OpStore %a %int_0
+               OpStore %b %int_0
+               OpStore %i %int_0
+               OpBranch %25
+         %25 = OpLabel
+               OpLoopMerge %26 %27 None
+               OpBranch %28
+         %28 = OpLabel
+         %29 = OpLoad %int %i
+         %33 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0
+         %34 = OpLoad %int %33
+         %35 = OpSLessThan %bool %29 %34
+               OpSelectionMerge %37 None
+               OpBranchConditional %35 %38 %39
+         %38 = OpLabel
+               OpBranch %37
+         %39 = OpLabel
+               OpBranch %26
+         %37 = OpLabel
+         %40 = OpLoad %int %a
+         %42 = OpSGreaterThan %bool %40 %int_5
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %43
+         %44 = OpLabel
+               OpBranch %26
+         %43 = OpLabel
+         %45 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0
+         %46 = OpLoad %int %45
+         %47 = OpLoad %int %a
+         %49 = OpSDiv %int %46 %int_n4
+         %50 = OpIAdd %int %47 %49
+               OpStore %a %50
+         %51 = OpLoad %int %b
+         %53 = OpIAdd %int %51 %int_1
+               OpStore %b %53
+               OpBranch %27
+         %27 = OpLabel
+         %54 = OpLoad %int %i
+         %55 = OpIAdd %int %54 %int_1
+               OpStore %i %55
+               OpBranch %25
+         %26 = OpLabel
+         %56 = OpLoad %int %b
+         %58 = OpIEqual %bool %56 %int_3
+               OpSelectionMerge %59 None
+               OpBranchConditional %58 %60 %61
+         %60 = OpLabel
+               OpStore %x_GLF_color %64
+               OpBranch %59
+         %61 = OpLabel
+               OpStore %x_GLF_color %65
+               OpBranch %59
+         %59 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %66
+%tint_symbol = OpFunctionParameter %main_out
+         %70 = OpLabel
+         %71 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %71
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %73 = OpLabel
+         %74 = OpFunctionCall %void %main_1
+         %76 = OpLoad %v4float %x_GLF_color
+         %77 = OpCompositeConstruct %main_out %76
+         %75 = OpFunctionCall %void %tint_symbol_2 %77
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-neg-div-pow2/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-neg-div-pow2/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..7a99cd9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-neg-div-pow2/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,64 @@
+[[block]]
+struct buf1 {
+  ten : i32;
+};
+
+[[block]]
+struct buf0 {
+  minusEight : i32;
+};
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var b : i32;
+  var i : i32;
+  a = 0;
+  b = 0;
+  i = 0;
+  loop {
+    let x_36 : i32 = i;
+    let x_38 : i32 = x_8.ten;
+    if ((x_36 < x_38)) {
+    } else {
+      break;
+    }
+    let x_41 : i32 = a;
+    if ((x_41 > 5)) {
+      break;
+    }
+    let x_46 : i32 = x_10.minusEight;
+    let x_48 : i32 = a;
+    a = (x_48 + (x_46 / -4));
+    let x_50 : i32 = b;
+    b = (x_50 + 1);
+
+    continuing {
+      let x_52 : i32 = i;
+      i = (x_52 + 1);
+    }
+  }
+  let x_54 : i32 = b;
+  if ((x_54 == 3)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-same-cond-nested/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-same-cond-nested/0-opt.spvasm
new file mode 100644
index 0000000..033c99e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-same-cond-nested/0-opt.spvasm
@@ -0,0 +1,144 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %f "f"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %_ ""
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %i "i"
+               OpName %v "v"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+      %int_3 = OpConstant %int 3
+       %bool = OpTypeBool
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+    %float_1 = OpConstant %float 1
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %30 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+         %31 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+    %float_2 = OpConstant %float 2
+     %uint_2 = OpConstant %uint 2
+    %float_3 = OpConstant %float 3
+     %uint_3 = OpConstant %uint 3
+%_ptr_Output_float = OpTypePointer Output %float
+       %main = OpFunction %void None %13
+         %40 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function
+          %a = OpVariable %_ptr_Function_int Function
+          %b = OpVariable %_ptr_Function_int Function
+          %c = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+          %v = OpVariable %_ptr_Function_v3float Function
+         %41 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %42 = OpLoad %float %41
+               OpStore %f %42
+               OpStore %a %int_1
+               OpStore %b %int_0
+               OpStore %c %int_1
+               OpStore %i %int_0
+               OpBranch %43
+         %43 = OpLabel
+               OpLoopMerge %44 %45 None
+               OpBranch %46
+         %46 = OpLabel
+         %47 = OpLoad %int %i
+         %48 = OpSLessThan %bool %47 %int_3
+               OpBranchConditional %48 %49 %44
+         %49 = OpLabel
+         %50 = OpLoad %int %i
+         %51 = OpLoad %float %f
+         %52 = OpLoad %int %i
+         %53 = OpConvertSToF %float %52
+         %54 = OpFAdd %float %51 %53
+         %55 = OpAccessChain %_ptr_Function_float %v %50
+               OpStore %55 %54
+               OpBranch %45
+         %45 = OpLabel
+         %56 = OpLoad %int %i
+         %57 = OpIAdd %int %56 %int_1
+               OpStore %i %57
+               OpBranch %43
+         %44 = OpLabel
+         %58 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %59 = OpLoad %float %58
+         %60 = OpFOrdEqual %bool %59 %float_1
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %61
+         %62 = OpLabel
+               OpBranch %63
+         %63 = OpLabel
+               OpLoopMerge %64 %65 None
+               OpBranch %66
+         %66 = OpLabel
+               OpStore %_GLF_color %30
+               OpBranch %65
+         %65 = OpLabel
+         %67 = OpLoad %int %c
+         %68 = OpLoad %int %a
+         %69 = OpLoad %int %b
+         %70 = OpBitwiseOr %int %68 %69
+         %71 = OpBitwiseAnd %int %67 %70
+         %72 = OpIEqual %bool %71 %int_0
+               OpBranchConditional %72 %63 %64
+         %64 = OpLabel
+         %73 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %74 = OpLoad %float %73
+         %75 = OpFOrdEqual %bool %74 %float_1
+               OpSelectionMerge %76 None
+               OpBranchConditional %75 %77 %76
+         %77 = OpLabel
+               OpStore %_GLF_color %31
+               OpBranch %76
+         %76 = OpLabel
+               OpBranch %61
+         %61 = OpLabel
+         %78 = OpAccessChain %_ptr_Function_float %v %uint_0
+         %79 = OpLoad %float %78
+         %80 = OpFOrdEqual %bool %79 %float_1
+         %81 = OpSelect %float %80 %float_1 %float_0
+         %82 = OpAccessChain %_ptr_Function_float %v %uint_1
+         %83 = OpLoad %float %82
+         %84 = OpFOrdEqual %bool %83 %float_2
+         %85 = OpSelect %float %84 %float_0 %float_1
+         %86 = OpAccessChain %_ptr_Function_float %v %uint_2
+         %87 = OpLoad %float %86
+         %88 = OpFOrdEqual %bool %87 %float_3
+         %89 = OpSelect %float %88 %float_0 %float_1
+         %90 = OpCompositeConstruct %v3float %81 %85 %89
+         %91 = OpLoad %v4float %_GLF_color
+         %92 = OpVectorShuffle %v4float %91 %90 4 5 6 3
+               OpStore %_GLF_color %92
+         %93 = OpAccessChain %_ptr_Output_float %_GLF_color %uint_3
+               OpStore %93 %float_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-same-cond-nested/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-same-cond-nested/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..173ce9c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-same-cond-nested/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,65 @@
+void set_float3(inout float3 vec, int idx, float val) {
+  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
+}
+
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float f = 0.0f;
+  int a = 0;
+  int b = 0;
+  int c = 0;
+  int i = 0;
+  float3 v = float3(0.0f, 0.0f, 0.0f);
+  const float x_42 = asfloat(x_6[0].x);
+  f = x_42;
+  a = 1;
+  b = 0;
+  c = 1;
+  i = 0;
+  {
+    for(; (i < 3); i = (i + 1)) {
+      set_float3(v, i, (f + float(i)));
+    }
+  }
+  const float x_59 = asfloat(x_6[0].x);
+  if ((x_59 == 1.0f)) {
+    while (true) {
+      x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+      {
+        if (((c & (a | b)) == 0)) {
+        } else {
+          break;
+        }
+      }
+    }
+    const float x_74 = asfloat(x_6[0].x);
+    if ((x_74 == 1.0f)) {
+      x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+    }
+  }
+  const float x_79 = v.x;
+  const float x_83 = v.y;
+  const float x_87 = v.z;
+  const float3 x_90 = float3(((x_79 == 1.0f) ? 1.0f : 0.0f), ((x_83 == 2.0f) ? 0.0f : 1.0f), ((x_87 == 3.0f) ? 0.0f : 1.0f));
+  x_GLF_color = float4(x_90.x, x_90.y, x_90.z, x_GLF_color.w);
+  x_GLF_color.w = 1.0f;
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-same-cond-nested/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-same-cond-nested/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..bab3597
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-same-cond-nested/0-opt.spvasm.expected.msl
@@ -0,0 +1,78 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float f = 0.0f;
+  int a = 0;
+  int b = 0;
+  int c = 0;
+  int i = 0;
+  float3 v = 0.0f;
+  float const x_42 = x_6.one;
+  f = x_42;
+  a = 1;
+  b = 0;
+  c = 1;
+  i = 0;
+  while (true) {
+    int const x_47 = i;
+    if ((x_47 < 3)) {
+    } else {
+      break;
+    }
+    int const x_50 = i;
+    float const x_51 = f;
+    int const x_52 = i;
+    v[x_50] = (x_51 + float(x_52));
+    {
+      int const x_56 = i;
+      i = (x_56 + 1);
+    }
+  }
+  float const x_59 = x_6.one;
+  if ((x_59 == 1.0f)) {
+    while (true) {
+      *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+      {
+        int const x_67 = c;
+        int const x_68 = a;
+        int const x_69 = b;
+        if (((x_67 & (x_68 | x_69)) == 0)) {
+        } else {
+          break;
+        }
+      }
+    }
+    float const x_74 = x_6.one;
+    if ((x_74 == 1.0f)) {
+      *(tint_symbol_4) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+    }
+  }
+  float const x_79 = v.x;
+  float const x_83 = v.y;
+  float const x_87 = v.z;
+  float3 const x_90 = float3(select(0.0f, 1.0f, (x_79 == 1.0f)), select(1.0f, 0.0f, (x_83 == 2.0f)), select(1.0f, 0.0f, (x_87 == 3.0f)));
+  float4 const x_91 = *(tint_symbol_4);
+  *(tint_symbol_4) = float4(x_90.x, x_90.y, x_90.z, x_91.w);
+  (*(tint_symbol_4)).w = 1.0f;
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-same-cond-nested/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-same-cond-nested/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..597775c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-same-cond-nested/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,199 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 120
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %i "i"
+               OpName %v "v"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %17 = OpConstantNull %float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %28 = OpConstantNull %v3float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+      %int_0 = OpConstant %int 0
+      %int_3 = OpConstant %int 3
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %66 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+         %81 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+     %uint_3 = OpConstant %uint 3
+%_ptr_Private_float = OpTypePointer Private %float
+   %main_out = OpTypeStruct %v4float
+        %108 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %17
+          %a = OpVariable %_ptr_Function_int Function %21
+          %b = OpVariable %_ptr_Function_int Function %21
+          %c = OpVariable %_ptr_Function_int Function %21
+          %i = OpVariable %_ptr_Function_int Function %21
+          %v = OpVariable %_ptr_Function_v3float Function %28
+         %32 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0
+         %33 = OpLoad %float %32
+               OpStore %f %33
+               OpStore %a %int_1
+               OpStore %b %int_0
+               OpStore %c %int_1
+               OpStore %i %int_0
+               OpBranch %36
+         %36 = OpLabel
+               OpLoopMerge %37 %38 None
+               OpBranch %39
+         %39 = OpLabel
+         %40 = OpLoad %int %i
+         %42 = OpSLessThan %bool %40 %int_3
+               OpSelectionMerge %44 None
+               OpBranchConditional %42 %45 %46
+         %45 = OpLabel
+               OpBranch %44
+         %46 = OpLabel
+               OpBranch %37
+         %44 = OpLabel
+         %47 = OpLoad %int %i
+         %48 = OpLoad %float %f
+         %49 = OpLoad %int %i
+         %50 = OpAccessChain %_ptr_Function_float %v %47
+         %51 = OpConvertSToF %float %49
+         %52 = OpFAdd %float %48 %51
+               OpStore %50 %52
+               OpBranch %38
+         %38 = OpLabel
+         %53 = OpLoad %int %i
+         %54 = OpIAdd %int %53 %int_1
+               OpStore %i %54
+               OpBranch %36
+         %37 = OpLabel
+         %55 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0
+         %56 = OpLoad %float %55
+         %58 = OpFOrdEqual %bool %56 %float_1
+               OpSelectionMerge %59 None
+               OpBranchConditional %58 %60 %59
+         %60 = OpLabel
+               OpBranch %61
+         %61 = OpLabel
+               OpLoopMerge %62 %63 None
+               OpBranch %64
+         %64 = OpLabel
+               OpStore %x_GLF_color %66
+               OpBranch %63
+         %63 = OpLabel
+         %67 = OpLoad %int %c
+         %68 = OpLoad %int %a
+         %69 = OpLoad %int %b
+         %70 = OpBitwiseOr %int %68 %69
+         %71 = OpBitwiseAnd %int %67 %70
+         %72 = OpIEqual %bool %71 %int_0
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %74 %75
+         %74 = OpLabel
+               OpBranch %73
+         %75 = OpLabel
+               OpBranch %62
+         %73 = OpLabel
+               OpBranch %61
+         %62 = OpLabel
+         %76 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0
+         %77 = OpLoad %float %76
+         %78 = OpFOrdEqual %bool %77 %float_1
+               OpSelectionMerge %79 None
+               OpBranchConditional %78 %80 %79
+         %80 = OpLabel
+               OpStore %x_GLF_color %81
+               OpBranch %79
+         %79 = OpLabel
+               OpBranch %59
+         %59 = OpLabel
+         %82 = OpAccessChain %_ptr_Function_float %v %uint_0
+         %83 = OpLoad %float %82
+         %85 = OpAccessChain %_ptr_Function_float %v %uint_1
+         %86 = OpLoad %float %85
+         %88 = OpAccessChain %_ptr_Function_float %v %uint_2
+         %89 = OpLoad %float %88
+         %91 = OpFOrdEqual %bool %83 %float_1
+         %90 = OpSelect %float %91 %float_1 %float_0
+         %94 = OpFOrdEqual %bool %86 %float_2
+         %92 = OpSelect %float %94 %float_0 %float_1
+         %97 = OpFOrdEqual %bool %89 %float_3
+         %95 = OpSelect %float %97 %float_0 %float_1
+         %98 = OpCompositeConstruct %v3float %90 %92 %95
+         %99 = OpLoad %v4float %x_GLF_color
+        %100 = OpCompositeExtract %float %98 0
+        %101 = OpCompositeExtract %float %98 1
+        %102 = OpCompositeExtract %float %98 2
+        %103 = OpCompositeExtract %float %99 3
+        %104 = OpCompositeConstruct %v4float %100 %101 %102 %103
+               OpStore %x_GLF_color %104
+        %107 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_3
+               OpStore %107 %float_1
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %108
+%tint_symbol = OpFunctionParameter %main_out
+        %112 = OpLabel
+        %113 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %113
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+        %115 = OpLabel
+        %116 = OpFunctionCall %void %main_1
+        %118 = OpLoad %v4float %x_GLF_color
+        %119 = OpCompositeConstruct %main_out %118
+        %117 = OpFunctionCall %void %tint_symbol_2 %119
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 63[%63] is not post dominated by the back-edge block 73[%73]
+  %73 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-same-cond-nested/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-same-cond-nested/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..b06321e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-same-cond-nested/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,78 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  var a : i32;
+  var b : i32;
+  var c : i32;
+  var i : i32;
+  var v : vec3<f32>;
+  let x_42 : f32 = x_6.one;
+  f = x_42;
+  a = 1;
+  b = 0;
+  c = 1;
+  i = 0;
+  loop {
+    let x_47 : i32 = i;
+    if ((x_47 < 3)) {
+    } else {
+      break;
+    }
+    let x_50 : i32 = i;
+    let x_51 : f32 = f;
+    let x_52 : i32 = i;
+    v[x_50] = (x_51 + f32(x_52));
+
+    continuing {
+      let x_56 : i32 = i;
+      i = (x_56 + 1);
+    }
+  }
+  let x_59 : f32 = x_6.one;
+  if ((x_59 == 1.0)) {
+    loop {
+      x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+
+      continuing {
+        let x_67 : i32 = c;
+        let x_68 : i32 = a;
+        let x_69 : i32 = b;
+        if (((x_67 & (x_68 | x_69)) == 0)) {
+        } else {
+          break;
+        }
+      }
+    }
+    let x_74 : f32 = x_6.one;
+    if ((x_74 == 1.0)) {
+      x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+    }
+  }
+  let x_79 : f32 = v.x;
+  let x_83 : f32 = v.y;
+  let x_87 : f32 = v.z;
+  let x_90 : vec3<f32> = vec3<f32>(select(0.0, 1.0, (x_79 == 1.0)), select(1.0, 0.0, (x_83 == 2.0)), select(1.0, 0.0, (x_87 == 3.0)));
+  let x_91 : vec4<f32> = x_GLF_color;
+  x_GLF_color = vec4<f32>(x_90.x, x_90.y, x_90.z, x_91.w);
+  x_GLF_color.w = 1.0;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-same-cond-nested/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-same-cond-nested/0-opt.wgsl
new file mode 100644
index 0000000..b06321e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-same-cond-nested/0-opt.wgsl
@@ -0,0 +1,78 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  var a : i32;
+  var b : i32;
+  var c : i32;
+  var i : i32;
+  var v : vec3<f32>;
+  let x_42 : f32 = x_6.one;
+  f = x_42;
+  a = 1;
+  b = 0;
+  c = 1;
+  i = 0;
+  loop {
+    let x_47 : i32 = i;
+    if ((x_47 < 3)) {
+    } else {
+      break;
+    }
+    let x_50 : i32 = i;
+    let x_51 : f32 = f;
+    let x_52 : i32 = i;
+    v[x_50] = (x_51 + f32(x_52));
+
+    continuing {
+      let x_56 : i32 = i;
+      i = (x_56 + 1);
+    }
+  }
+  let x_59 : f32 = x_6.one;
+  if ((x_59 == 1.0)) {
+    loop {
+      x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+
+      continuing {
+        let x_67 : i32 = c;
+        let x_68 : i32 = a;
+        let x_69 : i32 = b;
+        if (((x_67 & (x_68 | x_69)) == 0)) {
+        } else {
+          break;
+        }
+      }
+    }
+    let x_74 : f32 = x_6.one;
+    if ((x_74 == 1.0)) {
+      x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+    }
+  }
+  let x_79 : f32 = v.x;
+  let x_83 : f32 = v.y;
+  let x_87 : f32 = v.z;
+  let x_90 : vec3<f32> = vec3<f32>(select(0.0, 1.0, (x_79 == 1.0)), select(1.0, 0.0, (x_83 == 2.0)), select(1.0, 0.0, (x_87 == 3.0)));
+  let x_91 : vec4<f32> = x_GLF_color;
+  x_GLF_color = vec4<f32>(x_90.x, x_90.y, x_90.z, x_91.w);
+  x_GLF_color.w = 1.0;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-same-cond-nested/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-same-cond-nested/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..173ce9c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-same-cond-nested/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,65 @@
+void set_float3(inout float3 vec, int idx, float val) {
+  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
+}
+
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float f = 0.0f;
+  int a = 0;
+  int b = 0;
+  int c = 0;
+  int i = 0;
+  float3 v = float3(0.0f, 0.0f, 0.0f);
+  const float x_42 = asfloat(x_6[0].x);
+  f = x_42;
+  a = 1;
+  b = 0;
+  c = 1;
+  i = 0;
+  {
+    for(; (i < 3); i = (i + 1)) {
+      set_float3(v, i, (f + float(i)));
+    }
+  }
+  const float x_59 = asfloat(x_6[0].x);
+  if ((x_59 == 1.0f)) {
+    while (true) {
+      x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+      {
+        if (((c & (a | b)) == 0)) {
+        } else {
+          break;
+        }
+      }
+    }
+    const float x_74 = asfloat(x_6[0].x);
+    if ((x_74 == 1.0f)) {
+      x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+    }
+  }
+  const float x_79 = v.x;
+  const float x_83 = v.y;
+  const float x_87 = v.z;
+  const float3 x_90 = float3(((x_79 == 1.0f) ? 1.0f : 0.0f), ((x_83 == 2.0f) ? 0.0f : 1.0f), ((x_87 == 3.0f) ? 0.0f : 1.0f));
+  x_GLF_color = float4(x_90.x, x_90.y, x_90.z, x_GLF_color.w);
+  x_GLF_color.w = 1.0f;
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-same-cond-nested/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-same-cond-nested/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..bab3597
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-same-cond-nested/0-opt.wgsl.expected.msl
@@ -0,0 +1,78 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float f = 0.0f;
+  int a = 0;
+  int b = 0;
+  int c = 0;
+  int i = 0;
+  float3 v = 0.0f;
+  float const x_42 = x_6.one;
+  f = x_42;
+  a = 1;
+  b = 0;
+  c = 1;
+  i = 0;
+  while (true) {
+    int const x_47 = i;
+    if ((x_47 < 3)) {
+    } else {
+      break;
+    }
+    int const x_50 = i;
+    float const x_51 = f;
+    int const x_52 = i;
+    v[x_50] = (x_51 + float(x_52));
+    {
+      int const x_56 = i;
+      i = (x_56 + 1);
+    }
+  }
+  float const x_59 = x_6.one;
+  if ((x_59 == 1.0f)) {
+    while (true) {
+      *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+      {
+        int const x_67 = c;
+        int const x_68 = a;
+        int const x_69 = b;
+        if (((x_67 & (x_68 | x_69)) == 0)) {
+        } else {
+          break;
+        }
+      }
+    }
+    float const x_74 = x_6.one;
+    if ((x_74 == 1.0f)) {
+      *(tint_symbol_4) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+    }
+  }
+  float const x_79 = v.x;
+  float const x_83 = v.y;
+  float const x_87 = v.z;
+  float3 const x_90 = float3(select(0.0f, 1.0f, (x_79 == 1.0f)), select(1.0f, 0.0f, (x_83 == 2.0f)), select(1.0f, 0.0f, (x_87 == 3.0f)));
+  float4 const x_91 = *(tint_symbol_4);
+  *(tint_symbol_4) = float4(x_90.x, x_90.y, x_90.z, x_91.w);
+  (*(tint_symbol_4)).w = 1.0f;
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-same-cond-nested/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-same-cond-nested/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..597775c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-same-cond-nested/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,199 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 120
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %i "i"
+               OpName %v "v"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %17 = OpConstantNull %float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %28 = OpConstantNull %v3float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+      %int_0 = OpConstant %int 0
+      %int_3 = OpConstant %int 3
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %66 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+         %81 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+     %uint_3 = OpConstant %uint 3
+%_ptr_Private_float = OpTypePointer Private %float
+   %main_out = OpTypeStruct %v4float
+        %108 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %17
+          %a = OpVariable %_ptr_Function_int Function %21
+          %b = OpVariable %_ptr_Function_int Function %21
+          %c = OpVariable %_ptr_Function_int Function %21
+          %i = OpVariable %_ptr_Function_int Function %21
+          %v = OpVariable %_ptr_Function_v3float Function %28
+         %32 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0
+         %33 = OpLoad %float %32
+               OpStore %f %33
+               OpStore %a %int_1
+               OpStore %b %int_0
+               OpStore %c %int_1
+               OpStore %i %int_0
+               OpBranch %36
+         %36 = OpLabel
+               OpLoopMerge %37 %38 None
+               OpBranch %39
+         %39 = OpLabel
+         %40 = OpLoad %int %i
+         %42 = OpSLessThan %bool %40 %int_3
+               OpSelectionMerge %44 None
+               OpBranchConditional %42 %45 %46
+         %45 = OpLabel
+               OpBranch %44
+         %46 = OpLabel
+               OpBranch %37
+         %44 = OpLabel
+         %47 = OpLoad %int %i
+         %48 = OpLoad %float %f
+         %49 = OpLoad %int %i
+         %50 = OpAccessChain %_ptr_Function_float %v %47
+         %51 = OpConvertSToF %float %49
+         %52 = OpFAdd %float %48 %51
+               OpStore %50 %52
+               OpBranch %38
+         %38 = OpLabel
+         %53 = OpLoad %int %i
+         %54 = OpIAdd %int %53 %int_1
+               OpStore %i %54
+               OpBranch %36
+         %37 = OpLabel
+         %55 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0
+         %56 = OpLoad %float %55
+         %58 = OpFOrdEqual %bool %56 %float_1
+               OpSelectionMerge %59 None
+               OpBranchConditional %58 %60 %59
+         %60 = OpLabel
+               OpBranch %61
+         %61 = OpLabel
+               OpLoopMerge %62 %63 None
+               OpBranch %64
+         %64 = OpLabel
+               OpStore %x_GLF_color %66
+               OpBranch %63
+         %63 = OpLabel
+         %67 = OpLoad %int %c
+         %68 = OpLoad %int %a
+         %69 = OpLoad %int %b
+         %70 = OpBitwiseOr %int %68 %69
+         %71 = OpBitwiseAnd %int %67 %70
+         %72 = OpIEqual %bool %71 %int_0
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %74 %75
+         %74 = OpLabel
+               OpBranch %73
+         %75 = OpLabel
+               OpBranch %62
+         %73 = OpLabel
+               OpBranch %61
+         %62 = OpLabel
+         %76 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0
+         %77 = OpLoad %float %76
+         %78 = OpFOrdEqual %bool %77 %float_1
+               OpSelectionMerge %79 None
+               OpBranchConditional %78 %80 %79
+         %80 = OpLabel
+               OpStore %x_GLF_color %81
+               OpBranch %79
+         %79 = OpLabel
+               OpBranch %59
+         %59 = OpLabel
+         %82 = OpAccessChain %_ptr_Function_float %v %uint_0
+         %83 = OpLoad %float %82
+         %85 = OpAccessChain %_ptr_Function_float %v %uint_1
+         %86 = OpLoad %float %85
+         %88 = OpAccessChain %_ptr_Function_float %v %uint_2
+         %89 = OpLoad %float %88
+         %91 = OpFOrdEqual %bool %83 %float_1
+         %90 = OpSelect %float %91 %float_1 %float_0
+         %94 = OpFOrdEqual %bool %86 %float_2
+         %92 = OpSelect %float %94 %float_0 %float_1
+         %97 = OpFOrdEqual %bool %89 %float_3
+         %95 = OpSelect %float %97 %float_0 %float_1
+         %98 = OpCompositeConstruct %v3float %90 %92 %95
+         %99 = OpLoad %v4float %x_GLF_color
+        %100 = OpCompositeExtract %float %98 0
+        %101 = OpCompositeExtract %float %98 1
+        %102 = OpCompositeExtract %float %98 2
+        %103 = OpCompositeExtract %float %99 3
+        %104 = OpCompositeConstruct %v4float %100 %101 %102 %103
+               OpStore %x_GLF_color %104
+        %107 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_3
+               OpStore %107 %float_1
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %108
+%tint_symbol = OpFunctionParameter %main_out
+        %112 = OpLabel
+        %113 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %113
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+        %115 = OpLabel
+        %116 = OpFunctionCall %void %main_1
+        %118 = OpLoad %v4float %x_GLF_color
+        %119 = OpCompositeConstruct %main_out %118
+        %117 = OpFunctionCall %void %tint_symbol_2 %119
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 63[%63] is not post dominated by the back-edge block 73[%73]
+  %73 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-same-cond-nested/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-same-cond-nested/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..b06321e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dag-combiner-same-cond-nested/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,78 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  var a : i32;
+  var b : i32;
+  var c : i32;
+  var i : i32;
+  var v : vec3<f32>;
+  let x_42 : f32 = x_6.one;
+  f = x_42;
+  a = 1;
+  b = 0;
+  c = 1;
+  i = 0;
+  loop {
+    let x_47 : i32 = i;
+    if ((x_47 < 3)) {
+    } else {
+      break;
+    }
+    let x_50 : i32 = i;
+    let x_51 : f32 = f;
+    let x_52 : i32 = i;
+    v[x_50] = (x_51 + f32(x_52));
+
+    continuing {
+      let x_56 : i32 = i;
+      i = (x_56 + 1);
+    }
+  }
+  let x_59 : f32 = x_6.one;
+  if ((x_59 == 1.0)) {
+    loop {
+      x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+
+      continuing {
+        let x_67 : i32 = c;
+        let x_68 : i32 = a;
+        let x_69 : i32 = b;
+        if (((x_67 & (x_68 | x_69)) == 0)) {
+        } else {
+          break;
+        }
+      }
+    }
+    let x_74 : f32 = x_6.one;
+    if ((x_74 == 1.0)) {
+      x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+    }
+  }
+  let x_79 : f32 = v.x;
+  let x_83 : f32 = v.y;
+  let x_87 : f32 = v.z;
+  let x_90 : vec3<f32> = vec3<f32>(select(0.0, 1.0, (x_79 == 1.0)), select(1.0, 0.0, (x_83 == 2.0)), select(1.0, 0.0, (x_87 == 3.0)));
+  let x_91 : vec4<f32> = x_GLF_color;
+  x_GLF_color = vec4<f32>(x_90.x, x_90.y, x_90.z, x_91.w);
+  x_GLF_color.w = 1.0;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dead-branch-func-return-arg/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-dead-branch-func-return-arg/0-opt.spvasm
new file mode 100644
index 0000000..294733e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dead-branch-func-return-arg/0-opt.spvasm
@@ -0,0 +1,214 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %func_f1_ "func(f1;"
+               OpName %x "x"
+               OpName %a "a"
+               OpName %f "f"
+               OpName %i "i"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+         %15 = OpTypeFunction %float %_ptr_Function_float
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+    %float_6 = OpConstant %float 6
+    %float_5 = OpConstant %float 5
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %23 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %24 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+      %false = OpConstantFalse %bool
+%_ptr_Function_bool = OpTypePointer Function %bool
+       %true = OpConstantTrue %bool
+       %main = OpFunction %void None %12
+         %28 = OpLabel
+         %29 = OpVariable %_ptr_Function_bool Function %false
+         %30 = OpVariable %_ptr_Function_float Function
+         %31 = OpVariable %_ptr_Function_float Function
+         %32 = OpVariable %_ptr_Function_float Function
+         %33 = OpVariable %_ptr_Function_bool Function %false
+         %34 = OpVariable %_ptr_Function_float Function
+         %35 = OpVariable %_ptr_Function_float Function
+         %36 = OpVariable %_ptr_Function_float Function
+          %f = OpVariable %_ptr_Function_float Function
+          %i = OpVariable %_ptr_Function_float Function
+      %param = OpVariable %_ptr_Function_float Function
+    %param_0 = OpVariable %_ptr_Function_float Function
+               OpStore %f %float_0
+               OpStore %i %float_0
+               OpBranch %37
+         %37 = OpLabel
+         %38 = OpLoad %float %i
+               OpStore %param %38
+               OpStore %33 %false
+               OpLoopMerge %39 %37 None
+               OpBranch %40
+         %40 = OpLabel
+         %41 = OpLoad %float %param
+               OpStore %35 %41
+               OpLoopMerge %42 %43 None
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %48 = OpLoad %float %35
+         %49 = OpLoad %float %param
+         %50 = OpFOrdEqual %bool %48 %49
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %51
+         %52 = OpLabel
+         %53 = OpLoad %float %35
+               OpStore %33 %true
+               OpStore %34 %53
+               OpBranch %45
+         %51 = OpLabel
+         %54 = OpLoad %float %35
+         %55 = OpFAdd %float %54 %float_1
+               OpStore %35 %55
+               OpBranch %46
+         %46 = OpLabel
+         %56 = OpLoad %float %35
+         %57 = OpLoad %float %param
+         %58 = OpFOrdLessThan %bool %56 %57
+               OpBranchConditional %58 %44 %45
+         %45 = OpLabel
+         %59 = OpLoad %bool %33
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %42 %60
+         %60 = OpLabel
+               OpStore %33 %true
+               OpStore %34 %float_0
+               OpBranch %42
+         %43 = OpLabel
+               OpBranch %40
+         %42 = OpLabel
+         %61 = OpLoad %float %34
+               OpStore %36 %61
+               OpStore %f %61
+               OpStore %param_0 %float_1
+               OpStore %29 %false
+               OpBranch %62
+         %62 = OpLabel
+         %63 = OpLoad %float %param_0
+               OpStore %31 %63
+               OpLoopMerge %64 %65 None
+               OpBranch %66
+         %66 = OpLabel
+               OpLoopMerge %67 %68 None
+               OpBranch %69
+         %69 = OpLabel
+         %70 = OpLoad %float %31
+         %71 = OpLoad %float %param_0
+         %72 = OpFOrdEqual %bool %70 %71
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %74 %73
+         %74 = OpLabel
+         %75 = OpLoad %float %31
+               OpStore %29 %true
+               OpStore %30 %75
+               OpBranch %67
+         %73 = OpLabel
+         %76 = OpLoad %float %31
+         %77 = OpFAdd %float %76 %float_1
+               OpStore %31 %77
+               OpBranch %68
+         %68 = OpLabel
+         %78 = OpLoad %float %31
+         %79 = OpLoad %float %param_0
+         %80 = OpFOrdLessThan %bool %78 %79
+               OpBranchConditional %80 %66 %67
+         %67 = OpLabel
+         %81 = OpLoad %bool %29
+               OpSelectionMerge %82 None
+               OpBranchConditional %81 %64 %82
+         %82 = OpLabel
+               OpStore %29 %true
+               OpStore %30 %float_0
+               OpBranch %64
+         %65 = OpLabel
+               OpBranch %62
+         %64 = OpLabel
+         %83 = OpLoad %float %30
+               OpStore %32 %83
+         %84 = OpLoad %float %i
+         %85 = OpFAdd %float %84 %83
+               OpStore %i %85
+         %86 = OpFOrdLessThan %bool %85 %float_6
+               OpBranchConditional %86 %37 %39
+         %39 = OpLabel
+         %87 = OpLoad %float %f
+         %88 = OpFOrdEqual %bool %87 %float_5
+               OpSelectionMerge %89 None
+               OpBranchConditional %88 %90 %91
+         %90 = OpLabel
+               OpStore %_GLF_color %23
+               OpBranch %89
+         %91 = OpLabel
+               OpStore %_GLF_color %24
+               OpBranch %89
+         %89 = OpLabel
+               OpReturn
+               OpFunctionEnd
+   %func_f1_ = OpFunction %float None %15
+          %x = OpFunctionParameter %_ptr_Function_float
+         %92 = OpLabel
+         %93 = OpVariable %_ptr_Function_bool Function %false
+         %94 = OpVariable %_ptr_Function_float Function
+          %a = OpVariable %_ptr_Function_float Function
+               OpBranch %95
+         %95 = OpLabel
+         %96 = OpLoad %float %x
+               OpStore %a %96
+               OpLoopMerge %97 %98 None
+               OpBranch %99
+         %99 = OpLabel
+               OpLoopMerge %100 %101 None
+               OpBranch %102
+        %102 = OpLabel
+        %103 = OpLoad %float %a
+        %104 = OpLoad %float %x
+        %105 = OpFOrdEqual %bool %103 %104
+               OpSelectionMerge %106 None
+               OpBranchConditional %105 %107 %106
+        %107 = OpLabel
+        %108 = OpLoad %float %a
+               OpStore %93 %true
+               OpStore %94 %108
+               OpBranch %100
+        %106 = OpLabel
+        %109 = OpLoad %float %a
+        %110 = OpFAdd %float %109 %float_1
+               OpStore %a %110
+               OpBranch %101
+        %101 = OpLabel
+        %111 = OpLoad %float %a
+        %112 = OpLoad %float %x
+        %113 = OpFOrdLessThan %bool %111 %112
+               OpBranchConditional %113 %99 %100
+        %100 = OpLabel
+        %114 = OpLoad %bool %93
+               OpSelectionMerge %115 None
+               OpBranchConditional %114 %97 %115
+        %115 = OpLabel
+               OpStore %93 %true
+               OpStore %94 %float_0
+               OpBranch %97
+         %98 = OpLabel
+               OpBranch %95
+         %97 = OpLabel
+        %116 = OpLoad %float %94
+               OpReturnValue %116
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dead-branch-func-return-arg/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-dead-branch-func-return-arg/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..0dbbaa9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dead-branch-func-return-arg/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,139 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  bool x_29 = false;
+  float x_30 = 0.0f;
+  float x_31 = 0.0f;
+  float x_32 = 0.0f;
+  bool x_33 = false;
+  float x_34 = 0.0f;
+  float x_35 = 0.0f;
+  float x_36 = 0.0f;
+  float f = 0.0f;
+  float i = 0.0f;
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  f = 0.0f;
+  i = 0.0f;
+  while (true) {
+    param = i;
+    x_33 = false;
+    while (true) {
+      x_35 = param;
+      while (true) {
+        if ((x_35 == param)) {
+          const float x_53 = x_35;
+          x_33 = true;
+          x_34 = x_53;
+          break;
+        }
+        x_35 = (x_35 + 1.0f);
+        {
+          if ((x_35 < param)) {
+          } else {
+            break;
+          }
+        }
+      }
+      if (x_33) {
+        break;
+      }
+      x_33 = true;
+      x_34 = 0.0f;
+      break;
+    }
+    const float x_61 = x_34;
+    x_36 = x_61;
+    f = x_61;
+    param_1 = 1.0f;
+    x_29 = false;
+    while (true) {
+      x_31 = param_1;
+      while (true) {
+        if ((x_31 == param_1)) {
+          const float x_75 = x_31;
+          x_29 = true;
+          x_30 = x_75;
+          break;
+        }
+        x_31 = (x_31 + 1.0f);
+        {
+          if ((x_31 < param_1)) {
+          } else {
+            break;
+          }
+        }
+      }
+      if (x_29) {
+        break;
+      }
+      x_29 = true;
+      x_30 = 0.0f;
+      break;
+    }
+    const float x_83 = x_30;
+    x_32 = x_83;
+    const float x_85 = (i + x_83);
+    i = x_85;
+    if ((x_85 < 6.0f)) {
+    } else {
+      break;
+    }
+  }
+  if ((f == 5.0f)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
+
+float func_f1_(inout float x) {
+  bool x_93 = false;
+  float x_94 = 0.0f;
+  float a = 0.0f;
+  while (true) {
+    const float x_96 = x;
+    a = x_96;
+    while (true) {
+      const float x_103 = a;
+      const float x_104 = x;
+      if ((x_103 == x_104)) {
+        const float x_108 = a;
+        x_93 = true;
+        x_94 = x_108;
+        break;
+      }
+      a = (a + 1.0f);
+      {
+        const float x_111 = a;
+        const float x_112 = x;
+        if ((x_111 < x_112)) {
+        } else {
+          break;
+        }
+      }
+    }
+    if (x_93) {
+      break;
+    }
+    x_93 = true;
+    x_94 = 0.0f;
+    break;
+  }
+  return x_94;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dead-branch-func-return-arg/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-dead-branch-func-return-arg/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..cf63430
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dead-branch-func-return-arg/0-opt.spvasm.expected.msl
@@ -0,0 +1,162 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  bool x_29 = false;
+  float x_30 = 0.0f;
+  float x_31 = 0.0f;
+  float x_32 = 0.0f;
+  bool x_33 = false;
+  float x_34 = 0.0f;
+  float x_35 = 0.0f;
+  float x_36 = 0.0f;
+  float f = 0.0f;
+  float i = 0.0f;
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  f = 0.0f;
+  i = 0.0f;
+  while (true) {
+    float const x_38 = i;
+    param = x_38;
+    x_33 = false;
+    while (true) {
+      float const x_41 = param;
+      x_35 = x_41;
+      while (true) {
+        float const x_48 = x_35;
+        float const x_49 = param;
+        if ((x_48 == x_49)) {
+          float const x_53 = x_35;
+          x_33 = true;
+          x_34 = x_53;
+          break;
+        }
+        float const x_54 = x_35;
+        x_35 = (x_54 + 1.0f);
+        {
+          float const x_56 = x_35;
+          float const x_57 = param;
+          if ((x_56 < x_57)) {
+          } else {
+            break;
+          }
+        }
+      }
+      bool const x_59 = x_33;
+      if (x_59) {
+        break;
+      }
+      x_33 = true;
+      x_34 = 0.0f;
+      break;
+    }
+    float const x_61 = x_34;
+    x_36 = x_61;
+    f = x_61;
+    param_1 = 1.0f;
+    x_29 = false;
+    while (true) {
+      float const x_63 = param_1;
+      x_31 = x_63;
+      while (true) {
+        float const x_70 = x_31;
+        float const x_71 = param_1;
+        if ((x_70 == x_71)) {
+          float const x_75 = x_31;
+          x_29 = true;
+          x_30 = x_75;
+          break;
+        }
+        float const x_76 = x_31;
+        x_31 = (x_76 + 1.0f);
+        {
+          float const x_78 = x_31;
+          float const x_79 = param_1;
+          if ((x_78 < x_79)) {
+          } else {
+            break;
+          }
+        }
+      }
+      bool const x_81 = x_29;
+      if (x_81) {
+        break;
+      }
+      x_29 = true;
+      x_30 = 0.0f;
+      break;
+    }
+    float const x_83 = x_30;
+    x_32 = x_83;
+    float const x_84 = i;
+    float const x_85 = (x_84 + x_83);
+    i = x_85;
+    if ((x_85 < 6.0f)) {
+    } else {
+      break;
+    }
+  }
+  float const x_87 = f;
+  if ((x_87 == 5.0f)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
+float func_f1_(thread float* const x) {
+  bool x_93 = false;
+  float x_94 = 0.0f;
+  float a = 0.0f;
+  while (true) {
+    float const x_96 = *(x);
+    a = x_96;
+    while (true) {
+      float const x_103 = a;
+      float const x_104 = *(x);
+      if ((x_103 == x_104)) {
+        float const x_108 = a;
+        x_93 = true;
+        x_94 = x_108;
+        break;
+      }
+      float const x_109 = a;
+      a = (x_109 + 1.0f);
+      {
+        float const x_111 = a;
+        float const x_112 = *(x);
+        if ((x_111 < x_112)) {
+        } else {
+          break;
+        }
+      }
+    }
+    bool const x_114 = x_93;
+    if (x_114) {
+      break;
+    }
+    x_93 = true;
+    x_94 = 0.0f;
+    break;
+  }
+  float const x_116 = x_94;
+  return x_116;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dead-branch-func-return-arg/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-dead-branch-func-return-arg/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..278320d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dead-branch-func-return-arg/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,308 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 156
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_29 "x_29"
+               OpName %x_30 "x_30"
+               OpName %x_31 "x_31"
+               OpName %x_32 "x_32"
+               OpName %x_33 "x_33"
+               OpName %x_34 "x_34"
+               OpName %x_35 "x_35"
+               OpName %x_36 "x_36"
+               OpName %f "f"
+               OpName %i "i"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpName %func_f1_ "func_f1_"
+               OpName %x "x"
+               OpName %x_93 "x_93"
+               OpName %x_94 "x_94"
+               OpName %a "a"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %16 = OpConstantNull %bool
+%_ptr_Function_float = OpTypePointer Function %float
+         %19 = OpConstantNull %float
+    %float_0 = OpConstant %float 0
+       %true = OpConstantTrue %bool
+    %float_1 = OpConstant %float 1
+    %float_6 = OpConstant %float 6
+    %float_5 = OpConstant %float 5
+        %105 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %106 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+        %107 = OpTypeFunction %void %main_out
+        %119 = OpTypeFunction %float %_ptr_Function_float
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+       %x_29 = OpVariable %_ptr_Function_bool Function %16
+       %x_30 = OpVariable %_ptr_Function_float Function %19
+       %x_31 = OpVariable %_ptr_Function_float Function %19
+       %x_32 = OpVariable %_ptr_Function_float Function %19
+       %x_33 = OpVariable %_ptr_Function_bool Function %16
+       %x_34 = OpVariable %_ptr_Function_float Function %19
+       %x_35 = OpVariable %_ptr_Function_float Function %19
+       %x_36 = OpVariable %_ptr_Function_float Function %19
+          %f = OpVariable %_ptr_Function_float Function %19
+          %i = OpVariable %_ptr_Function_float Function %19
+      %param = OpVariable %_ptr_Function_float Function %19
+    %param_1 = OpVariable %_ptr_Function_float Function %19
+               OpStore %x_29 %false
+               OpStore %x_33 %false
+               OpStore %f %float_0
+               OpStore %i %float_0
+               OpBranch %31
+         %31 = OpLabel
+               OpLoopMerge %32 %33 None
+               OpBranch %34
+         %34 = OpLabel
+         %35 = OpLoad %float %i
+               OpStore %param %35
+               OpStore %x_33 %false
+               OpBranch %36
+         %36 = OpLabel
+               OpLoopMerge %37 %38 None
+               OpBranch %39
+         %39 = OpLabel
+         %40 = OpLoad %float %param
+               OpStore %x_35 %40
+               OpBranch %41
+         %41 = OpLabel
+               OpLoopMerge %42 %43 None
+               OpBranch %44
+         %44 = OpLabel
+         %45 = OpLoad %float %x_35
+         %46 = OpLoad %float %param
+         %47 = OpFOrdEqual %bool %45 %46
+               OpSelectionMerge %48 None
+               OpBranchConditional %47 %49 %48
+         %49 = OpLabel
+         %50 = OpLoad %float %x_35
+               OpStore %x_33 %true
+               OpStore %x_34 %50
+               OpBranch %42
+         %48 = OpLabel
+         %52 = OpLoad %float %x_35
+         %54 = OpFAdd %float %52 %float_1
+               OpStore %x_35 %54
+               OpBranch %43
+         %43 = OpLabel
+         %55 = OpLoad %float %x_35
+         %56 = OpLoad %float %param
+         %57 = OpFOrdLessThan %bool %55 %56
+               OpSelectionMerge %58 None
+               OpBranchConditional %57 %59 %60
+         %59 = OpLabel
+               OpBranch %58
+         %60 = OpLabel
+               OpBranch %42
+         %58 = OpLabel
+               OpBranch %41
+         %42 = OpLabel
+         %61 = OpLoad %bool %x_33
+               OpSelectionMerge %62 None
+               OpBranchConditional %61 %63 %62
+         %63 = OpLabel
+               OpBranch %37
+         %62 = OpLabel
+               OpStore %x_33 %true
+               OpStore %x_34 %float_0
+               OpBranch %37
+         %38 = OpLabel
+               OpBranch %36
+         %37 = OpLabel
+         %64 = OpLoad %float %x_34
+               OpStore %x_36 %64
+               OpStore %f %64
+               OpStore %param_1 %float_1
+               OpStore %x_29 %false
+               OpBranch %65
+         %65 = OpLabel
+               OpLoopMerge %66 %67 None
+               OpBranch %68
+         %68 = OpLabel
+         %69 = OpLoad %float %param_1
+               OpStore %x_31 %69
+               OpBranch %70
+         %70 = OpLabel
+               OpLoopMerge %71 %72 None
+               OpBranch %73
+         %73 = OpLabel
+         %74 = OpLoad %float %x_31
+         %75 = OpLoad %float %param_1
+         %76 = OpFOrdEqual %bool %74 %75
+               OpSelectionMerge %77 None
+               OpBranchConditional %76 %78 %77
+         %78 = OpLabel
+         %79 = OpLoad %float %x_31
+               OpStore %x_29 %true
+               OpStore %x_30 %79
+               OpBranch %71
+         %77 = OpLabel
+         %80 = OpLoad %float %x_31
+         %81 = OpFAdd %float %80 %float_1
+               OpStore %x_31 %81
+               OpBranch %72
+         %72 = OpLabel
+         %82 = OpLoad %float %x_31
+         %83 = OpLoad %float %param_1
+         %84 = OpFOrdLessThan %bool %82 %83
+               OpSelectionMerge %85 None
+               OpBranchConditional %84 %86 %87
+         %86 = OpLabel
+               OpBranch %85
+         %87 = OpLabel
+               OpBranch %71
+         %85 = OpLabel
+               OpBranch %70
+         %71 = OpLabel
+         %88 = OpLoad %bool %x_29
+               OpSelectionMerge %89 None
+               OpBranchConditional %88 %90 %89
+         %90 = OpLabel
+               OpBranch %66
+         %89 = OpLabel
+               OpStore %x_29 %true
+               OpStore %x_30 %float_0
+               OpBranch %66
+         %67 = OpLabel
+               OpBranch %65
+         %66 = OpLabel
+         %91 = OpLoad %float %x_30
+               OpStore %x_32 %91
+         %92 = OpLoad %float %i
+         %93 = OpFAdd %float %92 %91
+               OpStore %i %93
+         %95 = OpFOrdLessThan %bool %93 %float_6
+               OpSelectionMerge %96 None
+               OpBranchConditional %95 %97 %98
+         %97 = OpLabel
+               OpBranch %96
+         %98 = OpLabel
+               OpBranch %32
+         %96 = OpLabel
+               OpBranch %33
+         %33 = OpLabel
+               OpBranch %31
+         %32 = OpLabel
+         %99 = OpLoad %float %f
+        %101 = OpFOrdEqual %bool %99 %float_5
+               OpSelectionMerge %102 None
+               OpBranchConditional %101 %103 %104
+        %103 = OpLabel
+               OpStore %x_GLF_color %105
+               OpBranch %102
+        %104 = OpLabel
+               OpStore %x_GLF_color %106
+               OpBranch %102
+        %102 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %107
+%tint_symbol = OpFunctionParameter %main_out
+        %111 = OpLabel
+        %112 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %112
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+        %114 = OpLabel
+        %115 = OpFunctionCall %void %main_1
+        %117 = OpLoad %v4float %x_GLF_color
+        %118 = OpCompositeConstruct %main_out %117
+        %116 = OpFunctionCall %void %tint_symbol_2 %118
+               OpReturn
+               OpFunctionEnd
+   %func_f1_ = OpFunction %float None %119
+          %x = OpFunctionParameter %_ptr_Function_float
+        %122 = OpLabel
+       %x_93 = OpVariable %_ptr_Function_bool Function %16
+       %x_94 = OpVariable %_ptr_Function_float Function %19
+          %a = OpVariable %_ptr_Function_float Function %19
+               OpStore %x_93 %false
+               OpBranch %126
+        %126 = OpLabel
+               OpLoopMerge %127 %128 None
+               OpBranch %129
+        %129 = OpLabel
+        %131 = OpLoad %float %x
+               OpStore %a %131
+               OpBranch %132
+        %132 = OpLabel
+               OpLoopMerge %133 %134 None
+               OpBranch %135
+        %135 = OpLabel
+        %136 = OpLoad %float %a
+        %138 = OpLoad %float %x
+        %139 = OpFOrdEqual %bool %136 %138
+               OpSelectionMerge %140 None
+               OpBranchConditional %139 %141 %140
+        %141 = OpLabel
+        %142 = OpLoad %float %a
+               OpStore %x_93 %true
+               OpStore %x_94 %142
+               OpBranch %133
+        %140 = OpLabel
+        %143 = OpLoad %float %a
+        %144 = OpFAdd %float %143 %float_1
+               OpStore %a %144
+               OpBranch %134
+        %134 = OpLabel
+        %145 = OpLoad %float %a
+        %147 = OpLoad %float %x
+        %148 = OpFOrdLessThan %bool %145 %147
+               OpSelectionMerge %149 None
+               OpBranchConditional %148 %150 %151
+        %150 = OpLabel
+               OpBranch %149
+        %151 = OpLabel
+               OpBranch %133
+        %149 = OpLabel
+               OpBranch %132
+        %133 = OpLabel
+        %152 = OpLoad %bool %x_93
+               OpSelectionMerge %153 None
+               OpBranchConditional %152 %154 %153
+        %154 = OpLabel
+               OpBranch %127
+        %153 = OpLabel
+               OpStore %x_93 %true
+               OpStore %x_94 %float_0
+               OpBranch %127
+        %128 = OpLabel
+               OpBranch %126
+        %127 = OpLabel
+        %155 = OpLoad %float %x_94
+               OpReturnValue %155
+               OpFunctionEnd
+1:1: The continue construct with the continue target 43[%43] is not post dominated by the back-edge block 58[%58]
+  %58 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dead-branch-func-return-arg/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-dead-branch-func-return-arg/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..14ef8d3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dead-branch-func-return-arg/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,159 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_29 : bool = false;
+  var x_30 : f32;
+  var x_31 : f32;
+  var x_32 : f32;
+  var x_33 : bool = false;
+  var x_34 : f32;
+  var x_35 : f32;
+  var x_36 : f32;
+  var f : f32;
+  var i : f32;
+  var param : f32;
+  var param_1 : f32;
+  f = 0.0;
+  i = 0.0;
+  loop {
+    let x_38 : f32 = i;
+    param = x_38;
+    x_33 = false;
+    loop {
+      let x_41 : f32 = param;
+      x_35 = x_41;
+      loop {
+        let x_48 : f32 = x_35;
+        let x_49 : f32 = param;
+        if ((x_48 == x_49)) {
+          let x_53 : f32 = x_35;
+          x_33 = true;
+          x_34 = x_53;
+          break;
+        }
+        let x_54 : f32 = x_35;
+        x_35 = (x_54 + 1.0);
+
+        continuing {
+          let x_56 : f32 = x_35;
+          let x_57 : f32 = param;
+          if ((x_56 < x_57)) {
+          } else {
+            break;
+          }
+        }
+      }
+      let x_59 : bool = x_33;
+      if (x_59) {
+        break;
+      }
+      x_33 = true;
+      x_34 = 0.0;
+      break;
+    }
+    let x_61 : f32 = x_34;
+    x_36 = x_61;
+    f = x_61;
+    param_1 = 1.0;
+    x_29 = false;
+    loop {
+      let x_63 : f32 = param_1;
+      x_31 = x_63;
+      loop {
+        let x_70 : f32 = x_31;
+        let x_71 : f32 = param_1;
+        if ((x_70 == x_71)) {
+          let x_75 : f32 = x_31;
+          x_29 = true;
+          x_30 = x_75;
+          break;
+        }
+        let x_76 : f32 = x_31;
+        x_31 = (x_76 + 1.0);
+
+        continuing {
+          let x_78 : f32 = x_31;
+          let x_79 : f32 = param_1;
+          if ((x_78 < x_79)) {
+          } else {
+            break;
+          }
+        }
+      }
+      let x_81 : bool = x_29;
+      if (x_81) {
+        break;
+      }
+      x_29 = true;
+      x_30 = 0.0;
+      break;
+    }
+    let x_83 : f32 = x_30;
+    x_32 = x_83;
+    let x_84 : f32 = i;
+    let x_85 : f32 = (x_84 + x_83);
+    i = x_85;
+    if ((x_85 < 6.0)) {
+    } else {
+      break;
+    }
+  }
+  let x_87 : f32 = f;
+  if ((x_87 == 5.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+fn func_f1_(x : ptr<function, f32>) -> f32 {
+  var x_93 : bool = false;
+  var x_94 : f32;
+  var a : f32;
+  loop {
+    let x_96 : f32 = *(x);
+    a = x_96;
+    loop {
+      let x_103 : f32 = a;
+      let x_104 : f32 = *(x);
+      if ((x_103 == x_104)) {
+        let x_108 : f32 = a;
+        x_93 = true;
+        x_94 = x_108;
+        break;
+      }
+      let x_109 : f32 = a;
+      a = (x_109 + 1.0);
+
+      continuing {
+        let x_111 : f32 = a;
+        let x_112 : f32 = *(x);
+        if ((x_111 < x_112)) {
+        } else {
+          break;
+        }
+      }
+    }
+    let x_114 : bool = x_93;
+    if (x_114) {
+      break;
+    }
+    x_93 = true;
+    x_94 = 0.0;
+    break;
+  }
+  let x_116 : f32 = x_94;
+  return x_116;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dead-branch-func-return-arg/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-dead-branch-func-return-arg/0-opt.wgsl
new file mode 100644
index 0000000..14ef8d3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dead-branch-func-return-arg/0-opt.wgsl
@@ -0,0 +1,159 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_29 : bool = false;
+  var x_30 : f32;
+  var x_31 : f32;
+  var x_32 : f32;
+  var x_33 : bool = false;
+  var x_34 : f32;
+  var x_35 : f32;
+  var x_36 : f32;
+  var f : f32;
+  var i : f32;
+  var param : f32;
+  var param_1 : f32;
+  f = 0.0;
+  i = 0.0;
+  loop {
+    let x_38 : f32 = i;
+    param = x_38;
+    x_33 = false;
+    loop {
+      let x_41 : f32 = param;
+      x_35 = x_41;
+      loop {
+        let x_48 : f32 = x_35;
+        let x_49 : f32 = param;
+        if ((x_48 == x_49)) {
+          let x_53 : f32 = x_35;
+          x_33 = true;
+          x_34 = x_53;
+          break;
+        }
+        let x_54 : f32 = x_35;
+        x_35 = (x_54 + 1.0);
+
+        continuing {
+          let x_56 : f32 = x_35;
+          let x_57 : f32 = param;
+          if ((x_56 < x_57)) {
+          } else {
+            break;
+          }
+        }
+      }
+      let x_59 : bool = x_33;
+      if (x_59) {
+        break;
+      }
+      x_33 = true;
+      x_34 = 0.0;
+      break;
+    }
+    let x_61 : f32 = x_34;
+    x_36 = x_61;
+    f = x_61;
+    param_1 = 1.0;
+    x_29 = false;
+    loop {
+      let x_63 : f32 = param_1;
+      x_31 = x_63;
+      loop {
+        let x_70 : f32 = x_31;
+        let x_71 : f32 = param_1;
+        if ((x_70 == x_71)) {
+          let x_75 : f32 = x_31;
+          x_29 = true;
+          x_30 = x_75;
+          break;
+        }
+        let x_76 : f32 = x_31;
+        x_31 = (x_76 + 1.0);
+
+        continuing {
+          let x_78 : f32 = x_31;
+          let x_79 : f32 = param_1;
+          if ((x_78 < x_79)) {
+          } else {
+            break;
+          }
+        }
+      }
+      let x_81 : bool = x_29;
+      if (x_81) {
+        break;
+      }
+      x_29 = true;
+      x_30 = 0.0;
+      break;
+    }
+    let x_83 : f32 = x_30;
+    x_32 = x_83;
+    let x_84 : f32 = i;
+    let x_85 : f32 = (x_84 + x_83);
+    i = x_85;
+    if ((x_85 < 6.0)) {
+    } else {
+      break;
+    }
+  }
+  let x_87 : f32 = f;
+  if ((x_87 == 5.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+fn func_f1_(x : ptr<function, f32>) -> f32 {
+  var x_93 : bool = false;
+  var x_94 : f32;
+  var a : f32;
+  loop {
+    let x_96 : f32 = *(x);
+    a = x_96;
+    loop {
+      let x_103 : f32 = a;
+      let x_104 : f32 = *(x);
+      if ((x_103 == x_104)) {
+        let x_108 : f32 = a;
+        x_93 = true;
+        x_94 = x_108;
+        break;
+      }
+      let x_109 : f32 = a;
+      a = (x_109 + 1.0);
+
+      continuing {
+        let x_111 : f32 = a;
+        let x_112 : f32 = *(x);
+        if ((x_111 < x_112)) {
+        } else {
+          break;
+        }
+      }
+    }
+    let x_114 : bool = x_93;
+    if (x_114) {
+      break;
+    }
+    x_93 = true;
+    x_94 = 0.0;
+    break;
+  }
+  let x_116 : f32 = x_94;
+  return x_116;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dead-branch-func-return-arg/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-dead-branch-func-return-arg/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..0dbbaa9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dead-branch-func-return-arg/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,139 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  bool x_29 = false;
+  float x_30 = 0.0f;
+  float x_31 = 0.0f;
+  float x_32 = 0.0f;
+  bool x_33 = false;
+  float x_34 = 0.0f;
+  float x_35 = 0.0f;
+  float x_36 = 0.0f;
+  float f = 0.0f;
+  float i = 0.0f;
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  f = 0.0f;
+  i = 0.0f;
+  while (true) {
+    param = i;
+    x_33 = false;
+    while (true) {
+      x_35 = param;
+      while (true) {
+        if ((x_35 == param)) {
+          const float x_53 = x_35;
+          x_33 = true;
+          x_34 = x_53;
+          break;
+        }
+        x_35 = (x_35 + 1.0f);
+        {
+          if ((x_35 < param)) {
+          } else {
+            break;
+          }
+        }
+      }
+      if (x_33) {
+        break;
+      }
+      x_33 = true;
+      x_34 = 0.0f;
+      break;
+    }
+    const float x_61 = x_34;
+    x_36 = x_61;
+    f = x_61;
+    param_1 = 1.0f;
+    x_29 = false;
+    while (true) {
+      x_31 = param_1;
+      while (true) {
+        if ((x_31 == param_1)) {
+          const float x_75 = x_31;
+          x_29 = true;
+          x_30 = x_75;
+          break;
+        }
+        x_31 = (x_31 + 1.0f);
+        {
+          if ((x_31 < param_1)) {
+          } else {
+            break;
+          }
+        }
+      }
+      if (x_29) {
+        break;
+      }
+      x_29 = true;
+      x_30 = 0.0f;
+      break;
+    }
+    const float x_83 = x_30;
+    x_32 = x_83;
+    const float x_85 = (i + x_83);
+    i = x_85;
+    if ((x_85 < 6.0f)) {
+    } else {
+      break;
+    }
+  }
+  if ((f == 5.0f)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
+
+float func_f1_(inout float x) {
+  bool x_93 = false;
+  float x_94 = 0.0f;
+  float a = 0.0f;
+  while (true) {
+    const float x_96 = x;
+    a = x_96;
+    while (true) {
+      const float x_103 = a;
+      const float x_104 = x;
+      if ((x_103 == x_104)) {
+        const float x_108 = a;
+        x_93 = true;
+        x_94 = x_108;
+        break;
+      }
+      a = (a + 1.0f);
+      {
+        const float x_111 = a;
+        const float x_112 = x;
+        if ((x_111 < x_112)) {
+        } else {
+          break;
+        }
+      }
+    }
+    if (x_93) {
+      break;
+    }
+    x_93 = true;
+    x_94 = 0.0f;
+    break;
+  }
+  return x_94;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dead-branch-func-return-arg/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-dead-branch-func-return-arg/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..cf63430
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dead-branch-func-return-arg/0-opt.wgsl.expected.msl
@@ -0,0 +1,162 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  bool x_29 = false;
+  float x_30 = 0.0f;
+  float x_31 = 0.0f;
+  float x_32 = 0.0f;
+  bool x_33 = false;
+  float x_34 = 0.0f;
+  float x_35 = 0.0f;
+  float x_36 = 0.0f;
+  float f = 0.0f;
+  float i = 0.0f;
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  f = 0.0f;
+  i = 0.0f;
+  while (true) {
+    float const x_38 = i;
+    param = x_38;
+    x_33 = false;
+    while (true) {
+      float const x_41 = param;
+      x_35 = x_41;
+      while (true) {
+        float const x_48 = x_35;
+        float const x_49 = param;
+        if ((x_48 == x_49)) {
+          float const x_53 = x_35;
+          x_33 = true;
+          x_34 = x_53;
+          break;
+        }
+        float const x_54 = x_35;
+        x_35 = (x_54 + 1.0f);
+        {
+          float const x_56 = x_35;
+          float const x_57 = param;
+          if ((x_56 < x_57)) {
+          } else {
+            break;
+          }
+        }
+      }
+      bool const x_59 = x_33;
+      if (x_59) {
+        break;
+      }
+      x_33 = true;
+      x_34 = 0.0f;
+      break;
+    }
+    float const x_61 = x_34;
+    x_36 = x_61;
+    f = x_61;
+    param_1 = 1.0f;
+    x_29 = false;
+    while (true) {
+      float const x_63 = param_1;
+      x_31 = x_63;
+      while (true) {
+        float const x_70 = x_31;
+        float const x_71 = param_1;
+        if ((x_70 == x_71)) {
+          float const x_75 = x_31;
+          x_29 = true;
+          x_30 = x_75;
+          break;
+        }
+        float const x_76 = x_31;
+        x_31 = (x_76 + 1.0f);
+        {
+          float const x_78 = x_31;
+          float const x_79 = param_1;
+          if ((x_78 < x_79)) {
+          } else {
+            break;
+          }
+        }
+      }
+      bool const x_81 = x_29;
+      if (x_81) {
+        break;
+      }
+      x_29 = true;
+      x_30 = 0.0f;
+      break;
+    }
+    float const x_83 = x_30;
+    x_32 = x_83;
+    float const x_84 = i;
+    float const x_85 = (x_84 + x_83);
+    i = x_85;
+    if ((x_85 < 6.0f)) {
+    } else {
+      break;
+    }
+  }
+  float const x_87 = f;
+  if ((x_87 == 5.0f)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
+float func_f1_(thread float* const x) {
+  bool x_93 = false;
+  float x_94 = 0.0f;
+  float a = 0.0f;
+  while (true) {
+    float const x_96 = *(x);
+    a = x_96;
+    while (true) {
+      float const x_103 = a;
+      float const x_104 = *(x);
+      if ((x_103 == x_104)) {
+        float const x_108 = a;
+        x_93 = true;
+        x_94 = x_108;
+        break;
+      }
+      float const x_109 = a;
+      a = (x_109 + 1.0f);
+      {
+        float const x_111 = a;
+        float const x_112 = *(x);
+        if ((x_111 < x_112)) {
+        } else {
+          break;
+        }
+      }
+    }
+    bool const x_114 = x_93;
+    if (x_114) {
+      break;
+    }
+    x_93 = true;
+    x_94 = 0.0f;
+    break;
+  }
+  float const x_116 = x_94;
+  return x_116;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dead-branch-func-return-arg/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-dead-branch-func-return-arg/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..278320d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dead-branch-func-return-arg/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,308 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 156
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_29 "x_29"
+               OpName %x_30 "x_30"
+               OpName %x_31 "x_31"
+               OpName %x_32 "x_32"
+               OpName %x_33 "x_33"
+               OpName %x_34 "x_34"
+               OpName %x_35 "x_35"
+               OpName %x_36 "x_36"
+               OpName %f "f"
+               OpName %i "i"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpName %func_f1_ "func_f1_"
+               OpName %x "x"
+               OpName %x_93 "x_93"
+               OpName %x_94 "x_94"
+               OpName %a "a"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %16 = OpConstantNull %bool
+%_ptr_Function_float = OpTypePointer Function %float
+         %19 = OpConstantNull %float
+    %float_0 = OpConstant %float 0
+       %true = OpConstantTrue %bool
+    %float_1 = OpConstant %float 1
+    %float_6 = OpConstant %float 6
+    %float_5 = OpConstant %float 5
+        %105 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %106 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+        %107 = OpTypeFunction %void %main_out
+        %119 = OpTypeFunction %float %_ptr_Function_float
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+       %x_29 = OpVariable %_ptr_Function_bool Function %16
+       %x_30 = OpVariable %_ptr_Function_float Function %19
+       %x_31 = OpVariable %_ptr_Function_float Function %19
+       %x_32 = OpVariable %_ptr_Function_float Function %19
+       %x_33 = OpVariable %_ptr_Function_bool Function %16
+       %x_34 = OpVariable %_ptr_Function_float Function %19
+       %x_35 = OpVariable %_ptr_Function_float Function %19
+       %x_36 = OpVariable %_ptr_Function_float Function %19
+          %f = OpVariable %_ptr_Function_float Function %19
+          %i = OpVariable %_ptr_Function_float Function %19
+      %param = OpVariable %_ptr_Function_float Function %19
+    %param_1 = OpVariable %_ptr_Function_float Function %19
+               OpStore %x_29 %false
+               OpStore %x_33 %false
+               OpStore %f %float_0
+               OpStore %i %float_0
+               OpBranch %31
+         %31 = OpLabel
+               OpLoopMerge %32 %33 None
+               OpBranch %34
+         %34 = OpLabel
+         %35 = OpLoad %float %i
+               OpStore %param %35
+               OpStore %x_33 %false
+               OpBranch %36
+         %36 = OpLabel
+               OpLoopMerge %37 %38 None
+               OpBranch %39
+         %39 = OpLabel
+         %40 = OpLoad %float %param
+               OpStore %x_35 %40
+               OpBranch %41
+         %41 = OpLabel
+               OpLoopMerge %42 %43 None
+               OpBranch %44
+         %44 = OpLabel
+         %45 = OpLoad %float %x_35
+         %46 = OpLoad %float %param
+         %47 = OpFOrdEqual %bool %45 %46
+               OpSelectionMerge %48 None
+               OpBranchConditional %47 %49 %48
+         %49 = OpLabel
+         %50 = OpLoad %float %x_35
+               OpStore %x_33 %true
+               OpStore %x_34 %50
+               OpBranch %42
+         %48 = OpLabel
+         %52 = OpLoad %float %x_35
+         %54 = OpFAdd %float %52 %float_1
+               OpStore %x_35 %54
+               OpBranch %43
+         %43 = OpLabel
+         %55 = OpLoad %float %x_35
+         %56 = OpLoad %float %param
+         %57 = OpFOrdLessThan %bool %55 %56
+               OpSelectionMerge %58 None
+               OpBranchConditional %57 %59 %60
+         %59 = OpLabel
+               OpBranch %58
+         %60 = OpLabel
+               OpBranch %42
+         %58 = OpLabel
+               OpBranch %41
+         %42 = OpLabel
+         %61 = OpLoad %bool %x_33
+               OpSelectionMerge %62 None
+               OpBranchConditional %61 %63 %62
+         %63 = OpLabel
+               OpBranch %37
+         %62 = OpLabel
+               OpStore %x_33 %true
+               OpStore %x_34 %float_0
+               OpBranch %37
+         %38 = OpLabel
+               OpBranch %36
+         %37 = OpLabel
+         %64 = OpLoad %float %x_34
+               OpStore %x_36 %64
+               OpStore %f %64
+               OpStore %param_1 %float_1
+               OpStore %x_29 %false
+               OpBranch %65
+         %65 = OpLabel
+               OpLoopMerge %66 %67 None
+               OpBranch %68
+         %68 = OpLabel
+         %69 = OpLoad %float %param_1
+               OpStore %x_31 %69
+               OpBranch %70
+         %70 = OpLabel
+               OpLoopMerge %71 %72 None
+               OpBranch %73
+         %73 = OpLabel
+         %74 = OpLoad %float %x_31
+         %75 = OpLoad %float %param_1
+         %76 = OpFOrdEqual %bool %74 %75
+               OpSelectionMerge %77 None
+               OpBranchConditional %76 %78 %77
+         %78 = OpLabel
+         %79 = OpLoad %float %x_31
+               OpStore %x_29 %true
+               OpStore %x_30 %79
+               OpBranch %71
+         %77 = OpLabel
+         %80 = OpLoad %float %x_31
+         %81 = OpFAdd %float %80 %float_1
+               OpStore %x_31 %81
+               OpBranch %72
+         %72 = OpLabel
+         %82 = OpLoad %float %x_31
+         %83 = OpLoad %float %param_1
+         %84 = OpFOrdLessThan %bool %82 %83
+               OpSelectionMerge %85 None
+               OpBranchConditional %84 %86 %87
+         %86 = OpLabel
+               OpBranch %85
+         %87 = OpLabel
+               OpBranch %71
+         %85 = OpLabel
+               OpBranch %70
+         %71 = OpLabel
+         %88 = OpLoad %bool %x_29
+               OpSelectionMerge %89 None
+               OpBranchConditional %88 %90 %89
+         %90 = OpLabel
+               OpBranch %66
+         %89 = OpLabel
+               OpStore %x_29 %true
+               OpStore %x_30 %float_0
+               OpBranch %66
+         %67 = OpLabel
+               OpBranch %65
+         %66 = OpLabel
+         %91 = OpLoad %float %x_30
+               OpStore %x_32 %91
+         %92 = OpLoad %float %i
+         %93 = OpFAdd %float %92 %91
+               OpStore %i %93
+         %95 = OpFOrdLessThan %bool %93 %float_6
+               OpSelectionMerge %96 None
+               OpBranchConditional %95 %97 %98
+         %97 = OpLabel
+               OpBranch %96
+         %98 = OpLabel
+               OpBranch %32
+         %96 = OpLabel
+               OpBranch %33
+         %33 = OpLabel
+               OpBranch %31
+         %32 = OpLabel
+         %99 = OpLoad %float %f
+        %101 = OpFOrdEqual %bool %99 %float_5
+               OpSelectionMerge %102 None
+               OpBranchConditional %101 %103 %104
+        %103 = OpLabel
+               OpStore %x_GLF_color %105
+               OpBranch %102
+        %104 = OpLabel
+               OpStore %x_GLF_color %106
+               OpBranch %102
+        %102 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %107
+%tint_symbol = OpFunctionParameter %main_out
+        %111 = OpLabel
+        %112 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %112
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+        %114 = OpLabel
+        %115 = OpFunctionCall %void %main_1
+        %117 = OpLoad %v4float %x_GLF_color
+        %118 = OpCompositeConstruct %main_out %117
+        %116 = OpFunctionCall %void %tint_symbol_2 %118
+               OpReturn
+               OpFunctionEnd
+   %func_f1_ = OpFunction %float None %119
+          %x = OpFunctionParameter %_ptr_Function_float
+        %122 = OpLabel
+       %x_93 = OpVariable %_ptr_Function_bool Function %16
+       %x_94 = OpVariable %_ptr_Function_float Function %19
+          %a = OpVariable %_ptr_Function_float Function %19
+               OpStore %x_93 %false
+               OpBranch %126
+        %126 = OpLabel
+               OpLoopMerge %127 %128 None
+               OpBranch %129
+        %129 = OpLabel
+        %131 = OpLoad %float %x
+               OpStore %a %131
+               OpBranch %132
+        %132 = OpLabel
+               OpLoopMerge %133 %134 None
+               OpBranch %135
+        %135 = OpLabel
+        %136 = OpLoad %float %a
+        %138 = OpLoad %float %x
+        %139 = OpFOrdEqual %bool %136 %138
+               OpSelectionMerge %140 None
+               OpBranchConditional %139 %141 %140
+        %141 = OpLabel
+        %142 = OpLoad %float %a
+               OpStore %x_93 %true
+               OpStore %x_94 %142
+               OpBranch %133
+        %140 = OpLabel
+        %143 = OpLoad %float %a
+        %144 = OpFAdd %float %143 %float_1
+               OpStore %a %144
+               OpBranch %134
+        %134 = OpLabel
+        %145 = OpLoad %float %a
+        %147 = OpLoad %float %x
+        %148 = OpFOrdLessThan %bool %145 %147
+               OpSelectionMerge %149 None
+               OpBranchConditional %148 %150 %151
+        %150 = OpLabel
+               OpBranch %149
+        %151 = OpLabel
+               OpBranch %133
+        %149 = OpLabel
+               OpBranch %132
+        %133 = OpLabel
+        %152 = OpLoad %bool %x_93
+               OpSelectionMerge %153 None
+               OpBranchConditional %152 %154 %153
+        %154 = OpLabel
+               OpBranch %127
+        %153 = OpLabel
+               OpStore %x_93 %true
+               OpStore %x_94 %float_0
+               OpBranch %127
+        %128 = OpLabel
+               OpBranch %126
+        %127 = OpLabel
+        %155 = OpLoad %float %x_94
+               OpReturnValue %155
+               OpFunctionEnd
+1:1: The continue construct with the continue target 43[%43] is not post dominated by the back-edge block 58[%58]
+  %58 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dead-branch-func-return-arg/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-dead-branch-func-return-arg/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..14ef8d3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dead-branch-func-return-arg/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,159 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_29 : bool = false;
+  var x_30 : f32;
+  var x_31 : f32;
+  var x_32 : f32;
+  var x_33 : bool = false;
+  var x_34 : f32;
+  var x_35 : f32;
+  var x_36 : f32;
+  var f : f32;
+  var i : f32;
+  var param : f32;
+  var param_1 : f32;
+  f = 0.0;
+  i = 0.0;
+  loop {
+    let x_38 : f32 = i;
+    param = x_38;
+    x_33 = false;
+    loop {
+      let x_41 : f32 = param;
+      x_35 = x_41;
+      loop {
+        let x_48 : f32 = x_35;
+        let x_49 : f32 = param;
+        if ((x_48 == x_49)) {
+          let x_53 : f32 = x_35;
+          x_33 = true;
+          x_34 = x_53;
+          break;
+        }
+        let x_54 : f32 = x_35;
+        x_35 = (x_54 + 1.0);
+
+        continuing {
+          let x_56 : f32 = x_35;
+          let x_57 : f32 = param;
+          if ((x_56 < x_57)) {
+          } else {
+            break;
+          }
+        }
+      }
+      let x_59 : bool = x_33;
+      if (x_59) {
+        break;
+      }
+      x_33 = true;
+      x_34 = 0.0;
+      break;
+    }
+    let x_61 : f32 = x_34;
+    x_36 = x_61;
+    f = x_61;
+    param_1 = 1.0;
+    x_29 = false;
+    loop {
+      let x_63 : f32 = param_1;
+      x_31 = x_63;
+      loop {
+        let x_70 : f32 = x_31;
+        let x_71 : f32 = param_1;
+        if ((x_70 == x_71)) {
+          let x_75 : f32 = x_31;
+          x_29 = true;
+          x_30 = x_75;
+          break;
+        }
+        let x_76 : f32 = x_31;
+        x_31 = (x_76 + 1.0);
+
+        continuing {
+          let x_78 : f32 = x_31;
+          let x_79 : f32 = param_1;
+          if ((x_78 < x_79)) {
+          } else {
+            break;
+          }
+        }
+      }
+      let x_81 : bool = x_29;
+      if (x_81) {
+        break;
+      }
+      x_29 = true;
+      x_30 = 0.0;
+      break;
+    }
+    let x_83 : f32 = x_30;
+    x_32 = x_83;
+    let x_84 : f32 = i;
+    let x_85 : f32 = (x_84 + x_83);
+    i = x_85;
+    if ((x_85 < 6.0)) {
+    } else {
+      break;
+    }
+  }
+  let x_87 : f32 = f;
+  if ((x_87 == 5.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+fn func_f1_(x : ptr<function, f32>) -> f32 {
+  var x_93 : bool = false;
+  var x_94 : f32;
+  var a : f32;
+  loop {
+    let x_96 : f32 = *(x);
+    a = x_96;
+    loop {
+      let x_103 : f32 = a;
+      let x_104 : f32 = *(x);
+      if ((x_103 == x_104)) {
+        let x_108 : f32 = a;
+        x_93 = true;
+        x_94 = x_108;
+        break;
+      }
+      let x_109 : f32 = a;
+      a = (x_109 + 1.0);
+
+      continuing {
+        let x_111 : f32 = a;
+        let x_112 : f32 = *(x);
+        if ((x_111 < x_112)) {
+        } else {
+          break;
+        }
+      }
+    }
+    let x_114 : bool = x_93;
+    if (x_114) {
+      break;
+    }
+    x_93 = true;
+    x_94 = 0.0;
+    break;
+  }
+  let x_116 : f32 = x_94;
+  return x_116;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.spvasm
new file mode 100644
index 0000000..3ccb8a9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.spvasm
@@ -0,0 +1,154 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %q "q"
+               OpName %i "i"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %c "c"
+               OpName %array0 "array0"
+               OpName %array1 "array1"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %q RelaxedPrecision
+               OpDecorate %i RelaxedPrecision
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %12 RelaxedPrecision
+               OpDecorate %13 RelaxedPrecision
+               OpDecorate %c RelaxedPrecision
+               OpDecorate %14 RelaxedPrecision
+               OpDecorate %15 RelaxedPrecision
+               OpDecorate %16 RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %17 RelaxedPrecision
+               OpDecorate %18 RelaxedPrecision
+               OpDecorate %19 RelaxedPrecision
+               OpDecorate %20 RelaxedPrecision
+               OpDecorate %21 RelaxedPrecision
+               OpDecorate %22 RelaxedPrecision
+               OpDecorate %23 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %24 RelaxedPrecision
+               OpDecorate %25 RelaxedPrecision
+               OpDecorate %26 RelaxedPrecision
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+      %int_3 = OpConstant %int 3
+       %bool = OpTypeBool
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+%_ptr_Private__arr_float_uint_3 = OpTypePointer Private %_arr_float_uint_3
+     %array0 = OpVariable %_ptr_Private__arr_float_uint_3 Private
+    %float_0 = OpConstant %float 0
+%_ptr_Private_float = OpTypePointer Private %float
+     %array1 = OpVariable %_ptr_Private__arr_float_uint_3 Private
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %int_61 = OpConstant %int 61
+       %true = OpConstantTrue %bool
+    %float_1 = OpConstant %float 1
+      %int_1 = OpConstant %int 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %28
+         %53 = OpLabel
+          %q = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+          %c = OpVariable %_ptr_Function_int Function
+               OpStore %q %int_0
+         %54 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %55 = OpLoad %float %54
+         %12 = OpConvertFToS %int %55
+         %13 = OpSMod %int %12 %int_3
+               OpStore %i %13
+               OpStore %c %int_0
+               OpBranch %56
+         %56 = OpLabel
+               OpLoopMerge %57 %58 None
+               OpBranch %59
+         %59 = OpLabel
+         %14 = OpLoad %int %c
+         %60 = OpSLessThan %bool %14 %int_3
+               OpBranchConditional %60 %61 %57
+         %61 = OpLabel
+         %15 = OpLoad %int %c
+         %62 = OpAccessChain %_ptr_Private_float %array0 %15
+               OpStore %62 %float_0
+         %16 = OpLoad %int %c
+         %63 = OpAccessChain %_ptr_Private_float %array1 %16
+               OpStore %63 %float_0
+         %64 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %65 = OpLoad %float %64
+         %17 = OpConvertFToS %int %65
+         %18 = OpLoad %int %q
+         %19 = OpIAdd %int %17 %18
+               OpSelectionMerge %66 None
+               OpSwitch %19 %66 0 %67 51 %68 61 %69
+         %67 = OpLabel
+               OpStore %q %int_61
+               OpBranch %66
+         %68 = OpLabel
+               OpBranch %70
+         %70 = OpLabel
+               OpLoopMerge %71 %72 None
+               OpBranch %73
+         %73 = OpLabel
+               OpBranchConditional %true %74 %71
+         %74 = OpLabel
+               OpBranch %72
+         %72 = OpLabel
+               OpBranch %70
+         %71 = OpLabel
+         %20 = OpLoad %int %c
+         %75 = OpAccessChain %_ptr_Private_float %array0 %20
+               OpStore %75 %float_1
+               OpBranch %69
+         %69 = OpLabel
+         %76 = OpAccessChain %_ptr_Private_float %array1 %int_0
+               OpStore %76 %float_1
+         %21 = OpLoad %int %c
+         %77 = OpAccessChain %_ptr_Private_float %array1 %21
+               OpStore %77 %float_1
+               OpBranch %66
+         %66 = OpLabel
+               OpBranch %58
+         %58 = OpLabel
+         %22 = OpLoad %int %c
+         %23 = OpIAdd %int %22 %int_1
+               OpStore %c %23
+               OpBranch %56
+         %57 = OpLabel
+         %24 = OpLoad %int %i
+         %78 = OpAccessChain %_ptr_Private_float %array1 %24
+         %79 = OpLoad %float %78
+         %25 = OpLoad %int %i
+         %80 = OpAccessChain %_ptr_Private_float %array0 %25
+         %81 = OpLoad %float %80
+         %26 = OpLoad %int %i
+         %82 = OpAccessChain %_ptr_Private_float %array0 %26
+         %83 = OpLoad %float %82
+         %84 = OpCompositeConstruct %v4float %79 %81 %83 %float_1
+               OpStore %_GLF_color %84
+               OpReturn
+               OpFunctionEnd
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
new file mode 100755
index 0000000..d17d70d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,76 @@
+SKIP: FAILED
+
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float array0[3] = (float[3])0;
+static float array1[3] = (float[3])0;
+cbuffer cbuffer_x_11 : register(b0, space0) {
+  uint4 x_11[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int q = 0;
+  int i = 0;
+  int c = 0;
+  q = 0;
+  const float x_55 = gl_FragCoord.x;
+  i = (int(x_55) % 3);
+  c = 0;
+  {
+    for(; (c < 3); c = (c + 1)) {
+      array0[c] = 0.0f;
+      array1[c] = 0.0f;
+      const float x_65 = asfloat(x_11[0].x);
+      switch((int(x_65) + q)) {
+        case 51: {
+          while (true) {
+            if (true) {
+            } else {
+              break;
+            }
+          }
+          array0[c] = 1.0f;
+          /* fallthrough */
+        }
+        case 61: {
+          array1[0] = 1.0f;
+          array1[c] = 1.0f;
+          break;
+        }
+        case 0: {
+          q = 61;
+          break;
+        }
+        default: {
+          break;
+        }
+      }
+    }
+  }
+  const float x_79 = array1[i];
+  const float x_81 = array0[i];
+  const float x_83 = array0[i];
+  x_GLF_color = float4(x_79, x_81, x_83, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
+Internal compiler error: access violation. Attempted to read from address 0xFFFFFFFFFFFFFFE8
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..f9b0707
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.spvasm.expected.msl
@@ -0,0 +1,89 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  float arr[3];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_11, thread float4* const tint_symbol_5, thread tint_array_wrapper* const tint_symbol_6, thread tint_array_wrapper* const tint_symbol_7, thread float4* const tint_symbol_8) {
+  int q = 0;
+  int i = 0;
+  int c = 0;
+  q = 0;
+  float const x_55 = (*(tint_symbol_5)).x;
+  i = (int(x_55) % 3);
+  c = 0;
+  while (true) {
+    int const x_14 = c;
+    if ((x_14 < 3)) {
+    } else {
+      break;
+    }
+    int const x_15 = c;
+    (*(tint_symbol_6)).arr[x_15] = 0.0f;
+    int const x_16 = c;
+    (*(tint_symbol_7)).arr[x_16] = 0.0f;
+    float const x_65 = x_11.injectionSwitch.x;
+    int const x_18 = q;
+    switch((int(x_65) + x_18)) {
+      case 51: {
+        while (true) {
+          if (true) {
+          } else {
+            break;
+          }
+        }
+        int const x_20 = c;
+        (*(tint_symbol_6)).arr[x_20] = 1.0f;
+        /* fallthrough */
+      }
+      case 61: {
+        (*(tint_symbol_7)).arr[0] = 1.0f;
+        int const x_21 = c;
+        (*(tint_symbol_7)).arr[x_21] = 1.0f;
+        break;
+      }
+      case 0: {
+        q = 61;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    {
+      int const x_22 = c;
+      c = (x_22 + 1);
+    }
+  }
+  int const x_24 = i;
+  float const x_79 = (*(tint_symbol_7)).arr[x_24];
+  int const x_25 = i;
+  float const x_81 = (*(tint_symbol_6)).arr[x_25];
+  int const x_26 = i;
+  float const x_83 = (*(tint_symbol_6)).arr[x_26];
+  *(tint_symbol_8) = float4(x_79, x_81, x_83, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_11 [[buffer(0)]]) {
+  thread float4 tint_symbol_9 = 0.0f;
+  thread tint_array_wrapper tint_symbol_10 = {};
+  thread tint_array_wrapper tint_symbol_11 = {};
+  thread float4 tint_symbol_12 = 0.0f;
+  tint_symbol_9 = gl_FragCoord_param;
+  main_1(x_11, &(tint_symbol_9), &(tint_symbol_10), &(tint_symbol_11), &(tint_symbol_12));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_12};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..eabbd52
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,185 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 107
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %array0 "array0"
+               OpName %array1 "array1"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_11 "x_11"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %q "q"
+               OpName %i "i"
+               OpName %c "c"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %_arr_float_uint_3 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_11 NonWritable
+               OpDecorate %x_11 DescriptorSet 0
+               OpDecorate %x_11 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+%_ptr_Private__arr_float_uint_3 = OpTypePointer Private %_arr_float_uint_3
+         %11 = OpConstantNull %_arr_float_uint_3
+     %array0 = OpVariable %_ptr_Private__arr_float_uint_3 Private %11
+     %array1 = OpVariable %_ptr_Private__arr_float_uint_3 Private %11
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_11 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %22 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+      %int_3 = OpConstant %int 3
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %true = OpConstantTrue %bool
+    %float_1 = OpConstant %float 1
+     %int_61 = OpConstant %int 61
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %94 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %22
+         %25 = OpLabel
+          %q = OpVariable %_ptr_Function_int Function %29
+          %i = OpVariable %_ptr_Function_int Function %29
+          %c = OpVariable %_ptr_Function_int Function %29
+               OpStore %q %int_0
+         %35 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %36 = OpLoad %float %35
+         %37 = OpConvertFToS %int %36
+         %39 = OpSMod %int %37 %int_3
+               OpStore %i %39
+               OpStore %c %int_0
+               OpBranch %40
+         %40 = OpLabel
+               OpLoopMerge %41 %42 None
+               OpBranch %43
+         %43 = OpLabel
+         %44 = OpLoad %int %c
+         %45 = OpSLessThan %bool %44 %int_3
+               OpSelectionMerge %47 None
+               OpBranchConditional %45 %48 %49
+         %48 = OpLabel
+               OpBranch %47
+         %49 = OpLabel
+               OpBranch %41
+         %47 = OpLabel
+         %50 = OpLoad %int %c
+         %51 = OpAccessChain %_ptr_Private_float %array0 %50
+               OpStore %51 %float_0
+         %53 = OpLoad %int %c
+         %54 = OpAccessChain %_ptr_Private_float %array1 %53
+               OpStore %54 %float_0
+         %56 = OpAccessChain %_ptr_Uniform_float %x_11 %uint_0 %uint_0
+         %57 = OpLoad %float %56
+         %58 = OpLoad %int %q
+         %60 = OpConvertFToS %int %57
+         %61 = OpIAdd %int %60 %58
+               OpSelectionMerge %59 None
+               OpSwitch %61 %62 51 %63 61 %64 0 %65
+         %63 = OpLabel
+               OpBranch %66
+         %66 = OpLabel
+               OpLoopMerge %67 %68 None
+               OpBranch %69
+         %69 = OpLabel
+               OpSelectionMerge %71 None
+               OpBranchConditional %true %72 %73
+         %72 = OpLabel
+               OpBranch %71
+         %73 = OpLabel
+               OpBranch %67
+         %71 = OpLabel
+               OpBranch %68
+         %68 = OpLabel
+               OpBranch %66
+         %67 = OpLabel
+         %74 = OpLoad %int %c
+         %75 = OpAccessChain %_ptr_Private_float %array0 %74
+               OpStore %75 %float_1
+               OpBranch %64
+         %64 = OpLabel
+         %77 = OpAccessChain %_ptr_Private_float %array1 %int_0
+               OpStore %77 %float_1
+         %78 = OpLoad %int %c
+         %79 = OpAccessChain %_ptr_Private_float %array1 %78
+               OpStore %79 %float_1
+               OpBranch %59
+         %65 = OpLabel
+               OpStore %q %int_61
+               OpBranch %59
+         %62 = OpLabel
+               OpBranch %59
+         %59 = OpLabel
+               OpBranch %42
+         %42 = OpLabel
+         %81 = OpLoad %int %c
+         %83 = OpIAdd %int %81 %int_1
+               OpStore %c %83
+               OpBranch %40
+         %41 = OpLabel
+         %84 = OpLoad %int %i
+         %85 = OpAccessChain %_ptr_Private_float %array1 %84
+         %86 = OpLoad %float %85
+         %87 = OpLoad %int %i
+         %88 = OpAccessChain %_ptr_Private_float %array0 %87
+         %89 = OpLoad %float %88
+         %90 = OpLoad %int %i
+         %91 = OpAccessChain %_ptr_Private_float %array0 %90
+         %92 = OpLoad %float %91
+         %93 = OpCompositeConstruct %v4float %86 %89 %92 %float_1
+               OpStore %x_GLF_color %93
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %94
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %98 = OpLabel
+         %99 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %99
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %22
+        %101 = OpLabel
+        %102 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %102
+        %103 = OpFunctionCall %void %main_1
+        %105 = OpLoad %v4float %x_GLF_color
+        %106 = OpCompositeConstruct %main_out %105
+        %104 = OpFunctionCall %void %tint_symbol_3 %106
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..f6836ba
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,85 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> array0 : array<f32, 3>;
+
+var<private> array1 : array<f32, 3>;
+
+[[group(0), binding(0)]] var<uniform> x_11 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var q : i32;
+  var i : i32;
+  var c : i32;
+  q = 0;
+  let x_55 : f32 = gl_FragCoord.x;
+  i = (i32(x_55) % 3);
+  c = 0;
+  loop {
+    let x_14 : i32 = c;
+    if ((x_14 < 3)) {
+    } else {
+      break;
+    }
+    let x_15 : i32 = c;
+    array0[x_15] = 0.0;
+    let x_16 : i32 = c;
+    array1[x_16] = 0.0;
+    let x_65 : f32 = x_11.injectionSwitch.x;
+    let x_18 : i32 = q;
+    switch((i32(x_65) + x_18)) {
+      case 51: {
+        loop {
+          if (true) {
+          } else {
+            break;
+          }
+        }
+        let x_20 : i32 = c;
+        array0[x_20] = 1.0;
+        fallthrough;
+      }
+      case 61: {
+        array1[0] = 1.0;
+        let x_21 : i32 = c;
+        array1[x_21] = 1.0;
+      }
+      case 0: {
+        q = 61;
+      }
+      default: {
+      }
+    }
+
+    continuing {
+      let x_22 : i32 = c;
+      c = (x_22 + 1);
+    }
+  }
+  let x_24 : i32 = i;
+  let x_79 : f32 = array1[x_24];
+  let x_25 : i32 = i;
+  let x_81 : f32 = array0[x_25];
+  let x_26 : i32 = i;
+  let x_83 : f32 = array0[x_26];
+  x_GLF_color = vec4<f32>(x_79, x_81, x_83, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.wgsl
new file mode 100644
index 0000000..f6836ba
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.wgsl
@@ -0,0 +1,85 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> array0 : array<f32, 3>;
+
+var<private> array1 : array<f32, 3>;
+
+[[group(0), binding(0)]] var<uniform> x_11 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var q : i32;
+  var i : i32;
+  var c : i32;
+  q = 0;
+  let x_55 : f32 = gl_FragCoord.x;
+  i = (i32(x_55) % 3);
+  c = 0;
+  loop {
+    let x_14 : i32 = c;
+    if ((x_14 < 3)) {
+    } else {
+      break;
+    }
+    let x_15 : i32 = c;
+    array0[x_15] = 0.0;
+    let x_16 : i32 = c;
+    array1[x_16] = 0.0;
+    let x_65 : f32 = x_11.injectionSwitch.x;
+    let x_18 : i32 = q;
+    switch((i32(x_65) + x_18)) {
+      case 51: {
+        loop {
+          if (true) {
+          } else {
+            break;
+          }
+        }
+        let x_20 : i32 = c;
+        array0[x_20] = 1.0;
+        fallthrough;
+      }
+      case 61: {
+        array1[0] = 1.0;
+        let x_21 : i32 = c;
+        array1[x_21] = 1.0;
+      }
+      case 0: {
+        q = 61;
+      }
+      default: {
+      }
+    }
+
+    continuing {
+      let x_22 : i32 = c;
+      c = (x_22 + 1);
+    }
+  }
+  let x_24 : i32 = i;
+  let x_79 : f32 = array1[x_24];
+  let x_25 : i32 = i;
+  let x_81 : f32 = array0[x_25];
+  let x_26 : i32 = i;
+  let x_83 : f32 = array0[x_26];
+  x_GLF_color = vec4<f32>(x_79, x_81, x_83, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
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
new file mode 100755
index 0000000..d17d70d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,76 @@
+SKIP: FAILED
+
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float array0[3] = (float[3])0;
+static float array1[3] = (float[3])0;
+cbuffer cbuffer_x_11 : register(b0, space0) {
+  uint4 x_11[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int q = 0;
+  int i = 0;
+  int c = 0;
+  q = 0;
+  const float x_55 = gl_FragCoord.x;
+  i = (int(x_55) % 3);
+  c = 0;
+  {
+    for(; (c < 3); c = (c + 1)) {
+      array0[c] = 0.0f;
+      array1[c] = 0.0f;
+      const float x_65 = asfloat(x_11[0].x);
+      switch((int(x_65) + q)) {
+        case 51: {
+          while (true) {
+            if (true) {
+            } else {
+              break;
+            }
+          }
+          array0[c] = 1.0f;
+          /* fallthrough */
+        }
+        case 61: {
+          array1[0] = 1.0f;
+          array1[c] = 1.0f;
+          break;
+        }
+        case 0: {
+          q = 61;
+          break;
+        }
+        default: {
+          break;
+        }
+      }
+    }
+  }
+  const float x_79 = array1[i];
+  const float x_81 = array0[i];
+  const float x_83 = array0[i];
+  x_GLF_color = float4(x_79, x_81, x_83, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
+Internal compiler error: access violation. Attempted to read from address 0xFFFFFFFFFFFFFFE8
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..f9b0707
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.wgsl.expected.msl
@@ -0,0 +1,89 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  float arr[3];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_11, thread float4* const tint_symbol_5, thread tint_array_wrapper* const tint_symbol_6, thread tint_array_wrapper* const tint_symbol_7, thread float4* const tint_symbol_8) {
+  int q = 0;
+  int i = 0;
+  int c = 0;
+  q = 0;
+  float const x_55 = (*(tint_symbol_5)).x;
+  i = (int(x_55) % 3);
+  c = 0;
+  while (true) {
+    int const x_14 = c;
+    if ((x_14 < 3)) {
+    } else {
+      break;
+    }
+    int const x_15 = c;
+    (*(tint_symbol_6)).arr[x_15] = 0.0f;
+    int const x_16 = c;
+    (*(tint_symbol_7)).arr[x_16] = 0.0f;
+    float const x_65 = x_11.injectionSwitch.x;
+    int const x_18 = q;
+    switch((int(x_65) + x_18)) {
+      case 51: {
+        while (true) {
+          if (true) {
+          } else {
+            break;
+          }
+        }
+        int const x_20 = c;
+        (*(tint_symbol_6)).arr[x_20] = 1.0f;
+        /* fallthrough */
+      }
+      case 61: {
+        (*(tint_symbol_7)).arr[0] = 1.0f;
+        int const x_21 = c;
+        (*(tint_symbol_7)).arr[x_21] = 1.0f;
+        break;
+      }
+      case 0: {
+        q = 61;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    {
+      int const x_22 = c;
+      c = (x_22 + 1);
+    }
+  }
+  int const x_24 = i;
+  float const x_79 = (*(tint_symbol_7)).arr[x_24];
+  int const x_25 = i;
+  float const x_81 = (*(tint_symbol_6)).arr[x_25];
+  int const x_26 = i;
+  float const x_83 = (*(tint_symbol_6)).arr[x_26];
+  *(tint_symbol_8) = float4(x_79, x_81, x_83, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_11 [[buffer(0)]]) {
+  thread float4 tint_symbol_9 = 0.0f;
+  thread tint_array_wrapper tint_symbol_10 = {};
+  thread tint_array_wrapper tint_symbol_11 = {};
+  thread float4 tint_symbol_12 = 0.0f;
+  tint_symbol_9 = gl_FragCoord_param;
+  main_1(x_11, &(tint_symbol_9), &(tint_symbol_10), &(tint_symbol_11), &(tint_symbol_12));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_12};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..eabbd52
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,185 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 107
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %array0 "array0"
+               OpName %array1 "array1"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_11 "x_11"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %q "q"
+               OpName %i "i"
+               OpName %c "c"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %_arr_float_uint_3 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_11 NonWritable
+               OpDecorate %x_11 DescriptorSet 0
+               OpDecorate %x_11 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+%_ptr_Private__arr_float_uint_3 = OpTypePointer Private %_arr_float_uint_3
+         %11 = OpConstantNull %_arr_float_uint_3
+     %array0 = OpVariable %_ptr_Private__arr_float_uint_3 Private %11
+     %array1 = OpVariable %_ptr_Private__arr_float_uint_3 Private %11
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_11 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %22 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+      %int_3 = OpConstant %int 3
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %true = OpConstantTrue %bool
+    %float_1 = OpConstant %float 1
+     %int_61 = OpConstant %int 61
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %94 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %22
+         %25 = OpLabel
+          %q = OpVariable %_ptr_Function_int Function %29
+          %i = OpVariable %_ptr_Function_int Function %29
+          %c = OpVariable %_ptr_Function_int Function %29
+               OpStore %q %int_0
+         %35 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %36 = OpLoad %float %35
+         %37 = OpConvertFToS %int %36
+         %39 = OpSMod %int %37 %int_3
+               OpStore %i %39
+               OpStore %c %int_0
+               OpBranch %40
+         %40 = OpLabel
+               OpLoopMerge %41 %42 None
+               OpBranch %43
+         %43 = OpLabel
+         %44 = OpLoad %int %c
+         %45 = OpSLessThan %bool %44 %int_3
+               OpSelectionMerge %47 None
+               OpBranchConditional %45 %48 %49
+         %48 = OpLabel
+               OpBranch %47
+         %49 = OpLabel
+               OpBranch %41
+         %47 = OpLabel
+         %50 = OpLoad %int %c
+         %51 = OpAccessChain %_ptr_Private_float %array0 %50
+               OpStore %51 %float_0
+         %53 = OpLoad %int %c
+         %54 = OpAccessChain %_ptr_Private_float %array1 %53
+               OpStore %54 %float_0
+         %56 = OpAccessChain %_ptr_Uniform_float %x_11 %uint_0 %uint_0
+         %57 = OpLoad %float %56
+         %58 = OpLoad %int %q
+         %60 = OpConvertFToS %int %57
+         %61 = OpIAdd %int %60 %58
+               OpSelectionMerge %59 None
+               OpSwitch %61 %62 51 %63 61 %64 0 %65
+         %63 = OpLabel
+               OpBranch %66
+         %66 = OpLabel
+               OpLoopMerge %67 %68 None
+               OpBranch %69
+         %69 = OpLabel
+               OpSelectionMerge %71 None
+               OpBranchConditional %true %72 %73
+         %72 = OpLabel
+               OpBranch %71
+         %73 = OpLabel
+               OpBranch %67
+         %71 = OpLabel
+               OpBranch %68
+         %68 = OpLabel
+               OpBranch %66
+         %67 = OpLabel
+         %74 = OpLoad %int %c
+         %75 = OpAccessChain %_ptr_Private_float %array0 %74
+               OpStore %75 %float_1
+               OpBranch %64
+         %64 = OpLabel
+         %77 = OpAccessChain %_ptr_Private_float %array1 %int_0
+               OpStore %77 %float_1
+         %78 = OpLoad %int %c
+         %79 = OpAccessChain %_ptr_Private_float %array1 %78
+               OpStore %79 %float_1
+               OpBranch %59
+         %65 = OpLabel
+               OpStore %q %int_61
+               OpBranch %59
+         %62 = OpLabel
+               OpBranch %59
+         %59 = OpLabel
+               OpBranch %42
+         %42 = OpLabel
+         %81 = OpLoad %int %c
+         %83 = OpIAdd %int %81 %int_1
+               OpStore %c %83
+               OpBranch %40
+         %41 = OpLabel
+         %84 = OpLoad %int %i
+         %85 = OpAccessChain %_ptr_Private_float %array1 %84
+         %86 = OpLoad %float %85
+         %87 = OpLoad %int %i
+         %88 = OpAccessChain %_ptr_Private_float %array0 %87
+         %89 = OpLoad %float %88
+         %90 = OpLoad %int %i
+         %91 = OpAccessChain %_ptr_Private_float %array0 %90
+         %92 = OpLoad %float %91
+         %93 = OpCompositeConstruct %v4float %86 %89 %92 %float_1
+               OpStore %x_GLF_color %93
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %94
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %98 = OpLabel
+         %99 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %99
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %22
+        %101 = OpLabel
+        %102 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %102
+        %103 = OpFunctionCall %void %main_1
+        %105 = OpLoad %v4float %x_GLF_color
+        %106 = OpCompositeConstruct %main_out %105
+        %104 = OpFunctionCall %void %tint_symbol_3 %106
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..f6836ba
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,85 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> array0 : array<f32, 3>;
+
+var<private> array1 : array<f32, 3>;
+
+[[group(0), binding(0)]] var<uniform> x_11 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var q : i32;
+  var i : i32;
+  var c : i32;
+  q = 0;
+  let x_55 : f32 = gl_FragCoord.x;
+  i = (i32(x_55) % 3);
+  c = 0;
+  loop {
+    let x_14 : i32 = c;
+    if ((x_14 < 3)) {
+    } else {
+      break;
+    }
+    let x_15 : i32 = c;
+    array0[x_15] = 0.0;
+    let x_16 : i32 = c;
+    array1[x_16] = 0.0;
+    let x_65 : f32 = x_11.injectionSwitch.x;
+    let x_18 : i32 = q;
+    switch((i32(x_65) + x_18)) {
+      case 51: {
+        loop {
+          if (true) {
+          } else {
+            break;
+          }
+        }
+        let x_20 : i32 = c;
+        array0[x_20] = 1.0;
+        fallthrough;
+      }
+      case 61: {
+        array1[0] = 1.0;
+        let x_21 : i32 = c;
+        array1[x_21] = 1.0;
+      }
+      case 0: {
+        q = 61;
+      }
+      default: {
+      }
+    }
+
+    continuing {
+      let x_22 : i32 = c;
+      c = (x_22 + 1);
+    }
+  }
+  let x_24 : i32 = i;
+  let x_79 : f32 = array1[x_24];
+  let x_25 : i32 = i;
+  let x_81 : f32 = array0[x_25];
+  let x_26 : i32 = i;
+  let x_83 : f32 = array0[x_26];
+  x_GLF_color = vec4<f32>(x_79, x_81, x_83, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-derivative-uniform-vector-global-loop-count/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-derivative-uniform-vector-global-loop-count/0-opt.spvasm
new file mode 100644
index 0000000..a660e7a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-derivative-uniform-vector-global-loop-count/0-opt.spvasm
@@ -0,0 +1,162 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %_GLF_global_loop_count "_GLF_global_loop_count"
+               OpName %f "f"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %r "r"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "injectionSwitch"
+               OpName %__1 ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %buf2 Block
+               OpDecorate %__1 DescriptorSet 0
+               OpDecorate %__1 Binding 2
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %16 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+%_GLF_global_loop_count = OpVariable %_ptr_Private_int Private
+      %int_0 = OpConstant %int 0
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_int = OpTypePointer Function %int
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+    %v2float = OpTypeVector %float 2
+       %buf2 = OpTypeStruct %v2float
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+        %__1 = OpVariable %_ptr_Uniform_buf2 Uniform
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+     %uint_1 = OpConstant %uint 1
+    %int_100 = OpConstant %int 100
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %16
+         %40 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function
+          %r = OpVariable %_ptr_Function_int Function
+               OpStore %_GLF_global_loop_count %int_0
+         %41 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %42 = OpLoad %float %41
+               OpStore %f %42
+         %43 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %44 = OpLoad %int %43
+               OpStore %r %44
+               OpBranch %45
+         %45 = OpLabel
+               OpLoopMerge %46 %47 None
+               OpBranch %48
+         %48 = OpLabel
+         %49 = OpLoad %int %r
+         %50 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %51 = OpLoad %int %50
+         %52 = OpSLessThan %bool %49 %51
+               OpBranchConditional %52 %53 %46
+         %53 = OpLabel
+         %54 = OpLoad %int %_GLF_global_loop_count
+         %55 = OpIAdd %int %54 %int_1
+               OpStore %_GLF_global_loop_count %55
+         %56 = OpAccessChain %_ptr_Uniform_v2float %__1 %int_0
+         %57 = OpLoad %v2float %56
+         %58 = OpDPdx %v2float %57
+         %59 = OpCompositeExtract %float %58 1
+         %60 = OpLoad %float %f
+         %61 = OpFAdd %float %60 %59
+               OpStore %f %61
+               OpBranch %47
+         %47 = OpLabel
+         %62 = OpLoad %int %r
+         %63 = OpIAdd %int %62 %int_1
+               OpStore %r %63
+               OpBranch %45
+         %46 = OpLabel
+               OpBranch %64
+         %64 = OpLabel
+               OpLoopMerge %65 %66 None
+               OpBranch %67
+         %67 = OpLabel
+         %68 = OpLoad %int %_GLF_global_loop_count
+         %69 = OpSLessThan %bool %68 %int_100
+               OpBranchConditional %69 %70 %65
+         %70 = OpLabel
+         %71 = OpLoad %int %_GLF_global_loop_count
+         %72 = OpIAdd %int %71 %int_1
+               OpStore %_GLF_global_loop_count %72
+         %73 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %74 = OpLoad %float %73
+         %75 = OpLoad %float %f
+         %76 = OpFAdd %float %75 %74
+               OpStore %f %76
+               OpBranch %66
+         %66 = OpLabel
+               OpBranch %64
+         %65 = OpLabel
+         %77 = OpLoad %float %f
+         %78 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %79 = OpLoad %float %78
+         %80 = OpFOrdEqual %bool %77 %79
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %83
+         %82 = OpLabel
+         %84 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %85 = OpLoad %int %84
+         %86 = OpConvertSToF %float %85
+         %87 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %88 = OpLoad %int %87
+         %89 = OpConvertSToF %float %88
+         %90 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %91 = OpLoad %int %90
+         %92 = OpConvertSToF %float %91
+         %93 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %94 = OpLoad %int %93
+         %95 = OpConvertSToF %float %94
+         %96 = OpCompositeConstruct %v4float %86 %89 %92 %95
+               OpStore %_GLF_color %96
+               OpBranch %81
+         %83 = OpLabel
+         %97 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %98 = OpLoad %int %97
+         %99 = OpConvertSToF %float %98
+        %100 = OpCompositeConstruct %v4float %99 %99 %99 %99
+               OpStore %_GLF_color %100
+               OpBranch %81
+         %81 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-derivative-uniform-vector-global-loop-count/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-derivative-uniform-vector-global-loop-count/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..f469577
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-derivative-uniform-vector-global-loop-count/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,76 @@
+static int x_GLF_global_loop_count = 0;
+cbuffer cbuffer_x_7 : register(b1, space0) {
+  uint4 x_7[2];
+};
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[3];
+};
+cbuffer cbuffer_x_12 : register(b2, space0) {
+  uint4 x_12[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float f = 0.0f;
+  int r = 0;
+  x_GLF_global_loop_count = 0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_42 = asfloat(x_7[scalar_offset / 4][scalar_offset % 4]);
+  f = x_42;
+  const int x_44 = asint(x_10[1].x);
+  r = x_44;
+  while (true) {
+    const int x_49 = r;
+    const int x_51 = asint(x_10[2].x);
+    if ((x_49 < x_51)) {
+    } else {
+      break;
+    }
+    x_GLF_global_loop_count = (x_GLF_global_loop_count + 1);
+    const float2 x_57 = asfloat(x_12[0].xy);
+    f = (f + ddx(x_57).y);
+    {
+      r = (r + 1);
+    }
+  }
+  while (true) {
+    if ((x_GLF_global_loop_count < 100)) {
+    } else {
+      break;
+    }
+    x_GLF_global_loop_count = (x_GLF_global_loop_count + 1);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const float x_74 = asfloat(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    f = (f + x_74);
+  }
+  const float x_77 = f;
+  const float x_79 = asfloat(x_7[1].x);
+  if ((x_77 == x_79)) {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_85 = asint(x_10[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_88 = asint(x_10[1].x);
+    const int x_91 = asint(x_10[1].x);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_94 = asint(x_10[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    x_GLF_color = float4(float(x_85), float(x_88), float(x_91), float(x_94));
+  } else {
+    const int x_98 = asint(x_10[1].x);
+    const float x_99 = float(x_98);
+    x_GLF_color = float4(x_99, x_99, x_99, x_99);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-derivative-uniform-vector-global-loop-count/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-derivative-uniform-vector-global-loop-count/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..8361b24
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-derivative-uniform-vector-global-loop-count/0-opt.spvasm.expected.msl
@@ -0,0 +1,95 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct buf2 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_7, constant buf0& x_10, constant buf2& x_12, thread int* const tint_symbol_4, thread float4* const tint_symbol_5) {
+  float f = 0.0f;
+  int r = 0;
+  *(tint_symbol_4) = 0;
+  float const x_42 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  f = x_42;
+  int const x_44 = x_10.x_GLF_uniform_int_values.arr[1].el;
+  r = x_44;
+  while (true) {
+    int const x_49 = r;
+    int const x_51 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    if ((x_49 < x_51)) {
+    } else {
+      break;
+    }
+    int const x_54 = *(tint_symbol_4);
+    *(tint_symbol_4) = (x_54 + 1);
+    float2 const x_57 = x_12.injectionSwitch;
+    float const x_60 = f;
+    f = (x_60 + dfdx(x_57).y);
+    {
+      int const x_62 = r;
+      r = (x_62 + 1);
+    }
+  }
+  while (true) {
+    int const x_68 = *(tint_symbol_4);
+    if ((x_68 < 100)) {
+    } else {
+      break;
+    }
+    int const x_71 = *(tint_symbol_4);
+    *(tint_symbol_4) = (x_71 + 1);
+    float const x_74 = x_7.x_GLF_uniform_float_values.arr[0].el;
+    float const x_75 = f;
+    f = (x_75 + x_74);
+  }
+  float const x_77 = f;
+  float const x_79 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  if ((x_77 == x_79)) {
+    int const x_85 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    int const x_88 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_91 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_94 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_5) = float4(float(x_85), float(x_88), float(x_91), float(x_94));
+  } else {
+    int const x_98 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    float const x_99 = float(x_98);
+    *(tint_symbol_5) = float4(x_99, x_99, x_99, x_99);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_7 [[buffer(1)]], constant buf0& x_10 [[buffer(0)]], constant buf2& x_12 [[buffer(2)]]) {
+  thread int tint_symbol_6 = 0;
+  thread float4 tint_symbol_7 = 0.0f;
+  main_1(x_7, x_10, x_12, &(tint_symbol_6), &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-derivative-uniform-vector-global-loop-count/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-derivative-uniform-vector-global-loop-count/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..c816929
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-derivative-uniform-vector-global-loop-count/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,207 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 121
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_global_loop_count "x_GLF_global_loop_count"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_7 "x_7"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "injectionSwitch"
+               OpName %x_12 "x_12"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %r "r"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %buf2 Block
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %x_12 NonWritable
+               OpDecorate %x_12 DescriptorSet 0
+               OpDecorate %x_12 Binding 2
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+          %4 = OpConstantNull %int
+%x_GLF_global_loop_count = OpVariable %_ptr_Private_int Private %4
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_7 = OpVariable %_ptr_Uniform_buf1 Uniform
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v2float = OpTypeVector %float 2
+       %buf2 = OpTypeStruct %v2float
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+       %x_12 = OpVariable %_ptr_Uniform_buf2 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %24 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %24
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %24
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %33 = OpConstantNull %float
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %int_100 = OpConstant %int 100
+   %main_out = OpTypeStruct %v4float
+        %109 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %27
+         %30 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %33
+          %r = OpVariable %_ptr_Function_int Function %4
+               OpStore %x_GLF_global_loop_count %int_0
+         %39 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %40 = OpLoad %float %39
+               OpStore %f %40
+         %43 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %44 = OpLoad %int %43
+               OpStore %r %44
+               OpBranch %45
+         %45 = OpLabel
+               OpLoopMerge %46 %47 None
+               OpBranch %48
+         %48 = OpLabel
+         %49 = OpLoad %int %r
+         %51 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+         %52 = OpLoad %int %51
+         %53 = OpSLessThan %bool %49 %52
+               OpSelectionMerge %55 None
+               OpBranchConditional %53 %56 %57
+         %56 = OpLabel
+               OpBranch %55
+         %57 = OpLabel
+               OpBranch %46
+         %55 = OpLabel
+         %58 = OpLoad %int %x_GLF_global_loop_count
+         %59 = OpIAdd %int %58 %int_1
+               OpStore %x_GLF_global_loop_count %59
+         %61 = OpAccessChain %_ptr_Uniform_v2float %x_12 %uint_0
+         %62 = OpLoad %v2float %61
+         %63 = OpLoad %float %f
+         %64 = OpDPdx %v2float %62
+         %65 = OpCompositeExtract %float %64 1
+         %66 = OpFAdd %float %63 %65
+               OpStore %f %66
+               OpBranch %47
+         %47 = OpLabel
+         %67 = OpLoad %int %r
+         %68 = OpIAdd %int %67 %int_1
+               OpStore %r %68
+               OpBranch %45
+         %46 = OpLabel
+               OpBranch %69
+         %69 = OpLabel
+               OpLoopMerge %70 %71 None
+               OpBranch %72
+         %72 = OpLabel
+         %73 = OpLoad %int %x_GLF_global_loop_count
+         %75 = OpSLessThan %bool %73 %int_100
+               OpSelectionMerge %76 None
+               OpBranchConditional %75 %77 %78
+         %77 = OpLabel
+               OpBranch %76
+         %78 = OpLabel
+               OpBranch %70
+         %76 = OpLabel
+         %79 = OpLoad %int %x_GLF_global_loop_count
+         %80 = OpIAdd %int %79 %int_1
+               OpStore %x_GLF_global_loop_count %80
+         %81 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %82 = OpLoad %float %81
+         %83 = OpLoad %float %f
+         %84 = OpFAdd %float %83 %82
+               OpStore %f %84
+               OpBranch %71
+         %71 = OpLabel
+               OpBranch %69
+         %70 = OpLabel
+         %85 = OpLoad %float %f
+         %86 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %87 = OpLoad %float %86
+         %88 = OpFOrdEqual %bool %85 %87
+               OpSelectionMerge %89 None
+               OpBranchConditional %88 %90 %91
+         %90 = OpLabel
+         %92 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %93 = OpLoad %int %92
+         %94 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %95 = OpLoad %int %94
+         %96 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %97 = OpLoad %int %96
+         %98 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %99 = OpLoad %int %98
+        %100 = OpConvertSToF %float %93
+        %101 = OpConvertSToF %float %95
+        %102 = OpConvertSToF %float %97
+        %103 = OpConvertSToF %float %99
+        %104 = OpCompositeConstruct %v4float %100 %101 %102 %103
+               OpStore %x_GLF_color %104
+               OpBranch %89
+         %91 = OpLabel
+        %105 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %106 = OpLoad %int %105
+        %107 = OpConvertSToF %float %106
+        %108 = OpCompositeConstruct %v4float %107 %107 %107 %107
+               OpStore %x_GLF_color %108
+               OpBranch %89
+         %89 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %109
+%tint_symbol = OpFunctionParameter %main_out
+        %113 = OpLabel
+        %114 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %114
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %27
+        %116 = OpLabel
+        %117 = OpFunctionCall %void %main_1
+        %119 = OpLoad %v4float %x_GLF_color
+        %120 = OpCompositeConstruct %main_out %119
+        %118 = OpFunctionCall %void %tint_symbol_2 %120
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-derivative-uniform-vector-global-loop-count/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-derivative-uniform-vector-global-loop-count/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..d3e05f8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-derivative-uniform-vector-global-loop-count/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,93 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[block]]
+struct buf2 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> x_GLF_global_loop_count : i32;
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+[[group(0), binding(2)]] var<uniform> x_12 : buf2;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  var r : i32;
+  x_GLF_global_loop_count = 0;
+  let x_42 : f32 = x_7.x_GLF_uniform_float_values[0];
+  f = x_42;
+  let x_44 : i32 = x_10.x_GLF_uniform_int_values[1];
+  r = x_44;
+  loop {
+    let x_49 : i32 = r;
+    let x_51 : i32 = x_10.x_GLF_uniform_int_values[2];
+    if ((x_49 < x_51)) {
+    } else {
+      break;
+    }
+    let x_54 : i32 = x_GLF_global_loop_count;
+    x_GLF_global_loop_count = (x_54 + 1);
+    let x_57 : vec2<f32> = x_12.injectionSwitch;
+    let x_60 : f32 = f;
+    f = (x_60 + dpdx(x_57).y);
+
+    continuing {
+      let x_62 : i32 = r;
+      r = (x_62 + 1);
+    }
+  }
+  loop {
+    let x_68 : i32 = x_GLF_global_loop_count;
+    if ((x_68 < 100)) {
+    } else {
+      break;
+    }
+    let x_71 : i32 = x_GLF_global_loop_count;
+    x_GLF_global_loop_count = (x_71 + 1);
+    let x_74 : f32 = x_7.x_GLF_uniform_float_values[0];
+    let x_75 : f32 = f;
+    f = (x_75 + x_74);
+  }
+  let x_77 : f32 = f;
+  let x_79 : f32 = x_7.x_GLF_uniform_float_values[1];
+  if ((x_77 == x_79)) {
+    let x_85 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_88 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_91 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_94 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_85), f32(x_88), f32(x_91), f32(x_94));
+  } else {
+    let x_98 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_99 : f32 = f32(x_98);
+    x_GLF_color = vec4<f32>(x_99, x_99, x_99, x_99);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-derivative-uniform-vector-global-loop-count/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-derivative-uniform-vector-global-loop-count/0-opt.wgsl
new file mode 100644
index 0000000..d3e05f8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-derivative-uniform-vector-global-loop-count/0-opt.wgsl
@@ -0,0 +1,93 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[block]]
+struct buf2 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> x_GLF_global_loop_count : i32;
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+[[group(0), binding(2)]] var<uniform> x_12 : buf2;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  var r : i32;
+  x_GLF_global_loop_count = 0;
+  let x_42 : f32 = x_7.x_GLF_uniform_float_values[0];
+  f = x_42;
+  let x_44 : i32 = x_10.x_GLF_uniform_int_values[1];
+  r = x_44;
+  loop {
+    let x_49 : i32 = r;
+    let x_51 : i32 = x_10.x_GLF_uniform_int_values[2];
+    if ((x_49 < x_51)) {
+    } else {
+      break;
+    }
+    let x_54 : i32 = x_GLF_global_loop_count;
+    x_GLF_global_loop_count = (x_54 + 1);
+    let x_57 : vec2<f32> = x_12.injectionSwitch;
+    let x_60 : f32 = f;
+    f = (x_60 + dpdx(x_57).y);
+
+    continuing {
+      let x_62 : i32 = r;
+      r = (x_62 + 1);
+    }
+  }
+  loop {
+    let x_68 : i32 = x_GLF_global_loop_count;
+    if ((x_68 < 100)) {
+    } else {
+      break;
+    }
+    let x_71 : i32 = x_GLF_global_loop_count;
+    x_GLF_global_loop_count = (x_71 + 1);
+    let x_74 : f32 = x_7.x_GLF_uniform_float_values[0];
+    let x_75 : f32 = f;
+    f = (x_75 + x_74);
+  }
+  let x_77 : f32 = f;
+  let x_79 : f32 = x_7.x_GLF_uniform_float_values[1];
+  if ((x_77 == x_79)) {
+    let x_85 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_88 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_91 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_94 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_85), f32(x_88), f32(x_91), f32(x_94));
+  } else {
+    let x_98 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_99 : f32 = f32(x_98);
+    x_GLF_color = vec4<f32>(x_99, x_99, x_99, x_99);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-derivative-uniform-vector-global-loop-count/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-derivative-uniform-vector-global-loop-count/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..f469577
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-derivative-uniform-vector-global-loop-count/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,76 @@
+static int x_GLF_global_loop_count = 0;
+cbuffer cbuffer_x_7 : register(b1, space0) {
+  uint4 x_7[2];
+};
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[3];
+};
+cbuffer cbuffer_x_12 : register(b2, space0) {
+  uint4 x_12[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float f = 0.0f;
+  int r = 0;
+  x_GLF_global_loop_count = 0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_42 = asfloat(x_7[scalar_offset / 4][scalar_offset % 4]);
+  f = x_42;
+  const int x_44 = asint(x_10[1].x);
+  r = x_44;
+  while (true) {
+    const int x_49 = r;
+    const int x_51 = asint(x_10[2].x);
+    if ((x_49 < x_51)) {
+    } else {
+      break;
+    }
+    x_GLF_global_loop_count = (x_GLF_global_loop_count + 1);
+    const float2 x_57 = asfloat(x_12[0].xy);
+    f = (f + ddx(x_57).y);
+    {
+      r = (r + 1);
+    }
+  }
+  while (true) {
+    if ((x_GLF_global_loop_count < 100)) {
+    } else {
+      break;
+    }
+    x_GLF_global_loop_count = (x_GLF_global_loop_count + 1);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const float x_74 = asfloat(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    f = (f + x_74);
+  }
+  const float x_77 = f;
+  const float x_79 = asfloat(x_7[1].x);
+  if ((x_77 == x_79)) {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_85 = asint(x_10[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_88 = asint(x_10[1].x);
+    const int x_91 = asint(x_10[1].x);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_94 = asint(x_10[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    x_GLF_color = float4(float(x_85), float(x_88), float(x_91), float(x_94));
+  } else {
+    const int x_98 = asint(x_10[1].x);
+    const float x_99 = float(x_98);
+    x_GLF_color = float4(x_99, x_99, x_99, x_99);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-derivative-uniform-vector-global-loop-count/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-derivative-uniform-vector-global-loop-count/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..8361b24
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-derivative-uniform-vector-global-loop-count/0-opt.wgsl.expected.msl
@@ -0,0 +1,95 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct buf2 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_7, constant buf0& x_10, constant buf2& x_12, thread int* const tint_symbol_4, thread float4* const tint_symbol_5) {
+  float f = 0.0f;
+  int r = 0;
+  *(tint_symbol_4) = 0;
+  float const x_42 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  f = x_42;
+  int const x_44 = x_10.x_GLF_uniform_int_values.arr[1].el;
+  r = x_44;
+  while (true) {
+    int const x_49 = r;
+    int const x_51 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    if ((x_49 < x_51)) {
+    } else {
+      break;
+    }
+    int const x_54 = *(tint_symbol_4);
+    *(tint_symbol_4) = (x_54 + 1);
+    float2 const x_57 = x_12.injectionSwitch;
+    float const x_60 = f;
+    f = (x_60 + dfdx(x_57).y);
+    {
+      int const x_62 = r;
+      r = (x_62 + 1);
+    }
+  }
+  while (true) {
+    int const x_68 = *(tint_symbol_4);
+    if ((x_68 < 100)) {
+    } else {
+      break;
+    }
+    int const x_71 = *(tint_symbol_4);
+    *(tint_symbol_4) = (x_71 + 1);
+    float const x_74 = x_7.x_GLF_uniform_float_values.arr[0].el;
+    float const x_75 = f;
+    f = (x_75 + x_74);
+  }
+  float const x_77 = f;
+  float const x_79 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  if ((x_77 == x_79)) {
+    int const x_85 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    int const x_88 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_91 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_94 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_5) = float4(float(x_85), float(x_88), float(x_91), float(x_94));
+  } else {
+    int const x_98 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    float const x_99 = float(x_98);
+    *(tint_symbol_5) = float4(x_99, x_99, x_99, x_99);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_7 [[buffer(1)]], constant buf0& x_10 [[buffer(0)]], constant buf2& x_12 [[buffer(2)]]) {
+  thread int tint_symbol_6 = 0;
+  thread float4 tint_symbol_7 = 0.0f;
+  main_1(x_7, x_10, x_12, &(tint_symbol_6), &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-derivative-uniform-vector-global-loop-count/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-derivative-uniform-vector-global-loop-count/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..c816929
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-derivative-uniform-vector-global-loop-count/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,207 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 121
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_global_loop_count "x_GLF_global_loop_count"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_7 "x_7"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "injectionSwitch"
+               OpName %x_12 "x_12"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %r "r"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %buf2 Block
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %x_12 NonWritable
+               OpDecorate %x_12 DescriptorSet 0
+               OpDecorate %x_12 Binding 2
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+          %4 = OpConstantNull %int
+%x_GLF_global_loop_count = OpVariable %_ptr_Private_int Private %4
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_7 = OpVariable %_ptr_Uniform_buf1 Uniform
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v2float = OpTypeVector %float 2
+       %buf2 = OpTypeStruct %v2float
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+       %x_12 = OpVariable %_ptr_Uniform_buf2 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %24 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %24
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %24
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %33 = OpConstantNull %float
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %int_100 = OpConstant %int 100
+   %main_out = OpTypeStruct %v4float
+        %109 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %27
+         %30 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %33
+          %r = OpVariable %_ptr_Function_int Function %4
+               OpStore %x_GLF_global_loop_count %int_0
+         %39 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %40 = OpLoad %float %39
+               OpStore %f %40
+         %43 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %44 = OpLoad %int %43
+               OpStore %r %44
+               OpBranch %45
+         %45 = OpLabel
+               OpLoopMerge %46 %47 None
+               OpBranch %48
+         %48 = OpLabel
+         %49 = OpLoad %int %r
+         %51 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+         %52 = OpLoad %int %51
+         %53 = OpSLessThan %bool %49 %52
+               OpSelectionMerge %55 None
+               OpBranchConditional %53 %56 %57
+         %56 = OpLabel
+               OpBranch %55
+         %57 = OpLabel
+               OpBranch %46
+         %55 = OpLabel
+         %58 = OpLoad %int %x_GLF_global_loop_count
+         %59 = OpIAdd %int %58 %int_1
+               OpStore %x_GLF_global_loop_count %59
+         %61 = OpAccessChain %_ptr_Uniform_v2float %x_12 %uint_0
+         %62 = OpLoad %v2float %61
+         %63 = OpLoad %float %f
+         %64 = OpDPdx %v2float %62
+         %65 = OpCompositeExtract %float %64 1
+         %66 = OpFAdd %float %63 %65
+               OpStore %f %66
+               OpBranch %47
+         %47 = OpLabel
+         %67 = OpLoad %int %r
+         %68 = OpIAdd %int %67 %int_1
+               OpStore %r %68
+               OpBranch %45
+         %46 = OpLabel
+               OpBranch %69
+         %69 = OpLabel
+               OpLoopMerge %70 %71 None
+               OpBranch %72
+         %72 = OpLabel
+         %73 = OpLoad %int %x_GLF_global_loop_count
+         %75 = OpSLessThan %bool %73 %int_100
+               OpSelectionMerge %76 None
+               OpBranchConditional %75 %77 %78
+         %77 = OpLabel
+               OpBranch %76
+         %78 = OpLabel
+               OpBranch %70
+         %76 = OpLabel
+         %79 = OpLoad %int %x_GLF_global_loop_count
+         %80 = OpIAdd %int %79 %int_1
+               OpStore %x_GLF_global_loop_count %80
+         %81 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %82 = OpLoad %float %81
+         %83 = OpLoad %float %f
+         %84 = OpFAdd %float %83 %82
+               OpStore %f %84
+               OpBranch %71
+         %71 = OpLabel
+               OpBranch %69
+         %70 = OpLabel
+         %85 = OpLoad %float %f
+         %86 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %87 = OpLoad %float %86
+         %88 = OpFOrdEqual %bool %85 %87
+               OpSelectionMerge %89 None
+               OpBranchConditional %88 %90 %91
+         %90 = OpLabel
+         %92 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %93 = OpLoad %int %92
+         %94 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %95 = OpLoad %int %94
+         %96 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %97 = OpLoad %int %96
+         %98 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %99 = OpLoad %int %98
+        %100 = OpConvertSToF %float %93
+        %101 = OpConvertSToF %float %95
+        %102 = OpConvertSToF %float %97
+        %103 = OpConvertSToF %float %99
+        %104 = OpCompositeConstruct %v4float %100 %101 %102 %103
+               OpStore %x_GLF_color %104
+               OpBranch %89
+         %91 = OpLabel
+        %105 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %106 = OpLoad %int %105
+        %107 = OpConvertSToF %float %106
+        %108 = OpCompositeConstruct %v4float %107 %107 %107 %107
+               OpStore %x_GLF_color %108
+               OpBranch %89
+         %89 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %109
+%tint_symbol = OpFunctionParameter %main_out
+        %113 = OpLabel
+        %114 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %114
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %27
+        %116 = OpLabel
+        %117 = OpFunctionCall %void %main_1
+        %119 = OpLoad %v4float %x_GLF_color
+        %120 = OpCompositeConstruct %main_out %119
+        %118 = OpFunctionCall %void %tint_symbol_2 %120
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-derivative-uniform-vector-global-loop-count/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-derivative-uniform-vector-global-loop-count/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..d3e05f8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-derivative-uniform-vector-global-loop-count/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,93 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[block]]
+struct buf2 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> x_GLF_global_loop_count : i32;
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+[[group(0), binding(2)]] var<uniform> x_12 : buf2;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  var r : i32;
+  x_GLF_global_loop_count = 0;
+  let x_42 : f32 = x_7.x_GLF_uniform_float_values[0];
+  f = x_42;
+  let x_44 : i32 = x_10.x_GLF_uniform_int_values[1];
+  r = x_44;
+  loop {
+    let x_49 : i32 = r;
+    let x_51 : i32 = x_10.x_GLF_uniform_int_values[2];
+    if ((x_49 < x_51)) {
+    } else {
+      break;
+    }
+    let x_54 : i32 = x_GLF_global_loop_count;
+    x_GLF_global_loop_count = (x_54 + 1);
+    let x_57 : vec2<f32> = x_12.injectionSwitch;
+    let x_60 : f32 = f;
+    f = (x_60 + dpdx(x_57).y);
+
+    continuing {
+      let x_62 : i32 = r;
+      r = (x_62 + 1);
+    }
+  }
+  loop {
+    let x_68 : i32 = x_GLF_global_loop_count;
+    if ((x_68 < 100)) {
+    } else {
+      break;
+    }
+    let x_71 : i32 = x_GLF_global_loop_count;
+    x_GLF_global_loop_count = (x_71 + 1);
+    let x_74 : f32 = x_7.x_GLF_uniform_float_values[0];
+    let x_75 : f32 = f;
+    f = (x_75 + x_74);
+  }
+  let x_77 : f32 = f;
+  let x_79 : f32 = x_7.x_GLF_uniform_float_values[1];
+  if ((x_77 == x_79)) {
+    let x_85 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_88 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_91 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_94 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_85), f32(x_88), f32(x_91), f32(x_94));
+  } else {
+    let x_98 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_99 : f32 = f32(x_98);
+    x_GLF_color = vec4<f32>(x_99, x_99, x_99, x_99);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-descending-loop-min-max-always-zero/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-descending-loop-min-max-always-zero/0-opt.spvasm
new file mode 100644
index 0000000..4e0f99a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-descending-loop-min-max-always-zero/0-opt.spvasm
@@ -0,0 +1,118 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %f "f"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %a "a"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_int = OpTypePointer Function %int
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+      %int_2 = OpConstant %int 2
+         %34 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %14
+         %35 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function
+          %i = OpVariable %_ptr_Function_int Function
+          %a = OpVariable %_ptr_Function_float Function
+         %36 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %37 = OpLoad %float %36
+               OpStore %f %37
+         %38 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %39 = OpLoad %int %38
+               OpStore %i %39
+               OpBranch %40
+         %40 = OpLabel
+               OpLoopMerge %41 %42 None
+               OpBranch %43
+         %43 = OpLabel
+         %44 = OpLoad %int %i
+         %45 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %46 = OpLoad %int %45
+         %47 = OpSGreaterThan %bool %44 %46
+               OpBranchConditional %47 %48 %41
+         %48 = OpLabel
+         %49 = OpLoad %int %i
+         %50 = OpConvertSToF %float %49
+         %51 = OpExtInst %float %1 FMax %float_1 %50
+         %52 = OpFSub %float %float_1 %51
+               OpStore %a %52
+         %53 = OpLoad %float %a
+         %54 = OpExtInst %float %1 FMax %53 %float_0
+         %55 = OpExtInst %float %1 FMin %54 %float_0
+               OpStore %f %55
+               OpBranch %42
+         %42 = OpLabel
+         %56 = OpLoad %int %i
+         %57 = OpISub %int %56 %int_1
+               OpStore %i %57
+               OpBranch %40
+         %41 = OpLabel
+         %58 = OpLoad %float %f
+         %59 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %60 = OpLoad %float %59
+         %61 = OpFOrdEqual %bool %58 %60
+               OpSelectionMerge %62 None
+               OpBranchConditional %61 %63 %64
+         %63 = OpLabel
+         %65 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %66 = OpLoad %int %65
+         %67 = OpConvertSToF %float %66
+         %68 = OpLoad %float %f
+         %69 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %70 = OpLoad %int %69
+         %71 = OpConvertSToF %float %70
+         %72 = OpCompositeConstruct %v4float %67 %68 %71 %float_1
+               OpStore %_GLF_color %72
+               OpBranch %62
+         %64 = OpLabel
+               OpStore %_GLF_color %34
+               OpBranch %62
+         %62 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-descending-loop-min-max-always-zero/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-descending-loop-min-max-always-zero/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..d60898f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-descending-loop-min-max-always-zero/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,58 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+cbuffer cbuffer_x_9 : register(b1, space0) {
+  uint4 x_9[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float f = 0.0f;
+  int i = 0;
+  float a = 0.0f;
+  const float x_37 = asfloat(x_6[1].x);
+  f = x_37;
+  const int x_39 = asint(x_9[1].x);
+  i = x_39;
+  while (true) {
+    const int x_44 = i;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_46 = asint(x_9[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_44 > x_46)) {
+    } else {
+      break;
+    }
+    a = (1.0f - max(1.0f, float(i)));
+    f = min(max(a, 0.0f), 0.0f);
+    {
+      i = (i - 1);
+    }
+  }
+  const float x_58 = f;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_60 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_58 == x_60)) {
+    const int x_66 = asint(x_9[2].x);
+    const float x_68 = f;
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_70 = asint(x_9[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    x_GLF_color = float4(float(x_66), x_68, float(x_70), 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-descending-loop-min-max-always-zero/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-descending-loop-min-max-always-zero/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..c3d3e97
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-descending-loop-min-max-always-zero/0-opt.spvasm.expected.msl
@@ -0,0 +1,75 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_9, thread float4* const tint_symbol_4) {
+  float f = 0.0f;
+  int i = 0;
+  float a = 0.0f;
+  float const x_37 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  f = x_37;
+  int const x_39 = x_9.x_GLF_uniform_int_values.arr[1].el;
+  i = x_39;
+  while (true) {
+    int const x_44 = i;
+    int const x_46 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_44 > x_46)) {
+    } else {
+      break;
+    }
+    int const x_49 = i;
+    a = (1.0f - fmax(1.0f, float(x_49)));
+    float const x_53 = a;
+    f = fmin(fmax(x_53, 0.0f), 0.0f);
+    {
+      int const x_56 = i;
+      i = (x_56 - 1);
+    }
+  }
+  float const x_58 = f;
+  float const x_60 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_58 == x_60)) {
+    int const x_66 = x_9.x_GLF_uniform_int_values.arr[2].el;
+    float const x_68 = f;
+    int const x_70 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_66), x_68, float(x_70), 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_9 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-descending-loop-min-max-always-zero/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-descending-loop-min-max-always-zero/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..b1d5a29
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-descending-loop-min-max-always-zero/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,159 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 93
+; Schema: 0
+               OpCapability Shader
+         %55 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %i "i"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_9 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %26 = OpConstantNull %float
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+      %int_2 = OpConstant %int 2
+         %80 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %81 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %26
+          %i = OpVariable %_ptr_Function_int Function %29
+          %a = OpVariable %_ptr_Function_float Function %26
+         %34 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %35 = OpLoad %float %34
+               OpStore %f %35
+         %37 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %38 = OpLoad %int %37
+               OpStore %i %38
+               OpBranch %39
+         %39 = OpLabel
+               OpLoopMerge %40 %41 None
+               OpBranch %42
+         %42 = OpLabel
+         %43 = OpLoad %int %i
+         %45 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %46 = OpLoad %int %45
+         %47 = OpSGreaterThan %bool %43 %46
+               OpSelectionMerge %49 None
+               OpBranchConditional %47 %50 %51
+         %50 = OpLabel
+               OpBranch %49
+         %51 = OpLabel
+               OpBranch %40
+         %49 = OpLabel
+         %52 = OpLoad %int %i
+         %56 = OpConvertSToF %float %52
+         %54 = OpExtInst %float %55 NMax %float_1 %56
+         %57 = OpFSub %float %float_1 %54
+               OpStore %a %57
+         %58 = OpLoad %float %a
+         %60 = OpExtInst %float %55 NMax %58 %float_0
+         %59 = OpExtInst %float %55 NMin %60 %float_0
+               OpStore %f %59
+               OpBranch %41
+         %41 = OpLabel
+         %62 = OpLoad %int %i
+         %63 = OpISub %int %62 %int_1
+               OpStore %i %63
+               OpBranch %39
+         %40 = OpLabel
+         %64 = OpLoad %float %f
+         %65 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %66 = OpLoad %float %65
+         %67 = OpFOrdEqual %bool %64 %66
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %70
+         %69 = OpLabel
+         %72 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_2
+         %73 = OpLoad %int %72
+         %74 = OpLoad %float %f
+         %75 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %76 = OpLoad %int %75
+         %77 = OpConvertSToF %float %73
+         %78 = OpConvertSToF %float %76
+         %79 = OpCompositeConstruct %v4float %77 %74 %78 %float_1
+               OpStore %x_GLF_color %79
+               OpBranch %68
+         %70 = OpLabel
+               OpStore %x_GLF_color %80
+               OpBranch %68
+         %68 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %81
+%tint_symbol = OpFunctionParameter %main_out
+         %85 = OpLabel
+         %86 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %86
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+         %88 = OpLabel
+         %89 = OpFunctionCall %void %main_1
+         %91 = OpLoad %v4float %x_GLF_color
+         %92 = OpCompositeConstruct %main_out %91
+         %90 = OpFunctionCall %void %tint_symbol_2 %92
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-descending-loop-min-max-always-zero/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-descending-loop-min-max-always-zero/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..973feb9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-descending-loop-min-max-always-zero/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,68 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  var i : i32;
+  var a : f32;
+  let x_37 : f32 = x_6.x_GLF_uniform_float_values[1];
+  f = x_37;
+  let x_39 : i32 = x_9.x_GLF_uniform_int_values[1];
+  i = x_39;
+  loop {
+    let x_44 : i32 = i;
+    let x_46 : i32 = x_9.x_GLF_uniform_int_values[0];
+    if ((x_44 > x_46)) {
+    } else {
+      break;
+    }
+    let x_49 : i32 = i;
+    a = (1.0 - max(1.0, f32(x_49)));
+    let x_53 : f32 = a;
+    f = min(max(x_53, 0.0), 0.0);
+
+    continuing {
+      let x_56 : i32 = i;
+      i = (x_56 - 1);
+    }
+  }
+  let x_58 : f32 = f;
+  let x_60 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if ((x_58 == x_60)) {
+    let x_66 : i32 = x_9.x_GLF_uniform_int_values[2];
+    let x_68 : f32 = f;
+    let x_70 : i32 = x_9.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_66), x_68, f32(x_70), 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-descending-loop-min-max-always-zero/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-descending-loop-min-max-always-zero/0-opt.wgsl
new file mode 100644
index 0000000..973feb9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-descending-loop-min-max-always-zero/0-opt.wgsl
@@ -0,0 +1,68 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  var i : i32;
+  var a : f32;
+  let x_37 : f32 = x_6.x_GLF_uniform_float_values[1];
+  f = x_37;
+  let x_39 : i32 = x_9.x_GLF_uniform_int_values[1];
+  i = x_39;
+  loop {
+    let x_44 : i32 = i;
+    let x_46 : i32 = x_9.x_GLF_uniform_int_values[0];
+    if ((x_44 > x_46)) {
+    } else {
+      break;
+    }
+    let x_49 : i32 = i;
+    a = (1.0 - max(1.0, f32(x_49)));
+    let x_53 : f32 = a;
+    f = min(max(x_53, 0.0), 0.0);
+
+    continuing {
+      let x_56 : i32 = i;
+      i = (x_56 - 1);
+    }
+  }
+  let x_58 : f32 = f;
+  let x_60 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if ((x_58 == x_60)) {
+    let x_66 : i32 = x_9.x_GLF_uniform_int_values[2];
+    let x_68 : f32 = f;
+    let x_70 : i32 = x_9.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_66), x_68, f32(x_70), 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-descending-loop-min-max-always-zero/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-descending-loop-min-max-always-zero/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..d60898f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-descending-loop-min-max-always-zero/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,58 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+cbuffer cbuffer_x_9 : register(b1, space0) {
+  uint4 x_9[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float f = 0.0f;
+  int i = 0;
+  float a = 0.0f;
+  const float x_37 = asfloat(x_6[1].x);
+  f = x_37;
+  const int x_39 = asint(x_9[1].x);
+  i = x_39;
+  while (true) {
+    const int x_44 = i;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_46 = asint(x_9[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_44 > x_46)) {
+    } else {
+      break;
+    }
+    a = (1.0f - max(1.0f, float(i)));
+    f = min(max(a, 0.0f), 0.0f);
+    {
+      i = (i - 1);
+    }
+  }
+  const float x_58 = f;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_60 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_58 == x_60)) {
+    const int x_66 = asint(x_9[2].x);
+    const float x_68 = f;
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_70 = asint(x_9[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    x_GLF_color = float4(float(x_66), x_68, float(x_70), 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-descending-loop-min-max-always-zero/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-descending-loop-min-max-always-zero/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..c3d3e97
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-descending-loop-min-max-always-zero/0-opt.wgsl.expected.msl
@@ -0,0 +1,75 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_9, thread float4* const tint_symbol_4) {
+  float f = 0.0f;
+  int i = 0;
+  float a = 0.0f;
+  float const x_37 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  f = x_37;
+  int const x_39 = x_9.x_GLF_uniform_int_values.arr[1].el;
+  i = x_39;
+  while (true) {
+    int const x_44 = i;
+    int const x_46 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_44 > x_46)) {
+    } else {
+      break;
+    }
+    int const x_49 = i;
+    a = (1.0f - fmax(1.0f, float(x_49)));
+    float const x_53 = a;
+    f = fmin(fmax(x_53, 0.0f), 0.0f);
+    {
+      int const x_56 = i;
+      i = (x_56 - 1);
+    }
+  }
+  float const x_58 = f;
+  float const x_60 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_58 == x_60)) {
+    int const x_66 = x_9.x_GLF_uniform_int_values.arr[2].el;
+    float const x_68 = f;
+    int const x_70 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_66), x_68, float(x_70), 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_9 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-descending-loop-min-max-always-zero/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-descending-loop-min-max-always-zero/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..b1d5a29
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-descending-loop-min-max-always-zero/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,159 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 93
+; Schema: 0
+               OpCapability Shader
+         %55 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %i "i"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_9 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %26 = OpConstantNull %float
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+      %int_2 = OpConstant %int 2
+         %80 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %81 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %26
+          %i = OpVariable %_ptr_Function_int Function %29
+          %a = OpVariable %_ptr_Function_float Function %26
+         %34 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %35 = OpLoad %float %34
+               OpStore %f %35
+         %37 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %38 = OpLoad %int %37
+               OpStore %i %38
+               OpBranch %39
+         %39 = OpLabel
+               OpLoopMerge %40 %41 None
+               OpBranch %42
+         %42 = OpLabel
+         %43 = OpLoad %int %i
+         %45 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %46 = OpLoad %int %45
+         %47 = OpSGreaterThan %bool %43 %46
+               OpSelectionMerge %49 None
+               OpBranchConditional %47 %50 %51
+         %50 = OpLabel
+               OpBranch %49
+         %51 = OpLabel
+               OpBranch %40
+         %49 = OpLabel
+         %52 = OpLoad %int %i
+         %56 = OpConvertSToF %float %52
+         %54 = OpExtInst %float %55 NMax %float_1 %56
+         %57 = OpFSub %float %float_1 %54
+               OpStore %a %57
+         %58 = OpLoad %float %a
+         %60 = OpExtInst %float %55 NMax %58 %float_0
+         %59 = OpExtInst %float %55 NMin %60 %float_0
+               OpStore %f %59
+               OpBranch %41
+         %41 = OpLabel
+         %62 = OpLoad %int %i
+         %63 = OpISub %int %62 %int_1
+               OpStore %i %63
+               OpBranch %39
+         %40 = OpLabel
+         %64 = OpLoad %float %f
+         %65 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %66 = OpLoad %float %65
+         %67 = OpFOrdEqual %bool %64 %66
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %70
+         %69 = OpLabel
+         %72 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_2
+         %73 = OpLoad %int %72
+         %74 = OpLoad %float %f
+         %75 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %76 = OpLoad %int %75
+         %77 = OpConvertSToF %float %73
+         %78 = OpConvertSToF %float %76
+         %79 = OpCompositeConstruct %v4float %77 %74 %78 %float_1
+               OpStore %x_GLF_color %79
+               OpBranch %68
+         %70 = OpLabel
+               OpStore %x_GLF_color %80
+               OpBranch %68
+         %68 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %81
+%tint_symbol = OpFunctionParameter %main_out
+         %85 = OpLabel
+         %86 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %86
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+         %88 = OpLabel
+         %89 = OpFunctionCall %void %main_1
+         %91 = OpLoad %v4float %x_GLF_color
+         %92 = OpCompositeConstruct %main_out %91
+         %90 = OpFunctionCall %void %tint_symbol_2 %92
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-descending-loop-min-max-always-zero/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-descending-loop-min-max-always-zero/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..973feb9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-descending-loop-min-max-always-zero/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,68 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  var i : i32;
+  var a : f32;
+  let x_37 : f32 = x_6.x_GLF_uniform_float_values[1];
+  f = x_37;
+  let x_39 : i32 = x_9.x_GLF_uniform_int_values[1];
+  i = x_39;
+  loop {
+    let x_44 : i32 = i;
+    let x_46 : i32 = x_9.x_GLF_uniform_int_values[0];
+    if ((x_44 > x_46)) {
+    } else {
+      break;
+    }
+    let x_49 : i32 = i;
+    a = (1.0 - max(1.0, f32(x_49)));
+    let x_53 : f32 = a;
+    f = min(max(x_53, 0.0), 0.0);
+
+    continuing {
+      let x_56 : i32 = i;
+      i = (x_56 - 1);
+    }
+  }
+  let x_58 : f32 = f;
+  let x_60 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if ((x_58 == x_60)) {
+    let x_66 : i32 = x_9.x_GLF_uniform_int_values[2];
+    let x_68 : f32 = f;
+    let x_70 : i32 = x_9.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_66), x_68, f32(x_70), 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-divide-matrix-transpose-by-constant/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-divide-matrix-transpose-by-constant/0-opt.spvasm
new file mode 100644
index 0000000..2100420
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-divide-matrix-transpose-by-constant/0-opt.spvasm
@@ -0,0 +1,63 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %m "m"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %6 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%mat2v2float = OpTypeMatrix %v2float 2
+%_ptr_Function_mat2v2float = OpTypePointer Function %mat2v2float
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+         %13 = OpConstantComposite %v2float %float_1 %float_2
+    %float_3 = OpConstant %float 3
+    %float_4 = OpConstant %float 4
+         %16 = OpConstantComposite %v2float %float_3 %float_4
+         %17 = OpConstantComposite %mat2v2float %13 %16
+  %float_0_5 = OpConstant %float 0.5
+  %float_1_5 = OpConstant %float 1.5
+         %20 = OpConstantComposite %v2float %float_0_5 %float_1_5
+         %21 = OpConstantComposite %mat2v2float %20 %13
+       %bool = OpTypeBool
+     %v2bool = OpTypeVector %bool 2
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %27 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %28 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %6
+         %29 = OpLabel
+          %m = OpVariable %_ptr_Function_mat2v2float Function
+         %30 = OpTranspose %mat2v2float %17
+         %31 = OpFDiv %float %float_1 %float_2
+         %32 = OpMatrixTimesScalar %mat2v2float %30 %31
+               OpStore %m %32
+         %33 = OpLoad %mat2v2float %m
+         %34 = OpCompositeExtract %v2float %33 0
+         %35 = OpCompositeExtract %v2float %21 0
+         %36 = OpFOrdEqual %v2bool %34 %35
+         %37 = OpAll %bool %36
+         %38 = OpCompositeExtract %v2float %33 1
+         %39 = OpCompositeExtract %v2float %21 1
+         %40 = OpFOrdEqual %v2bool %38 %39
+         %41 = OpAll %bool %40
+         %42 = OpLogicalAnd %bool %37 %41
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %45
+         %44 = OpLabel
+               OpStore %_GLF_color %27
+               OpBranch %43
+         %45 = OpLabel
+               OpStore %_GLF_color %28
+               OpBranch %43
+         %43 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-divide-matrix-transpose-by-constant/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-divide-matrix-transpose-by-constant/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..c9c5e08
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-divide-matrix-transpose-by-constant/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,31 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2x2 m = float2x2(0.0f, 0.0f, 0.0f, 0.0f);
+  m = (transpose(float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f))) * (1.0f / 2.0f));
+  const float2x2 x_33 = m;
+  bool tint_tmp = all((x_33[0u] == float2x2(float2(0.5f, 1.5f), float2(1.0f, 2.0f))[0u]));
+  if (tint_tmp) {
+    tint_tmp = all((x_33[1u] == float2x2(float2(0.5f, 1.5f), float2(1.0f, 2.0f))[1u]));
+  }
+  if ((tint_tmp)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-divide-matrix-transpose-by-constant/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-divide-matrix-transpose-by-constant/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..6ff0e42
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-divide-matrix-transpose-by-constant/0-opt.spvasm.expected.msl
@@ -0,0 +1,30 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  float2x2 m = float2x2(0.0f);
+  m = (transpose(float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f))) * (1.0f / 2.0f));
+  float2x2 const x_33 = m;
+  if ((all((x_33[0u] == float2x2(float2(0.5f, 1.5f), float2(1.0f, 2.0f))[0u])) && all((x_33[1u] == float2x2(float2(0.5f, 1.5f), float2(1.0f, 2.0f))[1u])))) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-divide-matrix-transpose-by-constant/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-divide-matrix-transpose-by-constant/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..e11c805
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-divide-matrix-transpose-by-constant/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,102 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 66
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %m "m"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%mat2v2float = OpTypeMatrix %v2float 2
+%_ptr_Function_mat2v2float = OpTypePointer Function %mat2v2float
+         %16 = OpConstantNull %mat2v2float
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+         %20 = OpConstantComposite %v2float %float_1 %float_2
+    %float_3 = OpConstant %float 3
+    %float_4 = OpConstant %float 4
+         %23 = OpConstantComposite %v2float %float_3 %float_4
+         %24 = OpConstantComposite %mat2v2float %20 %23
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+  %float_0_5 = OpConstant %float 0.5
+  %float_1_5 = OpConstant %float 1.5
+         %35 = OpConstantComposite %v2float %float_0_5 %float_1_5
+         %36 = OpConstantComposite %mat2v2float %35 %20
+     %v2bool = OpTypeVector %bool 2
+     %uint_1 = OpConstant %uint 1
+    %float_0 = OpConstant %float 0
+         %52 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %53 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %54 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %m = OpVariable %_ptr_Function_mat2v2float Function %16
+         %17 = OpTranspose %mat2v2float %24
+         %25 = OpFDiv %float %float_1 %float_2
+         %26 = OpMatrixTimesScalar %mat2v2float %17 %25
+               OpStore %m %26
+         %27 = OpLoad %mat2v2float %m
+         %32 = OpCompositeExtract %v2float %27 0
+         %37 = OpCompositeExtract %v2float %36 0
+         %38 = OpFOrdEqual %v2bool %32 %37
+         %28 = OpAll %bool %38
+               OpSelectionMerge %40 None
+               OpBranchConditional %28 %41 %40
+         %41 = OpLabel
+         %44 = OpCompositeExtract %v2float %27 1
+         %45 = OpCompositeExtract %v2float %36 1
+         %46 = OpFOrdEqual %v2bool %44 %45
+         %42 = OpAll %bool %46
+               OpBranch %40
+         %40 = OpLabel
+         %47 = OpPhi %bool %28 %11 %42 %41
+               OpSelectionMerge %48 None
+               OpBranchConditional %47 %49 %50
+         %49 = OpLabel
+               OpStore %x_GLF_color %52
+               OpBranch %48
+         %50 = OpLabel
+               OpStore %x_GLF_color %53
+               OpBranch %48
+         %48 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %54
+%tint_symbol = OpFunctionParameter %main_out
+         %58 = OpLabel
+         %59 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %59
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %61 = OpLabel
+         %62 = OpFunctionCall %void %main_1
+         %64 = OpLoad %v4float %x_GLF_color
+         %65 = OpCompositeConstruct %main_out %64
+         %63 = OpFunctionCall %void %tint_symbol_2 %65
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-divide-matrix-transpose-by-constant/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-divide-matrix-transpose-by-constant/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..af5a1c1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-divide-matrix-transpose-by-constant/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,24 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m : mat2x2<f32>;
+  m = (transpose(mat2x2<f32>(vec2<f32>(1.0, 2.0), vec2<f32>(3.0, 4.0))) * (1.0 / 2.0));
+  let x_33 : mat2x2<f32> = m;
+  if ((all((x_33[0u] == mat2x2<f32>(vec2<f32>(0.5, 1.5), vec2<f32>(1.0, 2.0))[0u])) && all((x_33[1u] == mat2x2<f32>(vec2<f32>(0.5, 1.5), vec2<f32>(1.0, 2.0))[1u])))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-divide-matrix-transpose-by-constant/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-divide-matrix-transpose-by-constant/0-opt.wgsl
new file mode 100644
index 0000000..af5a1c1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-divide-matrix-transpose-by-constant/0-opt.wgsl
@@ -0,0 +1,24 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m : mat2x2<f32>;
+  m = (transpose(mat2x2<f32>(vec2<f32>(1.0, 2.0), vec2<f32>(3.0, 4.0))) * (1.0 / 2.0));
+  let x_33 : mat2x2<f32> = m;
+  if ((all((x_33[0u] == mat2x2<f32>(vec2<f32>(0.5, 1.5), vec2<f32>(1.0, 2.0))[0u])) && all((x_33[1u] == mat2x2<f32>(vec2<f32>(0.5, 1.5), vec2<f32>(1.0, 2.0))[1u])))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-divide-matrix-transpose-by-constant/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-divide-matrix-transpose-by-constant/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..c9c5e08
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-divide-matrix-transpose-by-constant/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,31 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2x2 m = float2x2(0.0f, 0.0f, 0.0f, 0.0f);
+  m = (transpose(float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f))) * (1.0f / 2.0f));
+  const float2x2 x_33 = m;
+  bool tint_tmp = all((x_33[0u] == float2x2(float2(0.5f, 1.5f), float2(1.0f, 2.0f))[0u]));
+  if (tint_tmp) {
+    tint_tmp = all((x_33[1u] == float2x2(float2(0.5f, 1.5f), float2(1.0f, 2.0f))[1u]));
+  }
+  if ((tint_tmp)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-divide-matrix-transpose-by-constant/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-divide-matrix-transpose-by-constant/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..6ff0e42
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-divide-matrix-transpose-by-constant/0-opt.wgsl.expected.msl
@@ -0,0 +1,30 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  float2x2 m = float2x2(0.0f);
+  m = (transpose(float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f))) * (1.0f / 2.0f));
+  float2x2 const x_33 = m;
+  if ((all((x_33[0u] == float2x2(float2(0.5f, 1.5f), float2(1.0f, 2.0f))[0u])) && all((x_33[1u] == float2x2(float2(0.5f, 1.5f), float2(1.0f, 2.0f))[1u])))) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-divide-matrix-transpose-by-constant/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-divide-matrix-transpose-by-constant/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..e11c805
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-divide-matrix-transpose-by-constant/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,102 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 66
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %m "m"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%mat2v2float = OpTypeMatrix %v2float 2
+%_ptr_Function_mat2v2float = OpTypePointer Function %mat2v2float
+         %16 = OpConstantNull %mat2v2float
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+         %20 = OpConstantComposite %v2float %float_1 %float_2
+    %float_3 = OpConstant %float 3
+    %float_4 = OpConstant %float 4
+         %23 = OpConstantComposite %v2float %float_3 %float_4
+         %24 = OpConstantComposite %mat2v2float %20 %23
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+  %float_0_5 = OpConstant %float 0.5
+  %float_1_5 = OpConstant %float 1.5
+         %35 = OpConstantComposite %v2float %float_0_5 %float_1_5
+         %36 = OpConstantComposite %mat2v2float %35 %20
+     %v2bool = OpTypeVector %bool 2
+     %uint_1 = OpConstant %uint 1
+    %float_0 = OpConstant %float 0
+         %52 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %53 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %54 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %m = OpVariable %_ptr_Function_mat2v2float Function %16
+         %17 = OpTranspose %mat2v2float %24
+         %25 = OpFDiv %float %float_1 %float_2
+         %26 = OpMatrixTimesScalar %mat2v2float %17 %25
+               OpStore %m %26
+         %27 = OpLoad %mat2v2float %m
+         %32 = OpCompositeExtract %v2float %27 0
+         %37 = OpCompositeExtract %v2float %36 0
+         %38 = OpFOrdEqual %v2bool %32 %37
+         %28 = OpAll %bool %38
+               OpSelectionMerge %40 None
+               OpBranchConditional %28 %41 %40
+         %41 = OpLabel
+         %44 = OpCompositeExtract %v2float %27 1
+         %45 = OpCompositeExtract %v2float %36 1
+         %46 = OpFOrdEqual %v2bool %44 %45
+         %42 = OpAll %bool %46
+               OpBranch %40
+         %40 = OpLabel
+         %47 = OpPhi %bool %28 %11 %42 %41
+               OpSelectionMerge %48 None
+               OpBranchConditional %47 %49 %50
+         %49 = OpLabel
+               OpStore %x_GLF_color %52
+               OpBranch %48
+         %50 = OpLabel
+               OpStore %x_GLF_color %53
+               OpBranch %48
+         %48 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %54
+%tint_symbol = OpFunctionParameter %main_out
+         %58 = OpLabel
+         %59 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %59
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %61 = OpLabel
+         %62 = OpFunctionCall %void %main_1
+         %64 = OpLoad %v4float %x_GLF_color
+         %65 = OpCompositeConstruct %main_out %64
+         %63 = OpFunctionCall %void %tint_symbol_2 %65
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-divide-matrix-transpose-by-constant/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-divide-matrix-transpose-by-constant/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..af5a1c1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-divide-matrix-transpose-by-constant/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,24 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m : mat2x2<f32>;
+  m = (transpose(mat2x2<f32>(vec2<f32>(1.0, 2.0), vec2<f32>(3.0, 4.0))) * (1.0 / 2.0));
+  let x_33 : mat2x2<f32> = m;
+  if ((all((x_33[0u] == mat2x2<f32>(vec2<f32>(0.5, 1.5), vec2<f32>(1.0, 2.0))[0u])) && all((x_33[1u] == mat2x2<f32>(vec2<f32>(0.5, 1.5), vec2<f32>(1.0, 2.0))[1u])))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-double-if-true-in-loop/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-double-if-true-in-loop/0-opt.spvasm
new file mode 100644
index 0000000..809a678
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-double-if-true-in-loop/0-opt.spvasm
@@ -0,0 +1,112 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %func_ "func("
+               OpName %i "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+         %12 = OpTypeFunction %int
+%_ptr_Function_int = OpTypePointer Function %int
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+      %int_2 = OpConstant %int 2
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %10
+         %26 = OpLabel
+         %27 = OpFunctionCall %int %func_
+         %28 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %29 = OpLoad %int %28
+         %30 = OpIEqual %bool %27 %29
+               OpSelectionMerge %31 None
+               OpBranchConditional %30 %32 %33
+         %32 = OpLabel
+         %34 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %35 = OpLoad %int %34
+         %36 = OpConvertSToF %float %35
+         %37 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %38 = OpLoad %int %37
+         %39 = OpConvertSToF %float %38
+         %40 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %41 = OpLoad %int %40
+         %42 = OpConvertSToF %float %41
+         %43 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %44 = OpLoad %int %43
+         %45 = OpConvertSToF %float %44
+         %46 = OpCompositeConstruct %v4float %36 %39 %42 %45
+               OpStore %_GLF_color %46
+               OpBranch %31
+         %33 = OpLabel
+         %47 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %48 = OpLoad %int %47
+         %49 = OpConvertSToF %float %48
+         %50 = OpCompositeConstruct %v4float %49 %49 %49 %49
+               OpStore %_GLF_color %50
+               OpBranch %31
+         %31 = OpLabel
+               OpReturn
+               OpFunctionEnd
+      %func_ = OpFunction %int None %12
+         %51 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+         %52 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %53 = OpLoad %int %52
+               OpStore %i %53
+               OpBranch %54
+         %54 = OpLabel
+               OpLoopMerge %55 %56 None
+               OpBranch %57
+         %57 = OpLabel
+         %58 = OpLoad %int %i
+         %59 = OpIAdd %int %58 %int_1
+               OpStore %i %59
+               OpSelectionMerge %60 None
+               OpBranchConditional %true %61 %60
+         %61 = OpLabel
+               OpSelectionMerge %62 None
+               OpBranchConditional %true %63 %62
+         %63 = OpLabel
+         %64 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %65 = OpLoad %int %64
+               OpReturnValue %65
+         %62 = OpLabel
+               OpBranch %60
+         %60 = OpLabel
+               OpBranch %56
+         %56 = OpLabel
+         %66 = OpLoad %int %i
+         %67 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %68 = OpLoad %int %67
+         %69 = OpSLessThan %bool %66 %68
+               OpBranchConditional %69 %54 %55
+         %55 = OpLabel
+         %70 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %71 = OpLoad %int %70
+               OpReturnValue %71
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-double-if-true-in-loop/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-double-if-true-in-loop/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..6878f83
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-double-if-true-in-loop/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,65 @@
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+int func_() {
+  int i = 0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_53 = asint(x_7[scalar_offset / 4][scalar_offset % 4]);
+  i = x_53;
+  while (true) {
+    i = (i + 1);
+    if (true) {
+      if (true) {
+        const int x_65 = asint(x_7[2].x);
+        return x_65;
+      }
+    }
+    {
+      const int x_66 = i;
+      const int x_68 = asint(x_7[1].x);
+      if ((x_66 < x_68)) {
+      } else {
+        break;
+      }
+    }
+  }
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_71 = asint(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  return x_71;
+}
+
+void main_1() {
+  const int x_27 = func_();
+  const int x_29 = asint(x_7[2].x);
+  if ((x_27 == x_29)) {
+    const int x_35 = asint(x_7[2].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_38 = asint(x_7[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_41 = asint(x_7[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const int x_44 = asint(x_7[2].x);
+    x_GLF_color = float4(float(x_35), float(x_38), float(x_41), float(x_44));
+  } else {
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_48 = asint(x_7[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const float x_49 = float(x_48);
+    x_GLF_color = float4(x_49, x_49, x_49, x_49);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-double-if-true-in-loop/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-double-if-true-in-loop/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..2f4c481
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-double-if-true-in-loop/0-opt.spvasm.expected.msl
@@ -0,0 +1,71 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int func_(constant buf0& x_7) {
+  int i = 0;
+  int const x_53 = x_7.x_GLF_uniform_int_values.arr[0].el;
+  i = x_53;
+  while (true) {
+    int const x_58 = i;
+    i = (x_58 + 1);
+    if (true) {
+      if (true) {
+        int const x_65 = x_7.x_GLF_uniform_int_values.arr[2].el;
+        return x_65;
+      }
+    }
+    {
+      int const x_66 = i;
+      int const x_68 = x_7.x_GLF_uniform_int_values.arr[1].el;
+      if ((x_66 < x_68)) {
+      } else {
+        break;
+      }
+    }
+  }
+  int const x_71 = x_7.x_GLF_uniform_int_values.arr[0].el;
+  return x_71;
+}
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_4) {
+  int const x_27 = func_(x_7);
+  int const x_29 = x_7.x_GLF_uniform_int_values.arr[2].el;
+  if ((x_27 == x_29)) {
+    int const x_35 = x_7.x_GLF_uniform_int_values.arr[2].el;
+    int const x_38 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_41 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_44 = x_7.x_GLF_uniform_int_values.arr[2].el;
+    *(tint_symbol_4) = float4(float(x_35), float(x_38), float(x_41), float(x_44));
+  } else {
+    int const x_48 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    float const x_49 = float(x_48);
+    *(tint_symbol_4) = float4(x_49, x_49, x_49, x_49);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-double-if-true-in-loop/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-double-if-true-in-loop/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..ef74140
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-double-if-true-in-loop/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,157 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 91
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_ "func_"
+               OpName %i "i"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+         %15 = OpTypeFunction %int
+%_ptr_Function_int = OpTypePointer Function %int
+         %20 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+      %int_2 = OpConstant %int 2
+       %void = OpTypeVoid
+         %51 = OpTypeFunction %void
+   %main_out = OpTypeStruct %v4float
+         %79 = OpTypeFunction %void %main_out
+      %func_ = OpFunction %int None %15
+         %17 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %20
+         %24 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %25 = OpLoad %int %24
+               OpStore %i %25
+               OpBranch %26
+         %26 = OpLabel
+               OpLoopMerge %27 %28 None
+               OpBranch %29
+         %29 = OpLabel
+         %30 = OpLoad %int %i
+         %32 = OpIAdd %int %30 %int_1
+               OpStore %i %32
+               OpSelectionMerge %35 None
+               OpBranchConditional %true %36 %35
+         %36 = OpLabel
+               OpSelectionMerge %37 None
+               OpBranchConditional %true %38 %37
+         %38 = OpLabel
+         %40 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %41 = OpLoad %int %40
+               OpReturnValue %41
+         %37 = OpLabel
+               OpBranch %35
+         %35 = OpLabel
+               OpBranch %28
+         %28 = OpLabel
+         %42 = OpLoad %int %i
+         %43 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %44 = OpLoad %int %43
+         %45 = OpSLessThan %bool %42 %44
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %48
+         %47 = OpLabel
+               OpBranch %46
+         %48 = OpLabel
+               OpBranch %27
+         %46 = OpLabel
+               OpBranch %26
+         %27 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %50 = OpLoad %int %49
+               OpReturnValue %50
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %51
+         %54 = OpLabel
+         %55 = OpFunctionCall %int %func_
+         %56 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %57 = OpLoad %int %56
+         %58 = OpIEqual %bool %55 %57
+               OpSelectionMerge %59 None
+               OpBranchConditional %58 %60 %61
+         %60 = OpLabel
+         %62 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %63 = OpLoad %int %62
+         %64 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %65 = OpLoad %int %64
+         %66 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %67 = OpLoad %int %66
+         %68 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %69 = OpLoad %int %68
+         %70 = OpConvertSToF %float %63
+         %71 = OpConvertSToF %float %65
+         %72 = OpConvertSToF %float %67
+         %73 = OpConvertSToF %float %69
+         %74 = OpCompositeConstruct %v4float %70 %71 %72 %73
+               OpStore %x_GLF_color %74
+               OpBranch %59
+         %61 = OpLabel
+         %75 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %76 = OpLoad %int %75
+         %77 = OpConvertSToF %float %76
+         %78 = OpCompositeConstruct %v4float %77 %77 %77 %77
+               OpStore %x_GLF_color %78
+               OpBranch %59
+         %59 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %79
+%tint_symbol = OpFunctionParameter %main_out
+         %83 = OpLabel
+         %84 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %84
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %51
+         %86 = OpLabel
+         %87 = OpFunctionCall %void %main_1
+         %89 = OpLoad %v4float %x_GLF_color
+         %90 = OpCompositeConstruct %main_out %89
+         %88 = OpFunctionCall %void %tint_symbol_2 %90
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 28[%28] is not post dominated by the back-edge block 46[%46]
+  %46 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-double-if-true-in-loop/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-double-if-true-in-loop/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..cb4c4d4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-double-if-true-in-loop/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,65 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> i32 {
+  var i : i32;
+  let x_53 : i32 = x_7.x_GLF_uniform_int_values[0];
+  i = x_53;
+  loop {
+    let x_58 : i32 = i;
+    i = (x_58 + 1);
+    if (true) {
+      if (true) {
+        let x_65 : i32 = x_7.x_GLF_uniform_int_values[2];
+        return x_65;
+      }
+    }
+
+    continuing {
+      let x_66 : i32 = i;
+      let x_68 : i32 = x_7.x_GLF_uniform_int_values[1];
+      if ((x_66 < x_68)) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_71 : i32 = x_7.x_GLF_uniform_int_values[0];
+  return x_71;
+}
+
+fn main_1() {
+  let x_27 : i32 = func_();
+  let x_29 : i32 = x_7.x_GLF_uniform_int_values[2];
+  if ((x_27 == x_29)) {
+    let x_35 : i32 = x_7.x_GLF_uniform_int_values[2];
+    let x_38 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_41 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_44 : i32 = x_7.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_35), f32(x_38), f32(x_41), f32(x_44));
+  } else {
+    let x_48 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_49 : f32 = f32(x_48);
+    x_GLF_color = vec4<f32>(x_49, x_49, x_49, x_49);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-double-if-true-in-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-double-if-true-in-loop/0-opt.wgsl
new file mode 100644
index 0000000..cb4c4d4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-double-if-true-in-loop/0-opt.wgsl
@@ -0,0 +1,65 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> i32 {
+  var i : i32;
+  let x_53 : i32 = x_7.x_GLF_uniform_int_values[0];
+  i = x_53;
+  loop {
+    let x_58 : i32 = i;
+    i = (x_58 + 1);
+    if (true) {
+      if (true) {
+        let x_65 : i32 = x_7.x_GLF_uniform_int_values[2];
+        return x_65;
+      }
+    }
+
+    continuing {
+      let x_66 : i32 = i;
+      let x_68 : i32 = x_7.x_GLF_uniform_int_values[1];
+      if ((x_66 < x_68)) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_71 : i32 = x_7.x_GLF_uniform_int_values[0];
+  return x_71;
+}
+
+fn main_1() {
+  let x_27 : i32 = func_();
+  let x_29 : i32 = x_7.x_GLF_uniform_int_values[2];
+  if ((x_27 == x_29)) {
+    let x_35 : i32 = x_7.x_GLF_uniform_int_values[2];
+    let x_38 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_41 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_44 : i32 = x_7.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_35), f32(x_38), f32(x_41), f32(x_44));
+  } else {
+    let x_48 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_49 : f32 = f32(x_48);
+    x_GLF_color = vec4<f32>(x_49, x_49, x_49, x_49);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-double-if-true-in-loop/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-double-if-true-in-loop/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..6878f83
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-double-if-true-in-loop/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,65 @@
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+int func_() {
+  int i = 0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_53 = asint(x_7[scalar_offset / 4][scalar_offset % 4]);
+  i = x_53;
+  while (true) {
+    i = (i + 1);
+    if (true) {
+      if (true) {
+        const int x_65 = asint(x_7[2].x);
+        return x_65;
+      }
+    }
+    {
+      const int x_66 = i;
+      const int x_68 = asint(x_7[1].x);
+      if ((x_66 < x_68)) {
+      } else {
+        break;
+      }
+    }
+  }
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_71 = asint(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  return x_71;
+}
+
+void main_1() {
+  const int x_27 = func_();
+  const int x_29 = asint(x_7[2].x);
+  if ((x_27 == x_29)) {
+    const int x_35 = asint(x_7[2].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_38 = asint(x_7[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_41 = asint(x_7[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const int x_44 = asint(x_7[2].x);
+    x_GLF_color = float4(float(x_35), float(x_38), float(x_41), float(x_44));
+  } else {
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_48 = asint(x_7[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const float x_49 = float(x_48);
+    x_GLF_color = float4(x_49, x_49, x_49, x_49);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-double-if-true-in-loop/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-double-if-true-in-loop/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..2f4c481
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-double-if-true-in-loop/0-opt.wgsl.expected.msl
@@ -0,0 +1,71 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int func_(constant buf0& x_7) {
+  int i = 0;
+  int const x_53 = x_7.x_GLF_uniform_int_values.arr[0].el;
+  i = x_53;
+  while (true) {
+    int const x_58 = i;
+    i = (x_58 + 1);
+    if (true) {
+      if (true) {
+        int const x_65 = x_7.x_GLF_uniform_int_values.arr[2].el;
+        return x_65;
+      }
+    }
+    {
+      int const x_66 = i;
+      int const x_68 = x_7.x_GLF_uniform_int_values.arr[1].el;
+      if ((x_66 < x_68)) {
+      } else {
+        break;
+      }
+    }
+  }
+  int const x_71 = x_7.x_GLF_uniform_int_values.arr[0].el;
+  return x_71;
+}
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_4) {
+  int const x_27 = func_(x_7);
+  int const x_29 = x_7.x_GLF_uniform_int_values.arr[2].el;
+  if ((x_27 == x_29)) {
+    int const x_35 = x_7.x_GLF_uniform_int_values.arr[2].el;
+    int const x_38 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_41 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_44 = x_7.x_GLF_uniform_int_values.arr[2].el;
+    *(tint_symbol_4) = float4(float(x_35), float(x_38), float(x_41), float(x_44));
+  } else {
+    int const x_48 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    float const x_49 = float(x_48);
+    *(tint_symbol_4) = float4(x_49, x_49, x_49, x_49);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-double-if-true-in-loop/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-double-if-true-in-loop/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..ef74140
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-double-if-true-in-loop/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,157 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 91
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_ "func_"
+               OpName %i "i"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+         %15 = OpTypeFunction %int
+%_ptr_Function_int = OpTypePointer Function %int
+         %20 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+      %int_2 = OpConstant %int 2
+       %void = OpTypeVoid
+         %51 = OpTypeFunction %void
+   %main_out = OpTypeStruct %v4float
+         %79 = OpTypeFunction %void %main_out
+      %func_ = OpFunction %int None %15
+         %17 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %20
+         %24 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %25 = OpLoad %int %24
+               OpStore %i %25
+               OpBranch %26
+         %26 = OpLabel
+               OpLoopMerge %27 %28 None
+               OpBranch %29
+         %29 = OpLabel
+         %30 = OpLoad %int %i
+         %32 = OpIAdd %int %30 %int_1
+               OpStore %i %32
+               OpSelectionMerge %35 None
+               OpBranchConditional %true %36 %35
+         %36 = OpLabel
+               OpSelectionMerge %37 None
+               OpBranchConditional %true %38 %37
+         %38 = OpLabel
+         %40 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %41 = OpLoad %int %40
+               OpReturnValue %41
+         %37 = OpLabel
+               OpBranch %35
+         %35 = OpLabel
+               OpBranch %28
+         %28 = OpLabel
+         %42 = OpLoad %int %i
+         %43 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %44 = OpLoad %int %43
+         %45 = OpSLessThan %bool %42 %44
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %48
+         %47 = OpLabel
+               OpBranch %46
+         %48 = OpLabel
+               OpBranch %27
+         %46 = OpLabel
+               OpBranch %26
+         %27 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %50 = OpLoad %int %49
+               OpReturnValue %50
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %51
+         %54 = OpLabel
+         %55 = OpFunctionCall %int %func_
+         %56 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %57 = OpLoad %int %56
+         %58 = OpIEqual %bool %55 %57
+               OpSelectionMerge %59 None
+               OpBranchConditional %58 %60 %61
+         %60 = OpLabel
+         %62 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %63 = OpLoad %int %62
+         %64 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %65 = OpLoad %int %64
+         %66 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %67 = OpLoad %int %66
+         %68 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %69 = OpLoad %int %68
+         %70 = OpConvertSToF %float %63
+         %71 = OpConvertSToF %float %65
+         %72 = OpConvertSToF %float %67
+         %73 = OpConvertSToF %float %69
+         %74 = OpCompositeConstruct %v4float %70 %71 %72 %73
+               OpStore %x_GLF_color %74
+               OpBranch %59
+         %61 = OpLabel
+         %75 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %76 = OpLoad %int %75
+         %77 = OpConvertSToF %float %76
+         %78 = OpCompositeConstruct %v4float %77 %77 %77 %77
+               OpStore %x_GLF_color %78
+               OpBranch %59
+         %59 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %79
+%tint_symbol = OpFunctionParameter %main_out
+         %83 = OpLabel
+         %84 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %84
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %51
+         %86 = OpLabel
+         %87 = OpFunctionCall %void %main_1
+         %89 = OpLoad %v4float %x_GLF_color
+         %90 = OpCompositeConstruct %main_out %89
+         %88 = OpFunctionCall %void %tint_symbol_2 %90
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 28[%28] is not post dominated by the back-edge block 46[%46]
+  %46 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-double-if-true-in-loop/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-double-if-true-in-loop/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..cb4c4d4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-double-if-true-in-loop/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,65 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> i32 {
+  var i : i32;
+  let x_53 : i32 = x_7.x_GLF_uniform_int_values[0];
+  i = x_53;
+  loop {
+    let x_58 : i32 = i;
+    i = (x_58 + 1);
+    if (true) {
+      if (true) {
+        let x_65 : i32 = x_7.x_GLF_uniform_int_values[2];
+        return x_65;
+      }
+    }
+
+    continuing {
+      let x_66 : i32 = i;
+      let x_68 : i32 = x_7.x_GLF_uniform_int_values[1];
+      if ((x_66 < x_68)) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_71 : i32 = x_7.x_GLF_uniform_int_values[0];
+  return x_71;
+}
+
+fn main_1() {
+  let x_27 : i32 = func_();
+  let x_29 : i32 = x_7.x_GLF_uniform_int_values[2];
+  if ((x_27 == x_29)) {
+    let x_35 : i32 = x_7.x_GLF_uniform_int_values[2];
+    let x_38 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_41 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_44 : i32 = x_7.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_35), f32(x_38), f32(x_41), f32(x_44));
+  } else {
+    let x_48 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_49 : f32 = f32(x_48);
+    x_GLF_color = vec4<f32>(x_49, x_49, x_49, x_49);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-empty-loop-minus-one-modulo-variable-one/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-empty-loop-minus-one-modulo-variable-one/0-opt.spvasm
new file mode 100644
index 0000000..091e8c0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-empty-loop-minus-one-modulo-variable-one/0-opt.spvasm
@@ -0,0 +1,148 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %arr "arr"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+      %int_9 = OpConstant %int 9
+     %int_10 = OpConstant %int 10
+         %27 = OpConstantComposite %_arr_int_uint_10 %int_1 %int_2 %int_3 %int_4 %int_5 %int_6 %int_7 %int_8 %int_9 %int_10
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+     %int_n1 = OpConstant %int -1
+      %v2int = OpTypeVector %int 2
+     %uint_1 = OpConstant %uint 1
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %11
+         %40 = OpLabel
+        %arr = OpVariable %_ptr_Function__arr_int_uint_10 Function
+          %a = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+               OpStore %arr %27
+               OpStore %a %int_0
+         %41 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %42 = OpLoad %int %41
+         %43 = OpAccessChain %_ptr_Function_int %arr %42
+         %44 = OpLoad %int %43
+         %45 = OpIEqual %bool %44 %int_2
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %46
+         %47 = OpLabel
+         %48 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %49 = OpLoad %int %48
+               OpStore %i %49
+               OpBranch %50
+         %50 = OpLabel
+               OpLoopMerge %51 %52 None
+               OpBranch %53
+         %53 = OpLabel
+         %54 = OpLoad %int %i
+         %55 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %56 = OpLoad %int %55
+         %57 = OpSLessThan %bool %54 %56
+               OpBranchConditional %57 %58 %51
+         %58 = OpLabel
+               OpBranch %52
+         %52 = OpLabel
+         %59 = OpLoad %int %i
+         %60 = OpIAdd %int %59 %int_1
+               OpStore %i %60
+               OpBranch %50
+         %51 = OpLabel
+         %61 = OpLoad %int %a
+         %62 = OpIAdd %int %61 %int_1
+               OpStore %a %62
+               OpBranch %46
+         %46 = OpLabel
+         %63 = OpLoad %int %a
+         %64 = OpSMod %int %int_n1 %63
+         %65 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %66 = OpLoad %int %65
+         %67 = OpIEqual %bool %64 %66
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %68
+         %69 = OpLabel
+         %70 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %71 = OpLoad %int %70
+         %72 = OpCompositeConstruct %v2int %71 %71
+         %73 = OpCompositeExtract %int %72 1
+         %74 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %75 = OpLoad %int %74
+         %76 = OpAccessChain %_ptr_Function_int %arr %73
+               OpStore %76 %75
+               OpBranch %68
+         %68 = OpLabel
+         %77 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %78 = OpLoad %int %77
+         %79 = OpAccessChain %_ptr_Function_int %arr %78
+         %80 = OpLoad %int %79
+         %81 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %82 = OpLoad %int %81
+         %83 = OpIEqual %bool %80 %82
+               OpSelectionMerge %84 None
+               OpBranchConditional %83 %85 %86
+         %85 = OpLabel
+         %87 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %88 = OpLoad %int %87
+         %89 = OpConvertSToF %float %88
+         %90 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %91 = OpLoad %int %90
+         %92 = OpConvertSToF %float %91
+         %93 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %94 = OpLoad %int %93
+         %95 = OpConvertSToF %float %94
+         %96 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %97 = OpLoad %int %96
+         %98 = OpConvertSToF %float %97
+         %99 = OpCompositeConstruct %v4float %89 %92 %95 %98
+               OpStore %_GLF_color %99
+               OpBranch %84
+         %86 = OpLabel
+        %100 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+        %101 = OpLoad %int %100
+        %102 = OpConvertSToF %float %101
+        %103 = OpCompositeConstruct %v4float %102 %102 %102 %102
+               OpStore %_GLF_color %103
+               OpBranch %84
+         %84 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-empty-loop-minus-one-modulo-variable-one/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-empty-loop-minus-one-modulo-variable-one/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..642f1e6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-empty-loop-minus-one-modulo-variable-one/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,68 @@
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int arr[10] = (int[10])0;
+  int a = 0;
+  int i = 0;
+  const int tint_symbol_3[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
+  arr = tint_symbol_3;
+  a = 0;
+  const int x_42 = asint(x_7[1].x);
+  const int x_44 = arr[x_42];
+  if ((x_44 == 2)) {
+    const int x_49 = asint(x_7[2].x);
+    i = x_49;
+    while (true) {
+      const int x_54 = i;
+      const uint scalar_offset = ((16u * uint(0))) / 4;
+      const int x_56 = asint(x_7[scalar_offset / 4][scalar_offset % 4]);
+      if ((x_54 < x_56)) {
+      } else {
+        break;
+      }
+      {
+        i = (i + 1);
+      }
+    }
+    a = (a + 1);
+  }
+  const int x_63 = a;
+  const int x_66 = asint(x_7[2].x);
+  if (((-1 % x_63) == x_66)) {
+    const int x_71 = asint(x_7[1].x);
+    const int x_75 = asint(x_7[2].x);
+    arr[int2(x_71, x_71).y] = x_75;
+  }
+  const int x_78 = asint(x_7[1].x);
+  const int x_80 = arr[x_78];
+  const int x_82 = asint(x_7[2].x);
+  if ((x_80 == x_82)) {
+    const int x_88 = asint(x_7[1].x);
+    const int x_91 = asint(x_7[2].x);
+    const int x_94 = asint(x_7[2].x);
+    const int x_97 = asint(x_7[1].x);
+    x_GLF_color = float4(float(x_88), float(x_91), float(x_94), float(x_97));
+  } else {
+    const int x_101 = asint(x_7[2].x);
+    const float x_102 = float(x_101);
+    x_GLF_color = float4(x_102, x_102, x_102, x_102);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-empty-loop-minus-one-modulo-variable-one/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-empty-loop-minus-one-modulo-variable-one/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..821d826
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-empty-loop-minus-one-modulo-variable-one/0-opt.spvasm.expected.msl
@@ -0,0 +1,82 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_1 {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_5) {
+  tint_array_wrapper_1 arr = {};
+  int a = 0;
+  int i = 0;
+  tint_array_wrapper_1 const tint_symbol_3 = {.arr={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}};
+  arr = tint_symbol_3;
+  a = 0;
+  int const x_42 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  int const x_44 = arr.arr[x_42];
+  if ((x_44 == 2)) {
+    int const x_49 = x_7.x_GLF_uniform_int_values.arr[2].el;
+    i = x_49;
+    while (true) {
+      int const x_54 = i;
+      int const x_56 = x_7.x_GLF_uniform_int_values.arr[0].el;
+      if ((x_54 < x_56)) {
+      } else {
+        break;
+      }
+      {
+        int const x_59 = i;
+        i = (x_59 + 1);
+      }
+    }
+    int const x_61 = a;
+    a = (x_61 + 1);
+  }
+  int const x_63 = a;
+  int const x_66 = x_7.x_GLF_uniform_int_values.arr[2].el;
+  if (((-1 % x_63) == x_66)) {
+    int const x_71 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    int const x_75 = x_7.x_GLF_uniform_int_values.arr[2].el;
+    arr.arr[int2(x_71, x_71).y] = x_75;
+  }
+  int const x_78 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  int const x_80 = arr.arr[x_78];
+  int const x_82 = x_7.x_GLF_uniform_int_values.arr[2].el;
+  if ((x_80 == x_82)) {
+    int const x_88 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    int const x_91 = x_7.x_GLF_uniform_int_values.arr[2].el;
+    int const x_94 = x_7.x_GLF_uniform_int_values.arr[2].el;
+    int const x_97 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_5) = float4(float(x_88), float(x_91), float(x_94), float(x_97));
+  } else {
+    int const x_101 = x_7.x_GLF_uniform_int_values.arr[2].el;
+    float const x_102 = float(x_101);
+    *(tint_symbol_5) = float4(x_102, x_102, x_102, x_102);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_7, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-empty-loop-minus-one-modulo-variable-one/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-empty-loop-minus-one-modulo-variable-one/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..5790633
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-empty-loop-minus-one-modulo-variable-one/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,187 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 122
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %arr "arr"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+         %23 = OpConstantNull %_arr_int_uint_10
+%_ptr_Function_int = OpTypePointer Function %int
+         %26 = OpConstantNull %int
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+      %int_9 = OpConstant %int 9
+     %int_10 = OpConstant %int 10
+         %38 = OpConstantComposite %_arr_int_uint_10 %int_1 %int_2 %int_3 %int_4 %int_5 %int_6 %int_7 %int_8 %int_9 %int_10
+      %int_0 = OpConstant %int 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+     %int_n1 = OpConstant %int -1
+      %v2int = OpTypeVector %int 2
+   %main_out = OpTypeStruct %v4float
+        %110 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+        %arr = OpVariable %_ptr_Function__arr_int_uint_10 Function %23
+          %a = OpVariable %_ptr_Function_int Function %26
+          %i = OpVariable %_ptr_Function_int Function %26
+               OpStore %arr %38
+               OpStore %a %int_0
+         %42 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %43 = OpLoad %int %42
+         %44 = OpAccessChain %_ptr_Function_int %arr %43
+         %45 = OpLoad %int %44
+         %46 = OpIEqual %bool %45 %int_2
+               OpSelectionMerge %48 None
+               OpBranchConditional %46 %49 %48
+         %49 = OpLabel
+         %50 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %51 = OpLoad %int %50
+               OpStore %i %51
+               OpBranch %52
+         %52 = OpLabel
+               OpLoopMerge %53 %54 None
+               OpBranch %55
+         %55 = OpLabel
+         %56 = OpLoad %int %i
+         %57 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %58 = OpLoad %int %57
+         %59 = OpSLessThan %bool %56 %58
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %62
+         %61 = OpLabel
+               OpBranch %60
+         %62 = OpLabel
+               OpBranch %53
+         %60 = OpLabel
+               OpBranch %54
+         %54 = OpLabel
+         %63 = OpLoad %int %i
+         %64 = OpIAdd %int %63 %int_1
+               OpStore %i %64
+               OpBranch %52
+         %53 = OpLabel
+         %65 = OpLoad %int %a
+         %66 = OpIAdd %int %65 %int_1
+               OpStore %a %66
+               OpBranch %48
+         %48 = OpLabel
+         %67 = OpLoad %int %a
+         %68 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %69 = OpLoad %int %68
+         %71 = OpSMod %int %int_n1 %67
+         %72 = OpIEqual %bool %71 %69
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %74 %73
+         %74 = OpLabel
+         %75 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %76 = OpLoad %int %75
+         %77 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %78 = OpLoad %int %77
+         %80 = OpCompositeConstruct %v2int %76 %76
+         %81 = OpCompositeExtract %int %80 1
+         %82 = OpAccessChain %_ptr_Function_int %arr %81
+               OpStore %82 %78
+               OpBranch %73
+         %73 = OpLabel
+         %83 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %84 = OpLoad %int %83
+         %85 = OpAccessChain %_ptr_Function_int %arr %84
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %88 = OpLoad %int %87
+         %89 = OpIEqual %bool %86 %88
+               OpSelectionMerge %90 None
+               OpBranchConditional %89 %91 %92
+         %91 = OpLabel
+         %93 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %94 = OpLoad %int %93
+         %95 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %96 = OpLoad %int %95
+         %97 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %98 = OpLoad %int %97
+         %99 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+        %100 = OpLoad %int %99
+        %101 = OpConvertSToF %float %94
+        %102 = OpConvertSToF %float %96
+        %103 = OpConvertSToF %float %98
+        %104 = OpConvertSToF %float %100
+        %105 = OpCompositeConstruct %v4float %101 %102 %103 %104
+               OpStore %x_GLF_color %105
+               OpBranch %90
+         %92 = OpLabel
+        %106 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+        %107 = OpLoad %int %106
+        %108 = OpConvertSToF %float %107
+        %109 = OpCompositeConstruct %v4float %108 %108 %108 %108
+               OpStore %x_GLF_color %109
+               OpBranch %90
+         %90 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %110
+%tint_symbol = OpFunctionParameter %main_out
+        %114 = OpLabel
+        %115 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %115
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %117 = OpLabel
+        %118 = OpFunctionCall %void %main_1
+        %120 = OpLoad %v4float %x_GLF_color
+        %121 = OpCompositeConstruct %main_out %120
+        %119 = OpFunctionCall %void %tint_symbol_2 %121
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-empty-loop-minus-one-modulo-variable-one/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-empty-loop-minus-one-modulo-variable-one/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..6a47f1c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-empty-loop-minus-one-modulo-variable-one/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,72 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var arr : array<i32, 10>;
+  var a : i32;
+  var i : i32;
+  arr = array<i32, 10>(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
+  a = 0;
+  let x_42 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_44 : i32 = arr[x_42];
+  if ((x_44 == 2)) {
+    let x_49 : i32 = x_7.x_GLF_uniform_int_values[2];
+    i = x_49;
+    loop {
+      let x_54 : i32 = i;
+      let x_56 : i32 = x_7.x_GLF_uniform_int_values[0];
+      if ((x_54 < x_56)) {
+      } else {
+        break;
+      }
+
+      continuing {
+        let x_59 : i32 = i;
+        i = (x_59 + 1);
+      }
+    }
+    let x_61 : i32 = a;
+    a = (x_61 + 1);
+  }
+  let x_63 : i32 = a;
+  let x_66 : i32 = x_7.x_GLF_uniform_int_values[2];
+  if (((-1 % x_63) == x_66)) {
+    let x_71 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_75 : i32 = x_7.x_GLF_uniform_int_values[2];
+    arr[vec2<i32>(x_71, x_71).y] = x_75;
+  }
+  let x_78 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_80 : i32 = arr[x_78];
+  let x_82 : i32 = x_7.x_GLF_uniform_int_values[2];
+  if ((x_80 == x_82)) {
+    let x_88 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_91 : i32 = x_7.x_GLF_uniform_int_values[2];
+    let x_94 : i32 = x_7.x_GLF_uniform_int_values[2];
+    let x_97 : i32 = x_7.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_88), f32(x_91), f32(x_94), f32(x_97));
+  } else {
+    let x_101 : i32 = x_7.x_GLF_uniform_int_values[2];
+    let x_102 : f32 = f32(x_101);
+    x_GLF_color = vec4<f32>(x_102, x_102, x_102, x_102);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-empty-loop-minus-one-modulo-variable-one/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-empty-loop-minus-one-modulo-variable-one/0-opt.wgsl
new file mode 100644
index 0000000..6a47f1c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-empty-loop-minus-one-modulo-variable-one/0-opt.wgsl
@@ -0,0 +1,72 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var arr : array<i32, 10>;
+  var a : i32;
+  var i : i32;
+  arr = array<i32, 10>(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
+  a = 0;
+  let x_42 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_44 : i32 = arr[x_42];
+  if ((x_44 == 2)) {
+    let x_49 : i32 = x_7.x_GLF_uniform_int_values[2];
+    i = x_49;
+    loop {
+      let x_54 : i32 = i;
+      let x_56 : i32 = x_7.x_GLF_uniform_int_values[0];
+      if ((x_54 < x_56)) {
+      } else {
+        break;
+      }
+
+      continuing {
+        let x_59 : i32 = i;
+        i = (x_59 + 1);
+      }
+    }
+    let x_61 : i32 = a;
+    a = (x_61 + 1);
+  }
+  let x_63 : i32 = a;
+  let x_66 : i32 = x_7.x_GLF_uniform_int_values[2];
+  if (((-1 % x_63) == x_66)) {
+    let x_71 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_75 : i32 = x_7.x_GLF_uniform_int_values[2];
+    arr[vec2<i32>(x_71, x_71).y] = x_75;
+  }
+  let x_78 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_80 : i32 = arr[x_78];
+  let x_82 : i32 = x_7.x_GLF_uniform_int_values[2];
+  if ((x_80 == x_82)) {
+    let x_88 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_91 : i32 = x_7.x_GLF_uniform_int_values[2];
+    let x_94 : i32 = x_7.x_GLF_uniform_int_values[2];
+    let x_97 : i32 = x_7.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_88), f32(x_91), f32(x_94), f32(x_97));
+  } else {
+    let x_101 : i32 = x_7.x_GLF_uniform_int_values[2];
+    let x_102 : f32 = f32(x_101);
+    x_GLF_color = vec4<f32>(x_102, x_102, x_102, x_102);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-empty-loop-minus-one-modulo-variable-one/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-empty-loop-minus-one-modulo-variable-one/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..642f1e6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-empty-loop-minus-one-modulo-variable-one/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,68 @@
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int arr[10] = (int[10])0;
+  int a = 0;
+  int i = 0;
+  const int tint_symbol_3[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
+  arr = tint_symbol_3;
+  a = 0;
+  const int x_42 = asint(x_7[1].x);
+  const int x_44 = arr[x_42];
+  if ((x_44 == 2)) {
+    const int x_49 = asint(x_7[2].x);
+    i = x_49;
+    while (true) {
+      const int x_54 = i;
+      const uint scalar_offset = ((16u * uint(0))) / 4;
+      const int x_56 = asint(x_7[scalar_offset / 4][scalar_offset % 4]);
+      if ((x_54 < x_56)) {
+      } else {
+        break;
+      }
+      {
+        i = (i + 1);
+      }
+    }
+    a = (a + 1);
+  }
+  const int x_63 = a;
+  const int x_66 = asint(x_7[2].x);
+  if (((-1 % x_63) == x_66)) {
+    const int x_71 = asint(x_7[1].x);
+    const int x_75 = asint(x_7[2].x);
+    arr[int2(x_71, x_71).y] = x_75;
+  }
+  const int x_78 = asint(x_7[1].x);
+  const int x_80 = arr[x_78];
+  const int x_82 = asint(x_7[2].x);
+  if ((x_80 == x_82)) {
+    const int x_88 = asint(x_7[1].x);
+    const int x_91 = asint(x_7[2].x);
+    const int x_94 = asint(x_7[2].x);
+    const int x_97 = asint(x_7[1].x);
+    x_GLF_color = float4(float(x_88), float(x_91), float(x_94), float(x_97));
+  } else {
+    const int x_101 = asint(x_7[2].x);
+    const float x_102 = float(x_101);
+    x_GLF_color = float4(x_102, x_102, x_102, x_102);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-empty-loop-minus-one-modulo-variable-one/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-empty-loop-minus-one-modulo-variable-one/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..821d826
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-empty-loop-minus-one-modulo-variable-one/0-opt.wgsl.expected.msl
@@ -0,0 +1,82 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_1 {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_5) {
+  tint_array_wrapper_1 arr = {};
+  int a = 0;
+  int i = 0;
+  tint_array_wrapper_1 const tint_symbol_3 = {.arr={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}};
+  arr = tint_symbol_3;
+  a = 0;
+  int const x_42 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  int const x_44 = arr.arr[x_42];
+  if ((x_44 == 2)) {
+    int const x_49 = x_7.x_GLF_uniform_int_values.arr[2].el;
+    i = x_49;
+    while (true) {
+      int const x_54 = i;
+      int const x_56 = x_7.x_GLF_uniform_int_values.arr[0].el;
+      if ((x_54 < x_56)) {
+      } else {
+        break;
+      }
+      {
+        int const x_59 = i;
+        i = (x_59 + 1);
+      }
+    }
+    int const x_61 = a;
+    a = (x_61 + 1);
+  }
+  int const x_63 = a;
+  int const x_66 = x_7.x_GLF_uniform_int_values.arr[2].el;
+  if (((-1 % x_63) == x_66)) {
+    int const x_71 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    int const x_75 = x_7.x_GLF_uniform_int_values.arr[2].el;
+    arr.arr[int2(x_71, x_71).y] = x_75;
+  }
+  int const x_78 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  int const x_80 = arr.arr[x_78];
+  int const x_82 = x_7.x_GLF_uniform_int_values.arr[2].el;
+  if ((x_80 == x_82)) {
+    int const x_88 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    int const x_91 = x_7.x_GLF_uniform_int_values.arr[2].el;
+    int const x_94 = x_7.x_GLF_uniform_int_values.arr[2].el;
+    int const x_97 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_5) = float4(float(x_88), float(x_91), float(x_94), float(x_97));
+  } else {
+    int const x_101 = x_7.x_GLF_uniform_int_values.arr[2].el;
+    float const x_102 = float(x_101);
+    *(tint_symbol_5) = float4(x_102, x_102, x_102, x_102);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_7, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-empty-loop-minus-one-modulo-variable-one/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-empty-loop-minus-one-modulo-variable-one/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..5790633
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-empty-loop-minus-one-modulo-variable-one/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,187 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 122
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %arr "arr"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+         %23 = OpConstantNull %_arr_int_uint_10
+%_ptr_Function_int = OpTypePointer Function %int
+         %26 = OpConstantNull %int
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+      %int_9 = OpConstant %int 9
+     %int_10 = OpConstant %int 10
+         %38 = OpConstantComposite %_arr_int_uint_10 %int_1 %int_2 %int_3 %int_4 %int_5 %int_6 %int_7 %int_8 %int_9 %int_10
+      %int_0 = OpConstant %int 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+     %int_n1 = OpConstant %int -1
+      %v2int = OpTypeVector %int 2
+   %main_out = OpTypeStruct %v4float
+        %110 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+        %arr = OpVariable %_ptr_Function__arr_int_uint_10 Function %23
+          %a = OpVariable %_ptr_Function_int Function %26
+          %i = OpVariable %_ptr_Function_int Function %26
+               OpStore %arr %38
+               OpStore %a %int_0
+         %42 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %43 = OpLoad %int %42
+         %44 = OpAccessChain %_ptr_Function_int %arr %43
+         %45 = OpLoad %int %44
+         %46 = OpIEqual %bool %45 %int_2
+               OpSelectionMerge %48 None
+               OpBranchConditional %46 %49 %48
+         %49 = OpLabel
+         %50 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %51 = OpLoad %int %50
+               OpStore %i %51
+               OpBranch %52
+         %52 = OpLabel
+               OpLoopMerge %53 %54 None
+               OpBranch %55
+         %55 = OpLabel
+         %56 = OpLoad %int %i
+         %57 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %58 = OpLoad %int %57
+         %59 = OpSLessThan %bool %56 %58
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %62
+         %61 = OpLabel
+               OpBranch %60
+         %62 = OpLabel
+               OpBranch %53
+         %60 = OpLabel
+               OpBranch %54
+         %54 = OpLabel
+         %63 = OpLoad %int %i
+         %64 = OpIAdd %int %63 %int_1
+               OpStore %i %64
+               OpBranch %52
+         %53 = OpLabel
+         %65 = OpLoad %int %a
+         %66 = OpIAdd %int %65 %int_1
+               OpStore %a %66
+               OpBranch %48
+         %48 = OpLabel
+         %67 = OpLoad %int %a
+         %68 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %69 = OpLoad %int %68
+         %71 = OpSMod %int %int_n1 %67
+         %72 = OpIEqual %bool %71 %69
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %74 %73
+         %74 = OpLabel
+         %75 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %76 = OpLoad %int %75
+         %77 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %78 = OpLoad %int %77
+         %80 = OpCompositeConstruct %v2int %76 %76
+         %81 = OpCompositeExtract %int %80 1
+         %82 = OpAccessChain %_ptr_Function_int %arr %81
+               OpStore %82 %78
+               OpBranch %73
+         %73 = OpLabel
+         %83 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %84 = OpLoad %int %83
+         %85 = OpAccessChain %_ptr_Function_int %arr %84
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %88 = OpLoad %int %87
+         %89 = OpIEqual %bool %86 %88
+               OpSelectionMerge %90 None
+               OpBranchConditional %89 %91 %92
+         %91 = OpLabel
+         %93 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %94 = OpLoad %int %93
+         %95 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %96 = OpLoad %int %95
+         %97 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %98 = OpLoad %int %97
+         %99 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+        %100 = OpLoad %int %99
+        %101 = OpConvertSToF %float %94
+        %102 = OpConvertSToF %float %96
+        %103 = OpConvertSToF %float %98
+        %104 = OpConvertSToF %float %100
+        %105 = OpCompositeConstruct %v4float %101 %102 %103 %104
+               OpStore %x_GLF_color %105
+               OpBranch %90
+         %92 = OpLabel
+        %106 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+        %107 = OpLoad %int %106
+        %108 = OpConvertSToF %float %107
+        %109 = OpCompositeConstruct %v4float %108 %108 %108 %108
+               OpStore %x_GLF_color %109
+               OpBranch %90
+         %90 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %110
+%tint_symbol = OpFunctionParameter %main_out
+        %114 = OpLabel
+        %115 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %115
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %117 = OpLabel
+        %118 = OpFunctionCall %void %main_1
+        %120 = OpLoad %v4float %x_GLF_color
+        %121 = OpCompositeConstruct %main_out %120
+        %119 = OpFunctionCall %void %tint_symbol_2 %121
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-empty-loop-minus-one-modulo-variable-one/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-empty-loop-minus-one-modulo-variable-one/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..6a47f1c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-empty-loop-minus-one-modulo-variable-one/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,72 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var arr : array<i32, 10>;
+  var a : i32;
+  var i : i32;
+  arr = array<i32, 10>(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
+  a = 0;
+  let x_42 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_44 : i32 = arr[x_42];
+  if ((x_44 == 2)) {
+    let x_49 : i32 = x_7.x_GLF_uniform_int_values[2];
+    i = x_49;
+    loop {
+      let x_54 : i32 = i;
+      let x_56 : i32 = x_7.x_GLF_uniform_int_values[0];
+      if ((x_54 < x_56)) {
+      } else {
+        break;
+      }
+
+      continuing {
+        let x_59 : i32 = i;
+        i = (x_59 + 1);
+      }
+    }
+    let x_61 : i32 = a;
+    a = (x_61 + 1);
+  }
+  let x_63 : i32 = a;
+  let x_66 : i32 = x_7.x_GLF_uniform_int_values[2];
+  if (((-1 % x_63) == x_66)) {
+    let x_71 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_75 : i32 = x_7.x_GLF_uniform_int_values[2];
+    arr[vec2<i32>(x_71, x_71).y] = x_75;
+  }
+  let x_78 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_80 : i32 = arr[x_78];
+  let x_82 : i32 = x_7.x_GLF_uniform_int_values[2];
+  if ((x_80 == x_82)) {
+    let x_88 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_91 : i32 = x_7.x_GLF_uniform_int_values[2];
+    let x_94 : i32 = x_7.x_GLF_uniform_int_values[2];
+    let x_97 : i32 = x_7.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_88), f32(x_91), f32(x_94), f32(x_97));
+  } else {
+    let x_101 : i32 = x_7.x_GLF_uniform_int_values[2];
+    let x_102 : f32 = f32(x_101);
+    x_GLF_color = vec4<f32>(x_102, x_102, x_102, x_102);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-exp2-two/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-exp2-two/0-opt.spvasm
new file mode 100644
index 0000000..b510068
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-exp2-two/0-opt.spvasm
@@ -0,0 +1,42 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %f "f"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %6 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_2 = OpConstant %float 2
+    %float_4 = OpConstant %float 4
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %16 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %17 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %6
+         %18 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function
+               OpStore %f %float_2
+         %19 = OpLoad %float %f
+         %20 = OpExtInst %float %1 Exp2 %19
+         %21 = OpFOrdEqual %bool %20 %float_4
+               OpSelectionMerge %22 None
+               OpBranchConditional %21 %23 %24
+         %23 = OpLabel
+               OpStore %_GLF_color %16
+               OpBranch %22
+         %24 = OpLabel
+               OpStore %_GLF_color %17
+               OpBranch %22
+         %22 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-exp2-two/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-exp2-two/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..9f1319b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-exp2-two/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,26 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float f = 0.0f;
+  f = 2.0f;
+  if ((exp2(f) == 4.0f)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-exp2-two/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-exp2-two/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..387bc0b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-exp2-two/0-opt.spvasm.expected.msl
@@ -0,0 +1,30 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  float f = 0.0f;
+  f = 2.0f;
+  float const x_19 = f;
+  if ((exp2(x_19) == 4.0f)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-exp2-two/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-exp2-two/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..e668d86
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-exp2-two/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,74 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 41
+; Schema: 0
+               OpCapability Shader
+         %18 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %14 = OpConstantNull %float
+    %float_2 = OpConstant %float 2
+    %float_4 = OpConstant %float 4
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %27 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %28 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %29 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %14
+               OpStore %f %float_2
+         %16 = OpLoad %float %f
+         %17 = OpExtInst %float %18 Exp2 %16
+         %20 = OpFOrdEqual %bool %17 %float_4
+               OpSelectionMerge %22 None
+               OpBranchConditional %20 %23 %24
+         %23 = OpLabel
+               OpStore %x_GLF_color %27
+               OpBranch %22
+         %24 = OpLabel
+               OpStore %x_GLF_color %28
+               OpBranch %22
+         %22 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %29
+%tint_symbol = OpFunctionParameter %main_out
+         %33 = OpLabel
+         %34 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %34
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %36 = OpLabel
+         %37 = OpFunctionCall %void %main_1
+         %39 = OpLoad %v4float %x_GLF_color
+         %40 = OpCompositeConstruct %main_out %39
+         %38 = OpFunctionCall %void %tint_symbol_2 %40
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-exp2-two/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-exp2-two/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..620e1b8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-exp2-two/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,24 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  f = 2.0;
+  let x_19 : f32 = f;
+  if ((exp2(x_19) == 4.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-exp2-two/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-exp2-two/0-opt.wgsl
new file mode 100644
index 0000000..620e1b8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-exp2-two/0-opt.wgsl
@@ -0,0 +1,24 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  f = 2.0;
+  let x_19 : f32 = f;
+  if ((exp2(x_19) == 4.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-exp2-two/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-exp2-two/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..9f1319b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-exp2-two/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,26 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float f = 0.0f;
+  f = 2.0f;
+  if ((exp2(f) == 4.0f)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-exp2-two/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-exp2-two/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..387bc0b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-exp2-two/0-opt.wgsl.expected.msl
@@ -0,0 +1,30 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  float f = 0.0f;
+  f = 2.0f;
+  float const x_19 = f;
+  if ((exp2(x_19) == 4.0f)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-exp2-two/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-exp2-two/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..e668d86
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-exp2-two/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,74 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 41
+; Schema: 0
+               OpCapability Shader
+         %18 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %14 = OpConstantNull %float
+    %float_2 = OpConstant %float 2
+    %float_4 = OpConstant %float 4
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %27 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %28 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %29 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %14
+               OpStore %f %float_2
+         %16 = OpLoad %float %f
+         %17 = OpExtInst %float %18 Exp2 %16
+         %20 = OpFOrdEqual %bool %17 %float_4
+               OpSelectionMerge %22 None
+               OpBranchConditional %20 %23 %24
+         %23 = OpLabel
+               OpStore %x_GLF_color %27
+               OpBranch %22
+         %24 = OpLabel
+               OpStore %x_GLF_color %28
+               OpBranch %22
+         %22 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %29
+%tint_symbol = OpFunctionParameter %main_out
+         %33 = OpLabel
+         %34 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %34
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %36 = OpLabel
+         %37 = OpFunctionCall %void %main_1
+         %39 = OpLoad %v4float %x_GLF_color
+         %40 = OpCompositeConstruct %main_out %39
+         %38 = OpFunctionCall %void %tint_symbol_2 %40
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-exp2-two/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-exp2-two/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..620e1b8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-exp2-two/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,24 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  f = 2.0;
+  let x_19 : f32 = f;
+  if ((exp2(x_19) == 4.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-float-array-init-pow/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-float-array-init-pow/0-opt.spvasm
new file mode 100644
index 0000000..42541f5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-float-array-init-pow/0-opt.spvasm
@@ -0,0 +1,122 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %f "f"
+               OpName %arr "arr"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_2 = OpConstant %float 2
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_float_uint_10 = OpTypeArray %float %uint_10
+%_ptr_Function__arr_float_uint_10 = OpTypePointer Function %_arr_float_uint_10
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+      %int_2 = OpConstant %int 2
+       %main = OpFunction %void None %13
+         %35 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function
+        %arr = OpVariable %_ptr_Function__arr_float_uint_10 Function
+               OpStore %f %float_2
+         %36 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %37 = OpLoad %float %36
+         %38 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %39 = OpLoad %float %38
+         %40 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %41 = OpLoad %float %40
+         %42 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %43 = OpLoad %float %42
+         %44 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %45 = OpLoad %float %44
+         %46 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %47 = OpLoad %float %46
+         %48 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %49 = OpLoad %float %48
+         %50 = OpLoad %float %f
+         %51 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %52 = OpLoad %float %51
+         %53 = OpExtInst %float %1 Pow %50 %52
+         %54 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %55 = OpLoad %float %54
+         %56 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %57 = OpLoad %float %56
+         %58 = OpCompositeConstruct %_arr_float_uint_10 %37 %39 %41 %43 %45 %47 %49 %53 %55 %57
+               OpStore %arr %58
+         %59 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %60 = OpLoad %int %59
+         %61 = OpAccessChain %_ptr_Function_float %arr %60
+         %62 = OpLoad %float %61
+         %63 = OpConvertFToS %int %62
+         %64 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_3
+         %65 = OpLoad %int %64
+         %66 = OpIEqual %bool %63 %65
+               OpSelectionMerge %67 None
+               OpBranchConditional %66 %68 %69
+         %68 = OpLabel
+         %70 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %71 = OpLoad %int %70
+         %72 = OpConvertSToF %float %71
+         %73 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %74 = OpLoad %int %73
+         %75 = OpConvertSToF %float %74
+         %76 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %77 = OpLoad %int %76
+         %78 = OpConvertSToF %float %77
+         %79 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %80 = OpLoad %int %79
+         %81 = OpConvertSToF %float %80
+         %82 = OpCompositeConstruct %v4float %72 %75 %78 %81
+               OpStore %_GLF_color %82
+               OpBranch %67
+         %69 = OpLabel
+         %83 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %84 = OpLoad %int %83
+         %85 = OpConvertSToF %float %84
+         %86 = OpCompositeConstruct %v4float %85 %85 %85 %85
+               OpStore %_GLF_color %86
+               OpBranch %67
+         %67 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-float-array-init-pow/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-float-array-init-pow/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..81e4598
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-float-array-init-pow/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,65 @@
+cbuffer cbuffer_x_7 : register(b1, space0) {
+  uint4 x_7[2];
+};
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float f = 0.0f;
+  float arr[10] = (float[10])0;
+  f = 2.0f;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_37 = asfloat(x_7[scalar_offset / 4][scalar_offset % 4]);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_39 = asfloat(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const float x_41 = asfloat(x_7[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const float x_43 = asfloat(x_7[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+  const float x_45 = asfloat(x_7[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+  const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+  const float x_47 = asfloat(x_7[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+  const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+  const float x_49 = asfloat(x_7[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+  const float x_50 = f;
+  const float x_52 = asfloat(x_7[1].x);
+  const uint scalar_offset_7 = ((16u * uint(0))) / 4;
+  const float x_55 = asfloat(x_7[scalar_offset_7 / 4][scalar_offset_7 % 4]);
+  const uint scalar_offset_8 = ((16u * uint(0))) / 4;
+  const float x_57 = asfloat(x_7[scalar_offset_8 / 4][scalar_offset_8 % 4]);
+  const float tint_symbol_4[10] = {x_37, x_39, x_41, x_43, x_45, x_47, x_49, pow(x_50, x_52), x_55, x_57};
+  arr = tint_symbol_4;
+  const uint scalar_offset_9 = ((16u * uint(0))) / 4;
+  const int x_60 = asint(x_9[scalar_offset_9 / 4][scalar_offset_9 % 4]);
+  const float x_62 = arr[x_60];
+  const int x_65 = asint(x_9[3].x);
+  if ((int(x_62) == x_65)) {
+    const int x_71 = asint(x_9[1].x);
+    const int x_74 = asint(x_9[2].x);
+    const int x_77 = asint(x_9[2].x);
+    const int x_80 = asint(x_9[1].x);
+    x_GLF_color = float4(float(x_71), float(x_74), float(x_77), float(x_80));
+  } else {
+    const int x_84 = asint(x_9[2].x);
+    const float x_85 = float(x_84);
+    x_GLF_color = float4(x_85, x_85, x_85, x_85);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-float-array-init-pow/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-float-array-init-pow/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..3eea4ec
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-float-array-init-pow/0-opt.spvasm.expected.msl
@@ -0,0 +1,75 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_2 {
+  float arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_7, constant buf0& x_9, thread float4* const tint_symbol_5) {
+  float f = 0.0f;
+  tint_array_wrapper_2 arr = {};
+  f = 2.0f;
+  float const x_37 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  float const x_39 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  float const x_41 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  float const x_43 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  float const x_45 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  float const x_47 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  float const x_49 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  float const x_50 = f;
+  float const x_52 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  float const x_55 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  float const x_57 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  tint_array_wrapper_2 const tint_symbol_3 = {.arr={x_37, x_39, x_41, x_43, x_45, x_47, x_49, pow(x_50, x_52), x_55, x_57}};
+  arr = tint_symbol_3;
+  int const x_60 = x_9.x_GLF_uniform_int_values.arr[0].el;
+  float const x_62 = arr.arr[x_60];
+  int const x_65 = x_9.x_GLF_uniform_int_values.arr[3].el;
+  if ((int(x_62) == x_65)) {
+    int const x_71 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_74 = x_9.x_GLF_uniform_int_values.arr[2].el;
+    int const x_77 = x_9.x_GLF_uniform_int_values.arr[2].el;
+    int const x_80 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_5) = float4(float(x_71), float(x_74), float(x_77), float(x_80));
+  } else {
+    int const x_84 = x_9.x_GLF_uniform_int_values.arr[2].el;
+    float const x_85 = float(x_84);
+    *(tint_symbol_5) = float4(x_85, x_85, x_85, x_85);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_7 [[buffer(1)]], constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_7, x_9, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-float-array-init-pow/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-float-array-init-pow/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..bb87b20
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-float-array-init-pow/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,159 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 105
+; Schema: 0
+               OpCapability Shader
+         %59 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_7 "x_7"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %arr "arr"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_float_uint_10 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_7 = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %26 = OpConstantNull %float
+    %uint_10 = OpConstant %uint 10
+%_arr_float_uint_10 = OpTypeArray %float %uint_10
+%_ptr_Function__arr_float_uint_10 = OpTypePointer Function %_arr_float_uint_10
+         %31 = OpConstantNull %_arr_float_uint_10
+    %float_2 = OpConstant %float 2
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+         %93 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %26
+        %arr = OpVariable %_ptr_Function__arr_float_uint_10 Function %31
+               OpStore %f %float_2
+         %36 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %37 = OpLoad %float %36
+         %38 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %39 = OpLoad %float %38
+         %40 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %41 = OpLoad %float %40
+         %42 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %43 = OpLoad %float %42
+         %44 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %45 = OpLoad %float %44
+         %46 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %47 = OpLoad %float %46
+         %48 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %49 = OpLoad %float %48
+         %50 = OpLoad %float %f
+         %52 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %53 = OpLoad %float %52
+         %54 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %55 = OpLoad %float %54
+         %56 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %57 = OpLoad %float %56
+         %58 = OpExtInst %float %59 Pow %50 %53
+         %60 = OpCompositeConstruct %_arr_float_uint_10 %37 %39 %41 %43 %45 %47 %49 %58 %55 %57
+               OpStore %arr %60
+         %62 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %63 = OpLoad %int %62
+         %64 = OpAccessChain %_ptr_Function_float %arr %63
+         %65 = OpLoad %float %64
+         %67 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_3
+         %68 = OpLoad %int %67
+         %69 = OpConvertFToS %int %65
+         %70 = OpIEqual %bool %69 %68
+               OpSelectionMerge %72 None
+               OpBranchConditional %70 %73 %74
+         %73 = OpLabel
+         %75 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %76 = OpLoad %int %75
+         %78 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_2
+         %79 = OpLoad %int %78
+         %80 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_2
+         %81 = OpLoad %int %80
+         %82 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %83 = OpLoad %int %82
+         %84 = OpConvertSToF %float %76
+         %85 = OpConvertSToF %float %79
+         %86 = OpConvertSToF %float %81
+         %87 = OpConvertSToF %float %83
+         %88 = OpCompositeConstruct %v4float %84 %85 %86 %87
+               OpStore %x_GLF_color %88
+               OpBranch %72
+         %74 = OpLabel
+         %89 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_2
+         %90 = OpLoad %int %89
+         %91 = OpConvertSToF %float %90
+         %92 = OpCompositeConstruct %v4float %91 %91 %91 %91
+               OpStore %x_GLF_color %92
+               OpBranch %72
+         %72 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %93
+%tint_symbol = OpFunctionParameter %main_out
+         %97 = OpLabel
+         %98 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %98
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %100 = OpLabel
+        %101 = OpFunctionCall %void %main_1
+        %103 = OpLoad %v4float %x_GLF_color
+        %104 = OpCompositeConstruct %main_out %103
+        %102 = OpFunctionCall %void %tint_symbol_2 %104
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-float-array-init-pow/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-float-array-init-pow/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..0c41106
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-float-array-init-pow/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,63 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  var arr : array<f32, 10>;
+  f = 2.0;
+  let x_37 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_39 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_41 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_43 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_45 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_47 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_49 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_50 : f32 = f;
+  let x_52 : f32 = x_7.x_GLF_uniform_float_values[1];
+  let x_55 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_57 : f32 = x_7.x_GLF_uniform_float_values[0];
+  arr = array<f32, 10>(x_37, x_39, x_41, x_43, x_45, x_47, x_49, pow(x_50, x_52), x_55, x_57);
+  let x_60 : i32 = x_9.x_GLF_uniform_int_values[0];
+  let x_62 : f32 = arr[x_60];
+  let x_65 : i32 = x_9.x_GLF_uniform_int_values[3];
+  if ((i32(x_62) == x_65)) {
+    let x_71 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_74 : i32 = x_9.x_GLF_uniform_int_values[2];
+    let x_77 : i32 = x_9.x_GLF_uniform_int_values[2];
+    let x_80 : i32 = x_9.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_71), f32(x_74), f32(x_77), f32(x_80));
+  } else {
+    let x_84 : i32 = x_9.x_GLF_uniform_int_values[2];
+    let x_85 : f32 = f32(x_84);
+    x_GLF_color = vec4<f32>(x_85, x_85, x_85, x_85);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-float-array-init-pow/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-float-array-init-pow/0-opt.wgsl
new file mode 100644
index 0000000..0c41106
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-float-array-init-pow/0-opt.wgsl
@@ -0,0 +1,63 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  var arr : array<f32, 10>;
+  f = 2.0;
+  let x_37 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_39 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_41 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_43 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_45 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_47 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_49 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_50 : f32 = f;
+  let x_52 : f32 = x_7.x_GLF_uniform_float_values[1];
+  let x_55 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_57 : f32 = x_7.x_GLF_uniform_float_values[0];
+  arr = array<f32, 10>(x_37, x_39, x_41, x_43, x_45, x_47, x_49, pow(x_50, x_52), x_55, x_57);
+  let x_60 : i32 = x_9.x_GLF_uniform_int_values[0];
+  let x_62 : f32 = arr[x_60];
+  let x_65 : i32 = x_9.x_GLF_uniform_int_values[3];
+  if ((i32(x_62) == x_65)) {
+    let x_71 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_74 : i32 = x_9.x_GLF_uniform_int_values[2];
+    let x_77 : i32 = x_9.x_GLF_uniform_int_values[2];
+    let x_80 : i32 = x_9.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_71), f32(x_74), f32(x_77), f32(x_80));
+  } else {
+    let x_84 : i32 = x_9.x_GLF_uniform_int_values[2];
+    let x_85 : f32 = f32(x_84);
+    x_GLF_color = vec4<f32>(x_85, x_85, x_85, x_85);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-float-array-init-pow/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-float-array-init-pow/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..81e4598
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-float-array-init-pow/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,65 @@
+cbuffer cbuffer_x_7 : register(b1, space0) {
+  uint4 x_7[2];
+};
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float f = 0.0f;
+  float arr[10] = (float[10])0;
+  f = 2.0f;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_37 = asfloat(x_7[scalar_offset / 4][scalar_offset % 4]);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_39 = asfloat(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const float x_41 = asfloat(x_7[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const float x_43 = asfloat(x_7[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+  const float x_45 = asfloat(x_7[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+  const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+  const float x_47 = asfloat(x_7[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+  const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+  const float x_49 = asfloat(x_7[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+  const float x_50 = f;
+  const float x_52 = asfloat(x_7[1].x);
+  const uint scalar_offset_7 = ((16u * uint(0))) / 4;
+  const float x_55 = asfloat(x_7[scalar_offset_7 / 4][scalar_offset_7 % 4]);
+  const uint scalar_offset_8 = ((16u * uint(0))) / 4;
+  const float x_57 = asfloat(x_7[scalar_offset_8 / 4][scalar_offset_8 % 4]);
+  const float tint_symbol_4[10] = {x_37, x_39, x_41, x_43, x_45, x_47, x_49, pow(x_50, x_52), x_55, x_57};
+  arr = tint_symbol_4;
+  const uint scalar_offset_9 = ((16u * uint(0))) / 4;
+  const int x_60 = asint(x_9[scalar_offset_9 / 4][scalar_offset_9 % 4]);
+  const float x_62 = arr[x_60];
+  const int x_65 = asint(x_9[3].x);
+  if ((int(x_62) == x_65)) {
+    const int x_71 = asint(x_9[1].x);
+    const int x_74 = asint(x_9[2].x);
+    const int x_77 = asint(x_9[2].x);
+    const int x_80 = asint(x_9[1].x);
+    x_GLF_color = float4(float(x_71), float(x_74), float(x_77), float(x_80));
+  } else {
+    const int x_84 = asint(x_9[2].x);
+    const float x_85 = float(x_84);
+    x_GLF_color = float4(x_85, x_85, x_85, x_85);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-float-array-init-pow/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-float-array-init-pow/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..3eea4ec
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-float-array-init-pow/0-opt.wgsl.expected.msl
@@ -0,0 +1,75 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_2 {
+  float arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_7, constant buf0& x_9, thread float4* const tint_symbol_5) {
+  float f = 0.0f;
+  tint_array_wrapper_2 arr = {};
+  f = 2.0f;
+  float const x_37 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  float const x_39 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  float const x_41 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  float const x_43 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  float const x_45 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  float const x_47 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  float const x_49 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  float const x_50 = f;
+  float const x_52 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  float const x_55 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  float const x_57 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  tint_array_wrapper_2 const tint_symbol_3 = {.arr={x_37, x_39, x_41, x_43, x_45, x_47, x_49, pow(x_50, x_52), x_55, x_57}};
+  arr = tint_symbol_3;
+  int const x_60 = x_9.x_GLF_uniform_int_values.arr[0].el;
+  float const x_62 = arr.arr[x_60];
+  int const x_65 = x_9.x_GLF_uniform_int_values.arr[3].el;
+  if ((int(x_62) == x_65)) {
+    int const x_71 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_74 = x_9.x_GLF_uniform_int_values.arr[2].el;
+    int const x_77 = x_9.x_GLF_uniform_int_values.arr[2].el;
+    int const x_80 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_5) = float4(float(x_71), float(x_74), float(x_77), float(x_80));
+  } else {
+    int const x_84 = x_9.x_GLF_uniform_int_values.arr[2].el;
+    float const x_85 = float(x_84);
+    *(tint_symbol_5) = float4(x_85, x_85, x_85, x_85);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_7 [[buffer(1)]], constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_7, x_9, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-float-array-init-pow/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-float-array-init-pow/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..bb87b20
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-float-array-init-pow/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,159 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 105
+; Schema: 0
+               OpCapability Shader
+         %59 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_7 "x_7"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %arr "arr"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_float_uint_10 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_7 = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %26 = OpConstantNull %float
+    %uint_10 = OpConstant %uint 10
+%_arr_float_uint_10 = OpTypeArray %float %uint_10
+%_ptr_Function__arr_float_uint_10 = OpTypePointer Function %_arr_float_uint_10
+         %31 = OpConstantNull %_arr_float_uint_10
+    %float_2 = OpConstant %float 2
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+         %93 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %26
+        %arr = OpVariable %_ptr_Function__arr_float_uint_10 Function %31
+               OpStore %f %float_2
+         %36 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %37 = OpLoad %float %36
+         %38 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %39 = OpLoad %float %38
+         %40 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %41 = OpLoad %float %40
+         %42 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %43 = OpLoad %float %42
+         %44 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %45 = OpLoad %float %44
+         %46 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %47 = OpLoad %float %46
+         %48 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %49 = OpLoad %float %48
+         %50 = OpLoad %float %f
+         %52 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %53 = OpLoad %float %52
+         %54 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %55 = OpLoad %float %54
+         %56 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %57 = OpLoad %float %56
+         %58 = OpExtInst %float %59 Pow %50 %53
+         %60 = OpCompositeConstruct %_arr_float_uint_10 %37 %39 %41 %43 %45 %47 %49 %58 %55 %57
+               OpStore %arr %60
+         %62 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %63 = OpLoad %int %62
+         %64 = OpAccessChain %_ptr_Function_float %arr %63
+         %65 = OpLoad %float %64
+         %67 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_3
+         %68 = OpLoad %int %67
+         %69 = OpConvertFToS %int %65
+         %70 = OpIEqual %bool %69 %68
+               OpSelectionMerge %72 None
+               OpBranchConditional %70 %73 %74
+         %73 = OpLabel
+         %75 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %76 = OpLoad %int %75
+         %78 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_2
+         %79 = OpLoad %int %78
+         %80 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_2
+         %81 = OpLoad %int %80
+         %82 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %83 = OpLoad %int %82
+         %84 = OpConvertSToF %float %76
+         %85 = OpConvertSToF %float %79
+         %86 = OpConvertSToF %float %81
+         %87 = OpConvertSToF %float %83
+         %88 = OpCompositeConstruct %v4float %84 %85 %86 %87
+               OpStore %x_GLF_color %88
+               OpBranch %72
+         %74 = OpLabel
+         %89 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_2
+         %90 = OpLoad %int %89
+         %91 = OpConvertSToF %float %90
+         %92 = OpCompositeConstruct %v4float %91 %91 %91 %91
+               OpStore %x_GLF_color %92
+               OpBranch %72
+         %72 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %93
+%tint_symbol = OpFunctionParameter %main_out
+         %97 = OpLabel
+         %98 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %98
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %100 = OpLabel
+        %101 = OpFunctionCall %void %main_1
+        %103 = OpLoad %v4float %x_GLF_color
+        %104 = OpCompositeConstruct %main_out %103
+        %102 = OpFunctionCall %void %tint_symbol_2 %104
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-float-array-init-pow/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-float-array-init-pow/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..0c41106
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-float-array-init-pow/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,63 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  var arr : array<f32, 10>;
+  f = 2.0;
+  let x_37 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_39 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_41 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_43 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_45 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_47 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_49 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_50 : f32 = f;
+  let x_52 : f32 = x_7.x_GLF_uniform_float_values[1];
+  let x_55 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_57 : f32 = x_7.x_GLF_uniform_float_values[0];
+  arr = array<f32, 10>(x_37, x_39, x_41, x_43, x_45, x_47, x_49, pow(x_50, x_52), x_55, x_57);
+  let x_60 : i32 = x_9.x_GLF_uniform_int_values[0];
+  let x_62 : f32 = arr[x_60];
+  let x_65 : i32 = x_9.x_GLF_uniform_int_values[3];
+  if ((i32(x_62) == x_65)) {
+    let x_71 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_74 : i32 = x_9.x_GLF_uniform_int_values[2];
+    let x_77 : i32 = x_9.x_GLF_uniform_int_values[2];
+    let x_80 : i32 = x_9.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_71), f32(x_74), f32(x_77), f32(x_80));
+  } else {
+    let x_84 : i32 = x_9.x_GLF_uniform_int_values[2];
+    let x_85 : f32 = f32(x_84);
+    x_GLF_color = vec4<f32>(x_85, x_85, x_85, x_85);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-and-in-for-loop-range/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fold-and-in-for-loop-range/0-opt.spvasm
new file mode 100644
index 0000000..f50e47e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-and-in-for-loop-range/0-opt.spvasm
@@ -0,0 +1,88 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %func_ "func("
+               OpName %ret "ret"
+               OpName %i "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+         %12 = OpTypeFunction %int
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %int_3 = OpConstant %int 3
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %26 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %27 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %10
+         %28 = OpLabel
+         %29 = OpFunctionCall %int %func_
+         %30 = OpIEqual %bool %29 %int_2
+               OpSelectionMerge %31 None
+               OpBranchConditional %30 %32 %33
+         %32 = OpLabel
+               OpStore %_GLF_color %26
+               OpBranch %31
+         %33 = OpLabel
+               OpStore %_GLF_color %27
+               OpBranch %31
+         %31 = OpLabel
+               OpReturn
+               OpFunctionEnd
+      %func_ = OpFunction %int None %12
+         %34 = OpLabel
+        %ret = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+               OpStore %ret %int_0
+               OpStore %i %int_3
+               OpBranch %35
+         %35 = OpLabel
+               OpLoopMerge %36 %37 None
+               OpBranch %38
+         %38 = OpLabel
+         %39 = OpLoad %int %i
+         %40 = OpLoad %int %i
+         %41 = OpBitwiseAnd %int %40 %int_1
+         %42 = OpSGreaterThan %bool %39 %41
+               OpBranchConditional %42 %43 %36
+         %43 = OpLabel
+         %44 = OpLoad %int %ret
+         %45 = OpIAdd %int %44 %int_1
+               OpStore %ret %45
+               OpBranch %37
+         %37 = OpLabel
+         %46 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %47 = OpLoad %int %46
+         %48 = OpLoad %int %i
+         %49 = OpISub %int %48 %47
+               OpStore %i %49
+               OpBranch %35
+         %36 = OpLabel
+         %50 = OpLoad %int %ret
+               OpReturnValue %50
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-and-in-for-loop-range/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-and-in-for-loop-range/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..757f40b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-and-in-for-loop-range/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,47 @@
+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 func_() {
+  int ret = 0;
+  int i = 0;
+  ret = 0;
+  i = 3;
+  while (true) {
+    if ((i > (i & 1))) {
+    } else {
+      break;
+    }
+    ret = (ret + 1);
+    {
+      const int x_47 = asint(x_8[0].x);
+      i = (i - x_47);
+    }
+  }
+  return ret;
+}
+
+void main_1() {
+  const int x_29 = func_();
+  if ((x_29 == 2)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-and-in-for-loop-range/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-fold-and-in-for-loop-range/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..f57fd22
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-and-in-for-loop-range/0-opt.spvasm.expected.msl
@@ -0,0 +1,55 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int func_(constant buf0& x_8) {
+  int ret = 0;
+  int i = 0;
+  ret = 0;
+  i = 3;
+  while (true) {
+    int const x_39 = i;
+    int const x_40 = i;
+    if ((x_39 > (x_40 & 1))) {
+    } else {
+      break;
+    }
+    int const x_44 = ret;
+    ret = (x_44 + 1);
+    {
+      int const x_47 = x_8.one;
+      int const x_48 = i;
+      i = (x_48 - x_47);
+    }
+  }
+  int const x_50 = ret;
+  return x_50;
+}
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_4) {
+  int const x_29 = func_(x_8);
+  if ((x_29 == 2)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-and-in-for-loop-range/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fold-and-in-for-loop-range/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..6d8b1a2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-and-in-for-loop-range/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,127 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 70
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_ "func_"
+               OpName %ret "ret"
+               OpName %i "i"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+         %12 = OpTypeFunction %int
+%_ptr_Function_int = OpTypePointer Function %int
+         %17 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+      %int_3 = OpConstant %int 3
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %void = OpTypeVoid
+         %44 = OpTypeFunction %void
+      %int_2 = OpConstant %int 2
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %56 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %57 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %58 = OpTypeFunction %void %main_out
+      %func_ = OpFunction %int None %12
+         %14 = OpLabel
+        %ret = OpVariable %_ptr_Function_int Function %17
+          %i = OpVariable %_ptr_Function_int Function %17
+               OpStore %ret %int_0
+               OpStore %i %int_3
+               OpBranch %21
+         %21 = OpLabel
+               OpLoopMerge %22 %23 None
+               OpBranch %24
+         %24 = OpLabel
+         %25 = OpLoad %int %i
+         %26 = OpLoad %int %i
+         %28 = OpBitwiseAnd %int %26 %int_1
+         %29 = OpSGreaterThan %bool %25 %28
+               OpSelectionMerge %31 None
+               OpBranchConditional %29 %32 %33
+         %32 = OpLabel
+               OpBranch %31
+         %33 = OpLabel
+               OpBranch %22
+         %31 = OpLabel
+         %34 = OpLoad %int %ret
+         %35 = OpIAdd %int %34 %int_1
+               OpStore %ret %35
+               OpBranch %23
+         %23 = OpLabel
+         %39 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0
+         %40 = OpLoad %int %39
+         %41 = OpLoad %int %i
+         %42 = OpISub %int %41 %40
+               OpStore %i %42
+               OpBranch %21
+         %22 = OpLabel
+         %43 = OpLoad %int %ret
+               OpReturnValue %43
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %44
+         %47 = OpLabel
+         %48 = OpFunctionCall %int %func_
+         %50 = OpIEqual %bool %48 %int_2
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %53
+         %52 = OpLabel
+               OpStore %x_GLF_color %56
+               OpBranch %51
+         %53 = OpLabel
+               OpStore %x_GLF_color %57
+               OpBranch %51
+         %51 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %58
+%tint_symbol = OpFunctionParameter %main_out
+         %62 = OpLabel
+         %63 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %63
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %44
+         %65 = OpLabel
+         %66 = OpFunctionCall %void %main_1
+         %68 = OpLoad %v4float %x_GLF_color
+         %69 = OpCompositeConstruct %main_out %68
+         %67 = OpFunctionCall %void %tint_symbol_2 %69
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-and-in-for-loop-range/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-and-in-for-loop-range/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..b8c3805
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-and-in-for-loop-range/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,54 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> i32 {
+  var ret : i32;
+  var i : i32;
+  ret = 0;
+  i = 3;
+  loop {
+    let x_39 : i32 = i;
+    let x_40 : i32 = i;
+    if ((x_39 > (x_40 & 1))) {
+    } else {
+      break;
+    }
+    let x_44 : i32 = ret;
+    ret = (x_44 + 1);
+
+    continuing {
+      let x_47 : i32 = x_8.one;
+      let x_48 : i32 = i;
+      i = (x_48 - x_47);
+    }
+  }
+  let x_50 : i32 = ret;
+  return x_50;
+}
+
+fn main_1() {
+  let x_29 : i32 = func_();
+  if ((x_29 == 2)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-and-in-for-loop-range/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-and-in-for-loop-range/0-opt.wgsl
new file mode 100644
index 0000000..b8c3805
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-and-in-for-loop-range/0-opt.wgsl
@@ -0,0 +1,54 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> i32 {
+  var ret : i32;
+  var i : i32;
+  ret = 0;
+  i = 3;
+  loop {
+    let x_39 : i32 = i;
+    let x_40 : i32 = i;
+    if ((x_39 > (x_40 & 1))) {
+    } else {
+      break;
+    }
+    let x_44 : i32 = ret;
+    ret = (x_44 + 1);
+
+    continuing {
+      let x_47 : i32 = x_8.one;
+      let x_48 : i32 = i;
+      i = (x_48 - x_47);
+    }
+  }
+  let x_50 : i32 = ret;
+  return x_50;
+}
+
+fn main_1() {
+  let x_29 : i32 = func_();
+  if ((x_29 == 2)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-and-in-for-loop-range/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-and-in-for-loop-range/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..757f40b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-and-in-for-loop-range/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,47 @@
+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 func_() {
+  int ret = 0;
+  int i = 0;
+  ret = 0;
+  i = 3;
+  while (true) {
+    if ((i > (i & 1))) {
+    } else {
+      break;
+    }
+    ret = (ret + 1);
+    {
+      const int x_47 = asint(x_8[0].x);
+      i = (i - x_47);
+    }
+  }
+  return ret;
+}
+
+void main_1() {
+  const int x_29 = func_();
+  if ((x_29 == 2)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-and-in-for-loop-range/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-fold-and-in-for-loop-range/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..f57fd22
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-and-in-for-loop-range/0-opt.wgsl.expected.msl
@@ -0,0 +1,55 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int func_(constant buf0& x_8) {
+  int ret = 0;
+  int i = 0;
+  ret = 0;
+  i = 3;
+  while (true) {
+    int const x_39 = i;
+    int const x_40 = i;
+    if ((x_39 > (x_40 & 1))) {
+    } else {
+      break;
+    }
+    int const x_44 = ret;
+    ret = (x_44 + 1);
+    {
+      int const x_47 = x_8.one;
+      int const x_48 = i;
+      i = (x_48 - x_47);
+    }
+  }
+  int const x_50 = ret;
+  return x_50;
+}
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_4) {
+  int const x_29 = func_(x_8);
+  if ((x_29 == 2)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-and-in-for-loop-range/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fold-and-in-for-loop-range/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..6d8b1a2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-and-in-for-loop-range/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,127 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 70
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_ "func_"
+               OpName %ret "ret"
+               OpName %i "i"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+         %12 = OpTypeFunction %int
+%_ptr_Function_int = OpTypePointer Function %int
+         %17 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+      %int_3 = OpConstant %int 3
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %void = OpTypeVoid
+         %44 = OpTypeFunction %void
+      %int_2 = OpConstant %int 2
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %56 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %57 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %58 = OpTypeFunction %void %main_out
+      %func_ = OpFunction %int None %12
+         %14 = OpLabel
+        %ret = OpVariable %_ptr_Function_int Function %17
+          %i = OpVariable %_ptr_Function_int Function %17
+               OpStore %ret %int_0
+               OpStore %i %int_3
+               OpBranch %21
+         %21 = OpLabel
+               OpLoopMerge %22 %23 None
+               OpBranch %24
+         %24 = OpLabel
+         %25 = OpLoad %int %i
+         %26 = OpLoad %int %i
+         %28 = OpBitwiseAnd %int %26 %int_1
+         %29 = OpSGreaterThan %bool %25 %28
+               OpSelectionMerge %31 None
+               OpBranchConditional %29 %32 %33
+         %32 = OpLabel
+               OpBranch %31
+         %33 = OpLabel
+               OpBranch %22
+         %31 = OpLabel
+         %34 = OpLoad %int %ret
+         %35 = OpIAdd %int %34 %int_1
+               OpStore %ret %35
+               OpBranch %23
+         %23 = OpLabel
+         %39 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0
+         %40 = OpLoad %int %39
+         %41 = OpLoad %int %i
+         %42 = OpISub %int %41 %40
+               OpStore %i %42
+               OpBranch %21
+         %22 = OpLabel
+         %43 = OpLoad %int %ret
+               OpReturnValue %43
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %44
+         %47 = OpLabel
+         %48 = OpFunctionCall %int %func_
+         %50 = OpIEqual %bool %48 %int_2
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %53
+         %52 = OpLabel
+               OpStore %x_GLF_color %56
+               OpBranch %51
+         %53 = OpLabel
+               OpStore %x_GLF_color %57
+               OpBranch %51
+         %51 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %58
+%tint_symbol = OpFunctionParameter %main_out
+         %62 = OpLabel
+         %63 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %63
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %44
+         %65 = OpLabel
+         %66 = OpFunctionCall %void %main_1
+         %68 = OpLoad %v4float %x_GLF_color
+         %69 = OpCompositeConstruct %main_out %68
+         %67 = OpFunctionCall %void %tint_symbol_2 %69
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-and-in-for-loop-range/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-and-in-for-loop-range/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..b8c3805
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-and-in-for-loop-range/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,54 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> i32 {
+  var ret : i32;
+  var i : i32;
+  ret = 0;
+  i = 3;
+  loop {
+    let x_39 : i32 = i;
+    let x_40 : i32 = i;
+    if ((x_39 > (x_40 & 1))) {
+    } else {
+      break;
+    }
+    let x_44 : i32 = ret;
+    ret = (x_44 + 1);
+
+    continuing {
+      let x_47 : i32 = x_8.one;
+      let x_48 : i32 = i;
+      i = (x_48 - x_47);
+    }
+  }
+  let x_50 : i32 = ret;
+  return x_50;
+}
+
+fn main_1() {
+  let x_29 : i32 = func_();
+  if ((x_29 == 2)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-and-zero/0.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-and-zero/0.spvasm
new file mode 100644
index 0000000..6c35fbe
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-and-zero/0.spvasm
@@ -0,0 +1,50 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %18 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %19 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %7
+         %20 = OpLabel
+         %21 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %22 = OpLoad %int %21
+         %23 = OpBitwiseAnd %int %22 %int_0
+         %24 = OpIEqual %bool %23 %int_0
+               OpSelectionMerge %25 None
+               OpBranchConditional %24 %26 %27
+         %26 = OpLabel
+               OpStore %_GLF_color %18
+               OpBranch %25
+         %27 = OpLabel
+               OpStore %_GLF_color %19
+               OpBranch %25
+         %25 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-and-zero/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-and-zero/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..34a3e6f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-and-zero/0.spvasm.expected.hlsl
@@ -0,0 +1,28 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const int x_22 = asint(x_5[0].x);
+  if (((x_22 & 0) == 0)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-and-zero/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-and-zero/0.spvasm.expected.msl
new file mode 100644
index 0000000..fab551b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-and-zero/0.spvasm.expected.msl
@@ -0,0 +1,31 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  int const x_22 = x_5.one;
+  if (((x_22 & 0) == 0)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-and-zero/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-and-zero/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..b79eb2a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-and-zero/0.spvasm.expected.spvasm
@@ -0,0 +1,83 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 44
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %30 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %31 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %32 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+         %19 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0
+         %20 = OpLoad %int %19
+         %22 = OpBitwiseAnd %int %20 %int_0
+         %23 = OpIEqual %bool %22 %int_0
+               OpSelectionMerge %25 None
+               OpBranchConditional %23 %26 %27
+         %26 = OpLabel
+               OpStore %x_GLF_color %30
+               OpBranch %25
+         %27 = OpLabel
+               OpStore %x_GLF_color %31
+               OpBranch %25
+         %25 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %32
+%tint_symbol = OpFunctionParameter %main_out
+         %36 = OpLabel
+         %37 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %37
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %39 = OpLabel
+         %40 = OpFunctionCall %void %main_1
+         %42 = OpLoad %v4float %x_GLF_color
+         %43 = OpCompositeConstruct %main_out %42
+         %41 = OpFunctionCall %void %tint_symbol_2 %43
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-and-zero/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-and-zero/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..f8191eb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-and-zero/0.spvasm.expected.wgsl
@@ -0,0 +1,29 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_22 : i32 = x_5.one;
+  if (((x_22 & 0) == 0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-and-zero/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-and-zero/0.wgsl
new file mode 100644
index 0000000..f8191eb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-and-zero/0.wgsl
@@ -0,0 +1,29 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_22 : i32 = x_5.one;
+  if (((x_22 & 0) == 0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-and-zero/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-and-zero/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..34a3e6f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-and-zero/0.wgsl.expected.hlsl
@@ -0,0 +1,28 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const int x_22 = asint(x_5[0].x);
+  if (((x_22 & 0) == 0)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-and-zero/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-and-zero/0.wgsl.expected.msl
new file mode 100644
index 0000000..fab551b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-and-zero/0.wgsl.expected.msl
@@ -0,0 +1,31 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  int const x_22 = x_5.one;
+  if (((x_22 & 0) == 0)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-and-zero/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-and-zero/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..b79eb2a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-and-zero/0.wgsl.expected.spvasm
@@ -0,0 +1,83 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 44
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %30 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %31 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %32 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+         %19 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0
+         %20 = OpLoad %int %19
+         %22 = OpBitwiseAnd %int %20 %int_0
+         %23 = OpIEqual %bool %22 %int_0
+               OpSelectionMerge %25 None
+               OpBranchConditional %23 %26 %27
+         %26 = OpLabel
+               OpStore %x_GLF_color %30
+               OpBranch %25
+         %27 = OpLabel
+               OpStore %x_GLF_color %31
+               OpBranch %25
+         %25 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %32
+%tint_symbol = OpFunctionParameter %main_out
+         %36 = OpLabel
+         %37 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %37
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %39 = OpLabel
+         %40 = OpFunctionCall %void %main_1
+         %42 = OpLoad %v4float %x_GLF_color
+         %43 = OpCompositeConstruct %main_out %42
+         %41 = OpFunctionCall %void %tint_symbol_2 %43
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-and-zero/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-and-zero/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..f8191eb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-and-zero/0.wgsl.expected.wgsl
@@ -0,0 +1,29 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_22 : i32 = x_5.one;
+  if (((x_22 & 0) == 0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-or-full-mask/0.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-or-full-mask/0.spvasm
new file mode 100644
index 0000000..819e53a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-or-full-mask/0.spvasm
@@ -0,0 +1,51 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+     %int_n1 = OpConstant %int -1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %19 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %20 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %7
+         %21 = OpLabel
+         %22 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %23 = OpLoad %int %22
+         %24 = OpBitwiseOr %int %int_n1 %23
+         %25 = OpIEqual %bool %24 %int_n1
+               OpSelectionMerge %26 None
+               OpBranchConditional %25 %27 %28
+         %27 = OpLabel
+               OpStore %_GLF_color %19
+               OpBranch %26
+         %28 = OpLabel
+               OpStore %_GLF_color %20
+               OpBranch %26
+         %26 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-or-full-mask/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-or-full-mask/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..9c68880
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-or-full-mask/0.spvasm.expected.hlsl
@@ -0,0 +1,28 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const int x_23 = asint(x_5[0].x);
+  if (((-1 | x_23) == -1)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-or-full-mask/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-or-full-mask/0.spvasm.expected.msl
new file mode 100644
index 0000000..7b5a9e1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-or-full-mask/0.spvasm.expected.msl
@@ -0,0 +1,31 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  int const x_23 = x_5.one;
+  if (((-1 | x_23) == -1)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-or-full-mask/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-or-full-mask/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..5edb687
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-or-full-mask/0.spvasm.expected.spvasm
@@ -0,0 +1,83 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 44
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+     %int_n1 = OpConstant %int -1
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %30 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %31 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %32 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+         %19 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0
+         %20 = OpLoad %int %19
+         %22 = OpBitwiseOr %int %int_n1 %20
+         %23 = OpIEqual %bool %22 %int_n1
+               OpSelectionMerge %25 None
+               OpBranchConditional %23 %26 %27
+         %26 = OpLabel
+               OpStore %x_GLF_color %30
+               OpBranch %25
+         %27 = OpLabel
+               OpStore %x_GLF_color %31
+               OpBranch %25
+         %25 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %32
+%tint_symbol = OpFunctionParameter %main_out
+         %36 = OpLabel
+         %37 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %37
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %39 = OpLabel
+         %40 = OpFunctionCall %void %main_1
+         %42 = OpLoad %v4float %x_GLF_color
+         %43 = OpCompositeConstruct %main_out %42
+         %41 = OpFunctionCall %void %tint_symbol_2 %43
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-or-full-mask/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-or-full-mask/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..6af6f72
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-or-full-mask/0.spvasm.expected.wgsl
@@ -0,0 +1,29 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_23 : i32 = x_5.one;
+  if (((-1 | x_23) == -1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-or-full-mask/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-or-full-mask/0.wgsl
new file mode 100644
index 0000000..6af6f72
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-or-full-mask/0.wgsl
@@ -0,0 +1,29 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_23 : i32 = x_5.one;
+  if (((-1 | x_23) == -1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-or-full-mask/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-or-full-mask/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..9c68880
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-or-full-mask/0.wgsl.expected.hlsl
@@ -0,0 +1,28 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const int x_23 = asint(x_5[0].x);
+  if (((-1 | x_23) == -1)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-or-full-mask/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-or-full-mask/0.wgsl.expected.msl
new file mode 100644
index 0000000..7b5a9e1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-or-full-mask/0.wgsl.expected.msl
@@ -0,0 +1,31 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  int const x_23 = x_5.one;
+  if (((-1 | x_23) == -1)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-or-full-mask/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-or-full-mask/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..5edb687
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-or-full-mask/0.wgsl.expected.spvasm
@@ -0,0 +1,83 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 44
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+     %int_n1 = OpConstant %int -1
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %30 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %31 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %32 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+         %19 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0
+         %20 = OpLoad %int %19
+         %22 = OpBitwiseOr %int %int_n1 %20
+         %23 = OpIEqual %bool %22 %int_n1
+               OpSelectionMerge %25 None
+               OpBranchConditional %23 %26 %27
+         %26 = OpLabel
+               OpStore %x_GLF_color %30
+               OpBranch %25
+         %27 = OpLabel
+               OpStore %x_GLF_color %31
+               OpBranch %25
+         %25 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %32
+%tint_symbol = OpFunctionParameter %main_out
+         %36 = OpLabel
+         %37 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %37
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %39 = OpLabel
+         %40 = OpFunctionCall %void %main_1
+         %42 = OpLoad %v4float %x_GLF_color
+         %43 = OpCompositeConstruct %main_out %42
+         %41 = OpFunctionCall %void %tint_symbol_2 %43
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-or-full-mask/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-or-full-mask/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..6af6f72
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-or-full-mask/0.wgsl.expected.wgsl
@@ -0,0 +1,29 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_23 : i32 = x_5.one;
+  if (((-1 | x_23) == -1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-xor/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-xor/0-opt.spvasm
new file mode 100644
index 0000000..3c50991
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-xor/0-opt.spvasm
@@ -0,0 +1,53 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %a RelaxedPrecision
+               OpDecorate %b RelaxedPrecision
+               OpDecorate %6 RelaxedPrecision
+               OpDecorate %7 RelaxedPrecision
+               OpDecorate %8 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_6 = OpConstant %int 6
+      %int_5 = OpConstant %int 5
+      %int_3 = OpConstant %int 3
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %21 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+    %float_1 = OpConstant %float 1
+         %23 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %10
+         %24 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+          %b = OpVariable %_ptr_Function_int Function
+               OpStore %a %int_6
+               OpStore %b %int_5
+          %6 = OpLoad %int %a
+          %7 = OpLoad %int %b
+          %8 = OpBitwiseXor %int %6 %7
+         %25 = OpINotEqual %bool %8 %int_3
+               OpSelectionMerge %26 None
+               OpBranchConditional %25 %27 %28
+         %27 = OpLabel
+               OpStore %_GLF_color %21
+               OpBranch %26
+         %28 = OpLabel
+               OpStore %_GLF_color %23
+               OpBranch %26
+         %26 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-xor/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-xor/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..f27c44b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-xor/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,28 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  int b = 0;
+  a = 6;
+  b = 5;
+  if (((a ^ b) != 3)) {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  } else {
+    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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-xor/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-xor/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..5084cf3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-xor/0-opt.spvasm.expected.msl
@@ -0,0 +1,33 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  int a = 0;
+  int b = 0;
+  a = 6;
+  b = 5;
+  int const x_6 = a;
+  int const x_7 = b;
+  if (((x_6 ^ x_7) != 3)) {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  } else {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-xor/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-xor/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..0671048
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-xor/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,79 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 44
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %15 = OpConstantNull %int
+      %int_6 = OpConstant %int 6
+      %int_5 = OpConstant %int 5
+      %int_3 = OpConstant %int 3
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+         %29 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+    %float_1 = OpConstant %float 1
+         %31 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %32 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %15
+          %b = OpVariable %_ptr_Function_int Function %15
+               OpStore %a %int_6
+               OpStore %b %int_5
+         %19 = OpLoad %int %a
+         %20 = OpLoad %int %b
+         %21 = OpBitwiseXor %int %19 %20
+         %23 = OpINotEqual %bool %21 %int_3
+               OpSelectionMerge %25 None
+               OpBranchConditional %23 %26 %27
+         %26 = OpLabel
+               OpStore %x_GLF_color %29
+               OpBranch %25
+         %27 = OpLabel
+               OpStore %x_GLF_color %31
+               OpBranch %25
+         %25 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %32
+%tint_symbol = OpFunctionParameter %main_out
+         %36 = OpLabel
+         %37 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %37
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %39 = OpLabel
+         %40 = OpFunctionCall %void %main_1
+         %42 = OpLoad %v4float %x_GLF_color
+         %43 = OpCompositeConstruct %main_out %42
+         %41 = OpFunctionCall %void %tint_symbol_2 %43
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-xor/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-xor/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..a475384
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-xor/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,27 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var b : i32;
+  a = 6;
+  b = 5;
+  let x_6 : i32 = a;
+  let x_7 : i32 = b;
+  if (((x_6 ^ x_7) != 3)) {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-xor/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-xor/0-opt.wgsl
new file mode 100644
index 0000000..a475384
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-xor/0-opt.wgsl
@@ -0,0 +1,27 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var b : i32;
+  a = 6;
+  b = 5;
+  let x_6 : i32 = a;
+  let x_7 : i32 = b;
+  if (((x_6 ^ x_7) != 3)) {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-xor/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-xor/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..f27c44b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-xor/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,28 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  int b = 0;
+  a = 6;
+  b = 5;
+  if (((a ^ b) != 3)) {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  } else {
+    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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-xor/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-xor/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..5084cf3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-xor/0-opt.wgsl.expected.msl
@@ -0,0 +1,33 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  int a = 0;
+  int b = 0;
+  a = 6;
+  b = 5;
+  int const x_6 = a;
+  int const x_7 = b;
+  if (((x_6 ^ x_7) != 3)) {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  } else {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-xor/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-xor/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..0671048
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-xor/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,79 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 44
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %15 = OpConstantNull %int
+      %int_6 = OpConstant %int 6
+      %int_5 = OpConstant %int 5
+      %int_3 = OpConstant %int 3
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+         %29 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+    %float_1 = OpConstant %float 1
+         %31 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %32 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %15
+          %b = OpVariable %_ptr_Function_int Function %15
+               OpStore %a %int_6
+               OpStore %b %int_5
+         %19 = OpLoad %int %a
+         %20 = OpLoad %int %b
+         %21 = OpBitwiseXor %int %19 %20
+         %23 = OpINotEqual %bool %21 %int_3
+               OpSelectionMerge %25 None
+               OpBranchConditional %23 %26 %27
+         %26 = OpLabel
+               OpStore %x_GLF_color %29
+               OpBranch %25
+         %27 = OpLabel
+               OpStore %x_GLF_color %31
+               OpBranch %25
+         %25 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %32
+%tint_symbol = OpFunctionParameter %main_out
+         %36 = OpLabel
+         %37 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %37
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %39 = OpLabel
+         %40 = OpFunctionCall %void %main_1
+         %42 = OpLoad %v4float %x_GLF_color
+         %43 = OpCompositeConstruct %main_out %42
+         %41 = OpFunctionCall %void %tint_symbol_2 %43
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-xor/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-xor/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..a475384
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-bitwise-xor/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,27 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var b : i32;
+  a = 6;
+  b = 5;
+  let x_6 : i32 = a;
+  let x_7 : i32 = b;
+  if (((x_6 ^ x_7) != 3)) {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-const-variable/0.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-const-variable/0.spvasm
new file mode 100644
index 0000000..e200183
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-const-variable/0.spvasm
@@ -0,0 +1,41 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %6 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+      %false = OpConstantFalse %bool
+       %true = OpConstantTrue %bool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %15 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+    %float_1 = OpConstant %float 1
+         %17 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %6
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_bool Function
+               OpStore %a %false
+         %19 = OpLoad %bool %a
+         %20 = OpLogicalAnd %bool %true %19
+               OpSelectionMerge %21 None
+               OpBranchConditional %20 %22 %23
+         %22 = OpLabel
+               OpStore %_GLF_color %15
+               OpBranch %21
+         %23 = OpLabel
+               OpStore %_GLF_color %17
+               OpBranch %21
+         %21 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-const-variable/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-const-variable/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..205d238
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-const-variable/0.spvasm.expected.hlsl
@@ -0,0 +1,30 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  bool a = false;
+  a = false;
+  bool tint_tmp = true;
+  if (tint_tmp) {
+    tint_tmp = a;
+  }
+  if ((tint_tmp)) {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  } else {
+    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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-const-variable/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-const-variable/0.spvasm.expected.msl
new file mode 100644
index 0000000..c5fe7c9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-const-variable/0.spvasm.expected.msl
@@ -0,0 +1,30 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  bool a = false;
+  a = false;
+  bool const x_19 = a;
+  if ((true && x_19)) {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  } else {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-const-variable/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-const-variable/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..ae7b276
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-const-variable/0.spvasm.expected.spvasm
@@ -0,0 +1,77 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 41
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %15 = OpConstantNull %bool
+      %false = OpConstantFalse %bool
+       %true = OpConstantTrue %bool
+    %float_0 = OpConstant %float 0
+         %26 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+    %float_1 = OpConstant %float 1
+         %28 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %29 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %a = OpVariable %_ptr_Function_bool Function %15
+               OpStore %a %false
+         %17 = OpLoad %bool %a
+               OpSelectionMerge %19 None
+               OpBranchConditional %true %20 %19
+         %20 = OpLabel
+               OpBranch %19
+         %19 = OpLabel
+         %21 = OpPhi %bool %true %11 %17 %20
+               OpSelectionMerge %22 None
+               OpBranchConditional %21 %23 %24
+         %23 = OpLabel
+               OpStore %x_GLF_color %26
+               OpBranch %22
+         %24 = OpLabel
+               OpStore %x_GLF_color %28
+               OpBranch %22
+         %22 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %29
+%tint_symbol = OpFunctionParameter %main_out
+         %33 = OpLabel
+         %34 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %34
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %36 = OpLabel
+         %37 = OpFunctionCall %void %main_1
+         %39 = OpLoad %v4float %x_GLF_color
+         %40 = OpCompositeConstruct %main_out %39
+         %38 = OpFunctionCall %void %tint_symbol_2 %40
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-const-variable/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-const-variable/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..3d02048
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-const-variable/0.spvasm.expected.wgsl
@@ -0,0 +1,24 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : bool;
+  a = false;
+  let x_19 : bool = a;
+  if ((true && x_19)) {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-const-variable/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-const-variable/0.wgsl
new file mode 100644
index 0000000..3d02048
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-const-variable/0.wgsl
@@ -0,0 +1,24 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : bool;
+  a = false;
+  let x_19 : bool = a;
+  if ((true && x_19)) {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-const-variable/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-const-variable/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..205d238
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-const-variable/0.wgsl.expected.hlsl
@@ -0,0 +1,30 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  bool a = false;
+  a = false;
+  bool tint_tmp = true;
+  if (tint_tmp) {
+    tint_tmp = a;
+  }
+  if ((tint_tmp)) {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  } else {
+    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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-const-variable/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-const-variable/0.wgsl.expected.msl
new file mode 100644
index 0000000..c5fe7c9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-const-variable/0.wgsl.expected.msl
@@ -0,0 +1,30 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  bool a = false;
+  a = false;
+  bool const x_19 = a;
+  if ((true && x_19)) {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  } else {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-const-variable/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-const-variable/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..ae7b276
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-const-variable/0.wgsl.expected.spvasm
@@ -0,0 +1,77 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 41
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %15 = OpConstantNull %bool
+      %false = OpConstantFalse %bool
+       %true = OpConstantTrue %bool
+    %float_0 = OpConstant %float 0
+         %26 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+    %float_1 = OpConstant %float 1
+         %28 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %29 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %a = OpVariable %_ptr_Function_bool Function %15
+               OpStore %a %false
+         %17 = OpLoad %bool %a
+               OpSelectionMerge %19 None
+               OpBranchConditional %true %20 %19
+         %20 = OpLabel
+               OpBranch %19
+         %19 = OpLabel
+         %21 = OpPhi %bool %true %11 %17 %20
+               OpSelectionMerge %22 None
+               OpBranchConditional %21 %23 %24
+         %23 = OpLabel
+               OpStore %x_GLF_color %26
+               OpBranch %22
+         %24 = OpLabel
+               OpStore %x_GLF_color %28
+               OpBranch %22
+         %22 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %29
+%tint_symbol = OpFunctionParameter %main_out
+         %33 = OpLabel
+         %34 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %34
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %36 = OpLabel
+         %37 = OpFunctionCall %void %main_1
+         %39 = OpLoad %v4float %x_GLF_color
+         %40 = OpCompositeConstruct %main_out %39
+         %38 = OpFunctionCall %void %tint_symbol_2 %40
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-const-variable/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-const-variable/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..3d02048
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-const-variable/0.wgsl.expected.wgsl
@@ -0,0 +1,24 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : bool;
+  a = false;
+  let x_19 : bool = a;
+  if ((true && x_19)) {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-constant/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-constant/0-opt.spvasm
new file mode 100644
index 0000000..757b7ac
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-constant/0-opt.spvasm
@@ -0,0 +1,71 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %i "i"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %i RelaxedPrecision
+               OpDecorate %6 RelaxedPrecision
+               OpDecorate %7 RelaxedPrecision
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %8 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_2 = OpConstant %int 2
+      %int_1 = OpConstant %int 1
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+      %int_3 = OpConstant %int 3
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+         %27 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %28 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %10
+         %29 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+               OpStore %i %int_2
+               OpBranch %30
+         %30 = OpLabel
+               OpLoopMerge %31 %32 None
+               OpBranch %33
+         %33 = OpLabel
+          %6 = OpLoad %int %i
+          %7 = OpIAdd %int %6 %int_1
+               OpStore %i %7
+               OpBranch %32
+         %32 = OpLabel
+         %34 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %35 = OpLoad %float %34
+         %36 = OpFOrdGreaterThanEqual %bool %35 %float_0
+         %37 = OpLogicalAnd %bool %36 %false
+               OpBranchConditional %37 %30 %31
+         %31 = OpLabel
+          %8 = OpLoad %int %i
+         %38 = OpIEqual %bool %8 %int_3
+               OpSelectionMerge %39 None
+               OpBranchConditional %38 %40 %41
+         %40 = OpLabel
+               OpStore %_GLF_color %27
+               OpBranch %39
+         %41 = OpLabel
+               OpStore %_GLF_color %28
+               OpBranch %39
+         %39 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-constant/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-constant/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..52e6a55
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-constant/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,46 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int i = 0;
+  i = 2;
+  while (true) {
+    i = (i + 1);
+    {
+      const float x_35 = gl_FragCoord.x;
+      bool tint_tmp = (x_35 >= 0.0f);
+      if (tint_tmp) {
+        tint_tmp = false;
+      }
+      if ((tint_tmp)) {
+      } else {
+        break;
+      }
+    }
+  }
+  if ((i == 3)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-constant/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-constant/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..a3fb456
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-constant/0-opt.spvasm.expected.msl
@@ -0,0 +1,43 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int i = 0;
+  i = 2;
+  while (true) {
+    int const x_6 = i;
+    i = (x_6 + 1);
+    {
+      float const x_35 = (*(tint_symbol_5)).x;
+      if (((x_35 >= 0.0f) && false)) {
+      } else {
+        break;
+      }
+    }
+  }
+  int const x_8 = i;
+  if ((x_8 == 3)) {
+    *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_6) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(&(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-constant/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-constant/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..5285dcf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-constant/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,119 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 64
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+      %int_2 = OpConstant %int 2
+      %int_1 = OpConstant %int 1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+      %int_3 = OpConstant %int 3
+    %float_1 = OpConstant %float 1
+         %49 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %50 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %51 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %18
+               OpStore %i %int_2
+               OpBranch %20
+         %20 = OpLabel
+               OpLoopMerge %21 %22 None
+               OpBranch %23
+         %23 = OpLabel
+         %24 = OpLoad %int %i
+         %26 = OpIAdd %int %24 %int_1
+               OpStore %i %26
+               OpBranch %22
+         %22 = OpLabel
+         %30 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %31 = OpLoad %float %30
+         %33 = OpFOrdGreaterThanEqual %bool %31 %float_0
+               OpSelectionMerge %35 None
+               OpBranchConditional %33 %36 %35
+         %36 = OpLabel
+               OpBranch %35
+         %35 = OpLabel
+         %38 = OpPhi %bool %33 %22 %false %36
+               OpSelectionMerge %39 None
+               OpBranchConditional %38 %40 %41
+         %40 = OpLabel
+               OpBranch %39
+         %41 = OpLabel
+               OpBranch %21
+         %39 = OpLabel
+               OpBranch %20
+         %21 = OpLabel
+         %42 = OpLoad %int %i
+         %44 = OpIEqual %bool %42 %int_3
+               OpSelectionMerge %45 None
+               OpBranchConditional %44 %46 %47
+         %46 = OpLabel
+               OpStore %x_GLF_color %49
+               OpBranch %45
+         %47 = OpLabel
+               OpStore %x_GLF_color %50
+               OpBranch %45
+         %45 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %51
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %55 = OpLabel
+         %56 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %56
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %58 = OpLabel
+         %59 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %59
+         %60 = OpFunctionCall %void %main_1
+         %62 = OpLoad %v4float %x_GLF_color
+         %63 = OpCompositeConstruct %main_out %62
+         %61 = OpFunctionCall %void %tint_symbol_3 %63
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 22[%22] is not post dominated by the back-edge block 39[%39]
+  %39 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-constant/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-constant/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..4fa9901
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-constant/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,39 @@
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  i = 2;
+  loop {
+    let x_6 : i32 = i;
+    i = (x_6 + 1);
+
+    continuing {
+      let x_35 : f32 = gl_FragCoord.x;
+      if (((x_35 >= 0.0) && false)) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_8 : i32 = i;
+  if ((x_8 == 3)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-constant/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-constant/0-opt.wgsl
new file mode 100644
index 0000000..4fa9901
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-constant/0-opt.wgsl
@@ -0,0 +1,39 @@
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  i = 2;
+  loop {
+    let x_6 : i32 = i;
+    i = (x_6 + 1);
+
+    continuing {
+      let x_35 : f32 = gl_FragCoord.x;
+      if (((x_35 >= 0.0) && false)) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_8 : i32 = i;
+  if ((x_8 == 3)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-constant/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-constant/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..52e6a55
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-constant/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,46 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int i = 0;
+  i = 2;
+  while (true) {
+    i = (i + 1);
+    {
+      const float x_35 = gl_FragCoord.x;
+      bool tint_tmp = (x_35 >= 0.0f);
+      if (tint_tmp) {
+        tint_tmp = false;
+      }
+      if ((tint_tmp)) {
+      } else {
+        break;
+      }
+    }
+  }
+  if ((i == 3)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-constant/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-constant/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..a3fb456
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-constant/0-opt.wgsl.expected.msl
@@ -0,0 +1,43 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int i = 0;
+  i = 2;
+  while (true) {
+    int const x_6 = i;
+    i = (x_6 + 1);
+    {
+      float const x_35 = (*(tint_symbol_5)).x;
+      if (((x_35 >= 0.0f) && false)) {
+      } else {
+        break;
+      }
+    }
+  }
+  int const x_8 = i;
+  if ((x_8 == 3)) {
+    *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_6) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(&(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-constant/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-constant/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..5285dcf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-constant/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,119 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 64
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+      %int_2 = OpConstant %int 2
+      %int_1 = OpConstant %int 1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+      %int_3 = OpConstant %int 3
+    %float_1 = OpConstant %float 1
+         %49 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %50 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %51 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %18
+               OpStore %i %int_2
+               OpBranch %20
+         %20 = OpLabel
+               OpLoopMerge %21 %22 None
+               OpBranch %23
+         %23 = OpLabel
+         %24 = OpLoad %int %i
+         %26 = OpIAdd %int %24 %int_1
+               OpStore %i %26
+               OpBranch %22
+         %22 = OpLabel
+         %30 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %31 = OpLoad %float %30
+         %33 = OpFOrdGreaterThanEqual %bool %31 %float_0
+               OpSelectionMerge %35 None
+               OpBranchConditional %33 %36 %35
+         %36 = OpLabel
+               OpBranch %35
+         %35 = OpLabel
+         %38 = OpPhi %bool %33 %22 %false %36
+               OpSelectionMerge %39 None
+               OpBranchConditional %38 %40 %41
+         %40 = OpLabel
+               OpBranch %39
+         %41 = OpLabel
+               OpBranch %21
+         %39 = OpLabel
+               OpBranch %20
+         %21 = OpLabel
+         %42 = OpLoad %int %i
+         %44 = OpIEqual %bool %42 %int_3
+               OpSelectionMerge %45 None
+               OpBranchConditional %44 %46 %47
+         %46 = OpLabel
+               OpStore %x_GLF_color %49
+               OpBranch %45
+         %47 = OpLabel
+               OpStore %x_GLF_color %50
+               OpBranch %45
+         %45 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %51
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %55 = OpLabel
+         %56 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %56
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %58 = OpLabel
+         %59 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %59
+         %60 = OpFunctionCall %void %main_1
+         %62 = OpLoad %v4float %x_GLF_color
+         %63 = OpCompositeConstruct %main_out %62
+         %61 = OpFunctionCall %void %tint_symbol_3 %63
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 22[%22] is not post dominated by the back-edge block 39[%39]
+  %39 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-constant/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-constant/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..4fa9901
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-constant/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,39 @@
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  i = 2;
+  loop {
+    let x_6 : i32 = i;
+    i = (x_6 + 1);
+
+    continuing {
+      let x_35 : f32 = gl_FragCoord.x;
+      if (((x_35 >= 0.0) && false)) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_8 : i32 = i;
+  if ((x_8 == 3)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-or-constant/0.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-or-constant/0.spvasm
new file mode 100644
index 0000000..1155fec
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-or-constant/0.spvasm
@@ -0,0 +1,45 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %6 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+         %18 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %19 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %6
+         %20 = OpLabel
+         %21 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %22 = OpLoad %float %21
+         %23 = OpFOrdLessThan %bool %22 %float_0
+         %24 = OpLogicalOr %bool %23 %true
+               OpSelectionMerge %25 None
+               OpBranchConditional %24 %26 %27
+         %26 = OpLabel
+               OpStore %_GLF_color %18
+               OpBranch %25
+         %27 = OpLabel
+               OpStore %_GLF_color %19
+               OpBranch %25
+         %25 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-or-constant/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-or-constant/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..e1f6bdd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-or-constant/0.spvasm.expected.hlsl
@@ -0,0 +1,35 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const float x_22 = gl_FragCoord.x;
+  bool tint_tmp = (x_22 < 0.0f);
+  if (!tint_tmp) {
+    tint_tmp = true;
+  }
+  if ((tint_tmp)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-or-constant/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-or-constant/0.spvasm.expected.msl
new file mode 100644
index 0000000..c32c624
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-or-constant/0.spvasm.expected.msl
@@ -0,0 +1,30 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float const x_22 = (*(tint_symbol_5)).x;
+  if (((x_22 < 0.0f) || true)) {
+    *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_6) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(&(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-or-constant/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-or-constant/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..53bc076
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-or-constant/0.spvasm.expected.spvasm
@@ -0,0 +1,84 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 46
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+    %float_1 = OpConstant %float 1
+         %31 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %32 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %33 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+         %18 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %19 = OpLoad %float %18
+         %21 = OpFOrdLessThan %bool %19 %float_0
+               OpSelectionMerge %23 None
+               OpBranchConditional %21 %23 %24
+         %24 = OpLabel
+               OpBranch %23
+         %23 = OpLabel
+         %26 = OpPhi %bool %21 %14 %true %24
+               OpSelectionMerge %27 None
+               OpBranchConditional %26 %28 %29
+         %28 = OpLabel
+               OpStore %x_GLF_color %31
+               OpBranch %27
+         %29 = OpLabel
+               OpStore %x_GLF_color %32
+               OpBranch %27
+         %27 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %33
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %37 = OpLabel
+         %38 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %38
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %40 = OpLabel
+         %41 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %41
+         %42 = OpFunctionCall %void %main_1
+         %44 = OpLoad %v4float %x_GLF_color
+         %45 = OpCompositeConstruct %main_out %44
+         %43 = OpFunctionCall %void %tint_symbol_3 %45
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-or-constant/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-or-constant/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..56678ab
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-or-constant/0.spvasm.expected.wgsl
@@ -0,0 +1,25 @@
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_22 : f32 = gl_FragCoord.x;
+  if (((x_22 < 0.0) || true)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-or-constant/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-or-constant/0.wgsl
new file mode 100644
index 0000000..56678ab
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-or-constant/0.wgsl
@@ -0,0 +1,25 @@
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_22 : f32 = gl_FragCoord.x;
+  if (((x_22 < 0.0) || true)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-or-constant/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-or-constant/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..e1f6bdd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-or-constant/0.wgsl.expected.hlsl
@@ -0,0 +1,35 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const float x_22 = gl_FragCoord.x;
+  bool tint_tmp = (x_22 < 0.0f);
+  if (!tint_tmp) {
+    tint_tmp = true;
+  }
+  if ((tint_tmp)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-or-constant/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-or-constant/0.wgsl.expected.msl
new file mode 100644
index 0000000..c32c624
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-or-constant/0.wgsl.expected.msl
@@ -0,0 +1,30 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float const x_22 = (*(tint_symbol_5)).x;
+  if (((x_22 < 0.0f) || true)) {
+    *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_6) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(&(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-or-constant/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-or-constant/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..53bc076
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-or-constant/0.wgsl.expected.spvasm
@@ -0,0 +1,84 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 46
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+    %float_1 = OpConstant %float 1
+         %31 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %32 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %33 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+         %18 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %19 = OpLoad %float %18
+         %21 = OpFOrdLessThan %bool %19 %float_0
+               OpSelectionMerge %23 None
+               OpBranchConditional %21 %23 %24
+         %24 = OpLabel
+               OpBranch %23
+         %23 = OpLabel
+         %26 = OpPhi %bool %21 %14 %true %24
+               OpSelectionMerge %27 None
+               OpBranchConditional %26 %28 %29
+         %28 = OpLabel
+               OpStore %x_GLF_color %31
+               OpBranch %27
+         %29 = OpLabel
+               OpStore %x_GLF_color %32
+               OpBranch %27
+         %27 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %33
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %37 = OpLabel
+         %38 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %38
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %40 = OpLabel
+         %41 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %41
+         %42 = OpFunctionCall %void %main_1
+         %44 = OpLoad %v4float %x_GLF_color
+         %45 = OpCompositeConstruct %main_out %44
+         %43 = OpFunctionCall %void %tint_symbol_3 %45
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-or-constant/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-or-constant/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..56678ab
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-or-constant/0.wgsl.expected.wgsl
@@ -0,0 +1,25 @@
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_22 : f32 = gl_FragCoord.x;
+  if (((x_22 < 0.0) || true)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-min-int-value/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-min-int-value/0-opt.spvasm
new file mode 100644
index 0000000..9ddf7dc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-min-int-value/0-opt.spvasm
@@ -0,0 +1,62 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %minValue "minValue"
+               OpName %negMinValue "negMinValue"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "minusOne"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+%int_n2147483648 = OpConstant %int -2147483648
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %22 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %23 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %9
+         %24 = OpLabel
+   %minValue = OpVariable %_ptr_Function_int Function
+%negMinValue = OpVariable %_ptr_Function_int Function
+               OpStore %minValue %int_n2147483648
+         %25 = OpLoad %int %minValue
+         %26 = OpSNegate %int %25
+               OpStore %negMinValue %26
+         %27 = OpLoad %int %negMinValue
+         %28 = OpLoad %int %minValue
+         %29 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %30 = OpLoad %int %29
+         %31 = OpIMul %int %28 %30
+         %32 = OpIEqual %bool %27 %31
+               OpSelectionMerge %33 None
+               OpBranchConditional %32 %34 %35
+         %34 = OpLabel
+               OpStore %_GLF_color %22
+               OpBranch %33
+         %35 = OpLabel
+               OpStore %_GLF_color %23
+               OpBranch %33
+         %33 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-min-int-value/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-min-int-value/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..9fa0010
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-min-int-value/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,34 @@
+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() {
+  int minValue = 0;
+  int negMinValue = 0;
+  minValue = -2147483648;
+  negMinValue = -(minValue);
+  const int x_27 = negMinValue;
+  const int x_28 = minValue;
+  const int x_30 = asint(x_7[0].x);
+  if ((x_27 == (x_28 * x_30))) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-min-int-value/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-min-int-value/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..bc8e92f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-min-int-value/0-opt.spvasm.expected.msl
@@ -0,0 +1,38 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int minusOne;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_4) {
+  int minValue = 0;
+  int negMinValue = 0;
+  minValue = -2147483648;
+  int const x_25 = minValue;
+  negMinValue = -(x_25);
+  int const x_27 = negMinValue;
+  int const x_28 = minValue;
+  int const x_30 = x_7.minusOne;
+  if ((x_27 == (x_28 * x_30))) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-min-int-value/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-min-int-value/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..3ae71bd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-min-int-value/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,95 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 52
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "minusOne"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %minValue "minValue"
+               OpName %negMinValue "negMinValue"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+%int_n2147483648 = OpConstant %int -2147483648
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %38 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %39 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %40 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+   %minValue = OpVariable %_ptr_Function_int Function %18
+%negMinValue = OpVariable %_ptr_Function_int Function %18
+               OpStore %minValue %int_n2147483648
+         %21 = OpLoad %int %minValue
+         %22 = OpSNegate %int %21
+               OpStore %negMinValue %22
+         %23 = OpLoad %int %negMinValue
+         %24 = OpLoad %int %minValue
+         %28 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %29 = OpLoad %int %28
+         %30 = OpIMul %int %24 %29
+         %31 = OpIEqual %bool %23 %30
+               OpSelectionMerge %33 None
+               OpBranchConditional %31 %34 %35
+         %34 = OpLabel
+               OpStore %x_GLF_color %38
+               OpBranch %33
+         %35 = OpLabel
+               OpStore %x_GLF_color %39
+               OpBranch %33
+         %33 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %40
+%tint_symbol = OpFunctionParameter %main_out
+         %44 = OpLabel
+         %45 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %45
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %47 = OpLabel
+         %48 = OpFunctionCall %void %main_1
+         %50 = OpLoad %v4float %x_GLF_color
+         %51 = OpCompositeConstruct %main_out %50
+         %49 = OpFunctionCall %void %tint_symbol_2 %51
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-min-int-value/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-min-int-value/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..ae8dd8b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-min-int-value/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,36 @@
+[[block]]
+struct buf0 {
+  minusOne : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var minValue : i32;
+  var negMinValue : i32;
+  minValue = -2147483648;
+  let x_25 : i32 = minValue;
+  negMinValue = -(x_25);
+  let x_27 : i32 = negMinValue;
+  let x_28 : i32 = minValue;
+  let x_30 : i32 = x_7.minusOne;
+  if ((x_27 == (x_28 * x_30))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-min-int-value/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-min-int-value/0-opt.wgsl
new file mode 100644
index 0000000..ae8dd8b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-min-int-value/0-opt.wgsl
@@ -0,0 +1,36 @@
+[[block]]
+struct buf0 {
+  minusOne : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var minValue : i32;
+  var negMinValue : i32;
+  minValue = -2147483648;
+  let x_25 : i32 = minValue;
+  negMinValue = -(x_25);
+  let x_27 : i32 = negMinValue;
+  let x_28 : i32 = minValue;
+  let x_30 : i32 = x_7.minusOne;
+  if ((x_27 == (x_28 * x_30))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-min-int-value/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-min-int-value/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..9fa0010
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-min-int-value/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,34 @@
+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() {
+  int minValue = 0;
+  int negMinValue = 0;
+  minValue = -2147483648;
+  negMinValue = -(minValue);
+  const int x_27 = negMinValue;
+  const int x_28 = minValue;
+  const int x_30 = asint(x_7[0].x);
+  if ((x_27 == (x_28 * x_30))) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-min-int-value/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-min-int-value/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..bc8e92f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-min-int-value/0-opt.wgsl.expected.msl
@@ -0,0 +1,38 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int minusOne;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_4) {
+  int minValue = 0;
+  int negMinValue = 0;
+  minValue = -2147483648;
+  int const x_25 = minValue;
+  negMinValue = -(x_25);
+  int const x_27 = negMinValue;
+  int const x_28 = minValue;
+  int const x_30 = x_7.minusOne;
+  if ((x_27 == (x_28 * x_30))) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-min-int-value/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-min-int-value/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..3ae71bd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-min-int-value/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,95 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 52
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "minusOne"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %minValue "minValue"
+               OpName %negMinValue "negMinValue"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+%int_n2147483648 = OpConstant %int -2147483648
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %38 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %39 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %40 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+   %minValue = OpVariable %_ptr_Function_int Function %18
+%negMinValue = OpVariable %_ptr_Function_int Function %18
+               OpStore %minValue %int_n2147483648
+         %21 = OpLoad %int %minValue
+         %22 = OpSNegate %int %21
+               OpStore %negMinValue %22
+         %23 = OpLoad %int %negMinValue
+         %24 = OpLoad %int %minValue
+         %28 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %29 = OpLoad %int %28
+         %30 = OpIMul %int %24 %29
+         %31 = OpIEqual %bool %23 %30
+               OpSelectionMerge %33 None
+               OpBranchConditional %31 %34 %35
+         %34 = OpLabel
+               OpStore %x_GLF_color %38
+               OpBranch %33
+         %35 = OpLabel
+               OpStore %x_GLF_color %39
+               OpBranch %33
+         %33 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %40
+%tint_symbol = OpFunctionParameter %main_out
+         %44 = OpLabel
+         %45 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %45
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %47 = OpLabel
+         %48 = OpFunctionCall %void %main_1
+         %50 = OpLoad %v4float %x_GLF_color
+         %51 = OpCompositeConstruct %main_out %50
+         %49 = OpFunctionCall %void %tint_symbol_2 %51
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-min-int-value/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-min-int-value/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..ae8dd8b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-min-int-value/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,36 @@
+[[block]]
+struct buf0 {
+  minusOne : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var minValue : i32;
+  var negMinValue : i32;
+  minValue = -2147483648;
+  let x_25 : i32 = minValue;
+  negMinValue = -(x_25);
+  let x_27 : i32 = negMinValue;
+  let x_28 : i32 = minValue;
+  let x_30 : i32 = x_7.minusOne;
+  if ((x_27 == (x_28 * x_30))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-variable/0.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-variable/0.spvasm
new file mode 100644
index 0000000..6b8e95c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-variable/0.spvasm
@@ -0,0 +1,46 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %i "i"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %i RelaxedPrecision
+               OpDecorate %5 RelaxedPrecision
+               OpDecorate %6 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_3 = OpConstant %int 3
+     %int_n4 = OpConstant %int -4
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %19 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %20 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %8
+         %21 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+               OpStore %i %int_3
+          %5 = OpLoad %int %i
+          %6 = OpNot %int %5
+         %22 = OpIEqual %bool %6 %int_n4
+               OpSelectionMerge %23 None
+               OpBranchConditional %22 %24 %25
+         %24 = OpLabel
+               OpStore %_GLF_color %19
+               OpBranch %23
+         %25 = OpLabel
+               OpStore %_GLF_color %20
+               OpBranch %23
+         %23 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-variable/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-variable/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..200bb96
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-variable/0.spvasm.expected.hlsl
@@ -0,0 +1,26 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int i = 0;
+  i = 3;
+  if ((~(i) == -4)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-variable/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-variable/0.spvasm.expected.msl
new file mode 100644
index 0000000..cff2cd3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-variable/0.spvasm.expected.msl
@@ -0,0 +1,30 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  int i = 0;
+  i = 3;
+  int const x_5 = i;
+  if ((~(x_5) == -4)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-variable/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-variable/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..358ea77
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-variable/0.spvasm.expected.spvasm
@@ -0,0 +1,74 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 41
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %15 = OpConstantNull %int
+      %int_3 = OpConstant %int 3
+     %int_n4 = OpConstant %int -4
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %27 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %28 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %29 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %15
+               OpStore %i %int_3
+         %17 = OpLoad %int %i
+         %18 = OpNot %int %17
+         %20 = OpIEqual %bool %18 %int_n4
+               OpSelectionMerge %22 None
+               OpBranchConditional %20 %23 %24
+         %23 = OpLabel
+               OpStore %x_GLF_color %27
+               OpBranch %22
+         %24 = OpLabel
+               OpStore %x_GLF_color %28
+               OpBranch %22
+         %22 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %29
+%tint_symbol = OpFunctionParameter %main_out
+         %33 = OpLabel
+         %34 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %34
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %36 = OpLabel
+         %37 = OpFunctionCall %void %main_1
+         %39 = OpLoad %v4float %x_GLF_color
+         %40 = OpCompositeConstruct %main_out %39
+         %38 = OpFunctionCall %void %tint_symbol_2 %40
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-variable/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-variable/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..ec3893d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-variable/0.spvasm.expected.wgsl
@@ -0,0 +1,24 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  i = 3;
+  let x_5 : i32 = i;
+  if ((~(x_5) == -4)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-variable/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-variable/0.wgsl
new file mode 100644
index 0000000..ec3893d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-variable/0.wgsl
@@ -0,0 +1,24 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  i = 3;
+  let x_5 : i32 = i;
+  if ((~(x_5) == -4)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-variable/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-variable/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..200bb96
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-variable/0.wgsl.expected.hlsl
@@ -0,0 +1,26 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int i = 0;
+  i = 3;
+  if ((~(i) == -4)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-variable/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-variable/0.wgsl.expected.msl
new file mode 100644
index 0000000..cff2cd3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-variable/0.wgsl.expected.msl
@@ -0,0 +1,30 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  int i = 0;
+  i = 3;
+  int const x_5 = i;
+  if ((~(x_5) == -4)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-variable/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-variable/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..358ea77
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-variable/0.wgsl.expected.spvasm
@@ -0,0 +1,74 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 41
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %15 = OpConstantNull %int
+      %int_3 = OpConstant %int 3
+     %int_n4 = OpConstant %int -4
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %27 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %28 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %29 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %15
+               OpStore %i %int_3
+         %17 = OpLoad %int %i
+         %18 = OpNot %int %17
+         %20 = OpIEqual %bool %18 %int_n4
+               OpSelectionMerge %22 None
+               OpBranchConditional %20 %23 %24
+         %23 = OpLabel
+               OpStore %x_GLF_color %27
+               OpBranch %22
+         %24 = OpLabel
+               OpStore %x_GLF_color %28
+               OpBranch %22
+         %22 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %29
+%tint_symbol = OpFunctionParameter %main_out
+         %33 = OpLabel
+         %34 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %34
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %36 = OpLabel
+         %37 = OpFunctionCall %void %main_1
+         %39 = OpLoad %v4float %x_GLF_color
+         %40 = OpCompositeConstruct %main_out %39
+         %38 = OpFunctionCall %void %tint_symbol_2 %40
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-variable/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-variable/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..ec3893d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-negate-variable/0.wgsl.expected.wgsl
@@ -0,0 +1,24 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  i = 3;
+  let x_5 : i32 = i;
+  if ((~(x_5) == -4)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-gte32/0.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-gte32/0.spvasm
new file mode 100644
index 0000000..e4241f1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-gte32/0.spvasm
@@ -0,0 +1,166 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %_ ""
+               OpName %b "b"
+               OpName %c "c"
+               OpName %d "d"
+               OpName %e "e"
+               OpName %f "f"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+    %uint_77 = OpConstant %uint 77
+       %buf0 = OpTypeStruct %uint
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+    %uint_32 = OpConstant %uint 32
+  %uint_3243 = OpConstant %uint 3243
+    %uint_33 = OpConstant %uint 33
+    %uint_23 = OpConstant %uint 23
+   %uint_345 = OpConstant %uint 345
+  %uint_2395 = OpConstant %uint 2395
+%uint_290485 = OpConstant %uint 290485
+ %uint_44321 = OpConstant %uint 44321
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+     %uint_0 = OpConstant %uint 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %37 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %38 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %13
+         %39 = OpLabel
+          %a = OpVariable %_ptr_Function_uint Function
+          %b = OpVariable %_ptr_Function_uint Function
+          %c = OpVariable %_ptr_Function_uint Function
+          %d = OpVariable %_ptr_Function_uint Function
+          %e = OpVariable %_ptr_Function_uint Function
+          %f = OpVariable %_ptr_Function_uint Function
+         %40 = OpAccessChain %_ptr_Uniform_uint %_ %int_0
+         %41 = OpLoad %uint %40
+         %42 = OpIAdd %uint %uint_77 %41
+         %43 = OpShiftRightLogical %uint %42 %uint_32
+               OpStore %a %43
+         %44 = OpAccessChain %_ptr_Uniform_uint %_ %int_0
+         %45 = OpLoad %uint %44
+         %46 = OpIAdd %uint %uint_3243 %45
+         %47 = OpShiftRightLogical %uint %46 %uint_33
+               OpStore %b %47
+         %48 = OpAccessChain %_ptr_Uniform_uint %_ %int_0
+         %49 = OpLoad %uint %48
+         %50 = OpIAdd %uint %uint_23 %49
+         %51 = OpShiftRightLogical %uint %50 %uint_345
+               OpStore %c %51
+         %52 = OpAccessChain %_ptr_Uniform_uint %_ %int_0
+         %53 = OpLoad %uint %52
+         %54 = OpIAdd %uint %uint_2395 %53
+         %55 = OpShiftLeftLogical %uint %54 %uint_32
+               OpStore %d %55
+         %56 = OpAccessChain %_ptr_Uniform_uint %_ %int_0
+         %57 = OpLoad %uint %56
+         %58 = OpIAdd %uint %uint_290485 %57
+         %59 = OpShiftLeftLogical %uint %58 %uint_33
+               OpStore %e %59
+         %60 = OpAccessChain %_ptr_Uniform_uint %_ %int_0
+         %61 = OpLoad %uint %60
+         %62 = OpIAdd %uint %uint_44321 %61
+         %63 = OpShiftLeftLogical %uint %62 %uint_345
+               OpStore %f %63
+         %64 = OpLoad %uint %a
+         %65 = OpINotEqual %bool %64 %uint_1
+               OpSelectionMerge %66 None
+               OpBranchConditional %65 %67 %66
+         %67 = OpLabel
+               OpStore %a %uint_1
+               OpBranch %66
+         %66 = OpLabel
+         %68 = OpLoad %uint %b
+         %69 = OpINotEqual %bool %68 %uint_0
+               OpSelectionMerge %70 None
+               OpBranchConditional %69 %71 %70
+         %71 = OpLabel
+               OpStore %b %uint_0
+               OpBranch %70
+         %70 = OpLabel
+         %72 = OpLoad %uint %c
+         %73 = OpINotEqual %bool %72 %uint_1
+               OpSelectionMerge %74 None
+               OpBranchConditional %73 %75 %74
+         %75 = OpLabel
+               OpStore %c %uint_1
+               OpBranch %74
+         %74 = OpLabel
+         %76 = OpLoad %uint %d
+         %77 = OpINotEqual %bool %76 %uint_0
+               OpSelectionMerge %78 None
+               OpBranchConditional %77 %79 %78
+         %79 = OpLabel
+               OpStore %d %uint_0
+               OpBranch %78
+         %78 = OpLabel
+         %80 = OpLoad %uint %e
+         %81 = OpINotEqual %bool %80 %uint_1
+               OpSelectionMerge %82 None
+               OpBranchConditional %81 %83 %82
+         %83 = OpLabel
+               OpStore %e %uint_1
+               OpBranch %82
+         %82 = OpLabel
+         %84 = OpLoad %uint %f
+         %85 = OpINotEqual %bool %84 %uint_0
+               OpSelectionMerge %86 None
+               OpBranchConditional %85 %87 %86
+         %87 = OpLabel
+               OpStore %f %uint_0
+               OpBranch %86
+         %86 = OpLabel
+         %88 = OpLoad %uint %a
+         %89 = OpIEqual %bool %88 %uint_1
+         %90 = OpLoad %uint %b
+         %91 = OpIEqual %bool %90 %uint_0
+         %92 = OpLogicalAnd %bool %89 %91
+         %93 = OpLoad %uint %c
+         %94 = OpIEqual %bool %93 %uint_1
+         %95 = OpLogicalAnd %bool %92 %94
+         %96 = OpLoad %uint %d
+         %97 = OpIEqual %bool %96 %uint_0
+         %98 = OpLogicalAnd %bool %95 %97
+         %99 = OpLoad %uint %e
+        %100 = OpIEqual %bool %99 %uint_1
+        %101 = OpLogicalAnd %bool %98 %100
+        %102 = OpLoad %uint %f
+        %103 = OpIEqual %bool %102 %uint_0
+        %104 = OpLogicalAnd %bool %101 %103
+               OpSelectionMerge %105 None
+               OpBranchConditional %104 %106 %107
+        %106 = OpLabel
+               OpStore %_GLF_color %37
+               OpBranch %105
+        %107 = OpLabel
+               OpStore %_GLF_color %38
+               OpBranch %105
+        %105 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-gte32/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-gte32/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..44f7ed6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-gte32/0.spvasm.expected.hlsl
@@ -0,0 +1,83 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  uint a = 0u;
+  uint b = 0u;
+  uint c = 0u;
+  uint d = 0u;
+  uint e = 0u;
+  uint f = 0u;
+  const uint x_41 = x_6[0].x;
+  a = ((77u + x_41) >> 32u);
+  const uint x_45 = x_6[0].x;
+  b = ((3243u + x_45) >> 33u);
+  const uint x_49 = x_6[0].x;
+  c = ((23u + x_49) >> 345u);
+  const uint x_53 = x_6[0].x;
+  d = ((2395u + x_53) << 32u);
+  const uint x_57 = x_6[0].x;
+  e = ((290485u + x_57) << 33u);
+  const uint x_61 = x_6[0].x;
+  f = ((44321u + x_61) << 345u);
+  if ((a != 1u)) {
+    a = 1u;
+  }
+  if ((b != 0u)) {
+    b = 0u;
+  }
+  if ((c != 1u)) {
+    c = 1u;
+  }
+  if ((d != 0u)) {
+    d = 0u;
+  }
+  if ((e != 1u)) {
+    e = 1u;
+  }
+  if ((f != 0u)) {
+    f = 0u;
+  }
+  bool tint_tmp_4 = (a == 1u);
+  if (tint_tmp_4) {
+    tint_tmp_4 = (b == 0u);
+  }
+  bool tint_tmp_3 = (tint_tmp_4);
+  if (tint_tmp_3) {
+    tint_tmp_3 = (c == 1u);
+  }
+  bool tint_tmp_2 = (tint_tmp_3);
+  if (tint_tmp_2) {
+    tint_tmp_2 = (d == 0u);
+  }
+  bool tint_tmp_1 = (tint_tmp_2);
+  if (tint_tmp_1) {
+    tint_tmp_1 = (e == 1u);
+  }
+  bool tint_tmp = (tint_tmp_1);
+  if (tint_tmp) {
+    tint_tmp = (f == 0u);
+  }
+  if ((tint_tmp)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-gte32/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-gte32/0.spvasm.expected.msl
new file mode 100644
index 0000000..5d8fa54
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-gte32/0.spvasm.expected.msl
@@ -0,0 +1,78 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ uint one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  uint a = 0u;
+  uint b = 0u;
+  uint c = 0u;
+  uint d = 0u;
+  uint e = 0u;
+  uint f = 0u;
+  uint const x_41 = x_6.one;
+  a = ((77u + x_41) >> 32u);
+  uint const x_45 = x_6.one;
+  b = ((3243u + x_45) >> 33u);
+  uint const x_49 = x_6.one;
+  c = ((23u + x_49) >> 345u);
+  uint const x_53 = x_6.one;
+  d = ((2395u + x_53) << 32u);
+  uint const x_57 = x_6.one;
+  e = ((290485u + x_57) << 33u);
+  uint const x_61 = x_6.one;
+  f = ((44321u + x_61) << 345u);
+  uint const x_64 = a;
+  if ((x_64 != 1u)) {
+    a = 1u;
+  }
+  uint const x_68 = b;
+  if ((x_68 != 0u)) {
+    b = 0u;
+  }
+  uint const x_72 = c;
+  if ((x_72 != 1u)) {
+    c = 1u;
+  }
+  uint const x_76 = d;
+  if ((x_76 != 0u)) {
+    d = 0u;
+  }
+  uint const x_80 = e;
+  if ((x_80 != 1u)) {
+    e = 1u;
+  }
+  uint const x_84 = f;
+  if ((x_84 != 0u)) {
+    f = 0u;
+  }
+  uint const x_88 = a;
+  uint const x_90 = b;
+  uint const x_93 = c;
+  uint const x_96 = d;
+  uint const x_99 = e;
+  uint const x_102 = f;
+  if (((((((x_88 == 1u) && (x_90 == 0u)) && (x_93 == 1u)) && (x_96 == 0u)) && (x_99 == 1u)) && (x_102 == 0u))) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-gte32/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-gte32/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..8468b80
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-gte32/0.spvasm.expected.spvasm
@@ -0,0 +1,221 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 131
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %d "d"
+               OpName %e "e"
+               OpName %f "f"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+       %uint = OpTypeInt 32 0
+       %buf0 = OpTypeStruct %uint
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_uint = OpTypePointer Function %uint
+         %18 = OpConstantNull %uint
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+    %uint_77 = OpConstant %uint 77
+    %uint_32 = OpConstant %uint 32
+  %uint_3243 = OpConstant %uint 3243
+    %uint_33 = OpConstant %uint 33
+    %uint_23 = OpConstant %uint 23
+   %uint_345 = OpConstant %uint 345
+  %uint_2395 = OpConstant %uint 2395
+%uint_290485 = OpConstant %uint 290485
+ %uint_44321 = OpConstant %uint 44321
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+        %117 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %118 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+        %119 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %a = OpVariable %_ptr_Function_uint Function %18
+          %b = OpVariable %_ptr_Function_uint Function %18
+          %c = OpVariable %_ptr_Function_uint Function %18
+          %d = OpVariable %_ptr_Function_uint Function %18
+          %e = OpVariable %_ptr_Function_uint Function %18
+          %f = OpVariable %_ptr_Function_uint Function %18
+         %26 = OpAccessChain %_ptr_Uniform_uint %x_6 %uint_0
+         %27 = OpLoad %uint %26
+         %29 = OpIAdd %uint %uint_77 %27
+         %31 = OpShiftRightLogical %uint %29 %uint_32
+               OpStore %a %31
+         %32 = OpAccessChain %_ptr_Uniform_uint %x_6 %uint_0
+         %33 = OpLoad %uint %32
+         %35 = OpIAdd %uint %uint_3243 %33
+         %37 = OpShiftRightLogical %uint %35 %uint_33
+               OpStore %b %37
+         %38 = OpAccessChain %_ptr_Uniform_uint %x_6 %uint_0
+         %39 = OpLoad %uint %38
+         %41 = OpIAdd %uint %uint_23 %39
+         %43 = OpShiftRightLogical %uint %41 %uint_345
+               OpStore %c %43
+         %44 = OpAccessChain %_ptr_Uniform_uint %x_6 %uint_0
+         %45 = OpLoad %uint %44
+         %47 = OpIAdd %uint %uint_2395 %45
+         %48 = OpShiftLeftLogical %uint %47 %uint_32
+               OpStore %d %48
+         %49 = OpAccessChain %_ptr_Uniform_uint %x_6 %uint_0
+         %50 = OpLoad %uint %49
+         %52 = OpIAdd %uint %uint_290485 %50
+         %53 = OpShiftLeftLogical %uint %52 %uint_33
+               OpStore %e %53
+         %54 = OpAccessChain %_ptr_Uniform_uint %x_6 %uint_0
+         %55 = OpLoad %uint %54
+         %57 = OpIAdd %uint %uint_44321 %55
+         %58 = OpShiftLeftLogical %uint %57 %uint_345
+               OpStore %f %58
+         %59 = OpLoad %uint %a
+         %61 = OpINotEqual %bool %59 %uint_1
+               OpSelectionMerge %63 None
+               OpBranchConditional %61 %64 %63
+         %64 = OpLabel
+               OpStore %a %uint_1
+               OpBranch %63
+         %63 = OpLabel
+         %65 = OpLoad %uint %b
+         %66 = OpINotEqual %bool %65 %uint_0
+               OpSelectionMerge %67 None
+               OpBranchConditional %66 %68 %67
+         %68 = OpLabel
+               OpStore %b %uint_0
+               OpBranch %67
+         %67 = OpLabel
+         %69 = OpLoad %uint %c
+         %70 = OpINotEqual %bool %69 %uint_1
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %71
+         %72 = OpLabel
+               OpStore %c %uint_1
+               OpBranch %71
+         %71 = OpLabel
+         %73 = OpLoad %uint %d
+         %74 = OpINotEqual %bool %73 %uint_0
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %75
+         %76 = OpLabel
+               OpStore %d %uint_0
+               OpBranch %75
+         %75 = OpLabel
+         %77 = OpLoad %uint %e
+         %78 = OpINotEqual %bool %77 %uint_1
+               OpSelectionMerge %79 None
+               OpBranchConditional %78 %80 %79
+         %80 = OpLabel
+               OpStore %e %uint_1
+               OpBranch %79
+         %79 = OpLabel
+         %81 = OpLoad %uint %f
+         %82 = OpINotEqual %bool %81 %uint_0
+               OpSelectionMerge %83 None
+               OpBranchConditional %82 %84 %83
+         %84 = OpLabel
+               OpStore %f %uint_0
+               OpBranch %83
+         %83 = OpLabel
+         %85 = OpLoad %uint %a
+         %86 = OpLoad %uint %b
+         %87 = OpLoad %uint %c
+         %88 = OpLoad %uint %d
+         %89 = OpLoad %uint %e
+         %90 = OpLoad %uint %f
+         %91 = OpIEqual %bool %85 %uint_1
+               OpSelectionMerge %92 None
+               OpBranchConditional %91 %93 %92
+         %93 = OpLabel
+         %94 = OpIEqual %bool %86 %uint_0
+               OpBranch %92
+         %92 = OpLabel
+         %95 = OpPhi %bool %91 %83 %94 %93
+               OpSelectionMerge %96 None
+               OpBranchConditional %95 %97 %96
+         %97 = OpLabel
+         %98 = OpIEqual %bool %87 %uint_1
+               OpBranch %96
+         %96 = OpLabel
+         %99 = OpPhi %bool %95 %92 %98 %97
+               OpSelectionMerge %100 None
+               OpBranchConditional %99 %101 %100
+        %101 = OpLabel
+        %102 = OpIEqual %bool %88 %uint_0
+               OpBranch %100
+        %100 = OpLabel
+        %103 = OpPhi %bool %99 %96 %102 %101
+               OpSelectionMerge %104 None
+               OpBranchConditional %103 %105 %104
+        %105 = OpLabel
+        %106 = OpIEqual %bool %89 %uint_1
+               OpBranch %104
+        %104 = OpLabel
+        %107 = OpPhi %bool %103 %100 %106 %105
+               OpSelectionMerge %108 None
+               OpBranchConditional %107 %109 %108
+        %109 = OpLabel
+        %110 = OpIEqual %bool %90 %uint_0
+               OpBranch %108
+        %108 = OpLabel
+        %111 = OpPhi %bool %107 %104 %110 %109
+               OpSelectionMerge %112 None
+               OpBranchConditional %111 %113 %114
+        %113 = OpLabel
+               OpStore %x_GLF_color %117
+               OpBranch %112
+        %114 = OpLabel
+               OpStore %x_GLF_color %118
+               OpBranch %112
+        %112 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %119
+%tint_symbol = OpFunctionParameter %main_out
+        %123 = OpLabel
+        %124 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %124
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+        %126 = OpLabel
+        %127 = OpFunctionCall %void %main_1
+        %129 = OpLoad %v4float %x_GLF_color
+        %130 = OpCompositeConstruct %main_out %129
+        %128 = OpFunctionCall %void %tint_symbol_2 %130
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-gte32/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-gte32/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..ec6d634
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-gte32/0.spvasm.expected.wgsl
@@ -0,0 +1,76 @@
+[[block]]
+struct buf0 {
+  one : u32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : u32;
+  var b : u32;
+  var c : u32;
+  var d : u32;
+  var e : u32;
+  var f : u32;
+  let x_41 : u32 = x_6.one;
+  a = ((77u + x_41) >> 32u);
+  let x_45 : u32 = x_6.one;
+  b = ((3243u + x_45) >> 33u);
+  let x_49 : u32 = x_6.one;
+  c = ((23u + x_49) >> 345u);
+  let x_53 : u32 = x_6.one;
+  d = ((2395u + x_53) << 32u);
+  let x_57 : u32 = x_6.one;
+  e = ((290485u + x_57) << 33u);
+  let x_61 : u32 = x_6.one;
+  f = ((44321u + x_61) << 345u);
+  let x_64 : u32 = a;
+  if ((x_64 != 1u)) {
+    a = 1u;
+  }
+  let x_68 : u32 = b;
+  if ((x_68 != 0u)) {
+    b = 0u;
+  }
+  let x_72 : u32 = c;
+  if ((x_72 != 1u)) {
+    c = 1u;
+  }
+  let x_76 : u32 = d;
+  if ((x_76 != 0u)) {
+    d = 0u;
+  }
+  let x_80 : u32 = e;
+  if ((x_80 != 1u)) {
+    e = 1u;
+  }
+  let x_84 : u32 = f;
+  if ((x_84 != 0u)) {
+    f = 0u;
+  }
+  let x_88 : u32 = a;
+  let x_90 : u32 = b;
+  let x_93 : u32 = c;
+  let x_96 : u32 = d;
+  let x_99 : u32 = e;
+  let x_102 : u32 = f;
+  if (((((((x_88 == 1u) && (x_90 == 0u)) && (x_93 == 1u)) && (x_96 == 0u)) && (x_99 == 1u)) && (x_102 == 0u))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-gte32/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-gte32/0.wgsl
new file mode 100644
index 0000000..ec6d634
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-gte32/0.wgsl
@@ -0,0 +1,76 @@
+[[block]]
+struct buf0 {
+  one : u32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : u32;
+  var b : u32;
+  var c : u32;
+  var d : u32;
+  var e : u32;
+  var f : u32;
+  let x_41 : u32 = x_6.one;
+  a = ((77u + x_41) >> 32u);
+  let x_45 : u32 = x_6.one;
+  b = ((3243u + x_45) >> 33u);
+  let x_49 : u32 = x_6.one;
+  c = ((23u + x_49) >> 345u);
+  let x_53 : u32 = x_6.one;
+  d = ((2395u + x_53) << 32u);
+  let x_57 : u32 = x_6.one;
+  e = ((290485u + x_57) << 33u);
+  let x_61 : u32 = x_6.one;
+  f = ((44321u + x_61) << 345u);
+  let x_64 : u32 = a;
+  if ((x_64 != 1u)) {
+    a = 1u;
+  }
+  let x_68 : u32 = b;
+  if ((x_68 != 0u)) {
+    b = 0u;
+  }
+  let x_72 : u32 = c;
+  if ((x_72 != 1u)) {
+    c = 1u;
+  }
+  let x_76 : u32 = d;
+  if ((x_76 != 0u)) {
+    d = 0u;
+  }
+  let x_80 : u32 = e;
+  if ((x_80 != 1u)) {
+    e = 1u;
+  }
+  let x_84 : u32 = f;
+  if ((x_84 != 0u)) {
+    f = 0u;
+  }
+  let x_88 : u32 = a;
+  let x_90 : u32 = b;
+  let x_93 : u32 = c;
+  let x_96 : u32 = d;
+  let x_99 : u32 = e;
+  let x_102 : u32 = f;
+  if (((((((x_88 == 1u) && (x_90 == 0u)) && (x_93 == 1u)) && (x_96 == 0u)) && (x_99 == 1u)) && (x_102 == 0u))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-gte32/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-gte32/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..44f7ed6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-gte32/0.wgsl.expected.hlsl
@@ -0,0 +1,83 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  uint a = 0u;
+  uint b = 0u;
+  uint c = 0u;
+  uint d = 0u;
+  uint e = 0u;
+  uint f = 0u;
+  const uint x_41 = x_6[0].x;
+  a = ((77u + x_41) >> 32u);
+  const uint x_45 = x_6[0].x;
+  b = ((3243u + x_45) >> 33u);
+  const uint x_49 = x_6[0].x;
+  c = ((23u + x_49) >> 345u);
+  const uint x_53 = x_6[0].x;
+  d = ((2395u + x_53) << 32u);
+  const uint x_57 = x_6[0].x;
+  e = ((290485u + x_57) << 33u);
+  const uint x_61 = x_6[0].x;
+  f = ((44321u + x_61) << 345u);
+  if ((a != 1u)) {
+    a = 1u;
+  }
+  if ((b != 0u)) {
+    b = 0u;
+  }
+  if ((c != 1u)) {
+    c = 1u;
+  }
+  if ((d != 0u)) {
+    d = 0u;
+  }
+  if ((e != 1u)) {
+    e = 1u;
+  }
+  if ((f != 0u)) {
+    f = 0u;
+  }
+  bool tint_tmp_4 = (a == 1u);
+  if (tint_tmp_4) {
+    tint_tmp_4 = (b == 0u);
+  }
+  bool tint_tmp_3 = (tint_tmp_4);
+  if (tint_tmp_3) {
+    tint_tmp_3 = (c == 1u);
+  }
+  bool tint_tmp_2 = (tint_tmp_3);
+  if (tint_tmp_2) {
+    tint_tmp_2 = (d == 0u);
+  }
+  bool tint_tmp_1 = (tint_tmp_2);
+  if (tint_tmp_1) {
+    tint_tmp_1 = (e == 1u);
+  }
+  bool tint_tmp = (tint_tmp_1);
+  if (tint_tmp) {
+    tint_tmp = (f == 0u);
+  }
+  if ((tint_tmp)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-gte32/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-gte32/0.wgsl.expected.msl
new file mode 100644
index 0000000..5d8fa54
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-gte32/0.wgsl.expected.msl
@@ -0,0 +1,78 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ uint one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  uint a = 0u;
+  uint b = 0u;
+  uint c = 0u;
+  uint d = 0u;
+  uint e = 0u;
+  uint f = 0u;
+  uint const x_41 = x_6.one;
+  a = ((77u + x_41) >> 32u);
+  uint const x_45 = x_6.one;
+  b = ((3243u + x_45) >> 33u);
+  uint const x_49 = x_6.one;
+  c = ((23u + x_49) >> 345u);
+  uint const x_53 = x_6.one;
+  d = ((2395u + x_53) << 32u);
+  uint const x_57 = x_6.one;
+  e = ((290485u + x_57) << 33u);
+  uint const x_61 = x_6.one;
+  f = ((44321u + x_61) << 345u);
+  uint const x_64 = a;
+  if ((x_64 != 1u)) {
+    a = 1u;
+  }
+  uint const x_68 = b;
+  if ((x_68 != 0u)) {
+    b = 0u;
+  }
+  uint const x_72 = c;
+  if ((x_72 != 1u)) {
+    c = 1u;
+  }
+  uint const x_76 = d;
+  if ((x_76 != 0u)) {
+    d = 0u;
+  }
+  uint const x_80 = e;
+  if ((x_80 != 1u)) {
+    e = 1u;
+  }
+  uint const x_84 = f;
+  if ((x_84 != 0u)) {
+    f = 0u;
+  }
+  uint const x_88 = a;
+  uint const x_90 = b;
+  uint const x_93 = c;
+  uint const x_96 = d;
+  uint const x_99 = e;
+  uint const x_102 = f;
+  if (((((((x_88 == 1u) && (x_90 == 0u)) && (x_93 == 1u)) && (x_96 == 0u)) && (x_99 == 1u)) && (x_102 == 0u))) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-gte32/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-gte32/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..8468b80
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-gte32/0.wgsl.expected.spvasm
@@ -0,0 +1,221 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 131
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %d "d"
+               OpName %e "e"
+               OpName %f "f"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+       %uint = OpTypeInt 32 0
+       %buf0 = OpTypeStruct %uint
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_uint = OpTypePointer Function %uint
+         %18 = OpConstantNull %uint
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+    %uint_77 = OpConstant %uint 77
+    %uint_32 = OpConstant %uint 32
+  %uint_3243 = OpConstant %uint 3243
+    %uint_33 = OpConstant %uint 33
+    %uint_23 = OpConstant %uint 23
+   %uint_345 = OpConstant %uint 345
+  %uint_2395 = OpConstant %uint 2395
+%uint_290485 = OpConstant %uint 290485
+ %uint_44321 = OpConstant %uint 44321
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+        %117 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %118 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+        %119 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %a = OpVariable %_ptr_Function_uint Function %18
+          %b = OpVariable %_ptr_Function_uint Function %18
+          %c = OpVariable %_ptr_Function_uint Function %18
+          %d = OpVariable %_ptr_Function_uint Function %18
+          %e = OpVariable %_ptr_Function_uint Function %18
+          %f = OpVariable %_ptr_Function_uint Function %18
+         %26 = OpAccessChain %_ptr_Uniform_uint %x_6 %uint_0
+         %27 = OpLoad %uint %26
+         %29 = OpIAdd %uint %uint_77 %27
+         %31 = OpShiftRightLogical %uint %29 %uint_32
+               OpStore %a %31
+         %32 = OpAccessChain %_ptr_Uniform_uint %x_6 %uint_0
+         %33 = OpLoad %uint %32
+         %35 = OpIAdd %uint %uint_3243 %33
+         %37 = OpShiftRightLogical %uint %35 %uint_33
+               OpStore %b %37
+         %38 = OpAccessChain %_ptr_Uniform_uint %x_6 %uint_0
+         %39 = OpLoad %uint %38
+         %41 = OpIAdd %uint %uint_23 %39
+         %43 = OpShiftRightLogical %uint %41 %uint_345
+               OpStore %c %43
+         %44 = OpAccessChain %_ptr_Uniform_uint %x_6 %uint_0
+         %45 = OpLoad %uint %44
+         %47 = OpIAdd %uint %uint_2395 %45
+         %48 = OpShiftLeftLogical %uint %47 %uint_32
+               OpStore %d %48
+         %49 = OpAccessChain %_ptr_Uniform_uint %x_6 %uint_0
+         %50 = OpLoad %uint %49
+         %52 = OpIAdd %uint %uint_290485 %50
+         %53 = OpShiftLeftLogical %uint %52 %uint_33
+               OpStore %e %53
+         %54 = OpAccessChain %_ptr_Uniform_uint %x_6 %uint_0
+         %55 = OpLoad %uint %54
+         %57 = OpIAdd %uint %uint_44321 %55
+         %58 = OpShiftLeftLogical %uint %57 %uint_345
+               OpStore %f %58
+         %59 = OpLoad %uint %a
+         %61 = OpINotEqual %bool %59 %uint_1
+               OpSelectionMerge %63 None
+               OpBranchConditional %61 %64 %63
+         %64 = OpLabel
+               OpStore %a %uint_1
+               OpBranch %63
+         %63 = OpLabel
+         %65 = OpLoad %uint %b
+         %66 = OpINotEqual %bool %65 %uint_0
+               OpSelectionMerge %67 None
+               OpBranchConditional %66 %68 %67
+         %68 = OpLabel
+               OpStore %b %uint_0
+               OpBranch %67
+         %67 = OpLabel
+         %69 = OpLoad %uint %c
+         %70 = OpINotEqual %bool %69 %uint_1
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %71
+         %72 = OpLabel
+               OpStore %c %uint_1
+               OpBranch %71
+         %71 = OpLabel
+         %73 = OpLoad %uint %d
+         %74 = OpINotEqual %bool %73 %uint_0
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %75
+         %76 = OpLabel
+               OpStore %d %uint_0
+               OpBranch %75
+         %75 = OpLabel
+         %77 = OpLoad %uint %e
+         %78 = OpINotEqual %bool %77 %uint_1
+               OpSelectionMerge %79 None
+               OpBranchConditional %78 %80 %79
+         %80 = OpLabel
+               OpStore %e %uint_1
+               OpBranch %79
+         %79 = OpLabel
+         %81 = OpLoad %uint %f
+         %82 = OpINotEqual %bool %81 %uint_0
+               OpSelectionMerge %83 None
+               OpBranchConditional %82 %84 %83
+         %84 = OpLabel
+               OpStore %f %uint_0
+               OpBranch %83
+         %83 = OpLabel
+         %85 = OpLoad %uint %a
+         %86 = OpLoad %uint %b
+         %87 = OpLoad %uint %c
+         %88 = OpLoad %uint %d
+         %89 = OpLoad %uint %e
+         %90 = OpLoad %uint %f
+         %91 = OpIEqual %bool %85 %uint_1
+               OpSelectionMerge %92 None
+               OpBranchConditional %91 %93 %92
+         %93 = OpLabel
+         %94 = OpIEqual %bool %86 %uint_0
+               OpBranch %92
+         %92 = OpLabel
+         %95 = OpPhi %bool %91 %83 %94 %93
+               OpSelectionMerge %96 None
+               OpBranchConditional %95 %97 %96
+         %97 = OpLabel
+         %98 = OpIEqual %bool %87 %uint_1
+               OpBranch %96
+         %96 = OpLabel
+         %99 = OpPhi %bool %95 %92 %98 %97
+               OpSelectionMerge %100 None
+               OpBranchConditional %99 %101 %100
+        %101 = OpLabel
+        %102 = OpIEqual %bool %88 %uint_0
+               OpBranch %100
+        %100 = OpLabel
+        %103 = OpPhi %bool %99 %96 %102 %101
+               OpSelectionMerge %104 None
+               OpBranchConditional %103 %105 %104
+        %105 = OpLabel
+        %106 = OpIEqual %bool %89 %uint_1
+               OpBranch %104
+        %104 = OpLabel
+        %107 = OpPhi %bool %103 %100 %106 %105
+               OpSelectionMerge %108 None
+               OpBranchConditional %107 %109 %108
+        %109 = OpLabel
+        %110 = OpIEqual %bool %90 %uint_0
+               OpBranch %108
+        %108 = OpLabel
+        %111 = OpPhi %bool %107 %104 %110 %109
+               OpSelectionMerge %112 None
+               OpBranchConditional %111 %113 %114
+        %113 = OpLabel
+               OpStore %x_GLF_color %117
+               OpBranch %112
+        %114 = OpLabel
+               OpStore %x_GLF_color %118
+               OpBranch %112
+        %112 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %119
+%tint_symbol = OpFunctionParameter %main_out
+        %123 = OpLabel
+        %124 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %124
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+        %126 = OpLabel
+        %127 = OpFunctionCall %void %main_1
+        %129 = OpLoad %v4float %x_GLF_color
+        %130 = OpCompositeConstruct %main_out %129
+        %128 = OpFunctionCall %void %tint_symbol_2 %130
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-gte32/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-gte32/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..ec6d634
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-gte32/0.wgsl.expected.wgsl
@@ -0,0 +1,76 @@
+[[block]]
+struct buf0 {
+  one : u32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : u32;
+  var b : u32;
+  var c : u32;
+  var d : u32;
+  var e : u32;
+  var f : u32;
+  let x_41 : u32 = x_6.one;
+  a = ((77u + x_41) >> 32u);
+  let x_45 : u32 = x_6.one;
+  b = ((3243u + x_45) >> 33u);
+  let x_49 : u32 = x_6.one;
+  c = ((23u + x_49) >> 345u);
+  let x_53 : u32 = x_6.one;
+  d = ((2395u + x_53) << 32u);
+  let x_57 : u32 = x_6.one;
+  e = ((290485u + x_57) << 33u);
+  let x_61 : u32 = x_6.one;
+  f = ((44321u + x_61) << 345u);
+  let x_64 : u32 = a;
+  if ((x_64 != 1u)) {
+    a = 1u;
+  }
+  let x_68 : u32 = b;
+  if ((x_68 != 0u)) {
+    b = 0u;
+  }
+  let x_72 : u32 = c;
+  if ((x_72 != 1u)) {
+    c = 1u;
+  }
+  let x_76 : u32 = d;
+  if ((x_76 != 0u)) {
+    d = 0u;
+  }
+  let x_80 : u32 = e;
+  if ((x_80 != 1u)) {
+    e = 1u;
+  }
+  let x_84 : u32 = f;
+  if ((x_84 != 0u)) {
+    f = 0u;
+  }
+  let x_88 : u32 = a;
+  let x_90 : u32 = b;
+  let x_93 : u32 = c;
+  let x_96 : u32 = d;
+  let x_99 : u32 = e;
+  let x_102 : u32 = f;
+  if (((((((x_88 == 1u) && (x_90 == 0u)) && (x_93 == 1u)) && (x_96 == 0u)) && (x_99 == 1u)) && (x_102 == 0u))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-right-arithmetic/0.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-right-arithmetic/0.spvasm
new file mode 100644
index 0000000..6e903ef
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-right-arithmetic/0.spvasm
@@ -0,0 +1,47 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %i "i"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %i RelaxedPrecision
+               OpDecorate %5 RelaxedPrecision
+               OpDecorate %6 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_5 = OpConstant %int 5
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %19 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+    %float_1 = OpConstant %float 1
+         %21 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %8
+         %22 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+               OpStore %i %int_5
+          %5 = OpLoad %int %i
+          %6 = OpShiftRightArithmetic %int %5 %int_1
+         %23 = OpINotEqual %bool %6 %int_2
+               OpSelectionMerge %24 None
+               OpBranchConditional %23 %25 %26
+         %25 = OpLabel
+               OpStore %_GLF_color %19
+               OpBranch %24
+         %26 = OpLabel
+               OpStore %_GLF_color %21
+               OpBranch %24
+         %24 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-right-arithmetic/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-right-arithmetic/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..cc5e352
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-right-arithmetic/0.spvasm.expected.hlsl
@@ -0,0 +1,26 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int i = 0;
+  i = 5;
+  if (((i >> asuint(1)) != 2)) {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  } else {
+    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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-right-arithmetic/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-right-arithmetic/0.spvasm.expected.msl
new file mode 100644
index 0000000..c314545
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-right-arithmetic/0.spvasm.expected.msl
@@ -0,0 +1,30 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  int i = 0;
+  i = 5;
+  int const x_5 = i;
+  if (((x_5 >> as_type<uint>(1)) != 2)) {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  } else {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-right-arithmetic/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-right-arithmetic/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..9f2db98
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-right-arithmetic/0.spvasm.expected.spvasm
@@ -0,0 +1,77 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 44
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %15 = OpConstantNull %int
+      %int_5 = OpConstant %int 5
+       %uint = OpTypeInt 32 0
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+         %29 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+    %float_1 = OpConstant %float 1
+         %31 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %32 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %15
+               OpStore %i %int_5
+         %17 = OpLoad %int %i
+         %18 = OpBitcast %uint %int_1
+         %21 = OpShiftRightArithmetic %int %17 %18
+         %23 = OpINotEqual %bool %21 %int_2
+               OpSelectionMerge %25 None
+               OpBranchConditional %23 %26 %27
+         %26 = OpLabel
+               OpStore %x_GLF_color %29
+               OpBranch %25
+         %27 = OpLabel
+               OpStore %x_GLF_color %31
+               OpBranch %25
+         %25 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %32
+%tint_symbol = OpFunctionParameter %main_out
+         %36 = OpLabel
+         %37 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %37
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %39 = OpLabel
+         %40 = OpFunctionCall %void %main_1
+         %42 = OpLoad %v4float %x_GLF_color
+         %43 = OpCompositeConstruct %main_out %42
+         %41 = OpFunctionCall %void %tint_symbol_2 %43
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-right-arithmetic/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-right-arithmetic/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..f04d8e2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-right-arithmetic/0.spvasm.expected.wgsl
@@ -0,0 +1,24 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  i = 5;
+  let x_5 : i32 = i;
+  if (((x_5 >> bitcast<u32>(1)) != 2)) {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-right-arithmetic/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-right-arithmetic/0.wgsl
new file mode 100644
index 0000000..f04d8e2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-right-arithmetic/0.wgsl
@@ -0,0 +1,24 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  i = 5;
+  let x_5 : i32 = i;
+  if (((x_5 >> bitcast<u32>(1)) != 2)) {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-right-arithmetic/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-right-arithmetic/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..cc5e352
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-right-arithmetic/0.wgsl.expected.hlsl
@@ -0,0 +1,26 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int i = 0;
+  i = 5;
+  if (((i >> asuint(1)) != 2)) {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  } else {
+    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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-right-arithmetic/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-right-arithmetic/0.wgsl.expected.msl
new file mode 100644
index 0000000..c314545
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-right-arithmetic/0.wgsl.expected.msl
@@ -0,0 +1,30 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  int i = 0;
+  i = 5;
+  int const x_5 = i;
+  if (((x_5 >> as_type<uint>(1)) != 2)) {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  } else {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-right-arithmetic/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-right-arithmetic/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..9f2db98
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-right-arithmetic/0.wgsl.expected.spvasm
@@ -0,0 +1,77 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 44
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %15 = OpConstantNull %int
+      %int_5 = OpConstant %int 5
+       %uint = OpTypeInt 32 0
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+         %29 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+    %float_1 = OpConstant %float 1
+         %31 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %32 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %15
+               OpStore %i %int_5
+         %17 = OpLoad %int %i
+         %18 = OpBitcast %uint %int_1
+         %21 = OpShiftRightArithmetic %int %17 %18
+         %23 = OpINotEqual %bool %21 %int_2
+               OpSelectionMerge %25 None
+               OpBranchConditional %23 %26 %27
+         %26 = OpLabel
+               OpStore %x_GLF_color %29
+               OpBranch %25
+         %27 = OpLabel
+               OpStore %x_GLF_color %31
+               OpBranch %25
+         %25 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %32
+%tint_symbol = OpFunctionParameter %main_out
+         %36 = OpLabel
+         %37 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %37
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %39 = OpLabel
+         %40 = OpFunctionCall %void %main_1
+         %42 = OpLoad %v4float %x_GLF_color
+         %43 = OpCompositeConstruct %main_out %42
+         %41 = OpFunctionCall %void %tint_symbol_2 %43
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-right-arithmetic/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-right-arithmetic/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..f04d8e2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-right-arithmetic/0.wgsl.expected.wgsl
@@ -0,0 +1,24 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  i = 5;
+  let x_5 : i32 = i;
+  if (((x_5 >> bitcast<u32>(1)) != 2)) {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-switch-udiv/0.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fold-switch-udiv/0.spvasm
new file mode 100644
index 0000000..8a5c45c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-switch-udiv/0.spvasm
@@ -0,0 +1,44 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %a RelaxedPrecision
+               OpDecorate %5 RelaxedPrecision
+               OpDecorate %6 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+     %uint_4 = OpConstant %uint 4
+     %uint_2 = OpConstant %uint 2
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %18 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %19 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %8
+         %20 = OpLabel
+          %a = OpVariable %_ptr_Function_uint Function
+               OpStore %a %uint_4
+          %5 = OpLoad %uint %a
+          %6 = OpUDiv %uint %5 %uint_2
+               OpSelectionMerge %21 None
+               OpSwitch %6 %22 2 %23
+         %22 = OpLabel
+               OpStore %_GLF_color %19
+               OpBranch %21
+         %23 = OpLabel
+               OpStore %_GLF_color %18
+               OpBranch %21
+         %21 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-switch-udiv/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-switch-udiv/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..2b46425
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-switch-udiv/0.spvasm.expected.hlsl
@@ -0,0 +1,31 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  uint a = 0u;
+  a = 4u;
+  switch((a / 2u)) {
+    case 2u: {
+      x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+      break;
+    }
+    default: {
+      x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+      break;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-switch-udiv/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-fold-switch-udiv/0.spvasm.expected.msl
new file mode 100644
index 0000000..a8ec9c9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-switch-udiv/0.spvasm.expected.msl
@@ -0,0 +1,35 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  uint a = 0u;
+  a = 4u;
+  uint const x_5 = a;
+  switch((x_5 / 2u)) {
+    case 2u: {
+      *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+      break;
+    }
+    default: {
+      *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+      break;
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-switch-udiv/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fold-switch-udiv/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..541bbd0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-switch-udiv/0.spvasm.expected.spvasm
@@ -0,0 +1,72 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 39
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+         %15 = OpConstantNull %uint
+     %uint_4 = OpConstant %uint 4
+     %uint_2 = OpConstant %uint 2
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %25 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %26 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %27 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %a = OpVariable %_ptr_Function_uint Function %15
+               OpStore %a %uint_4
+         %17 = OpLoad %uint %a
+         %20 = OpUDiv %uint %17 %uint_2
+               OpSelectionMerge %18 None
+               OpSwitch %20 %21 2 %22
+         %22 = OpLabel
+               OpStore %x_GLF_color %25
+               OpBranch %18
+         %21 = OpLabel
+               OpStore %x_GLF_color %26
+               OpBranch %18
+         %18 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %27
+%tint_symbol = OpFunctionParameter %main_out
+         %31 = OpLabel
+         %32 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %32
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %34 = OpLabel
+         %35 = OpFunctionCall %void %main_1
+         %37 = OpLoad %v4float %x_GLF_color
+         %38 = OpCompositeConstruct %main_out %37
+         %36 = OpFunctionCall %void %tint_symbol_2 %38
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-switch-udiv/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-switch-udiv/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..be6fc47
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-switch-udiv/0.spvasm.expected.wgsl
@@ -0,0 +1,27 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : u32;
+  a = 4u;
+  let x_5 : u32 = a;
+  switch((x_5 / 2u)) {
+    case 2u: {
+      x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    }
+    default: {
+      x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-switch-udiv/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-switch-udiv/0.wgsl
new file mode 100644
index 0000000..be6fc47
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-switch-udiv/0.wgsl
@@ -0,0 +1,27 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : u32;
+  a = 4u;
+  let x_5 : u32 = a;
+  switch((x_5 / 2u)) {
+    case 2u: {
+      x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    }
+    default: {
+      x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-switch-udiv/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-switch-udiv/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..2b46425
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-switch-udiv/0.wgsl.expected.hlsl
@@ -0,0 +1,31 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  uint a = 0u;
+  a = 4u;
+  switch((a / 2u)) {
+    case 2u: {
+      x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+      break;
+    }
+    default: {
+      x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+      break;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-switch-udiv/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-fold-switch-udiv/0.wgsl.expected.msl
new file mode 100644
index 0000000..a8ec9c9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-switch-udiv/0.wgsl.expected.msl
@@ -0,0 +1,35 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  uint a = 0u;
+  a = 4u;
+  uint const x_5 = a;
+  switch((x_5 / 2u)) {
+    case 2u: {
+      *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+      break;
+    }
+    default: {
+      *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+      break;
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-switch-udiv/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fold-switch-udiv/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..541bbd0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-switch-udiv/0.wgsl.expected.spvasm
@@ -0,0 +1,72 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 39
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+         %15 = OpConstantNull %uint
+     %uint_4 = OpConstant %uint 4
+     %uint_2 = OpConstant %uint 2
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %25 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %26 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %27 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %a = OpVariable %_ptr_Function_uint Function %15
+               OpStore %a %uint_4
+         %17 = OpLoad %uint %a
+         %20 = OpUDiv %uint %17 %uint_2
+               OpSelectionMerge %18 None
+               OpSwitch %20 %21 2 %22
+         %22 = OpLabel
+               OpStore %x_GLF_color %25
+               OpBranch %18
+         %21 = OpLabel
+               OpStore %x_GLF_color %26
+               OpBranch %18
+         %18 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %27
+%tint_symbol = OpFunctionParameter %main_out
+         %31 = OpLabel
+         %32 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %32
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %34 = OpLabel
+         %35 = OpFunctionCall %void %main_1
+         %37 = OpLoad %v4float %x_GLF_color
+         %38 = OpCompositeConstruct %main_out %37
+         %36 = OpFunctionCall %void %tint_symbol_2 %38
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-switch-udiv/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-switch-udiv/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..be6fc47
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fold-switch-udiv/0.wgsl.expected.wgsl
@@ -0,0 +1,27 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : u32;
+  a = 4u;
+  let x_5 : u32 = a;
+  switch((x_5 / 2u)) {
+    case 2u: {
+      x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    }
+    default: {
+      x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-clamp-cmp-const-first/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-clamp-cmp-const-first/0-opt.spvasm
new file mode 100644
index 0000000..ca6478b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-clamp-cmp-const-first/0-opt.spvasm
@@ -0,0 +1,75 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %f "f"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_1 = OpConstant %float 1
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+   %float_10 = OpConstant %float 10
+    %float_8 = OpConstant %float 8
+    %float_9 = OpConstant %float 9
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %23 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %24 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %8
+         %25 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function
+               OpStore %f %float_1
+               OpBranch %26
+         %26 = OpLabel
+               OpLoopMerge %27 %28 None
+               OpBranch %29
+         %29 = OpLabel
+         %30 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %31 = OpLoad %float %30
+         %32 = OpLoad %float %f
+         %33 = OpFAdd %float %32 %31
+               OpStore %f %33
+               OpBranch %28
+         %28 = OpLabel
+         %34 = OpLoad %float %f
+         %35 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %36 = OpLoad %float %35
+         %37 = OpFAdd %float %float_9 %36
+         %38 = OpExtInst %float %1 FClamp %34 %float_8 %37
+         %39 = OpFOrdGreaterThan %bool %float_10 %38
+               OpBranchConditional %39 %26 %27
+         %27 = OpLabel
+         %40 = OpLoad %float %f
+         %41 = OpFOrdEqual %bool %40 %float_10
+               OpSelectionMerge %42 None
+               OpBranchConditional %41 %43 %44
+         %43 = OpLabel
+               OpStore %_GLF_color %23
+               OpBranch %42
+         %44 = OpLabel
+               OpStore %_GLF_color %24
+               OpBranch %42
+         %42 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-clamp-cmp-const-first/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-clamp-cmp-const-first/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..2553d12
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-clamp-cmp-const-first/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,41 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float f = 0.0f;
+  f = 1.0f;
+  while (true) {
+    const float x_31 = asfloat(x_6[0].x);
+    f = (f + x_31);
+    {
+      const float x_34 = f;
+      const float x_36 = asfloat(x_6[0].x);
+      if ((10.0f > clamp(x_34, 8.0f, (9.0f + x_36)))) {
+      } else {
+        break;
+      }
+    }
+  }
+  if ((f == 10.0f)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-clamp-cmp-const-first/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-clamp-cmp-const-first/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..bc7a9d0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-clamp-cmp-const-first/0-opt.spvasm.expected.msl
@@ -0,0 +1,46 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float f = 0.0f;
+  f = 1.0f;
+  while (true) {
+    float const x_31 = x_6.one;
+    float const x_32 = f;
+    f = (x_32 + x_31);
+    {
+      float const x_34 = f;
+      float const x_36 = x_6.one;
+      if ((10.0f > clamp(x_34, 8.0f, (9.0f + x_36)))) {
+      } else {
+        break;
+      }
+    }
+  }
+  float const x_40 = f;
+  if ((x_40 == 10.0f)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-clamp-cmp-const-first/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-clamp-cmp-const-first/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..9b5b3ab
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-clamp-cmp-const-first/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,120 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 64
+; Schema: 0
+               OpCapability Shader
+         %35 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %17 = OpConstantNull %float
+    %float_1 = OpConstant %float 1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+   %float_10 = OpConstant %float 10
+    %float_8 = OpConstant %float 8
+    %float_9 = OpConstant %float 9
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+         %50 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %51 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %52 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %17
+               OpStore %f %float_1
+               OpBranch %19
+         %19 = OpLabel
+               OpLoopMerge %20 %21 None
+               OpBranch %22
+         %22 = OpLabel
+         %26 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0
+         %27 = OpLoad %float %26
+         %28 = OpLoad %float %f
+         %29 = OpFAdd %float %28 %27
+               OpStore %f %29
+               OpBranch %21
+         %21 = OpLabel
+         %30 = OpLoad %float %f
+         %31 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0
+         %32 = OpLoad %float %31
+         %38 = OpFAdd %float %float_9 %32
+         %34 = OpExtInst %float %35 NClamp %30 %float_8 %38
+         %39 = OpFOrdGreaterThan %bool %float_10 %34
+               OpSelectionMerge %41 None
+               OpBranchConditional %39 %42 %43
+         %42 = OpLabel
+               OpBranch %41
+         %43 = OpLabel
+               OpBranch %20
+         %41 = OpLabel
+               OpBranch %19
+         %20 = OpLabel
+         %44 = OpLoad %float %f
+         %45 = OpFOrdEqual %bool %44 %float_10
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %48
+         %47 = OpLabel
+               OpStore %x_GLF_color %50
+               OpBranch %46
+         %48 = OpLabel
+               OpStore %x_GLF_color %51
+               OpBranch %46
+         %46 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %52
+%tint_symbol = OpFunctionParameter %main_out
+         %56 = OpLabel
+         %57 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %57
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %59 = OpLabel
+         %60 = OpFunctionCall %void %main_1
+         %62 = OpLoad %v4float %x_GLF_color
+         %63 = OpCompositeConstruct %main_out %62
+         %61 = OpFunctionCall %void %tint_symbol_2 %63
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 21[%21] is not post dominated by the back-edge block 41[%41]
+  %41 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-clamp-cmp-const-first/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-clamp-cmp-const-first/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..8478100
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-clamp-cmp-const-first/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,45 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  f = 1.0;
+  loop {
+    let x_31 : f32 = x_6.one;
+    let x_32 : f32 = f;
+    f = (x_32 + x_31);
+
+    continuing {
+      let x_34 : f32 = f;
+      let x_36 : f32 = x_6.one;
+      if ((10.0 > clamp(x_34, 8.0, (9.0 + x_36)))) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_40 : f32 = f;
+  if ((x_40 == 10.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-clamp-cmp-const-first/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-clamp-cmp-const-first/0-opt.wgsl
new file mode 100644
index 0000000..8478100
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-clamp-cmp-const-first/0-opt.wgsl
@@ -0,0 +1,45 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  f = 1.0;
+  loop {
+    let x_31 : f32 = x_6.one;
+    let x_32 : f32 = f;
+    f = (x_32 + x_31);
+
+    continuing {
+      let x_34 : f32 = f;
+      let x_36 : f32 = x_6.one;
+      if ((10.0 > clamp(x_34, 8.0, (9.0 + x_36)))) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_40 : f32 = f;
+  if ((x_40 == 10.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-clamp-cmp-const-first/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-clamp-cmp-const-first/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..2553d12
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-clamp-cmp-const-first/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,41 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float f = 0.0f;
+  f = 1.0f;
+  while (true) {
+    const float x_31 = asfloat(x_6[0].x);
+    f = (f + x_31);
+    {
+      const float x_34 = f;
+      const float x_36 = asfloat(x_6[0].x);
+      if ((10.0f > clamp(x_34, 8.0f, (9.0f + x_36)))) {
+      } else {
+        break;
+      }
+    }
+  }
+  if ((f == 10.0f)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-clamp-cmp-const-first/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-clamp-cmp-const-first/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..bc7a9d0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-clamp-cmp-const-first/0-opt.wgsl.expected.msl
@@ -0,0 +1,46 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float f = 0.0f;
+  f = 1.0f;
+  while (true) {
+    float const x_31 = x_6.one;
+    float const x_32 = f;
+    f = (x_32 + x_31);
+    {
+      float const x_34 = f;
+      float const x_36 = x_6.one;
+      if ((10.0f > clamp(x_34, 8.0f, (9.0f + x_36)))) {
+      } else {
+        break;
+      }
+    }
+  }
+  float const x_40 = f;
+  if ((x_40 == 10.0f)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-clamp-cmp-const-first/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-clamp-cmp-const-first/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..9b5b3ab
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-clamp-cmp-const-first/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,120 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 64
+; Schema: 0
+               OpCapability Shader
+         %35 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %17 = OpConstantNull %float
+    %float_1 = OpConstant %float 1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+   %float_10 = OpConstant %float 10
+    %float_8 = OpConstant %float 8
+    %float_9 = OpConstant %float 9
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+         %50 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %51 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %52 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %17
+               OpStore %f %float_1
+               OpBranch %19
+         %19 = OpLabel
+               OpLoopMerge %20 %21 None
+               OpBranch %22
+         %22 = OpLabel
+         %26 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0
+         %27 = OpLoad %float %26
+         %28 = OpLoad %float %f
+         %29 = OpFAdd %float %28 %27
+               OpStore %f %29
+               OpBranch %21
+         %21 = OpLabel
+         %30 = OpLoad %float %f
+         %31 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0
+         %32 = OpLoad %float %31
+         %38 = OpFAdd %float %float_9 %32
+         %34 = OpExtInst %float %35 NClamp %30 %float_8 %38
+         %39 = OpFOrdGreaterThan %bool %float_10 %34
+               OpSelectionMerge %41 None
+               OpBranchConditional %39 %42 %43
+         %42 = OpLabel
+               OpBranch %41
+         %43 = OpLabel
+               OpBranch %20
+         %41 = OpLabel
+               OpBranch %19
+         %20 = OpLabel
+         %44 = OpLoad %float %f
+         %45 = OpFOrdEqual %bool %44 %float_10
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %48
+         %47 = OpLabel
+               OpStore %x_GLF_color %50
+               OpBranch %46
+         %48 = OpLabel
+               OpStore %x_GLF_color %51
+               OpBranch %46
+         %46 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %52
+%tint_symbol = OpFunctionParameter %main_out
+         %56 = OpLabel
+         %57 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %57
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %59 = OpLabel
+         %60 = OpFunctionCall %void %main_1
+         %62 = OpLoad %v4float %x_GLF_color
+         %63 = OpCompositeConstruct %main_out %62
+         %61 = OpFunctionCall %void %tint_symbol_2 %63
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 21[%21] is not post dominated by the back-edge block 41[%41]
+  %41 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-clamp-cmp-const-first/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-clamp-cmp-const-first/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..8478100
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-clamp-cmp-const-first/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,45 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  f = 1.0;
+  loop {
+    let x_31 : f32 = x_6.one;
+    let x_32 : f32 = f;
+    f = (x_32 + x_31);
+
+    continuing {
+      let x_34 : f32 = f;
+      let x_36 : f32 = x_6.one;
+      if ((10.0 > clamp(x_34, 8.0, (9.0 + x_36)))) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_40 : f32 = f;
+  if ((x_40 == 10.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-merge-add-sub-uniform/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-merge-add-sub-uniform/0-opt.spvasm
new file mode 100644
index 0000000..90e1cbb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-merge-add-sub-uniform/0-opt.spvasm
@@ -0,0 +1,53 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %int_1 = OpConstant %int 1
+      %int_3 = OpConstant %int 3
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %20 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %21 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %7
+         %22 = OpLabel
+         %23 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %24 = OpLoad %int %23
+         %25 = OpISub %int %int_3 %24
+         %26 = OpIAdd %int %int_1 %25
+         %27 = OpIEqual %bool %26 %int_3
+               OpSelectionMerge %28 None
+               OpBranchConditional %27 %29 %30
+         %29 = OpLabel
+               OpStore %_GLF_color %20
+               OpBranch %28
+         %30 = OpLabel
+               OpStore %_GLF_color %21
+               OpBranch %28
+         %28 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-merge-add-sub-uniform/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-merge-add-sub-uniform/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..047beed
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-merge-add-sub-uniform/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,28 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const int x_24 = asint(x_5[0].x);
+  if (((1 + (3 - x_24)) == 3)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-merge-add-sub-uniform/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-merge-add-sub-uniform/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..b73cd87
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-merge-add-sub-uniform/0-opt.spvasm.expected.msl
@@ -0,0 +1,31 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  int const x_24 = x_5.one;
+  if (((1 + (3 - x_24)) == 3)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-merge-add-sub-uniform/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-merge-add-sub-uniform/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..4b46ac2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-merge-add-sub-uniform/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,85 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 46
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+      %int_3 = OpConstant %int 3
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %32 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %33 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %34 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+         %19 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0
+         %20 = OpLoad %int %19
+         %23 = OpISub %int %int_3 %20
+         %24 = OpIAdd %int %int_1 %23
+         %25 = OpIEqual %bool %24 %int_3
+               OpSelectionMerge %27 None
+               OpBranchConditional %25 %28 %29
+         %28 = OpLabel
+               OpStore %x_GLF_color %32
+               OpBranch %27
+         %29 = OpLabel
+               OpStore %x_GLF_color %33
+               OpBranch %27
+         %27 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %34
+%tint_symbol = OpFunctionParameter %main_out
+         %38 = OpLabel
+         %39 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %39
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %41 = OpLabel
+         %42 = OpFunctionCall %void %main_1
+         %44 = OpLoad %v4float %x_GLF_color
+         %45 = OpCompositeConstruct %main_out %44
+         %43 = OpFunctionCall %void %tint_symbol_2 %45
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-merge-add-sub-uniform/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-merge-add-sub-uniform/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..ed61556
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-merge-add-sub-uniform/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,29 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_24 : i32 = x_5.one;
+  if (((1 + (3 - x_24)) == 3)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-merge-add-sub-uniform/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-merge-add-sub-uniform/0-opt.wgsl
new file mode 100644
index 0000000..ed61556
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-merge-add-sub-uniform/0-opt.wgsl
@@ -0,0 +1,29 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_24 : i32 = x_5.one;
+  if (((1 + (3 - x_24)) == 3)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-merge-add-sub-uniform/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-merge-add-sub-uniform/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..047beed
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-merge-add-sub-uniform/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,28 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const int x_24 = asint(x_5[0].x);
+  if (((1 + (3 - x_24)) == 3)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-merge-add-sub-uniform/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-merge-add-sub-uniform/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..b73cd87
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-merge-add-sub-uniform/0-opt.wgsl.expected.msl
@@ -0,0 +1,31 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  int const x_24 = x_5.one;
+  if (((1 + (3 - x_24)) == 3)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-merge-add-sub-uniform/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-merge-add-sub-uniform/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..4b46ac2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-merge-add-sub-uniform/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,85 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 46
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+      %int_3 = OpConstant %int 3
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %32 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %33 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %34 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+         %19 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0
+         %20 = OpLoad %int %19
+         %23 = OpISub %int %int_3 %20
+         %24 = OpIAdd %int %int_1 %23
+         %25 = OpIEqual %bool %24 %int_3
+               OpSelectionMerge %27 None
+               OpBranchConditional %25 %28 %29
+         %28 = OpLabel
+               OpStore %x_GLF_color %32
+               OpBranch %27
+         %29 = OpLabel
+               OpStore %x_GLF_color %33
+               OpBranch %27
+         %27 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %34
+%tint_symbol = OpFunctionParameter %main_out
+         %38 = OpLabel
+         %39 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %39
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %41 = OpLabel
+         %42 = OpFunctionCall %void %main_1
+         %44 = OpLoad %v4float %x_GLF_color
+         %45 = OpCompositeConstruct %main_out %44
+         %43 = OpFunctionCall %void %tint_symbol_2 %45
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-merge-add-sub-uniform/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-merge-add-sub-uniform/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..ed61556
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-merge-add-sub-uniform/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,29 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_24 : i32 = x_5.one;
+  if (((1 + (3 - x_24)) == 3)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-construct-extract/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-construct-extract/0-opt.spvasm
new file mode 100644
index 0000000..bf8546c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-construct-extract/0-opt.spvasm
@@ -0,0 +1,80 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "twoandthree"
+               OpName %_ ""
+               OpName %b "b"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_1 = OpConstant %float 1
+         %21 = OpConstantComposite %v2float %float_1 %float_1
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+    %float_2 = OpConstant %float 2
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %28 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %29 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %9
+         %30 = OpLabel
+          %a = OpVariable %_ptr_Function_v2float Function
+          %b = OpVariable %_ptr_Function_v2float Function
+         %31 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+         %32 = OpLoad %v2float %31
+               OpStore %a %32
+         %33 = OpAccessChain %_ptr_Function_float %a %uint_0
+         %34 = OpLoad %float %33
+         %35 = OpLoad %v2float %a
+         %36 = OpExtInst %v2float %1 FClamp %35 %21 %21
+         %37 = OpCompositeExtract %float %36 1
+         %38 = OpCompositeConstruct %v2float %34 %37
+               OpStore %b %38
+         %39 = OpAccessChain %_ptr_Function_float %b %uint_0
+         %40 = OpLoad %float %39
+         %41 = OpFOrdEqual %bool %40 %float_2
+               OpSelectionMerge %42 None
+               OpBranchConditional %41 %43 %42
+         %43 = OpLabel
+         %44 = OpAccessChain %_ptr_Function_float %b %uint_1
+         %45 = OpLoad %float %44
+         %46 = OpFOrdEqual %bool %45 %float_1
+               OpBranch %42
+         %42 = OpLabel
+         %47 = OpPhi %bool %41 %30 %46 %43
+               OpSelectionMerge %48 None
+               OpBranchConditional %47 %49 %50
+         %49 = OpLabel
+               OpStore %_GLF_color %28
+               OpBranch %48
+         %50 = OpLabel
+               OpStore %_GLF_color %29
+               OpBranch %48
+         %48 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-construct-extract/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-construct-extract/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..3e0c589
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-construct-extract/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,43 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2 a = float2(0.0f, 0.0f);
+  float2 b = float2(0.0f, 0.0f);
+  bool x_46 = false;
+  bool x_47_phi = false;
+  const float2 x_32 = asfloat(x_6[0].xy);
+  a = x_32;
+  const float x_34 = a.x;
+  b = float2(x_34, clamp(a, float2(1.0f, 1.0f), float2(1.0f, 1.0f)).y);
+  const float x_40 = b.x;
+  const bool x_41 = (x_40 == 2.0f);
+  x_47_phi = x_41;
+  if (x_41) {
+    const float x_45 = b.y;
+    x_46 = (x_45 == 1.0f);
+    x_47_phi = x_46;
+  }
+  if (x_47_phi) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-construct-extract/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-construct-extract/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..4aa4b0c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-construct-extract/0-opt.spvasm.expected.msl
@@ -0,0 +1,48 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 twoandthree;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float2 a = 0.0f;
+  float2 b = 0.0f;
+  bool x_46 = false;
+  bool x_47_phi = false;
+  float2 const x_32 = x_6.twoandthree;
+  a = x_32;
+  float const x_34 = a.x;
+  float2 const x_35 = a;
+  b = float2(x_34, clamp(x_35, float2(1.0f, 1.0f), float2(1.0f, 1.0f)).y);
+  float const x_40 = b.x;
+  bool const x_41 = (x_40 == 2.0f);
+  x_47_phi = x_41;
+  if (x_41) {
+    float const x_45 = b.y;
+    x_46 = (x_45 == 1.0f);
+    x_47_phi = x_46;
+  }
+  bool const x_47 = x_47_phi;
+  if (x_47) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-construct-extract/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-construct-extract/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..e0f212a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-construct-extract/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,121 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 70
+; Schema: 0
+               OpCapability Shader
+         %35 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "twoandthree"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %x_46 "x_46"
+               OpName %x_47_phi "x_47_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %18 = OpConstantNull %v2float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %23 = OpConstantNull %bool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_1 = OpConstant %float 1
+         %37 = OpConstantComposite %v2float %float_1 %float_1
+    %float_2 = OpConstant %float 2
+     %uint_1 = OpConstant %uint 1
+    %float_0 = OpConstant %float 0
+         %56 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %57 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %58 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %a = OpVariable %_ptr_Function_v2float Function %18
+          %b = OpVariable %_ptr_Function_v2float Function %18
+       %x_46 = OpVariable %_ptr_Function_bool Function %23
+   %x_47_phi = OpVariable %_ptr_Function_bool Function %23
+         %28 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %29 = OpLoad %v2float %28
+               OpStore %a %29
+         %31 = OpAccessChain %_ptr_Function_float %a %uint_0
+         %32 = OpLoad %float %31
+         %33 = OpLoad %v2float %a
+         %34 = OpExtInst %v2float %35 NClamp %33 %37 %37
+         %38 = OpCompositeExtract %float %34 1
+         %39 = OpCompositeConstruct %v2float %32 %38
+               OpStore %b %39
+         %40 = OpAccessChain %_ptr_Function_float %b %uint_0
+         %41 = OpLoad %float %40
+         %43 = OpFOrdEqual %bool %41 %float_2
+               OpStore %x_47_phi %43
+               OpSelectionMerge %44 None
+               OpBranchConditional %43 %45 %44
+         %45 = OpLabel
+         %47 = OpAccessChain %_ptr_Function_float %b %uint_1
+         %48 = OpLoad %float %47
+         %49 = OpFOrdEqual %bool %48 %float_1
+               OpStore %x_46 %49
+         %50 = OpLoad %bool %x_46
+               OpStore %x_47_phi %50
+               OpBranch %44
+         %44 = OpLabel
+         %51 = OpLoad %bool %x_47_phi
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %54
+         %53 = OpLabel
+               OpStore %x_GLF_color %56
+               OpBranch %52
+         %54 = OpLabel
+               OpStore %x_GLF_color %57
+               OpBranch %52
+         %52 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %58
+%tint_symbol = OpFunctionParameter %main_out
+         %62 = OpLabel
+         %63 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %63
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %65 = OpLabel
+         %66 = OpFunctionCall %void %main_1
+         %68 = OpLoad %v4float %x_GLF_color
+         %69 = OpCompositeConstruct %main_out %68
+         %67 = OpFunctionCall %void %tint_symbol_2 %69
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-construct-extract/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-construct-extract/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..dc6b0c4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-construct-extract/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,46 @@
+[[block]]
+struct buf0 {
+  twoandthree : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : vec2<f32>;
+  var b : vec2<f32>;
+  var x_46 : bool;
+  var x_47_phi : bool;
+  let x_32 : vec2<f32> = x_6.twoandthree;
+  a = x_32;
+  let x_34 : f32 = a.x;
+  let x_35 : vec2<f32> = a;
+  b = vec2<f32>(x_34, clamp(x_35, vec2<f32>(1.0, 1.0), vec2<f32>(1.0, 1.0)).y);
+  let x_40 : f32 = b.x;
+  let x_41 : bool = (x_40 == 2.0);
+  x_47_phi = x_41;
+  if (x_41) {
+    let x_45 : f32 = b.y;
+    x_46 = (x_45 == 1.0);
+    x_47_phi = x_46;
+  }
+  let x_47 : bool = x_47_phi;
+  if (x_47) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-construct-extract/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-construct-extract/0-opt.wgsl
new file mode 100644
index 0000000..dc6b0c4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-construct-extract/0-opt.wgsl
@@ -0,0 +1,46 @@
+[[block]]
+struct buf0 {
+  twoandthree : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : vec2<f32>;
+  var b : vec2<f32>;
+  var x_46 : bool;
+  var x_47_phi : bool;
+  let x_32 : vec2<f32> = x_6.twoandthree;
+  a = x_32;
+  let x_34 : f32 = a.x;
+  let x_35 : vec2<f32> = a;
+  b = vec2<f32>(x_34, clamp(x_35, vec2<f32>(1.0, 1.0), vec2<f32>(1.0, 1.0)).y);
+  let x_40 : f32 = b.x;
+  let x_41 : bool = (x_40 == 2.0);
+  x_47_phi = x_41;
+  if (x_41) {
+    let x_45 : f32 = b.y;
+    x_46 = (x_45 == 1.0);
+    x_47_phi = x_46;
+  }
+  let x_47 : bool = x_47_phi;
+  if (x_47) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-construct-extract/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-construct-extract/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..3e0c589
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-construct-extract/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,43 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2 a = float2(0.0f, 0.0f);
+  float2 b = float2(0.0f, 0.0f);
+  bool x_46 = false;
+  bool x_47_phi = false;
+  const float2 x_32 = asfloat(x_6[0].xy);
+  a = x_32;
+  const float x_34 = a.x;
+  b = float2(x_34, clamp(a, float2(1.0f, 1.0f), float2(1.0f, 1.0f)).y);
+  const float x_40 = b.x;
+  const bool x_41 = (x_40 == 2.0f);
+  x_47_phi = x_41;
+  if (x_41) {
+    const float x_45 = b.y;
+    x_46 = (x_45 == 1.0f);
+    x_47_phi = x_46;
+  }
+  if (x_47_phi) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-construct-extract/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-construct-extract/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..4aa4b0c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-construct-extract/0-opt.wgsl.expected.msl
@@ -0,0 +1,48 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 twoandthree;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float2 a = 0.0f;
+  float2 b = 0.0f;
+  bool x_46 = false;
+  bool x_47_phi = false;
+  float2 const x_32 = x_6.twoandthree;
+  a = x_32;
+  float const x_34 = a.x;
+  float2 const x_35 = a;
+  b = float2(x_34, clamp(x_35, float2(1.0f, 1.0f), float2(1.0f, 1.0f)).y);
+  float const x_40 = b.x;
+  bool const x_41 = (x_40 == 2.0f);
+  x_47_phi = x_41;
+  if (x_41) {
+    float const x_45 = b.y;
+    x_46 = (x_45 == 1.0f);
+    x_47_phi = x_46;
+  }
+  bool const x_47 = x_47_phi;
+  if (x_47) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-construct-extract/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-construct-extract/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..e0f212a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-construct-extract/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,121 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 70
+; Schema: 0
+               OpCapability Shader
+         %35 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "twoandthree"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %x_46 "x_46"
+               OpName %x_47_phi "x_47_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %18 = OpConstantNull %v2float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %23 = OpConstantNull %bool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_1 = OpConstant %float 1
+         %37 = OpConstantComposite %v2float %float_1 %float_1
+    %float_2 = OpConstant %float 2
+     %uint_1 = OpConstant %uint 1
+    %float_0 = OpConstant %float 0
+         %56 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %57 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %58 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %a = OpVariable %_ptr_Function_v2float Function %18
+          %b = OpVariable %_ptr_Function_v2float Function %18
+       %x_46 = OpVariable %_ptr_Function_bool Function %23
+   %x_47_phi = OpVariable %_ptr_Function_bool Function %23
+         %28 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %29 = OpLoad %v2float %28
+               OpStore %a %29
+         %31 = OpAccessChain %_ptr_Function_float %a %uint_0
+         %32 = OpLoad %float %31
+         %33 = OpLoad %v2float %a
+         %34 = OpExtInst %v2float %35 NClamp %33 %37 %37
+         %38 = OpCompositeExtract %float %34 1
+         %39 = OpCompositeConstruct %v2float %32 %38
+               OpStore %b %39
+         %40 = OpAccessChain %_ptr_Function_float %b %uint_0
+         %41 = OpLoad %float %40
+         %43 = OpFOrdEqual %bool %41 %float_2
+               OpStore %x_47_phi %43
+               OpSelectionMerge %44 None
+               OpBranchConditional %43 %45 %44
+         %45 = OpLabel
+         %47 = OpAccessChain %_ptr_Function_float %b %uint_1
+         %48 = OpLoad %float %47
+         %49 = OpFOrdEqual %bool %48 %float_1
+               OpStore %x_46 %49
+         %50 = OpLoad %bool %x_46
+               OpStore %x_47_phi %50
+               OpBranch %44
+         %44 = OpLabel
+         %51 = OpLoad %bool %x_47_phi
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %54
+         %53 = OpLabel
+               OpStore %x_GLF_color %56
+               OpBranch %52
+         %54 = OpLabel
+               OpStore %x_GLF_color %57
+               OpBranch %52
+         %52 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %58
+%tint_symbol = OpFunctionParameter %main_out
+         %62 = OpLabel
+         %63 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %63
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %65 = OpLabel
+         %66 = OpFunctionCall %void %main_1
+         %68 = OpLoad %v4float %x_GLF_color
+         %69 = OpCompositeConstruct %main_out %68
+         %67 = OpFunctionCall %void %tint_symbol_2 %69
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-construct-extract/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-construct-extract/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..dc6b0c4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-construct-extract/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,46 @@
+[[block]]
+struct buf0 {
+  twoandthree : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : vec2<f32>;
+  var b : vec2<f32>;
+  var x_46 : bool;
+  var x_47_phi : bool;
+  let x_32 : vec2<f32> = x_6.twoandthree;
+  a = x_32;
+  let x_34 : f32 = a.x;
+  let x_35 : vec2<f32> = a;
+  b = vec2<f32>(x_34, clamp(x_35, vec2<f32>(1.0, 1.0), vec2<f32>(1.0, 1.0)).y);
+  let x_40 : f32 = b.x;
+  let x_41 : bool = (x_40 == 2.0);
+  x_47_phi = x_41;
+  if (x_41) {
+    let x_45 : f32 = b.y;
+    x_46 = (x_45 == 1.0);
+    x_47_phi = x_46;
+  }
+  let x_47 : bool = x_47_phi;
+  if (x_47) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-extract/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-extract/0-opt.spvasm
new file mode 100644
index 0000000..65d8735
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-extract/0-opt.spvasm
@@ -0,0 +1,54 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "three"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_4 = OpConstant %float 4
+    %v4float = OpTypeVector %float 4
+    %float_0 = OpConstant %float 0
+         %18 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_0
+       %bool = OpTypeBool
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %21 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %22 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %7
+         %23 = OpLabel
+         %24 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %25 = OpLoad %float %24
+         %26 = OpCompositeConstruct %v4float %float_1 %float_2 %25 %float_4
+         %27 = OpDot %float %26 %18
+         %28 = OpFOrdEqual %bool %27 %float_2
+               OpSelectionMerge %29 None
+               OpBranchConditional %28 %30 %31
+         %30 = OpLabel
+               OpStore %_GLF_color %21
+               OpBranch %29
+         %31 = OpLabel
+               OpStore %_GLF_color %22
+               OpBranch %29
+         %29 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-extract/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-extract/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..d3f224d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-extract/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,28 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const float x_25 = asfloat(x_5[0].x);
+  if ((dot(float4(1.0f, 2.0f, x_25, 4.0f), float4(0.0f, 1.0f, 0.0f, 0.0f)) == 2.0f)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-extract/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-extract/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..8639723
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-extract/0-opt.spvasm.expected.msl
@@ -0,0 +1,31 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float three;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  float const x_25 = x_5.three;
+  if ((dot(float4(1.0f, 2.0f, x_25, 4.0f), float4(0.0f, 1.0f, 0.0f, 0.0f)) == 2.0f)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-extract/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-extract/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..d9bb8a7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-extract/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,85 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 46
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "three"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+    %float_4 = OpConstant %float 4
+    %float_0 = OpConstant %float 0
+         %26 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_0
+       %bool = OpTypeBool
+         %32 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %33 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %34 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+         %18 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0
+         %19 = OpLoad %float %18
+         %24 = OpCompositeConstruct %v4float %float_1 %float_2 %19 %float_4
+         %20 = OpDot %float %24 %26
+         %27 = OpFOrdEqual %bool %20 %float_2
+               OpSelectionMerge %29 None
+               OpBranchConditional %27 %30 %31
+         %30 = OpLabel
+               OpStore %x_GLF_color %32
+               OpBranch %29
+         %31 = OpLabel
+               OpStore %x_GLF_color %33
+               OpBranch %29
+         %29 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %34
+%tint_symbol = OpFunctionParameter %main_out
+         %38 = OpLabel
+         %39 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %39
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %41 = OpLabel
+         %42 = OpFunctionCall %void %main_1
+         %44 = OpLoad %v4float %x_GLF_color
+         %45 = OpCompositeConstruct %main_out %44
+         %43 = OpFunctionCall %void %tint_symbol_2 %45
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-extract/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-extract/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..da33dc4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-extract/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,29 @@
+[[block]]
+struct buf0 {
+  three : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_25 : f32 = x_5.three;
+  if ((dot(vec4<f32>(1.0, 2.0, x_25, 4.0), vec4<f32>(0.0, 1.0, 0.0, 0.0)) == 2.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-extract/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-extract/0-opt.wgsl
new file mode 100644
index 0000000..da33dc4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-extract/0-opt.wgsl
@@ -0,0 +1,29 @@
+[[block]]
+struct buf0 {
+  three : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_25 : f32 = x_5.three;
+  if ((dot(vec4<f32>(1.0, 2.0, x_25, 4.0), vec4<f32>(0.0, 1.0, 0.0, 0.0)) == 2.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-extract/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-extract/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..d3f224d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-extract/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,28 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const float x_25 = asfloat(x_5[0].x);
+  if ((dot(float4(1.0f, 2.0f, x_25, 4.0f), float4(0.0f, 1.0f, 0.0f, 0.0f)) == 2.0f)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-extract/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-extract/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..8639723
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-extract/0-opt.wgsl.expected.msl
@@ -0,0 +1,31 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float three;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  float const x_25 = x_5.three;
+  if ((dot(float4(1.0f, 2.0f, x_25, 4.0f), float4(0.0f, 1.0f, 0.0f, 0.0f)) == 2.0f)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-extract/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-extract/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..d9bb8a7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-extract/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,85 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 46
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "three"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+    %float_4 = OpConstant %float 4
+    %float_0 = OpConstant %float 0
+         %26 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_0
+       %bool = OpTypeBool
+         %32 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %33 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %34 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+         %18 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0
+         %19 = OpLoad %float %18
+         %24 = OpCompositeConstruct %v4float %float_1 %float_2 %19 %float_4
+         %20 = OpDot %float %24 %26
+         %27 = OpFOrdEqual %bool %20 %float_2
+               OpSelectionMerge %29 None
+               OpBranchConditional %27 %30 %31
+         %30 = OpLabel
+               OpStore %x_GLF_color %32
+               OpBranch %29
+         %31 = OpLabel
+               OpStore %x_GLF_color %33
+               OpBranch %29
+         %29 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %34
+%tint_symbol = OpFunctionParameter %main_out
+         %38 = OpLabel
+         %39 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %39
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %41 = OpLabel
+         %42 = OpFunctionCall %void %main_1
+         %44 = OpLoad %v4float %x_GLF_color
+         %45 = OpCompositeConstruct %main_out %44
+         %43 = OpFunctionCall %void %tint_symbol_2 %45
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-extract/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-extract/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..da33dc4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-extract/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,29 @@
+[[block]]
+struct buf0 {
+  three : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_25 : f32 = x_5.three;
+  if ((dot(vec4<f32>(1.0, 2.0, x_25, 4.0), vec4<f32>(0.0, 1.0, 0.0, 0.0)) == 2.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-no-extract/0.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-no-extract/0.spvasm
new file mode 100644
index 0000000..eb91750
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-no-extract/0.spvasm
@@ -0,0 +1,55 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "three"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %float_2 = OpConstant %float 2
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %v2float = OpTypeVector %float 2
+    %float_0 = OpConstant %float 0
+         %16 = OpConstantComposite %v2float %float_0 %float_2
+    %float_6 = OpConstant %float 6
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+         %22 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %23 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %7
+         %24 = OpLabel
+         %25 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %26 = OpLoad %float %25
+         %27 = OpCompositeConstruct %v2float %float_2 %26
+         %28 = OpDot %float %27 %16
+         %29 = OpFOrdEqual %bool %28 %float_6
+               OpSelectionMerge %30 None
+               OpBranchConditional %29 %31 %32
+         %31 = OpLabel
+               OpStore %_GLF_color %22
+               OpBranch %30
+         %32 = OpLabel
+               OpStore %_GLF_color %23
+               OpBranch %30
+         %30 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-no-extract/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-no-extract/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..43f1990
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-no-extract/0.spvasm.expected.hlsl
@@ -0,0 +1,28 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const float x_26 = asfloat(x_5[0].x);
+  if ((dot(float2(2.0f, x_26), float2(0.0f, 2.0f)) == 6.0f)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-no-extract/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-no-extract/0.spvasm.expected.msl
new file mode 100644
index 0000000..5f40f93
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-no-extract/0.spvasm.expected.msl
@@ -0,0 +1,31 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float three;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  float const x_26 = x_5.three;
+  if ((dot(float2(2.0f, x_26), float2(0.0f, 2.0f)) == 6.0f)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-no-extract/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-no-extract/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..61c450f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-no-extract/0.spvasm.expected.spvasm
@@ -0,0 +1,86 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 47
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "three"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %v2float = OpTypeVector %float 2
+    %float_2 = OpConstant %float 2
+    %float_0 = OpConstant %float 0
+         %25 = OpConstantComposite %v2float %float_0 %float_2
+    %float_6 = OpConstant %float 6
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+         %33 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %34 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %35 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+         %18 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0
+         %19 = OpLoad %float %18
+         %23 = OpCompositeConstruct %v2float %float_2 %19
+         %20 = OpDot %float %23 %25
+         %27 = OpFOrdEqual %bool %20 %float_6
+               OpSelectionMerge %29 None
+               OpBranchConditional %27 %30 %31
+         %30 = OpLabel
+               OpStore %x_GLF_color %33
+               OpBranch %29
+         %31 = OpLabel
+               OpStore %x_GLF_color %34
+               OpBranch %29
+         %29 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %35
+%tint_symbol = OpFunctionParameter %main_out
+         %39 = OpLabel
+         %40 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %40
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %42 = OpLabel
+         %43 = OpFunctionCall %void %main_1
+         %45 = OpLoad %v4float %x_GLF_color
+         %46 = OpCompositeConstruct %main_out %45
+         %44 = OpFunctionCall %void %tint_symbol_2 %46
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-no-extract/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-no-extract/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..b9c222e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-no-extract/0.spvasm.expected.wgsl
@@ -0,0 +1,29 @@
+[[block]]
+struct buf0 {
+  three : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_26 : f32 = x_5.three;
+  if ((dot(vec2<f32>(2.0, x_26), vec2<f32>(0.0, 2.0)) == 6.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-no-extract/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-no-extract/0.wgsl
new file mode 100644
index 0000000..b9c222e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-no-extract/0.wgsl
@@ -0,0 +1,29 @@
+[[block]]
+struct buf0 {
+  three : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_26 : f32 = x_5.three;
+  if ((dot(vec2<f32>(2.0, x_26), vec2<f32>(0.0, 2.0)) == 6.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-no-extract/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-no-extract/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..43f1990
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-no-extract/0.wgsl.expected.hlsl
@@ -0,0 +1,28 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const float x_26 = asfloat(x_5[0].x);
+  if ((dot(float2(2.0f, x_26), float2(0.0f, 2.0f)) == 6.0f)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-no-extract/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-no-extract/0.wgsl.expected.msl
new file mode 100644
index 0000000..5f40f93
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-no-extract/0.wgsl.expected.msl
@@ -0,0 +1,31 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float three;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  float const x_26 = x_5.three;
+  if ((dot(float2(2.0f, x_26), float2(0.0f, 2.0f)) == 6.0f)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-no-extract/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-no-extract/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..61c450f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-no-extract/0.wgsl.expected.spvasm
@@ -0,0 +1,86 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 47
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "three"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %v2float = OpTypeVector %float 2
+    %float_2 = OpConstant %float 2
+    %float_0 = OpConstant %float 0
+         %25 = OpConstantComposite %v2float %float_0 %float_2
+    %float_6 = OpConstant %float 6
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+         %33 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %34 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %35 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+         %18 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0
+         %19 = OpLoad %float %18
+         %23 = OpCompositeConstruct %v2float %float_2 %19
+         %20 = OpDot %float %23 %25
+         %27 = OpFOrdEqual %bool %20 %float_6
+               OpSelectionMerge %29 None
+               OpBranchConditional %27 %30 %31
+         %30 = OpLabel
+               OpStore %x_GLF_color %33
+               OpBranch %29
+         %31 = OpLabel
+               OpStore %x_GLF_color %34
+               OpBranch %29
+         %29 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %35
+%tint_symbol = OpFunctionParameter %main_out
+         %39 = OpLabel
+         %40 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %40
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %42 = OpLabel
+         %43 = OpFunctionCall %void %main_1
+         %45 = OpLoad %v4float %x_GLF_color
+         %46 = OpCompositeConstruct %main_out %45
+         %44 = OpFunctionCall %void %tint_symbol_2 %46
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-no-extract/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-no-extract/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..b9c222e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-dot-no-extract/0.wgsl.expected.wgsl
@@ -0,0 +1,29 @@
+[[block]]
+struct buf0 {
+  three : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_26 : f32 = x_5.three;
+  if ((dot(vec2<f32>(2.0, x_26), vec2<f32>(0.0, 2.0)) == 6.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-add-sub/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-add-sub/0-opt.spvasm
new file mode 100644
index 0000000..f868d4d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-add-sub/0-opt.spvasm
@@ -0,0 +1,71 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %i "i"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %i RelaxedPrecision
+               OpDecorate %5 RelaxedPrecision
+               OpDecorate %6 RelaxedPrecision
+               OpDecorate %7 RelaxedPrecision
+               OpDecorate %8 RelaxedPrecision
+               OpDecorate %9 RelaxedPrecision
+               OpDecorate %10 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_5 = OpConstant %int 5
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+      %int_1 = OpConstant %int 1
+     %int_n1 = OpConstant %int -1
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %26 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %27 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %12
+         %28 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+               OpStore %i %int_5
+               OpBranch %29
+         %29 = OpLabel
+               OpLoopMerge %30 %31 None
+               OpBranch %32
+         %32 = OpLabel
+          %5 = OpLoad %int %i
+         %33 = OpSGreaterThanEqual %bool %5 %int_0
+               OpBranchConditional %33 %34 %30
+         %34 = OpLabel
+          %6 = OpLoad %int %i
+          %7 = OpISub %int %6 %int_3
+               OpStore %i %7
+          %8 = OpLoad %int %i
+          %9 = OpIAdd %int %8 %int_1
+               OpStore %i %9
+               OpBranch %31
+         %31 = OpLabel
+               OpBranch %29
+         %30 = OpLabel
+         %10 = OpLoad %int %i
+         %35 = OpIEqual %bool %10 %int_n1
+               OpSelectionMerge %36 None
+               OpBranchConditional %35 %37 %38
+         %37 = OpLabel
+               OpStore %_GLF_color %26
+               OpBranch %36
+         %38 = OpLabel
+               OpStore %_GLF_color %27
+               OpBranch %36
+         %36 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-add-sub/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-add-sub/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..c8380b4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-add-sub/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,34 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int i = 0;
+  i = 5;
+  while (true) {
+    if ((i >= 0)) {
+    } else {
+      break;
+    }
+    i = (i - 3);
+    i = (i + 1);
+  }
+  if ((i == -1)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-add-sub/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-add-sub/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..921f5ea
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-add-sub/0-opt.spvasm.expected.msl
@@ -0,0 +1,41 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  int i = 0;
+  i = 5;
+  while (true) {
+    int const x_5 = i;
+    if ((x_5 >= 0)) {
+    } else {
+      break;
+    }
+    int const x_6 = i;
+    i = (x_6 - 3);
+    int const x_8 = i;
+    i = (x_8 + 1);
+  }
+  int const x_10 = i;
+  if ((x_10 == -1)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-add-sub/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-add-sub/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..85eee57
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-add-sub/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,100 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 56
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %15 = OpConstantNull %int
+      %int_5 = OpConstant %int 5
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+      %int_1 = OpConstant %int 1
+     %int_n1 = OpConstant %int -1
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %42 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %43 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %44 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %15
+               OpStore %i %int_5
+               OpBranch %17
+         %17 = OpLabel
+               OpLoopMerge %18 %19 None
+               OpBranch %20
+         %20 = OpLabel
+         %21 = OpLoad %int %i
+         %23 = OpSGreaterThanEqual %bool %21 %int_0
+               OpSelectionMerge %25 None
+               OpBranchConditional %23 %26 %27
+         %26 = OpLabel
+               OpBranch %25
+         %27 = OpLabel
+               OpBranch %18
+         %25 = OpLabel
+         %28 = OpLoad %int %i
+         %30 = OpISub %int %28 %int_3
+               OpStore %i %30
+         %31 = OpLoad %int %i
+         %33 = OpIAdd %int %31 %int_1
+               OpStore %i %33
+               OpBranch %19
+         %19 = OpLabel
+               OpBranch %17
+         %18 = OpLabel
+         %34 = OpLoad %int %i
+         %36 = OpIEqual %bool %34 %int_n1
+               OpSelectionMerge %37 None
+               OpBranchConditional %36 %38 %39
+         %38 = OpLabel
+               OpStore %x_GLF_color %42
+               OpBranch %37
+         %39 = OpLabel
+               OpStore %x_GLF_color %43
+               OpBranch %37
+         %37 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %44
+%tint_symbol = OpFunctionParameter %main_out
+         %48 = OpLabel
+         %49 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %49
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %51 = OpLabel
+         %52 = OpFunctionCall %void %main_1
+         %54 = OpLoad %v4float %x_GLF_color
+         %55 = OpCompositeConstruct %main_out %54
+         %53 = OpFunctionCall %void %tint_symbol_2 %55
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-add-sub/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-add-sub/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..7c7b28a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-add-sub/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,35 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  i = 5;
+  loop {
+    let x_5 : i32 = i;
+    if ((x_5 >= 0)) {
+    } else {
+      break;
+    }
+    let x_6 : i32 = i;
+    i = (x_6 - 3);
+    let x_8 : i32 = i;
+    i = (x_8 + 1);
+  }
+  let x_10 : i32 = i;
+  if ((x_10 == -1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-add-sub/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-add-sub/0-opt.wgsl
new file mode 100644
index 0000000..7c7b28a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-add-sub/0-opt.wgsl
@@ -0,0 +1,35 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  i = 5;
+  loop {
+    let x_5 : i32 = i;
+    if ((x_5 >= 0)) {
+    } else {
+      break;
+    }
+    let x_6 : i32 = i;
+    i = (x_6 - 3);
+    let x_8 : i32 = i;
+    i = (x_8 + 1);
+  }
+  let x_10 : i32 = i;
+  if ((x_10 == -1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-add-sub/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-add-sub/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..c8380b4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-add-sub/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,34 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int i = 0;
+  i = 5;
+  while (true) {
+    if ((i >= 0)) {
+    } else {
+      break;
+    }
+    i = (i - 3);
+    i = (i + 1);
+  }
+  if ((i == -1)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-add-sub/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-add-sub/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..921f5ea
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-add-sub/0-opt.wgsl.expected.msl
@@ -0,0 +1,41 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  int i = 0;
+  i = 5;
+  while (true) {
+    int const x_5 = i;
+    if ((x_5 >= 0)) {
+    } else {
+      break;
+    }
+    int const x_6 = i;
+    i = (x_6 - 3);
+    int const x_8 = i;
+    i = (x_8 + 1);
+  }
+  int const x_10 = i;
+  if ((x_10 == -1)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-add-sub/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-add-sub/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..85eee57
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-add-sub/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,100 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 56
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %15 = OpConstantNull %int
+      %int_5 = OpConstant %int 5
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+      %int_1 = OpConstant %int 1
+     %int_n1 = OpConstant %int -1
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %42 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %43 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %44 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %15
+               OpStore %i %int_5
+               OpBranch %17
+         %17 = OpLabel
+               OpLoopMerge %18 %19 None
+               OpBranch %20
+         %20 = OpLabel
+         %21 = OpLoad %int %i
+         %23 = OpSGreaterThanEqual %bool %21 %int_0
+               OpSelectionMerge %25 None
+               OpBranchConditional %23 %26 %27
+         %26 = OpLabel
+               OpBranch %25
+         %27 = OpLabel
+               OpBranch %18
+         %25 = OpLabel
+         %28 = OpLoad %int %i
+         %30 = OpISub %int %28 %int_3
+               OpStore %i %30
+         %31 = OpLoad %int %i
+         %33 = OpIAdd %int %31 %int_1
+               OpStore %i %33
+               OpBranch %19
+         %19 = OpLabel
+               OpBranch %17
+         %18 = OpLabel
+         %34 = OpLoad %int %i
+         %36 = OpIEqual %bool %34 %int_n1
+               OpSelectionMerge %37 None
+               OpBranchConditional %36 %38 %39
+         %38 = OpLabel
+               OpStore %x_GLF_color %42
+               OpBranch %37
+         %39 = OpLabel
+               OpStore %x_GLF_color %43
+               OpBranch %37
+         %37 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %44
+%tint_symbol = OpFunctionParameter %main_out
+         %48 = OpLabel
+         %49 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %49
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %51 = OpLabel
+         %52 = OpFunctionCall %void %main_1
+         %54 = OpLoad %v4float %x_GLF_color
+         %55 = OpCompositeConstruct %main_out %54
+         %53 = OpFunctionCall %void %tint_symbol_2 %55
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-add-sub/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-add-sub/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..7c7b28a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-add-sub/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,35 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  i = 5;
+  loop {
+    let x_5 : i32 = i;
+    if ((x_5 >= 0)) {
+    } else {
+      break;
+    }
+    let x_6 : i32 = i;
+    i = (x_6 - 3);
+    let x_8 : i32 = i;
+    i = (x_8 + 1);
+  }
+  let x_10 : i32 = i;
+  if ((x_10 == -1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-div-mul/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-div-mul/0-opt.spvasm
new file mode 100644
index 0000000..ce10f86
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-div-mul/0-opt.spvasm
@@ -0,0 +1,63 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %f "f"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_4 = OpConstant %float 4
+    %float_2 = OpConstant %float 2
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%float_1_89999998 = OpConstant %float 1.89999998
+       %bool = OpTypeBool
+%float_2_0999999 = OpConstant %float 2.0999999
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %24 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %25 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %8
+         %26 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function
+         %27 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %28 = OpLoad %float %27
+         %29 = OpFMul %float %float_2 %28
+         %30 = OpFDiv %float %float_4 %29
+               OpStore %f %30
+         %31 = OpLoad %float %f
+         %32 = OpFOrdGreaterThan %bool %31 %float_1_89999998
+         %33 = OpLoad %float %f
+         %34 = OpFOrdLessThan %bool %33 %float_2_0999999
+         %35 = OpLogicalAnd %bool %32 %34
+               OpSelectionMerge %36 None
+               OpBranchConditional %35 %37 %38
+         %37 = OpLabel
+               OpStore %_GLF_color %24
+               OpBranch %36
+         %38 = OpLabel
+               OpStore %_GLF_color %25
+               OpBranch %36
+         %36 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-div-mul/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-div-mul/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..d20ee0a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-div-mul/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,34 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float f = 0.0f;
+  const float x_28 = asfloat(x_6[0].x);
+  f = (4.0f / (2.0f * x_28));
+  bool tint_tmp = (f > 1.899999976f);
+  if (tint_tmp) {
+    tint_tmp = (f < 2.099999905f);
+  }
+  if ((tint_tmp)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-div-mul/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-div-mul/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..b807292
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-div-mul/0-opt.spvasm.expected.msl
@@ -0,0 +1,35 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float f = 0.0f;
+  float const x_28 = x_6.one;
+  f = (4.0f / (2.0f * x_28));
+  float const x_31 = f;
+  float const x_33 = f;
+  if (((x_31 > 1.899999976f) && (x_33 < 2.099999905f))) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-div-mul/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-div-mul/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..056fe41
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-div-mul/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,100 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 56
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %17 = OpConstantNull %float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_4 = OpConstant %float 4
+    %float_2 = OpConstant %float 2
+%float_1_89999998 = OpConstant %float 1.89999998
+       %bool = OpTypeBool
+%float_2_0999999 = OpConstant %float 2.0999999
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %42 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %43 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %44 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %17
+         %21 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0
+         %22 = OpLoad %float %21
+         %25 = OpFMul %float %float_2 %22
+         %26 = OpFDiv %float %float_4 %25
+               OpStore %f %26
+         %27 = OpLoad %float %f
+         %28 = OpLoad %float %f
+         %30 = OpFOrdGreaterThan %bool %27 %float_1_89999998
+               OpSelectionMerge %32 None
+               OpBranchConditional %30 %33 %32
+         %33 = OpLabel
+         %35 = OpFOrdLessThan %bool %28 %float_2_0999999
+               OpBranch %32
+         %32 = OpLabel
+         %36 = OpPhi %bool %30 %14 %35 %33
+               OpSelectionMerge %37 None
+               OpBranchConditional %36 %38 %39
+         %38 = OpLabel
+               OpStore %x_GLF_color %42
+               OpBranch %37
+         %39 = OpLabel
+               OpStore %x_GLF_color %43
+               OpBranch %37
+         %37 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %44
+%tint_symbol = OpFunctionParameter %main_out
+         %48 = OpLabel
+         %49 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %49
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %51 = OpLabel
+         %52 = OpFunctionCall %void %main_1
+         %54 = OpLoad %v4float %x_GLF_color
+         %55 = OpCompositeConstruct %main_out %54
+         %53 = OpFunctionCall %void %tint_symbol_2 %55
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-div-mul/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-div-mul/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..5b77b48
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-div-mul/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,33 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  let x_28 : f32 = x_6.one;
+  f = (4.0 / (2.0 * x_28));
+  let x_31 : f32 = f;
+  let x_33 : f32 = f;
+  if (((x_31 > 1.899999976) && (x_33 < 2.099999905))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-div-mul/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-div-mul/0-opt.wgsl
new file mode 100644
index 0000000..5b77b48
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-div-mul/0-opt.wgsl
@@ -0,0 +1,33 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  let x_28 : f32 = x_6.one;
+  f = (4.0 / (2.0 * x_28));
+  let x_31 : f32 = f;
+  let x_33 : f32 = f;
+  if (((x_31 > 1.899999976) && (x_33 < 2.099999905))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-div-mul/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-div-mul/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..d20ee0a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-div-mul/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,34 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float f = 0.0f;
+  const float x_28 = asfloat(x_6[0].x);
+  f = (4.0f / (2.0f * x_28));
+  bool tint_tmp = (f > 1.899999976f);
+  if (tint_tmp) {
+    tint_tmp = (f < 2.099999905f);
+  }
+  if ((tint_tmp)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-div-mul/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-div-mul/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..b807292
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-div-mul/0-opt.wgsl.expected.msl
@@ -0,0 +1,35 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float f = 0.0f;
+  float const x_28 = x_6.one;
+  f = (4.0f / (2.0f * x_28));
+  float const x_31 = f;
+  float const x_33 = f;
+  if (((x_31 > 1.899999976f) && (x_33 < 2.099999905f))) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-div-mul/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-div-mul/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..056fe41
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-div-mul/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,100 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 56
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %17 = OpConstantNull %float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_4 = OpConstant %float 4
+    %float_2 = OpConstant %float 2
+%float_1_89999998 = OpConstant %float 1.89999998
+       %bool = OpTypeBool
+%float_2_0999999 = OpConstant %float 2.0999999
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %42 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %43 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %44 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %17
+         %21 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0
+         %22 = OpLoad %float %21
+         %25 = OpFMul %float %float_2 %22
+         %26 = OpFDiv %float %float_4 %25
+               OpStore %f %26
+         %27 = OpLoad %float %f
+         %28 = OpLoad %float %f
+         %30 = OpFOrdGreaterThan %bool %27 %float_1_89999998
+               OpSelectionMerge %32 None
+               OpBranchConditional %30 %33 %32
+         %33 = OpLabel
+         %35 = OpFOrdLessThan %bool %28 %float_2_0999999
+               OpBranch %32
+         %32 = OpLabel
+         %36 = OpPhi %bool %30 %14 %35 %33
+               OpSelectionMerge %37 None
+               OpBranchConditional %36 %38 %39
+         %38 = OpLabel
+               OpStore %x_GLF_color %42
+               OpBranch %37
+         %39 = OpLabel
+               OpStore %x_GLF_color %43
+               OpBranch %37
+         %37 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %44
+%tint_symbol = OpFunctionParameter %main_out
+         %48 = OpLabel
+         %49 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %49
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %51 = OpLabel
+         %52 = OpFunctionCall %void %main_1
+         %54 = OpLoad %v4float %x_GLF_color
+         %55 = OpCompositeConstruct %main_out %54
+         %53 = OpFunctionCall %void %tint_symbol_2 %55
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-div-mul/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-div-mul/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..5b77b48
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-div-mul/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,33 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  let x_28 : f32 = x_6.one;
+  f = (4.0 / (2.0 * x_28));
+  let x_31 : f32 = f;
+  let x_33 : f32 = f;
+  if (((x_31 > 1.899999976) && (x_33 < 2.099999905))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-divs/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-divs/0-opt.spvasm
new file mode 100644
index 0000000..d57d2f7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-divs/0-opt.spvasm
@@ -0,0 +1,62 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "four"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_2 = OpConstant %float 2
+    %float_1 = OpConstant %float 1
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%float_7_9000001 = OpConstant %float 7.9000001
+       %bool = OpTypeBool
+%float_8_10000038 = OpConstant %float 8.10000038
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %23 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %24 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %8
+         %25 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function
+         %26 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %27 = OpLoad %float %26
+         %28 = OpFDiv %float %float_1 %27
+         %29 = OpFDiv %float %float_2 %28
+               OpStore %a %29
+         %30 = OpLoad %float %a
+         %31 = OpFOrdGreaterThan %bool %30 %float_7_9000001
+         %32 = OpLoad %float %a
+         %33 = OpFOrdLessThan %bool %32 %float_8_10000038
+         %34 = OpLogicalAnd %bool %31 %33
+               OpSelectionMerge %35 None
+               OpBranchConditional %34 %36 %37
+         %36 = OpLabel
+               OpStore %_GLF_color %23
+               OpBranch %35
+         %37 = OpLabel
+               OpStore %_GLF_color %24
+               OpBranch %35
+         %35 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-divs/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-divs/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..1b0d83d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-divs/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,34 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float a = 0.0f;
+  const float x_27 = asfloat(x_6[0].x);
+  a = (2.0f / (1.0f / x_27));
+  bool tint_tmp = (a > 7.900000095f);
+  if (tint_tmp) {
+    tint_tmp = (a < 8.100000381f);
+  }
+  if ((tint_tmp)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-divs/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-divs/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..21d1062
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-divs/0-opt.spvasm.expected.msl
@@ -0,0 +1,35 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float four;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float a = 0.0f;
+  float const x_27 = x_6.four;
+  a = (2.0f / (1.0f / x_27));
+  float const x_30 = a;
+  float const x_32 = a;
+  if (((x_30 > 7.900000095f) && (x_32 < 8.100000381f))) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-divs/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-divs/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..595ed70
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-divs/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,99 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 55
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "four"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %17 = OpConstantNull %float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_2 = OpConstant %float 2
+    %float_1 = OpConstant %float 1
+%float_7_9000001 = OpConstant %float 7.9000001
+       %bool = OpTypeBool
+%float_8_10000038 = OpConstant %float 8.10000038
+    %float_0 = OpConstant %float 0
+         %41 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %42 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %43 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function %17
+         %21 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0
+         %22 = OpLoad %float %21
+         %25 = OpFDiv %float %float_1 %22
+         %26 = OpFDiv %float %float_2 %25
+               OpStore %a %26
+         %27 = OpLoad %float %a
+         %28 = OpLoad %float %a
+         %30 = OpFOrdGreaterThan %bool %27 %float_7_9000001
+               OpSelectionMerge %32 None
+               OpBranchConditional %30 %33 %32
+         %33 = OpLabel
+         %35 = OpFOrdLessThan %bool %28 %float_8_10000038
+               OpBranch %32
+         %32 = OpLabel
+         %36 = OpPhi %bool %30 %14 %35 %33
+               OpSelectionMerge %37 None
+               OpBranchConditional %36 %38 %39
+         %38 = OpLabel
+               OpStore %x_GLF_color %41
+               OpBranch %37
+         %39 = OpLabel
+               OpStore %x_GLF_color %42
+               OpBranch %37
+         %37 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %43
+%tint_symbol = OpFunctionParameter %main_out
+         %47 = OpLabel
+         %48 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %48
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %50 = OpLabel
+         %51 = OpFunctionCall %void %main_1
+         %53 = OpLoad %v4float %x_GLF_color
+         %54 = OpCompositeConstruct %main_out %53
+         %52 = OpFunctionCall %void %tint_symbol_2 %54
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-divs/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-divs/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..8900821
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-divs/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,33 @@
+[[block]]
+struct buf0 {
+  four : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : f32;
+  let x_27 : f32 = x_6.four;
+  a = (2.0 / (1.0 / x_27));
+  let x_30 : f32 = a;
+  let x_32 : f32 = a;
+  if (((x_30 > 7.900000095) && (x_32 < 8.100000381))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-divs/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-divs/0-opt.wgsl
new file mode 100644
index 0000000..8900821
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-divs/0-opt.wgsl
@@ -0,0 +1,33 @@
+[[block]]
+struct buf0 {
+  four : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : f32;
+  let x_27 : f32 = x_6.four;
+  a = (2.0 / (1.0 / x_27));
+  let x_30 : f32 = a;
+  let x_32 : f32 = a;
+  if (((x_30 > 7.900000095) && (x_32 < 8.100000381))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-divs/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-divs/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..1b0d83d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-divs/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,34 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float a = 0.0f;
+  const float x_27 = asfloat(x_6[0].x);
+  a = (2.0f / (1.0f / x_27));
+  bool tint_tmp = (a > 7.900000095f);
+  if (tint_tmp) {
+    tint_tmp = (a < 8.100000381f);
+  }
+  if ((tint_tmp)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-divs/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-divs/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..21d1062
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-divs/0-opt.wgsl.expected.msl
@@ -0,0 +1,35 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float four;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float a = 0.0f;
+  float const x_27 = x_6.four;
+  a = (2.0f / (1.0f / x_27));
+  float const x_30 = a;
+  float const x_32 = a;
+  if (((x_30 > 7.900000095f) && (x_32 < 8.100000381f))) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-divs/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-divs/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..595ed70
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-divs/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,99 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 55
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "four"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %17 = OpConstantNull %float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_2 = OpConstant %float 2
+    %float_1 = OpConstant %float 1
+%float_7_9000001 = OpConstant %float 7.9000001
+       %bool = OpTypeBool
+%float_8_10000038 = OpConstant %float 8.10000038
+    %float_0 = OpConstant %float 0
+         %41 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %42 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %43 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function %17
+         %21 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0
+         %22 = OpLoad %float %21
+         %25 = OpFDiv %float %float_1 %22
+         %26 = OpFDiv %float %float_2 %25
+               OpStore %a %26
+         %27 = OpLoad %float %a
+         %28 = OpLoad %float %a
+         %30 = OpFOrdGreaterThan %bool %27 %float_7_9000001
+               OpSelectionMerge %32 None
+               OpBranchConditional %30 %33 %32
+         %33 = OpLabel
+         %35 = OpFOrdLessThan %bool %28 %float_8_10000038
+               OpBranch %32
+         %32 = OpLabel
+         %36 = OpPhi %bool %30 %14 %35 %33
+               OpSelectionMerge %37 None
+               OpBranchConditional %36 %38 %39
+         %38 = OpLabel
+               OpStore %x_GLF_color %41
+               OpBranch %37
+         %39 = OpLabel
+               OpStore %x_GLF_color %42
+               OpBranch %37
+         %37 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %43
+%tint_symbol = OpFunctionParameter %main_out
+         %47 = OpLabel
+         %48 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %48
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %50 = OpLabel
+         %51 = OpFunctionCall %void %main_1
+         %53 = OpLoad %v4float %x_GLF_color
+         %54 = OpCompositeConstruct %main_out %53
+         %52 = OpFunctionCall %void %tint_symbol_2 %54
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-divs/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-divs/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..8900821
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-divs/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,33 @@
+[[block]]
+struct buf0 {
+  four : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : f32;
+  let x_27 : f32 = x_6.four;
+  a = (2.0 / (1.0 / x_27));
+  let x_30 : f32 = a;
+  let x_32 : f32 = a;
+  if (((x_30 > 7.900000095) && (x_32 < 8.100000381))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-mul-div/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-mul-div/0-opt.spvasm
new file mode 100644
index 0000000..07d5959
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-mul-div/0-opt.spvasm
@@ -0,0 +1,63 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %f "f"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_4 = OpConstant %float 4
+    %float_2 = OpConstant %float 2
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%float_7_9000001 = OpConstant %float 7.9000001
+       %bool = OpTypeBool
+%float_8_10000038 = OpConstant %float 8.10000038
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %24 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %25 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %8
+         %26 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function
+         %27 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %28 = OpLoad %float %27
+         %29 = OpFDiv %float %float_2 %28
+         %30 = OpFMul %float %float_4 %29
+               OpStore %f %30
+         %31 = OpLoad %float %f
+         %32 = OpFOrdGreaterThan %bool %31 %float_7_9000001
+         %33 = OpLoad %float %f
+         %34 = OpFOrdLessThan %bool %33 %float_8_10000038
+         %35 = OpLogicalAnd %bool %32 %34
+               OpSelectionMerge %36 None
+               OpBranchConditional %35 %37 %38
+         %37 = OpLabel
+               OpStore %_GLF_color %24
+               OpBranch %36
+         %38 = OpLabel
+               OpStore %_GLF_color %25
+               OpBranch %36
+         %36 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-mul-div/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-mul-div/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..33b44f0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-mul-div/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,34 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float f = 0.0f;
+  const float x_28 = asfloat(x_6[0].x);
+  f = (4.0f * (2.0f / x_28));
+  bool tint_tmp = (f > 7.900000095f);
+  if (tint_tmp) {
+    tint_tmp = (f < 8.100000381f);
+  }
+  if ((tint_tmp)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-mul-div/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-mul-div/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..8ca949d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-mul-div/0-opt.spvasm.expected.msl
@@ -0,0 +1,35 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float f = 0.0f;
+  float const x_28 = x_6.one;
+  f = (4.0f * (2.0f / x_28));
+  float const x_31 = f;
+  float const x_33 = f;
+  if (((x_31 > 7.900000095f) && (x_33 < 8.100000381f))) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-mul-div/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-mul-div/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..a3e6ce2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-mul-div/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,100 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 56
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %17 = OpConstantNull %float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_4 = OpConstant %float 4
+    %float_2 = OpConstant %float 2
+%float_7_9000001 = OpConstant %float 7.9000001
+       %bool = OpTypeBool
+%float_8_10000038 = OpConstant %float 8.10000038
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %42 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %43 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %44 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %17
+         %21 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0
+         %22 = OpLoad %float %21
+         %25 = OpFDiv %float %float_2 %22
+         %26 = OpFMul %float %float_4 %25
+               OpStore %f %26
+         %27 = OpLoad %float %f
+         %28 = OpLoad %float %f
+         %30 = OpFOrdGreaterThan %bool %27 %float_7_9000001
+               OpSelectionMerge %32 None
+               OpBranchConditional %30 %33 %32
+         %33 = OpLabel
+         %35 = OpFOrdLessThan %bool %28 %float_8_10000038
+               OpBranch %32
+         %32 = OpLabel
+         %36 = OpPhi %bool %30 %14 %35 %33
+               OpSelectionMerge %37 None
+               OpBranchConditional %36 %38 %39
+         %38 = OpLabel
+               OpStore %x_GLF_color %42
+               OpBranch %37
+         %39 = OpLabel
+               OpStore %x_GLF_color %43
+               OpBranch %37
+         %37 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %44
+%tint_symbol = OpFunctionParameter %main_out
+         %48 = OpLabel
+         %49 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %49
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %51 = OpLabel
+         %52 = OpFunctionCall %void %main_1
+         %54 = OpLoad %v4float %x_GLF_color
+         %55 = OpCompositeConstruct %main_out %54
+         %53 = OpFunctionCall %void %tint_symbol_2 %55
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-mul-div/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-mul-div/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..fd79096
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-mul-div/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,33 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  let x_28 : f32 = x_6.one;
+  f = (4.0 * (2.0 / x_28));
+  let x_31 : f32 = f;
+  let x_33 : f32 = f;
+  if (((x_31 > 7.900000095) && (x_33 < 8.100000381))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-mul-div/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-mul-div/0-opt.wgsl
new file mode 100644
index 0000000..fd79096
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-mul-div/0-opt.wgsl
@@ -0,0 +1,33 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  let x_28 : f32 = x_6.one;
+  f = (4.0 * (2.0 / x_28));
+  let x_31 : f32 = f;
+  let x_33 : f32 = f;
+  if (((x_31 > 7.900000095) && (x_33 < 8.100000381))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-mul-div/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-mul-div/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..33b44f0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-mul-div/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,34 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float f = 0.0f;
+  const float x_28 = asfloat(x_6[0].x);
+  f = (4.0f * (2.0f / x_28));
+  bool tint_tmp = (f > 7.900000095f);
+  if (tint_tmp) {
+    tint_tmp = (f < 8.100000381f);
+  }
+  if ((tint_tmp)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-mul-div/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-mul-div/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..8ca949d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-mul-div/0-opt.wgsl.expected.msl
@@ -0,0 +1,35 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float f = 0.0f;
+  float const x_28 = x_6.one;
+  f = (4.0f * (2.0f / x_28));
+  float const x_31 = f;
+  float const x_33 = f;
+  if (((x_31 > 7.900000095f) && (x_33 < 8.100000381f))) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-mul-div/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-mul-div/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..a3e6ce2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-mul-div/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,100 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 56
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %17 = OpConstantNull %float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_4 = OpConstant %float 4
+    %float_2 = OpConstant %float 2
+%float_7_9000001 = OpConstant %float 7.9000001
+       %bool = OpTypeBool
+%float_8_10000038 = OpConstant %float 8.10000038
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %42 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %43 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %44 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %17
+         %21 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0
+         %22 = OpLoad %float %21
+         %25 = OpFDiv %float %float_2 %22
+         %26 = OpFMul %float %float_4 %25
+               OpStore %f %26
+         %27 = OpLoad %float %f
+         %28 = OpLoad %float %f
+         %30 = OpFOrdGreaterThan %bool %27 %float_7_9000001
+               OpSelectionMerge %32 None
+               OpBranchConditional %30 %33 %32
+         %33 = OpLabel
+         %35 = OpFOrdLessThan %bool %28 %float_8_10000038
+               OpBranch %32
+         %32 = OpLabel
+         %36 = OpPhi %bool %30 %14 %35 %33
+               OpSelectionMerge %37 None
+               OpBranchConditional %36 %38 %39
+         %38 = OpLabel
+               OpStore %x_GLF_color %42
+               OpBranch %37
+         %39 = OpLabel
+               OpStore %x_GLF_color %43
+               OpBranch %37
+         %37 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %44
+%tint_symbol = OpFunctionParameter %main_out
+         %48 = OpLabel
+         %49 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %49
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %51 = OpLabel
+         %52 = OpFunctionCall %void %main_1
+         %54 = OpLoad %v4float %x_GLF_color
+         %55 = OpCompositeConstruct %main_out %54
+         %53 = OpFunctionCall %void %tint_symbol_2 %55
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-mul-div/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-mul-div/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..fd79096
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-mul-div/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,33 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  let x_28 : f32 = x_6.one;
+  f = (4.0 * (2.0 / x_28));
+  let x_31 : f32 = f;
+  let x_33 : f32 = f;
+  if (((x_31 > 7.900000095) && (x_33 < 8.100000381))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-add/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-add/0-opt.spvasm
new file mode 100644
index 0000000..d72bc85
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-add/0-opt.spvasm
@@ -0,0 +1,85 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %b "b"
+               OpName %i "i"
+               OpName %a "a"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %i RelaxedPrecision
+               OpDecorate %7 RelaxedPrecision
+               OpDecorate %8 RelaxedPrecision
+               OpDecorate %9 RelaxedPrecision
+               OpDecorate %10 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+      %false = OpConstantFalse %bool
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+      %int_0 = OpConstant %int 0
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+    %float_0 = OpConstant %float 0
+       %true = OpConstantTrue %bool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %28 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %29 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %12
+         %30 = OpLabel
+          %b = OpVariable %_ptr_Function_bool Function
+          %i = OpVariable %_ptr_Function_int Function
+          %a = OpVariable %_ptr_Function_float Function
+               OpStore %b %false
+               OpStore %i %int_1
+               OpBranch %31
+         %31 = OpLabel
+               OpLoopMerge %32 %33 None
+               OpBranch %34
+         %34 = OpLabel
+          %7 = OpLoad %int %i
+         %35 = OpSGreaterThan %bool %7 %int_0
+               OpBranchConditional %35 %36 %32
+         %36 = OpLabel
+          %8 = OpLoad %int %i
+         %37 = OpConvertSToF %float %8
+         %38 = OpFAdd %float %float_1 %37
+               OpStore %a %38
+         %39 = OpLoad %float %a
+         %40 = OpFSub %float %float_2 %39
+         %41 = OpFOrdEqual %bool %40 %float_0
+               OpSelectionMerge %42 None
+               OpBranchConditional %41 %43 %42
+         %43 = OpLabel
+               OpStore %b %true
+               OpBranch %42
+         %42 = OpLabel
+               OpBranch %33
+         %33 = OpLabel
+          %9 = OpLoad %int %i
+         %10 = OpISub %int %9 %int_1
+               OpStore %i %10
+               OpBranch %31
+         %32 = OpLabel
+         %44 = OpLoad %bool %b
+               OpSelectionMerge %45 None
+               OpBranchConditional %44 %46 %47
+         %46 = OpLabel
+               OpStore %_GLF_color %28
+               OpBranch %45
+         %47 = OpLabel
+               OpStore %_GLF_color %29
+               OpBranch %45
+         %45 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-add/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-add/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..e718661
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-add/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,37 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  bool b = false;
+  int i = 0;
+  float a = 0.0f;
+  b = false;
+  i = 1;
+  {
+    for(; (i > 0); i = (i - 1)) {
+      a = (1.0f + float(i));
+      if (((2.0f - a) == 0.0f)) {
+        b = true;
+      }
+    }
+  }
+  if (b) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-add/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-add/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..1392c3b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-add/0-opt.spvasm.expected.msl
@@ -0,0 +1,50 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  bool b = false;
+  int i = 0;
+  float a = 0.0f;
+  b = false;
+  i = 1;
+  while (true) {
+    int const x_7 = i;
+    if ((x_7 > 0)) {
+    } else {
+      break;
+    }
+    int const x_8 = i;
+    a = (1.0f + float(x_8));
+    float const x_39 = a;
+    if (((2.0f - x_39) == 0.0f)) {
+      b = true;
+    }
+    {
+      int const x_9 = i;
+      i = (x_9 - 1);
+    }
+  }
+  bool const x_44 = b;
+  if (x_44) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-add/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-add/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..8756e12
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-add/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,118 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 67
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %b "b"
+               OpName %i "i"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %15 = OpConstantNull %bool
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %19 = OpConstantNull %int
+%_ptr_Function_float = OpTypePointer Function %float
+         %22 = OpConstantNull %float
+      %false = OpConstantFalse %bool
+      %int_1 = OpConstant %int 1
+      %int_0 = OpConstant %int 0
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+    %float_0 = OpConstant %float 0
+       %true = OpConstantTrue %bool
+         %53 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %54 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %55 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %b = OpVariable %_ptr_Function_bool Function %15
+          %i = OpVariable %_ptr_Function_int Function %19
+          %a = OpVariable %_ptr_Function_float Function %22
+               OpStore %b %false
+               OpStore %i %int_1
+               OpBranch %25
+         %25 = OpLabel
+               OpLoopMerge %26 %27 None
+               OpBranch %28
+         %28 = OpLabel
+         %29 = OpLoad %int %i
+         %31 = OpSGreaterThan %bool %29 %int_0
+               OpSelectionMerge %32 None
+               OpBranchConditional %31 %33 %34
+         %33 = OpLabel
+               OpBranch %32
+         %34 = OpLabel
+               OpBranch %26
+         %32 = OpLabel
+         %35 = OpLoad %int %i
+         %37 = OpConvertSToF %float %35
+         %38 = OpFAdd %float %float_1 %37
+               OpStore %a %38
+         %39 = OpLoad %float %a
+         %41 = OpFSub %float %float_2 %39
+         %43 = OpFOrdEqual %bool %41 %float_0
+               OpSelectionMerge %44 None
+               OpBranchConditional %43 %45 %44
+         %45 = OpLabel
+               OpStore %b %true
+               OpBranch %44
+         %44 = OpLabel
+               OpBranch %27
+         %27 = OpLabel
+         %47 = OpLoad %int %i
+         %48 = OpISub %int %47 %int_1
+               OpStore %i %48
+               OpBranch %25
+         %26 = OpLabel
+         %49 = OpLoad %bool %b
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %52
+         %51 = OpLabel
+               OpStore %x_GLF_color %53
+               OpBranch %50
+         %52 = OpLabel
+               OpStore %x_GLF_color %54
+               OpBranch %50
+         %50 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %55
+%tint_symbol = OpFunctionParameter %main_out
+         %59 = OpLabel
+         %60 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %60
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %62 = OpLabel
+         %63 = OpFunctionCall %void %main_1
+         %65 = OpLoad %v4float %x_GLF_color
+         %66 = OpCompositeConstruct %main_out %65
+         %64 = OpFunctionCall %void %tint_symbol_2 %66
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-add/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-add/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..99ec59a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-add/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,45 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var b : bool;
+  var i : i32;
+  var a : f32;
+  b = false;
+  i = 1;
+  loop {
+    let x_7 : i32 = i;
+    if ((x_7 > 0)) {
+    } else {
+      break;
+    }
+    let x_8 : i32 = i;
+    a = (1.0 + f32(x_8));
+    let x_39 : f32 = a;
+    if (((2.0 - x_39) == 0.0)) {
+      b = true;
+    }
+
+    continuing {
+      let x_9 : i32 = i;
+      i = (x_9 - 1);
+    }
+  }
+  let x_44 : bool = b;
+  if (x_44) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-add/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-add/0-opt.wgsl
new file mode 100644
index 0000000..99ec59a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-add/0-opt.wgsl
@@ -0,0 +1,45 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var b : bool;
+  var i : i32;
+  var a : f32;
+  b = false;
+  i = 1;
+  loop {
+    let x_7 : i32 = i;
+    if ((x_7 > 0)) {
+    } else {
+      break;
+    }
+    let x_8 : i32 = i;
+    a = (1.0 + f32(x_8));
+    let x_39 : f32 = a;
+    if (((2.0 - x_39) == 0.0)) {
+      b = true;
+    }
+
+    continuing {
+      let x_9 : i32 = i;
+      i = (x_9 - 1);
+    }
+  }
+  let x_44 : bool = b;
+  if (x_44) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-add/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-add/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..e718661
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-add/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,37 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  bool b = false;
+  int i = 0;
+  float a = 0.0f;
+  b = false;
+  i = 1;
+  {
+    for(; (i > 0); i = (i - 1)) {
+      a = (1.0f + float(i));
+      if (((2.0f - a) == 0.0f)) {
+        b = true;
+      }
+    }
+  }
+  if (b) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-add/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-add/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..1392c3b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-add/0-opt.wgsl.expected.msl
@@ -0,0 +1,50 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  bool b = false;
+  int i = 0;
+  float a = 0.0f;
+  b = false;
+  i = 1;
+  while (true) {
+    int const x_7 = i;
+    if ((x_7 > 0)) {
+    } else {
+      break;
+    }
+    int const x_8 = i;
+    a = (1.0f + float(x_8));
+    float const x_39 = a;
+    if (((2.0f - x_39) == 0.0f)) {
+      b = true;
+    }
+    {
+      int const x_9 = i;
+      i = (x_9 - 1);
+    }
+  }
+  bool const x_44 = b;
+  if (x_44) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-add/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-add/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..8756e12
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-add/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,118 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 67
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %b "b"
+               OpName %i "i"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %15 = OpConstantNull %bool
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %19 = OpConstantNull %int
+%_ptr_Function_float = OpTypePointer Function %float
+         %22 = OpConstantNull %float
+      %false = OpConstantFalse %bool
+      %int_1 = OpConstant %int 1
+      %int_0 = OpConstant %int 0
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+    %float_0 = OpConstant %float 0
+       %true = OpConstantTrue %bool
+         %53 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %54 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %55 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %b = OpVariable %_ptr_Function_bool Function %15
+          %i = OpVariable %_ptr_Function_int Function %19
+          %a = OpVariable %_ptr_Function_float Function %22
+               OpStore %b %false
+               OpStore %i %int_1
+               OpBranch %25
+         %25 = OpLabel
+               OpLoopMerge %26 %27 None
+               OpBranch %28
+         %28 = OpLabel
+         %29 = OpLoad %int %i
+         %31 = OpSGreaterThan %bool %29 %int_0
+               OpSelectionMerge %32 None
+               OpBranchConditional %31 %33 %34
+         %33 = OpLabel
+               OpBranch %32
+         %34 = OpLabel
+               OpBranch %26
+         %32 = OpLabel
+         %35 = OpLoad %int %i
+         %37 = OpConvertSToF %float %35
+         %38 = OpFAdd %float %float_1 %37
+               OpStore %a %38
+         %39 = OpLoad %float %a
+         %41 = OpFSub %float %float_2 %39
+         %43 = OpFOrdEqual %bool %41 %float_0
+               OpSelectionMerge %44 None
+               OpBranchConditional %43 %45 %44
+         %45 = OpLabel
+               OpStore %b %true
+               OpBranch %44
+         %44 = OpLabel
+               OpBranch %27
+         %27 = OpLabel
+         %47 = OpLoad %int %i
+         %48 = OpISub %int %47 %int_1
+               OpStore %i %48
+               OpBranch %25
+         %26 = OpLabel
+         %49 = OpLoad %bool %b
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %52
+         %51 = OpLabel
+               OpStore %x_GLF_color %53
+               OpBranch %50
+         %52 = OpLabel
+               OpStore %x_GLF_color %54
+               OpBranch %50
+         %50 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %55
+%tint_symbol = OpFunctionParameter %main_out
+         %59 = OpLabel
+         %60 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %60
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %62 = OpLabel
+         %63 = OpFunctionCall %void %main_1
+         %65 = OpLoad %v4float %x_GLF_color
+         %66 = OpCompositeConstruct %main_out %65
+         %64 = OpFunctionCall %void %tint_symbol_2 %66
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-add/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-add/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..99ec59a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-add/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,45 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var b : bool;
+  var i : i32;
+  var a : f32;
+  b = false;
+  i = 1;
+  loop {
+    let x_7 : i32 = i;
+    if ((x_7 > 0)) {
+    } else {
+      break;
+    }
+    let x_8 : i32 = i;
+    a = (1.0 + f32(x_8));
+    let x_39 : f32 = a;
+    if (((2.0 - x_39) == 0.0)) {
+      b = true;
+    }
+
+    continuing {
+      let x_9 : i32 = i;
+      i = (x_9 - 1);
+    }
+  }
+  let x_44 : bool = b;
+  if (x_44) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-sub/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-sub/0-opt.spvasm
new file mode 100644
index 0000000..966e0fc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-sub/0-opt.spvasm
@@ -0,0 +1,86 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %b "b"
+               OpName %i "i"
+               OpName %a "a"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %i RelaxedPrecision
+               OpDecorate %7 RelaxedPrecision
+               OpDecorate %8 RelaxedPrecision
+               OpDecorate %9 RelaxedPrecision
+               OpDecorate %10 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+      %false = OpConstantFalse %bool
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+      %int_0 = OpConstant %int 0
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_3 = OpConstant %float 3
+    %float_2 = OpConstant %float 2
+    %float_0 = OpConstant %float 0
+       %true = OpConstantTrue %bool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+         %29 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %30 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %12
+         %31 = OpLabel
+          %b = OpVariable %_ptr_Function_bool Function
+          %i = OpVariable %_ptr_Function_int Function
+          %a = OpVariable %_ptr_Function_float Function
+               OpStore %b %false
+               OpStore %i %int_1
+               OpBranch %32
+         %32 = OpLabel
+               OpLoopMerge %33 %34 None
+               OpBranch %35
+         %35 = OpLabel
+          %7 = OpLoad %int %i
+         %36 = OpSGreaterThan %bool %7 %int_0
+               OpBranchConditional %36 %37 %33
+         %37 = OpLabel
+          %8 = OpLoad %int %i
+         %38 = OpConvertSToF %float %8
+         %39 = OpFSub %float %float_3 %38
+               OpStore %a %39
+         %40 = OpLoad %float %a
+         %41 = OpFSub %float %float_2 %40
+         %42 = OpFOrdEqual %bool %41 %float_0
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %43
+         %44 = OpLabel
+               OpStore %b %true
+               OpBranch %43
+         %43 = OpLabel
+               OpBranch %34
+         %34 = OpLabel
+          %9 = OpLoad %int %i
+         %10 = OpISub %int %9 %int_1
+               OpStore %i %10
+               OpBranch %32
+         %33 = OpLabel
+         %45 = OpLoad %bool %b
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %48
+         %47 = OpLabel
+               OpStore %_GLF_color %29
+               OpBranch %46
+         %48 = OpLabel
+               OpStore %_GLF_color %30
+               OpBranch %46
+         %46 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-sub/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-sub/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..a2804a2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-sub/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,37 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  bool b = false;
+  int i = 0;
+  float a = 0.0f;
+  b = false;
+  i = 1;
+  {
+    for(; (i > 0); i = (i - 1)) {
+      a = (3.0f - float(i));
+      if (((2.0f - a) == 0.0f)) {
+        b = true;
+      }
+    }
+  }
+  if (b) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-sub/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-sub/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..c2559b6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-sub/0-opt.spvasm.expected.msl
@@ -0,0 +1,50 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  bool b = false;
+  int i = 0;
+  float a = 0.0f;
+  b = false;
+  i = 1;
+  while (true) {
+    int const x_7 = i;
+    if ((x_7 > 0)) {
+    } else {
+      break;
+    }
+    int const x_8 = i;
+    a = (3.0f - float(x_8));
+    float const x_40 = a;
+    if (((2.0f - x_40) == 0.0f)) {
+      b = true;
+    }
+    {
+      int const x_9 = i;
+      i = (x_9 - 1);
+    }
+  }
+  bool const x_45 = b;
+  if (x_45) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-sub/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-sub/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..2c915e9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-sub/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,119 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 68
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %b "b"
+               OpName %i "i"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %15 = OpConstantNull %bool
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %19 = OpConstantNull %int
+%_ptr_Function_float = OpTypePointer Function %float
+         %22 = OpConstantNull %float
+      %false = OpConstantFalse %bool
+      %int_1 = OpConstant %int 1
+      %int_0 = OpConstant %int 0
+    %float_3 = OpConstant %float 3
+    %float_2 = OpConstant %float 2
+    %float_0 = OpConstant %float 0
+       %true = OpConstantTrue %bool
+    %float_1 = OpConstant %float 1
+         %54 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %55 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %56 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %b = OpVariable %_ptr_Function_bool Function %15
+          %i = OpVariable %_ptr_Function_int Function %19
+          %a = OpVariable %_ptr_Function_float Function %22
+               OpStore %b %false
+               OpStore %i %int_1
+               OpBranch %25
+         %25 = OpLabel
+               OpLoopMerge %26 %27 None
+               OpBranch %28
+         %28 = OpLabel
+         %29 = OpLoad %int %i
+         %31 = OpSGreaterThan %bool %29 %int_0
+               OpSelectionMerge %32 None
+               OpBranchConditional %31 %33 %34
+         %33 = OpLabel
+               OpBranch %32
+         %34 = OpLabel
+               OpBranch %26
+         %32 = OpLabel
+         %35 = OpLoad %int %i
+         %37 = OpConvertSToF %float %35
+         %38 = OpFSub %float %float_3 %37
+               OpStore %a %38
+         %39 = OpLoad %float %a
+         %41 = OpFSub %float %float_2 %39
+         %43 = OpFOrdEqual %bool %41 %float_0
+               OpSelectionMerge %44 None
+               OpBranchConditional %43 %45 %44
+         %45 = OpLabel
+               OpStore %b %true
+               OpBranch %44
+         %44 = OpLabel
+               OpBranch %27
+         %27 = OpLabel
+         %47 = OpLoad %int %i
+         %48 = OpISub %int %47 %int_1
+               OpStore %i %48
+               OpBranch %25
+         %26 = OpLabel
+         %49 = OpLoad %bool %b
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %52
+         %51 = OpLabel
+               OpStore %x_GLF_color %54
+               OpBranch %50
+         %52 = OpLabel
+               OpStore %x_GLF_color %55
+               OpBranch %50
+         %50 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %56
+%tint_symbol = OpFunctionParameter %main_out
+         %60 = OpLabel
+         %61 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %61
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %63 = OpLabel
+         %64 = OpFunctionCall %void %main_1
+         %66 = OpLoad %v4float %x_GLF_color
+         %67 = OpCompositeConstruct %main_out %66
+         %65 = OpFunctionCall %void %tint_symbol_2 %67
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-sub/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-sub/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..44ac190
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-sub/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,45 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var b : bool;
+  var i : i32;
+  var a : f32;
+  b = false;
+  i = 1;
+  loop {
+    let x_7 : i32 = i;
+    if ((x_7 > 0)) {
+    } else {
+      break;
+    }
+    let x_8 : i32 = i;
+    a = (3.0 - f32(x_8));
+    let x_40 : f32 = a;
+    if (((2.0 - x_40) == 0.0)) {
+      b = true;
+    }
+
+    continuing {
+      let x_9 : i32 = i;
+      i = (x_9 - 1);
+    }
+  }
+  let x_45 : bool = b;
+  if (x_45) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-sub/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-sub/0-opt.wgsl
new file mode 100644
index 0000000..44ac190
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-sub/0-opt.wgsl
@@ -0,0 +1,45 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var b : bool;
+  var i : i32;
+  var a : f32;
+  b = false;
+  i = 1;
+  loop {
+    let x_7 : i32 = i;
+    if ((x_7 > 0)) {
+    } else {
+      break;
+    }
+    let x_8 : i32 = i;
+    a = (3.0 - f32(x_8));
+    let x_40 : f32 = a;
+    if (((2.0 - x_40) == 0.0)) {
+      b = true;
+    }
+
+    continuing {
+      let x_9 : i32 = i;
+      i = (x_9 - 1);
+    }
+  }
+  let x_45 : bool = b;
+  if (x_45) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-sub/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-sub/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..a2804a2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-sub/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,37 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  bool b = false;
+  int i = 0;
+  float a = 0.0f;
+  b = false;
+  i = 1;
+  {
+    for(; (i > 0); i = (i - 1)) {
+      a = (3.0f - float(i));
+      if (((2.0f - a) == 0.0f)) {
+        b = true;
+      }
+    }
+  }
+  if (b) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-sub/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-sub/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..c2559b6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-sub/0-opt.wgsl.expected.msl
@@ -0,0 +1,50 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  bool b = false;
+  int i = 0;
+  float a = 0.0f;
+  b = false;
+  i = 1;
+  while (true) {
+    int const x_7 = i;
+    if ((x_7 > 0)) {
+    } else {
+      break;
+    }
+    int const x_8 = i;
+    a = (3.0f - float(x_8));
+    float const x_40 = a;
+    if (((2.0f - x_40) == 0.0f)) {
+      b = true;
+    }
+    {
+      int const x_9 = i;
+      i = (x_9 - 1);
+    }
+  }
+  bool const x_45 = b;
+  if (x_45) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-sub/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-sub/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..2c915e9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-sub/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,119 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 68
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %b "b"
+               OpName %i "i"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %15 = OpConstantNull %bool
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %19 = OpConstantNull %int
+%_ptr_Function_float = OpTypePointer Function %float
+         %22 = OpConstantNull %float
+      %false = OpConstantFalse %bool
+      %int_1 = OpConstant %int 1
+      %int_0 = OpConstant %int 0
+    %float_3 = OpConstant %float 3
+    %float_2 = OpConstant %float 2
+    %float_0 = OpConstant %float 0
+       %true = OpConstantTrue %bool
+    %float_1 = OpConstant %float 1
+         %54 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %55 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %56 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %b = OpVariable %_ptr_Function_bool Function %15
+          %i = OpVariable %_ptr_Function_int Function %19
+          %a = OpVariable %_ptr_Function_float Function %22
+               OpStore %b %false
+               OpStore %i %int_1
+               OpBranch %25
+         %25 = OpLabel
+               OpLoopMerge %26 %27 None
+               OpBranch %28
+         %28 = OpLabel
+         %29 = OpLoad %int %i
+         %31 = OpSGreaterThan %bool %29 %int_0
+               OpSelectionMerge %32 None
+               OpBranchConditional %31 %33 %34
+         %33 = OpLabel
+               OpBranch %32
+         %34 = OpLabel
+               OpBranch %26
+         %32 = OpLabel
+         %35 = OpLoad %int %i
+         %37 = OpConvertSToF %float %35
+         %38 = OpFSub %float %float_3 %37
+               OpStore %a %38
+         %39 = OpLoad %float %a
+         %41 = OpFSub %float %float_2 %39
+         %43 = OpFOrdEqual %bool %41 %float_0
+               OpSelectionMerge %44 None
+               OpBranchConditional %43 %45 %44
+         %45 = OpLabel
+               OpStore %b %true
+               OpBranch %44
+         %44 = OpLabel
+               OpBranch %27
+         %27 = OpLabel
+         %47 = OpLoad %int %i
+         %48 = OpISub %int %47 %int_1
+               OpStore %i %48
+               OpBranch %25
+         %26 = OpLabel
+         %49 = OpLoad %bool %b
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %52
+         %51 = OpLabel
+               OpStore %x_GLF_color %54
+               OpBranch %50
+         %52 = OpLabel
+               OpStore %x_GLF_color %55
+               OpBranch %50
+         %50 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %56
+%tint_symbol = OpFunctionParameter %main_out
+         %60 = OpLabel
+         %61 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %61
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %63 = OpLabel
+         %64 = OpFunctionCall %void %main_1
+         %66 = OpLoad %v4float %x_GLF_color
+         %67 = OpCompositeConstruct %main_out %66
+         %65 = OpFunctionCall %void %tint_symbol_2 %67
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-sub/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-sub/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..44ac190
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-sub-sub/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,45 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var b : bool;
+  var i : i32;
+  var a : f32;
+  b = false;
+  i = 1;
+  loop {
+    let x_7 : i32 = i;
+    if ((x_7 > 0)) {
+    } else {
+      break;
+    }
+    let x_8 : i32 = i;
+    a = (3.0 - f32(x_8));
+    let x_40 : f32 = a;
+    if (((2.0 - x_40) == 0.0)) {
+      b = true;
+    }
+
+    continuing {
+      let x_9 : i32 = i;
+      i = (x_9 - 1);
+    }
+  }
+  let x_45 : bool = b;
+  if (x_45) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-var-sub/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-var-sub/0-opt.spvasm
new file mode 100644
index 0000000..eebf568
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-var-sub/0-opt.spvasm
@@ -0,0 +1,75 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %i "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "five"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+     %int_n1 = OpConstant %int -1
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %22 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %23 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %8
+         %24 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+         %25 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %26 = OpLoad %int %25
+               OpStore %i %26
+               OpBranch %27
+         %27 = OpLabel
+               OpLoopMerge %28 %29 None
+               OpBranch %30
+         %30 = OpLabel
+         %31 = OpLoad %int %i
+         %32 = OpSGreaterThan %bool %31 %int_0
+               OpBranchConditional %32 %33 %28
+         %33 = OpLabel
+         %34 = OpLoad %int %i
+         %35 = OpISub %int %34 %int_1
+               OpStore %i %35
+         %36 = OpLoad %int %i
+         %37 = OpISub %int %36 %int_1
+               OpStore %i %37
+               OpBranch %29
+         %29 = OpLabel
+               OpBranch %27
+         %28 = OpLabel
+         %38 = OpLoad %int %i
+         %39 = OpIEqual %bool %38 %int_n1
+               OpSelectionMerge %40 None
+               OpBranchConditional %39 %41 %42
+         %41 = OpLabel
+               OpStore %_GLF_color %22
+               OpBranch %40
+         %42 = OpLabel
+               OpStore %_GLF_color %23
+               OpBranch %40
+         %40 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-var-sub/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-var-sub/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..b852869
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-var-sub/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,38 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int i = 0;
+  const int x_26 = asint(x_6[0].x);
+  i = x_26;
+  while (true) {
+    if ((i > 0)) {
+    } else {
+      break;
+    }
+    i = (i - 1);
+    i = (i - 1);
+  }
+  if ((i == -1)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-var-sub/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-var-sub/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..9138eca
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-var-sub/0-opt.spvasm.expected.msl
@@ -0,0 +1,45 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int five;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int i = 0;
+  int const x_26 = x_6.five;
+  i = x_26;
+  while (true) {
+    int const x_31 = i;
+    if ((x_31 > 0)) {
+    } else {
+      break;
+    }
+    int const x_34 = i;
+    i = (x_34 - 1);
+    int const x_36 = i;
+    i = (x_36 - 1);
+  }
+  int const x_38 = i;
+  if ((x_38 == -1)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-var-sub/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-var-sub/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..30086d1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-var-sub/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,114 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 62
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "five"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+     %int_n1 = OpConstant %int -1
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %48 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %49 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %50 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %18
+         %22 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0
+         %23 = OpLoad %int %22
+               OpStore %i %23
+               OpBranch %24
+         %24 = OpLabel
+               OpLoopMerge %25 %26 None
+               OpBranch %27
+         %27 = OpLabel
+         %28 = OpLoad %int %i
+         %30 = OpSGreaterThan %bool %28 %int_0
+               OpSelectionMerge %32 None
+               OpBranchConditional %30 %33 %34
+         %33 = OpLabel
+               OpBranch %32
+         %34 = OpLabel
+               OpBranch %25
+         %32 = OpLabel
+         %35 = OpLoad %int %i
+         %37 = OpISub %int %35 %int_1
+               OpStore %i %37
+         %38 = OpLoad %int %i
+         %39 = OpISub %int %38 %int_1
+               OpStore %i %39
+               OpBranch %26
+         %26 = OpLabel
+               OpBranch %24
+         %25 = OpLabel
+         %40 = OpLoad %int %i
+         %42 = OpIEqual %bool %40 %int_n1
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %45
+         %44 = OpLabel
+               OpStore %x_GLF_color %48
+               OpBranch %43
+         %45 = OpLabel
+               OpStore %x_GLF_color %49
+               OpBranch %43
+         %43 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %50
+%tint_symbol = OpFunctionParameter %main_out
+         %54 = OpLabel
+         %55 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %55
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %57 = OpLabel
+         %58 = OpFunctionCall %void %main_1
+         %60 = OpLoad %v4float %x_GLF_color
+         %61 = OpCompositeConstruct %main_out %60
+         %59 = OpFunctionCall %void %tint_symbol_2 %61
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-var-sub/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-var-sub/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..b7d98c8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-var-sub/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,43 @@
+[[block]]
+struct buf0 {
+  five : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  let x_26 : i32 = x_6.five;
+  i = x_26;
+  loop {
+    let x_31 : i32 = i;
+    if ((x_31 > 0)) {
+    } else {
+      break;
+    }
+    let x_34 : i32 = i;
+    i = (x_34 - 1);
+    let x_36 : i32 = i;
+    i = (x_36 - 1);
+  }
+  let x_38 : i32 = i;
+  if ((x_38 == -1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-var-sub/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-var-sub/0-opt.wgsl
new file mode 100644
index 0000000..b7d98c8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-var-sub/0-opt.wgsl
@@ -0,0 +1,43 @@
+[[block]]
+struct buf0 {
+  five : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  let x_26 : i32 = x_6.five;
+  i = x_26;
+  loop {
+    let x_31 : i32 = i;
+    if ((x_31 > 0)) {
+    } else {
+      break;
+    }
+    let x_34 : i32 = i;
+    i = (x_34 - 1);
+    let x_36 : i32 = i;
+    i = (x_36 - 1);
+  }
+  let x_38 : i32 = i;
+  if ((x_38 == -1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-var-sub/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-var-sub/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..b852869
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-var-sub/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,38 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int i = 0;
+  const int x_26 = asint(x_6[0].x);
+  i = x_26;
+  while (true) {
+    if ((i > 0)) {
+    } else {
+      break;
+    }
+    i = (i - 1);
+    i = (i - 1);
+  }
+  if ((i == -1)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-var-sub/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-var-sub/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..9138eca
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-var-sub/0-opt.wgsl.expected.msl
@@ -0,0 +1,45 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int five;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int i = 0;
+  int const x_26 = x_6.five;
+  i = x_26;
+  while (true) {
+    int const x_31 = i;
+    if ((x_31 > 0)) {
+    } else {
+      break;
+    }
+    int const x_34 = i;
+    i = (x_34 - 1);
+    int const x_36 = i;
+    i = (x_36 - 1);
+  }
+  int const x_38 = i;
+  if ((x_38 == -1)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-var-sub/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-var-sub/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..30086d1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-var-sub/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,114 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 62
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "five"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+     %int_n1 = OpConstant %int -1
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %48 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %49 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %50 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %18
+         %22 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0
+         %23 = OpLoad %int %22
+               OpStore %i %23
+               OpBranch %24
+         %24 = OpLabel
+               OpLoopMerge %25 %26 None
+               OpBranch %27
+         %27 = OpLabel
+         %28 = OpLoad %int %i
+         %30 = OpSGreaterThan %bool %28 %int_0
+               OpSelectionMerge %32 None
+               OpBranchConditional %30 %33 %34
+         %33 = OpLabel
+               OpBranch %32
+         %34 = OpLabel
+               OpBranch %25
+         %32 = OpLabel
+         %35 = OpLoad %int %i
+         %37 = OpISub %int %35 %int_1
+               OpStore %i %37
+         %38 = OpLoad %int %i
+         %39 = OpISub %int %38 %int_1
+               OpStore %i %39
+               OpBranch %26
+         %26 = OpLabel
+               OpBranch %24
+         %25 = OpLabel
+         %40 = OpLoad %int %i
+         %42 = OpIEqual %bool %40 %int_n1
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %45
+         %44 = OpLabel
+               OpStore %x_GLF_color %48
+               OpBranch %43
+         %45 = OpLabel
+               OpStore %x_GLF_color %49
+               OpBranch %43
+         %43 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %50
+%tint_symbol = OpFunctionParameter %main_out
+         %54 = OpLabel
+         %55 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %55
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %57 = OpLabel
+         %58 = OpFunctionCall %void %main_1
+         %60 = OpLoad %v4float %x_GLF_color
+         %61 = OpCompositeConstruct %main_out %60
+         %59 = OpFunctionCall %void %tint_symbol_2 %61
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-var-sub/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-var-sub/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..b7d98c8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-var-sub/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,43 @@
+[[block]]
+struct buf0 {
+  five : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  let x_26 : i32 = x_6.five;
+  i = x_26;
+  loop {
+    let x_31 : i32 = i;
+    if ((x_31 > 0)) {
+    } else {
+      break;
+    }
+    let x_34 : i32 = i;
+    i = (x_34 - 1);
+    let x_36 : i32 = i;
+    i = (x_36 - 1);
+  }
+  let x_38 : i32 = i;
+  if ((x_38 == -1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-mix-uniform-weight/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-mix-uniform-weight/0-opt.spvasm
new file mode 100644
index 0000000..8bdc7b1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-mix-uniform-weight/0-opt.spvasm
@@ -0,0 +1,75 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %v "v"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %_ ""
+               OpName %d "d"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+    %float_5 = OpConstant %float 5
+    %float_8 = OpConstant %float 8
+%float_n12_1999998 = OpConstant %float -12.1999998
+         %16 = OpConstantComposite %v3float %float_5 %float_8 %float_n12_1999998
+    %float_1 = OpConstant %float 1
+%float_4_9000001 = OpConstant %float 4.9000001
+%float_n2_0999999 = OpConstant %float -2.0999999
+         %20 = OpConstantComposite %v3float %float_1 %float_4_9000001 %float_n2_0999999
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_float = OpTypePointer Function %float
+%float_0_100000001 = OpConstant %float 0.100000001
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+    %float_0 = OpConstant %float 0
+         %33 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %9
+         %34 = OpLabel
+          %v = OpVariable %_ptr_Function_v3float Function
+          %d = OpVariable %_ptr_Function_float Function
+         %35 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %36 = OpLoad %float %35
+         %37 = OpCompositeConstruct %v3float %36 %36 %36
+         %38 = OpExtInst %v3float %1 FMix %16 %20 %37
+               OpStore %v %38
+         %39 = OpLoad %v3float %v
+         %40 = OpExtInst %float %1 Distance %39 %20
+               OpStore %d %40
+         %41 = OpLoad %float %d
+         %42 = OpFOrdLessThan %bool %41 %float_0_100000001
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %45
+         %44 = OpLabel
+         %46 = OpAccessChain %_ptr_Function_float %v %uint_0
+         %47 = OpLoad %float %46
+         %48 = OpCompositeConstruct %v4float %47 %float_0 %float_0 %float_1
+               OpStore %_GLF_color %48
+               OpBranch %43
+         %45 = OpLabel
+               OpStore %_GLF_color %33
+               OpBranch %43
+         %43 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-mix-uniform-weight/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-mix-uniform-weight/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..7a3d498
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-mix-uniform-weight/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,33 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float3 v = float3(0.0f, 0.0f, 0.0f);
+  float d = 0.0f;
+  const float x_36 = asfloat(x_6[0].x);
+  v = lerp(float3(5.0f, 8.0f, -12.199999809f), float3(1.0f, 4.900000095f, -2.099999905f), float3(x_36, x_36, x_36));
+  d = distance(v, float3(1.0f, 4.900000095f, -2.099999905f));
+  if ((d < 0.100000001f)) {
+    const float x_47 = v.x;
+    x_GLF_color = float4(x_47, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-mix-uniform-weight/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-mix-uniform-weight/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..02ce404
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-mix-uniform-weight/0-opt.spvasm.expected.msl
@@ -0,0 +1,38 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float3 v = 0.0f;
+  float d = 0.0f;
+  float const x_36 = x_6.one;
+  v = mix(float3(5.0f, 8.0f, -12.199999809f), float3(1.0f, 4.900000095f, -2.099999905f), float3(x_36, x_36, x_36));
+  float3 const x_39 = v;
+  d = distance(x_39, float3(1.0f, 4.900000095f, -2.099999905f));
+  float const x_41 = d;
+  if ((x_41 < 0.100000001f)) {
+    float const x_47 = v.x;
+    *(tint_symbol_4) = float4(x_47, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-mix-uniform-weight/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-mix-uniform-weight/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..0427ed3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-mix-uniform-weight/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,107 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 64
+; Schema: 0
+               OpCapability Shader
+         %28 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v "v"
+               OpName %d "d"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %18 = OpConstantNull %v3float
+%_ptr_Function_float = OpTypePointer Function %float
+         %21 = OpConstantNull %float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_5 = OpConstant %float 5
+    %float_8 = OpConstant %float 8
+%float_n12_1999998 = OpConstant %float -12.1999998
+         %32 = OpConstantComposite %v3float %float_5 %float_8 %float_n12_1999998
+    %float_1 = OpConstant %float 1
+%float_4_9000001 = OpConstant %float 4.9000001
+%float_n2_0999999 = OpConstant %float -2.0999999
+         %36 = OpConstantComposite %v3float %float_1 %float_4_9000001 %float_n2_0999999
+%float_0_100000001 = OpConstant %float 0.100000001
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+         %51 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %52 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+          %v = OpVariable %_ptr_Function_v3float Function %18
+          %d = OpVariable %_ptr_Function_float Function %21
+         %25 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0
+         %26 = OpLoad %float %25
+         %37 = OpCompositeConstruct %v3float %26 %26 %26
+         %27 = OpExtInst %v3float %28 FMix %32 %36 %37
+               OpStore %v %27
+         %38 = OpLoad %v3float %v
+         %39 = OpExtInst %float %28 Distance %38 %36
+               OpStore %d %39
+         %40 = OpLoad %float %d
+         %42 = OpFOrdLessThan %bool %40 %float_0_100000001
+               OpSelectionMerge %44 None
+               OpBranchConditional %42 %45 %46
+         %45 = OpLabel
+         %47 = OpAccessChain %_ptr_Function_float %v %uint_0
+         %48 = OpLoad %float %47
+         %50 = OpCompositeConstruct %v4float %48 %float_0 %float_0 %float_1
+               OpStore %x_GLF_color %50
+               OpBranch %44
+         %46 = OpLabel
+               OpStore %x_GLF_color %51
+               OpBranch %44
+         %44 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %52
+%tint_symbol = OpFunctionParameter %main_out
+         %56 = OpLabel
+         %57 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %57
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %59 = OpLabel
+         %60 = OpFunctionCall %void %main_1
+         %62 = OpLoad %v4float %x_GLF_color
+         %63 = OpCompositeConstruct %main_out %62
+         %61 = OpFunctionCall %void %tint_symbol_2 %63
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-mix-uniform-weight/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-mix-uniform-weight/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..39b846d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-mix-uniform-weight/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,36 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v : vec3<f32>;
+  var d : f32;
+  let x_36 : f32 = x_6.one;
+  v = mix(vec3<f32>(5.0, 8.0, -12.199999809), vec3<f32>(1.0, 4.900000095, -2.099999905), vec3<f32>(x_36, x_36, x_36));
+  let x_39 : vec3<f32> = v;
+  d = distance(x_39, vec3<f32>(1.0, 4.900000095, -2.099999905));
+  let x_41 : f32 = d;
+  if ((x_41 < 0.100000001)) {
+    let x_47 : f32 = v.x;
+    x_GLF_color = vec4<f32>(x_47, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-mix-uniform-weight/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-mix-uniform-weight/0-opt.wgsl
new file mode 100644
index 0000000..39b846d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-mix-uniform-weight/0-opt.wgsl
@@ -0,0 +1,36 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v : vec3<f32>;
+  var d : f32;
+  let x_36 : f32 = x_6.one;
+  v = mix(vec3<f32>(5.0, 8.0, -12.199999809), vec3<f32>(1.0, 4.900000095, -2.099999905), vec3<f32>(x_36, x_36, x_36));
+  let x_39 : vec3<f32> = v;
+  d = distance(x_39, vec3<f32>(1.0, 4.900000095, -2.099999905));
+  let x_41 : f32 = d;
+  if ((x_41 < 0.100000001)) {
+    let x_47 : f32 = v.x;
+    x_GLF_color = vec4<f32>(x_47, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-mix-uniform-weight/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-mix-uniform-weight/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..7a3d498
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-mix-uniform-weight/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,33 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float3 v = float3(0.0f, 0.0f, 0.0f);
+  float d = 0.0f;
+  const float x_36 = asfloat(x_6[0].x);
+  v = lerp(float3(5.0f, 8.0f, -12.199999809f), float3(1.0f, 4.900000095f, -2.099999905f), float3(x_36, x_36, x_36));
+  d = distance(v, float3(1.0f, 4.900000095f, -2.099999905f));
+  if ((d < 0.100000001f)) {
+    const float x_47 = v.x;
+    x_GLF_color = float4(x_47, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-mix-uniform-weight/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-mix-uniform-weight/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..02ce404
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-mix-uniform-weight/0-opt.wgsl.expected.msl
@@ -0,0 +1,38 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float3 v = 0.0f;
+  float d = 0.0f;
+  float const x_36 = x_6.one;
+  v = mix(float3(5.0f, 8.0f, -12.199999809f), float3(1.0f, 4.900000095f, -2.099999905f), float3(x_36, x_36, x_36));
+  float3 const x_39 = v;
+  d = distance(x_39, float3(1.0f, 4.900000095f, -2.099999905f));
+  float const x_41 = d;
+  if ((x_41 < 0.100000001f)) {
+    float const x_47 = v.x;
+    *(tint_symbol_4) = float4(x_47, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-mix-uniform-weight/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-mix-uniform-weight/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..0427ed3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-mix-uniform-weight/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,107 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 64
+; Schema: 0
+               OpCapability Shader
+         %28 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v "v"
+               OpName %d "d"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %18 = OpConstantNull %v3float
+%_ptr_Function_float = OpTypePointer Function %float
+         %21 = OpConstantNull %float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_5 = OpConstant %float 5
+    %float_8 = OpConstant %float 8
+%float_n12_1999998 = OpConstant %float -12.1999998
+         %32 = OpConstantComposite %v3float %float_5 %float_8 %float_n12_1999998
+    %float_1 = OpConstant %float 1
+%float_4_9000001 = OpConstant %float 4.9000001
+%float_n2_0999999 = OpConstant %float -2.0999999
+         %36 = OpConstantComposite %v3float %float_1 %float_4_9000001 %float_n2_0999999
+%float_0_100000001 = OpConstant %float 0.100000001
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+         %51 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %52 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+          %v = OpVariable %_ptr_Function_v3float Function %18
+          %d = OpVariable %_ptr_Function_float Function %21
+         %25 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0
+         %26 = OpLoad %float %25
+         %37 = OpCompositeConstruct %v3float %26 %26 %26
+         %27 = OpExtInst %v3float %28 FMix %32 %36 %37
+               OpStore %v %27
+         %38 = OpLoad %v3float %v
+         %39 = OpExtInst %float %28 Distance %38 %36
+               OpStore %d %39
+         %40 = OpLoad %float %d
+         %42 = OpFOrdLessThan %bool %40 %float_0_100000001
+               OpSelectionMerge %44 None
+               OpBranchConditional %42 %45 %46
+         %45 = OpLabel
+         %47 = OpAccessChain %_ptr_Function_float %v %uint_0
+         %48 = OpLoad %float %47
+         %50 = OpCompositeConstruct %v4float %48 %float_0 %float_0 %float_1
+               OpStore %x_GLF_color %50
+               OpBranch %44
+         %46 = OpLabel
+               OpStore %x_GLF_color %51
+               OpBranch %44
+         %44 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %52
+%tint_symbol = OpFunctionParameter %main_out
+         %56 = OpLabel
+         %57 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %57
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %59 = OpLabel
+         %60 = OpFunctionCall %void %main_1
+         %62 = OpLoad %v4float %x_GLF_color
+         %63 = OpCompositeConstruct %main_out %62
+         %61 = OpFunctionCall %void %tint_symbol_2 %63
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-mix-uniform-weight/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-mix-uniform-weight/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..39b846d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-mix-uniform-weight/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,36 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v : vec3<f32>;
+  var d : f32;
+  let x_36 : f32 = x_6.one;
+  v = mix(vec3<f32>(5.0, 8.0, -12.199999809), vec3<f32>(1.0, 4.900000095, -2.099999905), vec3<f32>(x_36, x_36, x_36));
+  let x_39 : vec3<f32> = v;
+  d = distance(x_39, vec3<f32>(1.0, 4.900000095, -2.099999905));
+  let x_41 : f32 = d;
+  if ((x_41 < 0.100000001)) {
+    let x_47 : f32 = v.x;
+    x_GLF_color = vec4<f32>(x_47, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-div/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-div/0-opt.spvasm
new file mode 100644
index 0000000..3b25608
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-div/0-opt.spvasm
@@ -0,0 +1,57 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "four"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %6 RelaxedPrecision
+               OpDecorate %7 RelaxedPrecision
+               OpDecorate %8 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+     %int_n2 = OpConstant %int -2
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %23 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %24 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %10
+         %25 = OpLabel
+         %26 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+          %6 = OpLoad %int %26
+          %7 = OpSDiv %int %6 %int_2
+          %8 = OpSNegate %int %7
+         %27 = OpIEqual %bool %8 %int_n2
+               OpSelectionMerge %28 None
+               OpBranchConditional %27 %29 %30
+         %29 = OpLabel
+               OpStore %_GLF_color %23
+               OpBranch %28
+         %30 = OpLabel
+               OpStore %_GLF_color %24
+               OpBranch %28
+         %28 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-div/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-div/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..400828d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-div/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,28 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const int x_6 = asint(x_5[0].x);
+  if ((-((x_6 / 2)) == -2)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-div/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-div/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..342ee1d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-div/0-opt.spvasm.expected.msl
@@ -0,0 +1,31 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int four;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  int const x_6 = x_5.four;
+  if ((-((x_6 / 2)) == -2)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-div/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-div/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..10f5bab
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-div/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,85 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 46
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "four"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+     %int_n2 = OpConstant %int -2
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %32 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %33 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %34 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+         %19 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0
+         %20 = OpLoad %int %19
+         %23 = OpSDiv %int %20 %int_2
+         %21 = OpSNegate %int %23
+         %25 = OpIEqual %bool %21 %int_n2
+               OpSelectionMerge %27 None
+               OpBranchConditional %25 %28 %29
+         %28 = OpLabel
+               OpStore %x_GLF_color %32
+               OpBranch %27
+         %29 = OpLabel
+               OpStore %x_GLF_color %33
+               OpBranch %27
+         %27 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %34
+%tint_symbol = OpFunctionParameter %main_out
+         %38 = OpLabel
+         %39 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %39
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %41 = OpLabel
+         %42 = OpFunctionCall %void %main_1
+         %44 = OpLoad %v4float %x_GLF_color
+         %45 = OpCompositeConstruct %main_out %44
+         %43 = OpFunctionCall %void %tint_symbol_2 %45
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-div/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-div/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..31222ff
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-div/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,29 @@
+[[block]]
+struct buf0 {
+  four : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_6 : i32 = x_5.four;
+  if ((-((x_6 / 2)) == -2)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-div/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-div/0-opt.wgsl
new file mode 100644
index 0000000..31222ff
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-div/0-opt.wgsl
@@ -0,0 +1,29 @@
+[[block]]
+struct buf0 {
+  four : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_6 : i32 = x_5.four;
+  if ((-((x_6 / 2)) == -2)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-div/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-div/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..400828d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-div/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,28 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const int x_6 = asint(x_5[0].x);
+  if ((-((x_6 / 2)) == -2)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-div/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-div/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..342ee1d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-div/0-opt.wgsl.expected.msl
@@ -0,0 +1,31 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int four;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  int const x_6 = x_5.four;
+  if ((-((x_6 / 2)) == -2)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-div/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-div/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..10f5bab
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-div/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,85 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 46
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "four"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+     %int_n2 = OpConstant %int -2
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %32 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %33 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %34 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+         %19 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0
+         %20 = OpLoad %int %19
+         %23 = OpSDiv %int %20 %int_2
+         %21 = OpSNegate %int %23
+         %25 = OpIEqual %bool %21 %int_n2
+               OpSelectionMerge %27 None
+               OpBranchConditional %25 %28 %29
+         %28 = OpLabel
+               OpStore %x_GLF_color %32
+               OpBranch %27
+         %29 = OpLabel
+               OpStore %x_GLF_color %33
+               OpBranch %27
+         %27 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %34
+%tint_symbol = OpFunctionParameter %main_out
+         %38 = OpLabel
+         %39 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %39
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %41 = OpLabel
+         %42 = OpFunctionCall %void %main_1
+         %44 = OpLoad %v4float %x_GLF_color
+         %45 = OpCompositeConstruct %main_out %44
+         %43 = OpFunctionCall %void %tint_symbol_2 %45
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-div/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-div/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..31222ff
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-div/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,29 @@
+[[block]]
+struct buf0 {
+  four : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_6 : i32 = x_5.four;
+  if ((-((x_6 / 2)) == -2)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-sub/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-sub/0-opt.spvasm
new file mode 100644
index 0000000..a73279f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-sub/0-opt.spvasm
@@ -0,0 +1,58 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %x "x"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_5 = OpConstant %int 5
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+     %int_n4 = OpConstant %int -4
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %22 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %23 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %8
+         %24 = OpLabel
+          %x = OpVariable %_ptr_Function_int Function
+         %25 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %26 = OpLoad %int %25
+         %27 = OpISub %int %int_5 %26
+         %28 = OpSNegate %int %27
+               OpStore %x %28
+         %29 = OpLoad %int %x
+         %30 = OpIEqual %bool %29 %int_n4
+               OpSelectionMerge %31 None
+               OpBranchConditional %30 %32 %33
+         %32 = OpLabel
+               OpStore %_GLF_color %22
+               OpBranch %31
+         %33 = OpLabel
+               OpStore %_GLF_color %23
+               OpBranch %31
+         %31 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-sub/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-sub/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..abdc55d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-sub/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,30 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int x = 0;
+  const int x_26 = asint(x_6[0].x);
+  x = -((5 - x_26));
+  if ((x == -4)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-sub/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-sub/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..ba94661
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-sub/0-opt.spvasm.expected.msl
@@ -0,0 +1,34 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int x = 0;
+  int const x_26 = x_6.one;
+  x = -((5 - x_26));
+  int const x_29 = x;
+  if ((x_29 == -4)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-sub/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-sub/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..567ae13
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-sub/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,91 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 50
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x "x"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_5 = OpConstant %int 5
+     %int_n4 = OpConstant %int -4
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %36 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %37 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %38 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %x = OpVariable %_ptr_Function_int Function %18
+         %22 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0
+         %23 = OpLoad %int %22
+         %26 = OpISub %int %int_5 %23
+         %24 = OpSNegate %int %26
+               OpStore %x %24
+         %27 = OpLoad %int %x
+         %29 = OpIEqual %bool %27 %int_n4
+               OpSelectionMerge %31 None
+               OpBranchConditional %29 %32 %33
+         %32 = OpLabel
+               OpStore %x_GLF_color %36
+               OpBranch %31
+         %33 = OpLabel
+               OpStore %x_GLF_color %37
+               OpBranch %31
+         %31 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %38
+%tint_symbol = OpFunctionParameter %main_out
+         %42 = OpLabel
+         %43 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %43
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %45 = OpLabel
+         %46 = OpFunctionCall %void %main_1
+         %48 = OpLoad %v4float %x_GLF_color
+         %49 = OpCompositeConstruct %main_out %48
+         %47 = OpFunctionCall %void %tint_symbol_2 %49
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-sub/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-sub/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..73f36ea
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-sub/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,32 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x : i32;
+  let x_26 : i32 = x_6.one;
+  x = -((5 - x_26));
+  let x_29 : i32 = x;
+  if ((x_29 == -4)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-sub/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-sub/0-opt.wgsl
new file mode 100644
index 0000000..73f36ea
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-sub/0-opt.wgsl
@@ -0,0 +1,32 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x : i32;
+  let x_26 : i32 = x_6.one;
+  x = -((5 - x_26));
+  let x_29 : i32 = x;
+  if ((x_29 == -4)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-sub/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-sub/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..abdc55d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-sub/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,30 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int x = 0;
+  const int x_26 = asint(x_6[0].x);
+  x = -((5 - x_26));
+  if ((x == -4)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-sub/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-sub/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..ba94661
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-sub/0-opt.wgsl.expected.msl
@@ -0,0 +1,34 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int x = 0;
+  int const x_26 = x_6.one;
+  x = -((5 - x_26));
+  int const x_29 = x;
+  if ((x_29 == -4)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-sub/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-sub/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..567ae13
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-sub/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,91 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 50
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x "x"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_5 = OpConstant %int 5
+     %int_n4 = OpConstant %int -4
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %36 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %37 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %38 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %x = OpVariable %_ptr_Function_int Function %18
+         %22 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0
+         %23 = OpLoad %int %22
+         %26 = OpISub %int %int_5 %23
+         %24 = OpSNegate %int %26
+               OpStore %x %24
+         %27 = OpLoad %int %x
+         %29 = OpIEqual %bool %27 %int_n4
+               OpSelectionMerge %31 None
+               OpBranchConditional %29 %32 %33
+         %32 = OpLabel
+               OpStore %x_GLF_color %36
+               OpBranch %31
+         %33 = OpLabel
+               OpStore %x_GLF_color %37
+               OpBranch %31
+         %31 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %38
+%tint_symbol = OpFunctionParameter %main_out
+         %42 = OpLabel
+         %43 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %43
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %45 = OpLabel
+         %46 = OpFunctionCall %void %main_1
+         %48 = OpLoad %v4float %x_GLF_color
+         %49 = OpCompositeConstruct %main_out %48
+         %47 = OpFunctionCall %void %tint_symbol_2 %49
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-sub/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-sub/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..73f36ea
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-negate-sub/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,32 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x : i32;
+  let x_26 : i32 = x_6.one;
+  x = -((5 - x_26));
+  let x_29 : i32 = x;
+  if ((x_29 == -4)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-redundant-mix/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-redundant-mix/0-opt.spvasm
new file mode 100644
index 0000000..a280ffe
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-redundant-mix/0-opt.spvasm
@@ -0,0 +1,56 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_1 = OpConstant %float 1
+         %15 = OpConstantComposite %v2float %float_1 %float_1
+    %float_0 = OpConstant %float 0
+         %17 = OpConstantComposite %v2float %float_0 %float_0
+         %18 = OpConstantComposite %v2float %float_0 %float_1
+       %bool = OpTypeBool
+     %v2bool = OpTypeVector %bool 2
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %23 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %24 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %7
+         %25 = OpLabel
+         %26 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+         %27 = OpLoad %v2float %26
+         %28 = OpExtInst %v2float %1 FMix %27 %15 %17
+         %29 = OpFOrdEqual %v2bool %28 %18
+         %30 = OpAll %bool %29
+               OpSelectionMerge %31 None
+               OpBranchConditional %30 %32 %33
+         %32 = OpLabel
+               OpStore %_GLF_color %23
+               OpBranch %31
+         %33 = OpLabel
+               OpStore %_GLF_color %24
+               OpBranch %31
+         %31 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-redundant-mix/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-redundant-mix/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..6aca1c8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-redundant-mix/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,28 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const float2 x_27 = asfloat(x_5[0].xy);
+  if (all((lerp(x_27, float2(1.0f, 1.0f), float2(0.0f, 0.0f)) == float2(0.0f, 1.0f)))) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-redundant-mix/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-redundant-mix/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..945cd53
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-redundant-mix/0-opt.spvasm.expected.msl
@@ -0,0 +1,31 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  float2 const x_27 = x_5.injectionSwitch;
+  if (all((mix(x_27, float2(1.0f, 1.0f), float2(0.0f, 0.0f)) == float2(0.0f, 1.0f)))) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-redundant-mix/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-redundant-mix/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..f1fcd90
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-redundant-mix/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,88 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 49
+; Schema: 0
+               OpCapability Shader
+         %24 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+         %26 = OpConstantComposite %v2float %float_1 %float_1
+    %float_0 = OpConstant %float 0
+         %28 = OpConstantComposite %v2float %float_0 %float_0
+         %29 = OpConstantComposite %v2float %float_0 %float_1
+     %v2bool = OpTypeVector %bool 2
+         %35 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %36 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %37 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+         %19 = OpAccessChain %_ptr_Uniform_v2float %x_5 %uint_0
+         %20 = OpLoad %v2float %19
+         %23 = OpExtInst %v2float %24 FMix %20 %26 %28
+         %30 = OpFOrdEqual %v2bool %23 %29
+         %21 = OpAll %bool %30
+               OpSelectionMerge %32 None
+               OpBranchConditional %21 %33 %34
+         %33 = OpLabel
+               OpStore %x_GLF_color %35
+               OpBranch %32
+         %34 = OpLabel
+               OpStore %x_GLF_color %36
+               OpBranch %32
+         %32 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %37
+%tint_symbol = OpFunctionParameter %main_out
+         %41 = OpLabel
+         %42 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %42
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %44 = OpLabel
+         %45 = OpFunctionCall %void %main_1
+         %47 = OpLoad %v4float %x_GLF_color
+         %48 = OpCompositeConstruct %main_out %47
+         %46 = OpFunctionCall %void %tint_symbol_2 %48
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-redundant-mix/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-redundant-mix/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..fcf7c4a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-redundant-mix/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,29 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_27 : vec2<f32> = x_5.injectionSwitch;
+  if (all((mix(x_27, vec2<f32>(1.0, 1.0), vec2<f32>(0.0, 0.0)) == vec2<f32>(0.0, 1.0)))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-redundant-mix/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-redundant-mix/0-opt.wgsl
new file mode 100644
index 0000000..fcf7c4a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-redundant-mix/0-opt.wgsl
@@ -0,0 +1,29 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_27 : vec2<f32> = x_5.injectionSwitch;
+  if (all((mix(x_27, vec2<f32>(1.0, 1.0), vec2<f32>(0.0, 0.0)) == vec2<f32>(0.0, 1.0)))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-redundant-mix/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-redundant-mix/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..6aca1c8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-redundant-mix/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,28 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const float2 x_27 = asfloat(x_5[0].xy);
+  if (all((lerp(x_27, float2(1.0f, 1.0f), float2(0.0f, 0.0f)) == float2(0.0f, 1.0f)))) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-redundant-mix/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-redundant-mix/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..945cd53
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-redundant-mix/0-opt.wgsl.expected.msl
@@ -0,0 +1,31 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  float2 const x_27 = x_5.injectionSwitch;
+  if (all((mix(x_27, float2(1.0f, 1.0f), float2(0.0f, 0.0f)) == float2(0.0f, 1.0f)))) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-redundant-mix/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-redundant-mix/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..f1fcd90
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-redundant-mix/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,88 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 49
+; Schema: 0
+               OpCapability Shader
+         %24 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+         %26 = OpConstantComposite %v2float %float_1 %float_1
+    %float_0 = OpConstant %float 0
+         %28 = OpConstantComposite %v2float %float_0 %float_0
+         %29 = OpConstantComposite %v2float %float_0 %float_1
+     %v2bool = OpTypeVector %bool 2
+         %35 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %36 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %37 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+         %19 = OpAccessChain %_ptr_Uniform_v2float %x_5 %uint_0
+         %20 = OpLoad %v2float %19
+         %23 = OpExtInst %v2float %24 FMix %20 %26 %28
+         %30 = OpFOrdEqual %v2bool %23 %29
+         %21 = OpAll %bool %30
+               OpSelectionMerge %32 None
+               OpBranchConditional %21 %33 %34
+         %33 = OpLabel
+               OpStore %x_GLF_color %35
+               OpBranch %32
+         %34 = OpLabel
+               OpStore %x_GLF_color %36
+               OpBranch %32
+         %32 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %37
+%tint_symbol = OpFunctionParameter %main_out
+         %41 = OpLabel
+         %42 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %42
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %44 = OpLabel
+         %45 = OpFunctionCall %void %main_1
+         %47 = OpLoad %v4float %x_GLF_color
+         %48 = OpCompositeConstruct %main_out %47
+         %46 = OpFunctionCall %void %tint_symbol_2 %48
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-redundant-mix/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-redundant-mix/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..fcf7c4a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-redundant-mix/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,29 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_27 : vec2<f32> = x_5.injectionSwitch;
+  if (all((mix(x_27, vec2<f32>(1.0, 1.0), vec2<f32>(0.0, 0.0)) == vec2<f32>(0.0, 1.0)))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-extract/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-extract/0-opt.spvasm
new file mode 100644
index 0000000..6e30025
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-extract/0-opt.spvasm
@@ -0,0 +1,58 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_1 = OpConstant %float 1
+         %15 = OpConstantComposite %v2float %float_1 %float_1
+       %bool = OpTypeBool
+     %v2bool = OpTypeVector %bool 2
+      %false = OpConstantFalse %bool
+         %19 = OpConstantComposite %v2bool %false %false
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+    %float_0 = OpConstant %float 0
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %25 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %26 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %7
+         %27 = OpLabel
+         %28 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+         %29 = OpLoad %v2float %28
+         %30 = OpSelect %v2float %19 %15 %29
+         %31 = OpCompositeExtract %float %30 0
+         %32 = OpFOrdEqual %bool %31 %float_0
+               OpSelectionMerge %33 None
+               OpBranchConditional %32 %34 %35
+         %34 = OpLabel
+               OpStore %_GLF_color %25
+               OpBranch %33
+         %35 = OpLabel
+               OpStore %_GLF_color %26
+               OpBranch %33
+         %33 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-extract/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-extract/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..563318c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-extract/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,28 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const float2 x_29 = asfloat(x_5[0].xy);
+  if (((bool2(false, false) ? float2(1.0f, 1.0f) : x_29).x == 0.0f)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-extract/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-extract/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..2d5c01d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-extract/0-opt.spvasm.expected.msl
@@ -0,0 +1,31 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  float2 const x_29 = x_5.injectionSwitch;
+  if ((select(x_29, float2(1.0f, 1.0f), bool2(false, false)).x == 0.0f)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-extract/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-extract/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..4d94830
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-extract/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,87 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 48
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+       %bool = OpTypeBool
+     %v2bool = OpTypeVector %bool 2
+      %false = OpConstantFalse %bool
+         %25 = OpConstantComposite %v2bool %false %false
+    %float_1 = OpConstant %float 1
+         %27 = OpConstantComposite %v2float %float_1 %float_1
+    %float_0 = OpConstant %float 0
+         %34 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %35 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %36 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+         %19 = OpAccessChain %_ptr_Uniform_v2float %x_5 %uint_0
+         %20 = OpLoad %v2float %19
+         %21 = OpSelect %v2float %25 %27 %20
+         %28 = OpCompositeExtract %float %21 0
+         %30 = OpFOrdEqual %bool %28 %float_0
+               OpSelectionMerge %31 None
+               OpBranchConditional %30 %32 %33
+         %32 = OpLabel
+               OpStore %x_GLF_color %34
+               OpBranch %31
+         %33 = OpLabel
+               OpStore %x_GLF_color %35
+               OpBranch %31
+         %31 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %36
+%tint_symbol = OpFunctionParameter %main_out
+         %40 = OpLabel
+         %41 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %41
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %43 = OpLabel
+         %44 = OpFunctionCall %void %main_1
+         %46 = OpLoad %v4float %x_GLF_color
+         %47 = OpCompositeConstruct %main_out %46
+         %45 = OpFunctionCall %void %tint_symbol_2 %47
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-extract/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-extract/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..790f1a1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-extract/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,29 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_29 : vec2<f32> = x_5.injectionSwitch;
+  if ((select(x_29, vec2<f32>(1.0, 1.0), vec2<bool>(false, false)).x == 0.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-extract/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-extract/0-opt.wgsl
new file mode 100644
index 0000000..790f1a1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-extract/0-opt.wgsl
@@ -0,0 +1,29 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_29 : vec2<f32> = x_5.injectionSwitch;
+  if ((select(x_29, vec2<f32>(1.0, 1.0), vec2<bool>(false, false)).x == 0.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-extract/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-extract/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..563318c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-extract/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,28 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const float2 x_29 = asfloat(x_5[0].xy);
+  if (((bool2(false, false) ? float2(1.0f, 1.0f) : x_29).x == 0.0f)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-extract/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-extract/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..2d5c01d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-extract/0-opt.wgsl.expected.msl
@@ -0,0 +1,31 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  float2 const x_29 = x_5.injectionSwitch;
+  if ((select(x_29, float2(1.0f, 1.0f), bool2(false, false)).x == 0.0f)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-extract/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-extract/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..4d94830
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-extract/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,87 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 48
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+       %bool = OpTypeBool
+     %v2bool = OpTypeVector %bool 2
+      %false = OpConstantFalse %bool
+         %25 = OpConstantComposite %v2bool %false %false
+    %float_1 = OpConstant %float 1
+         %27 = OpConstantComposite %v2float %float_1 %float_1
+    %float_0 = OpConstant %float 0
+         %34 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %35 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %36 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+         %19 = OpAccessChain %_ptr_Uniform_v2float %x_5 %uint_0
+         %20 = OpLoad %v2float %19
+         %21 = OpSelect %v2float %25 %27 %20
+         %28 = OpCompositeExtract %float %21 0
+         %30 = OpFOrdEqual %bool %28 %float_0
+               OpSelectionMerge %31 None
+               OpBranchConditional %30 %32 %33
+         %32 = OpLabel
+               OpStore %x_GLF_color %34
+               OpBranch %31
+         %33 = OpLabel
+               OpStore %x_GLF_color %35
+               OpBranch %31
+         %31 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %36
+%tint_symbol = OpFunctionParameter %main_out
+         %40 = OpLabel
+         %41 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %41
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %43 = OpLabel
+         %44 = OpFunctionCall %void %main_1
+         %46 = OpLoad %v4float %x_GLF_color
+         %47 = OpCompositeConstruct %main_out %46
+         %45 = OpFunctionCall %void %tint_symbol_2 %47
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-extract/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-extract/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..790f1a1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-extract/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,29 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_29 : vec2<f32> = x_5.injectionSwitch;
+  if ((select(x_29, vec2<f32>(1.0, 1.0), vec2<bool>(false, false)).x == 0.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-mix/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-mix/0-opt.spvasm
new file mode 100644
index 0000000..d0b8717
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-mix/0-opt.spvasm
@@ -0,0 +1,76 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %v "v"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "threeandfour"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+    %float_4 = OpConstant %float 4
+    %float_5 = OpConstant %float 5
+         %16 = OpConstantComposite %v4float %float_2 %float_3 %float_4 %float_5
+    %v2float = OpTypeVector %float 2
+    %float_6 = OpConstant %float 6
+         %19 = OpConstantComposite %v2float %float_2 %float_6
+    %float_1 = OpConstant %float 1
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+     %v2bool = OpTypeVector %bool 2
+       %true = OpConstantTrue %bool
+      %false = OpConstantFalse %bool
+         %31 = OpConstantComposite %v2bool %true %false
+         %32 = OpConstantComposite %v4float %float_1 %float_6 %float_4 %float_5
+     %v4bool = OpTypeVector %bool 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %36 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %37 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %8
+         %38 = OpLabel
+          %v = OpVariable %_ptr_Function_v4float Function
+               OpStore %v %16
+         %39 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %40 = OpLoad %float %39
+         %41 = OpCompositeConstruct %v2float %float_1 %40
+         %42 = OpSelect %v2float %31 %41 %19
+         %43 = OpLoad %v4float %v
+         %44 = OpVectorShuffle %v4float %43 %42 4 5 2 3
+               OpStore %v %44
+         %45 = OpLoad %v4float %v
+         %46 = OpFOrdEqual %v4bool %45 %32
+         %47 = OpAll %bool %46
+               OpSelectionMerge %48 None
+               OpBranchConditional %47 %49 %50
+         %49 = OpLabel
+               OpStore %_GLF_color %36
+               OpBranch %48
+         %50 = OpLabel
+               OpStore %_GLF_color %37
+               OpBranch %48
+         %48 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-mix/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-mix/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..f11d3d7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-mix/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,33 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 v = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  v = float4(2.0f, 3.0f, 4.0f, 5.0f);
+  const float x_40 = asfloat(x_6[0].y);
+  const float2 x_42 = (bool2(true, false) ? float2(1.0f, x_40) : float2(2.0f, 6.0f));
+  const float4 x_43 = v;
+  v = float4(x_42.x, x_42.y, x_43.z, x_43.w);
+  if (all((v == float4(1.0f, 6.0f, 4.0f, 5.0f)))) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-mix/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-mix/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..11c6999
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-mix/0-opt.spvasm.expected.msl
@@ -0,0 +1,37 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 threeandfour;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float4 v = 0.0f;
+  v = float4(2.0f, 3.0f, 4.0f, 5.0f);
+  float const x_40 = x_6.threeandfour.y;
+  float2 const x_42 = select(float2(2.0f, 6.0f), float2(1.0f, x_40), bool2(true, false));
+  float4 const x_43 = v;
+  v = float4(x_42.x, x_42.y, x_43.z, x_43.w);
+  float4 const x_45 = v;
+  if (all((x_45 == float4(1.0f, 6.0f, 4.0f, 5.0f)))) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-mix/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-mix/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..86501a3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-mix/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,110 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 68
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "threeandfour"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v "v"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+    %float_4 = OpConstant %float 4
+    %float_5 = OpConstant %float 5
+         %22 = OpConstantComposite %v4float %float_2 %float_3 %float_4 %float_5
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+     %v2bool = OpTypeVector %bool 2
+       %true = OpConstantTrue %bool
+      %false = OpConstantFalse %bool
+         %34 = OpConstantComposite %v2bool %true %false
+    %float_1 = OpConstant %float 1
+    %float_6 = OpConstant %float 6
+         %38 = OpConstantComposite %v2float %float_2 %float_6
+         %47 = OpConstantComposite %v4float %float_1 %float_6 %float_4 %float_5
+     %v4bool = OpTypeVector %bool 4
+    %float_0 = OpConstant %float 0
+         %54 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %55 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %56 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %v = OpVariable %_ptr_Function_v4float Function %9
+               OpStore %v %22
+         %27 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %28 = OpLoad %float %27
+         %36 = OpCompositeConstruct %v2float %float_1 %28
+         %29 = OpSelect %v2float %34 %36 %38
+         %39 = OpLoad %v4float %v
+         %40 = OpCompositeExtract %float %29 0
+         %41 = OpCompositeExtract %float %29 1
+         %42 = OpCompositeExtract %float %39 2
+         %43 = OpCompositeExtract %float %39 3
+         %44 = OpCompositeConstruct %v4float %40 %41 %42 %43
+               OpStore %v %44
+         %45 = OpLoad %v4float %v
+         %48 = OpFOrdEqual %v4bool %45 %47
+         %46 = OpAll %bool %48
+               OpSelectionMerge %50 None
+               OpBranchConditional %46 %51 %52
+         %51 = OpLabel
+               OpStore %x_GLF_color %54
+               OpBranch %50
+         %52 = OpLabel
+               OpStore %x_GLF_color %55
+               OpBranch %50
+         %50 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %56
+%tint_symbol = OpFunctionParameter %main_out
+         %60 = OpLabel
+         %61 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %61
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %63 = OpLabel
+         %64 = OpFunctionCall %void %main_1
+         %66 = OpLoad %v4float %x_GLF_color
+         %67 = OpCompositeConstruct %main_out %66
+         %65 = OpFunctionCall %void %tint_symbol_2 %67
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-mix/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-mix/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..8168671
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-mix/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,35 @@
+[[block]]
+struct buf0 {
+  threeandfour : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v : vec4<f32>;
+  v = vec4<f32>(2.0, 3.0, 4.0, 5.0);
+  let x_40 : f32 = x_6.threeandfour.y;
+  let x_42 : vec2<f32> = select(vec2<f32>(2.0, 6.0), vec2<f32>(1.0, x_40), vec2<bool>(true, false));
+  let x_43 : vec4<f32> = v;
+  v = vec4<f32>(x_42.x, x_42.y, x_43.z, x_43.w);
+  let x_45 : vec4<f32> = v;
+  if (all((x_45 == vec4<f32>(1.0, 6.0, 4.0, 5.0)))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-mix/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-mix/0-opt.wgsl
new file mode 100644
index 0000000..8168671
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-mix/0-opt.wgsl
@@ -0,0 +1,35 @@
+[[block]]
+struct buf0 {
+  threeandfour : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v : vec4<f32>;
+  v = vec4<f32>(2.0, 3.0, 4.0, 5.0);
+  let x_40 : f32 = x_6.threeandfour.y;
+  let x_42 : vec2<f32> = select(vec2<f32>(2.0, 6.0), vec2<f32>(1.0, x_40), vec2<bool>(true, false));
+  let x_43 : vec4<f32> = v;
+  v = vec4<f32>(x_42.x, x_42.y, x_43.z, x_43.w);
+  let x_45 : vec4<f32> = v;
+  if (all((x_45 == vec4<f32>(1.0, 6.0, 4.0, 5.0)))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-mix/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-mix/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..f11d3d7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-mix/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,33 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 v = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  v = float4(2.0f, 3.0f, 4.0f, 5.0f);
+  const float x_40 = asfloat(x_6[0].y);
+  const float2 x_42 = (bool2(true, false) ? float2(1.0f, x_40) : float2(2.0f, 6.0f));
+  const float4 x_43 = v;
+  v = float4(x_42.x, x_42.y, x_43.z, x_43.w);
+  if (all((v == float4(1.0f, 6.0f, 4.0f, 5.0f)))) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-mix/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-mix/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..11c6999
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-mix/0-opt.wgsl.expected.msl
@@ -0,0 +1,37 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 threeandfour;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float4 v = 0.0f;
+  v = float4(2.0f, 3.0f, 4.0f, 5.0f);
+  float const x_40 = x_6.threeandfour.y;
+  float2 const x_42 = select(float2(2.0f, 6.0f), float2(1.0f, x_40), bool2(true, false));
+  float4 const x_43 = v;
+  v = float4(x_42.x, x_42.y, x_43.z, x_43.w);
+  float4 const x_45 = v;
+  if (all((x_45 == float4(1.0f, 6.0f, 4.0f, 5.0f)))) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-mix/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-mix/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..86501a3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-mix/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,110 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 68
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "threeandfour"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v "v"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+    %float_4 = OpConstant %float 4
+    %float_5 = OpConstant %float 5
+         %22 = OpConstantComposite %v4float %float_2 %float_3 %float_4 %float_5
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+     %v2bool = OpTypeVector %bool 2
+       %true = OpConstantTrue %bool
+      %false = OpConstantFalse %bool
+         %34 = OpConstantComposite %v2bool %true %false
+    %float_1 = OpConstant %float 1
+    %float_6 = OpConstant %float 6
+         %38 = OpConstantComposite %v2float %float_2 %float_6
+         %47 = OpConstantComposite %v4float %float_1 %float_6 %float_4 %float_5
+     %v4bool = OpTypeVector %bool 4
+    %float_0 = OpConstant %float 0
+         %54 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %55 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %56 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %v = OpVariable %_ptr_Function_v4float Function %9
+               OpStore %v %22
+         %27 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %28 = OpLoad %float %27
+         %36 = OpCompositeConstruct %v2float %float_1 %28
+         %29 = OpSelect %v2float %34 %36 %38
+         %39 = OpLoad %v4float %v
+         %40 = OpCompositeExtract %float %29 0
+         %41 = OpCompositeExtract %float %29 1
+         %42 = OpCompositeExtract %float %39 2
+         %43 = OpCompositeExtract %float %39 3
+         %44 = OpCompositeConstruct %v4float %40 %41 %42 %43
+               OpStore %v %44
+         %45 = OpLoad %v4float %v
+         %48 = OpFOrdEqual %v4bool %45 %47
+         %46 = OpAll %bool %48
+               OpSelectionMerge %50 None
+               OpBranchConditional %46 %51 %52
+         %51 = OpLabel
+               OpStore %x_GLF_color %54
+               OpBranch %50
+         %52 = OpLabel
+               OpStore %x_GLF_color %55
+               OpBranch %50
+         %50 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %56
+%tint_symbol = OpFunctionParameter %main_out
+         %60 = OpLabel
+         %61 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %61
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %63 = OpLabel
+         %64 = OpFunctionCall %void %main_1
+         %66 = OpLoad %v4float %x_GLF_color
+         %67 = OpCompositeConstruct %main_out %66
+         %65 = OpFunctionCall %void %tint_symbol_2 %67
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-mix/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-mix/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..8168671
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-shuffle-mix/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,35 @@
+[[block]]
+struct buf0 {
+  threeandfour : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v : vec4<f32>;
+  v = vec4<f32>(2.0, 3.0, 4.0, 5.0);
+  let x_40 : f32 = x_6.threeandfour.y;
+  let x_42 : vec2<f32> = select(vec2<f32>(2.0, 6.0), vec2<f32>(1.0, x_40), vec2<bool>(true, false));
+  let x_43 : vec4<f32> = v;
+  v = vec4<f32>(x_42.x, x_42.y, x_43.z, x_43.w);
+  let x_45 : vec4<f32> = v;
+  if (all((x_45 == vec4<f32>(1.0, 6.0, 4.0, 5.0)))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-split-vector-init/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-split-vector-init/0-opt.spvasm
new file mode 100644
index 0000000..5c12018
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-split-vector-init/0-opt.spvasm
@@ -0,0 +1,51 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %v "v"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %6 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+    %v2float = OpTypeVector %float 2
+    %float_1 = OpConstant %float 1
+         %12 = OpConstantComposite %v2float %float_1 %float_1
+    %float_2 = OpConstant %float 2
+         %14 = OpConstantComposite %v2float %float_2 %float_2
+         %15 = OpConstantComposite %v4float %float_1 %float_1 %float_2 %float_2
+       %bool = OpTypeBool
+     %v4bool = OpTypeVector %bool 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %20 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %21 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %6
+         %22 = OpLabel
+          %v = OpVariable %_ptr_Function_v4float Function
+         %23 = OpLoad %v4float %v
+         %24 = OpVectorShuffle %v4float %23 %12 4 5 2 3
+               OpStore %v %24
+         %25 = OpLoad %v4float %v
+         %26 = OpVectorShuffle %v4float %25 %14 0 1 4 5
+               OpStore %v %26
+         %27 = OpLoad %v4float %v
+         %28 = OpFOrdEqual %v4bool %27 %15
+         %29 = OpAll %bool %28
+               OpSelectionMerge %30 None
+               OpBranchConditional %29 %31 %32
+         %31 = OpLabel
+               OpStore %_GLF_color %20
+               OpBranch %30
+         %32 = OpLabel
+               OpStore %_GLF_color %21
+               OpBranch %30
+         %30 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-split-vector-init/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-split-vector-init/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..274014d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-split-vector-init/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,29 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 v = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  const float4 x_23 = v;
+  v = float4(float2(1.0f, 1.0f).x, float2(1.0f, 1.0f).y, x_23.z, x_23.w);
+  const float4 x_25 = v;
+  v = float4(x_25.x, x_25.y, float2(2.0f, 2.0f).x, float2(2.0f, 2.0f).y);
+  if (all((v == float4(1.0f, 1.0f, 2.0f, 2.0f)))) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-split-vector-init/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-split-vector-init/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..df1620d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-split-vector-init/0-opt.spvasm.expected.msl
@@ -0,0 +1,33 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  float4 v = 0.0f;
+  float4 const x_23 = v;
+  v = float4(float2(1.0f, 1.0f).x, float2(1.0f, 1.0f).y, x_23.z, x_23.w);
+  float4 const x_25 = v;
+  v = float4(x_25.x, x_25.y, float2(2.0f, 2.0f).x, float2(2.0f, 2.0f).y);
+  float4 const x_27 = v;
+  if (all((x_27 == float4(1.0f, 1.0f, 2.0f, 2.0f)))) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-split-vector-init/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-split-vector-init/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..e87aa5b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-split-vector-init/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,89 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 55
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v "v"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+    %v2float = OpTypeVector %float 2
+    %float_1 = OpConstant %float 1
+         %17 = OpConstantComposite %v2float %float_1 %float_1
+    %float_2 = OpConstant %float 2
+         %27 = OpConstantComposite %v2float %float_2 %float_2
+       %bool = OpTypeBool
+         %34 = OpConstantComposite %v4float %float_1 %float_1 %float_2 %float_2
+     %v4bool = OpTypeVector %bool 4
+    %float_0 = OpConstant %float 0
+         %41 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %42 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %43 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %v = OpVariable %_ptr_Function_v4float Function %5
+         %14 = OpLoad %v4float %v
+         %18 = OpCompositeExtract %float %17 0
+         %19 = OpCompositeExtract %float %17 1
+         %20 = OpCompositeExtract %float %14 2
+         %21 = OpCompositeExtract %float %14 3
+         %22 = OpCompositeConstruct %v4float %18 %19 %20 %21
+               OpStore %v %22
+         %23 = OpLoad %v4float %v
+         %24 = OpCompositeExtract %float %23 0
+         %25 = OpCompositeExtract %float %23 1
+         %28 = OpCompositeExtract %float %27 0
+         %29 = OpCompositeExtract %float %27 1
+         %30 = OpCompositeConstruct %v4float %24 %25 %28 %29
+               OpStore %v %30
+         %31 = OpLoad %v4float %v
+         %35 = OpFOrdEqual %v4bool %31 %34
+         %32 = OpAll %bool %35
+               OpSelectionMerge %37 None
+               OpBranchConditional %32 %38 %39
+         %38 = OpLabel
+               OpStore %x_GLF_color %41
+               OpBranch %37
+         %39 = OpLabel
+               OpStore %x_GLF_color %42
+               OpBranch %37
+         %37 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %43
+%tint_symbol = OpFunctionParameter %main_out
+         %47 = OpLabel
+         %48 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %48
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %50 = OpLabel
+         %51 = OpFunctionCall %void %main_1
+         %53 = OpLoad %v4float %x_GLF_color
+         %54 = OpCompositeConstruct %main_out %53
+         %52 = OpFunctionCall %void %tint_symbol_2 %54
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-split-vector-init/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-split-vector-init/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..13ebbb0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-split-vector-init/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,27 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v : vec4<f32>;
+  let x_23 : vec4<f32> = v;
+  v = vec4<f32>(vec2<f32>(1.0, 1.0).x, vec2<f32>(1.0, 1.0).y, x_23.z, x_23.w);
+  let x_25 : vec4<f32> = v;
+  v = vec4<f32>(x_25.x, x_25.y, vec2<f32>(2.0, 2.0).x, vec2<f32>(2.0, 2.0).y);
+  let x_27 : vec4<f32> = v;
+  if (all((x_27 == vec4<f32>(1.0, 1.0, 2.0, 2.0)))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-split-vector-init/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-split-vector-init/0-opt.wgsl
new file mode 100644
index 0000000..13ebbb0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-split-vector-init/0-opt.wgsl
@@ -0,0 +1,27 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v : vec4<f32>;
+  let x_23 : vec4<f32> = v;
+  v = vec4<f32>(vec2<f32>(1.0, 1.0).x, vec2<f32>(1.0, 1.0).y, x_23.z, x_23.w);
+  let x_25 : vec4<f32> = v;
+  v = vec4<f32>(x_25.x, x_25.y, vec2<f32>(2.0, 2.0).x, vec2<f32>(2.0, 2.0).y);
+  let x_27 : vec4<f32> = v;
+  if (all((x_27 == vec4<f32>(1.0, 1.0, 2.0, 2.0)))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-split-vector-init/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-split-vector-init/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..274014d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-split-vector-init/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,29 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 v = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  const float4 x_23 = v;
+  v = float4(float2(1.0f, 1.0f).x, float2(1.0f, 1.0f).y, x_23.z, x_23.w);
+  const float4 x_25 = v;
+  v = float4(x_25.x, x_25.y, float2(2.0f, 2.0f).x, float2(2.0f, 2.0f).y);
+  if (all((v == float4(1.0f, 1.0f, 2.0f, 2.0f)))) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-split-vector-init/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-split-vector-init/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..df1620d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-split-vector-init/0-opt.wgsl.expected.msl
@@ -0,0 +1,33 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  float4 v = 0.0f;
+  float4 const x_23 = v;
+  v = float4(float2(1.0f, 1.0f).x, float2(1.0f, 1.0f).y, x_23.z, x_23.w);
+  float4 const x_25 = v;
+  v = float4(x_25.x, x_25.y, float2(2.0f, 2.0f).x, float2(2.0f, 2.0f).y);
+  float4 const x_27 = v;
+  if (all((x_27 == float4(1.0f, 1.0f, 2.0f, 2.0f)))) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-split-vector-init/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-split-vector-init/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..e87aa5b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-split-vector-init/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,89 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 55
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v "v"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+    %v2float = OpTypeVector %float 2
+    %float_1 = OpConstant %float 1
+         %17 = OpConstantComposite %v2float %float_1 %float_1
+    %float_2 = OpConstant %float 2
+         %27 = OpConstantComposite %v2float %float_2 %float_2
+       %bool = OpTypeBool
+         %34 = OpConstantComposite %v4float %float_1 %float_1 %float_2 %float_2
+     %v4bool = OpTypeVector %bool 4
+    %float_0 = OpConstant %float 0
+         %41 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %42 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %43 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %v = OpVariable %_ptr_Function_v4float Function %5
+         %14 = OpLoad %v4float %v
+         %18 = OpCompositeExtract %float %17 0
+         %19 = OpCompositeExtract %float %17 1
+         %20 = OpCompositeExtract %float %14 2
+         %21 = OpCompositeExtract %float %14 3
+         %22 = OpCompositeConstruct %v4float %18 %19 %20 %21
+               OpStore %v %22
+         %23 = OpLoad %v4float %v
+         %24 = OpCompositeExtract %float %23 0
+         %25 = OpCompositeExtract %float %23 1
+         %28 = OpCompositeExtract %float %27 0
+         %29 = OpCompositeExtract %float %27 1
+         %30 = OpCompositeConstruct %v4float %24 %25 %28 %29
+               OpStore %v %30
+         %31 = OpLoad %v4float %v
+         %35 = OpFOrdEqual %v4bool %31 %34
+         %32 = OpAll %bool %35
+               OpSelectionMerge %37 None
+               OpBranchConditional %32 %38 %39
+         %38 = OpLabel
+               OpStore %x_GLF_color %41
+               OpBranch %37
+         %39 = OpLabel
+               OpStore %x_GLF_color %42
+               OpBranch %37
+         %37 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %43
+%tint_symbol = OpFunctionParameter %main_out
+         %47 = OpLabel
+         %48 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %48
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %50 = OpLabel
+         %51 = OpFunctionCall %void %main_1
+         %53 = OpLoad %v4float %x_GLF_color
+         %54 = OpCompositeConstruct %main_out %53
+         %52 = OpFunctionCall %void %tint_symbol_2 %54
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-split-vector-init/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-split-vector-init/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..13ebbb0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-split-vector-init/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,27 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v : vec4<f32>;
+  let x_23 : vec4<f32> = v;
+  v = vec4<f32>(vec2<f32>(1.0, 1.0).x, vec2<f32>(1.0, 1.0).y, x_23.z, x_23.w);
+  let x_25 : vec4<f32> = v;
+  v = vec4<f32>(x_25.x, x_25.y, vec2<f32>(2.0, 2.0).x, vec2<f32>(2.0, 2.0).y);
+  let x_27 : vec4<f32> = v;
+  if (all((x_27 == vec4<f32>(1.0, 1.0, 2.0, 2.0)))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-vec-mix-uniform/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-vec-mix-uniform/0-opt.spvasm
new file mode 100644
index 0000000..8876c35
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-vec-mix-uniform/0-opt.spvasm
@@ -0,0 +1,79 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %v "v"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zeroOne"
+               OpName %_ ""
+               OpName %d "d"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+         %15 = OpConstantComposite %v2float %float_2 %float_3
+    %float_4 = OpConstant %float 4
+    %float_5 = OpConstant %float 5
+         %18 = OpConstantComposite %v2float %float_4 %float_5
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+%_ptr_Function_float = OpTypePointer Function %float
+         %24 = OpConstantComposite %v2float %float_2 %float_5
+%float_0_100000001 = OpConstant %float 0.100000001
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+    %float_1 = OpConstant %float 1
+     %uint_1 = OpConstant %uint 1
+    %float_0 = OpConstant %float 0
+         %34 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %9
+         %35 = OpLabel
+          %v = OpVariable %_ptr_Function_v2float Function
+          %d = OpVariable %_ptr_Function_float Function
+         %36 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+         %37 = OpLoad %v2float %36
+         %38 = OpExtInst %v2float %1 FMix %15 %18 %37
+               OpStore %v %38
+         %39 = OpLoad %v2float %v
+         %40 = OpExtInst %float %1 Distance %39 %24
+               OpStore %d %40
+         %41 = OpLoad %float %d
+         %42 = OpFOrdLessThan %bool %41 %float_0_100000001
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %45
+         %44 = OpLabel
+         %46 = OpAccessChain %_ptr_Function_float %v %uint_0
+         %47 = OpLoad %float %46
+         %48 = OpFSub %float %47 %float_1
+         %49 = OpAccessChain %_ptr_Function_float %v %uint_1
+         %50 = OpLoad %float %49
+         %51 = OpFSub %float %50 %float_5
+         %52 = OpCompositeConstruct %v4float %48 %51 %float_0 %float_1
+               OpStore %_GLF_color %52
+               OpBranch %43
+         %45 = OpLabel
+               OpStore %_GLF_color %34
+               OpBranch %43
+         %43 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-vec-mix-uniform/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-vec-mix-uniform/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..037715d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-vec-mix-uniform/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,34 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2 v = float2(0.0f, 0.0f);
+  float d = 0.0f;
+  const float2 x_37 = asfloat(x_6[0].xy);
+  v = lerp(float2(2.0f, 3.0f), float2(4.0f, 5.0f), x_37);
+  d = distance(v, float2(2.0f, 5.0f));
+  if ((d < 0.100000001f)) {
+    const float x_47 = v.x;
+    const float x_50 = v.y;
+    x_GLF_color = float4((x_47 - 1.0f), (x_50 - 5.0f), 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-vec-mix-uniform/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-vec-mix-uniform/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..bea0ac6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-vec-mix-uniform/0-opt.spvasm.expected.msl
@@ -0,0 +1,39 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 zeroOne;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float2 v = 0.0f;
+  float d = 0.0f;
+  float2 const x_37 = x_6.zeroOne;
+  v = mix(float2(2.0f, 3.0f), float2(4.0f, 5.0f), x_37);
+  float2 const x_39 = v;
+  d = distance(x_39, float2(2.0f, 5.0f));
+  float const x_41 = d;
+  if ((x_41 < 0.100000001f)) {
+    float const x_47 = v.x;
+    float const x_50 = v.y;
+    *(tint_symbol_4) = float4((x_47 - 1.0f), (x_50 - 5.0f), 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-vec-mix-uniform/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-vec-mix-uniform/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..311c2d4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-vec-mix-uniform/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,111 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 68
+; Schema: 0
+               OpCapability Shader
+         %28 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zeroOne"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v "v"
+               OpName %d "d"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %18 = OpConstantNull %v2float
+%_ptr_Function_float = OpTypePointer Function %float
+         %21 = OpConstantNull %float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+         %31 = OpConstantComposite %v2float %float_2 %float_3
+    %float_4 = OpConstant %float 4
+    %float_5 = OpConstant %float 5
+         %34 = OpConstantComposite %v2float %float_4 %float_5
+         %37 = OpConstantComposite %v2float %float_2 %float_5
+%float_0_100000001 = OpConstant %float 0.100000001
+       %bool = OpTypeBool
+     %uint_1 = OpConstant %uint 1
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %55 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %56 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %v = OpVariable %_ptr_Function_v2float Function %18
+          %d = OpVariable %_ptr_Function_float Function %21
+         %25 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %26 = OpLoad %v2float %25
+         %27 = OpExtInst %v2float %28 FMix %31 %34 %26
+               OpStore %v %27
+         %35 = OpLoad %v2float %v
+         %36 = OpExtInst %float %28 Distance %35 %37
+               OpStore %d %36
+         %38 = OpLoad %float %d
+         %40 = OpFOrdLessThan %bool %38 %float_0_100000001
+               OpSelectionMerge %42 None
+               OpBranchConditional %40 %43 %44
+         %43 = OpLabel
+         %45 = OpAccessChain %_ptr_Function_float %v %uint_0
+         %46 = OpLoad %float %45
+         %48 = OpAccessChain %_ptr_Function_float %v %uint_1
+         %49 = OpLoad %float %48
+         %51 = OpFSub %float %46 %float_1
+         %52 = OpFSub %float %49 %float_5
+         %54 = OpCompositeConstruct %v4float %51 %52 %float_0 %float_1
+               OpStore %x_GLF_color %54
+               OpBranch %42
+         %44 = OpLabel
+               OpStore %x_GLF_color %55
+               OpBranch %42
+         %42 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %56
+%tint_symbol = OpFunctionParameter %main_out
+         %60 = OpLabel
+         %61 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %61
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %63 = OpLabel
+         %64 = OpFunctionCall %void %main_1
+         %66 = OpLoad %v4float %x_GLF_color
+         %67 = OpCompositeConstruct %main_out %66
+         %65 = OpFunctionCall %void %tint_symbol_2 %67
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-vec-mix-uniform/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-vec-mix-uniform/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..d0d096b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-vec-mix-uniform/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,37 @@
+[[block]]
+struct buf0 {
+  zeroOne : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v : vec2<f32>;
+  var d : f32;
+  let x_37 : vec2<f32> = x_6.zeroOne;
+  v = mix(vec2<f32>(2.0, 3.0), vec2<f32>(4.0, 5.0), x_37);
+  let x_39 : vec2<f32> = v;
+  d = distance(x_39, vec2<f32>(2.0, 5.0));
+  let x_41 : f32 = d;
+  if ((x_41 < 0.100000001)) {
+    let x_47 : f32 = v.x;
+    let x_50 : f32 = v.y;
+    x_GLF_color = vec4<f32>((x_47 - 1.0), (x_50 - 5.0), 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-vec-mix-uniform/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-vec-mix-uniform/0-opt.wgsl
new file mode 100644
index 0000000..d0d096b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-vec-mix-uniform/0-opt.wgsl
@@ -0,0 +1,37 @@
+[[block]]
+struct buf0 {
+  zeroOne : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v : vec2<f32>;
+  var d : f32;
+  let x_37 : vec2<f32> = x_6.zeroOne;
+  v = mix(vec2<f32>(2.0, 3.0), vec2<f32>(4.0, 5.0), x_37);
+  let x_39 : vec2<f32> = v;
+  d = distance(x_39, vec2<f32>(2.0, 5.0));
+  let x_41 : f32 = d;
+  if ((x_41 < 0.100000001)) {
+    let x_47 : f32 = v.x;
+    let x_50 : f32 = v.y;
+    x_GLF_color = vec4<f32>((x_47 - 1.0), (x_50 - 5.0), 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-vec-mix-uniform/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-vec-mix-uniform/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..037715d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-vec-mix-uniform/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,34 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2 v = float2(0.0f, 0.0f);
+  float d = 0.0f;
+  const float2 x_37 = asfloat(x_6[0].xy);
+  v = lerp(float2(2.0f, 3.0f), float2(4.0f, 5.0f), x_37);
+  d = distance(v, float2(2.0f, 5.0f));
+  if ((d < 0.100000001f)) {
+    const float x_47 = v.x;
+    const float x_50 = v.y;
+    x_GLF_color = float4((x_47 - 1.0f), (x_50 - 5.0f), 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-vec-mix-uniform/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-vec-mix-uniform/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..bea0ac6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-vec-mix-uniform/0-opt.wgsl.expected.msl
@@ -0,0 +1,39 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 zeroOne;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float2 v = 0.0f;
+  float d = 0.0f;
+  float2 const x_37 = x_6.zeroOne;
+  v = mix(float2(2.0f, 3.0f), float2(4.0f, 5.0f), x_37);
+  float2 const x_39 = v;
+  d = distance(x_39, float2(2.0f, 5.0f));
+  float const x_41 = d;
+  if ((x_41 < 0.100000001f)) {
+    float const x_47 = v.x;
+    float const x_50 = v.y;
+    *(tint_symbol_4) = float4((x_47 - 1.0f), (x_50 - 5.0f), 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-vec-mix-uniform/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-vec-mix-uniform/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..311c2d4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-vec-mix-uniform/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,111 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 68
+; Schema: 0
+               OpCapability Shader
+         %28 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zeroOne"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v "v"
+               OpName %d "d"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %18 = OpConstantNull %v2float
+%_ptr_Function_float = OpTypePointer Function %float
+         %21 = OpConstantNull %float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+         %31 = OpConstantComposite %v2float %float_2 %float_3
+    %float_4 = OpConstant %float 4
+    %float_5 = OpConstant %float 5
+         %34 = OpConstantComposite %v2float %float_4 %float_5
+         %37 = OpConstantComposite %v2float %float_2 %float_5
+%float_0_100000001 = OpConstant %float 0.100000001
+       %bool = OpTypeBool
+     %uint_1 = OpConstant %uint 1
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %55 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %56 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %v = OpVariable %_ptr_Function_v2float Function %18
+          %d = OpVariable %_ptr_Function_float Function %21
+         %25 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %26 = OpLoad %v2float %25
+         %27 = OpExtInst %v2float %28 FMix %31 %34 %26
+               OpStore %v %27
+         %35 = OpLoad %v2float %v
+         %36 = OpExtInst %float %28 Distance %35 %37
+               OpStore %d %36
+         %38 = OpLoad %float %d
+         %40 = OpFOrdLessThan %bool %38 %float_0_100000001
+               OpSelectionMerge %42 None
+               OpBranchConditional %40 %43 %44
+         %43 = OpLabel
+         %45 = OpAccessChain %_ptr_Function_float %v %uint_0
+         %46 = OpLoad %float %45
+         %48 = OpAccessChain %_ptr_Function_float %v %uint_1
+         %49 = OpLoad %float %48
+         %51 = OpFSub %float %46 %float_1
+         %52 = OpFSub %float %49 %float_5
+         %54 = OpCompositeConstruct %v4float %51 %52 %float_0 %float_1
+               OpStore %x_GLF_color %54
+               OpBranch %42
+         %44 = OpLabel
+               OpStore %x_GLF_color %55
+               OpBranch %42
+         %42 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %56
+%tint_symbol = OpFunctionParameter %main_out
+         %60 = OpLabel
+         %61 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %61
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %63 = OpLabel
+         %64 = OpFunctionCall %void %main_1
+         %66 = OpLoad %v4float %x_GLF_color
+         %67 = OpCompositeConstruct %main_out %66
+         %65 = OpFunctionCall %void %tint_symbol_2 %67
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-vec-mix-uniform/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-vec-mix-uniform/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..d0d096b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-vec-mix-uniform/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,37 @@
+[[block]]
+struct buf0 {
+  zeroOne : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v : vec2<f32>;
+  var d : f32;
+  let x_37 : vec2<f32> = x_6.zeroOne;
+  v = mix(vec2<f32>(2.0, 3.0), vec2<f32>(4.0, 5.0), x_37);
+  let x_39 : vec2<f32> = v;
+  d = distance(x_39, vec2<f32>(2.0, 5.0));
+  let x_41 : f32 = d;
+  if ((x_41 < 0.100000001)) {
+    let x_47 : f32 = v.x;
+    let x_50 : f32 = v.y;
+    x_GLF_color = vec4<f32>((x_47 - 1.0), (x_50 - 5.0), 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-for-array-initializing-modulo/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-for-array-initializing-modulo/0-opt.spvasm
new file mode 100644
index 0000000..183b491
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-for-array-initializing-modulo/0-opt.spvasm
@@ -0,0 +1,100 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %i "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %a "a"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+%_ptr_Function__arr_int_uint_2 = OpTypePointer Function %_arr_int_uint_2
+      %int_1 = OpConstant %int 1
+      %int_3 = OpConstant %int 3
+      %v2int = OpTypeVector %int 2
+     %uint_1 = OpConstant %uint 1
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %10
+         %30 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+          %a = OpVariable %_ptr_Function__arr_int_uint_2 Function
+         %31 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %32 = OpLoad %int %31
+               OpStore %i %32
+               OpBranch %33
+         %33 = OpLabel
+               OpLoopMerge %34 %35 None
+               OpBranch %36
+         %36 = OpLabel
+         %37 = OpLoad %int %i
+         %38 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %39 = OpLoad %int %38
+         %40 = OpSLessThan %bool %37 %39
+               OpBranchConditional %40 %41 %34
+         %41 = OpLabel
+         %42 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %43 = OpLoad %int %42
+         %44 = OpLoad %int %i
+         %45 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %46 = OpLoad %int %45
+         %47 = OpCompositeConstruct %v2int %int_3 %46
+         %48 = OpCompositeConstruct %v2int %44 %44
+         %49 = OpSMod %v2int %48 %47
+         %50 = OpCompositeExtract %int %49 1
+         %51 = OpCompositeConstruct %_arr_int_uint_2 %43 %50
+               OpStore %a %51
+               OpBranch %35
+         %35 = OpLabel
+         %52 = OpLoad %int %i
+         %53 = OpIAdd %int %52 %int_1
+               OpStore %i %53
+               OpBranch %33
+         %34 = OpLabel
+         %54 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %55 = OpLoad %int %54
+         %56 = OpAccessChain %_ptr_Function_int %a %55
+         %57 = OpLoad %int %56
+         %58 = OpConvertSToF %float %57
+         %59 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %60 = OpLoad %int %59
+         %61 = OpConvertSToF %float %60
+         %62 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %63 = OpLoad %int %62
+         %64 = OpConvertSToF %float %63
+         %65 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %66 = OpLoad %int %65
+         %67 = OpAccessChain %_ptr_Function_int %a %66
+         %68 = OpLoad %int %67
+         %69 = OpConvertSToF %float %68
+         %70 = OpCompositeConstruct %v4float %58 %61 %64 %69
+               OpStore %_GLF_color %70
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-for-array-initializing-modulo/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-for-array-initializing-modulo/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..2d00ef0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-for-array-initializing-modulo/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,50 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int i = 0;
+  int a[2] = (int[2])0;
+  const int x_32 = asint(x_6[2].x);
+  i = x_32;
+  while (true) {
+    const int x_37 = i;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_39 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_37 < x_39)) {
+    } else {
+      break;
+    }
+    const int x_43 = asint(x_6[1].x);
+    const int x_44 = i;
+    const int x_46 = asint(x_6[3].x);
+    const int tint_symbol_3[2] = {x_43, (int2(x_44, x_44) % int2(3, x_46)).y};
+    a = tint_symbol_3;
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_55 = asint(x_6[2].x);
+  const int x_57 = a[x_55];
+  const int x_60 = asint(x_6[1].x);
+  const int x_63 = asint(x_6[1].x);
+  const int x_66 = asint(x_6[2].x);
+  const int x_68 = a[x_66];
+  x_GLF_color = float4(float(x_57), float(x_60), float(x_63), float(x_68));
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-for-array-initializing-modulo/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-for-array-initializing-modulo/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..e614cff
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-for-array-initializing-modulo/0-opt.spvasm.expected.msl
@@ -0,0 +1,63 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_1 {
+  int arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_5) {
+  int i = 0;
+  tint_array_wrapper_1 a = {};
+  int const x_32 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  i = x_32;
+  while (true) {
+    int const x_37 = i;
+    int const x_39 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_37 < x_39)) {
+    } else {
+      break;
+    }
+    int const x_43 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_44 = i;
+    int const x_46 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    tint_array_wrapper_1 const tint_symbol_3 = {.arr={x_43, ((int2(x_44, x_44) % int2(3, x_46))).y}};
+    a = tint_symbol_3;
+    {
+      int const x_52 = i;
+      i = (x_52 + 1);
+    }
+  }
+  int const x_55 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_57 = a.arr[x_55];
+  int const x_60 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_63 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_66 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_68 = a.arr[x_66];
+  *(tint_symbol_5) = float4(float(x_57), float(x_60), float(x_63), float(x_68));
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_6, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-for-array-initializing-modulo/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-for-array-initializing-modulo/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..0d3cc7f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-for-array-initializing-modulo/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,139 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 89
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+%_ptr_Function__arr_int_uint_2 = OpTypePointer Function %_arr_int_uint_2
+         %26 = OpConstantNull %_arr_int_uint_2
+     %uint_0 = OpConstant %uint 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+      %int_3 = OpConstant %int 3
+      %v2int = OpTypeVector %int 2
+   %main_out = OpTypeStruct %v4float
+         %77 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %21
+          %a = OpVariable %_ptr_Function__arr_int_uint_2 Function %26
+         %30 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %31 = OpLoad %int %30
+               OpStore %i %31
+               OpBranch %32
+         %32 = OpLabel
+               OpLoopMerge %33 %34 None
+               OpBranch %35
+         %35 = OpLabel
+         %36 = OpLoad %int %i
+         %38 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %39 = OpLoad %int %38
+         %40 = OpSLessThan %bool %36 %39
+               OpSelectionMerge %42 None
+               OpBranchConditional %40 %43 %44
+         %43 = OpLabel
+               OpBranch %42
+         %44 = OpLabel
+               OpBranch %33
+         %42 = OpLabel
+         %46 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %47 = OpLoad %int %46
+         %48 = OpLoad %int %i
+         %50 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %51 = OpLoad %int %50
+         %53 = OpCompositeConstruct %v2int %48 %48
+         %54 = OpCompositeConstruct %v2int %int_3 %51
+         %55 = OpSMod %v2int %53 %54
+         %56 = OpCompositeExtract %int %55 1
+         %57 = OpCompositeConstruct %_arr_int_uint_2 %47 %56
+               OpStore %a %57
+               OpBranch %34
+         %34 = OpLabel
+         %58 = OpLoad %int %i
+         %59 = OpIAdd %int %58 %int_1
+               OpStore %i %59
+               OpBranch %32
+         %33 = OpLabel
+         %60 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %61 = OpLoad %int %60
+         %62 = OpAccessChain %_ptr_Function_int %a %61
+         %63 = OpLoad %int %62
+         %64 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %65 = OpLoad %int %64
+         %66 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %67 = OpLoad %int %66
+         %68 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %69 = OpLoad %int %68
+         %70 = OpAccessChain %_ptr_Function_int %a %69
+         %71 = OpLoad %int %70
+         %72 = OpConvertSToF %float %63
+         %73 = OpConvertSToF %float %65
+         %74 = OpConvertSToF %float %67
+         %75 = OpConvertSToF %float %71
+         %76 = OpCompositeConstruct %v4float %72 %73 %74 %75
+               OpStore %x_GLF_color %76
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %77
+%tint_symbol = OpFunctionParameter %main_out
+         %81 = OpLabel
+         %82 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %82
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %84 = OpLabel
+         %85 = OpFunctionCall %void %main_1
+         %87 = OpLoad %v4float %x_GLF_color
+         %88 = OpCompositeConstruct %main_out %87
+         %86 = OpFunctionCall %void %tint_symbol_2 %88
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-for-array-initializing-modulo/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-for-array-initializing-modulo/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..d60c969
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-for-array-initializing-modulo/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,53 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  var a : array<i32, 2>;
+  let x_32 : i32 = x_6.x_GLF_uniform_int_values[2];
+  i = x_32;
+  loop {
+    let x_37 : i32 = i;
+    let x_39 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_37 < x_39)) {
+    } else {
+      break;
+    }
+    let x_43 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_44 : i32 = i;
+    let x_46 : i32 = x_6.x_GLF_uniform_int_values[3];
+    a = array<i32, 2>(x_43, ((vec2<i32>(x_44, x_44) % vec2<i32>(3, x_46))).y);
+
+    continuing {
+      let x_52 : i32 = i;
+      i = (x_52 + 1);
+    }
+  }
+  let x_55 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_57 : i32 = a[x_55];
+  let x_60 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_63 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_66 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_68 : i32 = a[x_66];
+  x_GLF_color = vec4<f32>(f32(x_57), f32(x_60), f32(x_63), f32(x_68));
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-for-array-initializing-modulo/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-for-array-initializing-modulo/0-opt.wgsl
new file mode 100644
index 0000000..d60c969
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-for-array-initializing-modulo/0-opt.wgsl
@@ -0,0 +1,53 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  var a : array<i32, 2>;
+  let x_32 : i32 = x_6.x_GLF_uniform_int_values[2];
+  i = x_32;
+  loop {
+    let x_37 : i32 = i;
+    let x_39 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_37 < x_39)) {
+    } else {
+      break;
+    }
+    let x_43 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_44 : i32 = i;
+    let x_46 : i32 = x_6.x_GLF_uniform_int_values[3];
+    a = array<i32, 2>(x_43, ((vec2<i32>(x_44, x_44) % vec2<i32>(3, x_46))).y);
+
+    continuing {
+      let x_52 : i32 = i;
+      i = (x_52 + 1);
+    }
+  }
+  let x_55 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_57 : i32 = a[x_55];
+  let x_60 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_63 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_66 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_68 : i32 = a[x_66];
+  x_GLF_color = vec4<f32>(f32(x_57), f32(x_60), f32(x_63), f32(x_68));
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-for-array-initializing-modulo/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-for-array-initializing-modulo/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..2d00ef0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-for-array-initializing-modulo/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,50 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int i = 0;
+  int a[2] = (int[2])0;
+  const int x_32 = asint(x_6[2].x);
+  i = x_32;
+  while (true) {
+    const int x_37 = i;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_39 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_37 < x_39)) {
+    } else {
+      break;
+    }
+    const int x_43 = asint(x_6[1].x);
+    const int x_44 = i;
+    const int x_46 = asint(x_6[3].x);
+    const int tint_symbol_3[2] = {x_43, (int2(x_44, x_44) % int2(3, x_46)).y};
+    a = tint_symbol_3;
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_55 = asint(x_6[2].x);
+  const int x_57 = a[x_55];
+  const int x_60 = asint(x_6[1].x);
+  const int x_63 = asint(x_6[1].x);
+  const int x_66 = asint(x_6[2].x);
+  const int x_68 = a[x_66];
+  x_GLF_color = float4(float(x_57), float(x_60), float(x_63), float(x_68));
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-for-array-initializing-modulo/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-for-array-initializing-modulo/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..e614cff
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-for-array-initializing-modulo/0-opt.wgsl.expected.msl
@@ -0,0 +1,63 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_1 {
+  int arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_5) {
+  int i = 0;
+  tint_array_wrapper_1 a = {};
+  int const x_32 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  i = x_32;
+  while (true) {
+    int const x_37 = i;
+    int const x_39 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_37 < x_39)) {
+    } else {
+      break;
+    }
+    int const x_43 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_44 = i;
+    int const x_46 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    tint_array_wrapper_1 const tint_symbol_3 = {.arr={x_43, ((int2(x_44, x_44) % int2(3, x_46))).y}};
+    a = tint_symbol_3;
+    {
+      int const x_52 = i;
+      i = (x_52 + 1);
+    }
+  }
+  int const x_55 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_57 = a.arr[x_55];
+  int const x_60 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_63 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_66 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_68 = a.arr[x_66];
+  *(tint_symbol_5) = float4(float(x_57), float(x_60), float(x_63), float(x_68));
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_6, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-for-array-initializing-modulo/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-for-array-initializing-modulo/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..0d3cc7f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-for-array-initializing-modulo/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,139 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 89
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+%_ptr_Function__arr_int_uint_2 = OpTypePointer Function %_arr_int_uint_2
+         %26 = OpConstantNull %_arr_int_uint_2
+     %uint_0 = OpConstant %uint 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+      %int_3 = OpConstant %int 3
+      %v2int = OpTypeVector %int 2
+   %main_out = OpTypeStruct %v4float
+         %77 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %21
+          %a = OpVariable %_ptr_Function__arr_int_uint_2 Function %26
+         %30 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %31 = OpLoad %int %30
+               OpStore %i %31
+               OpBranch %32
+         %32 = OpLabel
+               OpLoopMerge %33 %34 None
+               OpBranch %35
+         %35 = OpLabel
+         %36 = OpLoad %int %i
+         %38 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %39 = OpLoad %int %38
+         %40 = OpSLessThan %bool %36 %39
+               OpSelectionMerge %42 None
+               OpBranchConditional %40 %43 %44
+         %43 = OpLabel
+               OpBranch %42
+         %44 = OpLabel
+               OpBranch %33
+         %42 = OpLabel
+         %46 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %47 = OpLoad %int %46
+         %48 = OpLoad %int %i
+         %50 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %51 = OpLoad %int %50
+         %53 = OpCompositeConstruct %v2int %48 %48
+         %54 = OpCompositeConstruct %v2int %int_3 %51
+         %55 = OpSMod %v2int %53 %54
+         %56 = OpCompositeExtract %int %55 1
+         %57 = OpCompositeConstruct %_arr_int_uint_2 %47 %56
+               OpStore %a %57
+               OpBranch %34
+         %34 = OpLabel
+         %58 = OpLoad %int %i
+         %59 = OpIAdd %int %58 %int_1
+               OpStore %i %59
+               OpBranch %32
+         %33 = OpLabel
+         %60 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %61 = OpLoad %int %60
+         %62 = OpAccessChain %_ptr_Function_int %a %61
+         %63 = OpLoad %int %62
+         %64 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %65 = OpLoad %int %64
+         %66 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %67 = OpLoad %int %66
+         %68 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %69 = OpLoad %int %68
+         %70 = OpAccessChain %_ptr_Function_int %a %69
+         %71 = OpLoad %int %70
+         %72 = OpConvertSToF %float %63
+         %73 = OpConvertSToF %float %65
+         %74 = OpConvertSToF %float %67
+         %75 = OpConvertSToF %float %71
+         %76 = OpCompositeConstruct %v4float %72 %73 %74 %75
+               OpStore %x_GLF_color %76
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %77
+%tint_symbol = OpFunctionParameter %main_out
+         %81 = OpLabel
+         %82 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %82
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %84 = OpLabel
+         %85 = OpFunctionCall %void %main_1
+         %87 = OpLoad %v4float %x_GLF_color
+         %88 = OpCompositeConstruct %main_out %87
+         %86 = OpFunctionCall %void %tint_symbol_2 %88
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-for-array-initializing-modulo/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-for-array-initializing-modulo/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..d60c969
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-for-array-initializing-modulo/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,53 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  var a : array<i32, 2>;
+  let x_32 : i32 = x_6.x_GLF_uniform_int_values[2];
+  i = x_32;
+  loop {
+    let x_37 : i32 = i;
+    let x_39 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_37 < x_39)) {
+    } else {
+      break;
+    }
+    let x_43 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_44 : i32 = i;
+    let x_46 : i32 = x_6.x_GLF_uniform_int_values[3];
+    a = array<i32, 2>(x_43, ((vec2<i32>(x_44, x_44) % vec2<i32>(3, x_46))).y);
+
+    continuing {
+      let x_52 : i32 = i;
+      i = (x_52 + 1);
+    }
+  }
+  let x_55 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_57 : i32 = a[x_55];
+  let x_60 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_63 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_66 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_68 : i32 = a[x_66];
+  x_GLF_color = vec4<f32>(f32(x_57), f32(x_60), f32(x_63), f32(x_68));
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-for-loop-min-increment-array-element/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-for-loop-min-increment-array-element/0-opt.spvasm
new file mode 100644
index 0000000..1ac8707
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-for-loop-min-increment-array-element/0-opt.spvasm
@@ -0,0 +1,132 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %arr "arr"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_4 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+%_ptr_Function__arr_float_uint_3 = OpTypePointer Function %_arr_float_uint_3
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+       %buf0 = OpTypeStruct %_arr_float_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+%_ptr_Function_int = OpTypePointer Function %int
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+       %bool = OpTypeBool
+%_ptr_Function_float = OpTypePointer Function %float
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %13
+         %34 = OpLabel
+        %arr = OpVariable %_ptr_Function__arr_float_uint_3 Function
+          %i = OpVariable %_ptr_Function_int Function
+         %35 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %36 = OpLoad %float %35
+         %37 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %38 = OpLoad %float %37
+         %39 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %40 = OpLoad %float %39
+         %41 = OpCompositeConstruct %_arr_float_uint_3 %36 %38 %40
+               OpStore %arr %41
+               OpStore %i %int_1
+               OpBranch %42
+         %42 = OpLabel
+               OpLoopMerge %43 %44 None
+               OpBranch %45
+         %45 = OpLabel
+         %46 = OpLoad %int %i
+         %47 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %48 = OpLoad %int %47
+         %49 = OpExtInst %int %1 SMin %48 %int_3
+         %50 = OpSLessThan %bool %46 %49
+               OpBranchConditional %50 %51 %43
+         %51 = OpLabel
+         %52 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %53 = OpLoad %int %52
+         %54 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %55 = OpLoad %float %54
+         %56 = OpAccessChain %_ptr_Function_float %arr %53
+         %57 = OpLoad %float %56
+         %58 = OpFAdd %float %57 %55
+         %59 = OpAccessChain %_ptr_Function_float %arr %53
+               OpStore %59 %58
+               OpBranch %44
+         %44 = OpLabel
+         %60 = OpLoad %int %i
+         %61 = OpIAdd %int %60 %int_1
+               OpStore %i %61
+               OpBranch %42
+         %43 = OpLabel
+         %62 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %63 = OpLoad %int %62
+         %64 = OpAccessChain %_ptr_Function_float %arr %63
+         %65 = OpLoad %float %64
+         %66 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_3
+         %67 = OpLoad %float %66
+         %68 = OpFOrdEqual %bool %65 %67
+               OpSelectionMerge %69 None
+               OpBranchConditional %68 %70 %71
+         %70 = OpLabel
+         %72 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %73 = OpLoad %int %72
+         %74 = OpConvertSToF %float %73
+         %75 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %76 = OpLoad %int %75
+         %77 = OpConvertSToF %float %76
+         %78 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %79 = OpLoad %int %78
+         %80 = OpConvertSToF %float %79
+         %81 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %82 = OpLoad %int %81
+         %83 = OpConvertSToF %float %82
+         %84 = OpCompositeConstruct %v4float %74 %77 %80 %83
+               OpStore %_GLF_color %84
+               OpBranch %69
+         %71 = OpLabel
+         %85 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %86 = OpLoad %int %85
+         %87 = OpConvertSToF %float %86
+         %88 = OpCompositeConstruct %v4float %87 %87 %87 %87
+               OpStore %_GLF_color %88
+               OpBranch %69
+         %69 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-for-loop-min-increment-array-element/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-for-loop-min-increment-array-element/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..15bbbf8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-for-loop-min-increment-array-element/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,67 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[4];
+};
+cbuffer cbuffer_x_9 : register(b1, space0) {
+  uint4 x_9[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float arr[3] = (float[3])0;
+  int i = 0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_36 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const float x_38 = asfloat(x_6[1].x);
+  const float x_40 = asfloat(x_6[2].x);
+  const float tint_symbol_4[3] = {x_36, x_38, x_40};
+  arr = tint_symbol_4;
+  i = 1;
+  while (true) {
+    const int x_46 = i;
+    const int x_48 = asint(x_9[2].x);
+    if ((x_46 < min(x_48, 3))) {
+    } else {
+      break;
+    }
+    const int x_53 = asint(x_9[2].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const float x_55 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const float x_57 = arr[x_53];
+    arr[x_53] = (x_57 + x_55);
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_63 = asint(x_9[2].x);
+  const float x_65 = arr[x_63];
+  const float x_67 = asfloat(x_6[3].x);
+  if ((x_65 == x_67)) {
+    const int x_73 = asint(x_9[1].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_76 = asint(x_9[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_79 = asint(x_9[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const int x_82 = asint(x_9[1].x);
+    x_GLF_color = float4(float(x_73), float(x_76), float(x_79), float(x_82));
+  } else {
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_86 = asint(x_9[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const float x_87 = float(x_86);
+    x_GLF_color = float4(x_87, x_87, x_87, x_87);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-for-loop-min-increment-array-element/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-for-loop-min-increment-array-element/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..cd5d0e3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-for-loop-min-increment-array-element/0-opt.spvasm.expected.msl
@@ -0,0 +1,83 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_2 {
+  float arr[3];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_9, thread float4* const tint_symbol_5) {
+  tint_array_wrapper_2 arr = {};
+  int i = 0;
+  float const x_36 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_38 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  float const x_40 = x_6.x_GLF_uniform_float_values.arr[2].el;
+  tint_array_wrapper_2 const tint_symbol_3 = {.arr={x_36, x_38, x_40}};
+  arr = tint_symbol_3;
+  i = 1;
+  while (true) {
+    int const x_46 = i;
+    int const x_48 = x_9.x_GLF_uniform_int_values.arr[2].el;
+    if ((x_46 < min(x_48, 3))) {
+    } else {
+      break;
+    }
+    int const x_53 = x_9.x_GLF_uniform_int_values.arr[2].el;
+    float const x_55 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    float const x_57 = arr.arr[x_53];
+    arr.arr[x_53] = (x_57 + x_55);
+    {
+      int const x_60 = i;
+      i = (x_60 + 1);
+    }
+  }
+  int const x_63 = x_9.x_GLF_uniform_int_values.arr[2].el;
+  float const x_65 = arr.arr[x_63];
+  float const x_67 = x_6.x_GLF_uniform_float_values.arr[3].el;
+  if ((x_65 == x_67)) {
+    int const x_73 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_76 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    int const x_79 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    int const x_82 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_5) = float4(float(x_73), float(x_76), float(x_79), float(x_82));
+  } else {
+    int const x_86 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    float const x_87 = float(x_86);
+    *(tint_symbol_5) = float4(x_87, x_87, x_87, x_87);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_9 [[buffer(1)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-for-loop-min-increment-array-element/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-for-loop-min-increment-array-element/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..4323c1e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-for-loop-min-increment-array-element/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,174 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 109
+; Schema: 0
+               OpCapability Shader
+         %52 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %arr "arr"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_4 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+       %buf0 = OpTypeStruct %_arr_float_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_9 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+%_ptr_Function__arr_float_uint_3 = OpTypePointer Function %_arr_float_uint_3
+         %27 = OpConstantNull %_arr_float_uint_3
+%_ptr_Function_int = OpTypePointer Function %int
+         %30 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+       %bool = OpTypeBool
+%_ptr_Function_float = OpTypePointer Function %float
+   %main_out = OpTypeStruct %v4float
+         %97 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+        %arr = OpVariable %_ptr_Function__arr_float_uint_3 Function %27
+          %i = OpVariable %_ptr_Function_int Function %30
+         %34 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %35 = OpLoad %float %34
+         %37 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %38 = OpLoad %float %37
+         %40 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %41 = OpLoad %float %40
+         %42 = OpCompositeConstruct %_arr_float_uint_3 %35 %38 %41
+               OpStore %arr %42
+               OpStore %i %int_1
+               OpBranch %43
+         %43 = OpLabel
+               OpLoopMerge %44 %45 None
+               OpBranch %46
+         %46 = OpLabel
+         %47 = OpLoad %int %i
+         %49 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_2
+         %50 = OpLoad %int %49
+         %51 = OpExtInst %int %52 SMin %50 %int_3
+         %54 = OpSLessThan %bool %47 %51
+               OpSelectionMerge %56 None
+               OpBranchConditional %54 %57 %58
+         %57 = OpLabel
+               OpBranch %56
+         %58 = OpLabel
+               OpBranch %44
+         %56 = OpLabel
+         %59 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_2
+         %60 = OpLoad %int %59
+         %61 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %62 = OpLoad %float %61
+         %64 = OpAccessChain %_ptr_Function_float %arr %60
+         %65 = OpLoad %float %64
+         %66 = OpAccessChain %_ptr_Function_float %arr %60
+         %67 = OpFAdd %float %65 %62
+               OpStore %66 %67
+               OpBranch %45
+         %45 = OpLabel
+         %68 = OpLoad %int %i
+         %69 = OpIAdd %int %68 %int_1
+               OpStore %i %69
+               OpBranch %43
+         %44 = OpLabel
+         %70 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_2
+         %71 = OpLoad %int %70
+         %72 = OpAccessChain %_ptr_Function_float %arr %71
+         %73 = OpLoad %float %72
+         %74 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+         %75 = OpLoad %float %74
+         %76 = OpFOrdEqual %bool %73 %75
+               OpSelectionMerge %77 None
+               OpBranchConditional %76 %78 %79
+         %78 = OpLabel
+         %80 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %81 = OpLoad %int %80
+         %82 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %83 = OpLoad %int %82
+         %84 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %85 = OpLoad %int %84
+         %86 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %87 = OpLoad %int %86
+         %88 = OpConvertSToF %float %81
+         %89 = OpConvertSToF %float %83
+         %90 = OpConvertSToF %float %85
+         %91 = OpConvertSToF %float %87
+         %92 = OpCompositeConstruct %v4float %88 %89 %90 %91
+               OpStore %x_GLF_color %92
+               OpBranch %77
+         %79 = OpLabel
+         %93 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %94 = OpLoad %int %93
+         %95 = OpConvertSToF %float %94
+         %96 = OpCompositeConstruct %v4float %95 %95 %95 %95
+               OpStore %x_GLF_color %96
+               OpBranch %77
+         %77 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %97
+%tint_symbol = OpFunctionParameter %main_out
+        %101 = OpLabel
+        %102 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %102
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %104 = OpLabel
+        %105 = OpFunctionCall %void %main_1
+        %107 = OpLoad %v4float %x_GLF_color
+        %108 = OpCompositeConstruct %main_out %107
+        %106 = OpFunctionCall %void %tint_symbol_2 %108
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-for-loop-min-increment-array-element/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-for-loop-min-increment-array-element/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..acc05e5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-for-loop-min-increment-array-element/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,72 @@
+type Arr = [[stride(16)]] array<f32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var arr : array<f32, 3>;
+  var i : i32;
+  let x_36 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_38 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_40 : f32 = x_6.x_GLF_uniform_float_values[2];
+  arr = array<f32, 3>(x_36, x_38, x_40);
+  i = 1;
+  loop {
+    let x_46 : i32 = i;
+    let x_48 : i32 = x_9.x_GLF_uniform_int_values[2];
+    if ((x_46 < min(x_48, 3))) {
+    } else {
+      break;
+    }
+    let x_53 : i32 = x_9.x_GLF_uniform_int_values[2];
+    let x_55 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_57 : f32 = arr[x_53];
+    arr[x_53] = (x_57 + x_55);
+
+    continuing {
+      let x_60 : i32 = i;
+      i = (x_60 + 1);
+    }
+  }
+  let x_63 : i32 = x_9.x_GLF_uniform_int_values[2];
+  let x_65 : f32 = arr[x_63];
+  let x_67 : f32 = x_6.x_GLF_uniform_float_values[3];
+  if ((x_65 == x_67)) {
+    let x_73 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_76 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_79 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_82 : i32 = x_9.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_73), f32(x_76), f32(x_79), f32(x_82));
+  } else {
+    let x_86 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_87 : f32 = f32(x_86);
+    x_GLF_color = vec4<f32>(x_87, x_87, x_87, x_87);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-for-loop-min-increment-array-element/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-for-loop-min-increment-array-element/0-opt.wgsl
new file mode 100644
index 0000000..acc05e5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-for-loop-min-increment-array-element/0-opt.wgsl
@@ -0,0 +1,72 @@
+type Arr = [[stride(16)]] array<f32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var arr : array<f32, 3>;
+  var i : i32;
+  let x_36 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_38 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_40 : f32 = x_6.x_GLF_uniform_float_values[2];
+  arr = array<f32, 3>(x_36, x_38, x_40);
+  i = 1;
+  loop {
+    let x_46 : i32 = i;
+    let x_48 : i32 = x_9.x_GLF_uniform_int_values[2];
+    if ((x_46 < min(x_48, 3))) {
+    } else {
+      break;
+    }
+    let x_53 : i32 = x_9.x_GLF_uniform_int_values[2];
+    let x_55 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_57 : f32 = arr[x_53];
+    arr[x_53] = (x_57 + x_55);
+
+    continuing {
+      let x_60 : i32 = i;
+      i = (x_60 + 1);
+    }
+  }
+  let x_63 : i32 = x_9.x_GLF_uniform_int_values[2];
+  let x_65 : f32 = arr[x_63];
+  let x_67 : f32 = x_6.x_GLF_uniform_float_values[3];
+  if ((x_65 == x_67)) {
+    let x_73 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_76 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_79 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_82 : i32 = x_9.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_73), f32(x_76), f32(x_79), f32(x_82));
+  } else {
+    let x_86 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_87 : f32 = f32(x_86);
+    x_GLF_color = vec4<f32>(x_87, x_87, x_87, x_87);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-for-loop-min-increment-array-element/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-for-loop-min-increment-array-element/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..15bbbf8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-for-loop-min-increment-array-element/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,67 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[4];
+};
+cbuffer cbuffer_x_9 : register(b1, space0) {
+  uint4 x_9[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float arr[3] = (float[3])0;
+  int i = 0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_36 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const float x_38 = asfloat(x_6[1].x);
+  const float x_40 = asfloat(x_6[2].x);
+  const float tint_symbol_4[3] = {x_36, x_38, x_40};
+  arr = tint_symbol_4;
+  i = 1;
+  while (true) {
+    const int x_46 = i;
+    const int x_48 = asint(x_9[2].x);
+    if ((x_46 < min(x_48, 3))) {
+    } else {
+      break;
+    }
+    const int x_53 = asint(x_9[2].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const float x_55 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const float x_57 = arr[x_53];
+    arr[x_53] = (x_57 + x_55);
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_63 = asint(x_9[2].x);
+  const float x_65 = arr[x_63];
+  const float x_67 = asfloat(x_6[3].x);
+  if ((x_65 == x_67)) {
+    const int x_73 = asint(x_9[1].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_76 = asint(x_9[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_79 = asint(x_9[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const int x_82 = asint(x_9[1].x);
+    x_GLF_color = float4(float(x_73), float(x_76), float(x_79), float(x_82));
+  } else {
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_86 = asint(x_9[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const float x_87 = float(x_86);
+    x_GLF_color = float4(x_87, x_87, x_87, x_87);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-for-loop-min-increment-array-element/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-for-loop-min-increment-array-element/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..cd5d0e3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-for-loop-min-increment-array-element/0-opt.wgsl.expected.msl
@@ -0,0 +1,83 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_2 {
+  float arr[3];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_9, thread float4* const tint_symbol_5) {
+  tint_array_wrapper_2 arr = {};
+  int i = 0;
+  float const x_36 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_38 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  float const x_40 = x_6.x_GLF_uniform_float_values.arr[2].el;
+  tint_array_wrapper_2 const tint_symbol_3 = {.arr={x_36, x_38, x_40}};
+  arr = tint_symbol_3;
+  i = 1;
+  while (true) {
+    int const x_46 = i;
+    int const x_48 = x_9.x_GLF_uniform_int_values.arr[2].el;
+    if ((x_46 < min(x_48, 3))) {
+    } else {
+      break;
+    }
+    int const x_53 = x_9.x_GLF_uniform_int_values.arr[2].el;
+    float const x_55 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    float const x_57 = arr.arr[x_53];
+    arr.arr[x_53] = (x_57 + x_55);
+    {
+      int const x_60 = i;
+      i = (x_60 + 1);
+    }
+  }
+  int const x_63 = x_9.x_GLF_uniform_int_values.arr[2].el;
+  float const x_65 = arr.arr[x_63];
+  float const x_67 = x_6.x_GLF_uniform_float_values.arr[3].el;
+  if ((x_65 == x_67)) {
+    int const x_73 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_76 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    int const x_79 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    int const x_82 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_5) = float4(float(x_73), float(x_76), float(x_79), float(x_82));
+  } else {
+    int const x_86 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    float const x_87 = float(x_86);
+    *(tint_symbol_5) = float4(x_87, x_87, x_87, x_87);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_9 [[buffer(1)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-for-loop-min-increment-array-element/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-for-loop-min-increment-array-element/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..4323c1e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-for-loop-min-increment-array-element/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,174 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 109
+; Schema: 0
+               OpCapability Shader
+         %52 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %arr "arr"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_4 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+       %buf0 = OpTypeStruct %_arr_float_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_9 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+%_ptr_Function__arr_float_uint_3 = OpTypePointer Function %_arr_float_uint_3
+         %27 = OpConstantNull %_arr_float_uint_3
+%_ptr_Function_int = OpTypePointer Function %int
+         %30 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+       %bool = OpTypeBool
+%_ptr_Function_float = OpTypePointer Function %float
+   %main_out = OpTypeStruct %v4float
+         %97 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+        %arr = OpVariable %_ptr_Function__arr_float_uint_3 Function %27
+          %i = OpVariable %_ptr_Function_int Function %30
+         %34 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %35 = OpLoad %float %34
+         %37 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %38 = OpLoad %float %37
+         %40 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %41 = OpLoad %float %40
+         %42 = OpCompositeConstruct %_arr_float_uint_3 %35 %38 %41
+               OpStore %arr %42
+               OpStore %i %int_1
+               OpBranch %43
+         %43 = OpLabel
+               OpLoopMerge %44 %45 None
+               OpBranch %46
+         %46 = OpLabel
+         %47 = OpLoad %int %i
+         %49 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_2
+         %50 = OpLoad %int %49
+         %51 = OpExtInst %int %52 SMin %50 %int_3
+         %54 = OpSLessThan %bool %47 %51
+               OpSelectionMerge %56 None
+               OpBranchConditional %54 %57 %58
+         %57 = OpLabel
+               OpBranch %56
+         %58 = OpLabel
+               OpBranch %44
+         %56 = OpLabel
+         %59 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_2
+         %60 = OpLoad %int %59
+         %61 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %62 = OpLoad %float %61
+         %64 = OpAccessChain %_ptr_Function_float %arr %60
+         %65 = OpLoad %float %64
+         %66 = OpAccessChain %_ptr_Function_float %arr %60
+         %67 = OpFAdd %float %65 %62
+               OpStore %66 %67
+               OpBranch %45
+         %45 = OpLabel
+         %68 = OpLoad %int %i
+         %69 = OpIAdd %int %68 %int_1
+               OpStore %i %69
+               OpBranch %43
+         %44 = OpLabel
+         %70 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_2
+         %71 = OpLoad %int %70
+         %72 = OpAccessChain %_ptr_Function_float %arr %71
+         %73 = OpLoad %float %72
+         %74 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+         %75 = OpLoad %float %74
+         %76 = OpFOrdEqual %bool %73 %75
+               OpSelectionMerge %77 None
+               OpBranchConditional %76 %78 %79
+         %78 = OpLabel
+         %80 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %81 = OpLoad %int %80
+         %82 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %83 = OpLoad %int %82
+         %84 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %85 = OpLoad %int %84
+         %86 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %87 = OpLoad %int %86
+         %88 = OpConvertSToF %float %81
+         %89 = OpConvertSToF %float %83
+         %90 = OpConvertSToF %float %85
+         %91 = OpConvertSToF %float %87
+         %92 = OpCompositeConstruct %v4float %88 %89 %90 %91
+               OpStore %x_GLF_color %92
+               OpBranch %77
+         %79 = OpLabel
+         %93 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %94 = OpLoad %int %93
+         %95 = OpConvertSToF %float %94
+         %96 = OpCompositeConstruct %v4float %95 %95 %95 %95
+               OpStore %x_GLF_color %96
+               OpBranch %77
+         %77 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %97
+%tint_symbol = OpFunctionParameter %main_out
+        %101 = OpLabel
+        %102 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %102
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %104 = OpLabel
+        %105 = OpFunctionCall %void %main_1
+        %107 = OpLoad %v4float %x_GLF_color
+        %108 = OpCompositeConstruct %main_out %107
+        %106 = OpFunctionCall %void %tint_symbol_2 %108
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-for-loop-min-increment-array-element/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-for-loop-min-increment-array-element/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..acc05e5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-for-loop-min-increment-array-element/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,72 @@
+type Arr = [[stride(16)]] array<f32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var arr : array<f32, 3>;
+  var i : i32;
+  let x_36 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_38 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_40 : f32 = x_6.x_GLF_uniform_float_values[2];
+  arr = array<f32, 3>(x_36, x_38, x_40);
+  i = 1;
+  loop {
+    let x_46 : i32 = i;
+    let x_48 : i32 = x_9.x_GLF_uniform_int_values[2];
+    if ((x_46 < min(x_48, 3))) {
+    } else {
+      break;
+    }
+    let x_53 : i32 = x_9.x_GLF_uniform_int_values[2];
+    let x_55 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_57 : f32 = arr[x_53];
+    arr[x_53] = (x_57 + x_55);
+
+    continuing {
+      let x_60 : i32 = i;
+      i = (x_60 + 1);
+    }
+  }
+  let x_63 : i32 = x_9.x_GLF_uniform_int_values[2];
+  let x_65 : f32 = arr[x_63];
+  let x_67 : f32 = x_6.x_GLF_uniform_float_values[3];
+  if ((x_65 == x_67)) {
+    let x_73 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_76 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_79 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_82 : i32 = x_9.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_73), f32(x_76), f32(x_79), f32(x_82));
+  } else {
+    let x_86 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_87 : f32 = f32(x_86);
+    x_GLF_color = vec4<f32>(x_87, x_87, x_87, x_87);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-for-switch-fallthrough/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-for-switch-fallthrough/0-opt.spvasm
new file mode 100644
index 0000000..6a84984
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-for-switch-fallthrough/0-opt.spvasm
@@ -0,0 +1,107 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %10
+         %24 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+         %25 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %26 = OpLoad %int %25
+               OpStore %a %26
+         %27 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %28 = OpLoad %int %27
+               OpStore %i %28
+               OpBranch %29
+         %29 = OpLabel
+               OpLoopMerge %30 %31 None
+               OpBranch %32
+         %32 = OpLabel
+         %33 = OpLoad %int %i
+         %34 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %35 = OpLoad %int %34
+         %36 = OpSLessThan %bool %33 %35
+               OpBranchConditional %36 %37 %30
+         %37 = OpLabel
+         %38 = OpLoad %int %i
+               OpSelectionMerge %39 None
+               OpSwitch %38 %39 -1 %40 0 %40
+         %40 = OpLabel
+         %41 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %42 = OpLoad %int %41
+               OpStore %a %42
+               OpBranch %39
+         %39 = OpLabel
+               OpBranch %31
+         %31 = OpLabel
+         %43 = OpLoad %int %i
+         %44 = OpIAdd %int %43 %int_1
+               OpStore %i %44
+               OpBranch %29
+         %30 = OpLabel
+         %45 = OpLoad %int %a
+         %46 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %47 = OpLoad %int %46
+         %48 = OpIEqual %bool %45 %47
+               OpSelectionMerge %49 None
+               OpBranchConditional %48 %50 %51
+         %50 = OpLabel
+         %52 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %53 = OpLoad %int %52
+         %54 = OpConvertSToF %float %53
+         %55 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %56 = OpLoad %int %55
+         %57 = OpConvertSToF %float %56
+         %58 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %59 = OpLoad %int %58
+         %60 = OpConvertSToF %float %59
+         %61 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %62 = OpLoad %int %61
+         %63 = OpConvertSToF %float %62
+         %64 = OpCompositeConstruct %v4float %54 %57 %60 %63
+               OpStore %_GLF_color %64
+               OpBranch %49
+         %51 = OpLabel
+         %65 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %66 = OpLoad %int %65
+         %67 = OpConvertSToF %float %66
+         %68 = OpCompositeConstruct %v4float %67 %67 %67 %67
+               OpStore %_GLF_color %68
+               OpBranch %49
+         %49 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-for-switch-fallthrough/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-for-switch-fallthrough/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..40b4b79
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-for-switch-fallthrough/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,64 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  int i = 0;
+  const int x_26 = asint(x_6[2].x);
+  a = x_26;
+  const int x_28 = asint(x_6[2].x);
+  i = x_28;
+  while (true) {
+    const int x_33 = i;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_35 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_33 < x_35)) {
+    } else {
+      break;
+    }
+    switch(i) {
+      case 0:
+      case -1: {
+        const int x_42 = asint(x_6[1].x);
+        a = x_42;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_45 = a;
+  const int x_47 = asint(x_6[1].x);
+  if ((x_45 == x_47)) {
+    const int x_53 = asint(x_6[1].x);
+    const int x_56 = asint(x_6[2].x);
+    const int x_59 = asint(x_6[2].x);
+    const int x_62 = asint(x_6[1].x);
+    x_GLF_color = float4(float(x_53), float(x_56), float(x_59), float(x_62));
+  } else {
+    const int x_66 = asint(x_6[2].x);
+    const float x_67 = float(x_66);
+    x_GLF_color = float4(x_67, x_67, x_67, x_67);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-for-switch-fallthrough/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-for-switch-fallthrough/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..cb70f17
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-for-switch-fallthrough/0-opt.spvasm.expected.msl
@@ -0,0 +1,75 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int i = 0;
+  int const x_26 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  a = x_26;
+  int const x_28 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  i = x_28;
+  while (true) {
+    int const x_33 = i;
+    int const x_35 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_33 < x_35)) {
+    } else {
+      break;
+    }
+    int const x_38 = i;
+    switch(x_38) {
+      case 0:
+      case -1: {
+        int const x_42 = x_6.x_GLF_uniform_int_values.arr[1].el;
+        a = x_42;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    {
+      int const x_43 = i;
+      i = (x_43 + 1);
+    }
+  }
+  int const x_45 = a;
+  int const x_47 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_45 == x_47)) {
+    int const x_53 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_56 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_59 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_62 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_53), float(x_56), float(x_59), float(x_62));
+  } else {
+    int const x_66 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    float const x_67 = float(x_66);
+    *(tint_symbol_4) = float4(x_67, x_67, x_67, x_67);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-for-switch-fallthrough/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-for-switch-fallthrough/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..89156fd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-for-switch-fallthrough/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,147 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 88
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %76 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+          %i = OpVariable %_ptr_Function_int Function %21
+         %26 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %27 = OpLoad %int %26
+               OpStore %a %27
+         %28 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %29 = OpLoad %int %28
+               OpStore %i %29
+               OpBranch %30
+         %30 = OpLabel
+               OpLoopMerge %31 %32 None
+               OpBranch %33
+         %33 = OpLabel
+         %34 = OpLoad %int %i
+         %36 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %37 = OpLoad %int %36
+         %38 = OpSLessThan %bool %34 %37
+               OpSelectionMerge %40 None
+               OpBranchConditional %38 %41 %42
+         %41 = OpLabel
+               OpBranch %40
+         %42 = OpLabel
+               OpBranch %31
+         %40 = OpLabel
+         %43 = OpLoad %int %i
+               OpSelectionMerge %44 None
+               OpSwitch %43 %45 0 %46 -1 %46
+         %46 = OpLabel
+         %48 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %49 = OpLoad %int %48
+               OpStore %a %49
+               OpBranch %44
+         %45 = OpLabel
+               OpBranch %44
+         %44 = OpLabel
+               OpBranch %32
+         %32 = OpLabel
+         %50 = OpLoad %int %i
+         %51 = OpIAdd %int %50 %int_1
+               OpStore %i %51
+               OpBranch %30
+         %31 = OpLabel
+         %52 = OpLoad %int %a
+         %53 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %54 = OpLoad %int %53
+         %55 = OpIEqual %bool %52 %54
+               OpSelectionMerge %56 None
+               OpBranchConditional %55 %57 %58
+         %57 = OpLabel
+         %59 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %60 = OpLoad %int %59
+         %61 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %62 = OpLoad %int %61
+         %63 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %64 = OpLoad %int %63
+         %65 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %66 = OpLoad %int %65
+         %67 = OpConvertSToF %float %60
+         %68 = OpConvertSToF %float %62
+         %69 = OpConvertSToF %float %64
+         %70 = OpConvertSToF %float %66
+         %71 = OpCompositeConstruct %v4float %67 %68 %69 %70
+               OpStore %x_GLF_color %71
+               OpBranch %56
+         %58 = OpLabel
+         %72 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %73 = OpLoad %int %72
+         %74 = OpConvertSToF %float %73
+         %75 = OpCompositeConstruct %v4float %74 %74 %74 %74
+               OpStore %x_GLF_color %75
+               OpBranch %56
+         %56 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %76
+%tint_symbol = OpFunctionParameter %main_out
+         %80 = OpLabel
+         %81 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %81
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %83 = OpLabel
+         %84 = OpFunctionCall %void %main_1
+         %86 = OpLoad %v4float %x_GLF_color
+         %87 = OpCompositeConstruct %main_out %86
+         %85 = OpFunctionCall %void %tint_symbol_2 %87
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-for-switch-fallthrough/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-for-switch-fallthrough/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..5bce8a9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-for-switch-fallthrough/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,66 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  let x_26 : i32 = x_6.x_GLF_uniform_int_values[2];
+  a = x_26;
+  let x_28 : i32 = x_6.x_GLF_uniform_int_values[2];
+  i = x_28;
+  loop {
+    let x_33 : i32 = i;
+    let x_35 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_33 < x_35)) {
+    } else {
+      break;
+    }
+    let x_38 : i32 = i;
+    switch(x_38) {
+      case 0, -1: {
+        let x_42 : i32 = x_6.x_GLF_uniform_int_values[1];
+        a = x_42;
+      }
+      default: {
+      }
+    }
+
+    continuing {
+      let x_43 : i32 = i;
+      i = (x_43 + 1);
+    }
+  }
+  let x_45 : i32 = a;
+  let x_47 : i32 = x_6.x_GLF_uniform_int_values[1];
+  if ((x_45 == x_47)) {
+    let x_53 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_56 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_59 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_62 : i32 = x_6.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_53), f32(x_56), f32(x_59), f32(x_62));
+  } else {
+    let x_66 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_67 : f32 = f32(x_66);
+    x_GLF_color = vec4<f32>(x_67, x_67, x_67, x_67);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-for-switch-fallthrough/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-for-switch-fallthrough/0-opt.wgsl
new file mode 100644
index 0000000..5bce8a9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-for-switch-fallthrough/0-opt.wgsl
@@ -0,0 +1,66 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  let x_26 : i32 = x_6.x_GLF_uniform_int_values[2];
+  a = x_26;
+  let x_28 : i32 = x_6.x_GLF_uniform_int_values[2];
+  i = x_28;
+  loop {
+    let x_33 : i32 = i;
+    let x_35 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_33 < x_35)) {
+    } else {
+      break;
+    }
+    let x_38 : i32 = i;
+    switch(x_38) {
+      case 0, -1: {
+        let x_42 : i32 = x_6.x_GLF_uniform_int_values[1];
+        a = x_42;
+      }
+      default: {
+      }
+    }
+
+    continuing {
+      let x_43 : i32 = i;
+      i = (x_43 + 1);
+    }
+  }
+  let x_45 : i32 = a;
+  let x_47 : i32 = x_6.x_GLF_uniform_int_values[1];
+  if ((x_45 == x_47)) {
+    let x_53 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_56 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_59 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_62 : i32 = x_6.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_53), f32(x_56), f32(x_59), f32(x_62));
+  } else {
+    let x_66 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_67 : f32 = f32(x_66);
+    x_GLF_color = vec4<f32>(x_67, x_67, x_67, x_67);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-for-switch-fallthrough/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-for-switch-fallthrough/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..40b4b79
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-for-switch-fallthrough/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,64 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  int i = 0;
+  const int x_26 = asint(x_6[2].x);
+  a = x_26;
+  const int x_28 = asint(x_6[2].x);
+  i = x_28;
+  while (true) {
+    const int x_33 = i;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_35 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_33 < x_35)) {
+    } else {
+      break;
+    }
+    switch(i) {
+      case 0:
+      case -1: {
+        const int x_42 = asint(x_6[1].x);
+        a = x_42;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_45 = a;
+  const int x_47 = asint(x_6[1].x);
+  if ((x_45 == x_47)) {
+    const int x_53 = asint(x_6[1].x);
+    const int x_56 = asint(x_6[2].x);
+    const int x_59 = asint(x_6[2].x);
+    const int x_62 = asint(x_6[1].x);
+    x_GLF_color = float4(float(x_53), float(x_56), float(x_59), float(x_62));
+  } else {
+    const int x_66 = asint(x_6[2].x);
+    const float x_67 = float(x_66);
+    x_GLF_color = float4(x_67, x_67, x_67, x_67);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-for-switch-fallthrough/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-for-switch-fallthrough/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..cb70f17
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-for-switch-fallthrough/0-opt.wgsl.expected.msl
@@ -0,0 +1,75 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int i = 0;
+  int const x_26 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  a = x_26;
+  int const x_28 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  i = x_28;
+  while (true) {
+    int const x_33 = i;
+    int const x_35 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_33 < x_35)) {
+    } else {
+      break;
+    }
+    int const x_38 = i;
+    switch(x_38) {
+      case 0:
+      case -1: {
+        int const x_42 = x_6.x_GLF_uniform_int_values.arr[1].el;
+        a = x_42;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    {
+      int const x_43 = i;
+      i = (x_43 + 1);
+    }
+  }
+  int const x_45 = a;
+  int const x_47 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_45 == x_47)) {
+    int const x_53 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_56 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_59 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_62 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_53), float(x_56), float(x_59), float(x_62));
+  } else {
+    int const x_66 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    float const x_67 = float(x_66);
+    *(tint_symbol_4) = float4(x_67, x_67, x_67, x_67);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-for-switch-fallthrough/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-for-switch-fallthrough/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..89156fd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-for-switch-fallthrough/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,147 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 88
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %76 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+          %i = OpVariable %_ptr_Function_int Function %21
+         %26 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %27 = OpLoad %int %26
+               OpStore %a %27
+         %28 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %29 = OpLoad %int %28
+               OpStore %i %29
+               OpBranch %30
+         %30 = OpLabel
+               OpLoopMerge %31 %32 None
+               OpBranch %33
+         %33 = OpLabel
+         %34 = OpLoad %int %i
+         %36 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %37 = OpLoad %int %36
+         %38 = OpSLessThan %bool %34 %37
+               OpSelectionMerge %40 None
+               OpBranchConditional %38 %41 %42
+         %41 = OpLabel
+               OpBranch %40
+         %42 = OpLabel
+               OpBranch %31
+         %40 = OpLabel
+         %43 = OpLoad %int %i
+               OpSelectionMerge %44 None
+               OpSwitch %43 %45 0 %46 -1 %46
+         %46 = OpLabel
+         %48 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %49 = OpLoad %int %48
+               OpStore %a %49
+               OpBranch %44
+         %45 = OpLabel
+               OpBranch %44
+         %44 = OpLabel
+               OpBranch %32
+         %32 = OpLabel
+         %50 = OpLoad %int %i
+         %51 = OpIAdd %int %50 %int_1
+               OpStore %i %51
+               OpBranch %30
+         %31 = OpLabel
+         %52 = OpLoad %int %a
+         %53 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %54 = OpLoad %int %53
+         %55 = OpIEqual %bool %52 %54
+               OpSelectionMerge %56 None
+               OpBranchConditional %55 %57 %58
+         %57 = OpLabel
+         %59 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %60 = OpLoad %int %59
+         %61 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %62 = OpLoad %int %61
+         %63 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %64 = OpLoad %int %63
+         %65 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %66 = OpLoad %int %65
+         %67 = OpConvertSToF %float %60
+         %68 = OpConvertSToF %float %62
+         %69 = OpConvertSToF %float %64
+         %70 = OpConvertSToF %float %66
+         %71 = OpCompositeConstruct %v4float %67 %68 %69 %70
+               OpStore %x_GLF_color %71
+               OpBranch %56
+         %58 = OpLabel
+         %72 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %73 = OpLoad %int %72
+         %74 = OpConvertSToF %float %73
+         %75 = OpCompositeConstruct %v4float %74 %74 %74 %74
+               OpStore %x_GLF_color %75
+               OpBranch %56
+         %56 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %76
+%tint_symbol = OpFunctionParameter %main_out
+         %80 = OpLabel
+         %81 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %81
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %83 = OpLabel
+         %84 = OpFunctionCall %void %main_1
+         %86 = OpLoad %v4float %x_GLF_color
+         %87 = OpCompositeConstruct %main_out %86
+         %85 = OpFunctionCall %void %tint_symbol_2 %87
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-for-switch-fallthrough/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-for-switch-fallthrough/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..5bce8a9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-for-switch-fallthrough/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,66 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  let x_26 : i32 = x_6.x_GLF_uniform_int_values[2];
+  a = x_26;
+  let x_28 : i32 = x_6.x_GLF_uniform_int_values[2];
+  i = x_28;
+  loop {
+    let x_33 : i32 = i;
+    let x_35 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_33 < x_35)) {
+    } else {
+      break;
+    }
+    let x_38 : i32 = i;
+    switch(x_38) {
+      case 0, -1: {
+        let x_42 : i32 = x_6.x_GLF_uniform_int_values[1];
+        a = x_42;
+      }
+      default: {
+      }
+    }
+
+    continuing {
+      let x_43 : i32 = i;
+      i = (x_43 + 1);
+    }
+  }
+  let x_45 : i32 = a;
+  let x_47 : i32 = x_6.x_GLF_uniform_int_values[1];
+  if ((x_45 == x_47)) {
+    let x_53 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_56 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_59 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_62 : i32 = x_6.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_53), f32(x_56), f32(x_59), f32(x_62));
+  } else {
+    let x_66 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_67 : f32 = f32(x_66);
+    x_GLF_color = vec4<f32>(x_67, x_67, x_67, x_67);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fract-asin-undefined-never-used/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fract-asin-undefined-never-used/0-opt.spvasm
new file mode 100644
index 0000000..b22a5e5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fract-asin-undefined-never-used/0-opt.spvasm
@@ -0,0 +1,97 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %f0 "f0"
+               OpName %f1 "f1"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+%float_0x1_8p_128 = OpConstant %float 0x1.8p+128
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %main = OpFunction %void None %14
+         %34 = OpLabel
+         %f0 = OpVariable %_ptr_Function_float Function
+         %f1 = OpVariable %_ptr_Function_float Function
+               OpStore %f0 %float_0x1_8p_128
+         %35 = OpLoad %float %f0
+         %36 = OpExtInst %float %1 Fract %35
+               OpStore %f1 %36
+         %37 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %38 = OpLoad %float %37
+         %39 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %40 = OpLoad %float %39
+         %41 = OpFOrdGreaterThan %bool %38 %40
+               OpSelectionMerge %42 None
+               OpBranchConditional %41 %43 %44
+         %43 = OpLabel
+         %45 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %46 = OpLoad %int %45
+         %47 = OpConvertSToF %float %46
+         %48 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %49 = OpLoad %int %48
+         %50 = OpConvertSToF %float %49
+         %51 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %52 = OpLoad %int %51
+         %53 = OpConvertSToF %float %52
+         %54 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %55 = OpLoad %int %54
+         %56 = OpConvertSToF %float %55
+         %57 = OpCompositeConstruct %v4float %47 %50 %53 %56
+               OpStore %_GLF_color %57
+               OpBranch %42
+         %44 = OpLabel
+         %58 = OpLoad %float %f1
+         %59 = OpCompositeConstruct %v4float %58 %58 %58 %58
+               OpStore %_GLF_color %59
+               OpBranch %42
+         %42 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fract-asin-undefined-never-used/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-fract-asin-undefined-never-used/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..8f9bef0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fract-asin-undefined-never-used/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,50 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+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);
+cbuffer cbuffer_x_10 : register(b1, space0) {
+  uint4 x_10[2];
+};
+
+void main_1() {
+  float f0 = 0.0f;
+  float f1 = 0.0f;
+  f0 = asfloat(0x7fc00000u);
+  f1 = frac(f0);
+  const float x_38 = gl_FragCoord.x;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_40 = asfloat(x_8[scalar_offset / 4][scalar_offset % 4]);
+  if ((x_38 > x_40)) {
+    const int x_46 = asint(x_10[1].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_49 = asint(x_10[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_52 = asint(x_10[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_55 = asint(x_10[1].x);
+    x_GLF_color = float4(float(x_46), float(x_49), float(x_52), float(x_55));
+  } else {
+    const float x_58 = f1;
+    x_GLF_color = float4(x_58, x_58, x_58, x_58);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fract-asin-undefined-never-used/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-fract-asin-undefined-never-used/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..0fb34b5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fract-asin-undefined-never-used/0-opt.spvasm.expected.msl
@@ -0,0 +1,61 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_8, constant buf1& x_10, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float f0 = 0.0f;
+  float f1 = 0.0f;
+  f0 = NAN;
+  float const x_35 = f0;
+  f1 = fract(x_35);
+  float const x_38 = (*(tint_symbol_5)).x;
+  float const x_40 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_38 > x_40)) {
+    int const x_46 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_49 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    int const x_52 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    int const x_55 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_6) = float4(float(x_46), float(x_49), float(x_52), float(x_55));
+  } else {
+    float const x_58 = f1;
+    *(tint_symbol_6) = float4(x_58, x_58, x_58, x_58);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_8 [[buffer(0)]], constant buf1& x_10 [[buffer(1)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_8, x_10, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fract-asin-undefined-never-used/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fract-asin-undefined-never-used/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..2097959
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fract-asin-undefined-never-used/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,135 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 78
+; Schema: 0
+               OpCapability Shader
+         %34 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %f0 "f0"
+               OpName %f1 "f1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 1
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_10 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %29 = OpConstantNull %float
+%float_0x1_8p_128 = OpConstant %float 0x1.8p+128
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+         %65 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %23
+         %26 = OpLabel
+         %f0 = OpVariable %_ptr_Function_float Function %29
+         %f1 = OpVariable %_ptr_Function_float Function %29
+               OpStore %f0 %float_0x1_8p_128
+         %32 = OpLoad %float %f0
+         %33 = OpExtInst %float %34 Fract %32
+               OpStore %f1 %33
+         %37 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %38 = OpLoad %float %37
+         %41 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %42 = OpLoad %float %41
+         %43 = OpFOrdGreaterThan %bool %38 %42
+               OpSelectionMerge %45 None
+               OpBranchConditional %43 %46 %47
+         %46 = OpLabel
+         %50 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %51 = OpLoad %int %50
+         %52 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %53 = OpLoad %int %52
+         %54 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %55 = OpLoad %int %54
+         %56 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %57 = OpLoad %int %56
+         %58 = OpConvertSToF %float %51
+         %59 = OpConvertSToF %float %53
+         %60 = OpConvertSToF %float %55
+         %61 = OpConvertSToF %float %57
+         %62 = OpCompositeConstruct %v4float %58 %59 %60 %61
+               OpStore %x_GLF_color %62
+               OpBranch %45
+         %47 = OpLabel
+         %63 = OpLoad %float %f1
+         %64 = OpCompositeConstruct %v4float %63 %63 %63 %63
+               OpStore %x_GLF_color %64
+               OpBranch %45
+         %45 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %65
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %69 = OpLabel
+         %70 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %70
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %23
+         %72 = OpLabel
+         %73 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %73
+         %74 = OpFunctionCall %void %main_1
+         %76 = OpLoad %v4float %x_GLF_color
+         %77 = OpCompositeConstruct %main_out %76
+         %75 = OpFunctionCall %void %tint_symbol_3 %77
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fract-asin-undefined-never-used/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fract-asin-undefined-never-used/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..4f8be8c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fract-asin-undefined-never-used/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,54 @@
+type Arr = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+fn main_1() {
+  var f0 : f32;
+  var f1 : f32;
+  f0 = 0x1.8p+128;
+  let x_35 : f32 = f0;
+  f1 = fract(x_35);
+  let x_38 : f32 = gl_FragCoord.x;
+  let x_40 : f32 = x_8.x_GLF_uniform_float_values[0];
+  if ((x_38 > x_40)) {
+    let x_46 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_49 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_52 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_55 : i32 = x_10.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_46), f32(x_49), f32(x_52), f32(x_55));
+  } else {
+    let x_58 : f32 = f1;
+    x_GLF_color = vec4<f32>(x_58, x_58, x_58, x_58);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fract-asin-undefined-never-used/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fract-asin-undefined-never-used/0-opt.wgsl
new file mode 100644
index 0000000..4f8be8c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fract-asin-undefined-never-used/0-opt.wgsl
@@ -0,0 +1,54 @@
+type Arr = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+fn main_1() {
+  var f0 : f32;
+  var f1 : f32;
+  f0 = 0x1.8p+128;
+  let x_35 : f32 = f0;
+  f1 = fract(x_35);
+  let x_38 : f32 = gl_FragCoord.x;
+  let x_40 : f32 = x_8.x_GLF_uniform_float_values[0];
+  if ((x_38 > x_40)) {
+    let x_46 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_49 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_52 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_55 : i32 = x_10.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_46), f32(x_49), f32(x_52), f32(x_55));
+  } else {
+    let x_58 : f32 = f1;
+    x_GLF_color = vec4<f32>(x_58, x_58, x_58, x_58);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fract-asin-undefined-never-used/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-fract-asin-undefined-never-used/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..560771b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fract-asin-undefined-never-used/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,6 @@
+SKIP: FAILED
+
+graphicsfuzz/cov-fract-asin-undefined-never-used/0-opt.wgsl:26:11 error: expected ';' for assignment statement
+  f0 = 0x1.8p+128;
+          ^^
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fract-asin-undefined-never-used/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-fract-asin-undefined-never-used/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..560771b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fract-asin-undefined-never-used/0-opt.wgsl.expected.msl
@@ -0,0 +1,6 @@
+SKIP: FAILED
+
+graphicsfuzz/cov-fract-asin-undefined-never-used/0-opt.wgsl:26:11 error: expected ';' for assignment statement
+  f0 = 0x1.8p+128;
+          ^^
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fract-asin-undefined-never-used/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fract-asin-undefined-never-used/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..560771b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fract-asin-undefined-never-used/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,6 @@
+SKIP: FAILED
+
+graphicsfuzz/cov-fract-asin-undefined-never-used/0-opt.wgsl:26:11 error: expected ';' for assignment statement
+  f0 = 0x1.8p+128;
+          ^^
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fract-asin-undefined-never-used/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fract-asin-undefined-never-used/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..560771b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fract-asin-undefined-never-used/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+SKIP: FAILED
+
+graphicsfuzz/cov-fract-asin-undefined-never-used/0-opt.wgsl:26:11 error: expected ';' for assignment statement
+  f0 = 0x1.8p+128;
+          ^^
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fract-smoothstep-undefined/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fract-smoothstep-undefined/0-opt.spvasm
new file mode 100644
index 0000000..a985dd6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fract-smoothstep-undefined/0-opt.spvasm
@@ -0,0 +1,101 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %v1 "v1"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %b "b"
+               OpName %a "a"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_1 = OpConstant %float 1
+         %23 = OpConstantComposite %v2float %float_1 %float_1
+     %uint_0 = OpConstant %uint 0
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %bool = OpTypeBool
+       %main = OpFunction %void None %11
+         %28 = OpLabel
+         %v1 = OpVariable %_ptr_Function_v2float Function
+          %b = OpVariable %_ptr_Function_v2float Function
+          %a = OpVariable %_ptr_Function_float Function
+         %29 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %30 = OpLoad %float %29
+         %31 = OpCompositeConstruct %v2float %30 %30
+               OpStore %v1 %31
+         %32 = OpLoad %v2float %v1
+         %33 = OpExtInst %v2float %1 Fract %32
+               OpStore %b %33
+         %34 = OpLoad %v2float %b
+         %35 = OpExtInst %v2float %1 SmoothStep %23 %23 %34
+         %36 = OpCompositeExtract %float %35 0
+               OpStore %a %36
+         %37 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %38 = OpLoad %float %37
+         %39 = OpLoad %float %a
+         %40 = OpLoad %float %a
+         %41 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %42 = OpLoad %float %41
+         %43 = OpCompositeConstruct %v4float %38 %39 %40 %42
+               OpStore %_GLF_color %43
+         %44 = OpAccessChain %_ptr_Function_float %b %uint_0
+         %45 = OpLoad %float %44
+         %46 = OpFOrdLessThan %bool %45 %float_1
+               OpSelectionMerge %47 None
+               OpBranchConditional %46 %48 %47
+         %48 = OpLabel
+         %49 = OpAccessChain %_ptr_Function_float %b %uint_1
+         %50 = OpLoad %float %49
+         %51 = OpFOrdLessThan %bool %50 %float_1
+               OpBranch %47
+         %47 = OpLabel
+         %52 = OpPhi %bool %46 %28 %51 %48
+               OpSelectionMerge %53 None
+               OpBranchConditional %52 %54 %55
+         %54 = OpLabel
+         %56 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %57 = OpLoad %float %56
+         %58 = OpAccessChain %_ptr_Function_float %b %uint_0
+         %59 = OpLoad %float %58
+         %60 = OpAccessChain %_ptr_Function_float %b %uint_1
+         %61 = OpLoad %float %60
+         %62 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %63 = OpLoad %float %62
+         %64 = OpCompositeConstruct %v4float %57 %59 %61 %63
+               OpStore %_GLF_color %64
+               OpBranch %53
+         %55 = OpLabel
+         %65 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %66 = OpLoad %float %65
+         %67 = OpCompositeConstruct %v4float %66 %66 %66 %66
+               OpStore %_GLF_color %67
+               OpBranch %53
+         %53 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fract-smoothstep-undefined/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-fract-smoothstep-undefined/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..e520d49
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fract-smoothstep-undefined/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,60 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2 v1 = float2(0.0f, 0.0f);
+  float2 b = float2(0.0f, 0.0f);
+  float a = 0.0f;
+  bool x_51 = false;
+  bool x_52_phi = false;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_30 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  v1 = float2(x_30, x_30);
+  b = frac(v1);
+  a = smoothstep(float2(1.0f, 1.0f), float2(1.0f, 1.0f), b).x;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_38 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const float x_39 = a;
+  const float x_40 = a;
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const float x_42 = asfloat(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  x_GLF_color = float4(x_38, x_39, x_40, x_42);
+  const float x_45 = b.x;
+  const bool x_46 = (x_45 < 1.0f);
+  x_52_phi = x_46;
+  if (x_46) {
+    const float x_50 = b.y;
+    x_51 = (x_50 < 1.0f);
+    x_52_phi = x_51;
+  }
+  if (x_52_phi) {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const float x_57 = asfloat(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const float x_59 = b.x;
+    const float x_61 = b.y;
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const float x_63 = asfloat(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    x_GLF_color = float4(x_57, x_59, x_61, x_63);
+  } else {
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const float x_66 = asfloat(x_6[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    x_GLF_color = float4(x_66, x_66, x_66, x_66);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fract-smoothstep-undefined/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-fract-smoothstep-undefined/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..18c63cf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fract-smoothstep-undefined/0-opt.spvasm.expected.msl
@@ -0,0 +1,67 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float2 v1 = 0.0f;
+  float2 b = 0.0f;
+  float a = 0.0f;
+  bool x_51 = false;
+  bool x_52_phi = false;
+  float const x_30 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  v1 = float2(x_30, x_30);
+  float2 const x_32 = v1;
+  b = fract(x_32);
+  float2 const x_34 = b;
+  a = smoothstep(float2(1.0f, 1.0f), float2(1.0f, 1.0f), x_34).x;
+  float const x_38 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_39 = a;
+  float const x_40 = a;
+  float const x_42 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  *(tint_symbol_4) = float4(x_38, x_39, x_40, x_42);
+  float const x_45 = b.x;
+  bool const x_46 = (x_45 < 1.0f);
+  x_52_phi = x_46;
+  if (x_46) {
+    float const x_50 = b.y;
+    x_51 = (x_50 < 1.0f);
+    x_52_phi = x_51;
+  }
+  bool const x_52 = x_52_phi;
+  if (x_52) {
+    float const x_57 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    float const x_59 = b.x;
+    float const x_61 = b.y;
+    float const x_63 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    *(tint_symbol_4) = float4(x_57, x_59, x_61, x_63);
+  } else {
+    float const x_66 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    *(tint_symbol_4) = float4(x_66, x_66, x_66, x_66);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fract-smoothstep-undefined/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fract-smoothstep-undefined/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..8371f68
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fract-smoothstep-undefined/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,145 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 90
+; Schema: 0
+               OpCapability Shader
+         %40 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v1 "v1"
+               OpName %b "b"
+               OpName %a "a"
+               OpName %x_51 "x_51"
+               OpName %x_52_phi "x_52_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %11 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %11
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %11
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %21 = OpConstantNull %v2float
+%_ptr_Function_float = OpTypePointer Function %float
+         %25 = OpConstantNull %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %29 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+         %44 = OpConstantComposite %v2float %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+         %78 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+         %v1 = OpVariable %_ptr_Function_v2float Function %21
+          %b = OpVariable %_ptr_Function_v2float Function %21
+          %a = OpVariable %_ptr_Function_float Function %25
+       %x_51 = OpVariable %_ptr_Function_bool Function %29
+   %x_52_phi = OpVariable %_ptr_Function_bool Function %29
+         %35 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %36 = OpLoad %float %35
+         %37 = OpCompositeConstruct %v2float %36 %36
+               OpStore %v1 %37
+         %38 = OpLoad %v2float %v1
+         %39 = OpExtInst %v2float %40 Fract %38
+               OpStore %b %39
+         %41 = OpLoad %v2float %b
+         %42 = OpExtInst %v2float %40 SmoothStep %44 %44 %41
+         %45 = OpCompositeExtract %float %42 0
+               OpStore %a %45
+         %46 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %47 = OpLoad %float %46
+         %48 = OpLoad %float %a
+         %49 = OpLoad %float %a
+         %50 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %51 = OpLoad %float %50
+         %52 = OpCompositeConstruct %v4float %47 %48 %49 %51
+               OpStore %x_GLF_color %52
+         %53 = OpAccessChain %_ptr_Function_float %b %uint_0
+         %54 = OpLoad %float %53
+         %55 = OpFOrdLessThan %bool %54 %float_1
+               OpStore %x_52_phi %55
+               OpSelectionMerge %56 None
+               OpBranchConditional %55 %57 %56
+         %57 = OpLabel
+         %58 = OpAccessChain %_ptr_Function_float %b %uint_1
+         %59 = OpLoad %float %58
+         %60 = OpFOrdLessThan %bool %59 %float_1
+               OpStore %x_51 %60
+         %61 = OpLoad %bool %x_51
+               OpStore %x_52_phi %61
+               OpBranch %56
+         %56 = OpLabel
+         %62 = OpLoad %bool %x_52_phi
+               OpSelectionMerge %63 None
+               OpBranchConditional %62 %64 %65
+         %64 = OpLabel
+         %66 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %67 = OpLoad %float %66
+         %68 = OpAccessChain %_ptr_Function_float %b %uint_0
+         %69 = OpLoad %float %68
+         %70 = OpAccessChain %_ptr_Function_float %b %uint_1
+         %71 = OpLoad %float %70
+         %72 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %73 = OpLoad %float %72
+         %74 = OpCompositeConstruct %v4float %67 %69 %71 %73
+               OpStore %x_GLF_color %74
+               OpBranch %63
+         %65 = OpLabel
+         %75 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %76 = OpLoad %float %75
+         %77 = OpCompositeConstruct %v4float %76 %76 %76 %76
+               OpStore %x_GLF_color %77
+               OpBranch %63
+         %63 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %78
+%tint_symbol = OpFunctionParameter %main_out
+         %82 = OpLabel
+         %83 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %83
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %85 = OpLabel
+         %86 = OpFunctionCall %void %main_1
+         %88 = OpLoad %v4float %x_GLF_color
+         %89 = OpCompositeConstruct %main_out %88
+         %87 = OpFunctionCall %void %tint_symbol_2 %89
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fract-smoothstep-undefined/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fract-smoothstep-undefined/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..14326d3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fract-smoothstep-undefined/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,60 @@
+type Arr = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v1 : vec2<f32>;
+  var b : vec2<f32>;
+  var a : f32;
+  var x_51 : bool;
+  var x_52_phi : bool;
+  let x_30 : f32 = x_6.x_GLF_uniform_float_values[0];
+  v1 = vec2<f32>(x_30, x_30);
+  let x_32 : vec2<f32> = v1;
+  b = fract(x_32);
+  let x_34 : vec2<f32> = b;
+  a = smoothStep(vec2<f32>(1.0, 1.0), vec2<f32>(1.0, 1.0), x_34).x;
+  let x_38 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_39 : f32 = a;
+  let x_40 : f32 = a;
+  let x_42 : f32 = x_6.x_GLF_uniform_float_values[0];
+  x_GLF_color = vec4<f32>(x_38, x_39, x_40, x_42);
+  let x_45 : f32 = b.x;
+  let x_46 : bool = (x_45 < 1.0);
+  x_52_phi = x_46;
+  if (x_46) {
+    let x_50 : f32 = b.y;
+    x_51 = (x_50 < 1.0);
+    x_52_phi = x_51;
+  }
+  let x_52 : bool = x_52_phi;
+  if (x_52) {
+    let x_57 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_59 : f32 = b.x;
+    let x_61 : f32 = b.y;
+    let x_63 : f32 = x_6.x_GLF_uniform_float_values[0];
+    x_GLF_color = vec4<f32>(x_57, x_59, x_61, x_63);
+  } else {
+    let x_66 : f32 = x_6.x_GLF_uniform_float_values[0];
+    x_GLF_color = vec4<f32>(x_66, x_66, x_66, x_66);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fract-smoothstep-undefined/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fract-smoothstep-undefined/0-opt.wgsl
new file mode 100644
index 0000000..14326d3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fract-smoothstep-undefined/0-opt.wgsl
@@ -0,0 +1,60 @@
+type Arr = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v1 : vec2<f32>;
+  var b : vec2<f32>;
+  var a : f32;
+  var x_51 : bool;
+  var x_52_phi : bool;
+  let x_30 : f32 = x_6.x_GLF_uniform_float_values[0];
+  v1 = vec2<f32>(x_30, x_30);
+  let x_32 : vec2<f32> = v1;
+  b = fract(x_32);
+  let x_34 : vec2<f32> = b;
+  a = smoothStep(vec2<f32>(1.0, 1.0), vec2<f32>(1.0, 1.0), x_34).x;
+  let x_38 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_39 : f32 = a;
+  let x_40 : f32 = a;
+  let x_42 : f32 = x_6.x_GLF_uniform_float_values[0];
+  x_GLF_color = vec4<f32>(x_38, x_39, x_40, x_42);
+  let x_45 : f32 = b.x;
+  let x_46 : bool = (x_45 < 1.0);
+  x_52_phi = x_46;
+  if (x_46) {
+    let x_50 : f32 = b.y;
+    x_51 = (x_50 < 1.0);
+    x_52_phi = x_51;
+  }
+  let x_52 : bool = x_52_phi;
+  if (x_52) {
+    let x_57 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_59 : f32 = b.x;
+    let x_61 : f32 = b.y;
+    let x_63 : f32 = x_6.x_GLF_uniform_float_values[0];
+    x_GLF_color = vec4<f32>(x_57, x_59, x_61, x_63);
+  } else {
+    let x_66 : f32 = x_6.x_GLF_uniform_float_values[0];
+    x_GLF_color = vec4<f32>(x_66, x_66, x_66, x_66);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fract-smoothstep-undefined/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-fract-smoothstep-undefined/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..e520d49
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fract-smoothstep-undefined/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,60 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2 v1 = float2(0.0f, 0.0f);
+  float2 b = float2(0.0f, 0.0f);
+  float a = 0.0f;
+  bool x_51 = false;
+  bool x_52_phi = false;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_30 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  v1 = float2(x_30, x_30);
+  b = frac(v1);
+  a = smoothstep(float2(1.0f, 1.0f), float2(1.0f, 1.0f), b).x;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_38 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const float x_39 = a;
+  const float x_40 = a;
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const float x_42 = asfloat(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  x_GLF_color = float4(x_38, x_39, x_40, x_42);
+  const float x_45 = b.x;
+  const bool x_46 = (x_45 < 1.0f);
+  x_52_phi = x_46;
+  if (x_46) {
+    const float x_50 = b.y;
+    x_51 = (x_50 < 1.0f);
+    x_52_phi = x_51;
+  }
+  if (x_52_phi) {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const float x_57 = asfloat(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const float x_59 = b.x;
+    const float x_61 = b.y;
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const float x_63 = asfloat(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    x_GLF_color = float4(x_57, x_59, x_61, x_63);
+  } else {
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const float x_66 = asfloat(x_6[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    x_GLF_color = float4(x_66, x_66, x_66, x_66);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fract-smoothstep-undefined/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-fract-smoothstep-undefined/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..18c63cf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fract-smoothstep-undefined/0-opt.wgsl.expected.msl
@@ -0,0 +1,67 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float2 v1 = 0.0f;
+  float2 b = 0.0f;
+  float a = 0.0f;
+  bool x_51 = false;
+  bool x_52_phi = false;
+  float const x_30 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  v1 = float2(x_30, x_30);
+  float2 const x_32 = v1;
+  b = fract(x_32);
+  float2 const x_34 = b;
+  a = smoothstep(float2(1.0f, 1.0f), float2(1.0f, 1.0f), x_34).x;
+  float const x_38 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_39 = a;
+  float const x_40 = a;
+  float const x_42 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  *(tint_symbol_4) = float4(x_38, x_39, x_40, x_42);
+  float const x_45 = b.x;
+  bool const x_46 = (x_45 < 1.0f);
+  x_52_phi = x_46;
+  if (x_46) {
+    float const x_50 = b.y;
+    x_51 = (x_50 < 1.0f);
+    x_52_phi = x_51;
+  }
+  bool const x_52 = x_52_phi;
+  if (x_52) {
+    float const x_57 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    float const x_59 = b.x;
+    float const x_61 = b.y;
+    float const x_63 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    *(tint_symbol_4) = float4(x_57, x_59, x_61, x_63);
+  } else {
+    float const x_66 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    *(tint_symbol_4) = float4(x_66, x_66, x_66, x_66);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fract-smoothstep-undefined/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fract-smoothstep-undefined/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..8371f68
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fract-smoothstep-undefined/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,145 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 90
+; Schema: 0
+               OpCapability Shader
+         %40 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v1 "v1"
+               OpName %b "b"
+               OpName %a "a"
+               OpName %x_51 "x_51"
+               OpName %x_52_phi "x_52_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %11 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %11
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %11
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %21 = OpConstantNull %v2float
+%_ptr_Function_float = OpTypePointer Function %float
+         %25 = OpConstantNull %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %29 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+         %44 = OpConstantComposite %v2float %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+         %78 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+         %v1 = OpVariable %_ptr_Function_v2float Function %21
+          %b = OpVariable %_ptr_Function_v2float Function %21
+          %a = OpVariable %_ptr_Function_float Function %25
+       %x_51 = OpVariable %_ptr_Function_bool Function %29
+   %x_52_phi = OpVariable %_ptr_Function_bool Function %29
+         %35 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %36 = OpLoad %float %35
+         %37 = OpCompositeConstruct %v2float %36 %36
+               OpStore %v1 %37
+         %38 = OpLoad %v2float %v1
+         %39 = OpExtInst %v2float %40 Fract %38
+               OpStore %b %39
+         %41 = OpLoad %v2float %b
+         %42 = OpExtInst %v2float %40 SmoothStep %44 %44 %41
+         %45 = OpCompositeExtract %float %42 0
+               OpStore %a %45
+         %46 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %47 = OpLoad %float %46
+         %48 = OpLoad %float %a
+         %49 = OpLoad %float %a
+         %50 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %51 = OpLoad %float %50
+         %52 = OpCompositeConstruct %v4float %47 %48 %49 %51
+               OpStore %x_GLF_color %52
+         %53 = OpAccessChain %_ptr_Function_float %b %uint_0
+         %54 = OpLoad %float %53
+         %55 = OpFOrdLessThan %bool %54 %float_1
+               OpStore %x_52_phi %55
+               OpSelectionMerge %56 None
+               OpBranchConditional %55 %57 %56
+         %57 = OpLabel
+         %58 = OpAccessChain %_ptr_Function_float %b %uint_1
+         %59 = OpLoad %float %58
+         %60 = OpFOrdLessThan %bool %59 %float_1
+               OpStore %x_51 %60
+         %61 = OpLoad %bool %x_51
+               OpStore %x_52_phi %61
+               OpBranch %56
+         %56 = OpLabel
+         %62 = OpLoad %bool %x_52_phi
+               OpSelectionMerge %63 None
+               OpBranchConditional %62 %64 %65
+         %64 = OpLabel
+         %66 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %67 = OpLoad %float %66
+         %68 = OpAccessChain %_ptr_Function_float %b %uint_0
+         %69 = OpLoad %float %68
+         %70 = OpAccessChain %_ptr_Function_float %b %uint_1
+         %71 = OpLoad %float %70
+         %72 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %73 = OpLoad %float %72
+         %74 = OpCompositeConstruct %v4float %67 %69 %71 %73
+               OpStore %x_GLF_color %74
+               OpBranch %63
+         %65 = OpLabel
+         %75 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %76 = OpLoad %float %75
+         %77 = OpCompositeConstruct %v4float %76 %76 %76 %76
+               OpStore %x_GLF_color %77
+               OpBranch %63
+         %63 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %78
+%tint_symbol = OpFunctionParameter %main_out
+         %82 = OpLabel
+         %83 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %83
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %85 = OpLabel
+         %86 = OpFunctionCall %void %main_1
+         %88 = OpLoad %v4float %x_GLF_color
+         %89 = OpCompositeConstruct %main_out %88
+         %87 = OpFunctionCall %void %tint_symbol_2 %89
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fract-smoothstep-undefined/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fract-smoothstep-undefined/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..14326d3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fract-smoothstep-undefined/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,60 @@
+type Arr = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v1 : vec2<f32>;
+  var b : vec2<f32>;
+  var a : f32;
+  var x_51 : bool;
+  var x_52_phi : bool;
+  let x_30 : f32 = x_6.x_GLF_uniform_float_values[0];
+  v1 = vec2<f32>(x_30, x_30);
+  let x_32 : vec2<f32> = v1;
+  b = fract(x_32);
+  let x_34 : vec2<f32> = b;
+  a = smoothStep(vec2<f32>(1.0, 1.0), vec2<f32>(1.0, 1.0), x_34).x;
+  let x_38 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_39 : f32 = a;
+  let x_40 : f32 = a;
+  let x_42 : f32 = x_6.x_GLF_uniform_float_values[0];
+  x_GLF_color = vec4<f32>(x_38, x_39, x_40, x_42);
+  let x_45 : f32 = b.x;
+  let x_46 : bool = (x_45 < 1.0);
+  x_52_phi = x_46;
+  if (x_46) {
+    let x_50 : f32 = b.y;
+    x_51 = (x_50 < 1.0);
+    x_52_phi = x_51;
+  }
+  let x_52 : bool = x_52_phi;
+  if (x_52) {
+    let x_57 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_59 : f32 = b.x;
+    let x_61 : f32 = b.y;
+    let x_63 : f32 = x_6.x_GLF_uniform_float_values[0];
+    x_GLF_color = vec4<f32>(x_57, x_59, x_61, x_63);
+  } else {
+    let x_66 : f32 = x_6.x_GLF_uniform_float_values[0];
+    x_GLF_color = vec4<f32>(x_66, x_66, x_66, x_66);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-bitwise-not/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-bitwise-not/0-opt.spvasm
new file mode 100644
index 0000000..7a15382
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-bitwise-not/0-opt.spvasm
@@ -0,0 +1,92 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %a "a"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %10
+         %26 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+         %27 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %28 = OpLoad %float %27
+         %29 = OpConvertFToS %int %28
+               OpStore %a %29
+         %30 = OpLoad %int %a
+         %31 = OpNot %int %30
+         %32 = OpSLessThan %bool %31 %int_0
+               OpSelectionMerge %33 None
+               OpBranchConditional %32 %34 %33
+         %34 = OpLabel
+         %35 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %36 = OpLoad %int %35
+               OpStore %a %36
+               OpBranch %33
+         %33 = OpLabel
+         %37 = OpLoad %int %a
+         %38 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %39 = OpLoad %int %38
+         %40 = OpIEqual %bool %37 %39
+               OpSelectionMerge %41 None
+               OpBranchConditional %40 %42 %43
+         %42 = OpLabel
+         %44 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %45 = OpLoad %int %44
+         %46 = OpConvertSToF %float %45
+         %47 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %48 = OpLoad %int %47
+         %49 = OpConvertSToF %float %48
+         %50 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %51 = OpLoad %int %50
+         %52 = OpConvertSToF %float %51
+         %53 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %54 = OpLoad %int %53
+         %55 = OpConvertSToF %float %54
+         %56 = OpCompositeConstruct %v4float %46 %49 %52 %55
+               OpStore %_GLF_color %56
+               OpBranch %41
+         %43 = OpLabel
+         %57 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %58 = OpLoad %int %57
+         %59 = OpConvertSToF %float %58
+         %60 = OpCompositeConstruct %v4float %59 %59 %59 %59
+               OpStore %_GLF_color %60
+               OpBranch %41
+         %41 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-bitwise-not/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-bitwise-not/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..0bc8372
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-bitwise-not/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,51 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  const float x_28 = gl_FragCoord.x;
+  a = int(x_28);
+  if ((~(a) < 0)) {
+    const int x_36 = asint(x_7[1].x);
+    a = x_36;
+  }
+  const int x_37 = a;
+  const int x_39 = asint(x_7[1].x);
+  if ((x_37 == x_39)) {
+    const int x_45 = asint(x_7[1].x);
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_48 = asint(x_7[scalar_offset / 4][scalar_offset % 4]);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_51 = asint(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const int x_54 = asint(x_7[1].x);
+    x_GLF_color = float4(float(x_45), float(x_48), float(x_51), float(x_54));
+  } else {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_58 = asint(x_7[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const float x_59 = float(x_58);
+    x_GLF_color = float4(x_59, x_59, x_59, x_59);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-bitwise-not/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-bitwise-not/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..98f7829
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-bitwise-not/0-opt.spvasm.expected.msl
@@ -0,0 +1,55 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int a = 0;
+  float const x_28 = (*(tint_symbol_5)).x;
+  a = int(x_28);
+  int const x_30 = a;
+  if ((~(x_30) < 0)) {
+    int const x_36 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    a = x_36;
+  }
+  int const x_37 = a;
+  int const x_39 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_37 == x_39)) {
+    int const x_45 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    int const x_48 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_51 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_54 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_6) = float4(float(x_45), float(x_48), float(x_51), float(x_54));
+  } else {
+    int const x_58 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    float const x_59 = float(x_58);
+    *(tint_symbol_6) = float4(x_59, x_59, x_59, x_59);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_7, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-bitwise-not/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-bitwise-not/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..698e085
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-bitwise-not/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,128 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 78
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %24 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+         %65 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %18
+         %21 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %24
+         %27 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %28 = OpLoad %float %27
+         %29 = OpConvertFToS %int %28
+               OpStore %a %29
+         %30 = OpLoad %int %a
+         %31 = OpNot %int %30
+         %33 = OpSLessThan %bool %31 %int_0
+               OpSelectionMerge %35 None
+               OpBranchConditional %33 %36 %35
+         %36 = OpLabel
+         %39 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %40 = OpLoad %int %39
+               OpStore %a %40
+               OpBranch %35
+         %35 = OpLabel
+         %41 = OpLoad %int %a
+         %42 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %43 = OpLoad %int %42
+         %44 = OpIEqual %bool %41 %43
+               OpSelectionMerge %45 None
+               OpBranchConditional %44 %46 %47
+         %46 = OpLabel
+         %48 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %49 = OpLoad %int %48
+         %50 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %51 = OpLoad %int %50
+         %52 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %53 = OpLoad %int %52
+         %54 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %55 = OpLoad %int %54
+         %56 = OpConvertSToF %float %49
+         %57 = OpConvertSToF %float %51
+         %58 = OpConvertSToF %float %53
+         %59 = OpConvertSToF %float %55
+         %60 = OpCompositeConstruct %v4float %56 %57 %58 %59
+               OpStore %x_GLF_color %60
+               OpBranch %45
+         %47 = OpLabel
+         %61 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %62 = OpLoad %int %61
+         %63 = OpConvertSToF %float %62
+         %64 = OpCompositeConstruct %v4float %63 %63 %63 %63
+               OpStore %x_GLF_color %64
+               OpBranch %45
+         %45 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %65
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %69 = OpLabel
+         %70 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %70
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %18
+         %72 = OpLabel
+         %73 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %73
+         %74 = OpFunctionCall %void %main_1
+         %76 = OpLoad %v4float %x_GLF_color
+         %77 = OpCompositeConstruct %main_out %76
+         %75 = OpFunctionCall %void %tint_symbol_3 %77
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-bitwise-not/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-bitwise-not/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..b258d3f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-bitwise-not/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,49 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  let x_28 : f32 = gl_FragCoord.x;
+  a = i32(x_28);
+  let x_30 : i32 = a;
+  if ((~(x_30) < 0)) {
+    let x_36 : i32 = x_7.x_GLF_uniform_int_values[1];
+    a = x_36;
+  }
+  let x_37 : i32 = a;
+  let x_39 : i32 = x_7.x_GLF_uniform_int_values[1];
+  if ((x_37 == x_39)) {
+    let x_45 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_48 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_51 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_54 : i32 = x_7.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_45), f32(x_48), f32(x_51), f32(x_54));
+  } else {
+    let x_58 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_59 : f32 = f32(x_58);
+    x_GLF_color = vec4<f32>(x_59, x_59, x_59, x_59);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-bitwise-not/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-bitwise-not/0-opt.wgsl
new file mode 100644
index 0000000..b258d3f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-bitwise-not/0-opt.wgsl
@@ -0,0 +1,49 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  let x_28 : f32 = gl_FragCoord.x;
+  a = i32(x_28);
+  let x_30 : i32 = a;
+  if ((~(x_30) < 0)) {
+    let x_36 : i32 = x_7.x_GLF_uniform_int_values[1];
+    a = x_36;
+  }
+  let x_37 : i32 = a;
+  let x_39 : i32 = x_7.x_GLF_uniform_int_values[1];
+  if ((x_37 == x_39)) {
+    let x_45 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_48 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_51 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_54 : i32 = x_7.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_45), f32(x_48), f32(x_51), f32(x_54));
+  } else {
+    let x_58 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_59 : f32 = f32(x_58);
+    x_GLF_color = vec4<f32>(x_59, x_59, x_59, x_59);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-bitwise-not/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-bitwise-not/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..0bc8372
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-bitwise-not/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,51 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  const float x_28 = gl_FragCoord.x;
+  a = int(x_28);
+  if ((~(a) < 0)) {
+    const int x_36 = asint(x_7[1].x);
+    a = x_36;
+  }
+  const int x_37 = a;
+  const int x_39 = asint(x_7[1].x);
+  if ((x_37 == x_39)) {
+    const int x_45 = asint(x_7[1].x);
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_48 = asint(x_7[scalar_offset / 4][scalar_offset % 4]);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_51 = asint(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const int x_54 = asint(x_7[1].x);
+    x_GLF_color = float4(float(x_45), float(x_48), float(x_51), float(x_54));
+  } else {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_58 = asint(x_7[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const float x_59 = float(x_58);
+    x_GLF_color = float4(x_59, x_59, x_59, x_59);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-bitwise-not/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-bitwise-not/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..98f7829
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-bitwise-not/0-opt.wgsl.expected.msl
@@ -0,0 +1,55 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int a = 0;
+  float const x_28 = (*(tint_symbol_5)).x;
+  a = int(x_28);
+  int const x_30 = a;
+  if ((~(x_30) < 0)) {
+    int const x_36 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    a = x_36;
+  }
+  int const x_37 = a;
+  int const x_39 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_37 == x_39)) {
+    int const x_45 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    int const x_48 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_51 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_54 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_6) = float4(float(x_45), float(x_48), float(x_51), float(x_54));
+  } else {
+    int const x_58 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    float const x_59 = float(x_58);
+    *(tint_symbol_6) = float4(x_59, x_59, x_59, x_59);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_7, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-bitwise-not/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-bitwise-not/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..698e085
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-bitwise-not/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,128 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 78
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %24 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+         %65 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %18
+         %21 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %24
+         %27 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %28 = OpLoad %float %27
+         %29 = OpConvertFToS %int %28
+               OpStore %a %29
+         %30 = OpLoad %int %a
+         %31 = OpNot %int %30
+         %33 = OpSLessThan %bool %31 %int_0
+               OpSelectionMerge %35 None
+               OpBranchConditional %33 %36 %35
+         %36 = OpLabel
+         %39 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %40 = OpLoad %int %39
+               OpStore %a %40
+               OpBranch %35
+         %35 = OpLabel
+         %41 = OpLoad %int %a
+         %42 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %43 = OpLoad %int %42
+         %44 = OpIEqual %bool %41 %43
+               OpSelectionMerge %45 None
+               OpBranchConditional %44 %46 %47
+         %46 = OpLabel
+         %48 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %49 = OpLoad %int %48
+         %50 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %51 = OpLoad %int %50
+         %52 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %53 = OpLoad %int %52
+         %54 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %55 = OpLoad %int %54
+         %56 = OpConvertSToF %float %49
+         %57 = OpConvertSToF %float %51
+         %58 = OpConvertSToF %float %53
+         %59 = OpConvertSToF %float %55
+         %60 = OpCompositeConstruct %v4float %56 %57 %58 %59
+               OpStore %x_GLF_color %60
+               OpBranch %45
+         %47 = OpLabel
+         %61 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %62 = OpLoad %int %61
+         %63 = OpConvertSToF %float %62
+         %64 = OpCompositeConstruct %v4float %63 %63 %63 %63
+               OpStore %x_GLF_color %64
+               OpBranch %45
+         %45 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %65
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %69 = OpLabel
+         %70 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %70
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %18
+         %72 = OpLabel
+         %73 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %73
+         %74 = OpFunctionCall %void %main_1
+         %76 = OpLoad %v4float %x_GLF_color
+         %77 = OpCompositeConstruct %main_out %76
+         %75 = OpFunctionCall %void %tint_symbol_3 %77
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-bitwise-not/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-bitwise-not/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..b258d3f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-bitwise-not/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,49 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  let x_28 : f32 = gl_FragCoord.x;
+  a = i32(x_28);
+  let x_30 : i32 = a;
+  if ((~(x_30) < 0)) {
+    let x_36 : i32 = x_7.x_GLF_uniform_int_values[1];
+    a = x_36;
+  }
+  let x_37 : i32 = a;
+  let x_39 : i32 = x_7.x_GLF_uniform_int_values[1];
+  if ((x_37 == x_39)) {
+    let x_45 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_48 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_51 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_54 : i32 = x_7.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_45), f32(x_48), f32(x_51), f32(x_54));
+  } else {
+    let x_58 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_59 : f32 = f32(x_58);
+    x_GLF_color = vec4<f32>(x_59, x_59, x_59, x_59);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-clamp-array-access/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-clamp-array-access/0-opt.spvasm
new file mode 100644
index 0000000..10cf8c5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-clamp-array-access/0-opt.spvasm
@@ -0,0 +1,180 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %data "data"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %b "b"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %y "y"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %i "i"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %16 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_v4float_uint_2 = OpTypeArray %v4float %uint_2
+%_ptr_Function__arr_v4float_uint_2 = OpTypePointer Function %_arr_v4float_uint_2
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_int = OpTypePointer Function %int
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf1 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+%_ptr_Input_float = OpTypePointer Input %float
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %16
+         %40 = OpLabel
+       %data = OpVariable %_ptr_Function__arr_v4float_uint_2 Function
+          %b = OpVariable %_ptr_Function_int Function
+          %y = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+         %41 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %42 = OpLoad %float %41
+         %43 = OpCompositeConstruct %v4float %42 %42 %42 %42
+         %44 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %45 = OpLoad %float %44
+         %46 = OpCompositeConstruct %v4float %45 %45 %45 %45
+         %47 = OpCompositeConstruct %_arr_v4float_uint_2 %43 %46
+               OpStore %data %47
+         %48 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %49 = OpLoad %int %48
+               OpStore %b %49
+         %50 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %51 = OpLoad %float %50
+         %52 = OpConvertFToS %int %51
+         %53 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %54 = OpLoad %int %53
+         %55 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %56 = OpLoad %float %55
+         %57 = OpConvertFToS %int %56
+         %58 = OpBitwiseOr %int %54 %57
+         %59 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %60 = OpLoad %int %59
+         %61 = OpExtInst %int %1 SClamp %52 %58 %60
+               OpStore %y %61
+         %62 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %63 = OpLoad %int %62
+               OpStore %i %63
+               OpBranch %64
+         %64 = OpLabel
+               OpLoopMerge %65 %66 None
+               OpBranch %67
+         %67 = OpLabel
+         %68 = OpLoad %int %i
+         %69 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %70 = OpLoad %int %69
+         %71 = OpSLessThan %bool %68 %70
+               OpBranchConditional %71 %72 %65
+         %72 = OpLabel
+         %73 = OpLoad %int %b
+         %74 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %75 = OpLoad %int %74
+         %76 = OpSGreaterThan %bool %73 %75
+               OpSelectionMerge %77 None
+               OpBranchConditional %76 %78 %77
+         %78 = OpLabel
+         %79 = OpLoad %int %y
+         %80 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %81 = OpLoad %int %80
+         %82 = OpSGreaterThan %bool %79 %81
+               OpBranch %77
+         %77 = OpLabel
+         %83 = OpPhi %bool %76 %72 %82 %78
+               OpSelectionMerge %84 None
+               OpBranchConditional %83 %85 %84
+         %85 = OpLabel
+               OpBranch %65
+         %84 = OpLabel
+         %86 = OpLoad %int %b
+         %87 = OpIAdd %int %86 %int_1
+               OpStore %b %87
+               OpBranch %66
+         %66 = OpLabel
+         %88 = OpLoad %int %i
+         %89 = OpIAdd %int %88 %int_1
+               OpStore %i %89
+               OpBranch %64
+         %65 = OpLabel
+         %90 = OpLoad %int %b
+         %91 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %92 = OpLoad %int %91
+         %93 = OpIEqual %bool %90 %92
+               OpSelectionMerge %94 None
+               OpBranchConditional %93 %95 %94
+         %95 = OpLabel
+         %96 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %97 = OpLoad %int %96
+         %98 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %99 = OpLoad %int %98
+        %100 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_3
+        %101 = OpLoad %int %100
+        %102 = OpExtInst %int %1 SClamp %97 %99 %101
+        %103 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %104 = OpLoad %int %103
+        %105 = OpConvertSToF %float %104
+        %106 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+        %107 = OpLoad %int %106
+        %108 = OpConvertSToF %float %107
+        %109 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+        %110 = OpLoad %int %109
+        %111 = OpConvertSToF %float %110
+        %112 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %113 = OpLoad %int %112
+        %114 = OpConvertSToF %float %113
+        %115 = OpCompositeConstruct %v4float %105 %108 %111 %114
+        %116 = OpAccessChain %_ptr_Function_v4float %data %102
+               OpStore %116 %115
+               OpBranch %94
+         %94 = OpLabel
+        %117 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %118 = OpLoad %int %117
+        %119 = OpAccessChain %_ptr_Function_v4float %data %118
+        %120 = OpLoad %v4float %119
+        %121 = OpCompositeExtract %float %120 0
+        %122 = OpCompositeExtract %float %120 1
+        %123 = OpCompositeExtract %float %120 2
+        %124 = OpCompositeExtract %float %120 3
+        %125 = OpCompositeConstruct %v4float %121 %122 %123 %124
+               OpStore %_GLF_color %125
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-clamp-array-access/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-clamp-array-access/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..2ab5b03
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-clamp-array-access/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,95 @@
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[1];
+};
+cbuffer cbuffer_x_10 : register(b1, space0) {
+  uint4 x_10[4];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 data[2] = (float4[2])0;
+  int b = 0;
+  int y = 0;
+  int i = 0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_42 = asfloat(x_7[scalar_offset / 4][scalar_offset % 4]);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_45 = asfloat(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const float4 tint_symbol_6[2] = {float4(x_42, x_42, x_42, x_42), float4(x_45, x_45, x_45, x_45)};
+  data = tint_symbol_6;
+  const int x_49 = asint(x_10[1].x);
+  b = x_49;
+  const float x_51 = gl_FragCoord.y;
+  const int x_54 = asint(x_10[1].x);
+  const float x_56 = gl_FragCoord.y;
+  const int x_60 = asint(x_10[1].x);
+  y = clamp(int(x_51), (x_54 | int(x_56)), x_60);
+  const int x_63 = asint(x_10[1].x);
+  i = x_63;
+  while (true) {
+    bool x_82 = false;
+    bool x_83_phi = false;
+    const int x_68 = i;
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_70 = asint(x_10[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    if ((x_68 < x_70)) {
+    } else {
+      break;
+    }
+    const int x_73 = b;
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_75 = asint(x_10[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const bool x_76 = (x_73 > x_75);
+    x_83_phi = x_76;
+    if (x_76) {
+      const int x_79 = y;
+      const int x_81 = asint(x_10[1].x);
+      x_82 = (x_79 > x_81);
+      x_83_phi = x_82;
+    }
+    if (x_83_phi) {
+      break;
+    }
+    b = (b + 1);
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_90 = b;
+  const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+  const int x_92 = asint(x_10[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+  if ((x_90 == x_92)) {
+    const int x_97 = asint(x_10[2].x);
+    const int x_99 = asint(x_10[1].x);
+    const int x_101 = asint(x_10[3].x);
+    const int x_104 = asint(x_10[1].x);
+    const int x_107 = asint(x_10[2].x);
+    const int x_110 = asint(x_10[2].x);
+    const int x_113 = asint(x_10[1].x);
+    data[clamp(x_97, x_99, x_101)] = float4(float(x_104), float(x_107), float(x_110), float(x_113));
+  }
+  const int x_118 = asint(x_10[1].x);
+  const float4 x_120 = data[x_118];
+  x_GLF_color = float4(x_120.x, x_120.y, x_120.z, x_120.w);
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_7 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_7;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-clamp-array-access/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-clamp-array-access/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..18db7a4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-clamp-array-access/0-opt.spvasm.expected.msl
@@ -0,0 +1,109 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[4];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_2 {
+  float4 arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, constant buf1& x_10, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  tint_array_wrapper_2 data = {};
+  int b = 0;
+  int y = 0;
+  int i = 0;
+  float const x_42 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  float const x_45 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  tint_array_wrapper_2 const tint_symbol_4 = {.arr={float4(x_42, x_42, x_42, x_42), float4(x_45, x_45, x_45, x_45)}};
+  data = tint_symbol_4;
+  int const x_49 = x_10.x_GLF_uniform_int_values.arr[1].el;
+  b = x_49;
+  float const x_51 = (*(tint_symbol_6)).y;
+  int const x_54 = x_10.x_GLF_uniform_int_values.arr[1].el;
+  float const x_56 = (*(tint_symbol_6)).y;
+  int const x_60 = x_10.x_GLF_uniform_int_values.arr[1].el;
+  y = clamp(int(x_51), (x_54 | int(x_56)), x_60);
+  int const x_63 = x_10.x_GLF_uniform_int_values.arr[1].el;
+  i = x_63;
+  while (true) {
+    bool x_82 = false;
+    bool x_83_phi = false;
+    int const x_68 = i;
+    int const x_70 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_68 < x_70)) {
+    } else {
+      break;
+    }
+    int const x_73 = b;
+    int const x_75 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    bool const x_76 = (x_73 > x_75);
+    x_83_phi = x_76;
+    if (x_76) {
+      int const x_79 = y;
+      int const x_81 = x_10.x_GLF_uniform_int_values.arr[1].el;
+      x_82 = (x_79 > x_81);
+      x_83_phi = x_82;
+    }
+    bool const x_83 = x_83_phi;
+    if (x_83) {
+      break;
+    }
+    int const x_86 = b;
+    b = (x_86 + 1);
+    {
+      int const x_88 = i;
+      i = (x_88 + 1);
+    }
+  }
+  int const x_90 = b;
+  int const x_92 = x_10.x_GLF_uniform_int_values.arr[0].el;
+  if ((x_90 == x_92)) {
+    int const x_97 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    int const x_99 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_101 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    int const x_104 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_107 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    int const x_110 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    int const x_113 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    data.arr[clamp(x_97, x_99, x_101)] = float4(float(x_104), float(x_107), float(x_110), float(x_113));
+  }
+  int const x_118 = x_10.x_GLF_uniform_int_values.arr[1].el;
+  float4 const x_120 = data.arr[x_118];
+  *(tint_symbol_7) = float4(x_120.x, x_120.y, x_120.z, x_120.w);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]], constant buf1& x_10 [[buffer(1)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_7, x_10, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-clamp-array-access/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-clamp-array-access/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..7fc19f9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-clamp-array-access/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,236 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 153
+; Schema: 0
+               OpCapability Shader
+         %61 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_7 "x_7"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %data "data"
+               OpName %b "b"
+               OpName %y "y"
+               OpName %i "i"
+               OpName %x_82 "x_82"
+               OpName %x_83_phi "x_83_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 1
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v4float_uint_2 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf1 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_10 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %17
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+     %uint_2 = OpConstant %uint 2
+%_arr_v4float_uint_2 = OpTypeArray %v4float %uint_2
+%_ptr_Function__arr_v4float_uint_2 = OpTypePointer Function %_arr_v4float_uint_2
+         %31 = OpConstantNull %_arr_v4float_uint_2
+%_ptr_Function_int = OpTypePointer Function %int
+         %34 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Private_float = OpTypePointer Private %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %74 = OpConstantNull %bool
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+   %main_out = OpTypeStruct %v4float
+        %140 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %23
+         %26 = OpLabel
+       %data = OpVariable %_ptr_Function__arr_v4float_uint_2 Function %31
+          %b = OpVariable %_ptr_Function_int Function %34
+          %y = OpVariable %_ptr_Function_int Function %34
+          %i = OpVariable %_ptr_Function_int Function %34
+       %x_82 = OpVariable %_ptr_Function_bool Function %74
+   %x_83_phi = OpVariable %_ptr_Function_bool Function %74
+         %40 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %41 = OpLoad %float %40
+         %42 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %43 = OpLoad %float %42
+         %44 = OpCompositeConstruct %v4float %41 %41 %41 %41
+         %45 = OpCompositeConstruct %v4float %43 %43 %43 %43
+         %46 = OpCompositeConstruct %_arr_v4float_uint_2 %44 %45
+               OpStore %data %46
+         %49 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %50 = OpLoad %int %49
+               OpStore %b %50
+         %52 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %53 = OpLoad %float %52
+         %54 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %55 = OpLoad %int %54
+         %56 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %57 = OpLoad %float %56
+         %58 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %59 = OpLoad %int %58
+         %62 = OpConvertFToS %int %53
+         %63 = OpConvertFToS %int %57
+         %64 = OpBitwiseOr %int %55 %63
+         %60 = OpExtInst %int %61 SClamp %62 %64 %59
+               OpStore %y %60
+         %65 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %66 = OpLoad %int %65
+               OpStore %i %66
+               OpBranch %67
+         %67 = OpLabel
+               OpLoopMerge %68 %69 None
+               OpBranch %70
+         %70 = OpLabel
+         %76 = OpLoad %int %i
+         %77 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %78 = OpLoad %int %77
+         %79 = OpSLessThan %bool %76 %78
+               OpSelectionMerge %80 None
+               OpBranchConditional %79 %81 %82
+         %81 = OpLabel
+               OpBranch %80
+         %82 = OpLabel
+               OpBranch %68
+         %80 = OpLabel
+         %83 = OpLoad %int %b
+         %84 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %85 = OpLoad %int %84
+         %86 = OpSGreaterThan %bool %83 %85
+               OpStore %x_83_phi %86
+               OpSelectionMerge %87 None
+               OpBranchConditional %86 %88 %87
+         %88 = OpLabel
+         %89 = OpLoad %int %y
+         %90 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %91 = OpLoad %int %90
+         %92 = OpSGreaterThan %bool %89 %91
+               OpStore %x_82 %92
+         %93 = OpLoad %bool %x_82
+               OpStore %x_83_phi %93
+               OpBranch %87
+         %87 = OpLabel
+         %94 = OpLoad %bool %x_83_phi
+               OpSelectionMerge %95 None
+               OpBranchConditional %94 %96 %95
+         %96 = OpLabel
+               OpBranch %68
+         %95 = OpLabel
+         %97 = OpLoad %int %b
+         %98 = OpIAdd %int %97 %int_1
+               OpStore %b %98
+               OpBranch %69
+         %69 = OpLabel
+         %99 = OpLoad %int %i
+        %100 = OpIAdd %int %99 %int_1
+               OpStore %i %100
+               OpBranch %67
+         %68 = OpLabel
+        %101 = OpLoad %int %b
+        %102 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %103 = OpLoad %int %102
+        %104 = OpIEqual %bool %101 %103
+               OpSelectionMerge %105 None
+               OpBranchConditional %104 %106 %105
+        %106 = OpLabel
+        %108 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %109 = OpLoad %int %108
+        %110 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %111 = OpLoad %int %110
+        %113 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+        %114 = OpLoad %int %113
+        %115 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %116 = OpLoad %int %115
+        %117 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %118 = OpLoad %int %117
+        %119 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %120 = OpLoad %int %119
+        %121 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %122 = OpLoad %int %121
+        %123 = OpExtInst %int %61 SClamp %109 %111 %114
+        %125 = OpAccessChain %_ptr_Function_v4float %data %123
+        %126 = OpConvertSToF %float %116
+        %127 = OpConvertSToF %float %118
+        %128 = OpConvertSToF %float %120
+        %129 = OpConvertSToF %float %122
+        %130 = OpCompositeConstruct %v4float %126 %127 %128 %129
+               OpStore %125 %130
+               OpBranch %105
+        %105 = OpLabel
+        %131 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %132 = OpLoad %int %131
+        %133 = OpAccessChain %_ptr_Function_v4float %data %132
+        %134 = OpLoad %v4float %133
+        %135 = OpCompositeExtract %float %134 0
+        %136 = OpCompositeExtract %float %134 1
+        %137 = OpCompositeExtract %float %134 2
+        %138 = OpCompositeExtract %float %134 3
+        %139 = OpCompositeConstruct %v4float %135 %136 %137 %138
+               OpStore %x_GLF_color %139
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %140
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %144 = OpLabel
+        %145 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %145
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %23
+        %147 = OpLabel
+        %148 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %148
+        %149 = OpFunctionCall %void %main_1
+        %151 = OpLoad %v4float %x_GLF_color
+        %152 = OpCompositeConstruct %main_out %151
+        %150 = OpFunctionCall %void %tint_symbol_3 %152
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-clamp-array-access/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-clamp-array-access/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..5e2efc9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-clamp-array-access/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,99 @@
+type Arr = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var data : array<vec4<f32>, 2>;
+  var b : i32;
+  var y : i32;
+  var i : i32;
+  let x_42 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_45 : f32 = x_7.x_GLF_uniform_float_values[0];
+  data = array<vec4<f32>, 2>(vec4<f32>(x_42, x_42, x_42, x_42), vec4<f32>(x_45, x_45, x_45, x_45));
+  let x_49 : i32 = x_10.x_GLF_uniform_int_values[1];
+  b = x_49;
+  let x_51 : f32 = gl_FragCoord.y;
+  let x_54 : i32 = x_10.x_GLF_uniform_int_values[1];
+  let x_56 : f32 = gl_FragCoord.y;
+  let x_60 : i32 = x_10.x_GLF_uniform_int_values[1];
+  y = clamp(i32(x_51), (x_54 | i32(x_56)), x_60);
+  let x_63 : i32 = x_10.x_GLF_uniform_int_values[1];
+  i = x_63;
+  loop {
+    var x_82 : bool;
+    var x_83_phi : bool;
+    let x_68 : i32 = i;
+    let x_70 : i32 = x_10.x_GLF_uniform_int_values[0];
+    if ((x_68 < x_70)) {
+    } else {
+      break;
+    }
+    let x_73 : i32 = b;
+    let x_75 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_76 : bool = (x_73 > x_75);
+    x_83_phi = x_76;
+    if (x_76) {
+      let x_79 : i32 = y;
+      let x_81 : i32 = x_10.x_GLF_uniform_int_values[1];
+      x_82 = (x_79 > x_81);
+      x_83_phi = x_82;
+    }
+    let x_83 : bool = x_83_phi;
+    if (x_83) {
+      break;
+    }
+    let x_86 : i32 = b;
+    b = (x_86 + 1);
+
+    continuing {
+      let x_88 : i32 = i;
+      i = (x_88 + 1);
+    }
+  }
+  let x_90 : i32 = b;
+  let x_92 : i32 = x_10.x_GLF_uniform_int_values[0];
+  if ((x_90 == x_92)) {
+    let x_97 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_99 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_101 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_104 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_107 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_110 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_113 : i32 = x_10.x_GLF_uniform_int_values[1];
+    data[clamp(x_97, x_99, x_101)] = vec4<f32>(f32(x_104), f32(x_107), f32(x_110), f32(x_113));
+  }
+  let x_118 : i32 = x_10.x_GLF_uniform_int_values[1];
+  let x_120 : vec4<f32> = data[x_118];
+  x_GLF_color = vec4<f32>(x_120.x, x_120.y, x_120.z, x_120.w);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-clamp-array-access/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-clamp-array-access/0-opt.wgsl
new file mode 100644
index 0000000..5e2efc9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-clamp-array-access/0-opt.wgsl
@@ -0,0 +1,99 @@
+type Arr = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var data : array<vec4<f32>, 2>;
+  var b : i32;
+  var y : i32;
+  var i : i32;
+  let x_42 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_45 : f32 = x_7.x_GLF_uniform_float_values[0];
+  data = array<vec4<f32>, 2>(vec4<f32>(x_42, x_42, x_42, x_42), vec4<f32>(x_45, x_45, x_45, x_45));
+  let x_49 : i32 = x_10.x_GLF_uniform_int_values[1];
+  b = x_49;
+  let x_51 : f32 = gl_FragCoord.y;
+  let x_54 : i32 = x_10.x_GLF_uniform_int_values[1];
+  let x_56 : f32 = gl_FragCoord.y;
+  let x_60 : i32 = x_10.x_GLF_uniform_int_values[1];
+  y = clamp(i32(x_51), (x_54 | i32(x_56)), x_60);
+  let x_63 : i32 = x_10.x_GLF_uniform_int_values[1];
+  i = x_63;
+  loop {
+    var x_82 : bool;
+    var x_83_phi : bool;
+    let x_68 : i32 = i;
+    let x_70 : i32 = x_10.x_GLF_uniform_int_values[0];
+    if ((x_68 < x_70)) {
+    } else {
+      break;
+    }
+    let x_73 : i32 = b;
+    let x_75 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_76 : bool = (x_73 > x_75);
+    x_83_phi = x_76;
+    if (x_76) {
+      let x_79 : i32 = y;
+      let x_81 : i32 = x_10.x_GLF_uniform_int_values[1];
+      x_82 = (x_79 > x_81);
+      x_83_phi = x_82;
+    }
+    let x_83 : bool = x_83_phi;
+    if (x_83) {
+      break;
+    }
+    let x_86 : i32 = b;
+    b = (x_86 + 1);
+
+    continuing {
+      let x_88 : i32 = i;
+      i = (x_88 + 1);
+    }
+  }
+  let x_90 : i32 = b;
+  let x_92 : i32 = x_10.x_GLF_uniform_int_values[0];
+  if ((x_90 == x_92)) {
+    let x_97 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_99 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_101 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_104 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_107 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_110 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_113 : i32 = x_10.x_GLF_uniform_int_values[1];
+    data[clamp(x_97, x_99, x_101)] = vec4<f32>(f32(x_104), f32(x_107), f32(x_110), f32(x_113));
+  }
+  let x_118 : i32 = x_10.x_GLF_uniform_int_values[1];
+  let x_120 : vec4<f32> = data[x_118];
+  x_GLF_color = vec4<f32>(x_120.x, x_120.y, x_120.z, x_120.w);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-clamp-array-access/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-clamp-array-access/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..2ab5b03
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-clamp-array-access/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,95 @@
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[1];
+};
+cbuffer cbuffer_x_10 : register(b1, space0) {
+  uint4 x_10[4];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 data[2] = (float4[2])0;
+  int b = 0;
+  int y = 0;
+  int i = 0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_42 = asfloat(x_7[scalar_offset / 4][scalar_offset % 4]);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_45 = asfloat(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const float4 tint_symbol_6[2] = {float4(x_42, x_42, x_42, x_42), float4(x_45, x_45, x_45, x_45)};
+  data = tint_symbol_6;
+  const int x_49 = asint(x_10[1].x);
+  b = x_49;
+  const float x_51 = gl_FragCoord.y;
+  const int x_54 = asint(x_10[1].x);
+  const float x_56 = gl_FragCoord.y;
+  const int x_60 = asint(x_10[1].x);
+  y = clamp(int(x_51), (x_54 | int(x_56)), x_60);
+  const int x_63 = asint(x_10[1].x);
+  i = x_63;
+  while (true) {
+    bool x_82 = false;
+    bool x_83_phi = false;
+    const int x_68 = i;
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_70 = asint(x_10[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    if ((x_68 < x_70)) {
+    } else {
+      break;
+    }
+    const int x_73 = b;
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_75 = asint(x_10[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const bool x_76 = (x_73 > x_75);
+    x_83_phi = x_76;
+    if (x_76) {
+      const int x_79 = y;
+      const int x_81 = asint(x_10[1].x);
+      x_82 = (x_79 > x_81);
+      x_83_phi = x_82;
+    }
+    if (x_83_phi) {
+      break;
+    }
+    b = (b + 1);
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_90 = b;
+  const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+  const int x_92 = asint(x_10[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+  if ((x_90 == x_92)) {
+    const int x_97 = asint(x_10[2].x);
+    const int x_99 = asint(x_10[1].x);
+    const int x_101 = asint(x_10[3].x);
+    const int x_104 = asint(x_10[1].x);
+    const int x_107 = asint(x_10[2].x);
+    const int x_110 = asint(x_10[2].x);
+    const int x_113 = asint(x_10[1].x);
+    data[clamp(x_97, x_99, x_101)] = float4(float(x_104), float(x_107), float(x_110), float(x_113));
+  }
+  const int x_118 = asint(x_10[1].x);
+  const float4 x_120 = data[x_118];
+  x_GLF_color = float4(x_120.x, x_120.y, x_120.z, x_120.w);
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_7 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_7;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-clamp-array-access/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-clamp-array-access/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..18db7a4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-clamp-array-access/0-opt.wgsl.expected.msl
@@ -0,0 +1,109 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[4];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_2 {
+  float4 arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, constant buf1& x_10, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  tint_array_wrapper_2 data = {};
+  int b = 0;
+  int y = 0;
+  int i = 0;
+  float const x_42 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  float const x_45 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  tint_array_wrapper_2 const tint_symbol_4 = {.arr={float4(x_42, x_42, x_42, x_42), float4(x_45, x_45, x_45, x_45)}};
+  data = tint_symbol_4;
+  int const x_49 = x_10.x_GLF_uniform_int_values.arr[1].el;
+  b = x_49;
+  float const x_51 = (*(tint_symbol_6)).y;
+  int const x_54 = x_10.x_GLF_uniform_int_values.arr[1].el;
+  float const x_56 = (*(tint_symbol_6)).y;
+  int const x_60 = x_10.x_GLF_uniform_int_values.arr[1].el;
+  y = clamp(int(x_51), (x_54 | int(x_56)), x_60);
+  int const x_63 = x_10.x_GLF_uniform_int_values.arr[1].el;
+  i = x_63;
+  while (true) {
+    bool x_82 = false;
+    bool x_83_phi = false;
+    int const x_68 = i;
+    int const x_70 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_68 < x_70)) {
+    } else {
+      break;
+    }
+    int const x_73 = b;
+    int const x_75 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    bool const x_76 = (x_73 > x_75);
+    x_83_phi = x_76;
+    if (x_76) {
+      int const x_79 = y;
+      int const x_81 = x_10.x_GLF_uniform_int_values.arr[1].el;
+      x_82 = (x_79 > x_81);
+      x_83_phi = x_82;
+    }
+    bool const x_83 = x_83_phi;
+    if (x_83) {
+      break;
+    }
+    int const x_86 = b;
+    b = (x_86 + 1);
+    {
+      int const x_88 = i;
+      i = (x_88 + 1);
+    }
+  }
+  int const x_90 = b;
+  int const x_92 = x_10.x_GLF_uniform_int_values.arr[0].el;
+  if ((x_90 == x_92)) {
+    int const x_97 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    int const x_99 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_101 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    int const x_104 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_107 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    int const x_110 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    int const x_113 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    data.arr[clamp(x_97, x_99, x_101)] = float4(float(x_104), float(x_107), float(x_110), float(x_113));
+  }
+  int const x_118 = x_10.x_GLF_uniform_int_values.arr[1].el;
+  float4 const x_120 = data.arr[x_118];
+  *(tint_symbol_7) = float4(x_120.x, x_120.y, x_120.z, x_120.w);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]], constant buf1& x_10 [[buffer(1)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_7, x_10, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-clamp-array-access/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-clamp-array-access/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..7fc19f9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-clamp-array-access/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,236 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 153
+; Schema: 0
+               OpCapability Shader
+         %61 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_7 "x_7"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %data "data"
+               OpName %b "b"
+               OpName %y "y"
+               OpName %i "i"
+               OpName %x_82 "x_82"
+               OpName %x_83_phi "x_83_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 1
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v4float_uint_2 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf1 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_10 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %17
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+     %uint_2 = OpConstant %uint 2
+%_arr_v4float_uint_2 = OpTypeArray %v4float %uint_2
+%_ptr_Function__arr_v4float_uint_2 = OpTypePointer Function %_arr_v4float_uint_2
+         %31 = OpConstantNull %_arr_v4float_uint_2
+%_ptr_Function_int = OpTypePointer Function %int
+         %34 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Private_float = OpTypePointer Private %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %74 = OpConstantNull %bool
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+   %main_out = OpTypeStruct %v4float
+        %140 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %23
+         %26 = OpLabel
+       %data = OpVariable %_ptr_Function__arr_v4float_uint_2 Function %31
+          %b = OpVariable %_ptr_Function_int Function %34
+          %y = OpVariable %_ptr_Function_int Function %34
+          %i = OpVariable %_ptr_Function_int Function %34
+       %x_82 = OpVariable %_ptr_Function_bool Function %74
+   %x_83_phi = OpVariable %_ptr_Function_bool Function %74
+         %40 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %41 = OpLoad %float %40
+         %42 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %43 = OpLoad %float %42
+         %44 = OpCompositeConstruct %v4float %41 %41 %41 %41
+         %45 = OpCompositeConstruct %v4float %43 %43 %43 %43
+         %46 = OpCompositeConstruct %_arr_v4float_uint_2 %44 %45
+               OpStore %data %46
+         %49 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %50 = OpLoad %int %49
+               OpStore %b %50
+         %52 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %53 = OpLoad %float %52
+         %54 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %55 = OpLoad %int %54
+         %56 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %57 = OpLoad %float %56
+         %58 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %59 = OpLoad %int %58
+         %62 = OpConvertFToS %int %53
+         %63 = OpConvertFToS %int %57
+         %64 = OpBitwiseOr %int %55 %63
+         %60 = OpExtInst %int %61 SClamp %62 %64 %59
+               OpStore %y %60
+         %65 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %66 = OpLoad %int %65
+               OpStore %i %66
+               OpBranch %67
+         %67 = OpLabel
+               OpLoopMerge %68 %69 None
+               OpBranch %70
+         %70 = OpLabel
+         %76 = OpLoad %int %i
+         %77 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %78 = OpLoad %int %77
+         %79 = OpSLessThan %bool %76 %78
+               OpSelectionMerge %80 None
+               OpBranchConditional %79 %81 %82
+         %81 = OpLabel
+               OpBranch %80
+         %82 = OpLabel
+               OpBranch %68
+         %80 = OpLabel
+         %83 = OpLoad %int %b
+         %84 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %85 = OpLoad %int %84
+         %86 = OpSGreaterThan %bool %83 %85
+               OpStore %x_83_phi %86
+               OpSelectionMerge %87 None
+               OpBranchConditional %86 %88 %87
+         %88 = OpLabel
+         %89 = OpLoad %int %y
+         %90 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %91 = OpLoad %int %90
+         %92 = OpSGreaterThan %bool %89 %91
+               OpStore %x_82 %92
+         %93 = OpLoad %bool %x_82
+               OpStore %x_83_phi %93
+               OpBranch %87
+         %87 = OpLabel
+         %94 = OpLoad %bool %x_83_phi
+               OpSelectionMerge %95 None
+               OpBranchConditional %94 %96 %95
+         %96 = OpLabel
+               OpBranch %68
+         %95 = OpLabel
+         %97 = OpLoad %int %b
+         %98 = OpIAdd %int %97 %int_1
+               OpStore %b %98
+               OpBranch %69
+         %69 = OpLabel
+         %99 = OpLoad %int %i
+        %100 = OpIAdd %int %99 %int_1
+               OpStore %i %100
+               OpBranch %67
+         %68 = OpLabel
+        %101 = OpLoad %int %b
+        %102 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %103 = OpLoad %int %102
+        %104 = OpIEqual %bool %101 %103
+               OpSelectionMerge %105 None
+               OpBranchConditional %104 %106 %105
+        %106 = OpLabel
+        %108 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %109 = OpLoad %int %108
+        %110 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %111 = OpLoad %int %110
+        %113 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+        %114 = OpLoad %int %113
+        %115 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %116 = OpLoad %int %115
+        %117 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %118 = OpLoad %int %117
+        %119 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %120 = OpLoad %int %119
+        %121 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %122 = OpLoad %int %121
+        %123 = OpExtInst %int %61 SClamp %109 %111 %114
+        %125 = OpAccessChain %_ptr_Function_v4float %data %123
+        %126 = OpConvertSToF %float %116
+        %127 = OpConvertSToF %float %118
+        %128 = OpConvertSToF %float %120
+        %129 = OpConvertSToF %float %122
+        %130 = OpCompositeConstruct %v4float %126 %127 %128 %129
+               OpStore %125 %130
+               OpBranch %105
+        %105 = OpLabel
+        %131 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %132 = OpLoad %int %131
+        %133 = OpAccessChain %_ptr_Function_v4float %data %132
+        %134 = OpLoad %v4float %133
+        %135 = OpCompositeExtract %float %134 0
+        %136 = OpCompositeExtract %float %134 1
+        %137 = OpCompositeExtract %float %134 2
+        %138 = OpCompositeExtract %float %134 3
+        %139 = OpCompositeConstruct %v4float %135 %136 %137 %138
+               OpStore %x_GLF_color %139
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %140
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %144 = OpLabel
+        %145 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %145
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %23
+        %147 = OpLabel
+        %148 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %148
+        %149 = OpFunctionCall %void %main_1
+        %151 = OpLoad %v4float %x_GLF_color
+        %152 = OpCompositeConstruct %main_out %151
+        %150 = OpFunctionCall %void %tint_symbol_3 %152
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-clamp-array-access/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-clamp-array-access/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..5e2efc9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-clamp-array-access/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,99 @@
+type Arr = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var data : array<vec4<f32>, 2>;
+  var b : i32;
+  var y : i32;
+  var i : i32;
+  let x_42 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_45 : f32 = x_7.x_GLF_uniform_float_values[0];
+  data = array<vec4<f32>, 2>(vec4<f32>(x_42, x_42, x_42, x_42), vec4<f32>(x_45, x_45, x_45, x_45));
+  let x_49 : i32 = x_10.x_GLF_uniform_int_values[1];
+  b = x_49;
+  let x_51 : f32 = gl_FragCoord.y;
+  let x_54 : i32 = x_10.x_GLF_uniform_int_values[1];
+  let x_56 : f32 = gl_FragCoord.y;
+  let x_60 : i32 = x_10.x_GLF_uniform_int_values[1];
+  y = clamp(i32(x_51), (x_54 | i32(x_56)), x_60);
+  let x_63 : i32 = x_10.x_GLF_uniform_int_values[1];
+  i = x_63;
+  loop {
+    var x_82 : bool;
+    var x_83_phi : bool;
+    let x_68 : i32 = i;
+    let x_70 : i32 = x_10.x_GLF_uniform_int_values[0];
+    if ((x_68 < x_70)) {
+    } else {
+      break;
+    }
+    let x_73 : i32 = b;
+    let x_75 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_76 : bool = (x_73 > x_75);
+    x_83_phi = x_76;
+    if (x_76) {
+      let x_79 : i32 = y;
+      let x_81 : i32 = x_10.x_GLF_uniform_int_values[1];
+      x_82 = (x_79 > x_81);
+      x_83_phi = x_82;
+    }
+    let x_83 : bool = x_83_phi;
+    if (x_83) {
+      break;
+    }
+    let x_86 : i32 = b;
+    b = (x_86 + 1);
+
+    continuing {
+      let x_88 : i32 = i;
+      i = (x_88 + 1);
+    }
+  }
+  let x_90 : i32 = b;
+  let x_92 : i32 = x_10.x_GLF_uniform_int_values[0];
+  if ((x_90 == x_92)) {
+    let x_97 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_99 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_101 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_104 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_107 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_110 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_113 : i32 = x_10.x_GLF_uniform_int_values[1];
+    data[clamp(x_97, x_99, x_101)] = vec4<f32>(f32(x_104), f32(x_107), f32(x_110), f32(x_113));
+  }
+  let x_118 : i32 = x_10.x_GLF_uniform_int_values[1];
+  let x_120 : vec4<f32> = data[x_118];
+  x_GLF_color = vec4<f32>(x_120.x, x_120.y, x_120.z, x_120.w);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-multiply/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-multiply/0-opt.spvasm
new file mode 100644
index 0000000..b71a3d0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-multiply/0-opt.spvasm
@@ -0,0 +1,153 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %icoord "icoord"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %icoord_0 "icoord"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_arr_float_uint_4 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_1 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+       %buf1 = OpTypeStruct %_arr_float_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+    %v2float = OpTypeVector %float 2
+      %int_2 = OpConstant %int 2
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+      %int_3 = OpConstant %int 3
+%_ptr_Function_int = OpTypePointer Function %int
+     %uint_1 = OpConstant %uint 1
+%_arr_int_uint_1 = OpTypeArray %int %uint_1
+       %buf0 = OpTypeStruct %_arr_int_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_float = OpTypePointer Function %float
+       %main = OpFunction %void None %14
+         %39 = OpLabel
+     %icoord = OpVariable %_ptr_Function_v2int Function
+         %40 = OpVariable %_ptr_Function_float Function
+   %icoord_0 = OpVariable %_ptr_Function_v2int Function
+         %41 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %42 = OpLoad %float %41
+         %43 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %44 = OpLoad %float %43
+         %45 = OpFMul %float %42 %44
+         %46 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %47 = OpLoad %float %46
+         %48 = OpFOrdGreaterThan %bool %45 %47
+               OpSelectionMerge %49 None
+               OpBranchConditional %48 %50 %51
+         %50 = OpLabel
+         %52 = OpLoad %v4float %gl_FragCoord
+         %53 = OpVectorShuffle %v2float %52 %52 0 1
+         %54 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %55 = OpLoad %float %54
+         %56 = OpVectorTimesScalar %v2float %53 %55
+         %57 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %58 = OpLoad %float %57
+         %59 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %60 = OpLoad %float %59
+         %61 = OpCompositeConstruct %v2float %58 %60
+         %62 = OpFSub %v2float %56 %61
+         %63 = OpConvertFToS %v2int %62
+               OpStore %icoord %63
+         %64 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %65 = OpLoad %float %64
+         %66 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_3
+         %67 = OpLoad %float %66
+         %68 = OpAccessChain %_ptr_Function_int %icoord %uint_0
+         %69 = OpLoad %int %68
+         %70 = OpAccessChain %_ptr_Function_int %icoord %uint_1
+         %71 = OpLoad %int %70
+         %72 = OpIMul %int %69 %71
+         %73 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %74 = OpLoad %int %73
+         %75 = OpINotEqual %bool %72 %74
+               OpSelectionMerge %76 None
+               OpBranchConditional %75 %77 %78
+         %77 = OpLabel
+         %79 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_3
+         %80 = OpLoad %float %79
+               OpStore %40 %80
+               OpBranch %76
+         %78 = OpLabel
+         %81 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %82 = OpLoad %float %81
+               OpStore %40 %82
+               OpBranch %76
+         %76 = OpLabel
+         %83 = OpLoad %float %40
+         %84 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %85 = OpLoad %int %84
+         %86 = OpConvertSToF %float %85
+         %87 = OpCompositeConstruct %v4float %65 %67 %83 %86
+               OpStore %_GLF_color %87
+               OpBranch %49
+         %51 = OpLabel
+         %88 = OpLoad %v4float %gl_FragCoord
+         %89 = OpVectorShuffle %v2float %88 %88 0 1
+         %90 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %91 = OpLoad %float %90
+         %92 = OpVectorTimesScalar %v2float %89 %91
+         %93 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %94 = OpLoad %float %93
+         %95 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %96 = OpLoad %float %95
+         %97 = OpCompositeConstruct %v2float %94 %96
+         %98 = OpFSub %v2float %92 %97
+         %99 = OpConvertFToS %v2int %98
+               OpStore %icoord_0 %99
+        %100 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_3
+        %101 = OpLoad %float %100
+        %102 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_3
+        %103 = OpLoad %float %102
+        %104 = OpAccessChain %_ptr_Function_int %icoord_0 %uint_0
+        %105 = OpLoad %int %104
+        %106 = OpConvertSToF %float %105
+        %107 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_3
+        %108 = OpLoad %float %107
+        %109 = OpCompositeConstruct %v4float %101 %103 %106 %108
+               OpStore %_GLF_color %109
+               OpBranch %49
+         %49 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-multiply/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-multiply/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..8837bf0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-multiply/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,75 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[1];
+};
+
+void main_1() {
+  int2 icoord = int2(0, 0);
+  float x_40 = 0.0f;
+  int2 icoord_1 = int2(0, 0);
+  const float x_42 = gl_FragCoord.x;
+  const float x_44 = asfloat(x_6[1].x);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_47 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  if (((x_42 * x_44) > x_47)) {
+    const float4 x_52 = gl_FragCoord;
+    const float x_55 = asfloat(x_6[1].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const float x_58 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const float x_60 = asfloat(x_6[2].x);
+    icoord = int2(((float2(x_52.x, x_52.y) * x_55) - float2(x_58, x_60)));
+    const float x_65 = asfloat(x_6[2].x);
+    const float x_67 = asfloat(x_6[3].x);
+    const int x_69 = icoord.x;
+    const int x_71 = icoord.y;
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_74 = asint(x_9[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    if (((x_69 * x_71) != x_74)) {
+      const float x_80 = asfloat(x_6[3].x);
+      x_40 = x_80;
+    } else {
+      const float x_82 = asfloat(x_6[2].x);
+      x_40 = x_82;
+    }
+    const float x_83 = x_40;
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_85 = asint(x_9[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    x_GLF_color = float4(x_65, x_67, x_83, float(x_85));
+  } else {
+    const float4 x_88 = gl_FragCoord;
+    const float x_91 = asfloat(x_6[1].x);
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const float x_94 = asfloat(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const float x_96 = asfloat(x_6[2].x);
+    icoord_1 = int2(((float2(x_88.x, x_88.y) * x_91) - float2(x_94, x_96)));
+    const float x_101 = asfloat(x_6[3].x);
+    const float x_103 = asfloat(x_6[3].x);
+    const int x_105 = icoord_1.x;
+    const float x_108 = asfloat(x_6[3].x);
+    x_GLF_color = float4(x_101, x_103, float(x_105), x_108);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-multiply/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-multiply/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..c57161c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-multiply/0-opt.spvasm.expected.msl
@@ -0,0 +1,83 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_9, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int2 icoord = 0;
+  float x_40 = 0.0f;
+  int2 icoord_1 = 0;
+  float const x_42 = (*(tint_symbol_5)).x;
+  float const x_44 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  float const x_47 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  if (((x_42 * x_44) > x_47)) {
+    float4 const x_52 = *(tint_symbol_5);
+    float const x_55 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    float const x_58 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    float const x_60 = x_6.x_GLF_uniform_float_values.arr[2].el;
+    icoord = int2(((float2(x_52.x, x_52.y) * x_55) - float2(x_58, x_60)));
+    float const x_65 = x_6.x_GLF_uniform_float_values.arr[2].el;
+    float const x_67 = x_6.x_GLF_uniform_float_values.arr[3].el;
+    int const x_69 = icoord.x;
+    int const x_71 = icoord.y;
+    int const x_74 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    if (((x_69 * x_71) != x_74)) {
+      float const x_80 = x_6.x_GLF_uniform_float_values.arr[3].el;
+      x_40 = x_80;
+    } else {
+      float const x_82 = x_6.x_GLF_uniform_float_values.arr[2].el;
+      x_40 = x_82;
+    }
+    float const x_83 = x_40;
+    int const x_85 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_6) = float4(x_65, x_67, x_83, float(x_85));
+  } else {
+    float4 const x_88 = *(tint_symbol_5);
+    float const x_91 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    float const x_94 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    float const x_96 = x_6.x_GLF_uniform_float_values.arr[2].el;
+    icoord_1 = int2(((float2(x_88.x, x_88.y) * x_91) - float2(x_94, x_96)));
+    float const x_101 = x_6.x_GLF_uniform_float_values.arr[3].el;
+    float const x_103 = x_6.x_GLF_uniform_float_values.arr[3].el;
+    int const x_105 = icoord_1.x;
+    float const x_108 = x_6.x_GLF_uniform_float_values.arr[3].el;
+    *(tint_symbol_6) = float4(x_101, x_103, float(x_105), x_108);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf1& x_6 [[buffer(1)]], constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_6, x_9, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-multiply/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-multiply/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..76e8564
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-multiply/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,196 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 132
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %icoord "icoord"
+               OpName %x_40 "x_40"
+               OpName %icoord_1 "icoord_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_4 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_1 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+       %buf1 = OpTypeStruct %_arr_float_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+     %uint_1 = OpConstant %uint 1
+%_arr_int_uint_1 = OpTypeArray %int %uint_1
+       %buf0 = OpTypeStruct %_arr_int_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %30 = OpConstantNull %v2int
+%_ptr_Function_float = OpTypePointer Function %float
+         %33 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+    %v2float = OpTypeVector %float 2
+      %int_3 = OpConstant %int 3
+%_ptr_Function_int = OpTypePointer Function %int
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+        %119 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %23
+         %26 = OpLabel
+     %icoord = OpVariable %_ptr_Function_v2int Function %30
+       %x_40 = OpVariable %_ptr_Function_float Function %33
+   %icoord_1 = OpVariable %_ptr_Function_v2int Function %30
+         %37 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %38 = OpLoad %float %37
+         %41 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %42 = OpLoad %float %41
+         %44 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %45 = OpLoad %float %44
+         %46 = OpFMul %float %38 %42
+         %47 = OpFOrdGreaterThan %bool %46 %45
+               OpSelectionMerge %49 None
+               OpBranchConditional %47 %50 %51
+         %50 = OpLabel
+         %52 = OpLoad %v4float %gl_FragCoord
+         %53 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %54 = OpLoad %float %53
+         %55 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %56 = OpLoad %float %55
+         %58 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %59 = OpLoad %float %58
+         %62 = OpCompositeExtract %float %52 0
+         %63 = OpCompositeExtract %float %52 1
+         %64 = OpCompositeConstruct %v2float %62 %63
+         %65 = OpVectorTimesScalar %v2float %64 %54
+         %66 = OpCompositeConstruct %v2float %56 %59
+         %67 = OpFSub %v2float %65 %66
+         %60 = OpConvertFToS %v2int %67
+               OpStore %icoord %60
+         %68 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %69 = OpLoad %float %68
+         %71 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+         %72 = OpLoad %float %71
+         %74 = OpAccessChain %_ptr_Function_int %icoord %uint_0
+         %75 = OpLoad %int %74
+         %76 = OpAccessChain %_ptr_Function_int %icoord %uint_1
+         %77 = OpLoad %int %76
+         %79 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %80 = OpLoad %int %79
+         %81 = OpIMul %int %75 %77
+         %82 = OpINotEqual %bool %81 %80
+               OpSelectionMerge %83 None
+               OpBranchConditional %82 %84 %85
+         %84 = OpLabel
+         %86 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+         %87 = OpLoad %float %86
+               OpStore %x_40 %87
+               OpBranch %83
+         %85 = OpLabel
+         %88 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %89 = OpLoad %float %88
+               OpStore %x_40 %89
+               OpBranch %83
+         %83 = OpLabel
+         %90 = OpLoad %float %x_40
+         %91 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %92 = OpLoad %int %91
+         %93 = OpConvertSToF %float %92
+         %94 = OpCompositeConstruct %v4float %69 %72 %90 %93
+               OpStore %x_GLF_color %94
+               OpBranch %49
+         %51 = OpLabel
+         %95 = OpLoad %v4float %gl_FragCoord
+         %96 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %97 = OpLoad %float %96
+         %98 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %99 = OpLoad %float %98
+        %100 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+        %101 = OpLoad %float %100
+        %103 = OpCompositeExtract %float %95 0
+        %104 = OpCompositeExtract %float %95 1
+        %105 = OpCompositeConstruct %v2float %103 %104
+        %106 = OpVectorTimesScalar %v2float %105 %97
+        %107 = OpCompositeConstruct %v2float %99 %101
+        %108 = OpFSub %v2float %106 %107
+        %102 = OpConvertFToS %v2int %108
+               OpStore %icoord_1 %102
+        %109 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+        %110 = OpLoad %float %109
+        %111 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+        %112 = OpLoad %float %111
+        %113 = OpAccessChain %_ptr_Function_int %icoord_1 %uint_0
+        %114 = OpLoad %int %113
+        %115 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+        %116 = OpLoad %float %115
+        %117 = OpConvertSToF %float %114
+        %118 = OpCompositeConstruct %v4float %110 %112 %117 %116
+               OpStore %x_GLF_color %118
+               OpBranch %49
+         %49 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %119
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %123 = OpLabel
+        %124 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %124
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %23
+        %126 = OpLabel
+        %127 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %127
+        %128 = OpFunctionCall %void %main_1
+        %130 = OpLoad %v4float %x_GLF_color
+        %131 = OpCompositeConstruct %main_out %130
+        %129 = OpFunctionCall %void %tint_symbol_3 %131
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-multiply/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-multiply/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..8306f38
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-multiply/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,76 @@
+type Arr = [[stride(16)]] array<f32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+fn main_1() {
+  var icoord : vec2<i32>;
+  var x_40 : f32;
+  var icoord_1 : vec2<i32>;
+  let x_42 : f32 = gl_FragCoord.x;
+  let x_44 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_47 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if (((x_42 * x_44) > x_47)) {
+    let x_52 : vec4<f32> = gl_FragCoord;
+    let x_55 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_58 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_60 : f32 = x_6.x_GLF_uniform_float_values[2];
+    icoord = vec2<i32>(((vec2<f32>(x_52.x, x_52.y) * x_55) - vec2<f32>(x_58, x_60)));
+    let x_65 : f32 = x_6.x_GLF_uniform_float_values[2];
+    let x_67 : f32 = x_6.x_GLF_uniform_float_values[3];
+    let x_69 : i32 = icoord.x;
+    let x_71 : i32 = icoord.y;
+    let x_74 : i32 = x_9.x_GLF_uniform_int_values[0];
+    if (((x_69 * x_71) != x_74)) {
+      let x_80 : f32 = x_6.x_GLF_uniform_float_values[3];
+      x_40 = x_80;
+    } else {
+      let x_82 : f32 = x_6.x_GLF_uniform_float_values[2];
+      x_40 = x_82;
+    }
+    let x_83 : f32 = x_40;
+    let x_85 : i32 = x_9.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(x_65, x_67, x_83, f32(x_85));
+  } else {
+    let x_88 : vec4<f32> = gl_FragCoord;
+    let x_91 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_94 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_96 : f32 = x_6.x_GLF_uniform_float_values[2];
+    icoord_1 = vec2<i32>(((vec2<f32>(x_88.x, x_88.y) * x_91) - vec2<f32>(x_94, x_96)));
+    let x_101 : f32 = x_6.x_GLF_uniform_float_values[3];
+    let x_103 : f32 = x_6.x_GLF_uniform_float_values[3];
+    let x_105 : i32 = icoord_1.x;
+    let x_108 : f32 = x_6.x_GLF_uniform_float_values[3];
+    x_GLF_color = vec4<f32>(x_101, x_103, f32(x_105), x_108);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-multiply/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-multiply/0-opt.wgsl
new file mode 100644
index 0000000..8306f38
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-multiply/0-opt.wgsl
@@ -0,0 +1,76 @@
+type Arr = [[stride(16)]] array<f32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+fn main_1() {
+  var icoord : vec2<i32>;
+  var x_40 : f32;
+  var icoord_1 : vec2<i32>;
+  let x_42 : f32 = gl_FragCoord.x;
+  let x_44 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_47 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if (((x_42 * x_44) > x_47)) {
+    let x_52 : vec4<f32> = gl_FragCoord;
+    let x_55 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_58 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_60 : f32 = x_6.x_GLF_uniform_float_values[2];
+    icoord = vec2<i32>(((vec2<f32>(x_52.x, x_52.y) * x_55) - vec2<f32>(x_58, x_60)));
+    let x_65 : f32 = x_6.x_GLF_uniform_float_values[2];
+    let x_67 : f32 = x_6.x_GLF_uniform_float_values[3];
+    let x_69 : i32 = icoord.x;
+    let x_71 : i32 = icoord.y;
+    let x_74 : i32 = x_9.x_GLF_uniform_int_values[0];
+    if (((x_69 * x_71) != x_74)) {
+      let x_80 : f32 = x_6.x_GLF_uniform_float_values[3];
+      x_40 = x_80;
+    } else {
+      let x_82 : f32 = x_6.x_GLF_uniform_float_values[2];
+      x_40 = x_82;
+    }
+    let x_83 : f32 = x_40;
+    let x_85 : i32 = x_9.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(x_65, x_67, x_83, f32(x_85));
+  } else {
+    let x_88 : vec4<f32> = gl_FragCoord;
+    let x_91 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_94 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_96 : f32 = x_6.x_GLF_uniform_float_values[2];
+    icoord_1 = vec2<i32>(((vec2<f32>(x_88.x, x_88.y) * x_91) - vec2<f32>(x_94, x_96)));
+    let x_101 : f32 = x_6.x_GLF_uniform_float_values[3];
+    let x_103 : f32 = x_6.x_GLF_uniform_float_values[3];
+    let x_105 : i32 = icoord_1.x;
+    let x_108 : f32 = x_6.x_GLF_uniform_float_values[3];
+    x_GLF_color = vec4<f32>(x_101, x_103, f32(x_105), x_108);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-multiply/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-multiply/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..8837bf0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-multiply/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,75 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[1];
+};
+
+void main_1() {
+  int2 icoord = int2(0, 0);
+  float x_40 = 0.0f;
+  int2 icoord_1 = int2(0, 0);
+  const float x_42 = gl_FragCoord.x;
+  const float x_44 = asfloat(x_6[1].x);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_47 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  if (((x_42 * x_44) > x_47)) {
+    const float4 x_52 = gl_FragCoord;
+    const float x_55 = asfloat(x_6[1].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const float x_58 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const float x_60 = asfloat(x_6[2].x);
+    icoord = int2(((float2(x_52.x, x_52.y) * x_55) - float2(x_58, x_60)));
+    const float x_65 = asfloat(x_6[2].x);
+    const float x_67 = asfloat(x_6[3].x);
+    const int x_69 = icoord.x;
+    const int x_71 = icoord.y;
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_74 = asint(x_9[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    if (((x_69 * x_71) != x_74)) {
+      const float x_80 = asfloat(x_6[3].x);
+      x_40 = x_80;
+    } else {
+      const float x_82 = asfloat(x_6[2].x);
+      x_40 = x_82;
+    }
+    const float x_83 = x_40;
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_85 = asint(x_9[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    x_GLF_color = float4(x_65, x_67, x_83, float(x_85));
+  } else {
+    const float4 x_88 = gl_FragCoord;
+    const float x_91 = asfloat(x_6[1].x);
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const float x_94 = asfloat(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const float x_96 = asfloat(x_6[2].x);
+    icoord_1 = int2(((float2(x_88.x, x_88.y) * x_91) - float2(x_94, x_96)));
+    const float x_101 = asfloat(x_6[3].x);
+    const float x_103 = asfloat(x_6[3].x);
+    const int x_105 = icoord_1.x;
+    const float x_108 = asfloat(x_6[3].x);
+    x_GLF_color = float4(x_101, x_103, float(x_105), x_108);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-multiply/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-multiply/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..c57161c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-multiply/0-opt.wgsl.expected.msl
@@ -0,0 +1,83 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_9, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int2 icoord = 0;
+  float x_40 = 0.0f;
+  int2 icoord_1 = 0;
+  float const x_42 = (*(tint_symbol_5)).x;
+  float const x_44 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  float const x_47 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  if (((x_42 * x_44) > x_47)) {
+    float4 const x_52 = *(tint_symbol_5);
+    float const x_55 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    float const x_58 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    float const x_60 = x_6.x_GLF_uniform_float_values.arr[2].el;
+    icoord = int2(((float2(x_52.x, x_52.y) * x_55) - float2(x_58, x_60)));
+    float const x_65 = x_6.x_GLF_uniform_float_values.arr[2].el;
+    float const x_67 = x_6.x_GLF_uniform_float_values.arr[3].el;
+    int const x_69 = icoord.x;
+    int const x_71 = icoord.y;
+    int const x_74 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    if (((x_69 * x_71) != x_74)) {
+      float const x_80 = x_6.x_GLF_uniform_float_values.arr[3].el;
+      x_40 = x_80;
+    } else {
+      float const x_82 = x_6.x_GLF_uniform_float_values.arr[2].el;
+      x_40 = x_82;
+    }
+    float const x_83 = x_40;
+    int const x_85 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_6) = float4(x_65, x_67, x_83, float(x_85));
+  } else {
+    float4 const x_88 = *(tint_symbol_5);
+    float const x_91 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    float const x_94 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    float const x_96 = x_6.x_GLF_uniform_float_values.arr[2].el;
+    icoord_1 = int2(((float2(x_88.x, x_88.y) * x_91) - float2(x_94, x_96)));
+    float const x_101 = x_6.x_GLF_uniform_float_values.arr[3].el;
+    float const x_103 = x_6.x_GLF_uniform_float_values.arr[3].el;
+    int const x_105 = icoord_1.x;
+    float const x_108 = x_6.x_GLF_uniform_float_values.arr[3].el;
+    *(tint_symbol_6) = float4(x_101, x_103, float(x_105), x_108);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf1& x_6 [[buffer(1)]], constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_6, x_9, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-multiply/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-multiply/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..76e8564
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-multiply/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,196 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 132
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %icoord "icoord"
+               OpName %x_40 "x_40"
+               OpName %icoord_1 "icoord_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_4 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_1 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+       %buf1 = OpTypeStruct %_arr_float_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+     %uint_1 = OpConstant %uint 1
+%_arr_int_uint_1 = OpTypeArray %int %uint_1
+       %buf0 = OpTypeStruct %_arr_int_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %30 = OpConstantNull %v2int
+%_ptr_Function_float = OpTypePointer Function %float
+         %33 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+    %v2float = OpTypeVector %float 2
+      %int_3 = OpConstant %int 3
+%_ptr_Function_int = OpTypePointer Function %int
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+        %119 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %23
+         %26 = OpLabel
+     %icoord = OpVariable %_ptr_Function_v2int Function %30
+       %x_40 = OpVariable %_ptr_Function_float Function %33
+   %icoord_1 = OpVariable %_ptr_Function_v2int Function %30
+         %37 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %38 = OpLoad %float %37
+         %41 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %42 = OpLoad %float %41
+         %44 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %45 = OpLoad %float %44
+         %46 = OpFMul %float %38 %42
+         %47 = OpFOrdGreaterThan %bool %46 %45
+               OpSelectionMerge %49 None
+               OpBranchConditional %47 %50 %51
+         %50 = OpLabel
+         %52 = OpLoad %v4float %gl_FragCoord
+         %53 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %54 = OpLoad %float %53
+         %55 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %56 = OpLoad %float %55
+         %58 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %59 = OpLoad %float %58
+         %62 = OpCompositeExtract %float %52 0
+         %63 = OpCompositeExtract %float %52 1
+         %64 = OpCompositeConstruct %v2float %62 %63
+         %65 = OpVectorTimesScalar %v2float %64 %54
+         %66 = OpCompositeConstruct %v2float %56 %59
+         %67 = OpFSub %v2float %65 %66
+         %60 = OpConvertFToS %v2int %67
+               OpStore %icoord %60
+         %68 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %69 = OpLoad %float %68
+         %71 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+         %72 = OpLoad %float %71
+         %74 = OpAccessChain %_ptr_Function_int %icoord %uint_0
+         %75 = OpLoad %int %74
+         %76 = OpAccessChain %_ptr_Function_int %icoord %uint_1
+         %77 = OpLoad %int %76
+         %79 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %80 = OpLoad %int %79
+         %81 = OpIMul %int %75 %77
+         %82 = OpINotEqual %bool %81 %80
+               OpSelectionMerge %83 None
+               OpBranchConditional %82 %84 %85
+         %84 = OpLabel
+         %86 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+         %87 = OpLoad %float %86
+               OpStore %x_40 %87
+               OpBranch %83
+         %85 = OpLabel
+         %88 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %89 = OpLoad %float %88
+               OpStore %x_40 %89
+               OpBranch %83
+         %83 = OpLabel
+         %90 = OpLoad %float %x_40
+         %91 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %92 = OpLoad %int %91
+         %93 = OpConvertSToF %float %92
+         %94 = OpCompositeConstruct %v4float %69 %72 %90 %93
+               OpStore %x_GLF_color %94
+               OpBranch %49
+         %51 = OpLabel
+         %95 = OpLoad %v4float %gl_FragCoord
+         %96 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %97 = OpLoad %float %96
+         %98 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %99 = OpLoad %float %98
+        %100 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+        %101 = OpLoad %float %100
+        %103 = OpCompositeExtract %float %95 0
+        %104 = OpCompositeExtract %float %95 1
+        %105 = OpCompositeConstruct %v2float %103 %104
+        %106 = OpVectorTimesScalar %v2float %105 %97
+        %107 = OpCompositeConstruct %v2float %99 %101
+        %108 = OpFSub %v2float %106 %107
+        %102 = OpConvertFToS %v2int %108
+               OpStore %icoord_1 %102
+        %109 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+        %110 = OpLoad %float %109
+        %111 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+        %112 = OpLoad %float %111
+        %113 = OpAccessChain %_ptr_Function_int %icoord_1 %uint_0
+        %114 = OpLoad %int %113
+        %115 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+        %116 = OpLoad %float %115
+        %117 = OpConvertSToF %float %114
+        %118 = OpCompositeConstruct %v4float %110 %112 %117 %116
+               OpStore %x_GLF_color %118
+               OpBranch %49
+         %49 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %119
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %123 = OpLabel
+        %124 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %124
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %23
+        %126 = OpLabel
+        %127 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %127
+        %128 = OpFunctionCall %void %main_1
+        %130 = OpLoad %v4float %x_GLF_color
+        %131 = OpCompositeConstruct %main_out %130
+        %129 = OpFunctionCall %void %tint_symbol_3 %131
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-multiply/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-multiply/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..8306f38
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-fragcoord-multiply/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,76 @@
+type Arr = [[stride(16)]] array<f32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+fn main_1() {
+  var icoord : vec2<i32>;
+  var x_40 : f32;
+  var icoord_1 : vec2<i32>;
+  let x_42 : f32 = gl_FragCoord.x;
+  let x_44 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_47 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if (((x_42 * x_44) > x_47)) {
+    let x_52 : vec4<f32> = gl_FragCoord;
+    let x_55 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_58 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_60 : f32 = x_6.x_GLF_uniform_float_values[2];
+    icoord = vec2<i32>(((vec2<f32>(x_52.x, x_52.y) * x_55) - vec2<f32>(x_58, x_60)));
+    let x_65 : f32 = x_6.x_GLF_uniform_float_values[2];
+    let x_67 : f32 = x_6.x_GLF_uniform_float_values[3];
+    let x_69 : i32 = icoord.x;
+    let x_71 : i32 = icoord.y;
+    let x_74 : i32 = x_9.x_GLF_uniform_int_values[0];
+    if (((x_69 * x_71) != x_74)) {
+      let x_80 : f32 = x_6.x_GLF_uniform_float_values[3];
+      x_40 = x_80;
+    } else {
+      let x_82 : f32 = x_6.x_GLF_uniform_float_values[2];
+      x_40 = x_82;
+    }
+    let x_83 : f32 = x_40;
+    let x_85 : i32 = x_9.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(x_65, x_67, x_83, f32(x_85));
+  } else {
+    let x_88 : vec4<f32> = gl_FragCoord;
+    let x_91 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_94 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_96 : f32 = x_6.x_GLF_uniform_float_values[2];
+    icoord_1 = vec2<i32>(((vec2<f32>(x_88.x, x_88.y) * x_91) - vec2<f32>(x_94, x_96)));
+    let x_101 : f32 = x_6.x_GLF_uniform_float_values[3];
+    let x_103 : f32 = x_6.x_GLF_uniform_float_values[3];
+    let x_105 : i32 = icoord_1.x;
+    let x_108 : f32 = x_6.x_GLF_uniform_float_values[3];
+    x_GLF_color = vec4<f32>(x_101, x_103, f32(x_105), x_108);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-function-fragcoord-condition-always-return/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-function-fragcoord-condition-always-return/0-opt.spvasm
new file mode 100644
index 0000000..be0471e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-function-fragcoord-condition-always-return/0-opt.spvasm
@@ -0,0 +1,168 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %func_f1_ "func(f1;"
+               OpName %x "x"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %param "param"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_arr_float_uint_4 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+         %18 = OpTypeFunction %float %_ptr_Function_float
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+       %buf1 = OpTypeStruct %_arr_float_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_0 = OpConstant %uint 0
+      %int_3 = OpConstant %int 3
+      %int_1 = OpConstant %int 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %main = OpFunction %void None %15
+         %39 = OpLabel
+      %param = OpVariable %_ptr_Function_float Function
+         %40 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %41 = OpLoad %float %40
+               OpStore %param %41
+         %42 = OpFunctionCall %float %func_f1_ %param
+         %43 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %44 = OpLoad %float %43
+         %45 = OpFOrdEqual %bool %42 %44
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %48
+         %47 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %50 = OpLoad %int %49
+         %51 = OpConvertSToF %float %50
+         %52 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %53 = OpLoad %int %52
+         %54 = OpConvertSToF %float %53
+         %55 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %56 = OpLoad %int %55
+         %57 = OpConvertSToF %float %56
+         %58 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %59 = OpLoad %int %58
+         %60 = OpConvertSToF %float %59
+         %61 = OpCompositeConstruct %v4float %51 %54 %57 %60
+               OpStore %_GLF_color %61
+               OpBranch %46
+         %48 = OpLabel
+         %62 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %63 = OpLoad %int %62
+         %64 = OpConvertSToF %float %63
+         %65 = OpCompositeConstruct %v4float %64 %64 %64 %64
+               OpStore %_GLF_color %65
+               OpBranch %46
+         %46 = OpLabel
+               OpReturn
+               OpFunctionEnd
+   %func_f1_ = OpFunction %float None %18
+          %x = OpFunctionParameter %_ptr_Function_float
+         %66 = OpLabel
+               OpBranch %67
+         %67 = OpLabel
+               OpLoopMerge %68 %69 None
+               OpBranch %70
+         %70 = OpLabel
+               OpBranchConditional %true %71 %68
+         %71 = OpLabel
+               OpBranch %72
+         %72 = OpLabel
+               OpLoopMerge %73 %74 None
+               OpBranch %75
+         %75 = OpLabel
+         %76 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %77 = OpLoad %float %76
+         %78 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %79 = OpLoad %float %78
+         %80 = OpFOrdLessThan %bool %77 %79
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %81
+         %82 = OpLabel
+               OpBranch %83
+         %83 = OpLabel
+               OpLoopMerge %84 %85 None
+               OpBranch %86
+         %86 = OpLabel
+               OpBranch %85
+         %85 = OpLabel
+         %87 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %88 = OpLoad %float %87
+         %89 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %90 = OpLoad %float %89
+         %91 = OpFOrdLessThan %bool %88 %90
+               OpBranchConditional %91 %83 %84
+         %84 = OpLabel
+               OpBranch %81
+         %81 = OpLabel
+         %92 = OpLoad %float %x
+         %93 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_3
+         %94 = OpLoad %float %93
+         %95 = OpFOrdLessThan %bool %92 %94
+               OpSelectionMerge %96 None
+               OpBranchConditional %95 %97 %96
+         %97 = OpLabel
+         %98 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %99 = OpLoad %float %98
+               OpReturnValue %99
+         %96 = OpLabel
+               OpBranch %74
+         %74 = OpLabel
+        %100 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %101 = OpLoad %float %100
+        %102 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+        %103 = OpLoad %float %102
+        %104 = OpFOrdLessThan %bool %101 %103
+               OpBranchConditional %104 %72 %73
+         %73 = OpLabel
+               OpBranch %69
+         %69 = OpLabel
+               OpBranch %67
+         %68 = OpLabel
+        %105 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+        %106 = OpLoad %float %105
+               OpReturnValue %106
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-function-fragcoord-condition-always-return/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-function-fragcoord-condition-always-return/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..44df57f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-function-fragcoord-condition-always-return/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,91 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_11 : register(b0, space0) {
+  uint4 x_11[2];
+};
+
+float func_f1_(inout float x) {
+  while (true) {
+    if (true) {
+    } else {
+      break;
+    }
+    while (true) {
+      const float x_77 = gl_FragCoord.y;
+      const float x_79 = asfloat(x_8[2].x);
+      if ((x_77 < x_79)) {
+        while (true) {
+          {
+            const float x_88 = gl_FragCoord.x;
+            const float x_90 = asfloat(x_8[2].x);
+            if ((x_88 < x_90)) {
+            } else {
+              break;
+            }
+          }
+        }
+      }
+      const float x_92 = x;
+      const float x_94 = asfloat(x_8[3].x);
+      if ((x_92 < x_94)) {
+        const float x_99 = asfloat(x_8[1].x);
+        return x_99;
+      }
+      {
+        const float x_101 = gl_FragCoord.y;
+        const float x_103 = asfloat(x_8[2].x);
+        if ((x_101 < x_103)) {
+        } else {
+          break;
+        }
+      }
+    }
+  }
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_106 = asfloat(x_8[scalar_offset / 4][scalar_offset % 4]);
+  return x_106;
+}
+
+void main_1() {
+  float param = 0.0f;
+  const float x_41 = gl_FragCoord.x;
+  param = x_41;
+  const float x_42 = func_f1_(param);
+  const float x_44 = asfloat(x_8[1].x);
+  if ((x_42 == x_44)) {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_50 = asint(x_11[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const int x_53 = asint(x_11[1].x);
+    const int x_56 = asint(x_11[1].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_59 = asint(x_11[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    x_GLF_color = float4(float(x_50), float(x_53), float(x_56), float(x_59));
+  } else {
+    const int x_63 = asint(x_11[1].x);
+    const float x_64 = float(x_63);
+    x_GLF_color = float4(x_64, x_64, x_64, x_64);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-function-fragcoord-condition-always-return/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-function-fragcoord-condition-always-return/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..bb3bd84
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-function-fragcoord-condition-always-return/0-opt.spvasm.expected.msl
@@ -0,0 +1,101 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float func_f1_(constant buf1& x_8, thread float* const x, thread float4* const tint_symbol_5) {
+  while (true) {
+    if (true) {
+    } else {
+      break;
+    }
+    while (true) {
+      float const x_77 = (*(tint_symbol_5)).y;
+      float const x_79 = x_8.x_GLF_uniform_float_values.arr[2].el;
+      if ((x_77 < x_79)) {
+        while (true) {
+          {
+            float const x_88 = (*(tint_symbol_5)).x;
+            float const x_90 = x_8.x_GLF_uniform_float_values.arr[2].el;
+            if ((x_88 < x_90)) {
+            } else {
+              break;
+            }
+          }
+        }
+      }
+      float const x_92 = *(x);
+      float const x_94 = x_8.x_GLF_uniform_float_values.arr[3].el;
+      if ((x_92 < x_94)) {
+        float const x_99 = x_8.x_GLF_uniform_float_values.arr[1].el;
+        return x_99;
+      }
+      {
+        float const x_101 = (*(tint_symbol_5)).y;
+        float const x_103 = x_8.x_GLF_uniform_float_values.arr[2].el;
+        if ((x_101 < x_103)) {
+        } else {
+          break;
+        }
+      }
+    }
+  }
+  float const x_106 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  return x_106;
+}
+
+void main_1(constant buf1& x_8, constant buf0& x_11, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  float param = 0.0f;
+  float const x_41 = (*(tint_symbol_6)).x;
+  param = x_41;
+  float const x_42 = func_f1_(x_8, &(param), tint_symbol_6);
+  float const x_44 = x_8.x_GLF_uniform_float_values.arr[1].el;
+  if ((x_42 == x_44)) {
+    int const x_50 = x_11.x_GLF_uniform_int_values.arr[0].el;
+    int const x_53 = x_11.x_GLF_uniform_int_values.arr[1].el;
+    int const x_56 = x_11.x_GLF_uniform_int_values.arr[1].el;
+    int const x_59 = x_11.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_7) = float4(float(x_50), float(x_53), float(x_56), float(x_59));
+  } else {
+    int const x_63 = x_11.x_GLF_uniform_int_values.arr[1].el;
+    float const x_64 = float(x_63);
+    *(tint_symbol_7) = float4(x_64, x_64, x_64, x_64);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf1& x_8 [[buffer(1)]], constant buf0& x_11 [[buffer(0)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_8, x_11, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-function-fragcoord-condition-always-return/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-function-fragcoord-condition-always-return/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..855bbda
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-function-fragcoord-condition-always-return/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,229 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 134
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_11 "x_11"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %func_f1_ "func_f1_"
+               OpName %x "x"
+               OpName %main_1 "main_1"
+               OpName %param "param"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_4 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_11 NonWritable
+               OpDecorate %x_11 DescriptorSet 0
+               OpDecorate %x_11 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+       %buf1 = OpTypeStruct %_arr_float_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_11 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Function_float = OpTypePointer Function %float
+         %23 = OpTypeFunction %float %_ptr_Function_float
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %uint_0 = OpConstant %uint 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_3 = OpConstant %int 3
+      %int_1 = OpConstant %int 1
+      %int_0 = OpConstant %int 0
+       %void = OpTypeVoid
+         %87 = OpTypeFunction %void
+         %92 = OpConstantNull %float
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+        %121 = OpTypeFunction %void %main_out
+   %func_f1_ = OpFunction %float None %23
+          %x = OpFunctionParameter %_ptr_Function_float
+         %27 = OpLabel
+               OpBranch %28
+         %28 = OpLabel
+               OpLoopMerge %29 %30 None
+               OpBranch %31
+         %31 = OpLabel
+               OpSelectionMerge %34 None
+               OpBranchConditional %true %35 %36
+         %35 = OpLabel
+               OpBranch %34
+         %36 = OpLabel
+               OpBranch %29
+         %34 = OpLabel
+               OpBranch %37
+         %37 = OpLabel
+               OpLoopMerge %38 %39 None
+               OpBranch %40
+         %40 = OpLabel
+         %43 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %44 = OpLoad %float %43
+         %48 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_2
+         %49 = OpLoad %float %48
+         %50 = OpFOrdLessThan %bool %44 %49
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %51
+         %52 = OpLabel
+               OpBranch %53
+         %53 = OpLabel
+               OpLoopMerge %54 %55 None
+               OpBranch %56
+         %56 = OpLabel
+               OpBranch %55
+         %55 = OpLabel
+         %57 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %58 = OpLoad %float %57
+         %59 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_2
+         %60 = OpLoad %float %59
+         %61 = OpFOrdLessThan %bool %58 %60
+               OpSelectionMerge %62 None
+               OpBranchConditional %61 %63 %64
+         %63 = OpLabel
+               OpBranch %62
+         %64 = OpLabel
+               OpBranch %54
+         %62 = OpLabel
+               OpBranch %53
+         %54 = OpLabel
+               OpBranch %51
+         %51 = OpLabel
+         %66 = OpLoad %float %x
+         %68 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_3
+         %69 = OpLoad %float %68
+         %70 = OpFOrdLessThan %bool %66 %69
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %71
+         %72 = OpLabel
+         %74 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+         %75 = OpLoad %float %74
+               OpReturnValue %75
+         %71 = OpLabel
+               OpBranch %39
+         %39 = OpLabel
+         %76 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %77 = OpLoad %float %76
+         %78 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_2
+         %79 = OpLoad %float %78
+         %80 = OpFOrdLessThan %bool %77 %79
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %83
+         %82 = OpLabel
+               OpBranch %81
+         %83 = OpLabel
+               OpBranch %38
+         %81 = OpLabel
+               OpBranch %37
+         %38 = OpLabel
+               OpBranch %30
+         %30 = OpLabel
+               OpBranch %28
+         %29 = OpLabel
+         %85 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %86 = OpLoad %float %85
+               OpReturnValue %86
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %87
+         %90 = OpLabel
+      %param = OpVariable %_ptr_Function_float Function %92
+         %93 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %94 = OpLoad %float %93
+               OpStore %param %94
+         %95 = OpFunctionCall %float %func_f1_ %param
+         %97 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+         %98 = OpLoad %float %97
+         %99 = OpFOrdEqual %bool %95 %98
+               OpSelectionMerge %100 None
+               OpBranchConditional %99 %101 %102
+        %101 = OpLabel
+        %104 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+        %105 = OpLoad %int %104
+        %106 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+        %107 = OpLoad %int %106
+        %108 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+        %109 = OpLoad %int %108
+        %110 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+        %111 = OpLoad %int %110
+        %112 = OpConvertSToF %float %105
+        %113 = OpConvertSToF %float %107
+        %114 = OpConvertSToF %float %109
+        %115 = OpConvertSToF %float %111
+        %116 = OpCompositeConstruct %v4float %112 %113 %114 %115
+               OpStore %x_GLF_color %116
+               OpBranch %100
+        %102 = OpLabel
+        %117 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+        %118 = OpLoad %int %117
+        %119 = OpConvertSToF %float %118
+        %120 = OpCompositeConstruct %v4float %119 %119 %119 %119
+               OpStore %x_GLF_color %120
+               OpBranch %100
+        %100 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %121
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %125 = OpLabel
+        %126 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %126
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %87
+        %128 = OpLabel
+        %129 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %129
+        %130 = OpFunctionCall %void %main_1
+        %132 = OpLoad %v4float %x_GLF_color
+        %133 = OpCompositeConstruct %main_out %132
+        %131 = OpFunctionCall %void %tint_symbol_3 %133
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 39[%39] is not post dominated by the back-edge block 81[%81]
+  %81 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-function-fragcoord-condition-always-return/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-function-fragcoord-condition-always-return/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..36f0a6f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-function-fragcoord-condition-always-return/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,96 @@
+type Arr = [[stride(16)]] array<f32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_11 : buf0;
+
+fn func_f1_(x : ptr<function, f32>) -> f32 {
+  loop {
+    if (true) {
+    } else {
+      break;
+    }
+    loop {
+      let x_77 : f32 = gl_FragCoord.y;
+      let x_79 : f32 = x_8.x_GLF_uniform_float_values[2];
+      if ((x_77 < x_79)) {
+        loop {
+
+          continuing {
+            let x_88 : f32 = gl_FragCoord.x;
+            let x_90 : f32 = x_8.x_GLF_uniform_float_values[2];
+            if ((x_88 < x_90)) {
+            } else {
+              break;
+            }
+          }
+        }
+      }
+      let x_92 : f32 = *(x);
+      let x_94 : f32 = x_8.x_GLF_uniform_float_values[3];
+      if ((x_92 < x_94)) {
+        let x_99 : f32 = x_8.x_GLF_uniform_float_values[1];
+        return x_99;
+      }
+
+      continuing {
+        let x_101 : f32 = gl_FragCoord.y;
+        let x_103 : f32 = x_8.x_GLF_uniform_float_values[2];
+        if ((x_101 < x_103)) {
+        } else {
+          break;
+        }
+      }
+    }
+  }
+  let x_106 : f32 = x_8.x_GLF_uniform_float_values[0];
+  return x_106;
+}
+
+fn main_1() {
+  var param : f32;
+  let x_41 : f32 = gl_FragCoord.x;
+  param = x_41;
+  let x_42 : f32 = func_f1_(&(param));
+  let x_44 : f32 = x_8.x_GLF_uniform_float_values[1];
+  if ((x_42 == x_44)) {
+    let x_50 : i32 = x_11.x_GLF_uniform_int_values[0];
+    let x_53 : i32 = x_11.x_GLF_uniform_int_values[1];
+    let x_56 : i32 = x_11.x_GLF_uniform_int_values[1];
+    let x_59 : i32 = x_11.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_50), f32(x_53), f32(x_56), f32(x_59));
+  } else {
+    let x_63 : i32 = x_11.x_GLF_uniform_int_values[1];
+    let x_64 : f32 = f32(x_63);
+    x_GLF_color = vec4<f32>(x_64, x_64, x_64, x_64);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-function-fragcoord-condition-always-return/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-function-fragcoord-condition-always-return/0-opt.wgsl
new file mode 100644
index 0000000..36f0a6f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-function-fragcoord-condition-always-return/0-opt.wgsl
@@ -0,0 +1,96 @@
+type Arr = [[stride(16)]] array<f32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_11 : buf0;
+
+fn func_f1_(x : ptr<function, f32>) -> f32 {
+  loop {
+    if (true) {
+    } else {
+      break;
+    }
+    loop {
+      let x_77 : f32 = gl_FragCoord.y;
+      let x_79 : f32 = x_8.x_GLF_uniform_float_values[2];
+      if ((x_77 < x_79)) {
+        loop {
+
+          continuing {
+            let x_88 : f32 = gl_FragCoord.x;
+            let x_90 : f32 = x_8.x_GLF_uniform_float_values[2];
+            if ((x_88 < x_90)) {
+            } else {
+              break;
+            }
+          }
+        }
+      }
+      let x_92 : f32 = *(x);
+      let x_94 : f32 = x_8.x_GLF_uniform_float_values[3];
+      if ((x_92 < x_94)) {
+        let x_99 : f32 = x_8.x_GLF_uniform_float_values[1];
+        return x_99;
+      }
+
+      continuing {
+        let x_101 : f32 = gl_FragCoord.y;
+        let x_103 : f32 = x_8.x_GLF_uniform_float_values[2];
+        if ((x_101 < x_103)) {
+        } else {
+          break;
+        }
+      }
+    }
+  }
+  let x_106 : f32 = x_8.x_GLF_uniform_float_values[0];
+  return x_106;
+}
+
+fn main_1() {
+  var param : f32;
+  let x_41 : f32 = gl_FragCoord.x;
+  param = x_41;
+  let x_42 : f32 = func_f1_(&(param));
+  let x_44 : f32 = x_8.x_GLF_uniform_float_values[1];
+  if ((x_42 == x_44)) {
+    let x_50 : i32 = x_11.x_GLF_uniform_int_values[0];
+    let x_53 : i32 = x_11.x_GLF_uniform_int_values[1];
+    let x_56 : i32 = x_11.x_GLF_uniform_int_values[1];
+    let x_59 : i32 = x_11.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_50), f32(x_53), f32(x_56), f32(x_59));
+  } else {
+    let x_63 : i32 = x_11.x_GLF_uniform_int_values[1];
+    let x_64 : f32 = f32(x_63);
+    x_GLF_color = vec4<f32>(x_64, x_64, x_64, x_64);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-function-fragcoord-condition-always-return/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-function-fragcoord-condition-always-return/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..44df57f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-function-fragcoord-condition-always-return/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,91 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_11 : register(b0, space0) {
+  uint4 x_11[2];
+};
+
+float func_f1_(inout float x) {
+  while (true) {
+    if (true) {
+    } else {
+      break;
+    }
+    while (true) {
+      const float x_77 = gl_FragCoord.y;
+      const float x_79 = asfloat(x_8[2].x);
+      if ((x_77 < x_79)) {
+        while (true) {
+          {
+            const float x_88 = gl_FragCoord.x;
+            const float x_90 = asfloat(x_8[2].x);
+            if ((x_88 < x_90)) {
+            } else {
+              break;
+            }
+          }
+        }
+      }
+      const float x_92 = x;
+      const float x_94 = asfloat(x_8[3].x);
+      if ((x_92 < x_94)) {
+        const float x_99 = asfloat(x_8[1].x);
+        return x_99;
+      }
+      {
+        const float x_101 = gl_FragCoord.y;
+        const float x_103 = asfloat(x_8[2].x);
+        if ((x_101 < x_103)) {
+        } else {
+          break;
+        }
+      }
+    }
+  }
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_106 = asfloat(x_8[scalar_offset / 4][scalar_offset % 4]);
+  return x_106;
+}
+
+void main_1() {
+  float param = 0.0f;
+  const float x_41 = gl_FragCoord.x;
+  param = x_41;
+  const float x_42 = func_f1_(param);
+  const float x_44 = asfloat(x_8[1].x);
+  if ((x_42 == x_44)) {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_50 = asint(x_11[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const int x_53 = asint(x_11[1].x);
+    const int x_56 = asint(x_11[1].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_59 = asint(x_11[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    x_GLF_color = float4(float(x_50), float(x_53), float(x_56), float(x_59));
+  } else {
+    const int x_63 = asint(x_11[1].x);
+    const float x_64 = float(x_63);
+    x_GLF_color = float4(x_64, x_64, x_64, x_64);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-function-fragcoord-condition-always-return/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-function-fragcoord-condition-always-return/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..bb3bd84
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-function-fragcoord-condition-always-return/0-opt.wgsl.expected.msl
@@ -0,0 +1,101 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float func_f1_(constant buf1& x_8, thread float* const x, thread float4* const tint_symbol_5) {
+  while (true) {
+    if (true) {
+    } else {
+      break;
+    }
+    while (true) {
+      float const x_77 = (*(tint_symbol_5)).y;
+      float const x_79 = x_8.x_GLF_uniform_float_values.arr[2].el;
+      if ((x_77 < x_79)) {
+        while (true) {
+          {
+            float const x_88 = (*(tint_symbol_5)).x;
+            float const x_90 = x_8.x_GLF_uniform_float_values.arr[2].el;
+            if ((x_88 < x_90)) {
+            } else {
+              break;
+            }
+          }
+        }
+      }
+      float const x_92 = *(x);
+      float const x_94 = x_8.x_GLF_uniform_float_values.arr[3].el;
+      if ((x_92 < x_94)) {
+        float const x_99 = x_8.x_GLF_uniform_float_values.arr[1].el;
+        return x_99;
+      }
+      {
+        float const x_101 = (*(tint_symbol_5)).y;
+        float const x_103 = x_8.x_GLF_uniform_float_values.arr[2].el;
+        if ((x_101 < x_103)) {
+        } else {
+          break;
+        }
+      }
+    }
+  }
+  float const x_106 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  return x_106;
+}
+
+void main_1(constant buf1& x_8, constant buf0& x_11, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  float param = 0.0f;
+  float const x_41 = (*(tint_symbol_6)).x;
+  param = x_41;
+  float const x_42 = func_f1_(x_8, &(param), tint_symbol_6);
+  float const x_44 = x_8.x_GLF_uniform_float_values.arr[1].el;
+  if ((x_42 == x_44)) {
+    int const x_50 = x_11.x_GLF_uniform_int_values.arr[0].el;
+    int const x_53 = x_11.x_GLF_uniform_int_values.arr[1].el;
+    int const x_56 = x_11.x_GLF_uniform_int_values.arr[1].el;
+    int const x_59 = x_11.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_7) = float4(float(x_50), float(x_53), float(x_56), float(x_59));
+  } else {
+    int const x_63 = x_11.x_GLF_uniform_int_values.arr[1].el;
+    float const x_64 = float(x_63);
+    *(tint_symbol_7) = float4(x_64, x_64, x_64, x_64);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf1& x_8 [[buffer(1)]], constant buf0& x_11 [[buffer(0)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_8, x_11, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-function-fragcoord-condition-always-return/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-function-fragcoord-condition-always-return/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..855bbda
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-function-fragcoord-condition-always-return/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,229 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 134
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_11 "x_11"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %func_f1_ "func_f1_"
+               OpName %x "x"
+               OpName %main_1 "main_1"
+               OpName %param "param"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_4 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_11 NonWritable
+               OpDecorate %x_11 DescriptorSet 0
+               OpDecorate %x_11 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+       %buf1 = OpTypeStruct %_arr_float_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_11 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Function_float = OpTypePointer Function %float
+         %23 = OpTypeFunction %float %_ptr_Function_float
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %uint_0 = OpConstant %uint 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_3 = OpConstant %int 3
+      %int_1 = OpConstant %int 1
+      %int_0 = OpConstant %int 0
+       %void = OpTypeVoid
+         %87 = OpTypeFunction %void
+         %92 = OpConstantNull %float
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+        %121 = OpTypeFunction %void %main_out
+   %func_f1_ = OpFunction %float None %23
+          %x = OpFunctionParameter %_ptr_Function_float
+         %27 = OpLabel
+               OpBranch %28
+         %28 = OpLabel
+               OpLoopMerge %29 %30 None
+               OpBranch %31
+         %31 = OpLabel
+               OpSelectionMerge %34 None
+               OpBranchConditional %true %35 %36
+         %35 = OpLabel
+               OpBranch %34
+         %36 = OpLabel
+               OpBranch %29
+         %34 = OpLabel
+               OpBranch %37
+         %37 = OpLabel
+               OpLoopMerge %38 %39 None
+               OpBranch %40
+         %40 = OpLabel
+         %43 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %44 = OpLoad %float %43
+         %48 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_2
+         %49 = OpLoad %float %48
+         %50 = OpFOrdLessThan %bool %44 %49
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %51
+         %52 = OpLabel
+               OpBranch %53
+         %53 = OpLabel
+               OpLoopMerge %54 %55 None
+               OpBranch %56
+         %56 = OpLabel
+               OpBranch %55
+         %55 = OpLabel
+         %57 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %58 = OpLoad %float %57
+         %59 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_2
+         %60 = OpLoad %float %59
+         %61 = OpFOrdLessThan %bool %58 %60
+               OpSelectionMerge %62 None
+               OpBranchConditional %61 %63 %64
+         %63 = OpLabel
+               OpBranch %62
+         %64 = OpLabel
+               OpBranch %54
+         %62 = OpLabel
+               OpBranch %53
+         %54 = OpLabel
+               OpBranch %51
+         %51 = OpLabel
+         %66 = OpLoad %float %x
+         %68 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_3
+         %69 = OpLoad %float %68
+         %70 = OpFOrdLessThan %bool %66 %69
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %71
+         %72 = OpLabel
+         %74 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+         %75 = OpLoad %float %74
+               OpReturnValue %75
+         %71 = OpLabel
+               OpBranch %39
+         %39 = OpLabel
+         %76 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %77 = OpLoad %float %76
+         %78 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_2
+         %79 = OpLoad %float %78
+         %80 = OpFOrdLessThan %bool %77 %79
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %83
+         %82 = OpLabel
+               OpBranch %81
+         %83 = OpLabel
+               OpBranch %38
+         %81 = OpLabel
+               OpBranch %37
+         %38 = OpLabel
+               OpBranch %30
+         %30 = OpLabel
+               OpBranch %28
+         %29 = OpLabel
+         %85 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %86 = OpLoad %float %85
+               OpReturnValue %86
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %87
+         %90 = OpLabel
+      %param = OpVariable %_ptr_Function_float Function %92
+         %93 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %94 = OpLoad %float %93
+               OpStore %param %94
+         %95 = OpFunctionCall %float %func_f1_ %param
+         %97 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+         %98 = OpLoad %float %97
+         %99 = OpFOrdEqual %bool %95 %98
+               OpSelectionMerge %100 None
+               OpBranchConditional %99 %101 %102
+        %101 = OpLabel
+        %104 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+        %105 = OpLoad %int %104
+        %106 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+        %107 = OpLoad %int %106
+        %108 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+        %109 = OpLoad %int %108
+        %110 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+        %111 = OpLoad %int %110
+        %112 = OpConvertSToF %float %105
+        %113 = OpConvertSToF %float %107
+        %114 = OpConvertSToF %float %109
+        %115 = OpConvertSToF %float %111
+        %116 = OpCompositeConstruct %v4float %112 %113 %114 %115
+               OpStore %x_GLF_color %116
+               OpBranch %100
+        %102 = OpLabel
+        %117 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+        %118 = OpLoad %int %117
+        %119 = OpConvertSToF %float %118
+        %120 = OpCompositeConstruct %v4float %119 %119 %119 %119
+               OpStore %x_GLF_color %120
+               OpBranch %100
+        %100 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %121
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %125 = OpLabel
+        %126 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %126
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %87
+        %128 = OpLabel
+        %129 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %129
+        %130 = OpFunctionCall %void %main_1
+        %132 = OpLoad %v4float %x_GLF_color
+        %133 = OpCompositeConstruct %main_out %132
+        %131 = OpFunctionCall %void %tint_symbol_3 %133
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 39[%39] is not post dominated by the back-edge block 81[%81]
+  %81 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-function-fragcoord-condition-always-return/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-function-fragcoord-condition-always-return/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..36f0a6f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-function-fragcoord-condition-always-return/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,96 @@
+type Arr = [[stride(16)]] array<f32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_11 : buf0;
+
+fn func_f1_(x : ptr<function, f32>) -> f32 {
+  loop {
+    if (true) {
+    } else {
+      break;
+    }
+    loop {
+      let x_77 : f32 = gl_FragCoord.y;
+      let x_79 : f32 = x_8.x_GLF_uniform_float_values[2];
+      if ((x_77 < x_79)) {
+        loop {
+
+          continuing {
+            let x_88 : f32 = gl_FragCoord.x;
+            let x_90 : f32 = x_8.x_GLF_uniform_float_values[2];
+            if ((x_88 < x_90)) {
+            } else {
+              break;
+            }
+          }
+        }
+      }
+      let x_92 : f32 = *(x);
+      let x_94 : f32 = x_8.x_GLF_uniform_float_values[3];
+      if ((x_92 < x_94)) {
+        let x_99 : f32 = x_8.x_GLF_uniform_float_values[1];
+        return x_99;
+      }
+
+      continuing {
+        let x_101 : f32 = gl_FragCoord.y;
+        let x_103 : f32 = x_8.x_GLF_uniform_float_values[2];
+        if ((x_101 < x_103)) {
+        } else {
+          break;
+        }
+      }
+    }
+  }
+  let x_106 : f32 = x_8.x_GLF_uniform_float_values[0];
+  return x_106;
+}
+
+fn main_1() {
+  var param : f32;
+  let x_41 : f32 = gl_FragCoord.x;
+  param = x_41;
+  let x_42 : f32 = func_f1_(&(param));
+  let x_44 : f32 = x_8.x_GLF_uniform_float_values[1];
+  if ((x_42 == x_44)) {
+    let x_50 : i32 = x_11.x_GLF_uniform_int_values[0];
+    let x_53 : i32 = x_11.x_GLF_uniform_int_values[1];
+    let x_56 : i32 = x_11.x_GLF_uniform_int_values[1];
+    let x_59 : i32 = x_11.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_50), f32(x_53), f32(x_56), f32(x_59));
+  } else {
+    let x_63 : i32 = x_11.x_GLF_uniform_int_values[1];
+    let x_64 : f32 = f32(x_63);
+    x_GLF_color = vec4<f32>(x_64, x_64, x_64, x_64);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-function-vec2-never-discard/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-function-vec2-never-discard/0-opt.spvasm
new file mode 100644
index 0000000..273ca9b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-function-vec2-never-discard/0-opt.spvasm
@@ -0,0 +1,135 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %func_vf2_ "func(vf2;"
+               OpName %pos "pos"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "zero"
+               OpName %__0 ""
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %param "param"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %__1 ""
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %buf2 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 2
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__1 DescriptorSet 0
+               OpDecorate %__1 Binding 0
+       %void = OpTypeVoid
+         %17 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+       %bool = OpTypeBool
+         %22 = OpTypeFunction %bool %_ptr_Function_v2float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %true = OpConstantTrue %bool
+     %uint_1 = OpConstant %uint 1
+      %false = OpConstantFalse %bool
+       %buf2 = OpTypeStruct %float
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+        %__0 = OpVariable %_ptr_Uniform_buf2 Uniform
+      %int_1 = OpConstant %int 1
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__1 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %main = OpFunction %void None %17
+         %41 = OpLabel
+      %param = OpVariable %_ptr_Function_v2float Function
+         %42 = OpLoad %v4float %gl_FragCoord
+         %43 = OpVectorShuffle %v2float %42 %42 0 1
+               OpStore %param %43
+         %44 = OpFunctionCall %bool %func_vf2_ %param
+               OpSelectionMerge %45 None
+               OpBranchConditional %44 %46 %45
+         %46 = OpLabel
+               OpKill
+         %45 = OpLabel
+         %47 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_0
+         %48 = OpLoad %int %47
+         %49 = OpConvertSToF %float %48
+         %50 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_1
+         %51 = OpLoad %int %50
+         %52 = OpConvertSToF %float %51
+         %53 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_1
+         %54 = OpLoad %int %53
+         %55 = OpConvertSToF %float %54
+         %56 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_0
+         %57 = OpLoad %int %56
+         %58 = OpConvertSToF %float %57
+         %59 = OpCompositeConstruct %v4float %49 %52 %55 %58
+               OpStore %_GLF_color %59
+               OpReturn
+               OpFunctionEnd
+  %func_vf2_ = OpFunction %bool None %22
+        %pos = OpFunctionParameter %_ptr_Function_v2float
+         %60 = OpLabel
+         %61 = OpAccessChain %_ptr_Function_float %pos %uint_0
+         %62 = OpLoad %float %61
+         %63 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %64 = OpLoad %float %63
+         %65 = OpFOrdLessThan %bool %62 %64
+               OpSelectionMerge %66 None
+               OpBranchConditional %65 %67 %66
+         %67 = OpLabel
+               OpReturnValue %true
+         %66 = OpLabel
+         %68 = OpAccessChain %_ptr_Function_float %pos %uint_1
+         %69 = OpLoad %float %68
+         %70 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %71 = OpLoad %float %70
+         %72 = OpFOrdGreaterThan %bool %69 %71
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %74 %73
+         %74 = OpLabel
+               OpReturnValue %false
+         %73 = OpLabel
+         %75 = OpAccessChain %_ptr_Uniform_float %__0 %int_0
+         %76 = OpLoad %float %75
+         %77 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %78 = OpLoad %float %77
+         %79 = OpFOrdGreaterThan %bool %76 %78
+               OpSelectionMerge %80 None
+               OpBranchConditional %79 %81 %80
+         %81 = OpLabel
+               OpReturnValue %true
+         %80 = OpLabel
+               OpReturnValue %true
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-function-vec2-never-discard/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-function-vec2-never-discard/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..ca64df3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-function-vec2-never-discard/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,69 @@
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[2];
+};
+cbuffer cbuffer_x_10 : register(b2, space0) {
+  uint4 x_10[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_13 : register(b0, space0) {
+  uint4 x_13[2];
+};
+
+bool func_vf2_(inout float2 pos) {
+  const float x_62 = pos.x;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_64 = asfloat(x_8[scalar_offset / 4][scalar_offset % 4]);
+  if ((x_62 < x_64)) {
+    return true;
+  }
+  const float x_69 = pos.y;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_71 = asfloat(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_69 > x_71)) {
+    return false;
+  }
+  const float x_76 = asfloat(x_10[0].x);
+  const float x_78 = asfloat(x_8[1].x);
+  if ((x_76 > x_78)) {
+    return true;
+  }
+  return true;
+}
+
+void main_1() {
+  float2 param = float2(0.0f, 0.0f);
+  const float4 x_42 = gl_FragCoord;
+  param = float2(x_42.x, x_42.y);
+  const bool x_44 = func_vf2_(param);
+  if (x_44) {
+    discard;
+  }
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const int x_48 = asint(x_13[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  const int x_51 = asint(x_13[1].x);
+  const int x_54 = asint(x_13[1].x);
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const int x_57 = asint(x_13[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  x_GLF_color = float4(float(x_48), float(x_51), float(x_54), float(x_57));
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_7 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_7;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-function-vec2-never-discard/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-function-vec2-never-discard/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..d8dcfb9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-function-vec2-never-discard/0-opt.spvasm.expected.msl
@@ -0,0 +1,78 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct buf2 {
+  /* 0x0000 */ float zero;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+bool func_vf2_(constant buf1& x_8, constant buf2& x_10, thread float2* const pos) {
+  float const x_62 = (*(pos)).x;
+  float const x_64 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_62 < x_64)) {
+    return true;
+  }
+  float const x_69 = (*(pos)).y;
+  float const x_71 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_69 > x_71)) {
+    return false;
+  }
+  float const x_76 = x_10.zero;
+  float const x_78 = x_8.x_GLF_uniform_float_values.arr[1].el;
+  if ((x_76 > x_78)) {
+    return true;
+  }
+  return true;
+}
+
+void main_1(constant buf1& x_8, constant buf2& x_10, constant buf0& x_13, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float2 param = 0.0f;
+  float4 const x_42 = *(tint_symbol_5);
+  param = float2(x_42.x, x_42.y);
+  bool const x_44 = func_vf2_(x_8, x_10, &(param));
+  if (x_44) {
+    discard_fragment();
+  }
+  int const x_48 = x_13.x_GLF_uniform_int_values.arr[0].el;
+  int const x_51 = x_13.x_GLF_uniform_int_values.arr[1].el;
+  int const x_54 = x_13.x_GLF_uniform_int_values.arr[1].el;
+  int const x_57 = x_13.x_GLF_uniform_int_values.arr[0].el;
+  *(tint_symbol_6) = float4(float(x_48), float(x_51), float(x_54), float(x_57));
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf1& x_8 [[buffer(1)]], constant buf2& x_10 [[buffer(2)]], constant buf0& x_13 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_8, x_10, x_13, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-function-vec2-never-discard/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-function-vec2-never-discard/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..66c0a8c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-function-vec2-never-discard/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,175 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 104
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "zero"
+               OpName %x_10 "x_10"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_13 "x_13"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %func_vf2_ "func_vf2_"
+               OpName %pos "pos"
+               OpName %main_1 "main_1"
+               OpName %param "param"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %buf2 Block
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 2
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_13 NonWritable
+               OpDecorate %x_13 DescriptorSet 0
+               OpDecorate %x_13 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+       %buf2 = OpTypeStruct %float
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+       %x_10 = OpVariable %_ptr_Uniform_buf2 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %14 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %14
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %14
+        %int = OpTypeInt 32 1
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_13 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %14
+       %bool = OpTypeBool
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %25 = OpTypeFunction %bool %_ptr_Function_v2float
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %true = OpConstantTrue %bool
+     %uint_1 = OpConstant %uint 1
+      %false = OpConstantFalse %bool
+      %int_1 = OpConstant %int 1
+       %void = OpTypeVoid
+         %63 = OpTypeFunction %void
+         %68 = OpConstantNull %v2float
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+         %91 = OpTypeFunction %void %main_out
+  %func_vf2_ = OpFunction %bool None %25
+        %pos = OpFunctionParameter %_ptr_Function_v2float
+         %31 = OpLabel
+         %35 = OpAccessChain %_ptr_Function_float %pos %uint_0
+         %36 = OpLoad %float %35
+         %39 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %40 = OpLoad %float %39
+         %41 = OpFOrdLessThan %bool %36 %40
+               OpSelectionMerge %42 None
+               OpBranchConditional %41 %43 %42
+         %43 = OpLabel
+               OpReturnValue %true
+         %42 = OpLabel
+         %47 = OpAccessChain %_ptr_Function_float %pos %uint_1
+         %48 = OpLoad %float %47
+         %49 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %50 = OpLoad %float %49
+         %51 = OpFOrdGreaterThan %bool %48 %50
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %52
+         %53 = OpLabel
+               OpReturnValue %false
+         %52 = OpLabel
+         %55 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0
+         %56 = OpLoad %float %55
+         %58 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+         %59 = OpLoad %float %58
+         %60 = OpFOrdGreaterThan %bool %56 %59
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %61
+         %62 = OpLabel
+               OpReturnValue %true
+         %61 = OpLabel
+               OpReturnValue %true
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %63
+         %66 = OpLabel
+      %param = OpVariable %_ptr_Function_v2float Function %68
+         %69 = OpLoad %v4float %gl_FragCoord
+         %70 = OpCompositeExtract %float %69 0
+         %71 = OpCompositeExtract %float %69 1
+         %72 = OpCompositeConstruct %v2float %70 %71
+               OpStore %param %72
+         %73 = OpFunctionCall %bool %func_vf2_ %param
+               OpSelectionMerge %75 None
+               OpBranchConditional %73 %76 %75
+         %76 = OpLabel
+               OpKill
+         %75 = OpLabel
+         %78 = OpAccessChain %_ptr_Uniform_int %x_13 %uint_0 %int_0
+         %79 = OpLoad %int %78
+         %80 = OpAccessChain %_ptr_Uniform_int %x_13 %uint_0 %int_1
+         %81 = OpLoad %int %80
+         %82 = OpAccessChain %_ptr_Uniform_int %x_13 %uint_0 %int_1
+         %83 = OpLoad %int %82
+         %84 = OpAccessChain %_ptr_Uniform_int %x_13 %uint_0 %int_0
+         %85 = OpLoad %int %84
+         %86 = OpConvertSToF %float %79
+         %87 = OpConvertSToF %float %81
+         %88 = OpConvertSToF %float %83
+         %89 = OpConvertSToF %float %85
+         %90 = OpCompositeConstruct %v4float %86 %87 %88 %89
+               OpStore %x_GLF_color %90
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %91
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %95 = OpLabel
+         %96 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %96
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %63
+         %98 = OpLabel
+         %99 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %99
+        %100 = OpFunctionCall %void %main_1
+        %102 = OpLoad %v4float %x_GLF_color
+        %103 = OpCompositeConstruct %main_out %102
+        %101 = OpFunctionCall %void %tint_symbol_3 %103
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-function-vec2-never-discard/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-function-vec2-never-discard/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..d352923
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-function-vec2-never-discard/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,75 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[block]]
+struct buf2 {
+  zero : f32;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+[[group(0), binding(2)]] var<uniform> x_10 : buf2;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_13 : buf0;
+
+fn func_vf2_(pos : ptr<function, vec2<f32>>) -> bool {
+  let x_62 : f32 = (*(pos)).x;
+  let x_64 : f32 = x_8.x_GLF_uniform_float_values[0];
+  if ((x_62 < x_64)) {
+    return true;
+  }
+  let x_69 : f32 = (*(pos)).y;
+  let x_71 : f32 = x_8.x_GLF_uniform_float_values[0];
+  if ((x_69 > x_71)) {
+    return false;
+  }
+  let x_76 : f32 = x_10.zero;
+  let x_78 : f32 = x_8.x_GLF_uniform_float_values[1];
+  if ((x_76 > x_78)) {
+    return true;
+  }
+  return true;
+}
+
+fn main_1() {
+  var param : vec2<f32>;
+  let x_42 : vec4<f32> = gl_FragCoord;
+  param = vec2<f32>(x_42.x, x_42.y);
+  let x_44 : bool = func_vf2_(&(param));
+  if (x_44) {
+    discard;
+  }
+  let x_48 : i32 = x_13.x_GLF_uniform_int_values[0];
+  let x_51 : i32 = x_13.x_GLF_uniform_int_values[1];
+  let x_54 : i32 = x_13.x_GLF_uniform_int_values[1];
+  let x_57 : i32 = x_13.x_GLF_uniform_int_values[0];
+  x_GLF_color = vec4<f32>(f32(x_48), f32(x_51), f32(x_54), f32(x_57));
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-function-vec2-never-discard/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-function-vec2-never-discard/0-opt.wgsl
new file mode 100644
index 0000000..d352923
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-function-vec2-never-discard/0-opt.wgsl
@@ -0,0 +1,75 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[block]]
+struct buf2 {
+  zero : f32;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+[[group(0), binding(2)]] var<uniform> x_10 : buf2;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_13 : buf0;
+
+fn func_vf2_(pos : ptr<function, vec2<f32>>) -> bool {
+  let x_62 : f32 = (*(pos)).x;
+  let x_64 : f32 = x_8.x_GLF_uniform_float_values[0];
+  if ((x_62 < x_64)) {
+    return true;
+  }
+  let x_69 : f32 = (*(pos)).y;
+  let x_71 : f32 = x_8.x_GLF_uniform_float_values[0];
+  if ((x_69 > x_71)) {
+    return false;
+  }
+  let x_76 : f32 = x_10.zero;
+  let x_78 : f32 = x_8.x_GLF_uniform_float_values[1];
+  if ((x_76 > x_78)) {
+    return true;
+  }
+  return true;
+}
+
+fn main_1() {
+  var param : vec2<f32>;
+  let x_42 : vec4<f32> = gl_FragCoord;
+  param = vec2<f32>(x_42.x, x_42.y);
+  let x_44 : bool = func_vf2_(&(param));
+  if (x_44) {
+    discard;
+  }
+  let x_48 : i32 = x_13.x_GLF_uniform_int_values[0];
+  let x_51 : i32 = x_13.x_GLF_uniform_int_values[1];
+  let x_54 : i32 = x_13.x_GLF_uniform_int_values[1];
+  let x_57 : i32 = x_13.x_GLF_uniform_int_values[0];
+  x_GLF_color = vec4<f32>(f32(x_48), f32(x_51), f32(x_54), f32(x_57));
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-function-vec2-never-discard/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-function-vec2-never-discard/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..ca64df3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-function-vec2-never-discard/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,69 @@
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[2];
+};
+cbuffer cbuffer_x_10 : register(b2, space0) {
+  uint4 x_10[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_13 : register(b0, space0) {
+  uint4 x_13[2];
+};
+
+bool func_vf2_(inout float2 pos) {
+  const float x_62 = pos.x;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_64 = asfloat(x_8[scalar_offset / 4][scalar_offset % 4]);
+  if ((x_62 < x_64)) {
+    return true;
+  }
+  const float x_69 = pos.y;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_71 = asfloat(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_69 > x_71)) {
+    return false;
+  }
+  const float x_76 = asfloat(x_10[0].x);
+  const float x_78 = asfloat(x_8[1].x);
+  if ((x_76 > x_78)) {
+    return true;
+  }
+  return true;
+}
+
+void main_1() {
+  float2 param = float2(0.0f, 0.0f);
+  const float4 x_42 = gl_FragCoord;
+  param = float2(x_42.x, x_42.y);
+  const bool x_44 = func_vf2_(param);
+  if (x_44) {
+    discard;
+  }
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const int x_48 = asint(x_13[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  const int x_51 = asint(x_13[1].x);
+  const int x_54 = asint(x_13[1].x);
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const int x_57 = asint(x_13[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  x_GLF_color = float4(float(x_48), float(x_51), float(x_54), float(x_57));
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_7 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_7;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-function-vec2-never-discard/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-function-vec2-never-discard/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..d8dcfb9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-function-vec2-never-discard/0-opt.wgsl.expected.msl
@@ -0,0 +1,78 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct buf2 {
+  /* 0x0000 */ float zero;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+bool func_vf2_(constant buf1& x_8, constant buf2& x_10, thread float2* const pos) {
+  float const x_62 = (*(pos)).x;
+  float const x_64 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_62 < x_64)) {
+    return true;
+  }
+  float const x_69 = (*(pos)).y;
+  float const x_71 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_69 > x_71)) {
+    return false;
+  }
+  float const x_76 = x_10.zero;
+  float const x_78 = x_8.x_GLF_uniform_float_values.arr[1].el;
+  if ((x_76 > x_78)) {
+    return true;
+  }
+  return true;
+}
+
+void main_1(constant buf1& x_8, constant buf2& x_10, constant buf0& x_13, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float2 param = 0.0f;
+  float4 const x_42 = *(tint_symbol_5);
+  param = float2(x_42.x, x_42.y);
+  bool const x_44 = func_vf2_(x_8, x_10, &(param));
+  if (x_44) {
+    discard_fragment();
+  }
+  int const x_48 = x_13.x_GLF_uniform_int_values.arr[0].el;
+  int const x_51 = x_13.x_GLF_uniform_int_values.arr[1].el;
+  int const x_54 = x_13.x_GLF_uniform_int_values.arr[1].el;
+  int const x_57 = x_13.x_GLF_uniform_int_values.arr[0].el;
+  *(tint_symbol_6) = float4(float(x_48), float(x_51), float(x_54), float(x_57));
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf1& x_8 [[buffer(1)]], constant buf2& x_10 [[buffer(2)]], constant buf0& x_13 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_8, x_10, x_13, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-function-vec2-never-discard/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-function-vec2-never-discard/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..66c0a8c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-function-vec2-never-discard/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,175 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 104
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "zero"
+               OpName %x_10 "x_10"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_13 "x_13"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %func_vf2_ "func_vf2_"
+               OpName %pos "pos"
+               OpName %main_1 "main_1"
+               OpName %param "param"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %buf2 Block
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 2
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_13 NonWritable
+               OpDecorate %x_13 DescriptorSet 0
+               OpDecorate %x_13 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+       %buf2 = OpTypeStruct %float
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+       %x_10 = OpVariable %_ptr_Uniform_buf2 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %14 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %14
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %14
+        %int = OpTypeInt 32 1
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_13 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %14
+       %bool = OpTypeBool
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %25 = OpTypeFunction %bool %_ptr_Function_v2float
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %true = OpConstantTrue %bool
+     %uint_1 = OpConstant %uint 1
+      %false = OpConstantFalse %bool
+      %int_1 = OpConstant %int 1
+       %void = OpTypeVoid
+         %63 = OpTypeFunction %void
+         %68 = OpConstantNull %v2float
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+         %91 = OpTypeFunction %void %main_out
+  %func_vf2_ = OpFunction %bool None %25
+        %pos = OpFunctionParameter %_ptr_Function_v2float
+         %31 = OpLabel
+         %35 = OpAccessChain %_ptr_Function_float %pos %uint_0
+         %36 = OpLoad %float %35
+         %39 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %40 = OpLoad %float %39
+         %41 = OpFOrdLessThan %bool %36 %40
+               OpSelectionMerge %42 None
+               OpBranchConditional %41 %43 %42
+         %43 = OpLabel
+               OpReturnValue %true
+         %42 = OpLabel
+         %47 = OpAccessChain %_ptr_Function_float %pos %uint_1
+         %48 = OpLoad %float %47
+         %49 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %50 = OpLoad %float %49
+         %51 = OpFOrdGreaterThan %bool %48 %50
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %52
+         %53 = OpLabel
+               OpReturnValue %false
+         %52 = OpLabel
+         %55 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0
+         %56 = OpLoad %float %55
+         %58 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+         %59 = OpLoad %float %58
+         %60 = OpFOrdGreaterThan %bool %56 %59
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %61
+         %62 = OpLabel
+               OpReturnValue %true
+         %61 = OpLabel
+               OpReturnValue %true
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %63
+         %66 = OpLabel
+      %param = OpVariable %_ptr_Function_v2float Function %68
+         %69 = OpLoad %v4float %gl_FragCoord
+         %70 = OpCompositeExtract %float %69 0
+         %71 = OpCompositeExtract %float %69 1
+         %72 = OpCompositeConstruct %v2float %70 %71
+               OpStore %param %72
+         %73 = OpFunctionCall %bool %func_vf2_ %param
+               OpSelectionMerge %75 None
+               OpBranchConditional %73 %76 %75
+         %76 = OpLabel
+               OpKill
+         %75 = OpLabel
+         %78 = OpAccessChain %_ptr_Uniform_int %x_13 %uint_0 %int_0
+         %79 = OpLoad %int %78
+         %80 = OpAccessChain %_ptr_Uniform_int %x_13 %uint_0 %int_1
+         %81 = OpLoad %int %80
+         %82 = OpAccessChain %_ptr_Uniform_int %x_13 %uint_0 %int_1
+         %83 = OpLoad %int %82
+         %84 = OpAccessChain %_ptr_Uniform_int %x_13 %uint_0 %int_0
+         %85 = OpLoad %int %84
+         %86 = OpConvertSToF %float %79
+         %87 = OpConvertSToF %float %81
+         %88 = OpConvertSToF %float %83
+         %89 = OpConvertSToF %float %85
+         %90 = OpCompositeConstruct %v4float %86 %87 %88 %89
+               OpStore %x_GLF_color %90
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %91
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %95 = OpLabel
+         %96 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %96
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %63
+         %98 = OpLabel
+         %99 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %99
+        %100 = OpFunctionCall %void %main_1
+        %102 = OpLoad %v4float %x_GLF_color
+        %103 = OpCompositeConstruct %main_out %102
+        %101 = OpFunctionCall %void %tint_symbol_3 %103
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-function-vec2-never-discard/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-function-vec2-never-discard/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..d352923
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-function-vec2-never-discard/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,75 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[block]]
+struct buf2 {
+  zero : f32;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+[[group(0), binding(2)]] var<uniform> x_10 : buf2;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_13 : buf0;
+
+fn func_vf2_(pos : ptr<function, vec2<f32>>) -> bool {
+  let x_62 : f32 = (*(pos)).x;
+  let x_64 : f32 = x_8.x_GLF_uniform_float_values[0];
+  if ((x_62 < x_64)) {
+    return true;
+  }
+  let x_69 : f32 = (*(pos)).y;
+  let x_71 : f32 = x_8.x_GLF_uniform_float_values[0];
+  if ((x_69 > x_71)) {
+    return false;
+  }
+  let x_76 : f32 = x_10.zero;
+  let x_78 : f32 = x_8.x_GLF_uniform_float_values[1];
+  if ((x_76 > x_78)) {
+    return true;
+  }
+  return true;
+}
+
+fn main_1() {
+  var param : vec2<f32>;
+  let x_42 : vec4<f32> = gl_FragCoord;
+  param = vec2<f32>(x_42.x, x_42.y);
+  let x_44 : bool = func_vf2_(&(param));
+  if (x_44) {
+    discard;
+  }
+  let x_48 : i32 = x_13.x_GLF_uniform_int_values[0];
+  let x_51 : i32 = x_13.x_GLF_uniform_int_values[1];
+  let x_54 : i32 = x_13.x_GLF_uniform_int_values[1];
+  let x_57 : i32 = x_13.x_GLF_uniform_int_values[0];
+  x_GLF_color = vec4<f32>(f32(x_48), f32(x_51), f32(x_54), f32(x_57));
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-bound-true-logical-or/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-bound-true-logical-or/0-opt.spvasm
new file mode 100644
index 0000000..20110aa
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-bound-true-logical-or/0-opt.spvasm
@@ -0,0 +1,113 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %_GLF_global_loop_count "_GLF_global_loop_count"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+%_GLF_global_loop_count = OpVariable %_ptr_Private_int Private
+      %int_0 = OpConstant %int 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+    %int_100 = OpConstant %int 100
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+       %main = OpFunction %void None %9
+         %24 = OpLabel
+               OpStore %_GLF_global_loop_count %int_0
+         %25 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %26 = OpLoad %int %25
+         %27 = OpConvertSToF %float %26
+         %28 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %29 = OpLoad %int %28
+         %30 = OpConvertSToF %float %29
+         %31 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %32 = OpLoad %int %31
+         %33 = OpConvertSToF %float %32
+         %34 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %35 = OpLoad %int %34
+         %36 = OpConvertSToF %float %35
+         %37 = OpCompositeConstruct %v4float %27 %30 %33 %36
+               OpStore %_GLF_color %37
+               OpBranch %38
+         %38 = OpLabel
+               OpLoopMerge %39 %40 None
+               OpBranch %41
+         %41 = OpLabel
+         %42 = OpLoad %int %_GLF_global_loop_count
+         %43 = OpSLessThan %bool %42 %int_100
+               OpBranchConditional %43 %44 %39
+         %44 = OpLabel
+         %45 = OpLoad %int %_GLF_global_loop_count
+         %46 = OpIAdd %int %45 %int_1
+               OpStore %_GLF_global_loop_count %46
+         %47 = OpLogicalNot %bool %true
+               OpSelectionMerge %48 None
+               OpBranchConditional %47 %49 %48
+         %49 = OpLabel
+         %50 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %51 = OpLoad %int %50
+         %52 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %53 = OpLoad %int %52
+         %54 = OpIEqual %bool %51 %53
+               OpBranch %48
+         %48 = OpLabel
+         %55 = OpPhi %bool %true %44 %54 %49
+         %56 = OpLogicalNot %bool %55
+               OpSelectionMerge %57 None
+               OpBranchConditional %56 %58 %57
+         %58 = OpLabel
+               OpBranch %39
+         %57 = OpLabel
+               OpBranch %40
+         %40 = OpLabel
+               OpBranch %38
+         %39 = OpLabel
+               OpBranch %59
+         %59 = OpLabel
+               OpLoopMerge %60 %61 None
+               OpBranch %62
+         %62 = OpLabel
+         %63 = OpLoad %int %_GLF_global_loop_count
+         %64 = OpSLessThan %bool %63 %int_100
+               OpBranchConditional %64 %65 %60
+         %65 = OpLabel
+         %66 = OpLoad %int %_GLF_global_loop_count
+         %67 = OpIAdd %int %66 %int_1
+               OpStore %_GLF_global_loop_count %67
+         %68 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %69 = OpLoad %int %68
+         %70 = OpConvertSToF %float %69
+         %71 = OpCompositeConstruct %v4float %70 %70 %70 %70
+               OpStore %_GLF_color %71
+               OpBranch %61
+         %61 = OpLabel
+               OpBranch %59
+         %60 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-bound-true-logical-or/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-bound-true-logical-or/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..f3abef7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-bound-true-logical-or/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,62 @@
+static int x_GLF_global_loop_count = 0;
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+
+void main_1() {
+  x_GLF_global_loop_count = 0;
+  const int x_26 = asint(x_6[1].x);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_29 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_32 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const int x_35 = asint(x_6[1].x);
+  x_GLF_color = float4(float(x_26), float(x_29), float(x_32), float(x_35));
+  while (true) {
+    bool x_54 = false;
+    bool x_55_phi = false;
+    if ((x_GLF_global_loop_count < 100)) {
+    } else {
+      break;
+    }
+    x_GLF_global_loop_count = (x_GLF_global_loop_count + 1);
+    x_55_phi = true;
+    if (!(true)) {
+      const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+      const int x_51 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+      const int x_53 = asint(x_6[1].x);
+      x_54 = (x_51 == x_53);
+      x_55_phi = x_54;
+    }
+    if (!(x_55_phi)) {
+      break;
+    }
+  }
+  while (true) {
+    if ((x_GLF_global_loop_count < 100)) {
+    } else {
+      break;
+    }
+    x_GLF_global_loop_count = (x_GLF_global_loop_count + 1);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_69 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const float x_70 = float(x_69);
+    x_GLF_color = float4(x_70, x_70, x_70, x_70);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-bound-true-logical-or/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-bound-true-logical-or/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..80f3c6a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-bound-true-logical-or/0-opt.spvasm.expected.msl
@@ -0,0 +1,73 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread int* const tint_symbol_4, thread float4* const tint_symbol_5) {
+  *(tint_symbol_4) = 0;
+  int const x_26 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_29 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_32 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_35 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  *(tint_symbol_5) = float4(float(x_26), float(x_29), float(x_32), float(x_35));
+  while (true) {
+    bool x_54 = false;
+    bool x_55_phi = false;
+    int const x_42 = *(tint_symbol_4);
+    if ((x_42 < 100)) {
+    } else {
+      break;
+    }
+    int const x_45 = *(tint_symbol_4);
+    *(tint_symbol_4) = (x_45 + 1);
+    x_55_phi = true;
+    if (!(true)) {
+      int const x_51 = x_6.x_GLF_uniform_int_values.arr[0].el;
+      int const x_53 = x_6.x_GLF_uniform_int_values.arr[1].el;
+      x_54 = (x_51 == x_53);
+      x_55_phi = x_54;
+    }
+    bool const x_55 = x_55_phi;
+    if (!(x_55)) {
+      break;
+    }
+  }
+  while (true) {
+    int const x_63 = *(tint_symbol_4);
+    if ((x_63 < 100)) {
+    } else {
+      break;
+    }
+    int const x_66 = *(tint_symbol_4);
+    *(tint_symbol_4) = (x_66 + 1);
+    int const x_69 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    float const x_70 = float(x_69);
+    *(tint_symbol_5) = float4(x_70, x_70, x_70, x_70);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread int tint_symbol_6 = 0;
+  thread float4 tint_symbol_7 = 0.0f;
+  main_1(x_6, &(tint_symbol_6), &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-bound-true-logical-or/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-bound-true-logical-or/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..d85fb18
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-bound-true-logical-or/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,166 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 97
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_global_loop_count "x_GLF_global_loop_count"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_54 "x_54"
+               OpName %x_55_phi "x_55_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+          %4 = OpConstantNull %int
+%x_GLF_global_loop_count = OpVariable %_ptr_Private_int Private %4
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+      %int_0 = OpConstant %int 0
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %46 = OpConstantNull %bool
+    %int_100 = OpConstant %int 100
+       %true = OpConstantTrue %bool
+   %main_out = OpTypeStruct %v4float
+         %85 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %18
+         %21 = OpLabel
+       %x_54 = OpVariable %_ptr_Function_bool Function %46
+   %x_55_phi = OpVariable %_ptr_Function_bool Function %46
+               OpStore %x_GLF_global_loop_count %int_0
+         %26 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %27 = OpLoad %int %26
+         %28 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %29 = OpLoad %int %28
+         %30 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %31 = OpLoad %int %30
+         %32 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %33 = OpLoad %int %32
+         %34 = OpConvertSToF %float %27
+         %35 = OpConvertSToF %float %29
+         %36 = OpConvertSToF %float %31
+         %37 = OpConvertSToF %float %33
+         %38 = OpCompositeConstruct %v4float %34 %35 %36 %37
+               OpStore %x_GLF_color %38
+               OpBranch %39
+         %39 = OpLabel
+               OpLoopMerge %40 %41 None
+               OpBranch %42
+         %42 = OpLabel
+         %48 = OpLoad %int %x_GLF_global_loop_count
+         %50 = OpSLessThan %bool %48 %int_100
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %53
+         %52 = OpLabel
+               OpBranch %51
+         %53 = OpLabel
+               OpBranch %40
+         %51 = OpLabel
+         %54 = OpLoad %int %x_GLF_global_loop_count
+         %55 = OpIAdd %int %54 %int_1
+               OpStore %x_GLF_global_loop_count %55
+               OpStore %x_55_phi %true
+         %57 = OpLogicalNot %bool %true
+               OpSelectionMerge %58 None
+               OpBranchConditional %57 %59 %58
+         %59 = OpLabel
+         %60 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %61 = OpLoad %int %60
+         %62 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %63 = OpLoad %int %62
+         %64 = OpIEqual %bool %61 %63
+               OpStore %x_54 %64
+         %65 = OpLoad %bool %x_54
+               OpStore %x_55_phi %65
+               OpBranch %58
+         %58 = OpLabel
+         %66 = OpLoad %bool %x_55_phi
+         %67 = OpLogicalNot %bool %66
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %68
+         %69 = OpLabel
+               OpBranch %40
+         %68 = OpLabel
+               OpBranch %41
+         %41 = OpLabel
+               OpBranch %39
+         %40 = OpLabel
+               OpBranch %70
+         %70 = OpLabel
+               OpLoopMerge %71 %72 None
+               OpBranch %73
+         %73 = OpLabel
+         %74 = OpLoad %int %x_GLF_global_loop_count
+         %75 = OpSLessThan %bool %74 %int_100
+               OpSelectionMerge %76 None
+               OpBranchConditional %75 %77 %78
+         %77 = OpLabel
+               OpBranch %76
+         %78 = OpLabel
+               OpBranch %71
+         %76 = OpLabel
+         %79 = OpLoad %int %x_GLF_global_loop_count
+         %80 = OpIAdd %int %79 %int_1
+               OpStore %x_GLF_global_loop_count %80
+         %81 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %82 = OpLoad %int %81
+         %83 = OpConvertSToF %float %82
+         %84 = OpCompositeConstruct %v4float %83 %83 %83 %83
+               OpStore %x_GLF_color %84
+               OpBranch %72
+         %72 = OpLabel
+               OpBranch %70
+         %71 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %85
+%tint_symbol = OpFunctionParameter %main_out
+         %89 = OpLabel
+         %90 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %90
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %18
+         %92 = OpLabel
+         %93 = OpFunctionCall %void %main_1
+         %95 = OpLoad %v4float %x_GLF_color
+         %96 = OpCompositeConstruct %main_out %95
+         %94 = OpFunctionCall %void %tint_symbol_2 %96
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-bound-true-logical-or/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-bound-true-logical-or/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..1beed3d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-bound-true-logical-or/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,67 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> x_GLF_global_loop_count : i32;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+fn main_1() {
+  x_GLF_global_loop_count = 0;
+  let x_26 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_29 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_32 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_35 : i32 = x_6.x_GLF_uniform_int_values[1];
+  x_GLF_color = vec4<f32>(f32(x_26), f32(x_29), f32(x_32), f32(x_35));
+  loop {
+    var x_54 : bool;
+    var x_55_phi : bool;
+    let x_42 : i32 = x_GLF_global_loop_count;
+    if ((x_42 < 100)) {
+    } else {
+      break;
+    }
+    let x_45 : i32 = x_GLF_global_loop_count;
+    x_GLF_global_loop_count = (x_45 + 1);
+    x_55_phi = true;
+    if (!(true)) {
+      let x_51 : i32 = x_6.x_GLF_uniform_int_values[0];
+      let x_53 : i32 = x_6.x_GLF_uniform_int_values[1];
+      x_54 = (x_51 == x_53);
+      x_55_phi = x_54;
+    }
+    let x_55 : bool = x_55_phi;
+    if (!(x_55)) {
+      break;
+    }
+  }
+  loop {
+    let x_63 : i32 = x_GLF_global_loop_count;
+    if ((x_63 < 100)) {
+    } else {
+      break;
+    }
+    let x_66 : i32 = x_GLF_global_loop_count;
+    x_GLF_global_loop_count = (x_66 + 1);
+    let x_69 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_70 : f32 = f32(x_69);
+    x_GLF_color = vec4<f32>(x_70, x_70, x_70, x_70);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-bound-true-logical-or/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-bound-true-logical-or/0-opt.wgsl
new file mode 100644
index 0000000..1beed3d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-bound-true-logical-or/0-opt.wgsl
@@ -0,0 +1,67 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> x_GLF_global_loop_count : i32;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+fn main_1() {
+  x_GLF_global_loop_count = 0;
+  let x_26 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_29 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_32 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_35 : i32 = x_6.x_GLF_uniform_int_values[1];
+  x_GLF_color = vec4<f32>(f32(x_26), f32(x_29), f32(x_32), f32(x_35));
+  loop {
+    var x_54 : bool;
+    var x_55_phi : bool;
+    let x_42 : i32 = x_GLF_global_loop_count;
+    if ((x_42 < 100)) {
+    } else {
+      break;
+    }
+    let x_45 : i32 = x_GLF_global_loop_count;
+    x_GLF_global_loop_count = (x_45 + 1);
+    x_55_phi = true;
+    if (!(true)) {
+      let x_51 : i32 = x_6.x_GLF_uniform_int_values[0];
+      let x_53 : i32 = x_6.x_GLF_uniform_int_values[1];
+      x_54 = (x_51 == x_53);
+      x_55_phi = x_54;
+    }
+    let x_55 : bool = x_55_phi;
+    if (!(x_55)) {
+      break;
+    }
+  }
+  loop {
+    let x_63 : i32 = x_GLF_global_loop_count;
+    if ((x_63 < 100)) {
+    } else {
+      break;
+    }
+    let x_66 : i32 = x_GLF_global_loop_count;
+    x_GLF_global_loop_count = (x_66 + 1);
+    let x_69 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_70 : f32 = f32(x_69);
+    x_GLF_color = vec4<f32>(x_70, x_70, x_70, x_70);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-bound-true-logical-or/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-bound-true-logical-or/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..f3abef7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-bound-true-logical-or/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,62 @@
+static int x_GLF_global_loop_count = 0;
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+
+void main_1() {
+  x_GLF_global_loop_count = 0;
+  const int x_26 = asint(x_6[1].x);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_29 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_32 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const int x_35 = asint(x_6[1].x);
+  x_GLF_color = float4(float(x_26), float(x_29), float(x_32), float(x_35));
+  while (true) {
+    bool x_54 = false;
+    bool x_55_phi = false;
+    if ((x_GLF_global_loop_count < 100)) {
+    } else {
+      break;
+    }
+    x_GLF_global_loop_count = (x_GLF_global_loop_count + 1);
+    x_55_phi = true;
+    if (!(true)) {
+      const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+      const int x_51 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+      const int x_53 = asint(x_6[1].x);
+      x_54 = (x_51 == x_53);
+      x_55_phi = x_54;
+    }
+    if (!(x_55_phi)) {
+      break;
+    }
+  }
+  while (true) {
+    if ((x_GLF_global_loop_count < 100)) {
+    } else {
+      break;
+    }
+    x_GLF_global_loop_count = (x_GLF_global_loop_count + 1);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_69 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const float x_70 = float(x_69);
+    x_GLF_color = float4(x_70, x_70, x_70, x_70);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-bound-true-logical-or/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-bound-true-logical-or/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..80f3c6a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-bound-true-logical-or/0-opt.wgsl.expected.msl
@@ -0,0 +1,73 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread int* const tint_symbol_4, thread float4* const tint_symbol_5) {
+  *(tint_symbol_4) = 0;
+  int const x_26 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_29 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_32 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_35 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  *(tint_symbol_5) = float4(float(x_26), float(x_29), float(x_32), float(x_35));
+  while (true) {
+    bool x_54 = false;
+    bool x_55_phi = false;
+    int const x_42 = *(tint_symbol_4);
+    if ((x_42 < 100)) {
+    } else {
+      break;
+    }
+    int const x_45 = *(tint_symbol_4);
+    *(tint_symbol_4) = (x_45 + 1);
+    x_55_phi = true;
+    if (!(true)) {
+      int const x_51 = x_6.x_GLF_uniform_int_values.arr[0].el;
+      int const x_53 = x_6.x_GLF_uniform_int_values.arr[1].el;
+      x_54 = (x_51 == x_53);
+      x_55_phi = x_54;
+    }
+    bool const x_55 = x_55_phi;
+    if (!(x_55)) {
+      break;
+    }
+  }
+  while (true) {
+    int const x_63 = *(tint_symbol_4);
+    if ((x_63 < 100)) {
+    } else {
+      break;
+    }
+    int const x_66 = *(tint_symbol_4);
+    *(tint_symbol_4) = (x_66 + 1);
+    int const x_69 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    float const x_70 = float(x_69);
+    *(tint_symbol_5) = float4(x_70, x_70, x_70, x_70);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread int tint_symbol_6 = 0;
+  thread float4 tint_symbol_7 = 0.0f;
+  main_1(x_6, &(tint_symbol_6), &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-bound-true-logical-or/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-bound-true-logical-or/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..d85fb18
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-bound-true-logical-or/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,166 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 97
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_global_loop_count "x_GLF_global_loop_count"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_54 "x_54"
+               OpName %x_55_phi "x_55_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+          %4 = OpConstantNull %int
+%x_GLF_global_loop_count = OpVariable %_ptr_Private_int Private %4
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+      %int_0 = OpConstant %int 0
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %46 = OpConstantNull %bool
+    %int_100 = OpConstant %int 100
+       %true = OpConstantTrue %bool
+   %main_out = OpTypeStruct %v4float
+         %85 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %18
+         %21 = OpLabel
+       %x_54 = OpVariable %_ptr_Function_bool Function %46
+   %x_55_phi = OpVariable %_ptr_Function_bool Function %46
+               OpStore %x_GLF_global_loop_count %int_0
+         %26 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %27 = OpLoad %int %26
+         %28 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %29 = OpLoad %int %28
+         %30 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %31 = OpLoad %int %30
+         %32 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %33 = OpLoad %int %32
+         %34 = OpConvertSToF %float %27
+         %35 = OpConvertSToF %float %29
+         %36 = OpConvertSToF %float %31
+         %37 = OpConvertSToF %float %33
+         %38 = OpCompositeConstruct %v4float %34 %35 %36 %37
+               OpStore %x_GLF_color %38
+               OpBranch %39
+         %39 = OpLabel
+               OpLoopMerge %40 %41 None
+               OpBranch %42
+         %42 = OpLabel
+         %48 = OpLoad %int %x_GLF_global_loop_count
+         %50 = OpSLessThan %bool %48 %int_100
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %53
+         %52 = OpLabel
+               OpBranch %51
+         %53 = OpLabel
+               OpBranch %40
+         %51 = OpLabel
+         %54 = OpLoad %int %x_GLF_global_loop_count
+         %55 = OpIAdd %int %54 %int_1
+               OpStore %x_GLF_global_loop_count %55
+               OpStore %x_55_phi %true
+         %57 = OpLogicalNot %bool %true
+               OpSelectionMerge %58 None
+               OpBranchConditional %57 %59 %58
+         %59 = OpLabel
+         %60 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %61 = OpLoad %int %60
+         %62 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %63 = OpLoad %int %62
+         %64 = OpIEqual %bool %61 %63
+               OpStore %x_54 %64
+         %65 = OpLoad %bool %x_54
+               OpStore %x_55_phi %65
+               OpBranch %58
+         %58 = OpLabel
+         %66 = OpLoad %bool %x_55_phi
+         %67 = OpLogicalNot %bool %66
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %68
+         %69 = OpLabel
+               OpBranch %40
+         %68 = OpLabel
+               OpBranch %41
+         %41 = OpLabel
+               OpBranch %39
+         %40 = OpLabel
+               OpBranch %70
+         %70 = OpLabel
+               OpLoopMerge %71 %72 None
+               OpBranch %73
+         %73 = OpLabel
+         %74 = OpLoad %int %x_GLF_global_loop_count
+         %75 = OpSLessThan %bool %74 %int_100
+               OpSelectionMerge %76 None
+               OpBranchConditional %75 %77 %78
+         %77 = OpLabel
+               OpBranch %76
+         %78 = OpLabel
+               OpBranch %71
+         %76 = OpLabel
+         %79 = OpLoad %int %x_GLF_global_loop_count
+         %80 = OpIAdd %int %79 %int_1
+               OpStore %x_GLF_global_loop_count %80
+         %81 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %82 = OpLoad %int %81
+         %83 = OpConvertSToF %float %82
+         %84 = OpCompositeConstruct %v4float %83 %83 %83 %83
+               OpStore %x_GLF_color %84
+               OpBranch %72
+         %72 = OpLabel
+               OpBranch %70
+         %71 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %85
+%tint_symbol = OpFunctionParameter %main_out
+         %89 = OpLabel
+         %90 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %90
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %18
+         %92 = OpLabel
+         %93 = OpFunctionCall %void %main_1
+         %95 = OpLoad %v4float %x_GLF_color
+         %96 = OpCompositeConstruct %main_out %95
+         %94 = OpFunctionCall %void %tint_symbol_2 %96
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-bound-true-logical-or/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-bound-true-logical-or/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..1beed3d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-bound-true-logical-or/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,67 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> x_GLF_global_loop_count : i32;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+fn main_1() {
+  x_GLF_global_loop_count = 0;
+  let x_26 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_29 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_32 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_35 : i32 = x_6.x_GLF_uniform_int_values[1];
+  x_GLF_color = vec4<f32>(f32(x_26), f32(x_29), f32(x_32), f32(x_35));
+  loop {
+    var x_54 : bool;
+    var x_55_phi : bool;
+    let x_42 : i32 = x_GLF_global_loop_count;
+    if ((x_42 < 100)) {
+    } else {
+      break;
+    }
+    let x_45 : i32 = x_GLF_global_loop_count;
+    x_GLF_global_loop_count = (x_45 + 1);
+    x_55_phi = true;
+    if (!(true)) {
+      let x_51 : i32 = x_6.x_GLF_uniform_int_values[0];
+      let x_53 : i32 = x_6.x_GLF_uniform_int_values[1];
+      x_54 = (x_51 == x_53);
+      x_55_phi = x_54;
+    }
+    let x_55 : bool = x_55_phi;
+    if (!(x_55)) {
+      break;
+    }
+  }
+  loop {
+    let x_63 : i32 = x_GLF_global_loop_count;
+    if ((x_63 < 100)) {
+    } else {
+      break;
+    }
+    let x_66 : i32 = x_GLF_global_loop_count;
+    x_GLF_global_loop_count = (x_66 + 1);
+    let x_69 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_70 : f32 = f32(x_69);
+    x_GLF_color = vec4<f32>(x_70, x_70, x_70, x_70);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.spvasm
new file mode 100644
index 0000000..be0f8f3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.spvasm
@@ -0,0 +1,267 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %_GLF_global_loop_count "_GLF_global_loop_count"
+               OpName %m "m"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %v "v"
+               OpName %f "f"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %b "b"
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "one"
+               OpName %__1 ""
+               OpName %zero "zero"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_18 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %buf2 Block
+               OpDecorate %__1 DescriptorSet 0
+               OpDecorate %__1 Binding 2
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+%_GLF_global_loop_count = OpVariable %_ptr_Private_int Private
+      %int_0 = OpConstant %int 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%mat4v4float = OpTypeMatrix %v4float 4
+%_ptr_Function_mat4v4float = OpTypePointer Function %mat4v4float
+       %uint = OpTypeInt 32 0
+    %uint_18 = OpConstant %uint 18
+%_arr_float_uint_18 = OpTypeArray %float %uint_18
+       %buf1 = OpTypeStruct %_arr_float_uint_18
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+      %int_9 = OpConstant %int 9
+     %int_10 = OpConstant %int 10
+     %int_11 = OpConstant %int 11
+     %int_12 = OpConstant %int 12
+     %int_13 = OpConstant %int 13
+     %int_14 = OpConstant %int 14
+     %int_15 = OpConstant %int 15
+     %int_16 = OpConstant %int 16
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%_ptr_Function_float = OpTypePointer Function %float
+%_ptr_Function_int = OpTypePointer Function %int
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+       %buf2 = OpTypeStruct %int
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+        %__1 = OpVariable %_ptr_Uniform_buf2 Uniform
+     %int_17 = OpConstant %int 17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %20
+         %60 = OpLabel
+          %m = OpVariable %_ptr_Function_mat4v4float Function
+          %v = OpVariable %_ptr_Function_v4float Function
+          %f = OpVariable %_ptr_Function_float Function
+          %a = OpVariable %_ptr_Function_int Function
+          %b = OpVariable %_ptr_Function_int Function
+       %zero = OpVariable %_ptr_Function_float Function
+               OpStore %_GLF_global_loop_count %int_0
+         %61 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %62 = OpLoad %float %61
+         %63 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %64 = OpLoad %float %63
+         %65 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_3
+         %66 = OpLoad %float %65
+         %67 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_4
+         %68 = OpLoad %float %67
+         %69 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_5
+         %70 = OpLoad %float %69
+         %71 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_6
+         %72 = OpLoad %float %71
+         %73 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_7
+         %74 = OpLoad %float %73
+         %75 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_8
+         %76 = OpLoad %float %75
+         %77 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_9
+         %78 = OpLoad %float %77
+         %79 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_10
+         %80 = OpLoad %float %79
+         %81 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_11
+         %82 = OpLoad %float %81
+         %83 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_12
+         %84 = OpLoad %float %83
+         %85 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_13
+         %86 = OpLoad %float %85
+         %87 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_14
+         %88 = OpLoad %float %87
+         %89 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_15
+         %90 = OpLoad %float %89
+         %91 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_16
+         %92 = OpLoad %float %91
+         %93 = OpCompositeConstruct %v4float %62 %64 %66 %68
+         %94 = OpCompositeConstruct %v4float %70 %72 %74 %76
+         %95 = OpCompositeConstruct %v4float %78 %80 %82 %84
+         %96 = OpCompositeConstruct %v4float %86 %88 %90 %92
+         %97 = OpCompositeConstruct %mat4v4float %93 %94 %95 %96
+               OpStore %m %97
+         %98 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %99 = OpLoad %float %98
+        %100 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+        %101 = OpLoad %float %100
+        %102 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_3
+        %103 = OpLoad %float %102
+        %104 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_4
+        %105 = OpLoad %float %104
+        %106 = OpCompositeConstruct %v4float %99 %101 %103 %105
+               OpStore %v %106
+        %107 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+        %108 = OpLoad %float %107
+               OpStore %f %108
+        %109 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+        %110 = OpLoad %int %109
+               OpStore %a %110
+               OpBranch %111
+        %111 = OpLabel
+               OpLoopMerge %112 %113 None
+               OpBranch %114
+        %114 = OpLabel
+        %115 = OpLoad %int %_GLF_global_loop_count
+        %116 = OpSLessThan %bool %115 %int_10
+               OpBranchConditional %116 %117 %112
+        %117 = OpLabel
+        %118 = OpLoad %int %_GLF_global_loop_count
+        %119 = OpIAdd %int %118 %int_1
+               OpStore %_GLF_global_loop_count %119
+        %120 = OpLoad %int %a
+        %121 = OpExtInst %int %1 SClamp %120 %int_0 %int_3
+        %122 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+        %123 = OpLoad %float %122
+        %124 = OpAccessChain %_ptr_Function_float %v %121
+        %125 = OpLoad %float %124
+        %126 = OpFAdd %float %125 %123
+        %127 = OpAccessChain %_ptr_Function_float %v %121
+               OpStore %127 %126
+        %128 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+        %129 = OpLoad %int %128
+               OpStore %b %129
+               OpBranch %130
+        %130 = OpLabel
+               OpLoopMerge %131 %132 None
+               OpBranch %133
+        %133 = OpLabel
+        %134 = OpLoad %int %_GLF_global_loop_count
+        %135 = OpSLessThan %bool %134 %int_10
+               OpBranchConditional %135 %136 %131
+        %136 = OpLabel
+        %137 = OpLoad %int %_GLF_global_loop_count
+        %138 = OpIAdd %int %137 %int_1
+               OpStore %_GLF_global_loop_count %138
+        %139 = OpLoad %int %b
+        %140 = OpExtInst %int %1 SClamp %139 %int_0 %int_3
+        %141 = OpAccessChain %_ptr_Function_float %v %140
+        %142 = OpLoad %float %141
+        %143 = OpLoad %int %b
+        %144 = OpExtInst %int %1 SClamp %143 %int_0 %int_3
+        %145 = OpLoad %int %a
+        %146 = OpAccessChain %_ptr_Function_float %m %144 %145
+        %147 = OpLoad %float %146
+        %148 = OpFMul %float %142 %147
+        %149 = OpLoad %float %f
+        %150 = OpFAdd %float %149 %148
+               OpStore %f %150
+               OpBranch %132
+        %132 = OpLabel
+        %151 = OpLoad %int %b
+        %152 = OpISub %int %151 %int_1
+               OpStore %b %152
+               OpBranch %130
+        %131 = OpLabel
+        %153 = OpLoad %int %a
+        %154 = OpExtInst %int %1 SClamp %153 %int_0 %int_3
+        %155 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+        %156 = OpLoad %float %155
+        %157 = OpAccessChain %_ptr_Function_float %m %int_1 %154
+               OpStore %157 %156
+        %158 = OpAccessChain %_ptr_Uniform_int %__1 %int_0
+        %159 = OpLoad %int %158
+        %160 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+        %161 = OpLoad %int %160
+        %162 = OpIEqual %bool %159 %161
+               OpSelectionMerge %163 None
+               OpBranchConditional %162 %164 %163
+        %164 = OpLabel
+               OpKill
+        %163 = OpLabel
+        %165 = OpAccessChain %_ptr_Uniform_int %__1 %int_0
+        %166 = OpLoad %int %165
+        %167 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %168 = OpLoad %int %167
+        %169 = OpIEqual %bool %166 %168
+               OpSelectionMerge %170 None
+               OpBranchConditional %169 %171 %170
+        %171 = OpLabel
+               OpKill
+        %170 = OpLabel
+               OpBranch %113
+        %113 = OpLabel
+        %172 = OpLoad %int %a
+        %173 = OpIAdd %int %172 %int_1
+               OpStore %a %173
+               OpBranch %111
+        %112 = OpLabel
+        %174 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+        %175 = OpLoad %float %174
+               OpStore %zero %175
+        %176 = OpLoad %float %f
+        %177 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_17
+        %178 = OpLoad %float %177
+        %179 = OpFUnordNotEqual %bool %176 %178
+               OpSelectionMerge %180 None
+               OpBranchConditional %179 %181 %180
+        %181 = OpLabel
+        %182 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+        %183 = OpLoad %float %182
+               OpStore %zero %183
+               OpBranch %180
+        %180 = OpLabel
+        %184 = OpLoad %float %f
+        %185 = OpLoad %float %zero
+        %186 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+        %187 = OpLoad %int %186
+        %188 = OpConvertSToF %float %187
+        %189 = OpLoad %float %f
+        %190 = OpCompositeConstruct %v4float %184 %185 %188 %189
+               OpStore %_GLF_color %190
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..1765c5c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,114 @@
+void set_float4(inout float4 vec, int idx, float val) {
+  vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
+}
+
+static int x_GLF_global_loop_count = 0;
+cbuffer cbuffer_x_7 : register(b1, space0) {
+  uint4 x_7[18];
+};
+cbuffer cbuffer_x_12 : register(b0, space0) {
+  uint4 x_12[4];
+};
+cbuffer cbuffer_x_15 : register(b2, space0) {
+  uint4 x_15[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4x4 m = float4x4(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  float4 v = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float f = 0.0f;
+  int a = 0;
+  int b = 0;
+  float zero = 0.0f;
+  x_GLF_global_loop_count = 0;
+  const float x_62 = asfloat(x_7[1].x);
+  const float x_64 = asfloat(x_7[2].x);
+  const float x_66 = asfloat(x_7[3].x);
+  const float x_68 = asfloat(x_7[4].x);
+  const float x_70 = asfloat(x_7[5].x);
+  const float x_72 = asfloat(x_7[6].x);
+  const float x_74 = asfloat(x_7[7].x);
+  const float x_76 = asfloat(x_7[8].x);
+  const float x_78 = asfloat(x_7[9].x);
+  const float x_80 = asfloat(x_7[10].x);
+  const float x_82 = asfloat(x_7[11].x);
+  const float x_84 = asfloat(x_7[12].x);
+  const float x_86 = asfloat(x_7[13].x);
+  const float x_88 = asfloat(x_7[14].x);
+  const float x_90 = asfloat(x_7[15].x);
+  const float x_92 = asfloat(x_7[16].x);
+  m = float4x4(float4(x_62, x_64, x_66, x_68), float4(x_70, x_72, x_74, x_76), float4(x_78, x_80, x_82, x_84), float4(x_86, x_88, x_90, x_92));
+  const float x_99 = asfloat(x_7[1].x);
+  const float x_101 = asfloat(x_7[2].x);
+  const float x_103 = asfloat(x_7[3].x);
+  const float x_105 = asfloat(x_7[4].x);
+  v = float4(x_99, x_101, x_103, x_105);
+  const float x_108 = asfloat(x_7[1].x);
+  f = x_108;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_110 = asint(x_12[scalar_offset / 4][scalar_offset % 4]);
+  a = x_110;
+  {
+    for(; (x_GLF_global_loop_count < 10); a = (a + 1)) {
+      x_GLF_global_loop_count = (x_GLF_global_loop_count + 1);
+      const int x_121 = clamp(a, 0, 3);
+      const float x_123 = asfloat(x_7[1].x);
+      const float x_125 = v[x_121];
+      set_float4(v, x_121, (x_125 + x_123));
+      const int x_129 = asint(x_12[2].x);
+      b = x_129;
+      {
+        for(; (x_GLF_global_loop_count < 10); b = (b - 1)) {
+          x_GLF_global_loop_count = (x_GLF_global_loop_count + 1);
+          const float x_142 = v[clamp(b, 0, 3)];
+          const float x_147 = m[clamp(b, 0, 3)][a];
+          f = (f + (x_142 * x_147));
+        }
+      }
+      const int x_153 = a;
+      const float x_156 = asfloat(x_7[1].x);
+      set_float4(m[1], clamp(x_153, 0, 3), x_156);
+      const int x_159 = asint(x_15[0].x);
+      const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+      const int x_161 = asint(x_12[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+      if ((x_159 == x_161)) {
+        discard;
+      }
+      const int x_166 = asint(x_15[0].x);
+      const int x_168 = asint(x_12[1].x);
+      if ((x_166 == x_168)) {
+        discard;
+      }
+    }
+  }
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const float x_175 = asfloat(x_7[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  zero = x_175;
+  const float x_176 = f;
+  const float x_178 = asfloat(x_7[17].x);
+  if (!((x_176 == x_178))) {
+    const float x_183 = asfloat(x_7[1].x);
+    zero = x_183;
+  }
+  const float x_184 = f;
+  const float x_185 = zero;
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const int x_187 = asint(x_12[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  x_GLF_color = float4(x_184, x_185, float(x_187), f);
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..68f7998
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.spvasm.expected.msl
@@ -0,0 +1,145 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[18];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct buf2 {
+  /* 0x0000 */ int one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_7, constant buf0& x_12, constant buf2& x_15, thread int* const tint_symbol_4, thread float4* const tint_symbol_5) {
+  float4x4 m = float4x4(0.0f);
+  float4 v = 0.0f;
+  float f = 0.0f;
+  int a = 0;
+  int b = 0;
+  float zero = 0.0f;
+  *(tint_symbol_4) = 0;
+  float const x_62 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  float const x_64 = x_7.x_GLF_uniform_float_values.arr[2].el;
+  float const x_66 = x_7.x_GLF_uniform_float_values.arr[3].el;
+  float const x_68 = x_7.x_GLF_uniform_float_values.arr[4].el;
+  float const x_70 = x_7.x_GLF_uniform_float_values.arr[5].el;
+  float const x_72 = x_7.x_GLF_uniform_float_values.arr[6].el;
+  float const x_74 = x_7.x_GLF_uniform_float_values.arr[7].el;
+  float const x_76 = x_7.x_GLF_uniform_float_values.arr[8].el;
+  float const x_78 = x_7.x_GLF_uniform_float_values.arr[9].el;
+  float const x_80 = x_7.x_GLF_uniform_float_values.arr[10].el;
+  float const x_82 = x_7.x_GLF_uniform_float_values.arr[11].el;
+  float const x_84 = x_7.x_GLF_uniform_float_values.arr[12].el;
+  float const x_86 = x_7.x_GLF_uniform_float_values.arr[13].el;
+  float const x_88 = x_7.x_GLF_uniform_float_values.arr[14].el;
+  float const x_90 = x_7.x_GLF_uniform_float_values.arr[15].el;
+  float const x_92 = x_7.x_GLF_uniform_float_values.arr[16].el;
+  m = float4x4(float4(x_62, x_64, x_66, x_68), float4(x_70, x_72, x_74, x_76), float4(x_78, x_80, x_82, x_84), float4(x_86, x_88, x_90, x_92));
+  float const x_99 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  float const x_101 = x_7.x_GLF_uniform_float_values.arr[2].el;
+  float const x_103 = x_7.x_GLF_uniform_float_values.arr[3].el;
+  float const x_105 = x_7.x_GLF_uniform_float_values.arr[4].el;
+  v = float4(x_99, x_101, x_103, x_105);
+  float const x_108 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  f = x_108;
+  int const x_110 = x_12.x_GLF_uniform_int_values.arr[0].el;
+  a = x_110;
+  while (true) {
+    int const x_115 = *(tint_symbol_4);
+    if ((x_115 < 10)) {
+    } else {
+      break;
+    }
+    int const x_118 = *(tint_symbol_4);
+    *(tint_symbol_4) = (x_118 + 1);
+    int const x_120 = a;
+    int const x_121 = clamp(x_120, 0, 3);
+    float const x_123 = x_7.x_GLF_uniform_float_values.arr[1].el;
+    float const x_125 = v[x_121];
+    v[x_121] = (x_125 + x_123);
+    int const x_129 = x_12.x_GLF_uniform_int_values.arr[2].el;
+    b = x_129;
+    while (true) {
+      int const x_134 = *(tint_symbol_4);
+      if ((x_134 < 10)) {
+      } else {
+        break;
+      }
+      int const x_137 = *(tint_symbol_4);
+      *(tint_symbol_4) = (x_137 + 1);
+      int const x_139 = b;
+      float const x_142 = v[clamp(x_139, 0, 3)];
+      int const x_143 = b;
+      int const x_145 = a;
+      float const x_147 = m[clamp(x_143, 0, 3)][x_145];
+      float const x_149 = f;
+      f = (x_149 + (x_142 * x_147));
+      {
+        int const x_151 = b;
+        b = (x_151 - 1);
+      }
+    }
+    int const x_153 = a;
+    float const x_156 = x_7.x_GLF_uniform_float_values.arr[1].el;
+    m[1][clamp(x_153, 0, 3)] = x_156;
+    int const x_159 = x_15.one;
+    int const x_161 = x_12.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_159 == x_161)) {
+      discard_fragment();
+    }
+    int const x_166 = x_15.one;
+    int const x_168 = x_12.x_GLF_uniform_int_values.arr[1].el;
+    if ((x_166 == x_168)) {
+      discard_fragment();
+    }
+    {
+      int const x_172 = a;
+      a = (x_172 + 1);
+    }
+  }
+  float const x_175 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  zero = x_175;
+  float const x_176 = f;
+  float const x_178 = x_7.x_GLF_uniform_float_values.arr[17].el;
+  if (!((x_176 == x_178))) {
+    float const x_183 = x_7.x_GLF_uniform_float_values.arr[1].el;
+    zero = x_183;
+  }
+  float const x_184 = f;
+  float const x_185 = zero;
+  int const x_187 = x_12.x_GLF_uniform_int_values.arr[0].el;
+  float const x_189 = f;
+  *(tint_symbol_5) = float4(x_184, x_185, float(x_187), x_189);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_7 [[buffer(1)]], constant buf0& x_12 [[buffer(0)]], constant buf2& x_15 [[buffer(2)]]) {
+  thread int tint_symbol_6 = 0;
+  thread float4 tint_symbol_7 = 0.0f;
+  main_1(x_7, x_12, x_15, &(tint_symbol_6), &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..f1de9d2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,314 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 213
+; Schema: 0
+               OpCapability Shader
+        %127 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_global_loop_count "x_GLF_global_loop_count"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_7 "x_7"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_12 "x_12"
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "one"
+               OpName %x_15 "x_15"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %m "m"
+               OpName %v "v"
+               OpName %f "f"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %zero "zero"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_18 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_12 NonWritable
+               OpDecorate %x_12 DescriptorSet 0
+               OpDecorate %x_12 Binding 0
+               OpDecorate %buf2 Block
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %x_15 NonWritable
+               OpDecorate %x_15 DescriptorSet 0
+               OpDecorate %x_15 Binding 2
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+          %4 = OpConstantNull %int
+%x_GLF_global_loop_count = OpVariable %_ptr_Private_int Private %4
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+    %uint_18 = OpConstant %uint 18
+%_arr_float_uint_18 = OpTypeArray %float %uint_18
+       %buf1 = OpTypeStruct %_arr_float_uint_18
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_7 = OpVariable %_ptr_Uniform_buf1 Uniform
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_12 = OpVariable %_ptr_Uniform_buf0 Uniform
+       %buf2 = OpTypeStruct %int
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+       %x_15 = OpVariable %_ptr_Uniform_buf2 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %23 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %23
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %23
+       %void = OpTypeVoid
+         %26 = OpTypeFunction %void
+%mat4v4float = OpTypeMatrix %v4float 4
+%_ptr_Function_mat4v4float = OpTypePointer Function %mat4v4float
+         %33 = OpConstantNull %mat4v4float
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%_ptr_Function_float = OpTypePointer Function %float
+         %38 = OpConstantNull %float
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+      %int_9 = OpConstant %int 9
+     %int_10 = OpConstant %int 10
+     %int_11 = OpConstant %int 11
+     %int_12 = OpConstant %int 12
+     %int_13 = OpConstant %int 13
+     %int_14 = OpConstant %int 14
+     %int_15 = OpConstant %int 15
+     %int_16 = OpConstant %int 16
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+     %int_17 = OpConstant %int 17
+   %main_out = OpTypeStruct %v4float
+        %201 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %26
+         %29 = OpLabel
+          %m = OpVariable %_ptr_Function_mat4v4float Function %33
+          %v = OpVariable %_ptr_Function_v4float Function %23
+          %f = OpVariable %_ptr_Function_float Function %38
+          %a = OpVariable %_ptr_Function_int Function %4
+          %b = OpVariable %_ptr_Function_int Function %4
+       %zero = OpVariable %_ptr_Function_float Function %38
+               OpStore %x_GLF_global_loop_count %int_0
+         %47 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %48 = OpLoad %float %47
+         %50 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_2
+         %51 = OpLoad %float %50
+         %53 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_3
+         %54 = OpLoad %float %53
+         %56 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_4
+         %57 = OpLoad %float %56
+         %59 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_5
+         %60 = OpLoad %float %59
+         %62 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_6
+         %63 = OpLoad %float %62
+         %65 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_7
+         %66 = OpLoad %float %65
+         %68 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_8
+         %69 = OpLoad %float %68
+         %71 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_9
+         %72 = OpLoad %float %71
+         %74 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_10
+         %75 = OpLoad %float %74
+         %77 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_11
+         %78 = OpLoad %float %77
+         %80 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_12
+         %81 = OpLoad %float %80
+         %83 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_13
+         %84 = OpLoad %float %83
+         %86 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_14
+         %87 = OpLoad %float %86
+         %89 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_15
+         %90 = OpLoad %float %89
+         %92 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_16
+         %93 = OpLoad %float %92
+         %94 = OpCompositeConstruct %v4float %48 %51 %54 %57
+         %95 = OpCompositeConstruct %v4float %60 %63 %66 %69
+         %96 = OpCompositeConstruct %v4float %72 %75 %78 %81
+         %97 = OpCompositeConstruct %v4float %84 %87 %90 %93
+         %98 = OpCompositeConstruct %mat4v4float %94 %95 %96 %97
+               OpStore %m %98
+         %99 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+        %100 = OpLoad %float %99
+        %101 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_2
+        %102 = OpLoad %float %101
+        %103 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_3
+        %104 = OpLoad %float %103
+        %105 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_4
+        %106 = OpLoad %float %105
+        %107 = OpCompositeConstruct %v4float %100 %102 %104 %106
+               OpStore %v %107
+        %108 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+        %109 = OpLoad %float %108
+               OpStore %f %109
+        %111 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_0
+        %112 = OpLoad %int %111
+               OpStore %a %112
+               OpBranch %113
+        %113 = OpLabel
+               OpLoopMerge %114 %115 None
+               OpBranch %116
+        %116 = OpLabel
+        %117 = OpLoad %int %x_GLF_global_loop_count
+        %118 = OpSLessThan %bool %117 %int_10
+               OpSelectionMerge %120 None
+               OpBranchConditional %118 %121 %122
+        %121 = OpLabel
+               OpBranch %120
+        %122 = OpLabel
+               OpBranch %114
+        %120 = OpLabel
+        %123 = OpLoad %int %x_GLF_global_loop_count
+        %124 = OpIAdd %int %123 %int_1
+               OpStore %x_GLF_global_loop_count %124
+        %125 = OpLoad %int %a
+        %126 = OpExtInst %int %127 SClamp %125 %int_0 %int_3
+        %128 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+        %129 = OpLoad %float %128
+        %130 = OpAccessChain %_ptr_Function_float %v %126
+        %131 = OpLoad %float %130
+        %132 = OpAccessChain %_ptr_Function_float %v %126
+        %133 = OpFAdd %float %131 %129
+               OpStore %132 %133
+        %134 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_2
+        %135 = OpLoad %int %134
+               OpStore %b %135
+               OpBranch %136
+        %136 = OpLabel
+               OpLoopMerge %137 %138 None
+               OpBranch %139
+        %139 = OpLabel
+        %140 = OpLoad %int %x_GLF_global_loop_count
+        %141 = OpSLessThan %bool %140 %int_10
+               OpSelectionMerge %142 None
+               OpBranchConditional %141 %143 %144
+        %143 = OpLabel
+               OpBranch %142
+        %144 = OpLabel
+               OpBranch %137
+        %142 = OpLabel
+        %145 = OpLoad %int %x_GLF_global_loop_count
+        %146 = OpIAdd %int %145 %int_1
+               OpStore %x_GLF_global_loop_count %146
+        %147 = OpLoad %int %b
+        %148 = OpExtInst %int %127 SClamp %147 %int_0 %int_3
+        %149 = OpAccessChain %_ptr_Function_float %v %148
+        %150 = OpLoad %float %149
+        %151 = OpLoad %int %b
+        %152 = OpLoad %int %a
+        %153 = OpExtInst %int %127 SClamp %151 %int_0 %int_3
+        %154 = OpAccessChain %_ptr_Function_float %m %153 %152
+        %155 = OpLoad %float %154
+        %156 = OpLoad %float %f
+        %157 = OpFMul %float %150 %155
+        %158 = OpFAdd %float %156 %157
+               OpStore %f %158
+               OpBranch %138
+        %138 = OpLabel
+        %159 = OpLoad %int %b
+        %160 = OpISub %int %159 %int_1
+               OpStore %b %160
+               OpBranch %136
+        %137 = OpLabel
+        %161 = OpLoad %int %a
+        %162 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+        %163 = OpLoad %float %162
+        %164 = OpExtInst %int %127 SClamp %161 %int_0 %int_3
+        %165 = OpAccessChain %_ptr_Function_float %m %int_1 %164
+               OpStore %165 %163
+        %166 = OpAccessChain %_ptr_Uniform_int %x_15 %uint_0
+        %167 = OpLoad %int %166
+        %168 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_0
+        %169 = OpLoad %int %168
+        %170 = OpIEqual %bool %167 %169
+               OpSelectionMerge %171 None
+               OpBranchConditional %170 %172 %171
+        %172 = OpLabel
+               OpKill
+        %171 = OpLabel
+        %173 = OpAccessChain %_ptr_Uniform_int %x_15 %uint_0
+        %174 = OpLoad %int %173
+        %175 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_1
+        %176 = OpLoad %int %175
+        %177 = OpIEqual %bool %174 %176
+               OpSelectionMerge %178 None
+               OpBranchConditional %177 %179 %178
+        %179 = OpLabel
+               OpKill
+        %178 = OpLabel
+               OpBranch %115
+        %115 = OpLabel
+        %180 = OpLoad %int %a
+        %181 = OpIAdd %int %180 %int_1
+               OpStore %a %181
+               OpBranch %113
+        %114 = OpLabel
+        %182 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+        %183 = OpLoad %float %182
+               OpStore %zero %183
+        %184 = OpLoad %float %f
+        %186 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_17
+        %187 = OpLoad %float %186
+        %189 = OpFOrdEqual %bool %184 %187
+        %188 = OpLogicalNot %bool %189
+               OpSelectionMerge %190 None
+               OpBranchConditional %188 %191 %190
+        %191 = OpLabel
+        %192 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+        %193 = OpLoad %float %192
+               OpStore %zero %193
+               OpBranch %190
+        %190 = OpLabel
+        %194 = OpLoad %float %f
+        %195 = OpLoad %float %zero
+        %196 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_0
+        %197 = OpLoad %int %196
+        %198 = OpLoad %float %f
+        %199 = OpConvertSToF %float %197
+        %200 = OpCompositeConstruct %v4float %194 %195 %199 %198
+               OpStore %x_GLF_color %200
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %201
+%tint_symbol = OpFunctionParameter %main_out
+        %205 = OpLabel
+        %206 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %206
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %26
+        %208 = OpLabel
+        %209 = OpFunctionCall %void %main_1
+        %211 = OpLoad %v4float %x_GLF_color
+        %212 = OpCompositeConstruct %main_out %211
+        %210 = OpFunctionCall %void %tint_symbol_2 %212
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..40aaeca
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,144 @@
+type Arr = [[stride(16)]] array<f32, 18>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[block]]
+struct buf2 {
+  one : i32;
+};
+
+var<private> x_GLF_global_loop_count : i32;
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_12 : buf0;
+
+[[group(0), binding(2)]] var<uniform> x_15 : buf2;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m : mat4x4<f32>;
+  var v : vec4<f32>;
+  var f : f32;
+  var a : i32;
+  var b : i32;
+  var zero : f32;
+  x_GLF_global_loop_count = 0;
+  let x_62 : f32 = x_7.x_GLF_uniform_float_values[1];
+  let x_64 : f32 = x_7.x_GLF_uniform_float_values[2];
+  let x_66 : f32 = x_7.x_GLF_uniform_float_values[3];
+  let x_68 : f32 = x_7.x_GLF_uniform_float_values[4];
+  let x_70 : f32 = x_7.x_GLF_uniform_float_values[5];
+  let x_72 : f32 = x_7.x_GLF_uniform_float_values[6];
+  let x_74 : f32 = x_7.x_GLF_uniform_float_values[7];
+  let x_76 : f32 = x_7.x_GLF_uniform_float_values[8];
+  let x_78 : f32 = x_7.x_GLF_uniform_float_values[9];
+  let x_80 : f32 = x_7.x_GLF_uniform_float_values[10];
+  let x_82 : f32 = x_7.x_GLF_uniform_float_values[11];
+  let x_84 : f32 = x_7.x_GLF_uniform_float_values[12];
+  let x_86 : f32 = x_7.x_GLF_uniform_float_values[13];
+  let x_88 : f32 = x_7.x_GLF_uniform_float_values[14];
+  let x_90 : f32 = x_7.x_GLF_uniform_float_values[15];
+  let x_92 : f32 = x_7.x_GLF_uniform_float_values[16];
+  m = mat4x4<f32>(vec4<f32>(x_62, x_64, x_66, x_68), vec4<f32>(x_70, x_72, x_74, x_76), vec4<f32>(x_78, x_80, x_82, x_84), vec4<f32>(x_86, x_88, x_90, x_92));
+  let x_99 : f32 = x_7.x_GLF_uniform_float_values[1];
+  let x_101 : f32 = x_7.x_GLF_uniform_float_values[2];
+  let x_103 : f32 = x_7.x_GLF_uniform_float_values[3];
+  let x_105 : f32 = x_7.x_GLF_uniform_float_values[4];
+  v = vec4<f32>(x_99, x_101, x_103, x_105);
+  let x_108 : f32 = x_7.x_GLF_uniform_float_values[1];
+  f = x_108;
+  let x_110 : i32 = x_12.x_GLF_uniform_int_values[0];
+  a = x_110;
+  loop {
+    let x_115 : i32 = x_GLF_global_loop_count;
+    if ((x_115 < 10)) {
+    } else {
+      break;
+    }
+    let x_118 : i32 = x_GLF_global_loop_count;
+    x_GLF_global_loop_count = (x_118 + 1);
+    let x_120 : i32 = a;
+    let x_121 : i32 = clamp(x_120, 0, 3);
+    let x_123 : f32 = x_7.x_GLF_uniform_float_values[1];
+    let x_125 : f32 = v[x_121];
+    v[x_121] = (x_125 + x_123);
+    let x_129 : i32 = x_12.x_GLF_uniform_int_values[2];
+    b = x_129;
+    loop {
+      let x_134 : i32 = x_GLF_global_loop_count;
+      if ((x_134 < 10)) {
+      } else {
+        break;
+      }
+      let x_137 : i32 = x_GLF_global_loop_count;
+      x_GLF_global_loop_count = (x_137 + 1);
+      let x_139 : i32 = b;
+      let x_142 : f32 = v[clamp(x_139, 0, 3)];
+      let x_143 : i32 = b;
+      let x_145 : i32 = a;
+      let x_147 : f32 = m[clamp(x_143, 0, 3)][x_145];
+      let x_149 : f32 = f;
+      f = (x_149 + (x_142 * x_147));
+
+      continuing {
+        let x_151 : i32 = b;
+        b = (x_151 - 1);
+      }
+    }
+    let x_153 : i32 = a;
+    let x_156 : f32 = x_7.x_GLF_uniform_float_values[1];
+    m[1][clamp(x_153, 0, 3)] = x_156;
+    let x_159 : i32 = x_15.one;
+    let x_161 : i32 = x_12.x_GLF_uniform_int_values[0];
+    if ((x_159 == x_161)) {
+      discard;
+    }
+    let x_166 : i32 = x_15.one;
+    let x_168 : i32 = x_12.x_GLF_uniform_int_values[1];
+    if ((x_166 == x_168)) {
+      discard;
+    }
+
+    continuing {
+      let x_172 : i32 = a;
+      a = (x_172 + 1);
+    }
+  }
+  let x_175 : f32 = x_7.x_GLF_uniform_float_values[0];
+  zero = x_175;
+  let x_176 : f32 = f;
+  let x_178 : f32 = x_7.x_GLF_uniform_float_values[17];
+  if (!((x_176 == x_178))) {
+    let x_183 : f32 = x_7.x_GLF_uniform_float_values[1];
+    zero = x_183;
+  }
+  let x_184 : f32 = f;
+  let x_185 : f32 = zero;
+  let x_187 : i32 = x_12.x_GLF_uniform_int_values[0];
+  let x_189 : f32 = f;
+  x_GLF_color = vec4<f32>(x_184, x_185, f32(x_187), x_189);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.wgsl
new file mode 100644
index 0000000..40aaeca
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.wgsl
@@ -0,0 +1,144 @@
+type Arr = [[stride(16)]] array<f32, 18>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[block]]
+struct buf2 {
+  one : i32;
+};
+
+var<private> x_GLF_global_loop_count : i32;
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_12 : buf0;
+
+[[group(0), binding(2)]] var<uniform> x_15 : buf2;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m : mat4x4<f32>;
+  var v : vec4<f32>;
+  var f : f32;
+  var a : i32;
+  var b : i32;
+  var zero : f32;
+  x_GLF_global_loop_count = 0;
+  let x_62 : f32 = x_7.x_GLF_uniform_float_values[1];
+  let x_64 : f32 = x_7.x_GLF_uniform_float_values[2];
+  let x_66 : f32 = x_7.x_GLF_uniform_float_values[3];
+  let x_68 : f32 = x_7.x_GLF_uniform_float_values[4];
+  let x_70 : f32 = x_7.x_GLF_uniform_float_values[5];
+  let x_72 : f32 = x_7.x_GLF_uniform_float_values[6];
+  let x_74 : f32 = x_7.x_GLF_uniform_float_values[7];
+  let x_76 : f32 = x_7.x_GLF_uniform_float_values[8];
+  let x_78 : f32 = x_7.x_GLF_uniform_float_values[9];
+  let x_80 : f32 = x_7.x_GLF_uniform_float_values[10];
+  let x_82 : f32 = x_7.x_GLF_uniform_float_values[11];
+  let x_84 : f32 = x_7.x_GLF_uniform_float_values[12];
+  let x_86 : f32 = x_7.x_GLF_uniform_float_values[13];
+  let x_88 : f32 = x_7.x_GLF_uniform_float_values[14];
+  let x_90 : f32 = x_7.x_GLF_uniform_float_values[15];
+  let x_92 : f32 = x_7.x_GLF_uniform_float_values[16];
+  m = mat4x4<f32>(vec4<f32>(x_62, x_64, x_66, x_68), vec4<f32>(x_70, x_72, x_74, x_76), vec4<f32>(x_78, x_80, x_82, x_84), vec4<f32>(x_86, x_88, x_90, x_92));
+  let x_99 : f32 = x_7.x_GLF_uniform_float_values[1];
+  let x_101 : f32 = x_7.x_GLF_uniform_float_values[2];
+  let x_103 : f32 = x_7.x_GLF_uniform_float_values[3];
+  let x_105 : f32 = x_7.x_GLF_uniform_float_values[4];
+  v = vec4<f32>(x_99, x_101, x_103, x_105);
+  let x_108 : f32 = x_7.x_GLF_uniform_float_values[1];
+  f = x_108;
+  let x_110 : i32 = x_12.x_GLF_uniform_int_values[0];
+  a = x_110;
+  loop {
+    let x_115 : i32 = x_GLF_global_loop_count;
+    if ((x_115 < 10)) {
+    } else {
+      break;
+    }
+    let x_118 : i32 = x_GLF_global_loop_count;
+    x_GLF_global_loop_count = (x_118 + 1);
+    let x_120 : i32 = a;
+    let x_121 : i32 = clamp(x_120, 0, 3);
+    let x_123 : f32 = x_7.x_GLF_uniform_float_values[1];
+    let x_125 : f32 = v[x_121];
+    v[x_121] = (x_125 + x_123);
+    let x_129 : i32 = x_12.x_GLF_uniform_int_values[2];
+    b = x_129;
+    loop {
+      let x_134 : i32 = x_GLF_global_loop_count;
+      if ((x_134 < 10)) {
+      } else {
+        break;
+      }
+      let x_137 : i32 = x_GLF_global_loop_count;
+      x_GLF_global_loop_count = (x_137 + 1);
+      let x_139 : i32 = b;
+      let x_142 : f32 = v[clamp(x_139, 0, 3)];
+      let x_143 : i32 = b;
+      let x_145 : i32 = a;
+      let x_147 : f32 = m[clamp(x_143, 0, 3)][x_145];
+      let x_149 : f32 = f;
+      f = (x_149 + (x_142 * x_147));
+
+      continuing {
+        let x_151 : i32 = b;
+        b = (x_151 - 1);
+      }
+    }
+    let x_153 : i32 = a;
+    let x_156 : f32 = x_7.x_GLF_uniform_float_values[1];
+    m[1][clamp(x_153, 0, 3)] = x_156;
+    let x_159 : i32 = x_15.one;
+    let x_161 : i32 = x_12.x_GLF_uniform_int_values[0];
+    if ((x_159 == x_161)) {
+      discard;
+    }
+    let x_166 : i32 = x_15.one;
+    let x_168 : i32 = x_12.x_GLF_uniform_int_values[1];
+    if ((x_166 == x_168)) {
+      discard;
+    }
+
+    continuing {
+      let x_172 : i32 = a;
+      a = (x_172 + 1);
+    }
+  }
+  let x_175 : f32 = x_7.x_GLF_uniform_float_values[0];
+  zero = x_175;
+  let x_176 : f32 = f;
+  let x_178 : f32 = x_7.x_GLF_uniform_float_values[17];
+  if (!((x_176 == x_178))) {
+    let x_183 : f32 = x_7.x_GLF_uniform_float_values[1];
+    zero = x_183;
+  }
+  let x_184 : f32 = f;
+  let x_185 : f32 = zero;
+  let x_187 : i32 = x_12.x_GLF_uniform_int_values[0];
+  let x_189 : f32 = f;
+  x_GLF_color = vec4<f32>(x_184, x_185, f32(x_187), x_189);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..1765c5c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,114 @@
+void set_float4(inout float4 vec, int idx, float val) {
+  vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
+}
+
+static int x_GLF_global_loop_count = 0;
+cbuffer cbuffer_x_7 : register(b1, space0) {
+  uint4 x_7[18];
+};
+cbuffer cbuffer_x_12 : register(b0, space0) {
+  uint4 x_12[4];
+};
+cbuffer cbuffer_x_15 : register(b2, space0) {
+  uint4 x_15[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4x4 m = float4x4(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  float4 v = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float f = 0.0f;
+  int a = 0;
+  int b = 0;
+  float zero = 0.0f;
+  x_GLF_global_loop_count = 0;
+  const float x_62 = asfloat(x_7[1].x);
+  const float x_64 = asfloat(x_7[2].x);
+  const float x_66 = asfloat(x_7[3].x);
+  const float x_68 = asfloat(x_7[4].x);
+  const float x_70 = asfloat(x_7[5].x);
+  const float x_72 = asfloat(x_7[6].x);
+  const float x_74 = asfloat(x_7[7].x);
+  const float x_76 = asfloat(x_7[8].x);
+  const float x_78 = asfloat(x_7[9].x);
+  const float x_80 = asfloat(x_7[10].x);
+  const float x_82 = asfloat(x_7[11].x);
+  const float x_84 = asfloat(x_7[12].x);
+  const float x_86 = asfloat(x_7[13].x);
+  const float x_88 = asfloat(x_7[14].x);
+  const float x_90 = asfloat(x_7[15].x);
+  const float x_92 = asfloat(x_7[16].x);
+  m = float4x4(float4(x_62, x_64, x_66, x_68), float4(x_70, x_72, x_74, x_76), float4(x_78, x_80, x_82, x_84), float4(x_86, x_88, x_90, x_92));
+  const float x_99 = asfloat(x_7[1].x);
+  const float x_101 = asfloat(x_7[2].x);
+  const float x_103 = asfloat(x_7[3].x);
+  const float x_105 = asfloat(x_7[4].x);
+  v = float4(x_99, x_101, x_103, x_105);
+  const float x_108 = asfloat(x_7[1].x);
+  f = x_108;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_110 = asint(x_12[scalar_offset / 4][scalar_offset % 4]);
+  a = x_110;
+  {
+    for(; (x_GLF_global_loop_count < 10); a = (a + 1)) {
+      x_GLF_global_loop_count = (x_GLF_global_loop_count + 1);
+      const int x_121 = clamp(a, 0, 3);
+      const float x_123 = asfloat(x_7[1].x);
+      const float x_125 = v[x_121];
+      set_float4(v, x_121, (x_125 + x_123));
+      const int x_129 = asint(x_12[2].x);
+      b = x_129;
+      {
+        for(; (x_GLF_global_loop_count < 10); b = (b - 1)) {
+          x_GLF_global_loop_count = (x_GLF_global_loop_count + 1);
+          const float x_142 = v[clamp(b, 0, 3)];
+          const float x_147 = m[clamp(b, 0, 3)][a];
+          f = (f + (x_142 * x_147));
+        }
+      }
+      const int x_153 = a;
+      const float x_156 = asfloat(x_7[1].x);
+      set_float4(m[1], clamp(x_153, 0, 3), x_156);
+      const int x_159 = asint(x_15[0].x);
+      const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+      const int x_161 = asint(x_12[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+      if ((x_159 == x_161)) {
+        discard;
+      }
+      const int x_166 = asint(x_15[0].x);
+      const int x_168 = asint(x_12[1].x);
+      if ((x_166 == x_168)) {
+        discard;
+      }
+    }
+  }
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const float x_175 = asfloat(x_7[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  zero = x_175;
+  const float x_176 = f;
+  const float x_178 = asfloat(x_7[17].x);
+  if (!((x_176 == x_178))) {
+    const float x_183 = asfloat(x_7[1].x);
+    zero = x_183;
+  }
+  const float x_184 = f;
+  const float x_185 = zero;
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const int x_187 = asint(x_12[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  x_GLF_color = float4(x_184, x_185, float(x_187), f);
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..68f7998
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.wgsl.expected.msl
@@ -0,0 +1,145 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[18];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct buf2 {
+  /* 0x0000 */ int one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_7, constant buf0& x_12, constant buf2& x_15, thread int* const tint_symbol_4, thread float4* const tint_symbol_5) {
+  float4x4 m = float4x4(0.0f);
+  float4 v = 0.0f;
+  float f = 0.0f;
+  int a = 0;
+  int b = 0;
+  float zero = 0.0f;
+  *(tint_symbol_4) = 0;
+  float const x_62 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  float const x_64 = x_7.x_GLF_uniform_float_values.arr[2].el;
+  float const x_66 = x_7.x_GLF_uniform_float_values.arr[3].el;
+  float const x_68 = x_7.x_GLF_uniform_float_values.arr[4].el;
+  float const x_70 = x_7.x_GLF_uniform_float_values.arr[5].el;
+  float const x_72 = x_7.x_GLF_uniform_float_values.arr[6].el;
+  float const x_74 = x_7.x_GLF_uniform_float_values.arr[7].el;
+  float const x_76 = x_7.x_GLF_uniform_float_values.arr[8].el;
+  float const x_78 = x_7.x_GLF_uniform_float_values.arr[9].el;
+  float const x_80 = x_7.x_GLF_uniform_float_values.arr[10].el;
+  float const x_82 = x_7.x_GLF_uniform_float_values.arr[11].el;
+  float const x_84 = x_7.x_GLF_uniform_float_values.arr[12].el;
+  float const x_86 = x_7.x_GLF_uniform_float_values.arr[13].el;
+  float const x_88 = x_7.x_GLF_uniform_float_values.arr[14].el;
+  float const x_90 = x_7.x_GLF_uniform_float_values.arr[15].el;
+  float const x_92 = x_7.x_GLF_uniform_float_values.arr[16].el;
+  m = float4x4(float4(x_62, x_64, x_66, x_68), float4(x_70, x_72, x_74, x_76), float4(x_78, x_80, x_82, x_84), float4(x_86, x_88, x_90, x_92));
+  float const x_99 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  float const x_101 = x_7.x_GLF_uniform_float_values.arr[2].el;
+  float const x_103 = x_7.x_GLF_uniform_float_values.arr[3].el;
+  float const x_105 = x_7.x_GLF_uniform_float_values.arr[4].el;
+  v = float4(x_99, x_101, x_103, x_105);
+  float const x_108 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  f = x_108;
+  int const x_110 = x_12.x_GLF_uniform_int_values.arr[0].el;
+  a = x_110;
+  while (true) {
+    int const x_115 = *(tint_symbol_4);
+    if ((x_115 < 10)) {
+    } else {
+      break;
+    }
+    int const x_118 = *(tint_symbol_4);
+    *(tint_symbol_4) = (x_118 + 1);
+    int const x_120 = a;
+    int const x_121 = clamp(x_120, 0, 3);
+    float const x_123 = x_7.x_GLF_uniform_float_values.arr[1].el;
+    float const x_125 = v[x_121];
+    v[x_121] = (x_125 + x_123);
+    int const x_129 = x_12.x_GLF_uniform_int_values.arr[2].el;
+    b = x_129;
+    while (true) {
+      int const x_134 = *(tint_symbol_4);
+      if ((x_134 < 10)) {
+      } else {
+        break;
+      }
+      int const x_137 = *(tint_symbol_4);
+      *(tint_symbol_4) = (x_137 + 1);
+      int const x_139 = b;
+      float const x_142 = v[clamp(x_139, 0, 3)];
+      int const x_143 = b;
+      int const x_145 = a;
+      float const x_147 = m[clamp(x_143, 0, 3)][x_145];
+      float const x_149 = f;
+      f = (x_149 + (x_142 * x_147));
+      {
+        int const x_151 = b;
+        b = (x_151 - 1);
+      }
+    }
+    int const x_153 = a;
+    float const x_156 = x_7.x_GLF_uniform_float_values.arr[1].el;
+    m[1][clamp(x_153, 0, 3)] = x_156;
+    int const x_159 = x_15.one;
+    int const x_161 = x_12.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_159 == x_161)) {
+      discard_fragment();
+    }
+    int const x_166 = x_15.one;
+    int const x_168 = x_12.x_GLF_uniform_int_values.arr[1].el;
+    if ((x_166 == x_168)) {
+      discard_fragment();
+    }
+    {
+      int const x_172 = a;
+      a = (x_172 + 1);
+    }
+  }
+  float const x_175 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  zero = x_175;
+  float const x_176 = f;
+  float const x_178 = x_7.x_GLF_uniform_float_values.arr[17].el;
+  if (!((x_176 == x_178))) {
+    float const x_183 = x_7.x_GLF_uniform_float_values.arr[1].el;
+    zero = x_183;
+  }
+  float const x_184 = f;
+  float const x_185 = zero;
+  int const x_187 = x_12.x_GLF_uniform_int_values.arr[0].el;
+  float const x_189 = f;
+  *(tint_symbol_5) = float4(x_184, x_185, float(x_187), x_189);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_7 [[buffer(1)]], constant buf0& x_12 [[buffer(0)]], constant buf2& x_15 [[buffer(2)]]) {
+  thread int tint_symbol_6 = 0;
+  thread float4 tint_symbol_7 = 0.0f;
+  main_1(x_7, x_12, x_15, &(tint_symbol_6), &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..f1de9d2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,314 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 213
+; Schema: 0
+               OpCapability Shader
+        %127 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_global_loop_count "x_GLF_global_loop_count"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_7 "x_7"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_12 "x_12"
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "one"
+               OpName %x_15 "x_15"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %m "m"
+               OpName %v "v"
+               OpName %f "f"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %zero "zero"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_18 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_12 NonWritable
+               OpDecorate %x_12 DescriptorSet 0
+               OpDecorate %x_12 Binding 0
+               OpDecorate %buf2 Block
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %x_15 NonWritable
+               OpDecorate %x_15 DescriptorSet 0
+               OpDecorate %x_15 Binding 2
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+          %4 = OpConstantNull %int
+%x_GLF_global_loop_count = OpVariable %_ptr_Private_int Private %4
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+    %uint_18 = OpConstant %uint 18
+%_arr_float_uint_18 = OpTypeArray %float %uint_18
+       %buf1 = OpTypeStruct %_arr_float_uint_18
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_7 = OpVariable %_ptr_Uniform_buf1 Uniform
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_12 = OpVariable %_ptr_Uniform_buf0 Uniform
+       %buf2 = OpTypeStruct %int
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+       %x_15 = OpVariable %_ptr_Uniform_buf2 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %23 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %23
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %23
+       %void = OpTypeVoid
+         %26 = OpTypeFunction %void
+%mat4v4float = OpTypeMatrix %v4float 4
+%_ptr_Function_mat4v4float = OpTypePointer Function %mat4v4float
+         %33 = OpConstantNull %mat4v4float
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%_ptr_Function_float = OpTypePointer Function %float
+         %38 = OpConstantNull %float
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+      %int_9 = OpConstant %int 9
+     %int_10 = OpConstant %int 10
+     %int_11 = OpConstant %int 11
+     %int_12 = OpConstant %int 12
+     %int_13 = OpConstant %int 13
+     %int_14 = OpConstant %int 14
+     %int_15 = OpConstant %int 15
+     %int_16 = OpConstant %int 16
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+     %int_17 = OpConstant %int 17
+   %main_out = OpTypeStruct %v4float
+        %201 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %26
+         %29 = OpLabel
+          %m = OpVariable %_ptr_Function_mat4v4float Function %33
+          %v = OpVariable %_ptr_Function_v4float Function %23
+          %f = OpVariable %_ptr_Function_float Function %38
+          %a = OpVariable %_ptr_Function_int Function %4
+          %b = OpVariable %_ptr_Function_int Function %4
+       %zero = OpVariable %_ptr_Function_float Function %38
+               OpStore %x_GLF_global_loop_count %int_0
+         %47 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %48 = OpLoad %float %47
+         %50 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_2
+         %51 = OpLoad %float %50
+         %53 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_3
+         %54 = OpLoad %float %53
+         %56 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_4
+         %57 = OpLoad %float %56
+         %59 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_5
+         %60 = OpLoad %float %59
+         %62 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_6
+         %63 = OpLoad %float %62
+         %65 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_7
+         %66 = OpLoad %float %65
+         %68 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_8
+         %69 = OpLoad %float %68
+         %71 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_9
+         %72 = OpLoad %float %71
+         %74 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_10
+         %75 = OpLoad %float %74
+         %77 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_11
+         %78 = OpLoad %float %77
+         %80 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_12
+         %81 = OpLoad %float %80
+         %83 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_13
+         %84 = OpLoad %float %83
+         %86 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_14
+         %87 = OpLoad %float %86
+         %89 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_15
+         %90 = OpLoad %float %89
+         %92 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_16
+         %93 = OpLoad %float %92
+         %94 = OpCompositeConstruct %v4float %48 %51 %54 %57
+         %95 = OpCompositeConstruct %v4float %60 %63 %66 %69
+         %96 = OpCompositeConstruct %v4float %72 %75 %78 %81
+         %97 = OpCompositeConstruct %v4float %84 %87 %90 %93
+         %98 = OpCompositeConstruct %mat4v4float %94 %95 %96 %97
+               OpStore %m %98
+         %99 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+        %100 = OpLoad %float %99
+        %101 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_2
+        %102 = OpLoad %float %101
+        %103 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_3
+        %104 = OpLoad %float %103
+        %105 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_4
+        %106 = OpLoad %float %105
+        %107 = OpCompositeConstruct %v4float %100 %102 %104 %106
+               OpStore %v %107
+        %108 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+        %109 = OpLoad %float %108
+               OpStore %f %109
+        %111 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_0
+        %112 = OpLoad %int %111
+               OpStore %a %112
+               OpBranch %113
+        %113 = OpLabel
+               OpLoopMerge %114 %115 None
+               OpBranch %116
+        %116 = OpLabel
+        %117 = OpLoad %int %x_GLF_global_loop_count
+        %118 = OpSLessThan %bool %117 %int_10
+               OpSelectionMerge %120 None
+               OpBranchConditional %118 %121 %122
+        %121 = OpLabel
+               OpBranch %120
+        %122 = OpLabel
+               OpBranch %114
+        %120 = OpLabel
+        %123 = OpLoad %int %x_GLF_global_loop_count
+        %124 = OpIAdd %int %123 %int_1
+               OpStore %x_GLF_global_loop_count %124
+        %125 = OpLoad %int %a
+        %126 = OpExtInst %int %127 SClamp %125 %int_0 %int_3
+        %128 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+        %129 = OpLoad %float %128
+        %130 = OpAccessChain %_ptr_Function_float %v %126
+        %131 = OpLoad %float %130
+        %132 = OpAccessChain %_ptr_Function_float %v %126
+        %133 = OpFAdd %float %131 %129
+               OpStore %132 %133
+        %134 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_2
+        %135 = OpLoad %int %134
+               OpStore %b %135
+               OpBranch %136
+        %136 = OpLabel
+               OpLoopMerge %137 %138 None
+               OpBranch %139
+        %139 = OpLabel
+        %140 = OpLoad %int %x_GLF_global_loop_count
+        %141 = OpSLessThan %bool %140 %int_10
+               OpSelectionMerge %142 None
+               OpBranchConditional %141 %143 %144
+        %143 = OpLabel
+               OpBranch %142
+        %144 = OpLabel
+               OpBranch %137
+        %142 = OpLabel
+        %145 = OpLoad %int %x_GLF_global_loop_count
+        %146 = OpIAdd %int %145 %int_1
+               OpStore %x_GLF_global_loop_count %146
+        %147 = OpLoad %int %b
+        %148 = OpExtInst %int %127 SClamp %147 %int_0 %int_3
+        %149 = OpAccessChain %_ptr_Function_float %v %148
+        %150 = OpLoad %float %149
+        %151 = OpLoad %int %b
+        %152 = OpLoad %int %a
+        %153 = OpExtInst %int %127 SClamp %151 %int_0 %int_3
+        %154 = OpAccessChain %_ptr_Function_float %m %153 %152
+        %155 = OpLoad %float %154
+        %156 = OpLoad %float %f
+        %157 = OpFMul %float %150 %155
+        %158 = OpFAdd %float %156 %157
+               OpStore %f %158
+               OpBranch %138
+        %138 = OpLabel
+        %159 = OpLoad %int %b
+        %160 = OpISub %int %159 %int_1
+               OpStore %b %160
+               OpBranch %136
+        %137 = OpLabel
+        %161 = OpLoad %int %a
+        %162 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+        %163 = OpLoad %float %162
+        %164 = OpExtInst %int %127 SClamp %161 %int_0 %int_3
+        %165 = OpAccessChain %_ptr_Function_float %m %int_1 %164
+               OpStore %165 %163
+        %166 = OpAccessChain %_ptr_Uniform_int %x_15 %uint_0
+        %167 = OpLoad %int %166
+        %168 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_0
+        %169 = OpLoad %int %168
+        %170 = OpIEqual %bool %167 %169
+               OpSelectionMerge %171 None
+               OpBranchConditional %170 %172 %171
+        %172 = OpLabel
+               OpKill
+        %171 = OpLabel
+        %173 = OpAccessChain %_ptr_Uniform_int %x_15 %uint_0
+        %174 = OpLoad %int %173
+        %175 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_1
+        %176 = OpLoad %int %175
+        %177 = OpIEqual %bool %174 %176
+               OpSelectionMerge %178 None
+               OpBranchConditional %177 %179 %178
+        %179 = OpLabel
+               OpKill
+        %178 = OpLabel
+               OpBranch %115
+        %115 = OpLabel
+        %180 = OpLoad %int %a
+        %181 = OpIAdd %int %180 %int_1
+               OpStore %a %181
+               OpBranch %113
+        %114 = OpLabel
+        %182 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+        %183 = OpLoad %float %182
+               OpStore %zero %183
+        %184 = OpLoad %float %f
+        %186 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_17
+        %187 = OpLoad %float %186
+        %189 = OpFOrdEqual %bool %184 %187
+        %188 = OpLogicalNot %bool %189
+               OpSelectionMerge %190 None
+               OpBranchConditional %188 %191 %190
+        %191 = OpLabel
+        %192 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+        %193 = OpLoad %float %192
+               OpStore %zero %193
+               OpBranch %190
+        %190 = OpLabel
+        %194 = OpLoad %float %f
+        %195 = OpLoad %float %zero
+        %196 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_0
+        %197 = OpLoad %int %196
+        %198 = OpLoad %float %f
+        %199 = OpConvertSToF %float %197
+        %200 = OpCompositeConstruct %v4float %194 %195 %199 %198
+               OpStore %x_GLF_color %200
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %201
+%tint_symbol = OpFunctionParameter %main_out
+        %205 = OpLabel
+        %206 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %206
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %26
+        %208 = OpLabel
+        %209 = OpFunctionCall %void %main_1
+        %211 = OpLoad %v4float %x_GLF_color
+        %212 = OpCompositeConstruct %main_out %211
+        %210 = OpFunctionCall %void %tint_symbol_2 %212
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..40aaeca
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-float-accumulate-matrix/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,144 @@
+type Arr = [[stride(16)]] array<f32, 18>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[block]]
+struct buf2 {
+  one : i32;
+};
+
+var<private> x_GLF_global_loop_count : i32;
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_12 : buf0;
+
+[[group(0), binding(2)]] var<uniform> x_15 : buf2;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m : mat4x4<f32>;
+  var v : vec4<f32>;
+  var f : f32;
+  var a : i32;
+  var b : i32;
+  var zero : f32;
+  x_GLF_global_loop_count = 0;
+  let x_62 : f32 = x_7.x_GLF_uniform_float_values[1];
+  let x_64 : f32 = x_7.x_GLF_uniform_float_values[2];
+  let x_66 : f32 = x_7.x_GLF_uniform_float_values[3];
+  let x_68 : f32 = x_7.x_GLF_uniform_float_values[4];
+  let x_70 : f32 = x_7.x_GLF_uniform_float_values[5];
+  let x_72 : f32 = x_7.x_GLF_uniform_float_values[6];
+  let x_74 : f32 = x_7.x_GLF_uniform_float_values[7];
+  let x_76 : f32 = x_7.x_GLF_uniform_float_values[8];
+  let x_78 : f32 = x_7.x_GLF_uniform_float_values[9];
+  let x_80 : f32 = x_7.x_GLF_uniform_float_values[10];
+  let x_82 : f32 = x_7.x_GLF_uniform_float_values[11];
+  let x_84 : f32 = x_7.x_GLF_uniform_float_values[12];
+  let x_86 : f32 = x_7.x_GLF_uniform_float_values[13];
+  let x_88 : f32 = x_7.x_GLF_uniform_float_values[14];
+  let x_90 : f32 = x_7.x_GLF_uniform_float_values[15];
+  let x_92 : f32 = x_7.x_GLF_uniform_float_values[16];
+  m = mat4x4<f32>(vec4<f32>(x_62, x_64, x_66, x_68), vec4<f32>(x_70, x_72, x_74, x_76), vec4<f32>(x_78, x_80, x_82, x_84), vec4<f32>(x_86, x_88, x_90, x_92));
+  let x_99 : f32 = x_7.x_GLF_uniform_float_values[1];
+  let x_101 : f32 = x_7.x_GLF_uniform_float_values[2];
+  let x_103 : f32 = x_7.x_GLF_uniform_float_values[3];
+  let x_105 : f32 = x_7.x_GLF_uniform_float_values[4];
+  v = vec4<f32>(x_99, x_101, x_103, x_105);
+  let x_108 : f32 = x_7.x_GLF_uniform_float_values[1];
+  f = x_108;
+  let x_110 : i32 = x_12.x_GLF_uniform_int_values[0];
+  a = x_110;
+  loop {
+    let x_115 : i32 = x_GLF_global_loop_count;
+    if ((x_115 < 10)) {
+    } else {
+      break;
+    }
+    let x_118 : i32 = x_GLF_global_loop_count;
+    x_GLF_global_loop_count = (x_118 + 1);
+    let x_120 : i32 = a;
+    let x_121 : i32 = clamp(x_120, 0, 3);
+    let x_123 : f32 = x_7.x_GLF_uniform_float_values[1];
+    let x_125 : f32 = v[x_121];
+    v[x_121] = (x_125 + x_123);
+    let x_129 : i32 = x_12.x_GLF_uniform_int_values[2];
+    b = x_129;
+    loop {
+      let x_134 : i32 = x_GLF_global_loop_count;
+      if ((x_134 < 10)) {
+      } else {
+        break;
+      }
+      let x_137 : i32 = x_GLF_global_loop_count;
+      x_GLF_global_loop_count = (x_137 + 1);
+      let x_139 : i32 = b;
+      let x_142 : f32 = v[clamp(x_139, 0, 3)];
+      let x_143 : i32 = b;
+      let x_145 : i32 = a;
+      let x_147 : f32 = m[clamp(x_143, 0, 3)][x_145];
+      let x_149 : f32 = f;
+      f = (x_149 + (x_142 * x_147));
+
+      continuing {
+        let x_151 : i32 = b;
+        b = (x_151 - 1);
+      }
+    }
+    let x_153 : i32 = a;
+    let x_156 : f32 = x_7.x_GLF_uniform_float_values[1];
+    m[1][clamp(x_153, 0, 3)] = x_156;
+    let x_159 : i32 = x_15.one;
+    let x_161 : i32 = x_12.x_GLF_uniform_int_values[0];
+    if ((x_159 == x_161)) {
+      discard;
+    }
+    let x_166 : i32 = x_15.one;
+    let x_168 : i32 = x_12.x_GLF_uniform_int_values[1];
+    if ((x_166 == x_168)) {
+      discard;
+    }
+
+    continuing {
+      let x_172 : i32 = a;
+      a = (x_172 + 1);
+    }
+  }
+  let x_175 : f32 = x_7.x_GLF_uniform_float_values[0];
+  zero = x_175;
+  let x_176 : f32 = f;
+  let x_178 : f32 = x_7.x_GLF_uniform_float_values[17];
+  if (!((x_176 == x_178))) {
+    let x_183 : f32 = x_7.x_GLF_uniform_float_values[1];
+    zero = x_183;
+  }
+  let x_184 : f32 = f;
+  let x_185 : f32 = zero;
+  let x_187 : i32 = x_12.x_GLF_uniform_int_values[0];
+  let x_189 : f32 = f;
+  x_GLF_color = vec4<f32>(x_184, x_185, f32(x_187), x_189);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-main-function-call/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-main-function-call/0-opt.spvasm
new file mode 100644
index 0000000..ec9e316
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-main-function-call/0-opt.spvasm
@@ -0,0 +1,127 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %func_ "func("
+               OpName %_GLF_global_loop_count "_GLF_global_loop_count"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %a "a"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+         %13 = OpTypeFunction %int
+%_ptr_Private_int = OpTypePointer Private %int
+%_GLF_global_loop_count = OpVariable %_ptr_Private_int Private
+      %int_0 = OpConstant %int 0
+    %int_100 = OpConstant %int 100
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+      %false = OpConstantFalse %bool
+       %true = OpConstantTrue %bool
+%_ptr_Function_int = OpTypePointer Function %int
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %11
+         %30 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+               OpStore %_GLF_global_loop_count %int_0
+               OpBranch %31
+         %31 = OpLabel
+               OpLoopMerge %32 %33 None
+               OpBranch %34
+         %34 = OpLabel
+         %35 = OpLoad %int %_GLF_global_loop_count
+         %36 = OpIAdd %int %35 %int_1
+               OpStore %_GLF_global_loop_count %36
+               OpSelectionMerge %37 None
+               OpBranchConditional %false %38 %37
+         %38 = OpLabel
+               OpReturn
+         %37 = OpLabel
+               OpBranch %33
+         %33 = OpLabel
+         %39 = OpLoad %int %_GLF_global_loop_count
+         %40 = OpSLessThan %bool %39 %int_100
+         %41 = OpLogicalAnd %bool %true %40
+               OpBranchConditional %41 %31 %32
+         %32 = OpLabel
+         %42 = OpFunctionCall %int %func_
+               OpStore %a %42
+         %43 = OpLoad %int %a
+         %44 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %45 = OpLoad %int %44
+         %46 = OpIEqual %bool %43 %45
+               OpSelectionMerge %47 None
+               OpBranchConditional %46 %48 %49
+         %48 = OpLabel
+         %50 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %51 = OpLoad %int %50
+         %52 = OpConvertSToF %float %51
+         %53 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %54 = OpLoad %int %53
+         %55 = OpConvertSToF %float %54
+         %56 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %57 = OpLoad %int %56
+         %58 = OpConvertSToF %float %57
+         %59 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %60 = OpLoad %int %59
+         %61 = OpConvertSToF %float %60
+         %62 = OpCompositeConstruct %v4float %52 %55 %58 %61
+               OpStore %_GLF_color %62
+               OpBranch %47
+         %49 = OpLabel
+         %63 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %64 = OpLoad %int %63
+         %65 = OpConvertSToF %float %64
+         %66 = OpCompositeConstruct %v4float %65 %65 %65 %65
+               OpStore %_GLF_color %66
+               OpBranch %47
+         %47 = OpLabel
+               OpReturn
+               OpFunctionEnd
+      %func_ = OpFunction %int None %13
+         %67 = OpLabel
+               OpBranch %68
+         %68 = OpLabel
+               OpLoopMerge %69 %70 None
+               OpBranch %71
+         %71 = OpLabel
+         %72 = OpLoad %int %_GLF_global_loop_count
+         %73 = OpSLessThan %bool %72 %int_100
+               OpBranchConditional %73 %74 %69
+         %74 = OpLabel
+         %75 = OpLoad %int %_GLF_global_loop_count
+         %76 = OpIAdd %int %75 %int_1
+               OpStore %_GLF_global_loop_count %76
+         %77 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %78 = OpLoad %int %77
+               OpReturnValue %78
+         %70 = OpLabel
+               OpBranch %68
+         %69 = OpLabel
+         %79 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %80 = OpLoad %int %79
+               OpReturnValue %80
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-main-function-call/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-main-function-call/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..d19bc36
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-main-function-call/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,73 @@
+static int x_GLF_global_loop_count = 0;
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+int func_() {
+  while (true) {
+    if ((x_GLF_global_loop_count < 100)) {
+    } else {
+      break;
+    }
+    x_GLF_global_loop_count = (x_GLF_global_loop_count + 1);
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_78 = asint(x_7[scalar_offset / 4][scalar_offset % 4]);
+    return x_78;
+  }
+  const int x_80 = asint(x_7[2].x);
+  return x_80;
+}
+
+void main_1() {
+  int a = 0;
+  x_GLF_global_loop_count = 0;
+  while (true) {
+    x_GLF_global_loop_count = (x_GLF_global_loop_count + 1);
+    if (false) {
+      return;
+    }
+    {
+      bool tint_tmp = true;
+      if (tint_tmp) {
+        tint_tmp = (x_GLF_global_loop_count < 100);
+      }
+      if ((tint_tmp)) {
+      } else {
+        break;
+      }
+    }
+  }
+  const int x_42 = func_();
+  a = x_42;
+  const int x_43 = a;
+  const int x_45 = asint(x_7[2].x);
+  if ((x_43 == x_45)) {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_51 = asint(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const int x_54 = asint(x_7[1].x);
+    const int x_57 = asint(x_7[1].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_60 = asint(x_7[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    x_GLF_color = float4(float(x_51), float(x_54), float(x_57), float(x_60));
+  } else {
+    const int x_64 = asint(x_7[1].x);
+    const float x_65 = float(x_64);
+    x_GLF_color = float4(x_65, x_65, x_65, x_65);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-main-function-call/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-main-function-call/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..e3bf7ba
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-main-function-call/0-opt.spvasm.expected.msl
@@ -0,0 +1,80 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int func_(constant buf0& x_7, thread int* const tint_symbol_4) {
+  while (true) {
+    int const x_72 = *(tint_symbol_4);
+    if ((x_72 < 100)) {
+    } else {
+      break;
+    }
+    int const x_75 = *(tint_symbol_4);
+    *(tint_symbol_4) = (x_75 + 1);
+    int const x_78 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    return x_78;
+  }
+  int const x_80 = x_7.x_GLF_uniform_int_values.arr[2].el;
+  return x_80;
+}
+
+void main_1(constant buf0& x_7, thread int* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int a = 0;
+  *(tint_symbol_5) = 0;
+  while (true) {
+    int const x_35 = *(tint_symbol_5);
+    *(tint_symbol_5) = (x_35 + 1);
+    if (false) {
+      return;
+    }
+    {
+      int const x_39 = *(tint_symbol_5);
+      if ((true && (x_39 < 100))) {
+      } else {
+        break;
+      }
+    }
+  }
+  int const x_42 = func_(x_7, tint_symbol_5);
+  a = x_42;
+  int const x_43 = a;
+  int const x_45 = x_7.x_GLF_uniform_int_values.arr[2].el;
+  if ((x_43 == x_45)) {
+    int const x_51 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_54 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    int const x_57 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    int const x_60 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_6) = float4(float(x_51), float(x_54), float(x_57), float(x_60));
+  } else {
+    int const x_64 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    float const x_65 = float(x_64);
+    *(tint_symbol_6) = float4(x_65, x_65, x_65, x_65);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread int tint_symbol_7 = 0;
+  thread float4 tint_symbol_8 = 0.0f;
+  main_1(x_7, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-main-function-call/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-main-function-call/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..e2beca5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-main-function-call/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,182 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 104
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_global_loop_count "x_GLF_global_loop_count"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_ "func_"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+          %4 = OpConstantNull %int
+%x_GLF_global_loop_count = OpVariable %_ptr_Private_int Private %4
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %15 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %15
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %15
+         %18 = OpTypeFunction %int
+    %int_100 = OpConstant %int 100
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+       %void = OpTypeVoid
+         %43 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+      %false = OpConstantFalse %bool
+       %true = OpConstantTrue %bool
+   %main_out = OpTypeStruct %v4float
+         %92 = OpTypeFunction %void %main_out
+      %func_ = OpFunction %int None %18
+         %20 = OpLabel
+               OpBranch %21
+         %21 = OpLabel
+               OpLoopMerge %22 %23 None
+               OpBranch %24
+         %24 = OpLabel
+         %25 = OpLoad %int %x_GLF_global_loop_count
+         %27 = OpSLessThan %bool %25 %int_100
+               OpSelectionMerge %29 None
+               OpBranchConditional %27 %30 %31
+         %30 = OpLabel
+               OpBranch %29
+         %31 = OpLabel
+               OpBranch %22
+         %29 = OpLabel
+         %32 = OpLoad %int %x_GLF_global_loop_count
+         %34 = OpIAdd %int %32 %int_1
+               OpStore %x_GLF_global_loop_count %34
+         %38 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %39 = OpLoad %int %38
+               OpReturnValue %39
+         %23 = OpLabel
+               OpBranch %21
+         %22 = OpLabel
+         %41 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %42 = OpLoad %int %41
+               OpReturnValue %42
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %43
+         %46 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %4
+               OpStore %x_GLF_global_loop_count %int_0
+               OpBranch %49
+         %49 = OpLabel
+               OpLoopMerge %50 %51 None
+               OpBranch %52
+         %52 = OpLabel
+         %53 = OpLoad %int %x_GLF_global_loop_count
+         %54 = OpIAdd %int %53 %int_1
+               OpStore %x_GLF_global_loop_count %54
+               OpSelectionMerge %56 None
+               OpBranchConditional %false %57 %56
+         %57 = OpLabel
+               OpReturn
+         %56 = OpLabel
+               OpBranch %51
+         %51 = OpLabel
+         %58 = OpLoad %int %x_GLF_global_loop_count
+               OpSelectionMerge %60 None
+               OpBranchConditional %true %61 %60
+         %61 = OpLabel
+         %62 = OpSLessThan %bool %58 %int_100
+               OpBranch %60
+         %60 = OpLabel
+         %63 = OpPhi %bool %true %51 %62 %61
+               OpSelectionMerge %64 None
+               OpBranchConditional %63 %65 %66
+         %65 = OpLabel
+               OpBranch %64
+         %66 = OpLabel
+               OpBranch %50
+         %64 = OpLabel
+               OpBranch %49
+         %50 = OpLabel
+         %67 = OpFunctionCall %int %func_
+               OpStore %a %67
+         %68 = OpLoad %int %a
+         %69 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %70 = OpLoad %int %69
+         %71 = OpIEqual %bool %68 %70
+               OpSelectionMerge %72 None
+               OpBranchConditional %71 %73 %74
+         %73 = OpLabel
+         %75 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %76 = OpLoad %int %75
+         %77 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %78 = OpLoad %int %77
+         %79 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %80 = OpLoad %int %79
+         %81 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %82 = OpLoad %int %81
+         %83 = OpConvertSToF %float %76
+         %84 = OpConvertSToF %float %78
+         %85 = OpConvertSToF %float %80
+         %86 = OpConvertSToF %float %82
+         %87 = OpCompositeConstruct %v4float %83 %84 %85 %86
+               OpStore %x_GLF_color %87
+               OpBranch %72
+         %74 = OpLabel
+         %88 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %89 = OpLoad %int %88
+         %90 = OpConvertSToF %float %89
+         %91 = OpCompositeConstruct %v4float %90 %90 %90 %90
+               OpStore %x_GLF_color %91
+               OpBranch %72
+         %72 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %92
+%tint_symbol = OpFunctionParameter %main_out
+         %96 = OpLabel
+         %97 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %97
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %43
+         %99 = OpLabel
+        %100 = OpFunctionCall %void %main_1
+        %102 = OpLoad %v4float %x_GLF_color
+        %103 = OpCompositeConstruct %main_out %102
+        %101 = OpFunctionCall %void %tint_symbol_2 %103
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 51[%51] is not post dominated by the back-edge block 64[%64]
+  %64 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-main-function-call/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-main-function-call/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..96fb7f7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-main-function-call/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,75 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> x_GLF_global_loop_count : i32;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> i32 {
+  loop {
+    let x_72 : i32 = x_GLF_global_loop_count;
+    if ((x_72 < 100)) {
+    } else {
+      break;
+    }
+    let x_75 : i32 = x_GLF_global_loop_count;
+    x_GLF_global_loop_count = (x_75 + 1);
+    let x_78 : i32 = x_7.x_GLF_uniform_int_values[0];
+    return x_78;
+  }
+  let x_80 : i32 = x_7.x_GLF_uniform_int_values[2];
+  return x_80;
+}
+
+fn main_1() {
+  var a : i32;
+  x_GLF_global_loop_count = 0;
+  loop {
+    let x_35 : i32 = x_GLF_global_loop_count;
+    x_GLF_global_loop_count = (x_35 + 1);
+    if (false) {
+      return;
+    }
+
+    continuing {
+      let x_39 : i32 = x_GLF_global_loop_count;
+      if ((true && (x_39 < 100))) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_42 : i32 = func_();
+  a = x_42;
+  let x_43 : i32 = a;
+  let x_45 : i32 = x_7.x_GLF_uniform_int_values[2];
+  if ((x_43 == x_45)) {
+    let x_51 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_54 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_57 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_60 : i32 = x_7.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_51), f32(x_54), f32(x_57), f32(x_60));
+  } else {
+    let x_64 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_65 : f32 = f32(x_64);
+    x_GLF_color = vec4<f32>(x_65, x_65, x_65, x_65);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-main-function-call/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-main-function-call/0-opt.wgsl
new file mode 100644
index 0000000..96fb7f7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-main-function-call/0-opt.wgsl
@@ -0,0 +1,75 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> x_GLF_global_loop_count : i32;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> i32 {
+  loop {
+    let x_72 : i32 = x_GLF_global_loop_count;
+    if ((x_72 < 100)) {
+    } else {
+      break;
+    }
+    let x_75 : i32 = x_GLF_global_loop_count;
+    x_GLF_global_loop_count = (x_75 + 1);
+    let x_78 : i32 = x_7.x_GLF_uniform_int_values[0];
+    return x_78;
+  }
+  let x_80 : i32 = x_7.x_GLF_uniform_int_values[2];
+  return x_80;
+}
+
+fn main_1() {
+  var a : i32;
+  x_GLF_global_loop_count = 0;
+  loop {
+    let x_35 : i32 = x_GLF_global_loop_count;
+    x_GLF_global_loop_count = (x_35 + 1);
+    if (false) {
+      return;
+    }
+
+    continuing {
+      let x_39 : i32 = x_GLF_global_loop_count;
+      if ((true && (x_39 < 100))) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_42 : i32 = func_();
+  a = x_42;
+  let x_43 : i32 = a;
+  let x_45 : i32 = x_7.x_GLF_uniform_int_values[2];
+  if ((x_43 == x_45)) {
+    let x_51 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_54 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_57 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_60 : i32 = x_7.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_51), f32(x_54), f32(x_57), f32(x_60));
+  } else {
+    let x_64 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_65 : f32 = f32(x_64);
+    x_GLF_color = vec4<f32>(x_65, x_65, x_65, x_65);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-main-function-call/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-main-function-call/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..d19bc36
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-main-function-call/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,73 @@
+static int x_GLF_global_loop_count = 0;
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+int func_() {
+  while (true) {
+    if ((x_GLF_global_loop_count < 100)) {
+    } else {
+      break;
+    }
+    x_GLF_global_loop_count = (x_GLF_global_loop_count + 1);
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_78 = asint(x_7[scalar_offset / 4][scalar_offset % 4]);
+    return x_78;
+  }
+  const int x_80 = asint(x_7[2].x);
+  return x_80;
+}
+
+void main_1() {
+  int a = 0;
+  x_GLF_global_loop_count = 0;
+  while (true) {
+    x_GLF_global_loop_count = (x_GLF_global_loop_count + 1);
+    if (false) {
+      return;
+    }
+    {
+      bool tint_tmp = true;
+      if (tint_tmp) {
+        tint_tmp = (x_GLF_global_loop_count < 100);
+      }
+      if ((tint_tmp)) {
+      } else {
+        break;
+      }
+    }
+  }
+  const int x_42 = func_();
+  a = x_42;
+  const int x_43 = a;
+  const int x_45 = asint(x_7[2].x);
+  if ((x_43 == x_45)) {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_51 = asint(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const int x_54 = asint(x_7[1].x);
+    const int x_57 = asint(x_7[1].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_60 = asint(x_7[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    x_GLF_color = float4(float(x_51), float(x_54), float(x_57), float(x_60));
+  } else {
+    const int x_64 = asint(x_7[1].x);
+    const float x_65 = float(x_64);
+    x_GLF_color = float4(x_65, x_65, x_65, x_65);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-main-function-call/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-main-function-call/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..e3bf7ba
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-main-function-call/0-opt.wgsl.expected.msl
@@ -0,0 +1,80 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int func_(constant buf0& x_7, thread int* const tint_symbol_4) {
+  while (true) {
+    int const x_72 = *(tint_symbol_4);
+    if ((x_72 < 100)) {
+    } else {
+      break;
+    }
+    int const x_75 = *(tint_symbol_4);
+    *(tint_symbol_4) = (x_75 + 1);
+    int const x_78 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    return x_78;
+  }
+  int const x_80 = x_7.x_GLF_uniform_int_values.arr[2].el;
+  return x_80;
+}
+
+void main_1(constant buf0& x_7, thread int* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int a = 0;
+  *(tint_symbol_5) = 0;
+  while (true) {
+    int const x_35 = *(tint_symbol_5);
+    *(tint_symbol_5) = (x_35 + 1);
+    if (false) {
+      return;
+    }
+    {
+      int const x_39 = *(tint_symbol_5);
+      if ((true && (x_39 < 100))) {
+      } else {
+        break;
+      }
+    }
+  }
+  int const x_42 = func_(x_7, tint_symbol_5);
+  a = x_42;
+  int const x_43 = a;
+  int const x_45 = x_7.x_GLF_uniform_int_values.arr[2].el;
+  if ((x_43 == x_45)) {
+    int const x_51 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_54 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    int const x_57 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    int const x_60 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_6) = float4(float(x_51), float(x_54), float(x_57), float(x_60));
+  } else {
+    int const x_64 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    float const x_65 = float(x_64);
+    *(tint_symbol_6) = float4(x_65, x_65, x_65, x_65);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread int tint_symbol_7 = 0;
+  thread float4 tint_symbol_8 = 0.0f;
+  main_1(x_7, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-main-function-call/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-main-function-call/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..e2beca5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-main-function-call/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,182 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 104
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_global_loop_count "x_GLF_global_loop_count"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_ "func_"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+          %4 = OpConstantNull %int
+%x_GLF_global_loop_count = OpVariable %_ptr_Private_int Private %4
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %15 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %15
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %15
+         %18 = OpTypeFunction %int
+    %int_100 = OpConstant %int 100
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+       %void = OpTypeVoid
+         %43 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+      %false = OpConstantFalse %bool
+       %true = OpConstantTrue %bool
+   %main_out = OpTypeStruct %v4float
+         %92 = OpTypeFunction %void %main_out
+      %func_ = OpFunction %int None %18
+         %20 = OpLabel
+               OpBranch %21
+         %21 = OpLabel
+               OpLoopMerge %22 %23 None
+               OpBranch %24
+         %24 = OpLabel
+         %25 = OpLoad %int %x_GLF_global_loop_count
+         %27 = OpSLessThan %bool %25 %int_100
+               OpSelectionMerge %29 None
+               OpBranchConditional %27 %30 %31
+         %30 = OpLabel
+               OpBranch %29
+         %31 = OpLabel
+               OpBranch %22
+         %29 = OpLabel
+         %32 = OpLoad %int %x_GLF_global_loop_count
+         %34 = OpIAdd %int %32 %int_1
+               OpStore %x_GLF_global_loop_count %34
+         %38 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %39 = OpLoad %int %38
+               OpReturnValue %39
+         %23 = OpLabel
+               OpBranch %21
+         %22 = OpLabel
+         %41 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %42 = OpLoad %int %41
+               OpReturnValue %42
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %43
+         %46 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %4
+               OpStore %x_GLF_global_loop_count %int_0
+               OpBranch %49
+         %49 = OpLabel
+               OpLoopMerge %50 %51 None
+               OpBranch %52
+         %52 = OpLabel
+         %53 = OpLoad %int %x_GLF_global_loop_count
+         %54 = OpIAdd %int %53 %int_1
+               OpStore %x_GLF_global_loop_count %54
+               OpSelectionMerge %56 None
+               OpBranchConditional %false %57 %56
+         %57 = OpLabel
+               OpReturn
+         %56 = OpLabel
+               OpBranch %51
+         %51 = OpLabel
+         %58 = OpLoad %int %x_GLF_global_loop_count
+               OpSelectionMerge %60 None
+               OpBranchConditional %true %61 %60
+         %61 = OpLabel
+         %62 = OpSLessThan %bool %58 %int_100
+               OpBranch %60
+         %60 = OpLabel
+         %63 = OpPhi %bool %true %51 %62 %61
+               OpSelectionMerge %64 None
+               OpBranchConditional %63 %65 %66
+         %65 = OpLabel
+               OpBranch %64
+         %66 = OpLabel
+               OpBranch %50
+         %64 = OpLabel
+               OpBranch %49
+         %50 = OpLabel
+         %67 = OpFunctionCall %int %func_
+               OpStore %a %67
+         %68 = OpLoad %int %a
+         %69 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %70 = OpLoad %int %69
+         %71 = OpIEqual %bool %68 %70
+               OpSelectionMerge %72 None
+               OpBranchConditional %71 %73 %74
+         %73 = OpLabel
+         %75 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %76 = OpLoad %int %75
+         %77 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %78 = OpLoad %int %77
+         %79 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %80 = OpLoad %int %79
+         %81 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %82 = OpLoad %int %81
+         %83 = OpConvertSToF %float %76
+         %84 = OpConvertSToF %float %78
+         %85 = OpConvertSToF %float %80
+         %86 = OpConvertSToF %float %82
+         %87 = OpCompositeConstruct %v4float %83 %84 %85 %86
+               OpStore %x_GLF_color %87
+               OpBranch %72
+         %74 = OpLabel
+         %88 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %89 = OpLoad %int %88
+         %90 = OpConvertSToF %float %89
+         %91 = OpCompositeConstruct %v4float %90 %90 %90 %90
+               OpStore %x_GLF_color %91
+               OpBranch %72
+         %72 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %92
+%tint_symbol = OpFunctionParameter %main_out
+         %96 = OpLabel
+         %97 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %97
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %43
+         %99 = OpLabel
+        %100 = OpFunctionCall %void %main_1
+        %102 = OpLoad %v4float %x_GLF_color
+        %103 = OpCompositeConstruct %main_out %102
+        %101 = OpFunctionCall %void %tint_symbol_2 %103
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 51[%51] is not post dominated by the back-edge block 64[%64]
+  %64 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-main-function-call/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-main-function-call/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..96fb7f7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-main-function-call/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,75 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> x_GLF_global_loop_count : i32;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> i32 {
+  loop {
+    let x_72 : i32 = x_GLF_global_loop_count;
+    if ((x_72 < 100)) {
+    } else {
+      break;
+    }
+    let x_75 : i32 = x_GLF_global_loop_count;
+    x_GLF_global_loop_count = (x_75 + 1);
+    let x_78 : i32 = x_7.x_GLF_uniform_int_values[0];
+    return x_78;
+  }
+  let x_80 : i32 = x_7.x_GLF_uniform_int_values[2];
+  return x_80;
+}
+
+fn main_1() {
+  var a : i32;
+  x_GLF_global_loop_count = 0;
+  loop {
+    let x_35 : i32 = x_GLF_global_loop_count;
+    x_GLF_global_loop_count = (x_35 + 1);
+    if (false) {
+      return;
+    }
+
+    continuing {
+      let x_39 : i32 = x_GLF_global_loop_count;
+      if ((true && (x_39 < 100))) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_42 : i32 = func_();
+  a = x_42;
+  let x_43 : i32 = a;
+  let x_45 : i32 = x_7.x_GLF_uniform_int_values[2];
+  if ((x_43 == x_45)) {
+    let x_51 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_54 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_57 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_60 : i32 = x_7.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_51), f32(x_54), f32(x_57), f32(x_60));
+  } else {
+    let x_64 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_65 : f32 = f32(x_64);
+    x_GLF_color = vec4<f32>(x_65, x_65, x_65, x_65);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-multiply-one-minus/0.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-multiply-one-minus/0.spvasm
new file mode 100644
index 0000000..56ca498
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-multiply-one-minus/0.spvasm
@@ -0,0 +1,89 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+    %int_100 = OpConstant %int 100
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %8
+         %21 = OpLabel
+               OpBranch %22
+         %22 = OpLabel
+         %23 = OpPhi %int %int_0 %21 %24 %25
+         %26 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %27 = OpLoad %int %26
+         %28 = OpISub %int %int_100 %27
+         %29 = OpSLessThan %bool %23 %28
+               OpLoopMerge %30 %25 None
+               OpBranchConditional %29 %25 %30
+         %25 = OpLabel
+         %24 = OpIAdd %int %23 %int_1
+               OpBranch %22
+         %30 = OpLabel
+         %31 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %32 = OpLoad %int %31
+         %33 = OpIEqual %bool %32 %int_0
+               OpSelectionMerge %34 None
+               OpBranchConditional %33 %35 %34
+         %35 = OpLabel
+               OpBranch %36
+         %36 = OpLabel
+         %37 = OpPhi %int %int_1 %35 %38 %39
+         %40 = OpPhi %int %23 %35 %41 %39
+         %42 = OpSLessThan %bool %40 %int_100
+               OpLoopMerge %43 %39 None
+               OpBranchConditional %42 %39 %43
+         %39 = OpLabel
+         %41 = OpIAdd %int %40 %int_1
+         %44 = OpISub %int %int_1 %37
+         %38 = OpIMul %int %37 %44
+               OpBranch %36
+         %43 = OpLabel
+               OpBranch %34
+         %34 = OpLabel
+         %45 = OpPhi %int %int_1 %30 %37 %43
+         %46 = OpIEqual %bool %45 %32
+               OpSelectionMerge %47 None
+               OpBranchConditional %46 %48 %49
+         %48 = OpLabel
+         %50 = OpConvertSToF %float %27
+         %51 = OpConvertSToF %float %32
+         %52 = OpCompositeConstruct %v4float %50 %51 %51 %50
+               OpStore %_GLF_color %52
+               OpBranch %47
+         %49 = OpLabel
+         %53 = OpConvertSToF %float %32
+         %54 = OpCompositeConstruct %v4float %53 %53 %53 %53
+               OpStore %_GLF_color %54
+               OpBranch %47
+         %47 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-multiply-one-minus/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-multiply-one-minus/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..6d2b86d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-multiply-one-minus/0.spvasm.expected.hlsl
@@ -0,0 +1,75 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int x_23 = 0;
+  int x_27 = 0;
+  int x_37 = 0;
+  int x_23_phi = 0;
+  int x_45_phi = 0;
+  x_23_phi = 0;
+  while (true) {
+    int x_24 = 0;
+    x_23 = x_23_phi;
+    x_27 = asint(x_5[1].x);
+    if ((x_23 < (100 - asint(x_27)))) {
+    } else {
+      break;
+    }
+    {
+      x_24 = asint((x_23 + asint(1)));
+      x_23_phi = x_24;
+    }
+  }
+  int x_37_phi = 0;
+  int x_40_phi = 0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_32 = asint(x_5[scalar_offset / 4][scalar_offset % 4]);
+  x_45_phi = 1;
+  if ((x_32 == 0)) {
+    x_37_phi = 1;
+    x_40_phi = x_23;
+    while (true) {
+      int x_41 = 0;
+      int x_38 = 0;
+      x_37 = x_37_phi;
+      const int x_40 = x_40_phi;
+      if ((x_40 < 100)) {
+      } else {
+        break;
+      }
+      {
+        x_41 = (x_40 + 1);
+        x_38 = asint((x_37 * asint((1 - asint(x_37)))));
+        x_37_phi = x_38;
+        x_40_phi = x_41;
+      }
+    }
+    x_45_phi = x_37;
+  }
+  if ((x_45_phi == x_32)) {
+    const float x_50 = float(x_27);
+    const float x_51 = float(x_32);
+    x_GLF_color = float4(x_50, x_51, x_51, x_50);
+  } else {
+    const float x_53 = float(x_32);
+    x_GLF_color = float4(x_53, x_53, x_53, x_53);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-multiply-one-minus/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-multiply-one-minus/0.spvasm.expected.msl
new file mode 100644
index 0000000..de0a7fc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-multiply-one-minus/0.spvasm.expected.msl
@@ -0,0 +1,85 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  int x_23 = 0;
+  int x_27 = 0;
+  int x_37 = 0;
+  int x_23_phi = 0;
+  int x_45_phi = 0;
+  x_23_phi = 0;
+  while (true) {
+    int x_24 = 0;
+    x_23 = x_23_phi;
+    x_27 = x_5.x_GLF_uniform_int_values.arr[1].el;
+    if ((x_23 < (100 - as_type<int>(x_27)))) {
+    } else {
+      break;
+    }
+    {
+      x_24 = as_type<int>((x_23 + as_type<int>(1)));
+      x_23_phi = x_24;
+    }
+  }
+  int x_37_phi = 0;
+  int x_40_phi = 0;
+  int const x_32 = x_5.x_GLF_uniform_int_values.arr[0].el;
+  x_45_phi = 1;
+  if ((x_32 == 0)) {
+    x_37_phi = 1;
+    x_40_phi = x_23;
+    while (true) {
+      int x_41 = 0;
+      int x_38 = 0;
+      x_37 = x_37_phi;
+      int const x_40 = x_40_phi;
+      if ((x_40 < 100)) {
+      } else {
+        break;
+      }
+      {
+        x_41 = (x_40 + 1);
+        x_38 = as_type<int>((x_37 * as_type<int>((1 - as_type<int>(x_37)))));
+        x_37_phi = x_38;
+        x_40_phi = x_41;
+      }
+    }
+    x_45_phi = x_37;
+  }
+  int const x_45 = x_45_phi;
+  if ((x_45 == x_32)) {
+    float const x_50 = float(x_27);
+    float const x_51 = float(x_32);
+    *(tint_symbol_4) = float4(x_50, x_51, x_51, x_50);
+  } else {
+    float const x_53 = float(x_32);
+    *(tint_symbol_4) = float4(x_53, x_53, x_53, x_53);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-multiply-one-minus/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-multiply-one-minus/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..5db6580
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-multiply-one-minus/0.spvasm.expected.spvasm
@@ -0,0 +1,192 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 107
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_23 "x_23"
+               OpName %x_27 "x_27"
+               OpName %x_37 "x_37"
+               OpName %x_23_phi "x_23_phi"
+               OpName %x_45_phi "x_45_phi"
+               OpName %x_24 "x_24"
+               OpName %x_37_phi "x_37_phi"
+               OpName %x_40_phi "x_40_phi"
+               OpName %x_41 "x_41"
+               OpName %x_38 "x_38"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+    %int_100 = OpConstant %int 100
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %v4float
+         %95 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+       %x_23 = OpVariable %_ptr_Function_int Function %21
+       %x_27 = OpVariable %_ptr_Function_int Function %21
+       %x_37 = OpVariable %_ptr_Function_int Function %21
+   %x_23_phi = OpVariable %_ptr_Function_int Function %21
+   %x_45_phi = OpVariable %_ptr_Function_int Function %21
+       %x_24 = OpVariable %_ptr_Function_int Function %21
+   %x_37_phi = OpVariable %_ptr_Function_int Function %21
+   %x_40_phi = OpVariable %_ptr_Function_int Function %21
+       %x_41 = OpVariable %_ptr_Function_int Function %21
+       %x_38 = OpVariable %_ptr_Function_int Function %21
+               OpStore %x_23_phi %int_0
+               OpBranch %27
+         %27 = OpLabel
+               OpLoopMerge %28 %29 None
+               OpBranch %30
+         %30 = OpLabel
+         %32 = OpLoad %int %x_23_phi
+               OpStore %x_23 %32
+         %36 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %37 = OpLoad %int %36
+               OpStore %x_27 %37
+         %38 = OpLoad %int %x_23
+         %41 = OpLoad %int %x_27
+         %40 = OpCopyObject %int %41
+         %42 = OpISub %int %int_100 %40
+         %43 = OpSLessThan %bool %38 %42
+               OpSelectionMerge %45 None
+               OpBranchConditional %43 %46 %47
+         %46 = OpLabel
+               OpBranch %45
+         %47 = OpLabel
+               OpBranch %28
+         %45 = OpLabel
+               OpBranch %29
+         %29 = OpLabel
+         %49 = OpLoad %int %x_23
+         %50 = OpCopyObject %int %int_1
+         %51 = OpIAdd %int %49 %50
+         %48 = OpCopyObject %int %51
+               OpStore %x_24 %48
+         %52 = OpLoad %int %x_24
+               OpStore %x_23_phi %52
+               OpBranch %27
+         %28 = OpLabel
+         %55 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %56 = OpLoad %int %55
+               OpStore %x_45_phi %int_1
+         %57 = OpIEqual %bool %56 %int_0
+               OpSelectionMerge %58 None
+               OpBranchConditional %57 %59 %58
+         %59 = OpLabel
+               OpStore %x_37_phi %int_1
+         %60 = OpLoad %int %x_23
+               OpStore %x_40_phi %60
+               OpBranch %61
+         %61 = OpLabel
+               OpLoopMerge %62 %63 None
+               OpBranch %64
+         %64 = OpLabel
+         %67 = OpLoad %int %x_37_phi
+               OpStore %x_37 %67
+         %68 = OpLoad %int %x_40_phi
+         %69 = OpSLessThan %bool %68 %int_100
+               OpSelectionMerge %70 None
+               OpBranchConditional %69 %71 %72
+         %71 = OpLabel
+               OpBranch %70
+         %72 = OpLabel
+               OpBranch %62
+         %70 = OpLabel
+               OpBranch %63
+         %63 = OpLabel
+         %73 = OpIAdd %int %68 %int_1
+               OpStore %x_41 %73
+         %75 = OpLoad %int %x_37
+         %78 = OpLoad %int %x_37
+         %77 = OpCopyObject %int %78
+         %79 = OpISub %int %int_1 %77
+         %76 = OpCopyObject %int %79
+         %80 = OpIMul %int %75 %76
+         %74 = OpCopyObject %int %80
+               OpStore %x_38 %74
+         %81 = OpLoad %int %x_38
+               OpStore %x_37_phi %81
+         %82 = OpLoad %int %x_41
+               OpStore %x_40_phi %82
+               OpBranch %61
+         %62 = OpLabel
+         %83 = OpLoad %int %x_37
+               OpStore %x_45_phi %83
+               OpBranch %58
+         %58 = OpLabel
+         %84 = OpLoad %int %x_45_phi
+         %85 = OpIEqual %bool %84 %56
+               OpSelectionMerge %86 None
+               OpBranchConditional %85 %87 %88
+         %87 = OpLabel
+         %90 = OpLoad %int %x_27
+         %89 = OpConvertSToF %float %90
+         %91 = OpConvertSToF %float %56
+         %92 = OpCompositeConstruct %v4float %89 %91 %91 %89
+               OpStore %x_GLF_color %92
+               OpBranch %86
+         %88 = OpLabel
+         %93 = OpConvertSToF %float %56
+         %94 = OpCompositeConstruct %v4float %93 %93 %93 %93
+               OpStore %x_GLF_color %94
+               OpBranch %86
+         %86 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %95
+%tint_symbol = OpFunctionParameter %main_out
+         %99 = OpLabel
+        %100 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %100
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %102 = OpLabel
+        %103 = OpFunctionCall %void %main_1
+        %105 = OpLoad %v4float %x_GLF_color
+        %106 = OpCompositeConstruct %main_out %105
+        %104 = OpFunctionCall %void %tint_symbol_2 %106
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-multiply-one-minus/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-multiply-one-minus/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..038864a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-multiply-one-minus/0.spvasm.expected.wgsl
@@ -0,0 +1,80 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_23 : i32;
+  var x_27 : i32;
+  var x_37 : i32;
+  var x_23_phi : i32;
+  var x_45_phi : i32;
+  x_23_phi = 0;
+  loop {
+    var x_24 : i32;
+    x_23 = x_23_phi;
+    x_27 = x_5.x_GLF_uniform_int_values[1];
+    if ((x_23 < (100 - bitcast<i32>(x_27)))) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_24 = bitcast<i32>((x_23 + bitcast<i32>(1)));
+      x_23_phi = x_24;
+    }
+  }
+  var x_37_phi : i32;
+  var x_40_phi : i32;
+  let x_32 : i32 = x_5.x_GLF_uniform_int_values[0];
+  x_45_phi = 1;
+  if ((x_32 == 0)) {
+    x_37_phi = 1;
+    x_40_phi = x_23;
+    loop {
+      var x_41 : i32;
+      var x_38 : i32;
+      x_37 = x_37_phi;
+      let x_40 : i32 = x_40_phi;
+      if ((x_40 < 100)) {
+      } else {
+        break;
+      }
+
+      continuing {
+        x_41 = (x_40 + 1);
+        x_38 = bitcast<i32>((x_37 * bitcast<i32>((1 - bitcast<i32>(x_37)))));
+        x_37_phi = x_38;
+        x_40_phi = x_41;
+      }
+    }
+    x_45_phi = x_37;
+  }
+  let x_45 : i32 = x_45_phi;
+  if ((x_45 == x_32)) {
+    let x_50 : f32 = f32(x_27);
+    let x_51 : f32 = f32(x_32);
+    x_GLF_color = vec4<f32>(x_50, x_51, x_51, x_50);
+  } else {
+    let x_53 : f32 = f32(x_32);
+    x_GLF_color = vec4<f32>(x_53, x_53, x_53, x_53);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-multiply-one-minus/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-multiply-one-minus/0.wgsl
new file mode 100644
index 0000000..038864a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-multiply-one-minus/0.wgsl
@@ -0,0 +1,80 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_23 : i32;
+  var x_27 : i32;
+  var x_37 : i32;
+  var x_23_phi : i32;
+  var x_45_phi : i32;
+  x_23_phi = 0;
+  loop {
+    var x_24 : i32;
+    x_23 = x_23_phi;
+    x_27 = x_5.x_GLF_uniform_int_values[1];
+    if ((x_23 < (100 - bitcast<i32>(x_27)))) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_24 = bitcast<i32>((x_23 + bitcast<i32>(1)));
+      x_23_phi = x_24;
+    }
+  }
+  var x_37_phi : i32;
+  var x_40_phi : i32;
+  let x_32 : i32 = x_5.x_GLF_uniform_int_values[0];
+  x_45_phi = 1;
+  if ((x_32 == 0)) {
+    x_37_phi = 1;
+    x_40_phi = x_23;
+    loop {
+      var x_41 : i32;
+      var x_38 : i32;
+      x_37 = x_37_phi;
+      let x_40 : i32 = x_40_phi;
+      if ((x_40 < 100)) {
+      } else {
+        break;
+      }
+
+      continuing {
+        x_41 = (x_40 + 1);
+        x_38 = bitcast<i32>((x_37 * bitcast<i32>((1 - bitcast<i32>(x_37)))));
+        x_37_phi = x_38;
+        x_40_phi = x_41;
+      }
+    }
+    x_45_phi = x_37;
+  }
+  let x_45 : i32 = x_45_phi;
+  if ((x_45 == x_32)) {
+    let x_50 : f32 = f32(x_27);
+    let x_51 : f32 = f32(x_32);
+    x_GLF_color = vec4<f32>(x_50, x_51, x_51, x_50);
+  } else {
+    let x_53 : f32 = f32(x_32);
+    x_GLF_color = vec4<f32>(x_53, x_53, x_53, x_53);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-multiply-one-minus/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-multiply-one-minus/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..6d2b86d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-multiply-one-minus/0.wgsl.expected.hlsl
@@ -0,0 +1,75 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int x_23 = 0;
+  int x_27 = 0;
+  int x_37 = 0;
+  int x_23_phi = 0;
+  int x_45_phi = 0;
+  x_23_phi = 0;
+  while (true) {
+    int x_24 = 0;
+    x_23 = x_23_phi;
+    x_27 = asint(x_5[1].x);
+    if ((x_23 < (100 - asint(x_27)))) {
+    } else {
+      break;
+    }
+    {
+      x_24 = asint((x_23 + asint(1)));
+      x_23_phi = x_24;
+    }
+  }
+  int x_37_phi = 0;
+  int x_40_phi = 0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_32 = asint(x_5[scalar_offset / 4][scalar_offset % 4]);
+  x_45_phi = 1;
+  if ((x_32 == 0)) {
+    x_37_phi = 1;
+    x_40_phi = x_23;
+    while (true) {
+      int x_41 = 0;
+      int x_38 = 0;
+      x_37 = x_37_phi;
+      const int x_40 = x_40_phi;
+      if ((x_40 < 100)) {
+      } else {
+        break;
+      }
+      {
+        x_41 = (x_40 + 1);
+        x_38 = asint((x_37 * asint((1 - asint(x_37)))));
+        x_37_phi = x_38;
+        x_40_phi = x_41;
+      }
+    }
+    x_45_phi = x_37;
+  }
+  if ((x_45_phi == x_32)) {
+    const float x_50 = float(x_27);
+    const float x_51 = float(x_32);
+    x_GLF_color = float4(x_50, x_51, x_51, x_50);
+  } else {
+    const float x_53 = float(x_32);
+    x_GLF_color = float4(x_53, x_53, x_53, x_53);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-multiply-one-minus/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-multiply-one-minus/0.wgsl.expected.msl
new file mode 100644
index 0000000..de0a7fc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-multiply-one-minus/0.wgsl.expected.msl
@@ -0,0 +1,85 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  int x_23 = 0;
+  int x_27 = 0;
+  int x_37 = 0;
+  int x_23_phi = 0;
+  int x_45_phi = 0;
+  x_23_phi = 0;
+  while (true) {
+    int x_24 = 0;
+    x_23 = x_23_phi;
+    x_27 = x_5.x_GLF_uniform_int_values.arr[1].el;
+    if ((x_23 < (100 - as_type<int>(x_27)))) {
+    } else {
+      break;
+    }
+    {
+      x_24 = as_type<int>((x_23 + as_type<int>(1)));
+      x_23_phi = x_24;
+    }
+  }
+  int x_37_phi = 0;
+  int x_40_phi = 0;
+  int const x_32 = x_5.x_GLF_uniform_int_values.arr[0].el;
+  x_45_phi = 1;
+  if ((x_32 == 0)) {
+    x_37_phi = 1;
+    x_40_phi = x_23;
+    while (true) {
+      int x_41 = 0;
+      int x_38 = 0;
+      x_37 = x_37_phi;
+      int const x_40 = x_40_phi;
+      if ((x_40 < 100)) {
+      } else {
+        break;
+      }
+      {
+        x_41 = (x_40 + 1);
+        x_38 = as_type<int>((x_37 * as_type<int>((1 - as_type<int>(x_37)))));
+        x_37_phi = x_38;
+        x_40_phi = x_41;
+      }
+    }
+    x_45_phi = x_37;
+  }
+  int const x_45 = x_45_phi;
+  if ((x_45 == x_32)) {
+    float const x_50 = float(x_27);
+    float const x_51 = float(x_32);
+    *(tint_symbol_4) = float4(x_50, x_51, x_51, x_50);
+  } else {
+    float const x_53 = float(x_32);
+    *(tint_symbol_4) = float4(x_53, x_53, x_53, x_53);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-multiply-one-minus/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-multiply-one-minus/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..5db6580
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-multiply-one-minus/0.wgsl.expected.spvasm
@@ -0,0 +1,192 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 107
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_23 "x_23"
+               OpName %x_27 "x_27"
+               OpName %x_37 "x_37"
+               OpName %x_23_phi "x_23_phi"
+               OpName %x_45_phi "x_45_phi"
+               OpName %x_24 "x_24"
+               OpName %x_37_phi "x_37_phi"
+               OpName %x_40_phi "x_40_phi"
+               OpName %x_41 "x_41"
+               OpName %x_38 "x_38"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+    %int_100 = OpConstant %int 100
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %v4float
+         %95 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+       %x_23 = OpVariable %_ptr_Function_int Function %21
+       %x_27 = OpVariable %_ptr_Function_int Function %21
+       %x_37 = OpVariable %_ptr_Function_int Function %21
+   %x_23_phi = OpVariable %_ptr_Function_int Function %21
+   %x_45_phi = OpVariable %_ptr_Function_int Function %21
+       %x_24 = OpVariable %_ptr_Function_int Function %21
+   %x_37_phi = OpVariable %_ptr_Function_int Function %21
+   %x_40_phi = OpVariable %_ptr_Function_int Function %21
+       %x_41 = OpVariable %_ptr_Function_int Function %21
+       %x_38 = OpVariable %_ptr_Function_int Function %21
+               OpStore %x_23_phi %int_0
+               OpBranch %27
+         %27 = OpLabel
+               OpLoopMerge %28 %29 None
+               OpBranch %30
+         %30 = OpLabel
+         %32 = OpLoad %int %x_23_phi
+               OpStore %x_23 %32
+         %36 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %37 = OpLoad %int %36
+               OpStore %x_27 %37
+         %38 = OpLoad %int %x_23
+         %41 = OpLoad %int %x_27
+         %40 = OpCopyObject %int %41
+         %42 = OpISub %int %int_100 %40
+         %43 = OpSLessThan %bool %38 %42
+               OpSelectionMerge %45 None
+               OpBranchConditional %43 %46 %47
+         %46 = OpLabel
+               OpBranch %45
+         %47 = OpLabel
+               OpBranch %28
+         %45 = OpLabel
+               OpBranch %29
+         %29 = OpLabel
+         %49 = OpLoad %int %x_23
+         %50 = OpCopyObject %int %int_1
+         %51 = OpIAdd %int %49 %50
+         %48 = OpCopyObject %int %51
+               OpStore %x_24 %48
+         %52 = OpLoad %int %x_24
+               OpStore %x_23_phi %52
+               OpBranch %27
+         %28 = OpLabel
+         %55 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %56 = OpLoad %int %55
+               OpStore %x_45_phi %int_1
+         %57 = OpIEqual %bool %56 %int_0
+               OpSelectionMerge %58 None
+               OpBranchConditional %57 %59 %58
+         %59 = OpLabel
+               OpStore %x_37_phi %int_1
+         %60 = OpLoad %int %x_23
+               OpStore %x_40_phi %60
+               OpBranch %61
+         %61 = OpLabel
+               OpLoopMerge %62 %63 None
+               OpBranch %64
+         %64 = OpLabel
+         %67 = OpLoad %int %x_37_phi
+               OpStore %x_37 %67
+         %68 = OpLoad %int %x_40_phi
+         %69 = OpSLessThan %bool %68 %int_100
+               OpSelectionMerge %70 None
+               OpBranchConditional %69 %71 %72
+         %71 = OpLabel
+               OpBranch %70
+         %72 = OpLabel
+               OpBranch %62
+         %70 = OpLabel
+               OpBranch %63
+         %63 = OpLabel
+         %73 = OpIAdd %int %68 %int_1
+               OpStore %x_41 %73
+         %75 = OpLoad %int %x_37
+         %78 = OpLoad %int %x_37
+         %77 = OpCopyObject %int %78
+         %79 = OpISub %int %int_1 %77
+         %76 = OpCopyObject %int %79
+         %80 = OpIMul %int %75 %76
+         %74 = OpCopyObject %int %80
+               OpStore %x_38 %74
+         %81 = OpLoad %int %x_38
+               OpStore %x_37_phi %81
+         %82 = OpLoad %int %x_41
+               OpStore %x_40_phi %82
+               OpBranch %61
+         %62 = OpLabel
+         %83 = OpLoad %int %x_37
+               OpStore %x_45_phi %83
+               OpBranch %58
+         %58 = OpLabel
+         %84 = OpLoad %int %x_45_phi
+         %85 = OpIEqual %bool %84 %56
+               OpSelectionMerge %86 None
+               OpBranchConditional %85 %87 %88
+         %87 = OpLabel
+         %90 = OpLoad %int %x_27
+         %89 = OpConvertSToF %float %90
+         %91 = OpConvertSToF %float %56
+         %92 = OpCompositeConstruct %v4float %89 %91 %91 %89
+               OpStore %x_GLF_color %92
+               OpBranch %86
+         %88 = OpLabel
+         %93 = OpConvertSToF %float %56
+         %94 = OpCompositeConstruct %v4float %93 %93 %93 %93
+               OpStore %x_GLF_color %94
+               OpBranch %86
+         %86 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %95
+%tint_symbol = OpFunctionParameter %main_out
+         %99 = OpLabel
+        %100 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %100
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %102 = OpLabel
+        %103 = OpFunctionCall %void %main_1
+        %105 = OpLoad %v4float %x_GLF_color
+        %106 = OpCompositeConstruct %main_out %105
+        %104 = OpFunctionCall %void %tint_symbol_2 %106
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-multiply-one-minus/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-multiply-one-minus/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..038864a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-multiply-one-minus/0.wgsl.expected.wgsl
@@ -0,0 +1,80 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_23 : i32;
+  var x_27 : i32;
+  var x_37 : i32;
+  var x_23_phi : i32;
+  var x_45_phi : i32;
+  x_23_phi = 0;
+  loop {
+    var x_24 : i32;
+    x_23 = x_23_phi;
+    x_27 = x_5.x_GLF_uniform_int_values[1];
+    if ((x_23 < (100 - bitcast<i32>(x_27)))) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_24 = bitcast<i32>((x_23 + bitcast<i32>(1)));
+      x_23_phi = x_24;
+    }
+  }
+  var x_37_phi : i32;
+  var x_40_phi : i32;
+  let x_32 : i32 = x_5.x_GLF_uniform_int_values[0];
+  x_45_phi = 1;
+  if ((x_32 == 0)) {
+    x_37_phi = 1;
+    x_40_phi = x_23;
+    loop {
+      var x_41 : i32;
+      var x_38 : i32;
+      x_37 = x_37_phi;
+      let x_40 : i32 = x_40_phi;
+      if ((x_40 < 100)) {
+      } else {
+        break;
+      }
+
+      continuing {
+        x_41 = (x_40 + 1);
+        x_38 = bitcast<i32>((x_37 * bitcast<i32>((1 - bitcast<i32>(x_37)))));
+        x_37_phi = x_38;
+        x_40_phi = x_41;
+      }
+    }
+    x_45_phi = x_37;
+  }
+  let x_45 : i32 = x_45_phi;
+  if ((x_45 == x_32)) {
+    let x_50 : f32 = f32(x_27);
+    let x_51 : f32 = f32(x_32);
+    x_GLF_color = vec4<f32>(x_50, x_51, x_51, x_50);
+  } else {
+    let x_53 : f32 = f32(x_32);
+    x_GLF_color = vec4<f32>(x_53, x_53, x_53, x_53);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-squared-comparison/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-squared-comparison/0-opt.spvasm
new file mode 100644
index 0000000..e13f402
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-squared-comparison/0-opt.spvasm
@@ -0,0 +1,98 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %_GLF_global_loop_count "_GLF_global_loop_count"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+%_GLF_global_loop_count = OpVariable %_ptr_Private_int Private
+      %int_0 = OpConstant %int 0
+    %int_100 = OpConstant %int 100
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+     %int_10 = OpConstant %int 10
+      %int_4 = OpConstant %int 4
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %main = OpFunction %void None %9
+         %25 = OpLabel
+               OpStore %_GLF_global_loop_count %int_0
+               OpBranch %26
+         %26 = OpLabel
+               OpLoopMerge %27 %28 None
+               OpBranch %29
+         %29 = OpLabel
+         %30 = OpLoad %int %_GLF_global_loop_count
+         %31 = OpSLessThan %bool %30 %int_100
+               OpBranchConditional %31 %32 %27
+         %32 = OpLabel
+         %33 = OpLoad %int %_GLF_global_loop_count
+         %34 = OpIAdd %int %33 %int_1
+               OpStore %_GLF_global_loop_count %34
+         %35 = OpLoad %int %_GLF_global_loop_count
+         %36 = OpLoad %int %_GLF_global_loop_count
+         %37 = OpIMul %int %35 %36
+         %38 = OpSGreaterThan %bool %37 %int_10
+               OpSelectionMerge %39 None
+               OpBranchConditional %38 %40 %39
+         %40 = OpLabel
+               OpBranch %27
+         %39 = OpLabel
+               OpBranch %28
+         %28 = OpLabel
+               OpBranch %26
+         %27 = OpLabel
+         %41 = OpLoad %int %_GLF_global_loop_count
+         %42 = OpIEqual %bool %41 %int_4
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %45
+         %44 = OpLabel
+         %46 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %47 = OpLoad %int %46
+         %48 = OpConvertSToF %float %47
+         %49 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %50 = OpLoad %int %49
+         %51 = OpConvertSToF %float %50
+         %52 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %53 = OpLoad %int %52
+         %54 = OpConvertSToF %float %53
+         %55 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %56 = OpLoad %int %55
+         %57 = OpConvertSToF %float %56
+         %58 = OpCompositeConstruct %v4float %48 %51 %54 %57
+               OpStore %_GLF_color %58
+               OpBranch %43
+         %45 = OpLabel
+         %59 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %60 = OpLoad %int %59
+         %61 = OpConvertSToF %float %60
+         %62 = OpCompositeConstruct %v4float %61 %61 %61 %61
+               OpStore %_GLF_color %62
+               OpBranch %43
+         %43 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-squared-comparison/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-squared-comparison/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..b176ae5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-squared-comparison/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,47 @@
+static int x_GLF_global_loop_count = 0;
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+
+void main_1() {
+  x_GLF_global_loop_count = 0;
+  while (true) {
+    if ((x_GLF_global_loop_count < 100)) {
+    } else {
+      break;
+    }
+    x_GLF_global_loop_count = (x_GLF_global_loop_count + 1);
+    if (((x_GLF_global_loop_count * x_GLF_global_loop_count) > 10)) {
+      break;
+    }
+  }
+  if ((x_GLF_global_loop_count == 4)) {
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_47 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+    const int x_50 = asint(x_6[1].x);
+    const int x_53 = asint(x_6[1].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_56 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    x_GLF_color = float4(float(x_47), float(x_50), float(x_53), float(x_56));
+  } else {
+    const int x_60 = asint(x_6[1].x);
+    const float x_61 = float(x_60);
+    x_GLF_color = float4(x_61, x_61, x_61, x_61);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-squared-comparison/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-squared-comparison/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..a7c34d0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-squared-comparison/0-opt.spvasm.expected.msl
@@ -0,0 +1,60 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread int* const tint_symbol_4, thread float4* const tint_symbol_5) {
+  *(tint_symbol_4) = 0;
+  while (true) {
+    int const x_30 = *(tint_symbol_4);
+    if ((x_30 < 100)) {
+    } else {
+      break;
+    }
+    int const x_33 = *(tint_symbol_4);
+    *(tint_symbol_4) = (x_33 + 1);
+    int const x_35 = *(tint_symbol_4);
+    int const x_36 = *(tint_symbol_4);
+    if (((x_35 * x_36) > 10)) {
+      break;
+    }
+  }
+  int const x_41 = *(tint_symbol_4);
+  if ((x_41 == 4)) {
+    int const x_47 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_50 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_53 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_56 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_5) = float4(float(x_47), float(x_50), float(x_53), float(x_56));
+  } else {
+    int const x_60 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    float const x_61 = float(x_60);
+    *(tint_symbol_5) = float4(x_61, x_61, x_61, x_61);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread int tint_symbol_6 = 0;
+  thread float4 tint_symbol_7 = 0.0f;
+  main_1(x_6, &(tint_symbol_6), &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-squared-comparison/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-squared-comparison/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..6b93297
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-squared-comparison/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,136 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 81
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_global_loop_count "x_GLF_global_loop_count"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+          %4 = OpConstantNull %int
+%x_GLF_global_loop_count = OpVariable %_ptr_Private_int Private %4
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+      %int_0 = OpConstant %int 0
+    %int_100 = OpConstant %int 100
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+     %int_10 = OpConstant %int 10
+      %int_4 = OpConstant %int 4
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+         %69 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %18
+         %21 = OpLabel
+               OpStore %x_GLF_global_loop_count %int_0
+               OpBranch %23
+         %23 = OpLabel
+               OpLoopMerge %24 %25 None
+               OpBranch %26
+         %26 = OpLabel
+         %27 = OpLoad %int %x_GLF_global_loop_count
+         %29 = OpSLessThan %bool %27 %int_100
+               OpSelectionMerge %31 None
+               OpBranchConditional %29 %32 %33
+         %32 = OpLabel
+               OpBranch %31
+         %33 = OpLabel
+               OpBranch %24
+         %31 = OpLabel
+         %34 = OpLoad %int %x_GLF_global_loop_count
+         %36 = OpIAdd %int %34 %int_1
+               OpStore %x_GLF_global_loop_count %36
+         %37 = OpLoad %int %x_GLF_global_loop_count
+         %38 = OpLoad %int %x_GLF_global_loop_count
+         %39 = OpIMul %int %37 %38
+         %41 = OpSGreaterThan %bool %39 %int_10
+               OpSelectionMerge %42 None
+               OpBranchConditional %41 %43 %42
+         %43 = OpLabel
+               OpBranch %24
+         %42 = OpLabel
+               OpBranch %25
+         %25 = OpLabel
+               OpBranch %23
+         %24 = OpLabel
+         %44 = OpLoad %int %x_GLF_global_loop_count
+         %46 = OpIEqual %bool %44 %int_4
+               OpSelectionMerge %47 None
+               OpBranchConditional %46 %48 %49
+         %48 = OpLabel
+         %52 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %53 = OpLoad %int %52
+         %54 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %55 = OpLoad %int %54
+         %56 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %57 = OpLoad %int %56
+         %58 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %59 = OpLoad %int %58
+         %60 = OpConvertSToF %float %53
+         %61 = OpConvertSToF %float %55
+         %62 = OpConvertSToF %float %57
+         %63 = OpConvertSToF %float %59
+         %64 = OpCompositeConstruct %v4float %60 %61 %62 %63
+               OpStore %x_GLF_color %64
+               OpBranch %47
+         %49 = OpLabel
+         %65 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %66 = OpLoad %int %65
+         %67 = OpConvertSToF %float %66
+         %68 = OpCompositeConstruct %v4float %67 %67 %67 %67
+               OpStore %x_GLF_color %68
+               OpBranch %47
+         %47 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %69
+%tint_symbol = OpFunctionParameter %main_out
+         %73 = OpLabel
+         %74 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %74
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %18
+         %76 = OpLabel
+         %77 = OpFunctionCall %void %main_1
+         %79 = OpLoad %v4float %x_GLF_color
+         %80 = OpCompositeConstruct %main_out %79
+         %78 = OpFunctionCall %void %tint_symbol_2 %80
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-squared-comparison/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-squared-comparison/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..27cfa37
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-squared-comparison/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,54 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> x_GLF_global_loop_count : i32;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+fn main_1() {
+  x_GLF_global_loop_count = 0;
+  loop {
+    let x_30 : i32 = x_GLF_global_loop_count;
+    if ((x_30 < 100)) {
+    } else {
+      break;
+    }
+    let x_33 : i32 = x_GLF_global_loop_count;
+    x_GLF_global_loop_count = (x_33 + 1);
+    let x_35 : i32 = x_GLF_global_loop_count;
+    let x_36 : i32 = x_GLF_global_loop_count;
+    if (((x_35 * x_36) > 10)) {
+      break;
+    }
+  }
+  let x_41 : i32 = x_GLF_global_loop_count;
+  if ((x_41 == 4)) {
+    let x_47 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_50 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_53 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_56 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_47), f32(x_50), f32(x_53), f32(x_56));
+  } else {
+    let x_60 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_61 : f32 = f32(x_60);
+    x_GLF_color = vec4<f32>(x_61, x_61, x_61, x_61);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-squared-comparison/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-squared-comparison/0-opt.wgsl
new file mode 100644
index 0000000..27cfa37
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-squared-comparison/0-opt.wgsl
@@ -0,0 +1,54 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> x_GLF_global_loop_count : i32;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+fn main_1() {
+  x_GLF_global_loop_count = 0;
+  loop {
+    let x_30 : i32 = x_GLF_global_loop_count;
+    if ((x_30 < 100)) {
+    } else {
+      break;
+    }
+    let x_33 : i32 = x_GLF_global_loop_count;
+    x_GLF_global_loop_count = (x_33 + 1);
+    let x_35 : i32 = x_GLF_global_loop_count;
+    let x_36 : i32 = x_GLF_global_loop_count;
+    if (((x_35 * x_36) > 10)) {
+      break;
+    }
+  }
+  let x_41 : i32 = x_GLF_global_loop_count;
+  if ((x_41 == 4)) {
+    let x_47 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_50 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_53 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_56 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_47), f32(x_50), f32(x_53), f32(x_56));
+  } else {
+    let x_60 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_61 : f32 = f32(x_60);
+    x_GLF_color = vec4<f32>(x_61, x_61, x_61, x_61);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-squared-comparison/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-squared-comparison/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..b176ae5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-squared-comparison/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,47 @@
+static int x_GLF_global_loop_count = 0;
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+
+void main_1() {
+  x_GLF_global_loop_count = 0;
+  while (true) {
+    if ((x_GLF_global_loop_count < 100)) {
+    } else {
+      break;
+    }
+    x_GLF_global_loop_count = (x_GLF_global_loop_count + 1);
+    if (((x_GLF_global_loop_count * x_GLF_global_loop_count) > 10)) {
+      break;
+    }
+  }
+  if ((x_GLF_global_loop_count == 4)) {
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_47 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+    const int x_50 = asint(x_6[1].x);
+    const int x_53 = asint(x_6[1].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_56 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    x_GLF_color = float4(float(x_47), float(x_50), float(x_53), float(x_56));
+  } else {
+    const int x_60 = asint(x_6[1].x);
+    const float x_61 = float(x_60);
+    x_GLF_color = float4(x_61, x_61, x_61, x_61);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-squared-comparison/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-squared-comparison/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..a7c34d0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-squared-comparison/0-opt.wgsl.expected.msl
@@ -0,0 +1,60 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread int* const tint_symbol_4, thread float4* const tint_symbol_5) {
+  *(tint_symbol_4) = 0;
+  while (true) {
+    int const x_30 = *(tint_symbol_4);
+    if ((x_30 < 100)) {
+    } else {
+      break;
+    }
+    int const x_33 = *(tint_symbol_4);
+    *(tint_symbol_4) = (x_33 + 1);
+    int const x_35 = *(tint_symbol_4);
+    int const x_36 = *(tint_symbol_4);
+    if (((x_35 * x_36) > 10)) {
+      break;
+    }
+  }
+  int const x_41 = *(tint_symbol_4);
+  if ((x_41 == 4)) {
+    int const x_47 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_50 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_53 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_56 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_5) = float4(float(x_47), float(x_50), float(x_53), float(x_56));
+  } else {
+    int const x_60 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    float const x_61 = float(x_60);
+    *(tint_symbol_5) = float4(x_61, x_61, x_61, x_61);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread int tint_symbol_6 = 0;
+  thread float4 tint_symbol_7 = 0.0f;
+  main_1(x_6, &(tint_symbol_6), &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-squared-comparison/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-squared-comparison/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..6b93297
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-squared-comparison/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,136 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 81
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_global_loop_count "x_GLF_global_loop_count"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+          %4 = OpConstantNull %int
+%x_GLF_global_loop_count = OpVariable %_ptr_Private_int Private %4
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+      %int_0 = OpConstant %int 0
+    %int_100 = OpConstant %int 100
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+     %int_10 = OpConstant %int 10
+      %int_4 = OpConstant %int 4
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+         %69 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %18
+         %21 = OpLabel
+               OpStore %x_GLF_global_loop_count %int_0
+               OpBranch %23
+         %23 = OpLabel
+               OpLoopMerge %24 %25 None
+               OpBranch %26
+         %26 = OpLabel
+         %27 = OpLoad %int %x_GLF_global_loop_count
+         %29 = OpSLessThan %bool %27 %int_100
+               OpSelectionMerge %31 None
+               OpBranchConditional %29 %32 %33
+         %32 = OpLabel
+               OpBranch %31
+         %33 = OpLabel
+               OpBranch %24
+         %31 = OpLabel
+         %34 = OpLoad %int %x_GLF_global_loop_count
+         %36 = OpIAdd %int %34 %int_1
+               OpStore %x_GLF_global_loop_count %36
+         %37 = OpLoad %int %x_GLF_global_loop_count
+         %38 = OpLoad %int %x_GLF_global_loop_count
+         %39 = OpIMul %int %37 %38
+         %41 = OpSGreaterThan %bool %39 %int_10
+               OpSelectionMerge %42 None
+               OpBranchConditional %41 %43 %42
+         %43 = OpLabel
+               OpBranch %24
+         %42 = OpLabel
+               OpBranch %25
+         %25 = OpLabel
+               OpBranch %23
+         %24 = OpLabel
+         %44 = OpLoad %int %x_GLF_global_loop_count
+         %46 = OpIEqual %bool %44 %int_4
+               OpSelectionMerge %47 None
+               OpBranchConditional %46 %48 %49
+         %48 = OpLabel
+         %52 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %53 = OpLoad %int %52
+         %54 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %55 = OpLoad %int %54
+         %56 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %57 = OpLoad %int %56
+         %58 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %59 = OpLoad %int %58
+         %60 = OpConvertSToF %float %53
+         %61 = OpConvertSToF %float %55
+         %62 = OpConvertSToF %float %57
+         %63 = OpConvertSToF %float %59
+         %64 = OpCompositeConstruct %v4float %60 %61 %62 %63
+               OpStore %x_GLF_color %64
+               OpBranch %47
+         %49 = OpLabel
+         %65 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %66 = OpLoad %int %65
+         %67 = OpConvertSToF %float %66
+         %68 = OpCompositeConstruct %v4float %67 %67 %67 %67
+               OpStore %x_GLF_color %68
+               OpBranch %47
+         %47 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %69
+%tint_symbol = OpFunctionParameter %main_out
+         %73 = OpLabel
+         %74 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %74
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %18
+         %76 = OpLabel
+         %77 = OpFunctionCall %void %main_1
+         %79 = OpLoad %v4float %x_GLF_color
+         %80 = OpCompositeConstruct %main_out %79
+         %78 = OpFunctionCall %void %tint_symbol_2 %80
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-squared-comparison/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-squared-comparison/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..27cfa37
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-squared-comparison/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,54 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> x_GLF_global_loop_count : i32;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+fn main_1() {
+  x_GLF_global_loop_count = 0;
+  loop {
+    let x_30 : i32 = x_GLF_global_loop_count;
+    if ((x_30 < 100)) {
+    } else {
+      break;
+    }
+    let x_33 : i32 = x_GLF_global_loop_count;
+    x_GLF_global_loop_count = (x_33 + 1);
+    let x_35 : i32 = x_GLF_global_loop_count;
+    let x_36 : i32 = x_GLF_global_loop_count;
+    if (((x_35 * x_36) > 10)) {
+      break;
+    }
+  }
+  let x_41 : i32 = x_GLF_global_loop_count;
+  if ((x_41 == 4)) {
+    let x_47 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_50 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_53 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_56 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_47), f32(x_50), f32(x_53), f32(x_56));
+  } else {
+    let x_60 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_61 : f32 = f32(x_60);
+    x_GLF_color = vec4<f32>(x_61, x_61, x_61, x_61);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-conversion-identical-branches/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-if-conversion-identical-branches/0-opt.spvasm
new file mode 100644
index 0000000..d4c4872
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-conversion-identical-branches/0-opt.spvasm
@@ -0,0 +1,70 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %21 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %22 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %8
+         %23 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+         %24 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %25 = OpLoad %int %24
+               OpStore %a %25
+         %26 = OpLoad %int %a
+         %27 = OpIEqual %bool %26 %int_0
+               OpSelectionMerge %28 None
+               OpBranchConditional %27 %29 %30
+         %29 = OpLabel
+         %31 = OpLoad %int %a
+         %32 = OpIAdd %int %31 %int_1
+               OpStore %a %32
+               OpBranch %28
+         %30 = OpLabel
+         %33 = OpLoad %int %a
+         %34 = OpIAdd %int %33 %int_1
+               OpStore %a %34
+               OpBranch %28
+         %28 = OpLabel
+         %35 = OpLoad %int %a
+         %36 = OpIEqual %bool %35 %int_1
+               OpSelectionMerge %37 None
+               OpBranchConditional %36 %38 %39
+         %38 = OpLabel
+               OpStore %_GLF_color %21
+               OpBranch %37
+         %39 = OpLabel
+               OpStore %_GLF_color %22
+               OpBranch %37
+         %37 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-conversion-identical-branches/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-if-conversion-identical-branches/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..edc0a80
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-conversion-identical-branches/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,35 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  const int x_25 = asint(x_6[0].x);
+  a = x_25;
+  if ((a == 0)) {
+    a = (a + 1);
+  } else {
+    a = (a + 1);
+  }
+  if ((a == 1)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-conversion-identical-branches/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-if-conversion-identical-branches/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..63f4fcd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-conversion-identical-branches/0-opt.spvasm.expected.msl
@@ -0,0 +1,42 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int zero;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int const x_25 = x_6.zero;
+  a = x_25;
+  int const x_26 = a;
+  if ((x_26 == 0)) {
+    int const x_31 = a;
+    a = (x_31 + 1);
+  } else {
+    int const x_33 = a;
+    a = (x_33 + 1);
+  }
+  int const x_35 = a;
+  if ((x_35 == 1)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-conversion-identical-branches/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-if-conversion-identical-branches/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..2016928
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-conversion-identical-branches/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,104 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 57
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %43 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %44 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %45 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %18
+         %22 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0
+         %23 = OpLoad %int %22
+               OpStore %a %23
+         %24 = OpLoad %int %a
+         %26 = OpIEqual %bool %24 %int_0
+               OpSelectionMerge %28 None
+               OpBranchConditional %26 %29 %30
+         %29 = OpLabel
+         %31 = OpLoad %int %a
+         %33 = OpIAdd %int %31 %int_1
+               OpStore %a %33
+               OpBranch %28
+         %30 = OpLabel
+         %34 = OpLoad %int %a
+         %35 = OpIAdd %int %34 %int_1
+               OpStore %a %35
+               OpBranch %28
+         %28 = OpLabel
+         %36 = OpLoad %int %a
+         %37 = OpIEqual %bool %36 %int_1
+               OpSelectionMerge %38 None
+               OpBranchConditional %37 %39 %40
+         %39 = OpLabel
+               OpStore %x_GLF_color %43
+               OpBranch %38
+         %40 = OpLabel
+               OpStore %x_GLF_color %44
+               OpBranch %38
+         %38 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %45
+%tint_symbol = OpFunctionParameter %main_out
+         %49 = OpLabel
+         %50 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %50
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %52 = OpLabel
+         %53 = OpFunctionCall %void %main_1
+         %55 = OpLoad %v4float %x_GLF_color
+         %56 = OpCompositeConstruct %main_out %55
+         %54 = OpFunctionCall %void %tint_symbol_2 %56
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-conversion-identical-branches/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-if-conversion-identical-branches/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..a2c8423
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-conversion-identical-branches/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,40 @@
+[[block]]
+struct buf0 {
+  zero : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  let x_25 : i32 = x_6.zero;
+  a = x_25;
+  let x_26 : i32 = a;
+  if ((x_26 == 0)) {
+    let x_31 : i32 = a;
+    a = (x_31 + 1);
+  } else {
+    let x_33 : i32 = a;
+    a = (x_33 + 1);
+  }
+  let x_35 : i32 = a;
+  if ((x_35 == 1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-conversion-identical-branches/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-if-conversion-identical-branches/0-opt.wgsl
new file mode 100644
index 0000000..a2c8423
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-conversion-identical-branches/0-opt.wgsl
@@ -0,0 +1,40 @@
+[[block]]
+struct buf0 {
+  zero : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  let x_25 : i32 = x_6.zero;
+  a = x_25;
+  let x_26 : i32 = a;
+  if ((x_26 == 0)) {
+    let x_31 : i32 = a;
+    a = (x_31 + 1);
+  } else {
+    let x_33 : i32 = a;
+    a = (x_33 + 1);
+  }
+  let x_35 : i32 = a;
+  if ((x_35 == 1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-conversion-identical-branches/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-if-conversion-identical-branches/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..edc0a80
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-conversion-identical-branches/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,35 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  const int x_25 = asint(x_6[0].x);
+  a = x_25;
+  if ((a == 0)) {
+    a = (a + 1);
+  } else {
+    a = (a + 1);
+  }
+  if ((a == 1)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-conversion-identical-branches/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-if-conversion-identical-branches/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..63f4fcd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-conversion-identical-branches/0-opt.wgsl.expected.msl
@@ -0,0 +1,42 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int zero;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int const x_25 = x_6.zero;
+  a = x_25;
+  int const x_26 = a;
+  if ((x_26 == 0)) {
+    int const x_31 = a;
+    a = (x_31 + 1);
+  } else {
+    int const x_33 = a;
+    a = (x_33 + 1);
+  }
+  int const x_35 = a;
+  if ((x_35 == 1)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-conversion-identical-branches/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-if-conversion-identical-branches/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..2016928
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-conversion-identical-branches/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,104 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 57
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %43 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %44 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %45 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %18
+         %22 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0
+         %23 = OpLoad %int %22
+               OpStore %a %23
+         %24 = OpLoad %int %a
+         %26 = OpIEqual %bool %24 %int_0
+               OpSelectionMerge %28 None
+               OpBranchConditional %26 %29 %30
+         %29 = OpLabel
+         %31 = OpLoad %int %a
+         %33 = OpIAdd %int %31 %int_1
+               OpStore %a %33
+               OpBranch %28
+         %30 = OpLabel
+         %34 = OpLoad %int %a
+         %35 = OpIAdd %int %34 %int_1
+               OpStore %a %35
+               OpBranch %28
+         %28 = OpLabel
+         %36 = OpLoad %int %a
+         %37 = OpIEqual %bool %36 %int_1
+               OpSelectionMerge %38 None
+               OpBranchConditional %37 %39 %40
+         %39 = OpLabel
+               OpStore %x_GLF_color %43
+               OpBranch %38
+         %40 = OpLabel
+               OpStore %x_GLF_color %44
+               OpBranch %38
+         %38 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %45
+%tint_symbol = OpFunctionParameter %main_out
+         %49 = OpLabel
+         %50 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %50
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %52 = OpLabel
+         %53 = OpFunctionCall %void %main_1
+         %55 = OpLoad %v4float %x_GLF_color
+         %56 = OpCompositeConstruct %main_out %55
+         %54 = OpFunctionCall %void %tint_symbol_2 %56
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-conversion-identical-branches/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-if-conversion-identical-branches/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..a2c8423
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-conversion-identical-branches/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,40 @@
+[[block]]
+struct buf0 {
+  zero : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  let x_25 : i32 = x_6.zero;
+  a = x_25;
+  let x_26 : i32 = a;
+  if ((x_26 == 0)) {
+    let x_31 : i32 = a;
+    a = (x_31 + 1);
+  } else {
+    let x_33 : i32 = a;
+    a = (x_33 + 1);
+  }
+  let x_35 : i32 = a;
+  if ((x_35 == 1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-switch-fallthrough/0.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-if-switch-fallthrough/0.spvasm
new file mode 100644
index 0000000..059c9b0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-switch-fallthrough/0.spvasm
@@ -0,0 +1,96 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color %gl_FragCoord
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+       %bool = OpTypeBool
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %main = OpFunction %void None %12
+         %29 = OpLabel
+         %30 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %31 = OpLoad %float %30
+         %32 = OpCompositeConstruct %v4float %31 %31 %31 %31
+               OpStore %_GLF_color %32
+         %33 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %34 = OpLoad %float %33
+         %35 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %36 = OpLoad %float %35
+         %37 = OpFOrdGreaterThanEqual %bool %34 %36
+               OpSelectionMerge %38 None
+               OpBranchConditional %37 %39 %38
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %41 = OpLoad %int %40
+               OpSelectionMerge %42 None
+               OpSwitch %41 %42 16 %43 0 %43
+         %43 = OpLabel
+         %44 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %45 = OpLoad %int %44
+         %46 = OpConvertSToF %float %45
+         %47 = OpConvertSToF %float %41
+         %48 = OpCompositeConstruct %v4float %46 %47 %47 %46
+               OpStore %_GLF_color %48
+               OpBranch %42
+         %42 = OpLabel
+               OpBranch %38
+         %38 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %50 = OpLoad %int %49
+         %51 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %52 = OpLoad %int %51
+         %53 = OpIEqual %bool %50 %52
+               OpSelectionMerge %54 None
+               OpBranchConditional %53 %55 %54
+         %55 = OpLabel
+         %56 = OpCompositeConstruct %v4float %36 %36 %36 %36
+               OpStore %_GLF_color %56
+               OpBranch %54
+         %54 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-switch-fallthrough/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-if-switch-fallthrough/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..7837732
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-switch-fallthrough/0.spvasm.expected.hlsl
@@ -0,0 +1,59 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[2];
+};
+
+void main_1() {
+  const float x_31 = asfloat(x_6[1].x);
+  x_GLF_color = float4(x_31, x_31, x_31, x_31);
+  const float x_34 = gl_FragCoord.y;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_36 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  if ((x_34 >= x_36)) {
+    const int x_41 = asint(x_8[1].x);
+    switch(x_41) {
+      case 0:
+      case 16: {
+        const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+        const int x_45 = asint(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+        const float x_46 = float(x_45);
+        const float x_47 = float(x_41);
+        x_GLF_color = float4(x_46, x_47, x_47, x_46);
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+  }
+  const int x_50 = asint(x_8[1].x);
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const int x_52 = asint(x_8[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  if ((x_50 == x_52)) {
+    x_GLF_color = float4(x_36, x_36, x_36, x_36);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-switch-fallthrough/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-if-switch-fallthrough/0.spvasm.expected.msl
new file mode 100644
index 0000000..2a9fb15
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-switch-fallthrough/0.spvasm.expected.msl
@@ -0,0 +1,69 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_8, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float const x_31 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  *(tint_symbol_5) = float4(x_31, x_31, x_31, x_31);
+  float const x_34 = (*(tint_symbol_6)).y;
+  float const x_36 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_34 >= x_36)) {
+    int const x_41 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    switch(x_41) {
+      case 0:
+      case 16: {
+        int const x_45 = x_8.x_GLF_uniform_int_values.arr[0].el;
+        float const x_46 = float(x_45);
+        float const x_47 = float(x_41);
+        *(tint_symbol_5) = float4(x_46, x_47, x_47, x_46);
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+  }
+  int const x_50 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  int const x_52 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  if ((x_50 == x_52)) {
+    *(tint_symbol_5) = float4(x_36, x_36, x_36, x_36);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]], constant buf1& x_8 [[buffer(1)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_6, x_8, &(tint_symbol_8), &(tint_symbol_7));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-switch-fallthrough/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-if-switch-fallthrough/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..69687bb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-switch-fallthrough/0.spvasm.expected.spvasm
@@ -0,0 +1,135 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 75
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_8 "x_8"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %22 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+         %62 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %22
+         %25 = OpLabel
+         %29 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %30 = OpLoad %float %29
+         %31 = OpCompositeConstruct %v4float %30 %30 %30 %30
+               OpStore %x_GLF_color %31
+         %34 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %35 = OpLoad %float %34
+         %37 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %38 = OpLoad %float %37
+         %39 = OpFOrdGreaterThanEqual %bool %35 %38
+               OpSelectionMerge %41 None
+               OpBranchConditional %39 %42 %41
+         %42 = OpLabel
+         %44 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %45 = OpLoad %int %44
+               OpSelectionMerge %46 None
+               OpSwitch %45 %47 0 %48 16 %48
+         %48 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %50 = OpLoad %int %49
+         %51 = OpConvertSToF %float %50
+         %52 = OpConvertSToF %float %45
+         %53 = OpCompositeConstruct %v4float %51 %52 %52 %51
+               OpStore %x_GLF_color %53
+               OpBranch %46
+         %47 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+               OpBranch %41
+         %41 = OpLabel
+         %54 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %55 = OpLoad %int %54
+         %56 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %57 = OpLoad %int %56
+         %58 = OpIEqual %bool %55 %57
+               OpSelectionMerge %59 None
+               OpBranchConditional %58 %60 %59
+         %60 = OpLabel
+         %61 = OpCompositeConstruct %v4float %38 %38 %38 %38
+               OpStore %x_GLF_color %61
+               OpBranch %59
+         %59 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %62
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %66 = OpLabel
+         %67 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %67
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %22
+         %69 = OpLabel
+         %70 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %70
+         %71 = OpFunctionCall %void %main_1
+         %73 = OpLoad %v4float %x_GLF_color
+         %74 = OpCompositeConstruct %main_out %73
+         %72 = OpFunctionCall %void %tint_symbol_3 %74
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-switch-fallthrough/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-if-switch-fallthrough/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..8f12c6b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-switch-fallthrough/0.spvasm.expected.wgsl
@@ -0,0 +1,59 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+fn main_1() {
+  let x_31 : f32 = x_6.x_GLF_uniform_float_values[1];
+  x_GLF_color = vec4<f32>(x_31, x_31, x_31, x_31);
+  let x_34 : f32 = gl_FragCoord.y;
+  let x_36 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if ((x_34 >= x_36)) {
+    let x_41 : i32 = x_8.x_GLF_uniform_int_values[1];
+    switch(x_41) {
+      case 0, 16: {
+        let x_45 : i32 = x_8.x_GLF_uniform_int_values[0];
+        let x_46 : f32 = f32(x_45);
+        let x_47 : f32 = f32(x_41);
+        x_GLF_color = vec4<f32>(x_46, x_47, x_47, x_46);
+      }
+      default: {
+      }
+    }
+  }
+  let x_50 : i32 = x_8.x_GLF_uniform_int_values[1];
+  let x_52 : i32 = x_8.x_GLF_uniform_int_values[0];
+  if ((x_50 == x_52)) {
+    x_GLF_color = vec4<f32>(x_36, x_36, x_36, x_36);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-switch-fallthrough/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-if-switch-fallthrough/0.wgsl
new file mode 100644
index 0000000..8f12c6b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-switch-fallthrough/0.wgsl
@@ -0,0 +1,59 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+fn main_1() {
+  let x_31 : f32 = x_6.x_GLF_uniform_float_values[1];
+  x_GLF_color = vec4<f32>(x_31, x_31, x_31, x_31);
+  let x_34 : f32 = gl_FragCoord.y;
+  let x_36 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if ((x_34 >= x_36)) {
+    let x_41 : i32 = x_8.x_GLF_uniform_int_values[1];
+    switch(x_41) {
+      case 0, 16: {
+        let x_45 : i32 = x_8.x_GLF_uniform_int_values[0];
+        let x_46 : f32 = f32(x_45);
+        let x_47 : f32 = f32(x_41);
+        x_GLF_color = vec4<f32>(x_46, x_47, x_47, x_46);
+      }
+      default: {
+      }
+    }
+  }
+  let x_50 : i32 = x_8.x_GLF_uniform_int_values[1];
+  let x_52 : i32 = x_8.x_GLF_uniform_int_values[0];
+  if ((x_50 == x_52)) {
+    x_GLF_color = vec4<f32>(x_36, x_36, x_36, x_36);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-switch-fallthrough/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-if-switch-fallthrough/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..7837732
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-switch-fallthrough/0.wgsl.expected.hlsl
@@ -0,0 +1,59 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[2];
+};
+
+void main_1() {
+  const float x_31 = asfloat(x_6[1].x);
+  x_GLF_color = float4(x_31, x_31, x_31, x_31);
+  const float x_34 = gl_FragCoord.y;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_36 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  if ((x_34 >= x_36)) {
+    const int x_41 = asint(x_8[1].x);
+    switch(x_41) {
+      case 0:
+      case 16: {
+        const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+        const int x_45 = asint(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+        const float x_46 = float(x_45);
+        const float x_47 = float(x_41);
+        x_GLF_color = float4(x_46, x_47, x_47, x_46);
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+  }
+  const int x_50 = asint(x_8[1].x);
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const int x_52 = asint(x_8[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  if ((x_50 == x_52)) {
+    x_GLF_color = float4(x_36, x_36, x_36, x_36);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-switch-fallthrough/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-if-switch-fallthrough/0.wgsl.expected.msl
new file mode 100644
index 0000000..2a9fb15
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-switch-fallthrough/0.wgsl.expected.msl
@@ -0,0 +1,69 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_8, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float const x_31 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  *(tint_symbol_5) = float4(x_31, x_31, x_31, x_31);
+  float const x_34 = (*(tint_symbol_6)).y;
+  float const x_36 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_34 >= x_36)) {
+    int const x_41 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    switch(x_41) {
+      case 0:
+      case 16: {
+        int const x_45 = x_8.x_GLF_uniform_int_values.arr[0].el;
+        float const x_46 = float(x_45);
+        float const x_47 = float(x_41);
+        *(tint_symbol_5) = float4(x_46, x_47, x_47, x_46);
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+  }
+  int const x_50 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  int const x_52 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  if ((x_50 == x_52)) {
+    *(tint_symbol_5) = float4(x_36, x_36, x_36, x_36);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]], constant buf1& x_8 [[buffer(1)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_6, x_8, &(tint_symbol_8), &(tint_symbol_7));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-switch-fallthrough/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-if-switch-fallthrough/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..69687bb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-switch-fallthrough/0.wgsl.expected.spvasm
@@ -0,0 +1,135 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 75
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_8 "x_8"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %22 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+         %62 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %22
+         %25 = OpLabel
+         %29 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %30 = OpLoad %float %29
+         %31 = OpCompositeConstruct %v4float %30 %30 %30 %30
+               OpStore %x_GLF_color %31
+         %34 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %35 = OpLoad %float %34
+         %37 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %38 = OpLoad %float %37
+         %39 = OpFOrdGreaterThanEqual %bool %35 %38
+               OpSelectionMerge %41 None
+               OpBranchConditional %39 %42 %41
+         %42 = OpLabel
+         %44 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %45 = OpLoad %int %44
+               OpSelectionMerge %46 None
+               OpSwitch %45 %47 0 %48 16 %48
+         %48 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %50 = OpLoad %int %49
+         %51 = OpConvertSToF %float %50
+         %52 = OpConvertSToF %float %45
+         %53 = OpCompositeConstruct %v4float %51 %52 %52 %51
+               OpStore %x_GLF_color %53
+               OpBranch %46
+         %47 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+               OpBranch %41
+         %41 = OpLabel
+         %54 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %55 = OpLoad %int %54
+         %56 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %57 = OpLoad %int %56
+         %58 = OpIEqual %bool %55 %57
+               OpSelectionMerge %59 None
+               OpBranchConditional %58 %60 %59
+         %60 = OpLabel
+         %61 = OpCompositeConstruct %v4float %38 %38 %38 %38
+               OpStore %x_GLF_color %61
+               OpBranch %59
+         %59 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %62
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %66 = OpLabel
+         %67 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %67
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %22
+         %69 = OpLabel
+         %70 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %70
+         %71 = OpFunctionCall %void %main_1
+         %73 = OpLoad %v4float %x_GLF_color
+         %74 = OpCompositeConstruct %main_out %73
+         %72 = OpFunctionCall %void %tint_symbol_3 %74
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-switch-fallthrough/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-if-switch-fallthrough/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..8f12c6b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-switch-fallthrough/0.wgsl.expected.wgsl
@@ -0,0 +1,59 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+fn main_1() {
+  let x_31 : f32 = x_6.x_GLF_uniform_float_values[1];
+  x_GLF_color = vec4<f32>(x_31, x_31, x_31, x_31);
+  let x_34 : f32 = gl_FragCoord.y;
+  let x_36 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if ((x_34 >= x_36)) {
+    let x_41 : i32 = x_8.x_GLF_uniform_int_values[1];
+    switch(x_41) {
+      case 0, 16: {
+        let x_45 : i32 = x_8.x_GLF_uniform_int_values[0];
+        let x_46 : f32 = f32(x_45);
+        let x_47 : f32 = f32(x_41);
+        x_GLF_color = vec4<f32>(x_46, x_47, x_47, x_46);
+      }
+      default: {
+      }
+    }
+  }
+  let x_50 : i32 = x_8.x_GLF_uniform_int_values[1];
+  let x_52 : i32 = x_8.x_GLF_uniform_int_values[0];
+  if ((x_50 == x_52)) {
+    x_GLF_color = vec4<f32>(x_36, x_36, x_36, x_36);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-true-continue/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-if-true-continue/0-opt.spvasm
new file mode 100644
index 0000000..c201685
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-true-continue/0-opt.spvasm
@@ -0,0 +1,134 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %b "b"
+               OpName %c "c"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+       %true = OpConstantTrue %bool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %11
+         %27 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+          %b = OpVariable %_ptr_Function_int Function
+          %c = OpVariable %_ptr_Function_int Function
+         %28 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %29 = OpLoad %int %28
+               OpStore %a %29
+         %30 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %31 = OpLoad %int %30
+               OpStore %b %31
+         %32 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %33 = OpLoad %int %32
+               OpStore %c %33
+               OpBranch %34
+         %34 = OpLabel
+               OpLoopMerge %35 %36 None
+               OpBranch %37
+         %37 = OpLabel
+         %38 = OpLoad %int %a
+         %39 = OpLoad %int %b
+         %40 = OpSLessThan %bool %38 %39
+               OpBranchConditional %40 %41 %35
+         %41 = OpLabel
+         %42 = OpLoad %int %a
+         %43 = OpIAdd %int %42 %int_1
+               OpStore %a %43
+         %44 = OpLoad %int %c
+         %45 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %46 = OpLoad %int %45
+         %47 = OpIEqual %bool %44 %46
+               OpSelectionMerge %48 None
+               OpBranchConditional %47 %49 %50
+         %49 = OpLabel
+         %51 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %52 = OpLoad %int %51
+         %53 = OpLoad %int %c
+         %54 = OpIMul %int %53 %52
+               OpStore %c %54
+               OpBranch %48
+         %50 = OpLabel
+               OpSelectionMerge %55 None
+               OpBranchConditional %true %56 %55
+         %56 = OpLabel
+               OpBranch %36
+         %55 = OpLabel
+               OpBranch %48
+         %48 = OpLabel
+               OpBranch %36
+         %36 = OpLabel
+               OpBranch %34
+         %35 = OpLabel
+         %57 = OpLoad %int %a
+         %58 = OpLoad %int %b
+         %59 = OpIEqual %bool %57 %58
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %60
+         %61 = OpLabel
+         %62 = OpLoad %int %c
+         %63 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %64 = OpLoad %int %63
+         %65 = OpIEqual %bool %62 %64
+               OpBranch %60
+         %60 = OpLabel
+         %66 = OpPhi %bool %59 %35 %65 %61
+               OpSelectionMerge %67 None
+               OpBranchConditional %66 %68 %69
+         %68 = OpLabel
+         %70 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %71 = OpLoad %int %70
+         %72 = OpConvertSToF %float %71
+         %73 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %74 = OpLoad %int %73
+         %75 = OpConvertSToF %float %74
+         %76 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %77 = OpLoad %int %76
+         %78 = OpConvertSToF %float %77
+         %79 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %80 = OpLoad %int %79
+         %81 = OpConvertSToF %float %80
+         %82 = OpCompositeConstruct %v4float %72 %75 %78 %81
+               OpStore %_GLF_color %82
+               OpBranch %67
+         %69 = OpLabel
+         %83 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %84 = OpLoad %int %83
+         %85 = OpConvertSToF %float %84
+         %86 = OpCompositeConstruct %v4float %85 %85 %85 %85
+               OpStore %_GLF_color %86
+               OpBranch %67
+         %67 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-true-continue/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-if-true-continue/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..1ee50e8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-true-continue/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,73 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  int b = 0;
+  int c = 0;
+  bool x_65 = false;
+  bool x_66_phi = false;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_29 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  a = x_29;
+  const int x_31 = asint(x_6[1].x);
+  b = x_31;
+  const int x_33 = asint(x_6[2].x);
+  c = x_33;
+  while (true) {
+    if ((a < b)) {
+    } else {
+      break;
+    }
+    a = (a + 1);
+    const int x_44 = c;
+    const int x_46 = asint(x_6[2].x);
+    if ((x_44 == x_46)) {
+      const int x_52 = asint(x_6[3].x);
+      c = (c * x_52);
+    } else {
+      if (true) {
+        continue;
+      }
+    }
+  }
+  const bool x_59 = (a == b);
+  x_66_phi = x_59;
+  if (x_59) {
+    const int x_62 = c;
+    const int x_64 = asint(x_6[3].x);
+    x_65 = (x_62 == x_64);
+    x_66_phi = x_65;
+  }
+  if (x_66_phi) {
+    const int x_71 = asint(x_6[2].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_74 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_77 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_80 = asint(x_6[2].x);
+    x_GLF_color = float4(float(x_71), float(x_74), float(x_77), float(x_80));
+  } else {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_84 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const float x_85 = float(x_84);
+    x_GLF_color = float4(x_85, x_85, x_85, x_85);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-true-continue/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-if-true-continue/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..b18bbf7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-true-continue/0-opt.spvasm.expected.msl
@@ -0,0 +1,86 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int b = 0;
+  int c = 0;
+  bool x_65 = false;
+  bool x_66_phi = false;
+  int const x_29 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  a = x_29;
+  int const x_31 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  b = x_31;
+  int const x_33 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  c = x_33;
+  while (true) {
+    int const x_38 = a;
+    int const x_39 = b;
+    if ((x_38 < x_39)) {
+    } else {
+      break;
+    }
+    int const x_42 = a;
+    a = (x_42 + 1);
+    int const x_44 = c;
+    int const x_46 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    if ((x_44 == x_46)) {
+      int const x_52 = x_6.x_GLF_uniform_int_values.arr[3].el;
+      int const x_53 = c;
+      c = (x_53 * x_52);
+    } else {
+      if (true) {
+        continue;
+      }
+    }
+  }
+  int const x_57 = a;
+  int const x_58 = b;
+  bool const x_59 = (x_57 == x_58);
+  x_66_phi = x_59;
+  if (x_59) {
+    int const x_62 = c;
+    int const x_64 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    x_65 = (x_62 == x_64);
+    x_66_phi = x_65;
+  }
+  bool const x_66 = x_66_phi;
+  if (x_66) {
+    int const x_71 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_74 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_77 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_80 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    *(tint_symbol_4) = float4(float(x_71), float(x_74), float(x_77), float(x_80));
+  } else {
+    int const x_84 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    float const x_85 = float(x_84);
+    *(tint_symbol_4) = float4(x_85, x_85, x_85, x_85);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-true-continue/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-if-true-continue/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..a7e3461
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-true-continue/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,182 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 110
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %x_65 "x_65"
+               OpName %x_66_phi "x_66_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %27 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+       %true = OpConstantTrue %bool
+   %main_out = OpTypeStruct %v4float
+         %98 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+          %b = OpVariable %_ptr_Function_int Function %21
+          %c = OpVariable %_ptr_Function_int Function %21
+       %x_65 = OpVariable %_ptr_Function_bool Function %27
+   %x_66_phi = OpVariable %_ptr_Function_bool Function %27
+         %32 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %33 = OpLoad %int %32
+               OpStore %a %33
+         %35 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %36 = OpLoad %int %35
+               OpStore %b %36
+         %38 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %39 = OpLoad %int %38
+               OpStore %c %39
+               OpBranch %40
+         %40 = OpLabel
+               OpLoopMerge %41 %42 None
+               OpBranch %43
+         %43 = OpLabel
+         %44 = OpLoad %int %a
+         %45 = OpLoad %int %b
+         %46 = OpSLessThan %bool %44 %45
+               OpSelectionMerge %47 None
+               OpBranchConditional %46 %48 %49
+         %48 = OpLabel
+               OpBranch %47
+         %49 = OpLabel
+               OpBranch %41
+         %47 = OpLabel
+         %50 = OpLoad %int %a
+         %51 = OpIAdd %int %50 %int_1
+               OpStore %a %51
+         %52 = OpLoad %int %c
+         %53 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %54 = OpLoad %int %53
+         %55 = OpIEqual %bool %52 %54
+               OpSelectionMerge %56 None
+               OpBranchConditional %55 %57 %58
+         %57 = OpLabel
+         %60 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %61 = OpLoad %int %60
+         %62 = OpLoad %int %c
+         %63 = OpIMul %int %62 %61
+               OpStore %c %63
+               OpBranch %56
+         %58 = OpLabel
+               OpSelectionMerge %65 None
+               OpBranchConditional %true %66 %65
+         %66 = OpLabel
+               OpBranch %42
+         %65 = OpLabel
+               OpBranch %56
+         %56 = OpLabel
+               OpBranch %42
+         %42 = OpLabel
+               OpBranch %40
+         %41 = OpLabel
+         %67 = OpLoad %int %a
+         %68 = OpLoad %int %b
+         %69 = OpIEqual %bool %67 %68
+               OpStore %x_66_phi %69
+               OpSelectionMerge %70 None
+               OpBranchConditional %69 %71 %70
+         %71 = OpLabel
+         %72 = OpLoad %int %c
+         %73 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %74 = OpLoad %int %73
+         %75 = OpIEqual %bool %72 %74
+               OpStore %x_65 %75
+         %76 = OpLoad %bool %x_65
+               OpStore %x_66_phi %76
+               OpBranch %70
+         %70 = OpLabel
+         %77 = OpLoad %bool %x_66_phi
+               OpSelectionMerge %78 None
+               OpBranchConditional %77 %79 %80
+         %79 = OpLabel
+         %81 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %82 = OpLoad %int %81
+         %83 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %84 = OpLoad %int %83
+         %85 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %88 = OpLoad %int %87
+         %89 = OpConvertSToF %float %82
+         %90 = OpConvertSToF %float %84
+         %91 = OpConvertSToF %float %86
+         %92 = OpConvertSToF %float %88
+         %93 = OpCompositeConstruct %v4float %89 %90 %91 %92
+               OpStore %x_GLF_color %93
+               OpBranch %78
+         %80 = OpLabel
+         %94 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %95 = OpLoad %int %94
+         %96 = OpConvertSToF %float %95
+         %97 = OpCompositeConstruct %v4float %96 %96 %96 %96
+               OpStore %x_GLF_color %97
+               OpBranch %78
+         %78 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %98
+%tint_symbol = OpFunctionParameter %main_out
+        %102 = OpLabel
+        %103 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %103
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %105 = OpLabel
+        %106 = OpFunctionCall %void %main_1
+        %108 = OpLoad %v4float %x_GLF_color
+        %109 = OpCompositeConstruct %main_out %108
+        %107 = OpFunctionCall %void %tint_symbol_2 %109
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-true-continue/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-if-true-continue/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..73577eb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-true-continue/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,79 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var b : i32;
+  var c : i32;
+  var x_65 : bool;
+  var x_66_phi : bool;
+  let x_29 : i32 = x_6.x_GLF_uniform_int_values[0];
+  a = x_29;
+  let x_31 : i32 = x_6.x_GLF_uniform_int_values[1];
+  b = x_31;
+  let x_33 : i32 = x_6.x_GLF_uniform_int_values[2];
+  c = x_33;
+  loop {
+    let x_38 : i32 = a;
+    let x_39 : i32 = b;
+    if ((x_38 < x_39)) {
+    } else {
+      break;
+    }
+    let x_42 : i32 = a;
+    a = (x_42 + 1);
+    let x_44 : i32 = c;
+    let x_46 : i32 = x_6.x_GLF_uniform_int_values[2];
+    if ((x_44 == x_46)) {
+      let x_52 : i32 = x_6.x_GLF_uniform_int_values[3];
+      let x_53 : i32 = c;
+      c = (x_53 * x_52);
+    } else {
+      if (true) {
+        continue;
+      }
+    }
+  }
+  let x_57 : i32 = a;
+  let x_58 : i32 = b;
+  let x_59 : bool = (x_57 == x_58);
+  x_66_phi = x_59;
+  if (x_59) {
+    let x_62 : i32 = c;
+    let x_64 : i32 = x_6.x_GLF_uniform_int_values[3];
+    x_65 = (x_62 == x_64);
+    x_66_phi = x_65;
+  }
+  let x_66 : bool = x_66_phi;
+  if (x_66) {
+    let x_71 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_74 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_77 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_80 : i32 = x_6.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_71), f32(x_74), f32(x_77), f32(x_80));
+  } else {
+    let x_84 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_85 : f32 = f32(x_84);
+    x_GLF_color = vec4<f32>(x_85, x_85, x_85, x_85);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-true-continue/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-if-true-continue/0-opt.wgsl
new file mode 100644
index 0000000..73577eb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-true-continue/0-opt.wgsl
@@ -0,0 +1,79 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var b : i32;
+  var c : i32;
+  var x_65 : bool;
+  var x_66_phi : bool;
+  let x_29 : i32 = x_6.x_GLF_uniform_int_values[0];
+  a = x_29;
+  let x_31 : i32 = x_6.x_GLF_uniform_int_values[1];
+  b = x_31;
+  let x_33 : i32 = x_6.x_GLF_uniform_int_values[2];
+  c = x_33;
+  loop {
+    let x_38 : i32 = a;
+    let x_39 : i32 = b;
+    if ((x_38 < x_39)) {
+    } else {
+      break;
+    }
+    let x_42 : i32 = a;
+    a = (x_42 + 1);
+    let x_44 : i32 = c;
+    let x_46 : i32 = x_6.x_GLF_uniform_int_values[2];
+    if ((x_44 == x_46)) {
+      let x_52 : i32 = x_6.x_GLF_uniform_int_values[3];
+      let x_53 : i32 = c;
+      c = (x_53 * x_52);
+    } else {
+      if (true) {
+        continue;
+      }
+    }
+  }
+  let x_57 : i32 = a;
+  let x_58 : i32 = b;
+  let x_59 : bool = (x_57 == x_58);
+  x_66_phi = x_59;
+  if (x_59) {
+    let x_62 : i32 = c;
+    let x_64 : i32 = x_6.x_GLF_uniform_int_values[3];
+    x_65 = (x_62 == x_64);
+    x_66_phi = x_65;
+  }
+  let x_66 : bool = x_66_phi;
+  if (x_66) {
+    let x_71 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_74 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_77 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_80 : i32 = x_6.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_71), f32(x_74), f32(x_77), f32(x_80));
+  } else {
+    let x_84 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_85 : f32 = f32(x_84);
+    x_GLF_color = vec4<f32>(x_85, x_85, x_85, x_85);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-true-continue/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-if-true-continue/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..1ee50e8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-true-continue/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,73 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  int b = 0;
+  int c = 0;
+  bool x_65 = false;
+  bool x_66_phi = false;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_29 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  a = x_29;
+  const int x_31 = asint(x_6[1].x);
+  b = x_31;
+  const int x_33 = asint(x_6[2].x);
+  c = x_33;
+  while (true) {
+    if ((a < b)) {
+    } else {
+      break;
+    }
+    a = (a + 1);
+    const int x_44 = c;
+    const int x_46 = asint(x_6[2].x);
+    if ((x_44 == x_46)) {
+      const int x_52 = asint(x_6[3].x);
+      c = (c * x_52);
+    } else {
+      if (true) {
+        continue;
+      }
+    }
+  }
+  const bool x_59 = (a == b);
+  x_66_phi = x_59;
+  if (x_59) {
+    const int x_62 = c;
+    const int x_64 = asint(x_6[3].x);
+    x_65 = (x_62 == x_64);
+    x_66_phi = x_65;
+  }
+  if (x_66_phi) {
+    const int x_71 = asint(x_6[2].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_74 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_77 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_80 = asint(x_6[2].x);
+    x_GLF_color = float4(float(x_71), float(x_74), float(x_77), float(x_80));
+  } else {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_84 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const float x_85 = float(x_84);
+    x_GLF_color = float4(x_85, x_85, x_85, x_85);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-true-continue/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-if-true-continue/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..b18bbf7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-true-continue/0-opt.wgsl.expected.msl
@@ -0,0 +1,86 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int b = 0;
+  int c = 0;
+  bool x_65 = false;
+  bool x_66_phi = false;
+  int const x_29 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  a = x_29;
+  int const x_31 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  b = x_31;
+  int const x_33 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  c = x_33;
+  while (true) {
+    int const x_38 = a;
+    int const x_39 = b;
+    if ((x_38 < x_39)) {
+    } else {
+      break;
+    }
+    int const x_42 = a;
+    a = (x_42 + 1);
+    int const x_44 = c;
+    int const x_46 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    if ((x_44 == x_46)) {
+      int const x_52 = x_6.x_GLF_uniform_int_values.arr[3].el;
+      int const x_53 = c;
+      c = (x_53 * x_52);
+    } else {
+      if (true) {
+        continue;
+      }
+    }
+  }
+  int const x_57 = a;
+  int const x_58 = b;
+  bool const x_59 = (x_57 == x_58);
+  x_66_phi = x_59;
+  if (x_59) {
+    int const x_62 = c;
+    int const x_64 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    x_65 = (x_62 == x_64);
+    x_66_phi = x_65;
+  }
+  bool const x_66 = x_66_phi;
+  if (x_66) {
+    int const x_71 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_74 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_77 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_80 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    *(tint_symbol_4) = float4(float(x_71), float(x_74), float(x_77), float(x_80));
+  } else {
+    int const x_84 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    float const x_85 = float(x_84);
+    *(tint_symbol_4) = float4(x_85, x_85, x_85, x_85);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-true-continue/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-if-true-continue/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..a7e3461
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-true-continue/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,182 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 110
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %x_65 "x_65"
+               OpName %x_66_phi "x_66_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %27 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+       %true = OpConstantTrue %bool
+   %main_out = OpTypeStruct %v4float
+         %98 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+          %b = OpVariable %_ptr_Function_int Function %21
+          %c = OpVariable %_ptr_Function_int Function %21
+       %x_65 = OpVariable %_ptr_Function_bool Function %27
+   %x_66_phi = OpVariable %_ptr_Function_bool Function %27
+         %32 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %33 = OpLoad %int %32
+               OpStore %a %33
+         %35 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %36 = OpLoad %int %35
+               OpStore %b %36
+         %38 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %39 = OpLoad %int %38
+               OpStore %c %39
+               OpBranch %40
+         %40 = OpLabel
+               OpLoopMerge %41 %42 None
+               OpBranch %43
+         %43 = OpLabel
+         %44 = OpLoad %int %a
+         %45 = OpLoad %int %b
+         %46 = OpSLessThan %bool %44 %45
+               OpSelectionMerge %47 None
+               OpBranchConditional %46 %48 %49
+         %48 = OpLabel
+               OpBranch %47
+         %49 = OpLabel
+               OpBranch %41
+         %47 = OpLabel
+         %50 = OpLoad %int %a
+         %51 = OpIAdd %int %50 %int_1
+               OpStore %a %51
+         %52 = OpLoad %int %c
+         %53 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %54 = OpLoad %int %53
+         %55 = OpIEqual %bool %52 %54
+               OpSelectionMerge %56 None
+               OpBranchConditional %55 %57 %58
+         %57 = OpLabel
+         %60 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %61 = OpLoad %int %60
+         %62 = OpLoad %int %c
+         %63 = OpIMul %int %62 %61
+               OpStore %c %63
+               OpBranch %56
+         %58 = OpLabel
+               OpSelectionMerge %65 None
+               OpBranchConditional %true %66 %65
+         %66 = OpLabel
+               OpBranch %42
+         %65 = OpLabel
+               OpBranch %56
+         %56 = OpLabel
+               OpBranch %42
+         %42 = OpLabel
+               OpBranch %40
+         %41 = OpLabel
+         %67 = OpLoad %int %a
+         %68 = OpLoad %int %b
+         %69 = OpIEqual %bool %67 %68
+               OpStore %x_66_phi %69
+               OpSelectionMerge %70 None
+               OpBranchConditional %69 %71 %70
+         %71 = OpLabel
+         %72 = OpLoad %int %c
+         %73 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %74 = OpLoad %int %73
+         %75 = OpIEqual %bool %72 %74
+               OpStore %x_65 %75
+         %76 = OpLoad %bool %x_65
+               OpStore %x_66_phi %76
+               OpBranch %70
+         %70 = OpLabel
+         %77 = OpLoad %bool %x_66_phi
+               OpSelectionMerge %78 None
+               OpBranchConditional %77 %79 %80
+         %79 = OpLabel
+         %81 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %82 = OpLoad %int %81
+         %83 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %84 = OpLoad %int %83
+         %85 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %88 = OpLoad %int %87
+         %89 = OpConvertSToF %float %82
+         %90 = OpConvertSToF %float %84
+         %91 = OpConvertSToF %float %86
+         %92 = OpConvertSToF %float %88
+         %93 = OpCompositeConstruct %v4float %89 %90 %91 %92
+               OpStore %x_GLF_color %93
+               OpBranch %78
+         %80 = OpLabel
+         %94 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %95 = OpLoad %int %94
+         %96 = OpConvertSToF %float %95
+         %97 = OpCompositeConstruct %v4float %96 %96 %96 %96
+               OpStore %x_GLF_color %97
+               OpBranch %78
+         %78 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %98
+%tint_symbol = OpFunctionParameter %main_out
+        %102 = OpLabel
+        %103 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %103
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %105 = OpLabel
+        %106 = OpFunctionCall %void %main_1
+        %108 = OpLoad %v4float %x_GLF_color
+        %109 = OpCompositeConstruct %main_out %108
+        %107 = OpFunctionCall %void %tint_symbol_2 %109
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-true-continue/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-if-true-continue/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..73577eb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-true-continue/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,79 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var b : i32;
+  var c : i32;
+  var x_65 : bool;
+  var x_66_phi : bool;
+  let x_29 : i32 = x_6.x_GLF_uniform_int_values[0];
+  a = x_29;
+  let x_31 : i32 = x_6.x_GLF_uniform_int_values[1];
+  b = x_31;
+  let x_33 : i32 = x_6.x_GLF_uniform_int_values[2];
+  c = x_33;
+  loop {
+    let x_38 : i32 = a;
+    let x_39 : i32 = b;
+    if ((x_38 < x_39)) {
+    } else {
+      break;
+    }
+    let x_42 : i32 = a;
+    a = (x_42 + 1);
+    let x_44 : i32 = c;
+    let x_46 : i32 = x_6.x_GLF_uniform_int_values[2];
+    if ((x_44 == x_46)) {
+      let x_52 : i32 = x_6.x_GLF_uniform_int_values[3];
+      let x_53 : i32 = c;
+      c = (x_53 * x_52);
+    } else {
+      if (true) {
+        continue;
+      }
+    }
+  }
+  let x_57 : i32 = a;
+  let x_58 : i32 = b;
+  let x_59 : bool = (x_57 == x_58);
+  x_66_phi = x_59;
+  if (x_59) {
+    let x_62 : i32 = c;
+    let x_64 : i32 = x_6.x_GLF_uniform_int_values[3];
+    x_65 = (x_62 == x_64);
+    x_66_phi = x_65;
+  }
+  let x_66 : bool = x_66_phi;
+  if (x_66) {
+    let x_71 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_74 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_77 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_80 : i32 = x_6.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_71), f32(x_74), f32(x_77), f32(x_80));
+  } else {
+    let x_84 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_85 : f32 = f32(x_84);
+    x_GLF_color = vec4<f32>(x_85, x_85, x_85, x_85);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-true-discard-in-do-while-never-reached/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-if-true-discard-in-do-while-never-reached/0-opt.spvasm
new file mode 100644
index 0000000..61eabc3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-true-discard-in-do-while-never-reached/0-opt.spvasm
@@ -0,0 +1,97 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+       %main = OpFunction %void None %9
+         %24 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+               OpStore %a %int_1
+               OpBranch %25
+         %25 = OpLabel
+               OpLoopMerge %26 %27 None
+               OpBranch %28
+         %28 = OpLabel
+         %29 = OpLoad %int %a
+         %30 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %31 = OpLoad %int %30
+         %32 = OpSGreaterThanEqual %bool %29 %31
+               OpSelectionMerge %33 None
+               OpBranchConditional %32 %34 %33
+         %34 = OpLabel
+               OpBranch %26
+         %33 = OpLabel
+               OpSelectionMerge %35 None
+               OpBranchConditional %true %36 %35
+         %36 = OpLabel
+               OpKill
+         %35 = OpLabel
+         %37 = OpLoad %int %a
+         %38 = OpIAdd %int %37 %int_1
+               OpStore %a %38
+               OpBranch %27
+         %27 = OpLabel
+         %39 = OpLoad %int %a
+         %40 = OpINotEqual %bool %39 %int_1
+               OpBranchConditional %40 %25 %26
+         %26 = OpLabel
+         %41 = OpLoad %int %a
+         %42 = OpIEqual %bool %41 %int_1
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %45
+         %44 = OpLabel
+         %46 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %47 = OpLoad %int %46
+         %48 = OpConvertSToF %float %47
+         %49 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %50 = OpLoad %int %49
+         %51 = OpConvertSToF %float %50
+         %52 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %53 = OpLoad %int %52
+         %54 = OpConvertSToF %float %53
+         %55 = OpCompositeConstruct %v4float %float_1 %48 %51 %54
+               OpStore %_GLF_color %55
+               OpBranch %43
+         %45 = OpLabel
+         %56 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %57 = OpLoad %int %56
+         %58 = OpConvertSToF %float %57
+         %59 = OpCompositeConstruct %v4float %58 %58 %58 %58
+               OpStore %_GLF_color %59
+               OpBranch %43
+         %43 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-true-discard-in-do-while-never-reached/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-if-true-discard-in-do-while-never-reached/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..5317e21
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-true-discard-in-do-while-never-reached/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,55 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  a = 1;
+  while (true) {
+    const int x_29 = a;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_31 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_29 >= x_31)) {
+      break;
+    }
+    if (true) {
+      discard;
+    }
+    a = (a + 1);
+    {
+      if ((a != 1)) {
+      } else {
+        break;
+      }
+    }
+  }
+  if ((a == 1)) {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_47 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_50 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_53 = asint(x_6[1].x);
+    x_GLF_color = float4(1.0f, float(x_47), float(x_50), float(x_53));
+  } else {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_57 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const float x_58 = float(x_57);
+    x_GLF_color = float4(x_58, x_58, x_58, x_58);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-true-discard-in-do-while-never-reached/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-if-true-discard-in-do-while-never-reached/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..6aa0157
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-true-discard-in-do-while-never-reached/0-opt.spvasm.expected.msl
@@ -0,0 +1,64 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int a = 0;
+  a = 1;
+  while (true) {
+    int const x_29 = a;
+    int const x_31 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_29 >= x_31)) {
+      break;
+    }
+    if (true) {
+      discard_fragment();
+    }
+    int const x_37 = a;
+    a = (x_37 + 1);
+    {
+      int const x_39 = a;
+      if ((x_39 != 1)) {
+      } else {
+        break;
+      }
+    }
+  }
+  int const x_41 = a;
+  if ((x_41 == 1)) {
+    int const x_47 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_50 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_53 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(1.0f, float(x_47), float(x_50), float(x_53));
+  } else {
+    int const x_57 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    float const x_58 = float(x_57);
+    *(tint_symbol_4) = float4(x_58, x_58, x_58, x_58);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-true-discard-in-do-while-never-reached/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-if-true-discard-in-do-while-never-reached/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..d01a3ec
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-true-discard-in-do-while-never-reached/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,142 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 79
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+      %int_1 = OpConstant %int 1
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+         %67 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+               OpStore %a %int_1
+               OpBranch %23
+         %23 = OpLabel
+               OpLoopMerge %24 %25 None
+               OpBranch %26
+         %26 = OpLabel
+         %27 = OpLoad %int %a
+         %31 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %32 = OpLoad %int %31
+         %33 = OpSGreaterThanEqual %bool %27 %32
+               OpSelectionMerge %35 None
+               OpBranchConditional %33 %36 %35
+         %36 = OpLabel
+               OpBranch %24
+         %35 = OpLabel
+               OpSelectionMerge %38 None
+               OpBranchConditional %true %39 %38
+         %39 = OpLabel
+               OpKill
+         %38 = OpLabel
+         %40 = OpLoad %int %a
+         %41 = OpIAdd %int %40 %int_1
+               OpStore %a %41
+               OpBranch %25
+         %25 = OpLabel
+         %42 = OpLoad %int %a
+         %43 = OpINotEqual %bool %42 %int_1
+               OpSelectionMerge %44 None
+               OpBranchConditional %43 %45 %46
+         %45 = OpLabel
+               OpBranch %44
+         %46 = OpLabel
+               OpBranch %24
+         %44 = OpLabel
+               OpBranch %23
+         %24 = OpLabel
+         %47 = OpLoad %int %a
+         %48 = OpIEqual %bool %47 %int_1
+               OpSelectionMerge %49 None
+               OpBranchConditional %48 %50 %51
+         %50 = OpLabel
+         %52 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %53 = OpLoad %int %52
+         %54 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %55 = OpLoad %int %54
+         %56 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %57 = OpLoad %int %56
+         %59 = OpConvertSToF %float %53
+         %60 = OpConvertSToF %float %55
+         %61 = OpConvertSToF %float %57
+         %62 = OpCompositeConstruct %v4float %float_1 %59 %60 %61
+               OpStore %x_GLF_color %62
+               OpBranch %49
+         %51 = OpLabel
+         %63 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %64 = OpLoad %int %63
+         %65 = OpConvertSToF %float %64
+         %66 = OpCompositeConstruct %v4float %65 %65 %65 %65
+               OpStore %x_GLF_color %66
+               OpBranch %49
+         %49 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %67
+%tint_symbol = OpFunctionParameter %main_out
+         %71 = OpLabel
+         %72 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %72
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %74 = OpLabel
+         %75 = OpFunctionCall %void %main_1
+         %77 = OpLoad %v4float %x_GLF_color
+         %78 = OpCompositeConstruct %main_out %77
+         %76 = OpFunctionCall %void %tint_symbol_2 %78
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 25[%25] is not post dominated by the back-edge block 44[%44]
+  %44 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-true-discard-in-do-while-never-reached/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-if-true-discard-in-do-while-never-reached/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..80683f1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-true-discard-in-do-while-never-reached/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,58 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  a = 1;
+  loop {
+    let x_29 : i32 = a;
+    let x_31 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_29 >= x_31)) {
+      break;
+    }
+    if (true) {
+      discard;
+    }
+    let x_37 : i32 = a;
+    a = (x_37 + 1);
+
+    continuing {
+      let x_39 : i32 = a;
+      if ((x_39 != 1)) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_41 : i32 = a;
+  if ((x_41 == 1)) {
+    let x_47 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_50 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_53 : i32 = x_6.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(1.0, f32(x_47), f32(x_50), f32(x_53));
+  } else {
+    let x_57 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_58 : f32 = f32(x_57);
+    x_GLF_color = vec4<f32>(x_58, x_58, x_58, x_58);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-true-discard-in-do-while-never-reached/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-if-true-discard-in-do-while-never-reached/0-opt.wgsl
new file mode 100644
index 0000000..80683f1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-true-discard-in-do-while-never-reached/0-opt.wgsl
@@ -0,0 +1,58 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  a = 1;
+  loop {
+    let x_29 : i32 = a;
+    let x_31 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_29 >= x_31)) {
+      break;
+    }
+    if (true) {
+      discard;
+    }
+    let x_37 : i32 = a;
+    a = (x_37 + 1);
+
+    continuing {
+      let x_39 : i32 = a;
+      if ((x_39 != 1)) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_41 : i32 = a;
+  if ((x_41 == 1)) {
+    let x_47 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_50 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_53 : i32 = x_6.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(1.0, f32(x_47), f32(x_50), f32(x_53));
+  } else {
+    let x_57 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_58 : f32 = f32(x_57);
+    x_GLF_color = vec4<f32>(x_58, x_58, x_58, x_58);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-true-discard-in-do-while-never-reached/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-if-true-discard-in-do-while-never-reached/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..5317e21
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-true-discard-in-do-while-never-reached/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,55 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  a = 1;
+  while (true) {
+    const int x_29 = a;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_31 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_29 >= x_31)) {
+      break;
+    }
+    if (true) {
+      discard;
+    }
+    a = (a + 1);
+    {
+      if ((a != 1)) {
+      } else {
+        break;
+      }
+    }
+  }
+  if ((a == 1)) {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_47 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_50 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_53 = asint(x_6[1].x);
+    x_GLF_color = float4(1.0f, float(x_47), float(x_50), float(x_53));
+  } else {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_57 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const float x_58 = float(x_57);
+    x_GLF_color = float4(x_58, x_58, x_58, x_58);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-true-discard-in-do-while-never-reached/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-if-true-discard-in-do-while-never-reached/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..6aa0157
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-true-discard-in-do-while-never-reached/0-opt.wgsl.expected.msl
@@ -0,0 +1,64 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int a = 0;
+  a = 1;
+  while (true) {
+    int const x_29 = a;
+    int const x_31 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_29 >= x_31)) {
+      break;
+    }
+    if (true) {
+      discard_fragment();
+    }
+    int const x_37 = a;
+    a = (x_37 + 1);
+    {
+      int const x_39 = a;
+      if ((x_39 != 1)) {
+      } else {
+        break;
+      }
+    }
+  }
+  int const x_41 = a;
+  if ((x_41 == 1)) {
+    int const x_47 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_50 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_53 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(1.0f, float(x_47), float(x_50), float(x_53));
+  } else {
+    int const x_57 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    float const x_58 = float(x_57);
+    *(tint_symbol_4) = float4(x_58, x_58, x_58, x_58);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-true-discard-in-do-while-never-reached/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-if-true-discard-in-do-while-never-reached/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..d01a3ec
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-true-discard-in-do-while-never-reached/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,142 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 79
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+      %int_1 = OpConstant %int 1
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+         %67 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+               OpStore %a %int_1
+               OpBranch %23
+         %23 = OpLabel
+               OpLoopMerge %24 %25 None
+               OpBranch %26
+         %26 = OpLabel
+         %27 = OpLoad %int %a
+         %31 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %32 = OpLoad %int %31
+         %33 = OpSGreaterThanEqual %bool %27 %32
+               OpSelectionMerge %35 None
+               OpBranchConditional %33 %36 %35
+         %36 = OpLabel
+               OpBranch %24
+         %35 = OpLabel
+               OpSelectionMerge %38 None
+               OpBranchConditional %true %39 %38
+         %39 = OpLabel
+               OpKill
+         %38 = OpLabel
+         %40 = OpLoad %int %a
+         %41 = OpIAdd %int %40 %int_1
+               OpStore %a %41
+               OpBranch %25
+         %25 = OpLabel
+         %42 = OpLoad %int %a
+         %43 = OpINotEqual %bool %42 %int_1
+               OpSelectionMerge %44 None
+               OpBranchConditional %43 %45 %46
+         %45 = OpLabel
+               OpBranch %44
+         %46 = OpLabel
+               OpBranch %24
+         %44 = OpLabel
+               OpBranch %23
+         %24 = OpLabel
+         %47 = OpLoad %int %a
+         %48 = OpIEqual %bool %47 %int_1
+               OpSelectionMerge %49 None
+               OpBranchConditional %48 %50 %51
+         %50 = OpLabel
+         %52 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %53 = OpLoad %int %52
+         %54 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %55 = OpLoad %int %54
+         %56 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %57 = OpLoad %int %56
+         %59 = OpConvertSToF %float %53
+         %60 = OpConvertSToF %float %55
+         %61 = OpConvertSToF %float %57
+         %62 = OpCompositeConstruct %v4float %float_1 %59 %60 %61
+               OpStore %x_GLF_color %62
+               OpBranch %49
+         %51 = OpLabel
+         %63 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %64 = OpLoad %int %63
+         %65 = OpConvertSToF %float %64
+         %66 = OpCompositeConstruct %v4float %65 %65 %65 %65
+               OpStore %x_GLF_color %66
+               OpBranch %49
+         %49 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %67
+%tint_symbol = OpFunctionParameter %main_out
+         %71 = OpLabel
+         %72 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %72
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %74 = OpLabel
+         %75 = OpFunctionCall %void %main_1
+         %77 = OpLoad %v4float %x_GLF_color
+         %78 = OpCompositeConstruct %main_out %77
+         %76 = OpFunctionCall %void %tint_symbol_2 %78
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 25[%25] is not post dominated by the back-edge block 44[%44]
+  %44 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-if-true-discard-in-do-while-never-reached/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-if-true-discard-in-do-while-never-reached/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..80683f1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-if-true-discard-in-do-while-never-reached/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,58 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  a = 1;
+  loop {
+    let x_29 : i32 = a;
+    let x_31 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_29 >= x_31)) {
+      break;
+    }
+    if (true) {
+      discard;
+    }
+    let x_37 : i32 = a;
+    a = (x_37 + 1);
+
+    continuing {
+      let x_39 : i32 = a;
+      if ((x_39 != 1)) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_41 : i32 = a;
+  if ((x_41 == 1)) {
+    let x_47 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_50 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_53 : i32 = x_6.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(1.0, f32(x_47), f32(x_50), f32(x_53));
+  } else {
+    let x_57 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_58 : f32 = f32(x_57);
+    x_GLF_color = vec4<f32>(x_58, x_58, x_58, x_58);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inc-inside-switch-and-for/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inc-inside-switch-and-for/0-opt.spvasm
new file mode 100644
index 0000000..d7e3f85
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inc-inside-switch-and-for/0-opt.spvasm
@@ -0,0 +1,86 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "three"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %int_7 = OpConstant %int 7
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %24 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %25 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %9
+         %26 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+               OpStore %a %int_0
+               OpStore %i %int_0
+               OpBranch %27
+         %27 = OpLabel
+               OpLoopMerge %28 %29 None
+               OpBranch %30
+         %30 = OpLabel
+         %31 = OpLoad %int %i
+         %32 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %33 = OpLoad %int %32
+         %34 = OpIAdd %int %int_7 %33
+         %35 = OpSLessThan %bool %31 %34
+               OpBranchConditional %35 %36 %28
+         %36 = OpLabel
+         %37 = OpLoad %int %i
+               OpSelectionMerge %38 None
+               OpSwitch %37 %38 7 %39 8 %39
+         %39 = OpLabel
+         %40 = OpLoad %int %a
+         %41 = OpIAdd %int %40 %int_1
+               OpStore %a %41
+               OpBranch %38
+         %38 = OpLabel
+               OpBranch %29
+         %29 = OpLabel
+         %42 = OpLoad %int %i
+         %43 = OpIAdd %int %42 %int_1
+               OpStore %i %43
+               OpBranch %27
+         %28 = OpLabel
+         %44 = OpLoad %int %a
+         %45 = OpIEqual %bool %44 %int_2
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %48
+         %47 = OpLabel
+               OpStore %_GLF_color %24
+               OpBranch %46
+         %48 = OpLabel
+               OpStore %_GLF_color %25
+               OpBranch %46
+         %46 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inc-inside-switch-and-for/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inc-inside-switch-and-for/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..3ac8a37
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inc-inside-switch-and-for/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,52 @@
+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() {
+  int a = 0;
+  int i = 0;
+  a = 0;
+  i = 0;
+  while (true) {
+    const int x_31 = i;
+    const int x_33 = asint(x_7[0].x);
+    if ((x_31 < (7 + x_33))) {
+    } else {
+      break;
+    }
+    switch(i) {
+      case 7:
+      case 8: {
+        a = (a + 1);
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  if ((a == 2)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inc-inside-switch-and-for/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inc-inside-switch-and-for/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..b25d714
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inc-inside-switch-and-for/0-opt.spvasm.expected.msl
@@ -0,0 +1,59 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int three;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int i = 0;
+  a = 0;
+  i = 0;
+  while (true) {
+    int const x_31 = i;
+    int const x_33 = x_7.three;
+    if ((x_31 < (7 + x_33))) {
+    } else {
+      break;
+    }
+    int const x_37 = i;
+    switch(x_37) {
+      case 7:
+      case 8: {
+        int const x_40 = a;
+        a = (x_40 + 1);
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    {
+      int const x_42 = i;
+      i = (x_42 + 1);
+    }
+  }
+  int const x_44 = a;
+  if ((x_44 == 2)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inc-inside-switch-and-for/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inc-inside-switch-and-for/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..5e511e0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inc-inside-switch-and-for/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,127 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 69
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "three"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_7 = OpConstant %int 7
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %55 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %56 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %57 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %18
+          %i = OpVariable %_ptr_Function_int Function %18
+               OpStore %a %int_0
+               OpStore %i %int_0
+               OpBranch %21
+         %21 = OpLabel
+               OpLoopMerge %22 %23 None
+               OpBranch %24
+         %24 = OpLabel
+         %25 = OpLoad %int %i
+         %29 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %30 = OpLoad %int %29
+         %32 = OpIAdd %int %int_7 %30
+         %33 = OpSLessThan %bool %25 %32
+               OpSelectionMerge %35 None
+               OpBranchConditional %33 %36 %37
+         %36 = OpLabel
+               OpBranch %35
+         %37 = OpLabel
+               OpBranch %22
+         %35 = OpLabel
+         %38 = OpLoad %int %i
+               OpSelectionMerge %39 None
+               OpSwitch %38 %40 7 %41 8 %41
+         %41 = OpLabel
+         %42 = OpLoad %int %a
+         %44 = OpIAdd %int %42 %int_1
+               OpStore %a %44
+               OpBranch %39
+         %40 = OpLabel
+               OpBranch %39
+         %39 = OpLabel
+               OpBranch %23
+         %23 = OpLabel
+         %45 = OpLoad %int %i
+         %46 = OpIAdd %int %45 %int_1
+               OpStore %i %46
+               OpBranch %21
+         %22 = OpLabel
+         %47 = OpLoad %int %a
+         %49 = OpIEqual %bool %47 %int_2
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %52
+         %51 = OpLabel
+               OpStore %x_GLF_color %55
+               OpBranch %50
+         %52 = OpLabel
+               OpStore %x_GLF_color %56
+               OpBranch %50
+         %50 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %57
+%tint_symbol = OpFunctionParameter %main_out
+         %61 = OpLabel
+         %62 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %62
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %64 = OpLabel
+         %65 = OpFunctionCall %void %main_1
+         %67 = OpLoad %v4float %x_GLF_color
+         %68 = OpCompositeConstruct %main_out %67
+         %66 = OpFunctionCall %void %tint_symbol_2 %68
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inc-inside-switch-and-for/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inc-inside-switch-and-for/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..1a774f6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inc-inside-switch-and-for/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,55 @@
+[[block]]
+struct buf0 {
+  three : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  a = 0;
+  i = 0;
+  loop {
+    let x_31 : i32 = i;
+    let x_33 : i32 = x_7.three;
+    if ((x_31 < (7 + x_33))) {
+    } else {
+      break;
+    }
+    let x_37 : i32 = i;
+    switch(x_37) {
+      case 7, 8: {
+        let x_40 : i32 = a;
+        a = (x_40 + 1);
+      }
+      default: {
+      }
+    }
+
+    continuing {
+      let x_42 : i32 = i;
+      i = (x_42 + 1);
+    }
+  }
+  let x_44 : i32 = a;
+  if ((x_44 == 2)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inc-inside-switch-and-for/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inc-inside-switch-and-for/0-opt.wgsl
new file mode 100644
index 0000000..1a774f6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inc-inside-switch-and-for/0-opt.wgsl
@@ -0,0 +1,55 @@
+[[block]]
+struct buf0 {
+  three : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  a = 0;
+  i = 0;
+  loop {
+    let x_31 : i32 = i;
+    let x_33 : i32 = x_7.three;
+    if ((x_31 < (7 + x_33))) {
+    } else {
+      break;
+    }
+    let x_37 : i32 = i;
+    switch(x_37) {
+      case 7, 8: {
+        let x_40 : i32 = a;
+        a = (x_40 + 1);
+      }
+      default: {
+      }
+    }
+
+    continuing {
+      let x_42 : i32 = i;
+      i = (x_42 + 1);
+    }
+  }
+  let x_44 : i32 = a;
+  if ((x_44 == 2)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inc-inside-switch-and-for/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inc-inside-switch-and-for/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..3ac8a37
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inc-inside-switch-and-for/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,52 @@
+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() {
+  int a = 0;
+  int i = 0;
+  a = 0;
+  i = 0;
+  while (true) {
+    const int x_31 = i;
+    const int x_33 = asint(x_7[0].x);
+    if ((x_31 < (7 + x_33))) {
+    } else {
+      break;
+    }
+    switch(i) {
+      case 7:
+      case 8: {
+        a = (a + 1);
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  if ((a == 2)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inc-inside-switch-and-for/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inc-inside-switch-and-for/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..b25d714
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inc-inside-switch-and-for/0-opt.wgsl.expected.msl
@@ -0,0 +1,59 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int three;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int i = 0;
+  a = 0;
+  i = 0;
+  while (true) {
+    int const x_31 = i;
+    int const x_33 = x_7.three;
+    if ((x_31 < (7 + x_33))) {
+    } else {
+      break;
+    }
+    int const x_37 = i;
+    switch(x_37) {
+      case 7:
+      case 8: {
+        int const x_40 = a;
+        a = (x_40 + 1);
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    {
+      int const x_42 = i;
+      i = (x_42 + 1);
+    }
+  }
+  int const x_44 = a;
+  if ((x_44 == 2)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inc-inside-switch-and-for/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inc-inside-switch-and-for/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..5e511e0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inc-inside-switch-and-for/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,127 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 69
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "three"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_7 = OpConstant %int 7
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %55 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %56 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %57 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %18
+          %i = OpVariable %_ptr_Function_int Function %18
+               OpStore %a %int_0
+               OpStore %i %int_0
+               OpBranch %21
+         %21 = OpLabel
+               OpLoopMerge %22 %23 None
+               OpBranch %24
+         %24 = OpLabel
+         %25 = OpLoad %int %i
+         %29 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %30 = OpLoad %int %29
+         %32 = OpIAdd %int %int_7 %30
+         %33 = OpSLessThan %bool %25 %32
+               OpSelectionMerge %35 None
+               OpBranchConditional %33 %36 %37
+         %36 = OpLabel
+               OpBranch %35
+         %37 = OpLabel
+               OpBranch %22
+         %35 = OpLabel
+         %38 = OpLoad %int %i
+               OpSelectionMerge %39 None
+               OpSwitch %38 %40 7 %41 8 %41
+         %41 = OpLabel
+         %42 = OpLoad %int %a
+         %44 = OpIAdd %int %42 %int_1
+               OpStore %a %44
+               OpBranch %39
+         %40 = OpLabel
+               OpBranch %39
+         %39 = OpLabel
+               OpBranch %23
+         %23 = OpLabel
+         %45 = OpLoad %int %i
+         %46 = OpIAdd %int %45 %int_1
+               OpStore %i %46
+               OpBranch %21
+         %22 = OpLabel
+         %47 = OpLoad %int %a
+         %49 = OpIEqual %bool %47 %int_2
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %52
+         %51 = OpLabel
+               OpStore %x_GLF_color %55
+               OpBranch %50
+         %52 = OpLabel
+               OpStore %x_GLF_color %56
+               OpBranch %50
+         %50 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %57
+%tint_symbol = OpFunctionParameter %main_out
+         %61 = OpLabel
+         %62 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %62
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %64 = OpLabel
+         %65 = OpFunctionCall %void %main_1
+         %67 = OpLoad %v4float %x_GLF_color
+         %68 = OpCompositeConstruct %main_out %67
+         %66 = OpFunctionCall %void %tint_symbol_2 %68
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inc-inside-switch-and-for/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inc-inside-switch-and-for/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..1a774f6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inc-inside-switch-and-for/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,55 @@
+[[block]]
+struct buf0 {
+  three : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  a = 0;
+  i = 0;
+  loop {
+    let x_31 : i32 = i;
+    let x_33 : i32 = x_7.three;
+    if ((x_31 < (7 + x_33))) {
+    } else {
+      break;
+    }
+    let x_37 : i32 = i;
+    switch(x_37) {
+      case 7, 8: {
+        let x_40 : i32 = a;
+        a = (x_40 + 1);
+      }
+      default: {
+      }
+    }
+
+    continuing {
+      let x_42 : i32 = i;
+      i = (x_42 + 1);
+    }
+  }
+  let x_44 : i32 = a;
+  if ((x_44 == 2)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-array-element-in-loop/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-increment-array-element-in-loop/0-opt.spvasm
new file mode 100644
index 0000000..475f280
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-array-element-in-loop/0-opt.spvasm
@@ -0,0 +1,147 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %arr "arr"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_3_0 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+%_ptr_Function__arr_float_uint_3 = OpTypePointer Function %_arr_float_uint_3
+%_arr_float_uint_3_0 = OpTypeArray %float %uint_3
+       %buf1 = OpTypeStruct %_arr_float_uint_3_0
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_2 = OpConstant %int 2
+%_ptr_Function_int = OpTypePointer Function %int
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+%_ptr_Function_float = OpTypePointer Function %float
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %13
+         %32 = OpLabel
+        %arr = OpVariable %_ptr_Function__arr_float_uint_3 Function
+          %a = OpVariable %_ptr_Function_int Function
+         %33 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %34 = OpLoad %float %33
+         %35 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %36 = OpLoad %float %35
+         %37 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %38 = OpLoad %float %37
+         %39 = OpCompositeConstruct %_arr_float_uint_3 %34 %36 %38
+               OpStore %arr %39
+               OpStore %a %int_0
+               OpBranch %40
+         %40 = OpLabel
+               OpLoopMerge %41 %42 None
+               OpBranch %43
+         %43 = OpLabel
+         %44 = OpLoad %int %a
+         %45 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %46 = OpLoad %int %45
+         %47 = OpSLessThanEqual %bool %44 %46
+               OpBranchConditional %47 %48 %41
+         %48 = OpLabel
+         %49 = OpLoad %int %a
+         %50 = OpIAdd %int %49 %int_1
+               OpStore %a %50
+         %51 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %52 = OpLoad %float %51
+         %53 = OpAccessChain %_ptr_Function_float %arr %49
+               OpStore %53 %52
+               OpBranch %42
+         %42 = OpLabel
+               OpBranch %40
+         %41 = OpLabel
+         %54 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %55 = OpLoad %int %54
+         %56 = OpAccessChain %_ptr_Function_float %arr %55
+         %57 = OpLoad %float %56
+         %58 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %59 = OpLoad %float %58
+         %60 = OpFOrdEqual %bool %57 %59
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %61
+         %62 = OpLabel
+         %63 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %64 = OpLoad %int %63
+         %65 = OpAccessChain %_ptr_Function_float %arr %64
+         %66 = OpLoad %float %65
+         %67 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %68 = OpLoad %float %67
+         %69 = OpFOrdEqual %bool %66 %68
+               OpBranch %61
+         %61 = OpLabel
+         %70 = OpPhi %bool %60 %41 %69 %62
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %71
+         %72 = OpLabel
+         %73 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %74 = OpLoad %int %73
+         %75 = OpAccessChain %_ptr_Function_float %arr %74
+         %76 = OpLoad %float %75
+         %77 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %78 = OpLoad %float %77
+         %79 = OpFOrdEqual %bool %76 %78
+               OpBranch %71
+         %71 = OpLabel
+         %80 = OpPhi %bool %70 %61 %79 %72
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %83
+         %82 = OpLabel
+         %84 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %85 = OpLoad %int %84
+         %86 = OpAccessChain %_ptr_Function_float %arr %85
+         %87 = OpLoad %float %86
+         %88 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %89 = OpLoad %float %88
+         %90 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %91 = OpLoad %float %90
+         %92 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %93 = OpLoad %float %92
+         %94 = OpCompositeConstruct %v4float %87 %89 %91 %93
+               OpStore %_GLF_color %94
+               OpBranch %81
+         %83 = OpLabel
+         %95 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %96 = OpLoad %float %95
+         %97 = OpCompositeConstruct %v4float %96 %96 %96 %96
+               OpStore %_GLF_color %97
+               OpBranch %81
+         %81 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-array-element-in-loop/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-array-element-in-loop/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..9e41aaa
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-array-element-in-loop/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,87 @@
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[3];
+};
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float arr[3] = (float[3])0;
+  int a = 0;
+  bool x_69 = false;
+  bool x_79 = false;
+  bool x_70_phi = false;
+  bool x_80_phi = false;
+  const float x_34 = asfloat(x_6[1].x);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_36 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const float x_38 = asfloat(x_6[2].x);
+  const float tint_symbol_4[3] = {x_34, x_36, x_38};
+  arr = tint_symbol_4;
+  a = 0;
+  while (true) {
+    const int x_44 = a;
+    const int x_46 = asint(x_9[1].x);
+    if ((x_44 <= x_46)) {
+    } else {
+      break;
+    }
+    const int x_49 = a;
+    a = (x_49 + 1);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const float x_52 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    arr[x_49] = x_52;
+  }
+  const int x_55 = asint(x_9[1].x);
+  const float x_57 = arr[x_55];
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const float x_59 = asfloat(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  const bool x_60 = (x_57 == x_59);
+  x_70_phi = x_60;
+  if (x_60) {
+    const int x_64 = asint(x_9[2].x);
+    const float x_66 = arr[x_64];
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const float x_68 = asfloat(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    x_69 = (x_66 == x_68);
+    x_70_phi = x_69;
+  }
+  const bool x_70 = x_70_phi;
+  x_80_phi = x_70;
+  if (x_70) {
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_74 = asint(x_9[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const float x_76 = arr[x_74];
+    const float x_78 = asfloat(x_6[2].x);
+    x_79 = (x_76 == x_78);
+    x_80_phi = x_79;
+  }
+  if (x_80_phi) {
+    const int x_85 = asint(x_9[1].x);
+    const float x_87 = arr[x_85];
+    const float x_89 = asfloat(x_6[1].x);
+    const float x_91 = asfloat(x_6[1].x);
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const float x_93 = asfloat(x_6[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    x_GLF_color = float4(x_87, x_89, x_91, x_93);
+  } else {
+    const float x_96 = asfloat(x_6[1].x);
+    x_GLF_color = float4(x_96, x_96, x_96, x_96);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-array-element-in-loop/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-increment-array-element-in-loop/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..28fc564
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-array-element-in-loop/0-opt.spvasm.expected.msl
@@ -0,0 +1,102 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_2 {
+  float arr[3];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_9, thread float4* const tint_symbol_5) {
+  tint_array_wrapper_2 arr = {};
+  int a = 0;
+  bool x_69 = false;
+  bool x_79 = false;
+  bool x_70_phi = false;
+  bool x_80_phi = false;
+  float const x_34 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  float const x_36 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_38 = x_6.x_GLF_uniform_float_values.arr[2].el;
+  tint_array_wrapper_2 const tint_symbol_3 = {.arr={x_34, x_36, x_38}};
+  arr = tint_symbol_3;
+  a = 0;
+  while (true) {
+    int const x_44 = a;
+    int const x_46 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    if ((x_44 <= x_46)) {
+    } else {
+      break;
+    }
+    int const x_49 = a;
+    a = (x_49 + 1);
+    float const x_52 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    arr.arr[x_49] = x_52;
+  }
+  int const x_55 = x_9.x_GLF_uniform_int_values.arr[1].el;
+  float const x_57 = arr.arr[x_55];
+  float const x_59 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  bool const x_60 = (x_57 == x_59);
+  x_70_phi = x_60;
+  if (x_60) {
+    int const x_64 = x_9.x_GLF_uniform_int_values.arr[2].el;
+    float const x_66 = arr.arr[x_64];
+    float const x_68 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    x_69 = (x_66 == x_68);
+    x_70_phi = x_69;
+  }
+  bool const x_70 = x_70_phi;
+  x_80_phi = x_70;
+  if (x_70) {
+    int const x_74 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    float const x_76 = arr.arr[x_74];
+    float const x_78 = x_6.x_GLF_uniform_float_values.arr[2].el;
+    x_79 = (x_76 == x_78);
+    x_80_phi = x_79;
+  }
+  bool const x_80 = x_80_phi;
+  if (x_80) {
+    int const x_85 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    float const x_87 = arr.arr[x_85];
+    float const x_89 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    float const x_91 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    float const x_93 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    *(tint_symbol_5) = float4(x_87, x_89, x_91, x_93);
+  } else {
+    float const x_96 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    *(tint_symbol_5) = float4(x_96, x_96, x_96, x_96);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-array-element-in-loop/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-increment-array-element-in-loop/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..9d4d51a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-array-element-in-loop/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,206 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 125
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %arr "arr"
+               OpName %a "a"
+               OpName %x_69 "x_69"
+               OpName %x_79 "x_79"
+               OpName %x_70_phi "x_70_phi"
+               OpName %x_80_phi "x_80_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_float_uint_3_0 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf1 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %16
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_arr_float_uint_3_0 = OpTypeArray %float %uint_3
+%_ptr_Function__arr_float_uint_3_0 = OpTypePointer Function %_arr_float_uint_3_0
+         %26 = OpConstantNull %_arr_float_uint_3_0
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %33 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_float = OpTypePointer Function %float
+   %main_out = OpTypeStruct %v4float
+        %113 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+        %arr = OpVariable %_ptr_Function__arr_float_uint_3_0 Function %26
+          %a = OpVariable %_ptr_Function_int Function %29
+       %x_69 = OpVariable %_ptr_Function_bool Function %33
+       %x_79 = OpVariable %_ptr_Function_bool Function %33
+   %x_70_phi = OpVariable %_ptr_Function_bool Function %33
+   %x_80_phi = OpVariable %_ptr_Function_bool Function %33
+         %40 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %41 = OpLoad %float %40
+         %43 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %44 = OpLoad %float %43
+         %46 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %47 = OpLoad %float %46
+         %48 = OpCompositeConstruct %_arr_float_uint_3_0 %41 %44 %47
+               OpStore %arr %48
+               OpStore %a %int_0
+               OpBranch %49
+         %49 = OpLabel
+               OpLoopMerge %50 %51 None
+               OpBranch %52
+         %52 = OpLabel
+         %53 = OpLoad %int %a
+         %55 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %56 = OpLoad %int %55
+         %57 = OpSLessThanEqual %bool %53 %56
+               OpSelectionMerge %58 None
+               OpBranchConditional %57 %59 %60
+         %59 = OpLabel
+               OpBranch %58
+         %60 = OpLabel
+               OpBranch %50
+         %58 = OpLabel
+         %61 = OpLoad %int %a
+         %62 = OpIAdd %int %61 %int_1
+               OpStore %a %62
+         %63 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %64 = OpLoad %float %63
+         %66 = OpAccessChain %_ptr_Function_float %arr %61
+               OpStore %66 %64
+               OpBranch %51
+         %51 = OpLabel
+               OpBranch %49
+         %50 = OpLabel
+         %67 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %68 = OpLoad %int %67
+         %69 = OpAccessChain %_ptr_Function_float %arr %68
+         %70 = OpLoad %float %69
+         %71 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %72 = OpLoad %float %71
+         %73 = OpFOrdEqual %bool %70 %72
+               OpStore %x_70_phi %73
+               OpSelectionMerge %74 None
+               OpBranchConditional %73 %75 %74
+         %75 = OpLabel
+         %76 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_2
+         %77 = OpLoad %int %76
+         %78 = OpAccessChain %_ptr_Function_float %arr %77
+         %79 = OpLoad %float %78
+         %80 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %81 = OpLoad %float %80
+         %82 = OpFOrdEqual %bool %79 %81
+               OpStore %x_69 %82
+         %83 = OpLoad %bool %x_69
+               OpStore %x_70_phi %83
+               OpBranch %74
+         %74 = OpLabel
+         %84 = OpLoad %bool %x_70_phi
+               OpStore %x_80_phi %84
+               OpSelectionMerge %85 None
+               OpBranchConditional %84 %86 %85
+         %86 = OpLabel
+         %87 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %88 = OpLoad %int %87
+         %89 = OpAccessChain %_ptr_Function_float %arr %88
+         %90 = OpLoad %float %89
+         %91 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %92 = OpLoad %float %91
+         %93 = OpFOrdEqual %bool %90 %92
+               OpStore %x_79 %93
+         %94 = OpLoad %bool %x_79
+               OpStore %x_80_phi %94
+               OpBranch %85
+         %85 = OpLabel
+         %95 = OpLoad %bool %x_80_phi
+               OpSelectionMerge %96 None
+               OpBranchConditional %95 %97 %98
+         %97 = OpLabel
+         %99 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+        %100 = OpLoad %int %99
+        %101 = OpAccessChain %_ptr_Function_float %arr %100
+        %102 = OpLoad %float %101
+        %103 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+        %104 = OpLoad %float %103
+        %105 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+        %106 = OpLoad %float %105
+        %107 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+        %108 = OpLoad %float %107
+        %109 = OpCompositeConstruct %v4float %102 %104 %106 %108
+               OpStore %x_GLF_color %109
+               OpBranch %96
+         %98 = OpLabel
+        %110 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+        %111 = OpLoad %float %110
+        %112 = OpCompositeConstruct %v4float %111 %111 %111 %111
+               OpStore %x_GLF_color %112
+               OpBranch %96
+         %96 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %113
+%tint_symbol = OpFunctionParameter %main_out
+        %117 = OpLabel
+        %118 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %118
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+        %120 = OpLabel
+        %121 = OpFunctionCall %void %main_1
+        %123 = OpLoad %v4float %x_GLF_color
+        %124 = OpCompositeConstruct %main_out %123
+        %122 = OpFunctionCall %void %tint_symbol_2 %124
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-array-element-in-loop/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-array-element-in-loop/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..dff82e2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-array-element-in-loop/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,90 @@
+type Arr = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var arr : array<f32, 3>;
+  var a : i32;
+  var x_69 : bool;
+  var x_79 : bool;
+  var x_70_phi : bool;
+  var x_80_phi : bool;
+  let x_34 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_36 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_38 : f32 = x_6.x_GLF_uniform_float_values[2];
+  arr = array<f32, 3>(x_34, x_36, x_38);
+  a = 0;
+  loop {
+    let x_44 : i32 = a;
+    let x_46 : i32 = x_9.x_GLF_uniform_int_values[1];
+    if ((x_44 <= x_46)) {
+    } else {
+      break;
+    }
+    let x_49 : i32 = a;
+    a = (x_49 + 1);
+    let x_52 : f32 = x_6.x_GLF_uniform_float_values[0];
+    arr[x_49] = x_52;
+  }
+  let x_55 : i32 = x_9.x_GLF_uniform_int_values[1];
+  let x_57 : f32 = arr[x_55];
+  let x_59 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_60 : bool = (x_57 == x_59);
+  x_70_phi = x_60;
+  if (x_60) {
+    let x_64 : i32 = x_9.x_GLF_uniform_int_values[2];
+    let x_66 : f32 = arr[x_64];
+    let x_68 : f32 = x_6.x_GLF_uniform_float_values[0];
+    x_69 = (x_66 == x_68);
+    x_70_phi = x_69;
+  }
+  let x_70 : bool = x_70_phi;
+  x_80_phi = x_70;
+  if (x_70) {
+    let x_74 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_76 : f32 = arr[x_74];
+    let x_78 : f32 = x_6.x_GLF_uniform_float_values[2];
+    x_79 = (x_76 == x_78);
+    x_80_phi = x_79;
+  }
+  let x_80 : bool = x_80_phi;
+  if (x_80) {
+    let x_85 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_87 : f32 = arr[x_85];
+    let x_89 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_91 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_93 : f32 = x_6.x_GLF_uniform_float_values[0];
+    x_GLF_color = vec4<f32>(x_87, x_89, x_91, x_93);
+  } else {
+    let x_96 : f32 = x_6.x_GLF_uniform_float_values[1];
+    x_GLF_color = vec4<f32>(x_96, x_96, x_96, x_96);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-array-element-in-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-array-element-in-loop/0-opt.wgsl
new file mode 100644
index 0000000..dff82e2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-array-element-in-loop/0-opt.wgsl
@@ -0,0 +1,90 @@
+type Arr = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var arr : array<f32, 3>;
+  var a : i32;
+  var x_69 : bool;
+  var x_79 : bool;
+  var x_70_phi : bool;
+  var x_80_phi : bool;
+  let x_34 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_36 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_38 : f32 = x_6.x_GLF_uniform_float_values[2];
+  arr = array<f32, 3>(x_34, x_36, x_38);
+  a = 0;
+  loop {
+    let x_44 : i32 = a;
+    let x_46 : i32 = x_9.x_GLF_uniform_int_values[1];
+    if ((x_44 <= x_46)) {
+    } else {
+      break;
+    }
+    let x_49 : i32 = a;
+    a = (x_49 + 1);
+    let x_52 : f32 = x_6.x_GLF_uniform_float_values[0];
+    arr[x_49] = x_52;
+  }
+  let x_55 : i32 = x_9.x_GLF_uniform_int_values[1];
+  let x_57 : f32 = arr[x_55];
+  let x_59 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_60 : bool = (x_57 == x_59);
+  x_70_phi = x_60;
+  if (x_60) {
+    let x_64 : i32 = x_9.x_GLF_uniform_int_values[2];
+    let x_66 : f32 = arr[x_64];
+    let x_68 : f32 = x_6.x_GLF_uniform_float_values[0];
+    x_69 = (x_66 == x_68);
+    x_70_phi = x_69;
+  }
+  let x_70 : bool = x_70_phi;
+  x_80_phi = x_70;
+  if (x_70) {
+    let x_74 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_76 : f32 = arr[x_74];
+    let x_78 : f32 = x_6.x_GLF_uniform_float_values[2];
+    x_79 = (x_76 == x_78);
+    x_80_phi = x_79;
+  }
+  let x_80 : bool = x_80_phi;
+  if (x_80) {
+    let x_85 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_87 : f32 = arr[x_85];
+    let x_89 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_91 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_93 : f32 = x_6.x_GLF_uniform_float_values[0];
+    x_GLF_color = vec4<f32>(x_87, x_89, x_91, x_93);
+  } else {
+    let x_96 : f32 = x_6.x_GLF_uniform_float_values[1];
+    x_GLF_color = vec4<f32>(x_96, x_96, x_96, x_96);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-array-element-in-loop/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-array-element-in-loop/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..9e41aaa
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-array-element-in-loop/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,87 @@
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[3];
+};
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float arr[3] = (float[3])0;
+  int a = 0;
+  bool x_69 = false;
+  bool x_79 = false;
+  bool x_70_phi = false;
+  bool x_80_phi = false;
+  const float x_34 = asfloat(x_6[1].x);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_36 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const float x_38 = asfloat(x_6[2].x);
+  const float tint_symbol_4[3] = {x_34, x_36, x_38};
+  arr = tint_symbol_4;
+  a = 0;
+  while (true) {
+    const int x_44 = a;
+    const int x_46 = asint(x_9[1].x);
+    if ((x_44 <= x_46)) {
+    } else {
+      break;
+    }
+    const int x_49 = a;
+    a = (x_49 + 1);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const float x_52 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    arr[x_49] = x_52;
+  }
+  const int x_55 = asint(x_9[1].x);
+  const float x_57 = arr[x_55];
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const float x_59 = asfloat(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  const bool x_60 = (x_57 == x_59);
+  x_70_phi = x_60;
+  if (x_60) {
+    const int x_64 = asint(x_9[2].x);
+    const float x_66 = arr[x_64];
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const float x_68 = asfloat(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    x_69 = (x_66 == x_68);
+    x_70_phi = x_69;
+  }
+  const bool x_70 = x_70_phi;
+  x_80_phi = x_70;
+  if (x_70) {
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_74 = asint(x_9[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const float x_76 = arr[x_74];
+    const float x_78 = asfloat(x_6[2].x);
+    x_79 = (x_76 == x_78);
+    x_80_phi = x_79;
+  }
+  if (x_80_phi) {
+    const int x_85 = asint(x_9[1].x);
+    const float x_87 = arr[x_85];
+    const float x_89 = asfloat(x_6[1].x);
+    const float x_91 = asfloat(x_6[1].x);
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const float x_93 = asfloat(x_6[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    x_GLF_color = float4(x_87, x_89, x_91, x_93);
+  } else {
+    const float x_96 = asfloat(x_6[1].x);
+    x_GLF_color = float4(x_96, x_96, x_96, x_96);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-array-element-in-loop/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-increment-array-element-in-loop/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..28fc564
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-array-element-in-loop/0-opt.wgsl.expected.msl
@@ -0,0 +1,102 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_2 {
+  float arr[3];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_9, thread float4* const tint_symbol_5) {
+  tint_array_wrapper_2 arr = {};
+  int a = 0;
+  bool x_69 = false;
+  bool x_79 = false;
+  bool x_70_phi = false;
+  bool x_80_phi = false;
+  float const x_34 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  float const x_36 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_38 = x_6.x_GLF_uniform_float_values.arr[2].el;
+  tint_array_wrapper_2 const tint_symbol_3 = {.arr={x_34, x_36, x_38}};
+  arr = tint_symbol_3;
+  a = 0;
+  while (true) {
+    int const x_44 = a;
+    int const x_46 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    if ((x_44 <= x_46)) {
+    } else {
+      break;
+    }
+    int const x_49 = a;
+    a = (x_49 + 1);
+    float const x_52 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    arr.arr[x_49] = x_52;
+  }
+  int const x_55 = x_9.x_GLF_uniform_int_values.arr[1].el;
+  float const x_57 = arr.arr[x_55];
+  float const x_59 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  bool const x_60 = (x_57 == x_59);
+  x_70_phi = x_60;
+  if (x_60) {
+    int const x_64 = x_9.x_GLF_uniform_int_values.arr[2].el;
+    float const x_66 = arr.arr[x_64];
+    float const x_68 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    x_69 = (x_66 == x_68);
+    x_70_phi = x_69;
+  }
+  bool const x_70 = x_70_phi;
+  x_80_phi = x_70;
+  if (x_70) {
+    int const x_74 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    float const x_76 = arr.arr[x_74];
+    float const x_78 = x_6.x_GLF_uniform_float_values.arr[2].el;
+    x_79 = (x_76 == x_78);
+    x_80_phi = x_79;
+  }
+  bool const x_80 = x_80_phi;
+  if (x_80) {
+    int const x_85 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    float const x_87 = arr.arr[x_85];
+    float const x_89 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    float const x_91 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    float const x_93 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    *(tint_symbol_5) = float4(x_87, x_89, x_91, x_93);
+  } else {
+    float const x_96 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    *(tint_symbol_5) = float4(x_96, x_96, x_96, x_96);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-array-element-in-loop/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-increment-array-element-in-loop/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..9d4d51a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-array-element-in-loop/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,206 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 125
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %arr "arr"
+               OpName %a "a"
+               OpName %x_69 "x_69"
+               OpName %x_79 "x_79"
+               OpName %x_70_phi "x_70_phi"
+               OpName %x_80_phi "x_80_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_float_uint_3_0 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf1 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %16
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_arr_float_uint_3_0 = OpTypeArray %float %uint_3
+%_ptr_Function__arr_float_uint_3_0 = OpTypePointer Function %_arr_float_uint_3_0
+         %26 = OpConstantNull %_arr_float_uint_3_0
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %33 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_float = OpTypePointer Function %float
+   %main_out = OpTypeStruct %v4float
+        %113 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+        %arr = OpVariable %_ptr_Function__arr_float_uint_3_0 Function %26
+          %a = OpVariable %_ptr_Function_int Function %29
+       %x_69 = OpVariable %_ptr_Function_bool Function %33
+       %x_79 = OpVariable %_ptr_Function_bool Function %33
+   %x_70_phi = OpVariable %_ptr_Function_bool Function %33
+   %x_80_phi = OpVariable %_ptr_Function_bool Function %33
+         %40 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %41 = OpLoad %float %40
+         %43 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %44 = OpLoad %float %43
+         %46 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %47 = OpLoad %float %46
+         %48 = OpCompositeConstruct %_arr_float_uint_3_0 %41 %44 %47
+               OpStore %arr %48
+               OpStore %a %int_0
+               OpBranch %49
+         %49 = OpLabel
+               OpLoopMerge %50 %51 None
+               OpBranch %52
+         %52 = OpLabel
+         %53 = OpLoad %int %a
+         %55 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %56 = OpLoad %int %55
+         %57 = OpSLessThanEqual %bool %53 %56
+               OpSelectionMerge %58 None
+               OpBranchConditional %57 %59 %60
+         %59 = OpLabel
+               OpBranch %58
+         %60 = OpLabel
+               OpBranch %50
+         %58 = OpLabel
+         %61 = OpLoad %int %a
+         %62 = OpIAdd %int %61 %int_1
+               OpStore %a %62
+         %63 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %64 = OpLoad %float %63
+         %66 = OpAccessChain %_ptr_Function_float %arr %61
+               OpStore %66 %64
+               OpBranch %51
+         %51 = OpLabel
+               OpBranch %49
+         %50 = OpLabel
+         %67 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %68 = OpLoad %int %67
+         %69 = OpAccessChain %_ptr_Function_float %arr %68
+         %70 = OpLoad %float %69
+         %71 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %72 = OpLoad %float %71
+         %73 = OpFOrdEqual %bool %70 %72
+               OpStore %x_70_phi %73
+               OpSelectionMerge %74 None
+               OpBranchConditional %73 %75 %74
+         %75 = OpLabel
+         %76 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_2
+         %77 = OpLoad %int %76
+         %78 = OpAccessChain %_ptr_Function_float %arr %77
+         %79 = OpLoad %float %78
+         %80 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %81 = OpLoad %float %80
+         %82 = OpFOrdEqual %bool %79 %81
+               OpStore %x_69 %82
+         %83 = OpLoad %bool %x_69
+               OpStore %x_70_phi %83
+               OpBranch %74
+         %74 = OpLabel
+         %84 = OpLoad %bool %x_70_phi
+               OpStore %x_80_phi %84
+               OpSelectionMerge %85 None
+               OpBranchConditional %84 %86 %85
+         %86 = OpLabel
+         %87 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %88 = OpLoad %int %87
+         %89 = OpAccessChain %_ptr_Function_float %arr %88
+         %90 = OpLoad %float %89
+         %91 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %92 = OpLoad %float %91
+         %93 = OpFOrdEqual %bool %90 %92
+               OpStore %x_79 %93
+         %94 = OpLoad %bool %x_79
+               OpStore %x_80_phi %94
+               OpBranch %85
+         %85 = OpLabel
+         %95 = OpLoad %bool %x_80_phi
+               OpSelectionMerge %96 None
+               OpBranchConditional %95 %97 %98
+         %97 = OpLabel
+         %99 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+        %100 = OpLoad %int %99
+        %101 = OpAccessChain %_ptr_Function_float %arr %100
+        %102 = OpLoad %float %101
+        %103 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+        %104 = OpLoad %float %103
+        %105 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+        %106 = OpLoad %float %105
+        %107 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+        %108 = OpLoad %float %107
+        %109 = OpCompositeConstruct %v4float %102 %104 %106 %108
+               OpStore %x_GLF_color %109
+               OpBranch %96
+         %98 = OpLabel
+        %110 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+        %111 = OpLoad %float %110
+        %112 = OpCompositeConstruct %v4float %111 %111 %111 %111
+               OpStore %x_GLF_color %112
+               OpBranch %96
+         %96 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %113
+%tint_symbol = OpFunctionParameter %main_out
+        %117 = OpLabel
+        %118 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %118
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+        %120 = OpLabel
+        %121 = OpFunctionCall %void %main_1
+        %123 = OpLoad %v4float %x_GLF_color
+        %124 = OpCompositeConstruct %main_out %123
+        %122 = OpFunctionCall %void %tint_symbol_2 %124
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-array-element-in-loop/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-array-element-in-loop/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..dff82e2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-array-element-in-loop/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,90 @@
+type Arr = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var arr : array<f32, 3>;
+  var a : i32;
+  var x_69 : bool;
+  var x_79 : bool;
+  var x_70_phi : bool;
+  var x_80_phi : bool;
+  let x_34 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_36 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_38 : f32 = x_6.x_GLF_uniform_float_values[2];
+  arr = array<f32, 3>(x_34, x_36, x_38);
+  a = 0;
+  loop {
+    let x_44 : i32 = a;
+    let x_46 : i32 = x_9.x_GLF_uniform_int_values[1];
+    if ((x_44 <= x_46)) {
+    } else {
+      break;
+    }
+    let x_49 : i32 = a;
+    a = (x_49 + 1);
+    let x_52 : f32 = x_6.x_GLF_uniform_float_values[0];
+    arr[x_49] = x_52;
+  }
+  let x_55 : i32 = x_9.x_GLF_uniform_int_values[1];
+  let x_57 : f32 = arr[x_55];
+  let x_59 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_60 : bool = (x_57 == x_59);
+  x_70_phi = x_60;
+  if (x_60) {
+    let x_64 : i32 = x_9.x_GLF_uniform_int_values[2];
+    let x_66 : f32 = arr[x_64];
+    let x_68 : f32 = x_6.x_GLF_uniform_float_values[0];
+    x_69 = (x_66 == x_68);
+    x_70_phi = x_69;
+  }
+  let x_70 : bool = x_70_phi;
+  x_80_phi = x_70;
+  if (x_70) {
+    let x_74 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_76 : f32 = arr[x_74];
+    let x_78 : f32 = x_6.x_GLF_uniform_float_values[2];
+    x_79 = (x_76 == x_78);
+    x_80_phi = x_79;
+  }
+  let x_80 : bool = x_80_phi;
+  if (x_80) {
+    let x_85 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_87 : f32 = arr[x_85];
+    let x_89 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_91 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_93 : f32 = x_6.x_GLF_uniform_float_values[0];
+    x_GLF_color = vec4<f32>(x_87, x_89, x_91, x_93);
+  } else {
+    let x_96 : f32 = x_6.x_GLF_uniform_float_values[1];
+    x_GLF_color = vec4<f32>(x_96, x_96, x_96, x_96);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-float-in-loop-abs/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-increment-float-in-loop-abs/0-opt.spvasm
new file mode 100644
index 0000000..0bb66ca
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-float-in-loop-abs/0-opt.spvasm
@@ -0,0 +1,134 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %f0 "f0"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %f1 "f1"
+               OpName %i "i"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf0 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_int = OpTypePointer Function %int
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+%float_1_10000002 = OpConstant %float 1.10000002
+      %int_2 = OpConstant %int 2
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %14
+         %32 = OpLabel
+         %f0 = OpVariable %_ptr_Function_float Function
+         %f1 = OpVariable %_ptr_Function_float Function
+          %i = OpVariable %_ptr_Function_int Function
+         %33 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %34 = OpLoad %float %33
+               OpStore %f0 %34
+         %35 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %36 = OpLoad %float %35
+               OpStore %f1 %36
+         %37 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %38 = OpLoad %int %37
+               OpStore %i %38
+               OpBranch %39
+         %39 = OpLabel
+               OpLoopMerge %40 %41 None
+               OpBranch %42
+         %42 = OpLabel
+         %43 = OpLoad %int %i
+         %44 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %45 = OpLoad %int %44
+         %46 = OpSLessThan %bool %43 %45
+               OpBranchConditional %46 %47 %40
+         %47 = OpLabel
+         %48 = OpLoad %float %f0
+         %49 = OpFMul %float %float_1_10000002 %48
+         %50 = OpExtInst %float %1 FAbs %49
+               OpStore %f0 %50
+         %51 = OpLoad %float %f0
+               OpStore %f1 %51
+               OpBranch %41
+         %41 = OpLabel
+         %52 = OpLoad %int %i
+         %53 = OpIAdd %int %52 %int_1
+               OpStore %i %53
+               OpBranch %39
+         %40 = OpLabel
+         %54 = OpLoad %float %f1
+         %55 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %56 = OpLoad %float %55
+         %57 = OpFOrdGreaterThan %bool %54 %56
+               OpSelectionMerge %58 None
+               OpBranchConditional %57 %59 %58
+         %59 = OpLabel
+         %60 = OpLoad %float %f1
+         %61 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %62 = OpLoad %float %61
+         %63 = OpFOrdLessThan %bool %60 %62
+               OpBranch %58
+         %58 = OpLabel
+         %64 = OpPhi %bool %57 %40 %63 %59
+               OpSelectionMerge %65 None
+               OpBranchConditional %64 %66 %67
+         %66 = OpLabel
+         %68 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %69 = OpLoad %int %68
+         %70 = OpConvertSToF %float %69
+         %71 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %72 = OpLoad %int %71
+         %73 = OpConvertSToF %float %72
+         %74 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %75 = OpLoad %int %74
+         %76 = OpConvertSToF %float %75
+         %77 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %78 = OpLoad %int %77
+         %79 = OpConvertSToF %float %78
+         %80 = OpCompositeConstruct %v4float %70 %73 %76 %79
+               OpStore %_GLF_color %80
+               OpBranch %65
+         %67 = OpLabel
+         %81 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %82 = OpLoad %int %81
+         %83 = OpConvertSToF %float %82
+         %84 = OpCompositeConstruct %v4float %83 %83 %83 %83
+               OpStore %_GLF_color %84
+               OpBranch %65
+         %65 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-float-in-loop-abs/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-float-in-loop-abs/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..8d0ce84
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-float-in-loop-abs/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,73 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[3];
+};
+cbuffer cbuffer_x_10 : register(b1, space0) {
+  uint4 x_10[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float f0 = 0.0f;
+  float f1 = 0.0f;
+  int i = 0;
+  bool x_63 = false;
+  bool x_64_phi = false;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_34 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  f0 = x_34;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_36 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  f1 = x_36;
+  const int x_38 = asint(x_10[1].x);
+  i = x_38;
+  while (true) {
+    const int x_43 = i;
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_45 = asint(x_10[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    if ((x_43 < x_45)) {
+    } else {
+      break;
+    }
+    f0 = abs((1.100000024f * f0));
+    f1 = f0;
+    {
+      i = (i + 1);
+    }
+  }
+  const float x_54 = f1;
+  const float x_56 = asfloat(x_6[1].x);
+  const bool x_57 = (x_54 > x_56);
+  x_64_phi = x_57;
+  if (x_57) {
+    const float x_60 = f1;
+    const float x_62 = asfloat(x_6[2].x);
+    x_63 = (x_60 < x_62);
+    x_64_phi = x_63;
+  }
+  if (x_64_phi) {
+    const int x_69 = asint(x_10[2].x);
+    const int x_72 = asint(x_10[1].x);
+    const int x_75 = asint(x_10[1].x);
+    const int x_78 = asint(x_10[2].x);
+    x_GLF_color = float4(float(x_69), float(x_72), float(x_75), float(x_78));
+  } else {
+    const int x_82 = asint(x_10[1].x);
+    const float x_83 = float(x_82);
+    x_GLF_color = float4(x_83, x_83, x_83, x_83);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-float-in-loop-abs/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-increment-float-in-loop-abs/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..fa49516
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-float-in-loop-abs/0-opt.spvasm.expected.msl
@@ -0,0 +1,91 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_10, thread float4* const tint_symbol_4) {
+  float f0 = 0.0f;
+  float f1 = 0.0f;
+  int i = 0;
+  bool x_63 = false;
+  bool x_64_phi = false;
+  float const x_34 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  f0 = x_34;
+  float const x_36 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  f1 = x_36;
+  int const x_38 = x_10.x_GLF_uniform_int_values.arr[1].el;
+  i = x_38;
+  while (true) {
+    int const x_43 = i;
+    int const x_45 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_43 < x_45)) {
+    } else {
+      break;
+    }
+    float const x_48 = f0;
+    f0 = fabs((1.100000024f * x_48));
+    float const x_51 = f0;
+    f1 = x_51;
+    {
+      int const x_52 = i;
+      i = (x_52 + 1);
+    }
+  }
+  float const x_54 = f1;
+  float const x_56 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  bool const x_57 = (x_54 > x_56);
+  x_64_phi = x_57;
+  if (x_57) {
+    float const x_60 = f1;
+    float const x_62 = x_6.x_GLF_uniform_float_values.arr[2].el;
+    x_63 = (x_60 < x_62);
+    x_64_phi = x_63;
+  }
+  bool const x_64 = x_64_phi;
+  if (x_64) {
+    int const x_69 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    int const x_72 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_75 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_78 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    *(tint_symbol_4) = float4(float(x_69), float(x_72), float(x_75), float(x_78));
+  } else {
+    int const x_82 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    float const x_83 = float(x_82);
+    *(tint_symbol_4) = float4(x_83, x_83, x_83, x_83);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_10 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-float-in-loop-abs/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-increment-float-in-loop-abs/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..2189bcd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-float-in-loop-abs/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,185 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 110
+; Schema: 0
+               OpCapability Shader
+         %59 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f0 "f0"
+               OpName %f1 "f1"
+               OpName %i "i"
+               OpName %x_63 "x_63"
+               OpName %x_64_phi "x_64_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf0 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_10 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %16
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %25 = OpConstantNull %float
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %33 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%float_1_10000002 = OpConstant %float 1.10000002
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+         %98 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+         %f0 = OpVariable %_ptr_Function_float Function %25
+         %f1 = OpVariable %_ptr_Function_float Function %25
+          %i = OpVariable %_ptr_Function_int Function %29
+       %x_63 = OpVariable %_ptr_Function_bool Function %33
+   %x_64_phi = OpVariable %_ptr_Function_bool Function %33
+         %38 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %39 = OpLoad %float %38
+               OpStore %f0 %39
+         %40 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %41 = OpLoad %float %40
+               OpStore %f1 %41
+         %44 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %45 = OpLoad %int %44
+               OpStore %i %45
+               OpBranch %46
+         %46 = OpLabel
+               OpLoopMerge %47 %48 None
+               OpBranch %49
+         %49 = OpLabel
+         %50 = OpLoad %int %i
+         %51 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %52 = OpLoad %int %51
+         %53 = OpSLessThan %bool %50 %52
+               OpSelectionMerge %54 None
+               OpBranchConditional %53 %55 %56
+         %55 = OpLabel
+               OpBranch %54
+         %56 = OpLabel
+               OpBranch %47
+         %54 = OpLabel
+         %57 = OpLoad %float %f0
+         %61 = OpFMul %float %float_1_10000002 %57
+         %58 = OpExtInst %float %59 FAbs %61
+               OpStore %f0 %58
+         %62 = OpLoad %float %f0
+               OpStore %f1 %62
+               OpBranch %48
+         %48 = OpLabel
+         %63 = OpLoad %int %i
+         %64 = OpIAdd %int %63 %int_1
+               OpStore %i %64
+               OpBranch %46
+         %47 = OpLabel
+         %65 = OpLoad %float %f1
+         %66 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %67 = OpLoad %float %66
+         %68 = OpFOrdGreaterThan %bool %65 %67
+               OpStore %x_64_phi %68
+               OpSelectionMerge %69 None
+               OpBranchConditional %68 %70 %69
+         %70 = OpLabel
+         %71 = OpLoad %float %f1
+         %73 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %74 = OpLoad %float %73
+         %75 = OpFOrdLessThan %bool %71 %74
+               OpStore %x_63 %75
+         %76 = OpLoad %bool %x_63
+               OpStore %x_64_phi %76
+               OpBranch %69
+         %69 = OpLabel
+         %77 = OpLoad %bool %x_64_phi
+               OpSelectionMerge %78 None
+               OpBranchConditional %77 %79 %80
+         %79 = OpLabel
+         %81 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+         %82 = OpLoad %int %81
+         %83 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %84 = OpLoad %int %83
+         %85 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+         %88 = OpLoad %int %87
+         %89 = OpConvertSToF %float %82
+         %90 = OpConvertSToF %float %84
+         %91 = OpConvertSToF %float %86
+         %92 = OpConvertSToF %float %88
+         %93 = OpCompositeConstruct %v4float %89 %90 %91 %92
+               OpStore %x_GLF_color %93
+               OpBranch %78
+         %80 = OpLabel
+         %94 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %95 = OpLoad %int %94
+         %96 = OpConvertSToF %float %95
+         %97 = OpCompositeConstruct %v4float %96 %96 %96 %96
+               OpStore %x_GLF_color %97
+               OpBranch %78
+         %78 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %98
+%tint_symbol = OpFunctionParameter %main_out
+        %102 = OpLabel
+        %103 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %103
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+        %105 = OpLabel
+        %106 = OpFunctionCall %void %main_1
+        %108 = OpLoad %v4float %x_GLF_color
+        %109 = OpCompositeConstruct %main_out %108
+        %107 = OpFunctionCall %void %tint_symbol_2 %109
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-float-in-loop-abs/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-float-in-loop-abs/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..0fc1914
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-float-in-loop-abs/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,84 @@
+type Arr = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f0 : f32;
+  var f1 : f32;
+  var i : i32;
+  var x_63 : bool;
+  var x_64_phi : bool;
+  let x_34 : f32 = x_6.x_GLF_uniform_float_values[0];
+  f0 = x_34;
+  let x_36 : f32 = x_6.x_GLF_uniform_float_values[0];
+  f1 = x_36;
+  let x_38 : i32 = x_10.x_GLF_uniform_int_values[1];
+  i = x_38;
+  loop {
+    let x_43 : i32 = i;
+    let x_45 : i32 = x_10.x_GLF_uniform_int_values[0];
+    if ((x_43 < x_45)) {
+    } else {
+      break;
+    }
+    let x_48 : f32 = f0;
+    f0 = abs((1.100000024 * x_48));
+    let x_51 : f32 = f0;
+    f1 = x_51;
+
+    continuing {
+      let x_52 : i32 = i;
+      i = (x_52 + 1);
+    }
+  }
+  let x_54 : f32 = f1;
+  let x_56 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_57 : bool = (x_54 > x_56);
+  x_64_phi = x_57;
+  if (x_57) {
+    let x_60 : f32 = f1;
+    let x_62 : f32 = x_6.x_GLF_uniform_float_values[2];
+    x_63 = (x_60 < x_62);
+    x_64_phi = x_63;
+  }
+  let x_64 : bool = x_64_phi;
+  if (x_64) {
+    let x_69 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_72 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_75 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_78 : i32 = x_10.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_69), f32(x_72), f32(x_75), f32(x_78));
+  } else {
+    let x_82 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_83 : f32 = f32(x_82);
+    x_GLF_color = vec4<f32>(x_83, x_83, x_83, x_83);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-float-in-loop-abs/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-float-in-loop-abs/0-opt.wgsl
new file mode 100644
index 0000000..0fc1914
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-float-in-loop-abs/0-opt.wgsl
@@ -0,0 +1,84 @@
+type Arr = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f0 : f32;
+  var f1 : f32;
+  var i : i32;
+  var x_63 : bool;
+  var x_64_phi : bool;
+  let x_34 : f32 = x_6.x_GLF_uniform_float_values[0];
+  f0 = x_34;
+  let x_36 : f32 = x_6.x_GLF_uniform_float_values[0];
+  f1 = x_36;
+  let x_38 : i32 = x_10.x_GLF_uniform_int_values[1];
+  i = x_38;
+  loop {
+    let x_43 : i32 = i;
+    let x_45 : i32 = x_10.x_GLF_uniform_int_values[0];
+    if ((x_43 < x_45)) {
+    } else {
+      break;
+    }
+    let x_48 : f32 = f0;
+    f0 = abs((1.100000024 * x_48));
+    let x_51 : f32 = f0;
+    f1 = x_51;
+
+    continuing {
+      let x_52 : i32 = i;
+      i = (x_52 + 1);
+    }
+  }
+  let x_54 : f32 = f1;
+  let x_56 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_57 : bool = (x_54 > x_56);
+  x_64_phi = x_57;
+  if (x_57) {
+    let x_60 : f32 = f1;
+    let x_62 : f32 = x_6.x_GLF_uniform_float_values[2];
+    x_63 = (x_60 < x_62);
+    x_64_phi = x_63;
+  }
+  let x_64 : bool = x_64_phi;
+  if (x_64) {
+    let x_69 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_72 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_75 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_78 : i32 = x_10.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_69), f32(x_72), f32(x_75), f32(x_78));
+  } else {
+    let x_82 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_83 : f32 = f32(x_82);
+    x_GLF_color = vec4<f32>(x_83, x_83, x_83, x_83);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-float-in-loop-abs/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-float-in-loop-abs/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..8d0ce84
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-float-in-loop-abs/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,73 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[3];
+};
+cbuffer cbuffer_x_10 : register(b1, space0) {
+  uint4 x_10[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float f0 = 0.0f;
+  float f1 = 0.0f;
+  int i = 0;
+  bool x_63 = false;
+  bool x_64_phi = false;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_34 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  f0 = x_34;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_36 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  f1 = x_36;
+  const int x_38 = asint(x_10[1].x);
+  i = x_38;
+  while (true) {
+    const int x_43 = i;
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_45 = asint(x_10[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    if ((x_43 < x_45)) {
+    } else {
+      break;
+    }
+    f0 = abs((1.100000024f * f0));
+    f1 = f0;
+    {
+      i = (i + 1);
+    }
+  }
+  const float x_54 = f1;
+  const float x_56 = asfloat(x_6[1].x);
+  const bool x_57 = (x_54 > x_56);
+  x_64_phi = x_57;
+  if (x_57) {
+    const float x_60 = f1;
+    const float x_62 = asfloat(x_6[2].x);
+    x_63 = (x_60 < x_62);
+    x_64_phi = x_63;
+  }
+  if (x_64_phi) {
+    const int x_69 = asint(x_10[2].x);
+    const int x_72 = asint(x_10[1].x);
+    const int x_75 = asint(x_10[1].x);
+    const int x_78 = asint(x_10[2].x);
+    x_GLF_color = float4(float(x_69), float(x_72), float(x_75), float(x_78));
+  } else {
+    const int x_82 = asint(x_10[1].x);
+    const float x_83 = float(x_82);
+    x_GLF_color = float4(x_83, x_83, x_83, x_83);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-float-in-loop-abs/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-increment-float-in-loop-abs/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..fa49516
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-float-in-loop-abs/0-opt.wgsl.expected.msl
@@ -0,0 +1,91 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_10, thread float4* const tint_symbol_4) {
+  float f0 = 0.0f;
+  float f1 = 0.0f;
+  int i = 0;
+  bool x_63 = false;
+  bool x_64_phi = false;
+  float const x_34 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  f0 = x_34;
+  float const x_36 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  f1 = x_36;
+  int const x_38 = x_10.x_GLF_uniform_int_values.arr[1].el;
+  i = x_38;
+  while (true) {
+    int const x_43 = i;
+    int const x_45 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_43 < x_45)) {
+    } else {
+      break;
+    }
+    float const x_48 = f0;
+    f0 = fabs((1.100000024f * x_48));
+    float const x_51 = f0;
+    f1 = x_51;
+    {
+      int const x_52 = i;
+      i = (x_52 + 1);
+    }
+  }
+  float const x_54 = f1;
+  float const x_56 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  bool const x_57 = (x_54 > x_56);
+  x_64_phi = x_57;
+  if (x_57) {
+    float const x_60 = f1;
+    float const x_62 = x_6.x_GLF_uniform_float_values.arr[2].el;
+    x_63 = (x_60 < x_62);
+    x_64_phi = x_63;
+  }
+  bool const x_64 = x_64_phi;
+  if (x_64) {
+    int const x_69 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    int const x_72 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_75 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_78 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    *(tint_symbol_4) = float4(float(x_69), float(x_72), float(x_75), float(x_78));
+  } else {
+    int const x_82 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    float const x_83 = float(x_82);
+    *(tint_symbol_4) = float4(x_83, x_83, x_83, x_83);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_10 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-float-in-loop-abs/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-increment-float-in-loop-abs/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..2189bcd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-float-in-loop-abs/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,185 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 110
+; Schema: 0
+               OpCapability Shader
+         %59 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f0 "f0"
+               OpName %f1 "f1"
+               OpName %i "i"
+               OpName %x_63 "x_63"
+               OpName %x_64_phi "x_64_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf0 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_10 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %16
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %25 = OpConstantNull %float
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %33 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%float_1_10000002 = OpConstant %float 1.10000002
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+         %98 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+         %f0 = OpVariable %_ptr_Function_float Function %25
+         %f1 = OpVariable %_ptr_Function_float Function %25
+          %i = OpVariable %_ptr_Function_int Function %29
+       %x_63 = OpVariable %_ptr_Function_bool Function %33
+   %x_64_phi = OpVariable %_ptr_Function_bool Function %33
+         %38 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %39 = OpLoad %float %38
+               OpStore %f0 %39
+         %40 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %41 = OpLoad %float %40
+               OpStore %f1 %41
+         %44 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %45 = OpLoad %int %44
+               OpStore %i %45
+               OpBranch %46
+         %46 = OpLabel
+               OpLoopMerge %47 %48 None
+               OpBranch %49
+         %49 = OpLabel
+         %50 = OpLoad %int %i
+         %51 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %52 = OpLoad %int %51
+         %53 = OpSLessThan %bool %50 %52
+               OpSelectionMerge %54 None
+               OpBranchConditional %53 %55 %56
+         %55 = OpLabel
+               OpBranch %54
+         %56 = OpLabel
+               OpBranch %47
+         %54 = OpLabel
+         %57 = OpLoad %float %f0
+         %61 = OpFMul %float %float_1_10000002 %57
+         %58 = OpExtInst %float %59 FAbs %61
+               OpStore %f0 %58
+         %62 = OpLoad %float %f0
+               OpStore %f1 %62
+               OpBranch %48
+         %48 = OpLabel
+         %63 = OpLoad %int %i
+         %64 = OpIAdd %int %63 %int_1
+               OpStore %i %64
+               OpBranch %46
+         %47 = OpLabel
+         %65 = OpLoad %float %f1
+         %66 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %67 = OpLoad %float %66
+         %68 = OpFOrdGreaterThan %bool %65 %67
+               OpStore %x_64_phi %68
+               OpSelectionMerge %69 None
+               OpBranchConditional %68 %70 %69
+         %70 = OpLabel
+         %71 = OpLoad %float %f1
+         %73 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %74 = OpLoad %float %73
+         %75 = OpFOrdLessThan %bool %71 %74
+               OpStore %x_63 %75
+         %76 = OpLoad %bool %x_63
+               OpStore %x_64_phi %76
+               OpBranch %69
+         %69 = OpLabel
+         %77 = OpLoad %bool %x_64_phi
+               OpSelectionMerge %78 None
+               OpBranchConditional %77 %79 %80
+         %79 = OpLabel
+         %81 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+         %82 = OpLoad %int %81
+         %83 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %84 = OpLoad %int %83
+         %85 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+         %88 = OpLoad %int %87
+         %89 = OpConvertSToF %float %82
+         %90 = OpConvertSToF %float %84
+         %91 = OpConvertSToF %float %86
+         %92 = OpConvertSToF %float %88
+         %93 = OpCompositeConstruct %v4float %89 %90 %91 %92
+               OpStore %x_GLF_color %93
+               OpBranch %78
+         %80 = OpLabel
+         %94 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %95 = OpLoad %int %94
+         %96 = OpConvertSToF %float %95
+         %97 = OpCompositeConstruct %v4float %96 %96 %96 %96
+               OpStore %x_GLF_color %97
+               OpBranch %78
+         %78 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %98
+%tint_symbol = OpFunctionParameter %main_out
+        %102 = OpLabel
+        %103 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %103
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+        %105 = OpLabel
+        %106 = OpFunctionCall %void %main_1
+        %108 = OpLoad %v4float %x_GLF_color
+        %109 = OpCompositeConstruct %main_out %108
+        %107 = OpFunctionCall %void %tint_symbol_2 %109
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-float-in-loop-abs/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-float-in-loop-abs/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..0fc1914
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-float-in-loop-abs/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,84 @@
+type Arr = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f0 : f32;
+  var f1 : f32;
+  var i : i32;
+  var x_63 : bool;
+  var x_64_phi : bool;
+  let x_34 : f32 = x_6.x_GLF_uniform_float_values[0];
+  f0 = x_34;
+  let x_36 : f32 = x_6.x_GLF_uniform_float_values[0];
+  f1 = x_36;
+  let x_38 : i32 = x_10.x_GLF_uniform_int_values[1];
+  i = x_38;
+  loop {
+    let x_43 : i32 = i;
+    let x_45 : i32 = x_10.x_GLF_uniform_int_values[0];
+    if ((x_43 < x_45)) {
+    } else {
+      break;
+    }
+    let x_48 : f32 = f0;
+    f0 = abs((1.100000024 * x_48));
+    let x_51 : f32 = f0;
+    f1 = x_51;
+
+    continuing {
+      let x_52 : i32 = i;
+      i = (x_52 + 1);
+    }
+  }
+  let x_54 : f32 = f1;
+  let x_56 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_57 : bool = (x_54 > x_56);
+  x_64_phi = x_57;
+  if (x_57) {
+    let x_60 : f32 = f1;
+    let x_62 : f32 = x_6.x_GLF_uniform_float_values[2];
+    x_63 = (x_60 < x_62);
+    x_64_phi = x_63;
+  }
+  let x_64 : bool = x_64_phi;
+  if (x_64) {
+    let x_69 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_72 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_75 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_78 : i32 = x_10.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_69), f32(x_72), f32(x_75), f32(x_78));
+  } else {
+    let x_82 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_83 : f32 = f32(x_82);
+    x_GLF_color = vec4<f32>(x_83, x_83, x_83, x_83);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-global-counter-loop-function/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-increment-global-counter-loop-function/0-opt.spvasm
new file mode 100644
index 0000000..cd15881
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-global-counter-loop-function/0-opt.spvasm
@@ -0,0 +1,124 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %func_ "func("
+               OpName %_GLF_global_loop_count "_GLF_global_loop_count"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+%_GLF_global_loop_count = OpVariable %_ptr_Private_int Private
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+       %bool = OpTypeBool
+     %int_10 = OpConstant %int 10
+      %int_2 = OpConstant %int 2
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %10
+         %26 = OpLabel
+               OpStore %_GLF_global_loop_count %int_0
+               OpBranch %27
+         %27 = OpLabel
+         %28 = OpLoad %int %_GLF_global_loop_count
+         %29 = OpSLessThan %bool %28 %int_10
+               OpLoopMerge %30 %31 None
+               OpBranchConditional %29 %31 %30
+         %31 = OpLabel
+         %32 = OpLoad %int %_GLF_global_loop_count
+         %33 = OpIAdd %int %32 %int_1
+               OpStore %_GLF_global_loop_count %33
+         %34 = OpFunctionCall %void %func_
+               OpBranch %27
+         %30 = OpLabel
+               OpBranch %35
+         %35 = OpLabel
+         %36 = OpLoad %int %_GLF_global_loop_count
+         %37 = OpSLessThan %bool %36 %int_10
+               OpLoopMerge %38 %39 None
+               OpBranchConditional %37 %39 %38
+         %39 = OpLabel
+         %40 = OpLoad %int %_GLF_global_loop_count
+         %41 = OpIAdd %int %40 %int_1
+               OpStore %_GLF_global_loop_count %41
+               OpBranch %35
+         %38 = OpLabel
+         %42 = OpLoad %int %_GLF_global_loop_count
+         %43 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %44 = OpLoad %int %43
+         %45 = OpIEqual %bool %42 %44
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %48
+         %47 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %50 = OpLoad %int %49
+         %51 = OpConvertSToF %float %50
+         %52 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %53 = OpLoad %int %52
+         %54 = OpConvertSToF %float %53
+         %55 = OpCompositeConstruct %v4float %51 %54 %54 %51
+               OpStore %_GLF_color %55
+               OpBranch %46
+         %48 = OpLabel
+         %56 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %57 = OpLoad %int %56
+         %58 = OpConvertSToF %float %57
+         %59 = OpCompositeConstruct %v4float %58 %58 %58 %58
+               OpStore %_GLF_color %59
+               OpBranch %46
+         %46 = OpLabel
+               OpReturn
+               OpFunctionEnd
+      %func_ = OpFunction %void None %10
+         %60 = OpLabel
+         %61 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %62 = OpLoad %int %61
+         %63 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %64 = OpLoad %int %63
+               OpBranch %65
+         %65 = OpLabel
+         %66 = OpPhi %int %64 %60 %67 %68
+         %69 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %70 = OpLoad %int %69
+         %71 = OpSLessThan %bool %66 %70
+               OpLoopMerge %72 %68 None
+               OpBranchConditional %71 %68 %72
+         %68 = OpLabel
+         %73 = OpLoad %int %_GLF_global_loop_count
+         %74 = OpIAdd %int %73 %int_1
+               OpStore %_GLF_global_loop_count %74
+         %67 = OpIAdd %int %66 %int_1
+               OpBranch %65
+         %72 = OpLabel
+         %75 = OpSLessThan %bool %62 %62
+               OpSelectionMerge %76 None
+               OpBranchConditional %75 %77 %76
+         %77 = OpLabel
+               OpReturn
+         %76 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-global-counter-loop-function/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-global-counter-loop-function/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..e89c902
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-global-counter-loop-function/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,79 @@
+static int x_GLF_global_loop_count = 0;
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void func_() {
+  int x_66_phi = 0;
+  const int x_62 = asint(x_7[1].x);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_64 = asint(x_7[scalar_offset / 4][scalar_offset % 4]);
+  x_66_phi = x_64;
+  while (true) {
+    int x_67 = 0;
+    const int x_66 = x_66_phi;
+    const int x_70 = asint(x_7[3].x);
+    if ((x_66 < x_70)) {
+    } else {
+      break;
+    }
+    {
+      x_GLF_global_loop_count = (x_GLF_global_loop_count + 1);
+      x_67 = (x_66 + 1);
+      x_66_phi = x_67;
+    }
+  }
+  if ((x_62 < x_62)) {
+    return;
+  }
+  return;
+}
+
+void main_1() {
+  x_GLF_global_loop_count = 0;
+  while (true) {
+    if ((x_GLF_global_loop_count < 10)) {
+    } else {
+      break;
+    }
+    {
+      x_GLF_global_loop_count = (x_GLF_global_loop_count + 1);
+      func_();
+    }
+  }
+  {
+    for(; (x_GLF_global_loop_count < 10); x_GLF_global_loop_count = (x_GLF_global_loop_count + 1)) {
+    }
+  }
+  const int x_42 = x_GLF_global_loop_count;
+  const int x_44 = asint(x_7[2].x);
+  if ((x_42 == x_44)) {
+    const int x_50 = asint(x_7[1].x);
+    const float x_51 = float(x_50);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_53 = asint(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const float x_54 = float(x_53);
+    x_GLF_color = float4(x_51, x_54, x_54, x_51);
+  } else {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_57 = asint(x_7[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const float x_58 = float(x_57);
+    x_GLF_color = float4(x_58, x_58, x_58, x_58);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-global-counter-loop-function/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-increment-global-counter-loop-function/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..9a18e81
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-global-counter-loop-function/0-opt.spvasm.expected.msl
@@ -0,0 +1,96 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void func_(constant buf0& x_7, thread int* const tint_symbol_4) {
+  int x_66_phi = 0;
+  int const x_62 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  int const x_64 = x_7.x_GLF_uniform_int_values.arr[0].el;
+  x_66_phi = x_64;
+  while (true) {
+    int x_67 = 0;
+    int const x_66 = x_66_phi;
+    int const x_70 = x_7.x_GLF_uniform_int_values.arr[3].el;
+    if ((x_66 < x_70)) {
+    } else {
+      break;
+    }
+    {
+      int const x_73 = *(tint_symbol_4);
+      *(tint_symbol_4) = (x_73 + 1);
+      x_67 = (x_66 + 1);
+      x_66_phi = x_67;
+    }
+  }
+  if ((x_62 < x_62)) {
+    return;
+  }
+  return;
+}
+
+void main_1(constant buf0& x_7, thread int* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  *(tint_symbol_5) = 0;
+  while (true) {
+    int const x_28 = *(tint_symbol_5);
+    if ((x_28 < 10)) {
+    } else {
+      break;
+    }
+    {
+      int const x_32 = *(tint_symbol_5);
+      *(tint_symbol_5) = (x_32 + 1);
+      func_(x_7, tint_symbol_5);
+    }
+  }
+  while (true) {
+    int const x_36 = *(tint_symbol_5);
+    if ((x_36 < 10)) {
+    } else {
+      break;
+    }
+    {
+      int const x_40 = *(tint_symbol_5);
+      *(tint_symbol_5) = (x_40 + 1);
+    }
+  }
+  int const x_42 = *(tint_symbol_5);
+  int const x_44 = x_7.x_GLF_uniform_int_values.arr[2].el;
+  if ((x_42 == x_44)) {
+    int const x_50 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    float const x_51 = float(x_50);
+    int const x_53 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    float const x_54 = float(x_53);
+    *(tint_symbol_6) = float4(x_51, x_54, x_54, x_51);
+  } else {
+    int const x_57 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    float const x_58 = float(x_57);
+    *(tint_symbol_6) = float4(x_58, x_58, x_58, x_58);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread int tint_symbol_7 = 0;
+  thread float4 tint_symbol_8 = 0.0f;
+  main_1(x_7, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-global-counter-loop-function/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-increment-global-counter-loop-function/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..209a878
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-global-counter-loop-function/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,193 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 110
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_global_loop_count "x_GLF_global_loop_count"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_ "func_"
+               OpName %x_66_phi "x_66_phi"
+               OpName %x_67 "x_67"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+          %4 = OpConstantNull %int
+%x_GLF_global_loop_count = OpVariable %_ptr_Private_int Private %4
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %15 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %15
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %15
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+      %int_3 = OpConstant %int 3
+       %bool = OpTypeBool
+     %int_10 = OpConstant %int 10
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+         %98 = OpTypeFunction %void %main_out
+      %func_ = OpFunction %void None %18
+         %21 = OpLabel
+   %x_66_phi = OpVariable %_ptr_Function_int Function %4
+       %x_67 = OpVariable %_ptr_Function_int Function %4
+         %27 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %28 = OpLoad %int %27
+         %30 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %31 = OpLoad %int %30
+               OpStore %x_66_phi %31
+               OpBranch %32
+         %32 = OpLabel
+               OpLoopMerge %33 %34 None
+               OpBranch %35
+         %35 = OpLabel
+         %37 = OpLoad %int %x_66_phi
+         %39 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_3
+         %40 = OpLoad %int %39
+         %41 = OpSLessThan %bool %37 %40
+               OpSelectionMerge %43 None
+               OpBranchConditional %41 %44 %45
+         %44 = OpLabel
+               OpBranch %43
+         %45 = OpLabel
+               OpBranch %33
+         %43 = OpLabel
+               OpBranch %34
+         %34 = OpLabel
+         %46 = OpLoad %int %x_GLF_global_loop_count
+         %47 = OpIAdd %int %46 %int_1
+               OpStore %x_GLF_global_loop_count %47
+         %48 = OpIAdd %int %37 %int_1
+               OpStore %x_67 %48
+         %49 = OpLoad %int %x_67
+               OpStore %x_66_phi %49
+               OpBranch %32
+         %33 = OpLabel
+         %50 = OpSLessThan %bool %28 %28
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %51
+         %52 = OpLabel
+               OpReturn
+         %51 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %18
+         %54 = OpLabel
+               OpStore %x_GLF_global_loop_count %int_0
+               OpBranch %55
+         %55 = OpLabel
+               OpLoopMerge %56 %57 None
+               OpBranch %58
+         %58 = OpLabel
+         %59 = OpLoad %int %x_GLF_global_loop_count
+         %61 = OpSLessThan %bool %59 %int_10
+               OpSelectionMerge %62 None
+               OpBranchConditional %61 %63 %64
+         %63 = OpLabel
+               OpBranch %62
+         %64 = OpLabel
+               OpBranch %56
+         %62 = OpLabel
+               OpBranch %57
+         %57 = OpLabel
+         %65 = OpLoad %int %x_GLF_global_loop_count
+         %66 = OpIAdd %int %65 %int_1
+               OpStore %x_GLF_global_loop_count %66
+         %67 = OpFunctionCall %void %func_
+               OpBranch %55
+         %56 = OpLabel
+               OpBranch %68
+         %68 = OpLabel
+               OpLoopMerge %69 %70 None
+               OpBranch %71
+         %71 = OpLabel
+         %72 = OpLoad %int %x_GLF_global_loop_count
+         %73 = OpSLessThan %bool %72 %int_10
+               OpSelectionMerge %74 None
+               OpBranchConditional %73 %75 %76
+         %75 = OpLabel
+               OpBranch %74
+         %76 = OpLabel
+               OpBranch %69
+         %74 = OpLabel
+               OpBranch %70
+         %70 = OpLabel
+         %77 = OpLoad %int %x_GLF_global_loop_count
+         %78 = OpIAdd %int %77 %int_1
+               OpStore %x_GLF_global_loop_count %78
+               OpBranch %68
+         %69 = OpLabel
+         %79 = OpLoad %int %x_GLF_global_loop_count
+         %81 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %82 = OpLoad %int %81
+         %83 = OpIEqual %bool %79 %82
+               OpSelectionMerge %84 None
+               OpBranchConditional %83 %85 %86
+         %85 = OpLabel
+         %87 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %88 = OpLoad %int %87
+         %89 = OpConvertSToF %float %88
+         %90 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %91 = OpLoad %int %90
+         %92 = OpConvertSToF %float %91
+         %93 = OpCompositeConstruct %v4float %89 %92 %92 %89
+               OpStore %x_GLF_color %93
+               OpBranch %84
+         %86 = OpLabel
+         %94 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %95 = OpLoad %int %94
+         %96 = OpConvertSToF %float %95
+         %97 = OpCompositeConstruct %v4float %96 %96 %96 %96
+               OpStore %x_GLF_color %97
+               OpBranch %84
+         %84 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %98
+%tint_symbol = OpFunctionParameter %main_out
+        %102 = OpLabel
+        %103 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %103
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %18
+        %105 = OpLabel
+        %106 = OpFunctionCall %void %main_1
+        %108 = OpLoad %v4float %x_GLF_color
+        %109 = OpCompositeConstruct %main_out %108
+        %107 = OpFunctionCall %void %tint_symbol_2 %109
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-global-counter-loop-function/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-global-counter-loop-function/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..bb1a4df
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-global-counter-loop-function/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,93 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> x_GLF_global_loop_count : i32;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() {
+  var x_66_phi : i32;
+  let x_62 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_64 : i32 = x_7.x_GLF_uniform_int_values[0];
+  x_66_phi = x_64;
+  loop {
+    var x_67 : i32;
+    let x_66 : i32 = x_66_phi;
+    let x_70 : i32 = x_7.x_GLF_uniform_int_values[3];
+    if ((x_66 < x_70)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_73 : i32 = x_GLF_global_loop_count;
+      x_GLF_global_loop_count = (x_73 + 1);
+      x_67 = (x_66 + 1);
+      x_66_phi = x_67;
+    }
+  }
+  if ((x_62 < x_62)) {
+    return;
+  }
+  return;
+}
+
+fn main_1() {
+  x_GLF_global_loop_count = 0;
+  loop {
+    let x_28 : i32 = x_GLF_global_loop_count;
+    if ((x_28 < 10)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_32 : i32 = x_GLF_global_loop_count;
+      x_GLF_global_loop_count = (x_32 + 1);
+      func_();
+    }
+  }
+  loop {
+    let x_36 : i32 = x_GLF_global_loop_count;
+    if ((x_36 < 10)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_40 : i32 = x_GLF_global_loop_count;
+      x_GLF_global_loop_count = (x_40 + 1);
+    }
+  }
+  let x_42 : i32 = x_GLF_global_loop_count;
+  let x_44 : i32 = x_7.x_GLF_uniform_int_values[2];
+  if ((x_42 == x_44)) {
+    let x_50 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_51 : f32 = f32(x_50);
+    let x_53 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_54 : f32 = f32(x_53);
+    x_GLF_color = vec4<f32>(x_51, x_54, x_54, x_51);
+  } else {
+    let x_57 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_58 : f32 = f32(x_57);
+    x_GLF_color = vec4<f32>(x_58, x_58, x_58, x_58);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-global-counter-loop-function/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-global-counter-loop-function/0-opt.wgsl
new file mode 100644
index 0000000..bb1a4df
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-global-counter-loop-function/0-opt.wgsl
@@ -0,0 +1,93 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> x_GLF_global_loop_count : i32;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() {
+  var x_66_phi : i32;
+  let x_62 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_64 : i32 = x_7.x_GLF_uniform_int_values[0];
+  x_66_phi = x_64;
+  loop {
+    var x_67 : i32;
+    let x_66 : i32 = x_66_phi;
+    let x_70 : i32 = x_7.x_GLF_uniform_int_values[3];
+    if ((x_66 < x_70)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_73 : i32 = x_GLF_global_loop_count;
+      x_GLF_global_loop_count = (x_73 + 1);
+      x_67 = (x_66 + 1);
+      x_66_phi = x_67;
+    }
+  }
+  if ((x_62 < x_62)) {
+    return;
+  }
+  return;
+}
+
+fn main_1() {
+  x_GLF_global_loop_count = 0;
+  loop {
+    let x_28 : i32 = x_GLF_global_loop_count;
+    if ((x_28 < 10)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_32 : i32 = x_GLF_global_loop_count;
+      x_GLF_global_loop_count = (x_32 + 1);
+      func_();
+    }
+  }
+  loop {
+    let x_36 : i32 = x_GLF_global_loop_count;
+    if ((x_36 < 10)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_40 : i32 = x_GLF_global_loop_count;
+      x_GLF_global_loop_count = (x_40 + 1);
+    }
+  }
+  let x_42 : i32 = x_GLF_global_loop_count;
+  let x_44 : i32 = x_7.x_GLF_uniform_int_values[2];
+  if ((x_42 == x_44)) {
+    let x_50 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_51 : f32 = f32(x_50);
+    let x_53 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_54 : f32 = f32(x_53);
+    x_GLF_color = vec4<f32>(x_51, x_54, x_54, x_51);
+  } else {
+    let x_57 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_58 : f32 = f32(x_57);
+    x_GLF_color = vec4<f32>(x_58, x_58, x_58, x_58);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-global-counter-loop-function/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-global-counter-loop-function/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..e89c902
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-global-counter-loop-function/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,79 @@
+static int x_GLF_global_loop_count = 0;
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void func_() {
+  int x_66_phi = 0;
+  const int x_62 = asint(x_7[1].x);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_64 = asint(x_7[scalar_offset / 4][scalar_offset % 4]);
+  x_66_phi = x_64;
+  while (true) {
+    int x_67 = 0;
+    const int x_66 = x_66_phi;
+    const int x_70 = asint(x_7[3].x);
+    if ((x_66 < x_70)) {
+    } else {
+      break;
+    }
+    {
+      x_GLF_global_loop_count = (x_GLF_global_loop_count + 1);
+      x_67 = (x_66 + 1);
+      x_66_phi = x_67;
+    }
+  }
+  if ((x_62 < x_62)) {
+    return;
+  }
+  return;
+}
+
+void main_1() {
+  x_GLF_global_loop_count = 0;
+  while (true) {
+    if ((x_GLF_global_loop_count < 10)) {
+    } else {
+      break;
+    }
+    {
+      x_GLF_global_loop_count = (x_GLF_global_loop_count + 1);
+      func_();
+    }
+  }
+  {
+    for(; (x_GLF_global_loop_count < 10); x_GLF_global_loop_count = (x_GLF_global_loop_count + 1)) {
+    }
+  }
+  const int x_42 = x_GLF_global_loop_count;
+  const int x_44 = asint(x_7[2].x);
+  if ((x_42 == x_44)) {
+    const int x_50 = asint(x_7[1].x);
+    const float x_51 = float(x_50);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_53 = asint(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const float x_54 = float(x_53);
+    x_GLF_color = float4(x_51, x_54, x_54, x_51);
+  } else {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_57 = asint(x_7[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const float x_58 = float(x_57);
+    x_GLF_color = float4(x_58, x_58, x_58, x_58);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-global-counter-loop-function/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-increment-global-counter-loop-function/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..9a18e81
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-global-counter-loop-function/0-opt.wgsl.expected.msl
@@ -0,0 +1,96 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void func_(constant buf0& x_7, thread int* const tint_symbol_4) {
+  int x_66_phi = 0;
+  int const x_62 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  int const x_64 = x_7.x_GLF_uniform_int_values.arr[0].el;
+  x_66_phi = x_64;
+  while (true) {
+    int x_67 = 0;
+    int const x_66 = x_66_phi;
+    int const x_70 = x_7.x_GLF_uniform_int_values.arr[3].el;
+    if ((x_66 < x_70)) {
+    } else {
+      break;
+    }
+    {
+      int const x_73 = *(tint_symbol_4);
+      *(tint_symbol_4) = (x_73 + 1);
+      x_67 = (x_66 + 1);
+      x_66_phi = x_67;
+    }
+  }
+  if ((x_62 < x_62)) {
+    return;
+  }
+  return;
+}
+
+void main_1(constant buf0& x_7, thread int* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  *(tint_symbol_5) = 0;
+  while (true) {
+    int const x_28 = *(tint_symbol_5);
+    if ((x_28 < 10)) {
+    } else {
+      break;
+    }
+    {
+      int const x_32 = *(tint_symbol_5);
+      *(tint_symbol_5) = (x_32 + 1);
+      func_(x_7, tint_symbol_5);
+    }
+  }
+  while (true) {
+    int const x_36 = *(tint_symbol_5);
+    if ((x_36 < 10)) {
+    } else {
+      break;
+    }
+    {
+      int const x_40 = *(tint_symbol_5);
+      *(tint_symbol_5) = (x_40 + 1);
+    }
+  }
+  int const x_42 = *(tint_symbol_5);
+  int const x_44 = x_7.x_GLF_uniform_int_values.arr[2].el;
+  if ((x_42 == x_44)) {
+    int const x_50 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    float const x_51 = float(x_50);
+    int const x_53 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    float const x_54 = float(x_53);
+    *(tint_symbol_6) = float4(x_51, x_54, x_54, x_51);
+  } else {
+    int const x_57 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    float const x_58 = float(x_57);
+    *(tint_symbol_6) = float4(x_58, x_58, x_58, x_58);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread int tint_symbol_7 = 0;
+  thread float4 tint_symbol_8 = 0.0f;
+  main_1(x_7, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-global-counter-loop-function/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-increment-global-counter-loop-function/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..209a878
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-global-counter-loop-function/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,193 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 110
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_global_loop_count "x_GLF_global_loop_count"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_ "func_"
+               OpName %x_66_phi "x_66_phi"
+               OpName %x_67 "x_67"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+          %4 = OpConstantNull %int
+%x_GLF_global_loop_count = OpVariable %_ptr_Private_int Private %4
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %15 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %15
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %15
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+      %int_3 = OpConstant %int 3
+       %bool = OpTypeBool
+     %int_10 = OpConstant %int 10
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+         %98 = OpTypeFunction %void %main_out
+      %func_ = OpFunction %void None %18
+         %21 = OpLabel
+   %x_66_phi = OpVariable %_ptr_Function_int Function %4
+       %x_67 = OpVariable %_ptr_Function_int Function %4
+         %27 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %28 = OpLoad %int %27
+         %30 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %31 = OpLoad %int %30
+               OpStore %x_66_phi %31
+               OpBranch %32
+         %32 = OpLabel
+               OpLoopMerge %33 %34 None
+               OpBranch %35
+         %35 = OpLabel
+         %37 = OpLoad %int %x_66_phi
+         %39 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_3
+         %40 = OpLoad %int %39
+         %41 = OpSLessThan %bool %37 %40
+               OpSelectionMerge %43 None
+               OpBranchConditional %41 %44 %45
+         %44 = OpLabel
+               OpBranch %43
+         %45 = OpLabel
+               OpBranch %33
+         %43 = OpLabel
+               OpBranch %34
+         %34 = OpLabel
+         %46 = OpLoad %int %x_GLF_global_loop_count
+         %47 = OpIAdd %int %46 %int_1
+               OpStore %x_GLF_global_loop_count %47
+         %48 = OpIAdd %int %37 %int_1
+               OpStore %x_67 %48
+         %49 = OpLoad %int %x_67
+               OpStore %x_66_phi %49
+               OpBranch %32
+         %33 = OpLabel
+         %50 = OpSLessThan %bool %28 %28
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %51
+         %52 = OpLabel
+               OpReturn
+         %51 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %18
+         %54 = OpLabel
+               OpStore %x_GLF_global_loop_count %int_0
+               OpBranch %55
+         %55 = OpLabel
+               OpLoopMerge %56 %57 None
+               OpBranch %58
+         %58 = OpLabel
+         %59 = OpLoad %int %x_GLF_global_loop_count
+         %61 = OpSLessThan %bool %59 %int_10
+               OpSelectionMerge %62 None
+               OpBranchConditional %61 %63 %64
+         %63 = OpLabel
+               OpBranch %62
+         %64 = OpLabel
+               OpBranch %56
+         %62 = OpLabel
+               OpBranch %57
+         %57 = OpLabel
+         %65 = OpLoad %int %x_GLF_global_loop_count
+         %66 = OpIAdd %int %65 %int_1
+               OpStore %x_GLF_global_loop_count %66
+         %67 = OpFunctionCall %void %func_
+               OpBranch %55
+         %56 = OpLabel
+               OpBranch %68
+         %68 = OpLabel
+               OpLoopMerge %69 %70 None
+               OpBranch %71
+         %71 = OpLabel
+         %72 = OpLoad %int %x_GLF_global_loop_count
+         %73 = OpSLessThan %bool %72 %int_10
+               OpSelectionMerge %74 None
+               OpBranchConditional %73 %75 %76
+         %75 = OpLabel
+               OpBranch %74
+         %76 = OpLabel
+               OpBranch %69
+         %74 = OpLabel
+               OpBranch %70
+         %70 = OpLabel
+         %77 = OpLoad %int %x_GLF_global_loop_count
+         %78 = OpIAdd %int %77 %int_1
+               OpStore %x_GLF_global_loop_count %78
+               OpBranch %68
+         %69 = OpLabel
+         %79 = OpLoad %int %x_GLF_global_loop_count
+         %81 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %82 = OpLoad %int %81
+         %83 = OpIEqual %bool %79 %82
+               OpSelectionMerge %84 None
+               OpBranchConditional %83 %85 %86
+         %85 = OpLabel
+         %87 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %88 = OpLoad %int %87
+         %89 = OpConvertSToF %float %88
+         %90 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %91 = OpLoad %int %90
+         %92 = OpConvertSToF %float %91
+         %93 = OpCompositeConstruct %v4float %89 %92 %92 %89
+               OpStore %x_GLF_color %93
+               OpBranch %84
+         %86 = OpLabel
+         %94 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %95 = OpLoad %int %94
+         %96 = OpConvertSToF %float %95
+         %97 = OpCompositeConstruct %v4float %96 %96 %96 %96
+               OpStore %x_GLF_color %97
+               OpBranch %84
+         %84 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %98
+%tint_symbol = OpFunctionParameter %main_out
+        %102 = OpLabel
+        %103 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %103
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %18
+        %105 = OpLabel
+        %106 = OpFunctionCall %void %main_1
+        %108 = OpLoad %v4float %x_GLF_color
+        %109 = OpCompositeConstruct %main_out %108
+        %107 = OpFunctionCall %void %tint_symbol_2 %109
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-global-counter-loop-function/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-global-counter-loop-function/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..bb1a4df
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-global-counter-loop-function/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,93 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> x_GLF_global_loop_count : i32;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() {
+  var x_66_phi : i32;
+  let x_62 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_64 : i32 = x_7.x_GLF_uniform_int_values[0];
+  x_66_phi = x_64;
+  loop {
+    var x_67 : i32;
+    let x_66 : i32 = x_66_phi;
+    let x_70 : i32 = x_7.x_GLF_uniform_int_values[3];
+    if ((x_66 < x_70)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_73 : i32 = x_GLF_global_loop_count;
+      x_GLF_global_loop_count = (x_73 + 1);
+      x_67 = (x_66 + 1);
+      x_66_phi = x_67;
+    }
+  }
+  if ((x_62 < x_62)) {
+    return;
+  }
+  return;
+}
+
+fn main_1() {
+  x_GLF_global_loop_count = 0;
+  loop {
+    let x_28 : i32 = x_GLF_global_loop_count;
+    if ((x_28 < 10)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_32 : i32 = x_GLF_global_loop_count;
+      x_GLF_global_loop_count = (x_32 + 1);
+      func_();
+    }
+  }
+  loop {
+    let x_36 : i32 = x_GLF_global_loop_count;
+    if ((x_36 < 10)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_40 : i32 = x_GLF_global_loop_count;
+      x_GLF_global_loop_count = (x_40 + 1);
+    }
+  }
+  let x_42 : i32 = x_GLF_global_loop_count;
+  let x_44 : i32 = x_7.x_GLF_uniform_int_values[2];
+  if ((x_42 == x_44)) {
+    let x_50 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_51 : f32 = f32(x_50);
+    let x_53 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_54 : f32 = f32(x_53);
+    x_GLF_color = vec4<f32>(x_51, x_54, x_54, x_51);
+  } else {
+    let x_57 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_58 : f32 = f32(x_57);
+    x_GLF_color = vec4<f32>(x_58, x_58, x_58, x_58);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-inside-clamp/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-increment-inside-clamp/0-opt.spvasm
new file mode 100644
index 0000000..52dd4a2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-inside-clamp/0-opt.spvasm
@@ -0,0 +1,96 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+%_ptr_Function__arr_int_uint_3 = OpTypePointer Function %_arr_int_uint_3
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %29 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_0
+      %int_4 = OpConstant %int 4
+         %31 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %32 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %10
+         %33 = OpLabel
+          %a = OpVariable %_ptr_Function__arr_int_uint_3 Function
+          %b = OpVariable %_ptr_Function_int Function
+          %c = OpVariable %_ptr_Function_int Function
+         %34 = OpAccessChain %_ptr_Function_int %a %int_0
+               OpStore %34 %int_1
+         %35 = OpAccessChain %_ptr_Function_int %a %int_1
+               OpStore %35 %int_2
+         %36 = OpAccessChain %_ptr_Function_int %a %int_2
+               OpStore %36 %int_3
+               OpStore %b %int_0
+         %37 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %38 = OpLoad %int %37
+         %39 = OpAccessChain %_ptr_Function_int %a %38
+         %40 = OpLoad %int %39
+               OpStore %c %40
+         %41 = OpLoad %int %c
+         %42 = OpSGreaterThan %bool %41 %int_1
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %43
+         %44 = OpLabel
+               OpStore %_GLF_color %29
+         %45 = OpLoad %int %b
+         %46 = OpIAdd %int %45 %int_1
+               OpStore %b %46
+               OpBranch %43
+         %43 = OpLabel
+         %47 = OpLoad %int %b
+         %48 = OpIAdd %int %47 %int_1
+               OpStore %b %48
+         %49 = OpExtInst %int %1 SClamp %48 %int_0 %int_2
+         %50 = OpAccessChain %_ptr_Function_int %a %49
+         %51 = OpLoad %int %50
+         %52 = OpIAdd %int %51 %int_1
+               OpStore %50 %52
+         %53 = OpAccessChain %_ptr_Function_int %a %int_2
+         %54 = OpLoad %int %53
+         %55 = OpIEqual %bool %54 %int_4
+               OpSelectionMerge %56 None
+               OpBranchConditional %55 %57 %58
+         %57 = OpLabel
+               OpStore %_GLF_color %31
+               OpBranch %56
+         %58 = OpLabel
+               OpStore %_GLF_color %32
+               OpBranch %56
+         %56 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-inside-clamp/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-inside-clamp/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..a84f052
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-inside-clamp/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,47 @@
+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);
+
+void main_1() {
+  int a[3] = (int[3])0;
+  int b = 0;
+  int c = 0;
+  a[0] = 1;
+  a[1] = 2;
+  a[2] = 3;
+  b = 0;
+  const int x_38 = asint(x_8[0].x);
+  const int x_40 = a[x_38];
+  c = x_40;
+  if ((c > 1)) {
+    x_GLF_color = float4(0.0f, 1.0f, 1.0f, 0.0f);
+    b = (b + 1);
+  }
+  const int x_48 = (b + 1);
+  b = x_48;
+  const int x_50_save = clamp(x_48, 0, 2);
+  const int x_51 = a[x_50_save];
+  a[x_50_save] = (x_51 + 1);
+  const int x_54 = a[2];
+  if ((x_54 == 4)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-inside-clamp/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-increment-inside-clamp/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..231e58a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-inside-clamp/0-opt.spvasm.expected.msl
@@ -0,0 +1,56 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int one;
+};
+struct tint_array_wrapper {
+  int arr[3];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_4) {
+  tint_array_wrapper a = {};
+  int b = 0;
+  int c = 0;
+  a.arr[0] = 1;
+  a.arr[1] = 2;
+  a.arr[2] = 3;
+  b = 0;
+  int const x_38 = x_8.one;
+  int const x_40 = a.arr[x_38];
+  c = x_40;
+  int const x_41 = c;
+  if ((x_41 > 1)) {
+    *(tint_symbol_4) = float4(0.0f, 1.0f, 1.0f, 0.0f);
+    int const x_45 = b;
+    b = (x_45 + 1);
+  }
+  int const x_47 = b;
+  int const x_48 = (x_47 + 1);
+  b = x_48;
+  int const x_50_save = clamp(x_48, 0, 2);
+  int const x_51 = a.arr[x_50_save];
+  a.arr[x_50_save] = (x_51 + 1);
+  int const x_54 = a.arr[2];
+  if ((x_54 == 4)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-inside-clamp/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-increment-inside-clamp/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..413b393
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-inside-clamp/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,133 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 78
+; Schema: 0
+               OpCapability Shader
+         %52 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+%_ptr_Function__arr_int_uint_3 = OpTypePointer Function %_arr_int_uint_3
+         %21 = OpConstantNull %_arr_int_uint_3
+%_ptr_Function_int = OpTypePointer Function %int
+         %24 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %46 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_0
+      %int_4 = OpConstant %int 4
+         %64 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %65 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %66 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %a = OpVariable %_ptr_Function__arr_int_uint_3 Function %21
+          %b = OpVariable %_ptr_Function_int Function %24
+          %c = OpVariable %_ptr_Function_int Function %24
+         %27 = OpAccessChain %_ptr_Function_int %a %int_0
+               OpStore %27 %int_1
+         %29 = OpAccessChain %_ptr_Function_int %a %int_1
+               OpStore %29 %int_2
+         %31 = OpAccessChain %_ptr_Function_int %a %int_2
+               OpStore %31 %int_3
+               OpStore %b %int_0
+         %35 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0
+         %36 = OpLoad %int %35
+         %37 = OpAccessChain %_ptr_Function_int %a %36
+         %38 = OpLoad %int %37
+               OpStore %c %38
+         %39 = OpLoad %int %c
+         %40 = OpSGreaterThan %bool %39 %int_1
+               OpSelectionMerge %42 None
+               OpBranchConditional %40 %43 %42
+         %43 = OpLabel
+               OpStore %x_GLF_color %46
+         %47 = OpLoad %int %b
+         %48 = OpIAdd %int %47 %int_1
+               OpStore %b %48
+               OpBranch %42
+         %42 = OpLabel
+         %49 = OpLoad %int %b
+         %50 = OpIAdd %int %49 %int_1
+               OpStore %b %50
+         %51 = OpExtInst %int %52 SClamp %50 %int_0 %int_2
+         %53 = OpAccessChain %_ptr_Function_int %a %51
+         %54 = OpLoad %int %53
+         %55 = OpAccessChain %_ptr_Function_int %a %51
+         %56 = OpIAdd %int %54 %int_1
+               OpStore %55 %56
+         %57 = OpAccessChain %_ptr_Function_int %a %int_2
+         %58 = OpLoad %int %57
+         %60 = OpIEqual %bool %58 %int_4
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %63
+         %62 = OpLabel
+               OpStore %x_GLF_color %64
+               OpBranch %61
+         %63 = OpLabel
+               OpStore %x_GLF_color %65
+               OpBranch %61
+         %61 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %66
+%tint_symbol = OpFunctionParameter %main_out
+         %70 = OpLabel
+         %71 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %71
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %73 = OpLabel
+         %74 = OpFunctionCall %void %main_1
+         %76 = OpLoad %v4float %x_GLF_color
+         %77 = OpCompositeConstruct %main_out %76
+         %75 = OpFunctionCall %void %tint_symbol_2 %77
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-inside-clamp/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-inside-clamp/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..f70aa97
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-inside-clamp/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,51 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : array<i32, 3>;
+  var b : i32;
+  var c : i32;
+  a[0] = 1;
+  a[1] = 2;
+  a[2] = 3;
+  b = 0;
+  let x_38 : i32 = x_8.one;
+  let x_40 : i32 = a[x_38];
+  c = x_40;
+  let x_41 : i32 = c;
+  if ((x_41 > 1)) {
+    x_GLF_color = vec4<f32>(0.0, 1.0, 1.0, 0.0);
+    let x_45 : i32 = b;
+    b = (x_45 + 1);
+  }
+  let x_47 : i32 = b;
+  let x_48 : i32 = (x_47 + 1);
+  b = x_48;
+  let x_50 : ptr<function, i32> = &(a[clamp(x_48, 0, 2)]);
+  let x_51 : i32 = *(x_50);
+  *(x_50) = (x_51 + 1);
+  let x_54 : i32 = a[2];
+  if ((x_54 == 4)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-inside-clamp/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-inside-clamp/0-opt.wgsl
new file mode 100644
index 0000000..f70aa97
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-inside-clamp/0-opt.wgsl
@@ -0,0 +1,51 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : array<i32, 3>;
+  var b : i32;
+  var c : i32;
+  a[0] = 1;
+  a[1] = 2;
+  a[2] = 3;
+  b = 0;
+  let x_38 : i32 = x_8.one;
+  let x_40 : i32 = a[x_38];
+  c = x_40;
+  let x_41 : i32 = c;
+  if ((x_41 > 1)) {
+    x_GLF_color = vec4<f32>(0.0, 1.0, 1.0, 0.0);
+    let x_45 : i32 = b;
+    b = (x_45 + 1);
+  }
+  let x_47 : i32 = b;
+  let x_48 : i32 = (x_47 + 1);
+  b = x_48;
+  let x_50 : ptr<function, i32> = &(a[clamp(x_48, 0, 2)]);
+  let x_51 : i32 = *(x_50);
+  *(x_50) = (x_51 + 1);
+  let x_54 : i32 = a[2];
+  if ((x_54 == 4)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-inside-clamp/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-inside-clamp/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..a84f052
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-inside-clamp/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,47 @@
+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);
+
+void main_1() {
+  int a[3] = (int[3])0;
+  int b = 0;
+  int c = 0;
+  a[0] = 1;
+  a[1] = 2;
+  a[2] = 3;
+  b = 0;
+  const int x_38 = asint(x_8[0].x);
+  const int x_40 = a[x_38];
+  c = x_40;
+  if ((c > 1)) {
+    x_GLF_color = float4(0.0f, 1.0f, 1.0f, 0.0f);
+    b = (b + 1);
+  }
+  const int x_48 = (b + 1);
+  b = x_48;
+  const int x_50_save = clamp(x_48, 0, 2);
+  const int x_51 = a[x_50_save];
+  a[x_50_save] = (x_51 + 1);
+  const int x_54 = a[2];
+  if ((x_54 == 4)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-inside-clamp/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-increment-inside-clamp/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..231e58a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-inside-clamp/0-opt.wgsl.expected.msl
@@ -0,0 +1,56 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int one;
+};
+struct tint_array_wrapper {
+  int arr[3];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_4) {
+  tint_array_wrapper a = {};
+  int b = 0;
+  int c = 0;
+  a.arr[0] = 1;
+  a.arr[1] = 2;
+  a.arr[2] = 3;
+  b = 0;
+  int const x_38 = x_8.one;
+  int const x_40 = a.arr[x_38];
+  c = x_40;
+  int const x_41 = c;
+  if ((x_41 > 1)) {
+    *(tint_symbol_4) = float4(0.0f, 1.0f, 1.0f, 0.0f);
+    int const x_45 = b;
+    b = (x_45 + 1);
+  }
+  int const x_47 = b;
+  int const x_48 = (x_47 + 1);
+  b = x_48;
+  int const x_50_save = clamp(x_48, 0, 2);
+  int const x_51 = a.arr[x_50_save];
+  a.arr[x_50_save] = (x_51 + 1);
+  int const x_54 = a.arr[2];
+  if ((x_54 == 4)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-inside-clamp/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-increment-inside-clamp/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..413b393
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-inside-clamp/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,133 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 78
+; Schema: 0
+               OpCapability Shader
+         %52 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+%_ptr_Function__arr_int_uint_3 = OpTypePointer Function %_arr_int_uint_3
+         %21 = OpConstantNull %_arr_int_uint_3
+%_ptr_Function_int = OpTypePointer Function %int
+         %24 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %46 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_0
+      %int_4 = OpConstant %int 4
+         %64 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %65 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %66 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %a = OpVariable %_ptr_Function__arr_int_uint_3 Function %21
+          %b = OpVariable %_ptr_Function_int Function %24
+          %c = OpVariable %_ptr_Function_int Function %24
+         %27 = OpAccessChain %_ptr_Function_int %a %int_0
+               OpStore %27 %int_1
+         %29 = OpAccessChain %_ptr_Function_int %a %int_1
+               OpStore %29 %int_2
+         %31 = OpAccessChain %_ptr_Function_int %a %int_2
+               OpStore %31 %int_3
+               OpStore %b %int_0
+         %35 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0
+         %36 = OpLoad %int %35
+         %37 = OpAccessChain %_ptr_Function_int %a %36
+         %38 = OpLoad %int %37
+               OpStore %c %38
+         %39 = OpLoad %int %c
+         %40 = OpSGreaterThan %bool %39 %int_1
+               OpSelectionMerge %42 None
+               OpBranchConditional %40 %43 %42
+         %43 = OpLabel
+               OpStore %x_GLF_color %46
+         %47 = OpLoad %int %b
+         %48 = OpIAdd %int %47 %int_1
+               OpStore %b %48
+               OpBranch %42
+         %42 = OpLabel
+         %49 = OpLoad %int %b
+         %50 = OpIAdd %int %49 %int_1
+               OpStore %b %50
+         %51 = OpExtInst %int %52 SClamp %50 %int_0 %int_2
+         %53 = OpAccessChain %_ptr_Function_int %a %51
+         %54 = OpLoad %int %53
+         %55 = OpAccessChain %_ptr_Function_int %a %51
+         %56 = OpIAdd %int %54 %int_1
+               OpStore %55 %56
+         %57 = OpAccessChain %_ptr_Function_int %a %int_2
+         %58 = OpLoad %int %57
+         %60 = OpIEqual %bool %58 %int_4
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %63
+         %62 = OpLabel
+               OpStore %x_GLF_color %64
+               OpBranch %61
+         %63 = OpLabel
+               OpStore %x_GLF_color %65
+               OpBranch %61
+         %61 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %66
+%tint_symbol = OpFunctionParameter %main_out
+         %70 = OpLabel
+         %71 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %71
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %73 = OpLabel
+         %74 = OpFunctionCall %void %main_1
+         %76 = OpLoad %v4float %x_GLF_color
+         %77 = OpCompositeConstruct %main_out %76
+         %75 = OpFunctionCall %void %tint_symbol_2 %77
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-inside-clamp/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-inside-clamp/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..f70aa97
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-inside-clamp/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,51 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : array<i32, 3>;
+  var b : i32;
+  var c : i32;
+  a[0] = 1;
+  a[1] = 2;
+  a[2] = 3;
+  b = 0;
+  let x_38 : i32 = x_8.one;
+  let x_40 : i32 = a[x_38];
+  c = x_40;
+  let x_41 : i32 = c;
+  if ((x_41 > 1)) {
+    x_GLF_color = vec4<f32>(0.0, 1.0, 1.0, 0.0);
+    let x_45 : i32 = b;
+    b = (x_45 + 1);
+  }
+  let x_47 : i32 = b;
+  let x_48 : i32 = (x_47 + 1);
+  b = x_48;
+  let x_50 : ptr<function, i32> = &(a[clamp(x_48, 0, 2)]);
+  let x_51 : i32 = *(x_50);
+  *(x_50) = (x_51 + 1);
+  let x_54 : i32 = a[2];
+  if ((x_54 == 4)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-int-loop-counter-mod-array/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-increment-int-loop-counter-mod-array/0-opt.spvasm
new file mode 100644
index 0000000..6d83d1d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-int-loop-counter-mod-array/0-opt.spvasm
@@ -0,0 +1,121 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %indexable "indexable"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_5 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_int_uint_5 = OpTypeArray %int %uint_5
+       %buf0 = OpTypeStruct %_arr_int_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+       %bool = OpTypeBool
+     %uint_9 = OpConstant %uint 9
+%_arr_int_uint_9 = OpTypeArray %int %uint_9
+      %int_1 = OpConstant %int 1
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+      %int_9 = OpConstant %int 9
+         %31 = OpConstantComposite %_arr_int_uint_9 %int_1 %int_2 %int_3 %int_4 %int_5 %int_6 %int_7 %int_8 %int_9
+%_ptr_Function__arr_int_uint_9 = OpTypePointer Function %_arr_int_uint_9
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %11
+         %36 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+  %indexable = OpVariable %_ptr_Function__arr_int_uint_9 Function
+         %37 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %38 = OpLoad %int %37
+               OpStore %a %38
+         %39 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %40 = OpLoad %int %39
+               OpStore %i %40
+               OpBranch %41
+         %41 = OpLabel
+               OpLoopMerge %42 %43 None
+               OpBranch %44
+         %44 = OpLabel
+         %45 = OpLoad %int %i
+         %46 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %47 = OpLoad %int %46
+         %48 = OpSLessThan %bool %45 %47
+               OpBranchConditional %48 %49 %42
+         %49 = OpLabel
+         %50 = OpLoad %int %i
+         %51 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_4
+         %52 = OpLoad %int %51
+         %53 = OpSMod %int %50 %52
+               OpStore %indexable %31
+         %54 = OpAccessChain %_ptr_Function_int %indexable %53
+         %55 = OpLoad %int %54
+         %56 = OpLoad %int %a
+         %57 = OpIAdd %int %56 %55
+               OpStore %a %57
+               OpBranch %43
+         %43 = OpLabel
+         %58 = OpLoad %int %i
+         %59 = OpIAdd %int %58 %int_1
+               OpStore %i %59
+               OpBranch %41
+         %42 = OpLabel
+         %60 = OpLoad %int %a
+         %61 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %62 = OpLoad %int %61
+         %63 = OpIEqual %bool %60 %62
+               OpSelectionMerge %64 None
+               OpBranchConditional %63 %65 %66
+         %65 = OpLabel
+         %67 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %68 = OpLoad %int %67
+         %69 = OpConvertSToF %float %68
+         %70 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %71 = OpLoad %int %70
+         %72 = OpConvertSToF %float %71
+         %73 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %74 = OpLoad %int %73
+         %75 = OpConvertSToF %float %74
+         %76 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %77 = OpLoad %int %76
+         %78 = OpConvertSToF %float %77
+         %79 = OpCompositeConstruct %v4float %69 %72 %75 %78
+               OpStore %_GLF_color %79
+               OpBranch %64
+         %66 = OpLabel
+         %80 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %81 = OpLoad %int %80
+         %82 = OpConvertSToF %float %81
+         %83 = OpCompositeConstruct %v4float %82 %82 %82 %82
+               OpStore %_GLF_color %83
+               OpBranch %64
+         %64 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-int-loop-counter-mod-array/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-int-loop-counter-mod-array/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..7e2ef37
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-int-loop-counter-mod-array/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,60 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[5];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  int i = 0;
+  int indexable[9] = (int[9])0;
+  const int x_38 = asint(x_6[2].x);
+  a = x_38;
+  const int x_40 = asint(x_6[3].x);
+  i = x_40;
+  while (true) {
+    const int x_45 = i;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_47 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_45 < x_47)) {
+    } else {
+      break;
+    }
+    const int x_50 = i;
+    const int x_52 = asint(x_6[4].x);
+    const int tint_symbol_3[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
+    indexable = tint_symbol_3;
+    const int x_55 = indexable[(x_50 % x_52)];
+    a = (a + x_55);
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_60 = a;
+  const int x_62 = asint(x_6[1].x);
+  if ((x_60 == x_62)) {
+    const int x_68 = asint(x_6[2].x);
+    const int x_71 = asint(x_6[3].x);
+    const int x_74 = asint(x_6[3].x);
+    const int x_77 = asint(x_6[2].x);
+    x_GLF_color = float4(float(x_68), float(x_71), float(x_74), float(x_77));
+  } else {
+    const int x_81 = asint(x_6[3].x);
+    const float x_82 = float(x_81);
+    x_GLF_color = float4(x_82, x_82, x_82, x_82);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-int-loop-counter-mod-array/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-increment-int-loop-counter-mod-array/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..8671edc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-int-loop-counter-mod-array/0-opt.spvasm.expected.msl
@@ -0,0 +1,74 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[5];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_1 {
+  int arr[9];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_5) {
+  int a = 0;
+  int i = 0;
+  tint_array_wrapper_1 indexable = {};
+  int const x_38 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  a = x_38;
+  int const x_40 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  i = x_40;
+  while (true) {
+    int const x_45 = i;
+    int const x_47 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_45 < x_47)) {
+    } else {
+      break;
+    }
+    int const x_50 = i;
+    int const x_52 = x_6.x_GLF_uniform_int_values.arr[4].el;
+    tint_array_wrapper_1 const tint_symbol_3 = {.arr={1, 2, 3, 4, 5, 6, 7, 8, 9}};
+    indexable = tint_symbol_3;
+    int const x_55 = indexable.arr[(x_50 % x_52)];
+    int const x_56 = a;
+    a = (x_56 + x_55);
+    {
+      int const x_58 = i;
+      i = (x_58 + 1);
+    }
+  }
+  int const x_60 = a;
+  int const x_62 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_60 == x_62)) {
+    int const x_68 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_71 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    int const x_74 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    int const x_77 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    *(tint_symbol_5) = float4(float(x_68), float(x_71), float(x_74), float(x_77));
+  } else {
+    int const x_81 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    float const x_82 = float(x_81);
+    *(tint_symbol_5) = float4(x_82, x_82, x_82, x_82);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_6, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-int-loop-counter-mod-array/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-increment-int-loop-counter-mod-array/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..761bab9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-int-loop-counter-mod-array/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,161 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 103
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %indexable "indexable"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_5 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_9 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_int_uint_5 = OpTypeArray %int %uint_5
+       %buf0 = OpTypeStruct %_arr_int_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_9 = OpConstant %uint 9
+%_arr_int_uint_9 = OpTypeArray %int %uint_9
+%_ptr_Function__arr_int_uint_9 = OpTypePointer Function %_arr_int_uint_9
+         %27 = OpConstantNull %_arr_int_uint_9
+     %uint_0 = OpConstant %uint 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_4 = OpConstant %int 4
+      %int_1 = OpConstant %int 1
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+      %int_9 = OpConstant %int 9
+         %59 = OpConstantComposite %_arr_int_uint_9 %int_1 %int_2 %int_3 %int_4 %int_5 %int_6 %int_7 %int_8 %int_9
+   %main_out = OpTypeStruct %v4float
+         %91 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+          %i = OpVariable %_ptr_Function_int Function %21
+  %indexable = OpVariable %_ptr_Function__arr_int_uint_9 Function %27
+         %31 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %32 = OpLoad %int %31
+               OpStore %a %32
+         %34 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %35 = OpLoad %int %34
+               OpStore %i %35
+               OpBranch %36
+         %36 = OpLabel
+               OpLoopMerge %37 %38 None
+               OpBranch %39
+         %39 = OpLabel
+         %40 = OpLoad %int %i
+         %42 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %43 = OpLoad %int %42
+         %44 = OpSLessThan %bool %40 %43
+               OpSelectionMerge %46 None
+               OpBranchConditional %44 %47 %48
+         %47 = OpLabel
+               OpBranch %46
+         %48 = OpLabel
+               OpBranch %37
+         %46 = OpLabel
+         %49 = OpLoad %int %i
+         %51 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+         %52 = OpLoad %int %51
+               OpStore %indexable %59
+         %60 = OpSMod %int %49 %52
+         %61 = OpAccessChain %_ptr_Function_int %indexable %60
+         %62 = OpLoad %int %61
+         %63 = OpLoad %int %a
+         %64 = OpIAdd %int %63 %62
+               OpStore %a %64
+               OpBranch %38
+         %38 = OpLabel
+         %65 = OpLoad %int %i
+         %66 = OpIAdd %int %65 %int_1
+               OpStore %i %66
+               OpBranch %36
+         %37 = OpLabel
+         %67 = OpLoad %int %a
+         %68 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %69 = OpLoad %int %68
+         %70 = OpIEqual %bool %67 %69
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %73
+         %72 = OpLabel
+         %74 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %75 = OpLoad %int %74
+         %76 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %77 = OpLoad %int %76
+         %78 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %79 = OpLoad %int %78
+         %80 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %81 = OpLoad %int %80
+         %82 = OpConvertSToF %float %75
+         %83 = OpConvertSToF %float %77
+         %84 = OpConvertSToF %float %79
+         %85 = OpConvertSToF %float %81
+         %86 = OpCompositeConstruct %v4float %82 %83 %84 %85
+               OpStore %x_GLF_color %86
+               OpBranch %71
+         %73 = OpLabel
+         %87 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %88 = OpLoad %int %87
+         %89 = OpConvertSToF %float %88
+         %90 = OpCompositeConstruct %v4float %89 %89 %89 %89
+               OpStore %x_GLF_color %90
+               OpBranch %71
+         %71 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %91
+%tint_symbol = OpFunctionParameter %main_out
+         %95 = OpLabel
+         %96 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %96
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %98 = OpLabel
+         %99 = OpFunctionCall %void %main_1
+        %101 = OpLoad %v4float %x_GLF_color
+        %102 = OpCompositeConstruct %main_out %101
+        %100 = OpFunctionCall %void %tint_symbol_2 %102
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-int-loop-counter-mod-array/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-int-loop-counter-mod-array/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..486246c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-int-loop-counter-mod-array/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,64 @@
+type Arr = [[stride(16)]] array<i32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  var indexable : array<i32, 9>;
+  let x_38 : i32 = x_6.x_GLF_uniform_int_values[2];
+  a = x_38;
+  let x_40 : i32 = x_6.x_GLF_uniform_int_values[3];
+  i = x_40;
+  loop {
+    let x_45 : i32 = i;
+    let x_47 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_45 < x_47)) {
+    } else {
+      break;
+    }
+    let x_50 : i32 = i;
+    let x_52 : i32 = x_6.x_GLF_uniform_int_values[4];
+    indexable = array<i32, 9>(1, 2, 3, 4, 5, 6, 7, 8, 9);
+    let x_55 : i32 = indexable[(x_50 % x_52)];
+    let x_56 : i32 = a;
+    a = (x_56 + x_55);
+
+    continuing {
+      let x_58 : i32 = i;
+      i = (x_58 + 1);
+    }
+  }
+  let x_60 : i32 = a;
+  let x_62 : i32 = x_6.x_GLF_uniform_int_values[1];
+  if ((x_60 == x_62)) {
+    let x_68 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_71 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_74 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_77 : i32 = x_6.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_68), f32(x_71), f32(x_74), f32(x_77));
+  } else {
+    let x_81 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_82 : f32 = f32(x_81);
+    x_GLF_color = vec4<f32>(x_82, x_82, x_82, x_82);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-int-loop-counter-mod-array/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-int-loop-counter-mod-array/0-opt.wgsl
new file mode 100644
index 0000000..486246c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-int-loop-counter-mod-array/0-opt.wgsl
@@ -0,0 +1,64 @@
+type Arr = [[stride(16)]] array<i32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  var indexable : array<i32, 9>;
+  let x_38 : i32 = x_6.x_GLF_uniform_int_values[2];
+  a = x_38;
+  let x_40 : i32 = x_6.x_GLF_uniform_int_values[3];
+  i = x_40;
+  loop {
+    let x_45 : i32 = i;
+    let x_47 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_45 < x_47)) {
+    } else {
+      break;
+    }
+    let x_50 : i32 = i;
+    let x_52 : i32 = x_6.x_GLF_uniform_int_values[4];
+    indexable = array<i32, 9>(1, 2, 3, 4, 5, 6, 7, 8, 9);
+    let x_55 : i32 = indexable[(x_50 % x_52)];
+    let x_56 : i32 = a;
+    a = (x_56 + x_55);
+
+    continuing {
+      let x_58 : i32 = i;
+      i = (x_58 + 1);
+    }
+  }
+  let x_60 : i32 = a;
+  let x_62 : i32 = x_6.x_GLF_uniform_int_values[1];
+  if ((x_60 == x_62)) {
+    let x_68 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_71 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_74 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_77 : i32 = x_6.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_68), f32(x_71), f32(x_74), f32(x_77));
+  } else {
+    let x_81 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_82 : f32 = f32(x_81);
+    x_GLF_color = vec4<f32>(x_82, x_82, x_82, x_82);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-int-loop-counter-mod-array/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-int-loop-counter-mod-array/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..7e2ef37
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-int-loop-counter-mod-array/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,60 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[5];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  int i = 0;
+  int indexable[9] = (int[9])0;
+  const int x_38 = asint(x_6[2].x);
+  a = x_38;
+  const int x_40 = asint(x_6[3].x);
+  i = x_40;
+  while (true) {
+    const int x_45 = i;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_47 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_45 < x_47)) {
+    } else {
+      break;
+    }
+    const int x_50 = i;
+    const int x_52 = asint(x_6[4].x);
+    const int tint_symbol_3[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
+    indexable = tint_symbol_3;
+    const int x_55 = indexable[(x_50 % x_52)];
+    a = (a + x_55);
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_60 = a;
+  const int x_62 = asint(x_6[1].x);
+  if ((x_60 == x_62)) {
+    const int x_68 = asint(x_6[2].x);
+    const int x_71 = asint(x_6[3].x);
+    const int x_74 = asint(x_6[3].x);
+    const int x_77 = asint(x_6[2].x);
+    x_GLF_color = float4(float(x_68), float(x_71), float(x_74), float(x_77));
+  } else {
+    const int x_81 = asint(x_6[3].x);
+    const float x_82 = float(x_81);
+    x_GLF_color = float4(x_82, x_82, x_82, x_82);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-int-loop-counter-mod-array/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-increment-int-loop-counter-mod-array/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..8671edc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-int-loop-counter-mod-array/0-opt.wgsl.expected.msl
@@ -0,0 +1,74 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[5];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_1 {
+  int arr[9];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_5) {
+  int a = 0;
+  int i = 0;
+  tint_array_wrapper_1 indexable = {};
+  int const x_38 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  a = x_38;
+  int const x_40 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  i = x_40;
+  while (true) {
+    int const x_45 = i;
+    int const x_47 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_45 < x_47)) {
+    } else {
+      break;
+    }
+    int const x_50 = i;
+    int const x_52 = x_6.x_GLF_uniform_int_values.arr[4].el;
+    tint_array_wrapper_1 const tint_symbol_3 = {.arr={1, 2, 3, 4, 5, 6, 7, 8, 9}};
+    indexable = tint_symbol_3;
+    int const x_55 = indexable.arr[(x_50 % x_52)];
+    int const x_56 = a;
+    a = (x_56 + x_55);
+    {
+      int const x_58 = i;
+      i = (x_58 + 1);
+    }
+  }
+  int const x_60 = a;
+  int const x_62 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_60 == x_62)) {
+    int const x_68 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_71 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    int const x_74 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    int const x_77 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    *(tint_symbol_5) = float4(float(x_68), float(x_71), float(x_74), float(x_77));
+  } else {
+    int const x_81 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    float const x_82 = float(x_81);
+    *(tint_symbol_5) = float4(x_82, x_82, x_82, x_82);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_6, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-int-loop-counter-mod-array/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-increment-int-loop-counter-mod-array/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..761bab9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-int-loop-counter-mod-array/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,161 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 103
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %indexable "indexable"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_5 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_9 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_int_uint_5 = OpTypeArray %int %uint_5
+       %buf0 = OpTypeStruct %_arr_int_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_9 = OpConstant %uint 9
+%_arr_int_uint_9 = OpTypeArray %int %uint_9
+%_ptr_Function__arr_int_uint_9 = OpTypePointer Function %_arr_int_uint_9
+         %27 = OpConstantNull %_arr_int_uint_9
+     %uint_0 = OpConstant %uint 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_4 = OpConstant %int 4
+      %int_1 = OpConstant %int 1
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+      %int_9 = OpConstant %int 9
+         %59 = OpConstantComposite %_arr_int_uint_9 %int_1 %int_2 %int_3 %int_4 %int_5 %int_6 %int_7 %int_8 %int_9
+   %main_out = OpTypeStruct %v4float
+         %91 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+          %i = OpVariable %_ptr_Function_int Function %21
+  %indexable = OpVariable %_ptr_Function__arr_int_uint_9 Function %27
+         %31 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %32 = OpLoad %int %31
+               OpStore %a %32
+         %34 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %35 = OpLoad %int %34
+               OpStore %i %35
+               OpBranch %36
+         %36 = OpLabel
+               OpLoopMerge %37 %38 None
+               OpBranch %39
+         %39 = OpLabel
+         %40 = OpLoad %int %i
+         %42 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %43 = OpLoad %int %42
+         %44 = OpSLessThan %bool %40 %43
+               OpSelectionMerge %46 None
+               OpBranchConditional %44 %47 %48
+         %47 = OpLabel
+               OpBranch %46
+         %48 = OpLabel
+               OpBranch %37
+         %46 = OpLabel
+         %49 = OpLoad %int %i
+         %51 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+         %52 = OpLoad %int %51
+               OpStore %indexable %59
+         %60 = OpSMod %int %49 %52
+         %61 = OpAccessChain %_ptr_Function_int %indexable %60
+         %62 = OpLoad %int %61
+         %63 = OpLoad %int %a
+         %64 = OpIAdd %int %63 %62
+               OpStore %a %64
+               OpBranch %38
+         %38 = OpLabel
+         %65 = OpLoad %int %i
+         %66 = OpIAdd %int %65 %int_1
+               OpStore %i %66
+               OpBranch %36
+         %37 = OpLabel
+         %67 = OpLoad %int %a
+         %68 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %69 = OpLoad %int %68
+         %70 = OpIEqual %bool %67 %69
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %73
+         %72 = OpLabel
+         %74 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %75 = OpLoad %int %74
+         %76 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %77 = OpLoad %int %76
+         %78 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %79 = OpLoad %int %78
+         %80 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %81 = OpLoad %int %80
+         %82 = OpConvertSToF %float %75
+         %83 = OpConvertSToF %float %77
+         %84 = OpConvertSToF %float %79
+         %85 = OpConvertSToF %float %81
+         %86 = OpCompositeConstruct %v4float %82 %83 %84 %85
+               OpStore %x_GLF_color %86
+               OpBranch %71
+         %73 = OpLabel
+         %87 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %88 = OpLoad %int %87
+         %89 = OpConvertSToF %float %88
+         %90 = OpCompositeConstruct %v4float %89 %89 %89 %89
+               OpStore %x_GLF_color %90
+               OpBranch %71
+         %71 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %91
+%tint_symbol = OpFunctionParameter %main_out
+         %95 = OpLabel
+         %96 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %96
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %98 = OpLabel
+         %99 = OpFunctionCall %void %main_1
+        %101 = OpLoad %v4float %x_GLF_color
+        %102 = OpCompositeConstruct %main_out %101
+        %100 = OpFunctionCall %void %tint_symbol_2 %102
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-int-loop-counter-mod-array/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-int-loop-counter-mod-array/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..486246c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-int-loop-counter-mod-array/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,64 @@
+type Arr = [[stride(16)]] array<i32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  var indexable : array<i32, 9>;
+  let x_38 : i32 = x_6.x_GLF_uniform_int_values[2];
+  a = x_38;
+  let x_40 : i32 = x_6.x_GLF_uniform_int_values[3];
+  i = x_40;
+  loop {
+    let x_45 : i32 = i;
+    let x_47 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_45 < x_47)) {
+    } else {
+      break;
+    }
+    let x_50 : i32 = i;
+    let x_52 : i32 = x_6.x_GLF_uniform_int_values[4];
+    indexable = array<i32, 9>(1, 2, 3, 4, 5, 6, 7, 8, 9);
+    let x_55 : i32 = indexable[(x_50 % x_52)];
+    let x_56 : i32 = a;
+    a = (x_56 + x_55);
+
+    continuing {
+      let x_58 : i32 = i;
+      i = (x_58 + 1);
+    }
+  }
+  let x_60 : i32 = a;
+  let x_62 : i32 = x_6.x_GLF_uniform_int_values[1];
+  if ((x_60 == x_62)) {
+    let x_68 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_71 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_74 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_77 : i32 = x_6.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_68), f32(x_71), f32(x_74), f32(x_77));
+  } else {
+    let x_81 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_82 : f32 = f32(x_81);
+    x_GLF_color = vec4<f32>(x_82, x_82, x_82, x_82);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-multiple-integers/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-increment-multiple-integers/0-opt.spvasm
new file mode 100644
index 0000000..8524015
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-multiple-integers/0-opt.spvasm
@@ -0,0 +1,159 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %b "b"
+               OpName %c "c"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_5 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_int_uint_5 = OpTypeArray %int %uint_5
+       %buf0 = OpTypeStruct %_arr_int_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+      %int_1 = OpConstant %int 1
+      %int_4 = OpConstant %int 4
+       %bool = OpTypeBool
+     %int_10 = OpConstant %int 10
+      %int_5 = OpConstant %int 5
+      %int_3 = OpConstant %int 3
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %11
+         %29 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+          %b = OpVariable %_ptr_Function_int Function
+          %c = OpVariable %_ptr_Function_int Function
+         %30 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %31 = OpLoad %int %30
+               OpStore %a %31
+         %32 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %33 = OpLoad %int %32
+               OpStore %b %33
+               OpStore %c %int_1
+               OpBranch %34
+         %34 = OpLabel
+               OpLoopMerge %35 %36 None
+               OpBranch %37
+         %37 = OpLabel
+         %38 = OpLoad %int %b
+         %39 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_4
+         %40 = OpLoad %int %39
+         %41 = OpSLessThan %bool %38 %40
+         %42 = OpLoad %int %a
+         %43 = OpSLessThan %bool %42 %int_10
+         %44 = OpLogicalAnd %bool %41 %43
+               OpBranchConditional %44 %45 %35
+         %45 = OpLabel
+         %46 = OpLoad %int %c
+         %47 = OpSGreaterThan %bool %46 %int_5
+               OpSelectionMerge %48 None
+               OpBranchConditional %47 %49 %48
+         %49 = OpLabel
+               OpBranch %35
+         %48 = OpLabel
+         %50 = OpLoad %int %a
+         %51 = OpIAdd %int %50 %int_1
+               OpStore %a %51
+         %52 = OpLoad %int %c
+         %53 = OpIAdd %int %52 %int_1
+               OpStore %c %53
+         %54 = OpLoad %int %b
+         %55 = OpIAdd %int %54 %int_1
+               OpStore %b %55
+               OpBranch %36
+         %36 = OpLabel
+               OpBranch %34
+         %35 = OpLabel
+               OpBranch %56
+         %56 = OpLabel
+               OpLoopMerge %57 %58 None
+               OpBranch %59
+         %59 = OpLabel
+         %60 = OpLoad %int %a
+         %61 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %62 = OpLoad %int %61
+         %63 = OpSLessThan %bool %60 %62
+               OpBranchConditional %63 %64 %57
+         %64 = OpLabel
+               OpBranch %58
+         %58 = OpLabel
+         %65 = OpLoad %int %a
+         %66 = OpIAdd %int %65 %int_1
+               OpStore %a %66
+               OpBranch %56
+         %57 = OpLabel
+         %67 = OpLoad %int %a
+         %68 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %69 = OpLoad %int %68
+         %70 = OpIEqual %bool %67 %69
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %71
+         %72 = OpLabel
+         %73 = OpLoad %int %b
+         %74 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %75 = OpLoad %int %74
+         %76 = OpIEqual %bool %73 %75
+               OpBranch %71
+         %71 = OpLabel
+         %77 = OpPhi %bool %70 %57 %76 %72
+               OpSelectionMerge %78 None
+               OpBranchConditional %77 %79 %78
+         %79 = OpLabel
+         %80 = OpLoad %int %c
+         %81 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %82 = OpLoad %int %81
+         %83 = OpIEqual %bool %80 %82
+               OpBranch %78
+         %78 = OpLabel
+         %84 = OpPhi %bool %77 %71 %83 %79
+               OpSelectionMerge %85 None
+               OpBranchConditional %84 %86 %87
+         %86 = OpLabel
+         %88 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %89 = OpLoad %int %88
+         %90 = OpConvertSToF %float %89
+         %91 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %92 = OpLoad %int %91
+         %93 = OpConvertSToF %float %92
+         %94 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %95 = OpLoad %int %94
+         %96 = OpConvertSToF %float %95
+         %97 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %98 = OpLoad %int %97
+         %99 = OpConvertSToF %float %98
+        %100 = OpCompositeConstruct %v4float %90 %93 %96 %99
+               OpStore %_GLF_color %100
+               OpBranch %85
+         %87 = OpLabel
+        %101 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+        %102 = OpLoad %int %101
+        %103 = OpConvertSToF %float %102
+        %104 = OpCompositeConstruct %v4float %103 %103 %103 %103
+               OpStore %_GLF_color %104
+               OpBranch %85
+         %85 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-multiple-integers/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-multiple-integers/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..1693e5c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-multiple-integers/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,96 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[5];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  int b = 0;
+  int c = 0;
+  bool x_76 = false;
+  bool x_83 = false;
+  bool x_77_phi = false;
+  bool x_84_phi = false;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_31 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  a = x_31;
+  const int x_33 = asint(x_6[2].x);
+  b = x_33;
+  c = 1;
+  while (true) {
+    const int x_38 = b;
+    const int x_40 = asint(x_6[4].x);
+    bool tint_tmp = (x_38 < x_40);
+    if (tint_tmp) {
+      tint_tmp = (a < 10);
+    }
+    if ((tint_tmp)) {
+    } else {
+      break;
+    }
+    if ((c > 5)) {
+      break;
+    }
+    a = (a + 1);
+    c = (c + 1);
+    b = (b + 1);
+  }
+  while (true) {
+    const int x_60 = a;
+    const int x_62 = asint(x_6[1].x);
+    if ((x_60 < x_62)) {
+    } else {
+      break;
+    }
+    {
+      a = (a + 1);
+    }
+  }
+  const int x_67 = a;
+  const int x_69 = asint(x_6[1].x);
+  const bool x_70 = (x_67 == x_69);
+  x_77_phi = x_70;
+  if (x_70) {
+    const int x_73 = b;
+    const int x_75 = asint(x_6[3].x);
+    x_76 = (x_73 == x_75);
+    x_77_phi = x_76;
+  }
+  const bool x_77 = x_77_phi;
+  x_84_phi = x_77;
+  if (x_77) {
+    const int x_80 = c;
+    const int x_82 = asint(x_6[3].x);
+    x_83 = (x_80 == x_82);
+    x_84_phi = x_83;
+  }
+  if (x_84_phi) {
+    const int x_89 = asint(x_6[2].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_92 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_95 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_98 = asint(x_6[2].x);
+    x_GLF_color = float4(float(x_89), float(x_92), float(x_95), float(x_98));
+  } else {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_102 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const float x_103 = float(x_102);
+    x_GLF_color = float4(x_103, x_103, x_103, x_103);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-multiple-integers/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-increment-multiple-integers/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..2c946fe
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-multiple-integers/0-opt.spvasm.expected.msl
@@ -0,0 +1,105 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[5];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int b = 0;
+  int c = 0;
+  bool x_76 = false;
+  bool x_83 = false;
+  bool x_77_phi = false;
+  bool x_84_phi = false;
+  int const x_31 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  a = x_31;
+  int const x_33 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  b = x_33;
+  c = 1;
+  while (true) {
+    int const x_38 = b;
+    int const x_40 = x_6.x_GLF_uniform_int_values.arr[4].el;
+    int const x_42 = a;
+    if (((x_38 < x_40) && (x_42 < 10))) {
+    } else {
+      break;
+    }
+    int const x_46 = c;
+    if ((x_46 > 5)) {
+      break;
+    }
+    int const x_50 = a;
+    a = (x_50 + 1);
+    int const x_52 = c;
+    c = (x_52 + 1);
+    int const x_54 = b;
+    b = (x_54 + 1);
+  }
+  while (true) {
+    int const x_60 = a;
+    int const x_62 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    if ((x_60 < x_62)) {
+    } else {
+      break;
+    }
+    {
+      int const x_65 = a;
+      a = (x_65 + 1);
+    }
+  }
+  int const x_67 = a;
+  int const x_69 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  bool const x_70 = (x_67 == x_69);
+  x_77_phi = x_70;
+  if (x_70) {
+    int const x_73 = b;
+    int const x_75 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    x_76 = (x_73 == x_75);
+    x_77_phi = x_76;
+  }
+  bool const x_77 = x_77_phi;
+  x_84_phi = x_77;
+  if (x_77) {
+    int const x_80 = c;
+    int const x_82 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    x_83 = (x_80 == x_82);
+    x_84_phi = x_83;
+  }
+  bool const x_84 = x_84_phi;
+  if (x_84) {
+    int const x_89 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_92 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_95 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_98 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    *(tint_symbol_4) = float4(float(x_89), float(x_92), float(x_95), float(x_98));
+  } else {
+    int const x_102 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    float const x_103 = float(x_102);
+    *(tint_symbol_4) = float4(x_103, x_103, x_103, x_103);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-multiple-integers/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-increment-multiple-integers/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..94f92e8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-multiple-integers/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,225 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 135
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %x_76 "x_76"
+               OpName %x_83 "x_83"
+               OpName %x_77_phi "x_77_phi"
+               OpName %x_84_phi "x_84_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_5 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_int_uint_5 = OpTypeArray %int %uint_5
+       %buf0 = OpTypeStruct %_arr_int_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %27 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+      %int_1 = OpConstant %int 1
+      %int_4 = OpConstant %int 4
+     %int_10 = OpConstant %int 10
+      %int_5 = OpConstant %int 5
+      %int_3 = OpConstant %int 3
+   %main_out = OpTypeStruct %v4float
+        %123 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+          %b = OpVariable %_ptr_Function_int Function %21
+          %c = OpVariable %_ptr_Function_int Function %21
+       %x_76 = OpVariable %_ptr_Function_bool Function %27
+       %x_83 = OpVariable %_ptr_Function_bool Function %27
+   %x_77_phi = OpVariable %_ptr_Function_bool Function %27
+   %x_84_phi = OpVariable %_ptr_Function_bool Function %27
+         %34 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %35 = OpLoad %int %34
+               OpStore %a %35
+         %37 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %38 = OpLoad %int %37
+               OpStore %b %38
+               OpStore %c %int_1
+               OpBranch %40
+         %40 = OpLabel
+               OpLoopMerge %41 %42 None
+               OpBranch %43
+         %43 = OpLabel
+         %44 = OpLoad %int %b
+         %46 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+         %47 = OpLoad %int %46
+         %48 = OpLoad %int %a
+         %49 = OpSLessThan %bool %44 %47
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %50
+         %51 = OpLabel
+         %53 = OpSLessThan %bool %48 %int_10
+               OpBranch %50
+         %50 = OpLabel
+         %54 = OpPhi %bool %49 %43 %53 %51
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %57
+         %56 = OpLabel
+               OpBranch %55
+         %57 = OpLabel
+               OpBranch %41
+         %55 = OpLabel
+         %58 = OpLoad %int %c
+         %60 = OpSGreaterThan %bool %58 %int_5
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %61
+         %62 = OpLabel
+               OpBranch %41
+         %61 = OpLabel
+         %63 = OpLoad %int %a
+         %64 = OpIAdd %int %63 %int_1
+               OpStore %a %64
+         %65 = OpLoad %int %c
+         %66 = OpIAdd %int %65 %int_1
+               OpStore %c %66
+         %67 = OpLoad %int %b
+         %68 = OpIAdd %int %67 %int_1
+               OpStore %b %68
+               OpBranch %42
+         %42 = OpLabel
+               OpBranch %40
+         %41 = OpLabel
+               OpBranch %69
+         %69 = OpLabel
+               OpLoopMerge %70 %71 None
+               OpBranch %72
+         %72 = OpLabel
+         %73 = OpLoad %int %a
+         %74 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %75 = OpLoad %int %74
+         %76 = OpSLessThan %bool %73 %75
+               OpSelectionMerge %77 None
+               OpBranchConditional %76 %78 %79
+         %78 = OpLabel
+               OpBranch %77
+         %79 = OpLabel
+               OpBranch %70
+         %77 = OpLabel
+               OpBranch %71
+         %71 = OpLabel
+         %80 = OpLoad %int %a
+         %81 = OpIAdd %int %80 %int_1
+               OpStore %a %81
+               OpBranch %69
+         %70 = OpLabel
+         %82 = OpLoad %int %a
+         %83 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %84 = OpLoad %int %83
+         %85 = OpIEqual %bool %82 %84
+               OpStore %x_77_phi %85
+               OpSelectionMerge %86 None
+               OpBranchConditional %85 %87 %86
+         %87 = OpLabel
+         %88 = OpLoad %int %b
+         %90 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %91 = OpLoad %int %90
+         %92 = OpIEqual %bool %88 %91
+               OpStore %x_76 %92
+         %93 = OpLoad %bool %x_76
+               OpStore %x_77_phi %93
+               OpBranch %86
+         %86 = OpLabel
+         %94 = OpLoad %bool %x_77_phi
+               OpStore %x_84_phi %94
+               OpSelectionMerge %95 None
+               OpBranchConditional %94 %96 %95
+         %96 = OpLabel
+         %97 = OpLoad %int %c
+         %98 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %99 = OpLoad %int %98
+        %100 = OpIEqual %bool %97 %99
+               OpStore %x_83 %100
+        %101 = OpLoad %bool %x_83
+               OpStore %x_84_phi %101
+               OpBranch %95
+         %95 = OpLabel
+        %102 = OpLoad %bool %x_84_phi
+               OpSelectionMerge %103 None
+               OpBranchConditional %102 %104 %105
+        %104 = OpLabel
+        %106 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %107 = OpLoad %int %106
+        %108 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %109 = OpLoad %int %108
+        %110 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %111 = OpLoad %int %110
+        %112 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %113 = OpLoad %int %112
+        %114 = OpConvertSToF %float %107
+        %115 = OpConvertSToF %float %109
+        %116 = OpConvertSToF %float %111
+        %117 = OpConvertSToF %float %113
+        %118 = OpCompositeConstruct %v4float %114 %115 %116 %117
+               OpStore %x_GLF_color %118
+               OpBranch %103
+        %105 = OpLabel
+        %119 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %120 = OpLoad %int %119
+        %121 = OpConvertSToF %float %120
+        %122 = OpCompositeConstruct %v4float %121 %121 %121 %121
+               OpStore %x_GLF_color %122
+               OpBranch %103
+        %103 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %123
+%tint_symbol = OpFunctionParameter %main_out
+        %127 = OpLabel
+        %128 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %128
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %130 = OpLabel
+        %131 = OpFunctionCall %void %main_1
+        %133 = OpLoad %v4float %x_GLF_color
+        %134 = OpCompositeConstruct %main_out %133
+        %132 = OpFunctionCall %void %tint_symbol_2 %134
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-multiple-integers/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-multiple-integers/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..5a769f4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-multiple-integers/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,99 @@
+type Arr = [[stride(16)]] array<i32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var b : i32;
+  var c : i32;
+  var x_76 : bool;
+  var x_83 : bool;
+  var x_77_phi : bool;
+  var x_84_phi : bool;
+  let x_31 : i32 = x_6.x_GLF_uniform_int_values[0];
+  a = x_31;
+  let x_33 : i32 = x_6.x_GLF_uniform_int_values[2];
+  b = x_33;
+  c = 1;
+  loop {
+    let x_38 : i32 = b;
+    let x_40 : i32 = x_6.x_GLF_uniform_int_values[4];
+    let x_42 : i32 = a;
+    if (((x_38 < x_40) && (x_42 < 10))) {
+    } else {
+      break;
+    }
+    let x_46 : i32 = c;
+    if ((x_46 > 5)) {
+      break;
+    }
+    let x_50 : i32 = a;
+    a = (x_50 + 1);
+    let x_52 : i32 = c;
+    c = (x_52 + 1);
+    let x_54 : i32 = b;
+    b = (x_54 + 1);
+  }
+  loop {
+    let x_60 : i32 = a;
+    let x_62 : i32 = x_6.x_GLF_uniform_int_values[1];
+    if ((x_60 < x_62)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_65 : i32 = a;
+      a = (x_65 + 1);
+    }
+  }
+  let x_67 : i32 = a;
+  let x_69 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_70 : bool = (x_67 == x_69);
+  x_77_phi = x_70;
+  if (x_70) {
+    let x_73 : i32 = b;
+    let x_75 : i32 = x_6.x_GLF_uniform_int_values[3];
+    x_76 = (x_73 == x_75);
+    x_77_phi = x_76;
+  }
+  let x_77 : bool = x_77_phi;
+  x_84_phi = x_77;
+  if (x_77) {
+    let x_80 : i32 = c;
+    let x_82 : i32 = x_6.x_GLF_uniform_int_values[3];
+    x_83 = (x_80 == x_82);
+    x_84_phi = x_83;
+  }
+  let x_84 : bool = x_84_phi;
+  if (x_84) {
+    let x_89 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_92 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_95 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_98 : i32 = x_6.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_89), f32(x_92), f32(x_95), f32(x_98));
+  } else {
+    let x_102 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_103 : f32 = f32(x_102);
+    x_GLF_color = vec4<f32>(x_103, x_103, x_103, x_103);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-multiple-integers/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-multiple-integers/0-opt.wgsl
new file mode 100644
index 0000000..5a769f4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-multiple-integers/0-opt.wgsl
@@ -0,0 +1,99 @@
+type Arr = [[stride(16)]] array<i32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var b : i32;
+  var c : i32;
+  var x_76 : bool;
+  var x_83 : bool;
+  var x_77_phi : bool;
+  var x_84_phi : bool;
+  let x_31 : i32 = x_6.x_GLF_uniform_int_values[0];
+  a = x_31;
+  let x_33 : i32 = x_6.x_GLF_uniform_int_values[2];
+  b = x_33;
+  c = 1;
+  loop {
+    let x_38 : i32 = b;
+    let x_40 : i32 = x_6.x_GLF_uniform_int_values[4];
+    let x_42 : i32 = a;
+    if (((x_38 < x_40) && (x_42 < 10))) {
+    } else {
+      break;
+    }
+    let x_46 : i32 = c;
+    if ((x_46 > 5)) {
+      break;
+    }
+    let x_50 : i32 = a;
+    a = (x_50 + 1);
+    let x_52 : i32 = c;
+    c = (x_52 + 1);
+    let x_54 : i32 = b;
+    b = (x_54 + 1);
+  }
+  loop {
+    let x_60 : i32 = a;
+    let x_62 : i32 = x_6.x_GLF_uniform_int_values[1];
+    if ((x_60 < x_62)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_65 : i32 = a;
+      a = (x_65 + 1);
+    }
+  }
+  let x_67 : i32 = a;
+  let x_69 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_70 : bool = (x_67 == x_69);
+  x_77_phi = x_70;
+  if (x_70) {
+    let x_73 : i32 = b;
+    let x_75 : i32 = x_6.x_GLF_uniform_int_values[3];
+    x_76 = (x_73 == x_75);
+    x_77_phi = x_76;
+  }
+  let x_77 : bool = x_77_phi;
+  x_84_phi = x_77;
+  if (x_77) {
+    let x_80 : i32 = c;
+    let x_82 : i32 = x_6.x_GLF_uniform_int_values[3];
+    x_83 = (x_80 == x_82);
+    x_84_phi = x_83;
+  }
+  let x_84 : bool = x_84_phi;
+  if (x_84) {
+    let x_89 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_92 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_95 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_98 : i32 = x_6.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_89), f32(x_92), f32(x_95), f32(x_98));
+  } else {
+    let x_102 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_103 : f32 = f32(x_102);
+    x_GLF_color = vec4<f32>(x_103, x_103, x_103, x_103);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-multiple-integers/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-multiple-integers/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..1693e5c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-multiple-integers/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,96 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[5];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  int b = 0;
+  int c = 0;
+  bool x_76 = false;
+  bool x_83 = false;
+  bool x_77_phi = false;
+  bool x_84_phi = false;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_31 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  a = x_31;
+  const int x_33 = asint(x_6[2].x);
+  b = x_33;
+  c = 1;
+  while (true) {
+    const int x_38 = b;
+    const int x_40 = asint(x_6[4].x);
+    bool tint_tmp = (x_38 < x_40);
+    if (tint_tmp) {
+      tint_tmp = (a < 10);
+    }
+    if ((tint_tmp)) {
+    } else {
+      break;
+    }
+    if ((c > 5)) {
+      break;
+    }
+    a = (a + 1);
+    c = (c + 1);
+    b = (b + 1);
+  }
+  while (true) {
+    const int x_60 = a;
+    const int x_62 = asint(x_6[1].x);
+    if ((x_60 < x_62)) {
+    } else {
+      break;
+    }
+    {
+      a = (a + 1);
+    }
+  }
+  const int x_67 = a;
+  const int x_69 = asint(x_6[1].x);
+  const bool x_70 = (x_67 == x_69);
+  x_77_phi = x_70;
+  if (x_70) {
+    const int x_73 = b;
+    const int x_75 = asint(x_6[3].x);
+    x_76 = (x_73 == x_75);
+    x_77_phi = x_76;
+  }
+  const bool x_77 = x_77_phi;
+  x_84_phi = x_77;
+  if (x_77) {
+    const int x_80 = c;
+    const int x_82 = asint(x_6[3].x);
+    x_83 = (x_80 == x_82);
+    x_84_phi = x_83;
+  }
+  if (x_84_phi) {
+    const int x_89 = asint(x_6[2].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_92 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_95 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_98 = asint(x_6[2].x);
+    x_GLF_color = float4(float(x_89), float(x_92), float(x_95), float(x_98));
+  } else {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_102 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const float x_103 = float(x_102);
+    x_GLF_color = float4(x_103, x_103, x_103, x_103);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-multiple-integers/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-increment-multiple-integers/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..2c946fe
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-multiple-integers/0-opt.wgsl.expected.msl
@@ -0,0 +1,105 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[5];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int b = 0;
+  int c = 0;
+  bool x_76 = false;
+  bool x_83 = false;
+  bool x_77_phi = false;
+  bool x_84_phi = false;
+  int const x_31 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  a = x_31;
+  int const x_33 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  b = x_33;
+  c = 1;
+  while (true) {
+    int const x_38 = b;
+    int const x_40 = x_6.x_GLF_uniform_int_values.arr[4].el;
+    int const x_42 = a;
+    if (((x_38 < x_40) && (x_42 < 10))) {
+    } else {
+      break;
+    }
+    int const x_46 = c;
+    if ((x_46 > 5)) {
+      break;
+    }
+    int const x_50 = a;
+    a = (x_50 + 1);
+    int const x_52 = c;
+    c = (x_52 + 1);
+    int const x_54 = b;
+    b = (x_54 + 1);
+  }
+  while (true) {
+    int const x_60 = a;
+    int const x_62 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    if ((x_60 < x_62)) {
+    } else {
+      break;
+    }
+    {
+      int const x_65 = a;
+      a = (x_65 + 1);
+    }
+  }
+  int const x_67 = a;
+  int const x_69 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  bool const x_70 = (x_67 == x_69);
+  x_77_phi = x_70;
+  if (x_70) {
+    int const x_73 = b;
+    int const x_75 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    x_76 = (x_73 == x_75);
+    x_77_phi = x_76;
+  }
+  bool const x_77 = x_77_phi;
+  x_84_phi = x_77;
+  if (x_77) {
+    int const x_80 = c;
+    int const x_82 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    x_83 = (x_80 == x_82);
+    x_84_phi = x_83;
+  }
+  bool const x_84 = x_84_phi;
+  if (x_84) {
+    int const x_89 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_92 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_95 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_98 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    *(tint_symbol_4) = float4(float(x_89), float(x_92), float(x_95), float(x_98));
+  } else {
+    int const x_102 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    float const x_103 = float(x_102);
+    *(tint_symbol_4) = float4(x_103, x_103, x_103, x_103);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-multiple-integers/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-increment-multiple-integers/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..94f92e8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-multiple-integers/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,225 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 135
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %x_76 "x_76"
+               OpName %x_83 "x_83"
+               OpName %x_77_phi "x_77_phi"
+               OpName %x_84_phi "x_84_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_5 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_int_uint_5 = OpTypeArray %int %uint_5
+       %buf0 = OpTypeStruct %_arr_int_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %27 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+      %int_1 = OpConstant %int 1
+      %int_4 = OpConstant %int 4
+     %int_10 = OpConstant %int 10
+      %int_5 = OpConstant %int 5
+      %int_3 = OpConstant %int 3
+   %main_out = OpTypeStruct %v4float
+        %123 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+          %b = OpVariable %_ptr_Function_int Function %21
+          %c = OpVariable %_ptr_Function_int Function %21
+       %x_76 = OpVariable %_ptr_Function_bool Function %27
+       %x_83 = OpVariable %_ptr_Function_bool Function %27
+   %x_77_phi = OpVariable %_ptr_Function_bool Function %27
+   %x_84_phi = OpVariable %_ptr_Function_bool Function %27
+         %34 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %35 = OpLoad %int %34
+               OpStore %a %35
+         %37 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %38 = OpLoad %int %37
+               OpStore %b %38
+               OpStore %c %int_1
+               OpBranch %40
+         %40 = OpLabel
+               OpLoopMerge %41 %42 None
+               OpBranch %43
+         %43 = OpLabel
+         %44 = OpLoad %int %b
+         %46 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+         %47 = OpLoad %int %46
+         %48 = OpLoad %int %a
+         %49 = OpSLessThan %bool %44 %47
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %50
+         %51 = OpLabel
+         %53 = OpSLessThan %bool %48 %int_10
+               OpBranch %50
+         %50 = OpLabel
+         %54 = OpPhi %bool %49 %43 %53 %51
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %57
+         %56 = OpLabel
+               OpBranch %55
+         %57 = OpLabel
+               OpBranch %41
+         %55 = OpLabel
+         %58 = OpLoad %int %c
+         %60 = OpSGreaterThan %bool %58 %int_5
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %61
+         %62 = OpLabel
+               OpBranch %41
+         %61 = OpLabel
+         %63 = OpLoad %int %a
+         %64 = OpIAdd %int %63 %int_1
+               OpStore %a %64
+         %65 = OpLoad %int %c
+         %66 = OpIAdd %int %65 %int_1
+               OpStore %c %66
+         %67 = OpLoad %int %b
+         %68 = OpIAdd %int %67 %int_1
+               OpStore %b %68
+               OpBranch %42
+         %42 = OpLabel
+               OpBranch %40
+         %41 = OpLabel
+               OpBranch %69
+         %69 = OpLabel
+               OpLoopMerge %70 %71 None
+               OpBranch %72
+         %72 = OpLabel
+         %73 = OpLoad %int %a
+         %74 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %75 = OpLoad %int %74
+         %76 = OpSLessThan %bool %73 %75
+               OpSelectionMerge %77 None
+               OpBranchConditional %76 %78 %79
+         %78 = OpLabel
+               OpBranch %77
+         %79 = OpLabel
+               OpBranch %70
+         %77 = OpLabel
+               OpBranch %71
+         %71 = OpLabel
+         %80 = OpLoad %int %a
+         %81 = OpIAdd %int %80 %int_1
+               OpStore %a %81
+               OpBranch %69
+         %70 = OpLabel
+         %82 = OpLoad %int %a
+         %83 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %84 = OpLoad %int %83
+         %85 = OpIEqual %bool %82 %84
+               OpStore %x_77_phi %85
+               OpSelectionMerge %86 None
+               OpBranchConditional %85 %87 %86
+         %87 = OpLabel
+         %88 = OpLoad %int %b
+         %90 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %91 = OpLoad %int %90
+         %92 = OpIEqual %bool %88 %91
+               OpStore %x_76 %92
+         %93 = OpLoad %bool %x_76
+               OpStore %x_77_phi %93
+               OpBranch %86
+         %86 = OpLabel
+         %94 = OpLoad %bool %x_77_phi
+               OpStore %x_84_phi %94
+               OpSelectionMerge %95 None
+               OpBranchConditional %94 %96 %95
+         %96 = OpLabel
+         %97 = OpLoad %int %c
+         %98 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %99 = OpLoad %int %98
+        %100 = OpIEqual %bool %97 %99
+               OpStore %x_83 %100
+        %101 = OpLoad %bool %x_83
+               OpStore %x_84_phi %101
+               OpBranch %95
+         %95 = OpLabel
+        %102 = OpLoad %bool %x_84_phi
+               OpSelectionMerge %103 None
+               OpBranchConditional %102 %104 %105
+        %104 = OpLabel
+        %106 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %107 = OpLoad %int %106
+        %108 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %109 = OpLoad %int %108
+        %110 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %111 = OpLoad %int %110
+        %112 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %113 = OpLoad %int %112
+        %114 = OpConvertSToF %float %107
+        %115 = OpConvertSToF %float %109
+        %116 = OpConvertSToF %float %111
+        %117 = OpConvertSToF %float %113
+        %118 = OpCompositeConstruct %v4float %114 %115 %116 %117
+               OpStore %x_GLF_color %118
+               OpBranch %103
+        %105 = OpLabel
+        %119 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %120 = OpLoad %int %119
+        %121 = OpConvertSToF %float %120
+        %122 = OpCompositeConstruct %v4float %121 %121 %121 %121
+               OpStore %x_GLF_color %122
+               OpBranch %103
+        %103 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %123
+%tint_symbol = OpFunctionParameter %main_out
+        %127 = OpLabel
+        %128 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %128
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %130 = OpLabel
+        %131 = OpFunctionCall %void %main_1
+        %133 = OpLoad %v4float %x_GLF_color
+        %134 = OpCompositeConstruct %main_out %133
+        %132 = OpFunctionCall %void %tint_symbol_2 %134
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-multiple-integers/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-multiple-integers/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..5a769f4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-multiple-integers/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,99 @@
+type Arr = [[stride(16)]] array<i32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var b : i32;
+  var c : i32;
+  var x_76 : bool;
+  var x_83 : bool;
+  var x_77_phi : bool;
+  var x_84_phi : bool;
+  let x_31 : i32 = x_6.x_GLF_uniform_int_values[0];
+  a = x_31;
+  let x_33 : i32 = x_6.x_GLF_uniform_int_values[2];
+  b = x_33;
+  c = 1;
+  loop {
+    let x_38 : i32 = b;
+    let x_40 : i32 = x_6.x_GLF_uniform_int_values[4];
+    let x_42 : i32 = a;
+    if (((x_38 < x_40) && (x_42 < 10))) {
+    } else {
+      break;
+    }
+    let x_46 : i32 = c;
+    if ((x_46 > 5)) {
+      break;
+    }
+    let x_50 : i32 = a;
+    a = (x_50 + 1);
+    let x_52 : i32 = c;
+    c = (x_52 + 1);
+    let x_54 : i32 = b;
+    b = (x_54 + 1);
+  }
+  loop {
+    let x_60 : i32 = a;
+    let x_62 : i32 = x_6.x_GLF_uniform_int_values[1];
+    if ((x_60 < x_62)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_65 : i32 = a;
+      a = (x_65 + 1);
+    }
+  }
+  let x_67 : i32 = a;
+  let x_69 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_70 : bool = (x_67 == x_69);
+  x_77_phi = x_70;
+  if (x_70) {
+    let x_73 : i32 = b;
+    let x_75 : i32 = x_6.x_GLF_uniform_int_values[3];
+    x_76 = (x_73 == x_75);
+    x_77_phi = x_76;
+  }
+  let x_77 : bool = x_77_phi;
+  x_84_phi = x_77;
+  if (x_77) {
+    let x_80 : i32 = c;
+    let x_82 : i32 = x_6.x_GLF_uniform_int_values[3];
+    x_83 = (x_80 == x_82);
+    x_84_phi = x_83;
+  }
+  let x_84 : bool = x_84_phi;
+  if (x_84) {
+    let x_89 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_92 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_95 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_98 : i32 = x_6.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_89), f32(x_92), f32(x_95), f32(x_98));
+  } else {
+    let x_102 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_103 : f32 = f32(x_102);
+    x_GLF_color = vec4<f32>(x_103, x_103, x_103, x_103);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.spvasm
new file mode 100644
index 0000000..a5e67ea
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.spvasm
@@ -0,0 +1,145 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %m "m"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %a "a"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpName %arr "arr"
+               OpName %v "v"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+%mat3v3float = OpTypeMatrix %v3float 3
+%_ptr_Function_mat3v3float = OpTypePointer Function %mat3v3float
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+%_ptr_Function_int = OpTypePointer Function %int
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_float = OpTypePointer Function %float
+%_arr_v3float_uint_2 = OpTypeArray %v3float %uint_2
+%_ptr_Function__arr_v3float_uint_2 = OpTypePointer Function %_arr_v3float_uint_2
+      %int_1 = OpConstant %int 1
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+     %v3bool = OpTypeVector %bool 3
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+      %int_3 = OpConstant %int 3
+       %main = OpFunction %void None %15
+         %43 = OpLabel
+          %m = OpVariable %_ptr_Function_mat3v3float Function
+          %a = OpVariable %_ptr_Function_int Function
+        %arr = OpVariable %_ptr_Function__arr_v3float_uint_2 Function
+          %v = OpVariable %_ptr_Function_v3float Function
+         %44 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %45 = OpLoad %int %44
+         %46 = OpConvertSToF %float %45
+         %47 = OpCompositeConstruct %v3float %46 %float_0 %float_0
+         %48 = OpCompositeConstruct %v3float %float_0 %46 %float_0
+         %49 = OpCompositeConstruct %v3float %float_0 %float_0 %46
+         %50 = OpCompositeConstruct %mat3v3float %47 %48 %49
+               OpStore %m %50
+         %51 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %52 = OpLoad %int %51
+               OpStore %a %52
+         %53 = OpLoad %int %a
+         %54 = OpLoad %int %a
+         %55 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %56 = OpLoad %float %55
+         %57 = OpAccessChain %_ptr_Function_float %m %53 %54
+               OpStore %57 %56
+         %58 = OpAccessChain %_ptr_Function_v3float %m %int_1
+         %59 = OpLoad %v3float %58
+         %60 = OpAccessChain %_ptr_Function_v3float %m %int_1
+         %61 = OpLoad %v3float %60
+         %62 = OpCompositeConstruct %_arr_v3float_uint_2 %59 %61
+               OpStore %arr %62
+         %63 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_1
+         %64 = OpLoad %float %63
+         %65 = OpCompositeConstruct %v3float %64 %64 %64
+               OpStore %v %65
+         %66 = OpLoad %int %a
+         %67 = OpAccessChain %_ptr_Function_v3float %arr %66
+         %68 = OpLoad %v3float %67
+         %69 = OpLoad %v3float %v
+         %70 = OpFAdd %v3float %69 %68
+               OpStore %v %70
+         %71 = OpLoad %v3float %v
+         %72 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %73 = OpLoad %int %72
+         %74 = OpConvertSToF %float %73
+         %75 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %76 = OpLoad %int %75
+         %77 = OpConvertSToF %float %76
+         %78 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %79 = OpLoad %int %78
+         %80 = OpConvertSToF %float %79
+         %81 = OpCompositeConstruct %v3float %74 %77 %80
+         %82 = OpFOrdEqual %v3bool %71 %81
+         %83 = OpAll %bool %82
+               OpSelectionMerge %84 None
+               OpBranchConditional %83 %85 %86
+         %85 = OpLabel
+         %87 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %88 = OpLoad %int %87
+         %89 = OpConvertSToF %float %88
+         %90 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %91 = OpLoad %int %90
+         %92 = OpConvertSToF %float %91
+         %93 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %94 = OpLoad %int %93
+         %95 = OpConvertSToF %float %94
+         %96 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %97 = OpLoad %int %96
+         %98 = OpConvertSToF %float %97
+         %99 = OpCompositeConstruct %v4float %89 %92 %95 %98
+               OpStore %_GLF_color %99
+               OpBranch %84
+         %86 = OpLabel
+        %100 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+        %101 = OpLoad %int %100
+        %102 = OpConvertSToF %float %101
+        %103 = OpCompositeConstruct %v4float %102 %102 %102 %102
+               OpStore %_GLF_color %103
+               OpBranch %84
+         %84 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..1bc001a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,70 @@
+void set_float3(inout float3 vec, int idx, float val) {
+  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
+}
+
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[4];
+};
+cbuffer cbuffer_x_9 : register(b1, space0) {
+  uint4 x_9[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float3x3 m = float3x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  int a = 0;
+  float3 arr[2] = (float3[2])0;
+  float3 v = float3(0.0f, 0.0f, 0.0f);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_45 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const float x_46 = float(x_45);
+  m = float3x3(float3(x_46, 0.0f, 0.0f), float3(0.0f, x_46, 0.0f), float3(0.0f, 0.0f, x_46));
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_52 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  a = x_52;
+  const int x_53 = a;
+  const int x_54 = a;
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const float x_56 = asfloat(x_9[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  set_float3(m[x_53], x_54, x_56);
+  const float3 x_59 = m[1];
+  const float3 x_61 = m[1];
+  const float3 tint_symbol_4[2] = {x_59, x_61};
+  arr = tint_symbol_4;
+  const float x_64 = asfloat(x_9[1].x);
+  v = float3(x_64, x_64, x_64);
+  const float3 x_68 = arr[a];
+  v = (v + x_68);
+  const float3 x_71 = v;
+  const int x_73 = asint(x_6[1].x);
+  const int x_76 = asint(x_6[2].x);
+  const int x_79 = asint(x_6[1].x);
+  if (all((x_71 == float3(float(x_73), float(x_76), float(x_79))))) {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_88 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const int x_91 = asint(x_6[3].x);
+    const int x_94 = asint(x_6[3].x);
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_97 = asint(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    x_GLF_color = float4(float(x_88), float(x_91), float(x_94), float(x_97));
+  } else {
+    const int x_101 = asint(x_6[3].x);
+    const float x_102 = float(x_101);
+    x_GLF_color = float4(x_102, x_102, x_102, x_102);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..384a32d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.spvasm.expected.msl
@@ -0,0 +1,83 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct tint_array_wrapper_2 {
+  float3 arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_9, thread float4* const tint_symbol_5) {
+  float3x3 m = float3x3(0.0f);
+  int a = 0;
+  tint_array_wrapper_2 arr = {};
+  float3 v = 0.0f;
+  int const x_45 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  float const x_46 = float(x_45);
+  m = float3x3(float3(x_46, 0.0f, 0.0f), float3(0.0f, x_46, 0.0f), float3(0.0f, 0.0f, x_46));
+  int const x_52 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  a = x_52;
+  int const x_53 = a;
+  int const x_54 = a;
+  float const x_56 = x_9.x_GLF_uniform_float_values.arr[0].el;
+  m[x_53][x_54] = x_56;
+  float3 const x_59 = m[1];
+  float3 const x_61 = m[1];
+  tint_array_wrapper_2 const tint_symbol_3 = {.arr={x_59, x_61}};
+  arr = tint_symbol_3;
+  float const x_64 = x_9.x_GLF_uniform_float_values.arr[1].el;
+  v = float3(x_64, x_64, x_64);
+  int const x_66 = a;
+  float3 const x_68 = arr.arr[x_66];
+  float3 const x_69 = v;
+  v = (x_69 + x_68);
+  float3 const x_71 = v;
+  int const x_73 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_76 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_79 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  if (all((x_71 == float3(float(x_73), float(x_76), float(x_79))))) {
+    int const x_88 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_91 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    int const x_94 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    int const x_97 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_5) = float4(float(x_88), float(x_91), float(x_94), float(x_97));
+  } else {
+    int const x_101 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    float const x_102 = float(x_101);
+    *(tint_symbol_5) = float4(x_102, x_102, x_102, x_102);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_9 [[buffer(1)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..dcf9f7f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,182 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 122
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %m "m"
+               OpName %a "a"
+               OpName %arr "arr"
+               OpName %v "v"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_v3float_uint_2 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_9 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+    %v3float = OpTypeVector %float 3
+%mat3v3float = OpTypeMatrix %v3float 3
+%_ptr_Function_mat3v3float = OpTypePointer Function %mat3v3float
+         %28 = OpConstantNull %mat3v3float
+%_ptr_Function_int = OpTypePointer Function %int
+         %31 = OpConstantNull %int
+%_arr_v3float_uint_2 = OpTypeArray %v3float %uint_2
+%_ptr_Function__arr_v3float_uint_2 = OpTypePointer Function %_arr_v3float_uint_2
+         %35 = OpConstantNull %_arr_v3float_uint_2
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %38 = OpConstantNull %v3float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+    %float_0 = OpConstant %float 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+     %v3bool = OpTypeVector %bool 3
+      %int_3 = OpConstant %int 3
+   %main_out = OpTypeStruct %v4float
+        %110 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+          %m = OpVariable %_ptr_Function_mat3v3float Function %28
+          %a = OpVariable %_ptr_Function_int Function %31
+        %arr = OpVariable %_ptr_Function__arr_v3float_uint_2 Function %35
+          %v = OpVariable %_ptr_Function_v3float Function %38
+         %42 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %43 = OpLoad %int %42
+         %44 = OpConvertSToF %float %43
+         %46 = OpCompositeConstruct %v3float %44 %float_0 %float_0
+         %47 = OpCompositeConstruct %v3float %float_0 %44 %float_0
+         %48 = OpCompositeConstruct %v3float %float_0 %float_0 %44
+         %49 = OpCompositeConstruct %mat3v3float %46 %47 %48
+               OpStore %m %49
+         %50 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %51 = OpLoad %int %50
+               OpStore %a %51
+         %52 = OpLoad %int %a
+         %53 = OpLoad %int %a
+         %55 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_0
+         %56 = OpLoad %float %55
+         %58 = OpAccessChain %_ptr_Function_float %m %52 %53
+               OpStore %58 %56
+         %60 = OpAccessChain %_ptr_Function_v3float %m %int_1
+         %61 = OpLoad %v3float %60
+         %62 = OpAccessChain %_ptr_Function_v3float %m %int_1
+         %63 = OpLoad %v3float %62
+         %64 = OpCompositeConstruct %_arr_v3float_uint_2 %61 %63
+               OpStore %arr %64
+         %65 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_1
+         %66 = OpLoad %float %65
+         %67 = OpCompositeConstruct %v3float %66 %66 %66
+               OpStore %v %67
+         %68 = OpLoad %int %a
+         %69 = OpAccessChain %_ptr_Function_v3float %arr %68
+         %70 = OpLoad %v3float %69
+         %71 = OpLoad %v3float %v
+         %72 = OpFAdd %v3float %71 %70
+               OpStore %v %72
+         %73 = OpLoad %v3float %v
+         %74 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %75 = OpLoad %int %74
+         %77 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %78 = OpLoad %int %77
+         %79 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %80 = OpLoad %int %79
+         %83 = OpConvertSToF %float %75
+         %84 = OpConvertSToF %float %78
+         %85 = OpConvertSToF %float %80
+         %86 = OpCompositeConstruct %v3float %83 %84 %85
+         %87 = OpFOrdEqual %v3bool %73 %86
+         %81 = OpAll %bool %87
+               OpSelectionMerge %89 None
+               OpBranchConditional %81 %90 %91
+         %90 = OpLabel
+         %92 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %93 = OpLoad %int %92
+         %95 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %96 = OpLoad %int %95
+         %97 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %98 = OpLoad %int %97
+         %99 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %100 = OpLoad %int %99
+        %101 = OpConvertSToF %float %93
+        %102 = OpConvertSToF %float %96
+        %103 = OpConvertSToF %float %98
+        %104 = OpConvertSToF %float %100
+        %105 = OpCompositeConstruct %v4float %101 %102 %103 %104
+               OpStore %x_GLF_color %105
+               OpBranch %89
+         %91 = OpLabel
+        %106 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+        %107 = OpLoad %int %106
+        %108 = OpConvertSToF %float %107
+        %109 = OpCompositeConstruct %v4float %108 %108 %108 %108
+               OpStore %x_GLF_color %109
+               OpBranch %89
+         %89 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %110
+%tint_symbol = OpFunctionParameter %main_out
+        %114 = OpLabel
+        %115 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %115
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %117 = OpLabel
+        %118 = OpFunctionCall %void %main_1
+        %120 = OpLoad %v4float %x_GLF_color
+        %121 = OpCompositeConstruct %main_out %120
+        %119 = OpFunctionCall %void %tint_symbol_2 %121
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..302eb53
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,71 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m : mat3x3<f32>;
+  var a : i32;
+  var arr : array<vec3<f32>, 2>;
+  var v : vec3<f32>;
+  let x_45 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_46 : f32 = f32(x_45);
+  m = mat3x3<f32>(vec3<f32>(x_46, 0.0, 0.0), vec3<f32>(0.0, x_46, 0.0), vec3<f32>(0.0, 0.0, x_46));
+  let x_52 : i32 = x_6.x_GLF_uniform_int_values[0];
+  a = x_52;
+  let x_53 : i32 = a;
+  let x_54 : i32 = a;
+  let x_56 : f32 = x_9.x_GLF_uniform_float_values[0];
+  m[x_53][x_54] = x_56;
+  let x_59 : vec3<f32> = m[1];
+  let x_61 : vec3<f32> = m[1];
+  arr = array<vec3<f32>, 2>(x_59, x_61);
+  let x_64 : f32 = x_9.x_GLF_uniform_float_values[1];
+  v = vec3<f32>(x_64, x_64, x_64);
+  let x_66 : i32 = a;
+  let x_68 : vec3<f32> = arr[x_66];
+  let x_69 : vec3<f32> = v;
+  v = (x_69 + x_68);
+  let x_71 : vec3<f32> = v;
+  let x_73 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_76 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_79 : i32 = x_6.x_GLF_uniform_int_values[1];
+  if (all((x_71 == vec3<f32>(f32(x_73), f32(x_76), f32(x_79))))) {
+    let x_88 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_91 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_94 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_97 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_88), f32(x_91), f32(x_94), f32(x_97));
+  } else {
+    let x_101 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_102 : f32 = f32(x_101);
+    x_GLF_color = vec4<f32>(x_102, x_102, x_102, x_102);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.wgsl
new file mode 100644
index 0000000..302eb53
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.wgsl
@@ -0,0 +1,71 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m : mat3x3<f32>;
+  var a : i32;
+  var arr : array<vec3<f32>, 2>;
+  var v : vec3<f32>;
+  let x_45 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_46 : f32 = f32(x_45);
+  m = mat3x3<f32>(vec3<f32>(x_46, 0.0, 0.0), vec3<f32>(0.0, x_46, 0.0), vec3<f32>(0.0, 0.0, x_46));
+  let x_52 : i32 = x_6.x_GLF_uniform_int_values[0];
+  a = x_52;
+  let x_53 : i32 = a;
+  let x_54 : i32 = a;
+  let x_56 : f32 = x_9.x_GLF_uniform_float_values[0];
+  m[x_53][x_54] = x_56;
+  let x_59 : vec3<f32> = m[1];
+  let x_61 : vec3<f32> = m[1];
+  arr = array<vec3<f32>, 2>(x_59, x_61);
+  let x_64 : f32 = x_9.x_GLF_uniform_float_values[1];
+  v = vec3<f32>(x_64, x_64, x_64);
+  let x_66 : i32 = a;
+  let x_68 : vec3<f32> = arr[x_66];
+  let x_69 : vec3<f32> = v;
+  v = (x_69 + x_68);
+  let x_71 : vec3<f32> = v;
+  let x_73 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_76 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_79 : i32 = x_6.x_GLF_uniform_int_values[1];
+  if (all((x_71 == vec3<f32>(f32(x_73), f32(x_76), f32(x_79))))) {
+    let x_88 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_91 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_94 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_97 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_88), f32(x_91), f32(x_94), f32(x_97));
+  } else {
+    let x_101 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_102 : f32 = f32(x_101);
+    x_GLF_color = vec4<f32>(x_102, x_102, x_102, x_102);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..1bc001a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,70 @@
+void set_float3(inout float3 vec, int idx, float val) {
+  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
+}
+
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[4];
+};
+cbuffer cbuffer_x_9 : register(b1, space0) {
+  uint4 x_9[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float3x3 m = float3x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  int a = 0;
+  float3 arr[2] = (float3[2])0;
+  float3 v = float3(0.0f, 0.0f, 0.0f);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_45 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const float x_46 = float(x_45);
+  m = float3x3(float3(x_46, 0.0f, 0.0f), float3(0.0f, x_46, 0.0f), float3(0.0f, 0.0f, x_46));
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_52 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  a = x_52;
+  const int x_53 = a;
+  const int x_54 = a;
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const float x_56 = asfloat(x_9[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  set_float3(m[x_53], x_54, x_56);
+  const float3 x_59 = m[1];
+  const float3 x_61 = m[1];
+  const float3 tint_symbol_4[2] = {x_59, x_61};
+  arr = tint_symbol_4;
+  const float x_64 = asfloat(x_9[1].x);
+  v = float3(x_64, x_64, x_64);
+  const float3 x_68 = arr[a];
+  v = (v + x_68);
+  const float3 x_71 = v;
+  const int x_73 = asint(x_6[1].x);
+  const int x_76 = asint(x_6[2].x);
+  const int x_79 = asint(x_6[1].x);
+  if (all((x_71 == float3(float(x_73), float(x_76), float(x_79))))) {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_88 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const int x_91 = asint(x_6[3].x);
+    const int x_94 = asint(x_6[3].x);
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_97 = asint(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    x_GLF_color = float4(float(x_88), float(x_91), float(x_94), float(x_97));
+  } else {
+    const int x_101 = asint(x_6[3].x);
+    const float x_102 = float(x_101);
+    x_GLF_color = float4(x_102, x_102, x_102, x_102);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..384a32d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.wgsl.expected.msl
@@ -0,0 +1,83 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct tint_array_wrapper_2 {
+  float3 arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_9, thread float4* const tint_symbol_5) {
+  float3x3 m = float3x3(0.0f);
+  int a = 0;
+  tint_array_wrapper_2 arr = {};
+  float3 v = 0.0f;
+  int const x_45 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  float const x_46 = float(x_45);
+  m = float3x3(float3(x_46, 0.0f, 0.0f), float3(0.0f, x_46, 0.0f), float3(0.0f, 0.0f, x_46));
+  int const x_52 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  a = x_52;
+  int const x_53 = a;
+  int const x_54 = a;
+  float const x_56 = x_9.x_GLF_uniform_float_values.arr[0].el;
+  m[x_53][x_54] = x_56;
+  float3 const x_59 = m[1];
+  float3 const x_61 = m[1];
+  tint_array_wrapper_2 const tint_symbol_3 = {.arr={x_59, x_61}};
+  arr = tint_symbol_3;
+  float const x_64 = x_9.x_GLF_uniform_float_values.arr[1].el;
+  v = float3(x_64, x_64, x_64);
+  int const x_66 = a;
+  float3 const x_68 = arr.arr[x_66];
+  float3 const x_69 = v;
+  v = (x_69 + x_68);
+  float3 const x_71 = v;
+  int const x_73 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_76 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_79 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  if (all((x_71 == float3(float(x_73), float(x_76), float(x_79))))) {
+    int const x_88 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_91 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    int const x_94 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    int const x_97 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_5) = float4(float(x_88), float(x_91), float(x_94), float(x_97));
+  } else {
+    int const x_101 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    float const x_102 = float(x_101);
+    *(tint_symbol_5) = float4(x_102, x_102, x_102, x_102);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_9 [[buffer(1)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..dcf9f7f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,182 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 122
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %m "m"
+               OpName %a "a"
+               OpName %arr "arr"
+               OpName %v "v"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_v3float_uint_2 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_9 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+    %v3float = OpTypeVector %float 3
+%mat3v3float = OpTypeMatrix %v3float 3
+%_ptr_Function_mat3v3float = OpTypePointer Function %mat3v3float
+         %28 = OpConstantNull %mat3v3float
+%_ptr_Function_int = OpTypePointer Function %int
+         %31 = OpConstantNull %int
+%_arr_v3float_uint_2 = OpTypeArray %v3float %uint_2
+%_ptr_Function__arr_v3float_uint_2 = OpTypePointer Function %_arr_v3float_uint_2
+         %35 = OpConstantNull %_arr_v3float_uint_2
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %38 = OpConstantNull %v3float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+    %float_0 = OpConstant %float 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+     %v3bool = OpTypeVector %bool 3
+      %int_3 = OpConstant %int 3
+   %main_out = OpTypeStruct %v4float
+        %110 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+          %m = OpVariable %_ptr_Function_mat3v3float Function %28
+          %a = OpVariable %_ptr_Function_int Function %31
+        %arr = OpVariable %_ptr_Function__arr_v3float_uint_2 Function %35
+          %v = OpVariable %_ptr_Function_v3float Function %38
+         %42 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %43 = OpLoad %int %42
+         %44 = OpConvertSToF %float %43
+         %46 = OpCompositeConstruct %v3float %44 %float_0 %float_0
+         %47 = OpCompositeConstruct %v3float %float_0 %44 %float_0
+         %48 = OpCompositeConstruct %v3float %float_0 %float_0 %44
+         %49 = OpCompositeConstruct %mat3v3float %46 %47 %48
+               OpStore %m %49
+         %50 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %51 = OpLoad %int %50
+               OpStore %a %51
+         %52 = OpLoad %int %a
+         %53 = OpLoad %int %a
+         %55 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_0
+         %56 = OpLoad %float %55
+         %58 = OpAccessChain %_ptr_Function_float %m %52 %53
+               OpStore %58 %56
+         %60 = OpAccessChain %_ptr_Function_v3float %m %int_1
+         %61 = OpLoad %v3float %60
+         %62 = OpAccessChain %_ptr_Function_v3float %m %int_1
+         %63 = OpLoad %v3float %62
+         %64 = OpCompositeConstruct %_arr_v3float_uint_2 %61 %63
+               OpStore %arr %64
+         %65 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_1
+         %66 = OpLoad %float %65
+         %67 = OpCompositeConstruct %v3float %66 %66 %66
+               OpStore %v %67
+         %68 = OpLoad %int %a
+         %69 = OpAccessChain %_ptr_Function_v3float %arr %68
+         %70 = OpLoad %v3float %69
+         %71 = OpLoad %v3float %v
+         %72 = OpFAdd %v3float %71 %70
+               OpStore %v %72
+         %73 = OpLoad %v3float %v
+         %74 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %75 = OpLoad %int %74
+         %77 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %78 = OpLoad %int %77
+         %79 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %80 = OpLoad %int %79
+         %83 = OpConvertSToF %float %75
+         %84 = OpConvertSToF %float %78
+         %85 = OpConvertSToF %float %80
+         %86 = OpCompositeConstruct %v3float %83 %84 %85
+         %87 = OpFOrdEqual %v3bool %73 %86
+         %81 = OpAll %bool %87
+               OpSelectionMerge %89 None
+               OpBranchConditional %81 %90 %91
+         %90 = OpLabel
+         %92 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %93 = OpLoad %int %92
+         %95 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %96 = OpLoad %int %95
+         %97 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %98 = OpLoad %int %97
+         %99 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %100 = OpLoad %int %99
+        %101 = OpConvertSToF %float %93
+        %102 = OpConvertSToF %float %96
+        %103 = OpConvertSToF %float %98
+        %104 = OpConvertSToF %float %100
+        %105 = OpCompositeConstruct %v4float %101 %102 %103 %104
+               OpStore %x_GLF_color %105
+               OpBranch %89
+         %91 = OpLabel
+        %106 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+        %107 = OpLoad %int %106
+        %108 = OpConvertSToF %float %107
+        %109 = OpCompositeConstruct %v4float %108 %108 %108 %108
+               OpStore %x_GLF_color %109
+               OpBranch %89
+         %89 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %110
+%tint_symbol = OpFunctionParameter %main_out
+        %114 = OpLabel
+        %115 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %115
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %117 = OpLabel
+        %118 = OpFunctionCall %void %main_1
+        %120 = OpLoad %v4float %x_GLF_color
+        %121 = OpCompositeConstruct %main_out %120
+        %119 = OpFunctionCall %void %tint_symbol_2 %121
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..302eb53
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-array-matrix-element/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,71 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m : mat3x3<f32>;
+  var a : i32;
+  var arr : array<vec3<f32>, 2>;
+  var v : vec3<f32>;
+  let x_45 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_46 : f32 = f32(x_45);
+  m = mat3x3<f32>(vec3<f32>(x_46, 0.0, 0.0), vec3<f32>(0.0, x_46, 0.0), vec3<f32>(0.0, 0.0, x_46));
+  let x_52 : i32 = x_6.x_GLF_uniform_int_values[0];
+  a = x_52;
+  let x_53 : i32 = a;
+  let x_54 : i32 = a;
+  let x_56 : f32 = x_9.x_GLF_uniform_float_values[0];
+  m[x_53][x_54] = x_56;
+  let x_59 : vec3<f32> = m[1];
+  let x_61 : vec3<f32> = m[1];
+  arr = array<vec3<f32>, 2>(x_59, x_61);
+  let x_64 : f32 = x_9.x_GLF_uniform_float_values[1];
+  v = vec3<f32>(x_64, x_64, x_64);
+  let x_66 : i32 = a;
+  let x_68 : vec3<f32> = arr[x_66];
+  let x_69 : vec3<f32> = v;
+  v = (x_69 + x_68);
+  let x_71 : vec3<f32> = v;
+  let x_73 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_76 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_79 : i32 = x_6.x_GLF_uniform_int_values[1];
+  if (all((x_71 == vec3<f32>(f32(x_73), f32(x_76), f32(x_79))))) {
+    let x_88 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_91 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_94 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_97 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_88), f32(x_91), f32(x_94), f32(x_97));
+  } else {
+    let x_101 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_102 : f32 = f32(x_101);
+    x_GLF_color = vec4<f32>(x_102, x_102, x_102, x_102);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.spvasm
new file mode 100644
index 0000000..c366dac
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.spvasm
@@ -0,0 +1,152 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %v "v"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpName %m "m"
+               OpName %indexable "indexable"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_arr_float_uint_4 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+       %buf1 = OpTypeStruct %_arr_float_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%mat3v4float = OpTypeMatrix %v4float 3
+%_ptr_Function_mat3v4float = OpTypePointer Function %mat3v4float
+      %int_3 = OpConstant %int 3
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+%_ptr_Function_float = OpTypePointer Function %float
+%mat4v4float = OpTypeMatrix %v4float 4
+%_ptr_Function_mat4v4float = OpTypePointer Function %mat4v4float
+     %uint_1 = OpConstant %uint 1
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %15
+         %42 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+          %v = OpVariable %_ptr_Function_v4float Function
+          %m = OpVariable %_ptr_Function_mat3v4float Function
+  %indexable = OpVariable %_ptr_Function_mat4v4float Function
+         %43 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %44 = OpLoad %int %43
+               OpStore %a %44
+         %45 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_2
+         %46 = OpLoad %float %45
+         %47 = OpCompositeConstruct %v4float %46 %46 %46 %46
+               OpStore %v %47
+         %48 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_3
+         %49 = OpLoad %float %48
+         %50 = OpCompositeConstruct %v4float %49 %float_0 %float_0 %float_0
+         %51 = OpCompositeConstruct %v4float %float_0 %49 %float_0 %float_0
+         %52 = OpCompositeConstruct %v4float %float_0 %float_0 %49 %float_0
+         %53 = OpCompositeConstruct %mat3v4float %50 %51 %52
+               OpStore %m %53
+         %54 = OpLoad %int %a
+         %55 = OpLoad %int %a
+         %56 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %57 = OpLoad %float %56
+         %58 = OpAccessChain %_ptr_Function_float %m %54 %55
+               OpStore %58 %57
+         %59 = OpLoad %int %a
+         %60 = OpLoad %mat3v4float %m
+         %61 = OpCompositeExtract %float %60 0 0
+         %62 = OpCompositeExtract %float %60 0 1
+         %63 = OpCompositeExtract %float %60 0 2
+         %64 = OpCompositeExtract %float %60 0 3
+         %65 = OpCompositeExtract %float %60 1 0
+         %66 = OpCompositeExtract %float %60 1 1
+         %67 = OpCompositeExtract %float %60 1 2
+         %68 = OpCompositeExtract %float %60 1 3
+         %69 = OpCompositeExtract %float %60 2 0
+         %70 = OpCompositeExtract %float %60 2 1
+         %71 = OpCompositeExtract %float %60 2 2
+         %72 = OpCompositeExtract %float %60 2 3
+         %73 = OpCompositeConstruct %v4float %61 %62 %63 %64
+         %74 = OpCompositeConstruct %v4float %65 %66 %67 %68
+         %75 = OpCompositeConstruct %v4float %69 %70 %71 %72
+         %76 = OpCompositeConstruct %v4float %float_0 %float_0 %float_0 %float_1
+         %77 = OpCompositeConstruct %mat4v4float %73 %74 %75 %76
+         %78 = OpLoad %int %a
+         %79 = OpLoad %int %a
+               OpStore %indexable %77
+         %80 = OpAccessChain %_ptr_Function_float %indexable %78 %79
+         %81 = OpLoad %float %80
+         %82 = OpAccessChain %_ptr_Function_float %v %59
+         %83 = OpLoad %float %82
+         %84 = OpFAdd %float %83 %81
+         %85 = OpAccessChain %_ptr_Function_float %v %59
+               OpStore %85 %84
+         %86 = OpAccessChain %_ptr_Function_float %v %uint_1
+         %87 = OpLoad %float %86
+         %88 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_1
+         %89 = OpLoad %float %88
+         %90 = OpFOrdEqual %bool %87 %89
+               OpSelectionMerge %91 None
+               OpBranchConditional %90 %92 %93
+         %92 = OpLabel
+         %94 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %95 = OpLoad %int %94
+         %96 = OpConvertSToF %float %95
+         %97 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %98 = OpLoad %int %97
+         %99 = OpConvertSToF %float %98
+        %100 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+        %101 = OpLoad %int %100
+        %102 = OpConvertSToF %float %101
+        %103 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+        %104 = OpLoad %int %103
+        %105 = OpConvertSToF %float %104
+        %106 = OpCompositeConstruct %v4float %96 %99 %102 %105
+               OpStore %_GLF_color %106
+               OpBranch %91
+         %93 = OpLabel
+        %107 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+        %108 = OpLoad %int %107
+        %109 = OpConvertSToF %float %108
+        %110 = OpCompositeConstruct %v4float %109 %109 %109 %109
+               OpStore %_GLF_color %110
+               OpBranch %91
+         %91 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..71686c8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,68 @@
+void set_float4(inout float4 vec, int idx, float val) {
+  vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
+}
+
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+cbuffer cbuffer_x_9 : register(b1, space0) {
+  uint4 x_9[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  float4 v = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float3x4 m = float3x4(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  float4x4 indexable = float4x4(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_44 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  a = x_44;
+  const float x_46 = asfloat(x_9[2].x);
+  v = float4(x_46, x_46, x_46, x_46);
+  const float x_49 = asfloat(x_9[3].x);
+  m = float3x4(float4(x_49, 0.0f, 0.0f, 0.0f), float4(0.0f, x_49, 0.0f, 0.0f), float4(0.0f, 0.0f, x_49, 0.0f));
+  const int x_54 = a;
+  const int x_55 = a;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_57 = asfloat(x_9[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  set_float4(m[x_54], x_55, x_57);
+  const int x_59 = a;
+  const float3x4 x_60 = m;
+  const int x_78 = a;
+  const int x_79 = a;
+  indexable = float4x4(float4(x_60[0u].x, x_60[0u].y, x_60[0u].z, x_60[0u].w), float4(x_60[1u].x, x_60[1u].y, x_60[1u].z, x_60[1u].w), float4(x_60[2u].x, x_60[2u].y, x_60[2u].z, x_60[2u].w), float4(0.0f, 0.0f, 0.0f, 1.0f));
+  const float x_81 = indexable[x_78][x_79];
+  const float x_83 = v[x_59];
+  set_float4(v, x_59, (x_83 + x_81));
+  const float x_87 = v.y;
+  const float x_89 = asfloat(x_9[1].x);
+  if ((x_87 == x_89)) {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_95 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_98 = asint(x_6[1].x);
+    const int x_101 = asint(x_6[1].x);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_104 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    x_GLF_color = float4(float(x_95), float(x_98), float(x_101), float(x_104));
+  } else {
+    const int x_108 = asint(x_6[1].x);
+    const float x_109 = float(x_108);
+    x_GLF_color = float4(x_109, x_109, x_109, x_109);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..00f2b25
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.spvasm.expected.msl
@@ -0,0 +1,77 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[4];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_9, thread float4* const tint_symbol_4) {
+  int a = 0;
+  float4 v = 0.0f;
+  float3x4 m = float3x4(0.0f);
+  float4x4 indexable = float4x4(0.0f);
+  int const x_44 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  a = x_44;
+  float const x_46 = x_9.x_GLF_uniform_float_values.arr[2].el;
+  v = float4(x_46, x_46, x_46, x_46);
+  float const x_49 = x_9.x_GLF_uniform_float_values.arr[3].el;
+  m = float3x4(float4(x_49, 0.0f, 0.0f, 0.0f), float4(0.0f, x_49, 0.0f, 0.0f), float4(0.0f, 0.0f, x_49, 0.0f));
+  int const x_54 = a;
+  int const x_55 = a;
+  float const x_57 = x_9.x_GLF_uniform_float_values.arr[0].el;
+  m[x_54][x_55] = x_57;
+  int const x_59 = a;
+  float3x4 const x_60 = m;
+  int const x_78 = a;
+  int const x_79 = a;
+  indexable = float4x4(float4(x_60[0u].x, x_60[0u].y, x_60[0u].z, x_60[0u].w), float4(x_60[1u].x, x_60[1u].y, x_60[1u].z, x_60[1u].w), float4(x_60[2u].x, x_60[2u].y, x_60[2u].z, x_60[2u].w), float4(0.0f, 0.0f, 0.0f, 1.0f));
+  float const x_81 = indexable[x_78][x_79];
+  float const x_83 = v[x_59];
+  v[x_59] = (x_83 + x_81);
+  float const x_87 = v.y;
+  float const x_89 = x_9.x_GLF_uniform_float_values.arr[1].el;
+  if ((x_87 == x_89)) {
+    int const x_95 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_98 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_101 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_104 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_95), float(x_98), float(x_101), float(x_104));
+  } else {
+    int const x_108 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    float const x_109 = float(x_108);
+    *(tint_symbol_4) = float4(x_109, x_109, x_109, x_109);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_9 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..03ce671
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,200 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 141
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %v "v"
+               OpName %m "m"
+               OpName %indexable "indexable"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_4 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+       %buf1 = OpTypeStruct %_arr_float_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_9 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %26 = OpConstantNull %int
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%mat3v4float = OpTypeMatrix %v4float 3
+%_ptr_Function_mat3v4float = OpTypePointer Function %mat3v4float
+         %32 = OpConstantNull %mat3v4float
+%mat4v4float = OpTypeMatrix %v4float 4
+%_ptr_Function_mat4v4float = OpTypePointer Function %mat4v4float
+         %36 = OpConstantNull %mat4v4float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_3 = OpConstant %int 3
+    %float_0 = OpConstant %float 0
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+    %float_1 = OpConstant %float 1
+         %94 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %v4float
+        %129 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %26
+          %v = OpVariable %_ptr_Function_v4float Function %17
+          %m = OpVariable %_ptr_Function_mat3v4float Function %32
+  %indexable = OpVariable %_ptr_Function_mat4v4float Function %36
+         %40 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %41 = OpLoad %int %40
+               OpStore %a %41
+         %44 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_2
+         %45 = OpLoad %float %44
+         %46 = OpCompositeConstruct %v4float %45 %45 %45 %45
+               OpStore %v %46
+         %48 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_3
+         %49 = OpLoad %float %48
+         %51 = OpCompositeConstruct %v4float %49 %float_0 %float_0 %float_0
+         %52 = OpCompositeConstruct %v4float %float_0 %49 %float_0 %float_0
+         %53 = OpCompositeConstruct %v4float %float_0 %float_0 %49 %float_0
+         %54 = OpCompositeConstruct %mat3v4float %51 %52 %53
+               OpStore %m %54
+         %55 = OpLoad %int %a
+         %56 = OpLoad %int %a
+         %57 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_0
+         %58 = OpLoad %float %57
+         %60 = OpAccessChain %_ptr_Function_float %m %55 %56
+               OpStore %60 %58
+         %61 = OpLoad %int %a
+         %62 = OpLoad %mat3v4float %m
+         %63 = OpLoad %int %a
+         %64 = OpLoad %int %a
+         %65 = OpCompositeExtract %v4float %62 0
+         %66 = OpCompositeExtract %float %65 0
+         %67 = OpCompositeExtract %v4float %62 0
+         %68 = OpCompositeExtract %float %67 1
+         %69 = OpCompositeExtract %v4float %62 0
+         %70 = OpCompositeExtract %float %69 2
+         %71 = OpCompositeExtract %v4float %62 0
+         %72 = OpCompositeExtract %float %71 3
+         %73 = OpCompositeConstruct %v4float %66 %68 %70 %72
+         %75 = OpCompositeExtract %v4float %62 1
+         %76 = OpCompositeExtract %float %75 0
+         %77 = OpCompositeExtract %v4float %62 1
+         %78 = OpCompositeExtract %float %77 1
+         %79 = OpCompositeExtract %v4float %62 1
+         %80 = OpCompositeExtract %float %79 2
+         %81 = OpCompositeExtract %v4float %62 1
+         %82 = OpCompositeExtract %float %81 3
+         %83 = OpCompositeConstruct %v4float %76 %78 %80 %82
+         %84 = OpCompositeExtract %v4float %62 2
+         %85 = OpCompositeExtract %float %84 0
+         %86 = OpCompositeExtract %v4float %62 2
+         %87 = OpCompositeExtract %float %86 1
+         %88 = OpCompositeExtract %v4float %62 2
+         %89 = OpCompositeExtract %float %88 2
+         %90 = OpCompositeExtract %v4float %62 2
+         %91 = OpCompositeExtract %float %90 3
+         %92 = OpCompositeConstruct %v4float %85 %87 %89 %91
+         %95 = OpCompositeConstruct %mat4v4float %73 %83 %92 %94
+               OpStore %indexable %95
+         %96 = OpAccessChain %_ptr_Function_float %indexable %63 %64
+         %97 = OpLoad %float %96
+         %98 = OpAccessChain %_ptr_Function_float %v %61
+         %99 = OpLoad %float %98
+        %100 = OpAccessChain %_ptr_Function_float %v %61
+        %101 = OpFAdd %float %99 %97
+               OpStore %100 %101
+        %102 = OpAccessChain %_ptr_Function_float %v %uint_1
+        %103 = OpLoad %float %102
+        %105 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_1
+        %106 = OpLoad %float %105
+        %107 = OpFOrdEqual %bool %103 %106
+               OpSelectionMerge %109 None
+               OpBranchConditional %107 %110 %111
+        %110 = OpLabel
+        %112 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %113 = OpLoad %int %112
+        %114 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %115 = OpLoad %int %114
+        %116 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %117 = OpLoad %int %116
+        %118 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %119 = OpLoad %int %118
+        %120 = OpConvertSToF %float %113
+        %121 = OpConvertSToF %float %115
+        %122 = OpConvertSToF %float %117
+        %123 = OpConvertSToF %float %119
+        %124 = OpCompositeConstruct %v4float %120 %121 %122 %123
+               OpStore %x_GLF_color %124
+               OpBranch %109
+        %111 = OpLabel
+        %125 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %126 = OpLoad %int %125
+        %127 = OpConvertSToF %float %126
+        %128 = OpCompositeConstruct %v4float %127 %127 %127 %127
+               OpStore %x_GLF_color %128
+               OpBranch %109
+        %109 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %129
+%tint_symbol = OpFunctionParameter %main_out
+        %133 = OpLabel
+        %134 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %134
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %136 = OpLabel
+        %137 = OpFunctionCall %void %main_1
+        %139 = OpLoad %v4float %x_GLF_color
+        %140 = OpCompositeConstruct %main_out %139
+        %138 = OpFunctionCall %void %tint_symbol_2 %140
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..ff8e0f0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,69 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var v : vec4<f32>;
+  var m : mat3x4<f32>;
+  var indexable : mat4x4<f32>;
+  let x_44 : i32 = x_6.x_GLF_uniform_int_values[0];
+  a = x_44;
+  let x_46 : f32 = x_9.x_GLF_uniform_float_values[2];
+  v = vec4<f32>(x_46, x_46, x_46, x_46);
+  let x_49 : f32 = x_9.x_GLF_uniform_float_values[3];
+  m = mat3x4<f32>(vec4<f32>(x_49, 0.0, 0.0, 0.0), vec4<f32>(0.0, x_49, 0.0, 0.0), vec4<f32>(0.0, 0.0, x_49, 0.0));
+  let x_54 : i32 = a;
+  let x_55 : i32 = a;
+  let x_57 : f32 = x_9.x_GLF_uniform_float_values[0];
+  m[x_54][x_55] = x_57;
+  let x_59 : i32 = a;
+  let x_60 : mat3x4<f32> = m;
+  let x_78 : i32 = a;
+  let x_79 : i32 = a;
+  indexable = mat4x4<f32>(vec4<f32>(x_60[0u].x, x_60[0u].y, x_60[0u].z, x_60[0u].w), vec4<f32>(x_60[1u].x, x_60[1u].y, x_60[1u].z, x_60[1u].w), vec4<f32>(x_60[2u].x, x_60[2u].y, x_60[2u].z, x_60[2u].w), vec4<f32>(0.0, 0.0, 0.0, 1.0));
+  let x_81 : f32 = indexable[x_78][x_79];
+  let x_83 : f32 = v[x_59];
+  v[x_59] = (x_83 + x_81);
+  let x_87 : f32 = v.y;
+  let x_89 : f32 = x_9.x_GLF_uniform_float_values[1];
+  if ((x_87 == x_89)) {
+    let x_95 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_98 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_101 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_104 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_95), f32(x_98), f32(x_101), f32(x_104));
+  } else {
+    let x_108 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_109 : f32 = f32(x_108);
+    x_GLF_color = vec4<f32>(x_109, x_109, x_109, x_109);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.wgsl
new file mode 100644
index 0000000..ff8e0f0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.wgsl
@@ -0,0 +1,69 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var v : vec4<f32>;
+  var m : mat3x4<f32>;
+  var indexable : mat4x4<f32>;
+  let x_44 : i32 = x_6.x_GLF_uniform_int_values[0];
+  a = x_44;
+  let x_46 : f32 = x_9.x_GLF_uniform_float_values[2];
+  v = vec4<f32>(x_46, x_46, x_46, x_46);
+  let x_49 : f32 = x_9.x_GLF_uniform_float_values[3];
+  m = mat3x4<f32>(vec4<f32>(x_49, 0.0, 0.0, 0.0), vec4<f32>(0.0, x_49, 0.0, 0.0), vec4<f32>(0.0, 0.0, x_49, 0.0));
+  let x_54 : i32 = a;
+  let x_55 : i32 = a;
+  let x_57 : f32 = x_9.x_GLF_uniform_float_values[0];
+  m[x_54][x_55] = x_57;
+  let x_59 : i32 = a;
+  let x_60 : mat3x4<f32> = m;
+  let x_78 : i32 = a;
+  let x_79 : i32 = a;
+  indexable = mat4x4<f32>(vec4<f32>(x_60[0u].x, x_60[0u].y, x_60[0u].z, x_60[0u].w), vec4<f32>(x_60[1u].x, x_60[1u].y, x_60[1u].z, x_60[1u].w), vec4<f32>(x_60[2u].x, x_60[2u].y, x_60[2u].z, x_60[2u].w), vec4<f32>(0.0, 0.0, 0.0, 1.0));
+  let x_81 : f32 = indexable[x_78][x_79];
+  let x_83 : f32 = v[x_59];
+  v[x_59] = (x_83 + x_81);
+  let x_87 : f32 = v.y;
+  let x_89 : f32 = x_9.x_GLF_uniform_float_values[1];
+  if ((x_87 == x_89)) {
+    let x_95 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_98 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_101 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_104 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_95), f32(x_98), f32(x_101), f32(x_104));
+  } else {
+    let x_108 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_109 : f32 = f32(x_108);
+    x_GLF_color = vec4<f32>(x_109, x_109, x_109, x_109);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..71686c8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,68 @@
+void set_float4(inout float4 vec, int idx, float val) {
+  vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
+}
+
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+cbuffer cbuffer_x_9 : register(b1, space0) {
+  uint4 x_9[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  float4 v = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float3x4 m = float3x4(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  float4x4 indexable = float4x4(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_44 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  a = x_44;
+  const float x_46 = asfloat(x_9[2].x);
+  v = float4(x_46, x_46, x_46, x_46);
+  const float x_49 = asfloat(x_9[3].x);
+  m = float3x4(float4(x_49, 0.0f, 0.0f, 0.0f), float4(0.0f, x_49, 0.0f, 0.0f), float4(0.0f, 0.0f, x_49, 0.0f));
+  const int x_54 = a;
+  const int x_55 = a;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_57 = asfloat(x_9[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  set_float4(m[x_54], x_55, x_57);
+  const int x_59 = a;
+  const float3x4 x_60 = m;
+  const int x_78 = a;
+  const int x_79 = a;
+  indexable = float4x4(float4(x_60[0u].x, x_60[0u].y, x_60[0u].z, x_60[0u].w), float4(x_60[1u].x, x_60[1u].y, x_60[1u].z, x_60[1u].w), float4(x_60[2u].x, x_60[2u].y, x_60[2u].z, x_60[2u].w), float4(0.0f, 0.0f, 0.0f, 1.0f));
+  const float x_81 = indexable[x_78][x_79];
+  const float x_83 = v[x_59];
+  set_float4(v, x_59, (x_83 + x_81));
+  const float x_87 = v.y;
+  const float x_89 = asfloat(x_9[1].x);
+  if ((x_87 == x_89)) {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_95 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_98 = asint(x_6[1].x);
+    const int x_101 = asint(x_6[1].x);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_104 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    x_GLF_color = float4(float(x_95), float(x_98), float(x_101), float(x_104));
+  } else {
+    const int x_108 = asint(x_6[1].x);
+    const float x_109 = float(x_108);
+    x_GLF_color = float4(x_109, x_109, x_109, x_109);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..00f2b25
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.wgsl.expected.msl
@@ -0,0 +1,77 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[4];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_9, thread float4* const tint_symbol_4) {
+  int a = 0;
+  float4 v = 0.0f;
+  float3x4 m = float3x4(0.0f);
+  float4x4 indexable = float4x4(0.0f);
+  int const x_44 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  a = x_44;
+  float const x_46 = x_9.x_GLF_uniform_float_values.arr[2].el;
+  v = float4(x_46, x_46, x_46, x_46);
+  float const x_49 = x_9.x_GLF_uniform_float_values.arr[3].el;
+  m = float3x4(float4(x_49, 0.0f, 0.0f, 0.0f), float4(0.0f, x_49, 0.0f, 0.0f), float4(0.0f, 0.0f, x_49, 0.0f));
+  int const x_54 = a;
+  int const x_55 = a;
+  float const x_57 = x_9.x_GLF_uniform_float_values.arr[0].el;
+  m[x_54][x_55] = x_57;
+  int const x_59 = a;
+  float3x4 const x_60 = m;
+  int const x_78 = a;
+  int const x_79 = a;
+  indexable = float4x4(float4(x_60[0u].x, x_60[0u].y, x_60[0u].z, x_60[0u].w), float4(x_60[1u].x, x_60[1u].y, x_60[1u].z, x_60[1u].w), float4(x_60[2u].x, x_60[2u].y, x_60[2u].z, x_60[2u].w), float4(0.0f, 0.0f, 0.0f, 1.0f));
+  float const x_81 = indexable[x_78][x_79];
+  float const x_83 = v[x_59];
+  v[x_59] = (x_83 + x_81);
+  float const x_87 = v.y;
+  float const x_89 = x_9.x_GLF_uniform_float_values.arr[1].el;
+  if ((x_87 == x_89)) {
+    int const x_95 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_98 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_101 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_104 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_95), float(x_98), float(x_101), float(x_104));
+  } else {
+    int const x_108 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    float const x_109 = float(x_108);
+    *(tint_symbol_4) = float4(x_109, x_109, x_109, x_109);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_9 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..03ce671
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,200 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 141
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %v "v"
+               OpName %m "m"
+               OpName %indexable "indexable"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_4 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+       %buf1 = OpTypeStruct %_arr_float_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_9 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %26 = OpConstantNull %int
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%mat3v4float = OpTypeMatrix %v4float 3
+%_ptr_Function_mat3v4float = OpTypePointer Function %mat3v4float
+         %32 = OpConstantNull %mat3v4float
+%mat4v4float = OpTypeMatrix %v4float 4
+%_ptr_Function_mat4v4float = OpTypePointer Function %mat4v4float
+         %36 = OpConstantNull %mat4v4float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_3 = OpConstant %int 3
+    %float_0 = OpConstant %float 0
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+    %float_1 = OpConstant %float 1
+         %94 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %v4float
+        %129 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %26
+          %v = OpVariable %_ptr_Function_v4float Function %17
+          %m = OpVariable %_ptr_Function_mat3v4float Function %32
+  %indexable = OpVariable %_ptr_Function_mat4v4float Function %36
+         %40 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %41 = OpLoad %int %40
+               OpStore %a %41
+         %44 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_2
+         %45 = OpLoad %float %44
+         %46 = OpCompositeConstruct %v4float %45 %45 %45 %45
+               OpStore %v %46
+         %48 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_3
+         %49 = OpLoad %float %48
+         %51 = OpCompositeConstruct %v4float %49 %float_0 %float_0 %float_0
+         %52 = OpCompositeConstruct %v4float %float_0 %49 %float_0 %float_0
+         %53 = OpCompositeConstruct %v4float %float_0 %float_0 %49 %float_0
+         %54 = OpCompositeConstruct %mat3v4float %51 %52 %53
+               OpStore %m %54
+         %55 = OpLoad %int %a
+         %56 = OpLoad %int %a
+         %57 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_0
+         %58 = OpLoad %float %57
+         %60 = OpAccessChain %_ptr_Function_float %m %55 %56
+               OpStore %60 %58
+         %61 = OpLoad %int %a
+         %62 = OpLoad %mat3v4float %m
+         %63 = OpLoad %int %a
+         %64 = OpLoad %int %a
+         %65 = OpCompositeExtract %v4float %62 0
+         %66 = OpCompositeExtract %float %65 0
+         %67 = OpCompositeExtract %v4float %62 0
+         %68 = OpCompositeExtract %float %67 1
+         %69 = OpCompositeExtract %v4float %62 0
+         %70 = OpCompositeExtract %float %69 2
+         %71 = OpCompositeExtract %v4float %62 0
+         %72 = OpCompositeExtract %float %71 3
+         %73 = OpCompositeConstruct %v4float %66 %68 %70 %72
+         %75 = OpCompositeExtract %v4float %62 1
+         %76 = OpCompositeExtract %float %75 0
+         %77 = OpCompositeExtract %v4float %62 1
+         %78 = OpCompositeExtract %float %77 1
+         %79 = OpCompositeExtract %v4float %62 1
+         %80 = OpCompositeExtract %float %79 2
+         %81 = OpCompositeExtract %v4float %62 1
+         %82 = OpCompositeExtract %float %81 3
+         %83 = OpCompositeConstruct %v4float %76 %78 %80 %82
+         %84 = OpCompositeExtract %v4float %62 2
+         %85 = OpCompositeExtract %float %84 0
+         %86 = OpCompositeExtract %v4float %62 2
+         %87 = OpCompositeExtract %float %86 1
+         %88 = OpCompositeExtract %v4float %62 2
+         %89 = OpCompositeExtract %float %88 2
+         %90 = OpCompositeExtract %v4float %62 2
+         %91 = OpCompositeExtract %float %90 3
+         %92 = OpCompositeConstruct %v4float %85 %87 %89 %91
+         %95 = OpCompositeConstruct %mat4v4float %73 %83 %92 %94
+               OpStore %indexable %95
+         %96 = OpAccessChain %_ptr_Function_float %indexable %63 %64
+         %97 = OpLoad %float %96
+         %98 = OpAccessChain %_ptr_Function_float %v %61
+         %99 = OpLoad %float %98
+        %100 = OpAccessChain %_ptr_Function_float %v %61
+        %101 = OpFAdd %float %99 %97
+               OpStore %100 %101
+        %102 = OpAccessChain %_ptr_Function_float %v %uint_1
+        %103 = OpLoad %float %102
+        %105 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_1
+        %106 = OpLoad %float %105
+        %107 = OpFOrdEqual %bool %103 %106
+               OpSelectionMerge %109 None
+               OpBranchConditional %107 %110 %111
+        %110 = OpLabel
+        %112 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %113 = OpLoad %int %112
+        %114 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %115 = OpLoad %int %114
+        %116 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %117 = OpLoad %int %116
+        %118 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %119 = OpLoad %int %118
+        %120 = OpConvertSToF %float %113
+        %121 = OpConvertSToF %float %115
+        %122 = OpConvertSToF %float %117
+        %123 = OpConvertSToF %float %119
+        %124 = OpCompositeConstruct %v4float %120 %121 %122 %123
+               OpStore %x_GLF_color %124
+               OpBranch %109
+        %111 = OpLabel
+        %125 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %126 = OpLoad %int %125
+        %127 = OpConvertSToF %float %126
+        %128 = OpCompositeConstruct %v4float %127 %127 %127 %127
+               OpStore %x_GLF_color %128
+               OpBranch %109
+        %109 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %129
+%tint_symbol = OpFunctionParameter %main_out
+        %133 = OpLabel
+        %134 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %134
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %136 = OpLabel
+        %137 = OpFunctionCall %void %main_1
+        %139 = OpLoad %v4float %x_GLF_color
+        %140 = OpCompositeConstruct %main_out %139
+        %138 = OpFunctionCall %void %tint_symbol_2 %140
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..ff8e0f0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-increment-vector-component-with-matrix-copy/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,69 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var v : vec4<f32>;
+  var m : mat3x4<f32>;
+  var indexable : mat4x4<f32>;
+  let x_44 : i32 = x_6.x_GLF_uniform_int_values[0];
+  a = x_44;
+  let x_46 : f32 = x_9.x_GLF_uniform_float_values[2];
+  v = vec4<f32>(x_46, x_46, x_46, x_46);
+  let x_49 : f32 = x_9.x_GLF_uniform_float_values[3];
+  m = mat3x4<f32>(vec4<f32>(x_49, 0.0, 0.0, 0.0), vec4<f32>(0.0, x_49, 0.0, 0.0), vec4<f32>(0.0, 0.0, x_49, 0.0));
+  let x_54 : i32 = a;
+  let x_55 : i32 = a;
+  let x_57 : f32 = x_9.x_GLF_uniform_float_values[0];
+  m[x_54][x_55] = x_57;
+  let x_59 : i32 = a;
+  let x_60 : mat3x4<f32> = m;
+  let x_78 : i32 = a;
+  let x_79 : i32 = a;
+  indexable = mat4x4<f32>(vec4<f32>(x_60[0u].x, x_60[0u].y, x_60[0u].z, x_60[0u].w), vec4<f32>(x_60[1u].x, x_60[1u].y, x_60[1u].z, x_60[1u].w), vec4<f32>(x_60[2u].x, x_60[2u].y, x_60[2u].z, x_60[2u].w), vec4<f32>(0.0, 0.0, 0.0, 1.0));
+  let x_81 : f32 = indexable[x_78][x_79];
+  let x_83 : f32 = v[x_59];
+  v[x_59] = (x_83 + x_81);
+  let x_87 : f32 = v.y;
+  let x_89 : f32 = x_9.x_GLF_uniform_float_values[1];
+  if ((x_87 == x_89)) {
+    let x_95 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_98 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_101 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_104 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_95), f32(x_98), f32(x_101), f32(x_104));
+  } else {
+    let x_108 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_109 : f32 = f32(x_108);
+    x_GLF_color = vec4<f32>(x_109, x_109, x_109, x_109);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-empty-block/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-empty-block/0-opt.spvasm
new file mode 100644
index 0000000..c0dce99
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-empty-block/0-opt.spvasm
@@ -0,0 +1,61 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %func_ "func("
+               OpName %x "x"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+         %11 = OpTypeFunction %v4float
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_1 = OpConstant %float 1
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+  %float_0_5 = OpConstant %float 0.5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %22 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+      %false = OpConstantFalse %bool
+       %main = OpFunction %void None %8
+         %24 = OpLabel
+               OpStore %_GLF_color %22
+               OpBranch %25
+         %25 = OpLabel
+         %26 = OpFunctionCall %v4float %func_
+               OpStore %_GLF_color %26
+               OpLoopMerge %27 %25 None
+               OpBranchConditional %false %25 %27
+         %27 = OpLabel
+               OpReturn
+               OpFunctionEnd
+      %func_ = OpFunction %v4float None %11
+         %28 = OpLabel
+          %x = OpVariable %_ptr_Function_float Function
+               OpStore %x %float_1
+         %29 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %30 = OpLoad %float %29
+         %31 = OpFOrdLessThan %bool %30 %float_0
+               OpSelectionMerge %32 None
+               OpBranchConditional %31 %33 %32
+         %33 = OpLabel
+               OpStore %x %float_0_5
+               OpBranch %32
+         %32 = OpLabel
+         %34 = OpLoad %float %x
+         %35 = OpCompositeConstruct %v4float %34 %float_0 %float_0 %float_1
+               OpReturnValue %35
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-empty-block/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-empty-block/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..9f97945
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-empty-block/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,44 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float4 func_() {
+  float x = 0.0f;
+  x = 1.0f;
+  const float x_30 = gl_FragCoord.x;
+  if ((x_30 < 0.0f)) {
+    x = 0.5f;
+  }
+  return float4(x, 0.0f, 0.0f, 1.0f);
+}
+
+void main_1() {
+  x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  while (true) {
+    const float4 x_26 = func_();
+    x_GLF_color = x_26;
+    if (false) {
+    } else {
+      break;
+    }
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-empty-block/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-empty-block/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..ab5b07e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-empty-block/0-opt.spvasm.expected.msl
@@ -0,0 +1,44 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float4 func_(thread float4* const tint_symbol_5) {
+  float x = 0.0f;
+  x = 1.0f;
+  float const x_30 = (*(tint_symbol_5)).x;
+  if ((x_30 < 0.0f)) {
+    x = 0.5f;
+  }
+  float const x_34 = x;
+  return float4(x_34, 0.0f, 0.0f, 1.0f);
+}
+
+void main_1(thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  *(tint_symbol_6) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  while (true) {
+    float4 const x_26 = func_(tint_symbol_7);
+    *(tint_symbol_6) = x_26;
+    if (false) {
+    } else {
+      break;
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(&(tint_symbol_9), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-empty-block/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-empty-block/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..62468de
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-empty-block/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,107 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 58
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %func_ "func_"
+               OpName %x "x"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+         %11 = OpTypeFunction %v4float
+%_ptr_Function_float = OpTypePointer Function %float
+         %16 = OpConstantNull %float
+    %float_1 = OpConstant %float 1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+  %float_0_5 = OpConstant %float 0.5
+       %void = OpTypeVoid
+         %31 = OpTypeFunction %void
+         %35 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+      %false = OpConstantFalse %bool
+   %main_out = OpTypeStruct %v4float
+         %45 = OpTypeFunction %void %main_out
+      %func_ = OpFunction %v4float None %11
+         %13 = OpLabel
+          %x = OpVariable %_ptr_Function_float Function %16
+               OpStore %x %float_1
+         %21 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %22 = OpLoad %float %21
+         %24 = OpFOrdLessThan %bool %22 %float_0
+               OpSelectionMerge %26 None
+               OpBranchConditional %24 %27 %26
+         %27 = OpLabel
+               OpStore %x %float_0_5
+               OpBranch %26
+         %26 = OpLabel
+         %29 = OpLoad %float %x
+         %30 = OpCompositeConstruct %v4float %29 %float_0 %float_0 %float_1
+               OpReturnValue %30
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %31
+         %34 = OpLabel
+               OpStore %x_GLF_color %35
+               OpBranch %36
+         %36 = OpLabel
+               OpLoopMerge %37 %38 None
+               OpBranch %39
+         %39 = OpLabel
+         %40 = OpFunctionCall %v4float %func_
+               OpStore %x_GLF_color %40
+               OpSelectionMerge %42 None
+               OpBranchConditional %false %43 %44
+         %43 = OpLabel
+               OpBranch %42
+         %44 = OpLabel
+               OpBranch %37
+         %42 = OpLabel
+               OpBranch %38
+         %38 = OpLabel
+               OpBranch %36
+         %37 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %45
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %49 = OpLabel
+         %50 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %50
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %31
+         %52 = OpLabel
+         %53 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %53
+         %54 = OpFunctionCall %void %main_1
+         %56 = OpLoad %v4float %x_GLF_color
+         %57 = OpCompositeConstruct %main_out %56
+         %55 = OpFunctionCall %void %tint_symbol_3 %57
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-empty-block/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-empty-block/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..7d42f20
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-empty-block/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,39 @@
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> vec4<f32> {
+  var x : f32;
+  x = 1.0;
+  let x_30 : f32 = gl_FragCoord.x;
+  if ((x_30 < 0.0)) {
+    x = 0.5;
+  }
+  let x_34 : f32 = x;
+  return vec4<f32>(x_34, 0.0, 0.0, 1.0);
+}
+
+fn main_1() {
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  loop {
+    let x_26 : vec4<f32> = func_();
+    x_GLF_color = x_26;
+    if (false) {
+    } else {
+      break;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-empty-block/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-empty-block/0-opt.wgsl
new file mode 100644
index 0000000..7d42f20
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-empty-block/0-opt.wgsl
@@ -0,0 +1,39 @@
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> vec4<f32> {
+  var x : f32;
+  x = 1.0;
+  let x_30 : f32 = gl_FragCoord.x;
+  if ((x_30 < 0.0)) {
+    x = 0.5;
+  }
+  let x_34 : f32 = x;
+  return vec4<f32>(x_34, 0.0, 0.0, 1.0);
+}
+
+fn main_1() {
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  loop {
+    let x_26 : vec4<f32> = func_();
+    x_GLF_color = x_26;
+    if (false) {
+    } else {
+      break;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-empty-block/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-empty-block/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..9f97945
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-empty-block/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,44 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float4 func_() {
+  float x = 0.0f;
+  x = 1.0f;
+  const float x_30 = gl_FragCoord.x;
+  if ((x_30 < 0.0f)) {
+    x = 0.5f;
+  }
+  return float4(x, 0.0f, 0.0f, 1.0f);
+}
+
+void main_1() {
+  x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  while (true) {
+    const float4 x_26 = func_();
+    x_GLF_color = x_26;
+    if (false) {
+    } else {
+      break;
+    }
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-empty-block/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-empty-block/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..ab5b07e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-empty-block/0-opt.wgsl.expected.msl
@@ -0,0 +1,44 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float4 func_(thread float4* const tint_symbol_5) {
+  float x = 0.0f;
+  x = 1.0f;
+  float const x_30 = (*(tint_symbol_5)).x;
+  if ((x_30 < 0.0f)) {
+    x = 0.5f;
+  }
+  float const x_34 = x;
+  return float4(x_34, 0.0f, 0.0f, 1.0f);
+}
+
+void main_1(thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  *(tint_symbol_6) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  while (true) {
+    float4 const x_26 = func_(tint_symbol_7);
+    *(tint_symbol_6) = x_26;
+    if (false) {
+    } else {
+      break;
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(&(tint_symbol_9), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-empty-block/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-empty-block/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..62468de
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-empty-block/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,107 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 58
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %func_ "func_"
+               OpName %x "x"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+         %11 = OpTypeFunction %v4float
+%_ptr_Function_float = OpTypePointer Function %float
+         %16 = OpConstantNull %float
+    %float_1 = OpConstant %float 1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+  %float_0_5 = OpConstant %float 0.5
+       %void = OpTypeVoid
+         %31 = OpTypeFunction %void
+         %35 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+      %false = OpConstantFalse %bool
+   %main_out = OpTypeStruct %v4float
+         %45 = OpTypeFunction %void %main_out
+      %func_ = OpFunction %v4float None %11
+         %13 = OpLabel
+          %x = OpVariable %_ptr_Function_float Function %16
+               OpStore %x %float_1
+         %21 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %22 = OpLoad %float %21
+         %24 = OpFOrdLessThan %bool %22 %float_0
+               OpSelectionMerge %26 None
+               OpBranchConditional %24 %27 %26
+         %27 = OpLabel
+               OpStore %x %float_0_5
+               OpBranch %26
+         %26 = OpLabel
+         %29 = OpLoad %float %x
+         %30 = OpCompositeConstruct %v4float %29 %float_0 %float_0 %float_1
+               OpReturnValue %30
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %31
+         %34 = OpLabel
+               OpStore %x_GLF_color %35
+               OpBranch %36
+         %36 = OpLabel
+               OpLoopMerge %37 %38 None
+               OpBranch %39
+         %39 = OpLabel
+         %40 = OpFunctionCall %v4float %func_
+               OpStore %x_GLF_color %40
+               OpSelectionMerge %42 None
+               OpBranchConditional %false %43 %44
+         %43 = OpLabel
+               OpBranch %42
+         %44 = OpLabel
+               OpBranch %37
+         %42 = OpLabel
+               OpBranch %38
+         %38 = OpLabel
+               OpBranch %36
+         %37 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %45
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %49 = OpLabel
+         %50 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %50
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %31
+         %52 = OpLabel
+         %53 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %53
+         %54 = OpFunctionCall %void %main_1
+         %56 = OpLoad %v4float %x_GLF_color
+         %57 = OpCompositeConstruct %main_out %56
+         %55 = OpFunctionCall %void %tint_symbol_3 %57
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-empty-block/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-empty-block/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..7d42f20
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-empty-block/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,39 @@
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> vec4<f32> {
+  var x : f32;
+  x = 1.0;
+  let x_30 : f32 = gl_FragCoord.x;
+  if ((x_30 < 0.0)) {
+    x = 0.5;
+  }
+  let x_34 : f32 = x;
+  return vec4<f32>(x_34, 0.0, 0.0, 1.0);
+}
+
+fn main_1() {
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  loop {
+    let x_26 : vec4<f32> = func_();
+    x_GLF_color = x_26;
+    if (false) {
+    } else {
+      break;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-nested-loops/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-nested-loops/0-opt.spvasm
new file mode 100644
index 0000000..7abcce9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-nested-loops/0-opt.spvasm
@@ -0,0 +1,93 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %returnRed_ "returnRed("
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+         %11 = OpTypeFunction %v4float
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %20 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %false = OpConstantFalse %bool
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%_ptr_Function_bool = OpTypePointer Function %bool
+       %true = OpConstantTrue %bool
+         %26 = OpUndef %v4float
+         %27 = OpUndef %bool
+       %main = OpFunction %void None %8
+         %28 = OpLabel
+               OpBranch %29
+         %29 = OpLabel
+         %30 = OpFunctionCall %v4float %returnRed_
+               OpStore %_GLF_color %30
+               OpLoopMerge %31 %29 None
+               OpBranchConditional %false %29 %31
+         %31 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %returnRed_ = OpFunction %v4float None %11
+         %32 = OpLabel
+         %33 = OpVariable %_ptr_Function_bool Function %false
+         %34 = OpVariable %_ptr_Function_v4float Function
+               OpBranch %35
+         %35 = OpLabel
+         %36 = OpPhi %bool %false %32 %27 %37
+               OpLoopMerge %38 %37 None
+               OpBranch %39
+         %39 = OpLabel
+               OpLoopMerge %40 %41 None
+               OpBranch %42
+         %42 = OpLabel
+         %43 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %44 = OpLoad %int %43
+         %45 = OpIEqual %bool %44 %int_1
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %46
+         %47 = OpLabel
+               OpStore %33 %true
+               OpStore %34 %20
+               OpBranch %40
+         %46 = OpLabel
+               OpBranch %41
+         %41 = OpLabel
+               OpBranchConditional %false %39 %40
+         %40 = OpLabel
+         %48 = OpPhi %v4float %20 %47 %26 %41
+         %49 = OpPhi %bool %true %47 %false %41
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %38 %50
+         %50 = OpLabel
+               OpStore %33 %true
+               OpStore %34 %20
+               OpBranch %38
+         %37 = OpLabel
+               OpBranch %35
+         %38 = OpLabel
+         %51 = OpPhi %v4float %48 %40 %20 %50
+               OpReturnValue %51
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-nested-loops/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-nested-loops/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..e3f6afa
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-nested-loops/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,76 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float4 returnRed_() {
+  bool x_33 = false;
+  float4 x_34 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 x_48 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  bool x_36_phi = false;
+  float4 x_51_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  x_36_phi = false;
+  while (true) {
+    float4 x_48_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    bool x_49_phi = false;
+    const bool x_36 = x_36_phi;
+    while (true) {
+      const int x_44 = asint(x_6[0].x);
+      if ((x_44 == 1)) {
+        x_33 = true;
+        x_34 = float4(1.0f, 0.0f, 0.0f, 1.0f);
+        x_48_phi = float4(1.0f, 0.0f, 0.0f, 1.0f);
+        x_49_phi = true;
+        break;
+      }
+      {
+        x_48_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        x_49_phi = false;
+        if (false) {
+        } else {
+          break;
+        }
+      }
+    }
+    x_48 = x_48_phi;
+    const bool x_49 = x_49_phi;
+    x_51_phi = x_48;
+    if (x_49) {
+      break;
+    }
+    x_33 = true;
+    x_34 = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    x_51_phi = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    break;
+    {
+      x_36_phi = false;
+    }
+  }
+  return x_51_phi;
+}
+
+void main_1() {
+  while (true) {
+    const float4 x_30 = returnRed_();
+    x_GLF_color = x_30;
+    if (false) {
+    } else {
+      break;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-nested-loops/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-nested-loops/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..241c4bb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-nested-loops/0-opt.spvasm.expected.msl
@@ -0,0 +1,80 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int zero;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float4 returnRed_(constant buf0& x_6) {
+  bool x_33 = false;
+  float4 x_34 = 0.0f;
+  float4 x_48 = 0.0f;
+  bool x_36_phi = false;
+  float4 x_51_phi = 0.0f;
+  x_36_phi = false;
+  while (true) {
+    float4 x_48_phi = 0.0f;
+    bool x_49_phi = false;
+    bool const x_36 = x_36_phi;
+    while (true) {
+      int const x_44 = x_6.zero;
+      if ((x_44 == 1)) {
+        x_33 = true;
+        x_34 = float4(1.0f, 0.0f, 0.0f, 1.0f);
+        x_48_phi = float4(1.0f, 0.0f, 0.0f, 1.0f);
+        x_49_phi = true;
+        break;
+      }
+      {
+        x_48_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        x_49_phi = false;
+        if (false) {
+        } else {
+          break;
+        }
+      }
+    }
+    x_48 = x_48_phi;
+    bool const x_49 = x_49_phi;
+    x_51_phi = x_48;
+    if (x_49) {
+      break;
+    }
+    x_33 = true;
+    x_34 = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    x_51_phi = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    break;
+    {
+      x_36_phi = false;
+    }
+  }
+  float4 const x_51 = x_51_phi;
+  return x_51;
+}
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  while (true) {
+    float4 const x_30 = returnRed_(x_6);
+    *(tint_symbol_4) = x_30;
+    if (false) {
+    } else {
+      break;
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-nested-loops/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-nested-loops/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..bc45980
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-nested-loops/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,175 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 83
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %returnRed_ "returnRed_"
+               OpName %x_33 "x_33"
+               OpName %x_34 "x_34"
+               OpName %x_48 "x_48"
+               OpName %x_36_phi "x_36_phi"
+               OpName %x_51_phi "x_51_phi"
+               OpName %x_48_phi "x_48_phi"
+               OpName %x_49_phi "x_49_phi"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+         %12 = OpTypeFunction %v4float
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %19 = OpConstantNull %bool
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %true = OpConstantTrue %bool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %48 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %49 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %void = OpTypeVoid
+         %59 = OpTypeFunction %void
+   %main_out = OpTypeStruct %v4float
+         %71 = OpTypeFunction %void %main_out
+ %returnRed_ = OpFunction %v4float None %12
+         %14 = OpLabel
+       %x_33 = OpVariable %_ptr_Function_bool Function %19
+       %x_34 = OpVariable %_ptr_Function_v4float Function %9
+       %x_48 = OpVariable %_ptr_Function_v4float Function %9
+   %x_36_phi = OpVariable %_ptr_Function_bool Function %19
+   %x_51_phi = OpVariable %_ptr_Function_v4float Function %9
+   %x_48_phi = OpVariable %_ptr_Function_v4float Function %9
+   %x_49_phi = OpVariable %_ptr_Function_bool Function %19
+               OpStore %x_33 %false
+               OpStore %x_36_phi %false
+               OpBranch %25
+         %25 = OpLabel
+               OpLoopMerge %26 %27 None
+               OpBranch %28
+         %28 = OpLabel
+         %31 = OpLoad %bool %x_36_phi
+               OpBranch %32
+         %32 = OpLabel
+               OpLoopMerge %33 %34 None
+               OpBranch %35
+         %35 = OpLabel
+         %39 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0
+         %40 = OpLoad %int %39
+         %42 = OpIEqual %bool %40 %int_1
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %43
+         %44 = OpLabel
+               OpStore %x_33 %true
+               OpStore %x_34 %48
+               OpStore %x_48_phi %48
+               OpStore %x_49_phi %true
+               OpBranch %33
+         %43 = OpLabel
+               OpBranch %34
+         %34 = OpLabel
+               OpStore %x_48_phi %49
+               OpStore %x_49_phi %false
+               OpSelectionMerge %50 None
+               OpBranchConditional %false %51 %52
+         %51 = OpLabel
+               OpBranch %50
+         %52 = OpLabel
+               OpBranch %33
+         %50 = OpLabel
+               OpBranch %32
+         %33 = OpLabel
+         %53 = OpLoad %v4float %x_48_phi
+               OpStore %x_48 %53
+         %54 = OpLoad %bool %x_49_phi
+         %55 = OpLoad %v4float %x_48
+               OpStore %x_51_phi %55
+               OpSelectionMerge %56 None
+               OpBranchConditional %54 %57 %56
+         %57 = OpLabel
+               OpBranch %26
+         %56 = OpLabel
+               OpStore %x_33 %true
+               OpStore %x_34 %48
+               OpStore %x_51_phi %48
+               OpBranch %26
+         %27 = OpLabel
+               OpStore %x_36_phi %false
+               OpBranch %25
+         %26 = OpLabel
+         %58 = OpLoad %v4float %x_51_phi
+               OpReturnValue %58
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %59
+         %62 = OpLabel
+               OpBranch %63
+         %63 = OpLabel
+               OpLoopMerge %64 %65 None
+               OpBranch %66
+         %66 = OpLabel
+         %67 = OpFunctionCall %v4float %returnRed_
+               OpStore %x_GLF_color %67
+               OpSelectionMerge %68 None
+               OpBranchConditional %false %69 %70
+         %69 = OpLabel
+               OpBranch %68
+         %70 = OpLabel
+               OpBranch %64
+         %68 = OpLabel
+               OpBranch %65
+         %65 = OpLabel
+               OpBranch %63
+         %64 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %71
+%tint_symbol = OpFunctionParameter %main_out
+         %75 = OpLabel
+         %76 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %76
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %59
+         %78 = OpLabel
+         %79 = OpFunctionCall %void %main_1
+         %81 = OpLoad %v4float %x_GLF_color
+         %82 = OpCompositeConstruct %main_out %81
+         %80 = OpFunctionCall %void %tint_symbol_2 %82
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 34[%34] is not post dominated by the back-edge block 50[%50]
+  %50 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-nested-loops/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-nested-loops/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..c24e92c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-nested-loops/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,80 @@
+[[block]]
+struct buf0 {
+  zero : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn returnRed_() -> vec4<f32> {
+  var x_33 : bool = false;
+  var x_34 : vec4<f32>;
+  var x_48 : vec4<f32>;
+  var x_36_phi : bool;
+  var x_51_phi : vec4<f32>;
+  x_36_phi = false;
+  loop {
+    var x_48_phi : vec4<f32>;
+    var x_49_phi : bool;
+    let x_36 : bool = x_36_phi;
+    loop {
+      let x_44 : i32 = x_6.zero;
+      if ((x_44 == 1)) {
+        x_33 = true;
+        x_34 = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+        x_48_phi = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+        x_49_phi = true;
+        break;
+      }
+
+      continuing {
+        x_48_phi = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+        x_49_phi = false;
+        if (false) {
+        } else {
+          break;
+        }
+      }
+    }
+    x_48 = x_48_phi;
+    let x_49 : bool = x_49_phi;
+    x_51_phi = x_48;
+    if (x_49) {
+      break;
+    }
+    x_33 = true;
+    x_34 = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    x_51_phi = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    break;
+
+    continuing {
+      x_36_phi = false;
+    }
+  }
+  let x_51 : vec4<f32> = x_51_phi;
+  return x_51;
+}
+
+fn main_1() {
+  loop {
+    let x_30 : vec4<f32> = returnRed_();
+    x_GLF_color = x_30;
+    if (false) {
+    } else {
+      break;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-nested-loops/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-nested-loops/0-opt.wgsl
new file mode 100644
index 0000000..c24e92c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-nested-loops/0-opt.wgsl
@@ -0,0 +1,80 @@
+[[block]]
+struct buf0 {
+  zero : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn returnRed_() -> vec4<f32> {
+  var x_33 : bool = false;
+  var x_34 : vec4<f32>;
+  var x_48 : vec4<f32>;
+  var x_36_phi : bool;
+  var x_51_phi : vec4<f32>;
+  x_36_phi = false;
+  loop {
+    var x_48_phi : vec4<f32>;
+    var x_49_phi : bool;
+    let x_36 : bool = x_36_phi;
+    loop {
+      let x_44 : i32 = x_6.zero;
+      if ((x_44 == 1)) {
+        x_33 = true;
+        x_34 = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+        x_48_phi = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+        x_49_phi = true;
+        break;
+      }
+
+      continuing {
+        x_48_phi = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+        x_49_phi = false;
+        if (false) {
+        } else {
+          break;
+        }
+      }
+    }
+    x_48 = x_48_phi;
+    let x_49 : bool = x_49_phi;
+    x_51_phi = x_48;
+    if (x_49) {
+      break;
+    }
+    x_33 = true;
+    x_34 = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    x_51_phi = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    break;
+
+    continuing {
+      x_36_phi = false;
+    }
+  }
+  let x_51 : vec4<f32> = x_51_phi;
+  return x_51;
+}
+
+fn main_1() {
+  loop {
+    let x_30 : vec4<f32> = returnRed_();
+    x_GLF_color = x_30;
+    if (false) {
+    } else {
+      break;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-nested-loops/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-nested-loops/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..e3f6afa
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-nested-loops/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,76 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float4 returnRed_() {
+  bool x_33 = false;
+  float4 x_34 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 x_48 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  bool x_36_phi = false;
+  float4 x_51_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  x_36_phi = false;
+  while (true) {
+    float4 x_48_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    bool x_49_phi = false;
+    const bool x_36 = x_36_phi;
+    while (true) {
+      const int x_44 = asint(x_6[0].x);
+      if ((x_44 == 1)) {
+        x_33 = true;
+        x_34 = float4(1.0f, 0.0f, 0.0f, 1.0f);
+        x_48_phi = float4(1.0f, 0.0f, 0.0f, 1.0f);
+        x_49_phi = true;
+        break;
+      }
+      {
+        x_48_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        x_49_phi = false;
+        if (false) {
+        } else {
+          break;
+        }
+      }
+    }
+    x_48 = x_48_phi;
+    const bool x_49 = x_49_phi;
+    x_51_phi = x_48;
+    if (x_49) {
+      break;
+    }
+    x_33 = true;
+    x_34 = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    x_51_phi = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    break;
+    {
+      x_36_phi = false;
+    }
+  }
+  return x_51_phi;
+}
+
+void main_1() {
+  while (true) {
+    const float4 x_30 = returnRed_();
+    x_GLF_color = x_30;
+    if (false) {
+    } else {
+      break;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-nested-loops/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-nested-loops/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..241c4bb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-nested-loops/0-opt.wgsl.expected.msl
@@ -0,0 +1,80 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int zero;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float4 returnRed_(constant buf0& x_6) {
+  bool x_33 = false;
+  float4 x_34 = 0.0f;
+  float4 x_48 = 0.0f;
+  bool x_36_phi = false;
+  float4 x_51_phi = 0.0f;
+  x_36_phi = false;
+  while (true) {
+    float4 x_48_phi = 0.0f;
+    bool x_49_phi = false;
+    bool const x_36 = x_36_phi;
+    while (true) {
+      int const x_44 = x_6.zero;
+      if ((x_44 == 1)) {
+        x_33 = true;
+        x_34 = float4(1.0f, 0.0f, 0.0f, 1.0f);
+        x_48_phi = float4(1.0f, 0.0f, 0.0f, 1.0f);
+        x_49_phi = true;
+        break;
+      }
+      {
+        x_48_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        x_49_phi = false;
+        if (false) {
+        } else {
+          break;
+        }
+      }
+    }
+    x_48 = x_48_phi;
+    bool const x_49 = x_49_phi;
+    x_51_phi = x_48;
+    if (x_49) {
+      break;
+    }
+    x_33 = true;
+    x_34 = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    x_51_phi = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    break;
+    {
+      x_36_phi = false;
+    }
+  }
+  float4 const x_51 = x_51_phi;
+  return x_51;
+}
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  while (true) {
+    float4 const x_30 = returnRed_(x_6);
+    *(tint_symbol_4) = x_30;
+    if (false) {
+    } else {
+      break;
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-nested-loops/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-nested-loops/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..bc45980
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-nested-loops/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,175 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 83
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %returnRed_ "returnRed_"
+               OpName %x_33 "x_33"
+               OpName %x_34 "x_34"
+               OpName %x_48 "x_48"
+               OpName %x_36_phi "x_36_phi"
+               OpName %x_51_phi "x_51_phi"
+               OpName %x_48_phi "x_48_phi"
+               OpName %x_49_phi "x_49_phi"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+         %12 = OpTypeFunction %v4float
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %19 = OpConstantNull %bool
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %true = OpConstantTrue %bool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %48 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %49 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %void = OpTypeVoid
+         %59 = OpTypeFunction %void
+   %main_out = OpTypeStruct %v4float
+         %71 = OpTypeFunction %void %main_out
+ %returnRed_ = OpFunction %v4float None %12
+         %14 = OpLabel
+       %x_33 = OpVariable %_ptr_Function_bool Function %19
+       %x_34 = OpVariable %_ptr_Function_v4float Function %9
+       %x_48 = OpVariable %_ptr_Function_v4float Function %9
+   %x_36_phi = OpVariable %_ptr_Function_bool Function %19
+   %x_51_phi = OpVariable %_ptr_Function_v4float Function %9
+   %x_48_phi = OpVariable %_ptr_Function_v4float Function %9
+   %x_49_phi = OpVariable %_ptr_Function_bool Function %19
+               OpStore %x_33 %false
+               OpStore %x_36_phi %false
+               OpBranch %25
+         %25 = OpLabel
+               OpLoopMerge %26 %27 None
+               OpBranch %28
+         %28 = OpLabel
+         %31 = OpLoad %bool %x_36_phi
+               OpBranch %32
+         %32 = OpLabel
+               OpLoopMerge %33 %34 None
+               OpBranch %35
+         %35 = OpLabel
+         %39 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0
+         %40 = OpLoad %int %39
+         %42 = OpIEqual %bool %40 %int_1
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %43
+         %44 = OpLabel
+               OpStore %x_33 %true
+               OpStore %x_34 %48
+               OpStore %x_48_phi %48
+               OpStore %x_49_phi %true
+               OpBranch %33
+         %43 = OpLabel
+               OpBranch %34
+         %34 = OpLabel
+               OpStore %x_48_phi %49
+               OpStore %x_49_phi %false
+               OpSelectionMerge %50 None
+               OpBranchConditional %false %51 %52
+         %51 = OpLabel
+               OpBranch %50
+         %52 = OpLabel
+               OpBranch %33
+         %50 = OpLabel
+               OpBranch %32
+         %33 = OpLabel
+         %53 = OpLoad %v4float %x_48_phi
+               OpStore %x_48 %53
+         %54 = OpLoad %bool %x_49_phi
+         %55 = OpLoad %v4float %x_48
+               OpStore %x_51_phi %55
+               OpSelectionMerge %56 None
+               OpBranchConditional %54 %57 %56
+         %57 = OpLabel
+               OpBranch %26
+         %56 = OpLabel
+               OpStore %x_33 %true
+               OpStore %x_34 %48
+               OpStore %x_51_phi %48
+               OpBranch %26
+         %27 = OpLabel
+               OpStore %x_36_phi %false
+               OpBranch %25
+         %26 = OpLabel
+         %58 = OpLoad %v4float %x_51_phi
+               OpReturnValue %58
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %59
+         %62 = OpLabel
+               OpBranch %63
+         %63 = OpLabel
+               OpLoopMerge %64 %65 None
+               OpBranch %66
+         %66 = OpLabel
+         %67 = OpFunctionCall %v4float %returnRed_
+               OpStore %x_GLF_color %67
+               OpSelectionMerge %68 None
+               OpBranchConditional %false %69 %70
+         %69 = OpLabel
+               OpBranch %68
+         %70 = OpLabel
+               OpBranch %64
+         %68 = OpLabel
+               OpBranch %65
+         %65 = OpLabel
+               OpBranch %63
+         %64 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %71
+%tint_symbol = OpFunctionParameter %main_out
+         %75 = OpLabel
+         %76 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %76
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %59
+         %78 = OpLabel
+         %79 = OpFunctionCall %void %main_1
+         %81 = OpLoad %v4float %x_GLF_color
+         %82 = OpCompositeConstruct %main_out %81
+         %80 = OpFunctionCall %void %tint_symbol_2 %82
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 34[%34] is not post dominated by the back-edge block 50[%50]
+  %50 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-nested-loops/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-nested-loops/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..c24e92c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-nested-loops/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,80 @@
+[[block]]
+struct buf0 {
+  zero : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn returnRed_() -> vec4<f32> {
+  var x_33 : bool = false;
+  var x_34 : vec4<f32>;
+  var x_48 : vec4<f32>;
+  var x_36_phi : bool;
+  var x_51_phi : vec4<f32>;
+  x_36_phi = false;
+  loop {
+    var x_48_phi : vec4<f32>;
+    var x_49_phi : bool;
+    let x_36 : bool = x_36_phi;
+    loop {
+      let x_44 : i32 = x_6.zero;
+      if ((x_44 == 1)) {
+        x_33 = true;
+        x_34 = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+        x_48_phi = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+        x_49_phi = true;
+        break;
+      }
+
+      continuing {
+        x_48_phi = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+        x_49_phi = false;
+        if (false) {
+        } else {
+          break;
+        }
+      }
+    }
+    x_48 = x_48_phi;
+    let x_49 : bool = x_49_phi;
+    x_51_phi = x_48;
+    if (x_49) {
+      break;
+    }
+    x_33 = true;
+    x_34 = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    x_51_phi = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    break;
+
+    continuing {
+      x_36_phi = false;
+    }
+  }
+  let x_51 : vec4<f32> = x_51_phi;
+  return x_51;
+}
+
+fn main_1() {
+  loop {
+    let x_30 : vec4<f32> = returnRed_();
+    x_GLF_color = x_30;
+    if (false) {
+    } else {
+      break;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-return-in-loop/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-return-in-loop/0-opt.spvasm
new file mode 100644
index 0000000..c218332
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-return-in-loop/0-opt.spvasm
@@ -0,0 +1,84 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %func_ "func("
+               OpName %i "i"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+          %9 = OpTypeFunction %float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+     %int_10 = OpConstant %int 10
+       %bool = OpTypeBool
+      %int_5 = OpConstant %int 5
+      %int_1 = OpConstant %int 1
+      %int_8 = OpConstant %int 8
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+      %false = OpConstantFalse %bool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %23 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %7
+         %24 = OpLabel
+               OpSelectionMerge %25 None
+               OpBranchConditional %false %26 %27
+         %26 = OpLabel
+         %28 = OpFunctionCall %float %func_
+         %29 = OpCompositeConstruct %v4float %28 %28 %28 %28
+               OpStore %_GLF_color %29
+               OpBranch %25
+         %27 = OpLabel
+               OpStore %_GLF_color %23
+               OpBranch %25
+         %25 = OpLabel
+               OpReturn
+               OpFunctionEnd
+      %func_ = OpFunction %float None %9
+         %30 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+               OpStore %i %int_0
+               OpBranch %31
+         %31 = OpLabel
+               OpLoopMerge %32 %33 None
+               OpBranch %34
+         %34 = OpLabel
+         %35 = OpLoad %int %i
+         %36 = OpSLessThan %bool %35 %int_10
+               OpBranchConditional %36 %37 %32
+         %37 = OpLabel
+         %38 = OpLoad %int %i
+         %39 = OpSGreaterThan %bool %38 %int_5
+               OpSelectionMerge %40 None
+               OpBranchConditional %39 %41 %40
+         %41 = OpLabel
+         %42 = OpLoad %int %i
+         %43 = OpIAdd %int %42 %int_1
+               OpStore %i %43
+               OpBranch %40
+         %40 = OpLabel
+         %44 = OpLoad %int %i
+         %45 = OpSGreaterThan %bool %44 %int_8
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %46
+         %47 = OpLabel
+               OpReturnValue %float_0
+         %46 = OpLabel
+               OpBranch %33
+         %33 = OpLabel
+         %48 = OpLoad %int %i
+         %49 = OpIAdd %int %48 %int_1
+               OpStore %i %49
+               OpBranch %31
+         %32 = OpLabel
+               OpReturnValue %float_1
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-return-in-loop/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-return-in-loop/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..4dcae3d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-return-in-loop/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,41 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float func_() {
+  int i = 0;
+  i = 0;
+  {
+    for(; (i < 10); i = (i + 1)) {
+      if ((i > 5)) {
+        i = (i + 1);
+      }
+      if ((i > 8)) {
+        return 0.0f;
+      }
+    }
+  }
+  return 1.0f;
+}
+
+void main_1() {
+  if (false) {
+    const float x_28 = func_();
+    x_GLF_color = float4(x_28, x_28, x_28, x_28);
+  } else {
+    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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-return-in-loop/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-return-in-loop/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..5b389f3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-return-in-loop/0-opt.spvasm.expected.msl
@@ -0,0 +1,54 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float func_() {
+  int i = 0;
+  i = 0;
+  while (true) {
+    int const x_35 = i;
+    if ((x_35 < 10)) {
+    } else {
+      break;
+    }
+    int const x_38 = i;
+    if ((x_38 > 5)) {
+      int const x_42 = i;
+      i = (x_42 + 1);
+    }
+    int const x_44 = i;
+    if ((x_44 > 8)) {
+      return 0.0f;
+    }
+    {
+      int const x_48 = i;
+      i = (x_48 + 1);
+    }
+  }
+  return 1.0f;
+}
+
+void main_1(thread float4* const tint_symbol_4) {
+  if (false) {
+    float const x_28 = func_();
+    *(tint_symbol_4) = float4(x_28, x_28, x_28, x_28);
+  } else {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-return-in-loop/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-return-in-loop/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..f2a69e2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-return-in-loop/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,120 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 67
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_ "func_"
+               OpName %i "i"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+          %8 = OpTypeFunction %float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %14 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+     %int_10 = OpConstant %int 10
+       %bool = OpTypeBool
+      %int_5 = OpConstant %int 5
+      %int_1 = OpConstant %int 1
+      %int_8 = OpConstant %int 8
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+       %void = OpTypeVoid
+         %44 = OpTypeFunction %void
+      %false = OpConstantFalse %bool
+         %54 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %55 = OpTypeFunction %void %main_out
+      %func_ = OpFunction %float None %8
+         %10 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %14
+               OpStore %i %int_0
+               OpBranch %16
+         %16 = OpLabel
+               OpLoopMerge %17 %18 None
+               OpBranch %19
+         %19 = OpLabel
+         %20 = OpLoad %int %i
+         %22 = OpSLessThan %bool %20 %int_10
+               OpSelectionMerge %24 None
+               OpBranchConditional %22 %25 %26
+         %25 = OpLabel
+               OpBranch %24
+         %26 = OpLabel
+               OpBranch %17
+         %24 = OpLabel
+         %27 = OpLoad %int %i
+         %29 = OpSGreaterThan %bool %27 %int_5
+               OpSelectionMerge %30 None
+               OpBranchConditional %29 %31 %30
+         %31 = OpLabel
+         %32 = OpLoad %int %i
+         %34 = OpIAdd %int %32 %int_1
+               OpStore %i %34
+               OpBranch %30
+         %30 = OpLabel
+         %35 = OpLoad %int %i
+         %37 = OpSGreaterThan %bool %35 %int_8
+               OpSelectionMerge %38 None
+               OpBranchConditional %37 %39 %38
+         %39 = OpLabel
+               OpReturnValue %float_0
+         %38 = OpLabel
+               OpBranch %18
+         %18 = OpLabel
+         %41 = OpLoad %int %i
+         %42 = OpIAdd %int %41 %int_1
+               OpStore %i %42
+               OpBranch %16
+         %17 = OpLabel
+               OpReturnValue %float_1
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %44
+         %47 = OpLabel
+               OpSelectionMerge %49 None
+               OpBranchConditional %false %50 %51
+         %50 = OpLabel
+         %52 = OpFunctionCall %float %func_
+         %53 = OpCompositeConstruct %v4float %52 %52 %52 %52
+               OpStore %x_GLF_color %53
+               OpBranch %49
+         %51 = OpLabel
+               OpStore %x_GLF_color %54
+               OpBranch %49
+         %49 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %55
+%tint_symbol = OpFunctionParameter %main_out
+         %59 = OpLabel
+         %60 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %60
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %44
+         %62 = OpLabel
+         %63 = OpFunctionCall %void %main_1
+         %65 = OpLoad %v4float %x_GLF_color
+         %66 = OpCompositeConstruct %main_out %65
+         %64 = OpFunctionCall %void %tint_symbol_2 %66
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-return-in-loop/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-return-in-loop/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..c5a9a86
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-return-in-loop/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,49 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> f32 {
+  var i : i32;
+  i = 0;
+  loop {
+    let x_35 : i32 = i;
+    if ((x_35 < 10)) {
+    } else {
+      break;
+    }
+    let x_38 : i32 = i;
+    if ((x_38 > 5)) {
+      let x_42 : i32 = i;
+      i = (x_42 + 1);
+    }
+    let x_44 : i32 = i;
+    if ((x_44 > 8)) {
+      return 0.0;
+    }
+
+    continuing {
+      let x_48 : i32 = i;
+      i = (x_48 + 1);
+    }
+  }
+  return 1.0;
+}
+
+fn main_1() {
+  if (false) {
+    let x_28 : f32 = func_();
+    x_GLF_color = vec4<f32>(x_28, x_28, x_28, x_28);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-return-in-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-return-in-loop/0-opt.wgsl
new file mode 100644
index 0000000..c5a9a86
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-return-in-loop/0-opt.wgsl
@@ -0,0 +1,49 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> f32 {
+  var i : i32;
+  i = 0;
+  loop {
+    let x_35 : i32 = i;
+    if ((x_35 < 10)) {
+    } else {
+      break;
+    }
+    let x_38 : i32 = i;
+    if ((x_38 > 5)) {
+      let x_42 : i32 = i;
+      i = (x_42 + 1);
+    }
+    let x_44 : i32 = i;
+    if ((x_44 > 8)) {
+      return 0.0;
+    }
+
+    continuing {
+      let x_48 : i32 = i;
+      i = (x_48 + 1);
+    }
+  }
+  return 1.0;
+}
+
+fn main_1() {
+  if (false) {
+    let x_28 : f32 = func_();
+    x_GLF_color = vec4<f32>(x_28, x_28, x_28, x_28);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-return-in-loop/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-return-in-loop/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..4dcae3d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-return-in-loop/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,41 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float func_() {
+  int i = 0;
+  i = 0;
+  {
+    for(; (i < 10); i = (i + 1)) {
+      if ((i > 5)) {
+        i = (i + 1);
+      }
+      if ((i > 8)) {
+        return 0.0f;
+      }
+    }
+  }
+  return 1.0f;
+}
+
+void main_1() {
+  if (false) {
+    const float x_28 = func_();
+    x_GLF_color = float4(x_28, x_28, x_28, x_28);
+  } else {
+    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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-return-in-loop/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-return-in-loop/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..5b389f3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-return-in-loop/0-opt.wgsl.expected.msl
@@ -0,0 +1,54 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float func_() {
+  int i = 0;
+  i = 0;
+  while (true) {
+    int const x_35 = i;
+    if ((x_35 < 10)) {
+    } else {
+      break;
+    }
+    int const x_38 = i;
+    if ((x_38 > 5)) {
+      int const x_42 = i;
+      i = (x_42 + 1);
+    }
+    int const x_44 = i;
+    if ((x_44 > 8)) {
+      return 0.0f;
+    }
+    {
+      int const x_48 = i;
+      i = (x_48 + 1);
+    }
+  }
+  return 1.0f;
+}
+
+void main_1(thread float4* const tint_symbol_4) {
+  if (false) {
+    float const x_28 = func_();
+    *(tint_symbol_4) = float4(x_28, x_28, x_28, x_28);
+  } else {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-return-in-loop/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-return-in-loop/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..f2a69e2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-return-in-loop/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,120 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 67
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_ "func_"
+               OpName %i "i"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+          %8 = OpTypeFunction %float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %14 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+     %int_10 = OpConstant %int 10
+       %bool = OpTypeBool
+      %int_5 = OpConstant %int 5
+      %int_1 = OpConstant %int 1
+      %int_8 = OpConstant %int 8
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+       %void = OpTypeVoid
+         %44 = OpTypeFunction %void
+      %false = OpConstantFalse %bool
+         %54 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %55 = OpTypeFunction %void %main_out
+      %func_ = OpFunction %float None %8
+         %10 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %14
+               OpStore %i %int_0
+               OpBranch %16
+         %16 = OpLabel
+               OpLoopMerge %17 %18 None
+               OpBranch %19
+         %19 = OpLabel
+         %20 = OpLoad %int %i
+         %22 = OpSLessThan %bool %20 %int_10
+               OpSelectionMerge %24 None
+               OpBranchConditional %22 %25 %26
+         %25 = OpLabel
+               OpBranch %24
+         %26 = OpLabel
+               OpBranch %17
+         %24 = OpLabel
+         %27 = OpLoad %int %i
+         %29 = OpSGreaterThan %bool %27 %int_5
+               OpSelectionMerge %30 None
+               OpBranchConditional %29 %31 %30
+         %31 = OpLabel
+         %32 = OpLoad %int %i
+         %34 = OpIAdd %int %32 %int_1
+               OpStore %i %34
+               OpBranch %30
+         %30 = OpLabel
+         %35 = OpLoad %int %i
+         %37 = OpSGreaterThan %bool %35 %int_8
+               OpSelectionMerge %38 None
+               OpBranchConditional %37 %39 %38
+         %39 = OpLabel
+               OpReturnValue %float_0
+         %38 = OpLabel
+               OpBranch %18
+         %18 = OpLabel
+         %41 = OpLoad %int %i
+         %42 = OpIAdd %int %41 %int_1
+               OpStore %i %42
+               OpBranch %16
+         %17 = OpLabel
+               OpReturnValue %float_1
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %44
+         %47 = OpLabel
+               OpSelectionMerge %49 None
+               OpBranchConditional %false %50 %51
+         %50 = OpLabel
+         %52 = OpFunctionCall %float %func_
+         %53 = OpCompositeConstruct %v4float %52 %52 %52 %52
+               OpStore %x_GLF_color %53
+               OpBranch %49
+         %51 = OpLabel
+               OpStore %x_GLF_color %54
+               OpBranch %49
+         %49 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %55
+%tint_symbol = OpFunctionParameter %main_out
+         %59 = OpLabel
+         %60 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %60
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %44
+         %62 = OpLabel
+         %63 = OpFunctionCall %void %main_1
+         %65 = OpLoad %v4float %x_GLF_color
+         %66 = OpCompositeConstruct %main_out %65
+         %64 = OpFunctionCall %void %tint_symbol_2 %66
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-return-in-loop/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-return-in-loop/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..c5a9a86
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-return-in-loop/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,49 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> f32 {
+  var i : i32;
+  i = 0;
+  loop {
+    let x_35 : i32 = i;
+    if ((x_35 < 10)) {
+    } else {
+      break;
+    }
+    let x_38 : i32 = i;
+    if ((x_38 > 5)) {
+      let x_42 : i32 = i;
+      i = (x_42 + 1);
+    }
+    let x_44 : i32 = i;
+    if ((x_44 > 8)) {
+      return 0.0;
+    }
+
+    continuing {
+      let x_48 : i32 = i;
+      i = (x_48 + 1);
+    }
+  }
+  return 1.0;
+}
+
+fn main_1() {
+  if (false) {
+    let x_28 : f32 = func_();
+    x_GLF_color = vec4<f32>(x_28, x_28, x_28, x_28);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-unreachable-func/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-unreachable-func/0-opt.spvasm
new file mode 100644
index 0000000..7c4c765
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-unreachable-func/0-opt.spvasm
@@ -0,0 +1,76 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %func_ "func("
+               OpName %x "x"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+         %10 = OpTypeFunction %float
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_2 = OpConstant %float 2
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+   %float_12 = OpConstant %float 12
+       %bool = OpTypeBool
+     %uint_1 = OpConstant %uint 1
+   %float_13 = OpConstant %float 13
+    %float_1 = OpConstant %float 1
+      %false = OpConstantFalse %bool
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %26 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %8
+         %27 = OpLabel
+               OpSelectionMerge %28 None
+               OpBranchConditional %false %29 %30
+         %29 = OpLabel
+         %31 = OpFunctionCall %float %func_
+         %32 = OpCompositeConstruct %v4float %31 %31 %31 %31
+               OpStore %_GLF_color %32
+               OpBranch %28
+         %30 = OpLabel
+               OpStore %_GLF_color %26
+               OpBranch %28
+         %28 = OpLabel
+               OpReturn
+               OpFunctionEnd
+      %func_ = OpFunction %float None %10
+         %33 = OpLabel
+          %x = OpVariable %_ptr_Function_float Function
+               OpStore %x %float_2
+         %34 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %35 = OpLoad %float %34
+         %36 = OpFOrdEqual %bool %35 %float_12
+               OpSelectionMerge %37 None
+               OpBranchConditional %36 %38 %37
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %40 = OpLoad %float %39
+         %41 = OpFOrdEqual %bool %40 %float_13
+               OpSelectionMerge %42 None
+               OpBranchConditional %41 %43 %42
+         %43 = OpLabel
+         %44 = OpLoad %float %x
+         %45 = OpFAdd %float %44 %float_1
+               OpStore %x %45
+               OpBranch %42
+         %42 = OpLabel
+         %46 = OpLoad %float %x
+               OpReturnValue %46
+         %37 = OpLabel
+               OpReturnValue %float_1
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-unreachable-func/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-unreachable-func/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..e579458
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-unreachable-func/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,45 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float func_() {
+  float x = 0.0f;
+  x = 2.0f;
+  const float x_35 = gl_FragCoord.x;
+  if ((x_35 == 12.0f)) {
+    const float x_40 = gl_FragCoord.y;
+    if ((x_40 == 13.0f)) {
+      x = (x + 1.0f);
+    }
+    return x;
+  }
+  return 1.0f;
+}
+
+void main_1() {
+  if (false) {
+    const float x_31 = func_();
+    x_GLF_color = float4(x_31, x_31, x_31, x_31);
+  } else {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-unreachable-func/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-unreachable-func/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..019020d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-unreachable-func/0-opt.spvasm.expected.msl
@@ -0,0 +1,46 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float func_(thread float4* const tint_symbol_5) {
+  float x = 0.0f;
+  x = 2.0f;
+  float const x_35 = (*(tint_symbol_5)).x;
+  if ((x_35 == 12.0f)) {
+    float const x_40 = (*(tint_symbol_5)).y;
+    if ((x_40 == 13.0f)) {
+      float const x_44 = x;
+      x = (x_44 + 1.0f);
+    }
+    float const x_46 = x;
+    return x_46;
+  }
+  return 1.0f;
+}
+
+void main_1(thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  if (false) {
+    float const x_31 = func_(tint_symbol_6);
+    *(tint_symbol_7) = float4(x_31, x_31, x_31, x_31);
+  } else {
+    *(tint_symbol_7) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(&(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-unreachable-func/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-unreachable-func/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..eaaf448
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-unreachable-func/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,111 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 64
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %func_ "func_"
+               OpName %x "x"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+         %11 = OpTypeFunction %float
+%_ptr_Function_float = OpTypePointer Function %float
+         %16 = OpConstantNull %float
+    %float_2 = OpConstant %float 2
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+   %float_12 = OpConstant %float 12
+       %bool = OpTypeBool
+     %uint_1 = OpConstant %uint 1
+   %float_13 = OpConstant %float 13
+    %float_1 = OpConstant %float 1
+       %void = OpTypeVoid
+         %39 = OpTypeFunction %void
+      %false = OpConstantFalse %bool
+    %float_0 = OpConstant %float 0
+         %50 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %51 = OpTypeFunction %void %main_out
+      %func_ = OpFunction %float None %11
+         %13 = OpLabel
+          %x = OpVariable %_ptr_Function_float Function %16
+               OpStore %x %float_2
+         %21 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %22 = OpLoad %float %21
+         %24 = OpFOrdEqual %bool %22 %float_12
+               OpSelectionMerge %26 None
+               OpBranchConditional %24 %27 %26
+         %27 = OpLabel
+         %29 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %30 = OpLoad %float %29
+         %32 = OpFOrdEqual %bool %30 %float_13
+               OpSelectionMerge %33 None
+               OpBranchConditional %32 %34 %33
+         %34 = OpLabel
+         %35 = OpLoad %float %x
+         %37 = OpFAdd %float %35 %float_1
+               OpStore %x %37
+               OpBranch %33
+         %33 = OpLabel
+         %38 = OpLoad %float %x
+               OpReturnValue %38
+         %26 = OpLabel
+               OpReturnValue %float_1
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %39
+         %42 = OpLabel
+               OpSelectionMerge %44 None
+               OpBranchConditional %false %45 %46
+         %45 = OpLabel
+         %47 = OpFunctionCall %float %func_
+         %48 = OpCompositeConstruct %v4float %47 %47 %47 %47
+               OpStore %x_GLF_color %48
+               OpBranch %44
+         %46 = OpLabel
+               OpStore %x_GLF_color %50
+               OpBranch %44
+         %44 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %51
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %55 = OpLabel
+         %56 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %56
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %39
+         %58 = OpLabel
+         %59 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %59
+         %60 = OpFunctionCall %void %main_1
+         %62 = OpLoad %v4float %x_GLF_color
+         %63 = OpCompositeConstruct %main_out %62
+         %61 = OpFunctionCall %void %tint_symbol_3 %63
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-unreachable-func/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-unreachable-func/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..cf1481a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-unreachable-func/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,41 @@
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> f32 {
+  var x : f32;
+  x = 2.0;
+  let x_35 : f32 = gl_FragCoord.x;
+  if ((x_35 == 12.0)) {
+    let x_40 : f32 = gl_FragCoord.y;
+    if ((x_40 == 13.0)) {
+      let x_44 : f32 = x;
+      x = (x_44 + 1.0);
+    }
+    let x_46 : f32 = x;
+    return x_46;
+  }
+  return 1.0;
+}
+
+fn main_1() {
+  if (false) {
+    let x_31 : f32 = func_();
+    x_GLF_color = vec4<f32>(x_31, x_31, x_31, x_31);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-unreachable-func/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-unreachable-func/0-opt.wgsl
new file mode 100644
index 0000000..cf1481a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-unreachable-func/0-opt.wgsl
@@ -0,0 +1,41 @@
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> f32 {
+  var x : f32;
+  x = 2.0;
+  let x_35 : f32 = gl_FragCoord.x;
+  if ((x_35 == 12.0)) {
+    let x_40 : f32 = gl_FragCoord.y;
+    if ((x_40 == 13.0)) {
+      let x_44 : f32 = x;
+      x = (x_44 + 1.0);
+    }
+    let x_46 : f32 = x;
+    return x_46;
+  }
+  return 1.0;
+}
+
+fn main_1() {
+  if (false) {
+    let x_31 : f32 = func_();
+    x_GLF_color = vec4<f32>(x_31, x_31, x_31, x_31);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-unreachable-func/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-unreachable-func/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..e579458
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-unreachable-func/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,45 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float func_() {
+  float x = 0.0f;
+  x = 2.0f;
+  const float x_35 = gl_FragCoord.x;
+  if ((x_35 == 12.0f)) {
+    const float x_40 = gl_FragCoord.y;
+    if ((x_40 == 13.0f)) {
+      x = (x + 1.0f);
+    }
+    return x;
+  }
+  return 1.0f;
+}
+
+void main_1() {
+  if (false) {
+    const float x_31 = func_();
+    x_GLF_color = float4(x_31, x_31, x_31, x_31);
+  } else {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-unreachable-func/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-unreachable-func/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..019020d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-unreachable-func/0-opt.wgsl.expected.msl
@@ -0,0 +1,46 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float func_(thread float4* const tint_symbol_5) {
+  float x = 0.0f;
+  x = 2.0f;
+  float const x_35 = (*(tint_symbol_5)).x;
+  if ((x_35 == 12.0f)) {
+    float const x_40 = (*(tint_symbol_5)).y;
+    if ((x_40 == 13.0f)) {
+      float const x_44 = x;
+      x = (x_44 + 1.0f);
+    }
+    float const x_46 = x;
+    return x_46;
+  }
+  return 1.0f;
+}
+
+void main_1(thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  if (false) {
+    float const x_31 = func_(tint_symbol_6);
+    *(tint_symbol_7) = float4(x_31, x_31, x_31, x_31);
+  } else {
+    *(tint_symbol_7) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(&(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-unreachable-func/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-unreachable-func/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..eaaf448
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-unreachable-func/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,111 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 64
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %func_ "func_"
+               OpName %x "x"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+         %11 = OpTypeFunction %float
+%_ptr_Function_float = OpTypePointer Function %float
+         %16 = OpConstantNull %float
+    %float_2 = OpConstant %float 2
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+   %float_12 = OpConstant %float 12
+       %bool = OpTypeBool
+     %uint_1 = OpConstant %uint 1
+   %float_13 = OpConstant %float 13
+    %float_1 = OpConstant %float 1
+       %void = OpTypeVoid
+         %39 = OpTypeFunction %void
+      %false = OpConstantFalse %bool
+    %float_0 = OpConstant %float 0
+         %50 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %51 = OpTypeFunction %void %main_out
+      %func_ = OpFunction %float None %11
+         %13 = OpLabel
+          %x = OpVariable %_ptr_Function_float Function %16
+               OpStore %x %float_2
+         %21 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %22 = OpLoad %float %21
+         %24 = OpFOrdEqual %bool %22 %float_12
+               OpSelectionMerge %26 None
+               OpBranchConditional %24 %27 %26
+         %27 = OpLabel
+         %29 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %30 = OpLoad %float %29
+         %32 = OpFOrdEqual %bool %30 %float_13
+               OpSelectionMerge %33 None
+               OpBranchConditional %32 %34 %33
+         %34 = OpLabel
+         %35 = OpLoad %float %x
+         %37 = OpFAdd %float %35 %float_1
+               OpStore %x %37
+               OpBranch %33
+         %33 = OpLabel
+         %38 = OpLoad %float %x
+               OpReturnValue %38
+         %26 = OpLabel
+               OpReturnValue %float_1
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %39
+         %42 = OpLabel
+               OpSelectionMerge %44 None
+               OpBranchConditional %false %45 %46
+         %45 = OpLabel
+         %47 = OpFunctionCall %float %func_
+         %48 = OpCompositeConstruct %v4float %47 %47 %47 %47
+               OpStore %x_GLF_color %48
+               OpBranch %44
+         %46 = OpLabel
+               OpStore %x_GLF_color %50
+               OpBranch %44
+         %44 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %51
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %55 = OpLabel
+         %56 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %56
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %39
+         %58 = OpLabel
+         %59 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %59
+         %60 = OpFunctionCall %void %main_1
+         %62 = OpLoad %v4float %x_GLF_color
+         %63 = OpCompositeConstruct %main_out %62
+         %61 = OpFunctionCall %void %tint_symbol_3 %63
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-unreachable-func/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-unreachable-func/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..cf1481a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inline-pass-unreachable-func/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,41 @@
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> f32 {
+  var x : f32;
+  x = 2.0;
+  let x_35 : f32 = gl_FragCoord.x;
+  if ((x_35 == 12.0)) {
+    let x_40 : f32 = gl_FragCoord.y;
+    if ((x_40 == 13.0)) {
+      let x_44 : f32 = x;
+      x = (x_44 + 1.0);
+    }
+    let x_46 : f32 = x;
+    return x_46;
+  }
+  return 1.0;
+}
+
+fn main_1() {
+  if (false) {
+    let x_31 : f32 = func_();
+    x_GLF_color = vec4<f32>(x_31, x_31, x_31, x_31);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-increase-negative/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-increase-negative/0-opt.spvasm
new file mode 100644
index 0000000..fa863d8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-increase-negative/0-opt.spvasm
@@ -0,0 +1,152 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %i "i"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %arr "arr"
+               OpName %a "a"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+%_ptr_Function__arr_int_uint_2 = OpTypePointer Function %_arr_int_uint_2
+      %int_1 = OpConstant %int 1
+     %int_n1 = OpConstant %int -1
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %15
+         %38 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+        %arr = OpVariable %_ptr_Function__arr_int_uint_2 Function
+          %a = OpVariable %_ptr_Function_int Function
+         %39 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %40 = OpLoad %int %39
+               OpStore %i %40
+               OpBranch %41
+         %41 = OpLabel
+               OpLoopMerge %42 %43 None
+               OpBranch %44
+         %44 = OpLabel
+         %45 = OpLoad %int %i
+         %46 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %47 = OpLoad %int %46
+         %48 = OpSLessThan %bool %45 %47
+               OpBranchConditional %48 %49 %42
+         %49 = OpLabel
+         %50 = OpLoad %int %i
+         %51 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %52 = OpLoad %int %51
+         %53 = OpAccessChain %_ptr_Function_int %arr %50
+               OpStore %53 %52
+               OpBranch %43
+         %43 = OpLabel
+         %54 = OpLoad %int %i
+         %55 = OpIAdd %int %54 %int_1
+               OpStore %i %55
+               OpBranch %41
+         %42 = OpLabel
+               OpStore %a %int_n1
+         %56 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %57 = OpLoad %float %56
+         %58 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %59 = OpLoad %float %58
+         %60 = OpFOrdLessThan %bool %57 %59
+         %61 = OpLogicalNot %bool %60
+               OpSelectionMerge %62 None
+               OpBranchConditional %61 %63 %62
+         %63 = OpLabel
+         %64 = OpLoad %int %a
+         %65 = OpIAdd %int %64 %int_1
+               OpStore %a %65
+         %66 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %67 = OpLoad %int %66
+         %68 = OpAccessChain %_ptr_Function_int %arr %65
+               OpStore %68 %67
+               OpBranch %62
+         %62 = OpLabel
+         %69 = OpLoad %int %a
+         %70 = OpIAdd %int %69 %int_1
+               OpStore %a %70
+         %71 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %72 = OpLoad %int %71
+         %73 = OpAccessChain %_ptr_Function_int %arr %70
+               OpStore %73 %72
+         %74 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %75 = OpLoad %int %74
+         %76 = OpAccessChain %_ptr_Function_int %arr %75
+         %77 = OpLoad %int %76
+         %78 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %79 = OpLoad %int %78
+         %80 = OpIEqual %bool %77 %79
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %83
+         %82 = OpLabel
+         %84 = OpLoad %int %a
+         %85 = OpConvertSToF %float %84
+         %86 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %87 = OpLoad %int %86
+         %88 = OpConvertSToF %float %87
+         %89 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %90 = OpLoad %int %89
+         %91 = OpConvertSToF %float %90
+         %92 = OpLoad %int %a
+         %93 = OpConvertSToF %float %92
+         %94 = OpCompositeConstruct %v4float %85 %88 %91 %93
+               OpStore %_GLF_color %94
+               OpBranch %81
+         %83 = OpLabel
+         %95 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %96 = OpLoad %int %95
+         %97 = OpConvertSToF %float %96
+         %98 = OpCompositeConstruct %v4float %97 %97 %97 %97
+               OpStore %_GLF_color %98
+               OpBranch %81
+         %81 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-increase-negative/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-increase-negative/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..489e5a1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-increase-negative/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,83 @@
+cbuffer cbuffer_x_7 : register(b1, space0) {
+  uint4 x_7[3];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_11 : register(b0, space0) {
+  uint4 x_11[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int i = 0;
+  int arr[2] = (int[2])0;
+  int a = 0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_40 = asint(x_7[scalar_offset / 4][scalar_offset % 4]);
+  i = x_40;
+  while (true) {
+    const int x_45 = i;
+    const int x_47 = asint(x_7[2].x);
+    if ((x_45 < x_47)) {
+    } else {
+      break;
+    }
+    const int x_50 = i;
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_52 = asint(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    arr[x_50] = x_52;
+    {
+      i = (i + 1);
+    }
+  }
+  a = -1;
+  const float x_57 = gl_FragCoord.y;
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const float x_59 = asfloat(x_11[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  if (!((x_57 < x_59))) {
+    const int x_65 = (a + 1);
+    a = x_65;
+    const int x_67 = asint(x_7[1].x);
+    arr[x_65] = x_67;
+  }
+  const int x_70 = (a + 1);
+  a = x_70;
+  const int x_72 = asint(x_7[2].x);
+  arr[x_70] = x_72;
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const int x_75 = asint(x_7[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  const int x_77 = arr[x_75];
+  const int x_79 = asint(x_7[1].x);
+  if ((x_77 == x_79)) {
+    const int x_84 = a;
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_87 = asint(x_7[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const int x_90 = asint(x_7[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    x_GLF_color = float4(float(x_84), float(x_87), float(x_90), float(a));
+  } else {
+    const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+    const int x_96 = asint(x_7[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+    const float x_97 = float(x_96);
+    x_GLF_color = float4(x_97, x_97, x_97, x_97);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-increase-negative/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-increase-negative/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..26ba969
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-increase-negative/0-opt.spvasm.expected.msl
@@ -0,0 +1,96 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct tint_array_wrapper_2 {
+  int arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_7, constant buf0& x_11, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int i = 0;
+  tint_array_wrapper_2 arr = {};
+  int a = 0;
+  int const x_40 = x_7.x_GLF_uniform_int_values.arr[0].el;
+  i = x_40;
+  while (true) {
+    int const x_45 = i;
+    int const x_47 = x_7.x_GLF_uniform_int_values.arr[2].el;
+    if ((x_45 < x_47)) {
+    } else {
+      break;
+    }
+    int const x_50 = i;
+    int const x_52 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    arr.arr[x_50] = x_52;
+    {
+      int const x_54 = i;
+      i = (x_54 + 1);
+    }
+  }
+  a = -1;
+  float const x_57 = (*(tint_symbol_5)).y;
+  float const x_59 = x_11.x_GLF_uniform_float_values.arr[0].el;
+  if (!((x_57 < x_59))) {
+    int const x_64 = a;
+    int const x_65 = (x_64 + 1);
+    a = x_65;
+    int const x_67 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    arr.arr[x_65] = x_67;
+  }
+  int const x_69 = a;
+  int const x_70 = (x_69 + 1);
+  a = x_70;
+  int const x_72 = x_7.x_GLF_uniform_int_values.arr[2].el;
+  arr.arr[x_70] = x_72;
+  int const x_75 = x_7.x_GLF_uniform_int_values.arr[0].el;
+  int const x_77 = arr.arr[x_75];
+  int const x_79 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_77 == x_79)) {
+    int const x_84 = a;
+    int const x_87 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_90 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_92 = a;
+    *(tint_symbol_6) = float4(float(x_84), float(x_87), float(x_90), float(x_92));
+  } else {
+    int const x_96 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    float const x_97 = float(x_96);
+    *(tint_symbol_6) = float4(x_97, x_97, x_97, x_97);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf1& x_7 [[buffer(1)]], constant buf0& x_11 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_7, x_11, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-increase-negative/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-increase-negative/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..e953d6b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-increase-negative/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,197 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 120
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_11 "x_11"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %arr "arr"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_11 NonWritable
+               OpDecorate %x_11 DescriptorSet 0
+               OpDecorate %x_11 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_7 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %12
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_11 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpConstantNull %int
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+%_ptr_Function__arr_int_uint_2 = OpTypePointer Function %_arr_int_uint_2
+         %34 = OpConstantNull %_arr_int_uint_2
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+     %int_n1 = OpConstant %int -1
+%_ptr_Private_float = OpTypePointer Private %float
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+   %main_out = OpTypeStruct %v4float
+        %107 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %23
+         %26 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %29
+        %arr = OpVariable %_ptr_Function__arr_int_uint_2 Function %34
+          %a = OpVariable %_ptr_Function_int Function %29
+         %39 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %40 = OpLoad %int %39
+               OpStore %i %40
+               OpBranch %41
+         %41 = OpLabel
+               OpLoopMerge %42 %43 None
+               OpBranch %44
+         %44 = OpLabel
+         %45 = OpLoad %int %i
+         %47 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %48 = OpLoad %int %47
+         %49 = OpSLessThan %bool %45 %48
+               OpSelectionMerge %51 None
+               OpBranchConditional %49 %52 %53
+         %52 = OpLabel
+               OpBranch %51
+         %53 = OpLabel
+               OpBranch %42
+         %51 = OpLabel
+         %54 = OpLoad %int %i
+         %55 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %56 = OpLoad %int %55
+         %57 = OpAccessChain %_ptr_Function_int %arr %54
+               OpStore %57 %56
+               OpBranch %43
+         %43 = OpLabel
+         %58 = OpLoad %int %i
+         %60 = OpIAdd %int %58 %int_1
+               OpStore %i %60
+               OpBranch %41
+         %42 = OpLabel
+               OpStore %a %int_n1
+         %63 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %64 = OpLoad %float %63
+         %66 = OpAccessChain %_ptr_Uniform_float %x_11 %uint_0 %int_0
+         %67 = OpLoad %float %66
+         %69 = OpFOrdLessThan %bool %64 %67
+         %68 = OpLogicalNot %bool %69
+               OpSelectionMerge %70 None
+               OpBranchConditional %68 %71 %70
+         %71 = OpLabel
+         %72 = OpLoad %int %a
+         %73 = OpIAdd %int %72 %int_1
+               OpStore %a %73
+         %74 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %75 = OpLoad %int %74
+         %76 = OpAccessChain %_ptr_Function_int %arr %73
+               OpStore %76 %75
+               OpBranch %70
+         %70 = OpLabel
+         %77 = OpLoad %int %a
+         %78 = OpIAdd %int %77 %int_1
+               OpStore %a %78
+         %79 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %80 = OpLoad %int %79
+         %81 = OpAccessChain %_ptr_Function_int %arr %78
+               OpStore %81 %80
+         %82 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %83 = OpLoad %int %82
+         %84 = OpAccessChain %_ptr_Function_int %arr %83
+         %85 = OpLoad %int %84
+         %86 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %87 = OpLoad %int %86
+         %88 = OpIEqual %bool %85 %87
+               OpSelectionMerge %89 None
+               OpBranchConditional %88 %90 %91
+         %90 = OpLabel
+         %92 = OpLoad %int %a
+         %93 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %94 = OpLoad %int %93
+         %95 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %96 = OpLoad %int %95
+         %97 = OpLoad %int %a
+         %98 = OpConvertSToF %float %92
+         %99 = OpConvertSToF %float %94
+        %100 = OpConvertSToF %float %96
+        %101 = OpConvertSToF %float %97
+        %102 = OpCompositeConstruct %v4float %98 %99 %100 %101
+               OpStore %x_GLF_color %102
+               OpBranch %89
+         %91 = OpLabel
+        %103 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+        %104 = OpLoad %int %103
+        %105 = OpConvertSToF %float %104
+        %106 = OpCompositeConstruct %v4float %105 %105 %105 %105
+               OpStore %x_GLF_color %106
+               OpBranch %89
+         %89 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %107
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %111 = OpLabel
+        %112 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %112
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %23
+        %114 = OpLabel
+        %115 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %115
+        %116 = OpFunctionCall %void %main_1
+        %118 = OpLoad %v4float %x_GLF_color
+        %119 = OpCompositeConstruct %main_out %118
+        %117 = OpFunctionCall %void %tint_symbol_3 %119
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-increase-negative/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-increase-negative/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..afe4b0e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-increase-negative/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,87 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_11 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  var arr : array<i32, 2>;
+  var a : i32;
+  let x_40 : i32 = x_7.x_GLF_uniform_int_values[0];
+  i = x_40;
+  loop {
+    let x_45 : i32 = i;
+    let x_47 : i32 = x_7.x_GLF_uniform_int_values[2];
+    if ((x_45 < x_47)) {
+    } else {
+      break;
+    }
+    let x_50 : i32 = i;
+    let x_52 : i32 = x_7.x_GLF_uniform_int_values[0];
+    arr[x_50] = x_52;
+
+    continuing {
+      let x_54 : i32 = i;
+      i = (x_54 + 1);
+    }
+  }
+  a = -1;
+  let x_57 : f32 = gl_FragCoord.y;
+  let x_59 : f32 = x_11.x_GLF_uniform_float_values[0];
+  if (!((x_57 < x_59))) {
+    let x_64 : i32 = a;
+    let x_65 : i32 = (x_64 + 1);
+    a = x_65;
+    let x_67 : i32 = x_7.x_GLF_uniform_int_values[1];
+    arr[x_65] = x_67;
+  }
+  let x_69 : i32 = a;
+  let x_70 : i32 = (x_69 + 1);
+  a = x_70;
+  let x_72 : i32 = x_7.x_GLF_uniform_int_values[2];
+  arr[x_70] = x_72;
+  let x_75 : i32 = x_7.x_GLF_uniform_int_values[0];
+  let x_77 : i32 = arr[x_75];
+  let x_79 : i32 = x_7.x_GLF_uniform_int_values[1];
+  if ((x_77 == x_79)) {
+    let x_84 : i32 = a;
+    let x_87 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_90 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_92 : i32 = a;
+    x_GLF_color = vec4<f32>(f32(x_84), f32(x_87), f32(x_90), f32(x_92));
+  } else {
+    let x_96 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_97 : f32 = f32(x_96);
+    x_GLF_color = vec4<f32>(x_97, x_97, x_97, x_97);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-increase-negative/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-increase-negative/0-opt.wgsl
new file mode 100644
index 0000000..afe4b0e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-increase-negative/0-opt.wgsl
@@ -0,0 +1,87 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_11 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  var arr : array<i32, 2>;
+  var a : i32;
+  let x_40 : i32 = x_7.x_GLF_uniform_int_values[0];
+  i = x_40;
+  loop {
+    let x_45 : i32 = i;
+    let x_47 : i32 = x_7.x_GLF_uniform_int_values[2];
+    if ((x_45 < x_47)) {
+    } else {
+      break;
+    }
+    let x_50 : i32 = i;
+    let x_52 : i32 = x_7.x_GLF_uniform_int_values[0];
+    arr[x_50] = x_52;
+
+    continuing {
+      let x_54 : i32 = i;
+      i = (x_54 + 1);
+    }
+  }
+  a = -1;
+  let x_57 : f32 = gl_FragCoord.y;
+  let x_59 : f32 = x_11.x_GLF_uniform_float_values[0];
+  if (!((x_57 < x_59))) {
+    let x_64 : i32 = a;
+    let x_65 : i32 = (x_64 + 1);
+    a = x_65;
+    let x_67 : i32 = x_7.x_GLF_uniform_int_values[1];
+    arr[x_65] = x_67;
+  }
+  let x_69 : i32 = a;
+  let x_70 : i32 = (x_69 + 1);
+  a = x_70;
+  let x_72 : i32 = x_7.x_GLF_uniform_int_values[2];
+  arr[x_70] = x_72;
+  let x_75 : i32 = x_7.x_GLF_uniform_int_values[0];
+  let x_77 : i32 = arr[x_75];
+  let x_79 : i32 = x_7.x_GLF_uniform_int_values[1];
+  if ((x_77 == x_79)) {
+    let x_84 : i32 = a;
+    let x_87 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_90 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_92 : i32 = a;
+    x_GLF_color = vec4<f32>(f32(x_84), f32(x_87), f32(x_90), f32(x_92));
+  } else {
+    let x_96 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_97 : f32 = f32(x_96);
+    x_GLF_color = vec4<f32>(x_97, x_97, x_97, x_97);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-increase-negative/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-increase-negative/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..489e5a1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-increase-negative/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,83 @@
+cbuffer cbuffer_x_7 : register(b1, space0) {
+  uint4 x_7[3];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_11 : register(b0, space0) {
+  uint4 x_11[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int i = 0;
+  int arr[2] = (int[2])0;
+  int a = 0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_40 = asint(x_7[scalar_offset / 4][scalar_offset % 4]);
+  i = x_40;
+  while (true) {
+    const int x_45 = i;
+    const int x_47 = asint(x_7[2].x);
+    if ((x_45 < x_47)) {
+    } else {
+      break;
+    }
+    const int x_50 = i;
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_52 = asint(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    arr[x_50] = x_52;
+    {
+      i = (i + 1);
+    }
+  }
+  a = -1;
+  const float x_57 = gl_FragCoord.y;
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const float x_59 = asfloat(x_11[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  if (!((x_57 < x_59))) {
+    const int x_65 = (a + 1);
+    a = x_65;
+    const int x_67 = asint(x_7[1].x);
+    arr[x_65] = x_67;
+  }
+  const int x_70 = (a + 1);
+  a = x_70;
+  const int x_72 = asint(x_7[2].x);
+  arr[x_70] = x_72;
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const int x_75 = asint(x_7[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  const int x_77 = arr[x_75];
+  const int x_79 = asint(x_7[1].x);
+  if ((x_77 == x_79)) {
+    const int x_84 = a;
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_87 = asint(x_7[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const int x_90 = asint(x_7[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    x_GLF_color = float4(float(x_84), float(x_87), float(x_90), float(a));
+  } else {
+    const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+    const int x_96 = asint(x_7[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+    const float x_97 = float(x_96);
+    x_GLF_color = float4(x_97, x_97, x_97, x_97);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-increase-negative/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-increase-negative/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..26ba969
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-increase-negative/0-opt.wgsl.expected.msl
@@ -0,0 +1,96 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct tint_array_wrapper_2 {
+  int arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_7, constant buf0& x_11, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int i = 0;
+  tint_array_wrapper_2 arr = {};
+  int a = 0;
+  int const x_40 = x_7.x_GLF_uniform_int_values.arr[0].el;
+  i = x_40;
+  while (true) {
+    int const x_45 = i;
+    int const x_47 = x_7.x_GLF_uniform_int_values.arr[2].el;
+    if ((x_45 < x_47)) {
+    } else {
+      break;
+    }
+    int const x_50 = i;
+    int const x_52 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    arr.arr[x_50] = x_52;
+    {
+      int const x_54 = i;
+      i = (x_54 + 1);
+    }
+  }
+  a = -1;
+  float const x_57 = (*(tint_symbol_5)).y;
+  float const x_59 = x_11.x_GLF_uniform_float_values.arr[0].el;
+  if (!((x_57 < x_59))) {
+    int const x_64 = a;
+    int const x_65 = (x_64 + 1);
+    a = x_65;
+    int const x_67 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    arr.arr[x_65] = x_67;
+  }
+  int const x_69 = a;
+  int const x_70 = (x_69 + 1);
+  a = x_70;
+  int const x_72 = x_7.x_GLF_uniform_int_values.arr[2].el;
+  arr.arr[x_70] = x_72;
+  int const x_75 = x_7.x_GLF_uniform_int_values.arr[0].el;
+  int const x_77 = arr.arr[x_75];
+  int const x_79 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_77 == x_79)) {
+    int const x_84 = a;
+    int const x_87 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_90 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_92 = a;
+    *(tint_symbol_6) = float4(float(x_84), float(x_87), float(x_90), float(x_92));
+  } else {
+    int const x_96 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    float const x_97 = float(x_96);
+    *(tint_symbol_6) = float4(x_97, x_97, x_97, x_97);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf1& x_7 [[buffer(1)]], constant buf0& x_11 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_7, x_11, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-increase-negative/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-increase-negative/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..e953d6b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-increase-negative/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,197 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 120
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_11 "x_11"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %arr "arr"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_11 NonWritable
+               OpDecorate %x_11 DescriptorSet 0
+               OpDecorate %x_11 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_7 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %12
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_11 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpConstantNull %int
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+%_ptr_Function__arr_int_uint_2 = OpTypePointer Function %_arr_int_uint_2
+         %34 = OpConstantNull %_arr_int_uint_2
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+     %int_n1 = OpConstant %int -1
+%_ptr_Private_float = OpTypePointer Private %float
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+   %main_out = OpTypeStruct %v4float
+        %107 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %23
+         %26 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %29
+        %arr = OpVariable %_ptr_Function__arr_int_uint_2 Function %34
+          %a = OpVariable %_ptr_Function_int Function %29
+         %39 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %40 = OpLoad %int %39
+               OpStore %i %40
+               OpBranch %41
+         %41 = OpLabel
+               OpLoopMerge %42 %43 None
+               OpBranch %44
+         %44 = OpLabel
+         %45 = OpLoad %int %i
+         %47 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %48 = OpLoad %int %47
+         %49 = OpSLessThan %bool %45 %48
+               OpSelectionMerge %51 None
+               OpBranchConditional %49 %52 %53
+         %52 = OpLabel
+               OpBranch %51
+         %53 = OpLabel
+               OpBranch %42
+         %51 = OpLabel
+         %54 = OpLoad %int %i
+         %55 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %56 = OpLoad %int %55
+         %57 = OpAccessChain %_ptr_Function_int %arr %54
+               OpStore %57 %56
+               OpBranch %43
+         %43 = OpLabel
+         %58 = OpLoad %int %i
+         %60 = OpIAdd %int %58 %int_1
+               OpStore %i %60
+               OpBranch %41
+         %42 = OpLabel
+               OpStore %a %int_n1
+         %63 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %64 = OpLoad %float %63
+         %66 = OpAccessChain %_ptr_Uniform_float %x_11 %uint_0 %int_0
+         %67 = OpLoad %float %66
+         %69 = OpFOrdLessThan %bool %64 %67
+         %68 = OpLogicalNot %bool %69
+               OpSelectionMerge %70 None
+               OpBranchConditional %68 %71 %70
+         %71 = OpLabel
+         %72 = OpLoad %int %a
+         %73 = OpIAdd %int %72 %int_1
+               OpStore %a %73
+         %74 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %75 = OpLoad %int %74
+         %76 = OpAccessChain %_ptr_Function_int %arr %73
+               OpStore %76 %75
+               OpBranch %70
+         %70 = OpLabel
+         %77 = OpLoad %int %a
+         %78 = OpIAdd %int %77 %int_1
+               OpStore %a %78
+         %79 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %80 = OpLoad %int %79
+         %81 = OpAccessChain %_ptr_Function_int %arr %78
+               OpStore %81 %80
+         %82 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %83 = OpLoad %int %82
+         %84 = OpAccessChain %_ptr_Function_int %arr %83
+         %85 = OpLoad %int %84
+         %86 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %87 = OpLoad %int %86
+         %88 = OpIEqual %bool %85 %87
+               OpSelectionMerge %89 None
+               OpBranchConditional %88 %90 %91
+         %90 = OpLabel
+         %92 = OpLoad %int %a
+         %93 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %94 = OpLoad %int %93
+         %95 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %96 = OpLoad %int %95
+         %97 = OpLoad %int %a
+         %98 = OpConvertSToF %float %92
+         %99 = OpConvertSToF %float %94
+        %100 = OpConvertSToF %float %96
+        %101 = OpConvertSToF %float %97
+        %102 = OpCompositeConstruct %v4float %98 %99 %100 %101
+               OpStore %x_GLF_color %102
+               OpBranch %89
+         %91 = OpLabel
+        %103 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+        %104 = OpLoad %int %103
+        %105 = OpConvertSToF %float %104
+        %106 = OpCompositeConstruct %v4float %105 %105 %105 %105
+               OpStore %x_GLF_color %106
+               OpBranch %89
+         %89 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %107
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %111 = OpLabel
+        %112 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %112
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %23
+        %114 = OpLabel
+        %115 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %115
+        %116 = OpFunctionCall %void %main_1
+        %118 = OpLoad %v4float %x_GLF_color
+        %119 = OpCompositeConstruct %main_out %118
+        %117 = OpFunctionCall %void %tint_symbol_3 %119
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-increase-negative/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-increase-negative/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..afe4b0e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-increase-negative/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,87 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_11 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  var arr : array<i32, 2>;
+  var a : i32;
+  let x_40 : i32 = x_7.x_GLF_uniform_int_values[0];
+  i = x_40;
+  loop {
+    let x_45 : i32 = i;
+    let x_47 : i32 = x_7.x_GLF_uniform_int_values[2];
+    if ((x_45 < x_47)) {
+    } else {
+      break;
+    }
+    let x_50 : i32 = i;
+    let x_52 : i32 = x_7.x_GLF_uniform_int_values[0];
+    arr[x_50] = x_52;
+
+    continuing {
+      let x_54 : i32 = i;
+      i = (x_54 + 1);
+    }
+  }
+  a = -1;
+  let x_57 : f32 = gl_FragCoord.y;
+  let x_59 : f32 = x_11.x_GLF_uniform_float_values[0];
+  if (!((x_57 < x_59))) {
+    let x_64 : i32 = a;
+    let x_65 : i32 = (x_64 + 1);
+    a = x_65;
+    let x_67 : i32 = x_7.x_GLF_uniform_int_values[1];
+    arr[x_65] = x_67;
+  }
+  let x_69 : i32 = a;
+  let x_70 : i32 = (x_69 + 1);
+  a = x_70;
+  let x_72 : i32 = x_7.x_GLF_uniform_int_values[2];
+  arr[x_70] = x_72;
+  let x_75 : i32 = x_7.x_GLF_uniform_int_values[0];
+  let x_77 : i32 = arr[x_75];
+  let x_79 : i32 = x_7.x_GLF_uniform_int_values[1];
+  if ((x_77 == x_79)) {
+    let x_84 : i32 = a;
+    let x_87 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_90 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_92 : i32 = a;
+    x_GLF_color = vec4<f32>(f32(x_84), f32(x_87), f32(x_90), f32(x_92));
+  } else {
+    let x_96 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_97 : f32 = f32(x_96);
+    x_GLF_color = vec4<f32>(x_97, x_97, x_97, x_97);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-ldexp/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-ldexp/0-opt.spvasm
new file mode 100644
index 0000000..cb67953
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-ldexp/0-opt.spvasm
@@ -0,0 +1,122 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %b "b"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+      %int_2 = OpConstant %int 2
+       %main = OpFunction %void None %14
+         %32 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+          %b = OpVariable %_ptr_Function_float Function
+         %33 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %34 = OpLoad %int %33
+               OpStore %a %34
+         %35 = OpLoad %int %a
+         %36 = OpIAdd %int %35 %int_1
+               OpStore %a %36
+         %37 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %38 = OpLoad %int %37
+               OpStore %i %38
+               OpBranch %39
+         %39 = OpLabel
+               OpLoopMerge %40 %41 None
+               OpBranch %42
+         %42 = OpLabel
+         %43 = OpLoad %int %i
+         %44 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %45 = OpLoad %int %44
+         %46 = OpSLessThan %bool %43 %45
+               OpBranchConditional %46 %47 %40
+         %47 = OpLabel
+         %48 = OpLoad %int %i
+         %49 = OpConvertSToF %float %48
+         %50 = OpLoad %int %a
+         %51 = OpSNegate %int %50
+         %52 = OpExtInst %float %1 Ldexp %49 %51
+               OpStore %b %52
+               OpBranch %41
+         %41 = OpLabel
+         %53 = OpLoad %int %i
+         %54 = OpIAdd %int %53 %int_1
+               OpStore %i %54
+               OpBranch %39
+         %40 = OpLabel
+         %55 = OpLoad %float %b
+         %56 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %57 = OpLoad %float %56
+         %58 = OpFOrdEqual %bool %55 %57
+               OpSelectionMerge %59 None
+               OpBranchConditional %58 %60 %61
+         %60 = OpLabel
+         %62 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %63 = OpLoad %int %62
+         %64 = OpConvertSToF %float %63
+         %65 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %66 = OpLoad %int %65
+         %67 = OpConvertSToF %float %66
+         %68 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %69 = OpLoad %int %68
+         %70 = OpConvertSToF %float %69
+         %71 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %72 = OpLoad %int %71
+         %73 = OpConvertSToF %float %72
+         %74 = OpCompositeConstruct %v4float %64 %67 %70 %73
+               OpStore %_GLF_color %74
+               OpBranch %59
+         %61 = OpLabel
+         %75 = OpLoad %float %b
+         %76 = OpCompositeConstruct %v4float %75 %75 %75 %75
+               OpStore %_GLF_color %76
+               OpBranch %59
+         %59 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-ldexp/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-ldexp/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..18402b4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-ldexp/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,59 @@
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[3];
+};
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  int i = 0;
+  float b = 0.0f;
+  const int x_34 = asint(x_6[1].x);
+  a = x_34;
+  a = (a + 1);
+  const int x_38 = asint(x_6[1].x);
+  i = x_38;
+  while (true) {
+    const int x_43 = i;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_45 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_43 < x_45)) {
+    } else {
+      break;
+    }
+    b = ldexp(float(i), -(a));
+    {
+      i = (i + 1);
+    }
+  }
+  const float x_55 = b;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_57 = asfloat(x_10[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_55 == x_57)) {
+    const int x_63 = asint(x_6[2].x);
+    const int x_66 = asint(x_6[1].x);
+    const int x_69 = asint(x_6[1].x);
+    const int x_72 = asint(x_6[2].x);
+    x_GLF_color = float4(float(x_63), float(x_66), float(x_69), float(x_72));
+  } else {
+    const float x_75 = b;
+    x_GLF_color = float4(x_75, x_75, x_75, x_75);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-ldexp/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-ldexp/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..bcdae40
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-ldexp/0-opt.spvasm.expected.msl
@@ -0,0 +1,78 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_10, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int i = 0;
+  float b = 0.0f;
+  int const x_34 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  a = x_34;
+  int const x_35 = a;
+  a = (x_35 + 1);
+  int const x_38 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  i = x_38;
+  while (true) {
+    int const x_43 = i;
+    int const x_45 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_43 < x_45)) {
+    } else {
+      break;
+    }
+    int const x_48 = i;
+    int const x_50 = a;
+    b = ldexp(float(x_48), -(x_50));
+    {
+      int const x_53 = i;
+      i = (x_53 + 1);
+    }
+  }
+  float const x_55 = b;
+  float const x_57 = x_10.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_55 == x_57)) {
+    int const x_63 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_66 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_69 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_72 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    *(tint_symbol_4) = float4(float(x_63), float(x_66), float(x_69), float(x_72));
+  } else {
+    float const x_75 = b;
+    *(tint_symbol_4) = float4(x_75, x_75, x_75, x_75);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_10 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-ldexp/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-ldexp/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..895c6ea
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-ldexp/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,163 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 97
+; Schema: 0
+               OpCapability Shader
+         %56 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %b "b"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %float = OpTypeFloat 32
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %26 = OpConstantNull %int
+%_ptr_Function_float = OpTypePointer Function %float
+         %30 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+         %85 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %26
+          %i = OpVariable %_ptr_Function_int Function %26
+          %b = OpVariable %_ptr_Function_float Function %30
+         %34 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %35 = OpLoad %int %34
+               OpStore %a %35
+         %36 = OpLoad %int %a
+         %37 = OpIAdd %int %36 %int_1
+               OpStore %a %37
+         %38 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %39 = OpLoad %int %38
+               OpStore %i %39
+               OpBranch %40
+         %40 = OpLabel
+               OpLoopMerge %41 %42 None
+               OpBranch %43
+         %43 = OpLabel
+         %44 = OpLoad %int %i
+         %46 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %47 = OpLoad %int %46
+         %48 = OpSLessThan %bool %44 %47
+               OpSelectionMerge %50 None
+               OpBranchConditional %48 %51 %52
+         %51 = OpLabel
+               OpBranch %50
+         %52 = OpLabel
+               OpBranch %41
+         %50 = OpLabel
+         %53 = OpLoad %int %i
+         %54 = OpLoad %int %a
+         %57 = OpConvertSToF %float %53
+         %58 = OpSNegate %int %54
+         %55 = OpExtInst %float %56 Ldexp %57 %58
+               OpStore %b %55
+               OpBranch %42
+         %42 = OpLabel
+         %59 = OpLoad %int %i
+         %60 = OpIAdd %int %59 %int_1
+               OpStore %i %60
+               OpBranch %40
+         %41 = OpLabel
+         %61 = OpLoad %float %b
+         %63 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_0
+         %64 = OpLoad %float %63
+         %65 = OpFOrdEqual %bool %61 %64
+               OpSelectionMerge %66 None
+               OpBranchConditional %65 %67 %68
+         %67 = OpLabel
+         %70 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %71 = OpLoad %int %70
+         %72 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %73 = OpLoad %int %72
+         %74 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %75 = OpLoad %int %74
+         %76 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %77 = OpLoad %int %76
+         %78 = OpConvertSToF %float %71
+         %79 = OpConvertSToF %float %73
+         %80 = OpConvertSToF %float %75
+         %81 = OpConvertSToF %float %77
+         %82 = OpCompositeConstruct %v4float %78 %79 %80 %81
+               OpStore %x_GLF_color %82
+               OpBranch %66
+         %68 = OpLabel
+         %83 = OpLoad %float %b
+         %84 = OpCompositeConstruct %v4float %83 %83 %83 %83
+               OpStore %x_GLF_color %84
+               OpBranch %66
+         %66 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %85
+%tint_symbol = OpFunctionParameter %main_out
+         %89 = OpLabel
+         %90 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %90
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+         %92 = OpLabel
+         %93 = OpFunctionCall %void %main_1
+         %95 = OpLoad %v4float %x_GLF_color
+         %96 = OpCompositeConstruct %main_out %95
+         %94 = OpFunctionCall %void %tint_symbol_2 %96
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-ldexp/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-ldexp/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..bb8ec9b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-ldexp/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,71 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  var b : f32;
+  let x_34 : i32 = x_6.x_GLF_uniform_int_values[1];
+  a = x_34;
+  let x_35 : i32 = a;
+  a = (x_35 + 1);
+  let x_38 : i32 = x_6.x_GLF_uniform_int_values[1];
+  i = x_38;
+  loop {
+    let x_43 : i32 = i;
+    let x_45 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_43 < x_45)) {
+    } else {
+      break;
+    }
+    let x_48 : i32 = i;
+    let x_50 : i32 = a;
+    b = ldexp(f32(x_48), -(x_50));
+
+    continuing {
+      let x_53 : i32 = i;
+      i = (x_53 + 1);
+    }
+  }
+  let x_55 : f32 = b;
+  let x_57 : f32 = x_10.x_GLF_uniform_float_values[0];
+  if ((x_55 == x_57)) {
+    let x_63 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_66 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_69 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_72 : i32 = x_6.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_63), f32(x_66), f32(x_69), f32(x_72));
+  } else {
+    let x_75 : f32 = b;
+    x_GLF_color = vec4<f32>(x_75, x_75, x_75, x_75);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-ldexp/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-ldexp/0-opt.wgsl
new file mode 100644
index 0000000..bb8ec9b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-ldexp/0-opt.wgsl
@@ -0,0 +1,71 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  var b : f32;
+  let x_34 : i32 = x_6.x_GLF_uniform_int_values[1];
+  a = x_34;
+  let x_35 : i32 = a;
+  a = (x_35 + 1);
+  let x_38 : i32 = x_6.x_GLF_uniform_int_values[1];
+  i = x_38;
+  loop {
+    let x_43 : i32 = i;
+    let x_45 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_43 < x_45)) {
+    } else {
+      break;
+    }
+    let x_48 : i32 = i;
+    let x_50 : i32 = a;
+    b = ldexp(f32(x_48), -(x_50));
+
+    continuing {
+      let x_53 : i32 = i;
+      i = (x_53 + 1);
+    }
+  }
+  let x_55 : f32 = b;
+  let x_57 : f32 = x_10.x_GLF_uniform_float_values[0];
+  if ((x_55 == x_57)) {
+    let x_63 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_66 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_69 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_72 : i32 = x_6.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_63), f32(x_66), f32(x_69), f32(x_72));
+  } else {
+    let x_75 : f32 = b;
+    x_GLF_color = vec4<f32>(x_75, x_75, x_75, x_75);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-ldexp/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-ldexp/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..18402b4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-ldexp/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,59 @@
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[3];
+};
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  int i = 0;
+  float b = 0.0f;
+  const int x_34 = asint(x_6[1].x);
+  a = x_34;
+  a = (a + 1);
+  const int x_38 = asint(x_6[1].x);
+  i = x_38;
+  while (true) {
+    const int x_43 = i;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_45 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_43 < x_45)) {
+    } else {
+      break;
+    }
+    b = ldexp(float(i), -(a));
+    {
+      i = (i + 1);
+    }
+  }
+  const float x_55 = b;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_57 = asfloat(x_10[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_55 == x_57)) {
+    const int x_63 = asint(x_6[2].x);
+    const int x_66 = asint(x_6[1].x);
+    const int x_69 = asint(x_6[1].x);
+    const int x_72 = asint(x_6[2].x);
+    x_GLF_color = float4(float(x_63), float(x_66), float(x_69), float(x_72));
+  } else {
+    const float x_75 = b;
+    x_GLF_color = float4(x_75, x_75, x_75, x_75);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-ldexp/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-ldexp/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..bcdae40
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-ldexp/0-opt.wgsl.expected.msl
@@ -0,0 +1,78 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_10, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int i = 0;
+  float b = 0.0f;
+  int const x_34 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  a = x_34;
+  int const x_35 = a;
+  a = (x_35 + 1);
+  int const x_38 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  i = x_38;
+  while (true) {
+    int const x_43 = i;
+    int const x_45 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_43 < x_45)) {
+    } else {
+      break;
+    }
+    int const x_48 = i;
+    int const x_50 = a;
+    b = ldexp(float(x_48), -(x_50));
+    {
+      int const x_53 = i;
+      i = (x_53 + 1);
+    }
+  }
+  float const x_55 = b;
+  float const x_57 = x_10.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_55 == x_57)) {
+    int const x_63 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_66 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_69 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_72 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    *(tint_symbol_4) = float4(float(x_63), float(x_66), float(x_69), float(x_72));
+  } else {
+    float const x_75 = b;
+    *(tint_symbol_4) = float4(x_75, x_75, x_75, x_75);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_10 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-ldexp/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-ldexp/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..895c6ea
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-ldexp/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,163 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 97
+; Schema: 0
+               OpCapability Shader
+         %56 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %b "b"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %float = OpTypeFloat 32
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %26 = OpConstantNull %int
+%_ptr_Function_float = OpTypePointer Function %float
+         %30 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+         %85 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %26
+          %i = OpVariable %_ptr_Function_int Function %26
+          %b = OpVariable %_ptr_Function_float Function %30
+         %34 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %35 = OpLoad %int %34
+               OpStore %a %35
+         %36 = OpLoad %int %a
+         %37 = OpIAdd %int %36 %int_1
+               OpStore %a %37
+         %38 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %39 = OpLoad %int %38
+               OpStore %i %39
+               OpBranch %40
+         %40 = OpLabel
+               OpLoopMerge %41 %42 None
+               OpBranch %43
+         %43 = OpLabel
+         %44 = OpLoad %int %i
+         %46 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %47 = OpLoad %int %46
+         %48 = OpSLessThan %bool %44 %47
+               OpSelectionMerge %50 None
+               OpBranchConditional %48 %51 %52
+         %51 = OpLabel
+               OpBranch %50
+         %52 = OpLabel
+               OpBranch %41
+         %50 = OpLabel
+         %53 = OpLoad %int %i
+         %54 = OpLoad %int %a
+         %57 = OpConvertSToF %float %53
+         %58 = OpSNegate %int %54
+         %55 = OpExtInst %float %56 Ldexp %57 %58
+               OpStore %b %55
+               OpBranch %42
+         %42 = OpLabel
+         %59 = OpLoad %int %i
+         %60 = OpIAdd %int %59 %int_1
+               OpStore %i %60
+               OpBranch %40
+         %41 = OpLabel
+         %61 = OpLoad %float %b
+         %63 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_0
+         %64 = OpLoad %float %63
+         %65 = OpFOrdEqual %bool %61 %64
+               OpSelectionMerge %66 None
+               OpBranchConditional %65 %67 %68
+         %67 = OpLabel
+         %70 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %71 = OpLoad %int %70
+         %72 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %73 = OpLoad %int %72
+         %74 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %75 = OpLoad %int %74
+         %76 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %77 = OpLoad %int %76
+         %78 = OpConvertSToF %float %71
+         %79 = OpConvertSToF %float %73
+         %80 = OpConvertSToF %float %75
+         %81 = OpConvertSToF %float %77
+         %82 = OpCompositeConstruct %v4float %78 %79 %80 %81
+               OpStore %x_GLF_color %82
+               OpBranch %66
+         %68 = OpLabel
+         %83 = OpLoad %float %b
+         %84 = OpCompositeConstruct %v4float %83 %83 %83 %83
+               OpStore %x_GLF_color %84
+               OpBranch %66
+         %66 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %85
+%tint_symbol = OpFunctionParameter %main_out
+         %89 = OpLabel
+         %90 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %90
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+         %92 = OpLabel
+         %93 = OpFunctionCall %void %main_1
+         %95 = OpLoad %v4float %x_GLF_color
+         %96 = OpCompositeConstruct %main_out %95
+         %94 = OpFunctionCall %void %tint_symbol_2 %96
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-ldexp/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-ldexp/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..bb8ec9b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-ldexp/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,71 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  var b : f32;
+  let x_34 : i32 = x_6.x_GLF_uniform_int_values[1];
+  a = x_34;
+  let x_35 : i32 = a;
+  a = (x_35 + 1);
+  let x_38 : i32 = x_6.x_GLF_uniform_int_values[1];
+  i = x_38;
+  loop {
+    let x_43 : i32 = i;
+    let x_45 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_43 < x_45)) {
+    } else {
+      break;
+    }
+    let x_48 : i32 = i;
+    let x_50 : i32 = a;
+    b = ldexp(f32(x_48), -(x_50));
+
+    continuing {
+      let x_53 : i32 = i;
+      i = (x_53 + 1);
+    }
+  }
+  let x_55 : f32 = b;
+  let x_57 : f32 = x_10.x_GLF_uniform_float_values[0];
+  if ((x_55 == x_57)) {
+    let x_63 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_66 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_69 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_72 : i32 = x_6.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_63), f32(x_66), f32(x_69), f32(x_72));
+  } else {
+    let x_75 : f32 = b;
+    x_GLF_color = vec4<f32>(x_75, x_75, x_75, x_75);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-neg-func-arg/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-neg-func-arg/0-opt.spvasm
new file mode 100644
index 0000000..e6136d5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-neg-func-arg/0-opt.spvasm
@@ -0,0 +1,154 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %func_f1_ "func(f1;"
+               OpName %f "f"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %b "b"
+               OpName %i "i"
+               OpName %param "param"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_5 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+        %int = OpTypeInt 32 1
+         %18 = OpTypeFunction %int %_ptr_Function_float
+%_ptr_Function_int = OpTypePointer Function %int
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_int_uint_5 = OpTypeArray %int %uint_5
+       %buf0 = OpTypeStruct %_arr_int_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+      %int_4 = OpConstant %int 4
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+%float_0_699999988 = OpConstant %float 0.699999988
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %14
+         %33 = OpLabel
+      %param = OpVariable %_ptr_Function_float Function
+               OpStore %param %float_0_699999988
+         %34 = OpFunctionCall %int %func_f1_ %param
+         %35 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %36 = OpLoad %int %35
+         %37 = OpIEqual %bool %34 %36
+               OpSelectionMerge %38 None
+               OpBranchConditional %37 %39 %40
+         %39 = OpLabel
+         %41 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %42 = OpLoad %int %41
+         %43 = OpConvertSToF %float %42
+         %44 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %45 = OpLoad %int %44
+         %46 = OpConvertSToF %float %45
+         %47 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %48 = OpLoad %int %47
+         %49 = OpConvertSToF %float %48
+         %50 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %51 = OpLoad %int %50
+         %52 = OpConvertSToF %float %51
+         %53 = OpCompositeConstruct %v4float %43 %46 %49 %52
+               OpStore %_GLF_color %53
+               OpBranch %38
+         %40 = OpLabel
+         %54 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %55 = OpLoad %int %54
+         %56 = OpConvertSToF %float %55
+         %57 = OpCompositeConstruct %v4float %56 %56 %56 %56
+               OpStore %_GLF_color %57
+               OpBranch %38
+         %38 = OpLabel
+               OpReturn
+               OpFunctionEnd
+   %func_f1_ = OpFunction %int None %18
+          %f = OpFunctionParameter %_ptr_Function_float
+         %58 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+          %b = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+         %59 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %60 = OpLoad %int %59
+               OpStore %a %60
+         %61 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %62 = OpLoad %int %61
+               OpStore %b %62
+         %63 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %64 = OpLoad %int %63
+               OpStore %i %64
+               OpBranch %65
+         %65 = OpLabel
+               OpLoopMerge %66 %67 None
+               OpBranch %68
+         %68 = OpLabel
+         %69 = OpLoad %int %i
+         %70 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_4
+         %71 = OpLoad %int %70
+         %72 = OpSLessThan %bool %69 %71
+               OpBranchConditional %72 %73 %66
+         %73 = OpLabel
+         %74 = OpLoad %int %a
+         %75 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %76 = OpLoad %int %75
+         %77 = OpSGreaterThan %bool %74 %76
+               OpSelectionMerge %78 None
+               OpBranchConditional %77 %79 %78
+         %79 = OpLabel
+               OpBranch %66
+         %78 = OpLabel
+         %80 = OpLoad %float %f
+         %81 = OpConvertFToS %int %80
+         %82 = OpISub %int %81 %int_1
+         %83 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %84 = OpLoad %int %83
+         %85 = OpISub %int %82 %84
+         %86 = OpLoad %int %i
+         %87 = OpIAdd %int %85 %86
+               OpStore %a %87
+         %88 = OpLoad %int %b
+         %89 = OpIAdd %int %88 %int_1
+               OpStore %b %89
+               OpBranch %67
+         %67 = OpLabel
+         %90 = OpLoad %int %i
+         %91 = OpIAdd %int %90 %int_1
+               OpStore %i %91
+               OpBranch %65
+         %66 = OpLabel
+         %92 = OpLoad %int %b
+         %93 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %94 = OpLoad %int %93
+         %95 = OpIEqual %bool %92 %94
+               OpSelectionMerge %96 None
+               OpBranchConditional %95 %97 %98
+         %97 = OpLabel
+         %99 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+        %100 = OpLoad %int %99
+               OpReturnValue %100
+         %98 = OpLabel
+        %101 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+        %102 = OpLoad %int %101
+               OpReturnValue %102
+         %96 = OpLabel
+               OpUnreachable
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-neg-func-arg/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-neg-func-arg/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..ae1cfdf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-neg-func-arg/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,80 @@
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[5];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+int func_f1_(inout float f) {
+  int a = 0;
+  int b = 0;
+  int i = 0;
+  const int x_60 = asint(x_8[1].x);
+  a = x_60;
+  const int x_62 = asint(x_8[2].x);
+  b = x_62;
+  const int x_64 = asint(x_8[2].x);
+  i = x_64;
+  while (true) {
+    const int x_69 = i;
+    const int x_71 = asint(x_8[4].x);
+    if ((x_69 < x_71)) {
+    } else {
+      break;
+    }
+    const int x_74 = a;
+    const int x_76 = asint(x_8[3].x);
+    if ((x_74 > x_76)) {
+      break;
+    }
+    const float x_80 = f;
+    const int x_84 = asint(x_8[1].x);
+    a = (((int(x_80) - 1) - x_84) + i);
+    b = (b + 1);
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_92 = b;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_94 = asint(x_8[scalar_offset / 4][scalar_offset % 4]);
+  if ((x_92 == x_94)) {
+    const int x_100 = asint(x_8[1].x);
+    return x_100;
+  } else {
+    const int x_102 = asint(x_8[2].x);
+    return x_102;
+  }
+  return 0;
+}
+
+void main_1() {
+  float param = 0.0f;
+  param = 0.699999988f;
+  const int x_34 = func_f1_(param);
+  const int x_36 = asint(x_8[1].x);
+  if ((x_34 == x_36)) {
+    const int x_42 = asint(x_8[1].x);
+    const int x_45 = asint(x_8[2].x);
+    const int x_48 = asint(x_8[2].x);
+    const int x_51 = asint(x_8[1].x);
+    x_GLF_color = float4(float(x_42), float(x_45), float(x_48), float(x_51));
+  } else {
+    const int x_55 = asint(x_8[2].x);
+    const float x_56 = float(x_55);
+    x_GLF_color = float4(x_56, x_56, x_56, x_56);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-neg-func-arg/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-neg-func-arg/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..e2416d2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-neg-func-arg/0-opt.spvasm.expected.msl
@@ -0,0 +1,92 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[5];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int func_f1_(constant buf0& x_8, thread float* const f) {
+  int a = 0;
+  int b = 0;
+  int i = 0;
+  int const x_60 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  a = x_60;
+  int const x_62 = x_8.x_GLF_uniform_int_values.arr[2].el;
+  b = x_62;
+  int const x_64 = x_8.x_GLF_uniform_int_values.arr[2].el;
+  i = x_64;
+  while (true) {
+    int const x_69 = i;
+    int const x_71 = x_8.x_GLF_uniform_int_values.arr[4].el;
+    if ((x_69 < x_71)) {
+    } else {
+      break;
+    }
+    int const x_74 = a;
+    int const x_76 = x_8.x_GLF_uniform_int_values.arr[3].el;
+    if ((x_74 > x_76)) {
+      break;
+    }
+    float const x_80 = *(f);
+    int const x_84 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    int const x_86 = i;
+    a = (((int(x_80) - 1) - x_84) + x_86);
+    int const x_88 = b;
+    b = (x_88 + 1);
+    {
+      int const x_90 = i;
+      i = (x_90 + 1);
+    }
+  }
+  int const x_92 = b;
+  int const x_94 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  if ((x_92 == x_94)) {
+    int const x_100 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    return x_100;
+  } else {
+    int const x_102 = x_8.x_GLF_uniform_int_values.arr[2].el;
+    return x_102;
+  }
+  return 0;
+}
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_4) {
+  float param = 0.0f;
+  param = 0.699999988f;
+  int const x_34 = func_f1_(x_8, &(param));
+  int const x_36 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_34 == x_36)) {
+    int const x_42 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    int const x_45 = x_8.x_GLF_uniform_int_values.arr[2].el;
+    int const x_48 = x_8.x_GLF_uniform_int_values.arr[2].el;
+    int const x_51 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_42), float(x_45), float(x_48), float(x_51));
+  } else {
+    int const x_55 = x_8.x_GLF_uniform_int_values.arr[2].el;
+    float const x_56 = float(x_55);
+    *(tint_symbol_4) = float4(x_56, x_56, x_56, x_56);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-neg-func-arg/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-neg-func-arg/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..ef89a41
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-neg-func-arg/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,193 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 124
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_f1_ "func_f1_"
+               OpName %f "f"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %i "i"
+               OpName %main_1 "main_1"
+               OpName %param "param"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_5 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_int_uint_5 = OpTypeArray %int %uint_5
+       %buf0 = OpTypeStruct %_arr_int_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+%_ptr_Function_float = OpTypePointer Function %float
+         %15 = OpTypeFunction %int %_ptr_Function_float
+%_ptr_Function_int = OpTypePointer Function %int
+         %22 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+      %int_4 = OpConstant %int 4
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+      %int_0 = OpConstant %int 0
+       %void = OpTypeVoid
+         %80 = OpTypeFunction %void
+         %85 = OpConstantNull %float
+%float_0_699999988 = OpConstant %float 0.699999988
+   %main_out = OpTypeStruct %v4float
+        %112 = OpTypeFunction %void %main_out
+   %func_f1_ = OpFunction %int None %15
+          %f = OpFunctionParameter %_ptr_Function_float
+         %19 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %22
+          %b = OpVariable %_ptr_Function_int Function %22
+          %i = OpVariable %_ptr_Function_int Function %22
+         %28 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %29 = OpLoad %int %28
+               OpStore %a %29
+         %31 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+         %32 = OpLoad %int %31
+               OpStore %b %32
+         %33 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+         %34 = OpLoad %int %33
+               OpStore %i %34
+               OpBranch %35
+         %35 = OpLabel
+               OpLoopMerge %36 %37 None
+               OpBranch %38
+         %38 = OpLabel
+         %39 = OpLoad %int %i
+         %41 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_4
+         %42 = OpLoad %int %41
+         %43 = OpSLessThan %bool %39 %42
+               OpSelectionMerge %45 None
+               OpBranchConditional %43 %46 %47
+         %46 = OpLabel
+               OpBranch %45
+         %47 = OpLabel
+               OpBranch %36
+         %45 = OpLabel
+         %48 = OpLoad %int %a
+         %50 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_3
+         %51 = OpLoad %int %50
+         %52 = OpSGreaterThan %bool %48 %51
+               OpSelectionMerge %53 None
+               OpBranchConditional %52 %54 %53
+         %54 = OpLabel
+               OpBranch %36
+         %53 = OpLabel
+         %56 = OpLoad %float %f
+         %57 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %58 = OpLoad %int %57
+         %59 = OpLoad %int %i
+         %60 = OpConvertFToS %int %56
+         %61 = OpISub %int %60 %int_1
+         %62 = OpISub %int %61 %58
+         %63 = OpIAdd %int %62 %59
+               OpStore %a %63
+         %64 = OpLoad %int %b
+         %65 = OpIAdd %int %64 %int_1
+               OpStore %b %65
+               OpBranch %37
+         %37 = OpLabel
+         %66 = OpLoad %int %i
+         %67 = OpIAdd %int %66 %int_1
+               OpStore %i %67
+               OpBranch %35
+         %36 = OpLabel
+         %68 = OpLoad %int %b
+         %70 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %71 = OpLoad %int %70
+         %72 = OpIEqual %bool %68 %71
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %74 %75
+         %74 = OpLabel
+         %76 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %77 = OpLoad %int %76
+               OpReturnValue %77
+         %75 = OpLabel
+         %78 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+         %79 = OpLoad %int %78
+               OpReturnValue %79
+         %73 = OpLabel
+               OpReturnValue %int_0
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %80
+         %83 = OpLabel
+      %param = OpVariable %_ptr_Function_float Function %85
+               OpStore %param %float_0_699999988
+         %87 = OpFunctionCall %int %func_f1_ %param
+         %89 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %90 = OpLoad %int %89
+         %91 = OpIEqual %bool %87 %90
+               OpSelectionMerge %92 None
+               OpBranchConditional %91 %93 %94
+         %93 = OpLabel
+         %95 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %96 = OpLoad %int %95
+         %97 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+         %98 = OpLoad %int %97
+         %99 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+        %100 = OpLoad %int %99
+        %101 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+        %102 = OpLoad %int %101
+        %103 = OpConvertSToF %float %96
+        %104 = OpConvertSToF %float %98
+        %105 = OpConvertSToF %float %100
+        %106 = OpConvertSToF %float %102
+        %107 = OpCompositeConstruct %v4float %103 %104 %105 %106
+               OpStore %x_GLF_color %107
+               OpBranch %92
+         %94 = OpLabel
+        %108 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+        %109 = OpLoad %int %108
+        %110 = OpConvertSToF %float %109
+        %111 = OpCompositeConstruct %v4float %110 %110 %110 %110
+               OpStore %x_GLF_color %111
+               OpBranch %92
+         %92 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %112
+%tint_symbol = OpFunctionParameter %main_out
+        %116 = OpLabel
+        %117 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %117
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %80
+        %119 = OpLabel
+        %120 = OpFunctionCall %void %main_1
+        %122 = OpLoad %v4float %x_GLF_color
+        %123 = OpCompositeConstruct %main_out %122
+        %121 = OpFunctionCall %void %tint_symbol_2 %123
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-neg-func-arg/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-neg-func-arg/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..a15e3bc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-neg-func-arg/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,86 @@
+type Arr = [[stride(16)]] array<i32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_f1_(f : ptr<function, f32>) -> i32 {
+  var a : i32;
+  var b : i32;
+  var i : i32;
+  let x_60 : i32 = x_8.x_GLF_uniform_int_values[1];
+  a = x_60;
+  let x_62 : i32 = x_8.x_GLF_uniform_int_values[2];
+  b = x_62;
+  let x_64 : i32 = x_8.x_GLF_uniform_int_values[2];
+  i = x_64;
+  loop {
+    let x_69 : i32 = i;
+    let x_71 : i32 = x_8.x_GLF_uniform_int_values[4];
+    if ((x_69 < x_71)) {
+    } else {
+      break;
+    }
+    let x_74 : i32 = a;
+    let x_76 : i32 = x_8.x_GLF_uniform_int_values[3];
+    if ((x_74 > x_76)) {
+      break;
+    }
+    let x_80 : f32 = *(f);
+    let x_84 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_86 : i32 = i;
+    a = (((i32(x_80) - 1) - x_84) + x_86);
+    let x_88 : i32 = b;
+    b = (x_88 + 1);
+
+    continuing {
+      let x_90 : i32 = i;
+      i = (x_90 + 1);
+    }
+  }
+  let x_92 : i32 = b;
+  let x_94 : i32 = x_8.x_GLF_uniform_int_values[0];
+  if ((x_92 == x_94)) {
+    let x_100 : i32 = x_8.x_GLF_uniform_int_values[1];
+    return x_100;
+  } else {
+    let x_102 : i32 = x_8.x_GLF_uniform_int_values[2];
+    return x_102;
+  }
+  return 0;
+}
+
+fn main_1() {
+  var param : f32;
+  param = 0.699999988;
+  let x_34 : i32 = func_f1_(&(param));
+  let x_36 : i32 = x_8.x_GLF_uniform_int_values[1];
+  if ((x_34 == x_36)) {
+    let x_42 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_45 : i32 = x_8.x_GLF_uniform_int_values[2];
+    let x_48 : i32 = x_8.x_GLF_uniform_int_values[2];
+    let x_51 : i32 = x_8.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_42), f32(x_45), f32(x_48), f32(x_51));
+  } else {
+    let x_55 : i32 = x_8.x_GLF_uniform_int_values[2];
+    let x_56 : f32 = f32(x_55);
+    x_GLF_color = vec4<f32>(x_56, x_56, x_56, x_56);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-neg-func-arg/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-neg-func-arg/0-opt.wgsl
new file mode 100644
index 0000000..a15e3bc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-neg-func-arg/0-opt.wgsl
@@ -0,0 +1,86 @@
+type Arr = [[stride(16)]] array<i32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_f1_(f : ptr<function, f32>) -> i32 {
+  var a : i32;
+  var b : i32;
+  var i : i32;
+  let x_60 : i32 = x_8.x_GLF_uniform_int_values[1];
+  a = x_60;
+  let x_62 : i32 = x_8.x_GLF_uniform_int_values[2];
+  b = x_62;
+  let x_64 : i32 = x_8.x_GLF_uniform_int_values[2];
+  i = x_64;
+  loop {
+    let x_69 : i32 = i;
+    let x_71 : i32 = x_8.x_GLF_uniform_int_values[4];
+    if ((x_69 < x_71)) {
+    } else {
+      break;
+    }
+    let x_74 : i32 = a;
+    let x_76 : i32 = x_8.x_GLF_uniform_int_values[3];
+    if ((x_74 > x_76)) {
+      break;
+    }
+    let x_80 : f32 = *(f);
+    let x_84 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_86 : i32 = i;
+    a = (((i32(x_80) - 1) - x_84) + x_86);
+    let x_88 : i32 = b;
+    b = (x_88 + 1);
+
+    continuing {
+      let x_90 : i32 = i;
+      i = (x_90 + 1);
+    }
+  }
+  let x_92 : i32 = b;
+  let x_94 : i32 = x_8.x_GLF_uniform_int_values[0];
+  if ((x_92 == x_94)) {
+    let x_100 : i32 = x_8.x_GLF_uniform_int_values[1];
+    return x_100;
+  } else {
+    let x_102 : i32 = x_8.x_GLF_uniform_int_values[2];
+    return x_102;
+  }
+  return 0;
+}
+
+fn main_1() {
+  var param : f32;
+  param = 0.699999988;
+  let x_34 : i32 = func_f1_(&(param));
+  let x_36 : i32 = x_8.x_GLF_uniform_int_values[1];
+  if ((x_34 == x_36)) {
+    let x_42 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_45 : i32 = x_8.x_GLF_uniform_int_values[2];
+    let x_48 : i32 = x_8.x_GLF_uniform_int_values[2];
+    let x_51 : i32 = x_8.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_42), f32(x_45), f32(x_48), f32(x_51));
+  } else {
+    let x_55 : i32 = x_8.x_GLF_uniform_int_values[2];
+    let x_56 : f32 = f32(x_55);
+    x_GLF_color = vec4<f32>(x_56, x_56, x_56, x_56);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-neg-func-arg/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-neg-func-arg/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..ae1cfdf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-neg-func-arg/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,80 @@
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[5];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+int func_f1_(inout float f) {
+  int a = 0;
+  int b = 0;
+  int i = 0;
+  const int x_60 = asint(x_8[1].x);
+  a = x_60;
+  const int x_62 = asint(x_8[2].x);
+  b = x_62;
+  const int x_64 = asint(x_8[2].x);
+  i = x_64;
+  while (true) {
+    const int x_69 = i;
+    const int x_71 = asint(x_8[4].x);
+    if ((x_69 < x_71)) {
+    } else {
+      break;
+    }
+    const int x_74 = a;
+    const int x_76 = asint(x_8[3].x);
+    if ((x_74 > x_76)) {
+      break;
+    }
+    const float x_80 = f;
+    const int x_84 = asint(x_8[1].x);
+    a = (((int(x_80) - 1) - x_84) + i);
+    b = (b + 1);
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_92 = b;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_94 = asint(x_8[scalar_offset / 4][scalar_offset % 4]);
+  if ((x_92 == x_94)) {
+    const int x_100 = asint(x_8[1].x);
+    return x_100;
+  } else {
+    const int x_102 = asint(x_8[2].x);
+    return x_102;
+  }
+  return 0;
+}
+
+void main_1() {
+  float param = 0.0f;
+  param = 0.699999988f;
+  const int x_34 = func_f1_(param);
+  const int x_36 = asint(x_8[1].x);
+  if ((x_34 == x_36)) {
+    const int x_42 = asint(x_8[1].x);
+    const int x_45 = asint(x_8[2].x);
+    const int x_48 = asint(x_8[2].x);
+    const int x_51 = asint(x_8[1].x);
+    x_GLF_color = float4(float(x_42), float(x_45), float(x_48), float(x_51));
+  } else {
+    const int x_55 = asint(x_8[2].x);
+    const float x_56 = float(x_55);
+    x_GLF_color = float4(x_56, x_56, x_56, x_56);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-neg-func-arg/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-neg-func-arg/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..e2416d2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-neg-func-arg/0-opt.wgsl.expected.msl
@@ -0,0 +1,92 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[5];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int func_f1_(constant buf0& x_8, thread float* const f) {
+  int a = 0;
+  int b = 0;
+  int i = 0;
+  int const x_60 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  a = x_60;
+  int const x_62 = x_8.x_GLF_uniform_int_values.arr[2].el;
+  b = x_62;
+  int const x_64 = x_8.x_GLF_uniform_int_values.arr[2].el;
+  i = x_64;
+  while (true) {
+    int const x_69 = i;
+    int const x_71 = x_8.x_GLF_uniform_int_values.arr[4].el;
+    if ((x_69 < x_71)) {
+    } else {
+      break;
+    }
+    int const x_74 = a;
+    int const x_76 = x_8.x_GLF_uniform_int_values.arr[3].el;
+    if ((x_74 > x_76)) {
+      break;
+    }
+    float const x_80 = *(f);
+    int const x_84 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    int const x_86 = i;
+    a = (((int(x_80) - 1) - x_84) + x_86);
+    int const x_88 = b;
+    b = (x_88 + 1);
+    {
+      int const x_90 = i;
+      i = (x_90 + 1);
+    }
+  }
+  int const x_92 = b;
+  int const x_94 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  if ((x_92 == x_94)) {
+    int const x_100 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    return x_100;
+  } else {
+    int const x_102 = x_8.x_GLF_uniform_int_values.arr[2].el;
+    return x_102;
+  }
+  return 0;
+}
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_4) {
+  float param = 0.0f;
+  param = 0.699999988f;
+  int const x_34 = func_f1_(x_8, &(param));
+  int const x_36 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_34 == x_36)) {
+    int const x_42 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    int const x_45 = x_8.x_GLF_uniform_int_values.arr[2].el;
+    int const x_48 = x_8.x_GLF_uniform_int_values.arr[2].el;
+    int const x_51 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_42), float(x_45), float(x_48), float(x_51));
+  } else {
+    int const x_55 = x_8.x_GLF_uniform_int_values.arr[2].el;
+    float const x_56 = float(x_55);
+    *(tint_symbol_4) = float4(x_56, x_56, x_56, x_56);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-neg-func-arg/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-neg-func-arg/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..ef89a41
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-neg-func-arg/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,193 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 124
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_f1_ "func_f1_"
+               OpName %f "f"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %i "i"
+               OpName %main_1 "main_1"
+               OpName %param "param"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_5 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_int_uint_5 = OpTypeArray %int %uint_5
+       %buf0 = OpTypeStruct %_arr_int_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+%_ptr_Function_float = OpTypePointer Function %float
+         %15 = OpTypeFunction %int %_ptr_Function_float
+%_ptr_Function_int = OpTypePointer Function %int
+         %22 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+      %int_4 = OpConstant %int 4
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+      %int_0 = OpConstant %int 0
+       %void = OpTypeVoid
+         %80 = OpTypeFunction %void
+         %85 = OpConstantNull %float
+%float_0_699999988 = OpConstant %float 0.699999988
+   %main_out = OpTypeStruct %v4float
+        %112 = OpTypeFunction %void %main_out
+   %func_f1_ = OpFunction %int None %15
+          %f = OpFunctionParameter %_ptr_Function_float
+         %19 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %22
+          %b = OpVariable %_ptr_Function_int Function %22
+          %i = OpVariable %_ptr_Function_int Function %22
+         %28 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %29 = OpLoad %int %28
+               OpStore %a %29
+         %31 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+         %32 = OpLoad %int %31
+               OpStore %b %32
+         %33 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+         %34 = OpLoad %int %33
+               OpStore %i %34
+               OpBranch %35
+         %35 = OpLabel
+               OpLoopMerge %36 %37 None
+               OpBranch %38
+         %38 = OpLabel
+         %39 = OpLoad %int %i
+         %41 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_4
+         %42 = OpLoad %int %41
+         %43 = OpSLessThan %bool %39 %42
+               OpSelectionMerge %45 None
+               OpBranchConditional %43 %46 %47
+         %46 = OpLabel
+               OpBranch %45
+         %47 = OpLabel
+               OpBranch %36
+         %45 = OpLabel
+         %48 = OpLoad %int %a
+         %50 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_3
+         %51 = OpLoad %int %50
+         %52 = OpSGreaterThan %bool %48 %51
+               OpSelectionMerge %53 None
+               OpBranchConditional %52 %54 %53
+         %54 = OpLabel
+               OpBranch %36
+         %53 = OpLabel
+         %56 = OpLoad %float %f
+         %57 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %58 = OpLoad %int %57
+         %59 = OpLoad %int %i
+         %60 = OpConvertFToS %int %56
+         %61 = OpISub %int %60 %int_1
+         %62 = OpISub %int %61 %58
+         %63 = OpIAdd %int %62 %59
+               OpStore %a %63
+         %64 = OpLoad %int %b
+         %65 = OpIAdd %int %64 %int_1
+               OpStore %b %65
+               OpBranch %37
+         %37 = OpLabel
+         %66 = OpLoad %int %i
+         %67 = OpIAdd %int %66 %int_1
+               OpStore %i %67
+               OpBranch %35
+         %36 = OpLabel
+         %68 = OpLoad %int %b
+         %70 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %71 = OpLoad %int %70
+         %72 = OpIEqual %bool %68 %71
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %74 %75
+         %74 = OpLabel
+         %76 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %77 = OpLoad %int %76
+               OpReturnValue %77
+         %75 = OpLabel
+         %78 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+         %79 = OpLoad %int %78
+               OpReturnValue %79
+         %73 = OpLabel
+               OpReturnValue %int_0
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %80
+         %83 = OpLabel
+      %param = OpVariable %_ptr_Function_float Function %85
+               OpStore %param %float_0_699999988
+         %87 = OpFunctionCall %int %func_f1_ %param
+         %89 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %90 = OpLoad %int %89
+         %91 = OpIEqual %bool %87 %90
+               OpSelectionMerge %92 None
+               OpBranchConditional %91 %93 %94
+         %93 = OpLabel
+         %95 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %96 = OpLoad %int %95
+         %97 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+         %98 = OpLoad %int %97
+         %99 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+        %100 = OpLoad %int %99
+        %101 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+        %102 = OpLoad %int %101
+        %103 = OpConvertSToF %float %96
+        %104 = OpConvertSToF %float %98
+        %105 = OpConvertSToF %float %100
+        %106 = OpConvertSToF %float %102
+        %107 = OpCompositeConstruct %v4float %103 %104 %105 %106
+               OpStore %x_GLF_color %107
+               OpBranch %92
+         %94 = OpLabel
+        %108 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+        %109 = OpLoad %int %108
+        %110 = OpConvertSToF %float %109
+        %111 = OpCompositeConstruct %v4float %110 %110 %110 %110
+               OpStore %x_GLF_color %111
+               OpBranch %92
+         %92 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %112
+%tint_symbol = OpFunctionParameter %main_out
+        %116 = OpLabel
+        %117 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %117
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %80
+        %119 = OpLabel
+        %120 = OpFunctionCall %void %main_1
+        %122 = OpLoad %v4float %x_GLF_color
+        %123 = OpCompositeConstruct %main_out %122
+        %121 = OpFunctionCall %void %tint_symbol_2 %123
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-neg-func-arg/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-neg-func-arg/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..a15e3bc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-neg-func-arg/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,86 @@
+type Arr = [[stride(16)]] array<i32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_f1_(f : ptr<function, f32>) -> i32 {
+  var a : i32;
+  var b : i32;
+  var i : i32;
+  let x_60 : i32 = x_8.x_GLF_uniform_int_values[1];
+  a = x_60;
+  let x_62 : i32 = x_8.x_GLF_uniform_int_values[2];
+  b = x_62;
+  let x_64 : i32 = x_8.x_GLF_uniform_int_values[2];
+  i = x_64;
+  loop {
+    let x_69 : i32 = i;
+    let x_71 : i32 = x_8.x_GLF_uniform_int_values[4];
+    if ((x_69 < x_71)) {
+    } else {
+      break;
+    }
+    let x_74 : i32 = a;
+    let x_76 : i32 = x_8.x_GLF_uniform_int_values[3];
+    if ((x_74 > x_76)) {
+      break;
+    }
+    let x_80 : f32 = *(f);
+    let x_84 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_86 : i32 = i;
+    a = (((i32(x_80) - 1) - x_84) + x_86);
+    let x_88 : i32 = b;
+    b = (x_88 + 1);
+
+    continuing {
+      let x_90 : i32 = i;
+      i = (x_90 + 1);
+    }
+  }
+  let x_92 : i32 = b;
+  let x_94 : i32 = x_8.x_GLF_uniform_int_values[0];
+  if ((x_92 == x_94)) {
+    let x_100 : i32 = x_8.x_GLF_uniform_int_values[1];
+    return x_100;
+  } else {
+    let x_102 : i32 = x_8.x_GLF_uniform_int_values[2];
+    return x_102;
+  }
+  return 0;
+}
+
+fn main_1() {
+  var param : f32;
+  param = 0.699999988;
+  let x_34 : i32 = func_f1_(&(param));
+  let x_36 : i32 = x_8.x_GLF_uniform_int_values[1];
+  if ((x_34 == x_36)) {
+    let x_42 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_45 : i32 = x_8.x_GLF_uniform_int_values[2];
+    let x_48 : i32 = x_8.x_GLF_uniform_int_values[2];
+    let x_51 : i32 = x_8.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_42), f32(x_45), f32(x_48), f32(x_51));
+  } else {
+    let x_55 : i32 = x_8.x_GLF_uniform_int_values[2];
+    let x_56 : f32 = f32(x_55);
+    x_GLF_color = vec4<f32>(x_56, x_56, x_56, x_56);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-pre-increase/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-pre-increase/0-opt.spvasm
new file mode 100644
index 0000000..3849888
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-pre-increase/0-opt.spvasm
@@ -0,0 +1,156 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %f1_ "f1("
+               OpName %i "i"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %A "A"
+               OpName %a "a"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpName %i_0 "i"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %17 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+         %19 = OpTypeFunction %int
+%_ptr_Function_int = OpTypePointer Function %int
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+      %int_1 = OpConstant %int 1
+     %int_n1 = OpConstant %int -1
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %17
+         %41 = OpLabel
+        %i_0 = OpVariable %_ptr_Function_int Function
+         %42 = OpFunctionCall %int %f1_
+               OpStore %i_0 %42
+         %43 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %44 = OpLoad %int %43
+         %45 = OpConvertSToF %float %44
+         %46 = OpLoad %int %i_0
+         %47 = OpConvertSToF %float %46
+         %48 = OpLoad %int %i_0
+         %49 = OpConvertSToF %float %48
+         %50 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %51 = OpLoad %int %50
+         %52 = OpConvertSToF %float %51
+         %53 = OpCompositeConstruct %v4float %45 %47 %49 %52
+               OpStore %_GLF_color %53
+               OpReturn
+               OpFunctionEnd
+        %f1_ = OpFunction %int None %19
+         %54 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+          %A = OpVariable %_ptr_Function__arr_int_uint_10 Function
+          %a = OpVariable %_ptr_Function_int Function
+         %55 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %56 = OpLoad %int %55
+               OpStore %i %56
+               OpBranch %57
+         %57 = OpLabel
+               OpLoopMerge %58 %59 None
+               OpBranch %60
+         %60 = OpLabel
+         %61 = OpLoad %int %i
+         %62 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %63 = OpLoad %int %62
+         %64 = OpSLessThan %bool %61 %63
+               OpBranchConditional %64 %65 %58
+         %65 = OpLabel
+         %66 = OpLoad %int %i
+         %67 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %68 = OpLoad %int %67
+         %69 = OpAccessChain %_ptr_Function_int %A %66
+               OpStore %69 %68
+               OpBranch %59
+         %59 = OpLabel
+         %70 = OpLoad %int %i
+         %71 = OpIAdd %int %70 %int_1
+               OpStore %i %71
+               OpBranch %57
+         %58 = OpLabel
+               OpStore %a %int_n1
+         %72 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %73 = OpLoad %float %72
+         %74 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %75 = OpLoad %float %74
+         %76 = OpFOrdGreaterThanEqual %bool %73 %75
+               OpSelectionMerge %77 None
+               OpBranchConditional %76 %78 %77
+         %78 = OpLabel
+         %79 = OpLoad %int %a
+         %80 = OpIAdd %int %79 %int_1
+               OpStore %a %80
+         %81 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %82 = OpLoad %int %81
+         %83 = OpAccessChain %_ptr_Function_int %A %80
+               OpStore %83 %82
+               OpBranch %77
+         %77 = OpLabel
+         %84 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %85 = OpLoad %int %84
+         %86 = OpAccessChain %_ptr_Function_int %A %85
+         %87 = OpLoad %int %86
+         %88 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %89 = OpLoad %int %88
+         %90 = OpIEqual %bool %87 %89
+               OpSelectionMerge %91 None
+               OpBranchConditional %90 %92 %93
+         %92 = OpLabel
+         %94 = OpLoad %int %a
+         %95 = OpIAdd %int %94 %int_1
+               OpStore %a %95
+         %96 = OpAccessChain %_ptr_Function_int %A %95
+         %97 = OpLoad %int %96
+               OpReturnValue %97
+         %93 = OpLabel
+         %98 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %99 = OpLoad %int %98
+               OpReturnValue %99
+         %91 = OpLabel
+               OpUnreachable
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-pre-increase/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-pre-increase/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..8a664a3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-pre-increase/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,85 @@
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[3];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_12 : register(b0, space0) {
+  uint4 x_12[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+int f1_() {
+  int i = 0;
+  int A[10] = (int[10])0;
+  int a = 0;
+  const int x_56 = asint(x_8[2].x);
+  i = x_56;
+  while (true) {
+    const int x_61 = i;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_63 = asint(x_8[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_61 < x_63)) {
+    } else {
+      break;
+    }
+    const int x_66 = i;
+    const int x_68 = asint(x_8[2].x);
+    A[x_66] = x_68;
+    {
+      i = (i + 1);
+    }
+  }
+  a = -1;
+  const float x_73 = gl_FragCoord.y;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_75 = asfloat(x_12[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_73 >= x_75)) {
+    const int x_80 = (a + 1);
+    a = x_80;
+    const int x_82 = asint(x_8[1].x);
+    A[x_80] = x_82;
+  }
+  const int x_85 = asint(x_8[2].x);
+  const int x_87 = A[x_85];
+  const int x_89 = asint(x_8[1].x);
+  if ((x_87 == x_89)) {
+    const int x_95 = (a + 1);
+    a = x_95;
+    const int x_97 = A[x_95];
+    return x_97;
+  } else {
+    const int x_99 = asint(x_8[1].x);
+    return x_99;
+  }
+  return 0;
+}
+
+void main_1() {
+  int i_1 = 0;
+  const int x_42 = f1_();
+  i_1 = x_42;
+  const int x_44 = asint(x_8[1].x);
+  const int x_46 = i_1;
+  const int x_48 = i_1;
+  const int x_51 = asint(x_8[1].x);
+  x_GLF_color = float4(float(x_44), float(x_46), float(x_48), float(x_51));
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-pre-increase/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-pre-increase/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..d0afc76
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-pre-increase/0-opt.spvasm.expected.msl
@@ -0,0 +1,102 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct tint_array_wrapper_2 {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int f1_(constant buf1& x_8, constant buf0& x_12, thread float4* const tint_symbol_5) {
+  int i = 0;
+  tint_array_wrapper_2 A = {};
+  int a = 0;
+  int const x_56 = x_8.x_GLF_uniform_int_values.arr[2].el;
+  i = x_56;
+  while (true) {
+    int const x_61 = i;
+    int const x_63 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_61 < x_63)) {
+    } else {
+      break;
+    }
+    int const x_66 = i;
+    int const x_68 = x_8.x_GLF_uniform_int_values.arr[2].el;
+    A.arr[x_66] = x_68;
+    {
+      int const x_70 = i;
+      i = (x_70 + 1);
+    }
+  }
+  a = -1;
+  float const x_73 = (*(tint_symbol_5)).y;
+  float const x_75 = x_12.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_73 >= x_75)) {
+    int const x_79 = a;
+    int const x_80 = (x_79 + 1);
+    a = x_80;
+    int const x_82 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    A.arr[x_80] = x_82;
+  }
+  int const x_85 = x_8.x_GLF_uniform_int_values.arr[2].el;
+  int const x_87 = A.arr[x_85];
+  int const x_89 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_87 == x_89)) {
+    int const x_94 = a;
+    int const x_95 = (x_94 + 1);
+    a = x_95;
+    int const x_97 = A.arr[x_95];
+    return x_97;
+  } else {
+    int const x_99 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    return x_99;
+  }
+  return 0;
+}
+
+void main_1(constant buf1& x_8, constant buf0& x_12, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  int i_1 = 0;
+  int const x_42 = f1_(x_8, x_12, tint_symbol_6);
+  i_1 = x_42;
+  int const x_44 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  int const x_46 = i_1;
+  int const x_48 = i_1;
+  int const x_51 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  *(tint_symbol_7) = float4(float(x_44), float(x_46), float(x_48), float(x_51));
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf1& x_8 [[buffer(1)]], constant buf0& x_12 [[buffer(0)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_8, x_12, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-pre-increase/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-pre-increase/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..ed58ead
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-pre-increase/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,201 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 121
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_8 "x_8"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_12 "x_12"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %f1_ "f1_"
+               OpName %i "i"
+               OpName %A "A"
+               OpName %a "a"
+               OpName %main_1 "main_1"
+               OpName %i_1 "i_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_12 NonWritable
+               OpDecorate %x_12 DescriptorSet 0
+               OpDecorate %x_12 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %12
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_12 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %12
+         %23 = OpTypeFunction %int
+%_ptr_Function_int = OpTypePointer Function %int
+         %28 = OpConstantNull %int
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+         %33 = OpConstantNull %_arr_int_uint_10
+     %uint_0 = OpConstant %uint 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+     %int_n1 = OpConstant %int -1
+%_ptr_Private_float = OpTypePointer Private %float
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %void = OpTypeVoid
+         %91 = OpTypeFunction %void
+   %main_out = OpTypeStruct %v4float
+        %108 = OpTypeFunction %void %main_out
+        %f1_ = OpFunction %int None %23
+         %25 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %28
+          %A = OpVariable %_ptr_Function__arr_int_uint_10 Function %33
+          %a = OpVariable %_ptr_Function_int Function %28
+         %38 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+         %39 = OpLoad %int %38
+               OpStore %i %39
+               OpBranch %40
+         %40 = OpLabel
+               OpLoopMerge %41 %42 None
+               OpBranch %43
+         %43 = OpLabel
+         %44 = OpLoad %int %i
+         %46 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %47 = OpLoad %int %46
+         %48 = OpSLessThan %bool %44 %47
+               OpSelectionMerge %50 None
+               OpBranchConditional %48 %51 %52
+         %51 = OpLabel
+               OpBranch %50
+         %52 = OpLabel
+               OpBranch %41
+         %50 = OpLabel
+         %53 = OpLoad %int %i
+         %54 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+         %55 = OpLoad %int %54
+         %56 = OpAccessChain %_ptr_Function_int %A %53
+               OpStore %56 %55
+               OpBranch %42
+         %42 = OpLabel
+         %57 = OpLoad %int %i
+         %59 = OpIAdd %int %57 %int_1
+               OpStore %i %59
+               OpBranch %40
+         %41 = OpLabel
+               OpStore %a %int_n1
+         %62 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %63 = OpLoad %float %62
+         %65 = OpAccessChain %_ptr_Uniform_float %x_12 %uint_0 %int_0
+         %66 = OpLoad %float %65
+         %67 = OpFOrdGreaterThanEqual %bool %63 %66
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %68
+         %69 = OpLabel
+         %70 = OpLoad %int %a
+         %71 = OpIAdd %int %70 %int_1
+               OpStore %a %71
+         %72 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %73 = OpLoad %int %72
+         %74 = OpAccessChain %_ptr_Function_int %A %71
+               OpStore %74 %73
+               OpBranch %68
+         %68 = OpLabel
+         %75 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+         %76 = OpLoad %int %75
+         %77 = OpAccessChain %_ptr_Function_int %A %76
+         %78 = OpLoad %int %77
+         %79 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %80 = OpLoad %int %79
+         %81 = OpIEqual %bool %78 %80
+               OpSelectionMerge %82 None
+               OpBranchConditional %81 %83 %84
+         %83 = OpLabel
+         %85 = OpLoad %int %a
+         %86 = OpIAdd %int %85 %int_1
+               OpStore %a %86
+         %87 = OpAccessChain %_ptr_Function_int %A %86
+         %88 = OpLoad %int %87
+               OpReturnValue %88
+         %84 = OpLabel
+         %89 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %90 = OpLoad %int %89
+               OpReturnValue %90
+         %82 = OpLabel
+               OpReturnValue %int_0
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %91
+         %94 = OpLabel
+        %i_1 = OpVariable %_ptr_Function_int Function %28
+         %96 = OpFunctionCall %int %f1_
+               OpStore %i_1 %96
+         %97 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %98 = OpLoad %int %97
+         %99 = OpLoad %int %i_1
+        %100 = OpLoad %int %i_1
+        %101 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+        %102 = OpLoad %int %101
+        %103 = OpConvertSToF %float %98
+        %104 = OpConvertSToF %float %99
+        %105 = OpConvertSToF %float %100
+        %106 = OpConvertSToF %float %102
+        %107 = OpCompositeConstruct %v4float %103 %104 %105 %106
+               OpStore %x_GLF_color %107
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %108
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %112 = OpLabel
+        %113 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %113
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %91
+        %115 = OpLabel
+        %116 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %116
+        %117 = OpFunctionCall %void %main_1
+        %119 = OpLoad %v4float %x_GLF_color
+        %120 = OpCompositeConstruct %main_out %119
+        %118 = OpFunctionCall %void %tint_symbol_3 %120
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-pre-increase/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-pre-increase/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..4135af8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-pre-increase/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,93 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_12 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn f1_() -> i32 {
+  var i : i32;
+  var A : array<i32, 10>;
+  var a : i32;
+  let x_56 : i32 = x_8.x_GLF_uniform_int_values[2];
+  i = x_56;
+  loop {
+    let x_61 : i32 = i;
+    let x_63 : i32 = x_8.x_GLF_uniform_int_values[0];
+    if ((x_61 < x_63)) {
+    } else {
+      break;
+    }
+    let x_66 : i32 = i;
+    let x_68 : i32 = x_8.x_GLF_uniform_int_values[2];
+    A[x_66] = x_68;
+
+    continuing {
+      let x_70 : i32 = i;
+      i = (x_70 + 1);
+    }
+  }
+  a = -1;
+  let x_73 : f32 = gl_FragCoord.y;
+  let x_75 : f32 = x_12.x_GLF_uniform_float_values[0];
+  if ((x_73 >= x_75)) {
+    let x_79 : i32 = a;
+    let x_80 : i32 = (x_79 + 1);
+    a = x_80;
+    let x_82 : i32 = x_8.x_GLF_uniform_int_values[1];
+    A[x_80] = x_82;
+  }
+  let x_85 : i32 = x_8.x_GLF_uniform_int_values[2];
+  let x_87 : i32 = A[x_85];
+  let x_89 : i32 = x_8.x_GLF_uniform_int_values[1];
+  if ((x_87 == x_89)) {
+    let x_94 : i32 = a;
+    let x_95 : i32 = (x_94 + 1);
+    a = x_95;
+    let x_97 : i32 = A[x_95];
+    return x_97;
+  } else {
+    let x_99 : i32 = x_8.x_GLF_uniform_int_values[1];
+    return x_99;
+  }
+  return 0;
+}
+
+fn main_1() {
+  var i_1 : i32;
+  let x_42 : i32 = f1_();
+  i_1 = x_42;
+  let x_44 : i32 = x_8.x_GLF_uniform_int_values[1];
+  let x_46 : i32 = i_1;
+  let x_48 : i32 = i_1;
+  let x_51 : i32 = x_8.x_GLF_uniform_int_values[1];
+  x_GLF_color = vec4<f32>(f32(x_44), f32(x_46), f32(x_48), f32(x_51));
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-pre-increase/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-pre-increase/0-opt.wgsl
new file mode 100644
index 0000000..4135af8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-pre-increase/0-opt.wgsl
@@ -0,0 +1,93 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_12 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn f1_() -> i32 {
+  var i : i32;
+  var A : array<i32, 10>;
+  var a : i32;
+  let x_56 : i32 = x_8.x_GLF_uniform_int_values[2];
+  i = x_56;
+  loop {
+    let x_61 : i32 = i;
+    let x_63 : i32 = x_8.x_GLF_uniform_int_values[0];
+    if ((x_61 < x_63)) {
+    } else {
+      break;
+    }
+    let x_66 : i32 = i;
+    let x_68 : i32 = x_8.x_GLF_uniform_int_values[2];
+    A[x_66] = x_68;
+
+    continuing {
+      let x_70 : i32 = i;
+      i = (x_70 + 1);
+    }
+  }
+  a = -1;
+  let x_73 : f32 = gl_FragCoord.y;
+  let x_75 : f32 = x_12.x_GLF_uniform_float_values[0];
+  if ((x_73 >= x_75)) {
+    let x_79 : i32 = a;
+    let x_80 : i32 = (x_79 + 1);
+    a = x_80;
+    let x_82 : i32 = x_8.x_GLF_uniform_int_values[1];
+    A[x_80] = x_82;
+  }
+  let x_85 : i32 = x_8.x_GLF_uniform_int_values[2];
+  let x_87 : i32 = A[x_85];
+  let x_89 : i32 = x_8.x_GLF_uniform_int_values[1];
+  if ((x_87 == x_89)) {
+    let x_94 : i32 = a;
+    let x_95 : i32 = (x_94 + 1);
+    a = x_95;
+    let x_97 : i32 = A[x_95];
+    return x_97;
+  } else {
+    let x_99 : i32 = x_8.x_GLF_uniform_int_values[1];
+    return x_99;
+  }
+  return 0;
+}
+
+fn main_1() {
+  var i_1 : i32;
+  let x_42 : i32 = f1_();
+  i_1 = x_42;
+  let x_44 : i32 = x_8.x_GLF_uniform_int_values[1];
+  let x_46 : i32 = i_1;
+  let x_48 : i32 = i_1;
+  let x_51 : i32 = x_8.x_GLF_uniform_int_values[1];
+  x_GLF_color = vec4<f32>(f32(x_44), f32(x_46), f32(x_48), f32(x_51));
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-pre-increase/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-pre-increase/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..8a664a3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-pre-increase/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,85 @@
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[3];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_12 : register(b0, space0) {
+  uint4 x_12[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+int f1_() {
+  int i = 0;
+  int A[10] = (int[10])0;
+  int a = 0;
+  const int x_56 = asint(x_8[2].x);
+  i = x_56;
+  while (true) {
+    const int x_61 = i;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_63 = asint(x_8[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_61 < x_63)) {
+    } else {
+      break;
+    }
+    const int x_66 = i;
+    const int x_68 = asint(x_8[2].x);
+    A[x_66] = x_68;
+    {
+      i = (i + 1);
+    }
+  }
+  a = -1;
+  const float x_73 = gl_FragCoord.y;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_75 = asfloat(x_12[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_73 >= x_75)) {
+    const int x_80 = (a + 1);
+    a = x_80;
+    const int x_82 = asint(x_8[1].x);
+    A[x_80] = x_82;
+  }
+  const int x_85 = asint(x_8[2].x);
+  const int x_87 = A[x_85];
+  const int x_89 = asint(x_8[1].x);
+  if ((x_87 == x_89)) {
+    const int x_95 = (a + 1);
+    a = x_95;
+    const int x_97 = A[x_95];
+    return x_97;
+  } else {
+    const int x_99 = asint(x_8[1].x);
+    return x_99;
+  }
+  return 0;
+}
+
+void main_1() {
+  int i_1 = 0;
+  const int x_42 = f1_();
+  i_1 = x_42;
+  const int x_44 = asint(x_8[1].x);
+  const int x_46 = i_1;
+  const int x_48 = i_1;
+  const int x_51 = asint(x_8[1].x);
+  x_GLF_color = float4(float(x_44), float(x_46), float(x_48), float(x_51));
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-pre-increase/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-pre-increase/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..d0afc76
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-pre-increase/0-opt.wgsl.expected.msl
@@ -0,0 +1,102 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct tint_array_wrapper_2 {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int f1_(constant buf1& x_8, constant buf0& x_12, thread float4* const tint_symbol_5) {
+  int i = 0;
+  tint_array_wrapper_2 A = {};
+  int a = 0;
+  int const x_56 = x_8.x_GLF_uniform_int_values.arr[2].el;
+  i = x_56;
+  while (true) {
+    int const x_61 = i;
+    int const x_63 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_61 < x_63)) {
+    } else {
+      break;
+    }
+    int const x_66 = i;
+    int const x_68 = x_8.x_GLF_uniform_int_values.arr[2].el;
+    A.arr[x_66] = x_68;
+    {
+      int const x_70 = i;
+      i = (x_70 + 1);
+    }
+  }
+  a = -1;
+  float const x_73 = (*(tint_symbol_5)).y;
+  float const x_75 = x_12.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_73 >= x_75)) {
+    int const x_79 = a;
+    int const x_80 = (x_79 + 1);
+    a = x_80;
+    int const x_82 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    A.arr[x_80] = x_82;
+  }
+  int const x_85 = x_8.x_GLF_uniform_int_values.arr[2].el;
+  int const x_87 = A.arr[x_85];
+  int const x_89 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_87 == x_89)) {
+    int const x_94 = a;
+    int const x_95 = (x_94 + 1);
+    a = x_95;
+    int const x_97 = A.arr[x_95];
+    return x_97;
+  } else {
+    int const x_99 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    return x_99;
+  }
+  return 0;
+}
+
+void main_1(constant buf1& x_8, constant buf0& x_12, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  int i_1 = 0;
+  int const x_42 = f1_(x_8, x_12, tint_symbol_6);
+  i_1 = x_42;
+  int const x_44 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  int const x_46 = i_1;
+  int const x_48 = i_1;
+  int const x_51 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  *(tint_symbol_7) = float4(float(x_44), float(x_46), float(x_48), float(x_51));
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf1& x_8 [[buffer(1)]], constant buf0& x_12 [[buffer(0)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_8, x_12, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-pre-increase/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-pre-increase/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..ed58ead
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-pre-increase/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,201 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 121
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_8 "x_8"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_12 "x_12"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %f1_ "f1_"
+               OpName %i "i"
+               OpName %A "A"
+               OpName %a "a"
+               OpName %main_1 "main_1"
+               OpName %i_1 "i_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_12 NonWritable
+               OpDecorate %x_12 DescriptorSet 0
+               OpDecorate %x_12 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %12
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_12 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %12
+         %23 = OpTypeFunction %int
+%_ptr_Function_int = OpTypePointer Function %int
+         %28 = OpConstantNull %int
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+         %33 = OpConstantNull %_arr_int_uint_10
+     %uint_0 = OpConstant %uint 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+     %int_n1 = OpConstant %int -1
+%_ptr_Private_float = OpTypePointer Private %float
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %void = OpTypeVoid
+         %91 = OpTypeFunction %void
+   %main_out = OpTypeStruct %v4float
+        %108 = OpTypeFunction %void %main_out
+        %f1_ = OpFunction %int None %23
+         %25 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %28
+          %A = OpVariable %_ptr_Function__arr_int_uint_10 Function %33
+          %a = OpVariable %_ptr_Function_int Function %28
+         %38 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+         %39 = OpLoad %int %38
+               OpStore %i %39
+               OpBranch %40
+         %40 = OpLabel
+               OpLoopMerge %41 %42 None
+               OpBranch %43
+         %43 = OpLabel
+         %44 = OpLoad %int %i
+         %46 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %47 = OpLoad %int %46
+         %48 = OpSLessThan %bool %44 %47
+               OpSelectionMerge %50 None
+               OpBranchConditional %48 %51 %52
+         %51 = OpLabel
+               OpBranch %50
+         %52 = OpLabel
+               OpBranch %41
+         %50 = OpLabel
+         %53 = OpLoad %int %i
+         %54 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+         %55 = OpLoad %int %54
+         %56 = OpAccessChain %_ptr_Function_int %A %53
+               OpStore %56 %55
+               OpBranch %42
+         %42 = OpLabel
+         %57 = OpLoad %int %i
+         %59 = OpIAdd %int %57 %int_1
+               OpStore %i %59
+               OpBranch %40
+         %41 = OpLabel
+               OpStore %a %int_n1
+         %62 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %63 = OpLoad %float %62
+         %65 = OpAccessChain %_ptr_Uniform_float %x_12 %uint_0 %int_0
+         %66 = OpLoad %float %65
+         %67 = OpFOrdGreaterThanEqual %bool %63 %66
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %68
+         %69 = OpLabel
+         %70 = OpLoad %int %a
+         %71 = OpIAdd %int %70 %int_1
+               OpStore %a %71
+         %72 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %73 = OpLoad %int %72
+         %74 = OpAccessChain %_ptr_Function_int %A %71
+               OpStore %74 %73
+               OpBranch %68
+         %68 = OpLabel
+         %75 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+         %76 = OpLoad %int %75
+         %77 = OpAccessChain %_ptr_Function_int %A %76
+         %78 = OpLoad %int %77
+         %79 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %80 = OpLoad %int %79
+         %81 = OpIEqual %bool %78 %80
+               OpSelectionMerge %82 None
+               OpBranchConditional %81 %83 %84
+         %83 = OpLabel
+         %85 = OpLoad %int %a
+         %86 = OpIAdd %int %85 %int_1
+               OpStore %a %86
+         %87 = OpAccessChain %_ptr_Function_int %A %86
+         %88 = OpLoad %int %87
+               OpReturnValue %88
+         %84 = OpLabel
+         %89 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %90 = OpLoad %int %89
+               OpReturnValue %90
+         %82 = OpLabel
+               OpReturnValue %int_0
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %91
+         %94 = OpLabel
+        %i_1 = OpVariable %_ptr_Function_int Function %28
+         %96 = OpFunctionCall %int %f1_
+               OpStore %i_1 %96
+         %97 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %98 = OpLoad %int %97
+         %99 = OpLoad %int %i_1
+        %100 = OpLoad %int %i_1
+        %101 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+        %102 = OpLoad %int %101
+        %103 = OpConvertSToF %float %98
+        %104 = OpConvertSToF %float %99
+        %105 = OpConvertSToF %float %100
+        %106 = OpConvertSToF %float %102
+        %107 = OpCompositeConstruct %v4float %103 %104 %105 %106
+               OpStore %x_GLF_color %107
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %108
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %112 = OpLabel
+        %113 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %113
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %91
+        %115 = OpLabel
+        %116 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %116
+        %117 = OpFunctionCall %void %main_1
+        %119 = OpLoad %v4float %x_GLF_color
+        %120 = OpCompositeConstruct %main_out %119
+        %118 = OpFunctionCall %void %tint_symbol_3 %120
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-pre-increase/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-pre-increase/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..4135af8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-add-sub-pre-increase/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,93 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_12 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn f1_() -> i32 {
+  var i : i32;
+  var A : array<i32, 10>;
+  var a : i32;
+  let x_56 : i32 = x_8.x_GLF_uniform_int_values[2];
+  i = x_56;
+  loop {
+    let x_61 : i32 = i;
+    let x_63 : i32 = x_8.x_GLF_uniform_int_values[0];
+    if ((x_61 < x_63)) {
+    } else {
+      break;
+    }
+    let x_66 : i32 = i;
+    let x_68 : i32 = x_8.x_GLF_uniform_int_values[2];
+    A[x_66] = x_68;
+
+    continuing {
+      let x_70 : i32 = i;
+      i = (x_70 + 1);
+    }
+  }
+  a = -1;
+  let x_73 : f32 = gl_FragCoord.y;
+  let x_75 : f32 = x_12.x_GLF_uniform_float_values[0];
+  if ((x_73 >= x_75)) {
+    let x_79 : i32 = a;
+    let x_80 : i32 = (x_79 + 1);
+    a = x_80;
+    let x_82 : i32 = x_8.x_GLF_uniform_int_values[1];
+    A[x_80] = x_82;
+  }
+  let x_85 : i32 = x_8.x_GLF_uniform_int_values[2];
+  let x_87 : i32 = A[x_85];
+  let x_89 : i32 = x_8.x_GLF_uniform_int_values[1];
+  if ((x_87 == x_89)) {
+    let x_94 : i32 = a;
+    let x_95 : i32 = (x_94 + 1);
+    a = x_95;
+    let x_97 : i32 = A[x_95];
+    return x_97;
+  } else {
+    let x_99 : i32 = x_8.x_GLF_uniform_int_values[1];
+    return x_99;
+  }
+  return 0;
+}
+
+fn main_1() {
+  var i_1 : i32;
+  let x_42 : i32 = f1_();
+  i_1 = x_42;
+  let x_44 : i32 = x_8.x_GLF_uniform_int_values[1];
+  let x_46 : i32 = i_1;
+  let x_48 : i32 = i_1;
+  let x_51 : i32 = x_8.x_GLF_uniform_int_values[1];
+  x_GLF_color = vec4<f32>(f32(x_44), f32(x_46), f32(x_48), f32(x_51));
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-pack-unpack/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-pack-unpack/0-opt.spvasm
new file mode 100644
index 0000000..8e160de
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-pack-unpack/0-opt.spvasm
@@ -0,0 +1,178 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %v1 "v1"
+               OpName %ref "ref"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+      %float = OpTypeFloat 32
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf1 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_3 = OpConstant %int 3
+      %int_2 = OpConstant %int 2
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %14
+         %34 = OpLabel
+          %a = OpVariable %_ptr_Function_uint Function
+         %v1 = OpVariable %_ptr_Function_v4float Function
+        %ref = OpVariable %_ptr_Function_v4float Function
+         %35 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %36 = OpLoad %float %35
+         %37 = OpCompositeConstruct %v4float %36 %36 %36 %36
+         %38 = OpExtInst %uint %1 PackUnorm4x8 %37
+               OpStore %a %38
+         %39 = OpLoad %uint %a
+         %40 = OpExtInst %v4float %1 UnpackSnorm4x8 %39
+               OpStore %v1 %40
+         %41 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %42 = OpLoad %float %41
+         %43 = OpFNegate %float %42
+         %44 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %45 = OpLoad %float %44
+         %46 = OpFDiv %float %43 %45
+         %47 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %48 = OpLoad %float %47
+         %49 = OpFNegate %float %48
+         %50 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %51 = OpLoad %float %50
+         %52 = OpFDiv %float %49 %51
+         %53 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %54 = OpLoad %float %53
+         %55 = OpFNegate %float %54
+         %56 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %57 = OpLoad %float %56
+         %58 = OpFDiv %float %55 %57
+         %59 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %60 = OpLoad %float %59
+         %61 = OpFNegate %float %60
+         %62 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %63 = OpLoad %float %62
+         %64 = OpFDiv %float %61 %63
+         %65 = OpCompositeConstruct %v4float %46 %52 %58 %64
+               OpStore %ref %65
+         %66 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %67 = OpLoad %int %66
+         %68 = OpAccessChain %_ptr_Function_float %v1 %67
+         %69 = OpLoad %float %68
+         %70 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %71 = OpLoad %int %70
+         %72 = OpAccessChain %_ptr_Function_float %ref %71
+         %73 = OpLoad %float %72
+         %74 = OpFOrdEqual %bool %69 %73
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %75
+         %76 = OpLabel
+         %77 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_3
+         %78 = OpLoad %int %77
+         %79 = OpAccessChain %_ptr_Function_float %v1 %78
+         %80 = OpLoad %float %79
+         %81 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %82 = OpLoad %int %81
+         %83 = OpAccessChain %_ptr_Function_float %ref %82
+         %84 = OpLoad %float %83
+         %85 = OpFOrdEqual %bool %80 %84
+               OpBranch %75
+         %75 = OpLabel
+         %86 = OpPhi %bool %74 %34 %85 %76
+               OpSelectionMerge %87 None
+               OpBranchConditional %86 %88 %87
+         %88 = OpLabel
+         %89 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %90 = OpLoad %int %89
+         %91 = OpAccessChain %_ptr_Function_float %v1 %90
+         %92 = OpLoad %float %91
+         %93 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_3
+         %94 = OpLoad %int %93
+         %95 = OpAccessChain %_ptr_Function_float %ref %94
+         %96 = OpLoad %float %95
+         %97 = OpFOrdEqual %bool %92 %96
+               OpBranch %87
+         %87 = OpLabel
+         %98 = OpPhi %bool %86 %75 %97 %88
+               OpSelectionMerge %99 None
+               OpBranchConditional %98 %100 %99
+        %100 = OpLabel
+        %101 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+        %102 = OpLoad %int %101
+        %103 = OpAccessChain %_ptr_Function_float %v1 %102
+        %104 = OpLoad %float %103
+        %105 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %106 = OpLoad %int %105
+        %107 = OpAccessChain %_ptr_Function_float %ref %106
+        %108 = OpLoad %float %107
+        %109 = OpFOrdEqual %bool %104 %108
+               OpBranch %99
+         %99 = OpLabel
+        %110 = OpPhi %bool %98 %87 %109 %100
+               OpSelectionMerge %111 None
+               OpBranchConditional %110 %112 %113
+        %112 = OpLabel
+        %114 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_3
+        %115 = OpLoad %int %114
+        %116 = OpConvertSToF %float %115
+        %117 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %118 = OpLoad %int %117
+        %119 = OpConvertSToF %float %118
+        %120 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %121 = OpLoad %int %120
+        %122 = OpConvertSToF %float %121
+        %123 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_3
+        %124 = OpLoad %int %123
+        %125 = OpConvertSToF %float %124
+        %126 = OpCompositeConstruct %v4float %116 %119 %122 %125
+               OpStore %_GLF_color %126
+               OpBranch %111
+        %113 = OpLabel
+        %127 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %128 = OpLoad %int %127
+        %129 = OpAccessChain %_ptr_Function_float %v1 %128
+        %130 = OpLoad %float %129
+        %131 = OpCompositeConstruct %v4float %130 %130 %130 %130
+               OpStore %_GLF_color %131
+               OpBranch %111
+        %111 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-pack-unpack/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-pack-unpack/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..67cbab7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-pack-unpack/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,109 @@
+uint tint_pack4x8unorm(float4 param_0) {
+  uint4 i = uint4(round(clamp(param_0, 0.0, 1.0) * 255.0));
+  return (i.x | i.y << 8 | i.z << 16 | i.w << 24);
+}
+
+float4 tint_unpack4x8snorm(uint param_0) {
+  int j = int(param_0);
+  int4 i = int4(j << 24, j << 16, j << 8, j) >> 24;
+  return clamp(float4(i) / 127.0, -1.0, 1.0);
+}
+
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+cbuffer cbuffer_x_10 : register(b1, space0) {
+  uint4 x_10[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  uint a = 0u;
+  float4 v1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 ref = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  bool x_85 = false;
+  bool x_97 = false;
+  bool x_109 = false;
+  bool x_86_phi = false;
+  bool x_98_phi = false;
+  bool x_110_phi = false;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_36 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  a = tint_pack4x8unorm(float4(x_36, x_36, x_36, x_36));
+  v1 = tint_unpack4x8snorm(a);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_42 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const float x_45 = asfloat(x_6[1].x);
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const float x_48 = asfloat(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  const float x_51 = asfloat(x_6[1].x);
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const float x_54 = asfloat(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  const float x_57 = asfloat(x_6[1].x);
+  const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+  const float x_60 = asfloat(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+  const float x_63 = asfloat(x_6[1].x);
+  ref = float4((-(x_42) / x_45), (-(x_48) / x_51), (-(x_54) / x_57), (-(x_60) / x_63));
+  const int x_67 = asint(x_10[1].x);
+  const float x_69 = v1[x_67];
+  const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+  const int x_71 = asint(x_10[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+  const float x_73 = ref[x_71];
+  const bool x_74 = (x_69 == x_73);
+  x_86_phi = x_74;
+  if (x_74) {
+    const int x_78 = asint(x_10[3].x);
+    const float x_80 = v1[x_78];
+    const int x_82 = asint(x_10[2].x);
+    const float x_84 = ref[x_82];
+    x_85 = (x_80 == x_84);
+    x_86_phi = x_85;
+  }
+  const bool x_86 = x_86_phi;
+  x_98_phi = x_86;
+  if (x_86) {
+    const int x_90 = asint(x_10[2].x);
+    const float x_92 = v1[x_90];
+    const int x_94 = asint(x_10[3].x);
+    const float x_96 = ref[x_94];
+    x_97 = (x_92 == x_96);
+    x_98_phi = x_97;
+  }
+  const bool x_98 = x_98_phi;
+  x_110_phi = x_98;
+  if (x_98) {
+    const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+    const int x_102 = asint(x_10[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+    const float x_104 = v1[x_102];
+    const int x_106 = asint(x_10[1].x);
+    const float x_108 = ref[x_106];
+    x_109 = (x_104 == x_108);
+    x_110_phi = x_109;
+  }
+  if (x_110_phi) {
+    const int x_115 = asint(x_10[3].x);
+    const int x_118 = asint(x_10[1].x);
+    const int x_121 = asint(x_10[1].x);
+    const int x_124 = asint(x_10[3].x);
+    x_GLF_color = float4(float(x_115), float(x_118), float(x_121), float(x_124));
+  } else {
+    const int x_128 = asint(x_10[1].x);
+    const float x_130 = v1[x_128];
+    x_GLF_color = float4(x_130, x_130, x_130, x_130);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-pack-unpack/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-pack-unpack/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..d135092
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-pack-unpack/0-opt.spvasm.expected.msl
@@ -0,0 +1,110 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[4];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_10, thread float4* const tint_symbol_4) {
+  uint a = 0u;
+  float4 v1 = 0.0f;
+  float4 ref = 0.0f;
+  bool x_85 = false;
+  bool x_97 = false;
+  bool x_109 = false;
+  bool x_86_phi = false;
+  bool x_98_phi = false;
+  bool x_110_phi = false;
+  float const x_36 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  a = pack_float_to_unorm4x8(float4(x_36, x_36, x_36, x_36));
+  uint const x_39 = a;
+  v1 = unpack_snorm4x8_to_float(x_39);
+  float const x_42 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_45 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  float const x_48 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_51 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  float const x_54 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_57 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  float const x_60 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_63 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  ref = float4((-(x_42) / x_45), (-(x_48) / x_51), (-(x_54) / x_57), (-(x_60) / x_63));
+  int const x_67 = x_10.x_GLF_uniform_int_values.arr[1].el;
+  float const x_69 = v1[x_67];
+  int const x_71 = x_10.x_GLF_uniform_int_values.arr[0].el;
+  float const x_73 = ref[x_71];
+  bool const x_74 = (x_69 == x_73);
+  x_86_phi = x_74;
+  if (x_74) {
+    int const x_78 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    float const x_80 = v1[x_78];
+    int const x_82 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    float const x_84 = ref[x_82];
+    x_85 = (x_80 == x_84);
+    x_86_phi = x_85;
+  }
+  bool const x_86 = x_86_phi;
+  x_98_phi = x_86;
+  if (x_86) {
+    int const x_90 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    float const x_92 = v1[x_90];
+    int const x_94 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    float const x_96 = ref[x_94];
+    x_97 = (x_92 == x_96);
+    x_98_phi = x_97;
+  }
+  bool const x_98 = x_98_phi;
+  x_110_phi = x_98;
+  if (x_98) {
+    int const x_102 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    float const x_104 = v1[x_102];
+    int const x_106 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    float const x_108 = ref[x_106];
+    x_109 = (x_104 == x_108);
+    x_110_phi = x_109;
+  }
+  bool const x_110 = x_110_phi;
+  if (x_110) {
+    int const x_115 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    int const x_118 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_121 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_124 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    *(tint_symbol_4) = float4(float(x_115), float(x_118), float(x_121), float(x_124));
+  } else {
+    int const x_128 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    float const x_130 = v1[x_128];
+    *(tint_symbol_4) = float4(x_130, x_130, x_130, x_130);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_10 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-pack-unpack/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-pack-unpack/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..a1804d0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-pack-unpack/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,239 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 160
+; Schema: 0
+               OpCapability Shader
+         %45 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %v1 "v1"
+               OpName %ref "ref"
+               OpName %x_85 "x_85"
+               OpName %x_97 "x_97"
+               OpName %x_109 "x_109"
+               OpName %x_86_phi "x_86_phi"
+               OpName %x_98_phi "x_98_phi"
+               OpName %x_110_phi "x_110_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf1 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_10 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_uint = OpTypePointer Function %uint
+         %26 = OpConstantNull %uint
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %33 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_3 = OpConstant %int 3
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+        %148 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+          %a = OpVariable %_ptr_Function_uint Function %26
+         %v1 = OpVariable %_ptr_Function_v4float Function %17
+        %ref = OpVariable %_ptr_Function_v4float Function %17
+       %x_85 = OpVariable %_ptr_Function_bool Function %33
+       %x_97 = OpVariable %_ptr_Function_bool Function %33
+      %x_109 = OpVariable %_ptr_Function_bool Function %33
+   %x_86_phi = OpVariable %_ptr_Function_bool Function %33
+   %x_98_phi = OpVariable %_ptr_Function_bool Function %33
+  %x_110_phi = OpVariable %_ptr_Function_bool Function %33
+         %42 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %43 = OpLoad %float %42
+         %46 = OpCompositeConstruct %v4float %43 %43 %43 %43
+         %44 = OpExtInst %uint %45 PackUnorm4x8 %46
+               OpStore %a %44
+         %47 = OpLoad %uint %a
+         %48 = OpExtInst %v4float %45 UnpackSnorm4x8 %47
+               OpStore %v1 %48
+         %49 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %50 = OpLoad %float %49
+         %52 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %53 = OpLoad %float %52
+         %54 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %55 = OpLoad %float %54
+         %56 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %57 = OpLoad %float %56
+         %58 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %59 = OpLoad %float %58
+         %60 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %61 = OpLoad %float %60
+         %62 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %63 = OpLoad %float %62
+         %64 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %65 = OpLoad %float %64
+         %66 = OpFNegate %float %50
+         %67 = OpFDiv %float %66 %53
+         %68 = OpFNegate %float %55
+         %69 = OpFDiv %float %68 %57
+         %70 = OpFNegate %float %59
+         %71 = OpFDiv %float %70 %61
+         %72 = OpFNegate %float %63
+         %73 = OpFDiv %float %72 %65
+         %74 = OpCompositeConstruct %v4float %67 %69 %71 %73
+               OpStore %ref %74
+         %76 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %77 = OpLoad %int %76
+         %79 = OpAccessChain %_ptr_Function_float %v1 %77
+         %80 = OpLoad %float %79
+         %81 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %82 = OpLoad %int %81
+         %83 = OpAccessChain %_ptr_Function_float %ref %82
+         %84 = OpLoad %float %83
+         %85 = OpFOrdEqual %bool %80 %84
+               OpStore %x_86_phi %85
+               OpSelectionMerge %86 None
+               OpBranchConditional %85 %87 %86
+         %87 = OpLabel
+         %89 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+         %90 = OpLoad %int %89
+         %91 = OpAccessChain %_ptr_Function_float %v1 %90
+         %92 = OpLoad %float %91
+         %94 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+         %95 = OpLoad %int %94
+         %96 = OpAccessChain %_ptr_Function_float %ref %95
+         %97 = OpLoad %float %96
+         %98 = OpFOrdEqual %bool %92 %97
+               OpStore %x_85 %98
+         %99 = OpLoad %bool %x_85
+               OpStore %x_86_phi %99
+               OpBranch %86
+         %86 = OpLabel
+        %100 = OpLoad %bool %x_86_phi
+               OpStore %x_98_phi %100
+               OpSelectionMerge %101 None
+               OpBranchConditional %100 %102 %101
+        %102 = OpLabel
+        %103 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %104 = OpLoad %int %103
+        %105 = OpAccessChain %_ptr_Function_float %v1 %104
+        %106 = OpLoad %float %105
+        %107 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+        %108 = OpLoad %int %107
+        %109 = OpAccessChain %_ptr_Function_float %ref %108
+        %110 = OpLoad %float %109
+        %111 = OpFOrdEqual %bool %106 %110
+               OpStore %x_97 %111
+        %112 = OpLoad %bool %x_97
+               OpStore %x_98_phi %112
+               OpBranch %101
+        %101 = OpLabel
+        %113 = OpLoad %bool %x_98_phi
+               OpStore %x_110_phi %113
+               OpSelectionMerge %114 None
+               OpBranchConditional %113 %115 %114
+        %115 = OpLabel
+        %116 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %117 = OpLoad %int %116
+        %118 = OpAccessChain %_ptr_Function_float %v1 %117
+        %119 = OpLoad %float %118
+        %120 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %121 = OpLoad %int %120
+        %122 = OpAccessChain %_ptr_Function_float %ref %121
+        %123 = OpLoad %float %122
+        %124 = OpFOrdEqual %bool %119 %123
+               OpStore %x_109 %124
+        %125 = OpLoad %bool %x_109
+               OpStore %x_110_phi %125
+               OpBranch %114
+        %114 = OpLabel
+        %126 = OpLoad %bool %x_110_phi
+               OpSelectionMerge %127 None
+               OpBranchConditional %126 %128 %129
+        %128 = OpLabel
+        %130 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+        %131 = OpLoad %int %130
+        %132 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %133 = OpLoad %int %132
+        %134 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %135 = OpLoad %int %134
+        %136 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+        %137 = OpLoad %int %136
+        %138 = OpConvertSToF %float %131
+        %139 = OpConvertSToF %float %133
+        %140 = OpConvertSToF %float %135
+        %141 = OpConvertSToF %float %137
+        %142 = OpCompositeConstruct %v4float %138 %139 %140 %141
+               OpStore %x_GLF_color %142
+               OpBranch %127
+        %129 = OpLabel
+        %143 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %144 = OpLoad %int %143
+        %145 = OpAccessChain %_ptr_Function_float %v1 %144
+        %146 = OpLoad %float %145
+        %147 = OpCompositeConstruct %v4float %146 %146 %146 %146
+               OpStore %x_GLF_color %147
+               OpBranch %127
+        %127 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %148
+%tint_symbol = OpFunctionParameter %main_out
+        %152 = OpLabel
+        %153 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %153
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %155 = OpLabel
+        %156 = OpFunctionCall %void %main_1
+        %158 = OpLoad %v4float %x_GLF_color
+        %159 = OpCompositeConstruct %main_out %158
+        %157 = OpFunctionCall %void %tint_symbol_2 %159
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-pack-unpack/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-pack-unpack/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..281628c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-pack-unpack/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,102 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : u32;
+  var v1 : vec4<f32>;
+  var ref : vec4<f32>;
+  var x_85 : bool;
+  var x_97 : bool;
+  var x_109 : bool;
+  var x_86_phi : bool;
+  var x_98_phi : bool;
+  var x_110_phi : bool;
+  let x_36 : f32 = x_6.x_GLF_uniform_float_values[0];
+  a = pack4x8unorm(vec4<f32>(x_36, x_36, x_36, x_36));
+  let x_39 : u32 = a;
+  v1 = unpack4x8snorm(x_39);
+  let x_42 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_45 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_48 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_51 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_54 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_57 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_60 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_63 : f32 = x_6.x_GLF_uniform_float_values[1];
+  ref = vec4<f32>((-(x_42) / x_45), (-(x_48) / x_51), (-(x_54) / x_57), (-(x_60) / x_63));
+  let x_67 : i32 = x_10.x_GLF_uniform_int_values[1];
+  let x_69 : f32 = v1[x_67];
+  let x_71 : i32 = x_10.x_GLF_uniform_int_values[0];
+  let x_73 : f32 = ref[x_71];
+  let x_74 : bool = (x_69 == x_73);
+  x_86_phi = x_74;
+  if (x_74) {
+    let x_78 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_80 : f32 = v1[x_78];
+    let x_82 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_84 : f32 = ref[x_82];
+    x_85 = (x_80 == x_84);
+    x_86_phi = x_85;
+  }
+  let x_86 : bool = x_86_phi;
+  x_98_phi = x_86;
+  if (x_86) {
+    let x_90 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_92 : f32 = v1[x_90];
+    let x_94 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_96 : f32 = ref[x_94];
+    x_97 = (x_92 == x_96);
+    x_98_phi = x_97;
+  }
+  let x_98 : bool = x_98_phi;
+  x_110_phi = x_98;
+  if (x_98) {
+    let x_102 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_104 : f32 = v1[x_102];
+    let x_106 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_108 : f32 = ref[x_106];
+    x_109 = (x_104 == x_108);
+    x_110_phi = x_109;
+  }
+  let x_110 : bool = x_110_phi;
+  if (x_110) {
+    let x_115 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_118 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_121 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_124 : i32 = x_10.x_GLF_uniform_int_values[3];
+    x_GLF_color = vec4<f32>(f32(x_115), f32(x_118), f32(x_121), f32(x_124));
+  } else {
+    let x_128 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_130 : f32 = v1[x_128];
+    x_GLF_color = vec4<f32>(x_130, x_130, x_130, x_130);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-pack-unpack/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-pack-unpack/0-opt.wgsl
new file mode 100644
index 0000000..281628c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-pack-unpack/0-opt.wgsl
@@ -0,0 +1,102 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : u32;
+  var v1 : vec4<f32>;
+  var ref : vec4<f32>;
+  var x_85 : bool;
+  var x_97 : bool;
+  var x_109 : bool;
+  var x_86_phi : bool;
+  var x_98_phi : bool;
+  var x_110_phi : bool;
+  let x_36 : f32 = x_6.x_GLF_uniform_float_values[0];
+  a = pack4x8unorm(vec4<f32>(x_36, x_36, x_36, x_36));
+  let x_39 : u32 = a;
+  v1 = unpack4x8snorm(x_39);
+  let x_42 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_45 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_48 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_51 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_54 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_57 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_60 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_63 : f32 = x_6.x_GLF_uniform_float_values[1];
+  ref = vec4<f32>((-(x_42) / x_45), (-(x_48) / x_51), (-(x_54) / x_57), (-(x_60) / x_63));
+  let x_67 : i32 = x_10.x_GLF_uniform_int_values[1];
+  let x_69 : f32 = v1[x_67];
+  let x_71 : i32 = x_10.x_GLF_uniform_int_values[0];
+  let x_73 : f32 = ref[x_71];
+  let x_74 : bool = (x_69 == x_73);
+  x_86_phi = x_74;
+  if (x_74) {
+    let x_78 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_80 : f32 = v1[x_78];
+    let x_82 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_84 : f32 = ref[x_82];
+    x_85 = (x_80 == x_84);
+    x_86_phi = x_85;
+  }
+  let x_86 : bool = x_86_phi;
+  x_98_phi = x_86;
+  if (x_86) {
+    let x_90 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_92 : f32 = v1[x_90];
+    let x_94 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_96 : f32 = ref[x_94];
+    x_97 = (x_92 == x_96);
+    x_98_phi = x_97;
+  }
+  let x_98 : bool = x_98_phi;
+  x_110_phi = x_98;
+  if (x_98) {
+    let x_102 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_104 : f32 = v1[x_102];
+    let x_106 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_108 : f32 = ref[x_106];
+    x_109 = (x_104 == x_108);
+    x_110_phi = x_109;
+  }
+  let x_110 : bool = x_110_phi;
+  if (x_110) {
+    let x_115 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_118 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_121 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_124 : i32 = x_10.x_GLF_uniform_int_values[3];
+    x_GLF_color = vec4<f32>(f32(x_115), f32(x_118), f32(x_121), f32(x_124));
+  } else {
+    let x_128 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_130 : f32 = v1[x_128];
+    x_GLF_color = vec4<f32>(x_130, x_130, x_130, x_130);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-pack-unpack/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-pack-unpack/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..67cbab7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-pack-unpack/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,109 @@
+uint tint_pack4x8unorm(float4 param_0) {
+  uint4 i = uint4(round(clamp(param_0, 0.0, 1.0) * 255.0));
+  return (i.x | i.y << 8 | i.z << 16 | i.w << 24);
+}
+
+float4 tint_unpack4x8snorm(uint param_0) {
+  int j = int(param_0);
+  int4 i = int4(j << 24, j << 16, j << 8, j) >> 24;
+  return clamp(float4(i) / 127.0, -1.0, 1.0);
+}
+
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+cbuffer cbuffer_x_10 : register(b1, space0) {
+  uint4 x_10[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  uint a = 0u;
+  float4 v1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 ref = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  bool x_85 = false;
+  bool x_97 = false;
+  bool x_109 = false;
+  bool x_86_phi = false;
+  bool x_98_phi = false;
+  bool x_110_phi = false;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_36 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  a = tint_pack4x8unorm(float4(x_36, x_36, x_36, x_36));
+  v1 = tint_unpack4x8snorm(a);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_42 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const float x_45 = asfloat(x_6[1].x);
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const float x_48 = asfloat(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  const float x_51 = asfloat(x_6[1].x);
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const float x_54 = asfloat(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  const float x_57 = asfloat(x_6[1].x);
+  const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+  const float x_60 = asfloat(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+  const float x_63 = asfloat(x_6[1].x);
+  ref = float4((-(x_42) / x_45), (-(x_48) / x_51), (-(x_54) / x_57), (-(x_60) / x_63));
+  const int x_67 = asint(x_10[1].x);
+  const float x_69 = v1[x_67];
+  const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+  const int x_71 = asint(x_10[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+  const float x_73 = ref[x_71];
+  const bool x_74 = (x_69 == x_73);
+  x_86_phi = x_74;
+  if (x_74) {
+    const int x_78 = asint(x_10[3].x);
+    const float x_80 = v1[x_78];
+    const int x_82 = asint(x_10[2].x);
+    const float x_84 = ref[x_82];
+    x_85 = (x_80 == x_84);
+    x_86_phi = x_85;
+  }
+  const bool x_86 = x_86_phi;
+  x_98_phi = x_86;
+  if (x_86) {
+    const int x_90 = asint(x_10[2].x);
+    const float x_92 = v1[x_90];
+    const int x_94 = asint(x_10[3].x);
+    const float x_96 = ref[x_94];
+    x_97 = (x_92 == x_96);
+    x_98_phi = x_97;
+  }
+  const bool x_98 = x_98_phi;
+  x_110_phi = x_98;
+  if (x_98) {
+    const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+    const int x_102 = asint(x_10[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+    const float x_104 = v1[x_102];
+    const int x_106 = asint(x_10[1].x);
+    const float x_108 = ref[x_106];
+    x_109 = (x_104 == x_108);
+    x_110_phi = x_109;
+  }
+  if (x_110_phi) {
+    const int x_115 = asint(x_10[3].x);
+    const int x_118 = asint(x_10[1].x);
+    const int x_121 = asint(x_10[1].x);
+    const int x_124 = asint(x_10[3].x);
+    x_GLF_color = float4(float(x_115), float(x_118), float(x_121), float(x_124));
+  } else {
+    const int x_128 = asint(x_10[1].x);
+    const float x_130 = v1[x_128];
+    x_GLF_color = float4(x_130, x_130, x_130, x_130);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-pack-unpack/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-pack-unpack/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..d135092
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-pack-unpack/0-opt.wgsl.expected.msl
@@ -0,0 +1,110 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[4];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_10, thread float4* const tint_symbol_4) {
+  uint a = 0u;
+  float4 v1 = 0.0f;
+  float4 ref = 0.0f;
+  bool x_85 = false;
+  bool x_97 = false;
+  bool x_109 = false;
+  bool x_86_phi = false;
+  bool x_98_phi = false;
+  bool x_110_phi = false;
+  float const x_36 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  a = pack_float_to_unorm4x8(float4(x_36, x_36, x_36, x_36));
+  uint const x_39 = a;
+  v1 = unpack_snorm4x8_to_float(x_39);
+  float const x_42 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_45 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  float const x_48 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_51 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  float const x_54 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_57 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  float const x_60 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_63 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  ref = float4((-(x_42) / x_45), (-(x_48) / x_51), (-(x_54) / x_57), (-(x_60) / x_63));
+  int const x_67 = x_10.x_GLF_uniform_int_values.arr[1].el;
+  float const x_69 = v1[x_67];
+  int const x_71 = x_10.x_GLF_uniform_int_values.arr[0].el;
+  float const x_73 = ref[x_71];
+  bool const x_74 = (x_69 == x_73);
+  x_86_phi = x_74;
+  if (x_74) {
+    int const x_78 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    float const x_80 = v1[x_78];
+    int const x_82 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    float const x_84 = ref[x_82];
+    x_85 = (x_80 == x_84);
+    x_86_phi = x_85;
+  }
+  bool const x_86 = x_86_phi;
+  x_98_phi = x_86;
+  if (x_86) {
+    int const x_90 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    float const x_92 = v1[x_90];
+    int const x_94 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    float const x_96 = ref[x_94];
+    x_97 = (x_92 == x_96);
+    x_98_phi = x_97;
+  }
+  bool const x_98 = x_98_phi;
+  x_110_phi = x_98;
+  if (x_98) {
+    int const x_102 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    float const x_104 = v1[x_102];
+    int const x_106 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    float const x_108 = ref[x_106];
+    x_109 = (x_104 == x_108);
+    x_110_phi = x_109;
+  }
+  bool const x_110 = x_110_phi;
+  if (x_110) {
+    int const x_115 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    int const x_118 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_121 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_124 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    *(tint_symbol_4) = float4(float(x_115), float(x_118), float(x_121), float(x_124));
+  } else {
+    int const x_128 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    float const x_130 = v1[x_128];
+    *(tint_symbol_4) = float4(x_130, x_130, x_130, x_130);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_10 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-pack-unpack/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-pack-unpack/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..a1804d0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-pack-unpack/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,239 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 160
+; Schema: 0
+               OpCapability Shader
+         %45 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %v1 "v1"
+               OpName %ref "ref"
+               OpName %x_85 "x_85"
+               OpName %x_97 "x_97"
+               OpName %x_109 "x_109"
+               OpName %x_86_phi "x_86_phi"
+               OpName %x_98_phi "x_98_phi"
+               OpName %x_110_phi "x_110_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf1 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_10 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_uint = OpTypePointer Function %uint
+         %26 = OpConstantNull %uint
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %33 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_3 = OpConstant %int 3
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+        %148 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+          %a = OpVariable %_ptr_Function_uint Function %26
+         %v1 = OpVariable %_ptr_Function_v4float Function %17
+        %ref = OpVariable %_ptr_Function_v4float Function %17
+       %x_85 = OpVariable %_ptr_Function_bool Function %33
+       %x_97 = OpVariable %_ptr_Function_bool Function %33
+      %x_109 = OpVariable %_ptr_Function_bool Function %33
+   %x_86_phi = OpVariable %_ptr_Function_bool Function %33
+   %x_98_phi = OpVariable %_ptr_Function_bool Function %33
+  %x_110_phi = OpVariable %_ptr_Function_bool Function %33
+         %42 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %43 = OpLoad %float %42
+         %46 = OpCompositeConstruct %v4float %43 %43 %43 %43
+         %44 = OpExtInst %uint %45 PackUnorm4x8 %46
+               OpStore %a %44
+         %47 = OpLoad %uint %a
+         %48 = OpExtInst %v4float %45 UnpackSnorm4x8 %47
+               OpStore %v1 %48
+         %49 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %50 = OpLoad %float %49
+         %52 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %53 = OpLoad %float %52
+         %54 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %55 = OpLoad %float %54
+         %56 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %57 = OpLoad %float %56
+         %58 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %59 = OpLoad %float %58
+         %60 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %61 = OpLoad %float %60
+         %62 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %63 = OpLoad %float %62
+         %64 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %65 = OpLoad %float %64
+         %66 = OpFNegate %float %50
+         %67 = OpFDiv %float %66 %53
+         %68 = OpFNegate %float %55
+         %69 = OpFDiv %float %68 %57
+         %70 = OpFNegate %float %59
+         %71 = OpFDiv %float %70 %61
+         %72 = OpFNegate %float %63
+         %73 = OpFDiv %float %72 %65
+         %74 = OpCompositeConstruct %v4float %67 %69 %71 %73
+               OpStore %ref %74
+         %76 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %77 = OpLoad %int %76
+         %79 = OpAccessChain %_ptr_Function_float %v1 %77
+         %80 = OpLoad %float %79
+         %81 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %82 = OpLoad %int %81
+         %83 = OpAccessChain %_ptr_Function_float %ref %82
+         %84 = OpLoad %float %83
+         %85 = OpFOrdEqual %bool %80 %84
+               OpStore %x_86_phi %85
+               OpSelectionMerge %86 None
+               OpBranchConditional %85 %87 %86
+         %87 = OpLabel
+         %89 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+         %90 = OpLoad %int %89
+         %91 = OpAccessChain %_ptr_Function_float %v1 %90
+         %92 = OpLoad %float %91
+         %94 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+         %95 = OpLoad %int %94
+         %96 = OpAccessChain %_ptr_Function_float %ref %95
+         %97 = OpLoad %float %96
+         %98 = OpFOrdEqual %bool %92 %97
+               OpStore %x_85 %98
+         %99 = OpLoad %bool %x_85
+               OpStore %x_86_phi %99
+               OpBranch %86
+         %86 = OpLabel
+        %100 = OpLoad %bool %x_86_phi
+               OpStore %x_98_phi %100
+               OpSelectionMerge %101 None
+               OpBranchConditional %100 %102 %101
+        %102 = OpLabel
+        %103 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %104 = OpLoad %int %103
+        %105 = OpAccessChain %_ptr_Function_float %v1 %104
+        %106 = OpLoad %float %105
+        %107 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+        %108 = OpLoad %int %107
+        %109 = OpAccessChain %_ptr_Function_float %ref %108
+        %110 = OpLoad %float %109
+        %111 = OpFOrdEqual %bool %106 %110
+               OpStore %x_97 %111
+        %112 = OpLoad %bool %x_97
+               OpStore %x_98_phi %112
+               OpBranch %101
+        %101 = OpLabel
+        %113 = OpLoad %bool %x_98_phi
+               OpStore %x_110_phi %113
+               OpSelectionMerge %114 None
+               OpBranchConditional %113 %115 %114
+        %115 = OpLabel
+        %116 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %117 = OpLoad %int %116
+        %118 = OpAccessChain %_ptr_Function_float %v1 %117
+        %119 = OpLoad %float %118
+        %120 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %121 = OpLoad %int %120
+        %122 = OpAccessChain %_ptr_Function_float %ref %121
+        %123 = OpLoad %float %122
+        %124 = OpFOrdEqual %bool %119 %123
+               OpStore %x_109 %124
+        %125 = OpLoad %bool %x_109
+               OpStore %x_110_phi %125
+               OpBranch %114
+        %114 = OpLabel
+        %126 = OpLoad %bool %x_110_phi
+               OpSelectionMerge %127 None
+               OpBranchConditional %126 %128 %129
+        %128 = OpLabel
+        %130 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+        %131 = OpLoad %int %130
+        %132 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %133 = OpLoad %int %132
+        %134 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %135 = OpLoad %int %134
+        %136 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+        %137 = OpLoad %int %136
+        %138 = OpConvertSToF %float %131
+        %139 = OpConvertSToF %float %133
+        %140 = OpConvertSToF %float %135
+        %141 = OpConvertSToF %float %137
+        %142 = OpCompositeConstruct %v4float %138 %139 %140 %141
+               OpStore %x_GLF_color %142
+               OpBranch %127
+        %129 = OpLabel
+        %143 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %144 = OpLoad %int %143
+        %145 = OpAccessChain %_ptr_Function_float %v1 %144
+        %146 = OpLoad %float %145
+        %147 = OpCompositeConstruct %v4float %146 %146 %146 %146
+               OpStore %x_GLF_color %147
+               OpBranch %127
+        %127 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %148
+%tint_symbol = OpFunctionParameter %main_out
+        %152 = OpLabel
+        %153 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %153
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %155 = OpLabel
+        %156 = OpFunctionCall %void %main_1
+        %158 = OpLoad %v4float %x_GLF_color
+        %159 = OpCompositeConstruct %main_out %158
+        %157 = OpFunctionCall %void %tint_symbol_2 %159
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-pack-unpack/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-pack-unpack/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..281628c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-pack-unpack/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,102 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : u32;
+  var v1 : vec4<f32>;
+  var ref : vec4<f32>;
+  var x_85 : bool;
+  var x_97 : bool;
+  var x_109 : bool;
+  var x_86_phi : bool;
+  var x_98_phi : bool;
+  var x_110_phi : bool;
+  let x_36 : f32 = x_6.x_GLF_uniform_float_values[0];
+  a = pack4x8unorm(vec4<f32>(x_36, x_36, x_36, x_36));
+  let x_39 : u32 = a;
+  v1 = unpack4x8snorm(x_39);
+  let x_42 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_45 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_48 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_51 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_54 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_57 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_60 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_63 : f32 = x_6.x_GLF_uniform_float_values[1];
+  ref = vec4<f32>((-(x_42) / x_45), (-(x_48) / x_51), (-(x_54) / x_57), (-(x_60) / x_63));
+  let x_67 : i32 = x_10.x_GLF_uniform_int_values[1];
+  let x_69 : f32 = v1[x_67];
+  let x_71 : i32 = x_10.x_GLF_uniform_int_values[0];
+  let x_73 : f32 = ref[x_71];
+  let x_74 : bool = (x_69 == x_73);
+  x_86_phi = x_74;
+  if (x_74) {
+    let x_78 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_80 : f32 = v1[x_78];
+    let x_82 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_84 : f32 = ref[x_82];
+    x_85 = (x_80 == x_84);
+    x_86_phi = x_85;
+  }
+  let x_86 : bool = x_86_phi;
+  x_98_phi = x_86;
+  if (x_86) {
+    let x_90 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_92 : f32 = v1[x_90];
+    let x_94 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_96 : f32 = ref[x_94];
+    x_97 = (x_92 == x_96);
+    x_98_phi = x_97;
+  }
+  let x_98 : bool = x_98_phi;
+  x_110_phi = x_98;
+  if (x_98) {
+    let x_102 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_104 : f32 = v1[x_102];
+    let x_106 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_108 : f32 = ref[x_106];
+    x_109 = (x_104 == x_108);
+    x_110_phi = x_109;
+  }
+  let x_110 : bool = x_110_phi;
+  if (x_110) {
+    let x_115 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_118 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_121 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_124 : i32 = x_10.x_GLF_uniform_int_values[3];
+    x_GLF_color = vec4<f32>(f32(x_115), f32(x_118), f32(x_121), f32(x_124));
+  } else {
+    let x_128 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_130 : f32 = v1[x_128];
+    x_GLF_color = vec4<f32>(x_130, x_130, x_130, x_130);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.spvasm
new file mode 100644
index 0000000..07cab15
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.spvasm
@@ -0,0 +1,133 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %count0 "count0"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %count1 "count1"
+               OpName %i "i"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_5 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_int_uint_5 = OpTypeArray %int %uint_5
+       %buf0 = OpTypeStruct %_arr_int_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_4 = OpConstant %int 4
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+      %int_3 = OpConstant %int 3
+       %main = OpFunction %void None %11
+         %27 = OpLabel
+     %count0 = OpVariable %_ptr_Function_int Function
+     %count1 = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+         %28 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %29 = OpLoad %int %28
+               OpStore %count0 %29
+         %30 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %31 = OpLoad %int %30
+               OpStore %count1 %31
+         %32 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %33 = OpLoad %int %32
+               OpStore %i %33
+               OpBranch %34
+         %34 = OpLabel
+               OpLoopMerge %35 %36 None
+               OpBranch %37
+         %37 = OpLabel
+         %38 = OpLoad %int %i
+         %39 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_4
+         %40 = OpLoad %int %39
+         %41 = OpSLessThan %bool %38 %40
+               OpBranchConditional %41 %42 %35
+         %42 = OpLabel
+         %43 = OpLoad %int %i
+               OpSelectionMerge %44 None
+               OpSwitch %43 %44 0 %45 1 %45 3 %46 2 %46
+         %45 = OpLabel
+         %47 = OpLoad %int %count0
+         %48 = OpIAdd %int %47 %int_1
+               OpStore %count0 %48
+               OpBranch %46
+         %46 = OpLabel
+         %49 = OpLoad %int %count1
+         %50 = OpIAdd %int %49 %int_1
+               OpStore %count1 %50
+               OpBranch %44
+         %44 = OpLabel
+               OpBranch %36
+         %36 = OpLabel
+         %51 = OpLoad %int %i
+         %52 = OpIAdd %int %51 %int_1
+               OpStore %i %52
+               OpBranch %34
+         %35 = OpLabel
+         %53 = OpLoad %int %count1
+         %54 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %55 = OpLoad %int %54
+         %56 = OpIEqual %bool %53 %55
+               OpSelectionMerge %57 None
+               OpBranchConditional %56 %58 %59
+         %58 = OpLabel
+         %60 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %61 = OpLoad %int %60
+         %62 = OpConvertSToF %float %61
+         %63 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %64 = OpLoad %int %63
+         %65 = OpConvertSToF %float %64
+         %66 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %67 = OpLoad %int %66
+         %68 = OpConvertSToF %float %67
+         %69 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %70 = OpLoad %int %69
+         %71 = OpConvertSToF %float %70
+         %72 = OpCompositeConstruct %v4float %62 %65 %68 %71
+               OpStore %_GLF_color %72
+               OpBranch %57
+         %59 = OpLabel
+         %73 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %74 = OpLoad %int %73
+         %75 = OpConvertSToF %float %74
+         %76 = OpCompositeConstruct %v4float %75 %75 %75 %75
+               OpStore %_GLF_color %76
+               OpBranch %57
+         %57 = OpLabel
+         %77 = OpLoad %int %count0
+         %78 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %79 = OpLoad %int %78
+         %80 = OpINotEqual %bool %77 %79
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %81
+         %82 = OpLabel
+         %83 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %84 = OpLoad %int %83
+         %85 = OpConvertSToF %float %84
+         %86 = OpCompositeConstruct %v4float %85 %85 %85 %85
+               OpStore %_GLF_color %86
+               OpBranch %81
+         %81 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..bb5b30e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,78 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[5];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int count0 = 0;
+  int count1 = 0;
+  int i = 0;
+  const int x_29 = asint(x_6[2].x);
+  count0 = x_29;
+  const int x_31 = asint(x_6[2].x);
+  count1 = x_31;
+  const int x_33 = asint(x_6[2].x);
+  i = x_33;
+  while (true) {
+    const int x_38 = i;
+    const int x_40 = asint(x_6[4].x);
+    if ((x_38 < x_40)) {
+    } else {
+      break;
+    }
+    switch(i) {
+      case 0:
+      case 1: {
+        count0 = (count0 + 1);
+        /* fallthrough */
+      }
+      case 2:
+      case 3: {
+        count1 = (count1 + 1);
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_53 = count1;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_55 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  if ((x_53 == x_55)) {
+    const int x_61 = asint(x_6[3].x);
+    const int x_64 = asint(x_6[2].x);
+    const int x_67 = asint(x_6[2].x);
+    const int x_70 = asint(x_6[3].x);
+    x_GLF_color = float4(float(x_61), float(x_64), float(x_67), float(x_70));
+  } else {
+    const int x_74 = asint(x_6[2].x);
+    const float x_75 = float(x_74);
+    x_GLF_color = float4(x_75, x_75, x_75, x_75);
+  }
+  const int x_77 = count0;
+  const int x_79 = asint(x_6[1].x);
+  if ((x_77 != x_79)) {
+    const int x_84 = asint(x_6[2].x);
+    const float x_85 = float(x_84);
+    x_GLF_color = float4(x_85, x_85, x_85, x_85);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..4f33cd7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.spvasm.expected.msl
@@ -0,0 +1,91 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[5];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int count0 = 0;
+  int count1 = 0;
+  int i = 0;
+  int const x_29 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  count0 = x_29;
+  int const x_31 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  count1 = x_31;
+  int const x_33 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  i = x_33;
+  while (true) {
+    int const x_38 = i;
+    int const x_40 = x_6.x_GLF_uniform_int_values.arr[4].el;
+    if ((x_38 < x_40)) {
+    } else {
+      break;
+    }
+    int const x_43 = i;
+    switch(x_43) {
+      case 0:
+      case 1: {
+        int const x_47 = count0;
+        count0 = (x_47 + 1);
+        /* fallthrough */
+      }
+      case 2:
+      case 3: {
+        int const x_49 = count1;
+        count1 = (x_49 + 1);
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    {
+      int const x_51 = i;
+      i = (x_51 + 1);
+    }
+  }
+  int const x_53 = count1;
+  int const x_55 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  if ((x_53 == x_55)) {
+    int const x_61 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    int const x_64 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_67 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_70 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    *(tint_symbol_4) = float4(float(x_61), float(x_64), float(x_67), float(x_70));
+  } else {
+    int const x_74 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    float const x_75 = float(x_74);
+    *(tint_symbol_4) = float4(x_75, x_75, x_75, x_75);
+  }
+  int const x_77 = count0;
+  int const x_79 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_77 != x_79)) {
+    int const x_84 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    float const x_85 = float(x_84);
+    *(tint_symbol_4) = float4(x_85, x_85, x_85, x_85);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..4075f23
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,173 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 106
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %count0 "count0"
+               OpName %count1 "count1"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_5 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_int_uint_5 = OpTypeArray %int %uint_5
+       %buf0 = OpTypeStruct %_arr_int_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_4 = OpConstant %int 4
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+      %int_0 = OpConstant %int 0
+      %int_3 = OpConstant %int 3
+   %main_out = OpTypeStruct %v4float
+         %94 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+     %count0 = OpVariable %_ptr_Function_int Function %21
+     %count1 = OpVariable %_ptr_Function_int Function %21
+          %i = OpVariable %_ptr_Function_int Function %21
+         %27 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %28 = OpLoad %int %27
+               OpStore %count0 %28
+         %29 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %30 = OpLoad %int %29
+               OpStore %count1 %30
+         %31 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %32 = OpLoad %int %31
+               OpStore %i %32
+               OpBranch %33
+         %33 = OpLabel
+               OpLoopMerge %34 %35 None
+               OpBranch %36
+         %36 = OpLabel
+         %37 = OpLoad %int %i
+         %39 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+         %40 = OpLoad %int %39
+         %41 = OpSLessThan %bool %37 %40
+               OpSelectionMerge %43 None
+               OpBranchConditional %41 %44 %45
+         %44 = OpLabel
+               OpBranch %43
+         %45 = OpLabel
+               OpBranch %34
+         %43 = OpLabel
+         %46 = OpLoad %int %i
+               OpSelectionMerge %47 None
+               OpSwitch %46 %48 0 %49 1 %49 2 %50 3 %50
+         %49 = OpLabel
+         %51 = OpLoad %int %count0
+         %53 = OpIAdd %int %51 %int_1
+               OpStore %count0 %53
+               OpBranch %50
+         %50 = OpLabel
+         %54 = OpLoad %int %count1
+         %55 = OpIAdd %int %54 %int_1
+               OpStore %count1 %55
+               OpBranch %47
+         %48 = OpLabel
+               OpBranch %47
+         %47 = OpLabel
+               OpBranch %35
+         %35 = OpLabel
+         %56 = OpLoad %int %i
+         %57 = OpIAdd %int %56 %int_1
+               OpStore %i %57
+               OpBranch %33
+         %34 = OpLabel
+         %58 = OpLoad %int %count1
+         %60 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %61 = OpLoad %int %60
+         %62 = OpIEqual %bool %58 %61
+               OpSelectionMerge %63 None
+               OpBranchConditional %62 %64 %65
+         %64 = OpLabel
+         %67 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %68 = OpLoad %int %67
+         %69 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %70 = OpLoad %int %69
+         %71 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %72 = OpLoad %int %71
+         %73 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %74 = OpLoad %int %73
+         %75 = OpConvertSToF %float %68
+         %76 = OpConvertSToF %float %70
+         %77 = OpConvertSToF %float %72
+         %78 = OpConvertSToF %float %74
+         %79 = OpCompositeConstruct %v4float %75 %76 %77 %78
+               OpStore %x_GLF_color %79
+               OpBranch %63
+         %65 = OpLabel
+         %80 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %81 = OpLoad %int %80
+         %82 = OpConvertSToF %float %81
+         %83 = OpCompositeConstruct %v4float %82 %82 %82 %82
+               OpStore %x_GLF_color %83
+               OpBranch %63
+         %63 = OpLabel
+         %84 = OpLoad %int %count0
+         %85 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %86 = OpLoad %int %85
+         %87 = OpINotEqual %bool %84 %86
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %88
+         %89 = OpLabel
+         %90 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %91 = OpLoad %int %90
+         %92 = OpConvertSToF %float %91
+         %93 = OpCompositeConstruct %v4float %92 %92 %92 %92
+               OpStore %x_GLF_color %93
+               OpBranch %88
+         %88 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %94
+%tint_symbol = OpFunctionParameter %main_out
+         %98 = OpLabel
+         %99 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %99
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %101 = OpLabel
+        %102 = OpFunctionCall %void %main_1
+        %104 = OpLoad %v4float %x_GLF_color
+        %105 = OpCompositeConstruct %main_out %104
+        %103 = OpFunctionCall %void %tint_symbol_2 %105
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..c70fd11
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,81 @@
+type Arr = [[stride(16)]] array<i32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var count0 : i32;
+  var count1 : i32;
+  var i : i32;
+  let x_29 : i32 = x_6.x_GLF_uniform_int_values[2];
+  count0 = x_29;
+  let x_31 : i32 = x_6.x_GLF_uniform_int_values[2];
+  count1 = x_31;
+  let x_33 : i32 = x_6.x_GLF_uniform_int_values[2];
+  i = x_33;
+  loop {
+    let x_38 : i32 = i;
+    let x_40 : i32 = x_6.x_GLF_uniform_int_values[4];
+    if ((x_38 < x_40)) {
+    } else {
+      break;
+    }
+    let x_43 : i32 = i;
+    switch(x_43) {
+      case 0, 1: {
+        let x_47 : i32 = count0;
+        count0 = (x_47 + 1);
+        fallthrough;
+      }
+      case 2, 3: {
+        let x_49 : i32 = count1;
+        count1 = (x_49 + 1);
+      }
+      default: {
+      }
+    }
+
+    continuing {
+      let x_51 : i32 = i;
+      i = (x_51 + 1);
+    }
+  }
+  let x_53 : i32 = count1;
+  let x_55 : i32 = x_6.x_GLF_uniform_int_values[0];
+  if ((x_53 == x_55)) {
+    let x_61 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_64 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_67 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_70 : i32 = x_6.x_GLF_uniform_int_values[3];
+    x_GLF_color = vec4<f32>(f32(x_61), f32(x_64), f32(x_67), f32(x_70));
+  } else {
+    let x_74 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_75 : f32 = f32(x_74);
+    x_GLF_color = vec4<f32>(x_75, x_75, x_75, x_75);
+  }
+  let x_77 : i32 = count0;
+  let x_79 : i32 = x_6.x_GLF_uniform_int_values[1];
+  if ((x_77 != x_79)) {
+    let x_84 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_85 : f32 = f32(x_84);
+    x_GLF_color = vec4<f32>(x_85, x_85, x_85, x_85);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.wgsl
new file mode 100644
index 0000000..c70fd11
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.wgsl
@@ -0,0 +1,81 @@
+type Arr = [[stride(16)]] array<i32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var count0 : i32;
+  var count1 : i32;
+  var i : i32;
+  let x_29 : i32 = x_6.x_GLF_uniform_int_values[2];
+  count0 = x_29;
+  let x_31 : i32 = x_6.x_GLF_uniform_int_values[2];
+  count1 = x_31;
+  let x_33 : i32 = x_6.x_GLF_uniform_int_values[2];
+  i = x_33;
+  loop {
+    let x_38 : i32 = i;
+    let x_40 : i32 = x_6.x_GLF_uniform_int_values[4];
+    if ((x_38 < x_40)) {
+    } else {
+      break;
+    }
+    let x_43 : i32 = i;
+    switch(x_43) {
+      case 0, 1: {
+        let x_47 : i32 = count0;
+        count0 = (x_47 + 1);
+        fallthrough;
+      }
+      case 2, 3: {
+        let x_49 : i32 = count1;
+        count1 = (x_49 + 1);
+      }
+      default: {
+      }
+    }
+
+    continuing {
+      let x_51 : i32 = i;
+      i = (x_51 + 1);
+    }
+  }
+  let x_53 : i32 = count1;
+  let x_55 : i32 = x_6.x_GLF_uniform_int_values[0];
+  if ((x_53 == x_55)) {
+    let x_61 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_64 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_67 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_70 : i32 = x_6.x_GLF_uniform_int_values[3];
+    x_GLF_color = vec4<f32>(f32(x_61), f32(x_64), f32(x_67), f32(x_70));
+  } else {
+    let x_74 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_75 : f32 = f32(x_74);
+    x_GLF_color = vec4<f32>(x_75, x_75, x_75, x_75);
+  }
+  let x_77 : i32 = count0;
+  let x_79 : i32 = x_6.x_GLF_uniform_int_values[1];
+  if ((x_77 != x_79)) {
+    let x_84 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_85 : f32 = f32(x_84);
+    x_GLF_color = vec4<f32>(x_85, x_85, x_85, x_85);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..bb5b30e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,78 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[5];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int count0 = 0;
+  int count1 = 0;
+  int i = 0;
+  const int x_29 = asint(x_6[2].x);
+  count0 = x_29;
+  const int x_31 = asint(x_6[2].x);
+  count1 = x_31;
+  const int x_33 = asint(x_6[2].x);
+  i = x_33;
+  while (true) {
+    const int x_38 = i;
+    const int x_40 = asint(x_6[4].x);
+    if ((x_38 < x_40)) {
+    } else {
+      break;
+    }
+    switch(i) {
+      case 0:
+      case 1: {
+        count0 = (count0 + 1);
+        /* fallthrough */
+      }
+      case 2:
+      case 3: {
+        count1 = (count1 + 1);
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_53 = count1;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_55 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  if ((x_53 == x_55)) {
+    const int x_61 = asint(x_6[3].x);
+    const int x_64 = asint(x_6[2].x);
+    const int x_67 = asint(x_6[2].x);
+    const int x_70 = asint(x_6[3].x);
+    x_GLF_color = float4(float(x_61), float(x_64), float(x_67), float(x_70));
+  } else {
+    const int x_74 = asint(x_6[2].x);
+    const float x_75 = float(x_74);
+    x_GLF_color = float4(x_75, x_75, x_75, x_75);
+  }
+  const int x_77 = count0;
+  const int x_79 = asint(x_6[1].x);
+  if ((x_77 != x_79)) {
+    const int x_84 = asint(x_6[2].x);
+    const float x_85 = float(x_84);
+    x_GLF_color = float4(x_85, x_85, x_85, x_85);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..4f33cd7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.wgsl.expected.msl
@@ -0,0 +1,91 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[5];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int count0 = 0;
+  int count1 = 0;
+  int i = 0;
+  int const x_29 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  count0 = x_29;
+  int const x_31 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  count1 = x_31;
+  int const x_33 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  i = x_33;
+  while (true) {
+    int const x_38 = i;
+    int const x_40 = x_6.x_GLF_uniform_int_values.arr[4].el;
+    if ((x_38 < x_40)) {
+    } else {
+      break;
+    }
+    int const x_43 = i;
+    switch(x_43) {
+      case 0:
+      case 1: {
+        int const x_47 = count0;
+        count0 = (x_47 + 1);
+        /* fallthrough */
+      }
+      case 2:
+      case 3: {
+        int const x_49 = count1;
+        count1 = (x_49 + 1);
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    {
+      int const x_51 = i;
+      i = (x_51 + 1);
+    }
+  }
+  int const x_53 = count1;
+  int const x_55 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  if ((x_53 == x_55)) {
+    int const x_61 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    int const x_64 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_67 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_70 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    *(tint_symbol_4) = float4(float(x_61), float(x_64), float(x_67), float(x_70));
+  } else {
+    int const x_74 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    float const x_75 = float(x_74);
+    *(tint_symbol_4) = float4(x_75, x_75, x_75, x_75);
+  }
+  int const x_77 = count0;
+  int const x_79 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_77 != x_79)) {
+    int const x_84 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    float const x_85 = float(x_84);
+    *(tint_symbol_4) = float4(x_85, x_85, x_85, x_85);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..4075f23
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,173 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 106
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %count0 "count0"
+               OpName %count1 "count1"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_5 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_int_uint_5 = OpTypeArray %int %uint_5
+       %buf0 = OpTypeStruct %_arr_int_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_4 = OpConstant %int 4
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+      %int_0 = OpConstant %int 0
+      %int_3 = OpConstant %int 3
+   %main_out = OpTypeStruct %v4float
+         %94 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+     %count0 = OpVariable %_ptr_Function_int Function %21
+     %count1 = OpVariable %_ptr_Function_int Function %21
+          %i = OpVariable %_ptr_Function_int Function %21
+         %27 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %28 = OpLoad %int %27
+               OpStore %count0 %28
+         %29 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %30 = OpLoad %int %29
+               OpStore %count1 %30
+         %31 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %32 = OpLoad %int %31
+               OpStore %i %32
+               OpBranch %33
+         %33 = OpLabel
+               OpLoopMerge %34 %35 None
+               OpBranch %36
+         %36 = OpLabel
+         %37 = OpLoad %int %i
+         %39 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+         %40 = OpLoad %int %39
+         %41 = OpSLessThan %bool %37 %40
+               OpSelectionMerge %43 None
+               OpBranchConditional %41 %44 %45
+         %44 = OpLabel
+               OpBranch %43
+         %45 = OpLabel
+               OpBranch %34
+         %43 = OpLabel
+         %46 = OpLoad %int %i
+               OpSelectionMerge %47 None
+               OpSwitch %46 %48 0 %49 1 %49 2 %50 3 %50
+         %49 = OpLabel
+         %51 = OpLoad %int %count0
+         %53 = OpIAdd %int %51 %int_1
+               OpStore %count0 %53
+               OpBranch %50
+         %50 = OpLabel
+         %54 = OpLoad %int %count1
+         %55 = OpIAdd %int %54 %int_1
+               OpStore %count1 %55
+               OpBranch %47
+         %48 = OpLabel
+               OpBranch %47
+         %47 = OpLabel
+               OpBranch %35
+         %35 = OpLabel
+         %56 = OpLoad %int %i
+         %57 = OpIAdd %int %56 %int_1
+               OpStore %i %57
+               OpBranch %33
+         %34 = OpLabel
+         %58 = OpLoad %int %count1
+         %60 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %61 = OpLoad %int %60
+         %62 = OpIEqual %bool %58 %61
+               OpSelectionMerge %63 None
+               OpBranchConditional %62 %64 %65
+         %64 = OpLabel
+         %67 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %68 = OpLoad %int %67
+         %69 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %70 = OpLoad %int %69
+         %71 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %72 = OpLoad %int %71
+         %73 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %74 = OpLoad %int %73
+         %75 = OpConvertSToF %float %68
+         %76 = OpConvertSToF %float %70
+         %77 = OpConvertSToF %float %72
+         %78 = OpConvertSToF %float %74
+         %79 = OpCompositeConstruct %v4float %75 %76 %77 %78
+               OpStore %x_GLF_color %79
+               OpBranch %63
+         %65 = OpLabel
+         %80 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %81 = OpLoad %int %80
+         %82 = OpConvertSToF %float %81
+         %83 = OpCompositeConstruct %v4float %82 %82 %82 %82
+               OpStore %x_GLF_color %83
+               OpBranch %63
+         %63 = OpLabel
+         %84 = OpLoad %int %count0
+         %85 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %86 = OpLoad %int %85
+         %87 = OpINotEqual %bool %84 %86
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %88
+         %89 = OpLabel
+         %90 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %91 = OpLoad %int %90
+         %92 = OpConvertSToF %float %91
+         %93 = OpCompositeConstruct %v4float %92 %92 %92 %92
+               OpStore %x_GLF_color %93
+               OpBranch %88
+         %88 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %94
+%tint_symbol = OpFunctionParameter %main_out
+         %98 = OpLabel
+         %99 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %99
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %101 = OpLabel
+        %102 = OpFunctionCall %void %main_1
+        %104 = OpLoad %v4float %x_GLF_color
+        %105 = OpCompositeConstruct %main_out %104
+        %103 = OpFunctionCall %void %tint_symbol_2 %105
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..c70fd11
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,81 @@
+type Arr = [[stride(16)]] array<i32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var count0 : i32;
+  var count1 : i32;
+  var i : i32;
+  let x_29 : i32 = x_6.x_GLF_uniform_int_values[2];
+  count0 = x_29;
+  let x_31 : i32 = x_6.x_GLF_uniform_int_values[2];
+  count1 = x_31;
+  let x_33 : i32 = x_6.x_GLF_uniform_int_values[2];
+  i = x_33;
+  loop {
+    let x_38 : i32 = i;
+    let x_40 : i32 = x_6.x_GLF_uniform_int_values[4];
+    if ((x_38 < x_40)) {
+    } else {
+      break;
+    }
+    let x_43 : i32 = i;
+    switch(x_43) {
+      case 0, 1: {
+        let x_47 : i32 = count0;
+        count0 = (x_47 + 1);
+        fallthrough;
+      }
+      case 2, 3: {
+        let x_49 : i32 = count1;
+        count1 = (x_49 + 1);
+      }
+      default: {
+      }
+    }
+
+    continuing {
+      let x_51 : i32 = i;
+      i = (x_51 + 1);
+    }
+  }
+  let x_53 : i32 = count1;
+  let x_55 : i32 = x_6.x_GLF_uniform_int_values[0];
+  if ((x_53 == x_55)) {
+    let x_61 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_64 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_67 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_70 : i32 = x_6.x_GLF_uniform_int_values[3];
+    x_GLF_color = vec4<f32>(f32(x_61), f32(x_64), f32(x_67), f32(x_70));
+  } else {
+    let x_74 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_75 : f32 = f32(x_74);
+    x_GLF_color = vec4<f32>(x_75, x_75, x_75, x_75);
+  }
+  let x_77 : i32 = count0;
+  let x_79 : i32 = x_6.x_GLF_uniform_int_values[1];
+  if ((x_77 != x_79)) {
+    let x_84 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_85 : f32 = f32(x_84);
+    x_GLF_color = vec4<f32>(x_85, x_85, x_85, x_85);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-xor-add/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-xor-add/0-opt.spvasm
new file mode 100644
index 0000000..5eb0519
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-xor-add/0-opt.spvasm
@@ -0,0 +1,103 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %data "data"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpName %a "a"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_arr_float_uint_2_0 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+%_ptr_Function__arr_float_uint_2 = OpTypePointer Function %_arr_float_uint_2
+        %int = OpTypeInt 32 1
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_arr_float_uint_2_0 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2_0
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %13
+         %31 = OpLabel
+       %data = OpVariable %_ptr_Function__arr_float_uint_2 Function
+          %a = OpVariable %_ptr_Function_float Function
+         %32 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %33 = OpLoad %int %32
+         %34 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %35 = OpLoad %float %34
+         %36 = OpAccessChain %_ptr_Function_float %data %33
+               OpStore %36 %35
+         %37 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %38 = OpLoad %int %37
+         %39 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_1
+         %40 = OpLoad %float %39
+         %41 = OpAccessChain %_ptr_Function_float %data %38
+               OpStore %41 %40
+         %42 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %43 = OpLoad %int %42
+         %44 = OpBitwiseAnd %int %43 %int_2
+         %45 = OpBitwiseXor %int %int_1 %44
+         %46 = OpAccessChain %_ptr_Function_float %data %45
+         %47 = OpLoad %float %46
+               OpStore %a %47
+         %48 = OpLoad %float %a
+         %49 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_1
+         %50 = OpLoad %float %49
+         %51 = OpFOrdEqual %bool %48 %50
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %54
+         %53 = OpLabel
+         %55 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_1
+         %56 = OpLoad %float %55
+         %57 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %58 = OpLoad %float %57
+         %59 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %60 = OpLoad %float %59
+         %61 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_1
+         %62 = OpLoad %float %61
+         %63 = OpCompositeConstruct %v4float %56 %58 %60 %62
+               OpStore %_GLF_color %63
+               OpBranch %52
+         %54 = OpLabel
+         %64 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %65 = OpLoad %float %64
+         %66 = OpCompositeConstruct %v4float %65 %65 %65 %65
+               OpStore %_GLF_color %66
+               OpBranch %52
+         %52 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-xor-add/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-xor-add/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..596a485
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-xor-add/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,53 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float data[2] = (float[2])0;
+  float a = 0.0f;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_33 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_35 = asfloat(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  data[x_33] = x_35;
+  const int x_38 = asint(x_6[1].x);
+  const float x_40 = asfloat(x_8[1].x);
+  data[x_38] = x_40;
+  const int x_43 = asint(x_6[1].x);
+  const float x_47 = data[(1 ^ (x_43 & 2))];
+  a = x_47;
+  const float x_48 = a;
+  const float x_50 = asfloat(x_8[1].x);
+  if ((x_48 == x_50)) {
+    const float x_56 = asfloat(x_8[1].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const float x_58 = asfloat(x_8[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const float x_60 = asfloat(x_8[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const float x_62 = asfloat(x_8[1].x);
+    x_GLF_color = float4(x_56, x_58, x_60, x_62);
+  } else {
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const float x_65 = asfloat(x_8[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    x_GLF_color = float4(x_65, x_65, x_65, x_65);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-xor-add/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-xor-add/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..4de038f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-xor-add/0-opt.spvasm.expected.msl
@@ -0,0 +1,68 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct tint_array_wrapper_2 {
+  float arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_8, thread float4* const tint_symbol_4) {
+  tint_array_wrapper_2 data = {};
+  float a = 0.0f;
+  int const x_33 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  float const x_35 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  data.arr[x_33] = x_35;
+  int const x_38 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  float const x_40 = x_8.x_GLF_uniform_float_values.arr[1].el;
+  data.arr[x_38] = x_40;
+  int const x_43 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  float const x_47 = data.arr[(1 ^ (x_43 & 2))];
+  a = x_47;
+  float const x_48 = a;
+  float const x_50 = x_8.x_GLF_uniform_float_values.arr[1].el;
+  if ((x_48 == x_50)) {
+    float const x_56 = x_8.x_GLF_uniform_float_values.arr[1].el;
+    float const x_58 = x_8.x_GLF_uniform_float_values.arr[0].el;
+    float const x_60 = x_8.x_GLF_uniform_float_values.arr[0].el;
+    float const x_62 = x_8.x_GLF_uniform_float_values.arr[1].el;
+    *(tint_symbol_4) = float4(x_56, x_58, x_60, x_62);
+  } else {
+    float const x_65 = x_8.x_GLF_uniform_float_values.arr[0].el;
+    *(tint_symbol_4) = float4(x_65, x_65, x_65, x_65);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_8 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-xor-add/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-xor-add/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..2d8d7ba
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-xor-add/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,139 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 84
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %data "data"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_float_uint_2_0 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %16
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_arr_float_uint_2_0 = OpTypeArray %float %uint_2
+%_ptr_Function__arr_float_uint_2_0 = OpTypePointer Function %_arr_float_uint_2_0
+         %26 = OpConstantNull %_arr_float_uint_2_0
+%_ptr_Function_float = OpTypePointer Function %float
+         %29 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %v4float
+         %72 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+       %data = OpVariable %_ptr_Function__arr_float_uint_2_0 Function %26
+          %a = OpVariable %_ptr_Function_float Function %29
+         %33 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %34 = OpLoad %int %33
+         %36 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %37 = OpLoad %float %36
+         %38 = OpAccessChain %_ptr_Function_float %data %34
+               OpStore %38 %37
+         %40 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %41 = OpLoad %int %40
+         %42 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+         %43 = OpLoad %float %42
+         %44 = OpAccessChain %_ptr_Function_float %data %41
+               OpStore %44 %43
+         %45 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %46 = OpLoad %int %45
+         %48 = OpBitwiseAnd %int %46 %int_2
+         %49 = OpBitwiseXor %int %int_1 %48
+         %50 = OpAccessChain %_ptr_Function_float %data %49
+         %51 = OpLoad %float %50
+               OpStore %a %51
+         %52 = OpLoad %float %a
+         %53 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+         %54 = OpLoad %float %53
+         %55 = OpFOrdEqual %bool %52 %54
+               OpSelectionMerge %57 None
+               OpBranchConditional %55 %58 %59
+         %58 = OpLabel
+         %60 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+         %61 = OpLoad %float %60
+         %62 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %63 = OpLoad %float %62
+         %64 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %65 = OpLoad %float %64
+         %66 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+         %67 = OpLoad %float %66
+         %68 = OpCompositeConstruct %v4float %61 %63 %65 %67
+               OpStore %x_GLF_color %68
+               OpBranch %57
+         %59 = OpLabel
+         %69 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %70 = OpLoad %float %69
+         %71 = OpCompositeConstruct %v4float %70 %70 %70 %70
+               OpStore %x_GLF_color %71
+               OpBranch %57
+         %57 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %72
+%tint_symbol = OpFunctionParameter %main_out
+         %76 = OpLabel
+         %77 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %77
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+         %79 = OpLabel
+         %80 = OpFunctionCall %void %main_1
+         %82 = OpLoad %v4float %x_GLF_color
+         %83 = OpCompositeConstruct %main_out %82
+         %81 = OpFunctionCall %void %tint_symbol_2 %83
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-xor-add/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-xor-add/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..e5869f4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-xor-add/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,57 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var data : array<f32, 2>;
+  var a : f32;
+  let x_33 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_35 : f32 = x_8.x_GLF_uniform_float_values[0];
+  data[x_33] = x_35;
+  let x_38 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_40 : f32 = x_8.x_GLF_uniform_float_values[1];
+  data[x_38] = x_40;
+  let x_43 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_47 : f32 = data[(1 ^ (x_43 & 2))];
+  a = x_47;
+  let x_48 : f32 = a;
+  let x_50 : f32 = x_8.x_GLF_uniform_float_values[1];
+  if ((x_48 == x_50)) {
+    let x_56 : f32 = x_8.x_GLF_uniform_float_values[1];
+    let x_58 : f32 = x_8.x_GLF_uniform_float_values[0];
+    let x_60 : f32 = x_8.x_GLF_uniform_float_values[0];
+    let x_62 : f32 = x_8.x_GLF_uniform_float_values[1];
+    x_GLF_color = vec4<f32>(x_56, x_58, x_60, x_62);
+  } else {
+    let x_65 : f32 = x_8.x_GLF_uniform_float_values[0];
+    x_GLF_color = vec4<f32>(x_65, x_65, x_65, x_65);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-xor-add/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-xor-add/0-opt.wgsl
new file mode 100644
index 0000000..e5869f4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-xor-add/0-opt.wgsl
@@ -0,0 +1,57 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var data : array<f32, 2>;
+  var a : f32;
+  let x_33 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_35 : f32 = x_8.x_GLF_uniform_float_values[0];
+  data[x_33] = x_35;
+  let x_38 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_40 : f32 = x_8.x_GLF_uniform_float_values[1];
+  data[x_38] = x_40;
+  let x_43 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_47 : f32 = data[(1 ^ (x_43 & 2))];
+  a = x_47;
+  let x_48 : f32 = a;
+  let x_50 : f32 = x_8.x_GLF_uniform_float_values[1];
+  if ((x_48 == x_50)) {
+    let x_56 : f32 = x_8.x_GLF_uniform_float_values[1];
+    let x_58 : f32 = x_8.x_GLF_uniform_float_values[0];
+    let x_60 : f32 = x_8.x_GLF_uniform_float_values[0];
+    let x_62 : f32 = x_8.x_GLF_uniform_float_values[1];
+    x_GLF_color = vec4<f32>(x_56, x_58, x_60, x_62);
+  } else {
+    let x_65 : f32 = x_8.x_GLF_uniform_float_values[0];
+    x_GLF_color = vec4<f32>(x_65, x_65, x_65, x_65);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-xor-add/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-xor-add/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..596a485
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-xor-add/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,53 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float data[2] = (float[2])0;
+  float a = 0.0f;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_33 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_35 = asfloat(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  data[x_33] = x_35;
+  const int x_38 = asint(x_6[1].x);
+  const float x_40 = asfloat(x_8[1].x);
+  data[x_38] = x_40;
+  const int x_43 = asint(x_6[1].x);
+  const float x_47 = data[(1 ^ (x_43 & 2))];
+  a = x_47;
+  const float x_48 = a;
+  const float x_50 = asfloat(x_8[1].x);
+  if ((x_48 == x_50)) {
+    const float x_56 = asfloat(x_8[1].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const float x_58 = asfloat(x_8[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const float x_60 = asfloat(x_8[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const float x_62 = asfloat(x_8[1].x);
+    x_GLF_color = float4(x_56, x_58, x_60, x_62);
+  } else {
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const float x_65 = asfloat(x_8[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    x_GLF_color = float4(x_65, x_65, x_65, x_65);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-xor-add/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-xor-add/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..4de038f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-xor-add/0-opt.wgsl.expected.msl
@@ -0,0 +1,68 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct tint_array_wrapper_2 {
+  float arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_8, thread float4* const tint_symbol_4) {
+  tint_array_wrapper_2 data = {};
+  float a = 0.0f;
+  int const x_33 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  float const x_35 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  data.arr[x_33] = x_35;
+  int const x_38 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  float const x_40 = x_8.x_GLF_uniform_float_values.arr[1].el;
+  data.arr[x_38] = x_40;
+  int const x_43 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  float const x_47 = data.arr[(1 ^ (x_43 & 2))];
+  a = x_47;
+  float const x_48 = a;
+  float const x_50 = x_8.x_GLF_uniform_float_values.arr[1].el;
+  if ((x_48 == x_50)) {
+    float const x_56 = x_8.x_GLF_uniform_float_values.arr[1].el;
+    float const x_58 = x_8.x_GLF_uniform_float_values.arr[0].el;
+    float const x_60 = x_8.x_GLF_uniform_float_values.arr[0].el;
+    float const x_62 = x_8.x_GLF_uniform_float_values.arr[1].el;
+    *(tint_symbol_4) = float4(x_56, x_58, x_60, x_62);
+  } else {
+    float const x_65 = x_8.x_GLF_uniform_float_values.arr[0].el;
+    *(tint_symbol_4) = float4(x_65, x_65, x_65, x_65);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_8 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-xor-add/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-xor-add/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..2d8d7ba
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-xor-add/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,139 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 84
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %data "data"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_float_uint_2_0 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %16
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_arr_float_uint_2_0 = OpTypeArray %float %uint_2
+%_ptr_Function__arr_float_uint_2_0 = OpTypePointer Function %_arr_float_uint_2_0
+         %26 = OpConstantNull %_arr_float_uint_2_0
+%_ptr_Function_float = OpTypePointer Function %float
+         %29 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %v4float
+         %72 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+       %data = OpVariable %_ptr_Function__arr_float_uint_2_0 Function %26
+          %a = OpVariable %_ptr_Function_float Function %29
+         %33 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %34 = OpLoad %int %33
+         %36 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %37 = OpLoad %float %36
+         %38 = OpAccessChain %_ptr_Function_float %data %34
+               OpStore %38 %37
+         %40 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %41 = OpLoad %int %40
+         %42 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+         %43 = OpLoad %float %42
+         %44 = OpAccessChain %_ptr_Function_float %data %41
+               OpStore %44 %43
+         %45 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %46 = OpLoad %int %45
+         %48 = OpBitwiseAnd %int %46 %int_2
+         %49 = OpBitwiseXor %int %int_1 %48
+         %50 = OpAccessChain %_ptr_Function_float %data %49
+         %51 = OpLoad %float %50
+               OpStore %a %51
+         %52 = OpLoad %float %a
+         %53 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+         %54 = OpLoad %float %53
+         %55 = OpFOrdEqual %bool %52 %54
+               OpSelectionMerge %57 None
+               OpBranchConditional %55 %58 %59
+         %58 = OpLabel
+         %60 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+         %61 = OpLoad %float %60
+         %62 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %63 = OpLoad %float %62
+         %64 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %65 = OpLoad %float %64
+         %66 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+         %67 = OpLoad %float %66
+         %68 = OpCompositeConstruct %v4float %61 %63 %65 %67
+               OpStore %x_GLF_color %68
+               OpBranch %57
+         %59 = OpLabel
+         %69 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %70 = OpLoad %float %69
+         %71 = OpCompositeConstruct %v4float %70 %70 %70 %70
+               OpStore %x_GLF_color %71
+               OpBranch %57
+         %57 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %72
+%tint_symbol = OpFunctionParameter %main_out
+         %76 = OpLabel
+         %77 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %77
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+         %79 = OpLabel
+         %80 = OpFunctionCall %void %main_1
+         %82 = OpLoad %v4float %x_GLF_color
+         %83 = OpCompositeConstruct %main_out %82
+         %81 = OpFunctionCall %void %tint_symbol_2 %83
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-xor-add/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-xor-add/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..e5869f4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-xor-add/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,57 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var data : array<f32, 2>;
+  var a : f32;
+  let x_33 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_35 : f32 = x_8.x_GLF_uniform_float_values[0];
+  data[x_33] = x_35;
+  let x_38 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_40 : f32 = x_8.x_GLF_uniform_float_values[1];
+  data[x_38] = x_40;
+  let x_43 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_47 : f32 = data[(1 ^ (x_43 & 2))];
+  a = x_47;
+  let x_48 : f32 = a;
+  let x_50 : f32 = x_8.x_GLF_uniform_float_values[1];
+  if ((x_48 == x_50)) {
+    let x_56 : f32 = x_8.x_GLF_uniform_float_values[1];
+    let x_58 : f32 = x_8.x_GLF_uniform_float_values[0];
+    let x_60 : f32 = x_8.x_GLF_uniform_float_values[0];
+    let x_62 : f32 = x_8.x_GLF_uniform_float_values[1];
+    x_GLF_color = vec4<f32>(x_56, x_58, x_60, x_62);
+  } else {
+    let x_65 : f32 = x_8.x_GLF_uniform_float_values[0];
+    x_GLF_color = vec4<f32>(x_65, x_65, x_65, x_65);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-isnan/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-isnan/0-opt.spvasm
new file mode 100644
index 0000000..bb91929
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-isnan/0-opt.spvasm
@@ -0,0 +1,73 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %7 RelaxedPrecision
+               OpDecorate %8 RelaxedPrecision
+               OpDecorate %9 RelaxedPrecision
+               OpDecorate %10 RelaxedPrecision
+               OpDecorate %11 RelaxedPrecision
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+     %uint_0 = OpConstant %uint 0
+       %bool = OpTypeBool
+       %main = OpFunction %void None %13
+         %26 = OpLabel
+         %27 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+          %7 = OpLoad %int %27
+         %28 = OpConvertSToF %float %7
+         %29 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+          %8 = OpLoad %int %29
+         %30 = OpConvertSToF %float %8
+         %31 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+          %9 = OpLoad %int %31
+         %32 = OpConvertSToF %float %9
+         %33 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %10 = OpLoad %int %33
+         %34 = OpConvertSToF %float %10
+         %35 = OpCompositeConstruct %v4float %28 %30 %32 %34
+               OpStore %_GLF_color %35
+         %36 = OpLoad %v4float %_GLF_color
+         %37 = OpFNegate %v4float %36
+         %38 = OpCompositeExtract %float %37 0
+         %39 = OpIsNan %bool %38
+               OpSelectionMerge %40 None
+               OpBranchConditional %39 %41 %40
+         %41 = OpLabel
+         %42 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %11 = OpLoad %int %42
+         %43 = OpConvertSToF %float %11
+         %44 = OpCompositeConstruct %v4float %43 %43 %43 %43
+               OpStore %_GLF_color %44
+               OpBranch %40
+         %40 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-isnan/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-isnan/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..9971bf0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-isnan/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,35 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[2];
+};
+
+void main_1() {
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_7 = asint(x_5[scalar_offset / 4][scalar_offset % 4]);
+  const int x_8 = asint(x_5[1].x);
+  const int x_9 = asint(x_5[1].x);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_10 = asint(x_5[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  x_GLF_color = float4(float(x_7), float(x_8), float(x_9), float(x_10));
+  if (isnan(-(x_GLF_color).x)) {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_11 = asint(x_5[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const float x_43 = float(x_11);
+    x_GLF_color = float4(x_43, x_43, x_43, x_43);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-isnan/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-isnan/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..7211d61
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-isnan/0-opt.spvasm.expected.msl
@@ -0,0 +1,43 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  int const x_7 = x_5.x_GLF_uniform_int_values.arr[0].el;
+  int const x_8 = x_5.x_GLF_uniform_int_values.arr[1].el;
+  int const x_9 = x_5.x_GLF_uniform_int_values.arr[1].el;
+  int const x_10 = x_5.x_GLF_uniform_int_values.arr[0].el;
+  *(tint_symbol_4) = float4(float(x_7), float(x_8), float(x_9), float(x_10));
+  float4 const x_36 = *(tint_symbol_4);
+  if (isnan((-(x_36)).x)) {
+    int const x_11 = x_5.x_GLF_uniform_int_values.arr[0].el;
+    float const x_43 = float(x_11);
+    *(tint_symbol_4) = float4(x_43, x_43, x_43, x_43);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-isnan/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-isnan/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..2b47873
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-isnan/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,98 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 59
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_5 "x_5"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %v4float
+         %47 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+         %22 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %23 = OpLoad %int %22
+         %25 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %26 = OpLoad %int %25
+         %27 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %28 = OpLoad %int %27
+         %29 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %30 = OpLoad %int %29
+         %31 = OpConvertSToF %float %23
+         %32 = OpConvertSToF %float %26
+         %33 = OpConvertSToF %float %28
+         %34 = OpConvertSToF %float %30
+         %35 = OpCompositeConstruct %v4float %31 %32 %33 %34
+               OpStore %x_GLF_color %35
+         %36 = OpLoad %v4float %x_GLF_color
+         %39 = OpFNegate %v4float %36
+         %40 = OpCompositeExtract %float %39 0
+         %37 = OpIsNan %bool %40
+               OpSelectionMerge %41 None
+               OpBranchConditional %37 %42 %41
+         %42 = OpLabel
+         %43 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %44 = OpLoad %int %43
+         %45 = OpConvertSToF %float %44
+         %46 = OpCompositeConstruct %v4float %45 %45 %45 %45
+               OpStore %x_GLF_color %46
+               OpBranch %41
+         %41 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %47
+%tint_symbol = OpFunctionParameter %main_out
+         %51 = OpLabel
+         %52 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %52
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %54 = OpLabel
+         %55 = OpFunctionCall %void %main_1
+         %57 = OpLoad %v4float %x_GLF_color
+         %58 = OpCompositeConstruct %main_out %57
+         %56 = OpFunctionCall %void %tint_symbol_2 %58
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-isnan/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-isnan/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..9ee635e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-isnan/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,36 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+fn main_1() {
+  let x_7 : i32 = x_5.x_GLF_uniform_int_values[0];
+  let x_8 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_9 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_10 : i32 = x_5.x_GLF_uniform_int_values[0];
+  x_GLF_color = vec4<f32>(f32(x_7), f32(x_8), f32(x_9), f32(x_10));
+  let x_36 : vec4<f32> = x_GLF_color;
+  if (isNan((-(x_36)).x)) {
+    let x_11 : i32 = x_5.x_GLF_uniform_int_values[0];
+    let x_43 : f32 = f32(x_11);
+    x_GLF_color = vec4<f32>(x_43, x_43, x_43, x_43);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-isnan/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-isnan/0-opt.wgsl
new file mode 100644
index 0000000..9ee635e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-isnan/0-opt.wgsl
@@ -0,0 +1,36 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+fn main_1() {
+  let x_7 : i32 = x_5.x_GLF_uniform_int_values[0];
+  let x_8 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_9 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_10 : i32 = x_5.x_GLF_uniform_int_values[0];
+  x_GLF_color = vec4<f32>(f32(x_7), f32(x_8), f32(x_9), f32(x_10));
+  let x_36 : vec4<f32> = x_GLF_color;
+  if (isNan((-(x_36)).x)) {
+    let x_11 : i32 = x_5.x_GLF_uniform_int_values[0];
+    let x_43 : f32 = f32(x_11);
+    x_GLF_color = vec4<f32>(x_43, x_43, x_43, x_43);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-isnan/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-isnan/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..9971bf0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-isnan/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,35 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[2];
+};
+
+void main_1() {
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_7 = asint(x_5[scalar_offset / 4][scalar_offset % 4]);
+  const int x_8 = asint(x_5[1].x);
+  const int x_9 = asint(x_5[1].x);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_10 = asint(x_5[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  x_GLF_color = float4(float(x_7), float(x_8), float(x_9), float(x_10));
+  if (isnan(-(x_GLF_color).x)) {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_11 = asint(x_5[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const float x_43 = float(x_11);
+    x_GLF_color = float4(x_43, x_43, x_43, x_43);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-isnan/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-isnan/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..7211d61
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-isnan/0-opt.wgsl.expected.msl
@@ -0,0 +1,43 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  int const x_7 = x_5.x_GLF_uniform_int_values.arr[0].el;
+  int const x_8 = x_5.x_GLF_uniform_int_values.arr[1].el;
+  int const x_9 = x_5.x_GLF_uniform_int_values.arr[1].el;
+  int const x_10 = x_5.x_GLF_uniform_int_values.arr[0].el;
+  *(tint_symbol_4) = float4(float(x_7), float(x_8), float(x_9), float(x_10));
+  float4 const x_36 = *(tint_symbol_4);
+  if (isnan((-(x_36)).x)) {
+    int const x_11 = x_5.x_GLF_uniform_int_values.arr[0].el;
+    float const x_43 = float(x_11);
+    *(tint_symbol_4) = float4(x_43, x_43, x_43, x_43);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-isnan/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-isnan/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..2b47873
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-isnan/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,98 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 59
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_5 "x_5"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %v4float
+         %47 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+         %22 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %23 = OpLoad %int %22
+         %25 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %26 = OpLoad %int %25
+         %27 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %28 = OpLoad %int %27
+         %29 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %30 = OpLoad %int %29
+         %31 = OpConvertSToF %float %23
+         %32 = OpConvertSToF %float %26
+         %33 = OpConvertSToF %float %28
+         %34 = OpConvertSToF %float %30
+         %35 = OpCompositeConstruct %v4float %31 %32 %33 %34
+               OpStore %x_GLF_color %35
+         %36 = OpLoad %v4float %x_GLF_color
+         %39 = OpFNegate %v4float %36
+         %40 = OpCompositeExtract %float %39 0
+         %37 = OpIsNan %bool %40
+               OpSelectionMerge %41 None
+               OpBranchConditional %37 %42 %41
+         %42 = OpLabel
+         %43 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %44 = OpLoad %int %43
+         %45 = OpConvertSToF %float %44
+         %46 = OpCompositeConstruct %v4float %45 %45 %45 %45
+               OpStore %x_GLF_color %46
+               OpBranch %41
+         %41 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %47
+%tint_symbol = OpFunctionParameter %main_out
+         %51 = OpLabel
+         %52 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %52
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %54 = OpLabel
+         %55 = OpFunctionCall %void %main_1
+         %57 = OpLoad %v4float %x_GLF_color
+         %58 = OpCompositeConstruct %main_out %57
+         %56 = OpFunctionCall %void %tint_symbol_2 %58
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-isnan/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-isnan/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..9ee635e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-isnan/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,36 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+fn main_1() {
+  let x_7 : i32 = x_5.x_GLF_uniform_int_values[0];
+  let x_8 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_9 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_10 : i32 = x_5.x_GLF_uniform_int_values[0];
+  x_GLF_color = vec4<f32>(f32(x_7), f32(x_8), f32(x_9), f32(x_10));
+  let x_36 : vec4<f32> = x_GLF_color;
+  if (isNan((-(x_36)).x)) {
+    let x_11 : i32 = x_5.x_GLF_uniform_int_values[0];
+    let x_43 : f32 = f32(x_11);
+    x_GLF_color = vec4<f32>(x_43, x_43, x_43, x_43);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ldexp/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ldexp/0-opt.spvasm
new file mode 100644
index 0000000..f80464d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ldexp/0-opt.spvasm
@@ -0,0 +1,94 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+  %int_10000 = OpConstant %int 10000
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %main = OpFunction %void None %11
+         %27 = OpLabel
+         %28 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %29 = OpLoad %float %28
+         %30 = OpExtInst %float %1 Ldexp %29 %int_10000
+         %31 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %32 = OpLoad %float %31
+         %33 = OpFOrdEqual %bool %30 %32
+               OpSelectionMerge %34 None
+               OpBranchConditional %33 %35 %36
+         %35 = OpLabel
+         %37 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %38 = OpLoad %int %37
+         %39 = OpConvertSToF %float %38
+         %40 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %41 = OpLoad %int %40
+         %42 = OpConvertSToF %float %41
+         %43 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %44 = OpLoad %int %43
+         %45 = OpConvertSToF %float %44
+         %46 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %47 = OpLoad %int %46
+         %48 = OpConvertSToF %float %47
+         %49 = OpCompositeConstruct %v4float %39 %42 %45 %48
+               OpStore %_GLF_color %49
+               OpBranch %34
+         %36 = OpLabel
+         %50 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %51 = OpLoad %int %50
+         %52 = OpConvertSToF %float %51
+         %53 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %54 = OpLoad %int %53
+         %55 = OpConvertSToF %float %54
+         %56 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %57 = OpLoad %int %56
+         %58 = OpConvertSToF %float %57
+         %59 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %60 = OpLoad %int %59
+         %61 = OpConvertSToF %float %60
+         %62 = OpCompositeConstruct %v4float %52 %55 %58 %61
+               OpStore %_GLF_color %62
+               OpBranch %34
+         %34 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ldexp/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ldexp/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..410562b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ldexp/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,46 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_7 : register(b1, space0) {
+  uint4 x_7[2];
+};
+
+void main_1() {
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_29 = asfloat(x_5[scalar_offset / 4][scalar_offset % 4]);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_32 = asfloat(x_5[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((ldexp(x_29, 10000) == x_32)) {
+    const int x_38 = asint(x_7[1].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_41 = asint(x_7[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_44 = asint(x_7[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const int x_47 = asint(x_7[1].x);
+    x_GLF_color = float4(float(x_38), float(x_41), float(x_44), float(x_47));
+  } else {
+    const int x_51 = asint(x_7[1].x);
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_54 = asint(x_7[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const int x_57 = asint(x_7[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    const int x_60 = asint(x_7[1].x);
+    x_GLF_color = float4(float(x_51), float(x_54), float(x_57), float(x_60));
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ldexp/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ldexp/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..5eeaa35
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ldexp/0-opt.spvasm.expected.msl
@@ -0,0 +1,57 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, constant buf1& x_7, thread float4* const tint_symbol_4) {
+  float const x_29 = x_5.x_GLF_uniform_float_values.arr[0].el;
+  float const x_32 = x_5.x_GLF_uniform_float_values.arr[0].el;
+  if ((ldexp(x_29, 10000) == x_32)) {
+    int const x_38 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    int const x_41 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_44 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_47 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_38), float(x_41), float(x_44), float(x_47));
+  } else {
+    int const x_51 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    int const x_54 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_57 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_60 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_51), float(x_54), float(x_57), float(x_60));
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]], constant buf1& x_7 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ldexp/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ldexp/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..6a92dec
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ldexp/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,128 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 79
+; Schema: 0
+               OpCapability Shader
+         %32 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %11 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %11
+        %int = OpTypeInt 32 1
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_7 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %11
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+  %int_10000 = OpConstant %int 10000
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+         %67 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+         %27 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %28 = OpLoad %float %27
+         %29 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %30 = OpLoad %float %29
+         %31 = OpExtInst %float %32 Ldexp %28 %int_10000
+         %34 = OpFOrdEqual %bool %31 %30
+               OpSelectionMerge %36 None
+               OpBranchConditional %34 %37 %38
+         %37 = OpLabel
+         %41 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %42 = OpLoad %int %41
+         %43 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %44 = OpLoad %int %43
+         %45 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %46 = OpLoad %int %45
+         %47 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %48 = OpLoad %int %47
+         %49 = OpConvertSToF %float %42
+         %50 = OpConvertSToF %float %44
+         %51 = OpConvertSToF %float %46
+         %52 = OpConvertSToF %float %48
+         %53 = OpCompositeConstruct %v4float %49 %50 %51 %52
+               OpStore %x_GLF_color %53
+               OpBranch %36
+         %38 = OpLabel
+         %54 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %55 = OpLoad %int %54
+         %56 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %57 = OpLoad %int %56
+         %58 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %59 = OpLoad %int %58
+         %60 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %61 = OpLoad %int %60
+         %62 = OpConvertSToF %float %55
+         %63 = OpConvertSToF %float %57
+         %64 = OpConvertSToF %float %59
+         %65 = OpConvertSToF %float %61
+         %66 = OpCompositeConstruct %v4float %62 %63 %64 %65
+               OpStore %x_GLF_color %66
+               OpBranch %36
+         %36 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %67
+%tint_symbol = OpFunctionParameter %main_out
+         %71 = OpLabel
+         %72 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %72
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+         %74 = OpLabel
+         %75 = OpFunctionCall %void %main_1
+         %77 = OpLoad %v4float %x_GLF_color
+         %78 = OpCompositeConstruct %main_out %77
+         %76 = OpFunctionCall %void %tint_symbol_2 %78
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ldexp/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ldexp/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..e029395
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ldexp/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,49 @@
+type Arr = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+fn main_1() {
+  let x_29 : f32 = x_5.x_GLF_uniform_float_values[0];
+  let x_32 : f32 = x_5.x_GLF_uniform_float_values[0];
+  if ((ldexp(x_29, 10000) == x_32)) {
+    let x_38 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_41 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_44 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_47 : i32 = x_7.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_38), f32(x_41), f32(x_44), f32(x_47));
+  } else {
+    let x_51 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_54 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_57 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_60 : i32 = x_7.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_51), f32(x_54), f32(x_57), f32(x_60));
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ldexp/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ldexp/0-opt.wgsl
new file mode 100644
index 0000000..e029395
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ldexp/0-opt.wgsl
@@ -0,0 +1,49 @@
+type Arr = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+fn main_1() {
+  let x_29 : f32 = x_5.x_GLF_uniform_float_values[0];
+  let x_32 : f32 = x_5.x_GLF_uniform_float_values[0];
+  if ((ldexp(x_29, 10000) == x_32)) {
+    let x_38 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_41 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_44 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_47 : i32 = x_7.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_38), f32(x_41), f32(x_44), f32(x_47));
+  } else {
+    let x_51 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_54 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_57 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_60 : i32 = x_7.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_51), f32(x_54), f32(x_57), f32(x_60));
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ldexp/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ldexp/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..410562b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ldexp/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,46 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_7 : register(b1, space0) {
+  uint4 x_7[2];
+};
+
+void main_1() {
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_29 = asfloat(x_5[scalar_offset / 4][scalar_offset % 4]);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_32 = asfloat(x_5[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((ldexp(x_29, 10000) == x_32)) {
+    const int x_38 = asint(x_7[1].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_41 = asint(x_7[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_44 = asint(x_7[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const int x_47 = asint(x_7[1].x);
+    x_GLF_color = float4(float(x_38), float(x_41), float(x_44), float(x_47));
+  } else {
+    const int x_51 = asint(x_7[1].x);
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_54 = asint(x_7[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const int x_57 = asint(x_7[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    const int x_60 = asint(x_7[1].x);
+    x_GLF_color = float4(float(x_51), float(x_54), float(x_57), float(x_60));
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ldexp/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ldexp/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..5eeaa35
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ldexp/0-opt.wgsl.expected.msl
@@ -0,0 +1,57 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, constant buf1& x_7, thread float4* const tint_symbol_4) {
+  float const x_29 = x_5.x_GLF_uniform_float_values.arr[0].el;
+  float const x_32 = x_5.x_GLF_uniform_float_values.arr[0].el;
+  if ((ldexp(x_29, 10000) == x_32)) {
+    int const x_38 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    int const x_41 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_44 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_47 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_38), float(x_41), float(x_44), float(x_47));
+  } else {
+    int const x_51 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    int const x_54 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_57 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_60 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_51), float(x_54), float(x_57), float(x_60));
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]], constant buf1& x_7 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ldexp/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ldexp/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..6a92dec
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ldexp/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,128 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 79
+; Schema: 0
+               OpCapability Shader
+         %32 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %11 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %11
+        %int = OpTypeInt 32 1
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_7 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %11
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+  %int_10000 = OpConstant %int 10000
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+         %67 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+         %27 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %28 = OpLoad %float %27
+         %29 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %30 = OpLoad %float %29
+         %31 = OpExtInst %float %32 Ldexp %28 %int_10000
+         %34 = OpFOrdEqual %bool %31 %30
+               OpSelectionMerge %36 None
+               OpBranchConditional %34 %37 %38
+         %37 = OpLabel
+         %41 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %42 = OpLoad %int %41
+         %43 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %44 = OpLoad %int %43
+         %45 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %46 = OpLoad %int %45
+         %47 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %48 = OpLoad %int %47
+         %49 = OpConvertSToF %float %42
+         %50 = OpConvertSToF %float %44
+         %51 = OpConvertSToF %float %46
+         %52 = OpConvertSToF %float %48
+         %53 = OpCompositeConstruct %v4float %49 %50 %51 %52
+               OpStore %x_GLF_color %53
+               OpBranch %36
+         %38 = OpLabel
+         %54 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %55 = OpLoad %int %54
+         %56 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %57 = OpLoad %int %56
+         %58 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %59 = OpLoad %int %58
+         %60 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %61 = OpLoad %int %60
+         %62 = OpConvertSToF %float %55
+         %63 = OpConvertSToF %float %57
+         %64 = OpConvertSToF %float %59
+         %65 = OpConvertSToF %float %61
+         %66 = OpCompositeConstruct %v4float %62 %63 %64 %65
+               OpStore %x_GLF_color %66
+               OpBranch %36
+         %36 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %67
+%tint_symbol = OpFunctionParameter %main_out
+         %71 = OpLabel
+         %72 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %72
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+         %74 = OpLabel
+         %75 = OpFunctionCall %void %main_1
+         %77 = OpLoad %v4float %x_GLF_color
+         %78 = OpCompositeConstruct %main_out %77
+         %76 = OpFunctionCall %void %tint_symbol_2 %78
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ldexp/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ldexp/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..e029395
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ldexp/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,49 @@
+type Arr = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+fn main_1() {
+  let x_29 : f32 = x_5.x_GLF_uniform_float_values[0];
+  let x_32 : f32 = x_5.x_GLF_uniform_float_values[0];
+  if ((ldexp(x_29, 10000) == x_32)) {
+    let x_38 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_41 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_44 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_47 : i32 = x_7.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_38), f32(x_41), f32(x_44), f32(x_47));
+  } else {
+    let x_51 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_54 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_57 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_60 : i32 = x_7.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_51), f32(x_54), f32(x_57), f32(x_60));
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-pre-increment-clamp/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-pre-increment-clamp/0-opt.spvasm
new file mode 100644
index 0000000..9f2839f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-pre-increment-clamp/0-opt.spvasm
@@ -0,0 +1,146 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %f1_f1_ "f1(f1;"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %c "c"
+               OpName %a_0 "a"
+               OpName %param "param"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+         %21 = OpTypeFunction %float %_ptr_Function_float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_8 = OpConstant %int 8
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf0 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %main = OpFunction %void None %18
+         %41 = OpLabel
+        %a_0 = OpVariable %_ptr_Function_float Function
+      %param = OpVariable %_ptr_Function_float Function
+         %42 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %43 = OpLoad %float %42
+               OpStore %param %43
+         %44 = OpFunctionCall %float %f1_f1_ %param
+               OpStore %a_0 %44
+         %45 = OpLoad %float %a_0
+         %46 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %47 = OpLoad %float %46
+         %48 = OpFOrdEqual %bool %45 %47
+               OpSelectionMerge %49 None
+               OpBranchConditional %48 %50 %51
+         %50 = OpLabel
+         %52 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %53 = OpLoad %int %52
+         %54 = OpConvertSToF %float %53
+         %55 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %56 = OpLoad %int %55
+         %57 = OpConvertSToF %float %56
+         %58 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %59 = OpLoad %int %58
+         %60 = OpConvertSToF %float %59
+         %61 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %62 = OpLoad %int %61
+         %63 = OpConvertSToF %float %62
+         %64 = OpCompositeConstruct %v4float %54 %57 %60 %63
+               OpStore %_GLF_color %64
+               OpBranch %49
+         %51 = OpLabel
+         %65 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %66 = OpLoad %int %65
+         %67 = OpConvertSToF %float %66
+         %68 = OpCompositeConstruct %v4float %67 %67 %67 %67
+               OpStore %_GLF_color %68
+               OpBranch %49
+         %49 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %f1_f1_ = OpFunction %float None %21
+          %a = OpFunctionParameter %_ptr_Function_float
+         %69 = OpLabel
+          %b = OpVariable %_ptr_Function_int Function
+          %c = OpVariable %_ptr_Function_float Function
+               OpStore %b %int_8
+         %70 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %71 = OpLoad %float %70
+         %72 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %73 = OpLoad %float %72
+         %74 = OpFOrdGreaterThanEqual %bool %71 %73
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %75
+         %76 = OpLabel
+         %77 = OpLoad %int %b
+         %78 = OpIAdd %int %77 %int_1
+               OpStore %b %78
+         %79 = OpLoad %int %b
+         %80 = OpIAdd %int %79 %int_1
+               OpStore %b %80
+               OpBranch %75
+         %75 = OpLabel
+         %81 = OpLoad %float %a
+         %82 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %83 = OpLoad %float %82
+         %84 = OpFOrdLessThan %bool %81 %83
+               OpSelectionMerge %85 None
+               OpBranchConditional %84 %86 %85
+         %86 = OpLabel
+         %87 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %88 = OpLoad %float %87
+               OpReturnValue %88
+         %85 = OpLabel
+         %89 = OpLoad %int %b
+         %90 = OpExtInst %int %1 SClamp %89 %int_0 %int_2
+         %91 = OpConvertSToF %float %90
+               OpStore %c %91
+         %92 = OpLoad %float %c
+               OpReturnValue %92
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-pre-increment-clamp/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-pre-increment-clamp/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..408d89c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-pre-increment-clamp/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,74 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_14 : register(b1, space0) {
+  uint4 x_14[2];
+};
+
+float f1_f1_(inout float a) {
+  int b = 0;
+  float c = 0.0f;
+  b = 8;
+  const float x_71 = gl_FragCoord.y;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_73 = asfloat(x_9[scalar_offset / 4][scalar_offset % 4]);
+  if ((x_71 >= x_73)) {
+    b = (b + 1);
+    b = (b + 1);
+  }
+  const float x_81 = a;
+  const float x_83 = asfloat(x_9[1].x);
+  if ((x_81 < x_83)) {
+    const float x_88 = asfloat(x_9[1].x);
+    return x_88;
+  }
+  c = float(clamp(b, 0, 2));
+  return c;
+}
+
+void main_1() {
+  float a_1 = 0.0f;
+  float param = 0.0f;
+  const float x_43 = asfloat(x_9[1].x);
+  param = x_43;
+  const float x_44 = f1_f1_(param);
+  a_1 = x_44;
+  const float x_45 = a_1;
+  const float x_47 = asfloat(x_9[2].x);
+  if ((x_45 == x_47)) {
+    const int x_53 = asint(x_14[1].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_56 = asint(x_14[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_59 = asint(x_14[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_62 = asint(x_14[1].x);
+    x_GLF_color = float4(float(x_53), float(x_56), float(x_59), float(x_62));
+  } else {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_66 = asint(x_14[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const float x_67 = float(x_66);
+    x_GLF_color = float4(x_67, x_67, x_67, x_67);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-pre-increment-clamp/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-pre-increment-clamp/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..b727426
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-pre-increment-clamp/0-opt.spvasm.expected.msl
@@ -0,0 +1,87 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float f1_f1_(constant buf0& x_9, thread float* const a, thread float4* const tint_symbol_5) {
+  int b = 0;
+  float c = 0.0f;
+  b = 8;
+  float const x_71 = (*(tint_symbol_5)).y;
+  float const x_73 = x_9.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_71 >= x_73)) {
+    int const x_77 = b;
+    b = (x_77 + 1);
+    int const x_79 = b;
+    b = (x_79 + 1);
+  }
+  float const x_81 = *(a);
+  float const x_83 = x_9.x_GLF_uniform_float_values.arr[1].el;
+  if ((x_81 < x_83)) {
+    float const x_88 = x_9.x_GLF_uniform_float_values.arr[1].el;
+    return x_88;
+  }
+  int const x_89 = b;
+  c = float(clamp(x_89, 0, 2));
+  float const x_92 = c;
+  return x_92;
+}
+
+void main_1(constant buf0& x_9, constant buf1& x_14, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  float a_1 = 0.0f;
+  float param = 0.0f;
+  float const x_43 = x_9.x_GLF_uniform_float_values.arr[1].el;
+  param = x_43;
+  float const x_44 = f1_f1_(x_9, &(param), tint_symbol_6);
+  a_1 = x_44;
+  float const x_45 = a_1;
+  float const x_47 = x_9.x_GLF_uniform_float_values.arr[2].el;
+  if ((x_45 == x_47)) {
+    int const x_53 = x_14.x_GLF_uniform_int_values.arr[1].el;
+    int const x_56 = x_14.x_GLF_uniform_int_values.arr[0].el;
+    int const x_59 = x_14.x_GLF_uniform_int_values.arr[0].el;
+    int const x_62 = x_14.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_7) = float4(float(x_53), float(x_56), float(x_59), float(x_62));
+  } else {
+    int const x_66 = x_14.x_GLF_uniform_int_values.arr[0].el;
+    float const x_67 = float(x_66);
+    *(tint_symbol_7) = float4(x_67, x_67, x_67, x_67);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_9 [[buffer(0)]], constant buf1& x_14 [[buffer(1)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_9, x_14, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-pre-increment-clamp/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-pre-increment-clamp/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..3c4cb67
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-pre-increment-clamp/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,186 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 115
+; Schema: 0
+               OpCapability Shader
+         %64 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_14 "x_14"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %f1_f1_ "f1_f1_"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %main_1 "main_1"
+               OpName %a_1 "a_1"
+               OpName %param "param"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_14 NonWritable
+               OpDecorate %x_14 DescriptorSet 0
+               OpDecorate %x_14 Binding 1
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf0 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_14 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Function_float = OpTypePointer Function %float
+         %23 = OpTypeFunction %float %_ptr_Function_float
+%_ptr_Function_int = OpTypePointer Function %int
+         %30 = OpConstantNull %int
+         %32 = OpConstantNull %float
+      %int_8 = OpConstant %int 8
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+       %void = OpTypeVoid
+         %67 = OpTypeFunction %void
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+        %102 = OpTypeFunction %void %main_out
+     %f1_f1_ = OpFunction %float None %23
+          %a = OpFunctionParameter %_ptr_Function_float
+         %27 = OpLabel
+          %b = OpVariable %_ptr_Function_int Function %30
+          %c = OpVariable %_ptr_Function_float Function %32
+               OpStore %b %int_8
+         %36 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %37 = OpLoad %float %36
+         %41 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_0
+         %42 = OpLoad %float %41
+         %43 = OpFOrdGreaterThanEqual %bool %37 %42
+               OpSelectionMerge %45 None
+               OpBranchConditional %43 %46 %45
+         %46 = OpLabel
+         %47 = OpLoad %int %b
+         %49 = OpIAdd %int %47 %int_1
+               OpStore %b %49
+         %50 = OpLoad %int %b
+         %51 = OpIAdd %int %50 %int_1
+               OpStore %b %51
+               OpBranch %45
+         %45 = OpLabel
+         %53 = OpLoad %float %a
+         %54 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_1
+         %55 = OpLoad %float %54
+         %56 = OpFOrdLessThan %bool %53 %55
+               OpSelectionMerge %57 None
+               OpBranchConditional %56 %58 %57
+         %58 = OpLabel
+         %59 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_1
+         %60 = OpLoad %float %59
+               OpReturnValue %60
+         %57 = OpLabel
+         %61 = OpLoad %int %b
+         %63 = OpExtInst %int %64 SClamp %61 %int_0 %int_2
+         %62 = OpConvertSToF %float %63
+               OpStore %c %62
+         %66 = OpLoad %float %c
+               OpReturnValue %66
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %67
+         %70 = OpLabel
+        %a_1 = OpVariable %_ptr_Function_float Function %32
+      %param = OpVariable %_ptr_Function_float Function %32
+         %73 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_1
+         %74 = OpLoad %float %73
+               OpStore %param %74
+         %75 = OpFunctionCall %float %f1_f1_ %param
+               OpStore %a_1 %75
+         %77 = OpLoad %float %a_1
+         %78 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_2
+         %79 = OpLoad %float %78
+         %80 = OpFOrdEqual %bool %77 %79
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %83
+         %82 = OpLabel
+         %85 = OpAccessChain %_ptr_Uniform_int %x_14 %uint_0 %int_1
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_Uniform_int %x_14 %uint_0 %int_0
+         %88 = OpLoad %int %87
+         %89 = OpAccessChain %_ptr_Uniform_int %x_14 %uint_0 %int_0
+         %90 = OpLoad %int %89
+         %91 = OpAccessChain %_ptr_Uniform_int %x_14 %uint_0 %int_1
+         %92 = OpLoad %int %91
+         %93 = OpConvertSToF %float %86
+         %94 = OpConvertSToF %float %88
+         %95 = OpConvertSToF %float %90
+         %96 = OpConvertSToF %float %92
+         %97 = OpCompositeConstruct %v4float %93 %94 %95 %96
+               OpStore %x_GLF_color %97
+               OpBranch %81
+         %83 = OpLabel
+         %98 = OpAccessChain %_ptr_Uniform_int %x_14 %uint_0 %int_0
+         %99 = OpLoad %int %98
+        %100 = OpConvertSToF %float %99
+        %101 = OpCompositeConstruct %v4float %100 %100 %100 %100
+               OpStore %x_GLF_color %101
+               OpBranch %81
+         %81 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %102
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %106 = OpLabel
+        %107 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %107
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %67
+        %109 = OpLabel
+        %110 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %110
+        %111 = OpFunctionCall %void %main_1
+        %113 = OpLoad %v4float %x_GLF_color
+        %114 = OpCompositeConstruct %main_out %113
+        %112 = OpFunctionCall %void %tint_symbol_3 %114
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-pre-increment-clamp/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-pre-increment-clamp/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..1a497da
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-pre-increment-clamp/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,80 @@
+type Arr = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_14 : buf1;
+
+fn f1_f1_(a : ptr<function, f32>) -> f32 {
+  var b : i32;
+  var c : f32;
+  b = 8;
+  let x_71 : f32 = gl_FragCoord.y;
+  let x_73 : f32 = x_9.x_GLF_uniform_float_values[0];
+  if ((x_71 >= x_73)) {
+    let x_77 : i32 = b;
+    b = (x_77 + 1);
+    let x_79 : i32 = b;
+    b = (x_79 + 1);
+  }
+  let x_81 : f32 = *(a);
+  let x_83 : f32 = x_9.x_GLF_uniform_float_values[1];
+  if ((x_81 < x_83)) {
+    let x_88 : f32 = x_9.x_GLF_uniform_float_values[1];
+    return x_88;
+  }
+  let x_89 : i32 = b;
+  c = f32(clamp(x_89, 0, 2));
+  let x_92 : f32 = c;
+  return x_92;
+}
+
+fn main_1() {
+  var a_1 : f32;
+  var param : f32;
+  let x_43 : f32 = x_9.x_GLF_uniform_float_values[1];
+  param = x_43;
+  let x_44 : f32 = f1_f1_(&(param));
+  a_1 = x_44;
+  let x_45 : f32 = a_1;
+  let x_47 : f32 = x_9.x_GLF_uniform_float_values[2];
+  if ((x_45 == x_47)) {
+    let x_53 : i32 = x_14.x_GLF_uniform_int_values[1];
+    let x_56 : i32 = x_14.x_GLF_uniform_int_values[0];
+    let x_59 : i32 = x_14.x_GLF_uniform_int_values[0];
+    let x_62 : i32 = x_14.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_53), f32(x_56), f32(x_59), f32(x_62));
+  } else {
+    let x_66 : i32 = x_14.x_GLF_uniform_int_values[0];
+    let x_67 : f32 = f32(x_66);
+    x_GLF_color = vec4<f32>(x_67, x_67, x_67, x_67);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-pre-increment-clamp/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-pre-increment-clamp/0-opt.wgsl
new file mode 100644
index 0000000..1a497da
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-pre-increment-clamp/0-opt.wgsl
@@ -0,0 +1,80 @@
+type Arr = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_14 : buf1;
+
+fn f1_f1_(a : ptr<function, f32>) -> f32 {
+  var b : i32;
+  var c : f32;
+  b = 8;
+  let x_71 : f32 = gl_FragCoord.y;
+  let x_73 : f32 = x_9.x_GLF_uniform_float_values[0];
+  if ((x_71 >= x_73)) {
+    let x_77 : i32 = b;
+    b = (x_77 + 1);
+    let x_79 : i32 = b;
+    b = (x_79 + 1);
+  }
+  let x_81 : f32 = *(a);
+  let x_83 : f32 = x_9.x_GLF_uniform_float_values[1];
+  if ((x_81 < x_83)) {
+    let x_88 : f32 = x_9.x_GLF_uniform_float_values[1];
+    return x_88;
+  }
+  let x_89 : i32 = b;
+  c = f32(clamp(x_89, 0, 2));
+  let x_92 : f32 = c;
+  return x_92;
+}
+
+fn main_1() {
+  var a_1 : f32;
+  var param : f32;
+  let x_43 : f32 = x_9.x_GLF_uniform_float_values[1];
+  param = x_43;
+  let x_44 : f32 = f1_f1_(&(param));
+  a_1 = x_44;
+  let x_45 : f32 = a_1;
+  let x_47 : f32 = x_9.x_GLF_uniform_float_values[2];
+  if ((x_45 == x_47)) {
+    let x_53 : i32 = x_14.x_GLF_uniform_int_values[1];
+    let x_56 : i32 = x_14.x_GLF_uniform_int_values[0];
+    let x_59 : i32 = x_14.x_GLF_uniform_int_values[0];
+    let x_62 : i32 = x_14.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_53), f32(x_56), f32(x_59), f32(x_62));
+  } else {
+    let x_66 : i32 = x_14.x_GLF_uniform_int_values[0];
+    let x_67 : f32 = f32(x_66);
+    x_GLF_color = vec4<f32>(x_67, x_67, x_67, x_67);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-pre-increment-clamp/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-pre-increment-clamp/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..408d89c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-pre-increment-clamp/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,74 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_14 : register(b1, space0) {
+  uint4 x_14[2];
+};
+
+float f1_f1_(inout float a) {
+  int b = 0;
+  float c = 0.0f;
+  b = 8;
+  const float x_71 = gl_FragCoord.y;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_73 = asfloat(x_9[scalar_offset / 4][scalar_offset % 4]);
+  if ((x_71 >= x_73)) {
+    b = (b + 1);
+    b = (b + 1);
+  }
+  const float x_81 = a;
+  const float x_83 = asfloat(x_9[1].x);
+  if ((x_81 < x_83)) {
+    const float x_88 = asfloat(x_9[1].x);
+    return x_88;
+  }
+  c = float(clamp(b, 0, 2));
+  return c;
+}
+
+void main_1() {
+  float a_1 = 0.0f;
+  float param = 0.0f;
+  const float x_43 = asfloat(x_9[1].x);
+  param = x_43;
+  const float x_44 = f1_f1_(param);
+  a_1 = x_44;
+  const float x_45 = a_1;
+  const float x_47 = asfloat(x_9[2].x);
+  if ((x_45 == x_47)) {
+    const int x_53 = asint(x_14[1].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_56 = asint(x_14[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_59 = asint(x_14[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_62 = asint(x_14[1].x);
+    x_GLF_color = float4(float(x_53), float(x_56), float(x_59), float(x_62));
+  } else {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_66 = asint(x_14[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const float x_67 = float(x_66);
+    x_GLF_color = float4(x_67, x_67, x_67, x_67);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-pre-increment-clamp/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-pre-increment-clamp/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..b727426
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-pre-increment-clamp/0-opt.wgsl.expected.msl
@@ -0,0 +1,87 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float f1_f1_(constant buf0& x_9, thread float* const a, thread float4* const tint_symbol_5) {
+  int b = 0;
+  float c = 0.0f;
+  b = 8;
+  float const x_71 = (*(tint_symbol_5)).y;
+  float const x_73 = x_9.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_71 >= x_73)) {
+    int const x_77 = b;
+    b = (x_77 + 1);
+    int const x_79 = b;
+    b = (x_79 + 1);
+  }
+  float const x_81 = *(a);
+  float const x_83 = x_9.x_GLF_uniform_float_values.arr[1].el;
+  if ((x_81 < x_83)) {
+    float const x_88 = x_9.x_GLF_uniform_float_values.arr[1].el;
+    return x_88;
+  }
+  int const x_89 = b;
+  c = float(clamp(x_89, 0, 2));
+  float const x_92 = c;
+  return x_92;
+}
+
+void main_1(constant buf0& x_9, constant buf1& x_14, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  float a_1 = 0.0f;
+  float param = 0.0f;
+  float const x_43 = x_9.x_GLF_uniform_float_values.arr[1].el;
+  param = x_43;
+  float const x_44 = f1_f1_(x_9, &(param), tint_symbol_6);
+  a_1 = x_44;
+  float const x_45 = a_1;
+  float const x_47 = x_9.x_GLF_uniform_float_values.arr[2].el;
+  if ((x_45 == x_47)) {
+    int const x_53 = x_14.x_GLF_uniform_int_values.arr[1].el;
+    int const x_56 = x_14.x_GLF_uniform_int_values.arr[0].el;
+    int const x_59 = x_14.x_GLF_uniform_int_values.arr[0].el;
+    int const x_62 = x_14.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_7) = float4(float(x_53), float(x_56), float(x_59), float(x_62));
+  } else {
+    int const x_66 = x_14.x_GLF_uniform_int_values.arr[0].el;
+    float const x_67 = float(x_66);
+    *(tint_symbol_7) = float4(x_67, x_67, x_67, x_67);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_9 [[buffer(0)]], constant buf1& x_14 [[buffer(1)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_9, x_14, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-pre-increment-clamp/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-pre-increment-clamp/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..3c4cb67
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-pre-increment-clamp/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,186 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 115
+; Schema: 0
+               OpCapability Shader
+         %64 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_14 "x_14"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %f1_f1_ "f1_f1_"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %main_1 "main_1"
+               OpName %a_1 "a_1"
+               OpName %param "param"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_14 NonWritable
+               OpDecorate %x_14 DescriptorSet 0
+               OpDecorate %x_14 Binding 1
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf0 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_14 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Function_float = OpTypePointer Function %float
+         %23 = OpTypeFunction %float %_ptr_Function_float
+%_ptr_Function_int = OpTypePointer Function %int
+         %30 = OpConstantNull %int
+         %32 = OpConstantNull %float
+      %int_8 = OpConstant %int 8
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+       %void = OpTypeVoid
+         %67 = OpTypeFunction %void
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+        %102 = OpTypeFunction %void %main_out
+     %f1_f1_ = OpFunction %float None %23
+          %a = OpFunctionParameter %_ptr_Function_float
+         %27 = OpLabel
+          %b = OpVariable %_ptr_Function_int Function %30
+          %c = OpVariable %_ptr_Function_float Function %32
+               OpStore %b %int_8
+         %36 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %37 = OpLoad %float %36
+         %41 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_0
+         %42 = OpLoad %float %41
+         %43 = OpFOrdGreaterThanEqual %bool %37 %42
+               OpSelectionMerge %45 None
+               OpBranchConditional %43 %46 %45
+         %46 = OpLabel
+         %47 = OpLoad %int %b
+         %49 = OpIAdd %int %47 %int_1
+               OpStore %b %49
+         %50 = OpLoad %int %b
+         %51 = OpIAdd %int %50 %int_1
+               OpStore %b %51
+               OpBranch %45
+         %45 = OpLabel
+         %53 = OpLoad %float %a
+         %54 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_1
+         %55 = OpLoad %float %54
+         %56 = OpFOrdLessThan %bool %53 %55
+               OpSelectionMerge %57 None
+               OpBranchConditional %56 %58 %57
+         %58 = OpLabel
+         %59 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_1
+         %60 = OpLoad %float %59
+               OpReturnValue %60
+         %57 = OpLabel
+         %61 = OpLoad %int %b
+         %63 = OpExtInst %int %64 SClamp %61 %int_0 %int_2
+         %62 = OpConvertSToF %float %63
+               OpStore %c %62
+         %66 = OpLoad %float %c
+               OpReturnValue %66
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %67
+         %70 = OpLabel
+        %a_1 = OpVariable %_ptr_Function_float Function %32
+      %param = OpVariable %_ptr_Function_float Function %32
+         %73 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_1
+         %74 = OpLoad %float %73
+               OpStore %param %74
+         %75 = OpFunctionCall %float %f1_f1_ %param
+               OpStore %a_1 %75
+         %77 = OpLoad %float %a_1
+         %78 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_2
+         %79 = OpLoad %float %78
+         %80 = OpFOrdEqual %bool %77 %79
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %83
+         %82 = OpLabel
+         %85 = OpAccessChain %_ptr_Uniform_int %x_14 %uint_0 %int_1
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_Uniform_int %x_14 %uint_0 %int_0
+         %88 = OpLoad %int %87
+         %89 = OpAccessChain %_ptr_Uniform_int %x_14 %uint_0 %int_0
+         %90 = OpLoad %int %89
+         %91 = OpAccessChain %_ptr_Uniform_int %x_14 %uint_0 %int_1
+         %92 = OpLoad %int %91
+         %93 = OpConvertSToF %float %86
+         %94 = OpConvertSToF %float %88
+         %95 = OpConvertSToF %float %90
+         %96 = OpConvertSToF %float %92
+         %97 = OpCompositeConstruct %v4float %93 %94 %95 %96
+               OpStore %x_GLF_color %97
+               OpBranch %81
+         %83 = OpLabel
+         %98 = OpAccessChain %_ptr_Uniform_int %x_14 %uint_0 %int_0
+         %99 = OpLoad %int %98
+        %100 = OpConvertSToF %float %99
+        %101 = OpCompositeConstruct %v4float %100 %100 %100 %100
+               OpStore %x_GLF_color %101
+               OpBranch %81
+         %81 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %102
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %106 = OpLabel
+        %107 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %107
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %67
+        %109 = OpLabel
+        %110 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %110
+        %111 = OpFunctionCall %void %main_1
+        %113 = OpLoad %v4float %x_GLF_color
+        %114 = OpCompositeConstruct %main_out %113
+        %112 = OpFunctionCall %void %tint_symbol_3 %114
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-pre-increment-clamp/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-pre-increment-clamp/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..1a497da
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-pre-increment-clamp/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,80 @@
+type Arr = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_14 : buf1;
+
+fn f1_f1_(a : ptr<function, f32>) -> f32 {
+  var b : i32;
+  var c : f32;
+  b = 8;
+  let x_71 : f32 = gl_FragCoord.y;
+  let x_73 : f32 = x_9.x_GLF_uniform_float_values[0];
+  if ((x_71 >= x_73)) {
+    let x_77 : i32 = b;
+    b = (x_77 + 1);
+    let x_79 : i32 = b;
+    b = (x_79 + 1);
+  }
+  let x_81 : f32 = *(a);
+  let x_83 : f32 = x_9.x_GLF_uniform_float_values[1];
+  if ((x_81 < x_83)) {
+    let x_88 : f32 = x_9.x_GLF_uniform_float_values[1];
+    return x_88;
+  }
+  let x_89 : i32 = b;
+  c = f32(clamp(x_89, 0, 2));
+  let x_92 : f32 = c;
+  return x_92;
+}
+
+fn main_1() {
+  var a_1 : f32;
+  var param : f32;
+  let x_43 : f32 = x_9.x_GLF_uniform_float_values[1];
+  param = x_43;
+  let x_44 : f32 = f1_f1_(&(param));
+  a_1 = x_44;
+  let x_45 : f32 = a_1;
+  let x_47 : f32 = x_9.x_GLF_uniform_float_values[2];
+  if ((x_45 == x_47)) {
+    let x_53 : i32 = x_14.x_GLF_uniform_int_values[1];
+    let x_56 : i32 = x_14.x_GLF_uniform_int_values[0];
+    let x_59 : i32 = x_14.x_GLF_uniform_int_values[0];
+    let x_62 : i32 = x_14.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_53), f32(x_56), f32(x_59), f32(x_62));
+  } else {
+    let x_66 : i32 = x_14.x_GLF_uniform_int_values[0];
+    let x_67 : f32 = f32(x_66);
+    x_GLF_color = vec4<f32>(x_67, x_67, x_67, x_67);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ternary-vector-access/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ternary-vector-access/0-opt.spvasm
new file mode 100644
index 0000000..97c8528
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ternary-vector-access/0-opt.spvasm
@@ -0,0 +1,114 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %b "b"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_arr_float_uint_4 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+       %buf0 = OpTypeStruct %_arr_float_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_1 = OpConstant %int 1
+      %int_3 = OpConstant %int 3
+    %v3float = OpTypeVector %float 3
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %main = OpFunction %void None %14
+         %37 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+          %b = OpVariable %_ptr_Function_float Function
+         %38 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %39 = OpLoad %float %38
+         %40 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %41 = OpLoad %float %40
+         %42 = OpFOrdGreaterThanEqual %bool %39 %41
+         %43 = OpSelect %int %42 %int_0 %int_2
+               OpStore %a %43
+         %44 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %45 = OpLoad %float %44
+         %46 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %47 = OpLoad %float %46
+         %48 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_3
+         %49 = OpLoad %float %48
+         %50 = OpCompositeConstruct %v3float %45 %47 %49
+         %51 = OpLoad %int %a
+         %52 = OpVectorExtractDynamic %float %50 %51
+               OpStore %b %52
+         %53 = OpLoad %float %b
+         %54 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %55 = OpLoad %float %54
+         %56 = OpFOrdEqual %bool %53 %55
+               OpSelectionMerge %57 None
+               OpBranchConditional %56 %58 %59
+         %58 = OpLabel
+         %60 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %61 = OpLoad %int %60
+         %62 = OpConvertSToF %float %61
+         %63 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %64 = OpLoad %int %63
+         %65 = OpConvertSToF %float %64
+         %66 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %67 = OpLoad %int %66
+         %68 = OpConvertSToF %float %67
+         %69 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %70 = OpLoad %int %69
+         %71 = OpConvertSToF %float %70
+         %72 = OpCompositeConstruct %v4float %62 %65 %68 %71
+               OpStore %_GLF_color %72
+               OpBranch %57
+         %59 = OpLabel
+         %73 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %74 = OpLoad %int %73
+         %75 = OpConvertSToF %float %74
+         %76 = OpCompositeConstruct %v4float %75 %75 %75 %75
+               OpStore %_GLF_color %76
+               OpBranch %57
+         %57 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ternary-vector-access/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ternary-vector-access/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..1aa4c95
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ternary-vector-access/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,57 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_10 : register(b1, space0) {
+  uint4 x_10[2];
+};
+
+void main_1() {
+  int a = 0;
+  float b = 0.0f;
+  const float x_39 = gl_FragCoord.y;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_41 = asfloat(x_7[scalar_offset / 4][scalar_offset % 4]);
+  a = ((x_39 >= x_41) ? 0 : 2);
+  const float x_45 = asfloat(x_7[1].x);
+  const float x_47 = asfloat(x_7[2].x);
+  const float x_49 = asfloat(x_7[3].x);
+  b = float3(x_45, x_47, x_49)[a];
+  const float x_53 = b;
+  const float x_55 = asfloat(x_7[1].x);
+  if ((x_53 == x_55)) {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_61 = asint(x_10[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const int x_64 = asint(x_10[1].x);
+    const int x_67 = asint(x_10[1].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_70 = asint(x_10[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    x_GLF_color = float4(float(x_61), float(x_64), float(x_67), float(x_70));
+  } else {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_74 = asint(x_10[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const float x_75 = float(x_74);
+    x_GLF_color = float4(x_75, x_75, x_75, x_75);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ternary-vector-access/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ternary-vector-access/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..4dbabec
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ternary-vector-access/0-opt.spvasm.expected.msl
@@ -0,0 +1,67 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, constant buf1& x_10, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int a = 0;
+  float b = 0.0f;
+  float const x_39 = (*(tint_symbol_5)).y;
+  float const x_41 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  a = select(2, 0, (x_39 >= x_41));
+  float const x_45 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  float const x_47 = x_7.x_GLF_uniform_float_values.arr[2].el;
+  float const x_49 = x_7.x_GLF_uniform_float_values.arr[3].el;
+  int const x_51 = a;
+  b = float3(x_45, x_47, x_49)[x_51];
+  float const x_53 = b;
+  float const x_55 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  if ((x_53 == x_55)) {
+    int const x_61 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    int const x_64 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_67 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_70 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_6) = float4(float(x_61), float(x_64), float(x_67), float(x_70));
+  } else {
+    int const x_74 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    float const x_75 = float(x_74);
+    *(tint_symbol_6) = float4(x_75, x_75, x_75, x_75);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]], constant buf1& x_10 [[buffer(1)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_7, x_10, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ternary-vector-access/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ternary-vector-access/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..f6de722
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ternary-vector-access/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,153 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 96
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_4 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 1
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+       %buf0 = OpTypeStruct %_arr_float_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_10 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpConstantNull %int
+%_ptr_Function_float = OpTypePointer Function %float
+         %32 = OpConstantNull %float
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+      %int_1 = OpConstant %int 1
+      %int_3 = OpConstant %int 3
+    %v3float = OpTypeVector %float 3
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+         %83 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %23
+         %26 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %29
+          %b = OpVariable %_ptr_Function_float Function %32
+         %35 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %36 = OpLoad %float %35
+         %40 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %41 = OpLoad %float %40
+         %43 = OpFOrdGreaterThanEqual %bool %36 %41
+         %42 = OpSelect %int %43 %int_0 %int_2
+               OpStore %a %42
+         %47 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %48 = OpLoad %float %47
+         %49 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_2
+         %50 = OpLoad %float %49
+         %52 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_3
+         %53 = OpLoad %float %52
+         %54 = OpLoad %int %a
+         %56 = OpCompositeConstruct %v3float %48 %50 %53
+         %57 = OpVectorExtractDynamic %float %56 %54
+               OpStore %b %57
+         %58 = OpLoad %float %b
+         %59 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %60 = OpLoad %float %59
+         %61 = OpFOrdEqual %bool %58 %60
+               OpSelectionMerge %62 None
+               OpBranchConditional %61 %63 %64
+         %63 = OpLabel
+         %66 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %67 = OpLoad %int %66
+         %68 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %69 = OpLoad %int %68
+         %70 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %71 = OpLoad %int %70
+         %72 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %73 = OpLoad %int %72
+         %74 = OpConvertSToF %float %67
+         %75 = OpConvertSToF %float %69
+         %76 = OpConvertSToF %float %71
+         %77 = OpConvertSToF %float %73
+         %78 = OpCompositeConstruct %v4float %74 %75 %76 %77
+               OpStore %x_GLF_color %78
+               OpBranch %62
+         %64 = OpLabel
+         %79 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %80 = OpLoad %int %79
+         %81 = OpConvertSToF %float %80
+         %82 = OpCompositeConstruct %v4float %81 %81 %81 %81
+               OpStore %x_GLF_color %82
+               OpBranch %62
+         %62 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %83
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %87 = OpLabel
+         %88 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %88
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %23
+         %90 = OpLabel
+         %91 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %91
+         %92 = OpFunctionCall %void %main_1
+         %94 = OpLoad %v4float %x_GLF_color
+         %95 = OpCompositeConstruct %main_out %94
+         %93 = OpFunctionCall %void %tint_symbol_3 %95
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ternary-vector-access/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ternary-vector-access/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..2e2a9f1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ternary-vector-access/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,60 @@
+type Arr = [[stride(16)]] array<f32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+fn main_1() {
+  var a : i32;
+  var b : f32;
+  let x_39 : f32 = gl_FragCoord.y;
+  let x_41 : f32 = x_7.x_GLF_uniform_float_values[0];
+  a = select(2, 0, (x_39 >= x_41));
+  let x_45 : f32 = x_7.x_GLF_uniform_float_values[1];
+  let x_47 : f32 = x_7.x_GLF_uniform_float_values[2];
+  let x_49 : f32 = x_7.x_GLF_uniform_float_values[3];
+  let x_51 : i32 = a;
+  b = vec3<f32>(x_45, x_47, x_49)[x_51];
+  let x_53 : f32 = b;
+  let x_55 : f32 = x_7.x_GLF_uniform_float_values[1];
+  if ((x_53 == x_55)) {
+    let x_61 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_64 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_67 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_70 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_61), f32(x_64), f32(x_67), f32(x_70));
+  } else {
+    let x_74 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_75 : f32 = f32(x_74);
+    x_GLF_color = vec4<f32>(x_75, x_75, x_75, x_75);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ternary-vector-access/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ternary-vector-access/0-opt.wgsl
new file mode 100644
index 0000000..2e2a9f1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ternary-vector-access/0-opt.wgsl
@@ -0,0 +1,60 @@
+type Arr = [[stride(16)]] array<f32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+fn main_1() {
+  var a : i32;
+  var b : f32;
+  let x_39 : f32 = gl_FragCoord.y;
+  let x_41 : f32 = x_7.x_GLF_uniform_float_values[0];
+  a = select(2, 0, (x_39 >= x_41));
+  let x_45 : f32 = x_7.x_GLF_uniform_float_values[1];
+  let x_47 : f32 = x_7.x_GLF_uniform_float_values[2];
+  let x_49 : f32 = x_7.x_GLF_uniform_float_values[3];
+  let x_51 : i32 = a;
+  b = vec3<f32>(x_45, x_47, x_49)[x_51];
+  let x_53 : f32 = b;
+  let x_55 : f32 = x_7.x_GLF_uniform_float_values[1];
+  if ((x_53 == x_55)) {
+    let x_61 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_64 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_67 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_70 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_61), f32(x_64), f32(x_67), f32(x_70));
+  } else {
+    let x_74 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_75 : f32 = f32(x_74);
+    x_GLF_color = vec4<f32>(x_75, x_75, x_75, x_75);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ternary-vector-access/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ternary-vector-access/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..1aa4c95
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ternary-vector-access/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,57 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_10 : register(b1, space0) {
+  uint4 x_10[2];
+};
+
+void main_1() {
+  int a = 0;
+  float b = 0.0f;
+  const float x_39 = gl_FragCoord.y;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_41 = asfloat(x_7[scalar_offset / 4][scalar_offset % 4]);
+  a = ((x_39 >= x_41) ? 0 : 2);
+  const float x_45 = asfloat(x_7[1].x);
+  const float x_47 = asfloat(x_7[2].x);
+  const float x_49 = asfloat(x_7[3].x);
+  b = float3(x_45, x_47, x_49)[a];
+  const float x_53 = b;
+  const float x_55 = asfloat(x_7[1].x);
+  if ((x_53 == x_55)) {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_61 = asint(x_10[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const int x_64 = asint(x_10[1].x);
+    const int x_67 = asint(x_10[1].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_70 = asint(x_10[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    x_GLF_color = float4(float(x_61), float(x_64), float(x_67), float(x_70));
+  } else {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_74 = asint(x_10[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const float x_75 = float(x_74);
+    x_GLF_color = float4(x_75, x_75, x_75, x_75);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ternary-vector-access/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ternary-vector-access/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..4dbabec
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ternary-vector-access/0-opt.wgsl.expected.msl
@@ -0,0 +1,67 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, constant buf1& x_10, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int a = 0;
+  float b = 0.0f;
+  float const x_39 = (*(tint_symbol_5)).y;
+  float const x_41 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  a = select(2, 0, (x_39 >= x_41));
+  float const x_45 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  float const x_47 = x_7.x_GLF_uniform_float_values.arr[2].el;
+  float const x_49 = x_7.x_GLF_uniform_float_values.arr[3].el;
+  int const x_51 = a;
+  b = float3(x_45, x_47, x_49)[x_51];
+  float const x_53 = b;
+  float const x_55 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  if ((x_53 == x_55)) {
+    int const x_61 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    int const x_64 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_67 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_70 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_6) = float4(float(x_61), float(x_64), float(x_67), float(x_70));
+  } else {
+    int const x_74 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    float const x_75 = float(x_74);
+    *(tint_symbol_6) = float4(x_75, x_75, x_75, x_75);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]], constant buf1& x_10 [[buffer(1)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_7, x_10, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ternary-vector-access/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ternary-vector-access/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..f6de722
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ternary-vector-access/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,153 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 96
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_4 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 1
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+       %buf0 = OpTypeStruct %_arr_float_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_10 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpConstantNull %int
+%_ptr_Function_float = OpTypePointer Function %float
+         %32 = OpConstantNull %float
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+      %int_1 = OpConstant %int 1
+      %int_3 = OpConstant %int 3
+    %v3float = OpTypeVector %float 3
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+         %83 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %23
+         %26 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %29
+          %b = OpVariable %_ptr_Function_float Function %32
+         %35 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %36 = OpLoad %float %35
+         %40 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %41 = OpLoad %float %40
+         %43 = OpFOrdGreaterThanEqual %bool %36 %41
+         %42 = OpSelect %int %43 %int_0 %int_2
+               OpStore %a %42
+         %47 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %48 = OpLoad %float %47
+         %49 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_2
+         %50 = OpLoad %float %49
+         %52 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_3
+         %53 = OpLoad %float %52
+         %54 = OpLoad %int %a
+         %56 = OpCompositeConstruct %v3float %48 %50 %53
+         %57 = OpVectorExtractDynamic %float %56 %54
+               OpStore %b %57
+         %58 = OpLoad %float %b
+         %59 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %60 = OpLoad %float %59
+         %61 = OpFOrdEqual %bool %58 %60
+               OpSelectionMerge %62 None
+               OpBranchConditional %61 %63 %64
+         %63 = OpLabel
+         %66 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %67 = OpLoad %int %66
+         %68 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %69 = OpLoad %int %68
+         %70 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %71 = OpLoad %int %70
+         %72 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %73 = OpLoad %int %72
+         %74 = OpConvertSToF %float %67
+         %75 = OpConvertSToF %float %69
+         %76 = OpConvertSToF %float %71
+         %77 = OpConvertSToF %float %73
+         %78 = OpCompositeConstruct %v4float %74 %75 %76 %77
+               OpStore %x_GLF_color %78
+               OpBranch %62
+         %64 = OpLabel
+         %79 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %80 = OpLoad %int %79
+         %81 = OpConvertSToF %float %80
+         %82 = OpCompositeConstruct %v4float %81 %81 %81 %81
+               OpStore %x_GLF_color %82
+               OpBranch %62
+         %62 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %83
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %87 = OpLabel
+         %88 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %88
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %23
+         %90 = OpLabel
+         %91 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %91
+         %92 = OpFunctionCall %void %main_1
+         %94 = OpLoad %v4float %x_GLF_color
+         %95 = OpCompositeConstruct %main_out %94
+         %93 = OpFunctionCall %void %tint_symbol_3 %95
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ternary-vector-access/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ternary-vector-access/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..2e2a9f1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-ternary-vector-access/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,60 @@
+type Arr = [[stride(16)]] array<f32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+fn main_1() {
+  var a : i32;
+  var b : f32;
+  let x_39 : f32 = gl_FragCoord.y;
+  let x_41 : f32 = x_7.x_GLF_uniform_float_values[0];
+  a = select(2, 0, (x_39 >= x_41));
+  let x_45 : f32 = x_7.x_GLF_uniform_float_values[1];
+  let x_47 : f32 = x_7.x_GLF_uniform_float_values[2];
+  let x_49 : f32 = x_7.x_GLF_uniform_float_values[3];
+  let x_51 : i32 = a;
+  b = vec3<f32>(x_45, x_47, x_49)[x_51];
+  let x_53 : f32 = b;
+  let x_55 : f32 = x_7.x_GLF_uniform_float_values[1];
+  if ((x_53 == x_55)) {
+    let x_61 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_64 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_67 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_70 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_61), f32(x_64), f32(x_67), f32(x_70));
+  } else {
+    let x_74 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_75 : f32 = f32(x_74);
+    x_GLF_color = vec4<f32>(x_75, x_75, x_75, x_75);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-while-modulo/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-while-modulo/0-opt.spvasm
new file mode 100644
index 0000000..8401a53
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-while-modulo/0-opt.spvasm
@@ -0,0 +1,101 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %i "i"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+      %int_1 = OpConstant %int 1
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %main = OpFunction %void None %12
+         %30 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+         %31 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %32 = OpLoad %int %31
+               OpStore %i %32
+               OpBranch %33
+         %33 = OpLabel
+               OpLoopMerge %34 %35 None
+               OpBranch %36
+         %36 = OpLabel
+         %37 = OpLoad %int %i
+         %38 = OpSGreaterThanEqual %bool %37 %int_0
+               OpBranchConditional %38 %39 %34
+         %39 = OpLabel
+         %40 = OpLoad %int %i
+         %41 = OpSMod %int %40 %int_2
+         %42 = OpIEqual %bool %41 %int_0
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %45
+         %44 = OpLabel
+         %46 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %47 = OpLoad %int %46
+         %48 = OpConvertSToF %float %47
+         %49 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %50 = OpLoad %int %49
+         %51 = OpConvertSToF %float %50
+         %52 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %53 = OpLoad %int %52
+         %54 = OpConvertSToF %float %53
+         %55 = OpCompositeConstruct %v4float %float_1 %48 %51 %54
+               OpStore %_GLF_color %55
+               OpBranch %43
+         %45 = OpLabel
+         %56 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %57 = OpLoad %float %56
+         %58 = OpCompositeConstruct %v4float %57 %57 %57 %57
+               OpStore %_GLF_color %58
+               OpBranch %43
+         %43 = OpLabel
+         %59 = OpLoad %int %i
+         %60 = OpISub %int %59 %int_1
+               OpStore %i %60
+               OpBranch %35
+         %35 = OpLabel
+               OpBranch %33
+         %34 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-while-modulo/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-while-modulo/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..32708a3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-while-modulo/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,47 @@
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[1];
+};
+
+void main_1() {
+  int i = 0;
+  const int x_32 = asint(x_6[2].x);
+  i = x_32;
+  while (true) {
+    if ((i >= 0)) {
+    } else {
+      break;
+    }
+    if (((i % 2) == 0)) {
+      const uint scalar_offset = ((16u * uint(0))) / 4;
+      const int x_47 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+      const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+      const int x_50 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+      const int x_53 = asint(x_6[1].x);
+      x_GLF_color = float4(1.0f, float(x_47), float(x_50), float(x_53));
+    } else {
+      const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+      const float x_57 = asfloat(x_8[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+      x_GLF_color = float4(x_57, x_57, x_57, x_57);
+    }
+    i = (i - 1);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-while-modulo/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-while-modulo/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..111c664
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-while-modulo/0-opt.spvasm.expected.msl
@@ -0,0 +1,64 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_8, thread float4* const tint_symbol_4) {
+  int i = 0;
+  int const x_32 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  i = x_32;
+  while (true) {
+    int const x_37 = i;
+    if ((x_37 >= 0)) {
+    } else {
+      break;
+    }
+    int const x_40 = i;
+    if (((x_40 % 2) == 0)) {
+      int const x_47 = x_6.x_GLF_uniform_int_values.arr[0].el;
+      int const x_50 = x_6.x_GLF_uniform_int_values.arr[0].el;
+      int const x_53 = x_6.x_GLF_uniform_int_values.arr[1].el;
+      *(tint_symbol_4) = float4(1.0f, float(x_47), float(x_50), float(x_53));
+    } else {
+      float const x_57 = x_8.x_GLF_uniform_float_values.arr[0].el;
+      *(tint_symbol_4) = float4(x_57, x_57, x_57, x_57);
+    }
+    int const x_59 = i;
+    i = (x_59 - 1);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-while-modulo/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-while-modulo/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..6651b21
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-while-modulo/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,140 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 79
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %26 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+   %main_out = OpTypeStruct %v4float
+         %67 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %26
+         %30 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %31 = OpLoad %int %30
+               OpStore %i %31
+               OpBranch %32
+         %32 = OpLabel
+               OpLoopMerge %33 %34 None
+               OpBranch %35
+         %35 = OpLabel
+         %36 = OpLoad %int %i
+         %38 = OpSGreaterThanEqual %bool %36 %int_0
+               OpSelectionMerge %40 None
+               OpBranchConditional %38 %41 %42
+         %41 = OpLabel
+               OpBranch %40
+         %42 = OpLabel
+               OpBranch %33
+         %40 = OpLabel
+         %43 = OpLoad %int %i
+         %44 = OpSMod %int %43 %int_2
+         %45 = OpIEqual %bool %44 %int_0
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %48
+         %47 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %50 = OpLoad %int %49
+         %51 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %52 = OpLoad %int %51
+         %54 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %55 = OpLoad %int %54
+         %57 = OpConvertSToF %float %50
+         %58 = OpConvertSToF %float %52
+         %59 = OpConvertSToF %float %55
+         %60 = OpCompositeConstruct %v4float %float_1 %57 %58 %59
+               OpStore %x_GLF_color %60
+               OpBranch %46
+         %48 = OpLabel
+         %62 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %63 = OpLoad %float %62
+         %64 = OpCompositeConstruct %v4float %63 %63 %63 %63
+               OpStore %x_GLF_color %64
+               OpBranch %46
+         %46 = OpLabel
+         %65 = OpLoad %int %i
+         %66 = OpISub %int %65 %int_1
+               OpStore %i %66
+               OpBranch %34
+         %34 = OpLabel
+               OpBranch %32
+         %33 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %67
+%tint_symbol = OpFunctionParameter %main_out
+         %71 = OpLabel
+         %72 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %72
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+         %74 = OpLabel
+         %75 = OpFunctionCall %void %main_1
+         %77 = OpLoad %v4float %x_GLF_color
+         %78 = OpCompositeConstruct %main_out %77
+         %76 = OpFunctionCall %void %tint_symbol_2 %78
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-while-modulo/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-while-modulo/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..7198d38
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-while-modulo/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,56 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+fn main_1() {
+  var i : i32;
+  let x_32 : i32 = x_6.x_GLF_uniform_int_values[2];
+  i = x_32;
+  loop {
+    let x_37 : i32 = i;
+    if ((x_37 >= 0)) {
+    } else {
+      break;
+    }
+    let x_40 : i32 = i;
+    if (((x_40 % 2) == 0)) {
+      let x_47 : i32 = x_6.x_GLF_uniform_int_values[0];
+      let x_50 : i32 = x_6.x_GLF_uniform_int_values[0];
+      let x_53 : i32 = x_6.x_GLF_uniform_int_values[1];
+      x_GLF_color = vec4<f32>(1.0, f32(x_47), f32(x_50), f32(x_53));
+    } else {
+      let x_57 : f32 = x_8.x_GLF_uniform_float_values[0];
+      x_GLF_color = vec4<f32>(x_57, x_57, x_57, x_57);
+    }
+    let x_59 : i32 = i;
+    i = (x_59 - 1);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-while-modulo/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-while-modulo/0-opt.wgsl
new file mode 100644
index 0000000..7198d38
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-while-modulo/0-opt.wgsl
@@ -0,0 +1,56 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+fn main_1() {
+  var i : i32;
+  let x_32 : i32 = x_6.x_GLF_uniform_int_values[2];
+  i = x_32;
+  loop {
+    let x_37 : i32 = i;
+    if ((x_37 >= 0)) {
+    } else {
+      break;
+    }
+    let x_40 : i32 = i;
+    if (((x_40 % 2) == 0)) {
+      let x_47 : i32 = x_6.x_GLF_uniform_int_values[0];
+      let x_50 : i32 = x_6.x_GLF_uniform_int_values[0];
+      let x_53 : i32 = x_6.x_GLF_uniform_int_values[1];
+      x_GLF_color = vec4<f32>(1.0, f32(x_47), f32(x_50), f32(x_53));
+    } else {
+      let x_57 : f32 = x_8.x_GLF_uniform_float_values[0];
+      x_GLF_color = vec4<f32>(x_57, x_57, x_57, x_57);
+    }
+    let x_59 : i32 = i;
+    i = (x_59 - 1);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-while-modulo/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-while-modulo/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..32708a3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-while-modulo/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,47 @@
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[1];
+};
+
+void main_1() {
+  int i = 0;
+  const int x_32 = asint(x_6[2].x);
+  i = x_32;
+  while (true) {
+    if ((i >= 0)) {
+    } else {
+      break;
+    }
+    if (((i % 2) == 0)) {
+      const uint scalar_offset = ((16u * uint(0))) / 4;
+      const int x_47 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+      const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+      const int x_50 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+      const int x_53 = asint(x_6[1].x);
+      x_GLF_color = float4(1.0f, float(x_47), float(x_50), float(x_53));
+    } else {
+      const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+      const float x_57 = asfloat(x_8[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+      x_GLF_color = float4(x_57, x_57, x_57, x_57);
+    }
+    i = (i - 1);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-while-modulo/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-while-modulo/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..111c664
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-while-modulo/0-opt.wgsl.expected.msl
@@ -0,0 +1,64 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_8, thread float4* const tint_symbol_4) {
+  int i = 0;
+  int const x_32 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  i = x_32;
+  while (true) {
+    int const x_37 = i;
+    if ((x_37 >= 0)) {
+    } else {
+      break;
+    }
+    int const x_40 = i;
+    if (((x_40 % 2) == 0)) {
+      int const x_47 = x_6.x_GLF_uniform_int_values.arr[0].el;
+      int const x_50 = x_6.x_GLF_uniform_int_values.arr[0].el;
+      int const x_53 = x_6.x_GLF_uniform_int_values.arr[1].el;
+      *(tint_symbol_4) = float4(1.0f, float(x_47), float(x_50), float(x_53));
+    } else {
+      float const x_57 = x_8.x_GLF_uniform_float_values.arr[0].el;
+      *(tint_symbol_4) = float4(x_57, x_57, x_57, x_57);
+    }
+    int const x_59 = i;
+    i = (x_59 - 1);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-while-modulo/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-while-modulo/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..6651b21
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-while-modulo/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,140 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 79
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %26 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+   %main_out = OpTypeStruct %v4float
+         %67 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %26
+         %30 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %31 = OpLoad %int %30
+               OpStore %i %31
+               OpBranch %32
+         %32 = OpLabel
+               OpLoopMerge %33 %34 None
+               OpBranch %35
+         %35 = OpLabel
+         %36 = OpLoad %int %i
+         %38 = OpSGreaterThanEqual %bool %36 %int_0
+               OpSelectionMerge %40 None
+               OpBranchConditional %38 %41 %42
+         %41 = OpLabel
+               OpBranch %40
+         %42 = OpLabel
+               OpBranch %33
+         %40 = OpLabel
+         %43 = OpLoad %int %i
+         %44 = OpSMod %int %43 %int_2
+         %45 = OpIEqual %bool %44 %int_0
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %48
+         %47 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %50 = OpLoad %int %49
+         %51 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %52 = OpLoad %int %51
+         %54 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %55 = OpLoad %int %54
+         %57 = OpConvertSToF %float %50
+         %58 = OpConvertSToF %float %52
+         %59 = OpConvertSToF %float %55
+         %60 = OpCompositeConstruct %v4float %float_1 %57 %58 %59
+               OpStore %x_GLF_color %60
+               OpBranch %46
+         %48 = OpLabel
+         %62 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %63 = OpLoad %float %62
+         %64 = OpCompositeConstruct %v4float %63 %63 %63 %63
+               OpStore %x_GLF_color %64
+               OpBranch %46
+         %46 = OpLabel
+         %65 = OpLoad %int %i
+         %66 = OpISub %int %65 %int_1
+               OpStore %i %66
+               OpBranch %34
+         %34 = OpLabel
+               OpBranch %32
+         %33 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %67
+%tint_symbol = OpFunctionParameter %main_out
+         %71 = OpLabel
+         %72 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %72
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+         %74 = OpLabel
+         %75 = OpFunctionCall %void %main_1
+         %77 = OpLoad %v4float %x_GLF_color
+         %78 = OpCompositeConstruct %main_out %77
+         %76 = OpFunctionCall %void %tint_symbol_2 %78
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-while-modulo/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-while-modulo/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..7198d38
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-compares-while-modulo/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,56 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+fn main_1() {
+  var i : i32;
+  let x_32 : i32 = x_6.x_GLF_uniform_int_values[2];
+  i = x_32;
+  loop {
+    let x_37 : i32 = i;
+    if ((x_37 >= 0)) {
+    } else {
+      break;
+    }
+    let x_40 : i32 = i;
+    if (((x_40 % 2) == 0)) {
+      let x_47 : i32 = x_6.x_GLF_uniform_int_values[0];
+      let x_50 : i32 = x_6.x_GLF_uniform_int_values[0];
+      let x_53 : i32 = x_6.x_GLF_uniform_int_values[1];
+      x_GLF_color = vec4<f32>(1.0, f32(x_47), f32(x_50), f32(x_53));
+    } else {
+      let x_57 : f32 = x_8.x_GLF_uniform_float_values[0];
+      x_GLF_color = vec4<f32>(x_57, x_57, x_57, x_57);
+    }
+    let x_59 : i32 = i;
+    i = (x_59 - 1);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-mul-div-rem-if-undefined-divide-mix/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-mul-div-rem-if-undefined-divide-mix/0-opt.spvasm
new file mode 100644
index 0000000..e4220be
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-mul-div-rem-if-undefined-divide-mix/0-opt.spvasm
@@ -0,0 +1,152 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color %gl_FragCoord
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %f1_f1_ "f1(f1;"
+               OpName %a "a"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpName %v2 "v2"
+               OpName %a_0 "a"
+               OpName %param "param"
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+       %void = OpTypeVoid
+         %17 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+         %20 = OpTypeFunction %float %_ptr_Function_float
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+    %float_1 = OpConstant %float 1
+    %v3float = OpTypeVector %float 3
+       %main = OpFunction %void None %17
+         %39 = OpLabel
+         %v2 = OpVariable %_ptr_Function_v4float Function
+        %a_0 = OpVariable %_ptr_Function_float Function
+         %40 = OpVariable %_ptr_Function_float Function
+      %param = OpVariable %_ptr_Function_float Function
+         %41 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %42 = OpLoad %int %41
+         %43 = OpConvertSToF %float %42
+         %44 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %45 = OpLoad %int %44
+         %46 = OpConvertSToF %float %45
+         %47 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %48 = OpLoad %int %47
+         %49 = OpConvertSToF %float %48
+         %50 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %51 = OpLoad %int %50
+         %52 = OpConvertSToF %float %51
+         %53 = OpCompositeConstruct %v4float %43 %46 %49 %52
+               OpStore %_GLF_color %53
+         %54 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %55 = OpLoad %float %54
+         %56 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_1
+         %57 = OpLoad %float %56
+         %58 = OpFOrdLessThan %bool %55 %57
+               OpSelectionMerge %59 None
+               OpBranchConditional %58 %60 %59
+         %60 = OpLabel
+         %61 = OpAccessChain %_ptr_Function_float %v2 %uint_0
+         %62 = OpLoad %float %61
+         %63 = OpFOrdLessThan %bool %62 %float_1
+         %64 = OpLogicalNot %bool %63
+               OpSelectionMerge %65 None
+               OpBranchConditional %64 %66 %65
+         %66 = OpLabel
+         %67 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_1
+         %68 = OpLoad %float %67
+         %69 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_1
+         %70 = OpLoad %float %69
+         %71 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %72 = OpLoad %float %71
+         %73 = OpFOrdGreaterThan %bool %70 %72
+               OpSelectionMerge %74 None
+               OpBranchConditional %73 %75 %76
+         %75 = OpLabel
+         %77 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %78 = OpLoad %float %77
+               OpStore %param %78
+         %79 = OpFunctionCall %float %f1_f1_ %param
+               OpStore %40 %79
+               OpBranch %74
+         %76 = OpLabel
+         %80 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %81 = OpLoad %float %80
+               OpStore %40 %81
+               OpBranch %74
+         %74 = OpLabel
+         %82 = OpLoad %float %40
+         %83 = OpFDiv %float %68 %82
+               OpStore %a_0 %83
+         %84 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %85 = OpLoad %float %84
+         %86 = OpCompositeConstruct %v3float %85 %85 %85
+         %87 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %88 = OpLoad %float %87
+         %89 = OpCompositeConstruct %v3float %88 %88 %88
+         %90 = OpLoad %float %a_0
+         %91 = OpCompositeConstruct %v3float %90 %90 %90
+         %92 = OpExtInst %v3float %1 FMix %86 %89 %91
+         %93 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_1
+         %94 = OpLoad %float %93
+         %95 = OpCompositeExtract %float %92 0
+         %96 = OpCompositeExtract %float %92 1
+         %97 = OpCompositeExtract %float %92 2
+         %98 = OpCompositeConstruct %v4float %95 %96 %97 %94
+               OpStore %_GLF_color %98
+               OpBranch %65
+         %65 = OpLabel
+               OpBranch %59
+         %59 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %f1_f1_ = OpFunction %float None %20
+          %a = OpFunctionParameter %_ptr_Function_float
+         %99 = OpLabel
+        %100 = OpLoad %float %a
+        %101 = OpDPdx %float %100
+               OpReturnValue %101
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-mul-div-rem-if-undefined-divide-mix/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-mul-div-rem-if-undefined-divide-mix/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..b9e87ec
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-mul-div-rem-if-undefined-divide-mix/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,78 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[2];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_10 : register(b1, space0) {
+  uint4 x_10[2];
+};
+
+float f1_f1_(inout float a) {
+  const float x_100 = a;
+  return ddx(x_100);
+}
+
+void main_1() {
+  float4 v2 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float a_1 = 0.0f;
+  float x_40 = 0.0f;
+  float param = 0.0f;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_42 = asint(x_8[scalar_offset / 4][scalar_offset % 4]);
+  const int x_45 = asint(x_8[1].x);
+  const int x_48 = asint(x_8[1].x);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_51 = asint(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  x_GLF_color = float4(float(x_42), float(x_45), float(x_48), float(x_51));
+  const float x_55 = gl_FragCoord.x;
+  const float x_57 = asfloat(x_10[1].x);
+  if ((x_55 < x_57)) {
+    const float x_62 = v2.x;
+    if (!((x_62 < 1.0f))) {
+      const float x_68 = asfloat(x_10[1].x);
+      const float x_70 = asfloat(x_10[1].x);
+      const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+      const float x_72 = asfloat(x_10[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+      if ((x_70 > x_72)) {
+        const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+        const float x_78 = asfloat(x_10[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+        param = x_78;
+        const float x_79 = f1_f1_(param);
+        x_40 = x_79;
+      } else {
+        const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+        const float x_81 = asfloat(x_10[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+        x_40 = x_81;
+      }
+      a_1 = (x_68 / x_40);
+      const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+      const float x_85 = asfloat(x_10[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+      const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+      const float x_88 = asfloat(x_10[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+      const float x_90 = a_1;
+      const float3 x_92 = lerp(float3(x_85, x_85, x_85), float3(x_88, x_88, x_88), float3(x_90, x_90, x_90));
+      const float x_94 = asfloat(x_10[1].x);
+      x_GLF_color = float4(x_92.x, x_92.y, x_92.z, x_94);
+    }
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-mul-div-rem-if-undefined-divide-mix/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-mul-div-rem-if-undefined-divide-mix/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..a3e74a5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-mul-div-rem-if-undefined-divide-mix/0-opt.spvasm.expected.msl
@@ -0,0 +1,85 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float f1_f1_(thread float* const a) {
+  float const x_100 = *(a);
+  return dfdx(x_100);
+}
+
+void main_1(constant buf0& x_8, constant buf1& x_10, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float4 v2 = 0.0f;
+  float a_1 = 0.0f;
+  float x_40 = 0.0f;
+  float param = 0.0f;
+  int const x_42 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  int const x_45 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  int const x_48 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  int const x_51 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  *(tint_symbol_5) = float4(float(x_42), float(x_45), float(x_48), float(x_51));
+  float const x_55 = (*(tint_symbol_6)).x;
+  float const x_57 = x_10.x_GLF_uniform_float_values.arr[1].el;
+  if ((x_55 < x_57)) {
+    float const x_62 = v2.x;
+    if (!((x_62 < 1.0f))) {
+      float const x_68 = x_10.x_GLF_uniform_float_values.arr[1].el;
+      float const x_70 = x_10.x_GLF_uniform_float_values.arr[1].el;
+      float const x_72 = x_10.x_GLF_uniform_float_values.arr[0].el;
+      if ((x_70 > x_72)) {
+        float const x_78 = x_10.x_GLF_uniform_float_values.arr[0].el;
+        param = x_78;
+        float const x_79 = f1_f1_(&(param));
+        x_40 = x_79;
+      } else {
+        float const x_81 = x_10.x_GLF_uniform_float_values.arr[0].el;
+        x_40 = x_81;
+      }
+      float const x_82 = x_40;
+      a_1 = (x_68 / x_82);
+      float const x_85 = x_10.x_GLF_uniform_float_values.arr[0].el;
+      float const x_88 = x_10.x_GLF_uniform_float_values.arr[0].el;
+      float const x_90 = a_1;
+      float3 const x_92 = mix(float3(x_85, x_85, x_85), float3(x_88, x_88, x_88), float3(x_90, x_90, x_90));
+      float const x_94 = x_10.x_GLF_uniform_float_values.arr[1].el;
+      *(tint_symbol_5) = float4(x_92.x, x_92.y, x_92.z, x_94);
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_8 [[buffer(0)]], constant buf1& x_10 [[buffer(1)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_8, x_10, &(tint_symbol_8), &(tint_symbol_7));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-mul-div-rem-if-undefined-divide-mix/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-mul-div-rem-if-undefined-divide-mix/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..d38b160
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-mul-div-rem-if-undefined-divide-mix/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,191 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 122
+; Schema: 0
+               OpCapability Shader
+         %99 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_8 "x_8"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_10 "x_10"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %f1_f1_ "f1_f1_"
+               OpName %a "a"
+               OpName %main_1 "main_1"
+               OpName %v2 "v2"
+               OpName %a_1 "a_1"
+               OpName %x_40 "x_40"
+               OpName %param "param"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 1
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_10 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Function_float = OpTypePointer Function %float
+         %22 = OpTypeFunction %float %_ptr_Function_float
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+         %37 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+%_ptr_Private_float = OpTypePointer Private %float
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %v3float = OpTypeVector %float 3
+   %main_out = OpTypeStruct %v4float
+        %109 = OpTypeFunction %void %main_out
+     %f1_f1_ = OpFunction %float None %22
+          %a = OpFunctionParameter %_ptr_Function_float
+         %26 = OpLabel
+         %28 = OpLoad %float %a
+         %29 = OpDPdx %float %28
+               OpReturnValue %29
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %30
+         %33 = OpLabel
+         %v2 = OpVariable %_ptr_Function_v4float Function %5
+        %a_1 = OpVariable %_ptr_Function_float Function %37
+       %x_40 = OpVariable %_ptr_Function_float Function %37
+      %param = OpVariable %_ptr_Function_float Function %37
+         %43 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %44 = OpLoad %int %43
+         %46 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %47 = OpLoad %int %46
+         %48 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %49 = OpLoad %int %48
+         %50 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %51 = OpLoad %int %50
+         %52 = OpConvertSToF %float %44
+         %53 = OpConvertSToF %float %47
+         %54 = OpConvertSToF %float %49
+         %55 = OpConvertSToF %float %51
+         %56 = OpCompositeConstruct %v4float %52 %53 %54 %55
+               OpStore %x_GLF_color %56
+         %58 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %59 = OpLoad %float %58
+         %61 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_1
+         %62 = OpLoad %float %61
+         %63 = OpFOrdLessThan %bool %59 %62
+               OpSelectionMerge %65 None
+               OpBranchConditional %63 %66 %65
+         %66 = OpLabel
+         %67 = OpAccessChain %_ptr_Function_float %v2 %uint_0
+         %68 = OpLoad %float %67
+         %71 = OpFOrdLessThan %bool %68 %float_1
+         %69 = OpLogicalNot %bool %71
+               OpSelectionMerge %72 None
+               OpBranchConditional %69 %73 %72
+         %73 = OpLabel
+         %74 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_1
+         %75 = OpLoad %float %74
+         %76 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_1
+         %77 = OpLoad %float %76
+         %78 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_0
+         %79 = OpLoad %float %78
+         %80 = OpFOrdGreaterThan %bool %77 %79
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %83
+         %82 = OpLabel
+         %84 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_0
+         %85 = OpLoad %float %84
+               OpStore %param %85
+         %86 = OpFunctionCall %float %f1_f1_ %param
+               OpStore %x_40 %86
+               OpBranch %81
+         %83 = OpLabel
+         %88 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_0
+         %89 = OpLoad %float %88
+               OpStore %x_40 %89
+               OpBranch %81
+         %81 = OpLabel
+         %90 = OpLoad %float %x_40
+         %91 = OpFDiv %float %75 %90
+               OpStore %a_1 %91
+         %92 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_0
+         %93 = OpLoad %float %92
+         %94 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_0
+         %95 = OpLoad %float %94
+         %96 = OpLoad %float %a_1
+        %100 = OpCompositeConstruct %v3float %93 %93 %93
+        %101 = OpCompositeConstruct %v3float %95 %95 %95
+        %102 = OpCompositeConstruct %v3float %96 %96 %96
+         %97 = OpExtInst %v3float %99 FMix %100 %101 %102
+        %103 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_1
+        %104 = OpLoad %float %103
+        %105 = OpCompositeExtract %float %97 0
+        %106 = OpCompositeExtract %float %97 1
+        %107 = OpCompositeExtract %float %97 2
+        %108 = OpCompositeConstruct %v4float %105 %106 %107 %104
+               OpStore %x_GLF_color %108
+               OpBranch %72
+         %72 = OpLabel
+               OpBranch %65
+         %65 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %109
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %113 = OpLabel
+        %114 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %114
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %30
+        %116 = OpLabel
+        %117 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %117
+        %118 = OpFunctionCall %void %main_1
+        %120 = OpLoad %v4float %x_GLF_color
+        %121 = OpCompositeConstruct %main_out %120
+        %119 = OpFunctionCall %void %tint_symbol_3 %121
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-mul-div-rem-if-undefined-divide-mix/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-mul-div-rem-if-undefined-divide-mix/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..a6defc7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-mul-div-rem-if-undefined-divide-mix/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,78 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+fn f1_f1_(a : ptr<function, f32>) -> f32 {
+  let x_100 : f32 = *(a);
+  return dpdx(x_100);
+}
+
+fn main_1() {
+  var v2 : vec4<f32>;
+  var a_1 : f32;
+  var x_40 : f32;
+  var param : f32;
+  let x_42 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_45 : i32 = x_8.x_GLF_uniform_int_values[1];
+  let x_48 : i32 = x_8.x_GLF_uniform_int_values[1];
+  let x_51 : i32 = x_8.x_GLF_uniform_int_values[0];
+  x_GLF_color = vec4<f32>(f32(x_42), f32(x_45), f32(x_48), f32(x_51));
+  let x_55 : f32 = gl_FragCoord.x;
+  let x_57 : f32 = x_10.x_GLF_uniform_float_values[1];
+  if ((x_55 < x_57)) {
+    let x_62 : f32 = v2.x;
+    if (!((x_62 < 1.0))) {
+      let x_68 : f32 = x_10.x_GLF_uniform_float_values[1];
+      let x_70 : f32 = x_10.x_GLF_uniform_float_values[1];
+      let x_72 : f32 = x_10.x_GLF_uniform_float_values[0];
+      if ((x_70 > x_72)) {
+        let x_78 : f32 = x_10.x_GLF_uniform_float_values[0];
+        param = x_78;
+        let x_79 : f32 = f1_f1_(&(param));
+        x_40 = x_79;
+      } else {
+        let x_81 : f32 = x_10.x_GLF_uniform_float_values[0];
+        x_40 = x_81;
+      }
+      let x_82 : f32 = x_40;
+      a_1 = (x_68 / x_82);
+      let x_85 : f32 = x_10.x_GLF_uniform_float_values[0];
+      let x_88 : f32 = x_10.x_GLF_uniform_float_values[0];
+      let x_90 : f32 = a_1;
+      let x_92 : vec3<f32> = mix(vec3<f32>(x_85, x_85, x_85), vec3<f32>(x_88, x_88, x_88), vec3<f32>(x_90, x_90, x_90));
+      let x_94 : f32 = x_10.x_GLF_uniform_float_values[1];
+      x_GLF_color = vec4<f32>(x_92.x, x_92.y, x_92.z, x_94);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-mul-div-rem-if-undefined-divide-mix/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-mul-div-rem-if-undefined-divide-mix/0-opt.wgsl
new file mode 100644
index 0000000..a6defc7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-mul-div-rem-if-undefined-divide-mix/0-opt.wgsl
@@ -0,0 +1,78 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+fn f1_f1_(a : ptr<function, f32>) -> f32 {
+  let x_100 : f32 = *(a);
+  return dpdx(x_100);
+}
+
+fn main_1() {
+  var v2 : vec4<f32>;
+  var a_1 : f32;
+  var x_40 : f32;
+  var param : f32;
+  let x_42 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_45 : i32 = x_8.x_GLF_uniform_int_values[1];
+  let x_48 : i32 = x_8.x_GLF_uniform_int_values[1];
+  let x_51 : i32 = x_8.x_GLF_uniform_int_values[0];
+  x_GLF_color = vec4<f32>(f32(x_42), f32(x_45), f32(x_48), f32(x_51));
+  let x_55 : f32 = gl_FragCoord.x;
+  let x_57 : f32 = x_10.x_GLF_uniform_float_values[1];
+  if ((x_55 < x_57)) {
+    let x_62 : f32 = v2.x;
+    if (!((x_62 < 1.0))) {
+      let x_68 : f32 = x_10.x_GLF_uniform_float_values[1];
+      let x_70 : f32 = x_10.x_GLF_uniform_float_values[1];
+      let x_72 : f32 = x_10.x_GLF_uniform_float_values[0];
+      if ((x_70 > x_72)) {
+        let x_78 : f32 = x_10.x_GLF_uniform_float_values[0];
+        param = x_78;
+        let x_79 : f32 = f1_f1_(&(param));
+        x_40 = x_79;
+      } else {
+        let x_81 : f32 = x_10.x_GLF_uniform_float_values[0];
+        x_40 = x_81;
+      }
+      let x_82 : f32 = x_40;
+      a_1 = (x_68 / x_82);
+      let x_85 : f32 = x_10.x_GLF_uniform_float_values[0];
+      let x_88 : f32 = x_10.x_GLF_uniform_float_values[0];
+      let x_90 : f32 = a_1;
+      let x_92 : vec3<f32> = mix(vec3<f32>(x_85, x_85, x_85), vec3<f32>(x_88, x_88, x_88), vec3<f32>(x_90, x_90, x_90));
+      let x_94 : f32 = x_10.x_GLF_uniform_float_values[1];
+      x_GLF_color = vec4<f32>(x_92.x, x_92.y, x_92.z, x_94);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-mul-div-rem-if-undefined-divide-mix/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-mul-div-rem-if-undefined-divide-mix/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..b9e87ec
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-mul-div-rem-if-undefined-divide-mix/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,78 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[2];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_10 : register(b1, space0) {
+  uint4 x_10[2];
+};
+
+float f1_f1_(inout float a) {
+  const float x_100 = a;
+  return ddx(x_100);
+}
+
+void main_1() {
+  float4 v2 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float a_1 = 0.0f;
+  float x_40 = 0.0f;
+  float param = 0.0f;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_42 = asint(x_8[scalar_offset / 4][scalar_offset % 4]);
+  const int x_45 = asint(x_8[1].x);
+  const int x_48 = asint(x_8[1].x);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_51 = asint(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  x_GLF_color = float4(float(x_42), float(x_45), float(x_48), float(x_51));
+  const float x_55 = gl_FragCoord.x;
+  const float x_57 = asfloat(x_10[1].x);
+  if ((x_55 < x_57)) {
+    const float x_62 = v2.x;
+    if (!((x_62 < 1.0f))) {
+      const float x_68 = asfloat(x_10[1].x);
+      const float x_70 = asfloat(x_10[1].x);
+      const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+      const float x_72 = asfloat(x_10[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+      if ((x_70 > x_72)) {
+        const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+        const float x_78 = asfloat(x_10[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+        param = x_78;
+        const float x_79 = f1_f1_(param);
+        x_40 = x_79;
+      } else {
+        const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+        const float x_81 = asfloat(x_10[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+        x_40 = x_81;
+      }
+      a_1 = (x_68 / x_40);
+      const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+      const float x_85 = asfloat(x_10[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+      const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+      const float x_88 = asfloat(x_10[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+      const float x_90 = a_1;
+      const float3 x_92 = lerp(float3(x_85, x_85, x_85), float3(x_88, x_88, x_88), float3(x_90, x_90, x_90));
+      const float x_94 = asfloat(x_10[1].x);
+      x_GLF_color = float4(x_92.x, x_92.y, x_92.z, x_94);
+    }
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-mul-div-rem-if-undefined-divide-mix/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-mul-div-rem-if-undefined-divide-mix/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..a3e74a5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-mul-div-rem-if-undefined-divide-mix/0-opt.wgsl.expected.msl
@@ -0,0 +1,85 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float f1_f1_(thread float* const a) {
+  float const x_100 = *(a);
+  return dfdx(x_100);
+}
+
+void main_1(constant buf0& x_8, constant buf1& x_10, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float4 v2 = 0.0f;
+  float a_1 = 0.0f;
+  float x_40 = 0.0f;
+  float param = 0.0f;
+  int const x_42 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  int const x_45 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  int const x_48 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  int const x_51 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  *(tint_symbol_5) = float4(float(x_42), float(x_45), float(x_48), float(x_51));
+  float const x_55 = (*(tint_symbol_6)).x;
+  float const x_57 = x_10.x_GLF_uniform_float_values.arr[1].el;
+  if ((x_55 < x_57)) {
+    float const x_62 = v2.x;
+    if (!((x_62 < 1.0f))) {
+      float const x_68 = x_10.x_GLF_uniform_float_values.arr[1].el;
+      float const x_70 = x_10.x_GLF_uniform_float_values.arr[1].el;
+      float const x_72 = x_10.x_GLF_uniform_float_values.arr[0].el;
+      if ((x_70 > x_72)) {
+        float const x_78 = x_10.x_GLF_uniform_float_values.arr[0].el;
+        param = x_78;
+        float const x_79 = f1_f1_(&(param));
+        x_40 = x_79;
+      } else {
+        float const x_81 = x_10.x_GLF_uniform_float_values.arr[0].el;
+        x_40 = x_81;
+      }
+      float const x_82 = x_40;
+      a_1 = (x_68 / x_82);
+      float const x_85 = x_10.x_GLF_uniform_float_values.arr[0].el;
+      float const x_88 = x_10.x_GLF_uniform_float_values.arr[0].el;
+      float const x_90 = a_1;
+      float3 const x_92 = mix(float3(x_85, x_85, x_85), float3(x_88, x_88, x_88), float3(x_90, x_90, x_90));
+      float const x_94 = x_10.x_GLF_uniform_float_values.arr[1].el;
+      *(tint_symbol_5) = float4(x_92.x, x_92.y, x_92.z, x_94);
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_8 [[buffer(0)]], constant buf1& x_10 [[buffer(1)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_8, x_10, &(tint_symbol_8), &(tint_symbol_7));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-mul-div-rem-if-undefined-divide-mix/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-mul-div-rem-if-undefined-divide-mix/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..d38b160
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-mul-div-rem-if-undefined-divide-mix/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,191 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 122
+; Schema: 0
+               OpCapability Shader
+         %99 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_8 "x_8"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_10 "x_10"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %f1_f1_ "f1_f1_"
+               OpName %a "a"
+               OpName %main_1 "main_1"
+               OpName %v2 "v2"
+               OpName %a_1 "a_1"
+               OpName %x_40 "x_40"
+               OpName %param "param"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 1
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_10 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Function_float = OpTypePointer Function %float
+         %22 = OpTypeFunction %float %_ptr_Function_float
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+         %37 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+%_ptr_Private_float = OpTypePointer Private %float
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %v3float = OpTypeVector %float 3
+   %main_out = OpTypeStruct %v4float
+        %109 = OpTypeFunction %void %main_out
+     %f1_f1_ = OpFunction %float None %22
+          %a = OpFunctionParameter %_ptr_Function_float
+         %26 = OpLabel
+         %28 = OpLoad %float %a
+         %29 = OpDPdx %float %28
+               OpReturnValue %29
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %30
+         %33 = OpLabel
+         %v2 = OpVariable %_ptr_Function_v4float Function %5
+        %a_1 = OpVariable %_ptr_Function_float Function %37
+       %x_40 = OpVariable %_ptr_Function_float Function %37
+      %param = OpVariable %_ptr_Function_float Function %37
+         %43 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %44 = OpLoad %int %43
+         %46 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %47 = OpLoad %int %46
+         %48 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %49 = OpLoad %int %48
+         %50 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %51 = OpLoad %int %50
+         %52 = OpConvertSToF %float %44
+         %53 = OpConvertSToF %float %47
+         %54 = OpConvertSToF %float %49
+         %55 = OpConvertSToF %float %51
+         %56 = OpCompositeConstruct %v4float %52 %53 %54 %55
+               OpStore %x_GLF_color %56
+         %58 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %59 = OpLoad %float %58
+         %61 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_1
+         %62 = OpLoad %float %61
+         %63 = OpFOrdLessThan %bool %59 %62
+               OpSelectionMerge %65 None
+               OpBranchConditional %63 %66 %65
+         %66 = OpLabel
+         %67 = OpAccessChain %_ptr_Function_float %v2 %uint_0
+         %68 = OpLoad %float %67
+         %71 = OpFOrdLessThan %bool %68 %float_1
+         %69 = OpLogicalNot %bool %71
+               OpSelectionMerge %72 None
+               OpBranchConditional %69 %73 %72
+         %73 = OpLabel
+         %74 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_1
+         %75 = OpLoad %float %74
+         %76 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_1
+         %77 = OpLoad %float %76
+         %78 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_0
+         %79 = OpLoad %float %78
+         %80 = OpFOrdGreaterThan %bool %77 %79
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %83
+         %82 = OpLabel
+         %84 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_0
+         %85 = OpLoad %float %84
+               OpStore %param %85
+         %86 = OpFunctionCall %float %f1_f1_ %param
+               OpStore %x_40 %86
+               OpBranch %81
+         %83 = OpLabel
+         %88 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_0
+         %89 = OpLoad %float %88
+               OpStore %x_40 %89
+               OpBranch %81
+         %81 = OpLabel
+         %90 = OpLoad %float %x_40
+         %91 = OpFDiv %float %75 %90
+               OpStore %a_1 %91
+         %92 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_0
+         %93 = OpLoad %float %92
+         %94 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_0
+         %95 = OpLoad %float %94
+         %96 = OpLoad %float %a_1
+        %100 = OpCompositeConstruct %v3float %93 %93 %93
+        %101 = OpCompositeConstruct %v3float %95 %95 %95
+        %102 = OpCompositeConstruct %v3float %96 %96 %96
+         %97 = OpExtInst %v3float %99 FMix %100 %101 %102
+        %103 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_1
+        %104 = OpLoad %float %103
+        %105 = OpCompositeExtract %float %97 0
+        %106 = OpCompositeExtract %float %97 1
+        %107 = OpCompositeExtract %float %97 2
+        %108 = OpCompositeConstruct %v4float %105 %106 %107 %104
+               OpStore %x_GLF_color %108
+               OpBranch %72
+         %72 = OpLabel
+               OpBranch %65
+         %65 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %109
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %113 = OpLabel
+        %114 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %114
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %30
+        %116 = OpLabel
+        %117 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %117
+        %118 = OpFunctionCall %void %main_1
+        %120 = OpLoad %v4float %x_GLF_color
+        %121 = OpCompositeConstruct %main_out %120
+        %119 = OpFunctionCall %void %tint_symbol_3 %121
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-mul-div-rem-if-undefined-divide-mix/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-mul-div-rem-if-undefined-divide-mix/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..a6defc7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-mul-div-rem-if-undefined-divide-mix/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,78 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+fn f1_f1_(a : ptr<function, f32>) -> f32 {
+  let x_100 : f32 = *(a);
+  return dpdx(x_100);
+}
+
+fn main_1() {
+  var v2 : vec4<f32>;
+  var a_1 : f32;
+  var x_40 : f32;
+  var param : f32;
+  let x_42 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_45 : i32 = x_8.x_GLF_uniform_int_values[1];
+  let x_48 : i32 = x_8.x_GLF_uniform_int_values[1];
+  let x_51 : i32 = x_8.x_GLF_uniform_int_values[0];
+  x_GLF_color = vec4<f32>(f32(x_42), f32(x_45), f32(x_48), f32(x_51));
+  let x_55 : f32 = gl_FragCoord.x;
+  let x_57 : f32 = x_10.x_GLF_uniform_float_values[1];
+  if ((x_55 < x_57)) {
+    let x_62 : f32 = v2.x;
+    if (!((x_62 < 1.0))) {
+      let x_68 : f32 = x_10.x_GLF_uniform_float_values[1];
+      let x_70 : f32 = x_10.x_GLF_uniform_float_values[1];
+      let x_72 : f32 = x_10.x_GLF_uniform_float_values[0];
+      if ((x_70 > x_72)) {
+        let x_78 : f32 = x_10.x_GLF_uniform_float_values[0];
+        param = x_78;
+        let x_79 : f32 = f1_f1_(&(param));
+        x_40 = x_79;
+      } else {
+        let x_81 : f32 = x_10.x_GLF_uniform_float_values[0];
+        x_40 = x_81;
+      }
+      let x_82 : f32 = x_40;
+      a_1 = (x_68 / x_82);
+      let x_85 : f32 = x_10.x_GLF_uniform_float_values[0];
+      let x_88 : f32 = x_10.x_GLF_uniform_float_values[0];
+      let x_90 : f32 = a_1;
+      let x_92 : vec3<f32> = mix(vec3<f32>(x_85, x_85, x_85), vec3<f32>(x_88, x_88, x_88), vec3<f32>(x_90, x_90, x_90));
+      let x_94 : f32 = x_10.x_GLF_uniform_float_values[1];
+      x_GLF_color = vec4<f32>(x_92.x, x_92.y, x_92.z, x_94);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-pack-unpack/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-pack-unpack/0-opt.spvasm
new file mode 100644
index 0000000..65fb798
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-pack-unpack/0-opt.spvasm
@@ -0,0 +1,176 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %v1 "v1"
+               OpName %E "E"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_7 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+      %float = OpTypeFloat 32
+     %uint_7 = OpConstant %uint 7
+%_arr_float_uint_7 = OpTypeArray %float %uint_7
+       %buf1 = OpTypeStruct %_arr_float_uint_7
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+    %v2float = OpTypeVector %float 2
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%_ptr_Function_float = OpTypePointer Function %float
+%float_0_00999999978 = OpConstant %float 0.00999999978
+       %bool = OpTypeBool
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %14
+         %39 = OpLabel
+          %a = OpVariable %_ptr_Function_uint Function
+         %v1 = OpVariable %_ptr_Function_v4float Function
+          %E = OpVariable %_ptr_Function_float Function
+         %40 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %41 = OpLoad %float %40
+         %42 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %43 = OpLoad %float %42
+         %44 = OpCompositeConstruct %v2float %41 %43
+         %45 = OpExtInst %uint %1 PackUnorm2x16 %44
+               OpStore %a %45
+         %46 = OpLoad %uint %a
+         %47 = OpExtInst %v4float %1 UnpackSnorm4x8 %46
+               OpStore %v1 %47
+               OpStore %E %float_0_00999999978
+         %48 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %49 = OpLoad %int %48
+         %50 = OpAccessChain %_ptr_Function_float %v1 %49
+         %51 = OpLoad %float %50
+         %52 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %53 = OpLoad %float %52
+         %54 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_3
+         %55 = OpLoad %float %54
+         %56 = OpFDiv %float %53 %55
+         %57 = OpFSub %float %51 %56
+         %58 = OpExtInst %float %1 FAbs %57
+         %59 = OpLoad %float %E
+         %60 = OpFOrdLessThan %bool %58 %59
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %61
+         %62 = OpLabel
+         %63 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %64 = OpLoad %int %63
+         %65 = OpAccessChain %_ptr_Function_float %v1 %64
+         %66 = OpLoad %float %65
+         %67 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_4
+         %68 = OpLoad %float %67
+         %69 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_3
+         %70 = OpLoad %float %69
+         %71 = OpFDiv %float %68 %70
+         %72 = OpFSub %float %66 %71
+         %73 = OpExtInst %float %1 FAbs %72
+         %74 = OpLoad %float %E
+         %75 = OpFOrdLessThan %bool %73 %74
+               OpBranch %61
+         %61 = OpLabel
+         %76 = OpPhi %bool %60 %39 %75 %62
+               OpSelectionMerge %77 None
+               OpBranchConditional %76 %78 %77
+         %78 = OpLabel
+         %79 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_3
+         %80 = OpLoad %int %79
+         %81 = OpAccessChain %_ptr_Function_float %v1 %80
+         %82 = OpLoad %float %81
+         %83 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_5
+         %84 = OpLoad %float %83
+         %85 = OpFNegate %float %84
+         %86 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_3
+         %87 = OpLoad %float %86
+         %88 = OpFDiv %float %85 %87
+         %89 = OpFSub %float %82 %88
+         %90 = OpExtInst %float %1 FAbs %89
+         %91 = OpLoad %float %E
+         %92 = OpFOrdLessThan %bool %90 %91
+               OpBranch %77
+         %77 = OpLabel
+         %93 = OpPhi %bool %76 %61 %92 %78
+               OpSelectionMerge %94 None
+               OpBranchConditional %93 %95 %94
+         %95 = OpLabel
+         %96 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %97 = OpLoad %int %96
+         %98 = OpAccessChain %_ptr_Function_float %v1 %97
+         %99 = OpLoad %float %98
+        %100 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_6
+        %101 = OpLoad %float %100
+        %102 = OpFNegate %float %101
+        %103 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_3
+        %104 = OpLoad %float %103
+        %105 = OpFDiv %float %102 %104
+        %106 = OpFSub %float %99 %105
+        %107 = OpExtInst %float %1 FAbs %106
+        %108 = OpLoad %float %E
+        %109 = OpFOrdLessThan %bool %107 %108
+               OpBranch %94
+         %94 = OpLabel
+        %110 = OpPhi %bool %93 %77 %109 %95
+               OpSelectionMerge %111 None
+               OpBranchConditional %110 %112 %113
+        %112 = OpLabel
+        %114 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %115 = OpLoad %int %114
+        %116 = OpConvertSToF %float %115
+        %117 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+        %118 = OpLoad %int %117
+        %119 = OpConvertSToF %float %118
+        %120 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+        %121 = OpLoad %int %120
+        %122 = OpConvertSToF %float %121
+        %123 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %124 = OpLoad %int %123
+        %125 = OpConvertSToF %float %124
+        %126 = OpCompositeConstruct %v4float %116 %119 %122 %125
+               OpStore %_GLF_color %126
+               OpBranch %111
+        %113 = OpLabel
+        %127 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_5
+        %128 = OpLoad %float %127
+        %129 = OpCompositeConstruct %v4float %128 %128 %128 %128
+               OpStore %_GLF_color %129
+               OpBranch %111
+        %111 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-pack-unpack/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-pack-unpack/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..c1507ae
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-pack-unpack/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,96 @@
+uint tint_pack2x16unorm(float2 param_0) {
+  uint2 i = uint2(round(clamp(param_0, 0.0, 1.0) * 65535.0));
+  return (i.x | i.y << 16);
+}
+
+float4 tint_unpack4x8snorm(uint param_0) {
+  int j = int(param_0);
+  int4 i = int4(j << 24, j << 16, j << 8, j) >> 24;
+  return clamp(float4(i) / 127.0, -1.0, 1.0);
+}
+
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[7];
+};
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  uint a = 0u;
+  float4 v1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float E = 0.0f;
+  bool x_75 = false;
+  bool x_92 = false;
+  bool x_109 = false;
+  bool x_76_phi = false;
+  bool x_93_phi = false;
+  bool x_110_phi = false;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_41 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const float x_43 = asfloat(x_6[1].x);
+  a = tint_pack2x16unorm(float2(x_41, x_43));
+  v1 = tint_unpack4x8snorm(a);
+  E = 0.01f;
+  const int x_49 = asint(x_10[2].x);
+  const float x_51 = v1[x_49];
+  const float x_53 = asfloat(x_6[2].x);
+  const float x_55 = asfloat(x_6[3].x);
+  const bool x_60 = (abs((x_51 - (x_53 / x_55))) < E);
+  x_76_phi = x_60;
+  if (x_60) {
+    const int x_64 = asint(x_10[1].x);
+    const float x_66 = v1[x_64];
+    const float x_68 = asfloat(x_6[4].x);
+    const float x_70 = asfloat(x_6[3].x);
+    x_75 = (abs((x_66 - (x_68 / x_70))) < E);
+    x_76_phi = x_75;
+  }
+  const bool x_76 = x_76_phi;
+  x_93_phi = x_76;
+  if (x_76) {
+    const int x_80 = asint(x_10[3].x);
+    const float x_82 = v1[x_80];
+    const float x_84 = asfloat(x_6[5].x);
+    const float x_87 = asfloat(x_6[3].x);
+    x_92 = (abs((x_82 - (-(x_84) / x_87))) < E);
+    x_93_phi = x_92;
+  }
+  const bool x_93 = x_93_phi;
+  x_110_phi = x_93;
+  if (x_93) {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_97 = asint(x_10[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const float x_99 = v1[x_97];
+    const float x_101 = asfloat(x_6[6].x);
+    const float x_104 = asfloat(x_6[3].x);
+    x_109 = (abs((x_99 - (-(x_101) / x_104))) < E);
+    x_110_phi = x_109;
+  }
+  if (x_110_phi) {
+    const int x_115 = asint(x_10[1].x);
+    const int x_118 = asint(x_10[2].x);
+    const int x_121 = asint(x_10[2].x);
+    const int x_124 = asint(x_10[1].x);
+    x_GLF_color = float4(float(x_115), float(x_118), float(x_121), float(x_124));
+  } else {
+    const float x_128 = asfloat(x_6[5].x);
+    x_GLF_color = float4(x_128, x_128, x_128, x_128);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-pack-unpack/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-pack-unpack/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..77c6b6d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-pack-unpack/0-opt.spvasm.expected.msl
@@ -0,0 +1,106 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[7];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_10, thread float4* const tint_symbol_4) {
+  uint a = 0u;
+  float4 v1 = 0.0f;
+  float E = 0.0f;
+  bool x_75 = false;
+  bool x_92 = false;
+  bool x_109 = false;
+  bool x_76_phi = false;
+  bool x_93_phi = false;
+  bool x_110_phi = false;
+  float const x_41 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_43 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  a = pack_float_to_unorm2x16(float2(x_41, x_43));
+  uint const x_46 = a;
+  v1 = unpack_snorm4x8_to_float(x_46);
+  E = 0.01f;
+  int const x_49 = x_10.x_GLF_uniform_int_values.arr[2].el;
+  float const x_51 = v1[x_49];
+  float const x_53 = x_6.x_GLF_uniform_float_values.arr[2].el;
+  float const x_55 = x_6.x_GLF_uniform_float_values.arr[3].el;
+  float const x_59 = E;
+  bool const x_60 = (fabs((x_51 - (x_53 / x_55))) < x_59);
+  x_76_phi = x_60;
+  if (x_60) {
+    int const x_64 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    float const x_66 = v1[x_64];
+    float const x_68 = x_6.x_GLF_uniform_float_values.arr[4].el;
+    float const x_70 = x_6.x_GLF_uniform_float_values.arr[3].el;
+    float const x_74 = E;
+    x_75 = (fabs((x_66 - (x_68 / x_70))) < x_74);
+    x_76_phi = x_75;
+  }
+  bool const x_76 = x_76_phi;
+  x_93_phi = x_76;
+  if (x_76) {
+    int const x_80 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    float const x_82 = v1[x_80];
+    float const x_84 = x_6.x_GLF_uniform_float_values.arr[5].el;
+    float const x_87 = x_6.x_GLF_uniform_float_values.arr[3].el;
+    float const x_91 = E;
+    x_92 = (fabs((x_82 - (-(x_84) / x_87))) < x_91);
+    x_93_phi = x_92;
+  }
+  bool const x_93 = x_93_phi;
+  x_110_phi = x_93;
+  if (x_93) {
+    int const x_97 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    float const x_99 = v1[x_97];
+    float const x_101 = x_6.x_GLF_uniform_float_values.arr[6].el;
+    float const x_104 = x_6.x_GLF_uniform_float_values.arr[3].el;
+    float const x_108 = E;
+    x_109 = (fabs((x_99 - (-(x_101) / x_104))) < x_108);
+    x_110_phi = x_109;
+  }
+  bool const x_110 = x_110_phi;
+  if (x_110) {
+    int const x_115 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_118 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    int const x_121 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    int const x_124 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_115), float(x_118), float(x_121), float(x_124));
+  } else {
+    float const x_128 = x_6.x_GLF_uniform_float_values.arr[5].el;
+    *(tint_symbol_4) = float4(x_128, x_128, x_128, x_128);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_10 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-pack-unpack/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-pack-unpack/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..470393d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-pack-unpack/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,238 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 159
+; Schema: 0
+               OpCapability Shader
+         %50 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %v1 "v1"
+               OpName %E "E"
+               OpName %x_75 "x_75"
+               OpName %x_92 "x_92"
+               OpName %x_109 "x_109"
+               OpName %x_76_phi "x_76_phi"
+               OpName %x_93_phi "x_93_phi"
+               OpName %x_110_phi "x_110_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_7 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_7 = OpConstant %uint 7
+%_arr_float_uint_7 = OpTypeArray %float %uint_7
+       %buf1 = OpTypeStruct %_arr_float_uint_7
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_uint = OpTypePointer Function %uint
+         %26 = OpConstantNull %uint
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%_ptr_Function_float = OpTypePointer Function %float
+         %31 = OpConstantNull %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %35 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+    %v2float = OpTypeVector %float 2
+%float_0_00999999978 = OpConstant %float 0.00999999978
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+   %main_out = OpTypeStruct %v4float
+        %147 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+          %a = OpVariable %_ptr_Function_uint Function %26
+         %v1 = OpVariable %_ptr_Function_v4float Function %17
+          %E = OpVariable %_ptr_Function_float Function %31
+       %x_75 = OpVariable %_ptr_Function_bool Function %35
+       %x_92 = OpVariable %_ptr_Function_bool Function %35
+      %x_109 = OpVariable %_ptr_Function_bool Function %35
+   %x_76_phi = OpVariable %_ptr_Function_bool Function %35
+   %x_93_phi = OpVariable %_ptr_Function_bool Function %35
+  %x_110_phi = OpVariable %_ptr_Function_bool Function %35
+         %44 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %45 = OpLoad %float %44
+         %47 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %48 = OpLoad %float %47
+         %52 = OpCompositeConstruct %v2float %45 %48
+         %49 = OpExtInst %uint %50 PackUnorm2x16 %52
+               OpStore %a %49
+         %53 = OpLoad %uint %a
+         %54 = OpExtInst %v4float %50 UnpackSnorm4x8 %53
+               OpStore %v1 %54
+               OpStore %E %float_0_00999999978
+         %58 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+         %59 = OpLoad %int %58
+         %60 = OpAccessChain %_ptr_Function_float %v1 %59
+         %61 = OpLoad %float %60
+         %62 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %63 = OpLoad %float %62
+         %65 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+         %66 = OpLoad %float %65
+         %67 = OpLoad %float %E
+         %69 = OpFDiv %float %63 %66
+         %70 = OpFSub %float %61 %69
+         %68 = OpExtInst %float %50 FAbs %70
+         %71 = OpFOrdLessThan %bool %68 %67
+               OpStore %x_76_phi %71
+               OpSelectionMerge %72 None
+               OpBranchConditional %71 %73 %72
+         %73 = OpLabel
+         %74 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %75 = OpLoad %int %74
+         %76 = OpAccessChain %_ptr_Function_float %v1 %75
+         %77 = OpLoad %float %76
+         %79 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_4
+         %80 = OpLoad %float %79
+         %81 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+         %82 = OpLoad %float %81
+         %83 = OpLoad %float %E
+         %85 = OpFDiv %float %80 %82
+         %86 = OpFSub %float %77 %85
+         %84 = OpExtInst %float %50 FAbs %86
+         %87 = OpFOrdLessThan %bool %84 %83
+               OpStore %x_75 %87
+         %88 = OpLoad %bool %x_75
+               OpStore %x_76_phi %88
+               OpBranch %72
+         %72 = OpLabel
+         %89 = OpLoad %bool %x_76_phi
+               OpStore %x_93_phi %89
+               OpSelectionMerge %90 None
+               OpBranchConditional %89 %91 %90
+         %91 = OpLabel
+         %92 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+         %93 = OpLoad %int %92
+         %94 = OpAccessChain %_ptr_Function_float %v1 %93
+         %95 = OpLoad %float %94
+         %97 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_5
+         %98 = OpLoad %float %97
+         %99 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+        %100 = OpLoad %float %99
+        %101 = OpLoad %float %E
+        %103 = OpFNegate %float %98
+        %104 = OpFDiv %float %103 %100
+        %105 = OpFSub %float %95 %104
+        %102 = OpExtInst %float %50 FAbs %105
+        %106 = OpFOrdLessThan %bool %102 %101
+               OpStore %x_92 %106
+        %107 = OpLoad %bool %x_92
+               OpStore %x_93_phi %107
+               OpBranch %90
+         %90 = OpLabel
+        %108 = OpLoad %bool %x_93_phi
+               OpStore %x_110_phi %108
+               OpSelectionMerge %109 None
+               OpBranchConditional %108 %110 %109
+        %110 = OpLabel
+        %111 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %112 = OpLoad %int %111
+        %113 = OpAccessChain %_ptr_Function_float %v1 %112
+        %114 = OpLoad %float %113
+        %116 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_6
+        %117 = OpLoad %float %116
+        %118 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+        %119 = OpLoad %float %118
+        %120 = OpLoad %float %E
+        %122 = OpFNegate %float %117
+        %123 = OpFDiv %float %122 %119
+        %124 = OpFSub %float %114 %123
+        %121 = OpExtInst %float %50 FAbs %124
+        %125 = OpFOrdLessThan %bool %121 %120
+               OpStore %x_109 %125
+        %126 = OpLoad %bool %x_109
+               OpStore %x_110_phi %126
+               OpBranch %109
+        %109 = OpLabel
+        %127 = OpLoad %bool %x_110_phi
+               OpSelectionMerge %128 None
+               OpBranchConditional %127 %129 %130
+        %129 = OpLabel
+        %131 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %132 = OpLoad %int %131
+        %133 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %134 = OpLoad %int %133
+        %135 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %136 = OpLoad %int %135
+        %137 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %138 = OpLoad %int %137
+        %139 = OpConvertSToF %float %132
+        %140 = OpConvertSToF %float %134
+        %141 = OpConvertSToF %float %136
+        %142 = OpConvertSToF %float %138
+        %143 = OpCompositeConstruct %v4float %139 %140 %141 %142
+               OpStore %x_GLF_color %143
+               OpBranch %128
+        %130 = OpLabel
+        %144 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_5
+        %145 = OpLoad %float %144
+        %146 = OpCompositeConstruct %v4float %145 %145 %145 %145
+               OpStore %x_GLF_color %146
+               OpBranch %128
+        %128 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %147
+%tint_symbol = OpFunctionParameter %main_out
+        %151 = OpLabel
+        %152 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %152
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %154 = OpLabel
+        %155 = OpFunctionCall %void %main_1
+        %157 = OpLoad %v4float %x_GLF_color
+        %158 = OpCompositeConstruct %main_out %157
+        %156 = OpFunctionCall %void %tint_symbol_2 %158
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-pack-unpack/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-pack-unpack/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..47774e7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-pack-unpack/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,98 @@
+type Arr = [[stride(16)]] array<f32, 7>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : u32;
+  var v1 : vec4<f32>;
+  var E : f32;
+  var x_75 : bool;
+  var x_92 : bool;
+  var x_109 : bool;
+  var x_76_phi : bool;
+  var x_93_phi : bool;
+  var x_110_phi : bool;
+  let x_41 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_43 : f32 = x_6.x_GLF_uniform_float_values[1];
+  a = pack2x16unorm(vec2<f32>(x_41, x_43));
+  let x_46 : u32 = a;
+  v1 = unpack4x8snorm(x_46);
+  E = 0.01;
+  let x_49 : i32 = x_10.x_GLF_uniform_int_values[2];
+  let x_51 : f32 = v1[x_49];
+  let x_53 : f32 = x_6.x_GLF_uniform_float_values[2];
+  let x_55 : f32 = x_6.x_GLF_uniform_float_values[3];
+  let x_59 : f32 = E;
+  let x_60 : bool = (abs((x_51 - (x_53 / x_55))) < x_59);
+  x_76_phi = x_60;
+  if (x_60) {
+    let x_64 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_66 : f32 = v1[x_64];
+    let x_68 : f32 = x_6.x_GLF_uniform_float_values[4];
+    let x_70 : f32 = x_6.x_GLF_uniform_float_values[3];
+    let x_74 : f32 = E;
+    x_75 = (abs((x_66 - (x_68 / x_70))) < x_74);
+    x_76_phi = x_75;
+  }
+  let x_76 : bool = x_76_phi;
+  x_93_phi = x_76;
+  if (x_76) {
+    let x_80 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_82 : f32 = v1[x_80];
+    let x_84 : f32 = x_6.x_GLF_uniform_float_values[5];
+    let x_87 : f32 = x_6.x_GLF_uniform_float_values[3];
+    let x_91 : f32 = E;
+    x_92 = (abs((x_82 - (-(x_84) / x_87))) < x_91);
+    x_93_phi = x_92;
+  }
+  let x_93 : bool = x_93_phi;
+  x_110_phi = x_93;
+  if (x_93) {
+    let x_97 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_99 : f32 = v1[x_97];
+    let x_101 : f32 = x_6.x_GLF_uniform_float_values[6];
+    let x_104 : f32 = x_6.x_GLF_uniform_float_values[3];
+    let x_108 : f32 = E;
+    x_109 = (abs((x_99 - (-(x_101) / x_104))) < x_108);
+    x_110_phi = x_109;
+  }
+  let x_110 : bool = x_110_phi;
+  if (x_110) {
+    let x_115 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_118 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_121 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_124 : i32 = x_10.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_115), f32(x_118), f32(x_121), f32(x_124));
+  } else {
+    let x_128 : f32 = x_6.x_GLF_uniform_float_values[5];
+    x_GLF_color = vec4<f32>(x_128, x_128, x_128, x_128);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-pack-unpack/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-pack-unpack/0-opt.wgsl
new file mode 100644
index 0000000..47774e7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-pack-unpack/0-opt.wgsl
@@ -0,0 +1,98 @@
+type Arr = [[stride(16)]] array<f32, 7>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : u32;
+  var v1 : vec4<f32>;
+  var E : f32;
+  var x_75 : bool;
+  var x_92 : bool;
+  var x_109 : bool;
+  var x_76_phi : bool;
+  var x_93_phi : bool;
+  var x_110_phi : bool;
+  let x_41 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_43 : f32 = x_6.x_GLF_uniform_float_values[1];
+  a = pack2x16unorm(vec2<f32>(x_41, x_43));
+  let x_46 : u32 = a;
+  v1 = unpack4x8snorm(x_46);
+  E = 0.01;
+  let x_49 : i32 = x_10.x_GLF_uniform_int_values[2];
+  let x_51 : f32 = v1[x_49];
+  let x_53 : f32 = x_6.x_GLF_uniform_float_values[2];
+  let x_55 : f32 = x_6.x_GLF_uniform_float_values[3];
+  let x_59 : f32 = E;
+  let x_60 : bool = (abs((x_51 - (x_53 / x_55))) < x_59);
+  x_76_phi = x_60;
+  if (x_60) {
+    let x_64 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_66 : f32 = v1[x_64];
+    let x_68 : f32 = x_6.x_GLF_uniform_float_values[4];
+    let x_70 : f32 = x_6.x_GLF_uniform_float_values[3];
+    let x_74 : f32 = E;
+    x_75 = (abs((x_66 - (x_68 / x_70))) < x_74);
+    x_76_phi = x_75;
+  }
+  let x_76 : bool = x_76_phi;
+  x_93_phi = x_76;
+  if (x_76) {
+    let x_80 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_82 : f32 = v1[x_80];
+    let x_84 : f32 = x_6.x_GLF_uniform_float_values[5];
+    let x_87 : f32 = x_6.x_GLF_uniform_float_values[3];
+    let x_91 : f32 = E;
+    x_92 = (abs((x_82 - (-(x_84) / x_87))) < x_91);
+    x_93_phi = x_92;
+  }
+  let x_93 : bool = x_93_phi;
+  x_110_phi = x_93;
+  if (x_93) {
+    let x_97 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_99 : f32 = v1[x_97];
+    let x_101 : f32 = x_6.x_GLF_uniform_float_values[6];
+    let x_104 : f32 = x_6.x_GLF_uniform_float_values[3];
+    let x_108 : f32 = E;
+    x_109 = (abs((x_99 - (-(x_101) / x_104))) < x_108);
+    x_110_phi = x_109;
+  }
+  let x_110 : bool = x_110_phi;
+  if (x_110) {
+    let x_115 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_118 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_121 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_124 : i32 = x_10.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_115), f32(x_118), f32(x_121), f32(x_124));
+  } else {
+    let x_128 : f32 = x_6.x_GLF_uniform_float_values[5];
+    x_GLF_color = vec4<f32>(x_128, x_128, x_128, x_128);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-pack-unpack/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-pack-unpack/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..c1507ae
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-pack-unpack/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,96 @@
+uint tint_pack2x16unorm(float2 param_0) {
+  uint2 i = uint2(round(clamp(param_0, 0.0, 1.0) * 65535.0));
+  return (i.x | i.y << 16);
+}
+
+float4 tint_unpack4x8snorm(uint param_0) {
+  int j = int(param_0);
+  int4 i = int4(j << 24, j << 16, j << 8, j) >> 24;
+  return clamp(float4(i) / 127.0, -1.0, 1.0);
+}
+
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[7];
+};
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  uint a = 0u;
+  float4 v1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float E = 0.0f;
+  bool x_75 = false;
+  bool x_92 = false;
+  bool x_109 = false;
+  bool x_76_phi = false;
+  bool x_93_phi = false;
+  bool x_110_phi = false;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_41 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const float x_43 = asfloat(x_6[1].x);
+  a = tint_pack2x16unorm(float2(x_41, x_43));
+  v1 = tint_unpack4x8snorm(a);
+  E = 0.01f;
+  const int x_49 = asint(x_10[2].x);
+  const float x_51 = v1[x_49];
+  const float x_53 = asfloat(x_6[2].x);
+  const float x_55 = asfloat(x_6[3].x);
+  const bool x_60 = (abs((x_51 - (x_53 / x_55))) < E);
+  x_76_phi = x_60;
+  if (x_60) {
+    const int x_64 = asint(x_10[1].x);
+    const float x_66 = v1[x_64];
+    const float x_68 = asfloat(x_6[4].x);
+    const float x_70 = asfloat(x_6[3].x);
+    x_75 = (abs((x_66 - (x_68 / x_70))) < E);
+    x_76_phi = x_75;
+  }
+  const bool x_76 = x_76_phi;
+  x_93_phi = x_76;
+  if (x_76) {
+    const int x_80 = asint(x_10[3].x);
+    const float x_82 = v1[x_80];
+    const float x_84 = asfloat(x_6[5].x);
+    const float x_87 = asfloat(x_6[3].x);
+    x_92 = (abs((x_82 - (-(x_84) / x_87))) < E);
+    x_93_phi = x_92;
+  }
+  const bool x_93 = x_93_phi;
+  x_110_phi = x_93;
+  if (x_93) {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_97 = asint(x_10[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const float x_99 = v1[x_97];
+    const float x_101 = asfloat(x_6[6].x);
+    const float x_104 = asfloat(x_6[3].x);
+    x_109 = (abs((x_99 - (-(x_101) / x_104))) < E);
+    x_110_phi = x_109;
+  }
+  if (x_110_phi) {
+    const int x_115 = asint(x_10[1].x);
+    const int x_118 = asint(x_10[2].x);
+    const int x_121 = asint(x_10[2].x);
+    const int x_124 = asint(x_10[1].x);
+    x_GLF_color = float4(float(x_115), float(x_118), float(x_121), float(x_124));
+  } else {
+    const float x_128 = asfloat(x_6[5].x);
+    x_GLF_color = float4(x_128, x_128, x_128, x_128);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-pack-unpack/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-pack-unpack/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..77c6b6d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-pack-unpack/0-opt.wgsl.expected.msl
@@ -0,0 +1,106 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[7];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_10, thread float4* const tint_symbol_4) {
+  uint a = 0u;
+  float4 v1 = 0.0f;
+  float E = 0.0f;
+  bool x_75 = false;
+  bool x_92 = false;
+  bool x_109 = false;
+  bool x_76_phi = false;
+  bool x_93_phi = false;
+  bool x_110_phi = false;
+  float const x_41 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_43 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  a = pack_float_to_unorm2x16(float2(x_41, x_43));
+  uint const x_46 = a;
+  v1 = unpack_snorm4x8_to_float(x_46);
+  E = 0.01f;
+  int const x_49 = x_10.x_GLF_uniform_int_values.arr[2].el;
+  float const x_51 = v1[x_49];
+  float const x_53 = x_6.x_GLF_uniform_float_values.arr[2].el;
+  float const x_55 = x_6.x_GLF_uniform_float_values.arr[3].el;
+  float const x_59 = E;
+  bool const x_60 = (fabs((x_51 - (x_53 / x_55))) < x_59);
+  x_76_phi = x_60;
+  if (x_60) {
+    int const x_64 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    float const x_66 = v1[x_64];
+    float const x_68 = x_6.x_GLF_uniform_float_values.arr[4].el;
+    float const x_70 = x_6.x_GLF_uniform_float_values.arr[3].el;
+    float const x_74 = E;
+    x_75 = (fabs((x_66 - (x_68 / x_70))) < x_74);
+    x_76_phi = x_75;
+  }
+  bool const x_76 = x_76_phi;
+  x_93_phi = x_76;
+  if (x_76) {
+    int const x_80 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    float const x_82 = v1[x_80];
+    float const x_84 = x_6.x_GLF_uniform_float_values.arr[5].el;
+    float const x_87 = x_6.x_GLF_uniform_float_values.arr[3].el;
+    float const x_91 = E;
+    x_92 = (fabs((x_82 - (-(x_84) / x_87))) < x_91);
+    x_93_phi = x_92;
+  }
+  bool const x_93 = x_93_phi;
+  x_110_phi = x_93;
+  if (x_93) {
+    int const x_97 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    float const x_99 = v1[x_97];
+    float const x_101 = x_6.x_GLF_uniform_float_values.arr[6].el;
+    float const x_104 = x_6.x_GLF_uniform_float_values.arr[3].el;
+    float const x_108 = E;
+    x_109 = (fabs((x_99 - (-(x_101) / x_104))) < x_108);
+    x_110_phi = x_109;
+  }
+  bool const x_110 = x_110_phi;
+  if (x_110) {
+    int const x_115 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_118 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    int const x_121 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    int const x_124 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_115), float(x_118), float(x_121), float(x_124));
+  } else {
+    float const x_128 = x_6.x_GLF_uniform_float_values.arr[5].el;
+    *(tint_symbol_4) = float4(x_128, x_128, x_128, x_128);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_10 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-pack-unpack/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-pack-unpack/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..470393d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-pack-unpack/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,238 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 159
+; Schema: 0
+               OpCapability Shader
+         %50 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %v1 "v1"
+               OpName %E "E"
+               OpName %x_75 "x_75"
+               OpName %x_92 "x_92"
+               OpName %x_109 "x_109"
+               OpName %x_76_phi "x_76_phi"
+               OpName %x_93_phi "x_93_phi"
+               OpName %x_110_phi "x_110_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_7 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_7 = OpConstant %uint 7
+%_arr_float_uint_7 = OpTypeArray %float %uint_7
+       %buf1 = OpTypeStruct %_arr_float_uint_7
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_uint = OpTypePointer Function %uint
+         %26 = OpConstantNull %uint
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%_ptr_Function_float = OpTypePointer Function %float
+         %31 = OpConstantNull %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %35 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+    %v2float = OpTypeVector %float 2
+%float_0_00999999978 = OpConstant %float 0.00999999978
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+   %main_out = OpTypeStruct %v4float
+        %147 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+          %a = OpVariable %_ptr_Function_uint Function %26
+         %v1 = OpVariable %_ptr_Function_v4float Function %17
+          %E = OpVariable %_ptr_Function_float Function %31
+       %x_75 = OpVariable %_ptr_Function_bool Function %35
+       %x_92 = OpVariable %_ptr_Function_bool Function %35
+      %x_109 = OpVariable %_ptr_Function_bool Function %35
+   %x_76_phi = OpVariable %_ptr_Function_bool Function %35
+   %x_93_phi = OpVariable %_ptr_Function_bool Function %35
+  %x_110_phi = OpVariable %_ptr_Function_bool Function %35
+         %44 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %45 = OpLoad %float %44
+         %47 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %48 = OpLoad %float %47
+         %52 = OpCompositeConstruct %v2float %45 %48
+         %49 = OpExtInst %uint %50 PackUnorm2x16 %52
+               OpStore %a %49
+         %53 = OpLoad %uint %a
+         %54 = OpExtInst %v4float %50 UnpackSnorm4x8 %53
+               OpStore %v1 %54
+               OpStore %E %float_0_00999999978
+         %58 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+         %59 = OpLoad %int %58
+         %60 = OpAccessChain %_ptr_Function_float %v1 %59
+         %61 = OpLoad %float %60
+         %62 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %63 = OpLoad %float %62
+         %65 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+         %66 = OpLoad %float %65
+         %67 = OpLoad %float %E
+         %69 = OpFDiv %float %63 %66
+         %70 = OpFSub %float %61 %69
+         %68 = OpExtInst %float %50 FAbs %70
+         %71 = OpFOrdLessThan %bool %68 %67
+               OpStore %x_76_phi %71
+               OpSelectionMerge %72 None
+               OpBranchConditional %71 %73 %72
+         %73 = OpLabel
+         %74 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %75 = OpLoad %int %74
+         %76 = OpAccessChain %_ptr_Function_float %v1 %75
+         %77 = OpLoad %float %76
+         %79 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_4
+         %80 = OpLoad %float %79
+         %81 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+         %82 = OpLoad %float %81
+         %83 = OpLoad %float %E
+         %85 = OpFDiv %float %80 %82
+         %86 = OpFSub %float %77 %85
+         %84 = OpExtInst %float %50 FAbs %86
+         %87 = OpFOrdLessThan %bool %84 %83
+               OpStore %x_75 %87
+         %88 = OpLoad %bool %x_75
+               OpStore %x_76_phi %88
+               OpBranch %72
+         %72 = OpLabel
+         %89 = OpLoad %bool %x_76_phi
+               OpStore %x_93_phi %89
+               OpSelectionMerge %90 None
+               OpBranchConditional %89 %91 %90
+         %91 = OpLabel
+         %92 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+         %93 = OpLoad %int %92
+         %94 = OpAccessChain %_ptr_Function_float %v1 %93
+         %95 = OpLoad %float %94
+         %97 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_5
+         %98 = OpLoad %float %97
+         %99 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+        %100 = OpLoad %float %99
+        %101 = OpLoad %float %E
+        %103 = OpFNegate %float %98
+        %104 = OpFDiv %float %103 %100
+        %105 = OpFSub %float %95 %104
+        %102 = OpExtInst %float %50 FAbs %105
+        %106 = OpFOrdLessThan %bool %102 %101
+               OpStore %x_92 %106
+        %107 = OpLoad %bool %x_92
+               OpStore %x_93_phi %107
+               OpBranch %90
+         %90 = OpLabel
+        %108 = OpLoad %bool %x_93_phi
+               OpStore %x_110_phi %108
+               OpSelectionMerge %109 None
+               OpBranchConditional %108 %110 %109
+        %110 = OpLabel
+        %111 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %112 = OpLoad %int %111
+        %113 = OpAccessChain %_ptr_Function_float %v1 %112
+        %114 = OpLoad %float %113
+        %116 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_6
+        %117 = OpLoad %float %116
+        %118 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+        %119 = OpLoad %float %118
+        %120 = OpLoad %float %E
+        %122 = OpFNegate %float %117
+        %123 = OpFDiv %float %122 %119
+        %124 = OpFSub %float %114 %123
+        %121 = OpExtInst %float %50 FAbs %124
+        %125 = OpFOrdLessThan %bool %121 %120
+               OpStore %x_109 %125
+        %126 = OpLoad %bool %x_109
+               OpStore %x_110_phi %126
+               OpBranch %109
+        %109 = OpLabel
+        %127 = OpLoad %bool %x_110_phi
+               OpSelectionMerge %128 None
+               OpBranchConditional %127 %129 %130
+        %129 = OpLabel
+        %131 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %132 = OpLoad %int %131
+        %133 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %134 = OpLoad %int %133
+        %135 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %136 = OpLoad %int %135
+        %137 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %138 = OpLoad %int %137
+        %139 = OpConvertSToF %float %132
+        %140 = OpConvertSToF %float %134
+        %141 = OpConvertSToF %float %136
+        %142 = OpConvertSToF %float %138
+        %143 = OpCompositeConstruct %v4float %139 %140 %141 %142
+               OpStore %x_GLF_color %143
+               OpBranch %128
+        %130 = OpLabel
+        %144 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_5
+        %145 = OpLoad %float %144
+        %146 = OpCompositeConstruct %v4float %145 %145 %145 %145
+               OpStore %x_GLF_color %146
+               OpBranch %128
+        %128 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %147
+%tint_symbol = OpFunctionParameter %main_out
+        %151 = OpLabel
+        %152 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %152
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %154 = OpLabel
+        %155 = OpFunctionCall %void %main_1
+        %157 = OpLoad %v4float %x_GLF_color
+        %158 = OpCompositeConstruct %main_out %157
+        %156 = OpFunctionCall %void %tint_symbol_2 %158
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-pack-unpack/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-pack-unpack/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..47774e7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-pack-unpack/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,98 @@
+type Arr = [[stride(16)]] array<f32, 7>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : u32;
+  var v1 : vec4<f32>;
+  var E : f32;
+  var x_75 : bool;
+  var x_92 : bool;
+  var x_109 : bool;
+  var x_76_phi : bool;
+  var x_93_phi : bool;
+  var x_110_phi : bool;
+  let x_41 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_43 : f32 = x_6.x_GLF_uniform_float_values[1];
+  a = pack2x16unorm(vec2<f32>(x_41, x_43));
+  let x_46 : u32 = a;
+  v1 = unpack4x8snorm(x_46);
+  E = 0.01;
+  let x_49 : i32 = x_10.x_GLF_uniform_int_values[2];
+  let x_51 : f32 = v1[x_49];
+  let x_53 : f32 = x_6.x_GLF_uniform_float_values[2];
+  let x_55 : f32 = x_6.x_GLF_uniform_float_values[3];
+  let x_59 : f32 = E;
+  let x_60 : bool = (abs((x_51 - (x_53 / x_55))) < x_59);
+  x_76_phi = x_60;
+  if (x_60) {
+    let x_64 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_66 : f32 = v1[x_64];
+    let x_68 : f32 = x_6.x_GLF_uniform_float_values[4];
+    let x_70 : f32 = x_6.x_GLF_uniform_float_values[3];
+    let x_74 : f32 = E;
+    x_75 = (abs((x_66 - (x_68 / x_70))) < x_74);
+    x_76_phi = x_75;
+  }
+  let x_76 : bool = x_76_phi;
+  x_93_phi = x_76;
+  if (x_76) {
+    let x_80 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_82 : f32 = v1[x_80];
+    let x_84 : f32 = x_6.x_GLF_uniform_float_values[5];
+    let x_87 : f32 = x_6.x_GLF_uniform_float_values[3];
+    let x_91 : f32 = E;
+    x_92 = (abs((x_82 - (-(x_84) / x_87))) < x_91);
+    x_93_phi = x_92;
+  }
+  let x_93 : bool = x_93_phi;
+  x_110_phi = x_93;
+  if (x_93) {
+    let x_97 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_99 : f32 = v1[x_97];
+    let x_101 : f32 = x_6.x_GLF_uniform_float_values[6];
+    let x_104 : f32 = x_6.x_GLF_uniform_float_values[3];
+    let x_108 : f32 = E;
+    x_109 = (abs((x_99 - (-(x_101) / x_104))) < x_108);
+    x_110_phi = x_109;
+  }
+  let x_110 : bool = x_110_phi;
+  if (x_110) {
+    let x_115 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_118 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_121 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_124 : i32 = x_10.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_115), f32(x_118), f32(x_121), f32(x_124));
+  } else {
+    let x_128 : f32 = x_6.x_GLF_uniform_float_values[5];
+    x_GLF_color = vec4<f32>(x_128, x_128, x_128, x_128);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-left-shift-for/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-left-shift-for/0-opt.spvasm
new file mode 100644
index 0000000..e2e61a0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-left-shift-for/0-opt.spvasm
@@ -0,0 +1,116 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color %gl_FragCoord
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf1 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+       %main = OpFunction %void None %13
+         %32 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+         %33 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %34 = OpLoad %int %33
+         %35 = OpConvertSToF %float %34
+         %36 = OpCompositeConstruct %v4float %35 %35 %35 %35
+               OpStore %_GLF_color %36
+         %37 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %38 = OpLoad %float %37
+         %39 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %40 = OpLoad %float %39
+         %41 = OpFOrdGreaterThanEqual %bool %38 %40
+         %42 = OpSelect %int %41 %int_2 %int_1
+         %43 = OpShiftLeftLogical %int %int_1 %42
+               OpStore %i %43
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %48 = OpLoad %int %i
+         %49 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %50 = OpLoad %int %49
+         %51 = OpINotEqual %bool %48 %50
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %52
+         %53 = OpLabel
+         %54 = OpLoad %int %i
+         %55 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %56 = OpLoad %int %55
+         %57 = OpSLessThan %bool %54 %56
+               OpBranch %52
+         %52 = OpLabel
+         %58 = OpPhi %bool %51 %47 %57 %53
+               OpBranchConditional %58 %59 %45
+         %59 = OpLabel
+         %60 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %61 = OpLoad %int %60
+         %62 = OpConvertSToF %float %61
+         %63 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %64 = OpLoad %int %63
+         %65 = OpConvertSToF %float %64
+         %66 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %67 = OpLoad %int %66
+         %68 = OpConvertSToF %float %67
+         %69 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %70 = OpLoad %int %69
+         %71 = OpConvertSToF %float %70
+         %72 = OpCompositeConstruct %v4float %62 %65 %68 %71
+               OpStore %_GLF_color %72
+               OpBranch %46
+         %46 = OpLabel
+         %73 = OpLoad %int %i
+         %74 = OpIAdd %int %73 %int_1
+               OpStore %i %74
+               OpBranch %44
+         %45 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-left-shift-for/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-left-shift-for/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..0b64549
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-left-shift-for/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,68 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[3];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_9 : register(b1, space0) {
+  uint4 x_9[1];
+};
+
+void main_1() {
+  int i = 0;
+  const int x_34 = asint(x_6[2].x);
+  const float x_35 = float(x_34);
+  x_GLF_color = float4(x_35, x_35, x_35, x_35);
+  const float x_38 = gl_FragCoord.y;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_40 = asfloat(x_9[scalar_offset / 4][scalar_offset % 4]);
+  i = (1 << asuint(((x_38 >= x_40) ? 2 : 1)));
+  while (true) {
+    bool x_57 = false;
+    bool x_58_phi = false;
+    const int x_48 = i;
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_50 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const bool x_51 = (x_48 != x_50);
+    x_58_phi = x_51;
+    if (x_51) {
+      const int x_54 = i;
+      const int x_56 = asint(x_6[1].x);
+      x_57 = (x_54 < x_56);
+      x_58_phi = x_57;
+    }
+    if (x_58_phi) {
+    } else {
+      break;
+    }
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_61 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_64 = asint(x_6[2].x);
+    const int x_67 = asint(x_6[2].x);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_70 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    x_GLF_color = float4(float(x_61), float(x_64), float(x_67), float(x_70));
+    {
+      i = (i + 1);
+    }
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-left-shift-for/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-left-shift-for/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..752c12b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-left-shift-for/0-opt.spvasm.expected.msl
@@ -0,0 +1,79 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_9, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int i = 0;
+  int const x_34 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  float const x_35 = float(x_34);
+  *(tint_symbol_5) = float4(x_35, x_35, x_35, x_35);
+  float const x_38 = (*(tint_symbol_6)).y;
+  float const x_40 = x_9.x_GLF_uniform_float_values.arr[0].el;
+  i = (1 << as_type<uint>(select(1, 2, (x_38 >= x_40))));
+  while (true) {
+    bool x_57 = false;
+    bool x_58_phi = false;
+    int const x_48 = i;
+    int const x_50 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    bool const x_51 = (x_48 != x_50);
+    x_58_phi = x_51;
+    if (x_51) {
+      int const x_54 = i;
+      int const x_56 = x_6.x_GLF_uniform_int_values.arr[1].el;
+      x_57 = (x_54 < x_56);
+      x_58_phi = x_57;
+    }
+    bool const x_58 = x_58_phi;
+    if (x_58) {
+    } else {
+      break;
+    }
+    int const x_61 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_64 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_67 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_70 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_5) = float4(float(x_61), float(x_64), float(x_67), float(x_70));
+    {
+      int const x_73 = i;
+      i = (x_73 + 1);
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]], constant buf1& x_9 [[buffer(1)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_6, x_9, &(tint_symbol_8), &(tint_symbol_7));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-left-shift-for/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-left-shift-for/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..42db932
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-left-shift-for/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,170 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 101
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_9 "x_9"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %x_57 "x_57"
+               OpName %x_58_phi "x_58_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 1
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf1 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_9 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Private_float = OpTypePointer Private %float
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %56 = OpConstantNull %bool
+   %main_out = OpTypeStruct %v4float
+         %88 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %23
+         %26 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %29
+       %x_57 = OpVariable %_ptr_Function_bool Function %56
+   %x_58_phi = OpVariable %_ptr_Function_bool Function %56
+         %33 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %34 = OpLoad %int %33
+         %35 = OpConvertSToF %float %34
+         %36 = OpCompositeConstruct %v4float %35 %35 %35 %35
+               OpStore %x_GLF_color %36
+         %38 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %39 = OpLoad %float %38
+         %42 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_0
+         %43 = OpLoad %float %42
+         %47 = OpFOrdGreaterThanEqual %bool %39 %43
+         %46 = OpSelect %int %47 %int_2 %int_1
+         %45 = OpBitcast %uint %46
+         %49 = OpShiftLeftLogical %int %int_1 %45
+               OpStore %i %49
+               OpBranch %50
+         %50 = OpLabel
+               OpLoopMerge %51 %52 None
+               OpBranch %53
+         %53 = OpLabel
+         %58 = OpLoad %int %i
+         %59 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %60 = OpLoad %int %59
+         %61 = OpINotEqual %bool %58 %60
+               OpStore %x_58_phi %61
+               OpSelectionMerge %62 None
+               OpBranchConditional %61 %63 %62
+         %63 = OpLabel
+         %64 = OpLoad %int %i
+         %65 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %66 = OpLoad %int %65
+         %67 = OpSLessThan %bool %64 %66
+               OpStore %x_57 %67
+         %68 = OpLoad %bool %x_57
+               OpStore %x_58_phi %68
+               OpBranch %62
+         %62 = OpLabel
+         %69 = OpLoad %bool %x_58_phi
+               OpSelectionMerge %70 None
+               OpBranchConditional %69 %71 %72
+         %71 = OpLabel
+               OpBranch %70
+         %72 = OpLabel
+               OpBranch %51
+         %70 = OpLabel
+         %73 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %74 = OpLoad %int %73
+         %75 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %76 = OpLoad %int %75
+         %77 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %78 = OpLoad %int %77
+         %79 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %80 = OpLoad %int %79
+         %81 = OpConvertSToF %float %74
+         %82 = OpConvertSToF %float %76
+         %83 = OpConvertSToF %float %78
+         %84 = OpConvertSToF %float %80
+         %85 = OpCompositeConstruct %v4float %81 %82 %83 %84
+               OpStore %x_GLF_color %85
+               OpBranch %52
+         %52 = OpLabel
+         %86 = OpLoad %int %i
+         %87 = OpIAdd %int %86 %int_1
+               OpStore %i %87
+               OpBranch %50
+         %51 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %88
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %92 = OpLabel
+         %93 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %93
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %23
+         %95 = OpLabel
+         %96 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %96
+         %97 = OpFunctionCall %void %main_1
+         %99 = OpLoad %v4float %x_GLF_color
+        %100 = OpCompositeConstruct %main_out %99
+         %98 = OpFunctionCall %void %tint_symbol_3 %100
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-left-shift-for/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-left-shift-for/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..ad9faee
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-left-shift-for/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,73 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+fn main_1() {
+  var i : i32;
+  let x_34 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_35 : f32 = f32(x_34);
+  x_GLF_color = vec4<f32>(x_35, x_35, x_35, x_35);
+  let x_38 : f32 = gl_FragCoord.y;
+  let x_40 : f32 = x_9.x_GLF_uniform_float_values[0];
+  i = (1 << bitcast<u32>(select(1, 2, (x_38 >= x_40))));
+  loop {
+    var x_57 : bool;
+    var x_58_phi : bool;
+    let x_48 : i32 = i;
+    let x_50 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_51 : bool = (x_48 != x_50);
+    x_58_phi = x_51;
+    if (x_51) {
+      let x_54 : i32 = i;
+      let x_56 : i32 = x_6.x_GLF_uniform_int_values[1];
+      x_57 = (x_54 < x_56);
+      x_58_phi = x_57;
+    }
+    let x_58 : bool = x_58_phi;
+    if (x_58) {
+    } else {
+      break;
+    }
+    let x_61 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_64 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_67 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_70 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_61), f32(x_64), f32(x_67), f32(x_70));
+
+    continuing {
+      let x_73 : i32 = i;
+      i = (x_73 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-left-shift-for/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-left-shift-for/0-opt.wgsl
new file mode 100644
index 0000000..ad9faee
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-left-shift-for/0-opt.wgsl
@@ -0,0 +1,73 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+fn main_1() {
+  var i : i32;
+  let x_34 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_35 : f32 = f32(x_34);
+  x_GLF_color = vec4<f32>(x_35, x_35, x_35, x_35);
+  let x_38 : f32 = gl_FragCoord.y;
+  let x_40 : f32 = x_9.x_GLF_uniform_float_values[0];
+  i = (1 << bitcast<u32>(select(1, 2, (x_38 >= x_40))));
+  loop {
+    var x_57 : bool;
+    var x_58_phi : bool;
+    let x_48 : i32 = i;
+    let x_50 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_51 : bool = (x_48 != x_50);
+    x_58_phi = x_51;
+    if (x_51) {
+      let x_54 : i32 = i;
+      let x_56 : i32 = x_6.x_GLF_uniform_int_values[1];
+      x_57 = (x_54 < x_56);
+      x_58_phi = x_57;
+    }
+    let x_58 : bool = x_58_phi;
+    if (x_58) {
+    } else {
+      break;
+    }
+    let x_61 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_64 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_67 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_70 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_61), f32(x_64), f32(x_67), f32(x_70));
+
+    continuing {
+      let x_73 : i32 = i;
+      i = (x_73 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-left-shift-for/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-left-shift-for/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..0b64549
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-left-shift-for/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,68 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[3];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_9 : register(b1, space0) {
+  uint4 x_9[1];
+};
+
+void main_1() {
+  int i = 0;
+  const int x_34 = asint(x_6[2].x);
+  const float x_35 = float(x_34);
+  x_GLF_color = float4(x_35, x_35, x_35, x_35);
+  const float x_38 = gl_FragCoord.y;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_40 = asfloat(x_9[scalar_offset / 4][scalar_offset % 4]);
+  i = (1 << asuint(((x_38 >= x_40) ? 2 : 1)));
+  while (true) {
+    bool x_57 = false;
+    bool x_58_phi = false;
+    const int x_48 = i;
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_50 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const bool x_51 = (x_48 != x_50);
+    x_58_phi = x_51;
+    if (x_51) {
+      const int x_54 = i;
+      const int x_56 = asint(x_6[1].x);
+      x_57 = (x_54 < x_56);
+      x_58_phi = x_57;
+    }
+    if (x_58_phi) {
+    } else {
+      break;
+    }
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_61 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_64 = asint(x_6[2].x);
+    const int x_67 = asint(x_6[2].x);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_70 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    x_GLF_color = float4(float(x_61), float(x_64), float(x_67), float(x_70));
+    {
+      i = (i + 1);
+    }
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-left-shift-for/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-left-shift-for/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..752c12b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-left-shift-for/0-opt.wgsl.expected.msl
@@ -0,0 +1,79 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_9, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int i = 0;
+  int const x_34 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  float const x_35 = float(x_34);
+  *(tint_symbol_5) = float4(x_35, x_35, x_35, x_35);
+  float const x_38 = (*(tint_symbol_6)).y;
+  float const x_40 = x_9.x_GLF_uniform_float_values.arr[0].el;
+  i = (1 << as_type<uint>(select(1, 2, (x_38 >= x_40))));
+  while (true) {
+    bool x_57 = false;
+    bool x_58_phi = false;
+    int const x_48 = i;
+    int const x_50 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    bool const x_51 = (x_48 != x_50);
+    x_58_phi = x_51;
+    if (x_51) {
+      int const x_54 = i;
+      int const x_56 = x_6.x_GLF_uniform_int_values.arr[1].el;
+      x_57 = (x_54 < x_56);
+      x_58_phi = x_57;
+    }
+    bool const x_58 = x_58_phi;
+    if (x_58) {
+    } else {
+      break;
+    }
+    int const x_61 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_64 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_67 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_70 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_5) = float4(float(x_61), float(x_64), float(x_67), float(x_70));
+    {
+      int const x_73 = i;
+      i = (x_73 + 1);
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]], constant buf1& x_9 [[buffer(1)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_6, x_9, &(tint_symbol_8), &(tint_symbol_7));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-left-shift-for/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-left-shift-for/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..42db932
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-left-shift-for/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,170 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 101
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_9 "x_9"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %x_57 "x_57"
+               OpName %x_58_phi "x_58_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 1
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf1 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_9 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Private_float = OpTypePointer Private %float
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %56 = OpConstantNull %bool
+   %main_out = OpTypeStruct %v4float
+         %88 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %23
+         %26 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %29
+       %x_57 = OpVariable %_ptr_Function_bool Function %56
+   %x_58_phi = OpVariable %_ptr_Function_bool Function %56
+         %33 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %34 = OpLoad %int %33
+         %35 = OpConvertSToF %float %34
+         %36 = OpCompositeConstruct %v4float %35 %35 %35 %35
+               OpStore %x_GLF_color %36
+         %38 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %39 = OpLoad %float %38
+         %42 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_0
+         %43 = OpLoad %float %42
+         %47 = OpFOrdGreaterThanEqual %bool %39 %43
+         %46 = OpSelect %int %47 %int_2 %int_1
+         %45 = OpBitcast %uint %46
+         %49 = OpShiftLeftLogical %int %int_1 %45
+               OpStore %i %49
+               OpBranch %50
+         %50 = OpLabel
+               OpLoopMerge %51 %52 None
+               OpBranch %53
+         %53 = OpLabel
+         %58 = OpLoad %int %i
+         %59 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %60 = OpLoad %int %59
+         %61 = OpINotEqual %bool %58 %60
+               OpStore %x_58_phi %61
+               OpSelectionMerge %62 None
+               OpBranchConditional %61 %63 %62
+         %63 = OpLabel
+         %64 = OpLoad %int %i
+         %65 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %66 = OpLoad %int %65
+         %67 = OpSLessThan %bool %64 %66
+               OpStore %x_57 %67
+         %68 = OpLoad %bool %x_57
+               OpStore %x_58_phi %68
+               OpBranch %62
+         %62 = OpLabel
+         %69 = OpLoad %bool %x_58_phi
+               OpSelectionMerge %70 None
+               OpBranchConditional %69 %71 %72
+         %71 = OpLabel
+               OpBranch %70
+         %72 = OpLabel
+               OpBranch %51
+         %70 = OpLabel
+         %73 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %74 = OpLoad %int %73
+         %75 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %76 = OpLoad %int %75
+         %77 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %78 = OpLoad %int %77
+         %79 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %80 = OpLoad %int %79
+         %81 = OpConvertSToF %float %74
+         %82 = OpConvertSToF %float %76
+         %83 = OpConvertSToF %float %78
+         %84 = OpConvertSToF %float %80
+         %85 = OpCompositeConstruct %v4float %81 %82 %83 %84
+               OpStore %x_GLF_color %85
+               OpBranch %52
+         %52 = OpLabel
+         %86 = OpLoad %int %i
+         %87 = OpIAdd %int %86 %int_1
+               OpStore %i %87
+               OpBranch %50
+         %51 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %88
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %92 = OpLabel
+         %93 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %93
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %23
+         %95 = OpLabel
+         %96 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %96
+         %97 = OpFunctionCall %void %main_1
+         %99 = OpLoad %v4float %x_GLF_color
+        %100 = OpCompositeConstruct %main_out %99
+         %98 = OpFunctionCall %void %tint_symbol_3 %100
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-left-shift-for/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-left-shift-for/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..ad9faee
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-left-shift-for/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,73 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+fn main_1() {
+  var i : i32;
+  let x_34 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_35 : f32 = f32(x_34);
+  x_GLF_color = vec4<f32>(x_35, x_35, x_35, x_35);
+  let x_38 : f32 = gl_FragCoord.y;
+  let x_40 : f32 = x_9.x_GLF_uniform_float_values[0];
+  i = (1 << bitcast<u32>(select(1, 2, (x_38 >= x_40))));
+  loop {
+    var x_57 : bool;
+    var x_58_phi : bool;
+    let x_48 : i32 = i;
+    let x_50 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_51 : bool = (x_48 != x_50);
+    x_58_phi = x_51;
+    if (x_51) {
+      let x_54 : i32 = i;
+      let x_56 : i32 = x_6.x_GLF_uniform_int_values[1];
+      x_57 = (x_54 < x_56);
+      x_58_phi = x_57;
+    }
+    let x_58 : bool = x_58_phi;
+    if (x_58) {
+    } else {
+      break;
+    }
+    let x_61 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_64 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_67 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_70 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_61), f32(x_64), f32(x_67), f32(x_70));
+
+    continuing {
+      let x_73 : i32 = i;
+      i = (x_73 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-mix-mix-clamp/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-mix-mix-clamp/0-opt.spvasm
new file mode 100644
index 0000000..36e4d29
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-mix-mix-clamp/0-opt.spvasm
@@ -0,0 +1,197 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %A "A"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpName %v1 "v1"
+               OpName %v2 "v2"
+               OpName %b "b"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %17 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+%_ptr_Function__arr_int_uint_2 = OpTypePointer Function %_arr_int_uint_2
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+       %true = OpConstantTrue %bool
+     %v2bool = OpTypeVector %bool 2
+%_ptr_Function_float = OpTypePointer Function %float
+      %false = OpConstantFalse %bool
+         %40 = OpConstantComposite %v2bool %false %false
+     %uint_0 = OpConstant %uint 0
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %17
+         %44 = OpLabel
+          %A = OpVariable %_ptr_Function__arr_int_uint_2 Function
+          %i = OpVariable %_ptr_Function_int Function
+          %a = OpVariable %_ptr_Function_int Function
+         %v1 = OpVariable %_ptr_Function_v2float Function
+         %v2 = OpVariable %_ptr_Function_v2float Function
+          %b = OpVariable %_ptr_Function_int Function
+         %45 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %46 = OpLoad %int %45
+         %47 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %48 = OpLoad %int %47
+         %49 = OpAccessChain %_ptr_Function_int %A %46
+               OpStore %49 %48
+         %50 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %51 = OpLoad %int %50
+         %52 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %53 = OpLoad %int %52
+         %54 = OpAccessChain %_ptr_Function_int %A %51
+               OpStore %54 %53
+         %55 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %56 = OpLoad %int %55
+               OpStore %i %56
+               OpBranch %57
+         %57 = OpLabel
+               OpLoopMerge %58 %59 None
+               OpBranch %60
+         %60 = OpLabel
+         %61 = OpLoad %int %i
+         %62 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %63 = OpLoad %int %62
+         %64 = OpSGreaterThan %bool %61 %63
+               OpBranchConditional %64 %65 %58
+         %65 = OpLabel
+         %66 = OpLoad %int %i
+         %67 = OpISub %int %66 %int_1
+               OpStore %i %67
+               OpBranch %59
+         %59 = OpLabel
+               OpBranch %57
+         %58 = OpLabel
+         %68 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_1
+         %69 = OpLoad %float %68
+         %70 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_1
+         %71 = OpLoad %float %70
+         %72 = OpFOrdGreaterThanEqual %bool %69 %71
+         %73 = OpLoad %int %i
+         %74 = OpSelect %int %72 %int_1 %73
+         %75 = OpAccessChain %_ptr_Function_int %A %74
+         %76 = OpLoad %int %75
+               OpStore %a %76
+         %77 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %78 = OpLoad %int %77
+         %79 = OpConvertSToF %float %78
+         %80 = OpLoad %int %a
+         %81 = OpConvertSToF %float %80
+         %82 = OpCompositeConstruct %v2float %79 %81
+         %83 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %84 = OpLoad %int %83
+         %85 = OpConvertSToF %float %84
+         %86 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %87 = OpLoad %int %86
+         %88 = OpConvertSToF %float %87
+         %89 = OpCompositeConstruct %v2float %85 %88
+         %90 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_1
+         %91 = OpLoad %float %90
+         %92 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %93 = OpLoad %float %92
+         %94 = OpFOrdLessThan %bool %91 %93
+         %95 = OpCompositeConstruct %v2bool %94 %true
+         %96 = OpSelect %v2float %95 %89 %82
+               OpStore %v1 %96
+         %97 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %98 = OpLoad %int %97
+         %99 = OpAccessChain %_ptr_Function_float %v1 %98
+        %100 = OpLoad %float %99
+        %101 = OpCompositeConstruct %v2float %100 %100
+        %102 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+        %103 = OpLoad %int %102
+        %104 = OpAccessChain %_ptr_Function_float %v1 %103
+        %105 = OpLoad %float %104
+        %106 = OpCompositeConstruct %v2float %105 %105
+        %107 = OpSelect %v2float %40 %106 %101
+               OpStore %v2 %107
+        %108 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+        %109 = OpLoad %int %108
+        %110 = OpConvertSToF %float %109
+        %111 = OpCompositeConstruct %v2float %110 %110
+        %112 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+        %113 = OpLoad %int %112
+        %114 = OpConvertSToF %float %113
+        %115 = OpCompositeConstruct %v2float %114 %114
+        %116 = OpLoad %v2float %v2
+        %117 = OpExtInst %v2float %1 FClamp %111 %115 %116
+        %118 = OpCompositeExtract %float %117 0
+        %119 = OpConvertFToS %int %118
+        %120 = OpAccessChain %_ptr_Function_int %A %119
+        %121 = OpLoad %int %120
+               OpStore %b %121
+        %122 = OpLoad %int %b
+        %123 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+        %124 = OpLoad %int %123
+        %125 = OpIEqual %bool %122 %124
+               OpSelectionMerge %126 None
+               OpBranchConditional %125 %127 %128
+        %127 = OpLabel
+        %129 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+        %130 = OpLoad %int %129
+        %131 = OpConvertSToF %float %130
+        %132 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+        %133 = OpLoad %int %132
+        %134 = OpConvertSToF %float %133
+        %135 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+        %136 = OpLoad %int %135
+        %137 = OpConvertSToF %float %136
+        %138 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+        %139 = OpLoad %int %138
+        %140 = OpConvertSToF %float %139
+        %141 = OpCompositeConstruct %v4float %131 %134 %137 %140
+               OpStore %_GLF_color %141
+               OpBranch %126
+        %128 = OpLabel
+        %142 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+        %143 = OpLoad %int %142
+        %144 = OpConvertSToF %float %143
+        %145 = OpCompositeConstruct %v4float %144 %144 %144 %144
+               OpStore %_GLF_color %145
+               OpBranch %126
+        %126 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-mix-mix-clamp/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-mix-mix-clamp/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..ff9156f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-mix-mix-clamp/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,94 @@
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[3];
+};
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int A[2] = (int[2])0;
+  int i = 0;
+  int a = 0;
+  float2 v1 = float2(0.0f, 0.0f);
+  float2 v2 = float2(0.0f, 0.0f);
+  int b = 0;
+  const int x_46 = asint(x_6[2].x);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_48 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  A[x_46] = x_48;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_51 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const int x_53 = asint(x_6[1].x);
+  A[x_51] = x_53;
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const int x_56 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  i = x_56;
+  while (true) {
+    const int x_61 = i;
+    const int x_63 = asint(x_6[2].x);
+    if ((x_61 > x_63)) {
+    } else {
+      break;
+    }
+    i = (i - 1);
+  }
+  const float x_69 = asfloat(x_10[1].x);
+  const float x_71 = asfloat(x_10[1].x);
+  const int x_76 = A[((x_69 >= x_71) ? 1 : i)];
+  a = x_76;
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const int x_78 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  const int x_80 = a;
+  const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+  const int x_84 = asint(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+  const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+  const int x_87 = asint(x_6[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+  const float x_91 = asfloat(x_10[1].x);
+  const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+  const float x_93 = asfloat(x_10[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+  v1 = (bool2((x_91 < x_93), true) ? float2(float(x_84), float(x_87)) : float2(float(x_78), float(x_80)));
+  const int x_98 = asint(x_6[2].x);
+  const float x_100 = v1[x_98];
+  const uint scalar_offset_7 = ((16u * uint(0))) / 4;
+  const int x_103 = asint(x_6[scalar_offset_7 / 4][scalar_offset_7 % 4]);
+  const float x_105 = v1[x_103];
+  v2 = (bool2(false, false) ? float2(x_105, x_105) : float2(x_100, x_100));
+  const int x_109 = asint(x_6[1].x);
+  const float x_110 = float(x_109);
+  const uint scalar_offset_8 = ((16u * uint(0))) / 4;
+  const int x_113 = asint(x_6[scalar_offset_8 / 4][scalar_offset_8 % 4]);
+  const float x_114 = float(x_113);
+  const int x_121 = A[int(clamp(float2(x_110, x_110), float2(x_114, x_114), v2).x)];
+  b = x_121;
+  const int x_122 = b;
+  const int x_124 = asint(x_6[1].x);
+  if ((x_122 == x_124)) {
+    const uint scalar_offset_9 = ((16u * uint(0))) / 4;
+    const int x_130 = asint(x_6[scalar_offset_9 / 4][scalar_offset_9 % 4]);
+    const int x_133 = asint(x_6[2].x);
+    const int x_136 = asint(x_6[2].x);
+    const uint scalar_offset_10 = ((16u * uint(0))) / 4;
+    const int x_139 = asint(x_6[scalar_offset_10 / 4][scalar_offset_10 % 4]);
+    x_GLF_color = float4(float(x_130), float(x_133), float(x_136), float(x_139));
+  } else {
+    const int x_143 = asint(x_6[2].x);
+    const float x_144 = float(x_143);
+    x_GLF_color = float4(x_144, x_144, x_144, x_144);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-mix-mix-clamp/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-mix-mix-clamp/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..57d1bba
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-mix-mix-clamp/0-opt.spvasm.expected.msl
@@ -0,0 +1,106 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct tint_array_wrapper_2 {
+  int arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_10, thread float4* const tint_symbol_4) {
+  tint_array_wrapper_2 A = {};
+  int i = 0;
+  int a = 0;
+  float2 v1 = 0.0f;
+  float2 v2 = 0.0f;
+  int b = 0;
+  int const x_46 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_48 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  A.arr[x_46] = x_48;
+  int const x_51 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_53 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  A.arr[x_51] = x_53;
+  int const x_56 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  i = x_56;
+  while (true) {
+    int const x_61 = i;
+    int const x_63 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    if ((x_61 > x_63)) {
+    } else {
+      break;
+    }
+    int const x_66 = i;
+    i = (x_66 - 1);
+  }
+  float const x_69 = x_10.x_GLF_uniform_float_values.arr[1].el;
+  float const x_71 = x_10.x_GLF_uniform_float_values.arr[1].el;
+  int const x_73 = i;
+  int const x_76 = A.arr[select(x_73, 1, (x_69 >= x_71))];
+  a = x_76;
+  int const x_78 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_80 = a;
+  int const x_84 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_87 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  float const x_91 = x_10.x_GLF_uniform_float_values.arr[1].el;
+  float const x_93 = x_10.x_GLF_uniform_float_values.arr[0].el;
+  v1 = select(float2(float(x_78), float(x_80)), float2(float(x_84), float(x_87)), bool2((x_91 < x_93), true));
+  int const x_98 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  float const x_100 = v1[x_98];
+  int const x_103 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  float const x_105 = v1[x_103];
+  v2 = select(float2(x_100, x_100), float2(x_105, x_105), bool2(false, false));
+  int const x_109 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  float const x_110 = float(x_109);
+  int const x_113 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  float const x_114 = float(x_113);
+  float2 const x_116 = v2;
+  int const x_121 = A.arr[int(clamp(float2(x_110, x_110), float2(x_114, x_114), x_116).x)];
+  b = x_121;
+  int const x_122 = b;
+  int const x_124 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_122 == x_124)) {
+    int const x_130 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_133 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_136 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_139 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_130), float(x_133), float(x_136), float(x_139));
+  } else {
+    int const x_143 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    float const x_144 = float(x_143);
+    *(tint_symbol_4) = float4(x_144, x_144, x_144, x_144);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_10 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-mix-mix-clamp/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-mix-mix-clamp/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..8b6f4d4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-mix-mix-clamp/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,239 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 166
+; Schema: 0
+               OpCapability Shader
+        %124 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %A "A"
+               OpName %i "i"
+               OpName %a "a"
+               OpName %v1 "v1"
+               OpName %v2 "v2"
+               OpName %b "b"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %float = OpTypeFloat 32
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+%_ptr_Function__arr_int_uint_2 = OpTypePointer Function %_arr_int_uint_2
+         %27 = OpConstantNull %_arr_int_uint_2
+%_ptr_Function_int = OpTypePointer Function %int
+         %30 = OpConstantNull %int
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %35 = OpConstantNull %v2float
+     %uint_0 = OpConstant %uint 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %v2bool = OpTypeVector %bool 2
+       %true = OpConstantTrue %bool
+%_ptr_Function_float = OpTypePointer Function %float
+      %false = OpConstantFalse %bool
+        %112 = OpConstantComposite %v2bool %false %false
+   %main_out = OpTypeStruct %v4float
+        %154 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+          %A = OpVariable %_ptr_Function__arr_int_uint_2 Function %27
+          %i = OpVariable %_ptr_Function_int Function %30
+          %a = OpVariable %_ptr_Function_int Function %30
+         %v1 = OpVariable %_ptr_Function_v2float Function %35
+         %v2 = OpVariable %_ptr_Function_v2float Function %35
+          %b = OpVariable %_ptr_Function_int Function %30
+         %41 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %42 = OpLoad %int %41
+         %44 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %45 = OpLoad %int %44
+         %46 = OpAccessChain %_ptr_Function_int %A %42
+               OpStore %46 %45
+         %47 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %48 = OpLoad %int %47
+         %50 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %51 = OpLoad %int %50
+         %52 = OpAccessChain %_ptr_Function_int %A %48
+               OpStore %52 %51
+         %53 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %54 = OpLoad %int %53
+               OpStore %i %54
+               OpBranch %55
+         %55 = OpLabel
+               OpLoopMerge %56 %57 None
+               OpBranch %58
+         %58 = OpLabel
+         %59 = OpLoad %int %i
+         %60 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %61 = OpLoad %int %60
+         %62 = OpSGreaterThan %bool %59 %61
+               OpSelectionMerge %64 None
+               OpBranchConditional %62 %65 %66
+         %65 = OpLabel
+               OpBranch %64
+         %66 = OpLabel
+               OpBranch %56
+         %64 = OpLabel
+         %67 = OpLoad %int %i
+         %68 = OpISub %int %67 %int_1
+               OpStore %i %68
+               OpBranch %57
+         %57 = OpLabel
+               OpBranch %55
+         %56 = OpLabel
+         %70 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_1
+         %71 = OpLoad %float %70
+         %72 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_1
+         %73 = OpLoad %float %72
+         %74 = OpLoad %int %i
+         %76 = OpFOrdGreaterThanEqual %bool %71 %73
+         %75 = OpSelect %int %76 %int_1 %74
+         %77 = OpAccessChain %_ptr_Function_int %A %75
+         %78 = OpLoad %int %77
+               OpStore %a %78
+         %79 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %80 = OpLoad %int %79
+         %81 = OpLoad %int %a
+         %82 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %83 = OpLoad %int %82
+         %84 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %85 = OpLoad %int %84
+         %86 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_1
+         %87 = OpLoad %float %86
+         %88 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_0
+         %89 = OpLoad %float %88
+         %92 = OpFOrdLessThan %bool %87 %89
+         %94 = OpCompositeConstruct %v2bool %92 %true
+         %95 = OpConvertSToF %float %83
+         %96 = OpConvertSToF %float %85
+         %97 = OpCompositeConstruct %v2float %95 %96
+         %98 = OpConvertSToF %float %80
+         %99 = OpConvertSToF %float %81
+        %100 = OpCompositeConstruct %v2float %98 %99
+         %90 = OpSelect %v2float %94 %97 %100
+               OpStore %v1 %90
+        %101 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %102 = OpLoad %int %101
+        %104 = OpAccessChain %_ptr_Function_float %v1 %102
+        %105 = OpLoad %float %104
+        %106 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %107 = OpLoad %int %106
+        %108 = OpAccessChain %_ptr_Function_float %v1 %107
+        %109 = OpLoad %float %108
+        %113 = OpCompositeConstruct %v2float %109 %109
+        %114 = OpCompositeConstruct %v2float %105 %105
+        %110 = OpSelect %v2float %112 %113 %114
+               OpStore %v2 %110
+        %115 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %116 = OpLoad %int %115
+        %117 = OpConvertSToF %float %116
+        %118 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %119 = OpLoad %int %118
+        %120 = OpConvertSToF %float %119
+        %121 = OpLoad %v2float %v2
+        %125 = OpCompositeConstruct %v2float %117 %117
+        %126 = OpCompositeConstruct %v2float %120 %120
+        %123 = OpExtInst %v2float %124 NClamp %125 %126 %121
+        %127 = OpCompositeExtract %float %123 0
+        %122 = OpConvertFToS %int %127
+        %128 = OpAccessChain %_ptr_Function_int %A %122
+        %129 = OpLoad %int %128
+               OpStore %b %129
+        %130 = OpLoad %int %b
+        %131 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %132 = OpLoad %int %131
+        %133 = OpIEqual %bool %130 %132
+               OpSelectionMerge %134 None
+               OpBranchConditional %133 %135 %136
+        %135 = OpLabel
+        %137 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %138 = OpLoad %int %137
+        %139 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %140 = OpLoad %int %139
+        %141 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %142 = OpLoad %int %141
+        %143 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %144 = OpLoad %int %143
+        %145 = OpConvertSToF %float %138
+        %146 = OpConvertSToF %float %140
+        %147 = OpConvertSToF %float %142
+        %148 = OpConvertSToF %float %144
+        %149 = OpCompositeConstruct %v4float %145 %146 %147 %148
+               OpStore %x_GLF_color %149
+               OpBranch %134
+        %136 = OpLabel
+        %150 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %151 = OpLoad %int %150
+        %152 = OpConvertSToF %float %151
+        %153 = OpCompositeConstruct %v4float %152 %152 %152 %152
+               OpStore %x_GLF_color %153
+               OpBranch %134
+        %134 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %154
+%tint_symbol = OpFunctionParameter %main_out
+        %158 = OpLabel
+        %159 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %159
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %161 = OpLabel
+        %162 = OpFunctionCall %void %main_1
+        %164 = OpLoad %v4float %x_GLF_color
+        %165 = OpCompositeConstruct %main_out %164
+        %163 = OpFunctionCall %void %tint_symbol_2 %165
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-mix-mix-clamp/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-mix-mix-clamp/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..591926d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-mix-mix-clamp/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,95 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var A : array<i32, 2>;
+  var i : i32;
+  var a : i32;
+  var v1 : vec2<f32>;
+  var v2 : vec2<f32>;
+  var b : i32;
+  let x_46 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_48 : i32 = x_6.x_GLF_uniform_int_values[0];
+  A[x_46] = x_48;
+  let x_51 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_53 : i32 = x_6.x_GLF_uniform_int_values[1];
+  A[x_51] = x_53;
+  let x_56 : i32 = x_6.x_GLF_uniform_int_values[0];
+  i = x_56;
+  loop {
+    let x_61 : i32 = i;
+    let x_63 : i32 = x_6.x_GLF_uniform_int_values[2];
+    if ((x_61 > x_63)) {
+    } else {
+      break;
+    }
+    let x_66 : i32 = i;
+    i = (x_66 - 1);
+  }
+  let x_69 : f32 = x_10.x_GLF_uniform_float_values[1];
+  let x_71 : f32 = x_10.x_GLF_uniform_float_values[1];
+  let x_73 : i32 = i;
+  let x_76 : i32 = A[select(x_73, 1, (x_69 >= x_71))];
+  a = x_76;
+  let x_78 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_80 : i32 = a;
+  let x_84 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_87 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_91 : f32 = x_10.x_GLF_uniform_float_values[1];
+  let x_93 : f32 = x_10.x_GLF_uniform_float_values[0];
+  v1 = select(vec2<f32>(f32(x_78), f32(x_80)), vec2<f32>(f32(x_84), f32(x_87)), vec2<bool>((x_91 < x_93), true));
+  let x_98 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_100 : f32 = v1[x_98];
+  let x_103 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_105 : f32 = v1[x_103];
+  v2 = select(vec2<f32>(x_100, x_100), vec2<f32>(x_105, x_105), vec2<bool>(false, false));
+  let x_109 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_110 : f32 = f32(x_109);
+  let x_113 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_114 : f32 = f32(x_113);
+  let x_116 : vec2<f32> = v2;
+  let x_121 : i32 = A[i32(clamp(vec2<f32>(x_110, x_110), vec2<f32>(x_114, x_114), x_116).x)];
+  b = x_121;
+  let x_122 : i32 = b;
+  let x_124 : i32 = x_6.x_GLF_uniform_int_values[1];
+  if ((x_122 == x_124)) {
+    let x_130 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_133 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_136 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_139 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_130), f32(x_133), f32(x_136), f32(x_139));
+  } else {
+    let x_143 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_144 : f32 = f32(x_143);
+    x_GLF_color = vec4<f32>(x_144, x_144, x_144, x_144);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-mix-mix-clamp/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-mix-mix-clamp/0-opt.wgsl
new file mode 100644
index 0000000..591926d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-mix-mix-clamp/0-opt.wgsl
@@ -0,0 +1,95 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var A : array<i32, 2>;
+  var i : i32;
+  var a : i32;
+  var v1 : vec2<f32>;
+  var v2 : vec2<f32>;
+  var b : i32;
+  let x_46 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_48 : i32 = x_6.x_GLF_uniform_int_values[0];
+  A[x_46] = x_48;
+  let x_51 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_53 : i32 = x_6.x_GLF_uniform_int_values[1];
+  A[x_51] = x_53;
+  let x_56 : i32 = x_6.x_GLF_uniform_int_values[0];
+  i = x_56;
+  loop {
+    let x_61 : i32 = i;
+    let x_63 : i32 = x_6.x_GLF_uniform_int_values[2];
+    if ((x_61 > x_63)) {
+    } else {
+      break;
+    }
+    let x_66 : i32 = i;
+    i = (x_66 - 1);
+  }
+  let x_69 : f32 = x_10.x_GLF_uniform_float_values[1];
+  let x_71 : f32 = x_10.x_GLF_uniform_float_values[1];
+  let x_73 : i32 = i;
+  let x_76 : i32 = A[select(x_73, 1, (x_69 >= x_71))];
+  a = x_76;
+  let x_78 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_80 : i32 = a;
+  let x_84 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_87 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_91 : f32 = x_10.x_GLF_uniform_float_values[1];
+  let x_93 : f32 = x_10.x_GLF_uniform_float_values[0];
+  v1 = select(vec2<f32>(f32(x_78), f32(x_80)), vec2<f32>(f32(x_84), f32(x_87)), vec2<bool>((x_91 < x_93), true));
+  let x_98 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_100 : f32 = v1[x_98];
+  let x_103 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_105 : f32 = v1[x_103];
+  v2 = select(vec2<f32>(x_100, x_100), vec2<f32>(x_105, x_105), vec2<bool>(false, false));
+  let x_109 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_110 : f32 = f32(x_109);
+  let x_113 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_114 : f32 = f32(x_113);
+  let x_116 : vec2<f32> = v2;
+  let x_121 : i32 = A[i32(clamp(vec2<f32>(x_110, x_110), vec2<f32>(x_114, x_114), x_116).x)];
+  b = x_121;
+  let x_122 : i32 = b;
+  let x_124 : i32 = x_6.x_GLF_uniform_int_values[1];
+  if ((x_122 == x_124)) {
+    let x_130 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_133 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_136 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_139 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_130), f32(x_133), f32(x_136), f32(x_139));
+  } else {
+    let x_143 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_144 : f32 = f32(x_143);
+    x_GLF_color = vec4<f32>(x_144, x_144, x_144, x_144);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-mix-mix-clamp/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-mix-mix-clamp/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..ff9156f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-mix-mix-clamp/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,94 @@
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[3];
+};
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int A[2] = (int[2])0;
+  int i = 0;
+  int a = 0;
+  float2 v1 = float2(0.0f, 0.0f);
+  float2 v2 = float2(0.0f, 0.0f);
+  int b = 0;
+  const int x_46 = asint(x_6[2].x);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_48 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  A[x_46] = x_48;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_51 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const int x_53 = asint(x_6[1].x);
+  A[x_51] = x_53;
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const int x_56 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  i = x_56;
+  while (true) {
+    const int x_61 = i;
+    const int x_63 = asint(x_6[2].x);
+    if ((x_61 > x_63)) {
+    } else {
+      break;
+    }
+    i = (i - 1);
+  }
+  const float x_69 = asfloat(x_10[1].x);
+  const float x_71 = asfloat(x_10[1].x);
+  const int x_76 = A[((x_69 >= x_71) ? 1 : i)];
+  a = x_76;
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const int x_78 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  const int x_80 = a;
+  const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+  const int x_84 = asint(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+  const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+  const int x_87 = asint(x_6[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+  const float x_91 = asfloat(x_10[1].x);
+  const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+  const float x_93 = asfloat(x_10[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+  v1 = (bool2((x_91 < x_93), true) ? float2(float(x_84), float(x_87)) : float2(float(x_78), float(x_80)));
+  const int x_98 = asint(x_6[2].x);
+  const float x_100 = v1[x_98];
+  const uint scalar_offset_7 = ((16u * uint(0))) / 4;
+  const int x_103 = asint(x_6[scalar_offset_7 / 4][scalar_offset_7 % 4]);
+  const float x_105 = v1[x_103];
+  v2 = (bool2(false, false) ? float2(x_105, x_105) : float2(x_100, x_100));
+  const int x_109 = asint(x_6[1].x);
+  const float x_110 = float(x_109);
+  const uint scalar_offset_8 = ((16u * uint(0))) / 4;
+  const int x_113 = asint(x_6[scalar_offset_8 / 4][scalar_offset_8 % 4]);
+  const float x_114 = float(x_113);
+  const int x_121 = A[int(clamp(float2(x_110, x_110), float2(x_114, x_114), v2).x)];
+  b = x_121;
+  const int x_122 = b;
+  const int x_124 = asint(x_6[1].x);
+  if ((x_122 == x_124)) {
+    const uint scalar_offset_9 = ((16u * uint(0))) / 4;
+    const int x_130 = asint(x_6[scalar_offset_9 / 4][scalar_offset_9 % 4]);
+    const int x_133 = asint(x_6[2].x);
+    const int x_136 = asint(x_6[2].x);
+    const uint scalar_offset_10 = ((16u * uint(0))) / 4;
+    const int x_139 = asint(x_6[scalar_offset_10 / 4][scalar_offset_10 % 4]);
+    x_GLF_color = float4(float(x_130), float(x_133), float(x_136), float(x_139));
+  } else {
+    const int x_143 = asint(x_6[2].x);
+    const float x_144 = float(x_143);
+    x_GLF_color = float4(x_144, x_144, x_144, x_144);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-mix-mix-clamp/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-mix-mix-clamp/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..57d1bba
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-mix-mix-clamp/0-opt.wgsl.expected.msl
@@ -0,0 +1,106 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct tint_array_wrapper_2 {
+  int arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_10, thread float4* const tint_symbol_4) {
+  tint_array_wrapper_2 A = {};
+  int i = 0;
+  int a = 0;
+  float2 v1 = 0.0f;
+  float2 v2 = 0.0f;
+  int b = 0;
+  int const x_46 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_48 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  A.arr[x_46] = x_48;
+  int const x_51 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_53 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  A.arr[x_51] = x_53;
+  int const x_56 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  i = x_56;
+  while (true) {
+    int const x_61 = i;
+    int const x_63 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    if ((x_61 > x_63)) {
+    } else {
+      break;
+    }
+    int const x_66 = i;
+    i = (x_66 - 1);
+  }
+  float const x_69 = x_10.x_GLF_uniform_float_values.arr[1].el;
+  float const x_71 = x_10.x_GLF_uniform_float_values.arr[1].el;
+  int const x_73 = i;
+  int const x_76 = A.arr[select(x_73, 1, (x_69 >= x_71))];
+  a = x_76;
+  int const x_78 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_80 = a;
+  int const x_84 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_87 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  float const x_91 = x_10.x_GLF_uniform_float_values.arr[1].el;
+  float const x_93 = x_10.x_GLF_uniform_float_values.arr[0].el;
+  v1 = select(float2(float(x_78), float(x_80)), float2(float(x_84), float(x_87)), bool2((x_91 < x_93), true));
+  int const x_98 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  float const x_100 = v1[x_98];
+  int const x_103 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  float const x_105 = v1[x_103];
+  v2 = select(float2(x_100, x_100), float2(x_105, x_105), bool2(false, false));
+  int const x_109 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  float const x_110 = float(x_109);
+  int const x_113 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  float const x_114 = float(x_113);
+  float2 const x_116 = v2;
+  int const x_121 = A.arr[int(clamp(float2(x_110, x_110), float2(x_114, x_114), x_116).x)];
+  b = x_121;
+  int const x_122 = b;
+  int const x_124 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_122 == x_124)) {
+    int const x_130 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_133 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_136 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_139 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_130), float(x_133), float(x_136), float(x_139));
+  } else {
+    int const x_143 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    float const x_144 = float(x_143);
+    *(tint_symbol_4) = float4(x_144, x_144, x_144, x_144);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_10 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-mix-mix-clamp/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-mix-mix-clamp/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..8b6f4d4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-mix-mix-clamp/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,239 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 166
+; Schema: 0
+               OpCapability Shader
+        %124 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %A "A"
+               OpName %i "i"
+               OpName %a "a"
+               OpName %v1 "v1"
+               OpName %v2 "v2"
+               OpName %b "b"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %float = OpTypeFloat 32
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+%_ptr_Function__arr_int_uint_2 = OpTypePointer Function %_arr_int_uint_2
+         %27 = OpConstantNull %_arr_int_uint_2
+%_ptr_Function_int = OpTypePointer Function %int
+         %30 = OpConstantNull %int
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %35 = OpConstantNull %v2float
+     %uint_0 = OpConstant %uint 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %v2bool = OpTypeVector %bool 2
+       %true = OpConstantTrue %bool
+%_ptr_Function_float = OpTypePointer Function %float
+      %false = OpConstantFalse %bool
+        %112 = OpConstantComposite %v2bool %false %false
+   %main_out = OpTypeStruct %v4float
+        %154 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+          %A = OpVariable %_ptr_Function__arr_int_uint_2 Function %27
+          %i = OpVariable %_ptr_Function_int Function %30
+          %a = OpVariable %_ptr_Function_int Function %30
+         %v1 = OpVariable %_ptr_Function_v2float Function %35
+         %v2 = OpVariable %_ptr_Function_v2float Function %35
+          %b = OpVariable %_ptr_Function_int Function %30
+         %41 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %42 = OpLoad %int %41
+         %44 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %45 = OpLoad %int %44
+         %46 = OpAccessChain %_ptr_Function_int %A %42
+               OpStore %46 %45
+         %47 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %48 = OpLoad %int %47
+         %50 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %51 = OpLoad %int %50
+         %52 = OpAccessChain %_ptr_Function_int %A %48
+               OpStore %52 %51
+         %53 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %54 = OpLoad %int %53
+               OpStore %i %54
+               OpBranch %55
+         %55 = OpLabel
+               OpLoopMerge %56 %57 None
+               OpBranch %58
+         %58 = OpLabel
+         %59 = OpLoad %int %i
+         %60 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %61 = OpLoad %int %60
+         %62 = OpSGreaterThan %bool %59 %61
+               OpSelectionMerge %64 None
+               OpBranchConditional %62 %65 %66
+         %65 = OpLabel
+               OpBranch %64
+         %66 = OpLabel
+               OpBranch %56
+         %64 = OpLabel
+         %67 = OpLoad %int %i
+         %68 = OpISub %int %67 %int_1
+               OpStore %i %68
+               OpBranch %57
+         %57 = OpLabel
+               OpBranch %55
+         %56 = OpLabel
+         %70 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_1
+         %71 = OpLoad %float %70
+         %72 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_1
+         %73 = OpLoad %float %72
+         %74 = OpLoad %int %i
+         %76 = OpFOrdGreaterThanEqual %bool %71 %73
+         %75 = OpSelect %int %76 %int_1 %74
+         %77 = OpAccessChain %_ptr_Function_int %A %75
+         %78 = OpLoad %int %77
+               OpStore %a %78
+         %79 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %80 = OpLoad %int %79
+         %81 = OpLoad %int %a
+         %82 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %83 = OpLoad %int %82
+         %84 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %85 = OpLoad %int %84
+         %86 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_1
+         %87 = OpLoad %float %86
+         %88 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_0
+         %89 = OpLoad %float %88
+         %92 = OpFOrdLessThan %bool %87 %89
+         %94 = OpCompositeConstruct %v2bool %92 %true
+         %95 = OpConvertSToF %float %83
+         %96 = OpConvertSToF %float %85
+         %97 = OpCompositeConstruct %v2float %95 %96
+         %98 = OpConvertSToF %float %80
+         %99 = OpConvertSToF %float %81
+        %100 = OpCompositeConstruct %v2float %98 %99
+         %90 = OpSelect %v2float %94 %97 %100
+               OpStore %v1 %90
+        %101 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %102 = OpLoad %int %101
+        %104 = OpAccessChain %_ptr_Function_float %v1 %102
+        %105 = OpLoad %float %104
+        %106 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %107 = OpLoad %int %106
+        %108 = OpAccessChain %_ptr_Function_float %v1 %107
+        %109 = OpLoad %float %108
+        %113 = OpCompositeConstruct %v2float %109 %109
+        %114 = OpCompositeConstruct %v2float %105 %105
+        %110 = OpSelect %v2float %112 %113 %114
+               OpStore %v2 %110
+        %115 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %116 = OpLoad %int %115
+        %117 = OpConvertSToF %float %116
+        %118 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %119 = OpLoad %int %118
+        %120 = OpConvertSToF %float %119
+        %121 = OpLoad %v2float %v2
+        %125 = OpCompositeConstruct %v2float %117 %117
+        %126 = OpCompositeConstruct %v2float %120 %120
+        %123 = OpExtInst %v2float %124 NClamp %125 %126 %121
+        %127 = OpCompositeExtract %float %123 0
+        %122 = OpConvertFToS %int %127
+        %128 = OpAccessChain %_ptr_Function_int %A %122
+        %129 = OpLoad %int %128
+               OpStore %b %129
+        %130 = OpLoad %int %b
+        %131 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %132 = OpLoad %int %131
+        %133 = OpIEqual %bool %130 %132
+               OpSelectionMerge %134 None
+               OpBranchConditional %133 %135 %136
+        %135 = OpLabel
+        %137 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %138 = OpLoad %int %137
+        %139 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %140 = OpLoad %int %139
+        %141 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %142 = OpLoad %int %141
+        %143 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %144 = OpLoad %int %143
+        %145 = OpConvertSToF %float %138
+        %146 = OpConvertSToF %float %140
+        %147 = OpConvertSToF %float %142
+        %148 = OpConvertSToF %float %144
+        %149 = OpCompositeConstruct %v4float %145 %146 %147 %148
+               OpStore %x_GLF_color %149
+               OpBranch %134
+        %136 = OpLabel
+        %150 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %151 = OpLoad %int %150
+        %152 = OpConvertSToF %float %151
+        %153 = OpCompositeConstruct %v4float %152 %152 %152 %152
+               OpStore %x_GLF_color %153
+               OpBranch %134
+        %134 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %154
+%tint_symbol = OpFunctionParameter %main_out
+        %158 = OpLabel
+        %159 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %159
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %161 = OpLabel
+        %162 = OpFunctionCall %void %main_1
+        %164 = OpLoad %v4float %x_GLF_color
+        %165 = OpCompositeConstruct %main_out %164
+        %163 = OpFunctionCall %void %tint_symbol_2 %165
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-mix-mix-clamp/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-mix-mix-clamp/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..591926d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-shifts-mix-mix-clamp/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,95 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var A : array<i32, 2>;
+  var i : i32;
+  var a : i32;
+  var v1 : vec2<f32>;
+  var v2 : vec2<f32>;
+  var b : i32;
+  let x_46 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_48 : i32 = x_6.x_GLF_uniform_int_values[0];
+  A[x_46] = x_48;
+  let x_51 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_53 : i32 = x_6.x_GLF_uniform_int_values[1];
+  A[x_51] = x_53;
+  let x_56 : i32 = x_6.x_GLF_uniform_int_values[0];
+  i = x_56;
+  loop {
+    let x_61 : i32 = i;
+    let x_63 : i32 = x_6.x_GLF_uniform_int_values[2];
+    if ((x_61 > x_63)) {
+    } else {
+      break;
+    }
+    let x_66 : i32 = i;
+    i = (x_66 - 1);
+  }
+  let x_69 : f32 = x_10.x_GLF_uniform_float_values[1];
+  let x_71 : f32 = x_10.x_GLF_uniform_float_values[1];
+  let x_73 : i32 = i;
+  let x_76 : i32 = A[select(x_73, 1, (x_69 >= x_71))];
+  a = x_76;
+  let x_78 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_80 : i32 = a;
+  let x_84 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_87 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_91 : f32 = x_10.x_GLF_uniform_float_values[1];
+  let x_93 : f32 = x_10.x_GLF_uniform_float_values[0];
+  v1 = select(vec2<f32>(f32(x_78), f32(x_80)), vec2<f32>(f32(x_84), f32(x_87)), vec2<bool>((x_91 < x_93), true));
+  let x_98 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_100 : f32 = v1[x_98];
+  let x_103 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_105 : f32 = v1[x_103];
+  v2 = select(vec2<f32>(x_100, x_100), vec2<f32>(x_105, x_105), vec2<bool>(false, false));
+  let x_109 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_110 : f32 = f32(x_109);
+  let x_113 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_114 : f32 = f32(x_113);
+  let x_116 : vec2<f32> = v2;
+  let x_121 : i32 = A[i32(clamp(vec2<f32>(x_110, x_110), vec2<f32>(x_114, x_114), x_116).x)];
+  b = x_121;
+  let x_122 : i32 = b;
+  let x_124 : i32 = x_6.x_GLF_uniform_int_values[1];
+  if ((x_122 == x_124)) {
+    let x_130 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_133 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_136 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_139 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_130), f32(x_133), f32(x_136), f32(x_139));
+  } else {
+    let x_143 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_144 : f32 = f32(x_143);
+    x_GLF_color = vec4<f32>(x_144, x_144, x_144, x_144);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-pack-unpack/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-pack-unpack/0-opt.spvasm
new file mode 100644
index 0000000..bf2e7c3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-pack-unpack/0-opt.spvasm
@@ -0,0 +1,170 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %v1 "v1"
+               OpName %E "E"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+    %float_1 = OpConstant %float 1
+         %20 = OpConstantComposite %v2float %float_1 %float_1
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%_ptr_Function_float = OpTypePointer Function %float
+%float_0_00999999978 = OpConstant %float 0.00999999978
+       %bool = OpTypeBool
+        %int = OpTypeInt 32 1
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf1 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf0 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %14
+         %38 = OpLabel
+          %a = OpVariable %_ptr_Function_uint Function
+         %v1 = OpVariable %_ptr_Function_v4float Function
+          %E = OpVariable %_ptr_Function_float Function
+         %39 = OpExtInst %uint %1 PackHalf2x16 %20
+               OpStore %a %39
+         %40 = OpLoad %uint %a
+         %41 = OpExtInst %v4float %1 UnpackSnorm4x8 %40
+               OpStore %v1 %41
+               OpStore %E %float_0_00999999978
+         %42 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %43 = OpLoad %int %42
+         %44 = OpAccessChain %_ptr_Function_float %v1 %43
+         %45 = OpLoad %float %44
+         %46 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %47 = OpLoad %float %46
+         %48 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_1
+         %49 = OpLoad %float %48
+         %50 = OpFDiv %float %47 %49
+         %51 = OpFSub %float %45 %50
+         %52 = OpExtInst %float %1 FAbs %51
+         %53 = OpLoad %float %E
+         %54 = OpFOrdLessThan %bool %52 %53
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %55
+         %56 = OpLabel
+         %57 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %58 = OpLoad %int %57
+         %59 = OpAccessChain %_ptr_Function_float %v1 %58
+         %60 = OpLoad %float %59
+         %61 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_2
+         %62 = OpLoad %float %61
+         %63 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_1
+         %64 = OpLoad %float %63
+         %65 = OpFDiv %float %62 %64
+         %66 = OpFSub %float %60 %65
+         %67 = OpExtInst %float %1 FAbs %66
+         %68 = OpLoad %float %E
+         %69 = OpFOrdLessThan %bool %67 %68
+               OpBranch %55
+         %55 = OpLabel
+         %70 = OpPhi %bool %54 %38 %69 %56
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %71
+         %72 = OpLabel
+         %73 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %74 = OpLoad %int %73
+         %75 = OpAccessChain %_ptr_Function_float %v1 %74
+         %76 = OpLoad %float %75
+         %77 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %78 = OpLoad %float %77
+         %79 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_1
+         %80 = OpLoad %float %79
+         %81 = OpFDiv %float %78 %80
+         %82 = OpFSub %float %76 %81
+         %83 = OpExtInst %float %1 FAbs %82
+         %84 = OpLoad %float %E
+         %85 = OpFOrdLessThan %bool %83 %84
+               OpBranch %71
+         %71 = OpLabel
+         %86 = OpPhi %bool %70 %55 %85 %72
+               OpSelectionMerge %87 None
+               OpBranchConditional %86 %88 %87
+         %88 = OpLabel
+         %89 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %90 = OpLoad %int %89
+         %91 = OpAccessChain %_ptr_Function_float %v1 %90
+         %92 = OpLoad %float %91
+         %93 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_2
+         %94 = OpLoad %float %93
+         %95 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_1
+         %96 = OpLoad %float %95
+         %97 = OpFDiv %float %94 %96
+         %98 = OpFSub %float %92 %97
+         %99 = OpExtInst %float %1 FAbs %98
+        %100 = OpLoad %float %E
+        %101 = OpFOrdLessThan %bool %99 %100
+               OpBranch %87
+         %87 = OpLabel
+        %102 = OpPhi %bool %86 %71 %101 %88
+               OpSelectionMerge %103 None
+               OpBranchConditional %102 %104 %105
+        %104 = OpLabel
+        %106 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+        %107 = OpLoad %int %106
+        %108 = OpConvertSToF %float %107
+        %109 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+        %110 = OpLoad %int %109
+        %111 = OpConvertSToF %float %110
+        %112 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+        %113 = OpLoad %int %112
+        %114 = OpConvertSToF %float %113
+        %115 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+        %116 = OpLoad %int %115
+        %117 = OpConvertSToF %float %116
+        %118 = OpCompositeConstruct %v4float %108 %111 %114 %117
+               OpStore %_GLF_color %118
+               OpBranch %103
+        %105 = OpLabel
+        %119 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+        %120 = OpLoad %int %119
+        %121 = OpAccessChain %_ptr_Function_float %v1 %120
+        %122 = OpLoad %float %121
+        %123 = OpCompositeConstruct %v4float %122 %122 %122 %122
+               OpStore %_GLF_color %123
+               OpBranch %103
+        %103 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-pack-unpack/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-pack-unpack/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..4388213
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-pack-unpack/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,98 @@
+uint tint_pack2x16float(float2 param_0) {
+  uint2 i = f32tof16(param_0);
+  return i.x | (i.y << 16);
+}
+
+float4 tint_unpack4x8snorm(uint param_0) {
+  int j = int(param_0);
+  int4 i = int4(j << 24, j << 16, j << 8, j) >> 24;
+  return clamp(float4(i) / 127.0, -1.0, 1.0);
+}
+
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[4];
+};
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  uint a = 0u;
+  float4 v1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float E = 0.0f;
+  bool x_69 = false;
+  bool x_85 = false;
+  bool x_101 = false;
+  bool x_70_phi = false;
+  bool x_86_phi = false;
+  bool x_102_phi = false;
+  a = tint_pack2x16float(float2(1.0f, 1.0f));
+  v1 = tint_unpack4x8snorm(a);
+  E = 0.01f;
+  const int x_43 = asint(x_8[1].x);
+  const float x_45 = v1[x_43];
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_47 = asfloat(x_10[scalar_offset / 4][scalar_offset % 4]);
+  const float x_49 = asfloat(x_10[1].x);
+  const bool x_54 = (abs((x_45 - (x_47 / x_49))) < E);
+  x_70_phi = x_54;
+  if (x_54) {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_58 = asint(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const float x_60 = v1[x_58];
+    const float x_62 = asfloat(x_10[2].x);
+    const float x_64 = asfloat(x_10[1].x);
+    x_69 = (abs((x_60 - (x_62 / x_64))) < E);
+    x_70_phi = x_69;
+  }
+  const bool x_70 = x_70_phi;
+  x_86_phi = x_70;
+  if (x_70) {
+    const int x_74 = asint(x_8[2].x);
+    const float x_76 = v1[x_74];
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const float x_78 = asfloat(x_10[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const float x_80 = asfloat(x_10[1].x);
+    x_85 = (abs((x_76 - (x_78 / x_80))) < E);
+    x_86_phi = x_85;
+  }
+  const bool x_86 = x_86_phi;
+  x_102_phi = x_86;
+  if (x_86) {
+    const int x_90 = asint(x_8[3].x);
+    const float x_92 = v1[x_90];
+    const float x_94 = asfloat(x_10[2].x);
+    const float x_96 = asfloat(x_10[1].x);
+    x_101 = (abs((x_92 - (x_94 / x_96))) < E);
+    x_102_phi = x_101;
+  }
+  if (x_102_phi) {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_107 = asint(x_8[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const int x_110 = asint(x_8[1].x);
+    const int x_113 = asint(x_8[1].x);
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_116 = asint(x_8[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    x_GLF_color = float4(float(x_107), float(x_110), float(x_113), float(x_116));
+  } else {
+    const int x_120 = asint(x_8[1].x);
+    const float x_122 = v1[x_120];
+    x_GLF_color = float4(x_122, x_122, x_122, x_122);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-pack-unpack/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-pack-unpack/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..e8a5aea
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-pack-unpack/0-opt.spvasm.expected.msl
@@ -0,0 +1,105 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_8, constant buf0& x_10, thread float4* const tint_symbol_4) {
+  uint a = 0u;
+  float4 v1 = 0.0f;
+  float E = 0.0f;
+  bool x_69 = false;
+  bool x_85 = false;
+  bool x_101 = false;
+  bool x_70_phi = false;
+  bool x_86_phi = false;
+  bool x_102_phi = false;
+  a = as_type<uint>(half2(float2(1.0f, 1.0f)));
+  uint const x_40 = a;
+  v1 = unpack_snorm4x8_to_float(x_40);
+  E = 0.01f;
+  int const x_43 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  float const x_45 = v1[x_43];
+  float const x_47 = x_10.x_GLF_uniform_float_values.arr[0].el;
+  float const x_49 = x_10.x_GLF_uniform_float_values.arr[1].el;
+  float const x_53 = E;
+  bool const x_54 = (fabs((x_45 - (x_47 / x_49))) < x_53);
+  x_70_phi = x_54;
+  if (x_54) {
+    int const x_58 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    float const x_60 = v1[x_58];
+    float const x_62 = x_10.x_GLF_uniform_float_values.arr[2].el;
+    float const x_64 = x_10.x_GLF_uniform_float_values.arr[1].el;
+    float const x_68 = E;
+    x_69 = (fabs((x_60 - (x_62 / x_64))) < x_68);
+    x_70_phi = x_69;
+  }
+  bool const x_70 = x_70_phi;
+  x_86_phi = x_70;
+  if (x_70) {
+    int const x_74 = x_8.x_GLF_uniform_int_values.arr[2].el;
+    float const x_76 = v1[x_74];
+    float const x_78 = x_10.x_GLF_uniform_float_values.arr[0].el;
+    float const x_80 = x_10.x_GLF_uniform_float_values.arr[1].el;
+    float const x_84 = E;
+    x_85 = (fabs((x_76 - (x_78 / x_80))) < x_84);
+    x_86_phi = x_85;
+  }
+  bool const x_86 = x_86_phi;
+  x_102_phi = x_86;
+  if (x_86) {
+    int const x_90 = x_8.x_GLF_uniform_int_values.arr[3].el;
+    float const x_92 = v1[x_90];
+    float const x_94 = x_10.x_GLF_uniform_float_values.arr[2].el;
+    float const x_96 = x_10.x_GLF_uniform_float_values.arr[1].el;
+    float const x_100 = E;
+    x_101 = (fabs((x_92 - (x_94 / x_96))) < x_100);
+    x_102_phi = x_101;
+  }
+  bool const x_102 = x_102_phi;
+  if (x_102) {
+    int const x_107 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    int const x_110 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    int const x_113 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    int const x_116 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_107), float(x_110), float(x_113), float(x_116));
+  } else {
+    int const x_120 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    float const x_122 = v1[x_120];
+    *(tint_symbol_4) = float4(x_122, x_122, x_122, x_122);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_8 [[buffer(1)]], constant buf0& x_10 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_8, x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-pack-unpack/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-pack-unpack/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..635a181
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-pack-unpack/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,232 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 153
+; Schema: 0
+               OpCapability Shader
+         %42 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_8 "x_8"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %v1 "v1"
+               OpName %E "E"
+               OpName %x_69 "x_69"
+               OpName %x_85 "x_85"
+               OpName %x_101 "x_101"
+               OpName %x_70_phi "x_70_phi"
+               OpName %x_86_phi "x_86_phi"
+               OpName %x_102_phi "x_102_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf1 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %float = OpTypeFloat 32
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf0 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_uint = OpTypePointer Function %uint
+         %26 = OpConstantNull %uint
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%_ptr_Function_float = OpTypePointer Function %float
+         %31 = OpConstantNull %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %35 = OpConstantNull %bool
+    %v2float = OpTypeVector %float 2
+    %float_1 = OpConstant %float 1
+         %45 = OpConstantComposite %v2float %float_1 %float_1
+%float_0_00999999978 = OpConstant %float 0.00999999978
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+   %main_out = OpTypeStruct %v4float
+        %141 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+          %a = OpVariable %_ptr_Function_uint Function %26
+         %v1 = OpVariable %_ptr_Function_v4float Function %17
+          %E = OpVariable %_ptr_Function_float Function %31
+       %x_69 = OpVariable %_ptr_Function_bool Function %35
+       %x_85 = OpVariable %_ptr_Function_bool Function %35
+      %x_101 = OpVariable %_ptr_Function_bool Function %35
+   %x_70_phi = OpVariable %_ptr_Function_bool Function %35
+   %x_86_phi = OpVariable %_ptr_Function_bool Function %35
+  %x_102_phi = OpVariable %_ptr_Function_bool Function %35
+         %41 = OpExtInst %uint %42 PackHalf2x16 %45
+               OpStore %a %41
+         %46 = OpLoad %uint %a
+         %47 = OpExtInst %v4float %42 UnpackSnorm4x8 %46
+               OpStore %v1 %47
+               OpStore %E %float_0_00999999978
+         %52 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %53 = OpLoad %int %52
+         %54 = OpAccessChain %_ptr_Function_float %v1 %53
+         %55 = OpLoad %float %54
+         %58 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_0
+         %59 = OpLoad %float %58
+         %60 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_1
+         %61 = OpLoad %float %60
+         %62 = OpLoad %float %E
+         %64 = OpFDiv %float %59 %61
+         %65 = OpFSub %float %55 %64
+         %63 = OpExtInst %float %42 FAbs %65
+         %66 = OpFOrdLessThan %bool %63 %62
+               OpStore %x_70_phi %66
+               OpSelectionMerge %67 None
+               OpBranchConditional %66 %68 %67
+         %68 = OpLabel
+         %69 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %70 = OpLoad %int %69
+         %71 = OpAccessChain %_ptr_Function_float %v1 %70
+         %72 = OpLoad %float %71
+         %74 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_2
+         %75 = OpLoad %float %74
+         %76 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_1
+         %77 = OpLoad %float %76
+         %78 = OpLoad %float %E
+         %80 = OpFDiv %float %75 %77
+         %81 = OpFSub %float %72 %80
+         %79 = OpExtInst %float %42 FAbs %81
+         %82 = OpFOrdLessThan %bool %79 %78
+               OpStore %x_69 %82
+         %83 = OpLoad %bool %x_69
+               OpStore %x_70_phi %83
+               OpBranch %67
+         %67 = OpLabel
+         %84 = OpLoad %bool %x_70_phi
+               OpStore %x_86_phi %84
+               OpSelectionMerge %85 None
+               OpBranchConditional %84 %86 %85
+         %86 = OpLabel
+         %87 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+         %88 = OpLoad %int %87
+         %89 = OpAccessChain %_ptr_Function_float %v1 %88
+         %90 = OpLoad %float %89
+         %91 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_0
+         %92 = OpLoad %float %91
+         %93 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_1
+         %94 = OpLoad %float %93
+         %95 = OpLoad %float %E
+         %97 = OpFDiv %float %92 %94
+         %98 = OpFSub %float %90 %97
+         %96 = OpExtInst %float %42 FAbs %98
+         %99 = OpFOrdLessThan %bool %96 %95
+               OpStore %x_85 %99
+        %100 = OpLoad %bool %x_85
+               OpStore %x_86_phi %100
+               OpBranch %85
+         %85 = OpLabel
+        %101 = OpLoad %bool %x_86_phi
+               OpStore %x_102_phi %101
+               OpSelectionMerge %102 None
+               OpBranchConditional %101 %103 %102
+        %103 = OpLabel
+        %105 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_3
+        %106 = OpLoad %int %105
+        %107 = OpAccessChain %_ptr_Function_float %v1 %106
+        %108 = OpLoad %float %107
+        %109 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_2
+        %110 = OpLoad %float %109
+        %111 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_1
+        %112 = OpLoad %float %111
+        %113 = OpLoad %float %E
+        %115 = OpFDiv %float %110 %112
+        %116 = OpFSub %float %108 %115
+        %114 = OpExtInst %float %42 FAbs %116
+        %117 = OpFOrdLessThan %bool %114 %113
+               OpStore %x_101 %117
+        %118 = OpLoad %bool %x_101
+               OpStore %x_102_phi %118
+               OpBranch %102
+        %102 = OpLabel
+        %119 = OpLoad %bool %x_102_phi
+               OpSelectionMerge %120 None
+               OpBranchConditional %119 %121 %122
+        %121 = OpLabel
+        %123 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+        %124 = OpLoad %int %123
+        %125 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+        %126 = OpLoad %int %125
+        %127 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+        %128 = OpLoad %int %127
+        %129 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+        %130 = OpLoad %int %129
+        %131 = OpConvertSToF %float %124
+        %132 = OpConvertSToF %float %126
+        %133 = OpConvertSToF %float %128
+        %134 = OpConvertSToF %float %130
+        %135 = OpCompositeConstruct %v4float %131 %132 %133 %134
+               OpStore %x_GLF_color %135
+               OpBranch %120
+        %122 = OpLabel
+        %136 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+        %137 = OpLoad %int %136
+        %138 = OpAccessChain %_ptr_Function_float %v1 %137
+        %139 = OpLoad %float %138
+        %140 = OpCompositeConstruct %v4float %139 %139 %139 %139
+               OpStore %x_GLF_color %140
+               OpBranch %120
+        %120 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %141
+%tint_symbol = OpFunctionParameter %main_out
+        %145 = OpLabel
+        %146 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %146
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %148 = OpLabel
+        %149 = OpFunctionCall %void %main_1
+        %151 = OpLoad %v4float %x_GLF_color
+        %152 = OpCompositeConstruct %main_out %151
+        %150 = OpFunctionCall %void %tint_symbol_2 %152
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-pack-unpack/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-pack-unpack/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..c893e13
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-pack-unpack/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,97 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : u32;
+  var v1 : vec4<f32>;
+  var E : f32;
+  var x_69 : bool;
+  var x_85 : bool;
+  var x_101 : bool;
+  var x_70_phi : bool;
+  var x_86_phi : bool;
+  var x_102_phi : bool;
+  a = pack2x16float(vec2<f32>(1.0, 1.0));
+  let x_40 : u32 = a;
+  v1 = unpack4x8snorm(x_40);
+  E = 0.01;
+  let x_43 : i32 = x_8.x_GLF_uniform_int_values[1];
+  let x_45 : f32 = v1[x_43];
+  let x_47 : f32 = x_10.x_GLF_uniform_float_values[0];
+  let x_49 : f32 = x_10.x_GLF_uniform_float_values[1];
+  let x_53 : f32 = E;
+  let x_54 : bool = (abs((x_45 - (x_47 / x_49))) < x_53);
+  x_70_phi = x_54;
+  if (x_54) {
+    let x_58 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_60 : f32 = v1[x_58];
+    let x_62 : f32 = x_10.x_GLF_uniform_float_values[2];
+    let x_64 : f32 = x_10.x_GLF_uniform_float_values[1];
+    let x_68 : f32 = E;
+    x_69 = (abs((x_60 - (x_62 / x_64))) < x_68);
+    x_70_phi = x_69;
+  }
+  let x_70 : bool = x_70_phi;
+  x_86_phi = x_70;
+  if (x_70) {
+    let x_74 : i32 = x_8.x_GLF_uniform_int_values[2];
+    let x_76 : f32 = v1[x_74];
+    let x_78 : f32 = x_10.x_GLF_uniform_float_values[0];
+    let x_80 : f32 = x_10.x_GLF_uniform_float_values[1];
+    let x_84 : f32 = E;
+    x_85 = (abs((x_76 - (x_78 / x_80))) < x_84);
+    x_86_phi = x_85;
+  }
+  let x_86 : bool = x_86_phi;
+  x_102_phi = x_86;
+  if (x_86) {
+    let x_90 : i32 = x_8.x_GLF_uniform_int_values[3];
+    let x_92 : f32 = v1[x_90];
+    let x_94 : f32 = x_10.x_GLF_uniform_float_values[2];
+    let x_96 : f32 = x_10.x_GLF_uniform_float_values[1];
+    let x_100 : f32 = E;
+    x_101 = (abs((x_92 - (x_94 / x_96))) < x_100);
+    x_102_phi = x_101;
+  }
+  let x_102 : bool = x_102_phi;
+  if (x_102) {
+    let x_107 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_110 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_113 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_116 : i32 = x_8.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_107), f32(x_110), f32(x_113), f32(x_116));
+  } else {
+    let x_120 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_122 : f32 = v1[x_120];
+    x_GLF_color = vec4<f32>(x_122, x_122, x_122, x_122);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-pack-unpack/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-pack-unpack/0-opt.wgsl
new file mode 100644
index 0000000..c893e13
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-pack-unpack/0-opt.wgsl
@@ -0,0 +1,97 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : u32;
+  var v1 : vec4<f32>;
+  var E : f32;
+  var x_69 : bool;
+  var x_85 : bool;
+  var x_101 : bool;
+  var x_70_phi : bool;
+  var x_86_phi : bool;
+  var x_102_phi : bool;
+  a = pack2x16float(vec2<f32>(1.0, 1.0));
+  let x_40 : u32 = a;
+  v1 = unpack4x8snorm(x_40);
+  E = 0.01;
+  let x_43 : i32 = x_8.x_GLF_uniform_int_values[1];
+  let x_45 : f32 = v1[x_43];
+  let x_47 : f32 = x_10.x_GLF_uniform_float_values[0];
+  let x_49 : f32 = x_10.x_GLF_uniform_float_values[1];
+  let x_53 : f32 = E;
+  let x_54 : bool = (abs((x_45 - (x_47 / x_49))) < x_53);
+  x_70_phi = x_54;
+  if (x_54) {
+    let x_58 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_60 : f32 = v1[x_58];
+    let x_62 : f32 = x_10.x_GLF_uniform_float_values[2];
+    let x_64 : f32 = x_10.x_GLF_uniform_float_values[1];
+    let x_68 : f32 = E;
+    x_69 = (abs((x_60 - (x_62 / x_64))) < x_68);
+    x_70_phi = x_69;
+  }
+  let x_70 : bool = x_70_phi;
+  x_86_phi = x_70;
+  if (x_70) {
+    let x_74 : i32 = x_8.x_GLF_uniform_int_values[2];
+    let x_76 : f32 = v1[x_74];
+    let x_78 : f32 = x_10.x_GLF_uniform_float_values[0];
+    let x_80 : f32 = x_10.x_GLF_uniform_float_values[1];
+    let x_84 : f32 = E;
+    x_85 = (abs((x_76 - (x_78 / x_80))) < x_84);
+    x_86_phi = x_85;
+  }
+  let x_86 : bool = x_86_phi;
+  x_102_phi = x_86;
+  if (x_86) {
+    let x_90 : i32 = x_8.x_GLF_uniform_int_values[3];
+    let x_92 : f32 = v1[x_90];
+    let x_94 : f32 = x_10.x_GLF_uniform_float_values[2];
+    let x_96 : f32 = x_10.x_GLF_uniform_float_values[1];
+    let x_100 : f32 = E;
+    x_101 = (abs((x_92 - (x_94 / x_96))) < x_100);
+    x_102_phi = x_101;
+  }
+  let x_102 : bool = x_102_phi;
+  if (x_102) {
+    let x_107 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_110 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_113 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_116 : i32 = x_8.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_107), f32(x_110), f32(x_113), f32(x_116));
+  } else {
+    let x_120 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_122 : f32 = v1[x_120];
+    x_GLF_color = vec4<f32>(x_122, x_122, x_122, x_122);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-pack-unpack/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-pack-unpack/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..4388213
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-pack-unpack/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,98 @@
+uint tint_pack2x16float(float2 param_0) {
+  uint2 i = f32tof16(param_0);
+  return i.x | (i.y << 16);
+}
+
+float4 tint_unpack4x8snorm(uint param_0) {
+  int j = int(param_0);
+  int4 i = int4(j << 24, j << 16, j << 8, j) >> 24;
+  return clamp(float4(i) / 127.0, -1.0, 1.0);
+}
+
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[4];
+};
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  uint a = 0u;
+  float4 v1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float E = 0.0f;
+  bool x_69 = false;
+  bool x_85 = false;
+  bool x_101 = false;
+  bool x_70_phi = false;
+  bool x_86_phi = false;
+  bool x_102_phi = false;
+  a = tint_pack2x16float(float2(1.0f, 1.0f));
+  v1 = tint_unpack4x8snorm(a);
+  E = 0.01f;
+  const int x_43 = asint(x_8[1].x);
+  const float x_45 = v1[x_43];
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_47 = asfloat(x_10[scalar_offset / 4][scalar_offset % 4]);
+  const float x_49 = asfloat(x_10[1].x);
+  const bool x_54 = (abs((x_45 - (x_47 / x_49))) < E);
+  x_70_phi = x_54;
+  if (x_54) {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_58 = asint(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const float x_60 = v1[x_58];
+    const float x_62 = asfloat(x_10[2].x);
+    const float x_64 = asfloat(x_10[1].x);
+    x_69 = (abs((x_60 - (x_62 / x_64))) < E);
+    x_70_phi = x_69;
+  }
+  const bool x_70 = x_70_phi;
+  x_86_phi = x_70;
+  if (x_70) {
+    const int x_74 = asint(x_8[2].x);
+    const float x_76 = v1[x_74];
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const float x_78 = asfloat(x_10[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const float x_80 = asfloat(x_10[1].x);
+    x_85 = (abs((x_76 - (x_78 / x_80))) < E);
+    x_86_phi = x_85;
+  }
+  const bool x_86 = x_86_phi;
+  x_102_phi = x_86;
+  if (x_86) {
+    const int x_90 = asint(x_8[3].x);
+    const float x_92 = v1[x_90];
+    const float x_94 = asfloat(x_10[2].x);
+    const float x_96 = asfloat(x_10[1].x);
+    x_101 = (abs((x_92 - (x_94 / x_96))) < E);
+    x_102_phi = x_101;
+  }
+  if (x_102_phi) {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_107 = asint(x_8[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const int x_110 = asint(x_8[1].x);
+    const int x_113 = asint(x_8[1].x);
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_116 = asint(x_8[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    x_GLF_color = float4(float(x_107), float(x_110), float(x_113), float(x_116));
+  } else {
+    const int x_120 = asint(x_8[1].x);
+    const float x_122 = v1[x_120];
+    x_GLF_color = float4(x_122, x_122, x_122, x_122);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-pack-unpack/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-pack-unpack/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..e8a5aea
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-pack-unpack/0-opt.wgsl.expected.msl
@@ -0,0 +1,105 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_8, constant buf0& x_10, thread float4* const tint_symbol_4) {
+  uint a = 0u;
+  float4 v1 = 0.0f;
+  float E = 0.0f;
+  bool x_69 = false;
+  bool x_85 = false;
+  bool x_101 = false;
+  bool x_70_phi = false;
+  bool x_86_phi = false;
+  bool x_102_phi = false;
+  a = as_type<uint>(half2(float2(1.0f, 1.0f)));
+  uint const x_40 = a;
+  v1 = unpack_snorm4x8_to_float(x_40);
+  E = 0.01f;
+  int const x_43 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  float const x_45 = v1[x_43];
+  float const x_47 = x_10.x_GLF_uniform_float_values.arr[0].el;
+  float const x_49 = x_10.x_GLF_uniform_float_values.arr[1].el;
+  float const x_53 = E;
+  bool const x_54 = (fabs((x_45 - (x_47 / x_49))) < x_53);
+  x_70_phi = x_54;
+  if (x_54) {
+    int const x_58 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    float const x_60 = v1[x_58];
+    float const x_62 = x_10.x_GLF_uniform_float_values.arr[2].el;
+    float const x_64 = x_10.x_GLF_uniform_float_values.arr[1].el;
+    float const x_68 = E;
+    x_69 = (fabs((x_60 - (x_62 / x_64))) < x_68);
+    x_70_phi = x_69;
+  }
+  bool const x_70 = x_70_phi;
+  x_86_phi = x_70;
+  if (x_70) {
+    int const x_74 = x_8.x_GLF_uniform_int_values.arr[2].el;
+    float const x_76 = v1[x_74];
+    float const x_78 = x_10.x_GLF_uniform_float_values.arr[0].el;
+    float const x_80 = x_10.x_GLF_uniform_float_values.arr[1].el;
+    float const x_84 = E;
+    x_85 = (fabs((x_76 - (x_78 / x_80))) < x_84);
+    x_86_phi = x_85;
+  }
+  bool const x_86 = x_86_phi;
+  x_102_phi = x_86;
+  if (x_86) {
+    int const x_90 = x_8.x_GLF_uniform_int_values.arr[3].el;
+    float const x_92 = v1[x_90];
+    float const x_94 = x_10.x_GLF_uniform_float_values.arr[2].el;
+    float const x_96 = x_10.x_GLF_uniform_float_values.arr[1].el;
+    float const x_100 = E;
+    x_101 = (fabs((x_92 - (x_94 / x_96))) < x_100);
+    x_102_phi = x_101;
+  }
+  bool const x_102 = x_102_phi;
+  if (x_102) {
+    int const x_107 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    int const x_110 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    int const x_113 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    int const x_116 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_107), float(x_110), float(x_113), float(x_116));
+  } else {
+    int const x_120 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    float const x_122 = v1[x_120];
+    *(tint_symbol_4) = float4(x_122, x_122, x_122, x_122);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_8 [[buffer(1)]], constant buf0& x_10 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_8, x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-pack-unpack/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-pack-unpack/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..635a181
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-pack-unpack/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,232 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 153
+; Schema: 0
+               OpCapability Shader
+         %42 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_8 "x_8"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %v1 "v1"
+               OpName %E "E"
+               OpName %x_69 "x_69"
+               OpName %x_85 "x_85"
+               OpName %x_101 "x_101"
+               OpName %x_70_phi "x_70_phi"
+               OpName %x_86_phi "x_86_phi"
+               OpName %x_102_phi "x_102_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf1 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %float = OpTypeFloat 32
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf0 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_uint = OpTypePointer Function %uint
+         %26 = OpConstantNull %uint
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%_ptr_Function_float = OpTypePointer Function %float
+         %31 = OpConstantNull %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %35 = OpConstantNull %bool
+    %v2float = OpTypeVector %float 2
+    %float_1 = OpConstant %float 1
+         %45 = OpConstantComposite %v2float %float_1 %float_1
+%float_0_00999999978 = OpConstant %float 0.00999999978
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+   %main_out = OpTypeStruct %v4float
+        %141 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+          %a = OpVariable %_ptr_Function_uint Function %26
+         %v1 = OpVariable %_ptr_Function_v4float Function %17
+          %E = OpVariable %_ptr_Function_float Function %31
+       %x_69 = OpVariable %_ptr_Function_bool Function %35
+       %x_85 = OpVariable %_ptr_Function_bool Function %35
+      %x_101 = OpVariable %_ptr_Function_bool Function %35
+   %x_70_phi = OpVariable %_ptr_Function_bool Function %35
+   %x_86_phi = OpVariable %_ptr_Function_bool Function %35
+  %x_102_phi = OpVariable %_ptr_Function_bool Function %35
+         %41 = OpExtInst %uint %42 PackHalf2x16 %45
+               OpStore %a %41
+         %46 = OpLoad %uint %a
+         %47 = OpExtInst %v4float %42 UnpackSnorm4x8 %46
+               OpStore %v1 %47
+               OpStore %E %float_0_00999999978
+         %52 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %53 = OpLoad %int %52
+         %54 = OpAccessChain %_ptr_Function_float %v1 %53
+         %55 = OpLoad %float %54
+         %58 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_0
+         %59 = OpLoad %float %58
+         %60 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_1
+         %61 = OpLoad %float %60
+         %62 = OpLoad %float %E
+         %64 = OpFDiv %float %59 %61
+         %65 = OpFSub %float %55 %64
+         %63 = OpExtInst %float %42 FAbs %65
+         %66 = OpFOrdLessThan %bool %63 %62
+               OpStore %x_70_phi %66
+               OpSelectionMerge %67 None
+               OpBranchConditional %66 %68 %67
+         %68 = OpLabel
+         %69 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %70 = OpLoad %int %69
+         %71 = OpAccessChain %_ptr_Function_float %v1 %70
+         %72 = OpLoad %float %71
+         %74 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_2
+         %75 = OpLoad %float %74
+         %76 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_1
+         %77 = OpLoad %float %76
+         %78 = OpLoad %float %E
+         %80 = OpFDiv %float %75 %77
+         %81 = OpFSub %float %72 %80
+         %79 = OpExtInst %float %42 FAbs %81
+         %82 = OpFOrdLessThan %bool %79 %78
+               OpStore %x_69 %82
+         %83 = OpLoad %bool %x_69
+               OpStore %x_70_phi %83
+               OpBranch %67
+         %67 = OpLabel
+         %84 = OpLoad %bool %x_70_phi
+               OpStore %x_86_phi %84
+               OpSelectionMerge %85 None
+               OpBranchConditional %84 %86 %85
+         %86 = OpLabel
+         %87 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+         %88 = OpLoad %int %87
+         %89 = OpAccessChain %_ptr_Function_float %v1 %88
+         %90 = OpLoad %float %89
+         %91 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_0
+         %92 = OpLoad %float %91
+         %93 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_1
+         %94 = OpLoad %float %93
+         %95 = OpLoad %float %E
+         %97 = OpFDiv %float %92 %94
+         %98 = OpFSub %float %90 %97
+         %96 = OpExtInst %float %42 FAbs %98
+         %99 = OpFOrdLessThan %bool %96 %95
+               OpStore %x_85 %99
+        %100 = OpLoad %bool %x_85
+               OpStore %x_86_phi %100
+               OpBranch %85
+         %85 = OpLabel
+        %101 = OpLoad %bool %x_86_phi
+               OpStore %x_102_phi %101
+               OpSelectionMerge %102 None
+               OpBranchConditional %101 %103 %102
+        %103 = OpLabel
+        %105 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_3
+        %106 = OpLoad %int %105
+        %107 = OpAccessChain %_ptr_Function_float %v1 %106
+        %108 = OpLoad %float %107
+        %109 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_2
+        %110 = OpLoad %float %109
+        %111 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_1
+        %112 = OpLoad %float %111
+        %113 = OpLoad %float %E
+        %115 = OpFDiv %float %110 %112
+        %116 = OpFSub %float %108 %115
+        %114 = OpExtInst %float %42 FAbs %116
+        %117 = OpFOrdLessThan %bool %114 %113
+               OpStore %x_101 %117
+        %118 = OpLoad %bool %x_101
+               OpStore %x_102_phi %118
+               OpBranch %102
+        %102 = OpLabel
+        %119 = OpLoad %bool %x_102_phi
+               OpSelectionMerge %120 None
+               OpBranchConditional %119 %121 %122
+        %121 = OpLabel
+        %123 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+        %124 = OpLoad %int %123
+        %125 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+        %126 = OpLoad %int %125
+        %127 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+        %128 = OpLoad %int %127
+        %129 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+        %130 = OpLoad %int %129
+        %131 = OpConvertSToF %float %124
+        %132 = OpConvertSToF %float %126
+        %133 = OpConvertSToF %float %128
+        %134 = OpConvertSToF %float %130
+        %135 = OpCompositeConstruct %v4float %131 %132 %133 %134
+               OpStore %x_GLF_color %135
+               OpBranch %120
+        %122 = OpLabel
+        %136 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+        %137 = OpLoad %int %136
+        %138 = OpAccessChain %_ptr_Function_float %v1 %137
+        %139 = OpLoad %float %138
+        %140 = OpCompositeConstruct %v4float %139 %139 %139 %139
+               OpStore %x_GLF_color %140
+               OpBranch %120
+        %120 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %141
+%tint_symbol = OpFunctionParameter %main_out
+        %145 = OpLabel
+        %146 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %146
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %148 = OpLabel
+        %149 = OpFunctionCall %void %main_1
+        %151 = OpLoad %v4float %x_GLF_color
+        %152 = OpCompositeConstruct %main_out %151
+        %150 = OpFunctionCall %void %tint_symbol_2 %152
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-pack-unpack/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-pack-unpack/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..c893e13
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-pack-unpack/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,97 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : u32;
+  var v1 : vec4<f32>;
+  var E : f32;
+  var x_69 : bool;
+  var x_85 : bool;
+  var x_101 : bool;
+  var x_70_phi : bool;
+  var x_86_phi : bool;
+  var x_102_phi : bool;
+  a = pack2x16float(vec2<f32>(1.0, 1.0));
+  let x_40 : u32 = a;
+  v1 = unpack4x8snorm(x_40);
+  E = 0.01;
+  let x_43 : i32 = x_8.x_GLF_uniform_int_values[1];
+  let x_45 : f32 = v1[x_43];
+  let x_47 : f32 = x_10.x_GLF_uniform_float_values[0];
+  let x_49 : f32 = x_10.x_GLF_uniform_float_values[1];
+  let x_53 : f32 = E;
+  let x_54 : bool = (abs((x_45 - (x_47 / x_49))) < x_53);
+  x_70_phi = x_54;
+  if (x_54) {
+    let x_58 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_60 : f32 = v1[x_58];
+    let x_62 : f32 = x_10.x_GLF_uniform_float_values[2];
+    let x_64 : f32 = x_10.x_GLF_uniform_float_values[1];
+    let x_68 : f32 = E;
+    x_69 = (abs((x_60 - (x_62 / x_64))) < x_68);
+    x_70_phi = x_69;
+  }
+  let x_70 : bool = x_70_phi;
+  x_86_phi = x_70;
+  if (x_70) {
+    let x_74 : i32 = x_8.x_GLF_uniform_int_values[2];
+    let x_76 : f32 = v1[x_74];
+    let x_78 : f32 = x_10.x_GLF_uniform_float_values[0];
+    let x_80 : f32 = x_10.x_GLF_uniform_float_values[1];
+    let x_84 : f32 = E;
+    x_85 = (abs((x_76 - (x_78 / x_80))) < x_84);
+    x_86_phi = x_85;
+  }
+  let x_86 : bool = x_86_phi;
+  x_102_phi = x_86;
+  if (x_86) {
+    let x_90 : i32 = x_8.x_GLF_uniform_int_values[3];
+    let x_92 : f32 = v1[x_90];
+    let x_94 : f32 = x_10.x_GLF_uniform_float_values[2];
+    let x_96 : f32 = x_10.x_GLF_uniform_float_values[1];
+    let x_100 : f32 = E;
+    x_101 = (abs((x_92 - (x_94 / x_96))) < x_100);
+    x_102_phi = x_101;
+  }
+  let x_102 : bool = x_102_phi;
+  if (x_102) {
+    let x_107 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_110 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_113 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_116 : i32 = x_8.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_107), f32(x_110), f32(x_113), f32(x_116));
+  } else {
+    let x_120 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_122 : f32 = v1[x_120];
+    x_GLF_color = vec4<f32>(x_122, x_122, x_122, x_122);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-packsnorm-unpackunorm/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-packsnorm-unpackunorm/0-opt.spvasm
new file mode 100644
index 0000000..476c935
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-packsnorm-unpackunorm/0-opt.spvasm
@@ -0,0 +1,169 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %v1 "v1"
+               OpName %E "E"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_4 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+      %float = OpTypeFloat 32
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+       %buf1 = OpTypeStruct %_arr_float_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%_ptr_Function_float = OpTypePointer Function %float
+       %bool = OpTypeBool
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %14
+         %33 = OpLabel
+          %a = OpVariable %_ptr_Function_uint Function
+         %v1 = OpVariable %_ptr_Function_v4float Function
+          %E = OpVariable %_ptr_Function_float Function
+         %34 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %35 = OpLoad %float %34
+         %36 = OpCompositeConstruct %v4float %35 %35 %35 %35
+         %37 = OpExtInst %uint %1 PackSnorm4x8 %36
+               OpStore %a %37
+         %38 = OpLoad %uint %a
+         %39 = OpExtInst %v4float %1 UnpackUnorm4x8 %38
+               OpStore %v1 %39
+         %40 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %41 = OpLoad %float %40
+               OpStore %E %41
+         %42 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %43 = OpLoad %int %42
+         %44 = OpAccessChain %_ptr_Function_float %v1 %43
+         %45 = OpLoad %float %44
+         %46 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %47 = OpLoad %float %46
+         %48 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_3
+         %49 = OpLoad %float %48
+         %50 = OpFDiv %float %47 %49
+         %51 = OpFSub %float %45 %50
+         %52 = OpExtInst %float %1 FAbs %51
+         %53 = OpLoad %float %E
+         %54 = OpFOrdLessThan %bool %52 %53
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %55
+         %56 = OpLabel
+         %57 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %58 = OpLoad %int %57
+         %59 = OpAccessChain %_ptr_Function_float %v1 %58
+         %60 = OpLoad %float %59
+         %61 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %62 = OpLoad %float %61
+         %63 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_3
+         %64 = OpLoad %float %63
+         %65 = OpFDiv %float %62 %64
+         %66 = OpFSub %float %60 %65
+         %67 = OpExtInst %float %1 FAbs %66
+         %68 = OpLoad %float %E
+         %69 = OpFOrdLessThan %bool %67 %68
+               OpBranch %55
+         %55 = OpLabel
+         %70 = OpPhi %bool %54 %33 %69 %56
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %71
+         %72 = OpLabel
+         %73 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_3
+         %74 = OpLoad %int %73
+         %75 = OpAccessChain %_ptr_Function_float %v1 %74
+         %76 = OpLoad %float %75
+         %77 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %78 = OpLoad %float %77
+         %79 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_3
+         %80 = OpLoad %float %79
+         %81 = OpFDiv %float %78 %80
+         %82 = OpFSub %float %76 %81
+         %83 = OpExtInst %float %1 FAbs %82
+         %84 = OpLoad %float %E
+         %85 = OpFOrdLessThan %bool %83 %84
+               OpBranch %71
+         %71 = OpLabel
+         %86 = OpPhi %bool %70 %55 %85 %72
+               OpSelectionMerge %87 None
+               OpBranchConditional %86 %88 %87
+         %88 = OpLabel
+         %89 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %90 = OpLoad %int %89
+         %91 = OpAccessChain %_ptr_Function_float %v1 %90
+         %92 = OpLoad %float %91
+         %93 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %94 = OpLoad %float %93
+         %95 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_3
+         %96 = OpLoad %float %95
+         %97 = OpFDiv %float %94 %96
+         %98 = OpFSub %float %92 %97
+         %99 = OpExtInst %float %1 FAbs %98
+        %100 = OpLoad %float %E
+        %101 = OpFOrdLessThan %bool %99 %100
+               OpBranch %87
+         %87 = OpLabel
+        %102 = OpPhi %bool %86 %71 %101 %88
+               OpSelectionMerge %103 None
+               OpBranchConditional %102 %104 %105
+        %104 = OpLabel
+        %106 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+        %107 = OpLoad %int %106
+        %108 = OpConvertSToF %float %107
+        %109 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %110 = OpLoad %int %109
+        %111 = OpConvertSToF %float %110
+        %112 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %113 = OpLoad %int %112
+        %114 = OpConvertSToF %float %113
+        %115 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+        %116 = OpLoad %int %115
+        %117 = OpConvertSToF %float %116
+        %118 = OpCompositeConstruct %v4float %108 %111 %114 %117
+               OpStore %_GLF_color %118
+               OpBranch %103
+        %105 = OpLabel
+        %119 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %120 = OpLoad %int %119
+        %121 = OpConvertSToF %float %120
+        %122 = OpCompositeConstruct %v4float %121 %121 %121 %121
+               OpStore %_GLF_color %122
+               OpBranch %103
+        %103 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-packsnorm-unpackunorm/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-packsnorm-unpackunorm/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..3019c2b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-packsnorm-unpackunorm/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,99 @@
+uint tint_pack4x8snorm(float4 param_0) {
+  int4 i = int4(round(clamp(param_0, -1.0, 1.0) * 127.0)) & 0xff;
+  return asuint(i.x | i.y << 8 | i.z << 16 | i.w << 24);
+}
+
+float4 tint_unpack4x8unorm(uint param_0) {
+  uint j = param_0;
+  uint4 i = uint4(j & 0xff, (j >> 8) & 0xff, (j >> 16) & 0xff, j >> 24);
+  return float4(i) / 255.0;
+}
+
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[4];
+};
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  uint a = 0u;
+  float4 v1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float E = 0.0f;
+  bool x_69 = false;
+  bool x_85 = false;
+  bool x_101 = false;
+  bool x_70_phi = false;
+  bool x_86_phi = false;
+  bool x_102_phi = false;
+  const float x_35 = asfloat(x_6[1].x);
+  a = tint_pack4x8snorm(float4(x_35, x_35, x_35, x_35));
+  v1 = tint_unpack4x8unorm(a);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_41 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  E = x_41;
+  const int x_43 = asint(x_10[1].x);
+  const float x_45 = v1[x_43];
+  const float x_47 = asfloat(x_6[2].x);
+  const float x_49 = asfloat(x_6[3].x);
+  const bool x_54 = (abs((x_45 - (x_47 / x_49))) < E);
+  x_70_phi = x_54;
+  if (x_54) {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_58 = asint(x_10[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const float x_60 = v1[x_58];
+    const float x_62 = asfloat(x_6[2].x);
+    const float x_64 = asfloat(x_6[3].x);
+    x_69 = (abs((x_60 - (x_62 / x_64))) < E);
+    x_70_phi = x_69;
+  }
+  const bool x_70 = x_70_phi;
+  x_86_phi = x_70;
+  if (x_70) {
+    const int x_74 = asint(x_10[3].x);
+    const float x_76 = v1[x_74];
+    const float x_78 = asfloat(x_6[2].x);
+    const float x_80 = asfloat(x_6[3].x);
+    x_85 = (abs((x_76 - (x_78 / x_80))) < E);
+    x_86_phi = x_85;
+  }
+  const bool x_86 = x_86_phi;
+  x_102_phi = x_86;
+  if (x_86) {
+    const int x_90 = asint(x_10[2].x);
+    const float x_92 = v1[x_90];
+    const float x_94 = asfloat(x_6[2].x);
+    const float x_96 = asfloat(x_6[3].x);
+    x_101 = (abs((x_92 - (x_94 / x_96))) < E);
+    x_102_phi = x_101;
+  }
+  if (x_102_phi) {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_107 = asint(x_10[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_110 = asint(x_10[1].x);
+    const int x_113 = asint(x_10[1].x);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_116 = asint(x_10[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    x_GLF_color = float4(float(x_107), float(x_110), float(x_113), float(x_116));
+  } else {
+    const int x_120 = asint(x_10[1].x);
+    const float x_121 = float(x_120);
+    x_GLF_color = float4(x_121, x_121, x_121, x_121);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-packsnorm-unpackunorm/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-packsnorm-unpackunorm/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..f9c669b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-packsnorm-unpackunorm/0-opt.spvasm.expected.msl
@@ -0,0 +1,107 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_10, thread float4* const tint_symbol_4) {
+  uint a = 0u;
+  float4 v1 = 0.0f;
+  float E = 0.0f;
+  bool x_69 = false;
+  bool x_85 = false;
+  bool x_101 = false;
+  bool x_70_phi = false;
+  bool x_86_phi = false;
+  bool x_102_phi = false;
+  float const x_35 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  a = pack_float_to_snorm4x8(float4(x_35, x_35, x_35, x_35));
+  uint const x_38 = a;
+  v1 = unpack_unorm4x8_to_float(x_38);
+  float const x_41 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  E = x_41;
+  int const x_43 = x_10.x_GLF_uniform_int_values.arr[1].el;
+  float const x_45 = v1[x_43];
+  float const x_47 = x_6.x_GLF_uniform_float_values.arr[2].el;
+  float const x_49 = x_6.x_GLF_uniform_float_values.arr[3].el;
+  float const x_53 = E;
+  bool const x_54 = (fabs((x_45 - (x_47 / x_49))) < x_53);
+  x_70_phi = x_54;
+  if (x_54) {
+    int const x_58 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    float const x_60 = v1[x_58];
+    float const x_62 = x_6.x_GLF_uniform_float_values.arr[2].el;
+    float const x_64 = x_6.x_GLF_uniform_float_values.arr[3].el;
+    float const x_68 = E;
+    x_69 = (fabs((x_60 - (x_62 / x_64))) < x_68);
+    x_70_phi = x_69;
+  }
+  bool const x_70 = x_70_phi;
+  x_86_phi = x_70;
+  if (x_70) {
+    int const x_74 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    float const x_76 = v1[x_74];
+    float const x_78 = x_6.x_GLF_uniform_float_values.arr[2].el;
+    float const x_80 = x_6.x_GLF_uniform_float_values.arr[3].el;
+    float const x_84 = E;
+    x_85 = (fabs((x_76 - (x_78 / x_80))) < x_84);
+    x_86_phi = x_85;
+  }
+  bool const x_86 = x_86_phi;
+  x_102_phi = x_86;
+  if (x_86) {
+    int const x_90 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    float const x_92 = v1[x_90];
+    float const x_94 = x_6.x_GLF_uniform_float_values.arr[2].el;
+    float const x_96 = x_6.x_GLF_uniform_float_values.arr[3].el;
+    float const x_100 = E;
+    x_101 = (fabs((x_92 - (x_94 / x_96))) < x_100);
+    x_102_phi = x_101;
+  }
+  bool const x_102 = x_102_phi;
+  if (x_102) {
+    int const x_107 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    int const x_110 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_113 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_116 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_107), float(x_110), float(x_113), float(x_116));
+  } else {
+    int const x_120 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    float const x_121 = float(x_120);
+    *(tint_symbol_4) = float4(x_121, x_121, x_121, x_121);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_10 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-packsnorm-unpackunorm/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-packsnorm-unpackunorm/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..84dd174
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-packsnorm-unpackunorm/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,231 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 152
+; Schema: 0
+               OpCapability Shader
+         %46 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %v1 "v1"
+               OpName %E "E"
+               OpName %x_69 "x_69"
+               OpName %x_85 "x_85"
+               OpName %x_101 "x_101"
+               OpName %x_70_phi "x_70_phi"
+               OpName %x_86_phi "x_86_phi"
+               OpName %x_102_phi "x_102_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_4 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+       %buf1 = OpTypeStruct %_arr_float_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %16
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_Function_uint = OpTypePointer Function %uint
+         %25 = OpConstantNull %uint
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%_ptr_Function_float = OpTypePointer Function %float
+         %30 = OpConstantNull %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %34 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+   %main_out = OpTypeStruct %v4float
+        %140 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+          %a = OpVariable %_ptr_Function_uint Function %25
+         %v1 = OpVariable %_ptr_Function_v4float Function %16
+          %E = OpVariable %_ptr_Function_float Function %30
+       %x_69 = OpVariable %_ptr_Function_bool Function %34
+       %x_85 = OpVariable %_ptr_Function_bool Function %34
+      %x_101 = OpVariable %_ptr_Function_bool Function %34
+   %x_70_phi = OpVariable %_ptr_Function_bool Function %34
+   %x_86_phi = OpVariable %_ptr_Function_bool Function %34
+  %x_102_phi = OpVariable %_ptr_Function_bool Function %34
+         %43 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %44 = OpLoad %float %43
+         %47 = OpCompositeConstruct %v4float %44 %44 %44 %44
+         %45 = OpExtInst %uint %46 PackSnorm4x8 %47
+               OpStore %a %45
+         %48 = OpLoad %uint %a
+         %49 = OpExtInst %v4float %46 UnpackUnorm4x8 %48
+               OpStore %v1 %49
+         %51 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %52 = OpLoad %float %51
+               OpStore %E %52
+         %54 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %55 = OpLoad %int %54
+         %56 = OpAccessChain %_ptr_Function_float %v1 %55
+         %57 = OpLoad %float %56
+         %59 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %60 = OpLoad %float %59
+         %62 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+         %63 = OpLoad %float %62
+         %64 = OpLoad %float %E
+         %66 = OpFDiv %float %60 %63
+         %67 = OpFSub %float %57 %66
+         %65 = OpExtInst %float %46 FAbs %67
+         %68 = OpFOrdLessThan %bool %65 %64
+               OpStore %x_70_phi %68
+               OpSelectionMerge %69 None
+               OpBranchConditional %68 %70 %69
+         %70 = OpLabel
+         %71 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %72 = OpLoad %int %71
+         %73 = OpAccessChain %_ptr_Function_float %v1 %72
+         %74 = OpLoad %float %73
+         %75 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %76 = OpLoad %float %75
+         %77 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+         %78 = OpLoad %float %77
+         %79 = OpLoad %float %E
+         %81 = OpFDiv %float %76 %78
+         %82 = OpFSub %float %74 %81
+         %80 = OpExtInst %float %46 FAbs %82
+         %83 = OpFOrdLessThan %bool %80 %79
+               OpStore %x_69 %83
+         %84 = OpLoad %bool %x_69
+               OpStore %x_70_phi %84
+               OpBranch %69
+         %69 = OpLabel
+         %85 = OpLoad %bool %x_70_phi
+               OpStore %x_86_phi %85
+               OpSelectionMerge %86 None
+               OpBranchConditional %85 %87 %86
+         %87 = OpLabel
+         %88 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+         %89 = OpLoad %int %88
+         %90 = OpAccessChain %_ptr_Function_float %v1 %89
+         %91 = OpLoad %float %90
+         %92 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %93 = OpLoad %float %92
+         %94 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+         %95 = OpLoad %float %94
+         %96 = OpLoad %float %E
+         %98 = OpFDiv %float %93 %95
+         %99 = OpFSub %float %91 %98
+         %97 = OpExtInst %float %46 FAbs %99
+        %100 = OpFOrdLessThan %bool %97 %96
+               OpStore %x_85 %100
+        %101 = OpLoad %bool %x_85
+               OpStore %x_86_phi %101
+               OpBranch %86
+         %86 = OpLabel
+        %102 = OpLoad %bool %x_86_phi
+               OpStore %x_102_phi %102
+               OpSelectionMerge %103 None
+               OpBranchConditional %102 %104 %103
+        %104 = OpLabel
+        %105 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %106 = OpLoad %int %105
+        %107 = OpAccessChain %_ptr_Function_float %v1 %106
+        %108 = OpLoad %float %107
+        %109 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+        %110 = OpLoad %float %109
+        %111 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+        %112 = OpLoad %float %111
+        %113 = OpLoad %float %E
+        %115 = OpFDiv %float %110 %112
+        %116 = OpFSub %float %108 %115
+        %114 = OpExtInst %float %46 FAbs %116
+        %117 = OpFOrdLessThan %bool %114 %113
+               OpStore %x_101 %117
+        %118 = OpLoad %bool %x_101
+               OpStore %x_102_phi %118
+               OpBranch %103
+        %103 = OpLabel
+        %119 = OpLoad %bool %x_102_phi
+               OpSelectionMerge %120 None
+               OpBranchConditional %119 %121 %122
+        %121 = OpLabel
+        %123 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %124 = OpLoad %int %123
+        %125 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %126 = OpLoad %int %125
+        %127 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %128 = OpLoad %int %127
+        %129 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %130 = OpLoad %int %129
+        %131 = OpConvertSToF %float %124
+        %132 = OpConvertSToF %float %126
+        %133 = OpConvertSToF %float %128
+        %134 = OpConvertSToF %float %130
+        %135 = OpCompositeConstruct %v4float %131 %132 %133 %134
+               OpStore %x_GLF_color %135
+               OpBranch %120
+        %122 = OpLabel
+        %136 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %137 = OpLoad %int %136
+        %138 = OpConvertSToF %float %137
+        %139 = OpCompositeConstruct %v4float %138 %138 %138 %138
+               OpStore %x_GLF_color %139
+               OpBranch %120
+        %120 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %140
+%tint_symbol = OpFunctionParameter %main_out
+        %144 = OpLabel
+        %145 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %145
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+        %147 = OpLabel
+        %148 = OpFunctionCall %void %main_1
+        %150 = OpLoad %v4float %x_GLF_color
+        %151 = OpCompositeConstruct %main_out %150
+        %149 = OpFunctionCall %void %tint_symbol_2 %151
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-packsnorm-unpackunorm/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-packsnorm-unpackunorm/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..ebc5637
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-packsnorm-unpackunorm/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,99 @@
+type Arr = [[stride(16)]] array<f32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : u32;
+  var v1 : vec4<f32>;
+  var E : f32;
+  var x_69 : bool;
+  var x_85 : bool;
+  var x_101 : bool;
+  var x_70_phi : bool;
+  var x_86_phi : bool;
+  var x_102_phi : bool;
+  let x_35 : f32 = x_6.x_GLF_uniform_float_values[1];
+  a = pack4x8snorm(vec4<f32>(x_35, x_35, x_35, x_35));
+  let x_38 : u32 = a;
+  v1 = unpack4x8unorm(x_38);
+  let x_41 : f32 = x_6.x_GLF_uniform_float_values[0];
+  E = x_41;
+  let x_43 : i32 = x_10.x_GLF_uniform_int_values[1];
+  let x_45 : f32 = v1[x_43];
+  let x_47 : f32 = x_6.x_GLF_uniform_float_values[2];
+  let x_49 : f32 = x_6.x_GLF_uniform_float_values[3];
+  let x_53 : f32 = E;
+  let x_54 : bool = (abs((x_45 - (x_47 / x_49))) < x_53);
+  x_70_phi = x_54;
+  if (x_54) {
+    let x_58 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_60 : f32 = v1[x_58];
+    let x_62 : f32 = x_6.x_GLF_uniform_float_values[2];
+    let x_64 : f32 = x_6.x_GLF_uniform_float_values[3];
+    let x_68 : f32 = E;
+    x_69 = (abs((x_60 - (x_62 / x_64))) < x_68);
+    x_70_phi = x_69;
+  }
+  let x_70 : bool = x_70_phi;
+  x_86_phi = x_70;
+  if (x_70) {
+    let x_74 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_76 : f32 = v1[x_74];
+    let x_78 : f32 = x_6.x_GLF_uniform_float_values[2];
+    let x_80 : f32 = x_6.x_GLF_uniform_float_values[3];
+    let x_84 : f32 = E;
+    x_85 = (abs((x_76 - (x_78 / x_80))) < x_84);
+    x_86_phi = x_85;
+  }
+  let x_86 : bool = x_86_phi;
+  x_102_phi = x_86;
+  if (x_86) {
+    let x_90 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_92 : f32 = v1[x_90];
+    let x_94 : f32 = x_6.x_GLF_uniform_float_values[2];
+    let x_96 : f32 = x_6.x_GLF_uniform_float_values[3];
+    let x_100 : f32 = E;
+    x_101 = (abs((x_92 - (x_94 / x_96))) < x_100);
+    x_102_phi = x_101;
+  }
+  let x_102 : bool = x_102_phi;
+  if (x_102) {
+    let x_107 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_110 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_113 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_116 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_107), f32(x_110), f32(x_113), f32(x_116));
+  } else {
+    let x_120 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_121 : f32 = f32(x_120);
+    x_GLF_color = vec4<f32>(x_121, x_121, x_121, x_121);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-packsnorm-unpackunorm/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-packsnorm-unpackunorm/0-opt.wgsl
new file mode 100644
index 0000000..ebc5637
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-packsnorm-unpackunorm/0-opt.wgsl
@@ -0,0 +1,99 @@
+type Arr = [[stride(16)]] array<f32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : u32;
+  var v1 : vec4<f32>;
+  var E : f32;
+  var x_69 : bool;
+  var x_85 : bool;
+  var x_101 : bool;
+  var x_70_phi : bool;
+  var x_86_phi : bool;
+  var x_102_phi : bool;
+  let x_35 : f32 = x_6.x_GLF_uniform_float_values[1];
+  a = pack4x8snorm(vec4<f32>(x_35, x_35, x_35, x_35));
+  let x_38 : u32 = a;
+  v1 = unpack4x8unorm(x_38);
+  let x_41 : f32 = x_6.x_GLF_uniform_float_values[0];
+  E = x_41;
+  let x_43 : i32 = x_10.x_GLF_uniform_int_values[1];
+  let x_45 : f32 = v1[x_43];
+  let x_47 : f32 = x_6.x_GLF_uniform_float_values[2];
+  let x_49 : f32 = x_6.x_GLF_uniform_float_values[3];
+  let x_53 : f32 = E;
+  let x_54 : bool = (abs((x_45 - (x_47 / x_49))) < x_53);
+  x_70_phi = x_54;
+  if (x_54) {
+    let x_58 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_60 : f32 = v1[x_58];
+    let x_62 : f32 = x_6.x_GLF_uniform_float_values[2];
+    let x_64 : f32 = x_6.x_GLF_uniform_float_values[3];
+    let x_68 : f32 = E;
+    x_69 = (abs((x_60 - (x_62 / x_64))) < x_68);
+    x_70_phi = x_69;
+  }
+  let x_70 : bool = x_70_phi;
+  x_86_phi = x_70;
+  if (x_70) {
+    let x_74 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_76 : f32 = v1[x_74];
+    let x_78 : f32 = x_6.x_GLF_uniform_float_values[2];
+    let x_80 : f32 = x_6.x_GLF_uniform_float_values[3];
+    let x_84 : f32 = E;
+    x_85 = (abs((x_76 - (x_78 / x_80))) < x_84);
+    x_86_phi = x_85;
+  }
+  let x_86 : bool = x_86_phi;
+  x_102_phi = x_86;
+  if (x_86) {
+    let x_90 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_92 : f32 = v1[x_90];
+    let x_94 : f32 = x_6.x_GLF_uniform_float_values[2];
+    let x_96 : f32 = x_6.x_GLF_uniform_float_values[3];
+    let x_100 : f32 = E;
+    x_101 = (abs((x_92 - (x_94 / x_96))) < x_100);
+    x_102_phi = x_101;
+  }
+  let x_102 : bool = x_102_phi;
+  if (x_102) {
+    let x_107 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_110 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_113 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_116 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_107), f32(x_110), f32(x_113), f32(x_116));
+  } else {
+    let x_120 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_121 : f32 = f32(x_120);
+    x_GLF_color = vec4<f32>(x_121, x_121, x_121, x_121);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-packsnorm-unpackunorm/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-packsnorm-unpackunorm/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..3019c2b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-packsnorm-unpackunorm/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,99 @@
+uint tint_pack4x8snorm(float4 param_0) {
+  int4 i = int4(round(clamp(param_0, -1.0, 1.0) * 127.0)) & 0xff;
+  return asuint(i.x | i.y << 8 | i.z << 16 | i.w << 24);
+}
+
+float4 tint_unpack4x8unorm(uint param_0) {
+  uint j = param_0;
+  uint4 i = uint4(j & 0xff, (j >> 8) & 0xff, (j >> 16) & 0xff, j >> 24);
+  return float4(i) / 255.0;
+}
+
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[4];
+};
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  uint a = 0u;
+  float4 v1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float E = 0.0f;
+  bool x_69 = false;
+  bool x_85 = false;
+  bool x_101 = false;
+  bool x_70_phi = false;
+  bool x_86_phi = false;
+  bool x_102_phi = false;
+  const float x_35 = asfloat(x_6[1].x);
+  a = tint_pack4x8snorm(float4(x_35, x_35, x_35, x_35));
+  v1 = tint_unpack4x8unorm(a);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_41 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  E = x_41;
+  const int x_43 = asint(x_10[1].x);
+  const float x_45 = v1[x_43];
+  const float x_47 = asfloat(x_6[2].x);
+  const float x_49 = asfloat(x_6[3].x);
+  const bool x_54 = (abs((x_45 - (x_47 / x_49))) < E);
+  x_70_phi = x_54;
+  if (x_54) {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_58 = asint(x_10[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const float x_60 = v1[x_58];
+    const float x_62 = asfloat(x_6[2].x);
+    const float x_64 = asfloat(x_6[3].x);
+    x_69 = (abs((x_60 - (x_62 / x_64))) < E);
+    x_70_phi = x_69;
+  }
+  const bool x_70 = x_70_phi;
+  x_86_phi = x_70;
+  if (x_70) {
+    const int x_74 = asint(x_10[3].x);
+    const float x_76 = v1[x_74];
+    const float x_78 = asfloat(x_6[2].x);
+    const float x_80 = asfloat(x_6[3].x);
+    x_85 = (abs((x_76 - (x_78 / x_80))) < E);
+    x_86_phi = x_85;
+  }
+  const bool x_86 = x_86_phi;
+  x_102_phi = x_86;
+  if (x_86) {
+    const int x_90 = asint(x_10[2].x);
+    const float x_92 = v1[x_90];
+    const float x_94 = asfloat(x_6[2].x);
+    const float x_96 = asfloat(x_6[3].x);
+    x_101 = (abs((x_92 - (x_94 / x_96))) < E);
+    x_102_phi = x_101;
+  }
+  if (x_102_phi) {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_107 = asint(x_10[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_110 = asint(x_10[1].x);
+    const int x_113 = asint(x_10[1].x);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_116 = asint(x_10[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    x_GLF_color = float4(float(x_107), float(x_110), float(x_113), float(x_116));
+  } else {
+    const int x_120 = asint(x_10[1].x);
+    const float x_121 = float(x_120);
+    x_GLF_color = float4(x_121, x_121, x_121, x_121);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-packsnorm-unpackunorm/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-packsnorm-unpackunorm/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..f9c669b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-packsnorm-unpackunorm/0-opt.wgsl.expected.msl
@@ -0,0 +1,107 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_10, thread float4* const tint_symbol_4) {
+  uint a = 0u;
+  float4 v1 = 0.0f;
+  float E = 0.0f;
+  bool x_69 = false;
+  bool x_85 = false;
+  bool x_101 = false;
+  bool x_70_phi = false;
+  bool x_86_phi = false;
+  bool x_102_phi = false;
+  float const x_35 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  a = pack_float_to_snorm4x8(float4(x_35, x_35, x_35, x_35));
+  uint const x_38 = a;
+  v1 = unpack_unorm4x8_to_float(x_38);
+  float const x_41 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  E = x_41;
+  int const x_43 = x_10.x_GLF_uniform_int_values.arr[1].el;
+  float const x_45 = v1[x_43];
+  float const x_47 = x_6.x_GLF_uniform_float_values.arr[2].el;
+  float const x_49 = x_6.x_GLF_uniform_float_values.arr[3].el;
+  float const x_53 = E;
+  bool const x_54 = (fabs((x_45 - (x_47 / x_49))) < x_53);
+  x_70_phi = x_54;
+  if (x_54) {
+    int const x_58 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    float const x_60 = v1[x_58];
+    float const x_62 = x_6.x_GLF_uniform_float_values.arr[2].el;
+    float const x_64 = x_6.x_GLF_uniform_float_values.arr[3].el;
+    float const x_68 = E;
+    x_69 = (fabs((x_60 - (x_62 / x_64))) < x_68);
+    x_70_phi = x_69;
+  }
+  bool const x_70 = x_70_phi;
+  x_86_phi = x_70;
+  if (x_70) {
+    int const x_74 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    float const x_76 = v1[x_74];
+    float const x_78 = x_6.x_GLF_uniform_float_values.arr[2].el;
+    float const x_80 = x_6.x_GLF_uniform_float_values.arr[3].el;
+    float const x_84 = E;
+    x_85 = (fabs((x_76 - (x_78 / x_80))) < x_84);
+    x_86_phi = x_85;
+  }
+  bool const x_86 = x_86_phi;
+  x_102_phi = x_86;
+  if (x_86) {
+    int const x_90 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    float const x_92 = v1[x_90];
+    float const x_94 = x_6.x_GLF_uniform_float_values.arr[2].el;
+    float const x_96 = x_6.x_GLF_uniform_float_values.arr[3].el;
+    float const x_100 = E;
+    x_101 = (fabs((x_92 - (x_94 / x_96))) < x_100);
+    x_102_phi = x_101;
+  }
+  bool const x_102 = x_102_phi;
+  if (x_102) {
+    int const x_107 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    int const x_110 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_113 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_116 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_107), float(x_110), float(x_113), float(x_116));
+  } else {
+    int const x_120 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    float const x_121 = float(x_120);
+    *(tint_symbol_4) = float4(x_121, x_121, x_121, x_121);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_10 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-packsnorm-unpackunorm/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-packsnorm-unpackunorm/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..84dd174
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-packsnorm-unpackunorm/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,231 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 152
+; Schema: 0
+               OpCapability Shader
+         %46 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %v1 "v1"
+               OpName %E "E"
+               OpName %x_69 "x_69"
+               OpName %x_85 "x_85"
+               OpName %x_101 "x_101"
+               OpName %x_70_phi "x_70_phi"
+               OpName %x_86_phi "x_86_phi"
+               OpName %x_102_phi "x_102_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_4 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+       %buf1 = OpTypeStruct %_arr_float_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %16
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_Function_uint = OpTypePointer Function %uint
+         %25 = OpConstantNull %uint
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%_ptr_Function_float = OpTypePointer Function %float
+         %30 = OpConstantNull %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %34 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+   %main_out = OpTypeStruct %v4float
+        %140 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+          %a = OpVariable %_ptr_Function_uint Function %25
+         %v1 = OpVariable %_ptr_Function_v4float Function %16
+          %E = OpVariable %_ptr_Function_float Function %30
+       %x_69 = OpVariable %_ptr_Function_bool Function %34
+       %x_85 = OpVariable %_ptr_Function_bool Function %34
+      %x_101 = OpVariable %_ptr_Function_bool Function %34
+   %x_70_phi = OpVariable %_ptr_Function_bool Function %34
+   %x_86_phi = OpVariable %_ptr_Function_bool Function %34
+  %x_102_phi = OpVariable %_ptr_Function_bool Function %34
+         %43 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %44 = OpLoad %float %43
+         %47 = OpCompositeConstruct %v4float %44 %44 %44 %44
+         %45 = OpExtInst %uint %46 PackSnorm4x8 %47
+               OpStore %a %45
+         %48 = OpLoad %uint %a
+         %49 = OpExtInst %v4float %46 UnpackUnorm4x8 %48
+               OpStore %v1 %49
+         %51 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %52 = OpLoad %float %51
+               OpStore %E %52
+         %54 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %55 = OpLoad %int %54
+         %56 = OpAccessChain %_ptr_Function_float %v1 %55
+         %57 = OpLoad %float %56
+         %59 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %60 = OpLoad %float %59
+         %62 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+         %63 = OpLoad %float %62
+         %64 = OpLoad %float %E
+         %66 = OpFDiv %float %60 %63
+         %67 = OpFSub %float %57 %66
+         %65 = OpExtInst %float %46 FAbs %67
+         %68 = OpFOrdLessThan %bool %65 %64
+               OpStore %x_70_phi %68
+               OpSelectionMerge %69 None
+               OpBranchConditional %68 %70 %69
+         %70 = OpLabel
+         %71 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %72 = OpLoad %int %71
+         %73 = OpAccessChain %_ptr_Function_float %v1 %72
+         %74 = OpLoad %float %73
+         %75 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %76 = OpLoad %float %75
+         %77 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+         %78 = OpLoad %float %77
+         %79 = OpLoad %float %E
+         %81 = OpFDiv %float %76 %78
+         %82 = OpFSub %float %74 %81
+         %80 = OpExtInst %float %46 FAbs %82
+         %83 = OpFOrdLessThan %bool %80 %79
+               OpStore %x_69 %83
+         %84 = OpLoad %bool %x_69
+               OpStore %x_70_phi %84
+               OpBranch %69
+         %69 = OpLabel
+         %85 = OpLoad %bool %x_70_phi
+               OpStore %x_86_phi %85
+               OpSelectionMerge %86 None
+               OpBranchConditional %85 %87 %86
+         %87 = OpLabel
+         %88 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+         %89 = OpLoad %int %88
+         %90 = OpAccessChain %_ptr_Function_float %v1 %89
+         %91 = OpLoad %float %90
+         %92 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %93 = OpLoad %float %92
+         %94 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+         %95 = OpLoad %float %94
+         %96 = OpLoad %float %E
+         %98 = OpFDiv %float %93 %95
+         %99 = OpFSub %float %91 %98
+         %97 = OpExtInst %float %46 FAbs %99
+        %100 = OpFOrdLessThan %bool %97 %96
+               OpStore %x_85 %100
+        %101 = OpLoad %bool %x_85
+               OpStore %x_86_phi %101
+               OpBranch %86
+         %86 = OpLabel
+        %102 = OpLoad %bool %x_86_phi
+               OpStore %x_102_phi %102
+               OpSelectionMerge %103 None
+               OpBranchConditional %102 %104 %103
+        %104 = OpLabel
+        %105 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %106 = OpLoad %int %105
+        %107 = OpAccessChain %_ptr_Function_float %v1 %106
+        %108 = OpLoad %float %107
+        %109 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+        %110 = OpLoad %float %109
+        %111 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+        %112 = OpLoad %float %111
+        %113 = OpLoad %float %E
+        %115 = OpFDiv %float %110 %112
+        %116 = OpFSub %float %108 %115
+        %114 = OpExtInst %float %46 FAbs %116
+        %117 = OpFOrdLessThan %bool %114 %113
+               OpStore %x_101 %117
+        %118 = OpLoad %bool %x_101
+               OpStore %x_102_phi %118
+               OpBranch %103
+        %103 = OpLabel
+        %119 = OpLoad %bool %x_102_phi
+               OpSelectionMerge %120 None
+               OpBranchConditional %119 %121 %122
+        %121 = OpLabel
+        %123 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %124 = OpLoad %int %123
+        %125 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %126 = OpLoad %int %125
+        %127 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %128 = OpLoad %int %127
+        %129 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %130 = OpLoad %int %129
+        %131 = OpConvertSToF %float %124
+        %132 = OpConvertSToF %float %126
+        %133 = OpConvertSToF %float %128
+        %134 = OpConvertSToF %float %130
+        %135 = OpCompositeConstruct %v4float %131 %132 %133 %134
+               OpStore %x_GLF_color %135
+               OpBranch %120
+        %122 = OpLabel
+        %136 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %137 = OpLoad %int %136
+        %138 = OpConvertSToF %float %137
+        %139 = OpCompositeConstruct %v4float %138 %138 %138 %138
+               OpStore %x_GLF_color %139
+               OpBranch %120
+        %120 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %140
+%tint_symbol = OpFunctionParameter %main_out
+        %144 = OpLabel
+        %145 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %145
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+        %147 = OpLabel
+        %148 = OpFunctionCall %void %main_1
+        %150 = OpLoad %v4float %x_GLF_color
+        %151 = OpCompositeConstruct %main_out %150
+        %149 = OpFunctionCall %void %tint_symbol_2 %151
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-packsnorm-unpackunorm/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-packsnorm-unpackunorm/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..ebc5637
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-packsnorm-unpackunorm/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,99 @@
+type Arr = [[stride(16)]] array<f32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : u32;
+  var v1 : vec4<f32>;
+  var E : f32;
+  var x_69 : bool;
+  var x_85 : bool;
+  var x_101 : bool;
+  var x_70_phi : bool;
+  var x_86_phi : bool;
+  var x_102_phi : bool;
+  let x_35 : f32 = x_6.x_GLF_uniform_float_values[1];
+  a = pack4x8snorm(vec4<f32>(x_35, x_35, x_35, x_35));
+  let x_38 : u32 = a;
+  v1 = unpack4x8unorm(x_38);
+  let x_41 : f32 = x_6.x_GLF_uniform_float_values[0];
+  E = x_41;
+  let x_43 : i32 = x_10.x_GLF_uniform_int_values[1];
+  let x_45 : f32 = v1[x_43];
+  let x_47 : f32 = x_6.x_GLF_uniform_float_values[2];
+  let x_49 : f32 = x_6.x_GLF_uniform_float_values[3];
+  let x_53 : f32 = E;
+  let x_54 : bool = (abs((x_45 - (x_47 / x_49))) < x_53);
+  x_70_phi = x_54;
+  if (x_54) {
+    let x_58 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_60 : f32 = v1[x_58];
+    let x_62 : f32 = x_6.x_GLF_uniform_float_values[2];
+    let x_64 : f32 = x_6.x_GLF_uniform_float_values[3];
+    let x_68 : f32 = E;
+    x_69 = (abs((x_60 - (x_62 / x_64))) < x_68);
+    x_70_phi = x_69;
+  }
+  let x_70 : bool = x_70_phi;
+  x_86_phi = x_70;
+  if (x_70) {
+    let x_74 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_76 : f32 = v1[x_74];
+    let x_78 : f32 = x_6.x_GLF_uniform_float_values[2];
+    let x_80 : f32 = x_6.x_GLF_uniform_float_values[3];
+    let x_84 : f32 = E;
+    x_85 = (abs((x_76 - (x_78 / x_80))) < x_84);
+    x_86_phi = x_85;
+  }
+  let x_86 : bool = x_86_phi;
+  x_102_phi = x_86;
+  if (x_86) {
+    let x_90 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_92 : f32 = v1[x_90];
+    let x_94 : f32 = x_6.x_GLF_uniform_float_values[2];
+    let x_96 : f32 = x_6.x_GLF_uniform_float_values[3];
+    let x_100 : f32 = E;
+    x_101 = (abs((x_92 - (x_94 / x_96))) < x_100);
+    x_102_phi = x_101;
+  }
+  let x_102 : bool = x_102_phi;
+  if (x_102) {
+    let x_107 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_110 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_113 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_116 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_107), f32(x_110), f32(x_113), f32(x_116));
+  } else {
+    let x_120 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_121 : f32 = f32(x_120);
+    x_GLF_color = vec4<f32>(x_121, x_121, x_121, x_121);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.spvasm
new file mode 100644
index 0000000..6088f45
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.spvasm
@@ -0,0 +1,81 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %color "color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_float = OpTypePointer Function %float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %12
+         %27 = OpLabel
+      %color = OpVariable %_ptr_Function_v4float Function
+         %28 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %29 = OpLoad %float %28
+         %30 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %31 = OpLoad %float %30
+         %32 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %33 = OpLoad %float %32
+         %34 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %35 = OpLoad %float %34
+         %36 = OpCompositeConstruct %v4float %29 %31 %33 %35
+               OpStore %color %36
+         %37 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %38 = OpLoad %int %37
+         %39 = OpBitwiseOr %int %int_1 %38
+         %40 = OpBitwiseXor %int %39 %int_1
+               OpSelectionMerge %41 None
+               OpSwitch %40 %41 0 %42
+         %42 = OpLabel
+         %43 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %44 = OpLoad %int %43
+         %45 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %46 = OpLoad %float %45
+         %47 = OpAccessChain %_ptr_Function_float %color %44
+               OpStore %47 %46
+               OpBranch %41
+         %41 = OpLabel
+         %48 = OpLoad %v4float %color
+               OpStore %_GLF_color %48
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..35a88d4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,52 @@
+void set_float4(inout float4 vec, int idx, float val) {
+  vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
+}
+
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_29 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_31 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const float x_33 = asfloat(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  const float x_35 = asfloat(x_6[1].x);
+  color = float4(x_29, x_31, x_33, x_35);
+  const int x_38 = asint(x_8[1].x);
+  switch(((1 | x_38) ^ 1)) {
+    case 0: {
+      const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+      const int x_44 = asint(x_8[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+      const float x_46 = asfloat(x_6[1].x);
+      set_float4(color, x_44, x_46);
+      break;
+    }
+    default: {
+      break;
+    }
+  }
+  x_GLF_color = color;
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..ec0f90f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.spvasm.expected.msl
@@ -0,0 +1,62 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_8, thread float4* const tint_symbol_4) {
+  float4 color = 0.0f;
+  float const x_29 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_31 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_33 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_35 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  color = float4(x_29, x_31, x_33, x_35);
+  int const x_38 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  switch(((1 | x_38) ^ 1)) {
+    case 0: {
+      int const x_44 = x_8.x_GLF_uniform_int_values.arr[0].el;
+      float const x_46 = x_6.x_GLF_uniform_float_values.arr[1].el;
+      color[x_44] = x_46;
+      break;
+    }
+    default: {
+      break;
+    }
+  }
+  float4 const x_48 = color;
+  *(tint_symbol_4) = x_48;
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_8 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..6302166
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,116 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 65
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %color "color"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %16
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_float = OpTypePointer Function %float
+   %main_out = OpTypeStruct %v4float
+         %53 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+      %color = OpVariable %_ptr_Function_v4float Function %16
+         %28 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %29 = OpLoad %float %28
+         %30 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %31 = OpLoad %float %30
+         %32 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %33 = OpLoad %float %32
+         %35 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %36 = OpLoad %float %35
+         %37 = OpCompositeConstruct %v4float %29 %31 %33 %36
+               OpStore %color %37
+         %39 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %40 = OpLoad %int %39
+         %42 = OpBitwiseOr %int %int_1 %40
+         %43 = OpBitwiseXor %int %42 %int_1
+               OpSelectionMerge %41 None
+               OpSwitch %43 %44 0 %45
+         %45 = OpLabel
+         %46 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %47 = OpLoad %int %46
+         %48 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %49 = OpLoad %float %48
+         %51 = OpAccessChain %_ptr_Function_float %color %47
+               OpStore %51 %49
+               OpBranch %41
+         %44 = OpLabel
+               OpBranch %41
+         %41 = OpLabel
+         %52 = OpLoad %v4float %color
+               OpStore %x_GLF_color %52
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %53
+%tint_symbol = OpFunctionParameter %main_out
+         %57 = OpLabel
+         %58 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %58
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+         %60 = OpLabel
+         %61 = OpFunctionCall %void %main_1
+         %63 = OpLoad %v4float %x_GLF_color
+         %64 = OpCompositeConstruct %main_out %63
+         %62 = OpFunctionCall %void %tint_symbol_2 %64
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..22c3ac0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,52 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var color : vec4<f32>;
+  let x_29 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_31 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_33 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_35 : f32 = x_6.x_GLF_uniform_float_values[1];
+  color = vec4<f32>(x_29, x_31, x_33, x_35);
+  let x_38 : i32 = x_8.x_GLF_uniform_int_values[1];
+  switch(((1 | x_38) ^ 1)) {
+    case 0: {
+      let x_44 : i32 = x_8.x_GLF_uniform_int_values[0];
+      let x_46 : f32 = x_6.x_GLF_uniform_float_values[1];
+      color[x_44] = x_46;
+    }
+    default: {
+    }
+  }
+  let x_48 : vec4<f32> = color;
+  x_GLF_color = x_48;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.wgsl
new file mode 100644
index 0000000..22c3ac0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.wgsl
@@ -0,0 +1,52 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var color : vec4<f32>;
+  let x_29 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_31 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_33 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_35 : f32 = x_6.x_GLF_uniform_float_values[1];
+  color = vec4<f32>(x_29, x_31, x_33, x_35);
+  let x_38 : i32 = x_8.x_GLF_uniform_int_values[1];
+  switch(((1 | x_38) ^ 1)) {
+    case 0: {
+      let x_44 : i32 = x_8.x_GLF_uniform_int_values[0];
+      let x_46 : f32 = x_6.x_GLF_uniform_float_values[1];
+      color[x_44] = x_46;
+    }
+    default: {
+    }
+  }
+  let x_48 : vec4<f32> = color;
+  x_GLF_color = x_48;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..35a88d4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,52 @@
+void set_float4(inout float4 vec, int idx, float val) {
+  vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
+}
+
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_29 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_31 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const float x_33 = asfloat(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  const float x_35 = asfloat(x_6[1].x);
+  color = float4(x_29, x_31, x_33, x_35);
+  const int x_38 = asint(x_8[1].x);
+  switch(((1 | x_38) ^ 1)) {
+    case 0: {
+      const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+      const int x_44 = asint(x_8[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+      const float x_46 = asfloat(x_6[1].x);
+      set_float4(color, x_44, x_46);
+      break;
+    }
+    default: {
+      break;
+    }
+  }
+  x_GLF_color = color;
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..ec0f90f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.wgsl.expected.msl
@@ -0,0 +1,62 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_8, thread float4* const tint_symbol_4) {
+  float4 color = 0.0f;
+  float const x_29 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_31 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_33 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_35 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  color = float4(x_29, x_31, x_33, x_35);
+  int const x_38 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  switch(((1 | x_38) ^ 1)) {
+    case 0: {
+      int const x_44 = x_8.x_GLF_uniform_int_values.arr[0].el;
+      float const x_46 = x_6.x_GLF_uniform_float_values.arr[1].el;
+      color[x_44] = x_46;
+      break;
+    }
+    default: {
+      break;
+    }
+  }
+  float4 const x_48 = color;
+  *(tint_symbol_4) = x_48;
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_8 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..6302166
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,116 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 65
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %color "color"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %16
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_float = OpTypePointer Function %float
+   %main_out = OpTypeStruct %v4float
+         %53 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+      %color = OpVariable %_ptr_Function_v4float Function %16
+         %28 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %29 = OpLoad %float %28
+         %30 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %31 = OpLoad %float %30
+         %32 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %33 = OpLoad %float %32
+         %35 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %36 = OpLoad %float %35
+         %37 = OpCompositeConstruct %v4float %29 %31 %33 %36
+               OpStore %color %37
+         %39 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %40 = OpLoad %int %39
+         %42 = OpBitwiseOr %int %int_1 %40
+         %43 = OpBitwiseXor %int %42 %int_1
+               OpSelectionMerge %41 None
+               OpSwitch %43 %44 0 %45
+         %45 = OpLabel
+         %46 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %47 = OpLoad %int %46
+         %48 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %49 = OpLoad %float %48
+         %51 = OpAccessChain %_ptr_Function_float %color %47
+               OpStore %51 %49
+               OpBranch %41
+         %44 = OpLabel
+               OpBranch %41
+         %41 = OpLabel
+         %52 = OpLoad %v4float %color
+               OpStore %x_GLF_color %52
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %53
+%tint_symbol = OpFunctionParameter %main_out
+         %57 = OpLabel
+         %58 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %58
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+         %60 = OpLabel
+         %61 = OpFunctionCall %void %main_1
+         %63 = OpLoad %v4float %x_GLF_color
+         %64 = OpCompositeConstruct %main_out %63
+         %62 = OpFunctionCall %void %tint_symbol_2 %64
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..22c3ac0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-simplify-demanded-switch-or-xor/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,52 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var color : vec4<f32>;
+  let x_29 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_31 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_33 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_35 : f32 = x_6.x_GLF_uniform_float_values[1];
+  color = vec4<f32>(x_29, x_31, x_33, x_35);
+  let x_38 : i32 = x_8.x_GLF_uniform_int_values[1];
+  switch(((1 | x_38) ^ 1)) {
+    case 0: {
+      let x_44 : i32 = x_8.x_GLF_uniform_int_values[0];
+      let x_46 : f32 = x_6.x_GLF_uniform_float_values[1];
+      color[x_44] = x_46;
+    }
+    default: {
+    }
+  }
+  let x_48 : vec4<f32> = color;
+  x_GLF_color = x_48;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-vector-ops-asin/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-vector-ops-asin/0-opt.spvasm
new file mode 100644
index 0000000..ea4e58c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-vector-ops-asin/0-opt.spvasm
@@ -0,0 +1,142 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %b "b"
+               OpName %c "c"
+               OpName %d "d"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_4 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %16 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+       %buf0 = OpTypeStruct %_arr_float_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_int = OpTypePointer Function %int
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %16
+         %35 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function
+          %i = OpVariable %_ptr_Function_int Function
+          %b = OpVariable %_ptr_Function_float Function
+          %c = OpVariable %_ptr_Function_float Function
+          %d = OpVariable %_ptr_Function_float Function
+         %36 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %37 = OpLoad %float %36
+               OpStore %a %37
+         %38 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %39 = OpLoad %int %38
+               OpStore %i %39
+               OpBranch %40
+         %40 = OpLabel
+               OpLoopMerge %41 %42 None
+               OpBranch %43
+         %43 = OpLabel
+         %44 = OpLoad %int %i
+         %45 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %46 = OpLoad %int %45
+         %47 = OpSLessThan %bool %44 %46
+               OpBranchConditional %47 %48 %41
+         %48 = OpLabel
+         %49 = OpLoad %float %a
+               OpStore %b %49
+         %50 = OpLoad %float %b
+               OpStore %c %50
+         %51 = OpLoad %float %c
+         %52 = OpExtInst %float %1 Asin %51
+               OpStore %d %52
+         %53 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %54 = OpLoad %float %53
+               OpStore %c %54
+         %55 = OpLoad %float %d
+               OpStore %a %55
+               OpBranch %42
+         %42 = OpLabel
+         %56 = OpLoad %int %i
+         %57 = OpIAdd %int %56 %int_1
+               OpStore %i %57
+               OpBranch %40
+         %41 = OpLabel
+         %58 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %59 = OpLoad %float %58
+         %60 = OpLoad %float %a
+         %61 = OpFOrdLessThan %bool %59 %60
+               OpSelectionMerge %62 None
+               OpBranchConditional %61 %63 %62
+         %63 = OpLabel
+         %64 = OpLoad %float %a
+         %65 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_3
+         %66 = OpLoad %float %65
+         %67 = OpFOrdLessThan %bool %64 %66
+               OpBranch %62
+         %62 = OpLabel
+         %68 = OpPhi %bool %61 %41 %67 %63
+               OpSelectionMerge %69 None
+               OpBranchConditional %68 %70 %71
+         %70 = OpLabel
+         %72 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %73 = OpLoad %int %72
+         %74 = OpConvertSToF %float %73
+         %75 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %76 = OpLoad %int %75
+         %77 = OpConvertSToF %float %76
+         %78 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %79 = OpLoad %int %78
+         %80 = OpConvertSToF %float %79
+         %81 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %82 = OpLoad %int %81
+         %83 = OpConvertSToF %float %82
+         %84 = OpCompositeConstruct %v4float %74 %77 %80 %83
+               OpStore %_GLF_color %84
+               OpBranch %69
+         %71 = OpLabel
+         %85 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %86 = OpLoad %int %85
+         %87 = OpConvertSToF %float %86
+         %88 = OpCompositeConstruct %v4float %87 %87 %87 %87
+               OpStore %_GLF_color %88
+               OpBranch %69
+         %69 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-vector-ops-asin/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-vector-ops-asin/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..0df7ca0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-vector-ops-asin/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,75 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[4];
+};
+cbuffer cbuffer_x_9 : register(b1, space0) {
+  uint4 x_9[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float a = 0.0f;
+  int i = 0;
+  float b = 0.0f;
+  float c = 0.0f;
+  float d = 0.0f;
+  bool x_67 = false;
+  bool x_68_phi = false;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_37 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  a = x_37;
+  const int x_39 = asint(x_9[1].x);
+  i = x_39;
+  while (true) {
+    const int x_44 = i;
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_46 = asint(x_9[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    if ((x_44 < x_46)) {
+    } else {
+      break;
+    }
+    b = a;
+    c = b;
+    d = asin(c);
+    const float x_54 = asfloat(x_6[1].x);
+    c = x_54;
+    a = d;
+    {
+      i = (i + 1);
+    }
+  }
+  const float x_59 = asfloat(x_6[2].x);
+  const bool x_61 = (x_59 < a);
+  x_68_phi = x_61;
+  if (x_61) {
+    const float x_64 = a;
+    const float x_66 = asfloat(x_6[3].x);
+    x_67 = (x_64 < x_66);
+    x_68_phi = x_67;
+  }
+  if (x_68_phi) {
+    const int x_73 = asint(x_9[2].x);
+    const int x_76 = asint(x_9[1].x);
+    const int x_79 = asint(x_9[1].x);
+    const int x_82 = asint(x_9[2].x);
+    x_GLF_color = float4(float(x_73), float(x_76), float(x_79), float(x_82));
+  } else {
+    const int x_86 = asint(x_9[1].x);
+    const float x_87 = float(x_86);
+    x_GLF_color = float4(x_87, x_87, x_87, x_87);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-vector-ops-asin/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-vector-ops-asin/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..ed3ad85
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-vector-ops-asin/0-opt.spvasm.expected.msl
@@ -0,0 +1,97 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_9, thread float4* const tint_symbol_4) {
+  float a = 0.0f;
+  int i = 0;
+  float b = 0.0f;
+  float c = 0.0f;
+  float d = 0.0f;
+  bool x_67 = false;
+  bool x_68_phi = false;
+  float const x_37 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  a = x_37;
+  int const x_39 = x_9.x_GLF_uniform_int_values.arr[1].el;
+  i = x_39;
+  while (true) {
+    int const x_44 = i;
+    int const x_46 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_44 < x_46)) {
+    } else {
+      break;
+    }
+    float const x_49 = a;
+    b = x_49;
+    float const x_50 = b;
+    c = x_50;
+    float const x_51 = c;
+    d = asin(x_51);
+    float const x_54 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    c = x_54;
+    float const x_55 = d;
+    a = x_55;
+    {
+      int const x_56 = i;
+      i = (x_56 + 1);
+    }
+  }
+  float const x_59 = x_6.x_GLF_uniform_float_values.arr[2].el;
+  float const x_60 = a;
+  bool const x_61 = (x_59 < x_60);
+  x_68_phi = x_61;
+  if (x_61) {
+    float const x_64 = a;
+    float const x_66 = x_6.x_GLF_uniform_float_values.arr[3].el;
+    x_67 = (x_64 < x_66);
+    x_68_phi = x_67;
+  }
+  bool const x_68 = x_68_phi;
+  if (x_68) {
+    int const x_73 = x_9.x_GLF_uniform_int_values.arr[2].el;
+    int const x_76 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_79 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_82 = x_9.x_GLF_uniform_int_values.arr[2].el;
+    *(tint_symbol_4) = float4(float(x_73), float(x_76), float(x_79), float(x_82));
+  } else {
+    int const x_86 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    float const x_87 = float(x_86);
+    *(tint_symbol_4) = float4(x_87, x_87, x_87, x_87);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_9 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-vector-ops-asin/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-vector-ops-asin/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..9bb8ae6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-vector-ops-asin/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,193 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 114
+; Schema: 0
+               OpCapability Shader
+         %62 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %d "d"
+               OpName %x_67 "x_67"
+               OpName %x_68_phi "x_68_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_4 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+       %buf0 = OpTypeStruct %_arr_float_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_9 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %26 = OpConstantNull %float
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %36 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+   %main_out = OpTypeStruct %v4float
+        %102 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function %26
+          %i = OpVariable %_ptr_Function_int Function %29
+          %b = OpVariable %_ptr_Function_float Function %26
+          %c = OpVariable %_ptr_Function_float Function %26
+          %d = OpVariable %_ptr_Function_float Function %26
+       %x_67 = OpVariable %_ptr_Function_bool Function %36
+   %x_68_phi = OpVariable %_ptr_Function_bool Function %36
+         %41 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %42 = OpLoad %float %41
+               OpStore %a %42
+         %45 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %46 = OpLoad %int %45
+               OpStore %i %46
+               OpBranch %47
+         %47 = OpLabel
+               OpLoopMerge %48 %49 None
+               OpBranch %50
+         %50 = OpLabel
+         %51 = OpLoad %int %i
+         %52 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %53 = OpLoad %int %52
+         %54 = OpSLessThan %bool %51 %53
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %57
+         %56 = OpLabel
+               OpBranch %55
+         %57 = OpLabel
+               OpBranch %48
+         %55 = OpLabel
+         %58 = OpLoad %float %a
+               OpStore %b %58
+         %59 = OpLoad %float %b
+               OpStore %c %59
+         %60 = OpLoad %float %c
+         %61 = OpExtInst %float %62 Asin %60
+               OpStore %d %61
+         %63 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %64 = OpLoad %float %63
+               OpStore %c %64
+         %65 = OpLoad %float %d
+               OpStore %a %65
+               OpBranch %49
+         %49 = OpLabel
+         %66 = OpLoad %int %i
+         %67 = OpIAdd %int %66 %int_1
+               OpStore %i %67
+               OpBranch %47
+         %48 = OpLabel
+         %69 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %70 = OpLoad %float %69
+         %71 = OpLoad %float %a
+         %72 = OpFOrdLessThan %bool %70 %71
+               OpStore %x_68_phi %72
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %74 %73
+         %74 = OpLabel
+         %75 = OpLoad %float %a
+         %77 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+         %78 = OpLoad %float %77
+         %79 = OpFOrdLessThan %bool %75 %78
+               OpStore %x_67 %79
+         %80 = OpLoad %bool %x_67
+               OpStore %x_68_phi %80
+               OpBranch %73
+         %73 = OpLabel
+         %81 = OpLoad %bool %x_68_phi
+               OpSelectionMerge %82 None
+               OpBranchConditional %81 %83 %84
+         %83 = OpLabel
+         %85 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_2
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %88 = OpLoad %int %87
+         %89 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %90 = OpLoad %int %89
+         %91 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_2
+         %92 = OpLoad %int %91
+         %93 = OpConvertSToF %float %86
+         %94 = OpConvertSToF %float %88
+         %95 = OpConvertSToF %float %90
+         %96 = OpConvertSToF %float %92
+         %97 = OpCompositeConstruct %v4float %93 %94 %95 %96
+               OpStore %x_GLF_color %97
+               OpBranch %82
+         %84 = OpLabel
+         %98 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %99 = OpLoad %int %98
+        %100 = OpConvertSToF %float %99
+        %101 = OpCompositeConstruct %v4float %100 %100 %100 %100
+               OpStore %x_GLF_color %101
+               OpBranch %82
+         %82 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %102
+%tint_symbol = OpFunctionParameter %main_out
+        %106 = OpLabel
+        %107 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %107
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %109 = OpLabel
+        %110 = OpFunctionCall %void %main_1
+        %112 = OpLoad %v4float %x_GLF_color
+        %113 = OpCompositeConstruct %main_out %112
+        %111 = OpFunctionCall %void %tint_symbol_2 %113
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-vector-ops-asin/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-vector-ops-asin/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..d9201c6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-vector-ops-asin/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,90 @@
+type Arr = [[stride(16)]] array<f32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : f32;
+  var i : i32;
+  var b : f32;
+  var c : f32;
+  var d : f32;
+  var x_67 : bool;
+  var x_68_phi : bool;
+  let x_37 : f32 = x_6.x_GLF_uniform_float_values[0];
+  a = x_37;
+  let x_39 : i32 = x_9.x_GLF_uniform_int_values[1];
+  i = x_39;
+  loop {
+    let x_44 : i32 = i;
+    let x_46 : i32 = x_9.x_GLF_uniform_int_values[0];
+    if ((x_44 < x_46)) {
+    } else {
+      break;
+    }
+    let x_49 : f32 = a;
+    b = x_49;
+    let x_50 : f32 = b;
+    c = x_50;
+    let x_51 : f32 = c;
+    d = asin(x_51);
+    let x_54 : f32 = x_6.x_GLF_uniform_float_values[1];
+    c = x_54;
+    let x_55 : f32 = d;
+    a = x_55;
+
+    continuing {
+      let x_56 : i32 = i;
+      i = (x_56 + 1);
+    }
+  }
+  let x_59 : f32 = x_6.x_GLF_uniform_float_values[2];
+  let x_60 : f32 = a;
+  let x_61 : bool = (x_59 < x_60);
+  x_68_phi = x_61;
+  if (x_61) {
+    let x_64 : f32 = a;
+    let x_66 : f32 = x_6.x_GLF_uniform_float_values[3];
+    x_67 = (x_64 < x_66);
+    x_68_phi = x_67;
+  }
+  let x_68 : bool = x_68_phi;
+  if (x_68) {
+    let x_73 : i32 = x_9.x_GLF_uniform_int_values[2];
+    let x_76 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_79 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_82 : i32 = x_9.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_73), f32(x_76), f32(x_79), f32(x_82));
+  } else {
+    let x_86 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_87 : f32 = f32(x_86);
+    x_GLF_color = vec4<f32>(x_87, x_87, x_87, x_87);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-vector-ops-asin/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-vector-ops-asin/0-opt.wgsl
new file mode 100644
index 0000000..d9201c6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-vector-ops-asin/0-opt.wgsl
@@ -0,0 +1,90 @@
+type Arr = [[stride(16)]] array<f32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : f32;
+  var i : i32;
+  var b : f32;
+  var c : f32;
+  var d : f32;
+  var x_67 : bool;
+  var x_68_phi : bool;
+  let x_37 : f32 = x_6.x_GLF_uniform_float_values[0];
+  a = x_37;
+  let x_39 : i32 = x_9.x_GLF_uniform_int_values[1];
+  i = x_39;
+  loop {
+    let x_44 : i32 = i;
+    let x_46 : i32 = x_9.x_GLF_uniform_int_values[0];
+    if ((x_44 < x_46)) {
+    } else {
+      break;
+    }
+    let x_49 : f32 = a;
+    b = x_49;
+    let x_50 : f32 = b;
+    c = x_50;
+    let x_51 : f32 = c;
+    d = asin(x_51);
+    let x_54 : f32 = x_6.x_GLF_uniform_float_values[1];
+    c = x_54;
+    let x_55 : f32 = d;
+    a = x_55;
+
+    continuing {
+      let x_56 : i32 = i;
+      i = (x_56 + 1);
+    }
+  }
+  let x_59 : f32 = x_6.x_GLF_uniform_float_values[2];
+  let x_60 : f32 = a;
+  let x_61 : bool = (x_59 < x_60);
+  x_68_phi = x_61;
+  if (x_61) {
+    let x_64 : f32 = a;
+    let x_66 : f32 = x_6.x_GLF_uniform_float_values[3];
+    x_67 = (x_64 < x_66);
+    x_68_phi = x_67;
+  }
+  let x_68 : bool = x_68_phi;
+  if (x_68) {
+    let x_73 : i32 = x_9.x_GLF_uniform_int_values[2];
+    let x_76 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_79 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_82 : i32 = x_9.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_73), f32(x_76), f32(x_79), f32(x_82));
+  } else {
+    let x_86 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_87 : f32 = f32(x_86);
+    x_GLF_color = vec4<f32>(x_87, x_87, x_87, x_87);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-vector-ops-asin/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-vector-ops-asin/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..0df7ca0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-vector-ops-asin/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,75 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[4];
+};
+cbuffer cbuffer_x_9 : register(b1, space0) {
+  uint4 x_9[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float a = 0.0f;
+  int i = 0;
+  float b = 0.0f;
+  float c = 0.0f;
+  float d = 0.0f;
+  bool x_67 = false;
+  bool x_68_phi = false;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_37 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  a = x_37;
+  const int x_39 = asint(x_9[1].x);
+  i = x_39;
+  while (true) {
+    const int x_44 = i;
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_46 = asint(x_9[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    if ((x_44 < x_46)) {
+    } else {
+      break;
+    }
+    b = a;
+    c = b;
+    d = asin(c);
+    const float x_54 = asfloat(x_6[1].x);
+    c = x_54;
+    a = d;
+    {
+      i = (i + 1);
+    }
+  }
+  const float x_59 = asfloat(x_6[2].x);
+  const bool x_61 = (x_59 < a);
+  x_68_phi = x_61;
+  if (x_61) {
+    const float x_64 = a;
+    const float x_66 = asfloat(x_6[3].x);
+    x_67 = (x_64 < x_66);
+    x_68_phi = x_67;
+  }
+  if (x_68_phi) {
+    const int x_73 = asint(x_9[2].x);
+    const int x_76 = asint(x_9[1].x);
+    const int x_79 = asint(x_9[1].x);
+    const int x_82 = asint(x_9[2].x);
+    x_GLF_color = float4(float(x_73), float(x_76), float(x_79), float(x_82));
+  } else {
+    const int x_86 = asint(x_9[1].x);
+    const float x_87 = float(x_86);
+    x_GLF_color = float4(x_87, x_87, x_87, x_87);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-vector-ops-asin/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-vector-ops-asin/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..ed3ad85
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-vector-ops-asin/0-opt.wgsl.expected.msl
@@ -0,0 +1,97 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_9, thread float4* const tint_symbol_4) {
+  float a = 0.0f;
+  int i = 0;
+  float b = 0.0f;
+  float c = 0.0f;
+  float d = 0.0f;
+  bool x_67 = false;
+  bool x_68_phi = false;
+  float const x_37 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  a = x_37;
+  int const x_39 = x_9.x_GLF_uniform_int_values.arr[1].el;
+  i = x_39;
+  while (true) {
+    int const x_44 = i;
+    int const x_46 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_44 < x_46)) {
+    } else {
+      break;
+    }
+    float const x_49 = a;
+    b = x_49;
+    float const x_50 = b;
+    c = x_50;
+    float const x_51 = c;
+    d = asin(x_51);
+    float const x_54 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    c = x_54;
+    float const x_55 = d;
+    a = x_55;
+    {
+      int const x_56 = i;
+      i = (x_56 + 1);
+    }
+  }
+  float const x_59 = x_6.x_GLF_uniform_float_values.arr[2].el;
+  float const x_60 = a;
+  bool const x_61 = (x_59 < x_60);
+  x_68_phi = x_61;
+  if (x_61) {
+    float const x_64 = a;
+    float const x_66 = x_6.x_GLF_uniform_float_values.arr[3].el;
+    x_67 = (x_64 < x_66);
+    x_68_phi = x_67;
+  }
+  bool const x_68 = x_68_phi;
+  if (x_68) {
+    int const x_73 = x_9.x_GLF_uniform_int_values.arr[2].el;
+    int const x_76 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_79 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_82 = x_9.x_GLF_uniform_int_values.arr[2].el;
+    *(tint_symbol_4) = float4(float(x_73), float(x_76), float(x_79), float(x_82));
+  } else {
+    int const x_86 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    float const x_87 = float(x_86);
+    *(tint_symbol_4) = float4(x_87, x_87, x_87, x_87);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_9 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-vector-ops-asin/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-vector-ops-asin/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..9bb8ae6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-vector-ops-asin/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,193 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 114
+; Schema: 0
+               OpCapability Shader
+         %62 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %d "d"
+               OpName %x_67 "x_67"
+               OpName %x_68_phi "x_68_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_4 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+       %buf0 = OpTypeStruct %_arr_float_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_9 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %26 = OpConstantNull %float
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %36 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+   %main_out = OpTypeStruct %v4float
+        %102 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function %26
+          %i = OpVariable %_ptr_Function_int Function %29
+          %b = OpVariable %_ptr_Function_float Function %26
+          %c = OpVariable %_ptr_Function_float Function %26
+          %d = OpVariable %_ptr_Function_float Function %26
+       %x_67 = OpVariable %_ptr_Function_bool Function %36
+   %x_68_phi = OpVariable %_ptr_Function_bool Function %36
+         %41 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %42 = OpLoad %float %41
+               OpStore %a %42
+         %45 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %46 = OpLoad %int %45
+               OpStore %i %46
+               OpBranch %47
+         %47 = OpLabel
+               OpLoopMerge %48 %49 None
+               OpBranch %50
+         %50 = OpLabel
+         %51 = OpLoad %int %i
+         %52 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %53 = OpLoad %int %52
+         %54 = OpSLessThan %bool %51 %53
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %57
+         %56 = OpLabel
+               OpBranch %55
+         %57 = OpLabel
+               OpBranch %48
+         %55 = OpLabel
+         %58 = OpLoad %float %a
+               OpStore %b %58
+         %59 = OpLoad %float %b
+               OpStore %c %59
+         %60 = OpLoad %float %c
+         %61 = OpExtInst %float %62 Asin %60
+               OpStore %d %61
+         %63 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %64 = OpLoad %float %63
+               OpStore %c %64
+         %65 = OpLoad %float %d
+               OpStore %a %65
+               OpBranch %49
+         %49 = OpLabel
+         %66 = OpLoad %int %i
+         %67 = OpIAdd %int %66 %int_1
+               OpStore %i %67
+               OpBranch %47
+         %48 = OpLabel
+         %69 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %70 = OpLoad %float %69
+         %71 = OpLoad %float %a
+         %72 = OpFOrdLessThan %bool %70 %71
+               OpStore %x_68_phi %72
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %74 %73
+         %74 = OpLabel
+         %75 = OpLoad %float %a
+         %77 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+         %78 = OpLoad %float %77
+         %79 = OpFOrdLessThan %bool %75 %78
+               OpStore %x_67 %79
+         %80 = OpLoad %bool %x_67
+               OpStore %x_68_phi %80
+               OpBranch %73
+         %73 = OpLabel
+         %81 = OpLoad %bool %x_68_phi
+               OpSelectionMerge %82 None
+               OpBranchConditional %81 %83 %84
+         %83 = OpLabel
+         %85 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_2
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %88 = OpLoad %int %87
+         %89 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %90 = OpLoad %int %89
+         %91 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_2
+         %92 = OpLoad %int %91
+         %93 = OpConvertSToF %float %86
+         %94 = OpConvertSToF %float %88
+         %95 = OpConvertSToF %float %90
+         %96 = OpConvertSToF %float %92
+         %97 = OpCompositeConstruct %v4float %93 %94 %95 %96
+               OpStore %x_GLF_color %97
+               OpBranch %82
+         %84 = OpLabel
+         %98 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %99 = OpLoad %int %98
+        %100 = OpConvertSToF %float %99
+        %101 = OpCompositeConstruct %v4float %100 %100 %100 %100
+               OpStore %x_GLF_color %101
+               OpBranch %82
+         %82 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %102
+%tint_symbol = OpFunctionParameter %main_out
+        %106 = OpLabel
+        %107 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %107
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %109 = OpLabel
+        %110 = OpFunctionCall %void %main_1
+        %112 = OpLoad %v4float %x_GLF_color
+        %113 = OpCompositeConstruct %main_out %112
+        %111 = OpFunctionCall %void %tint_symbol_2 %113
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-vector-ops-asin/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-vector-ops-asin/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..d9201c6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-combine-vector-ops-asin/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,90 @@
+type Arr = [[stride(16)]] array<f32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : f32;
+  var i : i32;
+  var b : f32;
+  var c : f32;
+  var d : f32;
+  var x_67 : bool;
+  var x_68_phi : bool;
+  let x_37 : f32 = x_6.x_GLF_uniform_float_values[0];
+  a = x_37;
+  let x_39 : i32 = x_9.x_GLF_uniform_int_values[1];
+  i = x_39;
+  loop {
+    let x_44 : i32 = i;
+    let x_46 : i32 = x_9.x_GLF_uniform_int_values[0];
+    if ((x_44 < x_46)) {
+    } else {
+      break;
+    }
+    let x_49 : f32 = a;
+    b = x_49;
+    let x_50 : f32 = b;
+    c = x_50;
+    let x_51 : f32 = c;
+    d = asin(x_51);
+    let x_54 : f32 = x_6.x_GLF_uniform_float_values[1];
+    c = x_54;
+    let x_55 : f32 = d;
+    a = x_55;
+
+    continuing {
+      let x_56 : i32 = i;
+      i = (x_56 + 1);
+    }
+  }
+  let x_59 : f32 = x_6.x_GLF_uniform_float_values[2];
+  let x_60 : f32 = a;
+  let x_61 : bool = (x_59 < x_60);
+  x_68_phi = x_61;
+  if (x_61) {
+    let x_64 : f32 = a;
+    let x_66 : f32 = x_6.x_GLF_uniform_float_values[3];
+    x_67 = (x_64 < x_66);
+    x_68_phi = x_67;
+  }
+  let x_68 : bool = x_68_phi;
+  if (x_68) {
+    let x_73 : i32 = x_9.x_GLF_uniform_int_values[2];
+    let x_76 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_79 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_82 : i32 = x_9.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_73), f32(x_76), f32(x_79), f32(x_82));
+  } else {
+    let x_86 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_87 : f32 = f32(x_86);
+    x_GLF_color = vec4<f32>(x_87, x_87, x_87, x_87);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-value-tracking-inversesqrt/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-value-tracking-inversesqrt/0-opt.spvasm
new file mode 100644
index 0000000..ca1e5df
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-value-tracking-inversesqrt/0-opt.spvasm
@@ -0,0 +1,64 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+   %float_n1 = OpConstant %float -1
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %8
+         %21 = OpLabel
+         %22 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %23 = OpLoad %float %22
+         %24 = OpExtInst %float %1 InverseSqrt %23
+         %25 = OpFOrdLessThan %bool %24 %float_n1
+               OpSelectionMerge %26 None
+               OpBranchConditional %25 %27 %28
+         %27 = OpLabel
+         %29 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %30 = OpLoad %float %29
+         %31 = OpCompositeConstruct %v4float %30 %30 %30 %30
+               OpStore %_GLF_color %31
+               OpBranch %26
+         %28 = OpLabel
+         %32 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %33 = OpLoad %float %32
+         %34 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %35 = OpLoad %float %34
+         %36 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %37 = OpLoad %float %36
+         %38 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %39 = OpLoad %float %38
+         %40 = OpCompositeConstruct %v4float %33 %35 %37 %39
+               OpStore %_GLF_color %40
+               OpBranch %26
+         %26 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-value-tracking-inversesqrt/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-value-tracking-inversesqrt/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..1f0d86f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-value-tracking-inversesqrt/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,36 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const float x_23 = asfloat(x_5[1].x);
+  if ((rsqrt(x_23) < -1.0f)) {
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const float x_30 = asfloat(x_5[scalar_offset / 4][scalar_offset % 4]);
+    x_GLF_color = float4(x_30, x_30, x_30, x_30);
+  } else {
+    const float x_33 = asfloat(x_5[1].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const float x_35 = asfloat(x_5[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const float x_37 = asfloat(x_5[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const float x_39 = asfloat(x_5[1].x);
+    x_GLF_color = float4(x_33, x_35, x_37, x_39);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-value-tracking-inversesqrt/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-value-tracking-inversesqrt/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..066a9d8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-value-tracking-inversesqrt/0-opt.spvasm.expected.msl
@@ -0,0 +1,43 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  float const x_23 = x_5.x_GLF_uniform_float_values.arr[1].el;
+  if ((rsqrt(x_23) < -1.0f)) {
+    float const x_30 = x_5.x_GLF_uniform_float_values.arr[0].el;
+    *(tint_symbol_4) = float4(x_30, x_30, x_30, x_30);
+  } else {
+    float const x_33 = x_5.x_GLF_uniform_float_values.arr[1].el;
+    float const x_35 = x_5.x_GLF_uniform_float_values.arr[0].el;
+    float const x_37 = x_5.x_GLF_uniform_float_values.arr[0].el;
+    float const x_39 = x_5.x_GLF_uniform_float_values.arr[1].el;
+    *(tint_symbol_4) = float4(x_33, x_35, x_37, x_39);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-value-tracking-inversesqrt/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-value-tracking-inversesqrt/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..91daf4a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-value-tracking-inversesqrt/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,97 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 57
+; Schema: 0
+               OpCapability Shader
+         %25 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %11 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %11
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %11
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+        %int = OpTypeInt 32 1
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+   %float_n1 = OpConstant %float -1
+       %bool = OpTypeBool
+      %int_0 = OpConstant %int 0
+   %main_out = OpTypeStruct %v4float
+         %45 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+         %22 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_1
+         %23 = OpLoad %float %22
+         %24 = OpExtInst %float %25 InverseSqrt %23
+         %27 = OpFOrdLessThan %bool %24 %float_n1
+               OpSelectionMerge %29 None
+               OpBranchConditional %27 %30 %31
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %34 = OpLoad %float %33
+         %35 = OpCompositeConstruct %v4float %34 %34 %34 %34
+               OpStore %x_GLF_color %35
+               OpBranch %29
+         %31 = OpLabel
+         %36 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_1
+         %37 = OpLoad %float %36
+         %38 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %39 = OpLoad %float %38
+         %40 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %41 = OpLoad %float %40
+         %42 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_1
+         %43 = OpLoad %float %42
+         %44 = OpCompositeConstruct %v4float %37 %39 %41 %43
+               OpStore %x_GLF_color %44
+               OpBranch %29
+         %29 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %45
+%tint_symbol = OpFunctionParameter %main_out
+         %49 = OpLabel
+         %50 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %50
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %52 = OpLabel
+         %53 = OpFunctionCall %void %main_1
+         %55 = OpLoad %v4float %x_GLF_color
+         %56 = OpCompositeConstruct %main_out %55
+         %54 = OpFunctionCall %void %tint_symbol_2 %56
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-value-tracking-inversesqrt/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-value-tracking-inversesqrt/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..239caf2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-value-tracking-inversesqrt/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,36 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_23 : f32 = x_5.x_GLF_uniform_float_values[1];
+  if ((inverseSqrt(x_23) < -1.0)) {
+    let x_30 : f32 = x_5.x_GLF_uniform_float_values[0];
+    x_GLF_color = vec4<f32>(x_30, x_30, x_30, x_30);
+  } else {
+    let x_33 : f32 = x_5.x_GLF_uniform_float_values[1];
+    let x_35 : f32 = x_5.x_GLF_uniform_float_values[0];
+    let x_37 : f32 = x_5.x_GLF_uniform_float_values[0];
+    let x_39 : f32 = x_5.x_GLF_uniform_float_values[1];
+    x_GLF_color = vec4<f32>(x_33, x_35, x_37, x_39);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-value-tracking-inversesqrt/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-value-tracking-inversesqrt/0-opt.wgsl
new file mode 100644
index 0000000..239caf2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-value-tracking-inversesqrt/0-opt.wgsl
@@ -0,0 +1,36 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_23 : f32 = x_5.x_GLF_uniform_float_values[1];
+  if ((inverseSqrt(x_23) < -1.0)) {
+    let x_30 : f32 = x_5.x_GLF_uniform_float_values[0];
+    x_GLF_color = vec4<f32>(x_30, x_30, x_30, x_30);
+  } else {
+    let x_33 : f32 = x_5.x_GLF_uniform_float_values[1];
+    let x_35 : f32 = x_5.x_GLF_uniform_float_values[0];
+    let x_37 : f32 = x_5.x_GLF_uniform_float_values[0];
+    let x_39 : f32 = x_5.x_GLF_uniform_float_values[1];
+    x_GLF_color = vec4<f32>(x_33, x_35, x_37, x_39);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-value-tracking-inversesqrt/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-value-tracking-inversesqrt/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..1f0d86f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-value-tracking-inversesqrt/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,36 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const float x_23 = asfloat(x_5[1].x);
+  if ((rsqrt(x_23) < -1.0f)) {
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const float x_30 = asfloat(x_5[scalar_offset / 4][scalar_offset % 4]);
+    x_GLF_color = float4(x_30, x_30, x_30, x_30);
+  } else {
+    const float x_33 = asfloat(x_5[1].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const float x_35 = asfloat(x_5[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const float x_37 = asfloat(x_5[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const float x_39 = asfloat(x_5[1].x);
+    x_GLF_color = float4(x_33, x_35, x_37, x_39);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-value-tracking-inversesqrt/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-inst-value-tracking-inversesqrt/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..066a9d8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-value-tracking-inversesqrt/0-opt.wgsl.expected.msl
@@ -0,0 +1,43 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  float const x_23 = x_5.x_GLF_uniform_float_values.arr[1].el;
+  if ((rsqrt(x_23) < -1.0f)) {
+    float const x_30 = x_5.x_GLF_uniform_float_values.arr[0].el;
+    *(tint_symbol_4) = float4(x_30, x_30, x_30, x_30);
+  } else {
+    float const x_33 = x_5.x_GLF_uniform_float_values.arr[1].el;
+    float const x_35 = x_5.x_GLF_uniform_float_values.arr[0].el;
+    float const x_37 = x_5.x_GLF_uniform_float_values.arr[0].el;
+    float const x_39 = x_5.x_GLF_uniform_float_values.arr[1].el;
+    *(tint_symbol_4) = float4(x_33, x_35, x_37, x_39);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-value-tracking-inversesqrt/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-inst-value-tracking-inversesqrt/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..91daf4a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-value-tracking-inversesqrt/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,97 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 57
+; Schema: 0
+               OpCapability Shader
+         %25 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %11 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %11
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %11
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+        %int = OpTypeInt 32 1
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+   %float_n1 = OpConstant %float -1
+       %bool = OpTypeBool
+      %int_0 = OpConstant %int 0
+   %main_out = OpTypeStruct %v4float
+         %45 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+         %22 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_1
+         %23 = OpLoad %float %22
+         %24 = OpExtInst %float %25 InverseSqrt %23
+         %27 = OpFOrdLessThan %bool %24 %float_n1
+               OpSelectionMerge %29 None
+               OpBranchConditional %27 %30 %31
+         %30 = OpLabel
+         %33 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %34 = OpLoad %float %33
+         %35 = OpCompositeConstruct %v4float %34 %34 %34 %34
+               OpStore %x_GLF_color %35
+               OpBranch %29
+         %31 = OpLabel
+         %36 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_1
+         %37 = OpLoad %float %36
+         %38 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %39 = OpLoad %float %38
+         %40 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %41 = OpLoad %float %40
+         %42 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_1
+         %43 = OpLoad %float %42
+         %44 = OpCompositeConstruct %v4float %37 %39 %41 %43
+               OpStore %x_GLF_color %44
+               OpBranch %29
+         %29 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %45
+%tint_symbol = OpFunctionParameter %main_out
+         %49 = OpLabel
+         %50 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %50
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %52 = OpLabel
+         %53 = OpFunctionCall %void %main_1
+         %55 = OpLoad %v4float %x_GLF_color
+         %56 = OpCompositeConstruct %main_out %55
+         %54 = OpFunctionCall %void %tint_symbol_2 %56
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-inst-value-tracking-inversesqrt/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-inst-value-tracking-inversesqrt/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..239caf2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-inst-value-tracking-inversesqrt/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,36 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_23 : f32 = x_5.x_GLF_uniform_float_values[1];
+  if ((inverseSqrt(x_23) < -1.0)) {
+    let x_30 : f32 = x_5.x_GLF_uniform_float_values[0];
+    x_GLF_color = vec4<f32>(x_30, x_30, x_30, x_30);
+  } else {
+    let x_33 : f32 = x_5.x_GLF_uniform_float_values[1];
+    let x_35 : f32 = x_5.x_GLF_uniform_float_values[0];
+    let x_37 : f32 = x_5.x_GLF_uniform_float_values[0];
+    let x_39 : f32 = x_5.x_GLF_uniform_float_values[1];
+    x_GLF_color = vec4<f32>(x_33, x_35, x_37, x_39);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-bit-shifting/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-bit-shifting/0-opt.spvasm
new file mode 100644
index 0000000..bb7ac95
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-bit-shifting/0-opt.spvasm
@@ -0,0 +1,77 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_5 = OpConstant %int 5
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %9
+         %23 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+         %24 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %25 = OpLoad %int %24
+         %26 = OpShiftLeftLogical %int %25 %int_5
+         %27 = OpShiftRightArithmetic %int %int_1 %26
+         %28 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %29 = OpLoad %int %28
+         %30 = OpShiftRightArithmetic %int %27 %29
+               OpStore %a %30
+         %31 = OpLoad %int %a
+         %32 = OpIEqual %bool %31 %int_1
+               OpSelectionMerge %33 None
+               OpBranchConditional %32 %34 %35
+         %34 = OpLabel
+         %36 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %37 = OpLoad %int %36
+         %38 = OpConvertSToF %float %37
+         %39 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %40 = OpLoad %int %39
+         %41 = OpConvertSToF %float %40
+         %42 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %43 = OpLoad %int %42
+         %44 = OpConvertSToF %float %43
+         %45 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %46 = OpLoad %int %45
+         %47 = OpConvertSToF %float %46
+         %48 = OpCompositeConstruct %v4float %38 %41 %44 %47
+               OpStore %_GLF_color %48
+               OpBranch %33
+         %35 = OpLabel
+         %49 = OpLoad %int %a
+         %50 = OpConvertSToF %float %49
+         %51 = OpCompositeConstruct %v4float %50 %50 %50 %50
+               OpStore %_GLF_color %51
+               OpBranch %33
+         %33 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-bit-shifting/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-bit-shifting/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..04d7fae
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-bit-shifting/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,40 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_25 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_29 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  a = ((1 >> asuint((x_25 << asuint(5)))) >> asuint(x_29));
+  if ((a == 1)) {
+    const int x_37 = asint(x_6[1].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_40 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_43 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const int x_46 = asint(x_6[1].x);
+    x_GLF_color = float4(float(x_37), float(x_40), float(x_43), float(x_46));
+  } else {
+    const float x_50 = float(a);
+    x_GLF_color = float4(x_50, x_50, x_50, x_50);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-bit-shifting/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-bit-shifting/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..0e0fb17
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-bit-shifting/0-opt.spvasm.expected.msl
@@ -0,0 +1,48 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int const x_25 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_29 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  a = ((1 >> as_type<uint>((x_25 << as_type<uint>(5)))) >> as_type<uint>(x_29));
+  int const x_31 = a;
+  if ((x_31 == 1)) {
+    int const x_37 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_40 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_43 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_46 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_37), float(x_40), float(x_43), float(x_46));
+  } else {
+    int const x_49 = a;
+    float const x_50 = float(x_49);
+    *(tint_symbol_4) = float4(x_50, x_50, x_50, x_50);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-bit-shifting/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-bit-shifting/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..22f831d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-bit-shifting/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,113 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 71
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+      %int_5 = OpConstant %int 5
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %v4float
+         %59 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+         %25 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %26 = OpLoad %int %25
+         %27 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %28 = OpLoad %int %27
+         %31 = OpBitcast %uint %int_5
+         %33 = OpShiftLeftLogical %int %26 %31
+         %30 = OpBitcast %uint %33
+         %34 = OpShiftRightArithmetic %int %int_1 %30
+         %35 = OpBitcast %uint %28
+         %36 = OpShiftRightArithmetic %int %34 %35
+               OpStore %a %36
+         %37 = OpLoad %int %a
+         %38 = OpIEqual %bool %37 %int_1
+               OpSelectionMerge %40 None
+               OpBranchConditional %38 %41 %42
+         %41 = OpLabel
+         %43 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %44 = OpLoad %int %43
+         %45 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %46 = OpLoad %int %45
+         %47 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %48 = OpLoad %int %47
+         %49 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %50 = OpLoad %int %49
+         %51 = OpConvertSToF %float %44
+         %52 = OpConvertSToF %float %46
+         %53 = OpConvertSToF %float %48
+         %54 = OpConvertSToF %float %50
+         %55 = OpCompositeConstruct %v4float %51 %52 %53 %54
+               OpStore %x_GLF_color %55
+               OpBranch %40
+         %42 = OpLabel
+         %56 = OpLoad %int %a
+         %57 = OpConvertSToF %float %56
+         %58 = OpCompositeConstruct %v4float %57 %57 %57 %57
+               OpStore %x_GLF_color %58
+               OpBranch %40
+         %40 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %59
+%tint_symbol = OpFunctionParameter %main_out
+         %63 = OpLabel
+         %64 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %64
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %66 = OpLabel
+         %67 = OpFunctionCall %void %main_1
+         %69 = OpLoad %v4float %x_GLF_color
+         %70 = OpCompositeConstruct %main_out %69
+         %68 = OpFunctionCall %void %tint_symbol_2 %70
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-bit-shifting/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-bit-shifting/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..32e102d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-bit-shifting/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,41 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  let x_25 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_29 : i32 = x_6.x_GLF_uniform_int_values[0];
+  a = ((1 >> bitcast<u32>((x_25 << bitcast<u32>(5)))) >> bitcast<u32>(x_29));
+  let x_31 : i32 = a;
+  if ((x_31 == 1)) {
+    let x_37 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_40 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_43 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_46 : i32 = x_6.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_37), f32(x_40), f32(x_43), f32(x_46));
+  } else {
+    let x_49 : i32 = a;
+    let x_50 : f32 = f32(x_49);
+    x_GLF_color = vec4<f32>(x_50, x_50, x_50, x_50);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-bit-shifting/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-bit-shifting/0-opt.wgsl
new file mode 100644
index 0000000..32e102d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-bit-shifting/0-opt.wgsl
@@ -0,0 +1,41 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  let x_25 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_29 : i32 = x_6.x_GLF_uniform_int_values[0];
+  a = ((1 >> bitcast<u32>((x_25 << bitcast<u32>(5)))) >> bitcast<u32>(x_29));
+  let x_31 : i32 = a;
+  if ((x_31 == 1)) {
+    let x_37 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_40 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_43 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_46 : i32 = x_6.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_37), f32(x_40), f32(x_43), f32(x_46));
+  } else {
+    let x_49 : i32 = a;
+    let x_50 : f32 = f32(x_49);
+    x_GLF_color = vec4<f32>(x_50, x_50, x_50, x_50);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-bit-shifting/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-bit-shifting/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..04d7fae
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-bit-shifting/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,40 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_25 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_29 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  a = ((1 >> asuint((x_25 << asuint(5)))) >> asuint(x_29));
+  if ((a == 1)) {
+    const int x_37 = asint(x_6[1].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_40 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_43 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const int x_46 = asint(x_6[1].x);
+    x_GLF_color = float4(float(x_37), float(x_40), float(x_43), float(x_46));
+  } else {
+    const float x_50 = float(a);
+    x_GLF_color = float4(x_50, x_50, x_50, x_50);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-bit-shifting/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-bit-shifting/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..0e0fb17
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-bit-shifting/0-opt.wgsl.expected.msl
@@ -0,0 +1,48 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int const x_25 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_29 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  a = ((1 >> as_type<uint>((x_25 << as_type<uint>(5)))) >> as_type<uint>(x_29));
+  int const x_31 = a;
+  if ((x_31 == 1)) {
+    int const x_37 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_40 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_43 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_46 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_37), float(x_40), float(x_43), float(x_46));
+  } else {
+    int const x_49 = a;
+    float const x_50 = float(x_49);
+    *(tint_symbol_4) = float4(x_50, x_50, x_50, x_50);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-bit-shifting/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-bit-shifting/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..22f831d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-bit-shifting/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,113 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 71
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+      %int_5 = OpConstant %int 5
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %v4float
+         %59 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+         %25 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %26 = OpLoad %int %25
+         %27 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %28 = OpLoad %int %27
+         %31 = OpBitcast %uint %int_5
+         %33 = OpShiftLeftLogical %int %26 %31
+         %30 = OpBitcast %uint %33
+         %34 = OpShiftRightArithmetic %int %int_1 %30
+         %35 = OpBitcast %uint %28
+         %36 = OpShiftRightArithmetic %int %34 %35
+               OpStore %a %36
+         %37 = OpLoad %int %a
+         %38 = OpIEqual %bool %37 %int_1
+               OpSelectionMerge %40 None
+               OpBranchConditional %38 %41 %42
+         %41 = OpLabel
+         %43 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %44 = OpLoad %int %43
+         %45 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %46 = OpLoad %int %45
+         %47 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %48 = OpLoad %int %47
+         %49 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %50 = OpLoad %int %49
+         %51 = OpConvertSToF %float %44
+         %52 = OpConvertSToF %float %46
+         %53 = OpConvertSToF %float %48
+         %54 = OpConvertSToF %float %50
+         %55 = OpCompositeConstruct %v4float %51 %52 %53 %54
+               OpStore %x_GLF_color %55
+               OpBranch %40
+         %42 = OpLabel
+         %56 = OpLoad %int %a
+         %57 = OpConvertSToF %float %56
+         %58 = OpCompositeConstruct %v4float %57 %57 %57 %57
+               OpStore %x_GLF_color %58
+               OpBranch %40
+         %40 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %59
+%tint_symbol = OpFunctionParameter %main_out
+         %63 = OpLabel
+         %64 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %64
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %66 = OpLabel
+         %67 = OpFunctionCall %void %main_1
+         %69 = OpLoad %v4float %x_GLF_color
+         %70 = OpCompositeConstruct %main_out %69
+         %68 = OpFunctionCall %void %tint_symbol_2 %70
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-bit-shifting/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-bit-shifting/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..32e102d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-bit-shifting/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,41 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  let x_25 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_29 : i32 = x_6.x_GLF_uniform_int_values[0];
+  a = ((1 >> bitcast<u32>((x_25 << bitcast<u32>(5)))) >> bitcast<u32>(x_29));
+  let x_31 : i32 = a;
+  if ((x_31 == 1)) {
+    let x_37 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_40 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_43 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_46 : i32 = x_6.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_37), f32(x_40), f32(x_43), f32(x_46));
+  } else {
+    let x_49 : i32 = a;
+    let x_50 : f32 = f32(x_49);
+    x_GLF_color = vec4<f32>(x_50, x_50, x_50, x_50);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inclusive-or/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inclusive-or/0-opt.spvasm
new file mode 100644
index 0000000..409dec0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inclusive-or/0-opt.spvasm
@@ -0,0 +1,92 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+    %v2float = OpTypeVector %float 2
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf1 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %12
+         %29 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function
+         %30 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %31 = OpLoad %int %30
+         %32 = OpConvertSToF %float %31
+         %33 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %34 = OpLoad %int %33
+         %35 = OpConvertSToF %float %34
+         %36 = OpCompositeConstruct %v2float %32 %35
+         %37 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %38 = OpLoad %int %37
+         %39 = OpBitwiseOr %int %38 %int_1
+         %40 = OpVectorExtractDynamic %float %36 %39
+               OpStore %a %40
+         %41 = OpLoad %float %a
+         %42 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %43 = OpLoad %float %42
+         %44 = OpFOrdEqual %bool %41 %43
+               OpSelectionMerge %45 None
+               OpBranchConditional %44 %46 %47
+         %46 = OpLabel
+         %48 = OpLoad %float %a
+         %49 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %50 = OpLoad %int %49
+         %51 = OpConvertSToF %float %50
+         %52 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %53 = OpLoad %int %52
+         %54 = OpConvertSToF %float %53
+         %55 = OpLoad %float %a
+         %56 = OpCompositeConstruct %v4float %48 %51 %54 %55
+               OpStore %_GLF_color %56
+               OpBranch %45
+         %47 = OpLabel
+         %57 = OpLoad %float %a
+         %58 = OpCompositeConstruct %v4float %57 %57 %57 %57
+               OpStore %_GLF_color %58
+               OpBranch %45
+         %45 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inclusive-or/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inclusive-or/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..f1391e1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inclusive-or/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,46 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float a = 0.0f;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_31 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const int x_34 = asint(x_6[1].x);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_38 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  a = float2(float(x_31), float(x_34))[(x_38 | 1)];
+  const float x_41 = a;
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const float x_43 = asfloat(x_8[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  if ((x_41 == x_43)) {
+    const float x_48 = a;
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_50 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_53 = asint(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    x_GLF_color = float4(x_48, float(x_50), float(x_53), a);
+  } else {
+    const float x_57 = a;
+    x_GLF_color = float4(x_57, x_57, x_57, x_57);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inclusive-or/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inclusive-or/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..a588885
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inclusive-or/0-opt.spvasm.expected.msl
@@ -0,0 +1,59 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_8, thread float4* const tint_symbol_4) {
+  float a = 0.0f;
+  int const x_31 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_34 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_38 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  a = float2(float(x_31), float(x_34))[(x_38 | 1)];
+  float const x_41 = a;
+  float const x_43 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_41 == x_43)) {
+    float const x_48 = a;
+    int const x_50 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_53 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    float const x_55 = a;
+    *(tint_symbol_4) = float4(x_48, float(x_50), float(x_53), x_55);
+  } else {
+    float const x_57 = a;
+    *(tint_symbol_4) = float4(x_57, x_57, x_57, x_57);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_8 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inclusive-or/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inclusive-or/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..065f841
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inclusive-or/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,126 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 75
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf1 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %26 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+    %v2float = OpTypeVector %float 2
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %v4float
+         %63 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function %26
+         %30 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %31 = OpLoad %int %30
+         %33 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %34 = OpLoad %int %33
+         %35 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %36 = OpLoad %int %35
+         %38 = OpConvertSToF %float %31
+         %39 = OpConvertSToF %float %34
+         %40 = OpCompositeConstruct %v2float %38 %39
+         %41 = OpBitwiseOr %int %36 %int_1
+         %42 = OpVectorExtractDynamic %float %40 %41
+               OpStore %a %42
+         %43 = OpLoad %float %a
+         %45 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %46 = OpLoad %float %45
+         %47 = OpFOrdEqual %bool %43 %46
+               OpSelectionMerge %49 None
+               OpBranchConditional %47 %50 %51
+         %50 = OpLabel
+         %52 = OpLoad %float %a
+         %53 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %54 = OpLoad %int %53
+         %55 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %56 = OpLoad %int %55
+         %57 = OpLoad %float %a
+         %58 = OpConvertSToF %float %54
+         %59 = OpConvertSToF %float %56
+         %60 = OpCompositeConstruct %v4float %52 %58 %59 %57
+               OpStore %x_GLF_color %60
+               OpBranch %49
+         %51 = OpLabel
+         %61 = OpLoad %float %a
+         %62 = OpCompositeConstruct %v4float %61 %61 %61 %61
+               OpStore %x_GLF_color %62
+               OpBranch %49
+         %49 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %63
+%tint_symbol = OpFunctionParameter %main_out
+         %67 = OpLabel
+         %68 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %68
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+         %70 = OpLabel
+         %71 = OpFunctionCall %void %main_1
+         %73 = OpLoad %v4float %x_GLF_color
+         %74 = OpCompositeConstruct %main_out %73
+         %72 = OpFunctionCall %void %tint_symbol_2 %74
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inclusive-or/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inclusive-or/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..1210250
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inclusive-or/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,51 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : f32;
+  let x_31 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_34 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_38 : i32 = x_6.x_GLF_uniform_int_values[0];
+  a = vec2<f32>(f32(x_31), f32(x_34))[(x_38 | 1)];
+  let x_41 : f32 = a;
+  let x_43 : f32 = x_8.x_GLF_uniform_float_values[0];
+  if ((x_41 == x_43)) {
+    let x_48 : f32 = a;
+    let x_50 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_53 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_55 : f32 = a;
+    x_GLF_color = vec4<f32>(x_48, f32(x_50), f32(x_53), x_55);
+  } else {
+    let x_57 : f32 = a;
+    x_GLF_color = vec4<f32>(x_57, x_57, x_57, x_57);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inclusive-or/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inclusive-or/0-opt.wgsl
new file mode 100644
index 0000000..1210250
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inclusive-or/0-opt.wgsl
@@ -0,0 +1,51 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : f32;
+  let x_31 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_34 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_38 : i32 = x_6.x_GLF_uniform_int_values[0];
+  a = vec2<f32>(f32(x_31), f32(x_34))[(x_38 | 1)];
+  let x_41 : f32 = a;
+  let x_43 : f32 = x_8.x_GLF_uniform_float_values[0];
+  if ((x_41 == x_43)) {
+    let x_48 : f32 = a;
+    let x_50 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_53 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_55 : f32 = a;
+    x_GLF_color = vec4<f32>(x_48, f32(x_50), f32(x_53), x_55);
+  } else {
+    let x_57 : f32 = a;
+    x_GLF_color = vec4<f32>(x_57, x_57, x_57, x_57);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inclusive-or/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inclusive-or/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..f1391e1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inclusive-or/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,46 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float a = 0.0f;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_31 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const int x_34 = asint(x_6[1].x);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_38 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  a = float2(float(x_31), float(x_34))[(x_38 | 1)];
+  const float x_41 = a;
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const float x_43 = asfloat(x_8[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  if ((x_41 == x_43)) {
+    const float x_48 = a;
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_50 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_53 = asint(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    x_GLF_color = float4(x_48, float(x_50), float(x_53), a);
+  } else {
+    const float x_57 = a;
+    x_GLF_color = float4(x_57, x_57, x_57, x_57);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inclusive-or/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inclusive-or/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..a588885
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inclusive-or/0-opt.wgsl.expected.msl
@@ -0,0 +1,59 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_8, thread float4* const tint_symbol_4) {
+  float a = 0.0f;
+  int const x_31 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_34 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_38 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  a = float2(float(x_31), float(x_34))[(x_38 | 1)];
+  float const x_41 = a;
+  float const x_43 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_41 == x_43)) {
+    float const x_48 = a;
+    int const x_50 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_53 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    float const x_55 = a;
+    *(tint_symbol_4) = float4(x_48, float(x_50), float(x_53), x_55);
+  } else {
+    float const x_57 = a;
+    *(tint_symbol_4) = float4(x_57, x_57, x_57, x_57);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_8 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inclusive-or/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inclusive-or/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..065f841
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inclusive-or/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,126 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 75
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf1 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %26 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+    %v2float = OpTypeVector %float 2
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %v4float
+         %63 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function %26
+         %30 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %31 = OpLoad %int %30
+         %33 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %34 = OpLoad %int %33
+         %35 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %36 = OpLoad %int %35
+         %38 = OpConvertSToF %float %31
+         %39 = OpConvertSToF %float %34
+         %40 = OpCompositeConstruct %v2float %38 %39
+         %41 = OpBitwiseOr %int %36 %int_1
+         %42 = OpVectorExtractDynamic %float %40 %41
+               OpStore %a %42
+         %43 = OpLoad %float %a
+         %45 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %46 = OpLoad %float %45
+         %47 = OpFOrdEqual %bool %43 %46
+               OpSelectionMerge %49 None
+               OpBranchConditional %47 %50 %51
+         %50 = OpLabel
+         %52 = OpLoad %float %a
+         %53 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %54 = OpLoad %int %53
+         %55 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %56 = OpLoad %int %55
+         %57 = OpLoad %float %a
+         %58 = OpConvertSToF %float %54
+         %59 = OpConvertSToF %float %56
+         %60 = OpCompositeConstruct %v4float %52 %58 %59 %57
+               OpStore %x_GLF_color %60
+               OpBranch %49
+         %51 = OpLabel
+         %61 = OpLoad %float %a
+         %62 = OpCompositeConstruct %v4float %61 %61 %61 %61
+               OpStore %x_GLF_color %62
+               OpBranch %49
+         %49 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %63
+%tint_symbol = OpFunctionParameter %main_out
+         %67 = OpLabel
+         %68 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %68
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+         %70 = OpLabel
+         %71 = OpFunctionCall %void %main_1
+         %73 = OpLoad %v4float %x_GLF_color
+         %74 = OpCompositeConstruct %main_out %73
+         %72 = OpFunctionCall %void %tint_symbol_2 %74
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inclusive-or/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inclusive-or/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..1210250
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inclusive-or/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,51 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : f32;
+  let x_31 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_34 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_38 : i32 = x_6.x_GLF_uniform_int_values[0];
+  a = vec2<f32>(f32(x_31), f32(x_34))[(x_38 | 1)];
+  let x_41 : f32 = a;
+  let x_43 : f32 = x_8.x_GLF_uniform_float_values[0];
+  if ((x_41 == x_43)) {
+    let x_48 : f32 = a;
+    let x_50 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_53 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_55 : f32 = a;
+    x_GLF_color = vec4<f32>(x_48, f32(x_50), f32(x_53), x_55);
+  } else {
+    let x_57 : f32 = a;
+    x_GLF_color = vec4<f32>(x_57, x_57, x_57, x_57);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inst-combine-calls-for-compare-function-call-result/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inst-combine-calls-for-compare-function-call-result/0-opt.spvasm
new file mode 100644
index 0000000..6ac9b0c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inst-combine-calls-for-compare-function-call-result/0-opt.spvasm
@@ -0,0 +1,407 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %f_i1_ "f(i1;"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %ref "ref"
+               OpName %i_0 "i"
+               OpName %a_0 "a"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %i_1 "i"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %f_i1_ RelaxedPrecision
+               OpDecorate %a RelaxedPrecision
+               OpDecorate %i RelaxedPrecision
+               OpDecorate %_arr_int_uint_12 ArrayStride 16
+               OpMemberDecorate %buf0 0 RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %16 RelaxedPrecision
+               OpDecorate %17 RelaxedPrecision
+               OpDecorate %18 RelaxedPrecision
+               OpDecorate %19 RelaxedPrecision
+               OpDecorate %20 RelaxedPrecision
+               OpDecorate %21 RelaxedPrecision
+               OpDecorate %22 RelaxedPrecision
+               OpDecorate %23 RelaxedPrecision
+               OpDecorate %24 RelaxedPrecision
+               OpDecorate %ref RelaxedPrecision
+               OpDecorate %25 RelaxedPrecision
+               OpDecorate %26 RelaxedPrecision
+               OpDecorate %27 RelaxedPrecision
+               OpDecorate %28 RelaxedPrecision
+               OpDecorate %29 RelaxedPrecision
+               OpDecorate %30 RelaxedPrecision
+               OpDecorate %31 RelaxedPrecision
+               OpDecorate %32 RelaxedPrecision
+               OpDecorate %33 RelaxedPrecision
+               OpDecorate %34 RelaxedPrecision
+               OpDecorate %35 RelaxedPrecision
+               OpDecorate %36 RelaxedPrecision
+               OpDecorate %37 RelaxedPrecision
+               OpDecorate %38 RelaxedPrecision
+               OpDecorate %39 RelaxedPrecision
+               OpDecorate %40 RelaxedPrecision
+               OpDecorate %41 RelaxedPrecision
+               OpDecorate %42 RelaxedPrecision
+               OpDecorate %43 RelaxedPrecision
+               OpDecorate %44 RelaxedPrecision
+               OpDecorate %i_0 RelaxedPrecision
+               OpDecorate %45 RelaxedPrecision
+               OpDecorate %46 RelaxedPrecision
+               OpDecorate %47 RelaxedPrecision
+               OpDecorate %a_0 RelaxedPrecision
+               OpDecorate %48 RelaxedPrecision
+               OpDecorate %49 RelaxedPrecision
+               OpDecorate %50 RelaxedPrecision
+               OpDecorate %51 RelaxedPrecision
+               OpDecorate %52 RelaxedPrecision
+               OpDecorate %53 RelaxedPrecision
+               OpDecorate %54 RelaxedPrecision
+               OpDecorate %55 RelaxedPrecision
+               OpDecorate %56 RelaxedPrecision
+               OpDecorate %57 RelaxedPrecision
+               OpDecorate %58 RelaxedPrecision
+               OpDecorate %59 RelaxedPrecision
+               OpDecorate %60 RelaxedPrecision
+               OpDecorate %61 RelaxedPrecision
+               OpDecorate %62 RelaxedPrecision
+               OpDecorate %63 RelaxedPrecision
+               OpDecorate %64 RelaxedPrecision
+               OpDecorate %65 RelaxedPrecision
+               OpDecorate %66 RelaxedPrecision
+               OpDecorate %67 RelaxedPrecision
+               OpDecorate %68 RelaxedPrecision
+               OpDecorate %69 RelaxedPrecision
+               OpDecorate %70 RelaxedPrecision
+               OpDecorate %71 RelaxedPrecision
+               OpDecorate %72 RelaxedPrecision
+               OpDecorate %73 RelaxedPrecision
+               OpDecorate %74 RelaxedPrecision
+               OpDecorate %75 RelaxedPrecision
+               OpDecorate %76 RelaxedPrecision
+               OpDecorate %77 RelaxedPrecision
+               OpDecorate %78 RelaxedPrecision
+               OpDecorate %79 RelaxedPrecision
+               OpDecorate %80 RelaxedPrecision
+               OpDecorate %i_1 RelaxedPrecision
+               OpDecorate %81 RelaxedPrecision
+               OpDecorate %82 RelaxedPrecision
+               OpDecorate %83 RelaxedPrecision
+               OpDecorate %84 RelaxedPrecision
+               OpDecorate %85 RelaxedPrecision
+               OpDecorate %86 RelaxedPrecision
+               OpDecorate %87 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %88 RelaxedPrecision
+               OpDecorate %89 RelaxedPrecision
+               OpDecorate %90 RelaxedPrecision
+               OpDecorate %91 RelaxedPrecision
+               OpDecorate %92 RelaxedPrecision
+               OpDecorate %93 RelaxedPrecision
+               OpDecorate %94 RelaxedPrecision
+       %void = OpTypeVoid
+         %96 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %99 = OpTypeFunction %int %_ptr_Function_int
+       %uint = OpTypeInt 32 0
+    %uint_12 = OpConstant %uint 12
+%_arr_int_uint_12 = OpTypeArray %int %uint_12
+       %buf0 = OpTypeStruct %_arr_int_uint_12
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_6 = OpConstant %int 6
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+      %int_1 = OpConstant %int 1
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+     %int_11 = OpConstant %int 11
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+      %int_9 = OpConstant %int 9
+     %int_10 = OpConstant %int 10
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %96
+        %123 = OpLabel
+        %ref = OpVariable %_ptr_Function__arr_int_uint_10 Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+        %a_0 = OpVariable %_ptr_Function__arr_int_uint_10 Function
+      %param = OpVariable %_ptr_Function_int Function
+    %param_0 = OpVariable %_ptr_Function_int Function
+        %i_1 = OpVariable %_ptr_Function_int Function
+        %124 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %25 = OpLoad %int %124
+        %125 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %26 = OpLoad %int %125
+        %126 = OpAccessChain %_ptr_Function_int %ref %25
+               OpStore %126 %26
+        %127 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_11
+         %27 = OpLoad %int %127
+        %128 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %28 = OpLoad %int %128
+        %129 = OpAccessChain %_ptr_Function_int %ref %27
+               OpStore %129 %28
+        %130 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %29 = OpLoad %int %130
+        %131 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %30 = OpLoad %int %131
+        %132 = OpAccessChain %_ptr_Function_int %ref %29
+               OpStore %132 %30
+        %133 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %31 = OpLoad %int %133
+        %134 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_4
+         %32 = OpLoad %int %134
+        %135 = OpAccessChain %_ptr_Function_int %ref %31
+               OpStore %135 %32
+        %136 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %33 = OpLoad %int %136
+        %137 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_5
+         %34 = OpLoad %int %137
+        %138 = OpAccessChain %_ptr_Function_int %ref %33
+               OpStore %138 %34
+        %139 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_4
+         %35 = OpLoad %int %139
+        %140 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_6
+         %36 = OpLoad %int %140
+        %141 = OpAccessChain %_ptr_Function_int %ref %35
+               OpStore %141 %36
+        %142 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_5
+         %37 = OpLoad %int %142
+        %143 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_7
+         %38 = OpLoad %int %143
+        %144 = OpAccessChain %_ptr_Function_int %ref %37
+               OpStore %144 %38
+        %145 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_8
+         %39 = OpLoad %int %145
+        %146 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_8
+         %40 = OpLoad %int %146
+        %147 = OpAccessChain %_ptr_Function_int %ref %39
+               OpStore %147 %40
+        %148 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_9
+         %41 = OpLoad %int %148
+        %149 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_9
+         %42 = OpLoad %int %149
+        %150 = OpAccessChain %_ptr_Function_int %ref %41
+               OpStore %150 %42
+        %151 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_10
+         %43 = OpLoad %int %151
+        %152 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_10
+         %44 = OpLoad %int %152
+        %153 = OpAccessChain %_ptr_Function_int %ref %43
+               OpStore %153 %44
+        %154 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %45 = OpLoad %int %154
+               OpStore %i_0 %45
+               OpBranch %155
+        %155 = OpLabel
+               OpLoopMerge %156 %157 None
+               OpBranch %158
+        %158 = OpLabel
+         %46 = OpLoad %int %i_0
+        %159 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_6
+         %47 = OpLoad %int %159
+        %160 = OpSLessThan %bool %46 %47
+               OpBranchConditional %160 %161 %156
+        %161 = OpLabel
+         %48 = OpLoad %int %i_0
+         %49 = OpLoad %int %i_0
+        %162 = OpAccessChain %_ptr_Function_int %a_0 %48
+               OpStore %162 %49
+         %50 = OpLoad %int %i_0
+        %163 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_6
+         %51 = OpLoad %int %163
+        %164 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %52 = OpLoad %int %164
+         %53 = OpSDiv %int %51 %52
+        %165 = OpSLessThan %bool %50 %53
+               OpSelectionMerge %166 None
+               OpBranchConditional %165 %167 %168
+        %167 = OpLabel
+         %54 = OpLoad %int %i_0
+         %55 = OpLoad %int %i_0
+        %169 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %56 = OpLoad %int %169
+         %57 = OpIAdd %int %55 %56
+        %170 = OpAccessChain %_ptr_Function_int %a_0 %54
+               OpStore %170 %57
+         %58 = OpLoad %int %i_0
+        %171 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_6
+         %59 = OpLoad %int %171
+        %172 = OpSLessThan %bool %58 %59
+               OpSelectionMerge %173 None
+               OpBranchConditional %172 %174 %173
+        %174 = OpLabel
+               OpBranch %157
+        %173 = OpLabel
+         %60 = OpLoad %int %i_0
+         %61 = OpLoad %int %i_0
+        %175 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_8
+         %62 = OpLoad %int %175
+         %63 = OpIAdd %int %61 %62
+        %176 = OpAccessChain %_ptr_Function_int %a_0 %60
+               OpStore %176 %63
+         %64 = OpLoad %int %i_0
+        %177 = OpAccessChain %_ptr_Function_int %a_0 %64
+         %65 = OpLoad %int %177
+               OpStore %param %65
+         %66 = OpFunctionCall %int %f_i1_ %param
+        %178 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_8
+         %67 = OpLoad %int %178
+        %179 = OpSLessThan %bool %66 %67
+               OpSelectionMerge %180 None
+               OpBranchConditional %179 %181 %180
+        %181 = OpLabel
+         %68 = OpLoad %int %i_0
+        %182 = OpAccessChain %_ptr_Function_int %a_0 %68
+         %69 = OpLoad %int %182
+         %70 = OpISub %int %69 %int_1
+               OpStore %182 %70
+               OpBranch %180
+        %180 = OpLabel
+               OpBranch %166
+        %168 = OpLabel
+         %71 = OpLoad %int %i_0
+        %183 = OpAccessChain %_ptr_Function_int %a_0 %71
+         %72 = OpLoad %int %183
+               OpStore %param_0 %72
+         %73 = OpFunctionCall %int %f_i1_ %param_0
+        %184 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_8
+         %74 = OpLoad %int %184
+        %185 = OpSLessThan %bool %73 %74
+               OpSelectionMerge %186 None
+               OpBranchConditional %185 %187 %186
+        %187 = OpLabel
+         %75 = OpLoad %int %i_0
+        %188 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_4
+         %76 = OpLoad %int %188
+        %189 = OpAccessChain %_ptr_Function_int %a_0 %75
+         %77 = OpLoad %int %189
+         %78 = OpIAdd %int %77 %76
+        %190 = OpAccessChain %_ptr_Function_int %a_0 %75
+               OpStore %190 %78
+               OpBranch %186
+        %186 = OpLabel
+               OpBranch %166
+        %166 = OpLabel
+               OpBranch %157
+        %157 = OpLabel
+         %79 = OpLoad %int %i_0
+         %80 = OpIAdd %int %79 %int_1
+               OpStore %i_0 %80
+               OpBranch %155
+        %156 = OpLabel
+        %191 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %81 = OpLoad %int %191
+               OpStore %i_1 %81
+               OpBranch %192
+        %192 = OpLabel
+               OpLoopMerge %193 %194 None
+               OpBranch %195
+        %195 = OpLabel
+         %82 = OpLoad %int %i_1
+        %196 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_6
+         %83 = OpLoad %int %196
+        %197 = OpSLessThan %bool %82 %83
+               OpBranchConditional %197 %198 %193
+        %198 = OpLabel
+         %84 = OpLoad %int %i_1
+        %199 = OpAccessChain %_ptr_Function_int %a_0 %84
+         %85 = OpLoad %int %199
+         %86 = OpLoad %int %i_1
+        %200 = OpAccessChain %_ptr_Function_int %ref %86
+         %87 = OpLoad %int %200
+        %201 = OpINotEqual %bool %85 %87
+               OpSelectionMerge %202 None
+               OpBranchConditional %201 %203 %202
+        %203 = OpLabel
+        %204 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %88 = OpLoad %int %204
+        %205 = OpConvertSToF %float %88
+        %206 = OpCompositeConstruct %v4float %205 %205 %205 %205
+               OpStore %_GLF_color %206
+               OpReturn
+        %202 = OpLabel
+               OpBranch %194
+        %194 = OpLabel
+         %89 = OpLoad %int %i_1
+         %90 = OpIAdd %int %89 %int_1
+               OpStore %i_1 %90
+               OpBranch %192
+        %193 = OpLabel
+        %207 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_11
+         %91 = OpLoad %int %207
+        %208 = OpConvertSToF %float %91
+        %209 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %92 = OpLoad %int %209
+        %210 = OpConvertSToF %float %92
+        %211 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %93 = OpLoad %int %211
+        %212 = OpConvertSToF %float %93
+        %213 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_11
+         %94 = OpLoad %int %213
+        %214 = OpConvertSToF %float %94
+        %215 = OpCompositeConstruct %v4float %208 %210 %212 %214
+               OpStore %_GLF_color %215
+               OpReturn
+               OpFunctionEnd
+      %f_i1_ = OpFunction %int None %99
+          %a = OpFunctionParameter %_ptr_Function_int
+        %216 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+        %217 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %16 = OpLoad %int %217
+               OpStore %i %16
+               OpBranch %218
+        %218 = OpLabel
+               OpLoopMerge %219 %220 None
+               OpBranch %221
+        %221 = OpLabel
+         %17 = OpLoad %int %i
+        %222 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_6
+         %18 = OpLoad %int %222
+        %223 = OpSLessThan %bool %17 %18
+               OpBranchConditional %223 %224 %219
+        %224 = OpLabel
+         %19 = OpLoad %int %i
+        %225 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %20 = OpLoad %int %225
+        %226 = OpSGreaterThan %bool %19 %20
+               OpSelectionMerge %227 None
+               OpBranchConditional %226 %228 %227
+        %228 = OpLabel
+         %21 = OpLoad %int %a
+               OpReturnValue %21
+        %227 = OpLabel
+               OpBranch %220
+        %220 = OpLabel
+         %22 = OpLoad %int %i
+         %23 = OpIAdd %int %22 %int_1
+               OpStore %i %23
+               OpBranch %218
+        %219 = OpLabel
+        %229 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %24 = OpLoad %int %229
+               OpReturnValue %24
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inst-combine-calls-for-compare-function-call-result/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inst-combine-calls-for-compare-function-call-result/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..d5ea2b6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inst-combine-calls-for-compare-function-call-result/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,172 @@
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[12];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+int f_i1_(inout int a) {
+  int i = 0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_16 = asint(x_8[scalar_offset / 4][scalar_offset % 4]);
+  i = x_16;
+  while (true) {
+    const int x_17 = i;
+    const int x_18 = asint(x_8[6].x);
+    if ((x_17 < x_18)) {
+    } else {
+      break;
+    }
+    const int x_19 = i;
+    const int x_20 = asint(x_8[2].x);
+    if ((x_19 > x_20)) {
+      const int x_21 = a;
+      return x_21;
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_24 = asint(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  return x_24;
+}
+
+void main_1() {
+  int ref[10] = (int[10])0;
+  int i_1 = 0;
+  int a_1[10] = (int[10])0;
+  int param = 0;
+  int param_1 = 0;
+  int i_2 = 0;
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const int x_25 = asint(x_8[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  const int x_26 = asint(x_8[1].x);
+  ref[x_25] = x_26;
+  const int x_27 = asint(x_8[11].x);
+  const int x_28 = asint(x_8[2].x);
+  ref[x_27] = x_28;
+  const int x_29 = asint(x_8[1].x);
+  const int x_30 = asint(x_8[3].x);
+  ref[x_29] = x_30;
+  const int x_31 = asint(x_8[2].x);
+  const int x_32 = asint(x_8[4].x);
+  ref[x_31] = x_32;
+  const int x_33 = asint(x_8[3].x);
+  const int x_34 = asint(x_8[5].x);
+  ref[x_33] = x_34;
+  const int x_35 = asint(x_8[4].x);
+  const int x_36 = asint(x_8[6].x);
+  ref[x_35] = x_36;
+  const int x_37 = asint(x_8[5].x);
+  const int x_38 = asint(x_8[7].x);
+  ref[x_37] = x_38;
+  const int x_39 = asint(x_8[8].x);
+  const int x_40 = asint(x_8[8].x);
+  ref[x_39] = x_40;
+  const int x_41 = asint(x_8[9].x);
+  const int x_42 = asint(x_8[9].x);
+  ref[x_41] = x_42;
+  const int x_43 = asint(x_8[10].x);
+  const int x_44 = asint(x_8[10].x);
+  ref[x_43] = x_44;
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const int x_45 = asint(x_8[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  i_1 = x_45;
+  while (true) {
+    const int x_46 = i_1;
+    const int x_47 = asint(x_8[6].x);
+    if ((x_46 < x_47)) {
+    } else {
+      break;
+    }
+    a_1[i_1] = i_1;
+    const int x_50 = i_1;
+    const int x_51 = asint(x_8[6].x);
+    const int x_52 = asint(x_8[1].x);
+    if ((x_50 < (x_51 / x_52))) {
+      const int x_54 = i_1;
+      const int x_55 = i_1;
+      const int x_56 = asint(x_8[1].x);
+      a_1[x_54] = (x_55 + x_56);
+      const int x_58 = i_1;
+      const int x_59 = asint(x_8[6].x);
+      if ((x_58 < x_59)) {
+        {
+          i_1 = (i_1 + 1);
+        }
+        continue;
+      }
+      const int x_60 = i_1;
+      const int x_61 = i_1;
+      const int x_62 = asint(x_8[8].x);
+      a_1[x_60] = (x_61 + x_62);
+      const int x_65 = a_1[i_1];
+      param = x_65;
+      const int x_66 = f_i1_(param);
+      const int x_67 = asint(x_8[8].x);
+      if ((x_66 < x_67)) {
+        const int x_182_save = i_1;
+        const int x_69 = a_1[x_182_save];
+        a_1[x_182_save] = (x_69 - 1);
+      }
+    } else {
+      const int x_72 = a_1[i_1];
+      param_1 = x_72;
+      const int x_73 = f_i1_(param_1);
+      const int x_74 = asint(x_8[8].x);
+      if ((x_73 < x_74)) {
+        const int x_75 = i_1;
+        const int x_76 = asint(x_8[4].x);
+        const int x_77 = a_1[x_75];
+        a_1[x_75] = (x_77 + x_76);
+      }
+    }
+    {
+      i_1 = (i_1 + 1);
+    }
+  }
+  const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+  const int x_81 = asint(x_8[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+  i_2 = x_81;
+  while (true) {
+    const int x_82 = i_2;
+    const int x_83 = asint(x_8[6].x);
+    if ((x_82 < x_83)) {
+    } else {
+      break;
+    }
+    const int x_85 = a_1[i_2];
+    const int x_87 = ref[i_2];
+    if ((x_85 != x_87)) {
+      const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+      const int x_88 = asint(x_8[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+      const float x_205 = float(x_88);
+      x_GLF_color = float4(x_205, x_205, x_205, x_205);
+      return;
+    }
+    {
+      i_2 = (i_2 + 1);
+    }
+  }
+  const int x_91 = asint(x_8[11].x);
+  const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+  const int x_92 = asint(x_8[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+  const uint scalar_offset_7 = ((16u * uint(0))) / 4;
+  const int x_93 = asint(x_8[scalar_offset_7 / 4][scalar_offset_7 % 4]);
+  const int x_94 = asint(x_8[11].x);
+  x_GLF_color = float4(float(x_91), float(x_92), float(x_93), float(x_94));
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inst-combine-calls-for-compare-function-call-result/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inst-combine-calls-for-compare-function-call-result/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..6399b00
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inst-combine-calls-for-compare-function-call-result/0-opt.spvasm.expected.msl
@@ -0,0 +1,188 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[12];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_1 {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int f_i1_(constant buf0& x_8, thread int* const a) {
+  int i = 0;
+  int const x_16 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  i = x_16;
+  while (true) {
+    int const x_17 = i;
+    int const x_18 = x_8.x_GLF_uniform_int_values.arr[6].el;
+    if ((x_17 < x_18)) {
+    } else {
+      break;
+    }
+    int const x_19 = i;
+    int const x_20 = x_8.x_GLF_uniform_int_values.arr[2].el;
+    if ((x_19 > x_20)) {
+      int const x_21 = *(a);
+      return x_21;
+    }
+    {
+      int const x_22 = i;
+      i = (x_22 + 1);
+    }
+  }
+  int const x_24 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  return x_24;
+}
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_4) {
+  tint_array_wrapper_1 ref = {};
+  int i_1 = 0;
+  tint_array_wrapper_1 a_1 = {};
+  int param = 0;
+  int param_1 = 0;
+  int i_2 = 0;
+  int const x_25 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  int const x_26 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  ref.arr[x_25] = x_26;
+  int const x_27 = x_8.x_GLF_uniform_int_values.arr[11].el;
+  int const x_28 = x_8.x_GLF_uniform_int_values.arr[2].el;
+  ref.arr[x_27] = x_28;
+  int const x_29 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  int const x_30 = x_8.x_GLF_uniform_int_values.arr[3].el;
+  ref.arr[x_29] = x_30;
+  int const x_31 = x_8.x_GLF_uniform_int_values.arr[2].el;
+  int const x_32 = x_8.x_GLF_uniform_int_values.arr[4].el;
+  ref.arr[x_31] = x_32;
+  int const x_33 = x_8.x_GLF_uniform_int_values.arr[3].el;
+  int const x_34 = x_8.x_GLF_uniform_int_values.arr[5].el;
+  ref.arr[x_33] = x_34;
+  int const x_35 = x_8.x_GLF_uniform_int_values.arr[4].el;
+  int const x_36 = x_8.x_GLF_uniform_int_values.arr[6].el;
+  ref.arr[x_35] = x_36;
+  int const x_37 = x_8.x_GLF_uniform_int_values.arr[5].el;
+  int const x_38 = x_8.x_GLF_uniform_int_values.arr[7].el;
+  ref.arr[x_37] = x_38;
+  int const x_39 = x_8.x_GLF_uniform_int_values.arr[8].el;
+  int const x_40 = x_8.x_GLF_uniform_int_values.arr[8].el;
+  ref.arr[x_39] = x_40;
+  int const x_41 = x_8.x_GLF_uniform_int_values.arr[9].el;
+  int const x_42 = x_8.x_GLF_uniform_int_values.arr[9].el;
+  ref.arr[x_41] = x_42;
+  int const x_43 = x_8.x_GLF_uniform_int_values.arr[10].el;
+  int const x_44 = x_8.x_GLF_uniform_int_values.arr[10].el;
+  ref.arr[x_43] = x_44;
+  int const x_45 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  i_1 = x_45;
+  while (true) {
+    int const x_46 = i_1;
+    int const x_47 = x_8.x_GLF_uniform_int_values.arr[6].el;
+    if ((x_46 < x_47)) {
+    } else {
+      break;
+    }
+    int const x_48 = i_1;
+    int const x_49 = i_1;
+    a_1.arr[x_48] = x_49;
+    int const x_50 = i_1;
+    int const x_51 = x_8.x_GLF_uniform_int_values.arr[6].el;
+    int const x_52 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    if ((x_50 < (x_51 / x_52))) {
+      int const x_54 = i_1;
+      int const x_55 = i_1;
+      int const x_56 = x_8.x_GLF_uniform_int_values.arr[1].el;
+      a_1.arr[x_54] = (x_55 + x_56);
+      int const x_58 = i_1;
+      int const x_59 = x_8.x_GLF_uniform_int_values.arr[6].el;
+      if ((x_58 < x_59)) {
+        {
+          int const x_79 = i_1;
+          i_1 = (x_79 + 1);
+        }
+        continue;
+      }
+      int const x_60 = i_1;
+      int const x_61 = i_1;
+      int const x_62 = x_8.x_GLF_uniform_int_values.arr[8].el;
+      a_1.arr[x_60] = (x_61 + x_62);
+      int const x_64 = i_1;
+      int const x_65 = a_1.arr[x_64];
+      param = x_65;
+      int const x_66 = f_i1_(x_8, &(param));
+      int const x_67 = x_8.x_GLF_uniform_int_values.arr[8].el;
+      if ((x_66 < x_67)) {
+        int const x_68 = i_1;
+        int const x_182_save = x_68;
+        int const x_69 = a_1.arr[x_182_save];
+        a_1.arr[x_182_save] = (x_69 - 1);
+      }
+    } else {
+      int const x_71 = i_1;
+      int const x_72 = a_1.arr[x_71];
+      param_1 = x_72;
+      int const x_73 = f_i1_(x_8, &(param_1));
+      int const x_74 = x_8.x_GLF_uniform_int_values.arr[8].el;
+      if ((x_73 < x_74)) {
+        int const x_75 = i_1;
+        int const x_76 = x_8.x_GLF_uniform_int_values.arr[4].el;
+        int const x_77 = a_1.arr[x_75];
+        a_1.arr[x_75] = (x_77 + x_76);
+      }
+    }
+    {
+      int const x_79 = i_1;
+      i_1 = (x_79 + 1);
+    }
+  }
+  int const x_81 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  i_2 = x_81;
+  while (true) {
+    int const x_82 = i_2;
+    int const x_83 = x_8.x_GLF_uniform_int_values.arr[6].el;
+    if ((x_82 < x_83)) {
+    } else {
+      break;
+    }
+    int const x_84 = i_2;
+    int const x_85 = a_1.arr[x_84];
+    int const x_86 = i_2;
+    int const x_87 = ref.arr[x_86];
+    if ((x_85 != x_87)) {
+      int const x_88 = x_8.x_GLF_uniform_int_values.arr[0].el;
+      float const x_205 = float(x_88);
+      *(tint_symbol_4) = float4(x_205, x_205, x_205, x_205);
+      return;
+    }
+    {
+      int const x_89 = i_2;
+      i_2 = (x_89 + 1);
+    }
+  }
+  int const x_91 = x_8.x_GLF_uniform_int_values.arr[11].el;
+  int const x_92 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  int const x_93 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  int const x_94 = x_8.x_GLF_uniform_int_values.arr[11].el;
+  *(tint_symbol_4) = float4(float(x_91), float(x_92), float(x_93), float(x_94));
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inst-combine-calls-for-compare-function-call-result/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inst-combine-calls-for-compare-function-call-result/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..b54ea8d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inst-combine-calls-for-compare-function-call-result/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,371 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 257
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %f_i1_ "f_i1_"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %main_1 "main_1"
+               OpName %ref "ref"
+               OpName %i_1 "i_1"
+               OpName %a_1 "a_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %i_2 "i_2"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_12 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_12 = OpConstant %uint 12
+%_arr_int_uint_12 = OpTypeArray %int %uint_12
+       %buf0 = OpTypeStruct %_arr_int_uint_12
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+%_ptr_Function_int = OpTypePointer Function %int
+         %15 = OpTypeFunction %int %_ptr_Function_int
+         %21 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_6 = OpConstant %int 6
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+      %int_1 = OpConstant %int 1
+       %void = OpTypeVoid
+         %54 = OpTypeFunction %void
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+         %62 = OpConstantNull %_arr_int_uint_10
+     %int_11 = OpConstant %int 11
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+      %int_9 = OpConstant %int 9
+     %int_10 = OpConstant %int 10
+   %main_out = OpTypeStruct %v4float
+        %245 = OpTypeFunction %void %main_out
+      %f_i1_ = OpFunction %int None %15
+          %a = OpFunctionParameter %_ptr_Function_int
+         %19 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %21
+         %25 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %26 = OpLoad %int %25
+               OpStore %i %26
+               OpBranch %27
+         %27 = OpLabel
+               OpLoopMerge %28 %29 None
+               OpBranch %30
+         %30 = OpLabel
+         %31 = OpLoad %int %i
+         %33 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_6
+         %34 = OpLoad %int %33
+         %35 = OpSLessThan %bool %31 %34
+               OpSelectionMerge %37 None
+               OpBranchConditional %35 %38 %39
+         %38 = OpLabel
+               OpBranch %37
+         %39 = OpLabel
+               OpBranch %28
+         %37 = OpLabel
+         %40 = OpLoad %int %i
+         %42 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+         %43 = OpLoad %int %42
+         %44 = OpSGreaterThan %bool %40 %43
+               OpSelectionMerge %45 None
+               OpBranchConditional %44 %46 %45
+         %46 = OpLabel
+         %48 = OpLoad %int %a
+               OpReturnValue %48
+         %45 = OpLabel
+               OpBranch %29
+         %29 = OpLabel
+         %49 = OpLoad %int %i
+         %51 = OpIAdd %int %49 %int_1
+               OpStore %i %51
+               OpBranch %27
+         %28 = OpLabel
+         %52 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %53 = OpLoad %int %52
+               OpReturnValue %53
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %54
+         %57 = OpLabel
+        %ref = OpVariable %_ptr_Function__arr_int_uint_10 Function %62
+        %i_1 = OpVariable %_ptr_Function_int Function %21
+        %a_1 = OpVariable %_ptr_Function__arr_int_uint_10 Function %62
+      %param = OpVariable %_ptr_Function_int Function %21
+    %param_1 = OpVariable %_ptr_Function_int Function %21
+        %i_2 = OpVariable %_ptr_Function_int Function %21
+         %68 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %69 = OpLoad %int %68
+         %70 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %71 = OpLoad %int %70
+         %72 = OpAccessChain %_ptr_Function_int %ref %69
+               OpStore %72 %71
+         %74 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_11
+         %75 = OpLoad %int %74
+         %76 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+         %77 = OpLoad %int %76
+         %78 = OpAccessChain %_ptr_Function_int %ref %75
+               OpStore %78 %77
+         %79 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %80 = OpLoad %int %79
+         %82 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_3
+         %83 = OpLoad %int %82
+         %84 = OpAccessChain %_ptr_Function_int %ref %80
+               OpStore %84 %83
+         %85 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+         %86 = OpLoad %int %85
+         %88 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_4
+         %89 = OpLoad %int %88
+         %90 = OpAccessChain %_ptr_Function_int %ref %86
+               OpStore %90 %89
+         %91 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_3
+         %92 = OpLoad %int %91
+         %94 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_5
+         %95 = OpLoad %int %94
+         %96 = OpAccessChain %_ptr_Function_int %ref %92
+               OpStore %96 %95
+         %97 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_4
+         %98 = OpLoad %int %97
+         %99 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_6
+        %100 = OpLoad %int %99
+        %101 = OpAccessChain %_ptr_Function_int %ref %98
+               OpStore %101 %100
+        %102 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_5
+        %103 = OpLoad %int %102
+        %105 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_7
+        %106 = OpLoad %int %105
+        %107 = OpAccessChain %_ptr_Function_int %ref %103
+               OpStore %107 %106
+        %109 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_8
+        %110 = OpLoad %int %109
+        %111 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_8
+        %112 = OpLoad %int %111
+        %113 = OpAccessChain %_ptr_Function_int %ref %110
+               OpStore %113 %112
+        %115 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_9
+        %116 = OpLoad %int %115
+        %117 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_9
+        %118 = OpLoad %int %117
+        %119 = OpAccessChain %_ptr_Function_int %ref %116
+               OpStore %119 %118
+        %121 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_10
+        %122 = OpLoad %int %121
+        %123 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_10
+        %124 = OpLoad %int %123
+        %125 = OpAccessChain %_ptr_Function_int %ref %122
+               OpStore %125 %124
+        %126 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+        %127 = OpLoad %int %126
+               OpStore %i_1 %127
+               OpBranch %128
+        %128 = OpLabel
+               OpLoopMerge %129 %130 None
+               OpBranch %131
+        %131 = OpLabel
+        %132 = OpLoad %int %i_1
+        %133 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_6
+        %134 = OpLoad %int %133
+        %135 = OpSLessThan %bool %132 %134
+               OpSelectionMerge %136 None
+               OpBranchConditional %135 %137 %138
+        %137 = OpLabel
+               OpBranch %136
+        %138 = OpLabel
+               OpBranch %129
+        %136 = OpLabel
+        %139 = OpLoad %int %i_1
+        %140 = OpLoad %int %i_1
+        %141 = OpAccessChain %_ptr_Function_int %a_1 %139
+               OpStore %141 %140
+        %142 = OpLoad %int %i_1
+        %143 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_6
+        %144 = OpLoad %int %143
+        %145 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+        %146 = OpLoad %int %145
+        %147 = OpSDiv %int %144 %146
+        %148 = OpSLessThan %bool %142 %147
+               OpSelectionMerge %149 None
+               OpBranchConditional %148 %150 %151
+        %150 = OpLabel
+        %152 = OpLoad %int %i_1
+        %153 = OpLoad %int %i_1
+        %154 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+        %155 = OpLoad %int %154
+        %156 = OpAccessChain %_ptr_Function_int %a_1 %152
+        %157 = OpIAdd %int %153 %155
+               OpStore %156 %157
+        %158 = OpLoad %int %i_1
+        %159 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_6
+        %160 = OpLoad %int %159
+        %161 = OpSLessThan %bool %158 %160
+               OpSelectionMerge %162 None
+               OpBranchConditional %161 %163 %162
+        %163 = OpLabel
+               OpBranch %130
+        %162 = OpLabel
+        %164 = OpLoad %int %i_1
+        %165 = OpLoad %int %i_1
+        %166 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_8
+        %167 = OpLoad %int %166
+        %168 = OpAccessChain %_ptr_Function_int %a_1 %164
+        %169 = OpIAdd %int %165 %167
+               OpStore %168 %169
+        %170 = OpLoad %int %i_1
+        %171 = OpAccessChain %_ptr_Function_int %a_1 %170
+        %172 = OpLoad %int %171
+               OpStore %param %172
+        %173 = OpFunctionCall %int %f_i1_ %param
+        %175 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_8
+        %176 = OpLoad %int %175
+        %177 = OpSLessThan %bool %173 %176
+               OpSelectionMerge %178 None
+               OpBranchConditional %177 %179 %178
+        %179 = OpLabel
+        %180 = OpLoad %int %i_1
+        %181 = OpAccessChain %_ptr_Function_int %a_1 %180
+        %182 = OpLoad %int %181
+        %183 = OpAccessChain %_ptr_Function_int %a_1 %180
+        %184 = OpISub %int %182 %int_1
+               OpStore %183 %184
+               OpBranch %178
+        %178 = OpLabel
+               OpBranch %149
+        %151 = OpLabel
+        %185 = OpLoad %int %i_1
+        %186 = OpAccessChain %_ptr_Function_int %a_1 %185
+        %187 = OpLoad %int %186
+               OpStore %param_1 %187
+        %188 = OpFunctionCall %int %f_i1_ %param_1
+        %190 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_8
+        %191 = OpLoad %int %190
+        %192 = OpSLessThan %bool %188 %191
+               OpSelectionMerge %193 None
+               OpBranchConditional %192 %194 %193
+        %194 = OpLabel
+        %195 = OpLoad %int %i_1
+        %196 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_4
+        %197 = OpLoad %int %196
+        %198 = OpAccessChain %_ptr_Function_int %a_1 %195
+        %199 = OpLoad %int %198
+        %200 = OpAccessChain %_ptr_Function_int %a_1 %195
+        %201 = OpIAdd %int %199 %197
+               OpStore %200 %201
+               OpBranch %193
+        %193 = OpLabel
+               OpBranch %149
+        %149 = OpLabel
+               OpBranch %130
+        %130 = OpLabel
+        %202 = OpLoad %int %i_1
+        %203 = OpIAdd %int %202 %int_1
+               OpStore %i_1 %203
+               OpBranch %128
+        %129 = OpLabel
+        %204 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+        %205 = OpLoad %int %204
+               OpStore %i_2 %205
+               OpBranch %206
+        %206 = OpLabel
+               OpLoopMerge %207 %208 None
+               OpBranch %209
+        %209 = OpLabel
+        %210 = OpLoad %int %i_2
+        %211 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_6
+        %212 = OpLoad %int %211
+        %213 = OpSLessThan %bool %210 %212
+               OpSelectionMerge %214 None
+               OpBranchConditional %213 %215 %216
+        %215 = OpLabel
+               OpBranch %214
+        %216 = OpLabel
+               OpBranch %207
+        %214 = OpLabel
+        %217 = OpLoad %int %i_2
+        %218 = OpAccessChain %_ptr_Function_int %a_1 %217
+        %219 = OpLoad %int %218
+        %220 = OpLoad %int %i_2
+        %221 = OpAccessChain %_ptr_Function_int %ref %220
+        %222 = OpLoad %int %221
+        %223 = OpINotEqual %bool %219 %222
+               OpSelectionMerge %224 None
+               OpBranchConditional %223 %225 %224
+        %225 = OpLabel
+        %226 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+        %227 = OpLoad %int %226
+        %228 = OpConvertSToF %float %227
+        %229 = OpCompositeConstruct %v4float %228 %228 %228 %228
+               OpStore %x_GLF_color %229
+               OpReturn
+        %224 = OpLabel
+               OpBranch %208
+        %208 = OpLabel
+        %230 = OpLoad %int %i_2
+        %231 = OpIAdd %int %230 %int_1
+               OpStore %i_2 %231
+               OpBranch %206
+        %207 = OpLabel
+        %232 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_11
+        %233 = OpLoad %int %232
+        %234 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+        %235 = OpLoad %int %234
+        %236 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+        %237 = OpLoad %int %236
+        %238 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_11
+        %239 = OpLoad %int %238
+        %240 = OpConvertSToF %float %233
+        %241 = OpConvertSToF %float %235
+        %242 = OpConvertSToF %float %237
+        %243 = OpConvertSToF %float %239
+        %244 = OpCompositeConstruct %v4float %240 %241 %242 %243
+               OpStore %x_GLF_color %244
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %245
+%tint_symbol = OpFunctionParameter %main_out
+        %249 = OpLabel
+        %250 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %250
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %54
+        %252 = OpLabel
+        %253 = OpFunctionCall %void %main_1
+        %255 = OpLoad %v4float %x_GLF_color
+        %256 = OpCompositeConstruct %main_out %255
+        %254 = OpFunctionCall %void %tint_symbol_2 %256
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inst-combine-calls-for-compare-function-call-result/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inst-combine-calls-for-compare-function-call-result/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..37cab95
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inst-combine-calls-for-compare-function-call-result/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,177 @@
+type Arr = [[stride(16)]] array<i32, 12>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn f_i1_(a : ptr<function, i32>) -> i32 {
+  var i : i32;
+  let x_16 : i32 = x_8.x_GLF_uniform_int_values[0];
+  i = x_16;
+  loop {
+    let x_17 : i32 = i;
+    let x_18 : i32 = x_8.x_GLF_uniform_int_values[6];
+    if ((x_17 < x_18)) {
+    } else {
+      break;
+    }
+    let x_19 : i32 = i;
+    let x_20 : i32 = x_8.x_GLF_uniform_int_values[2];
+    if ((x_19 > x_20)) {
+      let x_21 : i32 = *(a);
+      return x_21;
+    }
+
+    continuing {
+      let x_22 : i32 = i;
+      i = (x_22 + 1);
+    }
+  }
+  let x_24 : i32 = x_8.x_GLF_uniform_int_values[0];
+  return x_24;
+}
+
+fn main_1() {
+  var ref : array<i32, 10>;
+  var i_1 : i32;
+  var a_1 : array<i32, 10>;
+  var param : i32;
+  var param_1 : i32;
+  var i_2 : i32;
+  let x_25 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_26 : i32 = x_8.x_GLF_uniform_int_values[1];
+  ref[x_25] = x_26;
+  let x_27 : i32 = x_8.x_GLF_uniform_int_values[11];
+  let x_28 : i32 = x_8.x_GLF_uniform_int_values[2];
+  ref[x_27] = x_28;
+  let x_29 : i32 = x_8.x_GLF_uniform_int_values[1];
+  let x_30 : i32 = x_8.x_GLF_uniform_int_values[3];
+  ref[x_29] = x_30;
+  let x_31 : i32 = x_8.x_GLF_uniform_int_values[2];
+  let x_32 : i32 = x_8.x_GLF_uniform_int_values[4];
+  ref[x_31] = x_32;
+  let x_33 : i32 = x_8.x_GLF_uniform_int_values[3];
+  let x_34 : i32 = x_8.x_GLF_uniform_int_values[5];
+  ref[x_33] = x_34;
+  let x_35 : i32 = x_8.x_GLF_uniform_int_values[4];
+  let x_36 : i32 = x_8.x_GLF_uniform_int_values[6];
+  ref[x_35] = x_36;
+  let x_37 : i32 = x_8.x_GLF_uniform_int_values[5];
+  let x_38 : i32 = x_8.x_GLF_uniform_int_values[7];
+  ref[x_37] = x_38;
+  let x_39 : i32 = x_8.x_GLF_uniform_int_values[8];
+  let x_40 : i32 = x_8.x_GLF_uniform_int_values[8];
+  ref[x_39] = x_40;
+  let x_41 : i32 = x_8.x_GLF_uniform_int_values[9];
+  let x_42 : i32 = x_8.x_GLF_uniform_int_values[9];
+  ref[x_41] = x_42;
+  let x_43 : i32 = x_8.x_GLF_uniform_int_values[10];
+  let x_44 : i32 = x_8.x_GLF_uniform_int_values[10];
+  ref[x_43] = x_44;
+  let x_45 : i32 = x_8.x_GLF_uniform_int_values[0];
+  i_1 = x_45;
+  loop {
+    let x_46 : i32 = i_1;
+    let x_47 : i32 = x_8.x_GLF_uniform_int_values[6];
+    if ((x_46 < x_47)) {
+    } else {
+      break;
+    }
+    let x_48 : i32 = i_1;
+    let x_49 : i32 = i_1;
+    a_1[x_48] = x_49;
+    let x_50 : i32 = i_1;
+    let x_51 : i32 = x_8.x_GLF_uniform_int_values[6];
+    let x_52 : i32 = x_8.x_GLF_uniform_int_values[1];
+    if ((x_50 < (x_51 / x_52))) {
+      let x_54 : i32 = i_1;
+      let x_55 : i32 = i_1;
+      let x_56 : i32 = x_8.x_GLF_uniform_int_values[1];
+      a_1[x_54] = (x_55 + x_56);
+      let x_58 : i32 = i_1;
+      let x_59 : i32 = x_8.x_GLF_uniform_int_values[6];
+      if ((x_58 < x_59)) {
+        continue;
+      }
+      let x_60 : i32 = i_1;
+      let x_61 : i32 = i_1;
+      let x_62 : i32 = x_8.x_GLF_uniform_int_values[8];
+      a_1[x_60] = (x_61 + x_62);
+      let x_64 : i32 = i_1;
+      let x_65 : i32 = a_1[x_64];
+      param = x_65;
+      let x_66 : i32 = f_i1_(&(param));
+      let x_67 : i32 = x_8.x_GLF_uniform_int_values[8];
+      if ((x_66 < x_67)) {
+        let x_68 : i32 = i_1;
+        let x_182 : ptr<function, i32> = &(a_1[x_68]);
+        let x_69 : i32 = *(x_182);
+        *(x_182) = (x_69 - 1);
+      }
+    } else {
+      let x_71 : i32 = i_1;
+      let x_72 : i32 = a_1[x_71];
+      param_1 = x_72;
+      let x_73 : i32 = f_i1_(&(param_1));
+      let x_74 : i32 = x_8.x_GLF_uniform_int_values[8];
+      if ((x_73 < x_74)) {
+        let x_75 : i32 = i_1;
+        let x_76 : i32 = x_8.x_GLF_uniform_int_values[4];
+        let x_77 : i32 = a_1[x_75];
+        a_1[x_75] = (x_77 + x_76);
+      }
+    }
+
+    continuing {
+      let x_79 : i32 = i_1;
+      i_1 = (x_79 + 1);
+    }
+  }
+  let x_81 : i32 = x_8.x_GLF_uniform_int_values[0];
+  i_2 = x_81;
+  loop {
+    let x_82 : i32 = i_2;
+    let x_83 : i32 = x_8.x_GLF_uniform_int_values[6];
+    if ((x_82 < x_83)) {
+    } else {
+      break;
+    }
+    let x_84 : i32 = i_2;
+    let x_85 : i32 = a_1[x_84];
+    let x_86 : i32 = i_2;
+    let x_87 : i32 = ref[x_86];
+    if ((x_85 != x_87)) {
+      let x_88 : i32 = x_8.x_GLF_uniform_int_values[0];
+      let x_205 : f32 = f32(x_88);
+      x_GLF_color = vec4<f32>(x_205, x_205, x_205, x_205);
+      return;
+    }
+
+    continuing {
+      let x_89 : i32 = i_2;
+      i_2 = (x_89 + 1);
+    }
+  }
+  let x_91 : i32 = x_8.x_GLF_uniform_int_values[11];
+  let x_92 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_93 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_94 : i32 = x_8.x_GLF_uniform_int_values[11];
+  x_GLF_color = vec4<f32>(f32(x_91), f32(x_92), f32(x_93), f32(x_94));
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inst-combine-calls-for-compare-function-call-result/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inst-combine-calls-for-compare-function-call-result/0-opt.wgsl
new file mode 100644
index 0000000..37cab95
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inst-combine-calls-for-compare-function-call-result/0-opt.wgsl
@@ -0,0 +1,177 @@
+type Arr = [[stride(16)]] array<i32, 12>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn f_i1_(a : ptr<function, i32>) -> i32 {
+  var i : i32;
+  let x_16 : i32 = x_8.x_GLF_uniform_int_values[0];
+  i = x_16;
+  loop {
+    let x_17 : i32 = i;
+    let x_18 : i32 = x_8.x_GLF_uniform_int_values[6];
+    if ((x_17 < x_18)) {
+    } else {
+      break;
+    }
+    let x_19 : i32 = i;
+    let x_20 : i32 = x_8.x_GLF_uniform_int_values[2];
+    if ((x_19 > x_20)) {
+      let x_21 : i32 = *(a);
+      return x_21;
+    }
+
+    continuing {
+      let x_22 : i32 = i;
+      i = (x_22 + 1);
+    }
+  }
+  let x_24 : i32 = x_8.x_GLF_uniform_int_values[0];
+  return x_24;
+}
+
+fn main_1() {
+  var ref : array<i32, 10>;
+  var i_1 : i32;
+  var a_1 : array<i32, 10>;
+  var param : i32;
+  var param_1 : i32;
+  var i_2 : i32;
+  let x_25 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_26 : i32 = x_8.x_GLF_uniform_int_values[1];
+  ref[x_25] = x_26;
+  let x_27 : i32 = x_8.x_GLF_uniform_int_values[11];
+  let x_28 : i32 = x_8.x_GLF_uniform_int_values[2];
+  ref[x_27] = x_28;
+  let x_29 : i32 = x_8.x_GLF_uniform_int_values[1];
+  let x_30 : i32 = x_8.x_GLF_uniform_int_values[3];
+  ref[x_29] = x_30;
+  let x_31 : i32 = x_8.x_GLF_uniform_int_values[2];
+  let x_32 : i32 = x_8.x_GLF_uniform_int_values[4];
+  ref[x_31] = x_32;
+  let x_33 : i32 = x_8.x_GLF_uniform_int_values[3];
+  let x_34 : i32 = x_8.x_GLF_uniform_int_values[5];
+  ref[x_33] = x_34;
+  let x_35 : i32 = x_8.x_GLF_uniform_int_values[4];
+  let x_36 : i32 = x_8.x_GLF_uniform_int_values[6];
+  ref[x_35] = x_36;
+  let x_37 : i32 = x_8.x_GLF_uniform_int_values[5];
+  let x_38 : i32 = x_8.x_GLF_uniform_int_values[7];
+  ref[x_37] = x_38;
+  let x_39 : i32 = x_8.x_GLF_uniform_int_values[8];
+  let x_40 : i32 = x_8.x_GLF_uniform_int_values[8];
+  ref[x_39] = x_40;
+  let x_41 : i32 = x_8.x_GLF_uniform_int_values[9];
+  let x_42 : i32 = x_8.x_GLF_uniform_int_values[9];
+  ref[x_41] = x_42;
+  let x_43 : i32 = x_8.x_GLF_uniform_int_values[10];
+  let x_44 : i32 = x_8.x_GLF_uniform_int_values[10];
+  ref[x_43] = x_44;
+  let x_45 : i32 = x_8.x_GLF_uniform_int_values[0];
+  i_1 = x_45;
+  loop {
+    let x_46 : i32 = i_1;
+    let x_47 : i32 = x_8.x_GLF_uniform_int_values[6];
+    if ((x_46 < x_47)) {
+    } else {
+      break;
+    }
+    let x_48 : i32 = i_1;
+    let x_49 : i32 = i_1;
+    a_1[x_48] = x_49;
+    let x_50 : i32 = i_1;
+    let x_51 : i32 = x_8.x_GLF_uniform_int_values[6];
+    let x_52 : i32 = x_8.x_GLF_uniform_int_values[1];
+    if ((x_50 < (x_51 / x_52))) {
+      let x_54 : i32 = i_1;
+      let x_55 : i32 = i_1;
+      let x_56 : i32 = x_8.x_GLF_uniform_int_values[1];
+      a_1[x_54] = (x_55 + x_56);
+      let x_58 : i32 = i_1;
+      let x_59 : i32 = x_8.x_GLF_uniform_int_values[6];
+      if ((x_58 < x_59)) {
+        continue;
+      }
+      let x_60 : i32 = i_1;
+      let x_61 : i32 = i_1;
+      let x_62 : i32 = x_8.x_GLF_uniform_int_values[8];
+      a_1[x_60] = (x_61 + x_62);
+      let x_64 : i32 = i_1;
+      let x_65 : i32 = a_1[x_64];
+      param = x_65;
+      let x_66 : i32 = f_i1_(&(param));
+      let x_67 : i32 = x_8.x_GLF_uniform_int_values[8];
+      if ((x_66 < x_67)) {
+        let x_68 : i32 = i_1;
+        let x_182 : ptr<function, i32> = &(a_1[x_68]);
+        let x_69 : i32 = *(x_182);
+        *(x_182) = (x_69 - 1);
+      }
+    } else {
+      let x_71 : i32 = i_1;
+      let x_72 : i32 = a_1[x_71];
+      param_1 = x_72;
+      let x_73 : i32 = f_i1_(&(param_1));
+      let x_74 : i32 = x_8.x_GLF_uniform_int_values[8];
+      if ((x_73 < x_74)) {
+        let x_75 : i32 = i_1;
+        let x_76 : i32 = x_8.x_GLF_uniform_int_values[4];
+        let x_77 : i32 = a_1[x_75];
+        a_1[x_75] = (x_77 + x_76);
+      }
+    }
+
+    continuing {
+      let x_79 : i32 = i_1;
+      i_1 = (x_79 + 1);
+    }
+  }
+  let x_81 : i32 = x_8.x_GLF_uniform_int_values[0];
+  i_2 = x_81;
+  loop {
+    let x_82 : i32 = i_2;
+    let x_83 : i32 = x_8.x_GLF_uniform_int_values[6];
+    if ((x_82 < x_83)) {
+    } else {
+      break;
+    }
+    let x_84 : i32 = i_2;
+    let x_85 : i32 = a_1[x_84];
+    let x_86 : i32 = i_2;
+    let x_87 : i32 = ref[x_86];
+    if ((x_85 != x_87)) {
+      let x_88 : i32 = x_8.x_GLF_uniform_int_values[0];
+      let x_205 : f32 = f32(x_88);
+      x_GLF_color = vec4<f32>(x_205, x_205, x_205, x_205);
+      return;
+    }
+
+    continuing {
+      let x_89 : i32 = i_2;
+      i_2 = (x_89 + 1);
+    }
+  }
+  let x_91 : i32 = x_8.x_GLF_uniform_int_values[11];
+  let x_92 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_93 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_94 : i32 = x_8.x_GLF_uniform_int_values[11];
+  x_GLF_color = vec4<f32>(f32(x_91), f32(x_92), f32(x_93), f32(x_94));
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inst-combine-calls-for-compare-function-call-result/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inst-combine-calls-for-compare-function-call-result/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..d5ea2b6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inst-combine-calls-for-compare-function-call-result/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,172 @@
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[12];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+int f_i1_(inout int a) {
+  int i = 0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_16 = asint(x_8[scalar_offset / 4][scalar_offset % 4]);
+  i = x_16;
+  while (true) {
+    const int x_17 = i;
+    const int x_18 = asint(x_8[6].x);
+    if ((x_17 < x_18)) {
+    } else {
+      break;
+    }
+    const int x_19 = i;
+    const int x_20 = asint(x_8[2].x);
+    if ((x_19 > x_20)) {
+      const int x_21 = a;
+      return x_21;
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_24 = asint(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  return x_24;
+}
+
+void main_1() {
+  int ref[10] = (int[10])0;
+  int i_1 = 0;
+  int a_1[10] = (int[10])0;
+  int param = 0;
+  int param_1 = 0;
+  int i_2 = 0;
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const int x_25 = asint(x_8[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  const int x_26 = asint(x_8[1].x);
+  ref[x_25] = x_26;
+  const int x_27 = asint(x_8[11].x);
+  const int x_28 = asint(x_8[2].x);
+  ref[x_27] = x_28;
+  const int x_29 = asint(x_8[1].x);
+  const int x_30 = asint(x_8[3].x);
+  ref[x_29] = x_30;
+  const int x_31 = asint(x_8[2].x);
+  const int x_32 = asint(x_8[4].x);
+  ref[x_31] = x_32;
+  const int x_33 = asint(x_8[3].x);
+  const int x_34 = asint(x_8[5].x);
+  ref[x_33] = x_34;
+  const int x_35 = asint(x_8[4].x);
+  const int x_36 = asint(x_8[6].x);
+  ref[x_35] = x_36;
+  const int x_37 = asint(x_8[5].x);
+  const int x_38 = asint(x_8[7].x);
+  ref[x_37] = x_38;
+  const int x_39 = asint(x_8[8].x);
+  const int x_40 = asint(x_8[8].x);
+  ref[x_39] = x_40;
+  const int x_41 = asint(x_8[9].x);
+  const int x_42 = asint(x_8[9].x);
+  ref[x_41] = x_42;
+  const int x_43 = asint(x_8[10].x);
+  const int x_44 = asint(x_8[10].x);
+  ref[x_43] = x_44;
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const int x_45 = asint(x_8[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  i_1 = x_45;
+  while (true) {
+    const int x_46 = i_1;
+    const int x_47 = asint(x_8[6].x);
+    if ((x_46 < x_47)) {
+    } else {
+      break;
+    }
+    a_1[i_1] = i_1;
+    const int x_50 = i_1;
+    const int x_51 = asint(x_8[6].x);
+    const int x_52 = asint(x_8[1].x);
+    if ((x_50 < (x_51 / x_52))) {
+      const int x_54 = i_1;
+      const int x_55 = i_1;
+      const int x_56 = asint(x_8[1].x);
+      a_1[x_54] = (x_55 + x_56);
+      const int x_58 = i_1;
+      const int x_59 = asint(x_8[6].x);
+      if ((x_58 < x_59)) {
+        {
+          i_1 = (i_1 + 1);
+        }
+        continue;
+      }
+      const int x_60 = i_1;
+      const int x_61 = i_1;
+      const int x_62 = asint(x_8[8].x);
+      a_1[x_60] = (x_61 + x_62);
+      const int x_65 = a_1[i_1];
+      param = x_65;
+      const int x_66 = f_i1_(param);
+      const int x_67 = asint(x_8[8].x);
+      if ((x_66 < x_67)) {
+        const int x_182_save = i_1;
+        const int x_69 = a_1[x_182_save];
+        a_1[x_182_save] = (x_69 - 1);
+      }
+    } else {
+      const int x_72 = a_1[i_1];
+      param_1 = x_72;
+      const int x_73 = f_i1_(param_1);
+      const int x_74 = asint(x_8[8].x);
+      if ((x_73 < x_74)) {
+        const int x_75 = i_1;
+        const int x_76 = asint(x_8[4].x);
+        const int x_77 = a_1[x_75];
+        a_1[x_75] = (x_77 + x_76);
+      }
+    }
+    {
+      i_1 = (i_1 + 1);
+    }
+  }
+  const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+  const int x_81 = asint(x_8[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+  i_2 = x_81;
+  while (true) {
+    const int x_82 = i_2;
+    const int x_83 = asint(x_8[6].x);
+    if ((x_82 < x_83)) {
+    } else {
+      break;
+    }
+    const int x_85 = a_1[i_2];
+    const int x_87 = ref[i_2];
+    if ((x_85 != x_87)) {
+      const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+      const int x_88 = asint(x_8[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+      const float x_205 = float(x_88);
+      x_GLF_color = float4(x_205, x_205, x_205, x_205);
+      return;
+    }
+    {
+      i_2 = (i_2 + 1);
+    }
+  }
+  const int x_91 = asint(x_8[11].x);
+  const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+  const int x_92 = asint(x_8[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+  const uint scalar_offset_7 = ((16u * uint(0))) / 4;
+  const int x_93 = asint(x_8[scalar_offset_7 / 4][scalar_offset_7 % 4]);
+  const int x_94 = asint(x_8[11].x);
+  x_GLF_color = float4(float(x_91), float(x_92), float(x_93), float(x_94));
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inst-combine-calls-for-compare-function-call-result/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inst-combine-calls-for-compare-function-call-result/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..6399b00
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inst-combine-calls-for-compare-function-call-result/0-opt.wgsl.expected.msl
@@ -0,0 +1,188 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[12];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_1 {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int f_i1_(constant buf0& x_8, thread int* const a) {
+  int i = 0;
+  int const x_16 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  i = x_16;
+  while (true) {
+    int const x_17 = i;
+    int const x_18 = x_8.x_GLF_uniform_int_values.arr[6].el;
+    if ((x_17 < x_18)) {
+    } else {
+      break;
+    }
+    int const x_19 = i;
+    int const x_20 = x_8.x_GLF_uniform_int_values.arr[2].el;
+    if ((x_19 > x_20)) {
+      int const x_21 = *(a);
+      return x_21;
+    }
+    {
+      int const x_22 = i;
+      i = (x_22 + 1);
+    }
+  }
+  int const x_24 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  return x_24;
+}
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_4) {
+  tint_array_wrapper_1 ref = {};
+  int i_1 = 0;
+  tint_array_wrapper_1 a_1 = {};
+  int param = 0;
+  int param_1 = 0;
+  int i_2 = 0;
+  int const x_25 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  int const x_26 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  ref.arr[x_25] = x_26;
+  int const x_27 = x_8.x_GLF_uniform_int_values.arr[11].el;
+  int const x_28 = x_8.x_GLF_uniform_int_values.arr[2].el;
+  ref.arr[x_27] = x_28;
+  int const x_29 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  int const x_30 = x_8.x_GLF_uniform_int_values.arr[3].el;
+  ref.arr[x_29] = x_30;
+  int const x_31 = x_8.x_GLF_uniform_int_values.arr[2].el;
+  int const x_32 = x_8.x_GLF_uniform_int_values.arr[4].el;
+  ref.arr[x_31] = x_32;
+  int const x_33 = x_8.x_GLF_uniform_int_values.arr[3].el;
+  int const x_34 = x_8.x_GLF_uniform_int_values.arr[5].el;
+  ref.arr[x_33] = x_34;
+  int const x_35 = x_8.x_GLF_uniform_int_values.arr[4].el;
+  int const x_36 = x_8.x_GLF_uniform_int_values.arr[6].el;
+  ref.arr[x_35] = x_36;
+  int const x_37 = x_8.x_GLF_uniform_int_values.arr[5].el;
+  int const x_38 = x_8.x_GLF_uniform_int_values.arr[7].el;
+  ref.arr[x_37] = x_38;
+  int const x_39 = x_8.x_GLF_uniform_int_values.arr[8].el;
+  int const x_40 = x_8.x_GLF_uniform_int_values.arr[8].el;
+  ref.arr[x_39] = x_40;
+  int const x_41 = x_8.x_GLF_uniform_int_values.arr[9].el;
+  int const x_42 = x_8.x_GLF_uniform_int_values.arr[9].el;
+  ref.arr[x_41] = x_42;
+  int const x_43 = x_8.x_GLF_uniform_int_values.arr[10].el;
+  int const x_44 = x_8.x_GLF_uniform_int_values.arr[10].el;
+  ref.arr[x_43] = x_44;
+  int const x_45 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  i_1 = x_45;
+  while (true) {
+    int const x_46 = i_1;
+    int const x_47 = x_8.x_GLF_uniform_int_values.arr[6].el;
+    if ((x_46 < x_47)) {
+    } else {
+      break;
+    }
+    int const x_48 = i_1;
+    int const x_49 = i_1;
+    a_1.arr[x_48] = x_49;
+    int const x_50 = i_1;
+    int const x_51 = x_8.x_GLF_uniform_int_values.arr[6].el;
+    int const x_52 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    if ((x_50 < (x_51 / x_52))) {
+      int const x_54 = i_1;
+      int const x_55 = i_1;
+      int const x_56 = x_8.x_GLF_uniform_int_values.arr[1].el;
+      a_1.arr[x_54] = (x_55 + x_56);
+      int const x_58 = i_1;
+      int const x_59 = x_8.x_GLF_uniform_int_values.arr[6].el;
+      if ((x_58 < x_59)) {
+        {
+          int const x_79 = i_1;
+          i_1 = (x_79 + 1);
+        }
+        continue;
+      }
+      int const x_60 = i_1;
+      int const x_61 = i_1;
+      int const x_62 = x_8.x_GLF_uniform_int_values.arr[8].el;
+      a_1.arr[x_60] = (x_61 + x_62);
+      int const x_64 = i_1;
+      int const x_65 = a_1.arr[x_64];
+      param = x_65;
+      int const x_66 = f_i1_(x_8, &(param));
+      int const x_67 = x_8.x_GLF_uniform_int_values.arr[8].el;
+      if ((x_66 < x_67)) {
+        int const x_68 = i_1;
+        int const x_182_save = x_68;
+        int const x_69 = a_1.arr[x_182_save];
+        a_1.arr[x_182_save] = (x_69 - 1);
+      }
+    } else {
+      int const x_71 = i_1;
+      int const x_72 = a_1.arr[x_71];
+      param_1 = x_72;
+      int const x_73 = f_i1_(x_8, &(param_1));
+      int const x_74 = x_8.x_GLF_uniform_int_values.arr[8].el;
+      if ((x_73 < x_74)) {
+        int const x_75 = i_1;
+        int const x_76 = x_8.x_GLF_uniform_int_values.arr[4].el;
+        int const x_77 = a_1.arr[x_75];
+        a_1.arr[x_75] = (x_77 + x_76);
+      }
+    }
+    {
+      int const x_79 = i_1;
+      i_1 = (x_79 + 1);
+    }
+  }
+  int const x_81 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  i_2 = x_81;
+  while (true) {
+    int const x_82 = i_2;
+    int const x_83 = x_8.x_GLF_uniform_int_values.arr[6].el;
+    if ((x_82 < x_83)) {
+    } else {
+      break;
+    }
+    int const x_84 = i_2;
+    int const x_85 = a_1.arr[x_84];
+    int const x_86 = i_2;
+    int const x_87 = ref.arr[x_86];
+    if ((x_85 != x_87)) {
+      int const x_88 = x_8.x_GLF_uniform_int_values.arr[0].el;
+      float const x_205 = float(x_88);
+      *(tint_symbol_4) = float4(x_205, x_205, x_205, x_205);
+      return;
+    }
+    {
+      int const x_89 = i_2;
+      i_2 = (x_89 + 1);
+    }
+  }
+  int const x_91 = x_8.x_GLF_uniform_int_values.arr[11].el;
+  int const x_92 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  int const x_93 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  int const x_94 = x_8.x_GLF_uniform_int_values.arr[11].el;
+  *(tint_symbol_4) = float4(float(x_91), float(x_92), float(x_93), float(x_94));
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inst-combine-calls-for-compare-function-call-result/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inst-combine-calls-for-compare-function-call-result/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..b54ea8d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inst-combine-calls-for-compare-function-call-result/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,371 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 257
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %f_i1_ "f_i1_"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %main_1 "main_1"
+               OpName %ref "ref"
+               OpName %i_1 "i_1"
+               OpName %a_1 "a_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %i_2 "i_2"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_12 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_12 = OpConstant %uint 12
+%_arr_int_uint_12 = OpTypeArray %int %uint_12
+       %buf0 = OpTypeStruct %_arr_int_uint_12
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+%_ptr_Function_int = OpTypePointer Function %int
+         %15 = OpTypeFunction %int %_ptr_Function_int
+         %21 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_6 = OpConstant %int 6
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+      %int_1 = OpConstant %int 1
+       %void = OpTypeVoid
+         %54 = OpTypeFunction %void
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+         %62 = OpConstantNull %_arr_int_uint_10
+     %int_11 = OpConstant %int 11
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+      %int_9 = OpConstant %int 9
+     %int_10 = OpConstant %int 10
+   %main_out = OpTypeStruct %v4float
+        %245 = OpTypeFunction %void %main_out
+      %f_i1_ = OpFunction %int None %15
+          %a = OpFunctionParameter %_ptr_Function_int
+         %19 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %21
+         %25 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %26 = OpLoad %int %25
+               OpStore %i %26
+               OpBranch %27
+         %27 = OpLabel
+               OpLoopMerge %28 %29 None
+               OpBranch %30
+         %30 = OpLabel
+         %31 = OpLoad %int %i
+         %33 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_6
+         %34 = OpLoad %int %33
+         %35 = OpSLessThan %bool %31 %34
+               OpSelectionMerge %37 None
+               OpBranchConditional %35 %38 %39
+         %38 = OpLabel
+               OpBranch %37
+         %39 = OpLabel
+               OpBranch %28
+         %37 = OpLabel
+         %40 = OpLoad %int %i
+         %42 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+         %43 = OpLoad %int %42
+         %44 = OpSGreaterThan %bool %40 %43
+               OpSelectionMerge %45 None
+               OpBranchConditional %44 %46 %45
+         %46 = OpLabel
+         %48 = OpLoad %int %a
+               OpReturnValue %48
+         %45 = OpLabel
+               OpBranch %29
+         %29 = OpLabel
+         %49 = OpLoad %int %i
+         %51 = OpIAdd %int %49 %int_1
+               OpStore %i %51
+               OpBranch %27
+         %28 = OpLabel
+         %52 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %53 = OpLoad %int %52
+               OpReturnValue %53
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %54
+         %57 = OpLabel
+        %ref = OpVariable %_ptr_Function__arr_int_uint_10 Function %62
+        %i_1 = OpVariable %_ptr_Function_int Function %21
+        %a_1 = OpVariable %_ptr_Function__arr_int_uint_10 Function %62
+      %param = OpVariable %_ptr_Function_int Function %21
+    %param_1 = OpVariable %_ptr_Function_int Function %21
+        %i_2 = OpVariable %_ptr_Function_int Function %21
+         %68 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %69 = OpLoad %int %68
+         %70 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %71 = OpLoad %int %70
+         %72 = OpAccessChain %_ptr_Function_int %ref %69
+               OpStore %72 %71
+         %74 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_11
+         %75 = OpLoad %int %74
+         %76 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+         %77 = OpLoad %int %76
+         %78 = OpAccessChain %_ptr_Function_int %ref %75
+               OpStore %78 %77
+         %79 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %80 = OpLoad %int %79
+         %82 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_3
+         %83 = OpLoad %int %82
+         %84 = OpAccessChain %_ptr_Function_int %ref %80
+               OpStore %84 %83
+         %85 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+         %86 = OpLoad %int %85
+         %88 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_4
+         %89 = OpLoad %int %88
+         %90 = OpAccessChain %_ptr_Function_int %ref %86
+               OpStore %90 %89
+         %91 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_3
+         %92 = OpLoad %int %91
+         %94 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_5
+         %95 = OpLoad %int %94
+         %96 = OpAccessChain %_ptr_Function_int %ref %92
+               OpStore %96 %95
+         %97 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_4
+         %98 = OpLoad %int %97
+         %99 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_6
+        %100 = OpLoad %int %99
+        %101 = OpAccessChain %_ptr_Function_int %ref %98
+               OpStore %101 %100
+        %102 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_5
+        %103 = OpLoad %int %102
+        %105 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_7
+        %106 = OpLoad %int %105
+        %107 = OpAccessChain %_ptr_Function_int %ref %103
+               OpStore %107 %106
+        %109 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_8
+        %110 = OpLoad %int %109
+        %111 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_8
+        %112 = OpLoad %int %111
+        %113 = OpAccessChain %_ptr_Function_int %ref %110
+               OpStore %113 %112
+        %115 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_9
+        %116 = OpLoad %int %115
+        %117 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_9
+        %118 = OpLoad %int %117
+        %119 = OpAccessChain %_ptr_Function_int %ref %116
+               OpStore %119 %118
+        %121 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_10
+        %122 = OpLoad %int %121
+        %123 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_10
+        %124 = OpLoad %int %123
+        %125 = OpAccessChain %_ptr_Function_int %ref %122
+               OpStore %125 %124
+        %126 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+        %127 = OpLoad %int %126
+               OpStore %i_1 %127
+               OpBranch %128
+        %128 = OpLabel
+               OpLoopMerge %129 %130 None
+               OpBranch %131
+        %131 = OpLabel
+        %132 = OpLoad %int %i_1
+        %133 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_6
+        %134 = OpLoad %int %133
+        %135 = OpSLessThan %bool %132 %134
+               OpSelectionMerge %136 None
+               OpBranchConditional %135 %137 %138
+        %137 = OpLabel
+               OpBranch %136
+        %138 = OpLabel
+               OpBranch %129
+        %136 = OpLabel
+        %139 = OpLoad %int %i_1
+        %140 = OpLoad %int %i_1
+        %141 = OpAccessChain %_ptr_Function_int %a_1 %139
+               OpStore %141 %140
+        %142 = OpLoad %int %i_1
+        %143 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_6
+        %144 = OpLoad %int %143
+        %145 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+        %146 = OpLoad %int %145
+        %147 = OpSDiv %int %144 %146
+        %148 = OpSLessThan %bool %142 %147
+               OpSelectionMerge %149 None
+               OpBranchConditional %148 %150 %151
+        %150 = OpLabel
+        %152 = OpLoad %int %i_1
+        %153 = OpLoad %int %i_1
+        %154 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+        %155 = OpLoad %int %154
+        %156 = OpAccessChain %_ptr_Function_int %a_1 %152
+        %157 = OpIAdd %int %153 %155
+               OpStore %156 %157
+        %158 = OpLoad %int %i_1
+        %159 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_6
+        %160 = OpLoad %int %159
+        %161 = OpSLessThan %bool %158 %160
+               OpSelectionMerge %162 None
+               OpBranchConditional %161 %163 %162
+        %163 = OpLabel
+               OpBranch %130
+        %162 = OpLabel
+        %164 = OpLoad %int %i_1
+        %165 = OpLoad %int %i_1
+        %166 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_8
+        %167 = OpLoad %int %166
+        %168 = OpAccessChain %_ptr_Function_int %a_1 %164
+        %169 = OpIAdd %int %165 %167
+               OpStore %168 %169
+        %170 = OpLoad %int %i_1
+        %171 = OpAccessChain %_ptr_Function_int %a_1 %170
+        %172 = OpLoad %int %171
+               OpStore %param %172
+        %173 = OpFunctionCall %int %f_i1_ %param
+        %175 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_8
+        %176 = OpLoad %int %175
+        %177 = OpSLessThan %bool %173 %176
+               OpSelectionMerge %178 None
+               OpBranchConditional %177 %179 %178
+        %179 = OpLabel
+        %180 = OpLoad %int %i_1
+        %181 = OpAccessChain %_ptr_Function_int %a_1 %180
+        %182 = OpLoad %int %181
+        %183 = OpAccessChain %_ptr_Function_int %a_1 %180
+        %184 = OpISub %int %182 %int_1
+               OpStore %183 %184
+               OpBranch %178
+        %178 = OpLabel
+               OpBranch %149
+        %151 = OpLabel
+        %185 = OpLoad %int %i_1
+        %186 = OpAccessChain %_ptr_Function_int %a_1 %185
+        %187 = OpLoad %int %186
+               OpStore %param_1 %187
+        %188 = OpFunctionCall %int %f_i1_ %param_1
+        %190 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_8
+        %191 = OpLoad %int %190
+        %192 = OpSLessThan %bool %188 %191
+               OpSelectionMerge %193 None
+               OpBranchConditional %192 %194 %193
+        %194 = OpLabel
+        %195 = OpLoad %int %i_1
+        %196 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_4
+        %197 = OpLoad %int %196
+        %198 = OpAccessChain %_ptr_Function_int %a_1 %195
+        %199 = OpLoad %int %198
+        %200 = OpAccessChain %_ptr_Function_int %a_1 %195
+        %201 = OpIAdd %int %199 %197
+               OpStore %200 %201
+               OpBranch %193
+        %193 = OpLabel
+               OpBranch %149
+        %149 = OpLabel
+               OpBranch %130
+        %130 = OpLabel
+        %202 = OpLoad %int %i_1
+        %203 = OpIAdd %int %202 %int_1
+               OpStore %i_1 %203
+               OpBranch %128
+        %129 = OpLabel
+        %204 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+        %205 = OpLoad %int %204
+               OpStore %i_2 %205
+               OpBranch %206
+        %206 = OpLabel
+               OpLoopMerge %207 %208 None
+               OpBranch %209
+        %209 = OpLabel
+        %210 = OpLoad %int %i_2
+        %211 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_6
+        %212 = OpLoad %int %211
+        %213 = OpSLessThan %bool %210 %212
+               OpSelectionMerge %214 None
+               OpBranchConditional %213 %215 %216
+        %215 = OpLabel
+               OpBranch %214
+        %216 = OpLabel
+               OpBranch %207
+        %214 = OpLabel
+        %217 = OpLoad %int %i_2
+        %218 = OpAccessChain %_ptr_Function_int %a_1 %217
+        %219 = OpLoad %int %218
+        %220 = OpLoad %int %i_2
+        %221 = OpAccessChain %_ptr_Function_int %ref %220
+        %222 = OpLoad %int %221
+        %223 = OpINotEqual %bool %219 %222
+               OpSelectionMerge %224 None
+               OpBranchConditional %223 %225 %224
+        %225 = OpLabel
+        %226 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+        %227 = OpLoad %int %226
+        %228 = OpConvertSToF %float %227
+        %229 = OpCompositeConstruct %v4float %228 %228 %228 %228
+               OpStore %x_GLF_color %229
+               OpReturn
+        %224 = OpLabel
+               OpBranch %208
+        %208 = OpLabel
+        %230 = OpLoad %int %i_2
+        %231 = OpIAdd %int %230 %int_1
+               OpStore %i_2 %231
+               OpBranch %206
+        %207 = OpLabel
+        %232 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_11
+        %233 = OpLoad %int %232
+        %234 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+        %235 = OpLoad %int %234
+        %236 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+        %237 = OpLoad %int %236
+        %238 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_11
+        %239 = OpLoad %int %238
+        %240 = OpConvertSToF %float %233
+        %241 = OpConvertSToF %float %235
+        %242 = OpConvertSToF %float %237
+        %243 = OpConvertSToF %float %239
+        %244 = OpCompositeConstruct %v4float %240 %241 %242 %243
+               OpStore %x_GLF_color %244
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %245
+%tint_symbol = OpFunctionParameter %main_out
+        %249 = OpLabel
+        %250 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %250
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %54
+        %252 = OpLabel
+        %253 = OpFunctionCall %void %main_1
+        %255 = OpLoad %v4float %x_GLF_color
+        %256 = OpCompositeConstruct %main_out %255
+        %254 = OpFunctionCall %void %tint_symbol_2 %256
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inst-combine-calls-for-compare-function-call-result/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inst-combine-calls-for-compare-function-call-result/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..37cab95
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-inst-combine-calls-for-compare-function-call-result/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,177 @@
+type Arr = [[stride(16)]] array<i32, 12>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn f_i1_(a : ptr<function, i32>) -> i32 {
+  var i : i32;
+  let x_16 : i32 = x_8.x_GLF_uniform_int_values[0];
+  i = x_16;
+  loop {
+    let x_17 : i32 = i;
+    let x_18 : i32 = x_8.x_GLF_uniform_int_values[6];
+    if ((x_17 < x_18)) {
+    } else {
+      break;
+    }
+    let x_19 : i32 = i;
+    let x_20 : i32 = x_8.x_GLF_uniform_int_values[2];
+    if ((x_19 > x_20)) {
+      let x_21 : i32 = *(a);
+      return x_21;
+    }
+
+    continuing {
+      let x_22 : i32 = i;
+      i = (x_22 + 1);
+    }
+  }
+  let x_24 : i32 = x_8.x_GLF_uniform_int_values[0];
+  return x_24;
+}
+
+fn main_1() {
+  var ref : array<i32, 10>;
+  var i_1 : i32;
+  var a_1 : array<i32, 10>;
+  var param : i32;
+  var param_1 : i32;
+  var i_2 : i32;
+  let x_25 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_26 : i32 = x_8.x_GLF_uniform_int_values[1];
+  ref[x_25] = x_26;
+  let x_27 : i32 = x_8.x_GLF_uniform_int_values[11];
+  let x_28 : i32 = x_8.x_GLF_uniform_int_values[2];
+  ref[x_27] = x_28;
+  let x_29 : i32 = x_8.x_GLF_uniform_int_values[1];
+  let x_30 : i32 = x_8.x_GLF_uniform_int_values[3];
+  ref[x_29] = x_30;
+  let x_31 : i32 = x_8.x_GLF_uniform_int_values[2];
+  let x_32 : i32 = x_8.x_GLF_uniform_int_values[4];
+  ref[x_31] = x_32;
+  let x_33 : i32 = x_8.x_GLF_uniform_int_values[3];
+  let x_34 : i32 = x_8.x_GLF_uniform_int_values[5];
+  ref[x_33] = x_34;
+  let x_35 : i32 = x_8.x_GLF_uniform_int_values[4];
+  let x_36 : i32 = x_8.x_GLF_uniform_int_values[6];
+  ref[x_35] = x_36;
+  let x_37 : i32 = x_8.x_GLF_uniform_int_values[5];
+  let x_38 : i32 = x_8.x_GLF_uniform_int_values[7];
+  ref[x_37] = x_38;
+  let x_39 : i32 = x_8.x_GLF_uniform_int_values[8];
+  let x_40 : i32 = x_8.x_GLF_uniform_int_values[8];
+  ref[x_39] = x_40;
+  let x_41 : i32 = x_8.x_GLF_uniform_int_values[9];
+  let x_42 : i32 = x_8.x_GLF_uniform_int_values[9];
+  ref[x_41] = x_42;
+  let x_43 : i32 = x_8.x_GLF_uniform_int_values[10];
+  let x_44 : i32 = x_8.x_GLF_uniform_int_values[10];
+  ref[x_43] = x_44;
+  let x_45 : i32 = x_8.x_GLF_uniform_int_values[0];
+  i_1 = x_45;
+  loop {
+    let x_46 : i32 = i_1;
+    let x_47 : i32 = x_8.x_GLF_uniform_int_values[6];
+    if ((x_46 < x_47)) {
+    } else {
+      break;
+    }
+    let x_48 : i32 = i_1;
+    let x_49 : i32 = i_1;
+    a_1[x_48] = x_49;
+    let x_50 : i32 = i_1;
+    let x_51 : i32 = x_8.x_GLF_uniform_int_values[6];
+    let x_52 : i32 = x_8.x_GLF_uniform_int_values[1];
+    if ((x_50 < (x_51 / x_52))) {
+      let x_54 : i32 = i_1;
+      let x_55 : i32 = i_1;
+      let x_56 : i32 = x_8.x_GLF_uniform_int_values[1];
+      a_1[x_54] = (x_55 + x_56);
+      let x_58 : i32 = i_1;
+      let x_59 : i32 = x_8.x_GLF_uniform_int_values[6];
+      if ((x_58 < x_59)) {
+        continue;
+      }
+      let x_60 : i32 = i_1;
+      let x_61 : i32 = i_1;
+      let x_62 : i32 = x_8.x_GLF_uniform_int_values[8];
+      a_1[x_60] = (x_61 + x_62);
+      let x_64 : i32 = i_1;
+      let x_65 : i32 = a_1[x_64];
+      param = x_65;
+      let x_66 : i32 = f_i1_(&(param));
+      let x_67 : i32 = x_8.x_GLF_uniform_int_values[8];
+      if ((x_66 < x_67)) {
+        let x_68 : i32 = i_1;
+        let x_182 : ptr<function, i32> = &(a_1[x_68]);
+        let x_69 : i32 = *(x_182);
+        *(x_182) = (x_69 - 1);
+      }
+    } else {
+      let x_71 : i32 = i_1;
+      let x_72 : i32 = a_1[x_71];
+      param_1 = x_72;
+      let x_73 : i32 = f_i1_(&(param_1));
+      let x_74 : i32 = x_8.x_GLF_uniform_int_values[8];
+      if ((x_73 < x_74)) {
+        let x_75 : i32 = i_1;
+        let x_76 : i32 = x_8.x_GLF_uniform_int_values[4];
+        let x_77 : i32 = a_1[x_75];
+        a_1[x_75] = (x_77 + x_76);
+      }
+    }
+
+    continuing {
+      let x_79 : i32 = i_1;
+      i_1 = (x_79 + 1);
+    }
+  }
+  let x_81 : i32 = x_8.x_GLF_uniform_int_values[0];
+  i_2 = x_81;
+  loop {
+    let x_82 : i32 = i_2;
+    let x_83 : i32 = x_8.x_GLF_uniform_int_values[6];
+    if ((x_82 < x_83)) {
+    } else {
+      break;
+    }
+    let x_84 : i32 = i_2;
+    let x_85 : i32 = a_1[x_84];
+    let x_86 : i32 = i_2;
+    let x_87 : i32 = ref[x_86];
+    if ((x_85 != x_87)) {
+      let x_88 : i32 = x_8.x_GLF_uniform_int_values[0];
+      let x_205 : f32 = f32(x_88);
+      x_GLF_color = vec4<f32>(x_205, x_205, x_205, x_205);
+      return;
+    }
+
+    continuing {
+      let x_89 : i32 = i_2;
+      i_2 = (x_89 + 1);
+    }
+  }
+  let x_91 : i32 = x_8.x_GLF_uniform_int_values[11];
+  let x_92 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_93 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_94 : i32 = x_8.x_GLF_uniform_int_values[11];
+  x_GLF_color = vec4<f32>(f32(x_91), f32(x_92), f32(x_93), f32(x_94));
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-acos-undefined/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-acos-undefined/0-opt.spvasm
new file mode 100644
index 0000000..7349452
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-acos-undefined/0-opt.spvasm
@@ -0,0 +1,93 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %a "a"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %10 RelaxedPrecision
+               OpDecorate %11 RelaxedPrecision
+               OpDecorate %12 RelaxedPrecision
+               OpDecorate %13 RelaxedPrecision
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+       %void = OpTypeVoid
+         %16 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+%_ptr_Function_float = OpTypePointer Function %float
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%float_0x1_8p_128 = OpConstant %float 0x1.8p+128
+       %bool = OpTypeBool
+     %uint_1 = OpConstant %uint 1
+%_ptr_Output_float = OpTypePointer Output %float
+       %main = OpFunction %void None %16
+         %34 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function
+         %35 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %10 = OpLoad %int %35
+         %36 = OpConvertSToF %float %10
+         %37 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %11 = OpLoad %int %37
+         %38 = OpConvertSToF %float %11
+         %39 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %12 = OpLoad %int %39
+         %40 = OpConvertSToF %float %12
+         %41 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %13 = OpLoad %int %41
+         %42 = OpConvertSToF %float %13
+         %43 = OpCompositeConstruct %v4float %36 %38 %40 %42
+               OpStore %_GLF_color %43
+         %44 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_1
+         %45 = OpLoad %float %44
+         %46 = OpFMod %float %45 %float_0x1_8p_128
+               OpStore %a %46
+         %47 = OpLoad %float %a
+         %48 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %49 = OpLoad %float %48
+         %50 = OpFOrdNotEqual %bool %47 %49
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %51
+         %52 = OpLabel
+         %53 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %54 = OpLoad %float %53
+         %55 = OpAccessChain %_ptr_Output_float %_GLF_color %uint_1
+               OpStore %55 %54
+               OpBranch %51
+         %51 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-acos-undefined/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-acos-undefined/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..67f50ff
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-acos-undefined/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,43 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[2];
+};
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[2];
+};
+
+void main_1() {
+  float a = 0.0f;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_10 = asint(x_5[scalar_offset / 4][scalar_offset % 4]);
+  const int x_11 = asint(x_5[1].x);
+  const int x_12 = asint(x_5[1].x);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_13 = asint(x_5[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  x_GLF_color = float4(float(x_10), float(x_11), float(x_12), float(x_13));
+  const float x_45 = asfloat(x_8[1].x);
+  a = (x_45 % asfloat(0x7fc00000u));
+  const float x_47 = a;
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const float x_49 = asfloat(x_8[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  if ((x_47 != x_49)) {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const float x_54 = asfloat(x_8[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    x_GLF_color.y = x_54;
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-acos-undefined/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-acos-undefined/0-opt.spvasm.expected.msl
new file mode 100755
index 0000000..c3188c0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-acos-undefined/0-opt.spvasm.expected.msl
@@ -0,0 +1,63 @@
+SKIP: FAILED
+
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, constant buf1& x_8, thread float4* const tint_symbol_4) {
+  float a = 0.0f;
+  int const x_10 = x_5.x_GLF_uniform_int_values.arr[0].el;
+  int const x_11 = x_5.x_GLF_uniform_int_values.arr[1].el;
+  int const x_12 = x_5.x_GLF_uniform_int_values.arr[1].el;
+  int const x_13 = x_5.x_GLF_uniform_int_values.arr[0].el;
+  *(tint_symbol_4) = float4(float(x_10), float(x_11), float(x_12), float(x_13));
+  float const x_45 = x_8.x_GLF_uniform_float_values.arr[1].el;
+  a = (x_45 % NAN);
+  float const x_47 = a;
+  float const x_49 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_47 != x_49)) {
+    float const x_54 = x_8.x_GLF_uniform_float_values.arr[0].el;
+    (*(tint_symbol_4)).y = x_54;
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]], constant buf1& x_8 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
+T:\tmp\ubcg.0.metal:39:13: error: invalid operands to binary expression ('const float' and 'float')
+  a = (x_45 % NAN);
+       ~~~~ ^ ~~~
+1 error generated.
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-acos-undefined/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-acos-undefined/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..4c857a1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-acos-undefined/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,122 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 72
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_5 "x_5"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %25 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%float_0x1_8p_128 = OpConstant %float 0x1.8p+128
+       %bool = OpTypeBool
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+   %main_out = OpTypeStruct %v4float
+         %60 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function %25
+         %29 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %30 = OpLoad %int %29
+         %32 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %33 = OpLoad %int %32
+         %34 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %35 = OpLoad %int %34
+         %36 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %37 = OpLoad %int %36
+         %38 = OpConvertSToF %float %30
+         %39 = OpConvertSToF %float %33
+         %40 = OpConvertSToF %float %35
+         %41 = OpConvertSToF %float %37
+         %42 = OpCompositeConstruct %v4float %38 %39 %40 %41
+               OpStore %x_GLF_color %42
+         %44 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+         %45 = OpLoad %float %44
+         %47 = OpFMod %float %45 %float_0x1_8p_128
+               OpStore %a %47
+         %48 = OpLoad %float %a
+         %49 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %50 = OpLoad %float %49
+         %51 = OpFOrdNotEqual %bool %48 %50
+               OpSelectionMerge %53 None
+               OpBranchConditional %51 %54 %53
+         %54 = OpLabel
+         %55 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %56 = OpLoad %float %55
+         %59 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_1
+               OpStore %59 %56
+               OpBranch %53
+         %53 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %60
+%tint_symbol = OpFunctionParameter %main_out
+         %64 = OpLabel
+         %65 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %65
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+         %67 = OpLabel
+         %68 = OpFunctionCall %void %main_1
+         %70 = OpLoad %v4float %x_GLF_color
+         %71 = OpCompositeConstruct %main_out %70
+         %69 = OpFunctionCall %void %tint_symbol_2 %71
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-acos-undefined/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-acos-undefined/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..b317f98
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-acos-undefined/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,48 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+fn main_1() {
+  var a : f32;
+  let x_10 : i32 = x_5.x_GLF_uniform_int_values[0];
+  let x_11 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_12 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_13 : i32 = x_5.x_GLF_uniform_int_values[0];
+  x_GLF_color = vec4<f32>(f32(x_10), f32(x_11), f32(x_12), f32(x_13));
+  let x_45 : f32 = x_8.x_GLF_uniform_float_values[1];
+  a = (x_45 % 0x1.8p+128);
+  let x_47 : f32 = a;
+  let x_49 : f32 = x_8.x_GLF_uniform_float_values[0];
+  if ((x_47 != x_49)) {
+    let x_54 : f32 = x_8.x_GLF_uniform_float_values[0];
+    x_GLF_color.y = x_54;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-acos-undefined/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-acos-undefined/0-opt.wgsl
new file mode 100644
index 0000000..b317f98
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-acos-undefined/0-opt.wgsl
@@ -0,0 +1,48 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+fn main_1() {
+  var a : f32;
+  let x_10 : i32 = x_5.x_GLF_uniform_int_values[0];
+  let x_11 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_12 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_13 : i32 = x_5.x_GLF_uniform_int_values[0];
+  x_GLF_color = vec4<f32>(f32(x_10), f32(x_11), f32(x_12), f32(x_13));
+  let x_45 : f32 = x_8.x_GLF_uniform_float_values[1];
+  a = (x_45 % 0x1.8p+128);
+  let x_47 : f32 = a;
+  let x_49 : f32 = x_8.x_GLF_uniform_float_values[0];
+  if ((x_47 != x_49)) {
+    let x_54 : f32 = x_8.x_GLF_uniform_float_values[0];
+    x_GLF_color.y = x_54;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-acos-undefined/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-acos-undefined/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..d8c4e9b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-acos-undefined/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,6 @@
+SKIP: FAILED
+
+graphicsfuzz/cov-instruction-simplify-mod-acos-undefined/0-opt.wgsl:29:18 error: expected ')'
+  a = (x_45 % 0x1.8p+128);
+                 ^^
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-acos-undefined/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-acos-undefined/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..d8c4e9b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-acos-undefined/0-opt.wgsl.expected.msl
@@ -0,0 +1,6 @@
+SKIP: FAILED
+
+graphicsfuzz/cov-instruction-simplify-mod-acos-undefined/0-opt.wgsl:29:18 error: expected ')'
+  a = (x_45 % 0x1.8p+128);
+                 ^^
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-acos-undefined/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-acos-undefined/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..d8c4e9b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-acos-undefined/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,6 @@
+SKIP: FAILED
+
+graphicsfuzz/cov-instruction-simplify-mod-acos-undefined/0-opt.wgsl:29:18 error: expected ')'
+  a = (x_45 % 0x1.8p+128);
+                 ^^
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-acos-undefined/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-acos-undefined/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..d8c4e9b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-acos-undefined/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+SKIP: FAILED
+
+graphicsfuzz/cov-instruction-simplify-mod-acos-undefined/0-opt.wgsl:29:18 error: expected ')'
+  a = (x_45 % 0x1.8p+128);
+                 ^^
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-sqrt-undefined/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-sqrt-undefined/0-opt.spvasm
new file mode 100644
index 0000000..4be551c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-sqrt-undefined/0-opt.spvasm
@@ -0,0 +1,93 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %a "a"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %10 RelaxedPrecision
+               OpDecorate %11 RelaxedPrecision
+               OpDecorate %12 RelaxedPrecision
+               OpDecorate %13 RelaxedPrecision
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+       %void = OpTypeVoid
+         %16 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+%_ptr_Function_float = OpTypePointer Function %float
+%float_n0x1_8p_128 = OpConstant %float -0x1.8p+128
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+     %uint_1 = OpConstant %uint 1
+%_ptr_Output_float = OpTypePointer Output %float
+       %main = OpFunction %void None %16
+         %34 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function
+         %35 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %10 = OpLoad %int %35
+         %36 = OpConvertSToF %float %10
+         %37 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %11 = OpLoad %int %37
+         %38 = OpConvertSToF %float %11
+         %39 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %12 = OpLoad %int %39
+         %40 = OpConvertSToF %float %12
+         %41 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %13 = OpLoad %int %41
+         %42 = OpConvertSToF %float %13
+         %43 = OpCompositeConstruct %v4float %36 %38 %40 %42
+               OpStore %_GLF_color %43
+         %44 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_1
+         %45 = OpLoad %float %44
+         %46 = OpFMod %float %float_n0x1_8p_128 %45
+               OpStore %a %46
+         %47 = OpLoad %float %a
+         %48 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %49 = OpLoad %float %48
+         %50 = OpFOrdNotEqual %bool %47 %49
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %51
+         %52 = OpLabel
+         %53 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %54 = OpLoad %float %53
+         %55 = OpAccessChain %_ptr_Output_float %_GLF_color %uint_1
+               OpStore %55 %54
+               OpBranch %51
+         %51 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-sqrt-undefined/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-sqrt-undefined/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..420ed9d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-sqrt-undefined/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,43 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[2];
+};
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[2];
+};
+
+void main_1() {
+  float a = 0.0f;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_10 = asint(x_5[scalar_offset / 4][scalar_offset % 4]);
+  const int x_11 = asint(x_5[1].x);
+  const int x_12 = asint(x_5[1].x);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_13 = asint(x_5[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  x_GLF_color = float4(float(x_10), float(x_11), float(x_12), float(x_13));
+  const float x_45 = asfloat(x_8[1].x);
+  a = (asfloat(0x7fc00000u) % x_45);
+  const float x_47 = a;
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const float x_49 = asfloat(x_8[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  if ((x_47 != x_49)) {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const float x_54 = asfloat(x_8[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    x_GLF_color.y = x_54;
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-sqrt-undefined/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-sqrt-undefined/0-opt.spvasm.expected.msl
new file mode 100755
index 0000000..915b6d5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-sqrt-undefined/0-opt.spvasm.expected.msl
@@ -0,0 +1,63 @@
+SKIP: FAILED
+
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, constant buf1& x_8, thread float4* const tint_symbol_4) {
+  float a = 0.0f;
+  int const x_10 = x_5.x_GLF_uniform_int_values.arr[0].el;
+  int const x_11 = x_5.x_GLF_uniform_int_values.arr[1].el;
+  int const x_12 = x_5.x_GLF_uniform_int_values.arr[1].el;
+  int const x_13 = x_5.x_GLF_uniform_int_values.arr[0].el;
+  *(tint_symbol_4) = float4(float(x_10), float(x_11), float(x_12), float(x_13));
+  float const x_45 = x_8.x_GLF_uniform_float_values.arr[1].el;
+  a = (NAN % x_45);
+  float const x_47 = a;
+  float const x_49 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_47 != x_49)) {
+    float const x_54 = x_8.x_GLF_uniform_float_values.arr[0].el;
+    (*(tint_symbol_4)).y = x_54;
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]], constant buf1& x_8 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
+T:\tmp\uc6w.0.metal:39:12: error: invalid operands to binary expression ('float' and 'const float')
+  a = (NAN % x_45);
+       ~~~ ^ ~~~~
+1 error generated.
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-sqrt-undefined/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-sqrt-undefined/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..e69f89a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-sqrt-undefined/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,122 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 72
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_5 "x_5"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %25 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%float_n0x1_8p_128 = OpConstant %float -0x1.8p+128
+       %bool = OpTypeBool
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+   %main_out = OpTypeStruct %v4float
+         %60 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function %25
+         %29 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %30 = OpLoad %int %29
+         %32 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %33 = OpLoad %int %32
+         %34 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %35 = OpLoad %int %34
+         %36 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %37 = OpLoad %int %36
+         %38 = OpConvertSToF %float %30
+         %39 = OpConvertSToF %float %33
+         %40 = OpConvertSToF %float %35
+         %41 = OpConvertSToF %float %37
+         %42 = OpCompositeConstruct %v4float %38 %39 %40 %41
+               OpStore %x_GLF_color %42
+         %44 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+         %45 = OpLoad %float %44
+         %47 = OpFMod %float %float_n0x1_8p_128 %45
+               OpStore %a %47
+         %48 = OpLoad %float %a
+         %49 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %50 = OpLoad %float %49
+         %51 = OpFOrdNotEqual %bool %48 %50
+               OpSelectionMerge %53 None
+               OpBranchConditional %51 %54 %53
+         %54 = OpLabel
+         %55 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %56 = OpLoad %float %55
+         %59 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_1
+               OpStore %59 %56
+               OpBranch %53
+         %53 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %60
+%tint_symbol = OpFunctionParameter %main_out
+         %64 = OpLabel
+         %65 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %65
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+         %67 = OpLabel
+         %68 = OpFunctionCall %void %main_1
+         %70 = OpLoad %v4float %x_GLF_color
+         %71 = OpCompositeConstruct %main_out %70
+         %69 = OpFunctionCall %void %tint_symbol_2 %71
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-sqrt-undefined/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-sqrt-undefined/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..bf323a2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-sqrt-undefined/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,48 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+fn main_1() {
+  var a : f32;
+  let x_10 : i32 = x_5.x_GLF_uniform_int_values[0];
+  let x_11 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_12 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_13 : i32 = x_5.x_GLF_uniform_int_values[0];
+  x_GLF_color = vec4<f32>(f32(x_10), f32(x_11), f32(x_12), f32(x_13));
+  let x_45 : f32 = x_8.x_GLF_uniform_float_values[1];
+  a = (-0x1.8p+128 % x_45);
+  let x_47 : f32 = a;
+  let x_49 : f32 = x_8.x_GLF_uniform_float_values[0];
+  if ((x_47 != x_49)) {
+    let x_54 : f32 = x_8.x_GLF_uniform_float_values[0];
+    x_GLF_color.y = x_54;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-sqrt-undefined/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-sqrt-undefined/0-opt.wgsl
new file mode 100644
index 0000000..bf323a2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-sqrt-undefined/0-opt.wgsl
@@ -0,0 +1,48 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+fn main_1() {
+  var a : f32;
+  let x_10 : i32 = x_5.x_GLF_uniform_int_values[0];
+  let x_11 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_12 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_13 : i32 = x_5.x_GLF_uniform_int_values[0];
+  x_GLF_color = vec4<f32>(f32(x_10), f32(x_11), f32(x_12), f32(x_13));
+  let x_45 : f32 = x_8.x_GLF_uniform_float_values[1];
+  a = (-0x1.8p+128 % x_45);
+  let x_47 : f32 = a;
+  let x_49 : f32 = x_8.x_GLF_uniform_float_values[0];
+  if ((x_47 != x_49)) {
+    let x_54 : f32 = x_8.x_GLF_uniform_float_values[0];
+    x_GLF_color.y = x_54;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-sqrt-undefined/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-sqrt-undefined/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..4302ba9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-sqrt-undefined/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,6 @@
+SKIP: FAILED
+
+graphicsfuzz/cov-instruction-simplify-mod-sqrt-undefined/0-opt.wgsl:29:12 error: expected ')'
+  a = (-0x1.8p+128 % x_45);
+           ^^
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-sqrt-undefined/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-sqrt-undefined/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..4302ba9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-sqrt-undefined/0-opt.wgsl.expected.msl
@@ -0,0 +1,6 @@
+SKIP: FAILED
+
+graphicsfuzz/cov-instruction-simplify-mod-sqrt-undefined/0-opt.wgsl:29:12 error: expected ')'
+  a = (-0x1.8p+128 % x_45);
+           ^^
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-sqrt-undefined/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-sqrt-undefined/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..4302ba9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-sqrt-undefined/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,6 @@
+SKIP: FAILED
+
+graphicsfuzz/cov-instruction-simplify-mod-sqrt-undefined/0-opt.wgsl:29:12 error: expected ')'
+  a = (-0x1.8p+128 % x_45);
+           ^^
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-sqrt-undefined/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-sqrt-undefined/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..4302ba9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-mod-sqrt-undefined/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+SKIP: FAILED
+
+graphicsfuzz/cov-instruction-simplify-mod-sqrt-undefined/0-opt.wgsl:29:12 error: expected ')'
+  a = (-0x1.8p+128 % x_45);
+           ^^
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-sqrt/0.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-sqrt/0.spvasm
new file mode 100644
index 0000000..f4245f8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-sqrt/0.spvasm
@@ -0,0 +1,80 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf1 0 RelaxedPrecision
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %10 RelaxedPrecision
+               OpDecorate %11 RelaxedPrecision
+               OpDecorate %12 RelaxedPrecision
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+   %float_n1 = OpConstant %float -1
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %main = OpFunction %void None %14
+         %29 = OpLabel
+         %30 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %31 = OpLoad %float %30
+         %32 = OpExtInst %float %1 Sqrt %31
+         %33 = OpFOrdLessThan %bool %32 %float_n1
+               OpSelectionMerge %34 None
+               OpBranchConditional %33 %35 %36
+         %35 = OpLabel
+         %37 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %10 = OpLoad %int %37
+         %38 = OpConvertSToF %float %10
+         %39 = OpCompositeConstruct %v4float %38 %38 %38 %38
+               OpStore %_GLF_color %39
+               OpBranch %34
+         %36 = OpLabel
+         %40 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %11 = OpLoad %int %40
+         %41 = OpConvertSToF %float %11
+         %42 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %12 = OpLoad %int %42
+         %43 = OpConvertSToF %float %12
+         %44 = OpCompositeConstruct %v4float %41 %43 %43 %41
+               OpStore %_GLF_color %44
+               OpBranch %34
+         %34 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-sqrt/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-sqrt/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..633dded
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-sqrt/0.spvasm.expected.hlsl
@@ -0,0 +1,39 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_7 : register(b1, space0) {
+  uint4 x_7[2];
+};
+
+void main_1() {
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_31 = asfloat(x_5[scalar_offset / 4][scalar_offset % 4]);
+  if ((sqrt(x_31) < -1.0f)) {
+    const int x_10 = asint(x_7[1].x);
+    const float x_38 = float(x_10);
+    x_GLF_color = float4(x_38, x_38, x_38, x_38);
+  } else {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_11 = asint(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const float x_41 = float(x_11);
+    const int x_12 = asint(x_7[1].x);
+    const float x_43 = float(x_12);
+    x_GLF_color = float4(x_41, x_43, x_43, x_41);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-sqrt/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-sqrt/0.spvasm.expected.msl
new file mode 100644
index 0000000..b7aac08
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-sqrt/0.spvasm.expected.msl
@@ -0,0 +1,54 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, constant buf1& x_7, thread float4* const tint_symbol_4) {
+  float const x_31 = x_5.x_GLF_uniform_float_values.arr[0].el;
+  if ((sqrt(x_31) < -1.0f)) {
+    int const x_10 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    float const x_38 = float(x_10);
+    *(tint_symbol_4) = float4(x_38, x_38, x_38, x_38);
+  } else {
+    int const x_11 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    float const x_41 = float(x_11);
+    int const x_12 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    float const x_43 = float(x_12);
+    *(tint_symbol_4) = float4(x_41, x_43, x_43, x_41);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]], constant buf1& x_7 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-sqrt/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-sqrt/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..c602080
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-sqrt/0.spvasm.expected.spvasm
@@ -0,0 +1,110 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 61
+; Schema: 0
+               OpCapability Shader
+         %29 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %11 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %11
+        %int = OpTypeInt 32 1
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_7 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %11
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+   %float_n1 = OpConstant %float -1
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+         %49 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+         %26 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %27 = OpLoad %float %26
+         %28 = OpExtInst %float %29 Sqrt %27
+         %31 = OpFOrdLessThan %bool %28 %float_n1
+               OpSelectionMerge %33 None
+               OpBranchConditional %31 %34 %35
+         %34 = OpLabel
+         %38 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %39 = OpLoad %int %38
+         %40 = OpConvertSToF %float %39
+         %41 = OpCompositeConstruct %v4float %40 %40 %40 %40
+               OpStore %x_GLF_color %41
+               OpBranch %33
+         %35 = OpLabel
+         %42 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %43 = OpLoad %int %42
+         %44 = OpConvertSToF %float %43
+         %45 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %46 = OpLoad %int %45
+         %47 = OpConvertSToF %float %46
+         %48 = OpCompositeConstruct %v4float %44 %47 %47 %44
+               OpStore %x_GLF_color %48
+               OpBranch %33
+         %33 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %49
+%tint_symbol = OpFunctionParameter %main_out
+         %53 = OpLabel
+         %54 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %54
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+         %56 = OpLabel
+         %57 = OpFunctionCall %void %main_1
+         %59 = OpLoad %v4float %x_GLF_color
+         %60 = OpCompositeConstruct %main_out %59
+         %58 = OpFunctionCall %void %tint_symbol_2 %60
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-sqrt/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-sqrt/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..0deb2a8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-sqrt/0.spvasm.expected.wgsl
@@ -0,0 +1,46 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+fn main_1() {
+  let x_31 : f32 = x_5.x_GLF_uniform_float_values[0];
+  if ((sqrt(x_31) < -1.0)) {
+    let x_10 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_38 : f32 = f32(x_10);
+    x_GLF_color = vec4<f32>(x_38, x_38, x_38, x_38);
+  } else {
+    let x_11 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_41 : f32 = f32(x_11);
+    let x_12 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_43 : f32 = f32(x_12);
+    x_GLF_color = vec4<f32>(x_41, x_43, x_43, x_41);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-sqrt/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-sqrt/0.wgsl
new file mode 100644
index 0000000..0deb2a8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-sqrt/0.wgsl
@@ -0,0 +1,46 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+fn main_1() {
+  let x_31 : f32 = x_5.x_GLF_uniform_float_values[0];
+  if ((sqrt(x_31) < -1.0)) {
+    let x_10 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_38 : f32 = f32(x_10);
+    x_GLF_color = vec4<f32>(x_38, x_38, x_38, x_38);
+  } else {
+    let x_11 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_41 : f32 = f32(x_11);
+    let x_12 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_43 : f32 = f32(x_12);
+    x_GLF_color = vec4<f32>(x_41, x_43, x_43, x_41);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-sqrt/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-sqrt/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..633dded
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-sqrt/0.wgsl.expected.hlsl
@@ -0,0 +1,39 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_7 : register(b1, space0) {
+  uint4 x_7[2];
+};
+
+void main_1() {
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_31 = asfloat(x_5[scalar_offset / 4][scalar_offset % 4]);
+  if ((sqrt(x_31) < -1.0f)) {
+    const int x_10 = asint(x_7[1].x);
+    const float x_38 = float(x_10);
+    x_GLF_color = float4(x_38, x_38, x_38, x_38);
+  } else {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_11 = asint(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const float x_41 = float(x_11);
+    const int x_12 = asint(x_7[1].x);
+    const float x_43 = float(x_12);
+    x_GLF_color = float4(x_41, x_43, x_43, x_41);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-sqrt/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-sqrt/0.wgsl.expected.msl
new file mode 100644
index 0000000..b7aac08
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-sqrt/0.wgsl.expected.msl
@@ -0,0 +1,54 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, constant buf1& x_7, thread float4* const tint_symbol_4) {
+  float const x_31 = x_5.x_GLF_uniform_float_values.arr[0].el;
+  if ((sqrt(x_31) < -1.0f)) {
+    int const x_10 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    float const x_38 = float(x_10);
+    *(tint_symbol_4) = float4(x_38, x_38, x_38, x_38);
+  } else {
+    int const x_11 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    float const x_41 = float(x_11);
+    int const x_12 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    float const x_43 = float(x_12);
+    *(tint_symbol_4) = float4(x_41, x_43, x_43, x_41);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]], constant buf1& x_7 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-sqrt/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-sqrt/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..c602080
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-sqrt/0.wgsl.expected.spvasm
@@ -0,0 +1,110 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 61
+; Schema: 0
+               OpCapability Shader
+         %29 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %11 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %11
+        %int = OpTypeInt 32 1
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_7 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %11
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+   %float_n1 = OpConstant %float -1
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+         %49 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+         %26 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %27 = OpLoad %float %26
+         %28 = OpExtInst %float %29 Sqrt %27
+         %31 = OpFOrdLessThan %bool %28 %float_n1
+               OpSelectionMerge %33 None
+               OpBranchConditional %31 %34 %35
+         %34 = OpLabel
+         %38 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %39 = OpLoad %int %38
+         %40 = OpConvertSToF %float %39
+         %41 = OpCompositeConstruct %v4float %40 %40 %40 %40
+               OpStore %x_GLF_color %41
+               OpBranch %33
+         %35 = OpLabel
+         %42 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %43 = OpLoad %int %42
+         %44 = OpConvertSToF %float %43
+         %45 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %46 = OpLoad %int %45
+         %47 = OpConvertSToF %float %46
+         %48 = OpCompositeConstruct %v4float %44 %47 %47 %44
+               OpStore %x_GLF_color %48
+               OpBranch %33
+         %33 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %49
+%tint_symbol = OpFunctionParameter %main_out
+         %53 = OpLabel
+         %54 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %54
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+         %56 = OpLabel
+         %57 = OpFunctionCall %void %main_1
+         %59 = OpLoad %v4float %x_GLF_color
+         %60 = OpCompositeConstruct %main_out %59
+         %58 = OpFunctionCall %void %tint_symbol_2 %60
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-sqrt/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-sqrt/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..0deb2a8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instruction-simplify-sqrt/0.wgsl.expected.wgsl
@@ -0,0 +1,46 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+fn main_1() {
+  let x_31 : f32 = x_5.x_GLF_uniform_float_values[0];
+  if ((sqrt(x_31) < -1.0)) {
+    let x_10 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_38 : f32 = f32(x_10);
+    x_GLF_color = vec4<f32>(x_38, x_38, x_38, x_38);
+  } else {
+    let x_11 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_41 : f32 = f32(x_11);
+    let x_12 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_43 : f32 = f32(x_12);
+    x_GLF_color = vec4<f32>(x_41, x_43, x_43, x_41);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instructions-first-value-phi/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-instructions-first-value-phi/0-opt.spvasm
new file mode 100644
index 0000000..a7d1e76
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instructions-first-value-phi/0-opt.spvasm
@@ -0,0 +1,263 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %S "S"
+               OpMemberName %S 0 "data"
+               OpName %func_struct_S_i11_ "func(struct-S-i11;"
+               OpName %s "s"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "v1"
+               OpName %_ ""
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %i "i"
+               OpName %arr "arr"
+               OpName %i_0 "i"
+               OpName %param "param"
+               OpName %j "j"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_arr_int_uint_5 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+          %S = OpTypeStruct %int
+%_ptr_Function_S = OpTypePointer Function %S
+         %21 = OpTypeFunction %void %_ptr_Function_S
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+     %uint_5 = OpConstant %uint 5
+%_arr_int_uint_5 = OpTypeArray %int %uint_5
+       %buf0 = OpTypeStruct %_arr_int_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_2 = OpConstant %int 2
+     %uint_3 = OpConstant %uint 3
+%_arr_S_uint_3 = OpTypeArray %S %uint_3
+%_ptr_Function__arr_S_uint_3 = OpTypePointer Function %_arr_S_uint_3
+      %int_1 = OpConstant %int 1
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %18
+         %44 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+        %arr = OpVariable %_ptr_Function__arr_S_uint_3 Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_S Function
+          %j = OpVariable %_ptr_Function_int Function
+         %45 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %46 = OpLoad %int %45
+               OpStore %i %46
+               OpBranch %47
+         %47 = OpLabel
+               OpLoopMerge %48 %49 None
+               OpBranch %50
+         %50 = OpLabel
+         %51 = OpLoad %int %i
+         %52 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %53 = OpLoad %int %52
+         %54 = OpSLessThan %bool %51 %53
+               OpBranchConditional %54 %55 %48
+         %55 = OpLabel
+         %56 = OpLoad %int %i
+         %57 = OpLoad %int %i
+         %58 = OpAccessChain %_ptr_Function_int %arr %56 %int_0
+               OpStore %58 %57
+               OpBranch %49
+         %49 = OpLabel
+         %59 = OpLoad %int %i
+         %60 = OpIAdd %int %59 %int_1
+               OpStore %i %60
+               OpBranch %47
+         %48 = OpLabel
+         %61 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %62 = OpLoad %int %61
+               OpStore %i_0 %62
+               OpBranch %63
+         %63 = OpLabel
+               OpLoopMerge %64 %65 None
+               OpBranch %66
+         %66 = OpLabel
+         %67 = OpLoad %int %i_0
+         %68 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %69 = OpLoad %int %68
+         %70 = OpSLessThan %bool %67 %69
+               OpBranchConditional %70 %71 %64
+         %71 = OpLabel
+         %72 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %73 = OpLoad %float %72
+         %74 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %75 = OpLoad %float %74
+         %76 = OpFOrdGreaterThan %bool %73 %75
+               OpSelectionMerge %77 None
+               OpBranchConditional %76 %78 %77
+         %78 = OpLabel
+               OpBranch %64
+         %77 = OpLabel
+         %79 = OpLoad %int %i_0
+         %80 = OpAccessChain %_ptr_Function_int %arr %79 %int_0
+         %81 = OpLoad %int %80
+         %82 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_3
+         %83 = OpLoad %int %82
+         %84 = OpIEqual %bool %81 %83
+               OpSelectionMerge %85 None
+               OpBranchConditional %84 %86 %87
+         %86 = OpLabel
+         %88 = OpLoad %int %i_0
+         %89 = OpAccessChain %_ptr_Function_S %arr %88
+         %90 = OpLoad %S %89
+               OpStore %param %90
+         %91 = OpFunctionCall %void %func_struct_S_i11_ %param
+         %92 = OpLoad %S %param
+         %93 = OpAccessChain %_ptr_Function_S %arr %88
+               OpStore %93 %92
+               OpBranch %85
+         %87 = OpLabel
+         %94 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %95 = OpLoad %int %94
+               OpStore %j %95
+               OpBranch %96
+         %96 = OpLabel
+               OpLoopMerge %97 %98 None
+               OpBranch %99
+         %99 = OpLabel
+        %100 = OpLoad %int %j
+        %101 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+        %102 = OpLoad %int %101
+        %103 = OpSLessThan %bool %100 %102
+               OpBranchConditional %103 %104 %97
+        %104 = OpLabel
+        %105 = OpLoad %int %j
+        %106 = OpAccessChain %_ptr_Function_int %arr %105 %int_0
+        %107 = OpLoad %int %106
+        %108 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_4
+        %109 = OpLoad %int %108
+        %110 = OpSGreaterThan %bool %107 %109
+               OpSelectionMerge %111 None
+               OpBranchConditional %110 %112 %111
+        %112 = OpLabel
+               OpKill
+        %111 = OpLabel
+               OpBranch %98
+         %98 = OpLabel
+        %113 = OpLoad %int %j
+        %114 = OpIAdd %int %113 %int_1
+               OpStore %j %114
+               OpBranch %96
+         %97 = OpLabel
+               OpBranch %85
+         %85 = OpLabel
+               OpBranch %65
+         %65 = OpLabel
+        %115 = OpLoad %int %i_0
+        %116 = OpIAdd %int %115 %int_1
+               OpStore %i_0 %116
+               OpBranch %63
+         %64 = OpLabel
+        %117 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+        %118 = OpLoad %int %117
+        %119 = OpAccessChain %_ptr_Function_int %arr %118 %int_0
+        %120 = OpLoad %int %119
+        %121 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+        %122 = OpLoad %int %121
+        %123 = OpIEqual %bool %120 %122
+               OpSelectionMerge %124 None
+               OpBranchConditional %123 %125 %124
+        %125 = OpLabel
+        %126 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_3
+        %127 = OpLoad %int %126
+        %128 = OpAccessChain %_ptr_Function_int %arr %127 %int_0
+        %129 = OpLoad %int %128
+        %130 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+        %131 = OpLoad %int %130
+        %132 = OpIEqual %bool %129 %131
+               OpBranch %124
+        %124 = OpLabel
+        %133 = OpPhi %bool %123 %64 %132 %125
+               OpSelectionMerge %134 None
+               OpBranchConditional %133 %135 %134
+        %135 = OpLabel
+        %136 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %137 = OpLoad %int %136
+        %138 = OpAccessChain %_ptr_Function_int %arr %137 %int_0
+        %139 = OpLoad %int %138
+        %140 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %141 = OpLoad %int %140
+        %142 = OpIEqual %bool %139 %141
+               OpBranch %134
+        %134 = OpLabel
+        %143 = OpPhi %bool %133 %124 %142 %135
+               OpSelectionMerge %144 None
+               OpBranchConditional %143 %145 %146
+        %145 = OpLabel
+        %147 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_3
+        %148 = OpLoad %int %147
+        %149 = OpConvertSToF %float %148
+        %150 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+        %151 = OpLoad %int %150
+        %152 = OpConvertSToF %float %151
+        %153 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+        %154 = OpLoad %int %153
+        %155 = OpConvertSToF %float %154
+        %156 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_3
+        %157 = OpLoad %int %156
+        %158 = OpConvertSToF %float %157
+        %159 = OpCompositeConstruct %v4float %149 %152 %155 %158
+               OpStore %_GLF_color %159
+               OpBranch %144
+        %146 = OpLabel
+        %160 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+        %161 = OpLoad %int %160
+        %162 = OpConvertSToF %float %161
+        %163 = OpCompositeConstruct %v4float %162 %162 %162 %162
+               OpStore %_GLF_color %163
+               OpBranch %144
+        %144 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%func_struct_S_i11_ = OpFunction %void None %21
+          %s = OpFunctionParameter %_ptr_Function_S
+        %164 = OpLabel
+        %165 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+        %166 = OpLoad %float %165
+        %167 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+        %168 = OpLoad %float %167
+        %169 = OpFOrdGreaterThan %bool %166 %168
+               OpSelectionMerge %170 None
+               OpBranchConditional %169 %171 %170
+        %171 = OpLabel
+               OpReturn
+        %170 = OpLabel
+        %172 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+        %173 = OpLoad %int %172
+        %174 = OpAccessChain %_ptr_Function_int %s %int_0
+               OpStore %174 %173
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instructions-first-value-phi/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-instructions-first-value-phi/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..d405088
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instructions-first-value-phi/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,146 @@
+struct S {
+  int data;
+};
+
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[1];
+};
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[5];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void func_struct_S_i11_(inout S s) {
+  const float x_166 = asfloat(x_8[0].x);
+  const float x_168 = asfloat(x_8[0].y);
+  if ((x_166 > x_168)) {
+    return;
+  }
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_173 = asint(x_10[scalar_offset / 4][scalar_offset % 4]);
+  s.data = x_173;
+  return;
+}
+
+void main_1() {
+  int i = 0;
+  S arr[3] = (S[3])0;
+  int i_1 = 0;
+  S param = (S)0;
+  int j = 0;
+  bool x_132 = false;
+  bool x_142 = false;
+  bool x_133_phi = false;
+  bool x_143_phi = false;
+  const int x_46 = asint(x_10[2].x);
+  i = x_46;
+  while (true) {
+    const int x_51 = i;
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_53 = asint(x_10[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    if ((x_51 < x_53)) {
+    } else {
+      break;
+    }
+    arr[i].data = i;
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_62 = asint(x_10[2].x);
+  i_1 = x_62;
+  while (true) {
+    const int x_67 = i_1;
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_69 = asint(x_10[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    if ((x_67 < x_69)) {
+    } else {
+      break;
+    }
+    const float x_73 = asfloat(x_8[0].x);
+    const float x_75 = asfloat(x_8[0].y);
+    if ((x_73 > x_75)) {
+      break;
+    }
+    const int x_81 = arr[i_1].data;
+    const int x_83 = asint(x_10[3].x);
+    if ((x_81 == x_83)) {
+      const int x_88 = i_1;
+      const S x_90 = arr[x_88];
+      param = x_90;
+      func_struct_S_i11_(param);
+      arr[x_88] = param;
+    } else {
+      const int x_95 = asint(x_10[2].x);
+      j = x_95;
+      while (true) {
+        const int x_100 = j;
+        const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+        const int x_102 = asint(x_10[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+        if ((x_100 < x_102)) {
+        } else {
+          break;
+        }
+        const int x_107 = arr[j].data;
+        const int x_109 = asint(x_10[4].x);
+        if ((x_107 > x_109)) {
+          discard;
+        }
+        {
+          j = (j + 1);
+        }
+      }
+    }
+    {
+      i_1 = (i_1 + 1);
+    }
+  }
+  const int x_118 = asint(x_10[2].x);
+  const int x_120 = arr[x_118].data;
+  const int x_122 = asint(x_10[2].x);
+  const bool x_123 = (x_120 == x_122);
+  x_133_phi = x_123;
+  if (x_123) {
+    const int x_127 = asint(x_10[3].x);
+    const int x_129 = arr[x_127].data;
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_131 = asint(x_10[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    x_132 = (x_129 == x_131);
+    x_133_phi = x_132;
+  }
+  const bool x_133 = x_133_phi;
+  x_143_phi = x_133;
+  if (x_133) {
+    const int x_137 = asint(x_10[1].x);
+    const int x_139 = arr[x_137].data;
+    const int x_141 = asint(x_10[1].x);
+    x_142 = (x_139 == x_141);
+    x_143_phi = x_142;
+  }
+  if (x_143_phi) {
+    const int x_148 = asint(x_10[3].x);
+    const int x_151 = asint(x_10[2].x);
+    const int x_154 = asint(x_10[2].x);
+    const int x_157 = asint(x_10[3].x);
+    x_GLF_color = float4(float(x_148), float(x_151), float(x_154), float(x_157));
+  } else {
+    const int x_161 = asint(x_10[2].x);
+    const float x_162 = float(x_161);
+    x_GLF_color = float4(x_162, x_162, x_162, x_162);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instructions-first-value-phi/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-instructions-first-value-phi/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..df420d2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instructions-first-value-phi/0-opt.spvasm.expected.msl
@@ -0,0 +1,162 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  int data;
+};
+struct buf1 {
+  /* 0x0000 */ packed_float2 v1;
+};
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[5];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_1 {
+  S arr[3];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void func_struct_S_i11_(constant buf1& x_8, constant buf0& x_10, thread S* const s) {
+  float const x_166 = x_8.v1.x;
+  float const x_168 = x_8.v1.y;
+  if ((x_166 > x_168)) {
+    return;
+  }
+  int const x_173 = x_10.x_GLF_uniform_int_values.arr[0].el;
+  (*(s)).data = x_173;
+  return;
+}
+
+void main_1(constant buf0& x_10, constant buf1& x_8, thread float4* const tint_symbol_4) {
+  int i = 0;
+  tint_array_wrapper_1 arr = {};
+  int i_1 = 0;
+  S param = {};
+  int j = 0;
+  bool x_132 = false;
+  bool x_142 = false;
+  bool x_133_phi = false;
+  bool x_143_phi = false;
+  int const x_46 = x_10.x_GLF_uniform_int_values.arr[2].el;
+  i = x_46;
+  while (true) {
+    int const x_51 = i;
+    int const x_53 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_51 < x_53)) {
+    } else {
+      break;
+    }
+    int const x_56 = i;
+    int const x_57 = i;
+    arr.arr[x_56].data = x_57;
+    {
+      int const x_59 = i;
+      i = (x_59 + 1);
+    }
+  }
+  int const x_62 = x_10.x_GLF_uniform_int_values.arr[2].el;
+  i_1 = x_62;
+  while (true) {
+    int const x_67 = i_1;
+    int const x_69 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_67 < x_69)) {
+    } else {
+      break;
+    }
+    float const x_73 = x_8.v1.x;
+    float const x_75 = x_8.v1.y;
+    if ((x_73 > x_75)) {
+      break;
+    }
+    int const x_79 = i_1;
+    int const x_81 = arr.arr[x_79].data;
+    int const x_83 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    if ((x_81 == x_83)) {
+      int const x_88 = i_1;
+      S const x_90 = arr.arr[x_88];
+      param = x_90;
+      func_struct_S_i11_(x_8, x_10, &(param));
+      S const x_92 = param;
+      arr.arr[x_88] = x_92;
+    } else {
+      int const x_95 = x_10.x_GLF_uniform_int_values.arr[2].el;
+      j = x_95;
+      while (true) {
+        int const x_100 = j;
+        int const x_102 = x_10.x_GLF_uniform_int_values.arr[0].el;
+        if ((x_100 < x_102)) {
+        } else {
+          break;
+        }
+        int const x_105 = j;
+        int const x_107 = arr.arr[x_105].data;
+        int const x_109 = x_10.x_GLF_uniform_int_values.arr[4].el;
+        if ((x_107 > x_109)) {
+          discard_fragment();
+        }
+        {
+          int const x_113 = j;
+          j = (x_113 + 1);
+        }
+      }
+    }
+    {
+      int const x_115 = i_1;
+      i_1 = (x_115 + 1);
+    }
+  }
+  int const x_118 = x_10.x_GLF_uniform_int_values.arr[2].el;
+  int const x_120 = arr.arr[x_118].data;
+  int const x_122 = x_10.x_GLF_uniform_int_values.arr[2].el;
+  bool const x_123 = (x_120 == x_122);
+  x_133_phi = x_123;
+  if (x_123) {
+    int const x_127 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    int const x_129 = arr.arr[x_127].data;
+    int const x_131 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    x_132 = (x_129 == x_131);
+    x_133_phi = x_132;
+  }
+  bool const x_133 = x_133_phi;
+  x_143_phi = x_133;
+  if (x_133) {
+    int const x_137 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_139 = arr.arr[x_137].data;
+    int const x_141 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    x_142 = (x_139 == x_141);
+    x_143_phi = x_142;
+  }
+  bool const x_143 = x_143_phi;
+  if (x_143) {
+    int const x_148 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    int const x_151 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    int const x_154 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    int const x_157 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    *(tint_symbol_4) = float4(float(x_148), float(x_151), float(x_154), float(x_157));
+  } else {
+    int const x_161 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    float const x_162 = float(x_161);
+    *(tint_symbol_4) = float4(x_162, x_162, x_162, x_162);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_10 [[buffer(0)]], constant buf1& x_8 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_10, x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instructions-first-value-phi/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-instructions-first-value-phi/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..0e18564
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instructions-first-value-phi/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,333 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 208
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "v1"
+               OpName %x_8 "x_8"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %S "S"
+               OpMemberName %S 0 "data"
+               OpName %func_struct_S_i11_ "func_struct_S_i11_"
+               OpName %s "s"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %arr "arr"
+               OpName %i_1 "i_1"
+               OpName %param "param"
+               OpName %j "j"
+               OpName %x_132 "x_132"
+               OpName %x_142 "x_142"
+               OpName %x_133_phi "x_133_phi"
+               OpName %x_143_phi "x_143_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_5 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %_arr_S_uint_3 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_int_uint_5 = OpTypeArray %int %uint_5
+       %buf0 = OpTypeStruct %_arr_int_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %16
+       %void = OpTypeVoid
+          %S = OpTypeStruct %int
+%_ptr_Function_S = OpTypePointer Function %S
+         %19 = OpTypeFunction %void %_ptr_Function_S
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_int = OpTypePointer Function %int
+         %44 = OpTypeFunction %void
+         %48 = OpConstantNull %int
+     %uint_3 = OpConstant %uint 3
+%_arr_S_uint_3 = OpTypeArray %S %uint_3
+%_ptr_Function__arr_S_uint_3 = OpTypePointer Function %_arr_S_uint_3
+         %53 = OpConstantNull %_arr_S_uint_3
+         %56 = OpConstantNull %S
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %60 = OpConstantNull %bool
+      %int_2 = OpConstant %int 2
+      %int_1 = OpConstant %int 1
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+   %main_out = OpTypeStruct %v4float
+        %196 = OpTypeFunction %void %main_out
+%func_struct_S_i11_ = OpFunction %void None %19
+          %s = OpFunctionParameter %_ptr_Function_S
+         %25 = OpLabel
+         %28 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+         %29 = OpLoad %float %28
+         %31 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+         %32 = OpLoad %float %31
+         %33 = OpFOrdGreaterThan %bool %29 %32
+               OpSelectionMerge %35 None
+               OpBranchConditional %33 %36 %35
+         %36 = OpLabel
+               OpReturn
+         %35 = OpLabel
+         %39 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %40 = OpLoad %int %39
+         %43 = OpAccessChain %_ptr_Function_int %s %uint_0
+               OpStore %43 %40
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %44
+         %46 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %48
+        %arr = OpVariable %_ptr_Function__arr_S_uint_3 Function %53
+        %i_1 = OpVariable %_ptr_Function_int Function %48
+      %param = OpVariable %_ptr_Function_S Function %56
+          %j = OpVariable %_ptr_Function_int Function %48
+      %x_132 = OpVariable %_ptr_Function_bool Function %60
+      %x_142 = OpVariable %_ptr_Function_bool Function %60
+  %x_133_phi = OpVariable %_ptr_Function_bool Function %60
+  %x_143_phi = OpVariable %_ptr_Function_bool Function %60
+         %65 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+         %66 = OpLoad %int %65
+               OpStore %i %66
+               OpBranch %67
+         %67 = OpLabel
+               OpLoopMerge %68 %69 None
+               OpBranch %70
+         %70 = OpLabel
+         %71 = OpLoad %int %i
+         %72 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %73 = OpLoad %int %72
+         %74 = OpSLessThan %bool %71 %73
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %77
+         %76 = OpLabel
+               OpBranch %75
+         %77 = OpLabel
+               OpBranch %68
+         %75 = OpLabel
+         %78 = OpLoad %int %i
+         %79 = OpLoad %int %i
+         %80 = OpAccessChain %_ptr_Function_int %arr %78 %uint_0
+               OpStore %80 %79
+               OpBranch %69
+         %69 = OpLabel
+         %81 = OpLoad %int %i
+         %83 = OpIAdd %int %81 %int_1
+               OpStore %i %83
+               OpBranch %67
+         %68 = OpLabel
+         %84 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+         %85 = OpLoad %int %84
+               OpStore %i_1 %85
+               OpBranch %86
+         %86 = OpLabel
+               OpLoopMerge %87 %88 None
+               OpBranch %89
+         %89 = OpLabel
+         %90 = OpLoad %int %i_1
+         %91 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %92 = OpLoad %int %91
+         %93 = OpSLessThan %bool %90 %92
+               OpSelectionMerge %94 None
+               OpBranchConditional %93 %95 %96
+         %95 = OpLabel
+               OpBranch %94
+         %96 = OpLabel
+               OpBranch %87
+         %94 = OpLabel
+         %97 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+         %98 = OpLoad %float %97
+         %99 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+        %100 = OpLoad %float %99
+        %101 = OpFOrdGreaterThan %bool %98 %100
+               OpSelectionMerge %102 None
+               OpBranchConditional %101 %103 %102
+        %103 = OpLabel
+               OpBranch %87
+        %102 = OpLabel
+        %104 = OpLoad %int %i_1
+        %105 = OpAccessChain %_ptr_Function_int %arr %104 %uint_0
+        %106 = OpLoad %int %105
+        %108 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+        %109 = OpLoad %int %108
+        %110 = OpIEqual %bool %106 %109
+               OpSelectionMerge %111 None
+               OpBranchConditional %110 %112 %113
+        %112 = OpLabel
+        %114 = OpLoad %int %i_1
+        %115 = OpAccessChain %_ptr_Function_S %arr %114
+        %116 = OpLoad %S %115
+               OpStore %param %116
+        %117 = OpFunctionCall %void %func_struct_S_i11_ %param
+        %119 = OpLoad %S %param
+        %120 = OpAccessChain %_ptr_Function_S %arr %114
+               OpStore %120 %119
+               OpBranch %111
+        %113 = OpLabel
+        %121 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %122 = OpLoad %int %121
+               OpStore %j %122
+               OpBranch %123
+        %123 = OpLabel
+               OpLoopMerge %124 %125 None
+               OpBranch %126
+        %126 = OpLabel
+        %127 = OpLoad %int %j
+        %128 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %129 = OpLoad %int %128
+        %130 = OpSLessThan %bool %127 %129
+               OpSelectionMerge %131 None
+               OpBranchConditional %130 %132 %133
+        %132 = OpLabel
+               OpBranch %131
+        %133 = OpLabel
+               OpBranch %124
+        %131 = OpLabel
+        %134 = OpLoad %int %j
+        %135 = OpAccessChain %_ptr_Function_int %arr %134 %uint_0
+        %136 = OpLoad %int %135
+        %138 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_4
+        %139 = OpLoad %int %138
+        %140 = OpSGreaterThan %bool %136 %139
+               OpSelectionMerge %141 None
+               OpBranchConditional %140 %142 %141
+        %142 = OpLabel
+               OpKill
+        %141 = OpLabel
+               OpBranch %125
+        %125 = OpLabel
+        %143 = OpLoad %int %j
+        %144 = OpIAdd %int %143 %int_1
+               OpStore %j %144
+               OpBranch %123
+        %124 = OpLabel
+               OpBranch %111
+        %111 = OpLabel
+               OpBranch %88
+         %88 = OpLabel
+        %145 = OpLoad %int %i_1
+        %146 = OpIAdd %int %145 %int_1
+               OpStore %i_1 %146
+               OpBranch %86
+         %87 = OpLabel
+        %147 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %148 = OpLoad %int %147
+        %149 = OpAccessChain %_ptr_Function_int %arr %148 %uint_0
+        %150 = OpLoad %int %149
+        %151 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %152 = OpLoad %int %151
+        %153 = OpIEqual %bool %150 %152
+               OpStore %x_133_phi %153
+               OpSelectionMerge %154 None
+               OpBranchConditional %153 %155 %154
+        %155 = OpLabel
+        %156 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+        %157 = OpLoad %int %156
+        %158 = OpAccessChain %_ptr_Function_int %arr %157 %uint_0
+        %159 = OpLoad %int %158
+        %160 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %161 = OpLoad %int %160
+        %162 = OpIEqual %bool %159 %161
+               OpStore %x_132 %162
+        %163 = OpLoad %bool %x_132
+               OpStore %x_133_phi %163
+               OpBranch %154
+        %154 = OpLabel
+        %164 = OpLoad %bool %x_133_phi
+               OpStore %x_143_phi %164
+               OpSelectionMerge %165 None
+               OpBranchConditional %164 %166 %165
+        %166 = OpLabel
+        %167 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %168 = OpLoad %int %167
+        %169 = OpAccessChain %_ptr_Function_int %arr %168 %uint_0
+        %170 = OpLoad %int %169
+        %171 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %172 = OpLoad %int %171
+        %173 = OpIEqual %bool %170 %172
+               OpStore %x_142 %173
+        %174 = OpLoad %bool %x_142
+               OpStore %x_143_phi %174
+               OpBranch %165
+        %165 = OpLabel
+        %175 = OpLoad %bool %x_143_phi
+               OpSelectionMerge %176 None
+               OpBranchConditional %175 %177 %178
+        %177 = OpLabel
+        %179 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+        %180 = OpLoad %int %179
+        %181 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %182 = OpLoad %int %181
+        %183 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %184 = OpLoad %int %183
+        %185 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+        %186 = OpLoad %int %185
+        %187 = OpConvertSToF %float %180
+        %188 = OpConvertSToF %float %182
+        %189 = OpConvertSToF %float %184
+        %190 = OpConvertSToF %float %186
+        %191 = OpCompositeConstruct %v4float %187 %188 %189 %190
+               OpStore %x_GLF_color %191
+               OpBranch %176
+        %178 = OpLabel
+        %192 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %193 = OpLoad %int %192
+        %194 = OpConvertSToF %float %193
+        %195 = OpCompositeConstruct %v4float %194 %194 %194 %194
+               OpStore %x_GLF_color %195
+               OpBranch %176
+        %176 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %196
+%tint_symbol = OpFunctionParameter %main_out
+        %200 = OpLabel
+        %201 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %201
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %44
+        %203 = OpLabel
+        %204 = OpFunctionCall %void %main_1
+        %206 = OpLoad %v4float %x_GLF_color
+        %207 = OpCompositeConstruct %main_out %206
+        %205 = OpFunctionCall %void %tint_symbol_2 %207
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instructions-first-value-phi/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-instructions-first-value-phi/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..dedf3c2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instructions-first-value-phi/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,160 @@
+struct S {
+  data : i32;
+};
+
+[[block]]
+struct buf1 {
+  v1 : vec2<f32>;
+};
+
+type Arr = [[stride(16)]] array<i32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_struct_S_i11_(s : ptr<function, S>) {
+  let x_166 : f32 = x_8.v1.x;
+  let x_168 : f32 = x_8.v1.y;
+  if ((x_166 > x_168)) {
+    return;
+  }
+  let x_173 : i32 = x_10.x_GLF_uniform_int_values[0];
+  (*(s)).data = x_173;
+  return;
+}
+
+fn main_1() {
+  var i : i32;
+  var arr : array<S, 3>;
+  var i_1 : i32;
+  var param : S;
+  var j : i32;
+  var x_132 : bool;
+  var x_142 : bool;
+  var x_133_phi : bool;
+  var x_143_phi : bool;
+  let x_46 : i32 = x_10.x_GLF_uniform_int_values[2];
+  i = x_46;
+  loop {
+    let x_51 : i32 = i;
+    let x_53 : i32 = x_10.x_GLF_uniform_int_values[0];
+    if ((x_51 < x_53)) {
+    } else {
+      break;
+    }
+    let x_56 : i32 = i;
+    let x_57 : i32 = i;
+    arr[x_56].data = x_57;
+
+    continuing {
+      let x_59 : i32 = i;
+      i = (x_59 + 1);
+    }
+  }
+  let x_62 : i32 = x_10.x_GLF_uniform_int_values[2];
+  i_1 = x_62;
+  loop {
+    let x_67 : i32 = i_1;
+    let x_69 : i32 = x_10.x_GLF_uniform_int_values[0];
+    if ((x_67 < x_69)) {
+    } else {
+      break;
+    }
+    let x_73 : f32 = x_8.v1.x;
+    let x_75 : f32 = x_8.v1.y;
+    if ((x_73 > x_75)) {
+      break;
+    }
+    let x_79 : i32 = i_1;
+    let x_81 : i32 = arr[x_79].data;
+    let x_83 : i32 = x_10.x_GLF_uniform_int_values[3];
+    if ((x_81 == x_83)) {
+      let x_88 : i32 = i_1;
+      let x_90 : S = arr[x_88];
+      param = x_90;
+      func_struct_S_i11_(&(param));
+      let x_92 : S = param;
+      arr[x_88] = x_92;
+    } else {
+      let x_95 : i32 = x_10.x_GLF_uniform_int_values[2];
+      j = x_95;
+      loop {
+        let x_100 : i32 = j;
+        let x_102 : i32 = x_10.x_GLF_uniform_int_values[0];
+        if ((x_100 < x_102)) {
+        } else {
+          break;
+        }
+        let x_105 : i32 = j;
+        let x_107 : i32 = arr[x_105].data;
+        let x_109 : i32 = x_10.x_GLF_uniform_int_values[4];
+        if ((x_107 > x_109)) {
+          discard;
+        }
+
+        continuing {
+          let x_113 : i32 = j;
+          j = (x_113 + 1);
+        }
+      }
+    }
+
+    continuing {
+      let x_115 : i32 = i_1;
+      i_1 = (x_115 + 1);
+    }
+  }
+  let x_118 : i32 = x_10.x_GLF_uniform_int_values[2];
+  let x_120 : i32 = arr[x_118].data;
+  let x_122 : i32 = x_10.x_GLF_uniform_int_values[2];
+  let x_123 : bool = (x_120 == x_122);
+  x_133_phi = x_123;
+  if (x_123) {
+    let x_127 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_129 : i32 = arr[x_127].data;
+    let x_131 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_132 = (x_129 == x_131);
+    x_133_phi = x_132;
+  }
+  let x_133 : bool = x_133_phi;
+  x_143_phi = x_133;
+  if (x_133) {
+    let x_137 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_139 : i32 = arr[x_137].data;
+    let x_141 : i32 = x_10.x_GLF_uniform_int_values[1];
+    x_142 = (x_139 == x_141);
+    x_143_phi = x_142;
+  }
+  let x_143 : bool = x_143_phi;
+  if (x_143) {
+    let x_148 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_151 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_154 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_157 : i32 = x_10.x_GLF_uniform_int_values[3];
+    x_GLF_color = vec4<f32>(f32(x_148), f32(x_151), f32(x_154), f32(x_157));
+  } else {
+    let x_161 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_162 : f32 = f32(x_161);
+    x_GLF_color = vec4<f32>(x_162, x_162, x_162, x_162);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instructions-first-value-phi/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-instructions-first-value-phi/0-opt.wgsl
new file mode 100644
index 0000000..dedf3c2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instructions-first-value-phi/0-opt.wgsl
@@ -0,0 +1,160 @@
+struct S {
+  data : i32;
+};
+
+[[block]]
+struct buf1 {
+  v1 : vec2<f32>;
+};
+
+type Arr = [[stride(16)]] array<i32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_struct_S_i11_(s : ptr<function, S>) {
+  let x_166 : f32 = x_8.v1.x;
+  let x_168 : f32 = x_8.v1.y;
+  if ((x_166 > x_168)) {
+    return;
+  }
+  let x_173 : i32 = x_10.x_GLF_uniform_int_values[0];
+  (*(s)).data = x_173;
+  return;
+}
+
+fn main_1() {
+  var i : i32;
+  var arr : array<S, 3>;
+  var i_1 : i32;
+  var param : S;
+  var j : i32;
+  var x_132 : bool;
+  var x_142 : bool;
+  var x_133_phi : bool;
+  var x_143_phi : bool;
+  let x_46 : i32 = x_10.x_GLF_uniform_int_values[2];
+  i = x_46;
+  loop {
+    let x_51 : i32 = i;
+    let x_53 : i32 = x_10.x_GLF_uniform_int_values[0];
+    if ((x_51 < x_53)) {
+    } else {
+      break;
+    }
+    let x_56 : i32 = i;
+    let x_57 : i32 = i;
+    arr[x_56].data = x_57;
+
+    continuing {
+      let x_59 : i32 = i;
+      i = (x_59 + 1);
+    }
+  }
+  let x_62 : i32 = x_10.x_GLF_uniform_int_values[2];
+  i_1 = x_62;
+  loop {
+    let x_67 : i32 = i_1;
+    let x_69 : i32 = x_10.x_GLF_uniform_int_values[0];
+    if ((x_67 < x_69)) {
+    } else {
+      break;
+    }
+    let x_73 : f32 = x_8.v1.x;
+    let x_75 : f32 = x_8.v1.y;
+    if ((x_73 > x_75)) {
+      break;
+    }
+    let x_79 : i32 = i_1;
+    let x_81 : i32 = arr[x_79].data;
+    let x_83 : i32 = x_10.x_GLF_uniform_int_values[3];
+    if ((x_81 == x_83)) {
+      let x_88 : i32 = i_1;
+      let x_90 : S = arr[x_88];
+      param = x_90;
+      func_struct_S_i11_(&(param));
+      let x_92 : S = param;
+      arr[x_88] = x_92;
+    } else {
+      let x_95 : i32 = x_10.x_GLF_uniform_int_values[2];
+      j = x_95;
+      loop {
+        let x_100 : i32 = j;
+        let x_102 : i32 = x_10.x_GLF_uniform_int_values[0];
+        if ((x_100 < x_102)) {
+        } else {
+          break;
+        }
+        let x_105 : i32 = j;
+        let x_107 : i32 = arr[x_105].data;
+        let x_109 : i32 = x_10.x_GLF_uniform_int_values[4];
+        if ((x_107 > x_109)) {
+          discard;
+        }
+
+        continuing {
+          let x_113 : i32 = j;
+          j = (x_113 + 1);
+        }
+      }
+    }
+
+    continuing {
+      let x_115 : i32 = i_1;
+      i_1 = (x_115 + 1);
+    }
+  }
+  let x_118 : i32 = x_10.x_GLF_uniform_int_values[2];
+  let x_120 : i32 = arr[x_118].data;
+  let x_122 : i32 = x_10.x_GLF_uniform_int_values[2];
+  let x_123 : bool = (x_120 == x_122);
+  x_133_phi = x_123;
+  if (x_123) {
+    let x_127 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_129 : i32 = arr[x_127].data;
+    let x_131 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_132 = (x_129 == x_131);
+    x_133_phi = x_132;
+  }
+  let x_133 : bool = x_133_phi;
+  x_143_phi = x_133;
+  if (x_133) {
+    let x_137 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_139 : i32 = arr[x_137].data;
+    let x_141 : i32 = x_10.x_GLF_uniform_int_values[1];
+    x_142 = (x_139 == x_141);
+    x_143_phi = x_142;
+  }
+  let x_143 : bool = x_143_phi;
+  if (x_143) {
+    let x_148 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_151 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_154 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_157 : i32 = x_10.x_GLF_uniform_int_values[3];
+    x_GLF_color = vec4<f32>(f32(x_148), f32(x_151), f32(x_154), f32(x_157));
+  } else {
+    let x_161 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_162 : f32 = f32(x_161);
+    x_GLF_color = vec4<f32>(x_162, x_162, x_162, x_162);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instructions-first-value-phi/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-instructions-first-value-phi/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..d405088
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instructions-first-value-phi/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,146 @@
+struct S {
+  int data;
+};
+
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[1];
+};
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[5];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void func_struct_S_i11_(inout S s) {
+  const float x_166 = asfloat(x_8[0].x);
+  const float x_168 = asfloat(x_8[0].y);
+  if ((x_166 > x_168)) {
+    return;
+  }
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_173 = asint(x_10[scalar_offset / 4][scalar_offset % 4]);
+  s.data = x_173;
+  return;
+}
+
+void main_1() {
+  int i = 0;
+  S arr[3] = (S[3])0;
+  int i_1 = 0;
+  S param = (S)0;
+  int j = 0;
+  bool x_132 = false;
+  bool x_142 = false;
+  bool x_133_phi = false;
+  bool x_143_phi = false;
+  const int x_46 = asint(x_10[2].x);
+  i = x_46;
+  while (true) {
+    const int x_51 = i;
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_53 = asint(x_10[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    if ((x_51 < x_53)) {
+    } else {
+      break;
+    }
+    arr[i].data = i;
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_62 = asint(x_10[2].x);
+  i_1 = x_62;
+  while (true) {
+    const int x_67 = i_1;
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_69 = asint(x_10[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    if ((x_67 < x_69)) {
+    } else {
+      break;
+    }
+    const float x_73 = asfloat(x_8[0].x);
+    const float x_75 = asfloat(x_8[0].y);
+    if ((x_73 > x_75)) {
+      break;
+    }
+    const int x_81 = arr[i_1].data;
+    const int x_83 = asint(x_10[3].x);
+    if ((x_81 == x_83)) {
+      const int x_88 = i_1;
+      const S x_90 = arr[x_88];
+      param = x_90;
+      func_struct_S_i11_(param);
+      arr[x_88] = param;
+    } else {
+      const int x_95 = asint(x_10[2].x);
+      j = x_95;
+      while (true) {
+        const int x_100 = j;
+        const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+        const int x_102 = asint(x_10[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+        if ((x_100 < x_102)) {
+        } else {
+          break;
+        }
+        const int x_107 = arr[j].data;
+        const int x_109 = asint(x_10[4].x);
+        if ((x_107 > x_109)) {
+          discard;
+        }
+        {
+          j = (j + 1);
+        }
+      }
+    }
+    {
+      i_1 = (i_1 + 1);
+    }
+  }
+  const int x_118 = asint(x_10[2].x);
+  const int x_120 = arr[x_118].data;
+  const int x_122 = asint(x_10[2].x);
+  const bool x_123 = (x_120 == x_122);
+  x_133_phi = x_123;
+  if (x_123) {
+    const int x_127 = asint(x_10[3].x);
+    const int x_129 = arr[x_127].data;
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_131 = asint(x_10[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    x_132 = (x_129 == x_131);
+    x_133_phi = x_132;
+  }
+  const bool x_133 = x_133_phi;
+  x_143_phi = x_133;
+  if (x_133) {
+    const int x_137 = asint(x_10[1].x);
+    const int x_139 = arr[x_137].data;
+    const int x_141 = asint(x_10[1].x);
+    x_142 = (x_139 == x_141);
+    x_143_phi = x_142;
+  }
+  if (x_143_phi) {
+    const int x_148 = asint(x_10[3].x);
+    const int x_151 = asint(x_10[2].x);
+    const int x_154 = asint(x_10[2].x);
+    const int x_157 = asint(x_10[3].x);
+    x_GLF_color = float4(float(x_148), float(x_151), float(x_154), float(x_157));
+  } else {
+    const int x_161 = asint(x_10[2].x);
+    const float x_162 = float(x_161);
+    x_GLF_color = float4(x_162, x_162, x_162, x_162);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instructions-first-value-phi/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-instructions-first-value-phi/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..df420d2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instructions-first-value-phi/0-opt.wgsl.expected.msl
@@ -0,0 +1,162 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  int data;
+};
+struct buf1 {
+  /* 0x0000 */ packed_float2 v1;
+};
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[5];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_1 {
+  S arr[3];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void func_struct_S_i11_(constant buf1& x_8, constant buf0& x_10, thread S* const s) {
+  float const x_166 = x_8.v1.x;
+  float const x_168 = x_8.v1.y;
+  if ((x_166 > x_168)) {
+    return;
+  }
+  int const x_173 = x_10.x_GLF_uniform_int_values.arr[0].el;
+  (*(s)).data = x_173;
+  return;
+}
+
+void main_1(constant buf0& x_10, constant buf1& x_8, thread float4* const tint_symbol_4) {
+  int i = 0;
+  tint_array_wrapper_1 arr = {};
+  int i_1 = 0;
+  S param = {};
+  int j = 0;
+  bool x_132 = false;
+  bool x_142 = false;
+  bool x_133_phi = false;
+  bool x_143_phi = false;
+  int const x_46 = x_10.x_GLF_uniform_int_values.arr[2].el;
+  i = x_46;
+  while (true) {
+    int const x_51 = i;
+    int const x_53 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_51 < x_53)) {
+    } else {
+      break;
+    }
+    int const x_56 = i;
+    int const x_57 = i;
+    arr.arr[x_56].data = x_57;
+    {
+      int const x_59 = i;
+      i = (x_59 + 1);
+    }
+  }
+  int const x_62 = x_10.x_GLF_uniform_int_values.arr[2].el;
+  i_1 = x_62;
+  while (true) {
+    int const x_67 = i_1;
+    int const x_69 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_67 < x_69)) {
+    } else {
+      break;
+    }
+    float const x_73 = x_8.v1.x;
+    float const x_75 = x_8.v1.y;
+    if ((x_73 > x_75)) {
+      break;
+    }
+    int const x_79 = i_1;
+    int const x_81 = arr.arr[x_79].data;
+    int const x_83 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    if ((x_81 == x_83)) {
+      int const x_88 = i_1;
+      S const x_90 = arr.arr[x_88];
+      param = x_90;
+      func_struct_S_i11_(x_8, x_10, &(param));
+      S const x_92 = param;
+      arr.arr[x_88] = x_92;
+    } else {
+      int const x_95 = x_10.x_GLF_uniform_int_values.arr[2].el;
+      j = x_95;
+      while (true) {
+        int const x_100 = j;
+        int const x_102 = x_10.x_GLF_uniform_int_values.arr[0].el;
+        if ((x_100 < x_102)) {
+        } else {
+          break;
+        }
+        int const x_105 = j;
+        int const x_107 = arr.arr[x_105].data;
+        int const x_109 = x_10.x_GLF_uniform_int_values.arr[4].el;
+        if ((x_107 > x_109)) {
+          discard_fragment();
+        }
+        {
+          int const x_113 = j;
+          j = (x_113 + 1);
+        }
+      }
+    }
+    {
+      int const x_115 = i_1;
+      i_1 = (x_115 + 1);
+    }
+  }
+  int const x_118 = x_10.x_GLF_uniform_int_values.arr[2].el;
+  int const x_120 = arr.arr[x_118].data;
+  int const x_122 = x_10.x_GLF_uniform_int_values.arr[2].el;
+  bool const x_123 = (x_120 == x_122);
+  x_133_phi = x_123;
+  if (x_123) {
+    int const x_127 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    int const x_129 = arr.arr[x_127].data;
+    int const x_131 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    x_132 = (x_129 == x_131);
+    x_133_phi = x_132;
+  }
+  bool const x_133 = x_133_phi;
+  x_143_phi = x_133;
+  if (x_133) {
+    int const x_137 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_139 = arr.arr[x_137].data;
+    int const x_141 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    x_142 = (x_139 == x_141);
+    x_143_phi = x_142;
+  }
+  bool const x_143 = x_143_phi;
+  if (x_143) {
+    int const x_148 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    int const x_151 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    int const x_154 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    int const x_157 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    *(tint_symbol_4) = float4(float(x_148), float(x_151), float(x_154), float(x_157));
+  } else {
+    int const x_161 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    float const x_162 = float(x_161);
+    *(tint_symbol_4) = float4(x_162, x_162, x_162, x_162);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_10 [[buffer(0)]], constant buf1& x_8 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_10, x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instructions-first-value-phi/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-instructions-first-value-phi/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..0e18564
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instructions-first-value-phi/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,333 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 208
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "v1"
+               OpName %x_8 "x_8"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %S "S"
+               OpMemberName %S 0 "data"
+               OpName %func_struct_S_i11_ "func_struct_S_i11_"
+               OpName %s "s"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %arr "arr"
+               OpName %i_1 "i_1"
+               OpName %param "param"
+               OpName %j "j"
+               OpName %x_132 "x_132"
+               OpName %x_142 "x_142"
+               OpName %x_133_phi "x_133_phi"
+               OpName %x_143_phi "x_143_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_5 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %_arr_S_uint_3 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_int_uint_5 = OpTypeArray %int %uint_5
+       %buf0 = OpTypeStruct %_arr_int_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %16
+       %void = OpTypeVoid
+          %S = OpTypeStruct %int
+%_ptr_Function_S = OpTypePointer Function %S
+         %19 = OpTypeFunction %void %_ptr_Function_S
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_int = OpTypePointer Function %int
+         %44 = OpTypeFunction %void
+         %48 = OpConstantNull %int
+     %uint_3 = OpConstant %uint 3
+%_arr_S_uint_3 = OpTypeArray %S %uint_3
+%_ptr_Function__arr_S_uint_3 = OpTypePointer Function %_arr_S_uint_3
+         %53 = OpConstantNull %_arr_S_uint_3
+         %56 = OpConstantNull %S
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %60 = OpConstantNull %bool
+      %int_2 = OpConstant %int 2
+      %int_1 = OpConstant %int 1
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+   %main_out = OpTypeStruct %v4float
+        %196 = OpTypeFunction %void %main_out
+%func_struct_S_i11_ = OpFunction %void None %19
+          %s = OpFunctionParameter %_ptr_Function_S
+         %25 = OpLabel
+         %28 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+         %29 = OpLoad %float %28
+         %31 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+         %32 = OpLoad %float %31
+         %33 = OpFOrdGreaterThan %bool %29 %32
+               OpSelectionMerge %35 None
+               OpBranchConditional %33 %36 %35
+         %36 = OpLabel
+               OpReturn
+         %35 = OpLabel
+         %39 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %40 = OpLoad %int %39
+         %43 = OpAccessChain %_ptr_Function_int %s %uint_0
+               OpStore %43 %40
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %44
+         %46 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %48
+        %arr = OpVariable %_ptr_Function__arr_S_uint_3 Function %53
+        %i_1 = OpVariable %_ptr_Function_int Function %48
+      %param = OpVariable %_ptr_Function_S Function %56
+          %j = OpVariable %_ptr_Function_int Function %48
+      %x_132 = OpVariable %_ptr_Function_bool Function %60
+      %x_142 = OpVariable %_ptr_Function_bool Function %60
+  %x_133_phi = OpVariable %_ptr_Function_bool Function %60
+  %x_143_phi = OpVariable %_ptr_Function_bool Function %60
+         %65 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+         %66 = OpLoad %int %65
+               OpStore %i %66
+               OpBranch %67
+         %67 = OpLabel
+               OpLoopMerge %68 %69 None
+               OpBranch %70
+         %70 = OpLabel
+         %71 = OpLoad %int %i
+         %72 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %73 = OpLoad %int %72
+         %74 = OpSLessThan %bool %71 %73
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %77
+         %76 = OpLabel
+               OpBranch %75
+         %77 = OpLabel
+               OpBranch %68
+         %75 = OpLabel
+         %78 = OpLoad %int %i
+         %79 = OpLoad %int %i
+         %80 = OpAccessChain %_ptr_Function_int %arr %78 %uint_0
+               OpStore %80 %79
+               OpBranch %69
+         %69 = OpLabel
+         %81 = OpLoad %int %i
+         %83 = OpIAdd %int %81 %int_1
+               OpStore %i %83
+               OpBranch %67
+         %68 = OpLabel
+         %84 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+         %85 = OpLoad %int %84
+               OpStore %i_1 %85
+               OpBranch %86
+         %86 = OpLabel
+               OpLoopMerge %87 %88 None
+               OpBranch %89
+         %89 = OpLabel
+         %90 = OpLoad %int %i_1
+         %91 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %92 = OpLoad %int %91
+         %93 = OpSLessThan %bool %90 %92
+               OpSelectionMerge %94 None
+               OpBranchConditional %93 %95 %96
+         %95 = OpLabel
+               OpBranch %94
+         %96 = OpLabel
+               OpBranch %87
+         %94 = OpLabel
+         %97 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+         %98 = OpLoad %float %97
+         %99 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+        %100 = OpLoad %float %99
+        %101 = OpFOrdGreaterThan %bool %98 %100
+               OpSelectionMerge %102 None
+               OpBranchConditional %101 %103 %102
+        %103 = OpLabel
+               OpBranch %87
+        %102 = OpLabel
+        %104 = OpLoad %int %i_1
+        %105 = OpAccessChain %_ptr_Function_int %arr %104 %uint_0
+        %106 = OpLoad %int %105
+        %108 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+        %109 = OpLoad %int %108
+        %110 = OpIEqual %bool %106 %109
+               OpSelectionMerge %111 None
+               OpBranchConditional %110 %112 %113
+        %112 = OpLabel
+        %114 = OpLoad %int %i_1
+        %115 = OpAccessChain %_ptr_Function_S %arr %114
+        %116 = OpLoad %S %115
+               OpStore %param %116
+        %117 = OpFunctionCall %void %func_struct_S_i11_ %param
+        %119 = OpLoad %S %param
+        %120 = OpAccessChain %_ptr_Function_S %arr %114
+               OpStore %120 %119
+               OpBranch %111
+        %113 = OpLabel
+        %121 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %122 = OpLoad %int %121
+               OpStore %j %122
+               OpBranch %123
+        %123 = OpLabel
+               OpLoopMerge %124 %125 None
+               OpBranch %126
+        %126 = OpLabel
+        %127 = OpLoad %int %j
+        %128 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %129 = OpLoad %int %128
+        %130 = OpSLessThan %bool %127 %129
+               OpSelectionMerge %131 None
+               OpBranchConditional %130 %132 %133
+        %132 = OpLabel
+               OpBranch %131
+        %133 = OpLabel
+               OpBranch %124
+        %131 = OpLabel
+        %134 = OpLoad %int %j
+        %135 = OpAccessChain %_ptr_Function_int %arr %134 %uint_0
+        %136 = OpLoad %int %135
+        %138 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_4
+        %139 = OpLoad %int %138
+        %140 = OpSGreaterThan %bool %136 %139
+               OpSelectionMerge %141 None
+               OpBranchConditional %140 %142 %141
+        %142 = OpLabel
+               OpKill
+        %141 = OpLabel
+               OpBranch %125
+        %125 = OpLabel
+        %143 = OpLoad %int %j
+        %144 = OpIAdd %int %143 %int_1
+               OpStore %j %144
+               OpBranch %123
+        %124 = OpLabel
+               OpBranch %111
+        %111 = OpLabel
+               OpBranch %88
+         %88 = OpLabel
+        %145 = OpLoad %int %i_1
+        %146 = OpIAdd %int %145 %int_1
+               OpStore %i_1 %146
+               OpBranch %86
+         %87 = OpLabel
+        %147 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %148 = OpLoad %int %147
+        %149 = OpAccessChain %_ptr_Function_int %arr %148 %uint_0
+        %150 = OpLoad %int %149
+        %151 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %152 = OpLoad %int %151
+        %153 = OpIEqual %bool %150 %152
+               OpStore %x_133_phi %153
+               OpSelectionMerge %154 None
+               OpBranchConditional %153 %155 %154
+        %155 = OpLabel
+        %156 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+        %157 = OpLoad %int %156
+        %158 = OpAccessChain %_ptr_Function_int %arr %157 %uint_0
+        %159 = OpLoad %int %158
+        %160 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %161 = OpLoad %int %160
+        %162 = OpIEqual %bool %159 %161
+               OpStore %x_132 %162
+        %163 = OpLoad %bool %x_132
+               OpStore %x_133_phi %163
+               OpBranch %154
+        %154 = OpLabel
+        %164 = OpLoad %bool %x_133_phi
+               OpStore %x_143_phi %164
+               OpSelectionMerge %165 None
+               OpBranchConditional %164 %166 %165
+        %166 = OpLabel
+        %167 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %168 = OpLoad %int %167
+        %169 = OpAccessChain %_ptr_Function_int %arr %168 %uint_0
+        %170 = OpLoad %int %169
+        %171 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %172 = OpLoad %int %171
+        %173 = OpIEqual %bool %170 %172
+               OpStore %x_142 %173
+        %174 = OpLoad %bool %x_142
+               OpStore %x_143_phi %174
+               OpBranch %165
+        %165 = OpLabel
+        %175 = OpLoad %bool %x_143_phi
+               OpSelectionMerge %176 None
+               OpBranchConditional %175 %177 %178
+        %177 = OpLabel
+        %179 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+        %180 = OpLoad %int %179
+        %181 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %182 = OpLoad %int %181
+        %183 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %184 = OpLoad %int %183
+        %185 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+        %186 = OpLoad %int %185
+        %187 = OpConvertSToF %float %180
+        %188 = OpConvertSToF %float %182
+        %189 = OpConvertSToF %float %184
+        %190 = OpConvertSToF %float %186
+        %191 = OpCompositeConstruct %v4float %187 %188 %189 %190
+               OpStore %x_GLF_color %191
+               OpBranch %176
+        %178 = OpLabel
+        %192 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %193 = OpLoad %int %192
+        %194 = OpConvertSToF %float %193
+        %195 = OpCompositeConstruct %v4float %194 %194 %194 %194
+               OpStore %x_GLF_color %195
+               OpBranch %176
+        %176 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %196
+%tint_symbol = OpFunctionParameter %main_out
+        %200 = OpLabel
+        %201 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %201
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %44
+        %203 = OpLabel
+        %204 = OpFunctionCall %void %main_1
+        %206 = OpLoad %v4float %x_GLF_color
+        %207 = OpCompositeConstruct %main_out %206
+        %205 = OpFunctionCall %void %tint_symbol_2 %207
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instructions-first-value-phi/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-instructions-first-value-phi/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..dedf3c2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instructions-first-value-phi/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,160 @@
+struct S {
+  data : i32;
+};
+
+[[block]]
+struct buf1 {
+  v1 : vec2<f32>;
+};
+
+type Arr = [[stride(16)]] array<i32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_struct_S_i11_(s : ptr<function, S>) {
+  let x_166 : f32 = x_8.v1.x;
+  let x_168 : f32 = x_8.v1.y;
+  if ((x_166 > x_168)) {
+    return;
+  }
+  let x_173 : i32 = x_10.x_GLF_uniform_int_values[0];
+  (*(s)).data = x_173;
+  return;
+}
+
+fn main_1() {
+  var i : i32;
+  var arr : array<S, 3>;
+  var i_1 : i32;
+  var param : S;
+  var j : i32;
+  var x_132 : bool;
+  var x_142 : bool;
+  var x_133_phi : bool;
+  var x_143_phi : bool;
+  let x_46 : i32 = x_10.x_GLF_uniform_int_values[2];
+  i = x_46;
+  loop {
+    let x_51 : i32 = i;
+    let x_53 : i32 = x_10.x_GLF_uniform_int_values[0];
+    if ((x_51 < x_53)) {
+    } else {
+      break;
+    }
+    let x_56 : i32 = i;
+    let x_57 : i32 = i;
+    arr[x_56].data = x_57;
+
+    continuing {
+      let x_59 : i32 = i;
+      i = (x_59 + 1);
+    }
+  }
+  let x_62 : i32 = x_10.x_GLF_uniform_int_values[2];
+  i_1 = x_62;
+  loop {
+    let x_67 : i32 = i_1;
+    let x_69 : i32 = x_10.x_GLF_uniform_int_values[0];
+    if ((x_67 < x_69)) {
+    } else {
+      break;
+    }
+    let x_73 : f32 = x_8.v1.x;
+    let x_75 : f32 = x_8.v1.y;
+    if ((x_73 > x_75)) {
+      break;
+    }
+    let x_79 : i32 = i_1;
+    let x_81 : i32 = arr[x_79].data;
+    let x_83 : i32 = x_10.x_GLF_uniform_int_values[3];
+    if ((x_81 == x_83)) {
+      let x_88 : i32 = i_1;
+      let x_90 : S = arr[x_88];
+      param = x_90;
+      func_struct_S_i11_(&(param));
+      let x_92 : S = param;
+      arr[x_88] = x_92;
+    } else {
+      let x_95 : i32 = x_10.x_GLF_uniform_int_values[2];
+      j = x_95;
+      loop {
+        let x_100 : i32 = j;
+        let x_102 : i32 = x_10.x_GLF_uniform_int_values[0];
+        if ((x_100 < x_102)) {
+        } else {
+          break;
+        }
+        let x_105 : i32 = j;
+        let x_107 : i32 = arr[x_105].data;
+        let x_109 : i32 = x_10.x_GLF_uniform_int_values[4];
+        if ((x_107 > x_109)) {
+          discard;
+        }
+
+        continuing {
+          let x_113 : i32 = j;
+          j = (x_113 + 1);
+        }
+      }
+    }
+
+    continuing {
+      let x_115 : i32 = i_1;
+      i_1 = (x_115 + 1);
+    }
+  }
+  let x_118 : i32 = x_10.x_GLF_uniform_int_values[2];
+  let x_120 : i32 = arr[x_118].data;
+  let x_122 : i32 = x_10.x_GLF_uniform_int_values[2];
+  let x_123 : bool = (x_120 == x_122);
+  x_133_phi = x_123;
+  if (x_123) {
+    let x_127 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_129 : i32 = arr[x_127].data;
+    let x_131 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_132 = (x_129 == x_131);
+    x_133_phi = x_132;
+  }
+  let x_133 : bool = x_133_phi;
+  x_143_phi = x_133;
+  if (x_133) {
+    let x_137 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_139 : i32 = arr[x_137].data;
+    let x_141 : i32 = x_10.x_GLF_uniform_int_values[1];
+    x_142 = (x_139 == x_141);
+    x_143_phi = x_142;
+  }
+  let x_143 : bool = x_143_phi;
+  if (x_143) {
+    let x_148 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_151 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_154 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_157 : i32 = x_10.x_GLF_uniform_int_values[3];
+    x_GLF_color = vec4<f32>(f32(x_148), f32(x_151), f32(x_154), f32(x_157));
+  } else {
+    let x_161 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_162 : f32 = f32(x_161);
+    x_GLF_color = vec4<f32>(x_162, x_162, x_162, x_162);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instructions-for-if-less-than-equal/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-instructions-for-if-less-than-equal/0-opt.spvasm
new file mode 100644
index 0000000..a6196b0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instructions-for-if-less-than-equal/0-opt.spvasm
@@ -0,0 +1,103 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %main = OpFunction %void None %12
+         %27 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+         %28 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %29 = OpLoad %int %28
+         %30 = OpConvertSToF %float %29
+         %31 = OpCompositeConstruct %v4float %30 %30 %30 %30
+               OpStore %_GLF_color %31
+         %32 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %33 = OpLoad %int %32
+               OpStore %i %33
+               OpBranch %34
+         %34 = OpLabel
+               OpLoopMerge %35 %36 None
+               OpBranch %37
+         %37 = OpLabel
+         %38 = OpLoad %int %i
+         %39 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %40 = OpLoad %int %39
+         %41 = OpSLessThan %bool %38 %40
+               OpBranchConditional %41 %42 %35
+         %42 = OpLabel
+         %43 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_1
+         %44 = OpLoad %float %43
+         %45 = OpLoad %int %i
+         %46 = OpConvertSToF %float %45
+         %47 = OpFOrdLessThanEqual %bool %44 %46
+         %48 = OpLogicalNot %bool %47
+               OpSelectionMerge %49 None
+               OpBranchConditional %48 %50 %49
+         %50 = OpLabel
+         %51 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %52 = OpLoad %float %51
+         %53 = OpLoad %int %i
+         %54 = OpConvertSToF %float %53
+         %55 = OpLoad %int %i
+         %56 = OpConvertSToF %float %55
+         %57 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %58 = OpLoad %float %57
+         %59 = OpCompositeConstruct %v4float %52 %54 %56 %58
+         %60 = OpLoad %v4float %_GLF_color
+         %61 = OpFAdd %v4float %60 %59
+               OpStore %_GLF_color %61
+               OpBranch %49
+         %49 = OpLabel
+               OpBranch %36
+         %36 = OpLabel
+         %62 = OpLoad %int %i
+         %63 = OpIAdd %int %62 %int_1
+               OpStore %i %63
+               OpBranch %34
+         %35 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instructions-for-if-less-than-equal/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-instructions-for-if-less-than-equal/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..c4609c1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instructions-for-if-less-than-equal/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,54 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_5 : register(b1, space0) {
+  uint4 x_5[2];
+};
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[2];
+};
+
+void main_1() {
+  int i = 0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_29 = asint(x_5[scalar_offset / 4][scalar_offset % 4]);
+  const float x_30 = float(x_29);
+  x_GLF_color = float4(x_30, x_30, x_30, x_30);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_33 = asint(x_5[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  i = x_33;
+  while (true) {
+    const int x_38 = i;
+    const int x_40 = asint(x_5[1].x);
+    if ((x_38 < x_40)) {
+    } else {
+      break;
+    }
+    const float x_44 = asfloat(x_8[1].x);
+    if (!((x_44 <= float(i)))) {
+      const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+      const float x_52 = asfloat(x_8[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+      const int x_53 = i;
+      const int x_55 = i;
+      const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+      const float x_58 = asfloat(x_8[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+      x_GLF_color = (x_GLF_color + float4(x_52, float(x_53), float(x_55), x_58));
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instructions-for-if-less-than-equal/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-instructions-for-if-less-than-equal/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..f3e2dd6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instructions-for-if-less-than-equal/0-opt.spvasm.expected.msl
@@ -0,0 +1,70 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_5, constant buf0& x_8, thread float4* const tint_symbol_4) {
+  int i = 0;
+  int const x_29 = x_5.x_GLF_uniform_int_values.arr[0].el;
+  float const x_30 = float(x_29);
+  *(tint_symbol_4) = float4(x_30, x_30, x_30, x_30);
+  int const x_33 = x_5.x_GLF_uniform_int_values.arr[0].el;
+  i = x_33;
+  while (true) {
+    int const x_38 = i;
+    int const x_40 = x_5.x_GLF_uniform_int_values.arr[1].el;
+    if ((x_38 < x_40)) {
+    } else {
+      break;
+    }
+    float const x_44 = x_8.x_GLF_uniform_float_values.arr[1].el;
+    int const x_45 = i;
+    if (!((x_44 <= float(x_45)))) {
+      float const x_52 = x_8.x_GLF_uniform_float_values.arr[0].el;
+      int const x_53 = i;
+      int const x_55 = i;
+      float const x_58 = x_8.x_GLF_uniform_float_values.arr[0].el;
+      float4 const x_60 = *(tint_symbol_4);
+      *(tint_symbol_4) = (x_60 + float4(x_52, float(x_53), float(x_55), x_58));
+    }
+    {
+      int const x_62 = i;
+      i = (x_62 + 1);
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_5 [[buffer(1)]], constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instructions-for-if-less-than-equal/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-instructions-for-if-less-than-equal/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..4b3abcc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instructions-for-if-less-than-equal/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,142 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 82
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_5 "x_5"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_5 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %25 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+   %main_out = OpTypeStruct %v4float
+         %70 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %25
+         %29 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %30 = OpLoad %int %29
+         %31 = OpConvertSToF %float %30
+         %32 = OpCompositeConstruct %v4float %31 %31 %31 %31
+               OpStore %x_GLF_color %32
+         %33 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %34 = OpLoad %int %33
+               OpStore %i %34
+               OpBranch %35
+         %35 = OpLabel
+               OpLoopMerge %36 %37 None
+               OpBranch %38
+         %38 = OpLabel
+         %39 = OpLoad %int %i
+         %41 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %42 = OpLoad %int %41
+         %43 = OpSLessThan %bool %39 %42
+               OpSelectionMerge %45 None
+               OpBranchConditional %43 %46 %47
+         %46 = OpLabel
+               OpBranch %45
+         %47 = OpLabel
+               OpBranch %36
+         %45 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+         %50 = OpLoad %float %49
+         %51 = OpLoad %int %i
+         %53 = OpConvertSToF %float %51
+         %54 = OpFOrdLessThanEqual %bool %50 %53
+         %52 = OpLogicalNot %bool %54
+               OpSelectionMerge %55 None
+               OpBranchConditional %52 %56 %55
+         %56 = OpLabel
+         %57 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %58 = OpLoad %float %57
+         %59 = OpLoad %int %i
+         %60 = OpLoad %int %i
+         %61 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %62 = OpLoad %float %61
+         %63 = OpLoad %v4float %x_GLF_color
+         %64 = OpConvertSToF %float %59
+         %65 = OpConvertSToF %float %60
+         %66 = OpCompositeConstruct %v4float %58 %64 %65 %62
+         %67 = OpFAdd %v4float %63 %66
+               OpStore %x_GLF_color %67
+               OpBranch %55
+         %55 = OpLabel
+               OpBranch %37
+         %37 = OpLabel
+         %68 = OpLoad %int %i
+         %69 = OpIAdd %int %68 %int_1
+               OpStore %i %69
+               OpBranch %35
+         %36 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %70
+%tint_symbol = OpFunctionParameter %main_out
+         %74 = OpLabel
+         %75 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %75
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+         %77 = OpLabel
+         %78 = OpFunctionCall %void %main_1
+         %80 = OpLoad %v4float %x_GLF_color
+         %81 = OpCompositeConstruct %main_out %80
+         %79 = OpFunctionCall %void %tint_symbol_2 %81
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instructions-for-if-less-than-equal/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-instructions-for-if-less-than-equal/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..5aa01a6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instructions-for-if-less-than-equal/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,63 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_5 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+fn main_1() {
+  var i : i32;
+  let x_29 : i32 = x_5.x_GLF_uniform_int_values[0];
+  let x_30 : f32 = f32(x_29);
+  x_GLF_color = vec4<f32>(x_30, x_30, x_30, x_30);
+  let x_33 : i32 = x_5.x_GLF_uniform_int_values[0];
+  i = x_33;
+  loop {
+    let x_38 : i32 = i;
+    let x_40 : i32 = x_5.x_GLF_uniform_int_values[1];
+    if ((x_38 < x_40)) {
+    } else {
+      break;
+    }
+    let x_44 : f32 = x_8.x_GLF_uniform_float_values[1];
+    let x_45 : i32 = i;
+    if (!((x_44 <= f32(x_45)))) {
+      let x_52 : f32 = x_8.x_GLF_uniform_float_values[0];
+      let x_53 : i32 = i;
+      let x_55 : i32 = i;
+      let x_58 : f32 = x_8.x_GLF_uniform_float_values[0];
+      let x_60 : vec4<f32> = x_GLF_color;
+      x_GLF_color = (x_60 + vec4<f32>(x_52, f32(x_53), f32(x_55), x_58));
+    }
+
+    continuing {
+      let x_62 : i32 = i;
+      i = (x_62 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instructions-for-if-less-than-equal/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-instructions-for-if-less-than-equal/0-opt.wgsl
new file mode 100644
index 0000000..5aa01a6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instructions-for-if-less-than-equal/0-opt.wgsl
@@ -0,0 +1,63 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_5 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+fn main_1() {
+  var i : i32;
+  let x_29 : i32 = x_5.x_GLF_uniform_int_values[0];
+  let x_30 : f32 = f32(x_29);
+  x_GLF_color = vec4<f32>(x_30, x_30, x_30, x_30);
+  let x_33 : i32 = x_5.x_GLF_uniform_int_values[0];
+  i = x_33;
+  loop {
+    let x_38 : i32 = i;
+    let x_40 : i32 = x_5.x_GLF_uniform_int_values[1];
+    if ((x_38 < x_40)) {
+    } else {
+      break;
+    }
+    let x_44 : f32 = x_8.x_GLF_uniform_float_values[1];
+    let x_45 : i32 = i;
+    if (!((x_44 <= f32(x_45)))) {
+      let x_52 : f32 = x_8.x_GLF_uniform_float_values[0];
+      let x_53 : i32 = i;
+      let x_55 : i32 = i;
+      let x_58 : f32 = x_8.x_GLF_uniform_float_values[0];
+      let x_60 : vec4<f32> = x_GLF_color;
+      x_GLF_color = (x_60 + vec4<f32>(x_52, f32(x_53), f32(x_55), x_58));
+    }
+
+    continuing {
+      let x_62 : i32 = i;
+      i = (x_62 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instructions-for-if-less-than-equal/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-instructions-for-if-less-than-equal/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..c4609c1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instructions-for-if-less-than-equal/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,54 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_5 : register(b1, space0) {
+  uint4 x_5[2];
+};
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[2];
+};
+
+void main_1() {
+  int i = 0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_29 = asint(x_5[scalar_offset / 4][scalar_offset % 4]);
+  const float x_30 = float(x_29);
+  x_GLF_color = float4(x_30, x_30, x_30, x_30);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_33 = asint(x_5[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  i = x_33;
+  while (true) {
+    const int x_38 = i;
+    const int x_40 = asint(x_5[1].x);
+    if ((x_38 < x_40)) {
+    } else {
+      break;
+    }
+    const float x_44 = asfloat(x_8[1].x);
+    if (!((x_44 <= float(i)))) {
+      const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+      const float x_52 = asfloat(x_8[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+      const int x_53 = i;
+      const int x_55 = i;
+      const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+      const float x_58 = asfloat(x_8[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+      x_GLF_color = (x_GLF_color + float4(x_52, float(x_53), float(x_55), x_58));
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instructions-for-if-less-than-equal/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-instructions-for-if-less-than-equal/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..f3e2dd6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instructions-for-if-less-than-equal/0-opt.wgsl.expected.msl
@@ -0,0 +1,70 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_5, constant buf0& x_8, thread float4* const tint_symbol_4) {
+  int i = 0;
+  int const x_29 = x_5.x_GLF_uniform_int_values.arr[0].el;
+  float const x_30 = float(x_29);
+  *(tint_symbol_4) = float4(x_30, x_30, x_30, x_30);
+  int const x_33 = x_5.x_GLF_uniform_int_values.arr[0].el;
+  i = x_33;
+  while (true) {
+    int const x_38 = i;
+    int const x_40 = x_5.x_GLF_uniform_int_values.arr[1].el;
+    if ((x_38 < x_40)) {
+    } else {
+      break;
+    }
+    float const x_44 = x_8.x_GLF_uniform_float_values.arr[1].el;
+    int const x_45 = i;
+    if (!((x_44 <= float(x_45)))) {
+      float const x_52 = x_8.x_GLF_uniform_float_values.arr[0].el;
+      int const x_53 = i;
+      int const x_55 = i;
+      float const x_58 = x_8.x_GLF_uniform_float_values.arr[0].el;
+      float4 const x_60 = *(tint_symbol_4);
+      *(tint_symbol_4) = (x_60 + float4(x_52, float(x_53), float(x_55), x_58));
+    }
+    {
+      int const x_62 = i;
+      i = (x_62 + 1);
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_5 [[buffer(1)]], constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instructions-for-if-less-than-equal/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-instructions-for-if-less-than-equal/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..4b3abcc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instructions-for-if-less-than-equal/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,142 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 82
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_5 "x_5"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_5 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %25 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+   %main_out = OpTypeStruct %v4float
+         %70 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %25
+         %29 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %30 = OpLoad %int %29
+         %31 = OpConvertSToF %float %30
+         %32 = OpCompositeConstruct %v4float %31 %31 %31 %31
+               OpStore %x_GLF_color %32
+         %33 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %34 = OpLoad %int %33
+               OpStore %i %34
+               OpBranch %35
+         %35 = OpLabel
+               OpLoopMerge %36 %37 None
+               OpBranch %38
+         %38 = OpLabel
+         %39 = OpLoad %int %i
+         %41 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %42 = OpLoad %int %41
+         %43 = OpSLessThan %bool %39 %42
+               OpSelectionMerge %45 None
+               OpBranchConditional %43 %46 %47
+         %46 = OpLabel
+               OpBranch %45
+         %47 = OpLabel
+               OpBranch %36
+         %45 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+         %50 = OpLoad %float %49
+         %51 = OpLoad %int %i
+         %53 = OpConvertSToF %float %51
+         %54 = OpFOrdLessThanEqual %bool %50 %53
+         %52 = OpLogicalNot %bool %54
+               OpSelectionMerge %55 None
+               OpBranchConditional %52 %56 %55
+         %56 = OpLabel
+         %57 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %58 = OpLoad %float %57
+         %59 = OpLoad %int %i
+         %60 = OpLoad %int %i
+         %61 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %62 = OpLoad %float %61
+         %63 = OpLoad %v4float %x_GLF_color
+         %64 = OpConvertSToF %float %59
+         %65 = OpConvertSToF %float %60
+         %66 = OpCompositeConstruct %v4float %58 %64 %65 %62
+         %67 = OpFAdd %v4float %63 %66
+               OpStore %x_GLF_color %67
+               OpBranch %55
+         %55 = OpLabel
+               OpBranch %37
+         %37 = OpLabel
+         %68 = OpLoad %int %i
+         %69 = OpIAdd %int %68 %int_1
+               OpStore %i %69
+               OpBranch %35
+         %36 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %70
+%tint_symbol = OpFunctionParameter %main_out
+         %74 = OpLabel
+         %75 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %75
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+         %77 = OpLabel
+         %78 = OpFunctionCall %void %main_1
+         %80 = OpLoad %v4float %x_GLF_color
+         %81 = OpCompositeConstruct %main_out %80
+         %79 = OpFunctionCall %void %tint_symbol_2 %81
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-instructions-for-if-less-than-equal/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-instructions-for-if-less-than-equal/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..5aa01a6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-instructions-for-if-less-than-equal/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,63 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_5 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+fn main_1() {
+  var i : i32;
+  let x_29 : i32 = x_5.x_GLF_uniform_int_values[0];
+  let x_30 : f32 = f32(x_29);
+  x_GLF_color = vec4<f32>(x_30, x_30, x_30, x_30);
+  let x_33 : i32 = x_5.x_GLF_uniform_int_values[0];
+  i = x_33;
+  loop {
+    let x_38 : i32 = i;
+    let x_40 : i32 = x_5.x_GLF_uniform_int_values[1];
+    if ((x_38 < x_40)) {
+    } else {
+      break;
+    }
+    let x_44 : f32 = x_8.x_GLF_uniform_float_values[1];
+    let x_45 : i32 = i;
+    if (!((x_44 <= f32(x_45)))) {
+      let x_52 : f32 = x_8.x_GLF_uniform_float_values[0];
+      let x_53 : i32 = i;
+      let x_55 : i32 = i;
+      let x_58 : f32 = x_8.x_GLF_uniform_float_values[0];
+      let x_60 : vec4<f32> = x_GLF_color;
+      x_GLF_color = (x_60 + vec4<f32>(x_52, f32(x_53), f32(x_55), x_58));
+    }
+
+    continuing {
+      let x_62 : i32 = i;
+      i = (x_62 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-int-div-round-to-zero/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-int-div-round-to-zero/0-opt.spvasm
new file mode 100644
index 0000000..3d40235
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-int-div-round-to-zero/0-opt.spvasm
@@ -0,0 +1,84 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+  %int_63677 = OpConstant %int 63677
+      %v2int = OpTypeVector %int 2
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %9
+         %26 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+         %27 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %28 = OpLoad %int %27
+               OpStore %a %28
+         %29 = OpLoad %int %a
+         %30 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %31 = OpLoad %int %30
+         %32 = OpCompositeConstruct %v2int %31 %int_63677
+         %33 = OpCompositeConstruct %v2int %29 %29
+         %34 = OpSDiv %v2int %33 %32
+         %35 = OpCompositeExtract %int %34 1
+         %36 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %37 = OpLoad %int %36
+         %38 = OpIEqual %bool %35 %37
+               OpSelectionMerge %39 None
+               OpBranchConditional %38 %40 %41
+         %40 = OpLabel
+         %42 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %43 = OpLoad %int %42
+         %44 = OpConvertSToF %float %43
+         %45 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %46 = OpLoad %int %45
+         %47 = OpConvertSToF %float %46
+         %48 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %49 = OpLoad %int %48
+         %50 = OpConvertSToF %float %49
+         %51 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %52 = OpLoad %int %51
+         %53 = OpConvertSToF %float %52
+         %54 = OpCompositeConstruct %v4float %44 %47 %50 %53
+               OpStore %_GLF_color %54
+               OpBranch %39
+         %41 = OpLabel
+         %55 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %56 = OpLoad %int %55
+         %57 = OpConvertSToF %float %56
+         %58 = OpCompositeConstruct %v4float %57 %57 %57 %57
+               OpStore %_GLF_color %58
+               OpBranch %39
+         %39 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-int-div-round-to-zero/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-int-div-round-to-zero/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..092451a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-int-div-round-to-zero/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,43 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  const int x_28 = asint(x_6[1].x);
+  a = x_28;
+  const int x_29 = a;
+  const int x_31 = asint(x_6[2].x);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_37 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  if (((int2(x_29, x_29) / int2(x_31, 63677)).y == x_37)) {
+    const int x_43 = asint(x_6[2].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_46 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_49 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_52 = asint(x_6[2].x);
+    x_GLF_color = float4(float(x_43), float(x_46), float(x_49), float(x_52));
+  } else {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_56 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const float x_57 = float(x_56);
+    x_GLF_color = float4(x_57, x_57, x_57, x_57);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-int-div-round-to-zero/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-int-div-round-to-zero/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..d74fee4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-int-div-round-to-zero/0-opt.spvasm.expected.msl
@@ -0,0 +1,49 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int const x_28 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  a = x_28;
+  int const x_29 = a;
+  int const x_31 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_37 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  if ((((int2(x_29, x_29) / int2(x_31, 63677))).y == x_37)) {
+    int const x_43 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_46 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_49 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_52 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    *(tint_symbol_4) = float4(float(x_43), float(x_46), float(x_49), float(x_52));
+  } else {
+    int const x_56 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    float const x_57 = float(x_56);
+    *(tint_symbol_4) = float4(x_57, x_57, x_57, x_57);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-int-div-round-to-zero/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-int-div-round-to-zero/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..b2ec6d5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-int-div-round-to-zero/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,116 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 74
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+      %int_0 = OpConstant %int 0
+      %v2int = OpTypeVector %int 2
+  %int_63677 = OpConstant %int 63677
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %v4float
+         %62 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+         %25 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %26 = OpLoad %int %25
+               OpStore %a %26
+         %27 = OpLoad %int %a
+         %29 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %30 = OpLoad %int %29
+         %32 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %33 = OpLoad %int %32
+         %35 = OpCompositeConstruct %v2int %27 %27
+         %37 = OpCompositeConstruct %v2int %30 %int_63677
+         %38 = OpSDiv %v2int %35 %37
+         %39 = OpCompositeExtract %int %38 1
+         %40 = OpIEqual %bool %39 %33
+               OpSelectionMerge %42 None
+               OpBranchConditional %40 %43 %44
+         %43 = OpLabel
+         %45 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %46 = OpLoad %int %45
+         %47 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %48 = OpLoad %int %47
+         %49 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %50 = OpLoad %int %49
+         %51 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %52 = OpLoad %int %51
+         %53 = OpConvertSToF %float %46
+         %54 = OpConvertSToF %float %48
+         %55 = OpConvertSToF %float %50
+         %56 = OpConvertSToF %float %52
+         %57 = OpCompositeConstruct %v4float %53 %54 %55 %56
+               OpStore %x_GLF_color %57
+               OpBranch %42
+         %44 = OpLabel
+         %58 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %59 = OpLoad %int %58
+         %60 = OpConvertSToF %float %59
+         %61 = OpCompositeConstruct %v4float %60 %60 %60 %60
+               OpStore %x_GLF_color %61
+               OpBranch %42
+         %42 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %62
+%tint_symbol = OpFunctionParameter %main_out
+         %66 = OpLabel
+         %67 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %67
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %69 = OpLabel
+         %70 = OpFunctionCall %void %main_1
+         %72 = OpLoad %v4float %x_GLF_color
+         %73 = OpCompositeConstruct %main_out %72
+         %71 = OpFunctionCall %void %tint_symbol_2 %73
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-int-div-round-to-zero/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-int-div-round-to-zero/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..c5c24bf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-int-div-round-to-zero/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,42 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  let x_28 : i32 = x_6.x_GLF_uniform_int_values[1];
+  a = x_28;
+  let x_29 : i32 = a;
+  let x_31 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_37 : i32 = x_6.x_GLF_uniform_int_values[0];
+  if ((((vec2<i32>(x_29, x_29) / vec2<i32>(x_31, 63677))).y == x_37)) {
+    let x_43 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_46 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_49 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_52 : i32 = x_6.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_43), f32(x_46), f32(x_49), f32(x_52));
+  } else {
+    let x_56 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_57 : f32 = f32(x_56);
+    x_GLF_color = vec4<f32>(x_57, x_57, x_57, x_57);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-int-div-round-to-zero/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-int-div-round-to-zero/0-opt.wgsl
new file mode 100644
index 0000000..c5c24bf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-int-div-round-to-zero/0-opt.wgsl
@@ -0,0 +1,42 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  let x_28 : i32 = x_6.x_GLF_uniform_int_values[1];
+  a = x_28;
+  let x_29 : i32 = a;
+  let x_31 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_37 : i32 = x_6.x_GLF_uniform_int_values[0];
+  if ((((vec2<i32>(x_29, x_29) / vec2<i32>(x_31, 63677))).y == x_37)) {
+    let x_43 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_46 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_49 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_52 : i32 = x_6.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_43), f32(x_46), f32(x_49), f32(x_52));
+  } else {
+    let x_56 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_57 : f32 = f32(x_56);
+    x_GLF_color = vec4<f32>(x_57, x_57, x_57, x_57);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-int-div-round-to-zero/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-int-div-round-to-zero/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..092451a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-int-div-round-to-zero/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,43 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  const int x_28 = asint(x_6[1].x);
+  a = x_28;
+  const int x_29 = a;
+  const int x_31 = asint(x_6[2].x);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_37 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  if (((int2(x_29, x_29) / int2(x_31, 63677)).y == x_37)) {
+    const int x_43 = asint(x_6[2].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_46 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_49 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_52 = asint(x_6[2].x);
+    x_GLF_color = float4(float(x_43), float(x_46), float(x_49), float(x_52));
+  } else {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_56 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const float x_57 = float(x_56);
+    x_GLF_color = float4(x_57, x_57, x_57, x_57);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-int-div-round-to-zero/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-int-div-round-to-zero/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..d74fee4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-int-div-round-to-zero/0-opt.wgsl.expected.msl
@@ -0,0 +1,49 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int const x_28 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  a = x_28;
+  int const x_29 = a;
+  int const x_31 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_37 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  if ((((int2(x_29, x_29) / int2(x_31, 63677))).y == x_37)) {
+    int const x_43 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_46 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_49 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_52 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    *(tint_symbol_4) = float4(float(x_43), float(x_46), float(x_49), float(x_52));
+  } else {
+    int const x_56 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    float const x_57 = float(x_56);
+    *(tint_symbol_4) = float4(x_57, x_57, x_57, x_57);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-int-div-round-to-zero/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-int-div-round-to-zero/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..b2ec6d5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-int-div-round-to-zero/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,116 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 74
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+      %int_0 = OpConstant %int 0
+      %v2int = OpTypeVector %int 2
+  %int_63677 = OpConstant %int 63677
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %v4float
+         %62 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+         %25 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %26 = OpLoad %int %25
+               OpStore %a %26
+         %27 = OpLoad %int %a
+         %29 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %30 = OpLoad %int %29
+         %32 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %33 = OpLoad %int %32
+         %35 = OpCompositeConstruct %v2int %27 %27
+         %37 = OpCompositeConstruct %v2int %30 %int_63677
+         %38 = OpSDiv %v2int %35 %37
+         %39 = OpCompositeExtract %int %38 1
+         %40 = OpIEqual %bool %39 %33
+               OpSelectionMerge %42 None
+               OpBranchConditional %40 %43 %44
+         %43 = OpLabel
+         %45 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %46 = OpLoad %int %45
+         %47 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %48 = OpLoad %int %47
+         %49 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %50 = OpLoad %int %49
+         %51 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %52 = OpLoad %int %51
+         %53 = OpConvertSToF %float %46
+         %54 = OpConvertSToF %float %48
+         %55 = OpConvertSToF %float %50
+         %56 = OpConvertSToF %float %52
+         %57 = OpCompositeConstruct %v4float %53 %54 %55 %56
+               OpStore %x_GLF_color %57
+               OpBranch %42
+         %44 = OpLabel
+         %58 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %59 = OpLoad %int %58
+         %60 = OpConvertSToF %float %59
+         %61 = OpCompositeConstruct %v4float %60 %60 %60 %60
+               OpStore %x_GLF_color %61
+               OpBranch %42
+         %42 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %62
+%tint_symbol = OpFunctionParameter %main_out
+         %66 = OpLabel
+         %67 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %67
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %69 = OpLabel
+         %70 = OpFunctionCall %void %main_1
+         %72 = OpLoad %v4float %x_GLF_color
+         %73 = OpCompositeConstruct %main_out %72
+         %71 = OpFunctionCall %void %tint_symbol_2 %73
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-int-div-round-to-zero/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-int-div-round-to-zero/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..c5c24bf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-int-div-round-to-zero/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,42 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  let x_28 : i32 = x_6.x_GLF_uniform_int_values[1];
+  a = x_28;
+  let x_29 : i32 = a;
+  let x_31 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_37 : i32 = x_6.x_GLF_uniform_int_values[0];
+  if ((((vec2<i32>(x_29, x_29) / vec2<i32>(x_31, 63677))).y == x_37)) {
+    let x_43 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_46 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_49 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_52 : i32 = x_6.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_43), f32(x_46), f32(x_49), f32(x_52));
+  } else {
+    let x_56 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_57 : f32 = f32(x_56);
+    x_GLF_color = vec4<f32>(x_57, x_57, x_57, x_57);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-int-full-bits-divide-by-two-loop/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-int-full-bits-divide-by-two-loop/0-opt.spvasm
new file mode 100644
index 0000000..8579b3c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-int-full-bits-divide-by-two-loop/0-opt.spvasm
@@ -0,0 +1,108 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %a "a"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+     %int_n1 = OpConstant %int -1
+      %int_5 = OpConstant %int 5
+      %int_2 = OpConstant %int 2
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %11
+         %30 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+         %31 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %32 = OpLoad %float %31
+         %33 = OpConvertFToS %int %32
+         %34 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %35 = OpLoad %int %34
+         %36 = OpSLessThan %bool %33 %35
+         %37 = OpSelect %int %36 %int_0 %int_n1
+               OpStore %a %37
+               OpStore %i %int_0
+               OpBranch %38
+         %38 = OpLabel
+               OpLoopMerge %39 %40 None
+               OpBranch %41
+         %41 = OpLabel
+         %42 = OpLoad %int %i
+         %43 = OpSLessThan %bool %42 %int_5
+               OpBranchConditional %43 %44 %39
+         %44 = OpLabel
+         %45 = OpLoad %int %a
+         %46 = OpSDiv %int %45 %int_2
+               OpStore %a %46
+               OpBranch %40
+         %40 = OpLabel
+         %47 = OpLoad %int %i
+         %48 = OpIAdd %int %47 %int_1
+               OpStore %i %48
+               OpBranch %38
+         %39 = OpLabel
+         %49 = OpLoad %int %a
+         %50 = OpIEqual %bool %49 %int_0
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %53
+         %52 = OpLabel
+         %54 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %55 = OpLoad %int %54
+         %56 = OpConvertSToF %float %55
+         %57 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %58 = OpLoad %int %57
+         %59 = OpConvertSToF %float %58
+         %60 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %61 = OpLoad %int %60
+         %62 = OpConvertSToF %float %61
+         %63 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %64 = OpLoad %int %63
+         %65 = OpConvertSToF %float %64
+         %66 = OpCompositeConstruct %v4float %56 %59 %62 %65
+               OpStore %_GLF_color %66
+               OpBranch %51
+         %53 = OpLabel
+         %67 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %68 = OpLoad %int %67
+         %69 = OpConvertSToF %float %68
+         %70 = OpCompositeConstruct %v4float %69 %69 %69 %69
+               OpStore %_GLF_color %70
+               OpBranch %51
+         %51 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-int-full-bits-divide-by-two-loop/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-int-full-bits-divide-by-two-loop/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..42545af
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-int-full-bits-divide-by-two-loop/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,52 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  int i = 0;
+  const float x_32 = gl_FragCoord.x;
+  const int x_35 = asint(x_7[1].x);
+  a = ((int(x_32) < x_35) ? 0 : -1);
+  i = 0;
+  {
+    for(; (i < 5); i = (i + 1)) {
+      a = (a / 2);
+    }
+  }
+  if ((a == 0)) {
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_55 = asint(x_7[scalar_offset / 4][scalar_offset % 4]);
+    const int x_58 = asint(x_7[1].x);
+    const int x_61 = asint(x_7[1].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_64 = asint(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    x_GLF_color = float4(float(x_55), float(x_58), float(x_61), float(x_64));
+  } else {
+    const int x_68 = asint(x_7[1].x);
+    const float x_69 = float(x_68);
+    x_GLF_color = float4(x_69, x_69, x_69, x_69);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-int-full-bits-divide-by-two-loop/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-int-full-bits-divide-by-two-loop/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..4b31f2b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-int-full-bits-divide-by-two-loop/0-opt.spvasm.expected.msl
@@ -0,0 +1,65 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int a = 0;
+  int i = 0;
+  float const x_32 = (*(tint_symbol_5)).x;
+  int const x_35 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  a = select(-1, 0, (int(x_32) < x_35));
+  i = 0;
+  while (true) {
+    int const x_42 = i;
+    if ((x_42 < 5)) {
+    } else {
+      break;
+    }
+    int const x_45 = a;
+    a = (x_45 / 2);
+    {
+      int const x_47 = i;
+      i = (x_47 + 1);
+    }
+  }
+  int const x_49 = a;
+  if ((x_49 == 0)) {
+    int const x_55 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_58 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    int const x_61 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    int const x_64 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_6) = float4(float(x_55), float(x_58), float(x_61), float(x_64));
+  } else {
+    int const x_68 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    float const x_69 = float(x_68);
+    *(tint_symbol_6) = float4(x_69, x_69, x_69, x_69);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_7, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-int-full-bits-divide-by-two-loop/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-int-full-bits-divide-by-two-loop/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..3b7284c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-int-full-bits-divide-by-two-loop/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,149 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 90
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %24 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_0 = OpConstant %int 0
+     %int_n1 = OpConstant %int -1
+      %int_5 = OpConstant %int 5
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+         %77 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %18
+         %21 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %24
+          %i = OpVariable %_ptr_Function_int Function %24
+         %28 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %29 = OpLoad %float %28
+         %32 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %33 = OpLoad %int %32
+         %35 = OpConvertFToS %int %29
+         %36 = OpSLessThan %bool %35 %33
+         %34 = OpSelect %int %36 %int_0 %int_n1
+               OpStore %a %34
+               OpStore %i %int_0
+               OpBranch %40
+         %40 = OpLabel
+               OpLoopMerge %41 %42 None
+               OpBranch %43
+         %43 = OpLabel
+         %44 = OpLoad %int %i
+         %46 = OpSLessThan %bool %44 %int_5
+               OpSelectionMerge %47 None
+               OpBranchConditional %46 %48 %49
+         %48 = OpLabel
+               OpBranch %47
+         %49 = OpLabel
+               OpBranch %41
+         %47 = OpLabel
+         %50 = OpLoad %int %a
+         %52 = OpSDiv %int %50 %int_2
+               OpStore %a %52
+               OpBranch %42
+         %42 = OpLabel
+         %53 = OpLoad %int %i
+         %54 = OpIAdd %int %53 %int_1
+               OpStore %i %54
+               OpBranch %40
+         %41 = OpLabel
+         %55 = OpLoad %int %a
+         %56 = OpIEqual %bool %55 %int_0
+               OpSelectionMerge %57 None
+               OpBranchConditional %56 %58 %59
+         %58 = OpLabel
+         %60 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %61 = OpLoad %int %60
+         %62 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %63 = OpLoad %int %62
+         %64 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %65 = OpLoad %int %64
+         %66 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %67 = OpLoad %int %66
+         %68 = OpConvertSToF %float %61
+         %69 = OpConvertSToF %float %63
+         %70 = OpConvertSToF %float %65
+         %71 = OpConvertSToF %float %67
+         %72 = OpCompositeConstruct %v4float %68 %69 %70 %71
+               OpStore %x_GLF_color %72
+               OpBranch %57
+         %59 = OpLabel
+         %73 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %74 = OpLoad %int %73
+         %75 = OpConvertSToF %float %74
+         %76 = OpCompositeConstruct %v4float %75 %75 %75 %75
+               OpStore %x_GLF_color %76
+               OpBranch %57
+         %57 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %77
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %81 = OpLabel
+         %82 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %82
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %18
+         %84 = OpLabel
+         %85 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %85
+         %86 = OpFunctionCall %void %main_1
+         %88 = OpLoad %v4float %x_GLF_color
+         %89 = OpCompositeConstruct %main_out %88
+         %87 = OpFunctionCall %void %tint_symbol_3 %89
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-int-full-bits-divide-by-two-loop/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-int-full-bits-divide-by-two-loop/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..15a377c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-int-full-bits-divide-by-two-loop/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,60 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  let x_32 : f32 = gl_FragCoord.x;
+  let x_35 : i32 = x_7.x_GLF_uniform_int_values[1];
+  a = select(-1, 0, (i32(x_32) < x_35));
+  i = 0;
+  loop {
+    let x_42 : i32 = i;
+    if ((x_42 < 5)) {
+    } else {
+      break;
+    }
+    let x_45 : i32 = a;
+    a = (x_45 / 2);
+
+    continuing {
+      let x_47 : i32 = i;
+      i = (x_47 + 1);
+    }
+  }
+  let x_49 : i32 = a;
+  if ((x_49 == 0)) {
+    let x_55 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_58 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_61 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_64 : i32 = x_7.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_55), f32(x_58), f32(x_61), f32(x_64));
+  } else {
+    let x_68 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_69 : f32 = f32(x_68);
+    x_GLF_color = vec4<f32>(x_69, x_69, x_69, x_69);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-int-full-bits-divide-by-two-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-int-full-bits-divide-by-two-loop/0-opt.wgsl
new file mode 100644
index 0000000..15a377c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-int-full-bits-divide-by-two-loop/0-opt.wgsl
@@ -0,0 +1,60 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  let x_32 : f32 = gl_FragCoord.x;
+  let x_35 : i32 = x_7.x_GLF_uniform_int_values[1];
+  a = select(-1, 0, (i32(x_32) < x_35));
+  i = 0;
+  loop {
+    let x_42 : i32 = i;
+    if ((x_42 < 5)) {
+    } else {
+      break;
+    }
+    let x_45 : i32 = a;
+    a = (x_45 / 2);
+
+    continuing {
+      let x_47 : i32 = i;
+      i = (x_47 + 1);
+    }
+  }
+  let x_49 : i32 = a;
+  if ((x_49 == 0)) {
+    let x_55 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_58 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_61 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_64 : i32 = x_7.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_55), f32(x_58), f32(x_61), f32(x_64));
+  } else {
+    let x_68 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_69 : f32 = f32(x_68);
+    x_GLF_color = vec4<f32>(x_69, x_69, x_69, x_69);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-int-full-bits-divide-by-two-loop/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-int-full-bits-divide-by-two-loop/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..42545af
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-int-full-bits-divide-by-two-loop/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,52 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  int i = 0;
+  const float x_32 = gl_FragCoord.x;
+  const int x_35 = asint(x_7[1].x);
+  a = ((int(x_32) < x_35) ? 0 : -1);
+  i = 0;
+  {
+    for(; (i < 5); i = (i + 1)) {
+      a = (a / 2);
+    }
+  }
+  if ((a == 0)) {
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_55 = asint(x_7[scalar_offset / 4][scalar_offset % 4]);
+    const int x_58 = asint(x_7[1].x);
+    const int x_61 = asint(x_7[1].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_64 = asint(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    x_GLF_color = float4(float(x_55), float(x_58), float(x_61), float(x_64));
+  } else {
+    const int x_68 = asint(x_7[1].x);
+    const float x_69 = float(x_68);
+    x_GLF_color = float4(x_69, x_69, x_69, x_69);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-int-full-bits-divide-by-two-loop/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-int-full-bits-divide-by-two-loop/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..4b31f2b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-int-full-bits-divide-by-two-loop/0-opt.wgsl.expected.msl
@@ -0,0 +1,65 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int a = 0;
+  int i = 0;
+  float const x_32 = (*(tint_symbol_5)).x;
+  int const x_35 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  a = select(-1, 0, (int(x_32) < x_35));
+  i = 0;
+  while (true) {
+    int const x_42 = i;
+    if ((x_42 < 5)) {
+    } else {
+      break;
+    }
+    int const x_45 = a;
+    a = (x_45 / 2);
+    {
+      int const x_47 = i;
+      i = (x_47 + 1);
+    }
+  }
+  int const x_49 = a;
+  if ((x_49 == 0)) {
+    int const x_55 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_58 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    int const x_61 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    int const x_64 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_6) = float4(float(x_55), float(x_58), float(x_61), float(x_64));
+  } else {
+    int const x_68 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    float const x_69 = float(x_68);
+    *(tint_symbol_6) = float4(x_69, x_69, x_69, x_69);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_7, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-int-full-bits-divide-by-two-loop/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-int-full-bits-divide-by-two-loop/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..3b7284c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-int-full-bits-divide-by-two-loop/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,149 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 90
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %24 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_0 = OpConstant %int 0
+     %int_n1 = OpConstant %int -1
+      %int_5 = OpConstant %int 5
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+         %77 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %18
+         %21 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %24
+          %i = OpVariable %_ptr_Function_int Function %24
+         %28 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %29 = OpLoad %float %28
+         %32 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %33 = OpLoad %int %32
+         %35 = OpConvertFToS %int %29
+         %36 = OpSLessThan %bool %35 %33
+         %34 = OpSelect %int %36 %int_0 %int_n1
+               OpStore %a %34
+               OpStore %i %int_0
+               OpBranch %40
+         %40 = OpLabel
+               OpLoopMerge %41 %42 None
+               OpBranch %43
+         %43 = OpLabel
+         %44 = OpLoad %int %i
+         %46 = OpSLessThan %bool %44 %int_5
+               OpSelectionMerge %47 None
+               OpBranchConditional %46 %48 %49
+         %48 = OpLabel
+               OpBranch %47
+         %49 = OpLabel
+               OpBranch %41
+         %47 = OpLabel
+         %50 = OpLoad %int %a
+         %52 = OpSDiv %int %50 %int_2
+               OpStore %a %52
+               OpBranch %42
+         %42 = OpLabel
+         %53 = OpLoad %int %i
+         %54 = OpIAdd %int %53 %int_1
+               OpStore %i %54
+               OpBranch %40
+         %41 = OpLabel
+         %55 = OpLoad %int %a
+         %56 = OpIEqual %bool %55 %int_0
+               OpSelectionMerge %57 None
+               OpBranchConditional %56 %58 %59
+         %58 = OpLabel
+         %60 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %61 = OpLoad %int %60
+         %62 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %63 = OpLoad %int %62
+         %64 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %65 = OpLoad %int %64
+         %66 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %67 = OpLoad %int %66
+         %68 = OpConvertSToF %float %61
+         %69 = OpConvertSToF %float %63
+         %70 = OpConvertSToF %float %65
+         %71 = OpConvertSToF %float %67
+         %72 = OpCompositeConstruct %v4float %68 %69 %70 %71
+               OpStore %x_GLF_color %72
+               OpBranch %57
+         %59 = OpLabel
+         %73 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %74 = OpLoad %int %73
+         %75 = OpConvertSToF %float %74
+         %76 = OpCompositeConstruct %v4float %75 %75 %75 %75
+               OpStore %x_GLF_color %76
+               OpBranch %57
+         %57 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %77
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %81 = OpLabel
+         %82 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %82
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %18
+         %84 = OpLabel
+         %85 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %85
+         %86 = OpFunctionCall %void %main_1
+         %88 = OpLoad %v4float %x_GLF_color
+         %89 = OpCompositeConstruct %main_out %88
+         %87 = OpFunctionCall %void %tint_symbol_3 %89
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-int-full-bits-divide-by-two-loop/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-int-full-bits-divide-by-two-loop/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..15a377c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-int-full-bits-divide-by-two-loop/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,60 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  let x_32 : f32 = gl_FragCoord.x;
+  let x_35 : i32 = x_7.x_GLF_uniform_int_values[1];
+  a = select(-1, 0, (i32(x_32) < x_35));
+  i = 0;
+  loop {
+    let x_42 : i32 = i;
+    if ((x_42 < 5)) {
+    } else {
+      break;
+    }
+    let x_45 : i32 = a;
+    a = (x_45 / 2);
+
+    continuing {
+      let x_47 : i32 = i;
+      i = (x_47 + 1);
+    }
+  }
+  let x_49 : i32 = a;
+  if ((x_49 == 0)) {
+    let x_55 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_58 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_61 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_64 : i32 = x_7.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_55), f32(x_58), f32(x_61), f32(x_64));
+  } else {
+    let x_68 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_69 : f32 = f32(x_68);
+    x_GLF_color = vec4<f32>(x_69, x_69, x_69, x_69);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-integer-modulo-negative/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-integer-modulo-negative/0-opt.spvasm
new file mode 100644
index 0000000..ea1f789
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-integer-modulo-negative/0-opt.spvasm
@@ -0,0 +1,112 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %count "count"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+ %int_n93448 = OpConstant %int -93448
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+      %int_2 = OpConstant %int 2
+       %main = OpFunction %void None %10
+         %25 = OpLabel
+      %count = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+         %26 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %27 = OpLoad %int %26
+               OpStore %count %27
+         %28 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %29 = OpLoad %int %28
+               OpStore %i %29
+               OpBranch %30
+         %30 = OpLabel
+               OpLoopMerge %31 %32 None
+               OpBranch %33
+         %33 = OpLabel
+         %34 = OpLoad %int %i
+         %35 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %36 = OpLoad %int %35
+         %37 = OpSLessThan %bool %34 %36
+               OpBranchConditional %37 %38 %31
+         %38 = OpLabel
+         %39 = OpLoad %int %count
+         %40 = OpSMod %int %39 %int_n93448
+         %41 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %42 = OpLoad %int %41
+         %43 = OpSGreaterThan %bool %40 %42
+               OpSelectionMerge %44 None
+               OpBranchConditional %43 %45 %44
+         %45 = OpLabel
+         %46 = OpLoad %int %count
+         %47 = OpIAdd %int %46 %int_1
+               OpStore %count %47
+               OpBranch %44
+         %44 = OpLabel
+               OpBranch %32
+         %32 = OpLabel
+         %48 = OpLoad %int %i
+         %49 = OpIAdd %int %48 %int_1
+               OpStore %i %49
+               OpBranch %30
+         %31 = OpLabel
+         %50 = OpLoad %int %count
+         %51 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %52 = OpLoad %int %51
+         %53 = OpIEqual %bool %50 %52
+               OpSelectionMerge %54 None
+               OpBranchConditional %53 %55 %56
+         %55 = OpLabel
+         %57 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %58 = OpLoad %int %57
+         %59 = OpConvertSToF %float %58
+         %60 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %61 = OpLoad %int %60
+         %62 = OpConvertSToF %float %61
+         %63 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %64 = OpLoad %int %63
+         %65 = OpConvertSToF %float %64
+         %66 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %67 = OpLoad %int %66
+         %68 = OpConvertSToF %float %67
+         %69 = OpCompositeConstruct %v4float %59 %62 %65 %68
+               OpStore %_GLF_color %69
+               OpBranch %54
+         %56 = OpLabel
+         %70 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %71 = OpLoad %int %70
+         %72 = OpConvertSToF %float %71
+         %73 = OpCompositeConstruct %v4float %72 %72 %72 %72
+               OpStore %_GLF_color %73
+               OpBranch %54
+         %54 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-integer-modulo-negative/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-integer-modulo-negative/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..374a386
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-integer-modulo-negative/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,58 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int count = 0;
+  int i = 0;
+  const int x_27 = asint(x_6[1].x);
+  count = x_27;
+  const int x_29 = asint(x_6[1].x);
+  i = x_29;
+  while (true) {
+    const int x_34 = i;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_36 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_34 < x_36)) {
+    } else {
+      break;
+    }
+    const int x_39 = count;
+    const int x_42 = asint(x_6[1].x);
+    if (((x_39 % -93448) > x_42)) {
+      count = (count + 1);
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_50 = count;
+  const int x_52 = asint(x_6[1].x);
+  if ((x_50 == x_52)) {
+    const int x_58 = asint(x_6[2].x);
+    const int x_61 = asint(x_6[1].x);
+    const int x_64 = asint(x_6[1].x);
+    const int x_67 = asint(x_6[2].x);
+    x_GLF_color = float4(float(x_58), float(x_61), float(x_64), float(x_67));
+  } else {
+    const int x_71 = asint(x_6[1].x);
+    const float x_72 = float(x_71);
+    x_GLF_color = float4(x_72, x_72, x_72, x_72);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-integer-modulo-negative/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-integer-modulo-negative/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..3ebe7f7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-integer-modulo-negative/0-opt.spvasm.expected.msl
@@ -0,0 +1,69 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int count = 0;
+  int i = 0;
+  int const x_27 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  count = x_27;
+  int const x_29 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  i = x_29;
+  while (true) {
+    int const x_34 = i;
+    int const x_36 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_34 < x_36)) {
+    } else {
+      break;
+    }
+    int const x_39 = count;
+    int const x_42 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    if (((x_39 % -93448) > x_42)) {
+      int const x_46 = count;
+      count = (x_46 + 1);
+    }
+    {
+      int const x_48 = i;
+      i = (x_48 + 1);
+    }
+  }
+  int const x_50 = count;
+  int const x_52 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_50 == x_52)) {
+    int const x_58 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_61 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_64 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_67 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    *(tint_symbol_4) = float4(float(x_58), float(x_61), float(x_64), float(x_67));
+  } else {
+    int const x_71 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    float const x_72 = float(x_71);
+    *(tint_symbol_4) = float4(x_72, x_72, x_72, x_72);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-integer-modulo-negative/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-integer-modulo-negative/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..8a84a5f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-integer-modulo-negative/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,150 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 92
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %count "count"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+ %int_n93448 = OpConstant %int -93448
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+         %80 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+      %count = OpVariable %_ptr_Function_int Function %21
+          %i = OpVariable %_ptr_Function_int Function %21
+         %26 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %27 = OpLoad %int %26
+               OpStore %count %27
+         %28 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %29 = OpLoad %int %28
+               OpStore %i %29
+               OpBranch %30
+         %30 = OpLabel
+               OpLoopMerge %31 %32 None
+               OpBranch %33
+         %33 = OpLabel
+         %34 = OpLoad %int %i
+         %36 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %37 = OpLoad %int %36
+         %38 = OpSLessThan %bool %34 %37
+               OpSelectionMerge %40 None
+               OpBranchConditional %38 %41 %42
+         %41 = OpLabel
+               OpBranch %40
+         %42 = OpLabel
+               OpBranch %31
+         %40 = OpLabel
+         %43 = OpLoad %int %count
+         %44 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %45 = OpLoad %int %44
+         %47 = OpSMod %int %43 %int_n93448
+         %48 = OpSGreaterThan %bool %47 %45
+               OpSelectionMerge %49 None
+               OpBranchConditional %48 %50 %49
+         %50 = OpLabel
+         %51 = OpLoad %int %count
+         %52 = OpIAdd %int %51 %int_1
+               OpStore %count %52
+               OpBranch %49
+         %49 = OpLabel
+               OpBranch %32
+         %32 = OpLabel
+         %53 = OpLoad %int %i
+         %54 = OpIAdd %int %53 %int_1
+               OpStore %i %54
+               OpBranch %30
+         %31 = OpLabel
+         %55 = OpLoad %int %count
+         %56 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %57 = OpLoad %int %56
+         %58 = OpIEqual %bool %55 %57
+               OpSelectionMerge %59 None
+               OpBranchConditional %58 %60 %61
+         %60 = OpLabel
+         %63 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %64 = OpLoad %int %63
+         %65 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %66 = OpLoad %int %65
+         %67 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %68 = OpLoad %int %67
+         %69 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %70 = OpLoad %int %69
+         %71 = OpConvertSToF %float %64
+         %72 = OpConvertSToF %float %66
+         %73 = OpConvertSToF %float %68
+         %74 = OpConvertSToF %float %70
+         %75 = OpCompositeConstruct %v4float %71 %72 %73 %74
+               OpStore %x_GLF_color %75
+               OpBranch %59
+         %61 = OpLabel
+         %76 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %77 = OpLoad %int %76
+         %78 = OpConvertSToF %float %77
+         %79 = OpCompositeConstruct %v4float %78 %78 %78 %78
+               OpStore %x_GLF_color %79
+               OpBranch %59
+         %59 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %80
+%tint_symbol = OpFunctionParameter %main_out
+         %84 = OpLabel
+         %85 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %85
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %87 = OpLabel
+         %88 = OpFunctionCall %void %main_1
+         %90 = OpLoad %v4float %x_GLF_color
+         %91 = OpCompositeConstruct %main_out %90
+         %89 = OpFunctionCall %void %tint_symbol_2 %91
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-integer-modulo-negative/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-integer-modulo-negative/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..c94e6de
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-integer-modulo-negative/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,63 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var count : i32;
+  var i : i32;
+  let x_27 : i32 = x_6.x_GLF_uniform_int_values[1];
+  count = x_27;
+  let x_29 : i32 = x_6.x_GLF_uniform_int_values[1];
+  i = x_29;
+  loop {
+    let x_34 : i32 = i;
+    let x_36 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_34 < x_36)) {
+    } else {
+      break;
+    }
+    let x_39 : i32 = count;
+    let x_42 : i32 = x_6.x_GLF_uniform_int_values[1];
+    if (((x_39 % -93448) > x_42)) {
+      let x_46 : i32 = count;
+      count = (x_46 + 1);
+    }
+
+    continuing {
+      let x_48 : i32 = i;
+      i = (x_48 + 1);
+    }
+  }
+  let x_50 : i32 = count;
+  let x_52 : i32 = x_6.x_GLF_uniform_int_values[1];
+  if ((x_50 == x_52)) {
+    let x_58 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_61 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_64 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_67 : i32 = x_6.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_58), f32(x_61), f32(x_64), f32(x_67));
+  } else {
+    let x_71 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_72 : f32 = f32(x_71);
+    x_GLF_color = vec4<f32>(x_72, x_72, x_72, x_72);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-integer-modulo-negative/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-integer-modulo-negative/0-opt.wgsl
new file mode 100644
index 0000000..c94e6de
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-integer-modulo-negative/0-opt.wgsl
@@ -0,0 +1,63 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var count : i32;
+  var i : i32;
+  let x_27 : i32 = x_6.x_GLF_uniform_int_values[1];
+  count = x_27;
+  let x_29 : i32 = x_6.x_GLF_uniform_int_values[1];
+  i = x_29;
+  loop {
+    let x_34 : i32 = i;
+    let x_36 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_34 < x_36)) {
+    } else {
+      break;
+    }
+    let x_39 : i32 = count;
+    let x_42 : i32 = x_6.x_GLF_uniform_int_values[1];
+    if (((x_39 % -93448) > x_42)) {
+      let x_46 : i32 = count;
+      count = (x_46 + 1);
+    }
+
+    continuing {
+      let x_48 : i32 = i;
+      i = (x_48 + 1);
+    }
+  }
+  let x_50 : i32 = count;
+  let x_52 : i32 = x_6.x_GLF_uniform_int_values[1];
+  if ((x_50 == x_52)) {
+    let x_58 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_61 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_64 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_67 : i32 = x_6.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_58), f32(x_61), f32(x_64), f32(x_67));
+  } else {
+    let x_71 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_72 : f32 = f32(x_71);
+    x_GLF_color = vec4<f32>(x_72, x_72, x_72, x_72);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-integer-modulo-negative/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-integer-modulo-negative/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..374a386
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-integer-modulo-negative/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,58 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int count = 0;
+  int i = 0;
+  const int x_27 = asint(x_6[1].x);
+  count = x_27;
+  const int x_29 = asint(x_6[1].x);
+  i = x_29;
+  while (true) {
+    const int x_34 = i;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_36 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_34 < x_36)) {
+    } else {
+      break;
+    }
+    const int x_39 = count;
+    const int x_42 = asint(x_6[1].x);
+    if (((x_39 % -93448) > x_42)) {
+      count = (count + 1);
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_50 = count;
+  const int x_52 = asint(x_6[1].x);
+  if ((x_50 == x_52)) {
+    const int x_58 = asint(x_6[2].x);
+    const int x_61 = asint(x_6[1].x);
+    const int x_64 = asint(x_6[1].x);
+    const int x_67 = asint(x_6[2].x);
+    x_GLF_color = float4(float(x_58), float(x_61), float(x_64), float(x_67));
+  } else {
+    const int x_71 = asint(x_6[1].x);
+    const float x_72 = float(x_71);
+    x_GLF_color = float4(x_72, x_72, x_72, x_72);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-integer-modulo-negative/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-integer-modulo-negative/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..3ebe7f7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-integer-modulo-negative/0-opt.wgsl.expected.msl
@@ -0,0 +1,69 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int count = 0;
+  int i = 0;
+  int const x_27 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  count = x_27;
+  int const x_29 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  i = x_29;
+  while (true) {
+    int const x_34 = i;
+    int const x_36 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_34 < x_36)) {
+    } else {
+      break;
+    }
+    int const x_39 = count;
+    int const x_42 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    if (((x_39 % -93448) > x_42)) {
+      int const x_46 = count;
+      count = (x_46 + 1);
+    }
+    {
+      int const x_48 = i;
+      i = (x_48 + 1);
+    }
+  }
+  int const x_50 = count;
+  int const x_52 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_50 == x_52)) {
+    int const x_58 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_61 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_64 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_67 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    *(tint_symbol_4) = float4(float(x_58), float(x_61), float(x_64), float(x_67));
+  } else {
+    int const x_71 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    float const x_72 = float(x_71);
+    *(tint_symbol_4) = float4(x_72, x_72, x_72, x_72);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-integer-modulo-negative/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-integer-modulo-negative/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..8a84a5f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-integer-modulo-negative/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,150 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 92
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %count "count"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+ %int_n93448 = OpConstant %int -93448
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+         %80 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+      %count = OpVariable %_ptr_Function_int Function %21
+          %i = OpVariable %_ptr_Function_int Function %21
+         %26 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %27 = OpLoad %int %26
+               OpStore %count %27
+         %28 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %29 = OpLoad %int %28
+               OpStore %i %29
+               OpBranch %30
+         %30 = OpLabel
+               OpLoopMerge %31 %32 None
+               OpBranch %33
+         %33 = OpLabel
+         %34 = OpLoad %int %i
+         %36 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %37 = OpLoad %int %36
+         %38 = OpSLessThan %bool %34 %37
+               OpSelectionMerge %40 None
+               OpBranchConditional %38 %41 %42
+         %41 = OpLabel
+               OpBranch %40
+         %42 = OpLabel
+               OpBranch %31
+         %40 = OpLabel
+         %43 = OpLoad %int %count
+         %44 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %45 = OpLoad %int %44
+         %47 = OpSMod %int %43 %int_n93448
+         %48 = OpSGreaterThan %bool %47 %45
+               OpSelectionMerge %49 None
+               OpBranchConditional %48 %50 %49
+         %50 = OpLabel
+         %51 = OpLoad %int %count
+         %52 = OpIAdd %int %51 %int_1
+               OpStore %count %52
+               OpBranch %49
+         %49 = OpLabel
+               OpBranch %32
+         %32 = OpLabel
+         %53 = OpLoad %int %i
+         %54 = OpIAdd %int %53 %int_1
+               OpStore %i %54
+               OpBranch %30
+         %31 = OpLabel
+         %55 = OpLoad %int %count
+         %56 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %57 = OpLoad %int %56
+         %58 = OpIEqual %bool %55 %57
+               OpSelectionMerge %59 None
+               OpBranchConditional %58 %60 %61
+         %60 = OpLabel
+         %63 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %64 = OpLoad %int %63
+         %65 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %66 = OpLoad %int %65
+         %67 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %68 = OpLoad %int %67
+         %69 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %70 = OpLoad %int %69
+         %71 = OpConvertSToF %float %64
+         %72 = OpConvertSToF %float %66
+         %73 = OpConvertSToF %float %68
+         %74 = OpConvertSToF %float %70
+         %75 = OpCompositeConstruct %v4float %71 %72 %73 %74
+               OpStore %x_GLF_color %75
+               OpBranch %59
+         %61 = OpLabel
+         %76 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %77 = OpLoad %int %76
+         %78 = OpConvertSToF %float %77
+         %79 = OpCompositeConstruct %v4float %78 %78 %78 %78
+               OpStore %x_GLF_color %79
+               OpBranch %59
+         %59 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %80
+%tint_symbol = OpFunctionParameter %main_out
+         %84 = OpLabel
+         %85 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %85
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %87 = OpLabel
+         %88 = OpFunctionCall %void %main_1
+         %90 = OpLoad %v4float %x_GLF_color
+         %91 = OpCompositeConstruct %main_out %90
+         %89 = OpFunctionCall %void %tint_symbol_2 %91
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-integer-modulo-negative/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-integer-modulo-negative/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..c94e6de
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-integer-modulo-negative/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,63 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var count : i32;
+  var i : i32;
+  let x_27 : i32 = x_6.x_GLF_uniform_int_values[1];
+  count = x_27;
+  let x_29 : i32 = x_6.x_GLF_uniform_int_values[1];
+  i = x_29;
+  loop {
+    let x_34 : i32 = i;
+    let x_36 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_34 < x_36)) {
+    } else {
+      break;
+    }
+    let x_39 : i32 = count;
+    let x_42 : i32 = x_6.x_GLF_uniform_int_values[1];
+    if (((x_39 % -93448) > x_42)) {
+      let x_46 : i32 = count;
+      count = (x_46 + 1);
+    }
+
+    continuing {
+      let x_48 : i32 = i;
+      i = (x_48 + 1);
+    }
+  }
+  let x_50 : i32 = count;
+  let x_52 : i32 = x_6.x_GLF_uniform_int_values[1];
+  if ((x_50 == x_52)) {
+    let x_58 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_61 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_64 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_67 : i32 = x_6.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_58), f32(x_61), f32(x_64), f32(x_67));
+  } else {
+    let x_71 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_72 : f32 = f32(x_71);
+    x_GLF_color = vec4<f32>(x_72, x_72, x_72, x_72);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-intervalmap-set-stop/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-intervalmap-set-stop/0-opt.spvasm
new file mode 100644
index 0000000..7e17f3a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-intervalmap-set-stop/0-opt.spvasm
@@ -0,0 +1,173 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %func_ "func("
+               OpName %v "v"
+               OpName %i "i"
+               OpName %k "k"
+               OpName %j "j"
+               OpName %data "data"
+               OpName %j_0 "j"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+         %15 = OpTypeFunction %v3float
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+    %float_1 = OpConstant %float 1
+         %19 = OpConstantComposite %v2float %float_1 %float_1
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_4 = OpConstant %float 4
+      %int_1 = OpConstant %int 1
+     %int_10 = OpConstant %int 10
+    %float_0 = OpConstant %float 0
+         %32 = OpConstantComposite %v3float %float_1 %float_0 %float_0
+         %33 = OpConstantComposite %v3float %float_0 %float_0 %float_1
+     %uint_2 = OpConstant %uint 2
+%_arr_v3float_uint_2 = OpTypeArray %v3float %uint_2
+%_ptr_Function__arr_v3float_uint_2 = OpTypePointer Function %_arr_v3float_uint_2
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+      %int_4 = OpConstant %int 4
+     %v3bool = OpTypeVector %bool 3
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %42 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %43 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %12
+         %44 = OpLabel
+          %j = OpVariable %_ptr_Function_int Function
+       %data = OpVariable %_ptr_Function__arr_v3float_uint_2 Function
+        %j_0 = OpVariable %_ptr_Function_int Function
+               OpStore %j %int_0
+               OpBranch %45
+         %45 = OpLabel
+               OpLoopMerge %46 %47 None
+               OpBranch %48
+         %48 = OpLabel
+         %49 = OpLoad %int %j
+         %50 = OpSLessThan %bool %49 %int_1
+               OpBranchConditional %50 %51 %46
+         %51 = OpLabel
+         %52 = OpLoad %int %j
+         %53 = OpFunctionCall %v3float %func_
+         %54 = OpAccessChain %_ptr_Function_v3float %data %52
+               OpStore %54 %53
+               OpBranch %47
+         %47 = OpLabel
+         %55 = OpLoad %int %j
+         %56 = OpIAdd %int %55 %int_1
+               OpStore %j %56
+               OpBranch %45
+         %46 = OpLabel
+               OpStore %j_0 %int_0
+               OpBranch %57
+         %57 = OpLabel
+               OpLoopMerge %58 %59 None
+               OpBranch %60
+         %60 = OpLabel
+         %61 = OpLoad %int %j_0
+         %62 = OpSLessThan %bool %61 %int_1
+               OpBranchConditional %62 %63 %58
+         %63 = OpLabel
+         %64 = OpLoad %int %j_0
+         %65 = OpIMul %int %int_4 %64
+         %66 = OpIAdd %int %65 %int_1
+         %67 = OpFunctionCall %v3float %func_
+         %68 = OpAccessChain %_ptr_Function_v3float %data %66
+               OpStore %68 %67
+               OpBranch %59
+         %59 = OpLabel
+         %69 = OpLoad %int %j_0
+         %70 = OpIAdd %int %69 %int_1
+               OpStore %j_0 %70
+               OpBranch %57
+         %58 = OpLabel
+         %71 = OpAccessChain %_ptr_Function_v3float %data %int_0
+         %72 = OpLoad %v3float %71
+         %73 = OpFOrdEqual %v3bool %72 %32
+         %74 = OpAll %bool %73
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %75
+         %76 = OpLabel
+         %77 = OpAccessChain %_ptr_Function_v3float %data %int_1
+         %78 = OpLoad %v3float %77
+         %79 = OpFOrdEqual %v3bool %78 %32
+         %80 = OpAll %bool %79
+               OpBranch %75
+         %75 = OpLabel
+         %81 = OpPhi %bool %74 %58 %80 %76
+               OpSelectionMerge %82 None
+               OpBranchConditional %81 %83 %84
+         %83 = OpLabel
+               OpStore %_GLF_color %42
+               OpBranch %82
+         %84 = OpLabel
+               OpStore %_GLF_color %43
+               OpBranch %82
+         %82 = OpLabel
+               OpReturn
+               OpFunctionEnd
+      %func_ = OpFunction %v3float None %15
+         %85 = OpLabel
+          %v = OpVariable %_ptr_Function_v2float Function
+          %i = OpVariable %_ptr_Function_int Function
+          %k = OpVariable %_ptr_Function_int Function
+               OpStore %v %19
+               OpStore %i %int_0
+               OpStore %k %int_0
+               OpBranch %86
+         %86 = OpLabel
+               OpLoopMerge %87 %88 None
+               OpBranch %89
+         %89 = OpLabel
+         %90 = OpLoad %int %k
+         %91 = OpSLessThan %bool %90 %int_2
+               OpBranchConditional %91 %92 %87
+         %92 = OpLabel
+         %93 = OpAccessChain %_ptr_Function_float %v %uint_1
+         %94 = OpLoad %float %93
+         %95 = OpFAdd %float %94 %float_1
+         %96 = OpFOrdGreaterThan %bool %95 %float_4
+               OpSelectionMerge %97 None
+               OpBranchConditional %96 %98 %97
+         %98 = OpLabel
+               OpBranch %87
+         %97 = OpLabel
+         %99 = OpAccessChain %_ptr_Function_float %v %uint_1
+               OpStore %99 %float_1
+        %100 = OpLoad %int %i
+        %101 = OpIAdd %int %100 %int_1
+               OpStore %i %101
+               OpBranch %88
+         %88 = OpLabel
+        %102 = OpLoad %int %k
+        %103 = OpIAdd %int %102 %int_1
+               OpStore %k %103
+               OpBranch %86
+         %87 = OpLabel
+        %104 = OpLoad %int %i
+        %105 = OpSLessThan %bool %104 %int_10
+               OpSelectionMerge %106 None
+               OpBranchConditional %105 %107 %108
+        %107 = OpLabel
+               OpReturnValue %32
+        %108 = OpLabel
+               OpReturnValue %33
+        %106 = OpLabel
+               OpUnreachable
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-intervalmap-set-stop/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-intervalmap-set-stop/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..bbf845a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-intervalmap-set-stop/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,78 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float3 func_() {
+  float2 v = float2(0.0f, 0.0f);
+  int i = 0;
+  int k = 0;
+  v = float2(1.0f, 1.0f);
+  i = 0;
+  k = 0;
+  {
+    for(; (k < 2); k = (k + 1)) {
+      const float x_94 = v.y;
+      if (((x_94 + 1.0f) > 4.0f)) {
+        break;
+      }
+      v.y = 1.0f;
+      i = (i + 1);
+    }
+  }
+  if ((i < 10)) {
+    return float3(1.0f, 0.0f, 0.0f);
+  } else {
+    return float3(0.0f, 0.0f, 1.0f);
+  }
+  return float3(0.0f, 0.0f, 0.0f);
+}
+
+void main_1() {
+  int j = 0;
+  float3 data[2] = (float3[2])0;
+  int j_1 = 0;
+  bool x_80 = false;
+  bool x_81_phi = false;
+  j = 0;
+  {
+    for(; (j < 1); j = (j + 1)) {
+      const int x_52 = j;
+      const float3 x_53 = func_();
+      data[x_52] = x_53;
+    }
+  }
+  j_1 = 0;
+  {
+    for(; (j_1 < 1); j_1 = (j_1 + 1)) {
+      const int x_64 = j_1;
+      const float3 x_67 = func_();
+      data[((4 * x_64) + 1)] = x_67;
+    }
+  }
+  const float3 x_72 = data[0];
+  const bool x_74 = all((x_72 == float3(1.0f, 0.0f, 0.0f)));
+  x_81_phi = x_74;
+  if (x_74) {
+    const float3 x_78 = data[1];
+    x_80 = all((x_78 == float3(1.0f, 0.0f, 0.0f)));
+    x_81_phi = x_80;
+  }
+  if (x_81_phi) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-intervalmap-set-stop/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-intervalmap-set-stop/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..06c1659
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-intervalmap-set-stop/0-opt.spvasm.expected.msl
@@ -0,0 +1,108 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  float3 arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float3 func_() {
+  float2 v = 0.0f;
+  int i = 0;
+  int k = 0;
+  v = float2(1.0f, 1.0f);
+  i = 0;
+  k = 0;
+  while (true) {
+    int const x_90 = k;
+    if ((x_90 < 2)) {
+    } else {
+      break;
+    }
+    float const x_94 = v.y;
+    if (((x_94 + 1.0f) > 4.0f)) {
+      break;
+    }
+    v.y = 1.0f;
+    int const x_100 = i;
+    i = (x_100 + 1);
+    {
+      int const x_102 = k;
+      k = (x_102 + 1);
+    }
+  }
+  int const x_104 = i;
+  if ((x_104 < 10)) {
+    return float3(1.0f, 0.0f, 0.0f);
+  } else {
+    return float3(0.0f, 0.0f, 1.0f);
+  }
+  return float3(0.0f, 0.0f, 0.0f);
+}
+
+void main_1(thread float4* const tint_symbol_4) {
+  int j = 0;
+  tint_array_wrapper data = {};
+  int j_1 = 0;
+  bool x_80 = false;
+  bool x_81_phi = false;
+  j = 0;
+  while (true) {
+    int const x_49 = j;
+    if ((x_49 < 1)) {
+    } else {
+      break;
+    }
+    int const x_52 = j;
+    float3 const x_53 = func_();
+    data.arr[x_52] = x_53;
+    {
+      int const x_55 = j;
+      j = (x_55 + 1);
+    }
+  }
+  j_1 = 0;
+  while (true) {
+    int const x_61 = j_1;
+    if ((x_61 < 1)) {
+    } else {
+      break;
+    }
+    int const x_64 = j_1;
+    float3 const x_67 = func_();
+    data.arr[((4 * x_64) + 1)] = x_67;
+    {
+      int const x_69 = j_1;
+      j_1 = (x_69 + 1);
+    }
+  }
+  float3 const x_72 = data.arr[0];
+  bool const x_74 = all((x_72 == float3(1.0f, 0.0f, 0.0f)));
+  x_81_phi = x_74;
+  if (x_74) {
+    float3 const x_78 = data.arr[1];
+    x_80 = all((x_78 == float3(1.0f, 0.0f, 0.0f)));
+    x_81_phi = x_80;
+  }
+  bool const x_81 = x_81_phi;
+  if (x_81) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-intervalmap-set-stop/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-intervalmap-set-stop/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..d944525
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-intervalmap-set-stop/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,233 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 138
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_ "func_"
+               OpName %v "v"
+               OpName %i "i"
+               OpName %k "k"
+               OpName %main_1 "main_1"
+               OpName %j "j"
+               OpName %data "data"
+               OpName %j_1 "j_1"
+               OpName %x_80 "x_80"
+               OpName %x_81_phi "x_81_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_v3float_uint_2 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+    %v3float = OpTypeVector %float 3
+          %8 = OpTypeFunction %v3float
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %15 = OpConstantNull %v2float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %19 = OpConstantNull %int
+    %float_1 = OpConstant %float 1
+         %22 = OpConstantComposite %v2float %float_1 %float_1
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_4 = OpConstant %float 4
+      %int_1 = OpConstant %int 1
+     %int_10 = OpConstant %int 10
+    %float_0 = OpConstant %float 0
+         %58 = OpConstantComposite %v3float %float_1 %float_0 %float_0
+         %59 = OpConstantComposite %v3float %float_0 %float_0 %float_1
+         %60 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+       %void = OpTypeVoid
+         %61 = OpTypeFunction %void
+     %uint_2 = OpConstant %uint 2
+%_arr_v3float_uint_2 = OpTypeArray %v3float %uint_2
+%_ptr_Function__arr_v3float_uint_2 = OpTypePointer Function %_arr_v3float_uint_2
+         %70 = OpConstantNull %_arr_v3float_uint_2
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %74 = OpConstantNull %bool
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+      %int_4 = OpConstant %int 4
+     %v3bool = OpTypeVector %bool 3
+        %124 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %125 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+        %126 = OpTypeFunction %void %main_out
+      %func_ = OpFunction %v3float None %8
+         %11 = OpLabel
+          %v = OpVariable %_ptr_Function_v2float Function %15
+          %i = OpVariable %_ptr_Function_int Function %19
+          %k = OpVariable %_ptr_Function_int Function %19
+               OpStore %v %22
+               OpStore %i %int_0
+               OpStore %k %int_0
+               OpBranch %24
+         %24 = OpLabel
+               OpLoopMerge %25 %26 None
+               OpBranch %27
+         %27 = OpLabel
+         %28 = OpLoad %int %k
+         %30 = OpSLessThan %bool %28 %int_2
+               OpSelectionMerge %32 None
+               OpBranchConditional %30 %33 %34
+         %33 = OpLabel
+               OpBranch %32
+         %34 = OpLabel
+               OpBranch %25
+         %32 = OpLabel
+         %38 = OpAccessChain %_ptr_Function_float %v %uint_1
+         %39 = OpLoad %float %38
+         %40 = OpFAdd %float %39 %float_1
+         %42 = OpFOrdGreaterThan %bool %40 %float_4
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %43
+         %44 = OpLabel
+               OpBranch %25
+         %43 = OpLabel
+         %45 = OpAccessChain %_ptr_Function_float %v %uint_1
+               OpStore %45 %float_1
+         %46 = OpLoad %int %i
+         %48 = OpIAdd %int %46 %int_1
+               OpStore %i %48
+               OpBranch %26
+         %26 = OpLabel
+         %49 = OpLoad %int %k
+         %50 = OpIAdd %int %49 %int_1
+               OpStore %k %50
+               OpBranch %24
+         %25 = OpLabel
+         %51 = OpLoad %int %i
+         %53 = OpSLessThan %bool %51 %int_10
+               OpSelectionMerge %54 None
+               OpBranchConditional %53 %55 %56
+         %55 = OpLabel
+               OpReturnValue %58
+         %56 = OpLabel
+               OpReturnValue %59
+         %54 = OpLabel
+               OpReturnValue %60
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %61
+         %64 = OpLabel
+          %j = OpVariable %_ptr_Function_int Function %19
+       %data = OpVariable %_ptr_Function__arr_v3float_uint_2 Function %70
+        %j_1 = OpVariable %_ptr_Function_int Function %19
+       %x_80 = OpVariable %_ptr_Function_bool Function %74
+   %x_81_phi = OpVariable %_ptr_Function_bool Function %74
+               OpStore %j %int_0
+               OpBranch %76
+         %76 = OpLabel
+               OpLoopMerge %77 %78 None
+               OpBranch %79
+         %79 = OpLabel
+         %80 = OpLoad %int %j
+         %81 = OpSLessThan %bool %80 %int_1
+               OpSelectionMerge %82 None
+               OpBranchConditional %81 %83 %84
+         %83 = OpLabel
+               OpBranch %82
+         %84 = OpLabel
+               OpBranch %77
+         %82 = OpLabel
+         %85 = OpLoad %int %j
+         %86 = OpFunctionCall %v3float %func_
+         %88 = OpAccessChain %_ptr_Function_v3float %data %85
+               OpStore %88 %86
+               OpBranch %78
+         %78 = OpLabel
+         %89 = OpLoad %int %j
+         %90 = OpIAdd %int %89 %int_1
+               OpStore %j %90
+               OpBranch %76
+         %77 = OpLabel
+               OpStore %j_1 %int_0
+               OpBranch %91
+         %91 = OpLabel
+               OpLoopMerge %92 %93 None
+               OpBranch %94
+         %94 = OpLabel
+         %95 = OpLoad %int %j_1
+         %96 = OpSLessThan %bool %95 %int_1
+               OpSelectionMerge %97 None
+               OpBranchConditional %96 %98 %99
+         %98 = OpLabel
+               OpBranch %97
+         %99 = OpLabel
+               OpBranch %92
+         %97 = OpLabel
+        %100 = OpLoad %int %j_1
+        %101 = OpFunctionCall %v3float %func_
+        %103 = OpIMul %int %int_4 %100
+        %104 = OpIAdd %int %103 %int_1
+        %105 = OpAccessChain %_ptr_Function_v3float %data %104
+               OpStore %105 %101
+               OpBranch %93
+         %93 = OpLabel
+        %106 = OpLoad %int %j_1
+        %107 = OpIAdd %int %106 %int_1
+               OpStore %j_1 %107
+               OpBranch %91
+         %92 = OpLabel
+        %108 = OpAccessChain %_ptr_Function_v3float %data %int_0
+        %109 = OpLoad %v3float %108
+        %111 = OpFOrdEqual %v3bool %109 %58
+        %110 = OpAll %bool %111
+               OpStore %x_81_phi %110
+               OpSelectionMerge %113 None
+               OpBranchConditional %110 %114 %113
+        %114 = OpLabel
+        %115 = OpAccessChain %_ptr_Function_v3float %data %int_1
+        %116 = OpLoad %v3float %115
+        %118 = OpFOrdEqual %v3bool %116 %58
+        %117 = OpAll %bool %118
+               OpStore %x_80 %117
+        %119 = OpLoad %bool %x_80
+               OpStore %x_81_phi %119
+               OpBranch %113
+        %113 = OpLabel
+        %120 = OpLoad %bool %x_81_phi
+               OpSelectionMerge %121 None
+               OpBranchConditional %120 %122 %123
+        %122 = OpLabel
+               OpStore %x_GLF_color %124
+               OpBranch %121
+        %123 = OpLabel
+               OpStore %x_GLF_color %125
+               OpBranch %121
+        %121 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %126
+%tint_symbol = OpFunctionParameter %main_out
+        %130 = OpLabel
+        %131 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %131
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %61
+        %133 = OpLabel
+        %134 = OpFunctionCall %void %main_1
+        %136 = OpLoad %v4float %x_GLF_color
+        %137 = OpCompositeConstruct %main_out %136
+        %135 = OpFunctionCall %void %tint_symbol_2 %137
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-intervalmap-set-stop/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-intervalmap-set-stop/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..a0443e6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-intervalmap-set-stop/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,102 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> vec3<f32> {
+  var v : vec2<f32>;
+  var i : i32;
+  var k : i32;
+  v = vec2<f32>(1.0, 1.0);
+  i = 0;
+  k = 0;
+  loop {
+    let x_90 : i32 = k;
+    if ((x_90 < 2)) {
+    } else {
+      break;
+    }
+    let x_94 : f32 = v.y;
+    if (((x_94 + 1.0) > 4.0)) {
+      break;
+    }
+    v.y = 1.0;
+    let x_100 : i32 = i;
+    i = (x_100 + 1);
+
+    continuing {
+      let x_102 : i32 = k;
+      k = (x_102 + 1);
+    }
+  }
+  let x_104 : i32 = i;
+  if ((x_104 < 10)) {
+    return vec3<f32>(1.0, 0.0, 0.0);
+  } else {
+    return vec3<f32>(0.0, 0.0, 1.0);
+  }
+  return vec3<f32>(0.0, 0.0, 0.0);
+}
+
+fn main_1() {
+  var j : i32;
+  var data : array<vec3<f32>, 2>;
+  var j_1 : i32;
+  var x_80 : bool;
+  var x_81_phi : bool;
+  j = 0;
+  loop {
+    let x_49 : i32 = j;
+    if ((x_49 < 1)) {
+    } else {
+      break;
+    }
+    let x_52 : i32 = j;
+    let x_53 : vec3<f32> = func_();
+    data[x_52] = x_53;
+
+    continuing {
+      let x_55 : i32 = j;
+      j = (x_55 + 1);
+    }
+  }
+  j_1 = 0;
+  loop {
+    let x_61 : i32 = j_1;
+    if ((x_61 < 1)) {
+    } else {
+      break;
+    }
+    let x_64 : i32 = j_1;
+    let x_67 : vec3<f32> = func_();
+    data[((4 * x_64) + 1)] = x_67;
+
+    continuing {
+      let x_69 : i32 = j_1;
+      j_1 = (x_69 + 1);
+    }
+  }
+  let x_72 : vec3<f32> = data[0];
+  let x_74 : bool = all((x_72 == vec3<f32>(1.0, 0.0, 0.0)));
+  x_81_phi = x_74;
+  if (x_74) {
+    let x_78 : vec3<f32> = data[1];
+    x_80 = all((x_78 == vec3<f32>(1.0, 0.0, 0.0)));
+    x_81_phi = x_80;
+  }
+  let x_81 : bool = x_81_phi;
+  if (x_81) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-intervalmap-set-stop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-intervalmap-set-stop/0-opt.wgsl
new file mode 100644
index 0000000..a0443e6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-intervalmap-set-stop/0-opt.wgsl
@@ -0,0 +1,102 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> vec3<f32> {
+  var v : vec2<f32>;
+  var i : i32;
+  var k : i32;
+  v = vec2<f32>(1.0, 1.0);
+  i = 0;
+  k = 0;
+  loop {
+    let x_90 : i32 = k;
+    if ((x_90 < 2)) {
+    } else {
+      break;
+    }
+    let x_94 : f32 = v.y;
+    if (((x_94 + 1.0) > 4.0)) {
+      break;
+    }
+    v.y = 1.0;
+    let x_100 : i32 = i;
+    i = (x_100 + 1);
+
+    continuing {
+      let x_102 : i32 = k;
+      k = (x_102 + 1);
+    }
+  }
+  let x_104 : i32 = i;
+  if ((x_104 < 10)) {
+    return vec3<f32>(1.0, 0.0, 0.0);
+  } else {
+    return vec3<f32>(0.0, 0.0, 1.0);
+  }
+  return vec3<f32>(0.0, 0.0, 0.0);
+}
+
+fn main_1() {
+  var j : i32;
+  var data : array<vec3<f32>, 2>;
+  var j_1 : i32;
+  var x_80 : bool;
+  var x_81_phi : bool;
+  j = 0;
+  loop {
+    let x_49 : i32 = j;
+    if ((x_49 < 1)) {
+    } else {
+      break;
+    }
+    let x_52 : i32 = j;
+    let x_53 : vec3<f32> = func_();
+    data[x_52] = x_53;
+
+    continuing {
+      let x_55 : i32 = j;
+      j = (x_55 + 1);
+    }
+  }
+  j_1 = 0;
+  loop {
+    let x_61 : i32 = j_1;
+    if ((x_61 < 1)) {
+    } else {
+      break;
+    }
+    let x_64 : i32 = j_1;
+    let x_67 : vec3<f32> = func_();
+    data[((4 * x_64) + 1)] = x_67;
+
+    continuing {
+      let x_69 : i32 = j_1;
+      j_1 = (x_69 + 1);
+    }
+  }
+  let x_72 : vec3<f32> = data[0];
+  let x_74 : bool = all((x_72 == vec3<f32>(1.0, 0.0, 0.0)));
+  x_81_phi = x_74;
+  if (x_74) {
+    let x_78 : vec3<f32> = data[1];
+    x_80 = all((x_78 == vec3<f32>(1.0, 0.0, 0.0)));
+    x_81_phi = x_80;
+  }
+  let x_81 : bool = x_81_phi;
+  if (x_81) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-intervalmap-set-stop/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-intervalmap-set-stop/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..bbf845a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-intervalmap-set-stop/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,78 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float3 func_() {
+  float2 v = float2(0.0f, 0.0f);
+  int i = 0;
+  int k = 0;
+  v = float2(1.0f, 1.0f);
+  i = 0;
+  k = 0;
+  {
+    for(; (k < 2); k = (k + 1)) {
+      const float x_94 = v.y;
+      if (((x_94 + 1.0f) > 4.0f)) {
+        break;
+      }
+      v.y = 1.0f;
+      i = (i + 1);
+    }
+  }
+  if ((i < 10)) {
+    return float3(1.0f, 0.0f, 0.0f);
+  } else {
+    return float3(0.0f, 0.0f, 1.0f);
+  }
+  return float3(0.0f, 0.0f, 0.0f);
+}
+
+void main_1() {
+  int j = 0;
+  float3 data[2] = (float3[2])0;
+  int j_1 = 0;
+  bool x_80 = false;
+  bool x_81_phi = false;
+  j = 0;
+  {
+    for(; (j < 1); j = (j + 1)) {
+      const int x_52 = j;
+      const float3 x_53 = func_();
+      data[x_52] = x_53;
+    }
+  }
+  j_1 = 0;
+  {
+    for(; (j_1 < 1); j_1 = (j_1 + 1)) {
+      const int x_64 = j_1;
+      const float3 x_67 = func_();
+      data[((4 * x_64) + 1)] = x_67;
+    }
+  }
+  const float3 x_72 = data[0];
+  const bool x_74 = all((x_72 == float3(1.0f, 0.0f, 0.0f)));
+  x_81_phi = x_74;
+  if (x_74) {
+    const float3 x_78 = data[1];
+    x_80 = all((x_78 == float3(1.0f, 0.0f, 0.0f)));
+    x_81_phi = x_80;
+  }
+  if (x_81_phi) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-intervalmap-set-stop/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-intervalmap-set-stop/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..06c1659
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-intervalmap-set-stop/0-opt.wgsl.expected.msl
@@ -0,0 +1,108 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  float3 arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float3 func_() {
+  float2 v = 0.0f;
+  int i = 0;
+  int k = 0;
+  v = float2(1.0f, 1.0f);
+  i = 0;
+  k = 0;
+  while (true) {
+    int const x_90 = k;
+    if ((x_90 < 2)) {
+    } else {
+      break;
+    }
+    float const x_94 = v.y;
+    if (((x_94 + 1.0f) > 4.0f)) {
+      break;
+    }
+    v.y = 1.0f;
+    int const x_100 = i;
+    i = (x_100 + 1);
+    {
+      int const x_102 = k;
+      k = (x_102 + 1);
+    }
+  }
+  int const x_104 = i;
+  if ((x_104 < 10)) {
+    return float3(1.0f, 0.0f, 0.0f);
+  } else {
+    return float3(0.0f, 0.0f, 1.0f);
+  }
+  return float3(0.0f, 0.0f, 0.0f);
+}
+
+void main_1(thread float4* const tint_symbol_4) {
+  int j = 0;
+  tint_array_wrapper data = {};
+  int j_1 = 0;
+  bool x_80 = false;
+  bool x_81_phi = false;
+  j = 0;
+  while (true) {
+    int const x_49 = j;
+    if ((x_49 < 1)) {
+    } else {
+      break;
+    }
+    int const x_52 = j;
+    float3 const x_53 = func_();
+    data.arr[x_52] = x_53;
+    {
+      int const x_55 = j;
+      j = (x_55 + 1);
+    }
+  }
+  j_1 = 0;
+  while (true) {
+    int const x_61 = j_1;
+    if ((x_61 < 1)) {
+    } else {
+      break;
+    }
+    int const x_64 = j_1;
+    float3 const x_67 = func_();
+    data.arr[((4 * x_64) + 1)] = x_67;
+    {
+      int const x_69 = j_1;
+      j_1 = (x_69 + 1);
+    }
+  }
+  float3 const x_72 = data.arr[0];
+  bool const x_74 = all((x_72 == float3(1.0f, 0.0f, 0.0f)));
+  x_81_phi = x_74;
+  if (x_74) {
+    float3 const x_78 = data.arr[1];
+    x_80 = all((x_78 == float3(1.0f, 0.0f, 0.0f)));
+    x_81_phi = x_80;
+  }
+  bool const x_81 = x_81_phi;
+  if (x_81) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-intervalmap-set-stop/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-intervalmap-set-stop/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..d944525
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-intervalmap-set-stop/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,233 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 138
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_ "func_"
+               OpName %v "v"
+               OpName %i "i"
+               OpName %k "k"
+               OpName %main_1 "main_1"
+               OpName %j "j"
+               OpName %data "data"
+               OpName %j_1 "j_1"
+               OpName %x_80 "x_80"
+               OpName %x_81_phi "x_81_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_v3float_uint_2 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+    %v3float = OpTypeVector %float 3
+          %8 = OpTypeFunction %v3float
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %15 = OpConstantNull %v2float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %19 = OpConstantNull %int
+    %float_1 = OpConstant %float 1
+         %22 = OpConstantComposite %v2float %float_1 %float_1
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_4 = OpConstant %float 4
+      %int_1 = OpConstant %int 1
+     %int_10 = OpConstant %int 10
+    %float_0 = OpConstant %float 0
+         %58 = OpConstantComposite %v3float %float_1 %float_0 %float_0
+         %59 = OpConstantComposite %v3float %float_0 %float_0 %float_1
+         %60 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+       %void = OpTypeVoid
+         %61 = OpTypeFunction %void
+     %uint_2 = OpConstant %uint 2
+%_arr_v3float_uint_2 = OpTypeArray %v3float %uint_2
+%_ptr_Function__arr_v3float_uint_2 = OpTypePointer Function %_arr_v3float_uint_2
+         %70 = OpConstantNull %_arr_v3float_uint_2
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %74 = OpConstantNull %bool
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+      %int_4 = OpConstant %int 4
+     %v3bool = OpTypeVector %bool 3
+        %124 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %125 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+        %126 = OpTypeFunction %void %main_out
+      %func_ = OpFunction %v3float None %8
+         %11 = OpLabel
+          %v = OpVariable %_ptr_Function_v2float Function %15
+          %i = OpVariable %_ptr_Function_int Function %19
+          %k = OpVariable %_ptr_Function_int Function %19
+               OpStore %v %22
+               OpStore %i %int_0
+               OpStore %k %int_0
+               OpBranch %24
+         %24 = OpLabel
+               OpLoopMerge %25 %26 None
+               OpBranch %27
+         %27 = OpLabel
+         %28 = OpLoad %int %k
+         %30 = OpSLessThan %bool %28 %int_2
+               OpSelectionMerge %32 None
+               OpBranchConditional %30 %33 %34
+         %33 = OpLabel
+               OpBranch %32
+         %34 = OpLabel
+               OpBranch %25
+         %32 = OpLabel
+         %38 = OpAccessChain %_ptr_Function_float %v %uint_1
+         %39 = OpLoad %float %38
+         %40 = OpFAdd %float %39 %float_1
+         %42 = OpFOrdGreaterThan %bool %40 %float_4
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %43
+         %44 = OpLabel
+               OpBranch %25
+         %43 = OpLabel
+         %45 = OpAccessChain %_ptr_Function_float %v %uint_1
+               OpStore %45 %float_1
+         %46 = OpLoad %int %i
+         %48 = OpIAdd %int %46 %int_1
+               OpStore %i %48
+               OpBranch %26
+         %26 = OpLabel
+         %49 = OpLoad %int %k
+         %50 = OpIAdd %int %49 %int_1
+               OpStore %k %50
+               OpBranch %24
+         %25 = OpLabel
+         %51 = OpLoad %int %i
+         %53 = OpSLessThan %bool %51 %int_10
+               OpSelectionMerge %54 None
+               OpBranchConditional %53 %55 %56
+         %55 = OpLabel
+               OpReturnValue %58
+         %56 = OpLabel
+               OpReturnValue %59
+         %54 = OpLabel
+               OpReturnValue %60
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %61
+         %64 = OpLabel
+          %j = OpVariable %_ptr_Function_int Function %19
+       %data = OpVariable %_ptr_Function__arr_v3float_uint_2 Function %70
+        %j_1 = OpVariable %_ptr_Function_int Function %19
+       %x_80 = OpVariable %_ptr_Function_bool Function %74
+   %x_81_phi = OpVariable %_ptr_Function_bool Function %74
+               OpStore %j %int_0
+               OpBranch %76
+         %76 = OpLabel
+               OpLoopMerge %77 %78 None
+               OpBranch %79
+         %79 = OpLabel
+         %80 = OpLoad %int %j
+         %81 = OpSLessThan %bool %80 %int_1
+               OpSelectionMerge %82 None
+               OpBranchConditional %81 %83 %84
+         %83 = OpLabel
+               OpBranch %82
+         %84 = OpLabel
+               OpBranch %77
+         %82 = OpLabel
+         %85 = OpLoad %int %j
+         %86 = OpFunctionCall %v3float %func_
+         %88 = OpAccessChain %_ptr_Function_v3float %data %85
+               OpStore %88 %86
+               OpBranch %78
+         %78 = OpLabel
+         %89 = OpLoad %int %j
+         %90 = OpIAdd %int %89 %int_1
+               OpStore %j %90
+               OpBranch %76
+         %77 = OpLabel
+               OpStore %j_1 %int_0
+               OpBranch %91
+         %91 = OpLabel
+               OpLoopMerge %92 %93 None
+               OpBranch %94
+         %94 = OpLabel
+         %95 = OpLoad %int %j_1
+         %96 = OpSLessThan %bool %95 %int_1
+               OpSelectionMerge %97 None
+               OpBranchConditional %96 %98 %99
+         %98 = OpLabel
+               OpBranch %97
+         %99 = OpLabel
+               OpBranch %92
+         %97 = OpLabel
+        %100 = OpLoad %int %j_1
+        %101 = OpFunctionCall %v3float %func_
+        %103 = OpIMul %int %int_4 %100
+        %104 = OpIAdd %int %103 %int_1
+        %105 = OpAccessChain %_ptr_Function_v3float %data %104
+               OpStore %105 %101
+               OpBranch %93
+         %93 = OpLabel
+        %106 = OpLoad %int %j_1
+        %107 = OpIAdd %int %106 %int_1
+               OpStore %j_1 %107
+               OpBranch %91
+         %92 = OpLabel
+        %108 = OpAccessChain %_ptr_Function_v3float %data %int_0
+        %109 = OpLoad %v3float %108
+        %111 = OpFOrdEqual %v3bool %109 %58
+        %110 = OpAll %bool %111
+               OpStore %x_81_phi %110
+               OpSelectionMerge %113 None
+               OpBranchConditional %110 %114 %113
+        %114 = OpLabel
+        %115 = OpAccessChain %_ptr_Function_v3float %data %int_1
+        %116 = OpLoad %v3float %115
+        %118 = OpFOrdEqual %v3bool %116 %58
+        %117 = OpAll %bool %118
+               OpStore %x_80 %117
+        %119 = OpLoad %bool %x_80
+               OpStore %x_81_phi %119
+               OpBranch %113
+        %113 = OpLabel
+        %120 = OpLoad %bool %x_81_phi
+               OpSelectionMerge %121 None
+               OpBranchConditional %120 %122 %123
+        %122 = OpLabel
+               OpStore %x_GLF_color %124
+               OpBranch %121
+        %123 = OpLabel
+               OpStore %x_GLF_color %125
+               OpBranch %121
+        %121 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %126
+%tint_symbol = OpFunctionParameter %main_out
+        %130 = OpLabel
+        %131 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %131
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %61
+        %133 = OpLabel
+        %134 = OpFunctionCall %void %main_1
+        %136 = OpLoad %v4float %x_GLF_color
+        %137 = OpCompositeConstruct %main_out %136
+        %135 = OpFunctionCall %void %tint_symbol_2 %137
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-intervalmap-set-stop/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-intervalmap-set-stop/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..a0443e6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-intervalmap-set-stop/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,102 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> vec3<f32> {
+  var v : vec2<f32>;
+  var i : i32;
+  var k : i32;
+  v = vec2<f32>(1.0, 1.0);
+  i = 0;
+  k = 0;
+  loop {
+    let x_90 : i32 = k;
+    if ((x_90 < 2)) {
+    } else {
+      break;
+    }
+    let x_94 : f32 = v.y;
+    if (((x_94 + 1.0) > 4.0)) {
+      break;
+    }
+    v.y = 1.0;
+    let x_100 : i32 = i;
+    i = (x_100 + 1);
+
+    continuing {
+      let x_102 : i32 = k;
+      k = (x_102 + 1);
+    }
+  }
+  let x_104 : i32 = i;
+  if ((x_104 < 10)) {
+    return vec3<f32>(1.0, 0.0, 0.0);
+  } else {
+    return vec3<f32>(0.0, 0.0, 1.0);
+  }
+  return vec3<f32>(0.0, 0.0, 0.0);
+}
+
+fn main_1() {
+  var j : i32;
+  var data : array<vec3<f32>, 2>;
+  var j_1 : i32;
+  var x_80 : bool;
+  var x_81_phi : bool;
+  j = 0;
+  loop {
+    let x_49 : i32 = j;
+    if ((x_49 < 1)) {
+    } else {
+      break;
+    }
+    let x_52 : i32 = j;
+    let x_53 : vec3<f32> = func_();
+    data[x_52] = x_53;
+
+    continuing {
+      let x_55 : i32 = j;
+      j = (x_55 + 1);
+    }
+  }
+  j_1 = 0;
+  loop {
+    let x_61 : i32 = j_1;
+    if ((x_61 < 1)) {
+    } else {
+      break;
+    }
+    let x_64 : i32 = j_1;
+    let x_67 : vec3<f32> = func_();
+    data[((4 * x_64) + 1)] = x_67;
+
+    continuing {
+      let x_69 : i32 = j_1;
+      j_1 = (x_69 + 1);
+    }
+  }
+  let x_72 : vec3<f32> = data[0];
+  let x_74 : bool = all((x_72 == vec3<f32>(1.0, 0.0, 0.0)));
+  x_81_phi = x_74;
+  if (x_74) {
+    let x_78 : vec3<f32> = data[1];
+    x_80 = all((x_78 == vec3<f32>(1.0, 0.0, 0.0)));
+    x_81_phi = x_80;
+  }
+  let x_81 : bool = x_81_phi;
+  if (x_81) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.spvasm
new file mode 100644
index 0000000..da27419
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.spvasm
@@ -0,0 +1,96 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %v1 "v1"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_float = OpTypePointer Function %float
+   %int_n256 = OpConstant %int -256
+%mat2v2float = OpTypeMatrix %v2float 2
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+      %int_1 = OpConstant %int 1
+       %main = OpFunction %void None %12
+         %33 = OpLabel
+         %v1 = OpVariable %_ptr_Function_v2float Function
+         %34 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %35 = OpLoad %float %34
+         %36 = OpCompositeConstruct %v2float %35 %35
+               OpStore %v1 %36
+         %37 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %38 = OpLoad %int %37
+         %39 = OpAccessChain %_ptr_Function_float %v1 %uint_1
+         %40 = OpLoad %float %39
+         %41 = OpExtInst %float %1 Ldexp %40 %int_n256
+         %42 = OpAccessChain %_ptr_Function_float %v1 %38
+               OpStore %42 %41
+         %43 = OpLoad %v2float %v1
+         %44 = OpCompositeConstruct %v2float %35 %float_0
+         %45 = OpCompositeConstruct %v2float %float_0 %35
+         %46 = OpCompositeConstruct %mat2v2float %44 %45
+         %47 = OpVectorTimesMatrix %v2float %43 %46
+         %48 = OpCompositeExtract %float %47 0
+         %49 = OpFOrdEqual %bool %48 %35
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %52
+         %51 = OpLabel
+         %53 = OpConvertSToF %float %38
+         %54 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %55 = OpLoad %int %54
+         %56 = OpConvertSToF %float %55
+         %57 = OpCompositeConstruct %v4float %53 %56 %56 %53
+               OpStore %_GLF_color %57
+               OpBranch %50
+         %52 = OpLabel
+         %58 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %59 = OpLoad %int %58
+         %60 = OpConvertSToF %float %59
+         %61 = OpCompositeConstruct %v4float %60 %60 %60 %60
+               OpStore %_GLF_color %61
+               OpBranch %50
+         %50 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..1ce3a68
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.spvasm.expected.hlsl
@@ -0,0 +1,47 @@
+void set_float2(inout float2 vec, int idx, float val) {
+  vec = (idx.xx == int2(0, 1)) ? val.xx : vec;
+}
+
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2 v1 = float2(0.0f, 0.0f);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_35 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  v1 = float2(x_35, x_35);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_38 = asint(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const float x_40 = v1.y;
+  set_float2(v1, x_38, ldexp(x_40, -256));
+  if ((mul(float2x2(float2(x_35, 0.0f), float2(0.0f, x_35)), v1).x == x_35)) {
+    const float x_53 = float(x_38);
+    const int x_55 = asint(x_8[1].x);
+    const float x_56 = float(x_55);
+    x_GLF_color = float4(x_53, x_56, x_56, x_53);
+  } else {
+    const int x_59 = asint(x_8[1].x);
+    const float x_60 = float(x_59);
+    x_GLF_color = float4(x_60, x_60, x_60, x_60);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.spvasm.expected.msl
new file mode 100644
index 0000000..4b271a5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.spvasm.expected.msl
@@ -0,0 +1,59 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_8, thread float4* const tint_symbol_4) {
+  float2 v1 = 0.0f;
+  float const x_35 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  v1 = float2(x_35, x_35);
+  int const x_38 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  float const x_40 = v1.y;
+  v1[x_38] = ldexp(x_40, -256);
+  float2 const x_43 = v1;
+  if ((((x_43 * float2x2(float2(x_35, 0.0f), float2(0.0f, x_35)))).x == x_35)) {
+    float const x_53 = float(x_38);
+    int const x_55 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    float const x_56 = float(x_55);
+    *(tint_symbol_4) = float4(x_53, x_56, x_56, x_53);
+  } else {
+    int const x_59 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    float const x_60 = float(x_59);
+    *(tint_symbol_4) = float4(x_60, x_60, x_60, x_60);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_8 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..779691c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.spvasm.expected.spvasm
@@ -0,0 +1,131 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 79
+; Schema: 0
+               OpCapability Shader
+         %42 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v1 "v1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %16
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %26 = OpConstantNull %v2float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_float = OpTypePointer Function %float
+   %int_n256 = OpConstant %int -256
+%mat2v2float = OpTypeMatrix %v2float 2
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %67 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+         %v1 = OpVariable %_ptr_Function_v2float Function %26
+         %30 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %31 = OpLoad %float %30
+         %32 = OpCompositeConstruct %v2float %31 %31
+               OpStore %v1 %32
+         %34 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %35 = OpLoad %int %34
+         %38 = OpAccessChain %_ptr_Function_float %v1 %uint_1
+         %39 = OpLoad %float %38
+         %40 = OpAccessChain %_ptr_Function_float %v1 %35
+         %41 = OpExtInst %float %42 Ldexp %39 %int_n256
+               OpStore %40 %41
+         %44 = OpLoad %v2float %v1
+         %47 = OpCompositeConstruct %v2float %31 %float_0
+         %48 = OpCompositeConstruct %v2float %float_0 %31
+         %49 = OpCompositeConstruct %mat2v2float %47 %48
+         %50 = OpVectorTimesMatrix %v2float %44 %49
+         %51 = OpCompositeExtract %float %50 0
+         %52 = OpFOrdEqual %bool %51 %31
+               OpSelectionMerge %54 None
+               OpBranchConditional %52 %55 %56
+         %55 = OpLabel
+         %57 = OpConvertSToF %float %35
+         %59 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %60 = OpLoad %int %59
+         %61 = OpConvertSToF %float %60
+         %62 = OpCompositeConstruct %v4float %57 %61 %61 %57
+               OpStore %x_GLF_color %62
+               OpBranch %54
+         %56 = OpLabel
+         %63 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %64 = OpLoad %int %63
+         %65 = OpConvertSToF %float %64
+         %66 = OpCompositeConstruct %v4float %65 %65 %65 %65
+               OpStore %x_GLF_color %66
+               OpBranch %54
+         %54 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %67
+%tint_symbol = OpFunctionParameter %main_out
+         %71 = OpLabel
+         %72 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %72
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+         %74 = OpLabel
+         %75 = OpFunctionCall %void %main_1
+         %77 = OpLoad %v4float %x_GLF_color
+         %78 = OpCompositeConstruct %main_out %77
+         %76 = OpFunctionCall %void %tint_symbol_2 %78
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..83090a7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.spvasm.expected.wgsl
@@ -0,0 +1,51 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v1 : vec2<f32>;
+  let x_35 : f32 = x_6.x_GLF_uniform_float_values[0];
+  v1 = vec2<f32>(x_35, x_35);
+  let x_38 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_40 : f32 = v1.y;
+  v1[x_38] = ldexp(x_40, -256);
+  let x_43 : vec2<f32> = v1;
+  if ((((x_43 * mat2x2<f32>(vec2<f32>(x_35, 0.0), vec2<f32>(0.0, x_35)))).x == x_35)) {
+    let x_53 : f32 = f32(x_38);
+    let x_55 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_56 : f32 = f32(x_55);
+    x_GLF_color = vec4<f32>(x_53, x_56, x_56, x_53);
+  } else {
+    let x_59 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_60 : f32 = f32(x_59);
+    x_GLF_color = vec4<f32>(x_60, x_60, x_60, x_60);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.wgsl
new file mode 100644
index 0000000..83090a7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.wgsl
@@ -0,0 +1,51 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v1 : vec2<f32>;
+  let x_35 : f32 = x_6.x_GLF_uniform_float_values[0];
+  v1 = vec2<f32>(x_35, x_35);
+  let x_38 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_40 : f32 = v1.y;
+  v1[x_38] = ldexp(x_40, -256);
+  let x_43 : vec2<f32> = v1;
+  if ((((x_43 * mat2x2<f32>(vec2<f32>(x_35, 0.0), vec2<f32>(0.0, x_35)))).x == x_35)) {
+    let x_53 : f32 = f32(x_38);
+    let x_55 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_56 : f32 = f32(x_55);
+    x_GLF_color = vec4<f32>(x_53, x_56, x_56, x_53);
+  } else {
+    let x_59 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_60 : f32 = f32(x_59);
+    x_GLF_color = vec4<f32>(x_60, x_60, x_60, x_60);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..1ce3a68
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.wgsl.expected.hlsl
@@ -0,0 +1,47 @@
+void set_float2(inout float2 vec, int idx, float val) {
+  vec = (idx.xx == int2(0, 1)) ? val.xx : vec;
+}
+
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2 v1 = float2(0.0f, 0.0f);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_35 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  v1 = float2(x_35, x_35);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_38 = asint(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const float x_40 = v1.y;
+  set_float2(v1, x_38, ldexp(x_40, -256));
+  if ((mul(float2x2(float2(x_35, 0.0f), float2(0.0f, x_35)), v1).x == x_35)) {
+    const float x_53 = float(x_38);
+    const int x_55 = asint(x_8[1].x);
+    const float x_56 = float(x_55);
+    x_GLF_color = float4(x_53, x_56, x_56, x_53);
+  } else {
+    const int x_59 = asint(x_8[1].x);
+    const float x_60 = float(x_59);
+    x_GLF_color = float4(x_60, x_60, x_60, x_60);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.wgsl.expected.msl
new file mode 100644
index 0000000..4b271a5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.wgsl.expected.msl
@@ -0,0 +1,59 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_8, thread float4* const tint_symbol_4) {
+  float2 v1 = 0.0f;
+  float const x_35 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  v1 = float2(x_35, x_35);
+  int const x_38 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  float const x_40 = v1.y;
+  v1[x_38] = ldexp(x_40, -256);
+  float2 const x_43 = v1;
+  if ((((x_43 * float2x2(float2(x_35, 0.0f), float2(0.0f, x_35)))).x == x_35)) {
+    float const x_53 = float(x_38);
+    int const x_55 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    float const x_56 = float(x_55);
+    *(tint_symbol_4) = float4(x_53, x_56, x_56, x_53);
+  } else {
+    int const x_59 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    float const x_60 = float(x_59);
+    *(tint_symbol_4) = float4(x_60, x_60, x_60, x_60);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_8 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..779691c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.wgsl.expected.spvasm
@@ -0,0 +1,131 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 79
+; Schema: 0
+               OpCapability Shader
+         %42 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v1 "v1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %16
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %26 = OpConstantNull %v2float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_float = OpTypePointer Function %float
+   %int_n256 = OpConstant %int -256
+%mat2v2float = OpTypeMatrix %v2float 2
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %67 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+         %v1 = OpVariable %_ptr_Function_v2float Function %26
+         %30 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %31 = OpLoad %float %30
+         %32 = OpCompositeConstruct %v2float %31 %31
+               OpStore %v1 %32
+         %34 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %35 = OpLoad %int %34
+         %38 = OpAccessChain %_ptr_Function_float %v1 %uint_1
+         %39 = OpLoad %float %38
+         %40 = OpAccessChain %_ptr_Function_float %v1 %35
+         %41 = OpExtInst %float %42 Ldexp %39 %int_n256
+               OpStore %40 %41
+         %44 = OpLoad %v2float %v1
+         %47 = OpCompositeConstruct %v2float %31 %float_0
+         %48 = OpCompositeConstruct %v2float %float_0 %31
+         %49 = OpCompositeConstruct %mat2v2float %47 %48
+         %50 = OpVectorTimesMatrix %v2float %44 %49
+         %51 = OpCompositeExtract %float %50 0
+         %52 = OpFOrdEqual %bool %51 %31
+               OpSelectionMerge %54 None
+               OpBranchConditional %52 %55 %56
+         %55 = OpLabel
+         %57 = OpConvertSToF %float %35
+         %59 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %60 = OpLoad %int %59
+         %61 = OpConvertSToF %float %60
+         %62 = OpCompositeConstruct %v4float %57 %61 %61 %57
+               OpStore %x_GLF_color %62
+               OpBranch %54
+         %56 = OpLabel
+         %63 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %64 = OpLoad %int %63
+         %65 = OpConvertSToF %float %64
+         %66 = OpCompositeConstruct %v4float %65 %65 %65 %65
+               OpStore %x_GLF_color %66
+               OpBranch %54
+         %54 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %67
+%tint_symbol = OpFunctionParameter %main_out
+         %71 = OpLabel
+         %72 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %72
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+         %74 = OpLabel
+         %75 = OpFunctionCall %void %main_1
+         %77 = OpLoad %v4float %x_GLF_color
+         %78 = OpCompositeConstruct %main_out %77
+         %76 = OpFunctionCall %void %tint_symbol_2 %78
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..83090a7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-ldexp-undefined-mat-vec-multiply/0.wgsl.expected.wgsl
@@ -0,0 +1,51 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v1 : vec2<f32>;
+  let x_35 : f32 = x_6.x_GLF_uniform_float_values[0];
+  v1 = vec2<f32>(x_35, x_35);
+  let x_38 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_40 : f32 = v1.y;
+  v1[x_38] = ldexp(x_40, -256);
+  let x_43 : vec2<f32> = v1;
+  if ((((x_43 * mat2x2<f32>(vec2<f32>(x_35, 0.0), vec2<f32>(0.0, x_35)))).x == x_35)) {
+    let x_53 : f32 = f32(x_38);
+    let x_55 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_56 : f32 = f32(x_55);
+    x_GLF_color = vec4<f32>(x_53, x_56, x_56, x_53);
+  } else {
+    let x_59 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_60 : f32 = f32(x_59);
+    x_GLF_color = vec4<f32>(x_60, x_60, x_60, x_60);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-left-shift-array-access/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-array-access/0-opt.spvasm
new file mode 100644
index 0000000..4e64705
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-array-access/0-opt.spvasm
@@ -0,0 +1,90 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %idx "idx"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %a "a"
+               OpName %indexable "indexable"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function__arr_int_uint_2 = OpTypePointer Function %_arr_int_uint_2
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %11
+         %25 = OpLabel
+        %idx = OpVariable %_ptr_Function_int Function
+          %a = OpVariable %_ptr_Function_int Function
+  %indexable = OpVariable %_ptr_Function__arr_int_uint_2 Function
+         %26 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %27 = OpLoad %int %26
+         %28 = OpShiftLeftLogical %int %int_1 %27
+               OpStore %idx %28
+         %29 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %30 = OpLoad %int %29
+         %31 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %32 = OpLoad %int %31
+         %33 = OpCompositeConstruct %_arr_int_uint_2 %30 %32
+         %34 = OpLoad %int %idx
+               OpStore %indexable %33
+         %35 = OpAccessChain %_ptr_Function_int %indexable %34
+         %36 = OpLoad %int %35
+               OpStore %a %36
+         %37 = OpLoad %int %a
+         %38 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %39 = OpLoad %int %38
+         %40 = OpIEqual %bool %37 %39
+               OpSelectionMerge %41 None
+               OpBranchConditional %40 %42 %43
+         %42 = OpLabel
+         %44 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %45 = OpLoad %int %44
+         %46 = OpConvertSToF %float %45
+         %47 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %48 = OpLoad %int %47
+         %49 = OpConvertSToF %float %48
+         %50 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %51 = OpLoad %int %50
+         %52 = OpConvertSToF %float %51
+         %53 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %54 = OpLoad %int %53
+         %55 = OpConvertSToF %float %54
+         %56 = OpCompositeConstruct %v4float %46 %49 %52 %55
+               OpStore %_GLF_color %56
+               OpBranch %41
+         %43 = OpLabel
+         %57 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %58 = OpLoad %int %57
+         %59 = OpConvertSToF %float %58
+         %60 = OpCompositeConstruct %v4float %59 %59 %59 %59
+               OpStore %_GLF_color %60
+               OpBranch %41
+         %41 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-left-shift-array-access/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-array-access/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..3169db6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-array-access/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,55 @@
+struct tint_padded_array_element {
+  int el;
+};
+
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int idx = 0;
+  int a = 0;
+  tint_padded_array_element indexable[2] = (tint_padded_array_element[2])0;
+  const int x_27 = asint(x_6[1].x);
+  idx = (1 << asuint(x_27));
+  const int x_30 = asint(x_6[1].x);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_32 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const int x_34 = idx;
+  const tint_padded_array_element tint_symbol_3[2] = {{x_30}, {x_32}};
+  indexable = tint_symbol_3;
+  const int x_36 = indexable[x_34].el;
+  a = x_36;
+  const int x_37 = a;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_39 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_37 == x_39)) {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_45 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_48 = asint(x_6[1].x);
+    const int x_51 = asint(x_6[1].x);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_54 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    x_GLF_color = float4(float(x_45), float(x_48), float(x_51), float(x_54));
+  } else {
+    const int x_58 = asint(x_6[1].x);
+    const float x_59 = float(x_58);
+    x_GLF_color = float4(x_59, x_59, x_59, x_59);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-left-shift-array-access/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-array-access/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..2ff0873
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-array-access/0-opt.spvasm.expected.msl
@@ -0,0 +1,57 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, thread float4* const tint_symbol_5) {
+  int idx = 0;
+  int a = 0;
+  tint_array_wrapper indexable = {};
+  int const x_27 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  idx = (1 << as_type<uint>(x_27));
+  int const x_30 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_32 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_34 = idx;
+  tint_array_wrapper const tint_symbol_3 = {.arr={{.el=x_30}, {.el=x_32}}};
+  indexable = tint_symbol_3;
+  int const x_36 = indexable.arr[x_34].el;
+  a = x_36;
+  int const x_37 = a;
+  int const x_39 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  if ((x_37 == x_39)) {
+    int const x_45 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_48 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_51 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_54 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_5) = float4(float(x_45), float(x_48), float(x_51), float(x_54));
+  } else {
+    int const x_58 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    float const x_59 = float(x_58);
+    *(tint_symbol_5) = float4(x_59, x_59, x_59, x_59);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_6, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-left-shift-array-access/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-array-access/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..46246e7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-array-access/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,125 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 79
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %idx "idx"
+               OpName %a "a"
+               OpName %indexable "indexable"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+%_ptr_Function__arr_int_uint_2 = OpTypePointer Function %_arr_int_uint_2
+         %25 = OpConstantNull %_arr_int_uint_2
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %v4float
+         %67 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+        %idx = OpVariable %_ptr_Function_int Function %21
+          %a = OpVariable %_ptr_Function_int Function %21
+  %indexable = OpVariable %_ptr_Function__arr_int_uint_2 Function %25
+         %29 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %30 = OpLoad %int %29
+         %31 = OpBitcast %uint %30
+         %32 = OpShiftLeftLogical %int %int_1 %31
+               OpStore %idx %32
+         %33 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %34 = OpLoad %int %33
+         %36 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %37 = OpLoad %int %36
+         %38 = OpLoad %int %idx
+         %39 = OpCompositeConstruct %_arr_int_uint_2 %34 %37
+               OpStore %indexable %39
+         %40 = OpAccessChain %_ptr_Function_int %indexable %38
+         %41 = OpLoad %int %40
+               OpStore %a %41
+         %42 = OpLoad %int %a
+         %43 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %44 = OpLoad %int %43
+         %45 = OpIEqual %bool %42 %44
+               OpSelectionMerge %47 None
+               OpBranchConditional %45 %48 %49
+         %48 = OpLabel
+         %50 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %51 = OpLoad %int %50
+         %52 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %53 = OpLoad %int %52
+         %54 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %55 = OpLoad %int %54
+         %56 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %57 = OpLoad %int %56
+         %58 = OpConvertSToF %float %51
+         %59 = OpConvertSToF %float %53
+         %60 = OpConvertSToF %float %55
+         %61 = OpConvertSToF %float %57
+         %62 = OpCompositeConstruct %v4float %58 %59 %60 %61
+               OpStore %x_GLF_color %62
+               OpBranch %47
+         %49 = OpLabel
+         %63 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %64 = OpLoad %int %63
+         %65 = OpConvertSToF %float %64
+         %66 = OpCompositeConstruct %v4float %65 %65 %65 %65
+               OpStore %x_GLF_color %66
+               OpBranch %47
+         %47 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %67
+%tint_symbol = OpFunctionParameter %main_out
+         %71 = OpLabel
+         %72 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %72
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %74 = OpLabel
+         %75 = OpFunctionCall %void %main_1
+         %77 = OpLoad %v4float %x_GLF_color
+         %78 = OpCompositeConstruct %main_out %77
+         %76 = OpFunctionCall %void %tint_symbol_2 %78
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-left-shift-array-access/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-array-access/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..a39da82
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-array-access/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,49 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var idx : i32;
+  var a : i32;
+  var indexable : Arr;
+  let x_27 : i32 = x_6.x_GLF_uniform_int_values[1];
+  idx = (1 << bitcast<u32>(x_27));
+  let x_30 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_32 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_34 : i32 = idx;
+  indexable = Arr(x_30, x_32);
+  let x_36 : i32 = indexable[x_34];
+  a = x_36;
+  let x_37 : i32 = a;
+  let x_39 : i32 = x_6.x_GLF_uniform_int_values[0];
+  if ((x_37 == x_39)) {
+    let x_45 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_48 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_51 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_54 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_45), f32(x_48), f32(x_51), f32(x_54));
+  } else {
+    let x_58 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_59 : f32 = f32(x_58);
+    x_GLF_color = vec4<f32>(x_59, x_59, x_59, x_59);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-left-shift-array-access/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-array-access/0-opt.wgsl
new file mode 100644
index 0000000..a39da82
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-array-access/0-opt.wgsl
@@ -0,0 +1,49 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var idx : i32;
+  var a : i32;
+  var indexable : Arr;
+  let x_27 : i32 = x_6.x_GLF_uniform_int_values[1];
+  idx = (1 << bitcast<u32>(x_27));
+  let x_30 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_32 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_34 : i32 = idx;
+  indexable = Arr(x_30, x_32);
+  let x_36 : i32 = indexable[x_34];
+  a = x_36;
+  let x_37 : i32 = a;
+  let x_39 : i32 = x_6.x_GLF_uniform_int_values[0];
+  if ((x_37 == x_39)) {
+    let x_45 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_48 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_51 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_54 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_45), f32(x_48), f32(x_51), f32(x_54));
+  } else {
+    let x_58 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_59 : f32 = f32(x_58);
+    x_GLF_color = vec4<f32>(x_59, x_59, x_59, x_59);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-left-shift-array-access/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-array-access/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..3169db6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-array-access/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,55 @@
+struct tint_padded_array_element {
+  int el;
+};
+
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int idx = 0;
+  int a = 0;
+  tint_padded_array_element indexable[2] = (tint_padded_array_element[2])0;
+  const int x_27 = asint(x_6[1].x);
+  idx = (1 << asuint(x_27));
+  const int x_30 = asint(x_6[1].x);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_32 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const int x_34 = idx;
+  const tint_padded_array_element tint_symbol_3[2] = {{x_30}, {x_32}};
+  indexable = tint_symbol_3;
+  const int x_36 = indexable[x_34].el;
+  a = x_36;
+  const int x_37 = a;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_39 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_37 == x_39)) {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_45 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_48 = asint(x_6[1].x);
+    const int x_51 = asint(x_6[1].x);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_54 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    x_GLF_color = float4(float(x_45), float(x_48), float(x_51), float(x_54));
+  } else {
+    const int x_58 = asint(x_6[1].x);
+    const float x_59 = float(x_58);
+    x_GLF_color = float4(x_59, x_59, x_59, x_59);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-left-shift-array-access/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-array-access/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..2ff0873
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-array-access/0-opt.wgsl.expected.msl
@@ -0,0 +1,57 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, thread float4* const tint_symbol_5) {
+  int idx = 0;
+  int a = 0;
+  tint_array_wrapper indexable = {};
+  int const x_27 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  idx = (1 << as_type<uint>(x_27));
+  int const x_30 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_32 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_34 = idx;
+  tint_array_wrapper const tint_symbol_3 = {.arr={{.el=x_30}, {.el=x_32}}};
+  indexable = tint_symbol_3;
+  int const x_36 = indexable.arr[x_34].el;
+  a = x_36;
+  int const x_37 = a;
+  int const x_39 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  if ((x_37 == x_39)) {
+    int const x_45 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_48 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_51 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_54 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_5) = float4(float(x_45), float(x_48), float(x_51), float(x_54));
+  } else {
+    int const x_58 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    float const x_59 = float(x_58);
+    *(tint_symbol_5) = float4(x_59, x_59, x_59, x_59);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_6, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-left-shift-array-access/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-array-access/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..46246e7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-array-access/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,125 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 79
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %idx "idx"
+               OpName %a "a"
+               OpName %indexable "indexable"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+%_ptr_Function__arr_int_uint_2 = OpTypePointer Function %_arr_int_uint_2
+         %25 = OpConstantNull %_arr_int_uint_2
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %v4float
+         %67 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+        %idx = OpVariable %_ptr_Function_int Function %21
+          %a = OpVariable %_ptr_Function_int Function %21
+  %indexable = OpVariable %_ptr_Function__arr_int_uint_2 Function %25
+         %29 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %30 = OpLoad %int %29
+         %31 = OpBitcast %uint %30
+         %32 = OpShiftLeftLogical %int %int_1 %31
+               OpStore %idx %32
+         %33 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %34 = OpLoad %int %33
+         %36 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %37 = OpLoad %int %36
+         %38 = OpLoad %int %idx
+         %39 = OpCompositeConstruct %_arr_int_uint_2 %34 %37
+               OpStore %indexable %39
+         %40 = OpAccessChain %_ptr_Function_int %indexable %38
+         %41 = OpLoad %int %40
+               OpStore %a %41
+         %42 = OpLoad %int %a
+         %43 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %44 = OpLoad %int %43
+         %45 = OpIEqual %bool %42 %44
+               OpSelectionMerge %47 None
+               OpBranchConditional %45 %48 %49
+         %48 = OpLabel
+         %50 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %51 = OpLoad %int %50
+         %52 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %53 = OpLoad %int %52
+         %54 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %55 = OpLoad %int %54
+         %56 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %57 = OpLoad %int %56
+         %58 = OpConvertSToF %float %51
+         %59 = OpConvertSToF %float %53
+         %60 = OpConvertSToF %float %55
+         %61 = OpConvertSToF %float %57
+         %62 = OpCompositeConstruct %v4float %58 %59 %60 %61
+               OpStore %x_GLF_color %62
+               OpBranch %47
+         %49 = OpLabel
+         %63 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %64 = OpLoad %int %63
+         %65 = OpConvertSToF %float %64
+         %66 = OpCompositeConstruct %v4float %65 %65 %65 %65
+               OpStore %x_GLF_color %66
+               OpBranch %47
+         %47 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %67
+%tint_symbol = OpFunctionParameter %main_out
+         %71 = OpLabel
+         %72 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %72
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %74 = OpLabel
+         %75 = OpFunctionCall %void %main_1
+         %77 = OpLoad %v4float %x_GLF_color
+         %78 = OpCompositeConstruct %main_out %77
+         %76 = OpFunctionCall %void %tint_symbol_2 %78
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-left-shift-array-access/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-array-access/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..a39da82
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-array-access/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,49 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var idx : i32;
+  var a : i32;
+  var indexable : Arr;
+  let x_27 : i32 = x_6.x_GLF_uniform_int_values[1];
+  idx = (1 << bitcast<u32>(x_27));
+  let x_30 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_32 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_34 : i32 = idx;
+  indexable = Arr(x_30, x_32);
+  let x_36 : i32 = indexable[x_34];
+  a = x_36;
+  let x_37 : i32 = a;
+  let x_39 : i32 = x_6.x_GLF_uniform_int_values[0];
+  if ((x_37 == x_39)) {
+    let x_45 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_48 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_51 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_54 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_45), f32(x_48), f32(x_51), f32(x_54));
+  } else {
+    let x_58 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_59 : f32 = f32(x_58);
+    x_GLF_color = vec4<f32>(x_59, x_59, x_59, x_59);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-left-shift-right-shift-compare/0.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-right-shift-compare/0.spvasm
new file mode 100644
index 0000000..95ad9ec
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-right-shift-compare/0.spvasm
@@ -0,0 +1,72 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+     %int_10 = OpConstant %int 10
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+       %main = OpFunction %void None %8
+         %22 = OpLabel
+         %23 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %24 = OpLoad %int %23
+         %25 = OpConvertSToF %float %24
+         %26 = OpCompositeConstruct %v4float %25 %25 %25 %25
+               OpStore %_GLF_color %26
+         %27 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %28 = OpLoad %int %27
+         %29 = OpShiftLeftLogical %int %28 %28
+         %30 = OpShiftRightArithmetic %int %29 %int_1
+               OpBranch %31
+         %31 = OpLabel
+         %32 = OpPhi %int %24 %22 %33 %34
+         %35 = OpSLessThan %bool %30 %int_10
+               OpLoopMerge %36 %34 None
+               OpBranchConditional %35 %37 %36
+         %37 = OpLabel
+         %33 = OpIAdd %int %32 %int_1
+         %38 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %39 = OpLoad %int %38
+         %40 = OpIEqual %bool %33 %39
+               OpSelectionMerge %41 None
+               OpBranchConditional %40 %42 %41
+         %42 = OpLabel
+         %43 = OpConvertSToF %float %28
+         %44 = OpCompositeConstruct %v4float %43 %25 %25 %43
+               OpStore %_GLF_color %44
+               OpBranch %36
+         %41 = OpLabel
+               OpBranch %34
+         %34 = OpLabel
+               OpBranch %31
+         %36 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-left-shift-right-shift-compare/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-right-shift-compare/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..9531ab8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-right-shift-compare/0.spvasm.expected.hlsl
@@ -0,0 +1,48 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[3];
+};
+
+void main_1() {
+  int x_32_phi = 0;
+  const int x_24 = asint(x_5[1].x);
+  const float x_25 = float(x_24);
+  x_GLF_color = float4(x_25, x_25, x_25, x_25);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_28 = asint(x_5[scalar_offset / 4][scalar_offset % 4]);
+  const int x_30 = ((x_28 << asuint(x_28)) >> asuint(1));
+  x_32_phi = x_24;
+  while (true) {
+    const int x_32 = x_32_phi;
+    if ((x_30 < 10)) {
+    } else {
+      break;
+    }
+    int x_33 = 0;
+    x_33 = (x_32 + 1);
+    const int x_39 = asint(x_5[2].x);
+    if ((x_33 == asint(x_39))) {
+      const float x_43 = float(x_28);
+      x_GLF_color = float4(x_43, x_25, x_25, x_43);
+      break;
+    }
+    {
+      x_32_phi = x_33;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-left-shift-right-shift-compare/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-right-shift-compare/0.spvasm.expected.msl
new file mode 100644
index 0000000..6500f1c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-right-shift-compare/0.spvasm.expected.msl
@@ -0,0 +1,57 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  int x_32_phi = 0;
+  int const x_24 = x_5.x_GLF_uniform_int_values.arr[1].el;
+  float const x_25 = float(x_24);
+  *(tint_symbol_4) = float4(x_25, x_25, x_25, x_25);
+  int const x_28 = x_5.x_GLF_uniform_int_values.arr[0].el;
+  int const x_30 = ((x_28 << as_type<uint>(x_28)) >> as_type<uint>(1));
+  x_32_phi = x_24;
+  while (true) {
+    int const x_32 = x_32_phi;
+    if ((x_30 < 10)) {
+    } else {
+      break;
+    }
+    int x_33 = 0;
+    x_33 = (x_32 + 1);
+    int const x_39 = x_5.x_GLF_uniform_int_values.arr[2].el;
+    if ((x_33 == as_type<int>(x_39))) {
+      float const x_43 = float(x_28);
+      *(tint_symbol_4) = float4(x_43, x_25, x_25, x_43);
+      break;
+    }
+    {
+      x_32_phi = x_33;
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-left-shift-right-shift-compare/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-right-shift-compare/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..4dab00b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-right-shift-compare/0.spvasm.expected.spvasm
@@ -0,0 +1,125 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 72
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_5 "x_5"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_32_phi "x_32_phi"
+               OpName %x_33 "x_33"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+     %int_10 = OpConstant %int 10
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+         %60 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+   %x_32_phi = OpVariable %_ptr_Function_int Function %21
+       %x_33 = OpVariable %_ptr_Function_int Function %21
+         %25 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %26 = OpLoad %int %25
+         %27 = OpConvertSToF %float %26
+         %28 = OpCompositeConstruct %v4float %27 %27 %27 %27
+               OpStore %x_GLF_color %28
+         %30 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %31 = OpLoad %int %30
+         %32 = OpBitcast %uint %31
+         %33 = OpShiftLeftLogical %int %31 %32
+         %34 = OpBitcast %uint %int_1
+         %35 = OpShiftRightArithmetic %int %33 %34
+               OpStore %x_32_phi %26
+               OpBranch %36
+         %36 = OpLabel
+               OpLoopMerge %37 %38 None
+               OpBranch %39
+         %39 = OpLabel
+         %40 = OpLoad %int %x_32_phi
+         %42 = OpSLessThan %bool %35 %int_10
+               OpSelectionMerge %44 None
+               OpBranchConditional %42 %45 %46
+         %45 = OpLabel
+               OpBranch %44
+         %46 = OpLabel
+               OpBranch %37
+         %44 = OpLabel
+         %48 = OpIAdd %int %40 %int_1
+               OpStore %x_33 %48
+         %50 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_2
+         %51 = OpLoad %int %50
+         %52 = OpLoad %int %x_33
+         %53 = OpCopyObject %int %51
+         %54 = OpIEqual %bool %52 %53
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %55
+         %56 = OpLabel
+         %57 = OpConvertSToF %float %31
+         %58 = OpCompositeConstruct %v4float %57 %27 %27 %57
+               OpStore %x_GLF_color %58
+               OpBranch %37
+         %55 = OpLabel
+               OpBranch %38
+         %38 = OpLabel
+         %59 = OpLoad %int %x_33
+               OpStore %x_32_phi %59
+               OpBranch %36
+         %37 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %60
+%tint_symbol = OpFunctionParameter %main_out
+         %64 = OpLabel
+         %65 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %65
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %67 = OpLabel
+         %68 = OpFunctionCall %void %main_1
+         %70 = OpLoad %v4float %x_GLF_color
+         %71 = OpCompositeConstruct %main_out %70
+         %69 = OpFunctionCall %void %tint_symbol_2 %71
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-left-shift-right-shift-compare/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-right-shift-compare/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..7ccdb81
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-right-shift-compare/0.spvasm.expected.wgsl
@@ -0,0 +1,51 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+fn main_1() {
+  var x_32_phi : i32;
+  let x_24 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_25 : f32 = f32(x_24);
+  x_GLF_color = vec4<f32>(x_25, x_25, x_25, x_25);
+  let x_28 : i32 = x_5.x_GLF_uniform_int_values[0];
+  let x_30 : i32 = ((x_28 << bitcast<u32>(x_28)) >> bitcast<u32>(1));
+  x_32_phi = x_24;
+  loop {
+    let x_32 : i32 = x_32_phi;
+    if ((x_30 < 10)) {
+    } else {
+      break;
+    }
+    var x_33 : i32;
+    x_33 = (x_32 + 1);
+    let x_39 : i32 = x_5.x_GLF_uniform_int_values[2];
+    if ((x_33 == bitcast<i32>(x_39))) {
+      let x_43 : f32 = f32(x_28);
+      x_GLF_color = vec4<f32>(x_43, x_25, x_25, x_43);
+      break;
+    }
+
+    continuing {
+      x_32_phi = x_33;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-left-shift-right-shift-compare/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-right-shift-compare/0.wgsl
new file mode 100644
index 0000000..7ccdb81
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-right-shift-compare/0.wgsl
@@ -0,0 +1,51 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+fn main_1() {
+  var x_32_phi : i32;
+  let x_24 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_25 : f32 = f32(x_24);
+  x_GLF_color = vec4<f32>(x_25, x_25, x_25, x_25);
+  let x_28 : i32 = x_5.x_GLF_uniform_int_values[0];
+  let x_30 : i32 = ((x_28 << bitcast<u32>(x_28)) >> bitcast<u32>(1));
+  x_32_phi = x_24;
+  loop {
+    let x_32 : i32 = x_32_phi;
+    if ((x_30 < 10)) {
+    } else {
+      break;
+    }
+    var x_33 : i32;
+    x_33 = (x_32 + 1);
+    let x_39 : i32 = x_5.x_GLF_uniform_int_values[2];
+    if ((x_33 == bitcast<i32>(x_39))) {
+      let x_43 : f32 = f32(x_28);
+      x_GLF_color = vec4<f32>(x_43, x_25, x_25, x_43);
+      break;
+    }
+
+    continuing {
+      x_32_phi = x_33;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-left-shift-right-shift-compare/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-right-shift-compare/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..9531ab8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-right-shift-compare/0.wgsl.expected.hlsl
@@ -0,0 +1,48 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[3];
+};
+
+void main_1() {
+  int x_32_phi = 0;
+  const int x_24 = asint(x_5[1].x);
+  const float x_25 = float(x_24);
+  x_GLF_color = float4(x_25, x_25, x_25, x_25);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_28 = asint(x_5[scalar_offset / 4][scalar_offset % 4]);
+  const int x_30 = ((x_28 << asuint(x_28)) >> asuint(1));
+  x_32_phi = x_24;
+  while (true) {
+    const int x_32 = x_32_phi;
+    if ((x_30 < 10)) {
+    } else {
+      break;
+    }
+    int x_33 = 0;
+    x_33 = (x_32 + 1);
+    const int x_39 = asint(x_5[2].x);
+    if ((x_33 == asint(x_39))) {
+      const float x_43 = float(x_28);
+      x_GLF_color = float4(x_43, x_25, x_25, x_43);
+      break;
+    }
+    {
+      x_32_phi = x_33;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-left-shift-right-shift-compare/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-right-shift-compare/0.wgsl.expected.msl
new file mode 100644
index 0000000..6500f1c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-right-shift-compare/0.wgsl.expected.msl
@@ -0,0 +1,57 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  int x_32_phi = 0;
+  int const x_24 = x_5.x_GLF_uniform_int_values.arr[1].el;
+  float const x_25 = float(x_24);
+  *(tint_symbol_4) = float4(x_25, x_25, x_25, x_25);
+  int const x_28 = x_5.x_GLF_uniform_int_values.arr[0].el;
+  int const x_30 = ((x_28 << as_type<uint>(x_28)) >> as_type<uint>(1));
+  x_32_phi = x_24;
+  while (true) {
+    int const x_32 = x_32_phi;
+    if ((x_30 < 10)) {
+    } else {
+      break;
+    }
+    int x_33 = 0;
+    x_33 = (x_32 + 1);
+    int const x_39 = x_5.x_GLF_uniform_int_values.arr[2].el;
+    if ((x_33 == as_type<int>(x_39))) {
+      float const x_43 = float(x_28);
+      *(tint_symbol_4) = float4(x_43, x_25, x_25, x_43);
+      break;
+    }
+    {
+      x_32_phi = x_33;
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-left-shift-right-shift-compare/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-right-shift-compare/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..4dab00b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-right-shift-compare/0.wgsl.expected.spvasm
@@ -0,0 +1,125 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 72
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_5 "x_5"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_32_phi "x_32_phi"
+               OpName %x_33 "x_33"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+     %int_10 = OpConstant %int 10
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+         %60 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+   %x_32_phi = OpVariable %_ptr_Function_int Function %21
+       %x_33 = OpVariable %_ptr_Function_int Function %21
+         %25 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %26 = OpLoad %int %25
+         %27 = OpConvertSToF %float %26
+         %28 = OpCompositeConstruct %v4float %27 %27 %27 %27
+               OpStore %x_GLF_color %28
+         %30 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %31 = OpLoad %int %30
+         %32 = OpBitcast %uint %31
+         %33 = OpShiftLeftLogical %int %31 %32
+         %34 = OpBitcast %uint %int_1
+         %35 = OpShiftRightArithmetic %int %33 %34
+               OpStore %x_32_phi %26
+               OpBranch %36
+         %36 = OpLabel
+               OpLoopMerge %37 %38 None
+               OpBranch %39
+         %39 = OpLabel
+         %40 = OpLoad %int %x_32_phi
+         %42 = OpSLessThan %bool %35 %int_10
+               OpSelectionMerge %44 None
+               OpBranchConditional %42 %45 %46
+         %45 = OpLabel
+               OpBranch %44
+         %46 = OpLabel
+               OpBranch %37
+         %44 = OpLabel
+         %48 = OpIAdd %int %40 %int_1
+               OpStore %x_33 %48
+         %50 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_2
+         %51 = OpLoad %int %50
+         %52 = OpLoad %int %x_33
+         %53 = OpCopyObject %int %51
+         %54 = OpIEqual %bool %52 %53
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %55
+         %56 = OpLabel
+         %57 = OpConvertSToF %float %31
+         %58 = OpCompositeConstruct %v4float %57 %27 %27 %57
+               OpStore %x_GLF_color %58
+               OpBranch %37
+         %55 = OpLabel
+               OpBranch %38
+         %38 = OpLabel
+         %59 = OpLoad %int %x_33
+               OpStore %x_32_phi %59
+               OpBranch %36
+         %37 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %60
+%tint_symbol = OpFunctionParameter %main_out
+         %64 = OpLabel
+         %65 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %65
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %67 = OpLabel
+         %68 = OpFunctionCall %void %main_1
+         %70 = OpLoad %v4float %x_GLF_color
+         %71 = OpCompositeConstruct %main_out %70
+         %69 = OpFunctionCall %void %tint_symbol_2 %71
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-left-shift-right-shift-compare/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-right-shift-compare/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..7ccdb81
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-left-shift-right-shift-compare/0.wgsl.expected.wgsl
@@ -0,0 +1,51 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+fn main_1() {
+  var x_32_phi : i32;
+  let x_24 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_25 : f32 = f32(x_24);
+  x_GLF_color = vec4<f32>(x_25, x_25, x_25, x_25);
+  let x_28 : i32 = x_5.x_GLF_uniform_int_values[0];
+  let x_30 : i32 = ((x_28 << bitcast<u32>(x_28)) >> bitcast<u32>(1));
+  x_32_phi = x_24;
+  loop {
+    let x_32 : i32 = x_32_phi;
+    if ((x_30 < 10)) {
+    } else {
+      break;
+    }
+    var x_33 : i32;
+    x_33 = (x_32 + 1);
+    let x_39 : i32 = x_5.x_GLF_uniform_int_values[2];
+    if ((x_33 == bitcast<i32>(x_39))) {
+      let x_43 : f32 = f32(x_28);
+      x_GLF_color = vec4<f32>(x_43, x_25, x_25, x_43);
+      break;
+    }
+
+    continuing {
+      x_32_phi = x_33;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-liveinterval-different-dest/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-liveinterval-different-dest/0-opt.spvasm
new file mode 100644
index 0000000..8b37477
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-liveinterval-different-dest/0-opt.spvasm
@@ -0,0 +1,154 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %func_ "func("
+               OpName %v "v"
+               OpName %i "i"
+               OpName %k "k"
+               OpName %j "j"
+               OpName %data "data"
+               OpName %j_0 "j"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+         %15 = OpTypeFunction %v3float
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+    %float_1 = OpConstant %float 1
+         %19 = OpConstantComposite %v2float %float_1 %float_1
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_4 = OpConstant %float 4
+      %int_1 = OpConstant %int 1
+     %int_10 = OpConstant %int 10
+    %float_0 = OpConstant %float 0
+         %32 = OpConstantComposite %v3float %float_1 %float_0 %float_0
+         %33 = OpConstantComposite %v3float %float_0 %float_0 %float_1
+     %uint_2 = OpConstant %uint 2
+%_arr_v3float_uint_2 = OpTypeArray %v3float %uint_2
+%_ptr_Function__arr_v3float_uint_2 = OpTypePointer Function %_arr_v3float_uint_2
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+      %int_4 = OpConstant %int 4
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %12
+         %41 = OpLabel
+          %j = OpVariable %_ptr_Function_int Function
+       %data = OpVariable %_ptr_Function__arr_v3float_uint_2 Function
+        %j_0 = OpVariable %_ptr_Function_int Function
+               OpStore %j %int_0
+               OpBranch %42
+         %42 = OpLabel
+               OpLoopMerge %43 %44 None
+               OpBranch %45
+         %45 = OpLabel
+         %46 = OpLoad %int %j
+         %47 = OpSLessThan %bool %46 %int_1
+               OpBranchConditional %47 %48 %43
+         %48 = OpLabel
+         %49 = OpLoad %int %j
+         %50 = OpFunctionCall %v3float %func_
+         %51 = OpAccessChain %_ptr_Function_v3float %data %49
+               OpStore %51 %50
+               OpBranch %44
+         %44 = OpLabel
+         %52 = OpLoad %int %j
+         %53 = OpIAdd %int %52 %int_1
+               OpStore %j %53
+               OpBranch %42
+         %43 = OpLabel
+               OpStore %j_0 %int_0
+               OpBranch %54
+         %54 = OpLabel
+               OpLoopMerge %55 %56 None
+               OpBranch %57
+         %57 = OpLabel
+         %58 = OpLoad %int %j_0
+         %59 = OpSLessThan %bool %58 %int_1
+               OpBranchConditional %59 %60 %55
+         %60 = OpLabel
+         %61 = OpLoad %int %j_0
+         %62 = OpIMul %int %int_4 %61
+         %63 = OpIAdd %int %62 %int_1
+         %64 = OpFunctionCall %v3float %func_
+         %65 = OpAccessChain %_ptr_Function_v3float %data %63
+               OpStore %65 %64
+               OpBranch %56
+         %56 = OpLabel
+         %66 = OpLoad %int %j_0
+         %67 = OpIAdd %int %66 %int_1
+               OpStore %j_0 %67
+               OpBranch %54
+         %55 = OpLabel
+         %68 = OpAccessChain %_ptr_Function_v3float %data %int_0
+         %69 = OpLoad %v3float %68
+         %70 = OpCompositeExtract %float %69 0
+         %71 = OpCompositeExtract %float %69 1
+         %72 = OpCompositeExtract %float %69 2
+         %73 = OpCompositeConstruct %v4float %70 %71 %72 %float_1
+               OpStore %_GLF_color %73
+               OpReturn
+               OpFunctionEnd
+      %func_ = OpFunction %v3float None %15
+         %74 = OpLabel
+          %v = OpVariable %_ptr_Function_v2float Function
+          %i = OpVariable %_ptr_Function_int Function
+          %k = OpVariable %_ptr_Function_int Function
+               OpStore %v %19
+               OpStore %i %int_0
+               OpStore %k %int_0
+               OpBranch %75
+         %75 = OpLabel
+               OpLoopMerge %76 %77 None
+               OpBranch %78
+         %78 = OpLabel
+         %79 = OpLoad %int %k
+         %80 = OpSLessThan %bool %79 %int_2
+               OpBranchConditional %80 %81 %76
+         %81 = OpLabel
+         %82 = OpAccessChain %_ptr_Function_float %v %uint_1
+         %83 = OpLoad %float %82
+         %84 = OpFAdd %float %83 %float_1
+         %85 = OpFOrdGreaterThan %bool %84 %float_4
+               OpSelectionMerge %86 None
+               OpBranchConditional %85 %87 %86
+         %87 = OpLabel
+               OpBranch %76
+         %86 = OpLabel
+         %88 = OpAccessChain %_ptr_Function_float %v %uint_1
+               OpStore %88 %float_1
+         %89 = OpLoad %int %i
+         %90 = OpIAdd %int %89 %int_1
+               OpStore %i %90
+               OpBranch %77
+         %77 = OpLabel
+         %91 = OpLoad %int %k
+         %92 = OpIAdd %int %91 %int_1
+               OpStore %k %92
+               OpBranch %75
+         %76 = OpLabel
+         %93 = OpLoad %int %i
+         %94 = OpSLessThan %bool %93 %int_10
+               OpSelectionMerge %95 None
+               OpBranchConditional %94 %96 %97
+         %96 = OpLabel
+               OpReturnValue %32
+         %97 = OpLabel
+               OpReturnValue %33
+         %95 = OpLabel
+               OpUnreachable
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-liveinterval-different-dest/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-liveinterval-different-dest/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..2cde1cb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-liveinterval-different-dest/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,65 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float3 func_() {
+  float2 v = float2(0.0f, 0.0f);
+  int i = 0;
+  int k = 0;
+  v = float2(1.0f, 1.0f);
+  i = 0;
+  k = 0;
+  {
+    for(; (k < 2); k = (k + 1)) {
+      const float x_83 = v.y;
+      if (((x_83 + 1.0f) > 4.0f)) {
+        break;
+      }
+      v.y = 1.0f;
+      i = (i + 1);
+    }
+  }
+  if ((i < 10)) {
+    return float3(1.0f, 0.0f, 0.0f);
+  } else {
+    return float3(0.0f, 0.0f, 1.0f);
+  }
+  return float3(0.0f, 0.0f, 0.0f);
+}
+
+void main_1() {
+  int j = 0;
+  float3 data[2] = (float3[2])0;
+  int j_1 = 0;
+  j = 0;
+  {
+    for(; (j < 1); j = (j + 1)) {
+      const int x_49 = j;
+      const float3 x_50 = func_();
+      data[x_49] = x_50;
+    }
+  }
+  j_1 = 0;
+  {
+    for(; (j_1 < 1); j_1 = (j_1 + 1)) {
+      const int x_61 = j_1;
+      const float3 x_64 = func_();
+      data[((4 * x_61) + 1)] = x_64;
+    }
+  }
+  const float3 x_69 = data[0];
+  x_GLF_color = float4(x_69.x, x_69.y, x_69.z, 1.0f);
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-liveinterval-different-dest/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-liveinterval-different-dest/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..0932150
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-liveinterval-different-dest/0-opt.spvasm.expected.msl
@@ -0,0 +1,94 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  float3 arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float3 func_() {
+  float2 v = 0.0f;
+  int i = 0;
+  int k = 0;
+  v = float2(1.0f, 1.0f);
+  i = 0;
+  k = 0;
+  while (true) {
+    int const x_79 = k;
+    if ((x_79 < 2)) {
+    } else {
+      break;
+    }
+    float const x_83 = v.y;
+    if (((x_83 + 1.0f) > 4.0f)) {
+      break;
+    }
+    v.y = 1.0f;
+    int const x_89 = i;
+    i = (x_89 + 1);
+    {
+      int const x_91 = k;
+      k = (x_91 + 1);
+    }
+  }
+  int const x_93 = i;
+  if ((x_93 < 10)) {
+    return float3(1.0f, 0.0f, 0.0f);
+  } else {
+    return float3(0.0f, 0.0f, 1.0f);
+  }
+  return float3(0.0f, 0.0f, 0.0f);
+}
+
+void main_1(thread float4* const tint_symbol_4) {
+  int j = 0;
+  tint_array_wrapper data = {};
+  int j_1 = 0;
+  j = 0;
+  while (true) {
+    int const x_46 = j;
+    if ((x_46 < 1)) {
+    } else {
+      break;
+    }
+    int const x_49 = j;
+    float3 const x_50 = func_();
+    data.arr[x_49] = x_50;
+    {
+      int const x_52 = j;
+      j = (x_52 + 1);
+    }
+  }
+  j_1 = 0;
+  while (true) {
+    int const x_58 = j_1;
+    if ((x_58 < 1)) {
+    } else {
+      break;
+    }
+    int const x_61 = j_1;
+    float3 const x_64 = func_();
+    data.arr[((4 * x_61) + 1)] = x_64;
+    {
+      int const x_66 = j_1;
+      j_1 = (x_66 + 1);
+    }
+  }
+  float3 const x_69 = data.arr[0];
+  *(tint_symbol_4) = float4(x_69.x, x_69.y, x_69.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-liveinterval-different-dest/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-liveinterval-different-dest/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..74c4d05
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-liveinterval-different-dest/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,204 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 122
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_ "func_"
+               OpName %v "v"
+               OpName %i "i"
+               OpName %k "k"
+               OpName %main_1 "main_1"
+               OpName %j "j"
+               OpName %data "data"
+               OpName %j_1 "j_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_v3float_uint_2 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+    %v3float = OpTypeVector %float 3
+          %8 = OpTypeFunction %v3float
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %15 = OpConstantNull %v2float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %19 = OpConstantNull %int
+    %float_1 = OpConstant %float 1
+         %22 = OpConstantComposite %v2float %float_1 %float_1
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_4 = OpConstant %float 4
+      %int_1 = OpConstant %int 1
+     %int_10 = OpConstant %int 10
+    %float_0 = OpConstant %float 0
+         %58 = OpConstantComposite %v3float %float_1 %float_0 %float_0
+         %59 = OpConstantComposite %v3float %float_0 %float_0 %float_1
+         %60 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+       %void = OpTypeVoid
+         %61 = OpTypeFunction %void
+     %uint_2 = OpConstant %uint 2
+%_arr_v3float_uint_2 = OpTypeArray %v3float %uint_2
+%_ptr_Function__arr_v3float_uint_2 = OpTypePointer Function %_arr_v3float_uint_2
+         %70 = OpConstantNull %_arr_v3float_uint_2
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+      %int_4 = OpConstant %int 4
+   %main_out = OpTypeStruct %v4float
+        %110 = OpTypeFunction %void %main_out
+      %func_ = OpFunction %v3float None %8
+         %11 = OpLabel
+          %v = OpVariable %_ptr_Function_v2float Function %15
+          %i = OpVariable %_ptr_Function_int Function %19
+          %k = OpVariable %_ptr_Function_int Function %19
+               OpStore %v %22
+               OpStore %i %int_0
+               OpStore %k %int_0
+               OpBranch %24
+         %24 = OpLabel
+               OpLoopMerge %25 %26 None
+               OpBranch %27
+         %27 = OpLabel
+         %28 = OpLoad %int %k
+         %30 = OpSLessThan %bool %28 %int_2
+               OpSelectionMerge %32 None
+               OpBranchConditional %30 %33 %34
+         %33 = OpLabel
+               OpBranch %32
+         %34 = OpLabel
+               OpBranch %25
+         %32 = OpLabel
+         %38 = OpAccessChain %_ptr_Function_float %v %uint_1
+         %39 = OpLoad %float %38
+         %40 = OpFAdd %float %39 %float_1
+         %42 = OpFOrdGreaterThan %bool %40 %float_4
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %43
+         %44 = OpLabel
+               OpBranch %25
+         %43 = OpLabel
+         %45 = OpAccessChain %_ptr_Function_float %v %uint_1
+               OpStore %45 %float_1
+         %46 = OpLoad %int %i
+         %48 = OpIAdd %int %46 %int_1
+               OpStore %i %48
+               OpBranch %26
+         %26 = OpLabel
+         %49 = OpLoad %int %k
+         %50 = OpIAdd %int %49 %int_1
+               OpStore %k %50
+               OpBranch %24
+         %25 = OpLabel
+         %51 = OpLoad %int %i
+         %53 = OpSLessThan %bool %51 %int_10
+               OpSelectionMerge %54 None
+               OpBranchConditional %53 %55 %56
+         %55 = OpLabel
+               OpReturnValue %58
+         %56 = OpLabel
+               OpReturnValue %59
+         %54 = OpLabel
+               OpReturnValue %60
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %61
+         %64 = OpLabel
+          %j = OpVariable %_ptr_Function_int Function %19
+       %data = OpVariable %_ptr_Function__arr_v3float_uint_2 Function %70
+        %j_1 = OpVariable %_ptr_Function_int Function %19
+               OpStore %j %int_0
+               OpBranch %72
+         %72 = OpLabel
+               OpLoopMerge %73 %74 None
+               OpBranch %75
+         %75 = OpLabel
+         %76 = OpLoad %int %j
+         %77 = OpSLessThan %bool %76 %int_1
+               OpSelectionMerge %78 None
+               OpBranchConditional %77 %79 %80
+         %79 = OpLabel
+               OpBranch %78
+         %80 = OpLabel
+               OpBranch %73
+         %78 = OpLabel
+         %81 = OpLoad %int %j
+         %82 = OpFunctionCall %v3float %func_
+         %84 = OpAccessChain %_ptr_Function_v3float %data %81
+               OpStore %84 %82
+               OpBranch %74
+         %74 = OpLabel
+         %85 = OpLoad %int %j
+         %86 = OpIAdd %int %85 %int_1
+               OpStore %j %86
+               OpBranch %72
+         %73 = OpLabel
+               OpStore %j_1 %int_0
+               OpBranch %87
+         %87 = OpLabel
+               OpLoopMerge %88 %89 None
+               OpBranch %90
+         %90 = OpLabel
+         %91 = OpLoad %int %j_1
+         %92 = OpSLessThan %bool %91 %int_1
+               OpSelectionMerge %93 None
+               OpBranchConditional %92 %94 %95
+         %94 = OpLabel
+               OpBranch %93
+         %95 = OpLabel
+               OpBranch %88
+         %93 = OpLabel
+         %96 = OpLoad %int %j_1
+         %97 = OpFunctionCall %v3float %func_
+         %99 = OpIMul %int %int_4 %96
+        %100 = OpIAdd %int %99 %int_1
+        %101 = OpAccessChain %_ptr_Function_v3float %data %100
+               OpStore %101 %97
+               OpBranch %89
+         %89 = OpLabel
+        %102 = OpLoad %int %j_1
+        %103 = OpIAdd %int %102 %int_1
+               OpStore %j_1 %103
+               OpBranch %87
+         %88 = OpLabel
+        %104 = OpAccessChain %_ptr_Function_v3float %data %int_0
+        %105 = OpLoad %v3float %104
+        %106 = OpCompositeExtract %float %105 0
+        %107 = OpCompositeExtract %float %105 1
+        %108 = OpCompositeExtract %float %105 2
+        %109 = OpCompositeConstruct %v4float %106 %107 %108 %float_1
+               OpStore %x_GLF_color %109
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %110
+%tint_symbol = OpFunctionParameter %main_out
+        %114 = OpLabel
+        %115 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %115
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %61
+        %117 = OpLabel
+        %118 = OpFunctionCall %void %main_1
+        %120 = OpLoad %v4float %x_GLF_color
+        %121 = OpCompositeConstruct %main_out %120
+        %119 = OpFunctionCall %void %tint_symbol_2 %121
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-liveinterval-different-dest/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-liveinterval-different-dest/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..0a12739
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-liveinterval-different-dest/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,88 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> vec3<f32> {
+  var v : vec2<f32>;
+  var i : i32;
+  var k : i32;
+  v = vec2<f32>(1.0, 1.0);
+  i = 0;
+  k = 0;
+  loop {
+    let x_79 : i32 = k;
+    if ((x_79 < 2)) {
+    } else {
+      break;
+    }
+    let x_83 : f32 = v.y;
+    if (((x_83 + 1.0) > 4.0)) {
+      break;
+    }
+    v.y = 1.0;
+    let x_89 : i32 = i;
+    i = (x_89 + 1);
+
+    continuing {
+      let x_91 : i32 = k;
+      k = (x_91 + 1);
+    }
+  }
+  let x_93 : i32 = i;
+  if ((x_93 < 10)) {
+    return vec3<f32>(1.0, 0.0, 0.0);
+  } else {
+    return vec3<f32>(0.0, 0.0, 1.0);
+  }
+  return vec3<f32>(0.0, 0.0, 0.0);
+}
+
+fn main_1() {
+  var j : i32;
+  var data : array<vec3<f32>, 2>;
+  var j_1 : i32;
+  j = 0;
+  loop {
+    let x_46 : i32 = j;
+    if ((x_46 < 1)) {
+    } else {
+      break;
+    }
+    let x_49 : i32 = j;
+    let x_50 : vec3<f32> = func_();
+    data[x_49] = x_50;
+
+    continuing {
+      let x_52 : i32 = j;
+      j = (x_52 + 1);
+    }
+  }
+  j_1 = 0;
+  loop {
+    let x_58 : i32 = j_1;
+    if ((x_58 < 1)) {
+    } else {
+      break;
+    }
+    let x_61 : i32 = j_1;
+    let x_64 : vec3<f32> = func_();
+    data[((4 * x_61) + 1)] = x_64;
+
+    continuing {
+      let x_66 : i32 = j_1;
+      j_1 = (x_66 + 1);
+    }
+  }
+  let x_69 : vec3<f32> = data[0];
+  x_GLF_color = vec4<f32>(x_69.x, x_69.y, x_69.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-liveinterval-different-dest/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-liveinterval-different-dest/0-opt.wgsl
new file mode 100644
index 0000000..0a12739
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-liveinterval-different-dest/0-opt.wgsl
@@ -0,0 +1,88 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> vec3<f32> {
+  var v : vec2<f32>;
+  var i : i32;
+  var k : i32;
+  v = vec2<f32>(1.0, 1.0);
+  i = 0;
+  k = 0;
+  loop {
+    let x_79 : i32 = k;
+    if ((x_79 < 2)) {
+    } else {
+      break;
+    }
+    let x_83 : f32 = v.y;
+    if (((x_83 + 1.0) > 4.0)) {
+      break;
+    }
+    v.y = 1.0;
+    let x_89 : i32 = i;
+    i = (x_89 + 1);
+
+    continuing {
+      let x_91 : i32 = k;
+      k = (x_91 + 1);
+    }
+  }
+  let x_93 : i32 = i;
+  if ((x_93 < 10)) {
+    return vec3<f32>(1.0, 0.0, 0.0);
+  } else {
+    return vec3<f32>(0.0, 0.0, 1.0);
+  }
+  return vec3<f32>(0.0, 0.0, 0.0);
+}
+
+fn main_1() {
+  var j : i32;
+  var data : array<vec3<f32>, 2>;
+  var j_1 : i32;
+  j = 0;
+  loop {
+    let x_46 : i32 = j;
+    if ((x_46 < 1)) {
+    } else {
+      break;
+    }
+    let x_49 : i32 = j;
+    let x_50 : vec3<f32> = func_();
+    data[x_49] = x_50;
+
+    continuing {
+      let x_52 : i32 = j;
+      j = (x_52 + 1);
+    }
+  }
+  j_1 = 0;
+  loop {
+    let x_58 : i32 = j_1;
+    if ((x_58 < 1)) {
+    } else {
+      break;
+    }
+    let x_61 : i32 = j_1;
+    let x_64 : vec3<f32> = func_();
+    data[((4 * x_61) + 1)] = x_64;
+
+    continuing {
+      let x_66 : i32 = j_1;
+      j_1 = (x_66 + 1);
+    }
+  }
+  let x_69 : vec3<f32> = data[0];
+  x_GLF_color = vec4<f32>(x_69.x, x_69.y, x_69.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-liveinterval-different-dest/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-liveinterval-different-dest/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..2cde1cb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-liveinterval-different-dest/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,65 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float3 func_() {
+  float2 v = float2(0.0f, 0.0f);
+  int i = 0;
+  int k = 0;
+  v = float2(1.0f, 1.0f);
+  i = 0;
+  k = 0;
+  {
+    for(; (k < 2); k = (k + 1)) {
+      const float x_83 = v.y;
+      if (((x_83 + 1.0f) > 4.0f)) {
+        break;
+      }
+      v.y = 1.0f;
+      i = (i + 1);
+    }
+  }
+  if ((i < 10)) {
+    return float3(1.0f, 0.0f, 0.0f);
+  } else {
+    return float3(0.0f, 0.0f, 1.0f);
+  }
+  return float3(0.0f, 0.0f, 0.0f);
+}
+
+void main_1() {
+  int j = 0;
+  float3 data[2] = (float3[2])0;
+  int j_1 = 0;
+  j = 0;
+  {
+    for(; (j < 1); j = (j + 1)) {
+      const int x_49 = j;
+      const float3 x_50 = func_();
+      data[x_49] = x_50;
+    }
+  }
+  j_1 = 0;
+  {
+    for(; (j_1 < 1); j_1 = (j_1 + 1)) {
+      const int x_61 = j_1;
+      const float3 x_64 = func_();
+      data[((4 * x_61) + 1)] = x_64;
+    }
+  }
+  const float3 x_69 = data[0];
+  x_GLF_color = float4(x_69.x, x_69.y, x_69.z, 1.0f);
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-liveinterval-different-dest/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-liveinterval-different-dest/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..0932150
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-liveinterval-different-dest/0-opt.wgsl.expected.msl
@@ -0,0 +1,94 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  float3 arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float3 func_() {
+  float2 v = 0.0f;
+  int i = 0;
+  int k = 0;
+  v = float2(1.0f, 1.0f);
+  i = 0;
+  k = 0;
+  while (true) {
+    int const x_79 = k;
+    if ((x_79 < 2)) {
+    } else {
+      break;
+    }
+    float const x_83 = v.y;
+    if (((x_83 + 1.0f) > 4.0f)) {
+      break;
+    }
+    v.y = 1.0f;
+    int const x_89 = i;
+    i = (x_89 + 1);
+    {
+      int const x_91 = k;
+      k = (x_91 + 1);
+    }
+  }
+  int const x_93 = i;
+  if ((x_93 < 10)) {
+    return float3(1.0f, 0.0f, 0.0f);
+  } else {
+    return float3(0.0f, 0.0f, 1.0f);
+  }
+  return float3(0.0f, 0.0f, 0.0f);
+}
+
+void main_1(thread float4* const tint_symbol_4) {
+  int j = 0;
+  tint_array_wrapper data = {};
+  int j_1 = 0;
+  j = 0;
+  while (true) {
+    int const x_46 = j;
+    if ((x_46 < 1)) {
+    } else {
+      break;
+    }
+    int const x_49 = j;
+    float3 const x_50 = func_();
+    data.arr[x_49] = x_50;
+    {
+      int const x_52 = j;
+      j = (x_52 + 1);
+    }
+  }
+  j_1 = 0;
+  while (true) {
+    int const x_58 = j_1;
+    if ((x_58 < 1)) {
+    } else {
+      break;
+    }
+    int const x_61 = j_1;
+    float3 const x_64 = func_();
+    data.arr[((4 * x_61) + 1)] = x_64;
+    {
+      int const x_66 = j_1;
+      j_1 = (x_66 + 1);
+    }
+  }
+  float3 const x_69 = data.arr[0];
+  *(tint_symbol_4) = float4(x_69.x, x_69.y, x_69.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-liveinterval-different-dest/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-liveinterval-different-dest/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..74c4d05
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-liveinterval-different-dest/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,204 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 122
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_ "func_"
+               OpName %v "v"
+               OpName %i "i"
+               OpName %k "k"
+               OpName %main_1 "main_1"
+               OpName %j "j"
+               OpName %data "data"
+               OpName %j_1 "j_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_v3float_uint_2 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+    %v3float = OpTypeVector %float 3
+          %8 = OpTypeFunction %v3float
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %15 = OpConstantNull %v2float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %19 = OpConstantNull %int
+    %float_1 = OpConstant %float 1
+         %22 = OpConstantComposite %v2float %float_1 %float_1
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_4 = OpConstant %float 4
+      %int_1 = OpConstant %int 1
+     %int_10 = OpConstant %int 10
+    %float_0 = OpConstant %float 0
+         %58 = OpConstantComposite %v3float %float_1 %float_0 %float_0
+         %59 = OpConstantComposite %v3float %float_0 %float_0 %float_1
+         %60 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+       %void = OpTypeVoid
+         %61 = OpTypeFunction %void
+     %uint_2 = OpConstant %uint 2
+%_arr_v3float_uint_2 = OpTypeArray %v3float %uint_2
+%_ptr_Function__arr_v3float_uint_2 = OpTypePointer Function %_arr_v3float_uint_2
+         %70 = OpConstantNull %_arr_v3float_uint_2
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+      %int_4 = OpConstant %int 4
+   %main_out = OpTypeStruct %v4float
+        %110 = OpTypeFunction %void %main_out
+      %func_ = OpFunction %v3float None %8
+         %11 = OpLabel
+          %v = OpVariable %_ptr_Function_v2float Function %15
+          %i = OpVariable %_ptr_Function_int Function %19
+          %k = OpVariable %_ptr_Function_int Function %19
+               OpStore %v %22
+               OpStore %i %int_0
+               OpStore %k %int_0
+               OpBranch %24
+         %24 = OpLabel
+               OpLoopMerge %25 %26 None
+               OpBranch %27
+         %27 = OpLabel
+         %28 = OpLoad %int %k
+         %30 = OpSLessThan %bool %28 %int_2
+               OpSelectionMerge %32 None
+               OpBranchConditional %30 %33 %34
+         %33 = OpLabel
+               OpBranch %32
+         %34 = OpLabel
+               OpBranch %25
+         %32 = OpLabel
+         %38 = OpAccessChain %_ptr_Function_float %v %uint_1
+         %39 = OpLoad %float %38
+         %40 = OpFAdd %float %39 %float_1
+         %42 = OpFOrdGreaterThan %bool %40 %float_4
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %43
+         %44 = OpLabel
+               OpBranch %25
+         %43 = OpLabel
+         %45 = OpAccessChain %_ptr_Function_float %v %uint_1
+               OpStore %45 %float_1
+         %46 = OpLoad %int %i
+         %48 = OpIAdd %int %46 %int_1
+               OpStore %i %48
+               OpBranch %26
+         %26 = OpLabel
+         %49 = OpLoad %int %k
+         %50 = OpIAdd %int %49 %int_1
+               OpStore %k %50
+               OpBranch %24
+         %25 = OpLabel
+         %51 = OpLoad %int %i
+         %53 = OpSLessThan %bool %51 %int_10
+               OpSelectionMerge %54 None
+               OpBranchConditional %53 %55 %56
+         %55 = OpLabel
+               OpReturnValue %58
+         %56 = OpLabel
+               OpReturnValue %59
+         %54 = OpLabel
+               OpReturnValue %60
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %61
+         %64 = OpLabel
+          %j = OpVariable %_ptr_Function_int Function %19
+       %data = OpVariable %_ptr_Function__arr_v3float_uint_2 Function %70
+        %j_1 = OpVariable %_ptr_Function_int Function %19
+               OpStore %j %int_0
+               OpBranch %72
+         %72 = OpLabel
+               OpLoopMerge %73 %74 None
+               OpBranch %75
+         %75 = OpLabel
+         %76 = OpLoad %int %j
+         %77 = OpSLessThan %bool %76 %int_1
+               OpSelectionMerge %78 None
+               OpBranchConditional %77 %79 %80
+         %79 = OpLabel
+               OpBranch %78
+         %80 = OpLabel
+               OpBranch %73
+         %78 = OpLabel
+         %81 = OpLoad %int %j
+         %82 = OpFunctionCall %v3float %func_
+         %84 = OpAccessChain %_ptr_Function_v3float %data %81
+               OpStore %84 %82
+               OpBranch %74
+         %74 = OpLabel
+         %85 = OpLoad %int %j
+         %86 = OpIAdd %int %85 %int_1
+               OpStore %j %86
+               OpBranch %72
+         %73 = OpLabel
+               OpStore %j_1 %int_0
+               OpBranch %87
+         %87 = OpLabel
+               OpLoopMerge %88 %89 None
+               OpBranch %90
+         %90 = OpLabel
+         %91 = OpLoad %int %j_1
+         %92 = OpSLessThan %bool %91 %int_1
+               OpSelectionMerge %93 None
+               OpBranchConditional %92 %94 %95
+         %94 = OpLabel
+               OpBranch %93
+         %95 = OpLabel
+               OpBranch %88
+         %93 = OpLabel
+         %96 = OpLoad %int %j_1
+         %97 = OpFunctionCall %v3float %func_
+         %99 = OpIMul %int %int_4 %96
+        %100 = OpIAdd %int %99 %int_1
+        %101 = OpAccessChain %_ptr_Function_v3float %data %100
+               OpStore %101 %97
+               OpBranch %89
+         %89 = OpLabel
+        %102 = OpLoad %int %j_1
+        %103 = OpIAdd %int %102 %int_1
+               OpStore %j_1 %103
+               OpBranch %87
+         %88 = OpLabel
+        %104 = OpAccessChain %_ptr_Function_v3float %data %int_0
+        %105 = OpLoad %v3float %104
+        %106 = OpCompositeExtract %float %105 0
+        %107 = OpCompositeExtract %float %105 1
+        %108 = OpCompositeExtract %float %105 2
+        %109 = OpCompositeConstruct %v4float %106 %107 %108 %float_1
+               OpStore %x_GLF_color %109
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %110
+%tint_symbol = OpFunctionParameter %main_out
+        %114 = OpLabel
+        %115 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %115
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %61
+        %117 = OpLabel
+        %118 = OpFunctionCall %void %main_1
+        %120 = OpLoad %v4float %x_GLF_color
+        %121 = OpCompositeConstruct %main_out %120
+        %119 = OpFunctionCall %void %tint_symbol_2 %121
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-liveinterval-different-dest/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-liveinterval-different-dest/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..0a12739
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-liveinterval-different-dest/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,88 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> vec3<f32> {
+  var v : vec2<f32>;
+  var i : i32;
+  var k : i32;
+  v = vec2<f32>(1.0, 1.0);
+  i = 0;
+  k = 0;
+  loop {
+    let x_79 : i32 = k;
+    if ((x_79 < 2)) {
+    } else {
+      break;
+    }
+    let x_83 : f32 = v.y;
+    if (((x_83 + 1.0) > 4.0)) {
+      break;
+    }
+    v.y = 1.0;
+    let x_89 : i32 = i;
+    i = (x_89 + 1);
+
+    continuing {
+      let x_91 : i32 = k;
+      k = (x_91 + 1);
+    }
+  }
+  let x_93 : i32 = i;
+  if ((x_93 < 10)) {
+    return vec3<f32>(1.0, 0.0, 0.0);
+  } else {
+    return vec3<f32>(0.0, 0.0, 1.0);
+  }
+  return vec3<f32>(0.0, 0.0, 0.0);
+}
+
+fn main_1() {
+  var j : i32;
+  var data : array<vec3<f32>, 2>;
+  var j_1 : i32;
+  j = 0;
+  loop {
+    let x_46 : i32 = j;
+    if ((x_46 < 1)) {
+    } else {
+      break;
+    }
+    let x_49 : i32 = j;
+    let x_50 : vec3<f32> = func_();
+    data[x_49] = x_50;
+
+    continuing {
+      let x_52 : i32 = j;
+      j = (x_52 + 1);
+    }
+  }
+  j_1 = 0;
+  loop {
+    let x_58 : i32 = j_1;
+    if ((x_58 < 1)) {
+    } else {
+      break;
+    }
+    let x_61 : i32 = j_1;
+    let x_64 : vec3<f32> = func_();
+    data[((4 * x_61) + 1)] = x_64;
+
+    continuing {
+      let x_66 : i32 = j_1;
+      j_1 = (x_66 + 1);
+    }
+  }
+  let x_69 : vec3<f32> = data[0];
+  x_GLF_color = vec4<f32>(x_69.x, x_69.y, x_69.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-abs-multiply-offset/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-loop-abs-multiply-offset/0-opt.spvasm
new file mode 100644
index 0000000..9b85a89
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-abs-multiply-offset/0-opt.spvasm
@@ -0,0 +1,134 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %f "f"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_4 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+       %buf0 = OpTypeStruct %_arr_float_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_int = OpTypePointer Function %int
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+      %int_2 = OpConstant %int 2
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %13
+         %32 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function
+          %i = OpVariable %_ptr_Function_int Function
+         %33 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %34 = OpLoad %float %33
+               OpStore %f %34
+         %35 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %36 = OpLoad %int %35
+               OpStore %i %36
+               OpBranch %37
+         %37 = OpLabel
+               OpLoopMerge %38 %39 None
+               OpBranch %40
+         %40 = OpLabel
+         %41 = OpLoad %int %i
+         %42 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %43 = OpLoad %int %42
+         %44 = OpSLessThan %bool %41 %43
+               OpBranchConditional %44 %45 %38
+         %45 = OpLabel
+         %46 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_3
+         %47 = OpLoad %float %46
+         %48 = OpFNegate %float %47
+         %49 = OpLoad %float %f
+         %50 = OpFMul %float %48 %49
+         %51 = OpExtInst %float %1 FAbs %50
+         %52 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %53 = OpLoad %float %52
+         %54 = OpFAdd %float %51 %53
+               OpStore %f %54
+               OpBranch %39
+         %39 = OpLabel
+         %55 = OpLoad %int %i
+         %56 = OpIAdd %int %55 %int_1
+               OpStore %i %56
+               OpBranch %37
+         %38 = OpLabel
+         %57 = OpLoad %float %f
+         %58 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %59 = OpLoad %float %58
+         %60 = OpFOrdGreaterThan %bool %57 %59
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %61
+         %62 = OpLabel
+         %63 = OpLoad %float %f
+         %64 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %65 = OpLoad %float %64
+         %66 = OpFOrdLessThan %bool %63 %65
+               OpBranch %61
+         %61 = OpLabel
+         %67 = OpPhi %bool %60 %38 %66 %62
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %70
+         %69 = OpLabel
+         %71 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %72 = OpLoad %int %71
+         %73 = OpConvertSToF %float %72
+         %74 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %75 = OpLoad %int %74
+         %76 = OpConvertSToF %float %75
+         %77 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %78 = OpLoad %int %77
+         %79 = OpConvertSToF %float %78
+         %80 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %81 = OpLoad %int %80
+         %82 = OpConvertSToF %float %81
+         %83 = OpCompositeConstruct %v4float %73 %76 %79 %82
+               OpStore %_GLF_color %83
+               OpBranch %68
+         %70 = OpLabel
+         %84 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %85 = OpLoad %int %84
+         %86 = OpConvertSToF %float %85
+         %87 = OpCompositeConstruct %v4float %86 %86 %86 %86
+               OpStore %_GLF_color %87
+               OpBranch %68
+         %68 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-abs-multiply-offset/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-abs-multiply-offset/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..98286fb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-abs-multiply-offset/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,72 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[4];
+};
+cbuffer cbuffer_x_9 : register(b1, space0) {
+  uint4 x_9[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float f = 0.0f;
+  int i = 0;
+  bool x_66 = false;
+  bool x_67_phi = false;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_34 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  f = x_34;
+  const int x_36 = asint(x_9[1].x);
+  i = x_36;
+  while (true) {
+    const int x_41 = i;
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_43 = asint(x_9[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    if ((x_41 < x_43)) {
+    } else {
+      break;
+    }
+    const float x_47 = asfloat(x_6[3].x);
+    const float x_49 = f;
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const float x_53 = asfloat(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    f = (abs((-(x_47) * x_49)) + x_53);
+    {
+      i = (i + 1);
+    }
+  }
+  const float x_57 = f;
+  const float x_59 = asfloat(x_6[1].x);
+  const bool x_60 = (x_57 > x_59);
+  x_67_phi = x_60;
+  if (x_60) {
+    const float x_63 = f;
+    const float x_65 = asfloat(x_6[2].x);
+    x_66 = (x_63 < x_65);
+    x_67_phi = x_66;
+  }
+  if (x_67_phi) {
+    const int x_72 = asint(x_9[2].x);
+    const int x_75 = asint(x_9[1].x);
+    const int x_78 = asint(x_9[1].x);
+    const int x_81 = asint(x_9[2].x);
+    x_GLF_color = float4(float(x_72), float(x_75), float(x_78), float(x_81));
+  } else {
+    const int x_85 = asint(x_9[1].x);
+    const float x_86 = float(x_85);
+    x_GLF_color = float4(x_86, x_86, x_86, x_86);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-abs-multiply-offset/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-loop-abs-multiply-offset/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..d81e3ea
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-abs-multiply-offset/0-opt.spvasm.expected.msl
@@ -0,0 +1,88 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_9, thread float4* const tint_symbol_4) {
+  float f = 0.0f;
+  int i = 0;
+  bool x_66 = false;
+  bool x_67_phi = false;
+  float const x_34 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  f = x_34;
+  int const x_36 = x_9.x_GLF_uniform_int_values.arr[1].el;
+  i = x_36;
+  while (true) {
+    int const x_41 = i;
+    int const x_43 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_41 < x_43)) {
+    } else {
+      break;
+    }
+    float const x_47 = x_6.x_GLF_uniform_float_values.arr[3].el;
+    float const x_49 = f;
+    float const x_53 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    f = (fabs((-(x_47) * x_49)) + x_53);
+    {
+      int const x_55 = i;
+      i = (x_55 + 1);
+    }
+  }
+  float const x_57 = f;
+  float const x_59 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  bool const x_60 = (x_57 > x_59);
+  x_67_phi = x_60;
+  if (x_60) {
+    float const x_63 = f;
+    float const x_65 = x_6.x_GLF_uniform_float_values.arr[2].el;
+    x_66 = (x_63 < x_65);
+    x_67_phi = x_66;
+  }
+  bool const x_67 = x_67_phi;
+  if (x_67) {
+    int const x_72 = x_9.x_GLF_uniform_int_values.arr[2].el;
+    int const x_75 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_78 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_81 = x_9.x_GLF_uniform_int_values.arr[2].el;
+    *(tint_symbol_4) = float4(float(x_72), float(x_75), float(x_78), float(x_81));
+  } else {
+    int const x_85 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    float const x_86 = float(x_85);
+    *(tint_symbol_4) = float4(x_86, x_86, x_86, x_86);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_9 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-abs-multiply-offset/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-loop-abs-multiply-offset/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..e9a94b6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-abs-multiply-offset/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,185 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 113
+; Schema: 0
+               OpCapability Shader
+         %62 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %i "i"
+               OpName %x_66 "x_66"
+               OpName %x_67_phi "x_67_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_4 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+       %buf0 = OpTypeStruct %_arr_float_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_9 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %26 = OpConstantNull %float
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %33 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+        %101 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %26
+          %i = OpVariable %_ptr_Function_int Function %29
+       %x_66 = OpVariable %_ptr_Function_bool Function %33
+   %x_67_phi = OpVariable %_ptr_Function_bool Function %33
+         %38 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %39 = OpLoad %float %38
+               OpStore %f %39
+         %42 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %43 = OpLoad %int %42
+               OpStore %i %43
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %48 = OpLoad %int %i
+         %49 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %50 = OpLoad %int %49
+         %51 = OpSLessThan %bool %48 %50
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %54
+         %53 = OpLabel
+               OpBranch %52
+         %54 = OpLabel
+               OpBranch %45
+         %52 = OpLabel
+         %56 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+         %57 = OpLoad %float %56
+         %58 = OpLoad %float %f
+         %59 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %60 = OpLoad %float %59
+         %63 = OpFNegate %float %57
+         %64 = OpFMul %float %63 %58
+         %61 = OpExtInst %float %62 FAbs %64
+         %65 = OpFAdd %float %61 %60
+               OpStore %f %65
+               OpBranch %46
+         %46 = OpLabel
+         %66 = OpLoad %int %i
+         %67 = OpIAdd %int %66 %int_1
+               OpStore %i %67
+               OpBranch %44
+         %45 = OpLabel
+         %68 = OpLoad %float %f
+         %69 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %70 = OpLoad %float %69
+         %71 = OpFOrdGreaterThan %bool %68 %70
+               OpStore %x_67_phi %71
+               OpSelectionMerge %72 None
+               OpBranchConditional %71 %73 %72
+         %73 = OpLabel
+         %74 = OpLoad %float %f
+         %76 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %77 = OpLoad %float %76
+         %78 = OpFOrdLessThan %bool %74 %77
+               OpStore %x_66 %78
+         %79 = OpLoad %bool %x_66
+               OpStore %x_67_phi %79
+               OpBranch %72
+         %72 = OpLabel
+         %80 = OpLoad %bool %x_67_phi
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %83
+         %82 = OpLabel
+         %84 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_2
+         %85 = OpLoad %int %84
+         %86 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %87 = OpLoad %int %86
+         %88 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %89 = OpLoad %int %88
+         %90 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_2
+         %91 = OpLoad %int %90
+         %92 = OpConvertSToF %float %85
+         %93 = OpConvertSToF %float %87
+         %94 = OpConvertSToF %float %89
+         %95 = OpConvertSToF %float %91
+         %96 = OpCompositeConstruct %v4float %92 %93 %94 %95
+               OpStore %x_GLF_color %96
+               OpBranch %81
+         %83 = OpLabel
+         %97 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %98 = OpLoad %int %97
+         %99 = OpConvertSToF %float %98
+        %100 = OpCompositeConstruct %v4float %99 %99 %99 %99
+               OpStore %x_GLF_color %100
+               OpBranch %81
+         %81 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %101
+%tint_symbol = OpFunctionParameter %main_out
+        %105 = OpLabel
+        %106 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %106
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %108 = OpLabel
+        %109 = OpFunctionCall %void %main_1
+        %111 = OpLoad %v4float %x_GLF_color
+        %112 = OpCompositeConstruct %main_out %111
+        %110 = OpFunctionCall %void %tint_symbol_2 %112
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-abs-multiply-offset/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-abs-multiply-offset/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..098a4c9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-abs-multiply-offset/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,81 @@
+type Arr = [[stride(16)]] array<f32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  var i : i32;
+  var x_66 : bool;
+  var x_67_phi : bool;
+  let x_34 : f32 = x_6.x_GLF_uniform_float_values[0];
+  f = x_34;
+  let x_36 : i32 = x_9.x_GLF_uniform_int_values[1];
+  i = x_36;
+  loop {
+    let x_41 : i32 = i;
+    let x_43 : i32 = x_9.x_GLF_uniform_int_values[0];
+    if ((x_41 < x_43)) {
+    } else {
+      break;
+    }
+    let x_47 : f32 = x_6.x_GLF_uniform_float_values[3];
+    let x_49 : f32 = f;
+    let x_53 : f32 = x_6.x_GLF_uniform_float_values[0];
+    f = (abs((-(x_47) * x_49)) + x_53);
+
+    continuing {
+      let x_55 : i32 = i;
+      i = (x_55 + 1);
+    }
+  }
+  let x_57 : f32 = f;
+  let x_59 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_60 : bool = (x_57 > x_59);
+  x_67_phi = x_60;
+  if (x_60) {
+    let x_63 : f32 = f;
+    let x_65 : f32 = x_6.x_GLF_uniform_float_values[2];
+    x_66 = (x_63 < x_65);
+    x_67_phi = x_66;
+  }
+  let x_67 : bool = x_67_phi;
+  if (x_67) {
+    let x_72 : i32 = x_9.x_GLF_uniform_int_values[2];
+    let x_75 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_78 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_81 : i32 = x_9.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_72), f32(x_75), f32(x_78), f32(x_81));
+  } else {
+    let x_85 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_86 : f32 = f32(x_85);
+    x_GLF_color = vec4<f32>(x_86, x_86, x_86, x_86);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-abs-multiply-offset/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-abs-multiply-offset/0-opt.wgsl
new file mode 100644
index 0000000..098a4c9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-abs-multiply-offset/0-opt.wgsl
@@ -0,0 +1,81 @@
+type Arr = [[stride(16)]] array<f32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  var i : i32;
+  var x_66 : bool;
+  var x_67_phi : bool;
+  let x_34 : f32 = x_6.x_GLF_uniform_float_values[0];
+  f = x_34;
+  let x_36 : i32 = x_9.x_GLF_uniform_int_values[1];
+  i = x_36;
+  loop {
+    let x_41 : i32 = i;
+    let x_43 : i32 = x_9.x_GLF_uniform_int_values[0];
+    if ((x_41 < x_43)) {
+    } else {
+      break;
+    }
+    let x_47 : f32 = x_6.x_GLF_uniform_float_values[3];
+    let x_49 : f32 = f;
+    let x_53 : f32 = x_6.x_GLF_uniform_float_values[0];
+    f = (abs((-(x_47) * x_49)) + x_53);
+
+    continuing {
+      let x_55 : i32 = i;
+      i = (x_55 + 1);
+    }
+  }
+  let x_57 : f32 = f;
+  let x_59 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_60 : bool = (x_57 > x_59);
+  x_67_phi = x_60;
+  if (x_60) {
+    let x_63 : f32 = f;
+    let x_65 : f32 = x_6.x_GLF_uniform_float_values[2];
+    x_66 = (x_63 < x_65);
+    x_67_phi = x_66;
+  }
+  let x_67 : bool = x_67_phi;
+  if (x_67) {
+    let x_72 : i32 = x_9.x_GLF_uniform_int_values[2];
+    let x_75 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_78 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_81 : i32 = x_9.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_72), f32(x_75), f32(x_78), f32(x_81));
+  } else {
+    let x_85 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_86 : f32 = f32(x_85);
+    x_GLF_color = vec4<f32>(x_86, x_86, x_86, x_86);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-abs-multiply-offset/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-abs-multiply-offset/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..98286fb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-abs-multiply-offset/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,72 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[4];
+};
+cbuffer cbuffer_x_9 : register(b1, space0) {
+  uint4 x_9[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float f = 0.0f;
+  int i = 0;
+  bool x_66 = false;
+  bool x_67_phi = false;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_34 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  f = x_34;
+  const int x_36 = asint(x_9[1].x);
+  i = x_36;
+  while (true) {
+    const int x_41 = i;
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_43 = asint(x_9[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    if ((x_41 < x_43)) {
+    } else {
+      break;
+    }
+    const float x_47 = asfloat(x_6[3].x);
+    const float x_49 = f;
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const float x_53 = asfloat(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    f = (abs((-(x_47) * x_49)) + x_53);
+    {
+      i = (i + 1);
+    }
+  }
+  const float x_57 = f;
+  const float x_59 = asfloat(x_6[1].x);
+  const bool x_60 = (x_57 > x_59);
+  x_67_phi = x_60;
+  if (x_60) {
+    const float x_63 = f;
+    const float x_65 = asfloat(x_6[2].x);
+    x_66 = (x_63 < x_65);
+    x_67_phi = x_66;
+  }
+  if (x_67_phi) {
+    const int x_72 = asint(x_9[2].x);
+    const int x_75 = asint(x_9[1].x);
+    const int x_78 = asint(x_9[1].x);
+    const int x_81 = asint(x_9[2].x);
+    x_GLF_color = float4(float(x_72), float(x_75), float(x_78), float(x_81));
+  } else {
+    const int x_85 = asint(x_9[1].x);
+    const float x_86 = float(x_85);
+    x_GLF_color = float4(x_86, x_86, x_86, x_86);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-abs-multiply-offset/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-loop-abs-multiply-offset/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..d81e3ea
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-abs-multiply-offset/0-opt.wgsl.expected.msl
@@ -0,0 +1,88 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_9, thread float4* const tint_symbol_4) {
+  float f = 0.0f;
+  int i = 0;
+  bool x_66 = false;
+  bool x_67_phi = false;
+  float const x_34 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  f = x_34;
+  int const x_36 = x_9.x_GLF_uniform_int_values.arr[1].el;
+  i = x_36;
+  while (true) {
+    int const x_41 = i;
+    int const x_43 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_41 < x_43)) {
+    } else {
+      break;
+    }
+    float const x_47 = x_6.x_GLF_uniform_float_values.arr[3].el;
+    float const x_49 = f;
+    float const x_53 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    f = (fabs((-(x_47) * x_49)) + x_53);
+    {
+      int const x_55 = i;
+      i = (x_55 + 1);
+    }
+  }
+  float const x_57 = f;
+  float const x_59 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  bool const x_60 = (x_57 > x_59);
+  x_67_phi = x_60;
+  if (x_60) {
+    float const x_63 = f;
+    float const x_65 = x_6.x_GLF_uniform_float_values.arr[2].el;
+    x_66 = (x_63 < x_65);
+    x_67_phi = x_66;
+  }
+  bool const x_67 = x_67_phi;
+  if (x_67) {
+    int const x_72 = x_9.x_GLF_uniform_int_values.arr[2].el;
+    int const x_75 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_78 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_81 = x_9.x_GLF_uniform_int_values.arr[2].el;
+    *(tint_symbol_4) = float4(float(x_72), float(x_75), float(x_78), float(x_81));
+  } else {
+    int const x_85 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    float const x_86 = float(x_85);
+    *(tint_symbol_4) = float4(x_86, x_86, x_86, x_86);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_9 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-abs-multiply-offset/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-loop-abs-multiply-offset/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..e9a94b6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-abs-multiply-offset/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,185 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 113
+; Schema: 0
+               OpCapability Shader
+         %62 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %i "i"
+               OpName %x_66 "x_66"
+               OpName %x_67_phi "x_67_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_4 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+       %buf0 = OpTypeStruct %_arr_float_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_9 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %26 = OpConstantNull %float
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %33 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+        %101 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %26
+          %i = OpVariable %_ptr_Function_int Function %29
+       %x_66 = OpVariable %_ptr_Function_bool Function %33
+   %x_67_phi = OpVariable %_ptr_Function_bool Function %33
+         %38 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %39 = OpLoad %float %38
+               OpStore %f %39
+         %42 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %43 = OpLoad %int %42
+               OpStore %i %43
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %48 = OpLoad %int %i
+         %49 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %50 = OpLoad %int %49
+         %51 = OpSLessThan %bool %48 %50
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %54
+         %53 = OpLabel
+               OpBranch %52
+         %54 = OpLabel
+               OpBranch %45
+         %52 = OpLabel
+         %56 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+         %57 = OpLoad %float %56
+         %58 = OpLoad %float %f
+         %59 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %60 = OpLoad %float %59
+         %63 = OpFNegate %float %57
+         %64 = OpFMul %float %63 %58
+         %61 = OpExtInst %float %62 FAbs %64
+         %65 = OpFAdd %float %61 %60
+               OpStore %f %65
+               OpBranch %46
+         %46 = OpLabel
+         %66 = OpLoad %int %i
+         %67 = OpIAdd %int %66 %int_1
+               OpStore %i %67
+               OpBranch %44
+         %45 = OpLabel
+         %68 = OpLoad %float %f
+         %69 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %70 = OpLoad %float %69
+         %71 = OpFOrdGreaterThan %bool %68 %70
+               OpStore %x_67_phi %71
+               OpSelectionMerge %72 None
+               OpBranchConditional %71 %73 %72
+         %73 = OpLabel
+         %74 = OpLoad %float %f
+         %76 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %77 = OpLoad %float %76
+         %78 = OpFOrdLessThan %bool %74 %77
+               OpStore %x_66 %78
+         %79 = OpLoad %bool %x_66
+               OpStore %x_67_phi %79
+               OpBranch %72
+         %72 = OpLabel
+         %80 = OpLoad %bool %x_67_phi
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %83
+         %82 = OpLabel
+         %84 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_2
+         %85 = OpLoad %int %84
+         %86 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %87 = OpLoad %int %86
+         %88 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %89 = OpLoad %int %88
+         %90 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_2
+         %91 = OpLoad %int %90
+         %92 = OpConvertSToF %float %85
+         %93 = OpConvertSToF %float %87
+         %94 = OpConvertSToF %float %89
+         %95 = OpConvertSToF %float %91
+         %96 = OpCompositeConstruct %v4float %92 %93 %94 %95
+               OpStore %x_GLF_color %96
+               OpBranch %81
+         %83 = OpLabel
+         %97 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %98 = OpLoad %int %97
+         %99 = OpConvertSToF %float %98
+        %100 = OpCompositeConstruct %v4float %99 %99 %99 %99
+               OpStore %x_GLF_color %100
+               OpBranch %81
+         %81 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %101
+%tint_symbol = OpFunctionParameter %main_out
+        %105 = OpLabel
+        %106 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %106
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %108 = OpLabel
+        %109 = OpFunctionCall %void %main_1
+        %111 = OpLoad %v4float %x_GLF_color
+        %112 = OpCompositeConstruct %main_out %111
+        %110 = OpFunctionCall %void %tint_symbol_2 %112
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-abs-multiply-offset/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-abs-multiply-offset/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..098a4c9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-abs-multiply-offset/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,81 @@
+type Arr = [[stride(16)]] array<f32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  var i : i32;
+  var x_66 : bool;
+  var x_67_phi : bool;
+  let x_34 : f32 = x_6.x_GLF_uniform_float_values[0];
+  f = x_34;
+  let x_36 : i32 = x_9.x_GLF_uniform_int_values[1];
+  i = x_36;
+  loop {
+    let x_41 : i32 = i;
+    let x_43 : i32 = x_9.x_GLF_uniform_int_values[0];
+    if ((x_41 < x_43)) {
+    } else {
+      break;
+    }
+    let x_47 : f32 = x_6.x_GLF_uniform_float_values[3];
+    let x_49 : f32 = f;
+    let x_53 : f32 = x_6.x_GLF_uniform_float_values[0];
+    f = (abs((-(x_47) * x_49)) + x_53);
+
+    continuing {
+      let x_55 : i32 = i;
+      i = (x_55 + 1);
+    }
+  }
+  let x_57 : f32 = f;
+  let x_59 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_60 : bool = (x_57 > x_59);
+  x_67_phi = x_60;
+  if (x_60) {
+    let x_63 : f32 = f;
+    let x_65 : f32 = x_6.x_GLF_uniform_float_values[2];
+    x_66 = (x_63 < x_65);
+    x_67_phi = x_66;
+  }
+  let x_67 : bool = x_67_phi;
+  if (x_67) {
+    let x_72 : i32 = x_9.x_GLF_uniform_int_values[2];
+    let x_75 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_78 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_81 : i32 = x_9.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_72), f32(x_75), f32(x_78), f32(x_81));
+  } else {
+    let x_85 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_86 : f32 = f32(x_85);
+    x_GLF_color = vec4<f32>(x_86, x_86, x_86, x_86);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-break-floor-nan-never-executed/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-loop-break-floor-nan-never-executed/0-opt.spvasm
new file mode 100644
index 0000000..152dc38
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-break-floor-nan-never-executed/0-opt.spvasm
@@ -0,0 +1,95 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %int_5 = OpConstant %int 5
+       %bool = OpTypeBool
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%int_n4194304 = OpConstant %int -4194304
+      %float = OpTypeFloat 32
+    %float_0 = OpConstant %float 0
+     %int_n1 = OpConstant %int -1
+      %int_1 = OpConstant %int 1
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+         %25 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %26 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %9
+         %27 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+               OpStore %a %int_0
+               OpStore %i %int_0
+               OpBranch %28
+         %28 = OpLabel
+               OpLoopMerge %29 %30 None
+               OpBranch %31
+         %31 = OpLabel
+         %32 = OpLoad %int %i
+         %33 = OpSLessThan %bool %32 %int_5
+               OpBranchConditional %33 %34 %29
+         %34 = OpLabel
+         %35 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %36 = OpLoad %int %35
+         %37 = OpIEqual %bool %36 %int_0
+               OpSelectionMerge %38 None
+               OpBranchConditional %37 %39 %38
+         %39 = OpLabel
+         %40 = OpBitcast %float %int_n4194304
+         %41 = OpExtInst %float %1 Floor %40
+         %42 = OpFOrdGreaterThan %bool %41 %float_0
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %43
+         %44 = OpLabel
+               OpStore %a %int_n1
+               OpBranch %29
+         %43 = OpLabel
+               OpBranch %38
+         %38 = OpLabel
+         %45 = OpLoad %int %a
+         %46 = OpIAdd %int %45 %int_1
+               OpStore %a %46
+               OpBranch %30
+         %30 = OpLabel
+         %47 = OpLoad %int %i
+         %48 = OpIAdd %int %47 %int_1
+               OpStore %i %48
+               OpBranch %28
+         %29 = OpLabel
+         %49 = OpLoad %int %a
+         %50 = OpIEqual %bool %49 %int_5
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %53
+         %52 = OpLabel
+               OpStore %_GLF_color %25
+               OpBranch %51
+         %53 = OpLabel
+               OpStore %_GLF_color %26
+               OpBranch %51
+         %51 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-break-floor-nan-never-executed/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-break-floor-nan-never-executed/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..fc76837
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-break-floor-nan-never-executed/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,43 @@
+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() {
+  int a = 0;
+  int i = 0;
+  a = 0;
+  i = 0;
+  {
+    for(; (i < 5); i = (i + 1)) {
+      const int x_36 = asint(x_7[0].x);
+      if ((x_36 == 0)) {
+        if ((floor(asfloat(-4194304)) > 0.0f)) {
+          a = -1;
+          break;
+        }
+      }
+      a = (a + 1);
+    }
+  }
+  if ((a == 5)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-break-floor-nan-never-executed/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-loop-break-floor-nan-never-executed/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..a1922a9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-break-floor-nan-never-executed/0-opt.spvasm.expected.msl
@@ -0,0 +1,55 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int i = 0;
+  a = 0;
+  i = 0;
+  while (true) {
+    int const x_32 = i;
+    if ((x_32 < 5)) {
+    } else {
+      break;
+    }
+    int const x_36 = x_7.one;
+    if ((x_36 == 0)) {
+      if ((floor(as_type<float>(-4194304)) > 0.0f)) {
+        a = -1;
+        break;
+      }
+    }
+    int const x_45 = a;
+    a = (x_45 + 1);
+    {
+      int const x_47 = i;
+      i = (x_47 + 1);
+    }
+  }
+  int const x_49 = a;
+  if ((x_49 == 5)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-break-floor-nan-never-executed/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-loop-break-floor-nan-never-executed/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..e5c6e56
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-break-floor-nan-never-executed/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,135 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 74
+; Schema: 0
+               OpCapability Shader
+         %41 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+      %int_5 = OpConstant %int 5
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%int_n4194304 = OpConstant %int -4194304
+    %float_0 = OpConstant %float 0
+     %int_n1 = OpConstant %int -1
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+         %60 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %61 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %62 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %18
+          %i = OpVariable %_ptr_Function_int Function %18
+               OpStore %a %int_0
+               OpStore %i %int_0
+               OpBranch %21
+         %21 = OpLabel
+               OpLoopMerge %22 %23 None
+               OpBranch %24
+         %24 = OpLabel
+         %25 = OpLoad %int %i
+         %27 = OpSLessThan %bool %25 %int_5
+               OpSelectionMerge %29 None
+               OpBranchConditional %27 %30 %31
+         %30 = OpLabel
+               OpBranch %29
+         %31 = OpLabel
+               OpBranch %22
+         %29 = OpLabel
+         %35 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %36 = OpLoad %int %35
+         %37 = OpIEqual %bool %36 %int_0
+               OpSelectionMerge %38 None
+               OpBranchConditional %37 %39 %38
+         %39 = OpLabel
+         %42 = OpBitcast %float %int_n4194304
+         %40 = OpExtInst %float %41 Floor %42
+         %45 = OpFOrdGreaterThan %bool %40 %float_0
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %46
+         %47 = OpLabel
+               OpStore %a %int_n1
+               OpBranch %22
+         %46 = OpLabel
+               OpBranch %38
+         %38 = OpLabel
+         %49 = OpLoad %int %a
+         %51 = OpIAdd %int %49 %int_1
+               OpStore %a %51
+               OpBranch %23
+         %23 = OpLabel
+         %52 = OpLoad %int %i
+         %53 = OpIAdd %int %52 %int_1
+               OpStore %i %53
+               OpBranch %21
+         %22 = OpLabel
+         %54 = OpLoad %int %a
+         %55 = OpIEqual %bool %54 %int_5
+               OpSelectionMerge %56 None
+               OpBranchConditional %55 %57 %58
+         %57 = OpLabel
+               OpStore %x_GLF_color %60
+               OpBranch %56
+         %58 = OpLabel
+               OpStore %x_GLF_color %61
+               OpBranch %56
+         %56 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %62
+%tint_symbol = OpFunctionParameter %main_out
+         %66 = OpLabel
+         %67 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %67
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %69 = OpLabel
+         %70 = OpFunctionCall %void %main_1
+         %72 = OpLoad %v4float %x_GLF_color
+         %73 = OpCompositeConstruct %main_out %72
+         %71 = OpFunctionCall %void %tint_symbol_2 %73
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-break-floor-nan-never-executed/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-break-floor-nan-never-executed/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..8de51a9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-break-floor-nan-never-executed/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,54 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  a = 0;
+  i = 0;
+  loop {
+    let x_32 : i32 = i;
+    if ((x_32 < 5)) {
+    } else {
+      break;
+    }
+    let x_36 : i32 = x_7.one;
+    if ((x_36 == 0)) {
+      if ((floor(bitcast<f32>(-4194304)) > 0.0)) {
+        a = -1;
+        break;
+      }
+    }
+    let x_45 : i32 = a;
+    a = (x_45 + 1);
+
+    continuing {
+      let x_47 : i32 = i;
+      i = (x_47 + 1);
+    }
+  }
+  let x_49 : i32 = a;
+  if ((x_49 == 5)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-break-floor-nan-never-executed/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-break-floor-nan-never-executed/0-opt.wgsl
new file mode 100644
index 0000000..8de51a9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-break-floor-nan-never-executed/0-opt.wgsl
@@ -0,0 +1,54 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  a = 0;
+  i = 0;
+  loop {
+    let x_32 : i32 = i;
+    if ((x_32 < 5)) {
+    } else {
+      break;
+    }
+    let x_36 : i32 = x_7.one;
+    if ((x_36 == 0)) {
+      if ((floor(bitcast<f32>(-4194304)) > 0.0)) {
+        a = -1;
+        break;
+      }
+    }
+    let x_45 : i32 = a;
+    a = (x_45 + 1);
+
+    continuing {
+      let x_47 : i32 = i;
+      i = (x_47 + 1);
+    }
+  }
+  let x_49 : i32 = a;
+  if ((x_49 == 5)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-break-floor-nan-never-executed/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-break-floor-nan-never-executed/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..fc76837
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-break-floor-nan-never-executed/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,43 @@
+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() {
+  int a = 0;
+  int i = 0;
+  a = 0;
+  i = 0;
+  {
+    for(; (i < 5); i = (i + 1)) {
+      const int x_36 = asint(x_7[0].x);
+      if ((x_36 == 0)) {
+        if ((floor(asfloat(-4194304)) > 0.0f)) {
+          a = -1;
+          break;
+        }
+      }
+      a = (a + 1);
+    }
+  }
+  if ((a == 5)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-break-floor-nan-never-executed/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-loop-break-floor-nan-never-executed/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..a1922a9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-break-floor-nan-never-executed/0-opt.wgsl.expected.msl
@@ -0,0 +1,55 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int i = 0;
+  a = 0;
+  i = 0;
+  while (true) {
+    int const x_32 = i;
+    if ((x_32 < 5)) {
+    } else {
+      break;
+    }
+    int const x_36 = x_7.one;
+    if ((x_36 == 0)) {
+      if ((floor(as_type<float>(-4194304)) > 0.0f)) {
+        a = -1;
+        break;
+      }
+    }
+    int const x_45 = a;
+    a = (x_45 + 1);
+    {
+      int const x_47 = i;
+      i = (x_47 + 1);
+    }
+  }
+  int const x_49 = a;
+  if ((x_49 == 5)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-break-floor-nan-never-executed/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-loop-break-floor-nan-never-executed/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..e5c6e56
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-break-floor-nan-never-executed/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,135 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 74
+; Schema: 0
+               OpCapability Shader
+         %41 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+      %int_5 = OpConstant %int 5
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%int_n4194304 = OpConstant %int -4194304
+    %float_0 = OpConstant %float 0
+     %int_n1 = OpConstant %int -1
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+         %60 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %61 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %62 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %18
+          %i = OpVariable %_ptr_Function_int Function %18
+               OpStore %a %int_0
+               OpStore %i %int_0
+               OpBranch %21
+         %21 = OpLabel
+               OpLoopMerge %22 %23 None
+               OpBranch %24
+         %24 = OpLabel
+         %25 = OpLoad %int %i
+         %27 = OpSLessThan %bool %25 %int_5
+               OpSelectionMerge %29 None
+               OpBranchConditional %27 %30 %31
+         %30 = OpLabel
+               OpBranch %29
+         %31 = OpLabel
+               OpBranch %22
+         %29 = OpLabel
+         %35 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %36 = OpLoad %int %35
+         %37 = OpIEqual %bool %36 %int_0
+               OpSelectionMerge %38 None
+               OpBranchConditional %37 %39 %38
+         %39 = OpLabel
+         %42 = OpBitcast %float %int_n4194304
+         %40 = OpExtInst %float %41 Floor %42
+         %45 = OpFOrdGreaterThan %bool %40 %float_0
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %46
+         %47 = OpLabel
+               OpStore %a %int_n1
+               OpBranch %22
+         %46 = OpLabel
+               OpBranch %38
+         %38 = OpLabel
+         %49 = OpLoad %int %a
+         %51 = OpIAdd %int %49 %int_1
+               OpStore %a %51
+               OpBranch %23
+         %23 = OpLabel
+         %52 = OpLoad %int %i
+         %53 = OpIAdd %int %52 %int_1
+               OpStore %i %53
+               OpBranch %21
+         %22 = OpLabel
+         %54 = OpLoad %int %a
+         %55 = OpIEqual %bool %54 %int_5
+               OpSelectionMerge %56 None
+               OpBranchConditional %55 %57 %58
+         %57 = OpLabel
+               OpStore %x_GLF_color %60
+               OpBranch %56
+         %58 = OpLabel
+               OpStore %x_GLF_color %61
+               OpBranch %56
+         %56 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %62
+%tint_symbol = OpFunctionParameter %main_out
+         %66 = OpLabel
+         %67 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %67
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %69 = OpLabel
+         %70 = OpFunctionCall %void %main_1
+         %72 = OpLoad %v4float %x_GLF_color
+         %73 = OpCompositeConstruct %main_out %72
+         %71 = OpFunctionCall %void %tint_symbol_2 %73
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-break-floor-nan-never-executed/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-break-floor-nan-never-executed/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..8de51a9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-break-floor-nan-never-executed/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,54 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  a = 0;
+  i = 0;
+  loop {
+    let x_32 : i32 = i;
+    if ((x_32 < 5)) {
+    } else {
+      break;
+    }
+    let x_36 : i32 = x_7.one;
+    if ((x_36 == 0)) {
+      if ((floor(bitcast<f32>(-4194304)) > 0.0)) {
+        a = -1;
+        break;
+      }
+    }
+    let x_45 : i32 = a;
+    a = (x_45 + 1);
+
+    continuing {
+      let x_47 : i32 = i;
+      i = (x_47 + 1);
+    }
+  }
+  let x_49 : i32 = a;
+  if ((x_49 == 5)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-clamp-to-one-empty-condition/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-loop-clamp-to-one-empty-condition/0-opt.spvasm
new file mode 100644
index 0000000..22dc573
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-clamp-to-one-empty-condition/0-opt.spvasm
@@ -0,0 +1,137 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %_GLF_global_loop_count "_GLF_global_loop_count"
+               OpName %f "f"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+%_GLF_global_loop_count = OpVariable %_ptr_Private_int Private
+      %int_0 = OpConstant %int 0
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf0 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_int = OpTypePointer Function %int
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %int_100 = OpConstant %int 100
+       %main = OpFunction %void None %14
+         %34 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function
+          %i = OpVariable %_ptr_Function_int Function
+               OpStore %_GLF_global_loop_count %int_0
+         %35 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %36 = OpLoad %float %35
+               OpStore %f %36
+         %37 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %38 = OpLoad %int %37
+               OpStore %i %38
+               OpBranch %39
+         %39 = OpLabel
+               OpLoopMerge %40 %41 None
+               OpBranch %42
+         %42 = OpLabel
+         %43 = OpLoad %int %i
+         %44 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %45 = OpLoad %int %44
+         %46 = OpSLessThan %bool %43 %45
+               OpBranchConditional %46 %47 %40
+         %47 = OpLabel
+         %48 = OpLoad %float %f
+         %49 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %50 = OpLoad %float %49
+         %51 = OpFOrdGreaterThan %bool %48 %50
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %52
+         %53 = OpLabel
+               OpBranch %52
+         %52 = OpLabel
+               OpStore %f %float_1
+         %54 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %55 = OpLoad %float %54
+         %56 = OpLoad %float %f
+         %57 = OpExtInst %float %1 FClamp %55 %float_1 %56
+         %58 = OpFSub %float %float_1 %57
+         %59 = OpLoad %int %i
+         %60 = OpConvertSToF %float %59
+         %61 = OpFAdd %float %58 %60
+               OpStore %f %61
+               OpBranch %41
+         %41 = OpLabel
+         %62 = OpLoad %int %i
+         %63 = OpIAdd %int %62 %int_1
+               OpStore %i %63
+               OpBranch %39
+         %40 = OpLabel
+         %64 = OpLoad %float %f
+         %65 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %66 = OpLoad %float %65
+         %67 = OpFOrdEqual %bool %64 %66
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %70
+         %69 = OpLabel
+         %71 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %72 = OpLoad %int %71
+         %73 = OpConvertSToF %float %72
+         %74 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %75 = OpLoad %int %74
+         %76 = OpConvertSToF %float %75
+         %77 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %78 = OpLoad %int %77
+         %79 = OpConvertSToF %float %78
+         %80 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %81 = OpLoad %int %80
+         %82 = OpConvertSToF %float %81
+         %83 = OpCompositeConstruct %v4float %73 %76 %79 %82
+               OpStore %_GLF_color %83
+               OpBranch %68
+         %70 = OpLabel
+         %84 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %85 = OpLoad %int %84
+         %86 = OpConvertSToF %float %85
+         %87 = OpCompositeConstruct %v4float %86 %86 %86 %86
+               OpStore %_GLF_color %87
+               OpBranch %68
+         %68 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-clamp-to-one-empty-condition/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-clamp-to-one-empty-condition/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..58eeb4f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-clamp-to-one-empty-condition/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,67 @@
+static int x_GLF_global_loop_count = 0;
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[3];
+};
+cbuffer cbuffer_x_10 : register(b1, space0) {
+  uint4 x_10[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float f = 0.0f;
+  int i = 0;
+  x_GLF_global_loop_count = 0;
+  const float x_36 = asfloat(x_7[1].x);
+  f = x_36;
+  const int x_38 = asint(x_10[1].x);
+  i = x_38;
+  while (true) {
+    const int x_43 = i;
+    const int x_45 = asint(x_10[2].x);
+    if ((x_43 < x_45)) {
+    } else {
+      break;
+    }
+    const float x_48 = f;
+    const float x_50 = asfloat(x_7[1].x);
+    if ((x_48 > x_50)) {
+    }
+    f = 1.0f;
+    const float x_55 = asfloat(x_7[2].x);
+    f = ((1.0f - clamp(x_55, 1.0f, f)) + float(i));
+    {
+      i = (i + 1);
+    }
+  }
+  const float x_64 = f;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_66 = asfloat(x_7[scalar_offset / 4][scalar_offset % 4]);
+  if ((x_64 == x_66)) {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_72 = asint(x_10[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const int x_75 = asint(x_10[1].x);
+    const int x_78 = asint(x_10[1].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_81 = asint(x_10[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    x_GLF_color = float4(float(x_72), float(x_75), float(x_78), float(x_81));
+  } else {
+    const int x_85 = asint(x_10[1].x);
+    const float x_86 = float(x_85);
+    x_GLF_color = float4(x_86, x_86, x_86, x_86);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-clamp-to-one-empty-condition/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-loop-clamp-to-one-empty-condition/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..df997cd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-clamp-to-one-empty-condition/0-opt.spvasm.expected.msl
@@ -0,0 +1,84 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, constant buf1& x_10, thread int* const tint_symbol_4, thread float4* const tint_symbol_5) {
+  float f = 0.0f;
+  int i = 0;
+  *(tint_symbol_4) = 0;
+  float const x_36 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  f = x_36;
+  int const x_38 = x_10.x_GLF_uniform_int_values.arr[1].el;
+  i = x_38;
+  while (true) {
+    int const x_43 = i;
+    int const x_45 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    if ((x_43 < x_45)) {
+    } else {
+      break;
+    }
+    float const x_48 = f;
+    float const x_50 = x_7.x_GLF_uniform_float_values.arr[1].el;
+    if ((x_48 > x_50)) {
+    }
+    f = 1.0f;
+    float const x_55 = x_7.x_GLF_uniform_float_values.arr[2].el;
+    float const x_56 = f;
+    int const x_59 = i;
+    f = ((1.0f - clamp(x_55, 1.0f, x_56)) + float(x_59));
+    {
+      int const x_62 = i;
+      i = (x_62 + 1);
+    }
+  }
+  float const x_64 = f;
+  float const x_66 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_64 == x_66)) {
+    int const x_72 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    int const x_75 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_78 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_81 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_5) = float4(float(x_72), float(x_75), float(x_78), float(x_81));
+  } else {
+    int const x_85 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    float const x_86 = float(x_85);
+    *(tint_symbol_5) = float4(x_86, x_86, x_86, x_86);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]], constant buf1& x_10 [[buffer(1)]]) {
+  thread int tint_symbol_6 = 0;
+  thread float4 tint_symbol_7 = 0.0f;
+  main_1(x_7, x_10, &(tint_symbol_6), &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-clamp-to-one-empty-condition/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-loop-clamp-to-one-empty-condition/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..8f44a3e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-clamp-to-one-empty-condition/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,177 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 107
+; Schema: 0
+               OpCapability Shader
+         %65 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_global_loop_count "x_GLF_global_loop_count"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_7 "x_7"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+          %4 = OpConstantNull %int
+%x_GLF_global_loop_count = OpVariable %_ptr_Private_int Private %4
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf0 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_10 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %19 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %19
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %19
+       %void = OpTypeVoid
+         %22 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %28 = OpConstantNull %float
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+         %95 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %22
+         %25 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %28
+          %i = OpVariable %_ptr_Function_int Function %4
+               OpStore %x_GLF_global_loop_count %int_0
+         %35 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %36 = OpLoad %float %35
+               OpStore %f %36
+         %38 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %39 = OpLoad %int %38
+               OpStore %i %39
+               OpBranch %40
+         %40 = OpLabel
+               OpLoopMerge %41 %42 None
+               OpBranch %43
+         %43 = OpLabel
+         %44 = OpLoad %int %i
+         %46 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+         %47 = OpLoad %int %46
+         %48 = OpSLessThan %bool %44 %47
+               OpSelectionMerge %50 None
+               OpBranchConditional %48 %51 %52
+         %51 = OpLabel
+               OpBranch %50
+         %52 = OpLabel
+               OpBranch %41
+         %50 = OpLabel
+         %53 = OpLoad %float %f
+         %54 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %55 = OpLoad %float %54
+         %56 = OpFOrdGreaterThan %bool %53 %55
+               OpSelectionMerge %57 None
+               OpBranchConditional %56 %58 %57
+         %58 = OpLabel
+               OpBranch %57
+         %57 = OpLabel
+               OpStore %f %float_1
+         %60 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_2
+         %61 = OpLoad %float %60
+         %62 = OpLoad %float %f
+         %63 = OpLoad %int %i
+         %64 = OpExtInst %float %65 NClamp %61 %float_1 %62
+         %66 = OpFSub %float %float_1 %64
+         %67 = OpConvertSToF %float %63
+         %68 = OpFAdd %float %66 %67
+               OpStore %f %68
+               OpBranch %42
+         %42 = OpLabel
+         %69 = OpLoad %int %i
+         %70 = OpIAdd %int %69 %int_1
+               OpStore %i %70
+               OpBranch %40
+         %41 = OpLabel
+         %71 = OpLoad %float %f
+         %72 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %73 = OpLoad %float %72
+         %74 = OpFOrdEqual %bool %71 %73
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %77
+         %76 = OpLabel
+         %78 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %79 = OpLoad %int %78
+         %80 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %81 = OpLoad %int %80
+         %82 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %83 = OpLoad %int %82
+         %84 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %85 = OpLoad %int %84
+         %86 = OpConvertSToF %float %79
+         %87 = OpConvertSToF %float %81
+         %88 = OpConvertSToF %float %83
+         %89 = OpConvertSToF %float %85
+         %90 = OpCompositeConstruct %v4float %86 %87 %88 %89
+               OpStore %x_GLF_color %90
+               OpBranch %75
+         %77 = OpLabel
+         %91 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %92 = OpLoad %int %91
+         %93 = OpConvertSToF %float %92
+         %94 = OpCompositeConstruct %v4float %93 %93 %93 %93
+               OpStore %x_GLF_color %94
+               OpBranch %75
+         %75 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %95
+%tint_symbol = OpFunctionParameter %main_out
+         %99 = OpLabel
+        %100 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %100
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %22
+        %102 = OpLabel
+        %103 = OpFunctionCall %void %main_1
+        %105 = OpLoad %v4float %x_GLF_color
+        %106 = OpCompositeConstruct %main_out %105
+        %104 = OpFunctionCall %void %tint_symbol_2 %106
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-clamp-to-one-empty-condition/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-clamp-to-one-empty-condition/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..f074ac2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-clamp-to-one-empty-condition/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,78 @@
+type Arr = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> x_GLF_global_loop_count : i32;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  var i : i32;
+  x_GLF_global_loop_count = 0;
+  let x_36 : f32 = x_7.x_GLF_uniform_float_values[1];
+  f = x_36;
+  let x_38 : i32 = x_10.x_GLF_uniform_int_values[1];
+  i = x_38;
+  loop {
+    let x_43 : i32 = i;
+    let x_45 : i32 = x_10.x_GLF_uniform_int_values[2];
+    if ((x_43 < x_45)) {
+    } else {
+      break;
+    }
+    let x_48 : f32 = f;
+    let x_50 : f32 = x_7.x_GLF_uniform_float_values[1];
+    if ((x_48 > x_50)) {
+    }
+    f = 1.0;
+    let x_55 : f32 = x_7.x_GLF_uniform_float_values[2];
+    let x_56 : f32 = f;
+    let x_59 : i32 = i;
+    f = ((1.0 - clamp(x_55, 1.0, x_56)) + f32(x_59));
+
+    continuing {
+      let x_62 : i32 = i;
+      i = (x_62 + 1);
+    }
+  }
+  let x_64 : f32 = f;
+  let x_66 : f32 = x_7.x_GLF_uniform_float_values[0];
+  if ((x_64 == x_66)) {
+    let x_72 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_75 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_78 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_81 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_72), f32(x_75), f32(x_78), f32(x_81));
+  } else {
+    let x_85 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_86 : f32 = f32(x_85);
+    x_GLF_color = vec4<f32>(x_86, x_86, x_86, x_86);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-clamp-to-one-empty-condition/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-clamp-to-one-empty-condition/0-opt.wgsl
new file mode 100644
index 0000000..f074ac2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-clamp-to-one-empty-condition/0-opt.wgsl
@@ -0,0 +1,78 @@
+type Arr = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> x_GLF_global_loop_count : i32;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  var i : i32;
+  x_GLF_global_loop_count = 0;
+  let x_36 : f32 = x_7.x_GLF_uniform_float_values[1];
+  f = x_36;
+  let x_38 : i32 = x_10.x_GLF_uniform_int_values[1];
+  i = x_38;
+  loop {
+    let x_43 : i32 = i;
+    let x_45 : i32 = x_10.x_GLF_uniform_int_values[2];
+    if ((x_43 < x_45)) {
+    } else {
+      break;
+    }
+    let x_48 : f32 = f;
+    let x_50 : f32 = x_7.x_GLF_uniform_float_values[1];
+    if ((x_48 > x_50)) {
+    }
+    f = 1.0;
+    let x_55 : f32 = x_7.x_GLF_uniform_float_values[2];
+    let x_56 : f32 = f;
+    let x_59 : i32 = i;
+    f = ((1.0 - clamp(x_55, 1.0, x_56)) + f32(x_59));
+
+    continuing {
+      let x_62 : i32 = i;
+      i = (x_62 + 1);
+    }
+  }
+  let x_64 : f32 = f;
+  let x_66 : f32 = x_7.x_GLF_uniform_float_values[0];
+  if ((x_64 == x_66)) {
+    let x_72 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_75 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_78 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_81 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_72), f32(x_75), f32(x_78), f32(x_81));
+  } else {
+    let x_85 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_86 : f32 = f32(x_85);
+    x_GLF_color = vec4<f32>(x_86, x_86, x_86, x_86);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-clamp-to-one-empty-condition/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-clamp-to-one-empty-condition/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..58eeb4f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-clamp-to-one-empty-condition/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,67 @@
+static int x_GLF_global_loop_count = 0;
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[3];
+};
+cbuffer cbuffer_x_10 : register(b1, space0) {
+  uint4 x_10[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float f = 0.0f;
+  int i = 0;
+  x_GLF_global_loop_count = 0;
+  const float x_36 = asfloat(x_7[1].x);
+  f = x_36;
+  const int x_38 = asint(x_10[1].x);
+  i = x_38;
+  while (true) {
+    const int x_43 = i;
+    const int x_45 = asint(x_10[2].x);
+    if ((x_43 < x_45)) {
+    } else {
+      break;
+    }
+    const float x_48 = f;
+    const float x_50 = asfloat(x_7[1].x);
+    if ((x_48 > x_50)) {
+    }
+    f = 1.0f;
+    const float x_55 = asfloat(x_7[2].x);
+    f = ((1.0f - clamp(x_55, 1.0f, f)) + float(i));
+    {
+      i = (i + 1);
+    }
+  }
+  const float x_64 = f;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_66 = asfloat(x_7[scalar_offset / 4][scalar_offset % 4]);
+  if ((x_64 == x_66)) {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_72 = asint(x_10[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const int x_75 = asint(x_10[1].x);
+    const int x_78 = asint(x_10[1].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_81 = asint(x_10[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    x_GLF_color = float4(float(x_72), float(x_75), float(x_78), float(x_81));
+  } else {
+    const int x_85 = asint(x_10[1].x);
+    const float x_86 = float(x_85);
+    x_GLF_color = float4(x_86, x_86, x_86, x_86);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-clamp-to-one-empty-condition/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-loop-clamp-to-one-empty-condition/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..df997cd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-clamp-to-one-empty-condition/0-opt.wgsl.expected.msl
@@ -0,0 +1,84 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, constant buf1& x_10, thread int* const tint_symbol_4, thread float4* const tint_symbol_5) {
+  float f = 0.0f;
+  int i = 0;
+  *(tint_symbol_4) = 0;
+  float const x_36 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  f = x_36;
+  int const x_38 = x_10.x_GLF_uniform_int_values.arr[1].el;
+  i = x_38;
+  while (true) {
+    int const x_43 = i;
+    int const x_45 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    if ((x_43 < x_45)) {
+    } else {
+      break;
+    }
+    float const x_48 = f;
+    float const x_50 = x_7.x_GLF_uniform_float_values.arr[1].el;
+    if ((x_48 > x_50)) {
+    }
+    f = 1.0f;
+    float const x_55 = x_7.x_GLF_uniform_float_values.arr[2].el;
+    float const x_56 = f;
+    int const x_59 = i;
+    f = ((1.0f - clamp(x_55, 1.0f, x_56)) + float(x_59));
+    {
+      int const x_62 = i;
+      i = (x_62 + 1);
+    }
+  }
+  float const x_64 = f;
+  float const x_66 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_64 == x_66)) {
+    int const x_72 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    int const x_75 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_78 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_81 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_5) = float4(float(x_72), float(x_75), float(x_78), float(x_81));
+  } else {
+    int const x_85 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    float const x_86 = float(x_85);
+    *(tint_symbol_5) = float4(x_86, x_86, x_86, x_86);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]], constant buf1& x_10 [[buffer(1)]]) {
+  thread int tint_symbol_6 = 0;
+  thread float4 tint_symbol_7 = 0.0f;
+  main_1(x_7, x_10, &(tint_symbol_6), &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-clamp-to-one-empty-condition/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-loop-clamp-to-one-empty-condition/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..8f44a3e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-clamp-to-one-empty-condition/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,177 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 107
+; Schema: 0
+               OpCapability Shader
+         %65 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_global_loop_count "x_GLF_global_loop_count"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_7 "x_7"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+          %4 = OpConstantNull %int
+%x_GLF_global_loop_count = OpVariable %_ptr_Private_int Private %4
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf0 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_10 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %19 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %19
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %19
+       %void = OpTypeVoid
+         %22 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %28 = OpConstantNull %float
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+         %95 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %22
+         %25 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %28
+          %i = OpVariable %_ptr_Function_int Function %4
+               OpStore %x_GLF_global_loop_count %int_0
+         %35 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %36 = OpLoad %float %35
+               OpStore %f %36
+         %38 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %39 = OpLoad %int %38
+               OpStore %i %39
+               OpBranch %40
+         %40 = OpLabel
+               OpLoopMerge %41 %42 None
+               OpBranch %43
+         %43 = OpLabel
+         %44 = OpLoad %int %i
+         %46 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+         %47 = OpLoad %int %46
+         %48 = OpSLessThan %bool %44 %47
+               OpSelectionMerge %50 None
+               OpBranchConditional %48 %51 %52
+         %51 = OpLabel
+               OpBranch %50
+         %52 = OpLabel
+               OpBranch %41
+         %50 = OpLabel
+         %53 = OpLoad %float %f
+         %54 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %55 = OpLoad %float %54
+         %56 = OpFOrdGreaterThan %bool %53 %55
+               OpSelectionMerge %57 None
+               OpBranchConditional %56 %58 %57
+         %58 = OpLabel
+               OpBranch %57
+         %57 = OpLabel
+               OpStore %f %float_1
+         %60 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_2
+         %61 = OpLoad %float %60
+         %62 = OpLoad %float %f
+         %63 = OpLoad %int %i
+         %64 = OpExtInst %float %65 NClamp %61 %float_1 %62
+         %66 = OpFSub %float %float_1 %64
+         %67 = OpConvertSToF %float %63
+         %68 = OpFAdd %float %66 %67
+               OpStore %f %68
+               OpBranch %42
+         %42 = OpLabel
+         %69 = OpLoad %int %i
+         %70 = OpIAdd %int %69 %int_1
+               OpStore %i %70
+               OpBranch %40
+         %41 = OpLabel
+         %71 = OpLoad %float %f
+         %72 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %73 = OpLoad %float %72
+         %74 = OpFOrdEqual %bool %71 %73
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %77
+         %76 = OpLabel
+         %78 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %79 = OpLoad %int %78
+         %80 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %81 = OpLoad %int %80
+         %82 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %83 = OpLoad %int %82
+         %84 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %85 = OpLoad %int %84
+         %86 = OpConvertSToF %float %79
+         %87 = OpConvertSToF %float %81
+         %88 = OpConvertSToF %float %83
+         %89 = OpConvertSToF %float %85
+         %90 = OpCompositeConstruct %v4float %86 %87 %88 %89
+               OpStore %x_GLF_color %90
+               OpBranch %75
+         %77 = OpLabel
+         %91 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %92 = OpLoad %int %91
+         %93 = OpConvertSToF %float %92
+         %94 = OpCompositeConstruct %v4float %93 %93 %93 %93
+               OpStore %x_GLF_color %94
+               OpBranch %75
+         %75 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %95
+%tint_symbol = OpFunctionParameter %main_out
+         %99 = OpLabel
+        %100 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %100
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %22
+        %102 = OpLabel
+        %103 = OpFunctionCall %void %main_1
+        %105 = OpLoad %v4float %x_GLF_color
+        %106 = OpCompositeConstruct %main_out %105
+        %104 = OpFunctionCall %void %tint_symbol_2 %106
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-clamp-to-one-empty-condition/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-clamp-to-one-empty-condition/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..f074ac2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-clamp-to-one-empty-condition/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,78 @@
+type Arr = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> x_GLF_global_loop_count : i32;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  var i : i32;
+  x_GLF_global_loop_count = 0;
+  let x_36 : f32 = x_7.x_GLF_uniform_float_values[1];
+  f = x_36;
+  let x_38 : i32 = x_10.x_GLF_uniform_int_values[1];
+  i = x_38;
+  loop {
+    let x_43 : i32 = i;
+    let x_45 : i32 = x_10.x_GLF_uniform_int_values[2];
+    if ((x_43 < x_45)) {
+    } else {
+      break;
+    }
+    let x_48 : f32 = f;
+    let x_50 : f32 = x_7.x_GLF_uniform_float_values[1];
+    if ((x_48 > x_50)) {
+    }
+    f = 1.0;
+    let x_55 : f32 = x_7.x_GLF_uniform_float_values[2];
+    let x_56 : f32 = f;
+    let x_59 : i32 = i;
+    f = ((1.0 - clamp(x_55, 1.0, x_56)) + f32(x_59));
+
+    continuing {
+      let x_62 : i32 = i;
+      i = (x_62 + 1);
+    }
+  }
+  let x_64 : f32 = f;
+  let x_66 : f32 = x_7.x_GLF_uniform_float_values[0];
+  if ((x_64 == x_66)) {
+    let x_72 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_75 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_78 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_81 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_72), f32(x_75), f32(x_78), f32(x_81));
+  } else {
+    let x_85 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_86 : f32 = f32(x_85);
+    x_GLF_color = vec4<f32>(x_86, x_86, x_86, x_86);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-condition-double-negate/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-loop-condition-double-negate/0-opt.spvasm
new file mode 100644
index 0000000..525f7ec
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-condition-double-negate/0-opt.spvasm
@@ -0,0 +1,152 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %arr "arr"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %index "index"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_6 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+%_ptr_Function__arr_int_uint_3 = OpTypePointer Function %_arr_int_uint_3
+     %uint_6 = OpConstant %uint 6
+%_arr_int_uint_6 = OpTypeArray %int %uint_6
+       %buf0 = OpTypeStruct %_arr_int_uint_6
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+      %int_3 = OpConstant %int 3
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_5 = OpConstant %int 5
+      %int_2 = OpConstant %int 2
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+      %int_4 = OpConstant %int 4
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %10
+         %31 = OpLabel
+        %arr = OpVariable %_ptr_Function__arr_int_uint_3 Function
+      %index = OpVariable %_ptr_Function_int Function
+         %32 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %33 = OpLoad %int %32
+         %34 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_5
+         %35 = OpLoad %int %34
+         %36 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %37 = OpLoad %int %36
+         %38 = OpCompositeConstruct %_arr_int_uint_3 %33 %35 %37
+               OpStore %arr %38
+               OpStore %index %int_1
+               OpBranch %39
+         %39 = OpLabel
+               OpLoopMerge %40 %41 None
+               OpBranch %42
+         %42 = OpLabel
+               OpSelectionMerge %43 None
+               OpBranchConditional %true %44 %43
+         %44 = OpLabel
+         %45 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %46 = OpLoad %int %45
+         %47 = OpIEqual %bool %46 %int_1
+         %48 = OpLoad %int %index
+         %49 = OpSLessThanEqual %bool %48 %int_1
+         %50 = OpLogicalAnd %bool %47 %49
+         %51 = OpLogicalNot %bool %50
+               OpBranch %43
+         %43 = OpLabel
+         %52 = OpPhi %bool %true %42 %51 %44
+         %53 = OpLogicalNot %bool %52
+               OpBranchConditional %53 %54 %40
+         %54 = OpLabel
+         %55 = OpLoad %int %index
+         %56 = OpAccessChain %_ptr_Function_int %arr %55
+         %57 = OpLoad %int %56
+         %58 = OpIAdd %int %57 %int_1
+               OpStore %56 %58
+         %59 = OpLoad %int %index
+         %60 = OpIAdd %int %59 %int_1
+               OpStore %index %60
+               OpBranch %41
+         %41 = OpLabel
+               OpBranch %39
+         %40 = OpLabel
+         %61 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %62 = OpLoad %int %61
+         %63 = OpAccessChain %_ptr_Function_int %arr %62
+         %64 = OpLoad %int %63
+         %65 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %66 = OpLoad %int %65
+         %67 = OpIEqual %bool %64 %66
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %68
+         %69 = OpLabel
+         %70 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %71 = OpLoad %int %70
+         %72 = OpAccessChain %_ptr_Function_int %arr %71
+         %73 = OpLoad %int %72
+         %74 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_4
+         %75 = OpLoad %int %74
+         %76 = OpIEqual %bool %73 %75
+               OpBranch %68
+         %68 = OpLabel
+         %77 = OpPhi %bool %67 %40 %76 %69
+               OpSelectionMerge %78 None
+               OpBranchConditional %77 %79 %78
+         %79 = OpLabel
+         %80 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %81 = OpLoad %int %80
+         %82 = OpAccessChain %_ptr_Function_int %arr %81
+         %83 = OpLoad %int %82
+         %84 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %85 = OpLoad %int %84
+         %86 = OpIEqual %bool %83 %85
+               OpBranch %78
+         %78 = OpLabel
+         %87 = OpPhi %bool %77 %68 %86 %79
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %90
+         %89 = OpLabel
+         %91 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %92 = OpLoad %int %91
+         %93 = OpConvertSToF %float %92
+         %94 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %95 = OpLoad %int %94
+         %96 = OpConvertSToF %float %95
+         %97 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %98 = OpLoad %int %97
+         %99 = OpConvertSToF %float %98
+        %100 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+        %101 = OpLoad %int %100
+        %102 = OpConvertSToF %float %101
+        %103 = OpCompositeConstruct %v4float %93 %96 %99 %102
+               OpStore %_GLF_color %103
+               OpBranch %88
+         %90 = OpLabel
+        %104 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+        %105 = OpLoad %int %104
+        %106 = OpConvertSToF %float %105
+        %107 = OpCompositeConstruct %v4float %106 %106 %106 %106
+               OpStore %_GLF_color %107
+               OpBranch %88
+         %88 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-condition-double-negate/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-condition-double-negate/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..b3077db
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-condition-double-negate/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,92 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[6];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int arr[3] = (int[3])0;
+  int index = 0;
+  bool x_76 = false;
+  bool x_86 = false;
+  bool x_77_phi = false;
+  bool x_87_phi = false;
+  const int x_33 = asint(x_6[3].x);
+  const int x_35 = asint(x_6[5].x);
+  const int x_37 = asint(x_6[2].x);
+  const int tint_symbol_3[3] = {x_33, x_35, x_37};
+  arr = tint_symbol_3;
+  index = 1;
+  while (true) {
+    bool x_51 = false;
+    bool x_52_phi = false;
+    x_52_phi = true;
+    if (true) {
+      const uint scalar_offset = ((16u * uint(0))) / 4;
+      const int x_46 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+      bool tint_tmp = (x_46 == 1);
+      if (tint_tmp) {
+        tint_tmp = (index <= 1);
+      }
+      x_51 = !((tint_tmp));
+      x_52_phi = x_51;
+    }
+    if (!(x_52_phi)) {
+    } else {
+      break;
+    }
+    const int x_56_save = index;
+    const int x_57 = arr[x_56_save];
+    arr[x_56_save] = (x_57 + 1);
+    index = (index + 1);
+  }
+  const int x_62 = asint(x_6[1].x);
+  const int x_64 = arr[x_62];
+  const int x_66 = asint(x_6[3].x);
+  const bool x_67 = (x_64 == x_66);
+  x_77_phi = x_67;
+  if (x_67) {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_71 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const int x_73 = arr[x_71];
+    const int x_75 = asint(x_6[4].x);
+    x_76 = (x_73 == x_75);
+    x_77_phi = x_76;
+  }
+  const bool x_77 = x_77_phi;
+  x_87_phi = x_77;
+  if (x_77) {
+    const int x_81 = asint(x_6[3].x);
+    const int x_83 = arr[x_81];
+    const int x_85 = asint(x_6[2].x);
+    x_86 = (x_83 == x_85);
+    x_87_phi = x_86;
+  }
+  if (x_87_phi) {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_92 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_95 = asint(x_6[1].x);
+    const int x_98 = asint(x_6[1].x);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_101 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    x_GLF_color = float4(float(x_92), float(x_95), float(x_98), float(x_101));
+  } else {
+    const int x_105 = asint(x_6[1].x);
+    const float x_106 = float(x_105);
+    x_GLF_color = float4(x_106, x_106, x_106, x_106);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-condition-double-negate/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-loop-condition-double-negate/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..028ec7e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-condition-double-negate/0-opt.spvasm.expected.msl
@@ -0,0 +1,102 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[6];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_1 {
+  int arr[3];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_5) {
+  tint_array_wrapper_1 arr = {};
+  int index = 0;
+  bool x_76 = false;
+  bool x_86 = false;
+  bool x_77_phi = false;
+  bool x_87_phi = false;
+  int const x_33 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  int const x_35 = x_6.x_GLF_uniform_int_values.arr[5].el;
+  int const x_37 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  tint_array_wrapper_1 const tint_symbol_3 = {.arr={x_33, x_35, x_37}};
+  arr = tint_symbol_3;
+  index = 1;
+  while (true) {
+    bool x_51 = false;
+    bool x_52_phi = false;
+    x_52_phi = true;
+    if (true) {
+      int const x_46 = x_6.x_GLF_uniform_int_values.arr[0].el;
+      int const x_48 = index;
+      x_51 = !(((x_46 == 1) && (x_48 <= 1)));
+      x_52_phi = x_51;
+    }
+    bool const x_52 = x_52_phi;
+    if (!(x_52)) {
+    } else {
+      break;
+    }
+    int const x_55 = index;
+    int const x_56_save = x_55;
+    int const x_57 = arr.arr[x_56_save];
+    arr.arr[x_56_save] = (x_57 + 1);
+    int const x_59 = index;
+    index = (x_59 + 1);
+  }
+  int const x_62 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_64 = arr.arr[x_62];
+  int const x_66 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  bool const x_67 = (x_64 == x_66);
+  x_77_phi = x_67;
+  if (x_67) {
+    int const x_71 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_73 = arr.arr[x_71];
+    int const x_75 = x_6.x_GLF_uniform_int_values.arr[4].el;
+    x_76 = (x_73 == x_75);
+    x_77_phi = x_76;
+  }
+  bool const x_77 = x_77_phi;
+  x_87_phi = x_77;
+  if (x_77) {
+    int const x_81 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    int const x_83 = arr.arr[x_81];
+    int const x_85 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    x_86 = (x_83 == x_85);
+    x_87_phi = x_86;
+  }
+  bool const x_87 = x_87_phi;
+  if (x_87) {
+    int const x_92 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_95 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_98 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_101 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_5) = float4(float(x_92), float(x_95), float(x_98), float(x_101));
+  } else {
+    int const x_105 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    float const x_106 = float(x_105);
+    *(tint_symbol_5) = float4(x_106, x_106, x_106, x_106);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_6, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-condition-double-negate/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-loop-condition-double-negate/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..35f7480
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-condition-double-negate/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,224 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 141
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %arr "arr"
+               OpName %index "index"
+               OpName %x_76 "x_76"
+               OpName %x_86 "x_86"
+               OpName %x_77_phi "x_77_phi"
+               OpName %x_87_phi "x_87_phi"
+               OpName %x_51 "x_51"
+               OpName %x_52_phi "x_52_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_6 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_6 = OpConstant %uint 6
+%_arr_int_uint_6 = OpTypeArray %int %uint_6
+       %buf0 = OpTypeStruct %_arr_int_uint_6
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+%_ptr_Function__arr_int_uint_3 = OpTypePointer Function %_arr_int_uint_3
+         %23 = OpConstantNull %_arr_int_uint_3
+%_ptr_Function_int = OpTypePointer Function %int
+         %26 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %30 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_3 = OpConstant %int 3
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_5 = OpConstant %int 5
+      %int_2 = OpConstant %int 2
+      %int_1 = OpConstant %int 1
+       %true = OpConstantTrue %bool
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+   %main_out = OpTypeStruct %v4float
+        %129 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+        %arr = OpVariable %_ptr_Function__arr_int_uint_3 Function %23
+      %index = OpVariable %_ptr_Function_int Function %26
+       %x_76 = OpVariable %_ptr_Function_bool Function %30
+       %x_86 = OpVariable %_ptr_Function_bool Function %30
+   %x_77_phi = OpVariable %_ptr_Function_bool Function %30
+   %x_87_phi = OpVariable %_ptr_Function_bool Function %30
+       %x_51 = OpVariable %_ptr_Function_bool Function %30
+   %x_52_phi = OpVariable %_ptr_Function_bool Function %30
+         %37 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %38 = OpLoad %int %37
+         %40 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_5
+         %41 = OpLoad %int %40
+         %43 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %44 = OpLoad %int %43
+         %45 = OpCompositeConstruct %_arr_int_uint_3 %38 %41 %44
+               OpStore %arr %45
+               OpStore %index %int_1
+               OpBranch %47
+         %47 = OpLabel
+               OpLoopMerge %48 %49 None
+               OpBranch %50
+         %50 = OpLabel
+               OpStore %x_52_phi %true
+               OpSelectionMerge %54 None
+               OpBranchConditional %true %55 %54
+         %55 = OpLabel
+         %57 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %58 = OpLoad %int %57
+         %59 = OpLoad %int %index
+         %61 = OpIEqual %bool %58 %int_1
+               OpSelectionMerge %62 None
+               OpBranchConditional %61 %63 %62
+         %63 = OpLabel
+         %64 = OpSLessThanEqual %bool %59 %int_1
+               OpBranch %62
+         %62 = OpLabel
+         %65 = OpPhi %bool %61 %55 %64 %63
+         %60 = OpLogicalNot %bool %65
+               OpStore %x_51 %60
+         %66 = OpLoad %bool %x_51
+               OpStore %x_52_phi %66
+               OpBranch %54
+         %54 = OpLabel
+         %67 = OpLoad %bool %x_52_phi
+         %68 = OpLogicalNot %bool %67
+               OpSelectionMerge %69 None
+               OpBranchConditional %68 %70 %71
+         %70 = OpLabel
+               OpBranch %69
+         %71 = OpLabel
+               OpBranch %48
+         %69 = OpLabel
+         %72 = OpLoad %int %index
+         %73 = OpAccessChain %_ptr_Function_int %arr %72
+         %74 = OpLoad %int %73
+         %75 = OpAccessChain %_ptr_Function_int %arr %72
+         %76 = OpIAdd %int %74 %int_1
+               OpStore %75 %76
+         %77 = OpLoad %int %index
+         %78 = OpIAdd %int %77 %int_1
+               OpStore %index %78
+               OpBranch %49
+         %49 = OpLabel
+               OpBranch %47
+         %48 = OpLabel
+         %79 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %80 = OpLoad %int %79
+         %81 = OpAccessChain %_ptr_Function_int %arr %80
+         %82 = OpLoad %int %81
+         %83 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %84 = OpLoad %int %83
+         %85 = OpIEqual %bool %82 %84
+               OpStore %x_77_phi %85
+               OpSelectionMerge %86 None
+               OpBranchConditional %85 %87 %86
+         %87 = OpLabel
+         %88 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %89 = OpLoad %int %88
+         %90 = OpAccessChain %_ptr_Function_int %arr %89
+         %91 = OpLoad %int %90
+         %93 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+         %94 = OpLoad %int %93
+         %95 = OpIEqual %bool %91 %94
+               OpStore %x_76 %95
+         %96 = OpLoad %bool %x_76
+               OpStore %x_77_phi %96
+               OpBranch %86
+         %86 = OpLabel
+         %97 = OpLoad %bool %x_77_phi
+               OpStore %x_87_phi %97
+               OpSelectionMerge %98 None
+               OpBranchConditional %97 %99 %98
+         %99 = OpLabel
+        %100 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+        %101 = OpLoad %int %100
+        %102 = OpAccessChain %_ptr_Function_int %arr %101
+        %103 = OpLoad %int %102
+        %104 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %105 = OpLoad %int %104
+        %106 = OpIEqual %bool %103 %105
+               OpStore %x_86 %106
+        %107 = OpLoad %bool %x_86
+               OpStore %x_87_phi %107
+               OpBranch %98
+         %98 = OpLabel
+        %108 = OpLoad %bool %x_87_phi
+               OpSelectionMerge %109 None
+               OpBranchConditional %108 %110 %111
+        %110 = OpLabel
+        %112 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %113 = OpLoad %int %112
+        %114 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %115 = OpLoad %int %114
+        %116 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %117 = OpLoad %int %116
+        %118 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %119 = OpLoad %int %118
+        %120 = OpConvertSToF %float %113
+        %121 = OpConvertSToF %float %115
+        %122 = OpConvertSToF %float %117
+        %123 = OpConvertSToF %float %119
+        %124 = OpCompositeConstruct %v4float %120 %121 %122 %123
+               OpStore %x_GLF_color %124
+               OpBranch %109
+        %111 = OpLabel
+        %125 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %126 = OpLoad %int %125
+        %127 = OpConvertSToF %float %126
+        %128 = OpCompositeConstruct %v4float %127 %127 %127 %127
+               OpStore %x_GLF_color %128
+               OpBranch %109
+        %109 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %129
+%tint_symbol = OpFunctionParameter %main_out
+        %133 = OpLabel
+        %134 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %134
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %136 = OpLabel
+        %137 = OpFunctionCall %void %main_1
+        %139 = OpLoad %v4float %x_GLF_color
+        %140 = OpCompositeConstruct %main_out %139
+        %138 = OpFunctionCall %void %tint_symbol_2 %140
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-condition-double-negate/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-condition-double-negate/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..3e3cb21
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-condition-double-negate/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,91 @@
+type Arr = [[stride(16)]] array<i32, 6>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var arr : array<i32, 3>;
+  var index : i32;
+  var x_76 : bool;
+  var x_86 : bool;
+  var x_77_phi : bool;
+  var x_87_phi : bool;
+  let x_33 : i32 = x_6.x_GLF_uniform_int_values[3];
+  let x_35 : i32 = x_6.x_GLF_uniform_int_values[5];
+  let x_37 : i32 = x_6.x_GLF_uniform_int_values[2];
+  arr = array<i32, 3>(x_33, x_35, x_37);
+  index = 1;
+  loop {
+    var x_51 : bool;
+    var x_52_phi : bool;
+    x_52_phi = true;
+    if (true) {
+      let x_46 : i32 = x_6.x_GLF_uniform_int_values[0];
+      let x_48 : i32 = index;
+      x_51 = !(((x_46 == 1) && (x_48 <= 1)));
+      x_52_phi = x_51;
+    }
+    let x_52 : bool = x_52_phi;
+    if (!(x_52)) {
+    } else {
+      break;
+    }
+    let x_55 : i32 = index;
+    let x_56 : ptr<function, i32> = &(arr[x_55]);
+    let x_57 : i32 = *(x_56);
+    *(x_56) = (x_57 + 1);
+    let x_59 : i32 = index;
+    index = (x_59 + 1);
+  }
+  let x_62 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_64 : i32 = arr[x_62];
+  let x_66 : i32 = x_6.x_GLF_uniform_int_values[3];
+  let x_67 : bool = (x_64 == x_66);
+  x_77_phi = x_67;
+  if (x_67) {
+    let x_71 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_73 : i32 = arr[x_71];
+    let x_75 : i32 = x_6.x_GLF_uniform_int_values[4];
+    x_76 = (x_73 == x_75);
+    x_77_phi = x_76;
+  }
+  let x_77 : bool = x_77_phi;
+  x_87_phi = x_77;
+  if (x_77) {
+    let x_81 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_83 : i32 = arr[x_81];
+    let x_85 : i32 = x_6.x_GLF_uniform_int_values[2];
+    x_86 = (x_83 == x_85);
+    x_87_phi = x_86;
+  }
+  let x_87 : bool = x_87_phi;
+  if (x_87) {
+    let x_92 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_95 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_98 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_101 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_92), f32(x_95), f32(x_98), f32(x_101));
+  } else {
+    let x_105 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_106 : f32 = f32(x_105);
+    x_GLF_color = vec4<f32>(x_106, x_106, x_106, x_106);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-condition-double-negate/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-condition-double-negate/0-opt.wgsl
new file mode 100644
index 0000000..3e3cb21
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-condition-double-negate/0-opt.wgsl
@@ -0,0 +1,91 @@
+type Arr = [[stride(16)]] array<i32, 6>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var arr : array<i32, 3>;
+  var index : i32;
+  var x_76 : bool;
+  var x_86 : bool;
+  var x_77_phi : bool;
+  var x_87_phi : bool;
+  let x_33 : i32 = x_6.x_GLF_uniform_int_values[3];
+  let x_35 : i32 = x_6.x_GLF_uniform_int_values[5];
+  let x_37 : i32 = x_6.x_GLF_uniform_int_values[2];
+  arr = array<i32, 3>(x_33, x_35, x_37);
+  index = 1;
+  loop {
+    var x_51 : bool;
+    var x_52_phi : bool;
+    x_52_phi = true;
+    if (true) {
+      let x_46 : i32 = x_6.x_GLF_uniform_int_values[0];
+      let x_48 : i32 = index;
+      x_51 = !(((x_46 == 1) && (x_48 <= 1)));
+      x_52_phi = x_51;
+    }
+    let x_52 : bool = x_52_phi;
+    if (!(x_52)) {
+    } else {
+      break;
+    }
+    let x_55 : i32 = index;
+    let x_56 : ptr<function, i32> = &(arr[x_55]);
+    let x_57 : i32 = *(x_56);
+    *(x_56) = (x_57 + 1);
+    let x_59 : i32 = index;
+    index = (x_59 + 1);
+  }
+  let x_62 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_64 : i32 = arr[x_62];
+  let x_66 : i32 = x_6.x_GLF_uniform_int_values[3];
+  let x_67 : bool = (x_64 == x_66);
+  x_77_phi = x_67;
+  if (x_67) {
+    let x_71 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_73 : i32 = arr[x_71];
+    let x_75 : i32 = x_6.x_GLF_uniform_int_values[4];
+    x_76 = (x_73 == x_75);
+    x_77_phi = x_76;
+  }
+  let x_77 : bool = x_77_phi;
+  x_87_phi = x_77;
+  if (x_77) {
+    let x_81 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_83 : i32 = arr[x_81];
+    let x_85 : i32 = x_6.x_GLF_uniform_int_values[2];
+    x_86 = (x_83 == x_85);
+    x_87_phi = x_86;
+  }
+  let x_87 : bool = x_87_phi;
+  if (x_87) {
+    let x_92 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_95 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_98 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_101 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_92), f32(x_95), f32(x_98), f32(x_101));
+  } else {
+    let x_105 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_106 : f32 = f32(x_105);
+    x_GLF_color = vec4<f32>(x_106, x_106, x_106, x_106);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-condition-double-negate/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-condition-double-negate/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..b3077db
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-condition-double-negate/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,92 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[6];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int arr[3] = (int[3])0;
+  int index = 0;
+  bool x_76 = false;
+  bool x_86 = false;
+  bool x_77_phi = false;
+  bool x_87_phi = false;
+  const int x_33 = asint(x_6[3].x);
+  const int x_35 = asint(x_6[5].x);
+  const int x_37 = asint(x_6[2].x);
+  const int tint_symbol_3[3] = {x_33, x_35, x_37};
+  arr = tint_symbol_3;
+  index = 1;
+  while (true) {
+    bool x_51 = false;
+    bool x_52_phi = false;
+    x_52_phi = true;
+    if (true) {
+      const uint scalar_offset = ((16u * uint(0))) / 4;
+      const int x_46 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+      bool tint_tmp = (x_46 == 1);
+      if (tint_tmp) {
+        tint_tmp = (index <= 1);
+      }
+      x_51 = !((tint_tmp));
+      x_52_phi = x_51;
+    }
+    if (!(x_52_phi)) {
+    } else {
+      break;
+    }
+    const int x_56_save = index;
+    const int x_57 = arr[x_56_save];
+    arr[x_56_save] = (x_57 + 1);
+    index = (index + 1);
+  }
+  const int x_62 = asint(x_6[1].x);
+  const int x_64 = arr[x_62];
+  const int x_66 = asint(x_6[3].x);
+  const bool x_67 = (x_64 == x_66);
+  x_77_phi = x_67;
+  if (x_67) {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_71 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const int x_73 = arr[x_71];
+    const int x_75 = asint(x_6[4].x);
+    x_76 = (x_73 == x_75);
+    x_77_phi = x_76;
+  }
+  const bool x_77 = x_77_phi;
+  x_87_phi = x_77;
+  if (x_77) {
+    const int x_81 = asint(x_6[3].x);
+    const int x_83 = arr[x_81];
+    const int x_85 = asint(x_6[2].x);
+    x_86 = (x_83 == x_85);
+    x_87_phi = x_86;
+  }
+  if (x_87_phi) {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_92 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_95 = asint(x_6[1].x);
+    const int x_98 = asint(x_6[1].x);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_101 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    x_GLF_color = float4(float(x_92), float(x_95), float(x_98), float(x_101));
+  } else {
+    const int x_105 = asint(x_6[1].x);
+    const float x_106 = float(x_105);
+    x_GLF_color = float4(x_106, x_106, x_106, x_106);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-condition-double-negate/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-loop-condition-double-negate/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..028ec7e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-condition-double-negate/0-opt.wgsl.expected.msl
@@ -0,0 +1,102 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[6];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_1 {
+  int arr[3];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_5) {
+  tint_array_wrapper_1 arr = {};
+  int index = 0;
+  bool x_76 = false;
+  bool x_86 = false;
+  bool x_77_phi = false;
+  bool x_87_phi = false;
+  int const x_33 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  int const x_35 = x_6.x_GLF_uniform_int_values.arr[5].el;
+  int const x_37 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  tint_array_wrapper_1 const tint_symbol_3 = {.arr={x_33, x_35, x_37}};
+  arr = tint_symbol_3;
+  index = 1;
+  while (true) {
+    bool x_51 = false;
+    bool x_52_phi = false;
+    x_52_phi = true;
+    if (true) {
+      int const x_46 = x_6.x_GLF_uniform_int_values.arr[0].el;
+      int const x_48 = index;
+      x_51 = !(((x_46 == 1) && (x_48 <= 1)));
+      x_52_phi = x_51;
+    }
+    bool const x_52 = x_52_phi;
+    if (!(x_52)) {
+    } else {
+      break;
+    }
+    int const x_55 = index;
+    int const x_56_save = x_55;
+    int const x_57 = arr.arr[x_56_save];
+    arr.arr[x_56_save] = (x_57 + 1);
+    int const x_59 = index;
+    index = (x_59 + 1);
+  }
+  int const x_62 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_64 = arr.arr[x_62];
+  int const x_66 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  bool const x_67 = (x_64 == x_66);
+  x_77_phi = x_67;
+  if (x_67) {
+    int const x_71 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_73 = arr.arr[x_71];
+    int const x_75 = x_6.x_GLF_uniform_int_values.arr[4].el;
+    x_76 = (x_73 == x_75);
+    x_77_phi = x_76;
+  }
+  bool const x_77 = x_77_phi;
+  x_87_phi = x_77;
+  if (x_77) {
+    int const x_81 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    int const x_83 = arr.arr[x_81];
+    int const x_85 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    x_86 = (x_83 == x_85);
+    x_87_phi = x_86;
+  }
+  bool const x_87 = x_87_phi;
+  if (x_87) {
+    int const x_92 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_95 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_98 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_101 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_5) = float4(float(x_92), float(x_95), float(x_98), float(x_101));
+  } else {
+    int const x_105 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    float const x_106 = float(x_105);
+    *(tint_symbol_5) = float4(x_106, x_106, x_106, x_106);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_6, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-condition-double-negate/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-loop-condition-double-negate/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..35f7480
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-condition-double-negate/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,224 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 141
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %arr "arr"
+               OpName %index "index"
+               OpName %x_76 "x_76"
+               OpName %x_86 "x_86"
+               OpName %x_77_phi "x_77_phi"
+               OpName %x_87_phi "x_87_phi"
+               OpName %x_51 "x_51"
+               OpName %x_52_phi "x_52_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_6 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_6 = OpConstant %uint 6
+%_arr_int_uint_6 = OpTypeArray %int %uint_6
+       %buf0 = OpTypeStruct %_arr_int_uint_6
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+%_ptr_Function__arr_int_uint_3 = OpTypePointer Function %_arr_int_uint_3
+         %23 = OpConstantNull %_arr_int_uint_3
+%_ptr_Function_int = OpTypePointer Function %int
+         %26 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %30 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_3 = OpConstant %int 3
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_5 = OpConstant %int 5
+      %int_2 = OpConstant %int 2
+      %int_1 = OpConstant %int 1
+       %true = OpConstantTrue %bool
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+   %main_out = OpTypeStruct %v4float
+        %129 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+        %arr = OpVariable %_ptr_Function__arr_int_uint_3 Function %23
+      %index = OpVariable %_ptr_Function_int Function %26
+       %x_76 = OpVariable %_ptr_Function_bool Function %30
+       %x_86 = OpVariable %_ptr_Function_bool Function %30
+   %x_77_phi = OpVariable %_ptr_Function_bool Function %30
+   %x_87_phi = OpVariable %_ptr_Function_bool Function %30
+       %x_51 = OpVariable %_ptr_Function_bool Function %30
+   %x_52_phi = OpVariable %_ptr_Function_bool Function %30
+         %37 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %38 = OpLoad %int %37
+         %40 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_5
+         %41 = OpLoad %int %40
+         %43 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %44 = OpLoad %int %43
+         %45 = OpCompositeConstruct %_arr_int_uint_3 %38 %41 %44
+               OpStore %arr %45
+               OpStore %index %int_1
+               OpBranch %47
+         %47 = OpLabel
+               OpLoopMerge %48 %49 None
+               OpBranch %50
+         %50 = OpLabel
+               OpStore %x_52_phi %true
+               OpSelectionMerge %54 None
+               OpBranchConditional %true %55 %54
+         %55 = OpLabel
+         %57 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %58 = OpLoad %int %57
+         %59 = OpLoad %int %index
+         %61 = OpIEqual %bool %58 %int_1
+               OpSelectionMerge %62 None
+               OpBranchConditional %61 %63 %62
+         %63 = OpLabel
+         %64 = OpSLessThanEqual %bool %59 %int_1
+               OpBranch %62
+         %62 = OpLabel
+         %65 = OpPhi %bool %61 %55 %64 %63
+         %60 = OpLogicalNot %bool %65
+               OpStore %x_51 %60
+         %66 = OpLoad %bool %x_51
+               OpStore %x_52_phi %66
+               OpBranch %54
+         %54 = OpLabel
+         %67 = OpLoad %bool %x_52_phi
+         %68 = OpLogicalNot %bool %67
+               OpSelectionMerge %69 None
+               OpBranchConditional %68 %70 %71
+         %70 = OpLabel
+               OpBranch %69
+         %71 = OpLabel
+               OpBranch %48
+         %69 = OpLabel
+         %72 = OpLoad %int %index
+         %73 = OpAccessChain %_ptr_Function_int %arr %72
+         %74 = OpLoad %int %73
+         %75 = OpAccessChain %_ptr_Function_int %arr %72
+         %76 = OpIAdd %int %74 %int_1
+               OpStore %75 %76
+         %77 = OpLoad %int %index
+         %78 = OpIAdd %int %77 %int_1
+               OpStore %index %78
+               OpBranch %49
+         %49 = OpLabel
+               OpBranch %47
+         %48 = OpLabel
+         %79 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %80 = OpLoad %int %79
+         %81 = OpAccessChain %_ptr_Function_int %arr %80
+         %82 = OpLoad %int %81
+         %83 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %84 = OpLoad %int %83
+         %85 = OpIEqual %bool %82 %84
+               OpStore %x_77_phi %85
+               OpSelectionMerge %86 None
+               OpBranchConditional %85 %87 %86
+         %87 = OpLabel
+         %88 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %89 = OpLoad %int %88
+         %90 = OpAccessChain %_ptr_Function_int %arr %89
+         %91 = OpLoad %int %90
+         %93 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+         %94 = OpLoad %int %93
+         %95 = OpIEqual %bool %91 %94
+               OpStore %x_76 %95
+         %96 = OpLoad %bool %x_76
+               OpStore %x_77_phi %96
+               OpBranch %86
+         %86 = OpLabel
+         %97 = OpLoad %bool %x_77_phi
+               OpStore %x_87_phi %97
+               OpSelectionMerge %98 None
+               OpBranchConditional %97 %99 %98
+         %99 = OpLabel
+        %100 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+        %101 = OpLoad %int %100
+        %102 = OpAccessChain %_ptr_Function_int %arr %101
+        %103 = OpLoad %int %102
+        %104 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %105 = OpLoad %int %104
+        %106 = OpIEqual %bool %103 %105
+               OpStore %x_86 %106
+        %107 = OpLoad %bool %x_86
+               OpStore %x_87_phi %107
+               OpBranch %98
+         %98 = OpLabel
+        %108 = OpLoad %bool %x_87_phi
+               OpSelectionMerge %109 None
+               OpBranchConditional %108 %110 %111
+        %110 = OpLabel
+        %112 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %113 = OpLoad %int %112
+        %114 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %115 = OpLoad %int %114
+        %116 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %117 = OpLoad %int %116
+        %118 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %119 = OpLoad %int %118
+        %120 = OpConvertSToF %float %113
+        %121 = OpConvertSToF %float %115
+        %122 = OpConvertSToF %float %117
+        %123 = OpConvertSToF %float %119
+        %124 = OpCompositeConstruct %v4float %120 %121 %122 %123
+               OpStore %x_GLF_color %124
+               OpBranch %109
+        %111 = OpLabel
+        %125 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %126 = OpLoad %int %125
+        %127 = OpConvertSToF %float %126
+        %128 = OpCompositeConstruct %v4float %127 %127 %127 %127
+               OpStore %x_GLF_color %128
+               OpBranch %109
+        %109 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %129
+%tint_symbol = OpFunctionParameter %main_out
+        %133 = OpLabel
+        %134 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %134
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %136 = OpLabel
+        %137 = OpFunctionCall %void %main_1
+        %139 = OpLoad %v4float %x_GLF_color
+        %140 = OpCompositeConstruct %main_out %139
+        %138 = OpFunctionCall %void %tint_symbol_2 %140
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-condition-double-negate/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-condition-double-negate/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..3e3cb21
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-condition-double-negate/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,91 @@
+type Arr = [[stride(16)]] array<i32, 6>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var arr : array<i32, 3>;
+  var index : i32;
+  var x_76 : bool;
+  var x_86 : bool;
+  var x_77_phi : bool;
+  var x_87_phi : bool;
+  let x_33 : i32 = x_6.x_GLF_uniform_int_values[3];
+  let x_35 : i32 = x_6.x_GLF_uniform_int_values[5];
+  let x_37 : i32 = x_6.x_GLF_uniform_int_values[2];
+  arr = array<i32, 3>(x_33, x_35, x_37);
+  index = 1;
+  loop {
+    var x_51 : bool;
+    var x_52_phi : bool;
+    x_52_phi = true;
+    if (true) {
+      let x_46 : i32 = x_6.x_GLF_uniform_int_values[0];
+      let x_48 : i32 = index;
+      x_51 = !(((x_46 == 1) && (x_48 <= 1)));
+      x_52_phi = x_51;
+    }
+    let x_52 : bool = x_52_phi;
+    if (!(x_52)) {
+    } else {
+      break;
+    }
+    let x_55 : i32 = index;
+    let x_56 : ptr<function, i32> = &(arr[x_55]);
+    let x_57 : i32 = *(x_56);
+    *(x_56) = (x_57 + 1);
+    let x_59 : i32 = index;
+    index = (x_59 + 1);
+  }
+  let x_62 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_64 : i32 = arr[x_62];
+  let x_66 : i32 = x_6.x_GLF_uniform_int_values[3];
+  let x_67 : bool = (x_64 == x_66);
+  x_77_phi = x_67;
+  if (x_67) {
+    let x_71 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_73 : i32 = arr[x_71];
+    let x_75 : i32 = x_6.x_GLF_uniform_int_values[4];
+    x_76 = (x_73 == x_75);
+    x_77_phi = x_76;
+  }
+  let x_77 : bool = x_77_phi;
+  x_87_phi = x_77;
+  if (x_77) {
+    let x_81 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_83 : i32 = arr[x_81];
+    let x_85 : i32 = x_6.x_GLF_uniform_int_values[2];
+    x_86 = (x_83 == x_85);
+    x_87_phi = x_86;
+  }
+  let x_87 : bool = x_87_phi;
+  if (x_87) {
+    let x_92 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_95 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_98 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_101 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_92), f32(x_95), f32(x_98), f32(x_101));
+  } else {
+    let x_105 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_106 : f32 = f32(x_105);
+    x_GLF_color = vec4<f32>(x_106, x_106, x_106, x_106);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-dfdx-constant-divide/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-loop-dfdx-constant-divide/0-opt.spvasm
new file mode 100644
index 0000000..ecdf15a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-dfdx-constant-divide/0-opt.spvasm
@@ -0,0 +1,145 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %b "b"
+               OpName %c "c"
+               OpName %i "i"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_int = OpTypePointer Function %int
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %15
+         %33 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function
+          %b = OpVariable %_ptr_Function_float Function
+          %c = OpVariable %_ptr_Function_float Function
+          %i = OpVariable %_ptr_Function_int Function
+         %34 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %35 = OpLoad %float %34
+               OpStore %a %35
+         %36 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %37 = OpLoad %float %36
+               OpStore %b %37
+         %38 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %39 = OpLoad %float %38
+               OpStore %c %39
+         %40 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %41 = OpLoad %int %40
+               OpStore %i %41
+               OpBranch %42
+         %42 = OpLabel
+               OpLoopMerge %43 %44 None
+               OpBranch %45
+         %45 = OpLabel
+         %46 = OpLoad %int %i
+         %47 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %48 = OpLoad %int %47
+         %49 = OpSLessThan %bool %46 %48
+               OpBranchConditional %49 %50 %43
+         %50 = OpLabel
+         %51 = OpLoad %int %i
+         %52 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %53 = OpLoad %int %52
+         %54 = OpIEqual %bool %51 %53
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %55
+         %56 = OpLabel
+         %57 = OpLoad %float %a
+         %58 = OpDPdx %float %57
+         %59 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %60 = OpLoad %float %59
+         %61 = OpFAdd %float %58 %60
+               OpStore %b %61
+               OpBranch %55
+         %55 = OpLabel
+         %62 = OpLoad %float %a
+         %63 = OpDPdx %float %62
+               OpStore %c %63
+         %64 = OpLoad %float %c
+         %65 = OpLoad %float %b
+         %66 = OpFDiv %float %64 %65
+               OpStore %a %66
+               OpBranch %44
+         %44 = OpLabel
+         %67 = OpLoad %int %i
+         %68 = OpIAdd %int %67 %int_1
+               OpStore %i %68
+               OpBranch %42
+         %43 = OpLabel
+         %69 = OpLoad %float %a
+         %70 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %71 = OpLoad %float %70
+         %72 = OpFOrdEqual %bool %69 %71
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %74 %75
+         %74 = OpLabel
+         %76 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %77 = OpLoad %int %76
+         %78 = OpConvertSToF %float %77
+         %79 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %80 = OpLoad %int %79
+         %81 = OpConvertSToF %float %80
+         %82 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %83 = OpLoad %int %82
+         %84 = OpConvertSToF %float %83
+         %85 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %86 = OpLoad %int %85
+         %87 = OpConvertSToF %float %86
+         %88 = OpCompositeConstruct %v4float %78 %81 %84 %87
+               OpStore %_GLF_color %88
+               OpBranch %73
+         %75 = OpLabel
+         %89 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %90 = OpLoad %int %89
+         %91 = OpConvertSToF %float %90
+         %92 = OpCompositeConstruct %v4float %91 %91 %91 %91
+               OpStore %_GLF_color %92
+               OpBranch %73
+         %73 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-dfdx-constant-divide/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-dfdx-constant-divide/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..9c06087
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-dfdx-constant-divide/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,72 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+cbuffer cbuffer_x_11 : register(b1, space0) {
+  uint4 x_11[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float a = 0.0f;
+  float b = 0.0f;
+  float c = 0.0f;
+  int i = 0;
+  const float x_35 = asfloat(x_6[1].x);
+  a = x_35;
+  const float x_37 = asfloat(x_6[1].x);
+  b = x_37;
+  const float x_39 = asfloat(x_6[1].x);
+  c = x_39;
+  const int x_41 = asint(x_11[1].x);
+  i = x_41;
+  while (true) {
+    const int x_46 = i;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_48 = asint(x_11[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_46 < x_48)) {
+    } else {
+      break;
+    }
+    const int x_51 = i;
+    const int x_53 = asint(x_11[2].x);
+    if ((x_51 == x_53)) {
+      const float x_57 = a;
+      const float x_60 = asfloat(x_6[1].x);
+      b = (ddx(x_57) + x_60);
+    }
+    c = ddx(a);
+    a = (c / b);
+    {
+      i = (i + 1);
+    }
+  }
+  const float x_69 = a;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_71 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_69 == x_71)) {
+    const int x_77 = asint(x_11[2].x);
+    const int x_80 = asint(x_11[1].x);
+    const int x_83 = asint(x_11[1].x);
+    const int x_86 = asint(x_11[2].x);
+    x_GLF_color = float4(float(x_77), float(x_80), float(x_83), float(x_86));
+  } else {
+    const int x_90 = asint(x_11[1].x);
+    const float x_91 = float(x_90);
+    x_GLF_color = float4(x_91, x_91, x_91, x_91);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-dfdx-constant-divide/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-loop-dfdx-constant-divide/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..70485b3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-dfdx-constant-divide/0-opt.spvasm.expected.msl
@@ -0,0 +1,91 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_11, thread float4* const tint_symbol_4) {
+  float a = 0.0f;
+  float b = 0.0f;
+  float c = 0.0f;
+  int i = 0;
+  float const x_35 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  a = x_35;
+  float const x_37 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  b = x_37;
+  float const x_39 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  c = x_39;
+  int const x_41 = x_11.x_GLF_uniform_int_values.arr[1].el;
+  i = x_41;
+  while (true) {
+    int const x_46 = i;
+    int const x_48 = x_11.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_46 < x_48)) {
+    } else {
+      break;
+    }
+    int const x_51 = i;
+    int const x_53 = x_11.x_GLF_uniform_int_values.arr[2].el;
+    if ((x_51 == x_53)) {
+      float const x_57 = a;
+      float const x_60 = x_6.x_GLF_uniform_float_values.arr[1].el;
+      b = (dfdx(x_57) + x_60);
+    }
+    float const x_62 = a;
+    c = dfdx(x_62);
+    float const x_64 = c;
+    float const x_65 = b;
+    a = (x_64 / x_65);
+    {
+      int const x_67 = i;
+      i = (x_67 + 1);
+    }
+  }
+  float const x_69 = a;
+  float const x_71 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_69 == x_71)) {
+    int const x_77 = x_11.x_GLF_uniform_int_values.arr[2].el;
+    int const x_80 = x_11.x_GLF_uniform_int_values.arr[1].el;
+    int const x_83 = x_11.x_GLF_uniform_int_values.arr[1].el;
+    int const x_86 = x_11.x_GLF_uniform_int_values.arr[2].el;
+    *(tint_symbol_4) = float4(float(x_77), float(x_80), float(x_83), float(x_86));
+  } else {
+    int const x_90 = x_11.x_GLF_uniform_int_values.arr[1].el;
+    float const x_91 = float(x_90);
+    *(tint_symbol_4) = float4(x_91, x_91, x_91, x_91);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_11 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_11, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-dfdx-constant-divide/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-loop-dfdx-constant-divide/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..4ba110f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-dfdx-constant-divide/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,185 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 112
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_11 "x_11"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_11 NonWritable
+               OpDecorate %x_11 DescriptorSet 0
+               OpDecorate %x_11 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_11 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %26 = OpConstantNull %float
+%_ptr_Function_int = OpTypePointer Function %int
+         %31 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+        %100 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function %26
+          %b = OpVariable %_ptr_Function_float Function %26
+          %c = OpVariable %_ptr_Function_float Function %26
+          %i = OpVariable %_ptr_Function_int Function %31
+         %35 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %36 = OpLoad %float %35
+               OpStore %a %36
+         %37 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %38 = OpLoad %float %37
+               OpStore %b %38
+         %39 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %40 = OpLoad %float %39
+               OpStore %c %40
+         %42 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+         %43 = OpLoad %int %42
+               OpStore %i %43
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %48 = OpLoad %int %i
+         %50 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+         %51 = OpLoad %int %50
+         %52 = OpSLessThan %bool %48 %51
+               OpSelectionMerge %54 None
+               OpBranchConditional %52 %55 %56
+         %55 = OpLabel
+               OpBranch %54
+         %56 = OpLabel
+               OpBranch %45
+         %54 = OpLabel
+         %57 = OpLoad %int %i
+         %59 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_2
+         %60 = OpLoad %int %59
+         %61 = OpIEqual %bool %57 %60
+               OpSelectionMerge %62 None
+               OpBranchConditional %61 %63 %62
+         %63 = OpLabel
+         %64 = OpLoad %float %a
+         %65 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %66 = OpLoad %float %65
+         %67 = OpDPdx %float %64
+         %68 = OpFAdd %float %67 %66
+               OpStore %b %68
+               OpBranch %62
+         %62 = OpLabel
+         %69 = OpLoad %float %a
+         %70 = OpDPdx %float %69
+               OpStore %c %70
+         %71 = OpLoad %float %c
+         %72 = OpLoad %float %b
+         %73 = OpFDiv %float %71 %72
+               OpStore %a %73
+               OpBranch %46
+         %46 = OpLabel
+         %74 = OpLoad %int %i
+         %75 = OpIAdd %int %74 %int_1
+               OpStore %i %75
+               OpBranch %44
+         %45 = OpLabel
+         %76 = OpLoad %float %a
+         %77 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %78 = OpLoad %float %77
+         %79 = OpFOrdEqual %bool %76 %78
+               OpSelectionMerge %80 None
+               OpBranchConditional %79 %81 %82
+         %81 = OpLabel
+         %83 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_2
+         %84 = OpLoad %int %83
+         %85 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+         %88 = OpLoad %int %87
+         %89 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_2
+         %90 = OpLoad %int %89
+         %91 = OpConvertSToF %float %84
+         %92 = OpConvertSToF %float %86
+         %93 = OpConvertSToF %float %88
+         %94 = OpConvertSToF %float %90
+         %95 = OpCompositeConstruct %v4float %91 %92 %93 %94
+               OpStore %x_GLF_color %95
+               OpBranch %80
+         %82 = OpLabel
+         %96 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+         %97 = OpLoad %int %96
+         %98 = OpConvertSToF %float %97
+         %99 = OpCompositeConstruct %v4float %98 %98 %98 %98
+               OpStore %x_GLF_color %99
+               OpBranch %80
+         %80 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %100
+%tint_symbol = OpFunctionParameter %main_out
+        %104 = OpLabel
+        %105 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %105
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %107 = OpLabel
+        %108 = OpFunctionCall %void %main_1
+        %110 = OpLoad %v4float %x_GLF_color
+        %111 = OpCompositeConstruct %main_out %110
+        %109 = OpFunctionCall %void %tint_symbol_2 %111
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-dfdx-constant-divide/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-dfdx-constant-divide/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..52eb93c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-dfdx-constant-divide/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,84 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_11 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : f32;
+  var b : f32;
+  var c : f32;
+  var i : i32;
+  let x_35 : f32 = x_6.x_GLF_uniform_float_values[1];
+  a = x_35;
+  let x_37 : f32 = x_6.x_GLF_uniform_float_values[1];
+  b = x_37;
+  let x_39 : f32 = x_6.x_GLF_uniform_float_values[1];
+  c = x_39;
+  let x_41 : i32 = x_11.x_GLF_uniform_int_values[1];
+  i = x_41;
+  loop {
+    let x_46 : i32 = i;
+    let x_48 : i32 = x_11.x_GLF_uniform_int_values[0];
+    if ((x_46 < x_48)) {
+    } else {
+      break;
+    }
+    let x_51 : i32 = i;
+    let x_53 : i32 = x_11.x_GLF_uniform_int_values[2];
+    if ((x_51 == x_53)) {
+      let x_57 : f32 = a;
+      let x_60 : f32 = x_6.x_GLF_uniform_float_values[1];
+      b = (dpdx(x_57) + x_60);
+    }
+    let x_62 : f32 = a;
+    c = dpdx(x_62);
+    let x_64 : f32 = c;
+    let x_65 : f32 = b;
+    a = (x_64 / x_65);
+
+    continuing {
+      let x_67 : i32 = i;
+      i = (x_67 + 1);
+    }
+  }
+  let x_69 : f32 = a;
+  let x_71 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if ((x_69 == x_71)) {
+    let x_77 : i32 = x_11.x_GLF_uniform_int_values[2];
+    let x_80 : i32 = x_11.x_GLF_uniform_int_values[1];
+    let x_83 : i32 = x_11.x_GLF_uniform_int_values[1];
+    let x_86 : i32 = x_11.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_77), f32(x_80), f32(x_83), f32(x_86));
+  } else {
+    let x_90 : i32 = x_11.x_GLF_uniform_int_values[1];
+    let x_91 : f32 = f32(x_90);
+    x_GLF_color = vec4<f32>(x_91, x_91, x_91, x_91);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-dfdx-constant-divide/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-dfdx-constant-divide/0-opt.wgsl
new file mode 100644
index 0000000..52eb93c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-dfdx-constant-divide/0-opt.wgsl
@@ -0,0 +1,84 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_11 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : f32;
+  var b : f32;
+  var c : f32;
+  var i : i32;
+  let x_35 : f32 = x_6.x_GLF_uniform_float_values[1];
+  a = x_35;
+  let x_37 : f32 = x_6.x_GLF_uniform_float_values[1];
+  b = x_37;
+  let x_39 : f32 = x_6.x_GLF_uniform_float_values[1];
+  c = x_39;
+  let x_41 : i32 = x_11.x_GLF_uniform_int_values[1];
+  i = x_41;
+  loop {
+    let x_46 : i32 = i;
+    let x_48 : i32 = x_11.x_GLF_uniform_int_values[0];
+    if ((x_46 < x_48)) {
+    } else {
+      break;
+    }
+    let x_51 : i32 = i;
+    let x_53 : i32 = x_11.x_GLF_uniform_int_values[2];
+    if ((x_51 == x_53)) {
+      let x_57 : f32 = a;
+      let x_60 : f32 = x_6.x_GLF_uniform_float_values[1];
+      b = (dpdx(x_57) + x_60);
+    }
+    let x_62 : f32 = a;
+    c = dpdx(x_62);
+    let x_64 : f32 = c;
+    let x_65 : f32 = b;
+    a = (x_64 / x_65);
+
+    continuing {
+      let x_67 : i32 = i;
+      i = (x_67 + 1);
+    }
+  }
+  let x_69 : f32 = a;
+  let x_71 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if ((x_69 == x_71)) {
+    let x_77 : i32 = x_11.x_GLF_uniform_int_values[2];
+    let x_80 : i32 = x_11.x_GLF_uniform_int_values[1];
+    let x_83 : i32 = x_11.x_GLF_uniform_int_values[1];
+    let x_86 : i32 = x_11.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_77), f32(x_80), f32(x_83), f32(x_86));
+  } else {
+    let x_90 : i32 = x_11.x_GLF_uniform_int_values[1];
+    let x_91 : f32 = f32(x_90);
+    x_GLF_color = vec4<f32>(x_91, x_91, x_91, x_91);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-dfdx-constant-divide/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-dfdx-constant-divide/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..9c06087
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-dfdx-constant-divide/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,72 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+cbuffer cbuffer_x_11 : register(b1, space0) {
+  uint4 x_11[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float a = 0.0f;
+  float b = 0.0f;
+  float c = 0.0f;
+  int i = 0;
+  const float x_35 = asfloat(x_6[1].x);
+  a = x_35;
+  const float x_37 = asfloat(x_6[1].x);
+  b = x_37;
+  const float x_39 = asfloat(x_6[1].x);
+  c = x_39;
+  const int x_41 = asint(x_11[1].x);
+  i = x_41;
+  while (true) {
+    const int x_46 = i;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_48 = asint(x_11[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_46 < x_48)) {
+    } else {
+      break;
+    }
+    const int x_51 = i;
+    const int x_53 = asint(x_11[2].x);
+    if ((x_51 == x_53)) {
+      const float x_57 = a;
+      const float x_60 = asfloat(x_6[1].x);
+      b = (ddx(x_57) + x_60);
+    }
+    c = ddx(a);
+    a = (c / b);
+    {
+      i = (i + 1);
+    }
+  }
+  const float x_69 = a;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_71 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_69 == x_71)) {
+    const int x_77 = asint(x_11[2].x);
+    const int x_80 = asint(x_11[1].x);
+    const int x_83 = asint(x_11[1].x);
+    const int x_86 = asint(x_11[2].x);
+    x_GLF_color = float4(float(x_77), float(x_80), float(x_83), float(x_86));
+  } else {
+    const int x_90 = asint(x_11[1].x);
+    const float x_91 = float(x_90);
+    x_GLF_color = float4(x_91, x_91, x_91, x_91);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-dfdx-constant-divide/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-loop-dfdx-constant-divide/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..70485b3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-dfdx-constant-divide/0-opt.wgsl.expected.msl
@@ -0,0 +1,91 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_11, thread float4* const tint_symbol_4) {
+  float a = 0.0f;
+  float b = 0.0f;
+  float c = 0.0f;
+  int i = 0;
+  float const x_35 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  a = x_35;
+  float const x_37 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  b = x_37;
+  float const x_39 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  c = x_39;
+  int const x_41 = x_11.x_GLF_uniform_int_values.arr[1].el;
+  i = x_41;
+  while (true) {
+    int const x_46 = i;
+    int const x_48 = x_11.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_46 < x_48)) {
+    } else {
+      break;
+    }
+    int const x_51 = i;
+    int const x_53 = x_11.x_GLF_uniform_int_values.arr[2].el;
+    if ((x_51 == x_53)) {
+      float const x_57 = a;
+      float const x_60 = x_6.x_GLF_uniform_float_values.arr[1].el;
+      b = (dfdx(x_57) + x_60);
+    }
+    float const x_62 = a;
+    c = dfdx(x_62);
+    float const x_64 = c;
+    float const x_65 = b;
+    a = (x_64 / x_65);
+    {
+      int const x_67 = i;
+      i = (x_67 + 1);
+    }
+  }
+  float const x_69 = a;
+  float const x_71 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_69 == x_71)) {
+    int const x_77 = x_11.x_GLF_uniform_int_values.arr[2].el;
+    int const x_80 = x_11.x_GLF_uniform_int_values.arr[1].el;
+    int const x_83 = x_11.x_GLF_uniform_int_values.arr[1].el;
+    int const x_86 = x_11.x_GLF_uniform_int_values.arr[2].el;
+    *(tint_symbol_4) = float4(float(x_77), float(x_80), float(x_83), float(x_86));
+  } else {
+    int const x_90 = x_11.x_GLF_uniform_int_values.arr[1].el;
+    float const x_91 = float(x_90);
+    *(tint_symbol_4) = float4(x_91, x_91, x_91, x_91);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_11 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_11, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-dfdx-constant-divide/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-loop-dfdx-constant-divide/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..4ba110f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-dfdx-constant-divide/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,185 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 112
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_11 "x_11"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_11 NonWritable
+               OpDecorate %x_11 DescriptorSet 0
+               OpDecorate %x_11 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_11 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %26 = OpConstantNull %float
+%_ptr_Function_int = OpTypePointer Function %int
+         %31 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+        %100 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function %26
+          %b = OpVariable %_ptr_Function_float Function %26
+          %c = OpVariable %_ptr_Function_float Function %26
+          %i = OpVariable %_ptr_Function_int Function %31
+         %35 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %36 = OpLoad %float %35
+               OpStore %a %36
+         %37 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %38 = OpLoad %float %37
+               OpStore %b %38
+         %39 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %40 = OpLoad %float %39
+               OpStore %c %40
+         %42 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+         %43 = OpLoad %int %42
+               OpStore %i %43
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %48 = OpLoad %int %i
+         %50 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+         %51 = OpLoad %int %50
+         %52 = OpSLessThan %bool %48 %51
+               OpSelectionMerge %54 None
+               OpBranchConditional %52 %55 %56
+         %55 = OpLabel
+               OpBranch %54
+         %56 = OpLabel
+               OpBranch %45
+         %54 = OpLabel
+         %57 = OpLoad %int %i
+         %59 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_2
+         %60 = OpLoad %int %59
+         %61 = OpIEqual %bool %57 %60
+               OpSelectionMerge %62 None
+               OpBranchConditional %61 %63 %62
+         %63 = OpLabel
+         %64 = OpLoad %float %a
+         %65 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %66 = OpLoad %float %65
+         %67 = OpDPdx %float %64
+         %68 = OpFAdd %float %67 %66
+               OpStore %b %68
+               OpBranch %62
+         %62 = OpLabel
+         %69 = OpLoad %float %a
+         %70 = OpDPdx %float %69
+               OpStore %c %70
+         %71 = OpLoad %float %c
+         %72 = OpLoad %float %b
+         %73 = OpFDiv %float %71 %72
+               OpStore %a %73
+               OpBranch %46
+         %46 = OpLabel
+         %74 = OpLoad %int %i
+         %75 = OpIAdd %int %74 %int_1
+               OpStore %i %75
+               OpBranch %44
+         %45 = OpLabel
+         %76 = OpLoad %float %a
+         %77 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %78 = OpLoad %float %77
+         %79 = OpFOrdEqual %bool %76 %78
+               OpSelectionMerge %80 None
+               OpBranchConditional %79 %81 %82
+         %81 = OpLabel
+         %83 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_2
+         %84 = OpLoad %int %83
+         %85 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+         %88 = OpLoad %int %87
+         %89 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_2
+         %90 = OpLoad %int %89
+         %91 = OpConvertSToF %float %84
+         %92 = OpConvertSToF %float %86
+         %93 = OpConvertSToF %float %88
+         %94 = OpConvertSToF %float %90
+         %95 = OpCompositeConstruct %v4float %91 %92 %93 %94
+               OpStore %x_GLF_color %95
+               OpBranch %80
+         %82 = OpLabel
+         %96 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+         %97 = OpLoad %int %96
+         %98 = OpConvertSToF %float %97
+         %99 = OpCompositeConstruct %v4float %98 %98 %98 %98
+               OpStore %x_GLF_color %99
+               OpBranch %80
+         %80 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %100
+%tint_symbol = OpFunctionParameter %main_out
+        %104 = OpLabel
+        %105 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %105
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %107 = OpLabel
+        %108 = OpFunctionCall %void %main_1
+        %110 = OpLoad %v4float %x_GLF_color
+        %111 = OpCompositeConstruct %main_out %110
+        %109 = OpFunctionCall %void %tint_symbol_2 %111
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-dfdx-constant-divide/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-dfdx-constant-divide/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..52eb93c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-dfdx-constant-divide/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,84 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_11 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : f32;
+  var b : f32;
+  var c : f32;
+  var i : i32;
+  let x_35 : f32 = x_6.x_GLF_uniform_float_values[1];
+  a = x_35;
+  let x_37 : f32 = x_6.x_GLF_uniform_float_values[1];
+  b = x_37;
+  let x_39 : f32 = x_6.x_GLF_uniform_float_values[1];
+  c = x_39;
+  let x_41 : i32 = x_11.x_GLF_uniform_int_values[1];
+  i = x_41;
+  loop {
+    let x_46 : i32 = i;
+    let x_48 : i32 = x_11.x_GLF_uniform_int_values[0];
+    if ((x_46 < x_48)) {
+    } else {
+      break;
+    }
+    let x_51 : i32 = i;
+    let x_53 : i32 = x_11.x_GLF_uniform_int_values[2];
+    if ((x_51 == x_53)) {
+      let x_57 : f32 = a;
+      let x_60 : f32 = x_6.x_GLF_uniform_float_values[1];
+      b = (dpdx(x_57) + x_60);
+    }
+    let x_62 : f32 = a;
+    c = dpdx(x_62);
+    let x_64 : f32 = c;
+    let x_65 : f32 = b;
+    a = (x_64 / x_65);
+
+    continuing {
+      let x_67 : i32 = i;
+      i = (x_67 + 1);
+    }
+  }
+  let x_69 : f32 = a;
+  let x_71 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if ((x_69 == x_71)) {
+    let x_77 : i32 = x_11.x_GLF_uniform_int_values[2];
+    let x_80 : i32 = x_11.x_GLF_uniform_int_values[1];
+    let x_83 : i32 = x_11.x_GLF_uniform_int_values[1];
+    let x_86 : i32 = x_11.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_77), f32(x_80), f32(x_83), f32(x_86));
+  } else {
+    let x_90 : i32 = x_11.x_GLF_uniform_int_values[1];
+    let x_91 : f32 = f32(x_90);
+    x_GLF_color = vec4<f32>(x_91, x_91, x_91, x_91);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.spvasm
new file mode 100644
index 0000000..fcb25ef
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.spvasm
@@ -0,0 +1,192 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %m23 "m23"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+%mat2v3float = OpTypeMatrix %v3float 2
+%_ptr_Function_mat2v3float = OpTypePointer Function %mat2v3float
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+%_ptr_Function_int = OpTypePointer Function %int
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_3 = OpConstant %int 3
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+%_ptr_Function_float = OpTypePointer Function %float
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+       %true = OpConstantTrue %bool
+     %uint_0 = OpConstant %uint 0
+     %v3bool = OpTypeVector %bool 3
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %14
+         %44 = OpLabel
+        %m23 = OpVariable %_ptr_Function_mat2v3float Function
+          %i = OpVariable %_ptr_Function_int Function
+         %45 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %46 = OpLoad %float %45
+         %47 = OpCompositeConstruct %v3float %46 %float_0 %float_0
+         %48 = OpCompositeConstruct %v3float %float_0 %46 %float_0
+         %49 = OpCompositeConstruct %mat2v3float %47 %48
+               OpStore %m23 %49
+               OpStore %i %int_1
+               OpBranch %50
+         %50 = OpLabel
+               OpLoopMerge %51 %52 None
+               OpBranch %53
+         %53 = OpLabel
+         %54 = OpLoad %int %i
+         %55 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_3
+         %56 = OpLoad %int %55
+         %57 = OpSLessThan %bool %54 %56
+               OpBranchConditional %57 %58 %51
+         %58 = OpLabel
+         %59 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %60 = OpLoad %int %59
+         %61 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %62 = OpLoad %int %61
+         %63 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %64 = OpLoad %float %63
+         %65 = OpAccessChain %_ptr_Function_float %m23 %60 %62
+         %66 = OpLoad %float %65
+         %67 = OpFAdd %float %66 %64
+         %68 = OpAccessChain %_ptr_Function_float %m23 %60 %62
+               OpStore %68 %67
+         %69 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %70 = OpLoad %float %69
+         %71 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %72 = OpLoad %float %71
+         %73 = OpFOrdLessThan %bool %70 %72
+               OpSelectionMerge %74 None
+               OpBranchConditional %73 %75 %74
+         %75 = OpLabel
+               OpBranch %74
+         %74 = OpLabel
+               OpSelectionMerge %76 None
+               OpBranchConditional %true %77 %76
+         %77 = OpLabel
+         %78 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %79 = OpLoad %float %78
+         %80 = OpFOrdLessThan %bool %79 %float_0
+               OpBranch %76
+         %76 = OpLabel
+         %81 = OpPhi %bool %true %74 %80 %77
+         %82 = OpLogicalNot %bool %81
+               OpSelectionMerge %83 None
+               OpBranchConditional %82 %84 %83
+         %84 = OpLabel
+               OpBranch %51
+         %83 = OpLabel
+               OpBranch %52
+         %52 = OpLabel
+         %85 = OpLoad %int %i
+         %86 = OpIAdd %int %85 %int_1
+               OpStore %i %86
+               OpBranch %50
+         %51 = OpLabel
+         %87 = OpLoad %mat2v3float %m23
+         %88 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %89 = OpLoad %int %88
+         %90 = OpConvertSToF %float %89
+         %91 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %92 = OpLoad %int %91
+         %93 = OpConvertSToF %float %92
+         %94 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %95 = OpLoad %int %94
+         %96 = OpConvertSToF %float %95
+         %97 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %98 = OpLoad %int %97
+         %99 = OpConvertSToF %float %98
+        %100 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %101 = OpLoad %int %100
+        %102 = OpConvertSToF %float %101
+        %103 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+        %104 = OpLoad %int %103
+        %105 = OpConvertSToF %float %104
+        %106 = OpCompositeConstruct %v3float %90 %93 %96
+        %107 = OpCompositeConstruct %v3float %99 %102 %105
+        %108 = OpCompositeConstruct %mat2v3float %106 %107
+        %109 = OpCompositeExtract %v3float %87 0
+        %110 = OpCompositeExtract %v3float %108 0
+        %111 = OpFOrdEqual %v3bool %109 %110
+        %112 = OpAll %bool %111
+        %113 = OpCompositeExtract %v3float %87 1
+        %114 = OpCompositeExtract %v3float %108 1
+        %115 = OpFOrdEqual %v3bool %113 %114
+        %116 = OpAll %bool %115
+        %117 = OpLogicalAnd %bool %112 %116
+               OpSelectionMerge %118 None
+               OpBranchConditional %117 %119 %120
+        %119 = OpLabel
+        %121 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+        %122 = OpLoad %int %121
+        %123 = OpConvertSToF %float %122
+        %124 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %125 = OpLoad %int %124
+        %126 = OpConvertSToF %float %125
+        %127 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %128 = OpLoad %int %127
+        %129 = OpConvertSToF %float %128
+        %130 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+        %131 = OpLoad %int %130
+        %132 = OpConvertSToF %float %131
+        %133 = OpCompositeConstruct %v4float %123 %126 %129 %132
+               OpStore %_GLF_color %133
+               OpBranch %118
+        %120 = OpLabel
+        %134 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %135 = OpLoad %int %134
+        %136 = OpConvertSToF %float %135
+        %137 = OpCompositeConstruct %v4float %136 %136 %136 %136
+               OpStore %_GLF_color %137
+               OpBranch %118
+        %118 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..a507a03
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,100 @@
+void set_float3(inout float3 vec, int idx, float val) {
+  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
+}
+
+cbuffer cbuffer_x_7 : register(b1, space0) {
+  uint4 x_7[2];
+};
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[4];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2x3 m23 = float2x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  int i = 0;
+  const float x_46 = asfloat(x_7[1].x);
+  m23 = float2x3(float3(x_46, 0.0f, 0.0f), float3(0.0f, x_46, 0.0f));
+  i = 1;
+  while (true) {
+    bool x_80 = false;
+    bool x_81_phi = false;
+    const int x_54 = i;
+    const int x_56 = asint(x_10[3].x);
+    if ((x_54 < x_56)) {
+    } else {
+      break;
+    }
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_60 = asint(x_10[scalar_offset / 4][scalar_offset % 4]);
+    const int x_62 = asint(x_10[2].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const float x_64 = asfloat(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const float x_66 = m23[x_60][x_62];
+    set_float3(m23[x_60], x_62, (x_66 + x_64));
+    const float x_70 = gl_FragCoord.y;
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const float x_72 = asfloat(x_7[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    if ((x_70 < x_72)) {
+    }
+    x_81_phi = true;
+    if (true) {
+      const float x_79 = gl_FragCoord.x;
+      x_80 = (x_79 < 0.0f);
+      x_81_phi = x_80;
+    }
+    if (!(x_81_phi)) {
+      break;
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  const float2x3 x_87 = m23;
+  const int x_89 = asint(x_10[1].x);
+  const int x_92 = asint(x_10[1].x);
+  const int x_95 = asint(x_10[1].x);
+  const int x_98 = asint(x_10[1].x);
+  const int x_101 = asint(x_10[1].x);
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const int x_104 = asint(x_10[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  const float2x3 x_108 = float2x3(float3(float(x_89), float(x_92), float(x_95)), float3(float(x_98), float(x_101), float(x_104)));
+  bool tint_tmp = all((x_87[0u] == x_108[0u]));
+  if (tint_tmp) {
+    tint_tmp = all((x_87[1u] == x_108[1u]));
+  }
+  if ((tint_tmp)) {
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_122 = asint(x_10[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const int x_125 = asint(x_10[1].x);
+    const int x_128 = asint(x_10[1].x);
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const int x_131 = asint(x_10[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    x_GLF_color = float4(float(x_122), float(x_125), float(x_128), float(x_131));
+  } else {
+    const int x_135 = asint(x_10[1].x);
+    const float x_136 = float(x_135);
+    x_GLF_color = float4(x_136, x_136, x_136, x_136);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..6b34014
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.spvasm.expected.msl
@@ -0,0 +1,101 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_7, constant buf0& x_10, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float2x3 m23 = float2x3(0.0f);
+  int i = 0;
+  float const x_46 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  m23 = float2x3(float3(x_46, 0.0f, 0.0f), float3(0.0f, x_46, 0.0f));
+  i = 1;
+  while (true) {
+    bool x_80 = false;
+    bool x_81_phi = false;
+    int const x_54 = i;
+    int const x_56 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    if ((x_54 < x_56)) {
+    } else {
+      break;
+    }
+    int const x_60 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    int const x_62 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    float const x_64 = x_7.x_GLF_uniform_float_values.arr[0].el;
+    float const x_66 = m23[x_60][x_62];
+    m23[x_60][x_62] = (x_66 + x_64);
+    float const x_70 = (*(tint_symbol_5)).y;
+    float const x_72 = x_7.x_GLF_uniform_float_values.arr[0].el;
+    if ((x_70 < x_72)) {
+    }
+    x_81_phi = true;
+    if (true) {
+      float const x_79 = (*(tint_symbol_5)).x;
+      x_80 = (x_79 < 0.0f);
+      x_81_phi = x_80;
+    }
+    bool const x_81 = x_81_phi;
+    if (!(x_81)) {
+      break;
+    }
+    {
+      int const x_85 = i;
+      i = (x_85 + 1);
+    }
+  }
+  float2x3 const x_87 = m23;
+  int const x_89 = x_10.x_GLF_uniform_int_values.arr[1].el;
+  int const x_92 = x_10.x_GLF_uniform_int_values.arr[1].el;
+  int const x_95 = x_10.x_GLF_uniform_int_values.arr[1].el;
+  int const x_98 = x_10.x_GLF_uniform_int_values.arr[1].el;
+  int const x_101 = x_10.x_GLF_uniform_int_values.arr[1].el;
+  int const x_104 = x_10.x_GLF_uniform_int_values.arr[0].el;
+  float2x3 const x_108 = float2x3(float3(float(x_89), float(x_92), float(x_95)), float3(float(x_98), float(x_101), float(x_104)));
+  if ((all((x_87[0u] == x_108[0u])) && all((x_87[1u] == x_108[1u])))) {
+    int const x_122 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    int const x_125 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_128 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_131 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_6) = float4(float(x_122), float(x_125), float(x_128), float(x_131));
+  } else {
+    int const x_135 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    float const x_136 = float(x_135);
+    *(tint_symbol_6) = float4(x_136, x_136, x_136, x_136);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf1& x_7 [[buffer(1)]], constant buf0& x_10 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_7, x_10, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..c421db8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,249 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 164
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_7 "x_7"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %m23 "m23"
+               OpName %i "i"
+               OpName %x_80 "x_80"
+               OpName %x_81_phi "x_81_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_7 = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %17
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+    %v3float = OpTypeVector %float 3
+%mat2v3float = OpTypeMatrix %v3float 2
+%_ptr_Function_mat2v3float = OpTypePointer Function %mat2v3float
+         %31 = OpConstantNull %mat2v3float
+%_ptr_Function_int = OpTypePointer Function %int
+         %34 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %51 = OpConstantNull %bool
+      %int_3 = OpConstant %int 3
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+       %true = OpConstantTrue %bool
+     %v3bool = OpTypeVector %bool 3
+   %main_out = OpTypeStruct %v4float
+        %151 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %23
+         %26 = OpLabel
+        %m23 = OpVariable %_ptr_Function_mat2v3float Function %31
+          %i = OpVariable %_ptr_Function_int Function %34
+       %x_80 = OpVariable %_ptr_Function_bool Function %51
+   %x_81_phi = OpVariable %_ptr_Function_bool Function %51
+         %38 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %39 = OpLoad %float %38
+         %41 = OpCompositeConstruct %v3float %39 %float_0 %float_0
+         %42 = OpCompositeConstruct %v3float %float_0 %39 %float_0
+         %43 = OpCompositeConstruct %mat2v3float %41 %42
+               OpStore %m23 %43
+               OpStore %i %int_1
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %53 = OpLoad %int %i
+         %56 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+         %57 = OpLoad %int %56
+         %58 = OpSLessThan %bool %53 %57
+               OpSelectionMerge %59 None
+               OpBranchConditional %58 %60 %61
+         %60 = OpLabel
+               OpBranch %59
+         %61 = OpLabel
+               OpBranch %45
+         %59 = OpLabel
+         %63 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %64 = OpLoad %int %63
+         %66 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+         %67 = OpLoad %int %66
+         %68 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %69 = OpLoad %float %68
+         %71 = OpAccessChain %_ptr_Function_float %m23 %64 %67
+         %72 = OpLoad %float %71
+         %73 = OpAccessChain %_ptr_Function_float %m23 %64 %67
+         %74 = OpFAdd %float %72 %69
+               OpStore %73 %74
+         %77 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %78 = OpLoad %float %77
+         %79 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %80 = OpLoad %float %79
+         %81 = OpFOrdLessThan %bool %78 %80
+               OpSelectionMerge %82 None
+               OpBranchConditional %81 %83 %82
+         %83 = OpLabel
+               OpBranch %82
+         %82 = OpLabel
+               OpStore %x_81_phi %true
+               OpSelectionMerge %85 None
+               OpBranchConditional %true %86 %85
+         %86 = OpLabel
+         %87 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %88 = OpLoad %float %87
+         %89 = OpFOrdLessThan %bool %88 %float_0
+               OpStore %x_80 %89
+         %90 = OpLoad %bool %x_80
+               OpStore %x_81_phi %90
+               OpBranch %85
+         %85 = OpLabel
+         %91 = OpLoad %bool %x_81_phi
+         %92 = OpLogicalNot %bool %91
+               OpSelectionMerge %93 None
+               OpBranchConditional %92 %94 %93
+         %94 = OpLabel
+               OpBranch %45
+         %93 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+         %95 = OpLoad %int %i
+         %96 = OpIAdd %int %95 %int_1
+               OpStore %i %96
+               OpBranch %44
+         %45 = OpLabel
+         %97 = OpLoad %mat2v3float %m23
+         %98 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %99 = OpLoad %int %98
+        %100 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %101 = OpLoad %int %100
+        %102 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %103 = OpLoad %int %102
+        %104 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %105 = OpLoad %int %104
+        %106 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %107 = OpLoad %int %106
+        %108 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %109 = OpLoad %int %108
+        %110 = OpConvertSToF %float %99
+        %111 = OpConvertSToF %float %101
+        %112 = OpConvertSToF %float %103
+        %113 = OpCompositeConstruct %v3float %110 %111 %112
+        %114 = OpConvertSToF %float %105
+        %115 = OpConvertSToF %float %107
+        %116 = OpConvertSToF %float %109
+        %117 = OpCompositeConstruct %v3float %114 %115 %116
+        %118 = OpCompositeConstruct %mat2v3float %113 %117
+        %120 = OpCompositeExtract %v3float %97 0
+        %121 = OpCompositeExtract %v3float %118 0
+        %122 = OpFOrdEqual %v3bool %120 %121
+        %119 = OpAll %bool %122
+               OpSelectionMerge %124 None
+               OpBranchConditional %119 %125 %124
+        %125 = OpLabel
+        %127 = OpCompositeExtract %v3float %97 1
+        %128 = OpCompositeExtract %v3float %118 1
+        %129 = OpFOrdEqual %v3bool %127 %128
+        %126 = OpAll %bool %129
+               OpBranch %124
+        %124 = OpLabel
+        %130 = OpPhi %bool %119 %45 %126 %125
+               OpSelectionMerge %131 None
+               OpBranchConditional %130 %132 %133
+        %132 = OpLabel
+        %134 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %135 = OpLoad %int %134
+        %136 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %137 = OpLoad %int %136
+        %138 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %139 = OpLoad %int %138
+        %140 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %141 = OpLoad %int %140
+        %142 = OpConvertSToF %float %135
+        %143 = OpConvertSToF %float %137
+        %144 = OpConvertSToF %float %139
+        %145 = OpConvertSToF %float %141
+        %146 = OpCompositeConstruct %v4float %142 %143 %144 %145
+               OpStore %x_GLF_color %146
+               OpBranch %131
+        %133 = OpLabel
+        %147 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %148 = OpLoad %int %147
+        %149 = OpConvertSToF %float %148
+        %150 = OpCompositeConstruct %v4float %149 %149 %149 %149
+               OpStore %x_GLF_color %150
+               OpBranch %131
+        %131 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %151
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %155 = OpLabel
+        %156 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %156
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %23
+        %158 = OpLabel
+        %159 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %159
+        %160 = OpFunctionCall %void %main_1
+        %162 = OpLoad %v4float %x_GLF_color
+        %163 = OpCompositeConstruct %main_out %162
+        %161 = OpFunctionCall %void %tint_symbol_3 %163
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..b9b8a36
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,95 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m23 : mat2x3<f32>;
+  var i : i32;
+  let x_46 : f32 = x_7.x_GLF_uniform_float_values[1];
+  m23 = mat2x3<f32>(vec3<f32>(x_46, 0.0, 0.0), vec3<f32>(0.0, x_46, 0.0));
+  i = 1;
+  loop {
+    var x_80 : bool;
+    var x_81_phi : bool;
+    let x_54 : i32 = i;
+    let x_56 : i32 = x_10.x_GLF_uniform_int_values[3];
+    if ((x_54 < x_56)) {
+    } else {
+      break;
+    }
+    let x_60 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_62 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_64 : f32 = x_7.x_GLF_uniform_float_values[0];
+    let x_66 : f32 = m23[x_60][x_62];
+    m23[x_60][x_62] = (x_66 + x_64);
+    let x_70 : f32 = gl_FragCoord.y;
+    let x_72 : f32 = x_7.x_GLF_uniform_float_values[0];
+    if ((x_70 < x_72)) {
+    }
+    x_81_phi = true;
+    if (true) {
+      let x_79 : f32 = gl_FragCoord.x;
+      x_80 = (x_79 < 0.0);
+      x_81_phi = x_80;
+    }
+    let x_81 : bool = x_81_phi;
+    if (!(x_81)) {
+      break;
+    }
+
+    continuing {
+      let x_85 : i32 = i;
+      i = (x_85 + 1);
+    }
+  }
+  let x_87 : mat2x3<f32> = m23;
+  let x_89 : i32 = x_10.x_GLF_uniform_int_values[1];
+  let x_92 : i32 = x_10.x_GLF_uniform_int_values[1];
+  let x_95 : i32 = x_10.x_GLF_uniform_int_values[1];
+  let x_98 : i32 = x_10.x_GLF_uniform_int_values[1];
+  let x_101 : i32 = x_10.x_GLF_uniform_int_values[1];
+  let x_104 : i32 = x_10.x_GLF_uniform_int_values[0];
+  let x_108 : mat2x3<f32> = mat2x3<f32>(vec3<f32>(f32(x_89), f32(x_92), f32(x_95)), vec3<f32>(f32(x_98), f32(x_101), f32(x_104)));
+  if ((all((x_87[0u] == x_108[0u])) && all((x_87[1u] == x_108[1u])))) {
+    let x_122 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_125 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_128 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_131 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_122), f32(x_125), f32(x_128), f32(x_131));
+  } else {
+    let x_135 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_136 : f32 = f32(x_135);
+    x_GLF_color = vec4<f32>(x_136, x_136, x_136, x_136);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.wgsl
new file mode 100644
index 0000000..b9b8a36
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.wgsl
@@ -0,0 +1,95 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m23 : mat2x3<f32>;
+  var i : i32;
+  let x_46 : f32 = x_7.x_GLF_uniform_float_values[1];
+  m23 = mat2x3<f32>(vec3<f32>(x_46, 0.0, 0.0), vec3<f32>(0.0, x_46, 0.0));
+  i = 1;
+  loop {
+    var x_80 : bool;
+    var x_81_phi : bool;
+    let x_54 : i32 = i;
+    let x_56 : i32 = x_10.x_GLF_uniform_int_values[3];
+    if ((x_54 < x_56)) {
+    } else {
+      break;
+    }
+    let x_60 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_62 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_64 : f32 = x_7.x_GLF_uniform_float_values[0];
+    let x_66 : f32 = m23[x_60][x_62];
+    m23[x_60][x_62] = (x_66 + x_64);
+    let x_70 : f32 = gl_FragCoord.y;
+    let x_72 : f32 = x_7.x_GLF_uniform_float_values[0];
+    if ((x_70 < x_72)) {
+    }
+    x_81_phi = true;
+    if (true) {
+      let x_79 : f32 = gl_FragCoord.x;
+      x_80 = (x_79 < 0.0);
+      x_81_phi = x_80;
+    }
+    let x_81 : bool = x_81_phi;
+    if (!(x_81)) {
+      break;
+    }
+
+    continuing {
+      let x_85 : i32 = i;
+      i = (x_85 + 1);
+    }
+  }
+  let x_87 : mat2x3<f32> = m23;
+  let x_89 : i32 = x_10.x_GLF_uniform_int_values[1];
+  let x_92 : i32 = x_10.x_GLF_uniform_int_values[1];
+  let x_95 : i32 = x_10.x_GLF_uniform_int_values[1];
+  let x_98 : i32 = x_10.x_GLF_uniform_int_values[1];
+  let x_101 : i32 = x_10.x_GLF_uniform_int_values[1];
+  let x_104 : i32 = x_10.x_GLF_uniform_int_values[0];
+  let x_108 : mat2x3<f32> = mat2x3<f32>(vec3<f32>(f32(x_89), f32(x_92), f32(x_95)), vec3<f32>(f32(x_98), f32(x_101), f32(x_104)));
+  if ((all((x_87[0u] == x_108[0u])) && all((x_87[1u] == x_108[1u])))) {
+    let x_122 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_125 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_128 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_131 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_122), f32(x_125), f32(x_128), f32(x_131));
+  } else {
+    let x_135 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_136 : f32 = f32(x_135);
+    x_GLF_color = vec4<f32>(x_136, x_136, x_136, x_136);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..a507a03
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,100 @@
+void set_float3(inout float3 vec, int idx, float val) {
+  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
+}
+
+cbuffer cbuffer_x_7 : register(b1, space0) {
+  uint4 x_7[2];
+};
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[4];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2x3 m23 = float2x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  int i = 0;
+  const float x_46 = asfloat(x_7[1].x);
+  m23 = float2x3(float3(x_46, 0.0f, 0.0f), float3(0.0f, x_46, 0.0f));
+  i = 1;
+  while (true) {
+    bool x_80 = false;
+    bool x_81_phi = false;
+    const int x_54 = i;
+    const int x_56 = asint(x_10[3].x);
+    if ((x_54 < x_56)) {
+    } else {
+      break;
+    }
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_60 = asint(x_10[scalar_offset / 4][scalar_offset % 4]);
+    const int x_62 = asint(x_10[2].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const float x_64 = asfloat(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const float x_66 = m23[x_60][x_62];
+    set_float3(m23[x_60], x_62, (x_66 + x_64));
+    const float x_70 = gl_FragCoord.y;
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const float x_72 = asfloat(x_7[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    if ((x_70 < x_72)) {
+    }
+    x_81_phi = true;
+    if (true) {
+      const float x_79 = gl_FragCoord.x;
+      x_80 = (x_79 < 0.0f);
+      x_81_phi = x_80;
+    }
+    if (!(x_81_phi)) {
+      break;
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  const float2x3 x_87 = m23;
+  const int x_89 = asint(x_10[1].x);
+  const int x_92 = asint(x_10[1].x);
+  const int x_95 = asint(x_10[1].x);
+  const int x_98 = asint(x_10[1].x);
+  const int x_101 = asint(x_10[1].x);
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const int x_104 = asint(x_10[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  const float2x3 x_108 = float2x3(float3(float(x_89), float(x_92), float(x_95)), float3(float(x_98), float(x_101), float(x_104)));
+  bool tint_tmp = all((x_87[0u] == x_108[0u]));
+  if (tint_tmp) {
+    tint_tmp = all((x_87[1u] == x_108[1u]));
+  }
+  if ((tint_tmp)) {
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_122 = asint(x_10[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const int x_125 = asint(x_10[1].x);
+    const int x_128 = asint(x_10[1].x);
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const int x_131 = asint(x_10[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    x_GLF_color = float4(float(x_122), float(x_125), float(x_128), float(x_131));
+  } else {
+    const int x_135 = asint(x_10[1].x);
+    const float x_136 = float(x_135);
+    x_GLF_color = float4(x_136, x_136, x_136, x_136);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..6b34014
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.wgsl.expected.msl
@@ -0,0 +1,101 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_7, constant buf0& x_10, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float2x3 m23 = float2x3(0.0f);
+  int i = 0;
+  float const x_46 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  m23 = float2x3(float3(x_46, 0.0f, 0.0f), float3(0.0f, x_46, 0.0f));
+  i = 1;
+  while (true) {
+    bool x_80 = false;
+    bool x_81_phi = false;
+    int const x_54 = i;
+    int const x_56 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    if ((x_54 < x_56)) {
+    } else {
+      break;
+    }
+    int const x_60 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    int const x_62 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    float const x_64 = x_7.x_GLF_uniform_float_values.arr[0].el;
+    float const x_66 = m23[x_60][x_62];
+    m23[x_60][x_62] = (x_66 + x_64);
+    float const x_70 = (*(tint_symbol_5)).y;
+    float const x_72 = x_7.x_GLF_uniform_float_values.arr[0].el;
+    if ((x_70 < x_72)) {
+    }
+    x_81_phi = true;
+    if (true) {
+      float const x_79 = (*(tint_symbol_5)).x;
+      x_80 = (x_79 < 0.0f);
+      x_81_phi = x_80;
+    }
+    bool const x_81 = x_81_phi;
+    if (!(x_81)) {
+      break;
+    }
+    {
+      int const x_85 = i;
+      i = (x_85 + 1);
+    }
+  }
+  float2x3 const x_87 = m23;
+  int const x_89 = x_10.x_GLF_uniform_int_values.arr[1].el;
+  int const x_92 = x_10.x_GLF_uniform_int_values.arr[1].el;
+  int const x_95 = x_10.x_GLF_uniform_int_values.arr[1].el;
+  int const x_98 = x_10.x_GLF_uniform_int_values.arr[1].el;
+  int const x_101 = x_10.x_GLF_uniform_int_values.arr[1].el;
+  int const x_104 = x_10.x_GLF_uniform_int_values.arr[0].el;
+  float2x3 const x_108 = float2x3(float3(float(x_89), float(x_92), float(x_95)), float3(float(x_98), float(x_101), float(x_104)));
+  if ((all((x_87[0u] == x_108[0u])) && all((x_87[1u] == x_108[1u])))) {
+    int const x_122 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    int const x_125 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_128 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_131 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_6) = float4(float(x_122), float(x_125), float(x_128), float(x_131));
+  } else {
+    int const x_135 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    float const x_136 = float(x_135);
+    *(tint_symbol_6) = float4(x_136, x_136, x_136, x_136);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf1& x_7 [[buffer(1)]], constant buf0& x_10 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_7, x_10, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..c421db8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,249 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 164
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_7 "x_7"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %m23 "m23"
+               OpName %i "i"
+               OpName %x_80 "x_80"
+               OpName %x_81_phi "x_81_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_7 = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %17
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+    %v3float = OpTypeVector %float 3
+%mat2v3float = OpTypeMatrix %v3float 2
+%_ptr_Function_mat2v3float = OpTypePointer Function %mat2v3float
+         %31 = OpConstantNull %mat2v3float
+%_ptr_Function_int = OpTypePointer Function %int
+         %34 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %51 = OpConstantNull %bool
+      %int_3 = OpConstant %int 3
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+       %true = OpConstantTrue %bool
+     %v3bool = OpTypeVector %bool 3
+   %main_out = OpTypeStruct %v4float
+        %151 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %23
+         %26 = OpLabel
+        %m23 = OpVariable %_ptr_Function_mat2v3float Function %31
+          %i = OpVariable %_ptr_Function_int Function %34
+       %x_80 = OpVariable %_ptr_Function_bool Function %51
+   %x_81_phi = OpVariable %_ptr_Function_bool Function %51
+         %38 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %39 = OpLoad %float %38
+         %41 = OpCompositeConstruct %v3float %39 %float_0 %float_0
+         %42 = OpCompositeConstruct %v3float %float_0 %39 %float_0
+         %43 = OpCompositeConstruct %mat2v3float %41 %42
+               OpStore %m23 %43
+               OpStore %i %int_1
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %53 = OpLoad %int %i
+         %56 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+         %57 = OpLoad %int %56
+         %58 = OpSLessThan %bool %53 %57
+               OpSelectionMerge %59 None
+               OpBranchConditional %58 %60 %61
+         %60 = OpLabel
+               OpBranch %59
+         %61 = OpLabel
+               OpBranch %45
+         %59 = OpLabel
+         %63 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %64 = OpLoad %int %63
+         %66 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+         %67 = OpLoad %int %66
+         %68 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %69 = OpLoad %float %68
+         %71 = OpAccessChain %_ptr_Function_float %m23 %64 %67
+         %72 = OpLoad %float %71
+         %73 = OpAccessChain %_ptr_Function_float %m23 %64 %67
+         %74 = OpFAdd %float %72 %69
+               OpStore %73 %74
+         %77 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %78 = OpLoad %float %77
+         %79 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %80 = OpLoad %float %79
+         %81 = OpFOrdLessThan %bool %78 %80
+               OpSelectionMerge %82 None
+               OpBranchConditional %81 %83 %82
+         %83 = OpLabel
+               OpBranch %82
+         %82 = OpLabel
+               OpStore %x_81_phi %true
+               OpSelectionMerge %85 None
+               OpBranchConditional %true %86 %85
+         %86 = OpLabel
+         %87 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %88 = OpLoad %float %87
+         %89 = OpFOrdLessThan %bool %88 %float_0
+               OpStore %x_80 %89
+         %90 = OpLoad %bool %x_80
+               OpStore %x_81_phi %90
+               OpBranch %85
+         %85 = OpLabel
+         %91 = OpLoad %bool %x_81_phi
+         %92 = OpLogicalNot %bool %91
+               OpSelectionMerge %93 None
+               OpBranchConditional %92 %94 %93
+         %94 = OpLabel
+               OpBranch %45
+         %93 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+         %95 = OpLoad %int %i
+         %96 = OpIAdd %int %95 %int_1
+               OpStore %i %96
+               OpBranch %44
+         %45 = OpLabel
+         %97 = OpLoad %mat2v3float %m23
+         %98 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %99 = OpLoad %int %98
+        %100 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %101 = OpLoad %int %100
+        %102 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %103 = OpLoad %int %102
+        %104 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %105 = OpLoad %int %104
+        %106 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %107 = OpLoad %int %106
+        %108 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %109 = OpLoad %int %108
+        %110 = OpConvertSToF %float %99
+        %111 = OpConvertSToF %float %101
+        %112 = OpConvertSToF %float %103
+        %113 = OpCompositeConstruct %v3float %110 %111 %112
+        %114 = OpConvertSToF %float %105
+        %115 = OpConvertSToF %float %107
+        %116 = OpConvertSToF %float %109
+        %117 = OpCompositeConstruct %v3float %114 %115 %116
+        %118 = OpCompositeConstruct %mat2v3float %113 %117
+        %120 = OpCompositeExtract %v3float %97 0
+        %121 = OpCompositeExtract %v3float %118 0
+        %122 = OpFOrdEqual %v3bool %120 %121
+        %119 = OpAll %bool %122
+               OpSelectionMerge %124 None
+               OpBranchConditional %119 %125 %124
+        %125 = OpLabel
+        %127 = OpCompositeExtract %v3float %97 1
+        %128 = OpCompositeExtract %v3float %118 1
+        %129 = OpFOrdEqual %v3bool %127 %128
+        %126 = OpAll %bool %129
+               OpBranch %124
+        %124 = OpLabel
+        %130 = OpPhi %bool %119 %45 %126 %125
+               OpSelectionMerge %131 None
+               OpBranchConditional %130 %132 %133
+        %132 = OpLabel
+        %134 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %135 = OpLoad %int %134
+        %136 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %137 = OpLoad %int %136
+        %138 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %139 = OpLoad %int %138
+        %140 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %141 = OpLoad %int %140
+        %142 = OpConvertSToF %float %135
+        %143 = OpConvertSToF %float %137
+        %144 = OpConvertSToF %float %139
+        %145 = OpConvertSToF %float %141
+        %146 = OpCompositeConstruct %v4float %142 %143 %144 %145
+               OpStore %x_GLF_color %146
+               OpBranch %131
+        %133 = OpLabel
+        %147 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %148 = OpLoad %int %147
+        %149 = OpConvertSToF %float %148
+        %150 = OpCompositeConstruct %v4float %149 %149 %149 %149
+               OpStore %x_GLF_color %150
+               OpBranch %131
+        %131 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %151
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %155 = OpLabel
+        %156 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %156
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %23
+        %158 = OpLabel
+        %159 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %159
+        %160 = OpFunctionCall %void %main_1
+        %162 = OpLoad %v4float %x_GLF_color
+        %163 = OpCompositeConstruct %main_out %162
+        %161 = OpFunctionCall %void %tint_symbol_3 %163
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..b9b8a36
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,95 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m23 : mat2x3<f32>;
+  var i : i32;
+  let x_46 : f32 = x_7.x_GLF_uniform_float_values[1];
+  m23 = mat2x3<f32>(vec3<f32>(x_46, 0.0, 0.0), vec3<f32>(0.0, x_46, 0.0));
+  i = 1;
+  loop {
+    var x_80 : bool;
+    var x_81_phi : bool;
+    let x_54 : i32 = i;
+    let x_56 : i32 = x_10.x_GLF_uniform_int_values[3];
+    if ((x_54 < x_56)) {
+    } else {
+      break;
+    }
+    let x_60 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_62 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_64 : f32 = x_7.x_GLF_uniform_float_values[0];
+    let x_66 : f32 = m23[x_60][x_62];
+    m23[x_60][x_62] = (x_66 + x_64);
+    let x_70 : f32 = gl_FragCoord.y;
+    let x_72 : f32 = x_7.x_GLF_uniform_float_values[0];
+    if ((x_70 < x_72)) {
+    }
+    x_81_phi = true;
+    if (true) {
+      let x_79 : f32 = gl_FragCoord.x;
+      x_80 = (x_79 < 0.0);
+      x_81_phi = x_80;
+    }
+    let x_81 : bool = x_81_phi;
+    if (!(x_81)) {
+      break;
+    }
+
+    continuing {
+      let x_85 : i32 = i;
+      i = (x_85 + 1);
+    }
+  }
+  let x_87 : mat2x3<f32> = m23;
+  let x_89 : i32 = x_10.x_GLF_uniform_int_values[1];
+  let x_92 : i32 = x_10.x_GLF_uniform_int_values[1];
+  let x_95 : i32 = x_10.x_GLF_uniform_int_values[1];
+  let x_98 : i32 = x_10.x_GLF_uniform_int_values[1];
+  let x_101 : i32 = x_10.x_GLF_uniform_int_values[1];
+  let x_104 : i32 = x_10.x_GLF_uniform_int_values[0];
+  let x_108 : mat2x3<f32> = mat2x3<f32>(vec3<f32>(f32(x_89), f32(x_92), f32(x_95)), vec3<f32>(f32(x_98), f32(x_101), f32(x_104)));
+  if ((all((x_87[0u] == x_108[0u])) && all((x_87[1u] == x_108[1u])))) {
+    let x_122 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_125 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_128 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_131 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_122), f32(x_125), f32(x_128), f32(x_131));
+  } else {
+    let x_135 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_136 : f32 = f32(x_135);
+    x_GLF_color = vec4<f32>(x_136, x_136, x_136, x_136);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-or-divide-by-loop-index/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-or-divide-by-loop-index/0-opt.spvasm
new file mode 100644
index 0000000..5022161
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-or-divide-by-loop-index/0-opt.spvasm
@@ -0,0 +1,113 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+      %int_3 = OpConstant %int 3
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %10
+         %25 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+         %26 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %27 = OpLoad %int %26
+               OpStore %a %27
+               OpStore %i %int_0
+               OpBranch %28
+         %28 = OpLabel
+               OpLoopMerge %29 %30 None
+               OpBranch %31
+         %31 = OpLabel
+         %32 = OpLoad %int %i
+         %33 = OpSLessThan %bool %32 %int_3
+               OpBranchConditional %33 %34 %29
+         %34 = OpLabel
+         %35 = OpLoad %int %i
+         %36 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %37 = OpLoad %int %36
+         %38 = OpIEqual %bool %35 %37
+               OpSelectionMerge %39 None
+               OpBranchConditional %38 %40 %41
+         %40 = OpLabel
+         %42 = OpLoad %int %a
+         %43 = OpIAdd %int %42 %int_1
+               OpStore %a %43
+               OpBranch %39
+         %41 = OpLabel
+         %44 = OpLoad %int %a
+         %45 = OpLoad %int %i
+         %46 = OpSDiv %int %44 %45
+               OpStore %a %46
+               OpBranch %39
+         %39 = OpLabel
+               OpBranch %30
+         %30 = OpLabel
+         %47 = OpLoad %int %i
+         %48 = OpIAdd %int %47 %int_1
+               OpStore %i %48
+               OpBranch %28
+         %29 = OpLabel
+         %49 = OpLoad %int %a
+         %50 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %51 = OpLoad %int %50
+         %52 = OpIEqual %bool %49 %51
+               OpSelectionMerge %53 None
+               OpBranchConditional %52 %54 %55
+         %54 = OpLabel
+         %56 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %57 = OpLoad %int %56
+         %58 = OpConvertSToF %float %57
+         %59 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %60 = OpLoad %int %59
+         %61 = OpConvertSToF %float %60
+         %62 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %63 = OpLoad %int %62
+         %64 = OpConvertSToF %float %63
+         %65 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %66 = OpLoad %int %65
+         %67 = OpConvertSToF %float %66
+         %68 = OpCompositeConstruct %v4float %58 %61 %64 %67
+               OpStore %_GLF_color %68
+               OpBranch %53
+         %55 = OpLabel
+         %69 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %70 = OpLoad %int %69
+         %71 = OpConvertSToF %float %70
+         %72 = OpCompositeConstruct %v4float %71 %71 %71 %71
+               OpStore %_GLF_color %72
+               OpBranch %53
+         %53 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-or-divide-by-loop-index/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-or-divide-by-loop-index/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..000228a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-or-divide-by-loop-index/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,53 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  int i = 0;
+  const int x_27 = asint(x_6[3].x);
+  a = x_27;
+  i = 0;
+  {
+    for(; (i < 3); i = (i + 1)) {
+      const int x_35 = i;
+      const int x_37 = asint(x_6[1].x);
+      if ((x_35 == x_37)) {
+        a = (a + 1);
+      } else {
+        a = (a / i);
+      }
+    }
+  }
+  const int x_49 = a;
+  const int x_51 = asint(x_6[2].x);
+  if ((x_49 == x_51)) {
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_57 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+    const int x_60 = asint(x_6[1].x);
+    const int x_63 = asint(x_6[1].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_66 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    x_GLF_color = float4(float(x_57), float(x_60), float(x_63), float(x_66));
+  } else {
+    const int x_70 = asint(x_6[1].x);
+    const float x_71 = float(x_70);
+    x_GLF_color = float4(x_71, x_71, x_71, x_71);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-or-divide-by-loop-index/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-or-divide-by-loop-index/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..20ea637
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-or-divide-by-loop-index/0-opt.spvasm.expected.msl
@@ -0,0 +1,71 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int i = 0;
+  int const x_27 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  a = x_27;
+  i = 0;
+  while (true) {
+    int const x_32 = i;
+    if ((x_32 < 3)) {
+    } else {
+      break;
+    }
+    int const x_35 = i;
+    int const x_37 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    if ((x_35 == x_37)) {
+      int const x_42 = a;
+      a = (x_42 + 1);
+    } else {
+      int const x_44 = a;
+      int const x_45 = i;
+      a = (x_44 / x_45);
+    }
+    {
+      int const x_47 = i;
+      i = (x_47 + 1);
+    }
+  }
+  int const x_49 = a;
+  int const x_51 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  if ((x_49 == x_51)) {
+    int const x_57 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_60 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_63 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_66 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_57), float(x_60), float(x_63), float(x_66));
+  } else {
+    int const x_70 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    float const x_71 = float(x_70);
+    *(tint_symbol_4) = float4(x_71, x_71, x_71, x_71);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-or-divide-by-loop-index/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-or-divide-by-loop-index/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..2c80162
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-or-divide-by-loop-index/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,151 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 91
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_3 = OpConstant %int 3
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+         %79 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+          %i = OpVariable %_ptr_Function_int Function %21
+         %26 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %27 = OpLoad %int %26
+               OpStore %a %27
+               OpStore %i %int_0
+               OpBranch %29
+         %29 = OpLabel
+               OpLoopMerge %30 %31 None
+               OpBranch %32
+         %32 = OpLabel
+         %33 = OpLoad %int %i
+         %34 = OpSLessThan %bool %33 %int_3
+               OpSelectionMerge %36 None
+               OpBranchConditional %34 %37 %38
+         %37 = OpLabel
+               OpBranch %36
+         %38 = OpLabel
+               OpBranch %30
+         %36 = OpLabel
+         %39 = OpLoad %int %i
+         %41 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %42 = OpLoad %int %41
+         %43 = OpIEqual %bool %39 %42
+               OpSelectionMerge %44 None
+               OpBranchConditional %43 %45 %46
+         %45 = OpLabel
+         %47 = OpLoad %int %a
+         %48 = OpIAdd %int %47 %int_1
+               OpStore %a %48
+               OpBranch %44
+         %46 = OpLabel
+         %49 = OpLoad %int %a
+         %50 = OpLoad %int %i
+         %51 = OpSDiv %int %49 %50
+               OpStore %a %51
+               OpBranch %44
+         %44 = OpLabel
+               OpBranch %31
+         %31 = OpLabel
+         %52 = OpLoad %int %i
+         %53 = OpIAdd %int %52 %int_1
+               OpStore %i %53
+               OpBranch %29
+         %30 = OpLabel
+         %54 = OpLoad %int %a
+         %56 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %57 = OpLoad %int %56
+         %58 = OpIEqual %bool %54 %57
+               OpSelectionMerge %59 None
+               OpBranchConditional %58 %60 %61
+         %60 = OpLabel
+         %62 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %63 = OpLoad %int %62
+         %64 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %65 = OpLoad %int %64
+         %66 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %67 = OpLoad %int %66
+         %68 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %69 = OpLoad %int %68
+         %70 = OpConvertSToF %float %63
+         %71 = OpConvertSToF %float %65
+         %72 = OpConvertSToF %float %67
+         %73 = OpConvertSToF %float %69
+         %74 = OpCompositeConstruct %v4float %70 %71 %72 %73
+               OpStore %x_GLF_color %74
+               OpBranch %59
+         %61 = OpLabel
+         %75 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %76 = OpLoad %int %75
+         %77 = OpConvertSToF %float %76
+         %78 = OpCompositeConstruct %v4float %77 %77 %77 %77
+               OpStore %x_GLF_color %78
+               OpBranch %59
+         %59 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %79
+%tint_symbol = OpFunctionParameter %main_out
+         %83 = OpLabel
+         %84 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %84
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %86 = OpLabel
+         %87 = OpFunctionCall %void %main_1
+         %89 = OpLoad %v4float %x_GLF_color
+         %90 = OpCompositeConstruct %main_out %89
+         %88 = OpFunctionCall %void %tint_symbol_2 %90
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-or-divide-by-loop-index/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-or-divide-by-loop-index/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..5615de9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-or-divide-by-loop-index/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,65 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  let x_27 : i32 = x_6.x_GLF_uniform_int_values[3];
+  a = x_27;
+  i = 0;
+  loop {
+    let x_32 : i32 = i;
+    if ((x_32 < 3)) {
+    } else {
+      break;
+    }
+    let x_35 : i32 = i;
+    let x_37 : i32 = x_6.x_GLF_uniform_int_values[1];
+    if ((x_35 == x_37)) {
+      let x_42 : i32 = a;
+      a = (x_42 + 1);
+    } else {
+      let x_44 : i32 = a;
+      let x_45 : i32 = i;
+      a = (x_44 / x_45);
+    }
+
+    continuing {
+      let x_47 : i32 = i;
+      i = (x_47 + 1);
+    }
+  }
+  let x_49 : i32 = a;
+  let x_51 : i32 = x_6.x_GLF_uniform_int_values[2];
+  if ((x_49 == x_51)) {
+    let x_57 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_60 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_63 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_66 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_57), f32(x_60), f32(x_63), f32(x_66));
+  } else {
+    let x_70 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_71 : f32 = f32(x_70);
+    x_GLF_color = vec4<f32>(x_71, x_71, x_71, x_71);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-or-divide-by-loop-index/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-or-divide-by-loop-index/0-opt.wgsl
new file mode 100644
index 0000000..5615de9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-or-divide-by-loop-index/0-opt.wgsl
@@ -0,0 +1,65 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  let x_27 : i32 = x_6.x_GLF_uniform_int_values[3];
+  a = x_27;
+  i = 0;
+  loop {
+    let x_32 : i32 = i;
+    if ((x_32 < 3)) {
+    } else {
+      break;
+    }
+    let x_35 : i32 = i;
+    let x_37 : i32 = x_6.x_GLF_uniform_int_values[1];
+    if ((x_35 == x_37)) {
+      let x_42 : i32 = a;
+      a = (x_42 + 1);
+    } else {
+      let x_44 : i32 = a;
+      let x_45 : i32 = i;
+      a = (x_44 / x_45);
+    }
+
+    continuing {
+      let x_47 : i32 = i;
+      i = (x_47 + 1);
+    }
+  }
+  let x_49 : i32 = a;
+  let x_51 : i32 = x_6.x_GLF_uniform_int_values[2];
+  if ((x_49 == x_51)) {
+    let x_57 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_60 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_63 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_66 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_57), f32(x_60), f32(x_63), f32(x_66));
+  } else {
+    let x_70 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_71 : f32 = f32(x_70);
+    x_GLF_color = vec4<f32>(x_71, x_71, x_71, x_71);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-or-divide-by-loop-index/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-or-divide-by-loop-index/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..000228a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-or-divide-by-loop-index/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,53 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  int i = 0;
+  const int x_27 = asint(x_6[3].x);
+  a = x_27;
+  i = 0;
+  {
+    for(; (i < 3); i = (i + 1)) {
+      const int x_35 = i;
+      const int x_37 = asint(x_6[1].x);
+      if ((x_35 == x_37)) {
+        a = (a + 1);
+      } else {
+        a = (a / i);
+      }
+    }
+  }
+  const int x_49 = a;
+  const int x_51 = asint(x_6[2].x);
+  if ((x_49 == x_51)) {
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_57 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+    const int x_60 = asint(x_6[1].x);
+    const int x_63 = asint(x_6[1].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_66 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    x_GLF_color = float4(float(x_57), float(x_60), float(x_63), float(x_66));
+  } else {
+    const int x_70 = asint(x_6[1].x);
+    const float x_71 = float(x_70);
+    x_GLF_color = float4(x_71, x_71, x_71, x_71);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-or-divide-by-loop-index/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-or-divide-by-loop-index/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..20ea637
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-or-divide-by-loop-index/0-opt.wgsl.expected.msl
@@ -0,0 +1,71 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int i = 0;
+  int const x_27 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  a = x_27;
+  i = 0;
+  while (true) {
+    int const x_32 = i;
+    if ((x_32 < 3)) {
+    } else {
+      break;
+    }
+    int const x_35 = i;
+    int const x_37 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    if ((x_35 == x_37)) {
+      int const x_42 = a;
+      a = (x_42 + 1);
+    } else {
+      int const x_44 = a;
+      int const x_45 = i;
+      a = (x_44 / x_45);
+    }
+    {
+      int const x_47 = i;
+      i = (x_47 + 1);
+    }
+  }
+  int const x_49 = a;
+  int const x_51 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  if ((x_49 == x_51)) {
+    int const x_57 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_60 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_63 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_66 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_57), float(x_60), float(x_63), float(x_66));
+  } else {
+    int const x_70 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    float const x_71 = float(x_70);
+    *(tint_symbol_4) = float4(x_71, x_71, x_71, x_71);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-or-divide-by-loop-index/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-or-divide-by-loop-index/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..2c80162
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-or-divide-by-loop-index/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,151 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 91
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_3 = OpConstant %int 3
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+         %79 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+          %i = OpVariable %_ptr_Function_int Function %21
+         %26 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %27 = OpLoad %int %26
+               OpStore %a %27
+               OpStore %i %int_0
+               OpBranch %29
+         %29 = OpLabel
+               OpLoopMerge %30 %31 None
+               OpBranch %32
+         %32 = OpLabel
+         %33 = OpLoad %int %i
+         %34 = OpSLessThan %bool %33 %int_3
+               OpSelectionMerge %36 None
+               OpBranchConditional %34 %37 %38
+         %37 = OpLabel
+               OpBranch %36
+         %38 = OpLabel
+               OpBranch %30
+         %36 = OpLabel
+         %39 = OpLoad %int %i
+         %41 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %42 = OpLoad %int %41
+         %43 = OpIEqual %bool %39 %42
+               OpSelectionMerge %44 None
+               OpBranchConditional %43 %45 %46
+         %45 = OpLabel
+         %47 = OpLoad %int %a
+         %48 = OpIAdd %int %47 %int_1
+               OpStore %a %48
+               OpBranch %44
+         %46 = OpLabel
+         %49 = OpLoad %int %a
+         %50 = OpLoad %int %i
+         %51 = OpSDiv %int %49 %50
+               OpStore %a %51
+               OpBranch %44
+         %44 = OpLabel
+               OpBranch %31
+         %31 = OpLabel
+         %52 = OpLoad %int %i
+         %53 = OpIAdd %int %52 %int_1
+               OpStore %i %53
+               OpBranch %29
+         %30 = OpLabel
+         %54 = OpLoad %int %a
+         %56 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %57 = OpLoad %int %56
+         %58 = OpIEqual %bool %54 %57
+               OpSelectionMerge %59 None
+               OpBranchConditional %58 %60 %61
+         %60 = OpLabel
+         %62 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %63 = OpLoad %int %62
+         %64 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %65 = OpLoad %int %64
+         %66 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %67 = OpLoad %int %66
+         %68 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %69 = OpLoad %int %68
+         %70 = OpConvertSToF %float %63
+         %71 = OpConvertSToF %float %65
+         %72 = OpConvertSToF %float %67
+         %73 = OpConvertSToF %float %69
+         %74 = OpCompositeConstruct %v4float %70 %71 %72 %73
+               OpStore %x_GLF_color %74
+               OpBranch %59
+         %61 = OpLabel
+         %75 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %76 = OpLoad %int %75
+         %77 = OpConvertSToF %float %76
+         %78 = OpCompositeConstruct %v4float %77 %77 %77 %77
+               OpStore %x_GLF_color %78
+               OpBranch %59
+         %59 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %79
+%tint_symbol = OpFunctionParameter %main_out
+         %83 = OpLabel
+         %84 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %84
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %86 = OpLabel
+         %87 = OpFunctionCall %void %main_1
+         %89 = OpLoad %v4float %x_GLF_color
+         %90 = OpCompositeConstruct %main_out %89
+         %88 = OpFunctionCall %void %tint_symbol_2 %90
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-or-divide-by-loop-index/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-or-divide-by-loop-index/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..5615de9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-or-divide-by-loop-index/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,65 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  let x_27 : i32 = x_6.x_GLF_uniform_int_values[3];
+  a = x_27;
+  i = 0;
+  loop {
+    let x_32 : i32 = i;
+    if ((x_32 < 3)) {
+    } else {
+      break;
+    }
+    let x_35 : i32 = i;
+    let x_37 : i32 = x_6.x_GLF_uniform_int_values[1];
+    if ((x_35 == x_37)) {
+      let x_42 : i32 = a;
+      a = (x_42 + 1);
+    } else {
+      let x_44 : i32 = a;
+      let x_45 : i32 = i;
+      a = (x_44 / x_45);
+    }
+
+    continuing {
+      let x_47 : i32 = i;
+      i = (x_47 + 1);
+    }
+  }
+  let x_49 : i32 = a;
+  let x_51 : i32 = x_6.x_GLF_uniform_int_values[2];
+  if ((x_49 == x_51)) {
+    let x_57 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_60 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_63 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_66 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_57), f32(x_60), f32(x_63), f32(x_66));
+  } else {
+    let x_70 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_71 : f32 = f32(x_70);
+    x_GLF_color = vec4<f32>(x_71, x_71, x_71, x_71);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-integer-half-minus-one/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-loop-integer-half-minus-one/0-opt.spvasm
new file mode 100644
index 0000000..848d96c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-integer-half-minus-one/0-opt.spvasm
@@ -0,0 +1,93 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %9
+         %23 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+         %24 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %25 = OpLoad %int %24
+               OpStore %a %25
+               OpBranch %26
+         %26 = OpLabel
+               OpLoopMerge %27 %28 None
+               OpBranch %29
+         %29 = OpLabel
+         %30 = OpLoad %int %a
+         %31 = OpSGreaterThanEqual %bool %30 %int_0
+               OpBranchConditional %31 %32 %27
+         %32 = OpLabel
+         %33 = OpLoad %int %a
+         %34 = OpSDiv %int %33 %int_2
+         %35 = OpISub %int %34 %int_1
+               OpStore %a %35
+               OpBranch %28
+         %28 = OpLabel
+               OpBranch %26
+         %27 = OpLabel
+         %36 = OpLoad %int %a
+         %37 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %38 = OpLoad %int %37
+         %39 = OpSNegate %int %38
+         %40 = OpIEqual %bool %36 %39
+               OpSelectionMerge %41 None
+               OpBranchConditional %40 %42 %43
+         %42 = OpLabel
+         %44 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %45 = OpLoad %int %44
+         %46 = OpConvertSToF %float %45
+         %47 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %48 = OpLoad %int %47
+         %49 = OpConvertSToF %float %48
+         %50 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %51 = OpLoad %int %50
+         %52 = OpConvertSToF %float %51
+         %53 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %54 = OpLoad %int %53
+         %55 = OpConvertSToF %float %54
+         %56 = OpCompositeConstruct %v4float %46 %49 %52 %55
+               OpStore %_GLF_color %56
+               OpBranch %41
+         %43 = OpLabel
+         %57 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %58 = OpLoad %int %57
+         %59 = OpConvertSToF %float %58
+         %60 = OpCompositeConstruct %v4float %59 %59 %59 %59
+               OpStore %_GLF_color %60
+               OpBranch %41
+         %41 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-integer-half-minus-one/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-integer-half-minus-one/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..b595c46
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-integer-half-minus-one/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,48 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  const int x_25 = asint(x_6[2].x);
+  a = x_25;
+  while (true) {
+    if ((a >= 0)) {
+    } else {
+      break;
+    }
+    a = ((a / 2) - 1);
+  }
+  const int x_36 = a;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_38 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  if ((x_36 == -(x_38))) {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_45 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const int x_48 = asint(x_6[1].x);
+    const int x_51 = asint(x_6[1].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_54 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    x_GLF_color = float4(float(x_45), float(x_48), float(x_51), float(x_54));
+  } else {
+    const int x_58 = asint(x_6[1].x);
+    const float x_59 = float(x_58);
+    x_GLF_color = float4(x_59, x_59, x_59, x_59);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-integer-half-minus-one/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-loop-integer-half-minus-one/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..1332988
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-integer-half-minus-one/0-opt.spvasm.expected.msl
@@ -0,0 +1,57 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int const x_25 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  a = x_25;
+  while (true) {
+    int const x_30 = a;
+    if ((x_30 >= 0)) {
+    } else {
+      break;
+    }
+    int const x_33 = a;
+    a = ((x_33 / 2) - 1);
+  }
+  int const x_36 = a;
+  int const x_38 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  if ((x_36 == -(x_38))) {
+    int const x_45 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_48 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_51 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_54 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_45), float(x_48), float(x_51), float(x_54));
+  } else {
+    int const x_58 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    float const x_59 = float(x_58);
+    *(tint_symbol_4) = float4(x_59, x_59, x_59, x_59);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-integer-half-minus-one/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-loop-integer-half-minus-one/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..af6b9c9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-integer-half-minus-one/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,131 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 79
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %67 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+         %25 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %26 = OpLoad %int %25
+               OpStore %a %26
+               OpBranch %27
+         %27 = OpLabel
+               OpLoopMerge %28 %29 None
+               OpBranch %30
+         %30 = OpLabel
+         %31 = OpLoad %int %a
+         %33 = OpSGreaterThanEqual %bool %31 %int_0
+               OpSelectionMerge %35 None
+               OpBranchConditional %33 %36 %37
+         %36 = OpLabel
+               OpBranch %35
+         %37 = OpLabel
+               OpBranch %28
+         %35 = OpLabel
+         %38 = OpLoad %int %a
+         %39 = OpSDiv %int %38 %int_2
+         %41 = OpISub %int %39 %int_1
+               OpStore %a %41
+               OpBranch %29
+         %29 = OpLabel
+               OpBranch %27
+         %28 = OpLabel
+         %42 = OpLoad %int %a
+         %43 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %44 = OpLoad %int %43
+         %45 = OpSNegate %int %44
+         %46 = OpIEqual %bool %42 %45
+               OpSelectionMerge %47 None
+               OpBranchConditional %46 %48 %49
+         %48 = OpLabel
+         %50 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %51 = OpLoad %int %50
+         %52 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %53 = OpLoad %int %52
+         %54 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %55 = OpLoad %int %54
+         %56 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %57 = OpLoad %int %56
+         %58 = OpConvertSToF %float %51
+         %59 = OpConvertSToF %float %53
+         %60 = OpConvertSToF %float %55
+         %61 = OpConvertSToF %float %57
+         %62 = OpCompositeConstruct %v4float %58 %59 %60 %61
+               OpStore %x_GLF_color %62
+               OpBranch %47
+         %49 = OpLabel
+         %63 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %64 = OpLoad %int %63
+         %65 = OpConvertSToF %float %64
+         %66 = OpCompositeConstruct %v4float %65 %65 %65 %65
+               OpStore %x_GLF_color %66
+               OpBranch %47
+         %47 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %67
+%tint_symbol = OpFunctionParameter %main_out
+         %71 = OpLabel
+         %72 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %72
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %74 = OpLabel
+         %75 = OpFunctionCall %void %main_1
+         %77 = OpLoad %v4float %x_GLF_color
+         %78 = OpCompositeConstruct %main_out %77
+         %76 = OpFunctionCall %void %tint_symbol_2 %78
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-integer-half-minus-one/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-integer-half-minus-one/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..5a6c993
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-integer-half-minus-one/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,50 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  let x_25 : i32 = x_6.x_GLF_uniform_int_values[2];
+  a = x_25;
+  loop {
+    let x_30 : i32 = a;
+    if ((x_30 >= 0)) {
+    } else {
+      break;
+    }
+    let x_33 : i32 = a;
+    a = ((x_33 / 2) - 1);
+  }
+  let x_36 : i32 = a;
+  let x_38 : i32 = x_6.x_GLF_uniform_int_values[0];
+  if ((x_36 == -(x_38))) {
+    let x_45 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_48 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_51 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_54 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_45), f32(x_48), f32(x_51), f32(x_54));
+  } else {
+    let x_58 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_59 : f32 = f32(x_58);
+    x_GLF_color = vec4<f32>(x_59, x_59, x_59, x_59);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-integer-half-minus-one/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-integer-half-minus-one/0-opt.wgsl
new file mode 100644
index 0000000..5a6c993
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-integer-half-minus-one/0-opt.wgsl
@@ -0,0 +1,50 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  let x_25 : i32 = x_6.x_GLF_uniform_int_values[2];
+  a = x_25;
+  loop {
+    let x_30 : i32 = a;
+    if ((x_30 >= 0)) {
+    } else {
+      break;
+    }
+    let x_33 : i32 = a;
+    a = ((x_33 / 2) - 1);
+  }
+  let x_36 : i32 = a;
+  let x_38 : i32 = x_6.x_GLF_uniform_int_values[0];
+  if ((x_36 == -(x_38))) {
+    let x_45 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_48 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_51 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_54 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_45), f32(x_48), f32(x_51), f32(x_54));
+  } else {
+    let x_58 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_59 : f32 = f32(x_58);
+    x_GLF_color = vec4<f32>(x_59, x_59, x_59, x_59);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-integer-half-minus-one/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-integer-half-minus-one/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..b595c46
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-integer-half-minus-one/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,48 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  const int x_25 = asint(x_6[2].x);
+  a = x_25;
+  while (true) {
+    if ((a >= 0)) {
+    } else {
+      break;
+    }
+    a = ((a / 2) - 1);
+  }
+  const int x_36 = a;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_38 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  if ((x_36 == -(x_38))) {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_45 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const int x_48 = asint(x_6[1].x);
+    const int x_51 = asint(x_6[1].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_54 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    x_GLF_color = float4(float(x_45), float(x_48), float(x_51), float(x_54));
+  } else {
+    const int x_58 = asint(x_6[1].x);
+    const float x_59 = float(x_58);
+    x_GLF_color = float4(x_59, x_59, x_59, x_59);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-integer-half-minus-one/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-loop-integer-half-minus-one/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..1332988
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-integer-half-minus-one/0-opt.wgsl.expected.msl
@@ -0,0 +1,57 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int const x_25 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  a = x_25;
+  while (true) {
+    int const x_30 = a;
+    if ((x_30 >= 0)) {
+    } else {
+      break;
+    }
+    int const x_33 = a;
+    a = ((x_33 / 2) - 1);
+  }
+  int const x_36 = a;
+  int const x_38 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  if ((x_36 == -(x_38))) {
+    int const x_45 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_48 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_51 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_54 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_45), float(x_48), float(x_51), float(x_54));
+  } else {
+    int const x_58 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    float const x_59 = float(x_58);
+    *(tint_symbol_4) = float4(x_59, x_59, x_59, x_59);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-integer-half-minus-one/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-loop-integer-half-minus-one/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..af6b9c9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-integer-half-minus-one/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,131 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 79
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %67 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+         %25 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %26 = OpLoad %int %25
+               OpStore %a %26
+               OpBranch %27
+         %27 = OpLabel
+               OpLoopMerge %28 %29 None
+               OpBranch %30
+         %30 = OpLabel
+         %31 = OpLoad %int %a
+         %33 = OpSGreaterThanEqual %bool %31 %int_0
+               OpSelectionMerge %35 None
+               OpBranchConditional %33 %36 %37
+         %36 = OpLabel
+               OpBranch %35
+         %37 = OpLabel
+               OpBranch %28
+         %35 = OpLabel
+         %38 = OpLoad %int %a
+         %39 = OpSDiv %int %38 %int_2
+         %41 = OpISub %int %39 %int_1
+               OpStore %a %41
+               OpBranch %29
+         %29 = OpLabel
+               OpBranch %27
+         %28 = OpLabel
+         %42 = OpLoad %int %a
+         %43 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %44 = OpLoad %int %43
+         %45 = OpSNegate %int %44
+         %46 = OpIEqual %bool %42 %45
+               OpSelectionMerge %47 None
+               OpBranchConditional %46 %48 %49
+         %48 = OpLabel
+         %50 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %51 = OpLoad %int %50
+         %52 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %53 = OpLoad %int %52
+         %54 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %55 = OpLoad %int %54
+         %56 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %57 = OpLoad %int %56
+         %58 = OpConvertSToF %float %51
+         %59 = OpConvertSToF %float %53
+         %60 = OpConvertSToF %float %55
+         %61 = OpConvertSToF %float %57
+         %62 = OpCompositeConstruct %v4float %58 %59 %60 %61
+               OpStore %x_GLF_color %62
+               OpBranch %47
+         %49 = OpLabel
+         %63 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %64 = OpLoad %int %63
+         %65 = OpConvertSToF %float %64
+         %66 = OpCompositeConstruct %v4float %65 %65 %65 %65
+               OpStore %x_GLF_color %66
+               OpBranch %47
+         %47 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %67
+%tint_symbol = OpFunctionParameter %main_out
+         %71 = OpLabel
+         %72 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %72
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %74 = OpLabel
+         %75 = OpFunctionCall %void %main_1
+         %77 = OpLoad %v4float %x_GLF_color
+         %78 = OpCompositeConstruct %main_out %77
+         %76 = OpFunctionCall %void %tint_symbol_2 %78
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-integer-half-minus-one/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-integer-half-minus-one/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..5a6c993
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-integer-half-minus-one/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,50 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  let x_25 : i32 = x_6.x_GLF_uniform_int_values[2];
+  a = x_25;
+  loop {
+    let x_30 : i32 = a;
+    if ((x_30 >= 0)) {
+    } else {
+      break;
+    }
+    let x_33 : i32 = a;
+    a = ((x_33 / 2) - 1);
+  }
+  let x_36 : i32 = a;
+  let x_38 : i32 = x_6.x_GLF_uniform_int_values[0];
+  if ((x_36 == -(x_38))) {
+    let x_45 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_48 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_51 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_54 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_45), f32(x_48), f32(x_51), f32(x_54));
+  } else {
+    let x_58 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_59 : f32 = f32(x_58);
+    x_GLF_color = vec4<f32>(x_59, x_59, x_59, x_59);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-logical-xor/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-loop-logical-xor/0-opt.spvasm
new file mode 100644
index 0000000..5fdf9d6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-logical-xor/0-opt.spvasm
@@ -0,0 +1,81 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+       %main = OpFunction %void None %9
+         %24 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+         %25 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %26 = OpLoad %int %25
+               OpStore %a %26
+         %27 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %28 = OpLoad %int %27
+         %29 = OpConvertSToF %float %28
+         %30 = OpCompositeConstruct %v4float %29 %29 %29 %29
+               OpStore %_GLF_color %30
+               OpBranch %31
+         %31 = OpLabel
+               OpLoopMerge %32 %33 None
+               OpBranch %34
+         %34 = OpLabel
+         %35 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %36 = OpLoad %int %35
+         %37 = OpLoad %int %a
+         %38 = OpIEqual %bool %36 %37
+         %39 = OpLogicalNotEqual %bool %38 %true
+               OpBranchConditional %39 %40 %32
+         %40 = OpLabel
+         %41 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %42 = OpLoad %int %41
+         %43 = OpConvertSToF %float %42
+         %44 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %45 = OpLoad %int %44
+         %46 = OpConvertSToF %float %45
+         %47 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %48 = OpLoad %int %47
+         %49 = OpConvertSToF %float %48
+         %50 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %51 = OpLoad %int %50
+         %52 = OpConvertSToF %float %51
+         %53 = OpCompositeConstruct %v4float %43 %46 %49 %52
+               OpStore %_GLF_color %53
+               OpBranch %32
+         %33 = OpLabel
+               OpBranch %31
+         %32 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-logical-xor/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-logical-xor/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..31c1ef2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-logical-xor/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,44 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_26 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  a = x_26;
+  const int x_28 = asint(x_6[1].x);
+  const float x_29 = float(x_28);
+  x_GLF_color = float4(x_29, x_29, x_29, x_29);
+  while (true) {
+    const int x_36 = asint(x_6[2].x);
+    if (((x_36 == a) != true)) {
+    } else {
+      break;
+    }
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_42 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const int x_45 = asint(x_6[1].x);
+    const int x_48 = asint(x_6[1].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_51 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    x_GLF_color = float4(float(x_42), float(x_45), float(x_48), float(x_51));
+    break;
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-logical-xor/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-loop-logical-xor/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..ca01da7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-logical-xor/0-opt.spvasm.expected.msl
@@ -0,0 +1,52 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int const x_26 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  a = x_26;
+  int const x_28 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  float const x_29 = float(x_28);
+  *(tint_symbol_4) = float4(x_29, x_29, x_29, x_29);
+  while (true) {
+    int const x_36 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_37 = a;
+    if (((x_36 == x_37) != true)) {
+    } else {
+      break;
+    }
+    int const x_42 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_45 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_48 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_51 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_42), float(x_45), float(x_48), float(x_51));
+    break;
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-logical-xor/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-loop-logical-xor/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..f4f6126
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-logical-xor/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,119 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 72
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+   %main_out = OpTypeStruct %v4float
+         %60 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+         %25 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %26 = OpLoad %int %25
+               OpStore %a %26
+         %28 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %29 = OpLoad %int %28
+         %30 = OpConvertSToF %float %29
+         %31 = OpCompositeConstruct %v4float %30 %30 %30 %30
+               OpStore %x_GLF_color %31
+               OpBranch %32
+         %32 = OpLabel
+               OpLoopMerge %33 %34 None
+               OpBranch %35
+         %35 = OpLabel
+         %37 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %38 = OpLoad %int %37
+         %39 = OpLoad %int %a
+         %40 = OpIEqual %bool %38 %39
+         %43 = OpLogicalNotEqual %bool %40 %true
+               OpSelectionMerge %44 None
+               OpBranchConditional %43 %45 %46
+         %45 = OpLabel
+               OpBranch %44
+         %46 = OpLabel
+               OpBranch %33
+         %44 = OpLabel
+         %47 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %48 = OpLoad %int %47
+         %49 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %50 = OpLoad %int %49
+         %51 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %52 = OpLoad %int %51
+         %53 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %54 = OpLoad %int %53
+         %55 = OpConvertSToF %float %48
+         %56 = OpConvertSToF %float %50
+         %57 = OpConvertSToF %float %52
+         %58 = OpConvertSToF %float %54
+         %59 = OpCompositeConstruct %v4float %55 %56 %57 %58
+               OpStore %x_GLF_color %59
+               OpBranch %33
+         %34 = OpLabel
+               OpBranch %32
+         %33 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %60
+%tint_symbol = OpFunctionParameter %main_out
+         %64 = OpLabel
+         %65 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %65
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %67 = OpLabel
+         %68 = OpFunctionCall %void %main_1
+         %70 = OpLoad %v4float %x_GLF_color
+         %71 = OpCompositeConstruct %main_out %70
+         %69 = OpFunctionCall %void %tint_symbol_2 %71
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-logical-xor/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-logical-xor/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..a11c846
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-logical-xor/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,45 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  let x_26 : i32 = x_6.x_GLF_uniform_int_values[0];
+  a = x_26;
+  let x_28 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_29 : f32 = f32(x_28);
+  x_GLF_color = vec4<f32>(x_29, x_29, x_29, x_29);
+  loop {
+    let x_36 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_37 : i32 = a;
+    if (((x_36 == x_37) != true)) {
+    } else {
+      break;
+    }
+    let x_42 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_45 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_48 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_51 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_42), f32(x_45), f32(x_48), f32(x_51));
+    break;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-logical-xor/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-logical-xor/0-opt.wgsl
new file mode 100644
index 0000000..a11c846
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-logical-xor/0-opt.wgsl
@@ -0,0 +1,45 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  let x_26 : i32 = x_6.x_GLF_uniform_int_values[0];
+  a = x_26;
+  let x_28 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_29 : f32 = f32(x_28);
+  x_GLF_color = vec4<f32>(x_29, x_29, x_29, x_29);
+  loop {
+    let x_36 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_37 : i32 = a;
+    if (((x_36 == x_37) != true)) {
+    } else {
+      break;
+    }
+    let x_42 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_45 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_48 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_51 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_42), f32(x_45), f32(x_48), f32(x_51));
+    break;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-logical-xor/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-logical-xor/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..31c1ef2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-logical-xor/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,44 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_26 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  a = x_26;
+  const int x_28 = asint(x_6[1].x);
+  const float x_29 = float(x_28);
+  x_GLF_color = float4(x_29, x_29, x_29, x_29);
+  while (true) {
+    const int x_36 = asint(x_6[2].x);
+    if (((x_36 == a) != true)) {
+    } else {
+      break;
+    }
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_42 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const int x_45 = asint(x_6[1].x);
+    const int x_48 = asint(x_6[1].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_51 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    x_GLF_color = float4(float(x_42), float(x_45), float(x_48), float(x_51));
+    break;
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-logical-xor/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-loop-logical-xor/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..ca01da7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-logical-xor/0-opt.wgsl.expected.msl
@@ -0,0 +1,52 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int const x_26 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  a = x_26;
+  int const x_28 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  float const x_29 = float(x_28);
+  *(tint_symbol_4) = float4(x_29, x_29, x_29, x_29);
+  while (true) {
+    int const x_36 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_37 = a;
+    if (((x_36 == x_37) != true)) {
+    } else {
+      break;
+    }
+    int const x_42 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_45 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_48 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_51 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_42), float(x_45), float(x_48), float(x_51));
+    break;
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-logical-xor/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-loop-logical-xor/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..f4f6126
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-logical-xor/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,119 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 72
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+   %main_out = OpTypeStruct %v4float
+         %60 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+         %25 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %26 = OpLoad %int %25
+               OpStore %a %26
+         %28 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %29 = OpLoad %int %28
+         %30 = OpConvertSToF %float %29
+         %31 = OpCompositeConstruct %v4float %30 %30 %30 %30
+               OpStore %x_GLF_color %31
+               OpBranch %32
+         %32 = OpLabel
+               OpLoopMerge %33 %34 None
+               OpBranch %35
+         %35 = OpLabel
+         %37 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %38 = OpLoad %int %37
+         %39 = OpLoad %int %a
+         %40 = OpIEqual %bool %38 %39
+         %43 = OpLogicalNotEqual %bool %40 %true
+               OpSelectionMerge %44 None
+               OpBranchConditional %43 %45 %46
+         %45 = OpLabel
+               OpBranch %44
+         %46 = OpLabel
+               OpBranch %33
+         %44 = OpLabel
+         %47 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %48 = OpLoad %int %47
+         %49 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %50 = OpLoad %int %49
+         %51 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %52 = OpLoad %int %51
+         %53 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %54 = OpLoad %int %53
+         %55 = OpConvertSToF %float %48
+         %56 = OpConvertSToF %float %50
+         %57 = OpConvertSToF %float %52
+         %58 = OpConvertSToF %float %54
+         %59 = OpCompositeConstruct %v4float %55 %56 %57 %58
+               OpStore %x_GLF_color %59
+               OpBranch %33
+         %34 = OpLabel
+               OpBranch %32
+         %33 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %60
+%tint_symbol = OpFunctionParameter %main_out
+         %64 = OpLabel
+         %65 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %65
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %67 = OpLabel
+         %68 = OpFunctionCall %void %main_1
+         %70 = OpLoad %v4float %x_GLF_color
+         %71 = OpCompositeConstruct %main_out %70
+         %69 = OpFunctionCall %void %tint_symbol_2 %71
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-logical-xor/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-logical-xor/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..a11c846
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-logical-xor/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,45 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  let x_26 : i32 = x_6.x_GLF_uniform_int_values[0];
+  a = x_26;
+  let x_28 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_29 : f32 = f32(x_28);
+  x_GLF_color = vec4<f32>(x_29, x_29, x_29, x_29);
+  loop {
+    let x_36 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_37 : i32 = a;
+    if (((x_36 == x_37) != true)) {
+    } else {
+      break;
+    }
+    let x_42 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_45 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_48 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_51 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_42), f32(x_45), f32(x_48), f32(x_51));
+    break;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.spvasm
new file mode 100644
index 0000000..97d3744
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.spvasm
@@ -0,0 +1,117 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %_GLF_global_loop_count "_GLF_global_loop_count"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+%_GLF_global_loop_count = OpVariable %_ptr_Private_int Private
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+      %int_1 = OpConstant %int 1
+      %false = OpConstantFalse %bool
+    %int_100 = OpConstant %int 100
+       %main = OpFunction %void None %9
+         %25 = OpLabel
+               OpStore %_GLF_global_loop_count %int_0
+         %26 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %27 = OpLoad %int %26
+               OpSelectionMerge %28 None
+               OpSwitch %27 %28 0 %29 1 %30
+         %29 = OpLabel
+               OpSelectionMerge %31 None
+               OpBranchConditional %true %32 %31
+         %32 = OpLabel
+         %33 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %34 = OpLoad %int %33
+         %35 = OpConvertSToF %float %34
+         %36 = OpCompositeConstruct %v4float %35 %35 %35 %35
+               OpStore %_GLF_color %36
+               OpReturn
+         %31 = OpLabel
+               OpBranch %30
+         %30 = OpLabel
+               OpSelectionMerge %37 None
+               OpBranchConditional %true %38 %37
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %40 = OpLoad %int %39
+         %41 = OpConvertSToF %float %40
+         %42 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %43 = OpLoad %int %42
+         %44 = OpConvertSToF %float %43
+         %45 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %46 = OpLoad %int %45
+         %47 = OpConvertSToF %float %46
+         %48 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %49 = OpLoad %int %48
+         %50 = OpConvertSToF %float %49
+         %51 = OpCompositeConstruct %v4float %41 %44 %47 %50
+               OpStore %_GLF_color %51
+               OpSelectionMerge %52 None
+               OpBranchConditional %false %53 %52
+         %53 = OpLabel
+         %54 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %55 = OpLoad %int %54
+         %56 = OpConvertSToF %float %55
+         %57 = OpCompositeConstruct %v4float %56 %56 %56 %56
+               OpStore %_GLF_color %57
+               OpBranch %58
+         %58 = OpLabel
+               OpLoopMerge %59 %60 None
+               OpBranch %61
+         %61 = OpLabel
+         %62 = OpLoad %int %_GLF_global_loop_count
+         %63 = OpIAdd %int %62 %int_1
+               OpStore %_GLF_global_loop_count %63
+               OpSelectionMerge %64 None
+               OpBranchConditional %false %65 %64
+         %65 = OpLabel
+               OpReturn
+         %64 = OpLabel
+               OpSelectionMerge %66 None
+               OpBranchConditional %true %67 %66
+         %67 = OpLabel
+               OpReturn
+         %66 = OpLabel
+               OpBranch %60
+         %60 = OpLabel
+         %68 = OpLoad %int %_GLF_global_loop_count
+         %69 = OpSLessThan %bool %68 %int_100
+               OpBranchConditional %69 %58 %59
+         %59 = OpLabel
+               OpBranch %52
+         %52 = OpLabel
+               OpBranch %37
+         %37 = OpLabel
+               OpBranch %28
+         %28 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..f8db992
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,73 @@
+static int x_GLF_global_loop_count = 0;
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  x_GLF_global_loop_count = 0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_27 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  switch(x_27) {
+    case 0: {
+      if (true) {
+        const int x_34 = asint(x_6[1].x);
+        const float x_35 = float(x_34);
+        x_GLF_color = float4(x_35, x_35, x_35, x_35);
+        return;
+      }
+      /* fallthrough */
+    }
+    case 1: {
+      if (true) {
+        const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+        const int x_40 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+        const int x_43 = asint(x_6[1].x);
+        const int x_46 = asint(x_6[1].x);
+        const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+        const int x_49 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+        x_GLF_color = float4(float(x_40), float(x_43), float(x_46), float(x_49));
+        if (false) {
+          const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+          const int x_55 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+          const float x_56 = float(x_55);
+          x_GLF_color = float4(x_56, x_56, x_56, x_56);
+          while (true) {
+            x_GLF_global_loop_count = (x_GLF_global_loop_count + 1);
+            if (false) {
+              return;
+            }
+            if (true) {
+              return;
+            }
+            {
+              if ((x_GLF_global_loop_count < 100)) {
+              } else {
+                break;
+              }
+            }
+          }
+        }
+      }
+      break;
+    }
+    default: {
+      break;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..886f813
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.spvasm.expected.msl
@@ -0,0 +1,81 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread int* const tint_symbol_4, thread float4* const tint_symbol_5) {
+  *(tint_symbol_4) = 0;
+  int const x_27 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  switch(x_27) {
+    case 0: {
+      if (true) {
+        int const x_34 = x_6.x_GLF_uniform_int_values.arr[1].el;
+        float const x_35 = float(x_34);
+        *(tint_symbol_5) = float4(x_35, x_35, x_35, x_35);
+        return;
+      }
+      /* fallthrough */
+    }
+    case 1: {
+      if (true) {
+        int const x_40 = x_6.x_GLF_uniform_int_values.arr[0].el;
+        int const x_43 = x_6.x_GLF_uniform_int_values.arr[1].el;
+        int const x_46 = x_6.x_GLF_uniform_int_values.arr[1].el;
+        int const x_49 = x_6.x_GLF_uniform_int_values.arr[0].el;
+        *(tint_symbol_5) = float4(float(x_40), float(x_43), float(x_46), float(x_49));
+        if (false) {
+          int const x_55 = x_6.x_GLF_uniform_int_values.arr[0].el;
+          float const x_56 = float(x_55);
+          *(tint_symbol_5) = float4(x_56, x_56, x_56, x_56);
+          while (true) {
+            int const x_62 = *(tint_symbol_4);
+            *(tint_symbol_4) = (x_62 + 1);
+            if (false) {
+              return;
+            }
+            if (true) {
+              return;
+            }
+            {
+              int const x_68 = *(tint_symbol_4);
+              if ((x_68 < 100)) {
+              } else {
+                break;
+              }
+            }
+          }
+        }
+      }
+      break;
+    }
+    default: {
+      break;
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread int tint_symbol_6 = 0;
+  thread float4 tint_symbol_7 = 0.0f;
+  main_1(x_6, &(tint_symbol_6), &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..39748f2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,164 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 90
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_global_loop_count "x_GLF_global_loop_count"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+          %4 = OpConstantNull %int
+%x_GLF_global_loop_count = OpVariable %_ptr_Private_int Private %4
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %15 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %15
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %15
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+      %int_0 = OpConstant %int 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+      %int_1 = OpConstant %int 1
+      %false = OpConstantFalse %bool
+    %int_100 = OpConstant %int 100
+   %main_out = OpTypeStruct %v4float
+         %78 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %18
+         %21 = OpLabel
+               OpStore %x_GLF_global_loop_count %int_0
+         %25 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %26 = OpLoad %int %25
+               OpSelectionMerge %27 None
+               OpSwitch %26 %28 0 %29 1 %30
+         %29 = OpLabel
+               OpSelectionMerge %33 None
+               OpBranchConditional %true %34 %33
+         %34 = OpLabel
+         %36 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %37 = OpLoad %int %36
+         %38 = OpConvertSToF %float %37
+         %39 = OpCompositeConstruct %v4float %38 %38 %38 %38
+               OpStore %x_GLF_color %39
+               OpReturn
+         %33 = OpLabel
+               OpBranch %30
+         %30 = OpLabel
+               OpSelectionMerge %40 None
+               OpBranchConditional %true %41 %40
+         %41 = OpLabel
+         %42 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %43 = OpLoad %int %42
+         %44 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %45 = OpLoad %int %44
+         %46 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %47 = OpLoad %int %46
+         %48 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %49 = OpLoad %int %48
+         %50 = OpConvertSToF %float %43
+         %51 = OpConvertSToF %float %45
+         %52 = OpConvertSToF %float %47
+         %53 = OpConvertSToF %float %49
+         %54 = OpCompositeConstruct %v4float %50 %51 %52 %53
+               OpStore %x_GLF_color %54
+               OpSelectionMerge %56 None
+               OpBranchConditional %false %57 %56
+         %57 = OpLabel
+         %58 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %59 = OpLoad %int %58
+         %60 = OpConvertSToF %float %59
+         %61 = OpCompositeConstruct %v4float %60 %60 %60 %60
+               OpStore %x_GLF_color %61
+               OpBranch %62
+         %62 = OpLabel
+               OpLoopMerge %63 %64 None
+               OpBranch %65
+         %65 = OpLabel
+         %66 = OpLoad %int %x_GLF_global_loop_count
+         %67 = OpIAdd %int %66 %int_1
+               OpStore %x_GLF_global_loop_count %67
+               OpSelectionMerge %68 None
+               OpBranchConditional %false %69 %68
+         %69 = OpLabel
+               OpReturn
+         %68 = OpLabel
+               OpSelectionMerge %70 None
+               OpBranchConditional %true %71 %70
+         %71 = OpLabel
+               OpReturn
+         %70 = OpLabel
+               OpBranch %64
+         %64 = OpLabel
+         %72 = OpLoad %int %x_GLF_global_loop_count
+         %74 = OpSLessThan %bool %72 %int_100
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %77
+         %76 = OpLabel
+               OpBranch %75
+         %77 = OpLabel
+               OpBranch %63
+         %75 = OpLabel
+               OpBranch %62
+         %63 = OpLabel
+               OpBranch %56
+         %56 = OpLabel
+               OpBranch %40
+         %40 = OpLabel
+               OpBranch %27
+         %28 = OpLabel
+               OpBranch %27
+         %27 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %78
+%tint_symbol = OpFunctionParameter %main_out
+         %82 = OpLabel
+         %83 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %83
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %18
+         %85 = OpLabel
+         %86 = OpFunctionCall %void %main_1
+         %88 = OpLoad %v4float %x_GLF_color
+         %89 = OpCompositeConstruct %main_out %88
+         %87 = OpFunctionCall %void %tint_symbol_2 %89
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 64[%64] is not post dominated by the back-edge block 75[%75]
+  %75 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..7b901c6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,74 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> x_GLF_global_loop_count : i32;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  x_GLF_global_loop_count = 0;
+  let x_27 : i32 = x_6.x_GLF_uniform_int_values[0];
+  switch(x_27) {
+    case 0: {
+      if (true) {
+        let x_34 : i32 = x_6.x_GLF_uniform_int_values[1];
+        let x_35 : f32 = f32(x_34);
+        x_GLF_color = vec4<f32>(x_35, x_35, x_35, x_35);
+        return;
+      }
+      fallthrough;
+    }
+    case 1: {
+      if (true) {
+        let x_40 : i32 = x_6.x_GLF_uniform_int_values[0];
+        let x_43 : i32 = x_6.x_GLF_uniform_int_values[1];
+        let x_46 : i32 = x_6.x_GLF_uniform_int_values[1];
+        let x_49 : i32 = x_6.x_GLF_uniform_int_values[0];
+        x_GLF_color = vec4<f32>(f32(x_40), f32(x_43), f32(x_46), f32(x_49));
+        if (false) {
+          let x_55 : i32 = x_6.x_GLF_uniform_int_values[0];
+          let x_56 : f32 = f32(x_55);
+          x_GLF_color = vec4<f32>(x_56, x_56, x_56, x_56);
+          loop {
+            let x_62 : i32 = x_GLF_global_loop_count;
+            x_GLF_global_loop_count = (x_62 + 1);
+            if (false) {
+              return;
+            }
+            if (true) {
+              return;
+            }
+
+            continuing {
+              let x_68 : i32 = x_GLF_global_loop_count;
+              if ((x_68 < 100)) {
+              } else {
+                break;
+              }
+            }
+          }
+        }
+      }
+    }
+    default: {
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.wgsl
new file mode 100644
index 0000000..7b901c6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.wgsl
@@ -0,0 +1,74 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> x_GLF_global_loop_count : i32;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  x_GLF_global_loop_count = 0;
+  let x_27 : i32 = x_6.x_GLF_uniform_int_values[0];
+  switch(x_27) {
+    case 0: {
+      if (true) {
+        let x_34 : i32 = x_6.x_GLF_uniform_int_values[1];
+        let x_35 : f32 = f32(x_34);
+        x_GLF_color = vec4<f32>(x_35, x_35, x_35, x_35);
+        return;
+      }
+      fallthrough;
+    }
+    case 1: {
+      if (true) {
+        let x_40 : i32 = x_6.x_GLF_uniform_int_values[0];
+        let x_43 : i32 = x_6.x_GLF_uniform_int_values[1];
+        let x_46 : i32 = x_6.x_GLF_uniform_int_values[1];
+        let x_49 : i32 = x_6.x_GLF_uniform_int_values[0];
+        x_GLF_color = vec4<f32>(f32(x_40), f32(x_43), f32(x_46), f32(x_49));
+        if (false) {
+          let x_55 : i32 = x_6.x_GLF_uniform_int_values[0];
+          let x_56 : f32 = f32(x_55);
+          x_GLF_color = vec4<f32>(x_56, x_56, x_56, x_56);
+          loop {
+            let x_62 : i32 = x_GLF_global_loop_count;
+            x_GLF_global_loop_count = (x_62 + 1);
+            if (false) {
+              return;
+            }
+            if (true) {
+              return;
+            }
+
+            continuing {
+              let x_68 : i32 = x_GLF_global_loop_count;
+              if ((x_68 < 100)) {
+              } else {
+                break;
+              }
+            }
+          }
+        }
+      }
+    }
+    default: {
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..f8db992
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,73 @@
+static int x_GLF_global_loop_count = 0;
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  x_GLF_global_loop_count = 0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_27 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  switch(x_27) {
+    case 0: {
+      if (true) {
+        const int x_34 = asint(x_6[1].x);
+        const float x_35 = float(x_34);
+        x_GLF_color = float4(x_35, x_35, x_35, x_35);
+        return;
+      }
+      /* fallthrough */
+    }
+    case 1: {
+      if (true) {
+        const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+        const int x_40 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+        const int x_43 = asint(x_6[1].x);
+        const int x_46 = asint(x_6[1].x);
+        const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+        const int x_49 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+        x_GLF_color = float4(float(x_40), float(x_43), float(x_46), float(x_49));
+        if (false) {
+          const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+          const int x_55 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+          const float x_56 = float(x_55);
+          x_GLF_color = float4(x_56, x_56, x_56, x_56);
+          while (true) {
+            x_GLF_global_loop_count = (x_GLF_global_loop_count + 1);
+            if (false) {
+              return;
+            }
+            if (true) {
+              return;
+            }
+            {
+              if ((x_GLF_global_loop_count < 100)) {
+              } else {
+                break;
+              }
+            }
+          }
+        }
+      }
+      break;
+    }
+    default: {
+      break;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..886f813
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.wgsl.expected.msl
@@ -0,0 +1,81 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread int* const tint_symbol_4, thread float4* const tint_symbol_5) {
+  *(tint_symbol_4) = 0;
+  int const x_27 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  switch(x_27) {
+    case 0: {
+      if (true) {
+        int const x_34 = x_6.x_GLF_uniform_int_values.arr[1].el;
+        float const x_35 = float(x_34);
+        *(tint_symbol_5) = float4(x_35, x_35, x_35, x_35);
+        return;
+      }
+      /* fallthrough */
+    }
+    case 1: {
+      if (true) {
+        int const x_40 = x_6.x_GLF_uniform_int_values.arr[0].el;
+        int const x_43 = x_6.x_GLF_uniform_int_values.arr[1].el;
+        int const x_46 = x_6.x_GLF_uniform_int_values.arr[1].el;
+        int const x_49 = x_6.x_GLF_uniform_int_values.arr[0].el;
+        *(tint_symbol_5) = float4(float(x_40), float(x_43), float(x_46), float(x_49));
+        if (false) {
+          int const x_55 = x_6.x_GLF_uniform_int_values.arr[0].el;
+          float const x_56 = float(x_55);
+          *(tint_symbol_5) = float4(x_56, x_56, x_56, x_56);
+          while (true) {
+            int const x_62 = *(tint_symbol_4);
+            *(tint_symbol_4) = (x_62 + 1);
+            if (false) {
+              return;
+            }
+            if (true) {
+              return;
+            }
+            {
+              int const x_68 = *(tint_symbol_4);
+              if ((x_68 < 100)) {
+              } else {
+                break;
+              }
+            }
+          }
+        }
+      }
+      break;
+    }
+    default: {
+      break;
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread int tint_symbol_6 = 0;
+  thread float4 tint_symbol_7 = 0.0f;
+  main_1(x_6, &(tint_symbol_6), &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..39748f2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,164 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 90
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_global_loop_count "x_GLF_global_loop_count"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+          %4 = OpConstantNull %int
+%x_GLF_global_loop_count = OpVariable %_ptr_Private_int Private %4
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %15 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %15
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %15
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+      %int_0 = OpConstant %int 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+      %int_1 = OpConstant %int 1
+      %false = OpConstantFalse %bool
+    %int_100 = OpConstant %int 100
+   %main_out = OpTypeStruct %v4float
+         %78 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %18
+         %21 = OpLabel
+               OpStore %x_GLF_global_loop_count %int_0
+         %25 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %26 = OpLoad %int %25
+               OpSelectionMerge %27 None
+               OpSwitch %26 %28 0 %29 1 %30
+         %29 = OpLabel
+               OpSelectionMerge %33 None
+               OpBranchConditional %true %34 %33
+         %34 = OpLabel
+         %36 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %37 = OpLoad %int %36
+         %38 = OpConvertSToF %float %37
+         %39 = OpCompositeConstruct %v4float %38 %38 %38 %38
+               OpStore %x_GLF_color %39
+               OpReturn
+         %33 = OpLabel
+               OpBranch %30
+         %30 = OpLabel
+               OpSelectionMerge %40 None
+               OpBranchConditional %true %41 %40
+         %41 = OpLabel
+         %42 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %43 = OpLoad %int %42
+         %44 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %45 = OpLoad %int %44
+         %46 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %47 = OpLoad %int %46
+         %48 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %49 = OpLoad %int %48
+         %50 = OpConvertSToF %float %43
+         %51 = OpConvertSToF %float %45
+         %52 = OpConvertSToF %float %47
+         %53 = OpConvertSToF %float %49
+         %54 = OpCompositeConstruct %v4float %50 %51 %52 %53
+               OpStore %x_GLF_color %54
+               OpSelectionMerge %56 None
+               OpBranchConditional %false %57 %56
+         %57 = OpLabel
+         %58 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %59 = OpLoad %int %58
+         %60 = OpConvertSToF %float %59
+         %61 = OpCompositeConstruct %v4float %60 %60 %60 %60
+               OpStore %x_GLF_color %61
+               OpBranch %62
+         %62 = OpLabel
+               OpLoopMerge %63 %64 None
+               OpBranch %65
+         %65 = OpLabel
+         %66 = OpLoad %int %x_GLF_global_loop_count
+         %67 = OpIAdd %int %66 %int_1
+               OpStore %x_GLF_global_loop_count %67
+               OpSelectionMerge %68 None
+               OpBranchConditional %false %69 %68
+         %69 = OpLabel
+               OpReturn
+         %68 = OpLabel
+               OpSelectionMerge %70 None
+               OpBranchConditional %true %71 %70
+         %71 = OpLabel
+               OpReturn
+         %70 = OpLabel
+               OpBranch %64
+         %64 = OpLabel
+         %72 = OpLoad %int %x_GLF_global_loop_count
+         %74 = OpSLessThan %bool %72 %int_100
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %77
+         %76 = OpLabel
+               OpBranch %75
+         %77 = OpLabel
+               OpBranch %63
+         %75 = OpLabel
+               OpBranch %62
+         %63 = OpLabel
+               OpBranch %56
+         %56 = OpLabel
+               OpBranch %40
+         %40 = OpLabel
+               OpBranch %27
+         %28 = OpLabel
+               OpBranch %27
+         %27 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %78
+%tint_symbol = OpFunctionParameter %main_out
+         %82 = OpLabel
+         %83 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %83
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %18
+         %85 = OpLabel
+         %86 = OpFunctionCall %void %main_1
+         %88 = OpLoad %v4float %x_GLF_color
+         %89 = OpCompositeConstruct %main_out %88
+         %87 = OpFunctionCall %void %tint_symbol_2 %89
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 64[%64] is not post dominated by the back-edge block 75[%75]
+  %75 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..7b901c6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,74 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> x_GLF_global_loop_count : i32;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  x_GLF_global_loop_count = 0;
+  let x_27 : i32 = x_6.x_GLF_uniform_int_values[0];
+  switch(x_27) {
+    case 0: {
+      if (true) {
+        let x_34 : i32 = x_6.x_GLF_uniform_int_values[1];
+        let x_35 : f32 = f32(x_34);
+        x_GLF_color = vec4<f32>(x_35, x_35, x_35, x_35);
+        return;
+      }
+      fallthrough;
+    }
+    case 1: {
+      if (true) {
+        let x_40 : i32 = x_6.x_GLF_uniform_int_values[0];
+        let x_43 : i32 = x_6.x_GLF_uniform_int_values[1];
+        let x_46 : i32 = x_6.x_GLF_uniform_int_values[1];
+        let x_49 : i32 = x_6.x_GLF_uniform_int_values[0];
+        x_GLF_color = vec4<f32>(f32(x_40), f32(x_43), f32(x_46), f32(x_49));
+        if (false) {
+          let x_55 : i32 = x_6.x_GLF_uniform_int_values[0];
+          let x_56 : f32 = f32(x_55);
+          x_GLF_color = vec4<f32>(x_56, x_56, x_56, x_56);
+          loop {
+            let x_62 : i32 = x_GLF_global_loop_count;
+            x_GLF_global_loop_count = (x_62 + 1);
+            if (false) {
+              return;
+            }
+            if (true) {
+              return;
+            }
+
+            continuing {
+              let x_68 : i32 = x_GLF_global_loop_count;
+              if ((x_68 < 100)) {
+              } else {
+                break;
+              }
+            }
+          }
+        }
+      }
+    }
+    default: {
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-with-two-integers/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-loop-with-two-integers/0-opt.spvasm
new file mode 100644
index 0000000..eb76d7e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-with-two-integers/0-opt.spvasm
@@ -0,0 +1,159 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %arr "arr"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %j "j"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_float_uint_5 = OpTypeArray %float %uint_5
+%_ptr_Function__arr_float_uint_5 = OpTypePointer Function %_arr_float_uint_5
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_int = OpTypePointer Function %int
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+     %int_n1 = OpConstant %int -1
+    %float_1 = OpConstant %float 1
+%_ptr_Function_float = OpTypePointer Function %float
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_2 = OpConstant %float 2
+       %main = OpFunction %void None %14
+         %36 = OpLabel
+        %arr = OpVariable %_ptr_Function__arr_float_uint_5 Function
+          %i = OpVariable %_ptr_Function_int Function
+          %j = OpVariable %_ptr_Function_int Function
+         %37 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %38 = OpLoad %float %37
+         %39 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %40 = OpLoad %float %39
+         %41 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %42 = OpLoad %float %41
+         %43 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %44 = OpLoad %float %43
+         %45 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %46 = OpLoad %float %45
+         %47 = OpCompositeConstruct %_arr_float_uint_5 %38 %40 %42 %44 %46
+               OpStore %arr %47
+         %48 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %49 = OpLoad %int %48
+               OpStore %i %49
+               OpStore %j %int_0
+               OpBranch %50
+         %50 = OpLabel
+               OpLoopMerge %51 %52 None
+               OpBranch %53
+         %53 = OpLabel
+         %54 = OpLoad %int %i
+         %55 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %56 = OpLoad %int %55
+         %57 = OpSLessThan %bool %54 %56
+               OpBranchConditional %57 %58 %51
+         %58 = OpLabel
+         %59 = OpLoad %int %j
+         %60 = OpSLessThan %bool %59 %int_n1
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %61
+         %62 = OpLabel
+               OpBranch %51
+         %61 = OpLabel
+         %63 = OpLoad %int %j
+         %64 = OpAccessChain %_ptr_Function_float %arr %63
+         %65 = OpLoad %float %64
+         %66 = OpFAdd %float %65 %float_1
+         %67 = OpAccessChain %_ptr_Function_float %arr %63
+               OpStore %67 %66
+               OpBranch %52
+         %52 = OpLabel
+         %68 = OpLoad %int %i
+         %69 = OpIAdd %int %68 %int_1
+               OpStore %i %69
+         %70 = OpLoad %int %j
+         %71 = OpIAdd %int %70 %int_1
+               OpStore %j %71
+               OpBranch %50
+         %51 = OpLabel
+         %72 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %73 = OpLoad %float %72
+         %74 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %75 = OpLoad %float %74
+         %76 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %77 = OpLoad %float %76
+         %78 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %79 = OpLoad %float %78
+         %80 = OpCompositeConstruct %v4float %73 %75 %77 %79
+               OpStore %_GLF_color %80
+         %81 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %82 = OpLoad %int %81
+               OpStore %i %82
+               OpBranch %83
+         %83 = OpLabel
+               OpLoopMerge %84 %85 None
+               OpBranch %86
+         %86 = OpLabel
+         %87 = OpLoad %int %i
+         %88 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %89 = OpLoad %int %88
+         %90 = OpSLessThan %bool %87 %89
+               OpBranchConditional %90 %91 %84
+         %91 = OpLabel
+         %92 = OpLoad %int %i
+         %93 = OpAccessChain %_ptr_Function_float %arr %92
+         %94 = OpLoad %float %93
+         %95 = OpFUnordNotEqual %bool %94 %float_2
+               OpSelectionMerge %96 None
+               OpBranchConditional %95 %97 %96
+         %97 = OpLabel
+         %98 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %99 = OpLoad %float %98
+        %100 = OpCompositeConstruct %v4float %99 %99 %99 %99
+               OpStore %_GLF_color %100
+               OpBranch %96
+         %96 = OpLabel
+               OpBranch %85
+         %85 = OpLabel
+        %101 = OpLoad %int %i
+        %102 = OpIAdd %int %101 %int_1
+               OpStore %i %102
+               OpBranch %83
+         %84 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-with-two-integers/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-with-two-integers/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..073d5f2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-with-two-integers/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,88 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+cbuffer cbuffer_x_9 : register(b1, space0) {
+  uint4 x_9[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float arr[5] = (float[5])0;
+  int i = 0;
+  int j = 0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_38 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_40 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const float x_42 = asfloat(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const float x_44 = asfloat(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+  const float x_46 = asfloat(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+  const float tint_symbol_4[5] = {x_38, x_40, x_42, x_44, x_46};
+  arr = tint_symbol_4;
+  const int x_49 = asint(x_9[1].x);
+  i = x_49;
+  j = 0;
+  while (true) {
+    const int x_54 = i;
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const int x_56 = asint(x_9[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    if ((x_54 < x_56)) {
+    } else {
+      break;
+    }
+    if ((j < -1)) {
+      break;
+    }
+    const int x_63 = j;
+    const float x_65 = arr[x_63];
+    arr[x_63] = (x_65 + 1.0f);
+    {
+      i = (i + 1);
+      j = (j + 1);
+    }
+  }
+  const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+  const float x_73 = asfloat(x_6[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+  const float x_75 = asfloat(x_6[1].x);
+  const float x_77 = asfloat(x_6[1].x);
+  const uint scalar_offset_7 = ((16u * uint(0))) / 4;
+  const float x_79 = asfloat(x_6[scalar_offset_7 / 4][scalar_offset_7 % 4]);
+  x_GLF_color = float4(x_73, x_75, x_77, x_79);
+  const int x_82 = asint(x_9[1].x);
+  i = x_82;
+  while (true) {
+    const int x_87 = i;
+    const uint scalar_offset_8 = ((16u * uint(0))) / 4;
+    const int x_89 = asint(x_9[scalar_offset_8 / 4][scalar_offset_8 % 4]);
+    if ((x_87 < x_89)) {
+    } else {
+      break;
+    }
+    const float x_94 = arr[i];
+    if (!((x_94 == 2.0f))) {
+      const float x_99 = asfloat(x_6[1].x);
+      x_GLF_color = float4(x_99, x_99, x_99, x_99);
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-with-two-integers/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-loop-with-two-integers/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..ec7cae1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-with-two-integers/0-opt.spvasm.expected.msl
@@ -0,0 +1,104 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_2 {
+  float arr[5];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_9, thread float4* const tint_symbol_5) {
+  tint_array_wrapper_2 arr = {};
+  int i = 0;
+  int j = 0;
+  float const x_38 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_40 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_42 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_44 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_46 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  tint_array_wrapper_2 const tint_symbol_3 = {.arr={x_38, x_40, x_42, x_44, x_46}};
+  arr = tint_symbol_3;
+  int const x_49 = x_9.x_GLF_uniform_int_values.arr[1].el;
+  i = x_49;
+  j = 0;
+  while (true) {
+    int const x_54 = i;
+    int const x_56 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_54 < x_56)) {
+    } else {
+      break;
+    }
+    int const x_59 = j;
+    if ((x_59 < -1)) {
+      break;
+    }
+    int const x_63 = j;
+    float const x_65 = arr.arr[x_63];
+    arr.arr[x_63] = (x_65 + 1.0f);
+    {
+      int const x_68 = i;
+      i = (x_68 + 1);
+      int const x_70 = j;
+      j = (x_70 + 1);
+    }
+  }
+  float const x_73 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_75 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  float const x_77 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  float const x_79 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  *(tint_symbol_5) = float4(x_73, x_75, x_77, x_79);
+  int const x_82 = x_9.x_GLF_uniform_int_values.arr[1].el;
+  i = x_82;
+  while (true) {
+    int const x_87 = i;
+    int const x_89 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_87 < x_89)) {
+    } else {
+      break;
+    }
+    int const x_92 = i;
+    float const x_94 = arr.arr[x_92];
+    if (!((x_94 == 2.0f))) {
+      float const x_99 = x_6.x_GLF_uniform_float_values.arr[1].el;
+      *(tint_symbol_5) = float4(x_99, x_99, x_99, x_99);
+    }
+    {
+      int const x_101 = i;
+      i = (x_101 + 1);
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_9 [[buffer(1)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-with-two-integers/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-loop-with-two-integers/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..193f5f4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-with-two-integers/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,206 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 125
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %arr "arr"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_float_uint_5 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_9 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %16
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+     %uint_5 = OpConstant %uint 5
+%_arr_float_uint_5 = OpTypeArray %float %uint_5
+%_ptr_Function__arr_float_uint_5 = OpTypePointer Function %_arr_float_uint_5
+         %27 = OpConstantNull %_arr_float_uint_5
+%_ptr_Function_int = OpTypePointer Function %int
+         %30 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+     %int_n1 = OpConstant %int -1
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+   %main_out = OpTypeStruct %v4float
+        %113 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+        %arr = OpVariable %_ptr_Function__arr_float_uint_5 Function %27
+          %i = OpVariable %_ptr_Function_int Function %30
+          %j = OpVariable %_ptr_Function_int Function %30
+         %35 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %36 = OpLoad %float %35
+         %37 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %38 = OpLoad %float %37
+         %39 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %40 = OpLoad %float %39
+         %41 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %42 = OpLoad %float %41
+         %43 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %44 = OpLoad %float %43
+         %45 = OpCompositeConstruct %_arr_float_uint_5 %36 %38 %40 %42 %44
+               OpStore %arr %45
+         %48 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %49 = OpLoad %int %48
+               OpStore %i %49
+               OpStore %j %int_0
+               OpBranch %50
+         %50 = OpLabel
+               OpLoopMerge %51 %52 None
+               OpBranch %53
+         %53 = OpLabel
+         %54 = OpLoad %int %i
+         %55 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %56 = OpLoad %int %55
+         %57 = OpSLessThan %bool %54 %56
+               OpSelectionMerge %59 None
+               OpBranchConditional %57 %60 %61
+         %60 = OpLabel
+               OpBranch %59
+         %61 = OpLabel
+               OpBranch %51
+         %59 = OpLabel
+         %62 = OpLoad %int %j
+         %64 = OpSLessThan %bool %62 %int_n1
+               OpSelectionMerge %65 None
+               OpBranchConditional %64 %66 %65
+         %66 = OpLabel
+               OpBranch %51
+         %65 = OpLabel
+         %67 = OpLoad %int %j
+         %69 = OpAccessChain %_ptr_Function_float %arr %67
+         %70 = OpLoad %float %69
+         %71 = OpAccessChain %_ptr_Function_float %arr %67
+         %73 = OpFAdd %float %70 %float_1
+               OpStore %71 %73
+               OpBranch %52
+         %52 = OpLabel
+         %74 = OpLoad %int %i
+         %75 = OpIAdd %int %74 %int_1
+               OpStore %i %75
+         %76 = OpLoad %int %j
+         %77 = OpIAdd %int %76 %int_1
+               OpStore %j %77
+               OpBranch %50
+         %51 = OpLabel
+         %78 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %79 = OpLoad %float %78
+         %80 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %81 = OpLoad %float %80
+         %82 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %83 = OpLoad %float %82
+         %84 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %85 = OpLoad %float %84
+         %86 = OpCompositeConstruct %v4float %79 %81 %83 %85
+               OpStore %x_GLF_color %86
+         %87 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %88 = OpLoad %int %87
+               OpStore %i %88
+               OpBranch %89
+         %89 = OpLabel
+               OpLoopMerge %90 %91 None
+               OpBranch %92
+         %92 = OpLabel
+         %93 = OpLoad %int %i
+         %94 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %95 = OpLoad %int %94
+         %96 = OpSLessThan %bool %93 %95
+               OpSelectionMerge %97 None
+               OpBranchConditional %96 %98 %99
+         %98 = OpLabel
+               OpBranch %97
+         %99 = OpLabel
+               OpBranch %90
+         %97 = OpLabel
+        %100 = OpLoad %int %i
+        %101 = OpAccessChain %_ptr_Function_float %arr %100
+        %102 = OpLoad %float %101
+        %105 = OpFOrdEqual %bool %102 %float_2
+        %103 = OpLogicalNot %bool %105
+               OpSelectionMerge %106 None
+               OpBranchConditional %103 %107 %106
+        %107 = OpLabel
+        %108 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+        %109 = OpLoad %float %108
+        %110 = OpCompositeConstruct %v4float %109 %109 %109 %109
+               OpStore %x_GLF_color %110
+               OpBranch %106
+        %106 = OpLabel
+               OpBranch %91
+         %91 = OpLabel
+        %111 = OpLoad %int %i
+        %112 = OpIAdd %int %111 %int_1
+               OpStore %i %112
+               OpBranch %89
+         %90 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %113
+%tint_symbol = OpFunctionParameter %main_out
+        %117 = OpLabel
+        %118 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %118
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+        %120 = OpLabel
+        %121 = OpFunctionCall %void %main_1
+        %123 = OpLoad %v4float %x_GLF_color
+        %124 = OpCompositeConstruct %main_out %123
+        %122 = OpFunctionCall %void %tint_symbol_2 %124
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-with-two-integers/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-with-two-integers/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..9bd8ed5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-with-two-integers/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,94 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var arr : array<f32, 5>;
+  var i : i32;
+  var j : i32;
+  let x_38 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_40 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_42 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_44 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_46 : f32 = x_6.x_GLF_uniform_float_values[0];
+  arr = array<f32, 5>(x_38, x_40, x_42, x_44, x_46);
+  let x_49 : i32 = x_9.x_GLF_uniform_int_values[1];
+  i = x_49;
+  j = 0;
+  loop {
+    let x_54 : i32 = i;
+    let x_56 : i32 = x_9.x_GLF_uniform_int_values[0];
+    if ((x_54 < x_56)) {
+    } else {
+      break;
+    }
+    let x_59 : i32 = j;
+    if ((x_59 < -1)) {
+      break;
+    }
+    let x_63 : i32 = j;
+    let x_65 : f32 = arr[x_63];
+    arr[x_63] = (x_65 + 1.0);
+
+    continuing {
+      let x_68 : i32 = i;
+      i = (x_68 + 1);
+      let x_70 : i32 = j;
+      j = (x_70 + 1);
+    }
+  }
+  let x_73 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_75 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_77 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_79 : f32 = x_6.x_GLF_uniform_float_values[0];
+  x_GLF_color = vec4<f32>(x_73, x_75, x_77, x_79);
+  let x_82 : i32 = x_9.x_GLF_uniform_int_values[1];
+  i = x_82;
+  loop {
+    let x_87 : i32 = i;
+    let x_89 : i32 = x_9.x_GLF_uniform_int_values[0];
+    if ((x_87 < x_89)) {
+    } else {
+      break;
+    }
+    let x_92 : i32 = i;
+    let x_94 : f32 = arr[x_92];
+    if (!((x_94 == 2.0))) {
+      let x_99 : f32 = x_6.x_GLF_uniform_float_values[1];
+      x_GLF_color = vec4<f32>(x_99, x_99, x_99, x_99);
+    }
+
+    continuing {
+      let x_101 : i32 = i;
+      i = (x_101 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-with-two-integers/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-with-two-integers/0-opt.wgsl
new file mode 100644
index 0000000..9bd8ed5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-with-two-integers/0-opt.wgsl
@@ -0,0 +1,94 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var arr : array<f32, 5>;
+  var i : i32;
+  var j : i32;
+  let x_38 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_40 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_42 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_44 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_46 : f32 = x_6.x_GLF_uniform_float_values[0];
+  arr = array<f32, 5>(x_38, x_40, x_42, x_44, x_46);
+  let x_49 : i32 = x_9.x_GLF_uniform_int_values[1];
+  i = x_49;
+  j = 0;
+  loop {
+    let x_54 : i32 = i;
+    let x_56 : i32 = x_9.x_GLF_uniform_int_values[0];
+    if ((x_54 < x_56)) {
+    } else {
+      break;
+    }
+    let x_59 : i32 = j;
+    if ((x_59 < -1)) {
+      break;
+    }
+    let x_63 : i32 = j;
+    let x_65 : f32 = arr[x_63];
+    arr[x_63] = (x_65 + 1.0);
+
+    continuing {
+      let x_68 : i32 = i;
+      i = (x_68 + 1);
+      let x_70 : i32 = j;
+      j = (x_70 + 1);
+    }
+  }
+  let x_73 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_75 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_77 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_79 : f32 = x_6.x_GLF_uniform_float_values[0];
+  x_GLF_color = vec4<f32>(x_73, x_75, x_77, x_79);
+  let x_82 : i32 = x_9.x_GLF_uniform_int_values[1];
+  i = x_82;
+  loop {
+    let x_87 : i32 = i;
+    let x_89 : i32 = x_9.x_GLF_uniform_int_values[0];
+    if ((x_87 < x_89)) {
+    } else {
+      break;
+    }
+    let x_92 : i32 = i;
+    let x_94 : f32 = arr[x_92];
+    if (!((x_94 == 2.0))) {
+      let x_99 : f32 = x_6.x_GLF_uniform_float_values[1];
+      x_GLF_color = vec4<f32>(x_99, x_99, x_99, x_99);
+    }
+
+    continuing {
+      let x_101 : i32 = i;
+      i = (x_101 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-with-two-integers/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-with-two-integers/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..073d5f2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-with-two-integers/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,88 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+cbuffer cbuffer_x_9 : register(b1, space0) {
+  uint4 x_9[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float arr[5] = (float[5])0;
+  int i = 0;
+  int j = 0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_38 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_40 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const float x_42 = asfloat(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const float x_44 = asfloat(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+  const float x_46 = asfloat(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+  const float tint_symbol_4[5] = {x_38, x_40, x_42, x_44, x_46};
+  arr = tint_symbol_4;
+  const int x_49 = asint(x_9[1].x);
+  i = x_49;
+  j = 0;
+  while (true) {
+    const int x_54 = i;
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const int x_56 = asint(x_9[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    if ((x_54 < x_56)) {
+    } else {
+      break;
+    }
+    if ((j < -1)) {
+      break;
+    }
+    const int x_63 = j;
+    const float x_65 = arr[x_63];
+    arr[x_63] = (x_65 + 1.0f);
+    {
+      i = (i + 1);
+      j = (j + 1);
+    }
+  }
+  const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+  const float x_73 = asfloat(x_6[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+  const float x_75 = asfloat(x_6[1].x);
+  const float x_77 = asfloat(x_6[1].x);
+  const uint scalar_offset_7 = ((16u * uint(0))) / 4;
+  const float x_79 = asfloat(x_6[scalar_offset_7 / 4][scalar_offset_7 % 4]);
+  x_GLF_color = float4(x_73, x_75, x_77, x_79);
+  const int x_82 = asint(x_9[1].x);
+  i = x_82;
+  while (true) {
+    const int x_87 = i;
+    const uint scalar_offset_8 = ((16u * uint(0))) / 4;
+    const int x_89 = asint(x_9[scalar_offset_8 / 4][scalar_offset_8 % 4]);
+    if ((x_87 < x_89)) {
+    } else {
+      break;
+    }
+    const float x_94 = arr[i];
+    if (!((x_94 == 2.0f))) {
+      const float x_99 = asfloat(x_6[1].x);
+      x_GLF_color = float4(x_99, x_99, x_99, x_99);
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-with-two-integers/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-loop-with-two-integers/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..ec7cae1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-with-two-integers/0-opt.wgsl.expected.msl
@@ -0,0 +1,104 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_2 {
+  float arr[5];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_9, thread float4* const tint_symbol_5) {
+  tint_array_wrapper_2 arr = {};
+  int i = 0;
+  int j = 0;
+  float const x_38 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_40 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_42 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_44 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_46 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  tint_array_wrapper_2 const tint_symbol_3 = {.arr={x_38, x_40, x_42, x_44, x_46}};
+  arr = tint_symbol_3;
+  int const x_49 = x_9.x_GLF_uniform_int_values.arr[1].el;
+  i = x_49;
+  j = 0;
+  while (true) {
+    int const x_54 = i;
+    int const x_56 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_54 < x_56)) {
+    } else {
+      break;
+    }
+    int const x_59 = j;
+    if ((x_59 < -1)) {
+      break;
+    }
+    int const x_63 = j;
+    float const x_65 = arr.arr[x_63];
+    arr.arr[x_63] = (x_65 + 1.0f);
+    {
+      int const x_68 = i;
+      i = (x_68 + 1);
+      int const x_70 = j;
+      j = (x_70 + 1);
+    }
+  }
+  float const x_73 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_75 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  float const x_77 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  float const x_79 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  *(tint_symbol_5) = float4(x_73, x_75, x_77, x_79);
+  int const x_82 = x_9.x_GLF_uniform_int_values.arr[1].el;
+  i = x_82;
+  while (true) {
+    int const x_87 = i;
+    int const x_89 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_87 < x_89)) {
+    } else {
+      break;
+    }
+    int const x_92 = i;
+    float const x_94 = arr.arr[x_92];
+    if (!((x_94 == 2.0f))) {
+      float const x_99 = x_6.x_GLF_uniform_float_values.arr[1].el;
+      *(tint_symbol_5) = float4(x_99, x_99, x_99, x_99);
+    }
+    {
+      int const x_101 = i;
+      i = (x_101 + 1);
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_9 [[buffer(1)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-with-two-integers/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-loop-with-two-integers/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..193f5f4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-with-two-integers/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,206 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 125
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %arr "arr"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_float_uint_5 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_9 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %16
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+     %uint_5 = OpConstant %uint 5
+%_arr_float_uint_5 = OpTypeArray %float %uint_5
+%_ptr_Function__arr_float_uint_5 = OpTypePointer Function %_arr_float_uint_5
+         %27 = OpConstantNull %_arr_float_uint_5
+%_ptr_Function_int = OpTypePointer Function %int
+         %30 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+     %int_n1 = OpConstant %int -1
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+   %main_out = OpTypeStruct %v4float
+        %113 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+        %arr = OpVariable %_ptr_Function__arr_float_uint_5 Function %27
+          %i = OpVariable %_ptr_Function_int Function %30
+          %j = OpVariable %_ptr_Function_int Function %30
+         %35 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %36 = OpLoad %float %35
+         %37 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %38 = OpLoad %float %37
+         %39 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %40 = OpLoad %float %39
+         %41 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %42 = OpLoad %float %41
+         %43 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %44 = OpLoad %float %43
+         %45 = OpCompositeConstruct %_arr_float_uint_5 %36 %38 %40 %42 %44
+               OpStore %arr %45
+         %48 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %49 = OpLoad %int %48
+               OpStore %i %49
+               OpStore %j %int_0
+               OpBranch %50
+         %50 = OpLabel
+               OpLoopMerge %51 %52 None
+               OpBranch %53
+         %53 = OpLabel
+         %54 = OpLoad %int %i
+         %55 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %56 = OpLoad %int %55
+         %57 = OpSLessThan %bool %54 %56
+               OpSelectionMerge %59 None
+               OpBranchConditional %57 %60 %61
+         %60 = OpLabel
+               OpBranch %59
+         %61 = OpLabel
+               OpBranch %51
+         %59 = OpLabel
+         %62 = OpLoad %int %j
+         %64 = OpSLessThan %bool %62 %int_n1
+               OpSelectionMerge %65 None
+               OpBranchConditional %64 %66 %65
+         %66 = OpLabel
+               OpBranch %51
+         %65 = OpLabel
+         %67 = OpLoad %int %j
+         %69 = OpAccessChain %_ptr_Function_float %arr %67
+         %70 = OpLoad %float %69
+         %71 = OpAccessChain %_ptr_Function_float %arr %67
+         %73 = OpFAdd %float %70 %float_1
+               OpStore %71 %73
+               OpBranch %52
+         %52 = OpLabel
+         %74 = OpLoad %int %i
+         %75 = OpIAdd %int %74 %int_1
+               OpStore %i %75
+         %76 = OpLoad %int %j
+         %77 = OpIAdd %int %76 %int_1
+               OpStore %j %77
+               OpBranch %50
+         %51 = OpLabel
+         %78 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %79 = OpLoad %float %78
+         %80 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %81 = OpLoad %float %80
+         %82 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %83 = OpLoad %float %82
+         %84 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %85 = OpLoad %float %84
+         %86 = OpCompositeConstruct %v4float %79 %81 %83 %85
+               OpStore %x_GLF_color %86
+         %87 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %88 = OpLoad %int %87
+               OpStore %i %88
+               OpBranch %89
+         %89 = OpLabel
+               OpLoopMerge %90 %91 None
+               OpBranch %92
+         %92 = OpLabel
+         %93 = OpLoad %int %i
+         %94 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %95 = OpLoad %int %94
+         %96 = OpSLessThan %bool %93 %95
+               OpSelectionMerge %97 None
+               OpBranchConditional %96 %98 %99
+         %98 = OpLabel
+               OpBranch %97
+         %99 = OpLabel
+               OpBranch %90
+         %97 = OpLabel
+        %100 = OpLoad %int %i
+        %101 = OpAccessChain %_ptr_Function_float %arr %100
+        %102 = OpLoad %float %101
+        %105 = OpFOrdEqual %bool %102 %float_2
+        %103 = OpLogicalNot %bool %105
+               OpSelectionMerge %106 None
+               OpBranchConditional %103 %107 %106
+        %107 = OpLabel
+        %108 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+        %109 = OpLoad %float %108
+        %110 = OpCompositeConstruct %v4float %109 %109 %109 %109
+               OpStore %x_GLF_color %110
+               OpBranch %106
+        %106 = OpLabel
+               OpBranch %91
+         %91 = OpLabel
+        %111 = OpLoad %int %i
+        %112 = OpIAdd %int %111 %int_1
+               OpStore %i %112
+               OpBranch %89
+         %90 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %113
+%tint_symbol = OpFunctionParameter %main_out
+        %117 = OpLabel
+        %118 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %118
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+        %120 = OpLabel
+        %121 = OpFunctionCall %void %main_1
+        %123 = OpLoad %v4float %x_GLF_color
+        %124 = OpCompositeConstruct %main_out %123
+        %122 = OpFunctionCall %void %tint_symbol_2 %124
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-with-two-integers/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-with-two-integers/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..9bd8ed5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-loop-with-two-integers/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,94 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var arr : array<f32, 5>;
+  var i : i32;
+  var j : i32;
+  let x_38 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_40 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_42 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_44 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_46 : f32 = x_6.x_GLF_uniform_float_values[0];
+  arr = array<f32, 5>(x_38, x_40, x_42, x_44, x_46);
+  let x_49 : i32 = x_9.x_GLF_uniform_int_values[1];
+  i = x_49;
+  j = 0;
+  loop {
+    let x_54 : i32 = i;
+    let x_56 : i32 = x_9.x_GLF_uniform_int_values[0];
+    if ((x_54 < x_56)) {
+    } else {
+      break;
+    }
+    let x_59 : i32 = j;
+    if ((x_59 < -1)) {
+      break;
+    }
+    let x_63 : i32 = j;
+    let x_65 : f32 = arr[x_63];
+    arr[x_63] = (x_65 + 1.0);
+
+    continuing {
+      let x_68 : i32 = i;
+      i = (x_68 + 1);
+      let x_70 : i32 = j;
+      j = (x_70 + 1);
+    }
+  }
+  let x_73 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_75 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_77 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_79 : f32 = x_6.x_GLF_uniform_float_values[0];
+  x_GLF_color = vec4<f32>(x_73, x_75, x_77, x_79);
+  let x_82 : i32 = x_9.x_GLF_uniform_int_values[1];
+  i = x_82;
+  loop {
+    let x_87 : i32 = i;
+    let x_89 : i32 = x_9.x_GLF_uniform_int_values[0];
+    if ((x_87 < x_89)) {
+    } else {
+      break;
+    }
+    let x_92 : i32 = i;
+    let x_94 : f32 = arr[x_92];
+    if (!((x_94 == 2.0))) {
+      let x_99 : f32 = x_6.x_GLF_uniform_float_values[1];
+      x_GLF_color = vec4<f32>(x_99, x_99, x_99, x_99);
+    }
+
+    continuing {
+      let x_101 : i32 = i;
+      i = (x_101 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-machine-basic-block-for-for-for-less-than/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-machine-basic-block-for-for-for-less-than/0-opt.spvasm
new file mode 100644
index 0000000..d31c1e4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-machine-basic-block-for-for-for-less-than/0-opt.spvasm
@@ -0,0 +1,223 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color %gl_FragCoord
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %data "data"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpName %i_0 "i"
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_6 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+       %void = OpTypeVoid
+         %17 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_6 = OpConstant %uint 6
+%_arr_int_uint_6 = OpTypeArray %int %uint_6
+       %buf1 = OpTypeStruct %_arr_int_uint_6
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_5 = OpConstant %int 5
+     %uint_5 = OpConstant %uint 5
+%_arr_int_uint_5 = OpTypeArray %int %uint_5
+%_ptr_Function__arr_int_uint_5 = OpTypePointer Function %_arr_int_uint_5
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+%_ptr_Function_int = OpTypePointer Function %int
+       %bool = OpTypeBool
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %main = OpFunction %void None %17
+         %43 = OpLabel
+       %data = OpVariable %_ptr_Function__arr_int_uint_5 Function
+          %a = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+          %j = OpVariable %_ptr_Function_int Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+         %44 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %45 = OpLoad %int %44
+         %46 = OpConvertSToF %float %45
+         %47 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_5
+         %48 = OpLoad %int %47
+         %49 = OpConvertSToF %float %48
+         %50 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_5
+         %51 = OpLoad %int %50
+         %52 = OpConvertSToF %float %51
+         %53 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %54 = OpLoad %int %53
+         %55 = OpConvertSToF %float %54
+         %56 = OpCompositeConstruct %v4float %46 %49 %52 %55
+               OpStore %_GLF_color %56
+         %57 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %58 = OpLoad %int %57
+         %59 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %60 = OpLoad %int %59
+         %61 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %62 = OpLoad %int %61
+         %63 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_4
+         %64 = OpLoad %int %63
+         %65 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %66 = OpLoad %int %65
+         %67 = OpCompositeConstruct %_arr_int_uint_5 %58 %60 %62 %64 %66
+               OpStore %data %67
+         %68 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_5
+         %69 = OpLoad %int %68
+               OpStore %a %69
+               OpBranch %70
+         %70 = OpLabel
+               OpLoopMerge %71 %72 None
+               OpBranch %73
+         %73 = OpLabel
+         %74 = OpLoad %int %a
+         %75 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %76 = OpLoad %int %75
+         %77 = OpSLessThan %bool %74 %76
+               OpBranchConditional %77 %78 %71
+         %78 = OpLabel
+         %79 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_5
+         %80 = OpLoad %int %79
+               OpStore %i %80
+               OpBranch %81
+         %81 = OpLabel
+               OpLoopMerge %82 %83 None
+               OpBranch %84
+         %84 = OpLabel
+         %85 = OpLoad %int %i
+         %86 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %87 = OpLoad %int %86
+         %88 = OpSLessThan %bool %85 %87
+               OpBranchConditional %88 %89 %82
+         %89 = OpLabel
+         %90 = OpLoad %int %i
+               OpStore %j %90
+               OpBranch %91
+         %91 = OpLabel
+               OpLoopMerge %92 %93 None
+               OpBranch %94
+         %94 = OpLabel
+         %95 = OpLoad %int %j
+         %96 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %97 = OpLoad %int %96
+         %98 = OpSLessThan %bool %95 %97
+               OpBranchConditional %98 %99 %92
+         %99 = OpLabel
+        %100 = OpLoad %int %i
+        %101 = OpAccessChain %_ptr_Function_int %data %100
+        %102 = OpLoad %int %101
+        %103 = OpLoad %int %j
+        %104 = OpAccessChain %_ptr_Function_int %data %103
+        %105 = OpLoad %int %104
+        %106 = OpSLessThan %bool %102 %105
+               OpSelectionMerge %107 None
+               OpBranchConditional %106 %108 %107
+        %108 = OpLabel
+        %109 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_5
+        %110 = OpLoad %int %109
+        %111 = OpConvertSToF %float %110
+        %112 = OpCompositeConstruct %v4float %111 %111 %111 %111
+               OpStore %_GLF_color %112
+               OpBranch %107
+        %107 = OpLabel
+               OpBranch %93
+         %93 = OpLabel
+        %113 = OpLoad %int %j
+        %114 = OpIAdd %int %113 %int_1
+               OpStore %j %114
+               OpBranch %91
+         %92 = OpLabel
+               OpBranch %83
+         %83 = OpLabel
+        %115 = OpLoad %int %i
+        %116 = OpIAdd %int %115 %int_1
+               OpStore %i %116
+               OpBranch %81
+         %82 = OpLabel
+               OpBranch %72
+         %72 = OpLabel
+        %117 = OpLoad %int %a
+        %118 = OpIAdd %int %117 %int_1
+               OpStore %a %118
+               OpBranch %70
+         %71 = OpLabel
+               OpBranch %119
+        %119 = OpLabel
+               OpLoopMerge %120 %121 None
+               OpBranch %122
+        %122 = OpLabel
+        %123 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+        %124 = OpLoad %float %123
+        %125 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+        %126 = OpLoad %float %125
+        %127 = OpFOrdLessThan %bool %124 %126
+               OpBranchConditional %127 %128 %120
+        %128 = OpLabel
+        %129 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_5
+        %130 = OpLoad %int %129
+               OpStore %i_0 %130
+               OpBranch %131
+        %131 = OpLabel
+               OpLoopMerge %132 %133 None
+               OpBranch %134
+        %134 = OpLabel
+        %135 = OpLoad %int %i_0
+        %136 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+        %137 = OpLoad %int %136
+        %138 = OpSLessThan %bool %135 %137
+               OpBranchConditional %138 %139 %132
+        %139 = OpLabel
+        %140 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_5
+        %141 = OpLoad %int %140
+        %142 = OpConvertSToF %float %141
+        %143 = OpCompositeConstruct %v4float %142 %142 %142 %142
+               OpStore %_GLF_color %143
+               OpBranch %133
+        %133 = OpLabel
+        %144 = OpLoad %int %i_0
+        %145 = OpIAdd %int %144 %int_1
+               OpStore %i_0 %145
+               OpBranch %131
+        %132 = OpLabel
+               OpBranch %121
+        %121 = OpLabel
+               OpBranch %119
+        %120 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-machine-basic-block-for-for-for-less-than/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-machine-basic-block-for-for-for-less-than/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..e91ca1c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-machine-basic-block-for-for-for-less-than/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,123 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[6];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_12 : register(b0, space0) {
+  uint4 x_12[1];
+};
+
+void main_1() {
+  int data[5] = (int[5])0;
+  int a = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_45 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const int x_48 = asint(x_6[5].x);
+  const int x_51 = asint(x_6[5].x);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_54 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  x_GLF_color = float4(float(x_45), float(x_48), float(x_51), float(x_54));
+  const int x_58 = asint(x_6[1].x);
+  const int x_60 = asint(x_6[2].x);
+  const int x_62 = asint(x_6[3].x);
+  const int x_64 = asint(x_6[4].x);
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const int x_66 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  const int tint_symbol_6[5] = {x_58, x_60, x_62, x_64, x_66};
+  data = tint_symbol_6;
+  const int x_69 = asint(x_6[5].x);
+  a = x_69;
+  while (true) {
+    const int x_74 = a;
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_76 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    if ((x_74 < x_76)) {
+    } else {
+      break;
+    }
+    const int x_80 = asint(x_6[5].x);
+    i = x_80;
+    while (true) {
+      const int x_85 = i;
+      const int x_87 = asint(x_6[1].x);
+      if ((x_85 < x_87)) {
+      } else {
+        break;
+      }
+      j = i;
+      while (true) {
+        const int x_95 = j;
+        const int x_97 = asint(x_6[1].x);
+        if ((x_95 < x_97)) {
+        } else {
+          break;
+        }
+        const int x_102 = data[i];
+        const int x_105 = data[j];
+        if ((x_102 < x_105)) {
+          const int x_110 = asint(x_6[5].x);
+          const float x_111 = float(x_110);
+          x_GLF_color = float4(x_111, x_111, x_111, x_111);
+        }
+        {
+          j = (j + 1);
+        }
+      }
+      {
+        i = (i + 1);
+      }
+    }
+    {
+      a = (a + 1);
+    }
+  }
+  while (true) {
+    const float x_124 = gl_FragCoord.x;
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const float x_126 = asfloat(x_12[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    if ((x_124 < x_126)) {
+    } else {
+      break;
+    }
+    const int x_130 = asint(x_6[5].x);
+    i_1 = x_130;
+    while (true) {
+      const int x_135 = i_1;
+      const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+      const int x_137 = asint(x_6[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+      if ((x_135 < x_137)) {
+      } else {
+        break;
+      }
+      const int x_141 = asint(x_6[5].x);
+      const float x_142 = float(x_141);
+      x_GLF_color = float4(x_142, x_142, x_142, x_142);
+      {
+        i_1 = (i_1 + 1);
+      }
+    }
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_7 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_7;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-machine-basic-block-for-for-for-less-than/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-machine-basic-block-for-for-for-less-than/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..e35af4f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-machine-basic-block-for-for-for-less-than/0-opt.spvasm.expected.msl
@@ -0,0 +1,140 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[6];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct tint_array_wrapper_2 {
+  int arr[5];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_12, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  tint_array_wrapper_2 data = {};
+  int a = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  int const x_45 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_48 = x_6.x_GLF_uniform_int_values.arr[5].el;
+  int const x_51 = x_6.x_GLF_uniform_int_values.arr[5].el;
+  int const x_54 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  *(tint_symbol_6) = float4(float(x_45), float(x_48), float(x_51), float(x_54));
+  int const x_58 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_60 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_62 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  int const x_64 = x_6.x_GLF_uniform_int_values.arr[4].el;
+  int const x_66 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  tint_array_wrapper_2 const tint_symbol_4 = {.arr={x_58, x_60, x_62, x_64, x_66}};
+  data = tint_symbol_4;
+  int const x_69 = x_6.x_GLF_uniform_int_values.arr[5].el;
+  a = x_69;
+  while (true) {
+    int const x_74 = a;
+    int const x_76 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_74 < x_76)) {
+    } else {
+      break;
+    }
+    int const x_80 = x_6.x_GLF_uniform_int_values.arr[5].el;
+    i = x_80;
+    while (true) {
+      int const x_85 = i;
+      int const x_87 = x_6.x_GLF_uniform_int_values.arr[1].el;
+      if ((x_85 < x_87)) {
+      } else {
+        break;
+      }
+      int const x_90 = i;
+      j = x_90;
+      while (true) {
+        int const x_95 = j;
+        int const x_97 = x_6.x_GLF_uniform_int_values.arr[1].el;
+        if ((x_95 < x_97)) {
+        } else {
+          break;
+        }
+        int const x_100 = i;
+        int const x_102 = data.arr[x_100];
+        int const x_103 = j;
+        int const x_105 = data.arr[x_103];
+        if ((x_102 < x_105)) {
+          int const x_110 = x_6.x_GLF_uniform_int_values.arr[5].el;
+          float const x_111 = float(x_110);
+          *(tint_symbol_6) = float4(x_111, x_111, x_111, x_111);
+        }
+        {
+          int const x_113 = j;
+          j = (x_113 + 1);
+        }
+      }
+      {
+        int const x_115 = i;
+        i = (x_115 + 1);
+      }
+    }
+    {
+      int const x_117 = a;
+      a = (x_117 + 1);
+    }
+  }
+  while (true) {
+    float const x_124 = (*(tint_symbol_7)).x;
+    float const x_126 = x_12.x_GLF_uniform_float_values.arr[0].el;
+    if ((x_124 < x_126)) {
+    } else {
+      break;
+    }
+    int const x_130 = x_6.x_GLF_uniform_int_values.arr[5].el;
+    i_1 = x_130;
+    while (true) {
+      int const x_135 = i_1;
+      int const x_137 = x_6.x_GLF_uniform_int_values.arr[0].el;
+      if ((x_135 < x_137)) {
+      } else {
+        break;
+      }
+      int const x_141 = x_6.x_GLF_uniform_int_values.arr[5].el;
+      float const x_142 = float(x_141);
+      *(tint_symbol_6) = float4(x_142, x_142, x_142, x_142);
+      {
+        int const x_144 = i_1;
+        i_1 = (x_144 + 1);
+      }
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf1& x_6 [[buffer(1)]], constant buf0& x_12 [[buffer(0)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_6, x_12, &(tint_symbol_9), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-machine-basic-block-for-for-for-less-than/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-machine-basic-block-for-for-for-less-than/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..8577b92
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-machine-basic-block-for-for-for-less-than/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,287 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 174
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_12 "x_12"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %data "data"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %i_1 "i_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_6 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_12 NonWritable
+               OpDecorate %x_12 DescriptorSet 0
+               OpDecorate %x_12 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_int_uint_5 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_6 = OpConstant %uint 6
+%_arr_int_uint_6 = OpTypeArray %int %uint_6
+       %buf1 = OpTypeStruct %_arr_int_uint_6
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_12 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+     %uint_5 = OpConstant %uint 5
+%_arr_int_uint_5 = OpTypeArray %int %uint_5
+%_ptr_Function__arr_int_uint_5 = OpTypePointer Function %_arr_int_uint_5
+         %31 = OpConstantNull %_arr_int_uint_5
+%_ptr_Function_int = OpTypePointer Function %int
+         %34 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_5 = OpConstant %int 5
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+       %bool = OpTypeBool
+%_ptr_Private_float = OpTypePointer Private %float
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+   %main_out = OpTypeStruct %v4float
+        %161 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %23
+         %26 = OpLabel
+       %data = OpVariable %_ptr_Function__arr_int_uint_5 Function %31
+          %a = OpVariable %_ptr_Function_int Function %34
+          %i = OpVariable %_ptr_Function_int Function %34
+          %j = OpVariable %_ptr_Function_int Function %34
+        %i_1 = OpVariable %_ptr_Function_int Function %34
+         %41 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %42 = OpLoad %int %41
+         %44 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_5
+         %45 = OpLoad %int %44
+         %46 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_5
+         %47 = OpLoad %int %46
+         %48 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %49 = OpLoad %int %48
+         %50 = OpConvertSToF %float %42
+         %51 = OpConvertSToF %float %45
+         %52 = OpConvertSToF %float %47
+         %53 = OpConvertSToF %float %49
+         %54 = OpCompositeConstruct %v4float %50 %51 %52 %53
+               OpStore %x_GLF_color %54
+         %56 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %57 = OpLoad %int %56
+         %59 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %60 = OpLoad %int %59
+         %62 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %63 = OpLoad %int %62
+         %65 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+         %66 = OpLoad %int %65
+         %67 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %68 = OpLoad %int %67
+         %69 = OpCompositeConstruct %_arr_int_uint_5 %57 %60 %63 %66 %68
+               OpStore %data %69
+         %70 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_5
+         %71 = OpLoad %int %70
+               OpStore %a %71
+               OpBranch %72
+         %72 = OpLabel
+               OpLoopMerge %73 %74 None
+               OpBranch %75
+         %75 = OpLabel
+         %76 = OpLoad %int %a
+         %77 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %78 = OpLoad %int %77
+         %79 = OpSLessThan %bool %76 %78
+               OpSelectionMerge %81 None
+               OpBranchConditional %79 %82 %83
+         %82 = OpLabel
+               OpBranch %81
+         %83 = OpLabel
+               OpBranch %73
+         %81 = OpLabel
+         %84 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_5
+         %85 = OpLoad %int %84
+               OpStore %i %85
+               OpBranch %86
+         %86 = OpLabel
+               OpLoopMerge %87 %88 None
+               OpBranch %89
+         %89 = OpLabel
+         %90 = OpLoad %int %i
+         %91 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %92 = OpLoad %int %91
+         %93 = OpSLessThan %bool %90 %92
+               OpSelectionMerge %94 None
+               OpBranchConditional %93 %95 %96
+         %95 = OpLabel
+               OpBranch %94
+         %96 = OpLabel
+               OpBranch %87
+         %94 = OpLabel
+         %97 = OpLoad %int %i
+               OpStore %j %97
+               OpBranch %98
+         %98 = OpLabel
+               OpLoopMerge %99 %100 None
+               OpBranch %101
+        %101 = OpLabel
+        %102 = OpLoad %int %j
+        %103 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %104 = OpLoad %int %103
+        %105 = OpSLessThan %bool %102 %104
+               OpSelectionMerge %106 None
+               OpBranchConditional %105 %107 %108
+        %107 = OpLabel
+               OpBranch %106
+        %108 = OpLabel
+               OpBranch %99
+        %106 = OpLabel
+        %109 = OpLoad %int %i
+        %110 = OpAccessChain %_ptr_Function_int %data %109
+        %111 = OpLoad %int %110
+        %112 = OpLoad %int %j
+        %113 = OpAccessChain %_ptr_Function_int %data %112
+        %114 = OpLoad %int %113
+        %115 = OpSLessThan %bool %111 %114
+               OpSelectionMerge %116 None
+               OpBranchConditional %115 %117 %116
+        %117 = OpLabel
+        %118 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_5
+        %119 = OpLoad %int %118
+        %120 = OpConvertSToF %float %119
+        %121 = OpCompositeConstruct %v4float %120 %120 %120 %120
+               OpStore %x_GLF_color %121
+               OpBranch %116
+        %116 = OpLabel
+               OpBranch %100
+        %100 = OpLabel
+        %122 = OpLoad %int %j
+        %123 = OpIAdd %int %122 %int_1
+               OpStore %j %123
+               OpBranch %98
+         %99 = OpLabel
+               OpBranch %88
+         %88 = OpLabel
+        %124 = OpLoad %int %i
+        %125 = OpIAdd %int %124 %int_1
+               OpStore %i %125
+               OpBranch %86
+         %87 = OpLabel
+               OpBranch %74
+         %74 = OpLabel
+        %126 = OpLoad %int %a
+        %127 = OpIAdd %int %126 %int_1
+               OpStore %a %127
+               OpBranch %72
+         %73 = OpLabel
+               OpBranch %128
+        %128 = OpLabel
+               OpLoopMerge %129 %130 None
+               OpBranch %131
+        %131 = OpLabel
+        %133 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+        %134 = OpLoad %float %133
+        %136 = OpAccessChain %_ptr_Uniform_float %x_12 %uint_0 %int_0
+        %137 = OpLoad %float %136
+        %138 = OpFOrdLessThan %bool %134 %137
+               OpSelectionMerge %139 None
+               OpBranchConditional %138 %140 %141
+        %140 = OpLabel
+               OpBranch %139
+        %141 = OpLabel
+               OpBranch %129
+        %139 = OpLabel
+        %142 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_5
+        %143 = OpLoad %int %142
+               OpStore %i_1 %143
+               OpBranch %144
+        %144 = OpLabel
+               OpLoopMerge %145 %146 None
+               OpBranch %147
+        %147 = OpLabel
+        %148 = OpLoad %int %i_1
+        %149 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %150 = OpLoad %int %149
+        %151 = OpSLessThan %bool %148 %150
+               OpSelectionMerge %152 None
+               OpBranchConditional %151 %153 %154
+        %153 = OpLabel
+               OpBranch %152
+        %154 = OpLabel
+               OpBranch %145
+        %152 = OpLabel
+        %155 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_5
+        %156 = OpLoad %int %155
+        %157 = OpConvertSToF %float %156
+        %158 = OpCompositeConstruct %v4float %157 %157 %157 %157
+               OpStore %x_GLF_color %158
+               OpBranch %146
+        %146 = OpLabel
+        %159 = OpLoad %int %i_1
+        %160 = OpIAdd %int %159 %int_1
+               OpStore %i_1 %160
+               OpBranch %144
+        %145 = OpLabel
+               OpBranch %130
+        %130 = OpLabel
+               OpBranch %128
+        %129 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %161
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %165 = OpLabel
+        %166 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %166
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %23
+        %168 = OpLabel
+        %169 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %169
+        %170 = OpFunctionCall %void %main_1
+        %172 = OpLoad %v4float %x_GLF_color
+        %173 = OpCompositeConstruct %main_out %172
+        %171 = OpFunctionCall %void %tint_symbol_3 %173
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-machine-basic-block-for-for-for-less-than/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-machine-basic-block-for-for-for-less-than/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..b603ec3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-machine-basic-block-for-for-for-less-than/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,133 @@
+type Arr = [[stride(16)]] array<i32, 6>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_12 : buf0;
+
+fn main_1() {
+  var data : array<i32, 5>;
+  var a : i32;
+  var i : i32;
+  var j : i32;
+  var i_1 : i32;
+  let x_45 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_48 : i32 = x_6.x_GLF_uniform_int_values[5];
+  let x_51 : i32 = x_6.x_GLF_uniform_int_values[5];
+  let x_54 : i32 = x_6.x_GLF_uniform_int_values[0];
+  x_GLF_color = vec4<f32>(f32(x_45), f32(x_48), f32(x_51), f32(x_54));
+  let x_58 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_60 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_62 : i32 = x_6.x_GLF_uniform_int_values[3];
+  let x_64 : i32 = x_6.x_GLF_uniform_int_values[4];
+  let x_66 : i32 = x_6.x_GLF_uniform_int_values[0];
+  data = array<i32, 5>(x_58, x_60, x_62, x_64, x_66);
+  let x_69 : i32 = x_6.x_GLF_uniform_int_values[5];
+  a = x_69;
+  loop {
+    let x_74 : i32 = a;
+    let x_76 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_74 < x_76)) {
+    } else {
+      break;
+    }
+    let x_80 : i32 = x_6.x_GLF_uniform_int_values[5];
+    i = x_80;
+    loop {
+      let x_85 : i32 = i;
+      let x_87 : i32 = x_6.x_GLF_uniform_int_values[1];
+      if ((x_85 < x_87)) {
+      } else {
+        break;
+      }
+      let x_90 : i32 = i;
+      j = x_90;
+      loop {
+        let x_95 : i32 = j;
+        let x_97 : i32 = x_6.x_GLF_uniform_int_values[1];
+        if ((x_95 < x_97)) {
+        } else {
+          break;
+        }
+        let x_100 : i32 = i;
+        let x_102 : i32 = data[x_100];
+        let x_103 : i32 = j;
+        let x_105 : i32 = data[x_103];
+        if ((x_102 < x_105)) {
+          let x_110 : i32 = x_6.x_GLF_uniform_int_values[5];
+          let x_111 : f32 = f32(x_110);
+          x_GLF_color = vec4<f32>(x_111, x_111, x_111, x_111);
+        }
+
+        continuing {
+          let x_113 : i32 = j;
+          j = (x_113 + 1);
+        }
+      }
+
+      continuing {
+        let x_115 : i32 = i;
+        i = (x_115 + 1);
+      }
+    }
+
+    continuing {
+      let x_117 : i32 = a;
+      a = (x_117 + 1);
+    }
+  }
+  loop {
+    let x_124 : f32 = gl_FragCoord.x;
+    let x_126 : f32 = x_12.x_GLF_uniform_float_values[0];
+    if ((x_124 < x_126)) {
+    } else {
+      break;
+    }
+    let x_130 : i32 = x_6.x_GLF_uniform_int_values[5];
+    i_1 = x_130;
+    loop {
+      let x_135 : i32 = i_1;
+      let x_137 : i32 = x_6.x_GLF_uniform_int_values[0];
+      if ((x_135 < x_137)) {
+      } else {
+        break;
+      }
+      let x_141 : i32 = x_6.x_GLF_uniform_int_values[5];
+      let x_142 : f32 = f32(x_141);
+      x_GLF_color = vec4<f32>(x_142, x_142, x_142, x_142);
+
+      continuing {
+        let x_144 : i32 = i_1;
+        i_1 = (x_144 + 1);
+      }
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-machine-basic-block-for-for-for-less-than/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-machine-basic-block-for-for-for-less-than/0-opt.wgsl
new file mode 100644
index 0000000..b603ec3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-machine-basic-block-for-for-for-less-than/0-opt.wgsl
@@ -0,0 +1,133 @@
+type Arr = [[stride(16)]] array<i32, 6>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_12 : buf0;
+
+fn main_1() {
+  var data : array<i32, 5>;
+  var a : i32;
+  var i : i32;
+  var j : i32;
+  var i_1 : i32;
+  let x_45 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_48 : i32 = x_6.x_GLF_uniform_int_values[5];
+  let x_51 : i32 = x_6.x_GLF_uniform_int_values[5];
+  let x_54 : i32 = x_6.x_GLF_uniform_int_values[0];
+  x_GLF_color = vec4<f32>(f32(x_45), f32(x_48), f32(x_51), f32(x_54));
+  let x_58 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_60 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_62 : i32 = x_6.x_GLF_uniform_int_values[3];
+  let x_64 : i32 = x_6.x_GLF_uniform_int_values[4];
+  let x_66 : i32 = x_6.x_GLF_uniform_int_values[0];
+  data = array<i32, 5>(x_58, x_60, x_62, x_64, x_66);
+  let x_69 : i32 = x_6.x_GLF_uniform_int_values[5];
+  a = x_69;
+  loop {
+    let x_74 : i32 = a;
+    let x_76 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_74 < x_76)) {
+    } else {
+      break;
+    }
+    let x_80 : i32 = x_6.x_GLF_uniform_int_values[5];
+    i = x_80;
+    loop {
+      let x_85 : i32 = i;
+      let x_87 : i32 = x_6.x_GLF_uniform_int_values[1];
+      if ((x_85 < x_87)) {
+      } else {
+        break;
+      }
+      let x_90 : i32 = i;
+      j = x_90;
+      loop {
+        let x_95 : i32 = j;
+        let x_97 : i32 = x_6.x_GLF_uniform_int_values[1];
+        if ((x_95 < x_97)) {
+        } else {
+          break;
+        }
+        let x_100 : i32 = i;
+        let x_102 : i32 = data[x_100];
+        let x_103 : i32 = j;
+        let x_105 : i32 = data[x_103];
+        if ((x_102 < x_105)) {
+          let x_110 : i32 = x_6.x_GLF_uniform_int_values[5];
+          let x_111 : f32 = f32(x_110);
+          x_GLF_color = vec4<f32>(x_111, x_111, x_111, x_111);
+        }
+
+        continuing {
+          let x_113 : i32 = j;
+          j = (x_113 + 1);
+        }
+      }
+
+      continuing {
+        let x_115 : i32 = i;
+        i = (x_115 + 1);
+      }
+    }
+
+    continuing {
+      let x_117 : i32 = a;
+      a = (x_117 + 1);
+    }
+  }
+  loop {
+    let x_124 : f32 = gl_FragCoord.x;
+    let x_126 : f32 = x_12.x_GLF_uniform_float_values[0];
+    if ((x_124 < x_126)) {
+    } else {
+      break;
+    }
+    let x_130 : i32 = x_6.x_GLF_uniform_int_values[5];
+    i_1 = x_130;
+    loop {
+      let x_135 : i32 = i_1;
+      let x_137 : i32 = x_6.x_GLF_uniform_int_values[0];
+      if ((x_135 < x_137)) {
+      } else {
+        break;
+      }
+      let x_141 : i32 = x_6.x_GLF_uniform_int_values[5];
+      let x_142 : f32 = f32(x_141);
+      x_GLF_color = vec4<f32>(x_142, x_142, x_142, x_142);
+
+      continuing {
+        let x_144 : i32 = i_1;
+        i_1 = (x_144 + 1);
+      }
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-machine-basic-block-for-for-for-less-than/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-machine-basic-block-for-for-for-less-than/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..e91ca1c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-machine-basic-block-for-for-for-less-than/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,123 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[6];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_12 : register(b0, space0) {
+  uint4 x_12[1];
+};
+
+void main_1() {
+  int data[5] = (int[5])0;
+  int a = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_45 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const int x_48 = asint(x_6[5].x);
+  const int x_51 = asint(x_6[5].x);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_54 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  x_GLF_color = float4(float(x_45), float(x_48), float(x_51), float(x_54));
+  const int x_58 = asint(x_6[1].x);
+  const int x_60 = asint(x_6[2].x);
+  const int x_62 = asint(x_6[3].x);
+  const int x_64 = asint(x_6[4].x);
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const int x_66 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  const int tint_symbol_6[5] = {x_58, x_60, x_62, x_64, x_66};
+  data = tint_symbol_6;
+  const int x_69 = asint(x_6[5].x);
+  a = x_69;
+  while (true) {
+    const int x_74 = a;
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_76 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    if ((x_74 < x_76)) {
+    } else {
+      break;
+    }
+    const int x_80 = asint(x_6[5].x);
+    i = x_80;
+    while (true) {
+      const int x_85 = i;
+      const int x_87 = asint(x_6[1].x);
+      if ((x_85 < x_87)) {
+      } else {
+        break;
+      }
+      j = i;
+      while (true) {
+        const int x_95 = j;
+        const int x_97 = asint(x_6[1].x);
+        if ((x_95 < x_97)) {
+        } else {
+          break;
+        }
+        const int x_102 = data[i];
+        const int x_105 = data[j];
+        if ((x_102 < x_105)) {
+          const int x_110 = asint(x_6[5].x);
+          const float x_111 = float(x_110);
+          x_GLF_color = float4(x_111, x_111, x_111, x_111);
+        }
+        {
+          j = (j + 1);
+        }
+      }
+      {
+        i = (i + 1);
+      }
+    }
+    {
+      a = (a + 1);
+    }
+  }
+  while (true) {
+    const float x_124 = gl_FragCoord.x;
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const float x_126 = asfloat(x_12[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    if ((x_124 < x_126)) {
+    } else {
+      break;
+    }
+    const int x_130 = asint(x_6[5].x);
+    i_1 = x_130;
+    while (true) {
+      const int x_135 = i_1;
+      const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+      const int x_137 = asint(x_6[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+      if ((x_135 < x_137)) {
+      } else {
+        break;
+      }
+      const int x_141 = asint(x_6[5].x);
+      const float x_142 = float(x_141);
+      x_GLF_color = float4(x_142, x_142, x_142, x_142);
+      {
+        i_1 = (i_1 + 1);
+      }
+    }
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_7 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_7;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-machine-basic-block-for-for-for-less-than/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-machine-basic-block-for-for-for-less-than/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..e35af4f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-machine-basic-block-for-for-for-less-than/0-opt.wgsl.expected.msl
@@ -0,0 +1,140 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[6];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct tint_array_wrapper_2 {
+  int arr[5];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_12, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  tint_array_wrapper_2 data = {};
+  int a = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  int const x_45 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_48 = x_6.x_GLF_uniform_int_values.arr[5].el;
+  int const x_51 = x_6.x_GLF_uniform_int_values.arr[5].el;
+  int const x_54 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  *(tint_symbol_6) = float4(float(x_45), float(x_48), float(x_51), float(x_54));
+  int const x_58 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_60 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_62 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  int const x_64 = x_6.x_GLF_uniform_int_values.arr[4].el;
+  int const x_66 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  tint_array_wrapper_2 const tint_symbol_4 = {.arr={x_58, x_60, x_62, x_64, x_66}};
+  data = tint_symbol_4;
+  int const x_69 = x_6.x_GLF_uniform_int_values.arr[5].el;
+  a = x_69;
+  while (true) {
+    int const x_74 = a;
+    int const x_76 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_74 < x_76)) {
+    } else {
+      break;
+    }
+    int const x_80 = x_6.x_GLF_uniform_int_values.arr[5].el;
+    i = x_80;
+    while (true) {
+      int const x_85 = i;
+      int const x_87 = x_6.x_GLF_uniform_int_values.arr[1].el;
+      if ((x_85 < x_87)) {
+      } else {
+        break;
+      }
+      int const x_90 = i;
+      j = x_90;
+      while (true) {
+        int const x_95 = j;
+        int const x_97 = x_6.x_GLF_uniform_int_values.arr[1].el;
+        if ((x_95 < x_97)) {
+        } else {
+          break;
+        }
+        int const x_100 = i;
+        int const x_102 = data.arr[x_100];
+        int const x_103 = j;
+        int const x_105 = data.arr[x_103];
+        if ((x_102 < x_105)) {
+          int const x_110 = x_6.x_GLF_uniform_int_values.arr[5].el;
+          float const x_111 = float(x_110);
+          *(tint_symbol_6) = float4(x_111, x_111, x_111, x_111);
+        }
+        {
+          int const x_113 = j;
+          j = (x_113 + 1);
+        }
+      }
+      {
+        int const x_115 = i;
+        i = (x_115 + 1);
+      }
+    }
+    {
+      int const x_117 = a;
+      a = (x_117 + 1);
+    }
+  }
+  while (true) {
+    float const x_124 = (*(tint_symbol_7)).x;
+    float const x_126 = x_12.x_GLF_uniform_float_values.arr[0].el;
+    if ((x_124 < x_126)) {
+    } else {
+      break;
+    }
+    int const x_130 = x_6.x_GLF_uniform_int_values.arr[5].el;
+    i_1 = x_130;
+    while (true) {
+      int const x_135 = i_1;
+      int const x_137 = x_6.x_GLF_uniform_int_values.arr[0].el;
+      if ((x_135 < x_137)) {
+      } else {
+        break;
+      }
+      int const x_141 = x_6.x_GLF_uniform_int_values.arr[5].el;
+      float const x_142 = float(x_141);
+      *(tint_symbol_6) = float4(x_142, x_142, x_142, x_142);
+      {
+        int const x_144 = i_1;
+        i_1 = (x_144 + 1);
+      }
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf1& x_6 [[buffer(1)]], constant buf0& x_12 [[buffer(0)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_6, x_12, &(tint_symbol_9), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-machine-basic-block-for-for-for-less-than/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-machine-basic-block-for-for-for-less-than/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..8577b92
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-machine-basic-block-for-for-for-less-than/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,287 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 174
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_12 "x_12"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %data "data"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %i_1 "i_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_6 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_12 NonWritable
+               OpDecorate %x_12 DescriptorSet 0
+               OpDecorate %x_12 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_int_uint_5 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_6 = OpConstant %uint 6
+%_arr_int_uint_6 = OpTypeArray %int %uint_6
+       %buf1 = OpTypeStruct %_arr_int_uint_6
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_12 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+     %uint_5 = OpConstant %uint 5
+%_arr_int_uint_5 = OpTypeArray %int %uint_5
+%_ptr_Function__arr_int_uint_5 = OpTypePointer Function %_arr_int_uint_5
+         %31 = OpConstantNull %_arr_int_uint_5
+%_ptr_Function_int = OpTypePointer Function %int
+         %34 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_5 = OpConstant %int 5
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+       %bool = OpTypeBool
+%_ptr_Private_float = OpTypePointer Private %float
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+   %main_out = OpTypeStruct %v4float
+        %161 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %23
+         %26 = OpLabel
+       %data = OpVariable %_ptr_Function__arr_int_uint_5 Function %31
+          %a = OpVariable %_ptr_Function_int Function %34
+          %i = OpVariable %_ptr_Function_int Function %34
+          %j = OpVariable %_ptr_Function_int Function %34
+        %i_1 = OpVariable %_ptr_Function_int Function %34
+         %41 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %42 = OpLoad %int %41
+         %44 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_5
+         %45 = OpLoad %int %44
+         %46 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_5
+         %47 = OpLoad %int %46
+         %48 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %49 = OpLoad %int %48
+         %50 = OpConvertSToF %float %42
+         %51 = OpConvertSToF %float %45
+         %52 = OpConvertSToF %float %47
+         %53 = OpConvertSToF %float %49
+         %54 = OpCompositeConstruct %v4float %50 %51 %52 %53
+               OpStore %x_GLF_color %54
+         %56 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %57 = OpLoad %int %56
+         %59 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %60 = OpLoad %int %59
+         %62 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %63 = OpLoad %int %62
+         %65 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+         %66 = OpLoad %int %65
+         %67 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %68 = OpLoad %int %67
+         %69 = OpCompositeConstruct %_arr_int_uint_5 %57 %60 %63 %66 %68
+               OpStore %data %69
+         %70 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_5
+         %71 = OpLoad %int %70
+               OpStore %a %71
+               OpBranch %72
+         %72 = OpLabel
+               OpLoopMerge %73 %74 None
+               OpBranch %75
+         %75 = OpLabel
+         %76 = OpLoad %int %a
+         %77 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %78 = OpLoad %int %77
+         %79 = OpSLessThan %bool %76 %78
+               OpSelectionMerge %81 None
+               OpBranchConditional %79 %82 %83
+         %82 = OpLabel
+               OpBranch %81
+         %83 = OpLabel
+               OpBranch %73
+         %81 = OpLabel
+         %84 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_5
+         %85 = OpLoad %int %84
+               OpStore %i %85
+               OpBranch %86
+         %86 = OpLabel
+               OpLoopMerge %87 %88 None
+               OpBranch %89
+         %89 = OpLabel
+         %90 = OpLoad %int %i
+         %91 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %92 = OpLoad %int %91
+         %93 = OpSLessThan %bool %90 %92
+               OpSelectionMerge %94 None
+               OpBranchConditional %93 %95 %96
+         %95 = OpLabel
+               OpBranch %94
+         %96 = OpLabel
+               OpBranch %87
+         %94 = OpLabel
+         %97 = OpLoad %int %i
+               OpStore %j %97
+               OpBranch %98
+         %98 = OpLabel
+               OpLoopMerge %99 %100 None
+               OpBranch %101
+        %101 = OpLabel
+        %102 = OpLoad %int %j
+        %103 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %104 = OpLoad %int %103
+        %105 = OpSLessThan %bool %102 %104
+               OpSelectionMerge %106 None
+               OpBranchConditional %105 %107 %108
+        %107 = OpLabel
+               OpBranch %106
+        %108 = OpLabel
+               OpBranch %99
+        %106 = OpLabel
+        %109 = OpLoad %int %i
+        %110 = OpAccessChain %_ptr_Function_int %data %109
+        %111 = OpLoad %int %110
+        %112 = OpLoad %int %j
+        %113 = OpAccessChain %_ptr_Function_int %data %112
+        %114 = OpLoad %int %113
+        %115 = OpSLessThan %bool %111 %114
+               OpSelectionMerge %116 None
+               OpBranchConditional %115 %117 %116
+        %117 = OpLabel
+        %118 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_5
+        %119 = OpLoad %int %118
+        %120 = OpConvertSToF %float %119
+        %121 = OpCompositeConstruct %v4float %120 %120 %120 %120
+               OpStore %x_GLF_color %121
+               OpBranch %116
+        %116 = OpLabel
+               OpBranch %100
+        %100 = OpLabel
+        %122 = OpLoad %int %j
+        %123 = OpIAdd %int %122 %int_1
+               OpStore %j %123
+               OpBranch %98
+         %99 = OpLabel
+               OpBranch %88
+         %88 = OpLabel
+        %124 = OpLoad %int %i
+        %125 = OpIAdd %int %124 %int_1
+               OpStore %i %125
+               OpBranch %86
+         %87 = OpLabel
+               OpBranch %74
+         %74 = OpLabel
+        %126 = OpLoad %int %a
+        %127 = OpIAdd %int %126 %int_1
+               OpStore %a %127
+               OpBranch %72
+         %73 = OpLabel
+               OpBranch %128
+        %128 = OpLabel
+               OpLoopMerge %129 %130 None
+               OpBranch %131
+        %131 = OpLabel
+        %133 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+        %134 = OpLoad %float %133
+        %136 = OpAccessChain %_ptr_Uniform_float %x_12 %uint_0 %int_0
+        %137 = OpLoad %float %136
+        %138 = OpFOrdLessThan %bool %134 %137
+               OpSelectionMerge %139 None
+               OpBranchConditional %138 %140 %141
+        %140 = OpLabel
+               OpBranch %139
+        %141 = OpLabel
+               OpBranch %129
+        %139 = OpLabel
+        %142 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_5
+        %143 = OpLoad %int %142
+               OpStore %i_1 %143
+               OpBranch %144
+        %144 = OpLabel
+               OpLoopMerge %145 %146 None
+               OpBranch %147
+        %147 = OpLabel
+        %148 = OpLoad %int %i_1
+        %149 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %150 = OpLoad %int %149
+        %151 = OpSLessThan %bool %148 %150
+               OpSelectionMerge %152 None
+               OpBranchConditional %151 %153 %154
+        %153 = OpLabel
+               OpBranch %152
+        %154 = OpLabel
+               OpBranch %145
+        %152 = OpLabel
+        %155 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_5
+        %156 = OpLoad %int %155
+        %157 = OpConvertSToF %float %156
+        %158 = OpCompositeConstruct %v4float %157 %157 %157 %157
+               OpStore %x_GLF_color %158
+               OpBranch %146
+        %146 = OpLabel
+        %159 = OpLoad %int %i_1
+        %160 = OpIAdd %int %159 %int_1
+               OpStore %i_1 %160
+               OpBranch %144
+        %145 = OpLabel
+               OpBranch %130
+        %130 = OpLabel
+               OpBranch %128
+        %129 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %161
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %165 = OpLabel
+        %166 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %166
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %23
+        %168 = OpLabel
+        %169 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %169
+        %170 = OpFunctionCall %void %main_1
+        %172 = OpLoad %v4float %x_GLF_color
+        %173 = OpCompositeConstruct %main_out %172
+        %171 = OpFunctionCall %void %tint_symbol_3 %173
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-machine-basic-block-for-for-for-less-than/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-machine-basic-block-for-for-for-less-than/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..b603ec3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-machine-basic-block-for-for-for-less-than/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,133 @@
+type Arr = [[stride(16)]] array<i32, 6>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_12 : buf0;
+
+fn main_1() {
+  var data : array<i32, 5>;
+  var a : i32;
+  var i : i32;
+  var j : i32;
+  var i_1 : i32;
+  let x_45 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_48 : i32 = x_6.x_GLF_uniform_int_values[5];
+  let x_51 : i32 = x_6.x_GLF_uniform_int_values[5];
+  let x_54 : i32 = x_6.x_GLF_uniform_int_values[0];
+  x_GLF_color = vec4<f32>(f32(x_45), f32(x_48), f32(x_51), f32(x_54));
+  let x_58 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_60 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_62 : i32 = x_6.x_GLF_uniform_int_values[3];
+  let x_64 : i32 = x_6.x_GLF_uniform_int_values[4];
+  let x_66 : i32 = x_6.x_GLF_uniform_int_values[0];
+  data = array<i32, 5>(x_58, x_60, x_62, x_64, x_66);
+  let x_69 : i32 = x_6.x_GLF_uniform_int_values[5];
+  a = x_69;
+  loop {
+    let x_74 : i32 = a;
+    let x_76 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_74 < x_76)) {
+    } else {
+      break;
+    }
+    let x_80 : i32 = x_6.x_GLF_uniform_int_values[5];
+    i = x_80;
+    loop {
+      let x_85 : i32 = i;
+      let x_87 : i32 = x_6.x_GLF_uniform_int_values[1];
+      if ((x_85 < x_87)) {
+      } else {
+        break;
+      }
+      let x_90 : i32 = i;
+      j = x_90;
+      loop {
+        let x_95 : i32 = j;
+        let x_97 : i32 = x_6.x_GLF_uniform_int_values[1];
+        if ((x_95 < x_97)) {
+        } else {
+          break;
+        }
+        let x_100 : i32 = i;
+        let x_102 : i32 = data[x_100];
+        let x_103 : i32 = j;
+        let x_105 : i32 = data[x_103];
+        if ((x_102 < x_105)) {
+          let x_110 : i32 = x_6.x_GLF_uniform_int_values[5];
+          let x_111 : f32 = f32(x_110);
+          x_GLF_color = vec4<f32>(x_111, x_111, x_111, x_111);
+        }
+
+        continuing {
+          let x_113 : i32 = j;
+          j = (x_113 + 1);
+        }
+      }
+
+      continuing {
+        let x_115 : i32 = i;
+        i = (x_115 + 1);
+      }
+    }
+
+    continuing {
+      let x_117 : i32 = a;
+      a = (x_117 + 1);
+    }
+  }
+  loop {
+    let x_124 : f32 = gl_FragCoord.x;
+    let x_126 : f32 = x_12.x_GLF_uniform_float_values[0];
+    if ((x_124 < x_126)) {
+    } else {
+      break;
+    }
+    let x_130 : i32 = x_6.x_GLF_uniform_int_values[5];
+    i_1 = x_130;
+    loop {
+      let x_135 : i32 = i_1;
+      let x_137 : i32 = x_6.x_GLF_uniform_int_values[0];
+      if ((x_135 < x_137)) {
+      } else {
+        break;
+      }
+      let x_141 : i32 = x_6.x_GLF_uniform_int_values[5];
+      let x_142 : f32 = f32(x_141);
+      x_GLF_color = vec4<f32>(x_142, x_142, x_142, x_142);
+
+      continuing {
+        let x_144 : i32 = i_1;
+        i_1 = (x_144 + 1);
+      }
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-machine-scheduler-for-if-pow/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-machine-scheduler-for-if-pow/0-opt.spvasm
new file mode 100644
index 0000000..1632f14
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-machine-scheduler-for-if-pow/0-opt.spvasm
@@ -0,0 +1,182 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_v1
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %uv "uv"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %v1 "v1"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %a "a"
+               OpName %i "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %_GLF_v1 "_GLF_v1"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_arr_float_uint_4 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %i RelaxedPrecision
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %15 RelaxedPrecision
+               OpDecorate %16 RelaxedPrecision
+               OpDecorate %17 RelaxedPrecision
+               OpDecorate %18 RelaxedPrecision
+               OpDecorate %19 RelaxedPrecision
+               OpDecorate %_GLF_v1 Location 0
+               OpDecorate %20 RelaxedPrecision
+       %void = OpTypeVoid
+         %22 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+       %buf1 = OpTypeStruct %_arr_float_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_float = OpTypePointer Function %float
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+     %uint_0 = OpConstant %uint 0
+     %uint_2 = OpConstant %uint 2
+     %uint_3 = OpConstant %uint 3
+%_ptr_Function_int = OpTypePointer Function %int
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+    %_GLF_v1 = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %22
+         %48 = OpLabel
+         %uv = OpVariable %_ptr_Function_v2float Function
+         %v1 = OpVariable %_ptr_Function_v4float Function
+          %a = OpVariable %_ptr_Function_float Function
+          %i = OpVariable %_ptr_Function_int Function
+         %49 = OpLoad %v4float %gl_FragCoord
+         %50 = OpVectorShuffle %v2float %49 %49 0 1
+               OpStore %uv %50
+         %51 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %52 = OpLoad %float %51
+         %53 = OpCompositeConstruct %v4float %52 %52 %52 %52
+               OpStore %v1 %53
+         %54 = OpAccessChain %_ptr_Function_float %uv %uint_1
+         %55 = OpLoad %float %54
+         %56 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %57 = OpLoad %float %56
+         %58 = OpFOrdGreaterThanEqual %bool %55 %57
+               OpSelectionMerge %59 None
+               OpBranchConditional %58 %60 %59
+         %60 = OpLabel
+         %61 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %62 = OpLoad %float %61
+         %63 = OpAccessChain %_ptr_Function_float %v1 %uint_0
+               OpStore %63 %62
+         %64 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %65 = OpLoad %float %64
+         %66 = OpAccessChain %_ptr_Function_float %v1 %uint_1
+               OpStore %66 %65
+         %67 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %68 = OpLoad %float %67
+         %69 = OpAccessChain %_ptr_Function_float %v1 %uint_2
+               OpStore %69 %68
+         %70 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %71 = OpLoad %float %70
+         %72 = OpAccessChain %_ptr_Function_float %v1 %uint_3
+               OpStore %72 %71
+               OpBranch %59
+         %59 = OpLabel
+         %73 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %74 = OpLoad %float %73
+               OpStore %a %74
+         %75 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %15 = OpLoad %int %75
+               OpStore %i %15
+               OpBranch %76
+         %76 = OpLabel
+               OpLoopMerge %77 %78 None
+               OpBranch %79
+         %79 = OpLabel
+         %16 = OpLoad %int %i
+         %80 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %17 = OpLoad %int %80
+         %81 = OpSLessThan %bool %16 %17
+               OpBranchConditional %81 %82 %77
+         %82 = OpLabel
+         %83 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %84 = OpLoad %float %83
+         %85 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %86 = OpLoad %float %85
+         %87 = OpFOrdLessThan %bool %84 %86
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %88
+         %89 = OpLabel
+               OpKill
+         %88 = OpLabel
+         %90 = OpAccessChain %_ptr_Function_float %v1 %uint_0
+         %91 = OpLoad %float %90
+         %92 = OpAccessChain %_ptr_Function_float %v1 %uint_1
+         %93 = OpLoad %float %92
+         %94 = OpFAdd %float %91 %93
+         %95 = OpAccessChain %_ptr_Function_float %v1 %uint_2
+         %96 = OpLoad %float %95
+         %97 = OpFAdd %float %94 %96
+         %98 = OpAccessChain %_ptr_Function_float %v1 %uint_3
+         %99 = OpLoad %float %98
+        %100 = OpFAdd %float %97 %99
+        %101 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_3
+        %102 = OpLoad %float %101
+        %103 = OpExtInst %float %1 Pow %100 %102
+               OpStore %a %103
+               OpBranch %78
+         %78 = OpLabel
+         %18 = OpLoad %int %i
+         %19 = OpIAdd %int %18 %int_1
+               OpStore %i %19
+               OpBranch %76
+         %77 = OpLabel
+        %104 = OpLoad %float %a
+        %105 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+        %106 = OpLoad %float %105
+        %107 = OpFOrdEqual %bool %104 %106
+               OpSelectionMerge %108 None
+               OpBranchConditional %107 %109 %110
+        %109 = OpLabel
+        %111 = OpLoad %v4float %v1
+               OpStore %_GLF_v1 %111
+               OpBranch %108
+        %110 = OpLabel
+        %112 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %20 = OpLoad %int %112
+        %113 = OpConvertSToF %float %20
+        %114 = OpCompositeConstruct %v4float %113 %113 %113 %113
+               OpStore %_GLF_v1 %114
+               OpBranch %108
+        %108 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-machine-scheduler-for-if-pow/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-machine-scheduler-for-if-pow/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..790ef73
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-machine-scheduler-for-if-pow/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,92 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[4];
+};
+cbuffer cbuffer_x_12 : register(b0, space0) {
+  uint4 x_12[2];
+};
+static float4 x_GLF_v1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2 uv = float2(0.0f, 0.0f);
+  float4 v1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float a = 0.0f;
+  int i = 0;
+  const float4 x_49 = gl_FragCoord;
+  uv = float2(x_49.x, x_49.y);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_52 = asfloat(x_8[scalar_offset / 4][scalar_offset % 4]);
+  v1 = float4(x_52, x_52, x_52, x_52);
+  const float x_55 = uv.y;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_57 = asfloat(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_55 >= x_57)) {
+    const float x_62 = asfloat(x_8[2].x);
+    v1.x = x_62;
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const float x_65 = asfloat(x_8[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    v1.y = x_65;
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const float x_68 = asfloat(x_8[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    v1.z = x_68;
+    const float x_71 = asfloat(x_8[2].x);
+    v1.w = x_71;
+  }
+  const float x_74 = asfloat(x_8[2].x);
+  a = x_74;
+  const int x_15 = asint(x_12[1].x);
+  i = x_15;
+  while (true) {
+    const int x_16 = i;
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_17 = asint(x_12[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    if ((x_16 < x_17)) {
+    } else {
+      break;
+    }
+    const float x_84 = asfloat(x_8[2].x);
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const float x_86 = asfloat(x_8[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    if ((x_84 < x_86)) {
+      discard;
+    }
+    const float x_91 = v1.x;
+    const float x_93 = v1.y;
+    const float x_96 = v1.z;
+    const float x_99 = v1.w;
+    const float x_102 = asfloat(x_8[3].x);
+    a = pow((((x_91 + x_93) + x_96) + x_99), x_102);
+    {
+      i = (i + 1);
+    }
+  }
+  const float x_104 = a;
+  const float x_106 = asfloat(x_8[1].x);
+  if ((x_104 == x_106)) {
+    x_GLF_v1 = v1;
+  } else {
+    const int x_20 = asint(x_12[1].x);
+    const float x_113 = float(x_20);
+    x_GLF_v1 = float4(x_113, x_113, x_113, x_113);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_v1_1;
+};
+struct tint_symbol_1 {
+  float4 gl_FragCoord_param : SV_Position;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_v1_1 : SV_Target0;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_v1};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_v1_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-machine-scheduler-for-if-pow/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-machine-scheduler-for-if-pow/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..efced0c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-machine-scheduler-for-if-pow/0-opt.spvasm.expected.msl
@@ -0,0 +1,101 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_v1_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_v1_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_8, constant buf0& x_12, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float2 uv = 0.0f;
+  float4 v1 = 0.0f;
+  float a = 0.0f;
+  int i = 0;
+  float4 const x_49 = *(tint_symbol_5);
+  uv = float2(x_49.x, x_49.y);
+  float const x_52 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  v1 = float4(x_52, x_52, x_52, x_52);
+  float const x_55 = uv.y;
+  float const x_57 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_55 >= x_57)) {
+    float const x_62 = x_8.x_GLF_uniform_float_values.arr[2].el;
+    v1.x = x_62;
+    float const x_65 = x_8.x_GLF_uniform_float_values.arr[0].el;
+    v1.y = x_65;
+    float const x_68 = x_8.x_GLF_uniform_float_values.arr[0].el;
+    v1.z = x_68;
+    float const x_71 = x_8.x_GLF_uniform_float_values.arr[2].el;
+    v1.w = x_71;
+  }
+  float const x_74 = x_8.x_GLF_uniform_float_values.arr[2].el;
+  a = x_74;
+  int const x_15 = x_12.x_GLF_uniform_int_values.arr[1].el;
+  i = x_15;
+  while (true) {
+    int const x_16 = i;
+    int const x_17 = x_12.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_16 < x_17)) {
+    } else {
+      break;
+    }
+    float const x_84 = x_8.x_GLF_uniform_float_values.arr[2].el;
+    float const x_86 = x_8.x_GLF_uniform_float_values.arr[0].el;
+    if ((x_84 < x_86)) {
+      discard_fragment();
+    }
+    float const x_91 = v1.x;
+    float const x_93 = v1.y;
+    float const x_96 = v1.z;
+    float const x_99 = v1.w;
+    float const x_102 = x_8.x_GLF_uniform_float_values.arr[3].el;
+    a = pow((((x_91 + x_93) + x_96) + x_99), x_102);
+    {
+      int const x_18 = i;
+      i = (x_18 + 1);
+    }
+  }
+  float const x_104 = a;
+  float const x_106 = x_8.x_GLF_uniform_float_values.arr[1].el;
+  if ((x_104 == x_106)) {
+    float4 const x_111 = v1;
+    *(tint_symbol_6) = x_111;
+  } else {
+    int const x_20 = x_12.x_GLF_uniform_int_values.arr[1].el;
+    float const x_113 = float(x_20);
+    *(tint_symbol_6) = float4(x_113, x_113, x_113, x_113);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf1& x_8 [[buffer(1)]], constant buf0& x_12 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_8, x_12, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_v1_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_v1_1=tint_symbol_3.x_GLF_v1_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-machine-scheduler-for-if-pow/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-machine-scheduler-for-if-pow/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..fd1fbff
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-machine-scheduler-for-if-pow/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,221 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 139
+; Schema: 0
+               OpCapability Shader
+        %108 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_12 "x_12"
+               OpName %x_GLF_v1 "x_GLF_v1"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %uv "uv"
+               OpName %v1 "v1"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_v1_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_4 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_12 NonWritable
+               OpDecorate %x_12 DescriptorSet 0
+               OpDecorate %x_12 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+       %buf1 = OpTypeStruct %_arr_float_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_12 = OpVariable %_ptr_Uniform_buf0 Uniform
+   %x_GLF_v1 = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %30 = OpConstantNull %v2float
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%_ptr_Function_float = OpTypePointer Function %float
+         %35 = OpConstantNull %float
+%_ptr_Function_int = OpTypePointer Function %int
+         %38 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+     %uint_3 = OpConstant %uint 3
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+   %main_out = OpTypeStruct %v4float
+        %126 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %23
+         %26 = OpLabel
+         %uv = OpVariable %_ptr_Function_v2float Function %30
+         %v1 = OpVariable %_ptr_Function_v4float Function %5
+          %a = OpVariable %_ptr_Function_float Function %35
+          %i = OpVariable %_ptr_Function_int Function %38
+         %39 = OpLoad %v4float %gl_FragCoord
+         %40 = OpCompositeExtract %float %39 0
+         %41 = OpCompositeExtract %float %39 1
+         %42 = OpCompositeConstruct %v2float %40 %41
+               OpStore %uv %42
+         %46 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %47 = OpLoad %float %46
+         %48 = OpCompositeConstruct %v4float %47 %47 %47 %47
+               OpStore %v1 %48
+         %50 = OpAccessChain %_ptr_Function_float %uv %uint_1
+         %51 = OpLoad %float %50
+         %52 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %53 = OpLoad %float %52
+         %54 = OpFOrdGreaterThanEqual %bool %51 %53
+               OpSelectionMerge %56 None
+               OpBranchConditional %54 %57 %56
+         %57 = OpLabel
+         %59 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_2
+         %60 = OpLoad %float %59
+         %61 = OpAccessChain %_ptr_Function_float %v1 %uint_0
+               OpStore %61 %60
+         %62 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %63 = OpLoad %float %62
+         %64 = OpAccessChain %_ptr_Function_float %v1 %uint_1
+               OpStore %64 %63
+         %65 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %66 = OpLoad %float %65
+         %67 = OpAccessChain %_ptr_Function_float %v1 %uint_2
+               OpStore %67 %66
+         %68 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_2
+         %69 = OpLoad %float %68
+         %71 = OpAccessChain %_ptr_Function_float %v1 %uint_3
+               OpStore %71 %69
+               OpBranch %56
+         %56 = OpLabel
+         %72 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_2
+         %73 = OpLoad %float %72
+               OpStore %a %73
+         %76 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_1
+         %77 = OpLoad %int %76
+               OpStore %i %77
+               OpBranch %78
+         %78 = OpLabel
+               OpLoopMerge %79 %80 None
+               OpBranch %81
+         %81 = OpLabel
+         %82 = OpLoad %int %i
+         %83 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_0
+         %84 = OpLoad %int %83
+         %85 = OpSLessThan %bool %82 %84
+               OpSelectionMerge %86 None
+               OpBranchConditional %85 %87 %88
+         %87 = OpLabel
+               OpBranch %86
+         %88 = OpLabel
+               OpBranch %79
+         %86 = OpLabel
+         %89 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_2
+         %90 = OpLoad %float %89
+         %91 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %92 = OpLoad %float %91
+         %93 = OpFOrdLessThan %bool %90 %92
+               OpSelectionMerge %94 None
+               OpBranchConditional %93 %95 %94
+         %95 = OpLabel
+               OpKill
+         %94 = OpLabel
+         %96 = OpAccessChain %_ptr_Function_float %v1 %uint_0
+         %97 = OpLoad %float %96
+         %98 = OpAccessChain %_ptr_Function_float %v1 %uint_1
+         %99 = OpLoad %float %98
+        %100 = OpAccessChain %_ptr_Function_float %v1 %uint_2
+        %101 = OpLoad %float %100
+        %102 = OpAccessChain %_ptr_Function_float %v1 %uint_3
+        %103 = OpLoad %float %102
+        %105 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_3
+        %106 = OpLoad %float %105
+        %109 = OpFAdd %float %97 %99
+        %110 = OpFAdd %float %109 %101
+        %111 = OpFAdd %float %110 %103
+        %107 = OpExtInst %float %108 Pow %111 %106
+               OpStore %a %107
+               OpBranch %80
+         %80 = OpLabel
+        %112 = OpLoad %int %i
+        %113 = OpIAdd %int %112 %int_1
+               OpStore %i %113
+               OpBranch %78
+         %79 = OpLabel
+        %114 = OpLoad %float %a
+        %115 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+        %116 = OpLoad %float %115
+        %117 = OpFOrdEqual %bool %114 %116
+               OpSelectionMerge %118 None
+               OpBranchConditional %117 %119 %120
+        %119 = OpLabel
+        %121 = OpLoad %v4float %v1
+               OpStore %x_GLF_v1 %121
+               OpBranch %118
+        %120 = OpLabel
+        %122 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_1
+        %123 = OpLoad %int %122
+        %124 = OpConvertSToF %float %123
+        %125 = OpCompositeConstruct %v4float %124 %124 %124 %124
+               OpStore %x_GLF_v1 %125
+               OpBranch %118
+        %118 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %126
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %130 = OpLabel
+        %131 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %131
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %23
+        %133 = OpLabel
+        %134 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %134
+        %135 = OpFunctionCall %void %main_1
+        %137 = OpLoad %v4float %x_GLF_v1
+        %138 = OpCompositeConstruct %main_out %137
+        %136 = OpFunctionCall %void %tint_symbol_3 %138
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-machine-scheduler-for-if-pow/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-machine-scheduler-for-if-pow/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..c2a6296
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-machine-scheduler-for-if-pow/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,95 @@
+type Arr = [[stride(16)]] array<f32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_12 : buf0;
+
+var<private> x_GLF_v1 : vec4<f32>;
+
+fn main_1() {
+  var uv : vec2<f32>;
+  var v1 : vec4<f32>;
+  var a : f32;
+  var i : i32;
+  let x_49 : vec4<f32> = gl_FragCoord;
+  uv = vec2<f32>(x_49.x, x_49.y);
+  let x_52 : f32 = x_8.x_GLF_uniform_float_values[0];
+  v1 = vec4<f32>(x_52, x_52, x_52, x_52);
+  let x_55 : f32 = uv.y;
+  let x_57 : f32 = x_8.x_GLF_uniform_float_values[0];
+  if ((x_55 >= x_57)) {
+    let x_62 : f32 = x_8.x_GLF_uniform_float_values[2];
+    v1.x = x_62;
+    let x_65 : f32 = x_8.x_GLF_uniform_float_values[0];
+    v1.y = x_65;
+    let x_68 : f32 = x_8.x_GLF_uniform_float_values[0];
+    v1.z = x_68;
+    let x_71 : f32 = x_8.x_GLF_uniform_float_values[2];
+    v1.w = x_71;
+  }
+  let x_74 : f32 = x_8.x_GLF_uniform_float_values[2];
+  a = x_74;
+  let x_15 : i32 = x_12.x_GLF_uniform_int_values[1];
+  i = x_15;
+  loop {
+    let x_16 : i32 = i;
+    let x_17 : i32 = x_12.x_GLF_uniform_int_values[0];
+    if ((x_16 < x_17)) {
+    } else {
+      break;
+    }
+    let x_84 : f32 = x_8.x_GLF_uniform_float_values[2];
+    let x_86 : f32 = x_8.x_GLF_uniform_float_values[0];
+    if ((x_84 < x_86)) {
+      discard;
+    }
+    let x_91 : f32 = v1.x;
+    let x_93 : f32 = v1.y;
+    let x_96 : f32 = v1.z;
+    let x_99 : f32 = v1.w;
+    let x_102 : f32 = x_8.x_GLF_uniform_float_values[3];
+    a = pow((((x_91 + x_93) + x_96) + x_99), x_102);
+
+    continuing {
+      let x_18 : i32 = i;
+      i = (x_18 + 1);
+    }
+  }
+  let x_104 : f32 = a;
+  let x_106 : f32 = x_8.x_GLF_uniform_float_values[1];
+  if ((x_104 == x_106)) {
+    let x_111 : vec4<f32> = v1;
+    x_GLF_v1 = x_111;
+  } else {
+    let x_20 : i32 = x_12.x_GLF_uniform_int_values[1];
+    let x_113 : f32 = f32(x_20);
+    x_GLF_v1 = vec4<f32>(x_113, x_113, x_113, x_113);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_v1_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_v1);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-machine-scheduler-for-if-pow/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-machine-scheduler-for-if-pow/0-opt.wgsl
new file mode 100644
index 0000000..c2a6296
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-machine-scheduler-for-if-pow/0-opt.wgsl
@@ -0,0 +1,95 @@
+type Arr = [[stride(16)]] array<f32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_12 : buf0;
+
+var<private> x_GLF_v1 : vec4<f32>;
+
+fn main_1() {
+  var uv : vec2<f32>;
+  var v1 : vec4<f32>;
+  var a : f32;
+  var i : i32;
+  let x_49 : vec4<f32> = gl_FragCoord;
+  uv = vec2<f32>(x_49.x, x_49.y);
+  let x_52 : f32 = x_8.x_GLF_uniform_float_values[0];
+  v1 = vec4<f32>(x_52, x_52, x_52, x_52);
+  let x_55 : f32 = uv.y;
+  let x_57 : f32 = x_8.x_GLF_uniform_float_values[0];
+  if ((x_55 >= x_57)) {
+    let x_62 : f32 = x_8.x_GLF_uniform_float_values[2];
+    v1.x = x_62;
+    let x_65 : f32 = x_8.x_GLF_uniform_float_values[0];
+    v1.y = x_65;
+    let x_68 : f32 = x_8.x_GLF_uniform_float_values[0];
+    v1.z = x_68;
+    let x_71 : f32 = x_8.x_GLF_uniform_float_values[2];
+    v1.w = x_71;
+  }
+  let x_74 : f32 = x_8.x_GLF_uniform_float_values[2];
+  a = x_74;
+  let x_15 : i32 = x_12.x_GLF_uniform_int_values[1];
+  i = x_15;
+  loop {
+    let x_16 : i32 = i;
+    let x_17 : i32 = x_12.x_GLF_uniform_int_values[0];
+    if ((x_16 < x_17)) {
+    } else {
+      break;
+    }
+    let x_84 : f32 = x_8.x_GLF_uniform_float_values[2];
+    let x_86 : f32 = x_8.x_GLF_uniform_float_values[0];
+    if ((x_84 < x_86)) {
+      discard;
+    }
+    let x_91 : f32 = v1.x;
+    let x_93 : f32 = v1.y;
+    let x_96 : f32 = v1.z;
+    let x_99 : f32 = v1.w;
+    let x_102 : f32 = x_8.x_GLF_uniform_float_values[3];
+    a = pow((((x_91 + x_93) + x_96) + x_99), x_102);
+
+    continuing {
+      let x_18 : i32 = i;
+      i = (x_18 + 1);
+    }
+  }
+  let x_104 : f32 = a;
+  let x_106 : f32 = x_8.x_GLF_uniform_float_values[1];
+  if ((x_104 == x_106)) {
+    let x_111 : vec4<f32> = v1;
+    x_GLF_v1 = x_111;
+  } else {
+    let x_20 : i32 = x_12.x_GLF_uniform_int_values[1];
+    let x_113 : f32 = f32(x_20);
+    x_GLF_v1 = vec4<f32>(x_113, x_113, x_113, x_113);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_v1_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_v1);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-machine-scheduler-for-if-pow/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-machine-scheduler-for-if-pow/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..790ef73
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-machine-scheduler-for-if-pow/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,92 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[4];
+};
+cbuffer cbuffer_x_12 : register(b0, space0) {
+  uint4 x_12[2];
+};
+static float4 x_GLF_v1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2 uv = float2(0.0f, 0.0f);
+  float4 v1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float a = 0.0f;
+  int i = 0;
+  const float4 x_49 = gl_FragCoord;
+  uv = float2(x_49.x, x_49.y);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_52 = asfloat(x_8[scalar_offset / 4][scalar_offset % 4]);
+  v1 = float4(x_52, x_52, x_52, x_52);
+  const float x_55 = uv.y;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_57 = asfloat(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_55 >= x_57)) {
+    const float x_62 = asfloat(x_8[2].x);
+    v1.x = x_62;
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const float x_65 = asfloat(x_8[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    v1.y = x_65;
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const float x_68 = asfloat(x_8[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    v1.z = x_68;
+    const float x_71 = asfloat(x_8[2].x);
+    v1.w = x_71;
+  }
+  const float x_74 = asfloat(x_8[2].x);
+  a = x_74;
+  const int x_15 = asint(x_12[1].x);
+  i = x_15;
+  while (true) {
+    const int x_16 = i;
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_17 = asint(x_12[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    if ((x_16 < x_17)) {
+    } else {
+      break;
+    }
+    const float x_84 = asfloat(x_8[2].x);
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const float x_86 = asfloat(x_8[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    if ((x_84 < x_86)) {
+      discard;
+    }
+    const float x_91 = v1.x;
+    const float x_93 = v1.y;
+    const float x_96 = v1.z;
+    const float x_99 = v1.w;
+    const float x_102 = asfloat(x_8[3].x);
+    a = pow((((x_91 + x_93) + x_96) + x_99), x_102);
+    {
+      i = (i + 1);
+    }
+  }
+  const float x_104 = a;
+  const float x_106 = asfloat(x_8[1].x);
+  if ((x_104 == x_106)) {
+    x_GLF_v1 = v1;
+  } else {
+    const int x_20 = asint(x_12[1].x);
+    const float x_113 = float(x_20);
+    x_GLF_v1 = float4(x_113, x_113, x_113, x_113);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_v1_1;
+};
+struct tint_symbol_1 {
+  float4 gl_FragCoord_param : SV_Position;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_v1_1 : SV_Target0;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_v1};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_v1_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-machine-scheduler-for-if-pow/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-machine-scheduler-for-if-pow/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..efced0c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-machine-scheduler-for-if-pow/0-opt.wgsl.expected.msl
@@ -0,0 +1,101 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_v1_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_v1_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_8, constant buf0& x_12, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float2 uv = 0.0f;
+  float4 v1 = 0.0f;
+  float a = 0.0f;
+  int i = 0;
+  float4 const x_49 = *(tint_symbol_5);
+  uv = float2(x_49.x, x_49.y);
+  float const x_52 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  v1 = float4(x_52, x_52, x_52, x_52);
+  float const x_55 = uv.y;
+  float const x_57 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_55 >= x_57)) {
+    float const x_62 = x_8.x_GLF_uniform_float_values.arr[2].el;
+    v1.x = x_62;
+    float const x_65 = x_8.x_GLF_uniform_float_values.arr[0].el;
+    v1.y = x_65;
+    float const x_68 = x_8.x_GLF_uniform_float_values.arr[0].el;
+    v1.z = x_68;
+    float const x_71 = x_8.x_GLF_uniform_float_values.arr[2].el;
+    v1.w = x_71;
+  }
+  float const x_74 = x_8.x_GLF_uniform_float_values.arr[2].el;
+  a = x_74;
+  int const x_15 = x_12.x_GLF_uniform_int_values.arr[1].el;
+  i = x_15;
+  while (true) {
+    int const x_16 = i;
+    int const x_17 = x_12.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_16 < x_17)) {
+    } else {
+      break;
+    }
+    float const x_84 = x_8.x_GLF_uniform_float_values.arr[2].el;
+    float const x_86 = x_8.x_GLF_uniform_float_values.arr[0].el;
+    if ((x_84 < x_86)) {
+      discard_fragment();
+    }
+    float const x_91 = v1.x;
+    float const x_93 = v1.y;
+    float const x_96 = v1.z;
+    float const x_99 = v1.w;
+    float const x_102 = x_8.x_GLF_uniform_float_values.arr[3].el;
+    a = pow((((x_91 + x_93) + x_96) + x_99), x_102);
+    {
+      int const x_18 = i;
+      i = (x_18 + 1);
+    }
+  }
+  float const x_104 = a;
+  float const x_106 = x_8.x_GLF_uniform_float_values.arr[1].el;
+  if ((x_104 == x_106)) {
+    float4 const x_111 = v1;
+    *(tint_symbol_6) = x_111;
+  } else {
+    int const x_20 = x_12.x_GLF_uniform_int_values.arr[1].el;
+    float const x_113 = float(x_20);
+    *(tint_symbol_6) = float4(x_113, x_113, x_113, x_113);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf1& x_8 [[buffer(1)]], constant buf0& x_12 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_8, x_12, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_v1_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_v1_1=tint_symbol_3.x_GLF_v1_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-machine-scheduler-for-if-pow/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-machine-scheduler-for-if-pow/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..fd1fbff
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-machine-scheduler-for-if-pow/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,221 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 139
+; Schema: 0
+               OpCapability Shader
+        %108 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_12 "x_12"
+               OpName %x_GLF_v1 "x_GLF_v1"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %uv "uv"
+               OpName %v1 "v1"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_v1_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_4 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_12 NonWritable
+               OpDecorate %x_12 DescriptorSet 0
+               OpDecorate %x_12 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+       %buf1 = OpTypeStruct %_arr_float_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_12 = OpVariable %_ptr_Uniform_buf0 Uniform
+   %x_GLF_v1 = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %30 = OpConstantNull %v2float
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%_ptr_Function_float = OpTypePointer Function %float
+         %35 = OpConstantNull %float
+%_ptr_Function_int = OpTypePointer Function %int
+         %38 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+     %uint_3 = OpConstant %uint 3
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+   %main_out = OpTypeStruct %v4float
+        %126 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %23
+         %26 = OpLabel
+         %uv = OpVariable %_ptr_Function_v2float Function %30
+         %v1 = OpVariable %_ptr_Function_v4float Function %5
+          %a = OpVariable %_ptr_Function_float Function %35
+          %i = OpVariable %_ptr_Function_int Function %38
+         %39 = OpLoad %v4float %gl_FragCoord
+         %40 = OpCompositeExtract %float %39 0
+         %41 = OpCompositeExtract %float %39 1
+         %42 = OpCompositeConstruct %v2float %40 %41
+               OpStore %uv %42
+         %46 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %47 = OpLoad %float %46
+         %48 = OpCompositeConstruct %v4float %47 %47 %47 %47
+               OpStore %v1 %48
+         %50 = OpAccessChain %_ptr_Function_float %uv %uint_1
+         %51 = OpLoad %float %50
+         %52 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %53 = OpLoad %float %52
+         %54 = OpFOrdGreaterThanEqual %bool %51 %53
+               OpSelectionMerge %56 None
+               OpBranchConditional %54 %57 %56
+         %57 = OpLabel
+         %59 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_2
+         %60 = OpLoad %float %59
+         %61 = OpAccessChain %_ptr_Function_float %v1 %uint_0
+               OpStore %61 %60
+         %62 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %63 = OpLoad %float %62
+         %64 = OpAccessChain %_ptr_Function_float %v1 %uint_1
+               OpStore %64 %63
+         %65 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %66 = OpLoad %float %65
+         %67 = OpAccessChain %_ptr_Function_float %v1 %uint_2
+               OpStore %67 %66
+         %68 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_2
+         %69 = OpLoad %float %68
+         %71 = OpAccessChain %_ptr_Function_float %v1 %uint_3
+               OpStore %71 %69
+               OpBranch %56
+         %56 = OpLabel
+         %72 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_2
+         %73 = OpLoad %float %72
+               OpStore %a %73
+         %76 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_1
+         %77 = OpLoad %int %76
+               OpStore %i %77
+               OpBranch %78
+         %78 = OpLabel
+               OpLoopMerge %79 %80 None
+               OpBranch %81
+         %81 = OpLabel
+         %82 = OpLoad %int %i
+         %83 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_0
+         %84 = OpLoad %int %83
+         %85 = OpSLessThan %bool %82 %84
+               OpSelectionMerge %86 None
+               OpBranchConditional %85 %87 %88
+         %87 = OpLabel
+               OpBranch %86
+         %88 = OpLabel
+               OpBranch %79
+         %86 = OpLabel
+         %89 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_2
+         %90 = OpLoad %float %89
+         %91 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %92 = OpLoad %float %91
+         %93 = OpFOrdLessThan %bool %90 %92
+               OpSelectionMerge %94 None
+               OpBranchConditional %93 %95 %94
+         %95 = OpLabel
+               OpKill
+         %94 = OpLabel
+         %96 = OpAccessChain %_ptr_Function_float %v1 %uint_0
+         %97 = OpLoad %float %96
+         %98 = OpAccessChain %_ptr_Function_float %v1 %uint_1
+         %99 = OpLoad %float %98
+        %100 = OpAccessChain %_ptr_Function_float %v1 %uint_2
+        %101 = OpLoad %float %100
+        %102 = OpAccessChain %_ptr_Function_float %v1 %uint_3
+        %103 = OpLoad %float %102
+        %105 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_3
+        %106 = OpLoad %float %105
+        %109 = OpFAdd %float %97 %99
+        %110 = OpFAdd %float %109 %101
+        %111 = OpFAdd %float %110 %103
+        %107 = OpExtInst %float %108 Pow %111 %106
+               OpStore %a %107
+               OpBranch %80
+         %80 = OpLabel
+        %112 = OpLoad %int %i
+        %113 = OpIAdd %int %112 %int_1
+               OpStore %i %113
+               OpBranch %78
+         %79 = OpLabel
+        %114 = OpLoad %float %a
+        %115 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+        %116 = OpLoad %float %115
+        %117 = OpFOrdEqual %bool %114 %116
+               OpSelectionMerge %118 None
+               OpBranchConditional %117 %119 %120
+        %119 = OpLabel
+        %121 = OpLoad %v4float %v1
+               OpStore %x_GLF_v1 %121
+               OpBranch %118
+        %120 = OpLabel
+        %122 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_1
+        %123 = OpLoad %int %122
+        %124 = OpConvertSToF %float %123
+        %125 = OpCompositeConstruct %v4float %124 %124 %124 %124
+               OpStore %x_GLF_v1 %125
+               OpBranch %118
+        %118 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %126
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %130 = OpLabel
+        %131 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %131
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %23
+        %133 = OpLabel
+        %134 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %134
+        %135 = OpFunctionCall %void %main_1
+        %137 = OpLoad %v4float %x_GLF_v1
+        %138 = OpCompositeConstruct %main_out %137
+        %136 = OpFunctionCall %void %tint_symbol_3 %138
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-machine-scheduler-for-if-pow/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-machine-scheduler-for-if-pow/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..c2a6296
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-machine-scheduler-for-if-pow/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,95 @@
+type Arr = [[stride(16)]] array<f32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_12 : buf0;
+
+var<private> x_GLF_v1 : vec4<f32>;
+
+fn main_1() {
+  var uv : vec2<f32>;
+  var v1 : vec4<f32>;
+  var a : f32;
+  var i : i32;
+  let x_49 : vec4<f32> = gl_FragCoord;
+  uv = vec2<f32>(x_49.x, x_49.y);
+  let x_52 : f32 = x_8.x_GLF_uniform_float_values[0];
+  v1 = vec4<f32>(x_52, x_52, x_52, x_52);
+  let x_55 : f32 = uv.y;
+  let x_57 : f32 = x_8.x_GLF_uniform_float_values[0];
+  if ((x_55 >= x_57)) {
+    let x_62 : f32 = x_8.x_GLF_uniform_float_values[2];
+    v1.x = x_62;
+    let x_65 : f32 = x_8.x_GLF_uniform_float_values[0];
+    v1.y = x_65;
+    let x_68 : f32 = x_8.x_GLF_uniform_float_values[0];
+    v1.z = x_68;
+    let x_71 : f32 = x_8.x_GLF_uniform_float_values[2];
+    v1.w = x_71;
+  }
+  let x_74 : f32 = x_8.x_GLF_uniform_float_values[2];
+  a = x_74;
+  let x_15 : i32 = x_12.x_GLF_uniform_int_values[1];
+  i = x_15;
+  loop {
+    let x_16 : i32 = i;
+    let x_17 : i32 = x_12.x_GLF_uniform_int_values[0];
+    if ((x_16 < x_17)) {
+    } else {
+      break;
+    }
+    let x_84 : f32 = x_8.x_GLF_uniform_float_values[2];
+    let x_86 : f32 = x_8.x_GLF_uniform_float_values[0];
+    if ((x_84 < x_86)) {
+      discard;
+    }
+    let x_91 : f32 = v1.x;
+    let x_93 : f32 = v1.y;
+    let x_96 : f32 = v1.z;
+    let x_99 : f32 = v1.w;
+    let x_102 : f32 = x_8.x_GLF_uniform_float_values[3];
+    a = pow((((x_91 + x_93) + x_96) + x_99), x_102);
+
+    continuing {
+      let x_18 : i32 = i;
+      i = (x_18 + 1);
+    }
+  }
+  let x_104 : f32 = a;
+  let x_106 : f32 = x_8.x_GLF_uniform_float_values[1];
+  if ((x_104 == x_106)) {
+    let x_111 : vec4<f32> = v1;
+    x_GLF_v1 = x_111;
+  } else {
+    let x_20 : i32 = x_12.x_GLF_uniform_int_values[1];
+    let x_113 : f32 = f32(x_20);
+    x_GLF_v1 = vec4<f32>(x_113, x_113, x_113, x_113);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_v1_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_v1);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-machinevaluetype-one-iter-loop/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-machinevaluetype-one-iter-loop/0-opt.spvasm
new file mode 100644
index 0000000..25ac71d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-machinevaluetype-one-iter-loop/0-opt.spvasm
@@ -0,0 +1,92 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+      %int_1 = OpConstant %int 1
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %26 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %27 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %9
+         %28 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+               OpStore %a %int_0
+               OpStore %i %int_0
+               OpBranch %29
+         %29 = OpLabel
+               OpLoopMerge %30 %31 None
+               OpBranch %32
+         %32 = OpLabel
+         %33 = OpLoad %int %i
+         %34 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %35 = OpLoad %float %34
+         %36 = OpConvertFToS %int %35
+         %37 = OpSLessThan %bool %33 %36
+               OpBranchConditional %37 %38 %30
+         %38 = OpLabel
+         %39 = OpLoad %int %a
+         %40 = OpSGreaterThan %bool %39 %int_0
+               OpSelectionMerge %41 None
+               OpBranchConditional %40 %42 %41
+         %42 = OpLabel
+               OpBranch %30
+         %41 = OpLabel
+         %43 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %44 = OpLoad %float %43
+         %45 = OpConvertFToS %int %44
+         %46 = OpIMul %int %45 %int_2
+         %47 = OpSDiv %int %46 %int_2
+               OpStore %a %47
+               OpBranch %31
+         %31 = OpLabel
+         %48 = OpLoad %int %i
+         %49 = OpIAdd %int %48 %int_1
+               OpStore %i %49
+               OpBranch %29
+         %30 = OpLabel
+         %50 = OpLoad %int %a
+         %51 = OpIEqual %bool %50 %int_1
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %54
+         %53 = OpLabel
+               OpStore %_GLF_color %26
+               OpBranch %52
+         %54 = OpLabel
+               OpStore %_GLF_color %27
+               OpBranch %52
+         %52 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-machinevaluetype-one-iter-loop/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-machinevaluetype-one-iter-loop/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..13e0966
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-machinevaluetype-one-iter-loop/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,47 @@
+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() {
+  int a = 0;
+  int i = 0;
+  a = 0;
+  i = 0;
+  while (true) {
+    const int x_33 = i;
+    const float x_35 = asfloat(x_7[0].y);
+    if ((x_33 < int(x_35))) {
+    } else {
+      break;
+    }
+    if ((a > 0)) {
+      break;
+    }
+    const float x_44 = asfloat(x_7[0].y);
+    a = ((int(x_44) * 2) / 2);
+    {
+      i = (i + 1);
+    }
+  }
+  if ((a == 1)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-machinevaluetype-one-iter-loop/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-machinevaluetype-one-iter-loop/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..813f700
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-machinevaluetype-one-iter-loop/0-opt.spvasm.expected.msl
@@ -0,0 +1,53 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int i = 0;
+  a = 0;
+  i = 0;
+  while (true) {
+    int const x_33 = i;
+    float const x_35 = x_7.injectionSwitch.y;
+    if ((x_33 < int(x_35))) {
+    } else {
+      break;
+    }
+    int const x_39 = a;
+    if ((x_39 > 0)) {
+      break;
+    }
+    float const x_44 = x_7.injectionSwitch.y;
+    a = ((int(x_44) * 2) / 2);
+    {
+      int const x_48 = i;
+      i = (x_48 + 1);
+    }
+  }
+  int const x_50 = a;
+  if ((x_50 == 1)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-machinevaluetype-one-iter-loop/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-machinevaluetype-one-iter-loop/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..abd2c6b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-machinevaluetype-one-iter-loop/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,130 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 73
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %19 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %59 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %60 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %61 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %19
+          %i = OpVariable %_ptr_Function_int Function %19
+               OpStore %a %int_0
+               OpStore %i %int_0
+               OpBranch %22
+         %22 = OpLabel
+               OpLoopMerge %23 %24 None
+               OpBranch %25
+         %25 = OpLabel
+         %26 = OpLoad %int %i
+         %31 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_1
+         %32 = OpLoad %float %31
+         %33 = OpConvertFToS %int %32
+         %34 = OpSLessThan %bool %26 %33
+               OpSelectionMerge %36 None
+               OpBranchConditional %34 %37 %38
+         %37 = OpLabel
+               OpBranch %36
+         %38 = OpLabel
+               OpBranch %23
+         %36 = OpLabel
+         %39 = OpLoad %int %a
+         %40 = OpSGreaterThan %bool %39 %int_0
+               OpSelectionMerge %41 None
+               OpBranchConditional %40 %42 %41
+         %42 = OpLabel
+               OpBranch %23
+         %41 = OpLabel
+         %43 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_1
+         %44 = OpLoad %float %43
+         %45 = OpConvertFToS %int %44
+         %47 = OpIMul %int %45 %int_2
+         %48 = OpSDiv %int %47 %int_2
+               OpStore %a %48
+               OpBranch %24
+         %24 = OpLabel
+         %49 = OpLoad %int %i
+         %51 = OpIAdd %int %49 %int_1
+               OpStore %i %51
+               OpBranch %22
+         %23 = OpLabel
+         %52 = OpLoad %int %a
+         %53 = OpIEqual %bool %52 %int_1
+               OpSelectionMerge %54 None
+               OpBranchConditional %53 %55 %56
+         %55 = OpLabel
+               OpStore %x_GLF_color %59
+               OpBranch %54
+         %56 = OpLabel
+               OpStore %x_GLF_color %60
+               OpBranch %54
+         %54 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %61
+%tint_symbol = OpFunctionParameter %main_out
+         %65 = OpLabel
+         %66 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %66
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %68 = OpLabel
+         %69 = OpFunctionCall %void %main_1
+         %71 = OpLoad %v4float %x_GLF_color
+         %72 = OpCompositeConstruct %main_out %71
+         %70 = OpFunctionCall %void %tint_symbol_2 %72
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-machinevaluetype-one-iter-loop/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-machinevaluetype-one-iter-loop/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..238c476
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-machinevaluetype-one-iter-loop/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,52 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  a = 0;
+  i = 0;
+  loop {
+    let x_33 : i32 = i;
+    let x_35 : f32 = x_7.injectionSwitch.y;
+    if ((x_33 < i32(x_35))) {
+    } else {
+      break;
+    }
+    let x_39 : i32 = a;
+    if ((x_39 > 0)) {
+      break;
+    }
+    let x_44 : f32 = x_7.injectionSwitch.y;
+    a = ((i32(x_44) * 2) / 2);
+
+    continuing {
+      let x_48 : i32 = i;
+      i = (x_48 + 1);
+    }
+  }
+  let x_50 : i32 = a;
+  if ((x_50 == 1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-machinevaluetype-one-iter-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-machinevaluetype-one-iter-loop/0-opt.wgsl
new file mode 100644
index 0000000..238c476
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-machinevaluetype-one-iter-loop/0-opt.wgsl
@@ -0,0 +1,52 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  a = 0;
+  i = 0;
+  loop {
+    let x_33 : i32 = i;
+    let x_35 : f32 = x_7.injectionSwitch.y;
+    if ((x_33 < i32(x_35))) {
+    } else {
+      break;
+    }
+    let x_39 : i32 = a;
+    if ((x_39 > 0)) {
+      break;
+    }
+    let x_44 : f32 = x_7.injectionSwitch.y;
+    a = ((i32(x_44) * 2) / 2);
+
+    continuing {
+      let x_48 : i32 = i;
+      i = (x_48 + 1);
+    }
+  }
+  let x_50 : i32 = a;
+  if ((x_50 == 1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-machinevaluetype-one-iter-loop/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-machinevaluetype-one-iter-loop/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..13e0966
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-machinevaluetype-one-iter-loop/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,47 @@
+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() {
+  int a = 0;
+  int i = 0;
+  a = 0;
+  i = 0;
+  while (true) {
+    const int x_33 = i;
+    const float x_35 = asfloat(x_7[0].y);
+    if ((x_33 < int(x_35))) {
+    } else {
+      break;
+    }
+    if ((a > 0)) {
+      break;
+    }
+    const float x_44 = asfloat(x_7[0].y);
+    a = ((int(x_44) * 2) / 2);
+    {
+      i = (i + 1);
+    }
+  }
+  if ((a == 1)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-machinevaluetype-one-iter-loop/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-machinevaluetype-one-iter-loop/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..813f700
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-machinevaluetype-one-iter-loop/0-opt.wgsl.expected.msl
@@ -0,0 +1,53 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int i = 0;
+  a = 0;
+  i = 0;
+  while (true) {
+    int const x_33 = i;
+    float const x_35 = x_7.injectionSwitch.y;
+    if ((x_33 < int(x_35))) {
+    } else {
+      break;
+    }
+    int const x_39 = a;
+    if ((x_39 > 0)) {
+      break;
+    }
+    float const x_44 = x_7.injectionSwitch.y;
+    a = ((int(x_44) * 2) / 2);
+    {
+      int const x_48 = i;
+      i = (x_48 + 1);
+    }
+  }
+  int const x_50 = a;
+  if ((x_50 == 1)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-machinevaluetype-one-iter-loop/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-machinevaluetype-one-iter-loop/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..abd2c6b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-machinevaluetype-one-iter-loop/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,130 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 73
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %19 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %59 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %60 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %61 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %19
+          %i = OpVariable %_ptr_Function_int Function %19
+               OpStore %a %int_0
+               OpStore %i %int_0
+               OpBranch %22
+         %22 = OpLabel
+               OpLoopMerge %23 %24 None
+               OpBranch %25
+         %25 = OpLabel
+         %26 = OpLoad %int %i
+         %31 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_1
+         %32 = OpLoad %float %31
+         %33 = OpConvertFToS %int %32
+         %34 = OpSLessThan %bool %26 %33
+               OpSelectionMerge %36 None
+               OpBranchConditional %34 %37 %38
+         %37 = OpLabel
+               OpBranch %36
+         %38 = OpLabel
+               OpBranch %23
+         %36 = OpLabel
+         %39 = OpLoad %int %a
+         %40 = OpSGreaterThan %bool %39 %int_0
+               OpSelectionMerge %41 None
+               OpBranchConditional %40 %42 %41
+         %42 = OpLabel
+               OpBranch %23
+         %41 = OpLabel
+         %43 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_1
+         %44 = OpLoad %float %43
+         %45 = OpConvertFToS %int %44
+         %47 = OpIMul %int %45 %int_2
+         %48 = OpSDiv %int %47 %int_2
+               OpStore %a %48
+               OpBranch %24
+         %24 = OpLabel
+         %49 = OpLoad %int %i
+         %51 = OpIAdd %int %49 %int_1
+               OpStore %i %51
+               OpBranch %22
+         %23 = OpLabel
+         %52 = OpLoad %int %a
+         %53 = OpIEqual %bool %52 %int_1
+               OpSelectionMerge %54 None
+               OpBranchConditional %53 %55 %56
+         %55 = OpLabel
+               OpStore %x_GLF_color %59
+               OpBranch %54
+         %56 = OpLabel
+               OpStore %x_GLF_color %60
+               OpBranch %54
+         %54 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %61
+%tint_symbol = OpFunctionParameter %main_out
+         %65 = OpLabel
+         %66 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %66
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %68 = OpLabel
+         %69 = OpFunctionCall %void %main_1
+         %71 = OpLoad %v4float %x_GLF_color
+         %72 = OpCompositeConstruct %main_out %71
+         %70 = OpFunctionCall %void %tint_symbol_2 %72
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-machinevaluetype-one-iter-loop/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-machinevaluetype-one-iter-loop/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..238c476
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-machinevaluetype-one-iter-loop/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,52 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  a = 0;
+  i = 0;
+  loop {
+    let x_33 : i32 = i;
+    let x_35 : f32 = x_7.injectionSwitch.y;
+    if ((x_33 < i32(x_35))) {
+    } else {
+      break;
+    }
+    let x_39 : i32 = a;
+    if ((x_39 > 0)) {
+      break;
+    }
+    let x_44 : f32 = x_7.injectionSwitch.y;
+    a = ((i32(x_44) * 2) / 2);
+
+    continuing {
+      let x_48 : i32 = i;
+      i = (x_48 + 1);
+    }
+  }
+  let x_50 : i32 = a;
+  if ((x_50 == 1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matching-conditions-break/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-matching-conditions-break/0-opt.spvasm
new file mode 100644
index 0000000..363a862
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matching-conditions-break/0-opt.spvasm
@@ -0,0 +1,140 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color %gl_FragCoord
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %i "i"
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_2 = OpConstant %int 2
+     %uint_0 = OpConstant %uint 0
+       %main = OpFunction %void None %10
+         %29 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+         %30 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %31 = OpLoad %int %30
+         %32 = OpConvertSToF %float %31
+         %33 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %34 = OpLoad %int %33
+         %35 = OpConvertSToF %float %34
+         %36 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %37 = OpLoad %int %36
+         %38 = OpConvertSToF %float %37
+         %39 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %40 = OpLoad %int %39
+         %41 = OpConvertSToF %float %40
+         %42 = OpCompositeConstruct %v4float %32 %35 %38 %41
+               OpStore %_GLF_color %42
+         %43 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %44 = OpLoad %float %43
+         %45 = OpFOrdLessThan %bool %44 %float_0
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %46
+         %47 = OpLabel
+         %48 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %49 = OpLoad %int %48
+         %50 = OpConvertSToF %float %49
+         %51 = OpCompositeConstruct %v4float %50 %50 %50 %50
+               OpStore %_GLF_color %51
+               OpBranch %46
+         %46 = OpLabel
+         %52 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %53 = OpLoad %int %52
+               OpStore %i %53
+               OpBranch %54
+         %54 = OpLabel
+               OpLoopMerge %55 %56 None
+               OpBranch %57
+         %57 = OpLabel
+         %58 = OpLoad %int %i
+         %59 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %60 = OpLoad %int %59
+         %61 = OpSLessThan %bool %58 %60
+               OpBranchConditional %61 %62 %55
+         %62 = OpLabel
+         %63 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %64 = OpLoad %float %63
+         %65 = OpFOrdGreaterThan %bool %64 %float_0
+               OpSelectionMerge %66 None
+               OpBranchConditional %65 %67 %66
+         %67 = OpLabel
+         %68 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %69 = OpLoad %float %68
+         %70 = OpFOrdLessThan %bool %69 %float_0
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %71
+         %72 = OpLabel
+         %73 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %74 = OpLoad %int %73
+         %75 = OpConvertSToF %float %74
+         %76 = OpCompositeConstruct %v4float %75 %75 %75 %75
+               OpStore %_GLF_color %76
+               OpBranch %55
+         %71 = OpLabel
+               OpBranch %66
+         %66 = OpLabel
+         %77 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %78 = OpLoad %float %77
+         %79 = OpFOrdGreaterThan %bool %78 %float_0
+               OpSelectionMerge %80 None
+               OpBranchConditional %79 %81 %80
+         %81 = OpLabel
+         %82 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %83 = OpLoad %float %82
+         %84 = OpFOrdLessThan %bool %83 %float_0
+               OpSelectionMerge %85 None
+               OpBranchConditional %84 %86 %85
+         %86 = OpLabel
+         %87 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %88 = OpLoad %int %87
+         %89 = OpConvertSToF %float %88
+         %90 = OpCompositeConstruct %v4float %89 %89 %89 %89
+               OpStore %_GLF_color %90
+               OpBranch %85
+         %85 = OpLabel
+               OpBranch %80
+         %80 = OpLabel
+               OpBranch %56
+         %56 = OpLabel
+         %91 = OpLoad %int %i
+         %92 = OpIAdd %int %91 %int_1
+               OpStore %i %92
+               OpBranch %54
+         %55 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matching-conditions-break/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-matching-conditions-break/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..f6e2d87
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matching-conditions-break/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,74 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[3];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int i = 0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_31 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const int x_34 = asint(x_6[1].x);
+  const int x_37 = asint(x_6[1].x);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_40 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  x_GLF_color = float4(float(x_31), float(x_34), float(x_37), float(x_40));
+  const float x_44 = gl_FragCoord.y;
+  if ((x_44 < 0.0f)) {
+    const int x_49 = asint(x_6[1].x);
+    const float x_50 = float(x_49);
+    x_GLF_color = float4(x_50, x_50, x_50, x_50);
+  }
+  const int x_53 = asint(x_6[1].x);
+  i = x_53;
+  while (true) {
+    const int x_58 = i;
+    const int x_60 = asint(x_6[2].x);
+    if ((x_58 < x_60)) {
+    } else {
+      break;
+    }
+    const float x_64 = gl_FragCoord.x;
+    if ((x_64 > 0.0f)) {
+      const float x_69 = gl_FragCoord.y;
+      if ((x_69 < 0.0f)) {
+        const int x_74 = asint(x_6[1].x);
+        const float x_75 = float(x_74);
+        x_GLF_color = float4(x_75, x_75, x_75, x_75);
+        break;
+      }
+    }
+    const float x_78 = gl_FragCoord.x;
+    if ((x_78 > 0.0f)) {
+      const float x_83 = gl_FragCoord.y;
+      if ((x_83 < 0.0f)) {
+        const int x_88 = asint(x_6[1].x);
+        const float x_89 = float(x_88);
+        x_GLF_color = float4(x_89, x_89, x_89, x_89);
+      }
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matching-conditions-break/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-matching-conditions-break/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..5d2d058
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matching-conditions-break/0-opt.spvasm.expected.msl
@@ -0,0 +1,79 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int i = 0;
+  int const x_31 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_34 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_37 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_40 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  *(tint_symbol_5) = float4(float(x_31), float(x_34), float(x_37), float(x_40));
+  float const x_44 = (*(tint_symbol_6)).y;
+  if ((x_44 < 0.0f)) {
+    int const x_49 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    float const x_50 = float(x_49);
+    *(tint_symbol_5) = float4(x_50, x_50, x_50, x_50);
+  }
+  int const x_53 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  i = x_53;
+  while (true) {
+    int const x_58 = i;
+    int const x_60 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    if ((x_58 < x_60)) {
+    } else {
+      break;
+    }
+    float const x_64 = (*(tint_symbol_6)).x;
+    if ((x_64 > 0.0f)) {
+      float const x_69 = (*(tint_symbol_6)).y;
+      if ((x_69 < 0.0f)) {
+        int const x_74 = x_6.x_GLF_uniform_int_values.arr[1].el;
+        float const x_75 = float(x_74);
+        *(tint_symbol_5) = float4(x_75, x_75, x_75, x_75);
+        break;
+      }
+    }
+    float const x_78 = (*(tint_symbol_6)).x;
+    if ((x_78 > 0.0f)) {
+      float const x_83 = (*(tint_symbol_6)).y;
+      if ((x_83 < 0.0f)) {
+        int const x_88 = x_6.x_GLF_uniform_int_values.arr[1].el;
+        float const x_89 = float(x_88);
+        *(tint_symbol_5) = float4(x_89, x_89, x_89, x_89);
+      }
+    }
+    {
+      int const x_91 = i;
+      i = (x_91 + 1);
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_8), &(tint_symbol_7));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matching-conditions-break/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-matching-conditions-break/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..d46c0ee
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matching-conditions-break/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,181 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 112
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %24 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+         %99 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %18
+         %21 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %24
+         %28 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %29 = OpLoad %int %28
+         %31 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %32 = OpLoad %int %31
+         %33 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %34 = OpLoad %int %33
+         %35 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %36 = OpLoad %int %35
+         %37 = OpConvertSToF %float %29
+         %38 = OpConvertSToF %float %32
+         %39 = OpConvertSToF %float %34
+         %40 = OpConvertSToF %float %36
+         %41 = OpCompositeConstruct %v4float %37 %38 %39 %40
+               OpStore %x_GLF_color %41
+         %44 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %45 = OpLoad %float %44
+         %47 = OpFOrdLessThan %bool %45 %float_0
+               OpSelectionMerge %49 None
+               OpBranchConditional %47 %50 %49
+         %50 = OpLabel
+         %51 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %52 = OpLoad %int %51
+         %53 = OpConvertSToF %float %52
+         %54 = OpCompositeConstruct %v4float %53 %53 %53 %53
+               OpStore %x_GLF_color %54
+               OpBranch %49
+         %49 = OpLabel
+         %55 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %56 = OpLoad %int %55
+               OpStore %i %56
+               OpBranch %57
+         %57 = OpLabel
+               OpLoopMerge %58 %59 None
+               OpBranch %60
+         %60 = OpLabel
+         %61 = OpLoad %int %i
+         %63 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %64 = OpLoad %int %63
+         %65 = OpSLessThan %bool %61 %64
+               OpSelectionMerge %66 None
+               OpBranchConditional %65 %67 %68
+         %67 = OpLabel
+               OpBranch %66
+         %68 = OpLabel
+               OpBranch %58
+         %66 = OpLabel
+         %69 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %70 = OpLoad %float %69
+         %71 = OpFOrdGreaterThan %bool %70 %float_0
+               OpSelectionMerge %72 None
+               OpBranchConditional %71 %73 %72
+         %73 = OpLabel
+         %74 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %75 = OpLoad %float %74
+         %76 = OpFOrdLessThan %bool %75 %float_0
+               OpSelectionMerge %77 None
+               OpBranchConditional %76 %78 %77
+         %78 = OpLabel
+         %79 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %80 = OpLoad %int %79
+         %81 = OpConvertSToF %float %80
+         %82 = OpCompositeConstruct %v4float %81 %81 %81 %81
+               OpStore %x_GLF_color %82
+               OpBranch %58
+         %77 = OpLabel
+               OpBranch %72
+         %72 = OpLabel
+         %83 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %84 = OpLoad %float %83
+         %85 = OpFOrdGreaterThan %bool %84 %float_0
+               OpSelectionMerge %86 None
+               OpBranchConditional %85 %87 %86
+         %87 = OpLabel
+         %88 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %89 = OpLoad %float %88
+         %90 = OpFOrdLessThan %bool %89 %float_0
+               OpSelectionMerge %91 None
+               OpBranchConditional %90 %92 %91
+         %92 = OpLabel
+         %93 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %94 = OpLoad %int %93
+         %95 = OpConvertSToF %float %94
+         %96 = OpCompositeConstruct %v4float %95 %95 %95 %95
+               OpStore %x_GLF_color %96
+               OpBranch %91
+         %91 = OpLabel
+               OpBranch %86
+         %86 = OpLabel
+               OpBranch %59
+         %59 = OpLabel
+         %97 = OpLoad %int %i
+         %98 = OpIAdd %int %97 %int_1
+               OpStore %i %98
+               OpBranch %57
+         %58 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %99
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %103 = OpLabel
+        %104 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %104
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %18
+        %106 = OpLabel
+        %107 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %107
+        %108 = OpFunctionCall %void %main_1
+        %110 = OpLoad %v4float %x_GLF_color
+        %111 = OpCompositeConstruct %main_out %110
+        %109 = OpFunctionCall %void %tint_symbol_3 %111
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matching-conditions-break/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-matching-conditions-break/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..1eebdd9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matching-conditions-break/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,74 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  let x_31 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_34 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_37 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_40 : i32 = x_6.x_GLF_uniform_int_values[0];
+  x_GLF_color = vec4<f32>(f32(x_31), f32(x_34), f32(x_37), f32(x_40));
+  let x_44 : f32 = gl_FragCoord.y;
+  if ((x_44 < 0.0)) {
+    let x_49 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_50 : f32 = f32(x_49);
+    x_GLF_color = vec4<f32>(x_50, x_50, x_50, x_50);
+  }
+  let x_53 : i32 = x_6.x_GLF_uniform_int_values[1];
+  i = x_53;
+  loop {
+    let x_58 : i32 = i;
+    let x_60 : i32 = x_6.x_GLF_uniform_int_values[2];
+    if ((x_58 < x_60)) {
+    } else {
+      break;
+    }
+    let x_64 : f32 = gl_FragCoord.x;
+    if ((x_64 > 0.0)) {
+      let x_69 : f32 = gl_FragCoord.y;
+      if ((x_69 < 0.0)) {
+        let x_74 : i32 = x_6.x_GLF_uniform_int_values[1];
+        let x_75 : f32 = f32(x_74);
+        x_GLF_color = vec4<f32>(x_75, x_75, x_75, x_75);
+        break;
+      }
+    }
+    let x_78 : f32 = gl_FragCoord.x;
+    if ((x_78 > 0.0)) {
+      let x_83 : f32 = gl_FragCoord.y;
+      if ((x_83 < 0.0)) {
+        let x_88 : i32 = x_6.x_GLF_uniform_int_values[1];
+        let x_89 : f32 = f32(x_88);
+        x_GLF_color = vec4<f32>(x_89, x_89, x_89, x_89);
+      }
+    }
+
+    continuing {
+      let x_91 : i32 = i;
+      i = (x_91 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matching-conditions-break/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-matching-conditions-break/0-opt.wgsl
new file mode 100644
index 0000000..1eebdd9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matching-conditions-break/0-opt.wgsl
@@ -0,0 +1,74 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  let x_31 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_34 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_37 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_40 : i32 = x_6.x_GLF_uniform_int_values[0];
+  x_GLF_color = vec4<f32>(f32(x_31), f32(x_34), f32(x_37), f32(x_40));
+  let x_44 : f32 = gl_FragCoord.y;
+  if ((x_44 < 0.0)) {
+    let x_49 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_50 : f32 = f32(x_49);
+    x_GLF_color = vec4<f32>(x_50, x_50, x_50, x_50);
+  }
+  let x_53 : i32 = x_6.x_GLF_uniform_int_values[1];
+  i = x_53;
+  loop {
+    let x_58 : i32 = i;
+    let x_60 : i32 = x_6.x_GLF_uniform_int_values[2];
+    if ((x_58 < x_60)) {
+    } else {
+      break;
+    }
+    let x_64 : f32 = gl_FragCoord.x;
+    if ((x_64 > 0.0)) {
+      let x_69 : f32 = gl_FragCoord.y;
+      if ((x_69 < 0.0)) {
+        let x_74 : i32 = x_6.x_GLF_uniform_int_values[1];
+        let x_75 : f32 = f32(x_74);
+        x_GLF_color = vec4<f32>(x_75, x_75, x_75, x_75);
+        break;
+      }
+    }
+    let x_78 : f32 = gl_FragCoord.x;
+    if ((x_78 > 0.0)) {
+      let x_83 : f32 = gl_FragCoord.y;
+      if ((x_83 < 0.0)) {
+        let x_88 : i32 = x_6.x_GLF_uniform_int_values[1];
+        let x_89 : f32 = f32(x_88);
+        x_GLF_color = vec4<f32>(x_89, x_89, x_89, x_89);
+      }
+    }
+
+    continuing {
+      let x_91 : i32 = i;
+      i = (x_91 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matching-conditions-break/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-matching-conditions-break/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..f6e2d87
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matching-conditions-break/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,74 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[3];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int i = 0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_31 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const int x_34 = asint(x_6[1].x);
+  const int x_37 = asint(x_6[1].x);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_40 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  x_GLF_color = float4(float(x_31), float(x_34), float(x_37), float(x_40));
+  const float x_44 = gl_FragCoord.y;
+  if ((x_44 < 0.0f)) {
+    const int x_49 = asint(x_6[1].x);
+    const float x_50 = float(x_49);
+    x_GLF_color = float4(x_50, x_50, x_50, x_50);
+  }
+  const int x_53 = asint(x_6[1].x);
+  i = x_53;
+  while (true) {
+    const int x_58 = i;
+    const int x_60 = asint(x_6[2].x);
+    if ((x_58 < x_60)) {
+    } else {
+      break;
+    }
+    const float x_64 = gl_FragCoord.x;
+    if ((x_64 > 0.0f)) {
+      const float x_69 = gl_FragCoord.y;
+      if ((x_69 < 0.0f)) {
+        const int x_74 = asint(x_6[1].x);
+        const float x_75 = float(x_74);
+        x_GLF_color = float4(x_75, x_75, x_75, x_75);
+        break;
+      }
+    }
+    const float x_78 = gl_FragCoord.x;
+    if ((x_78 > 0.0f)) {
+      const float x_83 = gl_FragCoord.y;
+      if ((x_83 < 0.0f)) {
+        const int x_88 = asint(x_6[1].x);
+        const float x_89 = float(x_88);
+        x_GLF_color = float4(x_89, x_89, x_89, x_89);
+      }
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matching-conditions-break/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-matching-conditions-break/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..5d2d058
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matching-conditions-break/0-opt.wgsl.expected.msl
@@ -0,0 +1,79 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int i = 0;
+  int const x_31 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_34 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_37 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_40 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  *(tint_symbol_5) = float4(float(x_31), float(x_34), float(x_37), float(x_40));
+  float const x_44 = (*(tint_symbol_6)).y;
+  if ((x_44 < 0.0f)) {
+    int const x_49 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    float const x_50 = float(x_49);
+    *(tint_symbol_5) = float4(x_50, x_50, x_50, x_50);
+  }
+  int const x_53 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  i = x_53;
+  while (true) {
+    int const x_58 = i;
+    int const x_60 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    if ((x_58 < x_60)) {
+    } else {
+      break;
+    }
+    float const x_64 = (*(tint_symbol_6)).x;
+    if ((x_64 > 0.0f)) {
+      float const x_69 = (*(tint_symbol_6)).y;
+      if ((x_69 < 0.0f)) {
+        int const x_74 = x_6.x_GLF_uniform_int_values.arr[1].el;
+        float const x_75 = float(x_74);
+        *(tint_symbol_5) = float4(x_75, x_75, x_75, x_75);
+        break;
+      }
+    }
+    float const x_78 = (*(tint_symbol_6)).x;
+    if ((x_78 > 0.0f)) {
+      float const x_83 = (*(tint_symbol_6)).y;
+      if ((x_83 < 0.0f)) {
+        int const x_88 = x_6.x_GLF_uniform_int_values.arr[1].el;
+        float const x_89 = float(x_88);
+        *(tint_symbol_5) = float4(x_89, x_89, x_89, x_89);
+      }
+    }
+    {
+      int const x_91 = i;
+      i = (x_91 + 1);
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_8), &(tint_symbol_7));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matching-conditions-break/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-matching-conditions-break/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..d46c0ee
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matching-conditions-break/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,181 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 112
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %24 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+         %99 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %18
+         %21 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %24
+         %28 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %29 = OpLoad %int %28
+         %31 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %32 = OpLoad %int %31
+         %33 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %34 = OpLoad %int %33
+         %35 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %36 = OpLoad %int %35
+         %37 = OpConvertSToF %float %29
+         %38 = OpConvertSToF %float %32
+         %39 = OpConvertSToF %float %34
+         %40 = OpConvertSToF %float %36
+         %41 = OpCompositeConstruct %v4float %37 %38 %39 %40
+               OpStore %x_GLF_color %41
+         %44 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %45 = OpLoad %float %44
+         %47 = OpFOrdLessThan %bool %45 %float_0
+               OpSelectionMerge %49 None
+               OpBranchConditional %47 %50 %49
+         %50 = OpLabel
+         %51 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %52 = OpLoad %int %51
+         %53 = OpConvertSToF %float %52
+         %54 = OpCompositeConstruct %v4float %53 %53 %53 %53
+               OpStore %x_GLF_color %54
+               OpBranch %49
+         %49 = OpLabel
+         %55 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %56 = OpLoad %int %55
+               OpStore %i %56
+               OpBranch %57
+         %57 = OpLabel
+               OpLoopMerge %58 %59 None
+               OpBranch %60
+         %60 = OpLabel
+         %61 = OpLoad %int %i
+         %63 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %64 = OpLoad %int %63
+         %65 = OpSLessThan %bool %61 %64
+               OpSelectionMerge %66 None
+               OpBranchConditional %65 %67 %68
+         %67 = OpLabel
+               OpBranch %66
+         %68 = OpLabel
+               OpBranch %58
+         %66 = OpLabel
+         %69 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %70 = OpLoad %float %69
+         %71 = OpFOrdGreaterThan %bool %70 %float_0
+               OpSelectionMerge %72 None
+               OpBranchConditional %71 %73 %72
+         %73 = OpLabel
+         %74 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %75 = OpLoad %float %74
+         %76 = OpFOrdLessThan %bool %75 %float_0
+               OpSelectionMerge %77 None
+               OpBranchConditional %76 %78 %77
+         %78 = OpLabel
+         %79 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %80 = OpLoad %int %79
+         %81 = OpConvertSToF %float %80
+         %82 = OpCompositeConstruct %v4float %81 %81 %81 %81
+               OpStore %x_GLF_color %82
+               OpBranch %58
+         %77 = OpLabel
+               OpBranch %72
+         %72 = OpLabel
+         %83 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %84 = OpLoad %float %83
+         %85 = OpFOrdGreaterThan %bool %84 %float_0
+               OpSelectionMerge %86 None
+               OpBranchConditional %85 %87 %86
+         %87 = OpLabel
+         %88 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %89 = OpLoad %float %88
+         %90 = OpFOrdLessThan %bool %89 %float_0
+               OpSelectionMerge %91 None
+               OpBranchConditional %90 %92 %91
+         %92 = OpLabel
+         %93 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %94 = OpLoad %int %93
+         %95 = OpConvertSToF %float %94
+         %96 = OpCompositeConstruct %v4float %95 %95 %95 %95
+               OpStore %x_GLF_color %96
+               OpBranch %91
+         %91 = OpLabel
+               OpBranch %86
+         %86 = OpLabel
+               OpBranch %59
+         %59 = OpLabel
+         %97 = OpLoad %int %i
+         %98 = OpIAdd %int %97 %int_1
+               OpStore %i %98
+               OpBranch %57
+         %58 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %99
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %103 = OpLabel
+        %104 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %104
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %18
+        %106 = OpLabel
+        %107 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %107
+        %108 = OpFunctionCall %void %main_1
+        %110 = OpLoad %v4float %x_GLF_color
+        %111 = OpCompositeConstruct %main_out %110
+        %109 = OpFunctionCall %void %tint_symbol_3 %111
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matching-conditions-break/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-matching-conditions-break/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..1eebdd9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matching-conditions-break/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,74 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  let x_31 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_34 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_37 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_40 : i32 = x_6.x_GLF_uniform_int_values[0];
+  x_GLF_color = vec4<f32>(f32(x_31), f32(x_34), f32(x_37), f32(x_40));
+  let x_44 : f32 = gl_FragCoord.y;
+  if ((x_44 < 0.0)) {
+    let x_49 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_50 : f32 = f32(x_49);
+    x_GLF_color = vec4<f32>(x_50, x_50, x_50, x_50);
+  }
+  let x_53 : i32 = x_6.x_GLF_uniform_int_values[1];
+  i = x_53;
+  loop {
+    let x_58 : i32 = i;
+    let x_60 : i32 = x_6.x_GLF_uniform_int_values[2];
+    if ((x_58 < x_60)) {
+    } else {
+      break;
+    }
+    let x_64 : f32 = gl_FragCoord.x;
+    if ((x_64 > 0.0)) {
+      let x_69 : f32 = gl_FragCoord.y;
+      if ((x_69 < 0.0)) {
+        let x_74 : i32 = x_6.x_GLF_uniform_int_values[1];
+        let x_75 : f32 = f32(x_74);
+        x_GLF_color = vec4<f32>(x_75, x_75, x_75, x_75);
+        break;
+      }
+    }
+    let x_78 : f32 = gl_FragCoord.x;
+    if ((x_78 > 0.0)) {
+      let x_83 : f32 = gl_FragCoord.y;
+      if ((x_83 < 0.0)) {
+        let x_88 : i32 = x_6.x_GLF_uniform_int_values[1];
+        let x_89 : f32 = f32(x_88);
+        x_GLF_color = vec4<f32>(x_89, x_89, x_89, x_89);
+      }
+    }
+
+    continuing {
+      let x_91 : i32 = i;
+      i = (x_91 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matching-if-always-true-inside-loop/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-matching-if-always-true-inside-loop/0-opt.spvasm
new file mode 100644
index 0000000..4d16e49
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matching-if-always-true-inside-loop/0-opt.spvasm
@@ -0,0 +1,175 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %func_i1_ "func(i1;"
+               OpName %x "x"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %indexable "indexable"
+               OpName %a_0 "a"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_5 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %16 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %19 = OpTypeFunction %int %_ptr_Function_int
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_int_uint_5 = OpTypeArray %int %uint_5
+       %buf0 = OpTypeStruct %_arr_int_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+%_ptr_Function__arr_int_uint_4 = OpTypePointer Function %_arr_int_uint_4
+       %true = OpConstantTrue %bool
+      %int_4 = OpConstant %int 4
+      %int_2 = OpConstant %int 2
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %16
+         %37 = OpLabel
+        %a_0 = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_int Function
+    %param_0 = OpVariable %_ptr_Function_int Function
+         %38 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %39 = OpLoad %int %38
+               OpStore %param %39
+         %40 = OpFunctionCall %int %func_i1_ %param
+               OpStore %a_0 %40
+         %41 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %42 = OpLoad %int %41
+               OpStore %param_0 %42
+         %43 = OpFunctionCall %int %func_i1_ %param_0
+         %44 = OpLoad %int %a_0
+         %45 = OpIAdd %int %44 %43
+               OpStore %a_0 %45
+         %46 = OpLoad %int %a_0
+         %47 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %48 = OpLoad %int %47
+         %49 = OpIEqual %bool %46 %48
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %52
+         %51 = OpLabel
+         %53 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %54 = OpLoad %int %53
+         %55 = OpConvertSToF %float %54
+         %56 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %57 = OpLoad %int %56
+         %58 = OpConvertSToF %float %57
+         %59 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %60 = OpLoad %int %59
+         %61 = OpConvertSToF %float %60
+         %62 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %63 = OpLoad %int %62
+         %64 = OpConvertSToF %float %63
+         %65 = OpCompositeConstruct %v4float %55 %58 %61 %64
+               OpStore %_GLF_color %65
+               OpBranch %50
+         %52 = OpLabel
+         %66 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %67 = OpLoad %int %66
+         %68 = OpConvertSToF %float %67
+         %69 = OpCompositeConstruct %v4float %68 %68 %68 %68
+               OpStore %_GLF_color %69
+               OpBranch %50
+         %50 = OpLabel
+               OpReturn
+               OpFunctionEnd
+   %func_i1_ = OpFunction %int None %19
+          %x = OpFunctionParameter %_ptr_Function_int
+         %70 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+  %indexable = OpVariable %_ptr_Function__arr_int_uint_4 Function
+         %71 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %72 = OpLoad %int %71
+               OpStore %a %72
+         %73 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %74 = OpLoad %int %73
+               OpStore %i %74
+               OpBranch %75
+         %75 = OpLabel
+               OpLoopMerge %76 %77 None
+               OpBranch %78
+         %78 = OpLabel
+         %79 = OpLoad %int %i
+         %80 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %81 = OpLoad %int %80
+         %82 = OpSLessThan %bool %79 %81
+               OpBranchConditional %82 %83 %76
+         %83 = OpLabel
+         %84 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %85 = OpLoad %int %84
+         %86 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %87 = OpLoad %int %86
+         %88 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %89 = OpLoad %int %88
+         %90 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %91 = OpLoad %int %90
+         %92 = OpCompositeConstruct %_arr_int_uint_4 %85 %87 %89 %91
+         %93 = OpLoad %int %a
+               OpStore %indexable %92
+         %94 = OpAccessChain %_ptr_Function_int %indexable %93
+         %95 = OpLoad %int %94
+         %96 = OpLoad %int %x
+         %97 = OpSGreaterThan %bool %95 %96
+               OpSelectionMerge %98 None
+               OpBranchConditional %97 %99 %100
+         %99 = OpLabel
+               OpSelectionMerge %101 None
+               OpBranchConditional %true %102 %103
+        %102 = OpLabel
+        %104 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+        %105 = OpLoad %int %104
+               OpReturnValue %105
+        %103 = OpLabel
+        %106 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+        %107 = OpLoad %int %106
+               OpStore %a %107
+               OpBranch %101
+        %101 = OpLabel
+               OpBranch %98
+        %100 = OpLabel
+               OpSelectionMerge %108 None
+               OpBranchConditional %true %109 %108
+        %109 = OpLabel
+        %110 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_4
+        %111 = OpLoad %int %110
+               OpReturnValue %111
+        %108 = OpLabel
+               OpBranch %98
+         %98 = OpLabel
+               OpBranch %77
+         %77 = OpLabel
+        %112 = OpLoad %int %i
+        %113 = OpIAdd %int %112 %int_1
+               OpStore %i %113
+               OpBranch %75
+         %76 = OpLabel
+        %114 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+        %115 = OpLoad %int %114
+               OpReturnValue %115
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matching-if-always-true-inside-loop/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-matching-if-always-true-inside-loop/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..cf463e7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matching-if-always-true-inside-loop/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,99 @@
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[5];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+int func_i1_(inout int x) {
+  int a = 0;
+  int i = 0;
+  int indexable[4] = (int[4])0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_72 = asint(x_8[scalar_offset / 4][scalar_offset % 4]);
+  a = x_72;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_74 = asint(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  i = x_74;
+  while (true) {
+    const int x_79 = i;
+    const int x_81 = asint(x_8[1].x);
+    if ((x_79 < x_81)) {
+    } else {
+      break;
+    }
+    const int x_85 = asint(x_8[3].x);
+    const int x_87 = asint(x_8[3].x);
+    const int x_89 = asint(x_8[3].x);
+    const int x_91 = asint(x_8[3].x);
+    const int x_93 = a;
+    const int tint_symbol_3[4] = {x_85, x_87, x_89, x_91};
+    indexable = tint_symbol_3;
+    const int x_95 = indexable[x_93];
+    const int x_96 = x;
+    if ((x_95 > x_96)) {
+      if (true) {
+        const int x_105 = asint(x_8[3].x);
+        return x_105;
+      } else {
+        const int x_107 = asint(x_8[3].x);
+        a = x_107;
+      }
+    } else {
+      if (true) {
+        const int x_111 = asint(x_8[4].x);
+        return x_111;
+      }
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const int x_115 = asint(x_8[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  return x_115;
+}
+
+void main_1() {
+  int a_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const int x_39 = asint(x_8[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  param = x_39;
+  const int x_40 = func_i1_(param);
+  a_1 = x_40;
+  const int x_42 = asint(x_8[3].x);
+  param_1 = x_42;
+  const int x_43 = func_i1_(param_1);
+  a_1 = (a_1 + x_43);
+  const int x_46 = a_1;
+  const int x_48 = asint(x_8[2].x);
+  if ((x_46 == x_48)) {
+    const int x_54 = asint(x_8[3].x);
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_57 = asint(x_8[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const int x_60 = asint(x_8[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    const int x_63 = asint(x_8[3].x);
+    x_GLF_color = float4(float(x_54), float(x_57), float(x_60), float(x_63));
+  } else {
+    const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+    const int x_67 = asint(x_8[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+    const float x_68 = float(x_67);
+    x_GLF_color = float4(x_68, x_68, x_68, x_68);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matching-if-always-true-inside-loop/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-matching-if-always-true-inside-loop/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..f72fd0a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matching-if-always-true-inside-loop/0-opt.spvasm.expected.msl
@@ -0,0 +1,107 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[5];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_1 {
+  int arr[4];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int func_i1_(constant buf0& x_8, thread int* const x) {
+  int a = 0;
+  int i = 0;
+  tint_array_wrapper_1 indexable = {};
+  int const x_72 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  a = x_72;
+  int const x_74 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  i = x_74;
+  while (true) {
+    int const x_79 = i;
+    int const x_81 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    if ((x_79 < x_81)) {
+    } else {
+      break;
+    }
+    int const x_85 = x_8.x_GLF_uniform_int_values.arr[3].el;
+    int const x_87 = x_8.x_GLF_uniform_int_values.arr[3].el;
+    int const x_89 = x_8.x_GLF_uniform_int_values.arr[3].el;
+    int const x_91 = x_8.x_GLF_uniform_int_values.arr[3].el;
+    int const x_93 = a;
+    tint_array_wrapper_1 const tint_symbol_3 = {.arr={x_85, x_87, x_89, x_91}};
+    indexable = tint_symbol_3;
+    int const x_95 = indexable.arr[x_93];
+    int const x_96 = *(x);
+    if ((x_95 > x_96)) {
+      if (true) {
+        int const x_105 = x_8.x_GLF_uniform_int_values.arr[3].el;
+        return x_105;
+      } else {
+        int const x_107 = x_8.x_GLF_uniform_int_values.arr[3].el;
+        a = x_107;
+      }
+    } else {
+      if (true) {
+        int const x_111 = x_8.x_GLF_uniform_int_values.arr[4].el;
+        return x_111;
+      }
+    }
+    {
+      int const x_112 = i;
+      i = (x_112 + 1);
+    }
+  }
+  int const x_115 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  return x_115;
+}
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_5) {
+  int a_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int const x_39 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  param = x_39;
+  int const x_40 = func_i1_(x_8, &(param));
+  a_1 = x_40;
+  int const x_42 = x_8.x_GLF_uniform_int_values.arr[3].el;
+  param_1 = x_42;
+  int const x_43 = func_i1_(x_8, &(param_1));
+  int const x_44 = a_1;
+  a_1 = (x_44 + x_43);
+  int const x_46 = a_1;
+  int const x_48 = x_8.x_GLF_uniform_int_values.arr[2].el;
+  if ((x_46 == x_48)) {
+    int const x_54 = x_8.x_GLF_uniform_int_values.arr[3].el;
+    int const x_57 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    int const x_60 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    int const x_63 = x_8.x_GLF_uniform_int_values.arr[3].el;
+    *(tint_symbol_5) = float4(float(x_54), float(x_57), float(x_60), float(x_63));
+  } else {
+    int const x_67 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    float const x_68 = float(x_67);
+    *(tint_symbol_5) = float4(x_68, x_68, x_68, x_68);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_8, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matching-if-always-true-inside-loop/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-matching-if-always-true-inside-loop/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..847dc61
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matching-if-always-true-inside-loop/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,215 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 138
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_i1_ "func_i1_"
+               OpName %x "x"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %indexable "indexable"
+               OpName %main_1 "main_1"
+               OpName %a_1 "a_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_5 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_int_uint_5 = OpTypeArray %int %uint_5
+       %buf0 = OpTypeStruct %_arr_int_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+%_ptr_Function_int = OpTypePointer Function %int
+         %15 = OpTypeFunction %int %_ptr_Function_int
+         %21 = OpConstantNull %int
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+%_ptr_Function__arr_int_uint_4 = OpTypePointer Function %_arr_int_uint_4
+         %27 = OpConstantNull %_arr_int_uint_4
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+       %true = OpConstantTrue %bool
+      %int_4 = OpConstant %int 4
+       %void = OpTypeVoid
+         %84 = OpTypeFunction %void
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+        %126 = OpTypeFunction %void %main_out
+   %func_i1_ = OpFunction %int None %15
+          %x = OpFunctionParameter %_ptr_Function_int
+         %19 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+          %i = OpVariable %_ptr_Function_int Function %21
+  %indexable = OpVariable %_ptr_Function__arr_int_uint_4 Function %27
+         %31 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %32 = OpLoad %int %31
+               OpStore %a %32
+         %33 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %34 = OpLoad %int %33
+               OpStore %i %34
+               OpBranch %35
+         %35 = OpLabel
+               OpLoopMerge %36 %37 None
+               OpBranch %38
+         %38 = OpLabel
+         %39 = OpLoad %int %i
+         %41 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %42 = OpLoad %int %41
+         %43 = OpSLessThan %bool %39 %42
+               OpSelectionMerge %45 None
+               OpBranchConditional %43 %46 %47
+         %46 = OpLabel
+               OpBranch %45
+         %47 = OpLabel
+               OpBranch %36
+         %45 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_3
+         %50 = OpLoad %int %49
+         %51 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_3
+         %52 = OpLoad %int %51
+         %53 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_3
+         %54 = OpLoad %int %53
+         %55 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_3
+         %56 = OpLoad %int %55
+         %57 = OpLoad %int %a
+         %58 = OpCompositeConstruct %_arr_int_uint_4 %50 %52 %54 %56
+               OpStore %indexable %58
+         %59 = OpAccessChain %_ptr_Function_int %indexable %57
+         %60 = OpLoad %int %59
+         %62 = OpLoad %int %x
+         %63 = OpSGreaterThan %bool %60 %62
+               OpSelectionMerge %64 None
+               OpBranchConditional %63 %65 %66
+         %65 = OpLabel
+               OpSelectionMerge %68 None
+               OpBranchConditional %true %69 %70
+         %69 = OpLabel
+         %71 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_3
+         %72 = OpLoad %int %71
+               OpReturnValue %72
+         %70 = OpLabel
+         %73 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_3
+         %74 = OpLoad %int %73
+               OpStore %a %74
+               OpBranch %68
+         %68 = OpLabel
+               OpBranch %64
+         %66 = OpLabel
+               OpSelectionMerge %75 None
+               OpBranchConditional %true %76 %75
+         %76 = OpLabel
+         %78 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_4
+         %79 = OpLoad %int %78
+               OpReturnValue %79
+         %75 = OpLabel
+               OpBranch %64
+         %64 = OpLabel
+               OpBranch %37
+         %37 = OpLabel
+         %80 = OpLoad %int %i
+         %81 = OpIAdd %int %80 %int_1
+               OpStore %i %81
+               OpBranch %35
+         %36 = OpLabel
+         %82 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %83 = OpLoad %int %82
+               OpReturnValue %83
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %84
+         %87 = OpLabel
+        %a_1 = OpVariable %_ptr_Function_int Function %21
+      %param = OpVariable %_ptr_Function_int Function %21
+    %param_1 = OpVariable %_ptr_Function_int Function %21
+         %91 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %92 = OpLoad %int %91
+               OpStore %param %92
+         %93 = OpFunctionCall %int %func_i1_ %param
+               OpStore %a_1 %93
+         %95 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_3
+         %96 = OpLoad %int %95
+               OpStore %param_1 %96
+         %97 = OpFunctionCall %int %func_i1_ %param_1
+         %99 = OpLoad %int %a_1
+        %100 = OpIAdd %int %99 %97
+               OpStore %a_1 %100
+        %101 = OpLoad %int %a_1
+        %103 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+        %104 = OpLoad %int %103
+        %105 = OpIEqual %bool %101 %104
+               OpSelectionMerge %106 None
+               OpBranchConditional %105 %107 %108
+        %107 = OpLabel
+        %109 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_3
+        %110 = OpLoad %int %109
+        %111 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+        %112 = OpLoad %int %111
+        %113 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+        %114 = OpLoad %int %113
+        %115 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_3
+        %116 = OpLoad %int %115
+        %117 = OpConvertSToF %float %110
+        %118 = OpConvertSToF %float %112
+        %119 = OpConvertSToF %float %114
+        %120 = OpConvertSToF %float %116
+        %121 = OpCompositeConstruct %v4float %117 %118 %119 %120
+               OpStore %x_GLF_color %121
+               OpBranch %106
+        %108 = OpLabel
+        %122 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+        %123 = OpLoad %int %122
+        %124 = OpConvertSToF %float %123
+        %125 = OpCompositeConstruct %v4float %124 %124 %124 %124
+               OpStore %x_GLF_color %125
+               OpBranch %106
+        %106 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %126
+%tint_symbol = OpFunctionParameter %main_out
+        %130 = OpLabel
+        %131 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %131
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %84
+        %133 = OpLabel
+        %134 = OpFunctionCall %void %main_1
+        %136 = OpLoad %v4float %x_GLF_color
+        %137 = OpCompositeConstruct %main_out %136
+        %135 = OpFunctionCall %void %tint_symbol_2 %137
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matching-if-always-true-inside-loop/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-matching-if-always-true-inside-loop/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..9e7764a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matching-if-always-true-inside-loop/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,97 @@
+type Arr = [[stride(16)]] array<i32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_i1_(x : ptr<function, i32>) -> i32 {
+  var a : i32;
+  var i : i32;
+  var indexable : array<i32, 4>;
+  let x_72 : i32 = x_8.x_GLF_uniform_int_values[0];
+  a = x_72;
+  let x_74 : i32 = x_8.x_GLF_uniform_int_values[0];
+  i = x_74;
+  loop {
+    let x_79 : i32 = i;
+    let x_81 : i32 = x_8.x_GLF_uniform_int_values[1];
+    if ((x_79 < x_81)) {
+    } else {
+      break;
+    }
+    let x_85 : i32 = x_8.x_GLF_uniform_int_values[3];
+    let x_87 : i32 = x_8.x_GLF_uniform_int_values[3];
+    let x_89 : i32 = x_8.x_GLF_uniform_int_values[3];
+    let x_91 : i32 = x_8.x_GLF_uniform_int_values[3];
+    let x_93 : i32 = a;
+    indexable = array<i32, 4>(x_85, x_87, x_89, x_91);
+    let x_95 : i32 = indexable[x_93];
+    let x_96 : i32 = *(x);
+    if ((x_95 > x_96)) {
+      if (true) {
+        let x_105 : i32 = x_8.x_GLF_uniform_int_values[3];
+        return x_105;
+      } else {
+        let x_107 : i32 = x_8.x_GLF_uniform_int_values[3];
+        a = x_107;
+      }
+    } else {
+      if (true) {
+        let x_111 : i32 = x_8.x_GLF_uniform_int_values[4];
+        return x_111;
+      }
+    }
+
+    continuing {
+      let x_112 : i32 = i;
+      i = (x_112 + 1);
+    }
+  }
+  let x_115 : i32 = x_8.x_GLF_uniform_int_values[0];
+  return x_115;
+}
+
+fn main_1() {
+  var a_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  let x_39 : i32 = x_8.x_GLF_uniform_int_values[0];
+  param = x_39;
+  let x_40 : i32 = func_i1_(&(param));
+  a_1 = x_40;
+  let x_42 : i32 = x_8.x_GLF_uniform_int_values[3];
+  param_1 = x_42;
+  let x_43 : i32 = func_i1_(&(param_1));
+  let x_44 : i32 = a_1;
+  a_1 = (x_44 + x_43);
+  let x_46 : i32 = a_1;
+  let x_48 : i32 = x_8.x_GLF_uniform_int_values[2];
+  if ((x_46 == x_48)) {
+    let x_54 : i32 = x_8.x_GLF_uniform_int_values[3];
+    let x_57 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_60 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_63 : i32 = x_8.x_GLF_uniform_int_values[3];
+    x_GLF_color = vec4<f32>(f32(x_54), f32(x_57), f32(x_60), f32(x_63));
+  } else {
+    let x_67 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_68 : f32 = f32(x_67);
+    x_GLF_color = vec4<f32>(x_68, x_68, x_68, x_68);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matching-if-always-true-inside-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-matching-if-always-true-inside-loop/0-opt.wgsl
new file mode 100644
index 0000000..9e7764a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matching-if-always-true-inside-loop/0-opt.wgsl
@@ -0,0 +1,97 @@
+type Arr = [[stride(16)]] array<i32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_i1_(x : ptr<function, i32>) -> i32 {
+  var a : i32;
+  var i : i32;
+  var indexable : array<i32, 4>;
+  let x_72 : i32 = x_8.x_GLF_uniform_int_values[0];
+  a = x_72;
+  let x_74 : i32 = x_8.x_GLF_uniform_int_values[0];
+  i = x_74;
+  loop {
+    let x_79 : i32 = i;
+    let x_81 : i32 = x_8.x_GLF_uniform_int_values[1];
+    if ((x_79 < x_81)) {
+    } else {
+      break;
+    }
+    let x_85 : i32 = x_8.x_GLF_uniform_int_values[3];
+    let x_87 : i32 = x_8.x_GLF_uniform_int_values[3];
+    let x_89 : i32 = x_8.x_GLF_uniform_int_values[3];
+    let x_91 : i32 = x_8.x_GLF_uniform_int_values[3];
+    let x_93 : i32 = a;
+    indexable = array<i32, 4>(x_85, x_87, x_89, x_91);
+    let x_95 : i32 = indexable[x_93];
+    let x_96 : i32 = *(x);
+    if ((x_95 > x_96)) {
+      if (true) {
+        let x_105 : i32 = x_8.x_GLF_uniform_int_values[3];
+        return x_105;
+      } else {
+        let x_107 : i32 = x_8.x_GLF_uniform_int_values[3];
+        a = x_107;
+      }
+    } else {
+      if (true) {
+        let x_111 : i32 = x_8.x_GLF_uniform_int_values[4];
+        return x_111;
+      }
+    }
+
+    continuing {
+      let x_112 : i32 = i;
+      i = (x_112 + 1);
+    }
+  }
+  let x_115 : i32 = x_8.x_GLF_uniform_int_values[0];
+  return x_115;
+}
+
+fn main_1() {
+  var a_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  let x_39 : i32 = x_8.x_GLF_uniform_int_values[0];
+  param = x_39;
+  let x_40 : i32 = func_i1_(&(param));
+  a_1 = x_40;
+  let x_42 : i32 = x_8.x_GLF_uniform_int_values[3];
+  param_1 = x_42;
+  let x_43 : i32 = func_i1_(&(param_1));
+  let x_44 : i32 = a_1;
+  a_1 = (x_44 + x_43);
+  let x_46 : i32 = a_1;
+  let x_48 : i32 = x_8.x_GLF_uniform_int_values[2];
+  if ((x_46 == x_48)) {
+    let x_54 : i32 = x_8.x_GLF_uniform_int_values[3];
+    let x_57 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_60 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_63 : i32 = x_8.x_GLF_uniform_int_values[3];
+    x_GLF_color = vec4<f32>(f32(x_54), f32(x_57), f32(x_60), f32(x_63));
+  } else {
+    let x_67 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_68 : f32 = f32(x_67);
+    x_GLF_color = vec4<f32>(x_68, x_68, x_68, x_68);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matching-if-always-true-inside-loop/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-matching-if-always-true-inside-loop/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..cf463e7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matching-if-always-true-inside-loop/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,99 @@
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[5];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+int func_i1_(inout int x) {
+  int a = 0;
+  int i = 0;
+  int indexable[4] = (int[4])0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_72 = asint(x_8[scalar_offset / 4][scalar_offset % 4]);
+  a = x_72;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_74 = asint(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  i = x_74;
+  while (true) {
+    const int x_79 = i;
+    const int x_81 = asint(x_8[1].x);
+    if ((x_79 < x_81)) {
+    } else {
+      break;
+    }
+    const int x_85 = asint(x_8[3].x);
+    const int x_87 = asint(x_8[3].x);
+    const int x_89 = asint(x_8[3].x);
+    const int x_91 = asint(x_8[3].x);
+    const int x_93 = a;
+    const int tint_symbol_3[4] = {x_85, x_87, x_89, x_91};
+    indexable = tint_symbol_3;
+    const int x_95 = indexable[x_93];
+    const int x_96 = x;
+    if ((x_95 > x_96)) {
+      if (true) {
+        const int x_105 = asint(x_8[3].x);
+        return x_105;
+      } else {
+        const int x_107 = asint(x_8[3].x);
+        a = x_107;
+      }
+    } else {
+      if (true) {
+        const int x_111 = asint(x_8[4].x);
+        return x_111;
+      }
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const int x_115 = asint(x_8[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  return x_115;
+}
+
+void main_1() {
+  int a_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const int x_39 = asint(x_8[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  param = x_39;
+  const int x_40 = func_i1_(param);
+  a_1 = x_40;
+  const int x_42 = asint(x_8[3].x);
+  param_1 = x_42;
+  const int x_43 = func_i1_(param_1);
+  a_1 = (a_1 + x_43);
+  const int x_46 = a_1;
+  const int x_48 = asint(x_8[2].x);
+  if ((x_46 == x_48)) {
+    const int x_54 = asint(x_8[3].x);
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_57 = asint(x_8[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const int x_60 = asint(x_8[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    const int x_63 = asint(x_8[3].x);
+    x_GLF_color = float4(float(x_54), float(x_57), float(x_60), float(x_63));
+  } else {
+    const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+    const int x_67 = asint(x_8[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+    const float x_68 = float(x_67);
+    x_GLF_color = float4(x_68, x_68, x_68, x_68);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matching-if-always-true-inside-loop/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-matching-if-always-true-inside-loop/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..f72fd0a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matching-if-always-true-inside-loop/0-opt.wgsl.expected.msl
@@ -0,0 +1,107 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[5];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_1 {
+  int arr[4];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int func_i1_(constant buf0& x_8, thread int* const x) {
+  int a = 0;
+  int i = 0;
+  tint_array_wrapper_1 indexable = {};
+  int const x_72 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  a = x_72;
+  int const x_74 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  i = x_74;
+  while (true) {
+    int const x_79 = i;
+    int const x_81 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    if ((x_79 < x_81)) {
+    } else {
+      break;
+    }
+    int const x_85 = x_8.x_GLF_uniform_int_values.arr[3].el;
+    int const x_87 = x_8.x_GLF_uniform_int_values.arr[3].el;
+    int const x_89 = x_8.x_GLF_uniform_int_values.arr[3].el;
+    int const x_91 = x_8.x_GLF_uniform_int_values.arr[3].el;
+    int const x_93 = a;
+    tint_array_wrapper_1 const tint_symbol_3 = {.arr={x_85, x_87, x_89, x_91}};
+    indexable = tint_symbol_3;
+    int const x_95 = indexable.arr[x_93];
+    int const x_96 = *(x);
+    if ((x_95 > x_96)) {
+      if (true) {
+        int const x_105 = x_8.x_GLF_uniform_int_values.arr[3].el;
+        return x_105;
+      } else {
+        int const x_107 = x_8.x_GLF_uniform_int_values.arr[3].el;
+        a = x_107;
+      }
+    } else {
+      if (true) {
+        int const x_111 = x_8.x_GLF_uniform_int_values.arr[4].el;
+        return x_111;
+      }
+    }
+    {
+      int const x_112 = i;
+      i = (x_112 + 1);
+    }
+  }
+  int const x_115 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  return x_115;
+}
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_5) {
+  int a_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int const x_39 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  param = x_39;
+  int const x_40 = func_i1_(x_8, &(param));
+  a_1 = x_40;
+  int const x_42 = x_8.x_GLF_uniform_int_values.arr[3].el;
+  param_1 = x_42;
+  int const x_43 = func_i1_(x_8, &(param_1));
+  int const x_44 = a_1;
+  a_1 = (x_44 + x_43);
+  int const x_46 = a_1;
+  int const x_48 = x_8.x_GLF_uniform_int_values.arr[2].el;
+  if ((x_46 == x_48)) {
+    int const x_54 = x_8.x_GLF_uniform_int_values.arr[3].el;
+    int const x_57 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    int const x_60 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    int const x_63 = x_8.x_GLF_uniform_int_values.arr[3].el;
+    *(tint_symbol_5) = float4(float(x_54), float(x_57), float(x_60), float(x_63));
+  } else {
+    int const x_67 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    float const x_68 = float(x_67);
+    *(tint_symbol_5) = float4(x_68, x_68, x_68, x_68);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_8, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matching-if-always-true-inside-loop/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-matching-if-always-true-inside-loop/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..847dc61
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matching-if-always-true-inside-loop/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,215 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 138
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_i1_ "func_i1_"
+               OpName %x "x"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %indexable "indexable"
+               OpName %main_1 "main_1"
+               OpName %a_1 "a_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_5 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_int_uint_5 = OpTypeArray %int %uint_5
+       %buf0 = OpTypeStruct %_arr_int_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+%_ptr_Function_int = OpTypePointer Function %int
+         %15 = OpTypeFunction %int %_ptr_Function_int
+         %21 = OpConstantNull %int
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+%_ptr_Function__arr_int_uint_4 = OpTypePointer Function %_arr_int_uint_4
+         %27 = OpConstantNull %_arr_int_uint_4
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+       %true = OpConstantTrue %bool
+      %int_4 = OpConstant %int 4
+       %void = OpTypeVoid
+         %84 = OpTypeFunction %void
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+        %126 = OpTypeFunction %void %main_out
+   %func_i1_ = OpFunction %int None %15
+          %x = OpFunctionParameter %_ptr_Function_int
+         %19 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+          %i = OpVariable %_ptr_Function_int Function %21
+  %indexable = OpVariable %_ptr_Function__arr_int_uint_4 Function %27
+         %31 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %32 = OpLoad %int %31
+               OpStore %a %32
+         %33 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %34 = OpLoad %int %33
+               OpStore %i %34
+               OpBranch %35
+         %35 = OpLabel
+               OpLoopMerge %36 %37 None
+               OpBranch %38
+         %38 = OpLabel
+         %39 = OpLoad %int %i
+         %41 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %42 = OpLoad %int %41
+         %43 = OpSLessThan %bool %39 %42
+               OpSelectionMerge %45 None
+               OpBranchConditional %43 %46 %47
+         %46 = OpLabel
+               OpBranch %45
+         %47 = OpLabel
+               OpBranch %36
+         %45 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_3
+         %50 = OpLoad %int %49
+         %51 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_3
+         %52 = OpLoad %int %51
+         %53 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_3
+         %54 = OpLoad %int %53
+         %55 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_3
+         %56 = OpLoad %int %55
+         %57 = OpLoad %int %a
+         %58 = OpCompositeConstruct %_arr_int_uint_4 %50 %52 %54 %56
+               OpStore %indexable %58
+         %59 = OpAccessChain %_ptr_Function_int %indexable %57
+         %60 = OpLoad %int %59
+         %62 = OpLoad %int %x
+         %63 = OpSGreaterThan %bool %60 %62
+               OpSelectionMerge %64 None
+               OpBranchConditional %63 %65 %66
+         %65 = OpLabel
+               OpSelectionMerge %68 None
+               OpBranchConditional %true %69 %70
+         %69 = OpLabel
+         %71 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_3
+         %72 = OpLoad %int %71
+               OpReturnValue %72
+         %70 = OpLabel
+         %73 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_3
+         %74 = OpLoad %int %73
+               OpStore %a %74
+               OpBranch %68
+         %68 = OpLabel
+               OpBranch %64
+         %66 = OpLabel
+               OpSelectionMerge %75 None
+               OpBranchConditional %true %76 %75
+         %76 = OpLabel
+         %78 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_4
+         %79 = OpLoad %int %78
+               OpReturnValue %79
+         %75 = OpLabel
+               OpBranch %64
+         %64 = OpLabel
+               OpBranch %37
+         %37 = OpLabel
+         %80 = OpLoad %int %i
+         %81 = OpIAdd %int %80 %int_1
+               OpStore %i %81
+               OpBranch %35
+         %36 = OpLabel
+         %82 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %83 = OpLoad %int %82
+               OpReturnValue %83
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %84
+         %87 = OpLabel
+        %a_1 = OpVariable %_ptr_Function_int Function %21
+      %param = OpVariable %_ptr_Function_int Function %21
+    %param_1 = OpVariable %_ptr_Function_int Function %21
+         %91 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %92 = OpLoad %int %91
+               OpStore %param %92
+         %93 = OpFunctionCall %int %func_i1_ %param
+               OpStore %a_1 %93
+         %95 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_3
+         %96 = OpLoad %int %95
+               OpStore %param_1 %96
+         %97 = OpFunctionCall %int %func_i1_ %param_1
+         %99 = OpLoad %int %a_1
+        %100 = OpIAdd %int %99 %97
+               OpStore %a_1 %100
+        %101 = OpLoad %int %a_1
+        %103 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+        %104 = OpLoad %int %103
+        %105 = OpIEqual %bool %101 %104
+               OpSelectionMerge %106 None
+               OpBranchConditional %105 %107 %108
+        %107 = OpLabel
+        %109 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_3
+        %110 = OpLoad %int %109
+        %111 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+        %112 = OpLoad %int %111
+        %113 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+        %114 = OpLoad %int %113
+        %115 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_3
+        %116 = OpLoad %int %115
+        %117 = OpConvertSToF %float %110
+        %118 = OpConvertSToF %float %112
+        %119 = OpConvertSToF %float %114
+        %120 = OpConvertSToF %float %116
+        %121 = OpCompositeConstruct %v4float %117 %118 %119 %120
+               OpStore %x_GLF_color %121
+               OpBranch %106
+        %108 = OpLabel
+        %122 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+        %123 = OpLoad %int %122
+        %124 = OpConvertSToF %float %123
+        %125 = OpCompositeConstruct %v4float %124 %124 %124 %124
+               OpStore %x_GLF_color %125
+               OpBranch %106
+        %106 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %126
+%tint_symbol = OpFunctionParameter %main_out
+        %130 = OpLabel
+        %131 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %131
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %84
+        %133 = OpLabel
+        %134 = OpFunctionCall %void %main_1
+        %136 = OpLoad %v4float %x_GLF_color
+        %137 = OpCompositeConstruct %main_out %136
+        %135 = OpFunctionCall %void %tint_symbol_2 %137
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matching-if-always-true-inside-loop/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-matching-if-always-true-inside-loop/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..9e7764a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matching-if-always-true-inside-loop/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,97 @@
+type Arr = [[stride(16)]] array<i32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_i1_(x : ptr<function, i32>) -> i32 {
+  var a : i32;
+  var i : i32;
+  var indexable : array<i32, 4>;
+  let x_72 : i32 = x_8.x_GLF_uniform_int_values[0];
+  a = x_72;
+  let x_74 : i32 = x_8.x_GLF_uniform_int_values[0];
+  i = x_74;
+  loop {
+    let x_79 : i32 = i;
+    let x_81 : i32 = x_8.x_GLF_uniform_int_values[1];
+    if ((x_79 < x_81)) {
+    } else {
+      break;
+    }
+    let x_85 : i32 = x_8.x_GLF_uniform_int_values[3];
+    let x_87 : i32 = x_8.x_GLF_uniform_int_values[3];
+    let x_89 : i32 = x_8.x_GLF_uniform_int_values[3];
+    let x_91 : i32 = x_8.x_GLF_uniform_int_values[3];
+    let x_93 : i32 = a;
+    indexable = array<i32, 4>(x_85, x_87, x_89, x_91);
+    let x_95 : i32 = indexable[x_93];
+    let x_96 : i32 = *(x);
+    if ((x_95 > x_96)) {
+      if (true) {
+        let x_105 : i32 = x_8.x_GLF_uniform_int_values[3];
+        return x_105;
+      } else {
+        let x_107 : i32 = x_8.x_GLF_uniform_int_values[3];
+        a = x_107;
+      }
+    } else {
+      if (true) {
+        let x_111 : i32 = x_8.x_GLF_uniform_int_values[4];
+        return x_111;
+      }
+    }
+
+    continuing {
+      let x_112 : i32 = i;
+      i = (x_112 + 1);
+    }
+  }
+  let x_115 : i32 = x_8.x_GLF_uniform_int_values[0];
+  return x_115;
+}
+
+fn main_1() {
+  var a_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  let x_39 : i32 = x_8.x_GLF_uniform_int_values[0];
+  param = x_39;
+  let x_40 : i32 = func_i1_(&(param));
+  a_1 = x_40;
+  let x_42 : i32 = x_8.x_GLF_uniform_int_values[3];
+  param_1 = x_42;
+  let x_43 : i32 = func_i1_(&(param_1));
+  let x_44 : i32 = a_1;
+  a_1 = (x_44 + x_43);
+  let x_46 : i32 = a_1;
+  let x_48 : i32 = x_8.x_GLF_uniform_int_values[2];
+  if ((x_46 == x_48)) {
+    let x_54 : i32 = x_8.x_GLF_uniform_int_values[3];
+    let x_57 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_60 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_63 : i32 = x_8.x_GLF_uniform_int_values[3];
+    x_GLF_color = vec4<f32>(f32(x_54), f32(x_57), f32(x_60), f32(x_63));
+  } else {
+    let x_67 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_68 : f32 = f32(x_67);
+    x_GLF_color = vec4<f32>(x_68, x_68, x_68, x_68);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matrix-double-transpose/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-matrix-double-transpose/0-opt.spvasm
new file mode 100644
index 0000000..284fbe3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matrix-double-transpose/0-opt.spvasm
@@ -0,0 +1,97 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %m "m"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%mat2v2float = OpTypeMatrix %v2float 2
+%_ptr_Function_mat2v2float = OpTypePointer Function %mat2v2float
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+     %v2bool = OpTypeVector %bool 2
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+      %int_1 = OpConstant %int 1
+       %main = OpFunction %void None %9
+         %27 = OpLabel
+          %m = OpVariable %_ptr_Function_mat2v2float Function
+         %28 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %29 = OpLoad %int %28
+         %30 = OpConvertSToF %float %29
+         %31 = OpCompositeConstruct %v2float %30 %float_0
+         %32 = OpCompositeConstruct %v2float %float_0 %30
+         %33 = OpCompositeConstruct %mat2v2float %31 %32
+         %34 = OpTranspose %mat2v2float %33
+         %35 = OpTranspose %mat2v2float %34
+               OpStore %m %35
+         %36 = OpLoad %mat2v2float %m
+         %37 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %38 = OpLoad %int %37
+         %39 = OpConvertSToF %float %38
+         %40 = OpCompositeConstruct %v2float %39 %float_0
+         %41 = OpCompositeConstruct %v2float %float_0 %39
+         %42 = OpCompositeConstruct %mat2v2float %40 %41
+         %43 = OpCompositeExtract %v2float %36 0
+         %44 = OpCompositeExtract %v2float %42 0
+         %45 = OpFOrdEqual %v2bool %43 %44
+         %46 = OpAll %bool %45
+         %47 = OpCompositeExtract %v2float %36 1
+         %48 = OpCompositeExtract %v2float %42 1
+         %49 = OpFOrdEqual %v2bool %47 %48
+         %50 = OpAll %bool %49
+         %51 = OpLogicalAnd %bool %46 %50
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %54
+         %53 = OpLabel
+         %55 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %56 = OpLoad %int %55
+         %57 = OpConvertSToF %float %56
+         %58 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %59 = OpLoad %int %58
+         %60 = OpConvertSToF %float %59
+         %61 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %62 = OpLoad %int %61
+         %63 = OpConvertSToF %float %62
+         %64 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %65 = OpLoad %int %64
+         %66 = OpConvertSToF %float %65
+         %67 = OpCompositeConstruct %v4float %57 %60 %63 %66
+               OpStore %_GLF_color %67
+               OpBranch %52
+         %54 = OpLabel
+         %68 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %69 = OpLoad %int %68
+         %70 = OpConvertSToF %float %69
+         %71 = OpCompositeConstruct %v4float %70 %70 %70 %70
+               OpStore %_GLF_color %71
+               OpBranch %52
+         %52 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matrix-double-transpose/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-matrix-double-transpose/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..7362602
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matrix-double-transpose/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,49 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2x2 m = float2x2(0.0f, 0.0f, 0.0f, 0.0f);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_29 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const float x_30 = float(x_29);
+  m = transpose(transpose(float2x2(float2(x_30, 0.0f), float2(0.0f, x_30))));
+  const float2x2 x_36 = m;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_38 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const float x_39 = float(x_38);
+  const float2x2 x_42 = float2x2(float2(x_39, 0.0f), float2(0.0f, x_39));
+  bool tint_tmp = all((x_36[0u] == x_42[0u]));
+  if (tint_tmp) {
+    tint_tmp = all((x_36[1u] == x_42[1u]));
+  }
+  if ((tint_tmp)) {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_56 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_59 = asint(x_6[1].x);
+    const int x_62 = asint(x_6[1].x);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_65 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    x_GLF_color = float4(float(x_56), float(x_59), float(x_62), float(x_65));
+  } else {
+    const int x_69 = asint(x_6[1].x);
+    const float x_70 = float(x_69);
+    x_GLF_color = float4(x_70, x_70, x_70, x_70);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matrix-double-transpose/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-matrix-double-transpose/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..4cfd1b7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matrix-double-transpose/0-opt.spvasm.expected.msl
@@ -0,0 +1,51 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float2x2 m = float2x2(0.0f);
+  int const x_29 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  float const x_30 = float(x_29);
+  m = transpose(transpose(float2x2(float2(x_30, 0.0f), float2(0.0f, x_30))));
+  float2x2 const x_36 = m;
+  int const x_38 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  float const x_39 = float(x_38);
+  float2x2 const x_42 = float2x2(float2(x_39, 0.0f), float2(0.0f, x_39));
+  if ((all((x_36[0u] == x_42[0u])) && all((x_36[1u] == x_42[1u])))) {
+    int const x_56 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_59 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_62 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_65 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_56), float(x_59), float(x_62), float(x_65));
+  } else {
+    int const x_69 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    float const x_70 = float(x_69);
+    *(tint_symbol_4) = float4(x_70, x_70, x_70, x_70);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matrix-double-transpose/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-matrix-double-transpose/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..b279bcf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matrix-double-transpose/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,135 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 90
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %m "m"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%mat2v2float = OpTypeMatrix %v2float 2
+%_ptr_Function_mat2v2float = OpTypePointer Function %mat2v2float
+         %23 = OpConstantNull %mat2v2float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+     %v2bool = OpTypeVector %bool 2
+     %uint_1 = OpConstant %uint 1
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %78 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %m = OpVariable %_ptr_Function_mat2v2float Function %23
+         %27 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %28 = OpLoad %int %27
+         %29 = OpConvertSToF %float %28
+         %33 = OpCompositeConstruct %v2float %29 %float_0
+         %34 = OpCompositeConstruct %v2float %float_0 %29
+         %35 = OpCompositeConstruct %mat2v2float %33 %34
+         %31 = OpTranspose %mat2v2float %35
+         %30 = OpTranspose %mat2v2float %31
+               OpStore %m %30
+         %36 = OpLoad %mat2v2float %m
+         %37 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %38 = OpLoad %int %37
+         %39 = OpConvertSToF %float %38
+         %40 = OpCompositeConstruct %v2float %39 %float_0
+         %41 = OpCompositeConstruct %v2float %float_0 %39
+         %42 = OpCompositeConstruct %mat2v2float %40 %41
+         %45 = OpCompositeExtract %v2float %36 0
+         %46 = OpCompositeExtract %v2float %42 0
+         %47 = OpFOrdEqual %v2bool %45 %46
+         %43 = OpAll %bool %47
+               OpSelectionMerge %49 None
+               OpBranchConditional %43 %50 %49
+         %50 = OpLabel
+         %53 = OpCompositeExtract %v2float %36 1
+         %54 = OpCompositeExtract %v2float %42 1
+         %55 = OpFOrdEqual %v2bool %53 %54
+         %51 = OpAll %bool %55
+               OpBranch %49
+         %49 = OpLabel
+         %56 = OpPhi %bool %43 %18 %51 %50
+               OpSelectionMerge %57 None
+               OpBranchConditional %56 %58 %59
+         %58 = OpLabel
+         %60 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %61 = OpLoad %int %60
+         %63 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %64 = OpLoad %int %63
+         %65 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %66 = OpLoad %int %65
+         %67 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %68 = OpLoad %int %67
+         %69 = OpConvertSToF %float %61
+         %70 = OpConvertSToF %float %64
+         %71 = OpConvertSToF %float %66
+         %72 = OpConvertSToF %float %68
+         %73 = OpCompositeConstruct %v4float %69 %70 %71 %72
+               OpStore %x_GLF_color %73
+               OpBranch %57
+         %59 = OpLabel
+         %74 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %75 = OpLoad %int %74
+         %76 = OpConvertSToF %float %75
+         %77 = OpCompositeConstruct %v4float %76 %76 %76 %76
+               OpStore %x_GLF_color %77
+               OpBranch %57
+         %57 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %78
+%tint_symbol = OpFunctionParameter %main_out
+         %82 = OpLabel
+         %83 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %83
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %85 = OpLabel
+         %86 = OpFunctionCall %void %main_1
+         %88 = OpLoad %v4float %x_GLF_color
+         %89 = OpCompositeConstruct %main_out %88
+         %87 = OpFunctionCall %void %tint_symbol_2 %89
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matrix-double-transpose/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-matrix-double-transpose/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..510e118
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matrix-double-transpose/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,44 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m : mat2x2<f32>;
+  let x_29 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_30 : f32 = f32(x_29);
+  m = transpose(transpose(mat2x2<f32>(vec2<f32>(x_30, 0.0), vec2<f32>(0.0, x_30))));
+  let x_36 : mat2x2<f32> = m;
+  let x_38 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_39 : f32 = f32(x_38);
+  let x_42 : mat2x2<f32> = mat2x2<f32>(vec2<f32>(x_39, 0.0), vec2<f32>(0.0, x_39));
+  if ((all((x_36[0u] == x_42[0u])) && all((x_36[1u] == x_42[1u])))) {
+    let x_56 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_59 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_62 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_65 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_56), f32(x_59), f32(x_62), f32(x_65));
+  } else {
+    let x_69 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_70 : f32 = f32(x_69);
+    x_GLF_color = vec4<f32>(x_70, x_70, x_70, x_70);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matrix-double-transpose/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-matrix-double-transpose/0-opt.wgsl
new file mode 100644
index 0000000..510e118
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matrix-double-transpose/0-opt.wgsl
@@ -0,0 +1,44 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m : mat2x2<f32>;
+  let x_29 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_30 : f32 = f32(x_29);
+  m = transpose(transpose(mat2x2<f32>(vec2<f32>(x_30, 0.0), vec2<f32>(0.0, x_30))));
+  let x_36 : mat2x2<f32> = m;
+  let x_38 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_39 : f32 = f32(x_38);
+  let x_42 : mat2x2<f32> = mat2x2<f32>(vec2<f32>(x_39, 0.0), vec2<f32>(0.0, x_39));
+  if ((all((x_36[0u] == x_42[0u])) && all((x_36[1u] == x_42[1u])))) {
+    let x_56 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_59 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_62 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_65 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_56), f32(x_59), f32(x_62), f32(x_65));
+  } else {
+    let x_69 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_70 : f32 = f32(x_69);
+    x_GLF_color = vec4<f32>(x_70, x_70, x_70, x_70);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matrix-double-transpose/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-matrix-double-transpose/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..7362602
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matrix-double-transpose/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,49 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2x2 m = float2x2(0.0f, 0.0f, 0.0f, 0.0f);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_29 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const float x_30 = float(x_29);
+  m = transpose(transpose(float2x2(float2(x_30, 0.0f), float2(0.0f, x_30))));
+  const float2x2 x_36 = m;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_38 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const float x_39 = float(x_38);
+  const float2x2 x_42 = float2x2(float2(x_39, 0.0f), float2(0.0f, x_39));
+  bool tint_tmp = all((x_36[0u] == x_42[0u]));
+  if (tint_tmp) {
+    tint_tmp = all((x_36[1u] == x_42[1u]));
+  }
+  if ((tint_tmp)) {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_56 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_59 = asint(x_6[1].x);
+    const int x_62 = asint(x_6[1].x);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_65 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    x_GLF_color = float4(float(x_56), float(x_59), float(x_62), float(x_65));
+  } else {
+    const int x_69 = asint(x_6[1].x);
+    const float x_70 = float(x_69);
+    x_GLF_color = float4(x_70, x_70, x_70, x_70);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matrix-double-transpose/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-matrix-double-transpose/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..4cfd1b7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matrix-double-transpose/0-opt.wgsl.expected.msl
@@ -0,0 +1,51 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float2x2 m = float2x2(0.0f);
+  int const x_29 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  float const x_30 = float(x_29);
+  m = transpose(transpose(float2x2(float2(x_30, 0.0f), float2(0.0f, x_30))));
+  float2x2 const x_36 = m;
+  int const x_38 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  float const x_39 = float(x_38);
+  float2x2 const x_42 = float2x2(float2(x_39, 0.0f), float2(0.0f, x_39));
+  if ((all((x_36[0u] == x_42[0u])) && all((x_36[1u] == x_42[1u])))) {
+    int const x_56 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_59 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_62 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_65 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_56), float(x_59), float(x_62), float(x_65));
+  } else {
+    int const x_69 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    float const x_70 = float(x_69);
+    *(tint_symbol_4) = float4(x_70, x_70, x_70, x_70);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matrix-double-transpose/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-matrix-double-transpose/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..b279bcf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matrix-double-transpose/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,135 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 90
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %m "m"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%mat2v2float = OpTypeMatrix %v2float 2
+%_ptr_Function_mat2v2float = OpTypePointer Function %mat2v2float
+         %23 = OpConstantNull %mat2v2float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+     %v2bool = OpTypeVector %bool 2
+     %uint_1 = OpConstant %uint 1
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %78 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %m = OpVariable %_ptr_Function_mat2v2float Function %23
+         %27 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %28 = OpLoad %int %27
+         %29 = OpConvertSToF %float %28
+         %33 = OpCompositeConstruct %v2float %29 %float_0
+         %34 = OpCompositeConstruct %v2float %float_0 %29
+         %35 = OpCompositeConstruct %mat2v2float %33 %34
+         %31 = OpTranspose %mat2v2float %35
+         %30 = OpTranspose %mat2v2float %31
+               OpStore %m %30
+         %36 = OpLoad %mat2v2float %m
+         %37 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %38 = OpLoad %int %37
+         %39 = OpConvertSToF %float %38
+         %40 = OpCompositeConstruct %v2float %39 %float_0
+         %41 = OpCompositeConstruct %v2float %float_0 %39
+         %42 = OpCompositeConstruct %mat2v2float %40 %41
+         %45 = OpCompositeExtract %v2float %36 0
+         %46 = OpCompositeExtract %v2float %42 0
+         %47 = OpFOrdEqual %v2bool %45 %46
+         %43 = OpAll %bool %47
+               OpSelectionMerge %49 None
+               OpBranchConditional %43 %50 %49
+         %50 = OpLabel
+         %53 = OpCompositeExtract %v2float %36 1
+         %54 = OpCompositeExtract %v2float %42 1
+         %55 = OpFOrdEqual %v2bool %53 %54
+         %51 = OpAll %bool %55
+               OpBranch %49
+         %49 = OpLabel
+         %56 = OpPhi %bool %43 %18 %51 %50
+               OpSelectionMerge %57 None
+               OpBranchConditional %56 %58 %59
+         %58 = OpLabel
+         %60 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %61 = OpLoad %int %60
+         %63 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %64 = OpLoad %int %63
+         %65 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %66 = OpLoad %int %65
+         %67 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %68 = OpLoad %int %67
+         %69 = OpConvertSToF %float %61
+         %70 = OpConvertSToF %float %64
+         %71 = OpConvertSToF %float %66
+         %72 = OpConvertSToF %float %68
+         %73 = OpCompositeConstruct %v4float %69 %70 %71 %72
+               OpStore %x_GLF_color %73
+               OpBranch %57
+         %59 = OpLabel
+         %74 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %75 = OpLoad %int %74
+         %76 = OpConvertSToF %float %75
+         %77 = OpCompositeConstruct %v4float %76 %76 %76 %76
+               OpStore %x_GLF_color %77
+               OpBranch %57
+         %57 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %78
+%tint_symbol = OpFunctionParameter %main_out
+         %82 = OpLabel
+         %83 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %83
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %85 = OpLabel
+         %86 = OpFunctionCall %void %main_1
+         %88 = OpLoad %v4float %x_GLF_color
+         %89 = OpCompositeConstruct %main_out %88
+         %87 = OpFunctionCall %void %tint_symbol_2 %89
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matrix-double-transpose/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-matrix-double-transpose/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..510e118
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matrix-double-transpose/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,44 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m : mat2x2<f32>;
+  let x_29 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_30 : f32 = f32(x_29);
+  m = transpose(transpose(mat2x2<f32>(vec2<f32>(x_30, 0.0), vec2<f32>(0.0, x_30))));
+  let x_36 : mat2x2<f32> = m;
+  let x_38 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_39 : f32 = f32(x_38);
+  let x_42 : mat2x2<f32> = mat2x2<f32>(vec2<f32>(x_39, 0.0), vec2<f32>(0.0, x_39));
+  if ((all((x_36[0u] == x_42[0u])) && all((x_36[1u] == x_42[1u])))) {
+    let x_56 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_59 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_62 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_65 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_56), f32(x_59), f32(x_62), f32(x_65));
+  } else {
+    let x_69 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_70 : f32 = f32(x_69);
+    x_GLF_color = vec4<f32>(x_70, x_70, x_70, x_70);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matrix-square-mul-with-vector/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-matrix-square-mul-with-vector/0-opt.spvasm
new file mode 100644
index 0000000..2ebee33
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matrix-square-mul-with-vector/0-opt.spvasm
@@ -0,0 +1,98 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %m0 "m0"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %m1 "m1"
+               OpName %v "v"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%mat2v2float = OpTypeMatrix %v2float 2
+%_ptr_Function_mat2v2float = OpTypePointer Function %mat2v2float
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%float_n0_540302277 = OpConstant %float -0.540302277
+%float_0_540302277 = OpConstant %float 0.540302277
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+      %int_1 = OpConstant %int 1
+       %main = OpFunction %void None %11
+         %33 = OpLabel
+         %m0 = OpVariable %_ptr_Function_mat2v2float Function
+         %m1 = OpVariable %_ptr_Function_mat2v2float Function
+          %v = OpVariable %_ptr_Function_v2float Function
+         %34 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %35 = OpLoad %float %34
+         %36 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %37 = OpLoad %float %36
+         %38 = OpCompositeConstruct %v2float %35 %float_n0_540302277
+         %39 = OpCompositeConstruct %v2float %float_0_540302277 %37
+         %40 = OpCompositeConstruct %mat2v2float %38 %39
+               OpStore %m0 %40
+         %41 = OpLoad %mat2v2float %m0
+         %42 = OpLoad %mat2v2float %m0
+         %43 = OpMatrixTimesMatrix %mat2v2float %41 %42
+               OpStore %m1 %43
+         %44 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %45 = OpLoad %float %44
+         %46 = OpCompositeConstruct %v2float %45 %45
+         %47 = OpLoad %mat2v2float %m1
+         %48 = OpVectorTimesMatrix %v2float %46 %47
+               OpStore %v %48
+         %49 = OpAccessChain %_ptr_Function_float %v %uint_0
+         %50 = OpLoad %float %49
+         %51 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %52 = OpLoad %float %51
+         %53 = OpFOrdLessThan %bool %50 %52
+               OpSelectionMerge %54 None
+               OpBranchConditional %53 %55 %56
+         %55 = OpLabel
+         %57 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %58 = OpLoad %float %57
+         %59 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %60 = OpLoad %float %59
+         %61 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %62 = OpLoad %float %61
+         %63 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %64 = OpLoad %float %63
+         %65 = OpCompositeConstruct %v4float %58 %60 %62 %64
+               OpStore %_GLF_color %65
+               OpBranch %54
+         %56 = OpLabel
+         %66 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %67 = OpLoad %float %66
+         %68 = OpCompositeConstruct %v4float %67 %67 %67 %67
+               OpStore %_GLF_color %68
+               OpBranch %54
+         %54 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matrix-square-mul-with-vector/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-matrix-square-mul-with-vector/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..da225ef
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matrix-square-mul-with-vector/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,49 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2x2 m0 = float2x2(0.0f, 0.0f, 0.0f, 0.0f);
+  float2x2 m1 = float2x2(0.0f, 0.0f, 0.0f, 0.0f);
+  float2 v = float2(0.0f, 0.0f);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_35 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_37 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  m0 = float2x2(float2(x_35, -0.540302277f), float2(0.540302277f, x_37));
+  m1 = mul(m0, m0);
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const float x_45 = asfloat(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  v = mul(m1, float2(x_45, x_45));
+  const float x_50 = v.x;
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const float x_52 = asfloat(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  if ((x_50 < x_52)) {
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const float x_58 = asfloat(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const float x_60 = asfloat(x_6[1].x);
+    const float x_62 = asfloat(x_6[1].x);
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const float x_64 = asfloat(x_6[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    x_GLF_color = float4(x_58, x_60, x_62, x_64);
+  } else {
+    const float x_67 = asfloat(x_6[1].x);
+    x_GLF_color = float4(x_67, x_67, x_67, x_67);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matrix-square-mul-with-vector/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-matrix-square-mul-with-vector/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..ee86a7c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matrix-square-mul-with-vector/0-opt.spvasm.expected.msl
@@ -0,0 +1,56 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float2x2 m0 = float2x2(0.0f);
+  float2x2 m1 = float2x2(0.0f);
+  float2 v = 0.0f;
+  float const x_35 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_37 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  m0 = float2x2(float2(x_35, -0.540302277f), float2(0.540302277f, x_37));
+  float2x2 const x_41 = m0;
+  float2x2 const x_42 = m0;
+  m1 = (x_41 * x_42);
+  float const x_45 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float2x2 const x_47 = m1;
+  v = (float2(x_45, x_45) * x_47);
+  float const x_50 = v.x;
+  float const x_52 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_50 < x_52)) {
+    float const x_58 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    float const x_60 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    float const x_62 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    float const x_64 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    *(tint_symbol_4) = float4(x_58, x_60, x_62, x_64);
+  } else {
+    float const x_67 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    *(tint_symbol_4) = float4(x_67, x_67, x_67, x_67);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matrix-square-mul-with-vector/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-matrix-square-mul-with-vector/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..a34f056
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matrix-square-mul-with-vector/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,129 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 83
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %m0 "m0"
+               OpName %m1 "m1"
+               OpName %v "v"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %11 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %11
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %11
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%mat2v2float = OpTypeMatrix %v2float 2
+%_ptr_Function_mat2v2float = OpTypePointer Function %mat2v2float
+         %22 = OpConstantNull %mat2v2float
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %26 = OpConstantNull %v2float
+     %uint_0 = OpConstant %uint 0
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%float_n0_540302277 = OpConstant %float -0.540302277
+%float_0_540302277 = OpConstant %float 0.540302277
+%_ptr_Function_float = OpTypePointer Function %float
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %71 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+         %m0 = OpVariable %_ptr_Function_mat2v2float Function %22
+         %m1 = OpVariable %_ptr_Function_mat2v2float Function %22
+          %v = OpVariable %_ptr_Function_v2float Function %26
+         %31 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %32 = OpLoad %float %31
+         %33 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %34 = OpLoad %float %33
+         %36 = OpCompositeConstruct %v2float %32 %float_n0_540302277
+         %38 = OpCompositeConstruct %v2float %float_0_540302277 %34
+         %39 = OpCompositeConstruct %mat2v2float %36 %38
+               OpStore %m0 %39
+         %40 = OpLoad %mat2v2float %m0
+         %41 = OpLoad %mat2v2float %m0
+         %42 = OpMatrixTimesMatrix %mat2v2float %40 %41
+               OpStore %m1 %42
+         %43 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %44 = OpLoad %float %43
+         %45 = OpLoad %mat2v2float %m1
+         %46 = OpCompositeConstruct %v2float %44 %44
+         %47 = OpVectorTimesMatrix %v2float %46 %45
+               OpStore %v %47
+         %49 = OpAccessChain %_ptr_Function_float %v %uint_0
+         %50 = OpLoad %float %49
+         %51 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %52 = OpLoad %float %51
+         %53 = OpFOrdLessThan %bool %50 %52
+               OpSelectionMerge %55 None
+               OpBranchConditional %53 %56 %57
+         %56 = OpLabel
+         %58 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %59 = OpLoad %float %58
+         %61 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %62 = OpLoad %float %61
+         %63 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %64 = OpLoad %float %63
+         %65 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %66 = OpLoad %float %65
+         %67 = OpCompositeConstruct %v4float %59 %62 %64 %66
+               OpStore %x_GLF_color %67
+               OpBranch %55
+         %57 = OpLabel
+         %68 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %69 = OpLoad %float %68
+         %70 = OpCompositeConstruct %v4float %69 %69 %69 %69
+               OpStore %x_GLF_color %70
+               OpBranch %55
+         %55 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %71
+%tint_symbol = OpFunctionParameter %main_out
+         %75 = OpLabel
+         %76 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %76
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %78 = OpLabel
+         %79 = OpFunctionCall %void %main_1
+         %81 = OpLoad %v4float %x_GLF_color
+         %82 = OpCompositeConstruct %main_out %81
+         %80 = OpFunctionCall %void %tint_symbol_2 %82
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matrix-square-mul-with-vector/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-matrix-square-mul-with-vector/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..eff2ddf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matrix-square-mul-with-vector/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,49 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m0 : mat2x2<f32>;
+  var m1 : mat2x2<f32>;
+  var v : vec2<f32>;
+  let x_35 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_37 : f32 = x_6.x_GLF_uniform_float_values[0];
+  m0 = mat2x2<f32>(vec2<f32>(x_35, -0.540302277), vec2<f32>(0.540302277, x_37));
+  let x_41 : mat2x2<f32> = m0;
+  let x_42 : mat2x2<f32> = m0;
+  m1 = (x_41 * x_42);
+  let x_45 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_47 : mat2x2<f32> = m1;
+  v = (vec2<f32>(x_45, x_45) * x_47);
+  let x_50 : f32 = v.x;
+  let x_52 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if ((x_50 < x_52)) {
+    let x_58 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_60 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_62 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_64 : f32 = x_6.x_GLF_uniform_float_values[0];
+    x_GLF_color = vec4<f32>(x_58, x_60, x_62, x_64);
+  } else {
+    let x_67 : f32 = x_6.x_GLF_uniform_float_values[1];
+    x_GLF_color = vec4<f32>(x_67, x_67, x_67, x_67);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matrix-square-mul-with-vector/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-matrix-square-mul-with-vector/0-opt.wgsl
new file mode 100644
index 0000000..eff2ddf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matrix-square-mul-with-vector/0-opt.wgsl
@@ -0,0 +1,49 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m0 : mat2x2<f32>;
+  var m1 : mat2x2<f32>;
+  var v : vec2<f32>;
+  let x_35 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_37 : f32 = x_6.x_GLF_uniform_float_values[0];
+  m0 = mat2x2<f32>(vec2<f32>(x_35, -0.540302277), vec2<f32>(0.540302277, x_37));
+  let x_41 : mat2x2<f32> = m0;
+  let x_42 : mat2x2<f32> = m0;
+  m1 = (x_41 * x_42);
+  let x_45 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_47 : mat2x2<f32> = m1;
+  v = (vec2<f32>(x_45, x_45) * x_47);
+  let x_50 : f32 = v.x;
+  let x_52 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if ((x_50 < x_52)) {
+    let x_58 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_60 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_62 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_64 : f32 = x_6.x_GLF_uniform_float_values[0];
+    x_GLF_color = vec4<f32>(x_58, x_60, x_62, x_64);
+  } else {
+    let x_67 : f32 = x_6.x_GLF_uniform_float_values[1];
+    x_GLF_color = vec4<f32>(x_67, x_67, x_67, x_67);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matrix-square-mul-with-vector/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-matrix-square-mul-with-vector/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..da225ef
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matrix-square-mul-with-vector/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,49 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2x2 m0 = float2x2(0.0f, 0.0f, 0.0f, 0.0f);
+  float2x2 m1 = float2x2(0.0f, 0.0f, 0.0f, 0.0f);
+  float2 v = float2(0.0f, 0.0f);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_35 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_37 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  m0 = float2x2(float2(x_35, -0.540302277f), float2(0.540302277f, x_37));
+  m1 = mul(m0, m0);
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const float x_45 = asfloat(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  v = mul(m1, float2(x_45, x_45));
+  const float x_50 = v.x;
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const float x_52 = asfloat(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  if ((x_50 < x_52)) {
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const float x_58 = asfloat(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const float x_60 = asfloat(x_6[1].x);
+    const float x_62 = asfloat(x_6[1].x);
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const float x_64 = asfloat(x_6[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    x_GLF_color = float4(x_58, x_60, x_62, x_64);
+  } else {
+    const float x_67 = asfloat(x_6[1].x);
+    x_GLF_color = float4(x_67, x_67, x_67, x_67);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matrix-square-mul-with-vector/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-matrix-square-mul-with-vector/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..ee86a7c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matrix-square-mul-with-vector/0-opt.wgsl.expected.msl
@@ -0,0 +1,56 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float2x2 m0 = float2x2(0.0f);
+  float2x2 m1 = float2x2(0.0f);
+  float2 v = 0.0f;
+  float const x_35 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_37 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  m0 = float2x2(float2(x_35, -0.540302277f), float2(0.540302277f, x_37));
+  float2x2 const x_41 = m0;
+  float2x2 const x_42 = m0;
+  m1 = (x_41 * x_42);
+  float const x_45 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float2x2 const x_47 = m1;
+  v = (float2(x_45, x_45) * x_47);
+  float const x_50 = v.x;
+  float const x_52 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_50 < x_52)) {
+    float const x_58 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    float const x_60 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    float const x_62 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    float const x_64 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    *(tint_symbol_4) = float4(x_58, x_60, x_62, x_64);
+  } else {
+    float const x_67 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    *(tint_symbol_4) = float4(x_67, x_67, x_67, x_67);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matrix-square-mul-with-vector/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-matrix-square-mul-with-vector/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..a34f056
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matrix-square-mul-with-vector/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,129 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 83
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %m0 "m0"
+               OpName %m1 "m1"
+               OpName %v "v"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %11 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %11
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %11
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%mat2v2float = OpTypeMatrix %v2float 2
+%_ptr_Function_mat2v2float = OpTypePointer Function %mat2v2float
+         %22 = OpConstantNull %mat2v2float
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %26 = OpConstantNull %v2float
+     %uint_0 = OpConstant %uint 0
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%float_n0_540302277 = OpConstant %float -0.540302277
+%float_0_540302277 = OpConstant %float 0.540302277
+%_ptr_Function_float = OpTypePointer Function %float
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %71 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+         %m0 = OpVariable %_ptr_Function_mat2v2float Function %22
+         %m1 = OpVariable %_ptr_Function_mat2v2float Function %22
+          %v = OpVariable %_ptr_Function_v2float Function %26
+         %31 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %32 = OpLoad %float %31
+         %33 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %34 = OpLoad %float %33
+         %36 = OpCompositeConstruct %v2float %32 %float_n0_540302277
+         %38 = OpCompositeConstruct %v2float %float_0_540302277 %34
+         %39 = OpCompositeConstruct %mat2v2float %36 %38
+               OpStore %m0 %39
+         %40 = OpLoad %mat2v2float %m0
+         %41 = OpLoad %mat2v2float %m0
+         %42 = OpMatrixTimesMatrix %mat2v2float %40 %41
+               OpStore %m1 %42
+         %43 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %44 = OpLoad %float %43
+         %45 = OpLoad %mat2v2float %m1
+         %46 = OpCompositeConstruct %v2float %44 %44
+         %47 = OpVectorTimesMatrix %v2float %46 %45
+               OpStore %v %47
+         %49 = OpAccessChain %_ptr_Function_float %v %uint_0
+         %50 = OpLoad %float %49
+         %51 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %52 = OpLoad %float %51
+         %53 = OpFOrdLessThan %bool %50 %52
+               OpSelectionMerge %55 None
+               OpBranchConditional %53 %56 %57
+         %56 = OpLabel
+         %58 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %59 = OpLoad %float %58
+         %61 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %62 = OpLoad %float %61
+         %63 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %64 = OpLoad %float %63
+         %65 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %66 = OpLoad %float %65
+         %67 = OpCompositeConstruct %v4float %59 %62 %64 %66
+               OpStore %x_GLF_color %67
+               OpBranch %55
+         %57 = OpLabel
+         %68 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %69 = OpLoad %float %68
+         %70 = OpCompositeConstruct %v4float %69 %69 %69 %69
+               OpStore %x_GLF_color %70
+               OpBranch %55
+         %55 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %71
+%tint_symbol = OpFunctionParameter %main_out
+         %75 = OpLabel
+         %76 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %76
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %78 = OpLabel
+         %79 = OpFunctionCall %void %main_1
+         %81 = OpLoad %v4float %x_GLF_color
+         %82 = OpCompositeConstruct %main_out %81
+         %80 = OpFunctionCall %void %tint_symbol_2 %82
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matrix-square-mul-with-vector/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-matrix-square-mul-with-vector/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..eff2ddf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-matrix-square-mul-with-vector/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,49 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m0 : mat2x2<f32>;
+  var m1 : mat2x2<f32>;
+  var v : vec2<f32>;
+  let x_35 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_37 : f32 = x_6.x_GLF_uniform_float_values[0];
+  m0 = mat2x2<f32>(vec2<f32>(x_35, -0.540302277), vec2<f32>(0.540302277, x_37));
+  let x_41 : mat2x2<f32> = m0;
+  let x_42 : mat2x2<f32> = m0;
+  m1 = (x_41 * x_42);
+  let x_45 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_47 : mat2x2<f32> = m1;
+  v = (vec2<f32>(x_45, x_45) * x_47);
+  let x_50 : f32 = v.x;
+  let x_52 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if ((x_50 < x_52)) {
+    let x_58 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_60 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_62 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_64 : f32 = x_6.x_GLF_uniform_float_values[0];
+    x_GLF_color = vec4<f32>(x_58, x_60, x_62, x_64);
+  } else {
+    let x_67 : f32 = x_6.x_GLF_uniform_float_values[1];
+    x_GLF_color = vec4<f32>(x_67, x_67, x_67, x_67);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-max-clamp-same-minval/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-max-clamp-same-minval/0-opt.spvasm
new file mode 100644
index 0000000..a933536
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-max-clamp-same-minval/0-opt.spvasm
@@ -0,0 +1,56 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %19 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %20 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+       %main = OpFunction %void None %7
+         %21 = OpLabel
+         %22 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %23 = OpLoad %int %22
+         %24 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %25 = OpLoad %int %24
+         %26 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %27 = OpLoad %int %26
+         %28 = OpExtInst %int %1 SClamp %25 %27 %int_1
+         %29 = OpExtInst %int %1 SMax %23 %28
+         %30 = OpIEqual %bool %29 %int_1
+               OpSelectionMerge %31 None
+               OpBranchConditional %30 %32 %33
+         %32 = OpLabel
+               OpStore %_GLF_color %19
+               OpBranch %31
+         %33 = OpLabel
+               OpStore %_GLF_color %20
+               OpBranch %31
+         %31 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-max-clamp-same-minval/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-max-clamp-same-minval/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..60ded1e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-max-clamp-same-minval/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,30 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const int x_23 = asint(x_5[0].x);
+  const int x_25 = asint(x_5[0].x);
+  const int x_27 = asint(x_5[0].x);
+  if ((max(x_23, clamp(x_25, x_27, 1)) == 1)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-max-clamp-same-minval/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-max-clamp-same-minval/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..dba1366
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-max-clamp-same-minval/0-opt.spvasm.expected.msl
@@ -0,0 +1,33 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  int const x_23 = x_5.one;
+  int const x_25 = x_5.one;
+  int const x_27 = x_5.one;
+  if ((max(x_23, clamp(x_25, x_27, 1)) == 1)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-max-clamp-same-minval/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-max-clamp-same-minval/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..329e139
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-max-clamp-same-minval/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,89 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 50
+; Schema: 0
+               OpCapability Shader
+         %26 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %36 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %37 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+         %38 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+         %19 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0
+         %20 = OpLoad %int %19
+         %21 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0
+         %22 = OpLoad %int %21
+         %23 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0
+         %24 = OpLoad %int %23
+         %27 = OpExtInst %int %26 SClamp %22 %24 %int_1
+         %25 = OpExtInst %int %26 SMax %20 %27
+         %29 = OpIEqual %bool %25 %int_1
+               OpSelectionMerge %31 None
+               OpBranchConditional %29 %32 %33
+         %32 = OpLabel
+               OpStore %x_GLF_color %36
+               OpBranch %31
+         %33 = OpLabel
+               OpStore %x_GLF_color %37
+               OpBranch %31
+         %31 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %38
+%tint_symbol = OpFunctionParameter %main_out
+         %42 = OpLabel
+         %43 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %43
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %45 = OpLabel
+         %46 = OpFunctionCall %void %main_1
+         %48 = OpLoad %v4float %x_GLF_color
+         %49 = OpCompositeConstruct %main_out %48
+         %47 = OpFunctionCall %void %tint_symbol_2 %49
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-max-clamp-same-minval/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-max-clamp-same-minval/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..ae45234
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-max-clamp-same-minval/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,31 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_23 : i32 = x_5.one;
+  let x_25 : i32 = x_5.one;
+  let x_27 : i32 = x_5.one;
+  if ((max(x_23, clamp(x_25, x_27, 1)) == 1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-max-clamp-same-minval/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-max-clamp-same-minval/0-opt.wgsl
new file mode 100644
index 0000000..ae45234
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-max-clamp-same-minval/0-opt.wgsl
@@ -0,0 +1,31 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_23 : i32 = x_5.one;
+  let x_25 : i32 = x_5.one;
+  let x_27 : i32 = x_5.one;
+  if ((max(x_23, clamp(x_25, x_27, 1)) == 1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-max-clamp-same-minval/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-max-clamp-same-minval/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..60ded1e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-max-clamp-same-minval/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,30 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const int x_23 = asint(x_5[0].x);
+  const int x_25 = asint(x_5[0].x);
+  const int x_27 = asint(x_5[0].x);
+  if ((max(x_23, clamp(x_25, x_27, 1)) == 1)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-max-clamp-same-minval/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-max-clamp-same-minval/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..dba1366
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-max-clamp-same-minval/0-opt.wgsl.expected.msl
@@ -0,0 +1,33 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  int const x_23 = x_5.one;
+  int const x_25 = x_5.one;
+  int const x_27 = x_5.one;
+  if ((max(x_23, clamp(x_25, x_27, 1)) == 1)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-max-clamp-same-minval/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-max-clamp-same-minval/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..329e139
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-max-clamp-same-minval/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,89 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 50
+; Schema: 0
+               OpCapability Shader
+         %26 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %36 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %37 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+         %38 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+         %19 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0
+         %20 = OpLoad %int %19
+         %21 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0
+         %22 = OpLoad %int %21
+         %23 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0
+         %24 = OpLoad %int %23
+         %27 = OpExtInst %int %26 SClamp %22 %24 %int_1
+         %25 = OpExtInst %int %26 SMax %20 %27
+         %29 = OpIEqual %bool %25 %int_1
+               OpSelectionMerge %31 None
+               OpBranchConditional %29 %32 %33
+         %32 = OpLabel
+               OpStore %x_GLF_color %36
+               OpBranch %31
+         %33 = OpLabel
+               OpStore %x_GLF_color %37
+               OpBranch %31
+         %31 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %38
+%tint_symbol = OpFunctionParameter %main_out
+         %42 = OpLabel
+         %43 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %43
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %45 = OpLabel
+         %46 = OpFunctionCall %void %main_1
+         %48 = OpLoad %v4float %x_GLF_color
+         %49 = OpCompositeConstruct %main_out %48
+         %47 = OpFunctionCall %void %tint_symbol_2 %49
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-max-clamp-same-minval/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-max-clamp-same-minval/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..ae45234
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-max-clamp-same-minval/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,31 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_23 : i32 = x_5.one;
+  let x_25 : i32 = x_5.one;
+  let x_27 : i32 = x_5.one;
+  if ((max(x_23, clamp(x_25, x_27, 1)) == 1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-max-min-less-than/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-max-min-less-than/0-opt.spvasm
new file mode 100644
index 0000000..da3347f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-max-min-less-than/0-opt.spvasm
@@ -0,0 +1,80 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %main = OpFunction %void None %10
+         %28 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+         %29 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %30 = OpLoad %float %29
+         %31 = OpConvertFToS %int %30
+         %32 = OpExtInst %int %1 SMin %int_1 %31
+         %33 = OpExtInst %int %1 SMax %int_1 %32
+               OpStore %a %33
+         %34 = OpLoad %int %a
+         %35 = OpSLessThan %bool %34 %int_2
+               OpSelectionMerge %36 None
+               OpBranchConditional %35 %37 %38
+         %37 = OpLabel
+         %39 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %40 = OpLoad %int %39
+         %41 = OpConvertSToF %float %40
+         %42 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %43 = OpLoad %int %42
+         %44 = OpConvertSToF %float %43
+         %45 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %46 = OpLoad %int %45
+         %47 = OpConvertSToF %float %46
+         %48 = OpCompositeConstruct %v4float %float_1 %41 %44 %47
+               OpStore %_GLF_color %48
+               OpBranch %36
+         %38 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %50 = OpLoad %int %49
+         %51 = OpConvertSToF %float %50
+         %52 = OpCompositeConstruct %v4float %51 %51 %51 %51
+               OpStore %_GLF_color %52
+               OpBranch %36
+         %36 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-max-min-less-than/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-max-min-less-than/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..3ad7117
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-max-min-less-than/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,43 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[2];
+};
+
+void main_1() {
+  int a = 0;
+  const float x_30 = gl_FragCoord.x;
+  a = max(1, min(1, int(x_30)));
+  if ((a < 2)) {
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_40 = asint(x_7[scalar_offset / 4][scalar_offset % 4]);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_43 = asint(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const int x_46 = asint(x_7[1].x);
+    x_GLF_color = float4(1.0f, float(x_40), float(x_43), float(x_46));
+  } else {
+    const int x_50 = asint(x_7[1].x);
+    const float x_51 = float(x_50);
+    x_GLF_color = float4(x_51, x_51, x_51, x_51);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-max-min-less-than/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-max-min-less-than/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..f106f7a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-max-min-less-than/0-opt.spvasm.expected.msl
@@ -0,0 +1,48 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int a = 0;
+  float const x_30 = (*(tint_symbol_5)).x;
+  a = max(1, min(1, int(x_30)));
+  int const x_34 = a;
+  if ((x_34 < 2)) {
+    int const x_40 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_43 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_46 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_6) = float4(1.0f, float(x_40), float(x_43), float(x_46));
+  } else {
+    int const x_50 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    float const x_51 = float(x_50);
+    *(tint_symbol_6) = float4(x_51, x_51, x_51, x_51);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_7, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-max-min-less-than/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-max-min-less-than/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..63a17ef
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-max-min-less-than/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,117 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 71
+; Schema: 0
+               OpCapability Shader
+         %30 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %24 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+         %58 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %18
+         %21 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %24
+         %27 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %28 = OpLoad %float %27
+         %33 = OpConvertFToS %int %28
+         %32 = OpExtInst %int %30 SMin %int_1 %33
+         %29 = OpExtInst %int %30 SMax %int_1 %32
+               OpStore %a %29
+         %34 = OpLoad %int %a
+         %36 = OpSLessThan %bool %34 %int_2
+               OpSelectionMerge %38 None
+               OpBranchConditional %36 %39 %40
+         %39 = OpLabel
+         %43 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %44 = OpLoad %int %43
+         %45 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %46 = OpLoad %int %45
+         %47 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %48 = OpLoad %int %47
+         %50 = OpConvertSToF %float %44
+         %51 = OpConvertSToF %float %46
+         %52 = OpConvertSToF %float %48
+         %53 = OpCompositeConstruct %v4float %float_1 %50 %51 %52
+               OpStore %x_GLF_color %53
+               OpBranch %38
+         %40 = OpLabel
+         %54 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %55 = OpLoad %int %54
+         %56 = OpConvertSToF %float %55
+         %57 = OpCompositeConstruct %v4float %56 %56 %56 %56
+               OpStore %x_GLF_color %57
+               OpBranch %38
+         %38 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %58
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %62 = OpLabel
+         %63 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %63
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %18
+         %65 = OpLabel
+         %66 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %66
+         %67 = OpFunctionCall %void %main_1
+         %69 = OpLoad %v4float %x_GLF_color
+         %70 = OpCompositeConstruct %main_out %69
+         %68 = OpFunctionCall %void %tint_symbol_3 %70
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-max-min-less-than/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-max-min-less-than/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..24c7553
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-max-min-less-than/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,42 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+fn main_1() {
+  var a : i32;
+  let x_30 : f32 = gl_FragCoord.x;
+  a = max(1, min(1, i32(x_30)));
+  let x_34 : i32 = a;
+  if ((x_34 < 2)) {
+    let x_40 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_43 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_46 : i32 = x_7.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(1.0, f32(x_40), f32(x_43), f32(x_46));
+  } else {
+    let x_50 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_51 : f32 = f32(x_50);
+    x_GLF_color = vec4<f32>(x_51, x_51, x_51, x_51);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-max-min-less-than/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-max-min-less-than/0-opt.wgsl
new file mode 100644
index 0000000..24c7553
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-max-min-less-than/0-opt.wgsl
@@ -0,0 +1,42 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+fn main_1() {
+  var a : i32;
+  let x_30 : f32 = gl_FragCoord.x;
+  a = max(1, min(1, i32(x_30)));
+  let x_34 : i32 = a;
+  if ((x_34 < 2)) {
+    let x_40 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_43 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_46 : i32 = x_7.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(1.0, f32(x_40), f32(x_43), f32(x_46));
+  } else {
+    let x_50 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_51 : f32 = f32(x_50);
+    x_GLF_color = vec4<f32>(x_51, x_51, x_51, x_51);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-max-min-less-than/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-max-min-less-than/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..3ad7117
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-max-min-less-than/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,43 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[2];
+};
+
+void main_1() {
+  int a = 0;
+  const float x_30 = gl_FragCoord.x;
+  a = max(1, min(1, int(x_30)));
+  if ((a < 2)) {
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_40 = asint(x_7[scalar_offset / 4][scalar_offset % 4]);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_43 = asint(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const int x_46 = asint(x_7[1].x);
+    x_GLF_color = float4(1.0f, float(x_40), float(x_43), float(x_46));
+  } else {
+    const int x_50 = asint(x_7[1].x);
+    const float x_51 = float(x_50);
+    x_GLF_color = float4(x_51, x_51, x_51, x_51);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-max-min-less-than/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-max-min-less-than/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..f106f7a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-max-min-less-than/0-opt.wgsl.expected.msl
@@ -0,0 +1,48 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int a = 0;
+  float const x_30 = (*(tint_symbol_5)).x;
+  a = max(1, min(1, int(x_30)));
+  int const x_34 = a;
+  if ((x_34 < 2)) {
+    int const x_40 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_43 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_46 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_6) = float4(1.0f, float(x_40), float(x_43), float(x_46));
+  } else {
+    int const x_50 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    float const x_51 = float(x_50);
+    *(tint_symbol_6) = float4(x_51, x_51, x_51, x_51);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_7, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-max-min-less-than/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-max-min-less-than/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..63a17ef
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-max-min-less-than/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,117 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 71
+; Schema: 0
+               OpCapability Shader
+         %30 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %24 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+         %58 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %18
+         %21 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %24
+         %27 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %28 = OpLoad %float %27
+         %33 = OpConvertFToS %int %28
+         %32 = OpExtInst %int %30 SMin %int_1 %33
+         %29 = OpExtInst %int %30 SMax %int_1 %32
+               OpStore %a %29
+         %34 = OpLoad %int %a
+         %36 = OpSLessThan %bool %34 %int_2
+               OpSelectionMerge %38 None
+               OpBranchConditional %36 %39 %40
+         %39 = OpLabel
+         %43 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %44 = OpLoad %int %43
+         %45 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %46 = OpLoad %int %45
+         %47 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %48 = OpLoad %int %47
+         %50 = OpConvertSToF %float %44
+         %51 = OpConvertSToF %float %46
+         %52 = OpConvertSToF %float %48
+         %53 = OpCompositeConstruct %v4float %float_1 %50 %51 %52
+               OpStore %x_GLF_color %53
+               OpBranch %38
+         %40 = OpLabel
+         %54 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %55 = OpLoad %int %54
+         %56 = OpConvertSToF %float %55
+         %57 = OpCompositeConstruct %v4float %56 %56 %56 %56
+               OpStore %x_GLF_color %57
+               OpBranch %38
+         %38 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %58
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %62 = OpLabel
+         %63 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %63
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %18
+         %65 = OpLabel
+         %66 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %66
+         %67 = OpFunctionCall %void %main_1
+         %69 = OpLoad %v4float %x_GLF_color
+         %70 = OpCompositeConstruct %main_out %69
+         %68 = OpFunctionCall %void %tint_symbol_3 %70
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-max-min-less-than/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-max-min-less-than/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..24c7553
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-max-min-less-than/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,42 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+fn main_1() {
+  var a : i32;
+  let x_30 : f32 = gl_FragCoord.x;
+  a = max(1, min(1, i32(x_30)));
+  let x_34 : i32 = a;
+  if ((x_34 < 2)) {
+    let x_40 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_43 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_46 : i32 = x_7.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(1.0, f32(x_40), f32(x_43), f32(x_46));
+  } else {
+    let x_50 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_51 : f32 = f32(x_50);
+    x_GLF_color = vec4<f32>(x_51, x_51, x_51, x_51);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-sum-struct-members/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-sum-struct-members/0-opt.spvasm
new file mode 100644
index 0000000..5006192
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-sum-struct-members/0-opt.spvasm
@@ -0,0 +1,196 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %S "S"
+               OpMemberName %S 0 "a"
+               OpMemberName %S 1 "b"
+               OpMemberName %S 2 "c"
+               OpName %func_struct_S_i1_i1_i11_i1_ "func(struct-S-i1-i1-i11;i1;"
+               OpName %s "s"
+               OpName %x "x"
+               OpName %arr "arr"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+          %S = OpTypeStruct %int %int %int
+%_ptr_Function_S = OpTypePointer Function %S
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpTypeFunction %int %_ptr_Function_S %_ptr_Function_int
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+      %int_9 = OpConstant %int 9
+      %int_1 = OpConstant %int 1
+      %int_7 = OpConstant %int 7
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_S_uint_2 = OpTypeArray %S %uint_2
+%_ptr_Function__arr_S_uint_2 = OpTypePointer Function %_arr_S_uint_2
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %35 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+     %int_12 = OpConstant %int 12
+    %float_1 = OpConstant %float 1
+         %38 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %false = OpConstantFalse %bool
+%_ptr_Function_bool = OpTypePointer Function %bool
+       %true = OpConstantTrue %bool
+       %main = OpFunction %void None %14
+         %42 = OpLabel
+         %43 = OpVariable %_ptr_Function_int Function
+         %44 = OpVariable %_ptr_Function_bool Function %false
+        %arr = OpVariable %_ptr_Function__arr_S_uint_2 Function
+      %param = OpVariable %_ptr_Function_S Function
+    %param_0 = OpVariable %_ptr_Function_int Function
+               OpBranch %45
+         %45 = OpLabel
+               OpLoopMerge %46 %47 None
+               OpBranch %48
+         %48 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %50 = OpLoad %int %49
+         %51 = OpAccessChain %_ptr_Function_int %arr %50 %int_0
+               OpStore %51 %int_2
+         %52 = OpAccessChain %_ptr_Function_int %arr %int_1 %int_0
+         %53 = OpLoad %int %52
+         %54 = OpSLessThan %bool %53 %int_1
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %57
+         %56 = OpLabel
+               OpStore %_GLF_color %35
+               OpStore %44 %true
+               OpBranch %46
+         %57 = OpLabel
+         %58 = OpIAdd %int %int_2 %50
+         %59 = OpAccessChain %_ptr_Function_S %arr %int_1
+         %60 = OpLoad %S %59
+               OpStore %param %60
+               OpStore %param_0 %58
+         %61 = OpLoad %int %param_0
+         %62 = OpAccessChain %_ptr_Function_int %param %int_0
+         %63 = OpLoad %S %param
+         %64 = OpCompositeInsert %S %61 %63 0
+               OpStore %param %64
+         %65 = OpLoad %S %param
+         %66 = OpCompositeExtract %int %65 0
+         %67 = OpIEqual %bool %66 %int_2
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %68
+         %69 = OpLabel
+         %70 = OpLoad %S %param
+         %71 = OpCompositeInsert %S %int_9 %70 0
+               OpStore %param %71
+               OpBranch %68
+         %68 = OpLabel
+         %72 = OpLoad %int %param_0
+         %73 = OpIAdd %int %72 %int_1
+         %74 = OpAccessChain %_ptr_Function_int %param %int_1
+         %75 = OpLoad %S %param
+         %76 = OpCompositeInsert %S %73 %75 1
+               OpStore %param %76
+         %77 = OpLoad %int %param_0
+         %78 = OpIAdd %int %77 %int_2
+         %79 = OpAccessChain %_ptr_Function_int %param %int_2
+         %80 = OpLoad %S %param
+         %81 = OpCompositeInsert %S %78 %80 2
+               OpStore %param %81
+         %82 = OpLoad %S %param
+         %83 = OpCompositeExtract %int %82 1
+         %84 = OpIEqual %bool %83 %int_2
+               OpSelectionMerge %85 None
+               OpBranchConditional %84 %86 %85
+         %86 = OpLabel
+         %87 = OpLoad %S %param
+         %88 = OpCompositeInsert %S %int_7 %87 1
+               OpStore %param %88
+               OpBranch %85
+         %85 = OpLabel
+         %89 = OpLoad %S %param
+         %90 = OpCompositeExtract %int %89 0
+         %91 = OpLoad %S %param
+         %92 = OpCompositeExtract %int %91 1
+         %93 = OpIAdd %int %90 %92
+         %94 = OpLoad %S %param
+         %95 = OpCompositeExtract %int %94 2
+         %96 = OpIAdd %int %93 %95
+               OpStore %43 %96
+         %97 = OpLoad %int %43
+         %98 = OpIEqual %bool %97 %int_12
+               OpSelectionMerge %99 None
+               OpBranchConditional %98 %100 %101
+        %100 = OpLabel
+               OpStore %_GLF_color %38
+               OpBranch %99
+        %101 = OpLabel
+               OpStore %_GLF_color %35
+               OpBranch %99
+         %99 = OpLabel
+               OpBranch %55
+         %55 = OpLabel
+               OpStore %44 %true
+               OpBranch %46
+         %47 = OpLabel
+               OpBranch %45
+         %46 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%func_struct_S_i1_i1_i11_i1_ = OpFunction %int None %18
+          %s = OpFunctionParameter %_ptr_Function_S
+          %x = OpFunctionParameter %_ptr_Function_int
+        %102 = OpLabel
+        %103 = OpLoad %int %x
+        %104 = OpAccessChain %_ptr_Function_int %s %int_0
+               OpStore %104 %103
+        %105 = OpLoad %int %104
+        %106 = OpIEqual %bool %105 %int_2
+               OpSelectionMerge %107 None
+               OpBranchConditional %106 %108 %107
+        %108 = OpLabel
+               OpStore %104 %int_9
+               OpBranch %107
+        %107 = OpLabel
+        %109 = OpLoad %int %x
+        %110 = OpIAdd %int %109 %int_1
+        %111 = OpAccessChain %_ptr_Function_int %s %int_1
+               OpStore %111 %110
+        %112 = OpLoad %int %x
+        %113 = OpIAdd %int %112 %int_2
+        %114 = OpAccessChain %_ptr_Function_int %s %int_2
+               OpStore %114 %113
+        %115 = OpLoad %int %111
+        %116 = OpIEqual %bool %115 %int_2
+               OpSelectionMerge %117 None
+               OpBranchConditional %116 %118 %117
+        %118 = OpLabel
+               OpStore %111 %int_7
+               OpBranch %117
+        %117 = OpLabel
+        %119 = OpLoad %int %104
+        %120 = OpLoad %int %111
+        %121 = OpIAdd %int %119 %120
+        %122 = OpLoad %int %114
+        %123 = OpIAdd %int %121 %122
+               OpReturnValue %123
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-sum-struct-members/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-sum-struct-members/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..9efb42d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-sum-struct-members/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,99 @@
+struct S {
+  int a;
+  int b;
+  int c;
+};
+
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int x_43 = 0;
+  bool x_44 = false;
+  S arr[2] = (S[2])0;
+  S param = (S)0;
+  int param_1 = 0;
+  while (true) {
+    int x_50 = 0;
+    x_50 = asint(x_10[0].x);
+    arr[x_50].a = 2;
+    const int x_53 = arr[1].a;
+    if ((x_53 < 1)) {
+      x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+      x_44 = true;
+      break;
+    } else {
+      const S x_60 = arr[1];
+      param = x_60;
+      param_1 = (2 + asint(x_50));
+      const int x_61 = param_1;
+      S x_64_1 = param;
+      x_64_1.a = x_61;
+      param = x_64_1;
+      if ((param.a == 2)) {
+        S x_71_1 = param;
+        x_71_1.a = 9;
+        param = x_71_1;
+      }
+      const int x_72 = param_1;
+      S x_76_1 = param;
+      x_76_1.b = (x_72 + 1);
+      param = x_76_1;
+      const int x_77 = param_1;
+      S x_81_1 = param;
+      x_81_1.c = (x_77 + 2);
+      param = x_81_1;
+      if ((param.b == 2)) {
+        S x_88_1 = param;
+        x_88_1.b = 7;
+        param = x_88_1;
+      }
+      x_43 = ((param.a + param.b) + param.c);
+      if ((x_43 == 12)) {
+        x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+      } else {
+        x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+      }
+    }
+    x_44 = true;
+    break;
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
+int func_struct_S_i1_i1_i11_i1_(inout S s, inout int x) {
+  const int x_103 = x;
+  s.a = x_103;
+  const int x_105 = s.a;
+  if ((x_105 == 2)) {
+    s.a = 9;
+  }
+  const int x_109 = x;
+  s.b = (x_109 + 1);
+  const int x_112 = x;
+  s.c = (x_112 + 2);
+  const int x_115 = s.b;
+  if ((x_115 == 2)) {
+    s.b = 7;
+  }
+  const int x_119 = s.a;
+  const int x_120 = s.b;
+  const int x_122 = s.c;
+  return ((x_119 + x_120) + x_122);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-sum-struct-members/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-sum-struct-members/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..91c59ac
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-sum-struct-members/0-opt.spvasm.expected.msl
@@ -0,0 +1,120 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  int a;
+  int b;
+  int c;
+};
+struct buf0 {
+  /* 0x0000 */ int one;
+};
+struct tint_array_wrapper {
+  S arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_10, thread float4* const tint_symbol_4) {
+  int x_43 = 0;
+  bool x_44 = false;
+  tint_array_wrapper arr = {};
+  S param = {};
+  int param_1 = 0;
+  while (true) {
+    int x_50 = 0;
+    x_50 = x_10.one;
+    arr.arr[x_50].a = 2;
+    int const x_53 = arr.arr[1].a;
+    if ((x_53 < 1)) {
+      *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+      x_44 = true;
+      break;
+    } else {
+      S const x_60 = arr.arr[1];
+      param = x_60;
+      param_1 = (2 + as_type<int>(x_50));
+      int const x_61 = param_1;
+      S const x_63 = param;
+      S x_64_1 = x_63;
+      x_64_1.a = x_61;
+      S const x_64 = x_64_1;
+      param = x_64;
+      S const x_65 = param;
+      if ((x_65.a == 2)) {
+        S const x_70 = param;
+        S x_71_1 = x_70;
+        x_71_1.a = 9;
+        S const x_71 = x_71_1;
+        param = x_71;
+      }
+      int const x_72 = param_1;
+      S const x_75 = param;
+      S x_76_1 = x_75;
+      x_76_1.b = (x_72 + 1);
+      S const x_76 = x_76_1;
+      param = x_76;
+      int const x_77 = param_1;
+      S const x_80 = param;
+      S x_81_1 = x_80;
+      x_81_1.c = (x_77 + 2);
+      S const x_81 = x_81_1;
+      param = x_81;
+      S const x_82 = param;
+      if ((x_82.b == 2)) {
+        S const x_87 = param;
+        S x_88_1 = x_87;
+        x_88_1.b = 7;
+        S const x_88 = x_88_1;
+        param = x_88;
+      }
+      S const x_89 = param;
+      S const x_91 = param;
+      S const x_94 = param;
+      x_43 = ((x_89.a + x_91.b) + x_94.c);
+      int const x_97 = x_43;
+      if ((x_97 == 12)) {
+        *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+      } else {
+        *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+      }
+    }
+    x_44 = true;
+    break;
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_10 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
+int func_struct_S_i1_i1_i11_i1_(thread S* const s, thread int* const x) {
+  int const x_103 = *(x);
+  (*(s)).a = x_103;
+  int const x_105 = (*(s)).a;
+  if ((x_105 == 2)) {
+    (*(s)).a = 9;
+  }
+  int const x_109 = *(x);
+  (*(s)).b = (x_109 + 1);
+  int const x_112 = *(x);
+  (*(s)).c = (x_112 + 2);
+  int const x_115 = (*(s)).b;
+  if ((x_115 == 2)) {
+    (*(s)).b = 7;
+  }
+  int const x_119 = (*(s)).a;
+  int const x_120 = (*(s)).b;
+  int const x_122 = (*(s)).c;
+  return ((x_119 + x_120) + x_122);
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-sum-struct-members/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-sum-struct-members/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..16fa1d7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-sum-struct-members/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,274 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 174
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_43 "x_43"
+               OpName %x_44 "x_44"
+               OpName %S "S"
+               OpMemberName %S 0 "a"
+               OpMemberName %S 1 "b"
+               OpMemberName %S 2 "c"
+               OpName %arr "arr"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %x_50 "x_50"
+               OpName %x_64_1 "x_64_1"
+               OpName %x_71_1 "x_71_1"
+               OpName %x_76_1 "x_76_1"
+               OpName %x_81_1 "x_81_1"
+               OpName %x_88_1 "x_88_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpName %func_struct_S_i1_i1_i11_i1_ "func_struct_S_i1_i1_i11_i1_"
+               OpName %s "s"
+               OpName %x "x"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %S 0 Offset 0
+               OpMemberDecorate %S 1 Offset 4
+               OpMemberDecorate %S 2 Offset 8
+               OpDecorate %_arr_S_uint_2 ArrayStride 12
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %23 = OpConstantNull %bool
+          %S = OpTypeStruct %int %int %int
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_S_uint_2 = OpTypeArray %S %uint_2
+%_ptr_Function__arr_S_uint_2 = OpTypePointer Function %_arr_S_uint_2
+         %30 = OpConstantNull %_arr_S_uint_2
+%_ptr_Function_S = OpTypePointer Function %S
+         %33 = OpConstantNull %S
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+         %55 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %true = OpConstantTrue %bool
+      %int_9 = OpConstant %int 9
+     %uint_1 = OpConstant %uint 1
+      %int_7 = OpConstant %int 7
+     %int_12 = OpConstant %int 12
+    %float_1 = OpConstant %float 1
+        %115 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %116 = OpTypeFunction %void %main_out
+        %128 = OpTypeFunction %int %_ptr_Function_S %_ptr_Function_int
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+       %x_43 = OpVariable %_ptr_Function_int Function %18
+       %x_44 = OpVariable %_ptr_Function_bool Function %23
+        %arr = OpVariable %_ptr_Function__arr_S_uint_2 Function %30
+      %param = OpVariable %_ptr_Function_S Function %33
+    %param_1 = OpVariable %_ptr_Function_int Function %18
+       %x_50 = OpVariable %_ptr_Function_int Function %18
+     %x_64_1 = OpVariable %_ptr_Function_S Function %33
+     %x_71_1 = OpVariable %_ptr_Function_S Function %33
+     %x_76_1 = OpVariable %_ptr_Function_S Function %33
+     %x_81_1 = OpVariable %_ptr_Function_S Function %33
+     %x_88_1 = OpVariable %_ptr_Function_S Function %33
+               OpStore %x_44 %false
+               OpBranch %35
+         %35 = OpLabel
+               OpLoopMerge %36 %37 None
+               OpBranch %38
+         %38 = OpLabel
+         %42 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0
+         %43 = OpLoad %int %42
+               OpStore %x_50 %43
+         %44 = OpLoad %int %x_50
+         %45 = OpAccessChain %_ptr_Function_int %arr %44 %uint_0
+               OpStore %45 %int_2
+         %48 = OpAccessChain %_ptr_Function_int %arr %int_1 %uint_0
+         %49 = OpLoad %int %48
+         %50 = OpSLessThan %bool %49 %int_1
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %53
+         %52 = OpLabel
+               OpStore %x_GLF_color %55
+               OpStore %x_44 %true
+               OpBranch %36
+         %53 = OpLabel
+         %57 = OpAccessChain %_ptr_Function_S %arr %int_1
+         %58 = OpLoad %S %57
+               OpStore %param %58
+         %60 = OpLoad %int %x_50
+         %59 = OpCopyObject %int %60
+         %61 = OpIAdd %int %int_2 %59
+               OpStore %param_1 %61
+         %62 = OpLoad %int %param_1
+         %63 = OpLoad %S %param
+               OpStore %x_64_1 %63
+         %65 = OpAccessChain %_ptr_Function_int %x_64_1 %uint_0
+               OpStore %65 %62
+         %66 = OpLoad %S %x_64_1
+               OpStore %param %66
+         %67 = OpLoad %S %param
+         %68 = OpCompositeExtract %int %67 0
+         %69 = OpIEqual %bool %68 %int_2
+               OpSelectionMerge %70 None
+               OpBranchConditional %69 %71 %70
+         %71 = OpLabel
+         %72 = OpLoad %S %param
+               OpStore %x_71_1 %72
+         %74 = OpAccessChain %_ptr_Function_int %x_71_1 %uint_0
+               OpStore %74 %int_9
+         %76 = OpLoad %S %x_71_1
+               OpStore %param %76
+               OpBranch %70
+         %70 = OpLabel
+         %77 = OpLoad %int %param_1
+         %78 = OpLoad %S %param
+               OpStore %x_76_1 %78
+         %81 = OpAccessChain %_ptr_Function_int %x_76_1 %uint_1
+         %82 = OpIAdd %int %77 %int_1
+               OpStore %81 %82
+         %83 = OpLoad %S %x_76_1
+               OpStore %param %83
+         %84 = OpLoad %int %param_1
+         %85 = OpLoad %S %param
+               OpStore %x_81_1 %85
+         %87 = OpAccessChain %_ptr_Function_int %x_81_1 %uint_2
+         %88 = OpIAdd %int %84 %int_2
+               OpStore %87 %88
+         %89 = OpLoad %S %x_81_1
+               OpStore %param %89
+         %90 = OpLoad %S %param
+         %91 = OpCompositeExtract %int %90 1
+         %92 = OpIEqual %bool %91 %int_2
+               OpSelectionMerge %93 None
+               OpBranchConditional %92 %94 %93
+         %94 = OpLabel
+         %95 = OpLoad %S %param
+               OpStore %x_88_1 %95
+         %97 = OpAccessChain %_ptr_Function_int %x_88_1 %uint_1
+               OpStore %97 %int_7
+         %99 = OpLoad %S %x_88_1
+               OpStore %param %99
+               OpBranch %93
+         %93 = OpLabel
+        %100 = OpLoad %S %param
+        %101 = OpLoad %S %param
+        %102 = OpLoad %S %param
+        %103 = OpCompositeExtract %int %100 0
+        %104 = OpCompositeExtract %int %101 1
+        %105 = OpIAdd %int %103 %104
+        %106 = OpCompositeExtract %int %102 2
+        %107 = OpIAdd %int %105 %106
+               OpStore %x_43 %107
+        %108 = OpLoad %int %x_43
+        %110 = OpIEqual %bool %108 %int_12
+               OpSelectionMerge %111 None
+               OpBranchConditional %110 %112 %113
+        %112 = OpLabel
+               OpStore %x_GLF_color %115
+               OpBranch %111
+        %113 = OpLabel
+               OpStore %x_GLF_color %55
+               OpBranch %111
+        %111 = OpLabel
+               OpBranch %51
+         %51 = OpLabel
+               OpStore %x_44 %true
+               OpBranch %36
+         %37 = OpLabel
+               OpBranch %35
+         %36 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %116
+%tint_symbol = OpFunctionParameter %main_out
+        %120 = OpLabel
+        %121 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %121
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+        %123 = OpLabel
+        %124 = OpFunctionCall %void %main_1
+        %126 = OpLoad %v4float %x_GLF_color
+        %127 = OpCompositeConstruct %main_out %126
+        %125 = OpFunctionCall %void %tint_symbol_2 %127
+               OpReturn
+               OpFunctionEnd
+%func_struct_S_i1_i1_i11_i1_ = OpFunction %int None %128
+          %s = OpFunctionParameter %_ptr_Function_S
+          %x = OpFunctionParameter %_ptr_Function_int
+        %132 = OpLabel
+        %134 = OpLoad %int %x
+        %136 = OpAccessChain %_ptr_Function_int %s %uint_0
+               OpStore %136 %134
+        %138 = OpAccessChain %_ptr_Function_int %s %uint_0
+        %139 = OpLoad %int %138
+        %140 = OpIEqual %bool %139 %int_2
+               OpSelectionMerge %141 None
+               OpBranchConditional %140 %142 %141
+        %142 = OpLabel
+        %144 = OpAccessChain %_ptr_Function_int %s %uint_0
+               OpStore %144 %int_9
+               OpBranch %141
+        %141 = OpLabel
+        %146 = OpLoad %int %x
+        %148 = OpAccessChain %_ptr_Function_int %s %uint_1
+        %149 = OpIAdd %int %146 %int_1
+               OpStore %148 %149
+        %151 = OpLoad %int %x
+        %153 = OpAccessChain %_ptr_Function_int %s %uint_2
+        %154 = OpIAdd %int %151 %int_2
+               OpStore %153 %154
+        %156 = OpAccessChain %_ptr_Function_int %s %uint_1
+        %157 = OpLoad %int %156
+        %158 = OpIEqual %bool %157 %int_2
+               OpSelectionMerge %159 None
+               OpBranchConditional %158 %160 %159
+        %160 = OpLabel
+        %162 = OpAccessChain %_ptr_Function_int %s %uint_1
+               OpStore %162 %int_7
+               OpBranch %159
+        %159 = OpLabel
+        %164 = OpAccessChain %_ptr_Function_int %s %uint_0
+        %165 = OpLoad %int %164
+        %167 = OpAccessChain %_ptr_Function_int %s %uint_1
+        %168 = OpLoad %int %167
+        %170 = OpAccessChain %_ptr_Function_int %s %uint_2
+        %171 = OpLoad %int %170
+        %172 = OpIAdd %int %165 %168
+        %173 = OpIAdd %int %172 %171
+               OpReturnValue %173
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-sum-struct-members/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-sum-struct-members/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..d664615
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-sum-struct-members/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,122 @@
+struct S {
+  a : i32;
+  b : i32;
+  c : i32;
+};
+
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_43 : i32;
+  var x_44 : bool = false;
+  var arr : array<S, 2>;
+  var param : S;
+  var param_1 : i32;
+  loop {
+    var x_50 : i32;
+    x_50 = x_10.one;
+    arr[x_50].a = 2;
+    let x_53 : i32 = arr[1].a;
+    if ((x_53 < 1)) {
+      x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+      x_44 = true;
+      break;
+    } else {
+      let x_60 : S = arr[1];
+      param = x_60;
+      param_1 = (2 + bitcast<i32>(x_50));
+      let x_61 : i32 = param_1;
+      let x_62 : ptr<function, i32> = &(param.a);
+      let x_63 : S = param;
+      var x_64_1 : S = x_63;
+      x_64_1.a = x_61;
+      let x_64 : S = x_64_1;
+      param = x_64;
+      let x_65 : S = param;
+      if ((x_65.a == 2)) {
+        let x_70 : S = param;
+        var x_71_1 : S = x_70;
+        x_71_1.a = 9;
+        let x_71 : S = x_71_1;
+        param = x_71;
+      }
+      let x_72 : i32 = param_1;
+      let x_74 : ptr<function, i32> = &(param.b);
+      let x_75 : S = param;
+      var x_76_1 : S = x_75;
+      x_76_1.b = (x_72 + 1);
+      let x_76 : S = x_76_1;
+      param = x_76;
+      let x_77 : i32 = param_1;
+      let x_79 : ptr<function, i32> = &(param.c);
+      let x_80 : S = param;
+      var x_81_1 : S = x_80;
+      x_81_1.c = (x_77 + 2);
+      let x_81 : S = x_81_1;
+      param = x_81;
+      let x_82 : S = param;
+      if ((x_82.b == 2)) {
+        let x_87 : S = param;
+        var x_88_1 : S = x_87;
+        x_88_1.b = 7;
+        let x_88 : S = x_88_1;
+        param = x_88;
+      }
+      let x_89 : S = param;
+      let x_91 : S = param;
+      let x_94 : S = param;
+      x_43 = ((x_89.a + x_91.b) + x_94.c);
+      let x_97 : i32 = x_43;
+      if ((x_97 == 12)) {
+        x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+      } else {
+        x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+      }
+    }
+    x_44 = true;
+    break;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+fn func_struct_S_i1_i1_i11_i1_(s : ptr<function, S>, x : ptr<function, i32>) -> i32 {
+  let x_103 : i32 = *(x);
+  let x_104 : ptr<function, i32> = &((*(s)).a);
+  *(x_104) = x_103;
+  let x_105 : i32 = *(x_104);
+  if ((x_105 == 2)) {
+    *(x_104) = 9;
+  }
+  let x_109 : i32 = *(x);
+  let x_111 : ptr<function, i32> = &((*(s)).b);
+  *(x_111) = (x_109 + 1);
+  let x_112 : i32 = *(x);
+  let x_114 : ptr<function, i32> = &((*(s)).c);
+  *(x_114) = (x_112 + 2);
+  let x_115 : i32 = *(x_111);
+  if ((x_115 == 2)) {
+    *(x_111) = 7;
+  }
+  let x_119 : i32 = *(x_104);
+  let x_120 : i32 = *(x_111);
+  let x_122 : i32 = *(x_114);
+  return ((x_119 + x_120) + x_122);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-sum-struct-members/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-sum-struct-members/0-opt.wgsl
new file mode 100644
index 0000000..d664615
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-sum-struct-members/0-opt.wgsl
@@ -0,0 +1,122 @@
+struct S {
+  a : i32;
+  b : i32;
+  c : i32;
+};
+
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_43 : i32;
+  var x_44 : bool = false;
+  var arr : array<S, 2>;
+  var param : S;
+  var param_1 : i32;
+  loop {
+    var x_50 : i32;
+    x_50 = x_10.one;
+    arr[x_50].a = 2;
+    let x_53 : i32 = arr[1].a;
+    if ((x_53 < 1)) {
+      x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+      x_44 = true;
+      break;
+    } else {
+      let x_60 : S = arr[1];
+      param = x_60;
+      param_1 = (2 + bitcast<i32>(x_50));
+      let x_61 : i32 = param_1;
+      let x_62 : ptr<function, i32> = &(param.a);
+      let x_63 : S = param;
+      var x_64_1 : S = x_63;
+      x_64_1.a = x_61;
+      let x_64 : S = x_64_1;
+      param = x_64;
+      let x_65 : S = param;
+      if ((x_65.a == 2)) {
+        let x_70 : S = param;
+        var x_71_1 : S = x_70;
+        x_71_1.a = 9;
+        let x_71 : S = x_71_1;
+        param = x_71;
+      }
+      let x_72 : i32 = param_1;
+      let x_74 : ptr<function, i32> = &(param.b);
+      let x_75 : S = param;
+      var x_76_1 : S = x_75;
+      x_76_1.b = (x_72 + 1);
+      let x_76 : S = x_76_1;
+      param = x_76;
+      let x_77 : i32 = param_1;
+      let x_79 : ptr<function, i32> = &(param.c);
+      let x_80 : S = param;
+      var x_81_1 : S = x_80;
+      x_81_1.c = (x_77 + 2);
+      let x_81 : S = x_81_1;
+      param = x_81;
+      let x_82 : S = param;
+      if ((x_82.b == 2)) {
+        let x_87 : S = param;
+        var x_88_1 : S = x_87;
+        x_88_1.b = 7;
+        let x_88 : S = x_88_1;
+        param = x_88;
+      }
+      let x_89 : S = param;
+      let x_91 : S = param;
+      let x_94 : S = param;
+      x_43 = ((x_89.a + x_91.b) + x_94.c);
+      let x_97 : i32 = x_43;
+      if ((x_97 == 12)) {
+        x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+      } else {
+        x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+      }
+    }
+    x_44 = true;
+    break;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+fn func_struct_S_i1_i1_i11_i1_(s : ptr<function, S>, x : ptr<function, i32>) -> i32 {
+  let x_103 : i32 = *(x);
+  let x_104 : ptr<function, i32> = &((*(s)).a);
+  *(x_104) = x_103;
+  let x_105 : i32 = *(x_104);
+  if ((x_105 == 2)) {
+    *(x_104) = 9;
+  }
+  let x_109 : i32 = *(x);
+  let x_111 : ptr<function, i32> = &((*(s)).b);
+  *(x_111) = (x_109 + 1);
+  let x_112 : i32 = *(x);
+  let x_114 : ptr<function, i32> = &((*(s)).c);
+  *(x_114) = (x_112 + 2);
+  let x_115 : i32 = *(x_111);
+  if ((x_115 == 2)) {
+    *(x_111) = 7;
+  }
+  let x_119 : i32 = *(x_104);
+  let x_120 : i32 = *(x_111);
+  let x_122 : i32 = *(x_114);
+  return ((x_119 + x_120) + x_122);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-sum-struct-members/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-sum-struct-members/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..9efb42d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-sum-struct-members/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,99 @@
+struct S {
+  int a;
+  int b;
+  int c;
+};
+
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int x_43 = 0;
+  bool x_44 = false;
+  S arr[2] = (S[2])0;
+  S param = (S)0;
+  int param_1 = 0;
+  while (true) {
+    int x_50 = 0;
+    x_50 = asint(x_10[0].x);
+    arr[x_50].a = 2;
+    const int x_53 = arr[1].a;
+    if ((x_53 < 1)) {
+      x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+      x_44 = true;
+      break;
+    } else {
+      const S x_60 = arr[1];
+      param = x_60;
+      param_1 = (2 + asint(x_50));
+      const int x_61 = param_1;
+      S x_64_1 = param;
+      x_64_1.a = x_61;
+      param = x_64_1;
+      if ((param.a == 2)) {
+        S x_71_1 = param;
+        x_71_1.a = 9;
+        param = x_71_1;
+      }
+      const int x_72 = param_1;
+      S x_76_1 = param;
+      x_76_1.b = (x_72 + 1);
+      param = x_76_1;
+      const int x_77 = param_1;
+      S x_81_1 = param;
+      x_81_1.c = (x_77 + 2);
+      param = x_81_1;
+      if ((param.b == 2)) {
+        S x_88_1 = param;
+        x_88_1.b = 7;
+        param = x_88_1;
+      }
+      x_43 = ((param.a + param.b) + param.c);
+      if ((x_43 == 12)) {
+        x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+      } else {
+        x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+      }
+    }
+    x_44 = true;
+    break;
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
+int func_struct_S_i1_i1_i11_i1_(inout S s, inout int x) {
+  const int x_103 = x;
+  s.a = x_103;
+  const int x_105 = s.a;
+  if ((x_105 == 2)) {
+    s.a = 9;
+  }
+  const int x_109 = x;
+  s.b = (x_109 + 1);
+  const int x_112 = x;
+  s.c = (x_112 + 2);
+  const int x_115 = s.b;
+  if ((x_115 == 2)) {
+    s.b = 7;
+  }
+  const int x_119 = s.a;
+  const int x_120 = s.b;
+  const int x_122 = s.c;
+  return ((x_119 + x_120) + x_122);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-sum-struct-members/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-sum-struct-members/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..91c59ac
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-sum-struct-members/0-opt.wgsl.expected.msl
@@ -0,0 +1,120 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  int a;
+  int b;
+  int c;
+};
+struct buf0 {
+  /* 0x0000 */ int one;
+};
+struct tint_array_wrapper {
+  S arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_10, thread float4* const tint_symbol_4) {
+  int x_43 = 0;
+  bool x_44 = false;
+  tint_array_wrapper arr = {};
+  S param = {};
+  int param_1 = 0;
+  while (true) {
+    int x_50 = 0;
+    x_50 = x_10.one;
+    arr.arr[x_50].a = 2;
+    int const x_53 = arr.arr[1].a;
+    if ((x_53 < 1)) {
+      *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+      x_44 = true;
+      break;
+    } else {
+      S const x_60 = arr.arr[1];
+      param = x_60;
+      param_1 = (2 + as_type<int>(x_50));
+      int const x_61 = param_1;
+      S const x_63 = param;
+      S x_64_1 = x_63;
+      x_64_1.a = x_61;
+      S const x_64 = x_64_1;
+      param = x_64;
+      S const x_65 = param;
+      if ((x_65.a == 2)) {
+        S const x_70 = param;
+        S x_71_1 = x_70;
+        x_71_1.a = 9;
+        S const x_71 = x_71_1;
+        param = x_71;
+      }
+      int const x_72 = param_1;
+      S const x_75 = param;
+      S x_76_1 = x_75;
+      x_76_1.b = (x_72 + 1);
+      S const x_76 = x_76_1;
+      param = x_76;
+      int const x_77 = param_1;
+      S const x_80 = param;
+      S x_81_1 = x_80;
+      x_81_1.c = (x_77 + 2);
+      S const x_81 = x_81_1;
+      param = x_81;
+      S const x_82 = param;
+      if ((x_82.b == 2)) {
+        S const x_87 = param;
+        S x_88_1 = x_87;
+        x_88_1.b = 7;
+        S const x_88 = x_88_1;
+        param = x_88;
+      }
+      S const x_89 = param;
+      S const x_91 = param;
+      S const x_94 = param;
+      x_43 = ((x_89.a + x_91.b) + x_94.c);
+      int const x_97 = x_43;
+      if ((x_97 == 12)) {
+        *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+      } else {
+        *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+      }
+    }
+    x_44 = true;
+    break;
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_10 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
+int func_struct_S_i1_i1_i11_i1_(thread S* const s, thread int* const x) {
+  int const x_103 = *(x);
+  (*(s)).a = x_103;
+  int const x_105 = (*(s)).a;
+  if ((x_105 == 2)) {
+    (*(s)).a = 9;
+  }
+  int const x_109 = *(x);
+  (*(s)).b = (x_109 + 1);
+  int const x_112 = *(x);
+  (*(s)).c = (x_112 + 2);
+  int const x_115 = (*(s)).b;
+  if ((x_115 == 2)) {
+    (*(s)).b = 7;
+  }
+  int const x_119 = (*(s)).a;
+  int const x_120 = (*(s)).b;
+  int const x_122 = (*(s)).c;
+  return ((x_119 + x_120) + x_122);
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-sum-struct-members/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-sum-struct-members/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..16fa1d7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-sum-struct-members/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,274 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 174
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_43 "x_43"
+               OpName %x_44 "x_44"
+               OpName %S "S"
+               OpMemberName %S 0 "a"
+               OpMemberName %S 1 "b"
+               OpMemberName %S 2 "c"
+               OpName %arr "arr"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %x_50 "x_50"
+               OpName %x_64_1 "x_64_1"
+               OpName %x_71_1 "x_71_1"
+               OpName %x_76_1 "x_76_1"
+               OpName %x_81_1 "x_81_1"
+               OpName %x_88_1 "x_88_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpName %func_struct_S_i1_i1_i11_i1_ "func_struct_S_i1_i1_i11_i1_"
+               OpName %s "s"
+               OpName %x "x"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %S 0 Offset 0
+               OpMemberDecorate %S 1 Offset 4
+               OpMemberDecorate %S 2 Offset 8
+               OpDecorate %_arr_S_uint_2 ArrayStride 12
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %23 = OpConstantNull %bool
+          %S = OpTypeStruct %int %int %int
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_S_uint_2 = OpTypeArray %S %uint_2
+%_ptr_Function__arr_S_uint_2 = OpTypePointer Function %_arr_S_uint_2
+         %30 = OpConstantNull %_arr_S_uint_2
+%_ptr_Function_S = OpTypePointer Function %S
+         %33 = OpConstantNull %S
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+         %55 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %true = OpConstantTrue %bool
+      %int_9 = OpConstant %int 9
+     %uint_1 = OpConstant %uint 1
+      %int_7 = OpConstant %int 7
+     %int_12 = OpConstant %int 12
+    %float_1 = OpConstant %float 1
+        %115 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %116 = OpTypeFunction %void %main_out
+        %128 = OpTypeFunction %int %_ptr_Function_S %_ptr_Function_int
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+       %x_43 = OpVariable %_ptr_Function_int Function %18
+       %x_44 = OpVariable %_ptr_Function_bool Function %23
+        %arr = OpVariable %_ptr_Function__arr_S_uint_2 Function %30
+      %param = OpVariable %_ptr_Function_S Function %33
+    %param_1 = OpVariable %_ptr_Function_int Function %18
+       %x_50 = OpVariable %_ptr_Function_int Function %18
+     %x_64_1 = OpVariable %_ptr_Function_S Function %33
+     %x_71_1 = OpVariable %_ptr_Function_S Function %33
+     %x_76_1 = OpVariable %_ptr_Function_S Function %33
+     %x_81_1 = OpVariable %_ptr_Function_S Function %33
+     %x_88_1 = OpVariable %_ptr_Function_S Function %33
+               OpStore %x_44 %false
+               OpBranch %35
+         %35 = OpLabel
+               OpLoopMerge %36 %37 None
+               OpBranch %38
+         %38 = OpLabel
+         %42 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0
+         %43 = OpLoad %int %42
+               OpStore %x_50 %43
+         %44 = OpLoad %int %x_50
+         %45 = OpAccessChain %_ptr_Function_int %arr %44 %uint_0
+               OpStore %45 %int_2
+         %48 = OpAccessChain %_ptr_Function_int %arr %int_1 %uint_0
+         %49 = OpLoad %int %48
+         %50 = OpSLessThan %bool %49 %int_1
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %53
+         %52 = OpLabel
+               OpStore %x_GLF_color %55
+               OpStore %x_44 %true
+               OpBranch %36
+         %53 = OpLabel
+         %57 = OpAccessChain %_ptr_Function_S %arr %int_1
+         %58 = OpLoad %S %57
+               OpStore %param %58
+         %60 = OpLoad %int %x_50
+         %59 = OpCopyObject %int %60
+         %61 = OpIAdd %int %int_2 %59
+               OpStore %param_1 %61
+         %62 = OpLoad %int %param_1
+         %63 = OpLoad %S %param
+               OpStore %x_64_1 %63
+         %65 = OpAccessChain %_ptr_Function_int %x_64_1 %uint_0
+               OpStore %65 %62
+         %66 = OpLoad %S %x_64_1
+               OpStore %param %66
+         %67 = OpLoad %S %param
+         %68 = OpCompositeExtract %int %67 0
+         %69 = OpIEqual %bool %68 %int_2
+               OpSelectionMerge %70 None
+               OpBranchConditional %69 %71 %70
+         %71 = OpLabel
+         %72 = OpLoad %S %param
+               OpStore %x_71_1 %72
+         %74 = OpAccessChain %_ptr_Function_int %x_71_1 %uint_0
+               OpStore %74 %int_9
+         %76 = OpLoad %S %x_71_1
+               OpStore %param %76
+               OpBranch %70
+         %70 = OpLabel
+         %77 = OpLoad %int %param_1
+         %78 = OpLoad %S %param
+               OpStore %x_76_1 %78
+         %81 = OpAccessChain %_ptr_Function_int %x_76_1 %uint_1
+         %82 = OpIAdd %int %77 %int_1
+               OpStore %81 %82
+         %83 = OpLoad %S %x_76_1
+               OpStore %param %83
+         %84 = OpLoad %int %param_1
+         %85 = OpLoad %S %param
+               OpStore %x_81_1 %85
+         %87 = OpAccessChain %_ptr_Function_int %x_81_1 %uint_2
+         %88 = OpIAdd %int %84 %int_2
+               OpStore %87 %88
+         %89 = OpLoad %S %x_81_1
+               OpStore %param %89
+         %90 = OpLoad %S %param
+         %91 = OpCompositeExtract %int %90 1
+         %92 = OpIEqual %bool %91 %int_2
+               OpSelectionMerge %93 None
+               OpBranchConditional %92 %94 %93
+         %94 = OpLabel
+         %95 = OpLoad %S %param
+               OpStore %x_88_1 %95
+         %97 = OpAccessChain %_ptr_Function_int %x_88_1 %uint_1
+               OpStore %97 %int_7
+         %99 = OpLoad %S %x_88_1
+               OpStore %param %99
+               OpBranch %93
+         %93 = OpLabel
+        %100 = OpLoad %S %param
+        %101 = OpLoad %S %param
+        %102 = OpLoad %S %param
+        %103 = OpCompositeExtract %int %100 0
+        %104 = OpCompositeExtract %int %101 1
+        %105 = OpIAdd %int %103 %104
+        %106 = OpCompositeExtract %int %102 2
+        %107 = OpIAdd %int %105 %106
+               OpStore %x_43 %107
+        %108 = OpLoad %int %x_43
+        %110 = OpIEqual %bool %108 %int_12
+               OpSelectionMerge %111 None
+               OpBranchConditional %110 %112 %113
+        %112 = OpLabel
+               OpStore %x_GLF_color %115
+               OpBranch %111
+        %113 = OpLabel
+               OpStore %x_GLF_color %55
+               OpBranch %111
+        %111 = OpLabel
+               OpBranch %51
+         %51 = OpLabel
+               OpStore %x_44 %true
+               OpBranch %36
+         %37 = OpLabel
+               OpBranch %35
+         %36 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %116
+%tint_symbol = OpFunctionParameter %main_out
+        %120 = OpLabel
+        %121 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %121
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+        %123 = OpLabel
+        %124 = OpFunctionCall %void %main_1
+        %126 = OpLoad %v4float %x_GLF_color
+        %127 = OpCompositeConstruct %main_out %126
+        %125 = OpFunctionCall %void %tint_symbol_2 %127
+               OpReturn
+               OpFunctionEnd
+%func_struct_S_i1_i1_i11_i1_ = OpFunction %int None %128
+          %s = OpFunctionParameter %_ptr_Function_S
+          %x = OpFunctionParameter %_ptr_Function_int
+        %132 = OpLabel
+        %134 = OpLoad %int %x
+        %136 = OpAccessChain %_ptr_Function_int %s %uint_0
+               OpStore %136 %134
+        %138 = OpAccessChain %_ptr_Function_int %s %uint_0
+        %139 = OpLoad %int %138
+        %140 = OpIEqual %bool %139 %int_2
+               OpSelectionMerge %141 None
+               OpBranchConditional %140 %142 %141
+        %142 = OpLabel
+        %144 = OpAccessChain %_ptr_Function_int %s %uint_0
+               OpStore %144 %int_9
+               OpBranch %141
+        %141 = OpLabel
+        %146 = OpLoad %int %x
+        %148 = OpAccessChain %_ptr_Function_int %s %uint_1
+        %149 = OpIAdd %int %146 %int_1
+               OpStore %148 %149
+        %151 = OpLoad %int %x
+        %153 = OpAccessChain %_ptr_Function_int %s %uint_2
+        %154 = OpIAdd %int %151 %int_2
+               OpStore %153 %154
+        %156 = OpAccessChain %_ptr_Function_int %s %uint_1
+        %157 = OpLoad %int %156
+        %158 = OpIEqual %bool %157 %int_2
+               OpSelectionMerge %159 None
+               OpBranchConditional %158 %160 %159
+        %160 = OpLabel
+        %162 = OpAccessChain %_ptr_Function_int %s %uint_1
+               OpStore %162 %int_7
+               OpBranch %159
+        %159 = OpLabel
+        %164 = OpAccessChain %_ptr_Function_int %s %uint_0
+        %165 = OpLoad %int %164
+        %167 = OpAccessChain %_ptr_Function_int %s %uint_1
+        %168 = OpLoad %int %167
+        %170 = OpAccessChain %_ptr_Function_int %s %uint_2
+        %171 = OpLoad %int %170
+        %172 = OpIAdd %int %165 %168
+        %173 = OpIAdd %int %172 %171
+               OpReturnValue %173
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-sum-struct-members/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-sum-struct-members/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..d664615
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-sum-struct-members/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,122 @@
+struct S {
+  a : i32;
+  b : i32;
+  c : i32;
+};
+
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_43 : i32;
+  var x_44 : bool = false;
+  var arr : array<S, 2>;
+  var param : S;
+  var param_1 : i32;
+  loop {
+    var x_50 : i32;
+    x_50 = x_10.one;
+    arr[x_50].a = 2;
+    let x_53 : i32 = arr[1].a;
+    if ((x_53 < 1)) {
+      x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+      x_44 = true;
+      break;
+    } else {
+      let x_60 : S = arr[1];
+      param = x_60;
+      param_1 = (2 + bitcast<i32>(x_50));
+      let x_61 : i32 = param_1;
+      let x_62 : ptr<function, i32> = &(param.a);
+      let x_63 : S = param;
+      var x_64_1 : S = x_63;
+      x_64_1.a = x_61;
+      let x_64 : S = x_64_1;
+      param = x_64;
+      let x_65 : S = param;
+      if ((x_65.a == 2)) {
+        let x_70 : S = param;
+        var x_71_1 : S = x_70;
+        x_71_1.a = 9;
+        let x_71 : S = x_71_1;
+        param = x_71;
+      }
+      let x_72 : i32 = param_1;
+      let x_74 : ptr<function, i32> = &(param.b);
+      let x_75 : S = param;
+      var x_76_1 : S = x_75;
+      x_76_1.b = (x_72 + 1);
+      let x_76 : S = x_76_1;
+      param = x_76;
+      let x_77 : i32 = param_1;
+      let x_79 : ptr<function, i32> = &(param.c);
+      let x_80 : S = param;
+      var x_81_1 : S = x_80;
+      x_81_1.c = (x_77 + 2);
+      let x_81 : S = x_81_1;
+      param = x_81;
+      let x_82 : S = param;
+      if ((x_82.b == 2)) {
+        let x_87 : S = param;
+        var x_88_1 : S = x_87;
+        x_88_1.b = 7;
+        let x_88 : S = x_88_1;
+        param = x_88;
+      }
+      let x_89 : S = param;
+      let x_91 : S = param;
+      let x_94 : S = param;
+      x_43 = ((x_89.a + x_91.b) + x_94.c);
+      let x_97 : i32 = x_43;
+      if ((x_97 == 12)) {
+        x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+      } else {
+        x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+      }
+    }
+    x_44 = true;
+    break;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+fn func_struct_S_i1_i1_i11_i1_(s : ptr<function, S>, x : ptr<function, i32>) -> i32 {
+  let x_103 : i32 = *(x);
+  let x_104 : ptr<function, i32> = &((*(s)).a);
+  *(x_104) = x_103;
+  let x_105 : i32 = *(x_104);
+  if ((x_105 == 2)) {
+    *(x_104) = 9;
+  }
+  let x_109 : i32 = *(x);
+  let x_111 : ptr<function, i32> = &((*(s)).b);
+  *(x_111) = (x_109 + 1);
+  let x_112 : i32 = *(x);
+  let x_114 : ptr<function, i32> = &((*(s)).c);
+  *(x_114) = (x_112 + 2);
+  let x_115 : i32 = *(x_111);
+  if ((x_115 == 2)) {
+    *(x_111) = 7;
+  }
+  let x_119 : i32 = *(x_104);
+  let x_120 : i32 = *(x_111);
+  let x_122 : i32 = *(x_114);
+  return ((x_119 + x_120) + x_122);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-unused-component/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-unused-component/0-opt.spvasm
new file mode 100644
index 0000000..e02ce23
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-unused-component/0-opt.spvasm
@@ -0,0 +1,83 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %func_vf2_ "func(vf2;"
+               OpName %v "v"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "two"
+               OpName %_ ""
+               OpName %f "f"
+               OpName %param "param"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %15 = OpTypeFunction %float %_ptr_Function_v2float
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+    %float_1 = OpConstant %float 1
+       %bool = OpTypeBool
+    %float_5 = OpConstant %float 5
+         %27 = OpConstantComposite %v2float %float_1 %float_1
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %31 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %32 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %11
+         %33 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function
+      %param = OpVariable %_ptr_Function_v2float Function
+               OpStore %param %27
+         %34 = OpFunctionCall %float %func_vf2_ %param
+               OpStore %f %34
+         %35 = OpLoad %float %f
+         %36 = OpFOrdEqual %bool %35 %float_5
+               OpSelectionMerge %37 None
+               OpBranchConditional %36 %38 %39
+         %38 = OpLabel
+               OpStore %_GLF_color %31
+               OpBranch %37
+         %39 = OpLabel
+               OpStore %_GLF_color %32
+               OpBranch %37
+         %37 = OpLabel
+               OpReturn
+               OpFunctionEnd
+  %func_vf2_ = OpFunction %float None %15
+          %v = OpFunctionParameter %_ptr_Function_v2float
+         %40 = OpLabel
+         %41 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %42 = OpLoad %float %41
+         %43 = OpAccessChain %_ptr_Function_float %v %uint_0
+               OpStore %43 %42
+         %44 = OpAccessChain %_ptr_Function_float %v %uint_1
+         %45 = OpLoad %float %44
+         %46 = OpFOrdLessThan %bool %45 %float_1
+               OpSelectionMerge %47 None
+               OpBranchConditional %46 %48 %47
+         %48 = OpLabel
+               OpReturnValue %float_1
+         %47 = OpLabel
+               OpReturnValue %float_5
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-unused-component/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-unused-component/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..52a5683
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-unused-component/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,42 @@
+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);
+
+float func_vf2_(inout float2 v) {
+  const float x_42 = asfloat(x_7[0].x);
+  v.x = x_42;
+  const float x_45 = v.y;
+  if ((x_45 < 1.0f)) {
+    return 1.0f;
+  }
+  return 5.0f;
+}
+
+void main_1() {
+  float f = 0.0f;
+  float2 param = float2(0.0f, 0.0f);
+  param = float2(1.0f, 1.0f);
+  const float x_34 = func_vf2_(param);
+  f = x_34;
+  if ((f == 5.0f)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-unused-component/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-unused-component/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..84a3cf6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-unused-component/0-opt.spvasm.expected.msl
@@ -0,0 +1,46 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float two;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float func_vf2_(constant buf0& x_7, thread float2* const v) {
+  float const x_42 = x_7.two;
+  (*(v)).x = x_42;
+  float const x_45 = (*(v)).y;
+  if ((x_45 < 1.0f)) {
+    return 1.0f;
+  }
+  return 5.0f;
+}
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_4) {
+  float f = 0.0f;
+  float2 param = 0.0f;
+  param = float2(1.0f, 1.0f);
+  float const x_34 = func_vf2_(x_7, &(param));
+  f = x_34;
+  float const x_35 = f;
+  if ((x_35 == 5.0f)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-unused-component/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-unused-component/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..0216afc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-unused-component/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,114 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 66
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "two"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_vf2_ "func_vf2_"
+               OpName %v "v"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %param "param"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %11 = OpTypeFunction %float %_ptr_Function_v2float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+    %float_1 = OpConstant %float 1
+       %bool = OpTypeBool
+    %float_5 = OpConstant %float 5
+       %void = OpTypeVoid
+         %35 = OpTypeFunction %void
+         %40 = OpConstantNull %float
+         %42 = OpConstantNull %v2float
+         %43 = OpConstantComposite %v2float %float_1 %float_1
+    %float_0 = OpConstant %float 0
+         %52 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %53 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %54 = OpTypeFunction %void %main_out
+  %func_vf2_ = OpFunction %float None %11
+          %v = OpFunctionParameter %_ptr_Function_v2float
+         %16 = OpLabel
+         %20 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0
+         %21 = OpLoad %float %20
+         %24 = OpAccessChain %_ptr_Function_float %v %uint_0
+               OpStore %24 %21
+         %27 = OpAccessChain %_ptr_Function_float %v %uint_1
+         %28 = OpLoad %float %27
+         %30 = OpFOrdLessThan %bool %28 %float_1
+               OpSelectionMerge %32 None
+               OpBranchConditional %30 %33 %32
+         %33 = OpLabel
+               OpReturnValue %float_1
+         %32 = OpLabel
+               OpReturnValue %float_5
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %35
+         %38 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %40
+      %param = OpVariable %_ptr_Function_v2float Function %42
+               OpStore %param %43
+         %44 = OpFunctionCall %float %func_vf2_ %param
+               OpStore %f %44
+         %46 = OpLoad %float %f
+         %47 = OpFOrdEqual %bool %46 %float_5
+               OpSelectionMerge %48 None
+               OpBranchConditional %47 %49 %50
+         %49 = OpLabel
+               OpStore %x_GLF_color %52
+               OpBranch %48
+         %50 = OpLabel
+               OpStore %x_GLF_color %53
+               OpBranch %48
+         %48 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %54
+%tint_symbol = OpFunctionParameter %main_out
+         %58 = OpLabel
+         %59 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %59
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %35
+         %61 = OpLabel
+         %62 = OpFunctionCall %void %main_1
+         %64 = OpLoad %v4float %x_GLF_color
+         %65 = OpCompositeConstruct %main_out %64
+         %63 = OpFunctionCall %void %tint_symbol_2 %65
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-unused-component/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-unused-component/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..f09a1ff
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-unused-component/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,44 @@
+[[block]]
+struct buf0 {
+  two : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_vf2_(v : ptr<function, vec2<f32>>) -> f32 {
+  let x_42 : f32 = x_7.two;
+  (*(v)).x = x_42;
+  let x_45 : f32 = (*(v)).y;
+  if ((x_45 < 1.0)) {
+    return 1.0;
+  }
+  return 5.0;
+}
+
+fn main_1() {
+  var f : f32;
+  var param : vec2<f32>;
+  param = vec2<f32>(1.0, 1.0);
+  let x_34 : f32 = func_vf2_(&(param));
+  f = x_34;
+  let x_35 : f32 = f;
+  if ((x_35 == 5.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-unused-component/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-unused-component/0-opt.wgsl
new file mode 100644
index 0000000..f09a1ff
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-unused-component/0-opt.wgsl
@@ -0,0 +1,44 @@
+[[block]]
+struct buf0 {
+  two : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_vf2_(v : ptr<function, vec2<f32>>) -> f32 {
+  let x_42 : f32 = x_7.two;
+  (*(v)).x = x_42;
+  let x_45 : f32 = (*(v)).y;
+  if ((x_45 < 1.0)) {
+    return 1.0;
+  }
+  return 5.0;
+}
+
+fn main_1() {
+  var f : f32;
+  var param : vec2<f32>;
+  param = vec2<f32>(1.0, 1.0);
+  let x_34 : f32 = func_vf2_(&(param));
+  f = x_34;
+  let x_35 : f32 = f;
+  if ((x_35 == 5.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-unused-component/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-unused-component/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..52a5683
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-unused-component/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,42 @@
+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);
+
+float func_vf2_(inout float2 v) {
+  const float x_42 = asfloat(x_7[0].x);
+  v.x = x_42;
+  const float x_45 = v.y;
+  if ((x_45 < 1.0f)) {
+    return 1.0f;
+  }
+  return 5.0f;
+}
+
+void main_1() {
+  float f = 0.0f;
+  float2 param = float2(0.0f, 0.0f);
+  param = float2(1.0f, 1.0f);
+  const float x_34 = func_vf2_(param);
+  f = x_34;
+  if ((f == 5.0f)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-unused-component/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-unused-component/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..84a3cf6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-unused-component/0-opt.wgsl.expected.msl
@@ -0,0 +1,46 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float two;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float func_vf2_(constant buf0& x_7, thread float2* const v) {
+  float const x_42 = x_7.two;
+  (*(v)).x = x_42;
+  float const x_45 = (*(v)).y;
+  if ((x_45 < 1.0f)) {
+    return 1.0f;
+  }
+  return 5.0f;
+}
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_4) {
+  float f = 0.0f;
+  float2 param = 0.0f;
+  param = float2(1.0f, 1.0f);
+  float const x_34 = func_vf2_(x_7, &(param));
+  f = x_34;
+  float const x_35 = f;
+  if ((x_35 == 5.0f)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-unused-component/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-unused-component/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..0216afc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-unused-component/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,114 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 66
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "two"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_vf2_ "func_vf2_"
+               OpName %v "v"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %param "param"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %11 = OpTypeFunction %float %_ptr_Function_v2float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+    %float_1 = OpConstant %float 1
+       %bool = OpTypeBool
+    %float_5 = OpConstant %float 5
+       %void = OpTypeVoid
+         %35 = OpTypeFunction %void
+         %40 = OpConstantNull %float
+         %42 = OpConstantNull %v2float
+         %43 = OpConstantComposite %v2float %float_1 %float_1
+    %float_0 = OpConstant %float 0
+         %52 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %53 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %54 = OpTypeFunction %void %main_out
+  %func_vf2_ = OpFunction %float None %11
+          %v = OpFunctionParameter %_ptr_Function_v2float
+         %16 = OpLabel
+         %20 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0
+         %21 = OpLoad %float %20
+         %24 = OpAccessChain %_ptr_Function_float %v %uint_0
+               OpStore %24 %21
+         %27 = OpAccessChain %_ptr_Function_float %v %uint_1
+         %28 = OpLoad %float %27
+         %30 = OpFOrdLessThan %bool %28 %float_1
+               OpSelectionMerge %32 None
+               OpBranchConditional %30 %33 %32
+         %33 = OpLabel
+               OpReturnValue %float_1
+         %32 = OpLabel
+               OpReturnValue %float_5
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %35
+         %38 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %40
+      %param = OpVariable %_ptr_Function_v2float Function %42
+               OpStore %param %43
+         %44 = OpFunctionCall %float %func_vf2_ %param
+               OpStore %f %44
+         %46 = OpLoad %float %f
+         %47 = OpFOrdEqual %bool %46 %float_5
+               OpSelectionMerge %48 None
+               OpBranchConditional %47 %49 %50
+         %49 = OpLabel
+               OpStore %x_GLF_color %52
+               OpBranch %48
+         %50 = OpLabel
+               OpStore %x_GLF_color %53
+               OpBranch %48
+         %48 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %54
+%tint_symbol = OpFunctionParameter %main_out
+         %58 = OpLabel
+         %59 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %59
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %35
+         %61 = OpLabel
+         %62 = OpFunctionCall %void %main_1
+         %64 = OpLoad %v4float %x_GLF_color
+         %65 = OpCompositeConstruct %main_out %64
+         %63 = OpFunctionCall %void %tint_symbol_2 %65
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-unused-component/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-unused-component/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..f09a1ff
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-mem-pass-unused-component/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,44 @@
+[[block]]
+struct buf0 {
+  two : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_vf2_(v : ptr<function, vec2<f32>>) -> f32 {
+  let x_42 : f32 = x_7.two;
+  (*(v)).x = x_42;
+  let x_45 : f32 = (*(v)).y;
+  if ((x_45 < 1.0)) {
+    return 1.0;
+  }
+  return 5.0;
+}
+
+fn main_1() {
+  var f : f32;
+  var param : vec2<f32>;
+  param = vec2<f32>(1.0, 1.0);
+  let x_34 : f32 = func_vf2_(&(param));
+  f = x_34;
+  let x_35 : f32 = f;
+  if ((x_35 == 5.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-merge-return-condition-twice/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-merge-return-condition-twice/0-opt.spvasm
new file mode 100644
index 0000000..6b79715
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-merge-return-condition-twice/0-opt.spvasm
@@ -0,0 +1,88 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %func_ "func("
+               OpName %b "b"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "three"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+         %11 = OpTypeFunction %float
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_2 = OpConstant %float 2
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+      %false = OpConstantFalse %bool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %24 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %25 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %9
+         %26 = OpLabel
+         %27 = OpFunctionCall %float %func_
+         %28 = OpFOrdEqual %bool %27 %float_1
+               OpSelectionMerge %29 None
+               OpBranchConditional %28 %30 %31
+         %30 = OpLabel
+               OpStore %_GLF_color %24
+               OpBranch %29
+         %31 = OpLabel
+               OpStore %_GLF_color %25
+               OpBranch %29
+         %29 = OpLabel
+               OpReturn
+               OpFunctionEnd
+      %func_ = OpFunction %float None %11
+         %32 = OpLabel
+          %b = OpVariable %_ptr_Function_float Function
+               OpStore %b %float_2
+               OpBranch %33
+         %33 = OpLabel
+         %34 = OpPhi %float %float_2 %32 %float_1 %35
+               OpLoopMerge %36 %35 None
+               OpBranch %37
+         %37 = OpLabel
+         %38 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %39 = OpLoad %float %38
+         %40 = OpFOrdEqual %bool %39 %float_0
+               OpSelectionMerge %41 None
+               OpBranchConditional %40 %42 %41
+         %42 = OpLabel
+               OpBranch %36
+         %41 = OpLabel
+         %43 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %44 = OpLoad %float %43
+         %45 = OpFOrdEqual %bool %44 %float_0
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %46
+         %47 = OpLabel
+               OpReturnValue %float_1
+         %46 = OpLabel
+               OpStore %b %float_1
+               OpBranch %35
+         %35 = OpLabel
+               OpBranchConditional %false %33 %36
+         %36 = OpLabel
+         %48 = OpPhi %float %34 %42 %float_1 %35
+               OpReturnValue %48
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-merge-return-condition-twice/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-merge-return-condition-twice/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..be4003a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-merge-return-condition-twice/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,59 @@
+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);
+
+float func_() {
+  float b = 0.0f;
+  float x_34 = 0.0f;
+  float x_34_phi = 0.0f;
+  float x_48_phi = 0.0f;
+  b = 2.0f;
+  x_34_phi = 2.0f;
+  while (true) {
+    x_34 = x_34_phi;
+    const float x_39 = asfloat(x_7[0].x);
+    if ((x_39 == 0.0f)) {
+      x_48_phi = x_34;
+      break;
+    }
+    const float x_44 = asfloat(x_7[0].x);
+    if ((x_44 == 0.0f)) {
+      return 1.0f;
+    }
+    b = 1.0f;
+    {
+      x_34_phi = 1.0f;
+      x_48_phi = 1.0f;
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  return x_48_phi;
+}
+
+void main_1() {
+  const float x_27 = func_();
+  if ((x_27 == 1.0f)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-merge-return-condition-twice/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-merge-return-condition-twice/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..8114c84
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-merge-return-condition-twice/0-opt.spvasm.expected.msl
@@ -0,0 +1,63 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float three;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float func_(constant buf0& x_7) {
+  float b = 0.0f;
+  float x_34 = 0.0f;
+  float x_34_phi = 0.0f;
+  float x_48_phi = 0.0f;
+  b = 2.0f;
+  x_34_phi = 2.0f;
+  while (true) {
+    x_34 = x_34_phi;
+    float const x_39 = x_7.three;
+    if ((x_39 == 0.0f)) {
+      x_48_phi = x_34;
+      break;
+    }
+    float const x_44 = x_7.three;
+    if ((x_44 == 0.0f)) {
+      return 1.0f;
+    }
+    b = 1.0f;
+    {
+      x_34_phi = 1.0f;
+      x_48_phi = 1.0f;
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  float const x_48 = x_48_phi;
+  return x_48;
+}
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_4) {
+  float const x_27 = func_(x_7);
+  if ((x_27 == 1.0f)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-merge-return-condition-twice/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-merge-return-condition-twice/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..22d860b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-merge-return-condition-twice/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,144 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 71
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "three"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_ "func_"
+               OpName %b "b"
+               OpName %x_34 "x_34"
+               OpName %x_34_phi "x_34_phi"
+               OpName %x_48_phi "x_48_phi"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+         %11 = OpTypeFunction %float
+%_ptr_Function_float = OpTypePointer Function %float
+         %16 = OpConstantNull %float
+    %float_2 = OpConstant %float 2
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+      %false = OpConstantFalse %bool
+       %void = OpTypeVoid
+         %48 = OpTypeFunction %void
+         %57 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %58 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %59 = OpTypeFunction %void %main_out
+      %func_ = OpFunction %float None %11
+         %13 = OpLabel
+          %b = OpVariable %_ptr_Function_float Function %16
+       %x_34 = OpVariable %_ptr_Function_float Function %16
+   %x_34_phi = OpVariable %_ptr_Function_float Function %16
+   %x_48_phi = OpVariable %_ptr_Function_float Function %16
+               OpStore %b %float_2
+               OpStore %x_34_phi %float_2
+               OpBranch %21
+         %21 = OpLabel
+               OpLoopMerge %22 %23 None
+               OpBranch %24
+         %24 = OpLabel
+         %25 = OpLoad %float %x_34_phi
+               OpStore %x_34 %25
+         %29 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0
+         %30 = OpLoad %float %29
+         %32 = OpFOrdEqual %bool %30 %float_0
+               OpSelectionMerge %34 None
+               OpBranchConditional %32 %35 %34
+         %35 = OpLabel
+         %36 = OpLoad %float %x_34
+               OpStore %x_48_phi %36
+               OpBranch %22
+         %34 = OpLabel
+         %37 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0
+         %38 = OpLoad %float %37
+         %39 = OpFOrdEqual %bool %38 %float_0
+               OpSelectionMerge %40 None
+               OpBranchConditional %39 %41 %40
+         %41 = OpLabel
+               OpReturnValue %float_1
+         %40 = OpLabel
+               OpStore %b %float_1
+               OpBranch %23
+         %23 = OpLabel
+               OpStore %x_34_phi %float_1
+               OpStore %x_48_phi %float_1
+               OpSelectionMerge %44 None
+               OpBranchConditional %false %45 %46
+         %45 = OpLabel
+               OpBranch %44
+         %46 = OpLabel
+               OpBranch %22
+         %44 = OpLabel
+               OpBranch %21
+         %22 = OpLabel
+         %47 = OpLoad %float %x_48_phi
+               OpReturnValue %47
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %48
+         %51 = OpLabel
+         %52 = OpFunctionCall %float %func_
+         %53 = OpFOrdEqual %bool %52 %float_1
+               OpSelectionMerge %54 None
+               OpBranchConditional %53 %55 %56
+         %55 = OpLabel
+               OpStore %x_GLF_color %57
+               OpBranch %54
+         %56 = OpLabel
+               OpStore %x_GLF_color %58
+               OpBranch %54
+         %54 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %59
+%tint_symbol = OpFunctionParameter %main_out
+         %63 = OpLabel
+         %64 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %64
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %48
+         %66 = OpLabel
+         %67 = OpFunctionCall %void %main_1
+         %69 = OpLoad %v4float %x_GLF_color
+         %70 = OpCompositeConstruct %main_out %69
+         %68 = OpFunctionCall %void %tint_symbol_2 %70
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 23[%23] is not post dominated by the back-edge block 44[%44]
+  %44 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-merge-return-condition-twice/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-merge-return-condition-twice/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..6a9c3b7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-merge-return-condition-twice/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,62 @@
+[[block]]
+struct buf0 {
+  three : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> f32 {
+  var b : f32;
+  var x_34 : f32;
+  var x_34_phi : f32;
+  var x_48_phi : f32;
+  b = 2.0;
+  x_34_phi = 2.0;
+  loop {
+    x_34 = x_34_phi;
+    let x_39 : f32 = x_7.three;
+    if ((x_39 == 0.0)) {
+      x_48_phi = x_34;
+      break;
+    }
+    let x_44 : f32 = x_7.three;
+    if ((x_44 == 0.0)) {
+      return 1.0;
+    }
+    b = 1.0;
+
+    continuing {
+      x_34_phi = 1.0;
+      x_48_phi = 1.0;
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_48 : f32 = x_48_phi;
+  return x_48;
+}
+
+fn main_1() {
+  let x_27 : f32 = func_();
+  if ((x_27 == 1.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-merge-return-condition-twice/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-merge-return-condition-twice/0-opt.wgsl
new file mode 100644
index 0000000..6a9c3b7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-merge-return-condition-twice/0-opt.wgsl
@@ -0,0 +1,62 @@
+[[block]]
+struct buf0 {
+  three : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> f32 {
+  var b : f32;
+  var x_34 : f32;
+  var x_34_phi : f32;
+  var x_48_phi : f32;
+  b = 2.0;
+  x_34_phi = 2.0;
+  loop {
+    x_34 = x_34_phi;
+    let x_39 : f32 = x_7.three;
+    if ((x_39 == 0.0)) {
+      x_48_phi = x_34;
+      break;
+    }
+    let x_44 : f32 = x_7.three;
+    if ((x_44 == 0.0)) {
+      return 1.0;
+    }
+    b = 1.0;
+
+    continuing {
+      x_34_phi = 1.0;
+      x_48_phi = 1.0;
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_48 : f32 = x_48_phi;
+  return x_48;
+}
+
+fn main_1() {
+  let x_27 : f32 = func_();
+  if ((x_27 == 1.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-merge-return-condition-twice/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-merge-return-condition-twice/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..be4003a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-merge-return-condition-twice/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,59 @@
+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);
+
+float func_() {
+  float b = 0.0f;
+  float x_34 = 0.0f;
+  float x_34_phi = 0.0f;
+  float x_48_phi = 0.0f;
+  b = 2.0f;
+  x_34_phi = 2.0f;
+  while (true) {
+    x_34 = x_34_phi;
+    const float x_39 = asfloat(x_7[0].x);
+    if ((x_39 == 0.0f)) {
+      x_48_phi = x_34;
+      break;
+    }
+    const float x_44 = asfloat(x_7[0].x);
+    if ((x_44 == 0.0f)) {
+      return 1.0f;
+    }
+    b = 1.0f;
+    {
+      x_34_phi = 1.0f;
+      x_48_phi = 1.0f;
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  return x_48_phi;
+}
+
+void main_1() {
+  const float x_27 = func_();
+  if ((x_27 == 1.0f)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-merge-return-condition-twice/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-merge-return-condition-twice/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..8114c84
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-merge-return-condition-twice/0-opt.wgsl.expected.msl
@@ -0,0 +1,63 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float three;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float func_(constant buf0& x_7) {
+  float b = 0.0f;
+  float x_34 = 0.0f;
+  float x_34_phi = 0.0f;
+  float x_48_phi = 0.0f;
+  b = 2.0f;
+  x_34_phi = 2.0f;
+  while (true) {
+    x_34 = x_34_phi;
+    float const x_39 = x_7.three;
+    if ((x_39 == 0.0f)) {
+      x_48_phi = x_34;
+      break;
+    }
+    float const x_44 = x_7.three;
+    if ((x_44 == 0.0f)) {
+      return 1.0f;
+    }
+    b = 1.0f;
+    {
+      x_34_phi = 1.0f;
+      x_48_phi = 1.0f;
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  float const x_48 = x_48_phi;
+  return x_48;
+}
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_4) {
+  float const x_27 = func_(x_7);
+  if ((x_27 == 1.0f)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-merge-return-condition-twice/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-merge-return-condition-twice/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..22d860b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-merge-return-condition-twice/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,144 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 71
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "three"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_ "func_"
+               OpName %b "b"
+               OpName %x_34 "x_34"
+               OpName %x_34_phi "x_34_phi"
+               OpName %x_48_phi "x_48_phi"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+         %11 = OpTypeFunction %float
+%_ptr_Function_float = OpTypePointer Function %float
+         %16 = OpConstantNull %float
+    %float_2 = OpConstant %float 2
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+      %false = OpConstantFalse %bool
+       %void = OpTypeVoid
+         %48 = OpTypeFunction %void
+         %57 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %58 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %59 = OpTypeFunction %void %main_out
+      %func_ = OpFunction %float None %11
+         %13 = OpLabel
+          %b = OpVariable %_ptr_Function_float Function %16
+       %x_34 = OpVariable %_ptr_Function_float Function %16
+   %x_34_phi = OpVariable %_ptr_Function_float Function %16
+   %x_48_phi = OpVariable %_ptr_Function_float Function %16
+               OpStore %b %float_2
+               OpStore %x_34_phi %float_2
+               OpBranch %21
+         %21 = OpLabel
+               OpLoopMerge %22 %23 None
+               OpBranch %24
+         %24 = OpLabel
+         %25 = OpLoad %float %x_34_phi
+               OpStore %x_34 %25
+         %29 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0
+         %30 = OpLoad %float %29
+         %32 = OpFOrdEqual %bool %30 %float_0
+               OpSelectionMerge %34 None
+               OpBranchConditional %32 %35 %34
+         %35 = OpLabel
+         %36 = OpLoad %float %x_34
+               OpStore %x_48_phi %36
+               OpBranch %22
+         %34 = OpLabel
+         %37 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0
+         %38 = OpLoad %float %37
+         %39 = OpFOrdEqual %bool %38 %float_0
+               OpSelectionMerge %40 None
+               OpBranchConditional %39 %41 %40
+         %41 = OpLabel
+               OpReturnValue %float_1
+         %40 = OpLabel
+               OpStore %b %float_1
+               OpBranch %23
+         %23 = OpLabel
+               OpStore %x_34_phi %float_1
+               OpStore %x_48_phi %float_1
+               OpSelectionMerge %44 None
+               OpBranchConditional %false %45 %46
+         %45 = OpLabel
+               OpBranch %44
+         %46 = OpLabel
+               OpBranch %22
+         %44 = OpLabel
+               OpBranch %21
+         %22 = OpLabel
+         %47 = OpLoad %float %x_48_phi
+               OpReturnValue %47
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %48
+         %51 = OpLabel
+         %52 = OpFunctionCall %float %func_
+         %53 = OpFOrdEqual %bool %52 %float_1
+               OpSelectionMerge %54 None
+               OpBranchConditional %53 %55 %56
+         %55 = OpLabel
+               OpStore %x_GLF_color %57
+               OpBranch %54
+         %56 = OpLabel
+               OpStore %x_GLF_color %58
+               OpBranch %54
+         %54 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %59
+%tint_symbol = OpFunctionParameter %main_out
+         %63 = OpLabel
+         %64 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %64
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %48
+         %66 = OpLabel
+         %67 = OpFunctionCall %void %main_1
+         %69 = OpLoad %v4float %x_GLF_color
+         %70 = OpCompositeConstruct %main_out %69
+         %68 = OpFunctionCall %void %tint_symbol_2 %70
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 23[%23] is not post dominated by the back-edge block 44[%44]
+  %44 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-merge-return-condition-twice/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-merge-return-condition-twice/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..6a9c3b7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-merge-return-condition-twice/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,62 @@
+[[block]]
+struct buf0 {
+  three : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> f32 {
+  var b : f32;
+  var x_34 : f32;
+  var x_34_phi : f32;
+  var x_48_phi : f32;
+  b = 2.0;
+  x_34_phi = 2.0;
+  loop {
+    x_34 = x_34_phi;
+    let x_39 : f32 = x_7.three;
+    if ((x_39 == 0.0)) {
+      x_48_phi = x_34;
+      break;
+    }
+    let x_44 : f32 = x_7.three;
+    if ((x_44 == 0.0)) {
+      return 1.0;
+    }
+    b = 1.0;
+
+    continuing {
+      x_34_phi = 1.0;
+      x_48_phi = 1.0;
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_48 : f32 = x_48_phi;
+  return x_48;
+}
+
+fn main_1() {
+  let x_27 : f32 = func_();
+  if ((x_27 == 1.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-min-intbitstofloat-undefined-never-used/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-min-intbitstofloat-undefined-never-used/0-opt.spvasm
new file mode 100644
index 0000000..2682f3c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-min-intbitstofloat-undefined-never-used/0-opt.spvasm
@@ -0,0 +1,95 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %f "f"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+        %int = OpTypeInt 32 1
+     %int_n1 = OpConstant %int -1
+    %float_1 = OpConstant %float 1
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %main = OpFunction %void None %13
+         %34 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function
+         %35 = OpBitcast %float %int_n1
+         %36 = OpExtInst %float %1 FMin %35 %float_1
+               OpStore %f %36
+         %37 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %38 = OpLoad %float %37
+         %39 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %40 = OpLoad %float %39
+         %41 = OpFOrdGreaterThan %bool %38 %40
+               OpSelectionMerge %42 None
+               OpBranchConditional %41 %43 %44
+         %43 = OpLabel
+         %45 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %46 = OpLoad %int %45
+         %47 = OpConvertSToF %float %46
+         %48 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %49 = OpLoad %int %48
+         %50 = OpConvertSToF %float %49
+         %51 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %52 = OpLoad %int %51
+         %53 = OpConvertSToF %float %52
+         %54 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %55 = OpLoad %int %54
+         %56 = OpConvertSToF %float %55
+         %57 = OpCompositeConstruct %v4float %47 %50 %53 %56
+               OpStore %_GLF_color %57
+               OpBranch %42
+         %44 = OpLabel
+         %58 = OpLoad %float %f
+         %59 = OpCompositeConstruct %v4float %58 %58 %58 %58
+               OpStore %_GLF_color %59
+               OpBranch %42
+         %42 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-min-intbitstofloat-undefined-never-used/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-min-intbitstofloat-undefined-never-used/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..3c49b30
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-min-intbitstofloat-undefined-never-used/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,48 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+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);
+cbuffer cbuffer_x_9 : register(b1, space0) {
+  uint4 x_9[2];
+};
+
+void main_1() {
+  float f = 0.0f;
+  f = min(asfloat(-1), 1.0f);
+  const float x_38 = gl_FragCoord.x;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_40 = asfloat(x_7[scalar_offset / 4][scalar_offset % 4]);
+  if ((x_38 > x_40)) {
+    const int x_46 = asint(x_9[1].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_49 = asint(x_9[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_52 = asint(x_9[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_55 = asint(x_9[1].x);
+    x_GLF_color = float4(float(x_46), float(x_49), float(x_52), float(x_55));
+  } else {
+    const float x_58 = f;
+    x_GLF_color = float4(x_58, x_58, x_58, x_58);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-min-intbitstofloat-undefined-never-used/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-min-intbitstofloat-undefined-never-used/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..bae0285
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-min-intbitstofloat-undefined-never-used/0-opt.spvasm.expected.msl
@@ -0,0 +1,58 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, constant buf1& x_9, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float f = 0.0f;
+  f = fmin(as_type<float>(-1), 1.0f);
+  float const x_38 = (*(tint_symbol_5)).x;
+  float const x_40 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_38 > x_40)) {
+    int const x_46 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_49 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    int const x_52 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    int const x_55 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_6) = float4(float(x_46), float(x_49), float(x_52), float(x_55));
+  } else {
+    float const x_58 = f;
+    *(tint_symbol_6) = float4(x_58, x_58, x_58, x_58);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]], constant buf1& x_9 [[buffer(1)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_7, x_9, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-min-intbitstofloat-undefined-never-used/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-min-intbitstofloat-undefined-never-used/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..b9c090d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-min-intbitstofloat-undefined-never-used/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,133 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 78
+; Schema: 0
+               OpCapability Shader
+         %31 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 1
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_9 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %29 = OpConstantNull %float
+     %int_n1 = OpConstant %int -1
+    %float_1 = OpConstant %float 1
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+         %65 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %23
+         %26 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %29
+         %32 = OpBitcast %float %int_n1
+         %30 = OpExtInst %float %31 NMin %32 %float_1
+               OpStore %f %30
+         %37 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %38 = OpLoad %float %37
+         %41 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %42 = OpLoad %float %41
+         %43 = OpFOrdGreaterThan %bool %38 %42
+               OpSelectionMerge %45 None
+               OpBranchConditional %43 %46 %47
+         %46 = OpLabel
+         %50 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %51 = OpLoad %int %50
+         %52 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %53 = OpLoad %int %52
+         %54 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %55 = OpLoad %int %54
+         %56 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %57 = OpLoad %int %56
+         %58 = OpConvertSToF %float %51
+         %59 = OpConvertSToF %float %53
+         %60 = OpConvertSToF %float %55
+         %61 = OpConvertSToF %float %57
+         %62 = OpCompositeConstruct %v4float %58 %59 %60 %61
+               OpStore %x_GLF_color %62
+               OpBranch %45
+         %47 = OpLabel
+         %63 = OpLoad %float %f
+         %64 = OpCompositeConstruct %v4float %63 %63 %63 %63
+               OpStore %x_GLF_color %64
+               OpBranch %45
+         %45 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %65
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %69 = OpLabel
+         %70 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %70
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %23
+         %72 = OpLabel
+         %73 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %73
+         %74 = OpFunctionCall %void %main_1
+         %76 = OpLoad %v4float %x_GLF_color
+         %77 = OpCompositeConstruct %main_out %76
+         %75 = OpFunctionCall %void %tint_symbol_3 %77
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-min-intbitstofloat-undefined-never-used/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-min-intbitstofloat-undefined-never-used/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..089465d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-min-intbitstofloat-undefined-never-used/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,51 @@
+type Arr = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+fn main_1() {
+  var f : f32;
+  f = min(bitcast<f32>(-1), 1.0);
+  let x_38 : f32 = gl_FragCoord.x;
+  let x_40 : f32 = x_7.x_GLF_uniform_float_values[0];
+  if ((x_38 > x_40)) {
+    let x_46 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_49 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_52 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_55 : i32 = x_9.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_46), f32(x_49), f32(x_52), f32(x_55));
+  } else {
+    let x_58 : f32 = f;
+    x_GLF_color = vec4<f32>(x_58, x_58, x_58, x_58);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-min-intbitstofloat-undefined-never-used/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-min-intbitstofloat-undefined-never-used/0-opt.wgsl
new file mode 100644
index 0000000..089465d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-min-intbitstofloat-undefined-never-used/0-opt.wgsl
@@ -0,0 +1,51 @@
+type Arr = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+fn main_1() {
+  var f : f32;
+  f = min(bitcast<f32>(-1), 1.0);
+  let x_38 : f32 = gl_FragCoord.x;
+  let x_40 : f32 = x_7.x_GLF_uniform_float_values[0];
+  if ((x_38 > x_40)) {
+    let x_46 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_49 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_52 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_55 : i32 = x_9.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_46), f32(x_49), f32(x_52), f32(x_55));
+  } else {
+    let x_58 : f32 = f;
+    x_GLF_color = vec4<f32>(x_58, x_58, x_58, x_58);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-min-intbitstofloat-undefined-never-used/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-min-intbitstofloat-undefined-never-used/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..3c49b30
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-min-intbitstofloat-undefined-never-used/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,48 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+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);
+cbuffer cbuffer_x_9 : register(b1, space0) {
+  uint4 x_9[2];
+};
+
+void main_1() {
+  float f = 0.0f;
+  f = min(asfloat(-1), 1.0f);
+  const float x_38 = gl_FragCoord.x;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_40 = asfloat(x_7[scalar_offset / 4][scalar_offset % 4]);
+  if ((x_38 > x_40)) {
+    const int x_46 = asint(x_9[1].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_49 = asint(x_9[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_52 = asint(x_9[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_55 = asint(x_9[1].x);
+    x_GLF_color = float4(float(x_46), float(x_49), float(x_52), float(x_55));
+  } else {
+    const float x_58 = f;
+    x_GLF_color = float4(x_58, x_58, x_58, x_58);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-min-intbitstofloat-undefined-never-used/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-min-intbitstofloat-undefined-never-used/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..bae0285
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-min-intbitstofloat-undefined-never-used/0-opt.wgsl.expected.msl
@@ -0,0 +1,58 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, constant buf1& x_9, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float f = 0.0f;
+  f = fmin(as_type<float>(-1), 1.0f);
+  float const x_38 = (*(tint_symbol_5)).x;
+  float const x_40 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_38 > x_40)) {
+    int const x_46 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_49 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    int const x_52 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    int const x_55 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_6) = float4(float(x_46), float(x_49), float(x_52), float(x_55));
+  } else {
+    float const x_58 = f;
+    *(tint_symbol_6) = float4(x_58, x_58, x_58, x_58);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]], constant buf1& x_9 [[buffer(1)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_7, x_9, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-min-intbitstofloat-undefined-never-used/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-min-intbitstofloat-undefined-never-used/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..b9c090d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-min-intbitstofloat-undefined-never-used/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,133 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 78
+; Schema: 0
+               OpCapability Shader
+         %31 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 1
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_9 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %29 = OpConstantNull %float
+     %int_n1 = OpConstant %int -1
+    %float_1 = OpConstant %float 1
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+         %65 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %23
+         %26 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %29
+         %32 = OpBitcast %float %int_n1
+         %30 = OpExtInst %float %31 NMin %32 %float_1
+               OpStore %f %30
+         %37 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %38 = OpLoad %float %37
+         %41 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %42 = OpLoad %float %41
+         %43 = OpFOrdGreaterThan %bool %38 %42
+               OpSelectionMerge %45 None
+               OpBranchConditional %43 %46 %47
+         %46 = OpLabel
+         %50 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %51 = OpLoad %int %50
+         %52 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %53 = OpLoad %int %52
+         %54 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %55 = OpLoad %int %54
+         %56 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %57 = OpLoad %int %56
+         %58 = OpConvertSToF %float %51
+         %59 = OpConvertSToF %float %53
+         %60 = OpConvertSToF %float %55
+         %61 = OpConvertSToF %float %57
+         %62 = OpCompositeConstruct %v4float %58 %59 %60 %61
+               OpStore %x_GLF_color %62
+               OpBranch %45
+         %47 = OpLabel
+         %63 = OpLoad %float %f
+         %64 = OpCompositeConstruct %v4float %63 %63 %63 %63
+               OpStore %x_GLF_color %64
+               OpBranch %45
+         %45 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %65
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %69 = OpLabel
+         %70 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %70
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %23
+         %72 = OpLabel
+         %73 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %73
+         %74 = OpFunctionCall %void %main_1
+         %76 = OpLoad %v4float %x_GLF_color
+         %77 = OpCompositeConstruct %main_out %76
+         %75 = OpFunctionCall %void %tint_symbol_3 %77
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-min-intbitstofloat-undefined-never-used/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-min-intbitstofloat-undefined-never-used/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..089465d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-min-intbitstofloat-undefined-never-used/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,51 @@
+type Arr = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+fn main_1() {
+  var f : f32;
+  f = min(bitcast<f32>(-1), 1.0);
+  let x_38 : f32 = gl_FragCoord.x;
+  let x_40 : f32 = x_7.x_GLF_uniform_float_values[0];
+  if ((x_38 > x_40)) {
+    let x_46 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_49 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_52 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_55 : i32 = x_9.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_46), f32(x_49), f32(x_52), f32(x_55));
+  } else {
+    let x_58 : f32 = f;
+    x_GLF_color = vec4<f32>(x_58, x_58, x_58, x_58);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-min-nested-loop-same-value-for-variables/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-min-nested-loop-same-value-for-variables/0-opt.spvasm
new file mode 100644
index 0000000..c4ae300
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-min-nested-loop-same-value-for-variables/0-opt.spvasm
@@ -0,0 +1,47 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color %gl_FragCoord
+               OpExecutionMode %main OriginUpperLeft
+               OpSource GLSL 430
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+       %void = OpTypeVoid
+          %6 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+%float_0_00390625 = OpConstant %float 0.00390625
+        %int = OpTypeInt 32 1
+     %uint_1 = OpConstant %uint 1
+    %float_1 = OpConstant %float 1
+       %main = OpFunction %void None %6
+         %18 = OpLabel
+         %19 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %20 = OpLoad %float %19
+         %21 = OpFMul %float %20 %float_0_00390625
+         %22 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %23 = OpLoad %float %22
+         %24 = OpConvertFToS %int %23
+         %25 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %26 = OpLoad %float %25
+         %27 = OpConvertFToS %int %26
+         %28 = OpBitwiseXor %int %24 %27
+         %29 = OpConvertSToF %float %28
+         %30 = OpFMul %float %29 %float_0_00390625
+         %31 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %32 = OpLoad %float %31
+         %33 = OpFMul %float %32 %float_0_00390625
+         %34 = OpCompositeConstruct %v4float %21 %30 %33 %float_1
+               OpStore %_GLF_color %34
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-min-nested-loop-same-value-for-variables/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-min-nested-loop-same-value-for-variables/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..5f95172
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-min-nested-loop-same-value-for-variables/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,30 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const float x_20 = gl_FragCoord.x;
+  const float x_23 = gl_FragCoord.x;
+  const float x_26 = gl_FragCoord.y;
+  const float x_32 = gl_FragCoord.y;
+  x_GLF_color = float4((x_20 * 0.00390625f), (float((int(x_23) ^ int(x_26))) * 0.00390625f), (x_32 * 0.00390625f), 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-min-nested-loop-same-value-for-variables/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-min-nested-loop-same-value-for-variables/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..6aa5c6a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-min-nested-loop-same-value-for-variables/0-opt.spvasm.expected.msl
@@ -0,0 +1,29 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float const x_20 = (*(tint_symbol_5)).x;
+  float const x_23 = (*(tint_symbol_5)).x;
+  float const x_26 = (*(tint_symbol_5)).y;
+  float const x_32 = (*(tint_symbol_5)).y;
+  *(tint_symbol_6) = float4((x_20 * 0.00390625f), (float((int(x_23) ^ int(x_26))) * 0.00390625f), (x_32 * 0.00390625f), 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(&(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-min-nested-loop-same-value-for-variables/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-min-nested-loop-same-value-for-variables/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..0a0f186
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-min-nested-loop-same-value-for-variables/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,81 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 51
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+     %uint_1 = OpConstant %uint 1
+%float_0_00390625 = OpConstant %float 0.00390625
+        %int = OpTypeInt 32 1
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+         %38 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+         %18 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %19 = OpLoad %float %18
+         %20 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %21 = OpLoad %float %20
+         %23 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %24 = OpLoad %float %23
+         %25 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %26 = OpLoad %float %25
+         %28 = OpFMul %float %19 %float_0_00390625
+         %30 = OpConvertFToS %int %21
+         %32 = OpConvertFToS %int %24
+         %33 = OpBitwiseXor %int %30 %32
+         %29 = OpConvertSToF %float %33
+         %34 = OpFMul %float %29 %float_0_00390625
+         %35 = OpFMul %float %26 %float_0_00390625
+         %37 = OpCompositeConstruct %v4float %28 %34 %35 %float_1
+               OpStore %x_GLF_color %37
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %38
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %42 = OpLabel
+         %43 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %43
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %45 = OpLabel
+         %46 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %46
+         %47 = OpFunctionCall %void %main_1
+         %49 = OpLoad %v4float %x_GLF_color
+         %50 = OpCompositeConstruct %main_out %49
+         %48 = OpFunctionCall %void %tint_symbol_3 %50
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-min-nested-loop-same-value-for-variables/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-min-nested-loop-same-value-for-variables/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..6c6f442
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-min-nested-loop-same-value-for-variables/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,24 @@
+var<private> x_GLF_color : vec4<f32>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  let x_20 : f32 = gl_FragCoord.x;
+  let x_23 : f32 = gl_FragCoord.x;
+  let x_26 : f32 = gl_FragCoord.y;
+  let x_32 : f32 = gl_FragCoord.y;
+  x_GLF_color = vec4<f32>((x_20 * 0.00390625), (f32((i32(x_23) ^ i32(x_26))) * 0.00390625), (x_32 * 0.00390625), 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-min-nested-loop-same-value-for-variables/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-min-nested-loop-same-value-for-variables/0-opt.wgsl
new file mode 100644
index 0000000..6c6f442
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-min-nested-loop-same-value-for-variables/0-opt.wgsl
@@ -0,0 +1,24 @@
+var<private> x_GLF_color : vec4<f32>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  let x_20 : f32 = gl_FragCoord.x;
+  let x_23 : f32 = gl_FragCoord.x;
+  let x_26 : f32 = gl_FragCoord.y;
+  let x_32 : f32 = gl_FragCoord.y;
+  x_GLF_color = vec4<f32>((x_20 * 0.00390625), (f32((i32(x_23) ^ i32(x_26))) * 0.00390625), (x_32 * 0.00390625), 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-min-nested-loop-same-value-for-variables/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-min-nested-loop-same-value-for-variables/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..5f95172
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-min-nested-loop-same-value-for-variables/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,30 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const float x_20 = gl_FragCoord.x;
+  const float x_23 = gl_FragCoord.x;
+  const float x_26 = gl_FragCoord.y;
+  const float x_32 = gl_FragCoord.y;
+  x_GLF_color = float4((x_20 * 0.00390625f), (float((int(x_23) ^ int(x_26))) * 0.00390625f), (x_32 * 0.00390625f), 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-min-nested-loop-same-value-for-variables/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-min-nested-loop-same-value-for-variables/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..6aa5c6a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-min-nested-loop-same-value-for-variables/0-opt.wgsl.expected.msl
@@ -0,0 +1,29 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float const x_20 = (*(tint_symbol_5)).x;
+  float const x_23 = (*(tint_symbol_5)).x;
+  float const x_26 = (*(tint_symbol_5)).y;
+  float const x_32 = (*(tint_symbol_5)).y;
+  *(tint_symbol_6) = float4((x_20 * 0.00390625f), (float((int(x_23) ^ int(x_26))) * 0.00390625f), (x_32 * 0.00390625f), 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(&(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-min-nested-loop-same-value-for-variables/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-min-nested-loop-same-value-for-variables/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..0a0f186
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-min-nested-loop-same-value-for-variables/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,81 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 51
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+     %uint_1 = OpConstant %uint 1
+%float_0_00390625 = OpConstant %float 0.00390625
+        %int = OpTypeInt 32 1
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+         %38 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+         %18 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %19 = OpLoad %float %18
+         %20 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %21 = OpLoad %float %20
+         %23 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %24 = OpLoad %float %23
+         %25 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %26 = OpLoad %float %25
+         %28 = OpFMul %float %19 %float_0_00390625
+         %30 = OpConvertFToS %int %21
+         %32 = OpConvertFToS %int %24
+         %33 = OpBitwiseXor %int %30 %32
+         %29 = OpConvertSToF %float %33
+         %34 = OpFMul %float %29 %float_0_00390625
+         %35 = OpFMul %float %26 %float_0_00390625
+         %37 = OpCompositeConstruct %v4float %28 %34 %35 %float_1
+               OpStore %x_GLF_color %37
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %38
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %42 = OpLabel
+         %43 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %43
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %45 = OpLabel
+         %46 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %46
+         %47 = OpFunctionCall %void %main_1
+         %49 = OpLoad %v4float %x_GLF_color
+         %50 = OpCompositeConstruct %main_out %49
+         %48 = OpFunctionCall %void %tint_symbol_3 %50
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-min-nested-loop-same-value-for-variables/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-min-nested-loop-same-value-for-variables/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..6c6f442
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-min-nested-loop-same-value-for-variables/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,24 @@
+var<private> x_GLF_color : vec4<f32>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  let x_20 : f32 = gl_FragCoord.x;
+  let x_23 : f32 = gl_FragCoord.x;
+  let x_26 : f32 = gl_FragCoord.y;
+  let x_32 : f32 = gl_FragCoord.y;
+  x_GLF_color = vec4<f32>((x_20 * 0.00390625), (f32((i32(x_23) ^ i32(x_26))) * 0.00390625), (x_32 * 0.00390625), 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-missing-return-value-function-never-called/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-missing-return-value-function-never-called/0-opt.spvasm
new file mode 100644
index 0000000..47315d3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-missing-return-value-function-never-called/0-opt.spvasm
@@ -0,0 +1,111 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %func_ "func("
+               OpName %v "v"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "one"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_1 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+         %15 = OpTypeFunction %float
+        %int = OpTypeInt 32 1
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+         %21 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+       %buf1 = OpTypeStruct %uint
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+     %uint_2 = OpConstant %uint 2
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %33 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+%_arr_int_uint_1 = OpTypeArray %int %uint_1
+       %buf0 = OpTypeStruct %_arr_int_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %main = OpFunction %void None %13
+         %36 = OpLabel
+          %v = OpVariable %_ptr_Function_v4float Function
+               OpStore %v %21
+         %37 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %38 = OpLoad %float %37
+         %39 = OpFOrdLessThan %bool %38 %float_0
+               OpSelectionMerge %40 None
+               OpBranchConditional %39 %41 %40
+         %41 = OpLabel
+         %42 = OpFunctionCall %float %func_
+         %43 = OpCompositeConstruct %v4float %42 %42 %42 %42
+               OpStore %v %43
+               OpBranch %40
+         %40 = OpLabel
+         %44 = OpLoad %v4float %v
+         %45 = OpExtInst %uint %1 PackUnorm4x8 %44
+         %46 = OpIEqual %bool %45 %uint_1
+               OpSelectionMerge %47 None
+               OpBranchConditional %46 %48 %47
+         %48 = OpLabel
+               OpReturn
+         %47 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_uint %_ %int_0
+         %50 = OpLoad %uint %49
+         %51 = OpShiftLeftLogical %uint %uint_1 %50
+         %52 = OpIEqual %bool %51 %uint_2
+               OpSelectionMerge %53 None
+               OpBranchConditional %52 %54 %55
+         %54 = OpLabel
+               OpStore %_GLF_color %33
+               OpBranch %53
+         %55 = OpLabel
+         %56 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %57 = OpLoad %int %56
+         %58 = OpConvertSToF %float %57
+         %59 = OpCompositeConstruct %v4float %58 %58 %58 %58
+               OpStore %_GLF_color %59
+               OpBranch %53
+         %53 = OpLabel
+               OpReturn
+               OpFunctionEnd
+      %func_ = OpFunction %float None %15
+         %60 = OpLabel
+               OpSelectionMerge %61 None
+               OpSwitch %int_1 %61 0 %62
+         %62 = OpLabel
+               OpReturnValue %float_1
+         %61 = OpLabel
+         %63 = OpUndef %float
+               OpReturnValue %63
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-missing-return-value-function-never-called/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-missing-return-value-function-never-called/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..94cc273
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-missing-return-value-function-never-called/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,68 @@
+uint tint_pack4x8unorm(float4 param_0) {
+  uint4 i = uint4(round(clamp(param_0, 0.0, 1.0) * 255.0));
+  return (i.x | i.y << 8 | i.z << 16 | i.w << 24);
+}
+
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[1];
+};
+
+float func_() {
+  switch(1) {
+    case 0: {
+      return 1.0f;
+      break;
+    }
+    default: {
+      break;
+    }
+  }
+  return 0.0f;
+}
+
+void main_1() {
+  float4 v = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  v = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  const float x_38 = gl_FragCoord.y;
+  if ((x_38 < 0.0f)) {
+    const float x_42 = func_();
+    v = float4(x_42, x_42, x_42, x_42);
+  }
+  if ((tint_pack4x8unorm(v) == 1u)) {
+    return;
+  }
+  const uint x_50 = x_8[0].x;
+  if (((1u << x_50) == 2u)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_57 = asint(x_10[scalar_offset / 4][scalar_offset % 4]);
+    const float x_58 = float(x_57);
+    x_GLF_color = float4(x_58, x_58, x_58, x_58);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-missing-return-value-function-never-called/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-missing-return-value-function-never-called/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..421d745
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-missing-return-value-function-never-called/0-opt.spvasm.expected.msl
@@ -0,0 +1,69 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf1 {
+  /* 0x0000 */ uint one;
+};
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float func_() {
+  switch(1) {
+    case 0: {
+      return 1.0f;
+      break;
+    }
+    default: {
+      break;
+    }
+  }
+  return 0.0f;
+}
+
+void main_1(constant buf1& x_8, constant buf0& x_10, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float4 v = 0.0f;
+  v = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  float const x_38 = (*(tint_symbol_5)).y;
+  if ((x_38 < 0.0f)) {
+    float const x_42 = func_();
+    v = float4(x_42, x_42, x_42, x_42);
+  }
+  float4 const x_44 = v;
+  if ((pack_float_to_unorm4x8(x_44) == 1u)) {
+    return;
+  }
+  uint const x_50 = x_8.one;
+  if (((1u << x_50) == 2u)) {
+    *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    int const x_57 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    float const x_58 = float(x_57);
+    *(tint_symbol_6) = float4(x_58, x_58, x_58, x_58);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf1& x_8 [[buffer(1)]], constant buf0& x_10 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_8, x_10, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-missing-return-value-function-never-called/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-missing-return-value-function-never-called/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..8cf95c0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-missing-return-value-function-never-called/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,150 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 82
+; Schema: 0
+               OpCapability Shader
+         %48 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "one"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %func_ "func_"
+               OpName %main_1 "main_1"
+               OpName %v "v"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_1 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+       %uint = OpTypeInt 32 0
+       %buf1 = OpTypeStruct %uint
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+     %uint_1 = OpConstant %uint 1
+%_arr_int_uint_1 = OpTypeArray %int %uint_1
+       %buf0 = OpTypeStruct %_arr_int_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+         %21 = OpTypeFunction %float
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+         %36 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+%_ptr_Private_float = OpTypePointer Private %float
+       %bool = OpTypeBool
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+     %uint_2 = OpConstant %uint 2
+         %62 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+         %69 = OpTypeFunction %void %main_out
+      %func_ = OpFunction %float None %21
+         %23 = OpLabel
+               OpSelectionMerge %24 None
+               OpSwitch %int_1 %26 0 %27
+         %27 = OpLabel
+               OpReturnValue %float_1
+         %26 = OpLabel
+               OpBranch %24
+         %24 = OpLabel
+               OpReturnValue %float_0
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %30
+         %33 = OpLabel
+          %v = OpVariable %_ptr_Function_v4float Function %5
+               OpStore %v %36
+         %38 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %39 = OpLoad %float %38
+         %40 = OpFOrdLessThan %bool %39 %float_0
+               OpSelectionMerge %42 None
+               OpBranchConditional %40 %43 %42
+         %43 = OpLabel
+         %44 = OpFunctionCall %float %func_
+         %45 = OpCompositeConstruct %v4float %44 %44 %44 %44
+               OpStore %v %45
+               OpBranch %42
+         %42 = OpLabel
+         %46 = OpLoad %v4float %v
+         %47 = OpExtInst %uint %48 PackUnorm4x8 %46
+         %49 = OpIEqual %bool %47 %uint_1
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %50
+         %51 = OpLabel
+               OpReturn
+         %50 = OpLabel
+         %54 = OpAccessChain %_ptr_Uniform_uint %x_8 %uint_0
+         %55 = OpLoad %uint %54
+         %56 = OpShiftLeftLogical %uint %uint_1 %55
+         %58 = OpIEqual %bool %56 %uint_2
+               OpSelectionMerge %59 None
+               OpBranchConditional %58 %60 %61
+         %60 = OpLabel
+               OpStore %x_GLF_color %62
+               OpBranch %59
+         %61 = OpLabel
+         %65 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %66 = OpLoad %int %65
+         %67 = OpConvertSToF %float %66
+         %68 = OpCompositeConstruct %v4float %67 %67 %67 %67
+               OpStore %x_GLF_color %68
+               OpBranch %59
+         %59 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %69
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %73 = OpLabel
+         %74 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %74
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %30
+         %76 = OpLabel
+         %77 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %77
+         %78 = OpFunctionCall %void %main_1
+         %80 = OpLoad %v4float %x_GLF_color
+         %81 = OpCompositeConstruct %main_out %80
+         %79 = OpFunctionCall %void %tint_symbol_3 %81
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-missing-return-value-function-never-called/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-missing-return-value-function-never-called/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..3db210a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-missing-return-value-function-never-called/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,65 @@
+[[block]]
+struct buf1 {
+  one : u32;
+};
+
+type Arr = [[stride(16)]] array<i32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+fn func_() -> f32 {
+  switch(1) {
+    case 0: {
+      return 1.0;
+    }
+    default: {
+    }
+  }
+  return 0.0;
+}
+
+fn main_1() {
+  var v : vec4<f32>;
+  v = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+  let x_38 : f32 = gl_FragCoord.y;
+  if ((x_38 < 0.0)) {
+    let x_42 : f32 = func_();
+    v = vec4<f32>(x_42, x_42, x_42, x_42);
+  }
+  let x_44 : vec4<f32> = v;
+  if ((pack4x8unorm(x_44) == 1u)) {
+    return;
+  }
+  let x_50 : u32 = x_8.one;
+  if (((1u << x_50) == 2u)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    let x_57 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_58 : f32 = f32(x_57);
+    x_GLF_color = vec4<f32>(x_58, x_58, x_58, x_58);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-missing-return-value-function-never-called/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-missing-return-value-function-never-called/0-opt.wgsl
new file mode 100644
index 0000000..3db210a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-missing-return-value-function-never-called/0-opt.wgsl
@@ -0,0 +1,65 @@
+[[block]]
+struct buf1 {
+  one : u32;
+};
+
+type Arr = [[stride(16)]] array<i32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+fn func_() -> f32 {
+  switch(1) {
+    case 0: {
+      return 1.0;
+    }
+    default: {
+    }
+  }
+  return 0.0;
+}
+
+fn main_1() {
+  var v : vec4<f32>;
+  v = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+  let x_38 : f32 = gl_FragCoord.y;
+  if ((x_38 < 0.0)) {
+    let x_42 : f32 = func_();
+    v = vec4<f32>(x_42, x_42, x_42, x_42);
+  }
+  let x_44 : vec4<f32> = v;
+  if ((pack4x8unorm(x_44) == 1u)) {
+    return;
+  }
+  let x_50 : u32 = x_8.one;
+  if (((1u << x_50) == 2u)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    let x_57 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_58 : f32 = f32(x_57);
+    x_GLF_color = vec4<f32>(x_58, x_58, x_58, x_58);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-missing-return-value-function-never-called/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-missing-return-value-function-never-called/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..94cc273
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-missing-return-value-function-never-called/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,68 @@
+uint tint_pack4x8unorm(float4 param_0) {
+  uint4 i = uint4(round(clamp(param_0, 0.0, 1.0) * 255.0));
+  return (i.x | i.y << 8 | i.z << 16 | i.w << 24);
+}
+
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[1];
+};
+
+float func_() {
+  switch(1) {
+    case 0: {
+      return 1.0f;
+      break;
+    }
+    default: {
+      break;
+    }
+  }
+  return 0.0f;
+}
+
+void main_1() {
+  float4 v = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  v = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  const float x_38 = gl_FragCoord.y;
+  if ((x_38 < 0.0f)) {
+    const float x_42 = func_();
+    v = float4(x_42, x_42, x_42, x_42);
+  }
+  if ((tint_pack4x8unorm(v) == 1u)) {
+    return;
+  }
+  const uint x_50 = x_8[0].x;
+  if (((1u << x_50) == 2u)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_57 = asint(x_10[scalar_offset / 4][scalar_offset % 4]);
+    const float x_58 = float(x_57);
+    x_GLF_color = float4(x_58, x_58, x_58, x_58);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-missing-return-value-function-never-called/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-missing-return-value-function-never-called/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..421d745
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-missing-return-value-function-never-called/0-opt.wgsl.expected.msl
@@ -0,0 +1,69 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf1 {
+  /* 0x0000 */ uint one;
+};
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float func_() {
+  switch(1) {
+    case 0: {
+      return 1.0f;
+      break;
+    }
+    default: {
+      break;
+    }
+  }
+  return 0.0f;
+}
+
+void main_1(constant buf1& x_8, constant buf0& x_10, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float4 v = 0.0f;
+  v = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  float const x_38 = (*(tint_symbol_5)).y;
+  if ((x_38 < 0.0f)) {
+    float const x_42 = func_();
+    v = float4(x_42, x_42, x_42, x_42);
+  }
+  float4 const x_44 = v;
+  if ((pack_float_to_unorm4x8(x_44) == 1u)) {
+    return;
+  }
+  uint const x_50 = x_8.one;
+  if (((1u << x_50) == 2u)) {
+    *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    int const x_57 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    float const x_58 = float(x_57);
+    *(tint_symbol_6) = float4(x_58, x_58, x_58, x_58);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf1& x_8 [[buffer(1)]], constant buf0& x_10 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_8, x_10, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-missing-return-value-function-never-called/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-missing-return-value-function-never-called/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..8cf95c0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-missing-return-value-function-never-called/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,150 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 82
+; Schema: 0
+               OpCapability Shader
+         %48 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "one"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %func_ "func_"
+               OpName %main_1 "main_1"
+               OpName %v "v"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_1 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+       %uint = OpTypeInt 32 0
+       %buf1 = OpTypeStruct %uint
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+     %uint_1 = OpConstant %uint 1
+%_arr_int_uint_1 = OpTypeArray %int %uint_1
+       %buf0 = OpTypeStruct %_arr_int_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+         %21 = OpTypeFunction %float
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+         %36 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+%_ptr_Private_float = OpTypePointer Private %float
+       %bool = OpTypeBool
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+     %uint_2 = OpConstant %uint 2
+         %62 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+         %69 = OpTypeFunction %void %main_out
+      %func_ = OpFunction %float None %21
+         %23 = OpLabel
+               OpSelectionMerge %24 None
+               OpSwitch %int_1 %26 0 %27
+         %27 = OpLabel
+               OpReturnValue %float_1
+         %26 = OpLabel
+               OpBranch %24
+         %24 = OpLabel
+               OpReturnValue %float_0
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %30
+         %33 = OpLabel
+          %v = OpVariable %_ptr_Function_v4float Function %5
+               OpStore %v %36
+         %38 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %39 = OpLoad %float %38
+         %40 = OpFOrdLessThan %bool %39 %float_0
+               OpSelectionMerge %42 None
+               OpBranchConditional %40 %43 %42
+         %43 = OpLabel
+         %44 = OpFunctionCall %float %func_
+         %45 = OpCompositeConstruct %v4float %44 %44 %44 %44
+               OpStore %v %45
+               OpBranch %42
+         %42 = OpLabel
+         %46 = OpLoad %v4float %v
+         %47 = OpExtInst %uint %48 PackUnorm4x8 %46
+         %49 = OpIEqual %bool %47 %uint_1
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %50
+         %51 = OpLabel
+               OpReturn
+         %50 = OpLabel
+         %54 = OpAccessChain %_ptr_Uniform_uint %x_8 %uint_0
+         %55 = OpLoad %uint %54
+         %56 = OpShiftLeftLogical %uint %uint_1 %55
+         %58 = OpIEqual %bool %56 %uint_2
+               OpSelectionMerge %59 None
+               OpBranchConditional %58 %60 %61
+         %60 = OpLabel
+               OpStore %x_GLF_color %62
+               OpBranch %59
+         %61 = OpLabel
+         %65 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %66 = OpLoad %int %65
+         %67 = OpConvertSToF %float %66
+         %68 = OpCompositeConstruct %v4float %67 %67 %67 %67
+               OpStore %x_GLF_color %68
+               OpBranch %59
+         %59 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %69
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %73 = OpLabel
+         %74 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %74
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %30
+         %76 = OpLabel
+         %77 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %77
+         %78 = OpFunctionCall %void %main_1
+         %80 = OpLoad %v4float %x_GLF_color
+         %81 = OpCompositeConstruct %main_out %80
+         %79 = OpFunctionCall %void %tint_symbol_3 %81
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-missing-return-value-function-never-called/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-missing-return-value-function-never-called/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..3db210a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-missing-return-value-function-never-called/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,65 @@
+[[block]]
+struct buf1 {
+  one : u32;
+};
+
+type Arr = [[stride(16)]] array<i32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+fn func_() -> f32 {
+  switch(1) {
+    case 0: {
+      return 1.0;
+    }
+    default: {
+    }
+  }
+  return 0.0;
+}
+
+fn main_1() {
+  var v : vec4<f32>;
+  v = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+  let x_38 : f32 = gl_FragCoord.y;
+  if ((x_38 < 0.0)) {
+    let x_42 : f32 = func_();
+    v = vec4<f32>(x_42, x_42, x_42, x_42);
+  }
+  let x_44 : vec4<f32> = v;
+  if ((pack4x8unorm(x_44) == 1u)) {
+    return;
+  }
+  let x_50 : u32 = x_8.one;
+  if (((1u << x_50) == 2u)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    let x_57 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_58 : f32 = f32(x_57);
+    x_GLF_color = vec4<f32>(x_58, x_58, x_58, x_58);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-mod-uint-bits-float/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-mod-uint-bits-float/0-opt.spvasm
new file mode 100644
index 0000000..1499e61
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-mod-uint-bits-float/0-opt.spvasm
@@ -0,0 +1,70 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+    %float_1 = OpConstant %float 1
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf0 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+       %main = OpFunction %void None %9
+         %25 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function
+         %26 = OpBitcast %float %uint_1
+         %27 = OpFMod %float %26 %float_1
+               OpStore %a %27
+         %28 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %29 = OpLoad %float %28
+         %30 = OpCompositeConstruct %v4float %29 %29 %29 %29
+               OpStore %_GLF_color %30
+         %31 = OpLoad %float %a
+         %32 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %33 = OpLoad %float %32
+         %34 = OpFOrdLessThan %bool %31 %33
+               OpSelectionMerge %35 None
+               OpBranchConditional %34 %36 %35
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %38 = OpLoad %float %37
+         %39 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %40 = OpLoad %float %39
+         %41 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %42 = OpLoad %float %41
+         %43 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %44 = OpLoad %float %43
+         %45 = OpCompositeConstruct %v4float %38 %40 %42 %44
+               OpStore %_GLF_color %45
+               OpBranch %35
+         %35 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-mod-uint-bits-float/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-mod-uint-bits-float/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..307332d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-mod-uint-bits-float/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,37 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[3];
+};
+
+void main_1() {
+  float a = 0.0f;
+  a = (asfloat(1u) % 1.0f);
+  const float x_29 = asfloat(x_6[1].x);
+  x_GLF_color = float4(x_29, x_29, x_29, x_29);
+  const float x_31 = a;
+  const float x_33 = asfloat(x_6[2].x);
+  if ((x_31 < x_33)) {
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const float x_38 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+    const float x_40 = asfloat(x_6[1].x);
+    const float x_42 = asfloat(x_6[1].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const float x_44 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    x_GLF_color = float4(x_38, x_40, x_42, x_44);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-mod-uint-bits-float/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-mod-uint-bits-float/0-opt.spvasm.expected.msl
new file mode 100755
index 0000000..6652116
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-mod-uint-bits-float/0-opt.spvasm.expected.msl
@@ -0,0 +1,52 @@
+SKIP: FAILED
+
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float a = 0.0f;
+  a = (as_type<float>(1u) % 1.0f);
+  float const x_29 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  *(tint_symbol_4) = float4(x_29, x_29, x_29, x_29);
+  float const x_31 = a;
+  float const x_33 = x_6.x_GLF_uniform_float_values.arr[2].el;
+  if ((x_31 < x_33)) {
+    float const x_38 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    float const x_40 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    float const x_42 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    float const x_44 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    *(tint_symbol_4) = float4(x_38, x_40, x_42, x_44);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
+T:\tmp\uf8c.0.metal:23:27: error: invalid operands to binary expression ('float' and 'float')
+  a = (as_type<float>(1u) % 1.0f);
+       ~~~~~~~~~~~~~~~~~~ ^ ~~~~
+1 error generated.
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-mod-uint-bits-float/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-mod-uint-bits-float/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..5169c11
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-mod-uint-bits-float/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,103 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 62
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf0 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %20 = OpConstantNull %float
+     %uint_1 = OpConstant %uint 1
+    %float_1 = OpConstant %float 1
+     %uint_0 = OpConstant %uint 0
+        %int = OpTypeInt 32 1
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+      %int_0 = OpConstant %int 0
+   %main_out = OpTypeStruct %v4float
+         %50 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function %20
+         %21 = OpBitcast %float %uint_1
+         %24 = OpFMod %float %21 %float_1
+               OpStore %a %24
+         %29 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %30 = OpLoad %float %29
+         %31 = OpCompositeConstruct %v4float %30 %30 %30 %30
+               OpStore %x_GLF_color %31
+         %32 = OpLoad %float %a
+         %34 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %35 = OpLoad %float %34
+         %36 = OpFOrdLessThan %bool %32 %35
+               OpSelectionMerge %38 None
+               OpBranchConditional %36 %39 %38
+         %39 = OpLabel
+         %41 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %42 = OpLoad %float %41
+         %43 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %44 = OpLoad %float %43
+         %45 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %46 = OpLoad %float %45
+         %47 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %48 = OpLoad %float %47
+         %49 = OpCompositeConstruct %v4float %42 %44 %46 %48
+               OpStore %x_GLF_color %49
+               OpBranch %38
+         %38 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %50
+%tint_symbol = OpFunctionParameter %main_out
+         %54 = OpLabel
+         %55 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %55
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %57 = OpLabel
+         %58 = OpFunctionCall %void %main_1
+         %60 = OpLoad %v4float %x_GLF_color
+         %61 = OpCompositeConstruct %main_out %60
+         %59 = OpFunctionCall %void %tint_symbol_2 %61
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-mod-uint-bits-float/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-mod-uint-bits-float/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..8f1d936
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-mod-uint-bits-float/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,38 @@
+type Arr = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+fn main_1() {
+  var a : f32;
+  a = (bitcast<f32>(1u) % 1.0);
+  let x_29 : f32 = x_6.x_GLF_uniform_float_values[1];
+  x_GLF_color = vec4<f32>(x_29, x_29, x_29, x_29);
+  let x_31 : f32 = a;
+  let x_33 : f32 = x_6.x_GLF_uniform_float_values[2];
+  if ((x_31 < x_33)) {
+    let x_38 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_40 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_42 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_44 : f32 = x_6.x_GLF_uniform_float_values[0];
+    x_GLF_color = vec4<f32>(x_38, x_40, x_42, x_44);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-mod-uint-bits-float/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-mod-uint-bits-float/0-opt.wgsl
new file mode 100644
index 0000000..8f1d936
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-mod-uint-bits-float/0-opt.wgsl
@@ -0,0 +1,38 @@
+type Arr = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+fn main_1() {
+  var a : f32;
+  a = (bitcast<f32>(1u) % 1.0);
+  let x_29 : f32 = x_6.x_GLF_uniform_float_values[1];
+  x_GLF_color = vec4<f32>(x_29, x_29, x_29, x_29);
+  let x_31 : f32 = a;
+  let x_33 : f32 = x_6.x_GLF_uniform_float_values[2];
+  if ((x_31 < x_33)) {
+    let x_38 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_40 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_42 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_44 : f32 = x_6.x_GLF_uniform_float_values[0];
+    x_GLF_color = vec4<f32>(x_38, x_40, x_42, x_44);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-mod-uint-bits-float/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-mod-uint-bits-float/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..307332d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-mod-uint-bits-float/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,37 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[3];
+};
+
+void main_1() {
+  float a = 0.0f;
+  a = (asfloat(1u) % 1.0f);
+  const float x_29 = asfloat(x_6[1].x);
+  x_GLF_color = float4(x_29, x_29, x_29, x_29);
+  const float x_31 = a;
+  const float x_33 = asfloat(x_6[2].x);
+  if ((x_31 < x_33)) {
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const float x_38 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+    const float x_40 = asfloat(x_6[1].x);
+    const float x_42 = asfloat(x_6[1].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const float x_44 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    x_GLF_color = float4(x_38, x_40, x_42, x_44);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-mod-uint-bits-float/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-mod-uint-bits-float/0-opt.wgsl.expected.msl
new file mode 100755
index 0000000..da17ed9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-mod-uint-bits-float/0-opt.wgsl.expected.msl
@@ -0,0 +1,52 @@
+SKIP: FAILED
+
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float a = 0.0f;
+  a = (as_type<float>(1u) % 1.0f);
+  float const x_29 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  *(tint_symbol_4) = float4(x_29, x_29, x_29, x_29);
+  float const x_31 = a;
+  float const x_33 = x_6.x_GLF_uniform_float_values.arr[2].el;
+  if ((x_31 < x_33)) {
+    float const x_38 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    float const x_40 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    float const x_42 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    float const x_44 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    *(tint_symbol_4) = float4(x_38, x_40, x_42, x_44);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
+T:\tmp\ue28.0.metal:23:27: error: invalid operands to binary expression ('float' and 'float')
+  a = (as_type<float>(1u) % 1.0f);
+       ~~~~~~~~~~~~~~~~~~ ^ ~~~~
+1 error generated.
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-mod-uint-bits-float/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-mod-uint-bits-float/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..5169c11
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-mod-uint-bits-float/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,103 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 62
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf0 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %20 = OpConstantNull %float
+     %uint_1 = OpConstant %uint 1
+    %float_1 = OpConstant %float 1
+     %uint_0 = OpConstant %uint 0
+        %int = OpTypeInt 32 1
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+      %int_0 = OpConstant %int 0
+   %main_out = OpTypeStruct %v4float
+         %50 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function %20
+         %21 = OpBitcast %float %uint_1
+         %24 = OpFMod %float %21 %float_1
+               OpStore %a %24
+         %29 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %30 = OpLoad %float %29
+         %31 = OpCompositeConstruct %v4float %30 %30 %30 %30
+               OpStore %x_GLF_color %31
+         %32 = OpLoad %float %a
+         %34 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %35 = OpLoad %float %34
+         %36 = OpFOrdLessThan %bool %32 %35
+               OpSelectionMerge %38 None
+               OpBranchConditional %36 %39 %38
+         %39 = OpLabel
+         %41 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %42 = OpLoad %float %41
+         %43 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %44 = OpLoad %float %43
+         %45 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %46 = OpLoad %float %45
+         %47 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %48 = OpLoad %float %47
+         %49 = OpCompositeConstruct %v4float %42 %44 %46 %48
+               OpStore %x_GLF_color %49
+               OpBranch %38
+         %38 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %50
+%tint_symbol = OpFunctionParameter %main_out
+         %54 = OpLabel
+         %55 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %55
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %57 = OpLabel
+         %58 = OpFunctionCall %void %main_1
+         %60 = OpLoad %v4float %x_GLF_color
+         %61 = OpCompositeConstruct %main_out %60
+         %59 = OpFunctionCall %void %tint_symbol_2 %61
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-mod-uint-bits-float/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-mod-uint-bits-float/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..8f1d936
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-mod-uint-bits-float/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,38 @@
+type Arr = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+fn main_1() {
+  var a : f32;
+  a = (bitcast<f32>(1u) % 1.0);
+  let x_29 : f32 = x_6.x_GLF_uniform_float_values[1];
+  x_GLF_color = vec4<f32>(x_29, x_29, x_29, x_29);
+  let x_31 : f32 = a;
+  let x_33 : f32 = x_6.x_GLF_uniform_float_values[2];
+  if ((x_31 < x_33)) {
+    let x_38 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_40 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_42 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_44 : f32 = x_6.x_GLF_uniform_float_values[0];
+    x_GLF_color = vec4<f32>(x_38, x_40, x_42, x_44);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-modulo-zero-never-executed/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-modulo-zero-never-executed/0-opt.spvasm
new file mode 100644
index 0000000..7ea2f77
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-modulo-zero-never-executed/0-opt.spvasm
@@ -0,0 +1,127 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_uint_values"
+               OpName %__1 ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %buf2 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 2
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %_arr_uint_uint_1 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__1 DescriptorSet 0
+               OpDecorate %__1 Binding 1
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %17 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+     %uint_0 = OpConstant %uint 0
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf2 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+          %_ = OpVariable %_ptr_Uniform_buf2 Uniform
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+%_ptr_Input_float = OpTypePointer Input %float
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+%_arr_uint_uint_1 = OpTypeArray %uint %uint_1
+       %buf1 = OpTypeStruct %_arr_uint_uint_1
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__1 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %17
+         %39 = OpLabel
+          %a = OpVariable %_ptr_Function_uint Function
+          %b = OpVariable %_ptr_Function_int Function
+               OpStore %a %uint_0
+         %40 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %41 = OpLoad %int %40
+               OpStore %b %41
+         %42 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %43 = OpLoad %float %42
+         %44 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %45 = OpLoad %float %44
+         %46 = OpFOrdLessThan %bool %43 %45
+               OpSelectionMerge %47 None
+               OpBranchConditional %46 %48 %47
+         %48 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_uint %__1 %int_0 %int_0
+         %50 = OpLoad %uint %49
+         %51 = OpLoad %uint %a
+         %52 = OpUMod %uint %50 %51
+         %53 = OpBitcast %int %52
+               OpStore %b %53
+               OpBranch %47
+         %47 = OpLabel
+         %54 = OpLoad %int %b
+         %55 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %56 = OpLoad %int %55
+         %57 = OpIEqual %bool %54 %56
+               OpSelectionMerge %58 None
+               OpBranchConditional %57 %59 %60
+         %59 = OpLabel
+         %61 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %62 = OpLoad %int %61
+         %63 = OpConvertSToF %float %62
+         %64 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %65 = OpLoad %int %64
+         %66 = OpConvertSToF %float %65
+         %67 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %68 = OpLoad %int %67
+         %69 = OpConvertSToF %float %68
+         %70 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %71 = OpLoad %int %70
+         %72 = OpConvertSToF %float %71
+         %73 = OpCompositeConstruct %v4float %63 %66 %69 %72
+               OpStore %_GLF_color %73
+               OpBranch %58
+         %60 = OpLabel
+         %74 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %75 = OpLoad %int %74
+         %76 = OpConvertSToF %float %75
+         %77 = OpCompositeConstruct %v4float %76 %76 %76 %76
+               OpStore %_GLF_color %77
+               OpBranch %58
+         %58 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-modulo-zero-never-executed/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-modulo-zero-never-executed/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..df48733
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-modulo-zero-never-executed/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,63 @@
+cbuffer cbuffer_x_8 : register(b2, space0) {
+  uint4 x_8[2];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[1];
+};
+cbuffer cbuffer_x_12 : register(b1, space0) {
+  uint4 x_12[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  uint a = 0u;
+  int b = 0;
+  a = 0u;
+  const int x_41 = asint(x_8[1].x);
+  b = x_41;
+  const float x_43 = gl_FragCoord.x;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_45 = asfloat(x_10[scalar_offset / 4][scalar_offset % 4]);
+  if ((x_43 < x_45)) {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const uint x_50 = x_12[scalar_offset_1 / 4][scalar_offset_1 % 4];
+    b = asint((x_50 % a));
+  }
+  const int x_54 = b;
+  const int x_56 = asint(x_8[1].x);
+  if ((x_54 == x_56)) {
+    const int x_62 = asint(x_8[1].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_65 = asint(x_8[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_68 = asint(x_8[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const int x_71 = asint(x_8[1].x);
+    x_GLF_color = float4(float(x_62), float(x_65), float(x_68), float(x_71));
+  } else {
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_75 = asint(x_8[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const float x_76 = float(x_75);
+    x_GLF_color = float4(x_76, x_76, x_76, x_76);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_7 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_7;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-modulo-zero-never-executed/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-modulo-zero-never-executed/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..2639d33
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-modulo-zero-never-executed/0-opt.spvasm.expected.msl
@@ -0,0 +1,79 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf2 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_2 {
+  /* 0x0000 */ uint el;
+  /* 0x0004 */ int8_t tint_pad_2[12];
+};
+struct tint_array_wrapper_2 {
+  /* 0x0000 */ tint_padded_array_element_2 arr[1];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_2 x_GLF_uniform_uint_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf2& x_8, constant buf0& x_10, constant buf1& x_12, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  uint a = 0u;
+  int b = 0;
+  a = 0u;
+  int const x_41 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  b = x_41;
+  float const x_43 = (*(tint_symbol_5)).x;
+  float const x_45 = x_10.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_43 < x_45)) {
+    uint const x_50 = x_12.x_GLF_uniform_uint_values.arr[0].el;
+    uint const x_51 = a;
+    b = as_type<int>((x_50 % x_51));
+  }
+  int const x_54 = b;
+  int const x_56 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_54 == x_56)) {
+    int const x_62 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    int const x_65 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    int const x_68 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    int const x_71 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_6) = float4(float(x_62), float(x_65), float(x_68), float(x_71));
+  } else {
+    int const x_75 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    float const x_76 = float(x_75);
+    *(tint_symbol_6) = float4(x_76, x_76, x_76, x_76);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf2& x_8 [[buffer(2)]], constant buf0& x_10 [[buffer(0)]], constant buf1& x_12 [[buffer(1)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_8, x_10, x_12, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-modulo-zero-never-executed/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-modulo-zero-never-executed/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..7ecd623
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-modulo-zero-never-executed/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,166 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 96
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "x_GLF_uniform_int_values"
+               OpName %x_8 "x_8"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_10 "x_10"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_uint_values"
+               OpName %x_12 "x_12"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf2 Block
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 2
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_uint_uint_1 ArrayStride 16
+               OpDecorate %x_12 NonWritable
+               OpDecorate %x_12 DescriptorSet 0
+               OpDecorate %x_12 Binding 1
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf2 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+        %x_8 = OpVariable %_ptr_Uniform_buf2 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %12
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_arr_uint_uint_1 = OpTypeArray %uint %uint_1
+       %buf1 = OpTypeStruct %_arr_uint_uint_1
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_12 = OpVariable %_ptr_Uniform_buf1 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
+%_ptr_Function_uint = OpTypePointer Function %uint
+         %33 = OpConstantNull %uint
+%_ptr_Function_int = OpTypePointer Function %int
+         %36 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Private_float = OpTypePointer Private %float
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+   %main_out = OpTypeStruct %v4float
+         %83 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %27
+         %30 = OpLabel
+          %a = OpVariable %_ptr_Function_uint Function %33
+          %b = OpVariable %_ptr_Function_int Function %36
+               OpStore %a %uint_0
+         %40 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %41 = OpLoad %int %40
+               OpStore %b %41
+         %43 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %44 = OpLoad %float %43
+         %47 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_0
+         %48 = OpLoad %float %47
+         %49 = OpFOrdLessThan %bool %44 %48
+               OpSelectionMerge %51 None
+               OpBranchConditional %49 %52 %51
+         %52 = OpLabel
+         %54 = OpAccessChain %_ptr_Uniform_uint %x_12 %uint_0 %int_0
+         %55 = OpLoad %uint %54
+         %56 = OpLoad %uint %a
+         %58 = OpUMod %uint %55 %56
+         %57 = OpBitcast %int %58
+               OpStore %b %57
+               OpBranch %51
+         %51 = OpLabel
+         %59 = OpLoad %int %b
+         %60 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %61 = OpLoad %int %60
+         %62 = OpIEqual %bool %59 %61
+               OpSelectionMerge %63 None
+               OpBranchConditional %62 %64 %65
+         %64 = OpLabel
+         %66 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %67 = OpLoad %int %66
+         %68 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %69 = OpLoad %int %68
+         %70 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %71 = OpLoad %int %70
+         %72 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %73 = OpLoad %int %72
+         %74 = OpConvertSToF %float %67
+         %75 = OpConvertSToF %float %69
+         %76 = OpConvertSToF %float %71
+         %77 = OpConvertSToF %float %73
+         %78 = OpCompositeConstruct %v4float %74 %75 %76 %77
+               OpStore %x_GLF_color %78
+               OpBranch %63
+         %65 = OpLabel
+         %79 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %80 = OpLoad %int %79
+         %81 = OpConvertSToF %float %80
+         %82 = OpCompositeConstruct %v4float %81 %81 %81 %81
+               OpStore %x_GLF_color %82
+               OpBranch %63
+         %63 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %83
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %87 = OpLabel
+         %88 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %88
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %27
+         %90 = OpLabel
+         %91 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %91
+         %92 = OpFunctionCall %void %main_1
+         %94 = OpLoad %v4float %x_GLF_color
+         %95 = OpCompositeConstruct %main_out %94
+         %93 = OpFunctionCall %void %tint_symbol_3 %95
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-modulo-zero-never-executed/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-modulo-zero-never-executed/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..5204e88
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-modulo-zero-never-executed/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,71 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf2 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+type Arr_2 = [[stride(16)]] array<u32, 1>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_uint_values : Arr_2;
+};
+
+[[group(0), binding(2)]] var<uniform> x_8 : buf2;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_12 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : u32;
+  var b : i32;
+  a = 0u;
+  let x_41 : i32 = x_8.x_GLF_uniform_int_values[1];
+  b = x_41;
+  let x_43 : f32 = gl_FragCoord.x;
+  let x_45 : f32 = x_10.x_GLF_uniform_float_values[0];
+  if ((x_43 < x_45)) {
+    let x_50 : u32 = x_12.x_GLF_uniform_uint_values[0];
+    let x_51 : u32 = a;
+    b = bitcast<i32>((x_50 % x_51));
+  }
+  let x_54 : i32 = b;
+  let x_56 : i32 = x_8.x_GLF_uniform_int_values[1];
+  if ((x_54 == x_56)) {
+    let x_62 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_65 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_68 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_71 : i32 = x_8.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_62), f32(x_65), f32(x_68), f32(x_71));
+  } else {
+    let x_75 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_76 : f32 = f32(x_75);
+    x_GLF_color = vec4<f32>(x_76, x_76, x_76, x_76);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-modulo-zero-never-executed/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-modulo-zero-never-executed/0-opt.wgsl
new file mode 100644
index 0000000..5204e88
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-modulo-zero-never-executed/0-opt.wgsl
@@ -0,0 +1,71 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf2 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+type Arr_2 = [[stride(16)]] array<u32, 1>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_uint_values : Arr_2;
+};
+
+[[group(0), binding(2)]] var<uniform> x_8 : buf2;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_12 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : u32;
+  var b : i32;
+  a = 0u;
+  let x_41 : i32 = x_8.x_GLF_uniform_int_values[1];
+  b = x_41;
+  let x_43 : f32 = gl_FragCoord.x;
+  let x_45 : f32 = x_10.x_GLF_uniform_float_values[0];
+  if ((x_43 < x_45)) {
+    let x_50 : u32 = x_12.x_GLF_uniform_uint_values[0];
+    let x_51 : u32 = a;
+    b = bitcast<i32>((x_50 % x_51));
+  }
+  let x_54 : i32 = b;
+  let x_56 : i32 = x_8.x_GLF_uniform_int_values[1];
+  if ((x_54 == x_56)) {
+    let x_62 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_65 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_68 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_71 : i32 = x_8.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_62), f32(x_65), f32(x_68), f32(x_71));
+  } else {
+    let x_75 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_76 : f32 = f32(x_75);
+    x_GLF_color = vec4<f32>(x_76, x_76, x_76, x_76);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-modulo-zero-never-executed/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-modulo-zero-never-executed/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..df48733
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-modulo-zero-never-executed/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,63 @@
+cbuffer cbuffer_x_8 : register(b2, space0) {
+  uint4 x_8[2];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[1];
+};
+cbuffer cbuffer_x_12 : register(b1, space0) {
+  uint4 x_12[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  uint a = 0u;
+  int b = 0;
+  a = 0u;
+  const int x_41 = asint(x_8[1].x);
+  b = x_41;
+  const float x_43 = gl_FragCoord.x;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_45 = asfloat(x_10[scalar_offset / 4][scalar_offset % 4]);
+  if ((x_43 < x_45)) {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const uint x_50 = x_12[scalar_offset_1 / 4][scalar_offset_1 % 4];
+    b = asint((x_50 % a));
+  }
+  const int x_54 = b;
+  const int x_56 = asint(x_8[1].x);
+  if ((x_54 == x_56)) {
+    const int x_62 = asint(x_8[1].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_65 = asint(x_8[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_68 = asint(x_8[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const int x_71 = asint(x_8[1].x);
+    x_GLF_color = float4(float(x_62), float(x_65), float(x_68), float(x_71));
+  } else {
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_75 = asint(x_8[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const float x_76 = float(x_75);
+    x_GLF_color = float4(x_76, x_76, x_76, x_76);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_7 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_7;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-modulo-zero-never-executed/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-modulo-zero-never-executed/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..2639d33
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-modulo-zero-never-executed/0-opt.wgsl.expected.msl
@@ -0,0 +1,79 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf2 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_2 {
+  /* 0x0000 */ uint el;
+  /* 0x0004 */ int8_t tint_pad_2[12];
+};
+struct tint_array_wrapper_2 {
+  /* 0x0000 */ tint_padded_array_element_2 arr[1];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_2 x_GLF_uniform_uint_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf2& x_8, constant buf0& x_10, constant buf1& x_12, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  uint a = 0u;
+  int b = 0;
+  a = 0u;
+  int const x_41 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  b = x_41;
+  float const x_43 = (*(tint_symbol_5)).x;
+  float const x_45 = x_10.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_43 < x_45)) {
+    uint const x_50 = x_12.x_GLF_uniform_uint_values.arr[0].el;
+    uint const x_51 = a;
+    b = as_type<int>((x_50 % x_51));
+  }
+  int const x_54 = b;
+  int const x_56 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_54 == x_56)) {
+    int const x_62 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    int const x_65 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    int const x_68 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    int const x_71 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_6) = float4(float(x_62), float(x_65), float(x_68), float(x_71));
+  } else {
+    int const x_75 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    float const x_76 = float(x_75);
+    *(tint_symbol_6) = float4(x_76, x_76, x_76, x_76);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf2& x_8 [[buffer(2)]], constant buf0& x_10 [[buffer(0)]], constant buf1& x_12 [[buffer(1)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_8, x_10, x_12, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-modulo-zero-never-executed/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-modulo-zero-never-executed/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..7ecd623
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-modulo-zero-never-executed/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,166 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 96
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "x_GLF_uniform_int_values"
+               OpName %x_8 "x_8"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_10 "x_10"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_uint_values"
+               OpName %x_12 "x_12"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf2 Block
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 2
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_uint_uint_1 ArrayStride 16
+               OpDecorate %x_12 NonWritable
+               OpDecorate %x_12 DescriptorSet 0
+               OpDecorate %x_12 Binding 1
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf2 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+        %x_8 = OpVariable %_ptr_Uniform_buf2 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %12
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_arr_uint_uint_1 = OpTypeArray %uint %uint_1
+       %buf1 = OpTypeStruct %_arr_uint_uint_1
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_12 = OpVariable %_ptr_Uniform_buf1 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
+%_ptr_Function_uint = OpTypePointer Function %uint
+         %33 = OpConstantNull %uint
+%_ptr_Function_int = OpTypePointer Function %int
+         %36 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Private_float = OpTypePointer Private %float
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+   %main_out = OpTypeStruct %v4float
+         %83 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %27
+         %30 = OpLabel
+          %a = OpVariable %_ptr_Function_uint Function %33
+          %b = OpVariable %_ptr_Function_int Function %36
+               OpStore %a %uint_0
+         %40 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %41 = OpLoad %int %40
+               OpStore %b %41
+         %43 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %44 = OpLoad %float %43
+         %47 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_0
+         %48 = OpLoad %float %47
+         %49 = OpFOrdLessThan %bool %44 %48
+               OpSelectionMerge %51 None
+               OpBranchConditional %49 %52 %51
+         %52 = OpLabel
+         %54 = OpAccessChain %_ptr_Uniform_uint %x_12 %uint_0 %int_0
+         %55 = OpLoad %uint %54
+         %56 = OpLoad %uint %a
+         %58 = OpUMod %uint %55 %56
+         %57 = OpBitcast %int %58
+               OpStore %b %57
+               OpBranch %51
+         %51 = OpLabel
+         %59 = OpLoad %int %b
+         %60 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %61 = OpLoad %int %60
+         %62 = OpIEqual %bool %59 %61
+               OpSelectionMerge %63 None
+               OpBranchConditional %62 %64 %65
+         %64 = OpLabel
+         %66 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %67 = OpLoad %int %66
+         %68 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %69 = OpLoad %int %68
+         %70 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %71 = OpLoad %int %70
+         %72 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %73 = OpLoad %int %72
+         %74 = OpConvertSToF %float %67
+         %75 = OpConvertSToF %float %69
+         %76 = OpConvertSToF %float %71
+         %77 = OpConvertSToF %float %73
+         %78 = OpCompositeConstruct %v4float %74 %75 %76 %77
+               OpStore %x_GLF_color %78
+               OpBranch %63
+         %65 = OpLabel
+         %79 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %80 = OpLoad %int %79
+         %81 = OpConvertSToF %float %80
+         %82 = OpCompositeConstruct %v4float %81 %81 %81 %81
+               OpStore %x_GLF_color %82
+               OpBranch %63
+         %63 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %83
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %87 = OpLabel
+         %88 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %88
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %27
+         %90 = OpLabel
+         %91 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %91
+         %92 = OpFunctionCall %void %main_1
+         %94 = OpLoad %v4float %x_GLF_color
+         %95 = OpCompositeConstruct %main_out %94
+         %93 = OpFunctionCall %void %tint_symbol_3 %95
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-modulo-zero-never-executed/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-modulo-zero-never-executed/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..5204e88
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-modulo-zero-never-executed/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,71 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf2 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+type Arr_2 = [[stride(16)]] array<u32, 1>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_uint_values : Arr_2;
+};
+
+[[group(0), binding(2)]] var<uniform> x_8 : buf2;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_12 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : u32;
+  var b : i32;
+  a = 0u;
+  let x_41 : i32 = x_8.x_GLF_uniform_int_values[1];
+  b = x_41;
+  let x_43 : f32 = gl_FragCoord.x;
+  let x_45 : f32 = x_10.x_GLF_uniform_float_values[0];
+  if ((x_43 < x_45)) {
+    let x_50 : u32 = x_12.x_GLF_uniform_uint_values[0];
+    let x_51 : u32 = a;
+    b = bitcast<i32>((x_50 % x_51));
+  }
+  let x_54 : i32 = b;
+  let x_56 : i32 = x_8.x_GLF_uniform_int_values[1];
+  if ((x_54 == x_56)) {
+    let x_62 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_65 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_68 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_71 : i32 = x_8.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_62), f32(x_65), f32(x_68), f32(x_71));
+  } else {
+    let x_75 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_76 : f32 = f32(x_75);
+    x_GLF_color = vec4<f32>(x_76, x_76, x_76, x_76);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-multiple-one-iteration-loops-global-counter-write-matrices/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-multiple-one-iteration-loops-global-counter-write-matrices/0-opt.spvasm
new file mode 100644
index 0000000..e63a57e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-multiple-one-iteration-loops-global-counter-write-matrices/0-opt.spvasm
@@ -0,0 +1,940 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %_GLF_global_loop_count "_GLF_global_loop_count"
+               OpName %m23 "m23"
+               OpName %m24 "m24"
+               OpName %m32 "m32"
+               OpName %m33 "m33"
+               OpName %m34 "m34"
+               OpName %m42 "m42"
+               OpName %m43 "m43"
+               OpName %m44 "m44"
+               OpName %i "i"
+               OpName %i_0 "i"
+               OpName %i_1 "i"
+               OpName %i_2 "i"
+               OpName %i_3 "i"
+               OpName %i_4 "i"
+               OpName %i_5 "i"
+               OpName %i_6 "i"
+               OpName %i_7 "i"
+               OpName %i_8 "i"
+               OpName %i_9 "i"
+               OpName %i_10 "i"
+               OpName %i_11 "i"
+               OpName %i_12 "i"
+               OpName %i_13 "i"
+               OpName %i_14 "i"
+               OpName %i_15 "i"
+               OpName %i_16 "i"
+               OpName %i_17 "i"
+               OpName %i_18 "i"
+               OpName %i_19 "i"
+               OpName %i_20 "i"
+               OpName %i_21 "i"
+               OpName %i_22 "i"
+               OpName %i_23 "i"
+               OpName %i_24 "i"
+               OpName %i_25 "i"
+               OpName %i_26 "i"
+               OpName %i_27 "i"
+               OpName %i_28 "i"
+               OpName %i_29 "i"
+               OpName %i_30 "i"
+               OpName %i_31 "i"
+               OpName %i_32 "i"
+               OpName %i_33 "i"
+               OpName %i_34 "i"
+               OpName %i_35 "i"
+               OpName %i_36 "i"
+               OpName %sum "sum"
+               OpName %r "r"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %54 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+%_GLF_global_loop_count = OpVariable %_ptr_Private_int Private
+      %int_0 = OpConstant %int 0
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+%mat2v3float = OpTypeMatrix %v3float 2
+%_ptr_Function_mat2v3float = OpTypePointer Function %mat2v3float
+    %float_0 = OpConstant %float 0
+         %63 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+         %64 = OpConstantComposite %mat2v3float %63 %63
+    %v4float = OpTypeVector %float 4
+%mat2v4float = OpTypeMatrix %v4float 2
+%_ptr_Function_mat2v4float = OpTypePointer Function %mat2v4float
+         %68 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+         %69 = OpConstantComposite %mat2v4float %68 %68
+    %v2float = OpTypeVector %float 2
+%mat3v2float = OpTypeMatrix %v2float 3
+%_ptr_Function_mat3v2float = OpTypePointer Function %mat3v2float
+         %73 = OpConstantComposite %v2float %float_0 %float_0
+         %74 = OpConstantComposite %mat3v2float %73 %73 %73
+%mat3v3float = OpTypeMatrix %v3float 3
+%_ptr_Function_mat3v3float = OpTypePointer Function %mat3v3float
+         %77 = OpConstantComposite %mat3v3float %63 %63 %63
+%mat3v4float = OpTypeMatrix %v4float 3
+%_ptr_Function_mat3v4float = OpTypePointer Function %mat3v4float
+         %80 = OpConstantComposite %mat3v4float %68 %68 %68
+%mat4v2float = OpTypeMatrix %v2float 4
+%_ptr_Function_mat4v2float = OpTypePointer Function %mat4v2float
+         %83 = OpConstantComposite %mat4v2float %73 %73 %73 %73
+%mat4v3float = OpTypeMatrix %v3float 4
+%_ptr_Function_mat4v3float = OpTypePointer Function %mat4v3float
+         %86 = OpConstantComposite %mat4v3float %63 %63 %63 %63
+%mat4v4float = OpTypeMatrix %v4float 4
+%_ptr_Function_mat4v4float = OpTypePointer Function %mat4v4float
+         %89 = OpConstantComposite %mat4v4float %68 %68 %68 %68
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+     %int_98 = OpConstant %int 98
+    %float_1 = OpConstant %float 1
+%_ptr_Function_float = OpTypePointer Function %float
+    %int_100 = OpConstant %int 100
+    %float_8 = OpConstant %float 8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %99 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %54
+        %100 = OpLabel
+        %m23 = OpVariable %_ptr_Function_mat2v3float Function
+        %m24 = OpVariable %_ptr_Function_mat2v4float Function
+        %m32 = OpVariable %_ptr_Function_mat3v2float Function
+        %m33 = OpVariable %_ptr_Function_mat3v3float Function
+        %m34 = OpVariable %_ptr_Function_mat3v4float Function
+        %m42 = OpVariable %_ptr_Function_mat4v2float Function
+        %m43 = OpVariable %_ptr_Function_mat4v3float Function
+        %m44 = OpVariable %_ptr_Function_mat4v4float Function
+          %i = OpVariable %_ptr_Function_int Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+        %i_1 = OpVariable %_ptr_Function_int Function
+        %i_2 = OpVariable %_ptr_Function_int Function
+        %i_3 = OpVariable %_ptr_Function_int Function
+        %i_4 = OpVariable %_ptr_Function_int Function
+        %i_5 = OpVariable %_ptr_Function_int Function
+        %i_6 = OpVariable %_ptr_Function_int Function
+        %i_7 = OpVariable %_ptr_Function_int Function
+        %i_8 = OpVariable %_ptr_Function_int Function
+        %i_9 = OpVariable %_ptr_Function_int Function
+       %i_10 = OpVariable %_ptr_Function_int Function
+       %i_11 = OpVariable %_ptr_Function_int Function
+       %i_12 = OpVariable %_ptr_Function_int Function
+       %i_13 = OpVariable %_ptr_Function_int Function
+       %i_14 = OpVariable %_ptr_Function_int Function
+       %i_15 = OpVariable %_ptr_Function_int Function
+       %i_16 = OpVariable %_ptr_Function_int Function
+       %i_17 = OpVariable %_ptr_Function_int Function
+       %i_18 = OpVariable %_ptr_Function_int Function
+       %i_19 = OpVariable %_ptr_Function_int Function
+       %i_20 = OpVariable %_ptr_Function_int Function
+       %i_21 = OpVariable %_ptr_Function_int Function
+       %i_22 = OpVariable %_ptr_Function_int Function
+       %i_23 = OpVariable %_ptr_Function_int Function
+       %i_24 = OpVariable %_ptr_Function_int Function
+       %i_25 = OpVariable %_ptr_Function_int Function
+       %i_26 = OpVariable %_ptr_Function_int Function
+       %i_27 = OpVariable %_ptr_Function_int Function
+       %i_28 = OpVariable %_ptr_Function_int Function
+       %i_29 = OpVariable %_ptr_Function_int Function
+       %i_30 = OpVariable %_ptr_Function_int Function
+       %i_31 = OpVariable %_ptr_Function_int Function
+       %i_32 = OpVariable %_ptr_Function_int Function
+       %i_33 = OpVariable %_ptr_Function_int Function
+       %i_34 = OpVariable %_ptr_Function_int Function
+       %i_35 = OpVariable %_ptr_Function_int Function
+       %i_36 = OpVariable %_ptr_Function_int Function
+        %sum = OpVariable %_ptr_Function_float Function
+          %r = OpVariable %_ptr_Function_int Function
+               OpStore %_GLF_global_loop_count %int_0
+               OpStore %m23 %64
+               OpStore %m24 %69
+               OpStore %m32 %74
+               OpStore %m33 %77
+               OpStore %m34 %80
+               OpStore %m42 %83
+               OpStore %m43 %86
+               OpStore %m44 %89
+               OpStore %i %int_0
+               OpBranch %101
+        %101 = OpLabel
+               OpLoopMerge %102 %103 None
+               OpBranch %104
+        %104 = OpLabel
+        %105 = OpLoad %int %i
+        %106 = OpSLessThan %bool %105 %int_1
+               OpBranchConditional %106 %107 %102
+        %107 = OpLabel
+               OpStore %i_0 %int_0
+               OpBranch %108
+        %108 = OpLabel
+               OpLoopMerge %109 %110 None
+               OpBranch %111
+        %111 = OpLabel
+        %112 = OpLoad %int %i_0
+        %113 = OpSLessThan %bool %112 %int_1
+               OpBranchConditional %113 %114 %109
+        %114 = OpLabel
+               OpStore %i_1 %int_0
+               OpBranch %115
+        %115 = OpLabel
+               OpLoopMerge %116 %117 None
+               OpBranch %118
+        %118 = OpLabel
+        %119 = OpLoad %int %i_1
+        %120 = OpSLessThan %bool %119 %int_1
+               OpBranchConditional %120 %121 %116
+        %121 = OpLabel
+               OpStore %i_2 %int_0
+               OpBranch %122
+        %122 = OpLabel
+               OpLoopMerge %123 %124 None
+               OpBranch %125
+        %125 = OpLabel
+        %126 = OpLoad %int %i_2
+        %127 = OpSLessThan %bool %126 %int_1
+               OpBranchConditional %127 %128 %123
+        %128 = OpLabel
+               OpStore %i_3 %int_0
+               OpBranch %129
+        %129 = OpLabel
+               OpLoopMerge %130 %131 None
+               OpBranch %132
+        %132 = OpLabel
+        %133 = OpLoad %int %i_3
+        %134 = OpSLessThan %bool %133 %int_1
+               OpBranchConditional %134 %135 %130
+        %135 = OpLabel
+               OpStore %i_4 %int_0
+               OpBranch %136
+        %136 = OpLabel
+               OpLoopMerge %137 %138 None
+               OpBranch %139
+        %139 = OpLabel
+        %140 = OpLoad %int %i_4
+        %141 = OpSLessThan %bool %140 %int_1
+               OpBranchConditional %141 %142 %137
+        %142 = OpLabel
+               OpStore %i_5 %int_0
+               OpBranch %143
+        %143 = OpLabel
+               OpLoopMerge %144 %145 None
+               OpBranch %146
+        %146 = OpLabel
+        %147 = OpLoad %int %i_5
+        %148 = OpSLessThan %bool %147 %int_1
+               OpBranchConditional %148 %149 %144
+        %149 = OpLabel
+               OpStore %i_6 %int_0
+               OpBranch %150
+        %150 = OpLabel
+               OpLoopMerge %151 %152 None
+               OpBranch %153
+        %153 = OpLabel
+        %154 = OpLoad %int %i_6
+        %155 = OpSLessThan %bool %154 %int_1
+               OpBranchConditional %155 %156 %151
+        %156 = OpLabel
+               OpStore %i_7 %int_0
+               OpBranch %157
+        %157 = OpLabel
+               OpLoopMerge %158 %159 None
+               OpBranch %160
+        %160 = OpLabel
+        %161 = OpLoad %int %i_7
+        %162 = OpSLessThan %bool %161 %int_1
+               OpBranchConditional %162 %163 %158
+        %163 = OpLabel
+               OpStore %i_8 %int_0
+               OpBranch %164
+        %164 = OpLabel
+               OpLoopMerge %165 %166 None
+               OpBranch %167
+        %167 = OpLabel
+        %168 = OpLoad %int %i_8
+        %169 = OpSLessThan %bool %168 %int_1
+               OpBranchConditional %169 %170 %165
+        %170 = OpLabel
+               OpStore %i_9 %int_0
+               OpBranch %171
+        %171 = OpLabel
+               OpLoopMerge %172 %173 None
+               OpBranch %174
+        %174 = OpLabel
+        %175 = OpLoad %int %i_9
+        %176 = OpSLessThan %bool %175 %int_1
+               OpBranchConditional %176 %177 %172
+        %177 = OpLabel
+               OpStore %i_10 %int_0
+               OpBranch %178
+        %178 = OpLabel
+               OpLoopMerge %179 %180 None
+               OpBranch %181
+        %181 = OpLabel
+        %182 = OpLoad %int %i_10
+        %183 = OpSLessThan %bool %182 %int_1
+               OpBranchConditional %183 %184 %179
+        %184 = OpLabel
+               OpStore %i_11 %int_0
+               OpBranch %185
+        %185 = OpLabel
+               OpLoopMerge %186 %187 None
+               OpBranch %188
+        %188 = OpLabel
+        %189 = OpLoad %int %i_11
+        %190 = OpSLessThan %bool %189 %int_1
+               OpBranchConditional %190 %191 %186
+        %191 = OpLabel
+               OpStore %i_12 %int_0
+               OpBranch %192
+        %192 = OpLabel
+               OpLoopMerge %193 %194 None
+               OpBranch %195
+        %195 = OpLabel
+        %196 = OpLoad %int %i_12
+        %197 = OpSLessThan %bool %196 %int_1
+               OpBranchConditional %197 %198 %193
+        %198 = OpLabel
+               OpStore %i_13 %int_0
+               OpBranch %199
+        %199 = OpLabel
+               OpLoopMerge %200 %201 None
+               OpBranch %202
+        %202 = OpLabel
+        %203 = OpLoad %int %i_13
+        %204 = OpSLessThan %bool %203 %int_1
+               OpBranchConditional %204 %205 %200
+        %205 = OpLabel
+               OpStore %i_14 %int_0
+               OpBranch %206
+        %206 = OpLabel
+               OpLoopMerge %207 %208 None
+               OpBranch %209
+        %209 = OpLabel
+        %210 = OpLoad %int %i_14
+        %211 = OpSLessThan %bool %210 %int_1
+               OpBranchConditional %211 %212 %207
+        %212 = OpLabel
+               OpStore %i_15 %int_0
+               OpBranch %213
+        %213 = OpLabel
+               OpLoopMerge %214 %215 None
+               OpBranch %216
+        %216 = OpLabel
+        %217 = OpLoad %int %i_15
+        %218 = OpSLessThan %bool %217 %int_1
+               OpBranchConditional %218 %219 %214
+        %219 = OpLabel
+               OpStore %i_16 %int_0
+               OpBranch %220
+        %220 = OpLabel
+               OpLoopMerge %221 %222 None
+               OpBranch %223
+        %223 = OpLabel
+        %224 = OpLoad %int %i_16
+        %225 = OpSLessThan %bool %224 %int_1
+               OpBranchConditional %225 %226 %221
+        %226 = OpLabel
+               OpStore %i_17 %int_0
+               OpBranch %227
+        %227 = OpLabel
+               OpLoopMerge %228 %229 None
+               OpBranch %230
+        %230 = OpLabel
+        %231 = OpLoad %int %i_17
+        %232 = OpSLessThan %bool %231 %int_1
+               OpBranchConditional %232 %233 %228
+        %233 = OpLabel
+               OpStore %i_18 %int_0
+               OpBranch %234
+        %234 = OpLabel
+               OpLoopMerge %235 %236 None
+               OpBranch %237
+        %237 = OpLabel
+        %238 = OpLoad %int %i_18
+        %239 = OpSLessThan %bool %238 %int_1
+               OpBranchConditional %239 %240 %235
+        %240 = OpLabel
+               OpStore %i_19 %int_0
+               OpBranch %241
+        %241 = OpLabel
+               OpLoopMerge %242 %243 None
+               OpBranch %244
+        %244 = OpLabel
+        %245 = OpLoad %int %i_19
+        %246 = OpSLessThan %bool %245 %int_1
+               OpBranchConditional %246 %247 %242
+        %247 = OpLabel
+               OpStore %i_20 %int_0
+               OpBranch %248
+        %248 = OpLabel
+               OpLoopMerge %249 %250 None
+               OpBranch %251
+        %251 = OpLabel
+        %252 = OpLoad %int %i_20
+        %253 = OpSLessThan %bool %252 %int_1
+               OpBranchConditional %253 %254 %249
+        %254 = OpLabel
+               OpStore %i_21 %int_0
+               OpBranch %255
+        %255 = OpLabel
+               OpLoopMerge %256 %257 None
+               OpBranch %258
+        %258 = OpLabel
+        %259 = OpLoad %int %i_21
+        %260 = OpSLessThan %bool %259 %int_1
+               OpBranchConditional %260 %261 %256
+        %261 = OpLabel
+               OpStore %i_22 %int_0
+               OpBranch %262
+        %262 = OpLabel
+               OpLoopMerge %263 %264 None
+               OpBranch %265
+        %265 = OpLabel
+        %266 = OpLoad %int %i_22
+        %267 = OpSLessThan %bool %266 %int_1
+               OpBranchConditional %267 %268 %263
+        %268 = OpLabel
+               OpStore %i_23 %int_0
+               OpBranch %269
+        %269 = OpLabel
+               OpLoopMerge %270 %271 None
+               OpBranch %272
+        %272 = OpLabel
+        %273 = OpLoad %int %i_23
+        %274 = OpSLessThan %bool %273 %int_1
+               OpBranchConditional %274 %275 %270
+        %275 = OpLabel
+               OpStore %i_24 %int_0
+               OpBranch %276
+        %276 = OpLabel
+               OpLoopMerge %277 %278 None
+               OpBranch %279
+        %279 = OpLabel
+        %280 = OpLoad %int %i_24
+        %281 = OpSLessThan %bool %280 %int_1
+               OpBranchConditional %281 %282 %277
+        %282 = OpLabel
+               OpStore %i_25 %int_0
+               OpBranch %283
+        %283 = OpLabel
+               OpLoopMerge %284 %285 None
+               OpBranch %286
+        %286 = OpLabel
+        %287 = OpLoad %int %i_25
+        %288 = OpSLessThan %bool %287 %int_1
+               OpBranchConditional %288 %289 %284
+        %289 = OpLabel
+               OpStore %i_26 %int_0
+               OpBranch %290
+        %290 = OpLabel
+               OpLoopMerge %291 %292 None
+               OpBranch %293
+        %293 = OpLabel
+        %294 = OpLoad %int %i_26
+        %295 = OpSLessThan %bool %294 %int_1
+               OpBranchConditional %295 %296 %291
+        %296 = OpLabel
+               OpStore %i_27 %int_0
+               OpBranch %297
+        %297 = OpLabel
+               OpLoopMerge %298 %299 None
+               OpBranch %300
+        %300 = OpLabel
+        %301 = OpLoad %int %i_27
+        %302 = OpSLessThan %bool %301 %int_1
+               OpBranchConditional %302 %303 %298
+        %303 = OpLabel
+               OpStore %i_28 %int_0
+               OpBranch %304
+        %304 = OpLabel
+               OpLoopMerge %305 %306 None
+               OpBranch %307
+        %307 = OpLabel
+        %308 = OpLoad %int %i_28
+        %309 = OpSLessThan %bool %308 %int_1
+               OpBranchConditional %309 %310 %305
+        %310 = OpLabel
+               OpStore %i_29 %int_0
+               OpBranch %311
+        %311 = OpLabel
+               OpLoopMerge %312 %313 None
+               OpBranch %314
+        %314 = OpLabel
+        %315 = OpLoad %int %i_29
+        %316 = OpSLessThan %bool %315 %int_1
+               OpBranchConditional %316 %317 %312
+        %317 = OpLabel
+               OpStore %i_30 %int_0
+               OpBranch %318
+        %318 = OpLabel
+               OpLoopMerge %319 %320 None
+               OpBranch %321
+        %321 = OpLabel
+        %322 = OpLoad %int %i_30
+        %323 = OpSLessThan %bool %322 %int_1
+               OpBranchConditional %323 %324 %319
+        %324 = OpLabel
+               OpStore %i_31 %int_0
+               OpBranch %325
+        %325 = OpLabel
+               OpLoopMerge %326 %327 None
+               OpBranch %328
+        %328 = OpLabel
+        %329 = OpLoad %int %i_31
+        %330 = OpSLessThan %bool %329 %int_1
+               OpBranchConditional %330 %331 %326
+        %331 = OpLabel
+               OpStore %i_32 %int_0
+               OpBranch %332
+        %332 = OpLabel
+               OpLoopMerge %333 %334 None
+               OpBranch %335
+        %335 = OpLabel
+        %336 = OpLoad %int %i_32
+        %337 = OpSLessThan %bool %336 %int_1
+               OpBranchConditional %337 %338 %333
+        %338 = OpLabel
+               OpStore %i_33 %int_0
+               OpBranch %339
+        %339 = OpLabel
+               OpLoopMerge %340 %341 None
+               OpBranch %342
+        %342 = OpLabel
+        %343 = OpLoad %int %i_33
+        %344 = OpSLessThan %bool %343 %int_1
+               OpBranchConditional %344 %345 %340
+        %345 = OpLabel
+               OpStore %i_34 %int_0
+               OpBranch %346
+        %346 = OpLabel
+               OpLoopMerge %347 %348 None
+               OpBranch %349
+        %349 = OpLabel
+        %350 = OpLoad %int %i_34
+        %351 = OpSLessThan %bool %350 %int_1
+               OpBranchConditional %351 %352 %347
+        %352 = OpLabel
+               OpStore %i_35 %int_0
+               OpBranch %353
+        %353 = OpLabel
+               OpLoopMerge %354 %355 None
+               OpBranch %356
+        %356 = OpLabel
+        %357 = OpLoad %int %i_35
+        %358 = OpSLessThan %bool %357 %int_1
+               OpBranchConditional %358 %359 %354
+        %359 = OpLabel
+               OpStore %i_36 %int_0
+               OpBranch %360
+        %360 = OpLabel
+               OpLoopMerge %361 %362 None
+               OpBranch %363
+        %363 = OpLabel
+        %364 = OpLoad %int %i_36
+        %365 = OpSLessThan %bool %364 %int_1
+               OpBranchConditional %365 %366 %361
+        %366 = OpLabel
+               OpBranch %367
+        %367 = OpLabel
+               OpLoopMerge %368 %369 None
+               OpBranch %370
+        %370 = OpLabel
+        %371 = OpLoad %int %_GLF_global_loop_count
+        %372 = OpIAdd %int %371 %int_1
+               OpStore %_GLF_global_loop_count %372
+               OpBranch %369
+        %369 = OpLabel
+        %373 = OpLoad %int %_GLF_global_loop_count
+        %374 = OpSLessThan %bool %373 %int_98
+               OpBranchConditional %374 %367 %368
+        %368 = OpLabel
+        %375 = OpLoad %int %i_36
+        %376 = OpLoad %int %i_36
+        %377 = OpAccessChain %_ptr_Function_float %m23 %375 %376
+               OpStore %377 %float_1
+        %378 = OpLoad %int %i_36
+        %379 = OpLoad %int %i_36
+        %380 = OpAccessChain %_ptr_Function_float %m24 %378 %379
+               OpStore %380 %float_1
+        %381 = OpLoad %int %i_36
+        %382 = OpLoad %int %i_36
+        %383 = OpAccessChain %_ptr_Function_float %m32 %381 %382
+               OpStore %383 %float_1
+        %384 = OpLoad %int %i_36
+        %385 = OpLoad %int %i_36
+        %386 = OpAccessChain %_ptr_Function_float %m33 %384 %385
+               OpStore %386 %float_1
+        %387 = OpLoad %int %i_36
+        %388 = OpLoad %int %i_36
+        %389 = OpAccessChain %_ptr_Function_float %m34 %387 %388
+               OpStore %389 %float_1
+        %390 = OpLoad %int %i_36
+        %391 = OpLoad %int %i_36
+        %392 = OpAccessChain %_ptr_Function_float %m42 %390 %391
+               OpStore %392 %float_1
+        %393 = OpLoad %int %i_36
+        %394 = OpLoad %int %i_36
+        %395 = OpAccessChain %_ptr_Function_float %m43 %393 %394
+               OpStore %395 %float_1
+        %396 = OpLoad %int %i_36
+        %397 = OpLoad %int %i_36
+        %398 = OpAccessChain %_ptr_Function_float %m44 %396 %397
+               OpStore %398 %float_1
+               OpBranch %362
+        %362 = OpLabel
+        %399 = OpLoad %int %i_36
+        %400 = OpIAdd %int %399 %int_1
+               OpStore %i_36 %400
+               OpBranch %360
+        %361 = OpLabel
+               OpBranch %355
+        %355 = OpLabel
+        %401 = OpLoad %int %i_35
+        %402 = OpIAdd %int %401 %int_1
+               OpStore %i_35 %402
+               OpBranch %353
+        %354 = OpLabel
+               OpBranch %348
+        %348 = OpLabel
+        %403 = OpLoad %int %i_34
+        %404 = OpIAdd %int %403 %int_1
+               OpStore %i_34 %404
+               OpBranch %346
+        %347 = OpLabel
+               OpBranch %341
+        %341 = OpLabel
+        %405 = OpLoad %int %i_33
+        %406 = OpIAdd %int %405 %int_1
+               OpStore %i_33 %406
+               OpBranch %339
+        %340 = OpLabel
+               OpBranch %334
+        %334 = OpLabel
+        %407 = OpLoad %int %i_32
+        %408 = OpIAdd %int %407 %int_1
+               OpStore %i_32 %408
+               OpBranch %332
+        %333 = OpLabel
+               OpBranch %327
+        %327 = OpLabel
+        %409 = OpLoad %int %i_31
+        %410 = OpIAdd %int %409 %int_1
+               OpStore %i_31 %410
+               OpBranch %325
+        %326 = OpLabel
+               OpBranch %320
+        %320 = OpLabel
+        %411 = OpLoad %int %i_30
+        %412 = OpIAdd %int %411 %int_1
+               OpStore %i_30 %412
+               OpBranch %318
+        %319 = OpLabel
+               OpBranch %313
+        %313 = OpLabel
+        %413 = OpLoad %int %i_29
+        %414 = OpIAdd %int %413 %int_1
+               OpStore %i_29 %414
+               OpBranch %311
+        %312 = OpLabel
+               OpBranch %306
+        %306 = OpLabel
+        %415 = OpLoad %int %i_28
+        %416 = OpIAdd %int %415 %int_1
+               OpStore %i_28 %416
+               OpBranch %304
+        %305 = OpLabel
+               OpBranch %299
+        %299 = OpLabel
+        %417 = OpLoad %int %i_27
+        %418 = OpIAdd %int %417 %int_1
+               OpStore %i_27 %418
+               OpBranch %297
+        %298 = OpLabel
+               OpBranch %292
+        %292 = OpLabel
+        %419 = OpLoad %int %i_26
+        %420 = OpIAdd %int %419 %int_1
+               OpStore %i_26 %420
+               OpBranch %290
+        %291 = OpLabel
+               OpBranch %285
+        %285 = OpLabel
+        %421 = OpLoad %int %i_25
+        %422 = OpIAdd %int %421 %int_1
+               OpStore %i_25 %422
+               OpBranch %283
+        %284 = OpLabel
+               OpBranch %278
+        %278 = OpLabel
+        %423 = OpLoad %int %i_24
+        %424 = OpIAdd %int %423 %int_1
+               OpStore %i_24 %424
+               OpBranch %276
+        %277 = OpLabel
+               OpBranch %271
+        %271 = OpLabel
+        %425 = OpLoad %int %i_23
+        %426 = OpIAdd %int %425 %int_1
+               OpStore %i_23 %426
+               OpBranch %269
+        %270 = OpLabel
+               OpBranch %264
+        %264 = OpLabel
+        %427 = OpLoad %int %i_22
+        %428 = OpIAdd %int %427 %int_1
+               OpStore %i_22 %428
+               OpBranch %262
+        %263 = OpLabel
+               OpBranch %257
+        %257 = OpLabel
+        %429 = OpLoad %int %i_21
+        %430 = OpIAdd %int %429 %int_1
+               OpStore %i_21 %430
+               OpBranch %255
+        %256 = OpLabel
+               OpBranch %250
+        %250 = OpLabel
+        %431 = OpLoad %int %i_20
+        %432 = OpIAdd %int %431 %int_1
+               OpStore %i_20 %432
+               OpBranch %248
+        %249 = OpLabel
+               OpBranch %243
+        %243 = OpLabel
+        %433 = OpLoad %int %i_19
+        %434 = OpIAdd %int %433 %int_1
+               OpStore %i_19 %434
+               OpBranch %241
+        %242 = OpLabel
+               OpBranch %236
+        %236 = OpLabel
+        %435 = OpLoad %int %i_18
+        %436 = OpIAdd %int %435 %int_1
+               OpStore %i_18 %436
+               OpBranch %234
+        %235 = OpLabel
+               OpBranch %229
+        %229 = OpLabel
+        %437 = OpLoad %int %i_17
+        %438 = OpIAdd %int %437 %int_1
+               OpStore %i_17 %438
+               OpBranch %227
+        %228 = OpLabel
+               OpBranch %222
+        %222 = OpLabel
+        %439 = OpLoad %int %i_16
+        %440 = OpIAdd %int %439 %int_1
+               OpStore %i_16 %440
+               OpBranch %220
+        %221 = OpLabel
+               OpBranch %215
+        %215 = OpLabel
+        %441 = OpLoad %int %i_15
+        %442 = OpIAdd %int %441 %int_1
+               OpStore %i_15 %442
+               OpBranch %213
+        %214 = OpLabel
+               OpBranch %208
+        %208 = OpLabel
+        %443 = OpLoad %int %i_14
+        %444 = OpIAdd %int %443 %int_1
+               OpStore %i_14 %444
+               OpBranch %206
+        %207 = OpLabel
+               OpBranch %201
+        %201 = OpLabel
+        %445 = OpLoad %int %i_13
+        %446 = OpIAdd %int %445 %int_1
+               OpStore %i_13 %446
+               OpBranch %199
+        %200 = OpLabel
+               OpBranch %194
+        %194 = OpLabel
+        %447 = OpLoad %int %i_12
+        %448 = OpIAdd %int %447 %int_1
+               OpStore %i_12 %448
+               OpBranch %192
+        %193 = OpLabel
+               OpBranch %187
+        %187 = OpLabel
+        %449 = OpLoad %int %i_11
+        %450 = OpIAdd %int %449 %int_1
+               OpStore %i_11 %450
+               OpBranch %185
+        %186 = OpLabel
+               OpBranch %180
+        %180 = OpLabel
+        %451 = OpLoad %int %i_10
+        %452 = OpIAdd %int %451 %int_1
+               OpStore %i_10 %452
+               OpBranch %178
+        %179 = OpLabel
+               OpBranch %173
+        %173 = OpLabel
+        %453 = OpLoad %int %i_9
+        %454 = OpIAdd %int %453 %int_1
+               OpStore %i_9 %454
+               OpBranch %171
+        %172 = OpLabel
+               OpBranch %166
+        %166 = OpLabel
+        %455 = OpLoad %int %i_8
+        %456 = OpIAdd %int %455 %int_1
+               OpStore %i_8 %456
+               OpBranch %164
+        %165 = OpLabel
+               OpBranch %159
+        %159 = OpLabel
+        %457 = OpLoad %int %i_7
+        %458 = OpIAdd %int %457 %int_1
+               OpStore %i_7 %458
+               OpBranch %157
+        %158 = OpLabel
+               OpBranch %152
+        %152 = OpLabel
+        %459 = OpLoad %int %i_6
+        %460 = OpIAdd %int %459 %int_1
+               OpStore %i_6 %460
+               OpBranch %150
+        %151 = OpLabel
+               OpBranch %145
+        %145 = OpLabel
+        %461 = OpLoad %int %i_5
+        %462 = OpIAdd %int %461 %int_1
+               OpStore %i_5 %462
+               OpBranch %143
+        %144 = OpLabel
+               OpBranch %138
+        %138 = OpLabel
+        %463 = OpLoad %int %i_4
+        %464 = OpIAdd %int %463 %int_1
+               OpStore %i_4 %464
+               OpBranch %136
+        %137 = OpLabel
+               OpBranch %131
+        %131 = OpLabel
+        %465 = OpLoad %int %i_3
+        %466 = OpIAdd %int %465 %int_1
+               OpStore %i_3 %466
+               OpBranch %129
+        %130 = OpLabel
+               OpBranch %124
+        %124 = OpLabel
+        %467 = OpLoad %int %i_2
+        %468 = OpIAdd %int %467 %int_1
+               OpStore %i_2 %468
+               OpBranch %122
+        %123 = OpLabel
+               OpBranch %117
+        %117 = OpLabel
+        %469 = OpLoad %int %i_1
+        %470 = OpIAdd %int %469 %int_1
+               OpStore %i_1 %470
+               OpBranch %115
+        %116 = OpLabel
+               OpBranch %110
+        %110 = OpLabel
+        %471 = OpLoad %int %i_0
+        %472 = OpIAdd %int %471 %int_1
+               OpStore %i_0 %472
+               OpBranch %108
+        %109 = OpLabel
+               OpBranch %103
+        %103 = OpLabel
+        %473 = OpLoad %int %i
+        %474 = OpIAdd %int %473 %int_1
+               OpStore %i %474
+               OpBranch %101
+        %102 = OpLabel
+               OpStore %sum %float_0
+               OpStore %r %int_0
+               OpBranch %475
+        %475 = OpLabel
+               OpLoopMerge %476 %477 None
+               OpBranch %478
+        %478 = OpLabel
+        %479 = OpLoad %int %_GLF_global_loop_count
+        %480 = OpSLessThan %bool %479 %int_100
+               OpBranchConditional %480 %481 %476
+        %481 = OpLabel
+        %482 = OpLoad %int %_GLF_global_loop_count
+        %483 = OpIAdd %int %482 %int_1
+               OpStore %_GLF_global_loop_count %483
+        %484 = OpLoad %int %r
+        %485 = OpAccessChain %_ptr_Function_float %m23 %int_0 %484
+        %486 = OpLoad %float %485
+        %487 = OpLoad %float %sum
+        %488 = OpFAdd %float %487 %486
+               OpStore %sum %488
+        %489 = OpLoad %int %r
+        %490 = OpAccessChain %_ptr_Function_float %m24 %int_0 %489
+        %491 = OpLoad %float %490
+        %492 = OpLoad %float %sum
+        %493 = OpFAdd %float %492 %491
+               OpStore %sum %493
+        %494 = OpLoad %int %r
+        %495 = OpAccessChain %_ptr_Function_float %m32 %int_0 %494
+        %496 = OpLoad %float %495
+        %497 = OpLoad %float %sum
+        %498 = OpFAdd %float %497 %496
+               OpStore %sum %498
+        %499 = OpLoad %int %r
+        %500 = OpAccessChain %_ptr_Function_float %m33 %int_0 %499
+        %501 = OpLoad %float %500
+        %502 = OpLoad %float %sum
+        %503 = OpFAdd %float %502 %501
+               OpStore %sum %503
+        %504 = OpLoad %int %r
+        %505 = OpAccessChain %_ptr_Function_float %m34 %int_0 %504
+        %506 = OpLoad %float %505
+        %507 = OpLoad %float %sum
+        %508 = OpFAdd %float %507 %506
+               OpStore %sum %508
+        %509 = OpLoad %int %r
+        %510 = OpAccessChain %_ptr_Function_float %m42 %int_0 %509
+        %511 = OpLoad %float %510
+        %512 = OpLoad %float %sum
+        %513 = OpFAdd %float %512 %511
+               OpStore %sum %513
+        %514 = OpLoad %int %r
+        %515 = OpAccessChain %_ptr_Function_float %m43 %int_0 %514
+        %516 = OpLoad %float %515
+        %517 = OpLoad %float %sum
+        %518 = OpFAdd %float %517 %516
+               OpStore %sum %518
+        %519 = OpLoad %int %r
+        %520 = OpAccessChain %_ptr_Function_float %m44 %int_0 %519
+        %521 = OpLoad %float %520
+        %522 = OpLoad %float %sum
+        %523 = OpFAdd %float %522 %521
+               OpStore %sum %523
+               OpBranch %477
+        %477 = OpLabel
+        %524 = OpLoad %int %r
+        %525 = OpIAdd %int %524 %int_1
+               OpStore %r %525
+               OpBranch %475
+        %476 = OpLabel
+        %526 = OpLoad %float %sum
+        %527 = OpFOrdEqual %bool %526 %float_8
+               OpSelectionMerge %528 None
+               OpBranchConditional %527 %529 %530
+        %529 = OpLabel
+               OpStore %_GLF_color %99
+               OpBranch %528
+        %530 = OpLabel
+               OpStore %_GLF_color %68
+               OpBranch %528
+        %528 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-multiple-one-iteration-loops-global-counter-write-matrices/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-multiple-one-iteration-loops-global-counter-write-matrices/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..362d952
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-multiple-one-iteration-loops-global-counter-write-matrices/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,324 @@
+void set_float3(inout float3 vec, int idx, float val) {
+  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
+}
+
+void set_float4(inout float4 vec, int idx, float val) {
+  vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
+}
+
+void set_float2(inout float2 vec, int idx, float val) {
+  vec = (idx.xx == int2(0, 1)) ? val.xx : vec;
+}
+
+static int x_GLF_global_loop_count = 0;
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2x3 m23 = float2x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  float2x4 m24 = float2x4(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  float3x2 m32 = float3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  float3x3 m33 = float3x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  float3x4 m34 = float3x4(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  float4x2 m42 = float4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  float4x3 m43 = float4x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  float4x4 m44 = float4x4(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  int i = 0;
+  int i_1 = 0;
+  int i_2 = 0;
+  int i_3 = 0;
+  int i_4 = 0;
+  int i_5 = 0;
+  int i_6 = 0;
+  int i_7 = 0;
+  int i_8 = 0;
+  int i_9 = 0;
+  int i_10 = 0;
+  int i_11 = 0;
+  int i_12 = 0;
+  int i_13 = 0;
+  int i_14 = 0;
+  int i_15 = 0;
+  int i_16 = 0;
+  int i_17 = 0;
+  int i_18 = 0;
+  int i_19 = 0;
+  int i_20 = 0;
+  int i_21 = 0;
+  int i_22 = 0;
+  int i_23 = 0;
+  int i_24 = 0;
+  int i_25 = 0;
+  int i_26 = 0;
+  int i_27 = 0;
+  int i_28 = 0;
+  int i_29 = 0;
+  int i_30 = 0;
+  int i_31 = 0;
+  int i_32 = 0;
+  int i_33 = 0;
+  int i_34 = 0;
+  int i_35 = 0;
+  int i_36 = 0;
+  int i_37 = 0;
+  float sum = 0.0f;
+  int r = 0;
+  x_GLF_global_loop_count = 0;
+  m23 = float2x3(float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f));
+  m24 = float2x4(float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f));
+  m32 = float3x2(float2(0.0f, 0.0f), float2(0.0f, 0.0f), float2(0.0f, 0.0f));
+  m33 = float3x3(float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f));
+  m34 = float3x4(float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f));
+  m42 = float4x2(float2(0.0f, 0.0f), float2(0.0f, 0.0f), float2(0.0f, 0.0f), float2(0.0f, 0.0f));
+  m43 = float4x3(float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f));
+  m44 = float4x4(float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f));
+  i = 0;
+  {
+    for(; (i < 1); i = (i + 1)) {
+      i_1 = 0;
+      {
+        for(; (i_1 < 1); i_1 = (i_1 + 1)) {
+          i_2 = 0;
+          {
+            for(; (i_2 < 1); i_2 = (i_2 + 1)) {
+              i_3 = 0;
+              {
+                for(; (i_3 < 1); i_3 = (i_3 + 1)) {
+                  i_4 = 0;
+                  {
+                    for(; (i_4 < 1); i_4 = (i_4 + 1)) {
+                      i_5 = 0;
+                      {
+                        for(; (i_5 < 1); i_5 = (i_5 + 1)) {
+                          i_6 = 0;
+                          {
+                            for(; (i_6 < 1); i_6 = (i_6 + 1)) {
+                              i_7 = 0;
+                              {
+                                for(; (i_7 < 1); i_7 = (i_7 + 1)) {
+                                  i_8 = 0;
+                                  {
+                                    for(; (i_8 < 1); i_8 = (i_8 + 1)) {
+                                      i_9 = 0;
+                                      {
+                                        for(; (i_9 < 1); i_9 = (i_9 + 1)) {
+                                          i_10 = 0;
+                                          {
+                                            for(; (i_10 < 1); i_10 = (i_10 + 1)) {
+                                              i_11 = 0;
+                                              {
+                                                for(; (i_11 < 1); i_11 = (i_11 + 1)) {
+                                                  i_12 = 0;
+                                                  {
+                                                    for(; (i_12 < 1); i_12 = (i_12 + 1)) {
+                                                      i_13 = 0;
+                                                      {
+                                                        for(; (i_13 < 1); i_13 = (i_13 + 1)) {
+                                                          i_14 = 0;
+                                                          {
+                                                            for(; (i_14 < 1); i_14 = (i_14 + 1)) {
+                                                              i_15 = 0;
+                                                              {
+                                                                for(; (i_15 < 1); i_15 = (i_15 + 1)) {
+                                                                  i_16 = 0;
+                                                                  {
+                                                                    for(; (i_16 < 1); i_16 = (i_16 + 1)) {
+                                                                      i_17 = 0;
+                                                                      {
+                                                                        for(; (i_17 < 1); i_17 = (i_17 + 1)) {
+                                                                          i_18 = 0;
+                                                                          {
+                                                                            for(; (i_18 < 1); i_18 = (i_18 + 1)) {
+                                                                              i_19 = 0;
+                                                                              {
+                                                                                for(; (i_19 < 1); i_19 = (i_19 + 1)) {
+                                                                                  i_20 = 0;
+                                                                                  {
+                                                                                    for(; (i_20 < 1); i_20 = (i_20 + 1)) {
+                                                                                      i_21 = 0;
+                                                                                      {
+                                                                                        for(; (i_21 < 1); i_21 = (i_21 + 1)) {
+                                                                                          i_22 = 0;
+                                                                                          {
+                                                                                            for(; (i_22 < 1); i_22 = (i_22 + 1)) {
+                                                                                              i_23 = 0;
+                                                                                              {
+                                                                                                for(; (i_23 < 1); i_23 = (i_23 + 1)) {
+                                                                                                  i_24 = 0;
+                                                                                                  {
+                                                                                                    for(; (i_24 < 1); i_24 = (i_24 + 1)) {
+                                                                                                      i_25 = 0;
+                                                                                                      {
+                                                                                                        for(; (i_25 < 1); i_25 = (i_25 + 1)) {
+                                                                                                          i_26 = 0;
+                                                                                                          {
+                                                                                                            for(; (i_26 < 1); i_26 = (i_26 + 1)) {
+                                                                                                              i_27 = 0;
+                                                                                                              {
+                                                                                                                for(; (i_27 < 1); i_27 = (i_27 + 1)) {
+                                                                                                                  i_28 = 0;
+                                                                                                                  {
+                                                                                                                    for(; (i_28 < 1); i_28 = (i_28 + 1)) {
+                                                                                                                      i_29 = 0;
+                                                                                                                      {
+                                                                                                                        for(; (i_29 < 1); i_29 = (i_29 + 1)) {
+                                                                                                                          i_30 = 0;
+                                                                                                                          {
+                                                                                                                            for(; (i_30 < 1); i_30 = (i_30 + 1)) {
+                                                                                                                              i_31 = 0;
+                                                                                                                              {
+                                                                                                                                for(; (i_31 < 1); i_31 = (i_31 + 1)) {
+                                                                                                                                  i_32 = 0;
+                                                                                                                                  {
+                                                                                                                                    for(; (i_32 < 1); i_32 = (i_32 + 1)) {
+                                                                                                                                      i_33 = 0;
+                                                                                                                                      {
+                                                                                                                                        for(; (i_33 < 1); i_33 = (i_33 + 1)) {
+                                                                                                                                          i_34 = 0;
+                                                                                                                                          {
+                                                                                                                                            for(; (i_34 < 1); i_34 = (i_34 + 1)) {
+                                                                                                                                              i_35 = 0;
+                                                                                                                                              {
+                                                                                                                                                for(; (i_35 < 1); i_35 = (i_35 + 1)) {
+                                                                                                                                                  i_36 = 0;
+                                                                                                                                                  {
+                                                                                                                                                    for(; (i_36 < 1); i_36 = (i_36 + 1)) {
+                                                                                                                                                      i_37 = 0;
+                                                                                                                                                      {
+                                                                                                                                                        for(; (i_37 < 1); i_37 = (i_37 + 1)) {
+                                                                                                                                                          while (true) {
+                                                                                                                                                            x_GLF_global_loop_count = (x_GLF_global_loop_count + 1);
+                                                                                                                                                            {
+                                                                                                                                                              if ((x_GLF_global_loop_count < 98)) {
+                                                                                                                                                              } else {
+                                                                                                                                                                break;
+                                                                                                                                                              }
+                                                                                                                                                            }
+                                                                                                                                                          }
+                                                                                                                                                          set_float3(m23[i_37], i_37, 1.0f);
+                                                                                                                                                          set_float4(m24[i_37], i_37, 1.0f);
+                                                                                                                                                          set_float2(m32[i_37], i_37, 1.0f);
+                                                                                                                                                          set_float3(m33[i_37], i_37, 1.0f);
+                                                                                                                                                          set_float4(m34[i_37], i_37, 1.0f);
+                                                                                                                                                          set_float2(m42[i_37], i_37, 1.0f);
+                                                                                                                                                          set_float3(m43[i_37], i_37, 1.0f);
+                                                                                                                                                          set_float4(m44[i_37], i_37, 1.0f);
+                                                                                                                                                        }
+                                                                                                                                                      }
+                                                                                                                                                    }
+                                                                                                                                                  }
+                                                                                                                                                }
+                                                                                                                                              }
+                                                                                                                                            }
+                                                                                                                                          }
+                                                                                                                                        }
+                                                                                                                                      }
+                                                                                                                                    }
+                                                                                                                                  }
+                                                                                                                                }
+                                                                                                                              }
+                                                                                                                            }
+                                                                                                                          }
+                                                                                                                        }
+                                                                                                                      }
+                                                                                                                    }
+                                                                                                                  }
+                                                                                                                }
+                                                                                                              }
+                                                                                                            }
+                                                                                                          }
+                                                                                                        }
+                                                                                                      }
+                                                                                                    }
+                                                                                                  }
+                                                                                                }
+                                                                                              }
+                                                                                            }
+                                                                                          }
+                                                                                        }
+                                                                                      }
+                                                                                    }
+                                                                                  }
+                                                                                }
+                                                                              }
+                                                                            }
+                                                                          }
+                                                                        }
+                                                                      }
+                                                                    }
+                                                                  }
+                                                                }
+                                                              }
+                                                            }
+                                                          }
+                                                        }
+                                                      }
+                                                    }
+                                                  }
+                                                }
+                                              }
+                                            }
+                                          }
+                                        }
+                                      }
+                                    }
+                                  }
+                                }
+                              }
+                            }
+                          }
+                        }
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  sum = 0.0f;
+  r = 0;
+  {
+    for(; (x_GLF_global_loop_count < 100); r = (r + 1)) {
+      x_GLF_global_loop_count = (x_GLF_global_loop_count + 1);
+      const float x_486 = m23[0][r];
+      sum = (sum + x_486);
+      const float x_491 = m24[0][r];
+      sum = (sum + x_491);
+      const float x_496 = m32[0][r];
+      sum = (sum + x_496);
+      const float x_501 = m33[0][r];
+      sum = (sum + x_501);
+      const float x_506 = m34[0][r];
+      sum = (sum + x_506);
+      const float x_511 = m42[0][r];
+      sum = (sum + x_511);
+      const float x_516 = m43[0][r];
+      sum = (sum + x_516);
+      const float x_521 = m44[0][r];
+      sum = (sum + x_521);
+    }
+  }
+  if ((sum == 8.0f)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-multiple-one-iteration-loops-global-counter-write-matrices/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-multiple-one-iteration-loops-global-counter-write-matrices/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..0ab9beb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-multiple-one-iteration-loops-global-counter-write-matrices/0-opt.spvasm.expected.msl
@@ -0,0 +1,624 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread int* const tint_symbol_4, thread float4* const tint_symbol_5) {
+  float2x3 m23 = float2x3(0.0f);
+  float2x4 m24 = float2x4(0.0f);
+  float3x2 m32 = float3x2(0.0f);
+  float3x3 m33 = float3x3(0.0f);
+  float3x4 m34 = float3x4(0.0f);
+  float4x2 m42 = float4x2(0.0f);
+  float4x3 m43 = float4x3(0.0f);
+  float4x4 m44 = float4x4(0.0f);
+  int i = 0;
+  int i_1 = 0;
+  int i_2 = 0;
+  int i_3 = 0;
+  int i_4 = 0;
+  int i_5 = 0;
+  int i_6 = 0;
+  int i_7 = 0;
+  int i_8 = 0;
+  int i_9 = 0;
+  int i_10 = 0;
+  int i_11 = 0;
+  int i_12 = 0;
+  int i_13 = 0;
+  int i_14 = 0;
+  int i_15 = 0;
+  int i_16 = 0;
+  int i_17 = 0;
+  int i_18 = 0;
+  int i_19 = 0;
+  int i_20 = 0;
+  int i_21 = 0;
+  int i_22 = 0;
+  int i_23 = 0;
+  int i_24 = 0;
+  int i_25 = 0;
+  int i_26 = 0;
+  int i_27 = 0;
+  int i_28 = 0;
+  int i_29 = 0;
+  int i_30 = 0;
+  int i_31 = 0;
+  int i_32 = 0;
+  int i_33 = 0;
+  int i_34 = 0;
+  int i_35 = 0;
+  int i_36 = 0;
+  int i_37 = 0;
+  float sum = 0.0f;
+  int r = 0;
+  *(tint_symbol_4) = 0;
+  m23 = float2x3(float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f));
+  m24 = float2x4(float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f));
+  m32 = float3x2(float2(0.0f, 0.0f), float2(0.0f, 0.0f), float2(0.0f, 0.0f));
+  m33 = float3x3(float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f));
+  m34 = float3x4(float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f));
+  m42 = float4x2(float2(0.0f, 0.0f), float2(0.0f, 0.0f), float2(0.0f, 0.0f), float2(0.0f, 0.0f));
+  m43 = float4x3(float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f));
+  m44 = float4x4(float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f));
+  i = 0;
+  while (true) {
+    int const x_105 = i;
+    if ((x_105 < 1)) {
+    } else {
+      break;
+    }
+    i_1 = 0;
+    while (true) {
+      int const x_112 = i_1;
+      if ((x_112 < 1)) {
+      } else {
+        break;
+      }
+      i_2 = 0;
+      while (true) {
+        int const x_119 = i_2;
+        if ((x_119 < 1)) {
+        } else {
+          break;
+        }
+        i_3 = 0;
+        while (true) {
+          int const x_126 = i_3;
+          if ((x_126 < 1)) {
+          } else {
+            break;
+          }
+          i_4 = 0;
+          while (true) {
+            int const x_133 = i_4;
+            if ((x_133 < 1)) {
+            } else {
+              break;
+            }
+            i_5 = 0;
+            while (true) {
+              int const x_140 = i_5;
+              if ((x_140 < 1)) {
+              } else {
+                break;
+              }
+              i_6 = 0;
+              while (true) {
+                int const x_147 = i_6;
+                if ((x_147 < 1)) {
+                } else {
+                  break;
+                }
+                i_7 = 0;
+                while (true) {
+                  int const x_154 = i_7;
+                  if ((x_154 < 1)) {
+                  } else {
+                    break;
+                  }
+                  i_8 = 0;
+                  while (true) {
+                    int const x_161 = i_8;
+                    if ((x_161 < 1)) {
+                    } else {
+                      break;
+                    }
+                    i_9 = 0;
+                    while (true) {
+                      int const x_168 = i_9;
+                      if ((x_168 < 1)) {
+                      } else {
+                        break;
+                      }
+                      i_10 = 0;
+                      while (true) {
+                        int const x_175 = i_10;
+                        if ((x_175 < 1)) {
+                        } else {
+                          break;
+                        }
+                        i_11 = 0;
+                        while (true) {
+                          int const x_182 = i_11;
+                          if ((x_182 < 1)) {
+                          } else {
+                            break;
+                          }
+                          i_12 = 0;
+                          while (true) {
+                            int const x_189 = i_12;
+                            if ((x_189 < 1)) {
+                            } else {
+                              break;
+                            }
+                            i_13 = 0;
+                            while (true) {
+                              int const x_196 = i_13;
+                              if ((x_196 < 1)) {
+                              } else {
+                                break;
+                              }
+                              i_14 = 0;
+                              while (true) {
+                                int const x_203 = i_14;
+                                if ((x_203 < 1)) {
+                                } else {
+                                  break;
+                                }
+                                i_15 = 0;
+                                while (true) {
+                                  int const x_210 = i_15;
+                                  if ((x_210 < 1)) {
+                                  } else {
+                                    break;
+                                  }
+                                  i_16 = 0;
+                                  while (true) {
+                                    int const x_217 = i_16;
+                                    if ((x_217 < 1)) {
+                                    } else {
+                                      break;
+                                    }
+                                    i_17 = 0;
+                                    while (true) {
+                                      int const x_224 = i_17;
+                                      if ((x_224 < 1)) {
+                                      } else {
+                                        break;
+                                      }
+                                      i_18 = 0;
+                                      while (true) {
+                                        int const x_231 = i_18;
+                                        if ((x_231 < 1)) {
+                                        } else {
+                                          break;
+                                        }
+                                        i_19 = 0;
+                                        while (true) {
+                                          int const x_238 = i_19;
+                                          if ((x_238 < 1)) {
+                                          } else {
+                                            break;
+                                          }
+                                          i_20 = 0;
+                                          while (true) {
+                                            int const x_245 = i_20;
+                                            if ((x_245 < 1)) {
+                                            } else {
+                                              break;
+                                            }
+                                            i_21 = 0;
+                                            while (true) {
+                                              int const x_252 = i_21;
+                                              if ((x_252 < 1)) {
+                                              } else {
+                                                break;
+                                              }
+                                              i_22 = 0;
+                                              while (true) {
+                                                int const x_259 = i_22;
+                                                if ((x_259 < 1)) {
+                                                } else {
+                                                  break;
+                                                }
+                                                i_23 = 0;
+                                                while (true) {
+                                                  int const x_266 = i_23;
+                                                  if ((x_266 < 1)) {
+                                                  } else {
+                                                    break;
+                                                  }
+                                                  i_24 = 0;
+                                                  while (true) {
+                                                    int const x_273 = i_24;
+                                                    if ((x_273 < 1)) {
+                                                    } else {
+                                                      break;
+                                                    }
+                                                    i_25 = 0;
+                                                    while (true) {
+                                                      int const x_280 = i_25;
+                                                      if ((x_280 < 1)) {
+                                                      } else {
+                                                        break;
+                                                      }
+                                                      i_26 = 0;
+                                                      while (true) {
+                                                        int const x_287 = i_26;
+                                                        if ((x_287 < 1)) {
+                                                        } else {
+                                                          break;
+                                                        }
+                                                        i_27 = 0;
+                                                        while (true) {
+                                                          int const x_294 = i_27;
+                                                          if ((x_294 < 1)) {
+                                                          } else {
+                                                            break;
+                                                          }
+                                                          i_28 = 0;
+                                                          while (true) {
+                                                            int const x_301 = i_28;
+                                                            if ((x_301 < 1)) {
+                                                            } else {
+                                                              break;
+                                                            }
+                                                            i_29 = 0;
+                                                            while (true) {
+                                                              int const x_308 = i_29;
+                                                              if ((x_308 < 1)) {
+                                                              } else {
+                                                                break;
+                                                              }
+                                                              i_30 = 0;
+                                                              while (true) {
+                                                                int const x_315 = i_30;
+                                                                if ((x_315 < 1)) {
+                                                                } else {
+                                                                  break;
+                                                                }
+                                                                i_31 = 0;
+                                                                while (true) {
+                                                                  int const x_322 = i_31;
+                                                                  if ((x_322 < 1)) {
+                                                                  } else {
+                                                                    break;
+                                                                  }
+                                                                  i_32 = 0;
+                                                                  while (true) {
+                                                                    int const x_329 = i_32;
+                                                                    if ((x_329 < 1)) {
+                                                                    } else {
+                                                                      break;
+                                                                    }
+                                                                    i_33 = 0;
+                                                                    while (true) {
+                                                                      int const x_336 = i_33;
+                                                                      if ((x_336 < 1)) {
+                                                                      } else {
+                                                                        break;
+                                                                      }
+                                                                      i_34 = 0;
+                                                                      while (true) {
+                                                                        int const x_343 = i_34;
+                                                                        if ((x_343 < 1)) {
+                                                                        } else {
+                                                                          break;
+                                                                        }
+                                                                        i_35 = 0;
+                                                                        while (true) {
+                                                                          int const x_350 = i_35;
+                                                                          if ((x_350 < 1)) {
+                                                                          } else {
+                                                                            break;
+                                                                          }
+                                                                          i_36 = 0;
+                                                                          while (true) {
+                                                                            int const x_357 = i_36;
+                                                                            if ((x_357 < 1)) {
+                                                                            } else {
+                                                                              break;
+                                                                            }
+                                                                            i_37 = 0;
+                                                                            while (true) {
+                                                                              int const x_364 = i_37;
+                                                                              if ((x_364 < 1)) {
+                                                                              } else {
+                                                                                break;
+                                                                              }
+                                                                              while (true) {
+                                                                                int const x_371 = *(tint_symbol_4);
+                                                                                *(tint_symbol_4) = (x_371 + 1);
+                                                                                {
+                                                                                  int const x_373 = *(tint_symbol_4);
+                                                                                  if ((x_373 < 98)) {
+                                                                                  } else {
+                                                                                    break;
+                                                                                  }
+                                                                                }
+                                                                              }
+                                                                              int const x_375 = i_37;
+                                                                              int const x_376 = i_37;
+                                                                              m23[x_375][x_376] = 1.0f;
+                                                                              int const x_378 = i_37;
+                                                                              int const x_379 = i_37;
+                                                                              m24[x_378][x_379] = 1.0f;
+                                                                              int const x_381 = i_37;
+                                                                              int const x_382 = i_37;
+                                                                              m32[x_381][x_382] = 1.0f;
+                                                                              int const x_384 = i_37;
+                                                                              int const x_385 = i_37;
+                                                                              m33[x_384][x_385] = 1.0f;
+                                                                              int const x_387 = i_37;
+                                                                              int const x_388 = i_37;
+                                                                              m34[x_387][x_388] = 1.0f;
+                                                                              int const x_390 = i_37;
+                                                                              int const x_391 = i_37;
+                                                                              m42[x_390][x_391] = 1.0f;
+                                                                              int const x_393 = i_37;
+                                                                              int const x_394 = i_37;
+                                                                              m43[x_393][x_394] = 1.0f;
+                                                                              int const x_396 = i_37;
+                                                                              int const x_397 = i_37;
+                                                                              m44[x_396][x_397] = 1.0f;
+                                                                              {
+                                                                                int const x_399 = i_37;
+                                                                                i_37 = (x_399 + 1);
+                                                                              }
+                                                                            }
+                                                                            {
+                                                                              int const x_401 = i_36;
+                                                                              i_36 = (x_401 + 1);
+                                                                            }
+                                                                          }
+                                                                          {
+                                                                            int const x_403 = i_35;
+                                                                            i_35 = (x_403 + 1);
+                                                                          }
+                                                                        }
+                                                                        {
+                                                                          int const x_405 = i_34;
+                                                                          i_34 = (x_405 + 1);
+                                                                        }
+                                                                      }
+                                                                      {
+                                                                        int const x_407 = i_33;
+                                                                        i_33 = (x_407 + 1);
+                                                                      }
+                                                                    }
+                                                                    {
+                                                                      int const x_409 = i_32;
+                                                                      i_32 = (x_409 + 1);
+                                                                    }
+                                                                  }
+                                                                  {
+                                                                    int const x_411 = i_31;
+                                                                    i_31 = (x_411 + 1);
+                                                                  }
+                                                                }
+                                                                {
+                                                                  int const x_413 = i_30;
+                                                                  i_30 = (x_413 + 1);
+                                                                }
+                                                              }
+                                                              {
+                                                                int const x_415 = i_29;
+                                                                i_29 = (x_415 + 1);
+                                                              }
+                                                            }
+                                                            {
+                                                              int const x_417 = i_28;
+                                                              i_28 = (x_417 + 1);
+                                                            }
+                                                          }
+                                                          {
+                                                            int const x_419 = i_27;
+                                                            i_27 = (x_419 + 1);
+                                                          }
+                                                        }
+                                                        {
+                                                          int const x_421 = i_26;
+                                                          i_26 = (x_421 + 1);
+                                                        }
+                                                      }
+                                                      {
+                                                        int const x_423 = i_25;
+                                                        i_25 = (x_423 + 1);
+                                                      }
+                                                    }
+                                                    {
+                                                      int const x_425 = i_24;
+                                                      i_24 = (x_425 + 1);
+                                                    }
+                                                  }
+                                                  {
+                                                    int const x_427 = i_23;
+                                                    i_23 = (x_427 + 1);
+                                                  }
+                                                }
+                                                {
+                                                  int const x_429 = i_22;
+                                                  i_22 = (x_429 + 1);
+                                                }
+                                              }
+                                              {
+                                                int const x_431 = i_21;
+                                                i_21 = (x_431 + 1);
+                                              }
+                                            }
+                                            {
+                                              int const x_433 = i_20;
+                                              i_20 = (x_433 + 1);
+                                            }
+                                          }
+                                          {
+                                            int const x_435 = i_19;
+                                            i_19 = (x_435 + 1);
+                                          }
+                                        }
+                                        {
+                                          int const x_437 = i_18;
+                                          i_18 = (x_437 + 1);
+                                        }
+                                      }
+                                      {
+                                        int const x_439 = i_17;
+                                        i_17 = (x_439 + 1);
+                                      }
+                                    }
+                                    {
+                                      int const x_441 = i_16;
+                                      i_16 = (x_441 + 1);
+                                    }
+                                  }
+                                  {
+                                    int const x_443 = i_15;
+                                    i_15 = (x_443 + 1);
+                                  }
+                                }
+                                {
+                                  int const x_445 = i_14;
+                                  i_14 = (x_445 + 1);
+                                }
+                              }
+                              {
+                                int const x_447 = i_13;
+                                i_13 = (x_447 + 1);
+                              }
+                            }
+                            {
+                              int const x_449 = i_12;
+                              i_12 = (x_449 + 1);
+                            }
+                          }
+                          {
+                            int const x_451 = i_11;
+                            i_11 = (x_451 + 1);
+                          }
+                        }
+                        {
+                          int const x_453 = i_10;
+                          i_10 = (x_453 + 1);
+                        }
+                      }
+                      {
+                        int const x_455 = i_9;
+                        i_9 = (x_455 + 1);
+                      }
+                    }
+                    {
+                      int const x_457 = i_8;
+                      i_8 = (x_457 + 1);
+                    }
+                  }
+                  {
+                    int const x_459 = i_7;
+                    i_7 = (x_459 + 1);
+                  }
+                }
+                {
+                  int const x_461 = i_6;
+                  i_6 = (x_461 + 1);
+                }
+              }
+              {
+                int const x_463 = i_5;
+                i_5 = (x_463 + 1);
+              }
+            }
+            {
+              int const x_465 = i_4;
+              i_4 = (x_465 + 1);
+            }
+          }
+          {
+            int const x_467 = i_3;
+            i_3 = (x_467 + 1);
+          }
+        }
+        {
+          int const x_469 = i_2;
+          i_2 = (x_469 + 1);
+        }
+      }
+      {
+        int const x_471 = i_1;
+        i_1 = (x_471 + 1);
+      }
+    }
+    {
+      int const x_473 = i;
+      i = (x_473 + 1);
+    }
+  }
+  sum = 0.0f;
+  r = 0;
+  while (true) {
+    int const x_479 = *(tint_symbol_4);
+    if ((x_479 < 100)) {
+    } else {
+      break;
+    }
+    int const x_482 = *(tint_symbol_4);
+    *(tint_symbol_4) = (x_482 + 1);
+    int const x_484 = r;
+    float const x_486 = m23[0][x_484];
+    float const x_487 = sum;
+    sum = (x_487 + x_486);
+    int const x_489 = r;
+    float const x_491 = m24[0][x_489];
+    float const x_492 = sum;
+    sum = (x_492 + x_491);
+    int const x_494 = r;
+    float const x_496 = m32[0][x_494];
+    float const x_497 = sum;
+    sum = (x_497 + x_496);
+    int const x_499 = r;
+    float const x_501 = m33[0][x_499];
+    float const x_502 = sum;
+    sum = (x_502 + x_501);
+    int const x_504 = r;
+    float const x_506 = m34[0][x_504];
+    float const x_507 = sum;
+    sum = (x_507 + x_506);
+    int const x_509 = r;
+    float const x_511 = m42[0][x_509];
+    float const x_512 = sum;
+    sum = (x_512 + x_511);
+    int const x_514 = r;
+    float const x_516 = m43[0][x_514];
+    float const x_517 = sum;
+    sum = (x_517 + x_516);
+    int const x_519 = r;
+    float const x_521 = m44[0][x_519];
+    float const x_522 = sum;
+    sum = (x_522 + x_521);
+    {
+      int const x_524 = r;
+      r = (x_524 + 1);
+    }
+  }
+  float const x_526 = sum;
+  if ((x_526 == 8.0f)) {
+    *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_5) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread int tint_symbol_6 = 0;
+  thread float4 tint_symbol_7 = 0.0f;
+  main_1(&(tint_symbol_6), &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-multiple-one-iteration-loops-global-counter-write-matrices/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-multiple-one-iteration-loops-global-counter-write-matrices/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..eb04454
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-multiple-one-iteration-loops-global-counter-write-matrices/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,1187 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 636
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_global_loop_count "x_GLF_global_loop_count"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %m23 "m23"
+               OpName %m24 "m24"
+               OpName %m32 "m32"
+               OpName %m33 "m33"
+               OpName %m34 "m34"
+               OpName %m42 "m42"
+               OpName %m43 "m43"
+               OpName %m44 "m44"
+               OpName %i "i"
+               OpName %i_1 "i_1"
+               OpName %i_2 "i_2"
+               OpName %i_3 "i_3"
+               OpName %i_4 "i_4"
+               OpName %i_5 "i_5"
+               OpName %i_6 "i_6"
+               OpName %i_7 "i_7"
+               OpName %i_8 "i_8"
+               OpName %i_9 "i_9"
+               OpName %i_10 "i_10"
+               OpName %i_11 "i_11"
+               OpName %i_12 "i_12"
+               OpName %i_13 "i_13"
+               OpName %i_14 "i_14"
+               OpName %i_15 "i_15"
+               OpName %i_16 "i_16"
+               OpName %i_17 "i_17"
+               OpName %i_18 "i_18"
+               OpName %i_19 "i_19"
+               OpName %i_20 "i_20"
+               OpName %i_21 "i_21"
+               OpName %i_22 "i_22"
+               OpName %i_23 "i_23"
+               OpName %i_24 "i_24"
+               OpName %i_25 "i_25"
+               OpName %i_26 "i_26"
+               OpName %i_27 "i_27"
+               OpName %i_28 "i_28"
+               OpName %i_29 "i_29"
+               OpName %i_30 "i_30"
+               OpName %i_31 "i_31"
+               OpName %i_32 "i_32"
+               OpName %i_33 "i_33"
+               OpName %i_34 "i_34"
+               OpName %i_35 "i_35"
+               OpName %i_36 "i_36"
+               OpName %i_37 "i_37"
+               OpName %sum "sum"
+               OpName %r "r"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+          %4 = OpConstantNull %int
+%x_GLF_global_loop_count = OpVariable %_ptr_Private_int Private %4
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+    %v3float = OpTypeVector %float 3
+%mat2v3float = OpTypeMatrix %v3float 2
+%_ptr_Function_mat2v3float = OpTypePointer Function %mat2v3float
+         %20 = OpConstantNull %mat2v3float
+%mat2v4float = OpTypeMatrix %v4float 2
+%_ptr_Function_mat2v4float = OpTypePointer Function %mat2v4float
+         %24 = OpConstantNull %mat2v4float
+    %v2float = OpTypeVector %float 2
+%mat3v2float = OpTypeMatrix %v2float 3
+%_ptr_Function_mat3v2float = OpTypePointer Function %mat3v2float
+         %29 = OpConstantNull %mat3v2float
+%mat3v3float = OpTypeMatrix %v3float 3
+%_ptr_Function_mat3v3float = OpTypePointer Function %mat3v3float
+         %33 = OpConstantNull %mat3v3float
+%mat3v4float = OpTypeMatrix %v4float 3
+%_ptr_Function_mat3v4float = OpTypePointer Function %mat3v4float
+         %37 = OpConstantNull %mat3v4float
+%mat4v2float = OpTypeMatrix %v2float 4
+%_ptr_Function_mat4v2float = OpTypePointer Function %mat4v2float
+         %41 = OpConstantNull %mat4v2float
+%mat4v3float = OpTypeMatrix %v3float 4
+%_ptr_Function_mat4v3float = OpTypePointer Function %mat4v3float
+         %45 = OpConstantNull %mat4v3float
+%mat4v4float = OpTypeMatrix %v4float 4
+%_ptr_Function_mat4v4float = OpTypePointer Function %mat4v4float
+         %49 = OpConstantNull %mat4v4float
+%_ptr_Function_int = OpTypePointer Function %int
+%_ptr_Function_float = OpTypePointer Function %float
+         %91 = OpConstantNull %float
+      %int_0 = OpConstant %int 0
+    %float_0 = OpConstant %float 0
+         %95 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+         %96 = OpConstantComposite %mat2v3float %95 %95
+         %97 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+         %98 = OpConstantComposite %mat2v4float %97 %97
+         %99 = OpConstantComposite %v2float %float_0 %float_0
+        %100 = OpConstantComposite %mat3v2float %99 %99 %99
+        %101 = OpConstantComposite %mat3v3float %95 %95 %95
+        %102 = OpConstantComposite %mat3v4float %97 %97 %97
+        %103 = OpConstantComposite %mat4v2float %99 %99 %99 %99
+        %104 = OpConstantComposite %mat4v3float %95 %95 %95 %95
+        %105 = OpConstantComposite %mat4v4float %97 %97 %97 %97
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+     %int_98 = OpConstant %int 98
+    %float_1 = OpConstant %float 1
+    %int_100 = OpConstant %int 100
+    %float_8 = OpConstant %float 8
+        %623 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %624 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+        %m23 = OpVariable %_ptr_Function_mat2v3float Function %20
+        %m24 = OpVariable %_ptr_Function_mat2v4float Function %24
+        %m32 = OpVariable %_ptr_Function_mat3v2float Function %29
+        %m33 = OpVariable %_ptr_Function_mat3v3float Function %33
+        %m34 = OpVariable %_ptr_Function_mat3v4float Function %37
+        %m42 = OpVariable %_ptr_Function_mat4v2float Function %41
+        %m43 = OpVariable %_ptr_Function_mat4v3float Function %45
+        %m44 = OpVariable %_ptr_Function_mat4v4float Function %49
+          %i = OpVariable %_ptr_Function_int Function %4
+        %i_1 = OpVariable %_ptr_Function_int Function %4
+        %i_2 = OpVariable %_ptr_Function_int Function %4
+        %i_3 = OpVariable %_ptr_Function_int Function %4
+        %i_4 = OpVariable %_ptr_Function_int Function %4
+        %i_5 = OpVariable %_ptr_Function_int Function %4
+        %i_6 = OpVariable %_ptr_Function_int Function %4
+        %i_7 = OpVariable %_ptr_Function_int Function %4
+        %i_8 = OpVariable %_ptr_Function_int Function %4
+        %i_9 = OpVariable %_ptr_Function_int Function %4
+       %i_10 = OpVariable %_ptr_Function_int Function %4
+       %i_11 = OpVariable %_ptr_Function_int Function %4
+       %i_12 = OpVariable %_ptr_Function_int Function %4
+       %i_13 = OpVariable %_ptr_Function_int Function %4
+       %i_14 = OpVariable %_ptr_Function_int Function %4
+       %i_15 = OpVariable %_ptr_Function_int Function %4
+       %i_16 = OpVariable %_ptr_Function_int Function %4
+       %i_17 = OpVariable %_ptr_Function_int Function %4
+       %i_18 = OpVariable %_ptr_Function_int Function %4
+       %i_19 = OpVariable %_ptr_Function_int Function %4
+       %i_20 = OpVariable %_ptr_Function_int Function %4
+       %i_21 = OpVariable %_ptr_Function_int Function %4
+       %i_22 = OpVariable %_ptr_Function_int Function %4
+       %i_23 = OpVariable %_ptr_Function_int Function %4
+       %i_24 = OpVariable %_ptr_Function_int Function %4
+       %i_25 = OpVariable %_ptr_Function_int Function %4
+       %i_26 = OpVariable %_ptr_Function_int Function %4
+       %i_27 = OpVariable %_ptr_Function_int Function %4
+       %i_28 = OpVariable %_ptr_Function_int Function %4
+       %i_29 = OpVariable %_ptr_Function_int Function %4
+       %i_30 = OpVariable %_ptr_Function_int Function %4
+       %i_31 = OpVariable %_ptr_Function_int Function %4
+       %i_32 = OpVariable %_ptr_Function_int Function %4
+       %i_33 = OpVariable %_ptr_Function_int Function %4
+       %i_34 = OpVariable %_ptr_Function_int Function %4
+       %i_35 = OpVariable %_ptr_Function_int Function %4
+       %i_36 = OpVariable %_ptr_Function_int Function %4
+       %i_37 = OpVariable %_ptr_Function_int Function %4
+        %sum = OpVariable %_ptr_Function_float Function %91
+          %r = OpVariable %_ptr_Function_int Function %4
+               OpStore %x_GLF_global_loop_count %int_0
+               OpStore %m23 %96
+               OpStore %m24 %98
+               OpStore %m32 %100
+               OpStore %m33 %101
+               OpStore %m34 %102
+               OpStore %m42 %103
+               OpStore %m43 %104
+               OpStore %m44 %105
+               OpStore %i %int_0
+               OpBranch %106
+        %106 = OpLabel
+               OpLoopMerge %107 %108 None
+               OpBranch %109
+        %109 = OpLabel
+        %110 = OpLoad %int %i
+        %112 = OpSLessThan %bool %110 %int_1
+               OpSelectionMerge %114 None
+               OpBranchConditional %112 %115 %116
+        %115 = OpLabel
+               OpBranch %114
+        %116 = OpLabel
+               OpBranch %107
+        %114 = OpLabel
+               OpStore %i_1 %int_0
+               OpBranch %117
+        %117 = OpLabel
+               OpLoopMerge %118 %119 None
+               OpBranch %120
+        %120 = OpLabel
+        %121 = OpLoad %int %i_1
+        %122 = OpSLessThan %bool %121 %int_1
+               OpSelectionMerge %123 None
+               OpBranchConditional %122 %124 %125
+        %124 = OpLabel
+               OpBranch %123
+        %125 = OpLabel
+               OpBranch %118
+        %123 = OpLabel
+               OpStore %i_2 %int_0
+               OpBranch %126
+        %126 = OpLabel
+               OpLoopMerge %127 %128 None
+               OpBranch %129
+        %129 = OpLabel
+        %130 = OpLoad %int %i_2
+        %131 = OpSLessThan %bool %130 %int_1
+               OpSelectionMerge %132 None
+               OpBranchConditional %131 %133 %134
+        %133 = OpLabel
+               OpBranch %132
+        %134 = OpLabel
+               OpBranch %127
+        %132 = OpLabel
+               OpStore %i_3 %int_0
+               OpBranch %135
+        %135 = OpLabel
+               OpLoopMerge %136 %137 None
+               OpBranch %138
+        %138 = OpLabel
+        %139 = OpLoad %int %i_3
+        %140 = OpSLessThan %bool %139 %int_1
+               OpSelectionMerge %141 None
+               OpBranchConditional %140 %142 %143
+        %142 = OpLabel
+               OpBranch %141
+        %143 = OpLabel
+               OpBranch %136
+        %141 = OpLabel
+               OpStore %i_4 %int_0
+               OpBranch %144
+        %144 = OpLabel
+               OpLoopMerge %145 %146 None
+               OpBranch %147
+        %147 = OpLabel
+        %148 = OpLoad %int %i_4
+        %149 = OpSLessThan %bool %148 %int_1
+               OpSelectionMerge %150 None
+               OpBranchConditional %149 %151 %152
+        %151 = OpLabel
+               OpBranch %150
+        %152 = OpLabel
+               OpBranch %145
+        %150 = OpLabel
+               OpStore %i_5 %int_0
+               OpBranch %153
+        %153 = OpLabel
+               OpLoopMerge %154 %155 None
+               OpBranch %156
+        %156 = OpLabel
+        %157 = OpLoad %int %i_5
+        %158 = OpSLessThan %bool %157 %int_1
+               OpSelectionMerge %159 None
+               OpBranchConditional %158 %160 %161
+        %160 = OpLabel
+               OpBranch %159
+        %161 = OpLabel
+               OpBranch %154
+        %159 = OpLabel
+               OpStore %i_6 %int_0
+               OpBranch %162
+        %162 = OpLabel
+               OpLoopMerge %163 %164 None
+               OpBranch %165
+        %165 = OpLabel
+        %166 = OpLoad %int %i_6
+        %167 = OpSLessThan %bool %166 %int_1
+               OpSelectionMerge %168 None
+               OpBranchConditional %167 %169 %170
+        %169 = OpLabel
+               OpBranch %168
+        %170 = OpLabel
+               OpBranch %163
+        %168 = OpLabel
+               OpStore %i_7 %int_0
+               OpBranch %171
+        %171 = OpLabel
+               OpLoopMerge %172 %173 None
+               OpBranch %174
+        %174 = OpLabel
+        %175 = OpLoad %int %i_7
+        %176 = OpSLessThan %bool %175 %int_1
+               OpSelectionMerge %177 None
+               OpBranchConditional %176 %178 %179
+        %178 = OpLabel
+               OpBranch %177
+        %179 = OpLabel
+               OpBranch %172
+        %177 = OpLabel
+               OpStore %i_8 %int_0
+               OpBranch %180
+        %180 = OpLabel
+               OpLoopMerge %181 %182 None
+               OpBranch %183
+        %183 = OpLabel
+        %184 = OpLoad %int %i_8
+        %185 = OpSLessThan %bool %184 %int_1
+               OpSelectionMerge %186 None
+               OpBranchConditional %185 %187 %188
+        %187 = OpLabel
+               OpBranch %186
+        %188 = OpLabel
+               OpBranch %181
+        %186 = OpLabel
+               OpStore %i_9 %int_0
+               OpBranch %189
+        %189 = OpLabel
+               OpLoopMerge %190 %191 None
+               OpBranch %192
+        %192 = OpLabel
+        %193 = OpLoad %int %i_9
+        %194 = OpSLessThan %bool %193 %int_1
+               OpSelectionMerge %195 None
+               OpBranchConditional %194 %196 %197
+        %196 = OpLabel
+               OpBranch %195
+        %197 = OpLabel
+               OpBranch %190
+        %195 = OpLabel
+               OpStore %i_10 %int_0
+               OpBranch %198
+        %198 = OpLabel
+               OpLoopMerge %199 %200 None
+               OpBranch %201
+        %201 = OpLabel
+        %202 = OpLoad %int %i_10
+        %203 = OpSLessThan %bool %202 %int_1
+               OpSelectionMerge %204 None
+               OpBranchConditional %203 %205 %206
+        %205 = OpLabel
+               OpBranch %204
+        %206 = OpLabel
+               OpBranch %199
+        %204 = OpLabel
+               OpStore %i_11 %int_0
+               OpBranch %207
+        %207 = OpLabel
+               OpLoopMerge %208 %209 None
+               OpBranch %210
+        %210 = OpLabel
+        %211 = OpLoad %int %i_11
+        %212 = OpSLessThan %bool %211 %int_1
+               OpSelectionMerge %213 None
+               OpBranchConditional %212 %214 %215
+        %214 = OpLabel
+               OpBranch %213
+        %215 = OpLabel
+               OpBranch %208
+        %213 = OpLabel
+               OpStore %i_12 %int_0
+               OpBranch %216
+        %216 = OpLabel
+               OpLoopMerge %217 %218 None
+               OpBranch %219
+        %219 = OpLabel
+        %220 = OpLoad %int %i_12
+        %221 = OpSLessThan %bool %220 %int_1
+               OpSelectionMerge %222 None
+               OpBranchConditional %221 %223 %224
+        %223 = OpLabel
+               OpBranch %222
+        %224 = OpLabel
+               OpBranch %217
+        %222 = OpLabel
+               OpStore %i_13 %int_0
+               OpBranch %225
+        %225 = OpLabel
+               OpLoopMerge %226 %227 None
+               OpBranch %228
+        %228 = OpLabel
+        %229 = OpLoad %int %i_13
+        %230 = OpSLessThan %bool %229 %int_1
+               OpSelectionMerge %231 None
+               OpBranchConditional %230 %232 %233
+        %232 = OpLabel
+               OpBranch %231
+        %233 = OpLabel
+               OpBranch %226
+        %231 = OpLabel
+               OpStore %i_14 %int_0
+               OpBranch %234
+        %234 = OpLabel
+               OpLoopMerge %235 %236 None
+               OpBranch %237
+        %237 = OpLabel
+        %238 = OpLoad %int %i_14
+        %239 = OpSLessThan %bool %238 %int_1
+               OpSelectionMerge %240 None
+               OpBranchConditional %239 %241 %242
+        %241 = OpLabel
+               OpBranch %240
+        %242 = OpLabel
+               OpBranch %235
+        %240 = OpLabel
+               OpStore %i_15 %int_0
+               OpBranch %243
+        %243 = OpLabel
+               OpLoopMerge %244 %245 None
+               OpBranch %246
+        %246 = OpLabel
+        %247 = OpLoad %int %i_15
+        %248 = OpSLessThan %bool %247 %int_1
+               OpSelectionMerge %249 None
+               OpBranchConditional %248 %250 %251
+        %250 = OpLabel
+               OpBranch %249
+        %251 = OpLabel
+               OpBranch %244
+        %249 = OpLabel
+               OpStore %i_16 %int_0
+               OpBranch %252
+        %252 = OpLabel
+               OpLoopMerge %253 %254 None
+               OpBranch %255
+        %255 = OpLabel
+        %256 = OpLoad %int %i_16
+        %257 = OpSLessThan %bool %256 %int_1
+               OpSelectionMerge %258 None
+               OpBranchConditional %257 %259 %260
+        %259 = OpLabel
+               OpBranch %258
+        %260 = OpLabel
+               OpBranch %253
+        %258 = OpLabel
+               OpStore %i_17 %int_0
+               OpBranch %261
+        %261 = OpLabel
+               OpLoopMerge %262 %263 None
+               OpBranch %264
+        %264 = OpLabel
+        %265 = OpLoad %int %i_17
+        %266 = OpSLessThan %bool %265 %int_1
+               OpSelectionMerge %267 None
+               OpBranchConditional %266 %268 %269
+        %268 = OpLabel
+               OpBranch %267
+        %269 = OpLabel
+               OpBranch %262
+        %267 = OpLabel
+               OpStore %i_18 %int_0
+               OpBranch %270
+        %270 = OpLabel
+               OpLoopMerge %271 %272 None
+               OpBranch %273
+        %273 = OpLabel
+        %274 = OpLoad %int %i_18
+        %275 = OpSLessThan %bool %274 %int_1
+               OpSelectionMerge %276 None
+               OpBranchConditional %275 %277 %278
+        %277 = OpLabel
+               OpBranch %276
+        %278 = OpLabel
+               OpBranch %271
+        %276 = OpLabel
+               OpStore %i_19 %int_0
+               OpBranch %279
+        %279 = OpLabel
+               OpLoopMerge %280 %281 None
+               OpBranch %282
+        %282 = OpLabel
+        %283 = OpLoad %int %i_19
+        %284 = OpSLessThan %bool %283 %int_1
+               OpSelectionMerge %285 None
+               OpBranchConditional %284 %286 %287
+        %286 = OpLabel
+               OpBranch %285
+        %287 = OpLabel
+               OpBranch %280
+        %285 = OpLabel
+               OpStore %i_20 %int_0
+               OpBranch %288
+        %288 = OpLabel
+               OpLoopMerge %289 %290 None
+               OpBranch %291
+        %291 = OpLabel
+        %292 = OpLoad %int %i_20
+        %293 = OpSLessThan %bool %292 %int_1
+               OpSelectionMerge %294 None
+               OpBranchConditional %293 %295 %296
+        %295 = OpLabel
+               OpBranch %294
+        %296 = OpLabel
+               OpBranch %289
+        %294 = OpLabel
+               OpStore %i_21 %int_0
+               OpBranch %297
+        %297 = OpLabel
+               OpLoopMerge %298 %299 None
+               OpBranch %300
+        %300 = OpLabel
+        %301 = OpLoad %int %i_21
+        %302 = OpSLessThan %bool %301 %int_1
+               OpSelectionMerge %303 None
+               OpBranchConditional %302 %304 %305
+        %304 = OpLabel
+               OpBranch %303
+        %305 = OpLabel
+               OpBranch %298
+        %303 = OpLabel
+               OpStore %i_22 %int_0
+               OpBranch %306
+        %306 = OpLabel
+               OpLoopMerge %307 %308 None
+               OpBranch %309
+        %309 = OpLabel
+        %310 = OpLoad %int %i_22
+        %311 = OpSLessThan %bool %310 %int_1
+               OpSelectionMerge %312 None
+               OpBranchConditional %311 %313 %314
+        %313 = OpLabel
+               OpBranch %312
+        %314 = OpLabel
+               OpBranch %307
+        %312 = OpLabel
+               OpStore %i_23 %int_0
+               OpBranch %315
+        %315 = OpLabel
+               OpLoopMerge %316 %317 None
+               OpBranch %318
+        %318 = OpLabel
+        %319 = OpLoad %int %i_23
+        %320 = OpSLessThan %bool %319 %int_1
+               OpSelectionMerge %321 None
+               OpBranchConditional %320 %322 %323
+        %322 = OpLabel
+               OpBranch %321
+        %323 = OpLabel
+               OpBranch %316
+        %321 = OpLabel
+               OpStore %i_24 %int_0
+               OpBranch %324
+        %324 = OpLabel
+               OpLoopMerge %325 %326 None
+               OpBranch %327
+        %327 = OpLabel
+        %328 = OpLoad %int %i_24
+        %329 = OpSLessThan %bool %328 %int_1
+               OpSelectionMerge %330 None
+               OpBranchConditional %329 %331 %332
+        %331 = OpLabel
+               OpBranch %330
+        %332 = OpLabel
+               OpBranch %325
+        %330 = OpLabel
+               OpStore %i_25 %int_0
+               OpBranch %333
+        %333 = OpLabel
+               OpLoopMerge %334 %335 None
+               OpBranch %336
+        %336 = OpLabel
+        %337 = OpLoad %int %i_25
+        %338 = OpSLessThan %bool %337 %int_1
+               OpSelectionMerge %339 None
+               OpBranchConditional %338 %340 %341
+        %340 = OpLabel
+               OpBranch %339
+        %341 = OpLabel
+               OpBranch %334
+        %339 = OpLabel
+               OpStore %i_26 %int_0
+               OpBranch %342
+        %342 = OpLabel
+               OpLoopMerge %343 %344 None
+               OpBranch %345
+        %345 = OpLabel
+        %346 = OpLoad %int %i_26
+        %347 = OpSLessThan %bool %346 %int_1
+               OpSelectionMerge %348 None
+               OpBranchConditional %347 %349 %350
+        %349 = OpLabel
+               OpBranch %348
+        %350 = OpLabel
+               OpBranch %343
+        %348 = OpLabel
+               OpStore %i_27 %int_0
+               OpBranch %351
+        %351 = OpLabel
+               OpLoopMerge %352 %353 None
+               OpBranch %354
+        %354 = OpLabel
+        %355 = OpLoad %int %i_27
+        %356 = OpSLessThan %bool %355 %int_1
+               OpSelectionMerge %357 None
+               OpBranchConditional %356 %358 %359
+        %358 = OpLabel
+               OpBranch %357
+        %359 = OpLabel
+               OpBranch %352
+        %357 = OpLabel
+               OpStore %i_28 %int_0
+               OpBranch %360
+        %360 = OpLabel
+               OpLoopMerge %361 %362 None
+               OpBranch %363
+        %363 = OpLabel
+        %364 = OpLoad %int %i_28
+        %365 = OpSLessThan %bool %364 %int_1
+               OpSelectionMerge %366 None
+               OpBranchConditional %365 %367 %368
+        %367 = OpLabel
+               OpBranch %366
+        %368 = OpLabel
+               OpBranch %361
+        %366 = OpLabel
+               OpStore %i_29 %int_0
+               OpBranch %369
+        %369 = OpLabel
+               OpLoopMerge %370 %371 None
+               OpBranch %372
+        %372 = OpLabel
+        %373 = OpLoad %int %i_29
+        %374 = OpSLessThan %bool %373 %int_1
+               OpSelectionMerge %375 None
+               OpBranchConditional %374 %376 %377
+        %376 = OpLabel
+               OpBranch %375
+        %377 = OpLabel
+               OpBranch %370
+        %375 = OpLabel
+               OpStore %i_30 %int_0
+               OpBranch %378
+        %378 = OpLabel
+               OpLoopMerge %379 %380 None
+               OpBranch %381
+        %381 = OpLabel
+        %382 = OpLoad %int %i_30
+        %383 = OpSLessThan %bool %382 %int_1
+               OpSelectionMerge %384 None
+               OpBranchConditional %383 %385 %386
+        %385 = OpLabel
+               OpBranch %384
+        %386 = OpLabel
+               OpBranch %379
+        %384 = OpLabel
+               OpStore %i_31 %int_0
+               OpBranch %387
+        %387 = OpLabel
+               OpLoopMerge %388 %389 None
+               OpBranch %390
+        %390 = OpLabel
+        %391 = OpLoad %int %i_31
+        %392 = OpSLessThan %bool %391 %int_1
+               OpSelectionMerge %393 None
+               OpBranchConditional %392 %394 %395
+        %394 = OpLabel
+               OpBranch %393
+        %395 = OpLabel
+               OpBranch %388
+        %393 = OpLabel
+               OpStore %i_32 %int_0
+               OpBranch %396
+        %396 = OpLabel
+               OpLoopMerge %397 %398 None
+               OpBranch %399
+        %399 = OpLabel
+        %400 = OpLoad %int %i_32
+        %401 = OpSLessThan %bool %400 %int_1
+               OpSelectionMerge %402 None
+               OpBranchConditional %401 %403 %404
+        %403 = OpLabel
+               OpBranch %402
+        %404 = OpLabel
+               OpBranch %397
+        %402 = OpLabel
+               OpStore %i_33 %int_0
+               OpBranch %405
+        %405 = OpLabel
+               OpLoopMerge %406 %407 None
+               OpBranch %408
+        %408 = OpLabel
+        %409 = OpLoad %int %i_33
+        %410 = OpSLessThan %bool %409 %int_1
+               OpSelectionMerge %411 None
+               OpBranchConditional %410 %412 %413
+        %412 = OpLabel
+               OpBranch %411
+        %413 = OpLabel
+               OpBranch %406
+        %411 = OpLabel
+               OpStore %i_34 %int_0
+               OpBranch %414
+        %414 = OpLabel
+               OpLoopMerge %415 %416 None
+               OpBranch %417
+        %417 = OpLabel
+        %418 = OpLoad %int %i_34
+        %419 = OpSLessThan %bool %418 %int_1
+               OpSelectionMerge %420 None
+               OpBranchConditional %419 %421 %422
+        %421 = OpLabel
+               OpBranch %420
+        %422 = OpLabel
+               OpBranch %415
+        %420 = OpLabel
+               OpStore %i_35 %int_0
+               OpBranch %423
+        %423 = OpLabel
+               OpLoopMerge %424 %425 None
+               OpBranch %426
+        %426 = OpLabel
+        %427 = OpLoad %int %i_35
+        %428 = OpSLessThan %bool %427 %int_1
+               OpSelectionMerge %429 None
+               OpBranchConditional %428 %430 %431
+        %430 = OpLabel
+               OpBranch %429
+        %431 = OpLabel
+               OpBranch %424
+        %429 = OpLabel
+               OpStore %i_36 %int_0
+               OpBranch %432
+        %432 = OpLabel
+               OpLoopMerge %433 %434 None
+               OpBranch %435
+        %435 = OpLabel
+        %436 = OpLoad %int %i_36
+        %437 = OpSLessThan %bool %436 %int_1
+               OpSelectionMerge %438 None
+               OpBranchConditional %437 %439 %440
+        %439 = OpLabel
+               OpBranch %438
+        %440 = OpLabel
+               OpBranch %433
+        %438 = OpLabel
+               OpStore %i_37 %int_0
+               OpBranch %441
+        %441 = OpLabel
+               OpLoopMerge %442 %443 None
+               OpBranch %444
+        %444 = OpLabel
+        %445 = OpLoad %int %i_37
+        %446 = OpSLessThan %bool %445 %int_1
+               OpSelectionMerge %447 None
+               OpBranchConditional %446 %448 %449
+        %448 = OpLabel
+               OpBranch %447
+        %449 = OpLabel
+               OpBranch %442
+        %447 = OpLabel
+               OpBranch %450
+        %450 = OpLabel
+               OpLoopMerge %451 %452 None
+               OpBranch %453
+        %453 = OpLabel
+        %454 = OpLoad %int %x_GLF_global_loop_count
+        %455 = OpIAdd %int %454 %int_1
+               OpStore %x_GLF_global_loop_count %455
+               OpBranch %452
+        %452 = OpLabel
+        %456 = OpLoad %int %x_GLF_global_loop_count
+        %458 = OpSLessThan %bool %456 %int_98
+               OpSelectionMerge %459 None
+               OpBranchConditional %458 %460 %461
+        %460 = OpLabel
+               OpBranch %459
+        %461 = OpLabel
+               OpBranch %451
+        %459 = OpLabel
+               OpBranch %450
+        %451 = OpLabel
+        %462 = OpLoad %int %i_37
+        %463 = OpLoad %int %i_37
+        %464 = OpAccessChain %_ptr_Function_float %m23 %462 %463
+               OpStore %464 %float_1
+        %466 = OpLoad %int %i_37
+        %467 = OpLoad %int %i_37
+        %468 = OpAccessChain %_ptr_Function_float %m24 %466 %467
+               OpStore %468 %float_1
+        %469 = OpLoad %int %i_37
+        %470 = OpLoad %int %i_37
+        %471 = OpAccessChain %_ptr_Function_float %m32 %469 %470
+               OpStore %471 %float_1
+        %472 = OpLoad %int %i_37
+        %473 = OpLoad %int %i_37
+        %474 = OpAccessChain %_ptr_Function_float %m33 %472 %473
+               OpStore %474 %float_1
+        %475 = OpLoad %int %i_37
+        %476 = OpLoad %int %i_37
+        %477 = OpAccessChain %_ptr_Function_float %m34 %475 %476
+               OpStore %477 %float_1
+        %478 = OpLoad %int %i_37
+        %479 = OpLoad %int %i_37
+        %480 = OpAccessChain %_ptr_Function_float %m42 %478 %479
+               OpStore %480 %float_1
+        %481 = OpLoad %int %i_37
+        %482 = OpLoad %int %i_37
+        %483 = OpAccessChain %_ptr_Function_float %m43 %481 %482
+               OpStore %483 %float_1
+        %484 = OpLoad %int %i_37
+        %485 = OpLoad %int %i_37
+        %486 = OpAccessChain %_ptr_Function_float %m44 %484 %485
+               OpStore %486 %float_1
+               OpBranch %443
+        %443 = OpLabel
+        %487 = OpLoad %int %i_37
+        %488 = OpIAdd %int %487 %int_1
+               OpStore %i_37 %488
+               OpBranch %441
+        %442 = OpLabel
+               OpBranch %434
+        %434 = OpLabel
+        %489 = OpLoad %int %i_36
+        %490 = OpIAdd %int %489 %int_1
+               OpStore %i_36 %490
+               OpBranch %432
+        %433 = OpLabel
+               OpBranch %425
+        %425 = OpLabel
+        %491 = OpLoad %int %i_35
+        %492 = OpIAdd %int %491 %int_1
+               OpStore %i_35 %492
+               OpBranch %423
+        %424 = OpLabel
+               OpBranch %416
+        %416 = OpLabel
+        %493 = OpLoad %int %i_34
+        %494 = OpIAdd %int %493 %int_1
+               OpStore %i_34 %494
+               OpBranch %414
+        %415 = OpLabel
+               OpBranch %407
+        %407 = OpLabel
+        %495 = OpLoad %int %i_33
+        %496 = OpIAdd %int %495 %int_1
+               OpStore %i_33 %496
+               OpBranch %405
+        %406 = OpLabel
+               OpBranch %398
+        %398 = OpLabel
+        %497 = OpLoad %int %i_32
+        %498 = OpIAdd %int %497 %int_1
+               OpStore %i_32 %498
+               OpBranch %396
+        %397 = OpLabel
+               OpBranch %389
+        %389 = OpLabel
+        %499 = OpLoad %int %i_31
+        %500 = OpIAdd %int %499 %int_1
+               OpStore %i_31 %500
+               OpBranch %387
+        %388 = OpLabel
+               OpBranch %380
+        %380 = OpLabel
+        %501 = OpLoad %int %i_30
+        %502 = OpIAdd %int %501 %int_1
+               OpStore %i_30 %502
+               OpBranch %378
+        %379 = OpLabel
+               OpBranch %371
+        %371 = OpLabel
+        %503 = OpLoad %int %i_29
+        %504 = OpIAdd %int %503 %int_1
+               OpStore %i_29 %504
+               OpBranch %369
+        %370 = OpLabel
+               OpBranch %362
+        %362 = OpLabel
+        %505 = OpLoad %int %i_28
+        %506 = OpIAdd %int %505 %int_1
+               OpStore %i_28 %506
+               OpBranch %360
+        %361 = OpLabel
+               OpBranch %353
+        %353 = OpLabel
+        %507 = OpLoad %int %i_27
+        %508 = OpIAdd %int %507 %int_1
+               OpStore %i_27 %508
+               OpBranch %351
+        %352 = OpLabel
+               OpBranch %344
+        %344 = OpLabel
+        %509 = OpLoad %int %i_26
+        %510 = OpIAdd %int %509 %int_1
+               OpStore %i_26 %510
+               OpBranch %342
+        %343 = OpLabel
+               OpBranch %335
+        %335 = OpLabel
+        %511 = OpLoad %int %i_25
+        %512 = OpIAdd %int %511 %int_1
+               OpStore %i_25 %512
+               OpBranch %333
+        %334 = OpLabel
+               OpBranch %326
+        %326 = OpLabel
+        %513 = OpLoad %int %i_24
+        %514 = OpIAdd %int %513 %int_1
+               OpStore %i_24 %514
+               OpBranch %324
+        %325 = OpLabel
+               OpBranch %317
+        %317 = OpLabel
+        %515 = OpLoad %int %i_23
+        %516 = OpIAdd %int %515 %int_1
+               OpStore %i_23 %516
+               OpBranch %315
+        %316 = OpLabel
+               OpBranch %308
+        %308 = OpLabel
+        %517 = OpLoad %int %i_22
+        %518 = OpIAdd %int %517 %int_1
+               OpStore %i_22 %518
+               OpBranch %306
+        %307 = OpLabel
+               OpBranch %299
+        %299 = OpLabel
+        %519 = OpLoad %int %i_21
+        %520 = OpIAdd %int %519 %int_1
+               OpStore %i_21 %520
+               OpBranch %297
+        %298 = OpLabel
+               OpBranch %290
+        %290 = OpLabel
+        %521 = OpLoad %int %i_20
+        %522 = OpIAdd %int %521 %int_1
+               OpStore %i_20 %522
+               OpBranch %288
+        %289 = OpLabel
+               OpBranch %281
+        %281 = OpLabel
+        %523 = OpLoad %int %i_19
+        %524 = OpIAdd %int %523 %int_1
+               OpStore %i_19 %524
+               OpBranch %279
+        %280 = OpLabel
+               OpBranch %272
+        %272 = OpLabel
+        %525 = OpLoad %int %i_18
+        %526 = OpIAdd %int %525 %int_1
+               OpStore %i_18 %526
+               OpBranch %270
+        %271 = OpLabel
+               OpBranch %263
+        %263 = OpLabel
+        %527 = OpLoad %int %i_17
+        %528 = OpIAdd %int %527 %int_1
+               OpStore %i_17 %528
+               OpBranch %261
+        %262 = OpLabel
+               OpBranch %254
+        %254 = OpLabel
+        %529 = OpLoad %int %i_16
+        %530 = OpIAdd %int %529 %int_1
+               OpStore %i_16 %530
+               OpBranch %252
+        %253 = OpLabel
+               OpBranch %245
+        %245 = OpLabel
+        %531 = OpLoad %int %i_15
+        %532 = OpIAdd %int %531 %int_1
+               OpStore %i_15 %532
+               OpBranch %243
+        %244 = OpLabel
+               OpBranch %236
+        %236 = OpLabel
+        %533 = OpLoad %int %i_14
+        %534 = OpIAdd %int %533 %int_1
+               OpStore %i_14 %534
+               OpBranch %234
+        %235 = OpLabel
+               OpBranch %227
+        %227 = OpLabel
+        %535 = OpLoad %int %i_13
+        %536 = OpIAdd %int %535 %int_1
+               OpStore %i_13 %536
+               OpBranch %225
+        %226 = OpLabel
+               OpBranch %218
+        %218 = OpLabel
+        %537 = OpLoad %int %i_12
+        %538 = OpIAdd %int %537 %int_1
+               OpStore %i_12 %538
+               OpBranch %216
+        %217 = OpLabel
+               OpBranch %209
+        %209 = OpLabel
+        %539 = OpLoad %int %i_11
+        %540 = OpIAdd %int %539 %int_1
+               OpStore %i_11 %540
+               OpBranch %207
+        %208 = OpLabel
+               OpBranch %200
+        %200 = OpLabel
+        %541 = OpLoad %int %i_10
+        %542 = OpIAdd %int %541 %int_1
+               OpStore %i_10 %542
+               OpBranch %198
+        %199 = OpLabel
+               OpBranch %191
+        %191 = OpLabel
+        %543 = OpLoad %int %i_9
+        %544 = OpIAdd %int %543 %int_1
+               OpStore %i_9 %544
+               OpBranch %189
+        %190 = OpLabel
+               OpBranch %182
+        %182 = OpLabel
+        %545 = OpLoad %int %i_8
+        %546 = OpIAdd %int %545 %int_1
+               OpStore %i_8 %546
+               OpBranch %180
+        %181 = OpLabel
+               OpBranch %173
+        %173 = OpLabel
+        %547 = OpLoad %int %i_7
+        %548 = OpIAdd %int %547 %int_1
+               OpStore %i_7 %548
+               OpBranch %171
+        %172 = OpLabel
+               OpBranch %164
+        %164 = OpLabel
+        %549 = OpLoad %int %i_6
+        %550 = OpIAdd %int %549 %int_1
+               OpStore %i_6 %550
+               OpBranch %162
+        %163 = OpLabel
+               OpBranch %155
+        %155 = OpLabel
+        %551 = OpLoad %int %i_5
+        %552 = OpIAdd %int %551 %int_1
+               OpStore %i_5 %552
+               OpBranch %153
+        %154 = OpLabel
+               OpBranch %146
+        %146 = OpLabel
+        %553 = OpLoad %int %i_4
+        %554 = OpIAdd %int %553 %int_1
+               OpStore %i_4 %554
+               OpBranch %144
+        %145 = OpLabel
+               OpBranch %137
+        %137 = OpLabel
+        %555 = OpLoad %int %i_3
+        %556 = OpIAdd %int %555 %int_1
+               OpStore %i_3 %556
+               OpBranch %135
+        %136 = OpLabel
+               OpBranch %128
+        %128 = OpLabel
+        %557 = OpLoad %int %i_2
+        %558 = OpIAdd %int %557 %int_1
+               OpStore %i_2 %558
+               OpBranch %126
+        %127 = OpLabel
+               OpBranch %119
+        %119 = OpLabel
+        %559 = OpLoad %int %i_1
+        %560 = OpIAdd %int %559 %int_1
+               OpStore %i_1 %560
+               OpBranch %117
+        %118 = OpLabel
+               OpBranch %108
+        %108 = OpLabel
+        %561 = OpLoad %int %i
+        %562 = OpIAdd %int %561 %int_1
+               OpStore %i %562
+               OpBranch %106
+        %107 = OpLabel
+               OpStore %sum %float_0
+               OpStore %r %int_0
+               OpBranch %563
+        %563 = OpLabel
+               OpLoopMerge %564 %565 None
+               OpBranch %566
+        %566 = OpLabel
+        %567 = OpLoad %int %x_GLF_global_loop_count
+        %569 = OpSLessThan %bool %567 %int_100
+               OpSelectionMerge %570 None
+               OpBranchConditional %569 %571 %572
+        %571 = OpLabel
+               OpBranch %570
+        %572 = OpLabel
+               OpBranch %564
+        %570 = OpLabel
+        %573 = OpLoad %int %x_GLF_global_loop_count
+        %574 = OpIAdd %int %573 %int_1
+               OpStore %x_GLF_global_loop_count %574
+        %575 = OpLoad %int %r
+        %576 = OpAccessChain %_ptr_Function_float %m23 %int_0 %575
+        %577 = OpLoad %float %576
+        %578 = OpLoad %float %sum
+        %579 = OpFAdd %float %578 %577
+               OpStore %sum %579
+        %580 = OpLoad %int %r
+        %581 = OpAccessChain %_ptr_Function_float %m24 %int_0 %580
+        %582 = OpLoad %float %581
+        %583 = OpLoad %float %sum
+        %584 = OpFAdd %float %583 %582
+               OpStore %sum %584
+        %585 = OpLoad %int %r
+        %586 = OpAccessChain %_ptr_Function_float %m32 %int_0 %585
+        %587 = OpLoad %float %586
+        %588 = OpLoad %float %sum
+        %589 = OpFAdd %float %588 %587
+               OpStore %sum %589
+        %590 = OpLoad %int %r
+        %591 = OpAccessChain %_ptr_Function_float %m33 %int_0 %590
+        %592 = OpLoad %float %591
+        %593 = OpLoad %float %sum
+        %594 = OpFAdd %float %593 %592
+               OpStore %sum %594
+        %595 = OpLoad %int %r
+        %596 = OpAccessChain %_ptr_Function_float %m34 %int_0 %595
+        %597 = OpLoad %float %596
+        %598 = OpLoad %float %sum
+        %599 = OpFAdd %float %598 %597
+               OpStore %sum %599
+        %600 = OpLoad %int %r
+        %601 = OpAccessChain %_ptr_Function_float %m42 %int_0 %600
+        %602 = OpLoad %float %601
+        %603 = OpLoad %float %sum
+        %604 = OpFAdd %float %603 %602
+               OpStore %sum %604
+        %605 = OpLoad %int %r
+        %606 = OpAccessChain %_ptr_Function_float %m43 %int_0 %605
+        %607 = OpLoad %float %606
+        %608 = OpLoad %float %sum
+        %609 = OpFAdd %float %608 %607
+               OpStore %sum %609
+        %610 = OpLoad %int %r
+        %611 = OpAccessChain %_ptr_Function_float %m44 %int_0 %610
+        %612 = OpLoad %float %611
+        %613 = OpLoad %float %sum
+        %614 = OpFAdd %float %613 %612
+               OpStore %sum %614
+               OpBranch %565
+        %565 = OpLabel
+        %615 = OpLoad %int %r
+        %616 = OpIAdd %int %615 %int_1
+               OpStore %r %616
+               OpBranch %563
+        %564 = OpLabel
+        %617 = OpLoad %float %sum
+        %619 = OpFOrdEqual %bool %617 %float_8
+               OpSelectionMerge %620 None
+               OpBranchConditional %619 %621 %622
+        %621 = OpLabel
+               OpStore %x_GLF_color %623
+               OpBranch %620
+        %622 = OpLabel
+               OpStore %x_GLF_color %97
+               OpBranch %620
+        %620 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %624
+%tint_symbol = OpFunctionParameter %main_out
+        %628 = OpLabel
+        %629 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %629
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+        %631 = OpLabel
+        %632 = OpFunctionCall %void %main_1
+        %634 = OpLoad %v4float %x_GLF_color
+        %635 = OpCompositeConstruct %main_out %634
+        %633 = OpFunctionCall %void %tint_symbol_2 %635
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 452[%452] is not post dominated by the back-edge block 459[%459]
+  %459 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-multiple-one-iteration-loops-global-counter-write-matrices/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-multiple-one-iteration-loops-global-counter-write-matrices/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..6dbe667
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-multiple-one-iteration-loops-global-counter-write-matrices/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,659 @@
+var<private> x_GLF_global_loop_count : i32;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m23 : mat2x3<f32>;
+  var m24 : mat2x4<f32>;
+  var m32 : mat3x2<f32>;
+  var m33 : mat3x3<f32>;
+  var m34 : mat3x4<f32>;
+  var m42 : mat4x2<f32>;
+  var m43 : mat4x3<f32>;
+  var m44 : mat4x4<f32>;
+  var i : i32;
+  var i_1 : i32;
+  var i_2 : i32;
+  var i_3 : i32;
+  var i_4 : i32;
+  var i_5 : i32;
+  var i_6 : i32;
+  var i_7 : i32;
+  var i_8 : i32;
+  var i_9 : i32;
+  var i_10 : i32;
+  var i_11 : i32;
+  var i_12 : i32;
+  var i_13 : i32;
+  var i_14 : i32;
+  var i_15 : i32;
+  var i_16 : i32;
+  var i_17 : i32;
+  var i_18 : i32;
+  var i_19 : i32;
+  var i_20 : i32;
+  var i_21 : i32;
+  var i_22 : i32;
+  var i_23 : i32;
+  var i_24 : i32;
+  var i_25 : i32;
+  var i_26 : i32;
+  var i_27 : i32;
+  var i_28 : i32;
+  var i_29 : i32;
+  var i_30 : i32;
+  var i_31 : i32;
+  var i_32 : i32;
+  var i_33 : i32;
+  var i_34 : i32;
+  var i_35 : i32;
+  var i_36 : i32;
+  var i_37 : i32;
+  var sum : f32;
+  var r : i32;
+  x_GLF_global_loop_count = 0;
+  m23 = mat2x3<f32>(vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0));
+  m24 = mat2x4<f32>(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
+  m32 = mat3x2<f32>(vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0));
+  m33 = mat3x3<f32>(vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0));
+  m34 = mat3x4<f32>(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
+  m42 = mat4x2<f32>(vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0));
+  m43 = mat4x3<f32>(vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0));
+  m44 = mat4x4<f32>(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
+  i = 0;
+  loop {
+    let x_105 : i32 = i;
+    if ((x_105 < 1)) {
+    } else {
+      break;
+    }
+    i_1 = 0;
+    loop {
+      let x_112 : i32 = i_1;
+      if ((x_112 < 1)) {
+      } else {
+        break;
+      }
+      i_2 = 0;
+      loop {
+        let x_119 : i32 = i_2;
+        if ((x_119 < 1)) {
+        } else {
+          break;
+        }
+        i_3 = 0;
+        loop {
+          let x_126 : i32 = i_3;
+          if ((x_126 < 1)) {
+          } else {
+            break;
+          }
+          i_4 = 0;
+          loop {
+            let x_133 : i32 = i_4;
+            if ((x_133 < 1)) {
+            } else {
+              break;
+            }
+            i_5 = 0;
+            loop {
+              let x_140 : i32 = i_5;
+              if ((x_140 < 1)) {
+              } else {
+                break;
+              }
+              i_6 = 0;
+              loop {
+                let x_147 : i32 = i_6;
+                if ((x_147 < 1)) {
+                } else {
+                  break;
+                }
+                i_7 = 0;
+                loop {
+                  let x_154 : i32 = i_7;
+                  if ((x_154 < 1)) {
+                  } else {
+                    break;
+                  }
+                  i_8 = 0;
+                  loop {
+                    let x_161 : i32 = i_8;
+                    if ((x_161 < 1)) {
+                    } else {
+                      break;
+                    }
+                    i_9 = 0;
+                    loop {
+                      let x_168 : i32 = i_9;
+                      if ((x_168 < 1)) {
+                      } else {
+                        break;
+                      }
+                      i_10 = 0;
+                      loop {
+                        let x_175 : i32 = i_10;
+                        if ((x_175 < 1)) {
+                        } else {
+                          break;
+                        }
+                        i_11 = 0;
+                        loop {
+                          let x_182 : i32 = i_11;
+                          if ((x_182 < 1)) {
+                          } else {
+                            break;
+                          }
+                          i_12 = 0;
+                          loop {
+                            let x_189 : i32 = i_12;
+                            if ((x_189 < 1)) {
+                            } else {
+                              break;
+                            }
+                            i_13 = 0;
+                            loop {
+                              let x_196 : i32 = i_13;
+                              if ((x_196 < 1)) {
+                              } else {
+                                break;
+                              }
+                              i_14 = 0;
+                              loop {
+                                let x_203 : i32 = i_14;
+                                if ((x_203 < 1)) {
+                                } else {
+                                  break;
+                                }
+                                i_15 = 0;
+                                loop {
+                                  let x_210 : i32 = i_15;
+                                  if ((x_210 < 1)) {
+                                  } else {
+                                    break;
+                                  }
+                                  i_16 = 0;
+                                  loop {
+                                    let x_217 : i32 = i_16;
+                                    if ((x_217 < 1)) {
+                                    } else {
+                                      break;
+                                    }
+                                    i_17 = 0;
+                                    loop {
+                                      let x_224 : i32 = i_17;
+                                      if ((x_224 < 1)) {
+                                      } else {
+                                        break;
+                                      }
+                                      i_18 = 0;
+                                      loop {
+                                        let x_231 : i32 = i_18;
+                                        if ((x_231 < 1)) {
+                                        } else {
+                                          break;
+                                        }
+                                        i_19 = 0;
+                                        loop {
+                                          let x_238 : i32 = i_19;
+                                          if ((x_238 < 1)) {
+                                          } else {
+                                            break;
+                                          }
+                                          i_20 = 0;
+                                          loop {
+                                            let x_245 : i32 = i_20;
+                                            if ((x_245 < 1)) {
+                                            } else {
+                                              break;
+                                            }
+                                            i_21 = 0;
+                                            loop {
+                                              let x_252 : i32 = i_21;
+                                              if ((x_252 < 1)) {
+                                              } else {
+                                                break;
+                                              }
+                                              i_22 = 0;
+                                              loop {
+                                                let x_259 : i32 = i_22;
+                                                if ((x_259 < 1)) {
+                                                } else {
+                                                  break;
+                                                }
+                                                i_23 = 0;
+                                                loop {
+                                                  let x_266 : i32 = i_23;
+                                                  if ((x_266 < 1)) {
+                                                  } else {
+                                                    break;
+                                                  }
+                                                  i_24 = 0;
+                                                  loop {
+                                                    let x_273 : i32 = i_24;
+                                                    if ((x_273 < 1)) {
+                                                    } else {
+                                                      break;
+                                                    }
+                                                    i_25 = 0;
+                                                    loop {
+                                                      let x_280 : i32 = i_25;
+                                                      if ((x_280 < 1)) {
+                                                      } else {
+                                                        break;
+                                                      }
+                                                      i_26 = 0;
+                                                      loop {
+                                                        let x_287 : i32 = i_26;
+                                                        if ((x_287 < 1)) {
+                                                        } else {
+                                                          break;
+                                                        }
+                                                        i_27 = 0;
+                                                        loop {
+                                                          let x_294 : i32 = i_27;
+                                                          if ((x_294 < 1)) {
+                                                          } else {
+                                                            break;
+                                                          }
+                                                          i_28 = 0;
+                                                          loop {
+                                                            let x_301 : i32 = i_28;
+                                                            if ((x_301 < 1)) {
+                                                            } else {
+                                                              break;
+                                                            }
+                                                            i_29 = 0;
+                                                            loop {
+                                                              let x_308 : i32 = i_29;
+                                                              if ((x_308 < 1)) {
+                                                              } else {
+                                                                break;
+                                                              }
+                                                              i_30 = 0;
+                                                              loop {
+                                                                let x_315 : i32 = i_30;
+                                                                if ((x_315 < 1)) {
+                                                                } else {
+                                                                  break;
+                                                                }
+                                                                i_31 = 0;
+                                                                loop {
+                                                                  let x_322 : i32 = i_31;
+                                                                  if ((x_322 < 1)) {
+                                                                  } else {
+                                                                    break;
+                                                                  }
+                                                                  i_32 = 0;
+                                                                  loop {
+                                                                    let x_329 : i32 = i_32;
+                                                                    if ((x_329 < 1)) {
+                                                                    } else {
+                                                                      break;
+                                                                    }
+                                                                    i_33 = 0;
+                                                                    loop {
+                                                                      let x_336 : i32 = i_33;
+                                                                      if ((x_336 < 1)) {
+                                                                      } else {
+                                                                        break;
+                                                                      }
+                                                                      i_34 = 0;
+                                                                      loop {
+                                                                        let x_343 : i32 = i_34;
+                                                                        if ((x_343 < 1)) {
+                                                                        } else {
+                                                                          break;
+                                                                        }
+                                                                        i_35 = 0;
+                                                                        loop {
+                                                                          let x_350 : i32 = i_35;
+                                                                          if ((x_350 < 1)) {
+                                                                          } else {
+                                                                            break;
+                                                                          }
+                                                                          i_36 = 0;
+                                                                          loop {
+                                                                            let x_357 : i32 = i_36;
+                                                                            if ((x_357 < 1)) {
+                                                                            } else {
+                                                                              break;
+                                                                            }
+                                                                            i_37 = 0;
+                                                                            loop {
+                                                                              let x_364 : i32 = i_37;
+                                                                              if ((x_364 < 1)) {
+                                                                              } else {
+                                                                                break;
+                                                                              }
+                                                                              loop {
+                                                                                let x_371 : i32 = x_GLF_global_loop_count;
+                                                                                x_GLF_global_loop_count = (x_371 + 1);
+
+                                                                                continuing {
+                                                                                  let x_373 : i32 = x_GLF_global_loop_count;
+                                                                                  if ((x_373 < 98)) {
+                                                                                  } else {
+                                                                                    break;
+                                                                                  }
+                                                                                }
+                                                                              }
+                                                                              let x_375 : i32 = i_37;
+                                                                              let x_376 : i32 = i_37;
+                                                                              m23[x_375][x_376] = 1.0;
+                                                                              let x_378 : i32 = i_37;
+                                                                              let x_379 : i32 = i_37;
+                                                                              m24[x_378][x_379] = 1.0;
+                                                                              let x_381 : i32 = i_37;
+                                                                              let x_382 : i32 = i_37;
+                                                                              m32[x_381][x_382] = 1.0;
+                                                                              let x_384 : i32 = i_37;
+                                                                              let x_385 : i32 = i_37;
+                                                                              m33[x_384][x_385] = 1.0;
+                                                                              let x_387 : i32 = i_37;
+                                                                              let x_388 : i32 = i_37;
+                                                                              m34[x_387][x_388] = 1.0;
+                                                                              let x_390 : i32 = i_37;
+                                                                              let x_391 : i32 = i_37;
+                                                                              m42[x_390][x_391] = 1.0;
+                                                                              let x_393 : i32 = i_37;
+                                                                              let x_394 : i32 = i_37;
+                                                                              m43[x_393][x_394] = 1.0;
+                                                                              let x_396 : i32 = i_37;
+                                                                              let x_397 : i32 = i_37;
+                                                                              m44[x_396][x_397] = 1.0;
+
+                                                                              continuing {
+                                                                                let x_399 : i32 = i_37;
+                                                                                i_37 = (x_399 + 1);
+                                                                              }
+                                                                            }
+
+                                                                            continuing {
+                                                                              let x_401 : i32 = i_36;
+                                                                              i_36 = (x_401 + 1);
+                                                                            }
+                                                                          }
+
+                                                                          continuing {
+                                                                            let x_403 : i32 = i_35;
+                                                                            i_35 = (x_403 + 1);
+                                                                          }
+                                                                        }
+
+                                                                        continuing {
+                                                                          let x_405 : i32 = i_34;
+                                                                          i_34 = (x_405 + 1);
+                                                                        }
+                                                                      }
+
+                                                                      continuing {
+                                                                        let x_407 : i32 = i_33;
+                                                                        i_33 = (x_407 + 1);
+                                                                      }
+                                                                    }
+
+                                                                    continuing {
+                                                                      let x_409 : i32 = i_32;
+                                                                      i_32 = (x_409 + 1);
+                                                                    }
+                                                                  }
+
+                                                                  continuing {
+                                                                    let x_411 : i32 = i_31;
+                                                                    i_31 = (x_411 + 1);
+                                                                  }
+                                                                }
+
+                                                                continuing {
+                                                                  let x_413 : i32 = i_30;
+                                                                  i_30 = (x_413 + 1);
+                                                                }
+                                                              }
+
+                                                              continuing {
+                                                                let x_415 : i32 = i_29;
+                                                                i_29 = (x_415 + 1);
+                                                              }
+                                                            }
+
+                                                            continuing {
+                                                              let x_417 : i32 = i_28;
+                                                              i_28 = (x_417 + 1);
+                                                            }
+                                                          }
+
+                                                          continuing {
+                                                            let x_419 : i32 = i_27;
+                                                            i_27 = (x_419 + 1);
+                                                          }
+                                                        }
+
+                                                        continuing {
+                                                          let x_421 : i32 = i_26;
+                                                          i_26 = (x_421 + 1);
+                                                        }
+                                                      }
+
+                                                      continuing {
+                                                        let x_423 : i32 = i_25;
+                                                        i_25 = (x_423 + 1);
+                                                      }
+                                                    }
+
+                                                    continuing {
+                                                      let x_425 : i32 = i_24;
+                                                      i_24 = (x_425 + 1);
+                                                    }
+                                                  }
+
+                                                  continuing {
+                                                    let x_427 : i32 = i_23;
+                                                    i_23 = (x_427 + 1);
+                                                  }
+                                                }
+
+                                                continuing {
+                                                  let x_429 : i32 = i_22;
+                                                  i_22 = (x_429 + 1);
+                                                }
+                                              }
+
+                                              continuing {
+                                                let x_431 : i32 = i_21;
+                                                i_21 = (x_431 + 1);
+                                              }
+                                            }
+
+                                            continuing {
+                                              let x_433 : i32 = i_20;
+                                              i_20 = (x_433 + 1);
+                                            }
+                                          }
+
+                                          continuing {
+                                            let x_435 : i32 = i_19;
+                                            i_19 = (x_435 + 1);
+                                          }
+                                        }
+
+                                        continuing {
+                                          let x_437 : i32 = i_18;
+                                          i_18 = (x_437 + 1);
+                                        }
+                                      }
+
+                                      continuing {
+                                        let x_439 : i32 = i_17;
+                                        i_17 = (x_439 + 1);
+                                      }
+                                    }
+
+                                    continuing {
+                                      let x_441 : i32 = i_16;
+                                      i_16 = (x_441 + 1);
+                                    }
+                                  }
+
+                                  continuing {
+                                    let x_443 : i32 = i_15;
+                                    i_15 = (x_443 + 1);
+                                  }
+                                }
+
+                                continuing {
+                                  let x_445 : i32 = i_14;
+                                  i_14 = (x_445 + 1);
+                                }
+                              }
+
+                              continuing {
+                                let x_447 : i32 = i_13;
+                                i_13 = (x_447 + 1);
+                              }
+                            }
+
+                            continuing {
+                              let x_449 : i32 = i_12;
+                              i_12 = (x_449 + 1);
+                            }
+                          }
+
+                          continuing {
+                            let x_451 : i32 = i_11;
+                            i_11 = (x_451 + 1);
+                          }
+                        }
+
+                        continuing {
+                          let x_453 : i32 = i_10;
+                          i_10 = (x_453 + 1);
+                        }
+                      }
+
+                      continuing {
+                        let x_455 : i32 = i_9;
+                        i_9 = (x_455 + 1);
+                      }
+                    }
+
+                    continuing {
+                      let x_457 : i32 = i_8;
+                      i_8 = (x_457 + 1);
+                    }
+                  }
+
+                  continuing {
+                    let x_459 : i32 = i_7;
+                    i_7 = (x_459 + 1);
+                  }
+                }
+
+                continuing {
+                  let x_461 : i32 = i_6;
+                  i_6 = (x_461 + 1);
+                }
+              }
+
+              continuing {
+                let x_463 : i32 = i_5;
+                i_5 = (x_463 + 1);
+              }
+            }
+
+            continuing {
+              let x_465 : i32 = i_4;
+              i_4 = (x_465 + 1);
+            }
+          }
+
+          continuing {
+            let x_467 : i32 = i_3;
+            i_3 = (x_467 + 1);
+          }
+        }
+
+        continuing {
+          let x_469 : i32 = i_2;
+          i_2 = (x_469 + 1);
+        }
+      }
+
+      continuing {
+        let x_471 : i32 = i_1;
+        i_1 = (x_471 + 1);
+      }
+    }
+
+    continuing {
+      let x_473 : i32 = i;
+      i = (x_473 + 1);
+    }
+  }
+  sum = 0.0;
+  r = 0;
+  loop {
+    let x_479 : i32 = x_GLF_global_loop_count;
+    if ((x_479 < 100)) {
+    } else {
+      break;
+    }
+    let x_482 : i32 = x_GLF_global_loop_count;
+    x_GLF_global_loop_count = (x_482 + 1);
+    let x_484 : i32 = r;
+    let x_486 : f32 = m23[0][x_484];
+    let x_487 : f32 = sum;
+    sum = (x_487 + x_486);
+    let x_489 : i32 = r;
+    let x_491 : f32 = m24[0][x_489];
+    let x_492 : f32 = sum;
+    sum = (x_492 + x_491);
+    let x_494 : i32 = r;
+    let x_496 : f32 = m32[0][x_494];
+    let x_497 : f32 = sum;
+    sum = (x_497 + x_496);
+    let x_499 : i32 = r;
+    let x_501 : f32 = m33[0][x_499];
+    let x_502 : f32 = sum;
+    sum = (x_502 + x_501);
+    let x_504 : i32 = r;
+    let x_506 : f32 = m34[0][x_504];
+    let x_507 : f32 = sum;
+    sum = (x_507 + x_506);
+    let x_509 : i32 = r;
+    let x_511 : f32 = m42[0][x_509];
+    let x_512 : f32 = sum;
+    sum = (x_512 + x_511);
+    let x_514 : i32 = r;
+    let x_516 : f32 = m43[0][x_514];
+    let x_517 : f32 = sum;
+    sum = (x_517 + x_516);
+    let x_519 : i32 = r;
+    let x_521 : f32 = m44[0][x_519];
+    let x_522 : f32 = sum;
+    sum = (x_522 + x_521);
+
+    continuing {
+      let x_524 : i32 = r;
+      r = (x_524 + 1);
+    }
+  }
+  let x_526 : f32 = sum;
+  if ((x_526 == 8.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-multiple-one-iteration-loops-global-counter-write-matrices/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-multiple-one-iteration-loops-global-counter-write-matrices/0-opt.wgsl
new file mode 100644
index 0000000..6dbe667
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-multiple-one-iteration-loops-global-counter-write-matrices/0-opt.wgsl
@@ -0,0 +1,659 @@
+var<private> x_GLF_global_loop_count : i32;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m23 : mat2x3<f32>;
+  var m24 : mat2x4<f32>;
+  var m32 : mat3x2<f32>;
+  var m33 : mat3x3<f32>;
+  var m34 : mat3x4<f32>;
+  var m42 : mat4x2<f32>;
+  var m43 : mat4x3<f32>;
+  var m44 : mat4x4<f32>;
+  var i : i32;
+  var i_1 : i32;
+  var i_2 : i32;
+  var i_3 : i32;
+  var i_4 : i32;
+  var i_5 : i32;
+  var i_6 : i32;
+  var i_7 : i32;
+  var i_8 : i32;
+  var i_9 : i32;
+  var i_10 : i32;
+  var i_11 : i32;
+  var i_12 : i32;
+  var i_13 : i32;
+  var i_14 : i32;
+  var i_15 : i32;
+  var i_16 : i32;
+  var i_17 : i32;
+  var i_18 : i32;
+  var i_19 : i32;
+  var i_20 : i32;
+  var i_21 : i32;
+  var i_22 : i32;
+  var i_23 : i32;
+  var i_24 : i32;
+  var i_25 : i32;
+  var i_26 : i32;
+  var i_27 : i32;
+  var i_28 : i32;
+  var i_29 : i32;
+  var i_30 : i32;
+  var i_31 : i32;
+  var i_32 : i32;
+  var i_33 : i32;
+  var i_34 : i32;
+  var i_35 : i32;
+  var i_36 : i32;
+  var i_37 : i32;
+  var sum : f32;
+  var r : i32;
+  x_GLF_global_loop_count = 0;
+  m23 = mat2x3<f32>(vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0));
+  m24 = mat2x4<f32>(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
+  m32 = mat3x2<f32>(vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0));
+  m33 = mat3x3<f32>(vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0));
+  m34 = mat3x4<f32>(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
+  m42 = mat4x2<f32>(vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0));
+  m43 = mat4x3<f32>(vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0));
+  m44 = mat4x4<f32>(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
+  i = 0;
+  loop {
+    let x_105 : i32 = i;
+    if ((x_105 < 1)) {
+    } else {
+      break;
+    }
+    i_1 = 0;
+    loop {
+      let x_112 : i32 = i_1;
+      if ((x_112 < 1)) {
+      } else {
+        break;
+      }
+      i_2 = 0;
+      loop {
+        let x_119 : i32 = i_2;
+        if ((x_119 < 1)) {
+        } else {
+          break;
+        }
+        i_3 = 0;
+        loop {
+          let x_126 : i32 = i_3;
+          if ((x_126 < 1)) {
+          } else {
+            break;
+          }
+          i_4 = 0;
+          loop {
+            let x_133 : i32 = i_4;
+            if ((x_133 < 1)) {
+            } else {
+              break;
+            }
+            i_5 = 0;
+            loop {
+              let x_140 : i32 = i_5;
+              if ((x_140 < 1)) {
+              } else {
+                break;
+              }
+              i_6 = 0;
+              loop {
+                let x_147 : i32 = i_6;
+                if ((x_147 < 1)) {
+                } else {
+                  break;
+                }
+                i_7 = 0;
+                loop {
+                  let x_154 : i32 = i_7;
+                  if ((x_154 < 1)) {
+                  } else {
+                    break;
+                  }
+                  i_8 = 0;
+                  loop {
+                    let x_161 : i32 = i_8;
+                    if ((x_161 < 1)) {
+                    } else {
+                      break;
+                    }
+                    i_9 = 0;
+                    loop {
+                      let x_168 : i32 = i_9;
+                      if ((x_168 < 1)) {
+                      } else {
+                        break;
+                      }
+                      i_10 = 0;
+                      loop {
+                        let x_175 : i32 = i_10;
+                        if ((x_175 < 1)) {
+                        } else {
+                          break;
+                        }
+                        i_11 = 0;
+                        loop {
+                          let x_182 : i32 = i_11;
+                          if ((x_182 < 1)) {
+                          } else {
+                            break;
+                          }
+                          i_12 = 0;
+                          loop {
+                            let x_189 : i32 = i_12;
+                            if ((x_189 < 1)) {
+                            } else {
+                              break;
+                            }
+                            i_13 = 0;
+                            loop {
+                              let x_196 : i32 = i_13;
+                              if ((x_196 < 1)) {
+                              } else {
+                                break;
+                              }
+                              i_14 = 0;
+                              loop {
+                                let x_203 : i32 = i_14;
+                                if ((x_203 < 1)) {
+                                } else {
+                                  break;
+                                }
+                                i_15 = 0;
+                                loop {
+                                  let x_210 : i32 = i_15;
+                                  if ((x_210 < 1)) {
+                                  } else {
+                                    break;
+                                  }
+                                  i_16 = 0;
+                                  loop {
+                                    let x_217 : i32 = i_16;
+                                    if ((x_217 < 1)) {
+                                    } else {
+                                      break;
+                                    }
+                                    i_17 = 0;
+                                    loop {
+                                      let x_224 : i32 = i_17;
+                                      if ((x_224 < 1)) {
+                                      } else {
+                                        break;
+                                      }
+                                      i_18 = 0;
+                                      loop {
+                                        let x_231 : i32 = i_18;
+                                        if ((x_231 < 1)) {
+                                        } else {
+                                          break;
+                                        }
+                                        i_19 = 0;
+                                        loop {
+                                          let x_238 : i32 = i_19;
+                                          if ((x_238 < 1)) {
+                                          } else {
+                                            break;
+                                          }
+                                          i_20 = 0;
+                                          loop {
+                                            let x_245 : i32 = i_20;
+                                            if ((x_245 < 1)) {
+                                            } else {
+                                              break;
+                                            }
+                                            i_21 = 0;
+                                            loop {
+                                              let x_252 : i32 = i_21;
+                                              if ((x_252 < 1)) {
+                                              } else {
+                                                break;
+                                              }
+                                              i_22 = 0;
+                                              loop {
+                                                let x_259 : i32 = i_22;
+                                                if ((x_259 < 1)) {
+                                                } else {
+                                                  break;
+                                                }
+                                                i_23 = 0;
+                                                loop {
+                                                  let x_266 : i32 = i_23;
+                                                  if ((x_266 < 1)) {
+                                                  } else {
+                                                    break;
+                                                  }
+                                                  i_24 = 0;
+                                                  loop {
+                                                    let x_273 : i32 = i_24;
+                                                    if ((x_273 < 1)) {
+                                                    } else {
+                                                      break;
+                                                    }
+                                                    i_25 = 0;
+                                                    loop {
+                                                      let x_280 : i32 = i_25;
+                                                      if ((x_280 < 1)) {
+                                                      } else {
+                                                        break;
+                                                      }
+                                                      i_26 = 0;
+                                                      loop {
+                                                        let x_287 : i32 = i_26;
+                                                        if ((x_287 < 1)) {
+                                                        } else {
+                                                          break;
+                                                        }
+                                                        i_27 = 0;
+                                                        loop {
+                                                          let x_294 : i32 = i_27;
+                                                          if ((x_294 < 1)) {
+                                                          } else {
+                                                            break;
+                                                          }
+                                                          i_28 = 0;
+                                                          loop {
+                                                            let x_301 : i32 = i_28;
+                                                            if ((x_301 < 1)) {
+                                                            } else {
+                                                              break;
+                                                            }
+                                                            i_29 = 0;
+                                                            loop {
+                                                              let x_308 : i32 = i_29;
+                                                              if ((x_308 < 1)) {
+                                                              } else {
+                                                                break;
+                                                              }
+                                                              i_30 = 0;
+                                                              loop {
+                                                                let x_315 : i32 = i_30;
+                                                                if ((x_315 < 1)) {
+                                                                } else {
+                                                                  break;
+                                                                }
+                                                                i_31 = 0;
+                                                                loop {
+                                                                  let x_322 : i32 = i_31;
+                                                                  if ((x_322 < 1)) {
+                                                                  } else {
+                                                                    break;
+                                                                  }
+                                                                  i_32 = 0;
+                                                                  loop {
+                                                                    let x_329 : i32 = i_32;
+                                                                    if ((x_329 < 1)) {
+                                                                    } else {
+                                                                      break;
+                                                                    }
+                                                                    i_33 = 0;
+                                                                    loop {
+                                                                      let x_336 : i32 = i_33;
+                                                                      if ((x_336 < 1)) {
+                                                                      } else {
+                                                                        break;
+                                                                      }
+                                                                      i_34 = 0;
+                                                                      loop {
+                                                                        let x_343 : i32 = i_34;
+                                                                        if ((x_343 < 1)) {
+                                                                        } else {
+                                                                          break;
+                                                                        }
+                                                                        i_35 = 0;
+                                                                        loop {
+                                                                          let x_350 : i32 = i_35;
+                                                                          if ((x_350 < 1)) {
+                                                                          } else {
+                                                                            break;
+                                                                          }
+                                                                          i_36 = 0;
+                                                                          loop {
+                                                                            let x_357 : i32 = i_36;
+                                                                            if ((x_357 < 1)) {
+                                                                            } else {
+                                                                              break;
+                                                                            }
+                                                                            i_37 = 0;
+                                                                            loop {
+                                                                              let x_364 : i32 = i_37;
+                                                                              if ((x_364 < 1)) {
+                                                                              } else {
+                                                                                break;
+                                                                              }
+                                                                              loop {
+                                                                                let x_371 : i32 = x_GLF_global_loop_count;
+                                                                                x_GLF_global_loop_count = (x_371 + 1);
+
+                                                                                continuing {
+                                                                                  let x_373 : i32 = x_GLF_global_loop_count;
+                                                                                  if ((x_373 < 98)) {
+                                                                                  } else {
+                                                                                    break;
+                                                                                  }
+                                                                                }
+                                                                              }
+                                                                              let x_375 : i32 = i_37;
+                                                                              let x_376 : i32 = i_37;
+                                                                              m23[x_375][x_376] = 1.0;
+                                                                              let x_378 : i32 = i_37;
+                                                                              let x_379 : i32 = i_37;
+                                                                              m24[x_378][x_379] = 1.0;
+                                                                              let x_381 : i32 = i_37;
+                                                                              let x_382 : i32 = i_37;
+                                                                              m32[x_381][x_382] = 1.0;
+                                                                              let x_384 : i32 = i_37;
+                                                                              let x_385 : i32 = i_37;
+                                                                              m33[x_384][x_385] = 1.0;
+                                                                              let x_387 : i32 = i_37;
+                                                                              let x_388 : i32 = i_37;
+                                                                              m34[x_387][x_388] = 1.0;
+                                                                              let x_390 : i32 = i_37;
+                                                                              let x_391 : i32 = i_37;
+                                                                              m42[x_390][x_391] = 1.0;
+                                                                              let x_393 : i32 = i_37;
+                                                                              let x_394 : i32 = i_37;
+                                                                              m43[x_393][x_394] = 1.0;
+                                                                              let x_396 : i32 = i_37;
+                                                                              let x_397 : i32 = i_37;
+                                                                              m44[x_396][x_397] = 1.0;
+
+                                                                              continuing {
+                                                                                let x_399 : i32 = i_37;
+                                                                                i_37 = (x_399 + 1);
+                                                                              }
+                                                                            }
+
+                                                                            continuing {
+                                                                              let x_401 : i32 = i_36;
+                                                                              i_36 = (x_401 + 1);
+                                                                            }
+                                                                          }
+
+                                                                          continuing {
+                                                                            let x_403 : i32 = i_35;
+                                                                            i_35 = (x_403 + 1);
+                                                                          }
+                                                                        }
+
+                                                                        continuing {
+                                                                          let x_405 : i32 = i_34;
+                                                                          i_34 = (x_405 + 1);
+                                                                        }
+                                                                      }
+
+                                                                      continuing {
+                                                                        let x_407 : i32 = i_33;
+                                                                        i_33 = (x_407 + 1);
+                                                                      }
+                                                                    }
+
+                                                                    continuing {
+                                                                      let x_409 : i32 = i_32;
+                                                                      i_32 = (x_409 + 1);
+                                                                    }
+                                                                  }
+
+                                                                  continuing {
+                                                                    let x_411 : i32 = i_31;
+                                                                    i_31 = (x_411 + 1);
+                                                                  }
+                                                                }
+
+                                                                continuing {
+                                                                  let x_413 : i32 = i_30;
+                                                                  i_30 = (x_413 + 1);
+                                                                }
+                                                              }
+
+                                                              continuing {
+                                                                let x_415 : i32 = i_29;
+                                                                i_29 = (x_415 + 1);
+                                                              }
+                                                            }
+
+                                                            continuing {
+                                                              let x_417 : i32 = i_28;
+                                                              i_28 = (x_417 + 1);
+                                                            }
+                                                          }
+
+                                                          continuing {
+                                                            let x_419 : i32 = i_27;
+                                                            i_27 = (x_419 + 1);
+                                                          }
+                                                        }
+
+                                                        continuing {
+                                                          let x_421 : i32 = i_26;
+                                                          i_26 = (x_421 + 1);
+                                                        }
+                                                      }
+
+                                                      continuing {
+                                                        let x_423 : i32 = i_25;
+                                                        i_25 = (x_423 + 1);
+                                                      }
+                                                    }
+
+                                                    continuing {
+                                                      let x_425 : i32 = i_24;
+                                                      i_24 = (x_425 + 1);
+                                                    }
+                                                  }
+
+                                                  continuing {
+                                                    let x_427 : i32 = i_23;
+                                                    i_23 = (x_427 + 1);
+                                                  }
+                                                }
+
+                                                continuing {
+                                                  let x_429 : i32 = i_22;
+                                                  i_22 = (x_429 + 1);
+                                                }
+                                              }
+
+                                              continuing {
+                                                let x_431 : i32 = i_21;
+                                                i_21 = (x_431 + 1);
+                                              }
+                                            }
+
+                                            continuing {
+                                              let x_433 : i32 = i_20;
+                                              i_20 = (x_433 + 1);
+                                            }
+                                          }
+
+                                          continuing {
+                                            let x_435 : i32 = i_19;
+                                            i_19 = (x_435 + 1);
+                                          }
+                                        }
+
+                                        continuing {
+                                          let x_437 : i32 = i_18;
+                                          i_18 = (x_437 + 1);
+                                        }
+                                      }
+
+                                      continuing {
+                                        let x_439 : i32 = i_17;
+                                        i_17 = (x_439 + 1);
+                                      }
+                                    }
+
+                                    continuing {
+                                      let x_441 : i32 = i_16;
+                                      i_16 = (x_441 + 1);
+                                    }
+                                  }
+
+                                  continuing {
+                                    let x_443 : i32 = i_15;
+                                    i_15 = (x_443 + 1);
+                                  }
+                                }
+
+                                continuing {
+                                  let x_445 : i32 = i_14;
+                                  i_14 = (x_445 + 1);
+                                }
+                              }
+
+                              continuing {
+                                let x_447 : i32 = i_13;
+                                i_13 = (x_447 + 1);
+                              }
+                            }
+
+                            continuing {
+                              let x_449 : i32 = i_12;
+                              i_12 = (x_449 + 1);
+                            }
+                          }
+
+                          continuing {
+                            let x_451 : i32 = i_11;
+                            i_11 = (x_451 + 1);
+                          }
+                        }
+
+                        continuing {
+                          let x_453 : i32 = i_10;
+                          i_10 = (x_453 + 1);
+                        }
+                      }
+
+                      continuing {
+                        let x_455 : i32 = i_9;
+                        i_9 = (x_455 + 1);
+                      }
+                    }
+
+                    continuing {
+                      let x_457 : i32 = i_8;
+                      i_8 = (x_457 + 1);
+                    }
+                  }
+
+                  continuing {
+                    let x_459 : i32 = i_7;
+                    i_7 = (x_459 + 1);
+                  }
+                }
+
+                continuing {
+                  let x_461 : i32 = i_6;
+                  i_6 = (x_461 + 1);
+                }
+              }
+
+              continuing {
+                let x_463 : i32 = i_5;
+                i_5 = (x_463 + 1);
+              }
+            }
+
+            continuing {
+              let x_465 : i32 = i_4;
+              i_4 = (x_465 + 1);
+            }
+          }
+
+          continuing {
+            let x_467 : i32 = i_3;
+            i_3 = (x_467 + 1);
+          }
+        }
+
+        continuing {
+          let x_469 : i32 = i_2;
+          i_2 = (x_469 + 1);
+        }
+      }
+
+      continuing {
+        let x_471 : i32 = i_1;
+        i_1 = (x_471 + 1);
+      }
+    }
+
+    continuing {
+      let x_473 : i32 = i;
+      i = (x_473 + 1);
+    }
+  }
+  sum = 0.0;
+  r = 0;
+  loop {
+    let x_479 : i32 = x_GLF_global_loop_count;
+    if ((x_479 < 100)) {
+    } else {
+      break;
+    }
+    let x_482 : i32 = x_GLF_global_loop_count;
+    x_GLF_global_loop_count = (x_482 + 1);
+    let x_484 : i32 = r;
+    let x_486 : f32 = m23[0][x_484];
+    let x_487 : f32 = sum;
+    sum = (x_487 + x_486);
+    let x_489 : i32 = r;
+    let x_491 : f32 = m24[0][x_489];
+    let x_492 : f32 = sum;
+    sum = (x_492 + x_491);
+    let x_494 : i32 = r;
+    let x_496 : f32 = m32[0][x_494];
+    let x_497 : f32 = sum;
+    sum = (x_497 + x_496);
+    let x_499 : i32 = r;
+    let x_501 : f32 = m33[0][x_499];
+    let x_502 : f32 = sum;
+    sum = (x_502 + x_501);
+    let x_504 : i32 = r;
+    let x_506 : f32 = m34[0][x_504];
+    let x_507 : f32 = sum;
+    sum = (x_507 + x_506);
+    let x_509 : i32 = r;
+    let x_511 : f32 = m42[0][x_509];
+    let x_512 : f32 = sum;
+    sum = (x_512 + x_511);
+    let x_514 : i32 = r;
+    let x_516 : f32 = m43[0][x_514];
+    let x_517 : f32 = sum;
+    sum = (x_517 + x_516);
+    let x_519 : i32 = r;
+    let x_521 : f32 = m44[0][x_519];
+    let x_522 : f32 = sum;
+    sum = (x_522 + x_521);
+
+    continuing {
+      let x_524 : i32 = r;
+      r = (x_524 + 1);
+    }
+  }
+  let x_526 : f32 = sum;
+  if ((x_526 == 8.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-multiple-one-iteration-loops-global-counter-write-matrices/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-multiple-one-iteration-loops-global-counter-write-matrices/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..362d952
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-multiple-one-iteration-loops-global-counter-write-matrices/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,324 @@
+void set_float3(inout float3 vec, int idx, float val) {
+  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
+}
+
+void set_float4(inout float4 vec, int idx, float val) {
+  vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
+}
+
+void set_float2(inout float2 vec, int idx, float val) {
+  vec = (idx.xx == int2(0, 1)) ? val.xx : vec;
+}
+
+static int x_GLF_global_loop_count = 0;
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2x3 m23 = float2x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  float2x4 m24 = float2x4(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  float3x2 m32 = float3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  float3x3 m33 = float3x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  float3x4 m34 = float3x4(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  float4x2 m42 = float4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  float4x3 m43 = float4x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  float4x4 m44 = float4x4(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  int i = 0;
+  int i_1 = 0;
+  int i_2 = 0;
+  int i_3 = 0;
+  int i_4 = 0;
+  int i_5 = 0;
+  int i_6 = 0;
+  int i_7 = 0;
+  int i_8 = 0;
+  int i_9 = 0;
+  int i_10 = 0;
+  int i_11 = 0;
+  int i_12 = 0;
+  int i_13 = 0;
+  int i_14 = 0;
+  int i_15 = 0;
+  int i_16 = 0;
+  int i_17 = 0;
+  int i_18 = 0;
+  int i_19 = 0;
+  int i_20 = 0;
+  int i_21 = 0;
+  int i_22 = 0;
+  int i_23 = 0;
+  int i_24 = 0;
+  int i_25 = 0;
+  int i_26 = 0;
+  int i_27 = 0;
+  int i_28 = 0;
+  int i_29 = 0;
+  int i_30 = 0;
+  int i_31 = 0;
+  int i_32 = 0;
+  int i_33 = 0;
+  int i_34 = 0;
+  int i_35 = 0;
+  int i_36 = 0;
+  int i_37 = 0;
+  float sum = 0.0f;
+  int r = 0;
+  x_GLF_global_loop_count = 0;
+  m23 = float2x3(float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f));
+  m24 = float2x4(float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f));
+  m32 = float3x2(float2(0.0f, 0.0f), float2(0.0f, 0.0f), float2(0.0f, 0.0f));
+  m33 = float3x3(float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f));
+  m34 = float3x4(float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f));
+  m42 = float4x2(float2(0.0f, 0.0f), float2(0.0f, 0.0f), float2(0.0f, 0.0f), float2(0.0f, 0.0f));
+  m43 = float4x3(float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f));
+  m44 = float4x4(float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f));
+  i = 0;
+  {
+    for(; (i < 1); i = (i + 1)) {
+      i_1 = 0;
+      {
+        for(; (i_1 < 1); i_1 = (i_1 + 1)) {
+          i_2 = 0;
+          {
+            for(; (i_2 < 1); i_2 = (i_2 + 1)) {
+              i_3 = 0;
+              {
+                for(; (i_3 < 1); i_3 = (i_3 + 1)) {
+                  i_4 = 0;
+                  {
+                    for(; (i_4 < 1); i_4 = (i_4 + 1)) {
+                      i_5 = 0;
+                      {
+                        for(; (i_5 < 1); i_5 = (i_5 + 1)) {
+                          i_6 = 0;
+                          {
+                            for(; (i_6 < 1); i_6 = (i_6 + 1)) {
+                              i_7 = 0;
+                              {
+                                for(; (i_7 < 1); i_7 = (i_7 + 1)) {
+                                  i_8 = 0;
+                                  {
+                                    for(; (i_8 < 1); i_8 = (i_8 + 1)) {
+                                      i_9 = 0;
+                                      {
+                                        for(; (i_9 < 1); i_9 = (i_9 + 1)) {
+                                          i_10 = 0;
+                                          {
+                                            for(; (i_10 < 1); i_10 = (i_10 + 1)) {
+                                              i_11 = 0;
+                                              {
+                                                for(; (i_11 < 1); i_11 = (i_11 + 1)) {
+                                                  i_12 = 0;
+                                                  {
+                                                    for(; (i_12 < 1); i_12 = (i_12 + 1)) {
+                                                      i_13 = 0;
+                                                      {
+                                                        for(; (i_13 < 1); i_13 = (i_13 + 1)) {
+                                                          i_14 = 0;
+                                                          {
+                                                            for(; (i_14 < 1); i_14 = (i_14 + 1)) {
+                                                              i_15 = 0;
+                                                              {
+                                                                for(; (i_15 < 1); i_15 = (i_15 + 1)) {
+                                                                  i_16 = 0;
+                                                                  {
+                                                                    for(; (i_16 < 1); i_16 = (i_16 + 1)) {
+                                                                      i_17 = 0;
+                                                                      {
+                                                                        for(; (i_17 < 1); i_17 = (i_17 + 1)) {
+                                                                          i_18 = 0;
+                                                                          {
+                                                                            for(; (i_18 < 1); i_18 = (i_18 + 1)) {
+                                                                              i_19 = 0;
+                                                                              {
+                                                                                for(; (i_19 < 1); i_19 = (i_19 + 1)) {
+                                                                                  i_20 = 0;
+                                                                                  {
+                                                                                    for(; (i_20 < 1); i_20 = (i_20 + 1)) {
+                                                                                      i_21 = 0;
+                                                                                      {
+                                                                                        for(; (i_21 < 1); i_21 = (i_21 + 1)) {
+                                                                                          i_22 = 0;
+                                                                                          {
+                                                                                            for(; (i_22 < 1); i_22 = (i_22 + 1)) {
+                                                                                              i_23 = 0;
+                                                                                              {
+                                                                                                for(; (i_23 < 1); i_23 = (i_23 + 1)) {
+                                                                                                  i_24 = 0;
+                                                                                                  {
+                                                                                                    for(; (i_24 < 1); i_24 = (i_24 + 1)) {
+                                                                                                      i_25 = 0;
+                                                                                                      {
+                                                                                                        for(; (i_25 < 1); i_25 = (i_25 + 1)) {
+                                                                                                          i_26 = 0;
+                                                                                                          {
+                                                                                                            for(; (i_26 < 1); i_26 = (i_26 + 1)) {
+                                                                                                              i_27 = 0;
+                                                                                                              {
+                                                                                                                for(; (i_27 < 1); i_27 = (i_27 + 1)) {
+                                                                                                                  i_28 = 0;
+                                                                                                                  {
+                                                                                                                    for(; (i_28 < 1); i_28 = (i_28 + 1)) {
+                                                                                                                      i_29 = 0;
+                                                                                                                      {
+                                                                                                                        for(; (i_29 < 1); i_29 = (i_29 + 1)) {
+                                                                                                                          i_30 = 0;
+                                                                                                                          {
+                                                                                                                            for(; (i_30 < 1); i_30 = (i_30 + 1)) {
+                                                                                                                              i_31 = 0;
+                                                                                                                              {
+                                                                                                                                for(; (i_31 < 1); i_31 = (i_31 + 1)) {
+                                                                                                                                  i_32 = 0;
+                                                                                                                                  {
+                                                                                                                                    for(; (i_32 < 1); i_32 = (i_32 + 1)) {
+                                                                                                                                      i_33 = 0;
+                                                                                                                                      {
+                                                                                                                                        for(; (i_33 < 1); i_33 = (i_33 + 1)) {
+                                                                                                                                          i_34 = 0;
+                                                                                                                                          {
+                                                                                                                                            for(; (i_34 < 1); i_34 = (i_34 + 1)) {
+                                                                                                                                              i_35 = 0;
+                                                                                                                                              {
+                                                                                                                                                for(; (i_35 < 1); i_35 = (i_35 + 1)) {
+                                                                                                                                                  i_36 = 0;
+                                                                                                                                                  {
+                                                                                                                                                    for(; (i_36 < 1); i_36 = (i_36 + 1)) {
+                                                                                                                                                      i_37 = 0;
+                                                                                                                                                      {
+                                                                                                                                                        for(; (i_37 < 1); i_37 = (i_37 + 1)) {
+                                                                                                                                                          while (true) {
+                                                                                                                                                            x_GLF_global_loop_count = (x_GLF_global_loop_count + 1);
+                                                                                                                                                            {
+                                                                                                                                                              if ((x_GLF_global_loop_count < 98)) {
+                                                                                                                                                              } else {
+                                                                                                                                                                break;
+                                                                                                                                                              }
+                                                                                                                                                            }
+                                                                                                                                                          }
+                                                                                                                                                          set_float3(m23[i_37], i_37, 1.0f);
+                                                                                                                                                          set_float4(m24[i_37], i_37, 1.0f);
+                                                                                                                                                          set_float2(m32[i_37], i_37, 1.0f);
+                                                                                                                                                          set_float3(m33[i_37], i_37, 1.0f);
+                                                                                                                                                          set_float4(m34[i_37], i_37, 1.0f);
+                                                                                                                                                          set_float2(m42[i_37], i_37, 1.0f);
+                                                                                                                                                          set_float3(m43[i_37], i_37, 1.0f);
+                                                                                                                                                          set_float4(m44[i_37], i_37, 1.0f);
+                                                                                                                                                        }
+                                                                                                                                                      }
+                                                                                                                                                    }
+                                                                                                                                                  }
+                                                                                                                                                }
+                                                                                                                                              }
+                                                                                                                                            }
+                                                                                                                                          }
+                                                                                                                                        }
+                                                                                                                                      }
+                                                                                                                                    }
+                                                                                                                                  }
+                                                                                                                                }
+                                                                                                                              }
+                                                                                                                            }
+                                                                                                                          }
+                                                                                                                        }
+                                                                                                                      }
+                                                                                                                    }
+                                                                                                                  }
+                                                                                                                }
+                                                                                                              }
+                                                                                                            }
+                                                                                                          }
+                                                                                                        }
+                                                                                                      }
+                                                                                                    }
+                                                                                                  }
+                                                                                                }
+                                                                                              }
+                                                                                            }
+                                                                                          }
+                                                                                        }
+                                                                                      }
+                                                                                    }
+                                                                                  }
+                                                                                }
+                                                                              }
+                                                                            }
+                                                                          }
+                                                                        }
+                                                                      }
+                                                                    }
+                                                                  }
+                                                                }
+                                                              }
+                                                            }
+                                                          }
+                                                        }
+                                                      }
+                                                    }
+                                                  }
+                                                }
+                                              }
+                                            }
+                                          }
+                                        }
+                                      }
+                                    }
+                                  }
+                                }
+                              }
+                            }
+                          }
+                        }
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  sum = 0.0f;
+  r = 0;
+  {
+    for(; (x_GLF_global_loop_count < 100); r = (r + 1)) {
+      x_GLF_global_loop_count = (x_GLF_global_loop_count + 1);
+      const float x_486 = m23[0][r];
+      sum = (sum + x_486);
+      const float x_491 = m24[0][r];
+      sum = (sum + x_491);
+      const float x_496 = m32[0][r];
+      sum = (sum + x_496);
+      const float x_501 = m33[0][r];
+      sum = (sum + x_501);
+      const float x_506 = m34[0][r];
+      sum = (sum + x_506);
+      const float x_511 = m42[0][r];
+      sum = (sum + x_511);
+      const float x_516 = m43[0][r];
+      sum = (sum + x_516);
+      const float x_521 = m44[0][r];
+      sum = (sum + x_521);
+    }
+  }
+  if ((sum == 8.0f)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-multiple-one-iteration-loops-global-counter-write-matrices/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-multiple-one-iteration-loops-global-counter-write-matrices/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..0ab9beb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-multiple-one-iteration-loops-global-counter-write-matrices/0-opt.wgsl.expected.msl
@@ -0,0 +1,624 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread int* const tint_symbol_4, thread float4* const tint_symbol_5) {
+  float2x3 m23 = float2x3(0.0f);
+  float2x4 m24 = float2x4(0.0f);
+  float3x2 m32 = float3x2(0.0f);
+  float3x3 m33 = float3x3(0.0f);
+  float3x4 m34 = float3x4(0.0f);
+  float4x2 m42 = float4x2(0.0f);
+  float4x3 m43 = float4x3(0.0f);
+  float4x4 m44 = float4x4(0.0f);
+  int i = 0;
+  int i_1 = 0;
+  int i_2 = 0;
+  int i_3 = 0;
+  int i_4 = 0;
+  int i_5 = 0;
+  int i_6 = 0;
+  int i_7 = 0;
+  int i_8 = 0;
+  int i_9 = 0;
+  int i_10 = 0;
+  int i_11 = 0;
+  int i_12 = 0;
+  int i_13 = 0;
+  int i_14 = 0;
+  int i_15 = 0;
+  int i_16 = 0;
+  int i_17 = 0;
+  int i_18 = 0;
+  int i_19 = 0;
+  int i_20 = 0;
+  int i_21 = 0;
+  int i_22 = 0;
+  int i_23 = 0;
+  int i_24 = 0;
+  int i_25 = 0;
+  int i_26 = 0;
+  int i_27 = 0;
+  int i_28 = 0;
+  int i_29 = 0;
+  int i_30 = 0;
+  int i_31 = 0;
+  int i_32 = 0;
+  int i_33 = 0;
+  int i_34 = 0;
+  int i_35 = 0;
+  int i_36 = 0;
+  int i_37 = 0;
+  float sum = 0.0f;
+  int r = 0;
+  *(tint_symbol_4) = 0;
+  m23 = float2x3(float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f));
+  m24 = float2x4(float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f));
+  m32 = float3x2(float2(0.0f, 0.0f), float2(0.0f, 0.0f), float2(0.0f, 0.0f));
+  m33 = float3x3(float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f));
+  m34 = float3x4(float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f));
+  m42 = float4x2(float2(0.0f, 0.0f), float2(0.0f, 0.0f), float2(0.0f, 0.0f), float2(0.0f, 0.0f));
+  m43 = float4x3(float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f));
+  m44 = float4x4(float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f));
+  i = 0;
+  while (true) {
+    int const x_105 = i;
+    if ((x_105 < 1)) {
+    } else {
+      break;
+    }
+    i_1 = 0;
+    while (true) {
+      int const x_112 = i_1;
+      if ((x_112 < 1)) {
+      } else {
+        break;
+      }
+      i_2 = 0;
+      while (true) {
+        int const x_119 = i_2;
+        if ((x_119 < 1)) {
+        } else {
+          break;
+        }
+        i_3 = 0;
+        while (true) {
+          int const x_126 = i_3;
+          if ((x_126 < 1)) {
+          } else {
+            break;
+          }
+          i_4 = 0;
+          while (true) {
+            int const x_133 = i_4;
+            if ((x_133 < 1)) {
+            } else {
+              break;
+            }
+            i_5 = 0;
+            while (true) {
+              int const x_140 = i_5;
+              if ((x_140 < 1)) {
+              } else {
+                break;
+              }
+              i_6 = 0;
+              while (true) {
+                int const x_147 = i_6;
+                if ((x_147 < 1)) {
+                } else {
+                  break;
+                }
+                i_7 = 0;
+                while (true) {
+                  int const x_154 = i_7;
+                  if ((x_154 < 1)) {
+                  } else {
+                    break;
+                  }
+                  i_8 = 0;
+                  while (true) {
+                    int const x_161 = i_8;
+                    if ((x_161 < 1)) {
+                    } else {
+                      break;
+                    }
+                    i_9 = 0;
+                    while (true) {
+                      int const x_168 = i_9;
+                      if ((x_168 < 1)) {
+                      } else {
+                        break;
+                      }
+                      i_10 = 0;
+                      while (true) {
+                        int const x_175 = i_10;
+                        if ((x_175 < 1)) {
+                        } else {
+                          break;
+                        }
+                        i_11 = 0;
+                        while (true) {
+                          int const x_182 = i_11;
+                          if ((x_182 < 1)) {
+                          } else {
+                            break;
+                          }
+                          i_12 = 0;
+                          while (true) {
+                            int const x_189 = i_12;
+                            if ((x_189 < 1)) {
+                            } else {
+                              break;
+                            }
+                            i_13 = 0;
+                            while (true) {
+                              int const x_196 = i_13;
+                              if ((x_196 < 1)) {
+                              } else {
+                                break;
+                              }
+                              i_14 = 0;
+                              while (true) {
+                                int const x_203 = i_14;
+                                if ((x_203 < 1)) {
+                                } else {
+                                  break;
+                                }
+                                i_15 = 0;
+                                while (true) {
+                                  int const x_210 = i_15;
+                                  if ((x_210 < 1)) {
+                                  } else {
+                                    break;
+                                  }
+                                  i_16 = 0;
+                                  while (true) {
+                                    int const x_217 = i_16;
+                                    if ((x_217 < 1)) {
+                                    } else {
+                                      break;
+                                    }
+                                    i_17 = 0;
+                                    while (true) {
+                                      int const x_224 = i_17;
+                                      if ((x_224 < 1)) {
+                                      } else {
+                                        break;
+                                      }
+                                      i_18 = 0;
+                                      while (true) {
+                                        int const x_231 = i_18;
+                                        if ((x_231 < 1)) {
+                                        } else {
+                                          break;
+                                        }
+                                        i_19 = 0;
+                                        while (true) {
+                                          int const x_238 = i_19;
+                                          if ((x_238 < 1)) {
+                                          } else {
+                                            break;
+                                          }
+                                          i_20 = 0;
+                                          while (true) {
+                                            int const x_245 = i_20;
+                                            if ((x_245 < 1)) {
+                                            } else {
+                                              break;
+                                            }
+                                            i_21 = 0;
+                                            while (true) {
+                                              int const x_252 = i_21;
+                                              if ((x_252 < 1)) {
+                                              } else {
+                                                break;
+                                              }
+                                              i_22 = 0;
+                                              while (true) {
+                                                int const x_259 = i_22;
+                                                if ((x_259 < 1)) {
+                                                } else {
+                                                  break;
+                                                }
+                                                i_23 = 0;
+                                                while (true) {
+                                                  int const x_266 = i_23;
+                                                  if ((x_266 < 1)) {
+                                                  } else {
+                                                    break;
+                                                  }
+                                                  i_24 = 0;
+                                                  while (true) {
+                                                    int const x_273 = i_24;
+                                                    if ((x_273 < 1)) {
+                                                    } else {
+                                                      break;
+                                                    }
+                                                    i_25 = 0;
+                                                    while (true) {
+                                                      int const x_280 = i_25;
+                                                      if ((x_280 < 1)) {
+                                                      } else {
+                                                        break;
+                                                      }
+                                                      i_26 = 0;
+                                                      while (true) {
+                                                        int const x_287 = i_26;
+                                                        if ((x_287 < 1)) {
+                                                        } else {
+                                                          break;
+                                                        }
+                                                        i_27 = 0;
+                                                        while (true) {
+                                                          int const x_294 = i_27;
+                                                          if ((x_294 < 1)) {
+                                                          } else {
+                                                            break;
+                                                          }
+                                                          i_28 = 0;
+                                                          while (true) {
+                                                            int const x_301 = i_28;
+                                                            if ((x_301 < 1)) {
+                                                            } else {
+                                                              break;
+                                                            }
+                                                            i_29 = 0;
+                                                            while (true) {
+                                                              int const x_308 = i_29;
+                                                              if ((x_308 < 1)) {
+                                                              } else {
+                                                                break;
+                                                              }
+                                                              i_30 = 0;
+                                                              while (true) {
+                                                                int const x_315 = i_30;
+                                                                if ((x_315 < 1)) {
+                                                                } else {
+                                                                  break;
+                                                                }
+                                                                i_31 = 0;
+                                                                while (true) {
+                                                                  int const x_322 = i_31;
+                                                                  if ((x_322 < 1)) {
+                                                                  } else {
+                                                                    break;
+                                                                  }
+                                                                  i_32 = 0;
+                                                                  while (true) {
+                                                                    int const x_329 = i_32;
+                                                                    if ((x_329 < 1)) {
+                                                                    } else {
+                                                                      break;
+                                                                    }
+                                                                    i_33 = 0;
+                                                                    while (true) {
+                                                                      int const x_336 = i_33;
+                                                                      if ((x_336 < 1)) {
+                                                                      } else {
+                                                                        break;
+                                                                      }
+                                                                      i_34 = 0;
+                                                                      while (true) {
+                                                                        int const x_343 = i_34;
+                                                                        if ((x_343 < 1)) {
+                                                                        } else {
+                                                                          break;
+                                                                        }
+                                                                        i_35 = 0;
+                                                                        while (true) {
+                                                                          int const x_350 = i_35;
+                                                                          if ((x_350 < 1)) {
+                                                                          } else {
+                                                                            break;
+                                                                          }
+                                                                          i_36 = 0;
+                                                                          while (true) {
+                                                                            int const x_357 = i_36;
+                                                                            if ((x_357 < 1)) {
+                                                                            } else {
+                                                                              break;
+                                                                            }
+                                                                            i_37 = 0;
+                                                                            while (true) {
+                                                                              int const x_364 = i_37;
+                                                                              if ((x_364 < 1)) {
+                                                                              } else {
+                                                                                break;
+                                                                              }
+                                                                              while (true) {
+                                                                                int const x_371 = *(tint_symbol_4);
+                                                                                *(tint_symbol_4) = (x_371 + 1);
+                                                                                {
+                                                                                  int const x_373 = *(tint_symbol_4);
+                                                                                  if ((x_373 < 98)) {
+                                                                                  } else {
+                                                                                    break;
+                                                                                  }
+                                                                                }
+                                                                              }
+                                                                              int const x_375 = i_37;
+                                                                              int const x_376 = i_37;
+                                                                              m23[x_375][x_376] = 1.0f;
+                                                                              int const x_378 = i_37;
+                                                                              int const x_379 = i_37;
+                                                                              m24[x_378][x_379] = 1.0f;
+                                                                              int const x_381 = i_37;
+                                                                              int const x_382 = i_37;
+                                                                              m32[x_381][x_382] = 1.0f;
+                                                                              int const x_384 = i_37;
+                                                                              int const x_385 = i_37;
+                                                                              m33[x_384][x_385] = 1.0f;
+                                                                              int const x_387 = i_37;
+                                                                              int const x_388 = i_37;
+                                                                              m34[x_387][x_388] = 1.0f;
+                                                                              int const x_390 = i_37;
+                                                                              int const x_391 = i_37;
+                                                                              m42[x_390][x_391] = 1.0f;
+                                                                              int const x_393 = i_37;
+                                                                              int const x_394 = i_37;
+                                                                              m43[x_393][x_394] = 1.0f;
+                                                                              int const x_396 = i_37;
+                                                                              int const x_397 = i_37;
+                                                                              m44[x_396][x_397] = 1.0f;
+                                                                              {
+                                                                                int const x_399 = i_37;
+                                                                                i_37 = (x_399 + 1);
+                                                                              }
+                                                                            }
+                                                                            {
+                                                                              int const x_401 = i_36;
+                                                                              i_36 = (x_401 + 1);
+                                                                            }
+                                                                          }
+                                                                          {
+                                                                            int const x_403 = i_35;
+                                                                            i_35 = (x_403 + 1);
+                                                                          }
+                                                                        }
+                                                                        {
+                                                                          int const x_405 = i_34;
+                                                                          i_34 = (x_405 + 1);
+                                                                        }
+                                                                      }
+                                                                      {
+                                                                        int const x_407 = i_33;
+                                                                        i_33 = (x_407 + 1);
+                                                                      }
+                                                                    }
+                                                                    {
+                                                                      int const x_409 = i_32;
+                                                                      i_32 = (x_409 + 1);
+                                                                    }
+                                                                  }
+                                                                  {
+                                                                    int const x_411 = i_31;
+                                                                    i_31 = (x_411 + 1);
+                                                                  }
+                                                                }
+                                                                {
+                                                                  int const x_413 = i_30;
+                                                                  i_30 = (x_413 + 1);
+                                                                }
+                                                              }
+                                                              {
+                                                                int const x_415 = i_29;
+                                                                i_29 = (x_415 + 1);
+                                                              }
+                                                            }
+                                                            {
+                                                              int const x_417 = i_28;
+                                                              i_28 = (x_417 + 1);
+                                                            }
+                                                          }
+                                                          {
+                                                            int const x_419 = i_27;
+                                                            i_27 = (x_419 + 1);
+                                                          }
+                                                        }
+                                                        {
+                                                          int const x_421 = i_26;
+                                                          i_26 = (x_421 + 1);
+                                                        }
+                                                      }
+                                                      {
+                                                        int const x_423 = i_25;
+                                                        i_25 = (x_423 + 1);
+                                                      }
+                                                    }
+                                                    {
+                                                      int const x_425 = i_24;
+                                                      i_24 = (x_425 + 1);
+                                                    }
+                                                  }
+                                                  {
+                                                    int const x_427 = i_23;
+                                                    i_23 = (x_427 + 1);
+                                                  }
+                                                }
+                                                {
+                                                  int const x_429 = i_22;
+                                                  i_22 = (x_429 + 1);
+                                                }
+                                              }
+                                              {
+                                                int const x_431 = i_21;
+                                                i_21 = (x_431 + 1);
+                                              }
+                                            }
+                                            {
+                                              int const x_433 = i_20;
+                                              i_20 = (x_433 + 1);
+                                            }
+                                          }
+                                          {
+                                            int const x_435 = i_19;
+                                            i_19 = (x_435 + 1);
+                                          }
+                                        }
+                                        {
+                                          int const x_437 = i_18;
+                                          i_18 = (x_437 + 1);
+                                        }
+                                      }
+                                      {
+                                        int const x_439 = i_17;
+                                        i_17 = (x_439 + 1);
+                                      }
+                                    }
+                                    {
+                                      int const x_441 = i_16;
+                                      i_16 = (x_441 + 1);
+                                    }
+                                  }
+                                  {
+                                    int const x_443 = i_15;
+                                    i_15 = (x_443 + 1);
+                                  }
+                                }
+                                {
+                                  int const x_445 = i_14;
+                                  i_14 = (x_445 + 1);
+                                }
+                              }
+                              {
+                                int const x_447 = i_13;
+                                i_13 = (x_447 + 1);
+                              }
+                            }
+                            {
+                              int const x_449 = i_12;
+                              i_12 = (x_449 + 1);
+                            }
+                          }
+                          {
+                            int const x_451 = i_11;
+                            i_11 = (x_451 + 1);
+                          }
+                        }
+                        {
+                          int const x_453 = i_10;
+                          i_10 = (x_453 + 1);
+                        }
+                      }
+                      {
+                        int const x_455 = i_9;
+                        i_9 = (x_455 + 1);
+                      }
+                    }
+                    {
+                      int const x_457 = i_8;
+                      i_8 = (x_457 + 1);
+                    }
+                  }
+                  {
+                    int const x_459 = i_7;
+                    i_7 = (x_459 + 1);
+                  }
+                }
+                {
+                  int const x_461 = i_6;
+                  i_6 = (x_461 + 1);
+                }
+              }
+              {
+                int const x_463 = i_5;
+                i_5 = (x_463 + 1);
+              }
+            }
+            {
+              int const x_465 = i_4;
+              i_4 = (x_465 + 1);
+            }
+          }
+          {
+            int const x_467 = i_3;
+            i_3 = (x_467 + 1);
+          }
+        }
+        {
+          int const x_469 = i_2;
+          i_2 = (x_469 + 1);
+        }
+      }
+      {
+        int const x_471 = i_1;
+        i_1 = (x_471 + 1);
+      }
+    }
+    {
+      int const x_473 = i;
+      i = (x_473 + 1);
+    }
+  }
+  sum = 0.0f;
+  r = 0;
+  while (true) {
+    int const x_479 = *(tint_symbol_4);
+    if ((x_479 < 100)) {
+    } else {
+      break;
+    }
+    int const x_482 = *(tint_symbol_4);
+    *(tint_symbol_4) = (x_482 + 1);
+    int const x_484 = r;
+    float const x_486 = m23[0][x_484];
+    float const x_487 = sum;
+    sum = (x_487 + x_486);
+    int const x_489 = r;
+    float const x_491 = m24[0][x_489];
+    float const x_492 = sum;
+    sum = (x_492 + x_491);
+    int const x_494 = r;
+    float const x_496 = m32[0][x_494];
+    float const x_497 = sum;
+    sum = (x_497 + x_496);
+    int const x_499 = r;
+    float const x_501 = m33[0][x_499];
+    float const x_502 = sum;
+    sum = (x_502 + x_501);
+    int const x_504 = r;
+    float const x_506 = m34[0][x_504];
+    float const x_507 = sum;
+    sum = (x_507 + x_506);
+    int const x_509 = r;
+    float const x_511 = m42[0][x_509];
+    float const x_512 = sum;
+    sum = (x_512 + x_511);
+    int const x_514 = r;
+    float const x_516 = m43[0][x_514];
+    float const x_517 = sum;
+    sum = (x_517 + x_516);
+    int const x_519 = r;
+    float const x_521 = m44[0][x_519];
+    float const x_522 = sum;
+    sum = (x_522 + x_521);
+    {
+      int const x_524 = r;
+      r = (x_524 + 1);
+    }
+  }
+  float const x_526 = sum;
+  if ((x_526 == 8.0f)) {
+    *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_5) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread int tint_symbol_6 = 0;
+  thread float4 tint_symbol_7 = 0.0f;
+  main_1(&(tint_symbol_6), &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-multiple-one-iteration-loops-global-counter-write-matrices/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-multiple-one-iteration-loops-global-counter-write-matrices/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..eb04454
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-multiple-one-iteration-loops-global-counter-write-matrices/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,1187 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 636
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_global_loop_count "x_GLF_global_loop_count"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %m23 "m23"
+               OpName %m24 "m24"
+               OpName %m32 "m32"
+               OpName %m33 "m33"
+               OpName %m34 "m34"
+               OpName %m42 "m42"
+               OpName %m43 "m43"
+               OpName %m44 "m44"
+               OpName %i "i"
+               OpName %i_1 "i_1"
+               OpName %i_2 "i_2"
+               OpName %i_3 "i_3"
+               OpName %i_4 "i_4"
+               OpName %i_5 "i_5"
+               OpName %i_6 "i_6"
+               OpName %i_7 "i_7"
+               OpName %i_8 "i_8"
+               OpName %i_9 "i_9"
+               OpName %i_10 "i_10"
+               OpName %i_11 "i_11"
+               OpName %i_12 "i_12"
+               OpName %i_13 "i_13"
+               OpName %i_14 "i_14"
+               OpName %i_15 "i_15"
+               OpName %i_16 "i_16"
+               OpName %i_17 "i_17"
+               OpName %i_18 "i_18"
+               OpName %i_19 "i_19"
+               OpName %i_20 "i_20"
+               OpName %i_21 "i_21"
+               OpName %i_22 "i_22"
+               OpName %i_23 "i_23"
+               OpName %i_24 "i_24"
+               OpName %i_25 "i_25"
+               OpName %i_26 "i_26"
+               OpName %i_27 "i_27"
+               OpName %i_28 "i_28"
+               OpName %i_29 "i_29"
+               OpName %i_30 "i_30"
+               OpName %i_31 "i_31"
+               OpName %i_32 "i_32"
+               OpName %i_33 "i_33"
+               OpName %i_34 "i_34"
+               OpName %i_35 "i_35"
+               OpName %i_36 "i_36"
+               OpName %i_37 "i_37"
+               OpName %sum "sum"
+               OpName %r "r"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+          %4 = OpConstantNull %int
+%x_GLF_global_loop_count = OpVariable %_ptr_Private_int Private %4
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+    %v3float = OpTypeVector %float 3
+%mat2v3float = OpTypeMatrix %v3float 2
+%_ptr_Function_mat2v3float = OpTypePointer Function %mat2v3float
+         %20 = OpConstantNull %mat2v3float
+%mat2v4float = OpTypeMatrix %v4float 2
+%_ptr_Function_mat2v4float = OpTypePointer Function %mat2v4float
+         %24 = OpConstantNull %mat2v4float
+    %v2float = OpTypeVector %float 2
+%mat3v2float = OpTypeMatrix %v2float 3
+%_ptr_Function_mat3v2float = OpTypePointer Function %mat3v2float
+         %29 = OpConstantNull %mat3v2float
+%mat3v3float = OpTypeMatrix %v3float 3
+%_ptr_Function_mat3v3float = OpTypePointer Function %mat3v3float
+         %33 = OpConstantNull %mat3v3float
+%mat3v4float = OpTypeMatrix %v4float 3
+%_ptr_Function_mat3v4float = OpTypePointer Function %mat3v4float
+         %37 = OpConstantNull %mat3v4float
+%mat4v2float = OpTypeMatrix %v2float 4
+%_ptr_Function_mat4v2float = OpTypePointer Function %mat4v2float
+         %41 = OpConstantNull %mat4v2float
+%mat4v3float = OpTypeMatrix %v3float 4
+%_ptr_Function_mat4v3float = OpTypePointer Function %mat4v3float
+         %45 = OpConstantNull %mat4v3float
+%mat4v4float = OpTypeMatrix %v4float 4
+%_ptr_Function_mat4v4float = OpTypePointer Function %mat4v4float
+         %49 = OpConstantNull %mat4v4float
+%_ptr_Function_int = OpTypePointer Function %int
+%_ptr_Function_float = OpTypePointer Function %float
+         %91 = OpConstantNull %float
+      %int_0 = OpConstant %int 0
+    %float_0 = OpConstant %float 0
+         %95 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+         %96 = OpConstantComposite %mat2v3float %95 %95
+         %97 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+         %98 = OpConstantComposite %mat2v4float %97 %97
+         %99 = OpConstantComposite %v2float %float_0 %float_0
+        %100 = OpConstantComposite %mat3v2float %99 %99 %99
+        %101 = OpConstantComposite %mat3v3float %95 %95 %95
+        %102 = OpConstantComposite %mat3v4float %97 %97 %97
+        %103 = OpConstantComposite %mat4v2float %99 %99 %99 %99
+        %104 = OpConstantComposite %mat4v3float %95 %95 %95 %95
+        %105 = OpConstantComposite %mat4v4float %97 %97 %97 %97
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+     %int_98 = OpConstant %int 98
+    %float_1 = OpConstant %float 1
+    %int_100 = OpConstant %int 100
+    %float_8 = OpConstant %float 8
+        %623 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %624 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+        %m23 = OpVariable %_ptr_Function_mat2v3float Function %20
+        %m24 = OpVariable %_ptr_Function_mat2v4float Function %24
+        %m32 = OpVariable %_ptr_Function_mat3v2float Function %29
+        %m33 = OpVariable %_ptr_Function_mat3v3float Function %33
+        %m34 = OpVariable %_ptr_Function_mat3v4float Function %37
+        %m42 = OpVariable %_ptr_Function_mat4v2float Function %41
+        %m43 = OpVariable %_ptr_Function_mat4v3float Function %45
+        %m44 = OpVariable %_ptr_Function_mat4v4float Function %49
+          %i = OpVariable %_ptr_Function_int Function %4
+        %i_1 = OpVariable %_ptr_Function_int Function %4
+        %i_2 = OpVariable %_ptr_Function_int Function %4
+        %i_3 = OpVariable %_ptr_Function_int Function %4
+        %i_4 = OpVariable %_ptr_Function_int Function %4
+        %i_5 = OpVariable %_ptr_Function_int Function %4
+        %i_6 = OpVariable %_ptr_Function_int Function %4
+        %i_7 = OpVariable %_ptr_Function_int Function %4
+        %i_8 = OpVariable %_ptr_Function_int Function %4
+        %i_9 = OpVariable %_ptr_Function_int Function %4
+       %i_10 = OpVariable %_ptr_Function_int Function %4
+       %i_11 = OpVariable %_ptr_Function_int Function %4
+       %i_12 = OpVariable %_ptr_Function_int Function %4
+       %i_13 = OpVariable %_ptr_Function_int Function %4
+       %i_14 = OpVariable %_ptr_Function_int Function %4
+       %i_15 = OpVariable %_ptr_Function_int Function %4
+       %i_16 = OpVariable %_ptr_Function_int Function %4
+       %i_17 = OpVariable %_ptr_Function_int Function %4
+       %i_18 = OpVariable %_ptr_Function_int Function %4
+       %i_19 = OpVariable %_ptr_Function_int Function %4
+       %i_20 = OpVariable %_ptr_Function_int Function %4
+       %i_21 = OpVariable %_ptr_Function_int Function %4
+       %i_22 = OpVariable %_ptr_Function_int Function %4
+       %i_23 = OpVariable %_ptr_Function_int Function %4
+       %i_24 = OpVariable %_ptr_Function_int Function %4
+       %i_25 = OpVariable %_ptr_Function_int Function %4
+       %i_26 = OpVariable %_ptr_Function_int Function %4
+       %i_27 = OpVariable %_ptr_Function_int Function %4
+       %i_28 = OpVariable %_ptr_Function_int Function %4
+       %i_29 = OpVariable %_ptr_Function_int Function %4
+       %i_30 = OpVariable %_ptr_Function_int Function %4
+       %i_31 = OpVariable %_ptr_Function_int Function %4
+       %i_32 = OpVariable %_ptr_Function_int Function %4
+       %i_33 = OpVariable %_ptr_Function_int Function %4
+       %i_34 = OpVariable %_ptr_Function_int Function %4
+       %i_35 = OpVariable %_ptr_Function_int Function %4
+       %i_36 = OpVariable %_ptr_Function_int Function %4
+       %i_37 = OpVariable %_ptr_Function_int Function %4
+        %sum = OpVariable %_ptr_Function_float Function %91
+          %r = OpVariable %_ptr_Function_int Function %4
+               OpStore %x_GLF_global_loop_count %int_0
+               OpStore %m23 %96
+               OpStore %m24 %98
+               OpStore %m32 %100
+               OpStore %m33 %101
+               OpStore %m34 %102
+               OpStore %m42 %103
+               OpStore %m43 %104
+               OpStore %m44 %105
+               OpStore %i %int_0
+               OpBranch %106
+        %106 = OpLabel
+               OpLoopMerge %107 %108 None
+               OpBranch %109
+        %109 = OpLabel
+        %110 = OpLoad %int %i
+        %112 = OpSLessThan %bool %110 %int_1
+               OpSelectionMerge %114 None
+               OpBranchConditional %112 %115 %116
+        %115 = OpLabel
+               OpBranch %114
+        %116 = OpLabel
+               OpBranch %107
+        %114 = OpLabel
+               OpStore %i_1 %int_0
+               OpBranch %117
+        %117 = OpLabel
+               OpLoopMerge %118 %119 None
+               OpBranch %120
+        %120 = OpLabel
+        %121 = OpLoad %int %i_1
+        %122 = OpSLessThan %bool %121 %int_1
+               OpSelectionMerge %123 None
+               OpBranchConditional %122 %124 %125
+        %124 = OpLabel
+               OpBranch %123
+        %125 = OpLabel
+               OpBranch %118
+        %123 = OpLabel
+               OpStore %i_2 %int_0
+               OpBranch %126
+        %126 = OpLabel
+               OpLoopMerge %127 %128 None
+               OpBranch %129
+        %129 = OpLabel
+        %130 = OpLoad %int %i_2
+        %131 = OpSLessThan %bool %130 %int_1
+               OpSelectionMerge %132 None
+               OpBranchConditional %131 %133 %134
+        %133 = OpLabel
+               OpBranch %132
+        %134 = OpLabel
+               OpBranch %127
+        %132 = OpLabel
+               OpStore %i_3 %int_0
+               OpBranch %135
+        %135 = OpLabel
+               OpLoopMerge %136 %137 None
+               OpBranch %138
+        %138 = OpLabel
+        %139 = OpLoad %int %i_3
+        %140 = OpSLessThan %bool %139 %int_1
+               OpSelectionMerge %141 None
+               OpBranchConditional %140 %142 %143
+        %142 = OpLabel
+               OpBranch %141
+        %143 = OpLabel
+               OpBranch %136
+        %141 = OpLabel
+               OpStore %i_4 %int_0
+               OpBranch %144
+        %144 = OpLabel
+               OpLoopMerge %145 %146 None
+               OpBranch %147
+        %147 = OpLabel
+        %148 = OpLoad %int %i_4
+        %149 = OpSLessThan %bool %148 %int_1
+               OpSelectionMerge %150 None
+               OpBranchConditional %149 %151 %152
+        %151 = OpLabel
+               OpBranch %150
+        %152 = OpLabel
+               OpBranch %145
+        %150 = OpLabel
+               OpStore %i_5 %int_0
+               OpBranch %153
+        %153 = OpLabel
+               OpLoopMerge %154 %155 None
+               OpBranch %156
+        %156 = OpLabel
+        %157 = OpLoad %int %i_5
+        %158 = OpSLessThan %bool %157 %int_1
+               OpSelectionMerge %159 None
+               OpBranchConditional %158 %160 %161
+        %160 = OpLabel
+               OpBranch %159
+        %161 = OpLabel
+               OpBranch %154
+        %159 = OpLabel
+               OpStore %i_6 %int_0
+               OpBranch %162
+        %162 = OpLabel
+               OpLoopMerge %163 %164 None
+               OpBranch %165
+        %165 = OpLabel
+        %166 = OpLoad %int %i_6
+        %167 = OpSLessThan %bool %166 %int_1
+               OpSelectionMerge %168 None
+               OpBranchConditional %167 %169 %170
+        %169 = OpLabel
+               OpBranch %168
+        %170 = OpLabel
+               OpBranch %163
+        %168 = OpLabel
+               OpStore %i_7 %int_0
+               OpBranch %171
+        %171 = OpLabel
+               OpLoopMerge %172 %173 None
+               OpBranch %174
+        %174 = OpLabel
+        %175 = OpLoad %int %i_7
+        %176 = OpSLessThan %bool %175 %int_1
+               OpSelectionMerge %177 None
+               OpBranchConditional %176 %178 %179
+        %178 = OpLabel
+               OpBranch %177
+        %179 = OpLabel
+               OpBranch %172
+        %177 = OpLabel
+               OpStore %i_8 %int_0
+               OpBranch %180
+        %180 = OpLabel
+               OpLoopMerge %181 %182 None
+               OpBranch %183
+        %183 = OpLabel
+        %184 = OpLoad %int %i_8
+        %185 = OpSLessThan %bool %184 %int_1
+               OpSelectionMerge %186 None
+               OpBranchConditional %185 %187 %188
+        %187 = OpLabel
+               OpBranch %186
+        %188 = OpLabel
+               OpBranch %181
+        %186 = OpLabel
+               OpStore %i_9 %int_0
+               OpBranch %189
+        %189 = OpLabel
+               OpLoopMerge %190 %191 None
+               OpBranch %192
+        %192 = OpLabel
+        %193 = OpLoad %int %i_9
+        %194 = OpSLessThan %bool %193 %int_1
+               OpSelectionMerge %195 None
+               OpBranchConditional %194 %196 %197
+        %196 = OpLabel
+               OpBranch %195
+        %197 = OpLabel
+               OpBranch %190
+        %195 = OpLabel
+               OpStore %i_10 %int_0
+               OpBranch %198
+        %198 = OpLabel
+               OpLoopMerge %199 %200 None
+               OpBranch %201
+        %201 = OpLabel
+        %202 = OpLoad %int %i_10
+        %203 = OpSLessThan %bool %202 %int_1
+               OpSelectionMerge %204 None
+               OpBranchConditional %203 %205 %206
+        %205 = OpLabel
+               OpBranch %204
+        %206 = OpLabel
+               OpBranch %199
+        %204 = OpLabel
+               OpStore %i_11 %int_0
+               OpBranch %207
+        %207 = OpLabel
+               OpLoopMerge %208 %209 None
+               OpBranch %210
+        %210 = OpLabel
+        %211 = OpLoad %int %i_11
+        %212 = OpSLessThan %bool %211 %int_1
+               OpSelectionMerge %213 None
+               OpBranchConditional %212 %214 %215
+        %214 = OpLabel
+               OpBranch %213
+        %215 = OpLabel
+               OpBranch %208
+        %213 = OpLabel
+               OpStore %i_12 %int_0
+               OpBranch %216
+        %216 = OpLabel
+               OpLoopMerge %217 %218 None
+               OpBranch %219
+        %219 = OpLabel
+        %220 = OpLoad %int %i_12
+        %221 = OpSLessThan %bool %220 %int_1
+               OpSelectionMerge %222 None
+               OpBranchConditional %221 %223 %224
+        %223 = OpLabel
+               OpBranch %222
+        %224 = OpLabel
+               OpBranch %217
+        %222 = OpLabel
+               OpStore %i_13 %int_0
+               OpBranch %225
+        %225 = OpLabel
+               OpLoopMerge %226 %227 None
+               OpBranch %228
+        %228 = OpLabel
+        %229 = OpLoad %int %i_13
+        %230 = OpSLessThan %bool %229 %int_1
+               OpSelectionMerge %231 None
+               OpBranchConditional %230 %232 %233
+        %232 = OpLabel
+               OpBranch %231
+        %233 = OpLabel
+               OpBranch %226
+        %231 = OpLabel
+               OpStore %i_14 %int_0
+               OpBranch %234
+        %234 = OpLabel
+               OpLoopMerge %235 %236 None
+               OpBranch %237
+        %237 = OpLabel
+        %238 = OpLoad %int %i_14
+        %239 = OpSLessThan %bool %238 %int_1
+               OpSelectionMerge %240 None
+               OpBranchConditional %239 %241 %242
+        %241 = OpLabel
+               OpBranch %240
+        %242 = OpLabel
+               OpBranch %235
+        %240 = OpLabel
+               OpStore %i_15 %int_0
+               OpBranch %243
+        %243 = OpLabel
+               OpLoopMerge %244 %245 None
+               OpBranch %246
+        %246 = OpLabel
+        %247 = OpLoad %int %i_15
+        %248 = OpSLessThan %bool %247 %int_1
+               OpSelectionMerge %249 None
+               OpBranchConditional %248 %250 %251
+        %250 = OpLabel
+               OpBranch %249
+        %251 = OpLabel
+               OpBranch %244
+        %249 = OpLabel
+               OpStore %i_16 %int_0
+               OpBranch %252
+        %252 = OpLabel
+               OpLoopMerge %253 %254 None
+               OpBranch %255
+        %255 = OpLabel
+        %256 = OpLoad %int %i_16
+        %257 = OpSLessThan %bool %256 %int_1
+               OpSelectionMerge %258 None
+               OpBranchConditional %257 %259 %260
+        %259 = OpLabel
+               OpBranch %258
+        %260 = OpLabel
+               OpBranch %253
+        %258 = OpLabel
+               OpStore %i_17 %int_0
+               OpBranch %261
+        %261 = OpLabel
+               OpLoopMerge %262 %263 None
+               OpBranch %264
+        %264 = OpLabel
+        %265 = OpLoad %int %i_17
+        %266 = OpSLessThan %bool %265 %int_1
+               OpSelectionMerge %267 None
+               OpBranchConditional %266 %268 %269
+        %268 = OpLabel
+               OpBranch %267
+        %269 = OpLabel
+               OpBranch %262
+        %267 = OpLabel
+               OpStore %i_18 %int_0
+               OpBranch %270
+        %270 = OpLabel
+               OpLoopMerge %271 %272 None
+               OpBranch %273
+        %273 = OpLabel
+        %274 = OpLoad %int %i_18
+        %275 = OpSLessThan %bool %274 %int_1
+               OpSelectionMerge %276 None
+               OpBranchConditional %275 %277 %278
+        %277 = OpLabel
+               OpBranch %276
+        %278 = OpLabel
+               OpBranch %271
+        %276 = OpLabel
+               OpStore %i_19 %int_0
+               OpBranch %279
+        %279 = OpLabel
+               OpLoopMerge %280 %281 None
+               OpBranch %282
+        %282 = OpLabel
+        %283 = OpLoad %int %i_19
+        %284 = OpSLessThan %bool %283 %int_1
+               OpSelectionMerge %285 None
+               OpBranchConditional %284 %286 %287
+        %286 = OpLabel
+               OpBranch %285
+        %287 = OpLabel
+               OpBranch %280
+        %285 = OpLabel
+               OpStore %i_20 %int_0
+               OpBranch %288
+        %288 = OpLabel
+               OpLoopMerge %289 %290 None
+               OpBranch %291
+        %291 = OpLabel
+        %292 = OpLoad %int %i_20
+        %293 = OpSLessThan %bool %292 %int_1
+               OpSelectionMerge %294 None
+               OpBranchConditional %293 %295 %296
+        %295 = OpLabel
+               OpBranch %294
+        %296 = OpLabel
+               OpBranch %289
+        %294 = OpLabel
+               OpStore %i_21 %int_0
+               OpBranch %297
+        %297 = OpLabel
+               OpLoopMerge %298 %299 None
+               OpBranch %300
+        %300 = OpLabel
+        %301 = OpLoad %int %i_21
+        %302 = OpSLessThan %bool %301 %int_1
+               OpSelectionMerge %303 None
+               OpBranchConditional %302 %304 %305
+        %304 = OpLabel
+               OpBranch %303
+        %305 = OpLabel
+               OpBranch %298
+        %303 = OpLabel
+               OpStore %i_22 %int_0
+               OpBranch %306
+        %306 = OpLabel
+               OpLoopMerge %307 %308 None
+               OpBranch %309
+        %309 = OpLabel
+        %310 = OpLoad %int %i_22
+        %311 = OpSLessThan %bool %310 %int_1
+               OpSelectionMerge %312 None
+               OpBranchConditional %311 %313 %314
+        %313 = OpLabel
+               OpBranch %312
+        %314 = OpLabel
+               OpBranch %307
+        %312 = OpLabel
+               OpStore %i_23 %int_0
+               OpBranch %315
+        %315 = OpLabel
+               OpLoopMerge %316 %317 None
+               OpBranch %318
+        %318 = OpLabel
+        %319 = OpLoad %int %i_23
+        %320 = OpSLessThan %bool %319 %int_1
+               OpSelectionMerge %321 None
+               OpBranchConditional %320 %322 %323
+        %322 = OpLabel
+               OpBranch %321
+        %323 = OpLabel
+               OpBranch %316
+        %321 = OpLabel
+               OpStore %i_24 %int_0
+               OpBranch %324
+        %324 = OpLabel
+               OpLoopMerge %325 %326 None
+               OpBranch %327
+        %327 = OpLabel
+        %328 = OpLoad %int %i_24
+        %329 = OpSLessThan %bool %328 %int_1
+               OpSelectionMerge %330 None
+               OpBranchConditional %329 %331 %332
+        %331 = OpLabel
+               OpBranch %330
+        %332 = OpLabel
+               OpBranch %325
+        %330 = OpLabel
+               OpStore %i_25 %int_0
+               OpBranch %333
+        %333 = OpLabel
+               OpLoopMerge %334 %335 None
+               OpBranch %336
+        %336 = OpLabel
+        %337 = OpLoad %int %i_25
+        %338 = OpSLessThan %bool %337 %int_1
+               OpSelectionMerge %339 None
+               OpBranchConditional %338 %340 %341
+        %340 = OpLabel
+               OpBranch %339
+        %341 = OpLabel
+               OpBranch %334
+        %339 = OpLabel
+               OpStore %i_26 %int_0
+               OpBranch %342
+        %342 = OpLabel
+               OpLoopMerge %343 %344 None
+               OpBranch %345
+        %345 = OpLabel
+        %346 = OpLoad %int %i_26
+        %347 = OpSLessThan %bool %346 %int_1
+               OpSelectionMerge %348 None
+               OpBranchConditional %347 %349 %350
+        %349 = OpLabel
+               OpBranch %348
+        %350 = OpLabel
+               OpBranch %343
+        %348 = OpLabel
+               OpStore %i_27 %int_0
+               OpBranch %351
+        %351 = OpLabel
+               OpLoopMerge %352 %353 None
+               OpBranch %354
+        %354 = OpLabel
+        %355 = OpLoad %int %i_27
+        %356 = OpSLessThan %bool %355 %int_1
+               OpSelectionMerge %357 None
+               OpBranchConditional %356 %358 %359
+        %358 = OpLabel
+               OpBranch %357
+        %359 = OpLabel
+               OpBranch %352
+        %357 = OpLabel
+               OpStore %i_28 %int_0
+               OpBranch %360
+        %360 = OpLabel
+               OpLoopMerge %361 %362 None
+               OpBranch %363
+        %363 = OpLabel
+        %364 = OpLoad %int %i_28
+        %365 = OpSLessThan %bool %364 %int_1
+               OpSelectionMerge %366 None
+               OpBranchConditional %365 %367 %368
+        %367 = OpLabel
+               OpBranch %366
+        %368 = OpLabel
+               OpBranch %361
+        %366 = OpLabel
+               OpStore %i_29 %int_0
+               OpBranch %369
+        %369 = OpLabel
+               OpLoopMerge %370 %371 None
+               OpBranch %372
+        %372 = OpLabel
+        %373 = OpLoad %int %i_29
+        %374 = OpSLessThan %bool %373 %int_1
+               OpSelectionMerge %375 None
+               OpBranchConditional %374 %376 %377
+        %376 = OpLabel
+               OpBranch %375
+        %377 = OpLabel
+               OpBranch %370
+        %375 = OpLabel
+               OpStore %i_30 %int_0
+               OpBranch %378
+        %378 = OpLabel
+               OpLoopMerge %379 %380 None
+               OpBranch %381
+        %381 = OpLabel
+        %382 = OpLoad %int %i_30
+        %383 = OpSLessThan %bool %382 %int_1
+               OpSelectionMerge %384 None
+               OpBranchConditional %383 %385 %386
+        %385 = OpLabel
+               OpBranch %384
+        %386 = OpLabel
+               OpBranch %379
+        %384 = OpLabel
+               OpStore %i_31 %int_0
+               OpBranch %387
+        %387 = OpLabel
+               OpLoopMerge %388 %389 None
+               OpBranch %390
+        %390 = OpLabel
+        %391 = OpLoad %int %i_31
+        %392 = OpSLessThan %bool %391 %int_1
+               OpSelectionMerge %393 None
+               OpBranchConditional %392 %394 %395
+        %394 = OpLabel
+               OpBranch %393
+        %395 = OpLabel
+               OpBranch %388
+        %393 = OpLabel
+               OpStore %i_32 %int_0
+               OpBranch %396
+        %396 = OpLabel
+               OpLoopMerge %397 %398 None
+               OpBranch %399
+        %399 = OpLabel
+        %400 = OpLoad %int %i_32
+        %401 = OpSLessThan %bool %400 %int_1
+               OpSelectionMerge %402 None
+               OpBranchConditional %401 %403 %404
+        %403 = OpLabel
+               OpBranch %402
+        %404 = OpLabel
+               OpBranch %397
+        %402 = OpLabel
+               OpStore %i_33 %int_0
+               OpBranch %405
+        %405 = OpLabel
+               OpLoopMerge %406 %407 None
+               OpBranch %408
+        %408 = OpLabel
+        %409 = OpLoad %int %i_33
+        %410 = OpSLessThan %bool %409 %int_1
+               OpSelectionMerge %411 None
+               OpBranchConditional %410 %412 %413
+        %412 = OpLabel
+               OpBranch %411
+        %413 = OpLabel
+               OpBranch %406
+        %411 = OpLabel
+               OpStore %i_34 %int_0
+               OpBranch %414
+        %414 = OpLabel
+               OpLoopMerge %415 %416 None
+               OpBranch %417
+        %417 = OpLabel
+        %418 = OpLoad %int %i_34
+        %419 = OpSLessThan %bool %418 %int_1
+               OpSelectionMerge %420 None
+               OpBranchConditional %419 %421 %422
+        %421 = OpLabel
+               OpBranch %420
+        %422 = OpLabel
+               OpBranch %415
+        %420 = OpLabel
+               OpStore %i_35 %int_0
+               OpBranch %423
+        %423 = OpLabel
+               OpLoopMerge %424 %425 None
+               OpBranch %426
+        %426 = OpLabel
+        %427 = OpLoad %int %i_35
+        %428 = OpSLessThan %bool %427 %int_1
+               OpSelectionMerge %429 None
+               OpBranchConditional %428 %430 %431
+        %430 = OpLabel
+               OpBranch %429
+        %431 = OpLabel
+               OpBranch %424
+        %429 = OpLabel
+               OpStore %i_36 %int_0
+               OpBranch %432
+        %432 = OpLabel
+               OpLoopMerge %433 %434 None
+               OpBranch %435
+        %435 = OpLabel
+        %436 = OpLoad %int %i_36
+        %437 = OpSLessThan %bool %436 %int_1
+               OpSelectionMerge %438 None
+               OpBranchConditional %437 %439 %440
+        %439 = OpLabel
+               OpBranch %438
+        %440 = OpLabel
+               OpBranch %433
+        %438 = OpLabel
+               OpStore %i_37 %int_0
+               OpBranch %441
+        %441 = OpLabel
+               OpLoopMerge %442 %443 None
+               OpBranch %444
+        %444 = OpLabel
+        %445 = OpLoad %int %i_37
+        %446 = OpSLessThan %bool %445 %int_1
+               OpSelectionMerge %447 None
+               OpBranchConditional %446 %448 %449
+        %448 = OpLabel
+               OpBranch %447
+        %449 = OpLabel
+               OpBranch %442
+        %447 = OpLabel
+               OpBranch %450
+        %450 = OpLabel
+               OpLoopMerge %451 %452 None
+               OpBranch %453
+        %453 = OpLabel
+        %454 = OpLoad %int %x_GLF_global_loop_count
+        %455 = OpIAdd %int %454 %int_1
+               OpStore %x_GLF_global_loop_count %455
+               OpBranch %452
+        %452 = OpLabel
+        %456 = OpLoad %int %x_GLF_global_loop_count
+        %458 = OpSLessThan %bool %456 %int_98
+               OpSelectionMerge %459 None
+               OpBranchConditional %458 %460 %461
+        %460 = OpLabel
+               OpBranch %459
+        %461 = OpLabel
+               OpBranch %451
+        %459 = OpLabel
+               OpBranch %450
+        %451 = OpLabel
+        %462 = OpLoad %int %i_37
+        %463 = OpLoad %int %i_37
+        %464 = OpAccessChain %_ptr_Function_float %m23 %462 %463
+               OpStore %464 %float_1
+        %466 = OpLoad %int %i_37
+        %467 = OpLoad %int %i_37
+        %468 = OpAccessChain %_ptr_Function_float %m24 %466 %467
+               OpStore %468 %float_1
+        %469 = OpLoad %int %i_37
+        %470 = OpLoad %int %i_37
+        %471 = OpAccessChain %_ptr_Function_float %m32 %469 %470
+               OpStore %471 %float_1
+        %472 = OpLoad %int %i_37
+        %473 = OpLoad %int %i_37
+        %474 = OpAccessChain %_ptr_Function_float %m33 %472 %473
+               OpStore %474 %float_1
+        %475 = OpLoad %int %i_37
+        %476 = OpLoad %int %i_37
+        %477 = OpAccessChain %_ptr_Function_float %m34 %475 %476
+               OpStore %477 %float_1
+        %478 = OpLoad %int %i_37
+        %479 = OpLoad %int %i_37
+        %480 = OpAccessChain %_ptr_Function_float %m42 %478 %479
+               OpStore %480 %float_1
+        %481 = OpLoad %int %i_37
+        %482 = OpLoad %int %i_37
+        %483 = OpAccessChain %_ptr_Function_float %m43 %481 %482
+               OpStore %483 %float_1
+        %484 = OpLoad %int %i_37
+        %485 = OpLoad %int %i_37
+        %486 = OpAccessChain %_ptr_Function_float %m44 %484 %485
+               OpStore %486 %float_1
+               OpBranch %443
+        %443 = OpLabel
+        %487 = OpLoad %int %i_37
+        %488 = OpIAdd %int %487 %int_1
+               OpStore %i_37 %488
+               OpBranch %441
+        %442 = OpLabel
+               OpBranch %434
+        %434 = OpLabel
+        %489 = OpLoad %int %i_36
+        %490 = OpIAdd %int %489 %int_1
+               OpStore %i_36 %490
+               OpBranch %432
+        %433 = OpLabel
+               OpBranch %425
+        %425 = OpLabel
+        %491 = OpLoad %int %i_35
+        %492 = OpIAdd %int %491 %int_1
+               OpStore %i_35 %492
+               OpBranch %423
+        %424 = OpLabel
+               OpBranch %416
+        %416 = OpLabel
+        %493 = OpLoad %int %i_34
+        %494 = OpIAdd %int %493 %int_1
+               OpStore %i_34 %494
+               OpBranch %414
+        %415 = OpLabel
+               OpBranch %407
+        %407 = OpLabel
+        %495 = OpLoad %int %i_33
+        %496 = OpIAdd %int %495 %int_1
+               OpStore %i_33 %496
+               OpBranch %405
+        %406 = OpLabel
+               OpBranch %398
+        %398 = OpLabel
+        %497 = OpLoad %int %i_32
+        %498 = OpIAdd %int %497 %int_1
+               OpStore %i_32 %498
+               OpBranch %396
+        %397 = OpLabel
+               OpBranch %389
+        %389 = OpLabel
+        %499 = OpLoad %int %i_31
+        %500 = OpIAdd %int %499 %int_1
+               OpStore %i_31 %500
+               OpBranch %387
+        %388 = OpLabel
+               OpBranch %380
+        %380 = OpLabel
+        %501 = OpLoad %int %i_30
+        %502 = OpIAdd %int %501 %int_1
+               OpStore %i_30 %502
+               OpBranch %378
+        %379 = OpLabel
+               OpBranch %371
+        %371 = OpLabel
+        %503 = OpLoad %int %i_29
+        %504 = OpIAdd %int %503 %int_1
+               OpStore %i_29 %504
+               OpBranch %369
+        %370 = OpLabel
+               OpBranch %362
+        %362 = OpLabel
+        %505 = OpLoad %int %i_28
+        %506 = OpIAdd %int %505 %int_1
+               OpStore %i_28 %506
+               OpBranch %360
+        %361 = OpLabel
+               OpBranch %353
+        %353 = OpLabel
+        %507 = OpLoad %int %i_27
+        %508 = OpIAdd %int %507 %int_1
+               OpStore %i_27 %508
+               OpBranch %351
+        %352 = OpLabel
+               OpBranch %344
+        %344 = OpLabel
+        %509 = OpLoad %int %i_26
+        %510 = OpIAdd %int %509 %int_1
+               OpStore %i_26 %510
+               OpBranch %342
+        %343 = OpLabel
+               OpBranch %335
+        %335 = OpLabel
+        %511 = OpLoad %int %i_25
+        %512 = OpIAdd %int %511 %int_1
+               OpStore %i_25 %512
+               OpBranch %333
+        %334 = OpLabel
+               OpBranch %326
+        %326 = OpLabel
+        %513 = OpLoad %int %i_24
+        %514 = OpIAdd %int %513 %int_1
+               OpStore %i_24 %514
+               OpBranch %324
+        %325 = OpLabel
+               OpBranch %317
+        %317 = OpLabel
+        %515 = OpLoad %int %i_23
+        %516 = OpIAdd %int %515 %int_1
+               OpStore %i_23 %516
+               OpBranch %315
+        %316 = OpLabel
+               OpBranch %308
+        %308 = OpLabel
+        %517 = OpLoad %int %i_22
+        %518 = OpIAdd %int %517 %int_1
+               OpStore %i_22 %518
+               OpBranch %306
+        %307 = OpLabel
+               OpBranch %299
+        %299 = OpLabel
+        %519 = OpLoad %int %i_21
+        %520 = OpIAdd %int %519 %int_1
+               OpStore %i_21 %520
+               OpBranch %297
+        %298 = OpLabel
+               OpBranch %290
+        %290 = OpLabel
+        %521 = OpLoad %int %i_20
+        %522 = OpIAdd %int %521 %int_1
+               OpStore %i_20 %522
+               OpBranch %288
+        %289 = OpLabel
+               OpBranch %281
+        %281 = OpLabel
+        %523 = OpLoad %int %i_19
+        %524 = OpIAdd %int %523 %int_1
+               OpStore %i_19 %524
+               OpBranch %279
+        %280 = OpLabel
+               OpBranch %272
+        %272 = OpLabel
+        %525 = OpLoad %int %i_18
+        %526 = OpIAdd %int %525 %int_1
+               OpStore %i_18 %526
+               OpBranch %270
+        %271 = OpLabel
+               OpBranch %263
+        %263 = OpLabel
+        %527 = OpLoad %int %i_17
+        %528 = OpIAdd %int %527 %int_1
+               OpStore %i_17 %528
+               OpBranch %261
+        %262 = OpLabel
+               OpBranch %254
+        %254 = OpLabel
+        %529 = OpLoad %int %i_16
+        %530 = OpIAdd %int %529 %int_1
+               OpStore %i_16 %530
+               OpBranch %252
+        %253 = OpLabel
+               OpBranch %245
+        %245 = OpLabel
+        %531 = OpLoad %int %i_15
+        %532 = OpIAdd %int %531 %int_1
+               OpStore %i_15 %532
+               OpBranch %243
+        %244 = OpLabel
+               OpBranch %236
+        %236 = OpLabel
+        %533 = OpLoad %int %i_14
+        %534 = OpIAdd %int %533 %int_1
+               OpStore %i_14 %534
+               OpBranch %234
+        %235 = OpLabel
+               OpBranch %227
+        %227 = OpLabel
+        %535 = OpLoad %int %i_13
+        %536 = OpIAdd %int %535 %int_1
+               OpStore %i_13 %536
+               OpBranch %225
+        %226 = OpLabel
+               OpBranch %218
+        %218 = OpLabel
+        %537 = OpLoad %int %i_12
+        %538 = OpIAdd %int %537 %int_1
+               OpStore %i_12 %538
+               OpBranch %216
+        %217 = OpLabel
+               OpBranch %209
+        %209 = OpLabel
+        %539 = OpLoad %int %i_11
+        %540 = OpIAdd %int %539 %int_1
+               OpStore %i_11 %540
+               OpBranch %207
+        %208 = OpLabel
+               OpBranch %200
+        %200 = OpLabel
+        %541 = OpLoad %int %i_10
+        %542 = OpIAdd %int %541 %int_1
+               OpStore %i_10 %542
+               OpBranch %198
+        %199 = OpLabel
+               OpBranch %191
+        %191 = OpLabel
+        %543 = OpLoad %int %i_9
+        %544 = OpIAdd %int %543 %int_1
+               OpStore %i_9 %544
+               OpBranch %189
+        %190 = OpLabel
+               OpBranch %182
+        %182 = OpLabel
+        %545 = OpLoad %int %i_8
+        %546 = OpIAdd %int %545 %int_1
+               OpStore %i_8 %546
+               OpBranch %180
+        %181 = OpLabel
+               OpBranch %173
+        %173 = OpLabel
+        %547 = OpLoad %int %i_7
+        %548 = OpIAdd %int %547 %int_1
+               OpStore %i_7 %548
+               OpBranch %171
+        %172 = OpLabel
+               OpBranch %164
+        %164 = OpLabel
+        %549 = OpLoad %int %i_6
+        %550 = OpIAdd %int %549 %int_1
+               OpStore %i_6 %550
+               OpBranch %162
+        %163 = OpLabel
+               OpBranch %155
+        %155 = OpLabel
+        %551 = OpLoad %int %i_5
+        %552 = OpIAdd %int %551 %int_1
+               OpStore %i_5 %552
+               OpBranch %153
+        %154 = OpLabel
+               OpBranch %146
+        %146 = OpLabel
+        %553 = OpLoad %int %i_4
+        %554 = OpIAdd %int %553 %int_1
+               OpStore %i_4 %554
+               OpBranch %144
+        %145 = OpLabel
+               OpBranch %137
+        %137 = OpLabel
+        %555 = OpLoad %int %i_3
+        %556 = OpIAdd %int %555 %int_1
+               OpStore %i_3 %556
+               OpBranch %135
+        %136 = OpLabel
+               OpBranch %128
+        %128 = OpLabel
+        %557 = OpLoad %int %i_2
+        %558 = OpIAdd %int %557 %int_1
+               OpStore %i_2 %558
+               OpBranch %126
+        %127 = OpLabel
+               OpBranch %119
+        %119 = OpLabel
+        %559 = OpLoad %int %i_1
+        %560 = OpIAdd %int %559 %int_1
+               OpStore %i_1 %560
+               OpBranch %117
+        %118 = OpLabel
+               OpBranch %108
+        %108 = OpLabel
+        %561 = OpLoad %int %i
+        %562 = OpIAdd %int %561 %int_1
+               OpStore %i %562
+               OpBranch %106
+        %107 = OpLabel
+               OpStore %sum %float_0
+               OpStore %r %int_0
+               OpBranch %563
+        %563 = OpLabel
+               OpLoopMerge %564 %565 None
+               OpBranch %566
+        %566 = OpLabel
+        %567 = OpLoad %int %x_GLF_global_loop_count
+        %569 = OpSLessThan %bool %567 %int_100
+               OpSelectionMerge %570 None
+               OpBranchConditional %569 %571 %572
+        %571 = OpLabel
+               OpBranch %570
+        %572 = OpLabel
+               OpBranch %564
+        %570 = OpLabel
+        %573 = OpLoad %int %x_GLF_global_loop_count
+        %574 = OpIAdd %int %573 %int_1
+               OpStore %x_GLF_global_loop_count %574
+        %575 = OpLoad %int %r
+        %576 = OpAccessChain %_ptr_Function_float %m23 %int_0 %575
+        %577 = OpLoad %float %576
+        %578 = OpLoad %float %sum
+        %579 = OpFAdd %float %578 %577
+               OpStore %sum %579
+        %580 = OpLoad %int %r
+        %581 = OpAccessChain %_ptr_Function_float %m24 %int_0 %580
+        %582 = OpLoad %float %581
+        %583 = OpLoad %float %sum
+        %584 = OpFAdd %float %583 %582
+               OpStore %sum %584
+        %585 = OpLoad %int %r
+        %586 = OpAccessChain %_ptr_Function_float %m32 %int_0 %585
+        %587 = OpLoad %float %586
+        %588 = OpLoad %float %sum
+        %589 = OpFAdd %float %588 %587
+               OpStore %sum %589
+        %590 = OpLoad %int %r
+        %591 = OpAccessChain %_ptr_Function_float %m33 %int_0 %590
+        %592 = OpLoad %float %591
+        %593 = OpLoad %float %sum
+        %594 = OpFAdd %float %593 %592
+               OpStore %sum %594
+        %595 = OpLoad %int %r
+        %596 = OpAccessChain %_ptr_Function_float %m34 %int_0 %595
+        %597 = OpLoad %float %596
+        %598 = OpLoad %float %sum
+        %599 = OpFAdd %float %598 %597
+               OpStore %sum %599
+        %600 = OpLoad %int %r
+        %601 = OpAccessChain %_ptr_Function_float %m42 %int_0 %600
+        %602 = OpLoad %float %601
+        %603 = OpLoad %float %sum
+        %604 = OpFAdd %float %603 %602
+               OpStore %sum %604
+        %605 = OpLoad %int %r
+        %606 = OpAccessChain %_ptr_Function_float %m43 %int_0 %605
+        %607 = OpLoad %float %606
+        %608 = OpLoad %float %sum
+        %609 = OpFAdd %float %608 %607
+               OpStore %sum %609
+        %610 = OpLoad %int %r
+        %611 = OpAccessChain %_ptr_Function_float %m44 %int_0 %610
+        %612 = OpLoad %float %611
+        %613 = OpLoad %float %sum
+        %614 = OpFAdd %float %613 %612
+               OpStore %sum %614
+               OpBranch %565
+        %565 = OpLabel
+        %615 = OpLoad %int %r
+        %616 = OpIAdd %int %615 %int_1
+               OpStore %r %616
+               OpBranch %563
+        %564 = OpLabel
+        %617 = OpLoad %float %sum
+        %619 = OpFOrdEqual %bool %617 %float_8
+               OpSelectionMerge %620 None
+               OpBranchConditional %619 %621 %622
+        %621 = OpLabel
+               OpStore %x_GLF_color %623
+               OpBranch %620
+        %622 = OpLabel
+               OpStore %x_GLF_color %97
+               OpBranch %620
+        %620 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %624
+%tint_symbol = OpFunctionParameter %main_out
+        %628 = OpLabel
+        %629 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %629
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+        %631 = OpLabel
+        %632 = OpFunctionCall %void %main_1
+        %634 = OpLoad %v4float %x_GLF_color
+        %635 = OpCompositeConstruct %main_out %634
+        %633 = OpFunctionCall %void %tint_symbol_2 %635
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 452[%452] is not post dominated by the back-edge block 459[%459]
+  %459 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-multiple-one-iteration-loops-global-counter-write-matrices/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-multiple-one-iteration-loops-global-counter-write-matrices/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..6dbe667
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-multiple-one-iteration-loops-global-counter-write-matrices/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,659 @@
+var<private> x_GLF_global_loop_count : i32;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m23 : mat2x3<f32>;
+  var m24 : mat2x4<f32>;
+  var m32 : mat3x2<f32>;
+  var m33 : mat3x3<f32>;
+  var m34 : mat3x4<f32>;
+  var m42 : mat4x2<f32>;
+  var m43 : mat4x3<f32>;
+  var m44 : mat4x4<f32>;
+  var i : i32;
+  var i_1 : i32;
+  var i_2 : i32;
+  var i_3 : i32;
+  var i_4 : i32;
+  var i_5 : i32;
+  var i_6 : i32;
+  var i_7 : i32;
+  var i_8 : i32;
+  var i_9 : i32;
+  var i_10 : i32;
+  var i_11 : i32;
+  var i_12 : i32;
+  var i_13 : i32;
+  var i_14 : i32;
+  var i_15 : i32;
+  var i_16 : i32;
+  var i_17 : i32;
+  var i_18 : i32;
+  var i_19 : i32;
+  var i_20 : i32;
+  var i_21 : i32;
+  var i_22 : i32;
+  var i_23 : i32;
+  var i_24 : i32;
+  var i_25 : i32;
+  var i_26 : i32;
+  var i_27 : i32;
+  var i_28 : i32;
+  var i_29 : i32;
+  var i_30 : i32;
+  var i_31 : i32;
+  var i_32 : i32;
+  var i_33 : i32;
+  var i_34 : i32;
+  var i_35 : i32;
+  var i_36 : i32;
+  var i_37 : i32;
+  var sum : f32;
+  var r : i32;
+  x_GLF_global_loop_count = 0;
+  m23 = mat2x3<f32>(vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0));
+  m24 = mat2x4<f32>(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
+  m32 = mat3x2<f32>(vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0));
+  m33 = mat3x3<f32>(vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0));
+  m34 = mat3x4<f32>(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
+  m42 = mat4x2<f32>(vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0));
+  m43 = mat4x3<f32>(vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0));
+  m44 = mat4x4<f32>(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
+  i = 0;
+  loop {
+    let x_105 : i32 = i;
+    if ((x_105 < 1)) {
+    } else {
+      break;
+    }
+    i_1 = 0;
+    loop {
+      let x_112 : i32 = i_1;
+      if ((x_112 < 1)) {
+      } else {
+        break;
+      }
+      i_2 = 0;
+      loop {
+        let x_119 : i32 = i_2;
+        if ((x_119 < 1)) {
+        } else {
+          break;
+        }
+        i_3 = 0;
+        loop {
+          let x_126 : i32 = i_3;
+          if ((x_126 < 1)) {
+          } else {
+            break;
+          }
+          i_4 = 0;
+          loop {
+            let x_133 : i32 = i_4;
+            if ((x_133 < 1)) {
+            } else {
+              break;
+            }
+            i_5 = 0;
+            loop {
+              let x_140 : i32 = i_5;
+              if ((x_140 < 1)) {
+              } else {
+                break;
+              }
+              i_6 = 0;
+              loop {
+                let x_147 : i32 = i_6;
+                if ((x_147 < 1)) {
+                } else {
+                  break;
+                }
+                i_7 = 0;
+                loop {
+                  let x_154 : i32 = i_7;
+                  if ((x_154 < 1)) {
+                  } else {
+                    break;
+                  }
+                  i_8 = 0;
+                  loop {
+                    let x_161 : i32 = i_8;
+                    if ((x_161 < 1)) {
+                    } else {
+                      break;
+                    }
+                    i_9 = 0;
+                    loop {
+                      let x_168 : i32 = i_9;
+                      if ((x_168 < 1)) {
+                      } else {
+                        break;
+                      }
+                      i_10 = 0;
+                      loop {
+                        let x_175 : i32 = i_10;
+                        if ((x_175 < 1)) {
+                        } else {
+                          break;
+                        }
+                        i_11 = 0;
+                        loop {
+                          let x_182 : i32 = i_11;
+                          if ((x_182 < 1)) {
+                          } else {
+                            break;
+                          }
+                          i_12 = 0;
+                          loop {
+                            let x_189 : i32 = i_12;
+                            if ((x_189 < 1)) {
+                            } else {
+                              break;
+                            }
+                            i_13 = 0;
+                            loop {
+                              let x_196 : i32 = i_13;
+                              if ((x_196 < 1)) {
+                              } else {
+                                break;
+                              }
+                              i_14 = 0;
+                              loop {
+                                let x_203 : i32 = i_14;
+                                if ((x_203 < 1)) {
+                                } else {
+                                  break;
+                                }
+                                i_15 = 0;
+                                loop {
+                                  let x_210 : i32 = i_15;
+                                  if ((x_210 < 1)) {
+                                  } else {
+                                    break;
+                                  }
+                                  i_16 = 0;
+                                  loop {
+                                    let x_217 : i32 = i_16;
+                                    if ((x_217 < 1)) {
+                                    } else {
+                                      break;
+                                    }
+                                    i_17 = 0;
+                                    loop {
+                                      let x_224 : i32 = i_17;
+                                      if ((x_224 < 1)) {
+                                      } else {
+                                        break;
+                                      }
+                                      i_18 = 0;
+                                      loop {
+                                        let x_231 : i32 = i_18;
+                                        if ((x_231 < 1)) {
+                                        } else {
+                                          break;
+                                        }
+                                        i_19 = 0;
+                                        loop {
+                                          let x_238 : i32 = i_19;
+                                          if ((x_238 < 1)) {
+                                          } else {
+                                            break;
+                                          }
+                                          i_20 = 0;
+                                          loop {
+                                            let x_245 : i32 = i_20;
+                                            if ((x_245 < 1)) {
+                                            } else {
+                                              break;
+                                            }
+                                            i_21 = 0;
+                                            loop {
+                                              let x_252 : i32 = i_21;
+                                              if ((x_252 < 1)) {
+                                              } else {
+                                                break;
+                                              }
+                                              i_22 = 0;
+                                              loop {
+                                                let x_259 : i32 = i_22;
+                                                if ((x_259 < 1)) {
+                                                } else {
+                                                  break;
+                                                }
+                                                i_23 = 0;
+                                                loop {
+                                                  let x_266 : i32 = i_23;
+                                                  if ((x_266 < 1)) {
+                                                  } else {
+                                                    break;
+                                                  }
+                                                  i_24 = 0;
+                                                  loop {
+                                                    let x_273 : i32 = i_24;
+                                                    if ((x_273 < 1)) {
+                                                    } else {
+                                                      break;
+                                                    }
+                                                    i_25 = 0;
+                                                    loop {
+                                                      let x_280 : i32 = i_25;
+                                                      if ((x_280 < 1)) {
+                                                      } else {
+                                                        break;
+                                                      }
+                                                      i_26 = 0;
+                                                      loop {
+                                                        let x_287 : i32 = i_26;
+                                                        if ((x_287 < 1)) {
+                                                        } else {
+                                                          break;
+                                                        }
+                                                        i_27 = 0;
+                                                        loop {
+                                                          let x_294 : i32 = i_27;
+                                                          if ((x_294 < 1)) {
+                                                          } else {
+                                                            break;
+                                                          }
+                                                          i_28 = 0;
+                                                          loop {
+                                                            let x_301 : i32 = i_28;
+                                                            if ((x_301 < 1)) {
+                                                            } else {
+                                                              break;
+                                                            }
+                                                            i_29 = 0;
+                                                            loop {
+                                                              let x_308 : i32 = i_29;
+                                                              if ((x_308 < 1)) {
+                                                              } else {
+                                                                break;
+                                                              }
+                                                              i_30 = 0;
+                                                              loop {
+                                                                let x_315 : i32 = i_30;
+                                                                if ((x_315 < 1)) {
+                                                                } else {
+                                                                  break;
+                                                                }
+                                                                i_31 = 0;
+                                                                loop {
+                                                                  let x_322 : i32 = i_31;
+                                                                  if ((x_322 < 1)) {
+                                                                  } else {
+                                                                    break;
+                                                                  }
+                                                                  i_32 = 0;
+                                                                  loop {
+                                                                    let x_329 : i32 = i_32;
+                                                                    if ((x_329 < 1)) {
+                                                                    } else {
+                                                                      break;
+                                                                    }
+                                                                    i_33 = 0;
+                                                                    loop {
+                                                                      let x_336 : i32 = i_33;
+                                                                      if ((x_336 < 1)) {
+                                                                      } else {
+                                                                        break;
+                                                                      }
+                                                                      i_34 = 0;
+                                                                      loop {
+                                                                        let x_343 : i32 = i_34;
+                                                                        if ((x_343 < 1)) {
+                                                                        } else {
+                                                                          break;
+                                                                        }
+                                                                        i_35 = 0;
+                                                                        loop {
+                                                                          let x_350 : i32 = i_35;
+                                                                          if ((x_350 < 1)) {
+                                                                          } else {
+                                                                            break;
+                                                                          }
+                                                                          i_36 = 0;
+                                                                          loop {
+                                                                            let x_357 : i32 = i_36;
+                                                                            if ((x_357 < 1)) {
+                                                                            } else {
+                                                                              break;
+                                                                            }
+                                                                            i_37 = 0;
+                                                                            loop {
+                                                                              let x_364 : i32 = i_37;
+                                                                              if ((x_364 < 1)) {
+                                                                              } else {
+                                                                                break;
+                                                                              }
+                                                                              loop {
+                                                                                let x_371 : i32 = x_GLF_global_loop_count;
+                                                                                x_GLF_global_loop_count = (x_371 + 1);
+
+                                                                                continuing {
+                                                                                  let x_373 : i32 = x_GLF_global_loop_count;
+                                                                                  if ((x_373 < 98)) {
+                                                                                  } else {
+                                                                                    break;
+                                                                                  }
+                                                                                }
+                                                                              }
+                                                                              let x_375 : i32 = i_37;
+                                                                              let x_376 : i32 = i_37;
+                                                                              m23[x_375][x_376] = 1.0;
+                                                                              let x_378 : i32 = i_37;
+                                                                              let x_379 : i32 = i_37;
+                                                                              m24[x_378][x_379] = 1.0;
+                                                                              let x_381 : i32 = i_37;
+                                                                              let x_382 : i32 = i_37;
+                                                                              m32[x_381][x_382] = 1.0;
+                                                                              let x_384 : i32 = i_37;
+                                                                              let x_385 : i32 = i_37;
+                                                                              m33[x_384][x_385] = 1.0;
+                                                                              let x_387 : i32 = i_37;
+                                                                              let x_388 : i32 = i_37;
+                                                                              m34[x_387][x_388] = 1.0;
+                                                                              let x_390 : i32 = i_37;
+                                                                              let x_391 : i32 = i_37;
+                                                                              m42[x_390][x_391] = 1.0;
+                                                                              let x_393 : i32 = i_37;
+                                                                              let x_394 : i32 = i_37;
+                                                                              m43[x_393][x_394] = 1.0;
+                                                                              let x_396 : i32 = i_37;
+                                                                              let x_397 : i32 = i_37;
+                                                                              m44[x_396][x_397] = 1.0;
+
+                                                                              continuing {
+                                                                                let x_399 : i32 = i_37;
+                                                                                i_37 = (x_399 + 1);
+                                                                              }
+                                                                            }
+
+                                                                            continuing {
+                                                                              let x_401 : i32 = i_36;
+                                                                              i_36 = (x_401 + 1);
+                                                                            }
+                                                                          }
+
+                                                                          continuing {
+                                                                            let x_403 : i32 = i_35;
+                                                                            i_35 = (x_403 + 1);
+                                                                          }
+                                                                        }
+
+                                                                        continuing {
+                                                                          let x_405 : i32 = i_34;
+                                                                          i_34 = (x_405 + 1);
+                                                                        }
+                                                                      }
+
+                                                                      continuing {
+                                                                        let x_407 : i32 = i_33;
+                                                                        i_33 = (x_407 + 1);
+                                                                      }
+                                                                    }
+
+                                                                    continuing {
+                                                                      let x_409 : i32 = i_32;
+                                                                      i_32 = (x_409 + 1);
+                                                                    }
+                                                                  }
+
+                                                                  continuing {
+                                                                    let x_411 : i32 = i_31;
+                                                                    i_31 = (x_411 + 1);
+                                                                  }
+                                                                }
+
+                                                                continuing {
+                                                                  let x_413 : i32 = i_30;
+                                                                  i_30 = (x_413 + 1);
+                                                                }
+                                                              }
+
+                                                              continuing {
+                                                                let x_415 : i32 = i_29;
+                                                                i_29 = (x_415 + 1);
+                                                              }
+                                                            }
+
+                                                            continuing {
+                                                              let x_417 : i32 = i_28;
+                                                              i_28 = (x_417 + 1);
+                                                            }
+                                                          }
+
+                                                          continuing {
+                                                            let x_419 : i32 = i_27;
+                                                            i_27 = (x_419 + 1);
+                                                          }
+                                                        }
+
+                                                        continuing {
+                                                          let x_421 : i32 = i_26;
+                                                          i_26 = (x_421 + 1);
+                                                        }
+                                                      }
+
+                                                      continuing {
+                                                        let x_423 : i32 = i_25;
+                                                        i_25 = (x_423 + 1);
+                                                      }
+                                                    }
+
+                                                    continuing {
+                                                      let x_425 : i32 = i_24;
+                                                      i_24 = (x_425 + 1);
+                                                    }
+                                                  }
+
+                                                  continuing {
+                                                    let x_427 : i32 = i_23;
+                                                    i_23 = (x_427 + 1);
+                                                  }
+                                                }
+
+                                                continuing {
+                                                  let x_429 : i32 = i_22;
+                                                  i_22 = (x_429 + 1);
+                                                }
+                                              }
+
+                                              continuing {
+                                                let x_431 : i32 = i_21;
+                                                i_21 = (x_431 + 1);
+                                              }
+                                            }
+
+                                            continuing {
+                                              let x_433 : i32 = i_20;
+                                              i_20 = (x_433 + 1);
+                                            }
+                                          }
+
+                                          continuing {
+                                            let x_435 : i32 = i_19;
+                                            i_19 = (x_435 + 1);
+                                          }
+                                        }
+
+                                        continuing {
+                                          let x_437 : i32 = i_18;
+                                          i_18 = (x_437 + 1);
+                                        }
+                                      }
+
+                                      continuing {
+                                        let x_439 : i32 = i_17;
+                                        i_17 = (x_439 + 1);
+                                      }
+                                    }
+
+                                    continuing {
+                                      let x_441 : i32 = i_16;
+                                      i_16 = (x_441 + 1);
+                                    }
+                                  }
+
+                                  continuing {
+                                    let x_443 : i32 = i_15;
+                                    i_15 = (x_443 + 1);
+                                  }
+                                }
+
+                                continuing {
+                                  let x_445 : i32 = i_14;
+                                  i_14 = (x_445 + 1);
+                                }
+                              }
+
+                              continuing {
+                                let x_447 : i32 = i_13;
+                                i_13 = (x_447 + 1);
+                              }
+                            }
+
+                            continuing {
+                              let x_449 : i32 = i_12;
+                              i_12 = (x_449 + 1);
+                            }
+                          }
+
+                          continuing {
+                            let x_451 : i32 = i_11;
+                            i_11 = (x_451 + 1);
+                          }
+                        }
+
+                        continuing {
+                          let x_453 : i32 = i_10;
+                          i_10 = (x_453 + 1);
+                        }
+                      }
+
+                      continuing {
+                        let x_455 : i32 = i_9;
+                        i_9 = (x_455 + 1);
+                      }
+                    }
+
+                    continuing {
+                      let x_457 : i32 = i_8;
+                      i_8 = (x_457 + 1);
+                    }
+                  }
+
+                  continuing {
+                    let x_459 : i32 = i_7;
+                    i_7 = (x_459 + 1);
+                  }
+                }
+
+                continuing {
+                  let x_461 : i32 = i_6;
+                  i_6 = (x_461 + 1);
+                }
+              }
+
+              continuing {
+                let x_463 : i32 = i_5;
+                i_5 = (x_463 + 1);
+              }
+            }
+
+            continuing {
+              let x_465 : i32 = i_4;
+              i_4 = (x_465 + 1);
+            }
+          }
+
+          continuing {
+            let x_467 : i32 = i_3;
+            i_3 = (x_467 + 1);
+          }
+        }
+
+        continuing {
+          let x_469 : i32 = i_2;
+          i_2 = (x_469 + 1);
+        }
+      }
+
+      continuing {
+        let x_471 : i32 = i_1;
+        i_1 = (x_471 + 1);
+      }
+    }
+
+    continuing {
+      let x_473 : i32 = i;
+      i = (x_473 + 1);
+    }
+  }
+  sum = 0.0;
+  r = 0;
+  loop {
+    let x_479 : i32 = x_GLF_global_loop_count;
+    if ((x_479 < 100)) {
+    } else {
+      break;
+    }
+    let x_482 : i32 = x_GLF_global_loop_count;
+    x_GLF_global_loop_count = (x_482 + 1);
+    let x_484 : i32 = r;
+    let x_486 : f32 = m23[0][x_484];
+    let x_487 : f32 = sum;
+    sum = (x_487 + x_486);
+    let x_489 : i32 = r;
+    let x_491 : f32 = m24[0][x_489];
+    let x_492 : f32 = sum;
+    sum = (x_492 + x_491);
+    let x_494 : i32 = r;
+    let x_496 : f32 = m32[0][x_494];
+    let x_497 : f32 = sum;
+    sum = (x_497 + x_496);
+    let x_499 : i32 = r;
+    let x_501 : f32 = m33[0][x_499];
+    let x_502 : f32 = sum;
+    sum = (x_502 + x_501);
+    let x_504 : i32 = r;
+    let x_506 : f32 = m34[0][x_504];
+    let x_507 : f32 = sum;
+    sum = (x_507 + x_506);
+    let x_509 : i32 = r;
+    let x_511 : f32 = m42[0][x_509];
+    let x_512 : f32 = sum;
+    sum = (x_512 + x_511);
+    let x_514 : i32 = r;
+    let x_516 : f32 = m43[0][x_514];
+    let x_517 : f32 = sum;
+    sum = (x_517 + x_516);
+    let x_519 : i32 = r;
+    let x_521 : f32 = m44[0][x_519];
+    let x_522 : f32 = sum;
+    sum = (x_522 + x_521);
+
+    continuing {
+      let x_524 : i32 = r;
+      r = (x_524 + 1);
+    }
+  }
+  let x_526 : f32 = sum;
+  if ((x_526 == 8.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nested-functions-accumulate-global-matrix/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-nested-functions-accumulate-global-matrix/0-opt.spvasm
new file mode 100644
index 0000000..948060c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nested-functions-accumulate-global-matrix/0-opt.spvasm
@@ -0,0 +1,246 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %func0_i1_ "func0(i1;"
+               OpName %x "x"
+               OpName %func1_ "func1("
+               OpName %m "m"
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "one"
+               OpName %_ ""
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpName %i "i"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %param "param"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %__1 ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %buf2 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 2
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__1 DescriptorSet 0
+               OpDecorate %__1 Binding 1
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpTypeFunction %void %_ptr_Function_int
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%mat4v2float = OpTypeMatrix %v2float 4
+%_ptr_Private_mat4v2float = OpTypePointer Private %mat4v2float
+          %m = OpVariable %_ptr_Private_mat4v2float Private
+    %float_0 = OpConstant %float 0
+         %29 = OpConstantComposite %v2float %float_0 %float_0
+         %30 = OpConstantComposite %mat4v2float %29 %29 %29 %29
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+       %buf2 = OpTypeStruct %float
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+          %_ = OpVariable %_ptr_Uniform_buf2 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+%_ptr_Private_float = OpTypePointer Private %float
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+%_ptr_Input_float = OpTypePointer Input %float
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf1 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__1 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+    %float_1 = OpConstant %float 1
+     %v2bool = OpTypeVector %bool 2
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %20
+         %51 = OpLabel
+               OpStore %m %30
+         %52 = OpFunctionCall %void %func1_
+         %53 = OpFunctionCall %void %func1_
+         %54 = OpLoad %mat4v2float %m
+         %55 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_0
+         %56 = OpLoad %int %55
+         %57 = OpConvertSToF %float %56
+         %58 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_0
+         %59 = OpLoad %int %58
+         %60 = OpConvertSToF %float %59
+         %61 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_1
+         %62 = OpLoad %int %61
+         %63 = OpConvertSToF %float %62
+         %64 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_1
+         %65 = OpLoad %int %64
+         %66 = OpConvertSToF %float %65
+         %67 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_0
+         %68 = OpLoad %int %67
+         %69 = OpConvertSToF %float %68
+         %70 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_0
+         %71 = OpLoad %int %70
+         %72 = OpConvertSToF %float %71
+         %73 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_0
+         %74 = OpLoad %int %73
+         %75 = OpConvertSToF %float %74
+         %76 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_0
+         %77 = OpLoad %int %76
+         %78 = OpConvertSToF %float %77
+         %79 = OpCompositeConstruct %v2float %57 %60
+         %80 = OpCompositeConstruct %v2float %63 %66
+         %81 = OpCompositeConstruct %v2float %69 %72
+         %82 = OpCompositeConstruct %v2float %75 %78
+         %83 = OpCompositeConstruct %mat4v2float %79 %80 %81 %82
+         %84 = OpCompositeExtract %v2float %54 0
+         %85 = OpCompositeExtract %v2float %83 0
+         %86 = OpFOrdEqual %v2bool %84 %85
+         %87 = OpAll %bool %86
+         %88 = OpCompositeExtract %v2float %54 1
+         %89 = OpCompositeExtract %v2float %83 1
+         %90 = OpFOrdEqual %v2bool %88 %89
+         %91 = OpAll %bool %90
+         %92 = OpLogicalAnd %bool %87 %91
+         %93 = OpCompositeExtract %v2float %54 2
+         %94 = OpCompositeExtract %v2float %83 2
+         %95 = OpFOrdEqual %v2bool %93 %94
+         %96 = OpAll %bool %95
+         %97 = OpLogicalAnd %bool %92 %96
+         %98 = OpCompositeExtract %v2float %54 3
+         %99 = OpCompositeExtract %v2float %83 3
+        %100 = OpFOrdEqual %v2bool %98 %99
+        %101 = OpAll %bool %100
+        %102 = OpLogicalAnd %bool %97 %101
+               OpSelectionMerge %103 None
+               OpBranchConditional %102 %104 %105
+        %104 = OpLabel
+        %106 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_3
+        %107 = OpLoad %int %106
+        %108 = OpConvertSToF %float %107
+        %109 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_0
+        %110 = OpLoad %int %109
+        %111 = OpConvertSToF %float %110
+        %112 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_0
+        %113 = OpLoad %int %112
+        %114 = OpConvertSToF %float %113
+        %115 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_3
+        %116 = OpLoad %int %115
+        %117 = OpConvertSToF %float %116
+        %118 = OpCompositeConstruct %v4float %108 %111 %114 %117
+               OpStore %_GLF_color %118
+               OpBranch %103
+        %105 = OpLabel
+        %119 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_0
+        %120 = OpLoad %int %119
+        %121 = OpConvertSToF %float %120
+        %122 = OpCompositeConstruct %v4float %121 %121 %121 %121
+               OpStore %_GLF_color %122
+               OpBranch %103
+        %103 = OpLabel
+               OpReturn
+               OpFunctionEnd
+  %func0_i1_ = OpFunction %void None %23
+          %x = OpFunctionParameter %_ptr_Function_int
+        %123 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+        %124 = OpLoad %int %x
+        %125 = OpSLessThan %bool %124 %int_1
+        %126 = OpLogicalNot %bool %125
+               OpSelectionMerge %127 None
+               OpBranchConditional %126 %128 %127
+        %128 = OpLabel
+        %129 = OpLoad %int %x
+        %130 = OpSGreaterThan %bool %129 %int_1
+               OpSelectionMerge %131 None
+               OpBranchConditional %130 %132 %131
+        %132 = OpLabel
+        %133 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+        %134 = OpLoad %float %133
+        %135 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+        %136 = OpLoad %float %135
+        %137 = OpFOrdGreaterThan %bool %134 %136
+               OpBranch %131
+        %131 = OpLabel
+        %138 = OpPhi %bool %130 %128 %137 %132
+               OpBranch %127
+        %127 = OpLabel
+        %139 = OpPhi %bool %125 %123 %138 %131
+               OpSelectionMerge %140 None
+               OpBranchConditional %139 %141 %140
+        %141 = OpLabel
+               OpReturn
+        %140 = OpLabel
+        %142 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+        %143 = OpLoad %float %142
+        %144 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+        %145 = OpLoad %float %144
+        %146 = OpFOrdEqual %bool %143 %145
+               OpSelectionMerge %147 None
+               OpBranchConditional %146 %148 %147
+        %148 = OpLabel
+               OpStore %i %int_0
+               OpBranch %149
+        %149 = OpLabel
+        %150 = OpLoad %int %i
+        %151 = OpSLessThan %bool %150 %int_2
+               OpLoopMerge %152 %153 None
+               OpBranchConditional %151 %153 %152
+        %153 = OpLabel
+        %154 = OpLoad %int %x
+        %155 = OpExtInst %int %1 SClamp %154 %int_0 %int_3
+        %156 = OpLoad %int %i
+        %157 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+        %158 = OpLoad %float %157
+        %159 = OpAccessChain %_ptr_Private_float %m %155 %156
+        %160 = OpLoad %float %159
+        %161 = OpFAdd %float %160 %158
+        %162 = OpAccessChain %_ptr_Private_float %m %155 %156
+               OpStore %162 %161
+        %163 = OpLoad %int %i
+        %164 = OpIAdd %int %163 %int_1
+               OpStore %i %164
+               OpBranch %149
+        %152 = OpLabel
+               OpBranch %147
+        %147 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %func1_ = OpFunction %void None %20
+        %165 = OpLabel
+      %param = OpVariable %_ptr_Function_int Function
+        %166 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %167 = OpLoad %float %166
+        %168 = OpFOrdLessThan %bool %167 %float_0
+               OpSelectionMerge %169 None
+               OpBranchConditional %168 %170 %169
+        %170 = OpLabel
+               OpReturn
+        %169 = OpLabel
+               OpStore %param %int_1
+        %171 = OpFunctionCall %void %func0_i1_ %param
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nested-functions-accumulate-global-matrix/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-nested-functions-accumulate-global-matrix/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..2327dda
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nested-functions-accumulate-global-matrix/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,146 @@
+void set_float2(inout float2 vec, int idx, float val) {
+  vec = (idx.xx == int2(0, 1)) ? val.xx : vec;
+}
+
+static float4x2 m = float4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_10 : register(b2, space0) {
+  uint4 x_10[1];
+};
+cbuffer cbuffer_x_12 : register(b0, space0) {
+  uint4 x_12[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_16 : register(b1, space0) {
+  uint4 x_16[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void func0_i1_(inout int x) {
+  int i = 0;
+  bool x_137 = false;
+  bool x_138 = false;
+  bool x_138_phi = false;
+  bool x_139_phi = false;
+  const int x_124 = x;
+  const bool x_125 = (x_124 < 1);
+  x_139_phi = x_125;
+  if (!(x_125)) {
+    const int x_129 = x;
+    const bool x_130 = (x_129 > 1);
+    x_138_phi = x_130;
+    if (x_130) {
+      const float x_134 = asfloat(x_10[0].x);
+      const uint scalar_offset = ((16u * uint(0))) / 4;
+      const float x_136 = asfloat(x_12[scalar_offset / 4][scalar_offset % 4]);
+      x_137 = (x_134 > x_136);
+      x_138_phi = x_137;
+    }
+    x_138 = x_138_phi;
+    x_139_phi = x_138;
+  }
+  if (x_139_phi) {
+    return;
+  }
+  const float x_143 = asfloat(x_10[0].x);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_145 = asfloat(x_12[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_143 == x_145)) {
+    i = 0;
+    while (true) {
+      if ((i < 2)) {
+      } else {
+        break;
+      }
+      {
+        const int x_154 = x;
+        const int x_155 = clamp(x_154, 0, 3);
+        const int x_156 = i;
+        const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+        const float x_158 = asfloat(x_12[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+        const float x_160 = m[x_155][x_156];
+        set_float2(m[x_155], x_156, (x_160 + x_158));
+        i = (i + 1);
+      }
+    }
+  }
+  return;
+}
+
+void func1_() {
+  int param = 0;
+  const float x_167 = gl_FragCoord.y;
+  if ((x_167 < 0.0f)) {
+    return;
+  }
+  param = 1;
+  func0_i1_(param);
+  return;
+}
+
+void main_1() {
+  m = float4x2(float2(0.0f, 0.0f), float2(0.0f, 0.0f), float2(0.0f, 0.0f), float2(0.0f, 0.0f));
+  func1_();
+  func1_();
+  const float4x2 x_54 = m;
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const int x_56 = asint(x_16[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+  const int x_59 = asint(x_16[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+  const int x_62 = asint(x_16[1].x);
+  const int x_65 = asint(x_16[1].x);
+  const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+  const int x_68 = asint(x_16[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+  const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+  const int x_71 = asint(x_16[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+  const uint scalar_offset_7 = ((16u * uint(0))) / 4;
+  const int x_74 = asint(x_16[scalar_offset_7 / 4][scalar_offset_7 % 4]);
+  const uint scalar_offset_8 = ((16u * uint(0))) / 4;
+  const int x_77 = asint(x_16[scalar_offset_8 / 4][scalar_offset_8 % 4]);
+  const float4x2 x_83 = float4x2(float2(float(x_56), float(x_59)), float2(float(x_62), float(x_65)), float2(float(x_68), float(x_71)), float2(float(x_74), float(x_77)));
+  bool tint_tmp_2 = all((x_54[0u] == x_83[0u]));
+  if (tint_tmp_2) {
+    tint_tmp_2 = all((x_54[1u] == x_83[1u]));
+  }
+  bool tint_tmp_1 = (tint_tmp_2);
+  if (tint_tmp_1) {
+    tint_tmp_1 = all((x_54[2u] == x_83[2u]));
+  }
+  bool tint_tmp = (tint_tmp_1);
+  if (tint_tmp) {
+    tint_tmp = all((x_54[3u] == x_83[3u]));
+  }
+  if ((tint_tmp)) {
+    const int x_107 = asint(x_16[3].x);
+    const uint scalar_offset_9 = ((16u * uint(0))) / 4;
+    const int x_110 = asint(x_16[scalar_offset_9 / 4][scalar_offset_9 % 4]);
+    const uint scalar_offset_10 = ((16u * uint(0))) / 4;
+    const int x_113 = asint(x_16[scalar_offset_10 / 4][scalar_offset_10 % 4]);
+    const int x_116 = asint(x_16[3].x);
+    x_GLF_color = float4(float(x_107), float(x_110), float(x_113), float(x_116));
+  } else {
+    const uint scalar_offset_11 = ((16u * uint(0))) / 4;
+    const int x_120 = asint(x_16[scalar_offset_11 / 4][scalar_offset_11 % 4]);
+    const float x_121 = float(x_120);
+    x_GLF_color = float4(x_121, x_121, x_121, x_121);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_7 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_7;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nested-functions-accumulate-global-matrix/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-nested-functions-accumulate-global-matrix/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..5cd7a35
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nested-functions-accumulate-global-matrix/0-opt.spvasm.expected.msl
@@ -0,0 +1,134 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf2 {
+  /* 0x0000 */ float one;
+};
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[4];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void func0_i1_(constant buf2& x_10, constant buf0& x_12, thread int* const x, thread float4x2* const tint_symbol_5) {
+  int i = 0;
+  bool x_137 = false;
+  bool x_138 = false;
+  bool x_138_phi = false;
+  bool x_139_phi = false;
+  int const x_124 = *(x);
+  bool const x_125 = (x_124 < 1);
+  x_139_phi = x_125;
+  if (!(x_125)) {
+    int const x_129 = *(x);
+    bool const x_130 = (x_129 > 1);
+    x_138_phi = x_130;
+    if (x_130) {
+      float const x_134 = x_10.one;
+      float const x_136 = x_12.x_GLF_uniform_float_values.arr[0].el;
+      x_137 = (x_134 > x_136);
+      x_138_phi = x_137;
+    }
+    x_138 = x_138_phi;
+    x_139_phi = x_138;
+  }
+  bool const x_139 = x_139_phi;
+  if (x_139) {
+    return;
+  }
+  float const x_143 = x_10.one;
+  float const x_145 = x_12.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_143 == x_145)) {
+    i = 0;
+    while (true) {
+      int const x_150 = i;
+      if ((x_150 < 2)) {
+      } else {
+        break;
+      }
+      {
+        int const x_154 = *(x);
+        int const x_155 = clamp(x_154, 0, 3);
+        int const x_156 = i;
+        float const x_158 = x_12.x_GLF_uniform_float_values.arr[0].el;
+        float const x_160 = (*(tint_symbol_5))[x_155][x_156];
+        (*(tint_symbol_5))[x_155][x_156] = (x_160 + x_158);
+        int const x_163 = i;
+        i = (x_163 + 1);
+      }
+    }
+  }
+  return;
+}
+
+void func1_(constant buf2& x_10, constant buf0& x_12, thread float4* const tint_symbol_6, thread float4x2* const tint_symbol_7) {
+  int param = 0;
+  float const x_167 = (*(tint_symbol_6)).y;
+  if ((x_167 < 0.0f)) {
+    return;
+  }
+  param = 1;
+  func0_i1_(x_10, x_12, &(param), tint_symbol_7);
+  return;
+}
+
+void main_1(constant buf2& x_10, constant buf0& x_12, constant buf1& x_16, thread float4x2* const tint_symbol_8, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10) {
+  *(tint_symbol_8) = float4x2(float2(0.0f, 0.0f), float2(0.0f, 0.0f), float2(0.0f, 0.0f), float2(0.0f, 0.0f));
+  func1_(x_10, x_12, tint_symbol_9, tint_symbol_8);
+  func1_(x_10, x_12, tint_symbol_9, tint_symbol_8);
+  float4x2 const x_54 = *(tint_symbol_8);
+  int const x_56 = x_16.x_GLF_uniform_int_values.arr[0].el;
+  int const x_59 = x_16.x_GLF_uniform_int_values.arr[0].el;
+  int const x_62 = x_16.x_GLF_uniform_int_values.arr[1].el;
+  int const x_65 = x_16.x_GLF_uniform_int_values.arr[1].el;
+  int const x_68 = x_16.x_GLF_uniform_int_values.arr[0].el;
+  int const x_71 = x_16.x_GLF_uniform_int_values.arr[0].el;
+  int const x_74 = x_16.x_GLF_uniform_int_values.arr[0].el;
+  int const x_77 = x_16.x_GLF_uniform_int_values.arr[0].el;
+  float4x2 const x_83 = float4x2(float2(float(x_56), float(x_59)), float2(float(x_62), float(x_65)), float2(float(x_68), float(x_71)), float2(float(x_74), float(x_77)));
+  if ((((all((x_54[0u] == x_83[0u])) && all((x_54[1u] == x_83[1u]))) && all((x_54[2u] == x_83[2u]))) && all((x_54[3u] == x_83[3u])))) {
+    int const x_107 = x_16.x_GLF_uniform_int_values.arr[3].el;
+    int const x_110 = x_16.x_GLF_uniform_int_values.arr[0].el;
+    int const x_113 = x_16.x_GLF_uniform_int_values.arr[0].el;
+    int const x_116 = x_16.x_GLF_uniform_int_values.arr[3].el;
+    *(tint_symbol_10) = float4(float(x_107), float(x_110), float(x_113), float(x_116));
+  } else {
+    int const x_120 = x_16.x_GLF_uniform_int_values.arr[0].el;
+    float const x_121 = float(x_120);
+    *(tint_symbol_10) = float4(x_121, x_121, x_121, x_121);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf2& x_10 [[buffer(2)]], constant buf0& x_12 [[buffer(0)]], constant buf1& x_16 [[buffer(1)]]) {
+  thread float4 tint_symbol_11 = 0.0f;
+  thread float4x2 tint_symbol_12 = float4x2(0.0f);
+  thread float4 tint_symbol_13 = 0.0f;
+  tint_symbol_11 = gl_FragCoord_param;
+  main_1(x_10, x_12, x_16, &(tint_symbol_12), &(tint_symbol_11), &(tint_symbol_13));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_13};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nested-functions-accumulate-global-matrix/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-nested-functions-accumulate-global-matrix/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..b4e8fcf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nested-functions-accumulate-global-matrix/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,329 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 214
+; Schema: 0
+               OpCapability Shader
+         %92 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %m "m"
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "one"
+               OpName %x_10 "x_10"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_12 "x_12"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_16 "x_16"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %func0_i1_ "func0_i1_"
+               OpName %x "x"
+               OpName %i "i"
+               OpName %x_137 "x_137"
+               OpName %x_138 "x_138"
+               OpName %x_138_phi "x_138_phi"
+               OpName %x_139_phi "x_139_phi"
+               OpName %func1_ "func1_"
+               OpName %param "param"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf2 Block
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 2
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_12 NonWritable
+               OpDecorate %x_12 DescriptorSet 0
+               OpDecorate %x_12 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_16 NonWritable
+               OpDecorate %x_16 DescriptorSet 0
+               OpDecorate %x_16 Binding 1
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%mat4v2float = OpTypeMatrix %v2float 4
+%_ptr_Private_mat4v2float = OpTypePointer Private %mat4v2float
+          %6 = OpConstantNull %mat4v2float
+          %m = OpVariable %_ptr_Private_mat4v2float Private %6
+       %buf2 = OpTypeStruct %float
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+       %x_10 = OpVariable %_ptr_Uniform_buf2 Uniform
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_12 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %19 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %19
+        %int = OpTypeInt 32 1
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf1 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_16 = OpVariable %_ptr_Uniform_buf1 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %19
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %19
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+         %31 = OpTypeFunction %void %_ptr_Function_int
+         %38 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %42 = OpConstantNull %bool
+      %int_1 = OpConstant %int 1
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+%_ptr_Private_float = OpTypePointer Private %float
+        %104 = OpTypeFunction %void
+    %float_0 = OpConstant %float 0
+        %118 = OpConstantComposite %v2float %float_0 %float_0
+        %119 = OpConstantComposite %mat4v2float %118 %118 %118 %118
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+     %v2bool = OpTypeVector %bool 2
+     %uint_2 = OpConstant %uint 2
+     %uint_3 = OpConstant %uint 3
+   %main_out = OpTypeStruct %v4float
+        %201 = OpTypeFunction %void %main_out
+  %func0_i1_ = OpFunction %void None %31
+          %x = OpFunctionParameter %_ptr_Function_int
+         %36 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %38
+      %x_137 = OpVariable %_ptr_Function_bool Function %42
+      %x_138 = OpVariable %_ptr_Function_bool Function %42
+  %x_138_phi = OpVariable %_ptr_Function_bool Function %42
+  %x_139_phi = OpVariable %_ptr_Function_bool Function %42
+         %47 = OpLoad %int %x
+         %49 = OpSLessThan %bool %47 %int_1
+               OpStore %x_139_phi %49
+         %50 = OpLogicalNot %bool %49
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %51
+         %52 = OpLabel
+         %54 = OpLoad %int %x
+         %55 = OpSGreaterThan %bool %54 %int_1
+               OpStore %x_138_phi %55
+               OpSelectionMerge %56 None
+               OpBranchConditional %55 %57 %56
+         %57 = OpLabel
+         %60 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0
+         %61 = OpLoad %float %60
+         %63 = OpAccessChain %_ptr_Uniform_float %x_12 %uint_0 %int_0
+         %64 = OpLoad %float %63
+         %65 = OpFOrdGreaterThan %bool %61 %64
+               OpStore %x_137 %65
+         %66 = OpLoad %bool %x_137
+               OpStore %x_138_phi %66
+               OpBranch %56
+         %56 = OpLabel
+         %67 = OpLoad %bool %x_138_phi
+               OpStore %x_138 %67
+         %68 = OpLoad %bool %x_138
+               OpStore %x_139_phi %68
+               OpBranch %51
+         %51 = OpLabel
+         %69 = OpLoad %bool %x_139_phi
+               OpSelectionMerge %70 None
+               OpBranchConditional %69 %71 %70
+         %71 = OpLabel
+               OpReturn
+         %70 = OpLabel
+         %72 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0
+         %73 = OpLoad %float %72
+         %74 = OpAccessChain %_ptr_Uniform_float %x_12 %uint_0 %int_0
+         %75 = OpLoad %float %74
+         %76 = OpFOrdEqual %bool %73 %75
+               OpSelectionMerge %77 None
+               OpBranchConditional %76 %78 %77
+         %78 = OpLabel
+               OpStore %i %int_0
+               OpBranch %79
+         %79 = OpLabel
+               OpLoopMerge %80 %81 None
+               OpBranch %82
+         %82 = OpLabel
+         %83 = OpLoad %int %i
+         %85 = OpSLessThan %bool %83 %int_2
+               OpSelectionMerge %86 None
+               OpBranchConditional %85 %87 %88
+         %87 = OpLabel
+               OpBranch %86
+         %88 = OpLabel
+               OpBranch %80
+         %86 = OpLabel
+               OpBranch %81
+         %81 = OpLabel
+         %90 = OpLoad %int %x
+         %91 = OpExtInst %int %92 SClamp %90 %int_0 %int_3
+         %94 = OpLoad %int %i
+         %95 = OpAccessChain %_ptr_Uniform_float %x_12 %uint_0 %int_0
+         %96 = OpLoad %float %95
+         %98 = OpAccessChain %_ptr_Private_float %m %91 %94
+         %99 = OpLoad %float %98
+        %100 = OpAccessChain %_ptr_Private_float %m %91 %94
+        %101 = OpFAdd %float %99 %96
+               OpStore %100 %101
+        %102 = OpLoad %int %i
+        %103 = OpIAdd %int %102 %int_1
+               OpStore %i %103
+               OpBranch %79
+         %80 = OpLabel
+               OpBranch %77
+         %77 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %func1_ = OpFunction %void None %104
+        %106 = OpLabel
+      %param = OpVariable %_ptr_Function_int Function %38
+        %108 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %109 = OpLoad %float %108
+        %111 = OpFOrdLessThan %bool %109 %float_0
+               OpSelectionMerge %112 None
+               OpBranchConditional %111 %113 %112
+        %113 = OpLabel
+               OpReturn
+        %112 = OpLabel
+               OpStore %param %int_1
+        %114 = OpFunctionCall %void %func0_i1_ %param
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %104
+        %117 = OpLabel
+               OpStore %m %119
+        %120 = OpFunctionCall %void %func1_
+        %121 = OpFunctionCall %void %func1_
+        %122 = OpLoad %mat4v2float %m
+        %124 = OpAccessChain %_ptr_Uniform_int %x_16 %uint_0 %int_0
+        %125 = OpLoad %int %124
+        %126 = OpAccessChain %_ptr_Uniform_int %x_16 %uint_0 %int_0
+        %127 = OpLoad %int %126
+        %128 = OpAccessChain %_ptr_Uniform_int %x_16 %uint_0 %int_1
+        %129 = OpLoad %int %128
+        %130 = OpAccessChain %_ptr_Uniform_int %x_16 %uint_0 %int_1
+        %131 = OpLoad %int %130
+        %132 = OpAccessChain %_ptr_Uniform_int %x_16 %uint_0 %int_0
+        %133 = OpLoad %int %132
+        %134 = OpAccessChain %_ptr_Uniform_int %x_16 %uint_0 %int_0
+        %135 = OpLoad %int %134
+        %136 = OpAccessChain %_ptr_Uniform_int %x_16 %uint_0 %int_0
+        %137 = OpLoad %int %136
+        %138 = OpAccessChain %_ptr_Uniform_int %x_16 %uint_0 %int_0
+        %139 = OpLoad %int %138
+        %140 = OpConvertSToF %float %125
+        %141 = OpConvertSToF %float %127
+        %142 = OpCompositeConstruct %v2float %140 %141
+        %143 = OpConvertSToF %float %129
+        %144 = OpConvertSToF %float %131
+        %145 = OpCompositeConstruct %v2float %143 %144
+        %146 = OpConvertSToF %float %133
+        %147 = OpConvertSToF %float %135
+        %148 = OpCompositeConstruct %v2float %146 %147
+        %149 = OpConvertSToF %float %137
+        %150 = OpConvertSToF %float %139
+        %151 = OpCompositeConstruct %v2float %149 %150
+        %152 = OpCompositeConstruct %mat4v2float %142 %145 %148 %151
+        %154 = OpCompositeExtract %v2float %122 0
+        %155 = OpCompositeExtract %v2float %152 0
+        %156 = OpFOrdEqual %v2bool %154 %155
+        %153 = OpAll %bool %156
+               OpSelectionMerge %158 None
+               OpBranchConditional %153 %159 %158
+        %159 = OpLabel
+        %161 = OpCompositeExtract %v2float %122 1
+        %162 = OpCompositeExtract %v2float %152 1
+        %163 = OpFOrdEqual %v2bool %161 %162
+        %160 = OpAll %bool %163
+               OpBranch %158
+        %158 = OpLabel
+        %164 = OpPhi %bool %153 %117 %160 %159
+               OpSelectionMerge %165 None
+               OpBranchConditional %164 %166 %165
+        %166 = OpLabel
+        %169 = OpCompositeExtract %v2float %122 2
+        %170 = OpCompositeExtract %v2float %152 2
+        %171 = OpFOrdEqual %v2bool %169 %170
+        %167 = OpAll %bool %171
+               OpBranch %165
+        %165 = OpLabel
+        %172 = OpPhi %bool %164 %158 %167 %166
+               OpSelectionMerge %173 None
+               OpBranchConditional %172 %174 %173
+        %174 = OpLabel
+        %177 = OpCompositeExtract %v2float %122 3
+        %178 = OpCompositeExtract %v2float %152 3
+        %179 = OpFOrdEqual %v2bool %177 %178
+        %175 = OpAll %bool %179
+               OpBranch %173
+        %173 = OpLabel
+        %180 = OpPhi %bool %172 %165 %175 %174
+               OpSelectionMerge %181 None
+               OpBranchConditional %180 %182 %183
+        %182 = OpLabel
+        %184 = OpAccessChain %_ptr_Uniform_int %x_16 %uint_0 %int_3
+        %185 = OpLoad %int %184
+        %186 = OpAccessChain %_ptr_Uniform_int %x_16 %uint_0 %int_0
+        %187 = OpLoad %int %186
+        %188 = OpAccessChain %_ptr_Uniform_int %x_16 %uint_0 %int_0
+        %189 = OpLoad %int %188
+        %190 = OpAccessChain %_ptr_Uniform_int %x_16 %uint_0 %int_3
+        %191 = OpLoad %int %190
+        %192 = OpConvertSToF %float %185
+        %193 = OpConvertSToF %float %187
+        %194 = OpConvertSToF %float %189
+        %195 = OpConvertSToF %float %191
+        %196 = OpCompositeConstruct %v4float %192 %193 %194 %195
+               OpStore %x_GLF_color %196
+               OpBranch %181
+        %183 = OpLabel
+        %197 = OpAccessChain %_ptr_Uniform_int %x_16 %uint_0 %int_0
+        %198 = OpLoad %int %197
+        %199 = OpConvertSToF %float %198
+        %200 = OpCompositeConstruct %v4float %199 %199 %199 %199
+               OpStore %x_GLF_color %200
+               OpBranch %181
+        %181 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %201
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %205 = OpLabel
+        %206 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %206
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %104
+        %208 = OpLabel
+        %209 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %209
+        %210 = OpFunctionCall %void %main_1
+        %212 = OpLoad %v4float %x_GLF_color
+        %213 = OpCompositeConstruct %main_out %212
+        %211 = OpFunctionCall %void %tint_symbol_3 %213
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nested-functions-accumulate-global-matrix/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-nested-functions-accumulate-global-matrix/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..7e9de86
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nested-functions-accumulate-global-matrix/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,133 @@
+[[block]]
+struct buf2 {
+  one : f32;
+};
+
+type Arr = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> m : mat4x2<f32>;
+
+[[group(0), binding(2)]] var<uniform> x_10 : buf2;
+
+[[group(0), binding(0)]] var<uniform> x_12 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_16 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func0_i1_(x : ptr<function, i32>) {
+  var i : i32;
+  var x_137 : bool;
+  var x_138 : bool;
+  var x_138_phi : bool;
+  var x_139_phi : bool;
+  let x_124 : i32 = *(x);
+  let x_125 : bool = (x_124 < 1);
+  x_139_phi = x_125;
+  if (!(x_125)) {
+    let x_129 : i32 = *(x);
+    let x_130 : bool = (x_129 > 1);
+    x_138_phi = x_130;
+    if (x_130) {
+      let x_134 : f32 = x_10.one;
+      let x_136 : f32 = x_12.x_GLF_uniform_float_values[0];
+      x_137 = (x_134 > x_136);
+      x_138_phi = x_137;
+    }
+    x_138 = x_138_phi;
+    x_139_phi = x_138;
+  }
+  let x_139 : bool = x_139_phi;
+  if (x_139) {
+    return;
+  }
+  let x_143 : f32 = x_10.one;
+  let x_145 : f32 = x_12.x_GLF_uniform_float_values[0];
+  if ((x_143 == x_145)) {
+    i = 0;
+    loop {
+      let x_150 : i32 = i;
+      if ((x_150 < 2)) {
+      } else {
+        break;
+      }
+
+      continuing {
+        let x_154 : i32 = *(x);
+        let x_155 : i32 = clamp(x_154, 0, 3);
+        let x_156 : i32 = i;
+        let x_158 : f32 = x_12.x_GLF_uniform_float_values[0];
+        let x_160 : f32 = m[x_155][x_156];
+        m[x_155][x_156] = (x_160 + x_158);
+        let x_163 : i32 = i;
+        i = (x_163 + 1);
+      }
+    }
+  }
+  return;
+}
+
+fn func1_() {
+  var param : i32;
+  let x_167 : f32 = gl_FragCoord.y;
+  if ((x_167 < 0.0)) {
+    return;
+  }
+  param = 1;
+  func0_i1_(&(param));
+  return;
+}
+
+fn main_1() {
+  m = mat4x2<f32>(vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0));
+  func1_();
+  func1_();
+  let x_54 : mat4x2<f32> = m;
+  let x_56 : i32 = x_16.x_GLF_uniform_int_values[0];
+  let x_59 : i32 = x_16.x_GLF_uniform_int_values[0];
+  let x_62 : i32 = x_16.x_GLF_uniform_int_values[1];
+  let x_65 : i32 = x_16.x_GLF_uniform_int_values[1];
+  let x_68 : i32 = x_16.x_GLF_uniform_int_values[0];
+  let x_71 : i32 = x_16.x_GLF_uniform_int_values[0];
+  let x_74 : i32 = x_16.x_GLF_uniform_int_values[0];
+  let x_77 : i32 = x_16.x_GLF_uniform_int_values[0];
+  let x_83 : mat4x2<f32> = mat4x2<f32>(vec2<f32>(f32(x_56), f32(x_59)), vec2<f32>(f32(x_62), f32(x_65)), vec2<f32>(f32(x_68), f32(x_71)), vec2<f32>(f32(x_74), f32(x_77)));
+  if ((((all((x_54[0u] == x_83[0u])) && all((x_54[1u] == x_83[1u]))) && all((x_54[2u] == x_83[2u]))) && all((x_54[3u] == x_83[3u])))) {
+    let x_107 : i32 = x_16.x_GLF_uniform_int_values[3];
+    let x_110 : i32 = x_16.x_GLF_uniform_int_values[0];
+    let x_113 : i32 = x_16.x_GLF_uniform_int_values[0];
+    let x_116 : i32 = x_16.x_GLF_uniform_int_values[3];
+    x_GLF_color = vec4<f32>(f32(x_107), f32(x_110), f32(x_113), f32(x_116));
+  } else {
+    let x_120 : i32 = x_16.x_GLF_uniform_int_values[0];
+    let x_121 : f32 = f32(x_120);
+    x_GLF_color = vec4<f32>(x_121, x_121, x_121, x_121);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nested-functions-accumulate-global-matrix/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-nested-functions-accumulate-global-matrix/0-opt.wgsl
new file mode 100644
index 0000000..7e9de86
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nested-functions-accumulate-global-matrix/0-opt.wgsl
@@ -0,0 +1,133 @@
+[[block]]
+struct buf2 {
+  one : f32;
+};
+
+type Arr = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> m : mat4x2<f32>;
+
+[[group(0), binding(2)]] var<uniform> x_10 : buf2;
+
+[[group(0), binding(0)]] var<uniform> x_12 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_16 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func0_i1_(x : ptr<function, i32>) {
+  var i : i32;
+  var x_137 : bool;
+  var x_138 : bool;
+  var x_138_phi : bool;
+  var x_139_phi : bool;
+  let x_124 : i32 = *(x);
+  let x_125 : bool = (x_124 < 1);
+  x_139_phi = x_125;
+  if (!(x_125)) {
+    let x_129 : i32 = *(x);
+    let x_130 : bool = (x_129 > 1);
+    x_138_phi = x_130;
+    if (x_130) {
+      let x_134 : f32 = x_10.one;
+      let x_136 : f32 = x_12.x_GLF_uniform_float_values[0];
+      x_137 = (x_134 > x_136);
+      x_138_phi = x_137;
+    }
+    x_138 = x_138_phi;
+    x_139_phi = x_138;
+  }
+  let x_139 : bool = x_139_phi;
+  if (x_139) {
+    return;
+  }
+  let x_143 : f32 = x_10.one;
+  let x_145 : f32 = x_12.x_GLF_uniform_float_values[0];
+  if ((x_143 == x_145)) {
+    i = 0;
+    loop {
+      let x_150 : i32 = i;
+      if ((x_150 < 2)) {
+      } else {
+        break;
+      }
+
+      continuing {
+        let x_154 : i32 = *(x);
+        let x_155 : i32 = clamp(x_154, 0, 3);
+        let x_156 : i32 = i;
+        let x_158 : f32 = x_12.x_GLF_uniform_float_values[0];
+        let x_160 : f32 = m[x_155][x_156];
+        m[x_155][x_156] = (x_160 + x_158);
+        let x_163 : i32 = i;
+        i = (x_163 + 1);
+      }
+    }
+  }
+  return;
+}
+
+fn func1_() {
+  var param : i32;
+  let x_167 : f32 = gl_FragCoord.y;
+  if ((x_167 < 0.0)) {
+    return;
+  }
+  param = 1;
+  func0_i1_(&(param));
+  return;
+}
+
+fn main_1() {
+  m = mat4x2<f32>(vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0));
+  func1_();
+  func1_();
+  let x_54 : mat4x2<f32> = m;
+  let x_56 : i32 = x_16.x_GLF_uniform_int_values[0];
+  let x_59 : i32 = x_16.x_GLF_uniform_int_values[0];
+  let x_62 : i32 = x_16.x_GLF_uniform_int_values[1];
+  let x_65 : i32 = x_16.x_GLF_uniform_int_values[1];
+  let x_68 : i32 = x_16.x_GLF_uniform_int_values[0];
+  let x_71 : i32 = x_16.x_GLF_uniform_int_values[0];
+  let x_74 : i32 = x_16.x_GLF_uniform_int_values[0];
+  let x_77 : i32 = x_16.x_GLF_uniform_int_values[0];
+  let x_83 : mat4x2<f32> = mat4x2<f32>(vec2<f32>(f32(x_56), f32(x_59)), vec2<f32>(f32(x_62), f32(x_65)), vec2<f32>(f32(x_68), f32(x_71)), vec2<f32>(f32(x_74), f32(x_77)));
+  if ((((all((x_54[0u] == x_83[0u])) && all((x_54[1u] == x_83[1u]))) && all((x_54[2u] == x_83[2u]))) && all((x_54[3u] == x_83[3u])))) {
+    let x_107 : i32 = x_16.x_GLF_uniform_int_values[3];
+    let x_110 : i32 = x_16.x_GLF_uniform_int_values[0];
+    let x_113 : i32 = x_16.x_GLF_uniform_int_values[0];
+    let x_116 : i32 = x_16.x_GLF_uniform_int_values[3];
+    x_GLF_color = vec4<f32>(f32(x_107), f32(x_110), f32(x_113), f32(x_116));
+  } else {
+    let x_120 : i32 = x_16.x_GLF_uniform_int_values[0];
+    let x_121 : f32 = f32(x_120);
+    x_GLF_color = vec4<f32>(x_121, x_121, x_121, x_121);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nested-functions-accumulate-global-matrix/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-nested-functions-accumulate-global-matrix/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..2327dda
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nested-functions-accumulate-global-matrix/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,146 @@
+void set_float2(inout float2 vec, int idx, float val) {
+  vec = (idx.xx == int2(0, 1)) ? val.xx : vec;
+}
+
+static float4x2 m = float4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_10 : register(b2, space0) {
+  uint4 x_10[1];
+};
+cbuffer cbuffer_x_12 : register(b0, space0) {
+  uint4 x_12[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_16 : register(b1, space0) {
+  uint4 x_16[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void func0_i1_(inout int x) {
+  int i = 0;
+  bool x_137 = false;
+  bool x_138 = false;
+  bool x_138_phi = false;
+  bool x_139_phi = false;
+  const int x_124 = x;
+  const bool x_125 = (x_124 < 1);
+  x_139_phi = x_125;
+  if (!(x_125)) {
+    const int x_129 = x;
+    const bool x_130 = (x_129 > 1);
+    x_138_phi = x_130;
+    if (x_130) {
+      const float x_134 = asfloat(x_10[0].x);
+      const uint scalar_offset = ((16u * uint(0))) / 4;
+      const float x_136 = asfloat(x_12[scalar_offset / 4][scalar_offset % 4]);
+      x_137 = (x_134 > x_136);
+      x_138_phi = x_137;
+    }
+    x_138 = x_138_phi;
+    x_139_phi = x_138;
+  }
+  if (x_139_phi) {
+    return;
+  }
+  const float x_143 = asfloat(x_10[0].x);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_145 = asfloat(x_12[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_143 == x_145)) {
+    i = 0;
+    while (true) {
+      if ((i < 2)) {
+      } else {
+        break;
+      }
+      {
+        const int x_154 = x;
+        const int x_155 = clamp(x_154, 0, 3);
+        const int x_156 = i;
+        const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+        const float x_158 = asfloat(x_12[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+        const float x_160 = m[x_155][x_156];
+        set_float2(m[x_155], x_156, (x_160 + x_158));
+        i = (i + 1);
+      }
+    }
+  }
+  return;
+}
+
+void func1_() {
+  int param = 0;
+  const float x_167 = gl_FragCoord.y;
+  if ((x_167 < 0.0f)) {
+    return;
+  }
+  param = 1;
+  func0_i1_(param);
+  return;
+}
+
+void main_1() {
+  m = float4x2(float2(0.0f, 0.0f), float2(0.0f, 0.0f), float2(0.0f, 0.0f), float2(0.0f, 0.0f));
+  func1_();
+  func1_();
+  const float4x2 x_54 = m;
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const int x_56 = asint(x_16[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+  const int x_59 = asint(x_16[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+  const int x_62 = asint(x_16[1].x);
+  const int x_65 = asint(x_16[1].x);
+  const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+  const int x_68 = asint(x_16[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+  const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+  const int x_71 = asint(x_16[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+  const uint scalar_offset_7 = ((16u * uint(0))) / 4;
+  const int x_74 = asint(x_16[scalar_offset_7 / 4][scalar_offset_7 % 4]);
+  const uint scalar_offset_8 = ((16u * uint(0))) / 4;
+  const int x_77 = asint(x_16[scalar_offset_8 / 4][scalar_offset_8 % 4]);
+  const float4x2 x_83 = float4x2(float2(float(x_56), float(x_59)), float2(float(x_62), float(x_65)), float2(float(x_68), float(x_71)), float2(float(x_74), float(x_77)));
+  bool tint_tmp_2 = all((x_54[0u] == x_83[0u]));
+  if (tint_tmp_2) {
+    tint_tmp_2 = all((x_54[1u] == x_83[1u]));
+  }
+  bool tint_tmp_1 = (tint_tmp_2);
+  if (tint_tmp_1) {
+    tint_tmp_1 = all((x_54[2u] == x_83[2u]));
+  }
+  bool tint_tmp = (tint_tmp_1);
+  if (tint_tmp) {
+    tint_tmp = all((x_54[3u] == x_83[3u]));
+  }
+  if ((tint_tmp)) {
+    const int x_107 = asint(x_16[3].x);
+    const uint scalar_offset_9 = ((16u * uint(0))) / 4;
+    const int x_110 = asint(x_16[scalar_offset_9 / 4][scalar_offset_9 % 4]);
+    const uint scalar_offset_10 = ((16u * uint(0))) / 4;
+    const int x_113 = asint(x_16[scalar_offset_10 / 4][scalar_offset_10 % 4]);
+    const int x_116 = asint(x_16[3].x);
+    x_GLF_color = float4(float(x_107), float(x_110), float(x_113), float(x_116));
+  } else {
+    const uint scalar_offset_11 = ((16u * uint(0))) / 4;
+    const int x_120 = asint(x_16[scalar_offset_11 / 4][scalar_offset_11 % 4]);
+    const float x_121 = float(x_120);
+    x_GLF_color = float4(x_121, x_121, x_121, x_121);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_7 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_7;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nested-functions-accumulate-global-matrix/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-nested-functions-accumulate-global-matrix/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..5cd7a35
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nested-functions-accumulate-global-matrix/0-opt.wgsl.expected.msl
@@ -0,0 +1,134 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf2 {
+  /* 0x0000 */ float one;
+};
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[4];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void func0_i1_(constant buf2& x_10, constant buf0& x_12, thread int* const x, thread float4x2* const tint_symbol_5) {
+  int i = 0;
+  bool x_137 = false;
+  bool x_138 = false;
+  bool x_138_phi = false;
+  bool x_139_phi = false;
+  int const x_124 = *(x);
+  bool const x_125 = (x_124 < 1);
+  x_139_phi = x_125;
+  if (!(x_125)) {
+    int const x_129 = *(x);
+    bool const x_130 = (x_129 > 1);
+    x_138_phi = x_130;
+    if (x_130) {
+      float const x_134 = x_10.one;
+      float const x_136 = x_12.x_GLF_uniform_float_values.arr[0].el;
+      x_137 = (x_134 > x_136);
+      x_138_phi = x_137;
+    }
+    x_138 = x_138_phi;
+    x_139_phi = x_138;
+  }
+  bool const x_139 = x_139_phi;
+  if (x_139) {
+    return;
+  }
+  float const x_143 = x_10.one;
+  float const x_145 = x_12.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_143 == x_145)) {
+    i = 0;
+    while (true) {
+      int const x_150 = i;
+      if ((x_150 < 2)) {
+      } else {
+        break;
+      }
+      {
+        int const x_154 = *(x);
+        int const x_155 = clamp(x_154, 0, 3);
+        int const x_156 = i;
+        float const x_158 = x_12.x_GLF_uniform_float_values.arr[0].el;
+        float const x_160 = (*(tint_symbol_5))[x_155][x_156];
+        (*(tint_symbol_5))[x_155][x_156] = (x_160 + x_158);
+        int const x_163 = i;
+        i = (x_163 + 1);
+      }
+    }
+  }
+  return;
+}
+
+void func1_(constant buf2& x_10, constant buf0& x_12, thread float4* const tint_symbol_6, thread float4x2* const tint_symbol_7) {
+  int param = 0;
+  float const x_167 = (*(tint_symbol_6)).y;
+  if ((x_167 < 0.0f)) {
+    return;
+  }
+  param = 1;
+  func0_i1_(x_10, x_12, &(param), tint_symbol_7);
+  return;
+}
+
+void main_1(constant buf2& x_10, constant buf0& x_12, constant buf1& x_16, thread float4x2* const tint_symbol_8, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10) {
+  *(tint_symbol_8) = float4x2(float2(0.0f, 0.0f), float2(0.0f, 0.0f), float2(0.0f, 0.0f), float2(0.0f, 0.0f));
+  func1_(x_10, x_12, tint_symbol_9, tint_symbol_8);
+  func1_(x_10, x_12, tint_symbol_9, tint_symbol_8);
+  float4x2 const x_54 = *(tint_symbol_8);
+  int const x_56 = x_16.x_GLF_uniform_int_values.arr[0].el;
+  int const x_59 = x_16.x_GLF_uniform_int_values.arr[0].el;
+  int const x_62 = x_16.x_GLF_uniform_int_values.arr[1].el;
+  int const x_65 = x_16.x_GLF_uniform_int_values.arr[1].el;
+  int const x_68 = x_16.x_GLF_uniform_int_values.arr[0].el;
+  int const x_71 = x_16.x_GLF_uniform_int_values.arr[0].el;
+  int const x_74 = x_16.x_GLF_uniform_int_values.arr[0].el;
+  int const x_77 = x_16.x_GLF_uniform_int_values.arr[0].el;
+  float4x2 const x_83 = float4x2(float2(float(x_56), float(x_59)), float2(float(x_62), float(x_65)), float2(float(x_68), float(x_71)), float2(float(x_74), float(x_77)));
+  if ((((all((x_54[0u] == x_83[0u])) && all((x_54[1u] == x_83[1u]))) && all((x_54[2u] == x_83[2u]))) && all((x_54[3u] == x_83[3u])))) {
+    int const x_107 = x_16.x_GLF_uniform_int_values.arr[3].el;
+    int const x_110 = x_16.x_GLF_uniform_int_values.arr[0].el;
+    int const x_113 = x_16.x_GLF_uniform_int_values.arr[0].el;
+    int const x_116 = x_16.x_GLF_uniform_int_values.arr[3].el;
+    *(tint_symbol_10) = float4(float(x_107), float(x_110), float(x_113), float(x_116));
+  } else {
+    int const x_120 = x_16.x_GLF_uniform_int_values.arr[0].el;
+    float const x_121 = float(x_120);
+    *(tint_symbol_10) = float4(x_121, x_121, x_121, x_121);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf2& x_10 [[buffer(2)]], constant buf0& x_12 [[buffer(0)]], constant buf1& x_16 [[buffer(1)]]) {
+  thread float4 tint_symbol_11 = 0.0f;
+  thread float4x2 tint_symbol_12 = float4x2(0.0f);
+  thread float4 tint_symbol_13 = 0.0f;
+  tint_symbol_11 = gl_FragCoord_param;
+  main_1(x_10, x_12, x_16, &(tint_symbol_12), &(tint_symbol_11), &(tint_symbol_13));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_13};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nested-functions-accumulate-global-matrix/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-nested-functions-accumulate-global-matrix/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..b4e8fcf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nested-functions-accumulate-global-matrix/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,329 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 214
+; Schema: 0
+               OpCapability Shader
+         %92 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %m "m"
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "one"
+               OpName %x_10 "x_10"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_12 "x_12"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_16 "x_16"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %func0_i1_ "func0_i1_"
+               OpName %x "x"
+               OpName %i "i"
+               OpName %x_137 "x_137"
+               OpName %x_138 "x_138"
+               OpName %x_138_phi "x_138_phi"
+               OpName %x_139_phi "x_139_phi"
+               OpName %func1_ "func1_"
+               OpName %param "param"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf2 Block
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 2
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_12 NonWritable
+               OpDecorate %x_12 DescriptorSet 0
+               OpDecorate %x_12 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_16 NonWritable
+               OpDecorate %x_16 DescriptorSet 0
+               OpDecorate %x_16 Binding 1
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%mat4v2float = OpTypeMatrix %v2float 4
+%_ptr_Private_mat4v2float = OpTypePointer Private %mat4v2float
+          %6 = OpConstantNull %mat4v2float
+          %m = OpVariable %_ptr_Private_mat4v2float Private %6
+       %buf2 = OpTypeStruct %float
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+       %x_10 = OpVariable %_ptr_Uniform_buf2 Uniform
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_12 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %19 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %19
+        %int = OpTypeInt 32 1
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf1 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_16 = OpVariable %_ptr_Uniform_buf1 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %19
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %19
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+         %31 = OpTypeFunction %void %_ptr_Function_int
+         %38 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %42 = OpConstantNull %bool
+      %int_1 = OpConstant %int 1
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+%_ptr_Private_float = OpTypePointer Private %float
+        %104 = OpTypeFunction %void
+    %float_0 = OpConstant %float 0
+        %118 = OpConstantComposite %v2float %float_0 %float_0
+        %119 = OpConstantComposite %mat4v2float %118 %118 %118 %118
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+     %v2bool = OpTypeVector %bool 2
+     %uint_2 = OpConstant %uint 2
+     %uint_3 = OpConstant %uint 3
+   %main_out = OpTypeStruct %v4float
+        %201 = OpTypeFunction %void %main_out
+  %func0_i1_ = OpFunction %void None %31
+          %x = OpFunctionParameter %_ptr_Function_int
+         %36 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %38
+      %x_137 = OpVariable %_ptr_Function_bool Function %42
+      %x_138 = OpVariable %_ptr_Function_bool Function %42
+  %x_138_phi = OpVariable %_ptr_Function_bool Function %42
+  %x_139_phi = OpVariable %_ptr_Function_bool Function %42
+         %47 = OpLoad %int %x
+         %49 = OpSLessThan %bool %47 %int_1
+               OpStore %x_139_phi %49
+         %50 = OpLogicalNot %bool %49
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %51
+         %52 = OpLabel
+         %54 = OpLoad %int %x
+         %55 = OpSGreaterThan %bool %54 %int_1
+               OpStore %x_138_phi %55
+               OpSelectionMerge %56 None
+               OpBranchConditional %55 %57 %56
+         %57 = OpLabel
+         %60 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0
+         %61 = OpLoad %float %60
+         %63 = OpAccessChain %_ptr_Uniform_float %x_12 %uint_0 %int_0
+         %64 = OpLoad %float %63
+         %65 = OpFOrdGreaterThan %bool %61 %64
+               OpStore %x_137 %65
+         %66 = OpLoad %bool %x_137
+               OpStore %x_138_phi %66
+               OpBranch %56
+         %56 = OpLabel
+         %67 = OpLoad %bool %x_138_phi
+               OpStore %x_138 %67
+         %68 = OpLoad %bool %x_138
+               OpStore %x_139_phi %68
+               OpBranch %51
+         %51 = OpLabel
+         %69 = OpLoad %bool %x_139_phi
+               OpSelectionMerge %70 None
+               OpBranchConditional %69 %71 %70
+         %71 = OpLabel
+               OpReturn
+         %70 = OpLabel
+         %72 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0
+         %73 = OpLoad %float %72
+         %74 = OpAccessChain %_ptr_Uniform_float %x_12 %uint_0 %int_0
+         %75 = OpLoad %float %74
+         %76 = OpFOrdEqual %bool %73 %75
+               OpSelectionMerge %77 None
+               OpBranchConditional %76 %78 %77
+         %78 = OpLabel
+               OpStore %i %int_0
+               OpBranch %79
+         %79 = OpLabel
+               OpLoopMerge %80 %81 None
+               OpBranch %82
+         %82 = OpLabel
+         %83 = OpLoad %int %i
+         %85 = OpSLessThan %bool %83 %int_2
+               OpSelectionMerge %86 None
+               OpBranchConditional %85 %87 %88
+         %87 = OpLabel
+               OpBranch %86
+         %88 = OpLabel
+               OpBranch %80
+         %86 = OpLabel
+               OpBranch %81
+         %81 = OpLabel
+         %90 = OpLoad %int %x
+         %91 = OpExtInst %int %92 SClamp %90 %int_0 %int_3
+         %94 = OpLoad %int %i
+         %95 = OpAccessChain %_ptr_Uniform_float %x_12 %uint_0 %int_0
+         %96 = OpLoad %float %95
+         %98 = OpAccessChain %_ptr_Private_float %m %91 %94
+         %99 = OpLoad %float %98
+        %100 = OpAccessChain %_ptr_Private_float %m %91 %94
+        %101 = OpFAdd %float %99 %96
+               OpStore %100 %101
+        %102 = OpLoad %int %i
+        %103 = OpIAdd %int %102 %int_1
+               OpStore %i %103
+               OpBranch %79
+         %80 = OpLabel
+               OpBranch %77
+         %77 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %func1_ = OpFunction %void None %104
+        %106 = OpLabel
+      %param = OpVariable %_ptr_Function_int Function %38
+        %108 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %109 = OpLoad %float %108
+        %111 = OpFOrdLessThan %bool %109 %float_0
+               OpSelectionMerge %112 None
+               OpBranchConditional %111 %113 %112
+        %113 = OpLabel
+               OpReturn
+        %112 = OpLabel
+               OpStore %param %int_1
+        %114 = OpFunctionCall %void %func0_i1_ %param
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %104
+        %117 = OpLabel
+               OpStore %m %119
+        %120 = OpFunctionCall %void %func1_
+        %121 = OpFunctionCall %void %func1_
+        %122 = OpLoad %mat4v2float %m
+        %124 = OpAccessChain %_ptr_Uniform_int %x_16 %uint_0 %int_0
+        %125 = OpLoad %int %124
+        %126 = OpAccessChain %_ptr_Uniform_int %x_16 %uint_0 %int_0
+        %127 = OpLoad %int %126
+        %128 = OpAccessChain %_ptr_Uniform_int %x_16 %uint_0 %int_1
+        %129 = OpLoad %int %128
+        %130 = OpAccessChain %_ptr_Uniform_int %x_16 %uint_0 %int_1
+        %131 = OpLoad %int %130
+        %132 = OpAccessChain %_ptr_Uniform_int %x_16 %uint_0 %int_0
+        %133 = OpLoad %int %132
+        %134 = OpAccessChain %_ptr_Uniform_int %x_16 %uint_0 %int_0
+        %135 = OpLoad %int %134
+        %136 = OpAccessChain %_ptr_Uniform_int %x_16 %uint_0 %int_0
+        %137 = OpLoad %int %136
+        %138 = OpAccessChain %_ptr_Uniform_int %x_16 %uint_0 %int_0
+        %139 = OpLoad %int %138
+        %140 = OpConvertSToF %float %125
+        %141 = OpConvertSToF %float %127
+        %142 = OpCompositeConstruct %v2float %140 %141
+        %143 = OpConvertSToF %float %129
+        %144 = OpConvertSToF %float %131
+        %145 = OpCompositeConstruct %v2float %143 %144
+        %146 = OpConvertSToF %float %133
+        %147 = OpConvertSToF %float %135
+        %148 = OpCompositeConstruct %v2float %146 %147
+        %149 = OpConvertSToF %float %137
+        %150 = OpConvertSToF %float %139
+        %151 = OpCompositeConstruct %v2float %149 %150
+        %152 = OpCompositeConstruct %mat4v2float %142 %145 %148 %151
+        %154 = OpCompositeExtract %v2float %122 0
+        %155 = OpCompositeExtract %v2float %152 0
+        %156 = OpFOrdEqual %v2bool %154 %155
+        %153 = OpAll %bool %156
+               OpSelectionMerge %158 None
+               OpBranchConditional %153 %159 %158
+        %159 = OpLabel
+        %161 = OpCompositeExtract %v2float %122 1
+        %162 = OpCompositeExtract %v2float %152 1
+        %163 = OpFOrdEqual %v2bool %161 %162
+        %160 = OpAll %bool %163
+               OpBranch %158
+        %158 = OpLabel
+        %164 = OpPhi %bool %153 %117 %160 %159
+               OpSelectionMerge %165 None
+               OpBranchConditional %164 %166 %165
+        %166 = OpLabel
+        %169 = OpCompositeExtract %v2float %122 2
+        %170 = OpCompositeExtract %v2float %152 2
+        %171 = OpFOrdEqual %v2bool %169 %170
+        %167 = OpAll %bool %171
+               OpBranch %165
+        %165 = OpLabel
+        %172 = OpPhi %bool %164 %158 %167 %166
+               OpSelectionMerge %173 None
+               OpBranchConditional %172 %174 %173
+        %174 = OpLabel
+        %177 = OpCompositeExtract %v2float %122 3
+        %178 = OpCompositeExtract %v2float %152 3
+        %179 = OpFOrdEqual %v2bool %177 %178
+        %175 = OpAll %bool %179
+               OpBranch %173
+        %173 = OpLabel
+        %180 = OpPhi %bool %172 %165 %175 %174
+               OpSelectionMerge %181 None
+               OpBranchConditional %180 %182 %183
+        %182 = OpLabel
+        %184 = OpAccessChain %_ptr_Uniform_int %x_16 %uint_0 %int_3
+        %185 = OpLoad %int %184
+        %186 = OpAccessChain %_ptr_Uniform_int %x_16 %uint_0 %int_0
+        %187 = OpLoad %int %186
+        %188 = OpAccessChain %_ptr_Uniform_int %x_16 %uint_0 %int_0
+        %189 = OpLoad %int %188
+        %190 = OpAccessChain %_ptr_Uniform_int %x_16 %uint_0 %int_3
+        %191 = OpLoad %int %190
+        %192 = OpConvertSToF %float %185
+        %193 = OpConvertSToF %float %187
+        %194 = OpConvertSToF %float %189
+        %195 = OpConvertSToF %float %191
+        %196 = OpCompositeConstruct %v4float %192 %193 %194 %195
+               OpStore %x_GLF_color %196
+               OpBranch %181
+        %183 = OpLabel
+        %197 = OpAccessChain %_ptr_Uniform_int %x_16 %uint_0 %int_0
+        %198 = OpLoad %int %197
+        %199 = OpConvertSToF %float %198
+        %200 = OpCompositeConstruct %v4float %199 %199 %199 %199
+               OpStore %x_GLF_color %200
+               OpBranch %181
+        %181 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %201
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %205 = OpLabel
+        %206 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %206
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %104
+        %208 = OpLabel
+        %209 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %209
+        %210 = OpFunctionCall %void %main_1
+        %212 = OpLoad %v4float %x_GLF_color
+        %213 = OpCompositeConstruct %main_out %212
+        %211 = OpFunctionCall %void %tint_symbol_3 %213
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nested-functions-accumulate-global-matrix/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-nested-functions-accumulate-global-matrix/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..7e9de86
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nested-functions-accumulate-global-matrix/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,133 @@
+[[block]]
+struct buf2 {
+  one : f32;
+};
+
+type Arr = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> m : mat4x2<f32>;
+
+[[group(0), binding(2)]] var<uniform> x_10 : buf2;
+
+[[group(0), binding(0)]] var<uniform> x_12 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_16 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func0_i1_(x : ptr<function, i32>) {
+  var i : i32;
+  var x_137 : bool;
+  var x_138 : bool;
+  var x_138_phi : bool;
+  var x_139_phi : bool;
+  let x_124 : i32 = *(x);
+  let x_125 : bool = (x_124 < 1);
+  x_139_phi = x_125;
+  if (!(x_125)) {
+    let x_129 : i32 = *(x);
+    let x_130 : bool = (x_129 > 1);
+    x_138_phi = x_130;
+    if (x_130) {
+      let x_134 : f32 = x_10.one;
+      let x_136 : f32 = x_12.x_GLF_uniform_float_values[0];
+      x_137 = (x_134 > x_136);
+      x_138_phi = x_137;
+    }
+    x_138 = x_138_phi;
+    x_139_phi = x_138;
+  }
+  let x_139 : bool = x_139_phi;
+  if (x_139) {
+    return;
+  }
+  let x_143 : f32 = x_10.one;
+  let x_145 : f32 = x_12.x_GLF_uniform_float_values[0];
+  if ((x_143 == x_145)) {
+    i = 0;
+    loop {
+      let x_150 : i32 = i;
+      if ((x_150 < 2)) {
+      } else {
+        break;
+      }
+
+      continuing {
+        let x_154 : i32 = *(x);
+        let x_155 : i32 = clamp(x_154, 0, 3);
+        let x_156 : i32 = i;
+        let x_158 : f32 = x_12.x_GLF_uniform_float_values[0];
+        let x_160 : f32 = m[x_155][x_156];
+        m[x_155][x_156] = (x_160 + x_158);
+        let x_163 : i32 = i;
+        i = (x_163 + 1);
+      }
+    }
+  }
+  return;
+}
+
+fn func1_() {
+  var param : i32;
+  let x_167 : f32 = gl_FragCoord.y;
+  if ((x_167 < 0.0)) {
+    return;
+  }
+  param = 1;
+  func0_i1_(&(param));
+  return;
+}
+
+fn main_1() {
+  m = mat4x2<f32>(vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0));
+  func1_();
+  func1_();
+  let x_54 : mat4x2<f32> = m;
+  let x_56 : i32 = x_16.x_GLF_uniform_int_values[0];
+  let x_59 : i32 = x_16.x_GLF_uniform_int_values[0];
+  let x_62 : i32 = x_16.x_GLF_uniform_int_values[1];
+  let x_65 : i32 = x_16.x_GLF_uniform_int_values[1];
+  let x_68 : i32 = x_16.x_GLF_uniform_int_values[0];
+  let x_71 : i32 = x_16.x_GLF_uniform_int_values[0];
+  let x_74 : i32 = x_16.x_GLF_uniform_int_values[0];
+  let x_77 : i32 = x_16.x_GLF_uniform_int_values[0];
+  let x_83 : mat4x2<f32> = mat4x2<f32>(vec2<f32>(f32(x_56), f32(x_59)), vec2<f32>(f32(x_62), f32(x_65)), vec2<f32>(f32(x_68), f32(x_71)), vec2<f32>(f32(x_74), f32(x_77)));
+  if ((((all((x_54[0u] == x_83[0u])) && all((x_54[1u] == x_83[1u]))) && all((x_54[2u] == x_83[2u]))) && all((x_54[3u] == x_83[3u])))) {
+    let x_107 : i32 = x_16.x_GLF_uniform_int_values[3];
+    let x_110 : i32 = x_16.x_GLF_uniform_int_values[0];
+    let x_113 : i32 = x_16.x_GLF_uniform_int_values[0];
+    let x_116 : i32 = x_16.x_GLF_uniform_int_values[3];
+    x_GLF_color = vec4<f32>(f32(x_107), f32(x_110), f32(x_113), f32(x_116));
+  } else {
+    let x_120 : i32 = x_16.x_GLF_uniform_int_values[0];
+    let x_121 : f32 = f32(x_120);
+    x_GLF_color = vec4<f32>(x_121, x_121, x_121, x_121);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.spvasm
new file mode 100644
index 0000000..ac20aee
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.spvasm
@@ -0,0 +1,183 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %v0 "v0"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %v1 "v1"
+               OpName %a "a"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %c "c"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_int = OpTypePointer Function %int
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf1 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+      %int_2 = OpConstant %int 2
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_3 = OpConstant %float 3
+    %float_1 = OpConstant %float 1
+         %36 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+     %uint_0 = OpConstant %uint 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %15
+         %39 = OpLabel
+         %v0 = OpVariable %_ptr_Function_v4float Function
+         %v1 = OpVariable %_ptr_Function_v4float Function
+          %a = OpVariable %_ptr_Function_int Function
+          %c = OpVariable %_ptr_Function_int Function
+         %40 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %41 = OpLoad %float %40
+         %42 = OpCompositeConstruct %v4float %41 %41 %41 %41
+               OpStore %v0 %42
+         %43 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %44 = OpLoad %float %43
+         %45 = OpCompositeConstruct %v4float %44 %44 %44 %44
+               OpStore %v1 %45
+         %46 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %47 = OpLoad %int %46
+               OpStore %a %47
+               OpBranch %48
+         %48 = OpLabel
+               OpLoopMerge %49 %50 None
+               OpBranch %51
+         %51 = OpLabel
+         %52 = OpLoad %int %a
+         %53 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %54 = OpLoad %int %53
+         %55 = OpSLessThan %bool %52 %54
+               OpBranchConditional %55 %56 %49
+         %56 = OpLabel
+         %57 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_3
+         %58 = OpLoad %int %57
+               OpStore %c %58
+               OpBranch %59
+         %59 = OpLabel
+               OpLoopMerge %60 %61 None
+               OpBranch %62
+         %62 = OpLabel
+         %63 = OpLoad %int %c
+         %64 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %65 = OpLoad %int %64
+         %66 = OpSLessThan %bool %63 %65
+               OpBranchConditional %66 %67 %60
+         %67 = OpLabel
+         %68 = OpLoad %int %c
+         %69 = OpExtInst %int %1 SClamp %68 %int_0 %int_3
+         %70 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %71 = OpLoad %float %70
+         %72 = OpAccessChain %_ptr_Function_float %v0 %69
+         %73 = OpLoad %float %72
+         %74 = OpFSub %float %73 %71
+         %75 = OpAccessChain %_ptr_Function_float %v0 %69
+               OpStore %75 %74
+         %76 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %77 = OpLoad %int %76
+         %78 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_3
+         %79 = OpLoad %int %78
+         %80 = OpIEqual %bool %77 %79
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %81
+         %82 = OpLabel
+         %83 = OpLoad %int %a
+         %84 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %85 = OpLoad %float %84
+         %86 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %87 = OpLoad %float %86
+         %88 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %89 = OpLoad %float %88
+         %90 = OpCompositeConstruct %v4float %85 %87 %89 %float_3
+         %91 = OpLoad %v4float %v0
+         %92 = OpExtInst %v4float %1 SmoothStep %90 %36 %91
+         %93 = OpLoad %int %a
+         %94 = OpVectorExtractDynamic %float %92 %93
+         %95 = OpAccessChain %_ptr_Function_float %v1 %83
+               OpStore %95 %94
+               OpBranch %81
+         %81 = OpLabel
+               OpBranch %61
+         %61 = OpLabel
+         %96 = OpLoad %int %c
+         %97 = OpIAdd %int %96 %int_1
+               OpStore %c %97
+               OpBranch %59
+         %60 = OpLabel
+               OpBranch %50
+         %50 = OpLabel
+         %98 = OpLoad %int %a
+         %99 = OpIAdd %int %98 %int_1
+               OpStore %a %99
+               OpBranch %48
+         %49 = OpLabel
+        %100 = OpAccessChain %_ptr_Function_float %v1 %uint_0
+        %101 = OpLoad %float %100
+        %102 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+        %103 = OpLoad %float %102
+        %104 = OpFOrdEqual %bool %101 %103
+               OpSelectionMerge %105 None
+               OpBranchConditional %104 %106 %107
+        %106 = OpLabel
+        %108 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %109 = OpLoad %int %108
+        %110 = OpConvertSToF %float %109
+        %111 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_3
+        %112 = OpLoad %int %111
+        %113 = OpConvertSToF %float %112
+        %114 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_3
+        %115 = OpLoad %int %114
+        %116 = OpConvertSToF %float %115
+        %117 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %118 = OpLoad %int %117
+        %119 = OpConvertSToF %float %118
+        %120 = OpCompositeConstruct %v4float %110 %113 %116 %119
+               OpStore %_GLF_color %120
+               OpBranch %105
+        %107 = OpLabel
+        %121 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_3
+        %122 = OpLoad %int %121
+        %123 = OpConvertSToF %float %122
+        %124 = OpCompositeConstruct %v4float %123 %123 %123 %123
+               OpStore %_GLF_color %124
+               OpBranch %105
+        %105 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..5ae6c98
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,92 @@
+void set_float4(inout float4 vec, int idx, float val) {
+  vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
+}
+
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+cbuffer cbuffer_x_10 : register(b1, space0) {
+  uint4 x_10[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 v0 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 v1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int a = 0;
+  int c = 0;
+  const float x_41 = asfloat(x_6[1].x);
+  v0 = float4(x_41, x_41, x_41, x_41);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_44 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  v1 = float4(x_44, x_44, x_44, x_44);
+  const int x_47 = asint(x_10[1].x);
+  a = x_47;
+  while (true) {
+    const int x_52 = a;
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_54 = asint(x_10[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    if ((x_52 < x_54)) {
+    } else {
+      break;
+    }
+    const int x_58 = asint(x_10[3].x);
+    c = x_58;
+    while (true) {
+      const int x_63 = c;
+      const int x_65 = asint(x_10[2].x);
+      if ((x_63 < x_65)) {
+      } else {
+        break;
+      }
+      const int x_69 = clamp(c, 0, 3);
+      const float x_71 = asfloat(x_6[1].x);
+      const float x_73 = v0[x_69];
+      set_float4(v0, x_69, (x_73 - x_71));
+      const int x_77 = asint(x_10[1].x);
+      const int x_79 = asint(x_10[3].x);
+      if ((x_77 == x_79)) {
+        const int x_83 = a;
+        const float x_85 = asfloat(x_6[1].x);
+        const float x_87 = asfloat(x_6[1].x);
+        const float x_89 = asfloat(x_6[1].x);
+        set_float4(v1, x_83, smoothstep(float4(x_85, x_87, x_89, 3.0f), float4(1.0f, 1.0f, 1.0f, 1.0f), v0)[a]);
+      }
+      {
+        c = (c + 1);
+      }
+    }
+    {
+      a = (a + 1);
+    }
+  }
+  const float x_101 = v1.x;
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const float x_103 = asfloat(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  if ((x_101 == x_103)) {
+    const int x_109 = asint(x_10[1].x);
+    const int x_112 = asint(x_10[3].x);
+    const int x_115 = asint(x_10[3].x);
+    const int x_118 = asint(x_10[1].x);
+    x_GLF_color = float4(float(x_109), float(x_112), float(x_115), float(x_118));
+  } else {
+    const int x_122 = asint(x_10[3].x);
+    const float x_123 = float(x_122);
+    x_GLF_color = float4(x_123, x_123, x_123, x_123);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..ecc0d68
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.spvasm.expected.msl
@@ -0,0 +1,107 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[4];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_10, thread float4* const tint_symbol_4) {
+  float4 v0 = 0.0f;
+  float4 v1 = 0.0f;
+  int a = 0;
+  int c = 0;
+  float const x_41 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  v0 = float4(x_41, x_41, x_41, x_41);
+  float const x_44 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  v1 = float4(x_44, x_44, x_44, x_44);
+  int const x_47 = x_10.x_GLF_uniform_int_values.arr[1].el;
+  a = x_47;
+  while (true) {
+    int const x_52 = a;
+    int const x_54 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_52 < x_54)) {
+    } else {
+      break;
+    }
+    int const x_58 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    c = x_58;
+    while (true) {
+      int const x_63 = c;
+      int const x_65 = x_10.x_GLF_uniform_int_values.arr[2].el;
+      if ((x_63 < x_65)) {
+      } else {
+        break;
+      }
+      int const x_68 = c;
+      int const x_69 = clamp(x_68, 0, 3);
+      float const x_71 = x_6.x_GLF_uniform_float_values.arr[1].el;
+      float const x_73 = v0[x_69];
+      v0[x_69] = (x_73 - x_71);
+      int const x_77 = x_10.x_GLF_uniform_int_values.arr[1].el;
+      int const x_79 = x_10.x_GLF_uniform_int_values.arr[3].el;
+      if ((x_77 == x_79)) {
+        int const x_83 = a;
+        float const x_85 = x_6.x_GLF_uniform_float_values.arr[1].el;
+        float const x_87 = x_6.x_GLF_uniform_float_values.arr[1].el;
+        float const x_89 = x_6.x_GLF_uniform_float_values.arr[1].el;
+        float4 const x_91 = v0;
+        int const x_93 = a;
+        v1[x_83] = smoothstep(float4(x_85, x_87, x_89, 3.0f), float4(1.0f, 1.0f, 1.0f, 1.0f), x_91)[x_93];
+      }
+      {
+        int const x_96 = c;
+        c = (x_96 + 1);
+      }
+    }
+    {
+      int const x_98 = a;
+      a = (x_98 + 1);
+    }
+  }
+  float const x_101 = v1.x;
+  float const x_103 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_101 == x_103)) {
+    int const x_109 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_112 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    int const x_115 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    int const x_118 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_109), float(x_112), float(x_115), float(x_118));
+  } else {
+    int const x_122 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    float const x_123 = float(x_122);
+    *(tint_symbol_4) = float4(x_123, x_123, x_123, x_123);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_10 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..59b8fdd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,227 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 145
+; Schema: 0
+               OpCapability Shader
+         %73 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v0 "v0"
+               OpName %v1 "v1"
+               OpName %a "a"
+               OpName %c "c"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf1 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_10 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+      %int_2 = OpConstant %int 2
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_3 = OpConstant %float 3
+    %float_1 = OpConstant %float 1
+        %102 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+        %133 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+         %v0 = OpVariable %_ptr_Function_v4float Function %17
+         %v1 = OpVariable %_ptr_Function_v4float Function %17
+          %a = OpVariable %_ptr_Function_int Function %29
+          %c = OpVariable %_ptr_Function_int Function %29
+         %34 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %35 = OpLoad %float %34
+         %36 = OpCompositeConstruct %v4float %35 %35 %35 %35
+               OpStore %v0 %36
+         %38 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %39 = OpLoad %float %38
+         %40 = OpCompositeConstruct %v4float %39 %39 %39 %39
+               OpStore %v1 %40
+         %42 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %43 = OpLoad %int %42
+               OpStore %a %43
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %48 = OpLoad %int %a
+         %49 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %50 = OpLoad %int %49
+         %51 = OpSLessThan %bool %48 %50
+               OpSelectionMerge %53 None
+               OpBranchConditional %51 %54 %55
+         %54 = OpLabel
+               OpBranch %53
+         %55 = OpLabel
+               OpBranch %45
+         %53 = OpLabel
+         %57 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+         %58 = OpLoad %int %57
+               OpStore %c %58
+               OpBranch %59
+         %59 = OpLabel
+               OpLoopMerge %60 %61 None
+               OpBranch %62
+         %62 = OpLabel
+         %63 = OpLoad %int %c
+         %65 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+         %66 = OpLoad %int %65
+         %67 = OpSLessThan %bool %63 %66
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %70
+         %69 = OpLabel
+               OpBranch %68
+         %70 = OpLabel
+               OpBranch %60
+         %68 = OpLabel
+         %71 = OpLoad %int %c
+         %72 = OpExtInst %int %73 SClamp %71 %int_0 %int_3
+         %74 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %75 = OpLoad %float %74
+         %77 = OpAccessChain %_ptr_Function_float %v0 %72
+         %78 = OpLoad %float %77
+         %79 = OpAccessChain %_ptr_Function_float %v0 %72
+         %80 = OpFSub %float %78 %75
+               OpStore %79 %80
+         %81 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %82 = OpLoad %int %81
+         %83 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+         %84 = OpLoad %int %83
+         %85 = OpIEqual %bool %82 %84
+               OpSelectionMerge %86 None
+               OpBranchConditional %85 %87 %86
+         %87 = OpLabel
+         %88 = OpLoad %int %a
+         %89 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %90 = OpLoad %float %89
+         %91 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %92 = OpLoad %float %91
+         %93 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %94 = OpLoad %float %93
+         %95 = OpLoad %v4float %v0
+         %96 = OpLoad %int %a
+         %97 = OpAccessChain %_ptr_Function_float %v1 %88
+        %100 = OpCompositeConstruct %v4float %90 %92 %94 %float_3
+         %98 = OpExtInst %v4float %73 SmoothStep %100 %102 %95
+        %103 = OpVectorExtractDynamic %float %98 %96
+               OpStore %97 %103
+               OpBranch %86
+         %86 = OpLabel
+               OpBranch %61
+         %61 = OpLabel
+        %104 = OpLoad %int %c
+        %105 = OpIAdd %int %104 %int_1
+               OpStore %c %105
+               OpBranch %59
+         %60 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+        %106 = OpLoad %int %a
+        %107 = OpIAdd %int %106 %int_1
+               OpStore %a %107
+               OpBranch %44
+         %45 = OpLabel
+        %108 = OpAccessChain %_ptr_Function_float %v1 %uint_0
+        %109 = OpLoad %float %108
+        %110 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+        %111 = OpLoad %float %110
+        %112 = OpFOrdEqual %bool %109 %111
+               OpSelectionMerge %113 None
+               OpBranchConditional %112 %114 %115
+        %114 = OpLabel
+        %116 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %117 = OpLoad %int %116
+        %118 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+        %119 = OpLoad %int %118
+        %120 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+        %121 = OpLoad %int %120
+        %122 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %123 = OpLoad %int %122
+        %124 = OpConvertSToF %float %117
+        %125 = OpConvertSToF %float %119
+        %126 = OpConvertSToF %float %121
+        %127 = OpConvertSToF %float %123
+        %128 = OpCompositeConstruct %v4float %124 %125 %126 %127
+               OpStore %x_GLF_color %128
+               OpBranch %113
+        %115 = OpLabel
+        %129 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+        %130 = OpLoad %int %129
+        %131 = OpConvertSToF %float %130
+        %132 = OpCompositeConstruct %v4float %131 %131 %131 %131
+               OpStore %x_GLF_color %132
+               OpBranch %113
+        %113 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %133
+%tint_symbol = OpFunctionParameter %main_out
+        %137 = OpLabel
+        %138 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %138
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %140 = OpLabel
+        %141 = OpFunctionCall %void %main_1
+        %143 = OpLoad %v4float %x_GLF_color
+        %144 = OpCompositeConstruct %main_out %143
+        %142 = OpFunctionCall %void %tint_symbol_2 %144
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..e3aa195
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,101 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v0 : vec4<f32>;
+  var v1 : vec4<f32>;
+  var a : i32;
+  var c : i32;
+  let x_41 : f32 = x_6.x_GLF_uniform_float_values[1];
+  v0 = vec4<f32>(x_41, x_41, x_41, x_41);
+  let x_44 : f32 = x_6.x_GLF_uniform_float_values[0];
+  v1 = vec4<f32>(x_44, x_44, x_44, x_44);
+  let x_47 : i32 = x_10.x_GLF_uniform_int_values[1];
+  a = x_47;
+  loop {
+    let x_52 : i32 = a;
+    let x_54 : i32 = x_10.x_GLF_uniform_int_values[0];
+    if ((x_52 < x_54)) {
+    } else {
+      break;
+    }
+    let x_58 : i32 = x_10.x_GLF_uniform_int_values[3];
+    c = x_58;
+    loop {
+      let x_63 : i32 = c;
+      let x_65 : i32 = x_10.x_GLF_uniform_int_values[2];
+      if ((x_63 < x_65)) {
+      } else {
+        break;
+      }
+      let x_68 : i32 = c;
+      let x_69 : i32 = clamp(x_68, 0, 3);
+      let x_71 : f32 = x_6.x_GLF_uniform_float_values[1];
+      let x_73 : f32 = v0[x_69];
+      v0[x_69] = (x_73 - x_71);
+      let x_77 : i32 = x_10.x_GLF_uniform_int_values[1];
+      let x_79 : i32 = x_10.x_GLF_uniform_int_values[3];
+      if ((x_77 == x_79)) {
+        let x_83 : i32 = a;
+        let x_85 : f32 = x_6.x_GLF_uniform_float_values[1];
+        let x_87 : f32 = x_6.x_GLF_uniform_float_values[1];
+        let x_89 : f32 = x_6.x_GLF_uniform_float_values[1];
+        let x_91 : vec4<f32> = v0;
+        let x_93 : i32 = a;
+        v1[x_83] = smoothStep(vec4<f32>(x_85, x_87, x_89, 3.0), vec4<f32>(1.0, 1.0, 1.0, 1.0), x_91)[x_93];
+      }
+
+      continuing {
+        let x_96 : i32 = c;
+        c = (x_96 + 1);
+      }
+    }
+
+    continuing {
+      let x_98 : i32 = a;
+      a = (x_98 + 1);
+    }
+  }
+  let x_101 : f32 = v1.x;
+  let x_103 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if ((x_101 == x_103)) {
+    let x_109 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_112 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_115 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_118 : i32 = x_10.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_109), f32(x_112), f32(x_115), f32(x_118));
+  } else {
+    let x_122 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_123 : f32 = f32(x_122);
+    x_GLF_color = vec4<f32>(x_123, x_123, x_123, x_123);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.wgsl
new file mode 100644
index 0000000..e3aa195
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.wgsl
@@ -0,0 +1,101 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v0 : vec4<f32>;
+  var v1 : vec4<f32>;
+  var a : i32;
+  var c : i32;
+  let x_41 : f32 = x_6.x_GLF_uniform_float_values[1];
+  v0 = vec4<f32>(x_41, x_41, x_41, x_41);
+  let x_44 : f32 = x_6.x_GLF_uniform_float_values[0];
+  v1 = vec4<f32>(x_44, x_44, x_44, x_44);
+  let x_47 : i32 = x_10.x_GLF_uniform_int_values[1];
+  a = x_47;
+  loop {
+    let x_52 : i32 = a;
+    let x_54 : i32 = x_10.x_GLF_uniform_int_values[0];
+    if ((x_52 < x_54)) {
+    } else {
+      break;
+    }
+    let x_58 : i32 = x_10.x_GLF_uniform_int_values[3];
+    c = x_58;
+    loop {
+      let x_63 : i32 = c;
+      let x_65 : i32 = x_10.x_GLF_uniform_int_values[2];
+      if ((x_63 < x_65)) {
+      } else {
+        break;
+      }
+      let x_68 : i32 = c;
+      let x_69 : i32 = clamp(x_68, 0, 3);
+      let x_71 : f32 = x_6.x_GLF_uniform_float_values[1];
+      let x_73 : f32 = v0[x_69];
+      v0[x_69] = (x_73 - x_71);
+      let x_77 : i32 = x_10.x_GLF_uniform_int_values[1];
+      let x_79 : i32 = x_10.x_GLF_uniform_int_values[3];
+      if ((x_77 == x_79)) {
+        let x_83 : i32 = a;
+        let x_85 : f32 = x_6.x_GLF_uniform_float_values[1];
+        let x_87 : f32 = x_6.x_GLF_uniform_float_values[1];
+        let x_89 : f32 = x_6.x_GLF_uniform_float_values[1];
+        let x_91 : vec4<f32> = v0;
+        let x_93 : i32 = a;
+        v1[x_83] = smoothStep(vec4<f32>(x_85, x_87, x_89, 3.0), vec4<f32>(1.0, 1.0, 1.0, 1.0), x_91)[x_93];
+      }
+
+      continuing {
+        let x_96 : i32 = c;
+        c = (x_96 + 1);
+      }
+    }
+
+    continuing {
+      let x_98 : i32 = a;
+      a = (x_98 + 1);
+    }
+  }
+  let x_101 : f32 = v1.x;
+  let x_103 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if ((x_101 == x_103)) {
+    let x_109 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_112 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_115 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_118 : i32 = x_10.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_109), f32(x_112), f32(x_115), f32(x_118));
+  } else {
+    let x_122 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_123 : f32 = f32(x_122);
+    x_GLF_color = vec4<f32>(x_123, x_123, x_123, x_123);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..5ae6c98
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,92 @@
+void set_float4(inout float4 vec, int idx, float val) {
+  vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
+}
+
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+cbuffer cbuffer_x_10 : register(b1, space0) {
+  uint4 x_10[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 v0 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 v1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int a = 0;
+  int c = 0;
+  const float x_41 = asfloat(x_6[1].x);
+  v0 = float4(x_41, x_41, x_41, x_41);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_44 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  v1 = float4(x_44, x_44, x_44, x_44);
+  const int x_47 = asint(x_10[1].x);
+  a = x_47;
+  while (true) {
+    const int x_52 = a;
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_54 = asint(x_10[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    if ((x_52 < x_54)) {
+    } else {
+      break;
+    }
+    const int x_58 = asint(x_10[3].x);
+    c = x_58;
+    while (true) {
+      const int x_63 = c;
+      const int x_65 = asint(x_10[2].x);
+      if ((x_63 < x_65)) {
+      } else {
+        break;
+      }
+      const int x_69 = clamp(c, 0, 3);
+      const float x_71 = asfloat(x_6[1].x);
+      const float x_73 = v0[x_69];
+      set_float4(v0, x_69, (x_73 - x_71));
+      const int x_77 = asint(x_10[1].x);
+      const int x_79 = asint(x_10[3].x);
+      if ((x_77 == x_79)) {
+        const int x_83 = a;
+        const float x_85 = asfloat(x_6[1].x);
+        const float x_87 = asfloat(x_6[1].x);
+        const float x_89 = asfloat(x_6[1].x);
+        set_float4(v1, x_83, smoothstep(float4(x_85, x_87, x_89, 3.0f), float4(1.0f, 1.0f, 1.0f, 1.0f), v0)[a]);
+      }
+      {
+        c = (c + 1);
+      }
+    }
+    {
+      a = (a + 1);
+    }
+  }
+  const float x_101 = v1.x;
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const float x_103 = asfloat(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  if ((x_101 == x_103)) {
+    const int x_109 = asint(x_10[1].x);
+    const int x_112 = asint(x_10[3].x);
+    const int x_115 = asint(x_10[3].x);
+    const int x_118 = asint(x_10[1].x);
+    x_GLF_color = float4(float(x_109), float(x_112), float(x_115), float(x_118));
+  } else {
+    const int x_122 = asint(x_10[3].x);
+    const float x_123 = float(x_122);
+    x_GLF_color = float4(x_123, x_123, x_123, x_123);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..ecc0d68
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.wgsl.expected.msl
@@ -0,0 +1,107 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[4];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_10, thread float4* const tint_symbol_4) {
+  float4 v0 = 0.0f;
+  float4 v1 = 0.0f;
+  int a = 0;
+  int c = 0;
+  float const x_41 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  v0 = float4(x_41, x_41, x_41, x_41);
+  float const x_44 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  v1 = float4(x_44, x_44, x_44, x_44);
+  int const x_47 = x_10.x_GLF_uniform_int_values.arr[1].el;
+  a = x_47;
+  while (true) {
+    int const x_52 = a;
+    int const x_54 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_52 < x_54)) {
+    } else {
+      break;
+    }
+    int const x_58 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    c = x_58;
+    while (true) {
+      int const x_63 = c;
+      int const x_65 = x_10.x_GLF_uniform_int_values.arr[2].el;
+      if ((x_63 < x_65)) {
+      } else {
+        break;
+      }
+      int const x_68 = c;
+      int const x_69 = clamp(x_68, 0, 3);
+      float const x_71 = x_6.x_GLF_uniform_float_values.arr[1].el;
+      float const x_73 = v0[x_69];
+      v0[x_69] = (x_73 - x_71);
+      int const x_77 = x_10.x_GLF_uniform_int_values.arr[1].el;
+      int const x_79 = x_10.x_GLF_uniform_int_values.arr[3].el;
+      if ((x_77 == x_79)) {
+        int const x_83 = a;
+        float const x_85 = x_6.x_GLF_uniform_float_values.arr[1].el;
+        float const x_87 = x_6.x_GLF_uniform_float_values.arr[1].el;
+        float const x_89 = x_6.x_GLF_uniform_float_values.arr[1].el;
+        float4 const x_91 = v0;
+        int const x_93 = a;
+        v1[x_83] = smoothstep(float4(x_85, x_87, x_89, 3.0f), float4(1.0f, 1.0f, 1.0f, 1.0f), x_91)[x_93];
+      }
+      {
+        int const x_96 = c;
+        c = (x_96 + 1);
+      }
+    }
+    {
+      int const x_98 = a;
+      a = (x_98 + 1);
+    }
+  }
+  float const x_101 = v1.x;
+  float const x_103 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_101 == x_103)) {
+    int const x_109 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_112 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    int const x_115 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    int const x_118 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_109), float(x_112), float(x_115), float(x_118));
+  } else {
+    int const x_122 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    float const x_123 = float(x_122);
+    *(tint_symbol_4) = float4(x_123, x_123, x_123, x_123);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_10 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..59b8fdd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,227 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 145
+; Schema: 0
+               OpCapability Shader
+         %73 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v0 "v0"
+               OpName %v1 "v1"
+               OpName %a "a"
+               OpName %c "c"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf1 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_10 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+      %int_2 = OpConstant %int 2
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_3 = OpConstant %float 3
+    %float_1 = OpConstant %float 1
+        %102 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+        %133 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+         %v0 = OpVariable %_ptr_Function_v4float Function %17
+         %v1 = OpVariable %_ptr_Function_v4float Function %17
+          %a = OpVariable %_ptr_Function_int Function %29
+          %c = OpVariable %_ptr_Function_int Function %29
+         %34 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %35 = OpLoad %float %34
+         %36 = OpCompositeConstruct %v4float %35 %35 %35 %35
+               OpStore %v0 %36
+         %38 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %39 = OpLoad %float %38
+         %40 = OpCompositeConstruct %v4float %39 %39 %39 %39
+               OpStore %v1 %40
+         %42 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %43 = OpLoad %int %42
+               OpStore %a %43
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %48 = OpLoad %int %a
+         %49 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %50 = OpLoad %int %49
+         %51 = OpSLessThan %bool %48 %50
+               OpSelectionMerge %53 None
+               OpBranchConditional %51 %54 %55
+         %54 = OpLabel
+               OpBranch %53
+         %55 = OpLabel
+               OpBranch %45
+         %53 = OpLabel
+         %57 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+         %58 = OpLoad %int %57
+               OpStore %c %58
+               OpBranch %59
+         %59 = OpLabel
+               OpLoopMerge %60 %61 None
+               OpBranch %62
+         %62 = OpLabel
+         %63 = OpLoad %int %c
+         %65 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+         %66 = OpLoad %int %65
+         %67 = OpSLessThan %bool %63 %66
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %70
+         %69 = OpLabel
+               OpBranch %68
+         %70 = OpLabel
+               OpBranch %60
+         %68 = OpLabel
+         %71 = OpLoad %int %c
+         %72 = OpExtInst %int %73 SClamp %71 %int_0 %int_3
+         %74 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %75 = OpLoad %float %74
+         %77 = OpAccessChain %_ptr_Function_float %v0 %72
+         %78 = OpLoad %float %77
+         %79 = OpAccessChain %_ptr_Function_float %v0 %72
+         %80 = OpFSub %float %78 %75
+               OpStore %79 %80
+         %81 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %82 = OpLoad %int %81
+         %83 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+         %84 = OpLoad %int %83
+         %85 = OpIEqual %bool %82 %84
+               OpSelectionMerge %86 None
+               OpBranchConditional %85 %87 %86
+         %87 = OpLabel
+         %88 = OpLoad %int %a
+         %89 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %90 = OpLoad %float %89
+         %91 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %92 = OpLoad %float %91
+         %93 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %94 = OpLoad %float %93
+         %95 = OpLoad %v4float %v0
+         %96 = OpLoad %int %a
+         %97 = OpAccessChain %_ptr_Function_float %v1 %88
+        %100 = OpCompositeConstruct %v4float %90 %92 %94 %float_3
+         %98 = OpExtInst %v4float %73 SmoothStep %100 %102 %95
+        %103 = OpVectorExtractDynamic %float %98 %96
+               OpStore %97 %103
+               OpBranch %86
+         %86 = OpLabel
+               OpBranch %61
+         %61 = OpLabel
+        %104 = OpLoad %int %c
+        %105 = OpIAdd %int %104 %int_1
+               OpStore %c %105
+               OpBranch %59
+         %60 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+        %106 = OpLoad %int %a
+        %107 = OpIAdd %int %106 %int_1
+               OpStore %a %107
+               OpBranch %44
+         %45 = OpLabel
+        %108 = OpAccessChain %_ptr_Function_float %v1 %uint_0
+        %109 = OpLoad %float %108
+        %110 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+        %111 = OpLoad %float %110
+        %112 = OpFOrdEqual %bool %109 %111
+               OpSelectionMerge %113 None
+               OpBranchConditional %112 %114 %115
+        %114 = OpLabel
+        %116 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %117 = OpLoad %int %116
+        %118 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+        %119 = OpLoad %int %118
+        %120 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+        %121 = OpLoad %int %120
+        %122 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %123 = OpLoad %int %122
+        %124 = OpConvertSToF %float %117
+        %125 = OpConvertSToF %float %119
+        %126 = OpConvertSToF %float %121
+        %127 = OpConvertSToF %float %123
+        %128 = OpCompositeConstruct %v4float %124 %125 %126 %127
+               OpStore %x_GLF_color %128
+               OpBranch %113
+        %115 = OpLabel
+        %129 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+        %130 = OpLoad %int %129
+        %131 = OpConvertSToF %float %130
+        %132 = OpCompositeConstruct %v4float %131 %131 %131 %131
+               OpStore %x_GLF_color %132
+               OpBranch %113
+        %113 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %133
+%tint_symbol = OpFunctionParameter %main_out
+        %137 = OpLabel
+        %138 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %138
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %140 = OpLabel
+        %141 = OpFunctionCall %void %main_1
+        %143 = OpLoad %v4float %x_GLF_color
+        %144 = OpCompositeConstruct %main_out %143
+        %142 = OpFunctionCall %void %tint_symbol_2 %144
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..e3aa195
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nested-loop-undefined-smoothstep-never-executed/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,101 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v0 : vec4<f32>;
+  var v1 : vec4<f32>;
+  var a : i32;
+  var c : i32;
+  let x_41 : f32 = x_6.x_GLF_uniform_float_values[1];
+  v0 = vec4<f32>(x_41, x_41, x_41, x_41);
+  let x_44 : f32 = x_6.x_GLF_uniform_float_values[0];
+  v1 = vec4<f32>(x_44, x_44, x_44, x_44);
+  let x_47 : i32 = x_10.x_GLF_uniform_int_values[1];
+  a = x_47;
+  loop {
+    let x_52 : i32 = a;
+    let x_54 : i32 = x_10.x_GLF_uniform_int_values[0];
+    if ((x_52 < x_54)) {
+    } else {
+      break;
+    }
+    let x_58 : i32 = x_10.x_GLF_uniform_int_values[3];
+    c = x_58;
+    loop {
+      let x_63 : i32 = c;
+      let x_65 : i32 = x_10.x_GLF_uniform_int_values[2];
+      if ((x_63 < x_65)) {
+      } else {
+        break;
+      }
+      let x_68 : i32 = c;
+      let x_69 : i32 = clamp(x_68, 0, 3);
+      let x_71 : f32 = x_6.x_GLF_uniform_float_values[1];
+      let x_73 : f32 = v0[x_69];
+      v0[x_69] = (x_73 - x_71);
+      let x_77 : i32 = x_10.x_GLF_uniform_int_values[1];
+      let x_79 : i32 = x_10.x_GLF_uniform_int_values[3];
+      if ((x_77 == x_79)) {
+        let x_83 : i32 = a;
+        let x_85 : f32 = x_6.x_GLF_uniform_float_values[1];
+        let x_87 : f32 = x_6.x_GLF_uniform_float_values[1];
+        let x_89 : f32 = x_6.x_GLF_uniform_float_values[1];
+        let x_91 : vec4<f32> = v0;
+        let x_93 : i32 = a;
+        v1[x_83] = smoothStep(vec4<f32>(x_85, x_87, x_89, 3.0), vec4<f32>(1.0, 1.0, 1.0, 1.0), x_91)[x_93];
+      }
+
+      continuing {
+        let x_96 : i32 = c;
+        c = (x_96 + 1);
+      }
+    }
+
+    continuing {
+      let x_98 : i32 = a;
+      a = (x_98 + 1);
+    }
+  }
+  let x_101 : f32 = v1.x;
+  let x_103 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if ((x_101 == x_103)) {
+    let x_109 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_112 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_115 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_118 : i32 = x_10.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_109), f32(x_112), f32(x_115), f32(x_118));
+  } else {
+    let x_122 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_123 : f32 = f32(x_122);
+    x_GLF_color = vec4<f32>(x_123, x_123, x_123, x_123);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nested-loops-global-loop-counter-do-while-accumulate-float/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-nested-loops-global-loop-counter-do-while-accumulate-float/0-opt.spvasm
new file mode 100644
index 0000000..99a2d49
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nested-loops-global-loop-counter-do-while-accumulate-float/0-opt.spvasm
@@ -0,0 +1,496 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %_GLF_global_loop_count "_GLF_global_loop_count"
+               OpName %f "f"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %i_0 "i"
+               OpName %i_1 "i"
+               OpName %i_2 "i"
+               OpName %i_3 "i"
+               OpName %i_4 "i"
+               OpName %i_5 "i"
+               OpName %i_6 "i"
+               OpName %i_7 "i"
+               OpName %i_8 "i"
+               OpName %i_9 "i"
+               OpName %i_10 "i"
+               OpName %i_11 "i"
+               OpName %i_12 "i"
+               OpName %i_13 "i"
+               OpName %sum "sum"
+               OpName %r "r"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+%_GLF_global_loop_count = OpVariable %_ptr_Private_int Private
+      %int_0 = OpConstant %int 0
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf0 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_int = OpTypePointer Function %int
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf1 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+    %int_100 = OpConstant %int 100
+      %int_3 = OpConstant %int 3
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %30
+         %51 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function
+          %i = OpVariable %_ptr_Function_int Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+        %i_1 = OpVariable %_ptr_Function_int Function
+        %i_2 = OpVariable %_ptr_Function_int Function
+        %i_3 = OpVariable %_ptr_Function_int Function
+        %i_4 = OpVariable %_ptr_Function_int Function
+        %i_5 = OpVariable %_ptr_Function_int Function
+        %i_6 = OpVariable %_ptr_Function_int Function
+        %i_7 = OpVariable %_ptr_Function_int Function
+        %i_8 = OpVariable %_ptr_Function_int Function
+        %i_9 = OpVariable %_ptr_Function_int Function
+       %i_10 = OpVariable %_ptr_Function_int Function
+       %i_11 = OpVariable %_ptr_Function_int Function
+       %i_12 = OpVariable %_ptr_Function_int Function
+       %i_13 = OpVariable %_ptr_Function_int Function
+        %sum = OpVariable %_ptr_Function_float Function
+          %r = OpVariable %_ptr_Function_int Function
+               OpStore %_GLF_global_loop_count %int_0
+         %52 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %53 = OpLoad %float %52
+               OpStore %f %53
+         %54 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %55 = OpLoad %int %54
+               OpStore %i %55
+               OpBranch %56
+         %56 = OpLabel
+               OpLoopMerge %57 %58 None
+               OpBranch %59
+         %59 = OpLabel
+         %60 = OpLoad %int %i
+         %61 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %62 = OpLoad %int %61
+         %63 = OpSLessThan %bool %60 %62
+               OpBranchConditional %63 %64 %57
+         %64 = OpLabel
+         %65 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %66 = OpLoad %int %65
+               OpStore %i_0 %66
+               OpBranch %67
+         %67 = OpLabel
+               OpLoopMerge %68 %69 None
+               OpBranch %70
+         %70 = OpLabel
+         %71 = OpLoad %int %i_0
+         %72 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %73 = OpLoad %int %72
+         %74 = OpSLessThan %bool %71 %73
+               OpBranchConditional %74 %75 %68
+         %75 = OpLabel
+         %76 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %77 = OpLoad %int %76
+               OpStore %i_1 %77
+               OpBranch %78
+         %78 = OpLabel
+               OpLoopMerge %79 %80 None
+               OpBranch %81
+         %81 = OpLabel
+         %82 = OpLoad %int %i_1
+         %83 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %84 = OpLoad %int %83
+         %85 = OpSLessThan %bool %82 %84
+               OpBranchConditional %85 %86 %79
+         %86 = OpLabel
+         %87 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %88 = OpLoad %int %87
+               OpStore %i_2 %88
+               OpBranch %89
+         %89 = OpLabel
+               OpLoopMerge %90 %91 None
+               OpBranch %92
+         %92 = OpLabel
+         %93 = OpLoad %int %i_2
+         %94 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %95 = OpLoad %int %94
+         %96 = OpSLessThan %bool %93 %95
+               OpBranchConditional %96 %97 %90
+         %97 = OpLabel
+         %98 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %99 = OpLoad %int %98
+               OpStore %i_3 %99
+               OpBranch %100
+        %100 = OpLabel
+               OpLoopMerge %101 %102 None
+               OpBranch %103
+        %103 = OpLabel
+        %104 = OpLoad %int %i_3
+        %105 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+        %106 = OpLoad %int %105
+        %107 = OpSLessThan %bool %104 %106
+               OpBranchConditional %107 %108 %101
+        %108 = OpLabel
+        %109 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %110 = OpLoad %int %109
+               OpStore %i_4 %110
+               OpBranch %111
+        %111 = OpLabel
+               OpLoopMerge %112 %113 None
+               OpBranch %114
+        %114 = OpLabel
+        %115 = OpLoad %int %i_4
+        %116 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+        %117 = OpLoad %int %116
+        %118 = OpSLessThan %bool %115 %117
+               OpBranchConditional %118 %119 %112
+        %119 = OpLabel
+        %120 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %121 = OpLoad %int %120
+               OpStore %i_5 %121
+               OpBranch %122
+        %122 = OpLabel
+               OpLoopMerge %123 %124 None
+               OpBranch %125
+        %125 = OpLabel
+        %126 = OpLoad %int %i_5
+        %127 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+        %128 = OpLoad %int %127
+        %129 = OpSLessThan %bool %126 %128
+               OpBranchConditional %129 %130 %123
+        %130 = OpLabel
+        %131 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %132 = OpLoad %int %131
+               OpStore %i_6 %132
+               OpBranch %133
+        %133 = OpLabel
+               OpLoopMerge %134 %135 None
+               OpBranch %136
+        %136 = OpLabel
+        %137 = OpLoad %int %i_6
+        %138 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+        %139 = OpLoad %int %138
+        %140 = OpSLessThan %bool %137 %139
+               OpBranchConditional %140 %141 %134
+        %141 = OpLabel
+        %142 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %143 = OpLoad %int %142
+               OpStore %i_7 %143
+               OpBranch %144
+        %144 = OpLabel
+               OpLoopMerge %145 %146 None
+               OpBranch %147
+        %147 = OpLabel
+        %148 = OpLoad %int %i_7
+        %149 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+        %150 = OpLoad %int %149
+        %151 = OpSLessThan %bool %148 %150
+               OpBranchConditional %151 %152 %145
+        %152 = OpLabel
+        %153 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %154 = OpLoad %int %153
+               OpStore %i_8 %154
+               OpBranch %155
+        %155 = OpLabel
+               OpLoopMerge %156 %157 None
+               OpBranch %158
+        %158 = OpLabel
+        %159 = OpLoad %int %i_8
+        %160 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+        %161 = OpLoad %int %160
+        %162 = OpSLessThan %bool %159 %161
+               OpBranchConditional %162 %163 %156
+        %163 = OpLabel
+        %164 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %165 = OpLoad %int %164
+               OpStore %i_9 %165
+               OpBranch %166
+        %166 = OpLabel
+               OpLoopMerge %167 %168 None
+               OpBranch %169
+        %169 = OpLabel
+        %170 = OpLoad %int %i_9
+        %171 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+        %172 = OpLoad %int %171
+        %173 = OpSLessThan %bool %170 %172
+               OpBranchConditional %173 %174 %167
+        %174 = OpLabel
+        %175 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %176 = OpLoad %int %175
+               OpStore %i_10 %176
+               OpBranch %177
+        %177 = OpLabel
+               OpLoopMerge %178 %179 None
+               OpBranch %180
+        %180 = OpLabel
+        %181 = OpLoad %int %i_10
+        %182 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+        %183 = OpLoad %int %182
+        %184 = OpSLessThan %bool %181 %183
+               OpBranchConditional %184 %185 %178
+        %185 = OpLabel
+        %186 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %187 = OpLoad %int %186
+               OpStore %i_11 %187
+               OpBranch %188
+        %188 = OpLabel
+               OpLoopMerge %189 %190 None
+               OpBranch %191
+        %191 = OpLabel
+        %192 = OpLoad %int %i_11
+        %193 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+        %194 = OpLoad %int %193
+        %195 = OpSLessThan %bool %192 %194
+               OpBranchConditional %195 %196 %189
+        %196 = OpLabel
+        %197 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %198 = OpLoad %int %197
+               OpStore %i_12 %198
+               OpBranch %199
+        %199 = OpLabel
+               OpLoopMerge %200 %201 None
+               OpBranch %202
+        %202 = OpLabel
+        %203 = OpLoad %int %i_12
+        %204 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+        %205 = OpLoad %int %204
+        %206 = OpSLessThan %bool %203 %205
+               OpBranchConditional %206 %207 %200
+        %207 = OpLabel
+        %208 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %209 = OpLoad %int %208
+               OpStore %i_13 %209
+               OpBranch %210
+        %210 = OpLabel
+               OpLoopMerge %211 %212 None
+               OpBranch %213
+        %213 = OpLabel
+        %214 = OpLoad %int %i_13
+        %215 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+        %216 = OpLoad %int %215
+        %217 = OpSLessThan %bool %214 %216
+               OpBranchConditional %217 %218 %211
+        %218 = OpLabel
+               OpBranch %219
+        %219 = OpLabel
+               OpLoopMerge %220 %221 None
+               OpBranch %222
+        %222 = OpLabel
+        %223 = OpLoad %int %_GLF_global_loop_count
+        %224 = OpIAdd %int %223 %int_1
+               OpStore %_GLF_global_loop_count %224
+               OpBranch %221
+        %221 = OpLabel
+        %225 = OpLoad %int %_GLF_global_loop_count
+        %226 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_3
+        %227 = OpLoad %int %226
+        %228 = OpISub %int %int_100 %227
+        %229 = OpSLessThan %bool %225 %228
+               OpBranchConditional %229 %219 %220
+        %220 = OpLabel
+        %230 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+        %231 = OpLoad %float %230
+        %232 = OpLoad %float %f
+        %233 = OpFAdd %float %232 %231
+               OpStore %f %233
+               OpBranch %212
+        %212 = OpLabel
+        %234 = OpLoad %int %i_13
+        %235 = OpIAdd %int %234 %int_1
+               OpStore %i_13 %235
+               OpBranch %210
+        %211 = OpLabel
+               OpBranch %201
+        %201 = OpLabel
+        %236 = OpLoad %int %i_12
+        %237 = OpIAdd %int %236 %int_1
+               OpStore %i_12 %237
+               OpBranch %199
+        %200 = OpLabel
+               OpBranch %190
+        %190 = OpLabel
+        %238 = OpLoad %int %i_11
+        %239 = OpIAdd %int %238 %int_1
+               OpStore %i_11 %239
+               OpBranch %188
+        %189 = OpLabel
+               OpBranch %179
+        %179 = OpLabel
+        %240 = OpLoad %int %i_10
+        %241 = OpIAdd %int %240 %int_1
+               OpStore %i_10 %241
+               OpBranch %177
+        %178 = OpLabel
+               OpBranch %168
+        %168 = OpLabel
+        %242 = OpLoad %int %i_9
+        %243 = OpIAdd %int %242 %int_1
+               OpStore %i_9 %243
+               OpBranch %166
+        %167 = OpLabel
+               OpBranch %157
+        %157 = OpLabel
+        %244 = OpLoad %int %i_8
+        %245 = OpIAdd %int %244 %int_1
+               OpStore %i_8 %245
+               OpBranch %155
+        %156 = OpLabel
+               OpBranch %146
+        %146 = OpLabel
+        %246 = OpLoad %int %i_7
+        %247 = OpIAdd %int %246 %int_1
+               OpStore %i_7 %247
+               OpBranch %144
+        %145 = OpLabel
+               OpBranch %135
+        %135 = OpLabel
+        %248 = OpLoad %int %i_6
+        %249 = OpIAdd %int %248 %int_1
+               OpStore %i_6 %249
+               OpBranch %133
+        %134 = OpLabel
+               OpBranch %124
+        %124 = OpLabel
+        %250 = OpLoad %int %i_5
+        %251 = OpIAdd %int %250 %int_1
+               OpStore %i_5 %251
+               OpBranch %122
+        %123 = OpLabel
+               OpBranch %113
+        %113 = OpLabel
+        %252 = OpLoad %int %i_4
+        %253 = OpIAdd %int %252 %int_1
+               OpStore %i_4 %253
+               OpBranch %111
+        %112 = OpLabel
+               OpBranch %102
+        %102 = OpLabel
+        %254 = OpLoad %int %i_3
+        %255 = OpIAdd %int %254 %int_1
+               OpStore %i_3 %255
+               OpBranch %100
+        %101 = OpLabel
+               OpBranch %91
+         %91 = OpLabel
+        %256 = OpLoad %int %i_2
+        %257 = OpIAdd %int %256 %int_1
+               OpStore %i_2 %257
+               OpBranch %89
+         %90 = OpLabel
+               OpBranch %80
+         %80 = OpLabel
+        %258 = OpLoad %int %i_1
+        %259 = OpIAdd %int %258 %int_1
+               OpStore %i_1 %259
+               OpBranch %78
+         %79 = OpLabel
+               OpBranch %69
+         %69 = OpLabel
+        %260 = OpLoad %int %i_0
+        %261 = OpIAdd %int %260 %int_1
+               OpStore %i_0 %261
+               OpBranch %67
+         %68 = OpLabel
+               OpBranch %58
+         %58 = OpLabel
+        %262 = OpLoad %int %i
+        %263 = OpIAdd %int %262 %int_1
+               OpStore %i %263
+               OpBranch %56
+         %57 = OpLabel
+        %264 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+        %265 = OpLoad %float %264
+               OpStore %sum %265
+        %266 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %267 = OpLoad %int %266
+               OpStore %r %267
+               OpBranch %268
+        %268 = OpLabel
+               OpLoopMerge %269 %270 None
+               OpBranch %271
+        %271 = OpLabel
+        %272 = OpLoad %int %_GLF_global_loop_count
+        %273 = OpSLessThan %bool %272 %int_100
+               OpBranchConditional %273 %274 %269
+        %274 = OpLabel
+        %275 = OpLoad %int %_GLF_global_loop_count
+        %276 = OpIAdd %int %275 %int_1
+               OpStore %_GLF_global_loop_count %276
+        %277 = OpLoad %float %f
+        %278 = OpLoad %float %sum
+        %279 = OpFAdd %float %278 %277
+               OpStore %sum %279
+               OpBranch %270
+        %270 = OpLabel
+        %280 = OpLoad %int %r
+        %281 = OpIAdd %int %280 %int_1
+               OpStore %r %281
+               OpBranch %268
+        %269 = OpLabel
+        %282 = OpLoad %float %sum
+        %283 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+        %284 = OpLoad %float %283
+        %285 = OpFOrdEqual %bool %282 %284
+               OpSelectionMerge %286 None
+               OpBranchConditional %285 %287 %288
+        %287 = OpLabel
+        %289 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+        %290 = OpLoad %int %289
+        %291 = OpConvertSToF %float %290
+        %292 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %293 = OpLoad %int %292
+        %294 = OpConvertSToF %float %293
+        %295 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %296 = OpLoad %int %295
+        %297 = OpConvertSToF %float %296
+        %298 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+        %299 = OpLoad %int %298
+        %300 = OpConvertSToF %float %299
+        %301 = OpCompositeConstruct %v4float %291 %294 %297 %300
+               OpStore %_GLF_color %301
+               OpBranch %286
+        %288 = OpLabel
+        %302 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %303 = OpLoad %int %302
+        %304 = OpConvertSToF %float %303
+        %305 = OpCompositeConstruct %v4float %304 %304 %304 %304
+               OpStore %_GLF_color %305
+               OpBranch %286
+        %286 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nested-loops-global-loop-counter-do-while-accumulate-float/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-nested-loops-global-loop-counter-do-while-accumulate-float/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..fb22331
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nested-loops-global-loop-counter-do-while-accumulate-float/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,294 @@
+static int x_GLF_global_loop_count = 0;
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[3];
+};
+cbuffer cbuffer_x_10 : register(b1, space0) {
+  uint4 x_10[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float f = 0.0f;
+  int i = 0;
+  int i_1 = 0;
+  int i_2 = 0;
+  int i_3 = 0;
+  int i_4 = 0;
+  int i_5 = 0;
+  int i_6 = 0;
+  int i_7 = 0;
+  int i_8 = 0;
+  int i_9 = 0;
+  int i_10 = 0;
+  int i_11 = 0;
+  int i_12 = 0;
+  int i_13 = 0;
+  int i_14 = 0;
+  float sum = 0.0f;
+  int r = 0;
+  x_GLF_global_loop_count = 0;
+  const float x_53 = asfloat(x_7[1].x);
+  f = x_53;
+  const int x_55 = asint(x_10[1].x);
+  i = x_55;
+  while (true) {
+    const int x_60 = i;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_62 = asint(x_10[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_60 < x_62)) {
+    } else {
+      break;
+    }
+    const int x_66 = asint(x_10[1].x);
+    i_1 = x_66;
+    while (true) {
+      const int x_71 = i_1;
+      const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+      const int x_73 = asint(x_10[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+      if ((x_71 < x_73)) {
+      } else {
+        break;
+      }
+      const int x_77 = asint(x_10[1].x);
+      i_2 = x_77;
+      while (true) {
+        const int x_82 = i_2;
+        const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+        const int x_84 = asint(x_10[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+        if ((x_82 < x_84)) {
+        } else {
+          break;
+        }
+        const int x_88 = asint(x_10[1].x);
+        i_3 = x_88;
+        while (true) {
+          const int x_93 = i_3;
+          const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+          const int x_95 = asint(x_10[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+          if ((x_93 < x_95)) {
+          } else {
+            break;
+          }
+          const int x_99 = asint(x_10[1].x);
+          i_4 = x_99;
+          while (true) {
+            const int x_104 = i_4;
+            const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+            const int x_106 = asint(x_10[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+            if ((x_104 < x_106)) {
+            } else {
+              break;
+            }
+            const int x_110 = asint(x_10[1].x);
+            i_5 = x_110;
+            while (true) {
+              const int x_115 = i_5;
+              const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+              const int x_117 = asint(x_10[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+              if ((x_115 < x_117)) {
+              } else {
+                break;
+              }
+              const int x_121 = asint(x_10[1].x);
+              i_6 = x_121;
+              while (true) {
+                const int x_126 = i_6;
+                const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+                const int x_128 = asint(x_10[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+                if ((x_126 < x_128)) {
+                } else {
+                  break;
+                }
+                const int x_132 = asint(x_10[1].x);
+                i_7 = x_132;
+                while (true) {
+                  const int x_137 = i_7;
+                  const uint scalar_offset_7 = ((16u * uint(0))) / 4;
+                  const int x_139 = asint(x_10[scalar_offset_7 / 4][scalar_offset_7 % 4]);
+                  if ((x_137 < x_139)) {
+                  } else {
+                    break;
+                  }
+                  const int x_143 = asint(x_10[1].x);
+                  i_8 = x_143;
+                  while (true) {
+                    const int x_148 = i_8;
+                    const uint scalar_offset_8 = ((16u * uint(0))) / 4;
+                    const int x_150 = asint(x_10[scalar_offset_8 / 4][scalar_offset_8 % 4]);
+                    if ((x_148 < x_150)) {
+                    } else {
+                      break;
+                    }
+                    const int x_154 = asint(x_10[1].x);
+                    i_9 = x_154;
+                    while (true) {
+                      const int x_159 = i_9;
+                      const uint scalar_offset_9 = ((16u * uint(0))) / 4;
+                      const int x_161 = asint(x_10[scalar_offset_9 / 4][scalar_offset_9 % 4]);
+                      if ((x_159 < x_161)) {
+                      } else {
+                        break;
+                      }
+                      const int x_165 = asint(x_10[1].x);
+                      i_10 = x_165;
+                      while (true) {
+                        const int x_170 = i_10;
+                        const uint scalar_offset_10 = ((16u * uint(0))) / 4;
+                        const int x_172 = asint(x_10[scalar_offset_10 / 4][scalar_offset_10 % 4]);
+                        if ((x_170 < x_172)) {
+                        } else {
+                          break;
+                        }
+                        const int x_176 = asint(x_10[1].x);
+                        i_11 = x_176;
+                        while (true) {
+                          const int x_181 = i_11;
+                          const int x_183 = asint(x_10[2].x);
+                          if ((x_181 < x_183)) {
+                          } else {
+                            break;
+                          }
+                          const int x_187 = asint(x_10[1].x);
+                          i_12 = x_187;
+                          while (true) {
+                            const int x_192 = i_12;
+                            const uint scalar_offset_11 = ((16u * uint(0))) / 4;
+                            const int x_194 = asint(x_10[scalar_offset_11 / 4][scalar_offset_11 % 4]);
+                            if ((x_192 < x_194)) {
+                            } else {
+                              break;
+                            }
+                            const int x_198 = asint(x_10[1].x);
+                            i_13 = x_198;
+                            while (true) {
+                              const int x_203 = i_13;
+                              const uint scalar_offset_12 = ((16u * uint(0))) / 4;
+                              const int x_205 = asint(x_10[scalar_offset_12 / 4][scalar_offset_12 % 4]);
+                              if ((x_203 < x_205)) {
+                              } else {
+                                break;
+                              }
+                              const int x_209 = asint(x_10[1].x);
+                              i_14 = x_209;
+                              while (true) {
+                                const int x_214 = i_14;
+                                const int x_216 = asint(x_10[2].x);
+                                if ((x_214 < x_216)) {
+                                } else {
+                                  break;
+                                }
+                                while (true) {
+                                  x_GLF_global_loop_count = (x_GLF_global_loop_count + 1);
+                                  {
+                                    const int x_225 = x_GLF_global_loop_count;
+                                    const int x_227 = asint(x_10[3].x);
+                                    if ((x_225 < (100 - x_227))) {
+                                    } else {
+                                      break;
+                                    }
+                                  }
+                                }
+                                const uint scalar_offset_13 = ((16u * uint(0))) / 4;
+                                const float x_231 = asfloat(x_7[scalar_offset_13 / 4][scalar_offset_13 % 4]);
+                                f = (f + x_231);
+                                {
+                                  i_14 = (i_14 + 1);
+                                }
+                              }
+                              {
+                                i_13 = (i_13 + 1);
+                              }
+                            }
+                            {
+                              i_12 = (i_12 + 1);
+                            }
+                          }
+                          {
+                            i_11 = (i_11 + 1);
+                          }
+                        }
+                        {
+                          i_10 = (i_10 + 1);
+                        }
+                      }
+                      {
+                        i_9 = (i_9 + 1);
+                      }
+                    }
+                    {
+                      i_8 = (i_8 + 1);
+                    }
+                  }
+                  {
+                    i_7 = (i_7 + 1);
+                  }
+                }
+                {
+                  i_6 = (i_6 + 1);
+                }
+              }
+              {
+                i_5 = (i_5 + 1);
+              }
+            }
+            {
+              i_4 = (i_4 + 1);
+            }
+          }
+          {
+            i_3 = (i_3 + 1);
+          }
+        }
+        {
+          i_2 = (i_2 + 1);
+        }
+      }
+      {
+        i_1 = (i_1 + 1);
+      }
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  const float x_265 = asfloat(x_7[1].x);
+  sum = x_265;
+  const int x_267 = asint(x_10[1].x);
+  r = x_267;
+  {
+    for(; (x_GLF_global_loop_count < 100); r = (r + 1)) {
+      x_GLF_global_loop_count = (x_GLF_global_loop_count + 1);
+      sum = (sum + f);
+    }
+  }
+  const float x_282 = sum;
+  const float x_284 = asfloat(x_7[2].x);
+  if ((x_282 == x_284)) {
+    const uint scalar_offset_14 = ((16u * uint(0))) / 4;
+    const int x_290 = asint(x_10[scalar_offset_14 / 4][scalar_offset_14 % 4]);
+    const int x_293 = asint(x_10[1].x);
+    const int x_296 = asint(x_10[1].x);
+    const uint scalar_offset_15 = ((16u * uint(0))) / 4;
+    const int x_299 = asint(x_10[scalar_offset_15 / 4][scalar_offset_15 % 4]);
+    x_GLF_color = float4(float(x_290), float(x_293), float(x_296), float(x_299));
+  } else {
+    const int x_303 = asint(x_10[1].x);
+    const float x_304 = float(x_303);
+    x_GLF_color = float4(x_304, x_304, x_304, x_304);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nested-loops-global-loop-counter-do-while-accumulate-float/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-nested-loops-global-loop-counter-do-while-accumulate-float/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..a589c96
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nested-loops-global-loop-counter-do-while-accumulate-float/0-opt.spvasm.expected.msl
@@ -0,0 +1,322 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[4];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, constant buf1& x_10, thread int* const tint_symbol_4, thread float4* const tint_symbol_5) {
+  float f = 0.0f;
+  int i = 0;
+  int i_1 = 0;
+  int i_2 = 0;
+  int i_3 = 0;
+  int i_4 = 0;
+  int i_5 = 0;
+  int i_6 = 0;
+  int i_7 = 0;
+  int i_8 = 0;
+  int i_9 = 0;
+  int i_10 = 0;
+  int i_11 = 0;
+  int i_12 = 0;
+  int i_13 = 0;
+  int i_14 = 0;
+  float sum = 0.0f;
+  int r = 0;
+  *(tint_symbol_4) = 0;
+  float const x_53 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  f = x_53;
+  int const x_55 = x_10.x_GLF_uniform_int_values.arr[1].el;
+  i = x_55;
+  while (true) {
+    int const x_60 = i;
+    int const x_62 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_60 < x_62)) {
+    } else {
+      break;
+    }
+    int const x_66 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    i_1 = x_66;
+    while (true) {
+      int const x_71 = i_1;
+      int const x_73 = x_10.x_GLF_uniform_int_values.arr[0].el;
+      if ((x_71 < x_73)) {
+      } else {
+        break;
+      }
+      int const x_77 = x_10.x_GLF_uniform_int_values.arr[1].el;
+      i_2 = x_77;
+      while (true) {
+        int const x_82 = i_2;
+        int const x_84 = x_10.x_GLF_uniform_int_values.arr[0].el;
+        if ((x_82 < x_84)) {
+        } else {
+          break;
+        }
+        int const x_88 = x_10.x_GLF_uniform_int_values.arr[1].el;
+        i_3 = x_88;
+        while (true) {
+          int const x_93 = i_3;
+          int const x_95 = x_10.x_GLF_uniform_int_values.arr[0].el;
+          if ((x_93 < x_95)) {
+          } else {
+            break;
+          }
+          int const x_99 = x_10.x_GLF_uniform_int_values.arr[1].el;
+          i_4 = x_99;
+          while (true) {
+            int const x_104 = i_4;
+            int const x_106 = x_10.x_GLF_uniform_int_values.arr[0].el;
+            if ((x_104 < x_106)) {
+            } else {
+              break;
+            }
+            int const x_110 = x_10.x_GLF_uniform_int_values.arr[1].el;
+            i_5 = x_110;
+            while (true) {
+              int const x_115 = i_5;
+              int const x_117 = x_10.x_GLF_uniform_int_values.arr[0].el;
+              if ((x_115 < x_117)) {
+              } else {
+                break;
+              }
+              int const x_121 = x_10.x_GLF_uniform_int_values.arr[1].el;
+              i_6 = x_121;
+              while (true) {
+                int const x_126 = i_6;
+                int const x_128 = x_10.x_GLF_uniform_int_values.arr[0].el;
+                if ((x_126 < x_128)) {
+                } else {
+                  break;
+                }
+                int const x_132 = x_10.x_GLF_uniform_int_values.arr[1].el;
+                i_7 = x_132;
+                while (true) {
+                  int const x_137 = i_7;
+                  int const x_139 = x_10.x_GLF_uniform_int_values.arr[0].el;
+                  if ((x_137 < x_139)) {
+                  } else {
+                    break;
+                  }
+                  int const x_143 = x_10.x_GLF_uniform_int_values.arr[1].el;
+                  i_8 = x_143;
+                  while (true) {
+                    int const x_148 = i_8;
+                    int const x_150 = x_10.x_GLF_uniform_int_values.arr[0].el;
+                    if ((x_148 < x_150)) {
+                    } else {
+                      break;
+                    }
+                    int const x_154 = x_10.x_GLF_uniform_int_values.arr[1].el;
+                    i_9 = x_154;
+                    while (true) {
+                      int const x_159 = i_9;
+                      int const x_161 = x_10.x_GLF_uniform_int_values.arr[0].el;
+                      if ((x_159 < x_161)) {
+                      } else {
+                        break;
+                      }
+                      int const x_165 = x_10.x_GLF_uniform_int_values.arr[1].el;
+                      i_10 = x_165;
+                      while (true) {
+                        int const x_170 = i_10;
+                        int const x_172 = x_10.x_GLF_uniform_int_values.arr[0].el;
+                        if ((x_170 < x_172)) {
+                        } else {
+                          break;
+                        }
+                        int const x_176 = x_10.x_GLF_uniform_int_values.arr[1].el;
+                        i_11 = x_176;
+                        while (true) {
+                          int const x_181 = i_11;
+                          int const x_183 = x_10.x_GLF_uniform_int_values.arr[2].el;
+                          if ((x_181 < x_183)) {
+                          } else {
+                            break;
+                          }
+                          int const x_187 = x_10.x_GLF_uniform_int_values.arr[1].el;
+                          i_12 = x_187;
+                          while (true) {
+                            int const x_192 = i_12;
+                            int const x_194 = x_10.x_GLF_uniform_int_values.arr[0].el;
+                            if ((x_192 < x_194)) {
+                            } else {
+                              break;
+                            }
+                            int const x_198 = x_10.x_GLF_uniform_int_values.arr[1].el;
+                            i_13 = x_198;
+                            while (true) {
+                              int const x_203 = i_13;
+                              int const x_205 = x_10.x_GLF_uniform_int_values.arr[0].el;
+                              if ((x_203 < x_205)) {
+                              } else {
+                                break;
+                              }
+                              int const x_209 = x_10.x_GLF_uniform_int_values.arr[1].el;
+                              i_14 = x_209;
+                              while (true) {
+                                int const x_214 = i_14;
+                                int const x_216 = x_10.x_GLF_uniform_int_values.arr[2].el;
+                                if ((x_214 < x_216)) {
+                                } else {
+                                  break;
+                                }
+                                while (true) {
+                                  int const x_223 = *(tint_symbol_4);
+                                  *(tint_symbol_4) = (x_223 + 1);
+                                  {
+                                    int const x_225 = *(tint_symbol_4);
+                                    int const x_227 = x_10.x_GLF_uniform_int_values.arr[3].el;
+                                    if ((x_225 < (100 - x_227))) {
+                                    } else {
+                                      break;
+                                    }
+                                  }
+                                }
+                                float const x_231 = x_7.x_GLF_uniform_float_values.arr[0].el;
+                                float const x_232 = f;
+                                f = (x_232 + x_231);
+                                {
+                                  int const x_234 = i_14;
+                                  i_14 = (x_234 + 1);
+                                }
+                              }
+                              {
+                                int const x_236 = i_13;
+                                i_13 = (x_236 + 1);
+                              }
+                            }
+                            {
+                              int const x_238 = i_12;
+                              i_12 = (x_238 + 1);
+                            }
+                          }
+                          {
+                            int const x_240 = i_11;
+                            i_11 = (x_240 + 1);
+                          }
+                        }
+                        {
+                          int const x_242 = i_10;
+                          i_10 = (x_242 + 1);
+                        }
+                      }
+                      {
+                        int const x_244 = i_9;
+                        i_9 = (x_244 + 1);
+                      }
+                    }
+                    {
+                      int const x_246 = i_8;
+                      i_8 = (x_246 + 1);
+                    }
+                  }
+                  {
+                    int const x_248 = i_7;
+                    i_7 = (x_248 + 1);
+                  }
+                }
+                {
+                  int const x_250 = i_6;
+                  i_6 = (x_250 + 1);
+                }
+              }
+              {
+                int const x_252 = i_5;
+                i_5 = (x_252 + 1);
+              }
+            }
+            {
+              int const x_254 = i_4;
+              i_4 = (x_254 + 1);
+            }
+          }
+          {
+            int const x_256 = i_3;
+            i_3 = (x_256 + 1);
+          }
+        }
+        {
+          int const x_258 = i_2;
+          i_2 = (x_258 + 1);
+        }
+      }
+      {
+        int const x_260 = i_1;
+        i_1 = (x_260 + 1);
+      }
+    }
+    {
+      int const x_262 = i;
+      i = (x_262 + 1);
+    }
+  }
+  float const x_265 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  sum = x_265;
+  int const x_267 = x_10.x_GLF_uniform_int_values.arr[1].el;
+  r = x_267;
+  while (true) {
+    int const x_272 = *(tint_symbol_4);
+    if ((x_272 < 100)) {
+    } else {
+      break;
+    }
+    int const x_275 = *(tint_symbol_4);
+    *(tint_symbol_4) = (x_275 + 1);
+    float const x_277 = f;
+    float const x_278 = sum;
+    sum = (x_278 + x_277);
+    {
+      int const x_280 = r;
+      r = (x_280 + 1);
+    }
+  }
+  float const x_282 = sum;
+  float const x_284 = x_7.x_GLF_uniform_float_values.arr[2].el;
+  if ((x_282 == x_284)) {
+    int const x_290 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    int const x_293 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_296 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_299 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_5) = float4(float(x_290), float(x_293), float(x_296), float(x_299));
+  } else {
+    int const x_303 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    float const x_304 = float(x_303);
+    *(tint_symbol_5) = float4(x_304, x_304, x_304, x_304);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]], constant buf1& x_10 [[buffer(1)]]) {
+  thread int tint_symbol_6 = 0;
+  thread float4 tint_symbol_7 = 0.0f;
+  main_1(x_7, x_10, &(tint_symbol_6), &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nested-loops-global-loop-counter-do-while-accumulate-float/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-nested-loops-global-loop-counter-do-while-accumulate-float/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..8003194
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nested-loops-global-loop-counter-do-while-accumulate-float/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,623 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 358
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_global_loop_count "x_GLF_global_loop_count"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_7 "x_7"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %i "i"
+               OpName %i_1 "i_1"
+               OpName %i_2 "i_2"
+               OpName %i_3 "i_3"
+               OpName %i_4 "i_4"
+               OpName %i_5 "i_5"
+               OpName %i_6 "i_6"
+               OpName %i_7 "i_7"
+               OpName %i_8 "i_8"
+               OpName %i_9 "i_9"
+               OpName %i_10 "i_10"
+               OpName %i_11 "i_11"
+               OpName %i_12 "i_12"
+               OpName %i_13 "i_13"
+               OpName %i_14 "i_14"
+               OpName %sum "sum"
+               OpName %r "r"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+          %4 = OpConstantNull %int
+%x_GLF_global_loop_count = OpVariable %_ptr_Private_int Private %4
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf0 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf1 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_10 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %20 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %20
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %20
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %29 = OpConstantNull %float
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+    %int_100 = OpConstant %int 100
+   %main_out = OpTypeStruct %v4float
+        %346 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %23
+         %26 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %29
+          %i = OpVariable %_ptr_Function_int Function %4
+        %i_1 = OpVariable %_ptr_Function_int Function %4
+        %i_2 = OpVariable %_ptr_Function_int Function %4
+        %i_3 = OpVariable %_ptr_Function_int Function %4
+        %i_4 = OpVariable %_ptr_Function_int Function %4
+        %i_5 = OpVariable %_ptr_Function_int Function %4
+        %i_6 = OpVariable %_ptr_Function_int Function %4
+        %i_7 = OpVariable %_ptr_Function_int Function %4
+        %i_8 = OpVariable %_ptr_Function_int Function %4
+        %i_9 = OpVariable %_ptr_Function_int Function %4
+       %i_10 = OpVariable %_ptr_Function_int Function %4
+       %i_11 = OpVariable %_ptr_Function_int Function %4
+       %i_12 = OpVariable %_ptr_Function_int Function %4
+       %i_13 = OpVariable %_ptr_Function_int Function %4
+       %i_14 = OpVariable %_ptr_Function_int Function %4
+        %sum = OpVariable %_ptr_Function_float Function %29
+          %r = OpVariable %_ptr_Function_int Function %4
+               OpStore %x_GLF_global_loop_count %int_0
+         %52 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %53 = OpLoad %float %52
+               OpStore %f %53
+         %55 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %56 = OpLoad %int %55
+               OpStore %i %56
+               OpBranch %57
+         %57 = OpLabel
+               OpLoopMerge %58 %59 None
+               OpBranch %60
+         %60 = OpLabel
+         %61 = OpLoad %int %i
+         %62 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %63 = OpLoad %int %62
+         %64 = OpSLessThan %bool %61 %63
+               OpSelectionMerge %66 None
+               OpBranchConditional %64 %67 %68
+         %67 = OpLabel
+               OpBranch %66
+         %68 = OpLabel
+               OpBranch %58
+         %66 = OpLabel
+         %69 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %70 = OpLoad %int %69
+               OpStore %i_1 %70
+               OpBranch %71
+         %71 = OpLabel
+               OpLoopMerge %72 %73 None
+               OpBranch %74
+         %74 = OpLabel
+         %75 = OpLoad %int %i_1
+         %76 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %77 = OpLoad %int %76
+         %78 = OpSLessThan %bool %75 %77
+               OpSelectionMerge %79 None
+               OpBranchConditional %78 %80 %81
+         %80 = OpLabel
+               OpBranch %79
+         %81 = OpLabel
+               OpBranch %72
+         %79 = OpLabel
+         %82 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %83 = OpLoad %int %82
+               OpStore %i_2 %83
+               OpBranch %84
+         %84 = OpLabel
+               OpLoopMerge %85 %86 None
+               OpBranch %87
+         %87 = OpLabel
+         %88 = OpLoad %int %i_2
+         %89 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %90 = OpLoad %int %89
+         %91 = OpSLessThan %bool %88 %90
+               OpSelectionMerge %92 None
+               OpBranchConditional %91 %93 %94
+         %93 = OpLabel
+               OpBranch %92
+         %94 = OpLabel
+               OpBranch %85
+         %92 = OpLabel
+         %95 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %96 = OpLoad %int %95
+               OpStore %i_3 %96
+               OpBranch %97
+         %97 = OpLabel
+               OpLoopMerge %98 %99 None
+               OpBranch %100
+        %100 = OpLabel
+        %101 = OpLoad %int %i_3
+        %102 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %103 = OpLoad %int %102
+        %104 = OpSLessThan %bool %101 %103
+               OpSelectionMerge %105 None
+               OpBranchConditional %104 %106 %107
+        %106 = OpLabel
+               OpBranch %105
+        %107 = OpLabel
+               OpBranch %98
+        %105 = OpLabel
+        %108 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %109 = OpLoad %int %108
+               OpStore %i_4 %109
+               OpBranch %110
+        %110 = OpLabel
+               OpLoopMerge %111 %112 None
+               OpBranch %113
+        %113 = OpLabel
+        %114 = OpLoad %int %i_4
+        %115 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %116 = OpLoad %int %115
+        %117 = OpSLessThan %bool %114 %116
+               OpSelectionMerge %118 None
+               OpBranchConditional %117 %119 %120
+        %119 = OpLabel
+               OpBranch %118
+        %120 = OpLabel
+               OpBranch %111
+        %118 = OpLabel
+        %121 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %122 = OpLoad %int %121
+               OpStore %i_5 %122
+               OpBranch %123
+        %123 = OpLabel
+               OpLoopMerge %124 %125 None
+               OpBranch %126
+        %126 = OpLabel
+        %127 = OpLoad %int %i_5
+        %128 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %129 = OpLoad %int %128
+        %130 = OpSLessThan %bool %127 %129
+               OpSelectionMerge %131 None
+               OpBranchConditional %130 %132 %133
+        %132 = OpLabel
+               OpBranch %131
+        %133 = OpLabel
+               OpBranch %124
+        %131 = OpLabel
+        %134 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %135 = OpLoad %int %134
+               OpStore %i_6 %135
+               OpBranch %136
+        %136 = OpLabel
+               OpLoopMerge %137 %138 None
+               OpBranch %139
+        %139 = OpLabel
+        %140 = OpLoad %int %i_6
+        %141 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %142 = OpLoad %int %141
+        %143 = OpSLessThan %bool %140 %142
+               OpSelectionMerge %144 None
+               OpBranchConditional %143 %145 %146
+        %145 = OpLabel
+               OpBranch %144
+        %146 = OpLabel
+               OpBranch %137
+        %144 = OpLabel
+        %147 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %148 = OpLoad %int %147
+               OpStore %i_7 %148
+               OpBranch %149
+        %149 = OpLabel
+               OpLoopMerge %150 %151 None
+               OpBranch %152
+        %152 = OpLabel
+        %153 = OpLoad %int %i_7
+        %154 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %155 = OpLoad %int %154
+        %156 = OpSLessThan %bool %153 %155
+               OpSelectionMerge %157 None
+               OpBranchConditional %156 %158 %159
+        %158 = OpLabel
+               OpBranch %157
+        %159 = OpLabel
+               OpBranch %150
+        %157 = OpLabel
+        %160 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %161 = OpLoad %int %160
+               OpStore %i_8 %161
+               OpBranch %162
+        %162 = OpLabel
+               OpLoopMerge %163 %164 None
+               OpBranch %165
+        %165 = OpLabel
+        %166 = OpLoad %int %i_8
+        %167 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %168 = OpLoad %int %167
+        %169 = OpSLessThan %bool %166 %168
+               OpSelectionMerge %170 None
+               OpBranchConditional %169 %171 %172
+        %171 = OpLabel
+               OpBranch %170
+        %172 = OpLabel
+               OpBranch %163
+        %170 = OpLabel
+        %173 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %174 = OpLoad %int %173
+               OpStore %i_9 %174
+               OpBranch %175
+        %175 = OpLabel
+               OpLoopMerge %176 %177 None
+               OpBranch %178
+        %178 = OpLabel
+        %179 = OpLoad %int %i_9
+        %180 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %181 = OpLoad %int %180
+        %182 = OpSLessThan %bool %179 %181
+               OpSelectionMerge %183 None
+               OpBranchConditional %182 %184 %185
+        %184 = OpLabel
+               OpBranch %183
+        %185 = OpLabel
+               OpBranch %176
+        %183 = OpLabel
+        %186 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %187 = OpLoad %int %186
+               OpStore %i_10 %187
+               OpBranch %188
+        %188 = OpLabel
+               OpLoopMerge %189 %190 None
+               OpBranch %191
+        %191 = OpLabel
+        %192 = OpLoad %int %i_10
+        %193 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %194 = OpLoad %int %193
+        %195 = OpSLessThan %bool %192 %194
+               OpSelectionMerge %196 None
+               OpBranchConditional %195 %197 %198
+        %197 = OpLabel
+               OpBranch %196
+        %198 = OpLabel
+               OpBranch %189
+        %196 = OpLabel
+        %199 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %200 = OpLoad %int %199
+               OpStore %i_11 %200
+               OpBranch %201
+        %201 = OpLabel
+               OpLoopMerge %202 %203 None
+               OpBranch %204
+        %204 = OpLabel
+        %205 = OpLoad %int %i_11
+        %207 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %208 = OpLoad %int %207
+        %209 = OpSLessThan %bool %205 %208
+               OpSelectionMerge %210 None
+               OpBranchConditional %209 %211 %212
+        %211 = OpLabel
+               OpBranch %210
+        %212 = OpLabel
+               OpBranch %202
+        %210 = OpLabel
+        %213 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %214 = OpLoad %int %213
+               OpStore %i_12 %214
+               OpBranch %215
+        %215 = OpLabel
+               OpLoopMerge %216 %217 None
+               OpBranch %218
+        %218 = OpLabel
+        %219 = OpLoad %int %i_12
+        %220 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %221 = OpLoad %int %220
+        %222 = OpSLessThan %bool %219 %221
+               OpSelectionMerge %223 None
+               OpBranchConditional %222 %224 %225
+        %224 = OpLabel
+               OpBranch %223
+        %225 = OpLabel
+               OpBranch %216
+        %223 = OpLabel
+        %226 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %227 = OpLoad %int %226
+               OpStore %i_13 %227
+               OpBranch %228
+        %228 = OpLabel
+               OpLoopMerge %229 %230 None
+               OpBranch %231
+        %231 = OpLabel
+        %232 = OpLoad %int %i_13
+        %233 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %234 = OpLoad %int %233
+        %235 = OpSLessThan %bool %232 %234
+               OpSelectionMerge %236 None
+               OpBranchConditional %235 %237 %238
+        %237 = OpLabel
+               OpBranch %236
+        %238 = OpLabel
+               OpBranch %229
+        %236 = OpLabel
+        %239 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %240 = OpLoad %int %239
+               OpStore %i_14 %240
+               OpBranch %241
+        %241 = OpLabel
+               OpLoopMerge %242 %243 None
+               OpBranch %244
+        %244 = OpLabel
+        %245 = OpLoad %int %i_14
+        %246 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %247 = OpLoad %int %246
+        %248 = OpSLessThan %bool %245 %247
+               OpSelectionMerge %249 None
+               OpBranchConditional %248 %250 %251
+        %250 = OpLabel
+               OpBranch %249
+        %251 = OpLabel
+               OpBranch %242
+        %249 = OpLabel
+               OpBranch %252
+        %252 = OpLabel
+               OpLoopMerge %253 %254 None
+               OpBranch %255
+        %255 = OpLabel
+        %256 = OpLoad %int %x_GLF_global_loop_count
+        %257 = OpIAdd %int %256 %int_1
+               OpStore %x_GLF_global_loop_count %257
+               OpBranch %254
+        %254 = OpLabel
+        %258 = OpLoad %int %x_GLF_global_loop_count
+        %260 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+        %261 = OpLoad %int %260
+        %263 = OpISub %int %int_100 %261
+        %264 = OpSLessThan %bool %258 %263
+               OpSelectionMerge %265 None
+               OpBranchConditional %264 %266 %267
+        %266 = OpLabel
+               OpBranch %265
+        %267 = OpLabel
+               OpBranch %253
+        %265 = OpLabel
+               OpBranch %252
+        %253 = OpLabel
+        %268 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+        %269 = OpLoad %float %268
+        %270 = OpLoad %float %f
+        %271 = OpFAdd %float %270 %269
+               OpStore %f %271
+               OpBranch %243
+        %243 = OpLabel
+        %272 = OpLoad %int %i_14
+        %273 = OpIAdd %int %272 %int_1
+               OpStore %i_14 %273
+               OpBranch %241
+        %242 = OpLabel
+               OpBranch %230
+        %230 = OpLabel
+        %274 = OpLoad %int %i_13
+        %275 = OpIAdd %int %274 %int_1
+               OpStore %i_13 %275
+               OpBranch %228
+        %229 = OpLabel
+               OpBranch %217
+        %217 = OpLabel
+        %276 = OpLoad %int %i_12
+        %277 = OpIAdd %int %276 %int_1
+               OpStore %i_12 %277
+               OpBranch %215
+        %216 = OpLabel
+               OpBranch %203
+        %203 = OpLabel
+        %278 = OpLoad %int %i_11
+        %279 = OpIAdd %int %278 %int_1
+               OpStore %i_11 %279
+               OpBranch %201
+        %202 = OpLabel
+               OpBranch %190
+        %190 = OpLabel
+        %280 = OpLoad %int %i_10
+        %281 = OpIAdd %int %280 %int_1
+               OpStore %i_10 %281
+               OpBranch %188
+        %189 = OpLabel
+               OpBranch %177
+        %177 = OpLabel
+        %282 = OpLoad %int %i_9
+        %283 = OpIAdd %int %282 %int_1
+               OpStore %i_9 %283
+               OpBranch %175
+        %176 = OpLabel
+               OpBranch %164
+        %164 = OpLabel
+        %284 = OpLoad %int %i_8
+        %285 = OpIAdd %int %284 %int_1
+               OpStore %i_8 %285
+               OpBranch %162
+        %163 = OpLabel
+               OpBranch %151
+        %151 = OpLabel
+        %286 = OpLoad %int %i_7
+        %287 = OpIAdd %int %286 %int_1
+               OpStore %i_7 %287
+               OpBranch %149
+        %150 = OpLabel
+               OpBranch %138
+        %138 = OpLabel
+        %288 = OpLoad %int %i_6
+        %289 = OpIAdd %int %288 %int_1
+               OpStore %i_6 %289
+               OpBranch %136
+        %137 = OpLabel
+               OpBranch %125
+        %125 = OpLabel
+        %290 = OpLoad %int %i_5
+        %291 = OpIAdd %int %290 %int_1
+               OpStore %i_5 %291
+               OpBranch %123
+        %124 = OpLabel
+               OpBranch %112
+        %112 = OpLabel
+        %292 = OpLoad %int %i_4
+        %293 = OpIAdd %int %292 %int_1
+               OpStore %i_4 %293
+               OpBranch %110
+        %111 = OpLabel
+               OpBranch %99
+         %99 = OpLabel
+        %294 = OpLoad %int %i_3
+        %295 = OpIAdd %int %294 %int_1
+               OpStore %i_3 %295
+               OpBranch %97
+         %98 = OpLabel
+               OpBranch %86
+         %86 = OpLabel
+        %296 = OpLoad %int %i_2
+        %297 = OpIAdd %int %296 %int_1
+               OpStore %i_2 %297
+               OpBranch %84
+         %85 = OpLabel
+               OpBranch %73
+         %73 = OpLabel
+        %298 = OpLoad %int %i_1
+        %299 = OpIAdd %int %298 %int_1
+               OpStore %i_1 %299
+               OpBranch %71
+         %72 = OpLabel
+               OpBranch %59
+         %59 = OpLabel
+        %300 = OpLoad %int %i
+        %301 = OpIAdd %int %300 %int_1
+               OpStore %i %301
+               OpBranch %57
+         %58 = OpLabel
+        %302 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+        %303 = OpLoad %float %302
+               OpStore %sum %303
+        %304 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %305 = OpLoad %int %304
+               OpStore %r %305
+               OpBranch %306
+        %306 = OpLabel
+               OpLoopMerge %307 %308 None
+               OpBranch %309
+        %309 = OpLabel
+        %310 = OpLoad %int %x_GLF_global_loop_count
+        %311 = OpSLessThan %bool %310 %int_100
+               OpSelectionMerge %312 None
+               OpBranchConditional %311 %313 %314
+        %313 = OpLabel
+               OpBranch %312
+        %314 = OpLabel
+               OpBranch %307
+        %312 = OpLabel
+        %315 = OpLoad %int %x_GLF_global_loop_count
+        %316 = OpIAdd %int %315 %int_1
+               OpStore %x_GLF_global_loop_count %316
+        %317 = OpLoad %float %f
+        %318 = OpLoad %float %sum
+        %319 = OpFAdd %float %318 %317
+               OpStore %sum %319
+               OpBranch %308
+        %308 = OpLabel
+        %320 = OpLoad %int %r
+        %321 = OpIAdd %int %320 %int_1
+               OpStore %r %321
+               OpBranch %306
+        %307 = OpLabel
+        %322 = OpLoad %float %sum
+        %323 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_2
+        %324 = OpLoad %float %323
+        %325 = OpFOrdEqual %bool %322 %324
+               OpSelectionMerge %326 None
+               OpBranchConditional %325 %327 %328
+        %327 = OpLabel
+        %329 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %330 = OpLoad %int %329
+        %331 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %332 = OpLoad %int %331
+        %333 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %334 = OpLoad %int %333
+        %335 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %336 = OpLoad %int %335
+        %337 = OpConvertSToF %float %330
+        %338 = OpConvertSToF %float %332
+        %339 = OpConvertSToF %float %334
+        %340 = OpConvertSToF %float %336
+        %341 = OpCompositeConstruct %v4float %337 %338 %339 %340
+               OpStore %x_GLF_color %341
+               OpBranch %326
+        %328 = OpLabel
+        %342 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %343 = OpLoad %int %342
+        %344 = OpConvertSToF %float %343
+        %345 = OpCompositeConstruct %v4float %344 %344 %344 %344
+               OpStore %x_GLF_color %345
+               OpBranch %326
+        %326 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %346
+%tint_symbol = OpFunctionParameter %main_out
+        %350 = OpLabel
+        %351 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %351
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %23
+        %353 = OpLabel
+        %354 = OpFunctionCall %void %main_1
+        %356 = OpLoad %v4float %x_GLF_color
+        %357 = OpCompositeConstruct %main_out %356
+        %355 = OpFunctionCall %void %tint_symbol_2 %357
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 254[%254] is not post dominated by the back-edge block 265[%265]
+  %265 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nested-loops-global-loop-counter-do-while-accumulate-float/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-nested-loops-global-loop-counter-do-while-accumulate-float/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..ed88017
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nested-loops-global-loop-counter-do-while-accumulate-float/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,332 @@
+type Arr = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> x_GLF_global_loop_count : i32;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  var i : i32;
+  var i_1 : i32;
+  var i_2 : i32;
+  var i_3 : i32;
+  var i_4 : i32;
+  var i_5 : i32;
+  var i_6 : i32;
+  var i_7 : i32;
+  var i_8 : i32;
+  var i_9 : i32;
+  var i_10 : i32;
+  var i_11 : i32;
+  var i_12 : i32;
+  var i_13 : i32;
+  var i_14 : i32;
+  var sum : f32;
+  var r : i32;
+  x_GLF_global_loop_count = 0;
+  let x_53 : f32 = x_7.x_GLF_uniform_float_values[1];
+  f = x_53;
+  let x_55 : i32 = x_10.x_GLF_uniform_int_values[1];
+  i = x_55;
+  loop {
+    let x_60 : i32 = i;
+    let x_62 : i32 = x_10.x_GLF_uniform_int_values[0];
+    if ((x_60 < x_62)) {
+    } else {
+      break;
+    }
+    let x_66 : i32 = x_10.x_GLF_uniform_int_values[1];
+    i_1 = x_66;
+    loop {
+      let x_71 : i32 = i_1;
+      let x_73 : i32 = x_10.x_GLF_uniform_int_values[0];
+      if ((x_71 < x_73)) {
+      } else {
+        break;
+      }
+      let x_77 : i32 = x_10.x_GLF_uniform_int_values[1];
+      i_2 = x_77;
+      loop {
+        let x_82 : i32 = i_2;
+        let x_84 : i32 = x_10.x_GLF_uniform_int_values[0];
+        if ((x_82 < x_84)) {
+        } else {
+          break;
+        }
+        let x_88 : i32 = x_10.x_GLF_uniform_int_values[1];
+        i_3 = x_88;
+        loop {
+          let x_93 : i32 = i_3;
+          let x_95 : i32 = x_10.x_GLF_uniform_int_values[0];
+          if ((x_93 < x_95)) {
+          } else {
+            break;
+          }
+          let x_99 : i32 = x_10.x_GLF_uniform_int_values[1];
+          i_4 = x_99;
+          loop {
+            let x_104 : i32 = i_4;
+            let x_106 : i32 = x_10.x_GLF_uniform_int_values[0];
+            if ((x_104 < x_106)) {
+            } else {
+              break;
+            }
+            let x_110 : i32 = x_10.x_GLF_uniform_int_values[1];
+            i_5 = x_110;
+            loop {
+              let x_115 : i32 = i_5;
+              let x_117 : i32 = x_10.x_GLF_uniform_int_values[0];
+              if ((x_115 < x_117)) {
+              } else {
+                break;
+              }
+              let x_121 : i32 = x_10.x_GLF_uniform_int_values[1];
+              i_6 = x_121;
+              loop {
+                let x_126 : i32 = i_6;
+                let x_128 : i32 = x_10.x_GLF_uniform_int_values[0];
+                if ((x_126 < x_128)) {
+                } else {
+                  break;
+                }
+                let x_132 : i32 = x_10.x_GLF_uniform_int_values[1];
+                i_7 = x_132;
+                loop {
+                  let x_137 : i32 = i_7;
+                  let x_139 : i32 = x_10.x_GLF_uniform_int_values[0];
+                  if ((x_137 < x_139)) {
+                  } else {
+                    break;
+                  }
+                  let x_143 : i32 = x_10.x_GLF_uniform_int_values[1];
+                  i_8 = x_143;
+                  loop {
+                    let x_148 : i32 = i_8;
+                    let x_150 : i32 = x_10.x_GLF_uniform_int_values[0];
+                    if ((x_148 < x_150)) {
+                    } else {
+                      break;
+                    }
+                    let x_154 : i32 = x_10.x_GLF_uniform_int_values[1];
+                    i_9 = x_154;
+                    loop {
+                      let x_159 : i32 = i_9;
+                      let x_161 : i32 = x_10.x_GLF_uniform_int_values[0];
+                      if ((x_159 < x_161)) {
+                      } else {
+                        break;
+                      }
+                      let x_165 : i32 = x_10.x_GLF_uniform_int_values[1];
+                      i_10 = x_165;
+                      loop {
+                        let x_170 : i32 = i_10;
+                        let x_172 : i32 = x_10.x_GLF_uniform_int_values[0];
+                        if ((x_170 < x_172)) {
+                        } else {
+                          break;
+                        }
+                        let x_176 : i32 = x_10.x_GLF_uniform_int_values[1];
+                        i_11 = x_176;
+                        loop {
+                          let x_181 : i32 = i_11;
+                          let x_183 : i32 = x_10.x_GLF_uniform_int_values[2];
+                          if ((x_181 < x_183)) {
+                          } else {
+                            break;
+                          }
+                          let x_187 : i32 = x_10.x_GLF_uniform_int_values[1];
+                          i_12 = x_187;
+                          loop {
+                            let x_192 : i32 = i_12;
+                            let x_194 : i32 = x_10.x_GLF_uniform_int_values[0];
+                            if ((x_192 < x_194)) {
+                            } else {
+                              break;
+                            }
+                            let x_198 : i32 = x_10.x_GLF_uniform_int_values[1];
+                            i_13 = x_198;
+                            loop {
+                              let x_203 : i32 = i_13;
+                              let x_205 : i32 = x_10.x_GLF_uniform_int_values[0];
+                              if ((x_203 < x_205)) {
+                              } else {
+                                break;
+                              }
+                              let x_209 : i32 = x_10.x_GLF_uniform_int_values[1];
+                              i_14 = x_209;
+                              loop {
+                                let x_214 : i32 = i_14;
+                                let x_216 : i32 = x_10.x_GLF_uniform_int_values[2];
+                                if ((x_214 < x_216)) {
+                                } else {
+                                  break;
+                                }
+                                loop {
+                                  let x_223 : i32 = x_GLF_global_loop_count;
+                                  x_GLF_global_loop_count = (x_223 + 1);
+
+                                  continuing {
+                                    let x_225 : i32 = x_GLF_global_loop_count;
+                                    let x_227 : i32 = x_10.x_GLF_uniform_int_values[3];
+                                    if ((x_225 < (100 - x_227))) {
+                                    } else {
+                                      break;
+                                    }
+                                  }
+                                }
+                                let x_231 : f32 = x_7.x_GLF_uniform_float_values[0];
+                                let x_232 : f32 = f;
+                                f = (x_232 + x_231);
+
+                                continuing {
+                                  let x_234 : i32 = i_14;
+                                  i_14 = (x_234 + 1);
+                                }
+                              }
+
+                              continuing {
+                                let x_236 : i32 = i_13;
+                                i_13 = (x_236 + 1);
+                              }
+                            }
+
+                            continuing {
+                              let x_238 : i32 = i_12;
+                              i_12 = (x_238 + 1);
+                            }
+                          }
+
+                          continuing {
+                            let x_240 : i32 = i_11;
+                            i_11 = (x_240 + 1);
+                          }
+                        }
+
+                        continuing {
+                          let x_242 : i32 = i_10;
+                          i_10 = (x_242 + 1);
+                        }
+                      }
+
+                      continuing {
+                        let x_244 : i32 = i_9;
+                        i_9 = (x_244 + 1);
+                      }
+                    }
+
+                    continuing {
+                      let x_246 : i32 = i_8;
+                      i_8 = (x_246 + 1);
+                    }
+                  }
+
+                  continuing {
+                    let x_248 : i32 = i_7;
+                    i_7 = (x_248 + 1);
+                  }
+                }
+
+                continuing {
+                  let x_250 : i32 = i_6;
+                  i_6 = (x_250 + 1);
+                }
+              }
+
+              continuing {
+                let x_252 : i32 = i_5;
+                i_5 = (x_252 + 1);
+              }
+            }
+
+            continuing {
+              let x_254 : i32 = i_4;
+              i_4 = (x_254 + 1);
+            }
+          }
+
+          continuing {
+            let x_256 : i32 = i_3;
+            i_3 = (x_256 + 1);
+          }
+        }
+
+        continuing {
+          let x_258 : i32 = i_2;
+          i_2 = (x_258 + 1);
+        }
+      }
+
+      continuing {
+        let x_260 : i32 = i_1;
+        i_1 = (x_260 + 1);
+      }
+    }
+
+    continuing {
+      let x_262 : i32 = i;
+      i = (x_262 + 1);
+    }
+  }
+  let x_265 : f32 = x_7.x_GLF_uniform_float_values[1];
+  sum = x_265;
+  let x_267 : i32 = x_10.x_GLF_uniform_int_values[1];
+  r = x_267;
+  loop {
+    let x_272 : i32 = x_GLF_global_loop_count;
+    if ((x_272 < 100)) {
+    } else {
+      break;
+    }
+    let x_275 : i32 = x_GLF_global_loop_count;
+    x_GLF_global_loop_count = (x_275 + 1);
+    let x_277 : f32 = f;
+    let x_278 : f32 = sum;
+    sum = (x_278 + x_277);
+
+    continuing {
+      let x_280 : i32 = r;
+      r = (x_280 + 1);
+    }
+  }
+  let x_282 : f32 = sum;
+  let x_284 : f32 = x_7.x_GLF_uniform_float_values[2];
+  if ((x_282 == x_284)) {
+    let x_290 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_293 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_296 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_299 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_290), f32(x_293), f32(x_296), f32(x_299));
+  } else {
+    let x_303 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_304 : f32 = f32(x_303);
+    x_GLF_color = vec4<f32>(x_304, x_304, x_304, x_304);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nested-loops-global-loop-counter-do-while-accumulate-float/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-nested-loops-global-loop-counter-do-while-accumulate-float/0-opt.wgsl
new file mode 100644
index 0000000..ed88017
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nested-loops-global-loop-counter-do-while-accumulate-float/0-opt.wgsl
@@ -0,0 +1,332 @@
+type Arr = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> x_GLF_global_loop_count : i32;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  var i : i32;
+  var i_1 : i32;
+  var i_2 : i32;
+  var i_3 : i32;
+  var i_4 : i32;
+  var i_5 : i32;
+  var i_6 : i32;
+  var i_7 : i32;
+  var i_8 : i32;
+  var i_9 : i32;
+  var i_10 : i32;
+  var i_11 : i32;
+  var i_12 : i32;
+  var i_13 : i32;
+  var i_14 : i32;
+  var sum : f32;
+  var r : i32;
+  x_GLF_global_loop_count = 0;
+  let x_53 : f32 = x_7.x_GLF_uniform_float_values[1];
+  f = x_53;
+  let x_55 : i32 = x_10.x_GLF_uniform_int_values[1];
+  i = x_55;
+  loop {
+    let x_60 : i32 = i;
+    let x_62 : i32 = x_10.x_GLF_uniform_int_values[0];
+    if ((x_60 < x_62)) {
+    } else {
+      break;
+    }
+    let x_66 : i32 = x_10.x_GLF_uniform_int_values[1];
+    i_1 = x_66;
+    loop {
+      let x_71 : i32 = i_1;
+      let x_73 : i32 = x_10.x_GLF_uniform_int_values[0];
+      if ((x_71 < x_73)) {
+      } else {
+        break;
+      }
+      let x_77 : i32 = x_10.x_GLF_uniform_int_values[1];
+      i_2 = x_77;
+      loop {
+        let x_82 : i32 = i_2;
+        let x_84 : i32 = x_10.x_GLF_uniform_int_values[0];
+        if ((x_82 < x_84)) {
+        } else {
+          break;
+        }
+        let x_88 : i32 = x_10.x_GLF_uniform_int_values[1];
+        i_3 = x_88;
+        loop {
+          let x_93 : i32 = i_3;
+          let x_95 : i32 = x_10.x_GLF_uniform_int_values[0];
+          if ((x_93 < x_95)) {
+          } else {
+            break;
+          }
+          let x_99 : i32 = x_10.x_GLF_uniform_int_values[1];
+          i_4 = x_99;
+          loop {
+            let x_104 : i32 = i_4;
+            let x_106 : i32 = x_10.x_GLF_uniform_int_values[0];
+            if ((x_104 < x_106)) {
+            } else {
+              break;
+            }
+            let x_110 : i32 = x_10.x_GLF_uniform_int_values[1];
+            i_5 = x_110;
+            loop {
+              let x_115 : i32 = i_5;
+              let x_117 : i32 = x_10.x_GLF_uniform_int_values[0];
+              if ((x_115 < x_117)) {
+              } else {
+                break;
+              }
+              let x_121 : i32 = x_10.x_GLF_uniform_int_values[1];
+              i_6 = x_121;
+              loop {
+                let x_126 : i32 = i_6;
+                let x_128 : i32 = x_10.x_GLF_uniform_int_values[0];
+                if ((x_126 < x_128)) {
+                } else {
+                  break;
+                }
+                let x_132 : i32 = x_10.x_GLF_uniform_int_values[1];
+                i_7 = x_132;
+                loop {
+                  let x_137 : i32 = i_7;
+                  let x_139 : i32 = x_10.x_GLF_uniform_int_values[0];
+                  if ((x_137 < x_139)) {
+                  } else {
+                    break;
+                  }
+                  let x_143 : i32 = x_10.x_GLF_uniform_int_values[1];
+                  i_8 = x_143;
+                  loop {
+                    let x_148 : i32 = i_8;
+                    let x_150 : i32 = x_10.x_GLF_uniform_int_values[0];
+                    if ((x_148 < x_150)) {
+                    } else {
+                      break;
+                    }
+                    let x_154 : i32 = x_10.x_GLF_uniform_int_values[1];
+                    i_9 = x_154;
+                    loop {
+                      let x_159 : i32 = i_9;
+                      let x_161 : i32 = x_10.x_GLF_uniform_int_values[0];
+                      if ((x_159 < x_161)) {
+                      } else {
+                        break;
+                      }
+                      let x_165 : i32 = x_10.x_GLF_uniform_int_values[1];
+                      i_10 = x_165;
+                      loop {
+                        let x_170 : i32 = i_10;
+                        let x_172 : i32 = x_10.x_GLF_uniform_int_values[0];
+                        if ((x_170 < x_172)) {
+                        } else {
+                          break;
+                        }
+                        let x_176 : i32 = x_10.x_GLF_uniform_int_values[1];
+                        i_11 = x_176;
+                        loop {
+                          let x_181 : i32 = i_11;
+                          let x_183 : i32 = x_10.x_GLF_uniform_int_values[2];
+                          if ((x_181 < x_183)) {
+                          } else {
+                            break;
+                          }
+                          let x_187 : i32 = x_10.x_GLF_uniform_int_values[1];
+                          i_12 = x_187;
+                          loop {
+                            let x_192 : i32 = i_12;
+                            let x_194 : i32 = x_10.x_GLF_uniform_int_values[0];
+                            if ((x_192 < x_194)) {
+                            } else {
+                              break;
+                            }
+                            let x_198 : i32 = x_10.x_GLF_uniform_int_values[1];
+                            i_13 = x_198;
+                            loop {
+                              let x_203 : i32 = i_13;
+                              let x_205 : i32 = x_10.x_GLF_uniform_int_values[0];
+                              if ((x_203 < x_205)) {
+                              } else {
+                                break;
+                              }
+                              let x_209 : i32 = x_10.x_GLF_uniform_int_values[1];
+                              i_14 = x_209;
+                              loop {
+                                let x_214 : i32 = i_14;
+                                let x_216 : i32 = x_10.x_GLF_uniform_int_values[2];
+                                if ((x_214 < x_216)) {
+                                } else {
+                                  break;
+                                }
+                                loop {
+                                  let x_223 : i32 = x_GLF_global_loop_count;
+                                  x_GLF_global_loop_count = (x_223 + 1);
+
+                                  continuing {
+                                    let x_225 : i32 = x_GLF_global_loop_count;
+                                    let x_227 : i32 = x_10.x_GLF_uniform_int_values[3];
+                                    if ((x_225 < (100 - x_227))) {
+                                    } else {
+                                      break;
+                                    }
+                                  }
+                                }
+                                let x_231 : f32 = x_7.x_GLF_uniform_float_values[0];
+                                let x_232 : f32 = f;
+                                f = (x_232 + x_231);
+
+                                continuing {
+                                  let x_234 : i32 = i_14;
+                                  i_14 = (x_234 + 1);
+                                }
+                              }
+
+                              continuing {
+                                let x_236 : i32 = i_13;
+                                i_13 = (x_236 + 1);
+                              }
+                            }
+
+                            continuing {
+                              let x_238 : i32 = i_12;
+                              i_12 = (x_238 + 1);
+                            }
+                          }
+
+                          continuing {
+                            let x_240 : i32 = i_11;
+                            i_11 = (x_240 + 1);
+                          }
+                        }
+
+                        continuing {
+                          let x_242 : i32 = i_10;
+                          i_10 = (x_242 + 1);
+                        }
+                      }
+
+                      continuing {
+                        let x_244 : i32 = i_9;
+                        i_9 = (x_244 + 1);
+                      }
+                    }
+
+                    continuing {
+                      let x_246 : i32 = i_8;
+                      i_8 = (x_246 + 1);
+                    }
+                  }
+
+                  continuing {
+                    let x_248 : i32 = i_7;
+                    i_7 = (x_248 + 1);
+                  }
+                }
+
+                continuing {
+                  let x_250 : i32 = i_6;
+                  i_6 = (x_250 + 1);
+                }
+              }
+
+              continuing {
+                let x_252 : i32 = i_5;
+                i_5 = (x_252 + 1);
+              }
+            }
+
+            continuing {
+              let x_254 : i32 = i_4;
+              i_4 = (x_254 + 1);
+            }
+          }
+
+          continuing {
+            let x_256 : i32 = i_3;
+            i_3 = (x_256 + 1);
+          }
+        }
+
+        continuing {
+          let x_258 : i32 = i_2;
+          i_2 = (x_258 + 1);
+        }
+      }
+
+      continuing {
+        let x_260 : i32 = i_1;
+        i_1 = (x_260 + 1);
+      }
+    }
+
+    continuing {
+      let x_262 : i32 = i;
+      i = (x_262 + 1);
+    }
+  }
+  let x_265 : f32 = x_7.x_GLF_uniform_float_values[1];
+  sum = x_265;
+  let x_267 : i32 = x_10.x_GLF_uniform_int_values[1];
+  r = x_267;
+  loop {
+    let x_272 : i32 = x_GLF_global_loop_count;
+    if ((x_272 < 100)) {
+    } else {
+      break;
+    }
+    let x_275 : i32 = x_GLF_global_loop_count;
+    x_GLF_global_loop_count = (x_275 + 1);
+    let x_277 : f32 = f;
+    let x_278 : f32 = sum;
+    sum = (x_278 + x_277);
+
+    continuing {
+      let x_280 : i32 = r;
+      r = (x_280 + 1);
+    }
+  }
+  let x_282 : f32 = sum;
+  let x_284 : f32 = x_7.x_GLF_uniform_float_values[2];
+  if ((x_282 == x_284)) {
+    let x_290 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_293 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_296 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_299 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_290), f32(x_293), f32(x_296), f32(x_299));
+  } else {
+    let x_303 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_304 : f32 = f32(x_303);
+    x_GLF_color = vec4<f32>(x_304, x_304, x_304, x_304);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nested-loops-global-loop-counter-do-while-accumulate-float/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-nested-loops-global-loop-counter-do-while-accumulate-float/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..fb22331
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nested-loops-global-loop-counter-do-while-accumulate-float/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,294 @@
+static int x_GLF_global_loop_count = 0;
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[3];
+};
+cbuffer cbuffer_x_10 : register(b1, space0) {
+  uint4 x_10[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float f = 0.0f;
+  int i = 0;
+  int i_1 = 0;
+  int i_2 = 0;
+  int i_3 = 0;
+  int i_4 = 0;
+  int i_5 = 0;
+  int i_6 = 0;
+  int i_7 = 0;
+  int i_8 = 0;
+  int i_9 = 0;
+  int i_10 = 0;
+  int i_11 = 0;
+  int i_12 = 0;
+  int i_13 = 0;
+  int i_14 = 0;
+  float sum = 0.0f;
+  int r = 0;
+  x_GLF_global_loop_count = 0;
+  const float x_53 = asfloat(x_7[1].x);
+  f = x_53;
+  const int x_55 = asint(x_10[1].x);
+  i = x_55;
+  while (true) {
+    const int x_60 = i;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_62 = asint(x_10[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_60 < x_62)) {
+    } else {
+      break;
+    }
+    const int x_66 = asint(x_10[1].x);
+    i_1 = x_66;
+    while (true) {
+      const int x_71 = i_1;
+      const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+      const int x_73 = asint(x_10[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+      if ((x_71 < x_73)) {
+      } else {
+        break;
+      }
+      const int x_77 = asint(x_10[1].x);
+      i_2 = x_77;
+      while (true) {
+        const int x_82 = i_2;
+        const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+        const int x_84 = asint(x_10[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+        if ((x_82 < x_84)) {
+        } else {
+          break;
+        }
+        const int x_88 = asint(x_10[1].x);
+        i_3 = x_88;
+        while (true) {
+          const int x_93 = i_3;
+          const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+          const int x_95 = asint(x_10[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+          if ((x_93 < x_95)) {
+          } else {
+            break;
+          }
+          const int x_99 = asint(x_10[1].x);
+          i_4 = x_99;
+          while (true) {
+            const int x_104 = i_4;
+            const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+            const int x_106 = asint(x_10[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+            if ((x_104 < x_106)) {
+            } else {
+              break;
+            }
+            const int x_110 = asint(x_10[1].x);
+            i_5 = x_110;
+            while (true) {
+              const int x_115 = i_5;
+              const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+              const int x_117 = asint(x_10[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+              if ((x_115 < x_117)) {
+              } else {
+                break;
+              }
+              const int x_121 = asint(x_10[1].x);
+              i_6 = x_121;
+              while (true) {
+                const int x_126 = i_6;
+                const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+                const int x_128 = asint(x_10[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+                if ((x_126 < x_128)) {
+                } else {
+                  break;
+                }
+                const int x_132 = asint(x_10[1].x);
+                i_7 = x_132;
+                while (true) {
+                  const int x_137 = i_7;
+                  const uint scalar_offset_7 = ((16u * uint(0))) / 4;
+                  const int x_139 = asint(x_10[scalar_offset_7 / 4][scalar_offset_7 % 4]);
+                  if ((x_137 < x_139)) {
+                  } else {
+                    break;
+                  }
+                  const int x_143 = asint(x_10[1].x);
+                  i_8 = x_143;
+                  while (true) {
+                    const int x_148 = i_8;
+                    const uint scalar_offset_8 = ((16u * uint(0))) / 4;
+                    const int x_150 = asint(x_10[scalar_offset_8 / 4][scalar_offset_8 % 4]);
+                    if ((x_148 < x_150)) {
+                    } else {
+                      break;
+                    }
+                    const int x_154 = asint(x_10[1].x);
+                    i_9 = x_154;
+                    while (true) {
+                      const int x_159 = i_9;
+                      const uint scalar_offset_9 = ((16u * uint(0))) / 4;
+                      const int x_161 = asint(x_10[scalar_offset_9 / 4][scalar_offset_9 % 4]);
+                      if ((x_159 < x_161)) {
+                      } else {
+                        break;
+                      }
+                      const int x_165 = asint(x_10[1].x);
+                      i_10 = x_165;
+                      while (true) {
+                        const int x_170 = i_10;
+                        const uint scalar_offset_10 = ((16u * uint(0))) / 4;
+                        const int x_172 = asint(x_10[scalar_offset_10 / 4][scalar_offset_10 % 4]);
+                        if ((x_170 < x_172)) {
+                        } else {
+                          break;
+                        }
+                        const int x_176 = asint(x_10[1].x);
+                        i_11 = x_176;
+                        while (true) {
+                          const int x_181 = i_11;
+                          const int x_183 = asint(x_10[2].x);
+                          if ((x_181 < x_183)) {
+                          } else {
+                            break;
+                          }
+                          const int x_187 = asint(x_10[1].x);
+                          i_12 = x_187;
+                          while (true) {
+                            const int x_192 = i_12;
+                            const uint scalar_offset_11 = ((16u * uint(0))) / 4;
+                            const int x_194 = asint(x_10[scalar_offset_11 / 4][scalar_offset_11 % 4]);
+                            if ((x_192 < x_194)) {
+                            } else {
+                              break;
+                            }
+                            const int x_198 = asint(x_10[1].x);
+                            i_13 = x_198;
+                            while (true) {
+                              const int x_203 = i_13;
+                              const uint scalar_offset_12 = ((16u * uint(0))) / 4;
+                              const int x_205 = asint(x_10[scalar_offset_12 / 4][scalar_offset_12 % 4]);
+                              if ((x_203 < x_205)) {
+                              } else {
+                                break;
+                              }
+                              const int x_209 = asint(x_10[1].x);
+                              i_14 = x_209;
+                              while (true) {
+                                const int x_214 = i_14;
+                                const int x_216 = asint(x_10[2].x);
+                                if ((x_214 < x_216)) {
+                                } else {
+                                  break;
+                                }
+                                while (true) {
+                                  x_GLF_global_loop_count = (x_GLF_global_loop_count + 1);
+                                  {
+                                    const int x_225 = x_GLF_global_loop_count;
+                                    const int x_227 = asint(x_10[3].x);
+                                    if ((x_225 < (100 - x_227))) {
+                                    } else {
+                                      break;
+                                    }
+                                  }
+                                }
+                                const uint scalar_offset_13 = ((16u * uint(0))) / 4;
+                                const float x_231 = asfloat(x_7[scalar_offset_13 / 4][scalar_offset_13 % 4]);
+                                f = (f + x_231);
+                                {
+                                  i_14 = (i_14 + 1);
+                                }
+                              }
+                              {
+                                i_13 = (i_13 + 1);
+                              }
+                            }
+                            {
+                              i_12 = (i_12 + 1);
+                            }
+                          }
+                          {
+                            i_11 = (i_11 + 1);
+                          }
+                        }
+                        {
+                          i_10 = (i_10 + 1);
+                        }
+                      }
+                      {
+                        i_9 = (i_9 + 1);
+                      }
+                    }
+                    {
+                      i_8 = (i_8 + 1);
+                    }
+                  }
+                  {
+                    i_7 = (i_7 + 1);
+                  }
+                }
+                {
+                  i_6 = (i_6 + 1);
+                }
+              }
+              {
+                i_5 = (i_5 + 1);
+              }
+            }
+            {
+              i_4 = (i_4 + 1);
+            }
+          }
+          {
+            i_3 = (i_3 + 1);
+          }
+        }
+        {
+          i_2 = (i_2 + 1);
+        }
+      }
+      {
+        i_1 = (i_1 + 1);
+      }
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  const float x_265 = asfloat(x_7[1].x);
+  sum = x_265;
+  const int x_267 = asint(x_10[1].x);
+  r = x_267;
+  {
+    for(; (x_GLF_global_loop_count < 100); r = (r + 1)) {
+      x_GLF_global_loop_count = (x_GLF_global_loop_count + 1);
+      sum = (sum + f);
+    }
+  }
+  const float x_282 = sum;
+  const float x_284 = asfloat(x_7[2].x);
+  if ((x_282 == x_284)) {
+    const uint scalar_offset_14 = ((16u * uint(0))) / 4;
+    const int x_290 = asint(x_10[scalar_offset_14 / 4][scalar_offset_14 % 4]);
+    const int x_293 = asint(x_10[1].x);
+    const int x_296 = asint(x_10[1].x);
+    const uint scalar_offset_15 = ((16u * uint(0))) / 4;
+    const int x_299 = asint(x_10[scalar_offset_15 / 4][scalar_offset_15 % 4]);
+    x_GLF_color = float4(float(x_290), float(x_293), float(x_296), float(x_299));
+  } else {
+    const int x_303 = asint(x_10[1].x);
+    const float x_304 = float(x_303);
+    x_GLF_color = float4(x_304, x_304, x_304, x_304);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nested-loops-global-loop-counter-do-while-accumulate-float/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-nested-loops-global-loop-counter-do-while-accumulate-float/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..a589c96
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nested-loops-global-loop-counter-do-while-accumulate-float/0-opt.wgsl.expected.msl
@@ -0,0 +1,322 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[4];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, constant buf1& x_10, thread int* const tint_symbol_4, thread float4* const tint_symbol_5) {
+  float f = 0.0f;
+  int i = 0;
+  int i_1 = 0;
+  int i_2 = 0;
+  int i_3 = 0;
+  int i_4 = 0;
+  int i_5 = 0;
+  int i_6 = 0;
+  int i_7 = 0;
+  int i_8 = 0;
+  int i_9 = 0;
+  int i_10 = 0;
+  int i_11 = 0;
+  int i_12 = 0;
+  int i_13 = 0;
+  int i_14 = 0;
+  float sum = 0.0f;
+  int r = 0;
+  *(tint_symbol_4) = 0;
+  float const x_53 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  f = x_53;
+  int const x_55 = x_10.x_GLF_uniform_int_values.arr[1].el;
+  i = x_55;
+  while (true) {
+    int const x_60 = i;
+    int const x_62 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_60 < x_62)) {
+    } else {
+      break;
+    }
+    int const x_66 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    i_1 = x_66;
+    while (true) {
+      int const x_71 = i_1;
+      int const x_73 = x_10.x_GLF_uniform_int_values.arr[0].el;
+      if ((x_71 < x_73)) {
+      } else {
+        break;
+      }
+      int const x_77 = x_10.x_GLF_uniform_int_values.arr[1].el;
+      i_2 = x_77;
+      while (true) {
+        int const x_82 = i_2;
+        int const x_84 = x_10.x_GLF_uniform_int_values.arr[0].el;
+        if ((x_82 < x_84)) {
+        } else {
+          break;
+        }
+        int const x_88 = x_10.x_GLF_uniform_int_values.arr[1].el;
+        i_3 = x_88;
+        while (true) {
+          int const x_93 = i_3;
+          int const x_95 = x_10.x_GLF_uniform_int_values.arr[0].el;
+          if ((x_93 < x_95)) {
+          } else {
+            break;
+          }
+          int const x_99 = x_10.x_GLF_uniform_int_values.arr[1].el;
+          i_4 = x_99;
+          while (true) {
+            int const x_104 = i_4;
+            int const x_106 = x_10.x_GLF_uniform_int_values.arr[0].el;
+            if ((x_104 < x_106)) {
+            } else {
+              break;
+            }
+            int const x_110 = x_10.x_GLF_uniform_int_values.arr[1].el;
+            i_5 = x_110;
+            while (true) {
+              int const x_115 = i_5;
+              int const x_117 = x_10.x_GLF_uniform_int_values.arr[0].el;
+              if ((x_115 < x_117)) {
+              } else {
+                break;
+              }
+              int const x_121 = x_10.x_GLF_uniform_int_values.arr[1].el;
+              i_6 = x_121;
+              while (true) {
+                int const x_126 = i_6;
+                int const x_128 = x_10.x_GLF_uniform_int_values.arr[0].el;
+                if ((x_126 < x_128)) {
+                } else {
+                  break;
+                }
+                int const x_132 = x_10.x_GLF_uniform_int_values.arr[1].el;
+                i_7 = x_132;
+                while (true) {
+                  int const x_137 = i_7;
+                  int const x_139 = x_10.x_GLF_uniform_int_values.arr[0].el;
+                  if ((x_137 < x_139)) {
+                  } else {
+                    break;
+                  }
+                  int const x_143 = x_10.x_GLF_uniform_int_values.arr[1].el;
+                  i_8 = x_143;
+                  while (true) {
+                    int const x_148 = i_8;
+                    int const x_150 = x_10.x_GLF_uniform_int_values.arr[0].el;
+                    if ((x_148 < x_150)) {
+                    } else {
+                      break;
+                    }
+                    int const x_154 = x_10.x_GLF_uniform_int_values.arr[1].el;
+                    i_9 = x_154;
+                    while (true) {
+                      int const x_159 = i_9;
+                      int const x_161 = x_10.x_GLF_uniform_int_values.arr[0].el;
+                      if ((x_159 < x_161)) {
+                      } else {
+                        break;
+                      }
+                      int const x_165 = x_10.x_GLF_uniform_int_values.arr[1].el;
+                      i_10 = x_165;
+                      while (true) {
+                        int const x_170 = i_10;
+                        int const x_172 = x_10.x_GLF_uniform_int_values.arr[0].el;
+                        if ((x_170 < x_172)) {
+                        } else {
+                          break;
+                        }
+                        int const x_176 = x_10.x_GLF_uniform_int_values.arr[1].el;
+                        i_11 = x_176;
+                        while (true) {
+                          int const x_181 = i_11;
+                          int const x_183 = x_10.x_GLF_uniform_int_values.arr[2].el;
+                          if ((x_181 < x_183)) {
+                          } else {
+                            break;
+                          }
+                          int const x_187 = x_10.x_GLF_uniform_int_values.arr[1].el;
+                          i_12 = x_187;
+                          while (true) {
+                            int const x_192 = i_12;
+                            int const x_194 = x_10.x_GLF_uniform_int_values.arr[0].el;
+                            if ((x_192 < x_194)) {
+                            } else {
+                              break;
+                            }
+                            int const x_198 = x_10.x_GLF_uniform_int_values.arr[1].el;
+                            i_13 = x_198;
+                            while (true) {
+                              int const x_203 = i_13;
+                              int const x_205 = x_10.x_GLF_uniform_int_values.arr[0].el;
+                              if ((x_203 < x_205)) {
+                              } else {
+                                break;
+                              }
+                              int const x_209 = x_10.x_GLF_uniform_int_values.arr[1].el;
+                              i_14 = x_209;
+                              while (true) {
+                                int const x_214 = i_14;
+                                int const x_216 = x_10.x_GLF_uniform_int_values.arr[2].el;
+                                if ((x_214 < x_216)) {
+                                } else {
+                                  break;
+                                }
+                                while (true) {
+                                  int const x_223 = *(tint_symbol_4);
+                                  *(tint_symbol_4) = (x_223 + 1);
+                                  {
+                                    int const x_225 = *(tint_symbol_4);
+                                    int const x_227 = x_10.x_GLF_uniform_int_values.arr[3].el;
+                                    if ((x_225 < (100 - x_227))) {
+                                    } else {
+                                      break;
+                                    }
+                                  }
+                                }
+                                float const x_231 = x_7.x_GLF_uniform_float_values.arr[0].el;
+                                float const x_232 = f;
+                                f = (x_232 + x_231);
+                                {
+                                  int const x_234 = i_14;
+                                  i_14 = (x_234 + 1);
+                                }
+                              }
+                              {
+                                int const x_236 = i_13;
+                                i_13 = (x_236 + 1);
+                              }
+                            }
+                            {
+                              int const x_238 = i_12;
+                              i_12 = (x_238 + 1);
+                            }
+                          }
+                          {
+                            int const x_240 = i_11;
+                            i_11 = (x_240 + 1);
+                          }
+                        }
+                        {
+                          int const x_242 = i_10;
+                          i_10 = (x_242 + 1);
+                        }
+                      }
+                      {
+                        int const x_244 = i_9;
+                        i_9 = (x_244 + 1);
+                      }
+                    }
+                    {
+                      int const x_246 = i_8;
+                      i_8 = (x_246 + 1);
+                    }
+                  }
+                  {
+                    int const x_248 = i_7;
+                    i_7 = (x_248 + 1);
+                  }
+                }
+                {
+                  int const x_250 = i_6;
+                  i_6 = (x_250 + 1);
+                }
+              }
+              {
+                int const x_252 = i_5;
+                i_5 = (x_252 + 1);
+              }
+            }
+            {
+              int const x_254 = i_4;
+              i_4 = (x_254 + 1);
+            }
+          }
+          {
+            int const x_256 = i_3;
+            i_3 = (x_256 + 1);
+          }
+        }
+        {
+          int const x_258 = i_2;
+          i_2 = (x_258 + 1);
+        }
+      }
+      {
+        int const x_260 = i_1;
+        i_1 = (x_260 + 1);
+      }
+    }
+    {
+      int const x_262 = i;
+      i = (x_262 + 1);
+    }
+  }
+  float const x_265 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  sum = x_265;
+  int const x_267 = x_10.x_GLF_uniform_int_values.arr[1].el;
+  r = x_267;
+  while (true) {
+    int const x_272 = *(tint_symbol_4);
+    if ((x_272 < 100)) {
+    } else {
+      break;
+    }
+    int const x_275 = *(tint_symbol_4);
+    *(tint_symbol_4) = (x_275 + 1);
+    float const x_277 = f;
+    float const x_278 = sum;
+    sum = (x_278 + x_277);
+    {
+      int const x_280 = r;
+      r = (x_280 + 1);
+    }
+  }
+  float const x_282 = sum;
+  float const x_284 = x_7.x_GLF_uniform_float_values.arr[2].el;
+  if ((x_282 == x_284)) {
+    int const x_290 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    int const x_293 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_296 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_299 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_5) = float4(float(x_290), float(x_293), float(x_296), float(x_299));
+  } else {
+    int const x_303 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    float const x_304 = float(x_303);
+    *(tint_symbol_5) = float4(x_304, x_304, x_304, x_304);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]], constant buf1& x_10 [[buffer(1)]]) {
+  thread int tint_symbol_6 = 0;
+  thread float4 tint_symbol_7 = 0.0f;
+  main_1(x_7, x_10, &(tint_symbol_6), &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nested-loops-global-loop-counter-do-while-accumulate-float/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-nested-loops-global-loop-counter-do-while-accumulate-float/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..8003194
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nested-loops-global-loop-counter-do-while-accumulate-float/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,623 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 358
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_global_loop_count "x_GLF_global_loop_count"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_7 "x_7"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %i "i"
+               OpName %i_1 "i_1"
+               OpName %i_2 "i_2"
+               OpName %i_3 "i_3"
+               OpName %i_4 "i_4"
+               OpName %i_5 "i_5"
+               OpName %i_6 "i_6"
+               OpName %i_7 "i_7"
+               OpName %i_8 "i_8"
+               OpName %i_9 "i_9"
+               OpName %i_10 "i_10"
+               OpName %i_11 "i_11"
+               OpName %i_12 "i_12"
+               OpName %i_13 "i_13"
+               OpName %i_14 "i_14"
+               OpName %sum "sum"
+               OpName %r "r"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+          %4 = OpConstantNull %int
+%x_GLF_global_loop_count = OpVariable %_ptr_Private_int Private %4
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf0 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf1 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_10 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %20 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %20
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %20
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %29 = OpConstantNull %float
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+    %int_100 = OpConstant %int 100
+   %main_out = OpTypeStruct %v4float
+        %346 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %23
+         %26 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %29
+          %i = OpVariable %_ptr_Function_int Function %4
+        %i_1 = OpVariable %_ptr_Function_int Function %4
+        %i_2 = OpVariable %_ptr_Function_int Function %4
+        %i_3 = OpVariable %_ptr_Function_int Function %4
+        %i_4 = OpVariable %_ptr_Function_int Function %4
+        %i_5 = OpVariable %_ptr_Function_int Function %4
+        %i_6 = OpVariable %_ptr_Function_int Function %4
+        %i_7 = OpVariable %_ptr_Function_int Function %4
+        %i_8 = OpVariable %_ptr_Function_int Function %4
+        %i_9 = OpVariable %_ptr_Function_int Function %4
+       %i_10 = OpVariable %_ptr_Function_int Function %4
+       %i_11 = OpVariable %_ptr_Function_int Function %4
+       %i_12 = OpVariable %_ptr_Function_int Function %4
+       %i_13 = OpVariable %_ptr_Function_int Function %4
+       %i_14 = OpVariable %_ptr_Function_int Function %4
+        %sum = OpVariable %_ptr_Function_float Function %29
+          %r = OpVariable %_ptr_Function_int Function %4
+               OpStore %x_GLF_global_loop_count %int_0
+         %52 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %53 = OpLoad %float %52
+               OpStore %f %53
+         %55 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %56 = OpLoad %int %55
+               OpStore %i %56
+               OpBranch %57
+         %57 = OpLabel
+               OpLoopMerge %58 %59 None
+               OpBranch %60
+         %60 = OpLabel
+         %61 = OpLoad %int %i
+         %62 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %63 = OpLoad %int %62
+         %64 = OpSLessThan %bool %61 %63
+               OpSelectionMerge %66 None
+               OpBranchConditional %64 %67 %68
+         %67 = OpLabel
+               OpBranch %66
+         %68 = OpLabel
+               OpBranch %58
+         %66 = OpLabel
+         %69 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %70 = OpLoad %int %69
+               OpStore %i_1 %70
+               OpBranch %71
+         %71 = OpLabel
+               OpLoopMerge %72 %73 None
+               OpBranch %74
+         %74 = OpLabel
+         %75 = OpLoad %int %i_1
+         %76 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %77 = OpLoad %int %76
+         %78 = OpSLessThan %bool %75 %77
+               OpSelectionMerge %79 None
+               OpBranchConditional %78 %80 %81
+         %80 = OpLabel
+               OpBranch %79
+         %81 = OpLabel
+               OpBranch %72
+         %79 = OpLabel
+         %82 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %83 = OpLoad %int %82
+               OpStore %i_2 %83
+               OpBranch %84
+         %84 = OpLabel
+               OpLoopMerge %85 %86 None
+               OpBranch %87
+         %87 = OpLabel
+         %88 = OpLoad %int %i_2
+         %89 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %90 = OpLoad %int %89
+         %91 = OpSLessThan %bool %88 %90
+               OpSelectionMerge %92 None
+               OpBranchConditional %91 %93 %94
+         %93 = OpLabel
+               OpBranch %92
+         %94 = OpLabel
+               OpBranch %85
+         %92 = OpLabel
+         %95 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %96 = OpLoad %int %95
+               OpStore %i_3 %96
+               OpBranch %97
+         %97 = OpLabel
+               OpLoopMerge %98 %99 None
+               OpBranch %100
+        %100 = OpLabel
+        %101 = OpLoad %int %i_3
+        %102 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %103 = OpLoad %int %102
+        %104 = OpSLessThan %bool %101 %103
+               OpSelectionMerge %105 None
+               OpBranchConditional %104 %106 %107
+        %106 = OpLabel
+               OpBranch %105
+        %107 = OpLabel
+               OpBranch %98
+        %105 = OpLabel
+        %108 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %109 = OpLoad %int %108
+               OpStore %i_4 %109
+               OpBranch %110
+        %110 = OpLabel
+               OpLoopMerge %111 %112 None
+               OpBranch %113
+        %113 = OpLabel
+        %114 = OpLoad %int %i_4
+        %115 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %116 = OpLoad %int %115
+        %117 = OpSLessThan %bool %114 %116
+               OpSelectionMerge %118 None
+               OpBranchConditional %117 %119 %120
+        %119 = OpLabel
+               OpBranch %118
+        %120 = OpLabel
+               OpBranch %111
+        %118 = OpLabel
+        %121 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %122 = OpLoad %int %121
+               OpStore %i_5 %122
+               OpBranch %123
+        %123 = OpLabel
+               OpLoopMerge %124 %125 None
+               OpBranch %126
+        %126 = OpLabel
+        %127 = OpLoad %int %i_5
+        %128 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %129 = OpLoad %int %128
+        %130 = OpSLessThan %bool %127 %129
+               OpSelectionMerge %131 None
+               OpBranchConditional %130 %132 %133
+        %132 = OpLabel
+               OpBranch %131
+        %133 = OpLabel
+               OpBranch %124
+        %131 = OpLabel
+        %134 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %135 = OpLoad %int %134
+               OpStore %i_6 %135
+               OpBranch %136
+        %136 = OpLabel
+               OpLoopMerge %137 %138 None
+               OpBranch %139
+        %139 = OpLabel
+        %140 = OpLoad %int %i_6
+        %141 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %142 = OpLoad %int %141
+        %143 = OpSLessThan %bool %140 %142
+               OpSelectionMerge %144 None
+               OpBranchConditional %143 %145 %146
+        %145 = OpLabel
+               OpBranch %144
+        %146 = OpLabel
+               OpBranch %137
+        %144 = OpLabel
+        %147 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %148 = OpLoad %int %147
+               OpStore %i_7 %148
+               OpBranch %149
+        %149 = OpLabel
+               OpLoopMerge %150 %151 None
+               OpBranch %152
+        %152 = OpLabel
+        %153 = OpLoad %int %i_7
+        %154 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %155 = OpLoad %int %154
+        %156 = OpSLessThan %bool %153 %155
+               OpSelectionMerge %157 None
+               OpBranchConditional %156 %158 %159
+        %158 = OpLabel
+               OpBranch %157
+        %159 = OpLabel
+               OpBranch %150
+        %157 = OpLabel
+        %160 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %161 = OpLoad %int %160
+               OpStore %i_8 %161
+               OpBranch %162
+        %162 = OpLabel
+               OpLoopMerge %163 %164 None
+               OpBranch %165
+        %165 = OpLabel
+        %166 = OpLoad %int %i_8
+        %167 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %168 = OpLoad %int %167
+        %169 = OpSLessThan %bool %166 %168
+               OpSelectionMerge %170 None
+               OpBranchConditional %169 %171 %172
+        %171 = OpLabel
+               OpBranch %170
+        %172 = OpLabel
+               OpBranch %163
+        %170 = OpLabel
+        %173 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %174 = OpLoad %int %173
+               OpStore %i_9 %174
+               OpBranch %175
+        %175 = OpLabel
+               OpLoopMerge %176 %177 None
+               OpBranch %178
+        %178 = OpLabel
+        %179 = OpLoad %int %i_9
+        %180 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %181 = OpLoad %int %180
+        %182 = OpSLessThan %bool %179 %181
+               OpSelectionMerge %183 None
+               OpBranchConditional %182 %184 %185
+        %184 = OpLabel
+               OpBranch %183
+        %185 = OpLabel
+               OpBranch %176
+        %183 = OpLabel
+        %186 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %187 = OpLoad %int %186
+               OpStore %i_10 %187
+               OpBranch %188
+        %188 = OpLabel
+               OpLoopMerge %189 %190 None
+               OpBranch %191
+        %191 = OpLabel
+        %192 = OpLoad %int %i_10
+        %193 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %194 = OpLoad %int %193
+        %195 = OpSLessThan %bool %192 %194
+               OpSelectionMerge %196 None
+               OpBranchConditional %195 %197 %198
+        %197 = OpLabel
+               OpBranch %196
+        %198 = OpLabel
+               OpBranch %189
+        %196 = OpLabel
+        %199 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %200 = OpLoad %int %199
+               OpStore %i_11 %200
+               OpBranch %201
+        %201 = OpLabel
+               OpLoopMerge %202 %203 None
+               OpBranch %204
+        %204 = OpLabel
+        %205 = OpLoad %int %i_11
+        %207 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %208 = OpLoad %int %207
+        %209 = OpSLessThan %bool %205 %208
+               OpSelectionMerge %210 None
+               OpBranchConditional %209 %211 %212
+        %211 = OpLabel
+               OpBranch %210
+        %212 = OpLabel
+               OpBranch %202
+        %210 = OpLabel
+        %213 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %214 = OpLoad %int %213
+               OpStore %i_12 %214
+               OpBranch %215
+        %215 = OpLabel
+               OpLoopMerge %216 %217 None
+               OpBranch %218
+        %218 = OpLabel
+        %219 = OpLoad %int %i_12
+        %220 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %221 = OpLoad %int %220
+        %222 = OpSLessThan %bool %219 %221
+               OpSelectionMerge %223 None
+               OpBranchConditional %222 %224 %225
+        %224 = OpLabel
+               OpBranch %223
+        %225 = OpLabel
+               OpBranch %216
+        %223 = OpLabel
+        %226 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %227 = OpLoad %int %226
+               OpStore %i_13 %227
+               OpBranch %228
+        %228 = OpLabel
+               OpLoopMerge %229 %230 None
+               OpBranch %231
+        %231 = OpLabel
+        %232 = OpLoad %int %i_13
+        %233 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %234 = OpLoad %int %233
+        %235 = OpSLessThan %bool %232 %234
+               OpSelectionMerge %236 None
+               OpBranchConditional %235 %237 %238
+        %237 = OpLabel
+               OpBranch %236
+        %238 = OpLabel
+               OpBranch %229
+        %236 = OpLabel
+        %239 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %240 = OpLoad %int %239
+               OpStore %i_14 %240
+               OpBranch %241
+        %241 = OpLabel
+               OpLoopMerge %242 %243 None
+               OpBranch %244
+        %244 = OpLabel
+        %245 = OpLoad %int %i_14
+        %246 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %247 = OpLoad %int %246
+        %248 = OpSLessThan %bool %245 %247
+               OpSelectionMerge %249 None
+               OpBranchConditional %248 %250 %251
+        %250 = OpLabel
+               OpBranch %249
+        %251 = OpLabel
+               OpBranch %242
+        %249 = OpLabel
+               OpBranch %252
+        %252 = OpLabel
+               OpLoopMerge %253 %254 None
+               OpBranch %255
+        %255 = OpLabel
+        %256 = OpLoad %int %x_GLF_global_loop_count
+        %257 = OpIAdd %int %256 %int_1
+               OpStore %x_GLF_global_loop_count %257
+               OpBranch %254
+        %254 = OpLabel
+        %258 = OpLoad %int %x_GLF_global_loop_count
+        %260 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+        %261 = OpLoad %int %260
+        %263 = OpISub %int %int_100 %261
+        %264 = OpSLessThan %bool %258 %263
+               OpSelectionMerge %265 None
+               OpBranchConditional %264 %266 %267
+        %266 = OpLabel
+               OpBranch %265
+        %267 = OpLabel
+               OpBranch %253
+        %265 = OpLabel
+               OpBranch %252
+        %253 = OpLabel
+        %268 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+        %269 = OpLoad %float %268
+        %270 = OpLoad %float %f
+        %271 = OpFAdd %float %270 %269
+               OpStore %f %271
+               OpBranch %243
+        %243 = OpLabel
+        %272 = OpLoad %int %i_14
+        %273 = OpIAdd %int %272 %int_1
+               OpStore %i_14 %273
+               OpBranch %241
+        %242 = OpLabel
+               OpBranch %230
+        %230 = OpLabel
+        %274 = OpLoad %int %i_13
+        %275 = OpIAdd %int %274 %int_1
+               OpStore %i_13 %275
+               OpBranch %228
+        %229 = OpLabel
+               OpBranch %217
+        %217 = OpLabel
+        %276 = OpLoad %int %i_12
+        %277 = OpIAdd %int %276 %int_1
+               OpStore %i_12 %277
+               OpBranch %215
+        %216 = OpLabel
+               OpBranch %203
+        %203 = OpLabel
+        %278 = OpLoad %int %i_11
+        %279 = OpIAdd %int %278 %int_1
+               OpStore %i_11 %279
+               OpBranch %201
+        %202 = OpLabel
+               OpBranch %190
+        %190 = OpLabel
+        %280 = OpLoad %int %i_10
+        %281 = OpIAdd %int %280 %int_1
+               OpStore %i_10 %281
+               OpBranch %188
+        %189 = OpLabel
+               OpBranch %177
+        %177 = OpLabel
+        %282 = OpLoad %int %i_9
+        %283 = OpIAdd %int %282 %int_1
+               OpStore %i_9 %283
+               OpBranch %175
+        %176 = OpLabel
+               OpBranch %164
+        %164 = OpLabel
+        %284 = OpLoad %int %i_8
+        %285 = OpIAdd %int %284 %int_1
+               OpStore %i_8 %285
+               OpBranch %162
+        %163 = OpLabel
+               OpBranch %151
+        %151 = OpLabel
+        %286 = OpLoad %int %i_7
+        %287 = OpIAdd %int %286 %int_1
+               OpStore %i_7 %287
+               OpBranch %149
+        %150 = OpLabel
+               OpBranch %138
+        %138 = OpLabel
+        %288 = OpLoad %int %i_6
+        %289 = OpIAdd %int %288 %int_1
+               OpStore %i_6 %289
+               OpBranch %136
+        %137 = OpLabel
+               OpBranch %125
+        %125 = OpLabel
+        %290 = OpLoad %int %i_5
+        %291 = OpIAdd %int %290 %int_1
+               OpStore %i_5 %291
+               OpBranch %123
+        %124 = OpLabel
+               OpBranch %112
+        %112 = OpLabel
+        %292 = OpLoad %int %i_4
+        %293 = OpIAdd %int %292 %int_1
+               OpStore %i_4 %293
+               OpBranch %110
+        %111 = OpLabel
+               OpBranch %99
+         %99 = OpLabel
+        %294 = OpLoad %int %i_3
+        %295 = OpIAdd %int %294 %int_1
+               OpStore %i_3 %295
+               OpBranch %97
+         %98 = OpLabel
+               OpBranch %86
+         %86 = OpLabel
+        %296 = OpLoad %int %i_2
+        %297 = OpIAdd %int %296 %int_1
+               OpStore %i_2 %297
+               OpBranch %84
+         %85 = OpLabel
+               OpBranch %73
+         %73 = OpLabel
+        %298 = OpLoad %int %i_1
+        %299 = OpIAdd %int %298 %int_1
+               OpStore %i_1 %299
+               OpBranch %71
+         %72 = OpLabel
+               OpBranch %59
+         %59 = OpLabel
+        %300 = OpLoad %int %i
+        %301 = OpIAdd %int %300 %int_1
+               OpStore %i %301
+               OpBranch %57
+         %58 = OpLabel
+        %302 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+        %303 = OpLoad %float %302
+               OpStore %sum %303
+        %304 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %305 = OpLoad %int %304
+               OpStore %r %305
+               OpBranch %306
+        %306 = OpLabel
+               OpLoopMerge %307 %308 None
+               OpBranch %309
+        %309 = OpLabel
+        %310 = OpLoad %int %x_GLF_global_loop_count
+        %311 = OpSLessThan %bool %310 %int_100
+               OpSelectionMerge %312 None
+               OpBranchConditional %311 %313 %314
+        %313 = OpLabel
+               OpBranch %312
+        %314 = OpLabel
+               OpBranch %307
+        %312 = OpLabel
+        %315 = OpLoad %int %x_GLF_global_loop_count
+        %316 = OpIAdd %int %315 %int_1
+               OpStore %x_GLF_global_loop_count %316
+        %317 = OpLoad %float %f
+        %318 = OpLoad %float %sum
+        %319 = OpFAdd %float %318 %317
+               OpStore %sum %319
+               OpBranch %308
+        %308 = OpLabel
+        %320 = OpLoad %int %r
+        %321 = OpIAdd %int %320 %int_1
+               OpStore %r %321
+               OpBranch %306
+        %307 = OpLabel
+        %322 = OpLoad %float %sum
+        %323 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_2
+        %324 = OpLoad %float %323
+        %325 = OpFOrdEqual %bool %322 %324
+               OpSelectionMerge %326 None
+               OpBranchConditional %325 %327 %328
+        %327 = OpLabel
+        %329 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %330 = OpLoad %int %329
+        %331 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %332 = OpLoad %int %331
+        %333 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %334 = OpLoad %int %333
+        %335 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %336 = OpLoad %int %335
+        %337 = OpConvertSToF %float %330
+        %338 = OpConvertSToF %float %332
+        %339 = OpConvertSToF %float %334
+        %340 = OpConvertSToF %float %336
+        %341 = OpCompositeConstruct %v4float %337 %338 %339 %340
+               OpStore %x_GLF_color %341
+               OpBranch %326
+        %328 = OpLabel
+        %342 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %343 = OpLoad %int %342
+        %344 = OpConvertSToF %float %343
+        %345 = OpCompositeConstruct %v4float %344 %344 %344 %344
+               OpStore %x_GLF_color %345
+               OpBranch %326
+        %326 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %346
+%tint_symbol = OpFunctionParameter %main_out
+        %350 = OpLabel
+        %351 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %351
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %23
+        %353 = OpLabel
+        %354 = OpFunctionCall %void %main_1
+        %356 = OpLoad %v4float %x_GLF_color
+        %357 = OpCompositeConstruct %main_out %356
+        %355 = OpFunctionCall %void %tint_symbol_2 %357
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 254[%254] is not post dominated by the back-edge block 265[%265]
+  %265 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nested-loops-global-loop-counter-do-while-accumulate-float/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-nested-loops-global-loop-counter-do-while-accumulate-float/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..ed88017
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nested-loops-global-loop-counter-do-while-accumulate-float/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,332 @@
+type Arr = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> x_GLF_global_loop_count : i32;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  var i : i32;
+  var i_1 : i32;
+  var i_2 : i32;
+  var i_3 : i32;
+  var i_4 : i32;
+  var i_5 : i32;
+  var i_6 : i32;
+  var i_7 : i32;
+  var i_8 : i32;
+  var i_9 : i32;
+  var i_10 : i32;
+  var i_11 : i32;
+  var i_12 : i32;
+  var i_13 : i32;
+  var i_14 : i32;
+  var sum : f32;
+  var r : i32;
+  x_GLF_global_loop_count = 0;
+  let x_53 : f32 = x_7.x_GLF_uniform_float_values[1];
+  f = x_53;
+  let x_55 : i32 = x_10.x_GLF_uniform_int_values[1];
+  i = x_55;
+  loop {
+    let x_60 : i32 = i;
+    let x_62 : i32 = x_10.x_GLF_uniform_int_values[0];
+    if ((x_60 < x_62)) {
+    } else {
+      break;
+    }
+    let x_66 : i32 = x_10.x_GLF_uniform_int_values[1];
+    i_1 = x_66;
+    loop {
+      let x_71 : i32 = i_1;
+      let x_73 : i32 = x_10.x_GLF_uniform_int_values[0];
+      if ((x_71 < x_73)) {
+      } else {
+        break;
+      }
+      let x_77 : i32 = x_10.x_GLF_uniform_int_values[1];
+      i_2 = x_77;
+      loop {
+        let x_82 : i32 = i_2;
+        let x_84 : i32 = x_10.x_GLF_uniform_int_values[0];
+        if ((x_82 < x_84)) {
+        } else {
+          break;
+        }
+        let x_88 : i32 = x_10.x_GLF_uniform_int_values[1];
+        i_3 = x_88;
+        loop {
+          let x_93 : i32 = i_3;
+          let x_95 : i32 = x_10.x_GLF_uniform_int_values[0];
+          if ((x_93 < x_95)) {
+          } else {
+            break;
+          }
+          let x_99 : i32 = x_10.x_GLF_uniform_int_values[1];
+          i_4 = x_99;
+          loop {
+            let x_104 : i32 = i_4;
+            let x_106 : i32 = x_10.x_GLF_uniform_int_values[0];
+            if ((x_104 < x_106)) {
+            } else {
+              break;
+            }
+            let x_110 : i32 = x_10.x_GLF_uniform_int_values[1];
+            i_5 = x_110;
+            loop {
+              let x_115 : i32 = i_5;
+              let x_117 : i32 = x_10.x_GLF_uniform_int_values[0];
+              if ((x_115 < x_117)) {
+              } else {
+                break;
+              }
+              let x_121 : i32 = x_10.x_GLF_uniform_int_values[1];
+              i_6 = x_121;
+              loop {
+                let x_126 : i32 = i_6;
+                let x_128 : i32 = x_10.x_GLF_uniform_int_values[0];
+                if ((x_126 < x_128)) {
+                } else {
+                  break;
+                }
+                let x_132 : i32 = x_10.x_GLF_uniform_int_values[1];
+                i_7 = x_132;
+                loop {
+                  let x_137 : i32 = i_7;
+                  let x_139 : i32 = x_10.x_GLF_uniform_int_values[0];
+                  if ((x_137 < x_139)) {
+                  } else {
+                    break;
+                  }
+                  let x_143 : i32 = x_10.x_GLF_uniform_int_values[1];
+                  i_8 = x_143;
+                  loop {
+                    let x_148 : i32 = i_8;
+                    let x_150 : i32 = x_10.x_GLF_uniform_int_values[0];
+                    if ((x_148 < x_150)) {
+                    } else {
+                      break;
+                    }
+                    let x_154 : i32 = x_10.x_GLF_uniform_int_values[1];
+                    i_9 = x_154;
+                    loop {
+                      let x_159 : i32 = i_9;
+                      let x_161 : i32 = x_10.x_GLF_uniform_int_values[0];
+                      if ((x_159 < x_161)) {
+                      } else {
+                        break;
+                      }
+                      let x_165 : i32 = x_10.x_GLF_uniform_int_values[1];
+                      i_10 = x_165;
+                      loop {
+                        let x_170 : i32 = i_10;
+                        let x_172 : i32 = x_10.x_GLF_uniform_int_values[0];
+                        if ((x_170 < x_172)) {
+                        } else {
+                          break;
+                        }
+                        let x_176 : i32 = x_10.x_GLF_uniform_int_values[1];
+                        i_11 = x_176;
+                        loop {
+                          let x_181 : i32 = i_11;
+                          let x_183 : i32 = x_10.x_GLF_uniform_int_values[2];
+                          if ((x_181 < x_183)) {
+                          } else {
+                            break;
+                          }
+                          let x_187 : i32 = x_10.x_GLF_uniform_int_values[1];
+                          i_12 = x_187;
+                          loop {
+                            let x_192 : i32 = i_12;
+                            let x_194 : i32 = x_10.x_GLF_uniform_int_values[0];
+                            if ((x_192 < x_194)) {
+                            } else {
+                              break;
+                            }
+                            let x_198 : i32 = x_10.x_GLF_uniform_int_values[1];
+                            i_13 = x_198;
+                            loop {
+                              let x_203 : i32 = i_13;
+                              let x_205 : i32 = x_10.x_GLF_uniform_int_values[0];
+                              if ((x_203 < x_205)) {
+                              } else {
+                                break;
+                              }
+                              let x_209 : i32 = x_10.x_GLF_uniform_int_values[1];
+                              i_14 = x_209;
+                              loop {
+                                let x_214 : i32 = i_14;
+                                let x_216 : i32 = x_10.x_GLF_uniform_int_values[2];
+                                if ((x_214 < x_216)) {
+                                } else {
+                                  break;
+                                }
+                                loop {
+                                  let x_223 : i32 = x_GLF_global_loop_count;
+                                  x_GLF_global_loop_count = (x_223 + 1);
+
+                                  continuing {
+                                    let x_225 : i32 = x_GLF_global_loop_count;
+                                    let x_227 : i32 = x_10.x_GLF_uniform_int_values[3];
+                                    if ((x_225 < (100 - x_227))) {
+                                    } else {
+                                      break;
+                                    }
+                                  }
+                                }
+                                let x_231 : f32 = x_7.x_GLF_uniform_float_values[0];
+                                let x_232 : f32 = f;
+                                f = (x_232 + x_231);
+
+                                continuing {
+                                  let x_234 : i32 = i_14;
+                                  i_14 = (x_234 + 1);
+                                }
+                              }
+
+                              continuing {
+                                let x_236 : i32 = i_13;
+                                i_13 = (x_236 + 1);
+                              }
+                            }
+
+                            continuing {
+                              let x_238 : i32 = i_12;
+                              i_12 = (x_238 + 1);
+                            }
+                          }
+
+                          continuing {
+                            let x_240 : i32 = i_11;
+                            i_11 = (x_240 + 1);
+                          }
+                        }
+
+                        continuing {
+                          let x_242 : i32 = i_10;
+                          i_10 = (x_242 + 1);
+                        }
+                      }
+
+                      continuing {
+                        let x_244 : i32 = i_9;
+                        i_9 = (x_244 + 1);
+                      }
+                    }
+
+                    continuing {
+                      let x_246 : i32 = i_8;
+                      i_8 = (x_246 + 1);
+                    }
+                  }
+
+                  continuing {
+                    let x_248 : i32 = i_7;
+                    i_7 = (x_248 + 1);
+                  }
+                }
+
+                continuing {
+                  let x_250 : i32 = i_6;
+                  i_6 = (x_250 + 1);
+                }
+              }
+
+              continuing {
+                let x_252 : i32 = i_5;
+                i_5 = (x_252 + 1);
+              }
+            }
+
+            continuing {
+              let x_254 : i32 = i_4;
+              i_4 = (x_254 + 1);
+            }
+          }
+
+          continuing {
+            let x_256 : i32 = i_3;
+            i_3 = (x_256 + 1);
+          }
+        }
+
+        continuing {
+          let x_258 : i32 = i_2;
+          i_2 = (x_258 + 1);
+        }
+      }
+
+      continuing {
+        let x_260 : i32 = i_1;
+        i_1 = (x_260 + 1);
+      }
+    }
+
+    continuing {
+      let x_262 : i32 = i;
+      i = (x_262 + 1);
+    }
+  }
+  let x_265 : f32 = x_7.x_GLF_uniform_float_values[1];
+  sum = x_265;
+  let x_267 : i32 = x_10.x_GLF_uniform_int_values[1];
+  r = x_267;
+  loop {
+    let x_272 : i32 = x_GLF_global_loop_count;
+    if ((x_272 < 100)) {
+    } else {
+      break;
+    }
+    let x_275 : i32 = x_GLF_global_loop_count;
+    x_GLF_global_loop_count = (x_275 + 1);
+    let x_277 : f32 = f;
+    let x_278 : f32 = sum;
+    sum = (x_278 + x_277);
+
+    continuing {
+      let x_280 : i32 = r;
+      r = (x_280 + 1);
+    }
+  }
+  let x_282 : f32 = sum;
+  let x_284 : f32 = x_7.x_GLF_uniform_float_values[2];
+  if ((x_282 == x_284)) {
+    let x_290 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_293 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_296 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_299 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_290), f32(x_293), f32(x_296), f32(x_299));
+  } else {
+    let x_303 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_304 : f32 = f32(x_303);
+    x_GLF_color = vec4<f32>(x_304, x_304, x_304, x_304);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nir-array-access/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-nir-array-access/0-opt.spvasm
new file mode 100644
index 0000000..3ea2481
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nir-array-access/0-opt.spvasm
@@ -0,0 +1,248 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %A "A"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %ref "ref"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %ok "ok"
+               OpName %i_0 "i"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_19 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_17 = OpConstant %uint 17
+%_arr_int_uint_17 = OpTypeArray %int %uint_17
+%_ptr_Function__arr_int_uint_17 = OpTypePointer Function %_arr_int_uint_17
+    %uint_19 = OpConstant %uint 19
+%_arr_int_uint_19 = OpTypeArray %int %uint_19
+       %buf0 = OpTypeStruct %_arr_int_uint_19
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+      %int_9 = OpConstant %int 9
+     %int_10 = OpConstant %int 10
+     %int_11 = OpConstant %int 11
+     %int_12 = OpConstant %int 12
+     %int_13 = OpConstant %int 13
+     %int_14 = OpConstant %int 14
+     %int_15 = OpConstant %int 15
+     %int_16 = OpConstant %int 16
+     %int_17 = OpConstant %int 17
+     %int_18 = OpConstant %int 18
+      %int_1 = OpConstant %int 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+       %true = OpConstantTrue %bool
+      %false = OpConstantFalse %bool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %14
+         %50 = OpLabel
+          %A = OpVariable %_ptr_Function__arr_int_uint_17 Function
+        %ref = OpVariable %_ptr_Function__arr_int_uint_17 Function
+          %a = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+         %ok = OpVariable %_ptr_Function_bool Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+         %51 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %52 = OpLoad %int %51
+         %53 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %54 = OpLoad %int %53
+         %55 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %56 = OpLoad %int %55
+         %57 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %58 = OpLoad %int %57
+         %59 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %60 = OpLoad %int %59
+         %61 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %62 = OpLoad %int %61
+         %63 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %64 = OpLoad %int %63
+         %65 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %66 = OpLoad %int %65
+         %67 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %68 = OpLoad %int %67
+         %69 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %70 = OpLoad %int %69
+         %71 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %72 = OpLoad %int %71
+         %73 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %74 = OpLoad %int %73
+         %75 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %76 = OpLoad %int %75
+         %77 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %78 = OpLoad %int %77
+         %79 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %80 = OpLoad %int %79
+         %81 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %82 = OpLoad %int %81
+         %83 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %84 = OpLoad %int %83
+         %85 = OpCompositeConstruct %_arr_int_uint_17 %52 %54 %56 %58 %60 %62 %64 %66 %68 %70 %72 %74 %76 %78 %80 %82 %84
+               OpStore %A %85
+         %86 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %87 = OpLoad %int %86
+         %88 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_4
+         %89 = OpLoad %int %88
+         %90 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_5
+         %91 = OpLoad %int %90
+         %92 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_6
+         %93 = OpLoad %int %92
+         %94 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_7
+         %95 = OpLoad %int %94
+         %96 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_8
+         %97 = OpLoad %int %96
+         %98 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_9
+         %99 = OpLoad %int %98
+        %100 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_10
+        %101 = OpLoad %int %100
+        %102 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_11
+        %103 = OpLoad %int %102
+        %104 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_12
+        %105 = OpLoad %int %104
+        %106 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_13
+        %107 = OpLoad %int %106
+        %108 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_14
+        %109 = OpLoad %int %108
+        %110 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_15
+        %111 = OpLoad %int %110
+        %112 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_16
+        %113 = OpLoad %int %112
+        %114 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_17
+        %115 = OpLoad %int %114
+        %116 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_18
+        %117 = OpLoad %int %116
+        %118 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+        %119 = OpLoad %int %118
+        %120 = OpCompositeConstruct %_arr_int_uint_17 %87 %89 %91 %93 %95 %97 %99 %101 %103 %105 %107 %109 %111 %113 %115 %117 %119
+               OpStore %ref %120
+        %121 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+        %122 = OpLoad %int %121
+               OpStore %a %122
+        %123 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+        %124 = OpLoad %int %123
+               OpStore %i %124
+               OpBranch %125
+        %125 = OpLabel
+               OpLoopMerge %126 %127 None
+               OpBranch %128
+        %128 = OpLabel
+        %129 = OpLoad %int %i
+        %130 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+        %131 = OpLoad %int %130
+        %132 = OpSLessThan %bool %129 %131
+               OpBranchConditional %132 %133 %126
+        %133 = OpLabel
+        %134 = OpLoad %int %i
+        %135 = OpLoad %int %a
+        %136 = OpISub %int %135 %int_1
+               OpStore %a %136
+        %137 = OpAccessChain %_ptr_Function_int %A %134
+               OpStore %137 %135
+        %138 = OpLoad %int %i
+        %139 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+        %140 = OpLoad %int %139
+        %141 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_18
+        %142 = OpLoad %int %141
+        %143 = OpExtInst %int %1 SClamp %138 %140 %142
+        %144 = OpLoad %int %i
+        %145 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+        %146 = OpLoad %int %145
+        %147 = OpIAdd %int %144 %146
+        %148 = OpAccessChain %_ptr_Function_int %A %143
+               OpStore %148 %147
+               OpBranch %127
+        %127 = OpLabel
+        %149 = OpLoad %int %i
+        %150 = OpIAdd %int %149 %int_1
+               OpStore %i %150
+               OpBranch %125
+        %126 = OpLabel
+               OpStore %ok %true
+        %151 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+        %152 = OpLoad %int %151
+               OpStore %i_0 %152
+               OpBranch %153
+        %153 = OpLabel
+               OpLoopMerge %154 %155 None
+               OpBranch %156
+        %156 = OpLabel
+        %157 = OpLoad %int %i_0
+        %158 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+        %159 = OpLoad %int %158
+        %160 = OpSLessThan %bool %157 %159
+               OpBranchConditional %160 %161 %154
+        %161 = OpLabel
+        %162 = OpLoad %int %i_0
+        %163 = OpAccessChain %_ptr_Function_int %A %162
+        %164 = OpLoad %int %163
+        %165 = OpLoad %int %i_0
+        %166 = OpAccessChain %_ptr_Function_int %ref %165
+        %167 = OpLoad %int %166
+        %168 = OpINotEqual %bool %164 %167
+               OpSelectionMerge %169 None
+               OpBranchConditional %168 %170 %169
+        %170 = OpLabel
+               OpStore %ok %false
+               OpBranch %169
+        %169 = OpLabel
+               OpBranch %155
+        %155 = OpLabel
+        %171 = OpLoad %int %i_0
+        %172 = OpIAdd %int %171 %int_1
+               OpStore %i_0 %172
+               OpBranch %153
+        %154 = OpLabel
+        %173 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+        %174 = OpLoad %int %173
+        %175 = OpConvertSToF %float %174
+        %176 = OpCompositeConstruct %v4float %175 %175 %175 %175
+               OpStore %_GLF_color %176
+        %177 = OpLoad %bool %ok
+               OpSelectionMerge %178 None
+               OpBranchConditional %177 %179 %178
+        %179 = OpLabel
+        %180 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+        %181 = OpLoad %int %180
+        %182 = OpConvertSToF %float %181
+        %183 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+        %184 = OpLoad %int %183
+        %185 = OpConvertSToF %float %184
+        %186 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+        %187 = OpLoad %int %186
+        %188 = OpConvertSToF %float %187
+        %189 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+        %190 = OpLoad %int %189
+        %191 = OpConvertSToF %float %190
+        %192 = OpCompositeConstruct %v4float %182 %185 %188 %191
+               OpStore %_GLF_color %192
+               OpBranch %178
+        %178 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nir-array-access/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-nir-array-access/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..9e560db
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nir-array-access/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,120 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[19];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int A[17] = (int[17])0;
+  int ref[17] = (int[17])0;
+  int a = 0;
+  int i = 0;
+  bool ok = false;
+  int i_1 = 0;
+  const int x_52 = asint(x_6[2].x);
+  const int x_54 = asint(x_6[2].x);
+  const int x_56 = asint(x_6[2].x);
+  const int x_58 = asint(x_6[2].x);
+  const int x_60 = asint(x_6[2].x);
+  const int x_62 = asint(x_6[2].x);
+  const int x_64 = asint(x_6[2].x);
+  const int x_66 = asint(x_6[2].x);
+  const int x_68 = asint(x_6[2].x);
+  const int x_70 = asint(x_6[2].x);
+  const int x_72 = asint(x_6[2].x);
+  const int x_74 = asint(x_6[2].x);
+  const int x_76 = asint(x_6[2].x);
+  const int x_78 = asint(x_6[2].x);
+  const int x_80 = asint(x_6[2].x);
+  const int x_82 = asint(x_6[2].x);
+  const int x_84 = asint(x_6[2].x);
+  const int tint_symbol_3[17] = {x_52, x_54, x_56, x_58, x_60, x_62, x_64, x_66, x_68, x_70, x_72, x_74, x_76, x_78, x_80, x_82, x_84};
+  A = tint_symbol_3;
+  const int x_87 = asint(x_6[3].x);
+  const int x_89 = asint(x_6[4].x);
+  const int x_91 = asint(x_6[5].x);
+  const int x_93 = asint(x_6[6].x);
+  const int x_95 = asint(x_6[7].x);
+  const int x_97 = asint(x_6[8].x);
+  const int x_99 = asint(x_6[9].x);
+  const int x_101 = asint(x_6[10].x);
+  const int x_103 = asint(x_6[11].x);
+  const int x_105 = asint(x_6[12].x);
+  const int x_107 = asint(x_6[13].x);
+  const int x_109 = asint(x_6[14].x);
+  const int x_111 = asint(x_6[15].x);
+  const int x_113 = asint(x_6[16].x);
+  const int x_115 = asint(x_6[17].x);
+  const int x_117 = asint(x_6[18].x);
+  const int x_119 = asint(x_6[1].x);
+  const int tint_symbol_4[17] = {x_87, x_89, x_91, x_93, x_95, x_97, x_99, x_101, x_103, x_105, x_107, x_109, x_111, x_113, x_115, x_117, x_119};
+  ref = tint_symbol_4;
+  const int x_122 = asint(x_6[2].x);
+  a = x_122;
+  const int x_124 = asint(x_6[2].x);
+  i = x_124;
+  while (true) {
+    const int x_129 = i;
+    const int x_131 = asint(x_6[1].x);
+    if ((x_129 < x_131)) {
+    } else {
+      break;
+    }
+    const int x_134 = i;
+    const int x_135 = a;
+    a = (x_135 - 1);
+    A[x_134] = x_135;
+    const int x_138 = i;
+    const int x_140 = asint(x_6[2].x);
+    const int x_142 = asint(x_6[18].x);
+    const int x_144 = i;
+    const int x_146 = asint(x_6[3].x);
+    A[clamp(x_138, x_140, x_142)] = (x_144 + x_146);
+    {
+      i = (i + 1);
+    }
+  }
+  ok = true;
+  const int x_152 = asint(x_6[2].x);
+  i_1 = x_152;
+  while (true) {
+    const int x_157 = i_1;
+    const int x_159 = asint(x_6[1].x);
+    if ((x_157 < x_159)) {
+    } else {
+      break;
+    }
+    const int x_164 = A[i_1];
+    const int x_167 = ref[i_1];
+    if ((x_164 != x_167)) {
+      ok = false;
+    }
+    {
+      i_1 = (i_1 + 1);
+    }
+  }
+  const int x_174 = asint(x_6[2].x);
+  const float x_175 = float(x_174);
+  x_GLF_color = float4(x_175, x_175, x_175, x_175);
+  if (ok) {
+    const int x_181 = asint(x_6[3].x);
+    const int x_184 = asint(x_6[2].x);
+    const int x_187 = asint(x_6[2].x);
+    const int x_190 = asint(x_6[3].x);
+    x_GLF_color = float4(float(x_181), float(x_184), float(x_187), float(x_190));
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nir-array-access/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-nir-array-access/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..5993503
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nir-array-access/0-opt.spvasm.expected.msl
@@ -0,0 +1,138 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[19];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_1 {
+  int arr[17];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_6) {
+  tint_array_wrapper_1 A = {};
+  tint_array_wrapper_1 ref = {};
+  int a = 0;
+  int i = 0;
+  bool ok = false;
+  int i_1 = 0;
+  int const x_52 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_54 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_56 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_58 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_60 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_62 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_64 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_66 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_68 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_70 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_72 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_74 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_76 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_78 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_80 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_82 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_84 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  tint_array_wrapper_1 const tint_symbol_3 = {.arr={x_52, x_54, x_56, x_58, x_60, x_62, x_64, x_66, x_68, x_70, x_72, x_74, x_76, x_78, x_80, x_82, x_84}};
+  A = tint_symbol_3;
+  int const x_87 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  int const x_89 = x_6.x_GLF_uniform_int_values.arr[4].el;
+  int const x_91 = x_6.x_GLF_uniform_int_values.arr[5].el;
+  int const x_93 = x_6.x_GLF_uniform_int_values.arr[6].el;
+  int const x_95 = x_6.x_GLF_uniform_int_values.arr[7].el;
+  int const x_97 = x_6.x_GLF_uniform_int_values.arr[8].el;
+  int const x_99 = x_6.x_GLF_uniform_int_values.arr[9].el;
+  int const x_101 = x_6.x_GLF_uniform_int_values.arr[10].el;
+  int const x_103 = x_6.x_GLF_uniform_int_values.arr[11].el;
+  int const x_105 = x_6.x_GLF_uniform_int_values.arr[12].el;
+  int const x_107 = x_6.x_GLF_uniform_int_values.arr[13].el;
+  int const x_109 = x_6.x_GLF_uniform_int_values.arr[14].el;
+  int const x_111 = x_6.x_GLF_uniform_int_values.arr[15].el;
+  int const x_113 = x_6.x_GLF_uniform_int_values.arr[16].el;
+  int const x_115 = x_6.x_GLF_uniform_int_values.arr[17].el;
+  int const x_117 = x_6.x_GLF_uniform_int_values.arr[18].el;
+  int const x_119 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  tint_array_wrapper_1 const tint_symbol_4 = {.arr={x_87, x_89, x_91, x_93, x_95, x_97, x_99, x_101, x_103, x_105, x_107, x_109, x_111, x_113, x_115, x_117, x_119}};
+  ref = tint_symbol_4;
+  int const x_122 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  a = x_122;
+  int const x_124 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  i = x_124;
+  while (true) {
+    int const x_129 = i;
+    int const x_131 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    if ((x_129 < x_131)) {
+    } else {
+      break;
+    }
+    int const x_134 = i;
+    int const x_135 = a;
+    a = (x_135 - 1);
+    A.arr[x_134] = x_135;
+    int const x_138 = i;
+    int const x_140 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_142 = x_6.x_GLF_uniform_int_values.arr[18].el;
+    int const x_144 = i;
+    int const x_146 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    A.arr[clamp(x_138, x_140, x_142)] = (x_144 + x_146);
+    {
+      int const x_149 = i;
+      i = (x_149 + 1);
+    }
+  }
+  ok = true;
+  int const x_152 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  i_1 = x_152;
+  while (true) {
+    int const x_157 = i_1;
+    int const x_159 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    if ((x_157 < x_159)) {
+    } else {
+      break;
+    }
+    int const x_162 = i_1;
+    int const x_164 = A.arr[x_162];
+    int const x_165 = i_1;
+    int const x_167 = ref.arr[x_165];
+    if ((x_164 != x_167)) {
+      ok = false;
+    }
+    {
+      int const x_171 = i_1;
+      i_1 = (x_171 + 1);
+    }
+  }
+  int const x_174 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  float const x_175 = float(x_174);
+  *(tint_symbol_6) = float4(x_175, x_175, x_175, x_175);
+  bool const x_177 = ok;
+  if (x_177) {
+    int const x_181 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    int const x_184 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_187 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_190 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    *(tint_symbol_6) = float4(float(x_181), float(x_184), float(x_187), float(x_190));
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  main_1(x_6, &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nir-array-access/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-nir-array-access/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..794d877
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nir-array-access/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,294 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 215
+; Schema: 0
+               OpCapability Shader
+        %152 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %A "A"
+               OpName %ref "ref"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %ok "ok"
+               OpName %i_1 "i_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_19 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_17 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_19 = OpConstant %uint 19
+%_arr_int_uint_19 = OpTypeArray %int %uint_19
+       %buf0 = OpTypeStruct %_arr_int_uint_19
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+    %uint_17 = OpConstant %uint 17
+%_arr_int_uint_17 = OpTypeArray %int %uint_17
+%_ptr_Function__arr_int_uint_17 = OpTypePointer Function %_arr_int_uint_17
+         %23 = OpConstantNull %_arr_int_uint_17
+%_ptr_Function_int = OpTypePointer Function %int
+         %27 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %32 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+      %int_9 = OpConstant %int 9
+     %int_10 = OpConstant %int 10
+     %int_11 = OpConstant %int 11
+     %int_12 = OpConstant %int 12
+     %int_13 = OpConstant %int 13
+     %int_14 = OpConstant %int 14
+     %int_15 = OpConstant %int 15
+     %int_16 = OpConstant %int 16
+     %int_17 = OpConstant %int 17
+     %int_18 = OpConstant %int 18
+      %int_1 = OpConstant %int 1
+       %true = OpConstantTrue %bool
+      %false = OpConstantFalse %bool
+   %main_out = OpTypeStruct %v4float
+        %203 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %A = OpVariable %_ptr_Function__arr_int_uint_17 Function %23
+        %ref = OpVariable %_ptr_Function__arr_int_uint_17 Function %23
+          %a = OpVariable %_ptr_Function_int Function %27
+          %i = OpVariable %_ptr_Function_int Function %27
+         %ok = OpVariable %_ptr_Function_bool Function %32
+        %i_1 = OpVariable %_ptr_Function_int Function %27
+         %37 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %38 = OpLoad %int %37
+         %39 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %40 = OpLoad %int %39
+         %41 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %42 = OpLoad %int %41
+         %43 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %44 = OpLoad %int %43
+         %45 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %46 = OpLoad %int %45
+         %47 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %48 = OpLoad %int %47
+         %49 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %50 = OpLoad %int %49
+         %51 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %52 = OpLoad %int %51
+         %53 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %54 = OpLoad %int %53
+         %55 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %56 = OpLoad %int %55
+         %57 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %58 = OpLoad %int %57
+         %59 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %60 = OpLoad %int %59
+         %61 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %62 = OpLoad %int %61
+         %63 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %64 = OpLoad %int %63
+         %65 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %66 = OpLoad %int %65
+         %67 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %68 = OpLoad %int %67
+         %69 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %70 = OpLoad %int %69
+         %71 = OpCompositeConstruct %_arr_int_uint_17 %38 %40 %42 %44 %46 %48 %50 %52 %54 %56 %58 %60 %62 %64 %66 %68 %70
+               OpStore %A %71
+         %73 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %74 = OpLoad %int %73
+         %76 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+         %77 = OpLoad %int %76
+         %79 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_5
+         %80 = OpLoad %int %79
+         %82 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_6
+         %83 = OpLoad %int %82
+         %85 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_7
+         %86 = OpLoad %int %85
+         %88 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_8
+         %89 = OpLoad %int %88
+         %91 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_9
+         %92 = OpLoad %int %91
+         %94 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_10
+         %95 = OpLoad %int %94
+         %97 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_11
+         %98 = OpLoad %int %97
+        %100 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_12
+        %101 = OpLoad %int %100
+        %103 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_13
+        %104 = OpLoad %int %103
+        %106 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_14
+        %107 = OpLoad %int %106
+        %109 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_15
+        %110 = OpLoad %int %109
+        %112 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_16
+        %113 = OpLoad %int %112
+        %115 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_17
+        %116 = OpLoad %int %115
+        %118 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_18
+        %119 = OpLoad %int %118
+        %121 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %122 = OpLoad %int %121
+        %123 = OpCompositeConstruct %_arr_int_uint_17 %74 %77 %80 %83 %86 %89 %92 %95 %98 %101 %104 %107 %110 %113 %116 %119 %122
+               OpStore %ref %123
+        %124 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %125 = OpLoad %int %124
+               OpStore %a %125
+        %126 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %127 = OpLoad %int %126
+               OpStore %i %127
+               OpBranch %128
+        %128 = OpLabel
+               OpLoopMerge %129 %130 None
+               OpBranch %131
+        %131 = OpLabel
+        %132 = OpLoad %int %i
+        %133 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %134 = OpLoad %int %133
+        %135 = OpSLessThan %bool %132 %134
+               OpSelectionMerge %136 None
+               OpBranchConditional %135 %137 %138
+        %137 = OpLabel
+               OpBranch %136
+        %138 = OpLabel
+               OpBranch %129
+        %136 = OpLabel
+        %139 = OpLoad %int %i
+        %140 = OpLoad %int %a
+        %141 = OpISub %int %140 %int_1
+               OpStore %a %141
+        %142 = OpAccessChain %_ptr_Function_int %A %139
+               OpStore %142 %140
+        %143 = OpLoad %int %i
+        %144 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %145 = OpLoad %int %144
+        %146 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_18
+        %147 = OpLoad %int %146
+        %148 = OpLoad %int %i
+        %149 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+        %150 = OpLoad %int %149
+        %151 = OpExtInst %int %152 SClamp %143 %145 %147
+        %153 = OpAccessChain %_ptr_Function_int %A %151
+        %154 = OpIAdd %int %148 %150
+               OpStore %153 %154
+               OpBranch %130
+        %130 = OpLabel
+        %155 = OpLoad %int %i
+        %156 = OpIAdd %int %155 %int_1
+               OpStore %i %156
+               OpBranch %128
+        %129 = OpLabel
+               OpStore %ok %true
+        %158 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %159 = OpLoad %int %158
+               OpStore %i_1 %159
+               OpBranch %160
+        %160 = OpLabel
+               OpLoopMerge %161 %162 None
+               OpBranch %163
+        %163 = OpLabel
+        %164 = OpLoad %int %i_1
+        %165 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %166 = OpLoad %int %165
+        %167 = OpSLessThan %bool %164 %166
+               OpSelectionMerge %168 None
+               OpBranchConditional %167 %169 %170
+        %169 = OpLabel
+               OpBranch %168
+        %170 = OpLabel
+               OpBranch %161
+        %168 = OpLabel
+        %171 = OpLoad %int %i_1
+        %172 = OpAccessChain %_ptr_Function_int %A %171
+        %173 = OpLoad %int %172
+        %174 = OpLoad %int %i_1
+        %175 = OpAccessChain %_ptr_Function_int %ref %174
+        %176 = OpLoad %int %175
+        %177 = OpINotEqual %bool %173 %176
+               OpSelectionMerge %178 None
+               OpBranchConditional %177 %179 %178
+        %179 = OpLabel
+               OpStore %ok %false
+               OpBranch %178
+        %178 = OpLabel
+               OpBranch %162
+        %162 = OpLabel
+        %181 = OpLoad %int %i_1
+        %182 = OpIAdd %int %181 %int_1
+               OpStore %i_1 %182
+               OpBranch %160
+        %161 = OpLabel
+        %183 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %184 = OpLoad %int %183
+        %185 = OpConvertSToF %float %184
+        %186 = OpCompositeConstruct %v4float %185 %185 %185 %185
+               OpStore %x_GLF_color %186
+        %187 = OpLoad %bool %ok
+               OpSelectionMerge %188 None
+               OpBranchConditional %187 %189 %188
+        %189 = OpLabel
+        %190 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+        %191 = OpLoad %int %190
+        %192 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %193 = OpLoad %int %192
+        %194 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %195 = OpLoad %int %194
+        %196 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+        %197 = OpLoad %int %196
+        %198 = OpConvertSToF %float %191
+        %199 = OpConvertSToF %float %193
+        %200 = OpConvertSToF %float %195
+        %201 = OpConvertSToF %float %197
+        %202 = OpCompositeConstruct %v4float %198 %199 %200 %201
+               OpStore %x_GLF_color %202
+               OpBranch %188
+        %188 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %203
+%tint_symbol = OpFunctionParameter %main_out
+        %207 = OpLabel
+        %208 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %208
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %210 = OpLabel
+        %211 = OpFunctionCall %void %main_1
+        %213 = OpLoad %v4float %x_GLF_color
+        %214 = OpCompositeConstruct %main_out %213
+        %212 = OpFunctionCall %void %tint_symbol_2 %214
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nir-array-access/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-nir-array-access/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..464bdec
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nir-array-access/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,128 @@
+type Arr = [[stride(16)]] array<i32, 19>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var A : array<i32, 17>;
+  var ref : array<i32, 17>;
+  var a : i32;
+  var i : i32;
+  var ok : bool;
+  var i_1 : i32;
+  let x_52 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_54 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_56 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_58 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_60 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_62 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_64 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_66 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_68 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_70 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_72 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_74 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_76 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_78 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_80 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_82 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_84 : i32 = x_6.x_GLF_uniform_int_values[2];
+  A = array<i32, 17>(x_52, x_54, x_56, x_58, x_60, x_62, x_64, x_66, x_68, x_70, x_72, x_74, x_76, x_78, x_80, x_82, x_84);
+  let x_87 : i32 = x_6.x_GLF_uniform_int_values[3];
+  let x_89 : i32 = x_6.x_GLF_uniform_int_values[4];
+  let x_91 : i32 = x_6.x_GLF_uniform_int_values[5];
+  let x_93 : i32 = x_6.x_GLF_uniform_int_values[6];
+  let x_95 : i32 = x_6.x_GLF_uniform_int_values[7];
+  let x_97 : i32 = x_6.x_GLF_uniform_int_values[8];
+  let x_99 : i32 = x_6.x_GLF_uniform_int_values[9];
+  let x_101 : i32 = x_6.x_GLF_uniform_int_values[10];
+  let x_103 : i32 = x_6.x_GLF_uniform_int_values[11];
+  let x_105 : i32 = x_6.x_GLF_uniform_int_values[12];
+  let x_107 : i32 = x_6.x_GLF_uniform_int_values[13];
+  let x_109 : i32 = x_6.x_GLF_uniform_int_values[14];
+  let x_111 : i32 = x_6.x_GLF_uniform_int_values[15];
+  let x_113 : i32 = x_6.x_GLF_uniform_int_values[16];
+  let x_115 : i32 = x_6.x_GLF_uniform_int_values[17];
+  let x_117 : i32 = x_6.x_GLF_uniform_int_values[18];
+  let x_119 : i32 = x_6.x_GLF_uniform_int_values[1];
+  ref = array<i32, 17>(x_87, x_89, x_91, x_93, x_95, x_97, x_99, x_101, x_103, x_105, x_107, x_109, x_111, x_113, x_115, x_117, x_119);
+  let x_122 : i32 = x_6.x_GLF_uniform_int_values[2];
+  a = x_122;
+  let x_124 : i32 = x_6.x_GLF_uniform_int_values[2];
+  i = x_124;
+  loop {
+    let x_129 : i32 = i;
+    let x_131 : i32 = x_6.x_GLF_uniform_int_values[1];
+    if ((x_129 < x_131)) {
+    } else {
+      break;
+    }
+    let x_134 : i32 = i;
+    let x_135 : i32 = a;
+    a = (x_135 - 1);
+    A[x_134] = x_135;
+    let x_138 : i32 = i;
+    let x_140 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_142 : i32 = x_6.x_GLF_uniform_int_values[18];
+    let x_144 : i32 = i;
+    let x_146 : i32 = x_6.x_GLF_uniform_int_values[3];
+    A[clamp(x_138, x_140, x_142)] = (x_144 + x_146);
+
+    continuing {
+      let x_149 : i32 = i;
+      i = (x_149 + 1);
+    }
+  }
+  ok = true;
+  let x_152 : i32 = x_6.x_GLF_uniform_int_values[2];
+  i_1 = x_152;
+  loop {
+    let x_157 : i32 = i_1;
+    let x_159 : i32 = x_6.x_GLF_uniform_int_values[1];
+    if ((x_157 < x_159)) {
+    } else {
+      break;
+    }
+    let x_162 : i32 = i_1;
+    let x_164 : i32 = A[x_162];
+    let x_165 : i32 = i_1;
+    let x_167 : i32 = ref[x_165];
+    if ((x_164 != x_167)) {
+      ok = false;
+    }
+
+    continuing {
+      let x_171 : i32 = i_1;
+      i_1 = (x_171 + 1);
+    }
+  }
+  let x_174 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_175 : f32 = f32(x_174);
+  x_GLF_color = vec4<f32>(x_175, x_175, x_175, x_175);
+  let x_177 : bool = ok;
+  if (x_177) {
+    let x_181 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_184 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_187 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_190 : i32 = x_6.x_GLF_uniform_int_values[3];
+    x_GLF_color = vec4<f32>(f32(x_181), f32(x_184), f32(x_187), f32(x_190));
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nir-array-access/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-nir-array-access/0-opt.wgsl
new file mode 100644
index 0000000..464bdec
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nir-array-access/0-opt.wgsl
@@ -0,0 +1,128 @@
+type Arr = [[stride(16)]] array<i32, 19>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var A : array<i32, 17>;
+  var ref : array<i32, 17>;
+  var a : i32;
+  var i : i32;
+  var ok : bool;
+  var i_1 : i32;
+  let x_52 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_54 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_56 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_58 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_60 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_62 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_64 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_66 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_68 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_70 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_72 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_74 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_76 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_78 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_80 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_82 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_84 : i32 = x_6.x_GLF_uniform_int_values[2];
+  A = array<i32, 17>(x_52, x_54, x_56, x_58, x_60, x_62, x_64, x_66, x_68, x_70, x_72, x_74, x_76, x_78, x_80, x_82, x_84);
+  let x_87 : i32 = x_6.x_GLF_uniform_int_values[3];
+  let x_89 : i32 = x_6.x_GLF_uniform_int_values[4];
+  let x_91 : i32 = x_6.x_GLF_uniform_int_values[5];
+  let x_93 : i32 = x_6.x_GLF_uniform_int_values[6];
+  let x_95 : i32 = x_6.x_GLF_uniform_int_values[7];
+  let x_97 : i32 = x_6.x_GLF_uniform_int_values[8];
+  let x_99 : i32 = x_6.x_GLF_uniform_int_values[9];
+  let x_101 : i32 = x_6.x_GLF_uniform_int_values[10];
+  let x_103 : i32 = x_6.x_GLF_uniform_int_values[11];
+  let x_105 : i32 = x_6.x_GLF_uniform_int_values[12];
+  let x_107 : i32 = x_6.x_GLF_uniform_int_values[13];
+  let x_109 : i32 = x_6.x_GLF_uniform_int_values[14];
+  let x_111 : i32 = x_6.x_GLF_uniform_int_values[15];
+  let x_113 : i32 = x_6.x_GLF_uniform_int_values[16];
+  let x_115 : i32 = x_6.x_GLF_uniform_int_values[17];
+  let x_117 : i32 = x_6.x_GLF_uniform_int_values[18];
+  let x_119 : i32 = x_6.x_GLF_uniform_int_values[1];
+  ref = array<i32, 17>(x_87, x_89, x_91, x_93, x_95, x_97, x_99, x_101, x_103, x_105, x_107, x_109, x_111, x_113, x_115, x_117, x_119);
+  let x_122 : i32 = x_6.x_GLF_uniform_int_values[2];
+  a = x_122;
+  let x_124 : i32 = x_6.x_GLF_uniform_int_values[2];
+  i = x_124;
+  loop {
+    let x_129 : i32 = i;
+    let x_131 : i32 = x_6.x_GLF_uniform_int_values[1];
+    if ((x_129 < x_131)) {
+    } else {
+      break;
+    }
+    let x_134 : i32 = i;
+    let x_135 : i32 = a;
+    a = (x_135 - 1);
+    A[x_134] = x_135;
+    let x_138 : i32 = i;
+    let x_140 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_142 : i32 = x_6.x_GLF_uniform_int_values[18];
+    let x_144 : i32 = i;
+    let x_146 : i32 = x_6.x_GLF_uniform_int_values[3];
+    A[clamp(x_138, x_140, x_142)] = (x_144 + x_146);
+
+    continuing {
+      let x_149 : i32 = i;
+      i = (x_149 + 1);
+    }
+  }
+  ok = true;
+  let x_152 : i32 = x_6.x_GLF_uniform_int_values[2];
+  i_1 = x_152;
+  loop {
+    let x_157 : i32 = i_1;
+    let x_159 : i32 = x_6.x_GLF_uniform_int_values[1];
+    if ((x_157 < x_159)) {
+    } else {
+      break;
+    }
+    let x_162 : i32 = i_1;
+    let x_164 : i32 = A[x_162];
+    let x_165 : i32 = i_1;
+    let x_167 : i32 = ref[x_165];
+    if ((x_164 != x_167)) {
+      ok = false;
+    }
+
+    continuing {
+      let x_171 : i32 = i_1;
+      i_1 = (x_171 + 1);
+    }
+  }
+  let x_174 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_175 : f32 = f32(x_174);
+  x_GLF_color = vec4<f32>(x_175, x_175, x_175, x_175);
+  let x_177 : bool = ok;
+  if (x_177) {
+    let x_181 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_184 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_187 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_190 : i32 = x_6.x_GLF_uniform_int_values[3];
+    x_GLF_color = vec4<f32>(f32(x_181), f32(x_184), f32(x_187), f32(x_190));
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nir-array-access/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-nir-array-access/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..9e560db
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nir-array-access/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,120 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[19];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int A[17] = (int[17])0;
+  int ref[17] = (int[17])0;
+  int a = 0;
+  int i = 0;
+  bool ok = false;
+  int i_1 = 0;
+  const int x_52 = asint(x_6[2].x);
+  const int x_54 = asint(x_6[2].x);
+  const int x_56 = asint(x_6[2].x);
+  const int x_58 = asint(x_6[2].x);
+  const int x_60 = asint(x_6[2].x);
+  const int x_62 = asint(x_6[2].x);
+  const int x_64 = asint(x_6[2].x);
+  const int x_66 = asint(x_6[2].x);
+  const int x_68 = asint(x_6[2].x);
+  const int x_70 = asint(x_6[2].x);
+  const int x_72 = asint(x_6[2].x);
+  const int x_74 = asint(x_6[2].x);
+  const int x_76 = asint(x_6[2].x);
+  const int x_78 = asint(x_6[2].x);
+  const int x_80 = asint(x_6[2].x);
+  const int x_82 = asint(x_6[2].x);
+  const int x_84 = asint(x_6[2].x);
+  const int tint_symbol_3[17] = {x_52, x_54, x_56, x_58, x_60, x_62, x_64, x_66, x_68, x_70, x_72, x_74, x_76, x_78, x_80, x_82, x_84};
+  A = tint_symbol_3;
+  const int x_87 = asint(x_6[3].x);
+  const int x_89 = asint(x_6[4].x);
+  const int x_91 = asint(x_6[5].x);
+  const int x_93 = asint(x_6[6].x);
+  const int x_95 = asint(x_6[7].x);
+  const int x_97 = asint(x_6[8].x);
+  const int x_99 = asint(x_6[9].x);
+  const int x_101 = asint(x_6[10].x);
+  const int x_103 = asint(x_6[11].x);
+  const int x_105 = asint(x_6[12].x);
+  const int x_107 = asint(x_6[13].x);
+  const int x_109 = asint(x_6[14].x);
+  const int x_111 = asint(x_6[15].x);
+  const int x_113 = asint(x_6[16].x);
+  const int x_115 = asint(x_6[17].x);
+  const int x_117 = asint(x_6[18].x);
+  const int x_119 = asint(x_6[1].x);
+  const int tint_symbol_4[17] = {x_87, x_89, x_91, x_93, x_95, x_97, x_99, x_101, x_103, x_105, x_107, x_109, x_111, x_113, x_115, x_117, x_119};
+  ref = tint_symbol_4;
+  const int x_122 = asint(x_6[2].x);
+  a = x_122;
+  const int x_124 = asint(x_6[2].x);
+  i = x_124;
+  while (true) {
+    const int x_129 = i;
+    const int x_131 = asint(x_6[1].x);
+    if ((x_129 < x_131)) {
+    } else {
+      break;
+    }
+    const int x_134 = i;
+    const int x_135 = a;
+    a = (x_135 - 1);
+    A[x_134] = x_135;
+    const int x_138 = i;
+    const int x_140 = asint(x_6[2].x);
+    const int x_142 = asint(x_6[18].x);
+    const int x_144 = i;
+    const int x_146 = asint(x_6[3].x);
+    A[clamp(x_138, x_140, x_142)] = (x_144 + x_146);
+    {
+      i = (i + 1);
+    }
+  }
+  ok = true;
+  const int x_152 = asint(x_6[2].x);
+  i_1 = x_152;
+  while (true) {
+    const int x_157 = i_1;
+    const int x_159 = asint(x_6[1].x);
+    if ((x_157 < x_159)) {
+    } else {
+      break;
+    }
+    const int x_164 = A[i_1];
+    const int x_167 = ref[i_1];
+    if ((x_164 != x_167)) {
+      ok = false;
+    }
+    {
+      i_1 = (i_1 + 1);
+    }
+  }
+  const int x_174 = asint(x_6[2].x);
+  const float x_175 = float(x_174);
+  x_GLF_color = float4(x_175, x_175, x_175, x_175);
+  if (ok) {
+    const int x_181 = asint(x_6[3].x);
+    const int x_184 = asint(x_6[2].x);
+    const int x_187 = asint(x_6[2].x);
+    const int x_190 = asint(x_6[3].x);
+    x_GLF_color = float4(float(x_181), float(x_184), float(x_187), float(x_190));
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nir-array-access/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-nir-array-access/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..5993503
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nir-array-access/0-opt.wgsl.expected.msl
@@ -0,0 +1,138 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[19];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_1 {
+  int arr[17];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_6) {
+  tint_array_wrapper_1 A = {};
+  tint_array_wrapper_1 ref = {};
+  int a = 0;
+  int i = 0;
+  bool ok = false;
+  int i_1 = 0;
+  int const x_52 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_54 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_56 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_58 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_60 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_62 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_64 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_66 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_68 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_70 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_72 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_74 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_76 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_78 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_80 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_82 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_84 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  tint_array_wrapper_1 const tint_symbol_3 = {.arr={x_52, x_54, x_56, x_58, x_60, x_62, x_64, x_66, x_68, x_70, x_72, x_74, x_76, x_78, x_80, x_82, x_84}};
+  A = tint_symbol_3;
+  int const x_87 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  int const x_89 = x_6.x_GLF_uniform_int_values.arr[4].el;
+  int const x_91 = x_6.x_GLF_uniform_int_values.arr[5].el;
+  int const x_93 = x_6.x_GLF_uniform_int_values.arr[6].el;
+  int const x_95 = x_6.x_GLF_uniform_int_values.arr[7].el;
+  int const x_97 = x_6.x_GLF_uniform_int_values.arr[8].el;
+  int const x_99 = x_6.x_GLF_uniform_int_values.arr[9].el;
+  int const x_101 = x_6.x_GLF_uniform_int_values.arr[10].el;
+  int const x_103 = x_6.x_GLF_uniform_int_values.arr[11].el;
+  int const x_105 = x_6.x_GLF_uniform_int_values.arr[12].el;
+  int const x_107 = x_6.x_GLF_uniform_int_values.arr[13].el;
+  int const x_109 = x_6.x_GLF_uniform_int_values.arr[14].el;
+  int const x_111 = x_6.x_GLF_uniform_int_values.arr[15].el;
+  int const x_113 = x_6.x_GLF_uniform_int_values.arr[16].el;
+  int const x_115 = x_6.x_GLF_uniform_int_values.arr[17].el;
+  int const x_117 = x_6.x_GLF_uniform_int_values.arr[18].el;
+  int const x_119 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  tint_array_wrapper_1 const tint_symbol_4 = {.arr={x_87, x_89, x_91, x_93, x_95, x_97, x_99, x_101, x_103, x_105, x_107, x_109, x_111, x_113, x_115, x_117, x_119}};
+  ref = tint_symbol_4;
+  int const x_122 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  a = x_122;
+  int const x_124 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  i = x_124;
+  while (true) {
+    int const x_129 = i;
+    int const x_131 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    if ((x_129 < x_131)) {
+    } else {
+      break;
+    }
+    int const x_134 = i;
+    int const x_135 = a;
+    a = (x_135 - 1);
+    A.arr[x_134] = x_135;
+    int const x_138 = i;
+    int const x_140 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_142 = x_6.x_GLF_uniform_int_values.arr[18].el;
+    int const x_144 = i;
+    int const x_146 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    A.arr[clamp(x_138, x_140, x_142)] = (x_144 + x_146);
+    {
+      int const x_149 = i;
+      i = (x_149 + 1);
+    }
+  }
+  ok = true;
+  int const x_152 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  i_1 = x_152;
+  while (true) {
+    int const x_157 = i_1;
+    int const x_159 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    if ((x_157 < x_159)) {
+    } else {
+      break;
+    }
+    int const x_162 = i_1;
+    int const x_164 = A.arr[x_162];
+    int const x_165 = i_1;
+    int const x_167 = ref.arr[x_165];
+    if ((x_164 != x_167)) {
+      ok = false;
+    }
+    {
+      int const x_171 = i_1;
+      i_1 = (x_171 + 1);
+    }
+  }
+  int const x_174 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  float const x_175 = float(x_174);
+  *(tint_symbol_6) = float4(x_175, x_175, x_175, x_175);
+  bool const x_177 = ok;
+  if (x_177) {
+    int const x_181 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    int const x_184 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_187 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_190 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    *(tint_symbol_6) = float4(float(x_181), float(x_184), float(x_187), float(x_190));
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  main_1(x_6, &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nir-array-access/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-nir-array-access/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..794d877
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nir-array-access/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,294 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 215
+; Schema: 0
+               OpCapability Shader
+        %152 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %A "A"
+               OpName %ref "ref"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %ok "ok"
+               OpName %i_1 "i_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_19 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_17 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_19 = OpConstant %uint 19
+%_arr_int_uint_19 = OpTypeArray %int %uint_19
+       %buf0 = OpTypeStruct %_arr_int_uint_19
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+    %uint_17 = OpConstant %uint 17
+%_arr_int_uint_17 = OpTypeArray %int %uint_17
+%_ptr_Function__arr_int_uint_17 = OpTypePointer Function %_arr_int_uint_17
+         %23 = OpConstantNull %_arr_int_uint_17
+%_ptr_Function_int = OpTypePointer Function %int
+         %27 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %32 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+      %int_9 = OpConstant %int 9
+     %int_10 = OpConstant %int 10
+     %int_11 = OpConstant %int 11
+     %int_12 = OpConstant %int 12
+     %int_13 = OpConstant %int 13
+     %int_14 = OpConstant %int 14
+     %int_15 = OpConstant %int 15
+     %int_16 = OpConstant %int 16
+     %int_17 = OpConstant %int 17
+     %int_18 = OpConstant %int 18
+      %int_1 = OpConstant %int 1
+       %true = OpConstantTrue %bool
+      %false = OpConstantFalse %bool
+   %main_out = OpTypeStruct %v4float
+        %203 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %A = OpVariable %_ptr_Function__arr_int_uint_17 Function %23
+        %ref = OpVariable %_ptr_Function__arr_int_uint_17 Function %23
+          %a = OpVariable %_ptr_Function_int Function %27
+          %i = OpVariable %_ptr_Function_int Function %27
+         %ok = OpVariable %_ptr_Function_bool Function %32
+        %i_1 = OpVariable %_ptr_Function_int Function %27
+         %37 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %38 = OpLoad %int %37
+         %39 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %40 = OpLoad %int %39
+         %41 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %42 = OpLoad %int %41
+         %43 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %44 = OpLoad %int %43
+         %45 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %46 = OpLoad %int %45
+         %47 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %48 = OpLoad %int %47
+         %49 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %50 = OpLoad %int %49
+         %51 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %52 = OpLoad %int %51
+         %53 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %54 = OpLoad %int %53
+         %55 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %56 = OpLoad %int %55
+         %57 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %58 = OpLoad %int %57
+         %59 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %60 = OpLoad %int %59
+         %61 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %62 = OpLoad %int %61
+         %63 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %64 = OpLoad %int %63
+         %65 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %66 = OpLoad %int %65
+         %67 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %68 = OpLoad %int %67
+         %69 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %70 = OpLoad %int %69
+         %71 = OpCompositeConstruct %_arr_int_uint_17 %38 %40 %42 %44 %46 %48 %50 %52 %54 %56 %58 %60 %62 %64 %66 %68 %70
+               OpStore %A %71
+         %73 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %74 = OpLoad %int %73
+         %76 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+         %77 = OpLoad %int %76
+         %79 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_5
+         %80 = OpLoad %int %79
+         %82 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_6
+         %83 = OpLoad %int %82
+         %85 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_7
+         %86 = OpLoad %int %85
+         %88 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_8
+         %89 = OpLoad %int %88
+         %91 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_9
+         %92 = OpLoad %int %91
+         %94 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_10
+         %95 = OpLoad %int %94
+         %97 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_11
+         %98 = OpLoad %int %97
+        %100 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_12
+        %101 = OpLoad %int %100
+        %103 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_13
+        %104 = OpLoad %int %103
+        %106 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_14
+        %107 = OpLoad %int %106
+        %109 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_15
+        %110 = OpLoad %int %109
+        %112 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_16
+        %113 = OpLoad %int %112
+        %115 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_17
+        %116 = OpLoad %int %115
+        %118 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_18
+        %119 = OpLoad %int %118
+        %121 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %122 = OpLoad %int %121
+        %123 = OpCompositeConstruct %_arr_int_uint_17 %74 %77 %80 %83 %86 %89 %92 %95 %98 %101 %104 %107 %110 %113 %116 %119 %122
+               OpStore %ref %123
+        %124 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %125 = OpLoad %int %124
+               OpStore %a %125
+        %126 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %127 = OpLoad %int %126
+               OpStore %i %127
+               OpBranch %128
+        %128 = OpLabel
+               OpLoopMerge %129 %130 None
+               OpBranch %131
+        %131 = OpLabel
+        %132 = OpLoad %int %i
+        %133 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %134 = OpLoad %int %133
+        %135 = OpSLessThan %bool %132 %134
+               OpSelectionMerge %136 None
+               OpBranchConditional %135 %137 %138
+        %137 = OpLabel
+               OpBranch %136
+        %138 = OpLabel
+               OpBranch %129
+        %136 = OpLabel
+        %139 = OpLoad %int %i
+        %140 = OpLoad %int %a
+        %141 = OpISub %int %140 %int_1
+               OpStore %a %141
+        %142 = OpAccessChain %_ptr_Function_int %A %139
+               OpStore %142 %140
+        %143 = OpLoad %int %i
+        %144 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %145 = OpLoad %int %144
+        %146 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_18
+        %147 = OpLoad %int %146
+        %148 = OpLoad %int %i
+        %149 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+        %150 = OpLoad %int %149
+        %151 = OpExtInst %int %152 SClamp %143 %145 %147
+        %153 = OpAccessChain %_ptr_Function_int %A %151
+        %154 = OpIAdd %int %148 %150
+               OpStore %153 %154
+               OpBranch %130
+        %130 = OpLabel
+        %155 = OpLoad %int %i
+        %156 = OpIAdd %int %155 %int_1
+               OpStore %i %156
+               OpBranch %128
+        %129 = OpLabel
+               OpStore %ok %true
+        %158 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %159 = OpLoad %int %158
+               OpStore %i_1 %159
+               OpBranch %160
+        %160 = OpLabel
+               OpLoopMerge %161 %162 None
+               OpBranch %163
+        %163 = OpLabel
+        %164 = OpLoad %int %i_1
+        %165 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %166 = OpLoad %int %165
+        %167 = OpSLessThan %bool %164 %166
+               OpSelectionMerge %168 None
+               OpBranchConditional %167 %169 %170
+        %169 = OpLabel
+               OpBranch %168
+        %170 = OpLabel
+               OpBranch %161
+        %168 = OpLabel
+        %171 = OpLoad %int %i_1
+        %172 = OpAccessChain %_ptr_Function_int %A %171
+        %173 = OpLoad %int %172
+        %174 = OpLoad %int %i_1
+        %175 = OpAccessChain %_ptr_Function_int %ref %174
+        %176 = OpLoad %int %175
+        %177 = OpINotEqual %bool %173 %176
+               OpSelectionMerge %178 None
+               OpBranchConditional %177 %179 %178
+        %179 = OpLabel
+               OpStore %ok %false
+               OpBranch %178
+        %178 = OpLabel
+               OpBranch %162
+        %162 = OpLabel
+        %181 = OpLoad %int %i_1
+        %182 = OpIAdd %int %181 %int_1
+               OpStore %i_1 %182
+               OpBranch %160
+        %161 = OpLabel
+        %183 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %184 = OpLoad %int %183
+        %185 = OpConvertSToF %float %184
+        %186 = OpCompositeConstruct %v4float %185 %185 %185 %185
+               OpStore %x_GLF_color %186
+        %187 = OpLoad %bool %ok
+               OpSelectionMerge %188 None
+               OpBranchConditional %187 %189 %188
+        %189 = OpLabel
+        %190 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+        %191 = OpLoad %int %190
+        %192 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %193 = OpLoad %int %192
+        %194 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %195 = OpLoad %int %194
+        %196 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+        %197 = OpLoad %int %196
+        %198 = OpConvertSToF %float %191
+        %199 = OpConvertSToF %float %193
+        %200 = OpConvertSToF %float %195
+        %201 = OpConvertSToF %float %197
+        %202 = OpCompositeConstruct %v4float %198 %199 %200 %201
+               OpStore %x_GLF_color %202
+               OpBranch %188
+        %188 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %203
+%tint_symbol = OpFunctionParameter %main_out
+        %207 = OpLabel
+        %208 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %208
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %210 = OpLabel
+        %211 = OpFunctionCall %void %main_1
+        %213 = OpLoad %v4float %x_GLF_color
+        %214 = OpCompositeConstruct %main_out %213
+        %212 = OpFunctionCall %void %tint_symbol_2 %214
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nir-array-access/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-nir-array-access/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..464bdec
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nir-array-access/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,128 @@
+type Arr = [[stride(16)]] array<i32, 19>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var A : array<i32, 17>;
+  var ref : array<i32, 17>;
+  var a : i32;
+  var i : i32;
+  var ok : bool;
+  var i_1 : i32;
+  let x_52 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_54 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_56 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_58 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_60 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_62 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_64 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_66 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_68 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_70 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_72 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_74 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_76 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_78 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_80 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_82 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_84 : i32 = x_6.x_GLF_uniform_int_values[2];
+  A = array<i32, 17>(x_52, x_54, x_56, x_58, x_60, x_62, x_64, x_66, x_68, x_70, x_72, x_74, x_76, x_78, x_80, x_82, x_84);
+  let x_87 : i32 = x_6.x_GLF_uniform_int_values[3];
+  let x_89 : i32 = x_6.x_GLF_uniform_int_values[4];
+  let x_91 : i32 = x_6.x_GLF_uniform_int_values[5];
+  let x_93 : i32 = x_6.x_GLF_uniform_int_values[6];
+  let x_95 : i32 = x_6.x_GLF_uniform_int_values[7];
+  let x_97 : i32 = x_6.x_GLF_uniform_int_values[8];
+  let x_99 : i32 = x_6.x_GLF_uniform_int_values[9];
+  let x_101 : i32 = x_6.x_GLF_uniform_int_values[10];
+  let x_103 : i32 = x_6.x_GLF_uniform_int_values[11];
+  let x_105 : i32 = x_6.x_GLF_uniform_int_values[12];
+  let x_107 : i32 = x_6.x_GLF_uniform_int_values[13];
+  let x_109 : i32 = x_6.x_GLF_uniform_int_values[14];
+  let x_111 : i32 = x_6.x_GLF_uniform_int_values[15];
+  let x_113 : i32 = x_6.x_GLF_uniform_int_values[16];
+  let x_115 : i32 = x_6.x_GLF_uniform_int_values[17];
+  let x_117 : i32 = x_6.x_GLF_uniform_int_values[18];
+  let x_119 : i32 = x_6.x_GLF_uniform_int_values[1];
+  ref = array<i32, 17>(x_87, x_89, x_91, x_93, x_95, x_97, x_99, x_101, x_103, x_105, x_107, x_109, x_111, x_113, x_115, x_117, x_119);
+  let x_122 : i32 = x_6.x_GLF_uniform_int_values[2];
+  a = x_122;
+  let x_124 : i32 = x_6.x_GLF_uniform_int_values[2];
+  i = x_124;
+  loop {
+    let x_129 : i32 = i;
+    let x_131 : i32 = x_6.x_GLF_uniform_int_values[1];
+    if ((x_129 < x_131)) {
+    } else {
+      break;
+    }
+    let x_134 : i32 = i;
+    let x_135 : i32 = a;
+    a = (x_135 - 1);
+    A[x_134] = x_135;
+    let x_138 : i32 = i;
+    let x_140 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_142 : i32 = x_6.x_GLF_uniform_int_values[18];
+    let x_144 : i32 = i;
+    let x_146 : i32 = x_6.x_GLF_uniform_int_values[3];
+    A[clamp(x_138, x_140, x_142)] = (x_144 + x_146);
+
+    continuing {
+      let x_149 : i32 = i;
+      i = (x_149 + 1);
+    }
+  }
+  ok = true;
+  let x_152 : i32 = x_6.x_GLF_uniform_int_values[2];
+  i_1 = x_152;
+  loop {
+    let x_157 : i32 = i_1;
+    let x_159 : i32 = x_6.x_GLF_uniform_int_values[1];
+    if ((x_157 < x_159)) {
+    } else {
+      break;
+    }
+    let x_162 : i32 = i_1;
+    let x_164 : i32 = A[x_162];
+    let x_165 : i32 = i_1;
+    let x_167 : i32 = ref[x_165];
+    if ((x_164 != x_167)) {
+      ok = false;
+    }
+
+    continuing {
+      let x_171 : i32 = i_1;
+      i_1 = (x_171 + 1);
+    }
+  }
+  let x_174 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_175 : f32 = f32(x_174);
+  x_GLF_color = vec4<f32>(x_175, x_175, x_175, x_175);
+  let x_177 : bool = ok;
+  if (x_177) {
+    let x_181 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_184 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_187 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_190 : i32 = x_6.x_GLF_uniform_int_values[3];
+    x_GLF_color = vec4<f32>(f32(x_181), f32(x_184), f32(x_187), f32(x_190));
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-large-constants-for-clamp-vector-access/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-large-constants-for-clamp-vector-access/0-opt.spvasm
new file mode 100644
index 0000000..5d8225e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-large-constants-for-clamp-vector-access/0-opt.spvasm
@@ -0,0 +1,136 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %v1 "v1"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %a "a"
+               OpName %indexable "indexable"
+               OpName %indexable_0 "indexable"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %16 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_int = OpTypePointer Function %int
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+%_arr_v4float_uint_2 = OpTypeArray %v4float %uint_2
+    %float_1 = OpConstant %float 1
+         %34 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+    %float_0 = OpConstant %float 0
+         %36 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+         %37 = OpConstantComposite %_arr_v4float_uint_2 %34 %36
+      %int_2 = OpConstant %int 2
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function__arr_v4float_uint_2 = OpTypePointer Function %_arr_v4float_uint_2
+%_ptr_Function_float = OpTypePointer Function %float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %16
+         %43 = OpLabel
+         %v1 = OpVariable %_ptr_Function_v4float Function
+          %i = OpVariable %_ptr_Function_int Function
+          %a = OpVariable %_ptr_Function_int Function
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_2 Function
+%indexable_0 = OpVariable %_ptr_Function__arr_v4float_uint_2 Function
+         %44 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %45 = OpLoad %float %44
+         %46 = OpCompositeConstruct %v4float %45 %45 %45 %45
+               OpStore %v1 %46
+         %47 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %48 = OpLoad %int %47
+               OpStore %i %48
+               OpBranch %49
+         %49 = OpLabel
+               OpLoopMerge %50 %51 None
+               OpBranch %52
+         %52 = OpLabel
+         %53 = OpLoad %int %i
+         %54 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %55 = OpLoad %int %54
+         %56 = OpSLessThan %bool %53 %55
+               OpBranchConditional %56 %57 %50
+         %57 = OpLabel
+         %58 = OpLoad %int %i
+         %59 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %60 = OpLoad %int %59
+         %61 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %62 = OpLoad %int %61
+         %63 = OpExtInst %int %1 SClamp %58 %60 %62
+               OpStore %indexable %37
+         %64 = OpAccessChain %_ptr_Function_float %indexable %63 %uint_0
+         %65 = OpLoad %float %64
+         %66 = OpConvertFToS %int %65
+               OpStore %a %66
+         %67 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %68 = OpLoad %float %67
+         %69 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %70 = OpLoad %float %69
+         %71 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %72 = OpLoad %float %71
+         %73 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %74 = OpLoad %float %73
+         %75 = OpCompositeConstruct %v4float %68 %70 %72 %74
+         %76 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %77 = OpLoad %float %76
+         %78 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %79 = OpLoad %float %78
+         %80 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %81 = OpLoad %float %80
+         %82 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %83 = OpLoad %float %82
+         %84 = OpCompositeConstruct %v4float %77 %79 %81 %83
+         %85 = OpCompositeConstruct %_arr_v4float_uint_2 %75 %84
+         %86 = OpLoad %int %a
+               OpStore %indexable_0 %85
+         %87 = OpAccessChain %_ptr_Function_v4float %indexable_0 %86
+         %88 = OpLoad %v4float %87
+               OpStore %v1 %88
+               OpBranch %51
+         %51 = OpLabel
+         %89 = OpLoad %int %i
+         %90 = OpIAdd %int %89 %int_1
+               OpStore %i %90
+               OpBranch %49
+         %50 = OpLabel
+         %91 = OpLoad %v4float %v1
+               OpStore %_GLF_color %91
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-large-constants-for-clamp-vector-access/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-large-constants-for-clamp-vector-access/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..d7b62c4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-large-constants-for-clamp-vector-access/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,72 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+cbuffer cbuffer_x_9 : register(b1, space0) {
+  uint4 x_9[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 v1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int i = 0;
+  int a = 0;
+  float4 indexable[2] = (float4[2])0;
+  float4 indexable_1[2] = (float4[2])0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_45 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  v1 = float4(x_45, x_45, x_45, x_45);
+  const int x_48 = asint(x_9[1].x);
+  i = x_48;
+  while (true) {
+    const int x_53 = i;
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_55 = asint(x_9[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    if ((x_53 < x_55)) {
+    } else {
+      break;
+    }
+    const int x_58 = i;
+    const int x_60 = asint(x_9[1].x);
+    const int x_62 = asint(x_9[2].x);
+    const float4 tint_symbol_4[2] = {float4(1.0f, 1.0f, 1.0f, 1.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)};
+    indexable = tint_symbol_4;
+    const float x_65 = indexable[clamp(x_58, x_60, x_62)].x;
+    a = int(x_65);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const float x_68 = asfloat(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const float x_70 = asfloat(x_6[1].x);
+    const float x_72 = asfloat(x_6[1].x);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const float x_74 = asfloat(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const float x_77 = asfloat(x_6[1].x);
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const float x_79 = asfloat(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const float x_81 = asfloat(x_6[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    const float x_83 = asfloat(x_6[1].x);
+    const int x_86 = a;
+    const float4 tint_symbol_5[2] = {float4(x_68, x_70, x_72, x_74), float4(x_77, x_79, x_81, x_83)};
+    indexable_1 = tint_symbol_5;
+    const float4 x_88 = indexable_1[x_86];
+    v1 = x_88;
+    {
+      i = (i + 1);
+    }
+  }
+  x_GLF_color = v1;
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_6 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-large-constants-for-clamp-vector-access/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-large-constants-for-clamp-vector-access/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..f8f8420
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-large-constants-for-clamp-vector-access/0-opt.spvasm.expected.msl
@@ -0,0 +1,88 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_2 {
+  float4 arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_9, thread float4* const tint_symbol_6) {
+  float4 v1 = 0.0f;
+  int i = 0;
+  int a = 0;
+  tint_array_wrapper_2 indexable = {};
+  tint_array_wrapper_2 indexable_1 = {};
+  float const x_45 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  v1 = float4(x_45, x_45, x_45, x_45);
+  int const x_48 = x_9.x_GLF_uniform_int_values.arr[1].el;
+  i = x_48;
+  while (true) {
+    int const x_53 = i;
+    int const x_55 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_53 < x_55)) {
+    } else {
+      break;
+    }
+    int const x_58 = i;
+    int const x_60 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_62 = x_9.x_GLF_uniform_int_values.arr[2].el;
+    tint_array_wrapper_2 const tint_symbol_3 = {.arr={float4(1.0f, 1.0f, 1.0f, 1.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)}};
+    indexable = tint_symbol_3;
+    float const x_65 = indexable.arr[clamp(x_58, x_60, x_62)].x;
+    a = int(x_65);
+    float const x_68 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    float const x_70 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    float const x_72 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    float const x_74 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    float const x_77 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    float const x_79 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    float const x_81 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    float const x_83 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    int const x_86 = a;
+    tint_array_wrapper_2 const tint_symbol_4 = {.arr={float4(x_68, x_70, x_72, x_74), float4(x_77, x_79, x_81, x_83)}};
+    indexable_1 = tint_symbol_4;
+    float4 const x_88 = indexable_1.arr[x_86];
+    v1 = x_88;
+    {
+      int const x_89 = i;
+      i = (x_89 + 1);
+    }
+  }
+  float4 const x_91 = v1;
+  *(tint_symbol_6) = x_91;
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_9 [[buffer(1)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-large-constants-for-clamp-vector-access/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-large-constants-for-clamp-vector-access/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..6051176
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-large-constants-for-clamp-vector-access/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,177 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 111
+; Schema: 0
+               OpCapability Shader
+         %69 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v1 "v1"
+               OpName %i "i"
+               OpName %a "a"
+               OpName %indexable "indexable"
+               OpName %indexable_1 "indexable_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_v4float_uint_2 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_9 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%_ptr_Function_int = OpTypePointer Function %int
+         %28 = OpConstantNull %int
+%_arr_v4float_uint_2 = OpTypeArray %v4float %uint_2
+%_ptr_Function__arr_v4float_uint_2 = OpTypePointer Function %_arr_v4float_uint_2
+         %33 = OpConstantNull %_arr_v4float_uint_2
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+    %float_1 = OpConstant %float 1
+         %64 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+    %float_0 = OpConstant %float 0
+         %66 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+         %67 = OpConstantComposite %_arr_v4float_uint_2 %64 %66
+%_ptr_Function_float = OpTypePointer Function %float
+   %main_out = OpTypeStruct %v4float
+         %99 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+         %v1 = OpVariable %_ptr_Function_v4float Function %17
+          %i = OpVariable %_ptr_Function_int Function %28
+          %a = OpVariable %_ptr_Function_int Function %28
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_2 Function %33
+%indexable_1 = OpVariable %_ptr_Function__arr_v4float_uint_2 Function %33
+         %38 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %39 = OpLoad %float %38
+         %40 = OpCompositeConstruct %v4float %39 %39 %39 %39
+               OpStore %v1 %40
+         %43 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %44 = OpLoad %int %43
+               OpStore %i %44
+               OpBranch %45
+         %45 = OpLabel
+               OpLoopMerge %46 %47 None
+               OpBranch %48
+         %48 = OpLabel
+         %49 = OpLoad %int %i
+         %50 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %51 = OpLoad %int %50
+         %52 = OpSLessThan %bool %49 %51
+               OpSelectionMerge %54 None
+               OpBranchConditional %52 %55 %56
+         %55 = OpLabel
+               OpBranch %54
+         %56 = OpLabel
+               OpBranch %46
+         %54 = OpLabel
+         %57 = OpLoad %int %i
+         %58 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %59 = OpLoad %int %58
+         %61 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_2
+         %62 = OpLoad %int %61
+               OpStore %indexable %67
+         %68 = OpExtInst %int %69 SClamp %57 %59 %62
+         %71 = OpAccessChain %_ptr_Function_float %indexable %68 %uint_0
+         %72 = OpLoad %float %71
+         %73 = OpConvertFToS %int %72
+               OpStore %a %73
+         %74 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %75 = OpLoad %float %74
+         %76 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %77 = OpLoad %float %76
+         %78 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %79 = OpLoad %float %78
+         %80 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %81 = OpLoad %float %80
+         %82 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %83 = OpLoad %float %82
+         %84 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %85 = OpLoad %float %84
+         %86 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %87 = OpLoad %float %86
+         %88 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %89 = OpLoad %float %88
+         %90 = OpLoad %int %a
+         %91 = OpCompositeConstruct %v4float %75 %77 %79 %81
+         %92 = OpCompositeConstruct %v4float %83 %85 %87 %89
+         %93 = OpCompositeConstruct %_arr_v4float_uint_2 %91 %92
+               OpStore %indexable_1 %93
+         %94 = OpAccessChain %_ptr_Function_v4float %indexable_1 %90
+         %95 = OpLoad %v4float %94
+               OpStore %v1 %95
+               OpBranch %47
+         %47 = OpLabel
+         %96 = OpLoad %int %i
+         %97 = OpIAdd %int %96 %int_1
+               OpStore %i %97
+               OpBranch %45
+         %46 = OpLabel
+         %98 = OpLoad %v4float %v1
+               OpStore %x_GLF_color %98
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %99
+%tint_symbol = OpFunctionParameter %main_out
+        %103 = OpLabel
+        %104 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %104
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %106 = OpLabel
+        %107 = OpFunctionCall %void %main_1
+        %109 = OpLoad %v4float %x_GLF_color
+        %110 = OpCompositeConstruct %main_out %109
+        %108 = OpFunctionCall %void %tint_symbol_2 %110
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-large-constants-for-clamp-vector-access/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-large-constants-for-clamp-vector-access/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..856399f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-large-constants-for-clamp-vector-access/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,76 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v1 : vec4<f32>;
+  var i : i32;
+  var a : i32;
+  var indexable : array<vec4<f32>, 2>;
+  var indexable_1 : array<vec4<f32>, 2>;
+  let x_45 : f32 = x_6.x_GLF_uniform_float_values[0];
+  v1 = vec4<f32>(x_45, x_45, x_45, x_45);
+  let x_48 : i32 = x_9.x_GLF_uniform_int_values[1];
+  i = x_48;
+  loop {
+    let x_53 : i32 = i;
+    let x_55 : i32 = x_9.x_GLF_uniform_int_values[0];
+    if ((x_53 < x_55)) {
+    } else {
+      break;
+    }
+    let x_58 : i32 = i;
+    let x_60 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_62 : i32 = x_9.x_GLF_uniform_int_values[2];
+    indexable = array<vec4<f32>, 2>(vec4<f32>(1.0, 1.0, 1.0, 1.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
+    let x_65 : f32 = indexable[clamp(x_58, x_60, x_62)].x;
+    a = i32(x_65);
+    let x_68 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_70 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_72 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_74 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_77 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_79 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_81 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_83 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_86 : i32 = a;
+    indexable_1 = array<vec4<f32>, 2>(vec4<f32>(x_68, x_70, x_72, x_74), vec4<f32>(x_77, x_79, x_81, x_83));
+    let x_88 : vec4<f32> = indexable_1[x_86];
+    v1 = x_88;
+
+    continuing {
+      let x_89 : i32 = i;
+      i = (x_89 + 1);
+    }
+  }
+  let x_91 : vec4<f32> = v1;
+  x_GLF_color = x_91;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-large-constants-for-clamp-vector-access/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-large-constants-for-clamp-vector-access/0-opt.wgsl
new file mode 100644
index 0000000..856399f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-large-constants-for-clamp-vector-access/0-opt.wgsl
@@ -0,0 +1,76 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v1 : vec4<f32>;
+  var i : i32;
+  var a : i32;
+  var indexable : array<vec4<f32>, 2>;
+  var indexable_1 : array<vec4<f32>, 2>;
+  let x_45 : f32 = x_6.x_GLF_uniform_float_values[0];
+  v1 = vec4<f32>(x_45, x_45, x_45, x_45);
+  let x_48 : i32 = x_9.x_GLF_uniform_int_values[1];
+  i = x_48;
+  loop {
+    let x_53 : i32 = i;
+    let x_55 : i32 = x_9.x_GLF_uniform_int_values[0];
+    if ((x_53 < x_55)) {
+    } else {
+      break;
+    }
+    let x_58 : i32 = i;
+    let x_60 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_62 : i32 = x_9.x_GLF_uniform_int_values[2];
+    indexable = array<vec4<f32>, 2>(vec4<f32>(1.0, 1.0, 1.0, 1.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
+    let x_65 : f32 = indexable[clamp(x_58, x_60, x_62)].x;
+    a = i32(x_65);
+    let x_68 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_70 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_72 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_74 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_77 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_79 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_81 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_83 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_86 : i32 = a;
+    indexable_1 = array<vec4<f32>, 2>(vec4<f32>(x_68, x_70, x_72, x_74), vec4<f32>(x_77, x_79, x_81, x_83));
+    let x_88 : vec4<f32> = indexable_1[x_86];
+    v1 = x_88;
+
+    continuing {
+      let x_89 : i32 = i;
+      i = (x_89 + 1);
+    }
+  }
+  let x_91 : vec4<f32> = v1;
+  x_GLF_color = x_91;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-large-constants-for-clamp-vector-access/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-large-constants-for-clamp-vector-access/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..d7b62c4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-large-constants-for-clamp-vector-access/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,72 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+cbuffer cbuffer_x_9 : register(b1, space0) {
+  uint4 x_9[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 v1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int i = 0;
+  int a = 0;
+  float4 indexable[2] = (float4[2])0;
+  float4 indexable_1[2] = (float4[2])0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_45 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  v1 = float4(x_45, x_45, x_45, x_45);
+  const int x_48 = asint(x_9[1].x);
+  i = x_48;
+  while (true) {
+    const int x_53 = i;
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_55 = asint(x_9[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    if ((x_53 < x_55)) {
+    } else {
+      break;
+    }
+    const int x_58 = i;
+    const int x_60 = asint(x_9[1].x);
+    const int x_62 = asint(x_9[2].x);
+    const float4 tint_symbol_4[2] = {float4(1.0f, 1.0f, 1.0f, 1.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)};
+    indexable = tint_symbol_4;
+    const float x_65 = indexable[clamp(x_58, x_60, x_62)].x;
+    a = int(x_65);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const float x_68 = asfloat(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const float x_70 = asfloat(x_6[1].x);
+    const float x_72 = asfloat(x_6[1].x);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const float x_74 = asfloat(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const float x_77 = asfloat(x_6[1].x);
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const float x_79 = asfloat(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const float x_81 = asfloat(x_6[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    const float x_83 = asfloat(x_6[1].x);
+    const int x_86 = a;
+    const float4 tint_symbol_5[2] = {float4(x_68, x_70, x_72, x_74), float4(x_77, x_79, x_81, x_83)};
+    indexable_1 = tint_symbol_5;
+    const float4 x_88 = indexable_1[x_86];
+    v1 = x_88;
+    {
+      i = (i + 1);
+    }
+  }
+  x_GLF_color = v1;
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_6 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-large-constants-for-clamp-vector-access/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-large-constants-for-clamp-vector-access/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..f8f8420
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-large-constants-for-clamp-vector-access/0-opt.wgsl.expected.msl
@@ -0,0 +1,88 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_2 {
+  float4 arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_9, thread float4* const tint_symbol_6) {
+  float4 v1 = 0.0f;
+  int i = 0;
+  int a = 0;
+  tint_array_wrapper_2 indexable = {};
+  tint_array_wrapper_2 indexable_1 = {};
+  float const x_45 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  v1 = float4(x_45, x_45, x_45, x_45);
+  int const x_48 = x_9.x_GLF_uniform_int_values.arr[1].el;
+  i = x_48;
+  while (true) {
+    int const x_53 = i;
+    int const x_55 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_53 < x_55)) {
+    } else {
+      break;
+    }
+    int const x_58 = i;
+    int const x_60 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_62 = x_9.x_GLF_uniform_int_values.arr[2].el;
+    tint_array_wrapper_2 const tint_symbol_3 = {.arr={float4(1.0f, 1.0f, 1.0f, 1.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)}};
+    indexable = tint_symbol_3;
+    float const x_65 = indexable.arr[clamp(x_58, x_60, x_62)].x;
+    a = int(x_65);
+    float const x_68 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    float const x_70 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    float const x_72 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    float const x_74 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    float const x_77 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    float const x_79 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    float const x_81 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    float const x_83 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    int const x_86 = a;
+    tint_array_wrapper_2 const tint_symbol_4 = {.arr={float4(x_68, x_70, x_72, x_74), float4(x_77, x_79, x_81, x_83)}};
+    indexable_1 = tint_symbol_4;
+    float4 const x_88 = indexable_1.arr[x_86];
+    v1 = x_88;
+    {
+      int const x_89 = i;
+      i = (x_89 + 1);
+    }
+  }
+  float4 const x_91 = v1;
+  *(tint_symbol_6) = x_91;
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_9 [[buffer(1)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-large-constants-for-clamp-vector-access/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-large-constants-for-clamp-vector-access/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..6051176
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-large-constants-for-clamp-vector-access/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,177 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 111
+; Schema: 0
+               OpCapability Shader
+         %69 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v1 "v1"
+               OpName %i "i"
+               OpName %a "a"
+               OpName %indexable "indexable"
+               OpName %indexable_1 "indexable_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_v4float_uint_2 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_9 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%_ptr_Function_int = OpTypePointer Function %int
+         %28 = OpConstantNull %int
+%_arr_v4float_uint_2 = OpTypeArray %v4float %uint_2
+%_ptr_Function__arr_v4float_uint_2 = OpTypePointer Function %_arr_v4float_uint_2
+         %33 = OpConstantNull %_arr_v4float_uint_2
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+    %float_1 = OpConstant %float 1
+         %64 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+    %float_0 = OpConstant %float 0
+         %66 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+         %67 = OpConstantComposite %_arr_v4float_uint_2 %64 %66
+%_ptr_Function_float = OpTypePointer Function %float
+   %main_out = OpTypeStruct %v4float
+         %99 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+         %v1 = OpVariable %_ptr_Function_v4float Function %17
+          %i = OpVariable %_ptr_Function_int Function %28
+          %a = OpVariable %_ptr_Function_int Function %28
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_2 Function %33
+%indexable_1 = OpVariable %_ptr_Function__arr_v4float_uint_2 Function %33
+         %38 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %39 = OpLoad %float %38
+         %40 = OpCompositeConstruct %v4float %39 %39 %39 %39
+               OpStore %v1 %40
+         %43 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %44 = OpLoad %int %43
+               OpStore %i %44
+               OpBranch %45
+         %45 = OpLabel
+               OpLoopMerge %46 %47 None
+               OpBranch %48
+         %48 = OpLabel
+         %49 = OpLoad %int %i
+         %50 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %51 = OpLoad %int %50
+         %52 = OpSLessThan %bool %49 %51
+               OpSelectionMerge %54 None
+               OpBranchConditional %52 %55 %56
+         %55 = OpLabel
+               OpBranch %54
+         %56 = OpLabel
+               OpBranch %46
+         %54 = OpLabel
+         %57 = OpLoad %int %i
+         %58 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %59 = OpLoad %int %58
+         %61 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_2
+         %62 = OpLoad %int %61
+               OpStore %indexable %67
+         %68 = OpExtInst %int %69 SClamp %57 %59 %62
+         %71 = OpAccessChain %_ptr_Function_float %indexable %68 %uint_0
+         %72 = OpLoad %float %71
+         %73 = OpConvertFToS %int %72
+               OpStore %a %73
+         %74 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %75 = OpLoad %float %74
+         %76 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %77 = OpLoad %float %76
+         %78 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %79 = OpLoad %float %78
+         %80 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %81 = OpLoad %float %80
+         %82 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %83 = OpLoad %float %82
+         %84 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %85 = OpLoad %float %84
+         %86 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %87 = OpLoad %float %86
+         %88 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %89 = OpLoad %float %88
+         %90 = OpLoad %int %a
+         %91 = OpCompositeConstruct %v4float %75 %77 %79 %81
+         %92 = OpCompositeConstruct %v4float %83 %85 %87 %89
+         %93 = OpCompositeConstruct %_arr_v4float_uint_2 %91 %92
+               OpStore %indexable_1 %93
+         %94 = OpAccessChain %_ptr_Function_v4float %indexable_1 %90
+         %95 = OpLoad %v4float %94
+               OpStore %v1 %95
+               OpBranch %47
+         %47 = OpLabel
+         %96 = OpLoad %int %i
+         %97 = OpIAdd %int %96 %int_1
+               OpStore %i %97
+               OpBranch %45
+         %46 = OpLabel
+         %98 = OpLoad %v4float %v1
+               OpStore %x_GLF_color %98
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %99
+%tint_symbol = OpFunctionParameter %main_out
+        %103 = OpLabel
+        %104 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %104
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %106 = OpLabel
+        %107 = OpFunctionCall %void %main_1
+        %109 = OpLoad %v4float %x_GLF_color
+        %110 = OpCompositeConstruct %main_out %109
+        %108 = OpFunctionCall %void %tint_symbol_2 %110
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-large-constants-for-clamp-vector-access/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-large-constants-for-clamp-vector-access/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..856399f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-large-constants-for-clamp-vector-access/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,76 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v1 : vec4<f32>;
+  var i : i32;
+  var a : i32;
+  var indexable : array<vec4<f32>, 2>;
+  var indexable_1 : array<vec4<f32>, 2>;
+  let x_45 : f32 = x_6.x_GLF_uniform_float_values[0];
+  v1 = vec4<f32>(x_45, x_45, x_45, x_45);
+  let x_48 : i32 = x_9.x_GLF_uniform_int_values[1];
+  i = x_48;
+  loop {
+    let x_53 : i32 = i;
+    let x_55 : i32 = x_9.x_GLF_uniform_int_values[0];
+    if ((x_53 < x_55)) {
+    } else {
+      break;
+    }
+    let x_58 : i32 = i;
+    let x_60 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_62 : i32 = x_9.x_GLF_uniform_int_values[2];
+    indexable = array<vec4<f32>, 2>(vec4<f32>(1.0, 1.0, 1.0, 1.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
+    let x_65 : f32 = indexable[clamp(x_58, x_60, x_62)].x;
+    a = i32(x_65);
+    let x_68 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_70 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_72 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_74 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_77 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_79 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_81 : f32 = x_6.x_GLF_uniform_float_values[0];
+    let x_83 : f32 = x_6.x_GLF_uniform_float_values[1];
+    let x_86 : i32 = a;
+    indexable_1 = array<vec4<f32>, 2>(vec4<f32>(x_68, x_70, x_72, x_74), vec4<f32>(x_77, x_79, x_81, x_83));
+    let x_88 : vec4<f32> = indexable_1[x_86];
+    v1 = x_88;
+
+    continuing {
+      let x_89 : i32 = i;
+      i = (x_89 + 1);
+    }
+  }
+  let x_91 : vec4<f32> = v1;
+  x_GLF_color = x_91;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-loop-unroll-if-if-if-if-do-while/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-loop-unroll-if-if-if-if-do-while/0-opt.spvasm
new file mode 100644
index 0000000..97aab23
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-loop-unroll-if-if-if-if-do-while/0-opt.spvasm
@@ -0,0 +1,135 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %a "a"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_float = OpTypePointer Function %float
+%float_0_200000003 = OpConstant %float 0.200000003
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %main = OpFunction %void None %12
+         %29 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function
+         %30 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %31 = OpLoad %float %30
+         %32 = OpCompositeConstruct %v4float %31 %31 %31 %31
+               OpStore %_GLF_color %32
+         %33 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %34 = OpLoad %float %33
+               OpStore %a %34
+               OpBranch %35
+         %35 = OpLabel
+               OpLoopMerge %36 %37 None
+               OpBranch %38
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %40 = OpLoad %float %39
+         %41 = OpFDiv %float %40 %float_0_200000003
+         %42 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %43 = OpLoad %float %42
+         %44 = OpFOrdLessThan %bool %41 %43
+               OpSelectionMerge %45 None
+               OpBranchConditional %44 %46 %45
+         %46 = OpLabel
+               OpReturn
+         %45 = OpLabel
+         %47 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %48 = OpLoad %float %47
+         %49 = OpFDiv %float %48 %float_0_200000003
+         %50 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %51 = OpLoad %float %50
+         %52 = OpFOrdLessThan %bool %49 %51
+               OpSelectionMerge %53 None
+               OpBranchConditional %52 %54 %53
+         %54 = OpLabel
+               OpReturn
+         %53 = OpLabel
+         %55 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %56 = OpLoad %float %55
+         %57 = OpFDiv %float %56 %float_0_200000003
+         %58 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %59 = OpLoad %float %58
+         %60 = OpFOrdLessThan %bool %57 %59
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %61
+         %62 = OpLabel
+               OpReturn
+         %61 = OpLabel
+         %63 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %64 = OpLoad %float %63
+         %65 = OpFDiv %float %64 %float_0_200000003
+         %66 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %67 = OpLoad %float %66
+         %68 = OpFOrdLessThan %bool %65 %67
+               OpSelectionMerge %69 None
+               OpBranchConditional %68 %70 %71
+         %70 = OpLabel
+               OpReturn
+         %71 = OpLabel
+               OpStore %a %float_0
+               OpBranch %69
+         %69 = OpLabel
+               OpBranch %37
+         %37 = OpLabel
+         %72 = OpLoad %float %a
+         %73 = OpFUnordNotEqual %bool %72 %float_0
+               OpBranchConditional %73 %35 %36
+         %36 = OpLabel
+         %74 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %75 = OpLoad %int %74
+         %76 = OpConvertSToF %float %75
+         %77 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %78 = OpLoad %int %77
+         %79 = OpConvertSToF %float %78
+         %80 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %81 = OpLoad %int %80
+         %82 = OpConvertSToF %float %81
+         %83 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %84 = OpLoad %int %83
+         %85 = OpConvertSToF %float %84
+         %86 = OpCompositeConstruct %v4float %76 %79 %82 %85
+               OpStore %_GLF_color %86
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-loop-unroll-if-if-if-if-do-while/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-loop-unroll-if-if-if-if-do-while/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..ecfd0d5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-loop-unroll-if-if-if-if-do-while/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,76 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[2];
+};
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[2];
+};
+
+void main_1() {
+  float a = 0.0f;
+  const float x_31 = asfloat(x_5[1].x);
+  x_GLF_color = float4(x_31, x_31, x_31, x_31);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_34 = asfloat(x_5[scalar_offset / 4][scalar_offset % 4]);
+  a = x_34;
+  while (true) {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const float x_40 = asfloat(x_5[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const float x_43 = asfloat(x_5[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    if (((x_40 / 0.200000003f) < x_43)) {
+      return;
+    }
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const float x_48 = asfloat(x_5[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const float x_51 = asfloat(x_5[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    if (((x_48 / 0.200000003f) < x_51)) {
+      return;
+    }
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const float x_56 = asfloat(x_5[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+    const float x_59 = asfloat(x_5[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+    if (((x_56 / 0.200000003f) < x_59)) {
+      return;
+    }
+    const uint scalar_offset_7 = ((16u * uint(0))) / 4;
+    const float x_64 = asfloat(x_5[scalar_offset_7 / 4][scalar_offset_7 % 4]);
+    const uint scalar_offset_8 = ((16u * uint(0))) / 4;
+    const float x_67 = asfloat(x_5[scalar_offset_8 / 4][scalar_offset_8 % 4]);
+    if (((x_64 / 0.200000003f) < x_67)) {
+      return;
+    } else {
+      a = 0.0f;
+    }
+    {
+      if (!((a == 0.0f))) {
+      } else {
+        break;
+      }
+    }
+  }
+  const int x_75 = asint(x_8[1].x);
+  const uint scalar_offset_9 = ((16u * uint(0))) / 4;
+  const int x_78 = asint(x_8[scalar_offset_9 / 4][scalar_offset_9 % 4]);
+  const uint scalar_offset_10 = ((16u * uint(0))) / 4;
+  const int x_81 = asint(x_8[scalar_offset_10 / 4][scalar_offset_10 % 4]);
+  const int x_84 = asint(x_8[1].x);
+  x_GLF_color = float4(float(x_75), float(x_78), float(x_81), float(x_84));
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-loop-unroll-if-if-if-if-do-while/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-loop-unroll-if-if-if-if-do-while/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..e8baf09
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-loop-unroll-if-if-if-if-do-while/0-opt.spvasm.expected.msl
@@ -0,0 +1,83 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, constant buf1& x_8, thread float4* const tint_symbol_4) {
+  float a = 0.0f;
+  float const x_31 = x_5.x_GLF_uniform_float_values.arr[1].el;
+  *(tint_symbol_4) = float4(x_31, x_31, x_31, x_31);
+  float const x_34 = x_5.x_GLF_uniform_float_values.arr[0].el;
+  a = x_34;
+  while (true) {
+    float const x_40 = x_5.x_GLF_uniform_float_values.arr[0].el;
+    float const x_43 = x_5.x_GLF_uniform_float_values.arr[0].el;
+    if (((x_40 / 0.200000003f) < x_43)) {
+      return;
+    }
+    float const x_48 = x_5.x_GLF_uniform_float_values.arr[0].el;
+    float const x_51 = x_5.x_GLF_uniform_float_values.arr[0].el;
+    if (((x_48 / 0.200000003f) < x_51)) {
+      return;
+    }
+    float const x_56 = x_5.x_GLF_uniform_float_values.arr[0].el;
+    float const x_59 = x_5.x_GLF_uniform_float_values.arr[0].el;
+    if (((x_56 / 0.200000003f) < x_59)) {
+      return;
+    }
+    float const x_64 = x_5.x_GLF_uniform_float_values.arr[0].el;
+    float const x_67 = x_5.x_GLF_uniform_float_values.arr[0].el;
+    if (((x_64 / 0.200000003f) < x_67)) {
+      return;
+    } else {
+      a = 0.0f;
+    }
+    {
+      float const x_72 = a;
+      if (!((x_72 == 0.0f))) {
+      } else {
+        break;
+      }
+    }
+  }
+  int const x_75 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  int const x_78 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  int const x_81 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  int const x_84 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  *(tint_symbol_4) = float4(float(x_75), float(x_78), float(x_81), float(x_84));
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]], constant buf1& x_8 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-loop-unroll-if-if-if-if-do-while/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-loop-unroll-if-if-if-if-do-while/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..caa85e8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-loop-unroll-if-if-if-if-do-while/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,182 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 107
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_5 "x_5"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_8 "x_8"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %25 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_0 = OpConstant %int 0
+%float_0_200000003 = OpConstant %float 0.200000003
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+         %95 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function %25
+         %29 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_1
+         %30 = OpLoad %float %29
+         %31 = OpCompositeConstruct %v4float %30 %30 %30 %30
+               OpStore %x_GLF_color %31
+         %33 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %34 = OpLoad %float %33
+               OpStore %a %34
+               OpBranch %35
+         %35 = OpLabel
+               OpLoopMerge %36 %37 None
+               OpBranch %38
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %40 = OpLoad %float %39
+         %41 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %42 = OpLoad %float %41
+         %44 = OpFDiv %float %40 %float_0_200000003
+         %45 = OpFOrdLessThan %bool %44 %42
+               OpSelectionMerge %47 None
+               OpBranchConditional %45 %48 %47
+         %48 = OpLabel
+               OpReturn
+         %47 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %50 = OpLoad %float %49
+         %51 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %52 = OpLoad %float %51
+         %53 = OpFDiv %float %50 %float_0_200000003
+         %54 = OpFOrdLessThan %bool %53 %52
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %55
+         %56 = OpLabel
+               OpReturn
+         %55 = OpLabel
+         %57 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %58 = OpLoad %float %57
+         %59 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %60 = OpLoad %float %59
+         %61 = OpFDiv %float %58 %float_0_200000003
+         %62 = OpFOrdLessThan %bool %61 %60
+               OpSelectionMerge %63 None
+               OpBranchConditional %62 %64 %63
+         %64 = OpLabel
+               OpReturn
+         %63 = OpLabel
+         %65 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %66 = OpLoad %float %65
+         %67 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %68 = OpLoad %float %67
+         %69 = OpFDiv %float %66 %float_0_200000003
+         %70 = OpFOrdLessThan %bool %69 %68
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %73
+         %72 = OpLabel
+               OpReturn
+         %73 = OpLabel
+               OpStore %a %float_0
+               OpBranch %71
+         %71 = OpLabel
+               OpBranch %37
+         %37 = OpLabel
+         %75 = OpLoad %float %a
+         %77 = OpFOrdEqual %bool %75 %float_0
+         %76 = OpLogicalNot %bool %77
+               OpSelectionMerge %78 None
+               OpBranchConditional %76 %79 %80
+         %79 = OpLabel
+               OpBranch %78
+         %80 = OpLabel
+               OpBranch %36
+         %78 = OpLabel
+               OpBranch %35
+         %36 = OpLabel
+         %82 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %83 = OpLoad %int %82
+         %84 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %85 = OpLoad %int %84
+         %86 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %87 = OpLoad %int %86
+         %88 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %89 = OpLoad %int %88
+         %90 = OpConvertSToF %float %83
+         %91 = OpConvertSToF %float %85
+         %92 = OpConvertSToF %float %87
+         %93 = OpConvertSToF %float %89
+         %94 = OpCompositeConstruct %v4float %90 %91 %92 %93
+               OpStore %x_GLF_color %94
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %95
+%tint_symbol = OpFunctionParameter %main_out
+         %99 = OpLabel
+        %100 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %100
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+        %102 = OpLabel
+        %103 = OpFunctionCall %void %main_1
+        %105 = OpLoad %v4float %x_GLF_color
+        %106 = OpCompositeConstruct %main_out %105
+        %104 = OpFunctionCall %void %tint_symbol_2 %106
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 37[%37] is not post dominated by the back-edge block 78[%78]
+  %78 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-loop-unroll-if-if-if-if-do-while/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-loop-unroll-if-if-if-if-do-while/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..84258b8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-loop-unroll-if-if-if-if-do-while/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,76 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+fn main_1() {
+  var a : f32;
+  let x_31 : f32 = x_5.x_GLF_uniform_float_values[1];
+  x_GLF_color = vec4<f32>(x_31, x_31, x_31, x_31);
+  let x_34 : f32 = x_5.x_GLF_uniform_float_values[0];
+  a = x_34;
+  loop {
+    let x_40 : f32 = x_5.x_GLF_uniform_float_values[0];
+    let x_43 : f32 = x_5.x_GLF_uniform_float_values[0];
+    if (((x_40 / 0.200000003) < x_43)) {
+      return;
+    }
+    let x_48 : f32 = x_5.x_GLF_uniform_float_values[0];
+    let x_51 : f32 = x_5.x_GLF_uniform_float_values[0];
+    if (((x_48 / 0.200000003) < x_51)) {
+      return;
+    }
+    let x_56 : f32 = x_5.x_GLF_uniform_float_values[0];
+    let x_59 : f32 = x_5.x_GLF_uniform_float_values[0];
+    if (((x_56 / 0.200000003) < x_59)) {
+      return;
+    }
+    let x_64 : f32 = x_5.x_GLF_uniform_float_values[0];
+    let x_67 : f32 = x_5.x_GLF_uniform_float_values[0];
+    if (((x_64 / 0.200000003) < x_67)) {
+      return;
+    } else {
+      a = 0.0;
+    }
+
+    continuing {
+      let x_72 : f32 = a;
+      if (!((x_72 == 0.0))) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_75 : i32 = x_8.x_GLF_uniform_int_values[1];
+  let x_78 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_81 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_84 : i32 = x_8.x_GLF_uniform_int_values[1];
+  x_GLF_color = vec4<f32>(f32(x_75), f32(x_78), f32(x_81), f32(x_84));
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-loop-unroll-if-if-if-if-do-while/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-loop-unroll-if-if-if-if-do-while/0-opt.wgsl
new file mode 100644
index 0000000..84258b8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-loop-unroll-if-if-if-if-do-while/0-opt.wgsl
@@ -0,0 +1,76 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+fn main_1() {
+  var a : f32;
+  let x_31 : f32 = x_5.x_GLF_uniform_float_values[1];
+  x_GLF_color = vec4<f32>(x_31, x_31, x_31, x_31);
+  let x_34 : f32 = x_5.x_GLF_uniform_float_values[0];
+  a = x_34;
+  loop {
+    let x_40 : f32 = x_5.x_GLF_uniform_float_values[0];
+    let x_43 : f32 = x_5.x_GLF_uniform_float_values[0];
+    if (((x_40 / 0.200000003) < x_43)) {
+      return;
+    }
+    let x_48 : f32 = x_5.x_GLF_uniform_float_values[0];
+    let x_51 : f32 = x_5.x_GLF_uniform_float_values[0];
+    if (((x_48 / 0.200000003) < x_51)) {
+      return;
+    }
+    let x_56 : f32 = x_5.x_GLF_uniform_float_values[0];
+    let x_59 : f32 = x_5.x_GLF_uniform_float_values[0];
+    if (((x_56 / 0.200000003) < x_59)) {
+      return;
+    }
+    let x_64 : f32 = x_5.x_GLF_uniform_float_values[0];
+    let x_67 : f32 = x_5.x_GLF_uniform_float_values[0];
+    if (((x_64 / 0.200000003) < x_67)) {
+      return;
+    } else {
+      a = 0.0;
+    }
+
+    continuing {
+      let x_72 : f32 = a;
+      if (!((x_72 == 0.0))) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_75 : i32 = x_8.x_GLF_uniform_int_values[1];
+  let x_78 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_81 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_84 : i32 = x_8.x_GLF_uniform_int_values[1];
+  x_GLF_color = vec4<f32>(f32(x_75), f32(x_78), f32(x_81), f32(x_84));
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-loop-unroll-if-if-if-if-do-while/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-loop-unroll-if-if-if-if-do-while/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..ecfd0d5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-loop-unroll-if-if-if-if-do-while/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,76 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[2];
+};
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[2];
+};
+
+void main_1() {
+  float a = 0.0f;
+  const float x_31 = asfloat(x_5[1].x);
+  x_GLF_color = float4(x_31, x_31, x_31, x_31);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_34 = asfloat(x_5[scalar_offset / 4][scalar_offset % 4]);
+  a = x_34;
+  while (true) {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const float x_40 = asfloat(x_5[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const float x_43 = asfloat(x_5[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    if (((x_40 / 0.200000003f) < x_43)) {
+      return;
+    }
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const float x_48 = asfloat(x_5[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const float x_51 = asfloat(x_5[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    if (((x_48 / 0.200000003f) < x_51)) {
+      return;
+    }
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const float x_56 = asfloat(x_5[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+    const float x_59 = asfloat(x_5[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+    if (((x_56 / 0.200000003f) < x_59)) {
+      return;
+    }
+    const uint scalar_offset_7 = ((16u * uint(0))) / 4;
+    const float x_64 = asfloat(x_5[scalar_offset_7 / 4][scalar_offset_7 % 4]);
+    const uint scalar_offset_8 = ((16u * uint(0))) / 4;
+    const float x_67 = asfloat(x_5[scalar_offset_8 / 4][scalar_offset_8 % 4]);
+    if (((x_64 / 0.200000003f) < x_67)) {
+      return;
+    } else {
+      a = 0.0f;
+    }
+    {
+      if (!((a == 0.0f))) {
+      } else {
+        break;
+      }
+    }
+  }
+  const int x_75 = asint(x_8[1].x);
+  const uint scalar_offset_9 = ((16u * uint(0))) / 4;
+  const int x_78 = asint(x_8[scalar_offset_9 / 4][scalar_offset_9 % 4]);
+  const uint scalar_offset_10 = ((16u * uint(0))) / 4;
+  const int x_81 = asint(x_8[scalar_offset_10 / 4][scalar_offset_10 % 4]);
+  const int x_84 = asint(x_8[1].x);
+  x_GLF_color = float4(float(x_75), float(x_78), float(x_81), float(x_84));
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-loop-unroll-if-if-if-if-do-while/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-loop-unroll-if-if-if-if-do-while/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..e8baf09
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-loop-unroll-if-if-if-if-do-while/0-opt.wgsl.expected.msl
@@ -0,0 +1,83 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, constant buf1& x_8, thread float4* const tint_symbol_4) {
+  float a = 0.0f;
+  float const x_31 = x_5.x_GLF_uniform_float_values.arr[1].el;
+  *(tint_symbol_4) = float4(x_31, x_31, x_31, x_31);
+  float const x_34 = x_5.x_GLF_uniform_float_values.arr[0].el;
+  a = x_34;
+  while (true) {
+    float const x_40 = x_5.x_GLF_uniform_float_values.arr[0].el;
+    float const x_43 = x_5.x_GLF_uniform_float_values.arr[0].el;
+    if (((x_40 / 0.200000003f) < x_43)) {
+      return;
+    }
+    float const x_48 = x_5.x_GLF_uniform_float_values.arr[0].el;
+    float const x_51 = x_5.x_GLF_uniform_float_values.arr[0].el;
+    if (((x_48 / 0.200000003f) < x_51)) {
+      return;
+    }
+    float const x_56 = x_5.x_GLF_uniform_float_values.arr[0].el;
+    float const x_59 = x_5.x_GLF_uniform_float_values.arr[0].el;
+    if (((x_56 / 0.200000003f) < x_59)) {
+      return;
+    }
+    float const x_64 = x_5.x_GLF_uniform_float_values.arr[0].el;
+    float const x_67 = x_5.x_GLF_uniform_float_values.arr[0].el;
+    if (((x_64 / 0.200000003f) < x_67)) {
+      return;
+    } else {
+      a = 0.0f;
+    }
+    {
+      float const x_72 = a;
+      if (!((x_72 == 0.0f))) {
+      } else {
+        break;
+      }
+    }
+  }
+  int const x_75 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  int const x_78 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  int const x_81 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  int const x_84 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  *(tint_symbol_4) = float4(float(x_75), float(x_78), float(x_81), float(x_84));
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]], constant buf1& x_8 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-loop-unroll-if-if-if-if-do-while/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-loop-unroll-if-if-if-if-do-while/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..caa85e8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-loop-unroll-if-if-if-if-do-while/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,182 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 107
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_5 "x_5"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_8 "x_8"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %25 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_0 = OpConstant %int 0
+%float_0_200000003 = OpConstant %float 0.200000003
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+         %95 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function %25
+         %29 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_1
+         %30 = OpLoad %float %29
+         %31 = OpCompositeConstruct %v4float %30 %30 %30 %30
+               OpStore %x_GLF_color %31
+         %33 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %34 = OpLoad %float %33
+               OpStore %a %34
+               OpBranch %35
+         %35 = OpLabel
+               OpLoopMerge %36 %37 None
+               OpBranch %38
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %40 = OpLoad %float %39
+         %41 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %42 = OpLoad %float %41
+         %44 = OpFDiv %float %40 %float_0_200000003
+         %45 = OpFOrdLessThan %bool %44 %42
+               OpSelectionMerge %47 None
+               OpBranchConditional %45 %48 %47
+         %48 = OpLabel
+               OpReturn
+         %47 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %50 = OpLoad %float %49
+         %51 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %52 = OpLoad %float %51
+         %53 = OpFDiv %float %50 %float_0_200000003
+         %54 = OpFOrdLessThan %bool %53 %52
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %55
+         %56 = OpLabel
+               OpReturn
+         %55 = OpLabel
+         %57 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %58 = OpLoad %float %57
+         %59 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %60 = OpLoad %float %59
+         %61 = OpFDiv %float %58 %float_0_200000003
+         %62 = OpFOrdLessThan %bool %61 %60
+               OpSelectionMerge %63 None
+               OpBranchConditional %62 %64 %63
+         %64 = OpLabel
+               OpReturn
+         %63 = OpLabel
+         %65 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %66 = OpLoad %float %65
+         %67 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %68 = OpLoad %float %67
+         %69 = OpFDiv %float %66 %float_0_200000003
+         %70 = OpFOrdLessThan %bool %69 %68
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %73
+         %72 = OpLabel
+               OpReturn
+         %73 = OpLabel
+               OpStore %a %float_0
+               OpBranch %71
+         %71 = OpLabel
+               OpBranch %37
+         %37 = OpLabel
+         %75 = OpLoad %float %a
+         %77 = OpFOrdEqual %bool %75 %float_0
+         %76 = OpLogicalNot %bool %77
+               OpSelectionMerge %78 None
+               OpBranchConditional %76 %79 %80
+         %79 = OpLabel
+               OpBranch %78
+         %80 = OpLabel
+               OpBranch %36
+         %78 = OpLabel
+               OpBranch %35
+         %36 = OpLabel
+         %82 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %83 = OpLoad %int %82
+         %84 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %85 = OpLoad %int %84
+         %86 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %87 = OpLoad %int %86
+         %88 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %89 = OpLoad %int %88
+         %90 = OpConvertSToF %float %83
+         %91 = OpConvertSToF %float %85
+         %92 = OpConvertSToF %float %87
+         %93 = OpConvertSToF %float %89
+         %94 = OpCompositeConstruct %v4float %90 %91 %92 %93
+               OpStore %x_GLF_color %94
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %95
+%tint_symbol = OpFunctionParameter %main_out
+         %99 = OpLabel
+        %100 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %100
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+        %102 = OpLabel
+        %103 = OpFunctionCall %void %main_1
+        %105 = OpLoad %v4float %x_GLF_color
+        %106 = OpCompositeConstruct %main_out %105
+        %104 = OpFunctionCall %void %tint_symbol_2 %106
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 37[%37] is not post dominated by the back-edge block 78[%78]
+  %78 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-loop-unroll-if-if-if-if-do-while/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-loop-unroll-if-if-if-if-do-while/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..84258b8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-nir-opt-loop-unroll-if-if-if-if-do-while/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,76 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+fn main_1() {
+  var a : f32;
+  let x_31 : f32 = x_5.x_GLF_uniform_float_values[1];
+  x_GLF_color = vec4<f32>(x_31, x_31, x_31, x_31);
+  let x_34 : f32 = x_5.x_GLF_uniform_float_values[0];
+  a = x_34;
+  loop {
+    let x_40 : f32 = x_5.x_GLF_uniform_float_values[0];
+    let x_43 : f32 = x_5.x_GLF_uniform_float_values[0];
+    if (((x_40 / 0.200000003) < x_43)) {
+      return;
+    }
+    let x_48 : f32 = x_5.x_GLF_uniform_float_values[0];
+    let x_51 : f32 = x_5.x_GLF_uniform_float_values[0];
+    if (((x_48 / 0.200000003) < x_51)) {
+      return;
+    }
+    let x_56 : f32 = x_5.x_GLF_uniform_float_values[0];
+    let x_59 : f32 = x_5.x_GLF_uniform_float_values[0];
+    if (((x_56 / 0.200000003) < x_59)) {
+      return;
+    }
+    let x_64 : f32 = x_5.x_GLF_uniform_float_values[0];
+    let x_67 : f32 = x_5.x_GLF_uniform_float_values[0];
+    if (((x_64 / 0.200000003) < x_67)) {
+      return;
+    } else {
+      a = 0.0;
+    }
+
+    continuing {
+      let x_72 : f32 = a;
+      if (!((x_72 == 0.0))) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_75 : i32 = x_8.x_GLF_uniform_int_values[1];
+  let x_78 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_81 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_84 : i32 = x_8.x_GLF_uniform_int_values[1];
+  x_GLF_color = vec4<f32>(f32(x_75), f32(x_78), f32(x_81), f32(x_84));
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-not-clamp-matrix-access/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-not-clamp-matrix-access/0-opt.spvasm
new file mode 100644
index 0000000..2047855
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-not-clamp-matrix-access/0-opt.spvasm
@@ -0,0 +1,144 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %M1 "M1"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %a "a"
+               OpName %c "c"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_5 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%mat2v2float = OpTypeMatrix %v2float 2
+%_ptr_Function_mat2v2float = OpTypePointer Function %mat2v2float
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_float_uint_5 = OpTypeArray %float %uint_5
+       %buf0 = OpTypeStruct %_arr_float_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+%_ptr_Function_float = OpTypePointer Function %float
+%_ptr_Function_int = OpTypePointer Function %int
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %14
+         %39 = OpLabel
+         %M1 = OpVariable %_ptr_Function_mat2v2float Function
+          %a = OpVariable %_ptr_Function_float Function
+          %c = OpVariable %_ptr_Function_int Function
+         %40 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %41 = OpLoad %float %40
+         %42 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %43 = OpLoad %float %42
+         %44 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_3
+         %45 = OpLoad %float %44
+         %46 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_4
+         %47 = OpLoad %float %46
+         %48 = OpCompositeConstruct %v2float %41 %43
+         %49 = OpCompositeConstruct %v2float %45 %47
+         %50 = OpCompositeConstruct %mat2v2float %48 %49
+               OpStore %M1 %50
+         %51 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %52 = OpLoad %float %51
+               OpStore %a %52
+         %53 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %54 = OpLoad %int %53
+               OpStore %c %54
+               OpBranch %55
+         %55 = OpLabel
+               OpLoopMerge %56 %57 None
+               OpBranch %58
+         %58 = OpLabel
+         %59 = OpLoad %int %c
+         %60 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %61 = OpLoad %int %60
+         %62 = OpSLessThan %bool %59 %61
+               OpBranchConditional %62 %63 %56
+         %63 = OpLabel
+         %64 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %65 = OpLoad %int %64
+         %66 = OpLoad %int %c
+         %67 = OpNot %int %66
+         %68 = OpExtInst %int %1 SClamp %67 %int_0 %int_1
+         %69 = OpAccessChain %_ptr_Function_float %M1 %65 %68
+         %70 = OpLoad %float %69
+         %71 = OpLoad %float %a
+         %72 = OpFAdd %float %71 %70
+               OpStore %a %72
+               OpBranch %57
+         %57 = OpLabel
+         %73 = OpLoad %int %c
+         %74 = OpIAdd %int %73 %int_1
+               OpStore %c %74
+               OpBranch %55
+         %56 = OpLabel
+         %75 = OpLoad %float %a
+         %76 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %77 = OpLoad %float %76
+         %78 = OpFOrdEqual %bool %75 %77
+               OpSelectionMerge %79 None
+               OpBranchConditional %78 %80 %81
+         %80 = OpLabel
+         %82 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %83 = OpLoad %int %82
+         %84 = OpConvertSToF %float %83
+         %85 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %86 = OpLoad %int %85
+         %87 = OpConvertSToF %float %86
+         %88 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %89 = OpLoad %int %88
+         %90 = OpConvertSToF %float %89
+         %91 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %92 = OpLoad %int %91
+         %93 = OpConvertSToF %float %92
+         %94 = OpCompositeConstruct %v4float %84 %87 %90 %93
+               OpStore %_GLF_color %94
+               OpBranch %79
+         %81 = OpLabel
+         %95 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %96 = OpLoad %int %95
+         %97 = OpConvertSToF %float %96
+         %98 = OpCompositeConstruct %v4float %97 %97 %97 %97
+               OpStore %_GLF_color %98
+               OpBranch %79
+         %79 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-not-clamp-matrix-access/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-not-clamp-matrix-access/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..e028935
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-not-clamp-matrix-access/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,66 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[5];
+};
+cbuffer cbuffer_x_10 : register(b1, space0) {
+  uint4 x_10[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2x2 M1 = float2x2(0.0f, 0.0f, 0.0f, 0.0f);
+  float a = 0.0f;
+  int c = 0;
+  const float x_41 = asfloat(x_6[1].x);
+  const float x_43 = asfloat(x_6[2].x);
+  const float x_45 = asfloat(x_6[3].x);
+  const float x_47 = asfloat(x_6[4].x);
+  M1 = float2x2(float2(x_41, x_43), float2(x_45, x_47));
+  const float x_52 = asfloat(x_6[1].x);
+  a = x_52;
+  const int x_54 = asint(x_10[1].x);
+  c = x_54;
+  while (true) {
+    const int x_59 = c;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_61 = asint(x_10[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_59 < x_61)) {
+    } else {
+      break;
+    }
+    const int x_65 = asint(x_10[2].x);
+    const float x_70 = M1[x_65][clamp(~(c), 0, 1)];
+    a = (a + x_70);
+    {
+      c = (c + 1);
+    }
+  }
+  const float x_75 = a;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_77 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_75 == x_77)) {
+    const int x_83 = asint(x_10[2].x);
+    const int x_86 = asint(x_10[1].x);
+    const int x_89 = asint(x_10[1].x);
+    const int x_92 = asint(x_10[2].x);
+    x_GLF_color = float4(float(x_83), float(x_86), float(x_89), float(x_92));
+  } else {
+    const int x_96 = asint(x_10[2].x);
+    const float x_97 = float(x_96);
+    x_GLF_color = float4(x_97, x_97, x_97, x_97);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-not-clamp-matrix-access/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-not-clamp-matrix-access/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..b6ec84f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-not-clamp-matrix-access/0-opt.spvasm.expected.msl
@@ -0,0 +1,84 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[5];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_10, thread float4* const tint_symbol_4) {
+  float2x2 M1 = float2x2(0.0f);
+  float a = 0.0f;
+  int c = 0;
+  float const x_41 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  float const x_43 = x_6.x_GLF_uniform_float_values.arr[2].el;
+  float const x_45 = x_6.x_GLF_uniform_float_values.arr[3].el;
+  float const x_47 = x_6.x_GLF_uniform_float_values.arr[4].el;
+  M1 = float2x2(float2(x_41, x_43), float2(x_45, x_47));
+  float const x_52 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  a = x_52;
+  int const x_54 = x_10.x_GLF_uniform_int_values.arr[1].el;
+  c = x_54;
+  while (true) {
+    int const x_59 = c;
+    int const x_61 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_59 < x_61)) {
+    } else {
+      break;
+    }
+    int const x_65 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    int const x_66 = c;
+    float const x_70 = M1[x_65][clamp(~(x_66), 0, 1)];
+    float const x_71 = a;
+    a = (x_71 + x_70);
+    {
+      int const x_73 = c;
+      c = (x_73 + 1);
+    }
+  }
+  float const x_75 = a;
+  float const x_77 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_75 == x_77)) {
+    int const x_83 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    int const x_86 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_89 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_92 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    *(tint_symbol_4) = float4(float(x_83), float(x_86), float(x_89), float(x_92));
+  } else {
+    int const x_96 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    float const x_97 = float(x_96);
+    *(tint_symbol_4) = float4(x_97, x_97, x_97, x_97);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_10 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-not-clamp-matrix-access/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-not-clamp-matrix-access/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..40682e7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-not-clamp-matrix-access/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,184 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 118
+; Schema: 0
+               OpCapability Shader
+         %74 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %M1 "M1"
+               OpName %a "a"
+               OpName %c "c"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_5 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_float_uint_5 = OpTypeArray %float %uint_5
+       %buf0 = OpTypeStruct %_arr_float_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_10 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%mat2v2float = OpTypeMatrix %v2float 2
+%_ptr_Function_mat2v2float = OpTypePointer Function %mat2v2float
+         %28 = OpConstantNull %mat2v2float
+%_ptr_Function_float = OpTypePointer Function %float
+         %31 = OpConstantNull %float
+%_ptr_Function_int = OpTypePointer Function %int
+         %34 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %v4float
+        %106 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+         %M1 = OpVariable %_ptr_Function_mat2v2float Function %28
+          %a = OpVariable %_ptr_Function_float Function %31
+          %c = OpVariable %_ptr_Function_int Function %34
+         %38 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %39 = OpLoad %float %38
+         %41 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %42 = OpLoad %float %41
+         %44 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+         %45 = OpLoad %float %44
+         %47 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_4
+         %48 = OpLoad %float %47
+         %49 = OpCompositeConstruct %v2float %39 %42
+         %50 = OpCompositeConstruct %v2float %45 %48
+         %51 = OpCompositeConstruct %mat2v2float %49 %50
+               OpStore %M1 %51
+         %52 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %53 = OpLoad %float %52
+               OpStore %a %53
+         %55 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %56 = OpLoad %int %55
+               OpStore %c %56
+               OpBranch %57
+         %57 = OpLabel
+               OpLoopMerge %58 %59 None
+               OpBranch %60
+         %60 = OpLabel
+         %61 = OpLoad %int %c
+         %63 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %64 = OpLoad %int %63
+         %65 = OpSLessThan %bool %61 %64
+               OpSelectionMerge %67 None
+               OpBranchConditional %65 %68 %69
+         %68 = OpLabel
+               OpBranch %67
+         %69 = OpLabel
+               OpBranch %58
+         %67 = OpLabel
+         %70 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+         %71 = OpLoad %int %70
+         %72 = OpLoad %int %c
+         %75 = OpNot %int %72
+         %73 = OpExtInst %int %74 SClamp %75 %int_0 %int_1
+         %76 = OpAccessChain %_ptr_Function_float %M1 %71 %73
+         %77 = OpLoad %float %76
+         %78 = OpLoad %float %a
+         %79 = OpFAdd %float %78 %77
+               OpStore %a %79
+               OpBranch %59
+         %59 = OpLabel
+         %80 = OpLoad %int %c
+         %81 = OpIAdd %int %80 %int_1
+               OpStore %c %81
+               OpBranch %57
+         %58 = OpLabel
+         %82 = OpLoad %float %a
+         %83 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %84 = OpLoad %float %83
+         %85 = OpFOrdEqual %bool %82 %84
+               OpSelectionMerge %86 None
+               OpBranchConditional %85 %87 %88
+         %87 = OpLabel
+         %89 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+         %90 = OpLoad %int %89
+         %91 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %92 = OpLoad %int %91
+         %93 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %94 = OpLoad %int %93
+         %95 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+         %96 = OpLoad %int %95
+         %97 = OpConvertSToF %float %90
+         %98 = OpConvertSToF %float %92
+         %99 = OpConvertSToF %float %94
+        %100 = OpConvertSToF %float %96
+        %101 = OpCompositeConstruct %v4float %97 %98 %99 %100
+               OpStore %x_GLF_color %101
+               OpBranch %86
+         %88 = OpLabel
+        %102 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %103 = OpLoad %int %102
+        %104 = OpConvertSToF %float %103
+        %105 = OpCompositeConstruct %v4float %104 %104 %104 %104
+               OpStore %x_GLF_color %105
+               OpBranch %86
+         %86 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %106
+%tint_symbol = OpFunctionParameter %main_out
+        %110 = OpLabel
+        %111 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %111
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %113 = OpLabel
+        %114 = OpFunctionCall %void %main_1
+        %116 = OpLoad %v4float %x_GLF_color
+        %117 = OpCompositeConstruct %main_out %116
+        %115 = OpFunctionCall %void %tint_symbol_2 %117
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-not-clamp-matrix-access/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-not-clamp-matrix-access/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..a1de151
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-not-clamp-matrix-access/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,77 @@
+type Arr = [[stride(16)]] array<f32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var M1 : mat2x2<f32>;
+  var a : f32;
+  var c : i32;
+  let x_41 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_43 : f32 = x_6.x_GLF_uniform_float_values[2];
+  let x_45 : f32 = x_6.x_GLF_uniform_float_values[3];
+  let x_47 : f32 = x_6.x_GLF_uniform_float_values[4];
+  M1 = mat2x2<f32>(vec2<f32>(x_41, x_43), vec2<f32>(x_45, x_47));
+  let x_52 : f32 = x_6.x_GLF_uniform_float_values[1];
+  a = x_52;
+  let x_54 : i32 = x_10.x_GLF_uniform_int_values[1];
+  c = x_54;
+  loop {
+    let x_59 : i32 = c;
+    let x_61 : i32 = x_10.x_GLF_uniform_int_values[0];
+    if ((x_59 < x_61)) {
+    } else {
+      break;
+    }
+    let x_65 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_66 : i32 = c;
+    let x_70 : f32 = M1[x_65][clamp(~(x_66), 0, 1)];
+    let x_71 : f32 = a;
+    a = (x_71 + x_70);
+
+    continuing {
+      let x_73 : i32 = c;
+      c = (x_73 + 1);
+    }
+  }
+  let x_75 : f32 = a;
+  let x_77 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if ((x_75 == x_77)) {
+    let x_83 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_86 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_89 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_92 : i32 = x_10.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_83), f32(x_86), f32(x_89), f32(x_92));
+  } else {
+    let x_96 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_97 : f32 = f32(x_96);
+    x_GLF_color = vec4<f32>(x_97, x_97, x_97, x_97);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-not-clamp-matrix-access/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-not-clamp-matrix-access/0-opt.wgsl
new file mode 100644
index 0000000..a1de151
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-not-clamp-matrix-access/0-opt.wgsl
@@ -0,0 +1,77 @@
+type Arr = [[stride(16)]] array<f32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var M1 : mat2x2<f32>;
+  var a : f32;
+  var c : i32;
+  let x_41 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_43 : f32 = x_6.x_GLF_uniform_float_values[2];
+  let x_45 : f32 = x_6.x_GLF_uniform_float_values[3];
+  let x_47 : f32 = x_6.x_GLF_uniform_float_values[4];
+  M1 = mat2x2<f32>(vec2<f32>(x_41, x_43), vec2<f32>(x_45, x_47));
+  let x_52 : f32 = x_6.x_GLF_uniform_float_values[1];
+  a = x_52;
+  let x_54 : i32 = x_10.x_GLF_uniform_int_values[1];
+  c = x_54;
+  loop {
+    let x_59 : i32 = c;
+    let x_61 : i32 = x_10.x_GLF_uniform_int_values[0];
+    if ((x_59 < x_61)) {
+    } else {
+      break;
+    }
+    let x_65 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_66 : i32 = c;
+    let x_70 : f32 = M1[x_65][clamp(~(x_66), 0, 1)];
+    let x_71 : f32 = a;
+    a = (x_71 + x_70);
+
+    continuing {
+      let x_73 : i32 = c;
+      c = (x_73 + 1);
+    }
+  }
+  let x_75 : f32 = a;
+  let x_77 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if ((x_75 == x_77)) {
+    let x_83 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_86 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_89 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_92 : i32 = x_10.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_83), f32(x_86), f32(x_89), f32(x_92));
+  } else {
+    let x_96 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_97 : f32 = f32(x_96);
+    x_GLF_color = vec4<f32>(x_97, x_97, x_97, x_97);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-not-clamp-matrix-access/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-not-clamp-matrix-access/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..e028935
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-not-clamp-matrix-access/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,66 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[5];
+};
+cbuffer cbuffer_x_10 : register(b1, space0) {
+  uint4 x_10[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2x2 M1 = float2x2(0.0f, 0.0f, 0.0f, 0.0f);
+  float a = 0.0f;
+  int c = 0;
+  const float x_41 = asfloat(x_6[1].x);
+  const float x_43 = asfloat(x_6[2].x);
+  const float x_45 = asfloat(x_6[3].x);
+  const float x_47 = asfloat(x_6[4].x);
+  M1 = float2x2(float2(x_41, x_43), float2(x_45, x_47));
+  const float x_52 = asfloat(x_6[1].x);
+  a = x_52;
+  const int x_54 = asint(x_10[1].x);
+  c = x_54;
+  while (true) {
+    const int x_59 = c;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_61 = asint(x_10[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_59 < x_61)) {
+    } else {
+      break;
+    }
+    const int x_65 = asint(x_10[2].x);
+    const float x_70 = M1[x_65][clamp(~(c), 0, 1)];
+    a = (a + x_70);
+    {
+      c = (c + 1);
+    }
+  }
+  const float x_75 = a;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_77 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_75 == x_77)) {
+    const int x_83 = asint(x_10[2].x);
+    const int x_86 = asint(x_10[1].x);
+    const int x_89 = asint(x_10[1].x);
+    const int x_92 = asint(x_10[2].x);
+    x_GLF_color = float4(float(x_83), float(x_86), float(x_89), float(x_92));
+  } else {
+    const int x_96 = asint(x_10[2].x);
+    const float x_97 = float(x_96);
+    x_GLF_color = float4(x_97, x_97, x_97, x_97);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-not-clamp-matrix-access/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-not-clamp-matrix-access/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..b6ec84f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-not-clamp-matrix-access/0-opt.wgsl.expected.msl
@@ -0,0 +1,84 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[5];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_10, thread float4* const tint_symbol_4) {
+  float2x2 M1 = float2x2(0.0f);
+  float a = 0.0f;
+  int c = 0;
+  float const x_41 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  float const x_43 = x_6.x_GLF_uniform_float_values.arr[2].el;
+  float const x_45 = x_6.x_GLF_uniform_float_values.arr[3].el;
+  float const x_47 = x_6.x_GLF_uniform_float_values.arr[4].el;
+  M1 = float2x2(float2(x_41, x_43), float2(x_45, x_47));
+  float const x_52 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  a = x_52;
+  int const x_54 = x_10.x_GLF_uniform_int_values.arr[1].el;
+  c = x_54;
+  while (true) {
+    int const x_59 = c;
+    int const x_61 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_59 < x_61)) {
+    } else {
+      break;
+    }
+    int const x_65 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    int const x_66 = c;
+    float const x_70 = M1[x_65][clamp(~(x_66), 0, 1)];
+    float const x_71 = a;
+    a = (x_71 + x_70);
+    {
+      int const x_73 = c;
+      c = (x_73 + 1);
+    }
+  }
+  float const x_75 = a;
+  float const x_77 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_75 == x_77)) {
+    int const x_83 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    int const x_86 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_89 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_92 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    *(tint_symbol_4) = float4(float(x_83), float(x_86), float(x_89), float(x_92));
+  } else {
+    int const x_96 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    float const x_97 = float(x_96);
+    *(tint_symbol_4) = float4(x_97, x_97, x_97, x_97);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_10 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-not-clamp-matrix-access/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-not-clamp-matrix-access/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..40682e7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-not-clamp-matrix-access/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,184 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 118
+; Schema: 0
+               OpCapability Shader
+         %74 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %M1 "M1"
+               OpName %a "a"
+               OpName %c "c"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_5 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_float_uint_5 = OpTypeArray %float %uint_5
+       %buf0 = OpTypeStruct %_arr_float_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_10 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%mat2v2float = OpTypeMatrix %v2float 2
+%_ptr_Function_mat2v2float = OpTypePointer Function %mat2v2float
+         %28 = OpConstantNull %mat2v2float
+%_ptr_Function_float = OpTypePointer Function %float
+         %31 = OpConstantNull %float
+%_ptr_Function_int = OpTypePointer Function %int
+         %34 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %v4float
+        %106 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+         %M1 = OpVariable %_ptr_Function_mat2v2float Function %28
+          %a = OpVariable %_ptr_Function_float Function %31
+          %c = OpVariable %_ptr_Function_int Function %34
+         %38 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %39 = OpLoad %float %38
+         %41 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %42 = OpLoad %float %41
+         %44 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+         %45 = OpLoad %float %44
+         %47 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_4
+         %48 = OpLoad %float %47
+         %49 = OpCompositeConstruct %v2float %39 %42
+         %50 = OpCompositeConstruct %v2float %45 %48
+         %51 = OpCompositeConstruct %mat2v2float %49 %50
+               OpStore %M1 %51
+         %52 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %53 = OpLoad %float %52
+               OpStore %a %53
+         %55 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %56 = OpLoad %int %55
+               OpStore %c %56
+               OpBranch %57
+         %57 = OpLabel
+               OpLoopMerge %58 %59 None
+               OpBranch %60
+         %60 = OpLabel
+         %61 = OpLoad %int %c
+         %63 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %64 = OpLoad %int %63
+         %65 = OpSLessThan %bool %61 %64
+               OpSelectionMerge %67 None
+               OpBranchConditional %65 %68 %69
+         %68 = OpLabel
+               OpBranch %67
+         %69 = OpLabel
+               OpBranch %58
+         %67 = OpLabel
+         %70 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+         %71 = OpLoad %int %70
+         %72 = OpLoad %int %c
+         %75 = OpNot %int %72
+         %73 = OpExtInst %int %74 SClamp %75 %int_0 %int_1
+         %76 = OpAccessChain %_ptr_Function_float %M1 %71 %73
+         %77 = OpLoad %float %76
+         %78 = OpLoad %float %a
+         %79 = OpFAdd %float %78 %77
+               OpStore %a %79
+               OpBranch %59
+         %59 = OpLabel
+         %80 = OpLoad %int %c
+         %81 = OpIAdd %int %80 %int_1
+               OpStore %c %81
+               OpBranch %57
+         %58 = OpLabel
+         %82 = OpLoad %float %a
+         %83 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %84 = OpLoad %float %83
+         %85 = OpFOrdEqual %bool %82 %84
+               OpSelectionMerge %86 None
+               OpBranchConditional %85 %87 %88
+         %87 = OpLabel
+         %89 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+         %90 = OpLoad %int %89
+         %91 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %92 = OpLoad %int %91
+         %93 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %94 = OpLoad %int %93
+         %95 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+         %96 = OpLoad %int %95
+         %97 = OpConvertSToF %float %90
+         %98 = OpConvertSToF %float %92
+         %99 = OpConvertSToF %float %94
+        %100 = OpConvertSToF %float %96
+        %101 = OpCompositeConstruct %v4float %97 %98 %99 %100
+               OpStore %x_GLF_color %101
+               OpBranch %86
+         %88 = OpLabel
+        %102 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %103 = OpLoad %int %102
+        %104 = OpConvertSToF %float %103
+        %105 = OpCompositeConstruct %v4float %104 %104 %104 %104
+               OpStore %x_GLF_color %105
+               OpBranch %86
+         %86 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %106
+%tint_symbol = OpFunctionParameter %main_out
+        %110 = OpLabel
+        %111 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %111
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %113 = OpLabel
+        %114 = OpFunctionCall %void %main_1
+        %116 = OpLoad %v4float %x_GLF_color
+        %117 = OpCompositeConstruct %main_out %116
+        %115 = OpFunctionCall %void %tint_symbol_2 %117
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-not-clamp-matrix-access/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-not-clamp-matrix-access/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..a1de151
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-not-clamp-matrix-access/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,77 @@
+type Arr = [[stride(16)]] array<f32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var M1 : mat2x2<f32>;
+  var a : f32;
+  var c : i32;
+  let x_41 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_43 : f32 = x_6.x_GLF_uniform_float_values[2];
+  let x_45 : f32 = x_6.x_GLF_uniform_float_values[3];
+  let x_47 : f32 = x_6.x_GLF_uniform_float_values[4];
+  M1 = mat2x2<f32>(vec2<f32>(x_41, x_43), vec2<f32>(x_45, x_47));
+  let x_52 : f32 = x_6.x_GLF_uniform_float_values[1];
+  a = x_52;
+  let x_54 : i32 = x_10.x_GLF_uniform_int_values[1];
+  c = x_54;
+  loop {
+    let x_59 : i32 = c;
+    let x_61 : i32 = x_10.x_GLF_uniform_int_values[0];
+    if ((x_59 < x_61)) {
+    } else {
+      break;
+    }
+    let x_65 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_66 : i32 = c;
+    let x_70 : f32 = M1[x_65][clamp(~(x_66), 0, 1)];
+    let x_71 : f32 = a;
+    a = (x_71 + x_70);
+
+    continuing {
+      let x_73 : i32 = c;
+      c = (x_73 + 1);
+    }
+  }
+  let x_75 : f32 = a;
+  let x_77 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if ((x_75 == x_77)) {
+    let x_83 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_86 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_89 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_92 : i32 = x_10.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_83), f32(x_86), f32(x_89), f32(x_92));
+  } else {
+    let x_96 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_97 : f32 = f32(x_96);
+    x_GLF_color = vec4<f32>(x_97, x_97, x_97, x_97);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-one-minus-clamp-always-one-cast-to-int/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-one-minus-clamp-always-one-cast-to-int/0-opt.spvasm
new file mode 100644
index 0000000..d791206
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-one-minus-clamp-always-one-cast-to-int/0-opt.spvasm
@@ -0,0 +1,82 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %f "f"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_2 = OpConstant %float 2
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+    %float_1 = OpConstant %float 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %10
+         %26 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function
+          %a = OpVariable %_ptr_Function_int Function
+               OpStore %f %float_2
+         %27 = OpLoad %float %f
+         %28 = OpExtInst %float %1 FClamp %float_1 %float_1 %27
+         %29 = OpFSub %float %float_1 %28
+         %30 = OpConvertFToS %int %29
+               OpStore %a %30
+         %31 = OpLoad %int %a
+         %32 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %33 = OpLoad %int %32
+         %34 = OpIEqual %bool %31 %33
+               OpSelectionMerge %35 None
+               OpBranchConditional %34 %36 %37
+         %36 = OpLabel
+         %38 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %39 = OpLoad %int %38
+         %40 = OpConvertSToF %float %39
+         %41 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %42 = OpLoad %int %41
+         %43 = OpConvertSToF %float %42
+         %44 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %45 = OpLoad %int %44
+         %46 = OpConvertSToF %float %45
+         %47 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %48 = OpLoad %int %47
+         %49 = OpConvertSToF %float %48
+         %50 = OpCompositeConstruct %v4float %40 %43 %46 %49
+               OpStore %_GLF_color %50
+               OpBranch %35
+         %37 = OpLabel
+         %51 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %52 = OpLoad %int %51
+         %53 = OpConvertSToF %float %52
+         %54 = OpCompositeConstruct %v4float %53 %53 %53 %53
+               OpStore %_GLF_color %54
+               OpBranch %35
+         %35 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-one-minus-clamp-always-one-cast-to-int/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-one-minus-clamp-always-one-cast-to-int/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..6710a76
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-one-minus-clamp-always-one-cast-to-int/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,41 @@
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float f = 0.0f;
+  int a = 0;
+  f = 2.0f;
+  a = int((1.0f - clamp(1.0f, 1.0f, f)));
+  const int x_31 = a;
+  const int x_33 = asint(x_7[1].x);
+  if ((x_31 == x_33)) {
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_39 = asint(x_7[scalar_offset / 4][scalar_offset % 4]);
+    const int x_42 = asint(x_7[1].x);
+    const int x_45 = asint(x_7[1].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_48 = asint(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    x_GLF_color = float4(float(x_39), float(x_42), float(x_45), float(x_48));
+  } else {
+    const int x_52 = asint(x_7[1].x);
+    const float x_53 = float(x_52);
+    x_GLF_color = float4(x_53, x_53, x_53, x_53);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-one-minus-clamp-always-one-cast-to-int/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-one-minus-clamp-always-one-cast-to-int/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..824e6dc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-one-minus-clamp-always-one-cast-to-int/0-opt.spvasm.expected.msl
@@ -0,0 +1,50 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_4) {
+  float f = 0.0f;
+  int a = 0;
+  f = 2.0f;
+  float const x_27 = f;
+  a = int((1.0f - clamp(1.0f, 1.0f, x_27)));
+  int const x_31 = a;
+  int const x_33 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_31 == x_33)) {
+    int const x_39 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_42 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    int const x_45 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    int const x_48 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_39), float(x_42), float(x_45), float(x_48));
+  } else {
+    int const x_52 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    float const x_53 = float(x_52);
+    *(tint_symbol_4) = float4(x_53, x_53, x_53, x_53);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-one-minus-clamp-always-one-cast-to-int/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-one-minus-clamp-always-one-cast-to-int/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..3acf316
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-one-minus-clamp-always-one-cast-to-int/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,117 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 73
+; Schema: 0
+               OpCapability Shader
+         %30 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %21 = OpConstantNull %float
+%_ptr_Function_int = OpTypePointer Function %int
+         %24 = OpConstantNull %int
+    %float_2 = OpConstant %float 2
+    %float_1 = OpConstant %float 1
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_0 = OpConstant %int 0
+   %main_out = OpTypeStruct %v4float
+         %61 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %21
+          %a = OpVariable %_ptr_Function_int Function %24
+               OpStore %f %float_2
+         %26 = OpLoad %float %f
+         %29 = OpExtInst %float %30 NClamp %float_1 %float_1 %26
+         %31 = OpFSub %float %float_1 %29
+         %27 = OpConvertFToS %int %31
+               OpStore %a %27
+         %32 = OpLoad %int %a
+         %36 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %37 = OpLoad %int %36
+         %38 = OpIEqual %bool %32 %37
+               OpSelectionMerge %40 None
+               OpBranchConditional %38 %41 %42
+         %41 = OpLabel
+         %44 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %45 = OpLoad %int %44
+         %46 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %47 = OpLoad %int %46
+         %48 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %49 = OpLoad %int %48
+         %50 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %51 = OpLoad %int %50
+         %52 = OpConvertSToF %float %45
+         %53 = OpConvertSToF %float %47
+         %54 = OpConvertSToF %float %49
+         %55 = OpConvertSToF %float %51
+         %56 = OpCompositeConstruct %v4float %52 %53 %54 %55
+               OpStore %x_GLF_color %56
+               OpBranch %40
+         %42 = OpLabel
+         %57 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %58 = OpLoad %int %57
+         %59 = OpConvertSToF %float %58
+         %60 = OpCompositeConstruct %v4float %59 %59 %59 %59
+               OpStore %x_GLF_color %60
+               OpBranch %40
+         %40 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %61
+%tint_symbol = OpFunctionParameter %main_out
+         %65 = OpLabel
+         %66 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %66
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %68 = OpLabel
+         %69 = OpFunctionCall %void %main_1
+         %71 = OpLoad %v4float %x_GLF_color
+         %72 = OpCompositeConstruct %main_out %71
+         %70 = OpFunctionCall %void %tint_symbol_2 %72
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-one-minus-clamp-always-one-cast-to-int/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-one-minus-clamp-always-one-cast-to-int/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..fd31b1f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-one-minus-clamp-always-one-cast-to-int/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,43 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  var a : i32;
+  f = 2.0;
+  let x_27 : f32 = f;
+  a = i32((1.0 - clamp(1.0, 1.0, x_27)));
+  let x_31 : i32 = a;
+  let x_33 : i32 = x_7.x_GLF_uniform_int_values[1];
+  if ((x_31 == x_33)) {
+    let x_39 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_42 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_45 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_48 : i32 = x_7.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_39), f32(x_42), f32(x_45), f32(x_48));
+  } else {
+    let x_52 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_53 : f32 = f32(x_52);
+    x_GLF_color = vec4<f32>(x_53, x_53, x_53, x_53);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-one-minus-clamp-always-one-cast-to-int/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-one-minus-clamp-always-one-cast-to-int/0-opt.wgsl
new file mode 100644
index 0000000..fd31b1f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-one-minus-clamp-always-one-cast-to-int/0-opt.wgsl
@@ -0,0 +1,43 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  var a : i32;
+  f = 2.0;
+  let x_27 : f32 = f;
+  a = i32((1.0 - clamp(1.0, 1.0, x_27)));
+  let x_31 : i32 = a;
+  let x_33 : i32 = x_7.x_GLF_uniform_int_values[1];
+  if ((x_31 == x_33)) {
+    let x_39 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_42 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_45 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_48 : i32 = x_7.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_39), f32(x_42), f32(x_45), f32(x_48));
+  } else {
+    let x_52 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_53 : f32 = f32(x_52);
+    x_GLF_color = vec4<f32>(x_53, x_53, x_53, x_53);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-one-minus-clamp-always-one-cast-to-int/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-one-minus-clamp-always-one-cast-to-int/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..6710a76
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-one-minus-clamp-always-one-cast-to-int/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,41 @@
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float f = 0.0f;
+  int a = 0;
+  f = 2.0f;
+  a = int((1.0f - clamp(1.0f, 1.0f, f)));
+  const int x_31 = a;
+  const int x_33 = asint(x_7[1].x);
+  if ((x_31 == x_33)) {
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_39 = asint(x_7[scalar_offset / 4][scalar_offset % 4]);
+    const int x_42 = asint(x_7[1].x);
+    const int x_45 = asint(x_7[1].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_48 = asint(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    x_GLF_color = float4(float(x_39), float(x_42), float(x_45), float(x_48));
+  } else {
+    const int x_52 = asint(x_7[1].x);
+    const float x_53 = float(x_52);
+    x_GLF_color = float4(x_53, x_53, x_53, x_53);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-one-minus-clamp-always-one-cast-to-int/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-one-minus-clamp-always-one-cast-to-int/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..824e6dc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-one-minus-clamp-always-one-cast-to-int/0-opt.wgsl.expected.msl
@@ -0,0 +1,50 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_4) {
+  float f = 0.0f;
+  int a = 0;
+  f = 2.0f;
+  float const x_27 = f;
+  a = int((1.0f - clamp(1.0f, 1.0f, x_27)));
+  int const x_31 = a;
+  int const x_33 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_31 == x_33)) {
+    int const x_39 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_42 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    int const x_45 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    int const x_48 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_39), float(x_42), float(x_45), float(x_48));
+  } else {
+    int const x_52 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    float const x_53 = float(x_52);
+    *(tint_symbol_4) = float4(x_53, x_53, x_53, x_53);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-one-minus-clamp-always-one-cast-to-int/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-one-minus-clamp-always-one-cast-to-int/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..3acf316
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-one-minus-clamp-always-one-cast-to-int/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,117 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 73
+; Schema: 0
+               OpCapability Shader
+         %30 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %21 = OpConstantNull %float
+%_ptr_Function_int = OpTypePointer Function %int
+         %24 = OpConstantNull %int
+    %float_2 = OpConstant %float 2
+    %float_1 = OpConstant %float 1
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_0 = OpConstant %int 0
+   %main_out = OpTypeStruct %v4float
+         %61 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %21
+          %a = OpVariable %_ptr_Function_int Function %24
+               OpStore %f %float_2
+         %26 = OpLoad %float %f
+         %29 = OpExtInst %float %30 NClamp %float_1 %float_1 %26
+         %31 = OpFSub %float %float_1 %29
+         %27 = OpConvertFToS %int %31
+               OpStore %a %27
+         %32 = OpLoad %int %a
+         %36 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %37 = OpLoad %int %36
+         %38 = OpIEqual %bool %32 %37
+               OpSelectionMerge %40 None
+               OpBranchConditional %38 %41 %42
+         %41 = OpLabel
+         %44 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %45 = OpLoad %int %44
+         %46 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %47 = OpLoad %int %46
+         %48 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %49 = OpLoad %int %48
+         %50 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %51 = OpLoad %int %50
+         %52 = OpConvertSToF %float %45
+         %53 = OpConvertSToF %float %47
+         %54 = OpConvertSToF %float %49
+         %55 = OpConvertSToF %float %51
+         %56 = OpCompositeConstruct %v4float %52 %53 %54 %55
+               OpStore %x_GLF_color %56
+               OpBranch %40
+         %42 = OpLabel
+         %57 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %58 = OpLoad %int %57
+         %59 = OpConvertSToF %float %58
+         %60 = OpCompositeConstruct %v4float %59 %59 %59 %59
+               OpStore %x_GLF_color %60
+               OpBranch %40
+         %40 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %61
+%tint_symbol = OpFunctionParameter %main_out
+         %65 = OpLabel
+         %66 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %66
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %68 = OpLabel
+         %69 = OpFunctionCall %void %main_1
+         %71 = OpLoad %v4float %x_GLF_color
+         %72 = OpCompositeConstruct %main_out %71
+         %70 = OpFunctionCall %void %tint_symbol_2 %72
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-one-minus-clamp-always-one-cast-to-int/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-one-minus-clamp-always-one-cast-to-int/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..fd31b1f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-one-minus-clamp-always-one-cast-to-int/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,43 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  var a : i32;
+  f = 2.0;
+  let x_27 : f32 = f;
+  a = i32((1.0 - clamp(1.0, 1.0, x_27)));
+  let x_31 : i32 = a;
+  let x_33 : i32 = x_7.x_GLF_uniform_int_values[1];
+  if ((x_31 == x_33)) {
+    let x_39 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_42 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_45 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_48 : i32 = x_7.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_39), f32(x_42), f32(x_45), f32(x_48));
+  } else {
+    let x_52 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_53 : f32 = f32(x_52);
+    x_GLF_color = vec4<f32>(x_53, x_53, x_53, x_53);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for-for-do-while-if-if/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for-for-do-while-if-if/0-opt.spvasm
new file mode 100644
index 0000000..58648bb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for-for-do-while-if-if/0-opt.spvasm
@@ -0,0 +1,174 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %j "j"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %15
+         %34 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+          %j = OpVariable %_ptr_Function_int Function
+         %35 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %36 = OpLoad %int %35
+               OpStore %a %36
+         %37 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %38 = OpLoad %int %37
+               OpStore %i %38
+               OpBranch %39
+         %39 = OpLabel
+               OpLoopMerge %40 %41 None
+               OpBranch %42
+         %42 = OpLabel
+         %43 = OpLoad %int %i
+         %44 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %45 = OpLoad %int %44
+         %46 = OpSLessThan %bool %43 %45
+               OpBranchConditional %46 %47 %40
+         %47 = OpLabel
+         %48 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %49 = OpLoad %int %48
+               OpStore %j %49
+               OpBranch %50
+         %50 = OpLabel
+               OpLoopMerge %51 %52 None
+               OpBranch %53
+         %53 = OpLabel
+         %54 = OpLoad %int %j
+         %55 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %56 = OpLoad %int %55
+         %57 = OpSLessThan %bool %54 %56
+               OpBranchConditional %57 %58 %51
+         %58 = OpLabel
+               OpBranch %59
+         %59 = OpLabel
+               OpLoopMerge %60 %61 None
+               OpBranch %62
+         %62 = OpLabel
+         %63 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %64 = OpLoad %int %63
+               OpStore %a %64
+         %65 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %66 = OpLoad %float %65
+         %67 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %68 = OpLoad %float %67
+         %69 = OpFOrdLessThan %bool %66 %68
+               OpSelectionMerge %70 None
+               OpBranchConditional %69 %71 %70
+         %71 = OpLabel
+               OpKill
+         %70 = OpLabel
+               OpBranch %61
+         %61 = OpLabel
+         %72 = OpLoad %int %a
+         %73 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %74 = OpLoad %int %73
+         %75 = OpSLessThan %bool %72 %74
+               OpBranchConditional %75 %59 %60
+         %60 = OpLabel
+         %76 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %77 = OpLoad %float %76
+         %78 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %79 = OpLoad %float %78
+         %80 = OpFOrdLessThan %bool %77 %79
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %81
+         %82 = OpLabel
+               OpBranch %51
+         %81 = OpLabel
+               OpBranch %52
+         %52 = OpLabel
+         %83 = OpLoad %int %j
+         %84 = OpIAdd %int %83 %int_1
+               OpStore %j %84
+               OpBranch %50
+         %51 = OpLabel
+               OpBranch %41
+         %41 = OpLabel
+         %85 = OpLoad %int %i
+         %86 = OpIAdd %int %85 %int_1
+               OpStore %i %86
+               OpBranch %39
+         %40 = OpLabel
+         %87 = OpLoad %int %a
+         %88 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %89 = OpLoad %int %88
+         %90 = OpIEqual %bool %87 %89
+               OpSelectionMerge %91 None
+               OpBranchConditional %90 %92 %93
+         %92 = OpLabel
+         %94 = OpLoad %int %a
+         %95 = OpConvertSToF %float %94
+         %96 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %97 = OpLoad %int %96
+         %98 = OpConvertSToF %float %97
+         %99 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+        %100 = OpLoad %int %99
+        %101 = OpConvertSToF %float %100
+        %102 = OpLoad %int %a
+        %103 = OpConvertSToF %float %102
+        %104 = OpCompositeConstruct %v4float %95 %98 %101 %103
+               OpStore %_GLF_color %104
+               OpBranch %91
+         %93 = OpLabel
+        %105 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+        %106 = OpLoad %int %105
+        %107 = OpConvertSToF %float %106
+        %108 = OpCompositeConstruct %v4float %107 %107 %107 %107
+               OpStore %_GLF_color %108
+               OpBranch %91
+         %91 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for-for-do-while-if-if/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for-for-do-while-if-if/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..400789e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for-for-do-while-if-if/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,100 @@
+cbuffer cbuffer_x_7 : register(b1, space0) {
+  uint4 x_7[3];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_11 : register(b0, space0) {
+  uint4 x_11[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  int i = 0;
+  int j = 0;
+  const int x_36 = asint(x_7[2].x);
+  a = x_36;
+  const int x_38 = asint(x_7[2].x);
+  i = x_38;
+  while (true) {
+    const int x_43 = i;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_45 = asint(x_7[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_43 < x_45)) {
+    } else {
+      break;
+    }
+    const int x_49 = asint(x_7[2].x);
+    j = x_49;
+    while (true) {
+      const int x_54 = j;
+      const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+      const int x_56 = asint(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+      if ((x_54 < x_56)) {
+      } else {
+        break;
+      }
+      while (true) {
+        const int x_64 = asint(x_7[1].x);
+        a = x_64;
+        const float x_66 = gl_FragCoord.y;
+        const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+        const float x_68 = asfloat(x_11[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+        if ((x_66 < x_68)) {
+          discard;
+        }
+        {
+          const int x_72 = a;
+          const int x_74 = asint(x_7[1].x);
+          if ((x_72 < x_74)) {
+          } else {
+            break;
+          }
+        }
+      }
+      const float x_77 = gl_FragCoord.y;
+      const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+      const float x_79 = asfloat(x_11[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+      if ((x_77 < x_79)) {
+        break;
+      }
+      {
+        j = (j + 1);
+      }
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_87 = a;
+  const int x_89 = asint(x_7[1].x);
+  if ((x_87 == x_89)) {
+    const int x_94 = a;
+    const int x_97 = asint(x_7[2].x);
+    const int x_100 = asint(x_7[2].x);
+    x_GLF_color = float4(float(x_94), float(x_97), float(x_100), float(a));
+  } else {
+    const int x_106 = asint(x_7[2].x);
+    const float x_107 = float(x_106);
+    x_GLF_color = float4(x_107, x_107, x_107, x_107);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for-for-do-while-if-if/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for-for-do-while-if-if/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..e1218a1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for-for-do-while-if-if/0-opt.spvasm.expected.msl
@@ -0,0 +1,112 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_7, constant buf0& x_11, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int a = 0;
+  int i = 0;
+  int j = 0;
+  int const x_36 = x_7.x_GLF_uniform_int_values.arr[2].el;
+  a = x_36;
+  int const x_38 = x_7.x_GLF_uniform_int_values.arr[2].el;
+  i = x_38;
+  while (true) {
+    int const x_43 = i;
+    int const x_45 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_43 < x_45)) {
+    } else {
+      break;
+    }
+    int const x_49 = x_7.x_GLF_uniform_int_values.arr[2].el;
+    j = x_49;
+    while (true) {
+      int const x_54 = j;
+      int const x_56 = x_7.x_GLF_uniform_int_values.arr[0].el;
+      if ((x_54 < x_56)) {
+      } else {
+        break;
+      }
+      while (true) {
+        int const x_64 = x_7.x_GLF_uniform_int_values.arr[1].el;
+        a = x_64;
+        float const x_66 = (*(tint_symbol_5)).y;
+        float const x_68 = x_11.x_GLF_uniform_float_values.arr[0].el;
+        if ((x_66 < x_68)) {
+          discard_fragment();
+        }
+        {
+          int const x_72 = a;
+          int const x_74 = x_7.x_GLF_uniform_int_values.arr[1].el;
+          if ((x_72 < x_74)) {
+          } else {
+            break;
+          }
+        }
+      }
+      float const x_77 = (*(tint_symbol_5)).y;
+      float const x_79 = x_11.x_GLF_uniform_float_values.arr[0].el;
+      if ((x_77 < x_79)) {
+        break;
+      }
+      {
+        int const x_83 = j;
+        j = (x_83 + 1);
+      }
+    }
+    {
+      int const x_85 = i;
+      i = (x_85 + 1);
+    }
+  }
+  int const x_87 = a;
+  int const x_89 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_87 == x_89)) {
+    int const x_94 = a;
+    int const x_97 = x_7.x_GLF_uniform_int_values.arr[2].el;
+    int const x_100 = x_7.x_GLF_uniform_int_values.arr[2].el;
+    int const x_102 = a;
+    *(tint_symbol_6) = float4(float(x_94), float(x_97), float(x_100), float(x_102));
+  } else {
+    int const x_106 = x_7.x_GLF_uniform_int_values.arr[2].el;
+    float const x_107 = float(x_106);
+    *(tint_symbol_6) = float4(x_107, x_107, x_107, x_107);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf1& x_7 [[buffer(1)]], constant buf0& x_11 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_7, x_11, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for-for-do-while-if-if/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for-for-do-while-if-if/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..84ab7f4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for-for-do-while-if-if/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,234 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 134
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_11 "x_11"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_11 NonWritable
+               OpDecorate %x_11 DescriptorSet 0
+               OpDecorate %x_11 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_7 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %12
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_11 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+%_ptr_Private_float = OpTypePointer Private %float
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+   %main_out = OpTypeStruct %v4float
+        %121 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %23
+         %26 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %29
+          %i = OpVariable %_ptr_Function_int Function %29
+          %j = OpVariable %_ptr_Function_int Function %29
+         %35 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %36 = OpLoad %int %35
+               OpStore %a %36
+         %37 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %38 = OpLoad %int %37
+               OpStore %i %38
+               OpBranch %39
+         %39 = OpLabel
+               OpLoopMerge %40 %41 None
+               OpBranch %42
+         %42 = OpLabel
+         %43 = OpLoad %int %i
+         %45 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %46 = OpLoad %int %45
+         %47 = OpSLessThan %bool %43 %46
+               OpSelectionMerge %49 None
+               OpBranchConditional %47 %50 %51
+         %50 = OpLabel
+               OpBranch %49
+         %51 = OpLabel
+               OpBranch %40
+         %49 = OpLabel
+         %52 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %53 = OpLoad %int %52
+               OpStore %j %53
+               OpBranch %54
+         %54 = OpLabel
+               OpLoopMerge %55 %56 None
+               OpBranch %57
+         %57 = OpLabel
+         %58 = OpLoad %int %j
+         %59 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %60 = OpLoad %int %59
+         %61 = OpSLessThan %bool %58 %60
+               OpSelectionMerge %62 None
+               OpBranchConditional %61 %63 %64
+         %63 = OpLabel
+               OpBranch %62
+         %64 = OpLabel
+               OpBranch %55
+         %62 = OpLabel
+               OpBranch %65
+         %65 = OpLabel
+               OpLoopMerge %66 %67 None
+               OpBranch %68
+         %68 = OpLabel
+         %70 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %71 = OpLoad %int %70
+               OpStore %a %71
+         %73 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %74 = OpLoad %float %73
+         %76 = OpAccessChain %_ptr_Uniform_float %x_11 %uint_0 %int_0
+         %77 = OpLoad %float %76
+         %78 = OpFOrdLessThan %bool %74 %77
+               OpSelectionMerge %79 None
+               OpBranchConditional %78 %80 %79
+         %80 = OpLabel
+               OpKill
+         %79 = OpLabel
+               OpBranch %67
+         %67 = OpLabel
+         %81 = OpLoad %int %a
+         %82 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %83 = OpLoad %int %82
+         %84 = OpSLessThan %bool %81 %83
+               OpSelectionMerge %85 None
+               OpBranchConditional %84 %86 %87
+         %86 = OpLabel
+               OpBranch %85
+         %87 = OpLabel
+               OpBranch %66
+         %85 = OpLabel
+               OpBranch %65
+         %66 = OpLabel
+         %88 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %89 = OpLoad %float %88
+         %90 = OpAccessChain %_ptr_Uniform_float %x_11 %uint_0 %int_0
+         %91 = OpLoad %float %90
+         %92 = OpFOrdLessThan %bool %89 %91
+               OpSelectionMerge %93 None
+               OpBranchConditional %92 %94 %93
+         %94 = OpLabel
+               OpBranch %55
+         %93 = OpLabel
+               OpBranch %56
+         %56 = OpLabel
+         %95 = OpLoad %int %j
+         %96 = OpIAdd %int %95 %int_1
+               OpStore %j %96
+               OpBranch %54
+         %55 = OpLabel
+               OpBranch %41
+         %41 = OpLabel
+         %97 = OpLoad %int %i
+         %98 = OpIAdd %int %97 %int_1
+               OpStore %i %98
+               OpBranch %39
+         %40 = OpLabel
+         %99 = OpLoad %int %a
+        %100 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+        %101 = OpLoad %int %100
+        %102 = OpIEqual %bool %99 %101
+               OpSelectionMerge %103 None
+               OpBranchConditional %102 %104 %105
+        %104 = OpLabel
+        %106 = OpLoad %int %a
+        %107 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+        %108 = OpLoad %int %107
+        %109 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+        %110 = OpLoad %int %109
+        %111 = OpLoad %int %a
+        %112 = OpConvertSToF %float %106
+        %113 = OpConvertSToF %float %108
+        %114 = OpConvertSToF %float %110
+        %115 = OpConvertSToF %float %111
+        %116 = OpCompositeConstruct %v4float %112 %113 %114 %115
+               OpStore %x_GLF_color %116
+               OpBranch %103
+        %105 = OpLabel
+        %117 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+        %118 = OpLoad %int %117
+        %119 = OpConvertSToF %float %118
+        %120 = OpCompositeConstruct %v4float %119 %119 %119 %119
+               OpStore %x_GLF_color %120
+               OpBranch %103
+        %103 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %121
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %125 = OpLabel
+        %126 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %126
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %23
+        %128 = OpLabel
+        %129 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %129
+        %130 = OpFunctionCall %void %main_1
+        %132 = OpLoad %v4float %x_GLF_color
+        %133 = OpCompositeConstruct %main_out %132
+        %131 = OpFunctionCall %void %tint_symbol_3 %133
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 67[%67] is not post dominated by the back-edge block 85[%85]
+  %85 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for-for-do-while-if-if/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for-for-do-while-if-if/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..9373467
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for-for-do-while-if-if/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,108 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_11 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  var j : i32;
+  let x_36 : i32 = x_7.x_GLF_uniform_int_values[2];
+  a = x_36;
+  let x_38 : i32 = x_7.x_GLF_uniform_int_values[2];
+  i = x_38;
+  loop {
+    let x_43 : i32 = i;
+    let x_45 : i32 = x_7.x_GLF_uniform_int_values[0];
+    if ((x_43 < x_45)) {
+    } else {
+      break;
+    }
+    let x_49 : i32 = x_7.x_GLF_uniform_int_values[2];
+    j = x_49;
+    loop {
+      let x_54 : i32 = j;
+      let x_56 : i32 = x_7.x_GLF_uniform_int_values[0];
+      if ((x_54 < x_56)) {
+      } else {
+        break;
+      }
+      loop {
+        let x_64 : i32 = x_7.x_GLF_uniform_int_values[1];
+        a = x_64;
+        let x_66 : f32 = gl_FragCoord.y;
+        let x_68 : f32 = x_11.x_GLF_uniform_float_values[0];
+        if ((x_66 < x_68)) {
+          discard;
+        }
+
+        continuing {
+          let x_72 : i32 = a;
+          let x_74 : i32 = x_7.x_GLF_uniform_int_values[1];
+          if ((x_72 < x_74)) {
+          } else {
+            break;
+          }
+        }
+      }
+      let x_77 : f32 = gl_FragCoord.y;
+      let x_79 : f32 = x_11.x_GLF_uniform_float_values[0];
+      if ((x_77 < x_79)) {
+        break;
+      }
+
+      continuing {
+        let x_83 : i32 = j;
+        j = (x_83 + 1);
+      }
+    }
+
+    continuing {
+      let x_85 : i32 = i;
+      i = (x_85 + 1);
+    }
+  }
+  let x_87 : i32 = a;
+  let x_89 : i32 = x_7.x_GLF_uniform_int_values[1];
+  if ((x_87 == x_89)) {
+    let x_94 : i32 = a;
+    let x_97 : i32 = x_7.x_GLF_uniform_int_values[2];
+    let x_100 : i32 = x_7.x_GLF_uniform_int_values[2];
+    let x_102 : i32 = a;
+    x_GLF_color = vec4<f32>(f32(x_94), f32(x_97), f32(x_100), f32(x_102));
+  } else {
+    let x_106 : i32 = x_7.x_GLF_uniform_int_values[2];
+    let x_107 : f32 = f32(x_106);
+    x_GLF_color = vec4<f32>(x_107, x_107, x_107, x_107);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for-for-do-while-if-if/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for-for-do-while-if-if/0-opt.wgsl
new file mode 100644
index 0000000..9373467
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for-for-do-while-if-if/0-opt.wgsl
@@ -0,0 +1,108 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_11 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  var j : i32;
+  let x_36 : i32 = x_7.x_GLF_uniform_int_values[2];
+  a = x_36;
+  let x_38 : i32 = x_7.x_GLF_uniform_int_values[2];
+  i = x_38;
+  loop {
+    let x_43 : i32 = i;
+    let x_45 : i32 = x_7.x_GLF_uniform_int_values[0];
+    if ((x_43 < x_45)) {
+    } else {
+      break;
+    }
+    let x_49 : i32 = x_7.x_GLF_uniform_int_values[2];
+    j = x_49;
+    loop {
+      let x_54 : i32 = j;
+      let x_56 : i32 = x_7.x_GLF_uniform_int_values[0];
+      if ((x_54 < x_56)) {
+      } else {
+        break;
+      }
+      loop {
+        let x_64 : i32 = x_7.x_GLF_uniform_int_values[1];
+        a = x_64;
+        let x_66 : f32 = gl_FragCoord.y;
+        let x_68 : f32 = x_11.x_GLF_uniform_float_values[0];
+        if ((x_66 < x_68)) {
+          discard;
+        }
+
+        continuing {
+          let x_72 : i32 = a;
+          let x_74 : i32 = x_7.x_GLF_uniform_int_values[1];
+          if ((x_72 < x_74)) {
+          } else {
+            break;
+          }
+        }
+      }
+      let x_77 : f32 = gl_FragCoord.y;
+      let x_79 : f32 = x_11.x_GLF_uniform_float_values[0];
+      if ((x_77 < x_79)) {
+        break;
+      }
+
+      continuing {
+        let x_83 : i32 = j;
+        j = (x_83 + 1);
+      }
+    }
+
+    continuing {
+      let x_85 : i32 = i;
+      i = (x_85 + 1);
+    }
+  }
+  let x_87 : i32 = a;
+  let x_89 : i32 = x_7.x_GLF_uniform_int_values[1];
+  if ((x_87 == x_89)) {
+    let x_94 : i32 = a;
+    let x_97 : i32 = x_7.x_GLF_uniform_int_values[2];
+    let x_100 : i32 = x_7.x_GLF_uniform_int_values[2];
+    let x_102 : i32 = a;
+    x_GLF_color = vec4<f32>(f32(x_94), f32(x_97), f32(x_100), f32(x_102));
+  } else {
+    let x_106 : i32 = x_7.x_GLF_uniform_int_values[2];
+    let x_107 : f32 = f32(x_106);
+    x_GLF_color = vec4<f32>(x_107, x_107, x_107, x_107);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for-for-do-while-if-if/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for-for-do-while-if-if/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..400789e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for-for-do-while-if-if/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,100 @@
+cbuffer cbuffer_x_7 : register(b1, space0) {
+  uint4 x_7[3];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_11 : register(b0, space0) {
+  uint4 x_11[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  int i = 0;
+  int j = 0;
+  const int x_36 = asint(x_7[2].x);
+  a = x_36;
+  const int x_38 = asint(x_7[2].x);
+  i = x_38;
+  while (true) {
+    const int x_43 = i;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_45 = asint(x_7[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_43 < x_45)) {
+    } else {
+      break;
+    }
+    const int x_49 = asint(x_7[2].x);
+    j = x_49;
+    while (true) {
+      const int x_54 = j;
+      const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+      const int x_56 = asint(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+      if ((x_54 < x_56)) {
+      } else {
+        break;
+      }
+      while (true) {
+        const int x_64 = asint(x_7[1].x);
+        a = x_64;
+        const float x_66 = gl_FragCoord.y;
+        const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+        const float x_68 = asfloat(x_11[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+        if ((x_66 < x_68)) {
+          discard;
+        }
+        {
+          const int x_72 = a;
+          const int x_74 = asint(x_7[1].x);
+          if ((x_72 < x_74)) {
+          } else {
+            break;
+          }
+        }
+      }
+      const float x_77 = gl_FragCoord.y;
+      const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+      const float x_79 = asfloat(x_11[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+      if ((x_77 < x_79)) {
+        break;
+      }
+      {
+        j = (j + 1);
+      }
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_87 = a;
+  const int x_89 = asint(x_7[1].x);
+  if ((x_87 == x_89)) {
+    const int x_94 = a;
+    const int x_97 = asint(x_7[2].x);
+    const int x_100 = asint(x_7[2].x);
+    x_GLF_color = float4(float(x_94), float(x_97), float(x_100), float(a));
+  } else {
+    const int x_106 = asint(x_7[2].x);
+    const float x_107 = float(x_106);
+    x_GLF_color = float4(x_107, x_107, x_107, x_107);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for-for-do-while-if-if/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for-for-do-while-if-if/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..e1218a1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for-for-do-while-if-if/0-opt.wgsl.expected.msl
@@ -0,0 +1,112 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_7, constant buf0& x_11, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int a = 0;
+  int i = 0;
+  int j = 0;
+  int const x_36 = x_7.x_GLF_uniform_int_values.arr[2].el;
+  a = x_36;
+  int const x_38 = x_7.x_GLF_uniform_int_values.arr[2].el;
+  i = x_38;
+  while (true) {
+    int const x_43 = i;
+    int const x_45 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_43 < x_45)) {
+    } else {
+      break;
+    }
+    int const x_49 = x_7.x_GLF_uniform_int_values.arr[2].el;
+    j = x_49;
+    while (true) {
+      int const x_54 = j;
+      int const x_56 = x_7.x_GLF_uniform_int_values.arr[0].el;
+      if ((x_54 < x_56)) {
+      } else {
+        break;
+      }
+      while (true) {
+        int const x_64 = x_7.x_GLF_uniform_int_values.arr[1].el;
+        a = x_64;
+        float const x_66 = (*(tint_symbol_5)).y;
+        float const x_68 = x_11.x_GLF_uniform_float_values.arr[0].el;
+        if ((x_66 < x_68)) {
+          discard_fragment();
+        }
+        {
+          int const x_72 = a;
+          int const x_74 = x_7.x_GLF_uniform_int_values.arr[1].el;
+          if ((x_72 < x_74)) {
+          } else {
+            break;
+          }
+        }
+      }
+      float const x_77 = (*(tint_symbol_5)).y;
+      float const x_79 = x_11.x_GLF_uniform_float_values.arr[0].el;
+      if ((x_77 < x_79)) {
+        break;
+      }
+      {
+        int const x_83 = j;
+        j = (x_83 + 1);
+      }
+    }
+    {
+      int const x_85 = i;
+      i = (x_85 + 1);
+    }
+  }
+  int const x_87 = a;
+  int const x_89 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_87 == x_89)) {
+    int const x_94 = a;
+    int const x_97 = x_7.x_GLF_uniform_int_values.arr[2].el;
+    int const x_100 = x_7.x_GLF_uniform_int_values.arr[2].el;
+    int const x_102 = a;
+    *(tint_symbol_6) = float4(float(x_94), float(x_97), float(x_100), float(x_102));
+  } else {
+    int const x_106 = x_7.x_GLF_uniform_int_values.arr[2].el;
+    float const x_107 = float(x_106);
+    *(tint_symbol_6) = float4(x_107, x_107, x_107, x_107);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf1& x_7 [[buffer(1)]], constant buf0& x_11 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_7, x_11, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for-for-do-while-if-if/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for-for-do-while-if-if/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..84ab7f4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for-for-do-while-if-if/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,234 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 134
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_11 "x_11"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_11 NonWritable
+               OpDecorate %x_11 DescriptorSet 0
+               OpDecorate %x_11 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_7 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %12
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_11 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+%_ptr_Private_float = OpTypePointer Private %float
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+   %main_out = OpTypeStruct %v4float
+        %121 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %23
+         %26 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %29
+          %i = OpVariable %_ptr_Function_int Function %29
+          %j = OpVariable %_ptr_Function_int Function %29
+         %35 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %36 = OpLoad %int %35
+               OpStore %a %36
+         %37 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %38 = OpLoad %int %37
+               OpStore %i %38
+               OpBranch %39
+         %39 = OpLabel
+               OpLoopMerge %40 %41 None
+               OpBranch %42
+         %42 = OpLabel
+         %43 = OpLoad %int %i
+         %45 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %46 = OpLoad %int %45
+         %47 = OpSLessThan %bool %43 %46
+               OpSelectionMerge %49 None
+               OpBranchConditional %47 %50 %51
+         %50 = OpLabel
+               OpBranch %49
+         %51 = OpLabel
+               OpBranch %40
+         %49 = OpLabel
+         %52 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %53 = OpLoad %int %52
+               OpStore %j %53
+               OpBranch %54
+         %54 = OpLabel
+               OpLoopMerge %55 %56 None
+               OpBranch %57
+         %57 = OpLabel
+         %58 = OpLoad %int %j
+         %59 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %60 = OpLoad %int %59
+         %61 = OpSLessThan %bool %58 %60
+               OpSelectionMerge %62 None
+               OpBranchConditional %61 %63 %64
+         %63 = OpLabel
+               OpBranch %62
+         %64 = OpLabel
+               OpBranch %55
+         %62 = OpLabel
+               OpBranch %65
+         %65 = OpLabel
+               OpLoopMerge %66 %67 None
+               OpBranch %68
+         %68 = OpLabel
+         %70 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %71 = OpLoad %int %70
+               OpStore %a %71
+         %73 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %74 = OpLoad %float %73
+         %76 = OpAccessChain %_ptr_Uniform_float %x_11 %uint_0 %int_0
+         %77 = OpLoad %float %76
+         %78 = OpFOrdLessThan %bool %74 %77
+               OpSelectionMerge %79 None
+               OpBranchConditional %78 %80 %79
+         %80 = OpLabel
+               OpKill
+         %79 = OpLabel
+               OpBranch %67
+         %67 = OpLabel
+         %81 = OpLoad %int %a
+         %82 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %83 = OpLoad %int %82
+         %84 = OpSLessThan %bool %81 %83
+               OpSelectionMerge %85 None
+               OpBranchConditional %84 %86 %87
+         %86 = OpLabel
+               OpBranch %85
+         %87 = OpLabel
+               OpBranch %66
+         %85 = OpLabel
+               OpBranch %65
+         %66 = OpLabel
+         %88 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %89 = OpLoad %float %88
+         %90 = OpAccessChain %_ptr_Uniform_float %x_11 %uint_0 %int_0
+         %91 = OpLoad %float %90
+         %92 = OpFOrdLessThan %bool %89 %91
+               OpSelectionMerge %93 None
+               OpBranchConditional %92 %94 %93
+         %94 = OpLabel
+               OpBranch %55
+         %93 = OpLabel
+               OpBranch %56
+         %56 = OpLabel
+         %95 = OpLoad %int %j
+         %96 = OpIAdd %int %95 %int_1
+               OpStore %j %96
+               OpBranch %54
+         %55 = OpLabel
+               OpBranch %41
+         %41 = OpLabel
+         %97 = OpLoad %int %i
+         %98 = OpIAdd %int %97 %int_1
+               OpStore %i %98
+               OpBranch %39
+         %40 = OpLabel
+         %99 = OpLoad %int %a
+        %100 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+        %101 = OpLoad %int %100
+        %102 = OpIEqual %bool %99 %101
+               OpSelectionMerge %103 None
+               OpBranchConditional %102 %104 %105
+        %104 = OpLabel
+        %106 = OpLoad %int %a
+        %107 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+        %108 = OpLoad %int %107
+        %109 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+        %110 = OpLoad %int %109
+        %111 = OpLoad %int %a
+        %112 = OpConvertSToF %float %106
+        %113 = OpConvertSToF %float %108
+        %114 = OpConvertSToF %float %110
+        %115 = OpConvertSToF %float %111
+        %116 = OpCompositeConstruct %v4float %112 %113 %114 %115
+               OpStore %x_GLF_color %116
+               OpBranch %103
+        %105 = OpLabel
+        %117 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+        %118 = OpLoad %int %117
+        %119 = OpConvertSToF %float %118
+        %120 = OpCompositeConstruct %v4float %119 %119 %119 %119
+               OpStore %x_GLF_color %120
+               OpBranch %103
+        %103 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %121
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %125 = OpLabel
+        %126 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %126
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %23
+        %128 = OpLabel
+        %129 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %129
+        %130 = OpFunctionCall %void %main_1
+        %132 = OpLoad %v4float %x_GLF_color
+        %133 = OpCompositeConstruct %main_out %132
+        %131 = OpFunctionCall %void %tint_symbol_3 %133
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 67[%67] is not post dominated by the back-edge block 85[%85]
+  %85 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for-for-do-while-if-if/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for-for-do-while-if-if/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..9373467
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for-for-do-while-if-if/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,108 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_11 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  var j : i32;
+  let x_36 : i32 = x_7.x_GLF_uniform_int_values[2];
+  a = x_36;
+  let x_38 : i32 = x_7.x_GLF_uniform_int_values[2];
+  i = x_38;
+  loop {
+    let x_43 : i32 = i;
+    let x_45 : i32 = x_7.x_GLF_uniform_int_values[0];
+    if ((x_43 < x_45)) {
+    } else {
+      break;
+    }
+    let x_49 : i32 = x_7.x_GLF_uniform_int_values[2];
+    j = x_49;
+    loop {
+      let x_54 : i32 = j;
+      let x_56 : i32 = x_7.x_GLF_uniform_int_values[0];
+      if ((x_54 < x_56)) {
+      } else {
+        break;
+      }
+      loop {
+        let x_64 : i32 = x_7.x_GLF_uniform_int_values[1];
+        a = x_64;
+        let x_66 : f32 = gl_FragCoord.y;
+        let x_68 : f32 = x_11.x_GLF_uniform_float_values[0];
+        if ((x_66 < x_68)) {
+          discard;
+        }
+
+        continuing {
+          let x_72 : i32 = a;
+          let x_74 : i32 = x_7.x_GLF_uniform_int_values[1];
+          if ((x_72 < x_74)) {
+          } else {
+            break;
+          }
+        }
+      }
+      let x_77 : f32 = gl_FragCoord.y;
+      let x_79 : f32 = x_11.x_GLF_uniform_float_values[0];
+      if ((x_77 < x_79)) {
+        break;
+      }
+
+      continuing {
+        let x_83 : i32 = j;
+        j = (x_83 + 1);
+      }
+    }
+
+    continuing {
+      let x_85 : i32 = i;
+      i = (x_85 + 1);
+    }
+  }
+  let x_87 : i32 = a;
+  let x_89 : i32 = x_7.x_GLF_uniform_int_values[1];
+  if ((x_87 == x_89)) {
+    let x_94 : i32 = a;
+    let x_97 : i32 = x_7.x_GLF_uniform_int_values[2];
+    let x_100 : i32 = x_7.x_GLF_uniform_int_values[2];
+    let x_102 : i32 = a;
+    x_GLF_color = vec4<f32>(f32(x_94), f32(x_97), f32(x_100), f32(x_102));
+  } else {
+    let x_106 : i32 = x_7.x_GLF_uniform_int_values[2];
+    let x_107 : f32 = f32(x_106);
+    x_GLF_color = vec4<f32>(x_107, x_107, x_107, x_107);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for/0-opt.spvasm
new file mode 100644
index 0000000..7e9bff0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for/0-opt.spvasm
@@ -0,0 +1,414 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %b "b"
+               OpName %i "i"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %i_0 "i"
+               OpName %i_1 "i"
+               OpName %i_2 "i"
+               OpName %i_3 "i"
+               OpName %i_4 "i"
+               OpName %i_5 "i"
+               OpName %i_6 "i"
+               OpName %i_7 "i"
+               OpName %i_8 "i"
+               OpName %i_9 "i"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %i RelaxedPrecision
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf1 0 RelaxedPrecision
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %24 RelaxedPrecision
+               OpDecorate %25 RelaxedPrecision
+               OpDecorate %26 RelaxedPrecision
+               OpDecorate %i_0 RelaxedPrecision
+               OpDecorate %27 RelaxedPrecision
+               OpDecorate %28 RelaxedPrecision
+               OpDecorate %29 RelaxedPrecision
+               OpDecorate %i_1 RelaxedPrecision
+               OpDecorate %30 RelaxedPrecision
+               OpDecorate %31 RelaxedPrecision
+               OpDecorate %32 RelaxedPrecision
+               OpDecorate %i_2 RelaxedPrecision
+               OpDecorate %33 RelaxedPrecision
+               OpDecorate %34 RelaxedPrecision
+               OpDecorate %35 RelaxedPrecision
+               OpDecorate %i_3 RelaxedPrecision
+               OpDecorate %36 RelaxedPrecision
+               OpDecorate %37 RelaxedPrecision
+               OpDecorate %38 RelaxedPrecision
+               OpDecorate %i_4 RelaxedPrecision
+               OpDecorate %39 RelaxedPrecision
+               OpDecorate %40 RelaxedPrecision
+               OpDecorate %41 RelaxedPrecision
+               OpDecorate %i_5 RelaxedPrecision
+               OpDecorate %42 RelaxedPrecision
+               OpDecorate %43 RelaxedPrecision
+               OpDecorate %44 RelaxedPrecision
+               OpDecorate %i_6 RelaxedPrecision
+               OpDecorate %45 RelaxedPrecision
+               OpDecorate %46 RelaxedPrecision
+               OpDecorate %47 RelaxedPrecision
+               OpDecorate %i_7 RelaxedPrecision
+               OpDecorate %48 RelaxedPrecision
+               OpDecorate %49 RelaxedPrecision
+               OpDecorate %50 RelaxedPrecision
+               OpDecorate %i_8 RelaxedPrecision
+               OpDecorate %51 RelaxedPrecision
+               OpDecorate %52 RelaxedPrecision
+               OpDecorate %53 RelaxedPrecision
+               OpDecorate %i_9 RelaxedPrecision
+               OpDecorate %54 RelaxedPrecision
+               OpDecorate %55 RelaxedPrecision
+               OpDecorate %56 RelaxedPrecision
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %57 RelaxedPrecision
+               OpDecorate %58 RelaxedPrecision
+               OpDecorate %59 RelaxedPrecision
+               OpDecorate %60 RelaxedPrecision
+               OpDecorate %61 RelaxedPrecision
+               OpDecorate %62 RelaxedPrecision
+               OpDecorate %63 RelaxedPrecision
+               OpDecorate %64 RelaxedPrecision
+               OpDecorate %65 RelaxedPrecision
+               OpDecorate %66 RelaxedPrecision
+               OpDecorate %67 RelaxedPrecision
+               OpDecorate %68 RelaxedPrecision
+               OpDecorate %69 RelaxedPrecision
+               OpDecorate %70 RelaxedPrecision
+               OpDecorate %71 RelaxedPrecision
+               OpDecorate %72 RelaxedPrecision
+               OpDecorate %73 RelaxedPrecision
+               OpDecorate %74 RelaxedPrecision
+               OpDecorate %75 RelaxedPrecision
+               OpDecorate %76 RelaxedPrecision
+               OpDecorate %77 RelaxedPrecision
+               OpDecorate %78 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %80 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+%_ptr_Function_int = OpTypePointer Function %int
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_1 = OpConstant %float 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %80
+        %102 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function
+          %b = OpVariable %_ptr_Function_float Function
+          %i = OpVariable %_ptr_Function_int Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+        %i_1 = OpVariable %_ptr_Function_int Function
+        %i_2 = OpVariable %_ptr_Function_int Function
+        %i_3 = OpVariable %_ptr_Function_int Function
+        %i_4 = OpVariable %_ptr_Function_int Function
+        %i_5 = OpVariable %_ptr_Function_int Function
+        %i_6 = OpVariable %_ptr_Function_int Function
+        %i_7 = OpVariable %_ptr_Function_int Function
+        %i_8 = OpVariable %_ptr_Function_int Function
+        %i_9 = OpVariable %_ptr_Function_int Function
+        %103 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+        %104 = OpLoad %float %103
+               OpStore %a %104
+        %105 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+        %106 = OpLoad %float %105
+               OpStore %b %106
+        %107 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %24 = OpLoad %int %107
+               OpStore %i %24
+               OpBranch %108
+        %108 = OpLabel
+               OpLoopMerge %109 %110 None
+               OpBranch %111
+        %111 = OpLabel
+         %25 = OpLoad %int %i
+        %112 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %26 = OpLoad %int %112
+        %113 = OpSLessThan %bool %25 %26
+               OpBranchConditional %113 %114 %109
+        %114 = OpLabel
+        %115 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %27 = OpLoad %int %115
+               OpStore %i_0 %27
+               OpBranch %116
+        %116 = OpLabel
+               OpLoopMerge %117 %118 None
+               OpBranch %119
+        %119 = OpLabel
+         %28 = OpLoad %int %i_0
+        %120 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %29 = OpLoad %int %120
+        %121 = OpSLessThan %bool %28 %29
+               OpBranchConditional %121 %122 %117
+        %122 = OpLabel
+        %123 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %30 = OpLoad %int %123
+               OpStore %i_1 %30
+               OpBranch %124
+        %124 = OpLabel
+               OpLoopMerge %125 %126 None
+               OpBranch %127
+        %127 = OpLabel
+         %31 = OpLoad %int %i_1
+        %128 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %32 = OpLoad %int %128
+        %129 = OpSLessThan %bool %31 %32
+               OpBranchConditional %129 %130 %125
+        %130 = OpLabel
+        %131 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %33 = OpLoad %int %131
+               OpStore %i_2 %33
+               OpBranch %132
+        %132 = OpLabel
+               OpLoopMerge %133 %134 None
+               OpBranch %135
+        %135 = OpLabel
+         %34 = OpLoad %int %i_2
+        %136 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %35 = OpLoad %int %136
+        %137 = OpSLessThan %bool %34 %35
+               OpBranchConditional %137 %138 %133
+        %138 = OpLabel
+        %139 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %36 = OpLoad %int %139
+               OpStore %i_3 %36
+               OpBranch %140
+        %140 = OpLabel
+               OpLoopMerge %141 %142 None
+               OpBranch %143
+        %143 = OpLabel
+         %37 = OpLoad %int %i_3
+        %144 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %38 = OpLoad %int %144
+        %145 = OpSLessThan %bool %37 %38
+               OpBranchConditional %145 %146 %141
+        %146 = OpLabel
+        %147 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %39 = OpLoad %int %147
+               OpStore %i_4 %39
+               OpBranch %148
+        %148 = OpLabel
+               OpLoopMerge %149 %150 None
+               OpBranch %151
+        %151 = OpLabel
+         %40 = OpLoad %int %i_4
+        %152 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %41 = OpLoad %int %152
+        %153 = OpSLessThan %bool %40 %41
+               OpBranchConditional %153 %154 %149
+        %154 = OpLabel
+        %155 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %42 = OpLoad %int %155
+               OpStore %i_5 %42
+               OpBranch %156
+        %156 = OpLabel
+               OpLoopMerge %157 %158 None
+               OpBranch %159
+        %159 = OpLabel
+         %43 = OpLoad %int %i_5
+        %160 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %44 = OpLoad %int %160
+        %161 = OpSLessThan %bool %43 %44
+               OpBranchConditional %161 %162 %157
+        %162 = OpLabel
+        %163 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %45 = OpLoad %int %163
+               OpStore %i_6 %45
+               OpBranch %164
+        %164 = OpLabel
+               OpLoopMerge %165 %166 None
+               OpBranch %167
+        %167 = OpLabel
+         %46 = OpLoad %int %i_6
+        %168 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %47 = OpLoad %int %168
+        %169 = OpSLessThan %bool %46 %47
+               OpBranchConditional %169 %170 %165
+        %170 = OpLabel
+        %171 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %48 = OpLoad %int %171
+               OpStore %i_7 %48
+               OpBranch %172
+        %172 = OpLabel
+               OpLoopMerge %173 %174 None
+               OpBranch %175
+        %175 = OpLabel
+         %49 = OpLoad %int %i_7
+        %176 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %50 = OpLoad %int %176
+        %177 = OpSLessThan %bool %49 %50
+               OpBranchConditional %177 %178 %173
+        %178 = OpLabel
+        %179 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %51 = OpLoad %int %179
+               OpStore %i_8 %51
+               OpBranch %180
+        %180 = OpLabel
+               OpLoopMerge %181 %182 None
+               OpBranch %183
+        %183 = OpLabel
+         %52 = OpLoad %int %i_8
+        %184 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %53 = OpLoad %int %184
+        %185 = OpSLessThan %bool %52 %53
+               OpBranchConditional %185 %186 %181
+        %186 = OpLabel
+        %187 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %54 = OpLoad %int %187
+               OpStore %i_9 %54
+               OpBranch %188
+        %188 = OpLabel
+               OpLoopMerge %189 %190 None
+               OpBranch %191
+        %191 = OpLabel
+         %55 = OpLoad %int %i_9
+        %192 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %56 = OpLoad %int %192
+        %193 = OpSLessThan %bool %55 %56
+               OpBranchConditional %193 %194 %189
+        %194 = OpLabel
+        %195 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+        %196 = OpLoad %float %195
+               OpStore %a %196
+        %197 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %198 = OpLoad %float %197
+        %199 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+        %200 = OpLoad %float %199
+        %201 = OpFOrdGreaterThan %bool %198 %200
+               OpSelectionMerge %202 None
+               OpBranchConditional %201 %203 %202
+        %203 = OpLabel
+               OpBranch %189
+        %202 = OpLabel
+               OpBranch %190
+        %190 = OpLabel
+         %57 = OpLoad %int %i_9
+         %58 = OpIAdd %int %57 %int_1
+               OpStore %i_9 %58
+               OpBranch %188
+        %189 = OpLabel
+               OpBranch %182
+        %182 = OpLabel
+         %59 = OpLoad %int %i_8
+         %60 = OpIAdd %int %59 %int_1
+               OpStore %i_8 %60
+               OpBranch %180
+        %181 = OpLabel
+               OpBranch %174
+        %174 = OpLabel
+         %61 = OpLoad %int %i_7
+         %62 = OpIAdd %int %61 %int_1
+               OpStore %i_7 %62
+               OpBranch %172
+        %173 = OpLabel
+               OpBranch %166
+        %166 = OpLabel
+         %63 = OpLoad %int %i_6
+         %64 = OpIAdd %int %63 %int_1
+               OpStore %i_6 %64
+               OpBranch %164
+        %165 = OpLabel
+               OpBranch %158
+        %158 = OpLabel
+         %65 = OpLoad %int %i_5
+         %66 = OpIAdd %int %65 %int_1
+               OpStore %i_5 %66
+               OpBranch %156
+        %157 = OpLabel
+               OpBranch %150
+        %150 = OpLabel
+         %67 = OpLoad %int %i_4
+         %68 = OpIAdd %int %67 %int_1
+               OpStore %i_4 %68
+               OpBranch %148
+        %149 = OpLabel
+               OpBranch %142
+        %142 = OpLabel
+         %69 = OpLoad %int %i_3
+         %70 = OpIAdd %int %69 %int_1
+               OpStore %i_3 %70
+               OpBranch %140
+        %141 = OpLabel
+               OpBranch %134
+        %134 = OpLabel
+         %71 = OpLoad %int %i_2
+         %72 = OpIAdd %int %71 %int_1
+               OpStore %i_2 %72
+               OpBranch %132
+        %133 = OpLabel
+               OpBranch %126
+        %126 = OpLabel
+         %73 = OpLoad %int %i_1
+         %74 = OpIAdd %int %73 %int_1
+               OpStore %i_1 %74
+               OpBranch %124
+        %125 = OpLabel
+               OpBranch %118
+        %118 = OpLabel
+         %75 = OpLoad %int %i_0
+         %76 = OpIAdd %int %75 %int_1
+               OpStore %i_0 %76
+               OpBranch %116
+        %117 = OpLabel
+        %204 = OpLoad %float %b
+        %205 = OpFAdd %float %204 %float_1
+               OpStore %b %205
+               OpBranch %110
+        %110 = OpLabel
+         %77 = OpLoad %int %i
+         %78 = OpIAdd %int %77 %int_1
+               OpStore %i %78
+               OpBranch %108
+        %109 = OpLabel
+        %206 = OpLoad %float %b
+        %207 = OpLoad %float %a
+        %208 = OpLoad %float %a
+        %209 = OpLoad %float %b
+        %210 = OpCompositeConstruct %v4float %206 %207 %208 %209
+               OpStore %_GLF_color %210
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..3345993
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,212 @@
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[2];
+};
+cbuffer cbuffer_x_11 : register(b1, space0) {
+  uint4 x_11[3];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float a = 0.0f;
+  float b = 0.0f;
+  int i = 0;
+  int i_1 = 0;
+  int i_2 = 0;
+  int i_3 = 0;
+  int i_4 = 0;
+  int i_5 = 0;
+  int i_6 = 0;
+  int i_7 = 0;
+  int i_8 = 0;
+  int i_9 = 0;
+  int i_10 = 0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_104 = asfloat(x_7[scalar_offset / 4][scalar_offset % 4]);
+  a = x_104;
+  const float x_106 = asfloat(x_7[1].x);
+  b = x_106;
+  const int x_24 = asint(x_11[1].x);
+  i = x_24;
+  while (true) {
+    const int x_25 = i;
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_26 = asint(x_11[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    if ((x_25 < x_26)) {
+    } else {
+      break;
+    }
+    const int x_27 = asint(x_11[1].x);
+    i_1 = x_27;
+    while (true) {
+      const int x_28 = i_1;
+      const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+      const int x_29 = asint(x_11[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+      if ((x_28 < x_29)) {
+      } else {
+        break;
+      }
+      const int x_30 = asint(x_11[1].x);
+      i_2 = x_30;
+      while (true) {
+        const int x_31 = i_2;
+        const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+        const int x_32 = asint(x_11[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+        if ((x_31 < x_32)) {
+        } else {
+          break;
+        }
+        const int x_33 = asint(x_11[2].x);
+        i_3 = x_33;
+        while (true) {
+          const int x_34 = i_3;
+          const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+          const int x_35 = asint(x_11[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+          if ((x_34 < x_35)) {
+          } else {
+            break;
+          }
+          const int x_36 = asint(x_11[2].x);
+          i_4 = x_36;
+          while (true) {
+            const int x_37 = i_4;
+            const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+            const int x_38 = asint(x_11[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+            if ((x_37 < x_38)) {
+            } else {
+              break;
+            }
+            const int x_39 = asint(x_11[1].x);
+            i_5 = x_39;
+            while (true) {
+              const int x_40 = i_5;
+              const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+              const int x_41 = asint(x_11[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+              if ((x_40 < x_41)) {
+              } else {
+                break;
+              }
+              const int x_42 = asint(x_11[1].x);
+              i_6 = x_42;
+              while (true) {
+                const int x_43 = i_6;
+                const uint scalar_offset_7 = ((16u * uint(0))) / 4;
+                const int x_44 = asint(x_11[scalar_offset_7 / 4][scalar_offset_7 % 4]);
+                if ((x_43 < x_44)) {
+                } else {
+                  break;
+                }
+                const int x_45 = asint(x_11[1].x);
+                i_7 = x_45;
+                while (true) {
+                  const int x_46 = i_7;
+                  const uint scalar_offset_8 = ((16u * uint(0))) / 4;
+                  const int x_47 = asint(x_11[scalar_offset_8 / 4][scalar_offset_8 % 4]);
+                  if ((x_46 < x_47)) {
+                  } else {
+                    break;
+                  }
+                  const int x_48 = asint(x_11[1].x);
+                  i_8 = x_48;
+                  while (true) {
+                    const int x_49 = i_8;
+                    const uint scalar_offset_9 = ((16u * uint(0))) / 4;
+                    const int x_50 = asint(x_11[scalar_offset_9 / 4][scalar_offset_9 % 4]);
+                    if ((x_49 < x_50)) {
+                    } else {
+                      break;
+                    }
+                    const int x_51 = asint(x_11[1].x);
+                    i_9 = x_51;
+                    while (true) {
+                      const int x_52 = i_9;
+                      const uint scalar_offset_10 = ((16u * uint(0))) / 4;
+                      const int x_53 = asint(x_11[scalar_offset_10 / 4][scalar_offset_10 % 4]);
+                      if ((x_52 < x_53)) {
+                      } else {
+                        break;
+                      }
+                      const int x_54 = asint(x_11[1].x);
+                      i_10 = x_54;
+                      while (true) {
+                        const int x_55 = i_10;
+                        const uint scalar_offset_11 = ((16u * uint(0))) / 4;
+                        const int x_56 = asint(x_11[scalar_offset_11 / 4][scalar_offset_11 % 4]);
+                        if ((x_55 < x_56)) {
+                        } else {
+                          break;
+                        }
+                        const float x_196 = asfloat(x_7[1].x);
+                        a = x_196;
+                        const float x_198 = gl_FragCoord.y;
+                        const float x_200 = asfloat(x_7[1].x);
+                        if ((x_198 > x_200)) {
+                          break;
+                        }
+                        {
+                          i_10 = (i_10 + 1);
+                        }
+                      }
+                      {
+                        i_9 = (i_9 + 1);
+                      }
+                    }
+                    {
+                      i_8 = (i_8 + 1);
+                    }
+                  }
+                  {
+                    i_7 = (i_7 + 1);
+                  }
+                }
+                {
+                  i_6 = (i_6 + 1);
+                }
+              }
+              {
+                i_5 = (i_5 + 1);
+              }
+            }
+            {
+              i_4 = (i_4 + 1);
+            }
+          }
+          {
+            i_3 = (i_3 + 1);
+          }
+        }
+        {
+          i_2 = (i_2 + 1);
+        }
+      }
+      {
+        i_1 = (i_1 + 1);
+      }
+    }
+    b = (b + 1.0f);
+    {
+      i = (i + 1);
+    }
+  }
+  x_GLF_color = float4(b, a, a, b);
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..8d410b0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for/0-opt.spvasm.expected.msl
@@ -0,0 +1,229 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, constant buf1& x_11, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float a = 0.0f;
+  float b = 0.0f;
+  int i = 0;
+  int i_1 = 0;
+  int i_2 = 0;
+  int i_3 = 0;
+  int i_4 = 0;
+  int i_5 = 0;
+  int i_6 = 0;
+  int i_7 = 0;
+  int i_8 = 0;
+  int i_9 = 0;
+  int i_10 = 0;
+  float const x_104 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  a = x_104;
+  float const x_106 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  b = x_106;
+  int const x_24 = x_11.x_GLF_uniform_int_values.arr[1].el;
+  i = x_24;
+  while (true) {
+    int const x_25 = i;
+    int const x_26 = x_11.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_25 < x_26)) {
+    } else {
+      break;
+    }
+    int const x_27 = x_11.x_GLF_uniform_int_values.arr[1].el;
+    i_1 = x_27;
+    while (true) {
+      int const x_28 = i_1;
+      int const x_29 = x_11.x_GLF_uniform_int_values.arr[0].el;
+      if ((x_28 < x_29)) {
+      } else {
+        break;
+      }
+      int const x_30 = x_11.x_GLF_uniform_int_values.arr[1].el;
+      i_2 = x_30;
+      while (true) {
+        int const x_31 = i_2;
+        int const x_32 = x_11.x_GLF_uniform_int_values.arr[0].el;
+        if ((x_31 < x_32)) {
+        } else {
+          break;
+        }
+        int const x_33 = x_11.x_GLF_uniform_int_values.arr[2].el;
+        i_3 = x_33;
+        while (true) {
+          int const x_34 = i_3;
+          int const x_35 = x_11.x_GLF_uniform_int_values.arr[0].el;
+          if ((x_34 < x_35)) {
+          } else {
+            break;
+          }
+          int const x_36 = x_11.x_GLF_uniform_int_values.arr[2].el;
+          i_4 = x_36;
+          while (true) {
+            int const x_37 = i_4;
+            int const x_38 = x_11.x_GLF_uniform_int_values.arr[0].el;
+            if ((x_37 < x_38)) {
+            } else {
+              break;
+            }
+            int const x_39 = x_11.x_GLF_uniform_int_values.arr[1].el;
+            i_5 = x_39;
+            while (true) {
+              int const x_40 = i_5;
+              int const x_41 = x_11.x_GLF_uniform_int_values.arr[0].el;
+              if ((x_40 < x_41)) {
+              } else {
+                break;
+              }
+              int const x_42 = x_11.x_GLF_uniform_int_values.arr[1].el;
+              i_6 = x_42;
+              while (true) {
+                int const x_43 = i_6;
+                int const x_44 = x_11.x_GLF_uniform_int_values.arr[0].el;
+                if ((x_43 < x_44)) {
+                } else {
+                  break;
+                }
+                int const x_45 = x_11.x_GLF_uniform_int_values.arr[1].el;
+                i_7 = x_45;
+                while (true) {
+                  int const x_46 = i_7;
+                  int const x_47 = x_11.x_GLF_uniform_int_values.arr[0].el;
+                  if ((x_46 < x_47)) {
+                  } else {
+                    break;
+                  }
+                  int const x_48 = x_11.x_GLF_uniform_int_values.arr[1].el;
+                  i_8 = x_48;
+                  while (true) {
+                    int const x_49 = i_8;
+                    int const x_50 = x_11.x_GLF_uniform_int_values.arr[0].el;
+                    if ((x_49 < x_50)) {
+                    } else {
+                      break;
+                    }
+                    int const x_51 = x_11.x_GLF_uniform_int_values.arr[1].el;
+                    i_9 = x_51;
+                    while (true) {
+                      int const x_52 = i_9;
+                      int const x_53 = x_11.x_GLF_uniform_int_values.arr[0].el;
+                      if ((x_52 < x_53)) {
+                      } else {
+                        break;
+                      }
+                      int const x_54 = x_11.x_GLF_uniform_int_values.arr[1].el;
+                      i_10 = x_54;
+                      while (true) {
+                        int const x_55 = i_10;
+                        int const x_56 = x_11.x_GLF_uniform_int_values.arr[0].el;
+                        if ((x_55 < x_56)) {
+                        } else {
+                          break;
+                        }
+                        float const x_196 = x_7.x_GLF_uniform_float_values.arr[1].el;
+                        a = x_196;
+                        float const x_198 = (*(tint_symbol_5)).y;
+                        float const x_200 = x_7.x_GLF_uniform_float_values.arr[1].el;
+                        if ((x_198 > x_200)) {
+                          break;
+                        }
+                        {
+                          int const x_57 = i_10;
+                          i_10 = (x_57 + 1);
+                        }
+                      }
+                      {
+                        int const x_59 = i_9;
+                        i_9 = (x_59 + 1);
+                      }
+                    }
+                    {
+                      int const x_61 = i_8;
+                      i_8 = (x_61 + 1);
+                    }
+                  }
+                  {
+                    int const x_63 = i_7;
+                    i_7 = (x_63 + 1);
+                  }
+                }
+                {
+                  int const x_65 = i_6;
+                  i_6 = (x_65 + 1);
+                }
+              }
+              {
+                int const x_67 = i_5;
+                i_5 = (x_67 + 1);
+              }
+            }
+            {
+              int const x_69 = i_4;
+              i_4 = (x_69 + 1);
+            }
+          }
+          {
+            int const x_71 = i_3;
+            i_3 = (x_71 + 1);
+          }
+        }
+        {
+          int const x_73 = i_2;
+          i_2 = (x_73 + 1);
+        }
+      }
+      {
+        int const x_75 = i_1;
+        i_1 = (x_75 + 1);
+      }
+    }
+    float const x_204 = b;
+    b = (x_204 + 1.0f);
+    {
+      int const x_77 = i;
+      i = (x_77 + 1);
+    }
+  }
+  float const x_206 = b;
+  float const x_207 = a;
+  float const x_208 = a;
+  float const x_209 = b;
+  *(tint_symbol_6) = float4(x_206, x_207, x_208, x_209);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]], constant buf1& x_11 [[buffer(1)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_7, x_11, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..2125db7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,441 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 252
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_7 "x_7"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_11 "x_11"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %i "i"
+               OpName %i_1 "i_1"
+               OpName %i_2 "i_2"
+               OpName %i_3 "i_3"
+               OpName %i_4 "i_4"
+               OpName %i_5 "i_5"
+               OpName %i_6 "i_6"
+               OpName %i_7 "i_7"
+               OpName %i_8 "i_8"
+               OpName %i_9 "i_9"
+               OpName %i_10 "i_10"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_11 NonWritable
+               OpDecorate %x_11 DescriptorSet 0
+               OpDecorate %x_11 Binding 1
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_11 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %17
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %29 = OpConstantNull %float
+%_ptr_Function_int = OpTypePointer Function %int
+         %33 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %239 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %23
+         %26 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function %29
+          %b = OpVariable %_ptr_Function_float Function %29
+          %i = OpVariable %_ptr_Function_int Function %33
+        %i_1 = OpVariable %_ptr_Function_int Function %33
+        %i_2 = OpVariable %_ptr_Function_int Function %33
+        %i_3 = OpVariable %_ptr_Function_int Function %33
+        %i_4 = OpVariable %_ptr_Function_int Function %33
+        %i_5 = OpVariable %_ptr_Function_int Function %33
+        %i_6 = OpVariable %_ptr_Function_int Function %33
+        %i_7 = OpVariable %_ptr_Function_int Function %33
+        %i_8 = OpVariable %_ptr_Function_int Function %33
+        %i_9 = OpVariable %_ptr_Function_int Function %33
+       %i_10 = OpVariable %_ptr_Function_int Function %33
+         %47 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %48 = OpLoad %float %47
+               OpStore %a %48
+         %50 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %51 = OpLoad %float %50
+               OpStore %b %51
+         %53 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+         %54 = OpLoad %int %53
+               OpStore %i %54
+               OpBranch %55
+         %55 = OpLabel
+               OpLoopMerge %56 %57 None
+               OpBranch %58
+         %58 = OpLabel
+         %59 = OpLoad %int %i
+         %60 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+         %61 = OpLoad %int %60
+         %62 = OpSLessThan %bool %59 %61
+               OpSelectionMerge %64 None
+               OpBranchConditional %62 %65 %66
+         %65 = OpLabel
+               OpBranch %64
+         %66 = OpLabel
+               OpBranch %56
+         %64 = OpLabel
+         %67 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+         %68 = OpLoad %int %67
+               OpStore %i_1 %68
+               OpBranch %69
+         %69 = OpLabel
+               OpLoopMerge %70 %71 None
+               OpBranch %72
+         %72 = OpLabel
+         %73 = OpLoad %int %i_1
+         %74 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+         %75 = OpLoad %int %74
+         %76 = OpSLessThan %bool %73 %75
+               OpSelectionMerge %77 None
+               OpBranchConditional %76 %78 %79
+         %78 = OpLabel
+               OpBranch %77
+         %79 = OpLabel
+               OpBranch %70
+         %77 = OpLabel
+         %80 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+         %81 = OpLoad %int %80
+               OpStore %i_2 %81
+               OpBranch %82
+         %82 = OpLabel
+               OpLoopMerge %83 %84 None
+               OpBranch %85
+         %85 = OpLabel
+         %86 = OpLoad %int %i_2
+         %87 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+         %88 = OpLoad %int %87
+         %89 = OpSLessThan %bool %86 %88
+               OpSelectionMerge %90 None
+               OpBranchConditional %89 %91 %92
+         %91 = OpLabel
+               OpBranch %90
+         %92 = OpLabel
+               OpBranch %83
+         %90 = OpLabel
+         %94 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_2
+         %95 = OpLoad %int %94
+               OpStore %i_3 %95
+               OpBranch %96
+         %96 = OpLabel
+               OpLoopMerge %97 %98 None
+               OpBranch %99
+         %99 = OpLabel
+        %100 = OpLoad %int %i_3
+        %101 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+        %102 = OpLoad %int %101
+        %103 = OpSLessThan %bool %100 %102
+               OpSelectionMerge %104 None
+               OpBranchConditional %103 %105 %106
+        %105 = OpLabel
+               OpBranch %104
+        %106 = OpLabel
+               OpBranch %97
+        %104 = OpLabel
+        %107 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_2
+        %108 = OpLoad %int %107
+               OpStore %i_4 %108
+               OpBranch %109
+        %109 = OpLabel
+               OpLoopMerge %110 %111 None
+               OpBranch %112
+        %112 = OpLabel
+        %113 = OpLoad %int %i_4
+        %114 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+        %115 = OpLoad %int %114
+        %116 = OpSLessThan %bool %113 %115
+               OpSelectionMerge %117 None
+               OpBranchConditional %116 %118 %119
+        %118 = OpLabel
+               OpBranch %117
+        %119 = OpLabel
+               OpBranch %110
+        %117 = OpLabel
+        %120 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+        %121 = OpLoad %int %120
+               OpStore %i_5 %121
+               OpBranch %122
+        %122 = OpLabel
+               OpLoopMerge %123 %124 None
+               OpBranch %125
+        %125 = OpLabel
+        %126 = OpLoad %int %i_5
+        %127 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+        %128 = OpLoad %int %127
+        %129 = OpSLessThan %bool %126 %128
+               OpSelectionMerge %130 None
+               OpBranchConditional %129 %131 %132
+        %131 = OpLabel
+               OpBranch %130
+        %132 = OpLabel
+               OpBranch %123
+        %130 = OpLabel
+        %133 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+        %134 = OpLoad %int %133
+               OpStore %i_6 %134
+               OpBranch %135
+        %135 = OpLabel
+               OpLoopMerge %136 %137 None
+               OpBranch %138
+        %138 = OpLabel
+        %139 = OpLoad %int %i_6
+        %140 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+        %141 = OpLoad %int %140
+        %142 = OpSLessThan %bool %139 %141
+               OpSelectionMerge %143 None
+               OpBranchConditional %142 %144 %145
+        %144 = OpLabel
+               OpBranch %143
+        %145 = OpLabel
+               OpBranch %136
+        %143 = OpLabel
+        %146 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+        %147 = OpLoad %int %146
+               OpStore %i_7 %147
+               OpBranch %148
+        %148 = OpLabel
+               OpLoopMerge %149 %150 None
+               OpBranch %151
+        %151 = OpLabel
+        %152 = OpLoad %int %i_7
+        %153 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+        %154 = OpLoad %int %153
+        %155 = OpSLessThan %bool %152 %154
+               OpSelectionMerge %156 None
+               OpBranchConditional %155 %157 %158
+        %157 = OpLabel
+               OpBranch %156
+        %158 = OpLabel
+               OpBranch %149
+        %156 = OpLabel
+        %159 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+        %160 = OpLoad %int %159
+               OpStore %i_8 %160
+               OpBranch %161
+        %161 = OpLabel
+               OpLoopMerge %162 %163 None
+               OpBranch %164
+        %164 = OpLabel
+        %165 = OpLoad %int %i_8
+        %166 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+        %167 = OpLoad %int %166
+        %168 = OpSLessThan %bool %165 %167
+               OpSelectionMerge %169 None
+               OpBranchConditional %168 %170 %171
+        %170 = OpLabel
+               OpBranch %169
+        %171 = OpLabel
+               OpBranch %162
+        %169 = OpLabel
+        %172 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+        %173 = OpLoad %int %172
+               OpStore %i_9 %173
+               OpBranch %174
+        %174 = OpLabel
+               OpLoopMerge %175 %176 None
+               OpBranch %177
+        %177 = OpLabel
+        %178 = OpLoad %int %i_9
+        %179 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+        %180 = OpLoad %int %179
+        %181 = OpSLessThan %bool %178 %180
+               OpSelectionMerge %182 None
+               OpBranchConditional %181 %183 %184
+        %183 = OpLabel
+               OpBranch %182
+        %184 = OpLabel
+               OpBranch %175
+        %182 = OpLabel
+        %185 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+        %186 = OpLoad %int %185
+               OpStore %i_10 %186
+               OpBranch %187
+        %187 = OpLabel
+               OpLoopMerge %188 %189 None
+               OpBranch %190
+        %190 = OpLabel
+        %191 = OpLoad %int %i_10
+        %192 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+        %193 = OpLoad %int %192
+        %194 = OpSLessThan %bool %191 %193
+               OpSelectionMerge %195 None
+               OpBranchConditional %194 %196 %197
+        %196 = OpLabel
+               OpBranch %195
+        %197 = OpLabel
+               OpBranch %188
+        %195 = OpLabel
+        %198 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+        %199 = OpLoad %float %198
+               OpStore %a %199
+        %202 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %203 = OpLoad %float %202
+        %204 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+        %205 = OpLoad %float %204
+        %206 = OpFOrdGreaterThan %bool %203 %205
+               OpSelectionMerge %207 None
+               OpBranchConditional %206 %208 %207
+        %208 = OpLabel
+               OpBranch %188
+        %207 = OpLabel
+               OpBranch %189
+        %189 = OpLabel
+        %209 = OpLoad %int %i_10
+        %210 = OpIAdd %int %209 %int_1
+               OpStore %i_10 %210
+               OpBranch %187
+        %188 = OpLabel
+               OpBranch %176
+        %176 = OpLabel
+        %211 = OpLoad %int %i_9
+        %212 = OpIAdd %int %211 %int_1
+               OpStore %i_9 %212
+               OpBranch %174
+        %175 = OpLabel
+               OpBranch %163
+        %163 = OpLabel
+        %213 = OpLoad %int %i_8
+        %214 = OpIAdd %int %213 %int_1
+               OpStore %i_8 %214
+               OpBranch %161
+        %162 = OpLabel
+               OpBranch %150
+        %150 = OpLabel
+        %215 = OpLoad %int %i_7
+        %216 = OpIAdd %int %215 %int_1
+               OpStore %i_7 %216
+               OpBranch %148
+        %149 = OpLabel
+               OpBranch %137
+        %137 = OpLabel
+        %217 = OpLoad %int %i_6
+        %218 = OpIAdd %int %217 %int_1
+               OpStore %i_6 %218
+               OpBranch %135
+        %136 = OpLabel
+               OpBranch %124
+        %124 = OpLabel
+        %219 = OpLoad %int %i_5
+        %220 = OpIAdd %int %219 %int_1
+               OpStore %i_5 %220
+               OpBranch %122
+        %123 = OpLabel
+               OpBranch %111
+        %111 = OpLabel
+        %221 = OpLoad %int %i_4
+        %222 = OpIAdd %int %221 %int_1
+               OpStore %i_4 %222
+               OpBranch %109
+        %110 = OpLabel
+               OpBranch %98
+         %98 = OpLabel
+        %223 = OpLoad %int %i_3
+        %224 = OpIAdd %int %223 %int_1
+               OpStore %i_3 %224
+               OpBranch %96
+         %97 = OpLabel
+               OpBranch %84
+         %84 = OpLabel
+        %225 = OpLoad %int %i_2
+        %226 = OpIAdd %int %225 %int_1
+               OpStore %i_2 %226
+               OpBranch %82
+         %83 = OpLabel
+               OpBranch %71
+         %71 = OpLabel
+        %227 = OpLoad %int %i_1
+        %228 = OpIAdd %int %227 %int_1
+               OpStore %i_1 %228
+               OpBranch %69
+         %70 = OpLabel
+        %229 = OpLoad %float %b
+        %231 = OpFAdd %float %229 %float_1
+               OpStore %b %231
+               OpBranch %57
+         %57 = OpLabel
+        %232 = OpLoad %int %i
+        %233 = OpIAdd %int %232 %int_1
+               OpStore %i %233
+               OpBranch %55
+         %56 = OpLabel
+        %234 = OpLoad %float %b
+        %235 = OpLoad %float %a
+        %236 = OpLoad %float %a
+        %237 = OpLoad %float %b
+        %238 = OpCompositeConstruct %v4float %234 %235 %236 %237
+               OpStore %x_GLF_color %238
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %239
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %243 = OpLabel
+        %244 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %244
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %23
+        %246 = OpLabel
+        %247 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %247
+        %248 = OpFunctionCall %void %main_1
+        %250 = OpLoad %v4float %x_GLF_color
+        %251 = OpCompositeConstruct %main_out %250
+        %249 = OpFunctionCall %void %tint_symbol_3 %251
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..6a32b2d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,233 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_11 : buf1;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : f32;
+  var b : f32;
+  var i : i32;
+  var i_1 : i32;
+  var i_2 : i32;
+  var i_3 : i32;
+  var i_4 : i32;
+  var i_5 : i32;
+  var i_6 : i32;
+  var i_7 : i32;
+  var i_8 : i32;
+  var i_9 : i32;
+  var i_10 : i32;
+  let x_104 : f32 = x_7.x_GLF_uniform_float_values[0];
+  a = x_104;
+  let x_106 : f32 = x_7.x_GLF_uniform_float_values[1];
+  b = x_106;
+  let x_24 : i32 = x_11.x_GLF_uniform_int_values[1];
+  i = x_24;
+  loop {
+    let x_25 : i32 = i;
+    let x_26 : i32 = x_11.x_GLF_uniform_int_values[0];
+    if ((x_25 < x_26)) {
+    } else {
+      break;
+    }
+    let x_27 : i32 = x_11.x_GLF_uniform_int_values[1];
+    i_1 = x_27;
+    loop {
+      let x_28 : i32 = i_1;
+      let x_29 : i32 = x_11.x_GLF_uniform_int_values[0];
+      if ((x_28 < x_29)) {
+      } else {
+        break;
+      }
+      let x_30 : i32 = x_11.x_GLF_uniform_int_values[1];
+      i_2 = x_30;
+      loop {
+        let x_31 : i32 = i_2;
+        let x_32 : i32 = x_11.x_GLF_uniform_int_values[0];
+        if ((x_31 < x_32)) {
+        } else {
+          break;
+        }
+        let x_33 : i32 = x_11.x_GLF_uniform_int_values[2];
+        i_3 = x_33;
+        loop {
+          let x_34 : i32 = i_3;
+          let x_35 : i32 = x_11.x_GLF_uniform_int_values[0];
+          if ((x_34 < x_35)) {
+          } else {
+            break;
+          }
+          let x_36 : i32 = x_11.x_GLF_uniform_int_values[2];
+          i_4 = x_36;
+          loop {
+            let x_37 : i32 = i_4;
+            let x_38 : i32 = x_11.x_GLF_uniform_int_values[0];
+            if ((x_37 < x_38)) {
+            } else {
+              break;
+            }
+            let x_39 : i32 = x_11.x_GLF_uniform_int_values[1];
+            i_5 = x_39;
+            loop {
+              let x_40 : i32 = i_5;
+              let x_41 : i32 = x_11.x_GLF_uniform_int_values[0];
+              if ((x_40 < x_41)) {
+              } else {
+                break;
+              }
+              let x_42 : i32 = x_11.x_GLF_uniform_int_values[1];
+              i_6 = x_42;
+              loop {
+                let x_43 : i32 = i_6;
+                let x_44 : i32 = x_11.x_GLF_uniform_int_values[0];
+                if ((x_43 < x_44)) {
+                } else {
+                  break;
+                }
+                let x_45 : i32 = x_11.x_GLF_uniform_int_values[1];
+                i_7 = x_45;
+                loop {
+                  let x_46 : i32 = i_7;
+                  let x_47 : i32 = x_11.x_GLF_uniform_int_values[0];
+                  if ((x_46 < x_47)) {
+                  } else {
+                    break;
+                  }
+                  let x_48 : i32 = x_11.x_GLF_uniform_int_values[1];
+                  i_8 = x_48;
+                  loop {
+                    let x_49 : i32 = i_8;
+                    let x_50 : i32 = x_11.x_GLF_uniform_int_values[0];
+                    if ((x_49 < x_50)) {
+                    } else {
+                      break;
+                    }
+                    let x_51 : i32 = x_11.x_GLF_uniform_int_values[1];
+                    i_9 = x_51;
+                    loop {
+                      let x_52 : i32 = i_9;
+                      let x_53 : i32 = x_11.x_GLF_uniform_int_values[0];
+                      if ((x_52 < x_53)) {
+                      } else {
+                        break;
+                      }
+                      let x_54 : i32 = x_11.x_GLF_uniform_int_values[1];
+                      i_10 = x_54;
+                      loop {
+                        let x_55 : i32 = i_10;
+                        let x_56 : i32 = x_11.x_GLF_uniform_int_values[0];
+                        if ((x_55 < x_56)) {
+                        } else {
+                          break;
+                        }
+                        let x_196 : f32 = x_7.x_GLF_uniform_float_values[1];
+                        a = x_196;
+                        let x_198 : f32 = gl_FragCoord.y;
+                        let x_200 : f32 = x_7.x_GLF_uniform_float_values[1];
+                        if ((x_198 > x_200)) {
+                          break;
+                        }
+
+                        continuing {
+                          let x_57 : i32 = i_10;
+                          i_10 = (x_57 + 1);
+                        }
+                      }
+
+                      continuing {
+                        let x_59 : i32 = i_9;
+                        i_9 = (x_59 + 1);
+                      }
+                    }
+
+                    continuing {
+                      let x_61 : i32 = i_8;
+                      i_8 = (x_61 + 1);
+                    }
+                  }
+
+                  continuing {
+                    let x_63 : i32 = i_7;
+                    i_7 = (x_63 + 1);
+                  }
+                }
+
+                continuing {
+                  let x_65 : i32 = i_6;
+                  i_6 = (x_65 + 1);
+                }
+              }
+
+              continuing {
+                let x_67 : i32 = i_5;
+                i_5 = (x_67 + 1);
+              }
+            }
+
+            continuing {
+              let x_69 : i32 = i_4;
+              i_4 = (x_69 + 1);
+            }
+          }
+
+          continuing {
+            let x_71 : i32 = i_3;
+            i_3 = (x_71 + 1);
+          }
+        }
+
+        continuing {
+          let x_73 : i32 = i_2;
+          i_2 = (x_73 + 1);
+        }
+      }
+
+      continuing {
+        let x_75 : i32 = i_1;
+        i_1 = (x_75 + 1);
+      }
+    }
+    let x_204 : f32 = b;
+    b = (x_204 + 1.0);
+
+    continuing {
+      let x_77 : i32 = i;
+      i = (x_77 + 1);
+    }
+  }
+  let x_206 : f32 = b;
+  let x_207 : f32 = a;
+  let x_208 : f32 = a;
+  let x_209 : f32 = b;
+  x_GLF_color = vec4<f32>(x_206, x_207, x_208, x_209);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for/0-opt.wgsl
new file mode 100644
index 0000000..6a32b2d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for/0-opt.wgsl
@@ -0,0 +1,233 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_11 : buf1;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : f32;
+  var b : f32;
+  var i : i32;
+  var i_1 : i32;
+  var i_2 : i32;
+  var i_3 : i32;
+  var i_4 : i32;
+  var i_5 : i32;
+  var i_6 : i32;
+  var i_7 : i32;
+  var i_8 : i32;
+  var i_9 : i32;
+  var i_10 : i32;
+  let x_104 : f32 = x_7.x_GLF_uniform_float_values[0];
+  a = x_104;
+  let x_106 : f32 = x_7.x_GLF_uniform_float_values[1];
+  b = x_106;
+  let x_24 : i32 = x_11.x_GLF_uniform_int_values[1];
+  i = x_24;
+  loop {
+    let x_25 : i32 = i;
+    let x_26 : i32 = x_11.x_GLF_uniform_int_values[0];
+    if ((x_25 < x_26)) {
+    } else {
+      break;
+    }
+    let x_27 : i32 = x_11.x_GLF_uniform_int_values[1];
+    i_1 = x_27;
+    loop {
+      let x_28 : i32 = i_1;
+      let x_29 : i32 = x_11.x_GLF_uniform_int_values[0];
+      if ((x_28 < x_29)) {
+      } else {
+        break;
+      }
+      let x_30 : i32 = x_11.x_GLF_uniform_int_values[1];
+      i_2 = x_30;
+      loop {
+        let x_31 : i32 = i_2;
+        let x_32 : i32 = x_11.x_GLF_uniform_int_values[0];
+        if ((x_31 < x_32)) {
+        } else {
+          break;
+        }
+        let x_33 : i32 = x_11.x_GLF_uniform_int_values[2];
+        i_3 = x_33;
+        loop {
+          let x_34 : i32 = i_3;
+          let x_35 : i32 = x_11.x_GLF_uniform_int_values[0];
+          if ((x_34 < x_35)) {
+          } else {
+            break;
+          }
+          let x_36 : i32 = x_11.x_GLF_uniform_int_values[2];
+          i_4 = x_36;
+          loop {
+            let x_37 : i32 = i_4;
+            let x_38 : i32 = x_11.x_GLF_uniform_int_values[0];
+            if ((x_37 < x_38)) {
+            } else {
+              break;
+            }
+            let x_39 : i32 = x_11.x_GLF_uniform_int_values[1];
+            i_5 = x_39;
+            loop {
+              let x_40 : i32 = i_5;
+              let x_41 : i32 = x_11.x_GLF_uniform_int_values[0];
+              if ((x_40 < x_41)) {
+              } else {
+                break;
+              }
+              let x_42 : i32 = x_11.x_GLF_uniform_int_values[1];
+              i_6 = x_42;
+              loop {
+                let x_43 : i32 = i_6;
+                let x_44 : i32 = x_11.x_GLF_uniform_int_values[0];
+                if ((x_43 < x_44)) {
+                } else {
+                  break;
+                }
+                let x_45 : i32 = x_11.x_GLF_uniform_int_values[1];
+                i_7 = x_45;
+                loop {
+                  let x_46 : i32 = i_7;
+                  let x_47 : i32 = x_11.x_GLF_uniform_int_values[0];
+                  if ((x_46 < x_47)) {
+                  } else {
+                    break;
+                  }
+                  let x_48 : i32 = x_11.x_GLF_uniform_int_values[1];
+                  i_8 = x_48;
+                  loop {
+                    let x_49 : i32 = i_8;
+                    let x_50 : i32 = x_11.x_GLF_uniform_int_values[0];
+                    if ((x_49 < x_50)) {
+                    } else {
+                      break;
+                    }
+                    let x_51 : i32 = x_11.x_GLF_uniform_int_values[1];
+                    i_9 = x_51;
+                    loop {
+                      let x_52 : i32 = i_9;
+                      let x_53 : i32 = x_11.x_GLF_uniform_int_values[0];
+                      if ((x_52 < x_53)) {
+                      } else {
+                        break;
+                      }
+                      let x_54 : i32 = x_11.x_GLF_uniform_int_values[1];
+                      i_10 = x_54;
+                      loop {
+                        let x_55 : i32 = i_10;
+                        let x_56 : i32 = x_11.x_GLF_uniform_int_values[0];
+                        if ((x_55 < x_56)) {
+                        } else {
+                          break;
+                        }
+                        let x_196 : f32 = x_7.x_GLF_uniform_float_values[1];
+                        a = x_196;
+                        let x_198 : f32 = gl_FragCoord.y;
+                        let x_200 : f32 = x_7.x_GLF_uniform_float_values[1];
+                        if ((x_198 > x_200)) {
+                          break;
+                        }
+
+                        continuing {
+                          let x_57 : i32 = i_10;
+                          i_10 = (x_57 + 1);
+                        }
+                      }
+
+                      continuing {
+                        let x_59 : i32 = i_9;
+                        i_9 = (x_59 + 1);
+                      }
+                    }
+
+                    continuing {
+                      let x_61 : i32 = i_8;
+                      i_8 = (x_61 + 1);
+                    }
+                  }
+
+                  continuing {
+                    let x_63 : i32 = i_7;
+                    i_7 = (x_63 + 1);
+                  }
+                }
+
+                continuing {
+                  let x_65 : i32 = i_6;
+                  i_6 = (x_65 + 1);
+                }
+              }
+
+              continuing {
+                let x_67 : i32 = i_5;
+                i_5 = (x_67 + 1);
+              }
+            }
+
+            continuing {
+              let x_69 : i32 = i_4;
+              i_4 = (x_69 + 1);
+            }
+          }
+
+          continuing {
+            let x_71 : i32 = i_3;
+            i_3 = (x_71 + 1);
+          }
+        }
+
+        continuing {
+          let x_73 : i32 = i_2;
+          i_2 = (x_73 + 1);
+        }
+      }
+
+      continuing {
+        let x_75 : i32 = i_1;
+        i_1 = (x_75 + 1);
+      }
+    }
+    let x_204 : f32 = b;
+    b = (x_204 + 1.0);
+
+    continuing {
+      let x_77 : i32 = i;
+      i = (x_77 + 1);
+    }
+  }
+  let x_206 : f32 = b;
+  let x_207 : f32 = a;
+  let x_208 : f32 = a;
+  let x_209 : f32 = b;
+  x_GLF_color = vec4<f32>(x_206, x_207, x_208, x_209);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..3345993
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,212 @@
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[2];
+};
+cbuffer cbuffer_x_11 : register(b1, space0) {
+  uint4 x_11[3];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float a = 0.0f;
+  float b = 0.0f;
+  int i = 0;
+  int i_1 = 0;
+  int i_2 = 0;
+  int i_3 = 0;
+  int i_4 = 0;
+  int i_5 = 0;
+  int i_6 = 0;
+  int i_7 = 0;
+  int i_8 = 0;
+  int i_9 = 0;
+  int i_10 = 0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_104 = asfloat(x_7[scalar_offset / 4][scalar_offset % 4]);
+  a = x_104;
+  const float x_106 = asfloat(x_7[1].x);
+  b = x_106;
+  const int x_24 = asint(x_11[1].x);
+  i = x_24;
+  while (true) {
+    const int x_25 = i;
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_26 = asint(x_11[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    if ((x_25 < x_26)) {
+    } else {
+      break;
+    }
+    const int x_27 = asint(x_11[1].x);
+    i_1 = x_27;
+    while (true) {
+      const int x_28 = i_1;
+      const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+      const int x_29 = asint(x_11[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+      if ((x_28 < x_29)) {
+      } else {
+        break;
+      }
+      const int x_30 = asint(x_11[1].x);
+      i_2 = x_30;
+      while (true) {
+        const int x_31 = i_2;
+        const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+        const int x_32 = asint(x_11[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+        if ((x_31 < x_32)) {
+        } else {
+          break;
+        }
+        const int x_33 = asint(x_11[2].x);
+        i_3 = x_33;
+        while (true) {
+          const int x_34 = i_3;
+          const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+          const int x_35 = asint(x_11[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+          if ((x_34 < x_35)) {
+          } else {
+            break;
+          }
+          const int x_36 = asint(x_11[2].x);
+          i_4 = x_36;
+          while (true) {
+            const int x_37 = i_4;
+            const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+            const int x_38 = asint(x_11[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+            if ((x_37 < x_38)) {
+            } else {
+              break;
+            }
+            const int x_39 = asint(x_11[1].x);
+            i_5 = x_39;
+            while (true) {
+              const int x_40 = i_5;
+              const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+              const int x_41 = asint(x_11[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+              if ((x_40 < x_41)) {
+              } else {
+                break;
+              }
+              const int x_42 = asint(x_11[1].x);
+              i_6 = x_42;
+              while (true) {
+                const int x_43 = i_6;
+                const uint scalar_offset_7 = ((16u * uint(0))) / 4;
+                const int x_44 = asint(x_11[scalar_offset_7 / 4][scalar_offset_7 % 4]);
+                if ((x_43 < x_44)) {
+                } else {
+                  break;
+                }
+                const int x_45 = asint(x_11[1].x);
+                i_7 = x_45;
+                while (true) {
+                  const int x_46 = i_7;
+                  const uint scalar_offset_8 = ((16u * uint(0))) / 4;
+                  const int x_47 = asint(x_11[scalar_offset_8 / 4][scalar_offset_8 % 4]);
+                  if ((x_46 < x_47)) {
+                  } else {
+                    break;
+                  }
+                  const int x_48 = asint(x_11[1].x);
+                  i_8 = x_48;
+                  while (true) {
+                    const int x_49 = i_8;
+                    const uint scalar_offset_9 = ((16u * uint(0))) / 4;
+                    const int x_50 = asint(x_11[scalar_offset_9 / 4][scalar_offset_9 % 4]);
+                    if ((x_49 < x_50)) {
+                    } else {
+                      break;
+                    }
+                    const int x_51 = asint(x_11[1].x);
+                    i_9 = x_51;
+                    while (true) {
+                      const int x_52 = i_9;
+                      const uint scalar_offset_10 = ((16u * uint(0))) / 4;
+                      const int x_53 = asint(x_11[scalar_offset_10 / 4][scalar_offset_10 % 4]);
+                      if ((x_52 < x_53)) {
+                      } else {
+                        break;
+                      }
+                      const int x_54 = asint(x_11[1].x);
+                      i_10 = x_54;
+                      while (true) {
+                        const int x_55 = i_10;
+                        const uint scalar_offset_11 = ((16u * uint(0))) / 4;
+                        const int x_56 = asint(x_11[scalar_offset_11 / 4][scalar_offset_11 % 4]);
+                        if ((x_55 < x_56)) {
+                        } else {
+                          break;
+                        }
+                        const float x_196 = asfloat(x_7[1].x);
+                        a = x_196;
+                        const float x_198 = gl_FragCoord.y;
+                        const float x_200 = asfloat(x_7[1].x);
+                        if ((x_198 > x_200)) {
+                          break;
+                        }
+                        {
+                          i_10 = (i_10 + 1);
+                        }
+                      }
+                      {
+                        i_9 = (i_9 + 1);
+                      }
+                    }
+                    {
+                      i_8 = (i_8 + 1);
+                    }
+                  }
+                  {
+                    i_7 = (i_7 + 1);
+                  }
+                }
+                {
+                  i_6 = (i_6 + 1);
+                }
+              }
+              {
+                i_5 = (i_5 + 1);
+              }
+            }
+            {
+              i_4 = (i_4 + 1);
+            }
+          }
+          {
+            i_3 = (i_3 + 1);
+          }
+        }
+        {
+          i_2 = (i_2 + 1);
+        }
+      }
+      {
+        i_1 = (i_1 + 1);
+      }
+    }
+    b = (b + 1.0f);
+    {
+      i = (i + 1);
+    }
+  }
+  x_GLF_color = float4(b, a, a, b);
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..8d410b0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for/0-opt.wgsl.expected.msl
@@ -0,0 +1,229 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, constant buf1& x_11, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float a = 0.0f;
+  float b = 0.0f;
+  int i = 0;
+  int i_1 = 0;
+  int i_2 = 0;
+  int i_3 = 0;
+  int i_4 = 0;
+  int i_5 = 0;
+  int i_6 = 0;
+  int i_7 = 0;
+  int i_8 = 0;
+  int i_9 = 0;
+  int i_10 = 0;
+  float const x_104 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  a = x_104;
+  float const x_106 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  b = x_106;
+  int const x_24 = x_11.x_GLF_uniform_int_values.arr[1].el;
+  i = x_24;
+  while (true) {
+    int const x_25 = i;
+    int const x_26 = x_11.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_25 < x_26)) {
+    } else {
+      break;
+    }
+    int const x_27 = x_11.x_GLF_uniform_int_values.arr[1].el;
+    i_1 = x_27;
+    while (true) {
+      int const x_28 = i_1;
+      int const x_29 = x_11.x_GLF_uniform_int_values.arr[0].el;
+      if ((x_28 < x_29)) {
+      } else {
+        break;
+      }
+      int const x_30 = x_11.x_GLF_uniform_int_values.arr[1].el;
+      i_2 = x_30;
+      while (true) {
+        int const x_31 = i_2;
+        int const x_32 = x_11.x_GLF_uniform_int_values.arr[0].el;
+        if ((x_31 < x_32)) {
+        } else {
+          break;
+        }
+        int const x_33 = x_11.x_GLF_uniform_int_values.arr[2].el;
+        i_3 = x_33;
+        while (true) {
+          int const x_34 = i_3;
+          int const x_35 = x_11.x_GLF_uniform_int_values.arr[0].el;
+          if ((x_34 < x_35)) {
+          } else {
+            break;
+          }
+          int const x_36 = x_11.x_GLF_uniform_int_values.arr[2].el;
+          i_4 = x_36;
+          while (true) {
+            int const x_37 = i_4;
+            int const x_38 = x_11.x_GLF_uniform_int_values.arr[0].el;
+            if ((x_37 < x_38)) {
+            } else {
+              break;
+            }
+            int const x_39 = x_11.x_GLF_uniform_int_values.arr[1].el;
+            i_5 = x_39;
+            while (true) {
+              int const x_40 = i_5;
+              int const x_41 = x_11.x_GLF_uniform_int_values.arr[0].el;
+              if ((x_40 < x_41)) {
+              } else {
+                break;
+              }
+              int const x_42 = x_11.x_GLF_uniform_int_values.arr[1].el;
+              i_6 = x_42;
+              while (true) {
+                int const x_43 = i_6;
+                int const x_44 = x_11.x_GLF_uniform_int_values.arr[0].el;
+                if ((x_43 < x_44)) {
+                } else {
+                  break;
+                }
+                int const x_45 = x_11.x_GLF_uniform_int_values.arr[1].el;
+                i_7 = x_45;
+                while (true) {
+                  int const x_46 = i_7;
+                  int const x_47 = x_11.x_GLF_uniform_int_values.arr[0].el;
+                  if ((x_46 < x_47)) {
+                  } else {
+                    break;
+                  }
+                  int const x_48 = x_11.x_GLF_uniform_int_values.arr[1].el;
+                  i_8 = x_48;
+                  while (true) {
+                    int const x_49 = i_8;
+                    int const x_50 = x_11.x_GLF_uniform_int_values.arr[0].el;
+                    if ((x_49 < x_50)) {
+                    } else {
+                      break;
+                    }
+                    int const x_51 = x_11.x_GLF_uniform_int_values.arr[1].el;
+                    i_9 = x_51;
+                    while (true) {
+                      int const x_52 = i_9;
+                      int const x_53 = x_11.x_GLF_uniform_int_values.arr[0].el;
+                      if ((x_52 < x_53)) {
+                      } else {
+                        break;
+                      }
+                      int const x_54 = x_11.x_GLF_uniform_int_values.arr[1].el;
+                      i_10 = x_54;
+                      while (true) {
+                        int const x_55 = i_10;
+                        int const x_56 = x_11.x_GLF_uniform_int_values.arr[0].el;
+                        if ((x_55 < x_56)) {
+                        } else {
+                          break;
+                        }
+                        float const x_196 = x_7.x_GLF_uniform_float_values.arr[1].el;
+                        a = x_196;
+                        float const x_198 = (*(tint_symbol_5)).y;
+                        float const x_200 = x_7.x_GLF_uniform_float_values.arr[1].el;
+                        if ((x_198 > x_200)) {
+                          break;
+                        }
+                        {
+                          int const x_57 = i_10;
+                          i_10 = (x_57 + 1);
+                        }
+                      }
+                      {
+                        int const x_59 = i_9;
+                        i_9 = (x_59 + 1);
+                      }
+                    }
+                    {
+                      int const x_61 = i_8;
+                      i_8 = (x_61 + 1);
+                    }
+                  }
+                  {
+                    int const x_63 = i_7;
+                    i_7 = (x_63 + 1);
+                  }
+                }
+                {
+                  int const x_65 = i_6;
+                  i_6 = (x_65 + 1);
+                }
+              }
+              {
+                int const x_67 = i_5;
+                i_5 = (x_67 + 1);
+              }
+            }
+            {
+              int const x_69 = i_4;
+              i_4 = (x_69 + 1);
+            }
+          }
+          {
+            int const x_71 = i_3;
+            i_3 = (x_71 + 1);
+          }
+        }
+        {
+          int const x_73 = i_2;
+          i_2 = (x_73 + 1);
+        }
+      }
+      {
+        int const x_75 = i_1;
+        i_1 = (x_75 + 1);
+      }
+    }
+    float const x_204 = b;
+    b = (x_204 + 1.0f);
+    {
+      int const x_77 = i;
+      i = (x_77 + 1);
+    }
+  }
+  float const x_206 = b;
+  float const x_207 = a;
+  float const x_208 = a;
+  float const x_209 = b;
+  *(tint_symbol_6) = float4(x_206, x_207, x_208, x_209);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]], constant buf1& x_11 [[buffer(1)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_7, x_11, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..2125db7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,441 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 252
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_7 "x_7"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_11 "x_11"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %i "i"
+               OpName %i_1 "i_1"
+               OpName %i_2 "i_2"
+               OpName %i_3 "i_3"
+               OpName %i_4 "i_4"
+               OpName %i_5 "i_5"
+               OpName %i_6 "i_6"
+               OpName %i_7 "i_7"
+               OpName %i_8 "i_8"
+               OpName %i_9 "i_9"
+               OpName %i_10 "i_10"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_11 NonWritable
+               OpDecorate %x_11 DescriptorSet 0
+               OpDecorate %x_11 Binding 1
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_11 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %17
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %29 = OpConstantNull %float
+%_ptr_Function_int = OpTypePointer Function %int
+         %33 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %239 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %23
+         %26 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function %29
+          %b = OpVariable %_ptr_Function_float Function %29
+          %i = OpVariable %_ptr_Function_int Function %33
+        %i_1 = OpVariable %_ptr_Function_int Function %33
+        %i_2 = OpVariable %_ptr_Function_int Function %33
+        %i_3 = OpVariable %_ptr_Function_int Function %33
+        %i_4 = OpVariable %_ptr_Function_int Function %33
+        %i_5 = OpVariable %_ptr_Function_int Function %33
+        %i_6 = OpVariable %_ptr_Function_int Function %33
+        %i_7 = OpVariable %_ptr_Function_int Function %33
+        %i_8 = OpVariable %_ptr_Function_int Function %33
+        %i_9 = OpVariable %_ptr_Function_int Function %33
+       %i_10 = OpVariable %_ptr_Function_int Function %33
+         %47 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %48 = OpLoad %float %47
+               OpStore %a %48
+         %50 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %51 = OpLoad %float %50
+               OpStore %b %51
+         %53 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+         %54 = OpLoad %int %53
+               OpStore %i %54
+               OpBranch %55
+         %55 = OpLabel
+               OpLoopMerge %56 %57 None
+               OpBranch %58
+         %58 = OpLabel
+         %59 = OpLoad %int %i
+         %60 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+         %61 = OpLoad %int %60
+         %62 = OpSLessThan %bool %59 %61
+               OpSelectionMerge %64 None
+               OpBranchConditional %62 %65 %66
+         %65 = OpLabel
+               OpBranch %64
+         %66 = OpLabel
+               OpBranch %56
+         %64 = OpLabel
+         %67 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+         %68 = OpLoad %int %67
+               OpStore %i_1 %68
+               OpBranch %69
+         %69 = OpLabel
+               OpLoopMerge %70 %71 None
+               OpBranch %72
+         %72 = OpLabel
+         %73 = OpLoad %int %i_1
+         %74 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+         %75 = OpLoad %int %74
+         %76 = OpSLessThan %bool %73 %75
+               OpSelectionMerge %77 None
+               OpBranchConditional %76 %78 %79
+         %78 = OpLabel
+               OpBranch %77
+         %79 = OpLabel
+               OpBranch %70
+         %77 = OpLabel
+         %80 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+         %81 = OpLoad %int %80
+               OpStore %i_2 %81
+               OpBranch %82
+         %82 = OpLabel
+               OpLoopMerge %83 %84 None
+               OpBranch %85
+         %85 = OpLabel
+         %86 = OpLoad %int %i_2
+         %87 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+         %88 = OpLoad %int %87
+         %89 = OpSLessThan %bool %86 %88
+               OpSelectionMerge %90 None
+               OpBranchConditional %89 %91 %92
+         %91 = OpLabel
+               OpBranch %90
+         %92 = OpLabel
+               OpBranch %83
+         %90 = OpLabel
+         %94 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_2
+         %95 = OpLoad %int %94
+               OpStore %i_3 %95
+               OpBranch %96
+         %96 = OpLabel
+               OpLoopMerge %97 %98 None
+               OpBranch %99
+         %99 = OpLabel
+        %100 = OpLoad %int %i_3
+        %101 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+        %102 = OpLoad %int %101
+        %103 = OpSLessThan %bool %100 %102
+               OpSelectionMerge %104 None
+               OpBranchConditional %103 %105 %106
+        %105 = OpLabel
+               OpBranch %104
+        %106 = OpLabel
+               OpBranch %97
+        %104 = OpLabel
+        %107 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_2
+        %108 = OpLoad %int %107
+               OpStore %i_4 %108
+               OpBranch %109
+        %109 = OpLabel
+               OpLoopMerge %110 %111 None
+               OpBranch %112
+        %112 = OpLabel
+        %113 = OpLoad %int %i_4
+        %114 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+        %115 = OpLoad %int %114
+        %116 = OpSLessThan %bool %113 %115
+               OpSelectionMerge %117 None
+               OpBranchConditional %116 %118 %119
+        %118 = OpLabel
+               OpBranch %117
+        %119 = OpLabel
+               OpBranch %110
+        %117 = OpLabel
+        %120 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+        %121 = OpLoad %int %120
+               OpStore %i_5 %121
+               OpBranch %122
+        %122 = OpLabel
+               OpLoopMerge %123 %124 None
+               OpBranch %125
+        %125 = OpLabel
+        %126 = OpLoad %int %i_5
+        %127 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+        %128 = OpLoad %int %127
+        %129 = OpSLessThan %bool %126 %128
+               OpSelectionMerge %130 None
+               OpBranchConditional %129 %131 %132
+        %131 = OpLabel
+               OpBranch %130
+        %132 = OpLabel
+               OpBranch %123
+        %130 = OpLabel
+        %133 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+        %134 = OpLoad %int %133
+               OpStore %i_6 %134
+               OpBranch %135
+        %135 = OpLabel
+               OpLoopMerge %136 %137 None
+               OpBranch %138
+        %138 = OpLabel
+        %139 = OpLoad %int %i_6
+        %140 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+        %141 = OpLoad %int %140
+        %142 = OpSLessThan %bool %139 %141
+               OpSelectionMerge %143 None
+               OpBranchConditional %142 %144 %145
+        %144 = OpLabel
+               OpBranch %143
+        %145 = OpLabel
+               OpBranch %136
+        %143 = OpLabel
+        %146 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+        %147 = OpLoad %int %146
+               OpStore %i_7 %147
+               OpBranch %148
+        %148 = OpLabel
+               OpLoopMerge %149 %150 None
+               OpBranch %151
+        %151 = OpLabel
+        %152 = OpLoad %int %i_7
+        %153 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+        %154 = OpLoad %int %153
+        %155 = OpSLessThan %bool %152 %154
+               OpSelectionMerge %156 None
+               OpBranchConditional %155 %157 %158
+        %157 = OpLabel
+               OpBranch %156
+        %158 = OpLabel
+               OpBranch %149
+        %156 = OpLabel
+        %159 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+        %160 = OpLoad %int %159
+               OpStore %i_8 %160
+               OpBranch %161
+        %161 = OpLabel
+               OpLoopMerge %162 %163 None
+               OpBranch %164
+        %164 = OpLabel
+        %165 = OpLoad %int %i_8
+        %166 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+        %167 = OpLoad %int %166
+        %168 = OpSLessThan %bool %165 %167
+               OpSelectionMerge %169 None
+               OpBranchConditional %168 %170 %171
+        %170 = OpLabel
+               OpBranch %169
+        %171 = OpLabel
+               OpBranch %162
+        %169 = OpLabel
+        %172 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+        %173 = OpLoad %int %172
+               OpStore %i_9 %173
+               OpBranch %174
+        %174 = OpLabel
+               OpLoopMerge %175 %176 None
+               OpBranch %177
+        %177 = OpLabel
+        %178 = OpLoad %int %i_9
+        %179 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+        %180 = OpLoad %int %179
+        %181 = OpSLessThan %bool %178 %180
+               OpSelectionMerge %182 None
+               OpBranchConditional %181 %183 %184
+        %183 = OpLabel
+               OpBranch %182
+        %184 = OpLabel
+               OpBranch %175
+        %182 = OpLabel
+        %185 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+        %186 = OpLoad %int %185
+               OpStore %i_10 %186
+               OpBranch %187
+        %187 = OpLabel
+               OpLoopMerge %188 %189 None
+               OpBranch %190
+        %190 = OpLabel
+        %191 = OpLoad %int %i_10
+        %192 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+        %193 = OpLoad %int %192
+        %194 = OpSLessThan %bool %191 %193
+               OpSelectionMerge %195 None
+               OpBranchConditional %194 %196 %197
+        %196 = OpLabel
+               OpBranch %195
+        %197 = OpLabel
+               OpBranch %188
+        %195 = OpLabel
+        %198 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+        %199 = OpLoad %float %198
+               OpStore %a %199
+        %202 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %203 = OpLoad %float %202
+        %204 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+        %205 = OpLoad %float %204
+        %206 = OpFOrdGreaterThan %bool %203 %205
+               OpSelectionMerge %207 None
+               OpBranchConditional %206 %208 %207
+        %208 = OpLabel
+               OpBranch %188
+        %207 = OpLabel
+               OpBranch %189
+        %189 = OpLabel
+        %209 = OpLoad %int %i_10
+        %210 = OpIAdd %int %209 %int_1
+               OpStore %i_10 %210
+               OpBranch %187
+        %188 = OpLabel
+               OpBranch %176
+        %176 = OpLabel
+        %211 = OpLoad %int %i_9
+        %212 = OpIAdd %int %211 %int_1
+               OpStore %i_9 %212
+               OpBranch %174
+        %175 = OpLabel
+               OpBranch %163
+        %163 = OpLabel
+        %213 = OpLoad %int %i_8
+        %214 = OpIAdd %int %213 %int_1
+               OpStore %i_8 %214
+               OpBranch %161
+        %162 = OpLabel
+               OpBranch %150
+        %150 = OpLabel
+        %215 = OpLoad %int %i_7
+        %216 = OpIAdd %int %215 %int_1
+               OpStore %i_7 %216
+               OpBranch %148
+        %149 = OpLabel
+               OpBranch %137
+        %137 = OpLabel
+        %217 = OpLoad %int %i_6
+        %218 = OpIAdd %int %217 %int_1
+               OpStore %i_6 %218
+               OpBranch %135
+        %136 = OpLabel
+               OpBranch %124
+        %124 = OpLabel
+        %219 = OpLoad %int %i_5
+        %220 = OpIAdd %int %219 %int_1
+               OpStore %i_5 %220
+               OpBranch %122
+        %123 = OpLabel
+               OpBranch %111
+        %111 = OpLabel
+        %221 = OpLoad %int %i_4
+        %222 = OpIAdd %int %221 %int_1
+               OpStore %i_4 %222
+               OpBranch %109
+        %110 = OpLabel
+               OpBranch %98
+         %98 = OpLabel
+        %223 = OpLoad %int %i_3
+        %224 = OpIAdd %int %223 %int_1
+               OpStore %i_3 %224
+               OpBranch %96
+         %97 = OpLabel
+               OpBranch %84
+         %84 = OpLabel
+        %225 = OpLoad %int %i_2
+        %226 = OpIAdd %int %225 %int_1
+               OpStore %i_2 %226
+               OpBranch %82
+         %83 = OpLabel
+               OpBranch %71
+         %71 = OpLabel
+        %227 = OpLoad %int %i_1
+        %228 = OpIAdd %int %227 %int_1
+               OpStore %i_1 %228
+               OpBranch %69
+         %70 = OpLabel
+        %229 = OpLoad %float %b
+        %231 = OpFAdd %float %229 %float_1
+               OpStore %b %231
+               OpBranch %57
+         %57 = OpLabel
+        %232 = OpLoad %int %i
+        %233 = OpIAdd %int %232 %int_1
+               OpStore %i %233
+               OpBranch %55
+         %56 = OpLabel
+        %234 = OpLoad %float %b
+        %235 = OpLoad %float %a
+        %236 = OpLoad %float %a
+        %237 = OpLoad %float %b
+        %238 = OpCompositeConstruct %v4float %234 %235 %236 %237
+               OpStore %x_GLF_color %238
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %239
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %243 = OpLabel
+        %244 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %244
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %23
+        %246 = OpLabel
+        %247 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %247
+        %248 = OpFunctionCall %void %main_1
+        %250 = OpLoad %v4float %x_GLF_color
+        %251 = OpCompositeConstruct %main_out %250
+        %249 = OpFunctionCall %void %tint_symbol_3 %251
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..6a32b2d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-optimize-phis-for/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,233 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_11 : buf1;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : f32;
+  var b : f32;
+  var i : i32;
+  var i_1 : i32;
+  var i_2 : i32;
+  var i_3 : i32;
+  var i_4 : i32;
+  var i_5 : i32;
+  var i_6 : i32;
+  var i_7 : i32;
+  var i_8 : i32;
+  var i_9 : i32;
+  var i_10 : i32;
+  let x_104 : f32 = x_7.x_GLF_uniform_float_values[0];
+  a = x_104;
+  let x_106 : f32 = x_7.x_GLF_uniform_float_values[1];
+  b = x_106;
+  let x_24 : i32 = x_11.x_GLF_uniform_int_values[1];
+  i = x_24;
+  loop {
+    let x_25 : i32 = i;
+    let x_26 : i32 = x_11.x_GLF_uniform_int_values[0];
+    if ((x_25 < x_26)) {
+    } else {
+      break;
+    }
+    let x_27 : i32 = x_11.x_GLF_uniform_int_values[1];
+    i_1 = x_27;
+    loop {
+      let x_28 : i32 = i_1;
+      let x_29 : i32 = x_11.x_GLF_uniform_int_values[0];
+      if ((x_28 < x_29)) {
+      } else {
+        break;
+      }
+      let x_30 : i32 = x_11.x_GLF_uniform_int_values[1];
+      i_2 = x_30;
+      loop {
+        let x_31 : i32 = i_2;
+        let x_32 : i32 = x_11.x_GLF_uniform_int_values[0];
+        if ((x_31 < x_32)) {
+        } else {
+          break;
+        }
+        let x_33 : i32 = x_11.x_GLF_uniform_int_values[2];
+        i_3 = x_33;
+        loop {
+          let x_34 : i32 = i_3;
+          let x_35 : i32 = x_11.x_GLF_uniform_int_values[0];
+          if ((x_34 < x_35)) {
+          } else {
+            break;
+          }
+          let x_36 : i32 = x_11.x_GLF_uniform_int_values[2];
+          i_4 = x_36;
+          loop {
+            let x_37 : i32 = i_4;
+            let x_38 : i32 = x_11.x_GLF_uniform_int_values[0];
+            if ((x_37 < x_38)) {
+            } else {
+              break;
+            }
+            let x_39 : i32 = x_11.x_GLF_uniform_int_values[1];
+            i_5 = x_39;
+            loop {
+              let x_40 : i32 = i_5;
+              let x_41 : i32 = x_11.x_GLF_uniform_int_values[0];
+              if ((x_40 < x_41)) {
+              } else {
+                break;
+              }
+              let x_42 : i32 = x_11.x_GLF_uniform_int_values[1];
+              i_6 = x_42;
+              loop {
+                let x_43 : i32 = i_6;
+                let x_44 : i32 = x_11.x_GLF_uniform_int_values[0];
+                if ((x_43 < x_44)) {
+                } else {
+                  break;
+                }
+                let x_45 : i32 = x_11.x_GLF_uniform_int_values[1];
+                i_7 = x_45;
+                loop {
+                  let x_46 : i32 = i_7;
+                  let x_47 : i32 = x_11.x_GLF_uniform_int_values[0];
+                  if ((x_46 < x_47)) {
+                  } else {
+                    break;
+                  }
+                  let x_48 : i32 = x_11.x_GLF_uniform_int_values[1];
+                  i_8 = x_48;
+                  loop {
+                    let x_49 : i32 = i_8;
+                    let x_50 : i32 = x_11.x_GLF_uniform_int_values[0];
+                    if ((x_49 < x_50)) {
+                    } else {
+                      break;
+                    }
+                    let x_51 : i32 = x_11.x_GLF_uniform_int_values[1];
+                    i_9 = x_51;
+                    loop {
+                      let x_52 : i32 = i_9;
+                      let x_53 : i32 = x_11.x_GLF_uniform_int_values[0];
+                      if ((x_52 < x_53)) {
+                      } else {
+                        break;
+                      }
+                      let x_54 : i32 = x_11.x_GLF_uniform_int_values[1];
+                      i_10 = x_54;
+                      loop {
+                        let x_55 : i32 = i_10;
+                        let x_56 : i32 = x_11.x_GLF_uniform_int_values[0];
+                        if ((x_55 < x_56)) {
+                        } else {
+                          break;
+                        }
+                        let x_196 : f32 = x_7.x_GLF_uniform_float_values[1];
+                        a = x_196;
+                        let x_198 : f32 = gl_FragCoord.y;
+                        let x_200 : f32 = x_7.x_GLF_uniform_float_values[1];
+                        if ((x_198 > x_200)) {
+                          break;
+                        }
+
+                        continuing {
+                          let x_57 : i32 = i_10;
+                          i_10 = (x_57 + 1);
+                        }
+                      }
+
+                      continuing {
+                        let x_59 : i32 = i_9;
+                        i_9 = (x_59 + 1);
+                      }
+                    }
+
+                    continuing {
+                      let x_61 : i32 = i_8;
+                      i_8 = (x_61 + 1);
+                    }
+                  }
+
+                  continuing {
+                    let x_63 : i32 = i_7;
+                    i_7 = (x_63 + 1);
+                  }
+                }
+
+                continuing {
+                  let x_65 : i32 = i_6;
+                  i_6 = (x_65 + 1);
+                }
+              }
+
+              continuing {
+                let x_67 : i32 = i_5;
+                i_5 = (x_67 + 1);
+              }
+            }
+
+            continuing {
+              let x_69 : i32 = i_4;
+              i_4 = (x_69 + 1);
+            }
+          }
+
+          continuing {
+            let x_71 : i32 = i_3;
+            i_3 = (x_71 + 1);
+          }
+        }
+
+        continuing {
+          let x_73 : i32 = i_2;
+          i_2 = (x_73 + 1);
+        }
+      }
+
+      continuing {
+        let x_75 : i32 = i_1;
+        i_1 = (x_75 + 1);
+      }
+    }
+    let x_204 : f32 = b;
+    b = (x_204 + 1.0);
+
+    continuing {
+      let x_77 : i32 = i;
+      i = (x_77 + 1);
+    }
+  }
+  let x_206 : f32 = b;
+  let x_207 : f32 = a;
+  let x_208 : f32 = a;
+  let x_209 : f32 = b;
+  x_GLF_color = vec4<f32>(x_206, x_207, x_208, x_209);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-packhalf-unpackunorm/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-packhalf-unpackunorm/0-opt.spvasm
new file mode 100644
index 0000000..c972caf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-packhalf-unpackunorm/0-opt.spvasm
@@ -0,0 +1,185 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %values "values"
+               OpName %ref "ref"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_4 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+    %float_1 = OpConstant %float 1
+         %20 = OpConstantComposite %v2float %float_1 %float_1
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+       %buf0 = OpTypeStruct %_arr_float_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_3 = OpConstant %int 3
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf1 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_2 = OpConstant %int 2
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %14
+         %36 = OpLabel
+          %a = OpVariable %_ptr_Function_uint Function
+     %values = OpVariable %_ptr_Function_v4float Function
+        %ref = OpVariable %_ptr_Function_v4float Function
+         %37 = OpExtInst %uint %1 PackHalf2x16 %20
+               OpStore %a %37
+         %38 = OpLoad %uint %a
+         %39 = OpExtInst %v4float %1 UnpackUnorm4x8 %38
+               OpStore %values %39
+         %40 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_3
+         %41 = OpLoad %float %40
+         %42 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %43 = OpLoad %float %42
+         %44 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %45 = OpLoad %float %44
+         %46 = OpFDiv %float %43 %45
+         %47 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_3
+         %48 = OpLoad %float %47
+         %49 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %50 = OpLoad %float %49
+         %51 = OpFDiv %float %48 %50
+         %52 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %53 = OpLoad %float %52
+         %54 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %55 = OpLoad %float %54
+         %56 = OpFDiv %float %53 %55
+         %57 = OpCompositeConstruct %v4float %41 %46 %51 %56
+               OpStore %ref %57
+         %58 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %59 = OpLoad %int %58
+         %60 = OpAccessChain %_ptr_Function_float %values %59
+         %61 = OpLoad %float %60
+         %62 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %63 = OpLoad %int %62
+         %64 = OpAccessChain %_ptr_Function_float %ref %63
+         %65 = OpLoad %float %64
+         %66 = OpFSub %float %61 %65
+         %67 = OpExtInst %float %1 FAbs %66
+         %68 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %69 = OpLoad %float %68
+         %70 = OpFOrdLessThan %bool %67 %69
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %71
+         %72 = OpLabel
+         %73 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %74 = OpLoad %int %73
+         %75 = OpAccessChain %_ptr_Function_float %values %74
+         %76 = OpLoad %float %75
+         %77 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %78 = OpLoad %int %77
+         %79 = OpAccessChain %_ptr_Function_float %ref %78
+         %80 = OpLoad %float %79
+         %81 = OpFSub %float %76 %80
+         %82 = OpExtInst %float %1 FAbs %81
+         %83 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %84 = OpLoad %float %83
+         %85 = OpFOrdLessThan %bool %82 %84
+               OpBranch %71
+         %71 = OpLabel
+         %86 = OpPhi %bool %70 %36 %85 %72
+               OpSelectionMerge %87 None
+               OpBranchConditional %86 %88 %87
+         %88 = OpLabel
+         %89 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_3
+         %90 = OpLoad %int %89
+         %91 = OpAccessChain %_ptr_Function_float %values %90
+         %92 = OpLoad %float %91
+         %93 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_3
+         %94 = OpLoad %int %93
+         %95 = OpAccessChain %_ptr_Function_float %ref %94
+         %96 = OpLoad %float %95
+         %97 = OpFSub %float %92 %96
+         %98 = OpExtInst %float %1 FAbs %97
+         %99 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+        %100 = OpLoad %float %99
+        %101 = OpFOrdLessThan %bool %98 %100
+               OpBranch %87
+         %87 = OpLabel
+        %102 = OpPhi %bool %86 %71 %101 %88
+               OpSelectionMerge %103 None
+               OpBranchConditional %102 %104 %103
+        %104 = OpLabel
+        %105 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+        %106 = OpLoad %int %105
+        %107 = OpAccessChain %_ptr_Function_float %values %106
+        %108 = OpLoad %float %107
+        %109 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+        %110 = OpLoad %int %109
+        %111 = OpAccessChain %_ptr_Function_float %ref %110
+        %112 = OpLoad %float %111
+        %113 = OpFSub %float %108 %112
+        %114 = OpExtInst %float %1 FAbs %113
+        %115 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+        %116 = OpLoad %float %115
+        %117 = OpFOrdLessThan %bool %114 %116
+               OpBranch %103
+        %103 = OpLabel
+        %118 = OpPhi %bool %102 %87 %117 %104
+               OpSelectionMerge %119 None
+               OpBranchConditional %118 %120 %121
+        %120 = OpLabel
+        %122 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %123 = OpLoad %int %122
+        %124 = OpConvertSToF %float %123
+        %125 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+        %126 = OpLoad %int %125
+        %127 = OpConvertSToF %float %126
+        %128 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+        %129 = OpLoad %int %128
+        %130 = OpConvertSToF %float %129
+        %131 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %132 = OpLoad %int %131
+        %133 = OpConvertSToF %float %132
+        %134 = OpCompositeConstruct %v4float %124 %127 %130 %133
+               OpStore %_GLF_color %134
+               OpBranch %119
+        %121 = OpLabel
+        %135 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+        %136 = OpLoad %int %135
+        %137 = OpConvertSToF %float %136
+        %138 = OpCompositeConstruct %v4float %137 %137 %137 %137
+               OpStore %_GLF_color %138
+               OpBranch %119
+        %119 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-packhalf-unpackunorm/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-packhalf-unpackunorm/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..f87712b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-packhalf-unpackunorm/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,112 @@
+uint tint_pack2x16float(float2 param_0) {
+  uint2 i = f32tof16(param_0);
+  return i.x | (i.y << 16);
+}
+
+float4 tint_unpack4x8unorm(uint param_0) {
+  uint j = param_0;
+  uint4 i = uint4(j & 0xff, (j >> 8) & 0xff, (j >> 16) & 0xff, j >> 24);
+  return float4(i) / 255.0;
+}
+
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[4];
+};
+cbuffer cbuffer_x_10 : register(b1, space0) {
+  uint4 x_10[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  uint a = 0u;
+  float4 values = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 ref = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  bool x_85 = false;
+  bool x_101 = false;
+  bool x_117 = false;
+  bool x_86_phi = false;
+  bool x_102_phi = false;
+  bool x_118_phi = false;
+  a = tint_pack2x16float(float2(1.0f, 1.0f));
+  values = tint_unpack4x8unorm(a);
+  const float x_41 = asfloat(x_8[3].x);
+  const float x_43 = asfloat(x_8[1].x);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_45 = asfloat(x_8[scalar_offset / 4][scalar_offset % 4]);
+  const float x_48 = asfloat(x_8[3].x);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_50 = asfloat(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const float x_53 = asfloat(x_8[1].x);
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const float x_55 = asfloat(x_8[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  ref = float4(x_41, (x_43 / x_45), (x_48 / x_50), (x_53 / x_55));
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const int x_59 = asint(x_10[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  const float x_61 = values[x_59];
+  const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+  const int x_63 = asint(x_10[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+  const float x_65 = ref[x_63];
+  const float x_69 = asfloat(x_8[2].x);
+  const bool x_70 = (abs((x_61 - x_65)) < x_69);
+  x_86_phi = x_70;
+  if (x_70) {
+    const int x_74 = asint(x_10[1].x);
+    const float x_76 = values[x_74];
+    const int x_78 = asint(x_10[1].x);
+    const float x_80 = ref[x_78];
+    const float x_84 = asfloat(x_8[2].x);
+    x_85 = (abs((x_76 - x_80)) < x_84);
+    x_86_phi = x_85;
+  }
+  const bool x_86 = x_86_phi;
+  x_102_phi = x_86;
+  if (x_86) {
+    const int x_90 = asint(x_10[3].x);
+    const float x_92 = values[x_90];
+    const int x_94 = asint(x_10[3].x);
+    const float x_96 = ref[x_94];
+    const float x_100 = asfloat(x_8[2].x);
+    x_101 = (abs((x_92 - x_96)) < x_100);
+    x_102_phi = x_101;
+  }
+  const bool x_102 = x_102_phi;
+  x_118_phi = x_102;
+  if (x_102) {
+    const int x_106 = asint(x_10[2].x);
+    const float x_108 = values[x_106];
+    const int x_110 = asint(x_10[2].x);
+    const float x_112 = ref[x_110];
+    const float x_116 = asfloat(x_8[2].x);
+    x_117 = (abs((x_108 - x_112)) < x_116);
+    x_118_phi = x_117;
+  }
+  if (x_118_phi) {
+    const int x_123 = asint(x_10[1].x);
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const int x_126 = asint(x_10[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+    const int x_129 = asint(x_10[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+    const int x_132 = asint(x_10[1].x);
+    x_GLF_color = float4(float(x_123), float(x_126), float(x_129), float(x_132));
+  } else {
+    const uint scalar_offset_7 = ((16u * uint(0))) / 4;
+    const int x_136 = asint(x_10[scalar_offset_7 / 4][scalar_offset_7 % 4]);
+    const float x_137 = float(x_136);
+    x_GLF_color = float4(x_137, x_137, x_137, x_137);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-packhalf-unpackunorm/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-packhalf-unpackunorm/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..8e6d935
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-packhalf-unpackunorm/0-opt.spvasm.expected.msl
@@ -0,0 +1,112 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[4];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_8, constant buf1& x_10, thread float4* const tint_symbol_4) {
+  uint a = 0u;
+  float4 values = 0.0f;
+  float4 ref = 0.0f;
+  bool x_85 = false;
+  bool x_101 = false;
+  bool x_117 = false;
+  bool x_86_phi = false;
+  bool x_102_phi = false;
+  bool x_118_phi = false;
+  a = as_type<uint>(half2(float2(1.0f, 1.0f)));
+  uint const x_38 = a;
+  values = unpack_unorm4x8_to_float(x_38);
+  float const x_41 = x_8.x_GLF_uniform_float_values.arr[3].el;
+  float const x_43 = x_8.x_GLF_uniform_float_values.arr[1].el;
+  float const x_45 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  float const x_48 = x_8.x_GLF_uniform_float_values.arr[3].el;
+  float const x_50 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  float const x_53 = x_8.x_GLF_uniform_float_values.arr[1].el;
+  float const x_55 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  ref = float4(x_41, (x_43 / x_45), (x_48 / x_50), (x_53 / x_55));
+  int const x_59 = x_10.x_GLF_uniform_int_values.arr[0].el;
+  float const x_61 = values[x_59];
+  int const x_63 = x_10.x_GLF_uniform_int_values.arr[0].el;
+  float const x_65 = ref[x_63];
+  float const x_69 = x_8.x_GLF_uniform_float_values.arr[2].el;
+  bool const x_70 = (fabs((x_61 - x_65)) < x_69);
+  x_86_phi = x_70;
+  if (x_70) {
+    int const x_74 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    float const x_76 = values[x_74];
+    int const x_78 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    float const x_80 = ref[x_78];
+    float const x_84 = x_8.x_GLF_uniform_float_values.arr[2].el;
+    x_85 = (fabs((x_76 - x_80)) < x_84);
+    x_86_phi = x_85;
+  }
+  bool const x_86 = x_86_phi;
+  x_102_phi = x_86;
+  if (x_86) {
+    int const x_90 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    float const x_92 = values[x_90];
+    int const x_94 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    float const x_96 = ref[x_94];
+    float const x_100 = x_8.x_GLF_uniform_float_values.arr[2].el;
+    x_101 = (fabs((x_92 - x_96)) < x_100);
+    x_102_phi = x_101;
+  }
+  bool const x_102 = x_102_phi;
+  x_118_phi = x_102;
+  if (x_102) {
+    int const x_106 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    float const x_108 = values[x_106];
+    int const x_110 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    float const x_112 = ref[x_110];
+    float const x_116 = x_8.x_GLF_uniform_float_values.arr[2].el;
+    x_117 = (fabs((x_108 - x_112)) < x_116);
+    x_118_phi = x_117;
+  }
+  bool const x_118 = x_118_phi;
+  if (x_118) {
+    int const x_123 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_126 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    int const x_129 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    int const x_132 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_123), float(x_126), float(x_129), float(x_132));
+  } else {
+    int const x_136 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    float const x_137 = float(x_136);
+    *(tint_symbol_4) = float4(x_137, x_137, x_137, x_137);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_8 [[buffer(0)]], constant buf1& x_10 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_8, x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-packhalf-unpackunorm/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-packhalf-unpackunorm/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..48890d8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-packhalf-unpackunorm/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,246 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 167
+; Schema: 0
+               OpCapability Shader
+         %39 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %values "values"
+               OpName %ref "ref"
+               OpName %x_85 "x_85"
+               OpName %x_101 "x_101"
+               OpName %x_117 "x_117"
+               OpName %x_86_phi "x_86_phi"
+               OpName %x_102_phi "x_102_phi"
+               OpName %x_118_phi "x_118_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_4 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+       %buf0 = OpTypeStruct %_arr_float_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf1 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_10 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %16
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_Function_uint = OpTypePointer Function %uint
+         %25 = OpConstantNull %uint
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %32 = OpConstantNull %bool
+    %v2float = OpTypeVector %float 2
+    %float_1 = OpConstant %float 1
+         %42 = OpConstantComposite %v2float %float_1 %float_1
+     %uint_0 = OpConstant %uint 0
+      %int_3 = OpConstant %int 3
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+        %155 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+          %a = OpVariable %_ptr_Function_uint Function %25
+     %values = OpVariable %_ptr_Function_v4float Function %16
+        %ref = OpVariable %_ptr_Function_v4float Function %16
+       %x_85 = OpVariable %_ptr_Function_bool Function %32
+      %x_101 = OpVariable %_ptr_Function_bool Function %32
+      %x_117 = OpVariable %_ptr_Function_bool Function %32
+   %x_86_phi = OpVariable %_ptr_Function_bool Function %32
+  %x_102_phi = OpVariable %_ptr_Function_bool Function %32
+  %x_118_phi = OpVariable %_ptr_Function_bool Function %32
+         %38 = OpExtInst %uint %39 PackHalf2x16 %42
+               OpStore %a %38
+         %43 = OpLoad %uint %a
+         %44 = OpExtInst %v4float %39 UnpackUnorm4x8 %43
+               OpStore %values %44
+         %48 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_3
+         %49 = OpLoad %float %48
+         %51 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+         %52 = OpLoad %float %51
+         %54 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %55 = OpLoad %float %54
+         %56 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_3
+         %57 = OpLoad %float %56
+         %58 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %59 = OpLoad %float %58
+         %60 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+         %61 = OpLoad %float %60
+         %62 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %63 = OpLoad %float %62
+         %64 = OpFDiv %float %52 %55
+         %65 = OpFDiv %float %57 %59
+         %66 = OpFDiv %float %61 %63
+         %67 = OpCompositeConstruct %v4float %49 %64 %65 %66
+               OpStore %ref %67
+         %69 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %70 = OpLoad %int %69
+         %72 = OpAccessChain %_ptr_Function_float %values %70
+         %73 = OpLoad %float %72
+         %74 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %75 = OpLoad %int %74
+         %76 = OpAccessChain %_ptr_Function_float %ref %75
+         %77 = OpLoad %float %76
+         %79 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_2
+         %80 = OpLoad %float %79
+         %82 = OpFSub %float %73 %77
+         %81 = OpExtInst %float %39 FAbs %82
+         %83 = OpFOrdLessThan %bool %81 %80
+               OpStore %x_86_phi %83
+               OpSelectionMerge %84 None
+               OpBranchConditional %83 %85 %84
+         %85 = OpLabel
+         %86 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %87 = OpLoad %int %86
+         %88 = OpAccessChain %_ptr_Function_float %values %87
+         %89 = OpLoad %float %88
+         %90 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %91 = OpLoad %int %90
+         %92 = OpAccessChain %_ptr_Function_float %ref %91
+         %93 = OpLoad %float %92
+         %94 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_2
+         %95 = OpLoad %float %94
+         %97 = OpFSub %float %89 %93
+         %96 = OpExtInst %float %39 FAbs %97
+         %98 = OpFOrdLessThan %bool %96 %95
+               OpStore %x_85 %98
+         %99 = OpLoad %bool %x_85
+               OpStore %x_86_phi %99
+               OpBranch %84
+         %84 = OpLabel
+        %100 = OpLoad %bool %x_86_phi
+               OpStore %x_102_phi %100
+               OpSelectionMerge %101 None
+               OpBranchConditional %100 %102 %101
+        %102 = OpLabel
+        %103 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+        %104 = OpLoad %int %103
+        %105 = OpAccessChain %_ptr_Function_float %values %104
+        %106 = OpLoad %float %105
+        %107 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+        %108 = OpLoad %int %107
+        %109 = OpAccessChain %_ptr_Function_float %ref %108
+        %110 = OpLoad %float %109
+        %111 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_2
+        %112 = OpLoad %float %111
+        %114 = OpFSub %float %106 %110
+        %113 = OpExtInst %float %39 FAbs %114
+        %115 = OpFOrdLessThan %bool %113 %112
+               OpStore %x_101 %115
+        %116 = OpLoad %bool %x_101
+               OpStore %x_102_phi %116
+               OpBranch %101
+        %101 = OpLabel
+        %117 = OpLoad %bool %x_102_phi
+               OpStore %x_118_phi %117
+               OpSelectionMerge %118 None
+               OpBranchConditional %117 %119 %118
+        %119 = OpLabel
+        %120 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %121 = OpLoad %int %120
+        %122 = OpAccessChain %_ptr_Function_float %values %121
+        %123 = OpLoad %float %122
+        %124 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %125 = OpLoad %int %124
+        %126 = OpAccessChain %_ptr_Function_float %ref %125
+        %127 = OpLoad %float %126
+        %128 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_2
+        %129 = OpLoad %float %128
+        %131 = OpFSub %float %123 %127
+        %130 = OpExtInst %float %39 FAbs %131
+        %132 = OpFOrdLessThan %bool %130 %129
+               OpStore %x_117 %132
+        %133 = OpLoad %bool %x_117
+               OpStore %x_118_phi %133
+               OpBranch %118
+        %118 = OpLabel
+        %134 = OpLoad %bool %x_118_phi
+               OpSelectionMerge %135 None
+               OpBranchConditional %134 %136 %137
+        %136 = OpLabel
+        %138 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %139 = OpLoad %int %138
+        %140 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %141 = OpLoad %int %140
+        %142 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %143 = OpLoad %int %142
+        %144 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %145 = OpLoad %int %144
+        %146 = OpConvertSToF %float %139
+        %147 = OpConvertSToF %float %141
+        %148 = OpConvertSToF %float %143
+        %149 = OpConvertSToF %float %145
+        %150 = OpCompositeConstruct %v4float %146 %147 %148 %149
+               OpStore %x_GLF_color %150
+               OpBranch %135
+        %137 = OpLabel
+        %151 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %152 = OpLoad %int %151
+        %153 = OpConvertSToF %float %152
+        %154 = OpCompositeConstruct %v4float %153 %153 %153 %153
+               OpStore %x_GLF_color %154
+               OpBranch %135
+        %135 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %155
+%tint_symbol = OpFunctionParameter %main_out
+        %159 = OpLabel
+        %160 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %160
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+        %162 = OpLabel
+        %163 = OpFunctionCall %void %main_1
+        %165 = OpLoad %v4float %x_GLF_color
+        %166 = OpCompositeConstruct %main_out %165
+        %164 = OpFunctionCall %void %tint_symbol_2 %166
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-packhalf-unpackunorm/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-packhalf-unpackunorm/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..5220a98
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-packhalf-unpackunorm/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,104 @@
+type Arr = [[stride(16)]] array<f32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : u32;
+  var values : vec4<f32>;
+  var ref : vec4<f32>;
+  var x_85 : bool;
+  var x_101 : bool;
+  var x_117 : bool;
+  var x_86_phi : bool;
+  var x_102_phi : bool;
+  var x_118_phi : bool;
+  a = pack2x16float(vec2<f32>(1.0, 1.0));
+  let x_38 : u32 = a;
+  values = unpack4x8unorm(x_38);
+  let x_41 : f32 = x_8.x_GLF_uniform_float_values[3];
+  let x_43 : f32 = x_8.x_GLF_uniform_float_values[1];
+  let x_45 : f32 = x_8.x_GLF_uniform_float_values[0];
+  let x_48 : f32 = x_8.x_GLF_uniform_float_values[3];
+  let x_50 : f32 = x_8.x_GLF_uniform_float_values[0];
+  let x_53 : f32 = x_8.x_GLF_uniform_float_values[1];
+  let x_55 : f32 = x_8.x_GLF_uniform_float_values[0];
+  ref = vec4<f32>(x_41, (x_43 / x_45), (x_48 / x_50), (x_53 / x_55));
+  let x_59 : i32 = x_10.x_GLF_uniform_int_values[0];
+  let x_61 : f32 = values[x_59];
+  let x_63 : i32 = x_10.x_GLF_uniform_int_values[0];
+  let x_65 : f32 = ref[x_63];
+  let x_69 : f32 = x_8.x_GLF_uniform_float_values[2];
+  let x_70 : bool = (abs((x_61 - x_65)) < x_69);
+  x_86_phi = x_70;
+  if (x_70) {
+    let x_74 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_76 : f32 = values[x_74];
+    let x_78 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_80 : f32 = ref[x_78];
+    let x_84 : f32 = x_8.x_GLF_uniform_float_values[2];
+    x_85 = (abs((x_76 - x_80)) < x_84);
+    x_86_phi = x_85;
+  }
+  let x_86 : bool = x_86_phi;
+  x_102_phi = x_86;
+  if (x_86) {
+    let x_90 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_92 : f32 = values[x_90];
+    let x_94 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_96 : f32 = ref[x_94];
+    let x_100 : f32 = x_8.x_GLF_uniform_float_values[2];
+    x_101 = (abs((x_92 - x_96)) < x_100);
+    x_102_phi = x_101;
+  }
+  let x_102 : bool = x_102_phi;
+  x_118_phi = x_102;
+  if (x_102) {
+    let x_106 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_108 : f32 = values[x_106];
+    let x_110 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_112 : f32 = ref[x_110];
+    let x_116 : f32 = x_8.x_GLF_uniform_float_values[2];
+    x_117 = (abs((x_108 - x_112)) < x_116);
+    x_118_phi = x_117;
+  }
+  let x_118 : bool = x_118_phi;
+  if (x_118) {
+    let x_123 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_126 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_129 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_132 : i32 = x_10.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_123), f32(x_126), f32(x_129), f32(x_132));
+  } else {
+    let x_136 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_137 : f32 = f32(x_136);
+    x_GLF_color = vec4<f32>(x_137, x_137, x_137, x_137);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-packhalf-unpackunorm/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-packhalf-unpackunorm/0-opt.wgsl
new file mode 100644
index 0000000..5220a98
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-packhalf-unpackunorm/0-opt.wgsl
@@ -0,0 +1,104 @@
+type Arr = [[stride(16)]] array<f32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : u32;
+  var values : vec4<f32>;
+  var ref : vec4<f32>;
+  var x_85 : bool;
+  var x_101 : bool;
+  var x_117 : bool;
+  var x_86_phi : bool;
+  var x_102_phi : bool;
+  var x_118_phi : bool;
+  a = pack2x16float(vec2<f32>(1.0, 1.0));
+  let x_38 : u32 = a;
+  values = unpack4x8unorm(x_38);
+  let x_41 : f32 = x_8.x_GLF_uniform_float_values[3];
+  let x_43 : f32 = x_8.x_GLF_uniform_float_values[1];
+  let x_45 : f32 = x_8.x_GLF_uniform_float_values[0];
+  let x_48 : f32 = x_8.x_GLF_uniform_float_values[3];
+  let x_50 : f32 = x_8.x_GLF_uniform_float_values[0];
+  let x_53 : f32 = x_8.x_GLF_uniform_float_values[1];
+  let x_55 : f32 = x_8.x_GLF_uniform_float_values[0];
+  ref = vec4<f32>(x_41, (x_43 / x_45), (x_48 / x_50), (x_53 / x_55));
+  let x_59 : i32 = x_10.x_GLF_uniform_int_values[0];
+  let x_61 : f32 = values[x_59];
+  let x_63 : i32 = x_10.x_GLF_uniform_int_values[0];
+  let x_65 : f32 = ref[x_63];
+  let x_69 : f32 = x_8.x_GLF_uniform_float_values[2];
+  let x_70 : bool = (abs((x_61 - x_65)) < x_69);
+  x_86_phi = x_70;
+  if (x_70) {
+    let x_74 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_76 : f32 = values[x_74];
+    let x_78 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_80 : f32 = ref[x_78];
+    let x_84 : f32 = x_8.x_GLF_uniform_float_values[2];
+    x_85 = (abs((x_76 - x_80)) < x_84);
+    x_86_phi = x_85;
+  }
+  let x_86 : bool = x_86_phi;
+  x_102_phi = x_86;
+  if (x_86) {
+    let x_90 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_92 : f32 = values[x_90];
+    let x_94 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_96 : f32 = ref[x_94];
+    let x_100 : f32 = x_8.x_GLF_uniform_float_values[2];
+    x_101 = (abs((x_92 - x_96)) < x_100);
+    x_102_phi = x_101;
+  }
+  let x_102 : bool = x_102_phi;
+  x_118_phi = x_102;
+  if (x_102) {
+    let x_106 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_108 : f32 = values[x_106];
+    let x_110 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_112 : f32 = ref[x_110];
+    let x_116 : f32 = x_8.x_GLF_uniform_float_values[2];
+    x_117 = (abs((x_108 - x_112)) < x_116);
+    x_118_phi = x_117;
+  }
+  let x_118 : bool = x_118_phi;
+  if (x_118) {
+    let x_123 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_126 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_129 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_132 : i32 = x_10.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_123), f32(x_126), f32(x_129), f32(x_132));
+  } else {
+    let x_136 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_137 : f32 = f32(x_136);
+    x_GLF_color = vec4<f32>(x_137, x_137, x_137, x_137);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-packhalf-unpackunorm/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-packhalf-unpackunorm/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..f87712b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-packhalf-unpackunorm/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,112 @@
+uint tint_pack2x16float(float2 param_0) {
+  uint2 i = f32tof16(param_0);
+  return i.x | (i.y << 16);
+}
+
+float4 tint_unpack4x8unorm(uint param_0) {
+  uint j = param_0;
+  uint4 i = uint4(j & 0xff, (j >> 8) & 0xff, (j >> 16) & 0xff, j >> 24);
+  return float4(i) / 255.0;
+}
+
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[4];
+};
+cbuffer cbuffer_x_10 : register(b1, space0) {
+  uint4 x_10[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  uint a = 0u;
+  float4 values = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 ref = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  bool x_85 = false;
+  bool x_101 = false;
+  bool x_117 = false;
+  bool x_86_phi = false;
+  bool x_102_phi = false;
+  bool x_118_phi = false;
+  a = tint_pack2x16float(float2(1.0f, 1.0f));
+  values = tint_unpack4x8unorm(a);
+  const float x_41 = asfloat(x_8[3].x);
+  const float x_43 = asfloat(x_8[1].x);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_45 = asfloat(x_8[scalar_offset / 4][scalar_offset % 4]);
+  const float x_48 = asfloat(x_8[3].x);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_50 = asfloat(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const float x_53 = asfloat(x_8[1].x);
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const float x_55 = asfloat(x_8[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  ref = float4(x_41, (x_43 / x_45), (x_48 / x_50), (x_53 / x_55));
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const int x_59 = asint(x_10[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  const float x_61 = values[x_59];
+  const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+  const int x_63 = asint(x_10[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+  const float x_65 = ref[x_63];
+  const float x_69 = asfloat(x_8[2].x);
+  const bool x_70 = (abs((x_61 - x_65)) < x_69);
+  x_86_phi = x_70;
+  if (x_70) {
+    const int x_74 = asint(x_10[1].x);
+    const float x_76 = values[x_74];
+    const int x_78 = asint(x_10[1].x);
+    const float x_80 = ref[x_78];
+    const float x_84 = asfloat(x_8[2].x);
+    x_85 = (abs((x_76 - x_80)) < x_84);
+    x_86_phi = x_85;
+  }
+  const bool x_86 = x_86_phi;
+  x_102_phi = x_86;
+  if (x_86) {
+    const int x_90 = asint(x_10[3].x);
+    const float x_92 = values[x_90];
+    const int x_94 = asint(x_10[3].x);
+    const float x_96 = ref[x_94];
+    const float x_100 = asfloat(x_8[2].x);
+    x_101 = (abs((x_92 - x_96)) < x_100);
+    x_102_phi = x_101;
+  }
+  const bool x_102 = x_102_phi;
+  x_118_phi = x_102;
+  if (x_102) {
+    const int x_106 = asint(x_10[2].x);
+    const float x_108 = values[x_106];
+    const int x_110 = asint(x_10[2].x);
+    const float x_112 = ref[x_110];
+    const float x_116 = asfloat(x_8[2].x);
+    x_117 = (abs((x_108 - x_112)) < x_116);
+    x_118_phi = x_117;
+  }
+  if (x_118_phi) {
+    const int x_123 = asint(x_10[1].x);
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const int x_126 = asint(x_10[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+    const int x_129 = asint(x_10[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+    const int x_132 = asint(x_10[1].x);
+    x_GLF_color = float4(float(x_123), float(x_126), float(x_129), float(x_132));
+  } else {
+    const uint scalar_offset_7 = ((16u * uint(0))) / 4;
+    const int x_136 = asint(x_10[scalar_offset_7 / 4][scalar_offset_7 % 4]);
+    const float x_137 = float(x_136);
+    x_GLF_color = float4(x_137, x_137, x_137, x_137);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-packhalf-unpackunorm/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-packhalf-unpackunorm/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..8e6d935
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-packhalf-unpackunorm/0-opt.wgsl.expected.msl
@@ -0,0 +1,112 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[4];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_8, constant buf1& x_10, thread float4* const tint_symbol_4) {
+  uint a = 0u;
+  float4 values = 0.0f;
+  float4 ref = 0.0f;
+  bool x_85 = false;
+  bool x_101 = false;
+  bool x_117 = false;
+  bool x_86_phi = false;
+  bool x_102_phi = false;
+  bool x_118_phi = false;
+  a = as_type<uint>(half2(float2(1.0f, 1.0f)));
+  uint const x_38 = a;
+  values = unpack_unorm4x8_to_float(x_38);
+  float const x_41 = x_8.x_GLF_uniform_float_values.arr[3].el;
+  float const x_43 = x_8.x_GLF_uniform_float_values.arr[1].el;
+  float const x_45 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  float const x_48 = x_8.x_GLF_uniform_float_values.arr[3].el;
+  float const x_50 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  float const x_53 = x_8.x_GLF_uniform_float_values.arr[1].el;
+  float const x_55 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  ref = float4(x_41, (x_43 / x_45), (x_48 / x_50), (x_53 / x_55));
+  int const x_59 = x_10.x_GLF_uniform_int_values.arr[0].el;
+  float const x_61 = values[x_59];
+  int const x_63 = x_10.x_GLF_uniform_int_values.arr[0].el;
+  float const x_65 = ref[x_63];
+  float const x_69 = x_8.x_GLF_uniform_float_values.arr[2].el;
+  bool const x_70 = (fabs((x_61 - x_65)) < x_69);
+  x_86_phi = x_70;
+  if (x_70) {
+    int const x_74 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    float const x_76 = values[x_74];
+    int const x_78 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    float const x_80 = ref[x_78];
+    float const x_84 = x_8.x_GLF_uniform_float_values.arr[2].el;
+    x_85 = (fabs((x_76 - x_80)) < x_84);
+    x_86_phi = x_85;
+  }
+  bool const x_86 = x_86_phi;
+  x_102_phi = x_86;
+  if (x_86) {
+    int const x_90 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    float const x_92 = values[x_90];
+    int const x_94 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    float const x_96 = ref[x_94];
+    float const x_100 = x_8.x_GLF_uniform_float_values.arr[2].el;
+    x_101 = (fabs((x_92 - x_96)) < x_100);
+    x_102_phi = x_101;
+  }
+  bool const x_102 = x_102_phi;
+  x_118_phi = x_102;
+  if (x_102) {
+    int const x_106 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    float const x_108 = values[x_106];
+    int const x_110 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    float const x_112 = ref[x_110];
+    float const x_116 = x_8.x_GLF_uniform_float_values.arr[2].el;
+    x_117 = (fabs((x_108 - x_112)) < x_116);
+    x_118_phi = x_117;
+  }
+  bool const x_118 = x_118_phi;
+  if (x_118) {
+    int const x_123 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_126 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    int const x_129 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    int const x_132 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_123), float(x_126), float(x_129), float(x_132));
+  } else {
+    int const x_136 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    float const x_137 = float(x_136);
+    *(tint_symbol_4) = float4(x_137, x_137, x_137, x_137);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_8 [[buffer(0)]], constant buf1& x_10 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_8, x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-packhalf-unpackunorm/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-packhalf-unpackunorm/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..48890d8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-packhalf-unpackunorm/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,246 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 167
+; Schema: 0
+               OpCapability Shader
+         %39 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %values "values"
+               OpName %ref "ref"
+               OpName %x_85 "x_85"
+               OpName %x_101 "x_101"
+               OpName %x_117 "x_117"
+               OpName %x_86_phi "x_86_phi"
+               OpName %x_102_phi "x_102_phi"
+               OpName %x_118_phi "x_118_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_4 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+       %buf0 = OpTypeStruct %_arr_float_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf1 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_10 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %16
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_Function_uint = OpTypePointer Function %uint
+         %25 = OpConstantNull %uint
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %32 = OpConstantNull %bool
+    %v2float = OpTypeVector %float 2
+    %float_1 = OpConstant %float 1
+         %42 = OpConstantComposite %v2float %float_1 %float_1
+     %uint_0 = OpConstant %uint 0
+      %int_3 = OpConstant %int 3
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+        %155 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+          %a = OpVariable %_ptr_Function_uint Function %25
+     %values = OpVariable %_ptr_Function_v4float Function %16
+        %ref = OpVariable %_ptr_Function_v4float Function %16
+       %x_85 = OpVariable %_ptr_Function_bool Function %32
+      %x_101 = OpVariable %_ptr_Function_bool Function %32
+      %x_117 = OpVariable %_ptr_Function_bool Function %32
+   %x_86_phi = OpVariable %_ptr_Function_bool Function %32
+  %x_102_phi = OpVariable %_ptr_Function_bool Function %32
+  %x_118_phi = OpVariable %_ptr_Function_bool Function %32
+         %38 = OpExtInst %uint %39 PackHalf2x16 %42
+               OpStore %a %38
+         %43 = OpLoad %uint %a
+         %44 = OpExtInst %v4float %39 UnpackUnorm4x8 %43
+               OpStore %values %44
+         %48 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_3
+         %49 = OpLoad %float %48
+         %51 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+         %52 = OpLoad %float %51
+         %54 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %55 = OpLoad %float %54
+         %56 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_3
+         %57 = OpLoad %float %56
+         %58 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %59 = OpLoad %float %58
+         %60 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+         %61 = OpLoad %float %60
+         %62 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %63 = OpLoad %float %62
+         %64 = OpFDiv %float %52 %55
+         %65 = OpFDiv %float %57 %59
+         %66 = OpFDiv %float %61 %63
+         %67 = OpCompositeConstruct %v4float %49 %64 %65 %66
+               OpStore %ref %67
+         %69 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %70 = OpLoad %int %69
+         %72 = OpAccessChain %_ptr_Function_float %values %70
+         %73 = OpLoad %float %72
+         %74 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %75 = OpLoad %int %74
+         %76 = OpAccessChain %_ptr_Function_float %ref %75
+         %77 = OpLoad %float %76
+         %79 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_2
+         %80 = OpLoad %float %79
+         %82 = OpFSub %float %73 %77
+         %81 = OpExtInst %float %39 FAbs %82
+         %83 = OpFOrdLessThan %bool %81 %80
+               OpStore %x_86_phi %83
+               OpSelectionMerge %84 None
+               OpBranchConditional %83 %85 %84
+         %85 = OpLabel
+         %86 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %87 = OpLoad %int %86
+         %88 = OpAccessChain %_ptr_Function_float %values %87
+         %89 = OpLoad %float %88
+         %90 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %91 = OpLoad %int %90
+         %92 = OpAccessChain %_ptr_Function_float %ref %91
+         %93 = OpLoad %float %92
+         %94 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_2
+         %95 = OpLoad %float %94
+         %97 = OpFSub %float %89 %93
+         %96 = OpExtInst %float %39 FAbs %97
+         %98 = OpFOrdLessThan %bool %96 %95
+               OpStore %x_85 %98
+         %99 = OpLoad %bool %x_85
+               OpStore %x_86_phi %99
+               OpBranch %84
+         %84 = OpLabel
+        %100 = OpLoad %bool %x_86_phi
+               OpStore %x_102_phi %100
+               OpSelectionMerge %101 None
+               OpBranchConditional %100 %102 %101
+        %102 = OpLabel
+        %103 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+        %104 = OpLoad %int %103
+        %105 = OpAccessChain %_ptr_Function_float %values %104
+        %106 = OpLoad %float %105
+        %107 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+        %108 = OpLoad %int %107
+        %109 = OpAccessChain %_ptr_Function_float %ref %108
+        %110 = OpLoad %float %109
+        %111 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_2
+        %112 = OpLoad %float %111
+        %114 = OpFSub %float %106 %110
+        %113 = OpExtInst %float %39 FAbs %114
+        %115 = OpFOrdLessThan %bool %113 %112
+               OpStore %x_101 %115
+        %116 = OpLoad %bool %x_101
+               OpStore %x_102_phi %116
+               OpBranch %101
+        %101 = OpLabel
+        %117 = OpLoad %bool %x_102_phi
+               OpStore %x_118_phi %117
+               OpSelectionMerge %118 None
+               OpBranchConditional %117 %119 %118
+        %119 = OpLabel
+        %120 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %121 = OpLoad %int %120
+        %122 = OpAccessChain %_ptr_Function_float %values %121
+        %123 = OpLoad %float %122
+        %124 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %125 = OpLoad %int %124
+        %126 = OpAccessChain %_ptr_Function_float %ref %125
+        %127 = OpLoad %float %126
+        %128 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_2
+        %129 = OpLoad %float %128
+        %131 = OpFSub %float %123 %127
+        %130 = OpExtInst %float %39 FAbs %131
+        %132 = OpFOrdLessThan %bool %130 %129
+               OpStore %x_117 %132
+        %133 = OpLoad %bool %x_117
+               OpStore %x_118_phi %133
+               OpBranch %118
+        %118 = OpLabel
+        %134 = OpLoad %bool %x_118_phi
+               OpSelectionMerge %135 None
+               OpBranchConditional %134 %136 %137
+        %136 = OpLabel
+        %138 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %139 = OpLoad %int %138
+        %140 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %141 = OpLoad %int %140
+        %142 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %143 = OpLoad %int %142
+        %144 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %145 = OpLoad %int %144
+        %146 = OpConvertSToF %float %139
+        %147 = OpConvertSToF %float %141
+        %148 = OpConvertSToF %float %143
+        %149 = OpConvertSToF %float %145
+        %150 = OpCompositeConstruct %v4float %146 %147 %148 %149
+               OpStore %x_GLF_color %150
+               OpBranch %135
+        %137 = OpLabel
+        %151 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %152 = OpLoad %int %151
+        %153 = OpConvertSToF %float %152
+        %154 = OpCompositeConstruct %v4float %153 %153 %153 %153
+               OpStore %x_GLF_color %154
+               OpBranch %135
+        %135 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %155
+%tint_symbol = OpFunctionParameter %main_out
+        %159 = OpLabel
+        %160 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %160
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+        %162 = OpLabel
+        %163 = OpFunctionCall %void %main_1
+        %165 = OpLoad %v4float %x_GLF_color
+        %166 = OpCompositeConstruct %main_out %165
+        %164 = OpFunctionCall %void %tint_symbol_2 %166
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-packhalf-unpackunorm/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-packhalf-unpackunorm/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..5220a98
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-packhalf-unpackunorm/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,104 @@
+type Arr = [[stride(16)]] array<f32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : u32;
+  var values : vec4<f32>;
+  var ref : vec4<f32>;
+  var x_85 : bool;
+  var x_101 : bool;
+  var x_117 : bool;
+  var x_86_phi : bool;
+  var x_102_phi : bool;
+  var x_118_phi : bool;
+  a = pack2x16float(vec2<f32>(1.0, 1.0));
+  let x_38 : u32 = a;
+  values = unpack4x8unorm(x_38);
+  let x_41 : f32 = x_8.x_GLF_uniform_float_values[3];
+  let x_43 : f32 = x_8.x_GLF_uniform_float_values[1];
+  let x_45 : f32 = x_8.x_GLF_uniform_float_values[0];
+  let x_48 : f32 = x_8.x_GLF_uniform_float_values[3];
+  let x_50 : f32 = x_8.x_GLF_uniform_float_values[0];
+  let x_53 : f32 = x_8.x_GLF_uniform_float_values[1];
+  let x_55 : f32 = x_8.x_GLF_uniform_float_values[0];
+  ref = vec4<f32>(x_41, (x_43 / x_45), (x_48 / x_50), (x_53 / x_55));
+  let x_59 : i32 = x_10.x_GLF_uniform_int_values[0];
+  let x_61 : f32 = values[x_59];
+  let x_63 : i32 = x_10.x_GLF_uniform_int_values[0];
+  let x_65 : f32 = ref[x_63];
+  let x_69 : f32 = x_8.x_GLF_uniform_float_values[2];
+  let x_70 : bool = (abs((x_61 - x_65)) < x_69);
+  x_86_phi = x_70;
+  if (x_70) {
+    let x_74 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_76 : f32 = values[x_74];
+    let x_78 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_80 : f32 = ref[x_78];
+    let x_84 : f32 = x_8.x_GLF_uniform_float_values[2];
+    x_85 = (abs((x_76 - x_80)) < x_84);
+    x_86_phi = x_85;
+  }
+  let x_86 : bool = x_86_phi;
+  x_102_phi = x_86;
+  if (x_86) {
+    let x_90 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_92 : f32 = values[x_90];
+    let x_94 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_96 : f32 = ref[x_94];
+    let x_100 : f32 = x_8.x_GLF_uniform_float_values[2];
+    x_101 = (abs((x_92 - x_96)) < x_100);
+    x_102_phi = x_101;
+  }
+  let x_102 : bool = x_102_phi;
+  x_118_phi = x_102;
+  if (x_102) {
+    let x_106 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_108 : f32 = values[x_106];
+    let x_110 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_112 : f32 = ref[x_110];
+    let x_116 : f32 = x_8.x_GLF_uniform_float_values[2];
+    x_117 = (abs((x_108 - x_112)) < x_116);
+    x_118_phi = x_117;
+  }
+  let x_118 : bool = x_118_phi;
+  if (x_118) {
+    let x_123 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_126 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_129 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_132 : i32 = x_10.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_123), f32(x_126), f32(x_129), f32(x_132));
+  } else {
+    let x_136 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_137 : f32 = f32(x_136);
+    x_GLF_color = vec4<f32>(x_137, x_137, x_137, x_137);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-signum/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-signum/0-opt.spvasm
new file mode 100644
index 0000000..f88da41
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-signum/0-opt.spvasm
@@ -0,0 +1,73 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %func_i1_ "func(i1;"
+               OpName %x "x"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %_ ""
+               OpName %param "param"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %13 = OpTypeFunction %int %_ptr_Function_int
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+     %int_n1 = OpConstant %int -1
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %25 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %26 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %10
+         %27 = OpLabel
+      %param = OpVariable %_ptr_Function_int Function
+               OpStore %param %int_n1
+         %28 = OpFunctionCall %int %func_i1_ %param
+         %29 = OpSLessThanEqual %bool %28 %int_0
+               OpSelectionMerge %30 None
+               OpBranchConditional %29 %31 %32
+         %31 = OpLabel
+               OpStore %_GLF_color %25
+               OpBranch %30
+         %32 = OpLabel
+               OpStore %_GLF_color %26
+               OpBranch %30
+         %30 = OpLabel
+               OpReturn
+               OpFunctionEnd
+   %func_i1_ = OpFunction %int None %13
+          %x = OpFunctionParameter %_ptr_Function_int
+         %33 = OpLabel
+         %34 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %35 = OpLoad %int %34
+         %36 = OpIEqual %bool %35 %int_1
+               OpSelectionMerge %37 None
+               OpBranchConditional %36 %38 %37
+         %38 = OpLabel
+         %39 = OpLoad %int %x
+               OpReturnValue %39
+         %37 = OpLabel
+         %40 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %41 = OpLoad %int %40
+               OpReturnValue %41
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-signum/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-signum/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..e0e1799
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-signum/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,40 @@
+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);
+
+int func_i1_(inout int x) {
+  const int x_35 = asint(x_7[0].x);
+  if ((x_35 == 1)) {
+    const int x_39 = x;
+    return x_39;
+  }
+  const int x_41 = asint(x_7[0].x);
+  return x_41;
+}
+
+void main_1() {
+  int param = 0;
+  param = -1;
+  const int x_28 = func_i1_(param);
+  if ((x_28 <= 0)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-signum/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-signum/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..4c29280
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-signum/0-opt.spvasm.expected.msl
@@ -0,0 +1,43 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int func_i1_(constant buf0& x_7, thread int* const x) {
+  int const x_35 = x_7.one;
+  if ((x_35 == 1)) {
+    int const x_39 = *(x);
+    return x_39;
+  }
+  int const x_41 = x_7.one;
+  return x_41;
+}
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_4) {
+  int param = 0;
+  param = -1;
+  int const x_28 = func_i1_(x_7, &(param));
+  if ((x_28 <= 0)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-signum/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-signum/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..3722ee6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-signum/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,107 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 61
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_i1_ "func_i1_"
+               OpName %x "x"
+               OpName %main_1 "main_1"
+               OpName %param "param"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+%_ptr_Function_int = OpTypePointer Function %int
+         %12 = OpTypeFunction %int %_ptr_Function_int
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+       %void = OpTypeVoid
+         %31 = OpTypeFunction %void
+         %36 = OpConstantNull %int
+     %int_n1 = OpConstant %int -1
+      %int_0 = OpConstant %int 0
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %47 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %48 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %49 = OpTypeFunction %void %main_out
+   %func_i1_ = OpFunction %int None %12
+          %x = OpFunctionParameter %_ptr_Function_int
+         %16 = OpLabel
+         %20 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %21 = OpLoad %int %20
+         %23 = OpIEqual %bool %21 %int_1
+               OpSelectionMerge %25 None
+               OpBranchConditional %23 %26 %25
+         %26 = OpLabel
+         %28 = OpLoad %int %x
+               OpReturnValue %28
+         %25 = OpLabel
+         %29 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %30 = OpLoad %int %29
+               OpReturnValue %30
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %31
+         %34 = OpLabel
+      %param = OpVariable %_ptr_Function_int Function %36
+               OpStore %param %int_n1
+         %38 = OpFunctionCall %int %func_i1_ %param
+         %41 = OpSLessThanEqual %bool %38 %int_0
+               OpSelectionMerge %42 None
+               OpBranchConditional %41 %43 %44
+         %43 = OpLabel
+               OpStore %x_GLF_color %47
+               OpBranch %42
+         %44 = OpLabel
+               OpStore %x_GLF_color %48
+               OpBranch %42
+         %42 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %49
+%tint_symbol = OpFunctionParameter %main_out
+         %53 = OpLabel
+         %54 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %54
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %31
+         %56 = OpLabel
+         %57 = OpFunctionCall %void %main_1
+         %59 = OpLoad %v4float %x_GLF_color
+         %60 = OpCompositeConstruct %main_out %59
+         %58 = OpFunctionCall %void %tint_symbol_2 %60
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-signum/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-signum/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..06c350a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-signum/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,41 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_i1_(x : ptr<function, i32>) -> i32 {
+  let x_35 : i32 = x_7.one;
+  if ((x_35 == 1)) {
+    let x_39 : i32 = *(x);
+    return x_39;
+  }
+  let x_41 : i32 = x_7.one;
+  return x_41;
+}
+
+fn main_1() {
+  var param : i32;
+  param = -1;
+  let x_28 : i32 = func_i1_(&(param));
+  if ((x_28 <= 0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-signum/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-signum/0-opt.wgsl
new file mode 100644
index 0000000..06c350a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-signum/0-opt.wgsl
@@ -0,0 +1,41 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_i1_(x : ptr<function, i32>) -> i32 {
+  let x_35 : i32 = x_7.one;
+  if ((x_35 == 1)) {
+    let x_39 : i32 = *(x);
+    return x_39;
+  }
+  let x_41 : i32 = x_7.one;
+  return x_41;
+}
+
+fn main_1() {
+  var param : i32;
+  param = -1;
+  let x_28 : i32 = func_i1_(&(param));
+  if ((x_28 <= 0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-signum/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-signum/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..e0e1799
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-signum/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,40 @@
+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);
+
+int func_i1_(inout int x) {
+  const int x_35 = asint(x_7[0].x);
+  if ((x_35 == 1)) {
+    const int x_39 = x;
+    return x_39;
+  }
+  const int x_41 = asint(x_7[0].x);
+  return x_41;
+}
+
+void main_1() {
+  int param = 0;
+  param = -1;
+  const int x_28 = func_i1_(param);
+  if ((x_28 <= 0)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-signum/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-signum/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..4c29280
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-signum/0-opt.wgsl.expected.msl
@@ -0,0 +1,43 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int func_i1_(constant buf0& x_7, thread int* const x) {
+  int const x_35 = x_7.one;
+  if ((x_35 == 1)) {
+    int const x_39 = *(x);
+    return x_39;
+  }
+  int const x_41 = x_7.one;
+  return x_41;
+}
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_4) {
+  int param = 0;
+  param = -1;
+  int const x_28 = func_i1_(x_7, &(param));
+  if ((x_28 <= 0)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-signum/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-signum/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..3722ee6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-signum/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,107 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 61
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_i1_ "func_i1_"
+               OpName %x "x"
+               OpName %main_1 "main_1"
+               OpName %param "param"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+%_ptr_Function_int = OpTypePointer Function %int
+         %12 = OpTypeFunction %int %_ptr_Function_int
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+       %void = OpTypeVoid
+         %31 = OpTypeFunction %void
+         %36 = OpConstantNull %int
+     %int_n1 = OpConstant %int -1
+      %int_0 = OpConstant %int 0
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %47 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %48 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %49 = OpTypeFunction %void %main_out
+   %func_i1_ = OpFunction %int None %12
+          %x = OpFunctionParameter %_ptr_Function_int
+         %16 = OpLabel
+         %20 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %21 = OpLoad %int %20
+         %23 = OpIEqual %bool %21 %int_1
+               OpSelectionMerge %25 None
+               OpBranchConditional %23 %26 %25
+         %26 = OpLabel
+         %28 = OpLoad %int %x
+               OpReturnValue %28
+         %25 = OpLabel
+         %29 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %30 = OpLoad %int %29
+               OpReturnValue %30
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %31
+         %34 = OpLabel
+      %param = OpVariable %_ptr_Function_int Function %36
+               OpStore %param %int_n1
+         %38 = OpFunctionCall %int %func_i1_ %param
+         %41 = OpSLessThanEqual %bool %38 %int_0
+               OpSelectionMerge %42 None
+               OpBranchConditional %41 %43 %44
+         %43 = OpLabel
+               OpStore %x_GLF_color %47
+               OpBranch %42
+         %44 = OpLabel
+               OpStore %x_GLF_color %48
+               OpBranch %42
+         %42 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %49
+%tint_symbol = OpFunctionParameter %main_out
+         %53 = OpLabel
+         %54 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %54
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %31
+         %56 = OpLabel
+         %57 = OpFunctionCall %void %main_1
+         %59 = OpLoad %v4float %x_GLF_color
+         %60 = OpCompositeConstruct %main_out %59
+         %58 = OpFunctionCall %void %tint_symbol_2 %60
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-signum/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-signum/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..06c350a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-signum/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,41 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_i1_(x : ptr<function, i32>) -> i32 {
+  let x_35 : i32 = x_7.one;
+  if ((x_35 == 1)) {
+    let x_39 : i32 = *(x);
+    return x_39;
+  }
+  let x_41 : i32 = x_7.one;
+  return x_41;
+}
+
+fn main_1() {
+  var param : i32;
+  param = -1;
+  let x_28 : i32 = func_i1_(&(param));
+  if ((x_28 <= 0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-single-bit/0.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-single-bit/0.spvasm
new file mode 100644
index 0000000..5d5bb2d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-single-bit/0.spvasm
@@ -0,0 +1,54 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "three"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+     %int_10 = OpConstant %int 10
+      %int_2 = OpConstant %int 2
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_5 = OpConstant %int 5
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %21 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %22 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %7
+         %23 = OpLabel
+         %24 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %25 = OpLoad %int %24
+         %26 = OpBitwiseAnd %int %int_2 %25
+         %27 = OpSDiv %int %int_10 %26
+         %28 = OpIEqual %bool %27 %int_5
+               OpSelectionMerge %29 None
+               OpBranchConditional %28 %30 %31
+         %30 = OpLabel
+               OpStore %_GLF_color %21
+               OpBranch %29
+         %31 = OpLabel
+               OpStore %_GLF_color %22
+               OpBranch %29
+         %29 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-single-bit/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-single-bit/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..564a67a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-single-bit/0.spvasm.expected.hlsl
@@ -0,0 +1,28 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const int x_25 = asint(x_5[0].x);
+  if (((10 / (2 & x_25)) == 5)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-single-bit/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-single-bit/0.spvasm.expected.msl
new file mode 100644
index 0000000..eab11e2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-single-bit/0.spvasm.expected.msl
@@ -0,0 +1,31 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int three;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  int const x_25 = x_5.three;
+  if (((10 / (2 & x_25)) == 5)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-single-bit/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-single-bit/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..ed4d1eb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-single-bit/0.spvasm.expected.spvasm
@@ -0,0 +1,86 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 47
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "three"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+     %int_10 = OpConstant %int 10
+      %int_2 = OpConstant %int 2
+      %int_5 = OpConstant %int 5
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %33 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %34 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %35 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+         %19 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0
+         %20 = OpLoad %int %19
+         %23 = OpBitwiseAnd %int %int_2 %20
+         %24 = OpSDiv %int %int_10 %23
+         %26 = OpIEqual %bool %24 %int_5
+               OpSelectionMerge %28 None
+               OpBranchConditional %26 %29 %30
+         %29 = OpLabel
+               OpStore %x_GLF_color %33
+               OpBranch %28
+         %30 = OpLabel
+               OpStore %x_GLF_color %34
+               OpBranch %28
+         %28 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %35
+%tint_symbol = OpFunctionParameter %main_out
+         %39 = OpLabel
+         %40 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %40
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %42 = OpLabel
+         %43 = OpFunctionCall %void %main_1
+         %45 = OpLoad %v4float %x_GLF_color
+         %46 = OpCompositeConstruct %main_out %45
+         %44 = OpFunctionCall %void %tint_symbol_2 %46
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-single-bit/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-single-bit/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..5354413
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-single-bit/0.spvasm.expected.wgsl
@@ -0,0 +1,29 @@
+[[block]]
+struct buf0 {
+  three : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_25 : i32 = x_5.three;
+  if (((10 / (2 & x_25)) == 5)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-single-bit/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-single-bit/0.wgsl
new file mode 100644
index 0000000..5354413
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-single-bit/0.wgsl
@@ -0,0 +1,29 @@
+[[block]]
+struct buf0 {
+  three : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_25 : i32 = x_5.three;
+  if (((10 / (2 & x_25)) == 5)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-single-bit/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-single-bit/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..564a67a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-single-bit/0.wgsl.expected.hlsl
@@ -0,0 +1,28 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const int x_25 = asint(x_5[0].x);
+  if (((10 / (2 & x_25)) == 5)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-single-bit/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-single-bit/0.wgsl.expected.msl
new file mode 100644
index 0000000..eab11e2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-single-bit/0.wgsl.expected.msl
@@ -0,0 +1,31 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int three;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  int const x_25 = x_5.three;
+  if (((10 / (2 & x_25)) == 5)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-single-bit/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-single-bit/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..ed4d1eb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-single-bit/0.wgsl.expected.spvasm
@@ -0,0 +1,86 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 47
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "three"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+     %int_10 = OpConstant %int 10
+      %int_2 = OpConstant %int 2
+      %int_5 = OpConstant %int 5
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %33 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %34 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %35 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+         %19 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0
+         %20 = OpLoad %int %19
+         %23 = OpBitwiseAnd %int %int_2 %20
+         %24 = OpSDiv %int %int_10 %23
+         %26 = OpIEqual %bool %24 %int_5
+               OpSelectionMerge %28 None
+               OpBranchConditional %26 %29 %30
+         %29 = OpLabel
+               OpStore %x_GLF_color %33
+               OpBranch %28
+         %30 = OpLabel
+               OpStore %x_GLF_color %34
+               OpBranch %28
+         %28 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %35
+%tint_symbol = OpFunctionParameter %main_out
+         %39 = OpLabel
+         %40 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %40
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %42 = OpLabel
+         %43 = OpFunctionCall %void %main_1
+         %45 = OpLoad %v4float %x_GLF_color
+         %46 = OpCompositeConstruct %main_out %45
+         %44 = OpFunctionCall %void %tint_symbol_2 %46
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-single-bit/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-single-bit/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..5354413
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pattern-match-single-bit/0.wgsl.expected.wgsl
@@ -0,0 +1,29 @@
+[[block]]
+struct buf0 {
+  three : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_25 : i32 = x_5.three;
+  if (((10 / (2 & x_25)) == 5)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-peephole-optimizer-target-instr-info-for-if-if-if/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-peephole-optimizer-target-instr-info-for-if-if-if/0-opt.spvasm
new file mode 100644
index 0000000..1ead4f1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-peephole-optimizer-target-instr-info-for-if-if-if/0-opt.spvasm
@@ -0,0 +1,152 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color %gl_FragCoord
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_0 = OpConstant %uint 0
+    %float_0 = OpConstant %float 0
+       %main = OpFunction %void None %13
+         %35 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+         %36 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %37 = OpLoad %int %36
+         %38 = OpConvertSToF %float %37
+         %39 = OpCompositeConstruct %v4float %38 %38 %38 %38
+               OpStore %_GLF_color %39
+         %40 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %41 = OpLoad %int %40
+               OpStore %i %41
+               OpBranch %42
+         %42 = OpLabel
+               OpLoopMerge %43 %44 None
+               OpBranch %45
+         %45 = OpLabel
+         %46 = OpLoad %int %i
+         %47 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %48 = OpLoad %int %47
+         %49 = OpSLessThan %bool %46 %48
+               OpBranchConditional %49 %50 %43
+         %50 = OpLabel
+         %51 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %52 = OpLoad %float %51
+         %53 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %54 = OpLoad %float %53
+         %55 = OpFOrdLessThan %bool %52 %54
+               OpSelectionMerge %56 None
+               OpBranchConditional %55 %57 %56
+         %57 = OpLabel
+         %58 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %59 = OpLoad %float %58
+         %60 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %61 = OpLoad %float %60
+         %62 = OpFOrdLessThan %bool %59 %61
+               OpSelectionMerge %63 None
+               OpBranchConditional %62 %64 %63
+         %64 = OpLabel
+               OpReturn
+         %63 = OpLabel
+         %65 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_1
+         %66 = OpLoad %float %65
+         %67 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_1
+         %68 = OpLoad %float %67
+         %69 = OpFOrdGreaterThan %bool %66 %68
+               OpSelectionMerge %70 None
+               OpBranchConditional %69 %71 %70
+         %71 = OpLabel
+               OpReturn
+         %70 = OpLabel
+               OpKill
+         %56 = OpLabel
+         %72 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_1
+         %73 = OpLoad %float %72
+         %74 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %75 = OpLoad %float %74
+         %76 = OpFOrdGreaterThan %bool %73 %75
+               OpSelectionMerge %77 None
+               OpBranchConditional %76 %78 %77
+         %78 = OpLabel
+         %79 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %80 = OpLoad %int %79
+         %81 = OpConvertSToF %float %80
+         %82 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %83 = OpLoad %int %82
+         %84 = OpConvertSToF %float %83
+         %85 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %86 = OpLoad %int %85
+         %87 = OpConvertSToF %float %86
+         %88 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %89 = OpLoad %int %88
+         %90 = OpConvertSToF %float %89
+         %91 = OpCompositeConstruct %v4float %81 %84 %87 %90
+               OpStore %_GLF_color %91
+               OpBranch %43
+         %77 = OpLabel
+         %92 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %93 = OpLoad %float %92
+         %94 = OpFOrdLessThan %bool %93 %float_0
+               OpSelectionMerge %95 None
+               OpBranchConditional %94 %96 %95
+         %96 = OpLabel
+               OpKill
+         %95 = OpLabel
+               OpBranch %44
+         %44 = OpLabel
+         %97 = OpLoad %int %i
+         %98 = OpIAdd %int %97 %int_1
+               OpStore %i %98
+               OpBranch %42
+         %43 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-peephole-optimizer-target-instr-info-for-if-if-if/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-peephole-optimizer-target-instr-info-for-if-if-if/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..a06717c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-peephole-optimizer-target-instr-info-for-if-if-if/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,83 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[3];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_9 : register(b1, space0) {
+  uint4 x_9[2];
+};
+
+void main_1() {
+  int i = 0;
+  const int x_37 = asint(x_6[1].x);
+  const float x_38 = float(x_37);
+  x_GLF_color = float4(x_38, x_38, x_38, x_38);
+  const int x_41 = asint(x_6[1].x);
+  i = x_41;
+  while (true) {
+    const int x_46 = i;
+    const int x_48 = asint(x_6[2].x);
+    if ((x_46 < x_48)) {
+    } else {
+      break;
+    }
+    const float x_52 = gl_FragCoord.y;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const float x_54 = asfloat(x_9[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_52 < x_54)) {
+      const float x_59 = gl_FragCoord.x;
+      const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+      const float x_61 = asfloat(x_9[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+      if ((x_59 < x_61)) {
+        return;
+      }
+      const float x_66 = asfloat(x_9[1].x);
+      const float x_68 = asfloat(x_9[1].x);
+      if ((x_66 > x_68)) {
+        return;
+      }
+      discard;
+    }
+    const float x_73 = asfloat(x_9[1].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const float x_75 = asfloat(x_9[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    if ((x_73 > x_75)) {
+      const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+      const int x_80 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+      const int x_83 = asint(x_6[1].x);
+      const int x_86 = asint(x_6[1].x);
+      const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+      const int x_89 = asint(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+      x_GLF_color = float4(float(x_80), float(x_83), float(x_86), float(x_89));
+      break;
+    }
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const float x_93 = asfloat(x_9[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    if ((x_93 < 0.0f)) {
+      discard;
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-peephole-optimizer-target-instr-info-for-if-if-if/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-peephole-optimizer-target-instr-info-for-if-if-if/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..301e8f0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-peephole-optimizer-target-instr-info-for-if-if-if/0-opt.spvasm.expected.msl
@@ -0,0 +1,91 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_9, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int i = 0;
+  int const x_37 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  float const x_38 = float(x_37);
+  *(tint_symbol_5) = float4(x_38, x_38, x_38, x_38);
+  int const x_41 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  i = x_41;
+  while (true) {
+    int const x_46 = i;
+    int const x_48 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    if ((x_46 < x_48)) {
+    } else {
+      break;
+    }
+    float const x_52 = (*(tint_symbol_6)).y;
+    float const x_54 = x_9.x_GLF_uniform_float_values.arr[0].el;
+    if ((x_52 < x_54)) {
+      float const x_59 = (*(tint_symbol_6)).x;
+      float const x_61 = x_9.x_GLF_uniform_float_values.arr[0].el;
+      if ((x_59 < x_61)) {
+        return;
+      }
+      float const x_66 = x_9.x_GLF_uniform_float_values.arr[1].el;
+      float const x_68 = x_9.x_GLF_uniform_float_values.arr[1].el;
+      if ((x_66 > x_68)) {
+        return;
+      }
+      discard_fragment();
+    }
+    float const x_73 = x_9.x_GLF_uniform_float_values.arr[1].el;
+    float const x_75 = x_9.x_GLF_uniform_float_values.arr[0].el;
+    if ((x_73 > x_75)) {
+      int const x_80 = x_6.x_GLF_uniform_int_values.arr[0].el;
+      int const x_83 = x_6.x_GLF_uniform_int_values.arr[1].el;
+      int const x_86 = x_6.x_GLF_uniform_int_values.arr[1].el;
+      int const x_89 = x_6.x_GLF_uniform_int_values.arr[0].el;
+      *(tint_symbol_5) = float4(float(x_80), float(x_83), float(x_86), float(x_89));
+      break;
+    }
+    float const x_93 = x_9.x_GLF_uniform_float_values.arr[0].el;
+    if ((x_93 < 0.0f)) {
+      discard_fragment();
+    }
+    {
+      int const x_97 = i;
+      i = (x_97 + 1);
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]], constant buf1& x_9 [[buffer(1)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_6, x_9, &(tint_symbol_8), &(tint_symbol_7));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-peephole-optimizer-target-instr-info-for-if-if-if/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-peephole-optimizer-target-instr-info-for-if-if-if/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..6e3a136
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-peephole-optimizer-target-instr-info-for-if-if-if/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,194 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 118
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_9 "x_9"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 1
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_9 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_0 = OpConstant %float 0
+   %main_out = OpTypeStruct %v4float
+        %105 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %23
+         %26 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %29
+         %33 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %34 = OpLoad %int %33
+         %35 = OpConvertSToF %float %34
+         %36 = OpCompositeConstruct %v4float %35 %35 %35 %35
+               OpStore %x_GLF_color %36
+         %37 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %38 = OpLoad %int %37
+               OpStore %i %38
+               OpBranch %39
+         %39 = OpLabel
+               OpLoopMerge %40 %41 None
+               OpBranch %42
+         %42 = OpLabel
+         %43 = OpLoad %int %i
+         %45 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %46 = OpLoad %int %45
+         %47 = OpSLessThan %bool %43 %46
+               OpSelectionMerge %49 None
+               OpBranchConditional %47 %50 %51
+         %50 = OpLabel
+               OpBranch %49
+         %51 = OpLabel
+               OpBranch %40
+         %49 = OpLabel
+         %54 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %55 = OpLoad %float %54
+         %58 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_0
+         %59 = OpLoad %float %58
+         %60 = OpFOrdLessThan %bool %55 %59
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %61
+         %62 = OpLabel
+         %63 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %64 = OpLoad %float %63
+         %65 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_0
+         %66 = OpLoad %float %65
+         %67 = OpFOrdLessThan %bool %64 %66
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %68
+         %69 = OpLabel
+               OpReturn
+         %68 = OpLabel
+         %70 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_1
+         %71 = OpLoad %float %70
+         %72 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_1
+         %73 = OpLoad %float %72
+         %74 = OpFOrdGreaterThan %bool %71 %73
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %75
+         %76 = OpLabel
+               OpReturn
+         %75 = OpLabel
+               OpKill
+         %61 = OpLabel
+         %77 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_1
+         %78 = OpLoad %float %77
+         %79 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_0
+         %80 = OpLoad %float %79
+         %81 = OpFOrdGreaterThan %bool %78 %80
+               OpSelectionMerge %82 None
+               OpBranchConditional %81 %83 %82
+         %83 = OpLabel
+         %84 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %85 = OpLoad %int %84
+         %86 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %87 = OpLoad %int %86
+         %88 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %89 = OpLoad %int %88
+         %90 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %91 = OpLoad %int %90
+         %92 = OpConvertSToF %float %85
+         %93 = OpConvertSToF %float %87
+         %94 = OpConvertSToF %float %89
+         %95 = OpConvertSToF %float %91
+         %96 = OpCompositeConstruct %v4float %92 %93 %94 %95
+               OpStore %x_GLF_color %96
+               OpBranch %40
+         %82 = OpLabel
+         %97 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_0
+         %98 = OpLoad %float %97
+        %100 = OpFOrdLessThan %bool %98 %float_0
+               OpSelectionMerge %101 None
+               OpBranchConditional %100 %102 %101
+        %102 = OpLabel
+               OpKill
+        %101 = OpLabel
+               OpBranch %41
+         %41 = OpLabel
+        %103 = OpLoad %int %i
+        %104 = OpIAdd %int %103 %int_1
+               OpStore %i %104
+               OpBranch %39
+         %40 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %105
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %109 = OpLabel
+        %110 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %110
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %23
+        %112 = OpLabel
+        %113 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %113
+        %114 = OpFunctionCall %void %main_1
+        %116 = OpLoad %v4float %x_GLF_color
+        %117 = OpCompositeConstruct %main_out %116
+        %115 = OpFunctionCall %void %tint_symbol_3 %117
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-peephole-optimizer-target-instr-info-for-if-if-if/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-peephole-optimizer-target-instr-info-for-if-if-if/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..70772f9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-peephole-optimizer-target-instr-info-for-if-if-if/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,85 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+fn main_1() {
+  var i : i32;
+  let x_37 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_38 : f32 = f32(x_37);
+  x_GLF_color = vec4<f32>(x_38, x_38, x_38, x_38);
+  let x_41 : i32 = x_6.x_GLF_uniform_int_values[1];
+  i = x_41;
+  loop {
+    let x_46 : i32 = i;
+    let x_48 : i32 = x_6.x_GLF_uniform_int_values[2];
+    if ((x_46 < x_48)) {
+    } else {
+      break;
+    }
+    let x_52 : f32 = gl_FragCoord.y;
+    let x_54 : f32 = x_9.x_GLF_uniform_float_values[0];
+    if ((x_52 < x_54)) {
+      let x_59 : f32 = gl_FragCoord.x;
+      let x_61 : f32 = x_9.x_GLF_uniform_float_values[0];
+      if ((x_59 < x_61)) {
+        return;
+      }
+      let x_66 : f32 = x_9.x_GLF_uniform_float_values[1];
+      let x_68 : f32 = x_9.x_GLF_uniform_float_values[1];
+      if ((x_66 > x_68)) {
+        return;
+      }
+      discard;
+    }
+    let x_73 : f32 = x_9.x_GLF_uniform_float_values[1];
+    let x_75 : f32 = x_9.x_GLF_uniform_float_values[0];
+    if ((x_73 > x_75)) {
+      let x_80 : i32 = x_6.x_GLF_uniform_int_values[0];
+      let x_83 : i32 = x_6.x_GLF_uniform_int_values[1];
+      let x_86 : i32 = x_6.x_GLF_uniform_int_values[1];
+      let x_89 : i32 = x_6.x_GLF_uniform_int_values[0];
+      x_GLF_color = vec4<f32>(f32(x_80), f32(x_83), f32(x_86), f32(x_89));
+      break;
+    }
+    let x_93 : f32 = x_9.x_GLF_uniform_float_values[0];
+    if ((x_93 < 0.0)) {
+      discard;
+    }
+
+    continuing {
+      let x_97 : i32 = i;
+      i = (x_97 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-peephole-optimizer-target-instr-info-for-if-if-if/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-peephole-optimizer-target-instr-info-for-if-if-if/0-opt.wgsl
new file mode 100644
index 0000000..70772f9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-peephole-optimizer-target-instr-info-for-if-if-if/0-opt.wgsl
@@ -0,0 +1,85 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+fn main_1() {
+  var i : i32;
+  let x_37 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_38 : f32 = f32(x_37);
+  x_GLF_color = vec4<f32>(x_38, x_38, x_38, x_38);
+  let x_41 : i32 = x_6.x_GLF_uniform_int_values[1];
+  i = x_41;
+  loop {
+    let x_46 : i32 = i;
+    let x_48 : i32 = x_6.x_GLF_uniform_int_values[2];
+    if ((x_46 < x_48)) {
+    } else {
+      break;
+    }
+    let x_52 : f32 = gl_FragCoord.y;
+    let x_54 : f32 = x_9.x_GLF_uniform_float_values[0];
+    if ((x_52 < x_54)) {
+      let x_59 : f32 = gl_FragCoord.x;
+      let x_61 : f32 = x_9.x_GLF_uniform_float_values[0];
+      if ((x_59 < x_61)) {
+        return;
+      }
+      let x_66 : f32 = x_9.x_GLF_uniform_float_values[1];
+      let x_68 : f32 = x_9.x_GLF_uniform_float_values[1];
+      if ((x_66 > x_68)) {
+        return;
+      }
+      discard;
+    }
+    let x_73 : f32 = x_9.x_GLF_uniform_float_values[1];
+    let x_75 : f32 = x_9.x_GLF_uniform_float_values[0];
+    if ((x_73 > x_75)) {
+      let x_80 : i32 = x_6.x_GLF_uniform_int_values[0];
+      let x_83 : i32 = x_6.x_GLF_uniform_int_values[1];
+      let x_86 : i32 = x_6.x_GLF_uniform_int_values[1];
+      let x_89 : i32 = x_6.x_GLF_uniform_int_values[0];
+      x_GLF_color = vec4<f32>(f32(x_80), f32(x_83), f32(x_86), f32(x_89));
+      break;
+    }
+    let x_93 : f32 = x_9.x_GLF_uniform_float_values[0];
+    if ((x_93 < 0.0)) {
+      discard;
+    }
+
+    continuing {
+      let x_97 : i32 = i;
+      i = (x_97 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-peephole-optimizer-target-instr-info-for-if-if-if/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-peephole-optimizer-target-instr-info-for-if-if-if/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..a06717c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-peephole-optimizer-target-instr-info-for-if-if-if/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,83 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[3];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_9 : register(b1, space0) {
+  uint4 x_9[2];
+};
+
+void main_1() {
+  int i = 0;
+  const int x_37 = asint(x_6[1].x);
+  const float x_38 = float(x_37);
+  x_GLF_color = float4(x_38, x_38, x_38, x_38);
+  const int x_41 = asint(x_6[1].x);
+  i = x_41;
+  while (true) {
+    const int x_46 = i;
+    const int x_48 = asint(x_6[2].x);
+    if ((x_46 < x_48)) {
+    } else {
+      break;
+    }
+    const float x_52 = gl_FragCoord.y;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const float x_54 = asfloat(x_9[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_52 < x_54)) {
+      const float x_59 = gl_FragCoord.x;
+      const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+      const float x_61 = asfloat(x_9[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+      if ((x_59 < x_61)) {
+        return;
+      }
+      const float x_66 = asfloat(x_9[1].x);
+      const float x_68 = asfloat(x_9[1].x);
+      if ((x_66 > x_68)) {
+        return;
+      }
+      discard;
+    }
+    const float x_73 = asfloat(x_9[1].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const float x_75 = asfloat(x_9[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    if ((x_73 > x_75)) {
+      const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+      const int x_80 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+      const int x_83 = asint(x_6[1].x);
+      const int x_86 = asint(x_6[1].x);
+      const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+      const int x_89 = asint(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+      x_GLF_color = float4(float(x_80), float(x_83), float(x_86), float(x_89));
+      break;
+    }
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const float x_93 = asfloat(x_9[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    if ((x_93 < 0.0f)) {
+      discard;
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-peephole-optimizer-target-instr-info-for-if-if-if/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-peephole-optimizer-target-instr-info-for-if-if-if/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..301e8f0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-peephole-optimizer-target-instr-info-for-if-if-if/0-opt.wgsl.expected.msl
@@ -0,0 +1,91 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_9, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int i = 0;
+  int const x_37 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  float const x_38 = float(x_37);
+  *(tint_symbol_5) = float4(x_38, x_38, x_38, x_38);
+  int const x_41 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  i = x_41;
+  while (true) {
+    int const x_46 = i;
+    int const x_48 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    if ((x_46 < x_48)) {
+    } else {
+      break;
+    }
+    float const x_52 = (*(tint_symbol_6)).y;
+    float const x_54 = x_9.x_GLF_uniform_float_values.arr[0].el;
+    if ((x_52 < x_54)) {
+      float const x_59 = (*(tint_symbol_6)).x;
+      float const x_61 = x_9.x_GLF_uniform_float_values.arr[0].el;
+      if ((x_59 < x_61)) {
+        return;
+      }
+      float const x_66 = x_9.x_GLF_uniform_float_values.arr[1].el;
+      float const x_68 = x_9.x_GLF_uniform_float_values.arr[1].el;
+      if ((x_66 > x_68)) {
+        return;
+      }
+      discard_fragment();
+    }
+    float const x_73 = x_9.x_GLF_uniform_float_values.arr[1].el;
+    float const x_75 = x_9.x_GLF_uniform_float_values.arr[0].el;
+    if ((x_73 > x_75)) {
+      int const x_80 = x_6.x_GLF_uniform_int_values.arr[0].el;
+      int const x_83 = x_6.x_GLF_uniform_int_values.arr[1].el;
+      int const x_86 = x_6.x_GLF_uniform_int_values.arr[1].el;
+      int const x_89 = x_6.x_GLF_uniform_int_values.arr[0].el;
+      *(tint_symbol_5) = float4(float(x_80), float(x_83), float(x_86), float(x_89));
+      break;
+    }
+    float const x_93 = x_9.x_GLF_uniform_float_values.arr[0].el;
+    if ((x_93 < 0.0f)) {
+      discard_fragment();
+    }
+    {
+      int const x_97 = i;
+      i = (x_97 + 1);
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]], constant buf1& x_9 [[buffer(1)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_6, x_9, &(tint_symbol_8), &(tint_symbol_7));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-peephole-optimizer-target-instr-info-for-if-if-if/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-peephole-optimizer-target-instr-info-for-if-if-if/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..6e3a136
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-peephole-optimizer-target-instr-info-for-if-if-if/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,194 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 118
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_9 "x_9"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 1
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_9 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_0 = OpConstant %float 0
+   %main_out = OpTypeStruct %v4float
+        %105 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %23
+         %26 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %29
+         %33 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %34 = OpLoad %int %33
+         %35 = OpConvertSToF %float %34
+         %36 = OpCompositeConstruct %v4float %35 %35 %35 %35
+               OpStore %x_GLF_color %36
+         %37 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %38 = OpLoad %int %37
+               OpStore %i %38
+               OpBranch %39
+         %39 = OpLabel
+               OpLoopMerge %40 %41 None
+               OpBranch %42
+         %42 = OpLabel
+         %43 = OpLoad %int %i
+         %45 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %46 = OpLoad %int %45
+         %47 = OpSLessThan %bool %43 %46
+               OpSelectionMerge %49 None
+               OpBranchConditional %47 %50 %51
+         %50 = OpLabel
+               OpBranch %49
+         %51 = OpLabel
+               OpBranch %40
+         %49 = OpLabel
+         %54 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %55 = OpLoad %float %54
+         %58 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_0
+         %59 = OpLoad %float %58
+         %60 = OpFOrdLessThan %bool %55 %59
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %61
+         %62 = OpLabel
+         %63 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %64 = OpLoad %float %63
+         %65 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_0
+         %66 = OpLoad %float %65
+         %67 = OpFOrdLessThan %bool %64 %66
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %68
+         %69 = OpLabel
+               OpReturn
+         %68 = OpLabel
+         %70 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_1
+         %71 = OpLoad %float %70
+         %72 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_1
+         %73 = OpLoad %float %72
+         %74 = OpFOrdGreaterThan %bool %71 %73
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %75
+         %76 = OpLabel
+               OpReturn
+         %75 = OpLabel
+               OpKill
+         %61 = OpLabel
+         %77 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_1
+         %78 = OpLoad %float %77
+         %79 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_0
+         %80 = OpLoad %float %79
+         %81 = OpFOrdGreaterThan %bool %78 %80
+               OpSelectionMerge %82 None
+               OpBranchConditional %81 %83 %82
+         %83 = OpLabel
+         %84 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %85 = OpLoad %int %84
+         %86 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %87 = OpLoad %int %86
+         %88 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %89 = OpLoad %int %88
+         %90 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %91 = OpLoad %int %90
+         %92 = OpConvertSToF %float %85
+         %93 = OpConvertSToF %float %87
+         %94 = OpConvertSToF %float %89
+         %95 = OpConvertSToF %float %91
+         %96 = OpCompositeConstruct %v4float %92 %93 %94 %95
+               OpStore %x_GLF_color %96
+               OpBranch %40
+         %82 = OpLabel
+         %97 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_0
+         %98 = OpLoad %float %97
+        %100 = OpFOrdLessThan %bool %98 %float_0
+               OpSelectionMerge %101 None
+               OpBranchConditional %100 %102 %101
+        %102 = OpLabel
+               OpKill
+        %101 = OpLabel
+               OpBranch %41
+         %41 = OpLabel
+        %103 = OpLoad %int %i
+        %104 = OpIAdd %int %103 %int_1
+               OpStore %i %104
+               OpBranch %39
+         %40 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %105
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %109 = OpLabel
+        %110 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %110
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %23
+        %112 = OpLabel
+        %113 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %113
+        %114 = OpFunctionCall %void %main_1
+        %116 = OpLoad %v4float %x_GLF_color
+        %117 = OpCompositeConstruct %main_out %116
+        %115 = OpFunctionCall %void %tint_symbol_3 %117
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-peephole-optimizer-target-instr-info-for-if-if-if/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-peephole-optimizer-target-instr-info-for-if-if-if/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..70772f9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-peephole-optimizer-target-instr-info-for-if-if-if/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,85 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+fn main_1() {
+  var i : i32;
+  let x_37 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_38 : f32 = f32(x_37);
+  x_GLF_color = vec4<f32>(x_38, x_38, x_38, x_38);
+  let x_41 : i32 = x_6.x_GLF_uniform_int_values[1];
+  i = x_41;
+  loop {
+    let x_46 : i32 = i;
+    let x_48 : i32 = x_6.x_GLF_uniform_int_values[2];
+    if ((x_46 < x_48)) {
+    } else {
+      break;
+    }
+    let x_52 : f32 = gl_FragCoord.y;
+    let x_54 : f32 = x_9.x_GLF_uniform_float_values[0];
+    if ((x_52 < x_54)) {
+      let x_59 : f32 = gl_FragCoord.x;
+      let x_61 : f32 = x_9.x_GLF_uniform_float_values[0];
+      if ((x_59 < x_61)) {
+        return;
+      }
+      let x_66 : f32 = x_9.x_GLF_uniform_float_values[1];
+      let x_68 : f32 = x_9.x_GLF_uniform_float_values[1];
+      if ((x_66 > x_68)) {
+        return;
+      }
+      discard;
+    }
+    let x_73 : f32 = x_9.x_GLF_uniform_float_values[1];
+    let x_75 : f32 = x_9.x_GLF_uniform_float_values[0];
+    if ((x_73 > x_75)) {
+      let x_80 : i32 = x_6.x_GLF_uniform_int_values[0];
+      let x_83 : i32 = x_6.x_GLF_uniform_int_values[1];
+      let x_86 : i32 = x_6.x_GLF_uniform_int_values[1];
+      let x_89 : i32 = x_6.x_GLF_uniform_int_values[0];
+      x_GLF_color = vec4<f32>(f32(x_80), f32(x_83), f32(x_86), f32(x_89));
+      break;
+    }
+    let x_93 : f32 = x_9.x_GLF_uniform_float_values[0];
+    if ((x_93 < 0.0)) {
+      discard;
+    }
+
+    continuing {
+      let x_97 : i32 = i;
+      i = (x_97 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pow-identical-value-sqrt/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-pow-identical-value-sqrt/0-opt.spvasm
new file mode 100644
index 0000000..62bd197
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pow-identical-value-sqrt/0-opt.spvasm
@@ -0,0 +1,127 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %f0 "f0"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %f1 "f1"
+               OpName %f2 "f2"
+               OpName %f3 "f3"
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "one"
+               OpName %__0 ""
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %__1 ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %buf2 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 2
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__1 DescriptorSet 0
+               OpDecorate %__1 Binding 1
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %17 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+    %float_4 = OpConstant %float 4
+       %buf2 = OpTypeStruct %float
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+        %__0 = OpVariable %_ptr_Uniform_buf2 Uniform
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__1 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %17
+         %34 = OpLabel
+         %f0 = OpVariable %_ptr_Function_float Function
+         %f1 = OpVariable %_ptr_Function_float Function
+         %f2 = OpVariable %_ptr_Function_float Function
+         %f3 = OpVariable %_ptr_Function_float Function
+         %35 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %36 = OpLoad %float %35
+               OpStore %f0 %36
+         %37 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %38 = OpLoad %float %37
+         %39 = OpLoad %float %f0
+         %40 = OpExtInst %float %1 Pow %39 %float_4
+         %41 = OpFMul %float %38 %40
+               OpStore %f1 %41
+         %42 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %43 = OpLoad %float %42
+         %44 = OpLoad %float %f0
+         %45 = OpExtInst %float %1 Pow %44 %float_4
+         %46 = OpFMul %float %43 %45
+               OpStore %f2 %46
+         %47 = OpLoad %float %f1
+         %48 = OpLoad %float %f2
+         %49 = OpFSub %float %47 %48
+         %50 = OpAccessChain %_ptr_Uniform_float %__0 %int_0
+         %51 = OpLoad %float %50
+         %52 = OpFSub %float %49 %51
+         %53 = OpLoad %float %f0
+         %54 = OpFAdd %float %52 %53
+         %55 = OpExtInst %float %1 Sqrt %54
+               OpStore %f3 %55
+         %56 = OpLoad %float %f3
+         %57 = OpConvertFToS %int %56
+         %58 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_0
+         %59 = OpLoad %int %58
+         %60 = OpIEqual %bool %57 %59
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %63
+         %62 = OpLabel
+         %64 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_0
+         %65 = OpLoad %int %64
+         %66 = OpConvertSToF %float %65
+         %67 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_1
+         %68 = OpLoad %int %67
+         %69 = OpConvertSToF %float %68
+         %70 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_1
+         %71 = OpLoad %int %70
+         %72 = OpConvertSToF %float %71
+         %73 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_0
+         %74 = OpLoad %int %73
+         %75 = OpConvertSToF %float %74
+         %76 = OpCompositeConstruct %v4float %66 %69 %72 %75
+               OpStore %_GLF_color %76
+               OpBranch %61
+         %63 = OpLabel
+         %77 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_1
+         %78 = OpLoad %int %77
+         %79 = OpConvertSToF %float %78
+         %80 = OpCompositeConstruct %v4float %79 %79 %79 %79
+               OpStore %_GLF_color %80
+               OpBranch %61
+         %61 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pow-identical-value-sqrt/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-pow-identical-value-sqrt/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..f0bc792
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pow-identical-value-sqrt/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,59 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+cbuffer cbuffer_x_11 : register(b2, space0) {
+  uint4 x_11[1];
+};
+cbuffer cbuffer_x_13 : register(b1, space0) {
+  uint4 x_13[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float f0 = 0.0f;
+  float f1 = 0.0f;
+  float f2 = 0.0f;
+  float f3 = 0.0f;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_36 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  f0 = x_36;
+  const float x_38 = asfloat(x_6[1].x);
+  f1 = (x_38 * pow(f0, 4.0f));
+  const float x_43 = asfloat(x_6[1].x);
+  f2 = (x_43 * pow(f0, 4.0f));
+  const float x_47 = f1;
+  const float x_48 = f2;
+  const float x_51 = asfloat(x_11[0].x);
+  f3 = sqrt((((x_47 - x_48) - x_51) + f0));
+  const float x_56 = f3;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_59 = asint(x_13[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((int(x_56) == x_59)) {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_65 = asint(x_13[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_68 = asint(x_13[1].x);
+    const int x_71 = asint(x_13[1].x);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_74 = asint(x_13[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    x_GLF_color = float4(float(x_65), float(x_68), float(x_71), float(x_74));
+  } else {
+    const int x_78 = asint(x_13[1].x);
+    const float x_79 = float(x_78);
+    x_GLF_color = float4(x_79, x_79, x_79, x_79);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pow-identical-value-sqrt/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-pow-identical-value-sqrt/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..5e53c89
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pow-identical-value-sqrt/0-opt.spvasm.expected.msl
@@ -0,0 +1,75 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct buf2 {
+  /* 0x0000 */ float one;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf2& x_11, constant buf1& x_13, thread float4* const tint_symbol_4) {
+  float f0 = 0.0f;
+  float f1 = 0.0f;
+  float f2 = 0.0f;
+  float f3 = 0.0f;
+  float const x_36 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  f0 = x_36;
+  float const x_38 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  float const x_39 = f0;
+  f1 = (x_38 * pow(x_39, 4.0f));
+  float const x_43 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  float const x_44 = f0;
+  f2 = (x_43 * pow(x_44, 4.0f));
+  float const x_47 = f1;
+  float const x_48 = f2;
+  float const x_51 = x_11.one;
+  float const x_53 = f0;
+  f3 = sqrt((((x_47 - x_48) - x_51) + x_53));
+  float const x_56 = f3;
+  int const x_59 = x_13.x_GLF_uniform_int_values.arr[0].el;
+  if ((int(x_56) == x_59)) {
+    int const x_65 = x_13.x_GLF_uniform_int_values.arr[0].el;
+    int const x_68 = x_13.x_GLF_uniform_int_values.arr[1].el;
+    int const x_71 = x_13.x_GLF_uniform_int_values.arr[1].el;
+    int const x_74 = x_13.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_65), float(x_68), float(x_71), float(x_74));
+  } else {
+    int const x_78 = x_13.x_GLF_uniform_int_values.arr[1].el;
+    float const x_79 = float(x_78);
+    *(tint_symbol_4) = float4(x_79, x_79, x_79, x_79);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf2& x_11 [[buffer(2)]], constant buf1& x_13 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_11, x_13, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pow-identical-value-sqrt/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-pow-identical-value-sqrt/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..4a7d285
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pow-identical-value-sqrt/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,163 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 98
+; Schema: 0
+               OpCapability Shader
+         %42 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "one"
+               OpName %x_11 "x_11"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_13 "x_13"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f0 "f0"
+               OpName %f1 "f1"
+               OpName %f2 "f2"
+               OpName %f3 "f3"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf2 Block
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %x_11 NonWritable
+               OpDecorate %x_11 DescriptorSet 0
+               OpDecorate %x_11 Binding 2
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_13 NonWritable
+               OpDecorate %x_13 DescriptorSet 0
+               OpDecorate %x_13 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+       %buf2 = OpTypeStruct %float
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+       %x_11 = OpVariable %_ptr_Uniform_buf2 Uniform
+        %int = OpTypeInt 32 1
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_13 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %19 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %19
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %19
+       %void = OpTypeVoid
+         %22 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %28 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+    %float_4 = OpConstant %float 4
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %v4float
+         %86 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %22
+         %25 = OpLabel
+         %f0 = OpVariable %_ptr_Function_float Function %28
+         %f1 = OpVariable %_ptr_Function_float Function %28
+         %f2 = OpVariable %_ptr_Function_float Function %28
+         %f3 = OpVariable %_ptr_Function_float Function %28
+         %35 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %36 = OpLoad %float %35
+               OpStore %f0 %36
+         %38 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %39 = OpLoad %float %38
+         %40 = OpLoad %float %f0
+         %41 = OpExtInst %float %42 Pow %40 %float_4
+         %44 = OpFMul %float %39 %41
+               OpStore %f1 %44
+         %45 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %46 = OpLoad %float %45
+         %47 = OpLoad %float %f0
+         %48 = OpExtInst %float %42 Pow %47 %float_4
+         %49 = OpFMul %float %46 %48
+               OpStore %f2 %49
+         %50 = OpLoad %float %f1
+         %51 = OpLoad %float %f2
+         %52 = OpAccessChain %_ptr_Uniform_float %x_11 %uint_0
+         %53 = OpLoad %float %52
+         %54 = OpLoad %float %f0
+         %56 = OpFSub %float %50 %51
+         %57 = OpFSub %float %56 %53
+         %58 = OpFAdd %float %57 %54
+         %55 = OpExtInst %float %42 Sqrt %58
+               OpStore %f3 %55
+         %59 = OpLoad %float %f3
+         %61 = OpAccessChain %_ptr_Uniform_int %x_13 %uint_0 %int_0
+         %62 = OpLoad %int %61
+         %63 = OpConvertFToS %int %59
+         %64 = OpIEqual %bool %63 %62
+               OpSelectionMerge %66 None
+               OpBranchConditional %64 %67 %68
+         %67 = OpLabel
+         %69 = OpAccessChain %_ptr_Uniform_int %x_13 %uint_0 %int_0
+         %70 = OpLoad %int %69
+         %71 = OpAccessChain %_ptr_Uniform_int %x_13 %uint_0 %int_1
+         %72 = OpLoad %int %71
+         %73 = OpAccessChain %_ptr_Uniform_int %x_13 %uint_0 %int_1
+         %74 = OpLoad %int %73
+         %75 = OpAccessChain %_ptr_Uniform_int %x_13 %uint_0 %int_0
+         %76 = OpLoad %int %75
+         %77 = OpConvertSToF %float %70
+         %78 = OpConvertSToF %float %72
+         %79 = OpConvertSToF %float %74
+         %80 = OpConvertSToF %float %76
+         %81 = OpCompositeConstruct %v4float %77 %78 %79 %80
+               OpStore %x_GLF_color %81
+               OpBranch %66
+         %68 = OpLabel
+         %82 = OpAccessChain %_ptr_Uniform_int %x_13 %uint_0 %int_1
+         %83 = OpLoad %int %82
+         %84 = OpConvertSToF %float %83
+         %85 = OpCompositeConstruct %v4float %84 %84 %84 %84
+               OpStore %x_GLF_color %85
+               OpBranch %66
+         %66 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %86
+%tint_symbol = OpFunctionParameter %main_out
+         %90 = OpLabel
+         %91 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %91
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %22
+         %93 = OpLabel
+         %94 = OpFunctionCall %void %main_1
+         %96 = OpLoad %v4float %x_GLF_color
+         %97 = OpCompositeConstruct %main_out %96
+         %95 = OpFunctionCall %void %tint_symbol_2 %97
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pow-identical-value-sqrt/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-pow-identical-value-sqrt/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..39bc587
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pow-identical-value-sqrt/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,71 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[block]]
+struct buf2 {
+  one : f32;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(2)]] var<uniform> x_11 : buf2;
+
+[[group(0), binding(1)]] var<uniform> x_13 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f0 : f32;
+  var f1 : f32;
+  var f2 : f32;
+  var f3 : f32;
+  let x_36 : f32 = x_6.x_GLF_uniform_float_values[0];
+  f0 = x_36;
+  let x_38 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_39 : f32 = f0;
+  f1 = (x_38 * pow(x_39, 4.0));
+  let x_43 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_44 : f32 = f0;
+  f2 = (x_43 * pow(x_44, 4.0));
+  let x_47 : f32 = f1;
+  let x_48 : f32 = f2;
+  let x_51 : f32 = x_11.one;
+  let x_53 : f32 = f0;
+  f3 = sqrt((((x_47 - x_48) - x_51) + x_53));
+  let x_56 : f32 = f3;
+  let x_59 : i32 = x_13.x_GLF_uniform_int_values[0];
+  if ((i32(x_56) == x_59)) {
+    let x_65 : i32 = x_13.x_GLF_uniform_int_values[0];
+    let x_68 : i32 = x_13.x_GLF_uniform_int_values[1];
+    let x_71 : i32 = x_13.x_GLF_uniform_int_values[1];
+    let x_74 : i32 = x_13.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_65), f32(x_68), f32(x_71), f32(x_74));
+  } else {
+    let x_78 : i32 = x_13.x_GLF_uniform_int_values[1];
+    let x_79 : f32 = f32(x_78);
+    x_GLF_color = vec4<f32>(x_79, x_79, x_79, x_79);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pow-identical-value-sqrt/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-pow-identical-value-sqrt/0-opt.wgsl
new file mode 100644
index 0000000..39bc587
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pow-identical-value-sqrt/0-opt.wgsl
@@ -0,0 +1,71 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[block]]
+struct buf2 {
+  one : f32;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(2)]] var<uniform> x_11 : buf2;
+
+[[group(0), binding(1)]] var<uniform> x_13 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f0 : f32;
+  var f1 : f32;
+  var f2 : f32;
+  var f3 : f32;
+  let x_36 : f32 = x_6.x_GLF_uniform_float_values[0];
+  f0 = x_36;
+  let x_38 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_39 : f32 = f0;
+  f1 = (x_38 * pow(x_39, 4.0));
+  let x_43 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_44 : f32 = f0;
+  f2 = (x_43 * pow(x_44, 4.0));
+  let x_47 : f32 = f1;
+  let x_48 : f32 = f2;
+  let x_51 : f32 = x_11.one;
+  let x_53 : f32 = f0;
+  f3 = sqrt((((x_47 - x_48) - x_51) + x_53));
+  let x_56 : f32 = f3;
+  let x_59 : i32 = x_13.x_GLF_uniform_int_values[0];
+  if ((i32(x_56) == x_59)) {
+    let x_65 : i32 = x_13.x_GLF_uniform_int_values[0];
+    let x_68 : i32 = x_13.x_GLF_uniform_int_values[1];
+    let x_71 : i32 = x_13.x_GLF_uniform_int_values[1];
+    let x_74 : i32 = x_13.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_65), f32(x_68), f32(x_71), f32(x_74));
+  } else {
+    let x_78 : i32 = x_13.x_GLF_uniform_int_values[1];
+    let x_79 : f32 = f32(x_78);
+    x_GLF_color = vec4<f32>(x_79, x_79, x_79, x_79);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pow-identical-value-sqrt/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-pow-identical-value-sqrt/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..f0bc792
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pow-identical-value-sqrt/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,59 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+cbuffer cbuffer_x_11 : register(b2, space0) {
+  uint4 x_11[1];
+};
+cbuffer cbuffer_x_13 : register(b1, space0) {
+  uint4 x_13[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float f0 = 0.0f;
+  float f1 = 0.0f;
+  float f2 = 0.0f;
+  float f3 = 0.0f;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_36 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  f0 = x_36;
+  const float x_38 = asfloat(x_6[1].x);
+  f1 = (x_38 * pow(f0, 4.0f));
+  const float x_43 = asfloat(x_6[1].x);
+  f2 = (x_43 * pow(f0, 4.0f));
+  const float x_47 = f1;
+  const float x_48 = f2;
+  const float x_51 = asfloat(x_11[0].x);
+  f3 = sqrt((((x_47 - x_48) - x_51) + f0));
+  const float x_56 = f3;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_59 = asint(x_13[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((int(x_56) == x_59)) {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_65 = asint(x_13[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_68 = asint(x_13[1].x);
+    const int x_71 = asint(x_13[1].x);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_74 = asint(x_13[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    x_GLF_color = float4(float(x_65), float(x_68), float(x_71), float(x_74));
+  } else {
+    const int x_78 = asint(x_13[1].x);
+    const float x_79 = float(x_78);
+    x_GLF_color = float4(x_79, x_79, x_79, x_79);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pow-identical-value-sqrt/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-pow-identical-value-sqrt/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..5e53c89
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pow-identical-value-sqrt/0-opt.wgsl.expected.msl
@@ -0,0 +1,75 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct buf2 {
+  /* 0x0000 */ float one;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf2& x_11, constant buf1& x_13, thread float4* const tint_symbol_4) {
+  float f0 = 0.0f;
+  float f1 = 0.0f;
+  float f2 = 0.0f;
+  float f3 = 0.0f;
+  float const x_36 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  f0 = x_36;
+  float const x_38 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  float const x_39 = f0;
+  f1 = (x_38 * pow(x_39, 4.0f));
+  float const x_43 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  float const x_44 = f0;
+  f2 = (x_43 * pow(x_44, 4.0f));
+  float const x_47 = f1;
+  float const x_48 = f2;
+  float const x_51 = x_11.one;
+  float const x_53 = f0;
+  f3 = sqrt((((x_47 - x_48) - x_51) + x_53));
+  float const x_56 = f3;
+  int const x_59 = x_13.x_GLF_uniform_int_values.arr[0].el;
+  if ((int(x_56) == x_59)) {
+    int const x_65 = x_13.x_GLF_uniform_int_values.arr[0].el;
+    int const x_68 = x_13.x_GLF_uniform_int_values.arr[1].el;
+    int const x_71 = x_13.x_GLF_uniform_int_values.arr[1].el;
+    int const x_74 = x_13.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_65), float(x_68), float(x_71), float(x_74));
+  } else {
+    int const x_78 = x_13.x_GLF_uniform_int_values.arr[1].el;
+    float const x_79 = float(x_78);
+    *(tint_symbol_4) = float4(x_79, x_79, x_79, x_79);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf2& x_11 [[buffer(2)]], constant buf1& x_13 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_11, x_13, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pow-identical-value-sqrt/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-pow-identical-value-sqrt/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..4a7d285
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pow-identical-value-sqrt/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,163 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 98
+; Schema: 0
+               OpCapability Shader
+         %42 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "one"
+               OpName %x_11 "x_11"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_13 "x_13"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f0 "f0"
+               OpName %f1 "f1"
+               OpName %f2 "f2"
+               OpName %f3 "f3"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf2 Block
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %x_11 NonWritable
+               OpDecorate %x_11 DescriptorSet 0
+               OpDecorate %x_11 Binding 2
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_13 NonWritable
+               OpDecorate %x_13 DescriptorSet 0
+               OpDecorate %x_13 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+       %buf2 = OpTypeStruct %float
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+       %x_11 = OpVariable %_ptr_Uniform_buf2 Uniform
+        %int = OpTypeInt 32 1
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_13 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %19 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %19
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %19
+       %void = OpTypeVoid
+         %22 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %28 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+    %float_4 = OpConstant %float 4
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %v4float
+         %86 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %22
+         %25 = OpLabel
+         %f0 = OpVariable %_ptr_Function_float Function %28
+         %f1 = OpVariable %_ptr_Function_float Function %28
+         %f2 = OpVariable %_ptr_Function_float Function %28
+         %f3 = OpVariable %_ptr_Function_float Function %28
+         %35 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %36 = OpLoad %float %35
+               OpStore %f0 %36
+         %38 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %39 = OpLoad %float %38
+         %40 = OpLoad %float %f0
+         %41 = OpExtInst %float %42 Pow %40 %float_4
+         %44 = OpFMul %float %39 %41
+               OpStore %f1 %44
+         %45 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %46 = OpLoad %float %45
+         %47 = OpLoad %float %f0
+         %48 = OpExtInst %float %42 Pow %47 %float_4
+         %49 = OpFMul %float %46 %48
+               OpStore %f2 %49
+         %50 = OpLoad %float %f1
+         %51 = OpLoad %float %f2
+         %52 = OpAccessChain %_ptr_Uniform_float %x_11 %uint_0
+         %53 = OpLoad %float %52
+         %54 = OpLoad %float %f0
+         %56 = OpFSub %float %50 %51
+         %57 = OpFSub %float %56 %53
+         %58 = OpFAdd %float %57 %54
+         %55 = OpExtInst %float %42 Sqrt %58
+               OpStore %f3 %55
+         %59 = OpLoad %float %f3
+         %61 = OpAccessChain %_ptr_Uniform_int %x_13 %uint_0 %int_0
+         %62 = OpLoad %int %61
+         %63 = OpConvertFToS %int %59
+         %64 = OpIEqual %bool %63 %62
+               OpSelectionMerge %66 None
+               OpBranchConditional %64 %67 %68
+         %67 = OpLabel
+         %69 = OpAccessChain %_ptr_Uniform_int %x_13 %uint_0 %int_0
+         %70 = OpLoad %int %69
+         %71 = OpAccessChain %_ptr_Uniform_int %x_13 %uint_0 %int_1
+         %72 = OpLoad %int %71
+         %73 = OpAccessChain %_ptr_Uniform_int %x_13 %uint_0 %int_1
+         %74 = OpLoad %int %73
+         %75 = OpAccessChain %_ptr_Uniform_int %x_13 %uint_0 %int_0
+         %76 = OpLoad %int %75
+         %77 = OpConvertSToF %float %70
+         %78 = OpConvertSToF %float %72
+         %79 = OpConvertSToF %float %74
+         %80 = OpConvertSToF %float %76
+         %81 = OpCompositeConstruct %v4float %77 %78 %79 %80
+               OpStore %x_GLF_color %81
+               OpBranch %66
+         %68 = OpLabel
+         %82 = OpAccessChain %_ptr_Uniform_int %x_13 %uint_0 %int_1
+         %83 = OpLoad %int %82
+         %84 = OpConvertSToF %float %83
+         %85 = OpCompositeConstruct %v4float %84 %84 %84 %84
+               OpStore %x_GLF_color %85
+               OpBranch %66
+         %66 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %86
+%tint_symbol = OpFunctionParameter %main_out
+         %90 = OpLabel
+         %91 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %91
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %22
+         %93 = OpLabel
+         %94 = OpFunctionCall %void %main_1
+         %96 = OpLoad %v4float %x_GLF_color
+         %97 = OpCompositeConstruct %main_out %96
+         %95 = OpFunctionCall %void %tint_symbol_2 %97
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pow-identical-value-sqrt/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-pow-identical-value-sqrt/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..39bc587
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pow-identical-value-sqrt/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,71 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[block]]
+struct buf2 {
+  one : f32;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(2)]] var<uniform> x_11 : buf2;
+
+[[group(0), binding(1)]] var<uniform> x_13 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f0 : f32;
+  var f1 : f32;
+  var f2 : f32;
+  var f3 : f32;
+  let x_36 : f32 = x_6.x_GLF_uniform_float_values[0];
+  f0 = x_36;
+  let x_38 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_39 : f32 = f0;
+  f1 = (x_38 * pow(x_39, 4.0));
+  let x_43 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_44 : f32 = f0;
+  f2 = (x_43 * pow(x_44, 4.0));
+  let x_47 : f32 = f1;
+  let x_48 : f32 = f2;
+  let x_51 : f32 = x_11.one;
+  let x_53 : f32 = f0;
+  f3 = sqrt((((x_47 - x_48) - x_51) + x_53));
+  let x_56 : f32 = f3;
+  let x_59 : i32 = x_13.x_GLF_uniform_int_values[0];
+  if ((i32(x_56) == x_59)) {
+    let x_65 : i32 = x_13.x_GLF_uniform_int_values[0];
+    let x_68 : i32 = x_13.x_GLF_uniform_int_values[1];
+    let x_71 : i32 = x_13.x_GLF_uniform_int_values[1];
+    let x_74 : i32 = x_13.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_65), f32(x_68), f32(x_71), f32(x_74));
+  } else {
+    let x_78 : i32 = x_13.x_GLF_uniform_int_values[1];
+    let x_79 : f32 = f32(x_78);
+    x_GLF_color = vec4<f32>(x_79, x_79, x_79, x_79);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined-result-condition-with-always-true/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined-result-condition-with-always-true/0-opt.spvasm
new file mode 100644
index 0000000..00b0784
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined-result-condition-with-always-true/0-opt.spvasm
@@ -0,0 +1,113 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %f "f"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "zero"
+               OpName %__0 ""
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %__1 ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %buf2 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 2
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__1 DescriptorSet 0
+               OpDecorate %__1 Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+       %bool = OpTypeBool
+       %buf2 = OpTypeStruct %int
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+        %__0 = OpVariable %_ptr_Uniform_buf2 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__1 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %14
+         %31 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function
+         %32 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %33 = OpLoad %float %32
+         %34 = OpFNegate %float %33
+         %35 = OpExtInst %float %1 Sinh %float_1
+         %36 = OpExtInst %float %1 Pow %34 %35
+               OpStore %f %36
+         %37 = OpLoad %float %f
+         %38 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %39 = OpLoad %float %38
+         %40 = OpFOrdEqual %bool %37 %39
+         %41 = OpLogicalNot %bool %40
+               OpSelectionMerge %42 None
+               OpBranchConditional %41 %43 %42
+         %43 = OpLabel
+         %44 = OpAccessChain %_ptr_Uniform_int %__0 %int_0
+         %45 = OpLoad %int %44
+         %46 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_0
+         %47 = OpLoad %int %46
+         %48 = OpIEqual %bool %45 %47
+               OpBranch %42
+         %42 = OpLabel
+         %49 = OpPhi %bool %40 %31 %48 %43
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %52
+         %51 = OpLabel
+         %53 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_1
+         %54 = OpLoad %int %53
+         %55 = OpConvertSToF %float %54
+         %56 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_0
+         %57 = OpLoad %int %56
+         %58 = OpConvertSToF %float %57
+         %59 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_0
+         %60 = OpLoad %int %59
+         %61 = OpConvertSToF %float %60
+         %62 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_1
+         %63 = OpLoad %int %62
+         %64 = OpConvertSToF %float %63
+         %65 = OpCompositeConstruct %v4float %55 %58 %61 %64
+               OpStore %_GLF_color %65
+               OpBranch %50
+         %52 = OpLabel
+         %66 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_0
+         %67 = OpLoad %int %66
+         %68 = OpConvertSToF %float %67
+         %69 = OpCompositeConstruct %v4float %68 %68 %68 %68
+               OpStore %_GLF_color %69
+               OpBranch %50
+         %50 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined-result-condition-with-always-true/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined-result-condition-with-always-true/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..fd122cb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined-result-condition-with-always-true/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,59 @@
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[2];
+};
+cbuffer cbuffer_x_8 : register(b2, space0) {
+  uint4 x_8[1];
+};
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float f = 0.0f;
+  bool x_48 = false;
+  bool x_49_phi = false;
+  const float x_33 = asfloat(x_6[1].x);
+  f = pow(-(x_33), sinh(1.0f));
+  const float x_37 = f;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_39 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const bool x_40 = (x_37 == x_39);
+  x_49_phi = x_40;
+  if (!(x_40)) {
+    const int x_45 = asint(x_8[0].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_47 = asint(x_10[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    x_48 = (x_45 == x_47);
+    x_49_phi = x_48;
+  }
+  if (x_49_phi) {
+    const int x_54 = asint(x_10[1].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_57 = asint(x_10[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_60 = asint(x_10[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const int x_63 = asint(x_10[1].x);
+    x_GLF_color = float4(float(x_54), float(x_57), float(x_60), float(x_63));
+  } else {
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_67 = asint(x_10[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const float x_68 = float(x_67);
+    x_GLF_color = float4(x_68, x_68, x_68, x_68);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined-result-condition-with-always-true/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined-result-condition-with-always-true/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..53c1f7d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined-result-condition-with-always-true/0-opt.spvasm.expected.msl
@@ -0,0 +1,72 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct buf2 {
+  /* 0x0000 */ int zero;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf2& x_8, constant buf0& x_10, thread float4* const tint_symbol_4) {
+  float f = 0.0f;
+  bool x_48 = false;
+  bool x_49_phi = false;
+  float const x_33 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  f = pow(-(x_33), sinh(1.0f));
+  float const x_37 = f;
+  float const x_39 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  bool const x_40 = (x_37 == x_39);
+  x_49_phi = x_40;
+  if (!(x_40)) {
+    int const x_45 = x_8.zero;
+    int const x_47 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    x_48 = (x_45 == x_47);
+    x_49_phi = x_48;
+  }
+  bool const x_49 = x_49_phi;
+  if (x_49) {
+    int const x_54 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_57 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    int const x_60 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    int const x_63 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_54), float(x_57), float(x_60), float(x_63));
+  } else {
+    int const x_67 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    float const x_68 = float(x_67);
+    *(tint_symbol_4) = float4(x_68, x_68, x_68, x_68);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf2& x_8 [[buffer(2)]], constant buf0& x_10 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined-result-condition-with-always-true/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined-result-condition-with-always-true/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..8e68666
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined-result-condition-with-always-true/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,159 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 92
+; Schema: 0
+               OpCapability Shader
+         %40 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "zero"
+               OpName %x_8 "x_8"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %x_48 "x_48"
+               OpName %x_49_phi "x_49_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf2 Block
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 2
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+       %buf2 = OpTypeStruct %int
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+        %x_8 = OpVariable %_ptr_Uniform_buf2 Uniform
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %19 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %19
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %19
+       %void = OpTypeVoid
+         %22 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %28 = OpConstantNull %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %32 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+         %80 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %22
+         %25 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %28
+       %x_48 = OpVariable %_ptr_Function_bool Function %32
+   %x_49_phi = OpVariable %_ptr_Function_bool Function %32
+         %37 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %38 = OpLoad %float %37
+         %41 = OpFNegate %float %38
+         %42 = OpExtInst %float %40 Sinh %float_1
+         %39 = OpExtInst %float %40 Pow %41 %42
+               OpStore %f %39
+         %44 = OpLoad %float %f
+         %46 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %47 = OpLoad %float %46
+         %48 = OpFOrdEqual %bool %44 %47
+               OpStore %x_49_phi %48
+         %49 = OpLogicalNot %bool %48
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %50
+         %51 = OpLabel
+         %53 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0
+         %54 = OpLoad %int %53
+         %55 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %56 = OpLoad %int %55
+         %57 = OpIEqual %bool %54 %56
+               OpStore %x_48 %57
+         %58 = OpLoad %bool %x_48
+               OpStore %x_49_phi %58
+               OpBranch %50
+         %50 = OpLabel
+         %59 = OpLoad %bool %x_49_phi
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %62
+         %61 = OpLabel
+         %63 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %64 = OpLoad %int %63
+         %65 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %66 = OpLoad %int %65
+         %67 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %68 = OpLoad %int %67
+         %69 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %70 = OpLoad %int %69
+         %71 = OpConvertSToF %float %64
+         %72 = OpConvertSToF %float %66
+         %73 = OpConvertSToF %float %68
+         %74 = OpConvertSToF %float %70
+         %75 = OpCompositeConstruct %v4float %71 %72 %73 %74
+               OpStore %x_GLF_color %75
+               OpBranch %60
+         %62 = OpLabel
+         %76 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %77 = OpLoad %int %76
+         %78 = OpConvertSToF %float %77
+         %79 = OpCompositeConstruct %v4float %78 %78 %78 %78
+               OpStore %x_GLF_color %79
+               OpBranch %60
+         %60 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %80
+%tint_symbol = OpFunctionParameter %main_out
+         %84 = OpLabel
+         %85 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %85
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %22
+         %87 = OpLabel
+         %88 = OpFunctionCall %void %main_1
+         %90 = OpLoad %v4float %x_GLF_color
+         %91 = OpCompositeConstruct %main_out %90
+         %89 = OpFunctionCall %void %tint_symbol_2 %91
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined-result-condition-with-always-true/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined-result-condition-with-always-true/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..b378e4c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined-result-condition-with-always-true/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,68 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[block]]
+struct buf2 {
+  zero : i32;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(2)]] var<uniform> x_8 : buf2;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  var x_48 : bool;
+  var x_49_phi : bool;
+  let x_33 : f32 = x_6.x_GLF_uniform_float_values[1];
+  f = pow(-(x_33), sinh(1.0));
+  let x_37 : f32 = f;
+  let x_39 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_40 : bool = (x_37 == x_39);
+  x_49_phi = x_40;
+  if (!(x_40)) {
+    let x_45 : i32 = x_8.zero;
+    let x_47 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_48 = (x_45 == x_47);
+    x_49_phi = x_48;
+  }
+  let x_49 : bool = x_49_phi;
+  if (x_49) {
+    let x_54 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_57 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_60 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_63 : i32 = x_10.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_54), f32(x_57), f32(x_60), f32(x_63));
+  } else {
+    let x_67 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_68 : f32 = f32(x_67);
+    x_GLF_color = vec4<f32>(x_68, x_68, x_68, x_68);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined-result-condition-with-always-true/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined-result-condition-with-always-true/0-opt.wgsl
new file mode 100644
index 0000000..b378e4c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined-result-condition-with-always-true/0-opt.wgsl
@@ -0,0 +1,68 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[block]]
+struct buf2 {
+  zero : i32;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(2)]] var<uniform> x_8 : buf2;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  var x_48 : bool;
+  var x_49_phi : bool;
+  let x_33 : f32 = x_6.x_GLF_uniform_float_values[1];
+  f = pow(-(x_33), sinh(1.0));
+  let x_37 : f32 = f;
+  let x_39 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_40 : bool = (x_37 == x_39);
+  x_49_phi = x_40;
+  if (!(x_40)) {
+    let x_45 : i32 = x_8.zero;
+    let x_47 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_48 = (x_45 == x_47);
+    x_49_phi = x_48;
+  }
+  let x_49 : bool = x_49_phi;
+  if (x_49) {
+    let x_54 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_57 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_60 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_63 : i32 = x_10.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_54), f32(x_57), f32(x_60), f32(x_63));
+  } else {
+    let x_67 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_68 : f32 = f32(x_67);
+    x_GLF_color = vec4<f32>(x_68, x_68, x_68, x_68);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined-result-condition-with-always-true/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined-result-condition-with-always-true/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..fd122cb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined-result-condition-with-always-true/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,59 @@
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[2];
+};
+cbuffer cbuffer_x_8 : register(b2, space0) {
+  uint4 x_8[1];
+};
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float f = 0.0f;
+  bool x_48 = false;
+  bool x_49_phi = false;
+  const float x_33 = asfloat(x_6[1].x);
+  f = pow(-(x_33), sinh(1.0f));
+  const float x_37 = f;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_39 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const bool x_40 = (x_37 == x_39);
+  x_49_phi = x_40;
+  if (!(x_40)) {
+    const int x_45 = asint(x_8[0].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_47 = asint(x_10[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    x_48 = (x_45 == x_47);
+    x_49_phi = x_48;
+  }
+  if (x_49_phi) {
+    const int x_54 = asint(x_10[1].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_57 = asint(x_10[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_60 = asint(x_10[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const int x_63 = asint(x_10[1].x);
+    x_GLF_color = float4(float(x_54), float(x_57), float(x_60), float(x_63));
+  } else {
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_67 = asint(x_10[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const float x_68 = float(x_67);
+    x_GLF_color = float4(x_68, x_68, x_68, x_68);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined-result-condition-with-always-true/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined-result-condition-with-always-true/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..53c1f7d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined-result-condition-with-always-true/0-opt.wgsl.expected.msl
@@ -0,0 +1,72 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct buf2 {
+  /* 0x0000 */ int zero;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf2& x_8, constant buf0& x_10, thread float4* const tint_symbol_4) {
+  float f = 0.0f;
+  bool x_48 = false;
+  bool x_49_phi = false;
+  float const x_33 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  f = pow(-(x_33), sinh(1.0f));
+  float const x_37 = f;
+  float const x_39 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  bool const x_40 = (x_37 == x_39);
+  x_49_phi = x_40;
+  if (!(x_40)) {
+    int const x_45 = x_8.zero;
+    int const x_47 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    x_48 = (x_45 == x_47);
+    x_49_phi = x_48;
+  }
+  bool const x_49 = x_49_phi;
+  if (x_49) {
+    int const x_54 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_57 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    int const x_60 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    int const x_63 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_54), float(x_57), float(x_60), float(x_63));
+  } else {
+    int const x_67 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    float const x_68 = float(x_67);
+    *(tint_symbol_4) = float4(x_68, x_68, x_68, x_68);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf2& x_8 [[buffer(2)]], constant buf0& x_10 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined-result-condition-with-always-true/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined-result-condition-with-always-true/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..8e68666
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined-result-condition-with-always-true/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,159 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 92
+; Schema: 0
+               OpCapability Shader
+         %40 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "zero"
+               OpName %x_8 "x_8"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %x_48 "x_48"
+               OpName %x_49_phi "x_49_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf2 Block
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 2
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+       %buf2 = OpTypeStruct %int
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+        %x_8 = OpVariable %_ptr_Uniform_buf2 Uniform
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %19 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %19
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %19
+       %void = OpTypeVoid
+         %22 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %28 = OpConstantNull %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %32 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+         %80 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %22
+         %25 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %28
+       %x_48 = OpVariable %_ptr_Function_bool Function %32
+   %x_49_phi = OpVariable %_ptr_Function_bool Function %32
+         %37 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %38 = OpLoad %float %37
+         %41 = OpFNegate %float %38
+         %42 = OpExtInst %float %40 Sinh %float_1
+         %39 = OpExtInst %float %40 Pow %41 %42
+               OpStore %f %39
+         %44 = OpLoad %float %f
+         %46 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %47 = OpLoad %float %46
+         %48 = OpFOrdEqual %bool %44 %47
+               OpStore %x_49_phi %48
+         %49 = OpLogicalNot %bool %48
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %50
+         %51 = OpLabel
+         %53 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0
+         %54 = OpLoad %int %53
+         %55 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %56 = OpLoad %int %55
+         %57 = OpIEqual %bool %54 %56
+               OpStore %x_48 %57
+         %58 = OpLoad %bool %x_48
+               OpStore %x_49_phi %58
+               OpBranch %50
+         %50 = OpLabel
+         %59 = OpLoad %bool %x_49_phi
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %62
+         %61 = OpLabel
+         %63 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %64 = OpLoad %int %63
+         %65 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %66 = OpLoad %int %65
+         %67 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %68 = OpLoad %int %67
+         %69 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %70 = OpLoad %int %69
+         %71 = OpConvertSToF %float %64
+         %72 = OpConvertSToF %float %66
+         %73 = OpConvertSToF %float %68
+         %74 = OpConvertSToF %float %70
+         %75 = OpCompositeConstruct %v4float %71 %72 %73 %74
+               OpStore %x_GLF_color %75
+               OpBranch %60
+         %62 = OpLabel
+         %76 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %77 = OpLoad %int %76
+         %78 = OpConvertSToF %float %77
+         %79 = OpCompositeConstruct %v4float %78 %78 %78 %78
+               OpStore %x_GLF_color %79
+               OpBranch %60
+         %60 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %80
+%tint_symbol = OpFunctionParameter %main_out
+         %84 = OpLabel
+         %85 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %85
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %22
+         %87 = OpLabel
+         %88 = OpFunctionCall %void %main_1
+         %90 = OpLoad %v4float %x_GLF_color
+         %91 = OpCompositeConstruct %main_out %90
+         %89 = OpFunctionCall %void %tint_symbol_2 %91
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined-result-condition-with-always-true/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined-result-condition-with-always-true/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..b378e4c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined-result-condition-with-always-true/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,68 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[block]]
+struct buf2 {
+  zero : i32;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(2)]] var<uniform> x_8 : buf2;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  var x_48 : bool;
+  var x_49_phi : bool;
+  let x_33 : f32 = x_6.x_GLF_uniform_float_values[1];
+  f = pow(-(x_33), sinh(1.0));
+  let x_37 : f32 = f;
+  let x_39 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_40 : bool = (x_37 == x_39);
+  x_49_phi = x_40;
+  if (!(x_40)) {
+    let x_45 : i32 = x_8.zero;
+    let x_47 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_48 = (x_45 == x_47);
+    x_49_phi = x_48;
+  }
+  let x_49 : bool = x_49_phi;
+  if (x_49) {
+    let x_54 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_57 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_60 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_63 : i32 = x_10.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_54), f32(x_57), f32(x_60), f32(x_63));
+  } else {
+    let x_67 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_68 : f32 = f32(x_67);
+    x_GLF_color = vec4<f32>(x_68, x_68, x_68, x_68);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined/0-opt.spvasm
new file mode 100644
index 0000000..2726c75
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined/0-opt.spvasm
@@ -0,0 +1,82 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+   %float_n1 = OpConstant %float -1
+%float_1_70000005 = OpConstant %float 1.70000005
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+       %main = OpFunction %void None %11
+         %26 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function
+          %b = OpVariable %_ptr_Function_float Function
+          %c = OpVariable %_ptr_Function_float Function
+               OpStore %a %float_n1
+               OpStore %b %float_1_70000005
+         %27 = OpLoad %float %a
+         %28 = OpLoad %float %b
+         %29 = OpExtInst %float %1 Pow %27 %28
+               OpStore %c %29
+         %30 = OpLoad %float %c
+         %31 = OpCompositeConstruct %v4float %30 %30 %30 %30
+               OpStore %_GLF_color %31
+         %32 = OpLoad %float %a
+         %33 = OpFOrdEqual %bool %32 %float_n1
+         %34 = OpLoad %float %b
+         %35 = OpFOrdEqual %bool %34 %float_1_70000005
+         %36 = OpLogicalAnd %bool %33 %35
+               OpSelectionMerge %37 None
+               OpBranchConditional %36 %38 %39
+         %38 = OpLabel
+         %40 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %41 = OpLoad %float %40
+         %42 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %43 = OpLoad %float %42
+         %44 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %45 = OpLoad %float %44
+         %46 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %47 = OpLoad %float %46
+         %48 = OpCompositeConstruct %v4float %41 %43 %45 %47
+               OpStore %_GLF_color %48
+               OpBranch %37
+         %39 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %50 = OpLoad %float %49
+         %51 = OpCompositeConstruct %v4float %50 %50 %50 %50
+               OpStore %_GLF_color %51
+               OpBranch %37
+         %37 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..132221e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,47 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[2];
+};
+
+void main_1() {
+  float a = 0.0f;
+  float b = 0.0f;
+  float c = 0.0f;
+  a = -1.0f;
+  b = 1.700000048f;
+  c = pow(a, b);
+  const float x_30 = c;
+  x_GLF_color = float4(x_30, x_30, x_30, x_30);
+  bool tint_tmp = (a == -1.0f);
+  if (tint_tmp) {
+    tint_tmp = (b == 1.700000048f);
+  }
+  if ((tint_tmp)) {
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const float x_41 = asfloat(x_8[scalar_offset / 4][scalar_offset % 4]);
+    const float x_43 = asfloat(x_8[1].x);
+    const float x_45 = asfloat(x_8[1].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const float x_47 = asfloat(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    x_GLF_color = float4(x_41, x_43, x_45, x_47);
+  } else {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const float x_50 = asfloat(x_8[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    x_GLF_color = float4(x_50, x_50, x_50, x_50);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..8000e84
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined/0-opt.spvasm.expected.msl
@@ -0,0 +1,54 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_4) {
+  float a = 0.0f;
+  float b = 0.0f;
+  float c = 0.0f;
+  a = -1.0f;
+  b = 1.700000048f;
+  float const x_27 = a;
+  float const x_28 = b;
+  c = pow(x_27, x_28);
+  float const x_30 = c;
+  *(tint_symbol_4) = float4(x_30, x_30, x_30, x_30);
+  float const x_32 = a;
+  float const x_34 = b;
+  if (((x_32 == -1.0f) && (x_34 == 1.700000048f))) {
+    float const x_41 = x_8.x_GLF_uniform_float_values.arr[0].el;
+    float const x_43 = x_8.x_GLF_uniform_float_values.arr[1].el;
+    float const x_45 = x_8.x_GLF_uniform_float_values.arr[1].el;
+    float const x_47 = x_8.x_GLF_uniform_float_values.arr[0].el;
+    *(tint_symbol_4) = float4(x_41, x_43, x_45, x_47);
+  } else {
+    float const x_50 = x_8.x_GLF_uniform_float_values.arr[0].el;
+    *(tint_symbol_4) = float4(x_50, x_50, x_50, x_50);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..60826bb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,121 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 71
+; Schema: 0
+               OpCapability Shader
+         %28 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %20 = OpConstantNull %float
+   %float_n1 = OpConstant %float -1
+%float_1_70000005 = OpConstant %float 1.70000005
+       %bool = OpTypeBool
+     %uint_0 = OpConstant %uint 0
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %59 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function %20
+          %b = OpVariable %_ptr_Function_float Function %20
+          %c = OpVariable %_ptr_Function_float Function %20
+               OpStore %a %float_n1
+               OpStore %b %float_1_70000005
+         %25 = OpLoad %float %a
+         %26 = OpLoad %float %b
+         %27 = OpExtInst %float %28 Pow %25 %26
+               OpStore %c %27
+         %29 = OpLoad %float %c
+         %30 = OpCompositeConstruct %v4float %29 %29 %29 %29
+               OpStore %x_GLF_color %30
+         %31 = OpLoad %float %a
+         %32 = OpLoad %float %b
+         %33 = OpFOrdEqual %bool %31 %float_n1
+               OpSelectionMerge %35 None
+               OpBranchConditional %33 %36 %35
+         %36 = OpLabel
+         %37 = OpFOrdEqual %bool %32 %float_1_70000005
+               OpBranch %35
+         %35 = OpLabel
+         %38 = OpPhi %bool %33 %17 %37 %36
+               OpSelectionMerge %39 None
+               OpBranchConditional %38 %40 %41
+         %40 = OpLabel
+         %46 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %47 = OpLoad %float %46
+         %49 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+         %50 = OpLoad %float %49
+         %51 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+         %52 = OpLoad %float %51
+         %53 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %54 = OpLoad %float %53
+         %55 = OpCompositeConstruct %v4float %47 %50 %52 %54
+               OpStore %x_GLF_color %55
+               OpBranch %39
+         %41 = OpLabel
+         %56 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %57 = OpLoad %float %56
+         %58 = OpCompositeConstruct %v4float %57 %57 %57 %57
+               OpStore %x_GLF_color %58
+               OpBranch %39
+         %39 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %59
+%tint_symbol = OpFunctionParameter %main_out
+         %63 = OpLabel
+         %64 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %64
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %66 = OpLabel
+         %67 = OpFunctionCall %void %main_1
+         %69 = OpLoad %v4float %x_GLF_color
+         %70 = OpCompositeConstruct %main_out %69
+         %68 = OpFunctionCall %void %tint_symbol_2 %70
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..4be05e5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,47 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+fn main_1() {
+  var a : f32;
+  var b : f32;
+  var c : f32;
+  a = -1.0;
+  b = 1.700000048;
+  let x_27 : f32 = a;
+  let x_28 : f32 = b;
+  c = pow(x_27, x_28);
+  let x_30 : f32 = c;
+  x_GLF_color = vec4<f32>(x_30, x_30, x_30, x_30);
+  let x_32 : f32 = a;
+  let x_34 : f32 = b;
+  if (((x_32 == -1.0) && (x_34 == 1.700000048))) {
+    let x_41 : f32 = x_8.x_GLF_uniform_float_values[0];
+    let x_43 : f32 = x_8.x_GLF_uniform_float_values[1];
+    let x_45 : f32 = x_8.x_GLF_uniform_float_values[1];
+    let x_47 : f32 = x_8.x_GLF_uniform_float_values[0];
+    x_GLF_color = vec4<f32>(x_41, x_43, x_45, x_47);
+  } else {
+    let x_50 : f32 = x_8.x_GLF_uniform_float_values[0];
+    x_GLF_color = vec4<f32>(x_50, x_50, x_50, x_50);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined/0-opt.wgsl
new file mode 100644
index 0000000..4be05e5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined/0-opt.wgsl
@@ -0,0 +1,47 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+fn main_1() {
+  var a : f32;
+  var b : f32;
+  var c : f32;
+  a = -1.0;
+  b = 1.700000048;
+  let x_27 : f32 = a;
+  let x_28 : f32 = b;
+  c = pow(x_27, x_28);
+  let x_30 : f32 = c;
+  x_GLF_color = vec4<f32>(x_30, x_30, x_30, x_30);
+  let x_32 : f32 = a;
+  let x_34 : f32 = b;
+  if (((x_32 == -1.0) && (x_34 == 1.700000048))) {
+    let x_41 : f32 = x_8.x_GLF_uniform_float_values[0];
+    let x_43 : f32 = x_8.x_GLF_uniform_float_values[1];
+    let x_45 : f32 = x_8.x_GLF_uniform_float_values[1];
+    let x_47 : f32 = x_8.x_GLF_uniform_float_values[0];
+    x_GLF_color = vec4<f32>(x_41, x_43, x_45, x_47);
+  } else {
+    let x_50 : f32 = x_8.x_GLF_uniform_float_values[0];
+    x_GLF_color = vec4<f32>(x_50, x_50, x_50, x_50);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..132221e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,47 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[2];
+};
+
+void main_1() {
+  float a = 0.0f;
+  float b = 0.0f;
+  float c = 0.0f;
+  a = -1.0f;
+  b = 1.700000048f;
+  c = pow(a, b);
+  const float x_30 = c;
+  x_GLF_color = float4(x_30, x_30, x_30, x_30);
+  bool tint_tmp = (a == -1.0f);
+  if (tint_tmp) {
+    tint_tmp = (b == 1.700000048f);
+  }
+  if ((tint_tmp)) {
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const float x_41 = asfloat(x_8[scalar_offset / 4][scalar_offset % 4]);
+    const float x_43 = asfloat(x_8[1].x);
+    const float x_45 = asfloat(x_8[1].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const float x_47 = asfloat(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    x_GLF_color = float4(x_41, x_43, x_45, x_47);
+  } else {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const float x_50 = asfloat(x_8[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    x_GLF_color = float4(x_50, x_50, x_50, x_50);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..8000e84
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined/0-opt.wgsl.expected.msl
@@ -0,0 +1,54 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_4) {
+  float a = 0.0f;
+  float b = 0.0f;
+  float c = 0.0f;
+  a = -1.0f;
+  b = 1.700000048f;
+  float const x_27 = a;
+  float const x_28 = b;
+  c = pow(x_27, x_28);
+  float const x_30 = c;
+  *(tint_symbol_4) = float4(x_30, x_30, x_30, x_30);
+  float const x_32 = a;
+  float const x_34 = b;
+  if (((x_32 == -1.0f) && (x_34 == 1.700000048f))) {
+    float const x_41 = x_8.x_GLF_uniform_float_values.arr[0].el;
+    float const x_43 = x_8.x_GLF_uniform_float_values.arr[1].el;
+    float const x_45 = x_8.x_GLF_uniform_float_values.arr[1].el;
+    float const x_47 = x_8.x_GLF_uniform_float_values.arr[0].el;
+    *(tint_symbol_4) = float4(x_41, x_43, x_45, x_47);
+  } else {
+    float const x_50 = x_8.x_GLF_uniform_float_values.arr[0].el;
+    *(tint_symbol_4) = float4(x_50, x_50, x_50, x_50);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..60826bb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,121 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 71
+; Schema: 0
+               OpCapability Shader
+         %28 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %20 = OpConstantNull %float
+   %float_n1 = OpConstant %float -1
+%float_1_70000005 = OpConstant %float 1.70000005
+       %bool = OpTypeBool
+     %uint_0 = OpConstant %uint 0
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %59 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function %20
+          %b = OpVariable %_ptr_Function_float Function %20
+          %c = OpVariable %_ptr_Function_float Function %20
+               OpStore %a %float_n1
+               OpStore %b %float_1_70000005
+         %25 = OpLoad %float %a
+         %26 = OpLoad %float %b
+         %27 = OpExtInst %float %28 Pow %25 %26
+               OpStore %c %27
+         %29 = OpLoad %float %c
+         %30 = OpCompositeConstruct %v4float %29 %29 %29 %29
+               OpStore %x_GLF_color %30
+         %31 = OpLoad %float %a
+         %32 = OpLoad %float %b
+         %33 = OpFOrdEqual %bool %31 %float_n1
+               OpSelectionMerge %35 None
+               OpBranchConditional %33 %36 %35
+         %36 = OpLabel
+         %37 = OpFOrdEqual %bool %32 %float_1_70000005
+               OpBranch %35
+         %35 = OpLabel
+         %38 = OpPhi %bool %33 %17 %37 %36
+               OpSelectionMerge %39 None
+               OpBranchConditional %38 %40 %41
+         %40 = OpLabel
+         %46 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %47 = OpLoad %float %46
+         %49 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+         %50 = OpLoad %float %49
+         %51 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+         %52 = OpLoad %float %51
+         %53 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %54 = OpLoad %float %53
+         %55 = OpCompositeConstruct %v4float %47 %50 %52 %54
+               OpStore %x_GLF_color %55
+               OpBranch %39
+         %41 = OpLabel
+         %56 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %57 = OpLoad %float %56
+         %58 = OpCompositeConstruct %v4float %57 %57 %57 %57
+               OpStore %x_GLF_color %58
+               OpBranch %39
+         %39 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %59
+%tint_symbol = OpFunctionParameter %main_out
+         %63 = OpLabel
+         %64 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %64
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %66 = OpLabel
+         %67 = OpFunctionCall %void %main_1
+         %69 = OpLoad %v4float %x_GLF_color
+         %70 = OpCompositeConstruct %main_out %69
+         %68 = OpFunctionCall %void %tint_symbol_2 %70
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..4be05e5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,47 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+fn main_1() {
+  var a : f32;
+  var b : f32;
+  var c : f32;
+  a = -1.0;
+  b = 1.700000048;
+  let x_27 : f32 = a;
+  let x_28 : f32 = b;
+  c = pow(x_27, x_28);
+  let x_30 : f32 = c;
+  x_GLF_color = vec4<f32>(x_30, x_30, x_30, x_30);
+  let x_32 : f32 = a;
+  let x_34 : f32 = b;
+  if (((x_32 == -1.0) && (x_34 == 1.700000048))) {
+    let x_41 : f32 = x_8.x_GLF_uniform_float_values[0];
+    let x_43 : f32 = x_8.x_GLF_uniform_float_values[1];
+    let x_45 : f32 = x_8.x_GLF_uniform_float_values[1];
+    let x_47 : f32 = x_8.x_GLF_uniform_float_values[0];
+    x_GLF_color = vec4<f32>(x_41, x_43, x_45, x_47);
+  } else {
+    let x_50 : f32 = x_8.x_GLF_uniform_float_values[0];
+    x_GLF_color = vec4<f32>(x_50, x_50, x_50, x_50);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-rcp-negative-int/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-rcp-negative-int/0-opt.spvasm
new file mode 100644
index 0000000..1638f7f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-rcp-negative-int/0-opt.spvasm
@@ -0,0 +1,76 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+  %int_n7563 = OpConstant %int -7563
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %9
+         %23 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+               OpStore %a %int_n7563
+         %24 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %25 = OpLoad %int %24
+         %26 = OpLoad %int %a
+         %27 = OpSDiv %int %25 %26
+         %28 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %29 = OpLoad %int %28
+         %30 = OpIEqual %bool %27 %29
+               OpSelectionMerge %31 None
+               OpBranchConditional %30 %32 %33
+         %32 = OpLabel
+         %34 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %35 = OpLoad %int %34
+         %36 = OpConvertSToF %float %35
+         %37 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %38 = OpLoad %int %37
+         %39 = OpConvertSToF %float %38
+         %40 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %41 = OpLoad %int %40
+         %42 = OpConvertSToF %float %41
+         %43 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %44 = OpLoad %int %43
+         %45 = OpConvertSToF %float %44
+         %46 = OpCompositeConstruct %v4float %36 %39 %42 %45
+               OpStore %_GLF_color %46
+               OpBranch %31
+         %33 = OpLabel
+         %47 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %48 = OpLoad %int %47
+         %49 = OpConvertSToF %float %48
+         %50 = OpCompositeConstruct %v4float %49 %49 %49 %49
+               OpStore %_GLF_color %50
+               OpBranch %31
+         %31 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-rcp-negative-int/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-rcp-negative-int/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..89c814d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-rcp-negative-int/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,42 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  a = -7563;
+  const int x_25 = asint(x_6[1].x);
+  const int x_26 = a;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_29 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  if (((x_25 / x_26) == x_29)) {
+    const int x_35 = asint(x_6[1].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_38 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_41 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_44 = asint(x_6[1].x);
+    x_GLF_color = float4(float(x_35), float(x_38), float(x_41), float(x_44));
+  } else {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_48 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const float x_49 = float(x_48);
+    x_GLF_color = float4(x_49, x_49, x_49, x_49);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-rcp-negative-int/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-rcp-negative-int/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..d98099c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-rcp-negative-int/0-opt.spvasm.expected.msl
@@ -0,0 +1,48 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int a = 0;
+  a = -7563;
+  int const x_25 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_26 = a;
+  int const x_29 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  if (((x_25 / x_26) == x_29)) {
+    int const x_35 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_38 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_41 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_44 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_35), float(x_38), float(x_41), float(x_44));
+  } else {
+    int const x_48 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    float const x_49 = float(x_48);
+    *(tint_symbol_4) = float4(x_49, x_49, x_49, x_49);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-rcp-negative-int/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-rcp-negative-int/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..b52f8c5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-rcp-negative-int/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,109 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 67
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+  %int_n7563 = OpConstant %int -7563
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %v4float
+         %55 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+               OpStore %a %int_n7563
+         %26 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %27 = OpLoad %int %26
+         %28 = OpLoad %int %a
+         %30 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %31 = OpLoad %int %30
+         %32 = OpSDiv %int %27 %28
+         %33 = OpIEqual %bool %32 %31
+               OpSelectionMerge %35 None
+               OpBranchConditional %33 %36 %37
+         %36 = OpLabel
+         %38 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %39 = OpLoad %int %38
+         %40 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %41 = OpLoad %int %40
+         %42 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %43 = OpLoad %int %42
+         %44 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %45 = OpLoad %int %44
+         %46 = OpConvertSToF %float %39
+         %47 = OpConvertSToF %float %41
+         %48 = OpConvertSToF %float %43
+         %49 = OpConvertSToF %float %45
+         %50 = OpCompositeConstruct %v4float %46 %47 %48 %49
+               OpStore %x_GLF_color %50
+               OpBranch %35
+         %37 = OpLabel
+         %51 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %52 = OpLoad %int %51
+         %53 = OpConvertSToF %float %52
+         %54 = OpCompositeConstruct %v4float %53 %53 %53 %53
+               OpStore %x_GLF_color %54
+               OpBranch %35
+         %35 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %55
+%tint_symbol = OpFunctionParameter %main_out
+         %59 = OpLabel
+         %60 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %60
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %62 = OpLabel
+         %63 = OpFunctionCall %void %main_1
+         %65 = OpLoad %v4float %x_GLF_color
+         %66 = OpCompositeConstruct %main_out %65
+         %64 = OpFunctionCall %void %tint_symbol_2 %66
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-rcp-negative-int/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-rcp-negative-int/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..39a800e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-rcp-negative-int/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,41 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  a = -7563;
+  let x_25 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_26 : i32 = a;
+  let x_29 : i32 = x_6.x_GLF_uniform_int_values[0];
+  if (((x_25 / x_26) == x_29)) {
+    let x_35 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_38 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_41 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_44 : i32 = x_6.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_35), f32(x_38), f32(x_41), f32(x_44));
+  } else {
+    let x_48 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_49 : f32 = f32(x_48);
+    x_GLF_color = vec4<f32>(x_49, x_49, x_49, x_49);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-rcp-negative-int/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-rcp-negative-int/0-opt.wgsl
new file mode 100644
index 0000000..39a800e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-rcp-negative-int/0-opt.wgsl
@@ -0,0 +1,41 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  a = -7563;
+  let x_25 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_26 : i32 = a;
+  let x_29 : i32 = x_6.x_GLF_uniform_int_values[0];
+  if (((x_25 / x_26) == x_29)) {
+    let x_35 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_38 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_41 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_44 : i32 = x_6.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_35), f32(x_38), f32(x_41), f32(x_44));
+  } else {
+    let x_48 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_49 : f32 = f32(x_48);
+    x_GLF_color = vec4<f32>(x_49, x_49, x_49, x_49);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-rcp-negative-int/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-rcp-negative-int/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..89c814d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-rcp-negative-int/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,42 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  a = -7563;
+  const int x_25 = asint(x_6[1].x);
+  const int x_26 = a;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_29 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  if (((x_25 / x_26) == x_29)) {
+    const int x_35 = asint(x_6[1].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_38 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_41 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_44 = asint(x_6[1].x);
+    x_GLF_color = float4(float(x_35), float(x_38), float(x_41), float(x_44));
+  } else {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_48 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const float x_49 = float(x_48);
+    x_GLF_color = float4(x_49, x_49, x_49, x_49);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-rcp-negative-int/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-rcp-negative-int/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..d98099c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-rcp-negative-int/0-opt.wgsl.expected.msl
@@ -0,0 +1,48 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int a = 0;
+  a = -7563;
+  int const x_25 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_26 = a;
+  int const x_29 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  if (((x_25 / x_26) == x_29)) {
+    int const x_35 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_38 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_41 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_44 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_35), float(x_38), float(x_41), float(x_44));
+  } else {
+    int const x_48 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    float const x_49 = float(x_48);
+    *(tint_symbol_4) = float4(x_49, x_49, x_49, x_49);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-rcp-negative-int/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-rcp-negative-int/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..b52f8c5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-rcp-negative-int/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,109 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 67
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+  %int_n7563 = OpConstant %int -7563
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %v4float
+         %55 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+               OpStore %a %int_n7563
+         %26 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %27 = OpLoad %int %26
+         %28 = OpLoad %int %a
+         %30 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %31 = OpLoad %int %30
+         %32 = OpSDiv %int %27 %28
+         %33 = OpIEqual %bool %32 %31
+               OpSelectionMerge %35 None
+               OpBranchConditional %33 %36 %37
+         %36 = OpLabel
+         %38 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %39 = OpLoad %int %38
+         %40 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %41 = OpLoad %int %40
+         %42 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %43 = OpLoad %int %42
+         %44 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %45 = OpLoad %int %44
+         %46 = OpConvertSToF %float %39
+         %47 = OpConvertSToF %float %41
+         %48 = OpConvertSToF %float %43
+         %49 = OpConvertSToF %float %45
+         %50 = OpCompositeConstruct %v4float %46 %47 %48 %49
+               OpStore %x_GLF_color %50
+               OpBranch %35
+         %37 = OpLabel
+         %51 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %52 = OpLoad %int %51
+         %53 = OpConvertSToF %float %52
+         %54 = OpCompositeConstruct %v4float %53 %53 %53 %53
+               OpStore %x_GLF_color %54
+               OpBranch %35
+         %35 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %55
+%tint_symbol = OpFunctionParameter %main_out
+         %59 = OpLabel
+         %60 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %60
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %62 = OpLabel
+         %63 = OpFunctionCall %void %main_1
+         %65 = OpLoad %v4float %x_GLF_color
+         %66 = OpCompositeConstruct %main_out %65
+         %64 = OpFunctionCall %void %tint_symbol_2 %66
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-rcp-negative-int/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-rcp-negative-int/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..39a800e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-rcp-negative-int/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,41 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  a = -7563;
+  let x_25 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_26 : i32 = a;
+  let x_29 : i32 = x_6.x_GLF_uniform_int_values[0];
+  if (((x_25 / x_26) == x_29)) {
+    let x_35 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_38 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_41 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_44 : i32 = x_6.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_35), f32(x_38), f32(x_41), f32(x_44));
+  } else {
+    let x_48 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_49 : f32 = f32(x_48);
+    x_GLF_color = vec4<f32>(x_49, x_49, x_49, x_49);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reciprocal-var-minus-one/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-reciprocal-var-minus-one/0-opt.spvasm
new file mode 100644
index 0000000..77a1f11
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reciprocal-var-minus-one/0-opt.spvasm
@@ -0,0 +1,76 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+     %int_n1 = OpConstant %int -1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %9
+         %23 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+               OpStore %a %int_n1
+         %24 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %25 = OpLoad %int %24
+         %26 = OpLoad %int %a
+         %27 = OpSDiv %int %25 %26
+         %28 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %29 = OpLoad %int %28
+         %30 = OpSLessThan %bool %27 %29
+               OpSelectionMerge %31 None
+               OpBranchConditional %30 %32 %33
+         %32 = OpLabel
+         %34 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %35 = OpLoad %int %34
+         %36 = OpConvertSToF %float %35
+         %37 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %38 = OpLoad %int %37
+         %39 = OpConvertSToF %float %38
+         %40 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %41 = OpLoad %int %40
+         %42 = OpConvertSToF %float %41
+         %43 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %44 = OpLoad %int %43
+         %45 = OpConvertSToF %float %44
+         %46 = OpCompositeConstruct %v4float %36 %39 %42 %45
+               OpStore %_GLF_color %46
+               OpBranch %31
+         %33 = OpLabel
+         %47 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %48 = OpLoad %int %47
+         %49 = OpConvertSToF %float %48
+         %50 = OpCompositeConstruct %v4float %49 %49 %49 %49
+               OpStore %_GLF_color %50
+               OpBranch %31
+         %31 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reciprocal-var-minus-one/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-reciprocal-var-minus-one/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..979542d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reciprocal-var-minus-one/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,41 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  a = -1;
+  const int x_25 = asint(x_6[1].x);
+  const int x_26 = a;
+  const int x_29 = asint(x_6[1].x);
+  if (((x_25 / x_26) < x_29)) {
+    const int x_35 = asint(x_6[1].x);
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_38 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_41 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const int x_44 = asint(x_6[1].x);
+    x_GLF_color = float4(float(x_35), float(x_38), float(x_41), float(x_44));
+  } else {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_48 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const float x_49 = float(x_48);
+    x_GLF_color = float4(x_49, x_49, x_49, x_49);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reciprocal-var-minus-one/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-reciprocal-var-minus-one/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..7130ddf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reciprocal-var-minus-one/0-opt.spvasm.expected.msl
@@ -0,0 +1,48 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int a = 0;
+  a = -1;
+  int const x_25 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_26 = a;
+  int const x_29 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  if (((x_25 / x_26) < x_29)) {
+    int const x_35 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_38 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_41 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_44 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_35), float(x_38), float(x_41), float(x_44));
+  } else {
+    int const x_48 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    float const x_49 = float(x_48);
+    *(tint_symbol_4) = float4(x_49, x_49, x_49, x_49);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reciprocal-var-minus-one/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-reciprocal-var-minus-one/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..83487ed
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reciprocal-var-minus-one/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,109 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 67
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %int_n1 = OpConstant %int -1
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_0 = OpConstant %int 0
+   %main_out = OpTypeStruct %v4float
+         %55 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+               OpStore %a %int_n1
+         %26 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %27 = OpLoad %int %26
+         %28 = OpLoad %int %a
+         %29 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %30 = OpLoad %int %29
+         %31 = OpSDiv %int %27 %28
+         %32 = OpSLessThan %bool %31 %30
+               OpSelectionMerge %34 None
+               OpBranchConditional %32 %35 %36
+         %35 = OpLabel
+         %37 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %38 = OpLoad %int %37
+         %40 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %41 = OpLoad %int %40
+         %42 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %43 = OpLoad %int %42
+         %44 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %45 = OpLoad %int %44
+         %46 = OpConvertSToF %float %38
+         %47 = OpConvertSToF %float %41
+         %48 = OpConvertSToF %float %43
+         %49 = OpConvertSToF %float %45
+         %50 = OpCompositeConstruct %v4float %46 %47 %48 %49
+               OpStore %x_GLF_color %50
+               OpBranch %34
+         %36 = OpLabel
+         %51 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %52 = OpLoad %int %51
+         %53 = OpConvertSToF %float %52
+         %54 = OpCompositeConstruct %v4float %53 %53 %53 %53
+               OpStore %x_GLF_color %54
+               OpBranch %34
+         %34 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %55
+%tint_symbol = OpFunctionParameter %main_out
+         %59 = OpLabel
+         %60 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %60
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %62 = OpLabel
+         %63 = OpFunctionCall %void %main_1
+         %65 = OpLoad %v4float %x_GLF_color
+         %66 = OpCompositeConstruct %main_out %65
+         %64 = OpFunctionCall %void %tint_symbol_2 %66
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reciprocal-var-minus-one/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-reciprocal-var-minus-one/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..6c4550f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reciprocal-var-minus-one/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,41 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  a = -1;
+  let x_25 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_26 : i32 = a;
+  let x_29 : i32 = x_6.x_GLF_uniform_int_values[1];
+  if (((x_25 / x_26) < x_29)) {
+    let x_35 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_38 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_41 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_44 : i32 = x_6.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_35), f32(x_38), f32(x_41), f32(x_44));
+  } else {
+    let x_48 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_49 : f32 = f32(x_48);
+    x_GLF_color = vec4<f32>(x_49, x_49, x_49, x_49);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reciprocal-var-minus-one/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-reciprocal-var-minus-one/0-opt.wgsl
new file mode 100644
index 0000000..6c4550f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reciprocal-var-minus-one/0-opt.wgsl
@@ -0,0 +1,41 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  a = -1;
+  let x_25 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_26 : i32 = a;
+  let x_29 : i32 = x_6.x_GLF_uniform_int_values[1];
+  if (((x_25 / x_26) < x_29)) {
+    let x_35 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_38 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_41 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_44 : i32 = x_6.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_35), f32(x_38), f32(x_41), f32(x_44));
+  } else {
+    let x_48 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_49 : f32 = f32(x_48);
+    x_GLF_color = vec4<f32>(x_49, x_49, x_49, x_49);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reciprocal-var-minus-one/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-reciprocal-var-minus-one/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..979542d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reciprocal-var-minus-one/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,41 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  a = -1;
+  const int x_25 = asint(x_6[1].x);
+  const int x_26 = a;
+  const int x_29 = asint(x_6[1].x);
+  if (((x_25 / x_26) < x_29)) {
+    const int x_35 = asint(x_6[1].x);
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_38 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_41 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const int x_44 = asint(x_6[1].x);
+    x_GLF_color = float4(float(x_35), float(x_38), float(x_41), float(x_44));
+  } else {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_48 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const float x_49 = float(x_48);
+    x_GLF_color = float4(x_49, x_49, x_49, x_49);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reciprocal-var-minus-one/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-reciprocal-var-minus-one/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..7130ddf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reciprocal-var-minus-one/0-opt.wgsl.expected.msl
@@ -0,0 +1,48 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int a = 0;
+  a = -1;
+  int const x_25 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_26 = a;
+  int const x_29 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  if (((x_25 / x_26) < x_29)) {
+    int const x_35 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_38 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_41 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_44 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_35), float(x_38), float(x_41), float(x_44));
+  } else {
+    int const x_48 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    float const x_49 = float(x_48);
+    *(tint_symbol_4) = float4(x_49, x_49, x_49, x_49);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reciprocal-var-minus-one/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-reciprocal-var-minus-one/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..83487ed
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reciprocal-var-minus-one/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,109 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 67
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %int_n1 = OpConstant %int -1
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_0 = OpConstant %int 0
+   %main_out = OpTypeStruct %v4float
+         %55 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+               OpStore %a %int_n1
+         %26 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %27 = OpLoad %int %26
+         %28 = OpLoad %int %a
+         %29 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %30 = OpLoad %int %29
+         %31 = OpSDiv %int %27 %28
+         %32 = OpSLessThan %bool %31 %30
+               OpSelectionMerge %34 None
+               OpBranchConditional %32 %35 %36
+         %35 = OpLabel
+         %37 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %38 = OpLoad %int %37
+         %40 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %41 = OpLoad %int %40
+         %42 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %43 = OpLoad %int %42
+         %44 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %45 = OpLoad %int %44
+         %46 = OpConvertSToF %float %38
+         %47 = OpConvertSToF %float %41
+         %48 = OpConvertSToF %float %43
+         %49 = OpConvertSToF %float %45
+         %50 = OpCompositeConstruct %v4float %46 %47 %48 %49
+               OpStore %x_GLF_color %50
+               OpBranch %34
+         %36 = OpLabel
+         %51 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %52 = OpLoad %int %51
+         %53 = OpConvertSToF %float %52
+         %54 = OpCompositeConstruct %v4float %53 %53 %53 %53
+               OpStore %x_GLF_color %54
+               OpBranch %34
+         %34 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %55
+%tint_symbol = OpFunctionParameter %main_out
+         %59 = OpLabel
+         %60 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %60
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %62 = OpLabel
+         %63 = OpFunctionCall %void %main_1
+         %65 = OpLoad %v4float %x_GLF_color
+         %66 = OpCompositeConstruct %main_out %65
+         %64 = OpFunctionCall %void %tint_symbol_2 %66
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reciprocal-var-minus-one/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-reciprocal-var-minus-one/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..6c4550f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reciprocal-var-minus-one/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,41 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  a = -1;
+  let x_25 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_26 : i32 = a;
+  let x_29 : i32 = x_6.x_GLF_uniform_int_values[1];
+  if (((x_25 / x_26) < x_29)) {
+    let x_35 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_38 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_41 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_44 : i32 = x_6.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_35), f32(x_38), f32(x_41), f32(x_44));
+  } else {
+    let x_48 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_49 : f32 = f32(x_48);
+    x_GLF_color = vec4<f32>(x_49, x_49, x_49, x_49);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-array-replace-extract/0.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-array-replace-extract/0.spvasm
new file mode 100644
index 0000000..f2c8e23
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-array-replace-extract/0.spvasm
@@ -0,0 +1,86 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %_ ""
+               OpDecorate %_GLF_color Location 0
+               OpMemberDecorate %buf0 0 RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %6 RelaxedPrecision
+               OpDecorate %7 RelaxedPrecision
+               OpDecorate %8 RelaxedPrecision
+               OpDecorate %9 RelaxedPrecision
+               OpDecorate %10 RelaxedPrecision
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_int_uint_1 = OpTypeArray %int %uint_1
+%_ptr_Function_int = OpTypePointer Function %int
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %22 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+      %int_0 = OpConstant %int 0
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+    %float_1 = OpConstant %float 1
+         %30 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+%_ptr_Function__arr_int_uint_1 = OpTypePointer Function %_arr_int_uint_1
+       %main = OpFunction %void None %12
+         %32 = OpLabel
+          %9 = OpVariable %_ptr_Function__arr_int_uint_1 Function
+         %33 = OpLoad %_arr_int_uint_1 %9
+          %6 = OpCompositeExtract %int %33 0
+               OpBranch %34
+         %34 = OpLabel
+               OpLoopMerge %35 %36 None
+               OpBranch %37
+         %37 = OpLabel
+               OpStore %_GLF_color %22
+         %38 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+          %7 = OpLoad %int %38
+         %39 = OpAccessChain %_ptr_Function_int %9 %7
+          %8 = OpLoad %int %39
+         %40 = OpIEqual %bool %8 %6
+               OpSelectionMerge %41 None
+               OpBranchConditional %40 %42 %41
+         %42 = OpLabel
+               OpBranch %35
+         %41 = OpLabel
+               OpBranch %35
+         %36 = OpLabel
+               OpBranch %34
+         %35 = OpLabel
+         %10 = OpPhi %int %int_1 %42 %int_2 %41
+         %43 = OpIEqual %bool %10 %int_1
+         %44 = OpIEqual %bool %10 %int_2
+         %45 = OpLogicalOr %bool %43 %44
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %48
+         %48 = OpLabel
+               OpStore %_GLF_color %22
+               OpBranch %46
+         %47 = OpLabel
+               OpStore %_GLF_color %30
+               OpBranch %46
+         %46 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-array-replace-extract/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-array-replace-extract/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..2c7bb9e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-array-replace-extract/0.spvasm.expected.hlsl
@@ -0,0 +1,46 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+
+void main_1() {
+  int x_9[1] = (int[1])0;
+  int x_10_phi = 0;
+  const int x_6 = x_9[0u];
+  while (true) {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    const int x_7 = asint(x_5[0].x);
+    const int x_8 = x_9[x_7];
+    if ((x_8 == x_6)) {
+      x_10_phi = 1;
+      break;
+    }
+    x_10_phi = 2;
+    break;
+  }
+  const int x_10 = x_10_phi;
+  bool tint_tmp = (x_10 == 1);
+  if (!tint_tmp) {
+    tint_tmp = (x_10 == 2);
+  }
+  if ((tint_tmp)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-array-replace-extract/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-array-replace-extract/0.spvasm.expected.msl
new file mode 100644
index 0000000..fc24e78
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-array-replace-extract/0.spvasm.expected.msl
@@ -0,0 +1,49 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int zero;
+};
+struct tint_array_wrapper {
+  int arr[1];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  tint_array_wrapper x_9 = {};
+  int x_10_phi = 0;
+  tint_array_wrapper const x_33 = x_9;
+  int const x_6 = x_33.arr[0u];
+  while (true) {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    int const x_7 = x_5.zero;
+    int const x_8 = x_9.arr[x_7];
+    if ((x_8 == x_6)) {
+      x_10_phi = 1;
+      break;
+    }
+    x_10_phi = 2;
+    break;
+  }
+  int const x_10 = x_10_phi;
+  if (((x_10 == 1) || (x_10 == 2))) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-array-replace-extract/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-array-replace-extract/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..e24ad6d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-array-replace-extract/0.spvasm.expected.spvasm
@@ -0,0 +1,124 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 68
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %x_5 "x_5"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_9 "x_9"
+               OpName %x_10_phi "x_10_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_1 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_int_uint_1 = OpTypeArray %int %uint_1
+%_ptr_Function__arr_int_uint_1 = OpTypePointer Function %_arr_int_uint_1
+         %21 = OpConstantNull %_arr_int_uint_1
+%_ptr_Function_int = OpTypePointer Function %int
+         %24 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+    %float_0 = OpConstant %float 0
+         %33 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+    %float_1 = OpConstant %float 1
+         %55 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %56 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+        %x_9 = OpVariable %_ptr_Function__arr_int_uint_1 Function %21
+   %x_10_phi = OpVariable %_ptr_Function_int Function %24
+         %25 = OpLoad %_arr_int_uint_1 %x_9
+         %27 = OpCompositeExtract %int %25 0
+               OpBranch %28
+         %28 = OpLabel
+               OpLoopMerge %29 %30 None
+               OpBranch %31
+         %31 = OpLabel
+               OpStore %x_GLF_color %33
+         %35 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0
+         %36 = OpLoad %int %35
+         %37 = OpAccessChain %_ptr_Function_int %x_9 %36
+         %38 = OpLoad %int %37
+         %39 = OpIEqual %bool %38 %27
+               OpSelectionMerge %41 None
+               OpBranchConditional %39 %42 %41
+         %42 = OpLabel
+               OpStore %x_10_phi %int_1
+               OpBranch %29
+         %41 = OpLabel
+               OpStore %x_10_phi %int_2
+               OpBranch %29
+         %30 = OpLabel
+               OpBranch %28
+         %29 = OpLabel
+         %45 = OpLoad %int %x_10_phi
+         %46 = OpIEqual %bool %45 %int_1
+               OpSelectionMerge %47 None
+               OpBranchConditional %46 %47 %48
+         %48 = OpLabel
+         %49 = OpIEqual %bool %45 %int_2
+               OpBranch %47
+         %47 = OpLabel
+         %50 = OpPhi %bool %46 %29 %49 %48
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %53
+         %52 = OpLabel
+               OpStore %x_GLF_color %55
+               OpBranch %51
+         %53 = OpLabel
+               OpStore %x_GLF_color %33
+               OpBranch %51
+         %51 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %56
+%tint_symbol = OpFunctionParameter %main_out
+         %60 = OpLabel
+         %61 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %61
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %63 = OpLabel
+         %64 = OpFunctionCall %void %main_1
+         %66 = OpLoad %v4float %x_GLF_color
+         %67 = OpCompositeConstruct %main_out %66
+         %65 = OpFunctionCall %void %tint_symbol_2 %67
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-array-replace-extract/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-array-replace-extract/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..d5ebd09
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-array-replace-extract/0.spvasm.expected.wgsl
@@ -0,0 +1,44 @@
+[[block]]
+struct buf0 {
+  zero : i32;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+fn main_1() {
+  var x_9 : array<i32, 1>;
+  var x_10_phi : i32;
+  let x_33 : array<i32, 1> = x_9;
+  let x_6 : i32 = x_33[0u];
+  loop {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+    let x_7 : i32 = x_5.zero;
+    let x_8 : i32 = x_9[x_7];
+    if ((x_8 == x_6)) {
+      x_10_phi = 1;
+      break;
+    }
+    x_10_phi = 2;
+    break;
+  }
+  let x_10 : i32 = x_10_phi;
+  if (((x_10 == 1) || (x_10 == 2))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-array-replace-extract/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-array-replace-extract/0.wgsl
new file mode 100644
index 0000000..d5ebd09
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-array-replace-extract/0.wgsl
@@ -0,0 +1,44 @@
+[[block]]
+struct buf0 {
+  zero : i32;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+fn main_1() {
+  var x_9 : array<i32, 1>;
+  var x_10_phi : i32;
+  let x_33 : array<i32, 1> = x_9;
+  let x_6 : i32 = x_33[0u];
+  loop {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+    let x_7 : i32 = x_5.zero;
+    let x_8 : i32 = x_9[x_7];
+    if ((x_8 == x_6)) {
+      x_10_phi = 1;
+      break;
+    }
+    x_10_phi = 2;
+    break;
+  }
+  let x_10 : i32 = x_10_phi;
+  if (((x_10 == 1) || (x_10 == 2))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-array-replace-extract/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-array-replace-extract/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..2c7bb9e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-array-replace-extract/0.wgsl.expected.hlsl
@@ -0,0 +1,46 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+
+void main_1() {
+  int x_9[1] = (int[1])0;
+  int x_10_phi = 0;
+  const int x_6 = x_9[0u];
+  while (true) {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    const int x_7 = asint(x_5[0].x);
+    const int x_8 = x_9[x_7];
+    if ((x_8 == x_6)) {
+      x_10_phi = 1;
+      break;
+    }
+    x_10_phi = 2;
+    break;
+  }
+  const int x_10 = x_10_phi;
+  bool tint_tmp = (x_10 == 1);
+  if (!tint_tmp) {
+    tint_tmp = (x_10 == 2);
+  }
+  if ((tint_tmp)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-array-replace-extract/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-array-replace-extract/0.wgsl.expected.msl
new file mode 100644
index 0000000..fc24e78
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-array-replace-extract/0.wgsl.expected.msl
@@ -0,0 +1,49 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int zero;
+};
+struct tint_array_wrapper {
+  int arr[1];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  tint_array_wrapper x_9 = {};
+  int x_10_phi = 0;
+  tint_array_wrapper const x_33 = x_9;
+  int const x_6 = x_33.arr[0u];
+  while (true) {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    int const x_7 = x_5.zero;
+    int const x_8 = x_9.arr[x_7];
+    if ((x_8 == x_6)) {
+      x_10_phi = 1;
+      break;
+    }
+    x_10_phi = 2;
+    break;
+  }
+  int const x_10 = x_10_phi;
+  if (((x_10 == 1) || (x_10 == 2))) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-array-replace-extract/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-array-replace-extract/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..e24ad6d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-array-replace-extract/0.wgsl.expected.spvasm
@@ -0,0 +1,124 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 68
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %x_5 "x_5"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_9 "x_9"
+               OpName %x_10_phi "x_10_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_1 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_int_uint_1 = OpTypeArray %int %uint_1
+%_ptr_Function__arr_int_uint_1 = OpTypePointer Function %_arr_int_uint_1
+         %21 = OpConstantNull %_arr_int_uint_1
+%_ptr_Function_int = OpTypePointer Function %int
+         %24 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+    %float_0 = OpConstant %float 0
+         %33 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+    %float_1 = OpConstant %float 1
+         %55 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %56 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+        %x_9 = OpVariable %_ptr_Function__arr_int_uint_1 Function %21
+   %x_10_phi = OpVariable %_ptr_Function_int Function %24
+         %25 = OpLoad %_arr_int_uint_1 %x_9
+         %27 = OpCompositeExtract %int %25 0
+               OpBranch %28
+         %28 = OpLabel
+               OpLoopMerge %29 %30 None
+               OpBranch %31
+         %31 = OpLabel
+               OpStore %x_GLF_color %33
+         %35 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0
+         %36 = OpLoad %int %35
+         %37 = OpAccessChain %_ptr_Function_int %x_9 %36
+         %38 = OpLoad %int %37
+         %39 = OpIEqual %bool %38 %27
+               OpSelectionMerge %41 None
+               OpBranchConditional %39 %42 %41
+         %42 = OpLabel
+               OpStore %x_10_phi %int_1
+               OpBranch %29
+         %41 = OpLabel
+               OpStore %x_10_phi %int_2
+               OpBranch %29
+         %30 = OpLabel
+               OpBranch %28
+         %29 = OpLabel
+         %45 = OpLoad %int %x_10_phi
+         %46 = OpIEqual %bool %45 %int_1
+               OpSelectionMerge %47 None
+               OpBranchConditional %46 %47 %48
+         %48 = OpLabel
+         %49 = OpIEqual %bool %45 %int_2
+               OpBranch %47
+         %47 = OpLabel
+         %50 = OpPhi %bool %46 %29 %49 %48
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %53
+         %52 = OpLabel
+               OpStore %x_GLF_color %55
+               OpBranch %51
+         %53 = OpLabel
+               OpStore %x_GLF_color %33
+               OpBranch %51
+         %51 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %56
+%tint_symbol = OpFunctionParameter %main_out
+         %60 = OpLabel
+         %61 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %61
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %63 = OpLabel
+         %64 = OpFunctionCall %void %main_1
+         %66 = OpLoad %v4float %x_GLF_color
+         %67 = OpCompositeConstruct %main_out %66
+         %65 = OpFunctionCall %void %tint_symbol_2 %67
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-array-replace-extract/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-array-replace-extract/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..d5ebd09
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-array-replace-extract/0.wgsl.expected.wgsl
@@ -0,0 +1,44 @@
+[[block]]
+struct buf0 {
+  zero : i32;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+fn main_1() {
+  var x_9 : array<i32, 1>;
+  var x_10_phi : i32;
+  let x_33 : array<i32, 1> = x_9;
+  let x_6 : i32 = x_33[0u];
+  loop {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+    let x_7 : i32 = x_5.zero;
+    let x_8 : i32 = x_9[x_7];
+    if ((x_8 == x_6)) {
+      x_10_phi = 1;
+      break;
+    }
+    x_10_phi = 2;
+    break;
+  }
+  let x_10 : i32 = x_10_phi;
+  if (((x_10 == 1) || (x_10 == 2))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-replace-extract/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-replace-extract/0-opt.spvasm
new file mode 100644
index 0000000..8767ee3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-replace-extract/0-opt.spvasm
@@ -0,0 +1,120 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %S "S"
+               OpMemberName %S 0 "x"
+               OpMemberName %S 1 "y"
+               OpName %func_struct_S_i1_i11_ "func(struct-S-i1-i11;"
+               OpName %arg "arg"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %_ ""
+               OpName %param "param"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+          %S = OpTypeStruct %int %int
+%_ptr_Function_S = OpTypePointer Function %S
+         %16 = OpTypeFunction %void %_ptr_Function_S
+      %int_1 = OpConstant %int 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_5 = OpConstant %float 5
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_S_uint_2 = OpTypeArray %S %uint_2
+%_ptr_Function__arr_S_uint_2 = OpTypePointer Function %_arr_S_uint_2
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+      %false = OpConstantFalse %bool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+         %35 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %36 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %13
+         %37 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function
+          %b = OpVariable %_ptr_Function__arr_S_uint_2 Function
+      %param = OpVariable %_ptr_Function_S Function
+               OpStore %a %float_5
+               OpBranch %38
+         %38 = OpLabel
+               OpLoopMerge %39 %40 None
+               OpBranch %41
+         %41 = OpLabel
+         %42 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %43 = OpLoad %int %42
+         %44 = OpAccessChain %_ptr_Function_int %b %43 %int_0
+               OpStore %44 %int_1
+         %45 = OpAccessChain %_ptr_Function_int %b %int_1 %int_0
+         %46 = OpLoad %int %45
+         %47 = OpIEqual %bool %46 %int_1
+               OpSelectionMerge %48 None
+               OpBranchConditional %47 %49 %48
+         %49 = OpLabel
+         %50 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %51 = OpLoad %int %50
+         %52 = OpIEqual %bool %51 %int_1
+               OpSelectionMerge %53 None
+               OpBranchConditional %52 %54 %53
+         %54 = OpLabel
+               OpBranch %39
+         %53 = OpLabel
+         %55 = OpAccessChain %_ptr_Function_S %b %int_1
+         %56 = OpLoad %S %55
+               OpStore %param %56
+         %57 = OpFunctionCall %void %func_struct_S_i1_i11_ %param
+         %58 = OpLoad %S %param
+         %59 = OpAccessChain %_ptr_Function_S %b %int_1
+               OpStore %59 %58
+         %60 = OpAccessChain %_ptr_Function_int %b %int_1 %int_1
+         %61 = OpLoad %int %60
+         %62 = OpConvertSToF %float %61
+               OpStore %a %62
+               OpBranch %48
+         %48 = OpLabel
+               OpStore %a %float_0
+               OpBranch %40
+         %40 = OpLabel
+               OpBranchConditional %false %38 %39
+         %39 = OpLabel
+         %63 = OpLoad %float %a
+         %64 = OpFOrdEqual %bool %63 %float_5
+               OpSelectionMerge %65 None
+               OpBranchConditional %64 %66 %67
+         %66 = OpLabel
+               OpStore %_GLF_color %35
+               OpBranch %65
+         %67 = OpLabel
+               OpStore %_GLF_color %36
+               OpBranch %65
+         %65 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%func_struct_S_i1_i11_ = OpFunction %void None %16
+        %arg = OpFunctionParameter %_ptr_Function_S
+         %68 = OpLabel
+         %69 = OpAccessChain %_ptr_Function_int %arg %int_1
+               OpStore %69 %int_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-replace-extract/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-replace-extract/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..0adcd37
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-replace-extract/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,65 @@
+struct S {
+  int x;
+  int y;
+};
+
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void func_struct_S_i1_i11_(inout S arg) {
+  arg.y = 1;
+  return;
+}
+
+void main_1() {
+  float a = 0.0f;
+  S b[2] = (S[2])0;
+  S param = (S)0;
+  a = 5.0f;
+  while (true) {
+    const int x_43 = asint(x_10[0].x);
+    b[x_43].x = 1;
+    const int x_46 = b[1].x;
+    if ((x_46 == 1)) {
+      const int x_51 = asint(x_10[0].x);
+      if ((x_51 == 1)) {
+        break;
+      }
+      const S x_56 = b[1];
+      param = x_56;
+      func_struct_S_i1_i11_(param);
+      b[1] = param;
+      const int x_61 = b[1].y;
+      a = float(x_61);
+    }
+    a = 0.0f;
+    {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  if ((a == 5.0f)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-replace-extract/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-replace-extract/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..a0d65d8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-replace-extract/0-opt.spvasm.expected.msl
@@ -0,0 +1,72 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  int x;
+  int y;
+};
+struct buf0 {
+  /* 0x0000 */ int one;
+};
+struct tint_array_wrapper {
+  S arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void func_struct_S_i1_i11_(thread S* const arg) {
+  (*(arg)).y = 1;
+  return;
+}
+
+void main_1(constant buf0& x_10, thread float4* const tint_symbol_4) {
+  float a = 0.0f;
+  tint_array_wrapper b = {};
+  S param = {};
+  a = 5.0f;
+  while (true) {
+    int const x_43 = x_10.one;
+    b.arr[x_43].x = 1;
+    int const x_46 = b.arr[1].x;
+    if ((x_46 == 1)) {
+      int const x_51 = x_10.one;
+      if ((x_51 == 1)) {
+        break;
+      }
+      S const x_56 = b.arr[1];
+      param = x_56;
+      func_struct_S_i1_i11_(&(param));
+      S const x_58 = param;
+      b.arr[1] = x_58;
+      int const x_61 = b.arr[1].y;
+      a = float(x_61);
+    }
+    a = 0.0f;
+    {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  float const x_63 = a;
+  if ((x_63 == 5.0f)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_10 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-replace-extract/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-replace-extract/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..5969228
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-replace-extract/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,170 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 93
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %S "S"
+               OpMemberName %S 0 "x"
+               OpMemberName %S 1 "y"
+               OpName %func_struct_S_i1_i11_ "func_struct_S_i1_i11_"
+               OpName %arg "arg"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %param "param"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %S 0 Offset 0
+               OpMemberDecorate %S 1 Offset 4
+               OpDecorate %_arr_S_uint_2 ArrayStride 8
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+          %S = OpTypeStruct %int %int
+%_ptr_Function_S = OpTypePointer Function %S
+         %12 = OpTypeFunction %void %_ptr_Function_S
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+         %25 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %30 = OpConstantNull %float
+     %uint_2 = OpConstant %uint 2
+%_arr_S_uint_2 = OpTypeArray %S %uint_2
+%_ptr_Function__arr_S_uint_2 = OpTypePointer Function %_arr_S_uint_2
+         %35 = OpConstantNull %_arr_S_uint_2
+         %37 = OpConstantNull %S
+    %float_5 = OpConstant %float 5
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+      %false = OpConstantFalse %bool
+    %float_1 = OpConstant %float 1
+         %79 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %80 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %81 = OpTypeFunction %void %main_out
+%func_struct_S_i1_i11_ = OpFunction %void None %12
+        %arg = OpFunctionParameter %_ptr_Function_S
+         %18 = OpLabel
+         %23 = OpAccessChain %_ptr_Function_int %arg %uint_1
+               OpStore %23 %int_1
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %25
+         %27 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function %30
+          %b = OpVariable %_ptr_Function__arr_S_uint_2 Function %35
+      %param = OpVariable %_ptr_Function_S Function %37
+               OpStore %a %float_5
+               OpBranch %39
+         %39 = OpLabel
+               OpLoopMerge %40 %41 None
+               OpBranch %42
+         %42 = OpLabel
+         %45 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0
+         %46 = OpLoad %int %45
+         %47 = OpAccessChain %_ptr_Function_int %b %46 %uint_0
+               OpStore %47 %int_1
+         %48 = OpAccessChain %_ptr_Function_int %b %int_1 %uint_0
+         %49 = OpLoad %int %48
+         %50 = OpIEqual %bool %49 %int_1
+               OpSelectionMerge %52 None
+               OpBranchConditional %50 %53 %52
+         %53 = OpLabel
+         %54 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0
+         %55 = OpLoad %int %54
+         %56 = OpIEqual %bool %55 %int_1
+               OpSelectionMerge %57 None
+               OpBranchConditional %56 %58 %57
+         %58 = OpLabel
+               OpBranch %40
+         %57 = OpLabel
+         %59 = OpAccessChain %_ptr_Function_S %b %int_1
+         %60 = OpLoad %S %59
+               OpStore %param %60
+         %61 = OpFunctionCall %void %func_struct_S_i1_i11_ %param
+         %63 = OpLoad %S %param
+         %64 = OpAccessChain %_ptr_Function_S %b %int_1
+               OpStore %64 %63
+         %65 = OpAccessChain %_ptr_Function_int %b %int_1 %uint_1
+         %66 = OpLoad %int %65
+         %67 = OpConvertSToF %float %66
+               OpStore %a %67
+               OpBranch %52
+         %52 = OpLabel
+               OpStore %a %float_0
+               OpBranch %41
+         %41 = OpLabel
+               OpSelectionMerge %70 None
+               OpBranchConditional %false %71 %72
+         %71 = OpLabel
+               OpBranch %70
+         %72 = OpLabel
+               OpBranch %40
+         %70 = OpLabel
+               OpBranch %39
+         %40 = OpLabel
+         %73 = OpLoad %float %a
+         %74 = OpFOrdEqual %bool %73 %float_5
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %77
+         %76 = OpLabel
+               OpStore %x_GLF_color %79
+               OpBranch %75
+         %77 = OpLabel
+               OpStore %x_GLF_color %80
+               OpBranch %75
+         %75 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %81
+%tint_symbol = OpFunctionParameter %main_out
+         %85 = OpLabel
+         %86 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %86
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %25
+         %88 = OpLabel
+         %89 = OpFunctionCall %void %main_1
+         %91 = OpLoad %v4float %x_GLF_color
+         %92 = OpCompositeConstruct %main_out %91
+         %90 = OpFunctionCall %void %tint_symbol_2 %92
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 41[%41] is not post dominated by the back-edge block 70[%70]
+  %70 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-replace-extract/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-replace-extract/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..779fafc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-replace-extract/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,69 @@
+struct S {
+  x : i32;
+  y : i32;
+};
+
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_struct_S_i1_i11_(arg : ptr<function, S>) {
+  (*(arg)).y = 1;
+  return;
+}
+
+fn main_1() {
+  var a : f32;
+  var b : array<S, 2>;
+  var param : S;
+  a = 5.0;
+  loop {
+    let x_43 : i32 = x_10.one;
+    b[x_43].x = 1;
+    let x_46 : i32 = b[1].x;
+    if ((x_46 == 1)) {
+      let x_51 : i32 = x_10.one;
+      if ((x_51 == 1)) {
+        break;
+      }
+      let x_56 : S = b[1];
+      param = x_56;
+      func_struct_S_i1_i11_(&(param));
+      let x_58 : S = param;
+      b[1] = x_58;
+      let x_61 : i32 = b[1].y;
+      a = f32(x_61);
+    }
+    a = 0.0;
+
+    continuing {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_63 : f32 = a;
+  if ((x_63 == 5.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-replace-extract/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-replace-extract/0-opt.wgsl
new file mode 100644
index 0000000..779fafc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-replace-extract/0-opt.wgsl
@@ -0,0 +1,69 @@
+struct S {
+  x : i32;
+  y : i32;
+};
+
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_struct_S_i1_i11_(arg : ptr<function, S>) {
+  (*(arg)).y = 1;
+  return;
+}
+
+fn main_1() {
+  var a : f32;
+  var b : array<S, 2>;
+  var param : S;
+  a = 5.0;
+  loop {
+    let x_43 : i32 = x_10.one;
+    b[x_43].x = 1;
+    let x_46 : i32 = b[1].x;
+    if ((x_46 == 1)) {
+      let x_51 : i32 = x_10.one;
+      if ((x_51 == 1)) {
+        break;
+      }
+      let x_56 : S = b[1];
+      param = x_56;
+      func_struct_S_i1_i11_(&(param));
+      let x_58 : S = param;
+      b[1] = x_58;
+      let x_61 : i32 = b[1].y;
+      a = f32(x_61);
+    }
+    a = 0.0;
+
+    continuing {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_63 : f32 = a;
+  if ((x_63 == 5.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-replace-extract/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-replace-extract/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..0adcd37
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-replace-extract/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,65 @@
+struct S {
+  int x;
+  int y;
+};
+
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void func_struct_S_i1_i11_(inout S arg) {
+  arg.y = 1;
+  return;
+}
+
+void main_1() {
+  float a = 0.0f;
+  S b[2] = (S[2])0;
+  S param = (S)0;
+  a = 5.0f;
+  while (true) {
+    const int x_43 = asint(x_10[0].x);
+    b[x_43].x = 1;
+    const int x_46 = b[1].x;
+    if ((x_46 == 1)) {
+      const int x_51 = asint(x_10[0].x);
+      if ((x_51 == 1)) {
+        break;
+      }
+      const S x_56 = b[1];
+      param = x_56;
+      func_struct_S_i1_i11_(param);
+      b[1] = param;
+      const int x_61 = b[1].y;
+      a = float(x_61);
+    }
+    a = 0.0f;
+    {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  if ((a == 5.0f)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-replace-extract/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-replace-extract/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..a0d65d8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-replace-extract/0-opt.wgsl.expected.msl
@@ -0,0 +1,72 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  int x;
+  int y;
+};
+struct buf0 {
+  /* 0x0000 */ int one;
+};
+struct tint_array_wrapper {
+  S arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void func_struct_S_i1_i11_(thread S* const arg) {
+  (*(arg)).y = 1;
+  return;
+}
+
+void main_1(constant buf0& x_10, thread float4* const tint_symbol_4) {
+  float a = 0.0f;
+  tint_array_wrapper b = {};
+  S param = {};
+  a = 5.0f;
+  while (true) {
+    int const x_43 = x_10.one;
+    b.arr[x_43].x = 1;
+    int const x_46 = b.arr[1].x;
+    if ((x_46 == 1)) {
+      int const x_51 = x_10.one;
+      if ((x_51 == 1)) {
+        break;
+      }
+      S const x_56 = b.arr[1];
+      param = x_56;
+      func_struct_S_i1_i11_(&(param));
+      S const x_58 = param;
+      b.arr[1] = x_58;
+      int const x_61 = b.arr[1].y;
+      a = float(x_61);
+    }
+    a = 0.0f;
+    {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  float const x_63 = a;
+  if ((x_63 == 5.0f)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_10 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-replace-extract/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-replace-extract/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..5969228
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-replace-extract/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,170 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 93
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %S "S"
+               OpMemberName %S 0 "x"
+               OpMemberName %S 1 "y"
+               OpName %func_struct_S_i1_i11_ "func_struct_S_i1_i11_"
+               OpName %arg "arg"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %param "param"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %S 0 Offset 0
+               OpMemberDecorate %S 1 Offset 4
+               OpDecorate %_arr_S_uint_2 ArrayStride 8
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+          %S = OpTypeStruct %int %int
+%_ptr_Function_S = OpTypePointer Function %S
+         %12 = OpTypeFunction %void %_ptr_Function_S
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+         %25 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %30 = OpConstantNull %float
+     %uint_2 = OpConstant %uint 2
+%_arr_S_uint_2 = OpTypeArray %S %uint_2
+%_ptr_Function__arr_S_uint_2 = OpTypePointer Function %_arr_S_uint_2
+         %35 = OpConstantNull %_arr_S_uint_2
+         %37 = OpConstantNull %S
+    %float_5 = OpConstant %float 5
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+      %false = OpConstantFalse %bool
+    %float_1 = OpConstant %float 1
+         %79 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %80 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %81 = OpTypeFunction %void %main_out
+%func_struct_S_i1_i11_ = OpFunction %void None %12
+        %arg = OpFunctionParameter %_ptr_Function_S
+         %18 = OpLabel
+         %23 = OpAccessChain %_ptr_Function_int %arg %uint_1
+               OpStore %23 %int_1
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %25
+         %27 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function %30
+          %b = OpVariable %_ptr_Function__arr_S_uint_2 Function %35
+      %param = OpVariable %_ptr_Function_S Function %37
+               OpStore %a %float_5
+               OpBranch %39
+         %39 = OpLabel
+               OpLoopMerge %40 %41 None
+               OpBranch %42
+         %42 = OpLabel
+         %45 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0
+         %46 = OpLoad %int %45
+         %47 = OpAccessChain %_ptr_Function_int %b %46 %uint_0
+               OpStore %47 %int_1
+         %48 = OpAccessChain %_ptr_Function_int %b %int_1 %uint_0
+         %49 = OpLoad %int %48
+         %50 = OpIEqual %bool %49 %int_1
+               OpSelectionMerge %52 None
+               OpBranchConditional %50 %53 %52
+         %53 = OpLabel
+         %54 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0
+         %55 = OpLoad %int %54
+         %56 = OpIEqual %bool %55 %int_1
+               OpSelectionMerge %57 None
+               OpBranchConditional %56 %58 %57
+         %58 = OpLabel
+               OpBranch %40
+         %57 = OpLabel
+         %59 = OpAccessChain %_ptr_Function_S %b %int_1
+         %60 = OpLoad %S %59
+               OpStore %param %60
+         %61 = OpFunctionCall %void %func_struct_S_i1_i11_ %param
+         %63 = OpLoad %S %param
+         %64 = OpAccessChain %_ptr_Function_S %b %int_1
+               OpStore %64 %63
+         %65 = OpAccessChain %_ptr_Function_int %b %int_1 %uint_1
+         %66 = OpLoad %int %65
+         %67 = OpConvertSToF %float %66
+               OpStore %a %67
+               OpBranch %52
+         %52 = OpLabel
+               OpStore %a %float_0
+               OpBranch %41
+         %41 = OpLabel
+               OpSelectionMerge %70 None
+               OpBranchConditional %false %71 %72
+         %71 = OpLabel
+               OpBranch %70
+         %72 = OpLabel
+               OpBranch %40
+         %70 = OpLabel
+               OpBranch %39
+         %40 = OpLabel
+         %73 = OpLoad %float %a
+         %74 = OpFOrdEqual %bool %73 %float_5
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %77
+         %76 = OpLabel
+               OpStore %x_GLF_color %79
+               OpBranch %75
+         %77 = OpLabel
+               OpStore %x_GLF_color %80
+               OpBranch %75
+         %75 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %81
+%tint_symbol = OpFunctionParameter %main_out
+         %85 = OpLabel
+         %86 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %86
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %25
+         %88 = OpLabel
+         %89 = OpFunctionCall %void %main_1
+         %91 = OpLoad %v4float %x_GLF_color
+         %92 = OpCompositeConstruct %main_out %91
+         %90 = OpFunctionCall %void %tint_symbol_2 %92
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 41[%41] is not post dominated by the back-edge block 70[%70]
+  %70 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-replace-extract/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-replace-extract/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..779fafc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-replace-extract/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,69 @@
+struct S {
+  x : i32;
+  y : i32;
+};
+
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_struct_S_i1_i11_(arg : ptr<function, S>) {
+  (*(arg)).y = 1;
+  return;
+}
+
+fn main_1() {
+  var a : f32;
+  var b : array<S, 2>;
+  var param : S;
+  a = 5.0;
+  loop {
+    let x_43 : i32 = x_10.one;
+    b[x_43].x = 1;
+    let x_46 : i32 = b[1].x;
+    if ((x_46 == 1)) {
+      let x_51 : i32 = x_10.one;
+      if ((x_51 == 1)) {
+        break;
+      }
+      let x_56 : S = b[1];
+      param = x_56;
+      func_struct_S_i1_i11_(&(param));
+      let x_58 : S = param;
+      b[1] = x_58;
+      let x_61 : i32 = b[1].y;
+      a = f32(x_61);
+    }
+    a = 0.0;
+
+    continuing {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_63 : f32 = a;
+  if ((x_63 == 5.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard/0-opt.spvasm
new file mode 100644
index 0000000..61ce7ed
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard/0-opt.spvasm
@@ -0,0 +1,140 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_v1
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %i "i"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpName %j "j"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %_GLF_v1 "_GLF_v1"
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_v1 Location 0
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+    %_GLF_v1 = OpVariable %_ptr_Output_v4float Output
+      %int_2 = OpConstant %int 2
+       %main = OpFunction %void None %14
+         %34 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+          %j = OpVariable %_ptr_Function_int Function
+         %35 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %36 = OpLoad %int %35
+               OpStore %i %36
+               OpBranch %37
+         %37 = OpLabel
+               OpLoopMerge %38 %39 None
+               OpBranch %40
+         %40 = OpLabel
+         %41 = OpLoad %int %i
+         %42 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %43 = OpLoad %int %42
+         %44 = OpSLessThan %bool %41 %43
+               OpBranchConditional %44 %45 %38
+         %45 = OpLabel
+         %46 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %47 = OpLoad %float %46
+         %48 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_1
+         %49 = OpLoad %float %48
+         %50 = OpFOrdGreaterThan %bool %47 %49
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %51
+         %52 = OpLabel
+               OpKill
+         %51 = OpLabel
+         %53 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %54 = OpLoad %int %53
+               OpStore %j %54
+               OpBranch %55
+         %55 = OpLabel
+               OpLoopMerge %56 %57 None
+               OpBranch %58
+         %58 = OpLabel
+         %59 = OpLoad %int %j
+         %60 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %61 = OpLoad %int %60
+         %62 = OpSLessThan %bool %59 %61
+               OpBranchConditional %62 %63 %56
+         %63 = OpLabel
+         %64 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %65 = OpLoad %float %64
+         %66 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %67 = OpLoad %float %66
+         %68 = OpFOrdLessThan %bool %65 %67
+               OpSelectionMerge %69 None
+               OpBranchConditional %68 %70 %69
+         %70 = OpLabel
+               OpKill
+         %69 = OpLabel
+         %71 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %72 = OpLoad %int %71
+         %73 = OpConvertSToF %float %72
+         %74 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %75 = OpLoad %int %74
+         %76 = OpConvertSToF %float %75
+         %77 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %78 = OpLoad %int %77
+         %79 = OpConvertSToF %float %78
+         %80 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %81 = OpLoad %int %80
+         %82 = OpConvertSToF %float %81
+         %83 = OpCompositeConstruct %v4float %73 %76 %79 %82
+               OpStore %_GLF_v1 %83
+               OpBranch %57
+         %57 = OpLabel
+         %84 = OpLoad %int %j
+         %85 = OpIAdd %int %84 %int_1
+               OpStore %j %85
+               OpBranch %55
+         %56 = OpLabel
+               OpBranch %39
+         %39 = OpLabel
+         %86 = OpLoad %int %i
+         %87 = OpIAdd %int %86 %int_1
+               OpStore %i %87
+               OpBranch %37
+         %38 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..59e50ef
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,78 @@
+cbuffer cbuffer_x_7 : register(b1, space0) {
+  uint4 x_7[3];
+};
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[2];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_v1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int i = 0;
+  int j = 0;
+  const int x_36 = asint(x_7[1].x);
+  i = x_36;
+  while (true) {
+    const int x_41 = i;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_43 = asint(x_7[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_41 < x_43)) {
+    } else {
+      break;
+    }
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const float x_47 = asfloat(x_9[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const float x_49 = asfloat(x_9[1].x);
+    if ((x_47 > x_49)) {
+      discard;
+    }
+    const int x_54 = asint(x_7[1].x);
+    j = x_54;
+    while (true) {
+      const int x_59 = j;
+      const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+      const int x_61 = asint(x_7[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+      if ((x_59 < x_61)) {
+      } else {
+        break;
+      }
+      const float x_65 = gl_FragCoord.x;
+      const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+      const float x_67 = asfloat(x_9[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+      if ((x_65 < x_67)) {
+        discard;
+      }
+      const int x_72 = asint(x_7[2].x);
+      const int x_75 = asint(x_7[1].x);
+      const int x_78 = asint(x_7[1].x);
+      const int x_81 = asint(x_7[2].x);
+      x_GLF_v1 = float4(float(x_72), float(x_75), float(x_78), float(x_81));
+      {
+        j = (j + 1);
+      }
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_v1_1;
+};
+struct tint_symbol_1 {
+  float4 gl_FragCoord_param : SV_Position;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_v1_1 : SV_Target0;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_v1};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_v1_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..a59c60d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard/0-opt.spvasm.expected.msl
@@ -0,0 +1,89 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_v1_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_v1_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_7, constant buf0& x_9, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int i = 0;
+  int j = 0;
+  int const x_36 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  i = x_36;
+  while (true) {
+    int const x_41 = i;
+    int const x_43 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_41 < x_43)) {
+    } else {
+      break;
+    }
+    float const x_47 = x_9.x_GLF_uniform_float_values.arr[0].el;
+    float const x_49 = x_9.x_GLF_uniform_float_values.arr[1].el;
+    if ((x_47 > x_49)) {
+      discard_fragment();
+    }
+    int const x_54 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    j = x_54;
+    while (true) {
+      int const x_59 = j;
+      int const x_61 = x_7.x_GLF_uniform_int_values.arr[0].el;
+      if ((x_59 < x_61)) {
+      } else {
+        break;
+      }
+      float const x_65 = (*(tint_symbol_5)).x;
+      float const x_67 = x_9.x_GLF_uniform_float_values.arr[0].el;
+      if ((x_65 < x_67)) {
+        discard_fragment();
+      }
+      int const x_72 = x_7.x_GLF_uniform_int_values.arr[2].el;
+      int const x_75 = x_7.x_GLF_uniform_int_values.arr[1].el;
+      int const x_78 = x_7.x_GLF_uniform_int_values.arr[1].el;
+      int const x_81 = x_7.x_GLF_uniform_int_values.arr[2].el;
+      *(tint_symbol_6) = float4(float(x_72), float(x_75), float(x_78), float(x_81));
+      {
+        int const x_84 = j;
+        j = (x_84 + 1);
+      }
+    }
+    {
+      int const x_86 = i;
+      i = (x_86 + 1);
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf1& x_7 [[buffer(1)]], constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_7, x_9, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_v1_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_v1_1=tint_symbol_3.x_GLF_v1_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..7d4d31d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,187 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 109
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_9 "x_9"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_v1 "x_GLF_v1"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_v1_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_7 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %float = OpTypeFloat 32
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %17
+   %x_GLF_v1 = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Private_float = OpTypePointer Private %float
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+         %96 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %23
+         %26 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %29
+          %j = OpVariable %_ptr_Function_int Function %29
+         %34 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %35 = OpLoad %int %34
+               OpStore %i %35
+               OpBranch %36
+         %36 = OpLabel
+               OpLoopMerge %37 %38 None
+               OpBranch %39
+         %39 = OpLabel
+         %40 = OpLoad %int %i
+         %42 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %43 = OpLoad %int %42
+         %44 = OpSLessThan %bool %40 %43
+               OpSelectionMerge %46 None
+               OpBranchConditional %44 %47 %48
+         %47 = OpLabel
+               OpBranch %46
+         %48 = OpLabel
+               OpBranch %37
+         %46 = OpLabel
+         %50 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_0
+         %51 = OpLoad %float %50
+         %52 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_1
+         %53 = OpLoad %float %52
+         %54 = OpFOrdGreaterThan %bool %51 %53
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %55
+         %56 = OpLabel
+               OpKill
+         %55 = OpLabel
+         %57 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %58 = OpLoad %int %57
+               OpStore %j %58
+               OpBranch %59
+         %59 = OpLabel
+               OpLoopMerge %60 %61 None
+               OpBranch %62
+         %62 = OpLabel
+         %63 = OpLoad %int %j
+         %64 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %65 = OpLoad %int %64
+         %66 = OpSLessThan %bool %63 %65
+               OpSelectionMerge %67 None
+               OpBranchConditional %66 %68 %69
+         %68 = OpLabel
+               OpBranch %67
+         %69 = OpLabel
+               OpBranch %60
+         %67 = OpLabel
+         %71 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %72 = OpLoad %float %71
+         %73 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_0
+         %74 = OpLoad %float %73
+         %75 = OpFOrdLessThan %bool %72 %74
+               OpSelectionMerge %76 None
+               OpBranchConditional %75 %77 %76
+         %77 = OpLabel
+               OpKill
+         %76 = OpLabel
+         %79 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %80 = OpLoad %int %79
+         %81 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %82 = OpLoad %int %81
+         %83 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %84 = OpLoad %int %83
+         %85 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %86 = OpLoad %int %85
+         %87 = OpConvertSToF %float %80
+         %88 = OpConvertSToF %float %82
+         %89 = OpConvertSToF %float %84
+         %90 = OpConvertSToF %float %86
+         %91 = OpCompositeConstruct %v4float %87 %88 %89 %90
+               OpStore %x_GLF_v1 %91
+               OpBranch %61
+         %61 = OpLabel
+         %92 = OpLoad %int %j
+         %93 = OpIAdd %int %92 %int_1
+               OpStore %j %93
+               OpBranch %59
+         %60 = OpLabel
+               OpBranch %38
+         %38 = OpLabel
+         %94 = OpLoad %int %i
+         %95 = OpIAdd %int %94 %int_1
+               OpStore %i %95
+               OpBranch %36
+         %37 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %96
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %100 = OpLabel
+        %101 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %101
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %23
+        %103 = OpLabel
+        %104 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %104
+        %105 = OpFunctionCall %void %main_1
+        %107 = OpLoad %v4float %x_GLF_v1
+        %108 = OpCompositeConstruct %main_out %107
+        %106 = OpFunctionCall %void %tint_symbol_3 %108
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..a5fd0d0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,84 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_v1 : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  var j : i32;
+  let x_36 : i32 = x_7.x_GLF_uniform_int_values[1];
+  i = x_36;
+  loop {
+    let x_41 : i32 = i;
+    let x_43 : i32 = x_7.x_GLF_uniform_int_values[0];
+    if ((x_41 < x_43)) {
+    } else {
+      break;
+    }
+    let x_47 : f32 = x_9.x_GLF_uniform_float_values[0];
+    let x_49 : f32 = x_9.x_GLF_uniform_float_values[1];
+    if ((x_47 > x_49)) {
+      discard;
+    }
+    let x_54 : i32 = x_7.x_GLF_uniform_int_values[1];
+    j = x_54;
+    loop {
+      let x_59 : i32 = j;
+      let x_61 : i32 = x_7.x_GLF_uniform_int_values[0];
+      if ((x_59 < x_61)) {
+      } else {
+        break;
+      }
+      let x_65 : f32 = gl_FragCoord.x;
+      let x_67 : f32 = x_9.x_GLF_uniform_float_values[0];
+      if ((x_65 < x_67)) {
+        discard;
+      }
+      let x_72 : i32 = x_7.x_GLF_uniform_int_values[2];
+      let x_75 : i32 = x_7.x_GLF_uniform_int_values[1];
+      let x_78 : i32 = x_7.x_GLF_uniform_int_values[1];
+      let x_81 : i32 = x_7.x_GLF_uniform_int_values[2];
+      x_GLF_v1 = vec4<f32>(f32(x_72), f32(x_75), f32(x_78), f32(x_81));
+
+      continuing {
+        let x_84 : i32 = j;
+        j = (x_84 + 1);
+      }
+    }
+
+    continuing {
+      let x_86 : i32 = i;
+      i = (x_86 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_v1_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_v1);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard/0-opt.wgsl
new file mode 100644
index 0000000..a5fd0d0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard/0-opt.wgsl
@@ -0,0 +1,84 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_v1 : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  var j : i32;
+  let x_36 : i32 = x_7.x_GLF_uniform_int_values[1];
+  i = x_36;
+  loop {
+    let x_41 : i32 = i;
+    let x_43 : i32 = x_7.x_GLF_uniform_int_values[0];
+    if ((x_41 < x_43)) {
+    } else {
+      break;
+    }
+    let x_47 : f32 = x_9.x_GLF_uniform_float_values[0];
+    let x_49 : f32 = x_9.x_GLF_uniform_float_values[1];
+    if ((x_47 > x_49)) {
+      discard;
+    }
+    let x_54 : i32 = x_7.x_GLF_uniform_int_values[1];
+    j = x_54;
+    loop {
+      let x_59 : i32 = j;
+      let x_61 : i32 = x_7.x_GLF_uniform_int_values[0];
+      if ((x_59 < x_61)) {
+      } else {
+        break;
+      }
+      let x_65 : f32 = gl_FragCoord.x;
+      let x_67 : f32 = x_9.x_GLF_uniform_float_values[0];
+      if ((x_65 < x_67)) {
+        discard;
+      }
+      let x_72 : i32 = x_7.x_GLF_uniform_int_values[2];
+      let x_75 : i32 = x_7.x_GLF_uniform_int_values[1];
+      let x_78 : i32 = x_7.x_GLF_uniform_int_values[1];
+      let x_81 : i32 = x_7.x_GLF_uniform_int_values[2];
+      x_GLF_v1 = vec4<f32>(f32(x_72), f32(x_75), f32(x_78), f32(x_81));
+
+      continuing {
+        let x_84 : i32 = j;
+        j = (x_84 + 1);
+      }
+    }
+
+    continuing {
+      let x_86 : i32 = i;
+      i = (x_86 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_v1_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_v1);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..59e50ef
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,78 @@
+cbuffer cbuffer_x_7 : register(b1, space0) {
+  uint4 x_7[3];
+};
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[2];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_v1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int i = 0;
+  int j = 0;
+  const int x_36 = asint(x_7[1].x);
+  i = x_36;
+  while (true) {
+    const int x_41 = i;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_43 = asint(x_7[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_41 < x_43)) {
+    } else {
+      break;
+    }
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const float x_47 = asfloat(x_9[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const float x_49 = asfloat(x_9[1].x);
+    if ((x_47 > x_49)) {
+      discard;
+    }
+    const int x_54 = asint(x_7[1].x);
+    j = x_54;
+    while (true) {
+      const int x_59 = j;
+      const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+      const int x_61 = asint(x_7[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+      if ((x_59 < x_61)) {
+      } else {
+        break;
+      }
+      const float x_65 = gl_FragCoord.x;
+      const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+      const float x_67 = asfloat(x_9[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+      if ((x_65 < x_67)) {
+        discard;
+      }
+      const int x_72 = asint(x_7[2].x);
+      const int x_75 = asint(x_7[1].x);
+      const int x_78 = asint(x_7[1].x);
+      const int x_81 = asint(x_7[2].x);
+      x_GLF_v1 = float4(float(x_72), float(x_75), float(x_78), float(x_81));
+      {
+        j = (j + 1);
+      }
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_v1_1;
+};
+struct tint_symbol_1 {
+  float4 gl_FragCoord_param : SV_Position;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_v1_1 : SV_Target0;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_v1};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_v1_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..a59c60d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard/0-opt.wgsl.expected.msl
@@ -0,0 +1,89 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_v1_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_v1_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_7, constant buf0& x_9, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int i = 0;
+  int j = 0;
+  int const x_36 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  i = x_36;
+  while (true) {
+    int const x_41 = i;
+    int const x_43 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_41 < x_43)) {
+    } else {
+      break;
+    }
+    float const x_47 = x_9.x_GLF_uniform_float_values.arr[0].el;
+    float const x_49 = x_9.x_GLF_uniform_float_values.arr[1].el;
+    if ((x_47 > x_49)) {
+      discard_fragment();
+    }
+    int const x_54 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    j = x_54;
+    while (true) {
+      int const x_59 = j;
+      int const x_61 = x_7.x_GLF_uniform_int_values.arr[0].el;
+      if ((x_59 < x_61)) {
+      } else {
+        break;
+      }
+      float const x_65 = (*(tint_symbol_5)).x;
+      float const x_67 = x_9.x_GLF_uniform_float_values.arr[0].el;
+      if ((x_65 < x_67)) {
+        discard_fragment();
+      }
+      int const x_72 = x_7.x_GLF_uniform_int_values.arr[2].el;
+      int const x_75 = x_7.x_GLF_uniform_int_values.arr[1].el;
+      int const x_78 = x_7.x_GLF_uniform_int_values.arr[1].el;
+      int const x_81 = x_7.x_GLF_uniform_int_values.arr[2].el;
+      *(tint_symbol_6) = float4(float(x_72), float(x_75), float(x_78), float(x_81));
+      {
+        int const x_84 = j;
+        j = (x_84 + 1);
+      }
+    }
+    {
+      int const x_86 = i;
+      i = (x_86 + 1);
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf1& x_7 [[buffer(1)]], constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_7, x_9, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_v1_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_v1_1=tint_symbol_3.x_GLF_v1_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..7d4d31d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,187 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 109
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_9 "x_9"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_v1 "x_GLF_v1"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_v1_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf1 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_7 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %float = OpTypeFloat 32
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %17
+   %x_GLF_v1 = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Private_float = OpTypePointer Private %float
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+         %96 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %23
+         %26 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %29
+          %j = OpVariable %_ptr_Function_int Function %29
+         %34 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %35 = OpLoad %int %34
+               OpStore %i %35
+               OpBranch %36
+         %36 = OpLabel
+               OpLoopMerge %37 %38 None
+               OpBranch %39
+         %39 = OpLabel
+         %40 = OpLoad %int %i
+         %42 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %43 = OpLoad %int %42
+         %44 = OpSLessThan %bool %40 %43
+               OpSelectionMerge %46 None
+               OpBranchConditional %44 %47 %48
+         %47 = OpLabel
+               OpBranch %46
+         %48 = OpLabel
+               OpBranch %37
+         %46 = OpLabel
+         %50 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_0
+         %51 = OpLoad %float %50
+         %52 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_1
+         %53 = OpLoad %float %52
+         %54 = OpFOrdGreaterThan %bool %51 %53
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %55
+         %56 = OpLabel
+               OpKill
+         %55 = OpLabel
+         %57 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %58 = OpLoad %int %57
+               OpStore %j %58
+               OpBranch %59
+         %59 = OpLabel
+               OpLoopMerge %60 %61 None
+               OpBranch %62
+         %62 = OpLabel
+         %63 = OpLoad %int %j
+         %64 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %65 = OpLoad %int %64
+         %66 = OpSLessThan %bool %63 %65
+               OpSelectionMerge %67 None
+               OpBranchConditional %66 %68 %69
+         %68 = OpLabel
+               OpBranch %67
+         %69 = OpLabel
+               OpBranch %60
+         %67 = OpLabel
+         %71 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %72 = OpLoad %float %71
+         %73 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_0
+         %74 = OpLoad %float %73
+         %75 = OpFOrdLessThan %bool %72 %74
+               OpSelectionMerge %76 None
+               OpBranchConditional %75 %77 %76
+         %77 = OpLabel
+               OpKill
+         %76 = OpLabel
+         %79 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %80 = OpLoad %int %79
+         %81 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %82 = OpLoad %int %81
+         %83 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %84 = OpLoad %int %83
+         %85 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %86 = OpLoad %int %85
+         %87 = OpConvertSToF %float %80
+         %88 = OpConvertSToF %float %82
+         %89 = OpConvertSToF %float %84
+         %90 = OpConvertSToF %float %86
+         %91 = OpCompositeConstruct %v4float %87 %88 %89 %90
+               OpStore %x_GLF_v1 %91
+               OpBranch %61
+         %61 = OpLabel
+         %92 = OpLoad %int %j
+         %93 = OpIAdd %int %92 %int_1
+               OpStore %j %93
+               OpBranch %59
+         %60 = OpLabel
+               OpBranch %38
+         %38 = OpLabel
+         %94 = OpLoad %int %i
+         %95 = OpIAdd %int %94 %int_1
+               OpStore %i %95
+               OpBranch %36
+         %37 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %96
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %100 = OpLabel
+        %101 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %101
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %23
+        %103 = OpLabel
+        %104 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %104
+        %105 = OpFunctionCall %void %main_1
+        %107 = OpLoad %v4float %x_GLF_v1
+        %108 = OpCompositeConstruct %main_out %107
+        %106 = OpFunctionCall %void %tint_symbol_3 %108
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..a5fd0d0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-register-coalescer-live-intervals-target-instr-info-for-discard-for-discard/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,84 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_v1 : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  var j : i32;
+  let x_36 : i32 = x_7.x_GLF_uniform_int_values[1];
+  i = x_36;
+  loop {
+    let x_41 : i32 = i;
+    let x_43 : i32 = x_7.x_GLF_uniform_int_values[0];
+    if ((x_41 < x_43)) {
+    } else {
+      break;
+    }
+    let x_47 : f32 = x_9.x_GLF_uniform_float_values[0];
+    let x_49 : f32 = x_9.x_GLF_uniform_float_values[1];
+    if ((x_47 > x_49)) {
+      discard;
+    }
+    let x_54 : i32 = x_7.x_GLF_uniform_int_values[1];
+    j = x_54;
+    loop {
+      let x_59 : i32 = j;
+      let x_61 : i32 = x_7.x_GLF_uniform_int_values[0];
+      if ((x_59 < x_61)) {
+      } else {
+        break;
+      }
+      let x_65 : f32 = gl_FragCoord.x;
+      let x_67 : f32 = x_9.x_GLF_uniform_float_values[0];
+      if ((x_65 < x_67)) {
+        discard;
+      }
+      let x_72 : i32 = x_7.x_GLF_uniform_int_values[2];
+      let x_75 : i32 = x_7.x_GLF_uniform_int_values[1];
+      let x_78 : i32 = x_7.x_GLF_uniform_int_values[1];
+      let x_81 : i32 = x_7.x_GLF_uniform_int_values[2];
+      x_GLF_v1 = vec4<f32>(f32(x_72), f32(x_75), f32(x_78), f32(x_81));
+
+      continuing {
+        let x_84 : i32 = j;
+        j = (x_84 + 1);
+      }
+    }
+
+    continuing {
+      let x_86 : i32 = i;
+      i = (x_86 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_v1_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_v1);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.spvasm
new file mode 100644
index 0000000..5fc3519
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.spvasm
@@ -0,0 +1,173 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %m "m"
+               OpName %f "f"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%mat2v2float = OpTypeMatrix %v2float 2
+%_ptr_Function_mat2v2float = OpTypePointer Function %mat2v2float
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+     %v2bool = OpTypeVector %bool 2
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %12
+         %34 = OpLabel
+          %m = OpVariable %_ptr_Function_mat2v2float Function
+          %f = OpVariable %_ptr_Function_float Function
+          %i = OpVariable %_ptr_Function_int Function
+          %j = OpVariable %_ptr_Function_int Function
+         %35 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %36 = OpLoad %int %35
+         %37 = OpIEqual %bool %36 %int_1
+               OpSelectionMerge %38 None
+               OpBranchConditional %37 %39 %38
+         %39 = OpLabel
+         %40 = OpLoad %float %f
+         %41 = OpCompositeConstruct %v2float %40 %float_0
+         %42 = OpCompositeConstruct %v2float %float_0 %40
+         %43 = OpCompositeConstruct %mat2v2float %41 %42
+               OpStore %m %43
+               OpBranch %38
+         %38 = OpLabel
+         %44 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %45 = OpLoad %int %44
+               OpStore %i %45
+               OpBranch %46
+         %46 = OpLabel
+               OpLoopMerge %47 %48 None
+               OpBranch %49
+         %49 = OpLabel
+         %50 = OpLoad %int %i
+         %51 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %52 = OpLoad %int %51
+         %53 = OpSLessThan %bool %50 %52
+               OpBranchConditional %53 %54 %47
+         %54 = OpLabel
+         %55 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %56 = OpLoad %int %55
+               OpStore %j %56
+               OpBranch %57
+         %57 = OpLabel
+               OpLoopMerge %58 %59 None
+               OpBranch %60
+         %60 = OpLabel
+         %61 = OpLoad %int %j
+         %62 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %63 = OpLoad %int %62
+         %64 = OpSLessThan %bool %61 %63
+               OpBranchConditional %64 %65 %58
+         %65 = OpLabel
+         %66 = OpLoad %int %i
+         %67 = OpLoad %int %j
+         %68 = OpLoad %int %i
+         %69 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %70 = OpLoad %int %69
+         %71 = OpIMul %int %68 %70
+         %72 = OpLoad %int %j
+         %73 = OpIAdd %int %71 %72
+         %74 = OpConvertSToF %float %73
+         %75 = OpAccessChain %_ptr_Function_float %m %66 %67
+               OpStore %75 %74
+               OpBranch %59
+         %59 = OpLabel
+         %76 = OpLoad %int %j
+         %77 = OpIAdd %int %76 %int_1
+               OpStore %j %77
+               OpBranch %57
+         %58 = OpLabel
+               OpBranch %48
+         %48 = OpLabel
+         %78 = OpLoad %int %i
+         %79 = OpIAdd %int %78 %int_1
+               OpStore %i %79
+               OpBranch %46
+         %47 = OpLabel
+         %80 = OpLoad %mat2v2float %m
+         %81 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %82 = OpLoad %int %81
+         %83 = OpConvertSToF %float %82
+         %84 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %85 = OpLoad %int %84
+         %86 = OpConvertSToF %float %85
+         %87 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %88 = OpLoad %int %87
+         %89 = OpConvertSToF %float %88
+         %90 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %91 = OpLoad %int %90
+         %92 = OpConvertSToF %float %91
+         %93 = OpCompositeConstruct %v2float %83 %86
+         %94 = OpCompositeConstruct %v2float %89 %92
+         %95 = OpCompositeConstruct %mat2v2float %93 %94
+         %96 = OpCompositeExtract %v2float %80 0
+         %97 = OpCompositeExtract %v2float %95 0
+         %98 = OpFOrdEqual %v2bool %96 %97
+         %99 = OpAll %bool %98
+        %100 = OpCompositeExtract %v2float %80 1
+        %101 = OpCompositeExtract %v2float %95 1
+        %102 = OpFOrdEqual %v2bool %100 %101
+        %103 = OpAll %bool %102
+        %104 = OpLogicalAnd %bool %99 %103
+               OpSelectionMerge %105 None
+               OpBranchConditional %104 %106 %107
+        %106 = OpLabel
+        %108 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+        %109 = OpLoad %int %108
+        %110 = OpConvertSToF %float %109
+        %111 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+        %112 = OpLoad %int %111
+        %113 = OpConvertSToF %float %112
+        %114 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+        %115 = OpLoad %int %114
+        %116 = OpConvertSToF %float %115
+        %117 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+        %118 = OpLoad %int %117
+        %119 = OpConvertSToF %float %118
+        %120 = OpCompositeConstruct %v4float %110 %113 %116 %119
+               OpStore %_GLF_color %120
+               OpBranch %105
+        %107 = OpLabel
+        %121 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+        %122 = OpLoad %int %121
+        %123 = OpConvertSToF %float %122
+        %124 = OpCompositeConstruct %v4float %123 %123 %123 %123
+               OpStore %_GLF_color %124
+               OpBranch %105
+        %105 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..34889ee
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,91 @@
+void set_float2(inout float2 vec, int idx, float val) {
+  vec = (idx.xx == int2(0, 1)) ? val.xx : vec;
+}
+
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2x2 m = float2x2(0.0f, 0.0f, 0.0f, 0.0f);
+  float f = 0.0f;
+  int i = 0;
+  int j = 0;
+  const int x_36 = asint(x_5[1].x);
+  if ((x_36 == 1)) {
+    const float x_40 = f;
+    m = float2x2(float2(x_40, 0.0f), float2(0.0f, x_40));
+  }
+  const int x_45 = asint(x_5[1].x);
+  i = x_45;
+  while (true) {
+    const int x_50 = i;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_52 = asint(x_5[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_50 < x_52)) {
+    } else {
+      break;
+    }
+    const int x_56 = asint(x_5[1].x);
+    j = x_56;
+    while (true) {
+      const int x_61 = j;
+      const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+      const int x_63 = asint(x_5[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+      if ((x_61 < x_63)) {
+      } else {
+        break;
+      }
+      const int x_66 = i;
+      const int x_67 = j;
+      const int x_68 = i;
+      const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+      const int x_70 = asint(x_5[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+      set_float2(m[x_66], x_67, float(((x_68 * x_70) + j)));
+      {
+        j = (j + 1);
+      }
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  const float2x2 x_80 = m;
+  const int x_82 = asint(x_5[1].x);
+  const int x_85 = asint(x_5[2].x);
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const int x_88 = asint(x_5[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  const int x_91 = asint(x_5[3].x);
+  const float2x2 x_95 = float2x2(float2(float(x_82), float(x_85)), float2(float(x_88), float(x_91)));
+  bool tint_tmp = all((x_80[0u] == x_95[0u]));
+  if (tint_tmp) {
+    tint_tmp = all((x_80[1u] == x_95[1u]));
+  }
+  if ((tint_tmp)) {
+    const int x_109 = asint(x_5[2].x);
+    const int x_112 = asint(x_5[1].x);
+    const int x_115 = asint(x_5[1].x);
+    const int x_118 = asint(x_5[2].x);
+    x_GLF_color = float4(float(x_109), float(x_112), float(x_115), float(x_118));
+  } else {
+    const int x_122 = asint(x_5[1].x);
+    const float x_123 = float(x_122);
+    x_GLF_color = float4(x_123, x_123, x_123, x_123);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..d6a3fcf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.spvasm.expected.msl
@@ -0,0 +1,92 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  float2x2 m = float2x2(0.0f);
+  float f = 0.0f;
+  int i = 0;
+  int j = 0;
+  int const x_36 = x_5.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_36 == 1)) {
+    float const x_40 = f;
+    m = float2x2(float2(x_40, 0.0f), float2(0.0f, x_40));
+  }
+  int const x_45 = x_5.x_GLF_uniform_int_values.arr[1].el;
+  i = x_45;
+  while (true) {
+    int const x_50 = i;
+    int const x_52 = x_5.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_50 < x_52)) {
+    } else {
+      break;
+    }
+    int const x_56 = x_5.x_GLF_uniform_int_values.arr[1].el;
+    j = x_56;
+    while (true) {
+      int const x_61 = j;
+      int const x_63 = x_5.x_GLF_uniform_int_values.arr[0].el;
+      if ((x_61 < x_63)) {
+      } else {
+        break;
+      }
+      int const x_66 = i;
+      int const x_67 = j;
+      int const x_68 = i;
+      int const x_70 = x_5.x_GLF_uniform_int_values.arr[0].el;
+      int const x_72 = j;
+      m[x_66][x_67] = float(((x_68 * x_70) + x_72));
+      {
+        int const x_76 = j;
+        j = (x_76 + 1);
+      }
+    }
+    {
+      int const x_78 = i;
+      i = (x_78 + 1);
+    }
+  }
+  float2x2 const x_80 = m;
+  int const x_82 = x_5.x_GLF_uniform_int_values.arr[1].el;
+  int const x_85 = x_5.x_GLF_uniform_int_values.arr[2].el;
+  int const x_88 = x_5.x_GLF_uniform_int_values.arr[0].el;
+  int const x_91 = x_5.x_GLF_uniform_int_values.arr[3].el;
+  float2x2 const x_95 = float2x2(float2(float(x_82), float(x_85)), float2(float(x_88), float(x_91)));
+  if ((all((x_80[0u] == x_95[0u])) && all((x_80[1u] == x_95[1u])))) {
+    int const x_109 = x_5.x_GLF_uniform_int_values.arr[2].el;
+    int const x_112 = x_5.x_GLF_uniform_int_values.arr[1].el;
+    int const x_115 = x_5.x_GLF_uniform_int_values.arr[1].el;
+    int const x_118 = x_5.x_GLF_uniform_int_values.arr[2].el;
+    *(tint_symbol_4) = float4(float(x_109), float(x_112), float(x_115), float(x_118));
+  } else {
+    int const x_122 = x_5.x_GLF_uniform_int_values.arr[1].el;
+    float const x_123 = float(x_122);
+    *(tint_symbol_4) = float4(x_123, x_123, x_123, x_123);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..2f12b21
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,223 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 149
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %m "m"
+               OpName %f "f"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%mat2v2float = OpTypeMatrix %v2float 2
+%_ptr_Function_mat2v2float = OpTypePointer Function %mat2v2float
+         %23 = OpConstantNull %mat2v2float
+%_ptr_Function_float = OpTypePointer Function %float
+         %26 = OpConstantNull %float
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+     %v2bool = OpTypeVector %bool 2
+     %uint_1 = OpConstant %uint 1
+   %main_out = OpTypeStruct %v4float
+        %137 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %m = OpVariable %_ptr_Function_mat2v2float Function %23
+          %f = OpVariable %_ptr_Function_float Function %26
+          %i = OpVariable %_ptr_Function_int Function %29
+          %j = OpVariable %_ptr_Function_int Function %29
+         %34 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %35 = OpLoad %int %34
+         %36 = OpIEqual %bool %35 %int_1
+               OpSelectionMerge %38 None
+               OpBranchConditional %36 %39 %38
+         %39 = OpLabel
+         %40 = OpLoad %float %f
+         %42 = OpCompositeConstruct %v2float %40 %float_0
+         %43 = OpCompositeConstruct %v2float %float_0 %40
+         %44 = OpCompositeConstruct %mat2v2float %42 %43
+               OpStore %m %44
+               OpBranch %38
+         %38 = OpLabel
+         %45 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %46 = OpLoad %int %45
+               OpStore %i %46
+               OpBranch %47
+         %47 = OpLabel
+               OpLoopMerge %48 %49 None
+               OpBranch %50
+         %50 = OpLabel
+         %51 = OpLoad %int %i
+         %53 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %54 = OpLoad %int %53
+         %55 = OpSLessThan %bool %51 %54
+               OpSelectionMerge %56 None
+               OpBranchConditional %55 %57 %58
+         %57 = OpLabel
+               OpBranch %56
+         %58 = OpLabel
+               OpBranch %48
+         %56 = OpLabel
+         %59 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %60 = OpLoad %int %59
+               OpStore %j %60
+               OpBranch %61
+         %61 = OpLabel
+               OpLoopMerge %62 %63 None
+               OpBranch %64
+         %64 = OpLabel
+         %65 = OpLoad %int %j
+         %66 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %67 = OpLoad %int %66
+         %68 = OpSLessThan %bool %65 %67
+               OpSelectionMerge %69 None
+               OpBranchConditional %68 %70 %71
+         %70 = OpLabel
+               OpBranch %69
+         %71 = OpLabel
+               OpBranch %62
+         %69 = OpLabel
+         %72 = OpLoad %int %i
+         %73 = OpLoad %int %j
+         %74 = OpLoad %int %i
+         %75 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %76 = OpLoad %int %75
+         %77 = OpLoad %int %j
+         %78 = OpAccessChain %_ptr_Function_float %m %72 %73
+         %80 = OpIMul %int %74 %76
+         %81 = OpIAdd %int %80 %77
+         %79 = OpConvertSToF %float %81
+               OpStore %78 %79
+               OpBranch %63
+         %63 = OpLabel
+         %82 = OpLoad %int %j
+         %83 = OpIAdd %int %82 %int_1
+               OpStore %j %83
+               OpBranch %61
+         %62 = OpLabel
+               OpBranch %49
+         %49 = OpLabel
+         %84 = OpLoad %int %i
+         %85 = OpIAdd %int %84 %int_1
+               OpStore %i %85
+               OpBranch %47
+         %48 = OpLabel
+         %86 = OpLoad %mat2v2float %m
+         %87 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %88 = OpLoad %int %87
+         %90 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_2
+         %91 = OpLoad %int %90
+         %92 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %93 = OpLoad %int %92
+         %95 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_3
+         %96 = OpLoad %int %95
+         %97 = OpConvertSToF %float %88
+         %98 = OpConvertSToF %float %91
+         %99 = OpCompositeConstruct %v2float %97 %98
+        %100 = OpConvertSToF %float %93
+        %101 = OpConvertSToF %float %96
+        %102 = OpCompositeConstruct %v2float %100 %101
+        %103 = OpCompositeConstruct %mat2v2float %99 %102
+        %105 = OpCompositeExtract %v2float %86 0
+        %106 = OpCompositeExtract %v2float %103 0
+        %107 = OpFOrdEqual %v2bool %105 %106
+        %104 = OpAll %bool %107
+               OpSelectionMerge %109 None
+               OpBranchConditional %104 %110 %109
+        %110 = OpLabel
+        %113 = OpCompositeExtract %v2float %86 1
+        %114 = OpCompositeExtract %v2float %103 1
+        %115 = OpFOrdEqual %v2bool %113 %114
+        %111 = OpAll %bool %115
+               OpBranch %109
+        %109 = OpLabel
+        %116 = OpPhi %bool %104 %48 %111 %110
+               OpSelectionMerge %117 None
+               OpBranchConditional %116 %118 %119
+        %118 = OpLabel
+        %120 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_2
+        %121 = OpLoad %int %120
+        %122 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+        %123 = OpLoad %int %122
+        %124 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+        %125 = OpLoad %int %124
+        %126 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_2
+        %127 = OpLoad %int %126
+        %128 = OpConvertSToF %float %121
+        %129 = OpConvertSToF %float %123
+        %130 = OpConvertSToF %float %125
+        %131 = OpConvertSToF %float %127
+        %132 = OpCompositeConstruct %v4float %128 %129 %130 %131
+               OpStore %x_GLF_color %132
+               OpBranch %117
+        %119 = OpLabel
+        %133 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+        %134 = OpLoad %int %133
+        %135 = OpConvertSToF %float %134
+        %136 = OpCompositeConstruct %v4float %135 %135 %135 %135
+               OpStore %x_GLF_color %136
+               OpBranch %117
+        %117 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %137
+%tint_symbol = OpFunctionParameter %main_out
+        %141 = OpLabel
+        %142 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %142
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %144 = OpLabel
+        %145 = OpFunctionCall %void %main_1
+        %147 = OpLoad %v4float %x_GLF_color
+        %148 = OpCompositeConstruct %main_out %147
+        %146 = OpFunctionCall %void %tint_symbol_2 %148
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..3ad4f9b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,87 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m : mat2x2<f32>;
+  var f : f32;
+  var i : i32;
+  var j : i32;
+  let x_36 : i32 = x_5.x_GLF_uniform_int_values[1];
+  if ((x_36 == 1)) {
+    let x_40 : f32 = f;
+    m = mat2x2<f32>(vec2<f32>(x_40, 0.0), vec2<f32>(0.0, x_40));
+  }
+  let x_45 : i32 = x_5.x_GLF_uniform_int_values[1];
+  i = x_45;
+  loop {
+    let x_50 : i32 = i;
+    let x_52 : i32 = x_5.x_GLF_uniform_int_values[0];
+    if ((x_50 < x_52)) {
+    } else {
+      break;
+    }
+    let x_56 : i32 = x_5.x_GLF_uniform_int_values[1];
+    j = x_56;
+    loop {
+      let x_61 : i32 = j;
+      let x_63 : i32 = x_5.x_GLF_uniform_int_values[0];
+      if ((x_61 < x_63)) {
+      } else {
+        break;
+      }
+      let x_66 : i32 = i;
+      let x_67 : i32 = j;
+      let x_68 : i32 = i;
+      let x_70 : i32 = x_5.x_GLF_uniform_int_values[0];
+      let x_72 : i32 = j;
+      m[x_66][x_67] = f32(((x_68 * x_70) + x_72));
+
+      continuing {
+        let x_76 : i32 = j;
+        j = (x_76 + 1);
+      }
+    }
+
+    continuing {
+      let x_78 : i32 = i;
+      i = (x_78 + 1);
+    }
+  }
+  let x_80 : mat2x2<f32> = m;
+  let x_82 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_85 : i32 = x_5.x_GLF_uniform_int_values[2];
+  let x_88 : i32 = x_5.x_GLF_uniform_int_values[0];
+  let x_91 : i32 = x_5.x_GLF_uniform_int_values[3];
+  let x_95 : mat2x2<f32> = mat2x2<f32>(vec2<f32>(f32(x_82), f32(x_85)), vec2<f32>(f32(x_88), f32(x_91)));
+  if ((all((x_80[0u] == x_95[0u])) && all((x_80[1u] == x_95[1u])))) {
+    let x_109 : i32 = x_5.x_GLF_uniform_int_values[2];
+    let x_112 : i32 = x_5.x_GLF_uniform_int_values[1];
+    let x_115 : i32 = x_5.x_GLF_uniform_int_values[1];
+    let x_118 : i32 = x_5.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_109), f32(x_112), f32(x_115), f32(x_118));
+  } else {
+    let x_122 : i32 = x_5.x_GLF_uniform_int_values[1];
+    let x_123 : f32 = f32(x_122);
+    x_GLF_color = vec4<f32>(x_123, x_123, x_123, x_123);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.wgsl
new file mode 100644
index 0000000..3ad4f9b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.wgsl
@@ -0,0 +1,87 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m : mat2x2<f32>;
+  var f : f32;
+  var i : i32;
+  var j : i32;
+  let x_36 : i32 = x_5.x_GLF_uniform_int_values[1];
+  if ((x_36 == 1)) {
+    let x_40 : f32 = f;
+    m = mat2x2<f32>(vec2<f32>(x_40, 0.0), vec2<f32>(0.0, x_40));
+  }
+  let x_45 : i32 = x_5.x_GLF_uniform_int_values[1];
+  i = x_45;
+  loop {
+    let x_50 : i32 = i;
+    let x_52 : i32 = x_5.x_GLF_uniform_int_values[0];
+    if ((x_50 < x_52)) {
+    } else {
+      break;
+    }
+    let x_56 : i32 = x_5.x_GLF_uniform_int_values[1];
+    j = x_56;
+    loop {
+      let x_61 : i32 = j;
+      let x_63 : i32 = x_5.x_GLF_uniform_int_values[0];
+      if ((x_61 < x_63)) {
+      } else {
+        break;
+      }
+      let x_66 : i32 = i;
+      let x_67 : i32 = j;
+      let x_68 : i32 = i;
+      let x_70 : i32 = x_5.x_GLF_uniform_int_values[0];
+      let x_72 : i32 = j;
+      m[x_66][x_67] = f32(((x_68 * x_70) + x_72));
+
+      continuing {
+        let x_76 : i32 = j;
+        j = (x_76 + 1);
+      }
+    }
+
+    continuing {
+      let x_78 : i32 = i;
+      i = (x_78 + 1);
+    }
+  }
+  let x_80 : mat2x2<f32> = m;
+  let x_82 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_85 : i32 = x_5.x_GLF_uniform_int_values[2];
+  let x_88 : i32 = x_5.x_GLF_uniform_int_values[0];
+  let x_91 : i32 = x_5.x_GLF_uniform_int_values[3];
+  let x_95 : mat2x2<f32> = mat2x2<f32>(vec2<f32>(f32(x_82), f32(x_85)), vec2<f32>(f32(x_88), f32(x_91)));
+  if ((all((x_80[0u] == x_95[0u])) && all((x_80[1u] == x_95[1u])))) {
+    let x_109 : i32 = x_5.x_GLF_uniform_int_values[2];
+    let x_112 : i32 = x_5.x_GLF_uniform_int_values[1];
+    let x_115 : i32 = x_5.x_GLF_uniform_int_values[1];
+    let x_118 : i32 = x_5.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_109), f32(x_112), f32(x_115), f32(x_118));
+  } else {
+    let x_122 : i32 = x_5.x_GLF_uniform_int_values[1];
+    let x_123 : f32 = f32(x_122);
+    x_GLF_color = vec4<f32>(x_123, x_123, x_123, x_123);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..34889ee
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,91 @@
+void set_float2(inout float2 vec, int idx, float val) {
+  vec = (idx.xx == int2(0, 1)) ? val.xx : vec;
+}
+
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2x2 m = float2x2(0.0f, 0.0f, 0.0f, 0.0f);
+  float f = 0.0f;
+  int i = 0;
+  int j = 0;
+  const int x_36 = asint(x_5[1].x);
+  if ((x_36 == 1)) {
+    const float x_40 = f;
+    m = float2x2(float2(x_40, 0.0f), float2(0.0f, x_40));
+  }
+  const int x_45 = asint(x_5[1].x);
+  i = x_45;
+  while (true) {
+    const int x_50 = i;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_52 = asint(x_5[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_50 < x_52)) {
+    } else {
+      break;
+    }
+    const int x_56 = asint(x_5[1].x);
+    j = x_56;
+    while (true) {
+      const int x_61 = j;
+      const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+      const int x_63 = asint(x_5[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+      if ((x_61 < x_63)) {
+      } else {
+        break;
+      }
+      const int x_66 = i;
+      const int x_67 = j;
+      const int x_68 = i;
+      const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+      const int x_70 = asint(x_5[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+      set_float2(m[x_66], x_67, float(((x_68 * x_70) + j)));
+      {
+        j = (j + 1);
+      }
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  const float2x2 x_80 = m;
+  const int x_82 = asint(x_5[1].x);
+  const int x_85 = asint(x_5[2].x);
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const int x_88 = asint(x_5[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  const int x_91 = asint(x_5[3].x);
+  const float2x2 x_95 = float2x2(float2(float(x_82), float(x_85)), float2(float(x_88), float(x_91)));
+  bool tint_tmp = all((x_80[0u] == x_95[0u]));
+  if (tint_tmp) {
+    tint_tmp = all((x_80[1u] == x_95[1u]));
+  }
+  if ((tint_tmp)) {
+    const int x_109 = asint(x_5[2].x);
+    const int x_112 = asint(x_5[1].x);
+    const int x_115 = asint(x_5[1].x);
+    const int x_118 = asint(x_5[2].x);
+    x_GLF_color = float4(float(x_109), float(x_112), float(x_115), float(x_118));
+  } else {
+    const int x_122 = asint(x_5[1].x);
+    const float x_123 = float(x_122);
+    x_GLF_color = float4(x_123, x_123, x_123, x_123);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..d6a3fcf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.wgsl.expected.msl
@@ -0,0 +1,92 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  float2x2 m = float2x2(0.0f);
+  float f = 0.0f;
+  int i = 0;
+  int j = 0;
+  int const x_36 = x_5.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_36 == 1)) {
+    float const x_40 = f;
+    m = float2x2(float2(x_40, 0.0f), float2(0.0f, x_40));
+  }
+  int const x_45 = x_5.x_GLF_uniform_int_values.arr[1].el;
+  i = x_45;
+  while (true) {
+    int const x_50 = i;
+    int const x_52 = x_5.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_50 < x_52)) {
+    } else {
+      break;
+    }
+    int const x_56 = x_5.x_GLF_uniform_int_values.arr[1].el;
+    j = x_56;
+    while (true) {
+      int const x_61 = j;
+      int const x_63 = x_5.x_GLF_uniform_int_values.arr[0].el;
+      if ((x_61 < x_63)) {
+      } else {
+        break;
+      }
+      int const x_66 = i;
+      int const x_67 = j;
+      int const x_68 = i;
+      int const x_70 = x_5.x_GLF_uniform_int_values.arr[0].el;
+      int const x_72 = j;
+      m[x_66][x_67] = float(((x_68 * x_70) + x_72));
+      {
+        int const x_76 = j;
+        j = (x_76 + 1);
+      }
+    }
+    {
+      int const x_78 = i;
+      i = (x_78 + 1);
+    }
+  }
+  float2x2 const x_80 = m;
+  int const x_82 = x_5.x_GLF_uniform_int_values.arr[1].el;
+  int const x_85 = x_5.x_GLF_uniform_int_values.arr[2].el;
+  int const x_88 = x_5.x_GLF_uniform_int_values.arr[0].el;
+  int const x_91 = x_5.x_GLF_uniform_int_values.arr[3].el;
+  float2x2 const x_95 = float2x2(float2(float(x_82), float(x_85)), float2(float(x_88), float(x_91)));
+  if ((all((x_80[0u] == x_95[0u])) && all((x_80[1u] == x_95[1u])))) {
+    int const x_109 = x_5.x_GLF_uniform_int_values.arr[2].el;
+    int const x_112 = x_5.x_GLF_uniform_int_values.arr[1].el;
+    int const x_115 = x_5.x_GLF_uniform_int_values.arr[1].el;
+    int const x_118 = x_5.x_GLF_uniform_int_values.arr[2].el;
+    *(tint_symbol_4) = float4(float(x_109), float(x_112), float(x_115), float(x_118));
+  } else {
+    int const x_122 = x_5.x_GLF_uniform_int_values.arr[1].el;
+    float const x_123 = float(x_122);
+    *(tint_symbol_4) = float4(x_123, x_123, x_123, x_123);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..2f12b21
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,223 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 149
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %m "m"
+               OpName %f "f"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%mat2v2float = OpTypeMatrix %v2float 2
+%_ptr_Function_mat2v2float = OpTypePointer Function %mat2v2float
+         %23 = OpConstantNull %mat2v2float
+%_ptr_Function_float = OpTypePointer Function %float
+         %26 = OpConstantNull %float
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+     %v2bool = OpTypeVector %bool 2
+     %uint_1 = OpConstant %uint 1
+   %main_out = OpTypeStruct %v4float
+        %137 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %m = OpVariable %_ptr_Function_mat2v2float Function %23
+          %f = OpVariable %_ptr_Function_float Function %26
+          %i = OpVariable %_ptr_Function_int Function %29
+          %j = OpVariable %_ptr_Function_int Function %29
+         %34 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %35 = OpLoad %int %34
+         %36 = OpIEqual %bool %35 %int_1
+               OpSelectionMerge %38 None
+               OpBranchConditional %36 %39 %38
+         %39 = OpLabel
+         %40 = OpLoad %float %f
+         %42 = OpCompositeConstruct %v2float %40 %float_0
+         %43 = OpCompositeConstruct %v2float %float_0 %40
+         %44 = OpCompositeConstruct %mat2v2float %42 %43
+               OpStore %m %44
+               OpBranch %38
+         %38 = OpLabel
+         %45 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %46 = OpLoad %int %45
+               OpStore %i %46
+               OpBranch %47
+         %47 = OpLabel
+               OpLoopMerge %48 %49 None
+               OpBranch %50
+         %50 = OpLabel
+         %51 = OpLoad %int %i
+         %53 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %54 = OpLoad %int %53
+         %55 = OpSLessThan %bool %51 %54
+               OpSelectionMerge %56 None
+               OpBranchConditional %55 %57 %58
+         %57 = OpLabel
+               OpBranch %56
+         %58 = OpLabel
+               OpBranch %48
+         %56 = OpLabel
+         %59 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %60 = OpLoad %int %59
+               OpStore %j %60
+               OpBranch %61
+         %61 = OpLabel
+               OpLoopMerge %62 %63 None
+               OpBranch %64
+         %64 = OpLabel
+         %65 = OpLoad %int %j
+         %66 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %67 = OpLoad %int %66
+         %68 = OpSLessThan %bool %65 %67
+               OpSelectionMerge %69 None
+               OpBranchConditional %68 %70 %71
+         %70 = OpLabel
+               OpBranch %69
+         %71 = OpLabel
+               OpBranch %62
+         %69 = OpLabel
+         %72 = OpLoad %int %i
+         %73 = OpLoad %int %j
+         %74 = OpLoad %int %i
+         %75 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %76 = OpLoad %int %75
+         %77 = OpLoad %int %j
+         %78 = OpAccessChain %_ptr_Function_float %m %72 %73
+         %80 = OpIMul %int %74 %76
+         %81 = OpIAdd %int %80 %77
+         %79 = OpConvertSToF %float %81
+               OpStore %78 %79
+               OpBranch %63
+         %63 = OpLabel
+         %82 = OpLoad %int %j
+         %83 = OpIAdd %int %82 %int_1
+               OpStore %j %83
+               OpBranch %61
+         %62 = OpLabel
+               OpBranch %49
+         %49 = OpLabel
+         %84 = OpLoad %int %i
+         %85 = OpIAdd %int %84 %int_1
+               OpStore %i %85
+               OpBranch %47
+         %48 = OpLabel
+         %86 = OpLoad %mat2v2float %m
+         %87 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %88 = OpLoad %int %87
+         %90 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_2
+         %91 = OpLoad %int %90
+         %92 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %93 = OpLoad %int %92
+         %95 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_3
+         %96 = OpLoad %int %95
+         %97 = OpConvertSToF %float %88
+         %98 = OpConvertSToF %float %91
+         %99 = OpCompositeConstruct %v2float %97 %98
+        %100 = OpConvertSToF %float %93
+        %101 = OpConvertSToF %float %96
+        %102 = OpCompositeConstruct %v2float %100 %101
+        %103 = OpCompositeConstruct %mat2v2float %99 %102
+        %105 = OpCompositeExtract %v2float %86 0
+        %106 = OpCompositeExtract %v2float %103 0
+        %107 = OpFOrdEqual %v2bool %105 %106
+        %104 = OpAll %bool %107
+               OpSelectionMerge %109 None
+               OpBranchConditional %104 %110 %109
+        %110 = OpLabel
+        %113 = OpCompositeExtract %v2float %86 1
+        %114 = OpCompositeExtract %v2float %103 1
+        %115 = OpFOrdEqual %v2bool %113 %114
+        %111 = OpAll %bool %115
+               OpBranch %109
+        %109 = OpLabel
+        %116 = OpPhi %bool %104 %48 %111 %110
+               OpSelectionMerge %117 None
+               OpBranchConditional %116 %118 %119
+        %118 = OpLabel
+        %120 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_2
+        %121 = OpLoad %int %120
+        %122 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+        %123 = OpLoad %int %122
+        %124 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+        %125 = OpLoad %int %124
+        %126 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_2
+        %127 = OpLoad %int %126
+        %128 = OpConvertSToF %float %121
+        %129 = OpConvertSToF %float %123
+        %130 = OpConvertSToF %float %125
+        %131 = OpConvertSToF %float %127
+        %132 = OpCompositeConstruct %v4float %128 %129 %130 %131
+               OpStore %x_GLF_color %132
+               OpBranch %117
+        %119 = OpLabel
+        %133 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+        %134 = OpLoad %int %133
+        %135 = OpConvertSToF %float %134
+        %136 = OpCompositeConstruct %v4float %135 %135 %135 %135
+               OpStore %x_GLF_color %136
+               OpBranch %117
+        %117 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %137
+%tint_symbol = OpFunctionParameter %main_out
+        %141 = OpLabel
+        %142 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %142
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %144 = OpLabel
+        %145 = OpFunctionCall %void %main_1
+        %147 = OpLoad %v4float %x_GLF_color
+        %148 = OpCompositeConstruct %main_out %147
+        %146 = OpFunctionCall %void %tint_symbol_2 %148
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..3ad4f9b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,87 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m : mat2x2<f32>;
+  var f : f32;
+  var i : i32;
+  var j : i32;
+  let x_36 : i32 = x_5.x_GLF_uniform_int_values[1];
+  if ((x_36 == 1)) {
+    let x_40 : f32 = f;
+    m = mat2x2<f32>(vec2<f32>(x_40, 0.0), vec2<f32>(0.0, x_40));
+  }
+  let x_45 : i32 = x_5.x_GLF_uniform_int_values[1];
+  i = x_45;
+  loop {
+    let x_50 : i32 = i;
+    let x_52 : i32 = x_5.x_GLF_uniform_int_values[0];
+    if ((x_50 < x_52)) {
+    } else {
+      break;
+    }
+    let x_56 : i32 = x_5.x_GLF_uniform_int_values[1];
+    j = x_56;
+    loop {
+      let x_61 : i32 = j;
+      let x_63 : i32 = x_5.x_GLF_uniform_int_values[0];
+      if ((x_61 < x_63)) {
+      } else {
+        break;
+      }
+      let x_66 : i32 = i;
+      let x_67 : i32 = j;
+      let x_68 : i32 = i;
+      let x_70 : i32 = x_5.x_GLF_uniform_int_values[0];
+      let x_72 : i32 = j;
+      m[x_66][x_67] = f32(((x_68 * x_70) + x_72));
+
+      continuing {
+        let x_76 : i32 = j;
+        j = (x_76 + 1);
+      }
+    }
+
+    continuing {
+      let x_78 : i32 = i;
+      i = (x_78 + 1);
+    }
+  }
+  let x_80 : mat2x2<f32> = m;
+  let x_82 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_85 : i32 = x_5.x_GLF_uniform_int_values[2];
+  let x_88 : i32 = x_5.x_GLF_uniform_int_values[0];
+  let x_91 : i32 = x_5.x_GLF_uniform_int_values[3];
+  let x_95 : mat2x2<f32> = mat2x2<f32>(vec2<f32>(f32(x_82), f32(x_85)), vec2<f32>(f32(x_88), f32(x_91)));
+  if ((all((x_80[0u] == x_95[0u])) && all((x_80[1u] == x_95[1u])))) {
+    let x_109 : i32 = x_5.x_GLF_uniform_int_values[2];
+    let x_112 : i32 = x_5.x_GLF_uniform_int_values[1];
+    let x_115 : i32 = x_5.x_GLF_uniform_int_values[1];
+    let x_118 : i32 = x_5.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_109), f32(x_112), f32(x_115), f32(x_118));
+  } else {
+    let x_122 : i32 = x_5.x_GLF_uniform_int_values[1];
+    let x_123 : f32 = f32(x_122);
+    x_GLF_color = vec4<f32>(x_123, x_123, x_123, x_123);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-replace-copy-object/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-replace-copy-object/0-opt.spvasm
new file mode 100644
index 0000000..cb7eca1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-replace-copy-object/0-opt.spvasm
@@ -0,0 +1,177 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %S "S"
+               OpMemberName %S 0 "data"
+               OpName %func_struct_S_i11_i1_ "func(struct-S-i11;i1;"
+               OpName %s "s"
+               OpName %x "x"
+               OpName %a "a"
+               OpName %arr "arr"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %param_1 "param"
+               OpName %param_2 "param"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %S 0 RelaxedPrecision
+               OpDecorate %func_struct_S_i11_i1_ RelaxedPrecision
+               OpDecorate %x RelaxedPrecision
+               OpDecorate %17 RelaxedPrecision
+               OpDecorate %18 RelaxedPrecision
+               OpDecorate %19 RelaxedPrecision
+               OpDecorate %20 RelaxedPrecision
+               OpDecorate %21 RelaxedPrecision
+               OpDecorate %a RelaxedPrecision
+               OpMemberDecorate %buf0 0 RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %22 RelaxedPrecision
+               OpDecorate %i RelaxedPrecision
+               OpDecorate %23 RelaxedPrecision
+               OpDecorate %24 RelaxedPrecision
+               OpDecorate %25 RelaxedPrecision
+               OpDecorate %26 RelaxedPrecision
+               OpDecorate %27 RelaxedPrecision
+               OpDecorate %28 RelaxedPrecision
+               OpDecorate %29 RelaxedPrecision
+               OpDecorate %30 RelaxedPrecision
+               OpDecorate %31 RelaxedPrecision
+               OpDecorate %32 RelaxedPrecision
+               OpDecorate %33 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %35 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+          %S = OpTypeStruct %int
+%_ptr_Function_S = OpTypePointer Function %S
+%_ptr_Function_int = OpTypePointer Function %int
+         %39 = OpTypeFunction %int %_ptr_Function_S %_ptr_Function_int
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_S_uint_1 = OpTypeArray %S %uint_1
+%_ptr_Function__arr_S_uint_1 = OpTypePointer Function %_arr_S_uint_1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_5 = OpConstant %int 5
+      %int_2 = OpConstant %int 2
+      %int_6 = OpConstant %int 6
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %57 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %58 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %35
+         %59 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+        %arr = OpVariable %_ptr_Function__arr_S_uint_1 Function
+          %i = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_S Function
+    %param_0 = OpVariable %_ptr_Function_int Function
+    %param_1 = OpVariable %_ptr_Function_S Function
+    %param_2 = OpVariable %_ptr_Function_int Function
+               OpStore %a %int_0
+         %60 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %22 = OpLoad %int %60
+         %61 = OpAccessChain %_ptr_Function_int %arr %int_0 %int_0
+               OpStore %61 %22
+               OpStore %i %int_0
+               OpBranch %62
+         %62 = OpLabel
+               OpLoopMerge %63 %64 None
+               OpBranch %65
+         %65 = OpLabel
+         %23 = OpLoad %int %i
+         %66 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %24 = OpLoad %int %66
+         %25 = OpIAdd %int %int_5 %24
+         %67 = OpSLessThan %bool %23 %25
+               OpBranchConditional %67 %68 %63
+         %68 = OpLabel
+         %26 = OpLoad %int %i
+         %27 = OpSMod %int %26 %int_2
+         %69 = OpINotEqual %bool %27 %int_0
+               OpSelectionMerge %70 None
+               OpBranchConditional %69 %71 %72
+         %71 = OpLabel
+         %73 = OpAccessChain %_ptr_Function_S %arr %int_0
+         %74 = OpLoad %S %73
+               OpStore %param %74
+         %28 = OpLoad %int %i
+               OpStore %param_0 %28
+         %29 = OpFunctionCall %int %func_struct_S_i11_i1_ %param %param_0
+         %75 = OpLoad %S %param
+         %76 = OpAccessChain %_ptr_Function_S %arr %int_0
+               OpStore %76 %75
+               OpStore %a %29
+               OpBranch %70
+         %72 = OpLabel
+         %77 = OpAccessChain %_ptr_Function_S %arr %int_0
+         %78 = OpLoad %S %77
+               OpStore %param_1 %78
+               OpStore %param_2 %int_1
+         %30 = OpFunctionCall %int %func_struct_S_i11_i1_ %param_1 %param_2
+         %79 = OpLoad %S %param_1
+         %80 = OpAccessChain %_ptr_Function_S %arr %int_0
+               OpStore %80 %79
+               OpStore %a %30
+               OpBranch %70
+         %70 = OpLabel
+               OpBranch %64
+         %64 = OpLabel
+         %31 = OpLoad %int %i
+         %32 = OpIAdd %int %31 %int_1
+               OpStore %i %32
+               OpBranch %62
+         %63 = OpLabel
+         %33 = OpLoad %int %a
+         %81 = OpIEqual %bool %33 %int_6
+               OpSelectionMerge %82 None
+               OpBranchConditional %81 %83 %84
+         %83 = OpLabel
+               OpStore %_GLF_color %57
+               OpBranch %82
+         %84 = OpLabel
+               OpStore %_GLF_color %58
+               OpBranch %82
+         %82 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%func_struct_S_i11_i1_ = OpFunction %int None %39
+          %s = OpFunctionParameter %_ptr_Function_S
+          %x = OpFunctionParameter %_ptr_Function_int
+         %85 = OpLabel
+         %86 = OpAccessChain %_ptr_Function_int %s %int_0
+         %17 = OpLoad %int %86
+         %87 = OpIEqual %bool %17 %int_1
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %90
+         %89 = OpLabel
+         %18 = OpLoad %int %x
+         %91 = OpAccessChain %_ptr_Function_int %s %int_0
+         %19 = OpLoad %int %91
+         %20 = OpIAdd %int %18 %19
+               OpReturnValue %20
+         %90 = OpLabel
+         %21 = OpLoad %int %x
+               OpReturnValue %21
+         %88 = OpLabel
+               OpUnreachable
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-replace-copy-object/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-replace-copy-object/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..c226607
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-replace-copy-object/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,81 @@
+struct S {
+  int data;
+};
+
+cbuffer cbuffer_x_11 : register(b0, space0) {
+  uint4 x_11[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+int func_struct_S_i11_i1_(inout S s, inout int x) {
+  const int x_17 = s.data;
+  if ((x_17 == 1)) {
+    const int x_18 = x;
+    const int x_19 = s.data;
+    return (x_18 + x_19);
+  } else {
+    const int x_21 = x;
+    return x_21;
+  }
+  return 0;
+}
+
+void main_1() {
+  int a = 0;
+  S arr[1] = (S[1])0;
+  int i = 0;
+  S param = (S)0;
+  int param_1 = 0;
+  S param_2 = (S)0;
+  int param_3 = 0;
+  a = 0;
+  const int x_22 = asint(x_11[0].x);
+  arr[0].data = x_22;
+  i = 0;
+  while (true) {
+    const int x_23 = i;
+    const int x_24 = asint(x_11[0].x);
+    if ((x_23 < (5 + x_24))) {
+    } else {
+      break;
+    }
+    if (((i % 2) != 0)) {
+      const S x_74 = arr[0];
+      param = x_74;
+      param_1 = i;
+      const int x_29 = func_struct_S_i11_i1_(param, param_1);
+      arr[0] = param;
+      a = x_29;
+    } else {
+      const S x_78 = arr[0];
+      param_2 = x_78;
+      param_3 = 1;
+      const int x_30 = func_struct_S_i11_i1_(param_2, param_3);
+      arr[0] = param_2;
+      a = x_30;
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  if ((a == 6)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-replace-copy-object/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-replace-copy-object/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..fc21427
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-replace-copy-object/0-opt.spvasm.expected.msl
@@ -0,0 +1,92 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  int data;
+};
+struct buf0 {
+  /* 0x0000 */ int one;
+};
+struct tint_array_wrapper {
+  S arr[1];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int func_struct_S_i11_i1_(thread S* const s, thread int* const x) {
+  int const x_17 = (*(s)).data;
+  if ((x_17 == 1)) {
+    int const x_18 = *(x);
+    int const x_19 = (*(s)).data;
+    return (x_18 + x_19);
+  } else {
+    int const x_21 = *(x);
+    return x_21;
+  }
+  return 0;
+}
+
+void main_1(constant buf0& x_11, thread float4* const tint_symbol_4) {
+  int a = 0;
+  tint_array_wrapper arr = {};
+  int i = 0;
+  S param = {};
+  int param_1 = 0;
+  S param_2 = {};
+  int param_3 = 0;
+  a = 0;
+  int const x_22 = x_11.one;
+  arr.arr[0].data = x_22;
+  i = 0;
+  while (true) {
+    int const x_23 = i;
+    int const x_24 = x_11.one;
+    if ((x_23 < (5 + x_24))) {
+    } else {
+      break;
+    }
+    int const x_26 = i;
+    if (((x_26 % 2) != 0)) {
+      S const x_74 = arr.arr[0];
+      param = x_74;
+      int const x_28 = i;
+      param_1 = x_28;
+      int const x_29 = func_struct_S_i11_i1_(&(param), &(param_1));
+      S const x_75 = param;
+      arr.arr[0] = x_75;
+      a = x_29;
+    } else {
+      S const x_78 = arr.arr[0];
+      param_2 = x_78;
+      param_3 = 1;
+      int const x_30 = func_struct_S_i11_i1_(&(param_2), &(param_3));
+      S const x_79 = param_2;
+      arr.arr[0] = x_79;
+      a = x_30;
+    }
+    {
+      int const x_31 = i;
+      i = (x_31 + 1);
+    }
+  }
+  int const x_33 = a;
+  if ((x_33 == 6)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_11 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_11, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-replace-copy-object/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-replace-copy-object/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..79aef81
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-replace-copy-object/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,196 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 120
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_11 "x_11"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %S "S"
+               OpMemberName %S 0 "data"
+               OpName %func_struct_S_i11_i1_ "func_struct_S_i11_i1_"
+               OpName %s "s"
+               OpName %x "x"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %arr "arr"
+               OpName %i "i"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_11 NonWritable
+               OpDecorate %x_11 DescriptorSet 0
+               OpDecorate %x_11 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %_arr_S_uint_1 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_11 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+          %S = OpTypeStruct %int
+%_ptr_Function_S = OpTypePointer Function %S
+%_ptr_Function_int = OpTypePointer Function %int
+         %12 = OpTypeFunction %int %_ptr_Function_S %_ptr_Function_int
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %int_0 = OpConstant %int 0
+       %void = OpTypeVoid
+         %40 = OpTypeFunction %void
+         %45 = OpConstantNull %int
+     %uint_1 = OpConstant %uint 1
+%_arr_S_uint_1 = OpTypeArray %S %uint_1
+%_ptr_Function__arr_S_uint_1 = OpTypePointer Function %_arr_S_uint_1
+         %50 = OpConstantNull %_arr_S_uint_1
+         %53 = OpConstantNull %S
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_5 = OpConstant %int 5
+      %int_2 = OpConstant %int 2
+      %int_6 = OpConstant %int 6
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+        %106 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %107 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+        %108 = OpTypeFunction %void %main_out
+%func_struct_S_i11_i1_ = OpFunction %int None %12
+          %s = OpFunctionParameter %_ptr_Function_S
+          %x = OpFunctionParameter %_ptr_Function_int
+         %19 = OpLabel
+         %23 = OpAccessChain %_ptr_Function_int %s %uint_0
+         %24 = OpLoad %int %23
+         %26 = OpIEqual %bool %24 %int_1
+               OpSelectionMerge %28 None
+               OpBranchConditional %26 %29 %30
+         %29 = OpLabel
+         %32 = OpLoad %int %x
+         %34 = OpAccessChain %_ptr_Function_int %s %uint_0
+         %35 = OpLoad %int %34
+         %36 = OpIAdd %int %32 %35
+               OpReturnValue %36
+         %30 = OpLabel
+         %38 = OpLoad %int %x
+               OpReturnValue %38
+         %28 = OpLabel
+               OpReturnValue %int_0
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %40
+         %43 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %45
+        %arr = OpVariable %_ptr_Function__arr_S_uint_1 Function %50
+          %i = OpVariable %_ptr_Function_int Function %45
+      %param = OpVariable %_ptr_Function_S Function %53
+    %param_1 = OpVariable %_ptr_Function_int Function %45
+    %param_2 = OpVariable %_ptr_Function_S Function %53
+    %param_3 = OpVariable %_ptr_Function_int Function %45
+               OpStore %a %int_0
+         %58 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0
+         %59 = OpLoad %int %58
+         %60 = OpAccessChain %_ptr_Function_int %arr %int_0 %uint_0
+               OpStore %60 %59
+               OpStore %i %int_0
+               OpBranch %61
+         %61 = OpLabel
+               OpLoopMerge %62 %63 None
+               OpBranch %64
+         %64 = OpLabel
+         %65 = OpLoad %int %i
+         %66 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0
+         %67 = OpLoad %int %66
+         %69 = OpIAdd %int %int_5 %67
+         %70 = OpSLessThan %bool %65 %69
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %73
+         %72 = OpLabel
+               OpBranch %71
+         %73 = OpLabel
+               OpBranch %62
+         %71 = OpLabel
+         %74 = OpLoad %int %i
+         %76 = OpSMod %int %74 %int_2
+         %77 = OpINotEqual %bool %76 %int_0
+               OpSelectionMerge %78 None
+               OpBranchConditional %77 %79 %80
+         %79 = OpLabel
+         %81 = OpAccessChain %_ptr_Function_S %arr %int_0
+         %82 = OpLoad %S %81
+               OpStore %param %82
+         %83 = OpLoad %int %i
+               OpStore %param_1 %83
+         %84 = OpFunctionCall %int %func_struct_S_i11_i1_ %param %param_1
+         %87 = OpLoad %S %param
+         %88 = OpAccessChain %_ptr_Function_S %arr %int_0
+               OpStore %88 %87
+               OpStore %a %84
+               OpBranch %78
+         %80 = OpLabel
+         %89 = OpAccessChain %_ptr_Function_S %arr %int_0
+         %90 = OpLoad %S %89
+               OpStore %param_2 %90
+               OpStore %param_3 %int_1
+         %91 = OpFunctionCall %int %func_struct_S_i11_i1_ %param_2 %param_3
+         %94 = OpLoad %S %param_2
+         %95 = OpAccessChain %_ptr_Function_S %arr %int_0
+               OpStore %95 %94
+               OpStore %a %91
+               OpBranch %78
+         %78 = OpLabel
+               OpBranch %63
+         %63 = OpLabel
+         %96 = OpLoad %int %i
+         %97 = OpIAdd %int %96 %int_1
+               OpStore %i %97
+               OpBranch %61
+         %62 = OpLabel
+         %98 = OpLoad %int %a
+        %100 = OpIEqual %bool %98 %int_6
+               OpSelectionMerge %101 None
+               OpBranchConditional %100 %102 %103
+        %102 = OpLabel
+               OpStore %x_GLF_color %106
+               OpBranch %101
+        %103 = OpLabel
+               OpStore %x_GLF_color %107
+               OpBranch %101
+        %101 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %108
+%tint_symbol = OpFunctionParameter %main_out
+        %112 = OpLabel
+        %113 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %113
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %40
+        %115 = OpLabel
+        %116 = OpFunctionCall %void %main_1
+        %118 = OpLoad %v4float %x_GLF_color
+        %119 = OpCompositeConstruct %main_out %118
+        %117 = OpFunctionCall %void %tint_symbol_2 %119
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-replace-copy-object/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-replace-copy-object/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..3eef414
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-replace-copy-object/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,89 @@
+struct S {
+  data : i32;
+};
+
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_11 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_struct_S_i11_i1_(s : ptr<function, S>, x : ptr<function, i32>) -> i32 {
+  let x_17 : i32 = (*(s)).data;
+  if ((x_17 == 1)) {
+    let x_18 : i32 = *(x);
+    let x_19 : i32 = (*(s)).data;
+    return (x_18 + x_19);
+  } else {
+    let x_21 : i32 = *(x);
+    return x_21;
+  }
+  return 0;
+}
+
+fn main_1() {
+  var a : i32;
+  var arr : array<S, 1>;
+  var i : i32;
+  var param : S;
+  var param_1 : i32;
+  var param_2 : S;
+  var param_3 : i32;
+  a = 0;
+  let x_22 : i32 = x_11.one;
+  arr[0].data = x_22;
+  i = 0;
+  loop {
+    let x_23 : i32 = i;
+    let x_24 : i32 = x_11.one;
+    if ((x_23 < (5 + x_24))) {
+    } else {
+      break;
+    }
+    let x_26 : i32 = i;
+    if (((x_26 % 2) != 0)) {
+      let x_74 : S = arr[0];
+      param = x_74;
+      let x_28 : i32 = i;
+      param_1 = x_28;
+      let x_29 : i32 = func_struct_S_i11_i1_(&(param), &(param_1));
+      let x_75 : S = param;
+      arr[0] = x_75;
+      a = x_29;
+    } else {
+      let x_78 : S = arr[0];
+      param_2 = x_78;
+      param_3 = 1;
+      let x_30 : i32 = func_struct_S_i11_i1_(&(param_2), &(param_3));
+      let x_79 : S = param_2;
+      arr[0] = x_79;
+      a = x_30;
+    }
+
+    continuing {
+      let x_31 : i32 = i;
+      i = (x_31 + 1);
+    }
+  }
+  let x_33 : i32 = a;
+  if ((x_33 == 6)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-replace-copy-object/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-replace-copy-object/0-opt.wgsl
new file mode 100644
index 0000000..3eef414
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-replace-copy-object/0-opt.wgsl
@@ -0,0 +1,89 @@
+struct S {
+  data : i32;
+};
+
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_11 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_struct_S_i11_i1_(s : ptr<function, S>, x : ptr<function, i32>) -> i32 {
+  let x_17 : i32 = (*(s)).data;
+  if ((x_17 == 1)) {
+    let x_18 : i32 = *(x);
+    let x_19 : i32 = (*(s)).data;
+    return (x_18 + x_19);
+  } else {
+    let x_21 : i32 = *(x);
+    return x_21;
+  }
+  return 0;
+}
+
+fn main_1() {
+  var a : i32;
+  var arr : array<S, 1>;
+  var i : i32;
+  var param : S;
+  var param_1 : i32;
+  var param_2 : S;
+  var param_3 : i32;
+  a = 0;
+  let x_22 : i32 = x_11.one;
+  arr[0].data = x_22;
+  i = 0;
+  loop {
+    let x_23 : i32 = i;
+    let x_24 : i32 = x_11.one;
+    if ((x_23 < (5 + x_24))) {
+    } else {
+      break;
+    }
+    let x_26 : i32 = i;
+    if (((x_26 % 2) != 0)) {
+      let x_74 : S = arr[0];
+      param = x_74;
+      let x_28 : i32 = i;
+      param_1 = x_28;
+      let x_29 : i32 = func_struct_S_i11_i1_(&(param), &(param_1));
+      let x_75 : S = param;
+      arr[0] = x_75;
+      a = x_29;
+    } else {
+      let x_78 : S = arr[0];
+      param_2 = x_78;
+      param_3 = 1;
+      let x_30 : i32 = func_struct_S_i11_i1_(&(param_2), &(param_3));
+      let x_79 : S = param_2;
+      arr[0] = x_79;
+      a = x_30;
+    }
+
+    continuing {
+      let x_31 : i32 = i;
+      i = (x_31 + 1);
+    }
+  }
+  let x_33 : i32 = a;
+  if ((x_33 == 6)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-replace-copy-object/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-replace-copy-object/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..c226607
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-replace-copy-object/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,81 @@
+struct S {
+  int data;
+};
+
+cbuffer cbuffer_x_11 : register(b0, space0) {
+  uint4 x_11[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+int func_struct_S_i11_i1_(inout S s, inout int x) {
+  const int x_17 = s.data;
+  if ((x_17 == 1)) {
+    const int x_18 = x;
+    const int x_19 = s.data;
+    return (x_18 + x_19);
+  } else {
+    const int x_21 = x;
+    return x_21;
+  }
+  return 0;
+}
+
+void main_1() {
+  int a = 0;
+  S arr[1] = (S[1])0;
+  int i = 0;
+  S param = (S)0;
+  int param_1 = 0;
+  S param_2 = (S)0;
+  int param_3 = 0;
+  a = 0;
+  const int x_22 = asint(x_11[0].x);
+  arr[0].data = x_22;
+  i = 0;
+  while (true) {
+    const int x_23 = i;
+    const int x_24 = asint(x_11[0].x);
+    if ((x_23 < (5 + x_24))) {
+    } else {
+      break;
+    }
+    if (((i % 2) != 0)) {
+      const S x_74 = arr[0];
+      param = x_74;
+      param_1 = i;
+      const int x_29 = func_struct_S_i11_i1_(param, param_1);
+      arr[0] = param;
+      a = x_29;
+    } else {
+      const S x_78 = arr[0];
+      param_2 = x_78;
+      param_3 = 1;
+      const int x_30 = func_struct_S_i11_i1_(param_2, param_3);
+      arr[0] = param_2;
+      a = x_30;
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  if ((a == 6)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-replace-copy-object/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-replace-copy-object/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..fc21427
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-replace-copy-object/0-opt.wgsl.expected.msl
@@ -0,0 +1,92 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  int data;
+};
+struct buf0 {
+  /* 0x0000 */ int one;
+};
+struct tint_array_wrapper {
+  S arr[1];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int func_struct_S_i11_i1_(thread S* const s, thread int* const x) {
+  int const x_17 = (*(s)).data;
+  if ((x_17 == 1)) {
+    int const x_18 = *(x);
+    int const x_19 = (*(s)).data;
+    return (x_18 + x_19);
+  } else {
+    int const x_21 = *(x);
+    return x_21;
+  }
+  return 0;
+}
+
+void main_1(constant buf0& x_11, thread float4* const tint_symbol_4) {
+  int a = 0;
+  tint_array_wrapper arr = {};
+  int i = 0;
+  S param = {};
+  int param_1 = 0;
+  S param_2 = {};
+  int param_3 = 0;
+  a = 0;
+  int const x_22 = x_11.one;
+  arr.arr[0].data = x_22;
+  i = 0;
+  while (true) {
+    int const x_23 = i;
+    int const x_24 = x_11.one;
+    if ((x_23 < (5 + x_24))) {
+    } else {
+      break;
+    }
+    int const x_26 = i;
+    if (((x_26 % 2) != 0)) {
+      S const x_74 = arr.arr[0];
+      param = x_74;
+      int const x_28 = i;
+      param_1 = x_28;
+      int const x_29 = func_struct_S_i11_i1_(&(param), &(param_1));
+      S const x_75 = param;
+      arr.arr[0] = x_75;
+      a = x_29;
+    } else {
+      S const x_78 = arr.arr[0];
+      param_2 = x_78;
+      param_3 = 1;
+      int const x_30 = func_struct_S_i11_i1_(&(param_2), &(param_3));
+      S const x_79 = param_2;
+      arr.arr[0] = x_79;
+      a = x_30;
+    }
+    {
+      int const x_31 = i;
+      i = (x_31 + 1);
+    }
+  }
+  int const x_33 = a;
+  if ((x_33 == 6)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_11 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_11, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-replace-copy-object/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-replace-copy-object/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..79aef81
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-replace-copy-object/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,196 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 120
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_11 "x_11"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %S "S"
+               OpMemberName %S 0 "data"
+               OpName %func_struct_S_i11_i1_ "func_struct_S_i11_i1_"
+               OpName %s "s"
+               OpName %x "x"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %arr "arr"
+               OpName %i "i"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_11 NonWritable
+               OpDecorate %x_11 DescriptorSet 0
+               OpDecorate %x_11 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %_arr_S_uint_1 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_11 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+          %S = OpTypeStruct %int
+%_ptr_Function_S = OpTypePointer Function %S
+%_ptr_Function_int = OpTypePointer Function %int
+         %12 = OpTypeFunction %int %_ptr_Function_S %_ptr_Function_int
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %int_0 = OpConstant %int 0
+       %void = OpTypeVoid
+         %40 = OpTypeFunction %void
+         %45 = OpConstantNull %int
+     %uint_1 = OpConstant %uint 1
+%_arr_S_uint_1 = OpTypeArray %S %uint_1
+%_ptr_Function__arr_S_uint_1 = OpTypePointer Function %_arr_S_uint_1
+         %50 = OpConstantNull %_arr_S_uint_1
+         %53 = OpConstantNull %S
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_5 = OpConstant %int 5
+      %int_2 = OpConstant %int 2
+      %int_6 = OpConstant %int 6
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+        %106 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %107 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+        %108 = OpTypeFunction %void %main_out
+%func_struct_S_i11_i1_ = OpFunction %int None %12
+          %s = OpFunctionParameter %_ptr_Function_S
+          %x = OpFunctionParameter %_ptr_Function_int
+         %19 = OpLabel
+         %23 = OpAccessChain %_ptr_Function_int %s %uint_0
+         %24 = OpLoad %int %23
+         %26 = OpIEqual %bool %24 %int_1
+               OpSelectionMerge %28 None
+               OpBranchConditional %26 %29 %30
+         %29 = OpLabel
+         %32 = OpLoad %int %x
+         %34 = OpAccessChain %_ptr_Function_int %s %uint_0
+         %35 = OpLoad %int %34
+         %36 = OpIAdd %int %32 %35
+               OpReturnValue %36
+         %30 = OpLabel
+         %38 = OpLoad %int %x
+               OpReturnValue %38
+         %28 = OpLabel
+               OpReturnValue %int_0
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %40
+         %43 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %45
+        %arr = OpVariable %_ptr_Function__arr_S_uint_1 Function %50
+          %i = OpVariable %_ptr_Function_int Function %45
+      %param = OpVariable %_ptr_Function_S Function %53
+    %param_1 = OpVariable %_ptr_Function_int Function %45
+    %param_2 = OpVariable %_ptr_Function_S Function %53
+    %param_3 = OpVariable %_ptr_Function_int Function %45
+               OpStore %a %int_0
+         %58 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0
+         %59 = OpLoad %int %58
+         %60 = OpAccessChain %_ptr_Function_int %arr %int_0 %uint_0
+               OpStore %60 %59
+               OpStore %i %int_0
+               OpBranch %61
+         %61 = OpLabel
+               OpLoopMerge %62 %63 None
+               OpBranch %64
+         %64 = OpLabel
+         %65 = OpLoad %int %i
+         %66 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0
+         %67 = OpLoad %int %66
+         %69 = OpIAdd %int %int_5 %67
+         %70 = OpSLessThan %bool %65 %69
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %73
+         %72 = OpLabel
+               OpBranch %71
+         %73 = OpLabel
+               OpBranch %62
+         %71 = OpLabel
+         %74 = OpLoad %int %i
+         %76 = OpSMod %int %74 %int_2
+         %77 = OpINotEqual %bool %76 %int_0
+               OpSelectionMerge %78 None
+               OpBranchConditional %77 %79 %80
+         %79 = OpLabel
+         %81 = OpAccessChain %_ptr_Function_S %arr %int_0
+         %82 = OpLoad %S %81
+               OpStore %param %82
+         %83 = OpLoad %int %i
+               OpStore %param_1 %83
+         %84 = OpFunctionCall %int %func_struct_S_i11_i1_ %param %param_1
+         %87 = OpLoad %S %param
+         %88 = OpAccessChain %_ptr_Function_S %arr %int_0
+               OpStore %88 %87
+               OpStore %a %84
+               OpBranch %78
+         %80 = OpLabel
+         %89 = OpAccessChain %_ptr_Function_S %arr %int_0
+         %90 = OpLoad %S %89
+               OpStore %param_2 %90
+               OpStore %param_3 %int_1
+         %91 = OpFunctionCall %int %func_struct_S_i11_i1_ %param_2 %param_3
+         %94 = OpLoad %S %param_2
+         %95 = OpAccessChain %_ptr_Function_S %arr %int_0
+               OpStore %95 %94
+               OpStore %a %91
+               OpBranch %78
+         %78 = OpLabel
+               OpBranch %63
+         %63 = OpLabel
+         %96 = OpLoad %int %i
+         %97 = OpIAdd %int %96 %int_1
+               OpStore %i %97
+               OpBranch %61
+         %62 = OpLabel
+         %98 = OpLoad %int %a
+        %100 = OpIEqual %bool %98 %int_6
+               OpSelectionMerge %101 None
+               OpBranchConditional %100 %102 %103
+        %102 = OpLabel
+               OpStore %x_GLF_color %106
+               OpBranch %101
+        %103 = OpLabel
+               OpStore %x_GLF_color %107
+               OpBranch %101
+        %101 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %108
+%tint_symbol = OpFunctionParameter %main_out
+        %112 = OpLabel
+        %113 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %113
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %40
+        %115 = OpLabel
+        %116 = OpFunctionCall %void %main_1
+        %118 = OpLoad %v4float %x_GLF_color
+        %119 = OpCompositeConstruct %main_out %118
+        %117 = OpFunctionCall %void %tint_symbol_2 %119
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-replace-copy-object/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-replace-copy-object/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..3eef414
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-replace-copy-object/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,89 @@
+struct S {
+  data : i32;
+};
+
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_11 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_struct_S_i11_i1_(s : ptr<function, S>, x : ptr<function, i32>) -> i32 {
+  let x_17 : i32 = (*(s)).data;
+  if ((x_17 == 1)) {
+    let x_18 : i32 = *(x);
+    let x_19 : i32 = (*(s)).data;
+    return (x_18 + x_19);
+  } else {
+    let x_21 : i32 = *(x);
+    return x_21;
+  }
+  return 0;
+}
+
+fn main_1() {
+  var a : i32;
+  var arr : array<S, 1>;
+  var i : i32;
+  var param : S;
+  var param_1 : i32;
+  var param_2 : S;
+  var param_3 : i32;
+  a = 0;
+  let x_22 : i32 = x_11.one;
+  arr[0].data = x_22;
+  i = 0;
+  loop {
+    let x_23 : i32 = i;
+    let x_24 : i32 = x_11.one;
+    if ((x_23 < (5 + x_24))) {
+    } else {
+      break;
+    }
+    let x_26 : i32 = i;
+    if (((x_26 % 2) != 0)) {
+      let x_74 : S = arr[0];
+      param = x_74;
+      let x_28 : i32 = i;
+      param_1 = x_28;
+      let x_29 : i32 = func_struct_S_i11_i1_(&(param), &(param_1));
+      let x_75 : S = param;
+      arr[0] = x_75;
+      a = x_29;
+    } else {
+      let x_78 : S = arr[0];
+      param_2 = x_78;
+      param_3 = 1;
+      let x_30 : i32 = func_struct_S_i11_i1_(&(param_2), &(param_3));
+      let x_79 : S = param_2;
+      arr[0] = x_79;
+      a = x_30;
+    }
+
+    continuing {
+      let x_31 : i32 = i;
+      i = (x_31 + 1);
+    }
+  }
+  let x_33 : i32 = a;
+  if ((x_33 == 6)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-return-after-do-while/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-return-after-do-while/0-opt.spvasm
new file mode 100644
index 0000000..4d13774
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-return-after-do-while/0-opt.spvasm
@@ -0,0 +1,81 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+       %main = OpFunction %void None %8
+         %20 = OpLabel
+         %21 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %22 = OpLoad %int %21
+         %23 = OpConvertSToF %float %22
+         %24 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %25 = OpLoad %int %24
+         %26 = OpConvertSToF %float %25
+         %27 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %28 = OpLoad %int %27
+         %29 = OpConvertSToF %float %28
+         %30 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %31 = OpLoad %int %30
+         %32 = OpConvertSToF %float %31
+         %33 = OpCompositeConstruct %v4float %23 %26 %29 %32
+               OpStore %_GLF_color %33
+         %34 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %35 = OpLoad %int %34
+         %36 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %37 = OpLoad %int %36
+         %38 = OpSGreaterThan %bool %35 %37
+               OpSelectionMerge %39 None
+               OpBranchConditional %38 %40 %39
+         %40 = OpLabel
+               OpBranch %41
+         %41 = OpLabel
+               OpLoopMerge %42 %43 None
+               OpBranch %44
+         %44 = OpLabel
+         %45 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %46 = OpLoad %int %45
+         %47 = OpConvertSToF %float %46
+         %48 = OpCompositeConstruct %v4float %47 %47 %47 %47
+               OpStore %_GLF_color %48
+               OpBranch %43
+         %43 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %50 = OpLoad %int %49
+         %51 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %52 = OpLoad %int %51
+         %53 = OpSGreaterThan %bool %50 %52
+               OpBranchConditional %53 %41 %42
+         %42 = OpLabel
+               OpReturn
+         %39 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-return-after-do-while/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-return-after-do-while/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..55b3cc6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-return-after-do-while/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,50 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[2];
+};
+
+void main_1() {
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_22 = asint(x_5[scalar_offset / 4][scalar_offset % 4]);
+  const int x_25 = asint(x_5[1].x);
+  const int x_28 = asint(x_5[1].x);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_31 = asint(x_5[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  x_GLF_color = float4(float(x_22), float(x_25), float(x_28), float(x_31));
+  const int x_35 = asint(x_5[1].x);
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const int x_37 = asint(x_5[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  if ((x_35 > x_37)) {
+    while (true) {
+      const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+      const int x_46 = asint(x_5[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+      const float x_47 = float(x_46);
+      x_GLF_color = float4(x_47, x_47, x_47, x_47);
+      {
+        const int x_50 = asint(x_5[1].x);
+        const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+        const int x_52 = asint(x_5[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+        if ((x_50 > x_52)) {
+        } else {
+          break;
+        }
+      }
+    }
+    return;
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-return-after-do-while/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-return-after-do-while/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..1ade401
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-return-after-do-while/0-opt.spvasm.expected.msl
@@ -0,0 +1,55 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_5, thread float4* const tint_symbol_4) {
+  int const x_22 = x_5.x_GLF_uniform_int_values.arr[0].el;
+  int const x_25 = x_5.x_GLF_uniform_int_values.arr[1].el;
+  int const x_28 = x_5.x_GLF_uniform_int_values.arr[1].el;
+  int const x_31 = x_5.x_GLF_uniform_int_values.arr[0].el;
+  *(tint_symbol_4) = float4(float(x_22), float(x_25), float(x_28), float(x_31));
+  int const x_35 = x_5.x_GLF_uniform_int_values.arr[1].el;
+  int const x_37 = x_5.x_GLF_uniform_int_values.arr[0].el;
+  if ((x_35 > x_37)) {
+    while (true) {
+      int const x_46 = x_5.x_GLF_uniform_int_values.arr[0].el;
+      float const x_47 = float(x_46);
+      *(tint_symbol_4) = float4(x_47, x_47, x_47, x_47);
+      {
+        int const x_50 = x_5.x_GLF_uniform_int_values.arr[1].el;
+        int const x_52 = x_5.x_GLF_uniform_int_values.arr[0].el;
+        if ((x_50 > x_52)) {
+        } else {
+          break;
+        }
+      }
+    }
+    return;
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-return-after-do-while/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-return-after-do-while/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..fcf0562
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-return-after-do-while/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,125 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 72
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_5 "x_5"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_5 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %v4float
+         %60 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+         %22 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %23 = OpLoad %int %22
+         %25 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %26 = OpLoad %int %25
+         %27 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %28 = OpLoad %int %27
+         %29 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %30 = OpLoad %int %29
+         %31 = OpConvertSToF %float %23
+         %32 = OpConvertSToF %float %26
+         %33 = OpConvertSToF %float %28
+         %34 = OpConvertSToF %float %30
+         %35 = OpCompositeConstruct %v4float %31 %32 %33 %34
+               OpStore %x_GLF_color %35
+         %36 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %37 = OpLoad %int %36
+         %38 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %39 = OpLoad %int %38
+         %40 = OpSGreaterThan %bool %37 %39
+               OpSelectionMerge %42 None
+               OpBranchConditional %40 %43 %42
+         %43 = OpLabel
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %48 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %49 = OpLoad %int %48
+         %50 = OpConvertSToF %float %49
+         %51 = OpCompositeConstruct %v4float %50 %50 %50 %50
+               OpStore %x_GLF_color %51
+               OpBranch %46
+         %46 = OpLabel
+         %52 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %53 = OpLoad %int %52
+         %54 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %55 = OpLoad %int %54
+         %56 = OpSGreaterThan %bool %53 %55
+               OpSelectionMerge %57 None
+               OpBranchConditional %56 %58 %59
+         %58 = OpLabel
+               OpBranch %57
+         %59 = OpLabel
+               OpBranch %45
+         %57 = OpLabel
+               OpBranch %44
+         %45 = OpLabel
+               OpReturn
+         %42 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %60
+%tint_symbol = OpFunctionParameter %main_out
+         %64 = OpLabel
+         %65 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %65
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %67 = OpLabel
+         %68 = OpFunctionCall %void %main_1
+         %70 = OpLoad %v4float %x_GLF_color
+         %71 = OpCompositeConstruct %main_out %70
+         %69 = OpFunctionCall %void %tint_symbol_2 %71
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 46[%46] is not post dominated by the back-edge block 57[%57]
+  %57 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-return-after-do-while/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-return-after-do-while/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..3471958
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-return-after-do-while/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,49 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf1;
+
+fn main_1() {
+  let x_22 : i32 = x_5.x_GLF_uniform_int_values[0];
+  let x_25 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_28 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_31 : i32 = x_5.x_GLF_uniform_int_values[0];
+  x_GLF_color = vec4<f32>(f32(x_22), f32(x_25), f32(x_28), f32(x_31));
+  let x_35 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_37 : i32 = x_5.x_GLF_uniform_int_values[0];
+  if ((x_35 > x_37)) {
+    loop {
+      let x_46 : i32 = x_5.x_GLF_uniform_int_values[0];
+      let x_47 : f32 = f32(x_46);
+      x_GLF_color = vec4<f32>(x_47, x_47, x_47, x_47);
+
+      continuing {
+        let x_50 : i32 = x_5.x_GLF_uniform_int_values[1];
+        let x_52 : i32 = x_5.x_GLF_uniform_int_values[0];
+        if ((x_50 > x_52)) {
+        } else {
+          break;
+        }
+      }
+    }
+    return;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-return-after-do-while/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-return-after-do-while/0-opt.wgsl
new file mode 100644
index 0000000..3471958
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-return-after-do-while/0-opt.wgsl
@@ -0,0 +1,49 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf1;
+
+fn main_1() {
+  let x_22 : i32 = x_5.x_GLF_uniform_int_values[0];
+  let x_25 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_28 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_31 : i32 = x_5.x_GLF_uniform_int_values[0];
+  x_GLF_color = vec4<f32>(f32(x_22), f32(x_25), f32(x_28), f32(x_31));
+  let x_35 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_37 : i32 = x_5.x_GLF_uniform_int_values[0];
+  if ((x_35 > x_37)) {
+    loop {
+      let x_46 : i32 = x_5.x_GLF_uniform_int_values[0];
+      let x_47 : f32 = f32(x_46);
+      x_GLF_color = vec4<f32>(x_47, x_47, x_47, x_47);
+
+      continuing {
+        let x_50 : i32 = x_5.x_GLF_uniform_int_values[1];
+        let x_52 : i32 = x_5.x_GLF_uniform_int_values[0];
+        if ((x_50 > x_52)) {
+        } else {
+          break;
+        }
+      }
+    }
+    return;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-return-after-do-while/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-return-after-do-while/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..55b3cc6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-return-after-do-while/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,50 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[2];
+};
+
+void main_1() {
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_22 = asint(x_5[scalar_offset / 4][scalar_offset % 4]);
+  const int x_25 = asint(x_5[1].x);
+  const int x_28 = asint(x_5[1].x);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_31 = asint(x_5[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  x_GLF_color = float4(float(x_22), float(x_25), float(x_28), float(x_31));
+  const int x_35 = asint(x_5[1].x);
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const int x_37 = asint(x_5[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  if ((x_35 > x_37)) {
+    while (true) {
+      const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+      const int x_46 = asint(x_5[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+      const float x_47 = float(x_46);
+      x_GLF_color = float4(x_47, x_47, x_47, x_47);
+      {
+        const int x_50 = asint(x_5[1].x);
+        const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+        const int x_52 = asint(x_5[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+        if ((x_50 > x_52)) {
+        } else {
+          break;
+        }
+      }
+    }
+    return;
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-return-after-do-while/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-return-after-do-while/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..1ade401
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-return-after-do-while/0-opt.wgsl.expected.msl
@@ -0,0 +1,55 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_5, thread float4* const tint_symbol_4) {
+  int const x_22 = x_5.x_GLF_uniform_int_values.arr[0].el;
+  int const x_25 = x_5.x_GLF_uniform_int_values.arr[1].el;
+  int const x_28 = x_5.x_GLF_uniform_int_values.arr[1].el;
+  int const x_31 = x_5.x_GLF_uniform_int_values.arr[0].el;
+  *(tint_symbol_4) = float4(float(x_22), float(x_25), float(x_28), float(x_31));
+  int const x_35 = x_5.x_GLF_uniform_int_values.arr[1].el;
+  int const x_37 = x_5.x_GLF_uniform_int_values.arr[0].el;
+  if ((x_35 > x_37)) {
+    while (true) {
+      int const x_46 = x_5.x_GLF_uniform_int_values.arr[0].el;
+      float const x_47 = float(x_46);
+      *(tint_symbol_4) = float4(x_47, x_47, x_47, x_47);
+      {
+        int const x_50 = x_5.x_GLF_uniform_int_values.arr[1].el;
+        int const x_52 = x_5.x_GLF_uniform_int_values.arr[0].el;
+        if ((x_50 > x_52)) {
+        } else {
+          break;
+        }
+      }
+    }
+    return;
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-return-after-do-while/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-return-after-do-while/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..fcf0562
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-return-after-do-while/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,125 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 72
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_5 "x_5"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_5 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %v4float
+         %60 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+         %22 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %23 = OpLoad %int %22
+         %25 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %26 = OpLoad %int %25
+         %27 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %28 = OpLoad %int %27
+         %29 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %30 = OpLoad %int %29
+         %31 = OpConvertSToF %float %23
+         %32 = OpConvertSToF %float %26
+         %33 = OpConvertSToF %float %28
+         %34 = OpConvertSToF %float %30
+         %35 = OpCompositeConstruct %v4float %31 %32 %33 %34
+               OpStore %x_GLF_color %35
+         %36 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %37 = OpLoad %int %36
+         %38 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %39 = OpLoad %int %38
+         %40 = OpSGreaterThan %bool %37 %39
+               OpSelectionMerge %42 None
+               OpBranchConditional %40 %43 %42
+         %43 = OpLabel
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %48 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %49 = OpLoad %int %48
+         %50 = OpConvertSToF %float %49
+         %51 = OpCompositeConstruct %v4float %50 %50 %50 %50
+               OpStore %x_GLF_color %51
+               OpBranch %46
+         %46 = OpLabel
+         %52 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %53 = OpLoad %int %52
+         %54 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %55 = OpLoad %int %54
+         %56 = OpSGreaterThan %bool %53 %55
+               OpSelectionMerge %57 None
+               OpBranchConditional %56 %58 %59
+         %58 = OpLabel
+               OpBranch %57
+         %59 = OpLabel
+               OpBranch %45
+         %57 = OpLabel
+               OpBranch %44
+         %45 = OpLabel
+               OpReturn
+         %42 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %60
+%tint_symbol = OpFunctionParameter %main_out
+         %64 = OpLabel
+         %65 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %65
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %67 = OpLabel
+         %68 = OpFunctionCall %void %main_1
+         %70 = OpLoad %v4float %x_GLF_color
+         %71 = OpCompositeConstruct %main_out %70
+         %69 = OpFunctionCall %void %tint_symbol_2 %71
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 46[%46] is not post dominated by the back-edge block 57[%57]
+  %57 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-return-after-do-while/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-return-after-do-while/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..3471958
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-return-after-do-while/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,49 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf1;
+
+fn main_1() {
+  let x_22 : i32 = x_5.x_GLF_uniform_int_values[0];
+  let x_25 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_28 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_31 : i32 = x_5.x_GLF_uniform_int_values[0];
+  x_GLF_color = vec4<f32>(f32(x_22), f32(x_25), f32(x_28), f32(x_31));
+  let x_35 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_37 : i32 = x_5.x_GLF_uniform_int_values[0];
+  if ((x_35 > x_37)) {
+    loop {
+      let x_46 : i32 = x_5.x_GLF_uniform_int_values[0];
+      let x_47 : f32 = f32(x_46);
+      x_GLF_color = vec4<f32>(x_47, x_47, x_47, x_47);
+
+      continuing {
+        let x_50 : i32 = x_5.x_GLF_uniform_int_values[1];
+        let x_52 : i32 = x_5.x_GLF_uniform_int_values[0];
+        if ((x_50 > x_52)) {
+        } else {
+          break;
+        }
+      }
+    }
+    return;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-return-after-first-iteration/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-return-after-first-iteration/0-opt.spvasm
new file mode 100644
index 0000000..aa75762
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-return-after-first-iteration/0-opt.spvasm
@@ -0,0 +1,124 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color %gl_FragCoord
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpName %i "i"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "injectionSwitch"
+               OpName %__1 ""
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %buf2 Block
+               OpDecorate %__1 DescriptorSet 0
+               OpDecorate %__1 Binding 2
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %21 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %v3float = OpTypeVector %float 3
+         %37 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+    %v2float = OpTypeVector %float 2
+       %buf2 = OpTypeStruct %v2float
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+        %__1 = OpVariable %_ptr_Uniform_buf2 Uniform
+       %main = OpFunction %void None %15
+         %40 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+               OpStore %_GLF_color %21
+         %41 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %42 = OpLoad %int %41
+               OpStore %i %42
+               OpBranch %43
+         %43 = OpLabel
+               OpLoopMerge %44 %45 None
+               OpBranch %46
+         %46 = OpLabel
+         %47 = OpLoad %int %i
+         %48 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %49 = OpLoad %int %48
+         %50 = OpSLessThan %bool %47 %49
+               OpBranchConditional %50 %51 %44
+         %51 = OpLabel
+         %52 = OpLoad %int %i
+         %53 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %54 = OpLoad %int %53
+         %55 = OpINotEqual %bool %52 %54
+               OpSelectionMerge %56 None
+               OpBranchConditional %55 %57 %56
+         %57 = OpLabel
+               OpReturn
+         %56 = OpLabel
+               OpBranch %45
+         %45 = OpLabel
+         %58 = OpLoad %int %i
+         %59 = OpIAdd %int %58 %int_1
+               OpStore %i %59
+               OpBranch %43
+         %44 = OpLabel
+         %60 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %61 = OpLoad %float %60
+         %62 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %63 = OpLoad %float %62
+         %64 = OpFOrdLessThan %bool %61 %63
+               OpSelectionMerge %65 None
+               OpBranchConditional %64 %66 %65
+         %66 = OpLabel
+               OpReturn
+         %65 = OpLabel
+         %67 = OpAccessChain %_ptr_Uniform_float %__1 %int_0 %uint_1
+         %68 = OpLoad %float %67
+         %69 = OpCompositeExtract %float %37 0
+         %70 = OpCompositeExtract %float %37 1
+         %71 = OpCompositeExtract %float %37 2
+         %72 = OpCompositeConstruct %v4float %69 %70 %71 %68
+               OpStore %_GLF_color %72
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-return-after-first-iteration/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-return-after-first-iteration/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..02dc25f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-return-after-first-iteration/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,63 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_7 : register(b1, space0) {
+  uint4 x_7[2];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[1];
+};
+cbuffer cbuffer_x_11 : register(b2, space0) {
+  uint4 x_11[1];
+};
+
+void main_1() {
+  int i = 0;
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  const int x_42 = asint(x_7[1].x);
+  i = x_42;
+  while (true) {
+    const int x_47 = i;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_49 = asint(x_7[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_47 < x_49)) {
+    } else {
+      break;
+    }
+    const int x_52 = i;
+    const int x_54 = asint(x_7[1].x);
+    if ((x_52 != x_54)) {
+      return;
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  const float x_61 = gl_FragCoord.y;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_63 = asfloat(x_9[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_61 < x_63)) {
+    return;
+  }
+  const float x_68 = asfloat(x_11[0].y);
+  x_GLF_color = float4(float3(1.0f, 1.0f, 1.0f).x, float3(1.0f, 1.0f, 1.0f).y, float3(1.0f, 1.0f, 1.0f).z, x_68);
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_7 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_7;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-return-after-first-iteration/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-return-after-first-iteration/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..4e920ba
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-return-after-first-iteration/0-opt.spvasm.expected.msl
@@ -0,0 +1,75 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct buf2 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_7, constant buf0& x_9, constant buf2& x_11, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int i = 0;
+  *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  int const x_42 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  i = x_42;
+  while (true) {
+    int const x_47 = i;
+    int const x_49 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_47 < x_49)) {
+    } else {
+      break;
+    }
+    int const x_52 = i;
+    int const x_54 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    if ((x_52 != x_54)) {
+      return;
+    }
+    {
+      int const x_58 = i;
+      i = (x_58 + 1);
+    }
+  }
+  float const x_61 = (*(tint_symbol_6)).y;
+  float const x_63 = x_9.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_61 < x_63)) {
+    return;
+  }
+  float const x_68 = x_11.injectionSwitch.y;
+  *(tint_symbol_5) = float4(float3(1.0f, 1.0f, 1.0f).x, float3(1.0f, 1.0f, 1.0f).y, float3(1.0f, 1.0f, 1.0f).z, x_68);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf1& x_7 [[buffer(1)]], constant buf0& x_9 [[buffer(0)]], constant buf2& x_11 [[buffer(2)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_7, x_9, x_11, &(tint_symbol_8), &(tint_symbol_7));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-return-after-first-iteration/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-return-after-first-iteration/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..f165252
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-return-after-first-iteration/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,168 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 93
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_9 "x_9"
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "injectionSwitch"
+               OpName %x_11 "x_11"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %buf2 Block
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %x_11 NonWritable
+               OpDecorate %x_11 DescriptorSet 0
+               OpDecorate %x_11 Binding 2
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_7 = OpVariable %_ptr_Uniform_buf1 Uniform
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v2float = OpTypeVector %float 2
+       %buf2 = OpTypeStruct %v2float
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+       %x_11 = OpVariable %_ptr_Uniform_buf2 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %33 = OpConstantNull %int
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %36 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+%_ptr_Private_float = OpTypePointer Private %float
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %v3float = OpTypeVector %float 3
+         %75 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+         %80 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %27
+         %30 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %33
+               OpStore %x_GLF_color %36
+         %40 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %41 = OpLoad %int %40
+               OpStore %i %41
+               OpBranch %42
+         %42 = OpLabel
+               OpLoopMerge %43 %44 None
+               OpBranch %45
+         %45 = OpLabel
+         %46 = OpLoad %int %i
+         %48 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %49 = OpLoad %int %48
+         %50 = OpSLessThan %bool %46 %49
+               OpSelectionMerge %52 None
+               OpBranchConditional %50 %53 %54
+         %53 = OpLabel
+               OpBranch %52
+         %54 = OpLabel
+               OpBranch %43
+         %52 = OpLabel
+         %55 = OpLoad %int %i
+         %56 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %57 = OpLoad %int %56
+         %58 = OpINotEqual %bool %55 %57
+               OpSelectionMerge %59 None
+               OpBranchConditional %58 %60 %59
+         %60 = OpLabel
+               OpReturn
+         %59 = OpLabel
+               OpBranch %44
+         %44 = OpLabel
+         %61 = OpLoad %int %i
+         %62 = OpIAdd %int %61 %int_1
+               OpStore %i %62
+               OpBranch %42
+         %43 = OpLabel
+         %64 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %65 = OpLoad %float %64
+         %67 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_0
+         %68 = OpLoad %float %67
+         %69 = OpFOrdLessThan %bool %65 %68
+               OpSelectionMerge %70 None
+               OpBranchConditional %69 %71 %70
+         %71 = OpLabel
+               OpReturn
+         %70 = OpLabel
+         %72 = OpAccessChain %_ptr_Uniform_float %x_11 %uint_0 %uint_1
+         %73 = OpLoad %float %72
+         %76 = OpCompositeExtract %float %75 0
+         %77 = OpCompositeExtract %float %75 1
+         %78 = OpCompositeExtract %float %75 2
+         %79 = OpCompositeConstruct %v4float %76 %77 %78 %73
+               OpStore %x_GLF_color %79
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %80
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %84 = OpLabel
+         %85 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %85
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %27
+         %87 = OpLabel
+         %88 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %88
+         %89 = OpFunctionCall %void %main_1
+         %91 = OpLoad %v4float %x_GLF_color
+         %92 = OpCompositeConstruct %main_out %91
+         %90 = OpFunctionCall %void %tint_symbol_3 %92
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-return-after-first-iteration/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-return-after-first-iteration/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..444e50a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-return-after-first-iteration/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,73 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[block]]
+struct buf2 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+[[group(0), binding(2)]] var<uniform> x_11 : buf2;
+
+fn main_1() {
+  var i : i32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  let x_42 : i32 = x_7.x_GLF_uniform_int_values[1];
+  i = x_42;
+  loop {
+    let x_47 : i32 = i;
+    let x_49 : i32 = x_7.x_GLF_uniform_int_values[0];
+    if ((x_47 < x_49)) {
+    } else {
+      break;
+    }
+    let x_52 : i32 = i;
+    let x_54 : i32 = x_7.x_GLF_uniform_int_values[1];
+    if ((x_52 != x_54)) {
+      return;
+    }
+
+    continuing {
+      let x_58 : i32 = i;
+      i = (x_58 + 1);
+    }
+  }
+  let x_61 : f32 = gl_FragCoord.y;
+  let x_63 : f32 = x_9.x_GLF_uniform_float_values[0];
+  if ((x_61 < x_63)) {
+    return;
+  }
+  let x_68 : f32 = x_11.injectionSwitch.y;
+  x_GLF_color = vec4<f32>(vec3<f32>(1.0, 1.0, 1.0).x, vec3<f32>(1.0, 1.0, 1.0).y, vec3<f32>(1.0, 1.0, 1.0).z, x_68);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-return-after-first-iteration/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-return-after-first-iteration/0-opt.wgsl
new file mode 100644
index 0000000..444e50a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-return-after-first-iteration/0-opt.wgsl
@@ -0,0 +1,73 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[block]]
+struct buf2 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+[[group(0), binding(2)]] var<uniform> x_11 : buf2;
+
+fn main_1() {
+  var i : i32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  let x_42 : i32 = x_7.x_GLF_uniform_int_values[1];
+  i = x_42;
+  loop {
+    let x_47 : i32 = i;
+    let x_49 : i32 = x_7.x_GLF_uniform_int_values[0];
+    if ((x_47 < x_49)) {
+    } else {
+      break;
+    }
+    let x_52 : i32 = i;
+    let x_54 : i32 = x_7.x_GLF_uniform_int_values[1];
+    if ((x_52 != x_54)) {
+      return;
+    }
+
+    continuing {
+      let x_58 : i32 = i;
+      i = (x_58 + 1);
+    }
+  }
+  let x_61 : f32 = gl_FragCoord.y;
+  let x_63 : f32 = x_9.x_GLF_uniform_float_values[0];
+  if ((x_61 < x_63)) {
+    return;
+  }
+  let x_68 : f32 = x_11.injectionSwitch.y;
+  x_GLF_color = vec4<f32>(vec3<f32>(1.0, 1.0, 1.0).x, vec3<f32>(1.0, 1.0, 1.0).y, vec3<f32>(1.0, 1.0, 1.0).z, x_68);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-return-after-first-iteration/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-return-after-first-iteration/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..02dc25f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-return-after-first-iteration/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,63 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_7 : register(b1, space0) {
+  uint4 x_7[2];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[1];
+};
+cbuffer cbuffer_x_11 : register(b2, space0) {
+  uint4 x_11[1];
+};
+
+void main_1() {
+  int i = 0;
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  const int x_42 = asint(x_7[1].x);
+  i = x_42;
+  while (true) {
+    const int x_47 = i;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_49 = asint(x_7[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_47 < x_49)) {
+    } else {
+      break;
+    }
+    const int x_52 = i;
+    const int x_54 = asint(x_7[1].x);
+    if ((x_52 != x_54)) {
+      return;
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  const float x_61 = gl_FragCoord.y;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_63 = asfloat(x_9[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_61 < x_63)) {
+    return;
+  }
+  const float x_68 = asfloat(x_11[0].y);
+  x_GLF_color = float4(float3(1.0f, 1.0f, 1.0f).x, float3(1.0f, 1.0f, 1.0f).y, float3(1.0f, 1.0f, 1.0f).z, x_68);
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_7 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_7;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-return-after-first-iteration/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-return-after-first-iteration/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..4e920ba
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-return-after-first-iteration/0-opt.wgsl.expected.msl
@@ -0,0 +1,75 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct buf2 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_7, constant buf0& x_9, constant buf2& x_11, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int i = 0;
+  *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  int const x_42 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  i = x_42;
+  while (true) {
+    int const x_47 = i;
+    int const x_49 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_47 < x_49)) {
+    } else {
+      break;
+    }
+    int const x_52 = i;
+    int const x_54 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    if ((x_52 != x_54)) {
+      return;
+    }
+    {
+      int const x_58 = i;
+      i = (x_58 + 1);
+    }
+  }
+  float const x_61 = (*(tint_symbol_6)).y;
+  float const x_63 = x_9.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_61 < x_63)) {
+    return;
+  }
+  float const x_68 = x_11.injectionSwitch.y;
+  *(tint_symbol_5) = float4(float3(1.0f, 1.0f, 1.0f).x, float3(1.0f, 1.0f, 1.0f).y, float3(1.0f, 1.0f, 1.0f).z, x_68);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf1& x_7 [[buffer(1)]], constant buf0& x_9 [[buffer(0)]], constant buf2& x_11 [[buffer(2)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_7, x_9, x_11, &(tint_symbol_8), &(tint_symbol_7));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-return-after-first-iteration/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-return-after-first-iteration/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..f165252
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-return-after-first-iteration/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,168 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 93
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_9 "x_9"
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "injectionSwitch"
+               OpName %x_11 "x_11"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %buf2 Block
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %x_11 NonWritable
+               OpDecorate %x_11 DescriptorSet 0
+               OpDecorate %x_11 Binding 2
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_7 = OpVariable %_ptr_Uniform_buf1 Uniform
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v2float = OpTypeVector %float 2
+       %buf2 = OpTypeStruct %v2float
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+       %x_11 = OpVariable %_ptr_Uniform_buf2 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %33 = OpConstantNull %int
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %36 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+%_ptr_Private_float = OpTypePointer Private %float
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %v3float = OpTypeVector %float 3
+         %75 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+         %80 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %27
+         %30 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %33
+               OpStore %x_GLF_color %36
+         %40 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %41 = OpLoad %int %40
+               OpStore %i %41
+               OpBranch %42
+         %42 = OpLabel
+               OpLoopMerge %43 %44 None
+               OpBranch %45
+         %45 = OpLabel
+         %46 = OpLoad %int %i
+         %48 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %49 = OpLoad %int %48
+         %50 = OpSLessThan %bool %46 %49
+               OpSelectionMerge %52 None
+               OpBranchConditional %50 %53 %54
+         %53 = OpLabel
+               OpBranch %52
+         %54 = OpLabel
+               OpBranch %43
+         %52 = OpLabel
+         %55 = OpLoad %int %i
+         %56 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %57 = OpLoad %int %56
+         %58 = OpINotEqual %bool %55 %57
+               OpSelectionMerge %59 None
+               OpBranchConditional %58 %60 %59
+         %60 = OpLabel
+               OpReturn
+         %59 = OpLabel
+               OpBranch %44
+         %44 = OpLabel
+         %61 = OpLoad %int %i
+         %62 = OpIAdd %int %61 %int_1
+               OpStore %i %62
+               OpBranch %42
+         %43 = OpLabel
+         %64 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %65 = OpLoad %float %64
+         %67 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %int_0
+         %68 = OpLoad %float %67
+         %69 = OpFOrdLessThan %bool %65 %68
+               OpSelectionMerge %70 None
+               OpBranchConditional %69 %71 %70
+         %71 = OpLabel
+               OpReturn
+         %70 = OpLabel
+         %72 = OpAccessChain %_ptr_Uniform_float %x_11 %uint_0 %uint_1
+         %73 = OpLoad %float %72
+         %76 = OpCompositeExtract %float %75 0
+         %77 = OpCompositeExtract %float %75 1
+         %78 = OpCompositeExtract %float %75 2
+         %79 = OpCompositeConstruct %v4float %76 %77 %78 %73
+               OpStore %x_GLF_color %79
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %80
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %84 = OpLabel
+         %85 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %85
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %27
+         %87 = OpLabel
+         %88 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %88
+         %89 = OpFunctionCall %void %main_1
+         %91 = OpLoad %v4float %x_GLF_color
+         %92 = OpCompositeConstruct %main_out %91
+         %90 = OpFunctionCall %void %tint_symbol_3 %92
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-return-after-first-iteration/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-return-after-first-iteration/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..444e50a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-return-after-first-iteration/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,73 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[block]]
+struct buf2 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+[[group(0), binding(2)]] var<uniform> x_11 : buf2;
+
+fn main_1() {
+  var i : i32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  let x_42 : i32 = x_7.x_GLF_uniform_int_values[1];
+  i = x_42;
+  loop {
+    let x_47 : i32 = i;
+    let x_49 : i32 = x_7.x_GLF_uniform_int_values[0];
+    if ((x_47 < x_49)) {
+    } else {
+      break;
+    }
+    let x_52 : i32 = i;
+    let x_54 : i32 = x_7.x_GLF_uniform_int_values[1];
+    if ((x_52 != x_54)) {
+      return;
+    }
+
+    continuing {
+      let x_58 : i32 = i;
+      i = (x_58 + 1);
+    }
+  }
+  let x_61 : f32 = gl_FragCoord.y;
+  let x_63 : f32 = x_9.x_GLF_uniform_float_values[0];
+  if ((x_61 < x_63)) {
+    return;
+  }
+  let x_68 : f32 = x_11.injectionSwitch.y;
+  x_GLF_color = vec4<f32>(vec3<f32>(1.0, 1.0, 1.0).x, vec3<f32>(1.0, 1.0, 1.0).y, vec3<f32>(1.0, 1.0, 1.0).z, x_68);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-return-partly-undefined-vector-from-array/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-return-partly-undefined-vector-from-array/0-opt.spvasm
new file mode 100644
index 0000000..b32d865
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-return-partly-undefined-vector-from-array/0-opt.spvasm
@@ -0,0 +1,120 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %func_ "func("
+               OpName %v "v"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %a "a"
+               OpName %indexable "indexable"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+         %18 = OpTypeFunction %v2float
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_float = OpTypePointer Function %float
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_2 = OpConstant %int 2
+      %int_1 = OpConstant %int 1
+     %uint_3 = OpConstant %uint 3
+%_arr_v2float_uint_3 = OpTypeArray %v2float %uint_3
+%_ptr_Function__arr_v2float_uint_3 = OpTypePointer Function %_arr_v2float_uint_3
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %main = OpFunction %void None %15
+         %39 = OpLabel
+         %40 = OpFunctionCall %v2float %func_
+         %41 = OpCompositeExtract %float %40 1
+         %42 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %43 = OpLoad %float %42
+         %44 = OpFOrdEqual %bool %41 %43
+               OpSelectionMerge %45 None
+               OpBranchConditional %44 %46 %47
+         %46 = OpLabel
+         %48 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %49 = OpLoad %int %48
+         %50 = OpConvertSToF %float %49
+         %51 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %52 = OpLoad %int %51
+         %53 = OpConvertSToF %float %52
+         %54 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %55 = OpLoad %int %54
+         %56 = OpConvertSToF %float %55
+         %57 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %58 = OpLoad %int %57
+         %59 = OpConvertSToF %float %58
+         %60 = OpCompositeConstruct %v4float %50 %53 %56 %59
+               OpStore %_GLF_color %60
+               OpBranch %45
+         %47 = OpLabel
+         %61 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %62 = OpLoad %int %61
+         %63 = OpConvertSToF %float %62
+         %64 = OpCompositeConstruct %v4float %63 %63 %63 %63
+               OpStore %_GLF_color %64
+               OpBranch %45
+         %45 = OpLabel
+               OpReturn
+               OpFunctionEnd
+      %func_ = OpFunction %v2float None %18
+         %65 = OpLabel
+          %v = OpVariable %_ptr_Function_v2float Function
+          %a = OpVariable %_ptr_Function_int Function
+  %indexable = OpVariable %_ptr_Function__arr_v2float_uint_3 Function
+         %66 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %67 = OpLoad %float %66
+         %68 = OpAccessChain %_ptr_Function_float %v %uint_1
+               OpStore %68 %67
+               OpStore %a %int_2
+         %69 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %70 = OpLoad %float %69
+         %71 = OpCompositeConstruct %v2float %70 %70
+         %72 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %73 = OpLoad %float %72
+         %74 = OpCompositeConstruct %v2float %73 %73
+         %75 = OpLoad %v2float %v
+         %76 = OpCompositeConstruct %_arr_v2float_uint_3 %71 %74 %75
+         %77 = OpLoad %int %a
+               OpStore %indexable %76
+         %78 = OpAccessChain %_ptr_Function_v2float %indexable %77
+         %79 = OpLoad %v2float %78
+               OpReturnValue %79
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-return-partly-undefined-vector-from-array/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-return-partly-undefined-vector-from-array/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..c33dd5c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-return-partly-undefined-vector-from-array/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,58 @@
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_11 : register(b1, space0) {
+  uint4 x_11[2];
+};
+
+float2 func_() {
+  float2 v = float2(0.0f, 0.0f);
+  int a = 0;
+  float2 indexable[3] = (float2[3])0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_67 = asfloat(x_7[scalar_offset / 4][scalar_offset % 4]);
+  v.y = x_67;
+  a = 2;
+  const float x_70 = asfloat(x_7[1].x);
+  const float x_73 = asfloat(x_7[1].x);
+  const int x_77 = a;
+  const float2 tint_symbol_4[3] = {float2(x_70, x_70), float2(x_73, x_73), v};
+  indexable = tint_symbol_4;
+  const float2 x_79 = indexable[x_77];
+  return x_79;
+}
+
+void main_1() {
+  const float2 x_40 = func_();
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_43 = asfloat(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_40.y == x_43)) {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_49 = asint(x_11[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_52 = asint(x_11[1].x);
+    const int x_55 = asint(x_11[1].x);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_58 = asint(x_11[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    x_GLF_color = float4(float(x_49), float(x_52), float(x_55), float(x_58));
+  } else {
+    const int x_62 = asint(x_11[1].x);
+    const float x_63 = float(x_62);
+    x_GLF_color = float4(x_63, x_63, x_63, x_63);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-return-partly-undefined-vector-from-array/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-return-partly-undefined-vector-from-array/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..d54821f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-return-partly-undefined-vector-from-array/0-opt.spvasm.expected.msl
@@ -0,0 +1,75 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_2 {
+  float2 arr[3];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float2 func_(constant buf0& x_7) {
+  float2 v = 0.0f;
+  int a = 0;
+  tint_array_wrapper_2 indexable = {};
+  float const x_67 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  v.y = x_67;
+  a = 2;
+  float const x_70 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  float const x_73 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  float2 const x_75 = v;
+  int const x_77 = a;
+  tint_array_wrapper_2 const tint_symbol_3 = {.arr={float2(x_70, x_70), float2(x_73, x_73), x_75}};
+  indexable = tint_symbol_3;
+  float2 const x_79 = indexable.arr[x_77];
+  return x_79;
+}
+
+void main_1(constant buf0& x_7, constant buf1& x_11, thread float4* const tint_symbol_5) {
+  float2 const x_40 = func_(x_7);
+  float const x_43 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_40.y == x_43)) {
+    int const x_49 = x_11.x_GLF_uniform_int_values.arr[0].el;
+    int const x_52 = x_11.x_GLF_uniform_int_values.arr[1].el;
+    int const x_55 = x_11.x_GLF_uniform_int_values.arr[1].el;
+    int const x_58 = x_11.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_5) = float4(float(x_49), float(x_52), float(x_55), float(x_58));
+  } else {
+    int const x_62 = x_11.x_GLF_uniform_int_values.arr[1].el;
+    float const x_63 = float(x_62);
+    *(tint_symbol_5) = float4(x_63, x_63, x_63, x_63);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]], constant buf1& x_11 [[buffer(1)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_7, x_11, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-return-partly-undefined-vector-from-array/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-return-partly-undefined-vector-from-array/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..b6b2b57
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-return-partly-undefined-vector-from-array/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,157 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 98
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_11 "x_11"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_ "func_"
+               OpName %v "v"
+               OpName %a "a"
+               OpName %indexable "indexable"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_11 NonWritable
+               OpDecorate %x_11 DescriptorSet 0
+               OpDecorate %x_11 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_v2float_uint_3 ArrayStride 8
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %11 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %11
+        %int = OpTypeInt 32 1
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_11 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %11
+    %v2float = OpTypeVector %float 2
+         %19 = OpTypeFunction %v2float
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %25 = OpConstantNull %v2float
+%_ptr_Function_int = OpTypePointer Function %int
+         %28 = OpConstantNull %int
+     %uint_3 = OpConstant %uint 3
+%_arr_v2float_uint_3 = OpTypeArray %v2float %uint_3
+%_ptr_Function__arr_v2float_uint_3 = OpTypePointer Function %_arr_v2float_uint_3
+         %33 = OpConstantNull %_arr_v2float_uint_3
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_2 = OpConstant %int 2
+      %int_1 = OpConstant %int 1
+       %void = OpTypeVoid
+         %55 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+         %86 = OpTypeFunction %void %main_out
+      %func_ = OpFunction %v2float None %19
+         %22 = OpLabel
+          %v = OpVariable %_ptr_Function_v2float Function %25
+          %a = OpVariable %_ptr_Function_int Function %28
+  %indexable = OpVariable %_ptr_Function__arr_v2float_uint_3 Function %33
+         %37 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %38 = OpLoad %float %37
+         %41 = OpAccessChain %_ptr_Function_float %v %uint_1
+               OpStore %41 %38
+               OpStore %a %int_2
+         %44 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %45 = OpLoad %float %44
+         %46 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %47 = OpLoad %float %46
+         %48 = OpLoad %v2float %v
+         %49 = OpLoad %int %a
+         %50 = OpCompositeConstruct %v2float %45 %45
+         %51 = OpCompositeConstruct %v2float %47 %47
+         %52 = OpCompositeConstruct %_arr_v2float_uint_3 %50 %51 %48
+               OpStore %indexable %52
+         %53 = OpAccessChain %_ptr_Function_v2float %indexable %49
+         %54 = OpLoad %v2float %53
+               OpReturnValue %54
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %55
+         %58 = OpLabel
+         %59 = OpFunctionCall %v2float %func_
+         %60 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %61 = OpLoad %float %60
+         %62 = OpCompositeExtract %float %59 1
+         %63 = OpFOrdEqual %bool %62 %61
+               OpSelectionMerge %65 None
+               OpBranchConditional %63 %66 %67
+         %66 = OpLabel
+         %69 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+         %70 = OpLoad %int %69
+         %71 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+         %72 = OpLoad %int %71
+         %73 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+         %74 = OpLoad %int %73
+         %75 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+         %76 = OpLoad %int %75
+         %77 = OpConvertSToF %float %70
+         %78 = OpConvertSToF %float %72
+         %79 = OpConvertSToF %float %74
+         %80 = OpConvertSToF %float %76
+         %81 = OpCompositeConstruct %v4float %77 %78 %79 %80
+               OpStore %x_GLF_color %81
+               OpBranch %65
+         %67 = OpLabel
+         %82 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+         %83 = OpLoad %int %82
+         %84 = OpConvertSToF %float %83
+         %85 = OpCompositeConstruct %v4float %84 %84 %84 %84
+               OpStore %x_GLF_color %85
+               OpBranch %65
+         %65 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %86
+%tint_symbol = OpFunctionParameter %main_out
+         %90 = OpLabel
+         %91 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %91
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %55
+         %93 = OpLabel
+         %94 = OpFunctionCall %void %main_1
+         %96 = OpLoad %v4float %x_GLF_color
+         %97 = OpCompositeConstruct %main_out %96
+         %95 = OpFunctionCall %void %tint_symbol_2 %97
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-return-partly-undefined-vector-from-array/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-return-partly-undefined-vector-from-array/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..6a66f39
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-return-partly-undefined-vector-from-array/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,63 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_11 : buf1;
+
+fn func_() -> vec2<f32> {
+  var v : vec2<f32>;
+  var a : i32;
+  var indexable : array<vec2<f32>, 3>;
+  let x_67 : f32 = x_7.x_GLF_uniform_float_values[0];
+  v.y = x_67;
+  a = 2;
+  let x_70 : f32 = x_7.x_GLF_uniform_float_values[1];
+  let x_73 : f32 = x_7.x_GLF_uniform_float_values[1];
+  let x_75 : vec2<f32> = v;
+  let x_77 : i32 = a;
+  indexable = array<vec2<f32>, 3>(vec2<f32>(x_70, x_70), vec2<f32>(x_73, x_73), x_75);
+  let x_79 : vec2<f32> = indexable[x_77];
+  return x_79;
+}
+
+fn main_1() {
+  let x_40 : vec2<f32> = func_();
+  let x_43 : f32 = x_7.x_GLF_uniform_float_values[0];
+  if ((x_40.y == x_43)) {
+    let x_49 : i32 = x_11.x_GLF_uniform_int_values[0];
+    let x_52 : i32 = x_11.x_GLF_uniform_int_values[1];
+    let x_55 : i32 = x_11.x_GLF_uniform_int_values[1];
+    let x_58 : i32 = x_11.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_49), f32(x_52), f32(x_55), f32(x_58));
+  } else {
+    let x_62 : i32 = x_11.x_GLF_uniform_int_values[1];
+    let x_63 : f32 = f32(x_62);
+    x_GLF_color = vec4<f32>(x_63, x_63, x_63, x_63);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-return-partly-undefined-vector-from-array/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-return-partly-undefined-vector-from-array/0-opt.wgsl
new file mode 100644
index 0000000..6a66f39
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-return-partly-undefined-vector-from-array/0-opt.wgsl
@@ -0,0 +1,63 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_11 : buf1;
+
+fn func_() -> vec2<f32> {
+  var v : vec2<f32>;
+  var a : i32;
+  var indexable : array<vec2<f32>, 3>;
+  let x_67 : f32 = x_7.x_GLF_uniform_float_values[0];
+  v.y = x_67;
+  a = 2;
+  let x_70 : f32 = x_7.x_GLF_uniform_float_values[1];
+  let x_73 : f32 = x_7.x_GLF_uniform_float_values[1];
+  let x_75 : vec2<f32> = v;
+  let x_77 : i32 = a;
+  indexable = array<vec2<f32>, 3>(vec2<f32>(x_70, x_70), vec2<f32>(x_73, x_73), x_75);
+  let x_79 : vec2<f32> = indexable[x_77];
+  return x_79;
+}
+
+fn main_1() {
+  let x_40 : vec2<f32> = func_();
+  let x_43 : f32 = x_7.x_GLF_uniform_float_values[0];
+  if ((x_40.y == x_43)) {
+    let x_49 : i32 = x_11.x_GLF_uniform_int_values[0];
+    let x_52 : i32 = x_11.x_GLF_uniform_int_values[1];
+    let x_55 : i32 = x_11.x_GLF_uniform_int_values[1];
+    let x_58 : i32 = x_11.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_49), f32(x_52), f32(x_55), f32(x_58));
+  } else {
+    let x_62 : i32 = x_11.x_GLF_uniform_int_values[1];
+    let x_63 : f32 = f32(x_62);
+    x_GLF_color = vec4<f32>(x_63, x_63, x_63, x_63);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-return-partly-undefined-vector-from-array/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-return-partly-undefined-vector-from-array/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..c33dd5c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-return-partly-undefined-vector-from-array/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,58 @@
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_11 : register(b1, space0) {
+  uint4 x_11[2];
+};
+
+float2 func_() {
+  float2 v = float2(0.0f, 0.0f);
+  int a = 0;
+  float2 indexable[3] = (float2[3])0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_67 = asfloat(x_7[scalar_offset / 4][scalar_offset % 4]);
+  v.y = x_67;
+  a = 2;
+  const float x_70 = asfloat(x_7[1].x);
+  const float x_73 = asfloat(x_7[1].x);
+  const int x_77 = a;
+  const float2 tint_symbol_4[3] = {float2(x_70, x_70), float2(x_73, x_73), v};
+  indexable = tint_symbol_4;
+  const float2 x_79 = indexable[x_77];
+  return x_79;
+}
+
+void main_1() {
+  const float2 x_40 = func_();
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_43 = asfloat(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_40.y == x_43)) {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_49 = asint(x_11[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_52 = asint(x_11[1].x);
+    const int x_55 = asint(x_11[1].x);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_58 = asint(x_11[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    x_GLF_color = float4(float(x_49), float(x_52), float(x_55), float(x_58));
+  } else {
+    const int x_62 = asint(x_11[1].x);
+    const float x_63 = float(x_62);
+    x_GLF_color = float4(x_63, x_63, x_63, x_63);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-return-partly-undefined-vector-from-array/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-return-partly-undefined-vector-from-array/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..d54821f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-return-partly-undefined-vector-from-array/0-opt.wgsl.expected.msl
@@ -0,0 +1,75 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_2 {
+  float2 arr[3];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float2 func_(constant buf0& x_7) {
+  float2 v = 0.0f;
+  int a = 0;
+  tint_array_wrapper_2 indexable = {};
+  float const x_67 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  v.y = x_67;
+  a = 2;
+  float const x_70 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  float const x_73 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  float2 const x_75 = v;
+  int const x_77 = a;
+  tint_array_wrapper_2 const tint_symbol_3 = {.arr={float2(x_70, x_70), float2(x_73, x_73), x_75}};
+  indexable = tint_symbol_3;
+  float2 const x_79 = indexable.arr[x_77];
+  return x_79;
+}
+
+void main_1(constant buf0& x_7, constant buf1& x_11, thread float4* const tint_symbol_5) {
+  float2 const x_40 = func_(x_7);
+  float const x_43 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_40.y == x_43)) {
+    int const x_49 = x_11.x_GLF_uniform_int_values.arr[0].el;
+    int const x_52 = x_11.x_GLF_uniform_int_values.arr[1].el;
+    int const x_55 = x_11.x_GLF_uniform_int_values.arr[1].el;
+    int const x_58 = x_11.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_5) = float4(float(x_49), float(x_52), float(x_55), float(x_58));
+  } else {
+    int const x_62 = x_11.x_GLF_uniform_int_values.arr[1].el;
+    float const x_63 = float(x_62);
+    *(tint_symbol_5) = float4(x_63, x_63, x_63, x_63);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]], constant buf1& x_11 [[buffer(1)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_7, x_11, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-return-partly-undefined-vector-from-array/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-return-partly-undefined-vector-from-array/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..b6b2b57
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-return-partly-undefined-vector-from-array/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,157 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 98
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_11 "x_11"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_ "func_"
+               OpName %v "v"
+               OpName %a "a"
+               OpName %indexable "indexable"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_11 NonWritable
+               OpDecorate %x_11 DescriptorSet 0
+               OpDecorate %x_11 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_v2float_uint_3 ArrayStride 8
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %11 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %11
+        %int = OpTypeInt 32 1
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_11 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %11
+    %v2float = OpTypeVector %float 2
+         %19 = OpTypeFunction %v2float
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %25 = OpConstantNull %v2float
+%_ptr_Function_int = OpTypePointer Function %int
+         %28 = OpConstantNull %int
+     %uint_3 = OpConstant %uint 3
+%_arr_v2float_uint_3 = OpTypeArray %v2float %uint_3
+%_ptr_Function__arr_v2float_uint_3 = OpTypePointer Function %_arr_v2float_uint_3
+         %33 = OpConstantNull %_arr_v2float_uint_3
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_2 = OpConstant %int 2
+      %int_1 = OpConstant %int 1
+       %void = OpTypeVoid
+         %55 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+         %86 = OpTypeFunction %void %main_out
+      %func_ = OpFunction %v2float None %19
+         %22 = OpLabel
+          %v = OpVariable %_ptr_Function_v2float Function %25
+          %a = OpVariable %_ptr_Function_int Function %28
+  %indexable = OpVariable %_ptr_Function__arr_v2float_uint_3 Function %33
+         %37 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %38 = OpLoad %float %37
+         %41 = OpAccessChain %_ptr_Function_float %v %uint_1
+               OpStore %41 %38
+               OpStore %a %int_2
+         %44 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %45 = OpLoad %float %44
+         %46 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %47 = OpLoad %float %46
+         %48 = OpLoad %v2float %v
+         %49 = OpLoad %int %a
+         %50 = OpCompositeConstruct %v2float %45 %45
+         %51 = OpCompositeConstruct %v2float %47 %47
+         %52 = OpCompositeConstruct %_arr_v2float_uint_3 %50 %51 %48
+               OpStore %indexable %52
+         %53 = OpAccessChain %_ptr_Function_v2float %indexable %49
+         %54 = OpLoad %v2float %53
+               OpReturnValue %54
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %55
+         %58 = OpLabel
+         %59 = OpFunctionCall %v2float %func_
+         %60 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %61 = OpLoad %float %60
+         %62 = OpCompositeExtract %float %59 1
+         %63 = OpFOrdEqual %bool %62 %61
+               OpSelectionMerge %65 None
+               OpBranchConditional %63 %66 %67
+         %66 = OpLabel
+         %69 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+         %70 = OpLoad %int %69
+         %71 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+         %72 = OpLoad %int %71
+         %73 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+         %74 = OpLoad %int %73
+         %75 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_0
+         %76 = OpLoad %int %75
+         %77 = OpConvertSToF %float %70
+         %78 = OpConvertSToF %float %72
+         %79 = OpConvertSToF %float %74
+         %80 = OpConvertSToF %float %76
+         %81 = OpCompositeConstruct %v4float %77 %78 %79 %80
+               OpStore %x_GLF_color %81
+               OpBranch %65
+         %67 = OpLabel
+         %82 = OpAccessChain %_ptr_Uniform_int %x_11 %uint_0 %int_1
+         %83 = OpLoad %int %82
+         %84 = OpConvertSToF %float %83
+         %85 = OpCompositeConstruct %v4float %84 %84 %84 %84
+               OpStore %x_GLF_color %85
+               OpBranch %65
+         %65 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %86
+%tint_symbol = OpFunctionParameter %main_out
+         %90 = OpLabel
+         %91 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %91
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %55
+         %93 = OpLabel
+         %94 = OpFunctionCall %void %main_1
+         %96 = OpLoad %v4float %x_GLF_color
+         %97 = OpCompositeConstruct %main_out %96
+         %95 = OpFunctionCall %void %tint_symbol_2 %97
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-return-partly-undefined-vector-from-array/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-return-partly-undefined-vector-from-array/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..6a66f39
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-return-partly-undefined-vector-from-array/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,63 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_11 : buf1;
+
+fn func_() -> vec2<f32> {
+  var v : vec2<f32>;
+  var a : i32;
+  var indexable : array<vec2<f32>, 3>;
+  let x_67 : f32 = x_7.x_GLF_uniform_float_values[0];
+  v.y = x_67;
+  a = 2;
+  let x_70 : f32 = x_7.x_GLF_uniform_float_values[1];
+  let x_73 : f32 = x_7.x_GLF_uniform_float_values[1];
+  let x_75 : vec2<f32> = v;
+  let x_77 : i32 = a;
+  indexable = array<vec2<f32>, 3>(vec2<f32>(x_70, x_70), vec2<f32>(x_73, x_73), x_75);
+  let x_79 : vec2<f32> = indexable[x_77];
+  return x_79;
+}
+
+fn main_1() {
+  let x_40 : vec2<f32> = func_();
+  let x_43 : f32 = x_7.x_GLF_uniform_float_values[0];
+  if ((x_40.y == x_43)) {
+    let x_49 : i32 = x_11.x_GLF_uniform_int_values[0];
+    let x_52 : i32 = x_11.x_GLF_uniform_int_values[1];
+    let x_55 : i32 = x_11.x_GLF_uniform_int_values[1];
+    let x_58 : i32 = x_11.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_49), f32(x_52), f32(x_55), f32(x_58));
+  } else {
+    let x_62 : i32 = x_11.x_GLF_uniform_int_values[1];
+    let x_63 : f32 = f32(x_62);
+    x_GLF_color = vec4<f32>(x_63, x_63, x_63, x_63);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops-array-access/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops-array-access/0-opt.spvasm
new file mode 100644
index 0000000..1437592
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops-array-access/0-opt.spvasm
@@ -0,0 +1,431 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %sums "sums"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %d "d"
+               OpName %e "e"
+               OpName %f "f"
+               OpName %g "g"
+               OpName %h "h"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_7 ArrayStride 16
+               OpMemberDecorate %buf0 0 RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %20 RelaxedPrecision
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %22 RelaxedPrecision
+               OpDecorate %a RelaxedPrecision
+               OpDecorate %23 RelaxedPrecision
+               OpDecorate %24 RelaxedPrecision
+               OpDecorate %25 RelaxedPrecision
+               OpDecorate %b RelaxedPrecision
+               OpDecorate %26 RelaxedPrecision
+               OpDecorate %27 RelaxedPrecision
+               OpDecorate %28 RelaxedPrecision
+               OpDecorate %c RelaxedPrecision
+               OpDecorate %29 RelaxedPrecision
+               OpDecorate %30 RelaxedPrecision
+               OpDecorate %31 RelaxedPrecision
+               OpDecorate %d RelaxedPrecision
+               OpDecorate %32 RelaxedPrecision
+               OpDecorate %33 RelaxedPrecision
+               OpDecorate %34 RelaxedPrecision
+               OpDecorate %e RelaxedPrecision
+               OpDecorate %35 RelaxedPrecision
+               OpDecorate %36 RelaxedPrecision
+               OpDecorate %37 RelaxedPrecision
+               OpDecorate %f RelaxedPrecision
+               OpDecorate %38 RelaxedPrecision
+               OpDecorate %39 RelaxedPrecision
+               OpDecorate %40 RelaxedPrecision
+               OpDecorate %g RelaxedPrecision
+               OpDecorate %41 RelaxedPrecision
+               OpDecorate %42 RelaxedPrecision
+               OpDecorate %43 RelaxedPrecision
+               OpDecorate %h RelaxedPrecision
+               OpDecorate %44 RelaxedPrecision
+               OpDecorate %45 RelaxedPrecision
+               OpDecorate %46 RelaxedPrecision
+               OpDecorate %i RelaxedPrecision
+               OpDecorate %47 RelaxedPrecision
+               OpDecorate %48 RelaxedPrecision
+               OpDecorate %49 RelaxedPrecision
+               OpDecorate %j RelaxedPrecision
+               OpDecorate %50 RelaxedPrecision
+               OpDecorate %51 RelaxedPrecision
+               OpDecorate %52 RelaxedPrecision
+               OpDecorate %53 RelaxedPrecision
+               OpDecorate %54 RelaxedPrecision
+               OpDecorate %55 RelaxedPrecision
+               OpDecorate %56 RelaxedPrecision
+               OpDecorate %57 RelaxedPrecision
+               OpDecorate %58 RelaxedPrecision
+               OpDecorate %59 RelaxedPrecision
+               OpDecorate %60 RelaxedPrecision
+               OpDecorate %61 RelaxedPrecision
+               OpDecorate %62 RelaxedPrecision
+               OpDecorate %63 RelaxedPrecision
+               OpDecorate %64 RelaxedPrecision
+               OpDecorate %65 RelaxedPrecision
+               OpDecorate %66 RelaxedPrecision
+               OpDecorate %67 RelaxedPrecision
+               OpDecorate %68 RelaxedPrecision
+               OpDecorate %69 RelaxedPrecision
+               OpDecorate %70 RelaxedPrecision
+               OpDecorate %71 RelaxedPrecision
+               OpDecorate %72 RelaxedPrecision
+               OpDecorate %73 RelaxedPrecision
+               OpDecorate %74 RelaxedPrecision
+               OpDecorate %75 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %76 RelaxedPrecision
+               OpDecorate %77 RelaxedPrecision
+               OpDecorate %78 RelaxedPrecision
+               OpDecorate %79 RelaxedPrecision
+               OpDecorate %80 RelaxedPrecision
+       %void = OpTypeVoid
+         %82 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+%_ptr_Function__arr_float_uint_2 = OpTypePointer Function %_arr_float_uint_2
+        %int = OpTypeInt 32 1
+     %uint_7 = OpConstant %uint 7
+%_arr_int_uint_7 = OpTypeArray %int %uint_7
+       %buf0 = OpTypeStruct %_arr_int_uint_7
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf1 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_2 = OpConstant %int 2
+%_ptr_Function_int = OpTypePointer Function %int
+       %bool = OpTypeBool
+      %int_5 = OpConstant %int 5
+      %int_3 = OpConstant %int 3
+      %int_6 = OpConstant %int 6
+      %int_4 = OpConstant %int 4
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %82
+        %107 = OpLabel
+       %sums = OpVariable %_ptr_Function__arr_float_uint_2 Function
+          %a = OpVariable %_ptr_Function_int Function
+          %b = OpVariable %_ptr_Function_int Function
+          %c = OpVariable %_ptr_Function_int Function
+          %d = OpVariable %_ptr_Function_int Function
+          %e = OpVariable %_ptr_Function_int Function
+          %f = OpVariable %_ptr_Function_int Function
+          %g = OpVariable %_ptr_Function_int Function
+          %h = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+          %j = OpVariable %_ptr_Function_int Function
+        %108 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %20 = OpLoad %int %108
+        %109 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+        %110 = OpLoad %float %109
+        %111 = OpAccessChain %_ptr_Function_float %sums %20
+               OpStore %111 %110
+        %112 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %22 = OpLoad %int %112
+        %113 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+        %114 = OpLoad %float %113
+        %115 = OpAccessChain %_ptr_Function_float %sums %22
+               OpStore %115 %114
+        %116 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %23 = OpLoad %int %116
+               OpStore %a %23
+               OpBranch %117
+        %117 = OpLabel
+               OpLoopMerge %118 %119 None
+               OpBranch %120
+        %120 = OpLabel
+         %24 = OpLoad %int %a
+        %121 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %25 = OpLoad %int %121
+        %122 = OpSLessThan %bool %24 %25
+               OpBranchConditional %122 %123 %118
+        %123 = OpLabel
+        %124 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_5
+         %26 = OpLoad %int %124
+               OpStore %b %26
+               OpBranch %125
+        %125 = OpLabel
+               OpLoopMerge %126 %127 None
+               OpBranch %128
+        %128 = OpLabel
+         %27 = OpLoad %int %b
+        %129 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %28 = OpLoad %int %129
+        %130 = OpSLessThan %bool %27 %28
+               OpBranchConditional %130 %131 %126
+        %131 = OpLabel
+        %132 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_6
+         %29 = OpLoad %int %132
+               OpStore %c %29
+               OpBranch %133
+        %133 = OpLabel
+               OpLoopMerge %134 %135 None
+               OpBranch %136
+        %136 = OpLabel
+         %30 = OpLoad %int %c
+        %137 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_4
+         %31 = OpLoad %int %137
+        %138 = OpSLessThanEqual %bool %30 %31
+               OpBranchConditional %138 %139 %134
+        %139 = OpLabel
+        %140 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %32 = OpLoad %int %140
+               OpStore %d %32
+               OpBranch %141
+        %141 = OpLabel
+               OpLoopMerge %142 %143 None
+               OpBranch %144
+        %144 = OpLabel
+         %33 = OpLoad %int %d
+        %145 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_6
+         %34 = OpLoad %int %145
+        %146 = OpSLessThan %bool %33 %34
+               OpBranchConditional %146 %147 %142
+        %147 = OpLabel
+        %148 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %35 = OpLoad %int %148
+               OpStore %e %35
+               OpBranch %149
+        %149 = OpLabel
+               OpLoopMerge %150 %151 None
+               OpBranch %152
+        %152 = OpLabel
+         %36 = OpLoad %int %e
+        %153 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_4
+         %37 = OpLoad %int %153
+        %154 = OpSLessThanEqual %bool %36 %37
+               OpBranchConditional %154 %155 %150
+        %155 = OpLabel
+        %156 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %38 = OpLoad %int %156
+               OpStore %f %38
+               OpBranch %157
+        %157 = OpLabel
+               OpLoopMerge %158 %159 None
+               OpBranch %160
+        %160 = OpLabel
+         %39 = OpLoad %int %f
+        %161 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %40 = OpLoad %int %161
+        %162 = OpSLessThan %bool %39 %40
+               OpBranchConditional %162 %163 %158
+        %163 = OpLabel
+        %164 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %41 = OpLoad %int %164
+               OpStore %g %41
+               OpBranch %165
+        %165 = OpLabel
+               OpLoopMerge %166 %167 None
+               OpBranch %168
+        %168 = OpLabel
+         %42 = OpLoad %int %g
+        %169 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_6
+         %43 = OpLoad %int %169
+        %170 = OpSLessThan %bool %42 %43
+               OpBranchConditional %170 %171 %166
+        %171 = OpLabel
+        %172 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %44 = OpLoad %int %172
+               OpStore %h %44
+               OpBranch %173
+        %173 = OpLabel
+               OpLoopMerge %174 %175 None
+               OpBranch %176
+        %176 = OpLabel
+         %45 = OpLoad %int %h
+        %177 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %46 = OpLoad %int %177
+        %178 = OpSLessThan %bool %45 %46
+               OpBranchConditional %178 %179 %174
+        %179 = OpLabel
+        %180 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %47 = OpLoad %int %180
+               OpStore %i %47
+               OpBranch %181
+        %181 = OpLabel
+               OpLoopMerge %182 %183 None
+               OpBranch %184
+        %184 = OpLabel
+         %48 = OpLoad %int %i
+        %185 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_4
+         %49 = OpLoad %int %185
+        %186 = OpSLessThan %bool %48 %49
+               OpBranchConditional %186 %187 %182
+        %187 = OpLabel
+        %188 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %50 = OpLoad %int %188
+               OpStore %j %50
+               OpBranch %189
+        %189 = OpLabel
+               OpLoopMerge %190 %191 None
+               OpBranch %192
+        %192 = OpLabel
+         %51 = OpLoad %int %j
+        %193 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %52 = OpLoad %int %193
+        %194 = OpSGreaterThan %bool %51 %52
+               OpBranchConditional %194 %195 %190
+        %195 = OpLabel
+         %53 = OpLoad %int %a
+        %196 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_2
+        %197 = OpLoad %float %196
+        %198 = OpAccessChain %_ptr_Function_float %sums %53
+        %199 = OpLoad %float %198
+        %200 = OpFAdd %float %199 %197
+        %201 = OpAccessChain %_ptr_Function_float %sums %53
+               OpStore %201 %200
+               OpBranch %191
+        %191 = OpLabel
+         %54 = OpLoad %int %j
+         %55 = OpISub %int %54 %int_1
+               OpStore %j %55
+               OpBranch %189
+        %190 = OpLabel
+               OpBranch %183
+        %183 = OpLabel
+         %56 = OpLoad %int %i
+         %57 = OpIAdd %int %56 %int_1
+               OpStore %i %57
+               OpBranch %181
+        %182 = OpLabel
+               OpBranch %175
+        %175 = OpLabel
+         %58 = OpLoad %int %h
+         %59 = OpIAdd %int %58 %int_1
+               OpStore %h %59
+               OpBranch %173
+        %174 = OpLabel
+               OpBranch %167
+        %167 = OpLabel
+         %60 = OpLoad %int %g
+         %61 = OpIAdd %int %60 %int_1
+               OpStore %g %61
+               OpBranch %165
+        %166 = OpLabel
+               OpBranch %159
+        %159 = OpLabel
+         %62 = OpLoad %int %f
+         %63 = OpIAdd %int %62 %int_1
+               OpStore %f %63
+               OpBranch %157
+        %158 = OpLabel
+               OpBranch %151
+        %151 = OpLabel
+         %64 = OpLoad %int %e
+         %65 = OpIAdd %int %64 %int_1
+               OpStore %e %65
+               OpBranch %149
+        %150 = OpLabel
+               OpBranch %143
+        %143 = OpLabel
+         %66 = OpLoad %int %d
+         %67 = OpIAdd %int %66 %int_1
+               OpStore %d %67
+               OpBranch %141
+        %142 = OpLabel
+               OpBranch %135
+        %135 = OpLabel
+         %68 = OpLoad %int %c
+         %69 = OpIAdd %int %68 %int_1
+               OpStore %c %69
+               OpBranch %133
+        %134 = OpLabel
+               OpBranch %127
+        %127 = OpLabel
+         %70 = OpLoad %int %b
+         %71 = OpIAdd %int %70 %int_1
+               OpStore %b %71
+               OpBranch %125
+        %126 = OpLabel
+               OpBranch %119
+        %119 = OpLabel
+         %72 = OpLoad %int %a
+         %73 = OpIAdd %int %72 %int_1
+               OpStore %a %73
+               OpBranch %117
+        %118 = OpLabel
+        %202 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %74 = OpLoad %int %202
+        %203 = OpAccessChain %_ptr_Function_float %sums %74
+        %204 = OpLoad %float %203
+        %205 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_1
+        %206 = OpLoad %float %205
+        %207 = OpFOrdEqual %bool %204 %206
+               OpSelectionMerge %208 None
+               OpBranchConditional %207 %209 %208
+        %209 = OpLabel
+        %210 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %75 = OpLoad %int %210
+        %211 = OpAccessChain %_ptr_Function_float %sums %75
+        %212 = OpLoad %float %211
+        %213 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_1
+        %214 = OpLoad %float %213
+        %215 = OpFOrdEqual %bool %212 %214
+               OpBranch %208
+        %208 = OpLabel
+        %216 = OpPhi %bool %207 %118 %215 %209
+               OpSelectionMerge %217 None
+               OpBranchConditional %216 %218 %219
+        %218 = OpLabel
+        %220 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %76 = OpLoad %int %220
+        %221 = OpConvertSToF %float %76
+        %222 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %77 = OpLoad %int %222
+        %223 = OpConvertSToF %float %77
+        %224 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %78 = OpLoad %int %224
+        %225 = OpConvertSToF %float %78
+        %226 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %79 = OpLoad %int %226
+        %227 = OpConvertSToF %float %79
+        %228 = OpCompositeConstruct %v4float %221 %223 %225 %227
+               OpStore %_GLF_color %228
+               OpBranch %217
+        %219 = OpLabel
+        %229 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %80 = OpLoad %int %229
+        %230 = OpConvertSToF %float %80
+        %231 = OpCompositeConstruct %v4float %230 %230 %230 %230
+               OpStore %_GLF_color %231
+               OpBranch %217
+        %217 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops-array-access/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops-array-access/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..5d63b9b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops-array-access/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,208 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[7];
+};
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float sums[2] = (float[2])0;
+  int a = 0;
+  int b = 0;
+  int c = 0;
+  int d = 0;
+  int e = 0;
+  int f = 0;
+  int g = 0;
+  int h = 0;
+  int i = 0;
+  int j = 0;
+  bool x_215 = false;
+  bool x_216_phi = false;
+  const int x_20 = asint(x_6[1].x);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_110 = asfloat(x_8[scalar_offset / 4][scalar_offset % 4]);
+  sums[x_20] = x_110;
+  const int x_22 = asint(x_6[2].x);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_114 = asfloat(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  sums[x_22] = x_114;
+  const int x_23 = asint(x_6[1].x);
+  a = x_23;
+  while (true) {
+    const int x_24 = a;
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_25 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    if ((x_24 < x_25)) {
+    } else {
+      break;
+    }
+    const int x_26 = asint(x_6[5].x);
+    b = x_26;
+    while (true) {
+      const int x_27 = b;
+      const int x_28 = asint(x_6[3].x);
+      if ((x_27 < x_28)) {
+      } else {
+        break;
+      }
+      const int x_29 = asint(x_6[6].x);
+      c = x_29;
+      while (true) {
+        const int x_30 = c;
+        const int x_31 = asint(x_6[4].x);
+        if ((x_30 <= x_31)) {
+        } else {
+          break;
+        }
+        const int x_32 = asint(x_6[1].x);
+        d = x_32;
+        while (true) {
+          const int x_33 = d;
+          const int x_34 = asint(x_6[6].x);
+          if ((x_33 < x_34)) {
+          } else {
+            break;
+          }
+          const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+          const int x_35 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+          e = x_35;
+          while (true) {
+            const int x_36 = e;
+            const int x_37 = asint(x_6[4].x);
+            if ((x_36 <= x_37)) {
+            } else {
+              break;
+            }
+            const int x_38 = asint(x_6[1].x);
+            f = x_38;
+            while (true) {
+              const int x_39 = f;
+              const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+              const int x_40 = asint(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+              if ((x_39 < x_40)) {
+              } else {
+                break;
+              }
+              const int x_41 = asint(x_6[1].x);
+              g = x_41;
+              while (true) {
+                const int x_42 = g;
+                const int x_43 = asint(x_6[6].x);
+                if ((x_42 < x_43)) {
+                } else {
+                  break;
+                }
+                const int x_44 = asint(x_6[1].x);
+                h = x_44;
+                while (true) {
+                  const int x_45 = h;
+                  const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+                  const int x_46 = asint(x_6[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+                  if ((x_45 < x_46)) {
+                  } else {
+                    break;
+                  }
+                  const int x_47 = asint(x_6[1].x);
+                  i = x_47;
+                  while (true) {
+                    const int x_48 = i;
+                    const int x_49 = asint(x_6[4].x);
+                    if ((x_48 < x_49)) {
+                    } else {
+                      break;
+                    }
+                    const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+                    const int x_50 = asint(x_6[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+                    j = x_50;
+                    while (true) {
+                      const int x_51 = j;
+                      const int x_52 = asint(x_6[1].x);
+                      if ((x_51 > x_52)) {
+                      } else {
+                        break;
+                      }
+                      const int x_53 = a;
+                      const float x_197 = asfloat(x_8[2].x);
+                      const float x_199 = sums[x_53];
+                      sums[x_53] = (x_199 + x_197);
+                      {
+                        j = (j - 1);
+                      }
+                    }
+                    {
+                      i = (i + 1);
+                    }
+                  }
+                  {
+                    h = (h + 1);
+                  }
+                }
+                {
+                  g = (g + 1);
+                }
+              }
+              {
+                f = (f + 1);
+              }
+            }
+            {
+              e = (e + 1);
+            }
+          }
+          {
+            d = (d + 1);
+          }
+        }
+        {
+          c = (c + 1);
+        }
+      }
+      {
+        b = (b + 1);
+      }
+    }
+    {
+      a = (a + 1);
+    }
+  }
+  const int x_74 = asint(x_6[1].x);
+  const float x_204 = sums[x_74];
+  const float x_206 = asfloat(x_8[1].x);
+  const bool x_207 = (x_204 == x_206);
+  x_216_phi = x_207;
+  if (x_207) {
+    const int x_75 = asint(x_6[2].x);
+    const float x_212 = sums[x_75];
+    const float x_214 = asfloat(x_8[1].x);
+    x_215 = (x_212 == x_214);
+    x_216_phi = x_215;
+  }
+  if (x_216_phi) {
+    const int x_76 = asint(x_6[2].x);
+    const int x_77 = asint(x_6[1].x);
+    const int x_78 = asint(x_6[1].x);
+    const int x_79 = asint(x_6[2].x);
+    x_GLF_color = float4(float(x_76), float(x_77), float(x_78), float(x_79));
+  } else {
+    const int x_80 = asint(x_6[1].x);
+    const float x_230 = float(x_80);
+    x_GLF_color = float4(x_230, x_230, x_230, x_230);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops-array-access/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops-array-access/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..14a2550
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops-array-access/0-opt.spvasm.expected.msl
@@ -0,0 +1,232 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[7];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct tint_array_wrapper_2 {
+  float arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_8, thread float4* const tint_symbol_4) {
+  tint_array_wrapper_2 sums = {};
+  int a = 0;
+  int b = 0;
+  int c = 0;
+  int d = 0;
+  int e = 0;
+  int f = 0;
+  int g = 0;
+  int h = 0;
+  int i = 0;
+  int j = 0;
+  bool x_215 = false;
+  bool x_216_phi = false;
+  int const x_20 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  float const x_110 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  sums.arr[x_20] = x_110;
+  int const x_22 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  float const x_114 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  sums.arr[x_22] = x_114;
+  int const x_23 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  a = x_23;
+  while (true) {
+    int const x_24 = a;
+    int const x_25 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_24 < x_25)) {
+    } else {
+      break;
+    }
+    int const x_26 = x_6.x_GLF_uniform_int_values.arr[5].el;
+    b = x_26;
+    while (true) {
+      int const x_27 = b;
+      int const x_28 = x_6.x_GLF_uniform_int_values.arr[3].el;
+      if ((x_27 < x_28)) {
+      } else {
+        break;
+      }
+      int const x_29 = x_6.x_GLF_uniform_int_values.arr[6].el;
+      c = x_29;
+      while (true) {
+        int const x_30 = c;
+        int const x_31 = x_6.x_GLF_uniform_int_values.arr[4].el;
+        if ((x_30 <= x_31)) {
+        } else {
+          break;
+        }
+        int const x_32 = x_6.x_GLF_uniform_int_values.arr[1].el;
+        d = x_32;
+        while (true) {
+          int const x_33 = d;
+          int const x_34 = x_6.x_GLF_uniform_int_values.arr[6].el;
+          if ((x_33 < x_34)) {
+          } else {
+            break;
+          }
+          int const x_35 = x_6.x_GLF_uniform_int_values.arr[0].el;
+          e = x_35;
+          while (true) {
+            int const x_36 = e;
+            int const x_37 = x_6.x_GLF_uniform_int_values.arr[4].el;
+            if ((x_36 <= x_37)) {
+            } else {
+              break;
+            }
+            int const x_38 = x_6.x_GLF_uniform_int_values.arr[1].el;
+            f = x_38;
+            while (true) {
+              int const x_39 = f;
+              int const x_40 = x_6.x_GLF_uniform_int_values.arr[0].el;
+              if ((x_39 < x_40)) {
+              } else {
+                break;
+              }
+              int const x_41 = x_6.x_GLF_uniform_int_values.arr[1].el;
+              g = x_41;
+              while (true) {
+                int const x_42 = g;
+                int const x_43 = x_6.x_GLF_uniform_int_values.arr[6].el;
+                if ((x_42 < x_43)) {
+                } else {
+                  break;
+                }
+                int const x_44 = x_6.x_GLF_uniform_int_values.arr[1].el;
+                h = x_44;
+                while (true) {
+                  int const x_45 = h;
+                  int const x_46 = x_6.x_GLF_uniform_int_values.arr[0].el;
+                  if ((x_45 < x_46)) {
+                  } else {
+                    break;
+                  }
+                  int const x_47 = x_6.x_GLF_uniform_int_values.arr[1].el;
+                  i = x_47;
+                  while (true) {
+                    int const x_48 = i;
+                    int const x_49 = x_6.x_GLF_uniform_int_values.arr[4].el;
+                    if ((x_48 < x_49)) {
+                    } else {
+                      break;
+                    }
+                    int const x_50 = x_6.x_GLF_uniform_int_values.arr[0].el;
+                    j = x_50;
+                    while (true) {
+                      int const x_51 = j;
+                      int const x_52 = x_6.x_GLF_uniform_int_values.arr[1].el;
+                      if ((x_51 > x_52)) {
+                      } else {
+                        break;
+                      }
+                      int const x_53 = a;
+                      float const x_197 = x_8.x_GLF_uniform_float_values.arr[2].el;
+                      float const x_199 = sums.arr[x_53];
+                      sums.arr[x_53] = (x_199 + x_197);
+                      {
+                        int const x_54 = j;
+                        j = (x_54 - 1);
+                      }
+                    }
+                    {
+                      int const x_56 = i;
+                      i = (x_56 + 1);
+                    }
+                  }
+                  {
+                    int const x_58 = h;
+                    h = (x_58 + 1);
+                  }
+                }
+                {
+                  int const x_60 = g;
+                  g = (x_60 + 1);
+                }
+              }
+              {
+                int const x_62 = f;
+                f = (x_62 + 1);
+              }
+            }
+            {
+              int const x_64 = e;
+              e = (x_64 + 1);
+            }
+          }
+          {
+            int const x_66 = d;
+            d = (x_66 + 1);
+          }
+        }
+        {
+          int const x_68 = c;
+          c = (x_68 + 1);
+        }
+      }
+      {
+        int const x_70 = b;
+        b = (x_70 + 1);
+      }
+    }
+    {
+      int const x_72 = a;
+      a = (x_72 + 1);
+    }
+  }
+  int const x_74 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  float const x_204 = sums.arr[x_74];
+  float const x_206 = x_8.x_GLF_uniform_float_values.arr[1].el;
+  bool const x_207 = (x_204 == x_206);
+  x_216_phi = x_207;
+  if (x_207) {
+    int const x_75 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    float const x_212 = sums.arr[x_75];
+    float const x_214 = x_8.x_GLF_uniform_float_values.arr[1].el;
+    x_215 = (x_212 == x_214);
+    x_216_phi = x_215;
+  }
+  bool const x_216 = x_216_phi;
+  if (x_216) {
+    int const x_76 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_77 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_78 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_79 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    *(tint_symbol_4) = float4(float(x_76), float(x_77), float(x_78), float(x_79));
+  } else {
+    int const x_80 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    float const x_230 = float(x_80);
+    *(tint_symbol_4) = float4(x_230, x_230, x_230, x_230);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_8 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops-array-access/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops-array-access/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..504fead
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops-array-access/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,456 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 274
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %sums "sums"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %d "d"
+               OpName %e "e"
+               OpName %f "f"
+               OpName %g "g"
+               OpName %h "h"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %x_215 "x_215"
+               OpName %x_216_phi "x_216_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_7 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_7 = OpConstant %uint 7
+%_arr_int_uint_7 = OpTypeArray %int %uint_7
+       %buf0 = OpTypeStruct %_arr_int_uint_7
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf1 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+%_ptr_Function__arr_float_uint_2 = OpTypePointer Function %_arr_float_uint_2
+         %28 = OpConstantNull %_arr_float_uint_2
+%_ptr_Function_int = OpTypePointer Function %int
+         %31 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %44 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_2 = OpConstant %int 2
+      %int_5 = OpConstant %int 5
+      %int_3 = OpConstant %int 3
+      %int_6 = OpConstant %int 6
+      %int_4 = OpConstant %int 4
+   %main_out = OpTypeStruct %v4float
+        %262 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+       %sums = OpVariable %_ptr_Function__arr_float_uint_2 Function %28
+          %a = OpVariable %_ptr_Function_int Function %31
+          %b = OpVariable %_ptr_Function_int Function %31
+          %c = OpVariable %_ptr_Function_int Function %31
+          %d = OpVariable %_ptr_Function_int Function %31
+          %e = OpVariable %_ptr_Function_int Function %31
+          %f = OpVariable %_ptr_Function_int Function %31
+          %g = OpVariable %_ptr_Function_int Function %31
+          %h = OpVariable %_ptr_Function_int Function %31
+          %i = OpVariable %_ptr_Function_int Function %31
+          %j = OpVariable %_ptr_Function_int Function %31
+      %x_215 = OpVariable %_ptr_Function_bool Function %44
+  %x_216_phi = OpVariable %_ptr_Function_bool Function %44
+         %49 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %50 = OpLoad %int %49
+         %53 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %54 = OpLoad %float %53
+         %56 = OpAccessChain %_ptr_Function_float %sums %50
+               OpStore %56 %54
+         %58 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %59 = OpLoad %int %58
+         %60 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %61 = OpLoad %float %60
+         %62 = OpAccessChain %_ptr_Function_float %sums %59
+               OpStore %62 %61
+         %63 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %64 = OpLoad %int %63
+               OpStore %a %64
+               OpBranch %65
+         %65 = OpLabel
+               OpLoopMerge %66 %67 None
+               OpBranch %68
+         %68 = OpLabel
+         %69 = OpLoad %int %a
+         %70 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %71 = OpLoad %int %70
+         %72 = OpSLessThan %bool %69 %71
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %74 %75
+         %74 = OpLabel
+               OpBranch %73
+         %75 = OpLabel
+               OpBranch %66
+         %73 = OpLabel
+         %77 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_5
+         %78 = OpLoad %int %77
+               OpStore %b %78
+               OpBranch %79
+         %79 = OpLabel
+               OpLoopMerge %80 %81 None
+               OpBranch %82
+         %82 = OpLabel
+         %83 = OpLoad %int %b
+         %85 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %86 = OpLoad %int %85
+         %87 = OpSLessThan %bool %83 %86
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %90
+         %89 = OpLabel
+               OpBranch %88
+         %90 = OpLabel
+               OpBranch %80
+         %88 = OpLabel
+         %92 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_6
+         %93 = OpLoad %int %92
+               OpStore %c %93
+               OpBranch %94
+         %94 = OpLabel
+               OpLoopMerge %95 %96 None
+               OpBranch %97
+         %97 = OpLabel
+         %98 = OpLoad %int %c
+        %100 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+        %101 = OpLoad %int %100
+        %102 = OpSLessThanEqual %bool %98 %101
+               OpSelectionMerge %103 None
+               OpBranchConditional %102 %104 %105
+        %104 = OpLabel
+               OpBranch %103
+        %105 = OpLabel
+               OpBranch %95
+        %103 = OpLabel
+        %106 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %107 = OpLoad %int %106
+               OpStore %d %107
+               OpBranch %108
+        %108 = OpLabel
+               OpLoopMerge %109 %110 None
+               OpBranch %111
+        %111 = OpLabel
+        %112 = OpLoad %int %d
+        %113 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_6
+        %114 = OpLoad %int %113
+        %115 = OpSLessThan %bool %112 %114
+               OpSelectionMerge %116 None
+               OpBranchConditional %115 %117 %118
+        %117 = OpLabel
+               OpBranch %116
+        %118 = OpLabel
+               OpBranch %109
+        %116 = OpLabel
+        %119 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %120 = OpLoad %int %119
+               OpStore %e %120
+               OpBranch %121
+        %121 = OpLabel
+               OpLoopMerge %122 %123 None
+               OpBranch %124
+        %124 = OpLabel
+        %125 = OpLoad %int %e
+        %126 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+        %127 = OpLoad %int %126
+        %128 = OpSLessThanEqual %bool %125 %127
+               OpSelectionMerge %129 None
+               OpBranchConditional %128 %130 %131
+        %130 = OpLabel
+               OpBranch %129
+        %131 = OpLabel
+               OpBranch %122
+        %129 = OpLabel
+        %132 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %133 = OpLoad %int %132
+               OpStore %f %133
+               OpBranch %134
+        %134 = OpLabel
+               OpLoopMerge %135 %136 None
+               OpBranch %137
+        %137 = OpLabel
+        %138 = OpLoad %int %f
+        %139 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %140 = OpLoad %int %139
+        %141 = OpSLessThan %bool %138 %140
+               OpSelectionMerge %142 None
+               OpBranchConditional %141 %143 %144
+        %143 = OpLabel
+               OpBranch %142
+        %144 = OpLabel
+               OpBranch %135
+        %142 = OpLabel
+        %145 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %146 = OpLoad %int %145
+               OpStore %g %146
+               OpBranch %147
+        %147 = OpLabel
+               OpLoopMerge %148 %149 None
+               OpBranch %150
+        %150 = OpLabel
+        %151 = OpLoad %int %g
+        %152 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_6
+        %153 = OpLoad %int %152
+        %154 = OpSLessThan %bool %151 %153
+               OpSelectionMerge %155 None
+               OpBranchConditional %154 %156 %157
+        %156 = OpLabel
+               OpBranch %155
+        %157 = OpLabel
+               OpBranch %148
+        %155 = OpLabel
+        %158 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %159 = OpLoad %int %158
+               OpStore %h %159
+               OpBranch %160
+        %160 = OpLabel
+               OpLoopMerge %161 %162 None
+               OpBranch %163
+        %163 = OpLabel
+        %164 = OpLoad %int %h
+        %165 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %166 = OpLoad %int %165
+        %167 = OpSLessThan %bool %164 %166
+               OpSelectionMerge %168 None
+               OpBranchConditional %167 %169 %170
+        %169 = OpLabel
+               OpBranch %168
+        %170 = OpLabel
+               OpBranch %161
+        %168 = OpLabel
+        %171 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %172 = OpLoad %int %171
+               OpStore %i %172
+               OpBranch %173
+        %173 = OpLabel
+               OpLoopMerge %174 %175 None
+               OpBranch %176
+        %176 = OpLabel
+        %177 = OpLoad %int %i
+        %178 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+        %179 = OpLoad %int %178
+        %180 = OpSLessThan %bool %177 %179
+               OpSelectionMerge %181 None
+               OpBranchConditional %180 %182 %183
+        %182 = OpLabel
+               OpBranch %181
+        %183 = OpLabel
+               OpBranch %174
+        %181 = OpLabel
+        %184 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %185 = OpLoad %int %184
+               OpStore %j %185
+               OpBranch %186
+        %186 = OpLabel
+               OpLoopMerge %187 %188 None
+               OpBranch %189
+        %189 = OpLabel
+        %190 = OpLoad %int %j
+        %191 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %192 = OpLoad %int %191
+        %193 = OpSGreaterThan %bool %190 %192
+               OpSelectionMerge %194 None
+               OpBranchConditional %193 %195 %196
+        %195 = OpLabel
+               OpBranch %194
+        %196 = OpLabel
+               OpBranch %187
+        %194 = OpLabel
+        %197 = OpLoad %int %a
+        %198 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_2
+        %199 = OpLoad %float %198
+        %200 = OpAccessChain %_ptr_Function_float %sums %197
+        %201 = OpLoad %float %200
+        %202 = OpAccessChain %_ptr_Function_float %sums %197
+        %203 = OpFAdd %float %201 %199
+               OpStore %202 %203
+               OpBranch %188
+        %188 = OpLabel
+        %204 = OpLoad %int %j
+        %205 = OpISub %int %204 %int_1
+               OpStore %j %205
+               OpBranch %186
+        %187 = OpLabel
+               OpBranch %175
+        %175 = OpLabel
+        %206 = OpLoad %int %i
+        %207 = OpIAdd %int %206 %int_1
+               OpStore %i %207
+               OpBranch %173
+        %174 = OpLabel
+               OpBranch %162
+        %162 = OpLabel
+        %208 = OpLoad %int %h
+        %209 = OpIAdd %int %208 %int_1
+               OpStore %h %209
+               OpBranch %160
+        %161 = OpLabel
+               OpBranch %149
+        %149 = OpLabel
+        %210 = OpLoad %int %g
+        %211 = OpIAdd %int %210 %int_1
+               OpStore %g %211
+               OpBranch %147
+        %148 = OpLabel
+               OpBranch %136
+        %136 = OpLabel
+        %212 = OpLoad %int %f
+        %213 = OpIAdd %int %212 %int_1
+               OpStore %f %213
+               OpBranch %134
+        %135 = OpLabel
+               OpBranch %123
+        %123 = OpLabel
+        %214 = OpLoad %int %e
+        %215 = OpIAdd %int %214 %int_1
+               OpStore %e %215
+               OpBranch %121
+        %122 = OpLabel
+               OpBranch %110
+        %110 = OpLabel
+        %216 = OpLoad %int %d
+        %217 = OpIAdd %int %216 %int_1
+               OpStore %d %217
+               OpBranch %108
+        %109 = OpLabel
+               OpBranch %96
+         %96 = OpLabel
+        %218 = OpLoad %int %c
+        %219 = OpIAdd %int %218 %int_1
+               OpStore %c %219
+               OpBranch %94
+         %95 = OpLabel
+               OpBranch %81
+         %81 = OpLabel
+        %220 = OpLoad %int %b
+        %221 = OpIAdd %int %220 %int_1
+               OpStore %b %221
+               OpBranch %79
+         %80 = OpLabel
+               OpBranch %67
+         %67 = OpLabel
+        %222 = OpLoad %int %a
+        %223 = OpIAdd %int %222 %int_1
+               OpStore %a %223
+               OpBranch %65
+         %66 = OpLabel
+        %224 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %225 = OpLoad %int %224
+        %226 = OpAccessChain %_ptr_Function_float %sums %225
+        %227 = OpLoad %float %226
+        %228 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+        %229 = OpLoad %float %228
+        %230 = OpFOrdEqual %bool %227 %229
+               OpStore %x_216_phi %230
+               OpSelectionMerge %231 None
+               OpBranchConditional %230 %232 %231
+        %232 = OpLabel
+        %233 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %234 = OpLoad %int %233
+        %235 = OpAccessChain %_ptr_Function_float %sums %234
+        %236 = OpLoad %float %235
+        %237 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+        %238 = OpLoad %float %237
+        %239 = OpFOrdEqual %bool %236 %238
+               OpStore %x_215 %239
+        %240 = OpLoad %bool %x_215
+               OpStore %x_216_phi %240
+               OpBranch %231
+        %231 = OpLabel
+        %241 = OpLoad %bool %x_216_phi
+               OpSelectionMerge %242 None
+               OpBranchConditional %241 %243 %244
+        %243 = OpLabel
+        %245 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %246 = OpLoad %int %245
+        %247 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %248 = OpLoad %int %247
+        %249 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %250 = OpLoad %int %249
+        %251 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %252 = OpLoad %int %251
+        %253 = OpConvertSToF %float %246
+        %254 = OpConvertSToF %float %248
+        %255 = OpConvertSToF %float %250
+        %256 = OpConvertSToF %float %252
+        %257 = OpCompositeConstruct %v4float %253 %254 %255 %256
+               OpStore %x_GLF_color %257
+               OpBranch %242
+        %244 = OpLabel
+        %258 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %259 = OpLoad %int %258
+        %260 = OpConvertSToF %float %259
+        %261 = OpCompositeConstruct %v4float %260 %260 %260 %260
+               OpStore %x_GLF_color %261
+               OpBranch %242
+        %242 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %262
+%tint_symbol = OpFunctionParameter %main_out
+        %266 = OpLabel
+        %267 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %267
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %269 = OpLabel
+        %270 = OpFunctionCall %void %main_1
+        %272 = OpLoad %v4float %x_GLF_color
+        %273 = OpCompositeConstruct %main_out %272
+        %271 = OpFunctionCall %void %tint_symbol_2 %273
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops-array-access/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops-array-access/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..3235625
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops-array-access/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,231 @@
+type Arr = [[stride(16)]] array<i32, 7>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var sums : array<f32, 2>;
+  var a : i32;
+  var b : i32;
+  var c : i32;
+  var d : i32;
+  var e : i32;
+  var f : i32;
+  var g : i32;
+  var h : i32;
+  var i : i32;
+  var j : i32;
+  var x_215 : bool;
+  var x_216_phi : bool;
+  let x_20 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_110 : f32 = x_8.x_GLF_uniform_float_values[0];
+  sums[x_20] = x_110;
+  let x_22 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_114 : f32 = x_8.x_GLF_uniform_float_values[0];
+  sums[x_22] = x_114;
+  let x_23 : i32 = x_6.x_GLF_uniform_int_values[1];
+  a = x_23;
+  loop {
+    let x_24 : i32 = a;
+    let x_25 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_24 < x_25)) {
+    } else {
+      break;
+    }
+    let x_26 : i32 = x_6.x_GLF_uniform_int_values[5];
+    b = x_26;
+    loop {
+      let x_27 : i32 = b;
+      let x_28 : i32 = x_6.x_GLF_uniform_int_values[3];
+      if ((x_27 < x_28)) {
+      } else {
+        break;
+      }
+      let x_29 : i32 = x_6.x_GLF_uniform_int_values[6];
+      c = x_29;
+      loop {
+        let x_30 : i32 = c;
+        let x_31 : i32 = x_6.x_GLF_uniform_int_values[4];
+        if ((x_30 <= x_31)) {
+        } else {
+          break;
+        }
+        let x_32 : i32 = x_6.x_GLF_uniform_int_values[1];
+        d = x_32;
+        loop {
+          let x_33 : i32 = d;
+          let x_34 : i32 = x_6.x_GLF_uniform_int_values[6];
+          if ((x_33 < x_34)) {
+          } else {
+            break;
+          }
+          let x_35 : i32 = x_6.x_GLF_uniform_int_values[0];
+          e = x_35;
+          loop {
+            let x_36 : i32 = e;
+            let x_37 : i32 = x_6.x_GLF_uniform_int_values[4];
+            if ((x_36 <= x_37)) {
+            } else {
+              break;
+            }
+            let x_38 : i32 = x_6.x_GLF_uniform_int_values[1];
+            f = x_38;
+            loop {
+              let x_39 : i32 = f;
+              let x_40 : i32 = x_6.x_GLF_uniform_int_values[0];
+              if ((x_39 < x_40)) {
+              } else {
+                break;
+              }
+              let x_41 : i32 = x_6.x_GLF_uniform_int_values[1];
+              g = x_41;
+              loop {
+                let x_42 : i32 = g;
+                let x_43 : i32 = x_6.x_GLF_uniform_int_values[6];
+                if ((x_42 < x_43)) {
+                } else {
+                  break;
+                }
+                let x_44 : i32 = x_6.x_GLF_uniform_int_values[1];
+                h = x_44;
+                loop {
+                  let x_45 : i32 = h;
+                  let x_46 : i32 = x_6.x_GLF_uniform_int_values[0];
+                  if ((x_45 < x_46)) {
+                  } else {
+                    break;
+                  }
+                  let x_47 : i32 = x_6.x_GLF_uniform_int_values[1];
+                  i = x_47;
+                  loop {
+                    let x_48 : i32 = i;
+                    let x_49 : i32 = x_6.x_GLF_uniform_int_values[4];
+                    if ((x_48 < x_49)) {
+                    } else {
+                      break;
+                    }
+                    let x_50 : i32 = x_6.x_GLF_uniform_int_values[0];
+                    j = x_50;
+                    loop {
+                      let x_51 : i32 = j;
+                      let x_52 : i32 = x_6.x_GLF_uniform_int_values[1];
+                      if ((x_51 > x_52)) {
+                      } else {
+                        break;
+                      }
+                      let x_53 : i32 = a;
+                      let x_197 : f32 = x_8.x_GLF_uniform_float_values[2];
+                      let x_199 : f32 = sums[x_53];
+                      sums[x_53] = (x_199 + x_197);
+
+                      continuing {
+                        let x_54 : i32 = j;
+                        j = (x_54 - 1);
+                      }
+                    }
+
+                    continuing {
+                      let x_56 : i32 = i;
+                      i = (x_56 + 1);
+                    }
+                  }
+
+                  continuing {
+                    let x_58 : i32 = h;
+                    h = (x_58 + 1);
+                  }
+                }
+
+                continuing {
+                  let x_60 : i32 = g;
+                  g = (x_60 + 1);
+                }
+              }
+
+              continuing {
+                let x_62 : i32 = f;
+                f = (x_62 + 1);
+              }
+            }
+
+            continuing {
+              let x_64 : i32 = e;
+              e = (x_64 + 1);
+            }
+          }
+
+          continuing {
+            let x_66 : i32 = d;
+            d = (x_66 + 1);
+          }
+        }
+
+        continuing {
+          let x_68 : i32 = c;
+          c = (x_68 + 1);
+        }
+      }
+
+      continuing {
+        let x_70 : i32 = b;
+        b = (x_70 + 1);
+      }
+    }
+
+    continuing {
+      let x_72 : i32 = a;
+      a = (x_72 + 1);
+    }
+  }
+  let x_74 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_204 : f32 = sums[x_74];
+  let x_206 : f32 = x_8.x_GLF_uniform_float_values[1];
+  let x_207 : bool = (x_204 == x_206);
+  x_216_phi = x_207;
+  if (x_207) {
+    let x_75 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_212 : f32 = sums[x_75];
+    let x_214 : f32 = x_8.x_GLF_uniform_float_values[1];
+    x_215 = (x_212 == x_214);
+    x_216_phi = x_215;
+  }
+  let x_216 : bool = x_216_phi;
+  if (x_216) {
+    let x_76 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_77 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_78 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_79 : i32 = x_6.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_76), f32(x_77), f32(x_78), f32(x_79));
+  } else {
+    let x_80 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_230 : f32 = f32(x_80);
+    x_GLF_color = vec4<f32>(x_230, x_230, x_230, x_230);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops-array-access/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops-array-access/0-opt.wgsl
new file mode 100644
index 0000000..3235625
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops-array-access/0-opt.wgsl
@@ -0,0 +1,231 @@
+type Arr = [[stride(16)]] array<i32, 7>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var sums : array<f32, 2>;
+  var a : i32;
+  var b : i32;
+  var c : i32;
+  var d : i32;
+  var e : i32;
+  var f : i32;
+  var g : i32;
+  var h : i32;
+  var i : i32;
+  var j : i32;
+  var x_215 : bool;
+  var x_216_phi : bool;
+  let x_20 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_110 : f32 = x_8.x_GLF_uniform_float_values[0];
+  sums[x_20] = x_110;
+  let x_22 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_114 : f32 = x_8.x_GLF_uniform_float_values[0];
+  sums[x_22] = x_114;
+  let x_23 : i32 = x_6.x_GLF_uniform_int_values[1];
+  a = x_23;
+  loop {
+    let x_24 : i32 = a;
+    let x_25 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_24 < x_25)) {
+    } else {
+      break;
+    }
+    let x_26 : i32 = x_6.x_GLF_uniform_int_values[5];
+    b = x_26;
+    loop {
+      let x_27 : i32 = b;
+      let x_28 : i32 = x_6.x_GLF_uniform_int_values[3];
+      if ((x_27 < x_28)) {
+      } else {
+        break;
+      }
+      let x_29 : i32 = x_6.x_GLF_uniform_int_values[6];
+      c = x_29;
+      loop {
+        let x_30 : i32 = c;
+        let x_31 : i32 = x_6.x_GLF_uniform_int_values[4];
+        if ((x_30 <= x_31)) {
+        } else {
+          break;
+        }
+        let x_32 : i32 = x_6.x_GLF_uniform_int_values[1];
+        d = x_32;
+        loop {
+          let x_33 : i32 = d;
+          let x_34 : i32 = x_6.x_GLF_uniform_int_values[6];
+          if ((x_33 < x_34)) {
+          } else {
+            break;
+          }
+          let x_35 : i32 = x_6.x_GLF_uniform_int_values[0];
+          e = x_35;
+          loop {
+            let x_36 : i32 = e;
+            let x_37 : i32 = x_6.x_GLF_uniform_int_values[4];
+            if ((x_36 <= x_37)) {
+            } else {
+              break;
+            }
+            let x_38 : i32 = x_6.x_GLF_uniform_int_values[1];
+            f = x_38;
+            loop {
+              let x_39 : i32 = f;
+              let x_40 : i32 = x_6.x_GLF_uniform_int_values[0];
+              if ((x_39 < x_40)) {
+              } else {
+                break;
+              }
+              let x_41 : i32 = x_6.x_GLF_uniform_int_values[1];
+              g = x_41;
+              loop {
+                let x_42 : i32 = g;
+                let x_43 : i32 = x_6.x_GLF_uniform_int_values[6];
+                if ((x_42 < x_43)) {
+                } else {
+                  break;
+                }
+                let x_44 : i32 = x_6.x_GLF_uniform_int_values[1];
+                h = x_44;
+                loop {
+                  let x_45 : i32 = h;
+                  let x_46 : i32 = x_6.x_GLF_uniform_int_values[0];
+                  if ((x_45 < x_46)) {
+                  } else {
+                    break;
+                  }
+                  let x_47 : i32 = x_6.x_GLF_uniform_int_values[1];
+                  i = x_47;
+                  loop {
+                    let x_48 : i32 = i;
+                    let x_49 : i32 = x_6.x_GLF_uniform_int_values[4];
+                    if ((x_48 < x_49)) {
+                    } else {
+                      break;
+                    }
+                    let x_50 : i32 = x_6.x_GLF_uniform_int_values[0];
+                    j = x_50;
+                    loop {
+                      let x_51 : i32 = j;
+                      let x_52 : i32 = x_6.x_GLF_uniform_int_values[1];
+                      if ((x_51 > x_52)) {
+                      } else {
+                        break;
+                      }
+                      let x_53 : i32 = a;
+                      let x_197 : f32 = x_8.x_GLF_uniform_float_values[2];
+                      let x_199 : f32 = sums[x_53];
+                      sums[x_53] = (x_199 + x_197);
+
+                      continuing {
+                        let x_54 : i32 = j;
+                        j = (x_54 - 1);
+                      }
+                    }
+
+                    continuing {
+                      let x_56 : i32 = i;
+                      i = (x_56 + 1);
+                    }
+                  }
+
+                  continuing {
+                    let x_58 : i32 = h;
+                    h = (x_58 + 1);
+                  }
+                }
+
+                continuing {
+                  let x_60 : i32 = g;
+                  g = (x_60 + 1);
+                }
+              }
+
+              continuing {
+                let x_62 : i32 = f;
+                f = (x_62 + 1);
+              }
+            }
+
+            continuing {
+              let x_64 : i32 = e;
+              e = (x_64 + 1);
+            }
+          }
+
+          continuing {
+            let x_66 : i32 = d;
+            d = (x_66 + 1);
+          }
+        }
+
+        continuing {
+          let x_68 : i32 = c;
+          c = (x_68 + 1);
+        }
+      }
+
+      continuing {
+        let x_70 : i32 = b;
+        b = (x_70 + 1);
+      }
+    }
+
+    continuing {
+      let x_72 : i32 = a;
+      a = (x_72 + 1);
+    }
+  }
+  let x_74 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_204 : f32 = sums[x_74];
+  let x_206 : f32 = x_8.x_GLF_uniform_float_values[1];
+  let x_207 : bool = (x_204 == x_206);
+  x_216_phi = x_207;
+  if (x_207) {
+    let x_75 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_212 : f32 = sums[x_75];
+    let x_214 : f32 = x_8.x_GLF_uniform_float_values[1];
+    x_215 = (x_212 == x_214);
+    x_216_phi = x_215;
+  }
+  let x_216 : bool = x_216_phi;
+  if (x_216) {
+    let x_76 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_77 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_78 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_79 : i32 = x_6.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_76), f32(x_77), f32(x_78), f32(x_79));
+  } else {
+    let x_80 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_230 : f32 = f32(x_80);
+    x_GLF_color = vec4<f32>(x_230, x_230, x_230, x_230);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops-array-access/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops-array-access/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..5d63b9b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops-array-access/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,208 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[7];
+};
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float sums[2] = (float[2])0;
+  int a = 0;
+  int b = 0;
+  int c = 0;
+  int d = 0;
+  int e = 0;
+  int f = 0;
+  int g = 0;
+  int h = 0;
+  int i = 0;
+  int j = 0;
+  bool x_215 = false;
+  bool x_216_phi = false;
+  const int x_20 = asint(x_6[1].x);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_110 = asfloat(x_8[scalar_offset / 4][scalar_offset % 4]);
+  sums[x_20] = x_110;
+  const int x_22 = asint(x_6[2].x);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_114 = asfloat(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  sums[x_22] = x_114;
+  const int x_23 = asint(x_6[1].x);
+  a = x_23;
+  while (true) {
+    const int x_24 = a;
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_25 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    if ((x_24 < x_25)) {
+    } else {
+      break;
+    }
+    const int x_26 = asint(x_6[5].x);
+    b = x_26;
+    while (true) {
+      const int x_27 = b;
+      const int x_28 = asint(x_6[3].x);
+      if ((x_27 < x_28)) {
+      } else {
+        break;
+      }
+      const int x_29 = asint(x_6[6].x);
+      c = x_29;
+      while (true) {
+        const int x_30 = c;
+        const int x_31 = asint(x_6[4].x);
+        if ((x_30 <= x_31)) {
+        } else {
+          break;
+        }
+        const int x_32 = asint(x_6[1].x);
+        d = x_32;
+        while (true) {
+          const int x_33 = d;
+          const int x_34 = asint(x_6[6].x);
+          if ((x_33 < x_34)) {
+          } else {
+            break;
+          }
+          const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+          const int x_35 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+          e = x_35;
+          while (true) {
+            const int x_36 = e;
+            const int x_37 = asint(x_6[4].x);
+            if ((x_36 <= x_37)) {
+            } else {
+              break;
+            }
+            const int x_38 = asint(x_6[1].x);
+            f = x_38;
+            while (true) {
+              const int x_39 = f;
+              const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+              const int x_40 = asint(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+              if ((x_39 < x_40)) {
+              } else {
+                break;
+              }
+              const int x_41 = asint(x_6[1].x);
+              g = x_41;
+              while (true) {
+                const int x_42 = g;
+                const int x_43 = asint(x_6[6].x);
+                if ((x_42 < x_43)) {
+                } else {
+                  break;
+                }
+                const int x_44 = asint(x_6[1].x);
+                h = x_44;
+                while (true) {
+                  const int x_45 = h;
+                  const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+                  const int x_46 = asint(x_6[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+                  if ((x_45 < x_46)) {
+                  } else {
+                    break;
+                  }
+                  const int x_47 = asint(x_6[1].x);
+                  i = x_47;
+                  while (true) {
+                    const int x_48 = i;
+                    const int x_49 = asint(x_6[4].x);
+                    if ((x_48 < x_49)) {
+                    } else {
+                      break;
+                    }
+                    const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+                    const int x_50 = asint(x_6[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+                    j = x_50;
+                    while (true) {
+                      const int x_51 = j;
+                      const int x_52 = asint(x_6[1].x);
+                      if ((x_51 > x_52)) {
+                      } else {
+                        break;
+                      }
+                      const int x_53 = a;
+                      const float x_197 = asfloat(x_8[2].x);
+                      const float x_199 = sums[x_53];
+                      sums[x_53] = (x_199 + x_197);
+                      {
+                        j = (j - 1);
+                      }
+                    }
+                    {
+                      i = (i + 1);
+                    }
+                  }
+                  {
+                    h = (h + 1);
+                  }
+                }
+                {
+                  g = (g + 1);
+                }
+              }
+              {
+                f = (f + 1);
+              }
+            }
+            {
+              e = (e + 1);
+            }
+          }
+          {
+            d = (d + 1);
+          }
+        }
+        {
+          c = (c + 1);
+        }
+      }
+      {
+        b = (b + 1);
+      }
+    }
+    {
+      a = (a + 1);
+    }
+  }
+  const int x_74 = asint(x_6[1].x);
+  const float x_204 = sums[x_74];
+  const float x_206 = asfloat(x_8[1].x);
+  const bool x_207 = (x_204 == x_206);
+  x_216_phi = x_207;
+  if (x_207) {
+    const int x_75 = asint(x_6[2].x);
+    const float x_212 = sums[x_75];
+    const float x_214 = asfloat(x_8[1].x);
+    x_215 = (x_212 == x_214);
+    x_216_phi = x_215;
+  }
+  if (x_216_phi) {
+    const int x_76 = asint(x_6[2].x);
+    const int x_77 = asint(x_6[1].x);
+    const int x_78 = asint(x_6[1].x);
+    const int x_79 = asint(x_6[2].x);
+    x_GLF_color = float4(float(x_76), float(x_77), float(x_78), float(x_79));
+  } else {
+    const int x_80 = asint(x_6[1].x);
+    const float x_230 = float(x_80);
+    x_GLF_color = float4(x_230, x_230, x_230, x_230);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops-array-access/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops-array-access/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..14a2550
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops-array-access/0-opt.wgsl.expected.msl
@@ -0,0 +1,232 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[7];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct tint_array_wrapper_2 {
+  float arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_8, thread float4* const tint_symbol_4) {
+  tint_array_wrapper_2 sums = {};
+  int a = 0;
+  int b = 0;
+  int c = 0;
+  int d = 0;
+  int e = 0;
+  int f = 0;
+  int g = 0;
+  int h = 0;
+  int i = 0;
+  int j = 0;
+  bool x_215 = false;
+  bool x_216_phi = false;
+  int const x_20 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  float const x_110 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  sums.arr[x_20] = x_110;
+  int const x_22 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  float const x_114 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  sums.arr[x_22] = x_114;
+  int const x_23 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  a = x_23;
+  while (true) {
+    int const x_24 = a;
+    int const x_25 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_24 < x_25)) {
+    } else {
+      break;
+    }
+    int const x_26 = x_6.x_GLF_uniform_int_values.arr[5].el;
+    b = x_26;
+    while (true) {
+      int const x_27 = b;
+      int const x_28 = x_6.x_GLF_uniform_int_values.arr[3].el;
+      if ((x_27 < x_28)) {
+      } else {
+        break;
+      }
+      int const x_29 = x_6.x_GLF_uniform_int_values.arr[6].el;
+      c = x_29;
+      while (true) {
+        int const x_30 = c;
+        int const x_31 = x_6.x_GLF_uniform_int_values.arr[4].el;
+        if ((x_30 <= x_31)) {
+        } else {
+          break;
+        }
+        int const x_32 = x_6.x_GLF_uniform_int_values.arr[1].el;
+        d = x_32;
+        while (true) {
+          int const x_33 = d;
+          int const x_34 = x_6.x_GLF_uniform_int_values.arr[6].el;
+          if ((x_33 < x_34)) {
+          } else {
+            break;
+          }
+          int const x_35 = x_6.x_GLF_uniform_int_values.arr[0].el;
+          e = x_35;
+          while (true) {
+            int const x_36 = e;
+            int const x_37 = x_6.x_GLF_uniform_int_values.arr[4].el;
+            if ((x_36 <= x_37)) {
+            } else {
+              break;
+            }
+            int const x_38 = x_6.x_GLF_uniform_int_values.arr[1].el;
+            f = x_38;
+            while (true) {
+              int const x_39 = f;
+              int const x_40 = x_6.x_GLF_uniform_int_values.arr[0].el;
+              if ((x_39 < x_40)) {
+              } else {
+                break;
+              }
+              int const x_41 = x_6.x_GLF_uniform_int_values.arr[1].el;
+              g = x_41;
+              while (true) {
+                int const x_42 = g;
+                int const x_43 = x_6.x_GLF_uniform_int_values.arr[6].el;
+                if ((x_42 < x_43)) {
+                } else {
+                  break;
+                }
+                int const x_44 = x_6.x_GLF_uniform_int_values.arr[1].el;
+                h = x_44;
+                while (true) {
+                  int const x_45 = h;
+                  int const x_46 = x_6.x_GLF_uniform_int_values.arr[0].el;
+                  if ((x_45 < x_46)) {
+                  } else {
+                    break;
+                  }
+                  int const x_47 = x_6.x_GLF_uniform_int_values.arr[1].el;
+                  i = x_47;
+                  while (true) {
+                    int const x_48 = i;
+                    int const x_49 = x_6.x_GLF_uniform_int_values.arr[4].el;
+                    if ((x_48 < x_49)) {
+                    } else {
+                      break;
+                    }
+                    int const x_50 = x_6.x_GLF_uniform_int_values.arr[0].el;
+                    j = x_50;
+                    while (true) {
+                      int const x_51 = j;
+                      int const x_52 = x_6.x_GLF_uniform_int_values.arr[1].el;
+                      if ((x_51 > x_52)) {
+                      } else {
+                        break;
+                      }
+                      int const x_53 = a;
+                      float const x_197 = x_8.x_GLF_uniform_float_values.arr[2].el;
+                      float const x_199 = sums.arr[x_53];
+                      sums.arr[x_53] = (x_199 + x_197);
+                      {
+                        int const x_54 = j;
+                        j = (x_54 - 1);
+                      }
+                    }
+                    {
+                      int const x_56 = i;
+                      i = (x_56 + 1);
+                    }
+                  }
+                  {
+                    int const x_58 = h;
+                    h = (x_58 + 1);
+                  }
+                }
+                {
+                  int const x_60 = g;
+                  g = (x_60 + 1);
+                }
+              }
+              {
+                int const x_62 = f;
+                f = (x_62 + 1);
+              }
+            }
+            {
+              int const x_64 = e;
+              e = (x_64 + 1);
+            }
+          }
+          {
+            int const x_66 = d;
+            d = (x_66 + 1);
+          }
+        }
+        {
+          int const x_68 = c;
+          c = (x_68 + 1);
+        }
+      }
+      {
+        int const x_70 = b;
+        b = (x_70 + 1);
+      }
+    }
+    {
+      int const x_72 = a;
+      a = (x_72 + 1);
+    }
+  }
+  int const x_74 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  float const x_204 = sums.arr[x_74];
+  float const x_206 = x_8.x_GLF_uniform_float_values.arr[1].el;
+  bool const x_207 = (x_204 == x_206);
+  x_216_phi = x_207;
+  if (x_207) {
+    int const x_75 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    float const x_212 = sums.arr[x_75];
+    float const x_214 = x_8.x_GLF_uniform_float_values.arr[1].el;
+    x_215 = (x_212 == x_214);
+    x_216_phi = x_215;
+  }
+  bool const x_216 = x_216_phi;
+  if (x_216) {
+    int const x_76 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_77 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_78 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_79 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    *(tint_symbol_4) = float4(float(x_76), float(x_77), float(x_78), float(x_79));
+  } else {
+    int const x_80 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    float const x_230 = float(x_80);
+    *(tint_symbol_4) = float4(x_230, x_230, x_230, x_230);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_8 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops-array-access/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops-array-access/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..504fead
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops-array-access/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,456 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 274
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %sums "sums"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %d "d"
+               OpName %e "e"
+               OpName %f "f"
+               OpName %g "g"
+               OpName %h "h"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %x_215 "x_215"
+               OpName %x_216_phi "x_216_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_7 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_7 = OpConstant %uint 7
+%_arr_int_uint_7 = OpTypeArray %int %uint_7
+       %buf0 = OpTypeStruct %_arr_int_uint_7
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf1 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+%_ptr_Function__arr_float_uint_2 = OpTypePointer Function %_arr_float_uint_2
+         %28 = OpConstantNull %_arr_float_uint_2
+%_ptr_Function_int = OpTypePointer Function %int
+         %31 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %44 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_2 = OpConstant %int 2
+      %int_5 = OpConstant %int 5
+      %int_3 = OpConstant %int 3
+      %int_6 = OpConstant %int 6
+      %int_4 = OpConstant %int 4
+   %main_out = OpTypeStruct %v4float
+        %262 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+       %sums = OpVariable %_ptr_Function__arr_float_uint_2 Function %28
+          %a = OpVariable %_ptr_Function_int Function %31
+          %b = OpVariable %_ptr_Function_int Function %31
+          %c = OpVariable %_ptr_Function_int Function %31
+          %d = OpVariable %_ptr_Function_int Function %31
+          %e = OpVariable %_ptr_Function_int Function %31
+          %f = OpVariable %_ptr_Function_int Function %31
+          %g = OpVariable %_ptr_Function_int Function %31
+          %h = OpVariable %_ptr_Function_int Function %31
+          %i = OpVariable %_ptr_Function_int Function %31
+          %j = OpVariable %_ptr_Function_int Function %31
+      %x_215 = OpVariable %_ptr_Function_bool Function %44
+  %x_216_phi = OpVariable %_ptr_Function_bool Function %44
+         %49 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %50 = OpLoad %int %49
+         %53 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %54 = OpLoad %float %53
+         %56 = OpAccessChain %_ptr_Function_float %sums %50
+               OpStore %56 %54
+         %58 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %59 = OpLoad %int %58
+         %60 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %61 = OpLoad %float %60
+         %62 = OpAccessChain %_ptr_Function_float %sums %59
+               OpStore %62 %61
+         %63 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %64 = OpLoad %int %63
+               OpStore %a %64
+               OpBranch %65
+         %65 = OpLabel
+               OpLoopMerge %66 %67 None
+               OpBranch %68
+         %68 = OpLabel
+         %69 = OpLoad %int %a
+         %70 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %71 = OpLoad %int %70
+         %72 = OpSLessThan %bool %69 %71
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %74 %75
+         %74 = OpLabel
+               OpBranch %73
+         %75 = OpLabel
+               OpBranch %66
+         %73 = OpLabel
+         %77 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_5
+         %78 = OpLoad %int %77
+               OpStore %b %78
+               OpBranch %79
+         %79 = OpLabel
+               OpLoopMerge %80 %81 None
+               OpBranch %82
+         %82 = OpLabel
+         %83 = OpLoad %int %b
+         %85 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %86 = OpLoad %int %85
+         %87 = OpSLessThan %bool %83 %86
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %90
+         %89 = OpLabel
+               OpBranch %88
+         %90 = OpLabel
+               OpBranch %80
+         %88 = OpLabel
+         %92 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_6
+         %93 = OpLoad %int %92
+               OpStore %c %93
+               OpBranch %94
+         %94 = OpLabel
+               OpLoopMerge %95 %96 None
+               OpBranch %97
+         %97 = OpLabel
+         %98 = OpLoad %int %c
+        %100 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+        %101 = OpLoad %int %100
+        %102 = OpSLessThanEqual %bool %98 %101
+               OpSelectionMerge %103 None
+               OpBranchConditional %102 %104 %105
+        %104 = OpLabel
+               OpBranch %103
+        %105 = OpLabel
+               OpBranch %95
+        %103 = OpLabel
+        %106 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %107 = OpLoad %int %106
+               OpStore %d %107
+               OpBranch %108
+        %108 = OpLabel
+               OpLoopMerge %109 %110 None
+               OpBranch %111
+        %111 = OpLabel
+        %112 = OpLoad %int %d
+        %113 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_6
+        %114 = OpLoad %int %113
+        %115 = OpSLessThan %bool %112 %114
+               OpSelectionMerge %116 None
+               OpBranchConditional %115 %117 %118
+        %117 = OpLabel
+               OpBranch %116
+        %118 = OpLabel
+               OpBranch %109
+        %116 = OpLabel
+        %119 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %120 = OpLoad %int %119
+               OpStore %e %120
+               OpBranch %121
+        %121 = OpLabel
+               OpLoopMerge %122 %123 None
+               OpBranch %124
+        %124 = OpLabel
+        %125 = OpLoad %int %e
+        %126 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+        %127 = OpLoad %int %126
+        %128 = OpSLessThanEqual %bool %125 %127
+               OpSelectionMerge %129 None
+               OpBranchConditional %128 %130 %131
+        %130 = OpLabel
+               OpBranch %129
+        %131 = OpLabel
+               OpBranch %122
+        %129 = OpLabel
+        %132 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %133 = OpLoad %int %132
+               OpStore %f %133
+               OpBranch %134
+        %134 = OpLabel
+               OpLoopMerge %135 %136 None
+               OpBranch %137
+        %137 = OpLabel
+        %138 = OpLoad %int %f
+        %139 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %140 = OpLoad %int %139
+        %141 = OpSLessThan %bool %138 %140
+               OpSelectionMerge %142 None
+               OpBranchConditional %141 %143 %144
+        %143 = OpLabel
+               OpBranch %142
+        %144 = OpLabel
+               OpBranch %135
+        %142 = OpLabel
+        %145 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %146 = OpLoad %int %145
+               OpStore %g %146
+               OpBranch %147
+        %147 = OpLabel
+               OpLoopMerge %148 %149 None
+               OpBranch %150
+        %150 = OpLabel
+        %151 = OpLoad %int %g
+        %152 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_6
+        %153 = OpLoad %int %152
+        %154 = OpSLessThan %bool %151 %153
+               OpSelectionMerge %155 None
+               OpBranchConditional %154 %156 %157
+        %156 = OpLabel
+               OpBranch %155
+        %157 = OpLabel
+               OpBranch %148
+        %155 = OpLabel
+        %158 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %159 = OpLoad %int %158
+               OpStore %h %159
+               OpBranch %160
+        %160 = OpLabel
+               OpLoopMerge %161 %162 None
+               OpBranch %163
+        %163 = OpLabel
+        %164 = OpLoad %int %h
+        %165 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %166 = OpLoad %int %165
+        %167 = OpSLessThan %bool %164 %166
+               OpSelectionMerge %168 None
+               OpBranchConditional %167 %169 %170
+        %169 = OpLabel
+               OpBranch %168
+        %170 = OpLabel
+               OpBranch %161
+        %168 = OpLabel
+        %171 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %172 = OpLoad %int %171
+               OpStore %i %172
+               OpBranch %173
+        %173 = OpLabel
+               OpLoopMerge %174 %175 None
+               OpBranch %176
+        %176 = OpLabel
+        %177 = OpLoad %int %i
+        %178 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+        %179 = OpLoad %int %178
+        %180 = OpSLessThan %bool %177 %179
+               OpSelectionMerge %181 None
+               OpBranchConditional %180 %182 %183
+        %182 = OpLabel
+               OpBranch %181
+        %183 = OpLabel
+               OpBranch %174
+        %181 = OpLabel
+        %184 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %185 = OpLoad %int %184
+               OpStore %j %185
+               OpBranch %186
+        %186 = OpLabel
+               OpLoopMerge %187 %188 None
+               OpBranch %189
+        %189 = OpLabel
+        %190 = OpLoad %int %j
+        %191 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %192 = OpLoad %int %191
+        %193 = OpSGreaterThan %bool %190 %192
+               OpSelectionMerge %194 None
+               OpBranchConditional %193 %195 %196
+        %195 = OpLabel
+               OpBranch %194
+        %196 = OpLabel
+               OpBranch %187
+        %194 = OpLabel
+        %197 = OpLoad %int %a
+        %198 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_2
+        %199 = OpLoad %float %198
+        %200 = OpAccessChain %_ptr_Function_float %sums %197
+        %201 = OpLoad %float %200
+        %202 = OpAccessChain %_ptr_Function_float %sums %197
+        %203 = OpFAdd %float %201 %199
+               OpStore %202 %203
+               OpBranch %188
+        %188 = OpLabel
+        %204 = OpLoad %int %j
+        %205 = OpISub %int %204 %int_1
+               OpStore %j %205
+               OpBranch %186
+        %187 = OpLabel
+               OpBranch %175
+        %175 = OpLabel
+        %206 = OpLoad %int %i
+        %207 = OpIAdd %int %206 %int_1
+               OpStore %i %207
+               OpBranch %173
+        %174 = OpLabel
+               OpBranch %162
+        %162 = OpLabel
+        %208 = OpLoad %int %h
+        %209 = OpIAdd %int %208 %int_1
+               OpStore %h %209
+               OpBranch %160
+        %161 = OpLabel
+               OpBranch %149
+        %149 = OpLabel
+        %210 = OpLoad %int %g
+        %211 = OpIAdd %int %210 %int_1
+               OpStore %g %211
+               OpBranch %147
+        %148 = OpLabel
+               OpBranch %136
+        %136 = OpLabel
+        %212 = OpLoad %int %f
+        %213 = OpIAdd %int %212 %int_1
+               OpStore %f %213
+               OpBranch %134
+        %135 = OpLabel
+               OpBranch %123
+        %123 = OpLabel
+        %214 = OpLoad %int %e
+        %215 = OpIAdd %int %214 %int_1
+               OpStore %e %215
+               OpBranch %121
+        %122 = OpLabel
+               OpBranch %110
+        %110 = OpLabel
+        %216 = OpLoad %int %d
+        %217 = OpIAdd %int %216 %int_1
+               OpStore %d %217
+               OpBranch %108
+        %109 = OpLabel
+               OpBranch %96
+         %96 = OpLabel
+        %218 = OpLoad %int %c
+        %219 = OpIAdd %int %218 %int_1
+               OpStore %c %219
+               OpBranch %94
+         %95 = OpLabel
+               OpBranch %81
+         %81 = OpLabel
+        %220 = OpLoad %int %b
+        %221 = OpIAdd %int %220 %int_1
+               OpStore %b %221
+               OpBranch %79
+         %80 = OpLabel
+               OpBranch %67
+         %67 = OpLabel
+        %222 = OpLoad %int %a
+        %223 = OpIAdd %int %222 %int_1
+               OpStore %a %223
+               OpBranch %65
+         %66 = OpLabel
+        %224 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %225 = OpLoad %int %224
+        %226 = OpAccessChain %_ptr_Function_float %sums %225
+        %227 = OpLoad %float %226
+        %228 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+        %229 = OpLoad %float %228
+        %230 = OpFOrdEqual %bool %227 %229
+               OpStore %x_216_phi %230
+               OpSelectionMerge %231 None
+               OpBranchConditional %230 %232 %231
+        %232 = OpLabel
+        %233 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %234 = OpLoad %int %233
+        %235 = OpAccessChain %_ptr_Function_float %sums %234
+        %236 = OpLoad %float %235
+        %237 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+        %238 = OpLoad %float %237
+        %239 = OpFOrdEqual %bool %236 %238
+               OpStore %x_215 %239
+        %240 = OpLoad %bool %x_215
+               OpStore %x_216_phi %240
+               OpBranch %231
+        %231 = OpLabel
+        %241 = OpLoad %bool %x_216_phi
+               OpSelectionMerge %242 None
+               OpBranchConditional %241 %243 %244
+        %243 = OpLabel
+        %245 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %246 = OpLoad %int %245
+        %247 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %248 = OpLoad %int %247
+        %249 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %250 = OpLoad %int %249
+        %251 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %252 = OpLoad %int %251
+        %253 = OpConvertSToF %float %246
+        %254 = OpConvertSToF %float %248
+        %255 = OpConvertSToF %float %250
+        %256 = OpConvertSToF %float %252
+        %257 = OpCompositeConstruct %v4float %253 %254 %255 %256
+               OpStore %x_GLF_color %257
+               OpBranch %242
+        %244 = OpLabel
+        %258 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %259 = OpLoad %int %258
+        %260 = OpConvertSToF %float %259
+        %261 = OpCompositeConstruct %v4float %260 %260 %260 %260
+               OpStore %x_GLF_color %261
+               OpBranch %242
+        %242 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %262
+%tint_symbol = OpFunctionParameter %main_out
+        %266 = OpLabel
+        %267 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %267
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %269 = OpLabel
+        %270 = OpFunctionCall %void %main_1
+        %272 = OpLoad %v4float %x_GLF_color
+        %273 = OpCompositeConstruct %main_out %272
+        %271 = OpFunctionCall %void %tint_symbol_2 %273
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops-array-access/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops-array-access/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..3235625
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops-array-access/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,231 @@
+type Arr = [[stride(16)]] array<i32, 7>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var sums : array<f32, 2>;
+  var a : i32;
+  var b : i32;
+  var c : i32;
+  var d : i32;
+  var e : i32;
+  var f : i32;
+  var g : i32;
+  var h : i32;
+  var i : i32;
+  var j : i32;
+  var x_215 : bool;
+  var x_216_phi : bool;
+  let x_20 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_110 : f32 = x_8.x_GLF_uniform_float_values[0];
+  sums[x_20] = x_110;
+  let x_22 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_114 : f32 = x_8.x_GLF_uniform_float_values[0];
+  sums[x_22] = x_114;
+  let x_23 : i32 = x_6.x_GLF_uniform_int_values[1];
+  a = x_23;
+  loop {
+    let x_24 : i32 = a;
+    let x_25 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_24 < x_25)) {
+    } else {
+      break;
+    }
+    let x_26 : i32 = x_6.x_GLF_uniform_int_values[5];
+    b = x_26;
+    loop {
+      let x_27 : i32 = b;
+      let x_28 : i32 = x_6.x_GLF_uniform_int_values[3];
+      if ((x_27 < x_28)) {
+      } else {
+        break;
+      }
+      let x_29 : i32 = x_6.x_GLF_uniform_int_values[6];
+      c = x_29;
+      loop {
+        let x_30 : i32 = c;
+        let x_31 : i32 = x_6.x_GLF_uniform_int_values[4];
+        if ((x_30 <= x_31)) {
+        } else {
+          break;
+        }
+        let x_32 : i32 = x_6.x_GLF_uniform_int_values[1];
+        d = x_32;
+        loop {
+          let x_33 : i32 = d;
+          let x_34 : i32 = x_6.x_GLF_uniform_int_values[6];
+          if ((x_33 < x_34)) {
+          } else {
+            break;
+          }
+          let x_35 : i32 = x_6.x_GLF_uniform_int_values[0];
+          e = x_35;
+          loop {
+            let x_36 : i32 = e;
+            let x_37 : i32 = x_6.x_GLF_uniform_int_values[4];
+            if ((x_36 <= x_37)) {
+            } else {
+              break;
+            }
+            let x_38 : i32 = x_6.x_GLF_uniform_int_values[1];
+            f = x_38;
+            loop {
+              let x_39 : i32 = f;
+              let x_40 : i32 = x_6.x_GLF_uniform_int_values[0];
+              if ((x_39 < x_40)) {
+              } else {
+                break;
+              }
+              let x_41 : i32 = x_6.x_GLF_uniform_int_values[1];
+              g = x_41;
+              loop {
+                let x_42 : i32 = g;
+                let x_43 : i32 = x_6.x_GLF_uniform_int_values[6];
+                if ((x_42 < x_43)) {
+                } else {
+                  break;
+                }
+                let x_44 : i32 = x_6.x_GLF_uniform_int_values[1];
+                h = x_44;
+                loop {
+                  let x_45 : i32 = h;
+                  let x_46 : i32 = x_6.x_GLF_uniform_int_values[0];
+                  if ((x_45 < x_46)) {
+                  } else {
+                    break;
+                  }
+                  let x_47 : i32 = x_6.x_GLF_uniform_int_values[1];
+                  i = x_47;
+                  loop {
+                    let x_48 : i32 = i;
+                    let x_49 : i32 = x_6.x_GLF_uniform_int_values[4];
+                    if ((x_48 < x_49)) {
+                    } else {
+                      break;
+                    }
+                    let x_50 : i32 = x_6.x_GLF_uniform_int_values[0];
+                    j = x_50;
+                    loop {
+                      let x_51 : i32 = j;
+                      let x_52 : i32 = x_6.x_GLF_uniform_int_values[1];
+                      if ((x_51 > x_52)) {
+                      } else {
+                        break;
+                      }
+                      let x_53 : i32 = a;
+                      let x_197 : f32 = x_8.x_GLF_uniform_float_values[2];
+                      let x_199 : f32 = sums[x_53];
+                      sums[x_53] = (x_199 + x_197);
+
+                      continuing {
+                        let x_54 : i32 = j;
+                        j = (x_54 - 1);
+                      }
+                    }
+
+                    continuing {
+                      let x_56 : i32 = i;
+                      i = (x_56 + 1);
+                    }
+                  }
+
+                  continuing {
+                    let x_58 : i32 = h;
+                    h = (x_58 + 1);
+                  }
+                }
+
+                continuing {
+                  let x_60 : i32 = g;
+                  g = (x_60 + 1);
+                }
+              }
+
+              continuing {
+                let x_62 : i32 = f;
+                f = (x_62 + 1);
+              }
+            }
+
+            continuing {
+              let x_64 : i32 = e;
+              e = (x_64 + 1);
+            }
+          }
+
+          continuing {
+            let x_66 : i32 = d;
+            d = (x_66 + 1);
+          }
+        }
+
+        continuing {
+          let x_68 : i32 = c;
+          c = (x_68 + 1);
+        }
+      }
+
+      continuing {
+        let x_70 : i32 = b;
+        b = (x_70 + 1);
+      }
+    }
+
+    continuing {
+      let x_72 : i32 = a;
+      a = (x_72 + 1);
+    }
+  }
+  let x_74 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_204 : f32 = sums[x_74];
+  let x_206 : f32 = x_8.x_GLF_uniform_float_values[1];
+  let x_207 : bool = (x_204 == x_206);
+  x_216_phi = x_207;
+  if (x_207) {
+    let x_75 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_212 : f32 = sums[x_75];
+    let x_214 : f32 = x_8.x_GLF_uniform_float_values[1];
+    x_215 = (x_212 == x_214);
+    x_216_phi = x_215;
+  }
+  let x_216 : bool = x_216_phi;
+  if (x_216) {
+    let x_76 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_77 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_78 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_79 : i32 = x_6.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_76), f32(x_77), f32(x_78), f32(x_79));
+  } else {
+    let x_80 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_230 : f32 = f32(x_80);
+    x_GLF_color = vec4<f32>(x_230, x_230, x_230, x_230);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops/0-opt.spvasm
new file mode 100644
index 0000000..26b914c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops/0-opt.spvasm
@@ -0,0 +1,283 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %i0 "i0"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %_ ""
+               OpName %i1 "i1"
+               OpName %i2 "i2"
+               OpName %i3 "i3"
+               OpName %i4 "i4"
+               OpName %i5 "i5"
+               OpName %i6 "i6"
+               OpName %i7 "i7"
+               OpName %i8 "i8"
+               OpName %i9 "i9"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+      %int_1 = OpConstant %int 1
+      %int_3 = OpConstant %int 3
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %33 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %34 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %18
+         %35 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+         %i0 = OpVariable %_ptr_Function_int Function
+         %i1 = OpVariable %_ptr_Function_int Function
+         %i2 = OpVariable %_ptr_Function_int Function
+         %i3 = OpVariable %_ptr_Function_int Function
+         %i4 = OpVariable %_ptr_Function_int Function
+         %i5 = OpVariable %_ptr_Function_int Function
+         %i6 = OpVariable %_ptr_Function_int Function
+         %i7 = OpVariable %_ptr_Function_int Function
+         %i8 = OpVariable %_ptr_Function_int Function
+         %i9 = OpVariable %_ptr_Function_int Function
+               OpStore %a %int_0
+               OpStore %i0 %int_0
+               OpBranch %36
+         %36 = OpLabel
+               OpLoopMerge %37 %38 None
+               OpBranch %39
+         %39 = OpLabel
+         %40 = OpLoad %int %i0
+         %41 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %42 = OpLoad %int %41
+         %43 = OpSLessThan %bool %40 %42
+               OpBranchConditional %43 %44 %37
+         %44 = OpLabel
+               OpStore %i1 %int_0
+               OpBranch %45
+         %45 = OpLabel
+               OpLoopMerge %46 %47 None
+               OpBranch %48
+         %48 = OpLabel
+         %49 = OpLoad %int %i1
+         %50 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %51 = OpLoad %int %50
+         %52 = OpSLessThan %bool %49 %51
+               OpBranchConditional %52 %53 %46
+         %53 = OpLabel
+               OpStore %i2 %int_0
+               OpBranch %54
+         %54 = OpLabel
+               OpLoopMerge %55 %56 None
+               OpBranch %57
+         %57 = OpLabel
+         %58 = OpLoad %int %i2
+         %59 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %60 = OpLoad %int %59
+         %61 = OpSLessThan %bool %58 %60
+               OpBranchConditional %61 %62 %55
+         %62 = OpLabel
+               OpStore %i3 %int_0
+               OpBranch %63
+         %63 = OpLabel
+               OpLoopMerge %64 %65 None
+               OpBranch %66
+         %66 = OpLabel
+         %67 = OpLoad %int %i3
+         %68 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %69 = OpLoad %int %68
+         %70 = OpIAdd %int %69 %int_2
+         %71 = OpSLessThan %bool %67 %70
+               OpBranchConditional %71 %72 %64
+         %72 = OpLabel
+               OpStore %i4 %int_0
+               OpBranch %73
+         %73 = OpLabel
+               OpLoopMerge %74 %75 None
+               OpBranch %76
+         %76 = OpLabel
+         %77 = OpLoad %int %i4
+         %78 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %79 = OpLoad %int %78
+         %80 = OpSLessThan %bool %77 %79
+               OpBranchConditional %80 %81 %74
+         %81 = OpLabel
+               OpStore %i5 %int_0
+               OpBranch %82
+         %82 = OpLabel
+               OpLoopMerge %83 %84 None
+               OpBranch %85
+         %85 = OpLabel
+         %86 = OpLoad %int %i5
+         %87 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %88 = OpLoad %int %87
+         %89 = OpSLessThan %bool %86 %88
+               OpBranchConditional %89 %90 %83
+         %90 = OpLabel
+               OpBranch %91
+         %91 = OpLabel
+               OpLoopMerge %92 %93 None
+               OpBranch %94
+         %94 = OpLabel
+         %95 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %96 = OpLoad %int %95
+         %97 = OpSGreaterThan %bool %96 %int_0
+               OpBranchConditional %97 %98 %92
+         %98 = OpLabel
+               OpStore %i6 %int_0
+               OpBranch %99
+         %99 = OpLabel
+               OpLoopMerge %100 %101 None
+               OpBranch %102
+        %102 = OpLabel
+        %103 = OpLoad %int %i6
+        %104 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+        %105 = OpLoad %int %104
+        %106 = OpSLessThan %bool %103 %105
+               OpBranchConditional %106 %107 %100
+        %107 = OpLabel
+               OpStore %i7 %int_0
+               OpBranch %108
+        %108 = OpLabel
+               OpLoopMerge %109 %110 None
+               OpBranch %111
+        %111 = OpLabel
+        %112 = OpLoad %int %i7
+        %113 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+        %114 = OpLoad %int %113
+        %115 = OpSLessThan %bool %112 %114
+               OpBranchConditional %115 %116 %109
+        %116 = OpLabel
+               OpStore %i8 %int_0
+               OpBranch %117
+        %117 = OpLabel
+               OpLoopMerge %118 %119 None
+               OpBranch %120
+        %120 = OpLabel
+        %121 = OpLoad %int %i8
+        %122 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+        %123 = OpLoad %int %122
+        %124 = OpSLessThan %bool %121 %123
+               OpBranchConditional %124 %125 %118
+        %125 = OpLabel
+               OpStore %i9 %int_0
+               OpBranch %126
+        %126 = OpLabel
+               OpLoopMerge %127 %128 None
+               OpBranch %129
+        %129 = OpLabel
+        %130 = OpLoad %int %i9
+        %131 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+        %132 = OpLoad %int %131
+        %133 = OpSLessThan %bool %130 %132
+               OpBranchConditional %133 %134 %127
+        %134 = OpLabel
+        %135 = OpLoad %int %a
+        %136 = OpIAdd %int %135 %int_1
+               OpStore %a %136
+               OpBranch %128
+        %128 = OpLabel
+        %137 = OpLoad %int %i9
+        %138 = OpIAdd %int %137 %int_1
+               OpStore %i9 %138
+               OpBranch %126
+        %127 = OpLabel
+               OpBranch %119
+        %119 = OpLabel
+        %139 = OpLoad %int %i8
+        %140 = OpIAdd %int %139 %int_1
+               OpStore %i8 %140
+               OpBranch %117
+        %118 = OpLabel
+               OpBranch %110
+        %110 = OpLabel
+        %141 = OpLoad %int %i7
+        %142 = OpIAdd %int %141 %int_1
+               OpStore %i7 %142
+               OpBranch %108
+        %109 = OpLabel
+               OpBranch %101
+        %101 = OpLabel
+        %143 = OpLoad %int %i6
+        %144 = OpIAdd %int %143 %int_1
+               OpStore %i6 %144
+               OpBranch %99
+        %100 = OpLabel
+               OpBranch %92
+         %93 = OpLabel
+               OpBranch %91
+         %92 = OpLabel
+               OpBranch %84
+         %84 = OpLabel
+        %145 = OpLoad %int %i5
+        %146 = OpIAdd %int %145 %int_1
+               OpStore %i5 %146
+               OpBranch %82
+         %83 = OpLabel
+               OpBranch %75
+         %75 = OpLabel
+        %147 = OpLoad %int %i4
+        %148 = OpIAdd %int %147 %int_1
+               OpStore %i4 %148
+               OpBranch %73
+         %74 = OpLabel
+               OpBranch %65
+         %65 = OpLabel
+        %149 = OpLoad %int %i3
+        %150 = OpIAdd %int %149 %int_1
+               OpStore %i3 %150
+               OpBranch %63
+         %64 = OpLabel
+               OpBranch %56
+         %56 = OpLabel
+        %151 = OpLoad %int %i2
+        %152 = OpIAdd %int %151 %int_1
+               OpStore %i2 %152
+               OpBranch %54
+         %55 = OpLabel
+               OpBranch %47
+         %47 = OpLabel
+        %153 = OpLoad %int %i1
+        %154 = OpIAdd %int %153 %int_1
+               OpStore %i1 %154
+               OpBranch %45
+         %46 = OpLabel
+               OpBranch %38
+         %38 = OpLabel
+        %155 = OpLoad %int %i0
+        %156 = OpIAdd %int %155 %int_1
+               OpStore %i0 %156
+               OpBranch %36
+         %37 = OpLabel
+        %157 = OpLoad %int %a
+        %158 = OpIEqual %bool %157 %int_3
+               OpSelectionMerge %159 None
+               OpBranchConditional %158 %160 %161
+        %160 = OpLabel
+               OpStore %_GLF_color %33
+               OpBranch %159
+        %161 = OpLabel
+               OpStore %_GLF_color %34
+               OpBranch %159
+        %159 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..9982cde
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,168 @@
+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() {
+  int a = 0;
+  int i0 = 0;
+  int i1 = 0;
+  int i2 = 0;
+  int i3 = 0;
+  int i4 = 0;
+  int i5 = 0;
+  int i6 = 0;
+  int i7 = 0;
+  int i8_1 = 0;
+  int i9 = 0;
+  a = 0;
+  i0 = 0;
+  while (true) {
+    const int x_40 = i0;
+    const int x_42 = asint(x_7[0].x);
+    if ((x_40 < x_42)) {
+    } else {
+      break;
+    }
+    i1 = 0;
+    while (true) {
+      const int x_49 = i1;
+      const int x_51 = asint(x_7[0].x);
+      if ((x_49 < x_51)) {
+      } else {
+        break;
+      }
+      i2 = 0;
+      while (true) {
+        const int x_58 = i2;
+        const int x_60 = asint(x_7[0].x);
+        if ((x_58 < x_60)) {
+        } else {
+          break;
+        }
+        i3 = 0;
+        while (true) {
+          const int x_67 = i3;
+          const int x_69 = asint(x_7[0].x);
+          if ((x_67 < (x_69 + 2))) {
+          } else {
+            break;
+          }
+          i4 = 0;
+          while (true) {
+            const int x_77 = i4;
+            const int x_79 = asint(x_7[0].x);
+            if ((x_77 < x_79)) {
+            } else {
+              break;
+            }
+            i5 = 0;
+            while (true) {
+              const int x_86 = i5;
+              const int x_88 = asint(x_7[0].x);
+              if ((x_86 < x_88)) {
+              } else {
+                break;
+              }
+              while (true) {
+                const int x_96 = asint(x_7[0].x);
+                if ((x_96 > 0)) {
+                } else {
+                  break;
+                }
+                i6 = 0;
+                while (true) {
+                  const int x_103 = i6;
+                  const int x_105 = asint(x_7[0].x);
+                  if ((x_103 < x_105)) {
+                  } else {
+                    break;
+                  }
+                  i7 = 0;
+                  while (true) {
+                    const int x_112 = i7;
+                    const int x_114 = asint(x_7[0].x);
+                    if ((x_112 < x_114)) {
+                    } else {
+                      break;
+                    }
+                    i8_1 = 0;
+                    while (true) {
+                      const int x_121 = i8_1;
+                      const int x_123 = asint(x_7[0].x);
+                      if ((x_121 < x_123)) {
+                      } else {
+                        break;
+                      }
+                      i9 = 0;
+                      while (true) {
+                        const int x_130 = i9;
+                        const int x_132 = asint(x_7[0].x);
+                        if ((x_130 < x_132)) {
+                        } else {
+                          break;
+                        }
+                        a = (a + 1);
+                        {
+                          i9 = (i9 + 1);
+                        }
+                      }
+                      {
+                        i8_1 = (i8_1 + 1);
+                      }
+                    }
+                    {
+                      i7 = (i7 + 1);
+                    }
+                  }
+                  {
+                    i6 = (i6 + 1);
+                  }
+                }
+                break;
+              }
+              {
+                i5 = (i5 + 1);
+              }
+            }
+            {
+              i4 = (i4 + 1);
+            }
+          }
+          {
+            i3 = (i3 + 1);
+          }
+        }
+        {
+          i2 = (i2 + 1);
+        }
+      }
+      {
+        i1 = (i1 + 1);
+      }
+    }
+    {
+      i0 = (i0 + 1);
+    }
+  }
+  if ((a == 3)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..77cd3d1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops/0-opt.spvasm.expected.msl
@@ -0,0 +1,183 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int i0 = 0;
+  int i1 = 0;
+  int i2 = 0;
+  int i3 = 0;
+  int i4 = 0;
+  int i5 = 0;
+  int i6 = 0;
+  int i7 = 0;
+  int i8_1 = 0;
+  int i9 = 0;
+  a = 0;
+  i0 = 0;
+  while (true) {
+    int const x_40 = i0;
+    int const x_42 = x_7.one;
+    if ((x_40 < x_42)) {
+    } else {
+      break;
+    }
+    i1 = 0;
+    while (true) {
+      int const x_49 = i1;
+      int const x_51 = x_7.one;
+      if ((x_49 < x_51)) {
+      } else {
+        break;
+      }
+      i2 = 0;
+      while (true) {
+        int const x_58 = i2;
+        int const x_60 = x_7.one;
+        if ((x_58 < x_60)) {
+        } else {
+          break;
+        }
+        i3 = 0;
+        while (true) {
+          int const x_67 = i3;
+          int const x_69 = x_7.one;
+          if ((x_67 < (x_69 + 2))) {
+          } else {
+            break;
+          }
+          i4 = 0;
+          while (true) {
+            int const x_77 = i4;
+            int const x_79 = x_7.one;
+            if ((x_77 < x_79)) {
+            } else {
+              break;
+            }
+            i5 = 0;
+            while (true) {
+              int const x_86 = i5;
+              int const x_88 = x_7.one;
+              if ((x_86 < x_88)) {
+              } else {
+                break;
+              }
+              while (true) {
+                int const x_96 = x_7.one;
+                if ((x_96 > 0)) {
+                } else {
+                  break;
+                }
+                i6 = 0;
+                while (true) {
+                  int const x_103 = i6;
+                  int const x_105 = x_7.one;
+                  if ((x_103 < x_105)) {
+                  } else {
+                    break;
+                  }
+                  i7 = 0;
+                  while (true) {
+                    int const x_112 = i7;
+                    int const x_114 = x_7.one;
+                    if ((x_112 < x_114)) {
+                    } else {
+                      break;
+                    }
+                    i8_1 = 0;
+                    while (true) {
+                      int const x_121 = i8_1;
+                      int const x_123 = x_7.one;
+                      if ((x_121 < x_123)) {
+                      } else {
+                        break;
+                      }
+                      i9 = 0;
+                      while (true) {
+                        int const x_130 = i9;
+                        int const x_132 = x_7.one;
+                        if ((x_130 < x_132)) {
+                        } else {
+                          break;
+                        }
+                        int const x_135 = a;
+                        a = (x_135 + 1);
+                        {
+                          int const x_137 = i9;
+                          i9 = (x_137 + 1);
+                        }
+                      }
+                      {
+                        int const x_139 = i8_1;
+                        i8_1 = (x_139 + 1);
+                      }
+                    }
+                    {
+                      int const x_141 = i7;
+                      i7 = (x_141 + 1);
+                    }
+                  }
+                  {
+                    int const x_143 = i6;
+                    i6 = (x_143 + 1);
+                  }
+                }
+                break;
+              }
+              {
+                int const x_145 = i5;
+                i5 = (x_145 + 1);
+              }
+            }
+            {
+              int const x_147 = i4;
+              i4 = (x_147 + 1);
+            }
+          }
+          {
+            int const x_149 = i3;
+            i3 = (x_149 + 1);
+          }
+        }
+        {
+          int const x_151 = i2;
+          i2 = (x_151 + 1);
+        }
+      }
+      {
+        int const x_153 = i1;
+        i1 = (x_153 + 1);
+      }
+    }
+    {
+      int const x_155 = i0;
+      i0 = (x_155 + 1);
+    }
+  }
+  int const x_157 = a;
+  if ((x_157 == 3)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..854519d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,372 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 201
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %i0 "i0"
+               OpName %i1 "i1"
+               OpName %i2 "i2"
+               OpName %i3 "i3"
+               OpName %i4 "i4"
+               OpName %i5 "i5"
+               OpName %i6 "i6"
+               OpName %i7 "i7"
+               OpName %i8_1 "i8_1"
+               OpName %i9 "i9"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+      %int_1 = OpConstant %int 1
+      %int_3 = OpConstant %int 3
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+        %187 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %188 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+        %189 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %18
+         %i0 = OpVariable %_ptr_Function_int Function %18
+         %i1 = OpVariable %_ptr_Function_int Function %18
+         %i2 = OpVariable %_ptr_Function_int Function %18
+         %i3 = OpVariable %_ptr_Function_int Function %18
+         %i4 = OpVariable %_ptr_Function_int Function %18
+         %i5 = OpVariable %_ptr_Function_int Function %18
+         %i6 = OpVariable %_ptr_Function_int Function %18
+         %i7 = OpVariable %_ptr_Function_int Function %18
+       %i8_1 = OpVariable %_ptr_Function_int Function %18
+         %i9 = OpVariable %_ptr_Function_int Function %18
+               OpStore %a %int_0
+               OpStore %i0 %int_0
+               OpBranch %30
+         %30 = OpLabel
+               OpLoopMerge %31 %32 None
+               OpBranch %33
+         %33 = OpLabel
+         %34 = OpLoad %int %i0
+         %38 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %39 = OpLoad %int %38
+         %40 = OpSLessThan %bool %34 %39
+               OpSelectionMerge %42 None
+               OpBranchConditional %40 %43 %44
+         %43 = OpLabel
+               OpBranch %42
+         %44 = OpLabel
+               OpBranch %31
+         %42 = OpLabel
+               OpStore %i1 %int_0
+               OpBranch %45
+         %45 = OpLabel
+               OpLoopMerge %46 %47 None
+               OpBranch %48
+         %48 = OpLabel
+         %49 = OpLoad %int %i1
+         %50 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %51 = OpLoad %int %50
+         %52 = OpSLessThan %bool %49 %51
+               OpSelectionMerge %53 None
+               OpBranchConditional %52 %54 %55
+         %54 = OpLabel
+               OpBranch %53
+         %55 = OpLabel
+               OpBranch %46
+         %53 = OpLabel
+               OpStore %i2 %int_0
+               OpBranch %56
+         %56 = OpLabel
+               OpLoopMerge %57 %58 None
+               OpBranch %59
+         %59 = OpLabel
+         %60 = OpLoad %int %i2
+         %61 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %62 = OpLoad %int %61
+         %63 = OpSLessThan %bool %60 %62
+               OpSelectionMerge %64 None
+               OpBranchConditional %63 %65 %66
+         %65 = OpLabel
+               OpBranch %64
+         %66 = OpLabel
+               OpBranch %57
+         %64 = OpLabel
+               OpStore %i3 %int_0
+               OpBranch %67
+         %67 = OpLabel
+               OpLoopMerge %68 %69 None
+               OpBranch %70
+         %70 = OpLabel
+         %71 = OpLoad %int %i3
+         %72 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %73 = OpLoad %int %72
+         %75 = OpIAdd %int %73 %int_2
+         %76 = OpSLessThan %bool %71 %75
+               OpSelectionMerge %77 None
+               OpBranchConditional %76 %78 %79
+         %78 = OpLabel
+               OpBranch %77
+         %79 = OpLabel
+               OpBranch %68
+         %77 = OpLabel
+               OpStore %i4 %int_0
+               OpBranch %80
+         %80 = OpLabel
+               OpLoopMerge %81 %82 None
+               OpBranch %83
+         %83 = OpLabel
+         %84 = OpLoad %int %i4
+         %85 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %86 = OpLoad %int %85
+         %87 = OpSLessThan %bool %84 %86
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %90
+         %89 = OpLabel
+               OpBranch %88
+         %90 = OpLabel
+               OpBranch %81
+         %88 = OpLabel
+               OpStore %i5 %int_0
+               OpBranch %91
+         %91 = OpLabel
+               OpLoopMerge %92 %93 None
+               OpBranch %94
+         %94 = OpLabel
+         %95 = OpLoad %int %i5
+         %96 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %97 = OpLoad %int %96
+         %98 = OpSLessThan %bool %95 %97
+               OpSelectionMerge %99 None
+               OpBranchConditional %98 %100 %101
+        %100 = OpLabel
+               OpBranch %99
+        %101 = OpLabel
+               OpBranch %92
+         %99 = OpLabel
+               OpBranch %102
+        %102 = OpLabel
+               OpLoopMerge %103 %104 None
+               OpBranch %105
+        %105 = OpLabel
+        %106 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+        %107 = OpLoad %int %106
+        %108 = OpSGreaterThan %bool %107 %int_0
+               OpSelectionMerge %109 None
+               OpBranchConditional %108 %110 %111
+        %110 = OpLabel
+               OpBranch %109
+        %111 = OpLabel
+               OpBranch %103
+        %109 = OpLabel
+               OpStore %i6 %int_0
+               OpBranch %112
+        %112 = OpLabel
+               OpLoopMerge %113 %114 None
+               OpBranch %115
+        %115 = OpLabel
+        %116 = OpLoad %int %i6
+        %117 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+        %118 = OpLoad %int %117
+        %119 = OpSLessThan %bool %116 %118
+               OpSelectionMerge %120 None
+               OpBranchConditional %119 %121 %122
+        %121 = OpLabel
+               OpBranch %120
+        %122 = OpLabel
+               OpBranch %113
+        %120 = OpLabel
+               OpStore %i7 %int_0
+               OpBranch %123
+        %123 = OpLabel
+               OpLoopMerge %124 %125 None
+               OpBranch %126
+        %126 = OpLabel
+        %127 = OpLoad %int %i7
+        %128 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+        %129 = OpLoad %int %128
+        %130 = OpSLessThan %bool %127 %129
+               OpSelectionMerge %131 None
+               OpBranchConditional %130 %132 %133
+        %132 = OpLabel
+               OpBranch %131
+        %133 = OpLabel
+               OpBranch %124
+        %131 = OpLabel
+               OpStore %i8_1 %int_0
+               OpBranch %134
+        %134 = OpLabel
+               OpLoopMerge %135 %136 None
+               OpBranch %137
+        %137 = OpLabel
+        %138 = OpLoad %int %i8_1
+        %139 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+        %140 = OpLoad %int %139
+        %141 = OpSLessThan %bool %138 %140
+               OpSelectionMerge %142 None
+               OpBranchConditional %141 %143 %144
+        %143 = OpLabel
+               OpBranch %142
+        %144 = OpLabel
+               OpBranch %135
+        %142 = OpLabel
+               OpStore %i9 %int_0
+               OpBranch %145
+        %145 = OpLabel
+               OpLoopMerge %146 %147 None
+               OpBranch %148
+        %148 = OpLabel
+        %149 = OpLoad %int %i9
+        %150 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+        %151 = OpLoad %int %150
+        %152 = OpSLessThan %bool %149 %151
+               OpSelectionMerge %153 None
+               OpBranchConditional %152 %154 %155
+        %154 = OpLabel
+               OpBranch %153
+        %155 = OpLabel
+               OpBranch %146
+        %153 = OpLabel
+        %156 = OpLoad %int %a
+        %158 = OpIAdd %int %156 %int_1
+               OpStore %a %158
+               OpBranch %147
+        %147 = OpLabel
+        %159 = OpLoad %int %i9
+        %160 = OpIAdd %int %159 %int_1
+               OpStore %i9 %160
+               OpBranch %145
+        %146 = OpLabel
+               OpBranch %136
+        %136 = OpLabel
+        %161 = OpLoad %int %i8_1
+        %162 = OpIAdd %int %161 %int_1
+               OpStore %i8_1 %162
+               OpBranch %134
+        %135 = OpLabel
+               OpBranch %125
+        %125 = OpLabel
+        %163 = OpLoad %int %i7
+        %164 = OpIAdd %int %163 %int_1
+               OpStore %i7 %164
+               OpBranch %123
+        %124 = OpLabel
+               OpBranch %114
+        %114 = OpLabel
+        %165 = OpLoad %int %i6
+        %166 = OpIAdd %int %165 %int_1
+               OpStore %i6 %166
+               OpBranch %112
+        %113 = OpLabel
+               OpBranch %103
+        %104 = OpLabel
+               OpBranch %102
+        %103 = OpLabel
+               OpBranch %93
+         %93 = OpLabel
+        %167 = OpLoad %int %i5
+        %168 = OpIAdd %int %167 %int_1
+               OpStore %i5 %168
+               OpBranch %91
+         %92 = OpLabel
+               OpBranch %82
+         %82 = OpLabel
+        %169 = OpLoad %int %i4
+        %170 = OpIAdd %int %169 %int_1
+               OpStore %i4 %170
+               OpBranch %80
+         %81 = OpLabel
+               OpBranch %69
+         %69 = OpLabel
+        %171 = OpLoad %int %i3
+        %172 = OpIAdd %int %171 %int_1
+               OpStore %i3 %172
+               OpBranch %67
+         %68 = OpLabel
+               OpBranch %58
+         %58 = OpLabel
+        %173 = OpLoad %int %i2
+        %174 = OpIAdd %int %173 %int_1
+               OpStore %i2 %174
+               OpBranch %56
+         %57 = OpLabel
+               OpBranch %47
+         %47 = OpLabel
+        %175 = OpLoad %int %i1
+        %176 = OpIAdd %int %175 %int_1
+               OpStore %i1 %176
+               OpBranch %45
+         %46 = OpLabel
+               OpBranch %32
+         %32 = OpLabel
+        %177 = OpLoad %int %i0
+        %178 = OpIAdd %int %177 %int_1
+               OpStore %i0 %178
+               OpBranch %30
+         %31 = OpLabel
+        %179 = OpLoad %int %a
+        %181 = OpIEqual %bool %179 %int_3
+               OpSelectionMerge %182 None
+               OpBranchConditional %181 %183 %184
+        %183 = OpLabel
+               OpStore %x_GLF_color %187
+               OpBranch %182
+        %184 = OpLabel
+               OpStore %x_GLF_color %188
+               OpBranch %182
+        %182 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %189
+%tint_symbol = OpFunctionParameter %main_out
+        %193 = OpLabel
+        %194 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %194
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+        %196 = OpLabel
+        %197 = OpFunctionCall %void %main_1
+        %199 = OpLoad %v4float %x_GLF_color
+        %200 = OpCompositeConstruct %main_out %199
+        %198 = OpFunctionCall %void %tint_symbol_2 %200
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..66f0852
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,191 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i0 : i32;
+  var i1 : i32;
+  var i2 : i32;
+  var i3 : i32;
+  var i4 : i32;
+  var i5 : i32;
+  var i6 : i32;
+  var i7 : i32;
+  var i8_1 : i32;
+  var i9 : i32;
+  a = 0;
+  i0 = 0;
+  loop {
+    let x_40 : i32 = i0;
+    let x_42 : i32 = x_7.one;
+    if ((x_40 < x_42)) {
+    } else {
+      break;
+    }
+    i1 = 0;
+    loop {
+      let x_49 : i32 = i1;
+      let x_51 : i32 = x_7.one;
+      if ((x_49 < x_51)) {
+      } else {
+        break;
+      }
+      i2 = 0;
+      loop {
+        let x_58 : i32 = i2;
+        let x_60 : i32 = x_7.one;
+        if ((x_58 < x_60)) {
+        } else {
+          break;
+        }
+        i3 = 0;
+        loop {
+          let x_67 : i32 = i3;
+          let x_69 : i32 = x_7.one;
+          if ((x_67 < (x_69 + 2))) {
+          } else {
+            break;
+          }
+          i4 = 0;
+          loop {
+            let x_77 : i32 = i4;
+            let x_79 : i32 = x_7.one;
+            if ((x_77 < x_79)) {
+            } else {
+              break;
+            }
+            i5 = 0;
+            loop {
+              let x_86 : i32 = i5;
+              let x_88 : i32 = x_7.one;
+              if ((x_86 < x_88)) {
+              } else {
+                break;
+              }
+              loop {
+                let x_96 : i32 = x_7.one;
+                if ((x_96 > 0)) {
+                } else {
+                  break;
+                }
+                i6 = 0;
+                loop {
+                  let x_103 : i32 = i6;
+                  let x_105 : i32 = x_7.one;
+                  if ((x_103 < x_105)) {
+                  } else {
+                    break;
+                  }
+                  i7 = 0;
+                  loop {
+                    let x_112 : i32 = i7;
+                    let x_114 : i32 = x_7.one;
+                    if ((x_112 < x_114)) {
+                    } else {
+                      break;
+                    }
+                    i8_1 = 0;
+                    loop {
+                      let x_121 : i32 = i8_1;
+                      let x_123 : i32 = x_7.one;
+                      if ((x_121 < x_123)) {
+                      } else {
+                        break;
+                      }
+                      i9 = 0;
+                      loop {
+                        let x_130 : i32 = i9;
+                        let x_132 : i32 = x_7.one;
+                        if ((x_130 < x_132)) {
+                        } else {
+                          break;
+                        }
+                        let x_135 : i32 = a;
+                        a = (x_135 + 1);
+
+                        continuing {
+                          let x_137 : i32 = i9;
+                          i9 = (x_137 + 1);
+                        }
+                      }
+
+                      continuing {
+                        let x_139 : i32 = i8_1;
+                        i8_1 = (x_139 + 1);
+                      }
+                    }
+
+                    continuing {
+                      let x_141 : i32 = i7;
+                      i7 = (x_141 + 1);
+                    }
+                  }
+
+                  continuing {
+                    let x_143 : i32 = i6;
+                    i6 = (x_143 + 1);
+                  }
+                }
+                break;
+              }
+
+              continuing {
+                let x_145 : i32 = i5;
+                i5 = (x_145 + 1);
+              }
+            }
+
+            continuing {
+              let x_147 : i32 = i4;
+              i4 = (x_147 + 1);
+            }
+          }
+
+          continuing {
+            let x_149 : i32 = i3;
+            i3 = (x_149 + 1);
+          }
+        }
+
+        continuing {
+          let x_151 : i32 = i2;
+          i2 = (x_151 + 1);
+        }
+      }
+
+      continuing {
+        let x_153 : i32 = i1;
+        i1 = (x_153 + 1);
+      }
+    }
+
+    continuing {
+      let x_155 : i32 = i0;
+      i0 = (x_155 + 1);
+    }
+  }
+  let x_157 : i32 = a;
+  if ((x_157 == 3)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops/0-opt.wgsl
new file mode 100644
index 0000000..66f0852
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops/0-opt.wgsl
@@ -0,0 +1,191 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i0 : i32;
+  var i1 : i32;
+  var i2 : i32;
+  var i3 : i32;
+  var i4 : i32;
+  var i5 : i32;
+  var i6 : i32;
+  var i7 : i32;
+  var i8_1 : i32;
+  var i9 : i32;
+  a = 0;
+  i0 = 0;
+  loop {
+    let x_40 : i32 = i0;
+    let x_42 : i32 = x_7.one;
+    if ((x_40 < x_42)) {
+    } else {
+      break;
+    }
+    i1 = 0;
+    loop {
+      let x_49 : i32 = i1;
+      let x_51 : i32 = x_7.one;
+      if ((x_49 < x_51)) {
+      } else {
+        break;
+      }
+      i2 = 0;
+      loop {
+        let x_58 : i32 = i2;
+        let x_60 : i32 = x_7.one;
+        if ((x_58 < x_60)) {
+        } else {
+          break;
+        }
+        i3 = 0;
+        loop {
+          let x_67 : i32 = i3;
+          let x_69 : i32 = x_7.one;
+          if ((x_67 < (x_69 + 2))) {
+          } else {
+            break;
+          }
+          i4 = 0;
+          loop {
+            let x_77 : i32 = i4;
+            let x_79 : i32 = x_7.one;
+            if ((x_77 < x_79)) {
+            } else {
+              break;
+            }
+            i5 = 0;
+            loop {
+              let x_86 : i32 = i5;
+              let x_88 : i32 = x_7.one;
+              if ((x_86 < x_88)) {
+              } else {
+                break;
+              }
+              loop {
+                let x_96 : i32 = x_7.one;
+                if ((x_96 > 0)) {
+                } else {
+                  break;
+                }
+                i6 = 0;
+                loop {
+                  let x_103 : i32 = i6;
+                  let x_105 : i32 = x_7.one;
+                  if ((x_103 < x_105)) {
+                  } else {
+                    break;
+                  }
+                  i7 = 0;
+                  loop {
+                    let x_112 : i32 = i7;
+                    let x_114 : i32 = x_7.one;
+                    if ((x_112 < x_114)) {
+                    } else {
+                      break;
+                    }
+                    i8_1 = 0;
+                    loop {
+                      let x_121 : i32 = i8_1;
+                      let x_123 : i32 = x_7.one;
+                      if ((x_121 < x_123)) {
+                      } else {
+                        break;
+                      }
+                      i9 = 0;
+                      loop {
+                        let x_130 : i32 = i9;
+                        let x_132 : i32 = x_7.one;
+                        if ((x_130 < x_132)) {
+                        } else {
+                          break;
+                        }
+                        let x_135 : i32 = a;
+                        a = (x_135 + 1);
+
+                        continuing {
+                          let x_137 : i32 = i9;
+                          i9 = (x_137 + 1);
+                        }
+                      }
+
+                      continuing {
+                        let x_139 : i32 = i8_1;
+                        i8_1 = (x_139 + 1);
+                      }
+                    }
+
+                    continuing {
+                      let x_141 : i32 = i7;
+                      i7 = (x_141 + 1);
+                    }
+                  }
+
+                  continuing {
+                    let x_143 : i32 = i6;
+                    i6 = (x_143 + 1);
+                  }
+                }
+                break;
+              }
+
+              continuing {
+                let x_145 : i32 = i5;
+                i5 = (x_145 + 1);
+              }
+            }
+
+            continuing {
+              let x_147 : i32 = i4;
+              i4 = (x_147 + 1);
+            }
+          }
+
+          continuing {
+            let x_149 : i32 = i3;
+            i3 = (x_149 + 1);
+          }
+        }
+
+        continuing {
+          let x_151 : i32 = i2;
+          i2 = (x_151 + 1);
+        }
+      }
+
+      continuing {
+        let x_153 : i32 = i1;
+        i1 = (x_153 + 1);
+      }
+    }
+
+    continuing {
+      let x_155 : i32 = i0;
+      i0 = (x_155 + 1);
+    }
+  }
+  let x_157 : i32 = a;
+  if ((x_157 == 3)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..9982cde
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,168 @@
+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() {
+  int a = 0;
+  int i0 = 0;
+  int i1 = 0;
+  int i2 = 0;
+  int i3 = 0;
+  int i4 = 0;
+  int i5 = 0;
+  int i6 = 0;
+  int i7 = 0;
+  int i8_1 = 0;
+  int i9 = 0;
+  a = 0;
+  i0 = 0;
+  while (true) {
+    const int x_40 = i0;
+    const int x_42 = asint(x_7[0].x);
+    if ((x_40 < x_42)) {
+    } else {
+      break;
+    }
+    i1 = 0;
+    while (true) {
+      const int x_49 = i1;
+      const int x_51 = asint(x_7[0].x);
+      if ((x_49 < x_51)) {
+      } else {
+        break;
+      }
+      i2 = 0;
+      while (true) {
+        const int x_58 = i2;
+        const int x_60 = asint(x_7[0].x);
+        if ((x_58 < x_60)) {
+        } else {
+          break;
+        }
+        i3 = 0;
+        while (true) {
+          const int x_67 = i3;
+          const int x_69 = asint(x_7[0].x);
+          if ((x_67 < (x_69 + 2))) {
+          } else {
+            break;
+          }
+          i4 = 0;
+          while (true) {
+            const int x_77 = i4;
+            const int x_79 = asint(x_7[0].x);
+            if ((x_77 < x_79)) {
+            } else {
+              break;
+            }
+            i5 = 0;
+            while (true) {
+              const int x_86 = i5;
+              const int x_88 = asint(x_7[0].x);
+              if ((x_86 < x_88)) {
+              } else {
+                break;
+              }
+              while (true) {
+                const int x_96 = asint(x_7[0].x);
+                if ((x_96 > 0)) {
+                } else {
+                  break;
+                }
+                i6 = 0;
+                while (true) {
+                  const int x_103 = i6;
+                  const int x_105 = asint(x_7[0].x);
+                  if ((x_103 < x_105)) {
+                  } else {
+                    break;
+                  }
+                  i7 = 0;
+                  while (true) {
+                    const int x_112 = i7;
+                    const int x_114 = asint(x_7[0].x);
+                    if ((x_112 < x_114)) {
+                    } else {
+                      break;
+                    }
+                    i8_1 = 0;
+                    while (true) {
+                      const int x_121 = i8_1;
+                      const int x_123 = asint(x_7[0].x);
+                      if ((x_121 < x_123)) {
+                      } else {
+                        break;
+                      }
+                      i9 = 0;
+                      while (true) {
+                        const int x_130 = i9;
+                        const int x_132 = asint(x_7[0].x);
+                        if ((x_130 < x_132)) {
+                        } else {
+                          break;
+                        }
+                        a = (a + 1);
+                        {
+                          i9 = (i9 + 1);
+                        }
+                      }
+                      {
+                        i8_1 = (i8_1 + 1);
+                      }
+                    }
+                    {
+                      i7 = (i7 + 1);
+                    }
+                  }
+                  {
+                    i6 = (i6 + 1);
+                  }
+                }
+                break;
+              }
+              {
+                i5 = (i5 + 1);
+              }
+            }
+            {
+              i4 = (i4 + 1);
+            }
+          }
+          {
+            i3 = (i3 + 1);
+          }
+        }
+        {
+          i2 = (i2 + 1);
+        }
+      }
+      {
+        i1 = (i1 + 1);
+      }
+    }
+    {
+      i0 = (i0 + 1);
+    }
+  }
+  if ((a == 3)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..77cd3d1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops/0-opt.wgsl.expected.msl
@@ -0,0 +1,183 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int i0 = 0;
+  int i1 = 0;
+  int i2 = 0;
+  int i3 = 0;
+  int i4 = 0;
+  int i5 = 0;
+  int i6 = 0;
+  int i7 = 0;
+  int i8_1 = 0;
+  int i9 = 0;
+  a = 0;
+  i0 = 0;
+  while (true) {
+    int const x_40 = i0;
+    int const x_42 = x_7.one;
+    if ((x_40 < x_42)) {
+    } else {
+      break;
+    }
+    i1 = 0;
+    while (true) {
+      int const x_49 = i1;
+      int const x_51 = x_7.one;
+      if ((x_49 < x_51)) {
+      } else {
+        break;
+      }
+      i2 = 0;
+      while (true) {
+        int const x_58 = i2;
+        int const x_60 = x_7.one;
+        if ((x_58 < x_60)) {
+        } else {
+          break;
+        }
+        i3 = 0;
+        while (true) {
+          int const x_67 = i3;
+          int const x_69 = x_7.one;
+          if ((x_67 < (x_69 + 2))) {
+          } else {
+            break;
+          }
+          i4 = 0;
+          while (true) {
+            int const x_77 = i4;
+            int const x_79 = x_7.one;
+            if ((x_77 < x_79)) {
+            } else {
+              break;
+            }
+            i5 = 0;
+            while (true) {
+              int const x_86 = i5;
+              int const x_88 = x_7.one;
+              if ((x_86 < x_88)) {
+              } else {
+                break;
+              }
+              while (true) {
+                int const x_96 = x_7.one;
+                if ((x_96 > 0)) {
+                } else {
+                  break;
+                }
+                i6 = 0;
+                while (true) {
+                  int const x_103 = i6;
+                  int const x_105 = x_7.one;
+                  if ((x_103 < x_105)) {
+                  } else {
+                    break;
+                  }
+                  i7 = 0;
+                  while (true) {
+                    int const x_112 = i7;
+                    int const x_114 = x_7.one;
+                    if ((x_112 < x_114)) {
+                    } else {
+                      break;
+                    }
+                    i8_1 = 0;
+                    while (true) {
+                      int const x_121 = i8_1;
+                      int const x_123 = x_7.one;
+                      if ((x_121 < x_123)) {
+                      } else {
+                        break;
+                      }
+                      i9 = 0;
+                      while (true) {
+                        int const x_130 = i9;
+                        int const x_132 = x_7.one;
+                        if ((x_130 < x_132)) {
+                        } else {
+                          break;
+                        }
+                        int const x_135 = a;
+                        a = (x_135 + 1);
+                        {
+                          int const x_137 = i9;
+                          i9 = (x_137 + 1);
+                        }
+                      }
+                      {
+                        int const x_139 = i8_1;
+                        i8_1 = (x_139 + 1);
+                      }
+                    }
+                    {
+                      int const x_141 = i7;
+                      i7 = (x_141 + 1);
+                    }
+                  }
+                  {
+                    int const x_143 = i6;
+                    i6 = (x_143 + 1);
+                  }
+                }
+                break;
+              }
+              {
+                int const x_145 = i5;
+                i5 = (x_145 + 1);
+              }
+            }
+            {
+              int const x_147 = i4;
+              i4 = (x_147 + 1);
+            }
+          }
+          {
+            int const x_149 = i3;
+            i3 = (x_149 + 1);
+          }
+        }
+        {
+          int const x_151 = i2;
+          i2 = (x_151 + 1);
+        }
+      }
+      {
+        int const x_153 = i1;
+        i1 = (x_153 + 1);
+      }
+    }
+    {
+      int const x_155 = i0;
+      i0 = (x_155 + 1);
+    }
+  }
+  int const x_157 = a;
+  if ((x_157 == 3)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..854519d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,372 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 201
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %i0 "i0"
+               OpName %i1 "i1"
+               OpName %i2 "i2"
+               OpName %i3 "i3"
+               OpName %i4 "i4"
+               OpName %i5 "i5"
+               OpName %i6 "i6"
+               OpName %i7 "i7"
+               OpName %i8_1 "i8_1"
+               OpName %i9 "i9"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+      %int_1 = OpConstant %int 1
+      %int_3 = OpConstant %int 3
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+        %187 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %188 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+        %189 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %18
+         %i0 = OpVariable %_ptr_Function_int Function %18
+         %i1 = OpVariable %_ptr_Function_int Function %18
+         %i2 = OpVariable %_ptr_Function_int Function %18
+         %i3 = OpVariable %_ptr_Function_int Function %18
+         %i4 = OpVariable %_ptr_Function_int Function %18
+         %i5 = OpVariable %_ptr_Function_int Function %18
+         %i6 = OpVariable %_ptr_Function_int Function %18
+         %i7 = OpVariable %_ptr_Function_int Function %18
+       %i8_1 = OpVariable %_ptr_Function_int Function %18
+         %i9 = OpVariable %_ptr_Function_int Function %18
+               OpStore %a %int_0
+               OpStore %i0 %int_0
+               OpBranch %30
+         %30 = OpLabel
+               OpLoopMerge %31 %32 None
+               OpBranch %33
+         %33 = OpLabel
+         %34 = OpLoad %int %i0
+         %38 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %39 = OpLoad %int %38
+         %40 = OpSLessThan %bool %34 %39
+               OpSelectionMerge %42 None
+               OpBranchConditional %40 %43 %44
+         %43 = OpLabel
+               OpBranch %42
+         %44 = OpLabel
+               OpBranch %31
+         %42 = OpLabel
+               OpStore %i1 %int_0
+               OpBranch %45
+         %45 = OpLabel
+               OpLoopMerge %46 %47 None
+               OpBranch %48
+         %48 = OpLabel
+         %49 = OpLoad %int %i1
+         %50 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %51 = OpLoad %int %50
+         %52 = OpSLessThan %bool %49 %51
+               OpSelectionMerge %53 None
+               OpBranchConditional %52 %54 %55
+         %54 = OpLabel
+               OpBranch %53
+         %55 = OpLabel
+               OpBranch %46
+         %53 = OpLabel
+               OpStore %i2 %int_0
+               OpBranch %56
+         %56 = OpLabel
+               OpLoopMerge %57 %58 None
+               OpBranch %59
+         %59 = OpLabel
+         %60 = OpLoad %int %i2
+         %61 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %62 = OpLoad %int %61
+         %63 = OpSLessThan %bool %60 %62
+               OpSelectionMerge %64 None
+               OpBranchConditional %63 %65 %66
+         %65 = OpLabel
+               OpBranch %64
+         %66 = OpLabel
+               OpBranch %57
+         %64 = OpLabel
+               OpStore %i3 %int_0
+               OpBranch %67
+         %67 = OpLabel
+               OpLoopMerge %68 %69 None
+               OpBranch %70
+         %70 = OpLabel
+         %71 = OpLoad %int %i3
+         %72 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %73 = OpLoad %int %72
+         %75 = OpIAdd %int %73 %int_2
+         %76 = OpSLessThan %bool %71 %75
+               OpSelectionMerge %77 None
+               OpBranchConditional %76 %78 %79
+         %78 = OpLabel
+               OpBranch %77
+         %79 = OpLabel
+               OpBranch %68
+         %77 = OpLabel
+               OpStore %i4 %int_0
+               OpBranch %80
+         %80 = OpLabel
+               OpLoopMerge %81 %82 None
+               OpBranch %83
+         %83 = OpLabel
+         %84 = OpLoad %int %i4
+         %85 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %86 = OpLoad %int %85
+         %87 = OpSLessThan %bool %84 %86
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %90
+         %89 = OpLabel
+               OpBranch %88
+         %90 = OpLabel
+               OpBranch %81
+         %88 = OpLabel
+               OpStore %i5 %int_0
+               OpBranch %91
+         %91 = OpLabel
+               OpLoopMerge %92 %93 None
+               OpBranch %94
+         %94 = OpLabel
+         %95 = OpLoad %int %i5
+         %96 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %97 = OpLoad %int %96
+         %98 = OpSLessThan %bool %95 %97
+               OpSelectionMerge %99 None
+               OpBranchConditional %98 %100 %101
+        %100 = OpLabel
+               OpBranch %99
+        %101 = OpLabel
+               OpBranch %92
+         %99 = OpLabel
+               OpBranch %102
+        %102 = OpLabel
+               OpLoopMerge %103 %104 None
+               OpBranch %105
+        %105 = OpLabel
+        %106 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+        %107 = OpLoad %int %106
+        %108 = OpSGreaterThan %bool %107 %int_0
+               OpSelectionMerge %109 None
+               OpBranchConditional %108 %110 %111
+        %110 = OpLabel
+               OpBranch %109
+        %111 = OpLabel
+               OpBranch %103
+        %109 = OpLabel
+               OpStore %i6 %int_0
+               OpBranch %112
+        %112 = OpLabel
+               OpLoopMerge %113 %114 None
+               OpBranch %115
+        %115 = OpLabel
+        %116 = OpLoad %int %i6
+        %117 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+        %118 = OpLoad %int %117
+        %119 = OpSLessThan %bool %116 %118
+               OpSelectionMerge %120 None
+               OpBranchConditional %119 %121 %122
+        %121 = OpLabel
+               OpBranch %120
+        %122 = OpLabel
+               OpBranch %113
+        %120 = OpLabel
+               OpStore %i7 %int_0
+               OpBranch %123
+        %123 = OpLabel
+               OpLoopMerge %124 %125 None
+               OpBranch %126
+        %126 = OpLabel
+        %127 = OpLoad %int %i7
+        %128 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+        %129 = OpLoad %int %128
+        %130 = OpSLessThan %bool %127 %129
+               OpSelectionMerge %131 None
+               OpBranchConditional %130 %132 %133
+        %132 = OpLabel
+               OpBranch %131
+        %133 = OpLabel
+               OpBranch %124
+        %131 = OpLabel
+               OpStore %i8_1 %int_0
+               OpBranch %134
+        %134 = OpLabel
+               OpLoopMerge %135 %136 None
+               OpBranch %137
+        %137 = OpLabel
+        %138 = OpLoad %int %i8_1
+        %139 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+        %140 = OpLoad %int %139
+        %141 = OpSLessThan %bool %138 %140
+               OpSelectionMerge %142 None
+               OpBranchConditional %141 %143 %144
+        %143 = OpLabel
+               OpBranch %142
+        %144 = OpLabel
+               OpBranch %135
+        %142 = OpLabel
+               OpStore %i9 %int_0
+               OpBranch %145
+        %145 = OpLabel
+               OpLoopMerge %146 %147 None
+               OpBranch %148
+        %148 = OpLabel
+        %149 = OpLoad %int %i9
+        %150 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+        %151 = OpLoad %int %150
+        %152 = OpSLessThan %bool %149 %151
+               OpSelectionMerge %153 None
+               OpBranchConditional %152 %154 %155
+        %154 = OpLabel
+               OpBranch %153
+        %155 = OpLabel
+               OpBranch %146
+        %153 = OpLabel
+        %156 = OpLoad %int %a
+        %158 = OpIAdd %int %156 %int_1
+               OpStore %a %158
+               OpBranch %147
+        %147 = OpLabel
+        %159 = OpLoad %int %i9
+        %160 = OpIAdd %int %159 %int_1
+               OpStore %i9 %160
+               OpBranch %145
+        %146 = OpLabel
+               OpBranch %136
+        %136 = OpLabel
+        %161 = OpLoad %int %i8_1
+        %162 = OpIAdd %int %161 %int_1
+               OpStore %i8_1 %162
+               OpBranch %134
+        %135 = OpLabel
+               OpBranch %125
+        %125 = OpLabel
+        %163 = OpLoad %int %i7
+        %164 = OpIAdd %int %163 %int_1
+               OpStore %i7 %164
+               OpBranch %123
+        %124 = OpLabel
+               OpBranch %114
+        %114 = OpLabel
+        %165 = OpLoad %int %i6
+        %166 = OpIAdd %int %165 %int_1
+               OpStore %i6 %166
+               OpBranch %112
+        %113 = OpLabel
+               OpBranch %103
+        %104 = OpLabel
+               OpBranch %102
+        %103 = OpLabel
+               OpBranch %93
+         %93 = OpLabel
+        %167 = OpLoad %int %i5
+        %168 = OpIAdd %int %167 %int_1
+               OpStore %i5 %168
+               OpBranch %91
+         %92 = OpLabel
+               OpBranch %82
+         %82 = OpLabel
+        %169 = OpLoad %int %i4
+        %170 = OpIAdd %int %169 %int_1
+               OpStore %i4 %170
+               OpBranch %80
+         %81 = OpLabel
+               OpBranch %69
+         %69 = OpLabel
+        %171 = OpLoad %int %i3
+        %172 = OpIAdd %int %171 %int_1
+               OpStore %i3 %172
+               OpBranch %67
+         %68 = OpLabel
+               OpBranch %58
+         %58 = OpLabel
+        %173 = OpLoad %int %i2
+        %174 = OpIAdd %int %173 %int_1
+               OpStore %i2 %174
+               OpBranch %56
+         %57 = OpLabel
+               OpBranch %47
+         %47 = OpLabel
+        %175 = OpLoad %int %i1
+        %176 = OpIAdd %int %175 %int_1
+               OpStore %i1 %176
+               OpBranch %45
+         %46 = OpLabel
+               OpBranch %32
+         %32 = OpLabel
+        %177 = OpLoad %int %i0
+        %178 = OpIAdd %int %177 %int_1
+               OpStore %i0 %178
+               OpBranch %30
+         %31 = OpLabel
+        %179 = OpLoad %int %a
+        %181 = OpIEqual %bool %179 %int_3
+               OpSelectionMerge %182 None
+               OpBranchConditional %181 %183 %184
+        %183 = OpLabel
+               OpStore %x_GLF_color %187
+               OpBranch %182
+        %184 = OpLabel
+               OpStore %x_GLF_color %188
+               OpBranch %182
+        %182 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %189
+%tint_symbol = OpFunctionParameter %main_out
+        %193 = OpLabel
+        %194 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %194
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+        %196 = OpLabel
+        %197 = OpFunctionCall %void %main_1
+        %199 = OpLoad %v4float %x_GLF_color
+        %200 = OpCompositeConstruct %main_out %199
+        %198 = OpFunctionCall %void %tint_symbol_2 %200
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..66f0852
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-scaled-number-nested-loops/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,191 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i0 : i32;
+  var i1 : i32;
+  var i2 : i32;
+  var i3 : i32;
+  var i4 : i32;
+  var i5 : i32;
+  var i6 : i32;
+  var i7 : i32;
+  var i8_1 : i32;
+  var i9 : i32;
+  a = 0;
+  i0 = 0;
+  loop {
+    let x_40 : i32 = i0;
+    let x_42 : i32 = x_7.one;
+    if ((x_40 < x_42)) {
+    } else {
+      break;
+    }
+    i1 = 0;
+    loop {
+      let x_49 : i32 = i1;
+      let x_51 : i32 = x_7.one;
+      if ((x_49 < x_51)) {
+      } else {
+        break;
+      }
+      i2 = 0;
+      loop {
+        let x_58 : i32 = i2;
+        let x_60 : i32 = x_7.one;
+        if ((x_58 < x_60)) {
+        } else {
+          break;
+        }
+        i3 = 0;
+        loop {
+          let x_67 : i32 = i3;
+          let x_69 : i32 = x_7.one;
+          if ((x_67 < (x_69 + 2))) {
+          } else {
+            break;
+          }
+          i4 = 0;
+          loop {
+            let x_77 : i32 = i4;
+            let x_79 : i32 = x_7.one;
+            if ((x_77 < x_79)) {
+            } else {
+              break;
+            }
+            i5 = 0;
+            loop {
+              let x_86 : i32 = i5;
+              let x_88 : i32 = x_7.one;
+              if ((x_86 < x_88)) {
+              } else {
+                break;
+              }
+              loop {
+                let x_96 : i32 = x_7.one;
+                if ((x_96 > 0)) {
+                } else {
+                  break;
+                }
+                i6 = 0;
+                loop {
+                  let x_103 : i32 = i6;
+                  let x_105 : i32 = x_7.one;
+                  if ((x_103 < x_105)) {
+                  } else {
+                    break;
+                  }
+                  i7 = 0;
+                  loop {
+                    let x_112 : i32 = i7;
+                    let x_114 : i32 = x_7.one;
+                    if ((x_112 < x_114)) {
+                    } else {
+                      break;
+                    }
+                    i8_1 = 0;
+                    loop {
+                      let x_121 : i32 = i8_1;
+                      let x_123 : i32 = x_7.one;
+                      if ((x_121 < x_123)) {
+                      } else {
+                        break;
+                      }
+                      i9 = 0;
+                      loop {
+                        let x_130 : i32 = i9;
+                        let x_132 : i32 = x_7.one;
+                        if ((x_130 < x_132)) {
+                        } else {
+                          break;
+                        }
+                        let x_135 : i32 = a;
+                        a = (x_135 + 1);
+
+                        continuing {
+                          let x_137 : i32 = i9;
+                          i9 = (x_137 + 1);
+                        }
+                      }
+
+                      continuing {
+                        let x_139 : i32 = i8_1;
+                        i8_1 = (x_139 + 1);
+                      }
+                    }
+
+                    continuing {
+                      let x_141 : i32 = i7;
+                      i7 = (x_141 + 1);
+                    }
+                  }
+
+                  continuing {
+                    let x_143 : i32 = i6;
+                    i6 = (x_143 + 1);
+                  }
+                }
+                break;
+              }
+
+              continuing {
+                let x_145 : i32 = i5;
+                i5 = (x_145 + 1);
+              }
+            }
+
+            continuing {
+              let x_147 : i32 = i4;
+              i4 = (x_147 + 1);
+            }
+          }
+
+          continuing {
+            let x_149 : i32 = i3;
+            i3 = (x_149 + 1);
+          }
+        }
+
+        continuing {
+          let x_151 : i32 = i2;
+          i2 = (x_151 + 1);
+        }
+      }
+
+      continuing {
+        let x_153 : i32 = i1;
+        i1 = (x_153 + 1);
+      }
+    }
+
+    continuing {
+      let x_155 : i32 = i0;
+      i0 = (x_155 + 1);
+    }
+  }
+  let x_157 : i32 = a;
+  if ((x_157 == 3)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-schedule-dag-rrlist-mix-log-cos/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-schedule-dag-rrlist-mix-log-cos/0-opt.spvasm
new file mode 100644
index 0000000..5c74e57
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-schedule-dag-rrlist-mix-log-cos/0-opt.spvasm
@@ -0,0 +1,93 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %b "b"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_5 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_float_uint_5 = OpTypeArray %float %uint_5
+       %buf0 = OpTypeStruct %_arr_float_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_3 = OpConstant %int 3
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+      %int_1 = OpConstant %int 1
+      %int_4 = OpConstant %int 4
+       %main = OpFunction %void None %10
+         %26 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function
+          %b = OpVariable %_ptr_Function_float Function
+         %27 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %28 = OpLoad %float %27
+         %29 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_3
+         %30 = OpLoad %float %29
+         %31 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_3
+         %32 = OpLoad %float %31
+         %33 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %34 = OpLoad %float %33
+         %35 = OpFOrdGreaterThan %bool %32 %34
+         %36 = OpSelect %float %35 %30 %28
+               OpStore %a %36
+         %37 = OpLoad %float %a
+         %38 = OpExtInst %float %1 Log %37
+         %39 = OpExtInst %float %1 Cos %38
+               OpStore %b %39
+         %40 = OpLoad %float %b
+         %41 = OpCompositeConstruct %v4float %40 %40 %40 %40
+               OpStore %_GLF_color %41
+         %42 = OpLoad %float %b
+         %43 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %44 = OpLoad %float %43
+         %45 = OpFOrdGreaterThan %bool %42 %44
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %46
+         %47 = OpLabel
+         %48 = OpLoad %float %b
+         %49 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %50 = OpLoad %float %49
+         %51 = OpFOrdLessThan %bool %48 %50
+               OpBranch %46
+         %46 = OpLabel
+         %52 = OpPhi %bool %45 %26 %51 %47
+               OpSelectionMerge %53 None
+               OpBranchConditional %52 %54 %53
+         %54 = OpLabel
+         %55 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_3
+         %56 = OpLoad %float %55
+         %57 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_4
+         %58 = OpLoad %float %57
+         %59 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_4
+         %60 = OpLoad %float %59
+         %61 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_3
+         %62 = OpLoad %float %61
+         %63 = OpCompositeConstruct %v4float %56 %58 %60 %62
+               OpStore %_GLF_color %63
+               OpBranch %53
+         %53 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-schedule-dag-rrlist-mix-log-cos/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-schedule-dag-rrlist-mix-log-cos/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..7fa9952
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-schedule-dag-rrlist-mix-log-cos/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,52 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[5];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float a = 0.0f;
+  float b = 0.0f;
+  bool x_51 = false;
+  bool x_52_phi = false;
+  const float x_28 = asfloat(x_6[2].x);
+  const float x_30 = asfloat(x_6[3].x);
+  const float x_32 = asfloat(x_6[3].x);
+  const float x_34 = asfloat(x_6[2].x);
+  a = ((x_32 > x_34) ? x_30 : x_28);
+  b = cos(log(a));
+  const float x_40 = b;
+  x_GLF_color = float4(x_40, x_40, x_40, x_40);
+  const float x_42 = b;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_44 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const bool x_45 = (x_42 > x_44);
+  x_52_phi = x_45;
+  if (x_45) {
+    const float x_48 = b;
+    const float x_50 = asfloat(x_6[1].x);
+    x_51 = (x_48 < x_50);
+    x_52_phi = x_51;
+  }
+  if (x_52_phi) {
+    const float x_56 = asfloat(x_6[3].x);
+    const float x_58 = asfloat(x_6[4].x);
+    const float x_60 = asfloat(x_6[4].x);
+    const float x_62 = asfloat(x_6[3].x);
+    x_GLF_color = float4(x_56, x_58, x_60, x_62);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-schedule-dag-rrlist-mix-log-cos/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-schedule-dag-rrlist-mix-log-cos/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..b2905ce
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-schedule-dag-rrlist-mix-log-cos/0-opt.spvasm.expected.msl
@@ -0,0 +1,63 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[5];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float a = 0.0f;
+  float b = 0.0f;
+  bool x_51 = false;
+  bool x_52_phi = false;
+  float const x_28 = x_6.x_GLF_uniform_float_values.arr[2].el;
+  float const x_30 = x_6.x_GLF_uniform_float_values.arr[3].el;
+  float const x_32 = x_6.x_GLF_uniform_float_values.arr[3].el;
+  float const x_34 = x_6.x_GLF_uniform_float_values.arr[2].el;
+  a = select(x_28, x_30, (x_32 > x_34));
+  float const x_37 = a;
+  b = cos(log(x_37));
+  float const x_40 = b;
+  *(tint_symbol_4) = float4(x_40, x_40, x_40, x_40);
+  float const x_42 = b;
+  float const x_44 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  bool const x_45 = (x_42 > x_44);
+  x_52_phi = x_45;
+  if (x_45) {
+    float const x_48 = b;
+    float const x_50 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    x_51 = (x_48 < x_50);
+    x_52_phi = x_51;
+  }
+  bool const x_52 = x_52_phi;
+  if (x_52) {
+    float const x_56 = x_6.x_GLF_uniform_float_values.arr[3].el;
+    float const x_58 = x_6.x_GLF_uniform_float_values.arr[4].el;
+    float const x_60 = x_6.x_GLF_uniform_float_values.arr[4].el;
+    float const x_62 = x_6.x_GLF_uniform_float_values.arr[3].el;
+    *(tint_symbol_4) = float4(x_56, x_58, x_60, x_62);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-schedule-dag-rrlist-mix-log-cos/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-schedule-dag-rrlist-mix-log-cos/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..f34e73c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-schedule-dag-rrlist-mix-log-cos/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,137 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 86
+; Schema: 0
+               OpCapability Shader
+         %44 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %x_51 "x_51"
+               OpName %x_52_phi "x_52_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_5 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_float_uint_5 = OpTypeArray %float %uint_5
+       %buf0 = OpTypeStruct %_arr_float_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %11 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %11
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %11
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %20 = OpConstantNull %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %25 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+        %int = OpTypeInt 32 1
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_3 = OpConstant %int 3
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+      %int_4 = OpConstant %int 4
+   %main_out = OpTypeStruct %v4float
+         %74 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function %20
+          %b = OpVariable %_ptr_Function_float Function %20
+       %x_51 = OpVariable %_ptr_Function_bool Function %25
+   %x_52_phi = OpVariable %_ptr_Function_bool Function %25
+         %31 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %32 = OpLoad %float %31
+         %34 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+         %35 = OpLoad %float %34
+         %36 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+         %37 = OpLoad %float %36
+         %38 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %39 = OpLoad %float %38
+         %41 = OpFOrdGreaterThan %bool %37 %39
+         %40 = OpSelect %float %41 %35 %32
+               OpStore %a %40
+         %42 = OpLoad %float %a
+         %45 = OpExtInst %float %44 Log %42
+         %43 = OpExtInst %float %44 Cos %45
+               OpStore %b %43
+         %46 = OpLoad %float %b
+         %47 = OpCompositeConstruct %v4float %46 %46 %46 %46
+               OpStore %x_GLF_color %47
+         %48 = OpLoad %float %b
+         %50 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %51 = OpLoad %float %50
+         %52 = OpFOrdGreaterThan %bool %48 %51
+               OpStore %x_52_phi %52
+               OpSelectionMerge %53 None
+               OpBranchConditional %52 %54 %53
+         %54 = OpLabel
+         %55 = OpLoad %float %b
+         %57 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %58 = OpLoad %float %57
+         %59 = OpFOrdLessThan %bool %55 %58
+               OpStore %x_51 %59
+         %60 = OpLoad %bool %x_51
+               OpStore %x_52_phi %60
+               OpBranch %53
+         %53 = OpLabel
+         %61 = OpLoad %bool %x_52_phi
+               OpSelectionMerge %62 None
+               OpBranchConditional %61 %63 %62
+         %63 = OpLabel
+         %64 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+         %65 = OpLoad %float %64
+         %67 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_4
+         %68 = OpLoad %float %67
+         %69 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_4
+         %70 = OpLoad %float %69
+         %71 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+         %72 = OpLoad %float %71
+         %73 = OpCompositeConstruct %v4float %65 %68 %70 %72
+               OpStore %x_GLF_color %73
+               OpBranch %62
+         %62 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %74
+%tint_symbol = OpFunctionParameter %main_out
+         %78 = OpLabel
+         %79 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %79
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %81 = OpLabel
+         %82 = OpFunctionCall %void %main_1
+         %84 = OpLoad %v4float %x_GLF_color
+         %85 = OpCompositeConstruct %main_out %84
+         %83 = OpFunctionCall %void %tint_symbol_2 %85
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-schedule-dag-rrlist-mix-log-cos/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-schedule-dag-rrlist-mix-log-cos/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..b6b2e8d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-schedule-dag-rrlist-mix-log-cos/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,56 @@
+type Arr = [[stride(16)]] array<f32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : f32;
+  var b : f32;
+  var x_51 : bool;
+  var x_52_phi : bool;
+  let x_28 : f32 = x_6.x_GLF_uniform_float_values[2];
+  let x_30 : f32 = x_6.x_GLF_uniform_float_values[3];
+  let x_32 : f32 = x_6.x_GLF_uniform_float_values[3];
+  let x_34 : f32 = x_6.x_GLF_uniform_float_values[2];
+  a = select(x_28, x_30, (x_32 > x_34));
+  let x_37 : f32 = a;
+  b = cos(log(x_37));
+  let x_40 : f32 = b;
+  x_GLF_color = vec4<f32>(x_40, x_40, x_40, x_40);
+  let x_42 : f32 = b;
+  let x_44 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_45 : bool = (x_42 > x_44);
+  x_52_phi = x_45;
+  if (x_45) {
+    let x_48 : f32 = b;
+    let x_50 : f32 = x_6.x_GLF_uniform_float_values[1];
+    x_51 = (x_48 < x_50);
+    x_52_phi = x_51;
+  }
+  let x_52 : bool = x_52_phi;
+  if (x_52) {
+    let x_56 : f32 = x_6.x_GLF_uniform_float_values[3];
+    let x_58 : f32 = x_6.x_GLF_uniform_float_values[4];
+    let x_60 : f32 = x_6.x_GLF_uniform_float_values[4];
+    let x_62 : f32 = x_6.x_GLF_uniform_float_values[3];
+    x_GLF_color = vec4<f32>(x_56, x_58, x_60, x_62);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-schedule-dag-rrlist-mix-log-cos/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-schedule-dag-rrlist-mix-log-cos/0-opt.wgsl
new file mode 100644
index 0000000..b6b2e8d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-schedule-dag-rrlist-mix-log-cos/0-opt.wgsl
@@ -0,0 +1,56 @@
+type Arr = [[stride(16)]] array<f32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : f32;
+  var b : f32;
+  var x_51 : bool;
+  var x_52_phi : bool;
+  let x_28 : f32 = x_6.x_GLF_uniform_float_values[2];
+  let x_30 : f32 = x_6.x_GLF_uniform_float_values[3];
+  let x_32 : f32 = x_6.x_GLF_uniform_float_values[3];
+  let x_34 : f32 = x_6.x_GLF_uniform_float_values[2];
+  a = select(x_28, x_30, (x_32 > x_34));
+  let x_37 : f32 = a;
+  b = cos(log(x_37));
+  let x_40 : f32 = b;
+  x_GLF_color = vec4<f32>(x_40, x_40, x_40, x_40);
+  let x_42 : f32 = b;
+  let x_44 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_45 : bool = (x_42 > x_44);
+  x_52_phi = x_45;
+  if (x_45) {
+    let x_48 : f32 = b;
+    let x_50 : f32 = x_6.x_GLF_uniform_float_values[1];
+    x_51 = (x_48 < x_50);
+    x_52_phi = x_51;
+  }
+  let x_52 : bool = x_52_phi;
+  if (x_52) {
+    let x_56 : f32 = x_6.x_GLF_uniform_float_values[3];
+    let x_58 : f32 = x_6.x_GLF_uniform_float_values[4];
+    let x_60 : f32 = x_6.x_GLF_uniform_float_values[4];
+    let x_62 : f32 = x_6.x_GLF_uniform_float_values[3];
+    x_GLF_color = vec4<f32>(x_56, x_58, x_60, x_62);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-schedule-dag-rrlist-mix-log-cos/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-schedule-dag-rrlist-mix-log-cos/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..7fa9952
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-schedule-dag-rrlist-mix-log-cos/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,52 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[5];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float a = 0.0f;
+  float b = 0.0f;
+  bool x_51 = false;
+  bool x_52_phi = false;
+  const float x_28 = asfloat(x_6[2].x);
+  const float x_30 = asfloat(x_6[3].x);
+  const float x_32 = asfloat(x_6[3].x);
+  const float x_34 = asfloat(x_6[2].x);
+  a = ((x_32 > x_34) ? x_30 : x_28);
+  b = cos(log(a));
+  const float x_40 = b;
+  x_GLF_color = float4(x_40, x_40, x_40, x_40);
+  const float x_42 = b;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_44 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const bool x_45 = (x_42 > x_44);
+  x_52_phi = x_45;
+  if (x_45) {
+    const float x_48 = b;
+    const float x_50 = asfloat(x_6[1].x);
+    x_51 = (x_48 < x_50);
+    x_52_phi = x_51;
+  }
+  if (x_52_phi) {
+    const float x_56 = asfloat(x_6[3].x);
+    const float x_58 = asfloat(x_6[4].x);
+    const float x_60 = asfloat(x_6[4].x);
+    const float x_62 = asfloat(x_6[3].x);
+    x_GLF_color = float4(x_56, x_58, x_60, x_62);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-schedule-dag-rrlist-mix-log-cos/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-schedule-dag-rrlist-mix-log-cos/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..b2905ce
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-schedule-dag-rrlist-mix-log-cos/0-opt.wgsl.expected.msl
@@ -0,0 +1,63 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[5];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float a = 0.0f;
+  float b = 0.0f;
+  bool x_51 = false;
+  bool x_52_phi = false;
+  float const x_28 = x_6.x_GLF_uniform_float_values.arr[2].el;
+  float const x_30 = x_6.x_GLF_uniform_float_values.arr[3].el;
+  float const x_32 = x_6.x_GLF_uniform_float_values.arr[3].el;
+  float const x_34 = x_6.x_GLF_uniform_float_values.arr[2].el;
+  a = select(x_28, x_30, (x_32 > x_34));
+  float const x_37 = a;
+  b = cos(log(x_37));
+  float const x_40 = b;
+  *(tint_symbol_4) = float4(x_40, x_40, x_40, x_40);
+  float const x_42 = b;
+  float const x_44 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  bool const x_45 = (x_42 > x_44);
+  x_52_phi = x_45;
+  if (x_45) {
+    float const x_48 = b;
+    float const x_50 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    x_51 = (x_48 < x_50);
+    x_52_phi = x_51;
+  }
+  bool const x_52 = x_52_phi;
+  if (x_52) {
+    float const x_56 = x_6.x_GLF_uniform_float_values.arr[3].el;
+    float const x_58 = x_6.x_GLF_uniform_float_values.arr[4].el;
+    float const x_60 = x_6.x_GLF_uniform_float_values.arr[4].el;
+    float const x_62 = x_6.x_GLF_uniform_float_values.arr[3].el;
+    *(tint_symbol_4) = float4(x_56, x_58, x_60, x_62);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-schedule-dag-rrlist-mix-log-cos/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-schedule-dag-rrlist-mix-log-cos/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..f34e73c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-schedule-dag-rrlist-mix-log-cos/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,137 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 86
+; Schema: 0
+               OpCapability Shader
+         %44 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %x_51 "x_51"
+               OpName %x_52_phi "x_52_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_5 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_float_uint_5 = OpTypeArray %float %uint_5
+       %buf0 = OpTypeStruct %_arr_float_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %11 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %11
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %11
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %20 = OpConstantNull %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %25 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+        %int = OpTypeInt 32 1
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_3 = OpConstant %int 3
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+      %int_4 = OpConstant %int 4
+   %main_out = OpTypeStruct %v4float
+         %74 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function %20
+          %b = OpVariable %_ptr_Function_float Function %20
+       %x_51 = OpVariable %_ptr_Function_bool Function %25
+   %x_52_phi = OpVariable %_ptr_Function_bool Function %25
+         %31 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %32 = OpLoad %float %31
+         %34 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+         %35 = OpLoad %float %34
+         %36 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+         %37 = OpLoad %float %36
+         %38 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %39 = OpLoad %float %38
+         %41 = OpFOrdGreaterThan %bool %37 %39
+         %40 = OpSelect %float %41 %35 %32
+               OpStore %a %40
+         %42 = OpLoad %float %a
+         %45 = OpExtInst %float %44 Log %42
+         %43 = OpExtInst %float %44 Cos %45
+               OpStore %b %43
+         %46 = OpLoad %float %b
+         %47 = OpCompositeConstruct %v4float %46 %46 %46 %46
+               OpStore %x_GLF_color %47
+         %48 = OpLoad %float %b
+         %50 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %51 = OpLoad %float %50
+         %52 = OpFOrdGreaterThan %bool %48 %51
+               OpStore %x_52_phi %52
+               OpSelectionMerge %53 None
+               OpBranchConditional %52 %54 %53
+         %54 = OpLabel
+         %55 = OpLoad %float %b
+         %57 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %58 = OpLoad %float %57
+         %59 = OpFOrdLessThan %bool %55 %58
+               OpStore %x_51 %59
+         %60 = OpLoad %bool %x_51
+               OpStore %x_52_phi %60
+               OpBranch %53
+         %53 = OpLabel
+         %61 = OpLoad %bool %x_52_phi
+               OpSelectionMerge %62 None
+               OpBranchConditional %61 %63 %62
+         %63 = OpLabel
+         %64 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+         %65 = OpLoad %float %64
+         %67 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_4
+         %68 = OpLoad %float %67
+         %69 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_4
+         %70 = OpLoad %float %69
+         %71 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+         %72 = OpLoad %float %71
+         %73 = OpCompositeConstruct %v4float %65 %68 %70 %72
+               OpStore %x_GLF_color %73
+               OpBranch %62
+         %62 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %74
+%tint_symbol = OpFunctionParameter %main_out
+         %78 = OpLabel
+         %79 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %79
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %81 = OpLabel
+         %82 = OpFunctionCall %void %main_1
+         %84 = OpLoad %v4float %x_GLF_color
+         %85 = OpCompositeConstruct %main_out %84
+         %83 = OpFunctionCall %void %tint_symbol_2 %85
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-schedule-dag-rrlist-mix-log-cos/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-schedule-dag-rrlist-mix-log-cos/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..b6b2e8d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-schedule-dag-rrlist-mix-log-cos/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,56 @@
+type Arr = [[stride(16)]] array<f32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : f32;
+  var b : f32;
+  var x_51 : bool;
+  var x_52_phi : bool;
+  let x_28 : f32 = x_6.x_GLF_uniform_float_values[2];
+  let x_30 : f32 = x_6.x_GLF_uniform_float_values[3];
+  let x_32 : f32 = x_6.x_GLF_uniform_float_values[3];
+  let x_34 : f32 = x_6.x_GLF_uniform_float_values[2];
+  a = select(x_28, x_30, (x_32 > x_34));
+  let x_37 : f32 = a;
+  b = cos(log(x_37));
+  let x_40 : f32 = b;
+  x_GLF_color = vec4<f32>(x_40, x_40, x_40, x_40);
+  let x_42 : f32 = b;
+  let x_44 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_45 : bool = (x_42 > x_44);
+  x_52_phi = x_45;
+  if (x_45) {
+    let x_48 : f32 = b;
+    let x_50 : f32 = x_6.x_GLF_uniform_float_values[1];
+    x_51 = (x_48 < x_50);
+    x_52_phi = x_51;
+  }
+  let x_52 : bool = x_52_phi;
+  if (x_52) {
+    let x_56 : f32 = x_6.x_GLF_uniform_float_values[3];
+    let x_58 : f32 = x_6.x_GLF_uniform_float_values[4];
+    let x_60 : f32 = x_6.x_GLF_uniform_float_values[4];
+    let x_62 : f32 = x_6.x_GLF_uniform_float_values[3];
+    x_GLF_color = vec4<f32>(x_56, x_58, x_60, x_62);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-assign-back-and-forth/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-assign-back-and-forth/0-opt.spvasm
new file mode 100644
index 0000000..fc29c37
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-assign-back-and-forth/0-opt.spvasm
@@ -0,0 +1,61 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %v "v"
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+    %float_0 = OpConstant %float 0
+         %22 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %9
+         %23 = OpLabel
+          %v = OpVariable %_ptr_Function_v4float Function
+         %24 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %25 = OpLoad %int %24
+         %26 = OpConvertSToF %float %25
+         %27 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %28 = OpLoad %int %27
+         %29 = OpConvertSToF %float %28
+         %30 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %31 = OpLoad %int %30
+         %32 = OpConvertSToF %float %31
+         %33 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %34 = OpLoad %int %33
+         %35 = OpConvertSToF %float %34
+         %36 = OpCompositeConstruct %v4float %26 %29 %32 %35
+               OpStore %_GLF_color %36
+         %37 = OpLoad %v4float %_GLF_color
+               OpStore %v %37
+               OpStore %_GLF_color %22
+         %38 = OpLoad %v4float %v
+               OpStore %_GLF_color %38
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-assign-back-and-forth/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-assign-back-and-forth/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..84a4567
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-assign-back-and-forth/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,33 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[2];
+};
+
+void main_1() {
+  float4 v = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_25 = asint(x_5[scalar_offset / 4][scalar_offset % 4]);
+  const int x_28 = asint(x_5[1].x);
+  const int x_31 = asint(x_5[1].x);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_34 = asint(x_5[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  x_GLF_color = float4(float(x_25), float(x_28), float(x_31), float(x_34));
+  v = x_GLF_color;
+  x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  x_GLF_color = v;
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-assign-back-and-forth/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-assign-back-and-forth/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..b5f5cc9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-assign-back-and-forth/0-opt.spvasm.expected.msl
@@ -0,0 +1,43 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  float4 v = 0.0f;
+  int const x_25 = x_5.x_GLF_uniform_int_values.arr[0].el;
+  int const x_28 = x_5.x_GLF_uniform_int_values.arr[1].el;
+  int const x_31 = x_5.x_GLF_uniform_int_values.arr[1].el;
+  int const x_34 = x_5.x_GLF_uniform_int_values.arr[0].el;
+  *(tint_symbol_4) = float4(float(x_25), float(x_28), float(x_31), float(x_34));
+  float4 const x_37 = *(tint_symbol_4);
+  v = x_37;
+  *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 const x_38 = v;
+  *(tint_symbol_4) = x_38;
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-assign-back-and-forth/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-assign-back-and-forth/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..47829d0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-assign-back-and-forth/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,93 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 54
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_5 "x_5"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v "v"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+         %40 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %42 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %v = OpVariable %_ptr_Function_v4float Function %5
+         %24 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %25 = OpLoad %int %24
+         %27 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %28 = OpLoad %int %27
+         %29 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %30 = OpLoad %int %29
+         %31 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %32 = OpLoad %int %31
+         %33 = OpConvertSToF %float %25
+         %34 = OpConvertSToF %float %28
+         %35 = OpConvertSToF %float %30
+         %36 = OpConvertSToF %float %32
+         %37 = OpCompositeConstruct %v4float %33 %34 %35 %36
+               OpStore %x_GLF_color %37
+         %38 = OpLoad %v4float %x_GLF_color
+               OpStore %v %38
+               OpStore %x_GLF_color %40
+         %41 = OpLoad %v4float %v
+               OpStore %x_GLF_color %41
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %42
+%tint_symbol = OpFunctionParameter %main_out
+         %46 = OpLabel
+         %47 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %47
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %49 = OpLabel
+         %50 = OpFunctionCall %void %main_1
+         %52 = OpLoad %v4float %x_GLF_color
+         %53 = OpCompositeConstruct %main_out %52
+         %51 = OpFunctionCall %void %tint_symbol_2 %53
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-assign-back-and-forth/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-assign-back-and-forth/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..501fd60
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-assign-back-and-forth/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,36 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+fn main_1() {
+  var v : vec4<f32>;
+  let x_25 : i32 = x_5.x_GLF_uniform_int_values[0];
+  let x_28 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_31 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_34 : i32 = x_5.x_GLF_uniform_int_values[0];
+  x_GLF_color = vec4<f32>(f32(x_25), f32(x_28), f32(x_31), f32(x_34));
+  let x_37 : vec4<f32> = x_GLF_color;
+  v = x_37;
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  let x_38 : vec4<f32> = v;
+  x_GLF_color = x_38;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-assign-back-and-forth/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-assign-back-and-forth/0-opt.wgsl
new file mode 100644
index 0000000..501fd60
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-assign-back-and-forth/0-opt.wgsl
@@ -0,0 +1,36 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+fn main_1() {
+  var v : vec4<f32>;
+  let x_25 : i32 = x_5.x_GLF_uniform_int_values[0];
+  let x_28 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_31 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_34 : i32 = x_5.x_GLF_uniform_int_values[0];
+  x_GLF_color = vec4<f32>(f32(x_25), f32(x_28), f32(x_31), f32(x_34));
+  let x_37 : vec4<f32> = x_GLF_color;
+  v = x_37;
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  let x_38 : vec4<f32> = v;
+  x_GLF_color = x_38;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-assign-back-and-forth/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-assign-back-and-forth/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..84a4567
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-assign-back-and-forth/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,33 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[2];
+};
+
+void main_1() {
+  float4 v = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_25 = asint(x_5[scalar_offset / 4][scalar_offset % 4]);
+  const int x_28 = asint(x_5[1].x);
+  const int x_31 = asint(x_5[1].x);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_34 = asint(x_5[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  x_GLF_color = float4(float(x_25), float(x_28), float(x_31), float(x_34));
+  v = x_GLF_color;
+  x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  x_GLF_color = v;
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-assign-back-and-forth/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-assign-back-and-forth/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..b5f5cc9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-assign-back-and-forth/0-opt.wgsl.expected.msl
@@ -0,0 +1,43 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  float4 v = 0.0f;
+  int const x_25 = x_5.x_GLF_uniform_int_values.arr[0].el;
+  int const x_28 = x_5.x_GLF_uniform_int_values.arr[1].el;
+  int const x_31 = x_5.x_GLF_uniform_int_values.arr[1].el;
+  int const x_34 = x_5.x_GLF_uniform_int_values.arr[0].el;
+  *(tint_symbol_4) = float4(float(x_25), float(x_28), float(x_31), float(x_34));
+  float4 const x_37 = *(tint_symbol_4);
+  v = x_37;
+  *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 const x_38 = v;
+  *(tint_symbol_4) = x_38;
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-assign-back-and-forth/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-assign-back-and-forth/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..47829d0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-assign-back-and-forth/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,93 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 54
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_5 "x_5"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v "v"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+         %40 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %42 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %v = OpVariable %_ptr_Function_v4float Function %5
+         %24 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %25 = OpLoad %int %24
+         %27 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %28 = OpLoad %int %27
+         %29 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %30 = OpLoad %int %29
+         %31 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %32 = OpLoad %int %31
+         %33 = OpConvertSToF %float %25
+         %34 = OpConvertSToF %float %28
+         %35 = OpConvertSToF %float %30
+         %36 = OpConvertSToF %float %32
+         %37 = OpCompositeConstruct %v4float %33 %34 %35 %36
+               OpStore %x_GLF_color %37
+         %38 = OpLoad %v4float %x_GLF_color
+               OpStore %v %38
+               OpStore %x_GLF_color %40
+         %41 = OpLoad %v4float %v
+               OpStore %x_GLF_color %41
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %42
+%tint_symbol = OpFunctionParameter %main_out
+         %46 = OpLabel
+         %47 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %47
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %49 = OpLabel
+         %50 = OpFunctionCall %void %main_1
+         %52 = OpLoad %v4float %x_GLF_color
+         %53 = OpCompositeConstruct %main_out %52
+         %51 = OpFunctionCall %void %tint_symbol_2 %53
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-assign-back-and-forth/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-assign-back-and-forth/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..501fd60
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-assign-back-and-forth/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,36 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+fn main_1() {
+  var v : vec4<f32>;
+  let x_25 : i32 = x_5.x_GLF_uniform_int_values[0];
+  let x_28 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_31 : i32 = x_5.x_GLF_uniform_int_values[1];
+  let x_34 : i32 = x_5.x_GLF_uniform_int_values[0];
+  x_GLF_color = vec4<f32>(f32(x_25), f32(x_28), f32(x_31), f32(x_34));
+  let x_37 : vec4<f32> = x_GLF_color;
+  v = x_37;
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  let x_38 : vec4<f32> = v;
+  x_GLF_color = x_38;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-inverse-clamp/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-inverse-clamp/0-opt.spvasm
new file mode 100644
index 0000000..b72cddb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-inverse-clamp/0-opt.spvasm
@@ -0,0 +1,103 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %c "c"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+      %int_1 = OpConstant %int 1
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %10
+         %25 = OpLabel
+          %c = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+         %26 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %27 = OpLoad %int %26
+               OpStore %c %27
+         %28 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %29 = OpLoad %int %28
+               OpStore %i %29
+               OpBranch %30
+         %30 = OpLabel
+               OpLoopMerge %31 %32 None
+               OpBranch %33
+         %33 = OpLabel
+         %34 = OpLoad %int %i
+         %35 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %36 = OpLoad %int %35
+         %37 = OpSLessThan %bool %34 %36
+               OpBranchConditional %37 %38 %31
+         %38 = OpLabel
+         %39 = OpLoad %int %i
+         %40 = OpNot %int %39
+               OpStore %c %40
+         %41 = OpLoad %int %c
+         %42 = OpExtInst %int %1 SClamp %41 %int_0 %int_3
+               OpStore %c %42
+               OpBranch %32
+         %32 = OpLabel
+         %43 = OpLoad %int %i
+         %44 = OpIAdd %int %43 %int_1
+               OpStore %i %44
+               OpBranch %30
+         %31 = OpLabel
+         %45 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %46 = OpLoad %int %45
+         %47 = OpConvertSToF %float %46
+         %48 = OpCompositeConstruct %v4float %47 %47 %47 %47
+               OpStore %_GLF_color %48
+         %49 = OpLoad %int %c
+         %50 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %51 = OpLoad %int %50
+         %52 = OpIEqual %bool %49 %51
+               OpSelectionMerge %53 None
+               OpBranchConditional %52 %54 %53
+         %54 = OpLabel
+         %55 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %56 = OpLoad %int %55
+         %57 = OpConvertSToF %float %56
+         %58 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %59 = OpLoad %int %58
+         %60 = OpConvertSToF %float %59
+         %61 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %62 = OpLoad %int %61
+         %63 = OpConvertSToF %float %62
+         %64 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %65 = OpLoad %int %64
+         %66 = OpConvertSToF %float %65
+         %67 = OpCompositeConstruct %v4float %57 %60 %63 %66
+               OpStore %_GLF_color %67
+               OpBranch %53
+         %53 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-inverse-clamp/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-inverse-clamp/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..3011a24
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-inverse-clamp/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,54 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int c = 0;
+  int i = 0;
+  const int x_27 = asint(x_6[2].x);
+  c = x_27;
+  const int x_29 = asint(x_6[2].x);
+  i = x_29;
+  while (true) {
+    const int x_34 = i;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_36 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_34 < x_36)) {
+    } else {
+      break;
+    }
+    c = ~(i);
+    c = clamp(c, 0, 3);
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_46 = asint(x_6[1].x);
+  const float x_47 = float(x_46);
+  x_GLF_color = float4(x_47, x_47, x_47, x_47);
+  const int x_49 = c;
+  const int x_51 = asint(x_6[1].x);
+  if ((x_49 == x_51)) {
+    const int x_56 = asint(x_6[2].x);
+    const int x_59 = asint(x_6[1].x);
+    const int x_62 = asint(x_6[1].x);
+    const int x_65 = asint(x_6[2].x);
+    x_GLF_color = float4(float(x_56), float(x_59), float(x_62), float(x_65));
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-inverse-clamp/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-inverse-clamp/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..99d436c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-inverse-clamp/0-opt.spvasm.expected.msl
@@ -0,0 +1,66 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int c = 0;
+  int i = 0;
+  int const x_27 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  c = x_27;
+  int const x_29 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  i = x_29;
+  while (true) {
+    int const x_34 = i;
+    int const x_36 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_34 < x_36)) {
+    } else {
+      break;
+    }
+    int const x_39 = i;
+    c = ~(x_39);
+    int const x_41 = c;
+    c = clamp(x_41, 0, 3);
+    {
+      int const x_43 = i;
+      i = (x_43 + 1);
+    }
+  }
+  int const x_46 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  float const x_47 = float(x_46);
+  *(tint_symbol_4) = float4(x_47, x_47, x_47, x_47);
+  int const x_49 = c;
+  int const x_51 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_49 == x_51)) {
+    int const x_56 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_59 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_62 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_65 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    *(tint_symbol_4) = float4(float(x_56), float(x_59), float(x_62), float(x_65));
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-inverse-clamp/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-inverse-clamp/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..a8d0f90
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-inverse-clamp/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,142 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 87
+; Schema: 0
+               OpCapability Shader
+         %47 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %c "c"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %75 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %c = OpVariable %_ptr_Function_int Function %21
+          %i = OpVariable %_ptr_Function_int Function %21
+         %26 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %27 = OpLoad %int %26
+               OpStore %c %27
+         %28 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %29 = OpLoad %int %28
+               OpStore %i %29
+               OpBranch %30
+         %30 = OpLabel
+               OpLoopMerge %31 %32 None
+               OpBranch %33
+         %33 = OpLabel
+         %34 = OpLoad %int %i
+         %36 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %37 = OpLoad %int %36
+         %38 = OpSLessThan %bool %34 %37
+               OpSelectionMerge %40 None
+               OpBranchConditional %38 %41 %42
+         %41 = OpLabel
+               OpBranch %40
+         %42 = OpLabel
+               OpBranch %31
+         %40 = OpLabel
+         %43 = OpLoad %int %i
+         %44 = OpNot %int %43
+               OpStore %c %44
+         %45 = OpLoad %int %c
+         %46 = OpExtInst %int %47 SClamp %45 %int_0 %int_3
+               OpStore %c %46
+               OpBranch %32
+         %32 = OpLabel
+         %49 = OpLoad %int %i
+         %51 = OpIAdd %int %49 %int_1
+               OpStore %i %51
+               OpBranch %30
+         %31 = OpLabel
+         %52 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %53 = OpLoad %int %52
+         %54 = OpConvertSToF %float %53
+         %55 = OpCompositeConstruct %v4float %54 %54 %54 %54
+               OpStore %x_GLF_color %55
+         %56 = OpLoad %int %c
+         %57 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %58 = OpLoad %int %57
+         %59 = OpIEqual %bool %56 %58
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %60
+         %61 = OpLabel
+         %62 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %63 = OpLoad %int %62
+         %64 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %65 = OpLoad %int %64
+         %66 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %67 = OpLoad %int %66
+         %68 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %69 = OpLoad %int %68
+         %70 = OpConvertSToF %float %63
+         %71 = OpConvertSToF %float %65
+         %72 = OpConvertSToF %float %67
+         %73 = OpConvertSToF %float %69
+         %74 = OpCompositeConstruct %v4float %70 %71 %72 %73
+               OpStore %x_GLF_color %74
+               OpBranch %60
+         %60 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %75
+%tint_symbol = OpFunctionParameter %main_out
+         %79 = OpLabel
+         %80 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %80
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %82 = OpLabel
+         %83 = OpFunctionCall %void %main_1
+         %85 = OpLoad %v4float %x_GLF_color
+         %86 = OpCompositeConstruct %main_out %85
+         %84 = OpFunctionCall %void %tint_symbol_2 %86
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-inverse-clamp/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-inverse-clamp/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..97a2a50
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-inverse-clamp/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,60 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var c : i32;
+  var i : i32;
+  let x_27 : i32 = x_6.x_GLF_uniform_int_values[2];
+  c = x_27;
+  let x_29 : i32 = x_6.x_GLF_uniform_int_values[2];
+  i = x_29;
+  loop {
+    let x_34 : i32 = i;
+    let x_36 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_34 < x_36)) {
+    } else {
+      break;
+    }
+    let x_39 : i32 = i;
+    c = ~(x_39);
+    let x_41 : i32 = c;
+    c = clamp(x_41, 0, 3);
+
+    continuing {
+      let x_43 : i32 = i;
+      i = (x_43 + 1);
+    }
+  }
+  let x_46 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_47 : f32 = f32(x_46);
+  x_GLF_color = vec4<f32>(x_47, x_47, x_47, x_47);
+  let x_49 : i32 = c;
+  let x_51 : i32 = x_6.x_GLF_uniform_int_values[1];
+  if ((x_49 == x_51)) {
+    let x_56 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_59 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_62 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_65 : i32 = x_6.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_56), f32(x_59), f32(x_62), f32(x_65));
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-inverse-clamp/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-inverse-clamp/0-opt.wgsl
new file mode 100644
index 0000000..97a2a50
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-inverse-clamp/0-opt.wgsl
@@ -0,0 +1,60 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var c : i32;
+  var i : i32;
+  let x_27 : i32 = x_6.x_GLF_uniform_int_values[2];
+  c = x_27;
+  let x_29 : i32 = x_6.x_GLF_uniform_int_values[2];
+  i = x_29;
+  loop {
+    let x_34 : i32 = i;
+    let x_36 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_34 < x_36)) {
+    } else {
+      break;
+    }
+    let x_39 : i32 = i;
+    c = ~(x_39);
+    let x_41 : i32 = c;
+    c = clamp(x_41, 0, 3);
+
+    continuing {
+      let x_43 : i32 = i;
+      i = (x_43 + 1);
+    }
+  }
+  let x_46 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_47 : f32 = f32(x_46);
+  x_GLF_color = vec4<f32>(x_47, x_47, x_47, x_47);
+  let x_49 : i32 = c;
+  let x_51 : i32 = x_6.x_GLF_uniform_int_values[1];
+  if ((x_49 == x_51)) {
+    let x_56 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_59 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_62 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_65 : i32 = x_6.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_56), f32(x_59), f32(x_62), f32(x_65));
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-inverse-clamp/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-inverse-clamp/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..3011a24
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-inverse-clamp/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,54 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int c = 0;
+  int i = 0;
+  const int x_27 = asint(x_6[2].x);
+  c = x_27;
+  const int x_29 = asint(x_6[2].x);
+  i = x_29;
+  while (true) {
+    const int x_34 = i;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_36 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_34 < x_36)) {
+    } else {
+      break;
+    }
+    c = ~(i);
+    c = clamp(c, 0, 3);
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_46 = asint(x_6[1].x);
+  const float x_47 = float(x_46);
+  x_GLF_color = float4(x_47, x_47, x_47, x_47);
+  const int x_49 = c;
+  const int x_51 = asint(x_6[1].x);
+  if ((x_49 == x_51)) {
+    const int x_56 = asint(x_6[2].x);
+    const int x_59 = asint(x_6[1].x);
+    const int x_62 = asint(x_6[1].x);
+    const int x_65 = asint(x_6[2].x);
+    x_GLF_color = float4(float(x_56), float(x_59), float(x_62), float(x_65));
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-inverse-clamp/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-inverse-clamp/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..99d436c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-inverse-clamp/0-opt.wgsl.expected.msl
@@ -0,0 +1,66 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int c = 0;
+  int i = 0;
+  int const x_27 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  c = x_27;
+  int const x_29 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  i = x_29;
+  while (true) {
+    int const x_34 = i;
+    int const x_36 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_34 < x_36)) {
+    } else {
+      break;
+    }
+    int const x_39 = i;
+    c = ~(x_39);
+    int const x_41 = c;
+    c = clamp(x_41, 0, 3);
+    {
+      int const x_43 = i;
+      i = (x_43 + 1);
+    }
+  }
+  int const x_46 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  float const x_47 = float(x_46);
+  *(tint_symbol_4) = float4(x_47, x_47, x_47, x_47);
+  int const x_49 = c;
+  int const x_51 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_49 == x_51)) {
+    int const x_56 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_59 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_62 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_65 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    *(tint_symbol_4) = float4(float(x_56), float(x_59), float(x_62), float(x_65));
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-inverse-clamp/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-inverse-clamp/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..a8d0f90
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-inverse-clamp/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,142 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 87
+; Schema: 0
+               OpCapability Shader
+         %47 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %c "c"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %75 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %c = OpVariable %_ptr_Function_int Function %21
+          %i = OpVariable %_ptr_Function_int Function %21
+         %26 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %27 = OpLoad %int %26
+               OpStore %c %27
+         %28 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %29 = OpLoad %int %28
+               OpStore %i %29
+               OpBranch %30
+         %30 = OpLabel
+               OpLoopMerge %31 %32 None
+               OpBranch %33
+         %33 = OpLabel
+         %34 = OpLoad %int %i
+         %36 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %37 = OpLoad %int %36
+         %38 = OpSLessThan %bool %34 %37
+               OpSelectionMerge %40 None
+               OpBranchConditional %38 %41 %42
+         %41 = OpLabel
+               OpBranch %40
+         %42 = OpLabel
+               OpBranch %31
+         %40 = OpLabel
+         %43 = OpLoad %int %i
+         %44 = OpNot %int %43
+               OpStore %c %44
+         %45 = OpLoad %int %c
+         %46 = OpExtInst %int %47 SClamp %45 %int_0 %int_3
+               OpStore %c %46
+               OpBranch %32
+         %32 = OpLabel
+         %49 = OpLoad %int %i
+         %51 = OpIAdd %int %49 %int_1
+               OpStore %i %51
+               OpBranch %30
+         %31 = OpLabel
+         %52 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %53 = OpLoad %int %52
+         %54 = OpConvertSToF %float %53
+         %55 = OpCompositeConstruct %v4float %54 %54 %54 %54
+               OpStore %x_GLF_color %55
+         %56 = OpLoad %int %c
+         %57 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %58 = OpLoad %int %57
+         %59 = OpIEqual %bool %56 %58
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %60
+         %61 = OpLabel
+         %62 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %63 = OpLoad %int %62
+         %64 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %65 = OpLoad %int %64
+         %66 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %67 = OpLoad %int %66
+         %68 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %69 = OpLoad %int %68
+         %70 = OpConvertSToF %float %63
+         %71 = OpConvertSToF %float %65
+         %72 = OpConvertSToF %float %67
+         %73 = OpConvertSToF %float %69
+         %74 = OpCompositeConstruct %v4float %70 %71 %72 %73
+               OpStore %x_GLF_color %74
+               OpBranch %60
+         %60 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %75
+%tint_symbol = OpFunctionParameter %main_out
+         %79 = OpLabel
+         %80 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %80
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %82 = OpLabel
+         %83 = OpFunctionCall %void %main_1
+         %85 = OpLoad %v4float %x_GLF_color
+         %86 = OpCompositeConstruct %main_out %85
+         %84 = OpFunctionCall %void %tint_symbol_2 %86
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-inverse-clamp/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-inverse-clamp/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..97a2a50
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-inverse-clamp/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,60 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var c : i32;
+  var i : i32;
+  let x_27 : i32 = x_6.x_GLF_uniform_int_values[2];
+  c = x_27;
+  let x_29 : i32 = x_6.x_GLF_uniform_int_values[2];
+  i = x_29;
+  loop {
+    let x_34 : i32 = i;
+    let x_36 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_34 < x_36)) {
+    } else {
+      break;
+    }
+    let x_39 : i32 = i;
+    c = ~(x_39);
+    let x_41 : i32 = c;
+    c = clamp(x_41, 0, 3);
+
+    continuing {
+      let x_43 : i32 = i;
+      i = (x_43 + 1);
+    }
+  }
+  let x_46 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_47 : f32 = f32(x_46);
+  x_GLF_color = vec4<f32>(x_47, x_47, x_47, x_47);
+  let x_49 : i32 = c;
+  let x_51 : i32 = x_6.x_GLF_uniform_int_values[1];
+  if ((x_49 == x_51)) {
+    let x_56 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_59 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_62 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_65 : i32 = x_6.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_56), f32(x_59), f32(x_62), f32(x_65));
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-lt-gt/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-lt-gt/0-opt.spvasm
new file mode 100644
index 0000000..b43e23f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-lt-gt/0-opt.spvasm
@@ -0,0 +1,98 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "v1"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %main = OpFunction %void None %10
+         %27 = OpLabel
+         %28 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %29 = OpLoad %float %28
+         %30 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %31 = OpLoad %float %30
+         %32 = OpFOrdLessThan %bool %29 %31
+               OpSelectionMerge %33 None
+               OpBranchConditional %32 %34 %35
+         %34 = OpLabel
+         %36 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %37 = OpLoad %int %36
+         %38 = OpConvertSToF %float %37
+         %39 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %40 = OpLoad %int %39
+         %41 = OpConvertSToF %float %40
+         %42 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %43 = OpLoad %int %42
+         %44 = OpConvertSToF %float %43
+         %45 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %46 = OpLoad %int %45
+         %47 = OpConvertSToF %float %46
+         %48 = OpCompositeConstruct %v4float %38 %41 %44 %47
+               OpStore %_GLF_color %48
+         %49 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %50 = OpLoad %float %49
+         %51 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %52 = OpLoad %float %51
+         %53 = OpFOrdGreaterThan %bool %50 %52
+               OpSelectionMerge %54 None
+               OpBranchConditional %53 %55 %54
+         %55 = OpLabel
+         %56 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %57 = OpLoad %int %56
+         %58 = OpConvertSToF %float %57
+         %59 = OpCompositeConstruct %v4float %58 %58 %58 %58
+               OpStore %_GLF_color %59
+               OpBranch %54
+         %54 = OpLabel
+               OpReturn
+         %35 = OpLabel
+         %60 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %61 = OpLoad %int %60
+         %62 = OpConvertSToF %float %61
+         %63 = OpCompositeConstruct %v4float %62 %62 %62 %62
+               OpStore %_GLF_color %63
+               OpBranch %33
+         %33 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-lt-gt/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-lt-gt/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..3739a71
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-lt-gt/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,49 @@
+cbuffer cbuffer_x_5 : register(b1, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[2];
+};
+
+void main_1() {
+  const float x_29 = asfloat(x_5[0].x);
+  const float x_31 = asfloat(x_5[0].y);
+  if ((x_29 < x_31)) {
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_37 = asint(x_7[scalar_offset / 4][scalar_offset % 4]);
+    const int x_40 = asint(x_7[1].x);
+    const int x_43 = asint(x_7[1].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_46 = asint(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    x_GLF_color = float4(float(x_37), float(x_40), float(x_43), float(x_46));
+    const float x_50 = asfloat(x_5[0].x);
+    const float x_52 = asfloat(x_5[0].y);
+    if ((x_50 > x_52)) {
+      const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+      const int x_57 = asint(x_7[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+      const float x_58 = float(x_57);
+      x_GLF_color = float4(x_58, x_58, x_58, x_58);
+    }
+    return;
+  } else {
+    const int x_61 = asint(x_7[1].x);
+    const float x_62 = float(x_61);
+    x_GLF_color = float4(x_62, x_62, x_62, x_62);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-lt-gt/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-lt-gt/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..762e4db
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-lt-gt/0-opt.spvasm.expected.msl
@@ -0,0 +1,56 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf1 {
+  /* 0x0000 */ packed_float2 v1;
+};
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_5, constant buf0& x_7, thread float4* const tint_symbol_4) {
+  float const x_29 = x_5.v1.x;
+  float const x_31 = x_5.v1.y;
+  if ((x_29 < x_31)) {
+    int const x_37 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_40 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    int const x_43 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    int const x_46 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_37), float(x_40), float(x_43), float(x_46));
+    float const x_50 = x_5.v1.x;
+    float const x_52 = x_5.v1.y;
+    if ((x_50 > x_52)) {
+      int const x_57 = x_7.x_GLF_uniform_int_values.arr[0].el;
+      float const x_58 = float(x_57);
+      *(tint_symbol_4) = float4(x_58, x_58, x_58, x_58);
+    }
+    return;
+  } else {
+    int const x_61 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    float const x_62 = float(x_61);
+    *(tint_symbol_4) = float4(x_62, x_62, x_62, x_62);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_5 [[buffer(1)]], constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-lt-gt/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-lt-gt/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..77d773f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-lt-gt/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,130 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 78
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "v1"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_5 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %66 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+         %25 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %uint_0
+         %26 = OpLoad %float %25
+         %28 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %uint_1
+         %29 = OpLoad %float %28
+         %30 = OpFOrdLessThan %bool %26 %29
+               OpSelectionMerge %32 None
+               OpBranchConditional %30 %33 %34
+         %33 = OpLabel
+         %37 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %38 = OpLoad %int %37
+         %40 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %41 = OpLoad %int %40
+         %42 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %43 = OpLoad %int %42
+         %44 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %45 = OpLoad %int %44
+         %46 = OpConvertSToF %float %38
+         %47 = OpConvertSToF %float %41
+         %48 = OpConvertSToF %float %43
+         %49 = OpConvertSToF %float %45
+         %50 = OpCompositeConstruct %v4float %46 %47 %48 %49
+               OpStore %x_GLF_color %50
+         %51 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %uint_0
+         %52 = OpLoad %float %51
+         %53 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %uint_1
+         %54 = OpLoad %float %53
+         %55 = OpFOrdGreaterThan %bool %52 %54
+               OpSelectionMerge %56 None
+               OpBranchConditional %55 %57 %56
+         %57 = OpLabel
+         %58 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %59 = OpLoad %int %58
+         %60 = OpConvertSToF %float %59
+         %61 = OpCompositeConstruct %v4float %60 %60 %60 %60
+               OpStore %x_GLF_color %61
+               OpBranch %56
+         %56 = OpLabel
+               OpReturn
+         %34 = OpLabel
+         %62 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %63 = OpLoad %int %62
+         %64 = OpConvertSToF %float %63
+         %65 = OpCompositeConstruct %v4float %64 %64 %64 %64
+               OpStore %x_GLF_color %65
+               OpBranch %32
+         %32 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %66
+%tint_symbol = OpFunctionParameter %main_out
+         %70 = OpLabel
+         %71 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %71
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+         %73 = OpLabel
+         %74 = OpFunctionCall %void %main_1
+         %76 = OpLoad %v4float %x_GLF_color
+         %77 = OpCompositeConstruct %main_out %76
+         %75 = OpFunctionCall %void %tint_symbol_2 %77
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-lt-gt/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-lt-gt/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..61503b5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-lt-gt/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,53 @@
+[[block]]
+struct buf1 {
+  v1 : vec2<f32>;
+};
+
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(1)]] var<uniform> x_5 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+fn main_1() {
+  let x_29 : f32 = x_5.v1.x;
+  let x_31 : f32 = x_5.v1.y;
+  if ((x_29 < x_31)) {
+    let x_37 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_40 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_43 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_46 : i32 = x_7.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_37), f32(x_40), f32(x_43), f32(x_46));
+    let x_50 : f32 = x_5.v1.x;
+    let x_52 : f32 = x_5.v1.y;
+    if ((x_50 > x_52)) {
+      let x_57 : i32 = x_7.x_GLF_uniform_int_values[0];
+      let x_58 : f32 = f32(x_57);
+      x_GLF_color = vec4<f32>(x_58, x_58, x_58, x_58);
+    }
+    return;
+  } else {
+    let x_61 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_62 : f32 = f32(x_61);
+    x_GLF_color = vec4<f32>(x_62, x_62, x_62, x_62);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-lt-gt/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-lt-gt/0-opt.wgsl
new file mode 100644
index 0000000..61503b5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-lt-gt/0-opt.wgsl
@@ -0,0 +1,53 @@
+[[block]]
+struct buf1 {
+  v1 : vec2<f32>;
+};
+
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(1)]] var<uniform> x_5 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+fn main_1() {
+  let x_29 : f32 = x_5.v1.x;
+  let x_31 : f32 = x_5.v1.y;
+  if ((x_29 < x_31)) {
+    let x_37 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_40 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_43 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_46 : i32 = x_7.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_37), f32(x_40), f32(x_43), f32(x_46));
+    let x_50 : f32 = x_5.v1.x;
+    let x_52 : f32 = x_5.v1.y;
+    if ((x_50 > x_52)) {
+      let x_57 : i32 = x_7.x_GLF_uniform_int_values[0];
+      let x_58 : f32 = f32(x_57);
+      x_GLF_color = vec4<f32>(x_58, x_58, x_58, x_58);
+    }
+    return;
+  } else {
+    let x_61 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_62 : f32 = f32(x_61);
+    x_GLF_color = vec4<f32>(x_62, x_62, x_62, x_62);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-lt-gt/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-lt-gt/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..3739a71
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-lt-gt/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,49 @@
+cbuffer cbuffer_x_5 : register(b1, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[2];
+};
+
+void main_1() {
+  const float x_29 = asfloat(x_5[0].x);
+  const float x_31 = asfloat(x_5[0].y);
+  if ((x_29 < x_31)) {
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_37 = asint(x_7[scalar_offset / 4][scalar_offset % 4]);
+    const int x_40 = asint(x_7[1].x);
+    const int x_43 = asint(x_7[1].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_46 = asint(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    x_GLF_color = float4(float(x_37), float(x_40), float(x_43), float(x_46));
+    const float x_50 = asfloat(x_5[0].x);
+    const float x_52 = asfloat(x_5[0].y);
+    if ((x_50 > x_52)) {
+      const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+      const int x_57 = asint(x_7[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+      const float x_58 = float(x_57);
+      x_GLF_color = float4(x_58, x_58, x_58, x_58);
+    }
+    return;
+  } else {
+    const int x_61 = asint(x_7[1].x);
+    const float x_62 = float(x_61);
+    x_GLF_color = float4(x_62, x_62, x_62, x_62);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-lt-gt/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-lt-gt/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..762e4db
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-lt-gt/0-opt.wgsl.expected.msl
@@ -0,0 +1,56 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf1 {
+  /* 0x0000 */ packed_float2 v1;
+};
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_5, constant buf0& x_7, thread float4* const tint_symbol_4) {
+  float const x_29 = x_5.v1.x;
+  float const x_31 = x_5.v1.y;
+  if ((x_29 < x_31)) {
+    int const x_37 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_40 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    int const x_43 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    int const x_46 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_37), float(x_40), float(x_43), float(x_46));
+    float const x_50 = x_5.v1.x;
+    float const x_52 = x_5.v1.y;
+    if ((x_50 > x_52)) {
+      int const x_57 = x_7.x_GLF_uniform_int_values.arr[0].el;
+      float const x_58 = float(x_57);
+      *(tint_symbol_4) = float4(x_58, x_58, x_58, x_58);
+    }
+    return;
+  } else {
+    int const x_61 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    float const x_62 = float(x_61);
+    *(tint_symbol_4) = float4(x_62, x_62, x_62, x_62);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_5 [[buffer(1)]], constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-lt-gt/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-lt-gt/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..77d773f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-lt-gt/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,130 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 78
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "v1"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_5 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %66 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+         %25 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %uint_0
+         %26 = OpLoad %float %25
+         %28 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %uint_1
+         %29 = OpLoad %float %28
+         %30 = OpFOrdLessThan %bool %26 %29
+               OpSelectionMerge %32 None
+               OpBranchConditional %30 %33 %34
+         %33 = OpLabel
+         %37 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %38 = OpLoad %int %37
+         %40 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %41 = OpLoad %int %40
+         %42 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %43 = OpLoad %int %42
+         %44 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %45 = OpLoad %int %44
+         %46 = OpConvertSToF %float %38
+         %47 = OpConvertSToF %float %41
+         %48 = OpConvertSToF %float %43
+         %49 = OpConvertSToF %float %45
+         %50 = OpCompositeConstruct %v4float %46 %47 %48 %49
+               OpStore %x_GLF_color %50
+         %51 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %uint_0
+         %52 = OpLoad %float %51
+         %53 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %uint_1
+         %54 = OpLoad %float %53
+         %55 = OpFOrdGreaterThan %bool %52 %54
+               OpSelectionMerge %56 None
+               OpBranchConditional %55 %57 %56
+         %57 = OpLabel
+         %58 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %59 = OpLoad %int %58
+         %60 = OpConvertSToF %float %59
+         %61 = OpCompositeConstruct %v4float %60 %60 %60 %60
+               OpStore %x_GLF_color %61
+               OpBranch %56
+         %56 = OpLabel
+               OpReturn
+         %34 = OpLabel
+         %62 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %63 = OpLoad %int %62
+         %64 = OpConvertSToF %float %63
+         %65 = OpCompositeConstruct %v4float %64 %64 %64 %64
+               OpStore %x_GLF_color %65
+               OpBranch %32
+         %32 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %66
+%tint_symbol = OpFunctionParameter %main_out
+         %70 = OpLabel
+         %71 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %71
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+         %73 = OpLabel
+         %74 = OpFunctionCall %void %main_1
+         %76 = OpLoad %v4float %x_GLF_color
+         %77 = OpCompositeConstruct %main_out %76
+         %75 = OpFunctionCall %void %tint_symbol_2 %77
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-lt-gt/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-lt-gt/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..61503b5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-lt-gt/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,53 @@
+[[block]]
+struct buf1 {
+  v1 : vec2<f32>;
+};
+
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(1)]] var<uniform> x_5 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+fn main_1() {
+  let x_29 : f32 = x_5.v1.x;
+  let x_31 : f32 = x_5.v1.y;
+  if ((x_29 < x_31)) {
+    let x_37 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_40 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_43 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_46 : i32 = x_7.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_37), f32(x_40), f32(x_43), f32(x_46));
+    let x_50 : f32 = x_5.v1.x;
+    let x_52 : f32 = x_5.v1.y;
+    if ((x_50 > x_52)) {
+      let x_57 : i32 = x_7.x_GLF_uniform_int_values[0];
+      let x_58 : f32 = f32(x_57);
+      x_GLF_color = vec4<f32>(x_58, x_58, x_58, x_58);
+    }
+    return;
+  } else {
+    let x_61 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_62 : f32 = f32(x_61);
+    x_GLF_color = vec4<f32>(x_62, x_62, x_62, x_62);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-same-cond-twice/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-same-cond-twice/0-opt.spvasm
new file mode 100644
index 0000000..9586039
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-same-cond-twice/0-opt.spvasm
@@ -0,0 +1,60 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %_ ""
+               OpDecorate %_GLF_color Location 0
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %12 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %bool = OpTypeBool
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+         %19 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+         %20 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %7
+         %21 = OpLabel
+               OpStore %_GLF_color %12
+         %22 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %23 = OpLoad %float %22
+         %24 = OpFOrdLessThan %bool %23 %float_0
+               OpSelectionMerge %25 None
+               OpBranchConditional %24 %26 %25
+         %26 = OpLabel
+         %27 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %28 = OpLoad %float %27
+         %29 = OpFOrdLessThan %bool %28 %float_0
+               OpBranch %25
+         %25 = OpLabel
+         %30 = OpPhi %bool %24 %21 %29 %26
+               OpSelectionMerge %31 None
+               OpBranchConditional %30 %32 %33
+         %32 = OpLabel
+               OpStore %_GLF_color %19
+               OpBranch %31
+         %33 = OpLabel
+               OpStore %_GLF_color %20
+               OpBranch %31
+         %31 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-same-cond-twice/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-same-cond-twice/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..4208963
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-same-cond-twice/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,38 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+
+void main_1() {
+  bool x_29 = false;
+  bool x_30_phi = false;
+  x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  const float x_23 = asfloat(x_5[0].x);
+  const bool x_24 = (x_23 < 0.0f);
+  x_30_phi = x_24;
+  if (x_24) {
+    const float x_28 = asfloat(x_5[0].x);
+    x_29 = (x_28 < 0.0f);
+    x_30_phi = x_29;
+  }
+  if (x_30_phi) {
+    x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  } else {
+    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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-same-cond-twice/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-same-cond-twice/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..747b267
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-same-cond-twice/0-opt.spvasm.expected.msl
@@ -0,0 +1,42 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  bool x_29 = false;
+  bool x_30_phi = false;
+  *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float const x_23 = x_5.one;
+  bool const x_24 = (x_23 < 0.0f);
+  x_30_phi = x_24;
+  if (x_24) {
+    float const x_28 = x_5.one;
+    x_29 = (x_28 < 0.0f);
+    x_30_phi = x_29;
+  }
+  bool const x_30 = x_30_phi;
+  if (x_30) {
+    *(tint_symbol_4) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-same-cond-twice/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-same-cond-twice/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..7708f0f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-same-cond-twice/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,101 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 53
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_5 "x_5"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_29 "x_29"
+               OpName %x_30_phi "x_30_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %18 = OpConstantNull %bool
+    %float_0 = OpConstant %float 0
+         %21 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+         %39 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+         %40 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %41 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+       %x_29 = OpVariable %_ptr_Function_bool Function %18
+   %x_30_phi = OpVariable %_ptr_Function_bool Function %18
+               OpStore %x_GLF_color %21
+         %25 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0
+         %26 = OpLoad %float %25
+         %27 = OpFOrdLessThan %bool %26 %float_0
+               OpStore %x_30_phi %27
+               OpSelectionMerge %28 None
+               OpBranchConditional %27 %29 %28
+         %29 = OpLabel
+         %30 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0
+         %31 = OpLoad %float %30
+         %32 = OpFOrdLessThan %bool %31 %float_0
+               OpStore %x_29 %32
+         %33 = OpLoad %bool %x_29
+               OpStore %x_30_phi %33
+               OpBranch %28
+         %28 = OpLabel
+         %34 = OpLoad %bool %x_30_phi
+               OpSelectionMerge %35 None
+               OpBranchConditional %34 %36 %37
+         %36 = OpLabel
+               OpStore %x_GLF_color %39
+               OpBranch %35
+         %37 = OpLabel
+               OpStore %x_GLF_color %40
+               OpBranch %35
+         %35 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %41
+%tint_symbol = OpFunctionParameter %main_out
+         %45 = OpLabel
+         %46 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %46
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %48 = OpLabel
+         %49 = OpFunctionCall %void %main_1
+         %51 = OpLoad %v4float %x_GLF_color
+         %52 = OpCompositeConstruct %main_out %51
+         %50 = OpFunctionCall %void %tint_symbol_2 %52
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-same-cond-twice/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-same-cond-twice/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..cc257f4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-same-cond-twice/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,40 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+fn main_1() {
+  var x_29 : bool;
+  var x_30_phi : bool;
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  let x_23 : f32 = x_5.one;
+  let x_24 : bool = (x_23 < 0.0);
+  x_30_phi = x_24;
+  if (x_24) {
+    let x_28 : f32 = x_5.one;
+    x_29 = (x_28 < 0.0);
+    x_30_phi = x_29;
+  }
+  let x_30 : bool = x_30_phi;
+  if (x_30) {
+    x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-same-cond-twice/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-same-cond-twice/0-opt.wgsl
new file mode 100644
index 0000000..cc257f4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-same-cond-twice/0-opt.wgsl
@@ -0,0 +1,40 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+fn main_1() {
+  var x_29 : bool;
+  var x_30_phi : bool;
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  let x_23 : f32 = x_5.one;
+  let x_24 : bool = (x_23 < 0.0);
+  x_30_phi = x_24;
+  if (x_24) {
+    let x_28 : f32 = x_5.one;
+    x_29 = (x_28 < 0.0);
+    x_30_phi = x_29;
+  }
+  let x_30 : bool = x_30_phi;
+  if (x_30) {
+    x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-same-cond-twice/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-same-cond-twice/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..4208963
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-same-cond-twice/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,38 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+
+void main_1() {
+  bool x_29 = false;
+  bool x_30_phi = false;
+  x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  const float x_23 = asfloat(x_5[0].x);
+  const bool x_24 = (x_23 < 0.0f);
+  x_30_phi = x_24;
+  if (x_24) {
+    const float x_28 = asfloat(x_5[0].x);
+    x_29 = (x_28 < 0.0f);
+    x_30_phi = x_29;
+  }
+  if (x_30_phi) {
+    x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  } else {
+    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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-same-cond-twice/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-same-cond-twice/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..747b267
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-same-cond-twice/0-opt.wgsl.expected.msl
@@ -0,0 +1,42 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  bool x_29 = false;
+  bool x_30_phi = false;
+  *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float const x_23 = x_5.one;
+  bool const x_24 = (x_23 < 0.0f);
+  x_30_phi = x_24;
+  if (x_24) {
+    float const x_28 = x_5.one;
+    x_29 = (x_28 < 0.0f);
+    x_30_phi = x_29;
+  }
+  bool const x_30 = x_30_phi;
+  if (x_30) {
+    *(tint_symbol_4) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-same-cond-twice/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-same-cond-twice/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..7708f0f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-same-cond-twice/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,101 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 53
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_5 "x_5"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_29 "x_29"
+               OpName %x_30_phi "x_30_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %18 = OpConstantNull %bool
+    %float_0 = OpConstant %float 0
+         %21 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+         %39 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+         %40 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %41 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+       %x_29 = OpVariable %_ptr_Function_bool Function %18
+   %x_30_phi = OpVariable %_ptr_Function_bool Function %18
+               OpStore %x_GLF_color %21
+         %25 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0
+         %26 = OpLoad %float %25
+         %27 = OpFOrdLessThan %bool %26 %float_0
+               OpStore %x_30_phi %27
+               OpSelectionMerge %28 None
+               OpBranchConditional %27 %29 %28
+         %29 = OpLabel
+         %30 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0
+         %31 = OpLoad %float %30
+         %32 = OpFOrdLessThan %bool %31 %float_0
+               OpStore %x_29 %32
+         %33 = OpLoad %bool %x_29
+               OpStore %x_30_phi %33
+               OpBranch %28
+         %28 = OpLabel
+         %34 = OpLoad %bool %x_30_phi
+               OpSelectionMerge %35 None
+               OpBranchConditional %34 %36 %37
+         %36 = OpLabel
+               OpStore %x_GLF_color %39
+               OpBranch %35
+         %37 = OpLabel
+               OpStore %x_GLF_color %40
+               OpBranch %35
+         %35 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %41
+%tint_symbol = OpFunctionParameter %main_out
+         %45 = OpLabel
+         %46 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %46
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %48 = OpLabel
+         %49 = OpFunctionCall %void %main_1
+         %51 = OpLoad %v4float %x_GLF_color
+         %52 = OpCompositeConstruct %main_out %51
+         %50 = OpFunctionCall %void %tint_symbol_2 %52
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-same-cond-twice/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-same-cond-twice/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..cc257f4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-selection-dag-same-cond-twice/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,40 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+fn main_1() {
+  var x_29 : bool;
+  var x_30_phi : bool;
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  let x_23 : f32 = x_5.one;
+  let x_24 : bool = (x_23 < 0.0);
+  x_30_phi = x_24;
+  if (x_24) {
+    let x_28 : f32 = x_5.one;
+    x_29 = (x_28 < 0.0);
+    x_30_phi = x_29;
+  }
+  let x_30 : bool = x_30_phi;
+  if (x_30) {
+    x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-set-output-color-function-call-nested-loop/0.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-set-output-color-function-call-nested-loop/0.spvasm
new file mode 100644
index 0000000..157569f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-set-output-color-function-call-nested-loop/0.spvasm
@@ -0,0 +1,126 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_6 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_6 = OpConstant %uint 6
+%_arr_int_uint_6 = OpTypeArray %int %uint_6
+       %buf0 = OpTypeStruct %_arr_int_uint_6
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+      %int_3 = OpConstant %int 3
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+      %int_4 = OpConstant %int 4
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+      %int_1 = OpConstant %int 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+     %v4bool = OpTypeVector %bool 4
+      %int_5 = OpConstant %int 5
+     %uint_0 = OpConstant %uint 0
+         %26 = OpUndef %v4float
+       %main = OpFunction %void None %8
+         %27 = OpLabel
+         %28 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %29 = OpLoad %int %28
+         %30 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %31 = OpLoad %int %30
+               OpBranch %32
+         %32 = OpLabel
+         %33 = OpPhi %v4float %26 %27 %34 %35
+         %36 = OpPhi %int %29 %27 %37 %35
+         %38 = OpPhi %int %31 %27 %39 %35
+         %40 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_4
+         %41 = OpLoad %int %40
+         %42 = OpSLessThan %bool %38 %41
+               OpLoopMerge %43 %35 None
+               OpBranchConditional %42 %44 %43
+         %44 = OpLabel
+               OpSelectionMerge %45 None
+               OpSwitch %uint_0 %46
+         %46 = OpLabel
+         %47 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %48 = OpLoad %int %47
+         %49 = OpSGreaterThan %bool %38 %48
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %50
+         %51 = OpLabel
+               OpBranch %45
+         %50 = OpLabel
+               OpBranch %52
+         %52 = OpLabel
+         %53 = OpPhi %v4float %33 %50 %54 %55
+         %56 = OpPhi %int %29 %50 %57 %55
+         %58 = OpSLessThan %bool %56 %41
+               OpLoopMerge %59 %55 None
+               OpBranchConditional %58 %55 %59
+         %55 = OpLabel
+         %60 = OpIAdd %int %38 %56
+         %61 = OpConvertSToF %float %60
+         %54 = OpCompositeConstruct %v4float %61 %61 %61 %61
+         %57 = OpIAdd %int %56 %int_1
+               OpBranch %52
+         %59 = OpLabel
+               OpStore %_GLF_color %53
+               OpBranch %45
+         %45 = OpLabel
+         %34 = OpPhi %v4float %33 %51 %53 %59
+         %62 = OpPhi %int %int_2 %51 %31 %59
+         %37 = OpIAdd %int %36 %62
+               OpBranch %35
+         %35 = OpLabel
+         %39 = OpIAdd %int %38 %int_1
+               OpBranch %32
+         %43 = OpLabel
+         %63 = OpLoad %v4float %_GLF_color
+         %64 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %65 = OpLoad %int %64
+         %66 = OpConvertSToF %float %65
+         %67 = OpCompositeConstruct %v4float %66 %66 %66 %66
+         %68 = OpFOrdEqual %v4bool %63 %67
+         %69 = OpAll %bool %68
+               OpSelectionMerge %70 None
+               OpBranchConditional %69 %71 %70
+         %71 = OpLabel
+         %72 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_5
+         %73 = OpLoad %int %72
+         %74 = OpIEqual %bool %36 %73
+               OpBranch %70
+         %70 = OpLabel
+         %75 = OpPhi %bool %69 %43 %74 %71
+               OpSelectionMerge %76 None
+               OpBranchConditional %75 %77 %78
+         %77 = OpLabel
+         %79 = OpConvertSToF %float %31
+         %80 = OpConvertSToF %float %29
+         %81 = OpCompositeConstruct %v4float %79 %80 %80 %79
+               OpStore %_GLF_color %81
+               OpBranch %76
+         %78 = OpLabel
+         %82 = OpConvertSToF %float %29
+         %83 = OpCompositeConstruct %v4float %82 %82 %82 %82
+               OpStore %_GLF_color %83
+               OpBranch %76
+         %76 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-set-output-color-function-call-nested-loop/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-set-output-color-function-call-nested-loop/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..1fcb766
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-set-output-color-function-call-nested-loop/0.spvasm.expected.hlsl
@@ -0,0 +1,109 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[6];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int x_36 = 0;
+  bool x_74 = false;
+  float4 x_33_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int x_36_phi = 0;
+  int x_38_phi = 0;
+  bool x_75_phi = false;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_29 = asint(x_5[scalar_offset / 4][scalar_offset % 4]);
+  const int x_31 = asint(x_5[1].x);
+  x_33_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  x_36_phi = x_29;
+  x_38_phi = x_31;
+  while (true) {
+    float4 x_53 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    int x_39 = 0;
+    float4 x_34_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    int x_62_phi = 0;
+    const float4 x_33 = x_33_phi;
+    x_36 = x_36_phi;
+    const int x_38 = x_38_phi;
+    const int x_41 = asint(x_5[4].x);
+    if ((x_38 < x_41)) {
+    } else {
+      break;
+    }
+    float4 x_53_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    int x_56_phi = 0;
+    switch(0u) {
+      default: {
+        const int x_48 = asint(x_5[3].x);
+        if ((x_38 > x_48)) {
+          x_34_phi = x_33;
+          x_62_phi = 2;
+          break;
+        }
+        x_53_phi = x_33;
+        x_56_phi = x_29;
+        while (true) {
+          float4 x_54 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+          int x_57 = 0;
+          x_53 = x_53_phi;
+          const int x_56 = x_56_phi;
+          if ((x_56 < x_41)) {
+          } else {
+            break;
+          }
+          {
+            const float x_61 = float((x_38 + x_56));
+            x_54 = float4(x_61, x_61, x_61, x_61);
+            x_57 = (x_56 + 1);
+            x_53_phi = x_54;
+            x_56_phi = x_57;
+          }
+        }
+        x_GLF_color = x_53;
+        x_34_phi = x_53;
+        x_62_phi = x_31;
+        break;
+      }
+    }
+    const float4 x_34 = x_34_phi;
+    const int x_62 = x_62_phi;
+    {
+      x_39 = (x_38 + 1);
+      x_33_phi = x_34;
+      x_36_phi = asint((x_36 + asint(x_62)));
+      x_38_phi = x_39;
+    }
+  }
+  const float4 x_63 = x_GLF_color;
+  const int x_65 = asint(x_5[2].x);
+  const float x_66 = float(x_65);
+  const bool x_69 = all((x_63 == float4(x_66, x_66, x_66, x_66)));
+  x_75_phi = x_69;
+  if (x_69) {
+    const int x_73 = asint(x_5[5].x);
+    x_74 = (x_36 == asint(x_73));
+    x_75_phi = x_74;
+  }
+  if (x_75_phi) {
+    const float x_79 = float(x_31);
+    const float x_80 = float(x_29);
+    x_GLF_color = float4(x_79, x_80, x_80, x_79);
+  } else {
+    const float x_82 = float(x_29);
+    x_GLF_color = float4(x_82, x_82, x_82, x_82);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-set-output-color-function-call-nested-loop/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-set-output-color-function-call-nested-loop/0.spvasm.expected.msl
new file mode 100644
index 0000000..c5bf9c8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-set-output-color-function-call-nested-loop/0.spvasm.expected.msl
@@ -0,0 +1,119 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[6];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  int x_36 = 0;
+  bool x_74 = false;
+  float4 x_33_phi = 0.0f;
+  int x_36_phi = 0;
+  int x_38_phi = 0;
+  bool x_75_phi = false;
+  int const x_29 = x_5.x_GLF_uniform_int_values.arr[0].el;
+  int const x_31 = x_5.x_GLF_uniform_int_values.arr[1].el;
+  x_33_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  x_36_phi = x_29;
+  x_38_phi = x_31;
+  while (true) {
+    float4 x_53 = 0.0f;
+    int x_39 = 0;
+    float4 x_34_phi = 0.0f;
+    int x_62_phi = 0;
+    float4 const x_33 = x_33_phi;
+    x_36 = x_36_phi;
+    int const x_38 = x_38_phi;
+    int const x_41 = x_5.x_GLF_uniform_int_values.arr[4].el;
+    if ((x_38 < x_41)) {
+    } else {
+      break;
+    }
+    float4 x_53_phi = 0.0f;
+    int x_56_phi = 0;
+    switch(0u) {
+      default: {
+        int const x_48 = x_5.x_GLF_uniform_int_values.arr[3].el;
+        if ((x_38 > x_48)) {
+          x_34_phi = x_33;
+          x_62_phi = 2;
+          break;
+        }
+        x_53_phi = x_33;
+        x_56_phi = x_29;
+        while (true) {
+          float4 x_54 = 0.0f;
+          int x_57 = 0;
+          x_53 = x_53_phi;
+          int const x_56 = x_56_phi;
+          if ((x_56 < x_41)) {
+          } else {
+            break;
+          }
+          {
+            float const x_61 = float((x_38 + x_56));
+            x_54 = float4(x_61, x_61, x_61, x_61);
+            x_57 = (x_56 + 1);
+            x_53_phi = x_54;
+            x_56_phi = x_57;
+          }
+        }
+        *(tint_symbol_4) = x_53;
+        x_34_phi = x_53;
+        x_62_phi = x_31;
+        break;
+      }
+    }
+    float4 const x_34 = x_34_phi;
+    int const x_62 = x_62_phi;
+    {
+      x_39 = (x_38 + 1);
+      x_33_phi = x_34;
+      x_36_phi = as_type<int>((x_36 + as_type<int>(x_62)));
+      x_38_phi = x_39;
+    }
+  }
+  float4 const x_63 = *(tint_symbol_4);
+  int const x_65 = x_5.x_GLF_uniform_int_values.arr[2].el;
+  float const x_66 = float(x_65);
+  bool const x_69 = all((x_63 == float4(x_66, x_66, x_66, x_66)));
+  x_75_phi = x_69;
+  if (x_69) {
+    int const x_73 = x_5.x_GLF_uniform_int_values.arr[5].el;
+    x_74 = (x_36 == as_type<int>(x_73));
+    x_75_phi = x_74;
+  }
+  bool const x_75 = x_75_phi;
+  if (x_75) {
+    float const x_79 = float(x_31);
+    float const x_80 = float(x_29);
+    *(tint_symbol_4) = float4(x_79, x_80, x_80, x_79);
+  } else {
+    float const x_82 = float(x_29);
+    *(tint_symbol_4) = float4(x_82, x_82, x_82, x_82);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-set-output-color-function-call-nested-loop/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-set-output-color-function-call-nested-loop/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..5769859
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-set-output-color-function-call-nested-loop/0.spvasm.expected.spvasm
@@ -0,0 +1,240 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 136
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_36 "x_36"
+               OpName %x_74 "x_74"
+               OpName %x_33_phi "x_33_phi"
+               OpName %x_36_phi "x_36_phi"
+               OpName %x_38_phi "x_38_phi"
+               OpName %x_75_phi "x_75_phi"
+               OpName %x_53 "x_53"
+               OpName %x_39 "x_39"
+               OpName %x_34_phi "x_34_phi"
+               OpName %x_62_phi "x_62_phi"
+               OpName %x_53_phi "x_53_phi"
+               OpName %x_56_phi "x_56_phi"
+               OpName %x_54 "x_54"
+               OpName %x_57 "x_57"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_6 ArrayStride 16
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_6 = OpConstant %uint 6
+%_arr_int_uint_6 = OpTypeArray %int %uint_6
+       %buf0 = OpTypeStruct %_arr_int_uint_6
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %25 = OpConstantNull %bool
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+         %40 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+      %int_4 = OpConstant %int 4
+      %int_3 = OpConstant %int 3
+      %int_2 = OpConstant %int 2
+     %v4bool = OpTypeVector %bool 4
+      %int_5 = OpConstant %int 5
+   %main_out = OpTypeStruct %v4float
+        %124 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+       %x_36 = OpVariable %_ptr_Function_int Function %21
+       %x_74 = OpVariable %_ptr_Function_bool Function %25
+   %x_33_phi = OpVariable %_ptr_Function_v4float Function %12
+   %x_36_phi = OpVariable %_ptr_Function_int Function %21
+   %x_38_phi = OpVariable %_ptr_Function_int Function %21
+   %x_75_phi = OpVariable %_ptr_Function_bool Function %25
+       %x_53 = OpVariable %_ptr_Function_v4float Function %12
+       %x_39 = OpVariable %_ptr_Function_int Function %21
+   %x_34_phi = OpVariable %_ptr_Function_v4float Function %12
+   %x_62_phi = OpVariable %_ptr_Function_int Function %21
+   %x_53_phi = OpVariable %_ptr_Function_v4float Function %12
+   %x_56_phi = OpVariable %_ptr_Function_int Function %21
+       %x_54 = OpVariable %_ptr_Function_v4float Function %12
+       %x_57 = OpVariable %_ptr_Function_int Function %21
+         %34 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %35 = OpLoad %int %34
+         %37 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %38 = OpLoad %int %37
+               OpStore %x_33_phi %40
+               OpStore %x_36_phi %35
+               OpStore %x_38_phi %38
+               OpBranch %41
+         %41 = OpLabel
+               OpLoopMerge %42 %43 None
+               OpBranch %44
+         %44 = OpLabel
+         %49 = OpLoad %v4float %x_33_phi
+         %50 = OpLoad %int %x_36_phi
+               OpStore %x_36 %50
+         %51 = OpLoad %int %x_38_phi
+         %53 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_4
+         %54 = OpLoad %int %53
+         %55 = OpSLessThan %bool %51 %54
+               OpSelectionMerge %56 None
+               OpBranchConditional %55 %57 %58
+         %57 = OpLabel
+               OpBranch %56
+         %58 = OpLabel
+               OpBranch %42
+         %56 = OpLabel
+               OpSelectionMerge %61 None
+               OpSwitch %uint_0 %62
+         %62 = OpLabel
+         %64 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_3
+         %65 = OpLoad %int %64
+         %66 = OpSGreaterThan %bool %51 %65
+               OpSelectionMerge %67 None
+               OpBranchConditional %66 %68 %67
+         %68 = OpLabel
+               OpStore %x_34_phi %49
+               OpStore %x_62_phi %int_2
+               OpBranch %61
+         %67 = OpLabel
+               OpStore %x_53_phi %49
+               OpStore %x_56_phi %35
+               OpBranch %70
+         %70 = OpLabel
+               OpLoopMerge %71 %72 None
+               OpBranch %73
+         %73 = OpLabel
+         %76 = OpLoad %v4float %x_53_phi
+               OpStore %x_53 %76
+         %77 = OpLoad %int %x_56_phi
+         %78 = OpSLessThan %bool %77 %54
+               OpSelectionMerge %79 None
+               OpBranchConditional %78 %80 %81
+         %80 = OpLabel
+               OpBranch %79
+         %81 = OpLabel
+               OpBranch %71
+         %79 = OpLabel
+               OpBranch %72
+         %72 = OpLabel
+         %83 = OpIAdd %int %51 %77
+         %82 = OpConvertSToF %float %83
+         %84 = OpCompositeConstruct %v4float %82 %82 %82 %82
+               OpStore %x_54 %84
+         %85 = OpIAdd %int %77 %int_1
+               OpStore %x_57 %85
+         %86 = OpLoad %v4float %x_54
+               OpStore %x_53_phi %86
+         %87 = OpLoad %int %x_57
+               OpStore %x_56_phi %87
+               OpBranch %70
+         %71 = OpLabel
+         %88 = OpLoad %v4float %x_53
+               OpStore %x_GLF_color %88
+         %89 = OpLoad %v4float %x_53
+               OpStore %x_34_phi %89
+               OpStore %x_62_phi %38
+               OpBranch %61
+         %61 = OpLabel
+         %90 = OpLoad %v4float %x_34_phi
+         %91 = OpLoad %int %x_62_phi
+               OpBranch %43
+         %43 = OpLabel
+         %92 = OpIAdd %int %51 %int_1
+               OpStore %x_39 %92
+               OpStore %x_33_phi %90
+         %94 = OpLoad %int %x_36
+         %95 = OpCopyObject %int %91
+         %96 = OpIAdd %int %94 %95
+         %93 = OpCopyObject %int %96
+               OpStore %x_36_phi %93
+         %97 = OpLoad %int %x_39
+               OpStore %x_38_phi %97
+               OpBranch %41
+         %42 = OpLabel
+         %98 = OpLoad %v4float %x_GLF_color
+         %99 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_2
+        %100 = OpLoad %int %99
+        %101 = OpConvertSToF %float %100
+        %103 = OpCompositeConstruct %v4float %101 %101 %101 %101
+        %104 = OpFOrdEqual %v4bool %98 %103
+        %102 = OpAll %bool %104
+               OpStore %x_75_phi %102
+               OpSelectionMerge %106 None
+               OpBranchConditional %102 %107 %106
+        %107 = OpLabel
+        %109 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_5
+        %110 = OpLoad %int %109
+        %111 = OpLoad %int %x_36
+        %112 = OpCopyObject %int %110
+        %113 = OpIEqual %bool %111 %112
+               OpStore %x_74 %113
+        %114 = OpLoad %bool %x_74
+               OpStore %x_75_phi %114
+               OpBranch %106
+        %106 = OpLabel
+        %115 = OpLoad %bool %x_75_phi
+               OpSelectionMerge %116 None
+               OpBranchConditional %115 %117 %118
+        %117 = OpLabel
+        %119 = OpConvertSToF %float %38
+        %120 = OpConvertSToF %float %35
+        %121 = OpCompositeConstruct %v4float %119 %120 %120 %119
+               OpStore %x_GLF_color %121
+               OpBranch %116
+        %118 = OpLabel
+        %122 = OpConvertSToF %float %35
+        %123 = OpCompositeConstruct %v4float %122 %122 %122 %122
+               OpStore %x_GLF_color %123
+               OpBranch %116
+        %116 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %124
+%tint_symbol = OpFunctionParameter %main_out
+        %128 = OpLabel
+        %129 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %129
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %131 = OpLabel
+        %132 = OpFunctionCall %void %main_1
+        %134 = OpLoad %v4float %x_GLF_color
+        %135 = OpCompositeConstruct %main_out %134
+        %133 = OpFunctionCall %void %tint_symbol_2 %135
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-set-output-color-function-call-nested-loop/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-set-output-color-function-call-nested-loop/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..295609c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-set-output-color-function-call-nested-loop/0.spvasm.expected.wgsl
@@ -0,0 +1,113 @@
+type Arr = [[stride(16)]] array<i32, 6>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_36 : i32;
+  var x_74 : bool;
+  var x_33_phi : vec4<f32>;
+  var x_36_phi : i32;
+  var x_38_phi : i32;
+  var x_75_phi : bool;
+  let x_29 : i32 = x_5.x_GLF_uniform_int_values[0];
+  let x_31 : i32 = x_5.x_GLF_uniform_int_values[1];
+  x_33_phi = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  x_36_phi = x_29;
+  x_38_phi = x_31;
+  loop {
+    var x_53 : vec4<f32>;
+    var x_39 : i32;
+    var x_34_phi : vec4<f32>;
+    var x_62_phi : i32;
+    let x_33 : vec4<f32> = x_33_phi;
+    x_36 = x_36_phi;
+    let x_38 : i32 = x_38_phi;
+    let x_41 : i32 = x_5.x_GLF_uniform_int_values[4];
+    if ((x_38 < x_41)) {
+    } else {
+      break;
+    }
+    var x_53_phi : vec4<f32>;
+    var x_56_phi : i32;
+    switch(0u) {
+      default: {
+        let x_48 : i32 = x_5.x_GLF_uniform_int_values[3];
+        if ((x_38 > x_48)) {
+          x_34_phi = x_33;
+          x_62_phi = 2;
+          break;
+        }
+        x_53_phi = x_33;
+        x_56_phi = x_29;
+        loop {
+          var x_54 : vec4<f32>;
+          var x_57 : i32;
+          x_53 = x_53_phi;
+          let x_56 : i32 = x_56_phi;
+          if ((x_56 < x_41)) {
+          } else {
+            break;
+          }
+
+          continuing {
+            let x_61 : f32 = f32((x_38 + x_56));
+            x_54 = vec4<f32>(x_61, x_61, x_61, x_61);
+            x_57 = (x_56 + 1);
+            x_53_phi = x_54;
+            x_56_phi = x_57;
+          }
+        }
+        x_GLF_color = x_53;
+        x_34_phi = x_53;
+        x_62_phi = x_31;
+      }
+    }
+    let x_34 : vec4<f32> = x_34_phi;
+    let x_62 : i32 = x_62_phi;
+
+    continuing {
+      x_39 = (x_38 + 1);
+      x_33_phi = x_34;
+      x_36_phi = bitcast<i32>((x_36 + bitcast<i32>(x_62)));
+      x_38_phi = x_39;
+    }
+  }
+  let x_63 : vec4<f32> = x_GLF_color;
+  let x_65 : i32 = x_5.x_GLF_uniform_int_values[2];
+  let x_66 : f32 = f32(x_65);
+  let x_69 : bool = all((x_63 == vec4<f32>(x_66, x_66, x_66, x_66)));
+  x_75_phi = x_69;
+  if (x_69) {
+    let x_73 : i32 = x_5.x_GLF_uniform_int_values[5];
+    x_74 = (x_36 == bitcast<i32>(x_73));
+    x_75_phi = x_74;
+  }
+  let x_75 : bool = x_75_phi;
+  if (x_75) {
+    let x_79 : f32 = f32(x_31);
+    let x_80 : f32 = f32(x_29);
+    x_GLF_color = vec4<f32>(x_79, x_80, x_80, x_79);
+  } else {
+    let x_82 : f32 = f32(x_29);
+    x_GLF_color = vec4<f32>(x_82, x_82, x_82, x_82);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-set-output-color-function-call-nested-loop/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-set-output-color-function-call-nested-loop/0.wgsl
new file mode 100644
index 0000000..295609c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-set-output-color-function-call-nested-loop/0.wgsl
@@ -0,0 +1,113 @@
+type Arr = [[stride(16)]] array<i32, 6>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_36 : i32;
+  var x_74 : bool;
+  var x_33_phi : vec4<f32>;
+  var x_36_phi : i32;
+  var x_38_phi : i32;
+  var x_75_phi : bool;
+  let x_29 : i32 = x_5.x_GLF_uniform_int_values[0];
+  let x_31 : i32 = x_5.x_GLF_uniform_int_values[1];
+  x_33_phi = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  x_36_phi = x_29;
+  x_38_phi = x_31;
+  loop {
+    var x_53 : vec4<f32>;
+    var x_39 : i32;
+    var x_34_phi : vec4<f32>;
+    var x_62_phi : i32;
+    let x_33 : vec4<f32> = x_33_phi;
+    x_36 = x_36_phi;
+    let x_38 : i32 = x_38_phi;
+    let x_41 : i32 = x_5.x_GLF_uniform_int_values[4];
+    if ((x_38 < x_41)) {
+    } else {
+      break;
+    }
+    var x_53_phi : vec4<f32>;
+    var x_56_phi : i32;
+    switch(0u) {
+      default: {
+        let x_48 : i32 = x_5.x_GLF_uniform_int_values[3];
+        if ((x_38 > x_48)) {
+          x_34_phi = x_33;
+          x_62_phi = 2;
+          break;
+        }
+        x_53_phi = x_33;
+        x_56_phi = x_29;
+        loop {
+          var x_54 : vec4<f32>;
+          var x_57 : i32;
+          x_53 = x_53_phi;
+          let x_56 : i32 = x_56_phi;
+          if ((x_56 < x_41)) {
+          } else {
+            break;
+          }
+
+          continuing {
+            let x_61 : f32 = f32((x_38 + x_56));
+            x_54 = vec4<f32>(x_61, x_61, x_61, x_61);
+            x_57 = (x_56 + 1);
+            x_53_phi = x_54;
+            x_56_phi = x_57;
+          }
+        }
+        x_GLF_color = x_53;
+        x_34_phi = x_53;
+        x_62_phi = x_31;
+      }
+    }
+    let x_34 : vec4<f32> = x_34_phi;
+    let x_62 : i32 = x_62_phi;
+
+    continuing {
+      x_39 = (x_38 + 1);
+      x_33_phi = x_34;
+      x_36_phi = bitcast<i32>((x_36 + bitcast<i32>(x_62)));
+      x_38_phi = x_39;
+    }
+  }
+  let x_63 : vec4<f32> = x_GLF_color;
+  let x_65 : i32 = x_5.x_GLF_uniform_int_values[2];
+  let x_66 : f32 = f32(x_65);
+  let x_69 : bool = all((x_63 == vec4<f32>(x_66, x_66, x_66, x_66)));
+  x_75_phi = x_69;
+  if (x_69) {
+    let x_73 : i32 = x_5.x_GLF_uniform_int_values[5];
+    x_74 = (x_36 == bitcast<i32>(x_73));
+    x_75_phi = x_74;
+  }
+  let x_75 : bool = x_75_phi;
+  if (x_75) {
+    let x_79 : f32 = f32(x_31);
+    let x_80 : f32 = f32(x_29);
+    x_GLF_color = vec4<f32>(x_79, x_80, x_80, x_79);
+  } else {
+    let x_82 : f32 = f32(x_29);
+    x_GLF_color = vec4<f32>(x_82, x_82, x_82, x_82);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-set-output-color-function-call-nested-loop/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-set-output-color-function-call-nested-loop/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..1fcb766
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-set-output-color-function-call-nested-loop/0.wgsl.expected.hlsl
@@ -0,0 +1,109 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[6];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int x_36 = 0;
+  bool x_74 = false;
+  float4 x_33_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int x_36_phi = 0;
+  int x_38_phi = 0;
+  bool x_75_phi = false;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_29 = asint(x_5[scalar_offset / 4][scalar_offset % 4]);
+  const int x_31 = asint(x_5[1].x);
+  x_33_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  x_36_phi = x_29;
+  x_38_phi = x_31;
+  while (true) {
+    float4 x_53 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    int x_39 = 0;
+    float4 x_34_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    int x_62_phi = 0;
+    const float4 x_33 = x_33_phi;
+    x_36 = x_36_phi;
+    const int x_38 = x_38_phi;
+    const int x_41 = asint(x_5[4].x);
+    if ((x_38 < x_41)) {
+    } else {
+      break;
+    }
+    float4 x_53_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    int x_56_phi = 0;
+    switch(0u) {
+      default: {
+        const int x_48 = asint(x_5[3].x);
+        if ((x_38 > x_48)) {
+          x_34_phi = x_33;
+          x_62_phi = 2;
+          break;
+        }
+        x_53_phi = x_33;
+        x_56_phi = x_29;
+        while (true) {
+          float4 x_54 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+          int x_57 = 0;
+          x_53 = x_53_phi;
+          const int x_56 = x_56_phi;
+          if ((x_56 < x_41)) {
+          } else {
+            break;
+          }
+          {
+            const float x_61 = float((x_38 + x_56));
+            x_54 = float4(x_61, x_61, x_61, x_61);
+            x_57 = (x_56 + 1);
+            x_53_phi = x_54;
+            x_56_phi = x_57;
+          }
+        }
+        x_GLF_color = x_53;
+        x_34_phi = x_53;
+        x_62_phi = x_31;
+        break;
+      }
+    }
+    const float4 x_34 = x_34_phi;
+    const int x_62 = x_62_phi;
+    {
+      x_39 = (x_38 + 1);
+      x_33_phi = x_34;
+      x_36_phi = asint((x_36 + asint(x_62)));
+      x_38_phi = x_39;
+    }
+  }
+  const float4 x_63 = x_GLF_color;
+  const int x_65 = asint(x_5[2].x);
+  const float x_66 = float(x_65);
+  const bool x_69 = all((x_63 == float4(x_66, x_66, x_66, x_66)));
+  x_75_phi = x_69;
+  if (x_69) {
+    const int x_73 = asint(x_5[5].x);
+    x_74 = (x_36 == asint(x_73));
+    x_75_phi = x_74;
+  }
+  if (x_75_phi) {
+    const float x_79 = float(x_31);
+    const float x_80 = float(x_29);
+    x_GLF_color = float4(x_79, x_80, x_80, x_79);
+  } else {
+    const float x_82 = float(x_29);
+    x_GLF_color = float4(x_82, x_82, x_82, x_82);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-set-output-color-function-call-nested-loop/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-set-output-color-function-call-nested-loop/0.wgsl.expected.msl
new file mode 100644
index 0000000..c5bf9c8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-set-output-color-function-call-nested-loop/0.wgsl.expected.msl
@@ -0,0 +1,119 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[6];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  int x_36 = 0;
+  bool x_74 = false;
+  float4 x_33_phi = 0.0f;
+  int x_36_phi = 0;
+  int x_38_phi = 0;
+  bool x_75_phi = false;
+  int const x_29 = x_5.x_GLF_uniform_int_values.arr[0].el;
+  int const x_31 = x_5.x_GLF_uniform_int_values.arr[1].el;
+  x_33_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  x_36_phi = x_29;
+  x_38_phi = x_31;
+  while (true) {
+    float4 x_53 = 0.0f;
+    int x_39 = 0;
+    float4 x_34_phi = 0.0f;
+    int x_62_phi = 0;
+    float4 const x_33 = x_33_phi;
+    x_36 = x_36_phi;
+    int const x_38 = x_38_phi;
+    int const x_41 = x_5.x_GLF_uniform_int_values.arr[4].el;
+    if ((x_38 < x_41)) {
+    } else {
+      break;
+    }
+    float4 x_53_phi = 0.0f;
+    int x_56_phi = 0;
+    switch(0u) {
+      default: {
+        int const x_48 = x_5.x_GLF_uniform_int_values.arr[3].el;
+        if ((x_38 > x_48)) {
+          x_34_phi = x_33;
+          x_62_phi = 2;
+          break;
+        }
+        x_53_phi = x_33;
+        x_56_phi = x_29;
+        while (true) {
+          float4 x_54 = 0.0f;
+          int x_57 = 0;
+          x_53 = x_53_phi;
+          int const x_56 = x_56_phi;
+          if ((x_56 < x_41)) {
+          } else {
+            break;
+          }
+          {
+            float const x_61 = float((x_38 + x_56));
+            x_54 = float4(x_61, x_61, x_61, x_61);
+            x_57 = (x_56 + 1);
+            x_53_phi = x_54;
+            x_56_phi = x_57;
+          }
+        }
+        *(tint_symbol_4) = x_53;
+        x_34_phi = x_53;
+        x_62_phi = x_31;
+        break;
+      }
+    }
+    float4 const x_34 = x_34_phi;
+    int const x_62 = x_62_phi;
+    {
+      x_39 = (x_38 + 1);
+      x_33_phi = x_34;
+      x_36_phi = as_type<int>((x_36 + as_type<int>(x_62)));
+      x_38_phi = x_39;
+    }
+  }
+  float4 const x_63 = *(tint_symbol_4);
+  int const x_65 = x_5.x_GLF_uniform_int_values.arr[2].el;
+  float const x_66 = float(x_65);
+  bool const x_69 = all((x_63 == float4(x_66, x_66, x_66, x_66)));
+  x_75_phi = x_69;
+  if (x_69) {
+    int const x_73 = x_5.x_GLF_uniform_int_values.arr[5].el;
+    x_74 = (x_36 == as_type<int>(x_73));
+    x_75_phi = x_74;
+  }
+  bool const x_75 = x_75_phi;
+  if (x_75) {
+    float const x_79 = float(x_31);
+    float const x_80 = float(x_29);
+    *(tint_symbol_4) = float4(x_79, x_80, x_80, x_79);
+  } else {
+    float const x_82 = float(x_29);
+    *(tint_symbol_4) = float4(x_82, x_82, x_82, x_82);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-set-output-color-function-call-nested-loop/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-set-output-color-function-call-nested-loop/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..5769859
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-set-output-color-function-call-nested-loop/0.wgsl.expected.spvasm
@@ -0,0 +1,240 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 136
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_36 "x_36"
+               OpName %x_74 "x_74"
+               OpName %x_33_phi "x_33_phi"
+               OpName %x_36_phi "x_36_phi"
+               OpName %x_38_phi "x_38_phi"
+               OpName %x_75_phi "x_75_phi"
+               OpName %x_53 "x_53"
+               OpName %x_39 "x_39"
+               OpName %x_34_phi "x_34_phi"
+               OpName %x_62_phi "x_62_phi"
+               OpName %x_53_phi "x_53_phi"
+               OpName %x_56_phi "x_56_phi"
+               OpName %x_54 "x_54"
+               OpName %x_57 "x_57"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_6 ArrayStride 16
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_6 = OpConstant %uint 6
+%_arr_int_uint_6 = OpTypeArray %int %uint_6
+       %buf0 = OpTypeStruct %_arr_int_uint_6
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %25 = OpConstantNull %bool
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+         %40 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+      %int_4 = OpConstant %int 4
+      %int_3 = OpConstant %int 3
+      %int_2 = OpConstant %int 2
+     %v4bool = OpTypeVector %bool 4
+      %int_5 = OpConstant %int 5
+   %main_out = OpTypeStruct %v4float
+        %124 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+       %x_36 = OpVariable %_ptr_Function_int Function %21
+       %x_74 = OpVariable %_ptr_Function_bool Function %25
+   %x_33_phi = OpVariable %_ptr_Function_v4float Function %12
+   %x_36_phi = OpVariable %_ptr_Function_int Function %21
+   %x_38_phi = OpVariable %_ptr_Function_int Function %21
+   %x_75_phi = OpVariable %_ptr_Function_bool Function %25
+       %x_53 = OpVariable %_ptr_Function_v4float Function %12
+       %x_39 = OpVariable %_ptr_Function_int Function %21
+   %x_34_phi = OpVariable %_ptr_Function_v4float Function %12
+   %x_62_phi = OpVariable %_ptr_Function_int Function %21
+   %x_53_phi = OpVariable %_ptr_Function_v4float Function %12
+   %x_56_phi = OpVariable %_ptr_Function_int Function %21
+       %x_54 = OpVariable %_ptr_Function_v4float Function %12
+       %x_57 = OpVariable %_ptr_Function_int Function %21
+         %34 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %35 = OpLoad %int %34
+         %37 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %38 = OpLoad %int %37
+               OpStore %x_33_phi %40
+               OpStore %x_36_phi %35
+               OpStore %x_38_phi %38
+               OpBranch %41
+         %41 = OpLabel
+               OpLoopMerge %42 %43 None
+               OpBranch %44
+         %44 = OpLabel
+         %49 = OpLoad %v4float %x_33_phi
+         %50 = OpLoad %int %x_36_phi
+               OpStore %x_36 %50
+         %51 = OpLoad %int %x_38_phi
+         %53 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_4
+         %54 = OpLoad %int %53
+         %55 = OpSLessThan %bool %51 %54
+               OpSelectionMerge %56 None
+               OpBranchConditional %55 %57 %58
+         %57 = OpLabel
+               OpBranch %56
+         %58 = OpLabel
+               OpBranch %42
+         %56 = OpLabel
+               OpSelectionMerge %61 None
+               OpSwitch %uint_0 %62
+         %62 = OpLabel
+         %64 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_3
+         %65 = OpLoad %int %64
+         %66 = OpSGreaterThan %bool %51 %65
+               OpSelectionMerge %67 None
+               OpBranchConditional %66 %68 %67
+         %68 = OpLabel
+               OpStore %x_34_phi %49
+               OpStore %x_62_phi %int_2
+               OpBranch %61
+         %67 = OpLabel
+               OpStore %x_53_phi %49
+               OpStore %x_56_phi %35
+               OpBranch %70
+         %70 = OpLabel
+               OpLoopMerge %71 %72 None
+               OpBranch %73
+         %73 = OpLabel
+         %76 = OpLoad %v4float %x_53_phi
+               OpStore %x_53 %76
+         %77 = OpLoad %int %x_56_phi
+         %78 = OpSLessThan %bool %77 %54
+               OpSelectionMerge %79 None
+               OpBranchConditional %78 %80 %81
+         %80 = OpLabel
+               OpBranch %79
+         %81 = OpLabel
+               OpBranch %71
+         %79 = OpLabel
+               OpBranch %72
+         %72 = OpLabel
+         %83 = OpIAdd %int %51 %77
+         %82 = OpConvertSToF %float %83
+         %84 = OpCompositeConstruct %v4float %82 %82 %82 %82
+               OpStore %x_54 %84
+         %85 = OpIAdd %int %77 %int_1
+               OpStore %x_57 %85
+         %86 = OpLoad %v4float %x_54
+               OpStore %x_53_phi %86
+         %87 = OpLoad %int %x_57
+               OpStore %x_56_phi %87
+               OpBranch %70
+         %71 = OpLabel
+         %88 = OpLoad %v4float %x_53
+               OpStore %x_GLF_color %88
+         %89 = OpLoad %v4float %x_53
+               OpStore %x_34_phi %89
+               OpStore %x_62_phi %38
+               OpBranch %61
+         %61 = OpLabel
+         %90 = OpLoad %v4float %x_34_phi
+         %91 = OpLoad %int %x_62_phi
+               OpBranch %43
+         %43 = OpLabel
+         %92 = OpIAdd %int %51 %int_1
+               OpStore %x_39 %92
+               OpStore %x_33_phi %90
+         %94 = OpLoad %int %x_36
+         %95 = OpCopyObject %int %91
+         %96 = OpIAdd %int %94 %95
+         %93 = OpCopyObject %int %96
+               OpStore %x_36_phi %93
+         %97 = OpLoad %int %x_39
+               OpStore %x_38_phi %97
+               OpBranch %41
+         %42 = OpLabel
+         %98 = OpLoad %v4float %x_GLF_color
+         %99 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_2
+        %100 = OpLoad %int %99
+        %101 = OpConvertSToF %float %100
+        %103 = OpCompositeConstruct %v4float %101 %101 %101 %101
+        %104 = OpFOrdEqual %v4bool %98 %103
+        %102 = OpAll %bool %104
+               OpStore %x_75_phi %102
+               OpSelectionMerge %106 None
+               OpBranchConditional %102 %107 %106
+        %107 = OpLabel
+        %109 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_5
+        %110 = OpLoad %int %109
+        %111 = OpLoad %int %x_36
+        %112 = OpCopyObject %int %110
+        %113 = OpIEqual %bool %111 %112
+               OpStore %x_74 %113
+        %114 = OpLoad %bool %x_74
+               OpStore %x_75_phi %114
+               OpBranch %106
+        %106 = OpLabel
+        %115 = OpLoad %bool %x_75_phi
+               OpSelectionMerge %116 None
+               OpBranchConditional %115 %117 %118
+        %117 = OpLabel
+        %119 = OpConvertSToF %float %38
+        %120 = OpConvertSToF %float %35
+        %121 = OpCompositeConstruct %v4float %119 %120 %120 %119
+               OpStore %x_GLF_color %121
+               OpBranch %116
+        %118 = OpLabel
+        %122 = OpConvertSToF %float %35
+        %123 = OpCompositeConstruct %v4float %122 %122 %122 %122
+               OpStore %x_GLF_color %123
+               OpBranch %116
+        %116 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %124
+%tint_symbol = OpFunctionParameter %main_out
+        %128 = OpLabel
+        %129 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %129
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %131 = OpLabel
+        %132 = OpFunctionCall %void %main_1
+        %134 = OpLoad %v4float %x_GLF_color
+        %135 = OpCompositeConstruct %main_out %134
+        %133 = OpFunctionCall %void %tint_symbol_2 %135
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-set-output-color-function-call-nested-loop/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-set-output-color-function-call-nested-loop/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..295609c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-set-output-color-function-call-nested-loop/0.wgsl.expected.wgsl
@@ -0,0 +1,113 @@
+type Arr = [[stride(16)]] array<i32, 6>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_36 : i32;
+  var x_74 : bool;
+  var x_33_phi : vec4<f32>;
+  var x_36_phi : i32;
+  var x_38_phi : i32;
+  var x_75_phi : bool;
+  let x_29 : i32 = x_5.x_GLF_uniform_int_values[0];
+  let x_31 : i32 = x_5.x_GLF_uniform_int_values[1];
+  x_33_phi = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  x_36_phi = x_29;
+  x_38_phi = x_31;
+  loop {
+    var x_53 : vec4<f32>;
+    var x_39 : i32;
+    var x_34_phi : vec4<f32>;
+    var x_62_phi : i32;
+    let x_33 : vec4<f32> = x_33_phi;
+    x_36 = x_36_phi;
+    let x_38 : i32 = x_38_phi;
+    let x_41 : i32 = x_5.x_GLF_uniform_int_values[4];
+    if ((x_38 < x_41)) {
+    } else {
+      break;
+    }
+    var x_53_phi : vec4<f32>;
+    var x_56_phi : i32;
+    switch(0u) {
+      default: {
+        let x_48 : i32 = x_5.x_GLF_uniform_int_values[3];
+        if ((x_38 > x_48)) {
+          x_34_phi = x_33;
+          x_62_phi = 2;
+          break;
+        }
+        x_53_phi = x_33;
+        x_56_phi = x_29;
+        loop {
+          var x_54 : vec4<f32>;
+          var x_57 : i32;
+          x_53 = x_53_phi;
+          let x_56 : i32 = x_56_phi;
+          if ((x_56 < x_41)) {
+          } else {
+            break;
+          }
+
+          continuing {
+            let x_61 : f32 = f32((x_38 + x_56));
+            x_54 = vec4<f32>(x_61, x_61, x_61, x_61);
+            x_57 = (x_56 + 1);
+            x_53_phi = x_54;
+            x_56_phi = x_57;
+          }
+        }
+        x_GLF_color = x_53;
+        x_34_phi = x_53;
+        x_62_phi = x_31;
+      }
+    }
+    let x_34 : vec4<f32> = x_34_phi;
+    let x_62 : i32 = x_62_phi;
+
+    continuing {
+      x_39 = (x_38 + 1);
+      x_33_phi = x_34;
+      x_36_phi = bitcast<i32>((x_36 + bitcast<i32>(x_62)));
+      x_38_phi = x_39;
+    }
+  }
+  let x_63 : vec4<f32> = x_GLF_color;
+  let x_65 : i32 = x_5.x_GLF_uniform_int_values[2];
+  let x_66 : f32 = f32(x_65);
+  let x_69 : bool = all((x_63 == vec4<f32>(x_66, x_66, x_66, x_66)));
+  x_75_phi = x_69;
+  if (x_69) {
+    let x_73 : i32 = x_5.x_GLF_uniform_int_values[5];
+    x_74 = (x_36 == bitcast<i32>(x_73));
+    x_75_phi = x_74;
+  }
+  let x_75 : bool = x_75_phi;
+  if (x_75) {
+    let x_79 : f32 = f32(x_31);
+    let x_80 : f32 = f32(x_29);
+    x_GLF_color = vec4<f32>(x_79, x_80, x_80, x_79);
+  } else {
+    let x_82 : f32 = f32(x_29);
+    x_GLF_color = vec4<f32>(x_82, x_82, x_82, x_82);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-set-vector-cos-fragcoord/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-set-vector-cos-fragcoord/0-opt.spvasm
new file mode 100644
index 0000000..38ac12b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-set-vector-cos-fragcoord/0-opt.spvasm
@@ -0,0 +1,174 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+    %float_1 = OpConstant %float 1
+         %15 = OpConstantComposite %v2float %float_1 %float_1
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+    %float_0 = OpConstant %float 0
+         %19 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+        %int = OpTypeInt 32 1
+     %int_40 = OpConstant %int 40
+       %bool = OpTypeBool
+%float_0_100000001 = OpConstant %float 0.100000001
+         %29 = OpConstantComposite %v3float %float_0_100000001 %float_0_100000001 %float_0_100000001
+     %int_60 = OpConstant %int 60
+%float_0_200000003 = OpConstant %float 0.200000003
+         %32 = OpConstantComposite %v3float %float_0_200000003 %float_0_200000003 %float_0_200000003
+   %float_80 = OpConstant %float 80
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%float_0_00999999978 = OpConstant %float 0.00999999978
+    %int_100 = OpConstant %int 100
+    %int_500 = OpConstant %int 500
+%float_0_540302277 = OpConstant %float 0.540302277
+%float_n0_99996084 = OpConstant %float -0.99996084
+         %44 = OpConstantComposite %v3float %float_0_540302277 %float_0_540302277 %float_n0_99996084
+%float_1_01999998 = OpConstant %float 1.01999998
+     %uint_2 = OpConstant %uint 2
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %48 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %49 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %10
+         %50 = OpLabel
+          %a = OpVariable %_ptr_Function_v2float Function
+          %b = OpVariable %_ptr_Function_v3float Function
+               OpStore %a %15
+               OpStore %b %19
+         %51 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %52 = OpLoad %float %51
+         %53 = OpConvertFToS %int %52
+         %54 = OpSLessThan %bool %53 %int_40
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %57
+         %56 = OpLabel
+               OpStore %b %29
+               OpBranch %55
+         %57 = OpLabel
+         %58 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %59 = OpLoad %float %58
+         %60 = OpConvertFToS %int %59
+         %61 = OpSLessThan %bool %60 %int_60
+               OpSelectionMerge %62 None
+               OpBranchConditional %61 %63 %64
+         %63 = OpLabel
+               OpStore %b %32
+               OpBranch %62
+         %64 = OpLabel
+         %65 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %66 = OpLoad %float %65
+         %67 = OpFOrdLessThan %bool %66 %float_80
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %70
+         %69 = OpLabel
+         %71 = OpAccessChain %_ptr_Function_float %a %uint_0
+         %72 = OpLoad %float %71
+         %73 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %74 = OpLoad %float %73
+         %75 = OpCompositeConstruct %v3float %74 %74 %74
+         %76 = OpCompositeConstruct %v3float %72 %72 %72
+         %77 = OpFAdd %v3float %76 %75
+         %78 = OpExtInst %v3float %1 Cos %77
+         %79 = OpCompositeConstruct %v3float %float_0_00999999978 %float_0_00999999978 %float_0_00999999978
+         %80 = OpFAdd %v3float %78 %79
+               OpStore %b %80
+               OpBranch %68
+         %70 = OpLabel
+         %81 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %82 = OpLoad %float %81
+         %83 = OpConvertFToS %int %82
+         %84 = OpSLessThan %bool %83 %int_100
+               OpSelectionMerge %85 None
+               OpBranchConditional %84 %86 %87
+         %86 = OpLabel
+         %88 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %89 = OpLoad %float %88
+         %90 = OpCompositeConstruct %v3float %89 %89 %89
+         %91 = OpExtInst %v3float %1 Cos %90
+               OpStore %b %91
+               OpBranch %85
+         %87 = OpLabel
+         %92 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %93 = OpLoad %float %92
+         %94 = OpConvertFToS %int %93
+         %95 = OpSLessThan %bool %94 %int_500
+               OpSelectionMerge %96 None
+               OpBranchConditional %95 %97 %96
+         %97 = OpLabel
+               OpStore %b %44
+               OpBranch %96
+         %96 = OpLabel
+               OpBranch %85
+         %85 = OpLabel
+               OpBranch %68
+         %68 = OpLabel
+               OpBranch %62
+         %62 = OpLabel
+               OpBranch %55
+         %55 = OpLabel
+         %98 = OpAccessChain %_ptr_Function_float %b %uint_0
+         %99 = OpLoad %float %98
+        %100 = OpFOrdLessThan %bool %99 %float_1_01999998
+               OpSelectionMerge %101 None
+               OpBranchConditional %100 %102 %101
+        %102 = OpLabel
+        %103 = OpAccessChain %_ptr_Function_float %b %uint_1
+        %104 = OpLoad %float %103
+        %105 = OpFOrdLessThan %bool %104 %float_1_01999998
+               OpBranch %101
+        %101 = OpLabel
+        %106 = OpPhi %bool %100 %55 %105 %102
+               OpSelectionMerge %107 None
+               OpBranchConditional %106 %108 %107
+        %108 = OpLabel
+        %109 = OpAccessChain %_ptr_Function_float %b %uint_2
+        %110 = OpLoad %float %109
+        %111 = OpFOrdLessThan %bool %110 %float_1_01999998
+               OpBranch %107
+        %107 = OpLabel
+        %112 = OpPhi %bool %106 %101 %111 %108
+               OpSelectionMerge %113 None
+               OpBranchConditional %112 %114 %115
+        %114 = OpLabel
+               OpStore %_GLF_color %48
+               OpBranch %113
+        %115 = OpLabel
+               OpStore %_GLF_color %49
+               OpBranch %113
+        %113 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-set-vector-cos-fragcoord/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-set-vector-cos-fragcoord/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..2f55ee9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-set-vector-cos-fragcoord/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,83 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+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);
+
+void main_1() {
+  float2 a = float2(0.0f, 0.0f);
+  float3 b = float3(0.0f, 0.0f, 0.0f);
+  bool x_105 = false;
+  bool x_111 = false;
+  bool x_106_phi = false;
+  bool x_112_phi = false;
+  a = float2(1.0f, 1.0f);
+  b = float3(0.0f, 0.0f, 0.0f);
+  const float x_52 = gl_FragCoord.y;
+  if ((int(x_52) < 40)) {
+    b = float3(0.100000001f, 0.100000001f, 0.100000001f);
+  } else {
+    const float x_59 = gl_FragCoord.y;
+    if ((int(x_59) < 60)) {
+      b = float3(0.200000003f, 0.200000003f, 0.200000003f);
+    } else {
+      const float x_66 = gl_FragCoord.y;
+      if ((x_66 < 80.0f)) {
+        const float x_72 = a.x;
+        const float x_74 = asfloat(x_8[0].x);
+        b = (cos((float3(x_72, x_72, x_72) + float3(x_74, x_74, x_74))) + float3(0.01f, 0.01f, 0.01f));
+      } else {
+        const float x_82 = gl_FragCoord.y;
+        if ((int(x_82) < 100)) {
+          const float x_89 = asfloat(x_8[0].x);
+          b = cos(float3(x_89, x_89, x_89));
+        } else {
+          const float x_93 = gl_FragCoord.y;
+          if ((int(x_93) < 500)) {
+            b = float3(0.540302277f, 0.540302277f, -0.99996084f);
+          }
+        }
+      }
+    }
+  }
+  const float x_99 = b.x;
+  const bool x_100 = (x_99 < 1.019999981f);
+  x_106_phi = x_100;
+  if (x_100) {
+    const float x_104 = b.y;
+    x_105 = (x_104 < 1.019999981f);
+    x_106_phi = x_105;
+  }
+  const bool x_106 = x_106_phi;
+  x_112_phi = x_106;
+  if (x_106) {
+    const float x_110 = b.z;
+    x_111 = (x_110 < 1.019999981f);
+    x_112_phi = x_111;
+  }
+  if (x_112_phi) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-set-vector-cos-fragcoord/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-set-vector-cos-fragcoord/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..a68c333
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-set-vector-cos-fragcoord/0-opt.spvasm.expected.msl
@@ -0,0 +1,83 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float2 a = 0.0f;
+  float3 b = 0.0f;
+  bool x_105 = false;
+  bool x_111 = false;
+  bool x_106_phi = false;
+  bool x_112_phi = false;
+  a = float2(1.0f, 1.0f);
+  b = float3(0.0f, 0.0f, 0.0f);
+  float const x_52 = (*(tint_symbol_5)).y;
+  if ((int(x_52) < 40)) {
+    b = float3(0.100000001f, 0.100000001f, 0.100000001f);
+  } else {
+    float const x_59 = (*(tint_symbol_5)).y;
+    if ((int(x_59) < 60)) {
+      b = float3(0.200000003f, 0.200000003f, 0.200000003f);
+    } else {
+      float const x_66 = (*(tint_symbol_5)).y;
+      if ((x_66 < 80.0f)) {
+        float const x_72 = a.x;
+        float const x_74 = x_8.one;
+        b = (cos((float3(x_72, x_72, x_72) + float3(x_74, x_74, x_74))) + float3(0.01f, 0.01f, 0.01f));
+      } else {
+        float const x_82 = (*(tint_symbol_5)).y;
+        if ((int(x_82) < 100)) {
+          float const x_89 = x_8.one;
+          b = cos(float3(x_89, x_89, x_89));
+        } else {
+          float const x_93 = (*(tint_symbol_5)).y;
+          if ((int(x_93) < 500)) {
+            b = float3(0.540302277f, 0.540302277f, -0.99996084f);
+          }
+        }
+      }
+    }
+  }
+  float const x_99 = b.x;
+  bool const x_100 = (x_99 < 1.019999981f);
+  x_106_phi = x_100;
+  if (x_100) {
+    float const x_104 = b.y;
+    x_105 = (x_104 < 1.019999981f);
+    x_106_phi = x_105;
+  }
+  bool const x_106 = x_106_phi;
+  x_112_phi = x_106;
+  if (x_106) {
+    float const x_110 = b.z;
+    x_111 = (x_110 < 1.019999981f);
+    x_112_phi = x_111;
+  }
+  bool const x_112 = x_112_phi;
+  if (x_112) {
+    *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_6) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_8, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-set-vector-cos-fragcoord/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-set-vector-cos-fragcoord/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..f4d0f97
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-set-vector-cos-fragcoord/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,229 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 142
+; Schema: 0
+               OpCapability Shader
+         %76 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %x_105 "x_105"
+               OpName %x_111 "x_111"
+               OpName %x_106_phi "x_106_phi"
+               OpName %x_112_phi "x_112_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %21 = OpConstantNull %v2float
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %25 = OpConstantNull %v3float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %29 = OpConstantNull %bool
+    %float_1 = OpConstant %float 1
+         %34 = OpConstantComposite %v2float %float_1 %float_1
+    %float_0 = OpConstant %float 0
+         %36 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+        %int = OpTypeInt 32 1
+     %int_40 = OpConstant %int 40
+%float_0_100000001 = OpConstant %float 0.100000001
+         %50 = OpConstantComposite %v3float %float_0_100000001 %float_0_100000001 %float_0_100000001
+     %int_60 = OpConstant %int 60
+%float_0_200000003 = OpConstant %float 0.200000003
+         %60 = OpConstantComposite %v3float %float_0_200000003 %float_0_200000003 %float_0_200000003
+   %float_80 = OpConstant %float 80
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%float_0_00999999978 = OpConstant %float 0.00999999978
+         %81 = OpConstantComposite %v3float %float_0_00999999978 %float_0_00999999978 %float_0_00999999978
+    %int_100 = OpConstant %int 100
+    %int_500 = OpConstant %int 500
+%float_0_540302277 = OpConstant %float 0.540302277
+%float_n0_99996084 = OpConstant %float -0.99996084
+        %104 = OpConstantComposite %v3float %float_0_540302277 %float_0_540302277 %float_n0_99996084
+%float_1_01999998 = OpConstant %float 1.01999998
+     %uint_2 = OpConstant %uint 2
+        %127 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %128 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+        %129 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+          %a = OpVariable %_ptr_Function_v2float Function %21
+          %b = OpVariable %_ptr_Function_v3float Function %25
+      %x_105 = OpVariable %_ptr_Function_bool Function %29
+      %x_111 = OpVariable %_ptr_Function_bool Function %29
+  %x_106_phi = OpVariable %_ptr_Function_bool Function %29
+  %x_112_phi = OpVariable %_ptr_Function_bool Function %29
+               OpStore %a %34
+               OpStore %b %36
+         %40 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %41 = OpLoad %float %40
+         %42 = OpConvertFToS %int %41
+         %45 = OpSLessThan %bool %42 %int_40
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %48
+         %47 = OpLabel
+               OpStore %b %50
+               OpBranch %46
+         %48 = OpLabel
+         %51 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %52 = OpLoad %float %51
+         %53 = OpConvertFToS %int %52
+         %55 = OpSLessThan %bool %53 %int_60
+               OpSelectionMerge %56 None
+               OpBranchConditional %55 %57 %58
+         %57 = OpLabel
+               OpStore %b %60
+               OpBranch %56
+         %58 = OpLabel
+         %61 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %62 = OpLoad %float %61
+         %64 = OpFOrdLessThan %bool %62 %float_80
+               OpSelectionMerge %65 None
+               OpBranchConditional %64 %66 %67
+         %66 = OpLabel
+         %70 = OpAccessChain %_ptr_Function_float %a %uint_0
+         %71 = OpLoad %float %70
+         %73 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0
+         %74 = OpLoad %float %73
+         %77 = OpCompositeConstruct %v3float %71 %71 %71
+         %78 = OpCompositeConstruct %v3float %74 %74 %74
+         %79 = OpFAdd %v3float %77 %78
+         %75 = OpExtInst %v3float %76 Cos %79
+         %82 = OpFAdd %v3float %75 %81
+               OpStore %b %82
+               OpBranch %65
+         %67 = OpLabel
+         %83 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %84 = OpLoad %float %83
+         %85 = OpConvertFToS %int %84
+         %87 = OpSLessThan %bool %85 %int_100
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %90
+         %89 = OpLabel
+         %91 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0
+         %92 = OpLoad %float %91
+         %94 = OpCompositeConstruct %v3float %92 %92 %92
+         %93 = OpExtInst %v3float %76 Cos %94
+               OpStore %b %93
+               OpBranch %88
+         %90 = OpLabel
+         %95 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %96 = OpLoad %float %95
+         %97 = OpConvertFToS %int %96
+         %99 = OpSLessThan %bool %97 %int_500
+               OpSelectionMerge %100 None
+               OpBranchConditional %99 %101 %100
+        %101 = OpLabel
+               OpStore %b %104
+               OpBranch %100
+        %100 = OpLabel
+               OpBranch %88
+         %88 = OpLabel
+               OpBranch %65
+         %65 = OpLabel
+               OpBranch %56
+         %56 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+        %105 = OpAccessChain %_ptr_Function_float %b %uint_0
+        %106 = OpLoad %float %105
+        %108 = OpFOrdLessThan %bool %106 %float_1_01999998
+               OpStore %x_106_phi %108
+               OpSelectionMerge %109 None
+               OpBranchConditional %108 %110 %109
+        %110 = OpLabel
+        %111 = OpAccessChain %_ptr_Function_float %b %uint_1
+        %112 = OpLoad %float %111
+        %113 = OpFOrdLessThan %bool %112 %float_1_01999998
+               OpStore %x_105 %113
+        %114 = OpLoad %bool %x_105
+               OpStore %x_106_phi %114
+               OpBranch %109
+        %109 = OpLabel
+        %115 = OpLoad %bool %x_106_phi
+               OpStore %x_112_phi %115
+               OpSelectionMerge %116 None
+               OpBranchConditional %115 %117 %116
+        %117 = OpLabel
+        %119 = OpAccessChain %_ptr_Function_float %b %uint_2
+        %120 = OpLoad %float %119
+        %121 = OpFOrdLessThan %bool %120 %float_1_01999998
+               OpStore %x_111 %121
+        %122 = OpLoad %bool %x_111
+               OpStore %x_112_phi %122
+               OpBranch %116
+        %116 = OpLabel
+        %123 = OpLoad %bool %x_112_phi
+               OpSelectionMerge %124 None
+               OpBranchConditional %123 %125 %126
+        %125 = OpLabel
+               OpStore %x_GLF_color %127
+               OpBranch %124
+        %126 = OpLabel
+               OpStore %x_GLF_color %128
+               OpBranch %124
+        %124 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %129
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %133 = OpLabel
+        %134 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %134
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+        %136 = OpLabel
+        %137 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %137
+        %138 = OpFunctionCall %void %main_1
+        %140 = OpLoad %v4float %x_GLF_color
+        %141 = OpCompositeConstruct %main_out %140
+        %139 = OpFunctionCall %void %tint_symbol_3 %141
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-set-vector-cos-fragcoord/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-set-vector-cos-fragcoord/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..017a1d9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-set-vector-cos-fragcoord/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,82 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : vec2<f32>;
+  var b : vec3<f32>;
+  var x_105 : bool;
+  var x_111 : bool;
+  var x_106_phi : bool;
+  var x_112_phi : bool;
+  a = vec2<f32>(1.0, 1.0);
+  b = vec3<f32>(0.0, 0.0, 0.0);
+  let x_52 : f32 = gl_FragCoord.y;
+  if ((i32(x_52) < 40)) {
+    b = vec3<f32>(0.100000001, 0.100000001, 0.100000001);
+  } else {
+    let x_59 : f32 = gl_FragCoord.y;
+    if ((i32(x_59) < 60)) {
+      b = vec3<f32>(0.200000003, 0.200000003, 0.200000003);
+    } else {
+      let x_66 : f32 = gl_FragCoord.y;
+      if ((x_66 < 80.0)) {
+        let x_72 : f32 = a.x;
+        let x_74 : f32 = x_8.one;
+        b = (cos((vec3<f32>(x_72, x_72, x_72) + vec3<f32>(x_74, x_74, x_74))) + vec3<f32>(0.01, 0.01, 0.01));
+      } else {
+        let x_82 : f32 = gl_FragCoord.y;
+        if ((i32(x_82) < 100)) {
+          let x_89 : f32 = x_8.one;
+          b = cos(vec3<f32>(x_89, x_89, x_89));
+        } else {
+          let x_93 : f32 = gl_FragCoord.y;
+          if ((i32(x_93) < 500)) {
+            b = vec3<f32>(0.540302277, 0.540302277, -0.99996084);
+          }
+        }
+      }
+    }
+  }
+  let x_99 : f32 = b.x;
+  let x_100 : bool = (x_99 < 1.019999981);
+  x_106_phi = x_100;
+  if (x_100) {
+    let x_104 : f32 = b.y;
+    x_105 = (x_104 < 1.019999981);
+    x_106_phi = x_105;
+  }
+  let x_106 : bool = x_106_phi;
+  x_112_phi = x_106;
+  if (x_106) {
+    let x_110 : f32 = b.z;
+    x_111 = (x_110 < 1.019999981);
+    x_112_phi = x_111;
+  }
+  let x_112 : bool = x_112_phi;
+  if (x_112) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-set-vector-cos-fragcoord/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-set-vector-cos-fragcoord/0-opt.wgsl
new file mode 100644
index 0000000..017a1d9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-set-vector-cos-fragcoord/0-opt.wgsl
@@ -0,0 +1,82 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : vec2<f32>;
+  var b : vec3<f32>;
+  var x_105 : bool;
+  var x_111 : bool;
+  var x_106_phi : bool;
+  var x_112_phi : bool;
+  a = vec2<f32>(1.0, 1.0);
+  b = vec3<f32>(0.0, 0.0, 0.0);
+  let x_52 : f32 = gl_FragCoord.y;
+  if ((i32(x_52) < 40)) {
+    b = vec3<f32>(0.100000001, 0.100000001, 0.100000001);
+  } else {
+    let x_59 : f32 = gl_FragCoord.y;
+    if ((i32(x_59) < 60)) {
+      b = vec3<f32>(0.200000003, 0.200000003, 0.200000003);
+    } else {
+      let x_66 : f32 = gl_FragCoord.y;
+      if ((x_66 < 80.0)) {
+        let x_72 : f32 = a.x;
+        let x_74 : f32 = x_8.one;
+        b = (cos((vec3<f32>(x_72, x_72, x_72) + vec3<f32>(x_74, x_74, x_74))) + vec3<f32>(0.01, 0.01, 0.01));
+      } else {
+        let x_82 : f32 = gl_FragCoord.y;
+        if ((i32(x_82) < 100)) {
+          let x_89 : f32 = x_8.one;
+          b = cos(vec3<f32>(x_89, x_89, x_89));
+        } else {
+          let x_93 : f32 = gl_FragCoord.y;
+          if ((i32(x_93) < 500)) {
+            b = vec3<f32>(0.540302277, 0.540302277, -0.99996084);
+          }
+        }
+      }
+    }
+  }
+  let x_99 : f32 = b.x;
+  let x_100 : bool = (x_99 < 1.019999981);
+  x_106_phi = x_100;
+  if (x_100) {
+    let x_104 : f32 = b.y;
+    x_105 = (x_104 < 1.019999981);
+    x_106_phi = x_105;
+  }
+  let x_106 : bool = x_106_phi;
+  x_112_phi = x_106;
+  if (x_106) {
+    let x_110 : f32 = b.z;
+    x_111 = (x_110 < 1.019999981);
+    x_112_phi = x_111;
+  }
+  let x_112 : bool = x_112_phi;
+  if (x_112) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-set-vector-cos-fragcoord/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-set-vector-cos-fragcoord/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..2f55ee9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-set-vector-cos-fragcoord/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,83 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+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);
+
+void main_1() {
+  float2 a = float2(0.0f, 0.0f);
+  float3 b = float3(0.0f, 0.0f, 0.0f);
+  bool x_105 = false;
+  bool x_111 = false;
+  bool x_106_phi = false;
+  bool x_112_phi = false;
+  a = float2(1.0f, 1.0f);
+  b = float3(0.0f, 0.0f, 0.0f);
+  const float x_52 = gl_FragCoord.y;
+  if ((int(x_52) < 40)) {
+    b = float3(0.100000001f, 0.100000001f, 0.100000001f);
+  } else {
+    const float x_59 = gl_FragCoord.y;
+    if ((int(x_59) < 60)) {
+      b = float3(0.200000003f, 0.200000003f, 0.200000003f);
+    } else {
+      const float x_66 = gl_FragCoord.y;
+      if ((x_66 < 80.0f)) {
+        const float x_72 = a.x;
+        const float x_74 = asfloat(x_8[0].x);
+        b = (cos((float3(x_72, x_72, x_72) + float3(x_74, x_74, x_74))) + float3(0.01f, 0.01f, 0.01f));
+      } else {
+        const float x_82 = gl_FragCoord.y;
+        if ((int(x_82) < 100)) {
+          const float x_89 = asfloat(x_8[0].x);
+          b = cos(float3(x_89, x_89, x_89));
+        } else {
+          const float x_93 = gl_FragCoord.y;
+          if ((int(x_93) < 500)) {
+            b = float3(0.540302277f, 0.540302277f, -0.99996084f);
+          }
+        }
+      }
+    }
+  }
+  const float x_99 = b.x;
+  const bool x_100 = (x_99 < 1.019999981f);
+  x_106_phi = x_100;
+  if (x_100) {
+    const float x_104 = b.y;
+    x_105 = (x_104 < 1.019999981f);
+    x_106_phi = x_105;
+  }
+  const bool x_106 = x_106_phi;
+  x_112_phi = x_106;
+  if (x_106) {
+    const float x_110 = b.z;
+    x_111 = (x_110 < 1.019999981f);
+    x_112_phi = x_111;
+  }
+  if (x_112_phi) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-set-vector-cos-fragcoord/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-set-vector-cos-fragcoord/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..a68c333
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-set-vector-cos-fragcoord/0-opt.wgsl.expected.msl
@@ -0,0 +1,83 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float2 a = 0.0f;
+  float3 b = 0.0f;
+  bool x_105 = false;
+  bool x_111 = false;
+  bool x_106_phi = false;
+  bool x_112_phi = false;
+  a = float2(1.0f, 1.0f);
+  b = float3(0.0f, 0.0f, 0.0f);
+  float const x_52 = (*(tint_symbol_5)).y;
+  if ((int(x_52) < 40)) {
+    b = float3(0.100000001f, 0.100000001f, 0.100000001f);
+  } else {
+    float const x_59 = (*(tint_symbol_5)).y;
+    if ((int(x_59) < 60)) {
+      b = float3(0.200000003f, 0.200000003f, 0.200000003f);
+    } else {
+      float const x_66 = (*(tint_symbol_5)).y;
+      if ((x_66 < 80.0f)) {
+        float const x_72 = a.x;
+        float const x_74 = x_8.one;
+        b = (cos((float3(x_72, x_72, x_72) + float3(x_74, x_74, x_74))) + float3(0.01f, 0.01f, 0.01f));
+      } else {
+        float const x_82 = (*(tint_symbol_5)).y;
+        if ((int(x_82) < 100)) {
+          float const x_89 = x_8.one;
+          b = cos(float3(x_89, x_89, x_89));
+        } else {
+          float const x_93 = (*(tint_symbol_5)).y;
+          if ((int(x_93) < 500)) {
+            b = float3(0.540302277f, 0.540302277f, -0.99996084f);
+          }
+        }
+      }
+    }
+  }
+  float const x_99 = b.x;
+  bool const x_100 = (x_99 < 1.019999981f);
+  x_106_phi = x_100;
+  if (x_100) {
+    float const x_104 = b.y;
+    x_105 = (x_104 < 1.019999981f);
+    x_106_phi = x_105;
+  }
+  bool const x_106 = x_106_phi;
+  x_112_phi = x_106;
+  if (x_106) {
+    float const x_110 = b.z;
+    x_111 = (x_110 < 1.019999981f);
+    x_112_phi = x_111;
+  }
+  bool const x_112 = x_112_phi;
+  if (x_112) {
+    *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_6) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_8, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-set-vector-cos-fragcoord/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-set-vector-cos-fragcoord/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..f4d0f97
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-set-vector-cos-fragcoord/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,229 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 142
+; Schema: 0
+               OpCapability Shader
+         %76 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %x_105 "x_105"
+               OpName %x_111 "x_111"
+               OpName %x_106_phi "x_106_phi"
+               OpName %x_112_phi "x_112_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %21 = OpConstantNull %v2float
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %25 = OpConstantNull %v3float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %29 = OpConstantNull %bool
+    %float_1 = OpConstant %float 1
+         %34 = OpConstantComposite %v2float %float_1 %float_1
+    %float_0 = OpConstant %float 0
+         %36 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+        %int = OpTypeInt 32 1
+     %int_40 = OpConstant %int 40
+%float_0_100000001 = OpConstant %float 0.100000001
+         %50 = OpConstantComposite %v3float %float_0_100000001 %float_0_100000001 %float_0_100000001
+     %int_60 = OpConstant %int 60
+%float_0_200000003 = OpConstant %float 0.200000003
+         %60 = OpConstantComposite %v3float %float_0_200000003 %float_0_200000003 %float_0_200000003
+   %float_80 = OpConstant %float 80
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%float_0_00999999978 = OpConstant %float 0.00999999978
+         %81 = OpConstantComposite %v3float %float_0_00999999978 %float_0_00999999978 %float_0_00999999978
+    %int_100 = OpConstant %int 100
+    %int_500 = OpConstant %int 500
+%float_0_540302277 = OpConstant %float 0.540302277
+%float_n0_99996084 = OpConstant %float -0.99996084
+        %104 = OpConstantComposite %v3float %float_0_540302277 %float_0_540302277 %float_n0_99996084
+%float_1_01999998 = OpConstant %float 1.01999998
+     %uint_2 = OpConstant %uint 2
+        %127 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %128 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+        %129 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+          %a = OpVariable %_ptr_Function_v2float Function %21
+          %b = OpVariable %_ptr_Function_v3float Function %25
+      %x_105 = OpVariable %_ptr_Function_bool Function %29
+      %x_111 = OpVariable %_ptr_Function_bool Function %29
+  %x_106_phi = OpVariable %_ptr_Function_bool Function %29
+  %x_112_phi = OpVariable %_ptr_Function_bool Function %29
+               OpStore %a %34
+               OpStore %b %36
+         %40 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %41 = OpLoad %float %40
+         %42 = OpConvertFToS %int %41
+         %45 = OpSLessThan %bool %42 %int_40
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %48
+         %47 = OpLabel
+               OpStore %b %50
+               OpBranch %46
+         %48 = OpLabel
+         %51 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %52 = OpLoad %float %51
+         %53 = OpConvertFToS %int %52
+         %55 = OpSLessThan %bool %53 %int_60
+               OpSelectionMerge %56 None
+               OpBranchConditional %55 %57 %58
+         %57 = OpLabel
+               OpStore %b %60
+               OpBranch %56
+         %58 = OpLabel
+         %61 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %62 = OpLoad %float %61
+         %64 = OpFOrdLessThan %bool %62 %float_80
+               OpSelectionMerge %65 None
+               OpBranchConditional %64 %66 %67
+         %66 = OpLabel
+         %70 = OpAccessChain %_ptr_Function_float %a %uint_0
+         %71 = OpLoad %float %70
+         %73 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0
+         %74 = OpLoad %float %73
+         %77 = OpCompositeConstruct %v3float %71 %71 %71
+         %78 = OpCompositeConstruct %v3float %74 %74 %74
+         %79 = OpFAdd %v3float %77 %78
+         %75 = OpExtInst %v3float %76 Cos %79
+         %82 = OpFAdd %v3float %75 %81
+               OpStore %b %82
+               OpBranch %65
+         %67 = OpLabel
+         %83 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %84 = OpLoad %float %83
+         %85 = OpConvertFToS %int %84
+         %87 = OpSLessThan %bool %85 %int_100
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %90
+         %89 = OpLabel
+         %91 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0
+         %92 = OpLoad %float %91
+         %94 = OpCompositeConstruct %v3float %92 %92 %92
+         %93 = OpExtInst %v3float %76 Cos %94
+               OpStore %b %93
+               OpBranch %88
+         %90 = OpLabel
+         %95 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %96 = OpLoad %float %95
+         %97 = OpConvertFToS %int %96
+         %99 = OpSLessThan %bool %97 %int_500
+               OpSelectionMerge %100 None
+               OpBranchConditional %99 %101 %100
+        %101 = OpLabel
+               OpStore %b %104
+               OpBranch %100
+        %100 = OpLabel
+               OpBranch %88
+         %88 = OpLabel
+               OpBranch %65
+         %65 = OpLabel
+               OpBranch %56
+         %56 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+        %105 = OpAccessChain %_ptr_Function_float %b %uint_0
+        %106 = OpLoad %float %105
+        %108 = OpFOrdLessThan %bool %106 %float_1_01999998
+               OpStore %x_106_phi %108
+               OpSelectionMerge %109 None
+               OpBranchConditional %108 %110 %109
+        %110 = OpLabel
+        %111 = OpAccessChain %_ptr_Function_float %b %uint_1
+        %112 = OpLoad %float %111
+        %113 = OpFOrdLessThan %bool %112 %float_1_01999998
+               OpStore %x_105 %113
+        %114 = OpLoad %bool %x_105
+               OpStore %x_106_phi %114
+               OpBranch %109
+        %109 = OpLabel
+        %115 = OpLoad %bool %x_106_phi
+               OpStore %x_112_phi %115
+               OpSelectionMerge %116 None
+               OpBranchConditional %115 %117 %116
+        %117 = OpLabel
+        %119 = OpAccessChain %_ptr_Function_float %b %uint_2
+        %120 = OpLoad %float %119
+        %121 = OpFOrdLessThan %bool %120 %float_1_01999998
+               OpStore %x_111 %121
+        %122 = OpLoad %bool %x_111
+               OpStore %x_112_phi %122
+               OpBranch %116
+        %116 = OpLabel
+        %123 = OpLoad %bool %x_112_phi
+               OpSelectionMerge %124 None
+               OpBranchConditional %123 %125 %126
+        %125 = OpLabel
+               OpStore %x_GLF_color %127
+               OpBranch %124
+        %126 = OpLabel
+               OpStore %x_GLF_color %128
+               OpBranch %124
+        %124 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %129
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %133 = OpLabel
+        %134 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %134
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+        %136 = OpLabel
+        %137 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %137
+        %138 = OpFunctionCall %void %main_1
+        %140 = OpLoad %v4float %x_GLF_color
+        %141 = OpCompositeConstruct %main_out %140
+        %139 = OpFunctionCall %void %tint_symbol_3 %141
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-set-vector-cos-fragcoord/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-set-vector-cos-fragcoord/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..017a1d9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-set-vector-cos-fragcoord/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,82 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : vec2<f32>;
+  var b : vec3<f32>;
+  var x_105 : bool;
+  var x_111 : bool;
+  var x_106_phi : bool;
+  var x_112_phi : bool;
+  a = vec2<f32>(1.0, 1.0);
+  b = vec3<f32>(0.0, 0.0, 0.0);
+  let x_52 : f32 = gl_FragCoord.y;
+  if ((i32(x_52) < 40)) {
+    b = vec3<f32>(0.100000001, 0.100000001, 0.100000001);
+  } else {
+    let x_59 : f32 = gl_FragCoord.y;
+    if ((i32(x_59) < 60)) {
+      b = vec3<f32>(0.200000003, 0.200000003, 0.200000003);
+    } else {
+      let x_66 : f32 = gl_FragCoord.y;
+      if ((x_66 < 80.0)) {
+        let x_72 : f32 = a.x;
+        let x_74 : f32 = x_8.one;
+        b = (cos((vec3<f32>(x_72, x_72, x_72) + vec3<f32>(x_74, x_74, x_74))) + vec3<f32>(0.01, 0.01, 0.01));
+      } else {
+        let x_82 : f32 = gl_FragCoord.y;
+        if ((i32(x_82) < 100)) {
+          let x_89 : f32 = x_8.one;
+          b = cos(vec3<f32>(x_89, x_89, x_89));
+        } else {
+          let x_93 : f32 = gl_FragCoord.y;
+          if ((i32(x_93) < 500)) {
+            b = vec3<f32>(0.540302277, 0.540302277, -0.99996084);
+          }
+        }
+      }
+    }
+  }
+  let x_99 : f32 = b.x;
+  let x_100 : bool = (x_99 < 1.019999981);
+  x_106_phi = x_100;
+  if (x_100) {
+    let x_104 : f32 = b.y;
+    x_105 = (x_104 < 1.019999981);
+    x_106_phi = x_105;
+  }
+  let x_106 : bool = x_106_phi;
+  x_112_phi = x_106;
+  if (x_106) {
+    let x_110 : f32 = b.z;
+    x_111 = (x_110 < 1.019999981);
+    x_112_phi = x_111;
+  }
+  let x_112 : bool = x_112_phi;
+  if (x_112) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplification-unused-struct/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplification-unused-struct/0-opt.spvasm
new file mode 100644
index 0000000..0315e97
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplification-unused-struct/0-opt.spvasm
@@ -0,0 +1,180 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %S "S"
+               OpMemberName %S 0 "arr"
+               OpName %func_struct_S_i1_2_1_i1_ "func(struct-S-i1[2]1;i1;"
+               OpName %s "s"
+               OpName %x "x"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %_ ""
+               OpName %a "a"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %s_0 "s"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %S 0 RelaxedPrecision
+               OpDecorate %func_struct_S_i1_2_1_i1_ RelaxedPrecision
+               OpDecorate %x RelaxedPrecision
+               OpDecorate %16 RelaxedPrecision
+               OpDecorate %17 RelaxedPrecision
+               OpMemberDecorate %buf0 0 RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %18 RelaxedPrecision
+               OpDecorate %19 RelaxedPrecision
+               OpDecorate %20 RelaxedPrecision
+               OpDecorate %21 RelaxedPrecision
+               OpDecorate %a RelaxedPrecision
+               OpDecorate %i RelaxedPrecision
+               OpDecorate %22 RelaxedPrecision
+               OpDecorate %23 RelaxedPrecision
+               OpDecorate %24 RelaxedPrecision
+               OpDecorate %j RelaxedPrecision
+               OpDecorate %25 RelaxedPrecision
+               OpDecorate %26 RelaxedPrecision
+               OpDecorate %27 RelaxedPrecision
+               OpDecorate %28 RelaxedPrecision
+               OpDecorate %29 RelaxedPrecision
+               OpDecorate %30 RelaxedPrecision
+               OpDecorate %31 RelaxedPrecision
+               OpDecorate %32 RelaxedPrecision
+               OpDecorate %33 RelaxedPrecision
+               OpDecorate %34 RelaxedPrecision
+               OpDecorate %35 RelaxedPrecision
+               OpDecorate %36 RelaxedPrecision
+               OpDecorate %37 RelaxedPrecision
+               OpDecorate %38 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %40 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+          %S = OpTypeStruct %_arr_int_uint_2
+%_ptr_Function_S = OpTypePointer Function %S
+%_ptr_Function_int = OpTypePointer Function %int
+         %47 = OpTypeFunction %int %_ptr_Function_S %_ptr_Function_int
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+     %int_n1 = OpConstant %int -1
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+     %int_30 = OpConstant %int 30
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %62 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %63 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %40
+         %64 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+          %j = OpVariable %_ptr_Function_int Function
+        %s_0 = OpVariable %_ptr_Function_S Function
+      %param = OpVariable %_ptr_Function_S Function
+    %param_0 = OpVariable %_ptr_Function_int Function
+               OpStore %a %int_0
+               OpStore %i %int_0
+               OpBranch %65
+         %65 = OpLabel
+               OpLoopMerge %66 %67 None
+               OpBranch %68
+         %68 = OpLabel
+         %22 = OpLoad %int %i
+         %69 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %23 = OpLoad %int %69
+         %24 = OpIAdd %int %int_2 %23
+         %70 = OpSLessThan %bool %22 %24
+               OpBranchConditional %70 %71 %66
+         %71 = OpLabel
+               OpStore %j %int_0
+               OpBranch %72
+         %72 = OpLabel
+               OpLoopMerge %73 %74 None
+               OpBranch %75
+         %75 = OpLabel
+         %25 = OpLoad %int %j
+         %76 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %26 = OpLoad %int %76
+         %27 = OpIAdd %int %int_3 %26
+         %77 = OpSLessThan %bool %25 %27
+               OpBranchConditional %77 %78 %73
+         %78 = OpLabel
+         %28 = OpLoad %int %i
+         %29 = OpLoad %int %j
+         %30 = OpIAdd %int %28 %29
+         %79 = OpLoad %S %s_0
+               OpStore %param %79
+               OpStore %param_0 %30
+         %31 = OpFunctionCall %int %func_struct_S_i1_2_1_i1_ %param %param_0
+         %32 = OpLoad %int %a
+         %33 = OpIAdd %int %32 %31
+               OpStore %a %33
+               OpBranch %74
+         %74 = OpLabel
+         %34 = OpLoad %int %j
+         %35 = OpIAdd %int %34 %int_1
+               OpStore %j %35
+               OpBranch %72
+         %73 = OpLabel
+               OpBranch %67
+         %67 = OpLabel
+         %36 = OpLoad %int %i
+         %37 = OpIAdd %int %36 %int_1
+               OpStore %i %37
+               OpBranch %65
+         %66 = OpLabel
+         %38 = OpLoad %int %a
+         %80 = OpIEqual %bool %38 %int_30
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %83
+         %82 = OpLabel
+               OpStore %_GLF_color %62
+               OpBranch %81
+         %83 = OpLabel
+               OpStore %_GLF_color %63
+               OpBranch %81
+         %81 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%func_struct_S_i1_2_1_i1_ = OpFunction %int None %47
+          %s = OpFunctionParameter %_ptr_Function_S
+          %x = OpFunctionParameter %_ptr_Function_int
+         %84 = OpLabel
+         %16 = OpLoad %int %x
+         %17 = OpIAdd %int %16 %int_1
+         %85 = OpAccessChain %_ptr_Function_int %s %int_0 %int_1
+               OpStore %85 %17
+         %86 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %18 = OpLoad %int %86
+         %87 = OpAccessChain %_ptr_Function_int %s %int_0 %18
+         %19 = OpLoad %int %87
+         %20 = OpLoad %int %x
+         %88 = OpIEqual %bool %19 %20
+               OpSelectionMerge %89 None
+               OpBranchConditional %88 %90 %89
+         %90 = OpLabel
+               OpReturnValue %int_n1
+         %89 = OpLabel
+         %21 = OpLoad %int %x
+               OpReturnValue %21
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplification-unused-struct/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-simplification-unused-struct/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..a739821
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplification-unused-struct/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,81 @@
+struct S {
+  int arr[2];
+};
+
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+int func_struct_S_i1_2_1_i1_(inout S s, inout int x) {
+  const int x_16 = x;
+  s.arr[1] = (x_16 + 1);
+  const int x_18 = asint(x_9[0].x);
+  const int x_19 = s.arr[x_18];
+  const int x_20 = x;
+  if ((x_19 == x_20)) {
+    return -1;
+  }
+  const int x_21 = x;
+  return x_21;
+}
+
+void main_1() {
+  int a = 0;
+  int i = 0;
+  int j = 0;
+  S s_1 = (S)0;
+  S param = (S)0;
+  int param_1 = 0;
+  a = 0;
+  i = 0;
+  while (true) {
+    const int x_22 = i;
+    const int x_23 = asint(x_9[0].x);
+    if ((x_22 < (2 + x_23))) {
+    } else {
+      break;
+    }
+    j = 0;
+    while (true) {
+      const int x_25 = j;
+      const int x_26 = asint(x_9[0].x);
+      if ((x_25 < (3 + x_26))) {
+      } else {
+        break;
+      }
+      const int x_28 = i;
+      const int x_29 = j;
+      param = s_1;
+      param_1 = (x_28 + x_29);
+      const int x_31 = func_struct_S_i1_2_1_i1_(param, param_1);
+      a = (a + x_31);
+      {
+        j = (j + 1);
+      }
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  if ((a == 30)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplification-unused-struct/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-simplification-unused-struct/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..5852dfa
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplification-unused-struct/0-opt.spvasm.expected.msl
@@ -0,0 +1,91 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  int arr[2];
+};
+struct S {
+  tint_array_wrapper arr;
+};
+struct buf0 {
+  /* 0x0000 */ int one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int func_struct_S_i1_2_1_i1_(constant buf0& x_9, thread S* const s, thread int* const x) {
+  int const x_16 = *(x);
+  (*(s)).arr.arr[1] = (x_16 + 1);
+  int const x_18 = x_9.one;
+  int const x_19 = (*(s)).arr.arr[x_18];
+  int const x_20 = *(x);
+  if ((x_19 == x_20)) {
+    return -1;
+  }
+  int const x_21 = *(x);
+  return x_21;
+}
+
+void main_1(constant buf0& x_9, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int i = 0;
+  int j = 0;
+  S s_1 = {};
+  S param = {};
+  int param_1 = 0;
+  a = 0;
+  i = 0;
+  while (true) {
+    int const x_22 = i;
+    int const x_23 = x_9.one;
+    if ((x_22 < (2 + x_23))) {
+    } else {
+      break;
+    }
+    j = 0;
+    while (true) {
+      int const x_25 = j;
+      int const x_26 = x_9.one;
+      if ((x_25 < (3 + x_26))) {
+      } else {
+        break;
+      }
+      int const x_28 = i;
+      int const x_29 = j;
+      S const x_79 = s_1;
+      param = x_79;
+      param_1 = (x_28 + x_29);
+      int const x_31 = func_struct_S_i1_2_1_i1_(x_9, &(param), &(param_1));
+      int const x_32 = a;
+      a = (x_32 + x_31);
+      {
+        int const x_34 = j;
+        j = (x_34 + 1);
+      }
+    }
+    {
+      int const x_36 = i;
+      i = (x_36 + 1);
+    }
+  }
+  int const x_38 = a;
+  if ((x_38 == 30)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplification-unused-struct/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplification-unused-struct/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..7b4e7d4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplification-unused-struct/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,196 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 119
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %S "S"
+               OpMemberName %S 0 "arr"
+               OpName %func_struct_S_i1_2_1_i1_ "func_struct_S_i1_2_1_i1_"
+               OpName %s "s"
+               OpName %x "x"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %s_1 "s_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+          %S = OpTypeStruct %_arr_int_uint_2
+%_ptr_Function_S = OpTypePointer Function %S
+%_ptr_Function_int = OpTypePointer Function %int
+         %12 = OpTypeFunction %int %_ptr_Function_S %_ptr_Function_int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+     %int_n1 = OpConstant %int -1
+       %void = OpTypeVoid
+         %45 = OpTypeFunction %void
+         %50 = OpConstantNull %int
+         %54 = OpConstantNull %S
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+     %int_30 = OpConstant %int 30
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+        %105 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %106 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+        %107 = OpTypeFunction %void %main_out
+%func_struct_S_i1_2_1_i1_ = OpFunction %int None %12
+          %s = OpFunctionParameter %_ptr_Function_S
+          %x = OpFunctionParameter %_ptr_Function_int
+         %22 = OpLabel
+         %24 = OpLoad %int %x
+         %28 = OpAccessChain %_ptr_Function_int %s %uint_0 %int_1
+         %29 = OpIAdd %int %24 %int_1
+               OpStore %28 %29
+         %31 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0
+         %32 = OpLoad %int %31
+         %34 = OpAccessChain %_ptr_Function_int %s %uint_0 %32
+         %35 = OpLoad %int %34
+         %37 = OpLoad %int %x
+         %38 = OpIEqual %bool %35 %37
+               OpSelectionMerge %40 None
+               OpBranchConditional %38 %41 %40
+         %41 = OpLabel
+               OpReturnValue %int_n1
+         %40 = OpLabel
+         %44 = OpLoad %int %x
+               OpReturnValue %44
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %45
+         %48 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %50
+          %i = OpVariable %_ptr_Function_int Function %50
+          %j = OpVariable %_ptr_Function_int Function %50
+        %s_1 = OpVariable %_ptr_Function_S Function %54
+      %param = OpVariable %_ptr_Function_S Function %54
+    %param_1 = OpVariable %_ptr_Function_int Function %50
+               OpStore %a %int_0
+               OpStore %i %int_0
+               OpBranch %58
+         %58 = OpLabel
+               OpLoopMerge %59 %60 None
+               OpBranch %61
+         %61 = OpLabel
+         %62 = OpLoad %int %i
+         %63 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0
+         %64 = OpLoad %int %63
+         %66 = OpIAdd %int %int_2 %64
+         %67 = OpSLessThan %bool %62 %66
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %70
+         %69 = OpLabel
+               OpBranch %68
+         %70 = OpLabel
+               OpBranch %59
+         %68 = OpLabel
+               OpStore %j %int_0
+               OpBranch %71
+         %71 = OpLabel
+               OpLoopMerge %72 %73 None
+               OpBranch %74
+         %74 = OpLabel
+         %75 = OpLoad %int %j
+         %76 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0
+         %77 = OpLoad %int %76
+         %79 = OpIAdd %int %int_3 %77
+         %80 = OpSLessThan %bool %75 %79
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %83
+         %82 = OpLabel
+               OpBranch %81
+         %83 = OpLabel
+               OpBranch %72
+         %81 = OpLabel
+         %84 = OpLoad %int %i
+         %85 = OpLoad %int %j
+         %86 = OpLoad %S %s_1
+               OpStore %param %86
+         %87 = OpIAdd %int %84 %85
+               OpStore %param_1 %87
+         %88 = OpFunctionCall %int %func_struct_S_i1_2_1_i1_ %param %param_1
+         %91 = OpLoad %int %a
+         %92 = OpIAdd %int %91 %88
+               OpStore %a %92
+               OpBranch %73
+         %73 = OpLabel
+         %93 = OpLoad %int %j
+         %94 = OpIAdd %int %93 %int_1
+               OpStore %j %94
+               OpBranch %71
+         %72 = OpLabel
+               OpBranch %60
+         %60 = OpLabel
+         %95 = OpLoad %int %i
+         %96 = OpIAdd %int %95 %int_1
+               OpStore %i %96
+               OpBranch %58
+         %59 = OpLabel
+         %97 = OpLoad %int %a
+         %99 = OpIEqual %bool %97 %int_30
+               OpSelectionMerge %100 None
+               OpBranchConditional %99 %101 %102
+        %101 = OpLabel
+               OpStore %x_GLF_color %105
+               OpBranch %100
+        %102 = OpLabel
+               OpStore %x_GLF_color %106
+               OpBranch %100
+        %100 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %107
+%tint_symbol = OpFunctionParameter %main_out
+        %111 = OpLabel
+        %112 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %112
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %45
+        %114 = OpLabel
+        %115 = OpFunctionCall %void %main_1
+        %117 = OpLoad %v4float %x_GLF_color
+        %118 = OpCompositeConstruct %main_out %117
+        %116 = OpFunctionCall %void %tint_symbol_2 %118
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplification-unused-struct/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplification-unused-struct/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..ddc01d1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplification-unused-struct/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,89 @@
+struct S {
+  arr : array<i32, 2>;
+};
+
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_struct_S_i1_2_1_i1_(s : ptr<function, S>, x : ptr<function, i32>) -> i32 {
+  let x_16 : i32 = *(x);
+  (*(s)).arr[1] = (x_16 + 1);
+  let x_18 : i32 = x_9.one;
+  let x_19 : i32 = (*(s)).arr[x_18];
+  let x_20 : i32 = *(x);
+  if ((x_19 == x_20)) {
+    return -1;
+  }
+  let x_21 : i32 = *(x);
+  return x_21;
+}
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  var j : i32;
+  var s_1 : S;
+  var param : S;
+  var param_1 : i32;
+  a = 0;
+  i = 0;
+  loop {
+    let x_22 : i32 = i;
+    let x_23 : i32 = x_9.one;
+    if ((x_22 < (2 + x_23))) {
+    } else {
+      break;
+    }
+    j = 0;
+    loop {
+      let x_25 : i32 = j;
+      let x_26 : i32 = x_9.one;
+      if ((x_25 < (3 + x_26))) {
+      } else {
+        break;
+      }
+      let x_28 : i32 = i;
+      let x_29 : i32 = j;
+      let x_79 : S = s_1;
+      param = x_79;
+      param_1 = (x_28 + x_29);
+      let x_31 : i32 = func_struct_S_i1_2_1_i1_(&(param), &(param_1));
+      let x_32 : i32 = a;
+      a = (x_32 + x_31);
+
+      continuing {
+        let x_34 : i32 = j;
+        j = (x_34 + 1);
+      }
+    }
+
+    continuing {
+      let x_36 : i32 = i;
+      i = (x_36 + 1);
+    }
+  }
+  let x_38 : i32 = a;
+  if ((x_38 == 30)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplification-unused-struct/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplification-unused-struct/0-opt.wgsl
new file mode 100644
index 0000000..ddc01d1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplification-unused-struct/0-opt.wgsl
@@ -0,0 +1,89 @@
+struct S {
+  arr : array<i32, 2>;
+};
+
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_struct_S_i1_2_1_i1_(s : ptr<function, S>, x : ptr<function, i32>) -> i32 {
+  let x_16 : i32 = *(x);
+  (*(s)).arr[1] = (x_16 + 1);
+  let x_18 : i32 = x_9.one;
+  let x_19 : i32 = (*(s)).arr[x_18];
+  let x_20 : i32 = *(x);
+  if ((x_19 == x_20)) {
+    return -1;
+  }
+  let x_21 : i32 = *(x);
+  return x_21;
+}
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  var j : i32;
+  var s_1 : S;
+  var param : S;
+  var param_1 : i32;
+  a = 0;
+  i = 0;
+  loop {
+    let x_22 : i32 = i;
+    let x_23 : i32 = x_9.one;
+    if ((x_22 < (2 + x_23))) {
+    } else {
+      break;
+    }
+    j = 0;
+    loop {
+      let x_25 : i32 = j;
+      let x_26 : i32 = x_9.one;
+      if ((x_25 < (3 + x_26))) {
+      } else {
+        break;
+      }
+      let x_28 : i32 = i;
+      let x_29 : i32 = j;
+      let x_79 : S = s_1;
+      param = x_79;
+      param_1 = (x_28 + x_29);
+      let x_31 : i32 = func_struct_S_i1_2_1_i1_(&(param), &(param_1));
+      let x_32 : i32 = a;
+      a = (x_32 + x_31);
+
+      continuing {
+        let x_34 : i32 = j;
+        j = (x_34 + 1);
+      }
+    }
+
+    continuing {
+      let x_36 : i32 = i;
+      i = (x_36 + 1);
+    }
+  }
+  let x_38 : i32 = a;
+  if ((x_38 == 30)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplification-unused-struct/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-simplification-unused-struct/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..a739821
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplification-unused-struct/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,81 @@
+struct S {
+  int arr[2];
+};
+
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+int func_struct_S_i1_2_1_i1_(inout S s, inout int x) {
+  const int x_16 = x;
+  s.arr[1] = (x_16 + 1);
+  const int x_18 = asint(x_9[0].x);
+  const int x_19 = s.arr[x_18];
+  const int x_20 = x;
+  if ((x_19 == x_20)) {
+    return -1;
+  }
+  const int x_21 = x;
+  return x_21;
+}
+
+void main_1() {
+  int a = 0;
+  int i = 0;
+  int j = 0;
+  S s_1 = (S)0;
+  S param = (S)0;
+  int param_1 = 0;
+  a = 0;
+  i = 0;
+  while (true) {
+    const int x_22 = i;
+    const int x_23 = asint(x_9[0].x);
+    if ((x_22 < (2 + x_23))) {
+    } else {
+      break;
+    }
+    j = 0;
+    while (true) {
+      const int x_25 = j;
+      const int x_26 = asint(x_9[0].x);
+      if ((x_25 < (3 + x_26))) {
+      } else {
+        break;
+      }
+      const int x_28 = i;
+      const int x_29 = j;
+      param = s_1;
+      param_1 = (x_28 + x_29);
+      const int x_31 = func_struct_S_i1_2_1_i1_(param, param_1);
+      a = (a + x_31);
+      {
+        j = (j + 1);
+      }
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  if ((a == 30)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplification-unused-struct/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-simplification-unused-struct/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..5852dfa
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplification-unused-struct/0-opt.wgsl.expected.msl
@@ -0,0 +1,91 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  int arr[2];
+};
+struct S {
+  tint_array_wrapper arr;
+};
+struct buf0 {
+  /* 0x0000 */ int one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int func_struct_S_i1_2_1_i1_(constant buf0& x_9, thread S* const s, thread int* const x) {
+  int const x_16 = *(x);
+  (*(s)).arr.arr[1] = (x_16 + 1);
+  int const x_18 = x_9.one;
+  int const x_19 = (*(s)).arr.arr[x_18];
+  int const x_20 = *(x);
+  if ((x_19 == x_20)) {
+    return -1;
+  }
+  int const x_21 = *(x);
+  return x_21;
+}
+
+void main_1(constant buf0& x_9, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int i = 0;
+  int j = 0;
+  S s_1 = {};
+  S param = {};
+  int param_1 = 0;
+  a = 0;
+  i = 0;
+  while (true) {
+    int const x_22 = i;
+    int const x_23 = x_9.one;
+    if ((x_22 < (2 + x_23))) {
+    } else {
+      break;
+    }
+    j = 0;
+    while (true) {
+      int const x_25 = j;
+      int const x_26 = x_9.one;
+      if ((x_25 < (3 + x_26))) {
+      } else {
+        break;
+      }
+      int const x_28 = i;
+      int const x_29 = j;
+      S const x_79 = s_1;
+      param = x_79;
+      param_1 = (x_28 + x_29);
+      int const x_31 = func_struct_S_i1_2_1_i1_(x_9, &(param), &(param_1));
+      int const x_32 = a;
+      a = (x_32 + x_31);
+      {
+        int const x_34 = j;
+        j = (x_34 + 1);
+      }
+    }
+    {
+      int const x_36 = i;
+      i = (x_36 + 1);
+    }
+  }
+  int const x_38 = a;
+  if ((x_38 == 30)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplification-unused-struct/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplification-unused-struct/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..7b4e7d4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplification-unused-struct/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,196 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 119
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %S "S"
+               OpMemberName %S 0 "arr"
+               OpName %func_struct_S_i1_2_1_i1_ "func_struct_S_i1_2_1_i1_"
+               OpName %s "s"
+               OpName %x "x"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %s_1 "s_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+          %S = OpTypeStruct %_arr_int_uint_2
+%_ptr_Function_S = OpTypePointer Function %S
+%_ptr_Function_int = OpTypePointer Function %int
+         %12 = OpTypeFunction %int %_ptr_Function_S %_ptr_Function_int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+     %int_n1 = OpConstant %int -1
+       %void = OpTypeVoid
+         %45 = OpTypeFunction %void
+         %50 = OpConstantNull %int
+         %54 = OpConstantNull %S
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+     %int_30 = OpConstant %int 30
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+        %105 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %106 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+        %107 = OpTypeFunction %void %main_out
+%func_struct_S_i1_2_1_i1_ = OpFunction %int None %12
+          %s = OpFunctionParameter %_ptr_Function_S
+          %x = OpFunctionParameter %_ptr_Function_int
+         %22 = OpLabel
+         %24 = OpLoad %int %x
+         %28 = OpAccessChain %_ptr_Function_int %s %uint_0 %int_1
+         %29 = OpIAdd %int %24 %int_1
+               OpStore %28 %29
+         %31 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0
+         %32 = OpLoad %int %31
+         %34 = OpAccessChain %_ptr_Function_int %s %uint_0 %32
+         %35 = OpLoad %int %34
+         %37 = OpLoad %int %x
+         %38 = OpIEqual %bool %35 %37
+               OpSelectionMerge %40 None
+               OpBranchConditional %38 %41 %40
+         %41 = OpLabel
+               OpReturnValue %int_n1
+         %40 = OpLabel
+         %44 = OpLoad %int %x
+               OpReturnValue %44
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %45
+         %48 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %50
+          %i = OpVariable %_ptr_Function_int Function %50
+          %j = OpVariable %_ptr_Function_int Function %50
+        %s_1 = OpVariable %_ptr_Function_S Function %54
+      %param = OpVariable %_ptr_Function_S Function %54
+    %param_1 = OpVariable %_ptr_Function_int Function %50
+               OpStore %a %int_0
+               OpStore %i %int_0
+               OpBranch %58
+         %58 = OpLabel
+               OpLoopMerge %59 %60 None
+               OpBranch %61
+         %61 = OpLabel
+         %62 = OpLoad %int %i
+         %63 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0
+         %64 = OpLoad %int %63
+         %66 = OpIAdd %int %int_2 %64
+         %67 = OpSLessThan %bool %62 %66
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %70
+         %69 = OpLabel
+               OpBranch %68
+         %70 = OpLabel
+               OpBranch %59
+         %68 = OpLabel
+               OpStore %j %int_0
+               OpBranch %71
+         %71 = OpLabel
+               OpLoopMerge %72 %73 None
+               OpBranch %74
+         %74 = OpLabel
+         %75 = OpLoad %int %j
+         %76 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0
+         %77 = OpLoad %int %76
+         %79 = OpIAdd %int %int_3 %77
+         %80 = OpSLessThan %bool %75 %79
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %83
+         %82 = OpLabel
+               OpBranch %81
+         %83 = OpLabel
+               OpBranch %72
+         %81 = OpLabel
+         %84 = OpLoad %int %i
+         %85 = OpLoad %int %j
+         %86 = OpLoad %S %s_1
+               OpStore %param %86
+         %87 = OpIAdd %int %84 %85
+               OpStore %param_1 %87
+         %88 = OpFunctionCall %int %func_struct_S_i1_2_1_i1_ %param %param_1
+         %91 = OpLoad %int %a
+         %92 = OpIAdd %int %91 %88
+               OpStore %a %92
+               OpBranch %73
+         %73 = OpLabel
+         %93 = OpLoad %int %j
+         %94 = OpIAdd %int %93 %int_1
+               OpStore %j %94
+               OpBranch %71
+         %72 = OpLabel
+               OpBranch %60
+         %60 = OpLabel
+         %95 = OpLoad %int %i
+         %96 = OpIAdd %int %95 %int_1
+               OpStore %i %96
+               OpBranch %58
+         %59 = OpLabel
+         %97 = OpLoad %int %a
+         %99 = OpIEqual %bool %97 %int_30
+               OpSelectionMerge %100 None
+               OpBranchConditional %99 %101 %102
+        %101 = OpLabel
+               OpStore %x_GLF_color %105
+               OpBranch %100
+        %102 = OpLabel
+               OpStore %x_GLF_color %106
+               OpBranch %100
+        %100 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %107
+%tint_symbol = OpFunctionParameter %main_out
+        %111 = OpLabel
+        %112 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %112
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %45
+        %114 = OpLabel
+        %115 = OpFunctionCall %void %main_1
+        %117 = OpLoad %v4float %x_GLF_color
+        %118 = OpCompositeConstruct %main_out %117
+        %116 = OpFunctionCall %void %tint_symbol_2 %118
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplification-unused-struct/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplification-unused-struct/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..ddc01d1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplification-unused-struct/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,89 @@
+struct S {
+  arr : array<i32, 2>;
+};
+
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_struct_S_i1_2_1_i1_(s : ptr<function, S>, x : ptr<function, i32>) -> i32 {
+  let x_16 : i32 = *(x);
+  (*(s)).arr[1] = (x_16 + 1);
+  let x_18 : i32 = x_9.one;
+  let x_19 : i32 = (*(s)).arr[x_18];
+  let x_20 : i32 = *(x);
+  if ((x_19 == x_20)) {
+    return -1;
+  }
+  let x_21 : i32 = *(x);
+  return x_21;
+}
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  var j : i32;
+  var s_1 : S;
+  var param : S;
+  var param_1 : i32;
+  a = 0;
+  i = 0;
+  loop {
+    let x_22 : i32 = i;
+    let x_23 : i32 = x_9.one;
+    if ((x_22 < (2 + x_23))) {
+    } else {
+      break;
+    }
+    j = 0;
+    loop {
+      let x_25 : i32 = j;
+      let x_26 : i32 = x_9.one;
+      if ((x_25 < (3 + x_26))) {
+      } else {
+        break;
+      }
+      let x_28 : i32 = i;
+      let x_29 : i32 = j;
+      let x_79 : S = s_1;
+      param = x_79;
+      param_1 = (x_28 + x_29);
+      let x_31 : i32 = func_struct_S_i1_2_1_i1_(&(param), &(param_1));
+      let x_32 : i32 = a;
+      a = (x_32 + x_31);
+
+      continuing {
+        let x_34 : i32 = j;
+        j = (x_34 + 1);
+      }
+    }
+
+    continuing {
+      let x_36 : i32 = i;
+      i = (x_36 + 1);
+    }
+  }
+  let x_38 : i32 = a;
+  if ((x_38 == 30)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplification-while-inside-for/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplification-while-inside-for/0-opt.spvasm
new file mode 100644
index 0000000..4e856bf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplification-while-inside-for/0-opt.spvasm
@@ -0,0 +1,106 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpName %i "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %_ ""
+               OpName %v "v"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "zero"
+               OpName %__0 ""
+               OpDecorate %_GLF_color Location 0
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %16 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+         %25 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %false = OpConstantFalse %bool
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %buf1 = OpTypeStruct %int
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_float = OpTypePointer Function %float
+%_ptr_Output_float = OpTypePointer Output %float
+       %main = OpFunction %void None %11
+         %33 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+          %v = OpVariable %_ptr_Function_v4float Function
+               OpStore %_GLF_color %16
+               OpStore %i %int_0
+               OpBranch %34
+         %34 = OpLabel
+               OpLoopMerge %35 %36 None
+               OpBranch %37
+         %37 = OpLabel
+         %38 = OpLoad %int %i
+         %39 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %40 = OpLoad %int %39
+         %41 = OpSLessThan %bool %38 %40
+               OpBranchConditional %41 %42 %35
+         %42 = OpLabel
+               OpBranch %43
+         %43 = OpLabel
+               OpLoopMerge %44 %45 None
+               OpBranch %46
+         %46 = OpLabel
+         %47 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %48 = OpLoad %int %47
+         %49 = OpIEqual %bool %48 %int_1
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %50
+         %51 = OpLabel
+               OpStore %_GLF_color %25
+               OpBranch %50
+         %50 = OpLabel
+               OpBranch %45
+         %45 = OpLabel
+               OpBranchConditional %false %43 %44
+         %44 = OpLabel
+               OpBranch %36
+         %36 = OpLabel
+         %52 = OpLoad %int %i
+         %53 = OpIAdd %int %52 %int_1
+               OpStore %i %53
+               OpBranch %34
+         %35 = OpLabel
+         %54 = OpAccessChain %_ptr_Uniform_int %__0 %int_0
+         %55 = OpLoad %int %54
+         %56 = OpConvertSToF %float %55
+         %57 = OpAccessChain %_ptr_Function_float %v %uint_1
+               OpStore %57 %56
+         %58 = OpAccessChain %_ptr_Function_float %v %uint_1
+         %59 = OpLoad %float %58
+         %60 = OpAccessChain %_ptr_Output_float %_GLF_color %uint_1
+               OpStore %60 %59
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplification-while-inside-for/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-simplification-while-inside-for/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..3cc04e2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplification-while-inside-for/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,56 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+cbuffer cbuffer_x_9 : register(b1, space0) {
+  uint4 x_9[1];
+};
+
+void main_1() {
+  int i = 0;
+  float4 v = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  i = 0;
+  while (true) {
+    const int x_38 = i;
+    const int x_40 = asint(x_6[0].x);
+    if ((x_38 < x_40)) {
+    } else {
+      break;
+    }
+    while (true) {
+      const int x_48 = asint(x_6[0].x);
+      if ((x_48 == 1)) {
+        x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+      }
+      {
+        if (false) {
+        } else {
+          break;
+        }
+      }
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_55 = asint(x_9[0].x);
+  v.y = float(x_55);
+  const float x_59 = v.y;
+  x_GLF_color.y = x_59;
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplification-while-inside-for/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-simplification-while-inside-for/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..5e8b3f9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplification-while-inside-for/0-opt.spvasm.expected.msl
@@ -0,0 +1,60 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int one;
+};
+struct buf1 {
+  /* 0x0000 */ int zero;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_9, thread float4* const tint_symbol_4) {
+  int i = 0;
+  float4 v = 0.0f;
+  *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  i = 0;
+  while (true) {
+    int const x_38 = i;
+    int const x_40 = x_6.one;
+    if ((x_38 < x_40)) {
+    } else {
+      break;
+    }
+    while (true) {
+      int const x_48 = x_6.one;
+      if ((x_48 == 1)) {
+        *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+      }
+      {
+        if (false) {
+        } else {
+          break;
+        }
+      }
+    }
+    {
+      int const x_52 = i;
+      i = (x_52 + 1);
+    }
+  }
+  int const x_55 = x_9.zero;
+  v.y = float(x_55);
+  float const x_59 = v.y;
+  (*(tint_symbol_4)).y = x_59;
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_9 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplification-while-inside-for/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplification-while-inside-for/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..527ce2e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplification-while-inside-for/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,157 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 82
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "zero"
+               OpName %x_9 "x_9"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %v "v"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+       %buf1 = OpTypeStruct %int
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_9 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+    %float_0 = OpConstant %float 0
+         %25 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+         %53 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %false = OpConstantFalse %bool
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_float = OpTypePointer Function %float
+%_ptr_Private_float = OpTypePointer Private %float
+   %main_out = OpTypeStruct %v4float
+         %70 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %21
+          %v = OpVariable %_ptr_Function_v4float Function %5
+               OpStore %x_GLF_color %25
+               OpStore %i %int_0
+               OpBranch %27
+         %27 = OpLabel
+               OpLoopMerge %28 %29 None
+               OpBranch %30
+         %30 = OpLabel
+         %31 = OpLoad %int %i
+         %35 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0
+         %36 = OpLoad %int %35
+         %37 = OpSLessThan %bool %31 %36
+               OpSelectionMerge %39 None
+               OpBranchConditional %37 %40 %41
+         %40 = OpLabel
+               OpBranch %39
+         %41 = OpLabel
+               OpBranch %28
+         %39 = OpLabel
+               OpBranch %42
+         %42 = OpLabel
+               OpLoopMerge %43 %44 None
+               OpBranch %45
+         %45 = OpLabel
+         %46 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0
+         %47 = OpLoad %int %46
+         %49 = OpIEqual %bool %47 %int_1
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %50
+         %51 = OpLabel
+               OpStore %x_GLF_color %53
+               OpBranch %50
+         %50 = OpLabel
+               OpBranch %44
+         %44 = OpLabel
+               OpSelectionMerge %55 None
+               OpBranchConditional %false %56 %57
+         %56 = OpLabel
+               OpBranch %55
+         %57 = OpLabel
+               OpBranch %43
+         %55 = OpLabel
+               OpBranch %42
+         %43 = OpLabel
+               OpBranch %29
+         %29 = OpLabel
+         %58 = OpLoad %int %i
+         %59 = OpIAdd %int %58 %int_1
+               OpStore %i %59
+               OpBranch %27
+         %28 = OpLabel
+         %60 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0
+         %61 = OpLoad %int %60
+         %64 = OpAccessChain %_ptr_Function_float %v %uint_1
+         %65 = OpConvertSToF %float %61
+               OpStore %64 %65
+         %66 = OpAccessChain %_ptr_Function_float %v %uint_1
+         %67 = OpLoad %float %66
+         %69 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_1
+               OpStore %69 %67
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %70
+%tint_symbol = OpFunctionParameter %main_out
+         %74 = OpLabel
+         %75 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %75
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %77 = OpLabel
+         %78 = OpFunctionCall %void %main_1
+         %80 = OpLoad %v4float %x_GLF_color
+         %81 = OpCompositeConstruct %main_out %80
+         %79 = OpFunctionCall %void %tint_symbol_2 %81
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 44[%44] is not post dominated by the back-edge block 55[%55]
+  %55 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplification-while-inside-for/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplification-while-inside-for/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..19c0780
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplification-while-inside-for/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,64 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[block]]
+struct buf1 {
+  zero : i32;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+fn main_1() {
+  var i : i32;
+  var v : vec4<f32>;
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  i = 0;
+  loop {
+    let x_38 : i32 = i;
+    let x_40 : i32 = x_6.one;
+    if ((x_38 < x_40)) {
+    } else {
+      break;
+    }
+    loop {
+      let x_48 : i32 = x_6.one;
+      if ((x_48 == 1)) {
+        x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+      }
+
+      continuing {
+        if (false) {
+        } else {
+          break;
+        }
+      }
+    }
+
+    continuing {
+      let x_52 : i32 = i;
+      i = (x_52 + 1);
+    }
+  }
+  let x_55 : i32 = x_9.zero;
+  v.y = f32(x_55);
+  let x_59 : f32 = v.y;
+  x_GLF_color.y = x_59;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplification-while-inside-for/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplification-while-inside-for/0-opt.wgsl
new file mode 100644
index 0000000..19c0780
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplification-while-inside-for/0-opt.wgsl
@@ -0,0 +1,64 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[block]]
+struct buf1 {
+  zero : i32;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+fn main_1() {
+  var i : i32;
+  var v : vec4<f32>;
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  i = 0;
+  loop {
+    let x_38 : i32 = i;
+    let x_40 : i32 = x_6.one;
+    if ((x_38 < x_40)) {
+    } else {
+      break;
+    }
+    loop {
+      let x_48 : i32 = x_6.one;
+      if ((x_48 == 1)) {
+        x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+      }
+
+      continuing {
+        if (false) {
+        } else {
+          break;
+        }
+      }
+    }
+
+    continuing {
+      let x_52 : i32 = i;
+      i = (x_52 + 1);
+    }
+  }
+  let x_55 : i32 = x_9.zero;
+  v.y = f32(x_55);
+  let x_59 : f32 = v.y;
+  x_GLF_color.y = x_59;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplification-while-inside-for/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-simplification-while-inside-for/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..3cc04e2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplification-while-inside-for/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,56 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+cbuffer cbuffer_x_9 : register(b1, space0) {
+  uint4 x_9[1];
+};
+
+void main_1() {
+  int i = 0;
+  float4 v = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  i = 0;
+  while (true) {
+    const int x_38 = i;
+    const int x_40 = asint(x_6[0].x);
+    if ((x_38 < x_40)) {
+    } else {
+      break;
+    }
+    while (true) {
+      const int x_48 = asint(x_6[0].x);
+      if ((x_48 == 1)) {
+        x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+      }
+      {
+        if (false) {
+        } else {
+          break;
+        }
+      }
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_55 = asint(x_9[0].x);
+  v.y = float(x_55);
+  const float x_59 = v.y;
+  x_GLF_color.y = x_59;
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplification-while-inside-for/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-simplification-while-inside-for/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..5e8b3f9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplification-while-inside-for/0-opt.wgsl.expected.msl
@@ -0,0 +1,60 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int one;
+};
+struct buf1 {
+  /* 0x0000 */ int zero;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_9, thread float4* const tint_symbol_4) {
+  int i = 0;
+  float4 v = 0.0f;
+  *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  i = 0;
+  while (true) {
+    int const x_38 = i;
+    int const x_40 = x_6.one;
+    if ((x_38 < x_40)) {
+    } else {
+      break;
+    }
+    while (true) {
+      int const x_48 = x_6.one;
+      if ((x_48 == 1)) {
+        *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+      }
+      {
+        if (false) {
+        } else {
+          break;
+        }
+      }
+    }
+    {
+      int const x_52 = i;
+      i = (x_52 + 1);
+    }
+  }
+  int const x_55 = x_9.zero;
+  v.y = float(x_55);
+  float const x_59 = v.y;
+  (*(tint_symbol_4)).y = x_59;
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_9 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplification-while-inside-for/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplification-while-inside-for/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..527ce2e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplification-while-inside-for/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,157 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 82
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "zero"
+               OpName %x_9 "x_9"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %v "v"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+       %buf1 = OpTypeStruct %int
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_9 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+    %float_0 = OpConstant %float 0
+         %25 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+         %53 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %false = OpConstantFalse %bool
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_float = OpTypePointer Function %float
+%_ptr_Private_float = OpTypePointer Private %float
+   %main_out = OpTypeStruct %v4float
+         %70 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %21
+          %v = OpVariable %_ptr_Function_v4float Function %5
+               OpStore %x_GLF_color %25
+               OpStore %i %int_0
+               OpBranch %27
+         %27 = OpLabel
+               OpLoopMerge %28 %29 None
+               OpBranch %30
+         %30 = OpLabel
+         %31 = OpLoad %int %i
+         %35 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0
+         %36 = OpLoad %int %35
+         %37 = OpSLessThan %bool %31 %36
+               OpSelectionMerge %39 None
+               OpBranchConditional %37 %40 %41
+         %40 = OpLabel
+               OpBranch %39
+         %41 = OpLabel
+               OpBranch %28
+         %39 = OpLabel
+               OpBranch %42
+         %42 = OpLabel
+               OpLoopMerge %43 %44 None
+               OpBranch %45
+         %45 = OpLabel
+         %46 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0
+         %47 = OpLoad %int %46
+         %49 = OpIEqual %bool %47 %int_1
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %50
+         %51 = OpLabel
+               OpStore %x_GLF_color %53
+               OpBranch %50
+         %50 = OpLabel
+               OpBranch %44
+         %44 = OpLabel
+               OpSelectionMerge %55 None
+               OpBranchConditional %false %56 %57
+         %56 = OpLabel
+               OpBranch %55
+         %57 = OpLabel
+               OpBranch %43
+         %55 = OpLabel
+               OpBranch %42
+         %43 = OpLabel
+               OpBranch %29
+         %29 = OpLabel
+         %58 = OpLoad %int %i
+         %59 = OpIAdd %int %58 %int_1
+               OpStore %i %59
+               OpBranch %27
+         %28 = OpLabel
+         %60 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0
+         %61 = OpLoad %int %60
+         %64 = OpAccessChain %_ptr_Function_float %v %uint_1
+         %65 = OpConvertSToF %float %61
+               OpStore %64 %65
+         %66 = OpAccessChain %_ptr_Function_float %v %uint_1
+         %67 = OpLoad %float %66
+         %69 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_1
+               OpStore %69 %67
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %70
+%tint_symbol = OpFunctionParameter %main_out
+         %74 = OpLabel
+         %75 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %75
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %77 = OpLabel
+         %78 = OpFunctionCall %void %main_1
+         %80 = OpLoad %v4float %x_GLF_color
+         %81 = OpCompositeConstruct %main_out %80
+         %79 = OpFunctionCall %void %tint_symbol_2 %81
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 44[%44] is not post dominated by the back-edge block 55[%55]
+  %55 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplification-while-inside-for/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplification-while-inside-for/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..19c0780
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplification-while-inside-for/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,64 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[block]]
+struct buf1 {
+  zero : i32;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+fn main_1() {
+  var i : i32;
+  var v : vec4<f32>;
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  i = 0;
+  loop {
+    let x_38 : i32 = i;
+    let x_40 : i32 = x_6.one;
+    if ((x_38 < x_40)) {
+    } else {
+      break;
+    }
+    loop {
+      let x_48 : i32 = x_6.one;
+      if ((x_48 == 1)) {
+        x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+      }
+
+      continuing {
+        if (false) {
+        } else {
+          break;
+        }
+      }
+    }
+
+    continuing {
+      let x_52 : i32 = i;
+      i = (x_52 + 1);
+    }
+  }
+  let x_55 : i32 = x_9.zero;
+  v.y = f32(x_55);
+  let x_59 : f32 = v.y;
+  x_GLF_color.y = x_59;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.spvasm
new file mode 100644
index 0000000..2eb7b2e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.spvasm
@@ -0,0 +1,121 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "sequence"
+               OpName %_ ""
+               OpName %sum "sum"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %v4int = OpTypeVector %int 4
+%_ptr_Function_v4int = OpTypePointer Function %v4int
+      %int_0 = OpConstant %int 0
+         %15 = OpConstantComposite %v4int %int_0 %int_0 %int_0 %int_0
+%_ptr_Function_int = OpTypePointer Function %int
+       %buf0 = OpTypeStruct %v4int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+     %uint_0 = OpConstant %uint 0
+      %int_5 = OpConstant %int 5
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+     %int_10 = OpConstant %int 10
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %33 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %34 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %10
+         %35 = OpLabel
+          %a = OpVariable %_ptr_Function_v4int Function
+          %i = OpVariable %_ptr_Function_int Function
+        %sum = OpVariable %_ptr_Function_int Function
+               OpStore %a %15
+               OpStore %i %int_0
+               OpBranch %36
+         %36 = OpLabel
+               OpLoopMerge %37 %38 None
+               OpBranch %39
+         %39 = OpLabel
+         %40 = OpLoad %int %i
+         %41 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %uint_3
+         %42 = OpLoad %int %41
+         %43 = OpIAdd %int %42 %int_1
+         %44 = OpSLessThan %bool %40 %43
+               OpBranchConditional %44 %45 %37
+         %45 = OpLabel
+         %46 = OpLoad %int %i
+         %47 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %uint_0
+         %48 = OpLoad %int %47
+         %49 = OpLoad %int %i
+         %50 = OpExtInst %int %1 SClamp %46 %48 %49
+         %51 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %50
+         %52 = OpLoad %int %51
+         %53 = OpIEqual %bool %52 %int_1
+               OpSelectionMerge %54 None
+               OpBranchConditional %53 %55 %56
+         %55 = OpLabel
+         %57 = OpLoad %int %i
+         %58 = OpAccessChain %_ptr_Function_int %a %57
+               OpStore %58 %int_5
+               OpBranch %54
+         %56 = OpLabel
+         %59 = OpLoad %int %i
+         %60 = OpLoad %int %i
+         %61 = OpAccessChain %_ptr_Function_int %a %59
+               OpStore %61 %60
+               OpBranch %54
+         %54 = OpLabel
+               OpBranch %38
+         %38 = OpLabel
+         %62 = OpLoad %int %i
+         %63 = OpIAdd %int %62 %int_1
+               OpStore %i %63
+               OpBranch %36
+         %37 = OpLabel
+         %64 = OpAccessChain %_ptr_Function_int %a %uint_0
+         %65 = OpLoad %int %64
+         %66 = OpAccessChain %_ptr_Function_int %a %uint_1
+         %67 = OpLoad %int %66
+         %68 = OpIAdd %int %65 %67
+         %69 = OpAccessChain %_ptr_Function_int %a %uint_2
+         %70 = OpLoad %int %69
+         %71 = OpIAdd %int %68 %70
+         %72 = OpAccessChain %_ptr_Function_int %a %uint_3
+         %73 = OpLoad %int %72
+         %74 = OpIAdd %int %71 %73
+               OpStore %sum %74
+         %75 = OpLoad %int %sum
+         %76 = OpIEqual %bool %75 %int_10
+               OpSelectionMerge %77 None
+               OpBranchConditional %76 %78 %79
+         %78 = OpLabel
+               OpStore %_GLF_color %33
+               OpBranch %77
+         %79 = OpLabel
+               OpStore %_GLF_color %34
+               OpBranch %77
+         %77 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..2e58c08
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,61 @@
+void set_int4(inout int4 vec, int idx, int val) {
+  vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
+}
+
+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() {
+  int4 a = int4(0, 0, 0, 0);
+  int i = 0;
+  int sum = 0;
+  a = int4(0, 0, 0, 0);
+  i = 0;
+  while (true) {
+    const int x_40 = i;
+    const int x_42 = asint(x_7[0].w);
+    if ((x_40 < (x_42 + 1))) {
+    } else {
+      break;
+    }
+    const int x_46 = i;
+    const int x_48 = asint(x_7[0].x);
+    const uint scalar_offset = ((4u * uint(clamp(x_46, x_48, i)))) / 4;
+    const int x_52 = asint(x_7[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_52 == 1)) {
+      set_int4(a, i, 5);
+    } else {
+      set_int4(a, i, i);
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_65 = a.x;
+  const int x_67 = a.y;
+  const int x_70 = a.z;
+  const int x_73 = a.w;
+  sum = (((x_65 + x_67) + x_70) + x_73);
+  if ((sum == 10)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..beae1dd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.spvasm.expected.msl
@@ -0,0 +1,65 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_int4 sequence;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_4) {
+  int4 a = 0;
+  int i = 0;
+  int sum = 0;
+  a = int4(0, 0, 0, 0);
+  i = 0;
+  while (true) {
+    int const x_40 = i;
+    int const x_42 = x_7.sequence.w;
+    if ((x_40 < (x_42 + 1))) {
+    } else {
+      break;
+    }
+    int const x_46 = i;
+    int const x_48 = x_7.sequence.x;
+    int const x_49 = i;
+    int const x_52 = x_7.sequence[clamp(x_46, x_48, x_49)];
+    if ((x_52 == 1)) {
+      int const x_57 = i;
+      a[x_57] = 5;
+    } else {
+      int const x_59 = i;
+      int const x_60 = i;
+      a[x_59] = x_60;
+    }
+    {
+      int const x_62 = i;
+      i = (x_62 + 1);
+    }
+  }
+  int const x_65 = a.x;
+  int const x_67 = a.y;
+  int const x_70 = a.z;
+  int const x_73 = a.w;
+  sum = (((x_65 + x_67) + x_70) + x_73);
+  int const x_75 = sum;
+  if ((x_75 == 10)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..ff2c207
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,160 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 99
+; Schema: 0
+               OpCapability Shader
+         %49 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "sequence"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %sum "sum"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+      %v4int = OpTypeVector %int 4
+       %buf0 = OpTypeStruct %v4int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %10 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %10
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %10
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+%_ptr_Function_v4int = OpTypePointer Function %v4int
+         %19 = OpConstantNull %v4int
+%_ptr_Function_int = OpTypePointer Function %int
+         %22 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+         %25 = OpConstantComposite %v4int %int_0 %int_0 %int_0 %int_0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+     %uint_3 = OpConstant %uint 3
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %int_5 = OpConstant %int 5
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+     %int_10 = OpConstant %int 10
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %85 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %86 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %87 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %13
+         %16 = OpLabel
+          %a = OpVariable %_ptr_Function_v4int Function %19
+          %i = OpVariable %_ptr_Function_int Function %22
+        %sum = OpVariable %_ptr_Function_int Function %22
+               OpStore %a %25
+               OpStore %i %int_0
+               OpBranch %26
+         %26 = OpLabel
+               OpLoopMerge %27 %28 None
+               OpBranch %29
+         %29 = OpLabel
+         %30 = OpLoad %int %i
+         %35 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %uint_3
+         %36 = OpLoad %int %35
+         %38 = OpIAdd %int %36 %int_1
+         %39 = OpSLessThan %bool %30 %38
+               OpSelectionMerge %41 None
+               OpBranchConditional %39 %42 %43
+         %42 = OpLabel
+               OpBranch %41
+         %43 = OpLabel
+               OpBranch %27
+         %41 = OpLabel
+         %44 = OpLoad %int %i
+         %45 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %uint_0
+         %46 = OpLoad %int %45
+         %47 = OpLoad %int %i
+         %48 = OpExtInst %int %49 SClamp %44 %46 %47
+         %50 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %48
+         %51 = OpLoad %int %50
+         %52 = OpIEqual %bool %51 %int_1
+               OpSelectionMerge %53 None
+               OpBranchConditional %52 %54 %55
+         %54 = OpLabel
+         %56 = OpLoad %int %i
+         %57 = OpAccessChain %_ptr_Function_int %a %56
+               OpStore %57 %int_5
+               OpBranch %53
+         %55 = OpLabel
+         %59 = OpLoad %int %i
+         %60 = OpLoad %int %i
+         %61 = OpAccessChain %_ptr_Function_int %a %59
+               OpStore %61 %60
+               OpBranch %53
+         %53 = OpLabel
+               OpBranch %28
+         %28 = OpLabel
+         %62 = OpLoad %int %i
+         %63 = OpIAdd %int %62 %int_1
+               OpStore %i %63
+               OpBranch %26
+         %27 = OpLabel
+         %64 = OpAccessChain %_ptr_Function_int %a %uint_0
+         %65 = OpLoad %int %64
+         %67 = OpAccessChain %_ptr_Function_int %a %uint_1
+         %68 = OpLoad %int %67
+         %70 = OpAccessChain %_ptr_Function_int %a %uint_2
+         %71 = OpLoad %int %70
+         %72 = OpAccessChain %_ptr_Function_int %a %uint_3
+         %73 = OpLoad %int %72
+         %74 = OpIAdd %int %65 %68
+         %75 = OpIAdd %int %74 %71
+         %76 = OpIAdd %int %75 %73
+               OpStore %sum %76
+         %77 = OpLoad %int %sum
+         %79 = OpIEqual %bool %77 %int_10
+               OpSelectionMerge %80 None
+               OpBranchConditional %79 %81 %82
+         %81 = OpLabel
+               OpStore %x_GLF_color %85
+               OpBranch %80
+         %82 = OpLabel
+               OpStore %x_GLF_color %86
+               OpBranch %80
+         %80 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %87
+%tint_symbol = OpFunctionParameter %main_out
+         %91 = OpLabel
+         %92 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %92
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %13
+         %94 = OpLabel
+         %95 = OpFunctionCall %void %main_1
+         %97 = OpLoad %v4float %x_GLF_color
+         %98 = OpCompositeConstruct %main_out %97
+         %96 = OpFunctionCall %void %tint_symbol_2 %98
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..7e6bd6d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,64 @@
+[[block]]
+struct buf0 {
+  sequence : vec4<i32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : vec4<i32>;
+  var i : i32;
+  var sum : i32;
+  a = vec4<i32>(0, 0, 0, 0);
+  i = 0;
+  loop {
+    let x_40 : i32 = i;
+    let x_42 : i32 = x_7.sequence.w;
+    if ((x_40 < (x_42 + 1))) {
+    } else {
+      break;
+    }
+    let x_46 : i32 = i;
+    let x_48 : i32 = x_7.sequence.x;
+    let x_49 : i32 = i;
+    let x_52 : i32 = x_7.sequence[clamp(x_46, x_48, x_49)];
+    if ((x_52 == 1)) {
+      let x_57 : i32 = i;
+      a[x_57] = 5;
+    } else {
+      let x_59 : i32 = i;
+      let x_60 : i32 = i;
+      a[x_59] = x_60;
+    }
+
+    continuing {
+      let x_62 : i32 = i;
+      i = (x_62 + 1);
+    }
+  }
+  let x_65 : i32 = a.x;
+  let x_67 : i32 = a.y;
+  let x_70 : i32 = a.z;
+  let x_73 : i32 = a.w;
+  sum = (((x_65 + x_67) + x_70) + x_73);
+  let x_75 : i32 = sum;
+  if ((x_75 == 10)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.wgsl
new file mode 100644
index 0000000..7e6bd6d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.wgsl
@@ -0,0 +1,64 @@
+[[block]]
+struct buf0 {
+  sequence : vec4<i32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : vec4<i32>;
+  var i : i32;
+  var sum : i32;
+  a = vec4<i32>(0, 0, 0, 0);
+  i = 0;
+  loop {
+    let x_40 : i32 = i;
+    let x_42 : i32 = x_7.sequence.w;
+    if ((x_40 < (x_42 + 1))) {
+    } else {
+      break;
+    }
+    let x_46 : i32 = i;
+    let x_48 : i32 = x_7.sequence.x;
+    let x_49 : i32 = i;
+    let x_52 : i32 = x_7.sequence[clamp(x_46, x_48, x_49)];
+    if ((x_52 == 1)) {
+      let x_57 : i32 = i;
+      a[x_57] = 5;
+    } else {
+      let x_59 : i32 = i;
+      let x_60 : i32 = i;
+      a[x_59] = x_60;
+    }
+
+    continuing {
+      let x_62 : i32 = i;
+      i = (x_62 + 1);
+    }
+  }
+  let x_65 : i32 = a.x;
+  let x_67 : i32 = a.y;
+  let x_70 : i32 = a.z;
+  let x_73 : i32 = a.w;
+  sum = (((x_65 + x_67) + x_70) + x_73);
+  let x_75 : i32 = sum;
+  if ((x_75 == 10)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..2e58c08
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,61 @@
+void set_int4(inout int4 vec, int idx, int val) {
+  vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
+}
+
+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() {
+  int4 a = int4(0, 0, 0, 0);
+  int i = 0;
+  int sum = 0;
+  a = int4(0, 0, 0, 0);
+  i = 0;
+  while (true) {
+    const int x_40 = i;
+    const int x_42 = asint(x_7[0].w);
+    if ((x_40 < (x_42 + 1))) {
+    } else {
+      break;
+    }
+    const int x_46 = i;
+    const int x_48 = asint(x_7[0].x);
+    const uint scalar_offset = ((4u * uint(clamp(x_46, x_48, i)))) / 4;
+    const int x_52 = asint(x_7[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_52 == 1)) {
+      set_int4(a, i, 5);
+    } else {
+      set_int4(a, i, i);
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_65 = a.x;
+  const int x_67 = a.y;
+  const int x_70 = a.z;
+  const int x_73 = a.w;
+  sum = (((x_65 + x_67) + x_70) + x_73);
+  if ((sum == 10)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..beae1dd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.wgsl.expected.msl
@@ -0,0 +1,65 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_int4 sequence;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_4) {
+  int4 a = 0;
+  int i = 0;
+  int sum = 0;
+  a = int4(0, 0, 0, 0);
+  i = 0;
+  while (true) {
+    int const x_40 = i;
+    int const x_42 = x_7.sequence.w;
+    if ((x_40 < (x_42 + 1))) {
+    } else {
+      break;
+    }
+    int const x_46 = i;
+    int const x_48 = x_7.sequence.x;
+    int const x_49 = i;
+    int const x_52 = x_7.sequence[clamp(x_46, x_48, x_49)];
+    if ((x_52 == 1)) {
+      int const x_57 = i;
+      a[x_57] = 5;
+    } else {
+      int const x_59 = i;
+      int const x_60 = i;
+      a[x_59] = x_60;
+    }
+    {
+      int const x_62 = i;
+      i = (x_62 + 1);
+    }
+  }
+  int const x_65 = a.x;
+  int const x_67 = a.y;
+  int const x_70 = a.z;
+  int const x_73 = a.w;
+  sum = (((x_65 + x_67) + x_70) + x_73);
+  int const x_75 = sum;
+  if ((x_75 == 10)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..ff2c207
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,160 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 99
+; Schema: 0
+               OpCapability Shader
+         %49 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "sequence"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %sum "sum"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+      %v4int = OpTypeVector %int 4
+       %buf0 = OpTypeStruct %v4int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %10 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %10
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %10
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+%_ptr_Function_v4int = OpTypePointer Function %v4int
+         %19 = OpConstantNull %v4int
+%_ptr_Function_int = OpTypePointer Function %int
+         %22 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+         %25 = OpConstantComposite %v4int %int_0 %int_0 %int_0 %int_0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+     %uint_3 = OpConstant %uint 3
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %int_5 = OpConstant %int 5
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+     %int_10 = OpConstant %int 10
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %85 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %86 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %87 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %13
+         %16 = OpLabel
+          %a = OpVariable %_ptr_Function_v4int Function %19
+          %i = OpVariable %_ptr_Function_int Function %22
+        %sum = OpVariable %_ptr_Function_int Function %22
+               OpStore %a %25
+               OpStore %i %int_0
+               OpBranch %26
+         %26 = OpLabel
+               OpLoopMerge %27 %28 None
+               OpBranch %29
+         %29 = OpLabel
+         %30 = OpLoad %int %i
+         %35 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %uint_3
+         %36 = OpLoad %int %35
+         %38 = OpIAdd %int %36 %int_1
+         %39 = OpSLessThan %bool %30 %38
+               OpSelectionMerge %41 None
+               OpBranchConditional %39 %42 %43
+         %42 = OpLabel
+               OpBranch %41
+         %43 = OpLabel
+               OpBranch %27
+         %41 = OpLabel
+         %44 = OpLoad %int %i
+         %45 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %uint_0
+         %46 = OpLoad %int %45
+         %47 = OpLoad %int %i
+         %48 = OpExtInst %int %49 SClamp %44 %46 %47
+         %50 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %48
+         %51 = OpLoad %int %50
+         %52 = OpIEqual %bool %51 %int_1
+               OpSelectionMerge %53 None
+               OpBranchConditional %52 %54 %55
+         %54 = OpLabel
+         %56 = OpLoad %int %i
+         %57 = OpAccessChain %_ptr_Function_int %a %56
+               OpStore %57 %int_5
+               OpBranch %53
+         %55 = OpLabel
+         %59 = OpLoad %int %i
+         %60 = OpLoad %int %i
+         %61 = OpAccessChain %_ptr_Function_int %a %59
+               OpStore %61 %60
+               OpBranch %53
+         %53 = OpLabel
+               OpBranch %28
+         %28 = OpLabel
+         %62 = OpLoad %int %i
+         %63 = OpIAdd %int %62 %int_1
+               OpStore %i %63
+               OpBranch %26
+         %27 = OpLabel
+         %64 = OpAccessChain %_ptr_Function_int %a %uint_0
+         %65 = OpLoad %int %64
+         %67 = OpAccessChain %_ptr_Function_int %a %uint_1
+         %68 = OpLoad %int %67
+         %70 = OpAccessChain %_ptr_Function_int %a %uint_2
+         %71 = OpLoad %int %70
+         %72 = OpAccessChain %_ptr_Function_int %a %uint_3
+         %73 = OpLoad %int %72
+         %74 = OpIAdd %int %65 %68
+         %75 = OpIAdd %int %74 %71
+         %76 = OpIAdd %int %75 %73
+               OpStore %sum %76
+         %77 = OpLoad %int %sum
+         %79 = OpIEqual %bool %77 %int_10
+               OpSelectionMerge %80 None
+               OpBranchConditional %79 %81 %82
+         %81 = OpLabel
+               OpStore %x_GLF_color %85
+               OpBranch %80
+         %82 = OpLabel
+               OpStore %x_GLF_color %86
+               OpBranch %80
+         %80 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %87
+%tint_symbol = OpFunctionParameter %main_out
+         %91 = OpLabel
+         %92 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %92
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %13
+         %94 = OpLabel
+         %95 = OpFunctionCall %void %main_1
+         %97 = OpLoad %v4float %x_GLF_color
+         %98 = OpCompositeConstruct %main_out %97
+         %96 = OpFunctionCall %void %tint_symbol_2 %98
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..7e6bd6d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-clamp-max-itself/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,64 @@
+[[block]]
+struct buf0 {
+  sequence : vec4<i32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : vec4<i32>;
+  var i : i32;
+  var sum : i32;
+  a = vec4<i32>(0, 0, 0, 0);
+  i = 0;
+  loop {
+    let x_40 : i32 = i;
+    let x_42 : i32 = x_7.sequence.w;
+    if ((x_40 < (x_42 + 1))) {
+    } else {
+      break;
+    }
+    let x_46 : i32 = i;
+    let x_48 : i32 = x_7.sequence.x;
+    let x_49 : i32 = i;
+    let x_52 : i32 = x_7.sequence[clamp(x_46, x_48, x_49)];
+    if ((x_52 == 1)) {
+      let x_57 : i32 = i;
+      a[x_57] = 5;
+    } else {
+      let x_59 : i32 = i;
+      let x_60 : i32 = i;
+      a[x_59] = x_60;
+    }
+
+    continuing {
+      let x_62 : i32 = i;
+      i = (x_62 + 1);
+    }
+  }
+  let x_65 : i32 = a.x;
+  let x_67 : i32 = a.y;
+  let x_70 : i32 = a.z;
+  let x_73 : i32 = a.w;
+  sum = (((x_65 + x_67) + x_70) + x_73);
+  let x_75 : i32 = sum;
+  if ((x_75 == 10)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-combine-compares-max-max-one/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplify-combine-compares-max-max-one/0-opt.spvasm
new file mode 100644
index 0000000..b6ea806
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-combine-compares-max-max-one/0-opt.spvasm
@@ -0,0 +1,75 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %9
+         %22 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+         %23 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %24 = OpLoad %int %23
+         %25 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %26 = OpLoad %int %25
+         %27 = OpExtInst %int %1 SMax %26 %int_1
+         %28 = OpExtInst %int %1 SMax %24 %27
+               OpStore %a %28
+         %29 = OpLoad %int %a
+         %30 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %31 = OpLoad %int %30
+         %32 = OpIEqual %bool %29 %31
+               OpSelectionMerge %33 None
+               OpBranchConditional %32 %34 %35
+         %34 = OpLabel
+         %36 = OpLoad %int %a
+         %37 = OpConvertSToF %float %36
+         %38 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %39 = OpLoad %int %38
+         %40 = OpConvertSToF %float %39
+         %41 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %42 = OpLoad %int %41
+         %43 = OpConvertSToF %float %42
+         %44 = OpLoad %int %a
+         %45 = OpConvertSToF %float %44
+         %46 = OpCompositeConstruct %v4float %37 %40 %43 %45
+               OpStore %_GLF_color %46
+               OpBranch %33
+         %35 = OpLabel
+         %47 = OpLoad %int %a
+         %48 = OpConvertSToF %float %47
+         %49 = OpCompositeConstruct %v4float %48 %48 %48 %48
+               OpStore %_GLF_color %49
+               OpBranch %33
+         %33 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-combine-compares-max-max-one/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-combine-compares-max-max-one/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..0503ece
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-combine-compares-max-max-one/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,40 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_24 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_26 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  a = max(x_24, max(x_26, 1));
+  const int x_29 = a;
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const int x_31 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  if ((x_29 == x_31)) {
+    const int x_36 = a;
+    const int x_39 = asint(x_6[1].x);
+    const int x_42 = asint(x_6[1].x);
+    x_GLF_color = float4(float(x_36), float(x_39), float(x_42), float(a));
+  } else {
+    const float x_48 = float(a);
+    x_GLF_color = float4(x_48, x_48, x_48, x_48);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-combine-compares-max-max-one/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-combine-compares-max-max-one/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..aedac0a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-combine-compares-max-max-one/0-opt.spvasm.expected.msl
@@ -0,0 +1,49 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int const x_24 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_26 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  a = max(x_24, max(x_26, 1));
+  int const x_29 = a;
+  int const x_31 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  if ((x_29 == x_31)) {
+    int const x_36 = a;
+    int const x_39 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_42 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_44 = a;
+    *(tint_symbol_4) = float4(float(x_36), float(x_39), float(x_42), float(x_44));
+  } else {
+    int const x_47 = a;
+    float const x_48 = float(x_47);
+    *(tint_symbol_4) = float4(x_48, x_48, x_48, x_48);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-combine-compares-max-max-one/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplify-combine-compares-max-max-one/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..d91ccbe
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-combine-compares-max-max-one/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,109 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 67
+; Schema: 0
+               OpCapability Shader
+         %30 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %v4float
+         %55 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+         %25 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %26 = OpLoad %int %25
+         %27 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %28 = OpLoad %int %27
+         %31 = OpExtInst %int %30 SMax %28 %int_1
+         %29 = OpExtInst %int %30 SMax %26 %31
+               OpStore %a %29
+         %33 = OpLoad %int %a
+         %34 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %35 = OpLoad %int %34
+         %36 = OpIEqual %bool %33 %35
+               OpSelectionMerge %38 None
+               OpBranchConditional %36 %39 %40
+         %39 = OpLabel
+         %41 = OpLoad %int %a
+         %42 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %43 = OpLoad %int %42
+         %44 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %45 = OpLoad %int %44
+         %46 = OpLoad %int %a
+         %47 = OpConvertSToF %float %41
+         %48 = OpConvertSToF %float %43
+         %49 = OpConvertSToF %float %45
+         %50 = OpConvertSToF %float %46
+         %51 = OpCompositeConstruct %v4float %47 %48 %49 %50
+               OpStore %x_GLF_color %51
+               OpBranch %38
+         %40 = OpLabel
+         %52 = OpLoad %int %a
+         %53 = OpConvertSToF %float %52
+         %54 = OpCompositeConstruct %v4float %53 %53 %53 %53
+               OpStore %x_GLF_color %54
+               OpBranch %38
+         %38 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %55
+%tint_symbol = OpFunctionParameter %main_out
+         %59 = OpLabel
+         %60 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %60
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %62 = OpLabel
+         %63 = OpFunctionCall %void %main_1
+         %65 = OpLoad %v4float %x_GLF_color
+         %66 = OpCompositeConstruct %main_out %65
+         %64 = OpFunctionCall %void %tint_symbol_2 %66
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-combine-compares-max-max-one/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-combine-compares-max-max-one/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..c54d32c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-combine-compares-max-max-one/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,42 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  let x_24 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_26 : i32 = x_6.x_GLF_uniform_int_values[0];
+  a = max(x_24, max(x_26, 1));
+  let x_29 : i32 = a;
+  let x_31 : i32 = x_6.x_GLF_uniform_int_values[0];
+  if ((x_29 == x_31)) {
+    let x_36 : i32 = a;
+    let x_39 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_42 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_44 : i32 = a;
+    x_GLF_color = vec4<f32>(f32(x_36), f32(x_39), f32(x_42), f32(x_44));
+  } else {
+    let x_47 : i32 = a;
+    let x_48 : f32 = f32(x_47);
+    x_GLF_color = vec4<f32>(x_48, x_48, x_48, x_48);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-combine-compares-max-max-one/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-combine-compares-max-max-one/0-opt.wgsl
new file mode 100644
index 0000000..c54d32c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-combine-compares-max-max-one/0-opt.wgsl
@@ -0,0 +1,42 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  let x_24 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_26 : i32 = x_6.x_GLF_uniform_int_values[0];
+  a = max(x_24, max(x_26, 1));
+  let x_29 : i32 = a;
+  let x_31 : i32 = x_6.x_GLF_uniform_int_values[0];
+  if ((x_29 == x_31)) {
+    let x_36 : i32 = a;
+    let x_39 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_42 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_44 : i32 = a;
+    x_GLF_color = vec4<f32>(f32(x_36), f32(x_39), f32(x_42), f32(x_44));
+  } else {
+    let x_47 : i32 = a;
+    let x_48 : f32 = f32(x_47);
+    x_GLF_color = vec4<f32>(x_48, x_48, x_48, x_48);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-combine-compares-max-max-one/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-combine-compares-max-max-one/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..0503ece
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-combine-compares-max-max-one/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,40 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_24 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_26 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  a = max(x_24, max(x_26, 1));
+  const int x_29 = a;
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const int x_31 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  if ((x_29 == x_31)) {
+    const int x_36 = a;
+    const int x_39 = asint(x_6[1].x);
+    const int x_42 = asint(x_6[1].x);
+    x_GLF_color = float4(float(x_36), float(x_39), float(x_42), float(a));
+  } else {
+    const float x_48 = float(a);
+    x_GLF_color = float4(x_48, x_48, x_48, x_48);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-combine-compares-max-max-one/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-combine-compares-max-max-one/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..aedac0a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-combine-compares-max-max-one/0-opt.wgsl.expected.msl
@@ -0,0 +1,49 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int const x_24 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_26 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  a = max(x_24, max(x_26, 1));
+  int const x_29 = a;
+  int const x_31 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  if ((x_29 == x_31)) {
+    int const x_36 = a;
+    int const x_39 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_42 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_44 = a;
+    *(tint_symbol_4) = float4(float(x_36), float(x_39), float(x_42), float(x_44));
+  } else {
+    int const x_47 = a;
+    float const x_48 = float(x_47);
+    *(tint_symbol_4) = float4(x_48, x_48, x_48, x_48);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-combine-compares-max-max-one/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplify-combine-compares-max-max-one/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..d91ccbe
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-combine-compares-max-max-one/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,109 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 67
+; Schema: 0
+               OpCapability Shader
+         %30 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %v4float
+         %55 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+         %25 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %26 = OpLoad %int %25
+         %27 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %28 = OpLoad %int %27
+         %31 = OpExtInst %int %30 SMax %28 %int_1
+         %29 = OpExtInst %int %30 SMax %26 %31
+               OpStore %a %29
+         %33 = OpLoad %int %a
+         %34 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %35 = OpLoad %int %34
+         %36 = OpIEqual %bool %33 %35
+               OpSelectionMerge %38 None
+               OpBranchConditional %36 %39 %40
+         %39 = OpLabel
+         %41 = OpLoad %int %a
+         %42 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %43 = OpLoad %int %42
+         %44 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %45 = OpLoad %int %44
+         %46 = OpLoad %int %a
+         %47 = OpConvertSToF %float %41
+         %48 = OpConvertSToF %float %43
+         %49 = OpConvertSToF %float %45
+         %50 = OpConvertSToF %float %46
+         %51 = OpCompositeConstruct %v4float %47 %48 %49 %50
+               OpStore %x_GLF_color %51
+               OpBranch %38
+         %40 = OpLabel
+         %52 = OpLoad %int %a
+         %53 = OpConvertSToF %float %52
+         %54 = OpCompositeConstruct %v4float %53 %53 %53 %53
+               OpStore %x_GLF_color %54
+               OpBranch %38
+         %38 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %55
+%tint_symbol = OpFunctionParameter %main_out
+         %59 = OpLabel
+         %60 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %60
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %62 = OpLabel
+         %63 = OpFunctionCall %void %main_1
+         %65 = OpLoad %v4float %x_GLF_color
+         %66 = OpCompositeConstruct %main_out %65
+         %64 = OpFunctionCall %void %tint_symbol_2 %66
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-combine-compares-max-max-one/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-combine-compares-max-max-one/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..c54d32c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-combine-compares-max-max-one/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,42 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  let x_24 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_26 : i32 = x_6.x_GLF_uniform_int_values[0];
+  a = max(x_24, max(x_26, 1));
+  let x_29 : i32 = a;
+  let x_31 : i32 = x_6.x_GLF_uniform_int_values[0];
+  if ((x_29 == x_31)) {
+    let x_36 : i32 = a;
+    let x_39 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_42 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_44 : i32 = a;
+    x_GLF_color = vec4<f32>(f32(x_36), f32(x_39), f32(x_42), f32(x_44));
+  } else {
+    let x_47 : i32 = a;
+    let x_48 : f32 = f32(x_47);
+    x_GLF_color = vec4<f32>(x_48, x_48, x_48, x_48);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-component-uniform-idx/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplify-component-uniform-idx/0-opt.spvasm
new file mode 100644
index 0000000..d27199d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-component-uniform-idx/0-opt.spvasm
@@ -0,0 +1,89 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %i "i"
+               OpName %r "r"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "two"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_4 = OpConstant %int 4
+       %bool = OpTypeBool
+      %v4int = OpTypeVector %int 4
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+         %21 = OpConstantComposite %v4int %int_1 %int_2 %int_3 %int_4
+     %int_10 = OpConstant %int 10
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %28 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %29 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %9
+         %30 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+          %r = OpVariable %_ptr_Function_int Function
+               OpStore %i %int_0
+               OpStore %r %int_0
+               OpBranch %31
+         %31 = OpLabel
+               OpLoopMerge %32 %33 None
+               OpBranch %34
+         %34 = OpLabel
+         %35 = OpLoad %int %r
+         %36 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %37 = OpLoad %int %36
+         %38 = OpIMul %int %37 %int_4
+         %39 = OpSLessThan %bool %35 %38
+               OpBranchConditional %39 %40 %32
+         %40 = OpLabel
+         %41 = OpLoad %int %r
+         %42 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %43 = OpLoad %int %42
+         %44 = OpSDiv %int %41 %43
+         %45 = OpVectorExtractDynamic %int %21 %44
+         %46 = OpLoad %int %i
+         %47 = OpIAdd %int %46 %45
+               OpStore %i %47
+               OpBranch %33
+         %33 = OpLabel
+         %48 = OpLoad %int %r
+         %49 = OpIAdd %int %48 %int_2
+               OpStore %r %49
+               OpBranch %31
+         %32 = OpLabel
+         %50 = OpLoad %int %i
+         %51 = OpIEqual %bool %50 %int_10
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %54
+         %53 = OpLabel
+               OpStore %_GLF_color %28
+               OpBranch %52
+         %54 = OpLabel
+               OpStore %_GLF_color %29
+               OpBranch %52
+         %52 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-component-uniform-idx/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-component-uniform-idx/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..db9236b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-component-uniform-idx/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,45 @@
+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() {
+  int i = 0;
+  int r = 0;
+  i = 0;
+  r = 0;
+  while (true) {
+    const int x_35 = r;
+    const int x_37 = asint(x_7[0].x);
+    if ((x_35 < (x_37 * 4))) {
+    } else {
+      break;
+    }
+    const int x_41 = r;
+    const int x_43 = asint(x_7[0].x);
+    i = (i + int4(1, 2, 3, 4)[(x_41 / x_43)]);
+    {
+      r = (r + 2);
+    }
+  }
+  if ((i == 10)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-component-uniform-idx/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-component-uniform-idx/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..b2f057c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-component-uniform-idx/0-opt.spvasm.expected.msl
@@ -0,0 +1,51 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int two;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_4) {
+  int i = 0;
+  int r = 0;
+  i = 0;
+  r = 0;
+  while (true) {
+    int const x_35 = r;
+    int const x_37 = x_7.two;
+    if ((x_35 < (x_37 * 4))) {
+    } else {
+      break;
+    }
+    int const x_41 = r;
+    int const x_43 = x_7.two;
+    int const x_46 = i;
+    i = (x_46 + int4(1, 2, 3, 4)[(x_41 / x_43)]);
+    {
+      int const x_48 = r;
+      r = (x_48 + 2);
+    }
+  }
+  int const x_50 = i;
+  if ((x_50 == 10)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-component-uniform-idx/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplify-component-uniform-idx/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..e78b606
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-component-uniform-idx/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,128 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 74
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "two"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %r "r"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_4 = OpConstant %int 4
+       %bool = OpTypeBool
+      %v4int = OpTypeVector %int 4
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+         %46 = OpConstantComposite %v4int %int_1 %int_2 %int_3 %int_4
+     %int_10 = OpConstant %int 10
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %60 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %61 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %62 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %18
+          %r = OpVariable %_ptr_Function_int Function %18
+               OpStore %i %int_0
+               OpStore %r %int_0
+               OpBranch %21
+         %21 = OpLabel
+               OpLoopMerge %22 %23 None
+               OpBranch %24
+         %24 = OpLabel
+         %25 = OpLoad %int %r
+         %29 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %30 = OpLoad %int %29
+         %32 = OpIMul %int %30 %int_4
+         %33 = OpSLessThan %bool %25 %32
+               OpSelectionMerge %35 None
+               OpBranchConditional %33 %36 %37
+         %36 = OpLabel
+               OpBranch %35
+         %37 = OpLabel
+               OpBranch %22
+         %35 = OpLabel
+         %38 = OpLoad %int %r
+         %39 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %40 = OpLoad %int %39
+         %41 = OpLoad %int %i
+         %47 = OpSDiv %int %38 %40
+         %48 = OpVectorExtractDynamic %int %46 %47
+         %49 = OpIAdd %int %41 %48
+               OpStore %i %49
+               OpBranch %23
+         %23 = OpLabel
+         %50 = OpLoad %int %r
+         %51 = OpIAdd %int %50 %int_2
+               OpStore %r %51
+               OpBranch %21
+         %22 = OpLabel
+         %52 = OpLoad %int %i
+         %54 = OpIEqual %bool %52 %int_10
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %57
+         %56 = OpLabel
+               OpStore %x_GLF_color %60
+               OpBranch %55
+         %57 = OpLabel
+               OpStore %x_GLF_color %61
+               OpBranch %55
+         %55 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %62
+%tint_symbol = OpFunctionParameter %main_out
+         %66 = OpLabel
+         %67 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %67
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %69 = OpLabel
+         %70 = OpFunctionCall %void %main_1
+         %72 = OpLoad %v4float %x_GLF_color
+         %73 = OpCompositeConstruct %main_out %72
+         %71 = OpFunctionCall %void %tint_symbol_2 %73
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-component-uniform-idx/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-component-uniform-idx/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..a3a1f46
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-component-uniform-idx/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,50 @@
+[[block]]
+struct buf0 {
+  two : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  var r : i32;
+  i = 0;
+  r = 0;
+  loop {
+    let x_35 : i32 = r;
+    let x_37 : i32 = x_7.two;
+    if ((x_35 < (x_37 * 4))) {
+    } else {
+      break;
+    }
+    let x_41 : i32 = r;
+    let x_43 : i32 = x_7.two;
+    let x_46 : i32 = i;
+    i = (x_46 + vec4<i32>(1, 2, 3, 4)[(x_41 / x_43)]);
+
+    continuing {
+      let x_48 : i32 = r;
+      r = (x_48 + 2);
+    }
+  }
+  let x_50 : i32 = i;
+  if ((x_50 == 10)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-component-uniform-idx/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-component-uniform-idx/0-opt.wgsl
new file mode 100644
index 0000000..a3a1f46
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-component-uniform-idx/0-opt.wgsl
@@ -0,0 +1,50 @@
+[[block]]
+struct buf0 {
+  two : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  var r : i32;
+  i = 0;
+  r = 0;
+  loop {
+    let x_35 : i32 = r;
+    let x_37 : i32 = x_7.two;
+    if ((x_35 < (x_37 * 4))) {
+    } else {
+      break;
+    }
+    let x_41 : i32 = r;
+    let x_43 : i32 = x_7.two;
+    let x_46 : i32 = i;
+    i = (x_46 + vec4<i32>(1, 2, 3, 4)[(x_41 / x_43)]);
+
+    continuing {
+      let x_48 : i32 = r;
+      r = (x_48 + 2);
+    }
+  }
+  let x_50 : i32 = i;
+  if ((x_50 == 10)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-component-uniform-idx/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-component-uniform-idx/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..db9236b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-component-uniform-idx/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,45 @@
+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() {
+  int i = 0;
+  int r = 0;
+  i = 0;
+  r = 0;
+  while (true) {
+    const int x_35 = r;
+    const int x_37 = asint(x_7[0].x);
+    if ((x_35 < (x_37 * 4))) {
+    } else {
+      break;
+    }
+    const int x_41 = r;
+    const int x_43 = asint(x_7[0].x);
+    i = (i + int4(1, 2, 3, 4)[(x_41 / x_43)]);
+    {
+      r = (r + 2);
+    }
+  }
+  if ((i == 10)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-component-uniform-idx/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-component-uniform-idx/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..b2f057c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-component-uniform-idx/0-opt.wgsl.expected.msl
@@ -0,0 +1,51 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int two;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_4) {
+  int i = 0;
+  int r = 0;
+  i = 0;
+  r = 0;
+  while (true) {
+    int const x_35 = r;
+    int const x_37 = x_7.two;
+    if ((x_35 < (x_37 * 4))) {
+    } else {
+      break;
+    }
+    int const x_41 = r;
+    int const x_43 = x_7.two;
+    int const x_46 = i;
+    i = (x_46 + int4(1, 2, 3, 4)[(x_41 / x_43)]);
+    {
+      int const x_48 = r;
+      r = (x_48 + 2);
+    }
+  }
+  int const x_50 = i;
+  if ((x_50 == 10)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-component-uniform-idx/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplify-component-uniform-idx/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..e78b606
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-component-uniform-idx/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,128 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 74
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "two"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %r "r"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_4 = OpConstant %int 4
+       %bool = OpTypeBool
+      %v4int = OpTypeVector %int 4
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+         %46 = OpConstantComposite %v4int %int_1 %int_2 %int_3 %int_4
+     %int_10 = OpConstant %int 10
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %60 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %61 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %62 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %18
+          %r = OpVariable %_ptr_Function_int Function %18
+               OpStore %i %int_0
+               OpStore %r %int_0
+               OpBranch %21
+         %21 = OpLabel
+               OpLoopMerge %22 %23 None
+               OpBranch %24
+         %24 = OpLabel
+         %25 = OpLoad %int %r
+         %29 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %30 = OpLoad %int %29
+         %32 = OpIMul %int %30 %int_4
+         %33 = OpSLessThan %bool %25 %32
+               OpSelectionMerge %35 None
+               OpBranchConditional %33 %36 %37
+         %36 = OpLabel
+               OpBranch %35
+         %37 = OpLabel
+               OpBranch %22
+         %35 = OpLabel
+         %38 = OpLoad %int %r
+         %39 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %40 = OpLoad %int %39
+         %41 = OpLoad %int %i
+         %47 = OpSDiv %int %38 %40
+         %48 = OpVectorExtractDynamic %int %46 %47
+         %49 = OpIAdd %int %41 %48
+               OpStore %i %49
+               OpBranch %23
+         %23 = OpLabel
+         %50 = OpLoad %int %r
+         %51 = OpIAdd %int %50 %int_2
+               OpStore %r %51
+               OpBranch %21
+         %22 = OpLabel
+         %52 = OpLoad %int %i
+         %54 = OpIEqual %bool %52 %int_10
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %57
+         %56 = OpLabel
+               OpStore %x_GLF_color %60
+               OpBranch %55
+         %57 = OpLabel
+               OpStore %x_GLF_color %61
+               OpBranch %55
+         %55 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %62
+%tint_symbol = OpFunctionParameter %main_out
+         %66 = OpLabel
+         %67 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %67
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %69 = OpLabel
+         %70 = OpFunctionCall %void %main_1
+         %72 = OpLoad %v4float %x_GLF_color
+         %73 = OpCompositeConstruct %main_out %72
+         %71 = OpFunctionCall %void %tint_symbol_2 %73
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-component-uniform-idx/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-component-uniform-idx/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..a3a1f46
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-component-uniform-idx/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,50 @@
+[[block]]
+struct buf0 {
+  two : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  var r : i32;
+  i = 0;
+  r = 0;
+  loop {
+    let x_35 : i32 = r;
+    let x_37 : i32 = x_7.two;
+    if ((x_35 < (x_37 * 4))) {
+    } else {
+      break;
+    }
+    let x_41 : i32 = r;
+    let x_43 : i32 = x_7.two;
+    let x_46 : i32 = i;
+    i = (x_46 + vec4<i32>(1, 2, 3, 4)[(x_41 / x_43)]);
+
+    continuing {
+      let x_48 : i32 = r;
+      r = (x_48 + 2);
+    }
+  }
+  let x_50 : i32 = i;
+  if ((x_50 == 10)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-div-by-uint-one/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplify-div-by-uint-one/0-opt.spvasm
new file mode 100644
index 0000000..e0b14a2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-div-by-uint-one/0-opt.spvasm
@@ -0,0 +1,58 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "two"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+       %buf0 = OpTypeStruct %uint
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %23 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %24 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %8
+         %25 = OpLabel
+          %a = OpVariable %_ptr_Function_uint Function
+         %26 = OpAccessChain %_ptr_Uniform_uint %_ %int_0
+         %27 = OpLoad %uint %26
+         %28 = OpUDiv %uint %27 %uint_1
+               OpStore %a %28
+         %29 = OpLoad %uint %a
+         %30 = OpIEqual %bool %29 %uint_2
+               OpSelectionMerge %31 None
+               OpBranchConditional %30 %32 %33
+         %32 = OpLabel
+               OpStore %_GLF_color %23
+               OpBranch %31
+         %33 = OpLabel
+               OpStore %_GLF_color %24
+               OpBranch %31
+         %31 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-div-by-uint-one/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-div-by-uint-one/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..ad4b4c8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-div-by-uint-one/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,30 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  uint a = 0u;
+  const uint x_27 = x_6[0].x;
+  a = (x_27 / 1u);
+  if ((a == 2u)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-div-by-uint-one/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-div-by-uint-one/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..34251dc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-div-by-uint-one/0-opt.spvasm.expected.msl
@@ -0,0 +1,34 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ uint two;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  uint a = 0u;
+  uint const x_27 = x_6.two;
+  a = (x_27 / 1u);
+  uint const x_29 = a;
+  if ((x_29 == 2u)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-div-by-uint-one/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplify-div-by-uint-one/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..68fb1d7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-div-by-uint-one/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,89 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 48
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "two"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+       %uint = OpTypeInt 32 0
+       %buf0 = OpTypeStruct %uint
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_uint = OpTypePointer Function %uint
+         %18 = OpConstantNull %uint
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %34 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %35 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %36 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %a = OpVariable %_ptr_Function_uint Function %18
+         %21 = OpAccessChain %_ptr_Uniform_uint %x_6 %uint_0
+         %22 = OpLoad %uint %21
+         %24 = OpUDiv %uint %22 %uint_1
+               OpStore %a %24
+         %25 = OpLoad %uint %a
+         %27 = OpIEqual %bool %25 %uint_2
+               OpSelectionMerge %29 None
+               OpBranchConditional %27 %30 %31
+         %30 = OpLabel
+               OpStore %x_GLF_color %34
+               OpBranch %29
+         %31 = OpLabel
+               OpStore %x_GLF_color %35
+               OpBranch %29
+         %29 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %36
+%tint_symbol = OpFunctionParameter %main_out
+         %40 = OpLabel
+         %41 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %41
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %43 = OpLabel
+         %44 = OpFunctionCall %void %main_1
+         %46 = OpLoad %v4float %x_GLF_color
+         %47 = OpCompositeConstruct %main_out %46
+         %45 = OpFunctionCall %void %tint_symbol_2 %47
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-div-by-uint-one/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-div-by-uint-one/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..50c6355
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-div-by-uint-one/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,32 @@
+[[block]]
+struct buf0 {
+  two : u32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : u32;
+  let x_27 : u32 = x_6.two;
+  a = (x_27 / 1u);
+  let x_29 : u32 = a;
+  if ((x_29 == 2u)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-div-by-uint-one/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-div-by-uint-one/0-opt.wgsl
new file mode 100644
index 0000000..50c6355
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-div-by-uint-one/0-opt.wgsl
@@ -0,0 +1,32 @@
+[[block]]
+struct buf0 {
+  two : u32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : u32;
+  let x_27 : u32 = x_6.two;
+  a = (x_27 / 1u);
+  let x_29 : u32 = a;
+  if ((x_29 == 2u)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-div-by-uint-one/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-div-by-uint-one/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..ad4b4c8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-div-by-uint-one/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,30 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  uint a = 0u;
+  const uint x_27 = x_6[0].x;
+  a = (x_27 / 1u);
+  if ((a == 2u)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-div-by-uint-one/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-div-by-uint-one/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..34251dc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-div-by-uint-one/0-opt.wgsl.expected.msl
@@ -0,0 +1,34 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ uint two;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  uint a = 0u;
+  uint const x_27 = x_6.two;
+  a = (x_27 / 1u);
+  uint const x_29 = a;
+  if ((x_29 == 2u)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-div-by-uint-one/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplify-div-by-uint-one/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..68fb1d7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-div-by-uint-one/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,89 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 48
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "two"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+       %uint = OpTypeInt 32 0
+       %buf0 = OpTypeStruct %uint
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_uint = OpTypePointer Function %uint
+         %18 = OpConstantNull %uint
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %34 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %35 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %36 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %a = OpVariable %_ptr_Function_uint Function %18
+         %21 = OpAccessChain %_ptr_Uniform_uint %x_6 %uint_0
+         %22 = OpLoad %uint %21
+         %24 = OpUDiv %uint %22 %uint_1
+               OpStore %a %24
+         %25 = OpLoad %uint %a
+         %27 = OpIEqual %bool %25 %uint_2
+               OpSelectionMerge %29 None
+               OpBranchConditional %27 %30 %31
+         %30 = OpLabel
+               OpStore %x_GLF_color %34
+               OpBranch %29
+         %31 = OpLabel
+               OpStore %x_GLF_color %35
+               OpBranch %29
+         %29 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %36
+%tint_symbol = OpFunctionParameter %main_out
+         %40 = OpLabel
+         %41 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %41
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %43 = OpLabel
+         %44 = OpFunctionCall %void %main_1
+         %46 = OpLoad %v4float %x_GLF_color
+         %47 = OpCompositeConstruct %main_out %46
+         %45 = OpFunctionCall %void %tint_symbol_2 %47
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-div-by-uint-one/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-div-by-uint-one/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..50c6355
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-div-by-uint-one/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,32 @@
+[[block]]
+struct buf0 {
+  two : u32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : u32;
+  let x_27 : u32 = x_6.two;
+  a = (x_27 / 1u);
+  let x_29 : u32 = a;
+  if ((x_29 == 2u)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-for-bitwise-condition/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplify-for-bitwise-condition/0-opt.spvasm
new file mode 100644
index 0000000..00ef50c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-for-bitwise-condition/0-opt.spvasm
@@ -0,0 +1,106 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %10
+         %23 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+         %24 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %25 = OpLoad %int %24
+               OpStore %a %25
+         %26 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %27 = OpLoad %int %26
+         %28 = OpSNegate %int %27
+               OpStore %i %28
+               OpBranch %29
+         %29 = OpLabel
+               OpLoopMerge %30 %31 None
+               OpBranch %32
+         %32 = OpLabel
+         %33 = OpLoad %int %i
+         %34 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %35 = OpLoad %int %34
+         %36 = OpBitwiseOr %int %33 %35
+         %37 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %38 = OpLoad %int %37
+         %39 = OpSLessThan %bool %36 %38
+               OpBranchConditional %39 %40 %30
+         %40 = OpLabel
+         %41 = OpLoad %int %i
+         %42 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %43 = OpLoad %int %42
+         %44 = OpIMul %int %41 %43
+               OpStore %a %44
+               OpBranch %31
+         %31 = OpLabel
+         %45 = OpLoad %int %i
+         %46 = OpIAdd %int %45 %int_1
+               OpStore %i %46
+               OpBranch %29
+         %30 = OpLabel
+         %47 = OpLoad %int %a
+         %48 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %49 = OpLoad %int %48
+         %50 = OpSNegate %int %49
+         %51 = OpIEqual %bool %47 %50
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %54
+         %53 = OpLabel
+         %55 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %56 = OpLoad %int %55
+         %57 = OpConvertSToF %float %56
+         %58 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %59 = OpLoad %int %58
+         %60 = OpConvertSToF %float %59
+         %61 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %62 = OpLoad %int %61
+         %63 = OpConvertSToF %float %62
+         %64 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %65 = OpLoad %int %64
+         %66 = OpConvertSToF %float %65
+         %67 = OpCompositeConstruct %v4float %57 %60 %63 %66
+               OpStore %_GLF_color %67
+               OpBranch %52
+         %54 = OpLabel
+         %68 = OpLoad %int %a
+         %69 = OpConvertSToF %float %68
+         %70 = OpCompositeConstruct %v4float %69 %69 %69 %69
+               OpStore %_GLF_color %70
+               OpBranch %52
+         %52 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-for-bitwise-condition/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-for-bitwise-condition/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..910242d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-for-bitwise-condition/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,62 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  int i = 0;
+  const int x_25 = asint(x_6[1].x);
+  a = x_25;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_27 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  i = -(x_27);
+  while (true) {
+    const int x_33 = i;
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_35 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_38 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    if (((x_33 | x_35) < x_38)) {
+    } else {
+      break;
+    }
+    const int x_41 = i;
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_43 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    a = (x_41 * x_43);
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_47 = a;
+  const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+  const int x_49 = asint(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+  if ((x_47 == -(x_49))) {
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const int x_56 = asint(x_6[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    const int x_59 = asint(x_6[1].x);
+    const int x_62 = asint(x_6[1].x);
+    const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+    const int x_65 = asint(x_6[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+    x_GLF_color = float4(float(x_56), float(x_59), float(x_62), float(x_65));
+  } else {
+    const float x_69 = float(a);
+    x_GLF_color = float4(x_69, x_69, x_69, x_69);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-for-bitwise-condition/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-for-bitwise-condition/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..1ec287c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-for-bitwise-condition/0-opt.spvasm.expected.msl
@@ -0,0 +1,67 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int i = 0;
+  int const x_25 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  a = x_25;
+  int const x_27 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  i = -(x_27);
+  while (true) {
+    int const x_33 = i;
+    int const x_35 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_38 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    if (((x_33 | x_35) < x_38)) {
+    } else {
+      break;
+    }
+    int const x_41 = i;
+    int const x_43 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    a = (x_41 * x_43);
+    {
+      int const x_45 = i;
+      i = (x_45 + 1);
+    }
+  }
+  int const x_47 = a;
+  int const x_49 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  if ((x_47 == -(x_49))) {
+    int const x_56 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_59 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_62 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_65 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_56), float(x_59), float(x_62), float(x_65));
+  } else {
+    int const x_68 = a;
+    float const x_69 = float(x_68);
+    *(tint_symbol_4) = float4(x_69, x_69, x_69, x_69);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-for-bitwise-condition/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplify-for-bitwise-condition/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..fb9d73a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-for-bitwise-condition/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,144 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 89
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %v4float
+         %77 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+          %i = OpVariable %_ptr_Function_int Function %21
+         %26 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %27 = OpLoad %int %26
+               OpStore %a %27
+         %29 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %30 = OpLoad %int %29
+         %31 = OpSNegate %int %30
+               OpStore %i %31
+               OpBranch %32
+         %32 = OpLabel
+               OpLoopMerge %33 %34 None
+               OpBranch %35
+         %35 = OpLabel
+         %36 = OpLoad %int %i
+         %37 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %38 = OpLoad %int %37
+         %39 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %40 = OpLoad %int %39
+         %41 = OpBitwiseOr %int %36 %38
+         %42 = OpSLessThan %bool %41 %40
+               OpSelectionMerge %44 None
+               OpBranchConditional %42 %45 %46
+         %45 = OpLabel
+               OpBranch %44
+         %46 = OpLabel
+               OpBranch %33
+         %44 = OpLabel
+         %47 = OpLoad %int %i
+         %48 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %49 = OpLoad %int %48
+         %50 = OpIMul %int %47 %49
+               OpStore %a %50
+               OpBranch %34
+         %34 = OpLabel
+         %51 = OpLoad %int %i
+         %52 = OpIAdd %int %51 %int_1
+               OpStore %i %52
+               OpBranch %32
+         %33 = OpLabel
+         %53 = OpLoad %int %a
+         %54 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %55 = OpLoad %int %54
+         %56 = OpSNegate %int %55
+         %57 = OpIEqual %bool %53 %56
+               OpSelectionMerge %58 None
+               OpBranchConditional %57 %59 %60
+         %59 = OpLabel
+         %61 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %62 = OpLoad %int %61
+         %63 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %64 = OpLoad %int %63
+         %65 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %66 = OpLoad %int %65
+         %67 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %68 = OpLoad %int %67
+         %69 = OpConvertSToF %float %62
+         %70 = OpConvertSToF %float %64
+         %71 = OpConvertSToF %float %66
+         %72 = OpConvertSToF %float %68
+         %73 = OpCompositeConstruct %v4float %69 %70 %71 %72
+               OpStore %x_GLF_color %73
+               OpBranch %58
+         %60 = OpLabel
+         %74 = OpLoad %int %a
+         %75 = OpConvertSToF %float %74
+         %76 = OpCompositeConstruct %v4float %75 %75 %75 %75
+               OpStore %x_GLF_color %76
+               OpBranch %58
+         %58 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %77
+%tint_symbol = OpFunctionParameter %main_out
+         %81 = OpLabel
+         %82 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %82
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %84 = OpLabel
+         %85 = OpFunctionCall %void %main_1
+         %87 = OpLoad %v4float %x_GLF_color
+         %88 = OpCompositeConstruct %main_out %87
+         %86 = OpFunctionCall %void %tint_symbol_2 %88
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-for-bitwise-condition/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-for-bitwise-condition/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..0f3c2eb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-for-bitwise-condition/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,61 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  let x_25 : i32 = x_6.x_GLF_uniform_int_values[1];
+  a = x_25;
+  let x_27 : i32 = x_6.x_GLF_uniform_int_values[0];
+  i = -(x_27);
+  loop {
+    let x_33 : i32 = i;
+    let x_35 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_38 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if (((x_33 | x_35) < x_38)) {
+    } else {
+      break;
+    }
+    let x_41 : i32 = i;
+    let x_43 : i32 = x_6.x_GLF_uniform_int_values[0];
+    a = (x_41 * x_43);
+
+    continuing {
+      let x_45 : i32 = i;
+      i = (x_45 + 1);
+    }
+  }
+  let x_47 : i32 = a;
+  let x_49 : i32 = x_6.x_GLF_uniform_int_values[0];
+  if ((x_47 == -(x_49))) {
+    let x_56 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_59 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_62 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_65 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_56), f32(x_59), f32(x_62), f32(x_65));
+  } else {
+    let x_68 : i32 = a;
+    let x_69 : f32 = f32(x_68);
+    x_GLF_color = vec4<f32>(x_69, x_69, x_69, x_69);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-for-bitwise-condition/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-for-bitwise-condition/0-opt.wgsl
new file mode 100644
index 0000000..0f3c2eb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-for-bitwise-condition/0-opt.wgsl
@@ -0,0 +1,61 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  let x_25 : i32 = x_6.x_GLF_uniform_int_values[1];
+  a = x_25;
+  let x_27 : i32 = x_6.x_GLF_uniform_int_values[0];
+  i = -(x_27);
+  loop {
+    let x_33 : i32 = i;
+    let x_35 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_38 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if (((x_33 | x_35) < x_38)) {
+    } else {
+      break;
+    }
+    let x_41 : i32 = i;
+    let x_43 : i32 = x_6.x_GLF_uniform_int_values[0];
+    a = (x_41 * x_43);
+
+    continuing {
+      let x_45 : i32 = i;
+      i = (x_45 + 1);
+    }
+  }
+  let x_47 : i32 = a;
+  let x_49 : i32 = x_6.x_GLF_uniform_int_values[0];
+  if ((x_47 == -(x_49))) {
+    let x_56 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_59 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_62 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_65 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_56), f32(x_59), f32(x_62), f32(x_65));
+  } else {
+    let x_68 : i32 = a;
+    let x_69 : f32 = f32(x_68);
+    x_GLF_color = vec4<f32>(x_69, x_69, x_69, x_69);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-for-bitwise-condition/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-for-bitwise-condition/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..910242d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-for-bitwise-condition/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,62 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  int i = 0;
+  const int x_25 = asint(x_6[1].x);
+  a = x_25;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_27 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  i = -(x_27);
+  while (true) {
+    const int x_33 = i;
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_35 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_38 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    if (((x_33 | x_35) < x_38)) {
+    } else {
+      break;
+    }
+    const int x_41 = i;
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_43 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    a = (x_41 * x_43);
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_47 = a;
+  const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+  const int x_49 = asint(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+  if ((x_47 == -(x_49))) {
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const int x_56 = asint(x_6[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    const int x_59 = asint(x_6[1].x);
+    const int x_62 = asint(x_6[1].x);
+    const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+    const int x_65 = asint(x_6[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+    x_GLF_color = float4(float(x_56), float(x_59), float(x_62), float(x_65));
+  } else {
+    const float x_69 = float(a);
+    x_GLF_color = float4(x_69, x_69, x_69, x_69);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-for-bitwise-condition/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-for-bitwise-condition/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..1ec287c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-for-bitwise-condition/0-opt.wgsl.expected.msl
@@ -0,0 +1,67 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int i = 0;
+  int const x_25 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  a = x_25;
+  int const x_27 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  i = -(x_27);
+  while (true) {
+    int const x_33 = i;
+    int const x_35 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_38 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    if (((x_33 | x_35) < x_38)) {
+    } else {
+      break;
+    }
+    int const x_41 = i;
+    int const x_43 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    a = (x_41 * x_43);
+    {
+      int const x_45 = i;
+      i = (x_45 + 1);
+    }
+  }
+  int const x_47 = a;
+  int const x_49 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  if ((x_47 == -(x_49))) {
+    int const x_56 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_59 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_62 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_65 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_56), float(x_59), float(x_62), float(x_65));
+  } else {
+    int const x_68 = a;
+    float const x_69 = float(x_68);
+    *(tint_symbol_4) = float4(x_69, x_69, x_69, x_69);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-for-bitwise-condition/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplify-for-bitwise-condition/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..fb9d73a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-for-bitwise-condition/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,144 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 89
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %v4float
+         %77 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+          %i = OpVariable %_ptr_Function_int Function %21
+         %26 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %27 = OpLoad %int %26
+               OpStore %a %27
+         %29 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %30 = OpLoad %int %29
+         %31 = OpSNegate %int %30
+               OpStore %i %31
+               OpBranch %32
+         %32 = OpLabel
+               OpLoopMerge %33 %34 None
+               OpBranch %35
+         %35 = OpLabel
+         %36 = OpLoad %int %i
+         %37 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %38 = OpLoad %int %37
+         %39 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %40 = OpLoad %int %39
+         %41 = OpBitwiseOr %int %36 %38
+         %42 = OpSLessThan %bool %41 %40
+               OpSelectionMerge %44 None
+               OpBranchConditional %42 %45 %46
+         %45 = OpLabel
+               OpBranch %44
+         %46 = OpLabel
+               OpBranch %33
+         %44 = OpLabel
+         %47 = OpLoad %int %i
+         %48 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %49 = OpLoad %int %48
+         %50 = OpIMul %int %47 %49
+               OpStore %a %50
+               OpBranch %34
+         %34 = OpLabel
+         %51 = OpLoad %int %i
+         %52 = OpIAdd %int %51 %int_1
+               OpStore %i %52
+               OpBranch %32
+         %33 = OpLabel
+         %53 = OpLoad %int %a
+         %54 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %55 = OpLoad %int %54
+         %56 = OpSNegate %int %55
+         %57 = OpIEqual %bool %53 %56
+               OpSelectionMerge %58 None
+               OpBranchConditional %57 %59 %60
+         %59 = OpLabel
+         %61 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %62 = OpLoad %int %61
+         %63 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %64 = OpLoad %int %63
+         %65 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %66 = OpLoad %int %65
+         %67 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %68 = OpLoad %int %67
+         %69 = OpConvertSToF %float %62
+         %70 = OpConvertSToF %float %64
+         %71 = OpConvertSToF %float %66
+         %72 = OpConvertSToF %float %68
+         %73 = OpCompositeConstruct %v4float %69 %70 %71 %72
+               OpStore %x_GLF_color %73
+               OpBranch %58
+         %60 = OpLabel
+         %74 = OpLoad %int %a
+         %75 = OpConvertSToF %float %74
+         %76 = OpCompositeConstruct %v4float %75 %75 %75 %75
+               OpStore %x_GLF_color %76
+               OpBranch %58
+         %58 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %77
+%tint_symbol = OpFunctionParameter %main_out
+         %81 = OpLabel
+         %82 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %82
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %84 = OpLabel
+         %85 = OpFunctionCall %void %main_1
+         %87 = OpLoad %v4float %x_GLF_color
+         %88 = OpCompositeConstruct %main_out %87
+         %86 = OpFunctionCall %void %tint_symbol_2 %88
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-for-bitwise-condition/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-for-bitwise-condition/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..0f3c2eb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-for-bitwise-condition/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,61 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  let x_25 : i32 = x_6.x_GLF_uniform_int_values[1];
+  a = x_25;
+  let x_27 : i32 = x_6.x_GLF_uniform_int_values[0];
+  i = -(x_27);
+  loop {
+    let x_33 : i32 = i;
+    let x_35 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_38 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if (((x_33 | x_35) < x_38)) {
+    } else {
+      break;
+    }
+    let x_41 : i32 = i;
+    let x_43 : i32 = x_6.x_GLF_uniform_int_values[0];
+    a = (x_41 * x_43);
+
+    continuing {
+      let x_45 : i32 = i;
+      i = (x_45 + 1);
+    }
+  }
+  let x_47 : i32 = a;
+  let x_49 : i32 = x_6.x_GLF_uniform_int_values[0];
+  if ((x_47 == -(x_49))) {
+    let x_56 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_59 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_62 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_65 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_56), f32(x_59), f32(x_62), f32(x_65));
+  } else {
+    let x_68 : i32 = a;
+    let x_69 : f32 = f32(x_68);
+    x_GLF_color = vec4<f32>(x_69, x_69, x_69, x_69);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-ldexp-exponent-zero/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplify-ldexp-exponent-zero/0-opt.spvasm
new file mode 100644
index 0000000..f283a14
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-ldexp-exponent-zero/0-opt.spvasm
@@ -0,0 +1,56 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %f "f"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "three"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_3 = OpConstant %float 3
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %21 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %22 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %8
+         %23 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function
+         %24 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %25 = OpLoad %float %24
+         %26 = OpExtInst %float %1 Ldexp %25 %int_0
+               OpStore %f %26
+         %27 = OpLoad %float %f
+         %28 = OpFOrdEqual %bool %27 %float_3
+               OpSelectionMerge %29 None
+               OpBranchConditional %28 %30 %31
+         %30 = OpLabel
+               OpStore %_GLF_color %21
+               OpBranch %29
+         %31 = OpLabel
+               OpStore %_GLF_color %22
+               OpBranch %29
+         %29 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-ldexp-exponent-zero/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-ldexp-exponent-zero/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..f886474
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-ldexp-exponent-zero/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,30 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float f = 0.0f;
+  const float x_25 = asfloat(x_6[0].x);
+  f = ldexp(x_25, 0);
+  if ((f == 3.0f)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-ldexp-exponent-zero/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-ldexp-exponent-zero/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..ab479dd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-ldexp-exponent-zero/0-opt.spvasm.expected.msl
@@ -0,0 +1,34 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float three;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float f = 0.0f;
+  float const x_25 = x_6.three;
+  f = ldexp(x_25, 0);
+  float const x_27 = f;
+  if ((x_27 == 3.0f)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-ldexp-exponent-zero/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplify-ldexp-exponent-zero/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..d6a625f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-ldexp-exponent-zero/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,91 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 50
+; Schema: 0
+               OpCapability Shader
+         %24 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "three"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %17 = OpConstantNull %float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+    %float_3 = OpConstant %float 3
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %36 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %37 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %38 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %17
+         %21 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0
+         %22 = OpLoad %float %21
+         %23 = OpExtInst %float %24 Ldexp %22 %int_0
+               OpStore %f %23
+         %27 = OpLoad %float %f
+         %29 = OpFOrdEqual %bool %27 %float_3
+               OpSelectionMerge %31 None
+               OpBranchConditional %29 %32 %33
+         %32 = OpLabel
+               OpStore %x_GLF_color %36
+               OpBranch %31
+         %33 = OpLabel
+               OpStore %x_GLF_color %37
+               OpBranch %31
+         %31 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %38
+%tint_symbol = OpFunctionParameter %main_out
+         %42 = OpLabel
+         %43 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %43
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %45 = OpLabel
+         %46 = OpFunctionCall %void %main_1
+         %48 = OpLoad %v4float %x_GLF_color
+         %49 = OpCompositeConstruct %main_out %48
+         %47 = OpFunctionCall %void %tint_symbol_2 %49
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-ldexp-exponent-zero/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-ldexp-exponent-zero/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..b5a9b3b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-ldexp-exponent-zero/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,32 @@
+[[block]]
+struct buf0 {
+  three : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  let x_25 : f32 = x_6.three;
+  f = ldexp(x_25, 0);
+  let x_27 : f32 = f;
+  if ((x_27 == 3.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-ldexp-exponent-zero/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-ldexp-exponent-zero/0-opt.wgsl
new file mode 100644
index 0000000..b5a9b3b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-ldexp-exponent-zero/0-opt.wgsl
@@ -0,0 +1,32 @@
+[[block]]
+struct buf0 {
+  three : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  let x_25 : f32 = x_6.three;
+  f = ldexp(x_25, 0);
+  let x_27 : f32 = f;
+  if ((x_27 == 3.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-ldexp-exponent-zero/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-ldexp-exponent-zero/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..f886474
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-ldexp-exponent-zero/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,30 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float f = 0.0f;
+  const float x_25 = asfloat(x_6[0].x);
+  f = ldexp(x_25, 0);
+  if ((f == 3.0f)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-ldexp-exponent-zero/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-ldexp-exponent-zero/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..ab479dd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-ldexp-exponent-zero/0-opt.wgsl.expected.msl
@@ -0,0 +1,34 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float three;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float f = 0.0f;
+  float const x_25 = x_6.three;
+  f = ldexp(x_25, 0);
+  float const x_27 = f;
+  if ((x_27 == 3.0f)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-ldexp-exponent-zero/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplify-ldexp-exponent-zero/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..d6a625f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-ldexp-exponent-zero/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,91 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 50
+; Schema: 0
+               OpCapability Shader
+         %24 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "three"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %17 = OpConstantNull %float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+    %float_3 = OpConstant %float 3
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %36 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %37 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %38 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %17
+         %21 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0
+         %22 = OpLoad %float %21
+         %23 = OpExtInst %float %24 Ldexp %22 %int_0
+               OpStore %f %23
+         %27 = OpLoad %float %f
+         %29 = OpFOrdEqual %bool %27 %float_3
+               OpSelectionMerge %31 None
+               OpBranchConditional %29 %32 %33
+         %32 = OpLabel
+               OpStore %x_GLF_color %36
+               OpBranch %31
+         %33 = OpLabel
+               OpStore %x_GLF_color %37
+               OpBranch %31
+         %31 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %38
+%tint_symbol = OpFunctionParameter %main_out
+         %42 = OpLabel
+         %43 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %43
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %45 = OpLabel
+         %46 = OpFunctionCall %void %main_1
+         %48 = OpLoad %v4float %x_GLF_color
+         %49 = OpCompositeConstruct %main_out %48
+         %47 = OpFunctionCall %void %tint_symbol_2 %49
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-ldexp-exponent-zero/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-ldexp-exponent-zero/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..b5a9b3b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-ldexp-exponent-zero/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,32 @@
+[[block]]
+struct buf0 {
+  three : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  let x_25 : f32 = x_6.three;
+  f = ldexp(x_25, 0);
+  let x_27 : f32 = f;
+  if ((x_27 == 3.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-max-multiplied-values/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplify-max-multiplied-values/0-opt.spvasm
new file mode 100644
index 0000000..b02dd2e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-max-multiplied-values/0-opt.spvasm
@@ -0,0 +1,162 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %i "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %A "A"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_5 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_int_uint_5 = OpTypeArray %int %uint_5
+       %buf0 = OpTypeStruct %_arr_int_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_4 = OpConstant %int 4
+       %bool = OpTypeBool
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+%_ptr_Function__arr_int_uint_4 = OpTypePointer Function %_arr_int_uint_4
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+      %int_1 = OpConstant %int 1
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+         %30 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+       %main = OpFunction %void None %10
+         %31 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+          %A = OpVariable %_ptr_Function__arr_int_uint_4 Function
+         %32 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %33 = OpLoad %int %32
+               OpStore %i %33
+               OpBranch %34
+         %34 = OpLabel
+               OpLoopMerge %35 %36 None
+               OpBranch %37
+         %37 = OpLabel
+         %38 = OpLoad %int %i
+         %39 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_4
+         %40 = OpLoad %int %39
+         %41 = OpSLessThan %bool %38 %40
+               OpBranchConditional %41 %42 %35
+         %42 = OpLabel
+         %43 = OpLoad %int %i
+         %44 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %45 = OpLoad %int %44
+         %46 = OpAccessChain %_ptr_Function_int %A %43
+               OpStore %46 %45
+         %47 = OpLoad %int %i
+         %48 = OpIMul %int %int_2 %47
+         %49 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %50 = OpLoad %int %49
+         %51 = OpIMul %int %int_2 %50
+         %52 = OpExtInst %int %1 SMax %48 %51
+         %53 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %54 = OpLoad %int %53
+         %55 = OpIEqual %bool %52 %54
+               OpSelectionMerge %56 None
+               OpBranchConditional %55 %57 %56
+         %57 = OpLabel
+         %58 = OpLoad %int %i
+         %59 = OpAccessChain %_ptr_Function_int %A %58
+               OpStore %59 %int_1
+               OpBranch %56
+         %56 = OpLabel
+               OpBranch %36
+         %36 = OpLabel
+         %60 = OpLoad %int %i
+         %61 = OpIAdd %int %60 %int_1
+               OpStore %i %61
+               OpBranch %34
+         %35 = OpLabel
+         %62 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %63 = OpLoad %int %62
+         %64 = OpAccessChain %_ptr_Function_int %A %63
+         %65 = OpLoad %int %64
+         %66 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %67 = OpLoad %int %66
+         %68 = OpIEqual %bool %65 %67
+               OpSelectionMerge %69 None
+               OpBranchConditional %68 %70 %69
+         %70 = OpLabel
+         %71 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %72 = OpLoad %int %71
+         %73 = OpAccessChain %_ptr_Function_int %A %72
+         %74 = OpLoad %int %73
+         %75 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %76 = OpLoad %int %75
+         %77 = OpIEqual %bool %74 %76
+               OpBranch %69
+         %69 = OpLabel
+         %78 = OpPhi %bool %68 %35 %77 %70
+               OpSelectionMerge %79 None
+               OpBranchConditional %78 %80 %79
+         %80 = OpLabel
+         %81 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %82 = OpLoad %int %81
+         %83 = OpAccessChain %_ptr_Function_int %A %82
+         %84 = OpLoad %int %83
+         %85 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %86 = OpLoad %int %85
+         %87 = OpIEqual %bool %84 %86
+               OpBranch %79
+         %79 = OpLabel
+         %88 = OpPhi %bool %78 %69 %87 %80
+               OpSelectionMerge %89 None
+               OpBranchConditional %88 %90 %89
+         %90 = OpLabel
+         %91 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %92 = OpLoad %int %91
+         %93 = OpAccessChain %_ptr_Function_int %A %92
+         %94 = OpLoad %int %93
+         %95 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %96 = OpLoad %int %95
+         %97 = OpIEqual %bool %94 %96
+               OpBranch %89
+         %89 = OpLabel
+         %98 = OpPhi %bool %88 %79 %97 %90
+               OpSelectionMerge %99 None
+               OpBranchConditional %98 %100 %101
+        %100 = OpLabel
+        %102 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+        %103 = OpLoad %int %102
+        %104 = OpConvertSToF %float %103
+        %105 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+        %106 = OpLoad %int %105
+        %107 = OpConvertSToF %float %106
+        %108 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+        %109 = OpLoad %int %108
+        %110 = OpConvertSToF %float %109
+        %111 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+        %112 = OpLoad %int %111
+        %113 = OpConvertSToF %float %112
+        %114 = OpCompositeConstruct %v4float %104 %107 %110 %113
+               OpStore %_GLF_color %114
+               OpBranch %99
+        %101 = OpLabel
+               OpStore %_GLF_color %30
+               OpBranch %99
+         %99 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-max-multiplied-values/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-max-multiplied-values/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..b79d8c0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-max-multiplied-values/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,98 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[5];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int i = 0;
+  int A[4] = (int[4])0;
+  bool x_77 = false;
+  bool x_87 = false;
+  bool x_97 = false;
+  bool x_78_phi = false;
+  bool x_88_phi = false;
+  bool x_98_phi = false;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_33 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  i = x_33;
+  while (true) {
+    const int x_38 = i;
+    const int x_40 = asint(x_6[4].x);
+    if ((x_38 < x_40)) {
+    } else {
+      break;
+    }
+    const int x_43 = i;
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_45 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    A[x_43] = x_45;
+    const int x_47 = i;
+    const int x_50 = asint(x_6[3].x);
+    const int x_54 = asint(x_6[1].x);
+    if ((max((2 * x_47), (2 * x_50)) == x_54)) {
+      A[i] = 1;
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const int x_63 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  const int x_65 = A[x_63];
+  const int x_67 = asint(x_6[3].x);
+  const bool x_68 = (x_65 == x_67);
+  x_78_phi = x_68;
+  if (x_68) {
+    const int x_72 = asint(x_6[3].x);
+    const int x_74 = A[x_72];
+    const int x_76 = asint(x_6[3].x);
+    x_77 = (x_74 == x_76);
+    x_78_phi = x_77;
+  }
+  const bool x_78 = x_78_phi;
+  x_88_phi = x_78;
+  if (x_78) {
+    const int x_82 = asint(x_6[1].x);
+    const int x_84 = A[x_82];
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_86 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    x_87 = (x_84 == x_86);
+    x_88_phi = x_87;
+  }
+  const bool x_88 = x_88_phi;
+  x_98_phi = x_88;
+  if (x_88) {
+    const int x_92 = asint(x_6[2].x);
+    const int x_94 = A[x_92];
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_96 = asint(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    x_97 = (x_94 == x_96);
+    x_98_phi = x_97;
+  }
+  if (x_98_phi) {
+    const int x_103 = asint(x_6[3].x);
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const int x_106 = asint(x_6[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+    const int x_109 = asint(x_6[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+    const int x_112 = asint(x_6[3].x);
+    x_GLF_color = float4(float(x_103), float(x_106), float(x_109), float(x_112));
+  } else {
+    x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-max-multiplied-values/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-max-multiplied-values/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..a850e67
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-max-multiplied-values/0-opt.spvasm.expected.msl
@@ -0,0 +1,107 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[5];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_1 {
+  int arr[4];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int i = 0;
+  tint_array_wrapper_1 A = {};
+  bool x_77 = false;
+  bool x_87 = false;
+  bool x_97 = false;
+  bool x_78_phi = false;
+  bool x_88_phi = false;
+  bool x_98_phi = false;
+  int const x_33 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  i = x_33;
+  while (true) {
+    int const x_38 = i;
+    int const x_40 = x_6.x_GLF_uniform_int_values.arr[4].el;
+    if ((x_38 < x_40)) {
+    } else {
+      break;
+    }
+    int const x_43 = i;
+    int const x_45 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    A.arr[x_43] = x_45;
+    int const x_47 = i;
+    int const x_50 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    int const x_54 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    if ((max((2 * x_47), (2 * x_50)) == x_54)) {
+      int const x_58 = i;
+      A.arr[x_58] = 1;
+    }
+    {
+      int const x_60 = i;
+      i = (x_60 + 1);
+    }
+  }
+  int const x_63 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_65 = A.arr[x_63];
+  int const x_67 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  bool const x_68 = (x_65 == x_67);
+  x_78_phi = x_68;
+  if (x_68) {
+    int const x_72 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    int const x_74 = A.arr[x_72];
+    int const x_76 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    x_77 = (x_74 == x_76);
+    x_78_phi = x_77;
+  }
+  bool const x_78 = x_78_phi;
+  x_88_phi = x_78;
+  if (x_78) {
+    int const x_82 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_84 = A.arr[x_82];
+    int const x_86 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    x_87 = (x_84 == x_86);
+    x_88_phi = x_87;
+  }
+  bool const x_88 = x_88_phi;
+  x_98_phi = x_88;
+  if (x_88) {
+    int const x_92 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_94 = A.arr[x_92];
+    int const x_96 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    x_97 = (x_94 == x_96);
+    x_98_phi = x_97;
+  }
+  bool const x_98 = x_98_phi;
+  if (x_98) {
+    int const x_103 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    int const x_106 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_109 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_112 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    *(tint_symbol_4) = float4(float(x_103), float(x_106), float(x_109), float(x_112));
+  } else {
+    *(tint_symbol_4) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-max-multiplied-values/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplify-max-multiplied-values/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..a003ea9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-max-multiplied-values/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,229 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 146
+; Schema: 0
+               OpCapability Shader
+         %65 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %A "A"
+               OpName %x_77 "x_77"
+               OpName %x_87 "x_87"
+               OpName %x_97 "x_97"
+               OpName %x_78_phi "x_78_phi"
+               OpName %x_88_phi "x_88_phi"
+               OpName %x_98_phi "x_98_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_5 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_int_uint_5 = OpTypeArray %int %uint_5
+       %buf0 = OpTypeStruct %_arr_int_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+%_ptr_Function__arr_int_uint_4 = OpTypePointer Function %_arr_int_uint_4
+         %26 = OpConstantNull %_arr_int_uint_4
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %30 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_4 = OpConstant %int 4
+      %int_3 = OpConstant %int 3
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+    %float_1 = OpConstant %float 1
+        %133 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+        %134 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %21
+          %A = OpVariable %_ptr_Function__arr_int_uint_4 Function %26
+       %x_77 = OpVariable %_ptr_Function_bool Function %30
+       %x_87 = OpVariable %_ptr_Function_bool Function %30
+       %x_97 = OpVariable %_ptr_Function_bool Function %30
+   %x_78_phi = OpVariable %_ptr_Function_bool Function %30
+   %x_88_phi = OpVariable %_ptr_Function_bool Function %30
+   %x_98_phi = OpVariable %_ptr_Function_bool Function %30
+         %39 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %40 = OpLoad %int %39
+               OpStore %i %40
+               OpBranch %41
+         %41 = OpLabel
+               OpLoopMerge %42 %43 None
+               OpBranch %44
+         %44 = OpLabel
+         %45 = OpLoad %int %i
+         %47 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+         %48 = OpLoad %int %47
+         %49 = OpSLessThan %bool %45 %48
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %52
+         %51 = OpLabel
+               OpBranch %50
+         %52 = OpLabel
+               OpBranch %42
+         %50 = OpLabel
+         %53 = OpLoad %int %i
+         %54 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %55 = OpLoad %int %54
+         %56 = OpAccessChain %_ptr_Function_int %A %53
+               OpStore %56 %55
+         %57 = OpLoad %int %i
+         %59 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %60 = OpLoad %int %59
+         %62 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %63 = OpLoad %int %62
+         %67 = OpIMul %int %int_2 %57
+         %68 = OpIMul %int %int_2 %60
+         %64 = OpExtInst %int %65 SMax %67 %68
+         %69 = OpIEqual %bool %64 %63
+               OpSelectionMerge %70 None
+               OpBranchConditional %69 %71 %70
+         %71 = OpLabel
+         %72 = OpLoad %int %i
+         %73 = OpAccessChain %_ptr_Function_int %A %72
+               OpStore %73 %int_1
+               OpBranch %70
+         %70 = OpLabel
+               OpBranch %43
+         %43 = OpLabel
+         %74 = OpLoad %int %i
+         %75 = OpIAdd %int %74 %int_1
+               OpStore %i %75
+               OpBranch %41
+         %42 = OpLabel
+         %76 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %77 = OpLoad %int %76
+         %78 = OpAccessChain %_ptr_Function_int %A %77
+         %79 = OpLoad %int %78
+         %80 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %81 = OpLoad %int %80
+         %82 = OpIEqual %bool %79 %81
+               OpStore %x_78_phi %82
+               OpSelectionMerge %83 None
+               OpBranchConditional %82 %84 %83
+         %84 = OpLabel
+         %85 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_Function_int %A %86
+         %88 = OpLoad %int %87
+         %89 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %90 = OpLoad %int %89
+         %91 = OpIEqual %bool %88 %90
+               OpStore %x_77 %91
+         %92 = OpLoad %bool %x_77
+               OpStore %x_78_phi %92
+               OpBranch %83
+         %83 = OpLabel
+         %93 = OpLoad %bool %x_78_phi
+               OpStore %x_88_phi %93
+               OpSelectionMerge %94 None
+               OpBranchConditional %93 %95 %94
+         %95 = OpLabel
+         %96 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %97 = OpLoad %int %96
+         %98 = OpAccessChain %_ptr_Function_int %A %97
+         %99 = OpLoad %int %98
+        %100 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %101 = OpLoad %int %100
+        %102 = OpIEqual %bool %99 %101
+               OpStore %x_87 %102
+        %103 = OpLoad %bool %x_87
+               OpStore %x_88_phi %103
+               OpBranch %94
+         %94 = OpLabel
+        %104 = OpLoad %bool %x_88_phi
+               OpStore %x_98_phi %104
+               OpSelectionMerge %105 None
+               OpBranchConditional %104 %106 %105
+        %106 = OpLabel
+        %107 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %108 = OpLoad %int %107
+        %109 = OpAccessChain %_ptr_Function_int %A %108
+        %110 = OpLoad %int %109
+        %111 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %112 = OpLoad %int %111
+        %113 = OpIEqual %bool %110 %112
+               OpStore %x_97 %113
+        %114 = OpLoad %bool %x_97
+               OpStore %x_98_phi %114
+               OpBranch %105
+        %105 = OpLabel
+        %115 = OpLoad %bool %x_98_phi
+               OpSelectionMerge %116 None
+               OpBranchConditional %115 %117 %118
+        %117 = OpLabel
+        %119 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+        %120 = OpLoad %int %119
+        %121 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %122 = OpLoad %int %121
+        %123 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %124 = OpLoad %int %123
+        %125 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+        %126 = OpLoad %int %125
+        %127 = OpConvertSToF %float %120
+        %128 = OpConvertSToF %float %122
+        %129 = OpConvertSToF %float %124
+        %130 = OpConvertSToF %float %126
+        %131 = OpCompositeConstruct %v4float %127 %128 %129 %130
+               OpStore %x_GLF_color %131
+               OpBranch %116
+        %118 = OpLabel
+               OpStore %x_GLF_color %133
+               OpBranch %116
+        %116 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %134
+%tint_symbol = OpFunctionParameter %main_out
+        %138 = OpLabel
+        %139 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %139
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %141 = OpLabel
+        %142 = OpFunctionCall %void %main_1
+        %144 = OpLoad %v4float %x_GLF_color
+        %145 = OpCompositeConstruct %main_out %144
+        %143 = OpFunctionCall %void %tint_symbol_2 %145
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-max-multiplied-values/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-max-multiplied-values/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..f4af7a1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-max-multiplied-values/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,98 @@
+type Arr = [[stride(16)]] array<i32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  var A : array<i32, 4>;
+  var x_77 : bool;
+  var x_87 : bool;
+  var x_97 : bool;
+  var x_78_phi : bool;
+  var x_88_phi : bool;
+  var x_98_phi : bool;
+  let x_33 : i32 = x_6.x_GLF_uniform_int_values[0];
+  i = x_33;
+  loop {
+    let x_38 : i32 = i;
+    let x_40 : i32 = x_6.x_GLF_uniform_int_values[4];
+    if ((x_38 < x_40)) {
+    } else {
+      break;
+    }
+    let x_43 : i32 = i;
+    let x_45 : i32 = x_6.x_GLF_uniform_int_values[0];
+    A[x_43] = x_45;
+    let x_47 : i32 = i;
+    let x_50 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_54 : i32 = x_6.x_GLF_uniform_int_values[1];
+    if ((max((2 * x_47), (2 * x_50)) == x_54)) {
+      let x_58 : i32 = i;
+      A[x_58] = 1;
+    }
+
+    continuing {
+      let x_60 : i32 = i;
+      i = (x_60 + 1);
+    }
+  }
+  let x_63 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_65 : i32 = A[x_63];
+  let x_67 : i32 = x_6.x_GLF_uniform_int_values[3];
+  let x_68 : bool = (x_65 == x_67);
+  x_78_phi = x_68;
+  if (x_68) {
+    let x_72 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_74 : i32 = A[x_72];
+    let x_76 : i32 = x_6.x_GLF_uniform_int_values[3];
+    x_77 = (x_74 == x_76);
+    x_78_phi = x_77;
+  }
+  let x_78 : bool = x_78_phi;
+  x_88_phi = x_78;
+  if (x_78) {
+    let x_82 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_84 : i32 = A[x_82];
+    let x_86 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_87 = (x_84 == x_86);
+    x_88_phi = x_87;
+  }
+  let x_88 : bool = x_88_phi;
+  x_98_phi = x_88;
+  if (x_88) {
+    let x_92 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_94 : i32 = A[x_92];
+    let x_96 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_97 = (x_94 == x_96);
+    x_98_phi = x_97;
+  }
+  let x_98 : bool = x_98_phi;
+  if (x_98) {
+    let x_103 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_106 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_109 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_112 : i32 = x_6.x_GLF_uniform_int_values[3];
+    x_GLF_color = vec4<f32>(f32(x_103), f32(x_106), f32(x_109), f32(x_112));
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-max-multiplied-values/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-max-multiplied-values/0-opt.wgsl
new file mode 100644
index 0000000..f4af7a1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-max-multiplied-values/0-opt.wgsl
@@ -0,0 +1,98 @@
+type Arr = [[stride(16)]] array<i32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  var A : array<i32, 4>;
+  var x_77 : bool;
+  var x_87 : bool;
+  var x_97 : bool;
+  var x_78_phi : bool;
+  var x_88_phi : bool;
+  var x_98_phi : bool;
+  let x_33 : i32 = x_6.x_GLF_uniform_int_values[0];
+  i = x_33;
+  loop {
+    let x_38 : i32 = i;
+    let x_40 : i32 = x_6.x_GLF_uniform_int_values[4];
+    if ((x_38 < x_40)) {
+    } else {
+      break;
+    }
+    let x_43 : i32 = i;
+    let x_45 : i32 = x_6.x_GLF_uniform_int_values[0];
+    A[x_43] = x_45;
+    let x_47 : i32 = i;
+    let x_50 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_54 : i32 = x_6.x_GLF_uniform_int_values[1];
+    if ((max((2 * x_47), (2 * x_50)) == x_54)) {
+      let x_58 : i32 = i;
+      A[x_58] = 1;
+    }
+
+    continuing {
+      let x_60 : i32 = i;
+      i = (x_60 + 1);
+    }
+  }
+  let x_63 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_65 : i32 = A[x_63];
+  let x_67 : i32 = x_6.x_GLF_uniform_int_values[3];
+  let x_68 : bool = (x_65 == x_67);
+  x_78_phi = x_68;
+  if (x_68) {
+    let x_72 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_74 : i32 = A[x_72];
+    let x_76 : i32 = x_6.x_GLF_uniform_int_values[3];
+    x_77 = (x_74 == x_76);
+    x_78_phi = x_77;
+  }
+  let x_78 : bool = x_78_phi;
+  x_88_phi = x_78;
+  if (x_78) {
+    let x_82 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_84 : i32 = A[x_82];
+    let x_86 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_87 = (x_84 == x_86);
+    x_88_phi = x_87;
+  }
+  let x_88 : bool = x_88_phi;
+  x_98_phi = x_88;
+  if (x_88) {
+    let x_92 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_94 : i32 = A[x_92];
+    let x_96 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_97 = (x_94 == x_96);
+    x_98_phi = x_97;
+  }
+  let x_98 : bool = x_98_phi;
+  if (x_98) {
+    let x_103 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_106 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_109 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_112 : i32 = x_6.x_GLF_uniform_int_values[3];
+    x_GLF_color = vec4<f32>(f32(x_103), f32(x_106), f32(x_109), f32(x_112));
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-max-multiplied-values/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-max-multiplied-values/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..b79d8c0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-max-multiplied-values/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,98 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[5];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int i = 0;
+  int A[4] = (int[4])0;
+  bool x_77 = false;
+  bool x_87 = false;
+  bool x_97 = false;
+  bool x_78_phi = false;
+  bool x_88_phi = false;
+  bool x_98_phi = false;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_33 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  i = x_33;
+  while (true) {
+    const int x_38 = i;
+    const int x_40 = asint(x_6[4].x);
+    if ((x_38 < x_40)) {
+    } else {
+      break;
+    }
+    const int x_43 = i;
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_45 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    A[x_43] = x_45;
+    const int x_47 = i;
+    const int x_50 = asint(x_6[3].x);
+    const int x_54 = asint(x_6[1].x);
+    if ((max((2 * x_47), (2 * x_50)) == x_54)) {
+      A[i] = 1;
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const int x_63 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  const int x_65 = A[x_63];
+  const int x_67 = asint(x_6[3].x);
+  const bool x_68 = (x_65 == x_67);
+  x_78_phi = x_68;
+  if (x_68) {
+    const int x_72 = asint(x_6[3].x);
+    const int x_74 = A[x_72];
+    const int x_76 = asint(x_6[3].x);
+    x_77 = (x_74 == x_76);
+    x_78_phi = x_77;
+  }
+  const bool x_78 = x_78_phi;
+  x_88_phi = x_78;
+  if (x_78) {
+    const int x_82 = asint(x_6[1].x);
+    const int x_84 = A[x_82];
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_86 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    x_87 = (x_84 == x_86);
+    x_88_phi = x_87;
+  }
+  const bool x_88 = x_88_phi;
+  x_98_phi = x_88;
+  if (x_88) {
+    const int x_92 = asint(x_6[2].x);
+    const int x_94 = A[x_92];
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_96 = asint(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    x_97 = (x_94 == x_96);
+    x_98_phi = x_97;
+  }
+  if (x_98_phi) {
+    const int x_103 = asint(x_6[3].x);
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const int x_106 = asint(x_6[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+    const int x_109 = asint(x_6[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+    const int x_112 = asint(x_6[3].x);
+    x_GLF_color = float4(float(x_103), float(x_106), float(x_109), float(x_112));
+  } else {
+    x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-max-multiplied-values/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-max-multiplied-values/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..a850e67
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-max-multiplied-values/0-opt.wgsl.expected.msl
@@ -0,0 +1,107 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[5];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_1 {
+  int arr[4];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int i = 0;
+  tint_array_wrapper_1 A = {};
+  bool x_77 = false;
+  bool x_87 = false;
+  bool x_97 = false;
+  bool x_78_phi = false;
+  bool x_88_phi = false;
+  bool x_98_phi = false;
+  int const x_33 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  i = x_33;
+  while (true) {
+    int const x_38 = i;
+    int const x_40 = x_6.x_GLF_uniform_int_values.arr[4].el;
+    if ((x_38 < x_40)) {
+    } else {
+      break;
+    }
+    int const x_43 = i;
+    int const x_45 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    A.arr[x_43] = x_45;
+    int const x_47 = i;
+    int const x_50 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    int const x_54 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    if ((max((2 * x_47), (2 * x_50)) == x_54)) {
+      int const x_58 = i;
+      A.arr[x_58] = 1;
+    }
+    {
+      int const x_60 = i;
+      i = (x_60 + 1);
+    }
+  }
+  int const x_63 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_65 = A.arr[x_63];
+  int const x_67 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  bool const x_68 = (x_65 == x_67);
+  x_78_phi = x_68;
+  if (x_68) {
+    int const x_72 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    int const x_74 = A.arr[x_72];
+    int const x_76 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    x_77 = (x_74 == x_76);
+    x_78_phi = x_77;
+  }
+  bool const x_78 = x_78_phi;
+  x_88_phi = x_78;
+  if (x_78) {
+    int const x_82 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_84 = A.arr[x_82];
+    int const x_86 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    x_87 = (x_84 == x_86);
+    x_88_phi = x_87;
+  }
+  bool const x_88 = x_88_phi;
+  x_98_phi = x_88;
+  if (x_88) {
+    int const x_92 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_94 = A.arr[x_92];
+    int const x_96 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    x_97 = (x_94 == x_96);
+    x_98_phi = x_97;
+  }
+  bool const x_98 = x_98_phi;
+  if (x_98) {
+    int const x_103 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    int const x_106 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_109 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_112 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    *(tint_symbol_4) = float4(float(x_103), float(x_106), float(x_109), float(x_112));
+  } else {
+    *(tint_symbol_4) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-max-multiplied-values/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplify-max-multiplied-values/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..a003ea9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-max-multiplied-values/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,229 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 146
+; Schema: 0
+               OpCapability Shader
+         %65 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %A "A"
+               OpName %x_77 "x_77"
+               OpName %x_87 "x_87"
+               OpName %x_97 "x_97"
+               OpName %x_78_phi "x_78_phi"
+               OpName %x_88_phi "x_88_phi"
+               OpName %x_98_phi "x_98_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_5 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_int_uint_5 = OpTypeArray %int %uint_5
+       %buf0 = OpTypeStruct %_arr_int_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+%_ptr_Function__arr_int_uint_4 = OpTypePointer Function %_arr_int_uint_4
+         %26 = OpConstantNull %_arr_int_uint_4
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %30 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_4 = OpConstant %int 4
+      %int_3 = OpConstant %int 3
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+    %float_1 = OpConstant %float 1
+        %133 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+        %134 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %21
+          %A = OpVariable %_ptr_Function__arr_int_uint_4 Function %26
+       %x_77 = OpVariable %_ptr_Function_bool Function %30
+       %x_87 = OpVariable %_ptr_Function_bool Function %30
+       %x_97 = OpVariable %_ptr_Function_bool Function %30
+   %x_78_phi = OpVariable %_ptr_Function_bool Function %30
+   %x_88_phi = OpVariable %_ptr_Function_bool Function %30
+   %x_98_phi = OpVariable %_ptr_Function_bool Function %30
+         %39 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %40 = OpLoad %int %39
+               OpStore %i %40
+               OpBranch %41
+         %41 = OpLabel
+               OpLoopMerge %42 %43 None
+               OpBranch %44
+         %44 = OpLabel
+         %45 = OpLoad %int %i
+         %47 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+         %48 = OpLoad %int %47
+         %49 = OpSLessThan %bool %45 %48
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %52
+         %51 = OpLabel
+               OpBranch %50
+         %52 = OpLabel
+               OpBranch %42
+         %50 = OpLabel
+         %53 = OpLoad %int %i
+         %54 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %55 = OpLoad %int %54
+         %56 = OpAccessChain %_ptr_Function_int %A %53
+               OpStore %56 %55
+         %57 = OpLoad %int %i
+         %59 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %60 = OpLoad %int %59
+         %62 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %63 = OpLoad %int %62
+         %67 = OpIMul %int %int_2 %57
+         %68 = OpIMul %int %int_2 %60
+         %64 = OpExtInst %int %65 SMax %67 %68
+         %69 = OpIEqual %bool %64 %63
+               OpSelectionMerge %70 None
+               OpBranchConditional %69 %71 %70
+         %71 = OpLabel
+         %72 = OpLoad %int %i
+         %73 = OpAccessChain %_ptr_Function_int %A %72
+               OpStore %73 %int_1
+               OpBranch %70
+         %70 = OpLabel
+               OpBranch %43
+         %43 = OpLabel
+         %74 = OpLoad %int %i
+         %75 = OpIAdd %int %74 %int_1
+               OpStore %i %75
+               OpBranch %41
+         %42 = OpLabel
+         %76 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %77 = OpLoad %int %76
+         %78 = OpAccessChain %_ptr_Function_int %A %77
+         %79 = OpLoad %int %78
+         %80 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %81 = OpLoad %int %80
+         %82 = OpIEqual %bool %79 %81
+               OpStore %x_78_phi %82
+               OpSelectionMerge %83 None
+               OpBranchConditional %82 %84 %83
+         %84 = OpLabel
+         %85 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_Function_int %A %86
+         %88 = OpLoad %int %87
+         %89 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %90 = OpLoad %int %89
+         %91 = OpIEqual %bool %88 %90
+               OpStore %x_77 %91
+         %92 = OpLoad %bool %x_77
+               OpStore %x_78_phi %92
+               OpBranch %83
+         %83 = OpLabel
+         %93 = OpLoad %bool %x_78_phi
+               OpStore %x_88_phi %93
+               OpSelectionMerge %94 None
+               OpBranchConditional %93 %95 %94
+         %95 = OpLabel
+         %96 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %97 = OpLoad %int %96
+         %98 = OpAccessChain %_ptr_Function_int %A %97
+         %99 = OpLoad %int %98
+        %100 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %101 = OpLoad %int %100
+        %102 = OpIEqual %bool %99 %101
+               OpStore %x_87 %102
+        %103 = OpLoad %bool %x_87
+               OpStore %x_88_phi %103
+               OpBranch %94
+         %94 = OpLabel
+        %104 = OpLoad %bool %x_88_phi
+               OpStore %x_98_phi %104
+               OpSelectionMerge %105 None
+               OpBranchConditional %104 %106 %105
+        %106 = OpLabel
+        %107 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %108 = OpLoad %int %107
+        %109 = OpAccessChain %_ptr_Function_int %A %108
+        %110 = OpLoad %int %109
+        %111 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %112 = OpLoad %int %111
+        %113 = OpIEqual %bool %110 %112
+               OpStore %x_97 %113
+        %114 = OpLoad %bool %x_97
+               OpStore %x_98_phi %114
+               OpBranch %105
+        %105 = OpLabel
+        %115 = OpLoad %bool %x_98_phi
+               OpSelectionMerge %116 None
+               OpBranchConditional %115 %117 %118
+        %117 = OpLabel
+        %119 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+        %120 = OpLoad %int %119
+        %121 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %122 = OpLoad %int %121
+        %123 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %124 = OpLoad %int %123
+        %125 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+        %126 = OpLoad %int %125
+        %127 = OpConvertSToF %float %120
+        %128 = OpConvertSToF %float %122
+        %129 = OpConvertSToF %float %124
+        %130 = OpConvertSToF %float %126
+        %131 = OpCompositeConstruct %v4float %127 %128 %129 %130
+               OpStore %x_GLF_color %131
+               OpBranch %116
+        %118 = OpLabel
+               OpStore %x_GLF_color %133
+               OpBranch %116
+        %116 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %134
+%tint_symbol = OpFunctionParameter %main_out
+        %138 = OpLabel
+        %139 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %139
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %141 = OpLabel
+        %142 = OpFunctionCall %void %main_1
+        %144 = OpLoad %v4float %x_GLF_color
+        %145 = OpCompositeConstruct %main_out %144
+        %143 = OpFunctionCall %void %tint_symbol_2 %145
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-max-multiplied-values/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-max-multiplied-values/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..f4af7a1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-max-multiplied-values/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,98 @@
+type Arr = [[stride(16)]] array<i32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  var A : array<i32, 4>;
+  var x_77 : bool;
+  var x_87 : bool;
+  var x_97 : bool;
+  var x_78_phi : bool;
+  var x_88_phi : bool;
+  var x_98_phi : bool;
+  let x_33 : i32 = x_6.x_GLF_uniform_int_values[0];
+  i = x_33;
+  loop {
+    let x_38 : i32 = i;
+    let x_40 : i32 = x_6.x_GLF_uniform_int_values[4];
+    if ((x_38 < x_40)) {
+    } else {
+      break;
+    }
+    let x_43 : i32 = i;
+    let x_45 : i32 = x_6.x_GLF_uniform_int_values[0];
+    A[x_43] = x_45;
+    let x_47 : i32 = i;
+    let x_50 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_54 : i32 = x_6.x_GLF_uniform_int_values[1];
+    if ((max((2 * x_47), (2 * x_50)) == x_54)) {
+      let x_58 : i32 = i;
+      A[x_58] = 1;
+    }
+
+    continuing {
+      let x_60 : i32 = i;
+      i = (x_60 + 1);
+    }
+  }
+  let x_63 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_65 : i32 = A[x_63];
+  let x_67 : i32 = x_6.x_GLF_uniform_int_values[3];
+  let x_68 : bool = (x_65 == x_67);
+  x_78_phi = x_68;
+  if (x_68) {
+    let x_72 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_74 : i32 = A[x_72];
+    let x_76 : i32 = x_6.x_GLF_uniform_int_values[3];
+    x_77 = (x_74 == x_76);
+    x_78_phi = x_77;
+  }
+  let x_78 : bool = x_78_phi;
+  x_88_phi = x_78;
+  if (x_78) {
+    let x_82 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_84 : i32 = A[x_82];
+    let x_86 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_87 = (x_84 == x_86);
+    x_88_phi = x_87;
+  }
+  let x_88 : bool = x_88_phi;
+  x_98_phi = x_88;
+  if (x_88) {
+    let x_92 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_94 : i32 = A[x_92];
+    let x_96 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_97 = (x_94 == x_96);
+    x_98_phi = x_97;
+  }
+  let x_98 : bool = x_98_phi;
+  if (x_98) {
+    let x_103 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_106 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_109 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_112 : i32 = x_6.x_GLF_uniform_int_values[3];
+    x_GLF_color = vec4<f32>(f32(x_103), f32(x_106), f32(x_109), f32(x_112));
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-modulo-1/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplify-modulo-1/0-opt.spvasm
new file mode 100644
index 0000000..9e5dbf8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-modulo-1/0-opt.spvasm
@@ -0,0 +1,83 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_1 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+     %uint_1 = OpConstant %uint 1
+%_arr_int_uint_1 = OpTypeArray %int %uint_1
+       %buf1 = OpTypeStruct %_arr_int_uint_1
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %main = OpFunction %void None %12
+         %28 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function
+         %29 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %30 = OpLoad %float %29
+         %31 = OpFMod %float %30 %float_1
+               OpStore %a %31
+         %32 = OpLoad %float %a
+         %33 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %34 = OpLoad %float %33
+         %35 = OpFOrdEqual %bool %32 %34
+               OpSelectionMerge %36 None
+               OpBranchConditional %35 %37 %38
+         %37 = OpLabel
+         %39 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %40 = OpLoad %int %39
+         %41 = OpConvertSToF %float %40
+         %42 = OpLoad %float %a
+         %43 = OpLoad %float %a
+         %44 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %45 = OpLoad %int %44
+         %46 = OpConvertSToF %float %45
+         %47 = OpCompositeConstruct %v4float %41 %42 %43 %46
+               OpStore %_GLF_color %47
+               OpBranch %36
+         %38 = OpLabel
+         %48 = OpLoad %float %a
+         %49 = OpCompositeConstruct %v4float %48 %48 %48 %48
+               OpStore %_GLF_color %49
+               OpBranch %36
+         %36 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-modulo-1/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-modulo-1/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..2ae1a6e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-modulo-1/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,44 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[1];
+};
+
+void main_1() {
+  float a = 0.0f;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_30 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  a = (x_30 % 1.0f);
+  const float x_32 = a;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_34 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_32 == x_34)) {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_40 = asint(x_8[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const float x_42 = a;
+    const float x_43 = a;
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_45 = asint(x_8[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    x_GLF_color = float4(float(x_40), x_42, x_43, float(x_45));
+  } else {
+    const float x_48 = a;
+    x_GLF_color = float4(x_48, x_48, x_48, x_48);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-modulo-1/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-modulo-1/0-opt.spvasm.expected.msl
new file mode 100755
index 0000000..514ffa4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-modulo-1/0-opt.spvasm.expected.msl
@@ -0,0 +1,64 @@
+SKIP: FAILED
+
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_8, thread float4* const tint_symbol_4) {
+  float a = 0.0f;
+  float const x_30 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  a = (x_30 % 1.0f);
+  float const x_32 = a;
+  float const x_34 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_32 == x_34)) {
+    int const x_40 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    float const x_42 = a;
+    float const x_43 = a;
+    int const x_45 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_40), x_42, x_43, float(x_45));
+  } else {
+    float const x_48 = a;
+    *(tint_symbol_4) = float4(x_48, x_48, x_48, x_48);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_8 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
+T:\tmp\us0.0.metal:34:13: error: invalid operands to binary expression ('const float' and 'float')
+  a = (x_30 % 1.0f);
+       ~~~~ ^ ~~~~
+1 error generated.
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-modulo-1/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplify-modulo-1/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..4f6ad22
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-modulo-1/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,117 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 66
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_8 "x_8"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_1 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %11 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %11
+        %int = OpTypeInt 32 1
+     %uint_1 = OpConstant %uint 1
+%_arr_int_uint_1 = OpTypeArray %int %uint_1
+       %buf1 = OpTypeStruct %_arr_int_uint_1
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %11
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %26 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+       %bool = OpTypeBool
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+         %54 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function %26
+         %30 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %31 = OpLoad %float %30
+         %33 = OpFMod %float %31 %float_1
+               OpStore %a %33
+         %34 = OpLoad %float %a
+         %35 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %36 = OpLoad %float %35
+         %37 = OpFOrdEqual %bool %34 %36
+               OpSelectionMerge %39 None
+               OpBranchConditional %37 %40 %41
+         %40 = OpLabel
+         %43 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %44 = OpLoad %int %43
+         %45 = OpLoad %float %a
+         %46 = OpLoad %float %a
+         %47 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %48 = OpLoad %int %47
+         %49 = OpConvertSToF %float %44
+         %50 = OpConvertSToF %float %48
+         %51 = OpCompositeConstruct %v4float %49 %45 %46 %50
+               OpStore %x_GLF_color %51
+               OpBranch %39
+         %41 = OpLabel
+         %52 = OpLoad %float %a
+         %53 = OpCompositeConstruct %v4float %52 %52 %52 %52
+               OpStore %x_GLF_color %53
+               OpBranch %39
+         %39 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %54
+%tint_symbol = OpFunctionParameter %main_out
+         %58 = OpLabel
+         %59 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %59
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+         %61 = OpLabel
+         %62 = OpFunctionCall %void %main_1
+         %64 = OpLoad %v4float %x_GLF_color
+         %65 = OpCompositeConstruct %main_out %64
+         %63 = OpFunctionCall %void %tint_symbol_2 %65
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-modulo-1/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-modulo-1/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..2690c8d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-modulo-1/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,49 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 1>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+fn main_1() {
+  var a : f32;
+  let x_30 : f32 = x_6.x_GLF_uniform_float_values[0];
+  a = (x_30 % 1.0);
+  let x_32 : f32 = a;
+  let x_34 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if ((x_32 == x_34)) {
+    let x_40 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_42 : f32 = a;
+    let x_43 : f32 = a;
+    let x_45 : i32 = x_8.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_40), x_42, x_43, f32(x_45));
+  } else {
+    let x_48 : f32 = a;
+    x_GLF_color = vec4<f32>(x_48, x_48, x_48, x_48);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-modulo-1/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-modulo-1/0-opt.wgsl
new file mode 100644
index 0000000..2690c8d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-modulo-1/0-opt.wgsl
@@ -0,0 +1,49 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 1>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+fn main_1() {
+  var a : f32;
+  let x_30 : f32 = x_6.x_GLF_uniform_float_values[0];
+  a = (x_30 % 1.0);
+  let x_32 : f32 = a;
+  let x_34 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if ((x_32 == x_34)) {
+    let x_40 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_42 : f32 = a;
+    let x_43 : f32 = a;
+    let x_45 : i32 = x_8.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_40), x_42, x_43, f32(x_45));
+  } else {
+    let x_48 : f32 = a;
+    x_GLF_color = vec4<f32>(x_48, x_48, x_48, x_48);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-modulo-1/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-modulo-1/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..2ae1a6e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-modulo-1/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,44 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[1];
+};
+
+void main_1() {
+  float a = 0.0f;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_30 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  a = (x_30 % 1.0f);
+  const float x_32 = a;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_34 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_32 == x_34)) {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_40 = asint(x_8[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const float x_42 = a;
+    const float x_43 = a;
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_45 = asint(x_8[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    x_GLF_color = float4(float(x_40), x_42, x_43, float(x_45));
+  } else {
+    const float x_48 = a;
+    x_GLF_color = float4(x_48, x_48, x_48, x_48);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-modulo-1/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-modulo-1/0-opt.wgsl.expected.msl
new file mode 100755
index 0000000..7fbbeaa
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-modulo-1/0-opt.wgsl.expected.msl
@@ -0,0 +1,64 @@
+SKIP: FAILED
+
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_8, thread float4* const tint_symbol_4) {
+  float a = 0.0f;
+  float const x_30 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  a = (x_30 % 1.0f);
+  float const x_32 = a;
+  float const x_34 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_32 == x_34)) {
+    int const x_40 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    float const x_42 = a;
+    float const x_43 = a;
+    int const x_45 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_40), x_42, x_43, float(x_45));
+  } else {
+    float const x_48 = a;
+    *(tint_symbol_4) = float4(x_48, x_48, x_48, x_48);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_8 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
+T:\tmp\u8k0.0.metal:34:13: error: invalid operands to binary expression ('const float' and 'float')
+  a = (x_30 % 1.0f);
+       ~~~~ ^ ~~~~
+1 error generated.
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-modulo-1/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplify-modulo-1/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..4f6ad22
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-modulo-1/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,117 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 66
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_8 "x_8"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_1 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %11 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %11
+        %int = OpTypeInt 32 1
+     %uint_1 = OpConstant %uint 1
+%_arr_int_uint_1 = OpTypeArray %int %uint_1
+       %buf1 = OpTypeStruct %_arr_int_uint_1
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %11
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %26 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+       %bool = OpTypeBool
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+         %54 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function %26
+         %30 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %31 = OpLoad %float %30
+         %33 = OpFMod %float %31 %float_1
+               OpStore %a %33
+         %34 = OpLoad %float %a
+         %35 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %36 = OpLoad %float %35
+         %37 = OpFOrdEqual %bool %34 %36
+               OpSelectionMerge %39 None
+               OpBranchConditional %37 %40 %41
+         %40 = OpLabel
+         %43 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %44 = OpLoad %int %43
+         %45 = OpLoad %float %a
+         %46 = OpLoad %float %a
+         %47 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %48 = OpLoad %int %47
+         %49 = OpConvertSToF %float %44
+         %50 = OpConvertSToF %float %48
+         %51 = OpCompositeConstruct %v4float %49 %45 %46 %50
+               OpStore %x_GLF_color %51
+               OpBranch %39
+         %41 = OpLabel
+         %52 = OpLoad %float %a
+         %53 = OpCompositeConstruct %v4float %52 %52 %52 %52
+               OpStore %x_GLF_color %53
+               OpBranch %39
+         %39 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %54
+%tint_symbol = OpFunctionParameter %main_out
+         %58 = OpLabel
+         %59 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %59
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+         %61 = OpLabel
+         %62 = OpFunctionCall %void %main_1
+         %64 = OpLoad %v4float %x_GLF_color
+         %65 = OpCompositeConstruct %main_out %64
+         %63 = OpFunctionCall %void %tint_symbol_2 %65
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-modulo-1/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-modulo-1/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..2690c8d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-modulo-1/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,49 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 1>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+fn main_1() {
+  var a : f32;
+  let x_30 : f32 = x_6.x_GLF_uniform_float_values[0];
+  a = (x_30 % 1.0);
+  let x_32 : f32 = a;
+  let x_34 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if ((x_32 == x_34)) {
+    let x_40 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_42 : f32 = a;
+    let x_43 : f32 = a;
+    let x_45 : i32 = x_8.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_40), x_42, x_43, f32(x_45));
+  } else {
+    let x_48 : f32 = a;
+    x_GLF_color = vec4<f32>(x_48, x_48, x_48, x_48);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-mul-identity/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplify-mul-identity/0-opt.spvasm
new file mode 100644
index 0000000..26c6b31
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-mul-identity/0-opt.spvasm
@@ -0,0 +1,72 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %v "v"
+               OpName %res "res"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%float_8_39999962 = OpConstant %float 8.39999962
+%float_n864_664978 = OpConstant %float -864.664978
+%float_945_419983 = OpConstant %float 945.419983
+    %float_1 = OpConstant %float 1
+         %17 = OpConstantComposite %v4float %float_8_39999962 %float_n864_664978 %float_945_419983 %float_1
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%mat4v4float = OpTypeMatrix %v4float 4
+    %float_0 = OpConstant %float 0
+%float_0_00999999978 = OpConstant %float 0.00999999978
+       %bool = OpTypeBool
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %27 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %28 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %9
+         %29 = OpLabel
+          %v = OpVariable %_ptr_Function_v4float Function
+        %res = OpVariable %_ptr_Function_v4float Function
+               OpStore %v %17
+         %30 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %31 = OpLoad %float %30
+         %32 = OpCompositeConstruct %v4float %31 %float_0 %float_0 %float_0
+         %33 = OpCompositeConstruct %v4float %float_0 %31 %float_0 %float_0
+         %34 = OpCompositeConstruct %v4float %float_0 %float_0 %31 %float_0
+         %35 = OpCompositeConstruct %v4float %float_0 %float_0 %float_0 %31
+         %36 = OpCompositeConstruct %mat4v4float %32 %33 %34 %35
+         %37 = OpLoad %v4float %v
+         %38 = OpMatrixTimesVector %v4float %36 %37
+               OpStore %res %38
+         %39 = OpLoad %v4float %v
+         %40 = OpLoad %v4float %res
+         %41 = OpExtInst %float %1 Distance %39 %40
+         %42 = OpFOrdLessThan %bool %41 %float_0_00999999978
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %45
+         %44 = OpLabel
+               OpStore %_GLF_color %27
+               OpBranch %43
+         %45 = OpLabel
+               OpStore %_GLF_color %28
+               OpBranch %43
+         %43 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-mul-identity/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-mul-identity/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..322962c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-mul-identity/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,32 @@
+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() {
+  float4 v = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 res = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  v = float4(8.399999619f, -864.664978027f, 945.41998291f, 1.0f);
+  const float x_31 = asfloat(x_7[0].x);
+  res = mul(v, float4x4(float4(x_31, 0.0f, 0.0f, 0.0f), float4(0.0f, x_31, 0.0f, 0.0f), float4(0.0f, 0.0f, x_31, 0.0f), float4(0.0f, 0.0f, 0.0f, x_31)));
+  if ((distance(v, res) < 0.01f)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-mul-identity/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-mul-identity/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..6c24b25
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-mul-identity/0-opt.spvasm.expected.msl
@@ -0,0 +1,38 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_4) {
+  float4 v = 0.0f;
+  float4 res = 0.0f;
+  v = float4(8.399999619f, -864.664978027f, 945.41998291f, 1.0f);
+  float const x_31 = x_7.one;
+  float4 const x_37 = v;
+  res = (float4x4(float4(x_31, 0.0f, 0.0f, 0.0f), float4(0.0f, x_31, 0.0f, 0.0f), float4(0.0f, 0.0f, x_31, 0.0f), float4(0.0f, 0.0f, 0.0f, x_31)) * x_37);
+  float4 const x_39 = v;
+  float4 const x_40 = res;
+  if ((distance(x_39, x_40) < 0.01f)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-mul-identity/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplify-mul-identity/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..4cc9182
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-mul-identity/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,104 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 61
+; Schema: 0
+               OpCapability Shader
+         %40 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v "v"
+               OpName %res "res"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%float_8_39999962 = OpConstant %float 8.39999962
+%float_n864_664978 = OpConstant %float -864.664978
+%float_945_419983 = OpConstant %float 945.419983
+    %float_1 = OpConstant %float 1
+         %22 = OpConstantComposite %v4float %float_8_39999962 %float_n864_664978 %float_945_419983 %float_1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%mat4v4float = OpTypeMatrix %v4float 4
+    %float_0 = OpConstant %float 0
+%float_0_00999999978 = OpConstant %float 0.00999999978
+       %bool = OpTypeBool
+         %47 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %48 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %49 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+          %v = OpVariable %_ptr_Function_v4float Function %8
+        %res = OpVariable %_ptr_Function_v4float Function %8
+               OpStore %v %22
+         %26 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0
+         %27 = OpLoad %float %26
+         %28 = OpLoad %v4float %v
+         %31 = OpCompositeConstruct %v4float %27 %float_0 %float_0 %float_0
+         %32 = OpCompositeConstruct %v4float %float_0 %27 %float_0 %float_0
+         %33 = OpCompositeConstruct %v4float %float_0 %float_0 %27 %float_0
+         %34 = OpCompositeConstruct %v4float %float_0 %float_0 %float_0 %27
+         %35 = OpCompositeConstruct %mat4v4float %31 %32 %33 %34
+         %36 = OpMatrixTimesVector %v4float %35 %28
+               OpStore %res %36
+         %37 = OpLoad %v4float %v
+         %38 = OpLoad %v4float %res
+         %39 = OpExtInst %float %40 Distance %37 %38
+         %42 = OpFOrdLessThan %bool %39 %float_0_00999999978
+               OpSelectionMerge %44 None
+               OpBranchConditional %42 %45 %46
+         %45 = OpLabel
+               OpStore %x_GLF_color %47
+               OpBranch %44
+         %46 = OpLabel
+               OpStore %x_GLF_color %48
+               OpBranch %44
+         %44 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %49
+%tint_symbol = OpFunctionParameter %main_out
+         %53 = OpLabel
+         %54 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %54
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %56 = OpLabel
+         %57 = OpFunctionCall %void %main_1
+         %59 = OpLoad %v4float %x_GLF_color
+         %60 = OpCompositeConstruct %main_out %59
+         %58 = OpFunctionCall %void %tint_symbol_2 %60
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-mul-identity/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-mul-identity/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..acefefb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-mul-identity/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,36 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v : vec4<f32>;
+  var res : vec4<f32>;
+  v = vec4<f32>(8.399999619, -864.664978027, 945.41998291, 1.0);
+  let x_31 : f32 = x_7.one;
+  let x_37 : vec4<f32> = v;
+  res = (mat4x4<f32>(vec4<f32>(x_31, 0.0, 0.0, 0.0), vec4<f32>(0.0, x_31, 0.0, 0.0), vec4<f32>(0.0, 0.0, x_31, 0.0), vec4<f32>(0.0, 0.0, 0.0, x_31)) * x_37);
+  let x_39 : vec4<f32> = v;
+  let x_40 : vec4<f32> = res;
+  if ((distance(x_39, x_40) < 0.01)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-mul-identity/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-mul-identity/0-opt.wgsl
new file mode 100644
index 0000000..acefefb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-mul-identity/0-opt.wgsl
@@ -0,0 +1,36 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v : vec4<f32>;
+  var res : vec4<f32>;
+  v = vec4<f32>(8.399999619, -864.664978027, 945.41998291, 1.0);
+  let x_31 : f32 = x_7.one;
+  let x_37 : vec4<f32> = v;
+  res = (mat4x4<f32>(vec4<f32>(x_31, 0.0, 0.0, 0.0), vec4<f32>(0.0, x_31, 0.0, 0.0), vec4<f32>(0.0, 0.0, x_31, 0.0), vec4<f32>(0.0, 0.0, 0.0, x_31)) * x_37);
+  let x_39 : vec4<f32> = v;
+  let x_40 : vec4<f32> = res;
+  if ((distance(x_39, x_40) < 0.01)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-mul-identity/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-mul-identity/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..322962c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-mul-identity/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,32 @@
+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() {
+  float4 v = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 res = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  v = float4(8.399999619f, -864.664978027f, 945.41998291f, 1.0f);
+  const float x_31 = asfloat(x_7[0].x);
+  res = mul(v, float4x4(float4(x_31, 0.0f, 0.0f, 0.0f), float4(0.0f, x_31, 0.0f, 0.0f), float4(0.0f, 0.0f, x_31, 0.0f), float4(0.0f, 0.0f, 0.0f, x_31)));
+  if ((distance(v, res) < 0.01f)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-mul-identity/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-mul-identity/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..6c24b25
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-mul-identity/0-opt.wgsl.expected.msl
@@ -0,0 +1,38 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_4) {
+  float4 v = 0.0f;
+  float4 res = 0.0f;
+  v = float4(8.399999619f, -864.664978027f, 945.41998291f, 1.0f);
+  float const x_31 = x_7.one;
+  float4 const x_37 = v;
+  res = (float4x4(float4(x_31, 0.0f, 0.0f, 0.0f), float4(0.0f, x_31, 0.0f, 0.0f), float4(0.0f, 0.0f, x_31, 0.0f), float4(0.0f, 0.0f, 0.0f, x_31)) * x_37);
+  float4 const x_39 = v;
+  float4 const x_40 = res;
+  if ((distance(x_39, x_40) < 0.01f)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-mul-identity/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplify-mul-identity/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..4cc9182
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-mul-identity/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,104 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 61
+; Schema: 0
+               OpCapability Shader
+         %40 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v "v"
+               OpName %res "res"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%float_8_39999962 = OpConstant %float 8.39999962
+%float_n864_664978 = OpConstant %float -864.664978
+%float_945_419983 = OpConstant %float 945.419983
+    %float_1 = OpConstant %float 1
+         %22 = OpConstantComposite %v4float %float_8_39999962 %float_n864_664978 %float_945_419983 %float_1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%mat4v4float = OpTypeMatrix %v4float 4
+    %float_0 = OpConstant %float 0
+%float_0_00999999978 = OpConstant %float 0.00999999978
+       %bool = OpTypeBool
+         %47 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %48 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %49 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+          %v = OpVariable %_ptr_Function_v4float Function %8
+        %res = OpVariable %_ptr_Function_v4float Function %8
+               OpStore %v %22
+         %26 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0
+         %27 = OpLoad %float %26
+         %28 = OpLoad %v4float %v
+         %31 = OpCompositeConstruct %v4float %27 %float_0 %float_0 %float_0
+         %32 = OpCompositeConstruct %v4float %float_0 %27 %float_0 %float_0
+         %33 = OpCompositeConstruct %v4float %float_0 %float_0 %27 %float_0
+         %34 = OpCompositeConstruct %v4float %float_0 %float_0 %float_0 %27
+         %35 = OpCompositeConstruct %mat4v4float %31 %32 %33 %34
+         %36 = OpMatrixTimesVector %v4float %35 %28
+               OpStore %res %36
+         %37 = OpLoad %v4float %v
+         %38 = OpLoad %v4float %res
+         %39 = OpExtInst %float %40 Distance %37 %38
+         %42 = OpFOrdLessThan %bool %39 %float_0_00999999978
+               OpSelectionMerge %44 None
+               OpBranchConditional %42 %45 %46
+         %45 = OpLabel
+               OpStore %x_GLF_color %47
+               OpBranch %44
+         %46 = OpLabel
+               OpStore %x_GLF_color %48
+               OpBranch %44
+         %44 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %49
+%tint_symbol = OpFunctionParameter %main_out
+         %53 = OpLabel
+         %54 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %54
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %56 = OpLabel
+         %57 = OpFunctionCall %void %main_1
+         %59 = OpLoad %v4float %x_GLF_color
+         %60 = OpCompositeConstruct %main_out %59
+         %58 = OpFunctionCall %void %tint_symbol_2 %60
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-mul-identity/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-mul-identity/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..acefefb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-mul-identity/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,36 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v : vec4<f32>;
+  var res : vec4<f32>;
+  v = vec4<f32>(8.399999619, -864.664978027, 945.41998291, 1.0);
+  let x_31 : f32 = x_7.one;
+  let x_37 : vec4<f32> = v;
+  res = (mat4x4<f32>(vec4<f32>(x_31, 0.0, 0.0, 0.0), vec4<f32>(0.0, x_31, 0.0, 0.0), vec4<f32>(0.0, 0.0, x_31, 0.0), vec4<f32>(0.0, 0.0, 0.0, x_31)) * x_37);
+  let x_39 : vec4<f32> = v;
+  let x_40 : vec4<f32> = res;
+  if ((distance(x_39, x_40) < 0.01)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-not-less-than-neg/0.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplify-not-less-than-neg/0.spvasm
new file mode 100644
index 0000000..cf65bd9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-not-less-than-neg/0.spvasm
@@ -0,0 +1,68 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "three"
+               OpName %_ ""
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+       %bool = OpTypeBool
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+   %float_n5 = OpConstant %float -5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %25 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %26 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %8
+         %27 = OpLabel
+         %28 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %29 = OpLoad %int %28
+         %30 = OpSGreaterThan %bool %29 %int_1
+               OpSelectionMerge %31 None
+               OpBranchConditional %30 %32 %31
+         %32 = OpLabel
+         %33 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %34 = OpLoad %float %33
+         %35 = OpFOrdLessThan %bool %34 %float_n5
+         %36 = OpLogicalNot %bool %35
+               OpBranch %31
+         %31 = OpLabel
+         %37 = OpPhi %bool %30 %27 %36 %32
+               OpSelectionMerge %38 None
+               OpBranchConditional %37 %39 %40
+         %39 = OpLabel
+               OpStore %_GLF_color %25
+               OpBranch %38
+         %40 = OpLabel
+               OpStore %_GLF_color %26
+               OpBranch %38
+         %38 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-not-less-than-neg/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-not-less-than-neg/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..791abae
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-not-less-than-neg/0.spvasm.expected.hlsl
@@ -0,0 +1,43 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  bool x_36 = false;
+  bool x_37_phi = false;
+  const int x_29 = asint(x_6[0].x);
+  const bool x_30 = (x_29 > 1);
+  x_37_phi = x_30;
+  if (x_30) {
+    const float x_34 = gl_FragCoord.y;
+    x_36 = !((x_34 < -5.0f));
+    x_37_phi = x_36;
+  }
+  if (x_37_phi) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-not-less-than-neg/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-not-less-than-neg/0.spvasm.expected.msl
new file mode 100644
index 0000000..051b40e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-not-less-than-neg/0.spvasm.expected.msl
@@ -0,0 +1,43 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int three;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  bool x_36 = false;
+  bool x_37_phi = false;
+  int const x_29 = x_6.three;
+  bool const x_30 = (x_29 > 1);
+  x_37_phi = x_30;
+  if (x_30) {
+    float const x_34 = (*(tint_symbol_5)).y;
+    x_36 = !((x_34 < -5.0f));
+    x_37_phi = x_36;
+  }
+  bool const x_37 = x_37_phi;
+  if (x_37) {
+    *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_6) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-not-less-than-neg/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplify-not-less-than-neg/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..843780c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-not-less-than-neg/0.spvasm.expected.spvasm
@@ -0,0 +1,113 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 62
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "three"
+               OpName %x_6 "x_6"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %x_36 "x_36"
+               OpName %x_37_phi "x_37_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %22 = OpConstantNull %bool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+   %float_n5 = OpConstant %float -5
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %47 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %48 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %49 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+       %x_36 = OpVariable %_ptr_Function_bool Function %22
+   %x_37_phi = OpVariable %_ptr_Function_bool Function %22
+         %27 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0
+         %28 = OpLoad %int %27
+         %30 = OpSGreaterThan %bool %28 %int_1
+               OpStore %x_37_phi %30
+               OpSelectionMerge %31 None
+               OpBranchConditional %30 %32 %31
+         %32 = OpLabel
+         %35 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %36 = OpLoad %float %35
+         %39 = OpFOrdLessThan %bool %36 %float_n5
+         %37 = OpLogicalNot %bool %39
+               OpStore %x_36 %37
+         %40 = OpLoad %bool %x_36
+               OpStore %x_37_phi %40
+               OpBranch %31
+         %31 = OpLabel
+         %41 = OpLoad %bool %x_37_phi
+               OpSelectionMerge %42 None
+               OpBranchConditional %41 %43 %44
+         %43 = OpLabel
+               OpStore %x_GLF_color %47
+               OpBranch %42
+         %44 = OpLabel
+               OpStore %x_GLF_color %48
+               OpBranch %42
+         %42 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %49
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %53 = OpLabel
+         %54 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %54
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %56 = OpLabel
+         %57 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %57
+         %58 = OpFunctionCall %void %main_1
+         %60 = OpLoad %v4float %x_GLF_color
+         %61 = OpCompositeConstruct %main_out %60
+         %59 = OpFunctionCall %void %tint_symbol_3 %61
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-not-less-than-neg/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-not-less-than-neg/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..6bdc812
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-not-less-than-neg/0.spvasm.expected.wgsl
@@ -0,0 +1,42 @@
+[[block]]
+struct buf0 {
+  three : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_36 : bool;
+  var x_37_phi : bool;
+  let x_29 : i32 = x_6.three;
+  let x_30 : bool = (x_29 > 1);
+  x_37_phi = x_30;
+  if (x_30) {
+    let x_34 : f32 = gl_FragCoord.y;
+    x_36 = !((x_34 < -5.0));
+    x_37_phi = x_36;
+  }
+  let x_37 : bool = x_37_phi;
+  if (x_37) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-not-less-than-neg/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-not-less-than-neg/0.wgsl
new file mode 100644
index 0000000..6bdc812
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-not-less-than-neg/0.wgsl
@@ -0,0 +1,42 @@
+[[block]]
+struct buf0 {
+  three : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_36 : bool;
+  var x_37_phi : bool;
+  let x_29 : i32 = x_6.three;
+  let x_30 : bool = (x_29 > 1);
+  x_37_phi = x_30;
+  if (x_30) {
+    let x_34 : f32 = gl_FragCoord.y;
+    x_36 = !((x_34 < -5.0));
+    x_37_phi = x_36;
+  }
+  let x_37 : bool = x_37_phi;
+  if (x_37) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-not-less-than-neg/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-not-less-than-neg/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..791abae
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-not-less-than-neg/0.wgsl.expected.hlsl
@@ -0,0 +1,43 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  bool x_36 = false;
+  bool x_37_phi = false;
+  const int x_29 = asint(x_6[0].x);
+  const bool x_30 = (x_29 > 1);
+  x_37_phi = x_30;
+  if (x_30) {
+    const float x_34 = gl_FragCoord.y;
+    x_36 = !((x_34 < -5.0f));
+    x_37_phi = x_36;
+  }
+  if (x_37_phi) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-not-less-than-neg/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-not-less-than-neg/0.wgsl.expected.msl
new file mode 100644
index 0000000..051b40e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-not-less-than-neg/0.wgsl.expected.msl
@@ -0,0 +1,43 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int three;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  bool x_36 = false;
+  bool x_37_phi = false;
+  int const x_29 = x_6.three;
+  bool const x_30 = (x_29 > 1);
+  x_37_phi = x_30;
+  if (x_30) {
+    float const x_34 = (*(tint_symbol_5)).y;
+    x_36 = !((x_34 < -5.0f));
+    x_37_phi = x_36;
+  }
+  bool const x_37 = x_37_phi;
+  if (x_37) {
+    *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_6) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-not-less-than-neg/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplify-not-less-than-neg/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..843780c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-not-less-than-neg/0.wgsl.expected.spvasm
@@ -0,0 +1,113 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 62
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "three"
+               OpName %x_6 "x_6"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %x_36 "x_36"
+               OpName %x_37_phi "x_37_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %22 = OpConstantNull %bool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+   %float_n5 = OpConstant %float -5
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %47 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %48 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %49 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+       %x_36 = OpVariable %_ptr_Function_bool Function %22
+   %x_37_phi = OpVariable %_ptr_Function_bool Function %22
+         %27 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0
+         %28 = OpLoad %int %27
+         %30 = OpSGreaterThan %bool %28 %int_1
+               OpStore %x_37_phi %30
+               OpSelectionMerge %31 None
+               OpBranchConditional %30 %32 %31
+         %32 = OpLabel
+         %35 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %36 = OpLoad %float %35
+         %39 = OpFOrdLessThan %bool %36 %float_n5
+         %37 = OpLogicalNot %bool %39
+               OpStore %x_36 %37
+         %40 = OpLoad %bool %x_36
+               OpStore %x_37_phi %40
+               OpBranch %31
+         %31 = OpLabel
+         %41 = OpLoad %bool %x_37_phi
+               OpSelectionMerge %42 None
+               OpBranchConditional %41 %43 %44
+         %43 = OpLabel
+               OpStore %x_GLF_color %47
+               OpBranch %42
+         %44 = OpLabel
+               OpStore %x_GLF_color %48
+               OpBranch %42
+         %42 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %49
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %53 = OpLabel
+         %54 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %54
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %56 = OpLabel
+         %57 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %57
+         %58 = OpFunctionCall %void %main_1
+         %60 = OpLoad %v4float %x_GLF_color
+         %61 = OpCompositeConstruct %main_out %60
+         %59 = OpFunctionCall %void %tint_symbol_3 %61
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-not-less-than-neg/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-not-less-than-neg/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..6bdc812
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-not-less-than-neg/0.wgsl.expected.wgsl
@@ -0,0 +1,42 @@
+[[block]]
+struct buf0 {
+  three : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_36 : bool;
+  var x_37_phi : bool;
+  let x_29 : i32 = x_6.three;
+  let x_30 : bool = (x_29 > 1);
+  x_37_phi = x_30;
+  if (x_30) {
+    let x_34 : f32 = gl_FragCoord.y;
+    x_36 = !((x_34 < -5.0));
+    x_37_phi = x_36;
+  }
+  let x_37 : bool = x_37_phi;
+  if (x_37) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-right-shift-greater-than-zero/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplify-right-shift-greater-than-zero/0-opt.spvasm
new file mode 100644
index 0000000..25063bf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-right-shift-greater-than-zero/0-opt.spvasm
@@ -0,0 +1,68 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %int_1 = OpConstant %int 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %8
+         %20 = OpLabel
+         %21 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %22 = OpLoad %int %21
+         %23 = OpShiftRightArithmetic %int %int_1 %22
+         %24 = OpSGreaterThan %bool %23 %int_0
+               OpSelectionMerge %25 None
+               OpBranchConditional %24 %26 %27
+         %26 = OpLabel
+         %28 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %29 = OpLoad %int %28
+         %30 = OpConvertSToF %float %29
+         %31 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %32 = OpLoad %int %31
+         %33 = OpConvertSToF %float %32
+         %34 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %35 = OpLoad %int %34
+         %36 = OpConvertSToF %float %35
+         %37 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %38 = OpLoad %int %37
+         %39 = OpConvertSToF %float %38
+         %40 = OpCompositeConstruct %v4float %30 %33 %36 %39
+               OpStore %_GLF_color %40
+               OpBranch %25
+         %27 = OpLabel
+         %41 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %42 = OpLoad %int %41
+         %43 = OpConvertSToF %float %42
+         %44 = OpCompositeConstruct %v4float %43 %43 %43 %43
+               OpStore %_GLF_color %44
+               OpBranch %25
+         %25 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-right-shift-greater-than-zero/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-right-shift-greater-than-zero/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..cc1c58a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-right-shift-greater-than-zero/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,38 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_22 = asint(x_5[scalar_offset / 4][scalar_offset % 4]);
+  if (((1 >> asuint(x_22)) > 0)) {
+    const int x_29 = asint(x_5[1].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_32 = asint(x_5[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_35 = asint(x_5[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_38 = asint(x_5[1].x);
+    x_GLF_color = float4(float(x_29), float(x_32), float(x_35), float(x_38));
+  } else {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_42 = asint(x_5[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const float x_43 = float(x_42);
+    x_GLF_color = float4(x_43, x_43, x_43, x_43);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-right-shift-greater-than-zero/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-right-shift-greater-than-zero/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..1905aab
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-right-shift-greater-than-zero/0-opt.spvasm.expected.msl
@@ -0,0 +1,44 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  int const x_22 = x_5.x_GLF_uniform_int_values.arr[0].el;
+  if (((1 >> as_type<uint>(x_22)) > 0)) {
+    int const x_29 = x_5.x_GLF_uniform_int_values.arr[1].el;
+    int const x_32 = x_5.x_GLF_uniform_int_values.arr[0].el;
+    int const x_35 = x_5.x_GLF_uniform_int_values.arr[0].el;
+    int const x_38 = x_5.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_29), float(x_32), float(x_35), float(x_38));
+  } else {
+    int const x_42 = x_5.x_GLF_uniform_int_values.arr[0].el;
+    float const x_43 = float(x_42);
+    *(tint_symbol_4) = float4(x_43, x_43, x_43, x_43);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-right-shift-greater-than-zero/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplify-right-shift-greater-than-zero/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..599a2ed
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-right-shift-greater-than-zero/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,101 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 61
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %v4float
+         %49 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+         %22 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %23 = OpLoad %int %22
+         %25 = OpBitcast %uint %23
+         %26 = OpShiftRightArithmetic %int %int_1 %25
+         %27 = OpSGreaterThan %bool %26 %int_0
+               OpSelectionMerge %29 None
+               OpBranchConditional %27 %30 %31
+         %30 = OpLabel
+         %32 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %33 = OpLoad %int %32
+         %34 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %35 = OpLoad %int %34
+         %36 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %37 = OpLoad %int %36
+         %38 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %39 = OpLoad %int %38
+         %40 = OpConvertSToF %float %33
+         %41 = OpConvertSToF %float %35
+         %42 = OpConvertSToF %float %37
+         %43 = OpConvertSToF %float %39
+         %44 = OpCompositeConstruct %v4float %40 %41 %42 %43
+               OpStore %x_GLF_color %44
+               OpBranch %29
+         %31 = OpLabel
+         %45 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %46 = OpLoad %int %45
+         %47 = OpConvertSToF %float %46
+         %48 = OpCompositeConstruct %v4float %47 %47 %47 %47
+               OpStore %x_GLF_color %48
+               OpBranch %29
+         %29 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %49
+%tint_symbol = OpFunctionParameter %main_out
+         %53 = OpLabel
+         %54 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %54
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %56 = OpLabel
+         %57 = OpFunctionCall %void %main_1
+         %59 = OpLoad %v4float %x_GLF_color
+         %60 = OpCompositeConstruct %main_out %59
+         %58 = OpFunctionCall %void %tint_symbol_2 %60
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-right-shift-greater-than-zero/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-right-shift-greater-than-zero/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..24991ca
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-right-shift-greater-than-zero/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,37 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_22 : i32 = x_5.x_GLF_uniform_int_values[0];
+  if (((1 >> bitcast<u32>(x_22)) > 0)) {
+    let x_29 : i32 = x_5.x_GLF_uniform_int_values[1];
+    let x_32 : i32 = x_5.x_GLF_uniform_int_values[0];
+    let x_35 : i32 = x_5.x_GLF_uniform_int_values[0];
+    let x_38 : i32 = x_5.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_29), f32(x_32), f32(x_35), f32(x_38));
+  } else {
+    let x_42 : i32 = x_5.x_GLF_uniform_int_values[0];
+    let x_43 : f32 = f32(x_42);
+    x_GLF_color = vec4<f32>(x_43, x_43, x_43, x_43);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-right-shift-greater-than-zero/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-right-shift-greater-than-zero/0-opt.wgsl
new file mode 100644
index 0000000..24991ca
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-right-shift-greater-than-zero/0-opt.wgsl
@@ -0,0 +1,37 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_22 : i32 = x_5.x_GLF_uniform_int_values[0];
+  if (((1 >> bitcast<u32>(x_22)) > 0)) {
+    let x_29 : i32 = x_5.x_GLF_uniform_int_values[1];
+    let x_32 : i32 = x_5.x_GLF_uniform_int_values[0];
+    let x_35 : i32 = x_5.x_GLF_uniform_int_values[0];
+    let x_38 : i32 = x_5.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_29), f32(x_32), f32(x_35), f32(x_38));
+  } else {
+    let x_42 : i32 = x_5.x_GLF_uniform_int_values[0];
+    let x_43 : f32 = f32(x_42);
+    x_GLF_color = vec4<f32>(x_43, x_43, x_43, x_43);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-right-shift-greater-than-zero/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-right-shift-greater-than-zero/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..cc1c58a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-right-shift-greater-than-zero/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,38 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_22 = asint(x_5[scalar_offset / 4][scalar_offset % 4]);
+  if (((1 >> asuint(x_22)) > 0)) {
+    const int x_29 = asint(x_5[1].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_32 = asint(x_5[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_35 = asint(x_5[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_38 = asint(x_5[1].x);
+    x_GLF_color = float4(float(x_29), float(x_32), float(x_35), float(x_38));
+  } else {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_42 = asint(x_5[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const float x_43 = float(x_42);
+    x_GLF_color = float4(x_43, x_43, x_43, x_43);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-right-shift-greater-than-zero/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-right-shift-greater-than-zero/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..1905aab
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-right-shift-greater-than-zero/0-opt.wgsl.expected.msl
@@ -0,0 +1,44 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  int const x_22 = x_5.x_GLF_uniform_int_values.arr[0].el;
+  if (((1 >> as_type<uint>(x_22)) > 0)) {
+    int const x_29 = x_5.x_GLF_uniform_int_values.arr[1].el;
+    int const x_32 = x_5.x_GLF_uniform_int_values.arr[0].el;
+    int const x_35 = x_5.x_GLF_uniform_int_values.arr[0].el;
+    int const x_38 = x_5.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_29), float(x_32), float(x_35), float(x_38));
+  } else {
+    int const x_42 = x_5.x_GLF_uniform_int_values.arr[0].el;
+    float const x_43 = float(x_42);
+    *(tint_symbol_4) = float4(x_43, x_43, x_43, x_43);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-right-shift-greater-than-zero/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplify-right-shift-greater-than-zero/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..599a2ed
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-right-shift-greater-than-zero/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,101 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 61
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %v4float
+         %49 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+         %22 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %23 = OpLoad %int %22
+         %25 = OpBitcast %uint %23
+         %26 = OpShiftRightArithmetic %int %int_1 %25
+         %27 = OpSGreaterThan %bool %26 %int_0
+               OpSelectionMerge %29 None
+               OpBranchConditional %27 %30 %31
+         %30 = OpLabel
+         %32 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %33 = OpLoad %int %32
+         %34 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %35 = OpLoad %int %34
+         %36 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %37 = OpLoad %int %36
+         %38 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_1
+         %39 = OpLoad %int %38
+         %40 = OpConvertSToF %float %33
+         %41 = OpConvertSToF %float %35
+         %42 = OpConvertSToF %float %37
+         %43 = OpConvertSToF %float %39
+         %44 = OpCompositeConstruct %v4float %40 %41 %42 %43
+               OpStore %x_GLF_color %44
+               OpBranch %29
+         %31 = OpLabel
+         %45 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0 %int_0
+         %46 = OpLoad %int %45
+         %47 = OpConvertSToF %float %46
+         %48 = OpCompositeConstruct %v4float %47 %47 %47 %47
+               OpStore %x_GLF_color %48
+               OpBranch %29
+         %29 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %49
+%tint_symbol = OpFunctionParameter %main_out
+         %53 = OpLabel
+         %54 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %54
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %56 = OpLabel
+         %57 = OpFunctionCall %void %main_1
+         %59 = OpLoad %v4float %x_GLF_color
+         %60 = OpCompositeConstruct %main_out %59
+         %58 = OpFunctionCall %void %tint_symbol_2 %60
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-right-shift-greater-than-zero/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-right-shift-greater-than-zero/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..24991ca
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-right-shift-greater-than-zero/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,37 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_22 : i32 = x_5.x_GLF_uniform_int_values[0];
+  if (((1 >> bitcast<u32>(x_22)) > 0)) {
+    let x_29 : i32 = x_5.x_GLF_uniform_int_values[1];
+    let x_32 : i32 = x_5.x_GLF_uniform_int_values[0];
+    let x_35 : i32 = x_5.x_GLF_uniform_int_values[0];
+    let x_38 : i32 = x_5.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_29), f32(x_32), f32(x_35), f32(x_38));
+  } else {
+    let x_42 : i32 = x_5.x_GLF_uniform_int_values[0];
+    let x_43 : f32 = f32(x_42);
+    x_GLF_color = vec4<f32>(x_43, x_43, x_43, x_43);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-sign-cosh/0.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplify-sign-cosh/0.spvasm
new file mode 100644
index 0000000..3b55d3e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-sign-cosh/0.spvasm
@@ -0,0 +1,63 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %6 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+  %float_709 = OpConstant %float 709
+    %float_1 = OpConstant %float 1
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %21 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %22 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+       %main = OpFunction %void None %8
+         %23 = OpLabel
+         %24 = OpExtInst %float %1 Cosh %float_709
+         %25 = OpExtInst %float %1 FSign %24
+         %26 = OpFOrdEqual %bool %25 %float_1
+         %27 = OpLogicalNot %bool %26
+               OpSelectionMerge %28 None
+               OpBranchConditional %27 %29 %28
+         %29 = OpLabel
+         %30 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+          %6 = OpLoad %int %30
+         %31 = OpIEqual %bool %6 %int_1
+               OpBranch %28
+         %28 = OpLabel
+         %32 = OpPhi %bool %26 %23 %31 %29
+               OpSelectionMerge %33 None
+               OpBranchConditional %32 %34 %35
+         %34 = OpLabel
+               OpStore %_GLF_color %21
+               OpBranch %33
+         %35 = OpLabel
+               OpStore %_GLF_color %22
+               OpBranch %33
+         %33 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-sign-cosh/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-sign-cosh/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..30526ab
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-sign-cosh/0.spvasm.expected.hlsl
@@ -0,0 +1,36 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  bool x_31 = false;
+  bool x_32_phi = false;
+  const bool x_26 = (sign(cosh(709.0f)) == 1.0f);
+  x_32_phi = x_26;
+  if (!(x_26)) {
+    const int x_6 = asint(x_5[0].x);
+    x_31 = (x_6 == 1);
+    x_32_phi = x_31;
+  }
+  if (x_32_phi) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-sign-cosh/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-sign-cosh/0.spvasm.expected.msl
new file mode 100644
index 0000000..97f9005
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-sign-cosh/0.spvasm.expected.msl
@@ -0,0 +1,40 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  bool x_31 = false;
+  bool x_32_phi = false;
+  bool const x_26 = (sign(cosh(709.0f)) == 1.0f);
+  x_32_phi = x_26;
+  if (!(x_26)) {
+    int const x_6 = x_5.one;
+    x_31 = (x_6 == 1);
+    x_32_phi = x_31;
+  }
+  bool const x_32 = x_32_phi;
+  if (x_32) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-sign-cosh/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplify-sign-cosh/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..abf3dc1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-sign-cosh/0.spvasm.expected.spvasm
@@ -0,0 +1,104 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 57
+; Schema: 0
+               OpCapability Shader
+         %22 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_31 "x_31"
+               OpName %x_32_phi "x_32_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %19 = OpConstantNull %bool
+  %float_709 = OpConstant %float 709
+    %float_1 = OpConstant %float 1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+         %43 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %44 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+         %45 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+       %x_31 = OpVariable %_ptr_Function_bool Function %19
+   %x_32_phi = OpVariable %_ptr_Function_bool Function %19
+         %23 = OpExtInst %float %22 Cosh %float_709
+         %21 = OpExtInst %float %22 FSign %23
+         %26 = OpFOrdEqual %bool %21 %float_1
+               OpStore %x_32_phi %26
+         %27 = OpLogicalNot %bool %26
+               OpSelectionMerge %28 None
+               OpBranchConditional %27 %29 %28
+         %29 = OpLabel
+         %33 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0
+         %34 = OpLoad %int %33
+         %36 = OpIEqual %bool %34 %int_1
+               OpStore %x_31 %36
+         %37 = OpLoad %bool %x_31
+               OpStore %x_32_phi %37
+               OpBranch %28
+         %28 = OpLabel
+         %38 = OpLoad %bool %x_32_phi
+               OpSelectionMerge %39 None
+               OpBranchConditional %38 %40 %41
+         %40 = OpLabel
+               OpStore %x_GLF_color %43
+               OpBranch %39
+         %41 = OpLabel
+               OpStore %x_GLF_color %44
+               OpBranch %39
+         %39 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %45
+%tint_symbol = OpFunctionParameter %main_out
+         %49 = OpLabel
+         %50 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %50
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %52 = OpLabel
+         %53 = OpFunctionCall %void %main_1
+         %55 = OpLoad %v4float %x_GLF_color
+         %56 = OpCompositeConstruct %main_out %55
+         %54 = OpFunctionCall %void %tint_symbol_2 %56
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-sign-cosh/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-sign-cosh/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..b37e8cf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-sign-cosh/0.spvasm.expected.wgsl
@@ -0,0 +1,38 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_31 : bool;
+  var x_32_phi : bool;
+  let x_26 : bool = (sign(cosh(709.0)) == 1.0);
+  x_32_phi = x_26;
+  if (!(x_26)) {
+    let x_6 : i32 = x_5.one;
+    x_31 = (x_6 == 1);
+    x_32_phi = x_31;
+  }
+  let x_32 : bool = x_32_phi;
+  if (x_32) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-sign-cosh/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-sign-cosh/0.wgsl
new file mode 100644
index 0000000..b37e8cf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-sign-cosh/0.wgsl
@@ -0,0 +1,38 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_31 : bool;
+  var x_32_phi : bool;
+  let x_26 : bool = (sign(cosh(709.0)) == 1.0);
+  x_32_phi = x_26;
+  if (!(x_26)) {
+    let x_6 : i32 = x_5.one;
+    x_31 = (x_6 == 1);
+    x_32_phi = x_31;
+  }
+  let x_32 : bool = x_32_phi;
+  if (x_32) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-sign-cosh/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-sign-cosh/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..30526ab
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-sign-cosh/0.wgsl.expected.hlsl
@@ -0,0 +1,36 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  bool x_31 = false;
+  bool x_32_phi = false;
+  const bool x_26 = (sign(cosh(709.0f)) == 1.0f);
+  x_32_phi = x_26;
+  if (!(x_26)) {
+    const int x_6 = asint(x_5[0].x);
+    x_31 = (x_6 == 1);
+    x_32_phi = x_31;
+  }
+  if (x_32_phi) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-sign-cosh/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-sign-cosh/0.wgsl.expected.msl
new file mode 100644
index 0000000..97f9005
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-sign-cosh/0.wgsl.expected.msl
@@ -0,0 +1,40 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  bool x_31 = false;
+  bool x_32_phi = false;
+  bool const x_26 = (sign(cosh(709.0f)) == 1.0f);
+  x_32_phi = x_26;
+  if (!(x_26)) {
+    int const x_6 = x_5.one;
+    x_31 = (x_6 == 1);
+    x_32_phi = x_31;
+  }
+  bool const x_32 = x_32_phi;
+  if (x_32) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-sign-cosh/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplify-sign-cosh/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..abf3dc1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-sign-cosh/0.wgsl.expected.spvasm
@@ -0,0 +1,104 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 57
+; Schema: 0
+               OpCapability Shader
+         %22 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_31 "x_31"
+               OpName %x_32_phi "x_32_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %19 = OpConstantNull %bool
+  %float_709 = OpConstant %float 709
+    %float_1 = OpConstant %float 1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+         %43 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %44 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+         %45 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+       %x_31 = OpVariable %_ptr_Function_bool Function %19
+   %x_32_phi = OpVariable %_ptr_Function_bool Function %19
+         %23 = OpExtInst %float %22 Cosh %float_709
+         %21 = OpExtInst %float %22 FSign %23
+         %26 = OpFOrdEqual %bool %21 %float_1
+               OpStore %x_32_phi %26
+         %27 = OpLogicalNot %bool %26
+               OpSelectionMerge %28 None
+               OpBranchConditional %27 %29 %28
+         %29 = OpLabel
+         %33 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0
+         %34 = OpLoad %int %33
+         %36 = OpIEqual %bool %34 %int_1
+               OpStore %x_31 %36
+         %37 = OpLoad %bool %x_31
+               OpStore %x_32_phi %37
+               OpBranch %28
+         %28 = OpLabel
+         %38 = OpLoad %bool %x_32_phi
+               OpSelectionMerge %39 None
+               OpBranchConditional %38 %40 %41
+         %40 = OpLabel
+               OpStore %x_GLF_color %43
+               OpBranch %39
+         %41 = OpLabel
+               OpStore %x_GLF_color %44
+               OpBranch %39
+         %39 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %45
+%tint_symbol = OpFunctionParameter %main_out
+         %49 = OpLabel
+         %50 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %50
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %52 = OpLabel
+         %53 = OpFunctionCall %void %main_1
+         %55 = OpLoad %v4float %x_GLF_color
+         %56 = OpCompositeConstruct %main_out %55
+         %54 = OpFunctionCall %void %tint_symbol_2 %56
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-sign-cosh/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-sign-cosh/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..b37e8cf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-sign-cosh/0.wgsl.expected.wgsl
@@ -0,0 +1,38 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_31 : bool;
+  var x_32_phi : bool;
+  let x_26 : bool = (sign(cosh(709.0)) == 1.0);
+  x_32_phi = x_26;
+  if (!(x_26)) {
+    let x_6 : i32 = x_5.one;
+    x_31 = (x_6 == 1);
+    x_32_phi = x_31;
+  }
+  let x_32 : bool = x_32_phi;
+  if (x_32) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-smoothstep-undef/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplify-smoothstep-undef/0-opt.spvasm
new file mode 100644
index 0000000..cd282a9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-smoothstep-undef/0-opt.spvasm
@@ -0,0 +1,96 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %f "f"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+%float_n0x1_8p_128 = OpConstant %float -0x1.8p+128
+    %float_5 = OpConstant %float 5
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %27 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %28 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %9
+         %29 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function
+         %30 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %31 = OpLoad %float %30
+               OpStore %f %31
+         %32 = OpLoad %float %f
+         %33 = OpFAdd %float %32 %float_n0x1_8p_128
+               OpStore %f %33
+         %34 = OpLoad %float %f
+         %35 = OpFDiv %float %float_5 %34
+         %36 = OpFOrdEqual %bool %35 %float_0
+               OpSelectionMerge %37 None
+               OpBranchConditional %36 %38 %37
+         %38 = OpLabel
+         %39 = OpLoad %float %f
+         %40 = OpFAdd %float %39 %float_1
+               OpStore %f %40
+               OpBranch %37
+         %37 = OpLabel
+         %41 = OpLoad %float %f
+         %42 = OpIsNan %bool %41
+         %43 = OpLogicalNot %bool %42
+               OpSelectionMerge %44 None
+               OpBranchConditional %43 %45 %44
+         %45 = OpLabel
+         %46 = OpLoad %float %f
+         %47 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %48 = OpLoad %float %47
+         %49 = OpFOrdNotEqual %bool %46 %48
+               OpBranch %44
+         %44 = OpLabel
+         %50 = OpPhi %bool %42 %37 %49 %45
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %51
+         %52 = OpLabel
+               OpStore %f %float_0
+               OpBranch %51
+         %51 = OpLabel
+         %53 = OpLoad %float %f
+         %54 = OpFOrdEqual %bool %53 %float_0
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %57
+         %56 = OpLabel
+               OpStore %_GLF_color %27
+               OpBranch %55
+         %57 = OpLabel
+               OpStore %_GLF_color %28
+               OpBranch %55
+         %55 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-smoothstep-undef/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-smoothstep-undef/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..25c78f5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-smoothstep-undef/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,53 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+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() {
+  float f = 0.0f;
+  bool x_49 = false;
+  bool x_50_phi = false;
+  const float x_31 = gl_FragCoord.x;
+  f = x_31;
+  f = (f + asfloat(0x7fc00000u));
+  if (((5.0f / f) == 0.0f)) {
+    f = (f + 1.0f);
+  }
+  const bool x_42 = isnan(f);
+  x_50_phi = x_42;
+  if (!(x_42)) {
+    const float x_46 = f;
+    const float x_48 = asfloat(x_7[0].x);
+    x_49 = (x_46 != x_48);
+    x_50_phi = x_49;
+  }
+  if (x_50_phi) {
+    f = 0.0f;
+  }
+  if ((f == 0.0f)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-smoothstep-undef/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-smoothstep-undef/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..b9e9449
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-smoothstep-undef/0-opt.spvasm.expected.msl
@@ -0,0 +1,58 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float zero;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float f = 0.0f;
+  bool x_49 = false;
+  bool x_50_phi = false;
+  float const x_31 = (*(tint_symbol_5)).x;
+  f = x_31;
+  float const x_32 = f;
+  f = (x_32 + NAN);
+  float const x_34 = f;
+  if (((5.0f / x_34) == 0.0f)) {
+    float const x_39 = f;
+    f = (x_39 + 1.0f);
+  }
+  float const x_41 = f;
+  bool const x_42 = isnan(x_41);
+  x_50_phi = x_42;
+  if (!(x_42)) {
+    float const x_46 = f;
+    float const x_48 = x_7.zero;
+    x_49 = (x_46 != x_48);
+    x_50_phi = x_49;
+  }
+  bool const x_50 = x_50_phi;
+  if (x_50) {
+    f = 0.0f;
+  }
+  float const x_53 = f;
+  if ((x_53 == 0.0f)) {
+    *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_6) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_7, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-smoothstep-undef/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplify-smoothstep-undef/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..d020f59
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-smoothstep-undef/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,140 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 78
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %x_49 "x_49"
+               OpName %x_50_phi "x_50_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %20 = OpConstantNull %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %24 = OpConstantNull %bool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+%float_n0x1_8p_128 = OpConstant %float -0x1.8p+128
+    %float_5 = OpConstant %float 5
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+         %63 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %64 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %65 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %20
+       %x_49 = OpVariable %_ptr_Function_bool Function %24
+   %x_50_phi = OpVariable %_ptr_Function_bool Function %24
+         %29 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %30 = OpLoad %float %29
+               OpStore %f %30
+         %31 = OpLoad %float %f
+         %33 = OpFAdd %float %31 %float_n0x1_8p_128
+               OpStore %f %33
+         %34 = OpLoad %float %f
+         %36 = OpFDiv %float %float_5 %34
+         %38 = OpFOrdEqual %bool %36 %float_0
+               OpSelectionMerge %39 None
+               OpBranchConditional %38 %40 %39
+         %40 = OpLabel
+         %41 = OpLoad %float %f
+         %43 = OpFAdd %float %41 %float_1
+               OpStore %f %43
+               OpBranch %39
+         %39 = OpLabel
+         %44 = OpLoad %float %f
+         %45 = OpIsNan %bool %44
+               OpStore %x_50_phi %45
+         %46 = OpLogicalNot %bool %45
+               OpSelectionMerge %47 None
+               OpBranchConditional %46 %48 %47
+         %48 = OpLabel
+         %49 = OpLoad %float %f
+         %51 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0
+         %52 = OpLoad %float %51
+         %53 = OpFOrdNotEqual %bool %49 %52
+               OpStore %x_49 %53
+         %54 = OpLoad %bool %x_49
+               OpStore %x_50_phi %54
+               OpBranch %47
+         %47 = OpLabel
+         %55 = OpLoad %bool %x_50_phi
+               OpSelectionMerge %56 None
+               OpBranchConditional %55 %57 %56
+         %57 = OpLabel
+               OpStore %f %float_0
+               OpBranch %56
+         %56 = OpLabel
+         %58 = OpLoad %float %f
+         %59 = OpFOrdEqual %bool %58 %float_0
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %62
+         %61 = OpLabel
+               OpStore %x_GLF_color %63
+               OpBranch %60
+         %62 = OpLabel
+               OpStore %x_GLF_color %64
+               OpBranch %60
+         %60 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %65
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %69 = OpLabel
+         %70 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %70
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %72 = OpLabel
+         %73 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %73
+         %74 = OpFunctionCall %void %main_1
+         %76 = OpLoad %v4float %x_GLF_color
+         %77 = OpCompositeConstruct %main_out %76
+         %75 = OpFunctionCall %void %tint_symbol_3 %77
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-smoothstep-undef/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-smoothstep-undef/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..6638485
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-smoothstep-undef/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,57 @@
+[[block]]
+struct buf0 {
+  zero : f32;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  var x_49 : bool;
+  var x_50_phi : bool;
+  let x_31 : f32 = gl_FragCoord.x;
+  f = x_31;
+  let x_32 : f32 = f;
+  f = (x_32 + -0x1.8p+128);
+  let x_34 : f32 = f;
+  if (((5.0 / x_34) == 0.0)) {
+    let x_39 : f32 = f;
+    f = (x_39 + 1.0);
+  }
+  let x_41 : f32 = f;
+  let x_42 : bool = isNan(x_41);
+  x_50_phi = x_42;
+  if (!(x_42)) {
+    let x_46 : f32 = f;
+    let x_48 : f32 = x_7.zero;
+    x_49 = (x_46 != x_48);
+    x_50_phi = x_49;
+  }
+  let x_50 : bool = x_50_phi;
+  if (x_50) {
+    f = 0.0;
+  }
+  let x_53 : f32 = f;
+  if ((x_53 == 0.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-smoothstep-undef/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-smoothstep-undef/0-opt.wgsl
new file mode 100644
index 0000000..6638485
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-smoothstep-undef/0-opt.wgsl
@@ -0,0 +1,57 @@
+[[block]]
+struct buf0 {
+  zero : f32;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var f : f32;
+  var x_49 : bool;
+  var x_50_phi : bool;
+  let x_31 : f32 = gl_FragCoord.x;
+  f = x_31;
+  let x_32 : f32 = f;
+  f = (x_32 + -0x1.8p+128);
+  let x_34 : f32 = f;
+  if (((5.0 / x_34) == 0.0)) {
+    let x_39 : f32 = f;
+    f = (x_39 + 1.0);
+  }
+  let x_41 : f32 = f;
+  let x_42 : bool = isNan(x_41);
+  x_50_phi = x_42;
+  if (!(x_42)) {
+    let x_46 : f32 = f;
+    let x_48 : f32 = x_7.zero;
+    x_49 = (x_46 != x_48);
+    x_50_phi = x_49;
+  }
+  let x_50 : bool = x_50_phi;
+  if (x_50) {
+    f = 0.0;
+  }
+  let x_53 : f32 = f;
+  if ((x_53 == 0.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-smoothstep-undef/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-smoothstep-undef/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..20e17e7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-smoothstep-undef/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,6 @@
+SKIP: FAILED
+
+graphicsfuzz/cov-simplify-smoothstep-undef/0-opt.wgsl:19:19 error: expected ')'
+  f = (x_32 + -0x1.8p+128);
+                  ^^
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-smoothstep-undef/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-smoothstep-undef/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..20e17e7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-smoothstep-undef/0-opt.wgsl.expected.msl
@@ -0,0 +1,6 @@
+SKIP: FAILED
+
+graphicsfuzz/cov-simplify-smoothstep-undef/0-opt.wgsl:19:19 error: expected ')'
+  f = (x_32 + -0x1.8p+128);
+                  ^^
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-smoothstep-undef/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-simplify-smoothstep-undef/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..20e17e7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-smoothstep-undef/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,6 @@
+SKIP: FAILED
+
+graphicsfuzz/cov-simplify-smoothstep-undef/0-opt.wgsl:19:19 error: expected ')'
+  f = (x_32 + -0x1.8p+128);
+                  ^^
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-simplify-smoothstep-undef/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-simplify-smoothstep-undef/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..20e17e7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-simplify-smoothstep-undef/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+SKIP: FAILED
+
+graphicsfuzz/cov-simplify-smoothstep-undef/0-opt.wgsl:19:19 error: expected ')'
+  f = (x_32 + -0x1.8p+128);
+                  ^^
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-sin-mul-mat-mat-mul-vec-mat/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-sin-mul-mat-mat-mul-vec-mat/0-opt.spvasm
new file mode 100644
index 0000000..a89702b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-sin-mul-mat-mat-mul-vec-mat/0-opt.spvasm
@@ -0,0 +1,158 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %f1_vf2_ "f1(vf2;"
+               OpName %v1 "v1"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %m1 "m1"
+               OpName %m2 "m2"
+               OpName %v1_0 "v1"
+               OpName %a "a"
+               OpName %param "param"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+        %int = OpTypeInt 32 1
+         %23 = OpTypeFunction %int %_ptr_Function_v2float
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+      %int_1 = OpConstant %int 1
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%mat2v2float = OpTypeMatrix %v2float 2
+%_ptr_Function_mat2v2float = OpTypePointer Function %mat2v2float
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+%_ptr_Function_int = OpTypePointer Function %int
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %18
+         %43 = OpLabel
+         %m1 = OpVariable %_ptr_Function_mat2v2float Function
+         %m2 = OpVariable %_ptr_Function_mat2v2float Function
+       %v1_0 = OpVariable %_ptr_Function_v2float Function
+          %a = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_v2float Function
+         %44 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %45 = OpLoad %float %44
+         %46 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %47 = OpLoad %float %46
+         %48 = OpFNegate %float %47
+         %49 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %50 = OpLoad %float %49
+         %51 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %52 = OpLoad %float %51
+         %53 = OpExtInst %float %1 Sin %52
+         %54 = OpCompositeConstruct %v2float %45 %48
+         %55 = OpCompositeConstruct %v2float %50 %53
+         %56 = OpCompositeConstruct %mat2v2float %54 %55
+               OpStore %m1 %56
+         %57 = OpLoad %mat2v2float %m1
+         %58 = OpLoad %mat2v2float %m1
+         %59 = OpMatrixTimesMatrix %mat2v2float %57 %58
+               OpStore %m2 %59
+         %60 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %61 = OpLoad %float %60
+         %62 = OpCompositeConstruct %v2float %61 %61
+         %63 = OpLoad %mat2v2float %m2
+         %64 = OpVectorTimesMatrix %v2float %62 %63
+               OpStore %v1_0 %64
+         %65 = OpLoad %v2float %v1_0
+               OpStore %param %65
+         %66 = OpFunctionCall %int %f1_vf2_ %param
+               OpStore %a %66
+         %67 = OpLoad %int %a
+         %68 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %69 = OpLoad %int %68
+         %70 = OpIEqual %bool %67 %69
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %73
+         %72 = OpLabel
+         %74 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %75 = OpLoad %float %74
+         %76 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %77 = OpLoad %float %76
+         %78 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %79 = OpLoad %float %78
+         %80 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %81 = OpLoad %float %80
+         %82 = OpCompositeConstruct %v4float %75 %77 %79 %81
+               OpStore %_GLF_color %82
+               OpBranch %71
+         %73 = OpLabel
+         %83 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %84 = OpLoad %int %83
+         %85 = OpConvertSToF %float %84
+         %86 = OpCompositeConstruct %v4float %85 %85 %85 %85
+               OpStore %_GLF_color %86
+               OpBranch %71
+         %71 = OpLabel
+               OpReturn
+               OpFunctionEnd
+    %f1_vf2_ = OpFunction %int None %23
+         %v1 = OpFunctionParameter %_ptr_Function_v2float
+         %87 = OpLabel
+         %88 = OpAccessChain %_ptr_Function_float %v1 %uint_0
+         %89 = OpLoad %float %88
+         %90 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %91 = OpLoad %float %90
+         %92 = OpFOrdEqual %bool %89 %91
+               OpSelectionMerge %93 None
+               OpBranchConditional %92 %94 %93
+         %94 = OpLabel
+         %95 = OpAccessChain %_ptr_Function_float %v1 %uint_1
+         %96 = OpLoad %float %95
+         %97 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %98 = OpLoad %float %97
+         %99 = OpFOrdEqual %bool %96 %98
+               OpBranch %93
+         %93 = OpLabel
+        %100 = OpPhi %bool %92 %87 %99 %94
+               OpSelectionMerge %101 None
+               OpBranchConditional %100 %102 %101
+        %102 = OpLabel
+        %103 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %104 = OpLoad %int %103
+               OpReturnValue %104
+        %101 = OpLabel
+        %105 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+        %106 = OpLoad %int %105
+               OpReturnValue %106
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-sin-mul-mat-mat-mul-vec-mat/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-sin-mul-mat-mat-mul-vec-mat/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..96a4bf3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-sin-mul-mat-mat-mul-vec-mat/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,81 @@
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[2];
+};
+cbuffer cbuffer_x_9 : register(b1, space0) {
+  uint4 x_9[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+int f1_vf2_(inout float2 v1) {
+  bool x_99 = false;
+  bool x_100_phi = false;
+  const float x_89 = v1.x;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_91 = asfloat(x_7[scalar_offset / 4][scalar_offset % 4]);
+  const bool x_92 = (x_89 == x_91);
+  x_100_phi = x_92;
+  if (x_92) {
+    const float x_96 = v1.y;
+    const float x_98 = asfloat(x_7[1].x);
+    x_99 = (x_96 == x_98);
+    x_100_phi = x_99;
+  }
+  if (x_100_phi) {
+    const int x_104 = asint(x_9[1].x);
+    return x_104;
+  }
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_106 = asint(x_9[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  return x_106;
+}
+
+void main_1() {
+  float2x2 m1 = float2x2(0.0f, 0.0f, 0.0f, 0.0f);
+  float2x2 m2 = float2x2(0.0f, 0.0f, 0.0f, 0.0f);
+  float2 v1_1 = float2(0.0f, 0.0f);
+  int a = 0;
+  float2 param = float2(0.0f, 0.0f);
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const float x_45 = asfloat(x_7[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  const float x_47 = asfloat(x_7[1].x);
+  const float x_50 = asfloat(x_7[1].x);
+  const float x_52 = asfloat(x_7[1].x);
+  m1 = float2x2(float2(x_45, -(x_47)), float2(x_50, sin(x_52)));
+  m2 = mul(m1, m1);
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const float x_61 = asfloat(x_7[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  v1_1 = mul(m2, float2(x_61, x_61));
+  param = v1_1;
+  const int x_66 = f1_vf2_(param);
+  a = x_66;
+  const int x_67 = a;
+  const int x_69 = asint(x_9[1].x);
+  if ((x_67 == x_69)) {
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const float x_75 = asfloat(x_7[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const float x_77 = asfloat(x_7[1].x);
+    const float x_79 = asfloat(x_7[1].x);
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const float x_81 = asfloat(x_7[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    x_GLF_color = float4(x_75, x_77, x_79, x_81);
+  } else {
+    const int x_84 = asint(x_9[1].x);
+    const float x_85 = float(x_84);
+    x_GLF_color = float4(x_85, x_85, x_85, x_85);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-sin-mul-mat-mat-mul-vec-mat/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-sin-mul-mat-mat-mul-vec-mat/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..47967f7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-sin-mul-mat-mat-mul-vec-mat/0-opt.spvasm.expected.msl
@@ -0,0 +1,97 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int f1_vf2_(constant buf0& x_7, constant buf1& x_9, thread float2* const v1) {
+  bool x_99 = false;
+  bool x_100_phi = false;
+  float const x_89 = (*(v1)).x;
+  float const x_91 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  bool const x_92 = (x_89 == x_91);
+  x_100_phi = x_92;
+  if (x_92) {
+    float const x_96 = (*(v1)).y;
+    float const x_98 = x_7.x_GLF_uniform_float_values.arr[1].el;
+    x_99 = (x_96 == x_98);
+    x_100_phi = x_99;
+  }
+  bool const x_100 = x_100_phi;
+  if (x_100) {
+    int const x_104 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    return x_104;
+  }
+  int const x_106 = x_9.x_GLF_uniform_int_values.arr[0].el;
+  return x_106;
+}
+
+void main_1(constant buf0& x_7, constant buf1& x_9, thread float4* const tint_symbol_4) {
+  float2x2 m1 = float2x2(0.0f);
+  float2x2 m2 = float2x2(0.0f);
+  float2 v1_1 = 0.0f;
+  int a = 0;
+  float2 param = 0.0f;
+  float const x_45 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  float const x_47 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  float const x_50 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  float const x_52 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  m1 = float2x2(float2(x_45, -(x_47)), float2(x_50, sin(x_52)));
+  float2x2 const x_57 = m1;
+  float2x2 const x_58 = m1;
+  m2 = (x_57 * x_58);
+  float const x_61 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  float2x2 const x_63 = m2;
+  v1_1 = (float2(x_61, x_61) * x_63);
+  float2 const x_65 = v1_1;
+  param = x_65;
+  int const x_66 = f1_vf2_(x_7, x_9, &(param));
+  a = x_66;
+  int const x_67 = a;
+  int const x_69 = x_9.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_67 == x_69)) {
+    float const x_75 = x_7.x_GLF_uniform_float_values.arr[0].el;
+    float const x_77 = x_7.x_GLF_uniform_float_values.arr[1].el;
+    float const x_79 = x_7.x_GLF_uniform_float_values.arr[1].el;
+    float const x_81 = x_7.x_GLF_uniform_float_values.arr[0].el;
+    *(tint_symbol_4) = float4(x_75, x_77, x_79, x_81);
+  } else {
+    int const x_84 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    float const x_85 = float(x_84);
+    *(tint_symbol_4) = float4(x_85, x_85, x_85, x_85);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]], constant buf1& x_9 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-sin-mul-mat-mat-mul-vec-mat/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-sin-mul-mat-mat-mul-vec-mat/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..f217e59
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-sin-mul-mat-mat-mul-vec-mat/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,202 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 131
+; Schema: 0
+               OpCapability Shader
+         %85 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_7 "x_7"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %f1_vf2_ "f1_vf2_"
+               OpName %v1 "v1"
+               OpName %x_99 "x_99"
+               OpName %x_100_phi "x_100_phi"
+               OpName %main_1 "main_1"
+               OpName %m1 "m1"
+               OpName %m2 "m2"
+               OpName %v1_1 "v1_1"
+               OpName %a "a"
+               OpName %param "param"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_9 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %16
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %19 = OpTypeFunction %int %_ptr_Function_v2float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %28 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %void = OpTypeVoid
+         %59 = OpTypeFunction %void
+%mat2v2float = OpTypeMatrix %v2float 2
+%_ptr_Function_mat2v2float = OpTypePointer Function %mat2v2float
+         %66 = OpConstantNull %mat2v2float
+         %69 = OpConstantNull %v2float
+%_ptr_Function_int = OpTypePointer Function %int
+         %72 = OpConstantNull %int
+   %main_out = OpTypeStruct %v4float
+        %119 = OpTypeFunction %void %main_out
+    %f1_vf2_ = OpFunction %int None %19
+         %v1 = OpFunctionParameter %_ptr_Function_v2float
+         %24 = OpLabel
+       %x_99 = OpVariable %_ptr_Function_bool Function %28
+  %x_100_phi = OpVariable %_ptr_Function_bool Function %28
+         %33 = OpAccessChain %_ptr_Function_float %v1 %uint_0
+         %34 = OpLoad %float %33
+         %37 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %38 = OpLoad %float %37
+         %39 = OpFOrdEqual %bool %34 %38
+               OpStore %x_100_phi %39
+               OpSelectionMerge %40 None
+               OpBranchConditional %39 %41 %40
+         %41 = OpLabel
+         %44 = OpAccessChain %_ptr_Function_float %v1 %uint_1
+         %45 = OpLoad %float %44
+         %47 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %48 = OpLoad %float %47
+         %49 = OpFOrdEqual %bool %45 %48
+               OpStore %x_99 %49
+         %50 = OpLoad %bool %x_99
+               OpStore %x_100_phi %50
+               OpBranch %40
+         %40 = OpLabel
+         %51 = OpLoad %bool %x_100_phi
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %52
+         %53 = OpLabel
+         %55 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %56 = OpLoad %int %55
+               OpReturnValue %56
+         %52 = OpLabel
+         %57 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %58 = OpLoad %int %57
+               OpReturnValue %58
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %59
+         %62 = OpLabel
+         %m1 = OpVariable %_ptr_Function_mat2v2float Function %66
+         %m2 = OpVariable %_ptr_Function_mat2v2float Function %66
+       %v1_1 = OpVariable %_ptr_Function_v2float Function %69
+          %a = OpVariable %_ptr_Function_int Function %72
+      %param = OpVariable %_ptr_Function_v2float Function %69
+         %74 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %75 = OpLoad %float %74
+         %76 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %77 = OpLoad %float %76
+         %78 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %79 = OpLoad %float %78
+         %80 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %81 = OpLoad %float %80
+         %82 = OpFNegate %float %77
+         %83 = OpCompositeConstruct %v2float %75 %82
+         %84 = OpExtInst %float %85 Sin %81
+         %86 = OpCompositeConstruct %v2float %79 %84
+         %87 = OpCompositeConstruct %mat2v2float %83 %86
+               OpStore %m1 %87
+         %88 = OpLoad %mat2v2float %m1
+         %89 = OpLoad %mat2v2float %m1
+         %90 = OpMatrixTimesMatrix %mat2v2float %88 %89
+               OpStore %m2 %90
+         %91 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %92 = OpLoad %float %91
+         %93 = OpLoad %mat2v2float %m2
+         %94 = OpCompositeConstruct %v2float %92 %92
+         %95 = OpVectorTimesMatrix %v2float %94 %93
+               OpStore %v1_1 %95
+         %96 = OpLoad %v2float %v1_1
+               OpStore %param %96
+         %97 = OpFunctionCall %int %f1_vf2_ %param
+               OpStore %a %97
+         %99 = OpLoad %int %a
+        %100 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+        %101 = OpLoad %int %100
+        %102 = OpIEqual %bool %99 %101
+               OpSelectionMerge %103 None
+               OpBranchConditional %102 %104 %105
+        %104 = OpLabel
+        %106 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+        %107 = OpLoad %float %106
+        %108 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+        %109 = OpLoad %float %108
+        %110 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+        %111 = OpLoad %float %110
+        %112 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+        %113 = OpLoad %float %112
+        %114 = OpCompositeConstruct %v4float %107 %109 %111 %113
+               OpStore %x_GLF_color %114
+               OpBranch %103
+        %105 = OpLabel
+        %115 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+        %116 = OpLoad %int %115
+        %117 = OpConvertSToF %float %116
+        %118 = OpCompositeConstruct %v4float %117 %117 %117 %117
+               OpStore %x_GLF_color %118
+               OpBranch %103
+        %103 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %119
+%tint_symbol = OpFunctionParameter %main_out
+        %123 = OpLabel
+        %124 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %124
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %59
+        %126 = OpLabel
+        %127 = OpFunctionCall %void %main_1
+        %129 = OpLoad %v4float %x_GLF_color
+        %130 = OpCompositeConstruct %main_out %129
+        %128 = OpFunctionCall %void %tint_symbol_2 %130
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-sin-mul-mat-mat-mul-vec-mat/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-sin-mul-mat-mat-mul-vec-mat/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..c0a7f76
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-sin-mul-mat-mat-mul-vec-mat/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,89 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn f1_vf2_(v1 : ptr<function, vec2<f32>>) -> i32 {
+  var x_99 : bool;
+  var x_100_phi : bool;
+  let x_89 : f32 = (*(v1)).x;
+  let x_91 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_92 : bool = (x_89 == x_91);
+  x_100_phi = x_92;
+  if (x_92) {
+    let x_96 : f32 = (*(v1)).y;
+    let x_98 : f32 = x_7.x_GLF_uniform_float_values[1];
+    x_99 = (x_96 == x_98);
+    x_100_phi = x_99;
+  }
+  let x_100 : bool = x_100_phi;
+  if (x_100) {
+    let x_104 : i32 = x_9.x_GLF_uniform_int_values[1];
+    return x_104;
+  }
+  let x_106 : i32 = x_9.x_GLF_uniform_int_values[0];
+  return x_106;
+}
+
+fn main_1() {
+  var m1 : mat2x2<f32>;
+  var m2 : mat2x2<f32>;
+  var v1_1 : vec2<f32>;
+  var a : i32;
+  var param : vec2<f32>;
+  let x_45 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_47 : f32 = x_7.x_GLF_uniform_float_values[1];
+  let x_50 : f32 = x_7.x_GLF_uniform_float_values[1];
+  let x_52 : f32 = x_7.x_GLF_uniform_float_values[1];
+  m1 = mat2x2<f32>(vec2<f32>(x_45, -(x_47)), vec2<f32>(x_50, sin(x_52)));
+  let x_57 : mat2x2<f32> = m1;
+  let x_58 : mat2x2<f32> = m1;
+  m2 = (x_57 * x_58);
+  let x_61 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_63 : mat2x2<f32> = m2;
+  v1_1 = (vec2<f32>(x_61, x_61) * x_63);
+  let x_65 : vec2<f32> = v1_1;
+  param = x_65;
+  let x_66 : i32 = f1_vf2_(&(param));
+  a = x_66;
+  let x_67 : i32 = a;
+  let x_69 : i32 = x_9.x_GLF_uniform_int_values[1];
+  if ((x_67 == x_69)) {
+    let x_75 : f32 = x_7.x_GLF_uniform_float_values[0];
+    let x_77 : f32 = x_7.x_GLF_uniform_float_values[1];
+    let x_79 : f32 = x_7.x_GLF_uniform_float_values[1];
+    let x_81 : f32 = x_7.x_GLF_uniform_float_values[0];
+    x_GLF_color = vec4<f32>(x_75, x_77, x_79, x_81);
+  } else {
+    let x_84 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_85 : f32 = f32(x_84);
+    x_GLF_color = vec4<f32>(x_85, x_85, x_85, x_85);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-sin-mul-mat-mat-mul-vec-mat/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-sin-mul-mat-mat-mul-vec-mat/0-opt.wgsl
new file mode 100644
index 0000000..c0a7f76
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-sin-mul-mat-mat-mul-vec-mat/0-opt.wgsl
@@ -0,0 +1,89 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn f1_vf2_(v1 : ptr<function, vec2<f32>>) -> i32 {
+  var x_99 : bool;
+  var x_100_phi : bool;
+  let x_89 : f32 = (*(v1)).x;
+  let x_91 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_92 : bool = (x_89 == x_91);
+  x_100_phi = x_92;
+  if (x_92) {
+    let x_96 : f32 = (*(v1)).y;
+    let x_98 : f32 = x_7.x_GLF_uniform_float_values[1];
+    x_99 = (x_96 == x_98);
+    x_100_phi = x_99;
+  }
+  let x_100 : bool = x_100_phi;
+  if (x_100) {
+    let x_104 : i32 = x_9.x_GLF_uniform_int_values[1];
+    return x_104;
+  }
+  let x_106 : i32 = x_9.x_GLF_uniform_int_values[0];
+  return x_106;
+}
+
+fn main_1() {
+  var m1 : mat2x2<f32>;
+  var m2 : mat2x2<f32>;
+  var v1_1 : vec2<f32>;
+  var a : i32;
+  var param : vec2<f32>;
+  let x_45 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_47 : f32 = x_7.x_GLF_uniform_float_values[1];
+  let x_50 : f32 = x_7.x_GLF_uniform_float_values[1];
+  let x_52 : f32 = x_7.x_GLF_uniform_float_values[1];
+  m1 = mat2x2<f32>(vec2<f32>(x_45, -(x_47)), vec2<f32>(x_50, sin(x_52)));
+  let x_57 : mat2x2<f32> = m1;
+  let x_58 : mat2x2<f32> = m1;
+  m2 = (x_57 * x_58);
+  let x_61 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_63 : mat2x2<f32> = m2;
+  v1_1 = (vec2<f32>(x_61, x_61) * x_63);
+  let x_65 : vec2<f32> = v1_1;
+  param = x_65;
+  let x_66 : i32 = f1_vf2_(&(param));
+  a = x_66;
+  let x_67 : i32 = a;
+  let x_69 : i32 = x_9.x_GLF_uniform_int_values[1];
+  if ((x_67 == x_69)) {
+    let x_75 : f32 = x_7.x_GLF_uniform_float_values[0];
+    let x_77 : f32 = x_7.x_GLF_uniform_float_values[1];
+    let x_79 : f32 = x_7.x_GLF_uniform_float_values[1];
+    let x_81 : f32 = x_7.x_GLF_uniform_float_values[0];
+    x_GLF_color = vec4<f32>(x_75, x_77, x_79, x_81);
+  } else {
+    let x_84 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_85 : f32 = f32(x_84);
+    x_GLF_color = vec4<f32>(x_85, x_85, x_85, x_85);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-sin-mul-mat-mat-mul-vec-mat/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-sin-mul-mat-mat-mul-vec-mat/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..96a4bf3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-sin-mul-mat-mat-mul-vec-mat/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,81 @@
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[2];
+};
+cbuffer cbuffer_x_9 : register(b1, space0) {
+  uint4 x_9[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+int f1_vf2_(inout float2 v1) {
+  bool x_99 = false;
+  bool x_100_phi = false;
+  const float x_89 = v1.x;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_91 = asfloat(x_7[scalar_offset / 4][scalar_offset % 4]);
+  const bool x_92 = (x_89 == x_91);
+  x_100_phi = x_92;
+  if (x_92) {
+    const float x_96 = v1.y;
+    const float x_98 = asfloat(x_7[1].x);
+    x_99 = (x_96 == x_98);
+    x_100_phi = x_99;
+  }
+  if (x_100_phi) {
+    const int x_104 = asint(x_9[1].x);
+    return x_104;
+  }
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_106 = asint(x_9[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  return x_106;
+}
+
+void main_1() {
+  float2x2 m1 = float2x2(0.0f, 0.0f, 0.0f, 0.0f);
+  float2x2 m2 = float2x2(0.0f, 0.0f, 0.0f, 0.0f);
+  float2 v1_1 = float2(0.0f, 0.0f);
+  int a = 0;
+  float2 param = float2(0.0f, 0.0f);
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const float x_45 = asfloat(x_7[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  const float x_47 = asfloat(x_7[1].x);
+  const float x_50 = asfloat(x_7[1].x);
+  const float x_52 = asfloat(x_7[1].x);
+  m1 = float2x2(float2(x_45, -(x_47)), float2(x_50, sin(x_52)));
+  m2 = mul(m1, m1);
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const float x_61 = asfloat(x_7[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  v1_1 = mul(m2, float2(x_61, x_61));
+  param = v1_1;
+  const int x_66 = f1_vf2_(param);
+  a = x_66;
+  const int x_67 = a;
+  const int x_69 = asint(x_9[1].x);
+  if ((x_67 == x_69)) {
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const float x_75 = asfloat(x_7[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const float x_77 = asfloat(x_7[1].x);
+    const float x_79 = asfloat(x_7[1].x);
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const float x_81 = asfloat(x_7[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    x_GLF_color = float4(x_75, x_77, x_79, x_81);
+  } else {
+    const int x_84 = asint(x_9[1].x);
+    const float x_85 = float(x_84);
+    x_GLF_color = float4(x_85, x_85, x_85, x_85);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-sin-mul-mat-mat-mul-vec-mat/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-sin-mul-mat-mat-mul-vec-mat/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..47967f7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-sin-mul-mat-mat-mul-vec-mat/0-opt.wgsl.expected.msl
@@ -0,0 +1,97 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int f1_vf2_(constant buf0& x_7, constant buf1& x_9, thread float2* const v1) {
+  bool x_99 = false;
+  bool x_100_phi = false;
+  float const x_89 = (*(v1)).x;
+  float const x_91 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  bool const x_92 = (x_89 == x_91);
+  x_100_phi = x_92;
+  if (x_92) {
+    float const x_96 = (*(v1)).y;
+    float const x_98 = x_7.x_GLF_uniform_float_values.arr[1].el;
+    x_99 = (x_96 == x_98);
+    x_100_phi = x_99;
+  }
+  bool const x_100 = x_100_phi;
+  if (x_100) {
+    int const x_104 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    return x_104;
+  }
+  int const x_106 = x_9.x_GLF_uniform_int_values.arr[0].el;
+  return x_106;
+}
+
+void main_1(constant buf0& x_7, constant buf1& x_9, thread float4* const tint_symbol_4) {
+  float2x2 m1 = float2x2(0.0f);
+  float2x2 m2 = float2x2(0.0f);
+  float2 v1_1 = 0.0f;
+  int a = 0;
+  float2 param = 0.0f;
+  float const x_45 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  float const x_47 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  float const x_50 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  float const x_52 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  m1 = float2x2(float2(x_45, -(x_47)), float2(x_50, sin(x_52)));
+  float2x2 const x_57 = m1;
+  float2x2 const x_58 = m1;
+  m2 = (x_57 * x_58);
+  float const x_61 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  float2x2 const x_63 = m2;
+  v1_1 = (float2(x_61, x_61) * x_63);
+  float2 const x_65 = v1_1;
+  param = x_65;
+  int const x_66 = f1_vf2_(x_7, x_9, &(param));
+  a = x_66;
+  int const x_67 = a;
+  int const x_69 = x_9.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_67 == x_69)) {
+    float const x_75 = x_7.x_GLF_uniform_float_values.arr[0].el;
+    float const x_77 = x_7.x_GLF_uniform_float_values.arr[1].el;
+    float const x_79 = x_7.x_GLF_uniform_float_values.arr[1].el;
+    float const x_81 = x_7.x_GLF_uniform_float_values.arr[0].el;
+    *(tint_symbol_4) = float4(x_75, x_77, x_79, x_81);
+  } else {
+    int const x_84 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    float const x_85 = float(x_84);
+    *(tint_symbol_4) = float4(x_85, x_85, x_85, x_85);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]], constant buf1& x_9 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-sin-mul-mat-mat-mul-vec-mat/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-sin-mul-mat-mat-mul-vec-mat/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..f217e59
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-sin-mul-mat-mat-mul-vec-mat/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,202 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 131
+; Schema: 0
+               OpCapability Shader
+         %85 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_7 "x_7"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %f1_vf2_ "f1_vf2_"
+               OpName %v1 "v1"
+               OpName %x_99 "x_99"
+               OpName %x_100_phi "x_100_phi"
+               OpName %main_1 "main_1"
+               OpName %m1 "m1"
+               OpName %m2 "m2"
+               OpName %v1_1 "v1_1"
+               OpName %a "a"
+               OpName %param "param"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf0 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_9 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %16
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %19 = OpTypeFunction %int %_ptr_Function_v2float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %28 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %void = OpTypeVoid
+         %59 = OpTypeFunction %void
+%mat2v2float = OpTypeMatrix %v2float 2
+%_ptr_Function_mat2v2float = OpTypePointer Function %mat2v2float
+         %66 = OpConstantNull %mat2v2float
+         %69 = OpConstantNull %v2float
+%_ptr_Function_int = OpTypePointer Function %int
+         %72 = OpConstantNull %int
+   %main_out = OpTypeStruct %v4float
+        %119 = OpTypeFunction %void %main_out
+    %f1_vf2_ = OpFunction %int None %19
+         %v1 = OpFunctionParameter %_ptr_Function_v2float
+         %24 = OpLabel
+       %x_99 = OpVariable %_ptr_Function_bool Function %28
+  %x_100_phi = OpVariable %_ptr_Function_bool Function %28
+         %33 = OpAccessChain %_ptr_Function_float %v1 %uint_0
+         %34 = OpLoad %float %33
+         %37 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %38 = OpLoad %float %37
+         %39 = OpFOrdEqual %bool %34 %38
+               OpStore %x_100_phi %39
+               OpSelectionMerge %40 None
+               OpBranchConditional %39 %41 %40
+         %41 = OpLabel
+         %44 = OpAccessChain %_ptr_Function_float %v1 %uint_1
+         %45 = OpLoad %float %44
+         %47 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %48 = OpLoad %float %47
+         %49 = OpFOrdEqual %bool %45 %48
+               OpStore %x_99 %49
+         %50 = OpLoad %bool %x_99
+               OpStore %x_100_phi %50
+               OpBranch %40
+         %40 = OpLabel
+         %51 = OpLoad %bool %x_100_phi
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %52
+         %53 = OpLabel
+         %55 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %56 = OpLoad %int %55
+               OpReturnValue %56
+         %52 = OpLabel
+         %57 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %58 = OpLoad %int %57
+               OpReturnValue %58
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %59
+         %62 = OpLabel
+         %m1 = OpVariable %_ptr_Function_mat2v2float Function %66
+         %m2 = OpVariable %_ptr_Function_mat2v2float Function %66
+       %v1_1 = OpVariable %_ptr_Function_v2float Function %69
+          %a = OpVariable %_ptr_Function_int Function %72
+      %param = OpVariable %_ptr_Function_v2float Function %69
+         %74 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %75 = OpLoad %float %74
+         %76 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %77 = OpLoad %float %76
+         %78 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %79 = OpLoad %float %78
+         %80 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %81 = OpLoad %float %80
+         %82 = OpFNegate %float %77
+         %83 = OpCompositeConstruct %v2float %75 %82
+         %84 = OpExtInst %float %85 Sin %81
+         %86 = OpCompositeConstruct %v2float %79 %84
+         %87 = OpCompositeConstruct %mat2v2float %83 %86
+               OpStore %m1 %87
+         %88 = OpLoad %mat2v2float %m1
+         %89 = OpLoad %mat2v2float %m1
+         %90 = OpMatrixTimesMatrix %mat2v2float %88 %89
+               OpStore %m2 %90
+         %91 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %92 = OpLoad %float %91
+         %93 = OpLoad %mat2v2float %m2
+         %94 = OpCompositeConstruct %v2float %92 %92
+         %95 = OpVectorTimesMatrix %v2float %94 %93
+               OpStore %v1_1 %95
+         %96 = OpLoad %v2float %v1_1
+               OpStore %param %96
+         %97 = OpFunctionCall %int %f1_vf2_ %param
+               OpStore %a %97
+         %99 = OpLoad %int %a
+        %100 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+        %101 = OpLoad %int %100
+        %102 = OpIEqual %bool %99 %101
+               OpSelectionMerge %103 None
+               OpBranchConditional %102 %104 %105
+        %104 = OpLabel
+        %106 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+        %107 = OpLoad %float %106
+        %108 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+        %109 = OpLoad %float %108
+        %110 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+        %111 = OpLoad %float %110
+        %112 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+        %113 = OpLoad %float %112
+        %114 = OpCompositeConstruct %v4float %107 %109 %111 %113
+               OpStore %x_GLF_color %114
+               OpBranch %103
+        %105 = OpLabel
+        %115 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+        %116 = OpLoad %int %115
+        %117 = OpConvertSToF %float %116
+        %118 = OpCompositeConstruct %v4float %117 %117 %117 %117
+               OpStore %x_GLF_color %118
+               OpBranch %103
+        %103 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %119
+%tint_symbol = OpFunctionParameter %main_out
+        %123 = OpLabel
+        %124 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %124
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %59
+        %126 = OpLabel
+        %127 = OpFunctionCall %void %main_1
+        %129 = OpLoad %v4float %x_GLF_color
+        %130 = OpCompositeConstruct %main_out %129
+        %128 = OpFunctionCall %void %tint_symbol_2 %130
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-sin-mul-mat-mat-mul-vec-mat/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-sin-mul-mat-mat-mul-vec-mat/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..c0a7f76
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-sin-mul-mat-mat-mul-vec-mat/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,89 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn f1_vf2_(v1 : ptr<function, vec2<f32>>) -> i32 {
+  var x_99 : bool;
+  var x_100_phi : bool;
+  let x_89 : f32 = (*(v1)).x;
+  let x_91 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_92 : bool = (x_89 == x_91);
+  x_100_phi = x_92;
+  if (x_92) {
+    let x_96 : f32 = (*(v1)).y;
+    let x_98 : f32 = x_7.x_GLF_uniform_float_values[1];
+    x_99 = (x_96 == x_98);
+    x_100_phi = x_99;
+  }
+  let x_100 : bool = x_100_phi;
+  if (x_100) {
+    let x_104 : i32 = x_9.x_GLF_uniform_int_values[1];
+    return x_104;
+  }
+  let x_106 : i32 = x_9.x_GLF_uniform_int_values[0];
+  return x_106;
+}
+
+fn main_1() {
+  var m1 : mat2x2<f32>;
+  var m2 : mat2x2<f32>;
+  var v1_1 : vec2<f32>;
+  var a : i32;
+  var param : vec2<f32>;
+  let x_45 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_47 : f32 = x_7.x_GLF_uniform_float_values[1];
+  let x_50 : f32 = x_7.x_GLF_uniform_float_values[1];
+  let x_52 : f32 = x_7.x_GLF_uniform_float_values[1];
+  m1 = mat2x2<f32>(vec2<f32>(x_45, -(x_47)), vec2<f32>(x_50, sin(x_52)));
+  let x_57 : mat2x2<f32> = m1;
+  let x_58 : mat2x2<f32> = m1;
+  m2 = (x_57 * x_58);
+  let x_61 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_63 : mat2x2<f32> = m2;
+  v1_1 = (vec2<f32>(x_61, x_61) * x_63);
+  let x_65 : vec2<f32> = v1_1;
+  param = x_65;
+  let x_66 : i32 = f1_vf2_(&(param));
+  a = x_66;
+  let x_67 : i32 = a;
+  let x_69 : i32 = x_9.x_GLF_uniform_int_values[1];
+  if ((x_67 == x_69)) {
+    let x_75 : f32 = x_7.x_GLF_uniform_float_values[0];
+    let x_77 : f32 = x_7.x_GLF_uniform_float_values[1];
+    let x_79 : f32 = x_7.x_GLF_uniform_float_values[1];
+    let x_81 : f32 = x_7.x_GLF_uniform_float_values[0];
+    x_GLF_color = vec4<f32>(x_75, x_77, x_79, x_81);
+  } else {
+    let x_84 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_85 : f32 = f32(x_84);
+    x_GLF_color = vec4<f32>(x_85, x_85, x_85, x_85);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-single-block-elim-self-assign/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-single-block-elim-self-assign/0-opt.spvasm
new file mode 100644
index 0000000..a0e6aa1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-single-block-elim-self-assign/0-opt.spvasm
@@ -0,0 +1,116 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %g "g"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %a "a"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %g RelaxedPrecision
+               OpDecorate %8 RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %9 RelaxedPrecision
+               OpDecorate %10 RelaxedPrecision
+               OpDecorate %a RelaxedPrecision
+               OpDecorate %11 RelaxedPrecision
+               OpDecorate %12 RelaxedPrecision
+               OpDecorate %13 RelaxedPrecision
+               OpDecorate %14 RelaxedPrecision
+               OpDecorate %15 RelaxedPrecision
+               OpDecorate %16 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+          %g = OpVariable %_ptr_Private_int Private
+      %int_0 = OpConstant %int 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_2 = OpConstant %float 2
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+%_ptr_Function_int = OpTypePointer Function %int
+     %uint_1 = OpConstant %uint 1
+      %int_2 = OpConstant %int 2
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %38 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %39 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %18
+         %40 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+               OpStore %g %int_0
+               OpBranch %41
+         %41 = OpLabel
+               OpLoopMerge %42 %43 None
+               OpBranch %44
+         %44 = OpLabel
+          %8 = OpLoad %int %g
+         %45 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %46 = OpLoad %float %45
+         %47 = OpFAdd %float %46 %float_2
+         %48 = OpConvertFToS %int %47
+         %49 = OpSLessThan %bool %8 %48
+               OpBranchConditional %49 %50 %42
+         %50 = OpLabel
+          %9 = OpLoad %int %g
+         %10 = OpIAdd %int %9 %int_1
+               OpStore %g %10
+               OpBranch %43
+         %43 = OpLabel
+               OpBranch %41
+         %42 = OpLabel
+         %11 = OpLoad %int %g
+               OpStore %a %11
+               OpBranch %51
+         %51 = OpLabel
+               OpLoopMerge %52 %53 None
+               OpBranch %54
+         %54 = OpLabel
+         %12 = OpLoad %int %g
+         %55 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %56 = OpLoad %float %55
+         %57 = OpConvertFToS %int %56
+         %58 = OpSLessThan %bool %12 %57
+               OpBranchConditional %58 %59 %52
+         %59 = OpLabel
+         %13 = OpLoad %int %g
+         %14 = OpIAdd %int %13 %int_1
+               OpStore %g %14
+               OpBranch %53
+         %53 = OpLabel
+               OpBranch %51
+         %52 = OpLabel
+         %15 = OpLoad %int %a
+               OpStore %a %15
+         %16 = OpLoad %int %a
+         %60 = OpIEqual %bool %16 %int_2
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %63
+         %62 = OpLabel
+               OpStore %_GLF_color %38
+               OpBranch %61
+         %63 = OpLabel
+               OpStore %_GLF_color %39
+               OpBranch %61
+         %61 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-single-block-elim-self-assign/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-single-block-elim-self-assign/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..ca61b52
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-single-block-elim-self-assign/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,50 @@
+static int g = 0;
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  g = 0;
+  while (true) {
+    const int x_8 = g;
+    const float x_46 = asfloat(x_6[0].x);
+    if ((x_8 < int((x_46 + 2.0f)))) {
+    } else {
+      break;
+    }
+    g = (g + 1);
+  }
+  a = g;
+  while (true) {
+    const int x_12 = g;
+    const float x_56 = asfloat(x_6[0].y);
+    if ((x_12 < int(x_56))) {
+    } else {
+      break;
+    }
+    g = (g + 1);
+  }
+  a = a;
+  if ((a == 2)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-single-block-elim-self-assign/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-single-block-elim-self-assign/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..0bb4833
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-single-block-elim-self-assign/0-opt.spvasm.expected.msl
@@ -0,0 +1,58 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread int* const tint_symbol_4, thread float4* const tint_symbol_5) {
+  int a = 0;
+  *(tint_symbol_4) = 0;
+  while (true) {
+    int const x_8 = *(tint_symbol_4);
+    float const x_46 = x_6.injectionSwitch.x;
+    if ((x_8 < int((x_46 + 2.0f)))) {
+    } else {
+      break;
+    }
+    int const x_9 = *(tint_symbol_4);
+    *(tint_symbol_4) = (x_9 + 1);
+  }
+  int const x_11 = *(tint_symbol_4);
+  a = x_11;
+  while (true) {
+    int const x_12 = *(tint_symbol_4);
+    float const x_56 = x_6.injectionSwitch.y;
+    if ((x_12 < int(x_56))) {
+    } else {
+      break;
+    }
+    int const x_13 = *(tint_symbol_4);
+    *(tint_symbol_4) = (x_13 + 1);
+  }
+  int const x_15 = a;
+  a = x_15;
+  int const x_16 = a;
+  if ((x_16 == 2)) {
+    *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_5) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread int tint_symbol_6 = 0;
+  thread float4 tint_symbol_7 = 0.0f;
+  main_1(x_6, &(tint_symbol_6), &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-single-block-elim-self-assign/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-single-block-elim-self-assign/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..e43ed3b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-single-block-elim-self-assign/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,147 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 83
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %g "g"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+          %4 = OpConstantNull %int
+          %g = OpVariable %_ptr_Private_int Private %4
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %13 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %13
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %13
+       %void = OpTypeVoid
+         %16 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_2 = OpConstant %float 2
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+     %uint_1 = OpConstant %uint 1
+      %int_2 = OpConstant %int 2
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %69 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %70 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %71 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %16
+         %19 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %4
+               OpStore %g %int_0
+               OpBranch %23
+         %23 = OpLabel
+               OpLoopMerge %24 %25 None
+               OpBranch %26
+         %26 = OpLabel
+         %27 = OpLoad %int %g
+         %31 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+         %32 = OpLoad %float %31
+         %35 = OpFAdd %float %32 %float_2
+         %33 = OpConvertFToS %int %35
+         %36 = OpSLessThan %bool %27 %33
+               OpSelectionMerge %38 None
+               OpBranchConditional %36 %39 %40
+         %39 = OpLabel
+               OpBranch %38
+         %40 = OpLabel
+               OpBranch %24
+         %38 = OpLabel
+         %41 = OpLoad %int %g
+         %43 = OpIAdd %int %41 %int_1
+               OpStore %g %43
+               OpBranch %25
+         %25 = OpLabel
+               OpBranch %23
+         %24 = OpLabel
+         %44 = OpLoad %int %g
+               OpStore %a %44
+               OpBranch %45
+         %45 = OpLabel
+               OpLoopMerge %46 %47 None
+               OpBranch %48
+         %48 = OpLabel
+         %49 = OpLoad %int %g
+         %51 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %52 = OpLoad %float %51
+         %53 = OpConvertFToS %int %52
+         %54 = OpSLessThan %bool %49 %53
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %57
+         %56 = OpLabel
+               OpBranch %55
+         %57 = OpLabel
+               OpBranch %46
+         %55 = OpLabel
+         %58 = OpLoad %int %g
+         %59 = OpIAdd %int %58 %int_1
+               OpStore %g %59
+               OpBranch %47
+         %47 = OpLabel
+               OpBranch %45
+         %46 = OpLabel
+         %60 = OpLoad %int %a
+               OpStore %a %60
+         %61 = OpLoad %int %a
+         %63 = OpIEqual %bool %61 %int_2
+               OpSelectionMerge %64 None
+               OpBranchConditional %63 %65 %66
+         %65 = OpLabel
+               OpStore %x_GLF_color %69
+               OpBranch %64
+         %66 = OpLabel
+               OpStore %x_GLF_color %70
+               OpBranch %64
+         %64 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %71
+%tint_symbol = OpFunctionParameter %main_out
+         %75 = OpLabel
+         %76 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %76
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %16
+         %78 = OpLabel
+         %79 = OpFunctionCall %void %main_1
+         %81 = OpLoad %v4float %x_GLF_color
+         %82 = OpCompositeConstruct %main_out %81
+         %80 = OpFunctionCall %void %tint_symbol_2 %82
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-single-block-elim-self-assign/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-single-block-elim-self-assign/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..8a01eaa
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-single-block-elim-self-assign/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,57 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> g : i32;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  g = 0;
+  loop {
+    let x_8 : i32 = g;
+    let x_46 : f32 = x_6.injectionSwitch.x;
+    if ((x_8 < i32((x_46 + 2.0)))) {
+    } else {
+      break;
+    }
+    let x_9 : i32 = g;
+    g = (x_9 + 1);
+  }
+  let x_11 : i32 = g;
+  a = x_11;
+  loop {
+    let x_12 : i32 = g;
+    let x_56 : f32 = x_6.injectionSwitch.y;
+    if ((x_12 < i32(x_56))) {
+    } else {
+      break;
+    }
+    let x_13 : i32 = g;
+    g = (x_13 + 1);
+  }
+  let x_15 : i32 = a;
+  a = x_15;
+  let x_16 : i32 = a;
+  if ((x_16 == 2)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-single-block-elim-self-assign/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-single-block-elim-self-assign/0-opt.wgsl
new file mode 100644
index 0000000..8a01eaa
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-single-block-elim-self-assign/0-opt.wgsl
@@ -0,0 +1,57 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> g : i32;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  g = 0;
+  loop {
+    let x_8 : i32 = g;
+    let x_46 : f32 = x_6.injectionSwitch.x;
+    if ((x_8 < i32((x_46 + 2.0)))) {
+    } else {
+      break;
+    }
+    let x_9 : i32 = g;
+    g = (x_9 + 1);
+  }
+  let x_11 : i32 = g;
+  a = x_11;
+  loop {
+    let x_12 : i32 = g;
+    let x_56 : f32 = x_6.injectionSwitch.y;
+    if ((x_12 < i32(x_56))) {
+    } else {
+      break;
+    }
+    let x_13 : i32 = g;
+    g = (x_13 + 1);
+  }
+  let x_15 : i32 = a;
+  a = x_15;
+  let x_16 : i32 = a;
+  if ((x_16 == 2)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-single-block-elim-self-assign/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-single-block-elim-self-assign/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..ca61b52
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-single-block-elim-self-assign/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,50 @@
+static int g = 0;
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  g = 0;
+  while (true) {
+    const int x_8 = g;
+    const float x_46 = asfloat(x_6[0].x);
+    if ((x_8 < int((x_46 + 2.0f)))) {
+    } else {
+      break;
+    }
+    g = (g + 1);
+  }
+  a = g;
+  while (true) {
+    const int x_12 = g;
+    const float x_56 = asfloat(x_6[0].y);
+    if ((x_12 < int(x_56))) {
+    } else {
+      break;
+    }
+    g = (g + 1);
+  }
+  a = a;
+  if ((a == 2)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-single-block-elim-self-assign/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-single-block-elim-self-assign/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..0bb4833
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-single-block-elim-self-assign/0-opt.wgsl.expected.msl
@@ -0,0 +1,58 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread int* const tint_symbol_4, thread float4* const tint_symbol_5) {
+  int a = 0;
+  *(tint_symbol_4) = 0;
+  while (true) {
+    int const x_8 = *(tint_symbol_4);
+    float const x_46 = x_6.injectionSwitch.x;
+    if ((x_8 < int((x_46 + 2.0f)))) {
+    } else {
+      break;
+    }
+    int const x_9 = *(tint_symbol_4);
+    *(tint_symbol_4) = (x_9 + 1);
+  }
+  int const x_11 = *(tint_symbol_4);
+  a = x_11;
+  while (true) {
+    int const x_12 = *(tint_symbol_4);
+    float const x_56 = x_6.injectionSwitch.y;
+    if ((x_12 < int(x_56))) {
+    } else {
+      break;
+    }
+    int const x_13 = *(tint_symbol_4);
+    *(tint_symbol_4) = (x_13 + 1);
+  }
+  int const x_15 = a;
+  a = x_15;
+  int const x_16 = a;
+  if ((x_16 == 2)) {
+    *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_5) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread int tint_symbol_6 = 0;
+  thread float4 tint_symbol_7 = 0.0f;
+  main_1(x_6, &(tint_symbol_6), &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-single-block-elim-self-assign/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-single-block-elim-self-assign/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..e43ed3b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-single-block-elim-self-assign/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,147 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 83
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %g "g"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+          %4 = OpConstantNull %int
+          %g = OpVariable %_ptr_Private_int Private %4
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %13 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %13
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %13
+       %void = OpTypeVoid
+         %16 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_2 = OpConstant %float 2
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+     %uint_1 = OpConstant %uint 1
+      %int_2 = OpConstant %int 2
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %69 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %70 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %71 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %16
+         %19 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %4
+               OpStore %g %int_0
+               OpBranch %23
+         %23 = OpLabel
+               OpLoopMerge %24 %25 None
+               OpBranch %26
+         %26 = OpLabel
+         %27 = OpLoad %int %g
+         %31 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+         %32 = OpLoad %float %31
+         %35 = OpFAdd %float %32 %float_2
+         %33 = OpConvertFToS %int %35
+         %36 = OpSLessThan %bool %27 %33
+               OpSelectionMerge %38 None
+               OpBranchConditional %36 %39 %40
+         %39 = OpLabel
+               OpBranch %38
+         %40 = OpLabel
+               OpBranch %24
+         %38 = OpLabel
+         %41 = OpLoad %int %g
+         %43 = OpIAdd %int %41 %int_1
+               OpStore %g %43
+               OpBranch %25
+         %25 = OpLabel
+               OpBranch %23
+         %24 = OpLabel
+         %44 = OpLoad %int %g
+               OpStore %a %44
+               OpBranch %45
+         %45 = OpLabel
+               OpLoopMerge %46 %47 None
+               OpBranch %48
+         %48 = OpLabel
+         %49 = OpLoad %int %g
+         %51 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %52 = OpLoad %float %51
+         %53 = OpConvertFToS %int %52
+         %54 = OpSLessThan %bool %49 %53
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %57
+         %56 = OpLabel
+               OpBranch %55
+         %57 = OpLabel
+               OpBranch %46
+         %55 = OpLabel
+         %58 = OpLoad %int %g
+         %59 = OpIAdd %int %58 %int_1
+               OpStore %g %59
+               OpBranch %47
+         %47 = OpLabel
+               OpBranch %45
+         %46 = OpLabel
+         %60 = OpLoad %int %a
+               OpStore %a %60
+         %61 = OpLoad %int %a
+         %63 = OpIEqual %bool %61 %int_2
+               OpSelectionMerge %64 None
+               OpBranchConditional %63 %65 %66
+         %65 = OpLabel
+               OpStore %x_GLF_color %69
+               OpBranch %64
+         %66 = OpLabel
+               OpStore %x_GLF_color %70
+               OpBranch %64
+         %64 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %71
+%tint_symbol = OpFunctionParameter %main_out
+         %75 = OpLabel
+         %76 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %76
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %16
+         %78 = OpLabel
+         %79 = OpFunctionCall %void %main_1
+         %81 = OpLoad %v4float %x_GLF_color
+         %82 = OpCompositeConstruct %main_out %81
+         %80 = OpFunctionCall %void %tint_symbol_2 %82
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-single-block-elim-self-assign/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-single-block-elim-self-assign/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..8a01eaa
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-single-block-elim-self-assign/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,57 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> g : i32;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  g = 0;
+  loop {
+    let x_8 : i32 = g;
+    let x_46 : f32 = x_6.injectionSwitch.x;
+    if ((x_8 < i32((x_46 + 2.0)))) {
+    } else {
+      break;
+    }
+    let x_9 : i32 = g;
+    g = (x_9 + 1);
+  }
+  let x_11 : i32 = g;
+  a = x_11;
+  loop {
+    let x_12 : i32 = g;
+    let x_56 : f32 = x_6.injectionSwitch.y;
+    if ((x_12 < i32(x_56))) {
+    } else {
+      break;
+    }
+    let x_13 : i32 = g;
+    g = (x_13 + 1);
+  }
+  let x_15 : i32 = a;
+  a = x_15;
+  let x_16 : i32 = a;
+  if ((x_16 == 2)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-sinh-ldexp/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-sinh-ldexp/0-opt.spvasm
new file mode 100644
index 0000000..84447e9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-sinh-ldexp/0-opt.spvasm
@@ -0,0 +1,129 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %v1 "v1"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %v2 "v2"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %v3 "v3"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_4 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+       %buf1 = OpTypeStruct %_arr_float_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_3 = OpConstant %int 3
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+  %int_n3000 = OpConstant %int -3000
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_float = OpTypePointer Function %float
+       %bool = OpTypeBool
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+       %main = OpFunction %void None %14
+         %39 = OpLabel
+         %v1 = OpVariable %_ptr_Function_v2float Function
+         %v2 = OpVariable %_ptr_Function_v2int Function
+         %v3 = OpVariable %_ptr_Function_v2float Function
+         %40 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %41 = OpLoad %float %40
+         %42 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_3
+         %43 = OpLoad %float %42
+         %44 = OpCompositeConstruct %v2float %41 %43
+         %45 = OpExtInst %v2float %1 Sinh %44
+               OpStore %v1 %45
+         %46 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %47 = OpLoad %int %46
+         %48 = OpCompositeConstruct %v2int %47 %int_n3000
+               OpStore %v2 %48
+         %49 = OpLoad %v2float %v1
+         %50 = OpLoad %v2int %v2
+         %51 = OpExtInst %v2float %1 Ldexp %49 %50
+               OpStore %v3 %51
+         %52 = OpAccessChain %_ptr_Function_float %v3 %uint_1
+         %53 = OpLoad %float %52
+         %54 = OpCompositeConstruct %v4float %53 %53 %53 %53
+               OpStore %_GLF_color %54
+         %55 = OpAccessChain %_ptr_Function_float %v3 %uint_0
+         %56 = OpLoad %float %55
+         %57 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %58 = OpLoad %float %57
+         %59 = OpFOrdGreaterThan %bool %56 %58
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %60
+         %61 = OpLabel
+         %62 = OpAccessChain %_ptr_Function_float %v3 %uint_0
+         %63 = OpLoad %float %62
+         %64 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %65 = OpLoad %float %64
+         %66 = OpFOrdLessThan %bool %63 %65
+               OpBranch %60
+         %60 = OpLabel
+         %67 = OpPhi %bool %59 %39 %66 %61
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %70
+         %69 = OpLabel
+         %71 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %72 = OpLoad %int %71
+         %73 = OpConvertSToF %float %72
+         %74 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %75 = OpLoad %int %74
+         %76 = OpConvertSToF %float %75
+         %77 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %78 = OpLoad %int %77
+         %79 = OpConvertSToF %float %78
+         %80 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %81 = OpLoad %int %80
+         %82 = OpConvertSToF %float %81
+         %83 = OpCompositeConstruct %v4float %73 %76 %79 %82
+               OpStore %_GLF_color %83
+               OpBranch %68
+         %70 = OpLabel
+         %84 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %85 = OpLoad %int %84
+         %86 = OpConvertSToF %float %85
+         %87 = OpCompositeConstruct %v4float %86 %86 %86 %86
+               OpStore %_GLF_color %87
+               OpBranch %68
+         %68 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-sinh-ldexp/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-sinh-ldexp/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..0c6ec66
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-sinh-ldexp/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,63 @@
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[4];
+};
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2 v1 = float2(0.0f, 0.0f);
+  int2 v2 = int2(0, 0);
+  float2 v3 = float2(0.0f, 0.0f);
+  bool x_66 = false;
+  bool x_67_phi = false;
+  const float x_41 = asfloat(x_6[2].x);
+  const float x_43 = asfloat(x_6[3].x);
+  v1 = sinh(float2(x_41, x_43));
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_47 = asint(x_9[scalar_offset / 4][scalar_offset % 4]);
+  v2 = int2(x_47, -3000);
+  v3 = ldexp(v1, v2);
+  const float x_53 = v3.y;
+  x_GLF_color = float4(x_53, x_53, x_53, x_53);
+  const float x_56 = v3.x;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_58 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const bool x_59 = (x_56 > x_58);
+  x_67_phi = x_59;
+  if (x_59) {
+    const float x_63 = v3.x;
+    const float x_65 = asfloat(x_6[1].x);
+    x_66 = (x_63 < x_65);
+    x_67_phi = x_66;
+  }
+  if (x_67_phi) {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_72 = asint(x_9[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_75 = asint(x_9[1].x);
+    const int x_78 = asint(x_9[1].x);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_81 = asint(x_9[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    x_GLF_color = float4(float(x_72), float(x_75), float(x_78), float(x_81));
+  } else {
+    const int x_85 = asint(x_9[1].x);
+    const float x_86 = float(x_85);
+    x_GLF_color = float4(x_86, x_86, x_86, x_86);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-sinh-ldexp/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-sinh-ldexp/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..0439234
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-sinh-ldexp/0-opt.spvasm.expected.msl
@@ -0,0 +1,79 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_9, thread float4* const tint_symbol_4) {
+  float2 v1 = 0.0f;
+  int2 v2 = 0;
+  float2 v3 = 0.0f;
+  bool x_66 = false;
+  bool x_67_phi = false;
+  float const x_41 = x_6.x_GLF_uniform_float_values.arr[2].el;
+  float const x_43 = x_6.x_GLF_uniform_float_values.arr[3].el;
+  v1 = sinh(float2(x_41, x_43));
+  int const x_47 = x_9.x_GLF_uniform_int_values.arr[0].el;
+  v2 = int2(x_47, -3000);
+  float2 const x_49 = v1;
+  int2 const x_50 = v2;
+  v3 = ldexp(x_49, x_50);
+  float const x_53 = v3.y;
+  *(tint_symbol_4) = float4(x_53, x_53, x_53, x_53);
+  float const x_56 = v3.x;
+  float const x_58 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  bool const x_59 = (x_56 > x_58);
+  x_67_phi = x_59;
+  if (x_59) {
+    float const x_63 = v3.x;
+    float const x_65 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    x_66 = (x_63 < x_65);
+    x_67_phi = x_66;
+  }
+  bool const x_67 = x_67_phi;
+  if (x_67) {
+    int const x_72 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    int const x_75 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_78 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_81 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_72), float(x_75), float(x_78), float(x_81));
+  } else {
+    int const x_85 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    float const x_86 = float(x_85);
+    *(tint_symbol_4) = float4(x_86, x_86, x_86, x_86);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-sinh-ldexp/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-sinh-ldexp/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..7cba6b7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-sinh-ldexp/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,174 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 110
+; Schema: 0
+               OpCapability Shader
+         %47 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v1 "v1"
+               OpName %v2 "v2"
+               OpName %v3 "v3"
+               OpName %x_66 "x_66"
+               OpName %x_67_phi "x_67_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_4 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+       %buf1 = OpTypeStruct %_arr_float_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %27 = OpConstantNull %v2float
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %31 = OpConstantNull %v2int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %36 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_3 = OpConstant %int 3
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+  %int_n3000 = OpConstant %int -3000
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %98 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+         %v1 = OpVariable %_ptr_Function_v2float Function %27
+         %v2 = OpVariable %_ptr_Function_v2int Function %31
+         %v3 = OpVariable %_ptr_Function_v2float Function %27
+       %x_66 = OpVariable %_ptr_Function_bool Function %36
+   %x_67_phi = OpVariable %_ptr_Function_bool Function %36
+         %41 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %42 = OpLoad %float %41
+         %44 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+         %45 = OpLoad %float %44
+         %48 = OpCompositeConstruct %v2float %42 %45
+         %46 = OpExtInst %v2float %47 Sinh %48
+               OpStore %v1 %46
+         %51 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %52 = OpLoad %int %51
+         %54 = OpCompositeConstruct %v2int %52 %int_n3000
+               OpStore %v2 %54
+         %55 = OpLoad %v2float %v1
+         %56 = OpLoad %v2int %v2
+         %57 = OpExtInst %v2float %47 Ldexp %55 %56
+               OpStore %v3 %57
+         %60 = OpAccessChain %_ptr_Function_float %v3 %uint_1
+         %61 = OpLoad %float %60
+         %62 = OpCompositeConstruct %v4float %61 %61 %61 %61
+               OpStore %x_GLF_color %62
+         %63 = OpAccessChain %_ptr_Function_float %v3 %uint_0
+         %64 = OpLoad %float %63
+         %65 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %66 = OpLoad %float %65
+         %67 = OpFOrdGreaterThan %bool %64 %66
+               OpStore %x_67_phi %67
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %68
+         %69 = OpLabel
+         %70 = OpAccessChain %_ptr_Function_float %v3 %uint_0
+         %71 = OpLoad %float %70
+         %73 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %74 = OpLoad %float %73
+         %75 = OpFOrdLessThan %bool %71 %74
+               OpStore %x_66 %75
+         %76 = OpLoad %bool %x_66
+               OpStore %x_67_phi %76
+               OpBranch %68
+         %68 = OpLabel
+         %77 = OpLoad %bool %x_67_phi
+               OpSelectionMerge %78 None
+               OpBranchConditional %77 %79 %80
+         %79 = OpLabel
+         %81 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %82 = OpLoad %int %81
+         %83 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %84 = OpLoad %int %83
+         %85 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %88 = OpLoad %int %87
+         %89 = OpConvertSToF %float %82
+         %90 = OpConvertSToF %float %84
+         %91 = OpConvertSToF %float %86
+         %92 = OpConvertSToF %float %88
+         %93 = OpCompositeConstruct %v4float %89 %90 %91 %92
+               OpStore %x_GLF_color %93
+               OpBranch %78
+         %80 = OpLabel
+         %94 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %95 = OpLoad %int %94
+         %96 = OpConvertSToF %float %95
+         %97 = OpCompositeConstruct %v4float %96 %96 %96 %96
+               OpStore %x_GLF_color %97
+               OpBranch %78
+         %78 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %98
+%tint_symbol = OpFunctionParameter %main_out
+        %102 = OpLabel
+        %103 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %103
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %105 = OpLabel
+        %106 = OpFunctionCall %void %main_1
+        %108 = OpLoad %v4float %x_GLF_color
+        %109 = OpCompositeConstruct %main_out %108
+        %107 = OpFunctionCall %void %tint_symbol_2 %109
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-sinh-ldexp/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-sinh-ldexp/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..6c083f8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-sinh-ldexp/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,71 @@
+type Arr = [[stride(16)]] array<f32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v1 : vec2<f32>;
+  var v2 : vec2<i32>;
+  var v3 : vec2<f32>;
+  var x_66 : bool;
+  var x_67_phi : bool;
+  let x_41 : f32 = x_6.x_GLF_uniform_float_values[2];
+  let x_43 : f32 = x_6.x_GLF_uniform_float_values[3];
+  v1 = sinh(vec2<f32>(x_41, x_43));
+  let x_47 : i32 = x_9.x_GLF_uniform_int_values[0];
+  v2 = vec2<i32>(x_47, -3000);
+  let x_49 : vec2<f32> = v1;
+  let x_50 : vec2<i32> = v2;
+  v3 = ldexp(x_49, x_50);
+  let x_53 : f32 = v3.y;
+  x_GLF_color = vec4<f32>(x_53, x_53, x_53, x_53);
+  let x_56 : f32 = v3.x;
+  let x_58 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_59 : bool = (x_56 > x_58);
+  x_67_phi = x_59;
+  if (x_59) {
+    let x_63 : f32 = v3.x;
+    let x_65 : f32 = x_6.x_GLF_uniform_float_values[1];
+    x_66 = (x_63 < x_65);
+    x_67_phi = x_66;
+  }
+  let x_67 : bool = x_67_phi;
+  if (x_67) {
+    let x_72 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_75 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_78 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_81 : i32 = x_9.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_72), f32(x_75), f32(x_78), f32(x_81));
+  } else {
+    let x_85 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_86 : f32 = f32(x_85);
+    x_GLF_color = vec4<f32>(x_86, x_86, x_86, x_86);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-sinh-ldexp/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-sinh-ldexp/0-opt.wgsl
new file mode 100644
index 0000000..6c083f8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-sinh-ldexp/0-opt.wgsl
@@ -0,0 +1,71 @@
+type Arr = [[stride(16)]] array<f32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v1 : vec2<f32>;
+  var v2 : vec2<i32>;
+  var v3 : vec2<f32>;
+  var x_66 : bool;
+  var x_67_phi : bool;
+  let x_41 : f32 = x_6.x_GLF_uniform_float_values[2];
+  let x_43 : f32 = x_6.x_GLF_uniform_float_values[3];
+  v1 = sinh(vec2<f32>(x_41, x_43));
+  let x_47 : i32 = x_9.x_GLF_uniform_int_values[0];
+  v2 = vec2<i32>(x_47, -3000);
+  let x_49 : vec2<f32> = v1;
+  let x_50 : vec2<i32> = v2;
+  v3 = ldexp(x_49, x_50);
+  let x_53 : f32 = v3.y;
+  x_GLF_color = vec4<f32>(x_53, x_53, x_53, x_53);
+  let x_56 : f32 = v3.x;
+  let x_58 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_59 : bool = (x_56 > x_58);
+  x_67_phi = x_59;
+  if (x_59) {
+    let x_63 : f32 = v3.x;
+    let x_65 : f32 = x_6.x_GLF_uniform_float_values[1];
+    x_66 = (x_63 < x_65);
+    x_67_phi = x_66;
+  }
+  let x_67 : bool = x_67_phi;
+  if (x_67) {
+    let x_72 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_75 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_78 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_81 : i32 = x_9.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_72), f32(x_75), f32(x_78), f32(x_81));
+  } else {
+    let x_85 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_86 : f32 = f32(x_85);
+    x_GLF_color = vec4<f32>(x_86, x_86, x_86, x_86);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-sinh-ldexp/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-sinh-ldexp/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..0c6ec66
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-sinh-ldexp/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,63 @@
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[4];
+};
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2 v1 = float2(0.0f, 0.0f);
+  int2 v2 = int2(0, 0);
+  float2 v3 = float2(0.0f, 0.0f);
+  bool x_66 = false;
+  bool x_67_phi = false;
+  const float x_41 = asfloat(x_6[2].x);
+  const float x_43 = asfloat(x_6[3].x);
+  v1 = sinh(float2(x_41, x_43));
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_47 = asint(x_9[scalar_offset / 4][scalar_offset % 4]);
+  v2 = int2(x_47, -3000);
+  v3 = ldexp(v1, v2);
+  const float x_53 = v3.y;
+  x_GLF_color = float4(x_53, x_53, x_53, x_53);
+  const float x_56 = v3.x;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_58 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const bool x_59 = (x_56 > x_58);
+  x_67_phi = x_59;
+  if (x_59) {
+    const float x_63 = v3.x;
+    const float x_65 = asfloat(x_6[1].x);
+    x_66 = (x_63 < x_65);
+    x_67_phi = x_66;
+  }
+  if (x_67_phi) {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_72 = asint(x_9[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_75 = asint(x_9[1].x);
+    const int x_78 = asint(x_9[1].x);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_81 = asint(x_9[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    x_GLF_color = float4(float(x_72), float(x_75), float(x_78), float(x_81));
+  } else {
+    const int x_85 = asint(x_9[1].x);
+    const float x_86 = float(x_85);
+    x_GLF_color = float4(x_86, x_86, x_86, x_86);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-sinh-ldexp/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-sinh-ldexp/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..0439234
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-sinh-ldexp/0-opt.wgsl.expected.msl
@@ -0,0 +1,79 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_9, thread float4* const tint_symbol_4) {
+  float2 v1 = 0.0f;
+  int2 v2 = 0;
+  float2 v3 = 0.0f;
+  bool x_66 = false;
+  bool x_67_phi = false;
+  float const x_41 = x_6.x_GLF_uniform_float_values.arr[2].el;
+  float const x_43 = x_6.x_GLF_uniform_float_values.arr[3].el;
+  v1 = sinh(float2(x_41, x_43));
+  int const x_47 = x_9.x_GLF_uniform_int_values.arr[0].el;
+  v2 = int2(x_47, -3000);
+  float2 const x_49 = v1;
+  int2 const x_50 = v2;
+  v3 = ldexp(x_49, x_50);
+  float const x_53 = v3.y;
+  *(tint_symbol_4) = float4(x_53, x_53, x_53, x_53);
+  float const x_56 = v3.x;
+  float const x_58 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  bool const x_59 = (x_56 > x_58);
+  x_67_phi = x_59;
+  if (x_59) {
+    float const x_63 = v3.x;
+    float const x_65 = x_6.x_GLF_uniform_float_values.arr[1].el;
+    x_66 = (x_63 < x_65);
+    x_67_phi = x_66;
+  }
+  bool const x_67 = x_67_phi;
+  if (x_67) {
+    int const x_72 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    int const x_75 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_78 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_81 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_72), float(x_75), float(x_78), float(x_81));
+  } else {
+    int const x_85 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    float const x_86 = float(x_85);
+    *(tint_symbol_4) = float4(x_86, x_86, x_86, x_86);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-sinh-ldexp/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-sinh-ldexp/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..7cba6b7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-sinh-ldexp/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,174 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 110
+; Schema: 0
+               OpCapability Shader
+         %47 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v1 "v1"
+               OpName %v2 "v2"
+               OpName %v3 "v3"
+               OpName %x_66 "x_66"
+               OpName %x_67_phi "x_67_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_4 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+       %buf1 = OpTypeStruct %_arr_float_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %27 = OpConstantNull %v2float
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %31 = OpConstantNull %v2int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %36 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_3 = OpConstant %int 3
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+  %int_n3000 = OpConstant %int -3000
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %98 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+         %v1 = OpVariable %_ptr_Function_v2float Function %27
+         %v2 = OpVariable %_ptr_Function_v2int Function %31
+         %v3 = OpVariable %_ptr_Function_v2float Function %27
+       %x_66 = OpVariable %_ptr_Function_bool Function %36
+   %x_67_phi = OpVariable %_ptr_Function_bool Function %36
+         %41 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %42 = OpLoad %float %41
+         %44 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_3
+         %45 = OpLoad %float %44
+         %48 = OpCompositeConstruct %v2float %42 %45
+         %46 = OpExtInst %v2float %47 Sinh %48
+               OpStore %v1 %46
+         %51 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %52 = OpLoad %int %51
+         %54 = OpCompositeConstruct %v2int %52 %int_n3000
+               OpStore %v2 %54
+         %55 = OpLoad %v2float %v1
+         %56 = OpLoad %v2int %v2
+         %57 = OpExtInst %v2float %47 Ldexp %55 %56
+               OpStore %v3 %57
+         %60 = OpAccessChain %_ptr_Function_float %v3 %uint_1
+         %61 = OpLoad %float %60
+         %62 = OpCompositeConstruct %v4float %61 %61 %61 %61
+               OpStore %x_GLF_color %62
+         %63 = OpAccessChain %_ptr_Function_float %v3 %uint_0
+         %64 = OpLoad %float %63
+         %65 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %66 = OpLoad %float %65
+         %67 = OpFOrdGreaterThan %bool %64 %66
+               OpStore %x_67_phi %67
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %68
+         %69 = OpLabel
+         %70 = OpAccessChain %_ptr_Function_float %v3 %uint_0
+         %71 = OpLoad %float %70
+         %73 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %74 = OpLoad %float %73
+         %75 = OpFOrdLessThan %bool %71 %74
+               OpStore %x_66 %75
+         %76 = OpLoad %bool %x_66
+               OpStore %x_67_phi %76
+               OpBranch %68
+         %68 = OpLabel
+         %77 = OpLoad %bool %x_67_phi
+               OpSelectionMerge %78 None
+               OpBranchConditional %77 %79 %80
+         %79 = OpLabel
+         %81 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %82 = OpLoad %int %81
+         %83 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %84 = OpLoad %int %83
+         %85 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %88 = OpLoad %int %87
+         %89 = OpConvertSToF %float %82
+         %90 = OpConvertSToF %float %84
+         %91 = OpConvertSToF %float %86
+         %92 = OpConvertSToF %float %88
+         %93 = OpCompositeConstruct %v4float %89 %90 %91 %92
+               OpStore %x_GLF_color %93
+               OpBranch %78
+         %80 = OpLabel
+         %94 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %95 = OpLoad %int %94
+         %96 = OpConvertSToF %float %95
+         %97 = OpCompositeConstruct %v4float %96 %96 %96 %96
+               OpStore %x_GLF_color %97
+               OpBranch %78
+         %78 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %98
+%tint_symbol = OpFunctionParameter %main_out
+        %102 = OpLabel
+        %103 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %103
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %105 = OpLabel
+        %106 = OpFunctionCall %void %main_1
+        %108 = OpLoad %v4float %x_GLF_color
+        %109 = OpCompositeConstruct %main_out %108
+        %107 = OpFunctionCall %void %tint_symbol_2 %109
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-sinh-ldexp/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-sinh-ldexp/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..6c083f8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-sinh-ldexp/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,71 @@
+type Arr = [[stride(16)]] array<f32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v1 : vec2<f32>;
+  var v2 : vec2<i32>;
+  var v3 : vec2<f32>;
+  var x_66 : bool;
+  var x_67_phi : bool;
+  let x_41 : f32 = x_6.x_GLF_uniform_float_values[2];
+  let x_43 : f32 = x_6.x_GLF_uniform_float_values[3];
+  v1 = sinh(vec2<f32>(x_41, x_43));
+  let x_47 : i32 = x_9.x_GLF_uniform_int_values[0];
+  v2 = vec2<i32>(x_47, -3000);
+  let x_49 : vec2<f32> = v1;
+  let x_50 : vec2<i32> = v2;
+  v3 = ldexp(x_49, x_50);
+  let x_53 : f32 = v3.y;
+  x_GLF_color = vec4<f32>(x_53, x_53, x_53, x_53);
+  let x_56 : f32 = v3.x;
+  let x_58 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_59 : bool = (x_56 > x_58);
+  x_67_phi = x_59;
+  if (x_59) {
+    let x_63 : f32 = v3.x;
+    let x_65 : f32 = x_6.x_GLF_uniform_float_values[1];
+    x_66 = (x_63 < x_65);
+    x_67_phi = x_66;
+  }
+  let x_67 : bool = x_67_phi;
+  if (x_67) {
+    let x_72 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_75 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_78 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_81 : i32 = x_9.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_72), f32(x_75), f32(x_78), f32(x_81));
+  } else {
+    let x_85 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_86 : f32 = f32(x_85);
+    x_GLF_color = vec4<f32>(x_86, x_86, x_86, x_86);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.spvasm
new file mode 100644
index 0000000..5ef5478
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.spvasm
@@ -0,0 +1,92 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %func_ "func("
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpName %i "i"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+         %12 = OpTypeFunction %v4float
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %21 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %22 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+%_ptr_Function_int = OpTypePointer Function %int
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Output_float = OpTypePointer Output %float
+       %main = OpFunction %void None %9
+         %28 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+               OpStore %_GLF_color %22
+               OpStore %i %int_0
+               OpBranch %29
+         %29 = OpLabel
+               OpLoopMerge %30 %31 None
+               OpBranch %32
+         %32 = OpLabel
+         %33 = OpLoad %int %i
+         %34 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %35 = OpLoad %int %34
+         %36 = OpSLessThanEqual %bool %33 %35
+               OpBranchConditional %36 %37 %30
+         %37 = OpLabel
+         %38 = OpLoad %int %i
+               OpSelectionMerge %39 None
+               OpSwitch %38 %40 1 %41 0 %40
+         %40 = OpLabel
+         %42 = OpAccessChain %_ptr_Output_float %_GLF_color %uint_1
+               OpStore %42 %float_0
+               OpBranch %39
+         %41 = OpLabel
+         %43 = OpFunctionCall %v4float %func_
+               OpStore %_GLF_color %43
+               OpBranch %40
+         %39 = OpLabel
+               OpBranch %31
+         %31 = OpLabel
+         %44 = OpLoad %int %i
+         %45 = OpIAdd %int %44 %int_1
+               OpStore %i %45
+               OpBranch %29
+         %30 = OpLabel
+               OpReturn
+               OpFunctionEnd
+      %func_ = OpFunction %v4float None %12
+         %46 = OpLabel
+         %47 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %48 = OpLoad %int %47
+         %49 = OpIEqual %bool %48 %int_1
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %52
+         %51 = OpLabel
+               OpReturnValue %21
+         %52 = OpLabel
+               OpReturnValue %22
+         %50 = OpLabel
+               OpUnreachable
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..aea4365
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,60 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float4 func_() {
+  const int x_48 = asint(x_6[0].x);
+  if ((x_48 == 1)) {
+    return float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    return float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return float4(0.0f, 0.0f, 0.0f, 0.0f);
+}
+
+void main_1() {
+  int i = 0;
+  x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  i = 0;
+  while (true) {
+    const int x_33 = i;
+    const int x_35 = asint(x_6[0].x);
+    if ((x_33 <= x_35)) {
+    } else {
+      break;
+    }
+    switch(i) {
+      case 1: {
+        const float4 x_43 = func_();
+        x_GLF_color = x_43;
+        /* fallthrough */
+      }
+      default: {
+        /* fallthrough */
+      }
+      case 0: {
+        x_GLF_color.y = 0.0f;
+        break;
+      }
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..6614fe8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.spvasm.expected.msl
@@ -0,0 +1,65 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float4 func_(constant buf0& x_6) {
+  int const x_48 = x_6.one;
+  if ((x_48 == 1)) {
+    return float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    return float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return float4(0.0f, 0.0f, 0.0f, 0.0f);
+}
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int i = 0;
+  *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  i = 0;
+  while (true) {
+    int const x_33 = i;
+    int const x_35 = x_6.one;
+    if ((x_33 <= x_35)) {
+    } else {
+      break;
+    }
+    int const x_38 = i;
+    switch(x_38) {
+      case 1: {
+        float4 const x_43 = func_(x_6);
+        *(tint_symbol_4) = x_43;
+        /* fallthrough */
+      }
+      default: {
+        /* fallthrough */
+      }
+      case 0: {
+        (*(tint_symbol_4)).y = 0.0f;
+        break;
+      }
+    }
+    {
+      int const x_44 = i;
+      i = (x_44 + 1);
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..c8ef50f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,132 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 72
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_ "func_"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+         %12 = OpTypeFunction %v4float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %28 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %29 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %36 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+   %main_out = OpTypeStruct %v4float
+         %60 = OpTypeFunction %void %main_out
+      %func_ = OpFunction %v4float None %12
+         %14 = OpLabel
+         %18 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0
+         %19 = OpLoad %int %18
+         %21 = OpIEqual %bool %19 %int_1
+               OpSelectionMerge %23 None
+               OpBranchConditional %21 %24 %25
+         %24 = OpLabel
+               OpReturnValue %28
+         %25 = OpLabel
+               OpReturnValue %29
+         %23 = OpLabel
+               OpReturnValue %29
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %30
+         %33 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %36
+               OpStore %x_GLF_color %29
+               OpStore %i %int_0
+               OpBranch %38
+         %38 = OpLabel
+               OpLoopMerge %39 %40 None
+               OpBranch %41
+         %41 = OpLabel
+         %42 = OpLoad %int %i
+         %43 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0
+         %44 = OpLoad %int %43
+         %45 = OpSLessThanEqual %bool %42 %44
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %48
+         %47 = OpLabel
+               OpBranch %46
+         %48 = OpLabel
+               OpBranch %39
+         %46 = OpLabel
+         %49 = OpLoad %int %i
+               OpSelectionMerge %50 None
+               OpSwitch %49 %51 1 %52 0 %53
+         %52 = OpLabel
+         %54 = OpFunctionCall %v4float %func_
+               OpStore %x_GLF_color %54
+               OpBranch %51
+         %51 = OpLabel
+               OpBranch %53
+         %53 = OpLabel
+         %57 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_1
+               OpStore %57 %float_0
+               OpBranch %50
+         %50 = OpLabel
+               OpBranch %40
+         %40 = OpLabel
+         %58 = OpLoad %int %i
+         %59 = OpIAdd %int %58 %int_1
+               OpStore %i %59
+               OpBranch %38
+         %39 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %60
+%tint_symbol = OpFunctionParameter %main_out
+         %64 = OpLabel
+         %65 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %65
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %30
+         %67 = OpLabel
+         %68 = OpFunctionCall %void %main_1
+         %70 = OpLoad %v4float %x_GLF_color
+         %71 = OpCompositeConstruct %main_out %70
+         %69 = OpFunctionCall %void %tint_symbol_2 %71
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..1f005a5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,63 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> vec4<f32> {
+  let x_48 : i32 = x_6.one;
+  if ((x_48 == 1)) {
+    return vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    return vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return vec4<f32>(0.0, 0.0, 0.0, 0.0);
+}
+
+fn main_1() {
+  var i : i32;
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  i = 0;
+  loop {
+    let x_33 : i32 = i;
+    let x_35 : i32 = x_6.one;
+    if ((x_33 <= x_35)) {
+    } else {
+      break;
+    }
+    let x_38 : i32 = i;
+    switch(x_38) {
+      case 1: {
+        let x_43 : vec4<f32> = func_();
+        x_GLF_color = x_43;
+        fallthrough;
+      }
+      default: {
+        fallthrough;
+      }
+      case 0: {
+        x_GLF_color.y = 0.0;
+      }
+    }
+
+    continuing {
+      let x_44 : i32 = i;
+      i = (x_44 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.wgsl
new file mode 100644
index 0000000..1f005a5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.wgsl
@@ -0,0 +1,63 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> vec4<f32> {
+  let x_48 : i32 = x_6.one;
+  if ((x_48 == 1)) {
+    return vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    return vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return vec4<f32>(0.0, 0.0, 0.0, 0.0);
+}
+
+fn main_1() {
+  var i : i32;
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  i = 0;
+  loop {
+    let x_33 : i32 = i;
+    let x_35 : i32 = x_6.one;
+    if ((x_33 <= x_35)) {
+    } else {
+      break;
+    }
+    let x_38 : i32 = i;
+    switch(x_38) {
+      case 1: {
+        let x_43 : vec4<f32> = func_();
+        x_GLF_color = x_43;
+        fallthrough;
+      }
+      default: {
+        fallthrough;
+      }
+      case 0: {
+        x_GLF_color.y = 0.0;
+      }
+    }
+
+    continuing {
+      let x_44 : i32 = i;
+      i = (x_44 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..aea4365
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,60 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float4 func_() {
+  const int x_48 = asint(x_6[0].x);
+  if ((x_48 == 1)) {
+    return float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    return float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return float4(0.0f, 0.0f, 0.0f, 0.0f);
+}
+
+void main_1() {
+  int i = 0;
+  x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  i = 0;
+  while (true) {
+    const int x_33 = i;
+    const int x_35 = asint(x_6[0].x);
+    if ((x_33 <= x_35)) {
+    } else {
+      break;
+    }
+    switch(i) {
+      case 1: {
+        const float4 x_43 = func_();
+        x_GLF_color = x_43;
+        /* fallthrough */
+      }
+      default: {
+        /* fallthrough */
+      }
+      case 0: {
+        x_GLF_color.y = 0.0f;
+        break;
+      }
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..6614fe8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.wgsl.expected.msl
@@ -0,0 +1,65 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float4 func_(constant buf0& x_6) {
+  int const x_48 = x_6.one;
+  if ((x_48 == 1)) {
+    return float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    return float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return float4(0.0f, 0.0f, 0.0f, 0.0f);
+}
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int i = 0;
+  *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  i = 0;
+  while (true) {
+    int const x_33 = i;
+    int const x_35 = x_6.one;
+    if ((x_33 <= x_35)) {
+    } else {
+      break;
+    }
+    int const x_38 = i;
+    switch(x_38) {
+      case 1: {
+        float4 const x_43 = func_(x_6);
+        *(tint_symbol_4) = x_43;
+        /* fallthrough */
+      }
+      default: {
+        /* fallthrough */
+      }
+      case 0: {
+        (*(tint_symbol_4)).y = 0.0f;
+        break;
+      }
+    }
+    {
+      int const x_44 = i;
+      i = (x_44 + 1);
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..c8ef50f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,132 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 72
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_ "func_"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+         %12 = OpTypeFunction %v4float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %28 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %29 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %36 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+   %main_out = OpTypeStruct %v4float
+         %60 = OpTypeFunction %void %main_out
+      %func_ = OpFunction %v4float None %12
+         %14 = OpLabel
+         %18 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0
+         %19 = OpLoad %int %18
+         %21 = OpIEqual %bool %19 %int_1
+               OpSelectionMerge %23 None
+               OpBranchConditional %21 %24 %25
+         %24 = OpLabel
+               OpReturnValue %28
+         %25 = OpLabel
+               OpReturnValue %29
+         %23 = OpLabel
+               OpReturnValue %29
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %30
+         %33 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %36
+               OpStore %x_GLF_color %29
+               OpStore %i %int_0
+               OpBranch %38
+         %38 = OpLabel
+               OpLoopMerge %39 %40 None
+               OpBranch %41
+         %41 = OpLabel
+         %42 = OpLoad %int %i
+         %43 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0
+         %44 = OpLoad %int %43
+         %45 = OpSLessThanEqual %bool %42 %44
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %48
+         %47 = OpLabel
+               OpBranch %46
+         %48 = OpLabel
+               OpBranch %39
+         %46 = OpLabel
+         %49 = OpLoad %int %i
+               OpSelectionMerge %50 None
+               OpSwitch %49 %51 1 %52 0 %53
+         %52 = OpLabel
+         %54 = OpFunctionCall %v4float %func_
+               OpStore %x_GLF_color %54
+               OpBranch %51
+         %51 = OpLabel
+               OpBranch %53
+         %53 = OpLabel
+         %57 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_1
+               OpStore %57 %float_0
+               OpBranch %50
+         %50 = OpLabel
+               OpBranch %40
+         %40 = OpLabel
+         %58 = OpLoad %int %i
+         %59 = OpIAdd %int %58 %int_1
+               OpStore %i %59
+               OpBranch %38
+         %39 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %60
+%tint_symbol = OpFunctionParameter %main_out
+         %64 = OpLabel
+         %65 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %65
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %30
+         %67 = OpLabel
+         %68 = OpFunctionCall %void %main_1
+         %70 = OpLoad %v4float %x_GLF_color
+         %71 = OpCompositeConstruct %main_out %70
+         %69 = OpFunctionCall %void %tint_symbol_2 %71
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..1f005a5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,63 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> vec4<f32> {
+  let x_48 : i32 = x_6.one;
+  if ((x_48 == 1)) {
+    return vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    return vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return vec4<f32>(0.0, 0.0, 0.0, 0.0);
+}
+
+fn main_1() {
+  var i : i32;
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  i = 0;
+  loop {
+    let x_33 : i32 = i;
+    let x_35 : i32 = x_6.one;
+    if ((x_33 <= x_35)) {
+    } else {
+      break;
+    }
+    let x_38 : i32 = i;
+    switch(x_38) {
+      case 1: {
+        let x_43 : vec4<f32> = func_();
+        x_GLF_color = x_43;
+        fallthrough;
+      }
+      default: {
+        fallthrough;
+      }
+      case 0: {
+        x_GLF_color.y = 0.0;
+      }
+    }
+
+    continuing {
+      let x_44 : i32 = i;
+      i = (x_44 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-step-sinh/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-step-sinh/0-opt.spvasm
new file mode 100644
index 0000000..666b9b0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-step-sinh/0-opt.spvasm
@@ -0,0 +1,49 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %v1 "v1"
+               OpName %v2 "v2"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+    %float_1 = OpConstant %float 1
+   %float_n1 = OpConstant %float -1
+         %13 = OpConstantComposite %v2float %float_1 %float_n1
+%float_0_400000006 = OpConstant %float 0.400000006
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+       %main = OpFunction %void None %7
+         %21 = OpLabel
+         %v1 = OpVariable %_ptr_Function_v2float Function
+         %v2 = OpVariable %_ptr_Function_v2float Function
+               OpStore %v1 %13
+         %22 = OpLoad %v2float %v1
+         %23 = OpExtInst %v2float %1 Sinh %22
+         %24 = OpCompositeConstruct %v2float %float_0_400000006 %float_0_400000006
+         %25 = OpExtInst %v2float %1 Step %24 %23
+               OpStore %v2 %25
+         %26 = OpAccessChain %_ptr_Function_float %v2 %uint_0
+         %27 = OpLoad %float %26
+         %28 = OpAccessChain %_ptr_Function_float %v2 %uint_1
+         %29 = OpLoad %float %28
+         %30 = OpAccessChain %_ptr_Function_float %v2 %uint_1
+         %31 = OpLoad %float %30
+         %32 = OpAccessChain %_ptr_Function_float %v2 %uint_0
+         %33 = OpLoad %float %32
+         %34 = OpCompositeConstruct %v4float %27 %29 %31 %33
+               OpStore %_GLF_color %34
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-step-sinh/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-step-sinh/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..37bf795
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-step-sinh/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,28 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2 v1 = float2(0.0f, 0.0f);
+  float2 v2 = float2(0.0f, 0.0f);
+  v1 = float2(1.0f, -1.0f);
+  v2 = step(float2(0.400000006f, 0.400000006f), sinh(v1));
+  const float x_27 = v2.x;
+  const float x_29 = v2.y;
+  const float x_31 = v2.y;
+  const float x_33 = v2.x;
+  x_GLF_color = float4(x_27, x_29, x_31, x_33);
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-step-sinh/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-step-sinh/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..57eb0c0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-step-sinh/0-opt.spvasm.expected.msl
@@ -0,0 +1,32 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  float2 v1 = 0.0f;
+  float2 v2 = 0.0f;
+  v1 = float2(1.0f, -1.0f);
+  float2 const x_22 = v1;
+  v2 = step(float2(0.400000006f, 0.400000006f), sinh(x_22));
+  float const x_27 = v2.x;
+  float const x_29 = v2.y;
+  float const x_31 = v2.y;
+  float const x_33 = v2.x;
+  *(tint_symbol_4) = float4(x_27, x_29, x_31, x_33);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-step-sinh/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-step-sinh/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..5661e19
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-step-sinh/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,81 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 51
+; Schema: 0
+               OpCapability Shader
+         %22 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v1 "v1"
+               OpName %v2 "v2"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %15 = OpConstantNull %v2float
+    %float_1 = OpConstant %float 1
+   %float_n1 = OpConstant %float -1
+         %19 = OpConstantComposite %v2float %float_1 %float_n1
+%float_0_400000006 = OpConstant %float 0.400000006
+         %24 = OpConstantComposite %v2float %float_0_400000006 %float_0_400000006
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+   %main_out = OpTypeStruct %v4float
+         %39 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+         %v1 = OpVariable %_ptr_Function_v2float Function %15
+         %v2 = OpVariable %_ptr_Function_v2float Function %15
+               OpStore %v1 %19
+         %20 = OpLoad %v2float %v1
+         %25 = OpExtInst %v2float %22 Sinh %20
+         %21 = OpExtInst %v2float %22 Step %24 %25
+               OpStore %v2 %21
+         %29 = OpAccessChain %_ptr_Function_float %v2 %uint_0
+         %30 = OpLoad %float %29
+         %32 = OpAccessChain %_ptr_Function_float %v2 %uint_1
+         %33 = OpLoad %float %32
+         %34 = OpAccessChain %_ptr_Function_float %v2 %uint_1
+         %35 = OpLoad %float %34
+         %36 = OpAccessChain %_ptr_Function_float %v2 %uint_0
+         %37 = OpLoad %float %36
+         %38 = OpCompositeConstruct %v4float %30 %33 %35 %37
+               OpStore %x_GLF_color %38
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %39
+%tint_symbol = OpFunctionParameter %main_out
+         %43 = OpLabel
+         %44 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %44
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %46 = OpLabel
+         %47 = OpFunctionCall %void %main_1
+         %49 = OpLoad %v4float %x_GLF_color
+         %50 = OpCompositeConstruct %main_out %49
+         %48 = OpFunctionCall %void %tint_symbol_2 %50
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-step-sinh/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-step-sinh/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..a52a30a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-step-sinh/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,26 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v1 : vec2<f32>;
+  var v2 : vec2<f32>;
+  v1 = vec2<f32>(1.0, -1.0);
+  let x_22 : vec2<f32> = v1;
+  v2 = step(vec2<f32>(0.400000006, 0.400000006), sinh(x_22));
+  let x_27 : f32 = v2.x;
+  let x_29 : f32 = v2.y;
+  let x_31 : f32 = v2.y;
+  let x_33 : f32 = v2.x;
+  x_GLF_color = vec4<f32>(x_27, x_29, x_31, x_33);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-step-sinh/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-step-sinh/0-opt.wgsl
new file mode 100644
index 0000000..a52a30a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-step-sinh/0-opt.wgsl
@@ -0,0 +1,26 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v1 : vec2<f32>;
+  var v2 : vec2<f32>;
+  v1 = vec2<f32>(1.0, -1.0);
+  let x_22 : vec2<f32> = v1;
+  v2 = step(vec2<f32>(0.400000006, 0.400000006), sinh(x_22));
+  let x_27 : f32 = v2.x;
+  let x_29 : f32 = v2.y;
+  let x_31 : f32 = v2.y;
+  let x_33 : f32 = v2.x;
+  x_GLF_color = vec4<f32>(x_27, x_29, x_31, x_33);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-step-sinh/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-step-sinh/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..37bf795
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-step-sinh/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,28 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2 v1 = float2(0.0f, 0.0f);
+  float2 v2 = float2(0.0f, 0.0f);
+  v1 = float2(1.0f, -1.0f);
+  v2 = step(float2(0.400000006f, 0.400000006f), sinh(v1));
+  const float x_27 = v2.x;
+  const float x_29 = v2.y;
+  const float x_31 = v2.y;
+  const float x_33 = v2.x;
+  x_GLF_color = float4(x_27, x_29, x_31, x_33);
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-step-sinh/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-step-sinh/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..57eb0c0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-step-sinh/0-opt.wgsl.expected.msl
@@ -0,0 +1,32 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  float2 v1 = 0.0f;
+  float2 v2 = 0.0f;
+  v1 = float2(1.0f, -1.0f);
+  float2 const x_22 = v1;
+  v2 = step(float2(0.400000006f, 0.400000006f), sinh(x_22));
+  float const x_27 = v2.x;
+  float const x_29 = v2.y;
+  float const x_31 = v2.y;
+  float const x_33 = v2.x;
+  *(tint_symbol_4) = float4(x_27, x_29, x_31, x_33);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-step-sinh/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-step-sinh/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..5661e19
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-step-sinh/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,81 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 51
+; Schema: 0
+               OpCapability Shader
+         %22 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v1 "v1"
+               OpName %v2 "v2"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %15 = OpConstantNull %v2float
+    %float_1 = OpConstant %float 1
+   %float_n1 = OpConstant %float -1
+         %19 = OpConstantComposite %v2float %float_1 %float_n1
+%float_0_400000006 = OpConstant %float 0.400000006
+         %24 = OpConstantComposite %v2float %float_0_400000006 %float_0_400000006
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+   %main_out = OpTypeStruct %v4float
+         %39 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+         %v1 = OpVariable %_ptr_Function_v2float Function %15
+         %v2 = OpVariable %_ptr_Function_v2float Function %15
+               OpStore %v1 %19
+         %20 = OpLoad %v2float %v1
+         %25 = OpExtInst %v2float %22 Sinh %20
+         %21 = OpExtInst %v2float %22 Step %24 %25
+               OpStore %v2 %21
+         %29 = OpAccessChain %_ptr_Function_float %v2 %uint_0
+         %30 = OpLoad %float %29
+         %32 = OpAccessChain %_ptr_Function_float %v2 %uint_1
+         %33 = OpLoad %float %32
+         %34 = OpAccessChain %_ptr_Function_float %v2 %uint_1
+         %35 = OpLoad %float %34
+         %36 = OpAccessChain %_ptr_Function_float %v2 %uint_0
+         %37 = OpLoad %float %36
+         %38 = OpCompositeConstruct %v4float %30 %33 %35 %37
+               OpStore %x_GLF_color %38
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %39
+%tint_symbol = OpFunctionParameter %main_out
+         %43 = OpLabel
+         %44 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %44
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %46 = OpLabel
+         %47 = OpFunctionCall %void %main_1
+         %49 = OpLoad %v4float %x_GLF_color
+         %50 = OpCompositeConstruct %main_out %49
+         %48 = OpFunctionCall %void %tint_symbol_2 %50
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-step-sinh/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-step-sinh/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..a52a30a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-step-sinh/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,26 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v1 : vec2<f32>;
+  var v2 : vec2<f32>;
+  v1 = vec2<f32>(1.0, -1.0);
+  let x_22 : vec2<f32> = v1;
+  v2 = step(vec2<f32>(0.400000006, 0.400000006), sinh(x_22));
+  let x_27 : f32 = v2.x;
+  let x_29 : f32 = v2.y;
+  let x_31 : f32 = v2.y;
+  let x_33 : f32 = v2.x;
+  x_GLF_color = vec4<f32>(x_27, x_29, x_31, x_33);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-struct-float-array-mix-uniform-vectors/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-struct-float-array-mix-uniform-vectors/0-opt.spvasm
new file mode 100644
index 0000000..55ad477
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-struct-float-array-mix-uniform-vectors/0-opt.spvasm
@@ -0,0 +1,173 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %S "S"
+               OpMemberName %S 0 "numbers"
+               OpName %obj "obj"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "zeroVec"
+               OpName %__0 ""
+               OpName %a "a"
+               OpName %buf3 "buf3"
+               OpMemberName %buf3 0 "oneVec"
+               OpName %__1 ""
+               OpName %b "b"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %__2 ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_5 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %buf2 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 2
+               OpMemberDecorate %buf3 0 Offset 0
+               OpDecorate %buf3 Block
+               OpDecorate %__1 DescriptorSet 0
+               OpDecorate %__1 Binding 3
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__2 DescriptorSet 0
+               OpDecorate %__2 Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+          %S = OpTypeStruct %_arr_float_uint_3
+%_ptr_Function_S = OpTypePointer Function %S
+     %uint_5 = OpConstant %uint 5
+%_arr_float_uint_5 = OpTypeArray %float %uint_5
+       %buf1 = OpTypeStruct %_arr_float_uint_5
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_3 = OpConstant %int 3
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_2 = OpConstant %int 2
+      %int_4 = OpConstant %int 4
+    %v2float = OpTypeVector %float 2
+       %buf2 = OpTypeStruct %v2float
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+        %__0 = OpVariable %_ptr_Uniform_buf2 Uniform
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+       %bool = OpTypeBool
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+       %buf3 = OpTypeStruct %v2float
+%_ptr_Uniform_buf3 = OpTypePointer Uniform %buf3
+        %__1 = OpVariable %_ptr_Uniform_buf3 Uniform
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__2 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %19
+         %48 = OpLabel
+        %obj = OpVariable %_ptr_Function_S Function
+          %a = OpVariable %_ptr_Function_float Function
+         %49 = OpVariable %_ptr_Function_v2float Function
+          %b = OpVariable %_ptr_Function_float Function
+         %50 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_3
+         %51 = OpLoad %float %50
+         %52 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %53 = OpLoad %float %52
+         %54 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_4
+         %55 = OpLoad %float %54
+         %56 = OpCompositeConstruct %_arr_float_uint_3 %51 %53 %55
+         %57 = OpCompositeConstruct %S %56
+               OpStore %obj %57
+         %58 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %uint_0
+         %59 = OpLoad %float %58
+         %60 = OpConvertFToS %int %59
+         %61 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %62 = OpLoad %float %61
+         %63 = OpAccessChain %_ptr_Function_float %obj %int_0 %60
+               OpStore %63 %62
+         %64 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %uint_0
+         %65 = OpLoad %float %64
+         %66 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %67 = OpLoad %float %66
+         %68 = OpFOrdGreaterThan %bool %65 %67
+               OpSelectionMerge %69 None
+               OpBranchConditional %68 %70 %71
+         %70 = OpLabel
+         %72 = OpAccessChain %_ptr_Uniform_v2float %__0 %int_0
+         %73 = OpLoad %v2float %72
+               OpStore %49 %73
+               OpBranch %69
+         %71 = OpLabel
+         %74 = OpAccessChain %_ptr_Uniform_v2float %__1 %int_0
+         %75 = OpLoad %v2float %74
+               OpStore %49 %75
+               OpBranch %69
+         %69 = OpLabel
+         %76 = OpAccessChain %_ptr_Function_float %49 %uint_1
+         %77 = OpLoad %float %76
+               OpStore %a %77
+         %78 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %79 = OpLoad %float %78
+         %80 = OpLoad %float %a
+         %81 = OpAccessChain %_ptr_Uniform_int %__2 %int_0 %int_0
+         %82 = OpLoad %int %81
+         %83 = OpAccessChain %_ptr_Function_float %obj %int_0 %82
+         %84 = OpLoad %float %83
+         %85 = OpExtInst %float %1 FMix %79 %80 %84
+               OpStore %b %85
+         %86 = OpLoad %float %b
+         %87 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %88 = OpLoad %float %87
+         %89 = OpExtInst %float %1 Distance %86 %88
+         %90 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %91 = OpLoad %float %90
+         %92 = OpFOrdLessThan %bool %89 %91
+               OpSelectionMerge %93 None
+               OpBranchConditional %92 %94 %95
+         %94 = OpLabel
+         %96 = OpAccessChain %_ptr_Uniform_int %__2 %int_0 %int_0
+         %97 = OpLoad %int %96
+         %98 = OpConvertSToF %float %97
+         %99 = OpAccessChain %_ptr_Uniform_int %__2 %int_0 %int_1
+        %100 = OpLoad %int %99
+        %101 = OpConvertSToF %float %100
+        %102 = OpAccessChain %_ptr_Uniform_int %__2 %int_0 %int_1
+        %103 = OpLoad %int %102
+        %104 = OpConvertSToF %float %103
+        %105 = OpAccessChain %_ptr_Uniform_int %__2 %int_0 %int_0
+        %106 = OpLoad %int %105
+        %107 = OpConvertSToF %float %106
+        %108 = OpCompositeConstruct %v4float %98 %101 %104 %107
+               OpStore %_GLF_color %108
+               OpBranch %93
+         %95 = OpLabel
+        %109 = OpAccessChain %_ptr_Uniform_int %__2 %int_0 %int_1
+        %110 = OpLoad %int %109
+        %111 = OpConvertSToF %float %110
+        %112 = OpCompositeConstruct %v4float %111 %111 %111 %111
+               OpStore %_GLF_color %112
+               OpBranch %93
+         %93 = OpLabel
+               OpReturn
+               OpFunctionEnd
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
new file mode 100644
index 0000000..c182316
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-struct-float-array-mix-uniform-vectors/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,84 @@
+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_7[3] = {x_51, x_53, x_55};
+  const S tint_symbol_8 = {tint_symbol_7};
+  obj = tint_symbol_8;
+  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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_9 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_9;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-struct-float-array-mix-uniform-vectors/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-struct-float-array-mix-uniform-vectors/0-opt.spvasm.expected.msl
new file mode 100755
index 0000000..649909a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-struct-float-array-mix-uniform-vectors/0-opt.spvasm.expected.msl
@@ -0,0 +1,122 @@
+SKIP: FAILED
+
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  float arr[3];
+};
+struct S {
+  tint_array_wrapper numbers;
+};
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element arr[5];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct buf2 {
+  /* 0x0000 */ packed_float2 zeroVec;
+};
+struct buf3 {
+  /* 0x0000 */ packed_float2 oneVec;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_2 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_2 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_7, constant buf2& x_9, constant buf3& x_12, constant buf0& x_15, thread float4* const tint_symbol_6) {
+  S obj = {};
+  float a = 0.0f;
+  float2 x_49 = 0.0f;
+  float b = 0.0f;
+  float const x_51 = x_7.x_GLF_uniform_float_values.arr[3].el;
+  float const x_53 = x_7.x_GLF_uniform_float_values.arr[2].el;
+  float const x_55 = x_7.x_GLF_uniform_float_values.arr[4].el;
+  tint_array_wrapper const tint_symbol_3 = {.arr={x_51, x_53, x_55}};
+  S const tint_symbol_4 = {.numbers=tint_symbol_3};
+  obj = tint_symbol_4;
+  float const x_59 = x_9.zeroVec.x;
+  float const x_62 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  obj.numbers.arr[int(x_59)] = x_62;
+  float const x_65 = x_9.zeroVec.x;
+  float const x_67 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_65 > x_67)) {
+    float2 const x_73 = x_9.zeroVec;
+    x_49 = x_73;
+  } else {
+    float2 const x_75 = x_12.oneVec;
+    x_49 = x_75;
+  }
+  float const x_77 = x_49.y;
+  a = x_77;
+  float const x_79 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  float const x_80 = a;
+  int const x_82 = x_15.x_GLF_uniform_int_values.arr[0].el;
+  float const x_84 = obj.numbers.arr[x_82];
+  b = mix(x_79, x_80, x_84);
+  float const x_86 = b;
+  float const x_88 = x_7.x_GLF_uniform_float_values.arr[2].el;
+  float const x_91 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  if ((distance(x_86, x_88) < x_91)) {
+    int const x_97 = x_15.x_GLF_uniform_int_values.arr[0].el;
+    int const x_100 = x_15.x_GLF_uniform_int_values.arr[1].el;
+    int const x_103 = x_15.x_GLF_uniform_int_values.arr[1].el;
+    int const x_106 = x_15.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_6) = float4(float(x_97), float(x_100), float(x_103), float(x_106));
+  } else {
+    int const x_110 = x_15.x_GLF_uniform_int_values.arr[1].el;
+    float const x_111 = float(x_110);
+    *(tint_symbol_6) = float4(x_111, x_111, x_111, x_111);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_7 [[buffer(1)]], constant buf2& x_9 [[buffer(2)]], constant buf3& x_12 [[buffer(3)]], constant buf0& x_15 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  main_1(x_7, x_9, x_12, x_15, &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
+T:\tmp\udoo.0.metal:76:8: error: call to 'distance' is ambiguous
+  if ((distance(x_86, x_88) < x_91)) {
+       ^~~~~~~~
+C:\Program Files\Metal Developer Tools\macos\lib\clang\31001.138\include\metal\metal_geometric:481:17: note: candidate function
+METAL_FUNC half distance(half2 x, half2 y)
+                ^
+C:\Program Files\Metal Developer Tools\macos\lib\clang\31001.138\include\metal\metal_geometric:512:17: note: candidate function
+METAL_FUNC half distance(half3 x, half3 y)
+                ^
+C:\Program Files\Metal Developer Tools\macos\lib\clang\31001.138\include\metal\metal_geometric:543:17: note: candidate function
+METAL_FUNC half distance(half4 x, half4 y)
+                ^
+C:\Program Files\Metal Developer Tools\macos\lib\clang\31001.138\include\metal\metal_geometric:648:18: note: candidate function
+METAL_FUNC float distance(float2 x, float2 y)
+                 ^
+C:\Program Files\Metal Developer Tools\macos\lib\clang\31001.138\include\metal\metal_geometric:691:18: note: candidate function
+METAL_FUNC float distance(float3 x, float3 y)
+                 ^
+C:\Program Files\Metal Developer Tools\macos\lib\clang\31001.138\include\metal\metal_geometric:734:18: note: candidate function
+METAL_FUNC float distance(float4 x, float4 y)
+                 ^
+1 error generated.
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-struct-float-array-mix-uniform-vectors/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-struct-float-array-mix-uniform-vectors/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..2af192c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-struct-float-array-mix-uniform-vectors/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,214 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 131
+; Schema: 0
+               OpCapability Shader
+         %90 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_7 "x_7"
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "zeroVec"
+               OpName %x_9 "x_9"
+               OpName %buf3 "buf3"
+               OpMemberName %buf3 0 "oneVec"
+               OpName %x_12 "x_12"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_15 "x_15"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %S "S"
+               OpMemberName %S 0 "numbers"
+               OpName %obj "obj"
+               OpName %a "a"
+               OpName %x_49 "x_49"
+               OpName %b "b"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_5 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %buf2 Block
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 2
+               OpDecorate %buf3 Block
+               OpMemberDecorate %buf3 0 Offset 0
+               OpDecorate %x_12 NonWritable
+               OpDecorate %x_12 DescriptorSet 0
+               OpDecorate %x_12 Binding 3
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_15 NonWritable
+               OpDecorate %x_15 DescriptorSet 0
+               OpDecorate %x_15 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_float_uint_5 = OpTypeArray %float %uint_5
+       %buf1 = OpTypeStruct %_arr_float_uint_5
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_7 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v2float = OpTypeVector %float 2
+       %buf2 = OpTypeStruct %v2float
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+        %x_9 = OpVariable %_ptr_Uniform_buf2 Uniform
+       %buf3 = OpTypeStruct %v2float
+%_ptr_Uniform_buf3 = OpTypePointer Uniform %buf3
+       %x_12 = OpVariable %_ptr_Uniform_buf3 Uniform
+        %int = OpTypeInt 32 1
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_15 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %24 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %24
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %24
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+          %S = OpTypeStruct %_arr_float_uint_3
+%_ptr_Function_S = OpTypePointer Function %S
+         %36 = OpConstantNull %S
+%_ptr_Function_float = OpTypePointer Function %float
+         %39 = OpConstantNull %float
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %42 = OpConstantNull %v2float
+     %uint_0 = OpConstant %uint 0
+      %int_3 = OpConstant %int 3
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_2 = OpConstant %int 2
+      %int_4 = OpConstant %int 4
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+        %119 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %27
+         %30 = OpLabel
+        %obj = OpVariable %_ptr_Function_S Function %36
+          %a = OpVariable %_ptr_Function_float Function %39
+       %x_49 = OpVariable %_ptr_Function_v2float Function %42
+          %b = OpVariable %_ptr_Function_float Function %39
+         %47 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_3
+         %48 = OpLoad %float %47
+         %50 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_2
+         %51 = OpLoad %float %50
+         %53 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_4
+         %54 = OpLoad %float %53
+         %55 = OpCompositeConstruct %_arr_float_uint_3 %48 %51 %54
+         %56 = OpCompositeConstruct %S %55
+               OpStore %obj %56
+         %57 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_0
+         %58 = OpLoad %float %57
+         %60 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %61 = OpLoad %float %60
+         %62 = OpConvertFToS %int %58
+         %63 = OpAccessChain %_ptr_Function_float %obj %uint_0 %62
+               OpStore %63 %61
+         %64 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_0
+         %65 = OpLoad %float %64
+         %66 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %67 = OpLoad %float %66
+         %68 = OpFOrdGreaterThan %bool %65 %67
+               OpSelectionMerge %70 None
+               OpBranchConditional %68 %71 %72
+         %71 = OpLabel
+         %74 = OpAccessChain %_ptr_Uniform_v2float %x_9 %uint_0
+         %75 = OpLoad %v2float %74
+               OpStore %x_49 %75
+               OpBranch %70
+         %72 = OpLabel
+         %76 = OpAccessChain %_ptr_Uniform_v2float %x_12 %uint_0
+         %77 = OpLoad %v2float %76
+               OpStore %x_49 %77
+               OpBranch %70
+         %70 = OpLabel
+         %79 = OpAccessChain %_ptr_Function_float %x_49 %uint_1
+         %80 = OpLoad %float %79
+               OpStore %a %80
+         %81 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %82 = OpLoad %float %81
+         %83 = OpLoad %float %a
+         %85 = OpAccessChain %_ptr_Uniform_int %x_15 %uint_0 %int_0
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_Function_float %obj %uint_0 %86
+         %88 = OpLoad %float %87
+         %89 = OpExtInst %float %90 FMix %82 %83 %88
+               OpStore %b %89
+         %91 = OpLoad %float %b
+         %92 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_2
+         %93 = OpLoad %float %92
+         %95 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %96 = OpLoad %float %95
+         %97 = OpExtInst %float %90 Distance %91 %93
+         %98 = OpFOrdLessThan %bool %97 %96
+               OpSelectionMerge %99 None
+               OpBranchConditional %98 %100 %101
+        %100 = OpLabel
+        %102 = OpAccessChain %_ptr_Uniform_int %x_15 %uint_0 %int_0
+        %103 = OpLoad %int %102
+        %104 = OpAccessChain %_ptr_Uniform_int %x_15 %uint_0 %int_1
+        %105 = OpLoad %int %104
+        %106 = OpAccessChain %_ptr_Uniform_int %x_15 %uint_0 %int_1
+        %107 = OpLoad %int %106
+        %108 = OpAccessChain %_ptr_Uniform_int %x_15 %uint_0 %int_0
+        %109 = OpLoad %int %108
+        %110 = OpConvertSToF %float %103
+        %111 = OpConvertSToF %float %105
+        %112 = OpConvertSToF %float %107
+        %113 = OpConvertSToF %float %109
+        %114 = OpCompositeConstruct %v4float %110 %111 %112 %113
+               OpStore %x_GLF_color %114
+               OpBranch %99
+        %101 = OpLabel
+        %115 = OpAccessChain %_ptr_Uniform_int %x_15 %uint_0 %int_1
+        %116 = OpLoad %int %115
+        %117 = OpConvertSToF %float %116
+        %118 = OpCompositeConstruct %v4float %117 %117 %117 %117
+               OpStore %x_GLF_color %118
+               OpBranch %99
+         %99 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %119
+%tint_symbol = OpFunctionParameter %main_out
+        %123 = OpLabel
+        %124 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %124
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %27
+        %126 = OpLabel
+        %127 = OpFunctionCall %void %main_1
+        %129 = OpLoad %v4float %x_GLF_color
+        %130 = OpCompositeConstruct %main_out %129
+        %128 = OpFunctionCall %void %tint_symbol_2 %130
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-struct-float-array-mix-uniform-vectors/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-struct-float-array-mix-uniform-vectors/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..57db954
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-struct-float-array-mix-uniform-vectors/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,93 @@
+struct S {
+  numbers : array<f32, 3>;
+};
+
+type Arr = [[stride(16)]] array<f32, 5>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[block]]
+struct buf2 {
+  zeroVec : vec2<f32>;
+};
+
+[[block]]
+struct buf3 {
+  oneVec : vec2<f32>;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+[[group(0), binding(2)]] var<uniform> x_9 : buf2;
+
+[[group(0), binding(3)]] var<uniform> x_12 : buf3;
+
+[[group(0), binding(0)]] var<uniform> x_15 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var obj : S;
+  var a : f32;
+  var x_49 : vec2<f32>;
+  var b : f32;
+  let x_51 : f32 = x_7.x_GLF_uniform_float_values[3];
+  let x_53 : f32 = x_7.x_GLF_uniform_float_values[2];
+  let x_55 : f32 = x_7.x_GLF_uniform_float_values[4];
+  obj = S(array<f32, 3>(x_51, x_53, x_55));
+  let x_59 : f32 = x_9.zeroVec.x;
+  let x_62 : f32 = x_7.x_GLF_uniform_float_values[0];
+  obj.numbers[i32(x_59)] = x_62;
+  let x_65 : f32 = x_9.zeroVec.x;
+  let x_67 : f32 = x_7.x_GLF_uniform_float_values[0];
+  if ((x_65 > x_67)) {
+    let x_73 : vec2<f32> = x_9.zeroVec;
+    x_49 = x_73;
+  } else {
+    let x_75 : vec2<f32> = x_12.oneVec;
+    x_49 = x_75;
+  }
+  let x_77 : f32 = x_49.y;
+  a = x_77;
+  let x_79 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_80 : f32 = a;
+  let x_82 : i32 = x_15.x_GLF_uniform_int_values[0];
+  let x_84 : f32 = obj.numbers[x_82];
+  b = mix(x_79, x_80, x_84);
+  let x_86 : f32 = b;
+  let x_88 : f32 = x_7.x_GLF_uniform_float_values[2];
+  let x_91 : f32 = x_7.x_GLF_uniform_float_values[1];
+  if ((distance(x_86, x_88) < x_91)) {
+    let x_97 : i32 = x_15.x_GLF_uniform_int_values[0];
+    let x_100 : i32 = x_15.x_GLF_uniform_int_values[1];
+    let x_103 : i32 = x_15.x_GLF_uniform_int_values[1];
+    let x_106 : i32 = x_15.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_97), f32(x_100), f32(x_103), f32(x_106));
+  } else {
+    let x_110 : i32 = x_15.x_GLF_uniform_int_values[1];
+    let x_111 : f32 = f32(x_110);
+    x_GLF_color = vec4<f32>(x_111, x_111, x_111, x_111);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-struct-float-array-mix-uniform-vectors/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-struct-float-array-mix-uniform-vectors/0-opt.wgsl
new file mode 100644
index 0000000..57db954
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-struct-float-array-mix-uniform-vectors/0-opt.wgsl
@@ -0,0 +1,93 @@
+struct S {
+  numbers : array<f32, 3>;
+};
+
+type Arr = [[stride(16)]] array<f32, 5>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[block]]
+struct buf2 {
+  zeroVec : vec2<f32>;
+};
+
+[[block]]
+struct buf3 {
+  oneVec : vec2<f32>;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+[[group(0), binding(2)]] var<uniform> x_9 : buf2;
+
+[[group(0), binding(3)]] var<uniform> x_12 : buf3;
+
+[[group(0), binding(0)]] var<uniform> x_15 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var obj : S;
+  var a : f32;
+  var x_49 : vec2<f32>;
+  var b : f32;
+  let x_51 : f32 = x_7.x_GLF_uniform_float_values[3];
+  let x_53 : f32 = x_7.x_GLF_uniform_float_values[2];
+  let x_55 : f32 = x_7.x_GLF_uniform_float_values[4];
+  obj = S(array<f32, 3>(x_51, x_53, x_55));
+  let x_59 : f32 = x_9.zeroVec.x;
+  let x_62 : f32 = x_7.x_GLF_uniform_float_values[0];
+  obj.numbers[i32(x_59)] = x_62;
+  let x_65 : f32 = x_9.zeroVec.x;
+  let x_67 : f32 = x_7.x_GLF_uniform_float_values[0];
+  if ((x_65 > x_67)) {
+    let x_73 : vec2<f32> = x_9.zeroVec;
+    x_49 = x_73;
+  } else {
+    let x_75 : vec2<f32> = x_12.oneVec;
+    x_49 = x_75;
+  }
+  let x_77 : f32 = x_49.y;
+  a = x_77;
+  let x_79 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_80 : f32 = a;
+  let x_82 : i32 = x_15.x_GLF_uniform_int_values[0];
+  let x_84 : f32 = obj.numbers[x_82];
+  b = mix(x_79, x_80, x_84);
+  let x_86 : f32 = b;
+  let x_88 : f32 = x_7.x_GLF_uniform_float_values[2];
+  let x_91 : f32 = x_7.x_GLF_uniform_float_values[1];
+  if ((distance(x_86, x_88) < x_91)) {
+    let x_97 : i32 = x_15.x_GLF_uniform_int_values[0];
+    let x_100 : i32 = x_15.x_GLF_uniform_int_values[1];
+    let x_103 : i32 = x_15.x_GLF_uniform_int_values[1];
+    let x_106 : i32 = x_15.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_97), f32(x_100), f32(x_103), f32(x_106));
+  } else {
+    let x_110 : i32 = x_15.x_GLF_uniform_int_values[1];
+    let x_111 : f32 = f32(x_110);
+    x_GLF_color = vec4<f32>(x_111, x_111, x_111, x_111);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
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
new file mode 100644
index 0000000..c182316
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-struct-float-array-mix-uniform-vectors/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,84 @@
+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_7[3] = {x_51, x_53, x_55};
+  const S tint_symbol_8 = {tint_symbol_7};
+  obj = tint_symbol_8;
+  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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_9 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_9;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-struct-float-array-mix-uniform-vectors/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-struct-float-array-mix-uniform-vectors/0-opt.wgsl.expected.msl
new file mode 100755
index 0000000..e8b297a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-struct-float-array-mix-uniform-vectors/0-opt.wgsl.expected.msl
@@ -0,0 +1,122 @@
+SKIP: FAILED
+
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  float arr[3];
+};
+struct S {
+  tint_array_wrapper numbers;
+};
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element arr[5];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct buf2 {
+  /* 0x0000 */ packed_float2 zeroVec;
+};
+struct buf3 {
+  /* 0x0000 */ packed_float2 oneVec;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_2 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_2 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_7, constant buf2& x_9, constant buf3& x_12, constant buf0& x_15, thread float4* const tint_symbol_6) {
+  S obj = {};
+  float a = 0.0f;
+  float2 x_49 = 0.0f;
+  float b = 0.0f;
+  float const x_51 = x_7.x_GLF_uniform_float_values.arr[3].el;
+  float const x_53 = x_7.x_GLF_uniform_float_values.arr[2].el;
+  float const x_55 = x_7.x_GLF_uniform_float_values.arr[4].el;
+  tint_array_wrapper const tint_symbol_3 = {.arr={x_51, x_53, x_55}};
+  S const tint_symbol_4 = {.numbers=tint_symbol_3};
+  obj = tint_symbol_4;
+  float const x_59 = x_9.zeroVec.x;
+  float const x_62 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  obj.numbers.arr[int(x_59)] = x_62;
+  float const x_65 = x_9.zeroVec.x;
+  float const x_67 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_65 > x_67)) {
+    float2 const x_73 = x_9.zeroVec;
+    x_49 = x_73;
+  } else {
+    float2 const x_75 = x_12.oneVec;
+    x_49 = x_75;
+  }
+  float const x_77 = x_49.y;
+  a = x_77;
+  float const x_79 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  float const x_80 = a;
+  int const x_82 = x_15.x_GLF_uniform_int_values.arr[0].el;
+  float const x_84 = obj.numbers.arr[x_82];
+  b = mix(x_79, x_80, x_84);
+  float const x_86 = b;
+  float const x_88 = x_7.x_GLF_uniform_float_values.arr[2].el;
+  float const x_91 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  if ((distance(x_86, x_88) < x_91)) {
+    int const x_97 = x_15.x_GLF_uniform_int_values.arr[0].el;
+    int const x_100 = x_15.x_GLF_uniform_int_values.arr[1].el;
+    int const x_103 = x_15.x_GLF_uniform_int_values.arr[1].el;
+    int const x_106 = x_15.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_6) = float4(float(x_97), float(x_100), float(x_103), float(x_106));
+  } else {
+    int const x_110 = x_15.x_GLF_uniform_int_values.arr[1].el;
+    float const x_111 = float(x_110);
+    *(tint_symbol_6) = float4(x_111, x_111, x_111, x_111);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_7 [[buffer(1)]], constant buf2& x_9 [[buffer(2)]], constant buf3& x_12 [[buffer(3)]], constant buf0& x_15 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  main_1(x_7, x_9, x_12, x_15, &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
+T:\tmp\udr8.0.metal:76:8: error: call to 'distance' is ambiguous
+  if ((distance(x_86, x_88) < x_91)) {
+       ^~~~~~~~
+C:\Program Files\Metal Developer Tools\macos\lib\clang\31001.138\include\metal\metal_geometric:481:17: note: candidate function
+METAL_FUNC half distance(half2 x, half2 y)
+                ^
+C:\Program Files\Metal Developer Tools\macos\lib\clang\31001.138\include\metal\metal_geometric:512:17: note: candidate function
+METAL_FUNC half distance(half3 x, half3 y)
+                ^
+C:\Program Files\Metal Developer Tools\macos\lib\clang\31001.138\include\metal\metal_geometric:543:17: note: candidate function
+METAL_FUNC half distance(half4 x, half4 y)
+                ^
+C:\Program Files\Metal Developer Tools\macos\lib\clang\31001.138\include\metal\metal_geometric:648:18: note: candidate function
+METAL_FUNC float distance(float2 x, float2 y)
+                 ^
+C:\Program Files\Metal Developer Tools\macos\lib\clang\31001.138\include\metal\metal_geometric:691:18: note: candidate function
+METAL_FUNC float distance(float3 x, float3 y)
+                 ^
+C:\Program Files\Metal Developer Tools\macos\lib\clang\31001.138\include\metal\metal_geometric:734:18: note: candidate function
+METAL_FUNC float distance(float4 x, float4 y)
+                 ^
+1 error generated.
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-struct-float-array-mix-uniform-vectors/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-struct-float-array-mix-uniform-vectors/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..2af192c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-struct-float-array-mix-uniform-vectors/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,214 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 131
+; Schema: 0
+               OpCapability Shader
+         %90 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_7 "x_7"
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "zeroVec"
+               OpName %x_9 "x_9"
+               OpName %buf3 "buf3"
+               OpMemberName %buf3 0 "oneVec"
+               OpName %x_12 "x_12"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_15 "x_15"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %S "S"
+               OpMemberName %S 0 "numbers"
+               OpName %obj "obj"
+               OpName %a "a"
+               OpName %x_49 "x_49"
+               OpName %b "b"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_5 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %buf2 Block
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 2
+               OpDecorate %buf3 Block
+               OpMemberDecorate %buf3 0 Offset 0
+               OpDecorate %x_12 NonWritable
+               OpDecorate %x_12 DescriptorSet 0
+               OpDecorate %x_12 Binding 3
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_15 NonWritable
+               OpDecorate %x_15 DescriptorSet 0
+               OpDecorate %x_15 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_float_uint_5 = OpTypeArray %float %uint_5
+       %buf1 = OpTypeStruct %_arr_float_uint_5
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_7 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v2float = OpTypeVector %float 2
+       %buf2 = OpTypeStruct %v2float
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+        %x_9 = OpVariable %_ptr_Uniform_buf2 Uniform
+       %buf3 = OpTypeStruct %v2float
+%_ptr_Uniform_buf3 = OpTypePointer Uniform %buf3
+       %x_12 = OpVariable %_ptr_Uniform_buf3 Uniform
+        %int = OpTypeInt 32 1
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_15 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %24 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %24
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %24
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+          %S = OpTypeStruct %_arr_float_uint_3
+%_ptr_Function_S = OpTypePointer Function %S
+         %36 = OpConstantNull %S
+%_ptr_Function_float = OpTypePointer Function %float
+         %39 = OpConstantNull %float
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %42 = OpConstantNull %v2float
+     %uint_0 = OpConstant %uint 0
+      %int_3 = OpConstant %int 3
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_2 = OpConstant %int 2
+      %int_4 = OpConstant %int 4
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+        %119 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %27
+         %30 = OpLabel
+        %obj = OpVariable %_ptr_Function_S Function %36
+          %a = OpVariable %_ptr_Function_float Function %39
+       %x_49 = OpVariable %_ptr_Function_v2float Function %42
+          %b = OpVariable %_ptr_Function_float Function %39
+         %47 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_3
+         %48 = OpLoad %float %47
+         %50 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_2
+         %51 = OpLoad %float %50
+         %53 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_4
+         %54 = OpLoad %float %53
+         %55 = OpCompositeConstruct %_arr_float_uint_3 %48 %51 %54
+         %56 = OpCompositeConstruct %S %55
+               OpStore %obj %56
+         %57 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_0
+         %58 = OpLoad %float %57
+         %60 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %61 = OpLoad %float %60
+         %62 = OpConvertFToS %int %58
+         %63 = OpAccessChain %_ptr_Function_float %obj %uint_0 %62
+               OpStore %63 %61
+         %64 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_0
+         %65 = OpLoad %float %64
+         %66 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %67 = OpLoad %float %66
+         %68 = OpFOrdGreaterThan %bool %65 %67
+               OpSelectionMerge %70 None
+               OpBranchConditional %68 %71 %72
+         %71 = OpLabel
+         %74 = OpAccessChain %_ptr_Uniform_v2float %x_9 %uint_0
+         %75 = OpLoad %v2float %74
+               OpStore %x_49 %75
+               OpBranch %70
+         %72 = OpLabel
+         %76 = OpAccessChain %_ptr_Uniform_v2float %x_12 %uint_0
+         %77 = OpLoad %v2float %76
+               OpStore %x_49 %77
+               OpBranch %70
+         %70 = OpLabel
+         %79 = OpAccessChain %_ptr_Function_float %x_49 %uint_1
+         %80 = OpLoad %float %79
+               OpStore %a %80
+         %81 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %82 = OpLoad %float %81
+         %83 = OpLoad %float %a
+         %85 = OpAccessChain %_ptr_Uniform_int %x_15 %uint_0 %int_0
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_Function_float %obj %uint_0 %86
+         %88 = OpLoad %float %87
+         %89 = OpExtInst %float %90 FMix %82 %83 %88
+               OpStore %b %89
+         %91 = OpLoad %float %b
+         %92 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_2
+         %93 = OpLoad %float %92
+         %95 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %96 = OpLoad %float %95
+         %97 = OpExtInst %float %90 Distance %91 %93
+         %98 = OpFOrdLessThan %bool %97 %96
+               OpSelectionMerge %99 None
+               OpBranchConditional %98 %100 %101
+        %100 = OpLabel
+        %102 = OpAccessChain %_ptr_Uniform_int %x_15 %uint_0 %int_0
+        %103 = OpLoad %int %102
+        %104 = OpAccessChain %_ptr_Uniform_int %x_15 %uint_0 %int_1
+        %105 = OpLoad %int %104
+        %106 = OpAccessChain %_ptr_Uniform_int %x_15 %uint_0 %int_1
+        %107 = OpLoad %int %106
+        %108 = OpAccessChain %_ptr_Uniform_int %x_15 %uint_0 %int_0
+        %109 = OpLoad %int %108
+        %110 = OpConvertSToF %float %103
+        %111 = OpConvertSToF %float %105
+        %112 = OpConvertSToF %float %107
+        %113 = OpConvertSToF %float %109
+        %114 = OpCompositeConstruct %v4float %110 %111 %112 %113
+               OpStore %x_GLF_color %114
+               OpBranch %99
+        %101 = OpLabel
+        %115 = OpAccessChain %_ptr_Uniform_int %x_15 %uint_0 %int_1
+        %116 = OpLoad %int %115
+        %117 = OpConvertSToF %float %116
+        %118 = OpCompositeConstruct %v4float %117 %117 %117 %117
+               OpStore %x_GLF_color %118
+               OpBranch %99
+         %99 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %119
+%tint_symbol = OpFunctionParameter %main_out
+        %123 = OpLabel
+        %124 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %124
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %27
+        %126 = OpLabel
+        %127 = OpFunctionCall %void %main_1
+        %129 = OpLoad %v4float %x_GLF_color
+        %130 = OpCompositeConstruct %main_out %129
+        %128 = OpFunctionCall %void %tint_symbol_2 %130
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-struct-float-array-mix-uniform-vectors/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-struct-float-array-mix-uniform-vectors/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..57db954
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-struct-float-array-mix-uniform-vectors/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,93 @@
+struct S {
+  numbers : array<f32, 3>;
+};
+
+type Arr = [[stride(16)]] array<f32, 5>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[block]]
+struct buf2 {
+  zeroVec : vec2<f32>;
+};
+
+[[block]]
+struct buf3 {
+  oneVec : vec2<f32>;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+[[group(0), binding(2)]] var<uniform> x_9 : buf2;
+
+[[group(0), binding(3)]] var<uniform> x_12 : buf3;
+
+[[group(0), binding(0)]] var<uniform> x_15 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var obj : S;
+  var a : f32;
+  var x_49 : vec2<f32>;
+  var b : f32;
+  let x_51 : f32 = x_7.x_GLF_uniform_float_values[3];
+  let x_53 : f32 = x_7.x_GLF_uniform_float_values[2];
+  let x_55 : f32 = x_7.x_GLF_uniform_float_values[4];
+  obj = S(array<f32, 3>(x_51, x_53, x_55));
+  let x_59 : f32 = x_9.zeroVec.x;
+  let x_62 : f32 = x_7.x_GLF_uniform_float_values[0];
+  obj.numbers[i32(x_59)] = x_62;
+  let x_65 : f32 = x_9.zeroVec.x;
+  let x_67 : f32 = x_7.x_GLF_uniform_float_values[0];
+  if ((x_65 > x_67)) {
+    let x_73 : vec2<f32> = x_9.zeroVec;
+    x_49 = x_73;
+  } else {
+    let x_75 : vec2<f32> = x_12.oneVec;
+    x_49 = x_75;
+  }
+  let x_77 : f32 = x_49.y;
+  a = x_77;
+  let x_79 : f32 = x_7.x_GLF_uniform_float_values[0];
+  let x_80 : f32 = a;
+  let x_82 : i32 = x_15.x_GLF_uniform_int_values[0];
+  let x_84 : f32 = obj.numbers[x_82];
+  b = mix(x_79, x_80, x_84);
+  let x_86 : f32 = b;
+  let x_88 : f32 = x_7.x_GLF_uniform_float_values[2];
+  let x_91 : f32 = x_7.x_GLF_uniform_float_values[1];
+  if ((distance(x_86, x_88) < x_91)) {
+    let x_97 : i32 = x_15.x_GLF_uniform_int_values[0];
+    let x_100 : i32 = x_15.x_GLF_uniform_int_values[1];
+    let x_103 : i32 = x_15.x_GLF_uniform_int_values[1];
+    let x_106 : i32 = x_15.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_97), f32(x_100), f32(x_103), f32(x_106));
+  } else {
+    let x_110 : i32 = x_15.x_GLF_uniform_int_values[1];
+    let x_111 : f32 = f32(x_110);
+    x_GLF_color = vec4<f32>(x_111, x_111, x_111, x_111);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-sum-uniform-vector-components-round/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-sum-uniform-vector-components-round/0-opt.spvasm
new file mode 100644
index 0000000..37786d3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-sum-uniform-vector-components-round/0-opt.spvasm
@@ -0,0 +1,115 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %f "f"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "resolution"
+               OpName %__0 ""
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %__1 ""
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %buf2 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 2
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__1 DescriptorSet 0
+               OpDecorate %__1 Binding 0
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf1 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %v2float = OpTypeVector %float 2
+       %buf2 = OpTypeStruct %v2float
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+        %__0 = OpVariable %_ptr_Uniform_buf2 Uniform
+     %uint_0 = OpConstant %uint 0
+      %int_2 = OpConstant %int 2
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__1 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %main = OpFunction %void None %14
+         %35 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function
+         %36 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %37 = OpLoad %float %36
+         %38 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %uint_0
+         %39 = OpLoad %float %38
+         %40 = OpFMul %float %37 %39
+         %41 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %42 = OpLoad %float %41
+         %43 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %uint_0
+         %44 = OpLoad %float %43
+         %45 = OpExtInst %float %1 Round %44
+         %46 = OpFMul %float %42 %45
+         %47 = OpFAdd %float %40 %46
+         %48 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %uint_1
+         %49 = OpLoad %float %48
+         %50 = OpFAdd %float %47 %49
+               OpStore %f %50
+         %51 = OpLoad %float %f
+         %52 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %53 = OpLoad %float %52
+         %54 = OpFOrdEqual %bool %51 %53
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %57
+         %56 = OpLabel
+         %58 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_0
+         %59 = OpLoad %int %58
+         %60 = OpConvertSToF %float %59
+         %61 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_1
+         %62 = OpLoad %int %61
+         %63 = OpConvertSToF %float %62
+         %64 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_1
+         %65 = OpLoad %int %64
+         %66 = OpConvertSToF %float %65
+         %67 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_0
+         %68 = OpLoad %int %67
+         %69 = OpConvertSToF %float %68
+         %70 = OpCompositeConstruct %v4float %60 %63 %66 %69
+               OpStore %_GLF_color %70
+               OpBranch %55
+         %57 = OpLabel
+         %71 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_1
+         %72 = OpLoad %int %71
+         %73 = OpConvertSToF %float %72
+         %74 = OpCompositeConstruct %v4float %73 %73 %73 %73
+               OpStore %_GLF_color %74
+               OpBranch %55
+         %55 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-sum-uniform-vector-components-round/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-sum-uniform-vector-components-round/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..3d8d1c1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-sum-uniform-vector-components-round/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,51 @@
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[3];
+};
+cbuffer cbuffer_x_8 : register(b2, space0) {
+  uint4 x_8[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[2];
+};
+
+void main_1() {
+  float f = 0.0f;
+  const float x_37 = asfloat(x_6[1].x);
+  const float x_39 = asfloat(x_8[0].x);
+  const float x_42 = asfloat(x_6[2].x);
+  const float x_44 = asfloat(x_8[0].x);
+  const float x_49 = asfloat(x_8[0].y);
+  f = (((x_37 * x_39) + (x_42 * round(x_44))) + x_49);
+  const float x_51 = f;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_53 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  if ((x_51 == x_53)) {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_59 = asint(x_10[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const int x_62 = asint(x_10[1].x);
+    const int x_65 = asint(x_10[1].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_68 = asint(x_10[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    x_GLF_color = float4(float(x_59), float(x_62), float(x_65), float(x_68));
+  } else {
+    const int x_72 = asint(x_10[1].x);
+    const float x_73 = float(x_72);
+    x_GLF_color = float4(x_73, x_73, x_73, x_73);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-sum-uniform-vector-components-round/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-sum-uniform-vector-components-round/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..16e16b0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-sum-uniform-vector-components-round/0-opt.spvasm.expected.msl
@@ -0,0 +1,65 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct buf2 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf2& x_8, constant buf0& x_10, thread float4* const tint_symbol_4) {
+  float f = 0.0f;
+  float const x_37 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  float const x_39 = x_8.resolution.x;
+  float const x_42 = x_6.x_GLF_uniform_float_values.arr[2].el;
+  float const x_44 = x_8.resolution.x;
+  float const x_49 = x_8.resolution.y;
+  f = (((x_37 * x_39) + (x_42 * rint(x_44))) + x_49);
+  float const x_51 = f;
+  float const x_53 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_51 == x_53)) {
+    int const x_59 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    int const x_62 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_65 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_68 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_59), float(x_62), float(x_65), float(x_68));
+  } else {
+    int const x_72 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    float const x_73 = float(x_72);
+    *(tint_symbol_4) = float4(x_73, x_73, x_73, x_73);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf2& x_8 [[buffer(2)]], constant buf0& x_10 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-sum-uniform-vector-components-round/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-sum-uniform-vector-components-round/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..c5cc68e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-sum-uniform-vector-components-round/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,150 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 91
+; Schema: 0
+               OpCapability Shader
+         %48 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "resolution"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf2 Block
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 2
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf1 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v2float = OpTypeVector %float 2
+       %buf2 = OpTypeStruct %v2float
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+        %x_8 = OpVariable %_ptr_Uniform_buf2 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %15 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %15
+        %int = OpTypeInt 32 1
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %15
+       %void = OpTypeVoid
+         %24 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %30 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_2 = OpConstant %int 2
+     %uint_1 = OpConstant %uint 1
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+         %79 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %24
+         %27 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %30
+         %34 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %35 = OpLoad %float %34
+         %36 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+         %37 = OpLoad %float %36
+         %39 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %40 = OpLoad %float %39
+         %41 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+         %42 = OpLoad %float %41
+         %44 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+         %45 = OpLoad %float %44
+         %46 = OpFMul %float %35 %37
+         %47 = OpExtInst %float %48 RoundEven %42
+         %49 = OpFMul %float %40 %47
+         %50 = OpFAdd %float %46 %49
+         %51 = OpFAdd %float %50 %45
+               OpStore %f %51
+         %52 = OpLoad %float %f
+         %54 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %55 = OpLoad %float %54
+         %56 = OpFOrdEqual %bool %52 %55
+               OpSelectionMerge %58 None
+               OpBranchConditional %56 %59 %60
+         %59 = OpLabel
+         %62 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %63 = OpLoad %int %62
+         %64 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %65 = OpLoad %int %64
+         %66 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %67 = OpLoad %int %66
+         %68 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %69 = OpLoad %int %68
+         %70 = OpConvertSToF %float %63
+         %71 = OpConvertSToF %float %65
+         %72 = OpConvertSToF %float %67
+         %73 = OpConvertSToF %float %69
+         %74 = OpCompositeConstruct %v4float %70 %71 %72 %73
+               OpStore %x_GLF_color %74
+               OpBranch %58
+         %60 = OpLabel
+         %75 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %76 = OpLoad %int %75
+         %77 = OpConvertSToF %float %76
+         %78 = OpCompositeConstruct %v4float %77 %77 %77 %77
+               OpStore %x_GLF_color %78
+               OpBranch %58
+         %58 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %79
+%tint_symbol = OpFunctionParameter %main_out
+         %83 = OpLabel
+         %84 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %84
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %24
+         %86 = OpLabel
+         %87 = OpFunctionCall %void %main_1
+         %89 = OpLoad %v4float %x_GLF_color
+         %90 = OpCompositeConstruct %main_out %89
+         %88 = OpFunctionCall %void %tint_symbol_2 %90
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-sum-uniform-vector-components-round/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-sum-uniform-vector-components-round/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..9b46e47
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-sum-uniform-vector-components-round/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,61 @@
+type Arr = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[block]]
+struct buf2 {
+  resolution : vec2<f32>;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(2)]] var<uniform> x_8 : buf2;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+fn main_1() {
+  var f : f32;
+  let x_37 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_39 : f32 = x_8.resolution.x;
+  let x_42 : f32 = x_6.x_GLF_uniform_float_values[2];
+  let x_44 : f32 = x_8.resolution.x;
+  let x_49 : f32 = x_8.resolution.y;
+  f = (((x_37 * x_39) + (x_42 * round(x_44))) + x_49);
+  let x_51 : f32 = f;
+  let x_53 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if ((x_51 == x_53)) {
+    let x_59 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_62 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_65 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_68 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_59), f32(x_62), f32(x_65), f32(x_68));
+  } else {
+    let x_72 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_73 : f32 = f32(x_72);
+    x_GLF_color = vec4<f32>(x_73, x_73, x_73, x_73);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-sum-uniform-vector-components-round/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-sum-uniform-vector-components-round/0-opt.wgsl
new file mode 100644
index 0000000..9b46e47
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-sum-uniform-vector-components-round/0-opt.wgsl
@@ -0,0 +1,61 @@
+type Arr = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[block]]
+struct buf2 {
+  resolution : vec2<f32>;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(2)]] var<uniform> x_8 : buf2;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+fn main_1() {
+  var f : f32;
+  let x_37 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_39 : f32 = x_8.resolution.x;
+  let x_42 : f32 = x_6.x_GLF_uniform_float_values[2];
+  let x_44 : f32 = x_8.resolution.x;
+  let x_49 : f32 = x_8.resolution.y;
+  f = (((x_37 * x_39) + (x_42 * round(x_44))) + x_49);
+  let x_51 : f32 = f;
+  let x_53 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if ((x_51 == x_53)) {
+    let x_59 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_62 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_65 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_68 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_59), f32(x_62), f32(x_65), f32(x_68));
+  } else {
+    let x_72 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_73 : f32 = f32(x_72);
+    x_GLF_color = vec4<f32>(x_73, x_73, x_73, x_73);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-sum-uniform-vector-components-round/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-sum-uniform-vector-components-round/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..3d8d1c1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-sum-uniform-vector-components-round/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,51 @@
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[3];
+};
+cbuffer cbuffer_x_8 : register(b2, space0) {
+  uint4 x_8[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[2];
+};
+
+void main_1() {
+  float f = 0.0f;
+  const float x_37 = asfloat(x_6[1].x);
+  const float x_39 = asfloat(x_8[0].x);
+  const float x_42 = asfloat(x_6[2].x);
+  const float x_44 = asfloat(x_8[0].x);
+  const float x_49 = asfloat(x_8[0].y);
+  f = (((x_37 * x_39) + (x_42 * round(x_44))) + x_49);
+  const float x_51 = f;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_53 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  if ((x_51 == x_53)) {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_59 = asint(x_10[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const int x_62 = asint(x_10[1].x);
+    const int x_65 = asint(x_10[1].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_68 = asint(x_10[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    x_GLF_color = float4(float(x_59), float(x_62), float(x_65), float(x_68));
+  } else {
+    const int x_72 = asint(x_10[1].x);
+    const float x_73 = float(x_72);
+    x_GLF_color = float4(x_73, x_73, x_73, x_73);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-sum-uniform-vector-components-round/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-sum-uniform-vector-components-round/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..16e16b0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-sum-uniform-vector-components-round/0-opt.wgsl.expected.msl
@@ -0,0 +1,65 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct buf2 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf2& x_8, constant buf0& x_10, thread float4* const tint_symbol_4) {
+  float f = 0.0f;
+  float const x_37 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  float const x_39 = x_8.resolution.x;
+  float const x_42 = x_6.x_GLF_uniform_float_values.arr[2].el;
+  float const x_44 = x_8.resolution.x;
+  float const x_49 = x_8.resolution.y;
+  f = (((x_37 * x_39) + (x_42 * rint(x_44))) + x_49);
+  float const x_51 = f;
+  float const x_53 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_51 == x_53)) {
+    int const x_59 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    int const x_62 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_65 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_68 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_59), float(x_62), float(x_65), float(x_68));
+  } else {
+    int const x_72 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    float const x_73 = float(x_72);
+    *(tint_symbol_4) = float4(x_73, x_73, x_73, x_73);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf2& x_8 [[buffer(2)]], constant buf0& x_10 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-sum-uniform-vector-components-round/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-sum-uniform-vector-components-round/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..c5cc68e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-sum-uniform-vector-components-round/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,150 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 91
+; Schema: 0
+               OpCapability Shader
+         %48 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "resolution"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf2 Block
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 2
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf1 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v2float = OpTypeVector %float 2
+       %buf2 = OpTypeStruct %v2float
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+        %x_8 = OpVariable %_ptr_Uniform_buf2 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %15 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %15
+        %int = OpTypeInt 32 1
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %15
+       %void = OpTypeVoid
+         %24 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %30 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_2 = OpConstant %int 2
+     %uint_1 = OpConstant %uint 1
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+         %79 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %24
+         %27 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %30
+         %34 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %35 = OpLoad %float %34
+         %36 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+         %37 = OpLoad %float %36
+         %39 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %40 = OpLoad %float %39
+         %41 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+         %42 = OpLoad %float %41
+         %44 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+         %45 = OpLoad %float %44
+         %46 = OpFMul %float %35 %37
+         %47 = OpExtInst %float %48 RoundEven %42
+         %49 = OpFMul %float %40 %47
+         %50 = OpFAdd %float %46 %49
+         %51 = OpFAdd %float %50 %45
+               OpStore %f %51
+         %52 = OpLoad %float %f
+         %54 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %55 = OpLoad %float %54
+         %56 = OpFOrdEqual %bool %52 %55
+               OpSelectionMerge %58 None
+               OpBranchConditional %56 %59 %60
+         %59 = OpLabel
+         %62 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %63 = OpLoad %int %62
+         %64 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %65 = OpLoad %int %64
+         %66 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %67 = OpLoad %int %66
+         %68 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %69 = OpLoad %int %68
+         %70 = OpConvertSToF %float %63
+         %71 = OpConvertSToF %float %65
+         %72 = OpConvertSToF %float %67
+         %73 = OpConvertSToF %float %69
+         %74 = OpCompositeConstruct %v4float %70 %71 %72 %73
+               OpStore %x_GLF_color %74
+               OpBranch %58
+         %60 = OpLabel
+         %75 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %76 = OpLoad %int %75
+         %77 = OpConvertSToF %float %76
+         %78 = OpCompositeConstruct %v4float %77 %77 %77 %77
+               OpStore %x_GLF_color %78
+               OpBranch %58
+         %58 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %79
+%tint_symbol = OpFunctionParameter %main_out
+         %83 = OpLabel
+         %84 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %84
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %24
+         %86 = OpLabel
+         %87 = OpFunctionCall %void %main_1
+         %89 = OpLoad %v4float %x_GLF_color
+         %90 = OpCompositeConstruct %main_out %89
+         %88 = OpFunctionCall %void %tint_symbol_2 %90
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-sum-uniform-vector-components-round/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-sum-uniform-vector-components-round/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..9b46e47
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-sum-uniform-vector-components-round/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,61 @@
+type Arr = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[block]]
+struct buf2 {
+  resolution : vec2<f32>;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(2)]] var<uniform> x_8 : buf2;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+fn main_1() {
+  var f : f32;
+  let x_37 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_39 : f32 = x_8.resolution.x;
+  let x_42 : f32 = x_6.x_GLF_uniform_float_values[2];
+  let x_44 : f32 = x_8.resolution.x;
+  let x_49 : f32 = x_8.resolution.y;
+  f = (((x_37 * x_39) + (x_42 * round(x_44))) + x_49);
+  let x_51 : f32 = f;
+  let x_53 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if ((x_51 == x_53)) {
+    let x_59 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_62 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_65 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_68 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_59), f32(x_62), f32(x_65), f32(x_68));
+  } else {
+    let x_72 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_73 : f32 = f32(x_72);
+    x_GLF_color = vec4<f32>(x_73, x_73, x_73, x_73);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.spvasm
new file mode 100644
index 0000000..c742a25
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.spvasm
@@ -0,0 +1,152 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %color "color"
+               OpName %i "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %j "j"
+               OpName %k "k"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+    %float_1 = OpConstant %float 1
+         %20 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf1 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_float = OpTypePointer Function %float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %15
+         %35 = OpLabel
+      %color = OpVariable %_ptr_Function_v4float Function
+          %i = OpVariable %_ptr_Function_int Function
+          %j = OpVariable %_ptr_Function_int Function
+          %k = OpVariable %_ptr_Function_int Function
+               OpStore %color %20
+         %36 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %37 = OpLoad %int %36
+               OpStore %i %37
+               OpBranch %38
+         %38 = OpLabel
+               OpLoopMerge %39 %40 None
+               OpBranch %41
+         %41 = OpLabel
+         %42 = OpLoad %int %i
+         %43 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %44 = OpLoad %int %43
+         %45 = OpSLessThan %bool %42 %44
+               OpBranchConditional %45 %46 %39
+         %46 = OpLabel
+         %47 = OpLoad %int %i
+               OpSelectionMerge %48 None
+               OpSwitch %47 %48 1 %49 2 %50
+         %49 = OpLabel
+         %51 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %52 = OpLoad %int %51
+               OpStore %j %52
+               OpBranch %53
+         %53 = OpLabel
+               OpLoopMerge %54 %55 None
+               OpBranch %56
+         %56 = OpLabel
+         %57 = OpLoad %int %i
+         %58 = OpLoad %int %i
+         %59 = OpSGreaterThan %bool %57 %58
+               OpBranchConditional %59 %60 %54
+         %60 = OpLabel
+         %61 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %62 = OpLoad %int %61
+               OpStore %k %62
+               OpBranch %63
+         %63 = OpLabel
+               OpLoopMerge %64 %65 None
+               OpBranch %66
+         %66 = OpLabel
+         %67 = OpLoad %int %k
+         %68 = OpLoad %int %i
+         %69 = OpSLessThan %bool %67 %68
+               OpBranchConditional %69 %70 %64
+         %70 = OpLabel
+         %71 = OpLoad %int %k
+         %72 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %73 = OpLoad %float %72
+         %74 = OpAccessChain %_ptr_Function_float %color %71
+               OpStore %74 %73
+               OpBranch %65
+         %65 = OpLabel
+         %75 = OpLoad %int %k
+         %76 = OpIAdd %int %75 %int_1
+               OpStore %k %76
+               OpBranch %63
+         %64 = OpLabel
+               OpBranch %55
+         %55 = OpLabel
+         %77 = OpLoad %int %j
+         %78 = OpIAdd %int %77 %int_1
+               OpStore %j %78
+               OpBranch %53
+         %54 = OpLabel
+         %79 = OpLoad %int %i
+         %80 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %81 = OpLoad %float %80
+         %82 = OpAccessChain %_ptr_Function_float %color %79
+               OpStore %82 %81
+               OpBranch %48
+         %50 = OpLabel
+         %83 = OpLoad %int %i
+         %84 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %85 = OpLoad %float %84
+         %86 = OpAccessChain %_ptr_Function_float %color %83
+               OpStore %86 %85
+               OpBranch %48
+         %48 = OpLabel
+               OpBranch %40
+         %40 = OpLabel
+         %87 = OpLoad %int %i
+         %88 = OpIAdd %int %87 %int_1
+               OpStore %i %88
+               OpBranch %38
+         %39 = OpLabel
+         %89 = OpLoad %v4float %color
+               OpStore %_GLF_color %89
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..8dae79c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,86 @@
+void set_float4(inout float4 vec, int idx, float val) {
+  vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
+}
+
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[2];
+};
+cbuffer cbuffer_x_11 : register(b1, space0) {
+  uint4 x_11[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int i = 0;
+  int j = 0;
+  int k = 0;
+  color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_37 = asint(x_7[scalar_offset / 4][scalar_offset % 4]);
+  i = x_37;
+  while (true) {
+    const int x_42 = i;
+    const int x_44 = asint(x_7[1].x);
+    if ((x_42 < x_44)) {
+    } else {
+      break;
+    }
+    switch(i) {
+      case 2: {
+        const int x_83 = i;
+        const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+        const float x_85 = asfloat(x_11[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+        set_float4(color, x_83, x_85);
+        break;
+      }
+      case 1: {
+        const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+        const int x_52 = asint(x_7[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+        j = x_52;
+        {
+          for(; (i > i); j = (j + 1)) {
+            const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+            const int x_62 = asint(x_7[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+            k = x_62;
+            {
+              for(; (k < i); k = (k + 1)) {
+                const int x_71 = k;
+                const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+                const float x_73 = asfloat(x_11[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+                set_float4(color, x_71, x_73);
+              }
+            }
+          }
+        }
+        const int x_79 = i;
+        const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+        const float x_81 = asfloat(x_11[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+        set_float4(color, x_79, x_81);
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  x_GLF_color = color;
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..82cc6ae
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.spvasm.expected.msl
@@ -0,0 +1,112 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, constant buf1& x_11, thread float4* const tint_symbol_4) {
+  float4 color = 0.0f;
+  int i = 0;
+  int j = 0;
+  int k = 0;
+  color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  int const x_37 = x_7.x_GLF_uniform_int_values.arr[0].el;
+  i = x_37;
+  while (true) {
+    int const x_42 = i;
+    int const x_44 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    if ((x_42 < x_44)) {
+    } else {
+      break;
+    }
+    int const x_47 = i;
+    switch(x_47) {
+      case 2: {
+        int const x_83 = i;
+        float const x_85 = x_11.x_GLF_uniform_float_values.arr[0].el;
+        color[x_83] = x_85;
+        break;
+      }
+      case 1: {
+        int const x_52 = x_7.x_GLF_uniform_int_values.arr[0].el;
+        j = x_52;
+        while (true) {
+          int const x_57 = i;
+          int const x_58 = i;
+          if ((x_57 > x_58)) {
+          } else {
+            break;
+          }
+          int const x_62 = x_7.x_GLF_uniform_int_values.arr[0].el;
+          k = x_62;
+          while (true) {
+            int const x_67 = k;
+            int const x_68 = i;
+            if ((x_67 < x_68)) {
+            } else {
+              break;
+            }
+            int const x_71 = k;
+            float const x_73 = x_11.x_GLF_uniform_float_values.arr[0].el;
+            color[x_71] = x_73;
+            {
+              int const x_75 = k;
+              k = (x_75 + 1);
+            }
+          }
+          {
+            int const x_77 = j;
+            j = (x_77 + 1);
+          }
+        }
+        int const x_79 = i;
+        float const x_81 = x_11.x_GLF_uniform_float_values.arr[0].el;
+        color[x_79] = x_81;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    {
+      int const x_87 = i;
+      i = (x_87 + 1);
+    }
+  }
+  float4 const x_89 = color;
+  *(tint_symbol_4) = x_89;
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]], constant buf1& x_11 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, x_11, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..3cdb9a4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,203 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 113
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_11 "x_11"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %color "color"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %k "k"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_11 NonWritable
+               OpDecorate %x_11 DescriptorSet 0
+               OpDecorate %x_11 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf1 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_11 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%_ptr_Function_int = OpTypePointer Function %int
+         %28 = OpConstantNull %int
+    %float_1 = OpConstant %float 1
+         %32 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_float = OpTypePointer Function %float
+   %main_out = OpTypeStruct %v4float
+        %101 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+      %color = OpVariable %_ptr_Function_v4float Function %17
+          %i = OpVariable %_ptr_Function_int Function %28
+          %j = OpVariable %_ptr_Function_int Function %28
+          %k = OpVariable %_ptr_Function_int Function %28
+               OpStore %color %32
+         %36 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %37 = OpLoad %int %36
+               OpStore %i %37
+               OpBranch %38
+         %38 = OpLabel
+               OpLoopMerge %39 %40 None
+               OpBranch %41
+         %41 = OpLabel
+         %42 = OpLoad %int %i
+         %44 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %45 = OpLoad %int %44
+         %46 = OpSLessThan %bool %42 %45
+               OpSelectionMerge %48 None
+               OpBranchConditional %46 %49 %50
+         %49 = OpLabel
+               OpBranch %48
+         %50 = OpLabel
+               OpBranch %39
+         %48 = OpLabel
+         %51 = OpLoad %int %i
+               OpSelectionMerge %52 None
+               OpSwitch %51 %53 2 %54 1 %55
+         %54 = OpLabel
+         %56 = OpLoad %int %i
+         %58 = OpAccessChain %_ptr_Uniform_float %x_11 %uint_0 %int_0
+         %59 = OpLoad %float %58
+         %61 = OpAccessChain %_ptr_Function_float %color %56
+               OpStore %61 %59
+               OpBranch %52
+         %55 = OpLabel
+         %62 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %63 = OpLoad %int %62
+               OpStore %j %63
+               OpBranch %64
+         %64 = OpLabel
+               OpLoopMerge %65 %66 None
+               OpBranch %67
+         %67 = OpLabel
+         %68 = OpLoad %int %i
+         %69 = OpLoad %int %i
+         %70 = OpSGreaterThan %bool %68 %69
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %73
+         %72 = OpLabel
+               OpBranch %71
+         %73 = OpLabel
+               OpBranch %65
+         %71 = OpLabel
+         %74 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %75 = OpLoad %int %74
+               OpStore %k %75
+               OpBranch %76
+         %76 = OpLabel
+               OpLoopMerge %77 %78 None
+               OpBranch %79
+         %79 = OpLabel
+         %80 = OpLoad %int %k
+         %81 = OpLoad %int %i
+         %82 = OpSLessThan %bool %80 %81
+               OpSelectionMerge %83 None
+               OpBranchConditional %82 %84 %85
+         %84 = OpLabel
+               OpBranch %83
+         %85 = OpLabel
+               OpBranch %77
+         %83 = OpLabel
+         %86 = OpLoad %int %k
+         %87 = OpAccessChain %_ptr_Uniform_float %x_11 %uint_0 %int_0
+         %88 = OpLoad %float %87
+         %89 = OpAccessChain %_ptr_Function_float %color %86
+               OpStore %89 %88
+               OpBranch %78
+         %78 = OpLabel
+         %90 = OpLoad %int %k
+         %91 = OpIAdd %int %90 %int_1
+               OpStore %k %91
+               OpBranch %76
+         %77 = OpLabel
+               OpBranch %66
+         %66 = OpLabel
+         %92 = OpLoad %int %j
+         %93 = OpIAdd %int %92 %int_1
+               OpStore %j %93
+               OpBranch %64
+         %65 = OpLabel
+         %94 = OpLoad %int %i
+         %95 = OpAccessChain %_ptr_Uniform_float %x_11 %uint_0 %int_0
+         %96 = OpLoad %float %95
+         %97 = OpAccessChain %_ptr_Function_float %color %94
+               OpStore %97 %96
+               OpBranch %52
+         %53 = OpLabel
+               OpBranch %52
+         %52 = OpLabel
+               OpBranch %40
+         %40 = OpLabel
+         %98 = OpLoad %int %i
+         %99 = OpIAdd %int %98 %int_1
+               OpStore %i %99
+               OpBranch %38
+         %39 = OpLabel
+        %100 = OpLoad %v4float %color
+               OpStore %x_GLF_color %100
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %101
+%tint_symbol = OpFunctionParameter %main_out
+        %105 = OpLabel
+        %106 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %106
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %108 = OpLabel
+        %109 = OpFunctionCall %void %main_1
+        %111 = OpLoad %v4float %x_GLF_color
+        %112 = OpCompositeConstruct %main_out %111
+        %110 = OpFunctionCall %void %tint_symbol_2 %112
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..69896d9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,104 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_11 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var color : vec4<f32>;
+  var i : i32;
+  var j : i32;
+  var k : i32;
+  color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+  let x_37 : i32 = x_7.x_GLF_uniform_int_values[0];
+  i = x_37;
+  loop {
+    let x_42 : i32 = i;
+    let x_44 : i32 = x_7.x_GLF_uniform_int_values[1];
+    if ((x_42 < x_44)) {
+    } else {
+      break;
+    }
+    let x_47 : i32 = i;
+    switch(x_47) {
+      case 2: {
+        let x_83 : i32 = i;
+        let x_85 : f32 = x_11.x_GLF_uniform_float_values[0];
+        color[x_83] = x_85;
+      }
+      case 1: {
+        let x_52 : i32 = x_7.x_GLF_uniform_int_values[0];
+        j = x_52;
+        loop {
+          let x_57 : i32 = i;
+          let x_58 : i32 = i;
+          if ((x_57 > x_58)) {
+          } else {
+            break;
+          }
+          let x_62 : i32 = x_7.x_GLF_uniform_int_values[0];
+          k = x_62;
+          loop {
+            let x_67 : i32 = k;
+            let x_68 : i32 = i;
+            if ((x_67 < x_68)) {
+            } else {
+              break;
+            }
+            let x_71 : i32 = k;
+            let x_73 : f32 = x_11.x_GLF_uniform_float_values[0];
+            color[x_71] = x_73;
+
+            continuing {
+              let x_75 : i32 = k;
+              k = (x_75 + 1);
+            }
+          }
+
+          continuing {
+            let x_77 : i32 = j;
+            j = (x_77 + 1);
+          }
+        }
+        let x_79 : i32 = i;
+        let x_81 : f32 = x_11.x_GLF_uniform_float_values[0];
+        color[x_79] = x_81;
+      }
+      default: {
+      }
+    }
+
+    continuing {
+      let x_87 : i32 = i;
+      i = (x_87 + 1);
+    }
+  }
+  let x_89 : vec4<f32> = color;
+  x_GLF_color = x_89;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.wgsl
new file mode 100644
index 0000000..69896d9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.wgsl
@@ -0,0 +1,104 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_11 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var color : vec4<f32>;
+  var i : i32;
+  var j : i32;
+  var k : i32;
+  color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+  let x_37 : i32 = x_7.x_GLF_uniform_int_values[0];
+  i = x_37;
+  loop {
+    let x_42 : i32 = i;
+    let x_44 : i32 = x_7.x_GLF_uniform_int_values[1];
+    if ((x_42 < x_44)) {
+    } else {
+      break;
+    }
+    let x_47 : i32 = i;
+    switch(x_47) {
+      case 2: {
+        let x_83 : i32 = i;
+        let x_85 : f32 = x_11.x_GLF_uniform_float_values[0];
+        color[x_83] = x_85;
+      }
+      case 1: {
+        let x_52 : i32 = x_7.x_GLF_uniform_int_values[0];
+        j = x_52;
+        loop {
+          let x_57 : i32 = i;
+          let x_58 : i32 = i;
+          if ((x_57 > x_58)) {
+          } else {
+            break;
+          }
+          let x_62 : i32 = x_7.x_GLF_uniform_int_values[0];
+          k = x_62;
+          loop {
+            let x_67 : i32 = k;
+            let x_68 : i32 = i;
+            if ((x_67 < x_68)) {
+            } else {
+              break;
+            }
+            let x_71 : i32 = k;
+            let x_73 : f32 = x_11.x_GLF_uniform_float_values[0];
+            color[x_71] = x_73;
+
+            continuing {
+              let x_75 : i32 = k;
+              k = (x_75 + 1);
+            }
+          }
+
+          continuing {
+            let x_77 : i32 = j;
+            j = (x_77 + 1);
+          }
+        }
+        let x_79 : i32 = i;
+        let x_81 : f32 = x_11.x_GLF_uniform_float_values[0];
+        color[x_79] = x_81;
+      }
+      default: {
+      }
+    }
+
+    continuing {
+      let x_87 : i32 = i;
+      i = (x_87 + 1);
+    }
+  }
+  let x_89 : vec4<f32> = color;
+  x_GLF_color = x_89;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..8dae79c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,86 @@
+void set_float4(inout float4 vec, int idx, float val) {
+  vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
+}
+
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[2];
+};
+cbuffer cbuffer_x_11 : register(b1, space0) {
+  uint4 x_11[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int i = 0;
+  int j = 0;
+  int k = 0;
+  color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_37 = asint(x_7[scalar_offset / 4][scalar_offset % 4]);
+  i = x_37;
+  while (true) {
+    const int x_42 = i;
+    const int x_44 = asint(x_7[1].x);
+    if ((x_42 < x_44)) {
+    } else {
+      break;
+    }
+    switch(i) {
+      case 2: {
+        const int x_83 = i;
+        const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+        const float x_85 = asfloat(x_11[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+        set_float4(color, x_83, x_85);
+        break;
+      }
+      case 1: {
+        const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+        const int x_52 = asint(x_7[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+        j = x_52;
+        {
+          for(; (i > i); j = (j + 1)) {
+            const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+            const int x_62 = asint(x_7[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+            k = x_62;
+            {
+              for(; (k < i); k = (k + 1)) {
+                const int x_71 = k;
+                const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+                const float x_73 = asfloat(x_11[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+                set_float4(color, x_71, x_73);
+              }
+            }
+          }
+        }
+        const int x_79 = i;
+        const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+        const float x_81 = asfloat(x_11[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+        set_float4(color, x_79, x_81);
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  x_GLF_color = color;
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..82cc6ae
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.wgsl.expected.msl
@@ -0,0 +1,112 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, constant buf1& x_11, thread float4* const tint_symbol_4) {
+  float4 color = 0.0f;
+  int i = 0;
+  int j = 0;
+  int k = 0;
+  color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  int const x_37 = x_7.x_GLF_uniform_int_values.arr[0].el;
+  i = x_37;
+  while (true) {
+    int const x_42 = i;
+    int const x_44 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    if ((x_42 < x_44)) {
+    } else {
+      break;
+    }
+    int const x_47 = i;
+    switch(x_47) {
+      case 2: {
+        int const x_83 = i;
+        float const x_85 = x_11.x_GLF_uniform_float_values.arr[0].el;
+        color[x_83] = x_85;
+        break;
+      }
+      case 1: {
+        int const x_52 = x_7.x_GLF_uniform_int_values.arr[0].el;
+        j = x_52;
+        while (true) {
+          int const x_57 = i;
+          int const x_58 = i;
+          if ((x_57 > x_58)) {
+          } else {
+            break;
+          }
+          int const x_62 = x_7.x_GLF_uniform_int_values.arr[0].el;
+          k = x_62;
+          while (true) {
+            int const x_67 = k;
+            int const x_68 = i;
+            if ((x_67 < x_68)) {
+            } else {
+              break;
+            }
+            int const x_71 = k;
+            float const x_73 = x_11.x_GLF_uniform_float_values.arr[0].el;
+            color[x_71] = x_73;
+            {
+              int const x_75 = k;
+              k = (x_75 + 1);
+            }
+          }
+          {
+            int const x_77 = j;
+            j = (x_77 + 1);
+          }
+        }
+        int const x_79 = i;
+        float const x_81 = x_11.x_GLF_uniform_float_values.arr[0].el;
+        color[x_79] = x_81;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    {
+      int const x_87 = i;
+      i = (x_87 + 1);
+    }
+  }
+  float4 const x_89 = color;
+  *(tint_symbol_4) = x_89;
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]], constant buf1& x_11 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, x_11, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..3cdb9a4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,203 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 113
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_11 "x_11"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %color "color"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %k "k"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_11 NonWritable
+               OpDecorate %x_11 DescriptorSet 0
+               OpDecorate %x_11 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf1 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_11 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%_ptr_Function_int = OpTypePointer Function %int
+         %28 = OpConstantNull %int
+    %float_1 = OpConstant %float 1
+         %32 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_float = OpTypePointer Function %float
+   %main_out = OpTypeStruct %v4float
+        %101 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+      %color = OpVariable %_ptr_Function_v4float Function %17
+          %i = OpVariable %_ptr_Function_int Function %28
+          %j = OpVariable %_ptr_Function_int Function %28
+          %k = OpVariable %_ptr_Function_int Function %28
+               OpStore %color %32
+         %36 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %37 = OpLoad %int %36
+               OpStore %i %37
+               OpBranch %38
+         %38 = OpLabel
+               OpLoopMerge %39 %40 None
+               OpBranch %41
+         %41 = OpLabel
+         %42 = OpLoad %int %i
+         %44 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %45 = OpLoad %int %44
+         %46 = OpSLessThan %bool %42 %45
+               OpSelectionMerge %48 None
+               OpBranchConditional %46 %49 %50
+         %49 = OpLabel
+               OpBranch %48
+         %50 = OpLabel
+               OpBranch %39
+         %48 = OpLabel
+         %51 = OpLoad %int %i
+               OpSelectionMerge %52 None
+               OpSwitch %51 %53 2 %54 1 %55
+         %54 = OpLabel
+         %56 = OpLoad %int %i
+         %58 = OpAccessChain %_ptr_Uniform_float %x_11 %uint_0 %int_0
+         %59 = OpLoad %float %58
+         %61 = OpAccessChain %_ptr_Function_float %color %56
+               OpStore %61 %59
+               OpBranch %52
+         %55 = OpLabel
+         %62 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %63 = OpLoad %int %62
+               OpStore %j %63
+               OpBranch %64
+         %64 = OpLabel
+               OpLoopMerge %65 %66 None
+               OpBranch %67
+         %67 = OpLabel
+         %68 = OpLoad %int %i
+         %69 = OpLoad %int %i
+         %70 = OpSGreaterThan %bool %68 %69
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %73
+         %72 = OpLabel
+               OpBranch %71
+         %73 = OpLabel
+               OpBranch %65
+         %71 = OpLabel
+         %74 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %75 = OpLoad %int %74
+               OpStore %k %75
+               OpBranch %76
+         %76 = OpLabel
+               OpLoopMerge %77 %78 None
+               OpBranch %79
+         %79 = OpLabel
+         %80 = OpLoad %int %k
+         %81 = OpLoad %int %i
+         %82 = OpSLessThan %bool %80 %81
+               OpSelectionMerge %83 None
+               OpBranchConditional %82 %84 %85
+         %84 = OpLabel
+               OpBranch %83
+         %85 = OpLabel
+               OpBranch %77
+         %83 = OpLabel
+         %86 = OpLoad %int %k
+         %87 = OpAccessChain %_ptr_Uniform_float %x_11 %uint_0 %int_0
+         %88 = OpLoad %float %87
+         %89 = OpAccessChain %_ptr_Function_float %color %86
+               OpStore %89 %88
+               OpBranch %78
+         %78 = OpLabel
+         %90 = OpLoad %int %k
+         %91 = OpIAdd %int %90 %int_1
+               OpStore %k %91
+               OpBranch %76
+         %77 = OpLabel
+               OpBranch %66
+         %66 = OpLabel
+         %92 = OpLoad %int %j
+         %93 = OpIAdd %int %92 %int_1
+               OpStore %j %93
+               OpBranch %64
+         %65 = OpLabel
+         %94 = OpLoad %int %i
+         %95 = OpAccessChain %_ptr_Uniform_float %x_11 %uint_0 %int_0
+         %96 = OpLoad %float %95
+         %97 = OpAccessChain %_ptr_Function_float %color %94
+               OpStore %97 %96
+               OpBranch %52
+         %53 = OpLabel
+               OpBranch %52
+         %52 = OpLabel
+               OpBranch %40
+         %40 = OpLabel
+         %98 = OpLoad %int %i
+         %99 = OpIAdd %int %98 %int_1
+               OpStore %i %99
+               OpBranch %38
+         %39 = OpLabel
+        %100 = OpLoad %v4float %color
+               OpStore %x_GLF_color %100
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %101
+%tint_symbol = OpFunctionParameter %main_out
+        %105 = OpLabel
+        %106 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %106
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %108 = OpLabel
+        %109 = OpFunctionCall %void %main_1
+        %111 = OpLoad %v4float %x_GLF_color
+        %112 = OpCompositeConstruct %main_out %111
+        %110 = OpFunctionCall %void %tint_symbol_2 %112
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..69896d9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-for-for-for/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,104 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_11 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var color : vec4<f32>;
+  var i : i32;
+  var j : i32;
+  var k : i32;
+  color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+  let x_37 : i32 = x_7.x_GLF_uniform_int_values[0];
+  i = x_37;
+  loop {
+    let x_42 : i32 = i;
+    let x_44 : i32 = x_7.x_GLF_uniform_int_values[1];
+    if ((x_42 < x_44)) {
+    } else {
+      break;
+    }
+    let x_47 : i32 = i;
+    switch(x_47) {
+      case 2: {
+        let x_83 : i32 = i;
+        let x_85 : f32 = x_11.x_GLF_uniform_float_values[0];
+        color[x_83] = x_85;
+      }
+      case 1: {
+        let x_52 : i32 = x_7.x_GLF_uniform_int_values[0];
+        j = x_52;
+        loop {
+          let x_57 : i32 = i;
+          let x_58 : i32 = i;
+          if ((x_57 > x_58)) {
+          } else {
+            break;
+          }
+          let x_62 : i32 = x_7.x_GLF_uniform_int_values[0];
+          k = x_62;
+          loop {
+            let x_67 : i32 = k;
+            let x_68 : i32 = i;
+            if ((x_67 < x_68)) {
+            } else {
+              break;
+            }
+            let x_71 : i32 = k;
+            let x_73 : f32 = x_11.x_GLF_uniform_float_values[0];
+            color[x_71] = x_73;
+
+            continuing {
+              let x_75 : i32 = k;
+              k = (x_75 + 1);
+            }
+          }
+
+          continuing {
+            let x_77 : i32 = j;
+            j = (x_77 + 1);
+          }
+        }
+        let x_79 : i32 = i;
+        let x_81 : f32 = x_11.x_GLF_uniform_float_values[0];
+        color[x_79] = x_81;
+      }
+      default: {
+      }
+    }
+
+    continuing {
+      let x_87 : i32 = i;
+      i = (x_87 + 1);
+    }
+  }
+  let x_89 : vec4<f32> = color;
+  x_GLF_color = x_89;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-infinite-loops/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-infinite-loops/0-opt.spvasm
new file mode 100644
index 0000000..9adfcd1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-infinite-loops/0-opt.spvasm
@@ -0,0 +1,157 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "zero"
+               OpName %__0 ""
+               OpName %i "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %__1 ""
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %buf2 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 2
+               OpDecorate %i RelaxedPrecision
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__1 DescriptorSet 0
+               OpDecorate %__1 Binding 0
+               OpDecorate %13 RelaxedPrecision
+               OpDecorate %14 RelaxedPrecision
+               OpDecorate %15 RelaxedPrecision
+               OpDecorate %16 RelaxedPrecision
+               OpDecorate %17 RelaxedPrecision
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %buf2 = OpTypeStruct %float
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+        %__0 = OpVariable %_ptr_Uniform_buf2 Uniform
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+       %true = OpConstantTrue %bool
+%_ptr_Function_int = OpTypePointer Function %int
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__1 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %main = OpFunction %void None %19
+         %36 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+         %37 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %38 = OpLoad %float %37
+         %39 = OpCompositeConstruct %v4float %38 %38 %38 %38
+               OpStore %_GLF_color %39
+         %40 = OpAccessChain %_ptr_Uniform_float %__0 %int_0
+         %41 = OpLoad %float %40
+         %42 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %43 = OpLoad %float %42
+         %44 = OpFOrdGreaterThan %bool %41 %43
+               OpSelectionMerge %45 None
+               OpBranchConditional %44 %46 %47
+         %46 = OpLabel
+               OpBranch %48
+         %48 = OpLabel
+               OpLoopMerge %49 %50 None
+               OpBranch %51
+         %51 = OpLabel
+         %52 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %53 = OpLoad %float %52
+         %54 = OpCompositeConstruct %v4float %53 %53 %53 %53
+               OpStore %_GLF_color %54
+               OpBranch %50
+         %50 = OpLabel
+               OpBranchConditional %true %48 %49
+         %49 = OpLabel
+               OpBranch %45
+         %47 = OpLabel
+               OpBranch %55
+         %55 = OpLabel
+               OpLoopMerge %56 %57 None
+               OpBranch %58
+         %58 = OpLabel
+               OpBranch %59
+         %59 = OpLabel
+               OpLoopMerge %60 %61 None
+               OpBranch %62
+         %62 = OpLabel
+               OpBranchConditional %true %63 %60
+         %63 = OpLabel
+         %64 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_1
+         %13 = OpLoad %int %64
+               OpStore %i %13
+               OpBranch %65
+         %65 = OpLabel
+               OpLoopMerge %66 %67 None
+               OpBranch %68
+         %68 = OpLabel
+         %14 = OpLoad %int %i
+         %69 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_0
+         %15 = OpLoad %int %69
+         %70 = OpSLessThan %bool %14 %15
+               OpBranchConditional %70 %71 %66
+         %71 = OpLabel
+         %72 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %73 = OpLoad %float %72
+         %74 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %75 = OpLoad %float %74
+         %76 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %77 = OpLoad %float %76
+         %78 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %79 = OpLoad %float %78
+         %80 = OpCompositeConstruct %v4float %73 %75 %77 %79
+               OpStore %_GLF_color %80
+               OpBranch %67
+         %67 = OpLabel
+         %16 = OpLoad %int %i
+         %17 = OpIAdd %int %16 %int_1
+               OpStore %i %17
+               OpBranch %65
+         %66 = OpLabel
+               OpBranch %60
+         %61 = OpLabel
+               OpBranch %59
+         %60 = OpLabel
+               OpBranch %57
+         %57 = OpLabel
+         %81 = OpAccessChain %_ptr_Uniform_float %__0 %int_0
+         %82 = OpLoad %float %81
+         %83 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %84 = OpLoad %float %83
+         %85 = OpFOrdGreaterThan %bool %82 %84
+               OpBranchConditional %85 %55 %56
+         %56 = OpLabel
+               OpBranch %45
+         %45 = OpLabel
+               OpReturn
+               OpFunctionEnd
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
new file mode 100755
index 0000000..1653b58
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-infinite-loops/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,95 @@
+SKIP: FAILED
+
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_5 : register(b1, space0) {
+  uint4 x_5[2];
+};
+cbuffer cbuffer_x_7 : register(b2, space0) {
+  uint4 x_7[1];
+};
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[2];
+};
+
+void main_1() {
+  int i = 0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_38 = asfloat(x_5[scalar_offset / 4][scalar_offset % 4]);
+  x_GLF_color = float4(x_38, x_38, x_38, x_38);
+  const float x_41 = asfloat(x_7[0].x);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_43 = asfloat(x_5[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_41 > x_43)) {
+    while (true) {
+      const float x_53 = asfloat(x_5[1].x);
+      x_GLF_color = float4(x_53, x_53, x_53, x_53);
+      {
+        if (true) {
+        } else {
+          break;
+        }
+      }
+    }
+  } else {
+    while (true) {
+      while (true) {
+        if (true) {
+        } else {
+          break;
+        }
+        const int x_13 = asint(x_10[1].x);
+        i = x_13;
+        while (true) {
+          const int x_14 = i;
+          const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+          const int x_15 = asint(x_10[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+          if ((x_14 < x_15)) {
+          } else {
+            break;
+          }
+          const float x_73 = asfloat(x_5[1].x);
+          const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+          const float x_75 = asfloat(x_5[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+          const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+          const float x_77 = asfloat(x_5[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+          const float x_79 = asfloat(x_5[1].x);
+          x_GLF_color = float4(x_73, x_75, x_77, x_79);
+          {
+            i = (i + 1);
+          }
+        }
+        break;
+      }
+      {
+        const float x_82 = asfloat(x_7[0].x);
+        const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+        const float x_84 = asfloat(x_5[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+        if ((x_82 > x_84)) {
+        } else {
+          break;
+        }
+      }
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
+error: validation errors
+T:\tmp\uf58.0:82: error: Loop must have break.
+Validation failed.
+
+
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-infinite-loops/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-infinite-loops/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..126ce92
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-infinite-loops/0-opt.spvasm.expected.msl
@@ -0,0 +1,99 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct buf2 {
+  /* 0x0000 */ float zero;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_5, constant buf2& x_7, constant buf0& x_10, thread float4* const tint_symbol_4) {
+  int i = 0;
+  float const x_38 = x_5.x_GLF_uniform_float_values.arr[0].el;
+  *(tint_symbol_4) = float4(x_38, x_38, x_38, x_38);
+  float const x_41 = x_7.zero;
+  float const x_43 = x_5.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_41 > x_43)) {
+    while (true) {
+      float const x_53 = x_5.x_GLF_uniform_float_values.arr[1].el;
+      *(tint_symbol_4) = float4(x_53, x_53, x_53, x_53);
+      {
+        if (true) {
+        } else {
+          break;
+        }
+      }
+    }
+  } else {
+    while (true) {
+      while (true) {
+        if (true) {
+        } else {
+          break;
+        }
+        int const x_13 = x_10.x_GLF_uniform_int_values.arr[1].el;
+        i = x_13;
+        while (true) {
+          int const x_14 = i;
+          int const x_15 = x_10.x_GLF_uniform_int_values.arr[0].el;
+          if ((x_14 < x_15)) {
+          } else {
+            break;
+          }
+          float const x_73 = x_5.x_GLF_uniform_float_values.arr[1].el;
+          float const x_75 = x_5.x_GLF_uniform_float_values.arr[0].el;
+          float const x_77 = x_5.x_GLF_uniform_float_values.arr[0].el;
+          float const x_79 = x_5.x_GLF_uniform_float_values.arr[1].el;
+          *(tint_symbol_4) = float4(x_73, x_75, x_77, x_79);
+          {
+            int const x_16 = i;
+            i = (x_16 + 1);
+          }
+        }
+        break;
+      }
+      {
+        float const x_82 = x_7.zero;
+        float const x_84 = x_5.x_GLF_uniform_float_values.arr[0].el;
+        if ((x_82 > x_84)) {
+        } else {
+          break;
+        }
+      }
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_5 [[buffer(1)]], constant buf2& x_7 [[buffer(2)]], constant buf0& x_10 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, x_7, x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-infinite-loops/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-infinite-loops/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..cb7829c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-infinite-loops/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,214 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 112
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_5 "x_5"
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "zero"
+               OpName %x_7 "x_7"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 1
+               OpDecorate %buf2 Block
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 2
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_5 = OpVariable %_ptr_Uniform_buf1 Uniform
+       %buf2 = OpTypeStruct %float
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+        %x_7 = OpVariable %_ptr_Uniform_buf2 Uniform
+        %int = OpTypeInt 32 1
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %22 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %28 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+       %true = OpConstantTrue %bool
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+        %100 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %22
+         %25 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %28
+         %32 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %33 = OpLoad %float %32
+         %34 = OpCompositeConstruct %v4float %33 %33 %33 %33
+               OpStore %x_GLF_color %34
+         %35 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0
+         %36 = OpLoad %float %35
+         %37 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %38 = OpLoad %float %37
+         %39 = OpFOrdGreaterThan %bool %36 %38
+               OpSelectionMerge %41 None
+               OpBranchConditional %39 %42 %43
+         %42 = OpLabel
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_1
+         %50 = OpLoad %float %49
+         %51 = OpCompositeConstruct %v4float %50 %50 %50 %50
+               OpStore %x_GLF_color %51
+               OpBranch %46
+         %46 = OpLabel
+               OpSelectionMerge %53 None
+               OpBranchConditional %true %54 %55
+         %54 = OpLabel
+               OpBranch %53
+         %55 = OpLabel
+               OpBranch %45
+         %53 = OpLabel
+               OpBranch %44
+         %45 = OpLabel
+               OpBranch %41
+         %43 = OpLabel
+               OpBranch %56
+         %56 = OpLabel
+               OpLoopMerge %57 %58 None
+               OpBranch %59
+         %59 = OpLabel
+               OpBranch %60
+         %60 = OpLabel
+               OpLoopMerge %61 %62 None
+               OpBranch %63
+         %63 = OpLabel
+               OpSelectionMerge %64 None
+               OpBranchConditional %true %65 %66
+         %65 = OpLabel
+               OpBranch %64
+         %66 = OpLabel
+               OpBranch %61
+         %64 = OpLabel
+         %68 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %69 = OpLoad %int %68
+               OpStore %i %69
+               OpBranch %70
+         %70 = OpLabel
+               OpLoopMerge %71 %72 None
+               OpBranch %73
+         %73 = OpLabel
+         %74 = OpLoad %int %i
+         %75 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %76 = OpLoad %int %75
+         %77 = OpSLessThan %bool %74 %76
+               OpSelectionMerge %78 None
+               OpBranchConditional %77 %79 %80
+         %79 = OpLabel
+               OpBranch %78
+         %80 = OpLabel
+               OpBranch %71
+         %78 = OpLabel
+         %81 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_1
+         %82 = OpLoad %float %81
+         %83 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %84 = OpLoad %float %83
+         %85 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %86 = OpLoad %float %85
+         %87 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_1
+         %88 = OpLoad %float %87
+         %89 = OpCompositeConstruct %v4float %82 %84 %86 %88
+               OpStore %x_GLF_color %89
+               OpBranch %72
+         %72 = OpLabel
+         %90 = OpLoad %int %i
+         %91 = OpIAdd %int %90 %int_1
+               OpStore %i %91
+               OpBranch %70
+         %71 = OpLabel
+               OpBranch %61
+         %62 = OpLabel
+               OpBranch %60
+         %61 = OpLabel
+               OpBranch %58
+         %58 = OpLabel
+         %92 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0
+         %93 = OpLoad %float %92
+         %94 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %95 = OpLoad %float %94
+         %96 = OpFOrdGreaterThan %bool %93 %95
+               OpSelectionMerge %97 None
+               OpBranchConditional %96 %98 %99
+         %98 = OpLabel
+               OpBranch %97
+         %99 = OpLabel
+               OpBranch %57
+         %97 = OpLabel
+               OpBranch %56
+         %57 = OpLabel
+               OpBranch %41
+         %41 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %100
+%tint_symbol = OpFunctionParameter %main_out
+        %104 = OpLabel
+        %105 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %105
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %22
+        %107 = OpLabel
+        %108 = OpFunctionCall %void %main_1
+        %110 = OpLoad %v4float %x_GLF_color
+        %111 = OpCompositeConstruct %main_out %110
+        %109 = OpFunctionCall %void %tint_symbol_2 %111
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 46[%46] is not post dominated by the back-edge block 53[%53]
+  %53 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-infinite-loops/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-infinite-loops/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..4b28ce8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-infinite-loops/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,98 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[block]]
+struct buf2 {
+  zero : f32;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_5 : buf1;
+
+[[group(0), binding(2)]] var<uniform> x_7 : buf2;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+fn main_1() {
+  var i : i32;
+  let x_38 : f32 = x_5.x_GLF_uniform_float_values[0];
+  x_GLF_color = vec4<f32>(x_38, x_38, x_38, x_38);
+  let x_41 : f32 = x_7.zero;
+  let x_43 : f32 = x_5.x_GLF_uniform_float_values[0];
+  if ((x_41 > x_43)) {
+    loop {
+      let x_53 : f32 = x_5.x_GLF_uniform_float_values[1];
+      x_GLF_color = vec4<f32>(x_53, x_53, x_53, x_53);
+
+      continuing {
+        if (true) {
+        } else {
+          break;
+        }
+      }
+    }
+  } else {
+    loop {
+      loop {
+        if (true) {
+        } else {
+          break;
+        }
+        let x_13 : i32 = x_10.x_GLF_uniform_int_values[1];
+        i = x_13;
+        loop {
+          let x_14 : i32 = i;
+          let x_15 : i32 = x_10.x_GLF_uniform_int_values[0];
+          if ((x_14 < x_15)) {
+          } else {
+            break;
+          }
+          let x_73 : f32 = x_5.x_GLF_uniform_float_values[1];
+          let x_75 : f32 = x_5.x_GLF_uniform_float_values[0];
+          let x_77 : f32 = x_5.x_GLF_uniform_float_values[0];
+          let x_79 : f32 = x_5.x_GLF_uniform_float_values[1];
+          x_GLF_color = vec4<f32>(x_73, x_75, x_77, x_79);
+
+          continuing {
+            let x_16 : i32 = i;
+            i = (x_16 + 1);
+          }
+        }
+        break;
+      }
+
+      continuing {
+        let x_82 : f32 = x_7.zero;
+        let x_84 : f32 = x_5.x_GLF_uniform_float_values[0];
+        if ((x_82 > x_84)) {
+        } else {
+          break;
+        }
+      }
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-infinite-loops/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-infinite-loops/0-opt.wgsl
new file mode 100644
index 0000000..4b28ce8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-infinite-loops/0-opt.wgsl
@@ -0,0 +1,98 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[block]]
+struct buf2 {
+  zero : f32;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_5 : buf1;
+
+[[group(0), binding(2)]] var<uniform> x_7 : buf2;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+fn main_1() {
+  var i : i32;
+  let x_38 : f32 = x_5.x_GLF_uniform_float_values[0];
+  x_GLF_color = vec4<f32>(x_38, x_38, x_38, x_38);
+  let x_41 : f32 = x_7.zero;
+  let x_43 : f32 = x_5.x_GLF_uniform_float_values[0];
+  if ((x_41 > x_43)) {
+    loop {
+      let x_53 : f32 = x_5.x_GLF_uniform_float_values[1];
+      x_GLF_color = vec4<f32>(x_53, x_53, x_53, x_53);
+
+      continuing {
+        if (true) {
+        } else {
+          break;
+        }
+      }
+    }
+  } else {
+    loop {
+      loop {
+        if (true) {
+        } else {
+          break;
+        }
+        let x_13 : i32 = x_10.x_GLF_uniform_int_values[1];
+        i = x_13;
+        loop {
+          let x_14 : i32 = i;
+          let x_15 : i32 = x_10.x_GLF_uniform_int_values[0];
+          if ((x_14 < x_15)) {
+          } else {
+            break;
+          }
+          let x_73 : f32 = x_5.x_GLF_uniform_float_values[1];
+          let x_75 : f32 = x_5.x_GLF_uniform_float_values[0];
+          let x_77 : f32 = x_5.x_GLF_uniform_float_values[0];
+          let x_79 : f32 = x_5.x_GLF_uniform_float_values[1];
+          x_GLF_color = vec4<f32>(x_73, x_75, x_77, x_79);
+
+          continuing {
+            let x_16 : i32 = i;
+            i = (x_16 + 1);
+          }
+        }
+        break;
+      }
+
+      continuing {
+        let x_82 : f32 = x_7.zero;
+        let x_84 : f32 = x_5.x_GLF_uniform_float_values[0];
+        if ((x_82 > x_84)) {
+        } else {
+          break;
+        }
+      }
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
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
new file mode 100755
index 0000000..94afa1b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-infinite-loops/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,95 @@
+SKIP: FAILED
+
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_5 : register(b1, space0) {
+  uint4 x_5[2];
+};
+cbuffer cbuffer_x_7 : register(b2, space0) {
+  uint4 x_7[1];
+};
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[2];
+};
+
+void main_1() {
+  int i = 0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_38 = asfloat(x_5[scalar_offset / 4][scalar_offset % 4]);
+  x_GLF_color = float4(x_38, x_38, x_38, x_38);
+  const float x_41 = asfloat(x_7[0].x);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_43 = asfloat(x_5[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_41 > x_43)) {
+    while (true) {
+      const float x_53 = asfloat(x_5[1].x);
+      x_GLF_color = float4(x_53, x_53, x_53, x_53);
+      {
+        if (true) {
+        } else {
+          break;
+        }
+      }
+    }
+  } else {
+    while (true) {
+      while (true) {
+        if (true) {
+        } else {
+          break;
+        }
+        const int x_13 = asint(x_10[1].x);
+        i = x_13;
+        while (true) {
+          const int x_14 = i;
+          const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+          const int x_15 = asint(x_10[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+          if ((x_14 < x_15)) {
+          } else {
+            break;
+          }
+          const float x_73 = asfloat(x_5[1].x);
+          const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+          const float x_75 = asfloat(x_5[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+          const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+          const float x_77 = asfloat(x_5[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+          const float x_79 = asfloat(x_5[1].x);
+          x_GLF_color = float4(x_73, x_75, x_77, x_79);
+          {
+            i = (i + 1);
+          }
+        }
+        break;
+      }
+      {
+        const float x_82 = asfloat(x_7[0].x);
+        const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+        const float x_84 = asfloat(x_5[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+        if ((x_82 > x_84)) {
+        } else {
+          break;
+        }
+      }
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
+error: validation errors
+T:\tmp\u4dc.0:82: error: Loop must have break.
+Validation failed.
+
+
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-infinite-loops/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-infinite-loops/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..126ce92
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-infinite-loops/0-opt.wgsl.expected.msl
@@ -0,0 +1,99 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct buf2 {
+  /* 0x0000 */ float zero;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_5, constant buf2& x_7, constant buf0& x_10, thread float4* const tint_symbol_4) {
+  int i = 0;
+  float const x_38 = x_5.x_GLF_uniform_float_values.arr[0].el;
+  *(tint_symbol_4) = float4(x_38, x_38, x_38, x_38);
+  float const x_41 = x_7.zero;
+  float const x_43 = x_5.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_41 > x_43)) {
+    while (true) {
+      float const x_53 = x_5.x_GLF_uniform_float_values.arr[1].el;
+      *(tint_symbol_4) = float4(x_53, x_53, x_53, x_53);
+      {
+        if (true) {
+        } else {
+          break;
+        }
+      }
+    }
+  } else {
+    while (true) {
+      while (true) {
+        if (true) {
+        } else {
+          break;
+        }
+        int const x_13 = x_10.x_GLF_uniform_int_values.arr[1].el;
+        i = x_13;
+        while (true) {
+          int const x_14 = i;
+          int const x_15 = x_10.x_GLF_uniform_int_values.arr[0].el;
+          if ((x_14 < x_15)) {
+          } else {
+            break;
+          }
+          float const x_73 = x_5.x_GLF_uniform_float_values.arr[1].el;
+          float const x_75 = x_5.x_GLF_uniform_float_values.arr[0].el;
+          float const x_77 = x_5.x_GLF_uniform_float_values.arr[0].el;
+          float const x_79 = x_5.x_GLF_uniform_float_values.arr[1].el;
+          *(tint_symbol_4) = float4(x_73, x_75, x_77, x_79);
+          {
+            int const x_16 = i;
+            i = (x_16 + 1);
+          }
+        }
+        break;
+      }
+      {
+        float const x_82 = x_7.zero;
+        float const x_84 = x_5.x_GLF_uniform_float_values.arr[0].el;
+        if ((x_82 > x_84)) {
+        } else {
+          break;
+        }
+      }
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_5 [[buffer(1)]], constant buf2& x_7 [[buffer(2)]], constant buf0& x_10 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, x_7, x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-infinite-loops/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-infinite-loops/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..cb7829c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-infinite-loops/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,214 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 112
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_5 "x_5"
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "zero"
+               OpName %x_7 "x_7"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 1
+               OpDecorate %buf2 Block
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 2
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_5 = OpVariable %_ptr_Uniform_buf1 Uniform
+       %buf2 = OpTypeStruct %float
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+        %x_7 = OpVariable %_ptr_Uniform_buf2 Uniform
+        %int = OpTypeInt 32 1
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %22 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %28 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+       %true = OpConstantTrue %bool
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+        %100 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %22
+         %25 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %28
+         %32 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %33 = OpLoad %float %32
+         %34 = OpCompositeConstruct %v4float %33 %33 %33 %33
+               OpStore %x_GLF_color %34
+         %35 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0
+         %36 = OpLoad %float %35
+         %37 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %38 = OpLoad %float %37
+         %39 = OpFOrdGreaterThan %bool %36 %38
+               OpSelectionMerge %41 None
+               OpBranchConditional %39 %42 %43
+         %42 = OpLabel
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_1
+         %50 = OpLoad %float %49
+         %51 = OpCompositeConstruct %v4float %50 %50 %50 %50
+               OpStore %x_GLF_color %51
+               OpBranch %46
+         %46 = OpLabel
+               OpSelectionMerge %53 None
+               OpBranchConditional %true %54 %55
+         %54 = OpLabel
+               OpBranch %53
+         %55 = OpLabel
+               OpBranch %45
+         %53 = OpLabel
+               OpBranch %44
+         %45 = OpLabel
+               OpBranch %41
+         %43 = OpLabel
+               OpBranch %56
+         %56 = OpLabel
+               OpLoopMerge %57 %58 None
+               OpBranch %59
+         %59 = OpLabel
+               OpBranch %60
+         %60 = OpLabel
+               OpLoopMerge %61 %62 None
+               OpBranch %63
+         %63 = OpLabel
+               OpSelectionMerge %64 None
+               OpBranchConditional %true %65 %66
+         %65 = OpLabel
+               OpBranch %64
+         %66 = OpLabel
+               OpBranch %61
+         %64 = OpLabel
+         %68 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %69 = OpLoad %int %68
+               OpStore %i %69
+               OpBranch %70
+         %70 = OpLabel
+               OpLoopMerge %71 %72 None
+               OpBranch %73
+         %73 = OpLabel
+         %74 = OpLoad %int %i
+         %75 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %76 = OpLoad %int %75
+         %77 = OpSLessThan %bool %74 %76
+               OpSelectionMerge %78 None
+               OpBranchConditional %77 %79 %80
+         %79 = OpLabel
+               OpBranch %78
+         %80 = OpLabel
+               OpBranch %71
+         %78 = OpLabel
+         %81 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_1
+         %82 = OpLoad %float %81
+         %83 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %84 = OpLoad %float %83
+         %85 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %86 = OpLoad %float %85
+         %87 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_1
+         %88 = OpLoad %float %87
+         %89 = OpCompositeConstruct %v4float %82 %84 %86 %88
+               OpStore %x_GLF_color %89
+               OpBranch %72
+         %72 = OpLabel
+         %90 = OpLoad %int %i
+         %91 = OpIAdd %int %90 %int_1
+               OpStore %i %91
+               OpBranch %70
+         %71 = OpLabel
+               OpBranch %61
+         %62 = OpLabel
+               OpBranch %60
+         %61 = OpLabel
+               OpBranch %58
+         %58 = OpLabel
+         %92 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0
+         %93 = OpLoad %float %92
+         %94 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %int_0
+         %95 = OpLoad %float %94
+         %96 = OpFOrdGreaterThan %bool %93 %95
+               OpSelectionMerge %97 None
+               OpBranchConditional %96 %98 %99
+         %98 = OpLabel
+               OpBranch %97
+         %99 = OpLabel
+               OpBranch %57
+         %97 = OpLabel
+               OpBranch %56
+         %57 = OpLabel
+               OpBranch %41
+         %41 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %100
+%tint_symbol = OpFunctionParameter %main_out
+        %104 = OpLabel
+        %105 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %105
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %22
+        %107 = OpLabel
+        %108 = OpFunctionCall %void %main_1
+        %110 = OpLoad %v4float %x_GLF_color
+        %111 = OpCompositeConstruct %main_out %110
+        %109 = OpFunctionCall %void %tint_symbol_2 %111
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 46[%46] is not post dominated by the back-edge block 53[%53]
+  %53 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-infinite-loops/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-infinite-loops/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..4b28ce8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-tail-duplicator-infinite-loops/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,98 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[block]]
+struct buf2 {
+  zero : f32;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_5 : buf1;
+
+[[group(0), binding(2)]] var<uniform> x_7 : buf2;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+fn main_1() {
+  var i : i32;
+  let x_38 : f32 = x_5.x_GLF_uniform_float_values[0];
+  x_GLF_color = vec4<f32>(x_38, x_38, x_38, x_38);
+  let x_41 : f32 = x_7.zero;
+  let x_43 : f32 = x_5.x_GLF_uniform_float_values[0];
+  if ((x_41 > x_43)) {
+    loop {
+      let x_53 : f32 = x_5.x_GLF_uniform_float_values[1];
+      x_GLF_color = vec4<f32>(x_53, x_53, x_53, x_53);
+
+      continuing {
+        if (true) {
+        } else {
+          break;
+        }
+      }
+    }
+  } else {
+    loop {
+      loop {
+        if (true) {
+        } else {
+          break;
+        }
+        let x_13 : i32 = x_10.x_GLF_uniform_int_values[1];
+        i = x_13;
+        loop {
+          let x_14 : i32 = i;
+          let x_15 : i32 = x_10.x_GLF_uniform_int_values[0];
+          if ((x_14 < x_15)) {
+          } else {
+            break;
+          }
+          let x_73 : f32 = x_5.x_GLF_uniform_float_values[1];
+          let x_75 : f32 = x_5.x_GLF_uniform_float_values[0];
+          let x_77 : f32 = x_5.x_GLF_uniform_float_values[0];
+          let x_79 : f32 = x_5.x_GLF_uniform_float_values[1];
+          x_GLF_color = vec4<f32>(x_73, x_75, x_77, x_79);
+
+          continuing {
+            let x_16 : i32 = i;
+            i = (x_16 + 1);
+          }
+        }
+        break;
+      }
+
+      continuing {
+        let x_82 : f32 = x_7.zero;
+        let x_84 : f32 = x_5.x_GLF_uniform_float_values[0];
+        if ((x_82 > x_84)) {
+        } else {
+          break;
+        }
+      }
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-dfdx-cos/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-dfdx-cos/0-opt.spvasm
new file mode 100644
index 0000000..661ac09
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-dfdx-cos/0-opt.spvasm
@@ -0,0 +1,76 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %b "b"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "two"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_2 = OpConstant %float 2
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%float_1_89999998 = OpConstant %float 1.89999998
+       %bool = OpTypeBool
+%float_2_0999999 = OpConstant %float 2.0999999
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %29 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %30 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %10
+         %31 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function
+          %b = OpVariable %_ptr_Function_float Function
+         %32 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %33 = OpLoad %float %32
+         %34 = OpExtInst %float %1 Cos %33
+         %35 = OpDPdx %float %34
+               OpStore %a %35
+         %36 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %37 = OpLoad %float %36
+         %38 = OpLoad %float %a
+         %39 = OpExtInst %float %1 FMix %float_2 %37 %38
+               OpStore %b %39
+         %40 = OpLoad %float %b
+         %41 = OpFOrdGreaterThanEqual %bool %40 %float_1_89999998
+         %42 = OpLoad %float %b
+         %43 = OpFOrdLessThanEqual %bool %42 %float_2_0999999
+         %44 = OpLogicalAnd %bool %41 %43
+               OpSelectionMerge %45 None
+               OpBranchConditional %44 %46 %47
+         %46 = OpLabel
+               OpStore %_GLF_color %29
+               OpBranch %45
+         %47 = OpLabel
+               OpStore %_GLF_color %30
+               OpBranch %45
+         %45 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-dfdx-cos/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-dfdx-cos/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..f5d4020
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-dfdx-cos/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,43 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+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);
+
+void main_1() {
+  float a = 0.0f;
+  float b = 0.0f;
+  const float x_33 = gl_FragCoord.x;
+  a = ddx(cos(x_33));
+  const float x_37 = asfloat(x_8[0].x);
+  b = lerp(2.0f, x_37, a);
+  bool tint_tmp = (b >= 1.899999976f);
+  if (tint_tmp) {
+    tint_tmp = (b <= 2.099999905f);
+  }
+  if ((tint_tmp)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-dfdx-cos/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-dfdx-cos/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..31f4571
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-dfdx-cos/0-opt.spvasm.expected.msl
@@ -0,0 +1,41 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float two;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float a = 0.0f;
+  float b = 0.0f;
+  float const x_33 = (*(tint_symbol_5)).x;
+  a = dfdx(cos(x_33));
+  float const x_37 = x_8.two;
+  float const x_38 = a;
+  b = mix(2.0f, x_37, x_38);
+  float const x_40 = b;
+  float const x_42 = b;
+  if (((x_40 >= 1.899999976f) && (x_42 <= 2.099999905f))) {
+    *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_6) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_8, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-dfdx-cos/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-dfdx-cos/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..7858785
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-dfdx-cos/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,116 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 66
+; Schema: 0
+               OpCapability Shader
+         %29 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "two"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %20 = OpConstantNull %float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_2 = OpConstant %float 2
+%float_1_89999998 = OpConstant %float 1.89999998
+       %bool = OpTypeBool
+%float_2_0999999 = OpConstant %float 2.0999999
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %51 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %52 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %53 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function %20
+          %b = OpVariable %_ptr_Function_float Function %20
+         %25 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %26 = OpLoad %float %25
+         %28 = OpExtInst %float %29 Cos %26
+         %27 = OpDPdx %float %28
+               OpStore %a %27
+         %31 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0
+         %32 = OpLoad %float %31
+         %33 = OpLoad %float %a
+         %34 = OpExtInst %float %29 FMix %float_2 %32 %33
+               OpStore %b %34
+         %36 = OpLoad %float %b
+         %37 = OpLoad %float %b
+         %39 = OpFOrdGreaterThanEqual %bool %36 %float_1_89999998
+               OpSelectionMerge %41 None
+               OpBranchConditional %39 %42 %41
+         %42 = OpLabel
+         %44 = OpFOrdLessThanEqual %bool %37 %float_2_0999999
+               OpBranch %41
+         %41 = OpLabel
+         %45 = OpPhi %bool %39 %17 %44 %42
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %48
+         %47 = OpLabel
+               OpStore %x_GLF_color %51
+               OpBranch %46
+         %48 = OpLabel
+               OpStore %x_GLF_color %52
+               OpBranch %46
+         %46 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %53
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %57 = OpLabel
+         %58 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %58
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %60 = OpLabel
+         %61 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %61
+         %62 = OpFunctionCall %void %main_1
+         %64 = OpLoad %v4float %x_GLF_color
+         %65 = OpCompositeConstruct %main_out %64
+         %63 = OpFunctionCall %void %tint_symbol_3 %65
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-dfdx-cos/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-dfdx-cos/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..7165a35
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-dfdx-cos/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,40 @@
+[[block]]
+struct buf0 {
+  two : f32;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : f32;
+  var b : f32;
+  let x_33 : f32 = gl_FragCoord.x;
+  a = dpdx(cos(x_33));
+  let x_37 : f32 = x_8.two;
+  let x_38 : f32 = a;
+  b = mix(2.0, x_37, x_38);
+  let x_40 : f32 = b;
+  let x_42 : f32 = b;
+  if (((x_40 >= 1.899999976) && (x_42 <= 2.099999905))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-dfdx-cos/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-dfdx-cos/0-opt.wgsl
new file mode 100644
index 0000000..7165a35
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-dfdx-cos/0-opt.wgsl
@@ -0,0 +1,40 @@
+[[block]]
+struct buf0 {
+  two : f32;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : f32;
+  var b : f32;
+  let x_33 : f32 = gl_FragCoord.x;
+  a = dpdx(cos(x_33));
+  let x_37 : f32 = x_8.two;
+  let x_38 : f32 = a;
+  b = mix(2.0, x_37, x_38);
+  let x_40 : f32 = b;
+  let x_42 : f32 = b;
+  if (((x_40 >= 1.899999976) && (x_42 <= 2.099999905))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-dfdx-cos/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-dfdx-cos/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..f5d4020
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-dfdx-cos/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,43 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+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);
+
+void main_1() {
+  float a = 0.0f;
+  float b = 0.0f;
+  const float x_33 = gl_FragCoord.x;
+  a = ddx(cos(x_33));
+  const float x_37 = asfloat(x_8[0].x);
+  b = lerp(2.0f, x_37, a);
+  bool tint_tmp = (b >= 1.899999976f);
+  if (tint_tmp) {
+    tint_tmp = (b <= 2.099999905f);
+  }
+  if ((tint_tmp)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-dfdx-cos/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-dfdx-cos/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..31f4571
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-dfdx-cos/0-opt.wgsl.expected.msl
@@ -0,0 +1,41 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float two;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float a = 0.0f;
+  float b = 0.0f;
+  float const x_33 = (*(tint_symbol_5)).x;
+  a = dfdx(cos(x_33));
+  float const x_37 = x_8.two;
+  float const x_38 = a;
+  b = mix(2.0f, x_37, x_38);
+  float const x_40 = b;
+  float const x_42 = b;
+  if (((x_40 >= 1.899999976f) && (x_42 <= 2.099999905f))) {
+    *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_6) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_8, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-dfdx-cos/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-dfdx-cos/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..7858785
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-dfdx-cos/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,116 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 66
+; Schema: 0
+               OpCapability Shader
+         %29 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "two"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %20 = OpConstantNull %float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_2 = OpConstant %float 2
+%float_1_89999998 = OpConstant %float 1.89999998
+       %bool = OpTypeBool
+%float_2_0999999 = OpConstant %float 2.0999999
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %51 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %52 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %53 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function %20
+          %b = OpVariable %_ptr_Function_float Function %20
+         %25 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %26 = OpLoad %float %25
+         %28 = OpExtInst %float %29 Cos %26
+         %27 = OpDPdx %float %28
+               OpStore %a %27
+         %31 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0
+         %32 = OpLoad %float %31
+         %33 = OpLoad %float %a
+         %34 = OpExtInst %float %29 FMix %float_2 %32 %33
+               OpStore %b %34
+         %36 = OpLoad %float %b
+         %37 = OpLoad %float %b
+         %39 = OpFOrdGreaterThanEqual %bool %36 %float_1_89999998
+               OpSelectionMerge %41 None
+               OpBranchConditional %39 %42 %41
+         %42 = OpLabel
+         %44 = OpFOrdLessThanEqual %bool %37 %float_2_0999999
+               OpBranch %41
+         %41 = OpLabel
+         %45 = OpPhi %bool %39 %17 %44 %42
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %48
+         %47 = OpLabel
+               OpStore %x_GLF_color %51
+               OpBranch %46
+         %48 = OpLabel
+               OpStore %x_GLF_color %52
+               OpBranch %46
+         %46 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %53
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %57 = OpLabel
+         %58 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %58
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %60 = OpLabel
+         %61 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %61
+         %62 = OpFunctionCall %void %main_1
+         %64 = OpLoad %v4float %x_GLF_color
+         %65 = OpCompositeConstruct %main_out %64
+         %63 = OpFunctionCall %void %tint_symbol_3 %65
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-dfdx-cos/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-dfdx-cos/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..7165a35
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-dfdx-cos/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,40 @@
+[[block]]
+struct buf0 {
+  two : f32;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : f32;
+  var b : f32;
+  let x_33 : f32 = gl_FragCoord.x;
+  a = dpdx(cos(x_33));
+  let x_37 : f32 = x_8.two;
+  let x_38 : f32 = a;
+  b = mix(2.0, x_37, x_38);
+  let x_40 : f32 = b;
+  let x_42 : f32 = b;
+  if (((x_40 >= 1.899999976) && (x_42 <= 2.099999905))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-inst-combine-compares-struct-array-clamp-function-cal/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-inst-combine-compares-struct-array-clamp-function-cal/0-opt.spvasm
new file mode 100644
index 0000000..14facbb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-inst-combine-compares-struct-array-clamp-function-cal/0-opt.spvasm
@@ -0,0 +1,274 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %S "S"
+               OpMemberName %S 0 "data"
+               OpName %func_struct_S_i11_ "func(struct-S-i11;"
+               OpName %s "s"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "v1"
+               OpName %_ ""
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %i "i"
+               OpName %arr "arr"
+               OpName %i_0 "i"
+               OpName %param "param"
+               OpName %j "j"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_arr_int_uint_5 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+          %S = OpTypeStruct %int
+%_ptr_Function_S = OpTypePointer Function %S
+         %21 = OpTypeFunction %void %_ptr_Function_S
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+     %uint_5 = OpConstant %uint 5
+%_arr_int_uint_5 = OpTypeArray %int %uint_5
+       %buf0 = OpTypeStruct %_arr_int_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_2 = OpConstant %int 2
+      %int_1 = OpConstant %int 1
+     %uint_3 = OpConstant %uint 3
+%_arr_S_uint_3 = OpTypeArray %S %uint_3
+%_ptr_Function__arr_S_uint_3 = OpTypePointer Function %_arr_S_uint_3
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %18
+         %44 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+        %arr = OpVariable %_ptr_Function__arr_S_uint_3 Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_S Function
+          %j = OpVariable %_ptr_Function_int Function
+         %45 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %46 = OpLoad %int %45
+               OpStore %i %46
+               OpBranch %47
+         %47 = OpLabel
+               OpLoopMerge %48 %49 None
+               OpBranch %50
+         %50 = OpLabel
+         %51 = OpLoad %int %i
+         %52 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %53 = OpLoad %int %52
+         %54 = OpSLessThan %bool %51 %53
+               OpBranchConditional %54 %55 %48
+         %55 = OpLabel
+         %56 = OpLoad %int %i
+         %57 = OpLoad %int %i
+         %58 = OpAccessChain %_ptr_Function_int %arr %56 %int_0
+               OpStore %58 %57
+               OpBranch %49
+         %49 = OpLabel
+         %59 = OpLoad %int %i
+         %60 = OpIAdd %int %59 %int_1
+               OpStore %i %60
+               OpBranch %47
+         %48 = OpLabel
+         %61 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %62 = OpLoad %int %61
+               OpStore %i_0 %62
+               OpBranch %63
+         %63 = OpLabel
+               OpLoopMerge %64 %65 None
+               OpBranch %66
+         %66 = OpLabel
+         %67 = OpLoad %int %i_0
+         %68 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %69 = OpLoad %int %68
+         %70 = OpSLessThan %bool %67 %69
+               OpBranchConditional %70 %71 %64
+         %71 = OpLabel
+         %72 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %73 = OpLoad %float %72
+         %74 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %75 = OpLoad %float %74
+         %76 = OpFOrdGreaterThan %bool %73 %75
+               OpSelectionMerge %77 None
+               OpBranchConditional %76 %78 %77
+         %78 = OpLabel
+               OpBranch %64
+         %77 = OpLabel
+         %79 = OpLoad %int %i_0
+         %80 = OpAccessChain %_ptr_Function_int %arr %79 %int_0
+         %81 = OpLoad %int %80
+         %82 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %83 = OpLoad %int %82
+         %84 = OpIEqual %bool %81 %83
+               OpSelectionMerge %85 None
+               OpBranchConditional %84 %86 %87
+         %86 = OpLabel
+         %88 = OpLoad %int %i_0
+         %89 = OpExtInst %int %1 SClamp %88 %int_0 %int_3
+         %90 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_3
+         %91 = OpLoad %int %90
+         %92 = OpAccessChain %_ptr_Function_int %arr %89 %int_0
+               OpStore %92 %91
+         %93 = OpAccessChain %_ptr_Function_S %arr %int_2
+         %94 = OpLoad %S %93
+               OpStore %param %94
+         %95 = OpFunctionCall %void %func_struct_S_i11_ %param
+         %96 = OpLoad %S %param
+         %97 = OpAccessChain %_ptr_Function_S %arr %int_2
+               OpStore %97 %96
+               OpBranch %85
+         %87 = OpLabel
+         %98 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %99 = OpLoad %int %98
+               OpStore %j %99
+               OpBranch %100
+        %100 = OpLabel
+               OpLoopMerge %101 %102 None
+               OpBranch %103
+        %103 = OpLabel
+        %104 = OpLoad %int %j
+        %105 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %106 = OpLoad %int %105
+        %107 = OpSLessThan %bool %104 %106
+               OpBranchConditional %107 %108 %101
+        %108 = OpLabel
+        %109 = OpLoad %int %j
+        %110 = OpAccessChain %_ptr_Function_int %arr %109 %int_0
+        %111 = OpLoad %int %110
+        %112 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_4
+        %113 = OpLoad %int %112
+        %114 = OpSGreaterThan %bool %111 %113
+               OpSelectionMerge %115 None
+               OpBranchConditional %114 %116 %115
+        %116 = OpLabel
+               OpKill
+        %115 = OpLabel
+               OpBranch %102
+        %102 = OpLabel
+        %117 = OpLoad %int %j
+        %118 = OpIAdd %int %117 %int_1
+               OpStore %j %118
+               OpBranch %100
+        %101 = OpLabel
+               OpBranch %85
+         %85 = OpLabel
+               OpBranch %65
+         %65 = OpLabel
+        %119 = OpLoad %int %i_0
+        %120 = OpIAdd %int %119 %int_1
+               OpStore %i_0 %120
+               OpBranch %63
+         %64 = OpLabel
+        %121 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+        %122 = OpLoad %int %121
+        %123 = OpAccessChain %_ptr_Function_int %arr %122 %int_0
+        %124 = OpLoad %int %123
+        %125 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+        %126 = OpLoad %int %125
+        %127 = OpIEqual %bool %124 %126
+               OpSelectionMerge %128 None
+               OpBranchConditional %127 %129 %128
+        %129 = OpLabel
+        %130 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+        %131 = OpLoad %int %130
+        %132 = OpAccessChain %_ptr_Function_int %arr %131 %int_0
+        %133 = OpLoad %int %132
+        %134 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_3
+        %135 = OpLoad %int %134
+        %136 = OpIEqual %bool %133 %135
+               OpBranch %128
+        %128 = OpLabel
+        %137 = OpPhi %bool %127 %64 %136 %129
+               OpSelectionMerge %138 None
+               OpBranchConditional %137 %139 %138
+        %139 = OpLabel
+        %140 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_3
+        %141 = OpLoad %int %140
+        %142 = OpAccessChain %_ptr_Function_int %arr %141 %int_0
+        %143 = OpLoad %int %142
+        %144 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+        %145 = OpLoad %int %144
+        %146 = OpIEqual %bool %143 %145
+               OpBranch %138
+        %138 = OpLabel
+        %147 = OpPhi %bool %137 %128 %146 %139
+               OpSelectionMerge %148 None
+               OpBranchConditional %147 %149 %150
+        %149 = OpLabel
+        %151 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+        %152 = OpLoad %int %151
+        %153 = OpConvertSToF %float %152
+        %154 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+        %155 = OpLoad %int %154
+        %156 = OpConvertSToF %float %155
+        %157 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+        %158 = OpLoad %int %157
+        %159 = OpConvertSToF %float %158
+        %160 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+        %161 = OpLoad %int %160
+        %162 = OpConvertSToF %float %161
+        %163 = OpCompositeConstruct %v4float %153 %156 %159 %162
+               OpStore %_GLF_color %163
+               OpBranch %148
+        %150 = OpLabel
+        %164 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+        %165 = OpLoad %int %164
+        %166 = OpConvertSToF %float %165
+        %167 = OpCompositeConstruct %v4float %166 %166 %166 %166
+               OpStore %_GLF_color %167
+               OpBranch %148
+        %148 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%func_struct_S_i11_ = OpFunction %void None %21
+          %s = OpFunctionParameter %_ptr_Function_S
+        %168 = OpLabel
+               OpBranch %169
+        %169 = OpLabel
+               OpLoopMerge %170 %171 None
+               OpBranch %172
+        %172 = OpLabel
+        %173 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+        %174 = OpLoad %float %173
+        %175 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+        %176 = OpLoad %float %175
+        %177 = OpFOrdGreaterThan %bool %174 %176
+               OpBranchConditional %177 %178 %170
+        %178 = OpLabel
+               OpReturn
+        %171 = OpLabel
+               OpBranch %169
+        %170 = OpLabel
+        %179 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+        %180 = OpLoad %int %179
+        %181 = OpAccessChain %_ptr_Function_int %s %int_0
+               OpStore %181 %180
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-inst-combine-compares-struct-array-clamp-function-cal/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-inst-combine-compares-struct-array-clamp-function-cal/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..afea7c2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-inst-combine-compares-struct-array-clamp-function-cal/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,153 @@
+struct S {
+  int data;
+};
+
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[1];
+};
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[5];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void func_struct_S_i11_(inout S s) {
+  while (true) {
+    const float x_174 = asfloat(x_8[0].x);
+    const float x_176 = asfloat(x_8[0].y);
+    if ((x_174 > x_176)) {
+    } else {
+      break;
+    }
+    return;
+  }
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_180 = asint(x_10[scalar_offset / 4][scalar_offset % 4]);
+  s.data = x_180;
+  return;
+}
+
+void main_1() {
+  int i = 0;
+  S arr[3] = (S[3])0;
+  int i_1 = 0;
+  S param = (S)0;
+  int j = 0;
+  bool x_136 = false;
+  bool x_146 = false;
+  bool x_137_phi = false;
+  bool x_147_phi = false;
+  const int x_46 = asint(x_10[2].x);
+  i = x_46;
+  while (true) {
+    const int x_51 = i;
+    const int x_53 = asint(x_10[1].x);
+    if ((x_51 < x_53)) {
+    } else {
+      break;
+    }
+    arr[i].data = i;
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_62 = asint(x_10[2].x);
+  i_1 = x_62;
+  while (true) {
+    const int x_67 = i_1;
+    const int x_69 = asint(x_10[1].x);
+    if ((x_67 < x_69)) {
+    } else {
+      break;
+    }
+    const float x_73 = asfloat(x_8[0].x);
+    const float x_75 = asfloat(x_8[0].y);
+    if ((x_73 > x_75)) {
+      break;
+    }
+    const int x_81 = arr[i_1].data;
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_83 = asint(x_10[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    if ((x_81 == x_83)) {
+      const int x_88 = i_1;
+      const int x_91 = asint(x_10[3].x);
+      arr[clamp(x_88, 0, 3)].data = x_91;
+      const S x_94 = arr[2];
+      param = x_94;
+      func_struct_S_i11_(param);
+      arr[2] = param;
+    } else {
+      const int x_99 = asint(x_10[2].x);
+      j = x_99;
+      while (true) {
+        const int x_104 = j;
+        const int x_106 = asint(x_10[1].x);
+        if ((x_104 < x_106)) {
+        } else {
+          break;
+        }
+        const int x_111 = arr[j].data;
+        const int x_113 = asint(x_10[4].x);
+        if ((x_111 > x_113)) {
+          discard;
+        }
+        {
+          j = (j + 1);
+        }
+      }
+    }
+    {
+      i_1 = (i_1 + 1);
+    }
+  }
+  const int x_122 = asint(x_10[2].x);
+  const int x_124 = arr[x_122].data;
+  const int x_126 = asint(x_10[2].x);
+  const bool x_127 = (x_124 == x_126);
+  x_137_phi = x_127;
+  if (x_127) {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_131 = asint(x_10[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_133 = arr[x_131].data;
+    const int x_135 = asint(x_10[3].x);
+    x_136 = (x_133 == x_135);
+    x_137_phi = x_136;
+  }
+  const bool x_137 = x_137_phi;
+  x_147_phi = x_137;
+  if (x_137) {
+    const int x_141 = asint(x_10[3].x);
+    const int x_143 = arr[x_141].data;
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_145 = asint(x_10[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    x_146 = (x_143 == x_145);
+    x_147_phi = x_146;
+  }
+  if (x_147_phi) {
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_152 = asint(x_10[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const int x_155 = asint(x_10[2].x);
+    const int x_158 = asint(x_10[2].x);
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const int x_161 = asint(x_10[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    x_GLF_color = float4(float(x_152), float(x_155), float(x_158), float(x_161));
+  } else {
+    const int x_165 = asint(x_10[2].x);
+    const float x_166 = float(x_165);
+    x_GLF_color = float4(x_166, x_166, x_166, x_166);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-inst-combine-compares-struct-array-clamp-function-cal/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-inst-combine-compares-struct-array-clamp-function-cal/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..e3b232e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-inst-combine-compares-struct-array-clamp-function-cal/0-opt.spvasm.expected.msl
@@ -0,0 +1,168 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  int data;
+};
+struct buf1 {
+  /* 0x0000 */ packed_float2 v1;
+};
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[5];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_1 {
+  S arr[3];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void func_struct_S_i11_(constant buf1& x_8, constant buf0& x_10, thread S* const s) {
+  while (true) {
+    float const x_174 = x_8.v1.x;
+    float const x_176 = x_8.v1.y;
+    if ((x_174 > x_176)) {
+    } else {
+      break;
+    }
+    return;
+  }
+  int const x_180 = x_10.x_GLF_uniform_int_values.arr[0].el;
+  (*(s)).data = x_180;
+  return;
+}
+
+void main_1(constant buf0& x_10, constant buf1& x_8, thread float4* const tint_symbol_4) {
+  int i = 0;
+  tint_array_wrapper_1 arr = {};
+  int i_1 = 0;
+  S param = {};
+  int j = 0;
+  bool x_136 = false;
+  bool x_146 = false;
+  bool x_137_phi = false;
+  bool x_147_phi = false;
+  int const x_46 = x_10.x_GLF_uniform_int_values.arr[2].el;
+  i = x_46;
+  while (true) {
+    int const x_51 = i;
+    int const x_53 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    if ((x_51 < x_53)) {
+    } else {
+      break;
+    }
+    int const x_56 = i;
+    int const x_57 = i;
+    arr.arr[x_56].data = x_57;
+    {
+      int const x_59 = i;
+      i = (x_59 + 1);
+    }
+  }
+  int const x_62 = x_10.x_GLF_uniform_int_values.arr[2].el;
+  i_1 = x_62;
+  while (true) {
+    int const x_67 = i_1;
+    int const x_69 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    if ((x_67 < x_69)) {
+    } else {
+      break;
+    }
+    float const x_73 = x_8.v1.x;
+    float const x_75 = x_8.v1.y;
+    if ((x_73 > x_75)) {
+      break;
+    }
+    int const x_79 = i_1;
+    int const x_81 = arr.arr[x_79].data;
+    int const x_83 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_81 == x_83)) {
+      int const x_88 = i_1;
+      int const x_91 = x_10.x_GLF_uniform_int_values.arr[3].el;
+      arr.arr[clamp(x_88, 0, 3)].data = x_91;
+      S const x_94 = arr.arr[2];
+      param = x_94;
+      func_struct_S_i11_(x_8, x_10, &(param));
+      S const x_96 = param;
+      arr.arr[2] = x_96;
+    } else {
+      int const x_99 = x_10.x_GLF_uniform_int_values.arr[2].el;
+      j = x_99;
+      while (true) {
+        int const x_104 = j;
+        int const x_106 = x_10.x_GLF_uniform_int_values.arr[1].el;
+        if ((x_104 < x_106)) {
+        } else {
+          break;
+        }
+        int const x_109 = j;
+        int const x_111 = arr.arr[x_109].data;
+        int const x_113 = x_10.x_GLF_uniform_int_values.arr[4].el;
+        if ((x_111 > x_113)) {
+          discard_fragment();
+        }
+        {
+          int const x_117 = j;
+          j = (x_117 + 1);
+        }
+      }
+    }
+    {
+      int const x_119 = i_1;
+      i_1 = (x_119 + 1);
+    }
+  }
+  int const x_122 = x_10.x_GLF_uniform_int_values.arr[2].el;
+  int const x_124 = arr.arr[x_122].data;
+  int const x_126 = x_10.x_GLF_uniform_int_values.arr[2].el;
+  bool const x_127 = (x_124 == x_126);
+  x_137_phi = x_127;
+  if (x_127) {
+    int const x_131 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    int const x_133 = arr.arr[x_131].data;
+    int const x_135 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    x_136 = (x_133 == x_135);
+    x_137_phi = x_136;
+  }
+  bool const x_137 = x_137_phi;
+  x_147_phi = x_137;
+  if (x_137) {
+    int const x_141 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    int const x_143 = arr.arr[x_141].data;
+    int const x_145 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    x_146 = (x_143 == x_145);
+    x_147_phi = x_146;
+  }
+  bool const x_147 = x_147_phi;
+  if (x_147) {
+    int const x_152 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    int const x_155 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    int const x_158 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    int const x_161 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_152), float(x_155), float(x_158), float(x_161));
+  } else {
+    int const x_165 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    float const x_166 = float(x_165);
+    *(tint_symbol_4) = float4(x_166, x_166, x_166, x_166);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_10 [[buffer(0)]], constant buf1& x_8 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_10, x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-inst-combine-compares-struct-array-clamp-function-cal/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-inst-combine-compares-struct-array-clamp-function-cal/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..f707389
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-inst-combine-compares-struct-array-clamp-function-cal/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,350 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 218
+; Schema: 0
+               OpCapability Shader
+        %123 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "v1"
+               OpName %x_8 "x_8"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %S "S"
+               OpMemberName %S 0 "data"
+               OpName %func_struct_S_i11_ "func_struct_S_i11_"
+               OpName %s "s"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %arr "arr"
+               OpName %i_1 "i_1"
+               OpName %param "param"
+               OpName %j "j"
+               OpName %x_136 "x_136"
+               OpName %x_146 "x_146"
+               OpName %x_137_phi "x_137_phi"
+               OpName %x_147_phi "x_147_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_5 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %_arr_S_uint_3 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_int_uint_5 = OpTypeArray %int %uint_5
+       %buf0 = OpTypeStruct %_arr_int_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %16
+       %void = OpTypeVoid
+          %S = OpTypeStruct %int
+%_ptr_Function_S = OpTypePointer Function %S
+         %19 = OpTypeFunction %void %_ptr_Function_S
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_int = OpTypePointer Function %int
+         %49 = OpTypeFunction %void
+         %53 = OpConstantNull %int
+     %uint_3 = OpConstant %uint 3
+%_arr_S_uint_3 = OpTypeArray %S %uint_3
+%_ptr_Function__arr_S_uint_3 = OpTypePointer Function %_arr_S_uint_3
+         %58 = OpConstantNull %_arr_S_uint_3
+         %61 = OpConstantNull %S
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %65 = OpConstantNull %bool
+      %int_2 = OpConstant %int 2
+      %int_1 = OpConstant %int 1
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+   %main_out = OpTypeStruct %v4float
+        %206 = OpTypeFunction %void %main_out
+%func_struct_S_i11_ = OpFunction %void None %19
+          %s = OpFunctionParameter %_ptr_Function_S
+         %25 = OpLabel
+               OpBranch %26
+         %26 = OpLabel
+               OpLoopMerge %27 %28 None
+               OpBranch %29
+         %29 = OpLabel
+         %32 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+         %33 = OpLoad %float %32
+         %35 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+         %36 = OpLoad %float %35
+         %37 = OpFOrdGreaterThan %bool %33 %36
+               OpSelectionMerge %39 None
+               OpBranchConditional %37 %40 %41
+         %40 = OpLabel
+               OpBranch %39
+         %41 = OpLabel
+               OpBranch %27
+         %39 = OpLabel
+               OpReturn
+         %28 = OpLabel
+               OpBranch %26
+         %27 = OpLabel
+         %44 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %45 = OpLoad %int %44
+         %48 = OpAccessChain %_ptr_Function_int %s %uint_0
+               OpStore %48 %45
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %49
+         %51 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %53
+        %arr = OpVariable %_ptr_Function__arr_S_uint_3 Function %58
+        %i_1 = OpVariable %_ptr_Function_int Function %53
+      %param = OpVariable %_ptr_Function_S Function %61
+          %j = OpVariable %_ptr_Function_int Function %53
+      %x_136 = OpVariable %_ptr_Function_bool Function %65
+      %x_146 = OpVariable %_ptr_Function_bool Function %65
+  %x_137_phi = OpVariable %_ptr_Function_bool Function %65
+  %x_147_phi = OpVariable %_ptr_Function_bool Function %65
+         %70 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+         %71 = OpLoad %int %70
+               OpStore %i %71
+               OpBranch %72
+         %72 = OpLabel
+               OpLoopMerge %73 %74 None
+               OpBranch %75
+         %75 = OpLabel
+         %76 = OpLoad %int %i
+         %78 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %79 = OpLoad %int %78
+         %80 = OpSLessThan %bool %76 %79
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %83
+         %82 = OpLabel
+               OpBranch %81
+         %83 = OpLabel
+               OpBranch %73
+         %81 = OpLabel
+         %84 = OpLoad %int %i
+         %85 = OpLoad %int %i
+         %86 = OpAccessChain %_ptr_Function_int %arr %84 %uint_0
+               OpStore %86 %85
+               OpBranch %74
+         %74 = OpLabel
+         %87 = OpLoad %int %i
+         %88 = OpIAdd %int %87 %int_1
+               OpStore %i %88
+               OpBranch %72
+         %73 = OpLabel
+         %89 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+         %90 = OpLoad %int %89
+               OpStore %i_1 %90
+               OpBranch %91
+         %91 = OpLabel
+               OpLoopMerge %92 %93 None
+               OpBranch %94
+         %94 = OpLabel
+         %95 = OpLoad %int %i_1
+         %96 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %97 = OpLoad %int %96
+         %98 = OpSLessThan %bool %95 %97
+               OpSelectionMerge %99 None
+               OpBranchConditional %98 %100 %101
+        %100 = OpLabel
+               OpBranch %99
+        %101 = OpLabel
+               OpBranch %92
+         %99 = OpLabel
+        %102 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+        %103 = OpLoad %float %102
+        %104 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+        %105 = OpLoad %float %104
+        %106 = OpFOrdGreaterThan %bool %103 %105
+               OpSelectionMerge %107 None
+               OpBranchConditional %106 %108 %107
+        %108 = OpLabel
+               OpBranch %92
+        %107 = OpLabel
+        %109 = OpLoad %int %i_1
+        %110 = OpAccessChain %_ptr_Function_int %arr %109 %uint_0
+        %111 = OpLoad %int %110
+        %112 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %113 = OpLoad %int %112
+        %114 = OpIEqual %bool %111 %113
+               OpSelectionMerge %115 None
+               OpBranchConditional %114 %116 %117
+        %116 = OpLabel
+        %118 = OpLoad %int %i_1
+        %120 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+        %121 = OpLoad %int %120
+        %122 = OpExtInst %int %123 SClamp %118 %int_0 %int_3
+        %124 = OpAccessChain %_ptr_Function_int %arr %122 %uint_0
+               OpStore %124 %121
+        %125 = OpAccessChain %_ptr_Function_S %arr %int_2
+        %126 = OpLoad %S %125
+               OpStore %param %126
+        %127 = OpFunctionCall %void %func_struct_S_i11_ %param
+        %129 = OpLoad %S %param
+        %130 = OpAccessChain %_ptr_Function_S %arr %int_2
+               OpStore %130 %129
+               OpBranch %115
+        %117 = OpLabel
+        %131 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %132 = OpLoad %int %131
+               OpStore %j %132
+               OpBranch %133
+        %133 = OpLabel
+               OpLoopMerge %134 %135 None
+               OpBranch %136
+        %136 = OpLabel
+        %137 = OpLoad %int %j
+        %138 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %139 = OpLoad %int %138
+        %140 = OpSLessThan %bool %137 %139
+               OpSelectionMerge %141 None
+               OpBranchConditional %140 %142 %143
+        %142 = OpLabel
+               OpBranch %141
+        %143 = OpLabel
+               OpBranch %134
+        %141 = OpLabel
+        %144 = OpLoad %int %j
+        %145 = OpAccessChain %_ptr_Function_int %arr %144 %uint_0
+        %146 = OpLoad %int %145
+        %148 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_4
+        %149 = OpLoad %int %148
+        %150 = OpSGreaterThan %bool %146 %149
+               OpSelectionMerge %151 None
+               OpBranchConditional %150 %152 %151
+        %152 = OpLabel
+               OpKill
+        %151 = OpLabel
+               OpBranch %135
+        %135 = OpLabel
+        %153 = OpLoad %int %j
+        %154 = OpIAdd %int %153 %int_1
+               OpStore %j %154
+               OpBranch %133
+        %134 = OpLabel
+               OpBranch %115
+        %115 = OpLabel
+               OpBranch %93
+         %93 = OpLabel
+        %155 = OpLoad %int %i_1
+        %156 = OpIAdd %int %155 %int_1
+               OpStore %i_1 %156
+               OpBranch %91
+         %92 = OpLabel
+        %157 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %158 = OpLoad %int %157
+        %159 = OpAccessChain %_ptr_Function_int %arr %158 %uint_0
+        %160 = OpLoad %int %159
+        %161 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %162 = OpLoad %int %161
+        %163 = OpIEqual %bool %160 %162
+               OpStore %x_137_phi %163
+               OpSelectionMerge %164 None
+               OpBranchConditional %163 %165 %164
+        %165 = OpLabel
+        %166 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %167 = OpLoad %int %166
+        %168 = OpAccessChain %_ptr_Function_int %arr %167 %uint_0
+        %169 = OpLoad %int %168
+        %170 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+        %171 = OpLoad %int %170
+        %172 = OpIEqual %bool %169 %171
+               OpStore %x_136 %172
+        %173 = OpLoad %bool %x_136
+               OpStore %x_137_phi %173
+               OpBranch %164
+        %164 = OpLabel
+        %174 = OpLoad %bool %x_137_phi
+               OpStore %x_147_phi %174
+               OpSelectionMerge %175 None
+               OpBranchConditional %174 %176 %175
+        %176 = OpLabel
+        %177 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+        %178 = OpLoad %int %177
+        %179 = OpAccessChain %_ptr_Function_int %arr %178 %uint_0
+        %180 = OpLoad %int %179
+        %181 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %182 = OpLoad %int %181
+        %183 = OpIEqual %bool %180 %182
+               OpStore %x_146 %183
+        %184 = OpLoad %bool %x_146
+               OpStore %x_147_phi %184
+               OpBranch %175
+        %175 = OpLabel
+        %185 = OpLoad %bool %x_147_phi
+               OpSelectionMerge %186 None
+               OpBranchConditional %185 %187 %188
+        %187 = OpLabel
+        %189 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %190 = OpLoad %int %189
+        %191 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %192 = OpLoad %int %191
+        %193 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %194 = OpLoad %int %193
+        %195 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %196 = OpLoad %int %195
+        %197 = OpConvertSToF %float %190
+        %198 = OpConvertSToF %float %192
+        %199 = OpConvertSToF %float %194
+        %200 = OpConvertSToF %float %196
+        %201 = OpCompositeConstruct %v4float %197 %198 %199 %200
+               OpStore %x_GLF_color %201
+               OpBranch %186
+        %188 = OpLabel
+        %202 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %203 = OpLoad %int %202
+        %204 = OpConvertSToF %float %203
+        %205 = OpCompositeConstruct %v4float %204 %204 %204 %204
+               OpStore %x_GLF_color %205
+               OpBranch %186
+        %186 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %206
+%tint_symbol = OpFunctionParameter %main_out
+        %210 = OpLabel
+        %211 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %211
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %49
+        %213 = OpLabel
+        %214 = OpFunctionCall %void %main_1
+        %216 = OpLoad %v4float %x_GLF_color
+        %217 = OpCompositeConstruct %main_out %216
+        %215 = OpFunctionCall %void %tint_symbol_2 %217
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-inst-combine-compares-struct-array-clamp-function-cal/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-inst-combine-compares-struct-array-clamp-function-cal/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..68f76e2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-inst-combine-compares-struct-array-clamp-function-cal/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,166 @@
+struct S {
+  data : i32;
+};
+
+[[block]]
+struct buf1 {
+  v1 : vec2<f32>;
+};
+
+type Arr = [[stride(16)]] array<i32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_struct_S_i11_(s : ptr<function, S>) {
+  loop {
+    let x_174 : f32 = x_8.v1.x;
+    let x_176 : f32 = x_8.v1.y;
+    if ((x_174 > x_176)) {
+    } else {
+      break;
+    }
+    return;
+  }
+  let x_180 : i32 = x_10.x_GLF_uniform_int_values[0];
+  (*(s)).data = x_180;
+  return;
+}
+
+fn main_1() {
+  var i : i32;
+  var arr : array<S, 3>;
+  var i_1 : i32;
+  var param : S;
+  var j : i32;
+  var x_136 : bool;
+  var x_146 : bool;
+  var x_137_phi : bool;
+  var x_147_phi : bool;
+  let x_46 : i32 = x_10.x_GLF_uniform_int_values[2];
+  i = x_46;
+  loop {
+    let x_51 : i32 = i;
+    let x_53 : i32 = x_10.x_GLF_uniform_int_values[1];
+    if ((x_51 < x_53)) {
+    } else {
+      break;
+    }
+    let x_56 : i32 = i;
+    let x_57 : i32 = i;
+    arr[x_56].data = x_57;
+
+    continuing {
+      let x_59 : i32 = i;
+      i = (x_59 + 1);
+    }
+  }
+  let x_62 : i32 = x_10.x_GLF_uniform_int_values[2];
+  i_1 = x_62;
+  loop {
+    let x_67 : i32 = i_1;
+    let x_69 : i32 = x_10.x_GLF_uniform_int_values[1];
+    if ((x_67 < x_69)) {
+    } else {
+      break;
+    }
+    let x_73 : f32 = x_8.v1.x;
+    let x_75 : f32 = x_8.v1.y;
+    if ((x_73 > x_75)) {
+      break;
+    }
+    let x_79 : i32 = i_1;
+    let x_81 : i32 = arr[x_79].data;
+    let x_83 : i32 = x_10.x_GLF_uniform_int_values[0];
+    if ((x_81 == x_83)) {
+      let x_88 : i32 = i_1;
+      let x_91 : i32 = x_10.x_GLF_uniform_int_values[3];
+      arr[clamp(x_88, 0, 3)].data = x_91;
+      let x_94 : S = arr[2];
+      param = x_94;
+      func_struct_S_i11_(&(param));
+      let x_96 : S = param;
+      arr[2] = x_96;
+    } else {
+      let x_99 : i32 = x_10.x_GLF_uniform_int_values[2];
+      j = x_99;
+      loop {
+        let x_104 : i32 = j;
+        let x_106 : i32 = x_10.x_GLF_uniform_int_values[1];
+        if ((x_104 < x_106)) {
+        } else {
+          break;
+        }
+        let x_109 : i32 = j;
+        let x_111 : i32 = arr[x_109].data;
+        let x_113 : i32 = x_10.x_GLF_uniform_int_values[4];
+        if ((x_111 > x_113)) {
+          discard;
+        }
+
+        continuing {
+          let x_117 : i32 = j;
+          j = (x_117 + 1);
+        }
+      }
+    }
+
+    continuing {
+      let x_119 : i32 = i_1;
+      i_1 = (x_119 + 1);
+    }
+  }
+  let x_122 : i32 = x_10.x_GLF_uniform_int_values[2];
+  let x_124 : i32 = arr[x_122].data;
+  let x_126 : i32 = x_10.x_GLF_uniform_int_values[2];
+  let x_127 : bool = (x_124 == x_126);
+  x_137_phi = x_127;
+  if (x_127) {
+    let x_131 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_133 : i32 = arr[x_131].data;
+    let x_135 : i32 = x_10.x_GLF_uniform_int_values[3];
+    x_136 = (x_133 == x_135);
+    x_137_phi = x_136;
+  }
+  let x_137 : bool = x_137_phi;
+  x_147_phi = x_137;
+  if (x_137) {
+    let x_141 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_143 : i32 = arr[x_141].data;
+    let x_145 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_146 = (x_143 == x_145);
+    x_147_phi = x_146;
+  }
+  let x_147 : bool = x_147_phi;
+  if (x_147) {
+    let x_152 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_155 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_158 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_161 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_152), f32(x_155), f32(x_158), f32(x_161));
+  } else {
+    let x_165 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_166 : f32 = f32(x_165);
+    x_GLF_color = vec4<f32>(x_166, x_166, x_166, x_166);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-inst-combine-compares-struct-array-clamp-function-cal/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-inst-combine-compares-struct-array-clamp-function-cal/0-opt.wgsl
new file mode 100644
index 0000000..68f76e2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-inst-combine-compares-struct-array-clamp-function-cal/0-opt.wgsl
@@ -0,0 +1,166 @@
+struct S {
+  data : i32;
+};
+
+[[block]]
+struct buf1 {
+  v1 : vec2<f32>;
+};
+
+type Arr = [[stride(16)]] array<i32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_struct_S_i11_(s : ptr<function, S>) {
+  loop {
+    let x_174 : f32 = x_8.v1.x;
+    let x_176 : f32 = x_8.v1.y;
+    if ((x_174 > x_176)) {
+    } else {
+      break;
+    }
+    return;
+  }
+  let x_180 : i32 = x_10.x_GLF_uniform_int_values[0];
+  (*(s)).data = x_180;
+  return;
+}
+
+fn main_1() {
+  var i : i32;
+  var arr : array<S, 3>;
+  var i_1 : i32;
+  var param : S;
+  var j : i32;
+  var x_136 : bool;
+  var x_146 : bool;
+  var x_137_phi : bool;
+  var x_147_phi : bool;
+  let x_46 : i32 = x_10.x_GLF_uniform_int_values[2];
+  i = x_46;
+  loop {
+    let x_51 : i32 = i;
+    let x_53 : i32 = x_10.x_GLF_uniform_int_values[1];
+    if ((x_51 < x_53)) {
+    } else {
+      break;
+    }
+    let x_56 : i32 = i;
+    let x_57 : i32 = i;
+    arr[x_56].data = x_57;
+
+    continuing {
+      let x_59 : i32 = i;
+      i = (x_59 + 1);
+    }
+  }
+  let x_62 : i32 = x_10.x_GLF_uniform_int_values[2];
+  i_1 = x_62;
+  loop {
+    let x_67 : i32 = i_1;
+    let x_69 : i32 = x_10.x_GLF_uniform_int_values[1];
+    if ((x_67 < x_69)) {
+    } else {
+      break;
+    }
+    let x_73 : f32 = x_8.v1.x;
+    let x_75 : f32 = x_8.v1.y;
+    if ((x_73 > x_75)) {
+      break;
+    }
+    let x_79 : i32 = i_1;
+    let x_81 : i32 = arr[x_79].data;
+    let x_83 : i32 = x_10.x_GLF_uniform_int_values[0];
+    if ((x_81 == x_83)) {
+      let x_88 : i32 = i_1;
+      let x_91 : i32 = x_10.x_GLF_uniform_int_values[3];
+      arr[clamp(x_88, 0, 3)].data = x_91;
+      let x_94 : S = arr[2];
+      param = x_94;
+      func_struct_S_i11_(&(param));
+      let x_96 : S = param;
+      arr[2] = x_96;
+    } else {
+      let x_99 : i32 = x_10.x_GLF_uniform_int_values[2];
+      j = x_99;
+      loop {
+        let x_104 : i32 = j;
+        let x_106 : i32 = x_10.x_GLF_uniform_int_values[1];
+        if ((x_104 < x_106)) {
+        } else {
+          break;
+        }
+        let x_109 : i32 = j;
+        let x_111 : i32 = arr[x_109].data;
+        let x_113 : i32 = x_10.x_GLF_uniform_int_values[4];
+        if ((x_111 > x_113)) {
+          discard;
+        }
+
+        continuing {
+          let x_117 : i32 = j;
+          j = (x_117 + 1);
+        }
+      }
+    }
+
+    continuing {
+      let x_119 : i32 = i_1;
+      i_1 = (x_119 + 1);
+    }
+  }
+  let x_122 : i32 = x_10.x_GLF_uniform_int_values[2];
+  let x_124 : i32 = arr[x_122].data;
+  let x_126 : i32 = x_10.x_GLF_uniform_int_values[2];
+  let x_127 : bool = (x_124 == x_126);
+  x_137_phi = x_127;
+  if (x_127) {
+    let x_131 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_133 : i32 = arr[x_131].data;
+    let x_135 : i32 = x_10.x_GLF_uniform_int_values[3];
+    x_136 = (x_133 == x_135);
+    x_137_phi = x_136;
+  }
+  let x_137 : bool = x_137_phi;
+  x_147_phi = x_137;
+  if (x_137) {
+    let x_141 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_143 : i32 = arr[x_141].data;
+    let x_145 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_146 = (x_143 == x_145);
+    x_147_phi = x_146;
+  }
+  let x_147 : bool = x_147_phi;
+  if (x_147) {
+    let x_152 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_155 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_158 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_161 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_152), f32(x_155), f32(x_158), f32(x_161));
+  } else {
+    let x_165 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_166 : f32 = f32(x_165);
+    x_GLF_color = vec4<f32>(x_166, x_166, x_166, x_166);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-inst-combine-compares-struct-array-clamp-function-cal/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-inst-combine-compares-struct-array-clamp-function-cal/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..afea7c2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-inst-combine-compares-struct-array-clamp-function-cal/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,153 @@
+struct S {
+  int data;
+};
+
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[1];
+};
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[5];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void func_struct_S_i11_(inout S s) {
+  while (true) {
+    const float x_174 = asfloat(x_8[0].x);
+    const float x_176 = asfloat(x_8[0].y);
+    if ((x_174 > x_176)) {
+    } else {
+      break;
+    }
+    return;
+  }
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_180 = asint(x_10[scalar_offset / 4][scalar_offset % 4]);
+  s.data = x_180;
+  return;
+}
+
+void main_1() {
+  int i = 0;
+  S arr[3] = (S[3])0;
+  int i_1 = 0;
+  S param = (S)0;
+  int j = 0;
+  bool x_136 = false;
+  bool x_146 = false;
+  bool x_137_phi = false;
+  bool x_147_phi = false;
+  const int x_46 = asint(x_10[2].x);
+  i = x_46;
+  while (true) {
+    const int x_51 = i;
+    const int x_53 = asint(x_10[1].x);
+    if ((x_51 < x_53)) {
+    } else {
+      break;
+    }
+    arr[i].data = i;
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_62 = asint(x_10[2].x);
+  i_1 = x_62;
+  while (true) {
+    const int x_67 = i_1;
+    const int x_69 = asint(x_10[1].x);
+    if ((x_67 < x_69)) {
+    } else {
+      break;
+    }
+    const float x_73 = asfloat(x_8[0].x);
+    const float x_75 = asfloat(x_8[0].y);
+    if ((x_73 > x_75)) {
+      break;
+    }
+    const int x_81 = arr[i_1].data;
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_83 = asint(x_10[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    if ((x_81 == x_83)) {
+      const int x_88 = i_1;
+      const int x_91 = asint(x_10[3].x);
+      arr[clamp(x_88, 0, 3)].data = x_91;
+      const S x_94 = arr[2];
+      param = x_94;
+      func_struct_S_i11_(param);
+      arr[2] = param;
+    } else {
+      const int x_99 = asint(x_10[2].x);
+      j = x_99;
+      while (true) {
+        const int x_104 = j;
+        const int x_106 = asint(x_10[1].x);
+        if ((x_104 < x_106)) {
+        } else {
+          break;
+        }
+        const int x_111 = arr[j].data;
+        const int x_113 = asint(x_10[4].x);
+        if ((x_111 > x_113)) {
+          discard;
+        }
+        {
+          j = (j + 1);
+        }
+      }
+    }
+    {
+      i_1 = (i_1 + 1);
+    }
+  }
+  const int x_122 = asint(x_10[2].x);
+  const int x_124 = arr[x_122].data;
+  const int x_126 = asint(x_10[2].x);
+  const bool x_127 = (x_124 == x_126);
+  x_137_phi = x_127;
+  if (x_127) {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_131 = asint(x_10[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_133 = arr[x_131].data;
+    const int x_135 = asint(x_10[3].x);
+    x_136 = (x_133 == x_135);
+    x_137_phi = x_136;
+  }
+  const bool x_137 = x_137_phi;
+  x_147_phi = x_137;
+  if (x_137) {
+    const int x_141 = asint(x_10[3].x);
+    const int x_143 = arr[x_141].data;
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_145 = asint(x_10[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    x_146 = (x_143 == x_145);
+    x_147_phi = x_146;
+  }
+  if (x_147_phi) {
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_152 = asint(x_10[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const int x_155 = asint(x_10[2].x);
+    const int x_158 = asint(x_10[2].x);
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const int x_161 = asint(x_10[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    x_GLF_color = float4(float(x_152), float(x_155), float(x_158), float(x_161));
+  } else {
+    const int x_165 = asint(x_10[2].x);
+    const float x_166 = float(x_165);
+    x_GLF_color = float4(x_166, x_166, x_166, x_166);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-inst-combine-compares-struct-array-clamp-function-cal/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-inst-combine-compares-struct-array-clamp-function-cal/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..e3b232e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-inst-combine-compares-struct-array-clamp-function-cal/0-opt.wgsl.expected.msl
@@ -0,0 +1,168 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  int data;
+};
+struct buf1 {
+  /* 0x0000 */ packed_float2 v1;
+};
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[5];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_1 {
+  S arr[3];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void func_struct_S_i11_(constant buf1& x_8, constant buf0& x_10, thread S* const s) {
+  while (true) {
+    float const x_174 = x_8.v1.x;
+    float const x_176 = x_8.v1.y;
+    if ((x_174 > x_176)) {
+    } else {
+      break;
+    }
+    return;
+  }
+  int const x_180 = x_10.x_GLF_uniform_int_values.arr[0].el;
+  (*(s)).data = x_180;
+  return;
+}
+
+void main_1(constant buf0& x_10, constant buf1& x_8, thread float4* const tint_symbol_4) {
+  int i = 0;
+  tint_array_wrapper_1 arr = {};
+  int i_1 = 0;
+  S param = {};
+  int j = 0;
+  bool x_136 = false;
+  bool x_146 = false;
+  bool x_137_phi = false;
+  bool x_147_phi = false;
+  int const x_46 = x_10.x_GLF_uniform_int_values.arr[2].el;
+  i = x_46;
+  while (true) {
+    int const x_51 = i;
+    int const x_53 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    if ((x_51 < x_53)) {
+    } else {
+      break;
+    }
+    int const x_56 = i;
+    int const x_57 = i;
+    arr.arr[x_56].data = x_57;
+    {
+      int const x_59 = i;
+      i = (x_59 + 1);
+    }
+  }
+  int const x_62 = x_10.x_GLF_uniform_int_values.arr[2].el;
+  i_1 = x_62;
+  while (true) {
+    int const x_67 = i_1;
+    int const x_69 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    if ((x_67 < x_69)) {
+    } else {
+      break;
+    }
+    float const x_73 = x_8.v1.x;
+    float const x_75 = x_8.v1.y;
+    if ((x_73 > x_75)) {
+      break;
+    }
+    int const x_79 = i_1;
+    int const x_81 = arr.arr[x_79].data;
+    int const x_83 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_81 == x_83)) {
+      int const x_88 = i_1;
+      int const x_91 = x_10.x_GLF_uniform_int_values.arr[3].el;
+      arr.arr[clamp(x_88, 0, 3)].data = x_91;
+      S const x_94 = arr.arr[2];
+      param = x_94;
+      func_struct_S_i11_(x_8, x_10, &(param));
+      S const x_96 = param;
+      arr.arr[2] = x_96;
+    } else {
+      int const x_99 = x_10.x_GLF_uniform_int_values.arr[2].el;
+      j = x_99;
+      while (true) {
+        int const x_104 = j;
+        int const x_106 = x_10.x_GLF_uniform_int_values.arr[1].el;
+        if ((x_104 < x_106)) {
+        } else {
+          break;
+        }
+        int const x_109 = j;
+        int const x_111 = arr.arr[x_109].data;
+        int const x_113 = x_10.x_GLF_uniform_int_values.arr[4].el;
+        if ((x_111 > x_113)) {
+          discard_fragment();
+        }
+        {
+          int const x_117 = j;
+          j = (x_117 + 1);
+        }
+      }
+    }
+    {
+      int const x_119 = i_1;
+      i_1 = (x_119 + 1);
+    }
+  }
+  int const x_122 = x_10.x_GLF_uniform_int_values.arr[2].el;
+  int const x_124 = arr.arr[x_122].data;
+  int const x_126 = x_10.x_GLF_uniform_int_values.arr[2].el;
+  bool const x_127 = (x_124 == x_126);
+  x_137_phi = x_127;
+  if (x_127) {
+    int const x_131 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    int const x_133 = arr.arr[x_131].data;
+    int const x_135 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    x_136 = (x_133 == x_135);
+    x_137_phi = x_136;
+  }
+  bool const x_137 = x_137_phi;
+  x_147_phi = x_137;
+  if (x_137) {
+    int const x_141 = x_10.x_GLF_uniform_int_values.arr[3].el;
+    int const x_143 = arr.arr[x_141].data;
+    int const x_145 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    x_146 = (x_143 == x_145);
+    x_147_phi = x_146;
+  }
+  bool const x_147 = x_147_phi;
+  if (x_147) {
+    int const x_152 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    int const x_155 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    int const x_158 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    int const x_161 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_152), float(x_155), float(x_158), float(x_161));
+  } else {
+    int const x_165 = x_10.x_GLF_uniform_int_values.arr[2].el;
+    float const x_166 = float(x_165);
+    *(tint_symbol_4) = float4(x_166, x_166, x_166, x_166);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_10 [[buffer(0)]], constant buf1& x_8 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_10, x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-inst-combine-compares-struct-array-clamp-function-cal/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-inst-combine-compares-struct-array-clamp-function-cal/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..f707389
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-inst-combine-compares-struct-array-clamp-function-cal/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,350 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 218
+; Schema: 0
+               OpCapability Shader
+        %123 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "v1"
+               OpName %x_8 "x_8"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %S "S"
+               OpMemberName %S 0 "data"
+               OpName %func_struct_S_i11_ "func_struct_S_i11_"
+               OpName %s "s"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %arr "arr"
+               OpName %i_1 "i_1"
+               OpName %param "param"
+               OpName %j "j"
+               OpName %x_136 "x_136"
+               OpName %x_146 "x_146"
+               OpName %x_137_phi "x_137_phi"
+               OpName %x_147_phi "x_147_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_5 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %_arr_S_uint_3 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_5 = OpConstant %uint 5
+%_arr_int_uint_5 = OpTypeArray %int %uint_5
+       %buf0 = OpTypeStruct %_arr_int_uint_5
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %16
+       %void = OpTypeVoid
+          %S = OpTypeStruct %int
+%_ptr_Function_S = OpTypePointer Function %S
+         %19 = OpTypeFunction %void %_ptr_Function_S
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_int = OpTypePointer Function %int
+         %49 = OpTypeFunction %void
+         %53 = OpConstantNull %int
+     %uint_3 = OpConstant %uint 3
+%_arr_S_uint_3 = OpTypeArray %S %uint_3
+%_ptr_Function__arr_S_uint_3 = OpTypePointer Function %_arr_S_uint_3
+         %58 = OpConstantNull %_arr_S_uint_3
+         %61 = OpConstantNull %S
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %65 = OpConstantNull %bool
+      %int_2 = OpConstant %int 2
+      %int_1 = OpConstant %int 1
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+   %main_out = OpTypeStruct %v4float
+        %206 = OpTypeFunction %void %main_out
+%func_struct_S_i11_ = OpFunction %void None %19
+          %s = OpFunctionParameter %_ptr_Function_S
+         %25 = OpLabel
+               OpBranch %26
+         %26 = OpLabel
+               OpLoopMerge %27 %28 None
+               OpBranch %29
+         %29 = OpLabel
+         %32 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+         %33 = OpLoad %float %32
+         %35 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+         %36 = OpLoad %float %35
+         %37 = OpFOrdGreaterThan %bool %33 %36
+               OpSelectionMerge %39 None
+               OpBranchConditional %37 %40 %41
+         %40 = OpLabel
+               OpBranch %39
+         %41 = OpLabel
+               OpBranch %27
+         %39 = OpLabel
+               OpReturn
+         %28 = OpLabel
+               OpBranch %26
+         %27 = OpLabel
+         %44 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %45 = OpLoad %int %44
+         %48 = OpAccessChain %_ptr_Function_int %s %uint_0
+               OpStore %48 %45
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %49
+         %51 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %53
+        %arr = OpVariable %_ptr_Function__arr_S_uint_3 Function %58
+        %i_1 = OpVariable %_ptr_Function_int Function %53
+      %param = OpVariable %_ptr_Function_S Function %61
+          %j = OpVariable %_ptr_Function_int Function %53
+      %x_136 = OpVariable %_ptr_Function_bool Function %65
+      %x_146 = OpVariable %_ptr_Function_bool Function %65
+  %x_137_phi = OpVariable %_ptr_Function_bool Function %65
+  %x_147_phi = OpVariable %_ptr_Function_bool Function %65
+         %70 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+         %71 = OpLoad %int %70
+               OpStore %i %71
+               OpBranch %72
+         %72 = OpLabel
+               OpLoopMerge %73 %74 None
+               OpBranch %75
+         %75 = OpLabel
+         %76 = OpLoad %int %i
+         %78 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %79 = OpLoad %int %78
+         %80 = OpSLessThan %bool %76 %79
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %83
+         %82 = OpLabel
+               OpBranch %81
+         %83 = OpLabel
+               OpBranch %73
+         %81 = OpLabel
+         %84 = OpLoad %int %i
+         %85 = OpLoad %int %i
+         %86 = OpAccessChain %_ptr_Function_int %arr %84 %uint_0
+               OpStore %86 %85
+               OpBranch %74
+         %74 = OpLabel
+         %87 = OpLoad %int %i
+         %88 = OpIAdd %int %87 %int_1
+               OpStore %i %88
+               OpBranch %72
+         %73 = OpLabel
+         %89 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+         %90 = OpLoad %int %89
+               OpStore %i_1 %90
+               OpBranch %91
+         %91 = OpLabel
+               OpLoopMerge %92 %93 None
+               OpBranch %94
+         %94 = OpLabel
+         %95 = OpLoad %int %i_1
+         %96 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %97 = OpLoad %int %96
+         %98 = OpSLessThan %bool %95 %97
+               OpSelectionMerge %99 None
+               OpBranchConditional %98 %100 %101
+        %100 = OpLabel
+               OpBranch %99
+        %101 = OpLabel
+               OpBranch %92
+         %99 = OpLabel
+        %102 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+        %103 = OpLoad %float %102
+        %104 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+        %105 = OpLoad %float %104
+        %106 = OpFOrdGreaterThan %bool %103 %105
+               OpSelectionMerge %107 None
+               OpBranchConditional %106 %108 %107
+        %108 = OpLabel
+               OpBranch %92
+        %107 = OpLabel
+        %109 = OpLoad %int %i_1
+        %110 = OpAccessChain %_ptr_Function_int %arr %109 %uint_0
+        %111 = OpLoad %int %110
+        %112 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %113 = OpLoad %int %112
+        %114 = OpIEqual %bool %111 %113
+               OpSelectionMerge %115 None
+               OpBranchConditional %114 %116 %117
+        %116 = OpLabel
+        %118 = OpLoad %int %i_1
+        %120 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+        %121 = OpLoad %int %120
+        %122 = OpExtInst %int %123 SClamp %118 %int_0 %int_3
+        %124 = OpAccessChain %_ptr_Function_int %arr %122 %uint_0
+               OpStore %124 %121
+        %125 = OpAccessChain %_ptr_Function_S %arr %int_2
+        %126 = OpLoad %S %125
+               OpStore %param %126
+        %127 = OpFunctionCall %void %func_struct_S_i11_ %param
+        %129 = OpLoad %S %param
+        %130 = OpAccessChain %_ptr_Function_S %arr %int_2
+               OpStore %130 %129
+               OpBranch %115
+        %117 = OpLabel
+        %131 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %132 = OpLoad %int %131
+               OpStore %j %132
+               OpBranch %133
+        %133 = OpLabel
+               OpLoopMerge %134 %135 None
+               OpBranch %136
+        %136 = OpLabel
+        %137 = OpLoad %int %j
+        %138 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+        %139 = OpLoad %int %138
+        %140 = OpSLessThan %bool %137 %139
+               OpSelectionMerge %141 None
+               OpBranchConditional %140 %142 %143
+        %142 = OpLabel
+               OpBranch %141
+        %143 = OpLabel
+               OpBranch %134
+        %141 = OpLabel
+        %144 = OpLoad %int %j
+        %145 = OpAccessChain %_ptr_Function_int %arr %144 %uint_0
+        %146 = OpLoad %int %145
+        %148 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_4
+        %149 = OpLoad %int %148
+        %150 = OpSGreaterThan %bool %146 %149
+               OpSelectionMerge %151 None
+               OpBranchConditional %150 %152 %151
+        %152 = OpLabel
+               OpKill
+        %151 = OpLabel
+               OpBranch %135
+        %135 = OpLabel
+        %153 = OpLoad %int %j
+        %154 = OpIAdd %int %153 %int_1
+               OpStore %j %154
+               OpBranch %133
+        %134 = OpLabel
+               OpBranch %115
+        %115 = OpLabel
+               OpBranch %93
+         %93 = OpLabel
+        %155 = OpLoad %int %i_1
+        %156 = OpIAdd %int %155 %int_1
+               OpStore %i_1 %156
+               OpBranch %91
+         %92 = OpLabel
+        %157 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %158 = OpLoad %int %157
+        %159 = OpAccessChain %_ptr_Function_int %arr %158 %uint_0
+        %160 = OpLoad %int %159
+        %161 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %162 = OpLoad %int %161
+        %163 = OpIEqual %bool %160 %162
+               OpStore %x_137_phi %163
+               OpSelectionMerge %164 None
+               OpBranchConditional %163 %165 %164
+        %165 = OpLabel
+        %166 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %167 = OpLoad %int %166
+        %168 = OpAccessChain %_ptr_Function_int %arr %167 %uint_0
+        %169 = OpLoad %int %168
+        %170 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+        %171 = OpLoad %int %170
+        %172 = OpIEqual %bool %169 %171
+               OpStore %x_136 %172
+        %173 = OpLoad %bool %x_136
+               OpStore %x_137_phi %173
+               OpBranch %164
+        %164 = OpLabel
+        %174 = OpLoad %bool %x_137_phi
+               OpStore %x_147_phi %174
+               OpSelectionMerge %175 None
+               OpBranchConditional %174 %176 %175
+        %176 = OpLabel
+        %177 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_3
+        %178 = OpLoad %int %177
+        %179 = OpAccessChain %_ptr_Function_int %arr %178 %uint_0
+        %180 = OpLoad %int %179
+        %181 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %182 = OpLoad %int %181
+        %183 = OpIEqual %bool %180 %182
+               OpStore %x_146 %183
+        %184 = OpLoad %bool %x_146
+               OpStore %x_147_phi %184
+               OpBranch %175
+        %175 = OpLabel
+        %185 = OpLoad %bool %x_147_phi
+               OpSelectionMerge %186 None
+               OpBranchConditional %185 %187 %188
+        %187 = OpLabel
+        %189 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %190 = OpLoad %int %189
+        %191 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %192 = OpLoad %int %191
+        %193 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %194 = OpLoad %int %193
+        %195 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+        %196 = OpLoad %int %195
+        %197 = OpConvertSToF %float %190
+        %198 = OpConvertSToF %float %192
+        %199 = OpConvertSToF %float %194
+        %200 = OpConvertSToF %float %196
+        %201 = OpCompositeConstruct %v4float %197 %198 %199 %200
+               OpStore %x_GLF_color %201
+               OpBranch %186
+        %188 = OpLabel
+        %202 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_2
+        %203 = OpLoad %int %202
+        %204 = OpConvertSToF %float %203
+        %205 = OpCompositeConstruct %v4float %204 %204 %204 %204
+               OpStore %x_GLF_color %205
+               OpBranch %186
+        %186 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %206
+%tint_symbol = OpFunctionParameter %main_out
+        %210 = OpLabel
+        %211 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %211
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %49
+        %213 = OpLabel
+        %214 = OpFunctionCall %void %main_1
+        %216 = OpLoad %v4float %x_GLF_color
+        %217 = OpCompositeConstruct %main_out %216
+        %215 = OpFunctionCall %void %tint_symbol_2 %217
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-inst-combine-compares-struct-array-clamp-function-cal/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-inst-combine-compares-struct-array-clamp-function-cal/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..68f76e2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-inst-combine-compares-struct-array-clamp-function-cal/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,166 @@
+struct S {
+  data : i32;
+};
+
+[[block]]
+struct buf1 {
+  v1 : vec2<f32>;
+};
+
+type Arr = [[stride(16)]] array<i32, 5>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_struct_S_i11_(s : ptr<function, S>) {
+  loop {
+    let x_174 : f32 = x_8.v1.x;
+    let x_176 : f32 = x_8.v1.y;
+    if ((x_174 > x_176)) {
+    } else {
+      break;
+    }
+    return;
+  }
+  let x_180 : i32 = x_10.x_GLF_uniform_int_values[0];
+  (*(s)).data = x_180;
+  return;
+}
+
+fn main_1() {
+  var i : i32;
+  var arr : array<S, 3>;
+  var i_1 : i32;
+  var param : S;
+  var j : i32;
+  var x_136 : bool;
+  var x_146 : bool;
+  var x_137_phi : bool;
+  var x_147_phi : bool;
+  let x_46 : i32 = x_10.x_GLF_uniform_int_values[2];
+  i = x_46;
+  loop {
+    let x_51 : i32 = i;
+    let x_53 : i32 = x_10.x_GLF_uniform_int_values[1];
+    if ((x_51 < x_53)) {
+    } else {
+      break;
+    }
+    let x_56 : i32 = i;
+    let x_57 : i32 = i;
+    arr[x_56].data = x_57;
+
+    continuing {
+      let x_59 : i32 = i;
+      i = (x_59 + 1);
+    }
+  }
+  let x_62 : i32 = x_10.x_GLF_uniform_int_values[2];
+  i_1 = x_62;
+  loop {
+    let x_67 : i32 = i_1;
+    let x_69 : i32 = x_10.x_GLF_uniform_int_values[1];
+    if ((x_67 < x_69)) {
+    } else {
+      break;
+    }
+    let x_73 : f32 = x_8.v1.x;
+    let x_75 : f32 = x_8.v1.y;
+    if ((x_73 > x_75)) {
+      break;
+    }
+    let x_79 : i32 = i_1;
+    let x_81 : i32 = arr[x_79].data;
+    let x_83 : i32 = x_10.x_GLF_uniform_int_values[0];
+    if ((x_81 == x_83)) {
+      let x_88 : i32 = i_1;
+      let x_91 : i32 = x_10.x_GLF_uniform_int_values[3];
+      arr[clamp(x_88, 0, 3)].data = x_91;
+      let x_94 : S = arr[2];
+      param = x_94;
+      func_struct_S_i11_(&(param));
+      let x_96 : S = param;
+      arr[2] = x_96;
+    } else {
+      let x_99 : i32 = x_10.x_GLF_uniform_int_values[2];
+      j = x_99;
+      loop {
+        let x_104 : i32 = j;
+        let x_106 : i32 = x_10.x_GLF_uniform_int_values[1];
+        if ((x_104 < x_106)) {
+        } else {
+          break;
+        }
+        let x_109 : i32 = j;
+        let x_111 : i32 = arr[x_109].data;
+        let x_113 : i32 = x_10.x_GLF_uniform_int_values[4];
+        if ((x_111 > x_113)) {
+          discard;
+        }
+
+        continuing {
+          let x_117 : i32 = j;
+          j = (x_117 + 1);
+        }
+      }
+    }
+
+    continuing {
+      let x_119 : i32 = i_1;
+      i_1 = (x_119 + 1);
+    }
+  }
+  let x_122 : i32 = x_10.x_GLF_uniform_int_values[2];
+  let x_124 : i32 = arr[x_122].data;
+  let x_126 : i32 = x_10.x_GLF_uniform_int_values[2];
+  let x_127 : bool = (x_124 == x_126);
+  x_137_phi = x_127;
+  if (x_127) {
+    let x_131 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_133 : i32 = arr[x_131].data;
+    let x_135 : i32 = x_10.x_GLF_uniform_int_values[3];
+    x_136 = (x_133 == x_135);
+    x_137_phi = x_136;
+  }
+  let x_137 : bool = x_137_phi;
+  x_147_phi = x_137;
+  if (x_137) {
+    let x_141 : i32 = x_10.x_GLF_uniform_int_values[3];
+    let x_143 : i32 = arr[x_141].data;
+    let x_145 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_146 = (x_143 == x_145);
+    x_147_phi = x_146;
+  }
+  let x_147 : bool = x_147_phi;
+  if (x_147) {
+    let x_152 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_155 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_158 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_161 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_152), f32(x_155), f32(x_158), f32(x_161));
+  } else {
+    let x_165 : i32 = x_10.x_GLF_uniform_int_values[2];
+    let x_166 : f32 = f32(x_165);
+    x_GLF_color = vec4<f32>(x_166, x_166, x_166, x_166);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-transpose-multiply/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-transpose-multiply/0-opt.spvasm
new file mode 100644
index 0000000..58bb735
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-transpose-multiply/0-opt.spvasm
@@ -0,0 +1,64 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %m "m"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %6 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%mat2v2float = OpTypeMatrix %v2float 2
+%_ptr_Function_mat2v2float = OpTypePointer Function %mat2v2float
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+         %13 = OpConstantComposite %v2float %float_1 %float_2
+    %float_3 = OpConstant %float 3
+    %float_4 = OpConstant %float 4
+         %16 = OpConstantComposite %v2float %float_3 %float_4
+         %17 = OpConstantComposite %mat2v2float %13 %16
+       %bool = OpTypeBool
+     %v2bool = OpTypeVector %bool 2
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %23 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %24 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %6
+         %25 = OpLabel
+          %m = OpVariable %_ptr_Function_mat2v2float Function
+               OpStore %m %17
+         %26 = OpLoad %mat2v2float %m
+         %27 = OpTranspose %mat2v2float %26
+         %28 = OpLoad %mat2v2float %m
+         %29 = OpTranspose %mat2v2float %28
+         %30 = OpMatrixTimesMatrix %mat2v2float %27 %29
+         %31 = OpLoad %mat2v2float %m
+         %32 = OpLoad %mat2v2float %m
+         %33 = OpMatrixTimesMatrix %mat2v2float %31 %32
+         %34 = OpTranspose %mat2v2float %33
+         %35 = OpCompositeExtract %v2float %30 0
+         %36 = OpCompositeExtract %v2float %34 0
+         %37 = OpFOrdEqual %v2bool %35 %36
+         %38 = OpAll %bool %37
+         %39 = OpCompositeExtract %v2float %30 1
+         %40 = OpCompositeExtract %v2float %34 1
+         %41 = OpFOrdEqual %v2bool %39 %40
+         %42 = OpAll %bool %41
+         %43 = OpLogicalAnd %bool %38 %42
+               OpSelectionMerge %44 None
+               OpBranchConditional %43 %45 %46
+         %45 = OpLabel
+               OpStore %_GLF_color %23
+               OpBranch %44
+         %46 = OpLabel
+               OpStore %_GLF_color %24
+               OpBranch %44
+         %44 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-transpose-multiply/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-transpose-multiply/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..256b8ea
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-transpose-multiply/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,32 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2x2 m = float2x2(0.0f, 0.0f, 0.0f, 0.0f);
+  m = float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f));
+  const float2x2 x_30 = mul(transpose(m), transpose(m));
+  const float2x2 x_34 = transpose(mul(m, m));
+  bool tint_tmp = all((x_30[0u] == x_34[0u]));
+  if (tint_tmp) {
+    tint_tmp = all((x_30[1u] == x_34[1u]));
+  }
+  if ((tint_tmp)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-transpose-multiply/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-transpose-multiply/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..452c4cf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-transpose-multiply/0-opt.spvasm.expected.msl
@@ -0,0 +1,35 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  float2x2 m = float2x2(0.0f);
+  m = float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f));
+  float2x2 const x_26 = m;
+  float2x2 const x_28 = m;
+  float2x2 const x_30 = (transpose(x_26) * transpose(x_28));
+  float2x2 const x_31 = m;
+  float2x2 const x_32 = m;
+  float2x2 const x_34 = transpose((x_31 * x_32));
+  if ((all((x_30[0u] == x_34[0u])) && all((x_30[1u] == x_34[1u])))) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-transpose-multiply/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-transpose-multiply/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..b135837
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-transpose-multiply/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,103 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 67
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %m "m"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%mat2v2float = OpTypeMatrix %v2float 2
+%_ptr_Function_mat2v2float = OpTypePointer Function %mat2v2float
+         %16 = OpConstantNull %mat2v2float
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+         %19 = OpConstantComposite %v2float %float_1 %float_2
+    %float_3 = OpConstant %float 3
+    %float_4 = OpConstant %float 4
+         %22 = OpConstantComposite %v2float %float_3 %float_4
+         %23 = OpConstantComposite %mat2v2float %19 %22
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+     %v2bool = OpTypeVector %bool 2
+     %uint_1 = OpConstant %uint 1
+    %float_0 = OpConstant %float 0
+         %53 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %54 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %55 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %m = OpVariable %_ptr_Function_mat2v2float Function %16
+               OpStore %m %23
+         %24 = OpLoad %mat2v2float %m
+         %25 = OpLoad %mat2v2float %m
+         %26 = OpTranspose %mat2v2float %24
+         %27 = OpTranspose %mat2v2float %25
+         %28 = OpMatrixTimesMatrix %mat2v2float %26 %27
+         %29 = OpLoad %mat2v2float %m
+         %30 = OpLoad %mat2v2float %m
+         %32 = OpMatrixTimesMatrix %mat2v2float %29 %30
+         %31 = OpTranspose %mat2v2float %32
+         %37 = OpCompositeExtract %v2float %28 0
+         %38 = OpCompositeExtract %v2float %31 0
+         %39 = OpFOrdEqual %v2bool %37 %38
+         %33 = OpAll %bool %39
+               OpSelectionMerge %41 None
+               OpBranchConditional %33 %42 %41
+         %42 = OpLabel
+         %45 = OpCompositeExtract %v2float %28 1
+         %46 = OpCompositeExtract %v2float %31 1
+         %47 = OpFOrdEqual %v2bool %45 %46
+         %43 = OpAll %bool %47
+               OpBranch %41
+         %41 = OpLabel
+         %48 = OpPhi %bool %33 %11 %43 %42
+               OpSelectionMerge %49 None
+               OpBranchConditional %48 %50 %51
+         %50 = OpLabel
+               OpStore %x_GLF_color %53
+               OpBranch %49
+         %51 = OpLabel
+               OpStore %x_GLF_color %54
+               OpBranch %49
+         %49 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %55
+%tint_symbol = OpFunctionParameter %main_out
+         %59 = OpLabel
+         %60 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %60
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %62 = OpLabel
+         %63 = OpFunctionCall %void %main_1
+         %65 = OpLoad %v4float %x_GLF_color
+         %66 = OpCompositeConstruct %main_out %65
+         %64 = OpFunctionCall %void %tint_symbol_2 %66
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-transpose-multiply/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-transpose-multiply/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..891a913
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-transpose-multiply/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,29 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m : mat2x2<f32>;
+  m = mat2x2<f32>(vec2<f32>(1.0, 2.0), vec2<f32>(3.0, 4.0));
+  let x_26 : mat2x2<f32> = m;
+  let x_28 : mat2x2<f32> = m;
+  let x_30 : mat2x2<f32> = (transpose(x_26) * transpose(x_28));
+  let x_31 : mat2x2<f32> = m;
+  let x_32 : mat2x2<f32> = m;
+  let x_34 : mat2x2<f32> = transpose((x_31 * x_32));
+  if ((all((x_30[0u] == x_34[0u])) && all((x_30[1u] == x_34[1u])))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-transpose-multiply/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-transpose-multiply/0-opt.wgsl
new file mode 100644
index 0000000..891a913
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-transpose-multiply/0-opt.wgsl
@@ -0,0 +1,29 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m : mat2x2<f32>;
+  m = mat2x2<f32>(vec2<f32>(1.0, 2.0), vec2<f32>(3.0, 4.0));
+  let x_26 : mat2x2<f32> = m;
+  let x_28 : mat2x2<f32> = m;
+  let x_30 : mat2x2<f32> = (transpose(x_26) * transpose(x_28));
+  let x_31 : mat2x2<f32> = m;
+  let x_32 : mat2x2<f32> = m;
+  let x_34 : mat2x2<f32> = transpose((x_31 * x_32));
+  if ((all((x_30[0u] == x_34[0u])) && all((x_30[1u] == x_34[1u])))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-transpose-multiply/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-transpose-multiply/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..256b8ea
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-transpose-multiply/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,32 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2x2 m = float2x2(0.0f, 0.0f, 0.0f, 0.0f);
+  m = float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f));
+  const float2x2 x_30 = mul(transpose(m), transpose(m));
+  const float2x2 x_34 = transpose(mul(m, m));
+  bool tint_tmp = all((x_30[0u] == x_34[0u]));
+  if (tint_tmp) {
+    tint_tmp = all((x_30[1u] == x_34[1u]));
+  }
+  if ((tint_tmp)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-transpose-multiply/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-transpose-multiply/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..452c4cf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-transpose-multiply/0-opt.wgsl.expected.msl
@@ -0,0 +1,35 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  float2x2 m = float2x2(0.0f);
+  m = float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f));
+  float2x2 const x_26 = m;
+  float2x2 const x_28 = m;
+  float2x2 const x_30 = (transpose(x_26) * transpose(x_28));
+  float2x2 const x_31 = m;
+  float2x2 const x_32 = m;
+  float2x2 const x_34 = transpose((x_31 * x_32));
+  if ((all((x_30[0u] == x_34[0u])) && all((x_30[1u] == x_34[1u])))) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-transpose-multiply/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-transpose-multiply/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..b135837
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-transpose-multiply/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,103 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 67
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %m "m"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%mat2v2float = OpTypeMatrix %v2float 2
+%_ptr_Function_mat2v2float = OpTypePointer Function %mat2v2float
+         %16 = OpConstantNull %mat2v2float
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+         %19 = OpConstantComposite %v2float %float_1 %float_2
+    %float_3 = OpConstant %float 3
+    %float_4 = OpConstant %float 4
+         %22 = OpConstantComposite %v2float %float_3 %float_4
+         %23 = OpConstantComposite %mat2v2float %19 %22
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+     %v2bool = OpTypeVector %bool 2
+     %uint_1 = OpConstant %uint 1
+    %float_0 = OpConstant %float 0
+         %53 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %54 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %55 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %m = OpVariable %_ptr_Function_mat2v2float Function %16
+               OpStore %m %23
+         %24 = OpLoad %mat2v2float %m
+         %25 = OpLoad %mat2v2float %m
+         %26 = OpTranspose %mat2v2float %24
+         %27 = OpTranspose %mat2v2float %25
+         %28 = OpMatrixTimesMatrix %mat2v2float %26 %27
+         %29 = OpLoad %mat2v2float %m
+         %30 = OpLoad %mat2v2float %m
+         %32 = OpMatrixTimesMatrix %mat2v2float %29 %30
+         %31 = OpTranspose %mat2v2float %32
+         %37 = OpCompositeExtract %v2float %28 0
+         %38 = OpCompositeExtract %v2float %31 0
+         %39 = OpFOrdEqual %v2bool %37 %38
+         %33 = OpAll %bool %39
+               OpSelectionMerge %41 None
+               OpBranchConditional %33 %42 %41
+         %42 = OpLabel
+         %45 = OpCompositeExtract %v2float %28 1
+         %46 = OpCompositeExtract %v2float %31 1
+         %47 = OpFOrdEqual %v2bool %45 %46
+         %43 = OpAll %bool %47
+               OpBranch %41
+         %41 = OpLabel
+         %48 = OpPhi %bool %33 %11 %43 %42
+               OpSelectionMerge %49 None
+               OpBranchConditional %48 %50 %51
+         %50 = OpLabel
+               OpStore %x_GLF_color %53
+               OpBranch %49
+         %51 = OpLabel
+               OpStore %x_GLF_color %54
+               OpBranch %49
+         %49 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %55
+%tint_symbol = OpFunctionParameter %main_out
+         %59 = OpLabel
+         %60 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %60
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %62 = OpLabel
+         %63 = OpFunctionCall %void %main_1
+         %65 = OpLoad %v4float %x_GLF_color
+         %66 = OpCompositeConstruct %main_out %65
+         %64 = OpFunctionCall %void %tint_symbol_2 %66
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-transpose-multiply/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-transpose-multiply/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..891a913
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-transpose-multiply/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,29 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m : mat2x2<f32>;
+  m = mat2x2<f32>(vec2<f32>(1.0, 2.0), vec2<f32>(3.0, 4.0));
+  let x_26 : mat2x2<f32> = m;
+  let x_28 : mat2x2<f32> = m;
+  let x_30 : mat2x2<f32> = (transpose(x_26) * transpose(x_28));
+  let x_31 : mat2x2<f32> = m;
+  let x_32 : mat2x2<f32> = m;
+  let x_34 : mat2x2<f32> = transpose((x_31 * x_32));
+  if ((all((x_30[0u] == x_34[0u])) && all((x_30[1u] == x_34[1u])))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-trunc-fract-always-zero/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-trunc-fract-always-zero/0-opt.spvasm
new file mode 100644
index 0000000..88b241d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-trunc-fract-always-zero/0-opt.spvasm
@@ -0,0 +1,101 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %f "f"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+%float_0_100000001 = OpConstant %float 0.100000001
+    %float_1 = OpConstant %float 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %main = OpFunction %void None %13
+         %33 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function
+         %34 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %35 = OpLoad %float %34
+         %36 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %37 = OpLoad %float %36
+         %38 = OpFOrdLessThan %bool %35 %37
+         %39 = OpSelect %float %38 %float_0_100000001 %float_1
+         %40 = OpExtInst %float %1 Trunc %39
+         %41 = OpExtInst %float %1 Fract %40
+               OpStore %f %41
+         %42 = OpLoad %float %f
+         %43 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %44 = OpLoad %float %43
+         %45 = OpFOrdEqual %bool %42 %44
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %48
+         %47 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %50 = OpLoad %int %49
+         %51 = OpConvertSToF %float %50
+         %52 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %53 = OpLoad %int %52
+         %54 = OpConvertSToF %float %53
+         %55 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %56 = OpLoad %int %55
+         %57 = OpConvertSToF %float %56
+         %58 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %59 = OpLoad %int %58
+         %60 = OpConvertSToF %float %59
+         %61 = OpCompositeConstruct %v4float %51 %54 %57 %60
+               OpStore %_GLF_color %61
+               OpBranch %46
+         %48 = OpLabel
+         %62 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %63 = OpLoad %int %62
+         %64 = OpConvertSToF %float %63
+         %65 = OpCompositeConstruct %v4float %64 %64 %64 %64
+               OpStore %_GLF_color %65
+               OpBranch %46
+         %46 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-trunc-fract-always-zero/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-trunc-fract-always-zero/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..1f17f3d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-trunc-fract-always-zero/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,51 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_7 : register(b1, space0) {
+  uint4 x_7[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[2];
+};
+
+void main_1() {
+  float f = 0.0f;
+  const float x_35 = gl_FragCoord.y;
+  const float x_37 = asfloat(x_7[1].x);
+  f = frac(trunc(((x_35 < x_37) ? 0.100000001f : 1.0f)));
+  const float x_42 = f;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_44 = asfloat(x_7[scalar_offset / 4][scalar_offset % 4]);
+  if ((x_42 == x_44)) {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_50 = asint(x_9[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const int x_53 = asint(x_9[1].x);
+    const int x_56 = asint(x_9[1].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_59 = asint(x_9[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    x_GLF_color = float4(float(x_50), float(x_53), float(x_56), float(x_59));
+  } else {
+    const int x_63 = asint(x_9[1].x);
+    const float x_64 = float(x_63);
+    x_GLF_color = float4(x_64, x_64, x_64, x_64);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-trunc-fract-always-zero/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-trunc-fract-always-zero/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..268f0cc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-trunc-fract-always-zero/0-opt.spvasm.expected.msl
@@ -0,0 +1,61 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_7, constant buf0& x_9, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float f = 0.0f;
+  float const x_35 = (*(tint_symbol_5)).y;
+  float const x_37 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  f = fract(trunc(select(1.0f, 0.100000001f, (x_35 < x_37))));
+  float const x_42 = f;
+  float const x_44 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_42 == x_44)) {
+    int const x_50 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    int const x_53 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_56 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_59 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_6) = float4(float(x_50), float(x_53), float(x_56), float(x_59));
+  } else {
+    int const x_63 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    float const x_64 = float(x_63);
+    *(tint_symbol_6) = float4(x_64, x_64, x_64, x_64);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf1& x_7 [[buffer(1)]], constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_7, x_9, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-trunc-fract-always-zero/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-trunc-fract-always-zero/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..872fb57
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-trunc-fract-always-zero/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,140 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 85
+; Schema: 0
+               OpCapability Shader
+         %39 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_7 = OpVariable %_ptr_Uniform_buf1 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %22 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %28 = OpConstantNull %float
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+%float_0_100000001 = OpConstant %float 0.100000001
+    %float_1 = OpConstant %float 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+         %72 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %22
+         %25 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %28
+         %31 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %32 = OpLoad %float %31
+         %36 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %37 = OpLoad %float %36
+         %42 = OpFOrdLessThan %bool %32 %37
+         %41 = OpSelect %float %42 %float_0_100000001 %float_1
+         %40 = OpExtInst %float %39 Trunc %41
+         %38 = OpExtInst %float %39 Fract %40
+               OpStore %f %38
+         %46 = OpLoad %float %f
+         %48 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %49 = OpLoad %float %48
+         %50 = OpFOrdEqual %bool %46 %49
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %53
+         %52 = OpLabel
+         %55 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %56 = OpLoad %int %55
+         %57 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %58 = OpLoad %int %57
+         %59 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %60 = OpLoad %int %59
+         %61 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %62 = OpLoad %int %61
+         %63 = OpConvertSToF %float %56
+         %64 = OpConvertSToF %float %58
+         %65 = OpConvertSToF %float %60
+         %66 = OpConvertSToF %float %62
+         %67 = OpCompositeConstruct %v4float %63 %64 %65 %66
+               OpStore %x_GLF_color %67
+               OpBranch %51
+         %53 = OpLabel
+         %68 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %69 = OpLoad %int %68
+         %70 = OpConvertSToF %float %69
+         %71 = OpCompositeConstruct %v4float %70 %70 %70 %70
+               OpStore %x_GLF_color %71
+               OpBranch %51
+         %51 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %72
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %76 = OpLabel
+         %77 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %77
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %22
+         %79 = OpLabel
+         %80 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %80
+         %81 = OpFunctionCall %void %main_1
+         %83 = OpLoad %v4float %x_GLF_color
+         %84 = OpCompositeConstruct %main_out %83
+         %82 = OpFunctionCall %void %tint_symbol_3 %84
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-trunc-fract-always-zero/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-trunc-fract-always-zero/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..bba3d95
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-trunc-fract-always-zero/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,54 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+fn main_1() {
+  var f : f32;
+  let x_35 : f32 = gl_FragCoord.y;
+  let x_37 : f32 = x_7.x_GLF_uniform_float_values[1];
+  f = fract(trunc(select(1.0, 0.100000001, (x_35 < x_37))));
+  let x_42 : f32 = f;
+  let x_44 : f32 = x_7.x_GLF_uniform_float_values[0];
+  if ((x_42 == x_44)) {
+    let x_50 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_53 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_56 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_59 : i32 = x_9.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_50), f32(x_53), f32(x_56), f32(x_59));
+  } else {
+    let x_63 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_64 : f32 = f32(x_63);
+    x_GLF_color = vec4<f32>(x_64, x_64, x_64, x_64);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-trunc-fract-always-zero/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-trunc-fract-always-zero/0-opt.wgsl
new file mode 100644
index 0000000..bba3d95
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-trunc-fract-always-zero/0-opt.wgsl
@@ -0,0 +1,54 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+fn main_1() {
+  var f : f32;
+  let x_35 : f32 = gl_FragCoord.y;
+  let x_37 : f32 = x_7.x_GLF_uniform_float_values[1];
+  f = fract(trunc(select(1.0, 0.100000001, (x_35 < x_37))));
+  let x_42 : f32 = f;
+  let x_44 : f32 = x_7.x_GLF_uniform_float_values[0];
+  if ((x_42 == x_44)) {
+    let x_50 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_53 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_56 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_59 : i32 = x_9.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_50), f32(x_53), f32(x_56), f32(x_59));
+  } else {
+    let x_63 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_64 : f32 = f32(x_63);
+    x_GLF_color = vec4<f32>(x_64, x_64, x_64, x_64);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-trunc-fract-always-zero/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-trunc-fract-always-zero/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..1f17f3d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-trunc-fract-always-zero/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,51 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_7 : register(b1, space0) {
+  uint4 x_7[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[2];
+};
+
+void main_1() {
+  float f = 0.0f;
+  const float x_35 = gl_FragCoord.y;
+  const float x_37 = asfloat(x_7[1].x);
+  f = frac(trunc(((x_35 < x_37) ? 0.100000001f : 1.0f)));
+  const float x_42 = f;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_44 = asfloat(x_7[scalar_offset / 4][scalar_offset % 4]);
+  if ((x_42 == x_44)) {
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_50 = asint(x_9[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const int x_53 = asint(x_9[1].x);
+    const int x_56 = asint(x_9[1].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_59 = asint(x_9[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    x_GLF_color = float4(float(x_50), float(x_53), float(x_56), float(x_59));
+  } else {
+    const int x_63 = asint(x_9[1].x);
+    const float x_64 = float(x_63);
+    x_GLF_color = float4(x_64, x_64, x_64, x_64);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-trunc-fract-always-zero/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-trunc-fract-always-zero/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..268f0cc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-trunc-fract-always-zero/0-opt.wgsl.expected.msl
@@ -0,0 +1,61 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_7, constant buf0& x_9, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float f = 0.0f;
+  float const x_35 = (*(tint_symbol_5)).y;
+  float const x_37 = x_7.x_GLF_uniform_float_values.arr[1].el;
+  f = fract(trunc(select(1.0f, 0.100000001f, (x_35 < x_37))));
+  float const x_42 = f;
+  float const x_44 = x_7.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_42 == x_44)) {
+    int const x_50 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    int const x_53 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_56 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_59 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_6) = float4(float(x_50), float(x_53), float(x_56), float(x_59));
+  } else {
+    int const x_63 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    float const x_64 = float(x_63);
+    *(tint_symbol_6) = float4(x_64, x_64, x_64, x_64);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf1& x_7 [[buffer(1)]], constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_7, x_9, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-trunc-fract-always-zero/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-trunc-fract-always-zero/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..872fb57
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-trunc-fract-always-zero/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,140 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 85
+; Schema: 0
+               OpCapability Shader
+         %39 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_7 = OpVariable %_ptr_Uniform_buf1 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %22 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %28 = OpConstantNull %float
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+%float_0_100000001 = OpConstant %float 0.100000001
+    %float_1 = OpConstant %float 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+   %main_out = OpTypeStruct %v4float
+         %72 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %22
+         %25 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %28
+         %31 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %32 = OpLoad %float %31
+         %36 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_1
+         %37 = OpLoad %float %36
+         %42 = OpFOrdLessThan %bool %32 %37
+         %41 = OpSelect %float %42 %float_0_100000001 %float_1
+         %40 = OpExtInst %float %39 Trunc %41
+         %38 = OpExtInst %float %39 Fract %40
+               OpStore %f %38
+         %46 = OpLoad %float %f
+         %48 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %int_0
+         %49 = OpLoad %float %48
+         %50 = OpFOrdEqual %bool %46 %49
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %53
+         %52 = OpLabel
+         %55 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %56 = OpLoad %int %55
+         %57 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %58 = OpLoad %int %57
+         %59 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %60 = OpLoad %int %59
+         %61 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %62 = OpLoad %int %61
+         %63 = OpConvertSToF %float %56
+         %64 = OpConvertSToF %float %58
+         %65 = OpConvertSToF %float %60
+         %66 = OpConvertSToF %float %62
+         %67 = OpCompositeConstruct %v4float %63 %64 %65 %66
+               OpStore %x_GLF_color %67
+               OpBranch %51
+         %53 = OpLabel
+         %68 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %69 = OpLoad %int %68
+         %70 = OpConvertSToF %float %69
+         %71 = OpCompositeConstruct %v4float %70 %70 %70 %70
+               OpStore %x_GLF_color %71
+               OpBranch %51
+         %51 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %72
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %76 = OpLabel
+         %77 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %77
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %22
+         %79 = OpLabel
+         %80 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %80
+         %81 = OpFunctionCall %void %main_1
+         %83 = OpLoad %v4float %x_GLF_color
+         %84 = OpCompositeConstruct %main_out %83
+         %82 = OpFunctionCall %void %tint_symbol_3 %84
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-trunc-fract-always-zero/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-trunc-fract-always-zero/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..bba3d95
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-trunc-fract-always-zero/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,54 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_7 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+fn main_1() {
+  var f : f32;
+  let x_35 : f32 = gl_FragCoord.y;
+  let x_37 : f32 = x_7.x_GLF_uniform_float_values[1];
+  f = fract(trunc(select(1.0, 0.100000001, (x_35 < x_37))));
+  let x_42 : f32 = f;
+  let x_44 : f32 = x_7.x_GLF_uniform_float_values[0];
+  if ((x_42 == x_44)) {
+    let x_50 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_53 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_56 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_59 : i32 = x_9.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_50), f32(x_53), f32(x_56), f32(x_59));
+  } else {
+    let x_63 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_64 : f32 = f32(x_63);
+    x_GLF_color = vec4<f32>(x_64, x_64, x_64, x_64);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-types-return-in-main-never-hit/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-types-return-in-main-never-hit/0-opt.spvasm
new file mode 100644
index 0000000..d72e66a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-types-return-in-main-never-hit/0-opt.spvasm
@@ -0,0 +1,56 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %func_ "func("
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %_ ""
+               OpDecorate %_GLF_color Location 0
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+         %11 = OpTypeFunction %v4float
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %14 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %16 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %main = OpFunction %void None %8
+         %23 = OpLabel
+         %24 = OpVariable %_ptr_Function_v4float Function
+               OpStore %_GLF_color %16
+         %25 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %26 = OpLoad %int %25
+         %27 = OpIEqual %bool %26 %int_0
+               OpSelectionMerge %28 None
+               OpBranchConditional %27 %29 %28
+         %29 = OpLabel
+               OpReturn
+         %28 = OpLabel
+               OpStore %24 %14
+               OpStore %_GLF_color %14
+               OpReturn
+               OpFunctionEnd
+      %func_ = OpFunction %v4float None %11
+         %30 = OpLabel
+               OpReturnValue %14
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-types-return-in-main-never-hit/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-types-return-in-main-never-hit/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..325bac8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-types-return-in-main-never-hit/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,34 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+
+void main_1() {
+  float4 x_24 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  const int x_26 = asint(x_6[0].x);
+  if ((x_26 == 0)) {
+    return;
+  }
+  x_24 = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
+float4 func_() {
+  return float4(1.0f, 0.0f, 0.0f, 1.0f);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-types-return-in-main-never-hit/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-types-return-in-main-never-hit/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..cf5d8b8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-types-return-in-main-never-hit/0-opt.spvasm.expected.msl
@@ -0,0 +1,37 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float4 x_24 = 0.0f;
+  *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int const x_26 = x_6.one;
+  if ((x_26 == 0)) {
+    return;
+  }
+  x_24 = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
+float4 func_() {
+  return float4(1.0f, 0.0f, 0.0f, 1.0f);
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-types-return-in-main-never-hit/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-types-return-in-main-never-hit/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..92c0d33
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-types-return-in-main-never-hit/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,90 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 47
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_6 "x_6"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_24 "x_24"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpName %func_ "func_"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+    %float_0 = OpConstant %float 0
+         %19 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+         %31 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %32 = OpTypeFunction %void %main_out
+         %44 = OpTypeFunction %v4float
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+       %x_24 = OpVariable %_ptr_Function_v4float Function %5
+               OpStore %x_GLF_color %19
+         %23 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0
+         %24 = OpLoad %int %23
+         %26 = OpIEqual %bool %24 %int_0
+               OpSelectionMerge %28 None
+               OpBranchConditional %26 %29 %28
+         %29 = OpLabel
+               OpReturn
+         %28 = OpLabel
+               OpStore %x_24 %31
+               OpStore %x_GLF_color %31
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %32
+%tint_symbol = OpFunctionParameter %main_out
+         %36 = OpLabel
+         %37 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %37
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %39 = OpLabel
+         %40 = OpFunctionCall %void %main_1
+         %42 = OpLoad %v4float %x_GLF_color
+         %43 = OpCompositeConstruct %main_out %42
+         %41 = OpFunctionCall %void %tint_symbol_2 %43
+               OpReturn
+               OpFunctionEnd
+      %func_ = OpFunction %v4float None %44
+         %46 = OpLabel
+               OpReturnValue %31
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-types-return-in-main-never-hit/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-types-return-in-main-never-hit/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..a354d57
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-types-return-in-main-never-hit/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,35 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+fn main_1() {
+  var x_24 : vec4<f32>;
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  let x_26 : i32 = x_6.one;
+  if ((x_26 == 0)) {
+    return;
+  }
+  x_24 = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+fn func_() -> vec4<f32> {
+  return vec4<f32>(1.0, 0.0, 0.0, 1.0);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-types-return-in-main-never-hit/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-types-return-in-main-never-hit/0-opt.wgsl
new file mode 100644
index 0000000..a354d57
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-types-return-in-main-never-hit/0-opt.wgsl
@@ -0,0 +1,35 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+fn main_1() {
+  var x_24 : vec4<f32>;
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  let x_26 : i32 = x_6.one;
+  if ((x_26 == 0)) {
+    return;
+  }
+  x_24 = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+fn func_() -> vec4<f32> {
+  return vec4<f32>(1.0, 0.0, 0.0, 1.0);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-types-return-in-main-never-hit/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-types-return-in-main-never-hit/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..325bac8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-types-return-in-main-never-hit/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,34 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+
+void main_1() {
+  float4 x_24 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  const int x_26 = asint(x_6[0].x);
+  if ((x_26 == 0)) {
+    return;
+  }
+  x_24 = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
+float4 func_() {
+  return float4(1.0f, 0.0f, 0.0f, 1.0f);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-types-return-in-main-never-hit/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-types-return-in-main-never-hit/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..cf5d8b8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-types-return-in-main-never-hit/0-opt.wgsl.expected.msl
@@ -0,0 +1,37 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float4 x_24 = 0.0f;
+  *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int const x_26 = x_6.one;
+  if ((x_26 == 0)) {
+    return;
+  }
+  x_24 = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
+float4 func_() {
+  return float4(1.0f, 0.0f, 0.0f, 1.0f);
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-types-return-in-main-never-hit/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-types-return-in-main-never-hit/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..92c0d33
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-types-return-in-main-never-hit/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,90 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 47
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_6 "x_6"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_24 "x_24"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpName %func_ "func_"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+    %float_0 = OpConstant %float 0
+         %19 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+         %31 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %32 = OpTypeFunction %void %main_out
+         %44 = OpTypeFunction %v4float
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+       %x_24 = OpVariable %_ptr_Function_v4float Function %5
+               OpStore %x_GLF_color %19
+         %23 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0
+         %24 = OpLoad %int %23
+         %26 = OpIEqual %bool %24 %int_0
+               OpSelectionMerge %28 None
+               OpBranchConditional %26 %29 %28
+         %29 = OpLabel
+               OpReturn
+         %28 = OpLabel
+               OpStore %x_24 %31
+               OpStore %x_GLF_color %31
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %32
+%tint_symbol = OpFunctionParameter %main_out
+         %36 = OpLabel
+         %37 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %37
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %39 = OpLabel
+         %40 = OpFunctionCall %void %main_1
+         %42 = OpLoad %v4float %x_GLF_color
+         %43 = OpCompositeConstruct %main_out %42
+         %41 = OpFunctionCall %void %tint_symbol_2 %43
+               OpReturn
+               OpFunctionEnd
+      %func_ = OpFunction %v4float None %44
+         %46 = OpLabel
+               OpReturnValue %31
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-types-return-in-main-never-hit/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-types-return-in-main-never-hit/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..a354d57
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-types-return-in-main-never-hit/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,35 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+fn main_1() {
+  var x_24 : vec4<f32>;
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  let x_26 : i32 = x_6.one;
+  if ((x_26 == 0)) {
+    return;
+  }
+  x_24 = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+fn func_() -> vec4<f32> {
+  return vec4<f32>(1.0, 0.0, 0.0, 1.0);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-undefined-inversesqrt-reflect/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-undefined-inversesqrt-reflect/0-opt.spvasm
new file mode 100644
index 0000000..763916f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-undefined-inversesqrt-reflect/0-opt.spvasm
@@ -0,0 +1,114 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %m24 "m24"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "v1"
+               OpName %__0 ""
+               OpName %a "a"
+               OpName %v2 "v2"
+               OpName %v3 "v3"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%mat2v2float = OpTypeMatrix %v2float 2
+%_ptr_Function_mat2v2float = OpTypePointer Function %mat2v2float
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+     %uint_0 = OpConstant %uint 0
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+%_ptr_Function_float = OpTypePointer Function %float
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+%float_n0x1_8p_128 = OpConstant %float -0x1.8p+128
+         %32 = OpConstantComposite %v2float %float_n0x1_8p_128 %float_1
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %bool = OpTypeBool
+         %36 = OpConstantComposite %v2float %float_0 %float_0
+         %37 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %14
+         %38 = OpLabel
+        %m24 = OpVariable %_ptr_Function_mat2v2float Function
+          %a = OpVariable %_ptr_Function_float Function
+         %v2 = OpVariable %_ptr_Function_v2float Function
+         %v3 = OpVariable %_ptr_Function_v2float Function
+         %39 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %40 = OpLoad %float %39
+         %41 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %42 = OpLoad %float %41
+         %43 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %uint_0
+         %44 = OpLoad %float %43
+         %45 = OpFMul %float %44 %float_1
+         %46 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %47 = OpLoad %float %46
+         %48 = OpCompositeConstruct %v2float %40 %42
+         %49 = OpCompositeConstruct %v2float %45 %47
+         %50 = OpCompositeConstruct %mat2v2float %48 %49
+               OpStore %m24 %50
+         %51 = OpLoad %mat2v2float %m24
+         %52 = OpCompositeExtract %float %51 0 0
+               OpStore %a %52
+               OpStore %v2 %32
+         %53 = OpLoad %v2float %v2
+         %54 = OpLoad %float %a
+         %55 = OpCompositeConstruct %v2float %54 %float_1
+         %56 = OpExtInst %v2float %1 Reflect %53 %55
+               OpStore %v3 %56
+         %57 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %58 = OpLoad %float %57
+         %59 = OpLoad %v2float %v3
+         %60 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %61 = OpLoad %float %60
+         %62 = OpCompositeExtract %float %59 0
+         %63 = OpCompositeExtract %float %59 1
+         %64 = OpCompositeConstruct %v4float %58 %62 %63 %61
+               OpStore %_GLF_color %64
+         %65 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %uint_1
+         %66 = OpLoad %float %65
+         %67 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %68 = OpLoad %float %67
+         %69 = OpFOrdEqual %bool %66 %68
+               OpSelectionMerge %70 None
+               OpBranchConditional %69 %71 %72
+         %71 = OpLabel
+         %73 = OpLoad %v4float %_GLF_color
+         %74 = OpVectorShuffle %v4float %73 %36 0 4 5 3
+               OpStore %_GLF_color %74
+               OpBranch %70
+         %72 = OpLabel
+               OpStore %_GLF_color %37
+               OpBranch %70
+         %70 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-undefined-inversesqrt-reflect/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-undefined-inversesqrt-reflect/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..a4a3ad2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-undefined-inversesqrt-reflect/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,55 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2x2 m24 = float2x2(0.0f, 0.0f, 0.0f, 0.0f);
+  float a = 0.0f;
+  float2 v2 = float2(0.0f, 0.0f);
+  float2 v3 = float2(0.0f, 0.0f);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_40 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_42 = asfloat(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const float x_44 = asfloat(x_8[0].x);
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const float x_47 = asfloat(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  m24 = float2x2(float2(x_40, x_42), float2((x_44 * 1.0f), x_47));
+  a = m24[0u].x;
+  v2 = float2(asfloat(0x7fc00000u), 1.0f);
+  v3 = reflect(v2, float2(a, 1.0f));
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const float x_58 = asfloat(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  const float2 x_59 = v3;
+  const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+  const float x_61 = asfloat(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+  x_GLF_color = float4(x_58, x_59.x, x_59.y, x_61);
+  const float x_66 = asfloat(x_8[0].y);
+  const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+  const float x_68 = asfloat(x_6[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+  if ((x_66 == x_68)) {
+    const float4 x_73 = x_GLF_color;
+    x_GLF_color = float4(x_73.x, float2(0.0f, 0.0f).x, float2(0.0f, 0.0f).y, x_73.w);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-undefined-inversesqrt-reflect/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-undefined-inversesqrt-reflect/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..570e97a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-undefined-inversesqrt-reflect/0-opt.spvasm.expected.msl
@@ -0,0 +1,62 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct buf1 {
+  /* 0x0000 */ packed_float2 v1;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_8, thread float4* const tint_symbol_4) {
+  float2x2 m24 = float2x2(0.0f);
+  float a = 0.0f;
+  float2 v2 = 0.0f;
+  float2 v3 = 0.0f;
+  float const x_40 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_42 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_44 = x_8.v1.x;
+  float const x_47 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  m24 = float2x2(float2(x_40, x_42), float2((x_44 * 1.0f), x_47));
+  float2x2 const x_51 = m24;
+  a = x_51[0u].x;
+  v2 = float2(NAN, 1.0f);
+  float2 const x_53 = v2;
+  float const x_54 = a;
+  v3 = reflect(x_53, float2(x_54, 1.0f));
+  float const x_58 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float2 const x_59 = v3;
+  float const x_61 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  *(tint_symbol_4) = float4(x_58, x_59.x, x_59.y, x_61);
+  float const x_66 = x_8.v1.y;
+  float const x_68 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_66 == x_68)) {
+    float4 const x_73 = *(tint_symbol_4);
+    *(tint_symbol_4) = float4(x_73.x, float2(0.0f, 0.0f).x, float2(0.0f, 0.0f).y, x_73.w);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_8 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-undefined-inversesqrt-reflect/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-undefined-inversesqrt-reflect/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..a0d5039
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-undefined-inversesqrt-reflect/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,155 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 98
+; Schema: 0
+               OpCapability Shader
+         %58 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "v1"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %m24 "m24"
+               OpName %a "a"
+               OpName %v2 "v2"
+               OpName %v3 "v3"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %15 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %15
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %15
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+%mat2v2float = OpTypeMatrix %v2float 2
+%_ptr_Function_mat2v2float = OpTypePointer Function %mat2v2float
+         %25 = OpConstantNull %mat2v2float
+%_ptr_Function_float = OpTypePointer Function %float
+         %28 = OpConstantNull %float
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %31 = OpConstantNull %v2float
+     %uint_0 = OpConstant %uint 0
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+%float_n0x1_8p_128 = OpConstant %float -0x1.8p+128
+         %54 = OpConstantComposite %v2float %float_n0x1_8p_128 %float_1
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+         %80 = OpConstantComposite %v2float %float_0 %float_0
+         %85 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %86 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %18
+         %21 = OpLabel
+        %m24 = OpVariable %_ptr_Function_mat2v2float Function %25
+          %a = OpVariable %_ptr_Function_float Function %28
+         %v2 = OpVariable %_ptr_Function_v2float Function %31
+         %v3 = OpVariable %_ptr_Function_v2float Function %31
+         %37 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %38 = OpLoad %float %37
+         %39 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %40 = OpLoad %float %39
+         %41 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+         %42 = OpLoad %float %41
+         %43 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %44 = OpLoad %float %43
+         %45 = OpCompositeConstruct %v2float %38 %40
+         %47 = OpFMul %float %42 %float_1
+         %48 = OpCompositeConstruct %v2float %47 %44
+         %49 = OpCompositeConstruct %mat2v2float %45 %48
+               OpStore %m24 %49
+         %50 = OpLoad %mat2v2float %m24
+         %51 = OpCompositeExtract %v2float %50 0
+         %52 = OpCompositeExtract %float %51 0
+               OpStore %a %52
+               OpStore %v2 %54
+         %55 = OpLoad %v2float %v2
+         %56 = OpLoad %float %a
+         %59 = OpCompositeConstruct %v2float %56 %float_1
+         %57 = OpExtInst %v2float %58 Reflect %55 %59
+               OpStore %v3 %57
+         %60 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %61 = OpLoad %float %60
+         %62 = OpLoad %v2float %v3
+         %63 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %64 = OpLoad %float %63
+         %65 = OpCompositeExtract %float %62 0
+         %66 = OpCompositeExtract %float %62 1
+         %67 = OpCompositeConstruct %v4float %61 %65 %66 %64
+               OpStore %x_GLF_color %67
+         %68 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+         %69 = OpLoad %float %68
+         %70 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %71 = OpLoad %float %70
+         %72 = OpFOrdEqual %bool %69 %71
+               OpSelectionMerge %74 None
+               OpBranchConditional %72 %75 %76
+         %75 = OpLabel
+         %77 = OpLoad %v4float %x_GLF_color
+         %78 = OpCompositeExtract %float %77 0
+         %81 = OpCompositeExtract %float %80 0
+         %82 = OpCompositeExtract %float %80 1
+         %83 = OpCompositeExtract %float %77 3
+         %84 = OpCompositeConstruct %v4float %78 %81 %82 %83
+               OpStore %x_GLF_color %84
+               OpBranch %74
+         %76 = OpLabel
+               OpStore %x_GLF_color %85
+               OpBranch %74
+         %74 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %86
+%tint_symbol = OpFunctionParameter %main_out
+         %90 = OpLabel
+         %91 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %91
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %18
+         %93 = OpLabel
+         %94 = OpFunctionCall %void %main_1
+         %96 = OpLoad %v4float %x_GLF_color
+         %97 = OpCompositeConstruct %main_out %96
+         %95 = OpFunctionCall %void %tint_symbol_2 %97
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-undefined-inversesqrt-reflect/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-undefined-inversesqrt-reflect/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..1e71e59
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-undefined-inversesqrt-reflect/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,59 @@
+type Arr = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[block]]
+struct buf1 {
+  v1 : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m24 : mat2x2<f32>;
+  var a : f32;
+  var v2 : vec2<f32>;
+  var v3 : vec2<f32>;
+  let x_40 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_42 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_44 : f32 = x_8.v1.x;
+  let x_47 : f32 = x_6.x_GLF_uniform_float_values[0];
+  m24 = mat2x2<f32>(vec2<f32>(x_40, x_42), vec2<f32>((x_44 * 1.0), x_47));
+  let x_51 : mat2x2<f32> = m24;
+  a = x_51[0u].x;
+  v2 = vec2<f32>(-0x1.8p+128, 1.0);
+  let x_53 : vec2<f32> = v2;
+  let x_54 : f32 = a;
+  v3 = reflect(x_53, vec2<f32>(x_54, 1.0));
+  let x_58 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_59 : vec2<f32> = v3;
+  let x_61 : f32 = x_6.x_GLF_uniform_float_values[0];
+  x_GLF_color = vec4<f32>(x_58, x_59.x, x_59.y, x_61);
+  let x_66 : f32 = x_8.v1.y;
+  let x_68 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if ((x_66 == x_68)) {
+    let x_73 : vec4<f32> = x_GLF_color;
+    x_GLF_color = vec4<f32>(x_73.x, vec2<f32>(0.0, 0.0).x, vec2<f32>(0.0, 0.0).y, x_73.w);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-undefined-inversesqrt-reflect/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-undefined-inversesqrt-reflect/0-opt.wgsl
new file mode 100644
index 0000000..1e71e59
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-undefined-inversesqrt-reflect/0-opt.wgsl
@@ -0,0 +1,59 @@
+type Arr = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+[[block]]
+struct buf1 {
+  v1 : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m24 : mat2x2<f32>;
+  var a : f32;
+  var v2 : vec2<f32>;
+  var v3 : vec2<f32>;
+  let x_40 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_42 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_44 : f32 = x_8.v1.x;
+  let x_47 : f32 = x_6.x_GLF_uniform_float_values[0];
+  m24 = mat2x2<f32>(vec2<f32>(x_40, x_42), vec2<f32>((x_44 * 1.0), x_47));
+  let x_51 : mat2x2<f32> = m24;
+  a = x_51[0u].x;
+  v2 = vec2<f32>(-0x1.8p+128, 1.0);
+  let x_53 : vec2<f32> = v2;
+  let x_54 : f32 = a;
+  v3 = reflect(x_53, vec2<f32>(x_54, 1.0));
+  let x_58 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_59 : vec2<f32> = v3;
+  let x_61 : f32 = x_6.x_GLF_uniform_float_values[0];
+  x_GLF_color = vec4<f32>(x_58, x_59.x, x_59.y, x_61);
+  let x_66 : f32 = x_8.v1.y;
+  let x_68 : f32 = x_6.x_GLF_uniform_float_values[0];
+  if ((x_66 == x_68)) {
+    let x_73 : vec4<f32> = x_GLF_color;
+    x_GLF_color = vec4<f32>(x_73.x, vec2<f32>(0.0, 0.0).x, vec2<f32>(0.0, 0.0).y, x_73.w);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-undefined-inversesqrt-reflect/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-undefined-inversesqrt-reflect/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..5dab884
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-undefined-inversesqrt-reflect/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,6 @@
+SKIP: FAILED
+
+graphicsfuzz/cov-undefined-inversesqrt-reflect/0-opt.wgsl:31:22 error: expected ')' for type constructor
+  v2 = vec2<f32>(-0x1.8p+128, 1.0);
+                     ^^
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-undefined-inversesqrt-reflect/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-undefined-inversesqrt-reflect/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..5dab884
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-undefined-inversesqrt-reflect/0-opt.wgsl.expected.msl
@@ -0,0 +1,6 @@
+SKIP: FAILED
+
+graphicsfuzz/cov-undefined-inversesqrt-reflect/0-opt.wgsl:31:22 error: expected ')' for type constructor
+  v2 = vec2<f32>(-0x1.8p+128, 1.0);
+                     ^^
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-undefined-inversesqrt-reflect/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-undefined-inversesqrt-reflect/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..5dab884
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-undefined-inversesqrt-reflect/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,6 @@
+SKIP: FAILED
+
+graphicsfuzz/cov-undefined-inversesqrt-reflect/0-opt.wgsl:31:22 error: expected ')' for type constructor
+  v2 = vec2<f32>(-0x1.8p+128, 1.0);
+                     ^^
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-undefined-inversesqrt-reflect/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-undefined-inversesqrt-reflect/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..5dab884
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-undefined-inversesqrt-reflect/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,6 @@
+SKIP: FAILED
+
+graphicsfuzz/cov-undefined-inversesqrt-reflect/0-opt.wgsl:31:22 error: expected ')' for type constructor
+  v2 = vec2<f32>(-0x1.8p+128, 1.0);
+                     ^^
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-uninitialized-values-passed-to-function-never-executed/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-uninitialized-values-passed-to-function-never-executed/0-opt.spvasm
new file mode 100644
index 0000000..71b28a0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-uninitialized-values-passed-to-function-never-executed/0-opt.spvasm
@@ -0,0 +1,171 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %S "S"
+               OpMemberName %S 0 "data"
+               OpName %func_struct_S_i11_i1_ "func(struct-S-i11;i1;"
+               OpName %s "s"
+               OpName %x "x"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %arr "arr"
+               OpName %index "index"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %param_1 "param"
+               OpName %param_2 "param"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+          %S = OpTypeStruct %int
+%_ptr_Function_S = OpTypePointer Function %S
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpTypeFunction %void %_ptr_Function_S %_ptr_Function_int
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+     %int_10 = OpConstant %int 10
+    %uint_10 = OpConstant %uint 10
+%_arr_S_uint_10 = OpTypeArray %S %uint_10
+%_ptr_Function__arr_S_uint_10 = OpTypePointer Function %_arr_S_uint_10
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %19
+         %38 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+        %arr = OpVariable %_ptr_Function__arr_S_uint_10 Function
+      %index = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_S Function
+    %param_0 = OpVariable %_ptr_Function_int Function
+    %param_1 = OpVariable %_ptr_Function_S Function
+    %param_2 = OpVariable %_ptr_Function_int Function
+               OpStore %i %int_0
+               OpBranch %39
+         %39 = OpLabel
+               OpLoopMerge %40 %41 None
+               OpBranch %42
+         %42 = OpLabel
+         %43 = OpLoad %int %i
+         %44 = OpSLessThan %bool %43 %int_10
+               OpBranchConditional %44 %45 %40
+         %45 = OpLabel
+         %46 = OpLoad %int %i
+         %47 = OpAccessChain %_ptr_Function_int %arr %46 %int_0
+               OpStore %47 %int_0
+               OpBranch %41
+         %41 = OpLabel
+         %48 = OpLoad %int %i
+         %49 = OpIAdd %int %48 %int_1
+               OpStore %i %49
+               OpBranch %39
+         %40 = OpLabel
+         %50 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %51 = OpLoad %int %50
+         %52 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %53 = OpLoad %int %52
+         %54 = OpIEqual %bool %51 %53
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %57
+         %56 = OpLabel
+         %58 = OpLoad %int %index
+         %59 = OpAccessChain %_ptr_Function_S %arr %58
+         %60 = OpLoad %S %59
+               OpStore %param %60
+         %61 = OpLoad %int %index
+               OpStore %param_0 %61
+         %62 = OpFunctionCall %void %func_struct_S_i11_i1_ %param %param_0
+         %63 = OpLoad %S %param
+         %64 = OpAccessChain %_ptr_Function_S %arr %58
+               OpStore %64 %63
+               OpBranch %55
+         %57 = OpLabel
+         %65 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %66 = OpLoad %int %65
+         %67 = OpAccessChain %_ptr_Function_S %arr %66
+         %68 = OpLoad %S %67
+               OpStore %param_1 %68
+         %69 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %70 = OpLoad %int %69
+               OpStore %param_2 %70
+         %71 = OpFunctionCall %void %func_struct_S_i11_i1_ %param_1 %param_2
+         %72 = OpLoad %S %param_1
+         %73 = OpAccessChain %_ptr_Function_S %arr %66
+               OpStore %73 %72
+               OpBranch %55
+         %55 = OpLabel
+         %74 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %75 = OpLoad %int %74
+         %76 = OpAccessChain %_ptr_Function_int %arr %75 %int_0
+         %77 = OpLoad %int %76
+         %78 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %79 = OpLoad %int %78
+         %80 = OpIEqual %bool %77 %79
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %83
+         %82 = OpLabel
+         %84 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %85 = OpLoad %int %84
+         %86 = OpConvertSToF %float %85
+         %87 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %88 = OpLoad %int %87
+         %89 = OpConvertSToF %float %88
+         %90 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %91 = OpLoad %int %90
+         %92 = OpConvertSToF %float %91
+         %93 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %94 = OpLoad %int %93
+         %95 = OpConvertSToF %float %94
+         %96 = OpCompositeConstruct %v4float %86 %89 %92 %95
+               OpStore %_GLF_color %96
+               OpBranch %81
+         %83 = OpLabel
+         %97 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %98 = OpLoad %int %97
+         %99 = OpConvertSToF %float %98
+        %100 = OpCompositeConstruct %v4float %99 %99 %99 %99
+               OpStore %_GLF_color %100
+               OpBranch %81
+         %81 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%func_struct_S_i11_i1_ = OpFunction %void None %23
+          %s = OpFunctionParameter %_ptr_Function_S
+          %x = OpFunctionParameter %_ptr_Function_int
+        %101 = OpLabel
+        %102 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+        %103 = OpLoad %int %102
+        %104 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+        %105 = OpLoad %int %104
+        %106 = OpIEqual %bool %103 %105
+               OpSelectionMerge %107 None
+               OpBranchConditional %106 %108 %107
+        %108 = OpLabel
+               OpReturn
+        %107 = OpLabel
+        %109 = OpLoad %int %x
+        %110 = OpAccessChain %_ptr_Function_int %s %int_0
+               OpStore %110 %109
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-uninitialized-values-passed-to-function-never-executed/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-uninitialized-values-passed-to-function-never-executed/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..ac091bd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-uninitialized-values-passed-to-function-never-executed/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,89 @@
+struct S {
+  int data;
+};
+
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void func_struct_S_i11_i1_(inout S s, inout int x) {
+  const int x_103 = asint(x_9[1].x);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_105 = asint(x_9[scalar_offset / 4][scalar_offset % 4]);
+  if ((x_103 == x_105)) {
+    return;
+  }
+  const int x_109 = x;
+  s.data = x_109;
+  return;
+}
+
+void main_1() {
+  int i = 0;
+  S arr[10] = (S[10])0;
+  int index = 0;
+  S param = (S)0;
+  int param_1 = 0;
+  S param_2 = (S)0;
+  int param_3 = 0;
+  i = 0;
+  {
+    for(; (i < 10); i = (i + 1)) {
+      arr[i].data = 0;
+    }
+  }
+  const int x_51 = asint(x_9[1].x);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_53 = asint(x_9[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_51 == x_53)) {
+    const int x_58 = index;
+    const S x_60 = arr[x_58];
+    param = x_60;
+    param_1 = index;
+    func_struct_S_i11_i1_(param, param_1);
+    arr[x_58] = param;
+  } else {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_66 = asint(x_9[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const S x_68 = arr[x_66];
+    param_2 = x_68;
+    const int x_70 = asint(x_9[1].x);
+    param_3 = x_70;
+    func_struct_S_i11_i1_(param_2, param_3);
+    arr[x_66] = param_2;
+  }
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const int x_75 = asint(x_9[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  const int x_77 = arr[x_75].data;
+  const int x_79 = asint(x_9[1].x);
+  if ((x_77 == x_79)) {
+    const int x_85 = asint(x_9[1].x);
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_88 = asint(x_9[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const int x_91 = asint(x_9[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    const int x_94 = asint(x_9[1].x);
+    x_GLF_color = float4(float(x_85), float(x_88), float(x_91), float(x_94));
+  } else {
+    const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+    const int x_98 = asint(x_9[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+    const float x_99 = float(x_98);
+    x_GLF_color = float4(x_99, x_99, x_99, x_99);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-uninitialized-values-passed-to-function-never-executed/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-uninitialized-values-passed-to-function-never-executed/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..34d029d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-uninitialized-values-passed-to-function-never-executed/0-opt.spvasm.expected.msl
@@ -0,0 +1,105 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  int data;
+};
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_1 {
+  S arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void func_struct_S_i11_i1_(constant buf0& x_9, thread S* const s, thread int* const x) {
+  int const x_103 = x_9.x_GLF_uniform_int_values.arr[1].el;
+  int const x_105 = x_9.x_GLF_uniform_int_values.arr[0].el;
+  if ((x_103 == x_105)) {
+    return;
+  }
+  int const x_109 = *(x);
+  (*(s)).data = x_109;
+  return;
+}
+
+void main_1(constant buf0& x_9, thread float4* const tint_symbol_4) {
+  int i = 0;
+  tint_array_wrapper_1 arr = {};
+  int index = 0;
+  S param = {};
+  int param_1 = 0;
+  S param_2 = {};
+  int param_3 = 0;
+  i = 0;
+  while (true) {
+    int const x_43 = i;
+    if ((x_43 < 10)) {
+    } else {
+      break;
+    }
+    int const x_46 = i;
+    arr.arr[x_46].data = 0;
+    {
+      int const x_48 = i;
+      i = (x_48 + 1);
+    }
+  }
+  int const x_51 = x_9.x_GLF_uniform_int_values.arr[1].el;
+  int const x_53 = x_9.x_GLF_uniform_int_values.arr[0].el;
+  if ((x_51 == x_53)) {
+    int const x_58 = index;
+    S const x_60 = arr.arr[x_58];
+    param = x_60;
+    int const x_61 = index;
+    param_1 = x_61;
+    func_struct_S_i11_i1_(x_9, &(param), &(param_1));
+    S const x_63 = param;
+    arr.arr[x_58] = x_63;
+  } else {
+    int const x_66 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    S const x_68 = arr.arr[x_66];
+    param_2 = x_68;
+    int const x_70 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    param_3 = x_70;
+    func_struct_S_i11_i1_(x_9, &(param_2), &(param_3));
+    S const x_72 = param_2;
+    arr.arr[x_66] = x_72;
+  }
+  int const x_75 = x_9.x_GLF_uniform_int_values.arr[0].el;
+  int const x_77 = arr.arr[x_75].data;
+  int const x_79 = x_9.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_77 == x_79)) {
+    int const x_85 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_88 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    int const x_91 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    int const x_94 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_85), float(x_88), float(x_91), float(x_94));
+  } else {
+    int const x_98 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    float const x_99 = float(x_98);
+    *(tint_symbol_4) = float4(x_99, x_99, x_99, x_99);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-uninitialized-values-passed-to-function-never-executed/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-uninitialized-values-passed-to-function-never-executed/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..85eaf66
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-uninitialized-values-passed-to-function-never-executed/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,213 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 137
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %S "S"
+               OpMemberName %S 0 "data"
+               OpName %func_struct_S_i11_i1_ "func_struct_S_i11_i1_"
+               OpName %s "s"
+               OpName %x "x"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %arr "arr"
+               OpName %index "index"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %_arr_S_uint_10 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+          %S = OpTypeStruct %int
+%_ptr_Function_S = OpTypePointer Function %S
+%_ptr_Function_int = OpTypePointer Function %int
+         %15 = OpTypeFunction %void %_ptr_Function_S %_ptr_Function_int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+         %40 = OpTypeFunction %void
+         %44 = OpConstantNull %int
+    %uint_10 = OpConstant %uint 10
+%_arr_S_uint_10 = OpTypeArray %S %uint_10
+%_ptr_Function__arr_S_uint_10 = OpTypePointer Function %_arr_S_uint_10
+         %49 = OpConstantNull %_arr_S_uint_10
+         %52 = OpConstantNull %S
+     %int_10 = OpConstant %int 10
+   %main_out = OpTypeStruct %v4float
+        %125 = OpTypeFunction %void %main_out
+%func_struct_S_i11_i1_ = OpFunction %void None %15
+          %s = OpFunctionParameter %_ptr_Function_S
+          %x = OpFunctionParameter %_ptr_Function_int
+         %23 = OpLabel
+         %27 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %28 = OpLoad %int %27
+         %30 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %31 = OpLoad %int %30
+         %32 = OpIEqual %bool %28 %31
+               OpSelectionMerge %34 None
+               OpBranchConditional %32 %35 %34
+         %35 = OpLabel
+               OpReturn
+         %34 = OpLabel
+         %37 = OpLoad %int %x
+         %39 = OpAccessChain %_ptr_Function_int %s %uint_0
+               OpStore %39 %37
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %40
+         %42 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %44
+        %arr = OpVariable %_ptr_Function__arr_S_uint_10 Function %49
+      %index = OpVariable %_ptr_Function_int Function %44
+      %param = OpVariable %_ptr_Function_S Function %52
+    %param_1 = OpVariable %_ptr_Function_int Function %44
+    %param_2 = OpVariable %_ptr_Function_S Function %52
+    %param_3 = OpVariable %_ptr_Function_int Function %44
+               OpStore %i %int_0
+               OpBranch %56
+         %56 = OpLabel
+               OpLoopMerge %57 %58 None
+               OpBranch %59
+         %59 = OpLabel
+         %60 = OpLoad %int %i
+         %62 = OpSLessThan %bool %60 %int_10
+               OpSelectionMerge %63 None
+               OpBranchConditional %62 %64 %65
+         %64 = OpLabel
+               OpBranch %63
+         %65 = OpLabel
+               OpBranch %57
+         %63 = OpLabel
+         %66 = OpLoad %int %i
+         %67 = OpAccessChain %_ptr_Function_int %arr %66 %uint_0
+               OpStore %67 %int_0
+               OpBranch %58
+         %58 = OpLabel
+         %68 = OpLoad %int %i
+         %69 = OpIAdd %int %68 %int_1
+               OpStore %i %69
+               OpBranch %56
+         %57 = OpLabel
+         %70 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %71 = OpLoad %int %70
+         %72 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %73 = OpLoad %int %72
+         %74 = OpIEqual %bool %71 %73
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %77
+         %76 = OpLabel
+         %78 = OpLoad %int %index
+         %79 = OpAccessChain %_ptr_Function_S %arr %78
+         %80 = OpLoad %S %79
+               OpStore %param %80
+         %81 = OpLoad %int %index
+               OpStore %param_1 %81
+         %82 = OpFunctionCall %void %func_struct_S_i11_i1_ %param %param_1
+         %85 = OpLoad %S %param
+         %86 = OpAccessChain %_ptr_Function_S %arr %78
+               OpStore %86 %85
+               OpBranch %75
+         %77 = OpLabel
+         %87 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %88 = OpLoad %int %87
+         %89 = OpAccessChain %_ptr_Function_S %arr %88
+         %90 = OpLoad %S %89
+               OpStore %param_2 %90
+         %91 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %92 = OpLoad %int %91
+               OpStore %param_3 %92
+         %93 = OpFunctionCall %void %func_struct_S_i11_i1_ %param_2 %param_3
+         %96 = OpLoad %S %param_2
+         %97 = OpAccessChain %_ptr_Function_S %arr %88
+               OpStore %97 %96
+               OpBranch %75
+         %75 = OpLabel
+         %98 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %99 = OpLoad %int %98
+        %100 = OpAccessChain %_ptr_Function_int %arr %99 %uint_0
+        %101 = OpLoad %int %100
+        %102 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+        %103 = OpLoad %int %102
+        %104 = OpIEqual %bool %101 %103
+               OpSelectionMerge %105 None
+               OpBranchConditional %104 %106 %107
+        %106 = OpLabel
+        %108 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+        %109 = OpLoad %int %108
+        %110 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+        %111 = OpLoad %int %110
+        %112 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+        %113 = OpLoad %int %112
+        %114 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+        %115 = OpLoad %int %114
+        %116 = OpConvertSToF %float %109
+        %117 = OpConvertSToF %float %111
+        %118 = OpConvertSToF %float %113
+        %119 = OpConvertSToF %float %115
+        %120 = OpCompositeConstruct %v4float %116 %117 %118 %119
+               OpStore %x_GLF_color %120
+               OpBranch %105
+        %107 = OpLabel
+        %121 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+        %122 = OpLoad %int %121
+        %123 = OpConvertSToF %float %122
+        %124 = OpCompositeConstruct %v4float %123 %123 %123 %123
+               OpStore %x_GLF_color %124
+               OpBranch %105
+        %105 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %125
+%tint_symbol = OpFunctionParameter %main_out
+        %129 = OpLabel
+        %130 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %130
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %40
+        %132 = OpLabel
+        %133 = OpFunctionCall %void %main_1
+        %135 = OpLoad %v4float %x_GLF_color
+        %136 = OpCompositeConstruct %main_out %135
+        %134 = OpFunctionCall %void %tint_symbol_2 %136
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-uninitialized-values-passed-to-function-never-executed/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-uninitialized-values-passed-to-function-never-executed/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..b1a8e78
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-uninitialized-values-passed-to-function-never-executed/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,97 @@
+struct S {
+  data : i32;
+};
+
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_struct_S_i11_i1_(s : ptr<function, S>, x : ptr<function, i32>) {
+  let x_103 : i32 = x_9.x_GLF_uniform_int_values[1];
+  let x_105 : i32 = x_9.x_GLF_uniform_int_values[0];
+  if ((x_103 == x_105)) {
+    return;
+  }
+  let x_109 : i32 = *(x);
+  (*(s)).data = x_109;
+  return;
+}
+
+fn main_1() {
+  var i : i32;
+  var arr : array<S, 10>;
+  var index : i32;
+  var param : S;
+  var param_1 : i32;
+  var param_2 : S;
+  var param_3 : i32;
+  i = 0;
+  loop {
+    let x_43 : i32 = i;
+    if ((x_43 < 10)) {
+    } else {
+      break;
+    }
+    let x_46 : i32 = i;
+    arr[x_46].data = 0;
+
+    continuing {
+      let x_48 : i32 = i;
+      i = (x_48 + 1);
+    }
+  }
+  let x_51 : i32 = x_9.x_GLF_uniform_int_values[1];
+  let x_53 : i32 = x_9.x_GLF_uniform_int_values[0];
+  if ((x_51 == x_53)) {
+    let x_58 : i32 = index;
+    let x_60 : S = arr[x_58];
+    param = x_60;
+    let x_61 : i32 = index;
+    param_1 = x_61;
+    func_struct_S_i11_i1_(&(param), &(param_1));
+    let x_63 : S = param;
+    arr[x_58] = x_63;
+  } else {
+    let x_66 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_68 : S = arr[x_66];
+    param_2 = x_68;
+    let x_70 : i32 = x_9.x_GLF_uniform_int_values[1];
+    param_3 = x_70;
+    func_struct_S_i11_i1_(&(param_2), &(param_3));
+    let x_72 : S = param_2;
+    arr[x_66] = x_72;
+  }
+  let x_75 : i32 = x_9.x_GLF_uniform_int_values[0];
+  let x_77 : i32 = arr[x_75].data;
+  let x_79 : i32 = x_9.x_GLF_uniform_int_values[1];
+  if ((x_77 == x_79)) {
+    let x_85 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_88 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_91 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_94 : i32 = x_9.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_85), f32(x_88), f32(x_91), f32(x_94));
+  } else {
+    let x_98 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_99 : f32 = f32(x_98);
+    x_GLF_color = vec4<f32>(x_99, x_99, x_99, x_99);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-uninitialized-values-passed-to-function-never-executed/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-uninitialized-values-passed-to-function-never-executed/0-opt.wgsl
new file mode 100644
index 0000000..b1a8e78
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-uninitialized-values-passed-to-function-never-executed/0-opt.wgsl
@@ -0,0 +1,97 @@
+struct S {
+  data : i32;
+};
+
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_struct_S_i11_i1_(s : ptr<function, S>, x : ptr<function, i32>) {
+  let x_103 : i32 = x_9.x_GLF_uniform_int_values[1];
+  let x_105 : i32 = x_9.x_GLF_uniform_int_values[0];
+  if ((x_103 == x_105)) {
+    return;
+  }
+  let x_109 : i32 = *(x);
+  (*(s)).data = x_109;
+  return;
+}
+
+fn main_1() {
+  var i : i32;
+  var arr : array<S, 10>;
+  var index : i32;
+  var param : S;
+  var param_1 : i32;
+  var param_2 : S;
+  var param_3 : i32;
+  i = 0;
+  loop {
+    let x_43 : i32 = i;
+    if ((x_43 < 10)) {
+    } else {
+      break;
+    }
+    let x_46 : i32 = i;
+    arr[x_46].data = 0;
+
+    continuing {
+      let x_48 : i32 = i;
+      i = (x_48 + 1);
+    }
+  }
+  let x_51 : i32 = x_9.x_GLF_uniform_int_values[1];
+  let x_53 : i32 = x_9.x_GLF_uniform_int_values[0];
+  if ((x_51 == x_53)) {
+    let x_58 : i32 = index;
+    let x_60 : S = arr[x_58];
+    param = x_60;
+    let x_61 : i32 = index;
+    param_1 = x_61;
+    func_struct_S_i11_i1_(&(param), &(param_1));
+    let x_63 : S = param;
+    arr[x_58] = x_63;
+  } else {
+    let x_66 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_68 : S = arr[x_66];
+    param_2 = x_68;
+    let x_70 : i32 = x_9.x_GLF_uniform_int_values[1];
+    param_3 = x_70;
+    func_struct_S_i11_i1_(&(param_2), &(param_3));
+    let x_72 : S = param_2;
+    arr[x_66] = x_72;
+  }
+  let x_75 : i32 = x_9.x_GLF_uniform_int_values[0];
+  let x_77 : i32 = arr[x_75].data;
+  let x_79 : i32 = x_9.x_GLF_uniform_int_values[1];
+  if ((x_77 == x_79)) {
+    let x_85 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_88 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_91 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_94 : i32 = x_9.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_85), f32(x_88), f32(x_91), f32(x_94));
+  } else {
+    let x_98 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_99 : f32 = f32(x_98);
+    x_GLF_color = vec4<f32>(x_99, x_99, x_99, x_99);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-uninitialized-values-passed-to-function-never-executed/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-uninitialized-values-passed-to-function-never-executed/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..ac091bd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-uninitialized-values-passed-to-function-never-executed/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,89 @@
+struct S {
+  int data;
+};
+
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void func_struct_S_i11_i1_(inout S s, inout int x) {
+  const int x_103 = asint(x_9[1].x);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_105 = asint(x_9[scalar_offset / 4][scalar_offset % 4]);
+  if ((x_103 == x_105)) {
+    return;
+  }
+  const int x_109 = x;
+  s.data = x_109;
+  return;
+}
+
+void main_1() {
+  int i = 0;
+  S arr[10] = (S[10])0;
+  int index = 0;
+  S param = (S)0;
+  int param_1 = 0;
+  S param_2 = (S)0;
+  int param_3 = 0;
+  i = 0;
+  {
+    for(; (i < 10); i = (i + 1)) {
+      arr[i].data = 0;
+    }
+  }
+  const int x_51 = asint(x_9[1].x);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_53 = asint(x_9[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_51 == x_53)) {
+    const int x_58 = index;
+    const S x_60 = arr[x_58];
+    param = x_60;
+    param_1 = index;
+    func_struct_S_i11_i1_(param, param_1);
+    arr[x_58] = param;
+  } else {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_66 = asint(x_9[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const S x_68 = arr[x_66];
+    param_2 = x_68;
+    const int x_70 = asint(x_9[1].x);
+    param_3 = x_70;
+    func_struct_S_i11_i1_(param_2, param_3);
+    arr[x_66] = param_2;
+  }
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const int x_75 = asint(x_9[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  const int x_77 = arr[x_75].data;
+  const int x_79 = asint(x_9[1].x);
+  if ((x_77 == x_79)) {
+    const int x_85 = asint(x_9[1].x);
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_88 = asint(x_9[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const int x_91 = asint(x_9[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    const int x_94 = asint(x_9[1].x);
+    x_GLF_color = float4(float(x_85), float(x_88), float(x_91), float(x_94));
+  } else {
+    const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+    const int x_98 = asint(x_9[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+    const float x_99 = float(x_98);
+    x_GLF_color = float4(x_99, x_99, x_99, x_99);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-uninitialized-values-passed-to-function-never-executed/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-uninitialized-values-passed-to-function-never-executed/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..34d029d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-uninitialized-values-passed-to-function-never-executed/0-opt.wgsl.expected.msl
@@ -0,0 +1,105 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  int data;
+};
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_1 {
+  S arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void func_struct_S_i11_i1_(constant buf0& x_9, thread S* const s, thread int* const x) {
+  int const x_103 = x_9.x_GLF_uniform_int_values.arr[1].el;
+  int const x_105 = x_9.x_GLF_uniform_int_values.arr[0].el;
+  if ((x_103 == x_105)) {
+    return;
+  }
+  int const x_109 = *(x);
+  (*(s)).data = x_109;
+  return;
+}
+
+void main_1(constant buf0& x_9, thread float4* const tint_symbol_4) {
+  int i = 0;
+  tint_array_wrapper_1 arr = {};
+  int index = 0;
+  S param = {};
+  int param_1 = 0;
+  S param_2 = {};
+  int param_3 = 0;
+  i = 0;
+  while (true) {
+    int const x_43 = i;
+    if ((x_43 < 10)) {
+    } else {
+      break;
+    }
+    int const x_46 = i;
+    arr.arr[x_46].data = 0;
+    {
+      int const x_48 = i;
+      i = (x_48 + 1);
+    }
+  }
+  int const x_51 = x_9.x_GLF_uniform_int_values.arr[1].el;
+  int const x_53 = x_9.x_GLF_uniform_int_values.arr[0].el;
+  if ((x_51 == x_53)) {
+    int const x_58 = index;
+    S const x_60 = arr.arr[x_58];
+    param = x_60;
+    int const x_61 = index;
+    param_1 = x_61;
+    func_struct_S_i11_i1_(x_9, &(param), &(param_1));
+    S const x_63 = param;
+    arr.arr[x_58] = x_63;
+  } else {
+    int const x_66 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    S const x_68 = arr.arr[x_66];
+    param_2 = x_68;
+    int const x_70 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    param_3 = x_70;
+    func_struct_S_i11_i1_(x_9, &(param_2), &(param_3));
+    S const x_72 = param_2;
+    arr.arr[x_66] = x_72;
+  }
+  int const x_75 = x_9.x_GLF_uniform_int_values.arr[0].el;
+  int const x_77 = arr.arr[x_75].data;
+  int const x_79 = x_9.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_77 == x_79)) {
+    int const x_85 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_88 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    int const x_91 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    int const x_94 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_85), float(x_88), float(x_91), float(x_94));
+  } else {
+    int const x_98 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    float const x_99 = float(x_98);
+    *(tint_symbol_4) = float4(x_99, x_99, x_99, x_99);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-uninitialized-values-passed-to-function-never-executed/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-uninitialized-values-passed-to-function-never-executed/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..85eaf66
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-uninitialized-values-passed-to-function-never-executed/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,213 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 137
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %S "S"
+               OpMemberName %S 0 "data"
+               OpName %func_struct_S_i11_i1_ "func_struct_S_i11_i1_"
+               OpName %s "s"
+               OpName %x "x"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %arr "arr"
+               OpName %index "index"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %_arr_S_uint_10 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+          %S = OpTypeStruct %int
+%_ptr_Function_S = OpTypePointer Function %S
+%_ptr_Function_int = OpTypePointer Function %int
+         %15 = OpTypeFunction %void %_ptr_Function_S %_ptr_Function_int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+         %40 = OpTypeFunction %void
+         %44 = OpConstantNull %int
+    %uint_10 = OpConstant %uint 10
+%_arr_S_uint_10 = OpTypeArray %S %uint_10
+%_ptr_Function__arr_S_uint_10 = OpTypePointer Function %_arr_S_uint_10
+         %49 = OpConstantNull %_arr_S_uint_10
+         %52 = OpConstantNull %S
+     %int_10 = OpConstant %int 10
+   %main_out = OpTypeStruct %v4float
+        %125 = OpTypeFunction %void %main_out
+%func_struct_S_i11_i1_ = OpFunction %void None %15
+          %s = OpFunctionParameter %_ptr_Function_S
+          %x = OpFunctionParameter %_ptr_Function_int
+         %23 = OpLabel
+         %27 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %28 = OpLoad %int %27
+         %30 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %31 = OpLoad %int %30
+         %32 = OpIEqual %bool %28 %31
+               OpSelectionMerge %34 None
+               OpBranchConditional %32 %35 %34
+         %35 = OpLabel
+               OpReturn
+         %34 = OpLabel
+         %37 = OpLoad %int %x
+         %39 = OpAccessChain %_ptr_Function_int %s %uint_0
+               OpStore %39 %37
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %40
+         %42 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %44
+        %arr = OpVariable %_ptr_Function__arr_S_uint_10 Function %49
+      %index = OpVariable %_ptr_Function_int Function %44
+      %param = OpVariable %_ptr_Function_S Function %52
+    %param_1 = OpVariable %_ptr_Function_int Function %44
+    %param_2 = OpVariable %_ptr_Function_S Function %52
+    %param_3 = OpVariable %_ptr_Function_int Function %44
+               OpStore %i %int_0
+               OpBranch %56
+         %56 = OpLabel
+               OpLoopMerge %57 %58 None
+               OpBranch %59
+         %59 = OpLabel
+         %60 = OpLoad %int %i
+         %62 = OpSLessThan %bool %60 %int_10
+               OpSelectionMerge %63 None
+               OpBranchConditional %62 %64 %65
+         %64 = OpLabel
+               OpBranch %63
+         %65 = OpLabel
+               OpBranch %57
+         %63 = OpLabel
+         %66 = OpLoad %int %i
+         %67 = OpAccessChain %_ptr_Function_int %arr %66 %uint_0
+               OpStore %67 %int_0
+               OpBranch %58
+         %58 = OpLabel
+         %68 = OpLoad %int %i
+         %69 = OpIAdd %int %68 %int_1
+               OpStore %i %69
+               OpBranch %56
+         %57 = OpLabel
+         %70 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %71 = OpLoad %int %70
+         %72 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %73 = OpLoad %int %72
+         %74 = OpIEqual %bool %71 %73
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %77
+         %76 = OpLabel
+         %78 = OpLoad %int %index
+         %79 = OpAccessChain %_ptr_Function_S %arr %78
+         %80 = OpLoad %S %79
+               OpStore %param %80
+         %81 = OpLoad %int %index
+               OpStore %param_1 %81
+         %82 = OpFunctionCall %void %func_struct_S_i11_i1_ %param %param_1
+         %85 = OpLoad %S %param
+         %86 = OpAccessChain %_ptr_Function_S %arr %78
+               OpStore %86 %85
+               OpBranch %75
+         %77 = OpLabel
+         %87 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %88 = OpLoad %int %87
+         %89 = OpAccessChain %_ptr_Function_S %arr %88
+         %90 = OpLoad %S %89
+               OpStore %param_2 %90
+         %91 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+         %92 = OpLoad %int %91
+               OpStore %param_3 %92
+         %93 = OpFunctionCall %void %func_struct_S_i11_i1_ %param_2 %param_3
+         %96 = OpLoad %S %param_2
+         %97 = OpAccessChain %_ptr_Function_S %arr %88
+               OpStore %97 %96
+               OpBranch %75
+         %75 = OpLabel
+         %98 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %99 = OpLoad %int %98
+        %100 = OpAccessChain %_ptr_Function_int %arr %99 %uint_0
+        %101 = OpLoad %int %100
+        %102 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+        %103 = OpLoad %int %102
+        %104 = OpIEqual %bool %101 %103
+               OpSelectionMerge %105 None
+               OpBranchConditional %104 %106 %107
+        %106 = OpLabel
+        %108 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+        %109 = OpLoad %int %108
+        %110 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+        %111 = OpLoad %int %110
+        %112 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+        %113 = OpLoad %int %112
+        %114 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+        %115 = OpLoad %int %114
+        %116 = OpConvertSToF %float %109
+        %117 = OpConvertSToF %float %111
+        %118 = OpConvertSToF %float %113
+        %119 = OpConvertSToF %float %115
+        %120 = OpCompositeConstruct %v4float %116 %117 %118 %119
+               OpStore %x_GLF_color %120
+               OpBranch %105
+        %107 = OpLabel
+        %121 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+        %122 = OpLoad %int %121
+        %123 = OpConvertSToF %float %122
+        %124 = OpCompositeConstruct %v4float %123 %123 %123 %123
+               OpStore %x_GLF_color %124
+               OpBranch %105
+        %105 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %125
+%tint_symbol = OpFunctionParameter %main_out
+        %129 = OpLabel
+        %130 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %130
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %40
+        %132 = OpLabel
+        %133 = OpFunctionCall %void %main_1
+        %135 = OpLoad %v4float %x_GLF_color
+        %136 = OpCompositeConstruct %main_out %135
+        %134 = OpFunctionCall %void %tint_symbol_2 %136
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-uninitialized-values-passed-to-function-never-executed/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-uninitialized-values-passed-to-function-never-executed/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..b1a8e78
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-uninitialized-values-passed-to-function-never-executed/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,97 @@
+struct S {
+  data : i32;
+};
+
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_struct_S_i11_i1_(s : ptr<function, S>, x : ptr<function, i32>) {
+  let x_103 : i32 = x_9.x_GLF_uniform_int_values[1];
+  let x_105 : i32 = x_9.x_GLF_uniform_int_values[0];
+  if ((x_103 == x_105)) {
+    return;
+  }
+  let x_109 : i32 = *(x);
+  (*(s)).data = x_109;
+  return;
+}
+
+fn main_1() {
+  var i : i32;
+  var arr : array<S, 10>;
+  var index : i32;
+  var param : S;
+  var param_1 : i32;
+  var param_2 : S;
+  var param_3 : i32;
+  i = 0;
+  loop {
+    let x_43 : i32 = i;
+    if ((x_43 < 10)) {
+    } else {
+      break;
+    }
+    let x_46 : i32 = i;
+    arr[x_46].data = 0;
+
+    continuing {
+      let x_48 : i32 = i;
+      i = (x_48 + 1);
+    }
+  }
+  let x_51 : i32 = x_9.x_GLF_uniform_int_values[1];
+  let x_53 : i32 = x_9.x_GLF_uniform_int_values[0];
+  if ((x_51 == x_53)) {
+    let x_58 : i32 = index;
+    let x_60 : S = arr[x_58];
+    param = x_60;
+    let x_61 : i32 = index;
+    param_1 = x_61;
+    func_struct_S_i11_i1_(&(param), &(param_1));
+    let x_63 : S = param;
+    arr[x_58] = x_63;
+  } else {
+    let x_66 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_68 : S = arr[x_66];
+    param_2 = x_68;
+    let x_70 : i32 = x_9.x_GLF_uniform_int_values[1];
+    param_3 = x_70;
+    func_struct_S_i11_i1_(&(param_2), &(param_3));
+    let x_72 : S = param_2;
+    arr[x_66] = x_72;
+  }
+  let x_75 : i32 = x_9.x_GLF_uniform_int_values[0];
+  let x_77 : i32 = arr[x_75].data;
+  let x_79 : i32 = x_9.x_GLF_uniform_int_values[1];
+  if ((x_77 == x_79)) {
+    let x_85 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_88 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_91 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_94 : i32 = x_9.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_85), f32(x_88), f32(x_91), f32(x_94));
+  } else {
+    let x_98 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_99 : f32 = f32(x_98);
+    x_GLF_color = vec4<f32>(x_99, x_99, x_99, x_99);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-unpack-unorm-mix-always-one/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-unpack-unorm-mix-always-one/0-opt.spvasm
new file mode 100644
index 0000000..0c0c766
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-unpack-unorm-mix-always-one/0-opt.spvasm
@@ -0,0 +1,126 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %v "v"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_uint_values"
+               OpName %_ ""
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "_GLF_uniform_float_values"
+               OpName %__1 ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_uint_uint_1 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %buf2 Block
+               OpDecorate %__1 DescriptorSet 0
+               OpDecorate %__1 Binding 2
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_uint_uint_1 = OpTypeArray %uint %uint_1
+       %buf0 = OpTypeStruct %_arr_uint_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+ %uint_92382 = OpConstant %uint 92382
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf2 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+        %__1 = OpVariable %_ptr_Uniform_buf2 Uniform
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_2 = OpConstant %int 2
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %15
+         %37 = OpLabel
+          %v = OpVariable %_ptr_Function_v4float Function
+         %38 = OpAccessChain %_ptr_Uniform_uint %_ %int_0 %int_0
+         %39 = OpLoad %uint %38
+         %40 = OpAccessChain %_ptr_Uniform_uint %_ %int_0 %int_0
+         %41 = OpLoad %uint %40
+         %42 = OpSelect %uint %true %uint_92382 %41
+         %43 = OpUDiv %uint %39 %42
+         %44 = OpExtInst %v4float %1 UnpackUnorm4x8 %43
+               OpStore %v %44
+         %45 = OpLoad %v4float %v
+         %46 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %47 = OpLoad %int %46
+         %48 = OpConvertSToF %float %47
+         %49 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %50 = OpLoad %int %49
+         %51 = OpConvertSToF %float %50
+         %52 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %53 = OpLoad %int %52
+         %54 = OpConvertSToF %float %53
+         %55 = OpAccessChain %_ptr_Uniform_float %__1 %int_0 %int_1
+         %56 = OpLoad %float %55
+         %57 = OpAccessChain %_ptr_Uniform_float %__1 %int_0 %int_2
+         %58 = OpLoad %float %57
+         %59 = OpFDiv %float %56 %58
+         %60 = OpCompositeConstruct %v4float %48 %51 %54 %59
+         %61 = OpExtInst %float %1 Distance %45 %60
+         %62 = OpAccessChain %_ptr_Uniform_float %__1 %int_0 %int_0
+         %63 = OpLoad %float %62
+         %64 = OpFOrdLessThan %bool %61 %63
+               OpSelectionMerge %65 None
+               OpBranchConditional %64 %66 %67
+         %66 = OpLabel
+         %68 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %69 = OpLoad %int %68
+         %70 = OpConvertSToF %float %69
+         %71 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %72 = OpLoad %int %71
+         %73 = OpConvertSToF %float %72
+         %74 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %75 = OpLoad %int %74
+         %76 = OpConvertSToF %float %75
+         %77 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %78 = OpLoad %int %77
+         %79 = OpConvertSToF %float %78
+         %80 = OpCompositeConstruct %v4float %70 %73 %76 %79
+               OpStore %_GLF_color %80
+               OpBranch %65
+         %67 = OpLabel
+         %81 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %82 = OpLoad %int %81
+         %83 = OpConvertSToF %float %82
+         %84 = OpCompositeConstruct %v4float %83 %83 %83 %83
+               OpStore %_GLF_color %84
+               OpBranch %65
+         %65 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-unpack-unorm-mix-always-one/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-unpack-unorm-mix-always-one/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..3a0af57
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-unpack-unorm-mix-always-one/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,65 @@
+float4 tint_unpack4x8unorm(uint param_0) {
+  uint j = param_0;
+  uint4 i = uint4(j & 0xff, (j >> 8) & 0xff, (j >> 16) & 0xff, j >> 24);
+  return float4(i) / 255.0;
+}
+
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[2];
+};
+cbuffer cbuffer_x_10 : register(b2, space0) {
+  uint4 x_10[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 v = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const uint x_39 = x_6[scalar_offset / 4][scalar_offset % 4];
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const uint x_41 = x_6[scalar_offset_1 / 4][scalar_offset_1 % 4];
+  v = tint_unpack4x8unorm((x_39 / (true ? 92382u : x_41)));
+  const float4 x_45 = v;
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const int x_47 = asint(x_8[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const int x_50 = asint(x_8[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+  const int x_53 = asint(x_8[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+  const float x_56 = asfloat(x_10[1].x);
+  const float x_58 = asfloat(x_10[2].x);
+  const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+  const float x_63 = asfloat(x_10[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+  if ((distance(x_45, float4(float(x_47), float(x_50), float(x_53), (x_56 / x_58))) < x_63)) {
+    const int x_69 = asint(x_8[1].x);
+    const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+    const int x_72 = asint(x_8[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+    const uint scalar_offset_7 = ((16u * uint(0))) / 4;
+    const int x_75 = asint(x_8[scalar_offset_7 / 4][scalar_offset_7 % 4]);
+    const int x_78 = asint(x_8[1].x);
+    x_GLF_color = float4(float(x_69), float(x_72), float(x_75), float(x_78));
+  } else {
+    const uint scalar_offset_8 = ((16u * uint(0))) / 4;
+    const int x_82 = asint(x_8[scalar_offset_8 / 4][scalar_offset_8 % 4]);
+    const float x_83 = float(x_82);
+    x_GLF_color = float4(x_83, x_83, x_83, x_83);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-unpack-unorm-mix-always-one/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-unpack-unorm-mix-always-one/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..1f2929c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-unpack-unorm-mix-always-one/0-opt.spvasm.expected.msl
@@ -0,0 +1,74 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ uint el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_uint_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_2 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_2[12];
+};
+struct tint_array_wrapper_2 {
+  /* 0x0000 */ tint_padded_array_element_2 arr[3];
+};
+struct buf2 {
+  /* 0x0000 */ tint_array_wrapper_2 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_8, constant buf2& x_10, thread float4* const tint_symbol_4) {
+  float4 v = 0.0f;
+  uint const x_39 = x_6.x_GLF_uniform_uint_values.arr[0].el;
+  uint const x_41 = x_6.x_GLF_uniform_uint_values.arr[0].el;
+  v = unpack_unorm4x8_to_float((x_39 / select(x_41, 92382u, true)));
+  float4 const x_45 = v;
+  int const x_47 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  int const x_50 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  int const x_53 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  float const x_56 = x_10.x_GLF_uniform_float_values.arr[1].el;
+  float const x_58 = x_10.x_GLF_uniform_float_values.arr[2].el;
+  float const x_63 = x_10.x_GLF_uniform_float_values.arr[0].el;
+  if ((distance(x_45, float4(float(x_47), float(x_50), float(x_53), (x_56 / x_58))) < x_63)) {
+    int const x_69 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    int const x_72 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    int const x_75 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    int const x_78 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_69), float(x_72), float(x_75), float(x_78));
+  } else {
+    int const x_82 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    float const x_83 = float(x_82);
+    *(tint_symbol_4) = float4(x_83, x_83, x_83, x_83);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_8 [[buffer(1)]], constant buf2& x_10 [[buffer(2)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-unpack-unorm-mix-always-one/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-unpack-unorm-mix-always-one/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..0727549
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-unpack-unorm-mix-always-one/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,161 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 101
+; Schema: 0
+               OpCapability Shader
+         %39 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_uint_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_8 "x_8"
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "x_GLF_uniform_float_values"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v "v"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_uint_uint_1 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %buf2 Block
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 2
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_uint_uint_1 = OpTypeArray %uint %uint_1
+       %buf0 = OpTypeStruct %_arr_uint_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %float = OpTypeFloat 32
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf2 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+       %x_10 = OpVariable %_ptr_Uniform_buf2 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %22 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %22
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %22
+       %void = OpTypeVoid
+         %25 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+ %uint_92382 = OpConstant %uint 92382
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+         %89 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %25
+         %28 = OpLabel
+          %v = OpVariable %_ptr_Function_v4float Function %22
+         %34 = OpAccessChain %_ptr_Uniform_uint %x_6 %uint_0 %int_0
+         %35 = OpLoad %uint %34
+         %36 = OpAccessChain %_ptr_Uniform_uint %x_6 %uint_0 %int_0
+         %37 = OpLoad %uint %36
+         %40 = OpSelect %uint %true %uint_92382 %37
+         %44 = OpUDiv %uint %35 %40
+         %38 = OpExtInst %v4float %39 UnpackUnorm4x8 %44
+               OpStore %v %38
+         %45 = OpLoad %v4float %v
+         %47 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %48 = OpLoad %int %47
+         %49 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %50 = OpLoad %int %49
+         %51 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %52 = OpLoad %int %51
+         %55 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_1
+         %56 = OpLoad %float %55
+         %58 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_2
+         %59 = OpLoad %float %58
+         %60 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_0
+         %61 = OpLoad %float %60
+         %63 = OpConvertSToF %float %48
+         %64 = OpConvertSToF %float %50
+         %65 = OpConvertSToF %float %52
+         %66 = OpFDiv %float %56 %59
+         %67 = OpCompositeConstruct %v4float %63 %64 %65 %66
+         %62 = OpExtInst %float %39 Distance %45 %67
+         %68 = OpFOrdLessThan %bool %62 %61
+               OpSelectionMerge %69 None
+               OpBranchConditional %68 %70 %71
+         %70 = OpLabel
+         %72 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %73 = OpLoad %int %72
+         %74 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %75 = OpLoad %int %74
+         %76 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %77 = OpLoad %int %76
+         %78 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %79 = OpLoad %int %78
+         %80 = OpConvertSToF %float %73
+         %81 = OpConvertSToF %float %75
+         %82 = OpConvertSToF %float %77
+         %83 = OpConvertSToF %float %79
+         %84 = OpCompositeConstruct %v4float %80 %81 %82 %83
+               OpStore %x_GLF_color %84
+               OpBranch %69
+         %71 = OpLabel
+         %85 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %86 = OpLoad %int %85
+         %87 = OpConvertSToF %float %86
+         %88 = OpCompositeConstruct %v4float %87 %87 %87 %87
+               OpStore %x_GLF_color %88
+               OpBranch %69
+         %69 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %89
+%tint_symbol = OpFunctionParameter %main_out
+         %93 = OpLabel
+         %94 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %94
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %25
+         %96 = OpLabel
+         %97 = OpFunctionCall %void %main_1
+         %99 = OpLoad %v4float %x_GLF_color
+        %100 = OpCompositeConstruct %main_out %99
+         %98 = OpFunctionCall %void %tint_symbol_2 %100
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-unpack-unorm-mix-always-one/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-unpack-unorm-mix-always-one/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..b44947b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-unpack-unorm-mix-always-one/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,65 @@
+type Arr = [[stride(16)]] array<u32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_uint_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+type Arr_2 = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf2 {
+  x_GLF_uniform_float_values : Arr_2;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+[[group(0), binding(2)]] var<uniform> x_10 : buf2;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v : vec4<f32>;
+  let x_39 : u32 = x_6.x_GLF_uniform_uint_values[0];
+  let x_41 : u32 = x_6.x_GLF_uniform_uint_values[0];
+  v = unpack4x8unorm((x_39 / select(x_41, 92382u, true)));
+  let x_45 : vec4<f32> = v;
+  let x_47 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_50 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_53 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_56 : f32 = x_10.x_GLF_uniform_float_values[1];
+  let x_58 : f32 = x_10.x_GLF_uniform_float_values[2];
+  let x_63 : f32 = x_10.x_GLF_uniform_float_values[0];
+  if ((distance(x_45, vec4<f32>(f32(x_47), f32(x_50), f32(x_53), (x_56 / x_58))) < x_63)) {
+    let x_69 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_72 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_75 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_78 : i32 = x_8.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_69), f32(x_72), f32(x_75), f32(x_78));
+  } else {
+    let x_82 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_83 : f32 = f32(x_82);
+    x_GLF_color = vec4<f32>(x_83, x_83, x_83, x_83);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-unpack-unorm-mix-always-one/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-unpack-unorm-mix-always-one/0-opt.wgsl
new file mode 100644
index 0000000..b44947b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-unpack-unorm-mix-always-one/0-opt.wgsl
@@ -0,0 +1,65 @@
+type Arr = [[stride(16)]] array<u32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_uint_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+type Arr_2 = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf2 {
+  x_GLF_uniform_float_values : Arr_2;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+[[group(0), binding(2)]] var<uniform> x_10 : buf2;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v : vec4<f32>;
+  let x_39 : u32 = x_6.x_GLF_uniform_uint_values[0];
+  let x_41 : u32 = x_6.x_GLF_uniform_uint_values[0];
+  v = unpack4x8unorm((x_39 / select(x_41, 92382u, true)));
+  let x_45 : vec4<f32> = v;
+  let x_47 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_50 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_53 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_56 : f32 = x_10.x_GLF_uniform_float_values[1];
+  let x_58 : f32 = x_10.x_GLF_uniform_float_values[2];
+  let x_63 : f32 = x_10.x_GLF_uniform_float_values[0];
+  if ((distance(x_45, vec4<f32>(f32(x_47), f32(x_50), f32(x_53), (x_56 / x_58))) < x_63)) {
+    let x_69 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_72 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_75 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_78 : i32 = x_8.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_69), f32(x_72), f32(x_75), f32(x_78));
+  } else {
+    let x_82 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_83 : f32 = f32(x_82);
+    x_GLF_color = vec4<f32>(x_83, x_83, x_83, x_83);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-unpack-unorm-mix-always-one/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-unpack-unorm-mix-always-one/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..3a0af57
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-unpack-unorm-mix-always-one/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,65 @@
+float4 tint_unpack4x8unorm(uint param_0) {
+  uint j = param_0;
+  uint4 i = uint4(j & 0xff, (j >> 8) & 0xff, (j >> 16) & 0xff, j >> 24);
+  return float4(i) / 255.0;
+}
+
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[2];
+};
+cbuffer cbuffer_x_10 : register(b2, space0) {
+  uint4 x_10[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 v = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const uint x_39 = x_6[scalar_offset / 4][scalar_offset % 4];
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const uint x_41 = x_6[scalar_offset_1 / 4][scalar_offset_1 % 4];
+  v = tint_unpack4x8unorm((x_39 / (true ? 92382u : x_41)));
+  const float4 x_45 = v;
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const int x_47 = asint(x_8[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const int x_50 = asint(x_8[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+  const int x_53 = asint(x_8[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+  const float x_56 = asfloat(x_10[1].x);
+  const float x_58 = asfloat(x_10[2].x);
+  const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+  const float x_63 = asfloat(x_10[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+  if ((distance(x_45, float4(float(x_47), float(x_50), float(x_53), (x_56 / x_58))) < x_63)) {
+    const int x_69 = asint(x_8[1].x);
+    const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+    const int x_72 = asint(x_8[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+    const uint scalar_offset_7 = ((16u * uint(0))) / 4;
+    const int x_75 = asint(x_8[scalar_offset_7 / 4][scalar_offset_7 % 4]);
+    const int x_78 = asint(x_8[1].x);
+    x_GLF_color = float4(float(x_69), float(x_72), float(x_75), float(x_78));
+  } else {
+    const uint scalar_offset_8 = ((16u * uint(0))) / 4;
+    const int x_82 = asint(x_8[scalar_offset_8 / 4][scalar_offset_8 % 4]);
+    const float x_83 = float(x_82);
+    x_GLF_color = float4(x_83, x_83, x_83, x_83);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-unpack-unorm-mix-always-one/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-unpack-unorm-mix-always-one/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..1f2929c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-unpack-unorm-mix-always-one/0-opt.wgsl.expected.msl
@@ -0,0 +1,74 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ uint el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_uint_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_2 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_2[12];
+};
+struct tint_array_wrapper_2 {
+  /* 0x0000 */ tint_padded_array_element_2 arr[3];
+};
+struct buf2 {
+  /* 0x0000 */ tint_array_wrapper_2 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_8, constant buf2& x_10, thread float4* const tint_symbol_4) {
+  float4 v = 0.0f;
+  uint const x_39 = x_6.x_GLF_uniform_uint_values.arr[0].el;
+  uint const x_41 = x_6.x_GLF_uniform_uint_values.arr[0].el;
+  v = unpack_unorm4x8_to_float((x_39 / select(x_41, 92382u, true)));
+  float4 const x_45 = v;
+  int const x_47 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  int const x_50 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  int const x_53 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  float const x_56 = x_10.x_GLF_uniform_float_values.arr[1].el;
+  float const x_58 = x_10.x_GLF_uniform_float_values.arr[2].el;
+  float const x_63 = x_10.x_GLF_uniform_float_values.arr[0].el;
+  if ((distance(x_45, float4(float(x_47), float(x_50), float(x_53), (x_56 / x_58))) < x_63)) {
+    int const x_69 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    int const x_72 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    int const x_75 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    int const x_78 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_69), float(x_72), float(x_75), float(x_78));
+  } else {
+    int const x_82 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    float const x_83 = float(x_82);
+    *(tint_symbol_4) = float4(x_83, x_83, x_83, x_83);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_8 [[buffer(1)]], constant buf2& x_10 [[buffer(2)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-unpack-unorm-mix-always-one/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-unpack-unorm-mix-always-one/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..0727549
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-unpack-unorm-mix-always-one/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,161 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 101
+; Schema: 0
+               OpCapability Shader
+         %39 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_uint_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_8 "x_8"
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "x_GLF_uniform_float_values"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v "v"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_uint_uint_1 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %buf2 Block
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 2
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_uint_uint_1 = OpTypeArray %uint %uint_1
+       %buf0 = OpTypeStruct %_arr_uint_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf1 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %float = OpTypeFloat 32
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf2 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+       %x_10 = OpVariable %_ptr_Uniform_buf2 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %22 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %22
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %22
+       %void = OpTypeVoid
+         %25 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+ %uint_92382 = OpConstant %uint 92382
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+         %89 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %25
+         %28 = OpLabel
+          %v = OpVariable %_ptr_Function_v4float Function %22
+         %34 = OpAccessChain %_ptr_Uniform_uint %x_6 %uint_0 %int_0
+         %35 = OpLoad %uint %34
+         %36 = OpAccessChain %_ptr_Uniform_uint %x_6 %uint_0 %int_0
+         %37 = OpLoad %uint %36
+         %40 = OpSelect %uint %true %uint_92382 %37
+         %44 = OpUDiv %uint %35 %40
+         %38 = OpExtInst %v4float %39 UnpackUnorm4x8 %44
+               OpStore %v %38
+         %45 = OpLoad %v4float %v
+         %47 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %48 = OpLoad %int %47
+         %49 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %50 = OpLoad %int %49
+         %51 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %52 = OpLoad %int %51
+         %55 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_1
+         %56 = OpLoad %float %55
+         %58 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_2
+         %59 = OpLoad %float %58
+         %60 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_0
+         %61 = OpLoad %float %60
+         %63 = OpConvertSToF %float %48
+         %64 = OpConvertSToF %float %50
+         %65 = OpConvertSToF %float %52
+         %66 = OpFDiv %float %56 %59
+         %67 = OpCompositeConstruct %v4float %63 %64 %65 %66
+         %62 = OpExtInst %float %39 Distance %45 %67
+         %68 = OpFOrdLessThan %bool %62 %61
+               OpSelectionMerge %69 None
+               OpBranchConditional %68 %70 %71
+         %70 = OpLabel
+         %72 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %73 = OpLoad %int %72
+         %74 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %75 = OpLoad %int %74
+         %76 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %77 = OpLoad %int %76
+         %78 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %79 = OpLoad %int %78
+         %80 = OpConvertSToF %float %73
+         %81 = OpConvertSToF %float %75
+         %82 = OpConvertSToF %float %77
+         %83 = OpConvertSToF %float %79
+         %84 = OpCompositeConstruct %v4float %80 %81 %82 %83
+               OpStore %x_GLF_color %84
+               OpBranch %69
+         %71 = OpLabel
+         %85 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %86 = OpLoad %int %85
+         %87 = OpConvertSToF %float %86
+         %88 = OpCompositeConstruct %v4float %87 %87 %87 %87
+               OpStore %x_GLF_color %88
+               OpBranch %69
+         %69 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %89
+%tint_symbol = OpFunctionParameter %main_out
+         %93 = OpLabel
+         %94 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %94
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %25
+         %96 = OpLabel
+         %97 = OpFunctionCall %void %main_1
+         %99 = OpLoad %v4float %x_GLF_color
+        %100 = OpCompositeConstruct %main_out %99
+         %98 = OpFunctionCall %void %tint_symbol_2 %100
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-unpack-unorm-mix-always-one/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-unpack-unorm-mix-always-one/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..b44947b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-unpack-unorm-mix-always-one/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,65 @@
+type Arr = [[stride(16)]] array<u32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_uint_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+type Arr_2 = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf2 {
+  x_GLF_uniform_float_values : Arr_2;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+[[group(0), binding(2)]] var<uniform> x_10 : buf2;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v : vec4<f32>;
+  let x_39 : u32 = x_6.x_GLF_uniform_uint_values[0];
+  let x_41 : u32 = x_6.x_GLF_uniform_uint_values[0];
+  v = unpack4x8unorm((x_39 / select(x_41, 92382u, true)));
+  let x_45 : vec4<f32> = v;
+  let x_47 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_50 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_53 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_56 : f32 = x_10.x_GLF_uniform_float_values[1];
+  let x_58 : f32 = x_10.x_GLF_uniform_float_values[2];
+  let x_63 : f32 = x_10.x_GLF_uniform_float_values[0];
+  if ((distance(x_45, vec4<f32>(f32(x_47), f32(x_50), f32(x_53), (x_56 / x_58))) < x_63)) {
+    let x_69 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_72 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_75 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_78 : i32 = x_8.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_69), f32(x_72), f32(x_75), f32(x_78));
+  } else {
+    let x_82 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_83 : f32 = f32(x_82);
+    x_GLF_color = vec4<f32>(x_83, x_83, x_83, x_83);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.spvasm
new file mode 100644
index 0000000..6b6223d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.spvasm
@@ -0,0 +1,185 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %m43 "m43"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %sums "sums"
+               OpName %i "i"
+               OpName %a "a"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+%mat4v3float = OpTypeMatrix %v3float 4
+%_ptr_Function_mat4v3float = OpTypePointer Function %mat4v3float
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf1 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_float = OpTypePointer Function %float
+%_ptr_Function__arr_float_uint_3 = OpTypePointer Function %_arr_float_uint_3
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_3 = OpConstant %int 3
+       %bool = OpTypeBool
+      %int_4 = OpConstant %int 4
+      %int_2 = OpConstant %int 2
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %41 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+       %main = OpFunction %void None %15
+         %42 = OpLabel
+        %m43 = OpVariable %_ptr_Function_mat4v3float Function
+       %sums = OpVariable %_ptr_Function__arr_float_uint_3 Function
+          %i = OpVariable %_ptr_Function_int Function
+          %a = OpVariable %_ptr_Function_int Function
+         %43 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %44 = OpLoad %float %43
+         %45 = OpCompositeConstruct %v3float %44 %float_0 %float_0
+         %46 = OpCompositeConstruct %v3float %float_0 %44 %float_0
+         %47 = OpCompositeConstruct %v3float %float_0 %float_0 %44
+         %48 = OpCompositeConstruct %v3float %float_0 %float_0 %float_0
+         %49 = OpCompositeConstruct %mat4v3float %45 %46 %47 %41
+               OpStore %m43 %49
+         %50 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %51 = OpLoad %int %50
+         %52 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %53 = OpLoad %int %52
+         %54 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %55 = OpLoad %float %54
+         %56 = OpAccessChain %_ptr_Function_float %m43 %51 %53
+               OpStore %56 %55
+         %57 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %58 = OpLoad %float %57
+         %59 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %60 = OpLoad %float %59
+         %61 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %62 = OpLoad %float %61
+         %63 = OpCompositeConstruct %_arr_float_uint_3 %58 %60 %62
+               OpStore %sums %63
+         %64 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %65 = OpLoad %int %64
+               OpStore %i %65
+               OpBranch %66
+         %66 = OpLabel
+         %67 = OpPhi %int %65 %42 %68 %69
+               OpLoopMerge %70 %69 None
+               OpBranch %71
+         %71 = OpLabel
+         %72 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_3
+         %73 = OpLoad %int %72
+         %74 = OpSLessThan %bool %67 %73
+               OpBranchConditional %74 %75 %70
+         %75 = OpLabel
+         %76 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %77 = OpLoad %int %76
+         %78 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %79 = OpLoad %int %78
+         %80 = OpAccessChain %_ptr_Function_float %m43 %67 %79
+         %81 = OpLoad %float %80
+         %82 = OpAccessChain %_ptr_Function_float %sums %77
+         %83 = OpLoad %float %82
+         %84 = OpFAdd %float %83 %81
+         %85 = OpAccessChain %_ptr_Function_float %sums %77
+               OpStore %85 %84
+               OpBranch %69
+         %69 = OpLabel
+         %68 = OpIAdd %int %67 %int_1
+               OpStore %i %68
+               OpBranch %66
+         %70 = OpLabel
+         %86 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %87 = OpLoad %int %86
+         %88 = OpIEqual %bool %87 %int_1
+               OpSelectionMerge %89 None
+               OpBranchConditional %88 %90 %89
+         %90 = OpLabel
+               OpStore %a %int_4
+         %91 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %92 = OpLoad %int %91
+         %93 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %94 = OpLoad %int %93
+         %95 = OpAccessChain %_ptr_Function_float %m43 %int_4 %94
+         %96 = OpLoad %float %95
+         %97 = OpAccessChain %_ptr_Function_float %sums %92
+         %98 = OpLoad %float %97
+         %99 = OpFAdd %float %98 %96
+        %100 = OpAccessChain %_ptr_Function_float %sums %92
+               OpStore %100 %99
+               OpBranch %89
+         %89 = OpLabel
+        %101 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %102 = OpLoad %int %101
+        %103 = OpAccessChain %_ptr_Function_float %sums %102
+        %104 = OpLoad %float %103
+        %105 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+        %106 = OpLoad %int %105
+        %107 = OpAccessChain %_ptr_Function_float %sums %106
+        %108 = OpLoad %float %107
+        %109 = OpFAdd %float %104 %108
+        %110 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+        %111 = OpLoad %float %110
+        %112 = OpFOrdEqual %bool %109 %111
+               OpSelectionMerge %113 None
+               OpBranchConditional %112 %114 %115
+        %114 = OpLabel
+        %116 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+        %117 = OpLoad %int %116
+        %118 = OpConvertSToF %float %117
+        %119 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %120 = OpLoad %int %119
+        %121 = OpConvertSToF %float %120
+        %122 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %123 = OpLoad %int %122
+        %124 = OpConvertSToF %float %123
+        %125 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+        %126 = OpLoad %int %125
+        %127 = OpConvertSToF %float %126
+        %128 = OpCompositeConstruct %v4float %118 %121 %124 %127
+               OpStore %_GLF_color %128
+               OpBranch %113
+        %115 = OpLabel
+        %129 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %130 = OpLoad %int %129
+        %131 = OpConvertSToF %float %130
+        %132 = OpCompositeConstruct %v4float %131 %131 %131 %131
+               OpStore %_GLF_color %132
+               OpBranch %113
+        %113 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..75c82ea
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,109 @@
+void set_float3(inout float3 vec, int idx, float val) {
+  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
+}
+
+struct tint_padded_array_element {
+  float el;
+};
+
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[3];
+};
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4x3 m43 = float4x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  tint_padded_array_element sums[3] = (tint_padded_array_element[3])0;
+  int i = 0;
+  int a = 0;
+  int x_67_phi = 0;
+  const float x_44 = asfloat(x_6[1].x);
+  const float3 x_48 = float3(0.0f, 0.0f, 0.0f);
+  m43 = float4x3(float3(x_44, 0.0f, 0.0f), float3(0.0f, x_44, 0.0f), float3(0.0f, 0.0f, x_44), float3(0.0f, 0.0f, 0.0f));
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_51 = asint(x_8[scalar_offset / 4][scalar_offset % 4]);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_53 = asint(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const float x_55 = asfloat(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  set_float3(m43[x_51], x_53, x_55);
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const float x_58 = asfloat(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+  const float x_60 = asfloat(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+  const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+  const float x_62 = asfloat(x_6[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+  const tint_padded_array_element tint_symbol_4[3] = {{x_58}, {x_60}, {x_62}};
+  sums = tint_symbol_4;
+  const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+  const int x_65 = asint(x_8[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+  i = x_65;
+  x_67_phi = x_65;
+  while (true) {
+    const int x_67 = x_67_phi;
+    const int x_73 = asint(x_8[3].x);
+    if ((x_67 < x_73)) {
+    } else {
+      break;
+    }
+    const uint scalar_offset_7 = ((16u * uint(0))) / 4;
+    const int x_77 = asint(x_8[scalar_offset_7 / 4][scalar_offset_7 % 4]);
+    const uint scalar_offset_8 = ((16u * uint(0))) / 4;
+    const int x_79 = asint(x_8[scalar_offset_8 / 4][scalar_offset_8 % 4]);
+    const float x_81 = m43[x_67][x_79];
+    const float x_83 = sums[x_77].el;
+    sums[x_77].el = (x_83 + x_81);
+    {
+      const int x_68 = (x_67 + 1);
+      i = x_68;
+      x_67_phi = x_68;
+    }
+  }
+  const int x_87 = asint(x_8[1].x);
+  if ((x_87 == 1)) {
+    a = 4;
+    const int x_92 = asint(x_8[2].x);
+    const uint scalar_offset_9 = ((16u * uint(0))) / 4;
+    const int x_94 = asint(x_8[scalar_offset_9 / 4][scalar_offset_9 % 4]);
+    const float x_96 = m43[4][x_94];
+    const float x_98 = sums[x_92].el;
+    sums[x_92].el = (x_98 + x_96);
+  }
+  const int x_102 = asint(x_8[1].x);
+  const float x_104 = sums[x_102].el;
+  const uint scalar_offset_10 = ((16u * uint(0))) / 4;
+  const int x_106 = asint(x_8[scalar_offset_10 / 4][scalar_offset_10 % 4]);
+  const float x_108 = sums[x_106].el;
+  const float x_111 = asfloat(x_6[2].x);
+  if (((x_104 + x_108) == x_111)) {
+    const uint scalar_offset_11 = ((16u * uint(0))) / 4;
+    const int x_117 = asint(x_8[scalar_offset_11 / 4][scalar_offset_11 % 4]);
+    const int x_120 = asint(x_8[1].x);
+    const int x_123 = asint(x_8[1].x);
+    const uint scalar_offset_12 = ((16u * uint(0))) / 4;
+    const int x_126 = asint(x_8[scalar_offset_12 / 4][scalar_offset_12 % 4]);
+    x_GLF_color = float4(float(x_117), float(x_120), float(x_123), float(x_126));
+  } else {
+    const int x_130 = asint(x_8[1].x);
+    const float x_131 = float(x_130);
+    x_GLF_color = float4(x_131, x_131, x_131, x_131);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..3fc4376
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.spvasm.expected.msl
@@ -0,0 +1,105 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_8, thread float4* const tint_symbol_5) {
+  float4x3 m43 = float4x3(0.0f);
+  tint_array_wrapper sums = {};
+  int i = 0;
+  int a = 0;
+  int x_67_phi = 0;
+  float const x_44 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  float3 const x_48 = float3(0.0f, 0.0f, 0.0f);
+  m43 = float4x3(float3(x_44, 0.0f, 0.0f), float3(0.0f, x_44, 0.0f), float3(0.0f, 0.0f, x_44), float3(0.0f, 0.0f, 0.0f));
+  int const x_51 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  int const x_53 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  float const x_55 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  m43[x_51][x_53] = x_55;
+  float const x_58 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_60 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_62 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  tint_array_wrapper const tint_symbol_3 = {.arr={{.el=x_58}, {.el=x_60}, {.el=x_62}}};
+  sums = tint_symbol_3;
+  int const x_65 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  i = x_65;
+  x_67_phi = x_65;
+  while (true) {
+    int const x_67 = x_67_phi;
+    int const x_73 = x_8.x_GLF_uniform_int_values.arr[3].el;
+    if ((x_67 < x_73)) {
+    } else {
+      break;
+    }
+    int const x_77 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    int const x_79 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    float const x_81 = m43[x_67][x_79];
+    float const x_83 = sums.arr[x_77].el;
+    sums.arr[x_77].el = (x_83 + x_81);
+    {
+      int const x_68 = (x_67 + 1);
+      i = x_68;
+      x_67_phi = x_68;
+    }
+  }
+  int const x_87 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_87 == 1)) {
+    a = 4;
+    int const x_92 = x_8.x_GLF_uniform_int_values.arr[2].el;
+    int const x_94 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    float const x_96 = m43[4][x_94];
+    float const x_98 = sums.arr[x_92].el;
+    sums.arr[x_92].el = (x_98 + x_96);
+  }
+  int const x_102 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  float const x_104 = sums.arr[x_102].el;
+  int const x_106 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  float const x_108 = sums.arr[x_106].el;
+  float const x_111 = x_6.x_GLF_uniform_float_values.arr[2].el;
+  if (((x_104 + x_108) == x_111)) {
+    int const x_117 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    int const x_120 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    int const x_123 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    int const x_126 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_5) = float4(float(x_117), float(x_120), float(x_123), float(x_126));
+  } else {
+    int const x_130 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    float const x_131 = float(x_130);
+    *(tint_symbol_5) = float4(x_131, x_131, x_131, x_131);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_6, x_8, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..c63ce32
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,228 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 152
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %m43 "m43"
+               OpName %sums "sums"
+               OpName %i "i"
+               OpName %a "a"
+               OpName %x_67_phi "x_67_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf1 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+    %v3float = OpTypeVector %float 3
+%mat4v3float = OpTypeMatrix %v3float 4
+%_ptr_Function_mat4v3float = OpTypePointer Function %mat4v3float
+         %28 = OpConstantNull %mat4v3float
+%_ptr_Function__arr_float_uint_3 = OpTypePointer Function %_arr_float_uint_3
+         %31 = OpConstantNull %_arr_float_uint_3
+%_ptr_Function_int = OpTypePointer Function %int
+         %34 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_0 = OpConstant %float 0
+         %43 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_3 = OpConstant %int 3
+       %bool = OpTypeBool
+      %int_4 = OpConstant %int 4
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+        %140 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+        %m43 = OpVariable %_ptr_Function_mat4v3float Function %28
+       %sums = OpVariable %_ptr_Function__arr_float_uint_3 Function %31
+          %i = OpVariable %_ptr_Function_int Function %34
+          %a = OpVariable %_ptr_Function_int Function %34
+   %x_67_phi = OpVariable %_ptr_Function_int Function %34
+         %40 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %41 = OpLoad %float %40
+         %44 = OpCompositeConstruct %v3float %41 %float_0 %float_0
+         %45 = OpCompositeConstruct %v3float %float_0 %41 %float_0
+         %46 = OpCompositeConstruct %v3float %float_0 %float_0 %41
+         %47 = OpCompositeConstruct %mat4v3float %44 %45 %46 %43
+               OpStore %m43 %47
+         %50 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %51 = OpLoad %int %50
+         %52 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %53 = OpLoad %int %52
+         %54 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %55 = OpLoad %float %54
+         %57 = OpAccessChain %_ptr_Function_float %m43 %51 %53
+               OpStore %57 %55
+         %58 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %59 = OpLoad %float %58
+         %60 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %61 = OpLoad %float %60
+         %62 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %63 = OpLoad %float %62
+         %64 = OpCompositeConstruct %_arr_float_uint_3 %59 %61 %63
+               OpStore %sums %64
+         %65 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %66 = OpLoad %int %65
+               OpStore %i %66
+               OpStore %x_67_phi %66
+               OpBranch %67
+         %67 = OpLabel
+               OpLoopMerge %68 %69 None
+               OpBranch %70
+         %70 = OpLabel
+         %71 = OpLoad %int %x_67_phi
+         %73 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_3
+         %74 = OpLoad %int %73
+         %75 = OpSLessThan %bool %71 %74
+               OpSelectionMerge %77 None
+               OpBranchConditional %75 %78 %79
+         %78 = OpLabel
+               OpBranch %77
+         %79 = OpLabel
+               OpBranch %68
+         %77 = OpLabel
+         %80 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %81 = OpLoad %int %80
+         %82 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %83 = OpLoad %int %82
+         %84 = OpAccessChain %_ptr_Function_float %m43 %71 %83
+         %85 = OpLoad %float %84
+         %86 = OpAccessChain %_ptr_Function_float %sums %81
+         %87 = OpLoad %float %86
+         %88 = OpAccessChain %_ptr_Function_float %sums %81
+         %89 = OpFAdd %float %87 %85
+               OpStore %88 %89
+               OpBranch %69
+         %69 = OpLabel
+         %90 = OpIAdd %int %71 %int_1
+               OpStore %i %90
+               OpStore %x_67_phi %90
+               OpBranch %67
+         %68 = OpLabel
+         %91 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %92 = OpLoad %int %91
+         %93 = OpIEqual %bool %92 %int_1
+               OpSelectionMerge %94 None
+               OpBranchConditional %93 %95 %94
+         %95 = OpLabel
+               OpStore %a %int_4
+         %98 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+         %99 = OpLoad %int %98
+        %100 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+        %101 = OpLoad %int %100
+        %102 = OpAccessChain %_ptr_Function_float %m43 %int_4 %101
+        %103 = OpLoad %float %102
+        %104 = OpAccessChain %_ptr_Function_float %sums %99
+        %105 = OpLoad %float %104
+        %106 = OpAccessChain %_ptr_Function_float %sums %99
+        %107 = OpFAdd %float %105 %103
+               OpStore %106 %107
+               OpBranch %94
+         %94 = OpLabel
+        %108 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+        %109 = OpLoad %int %108
+        %110 = OpAccessChain %_ptr_Function_float %sums %109
+        %111 = OpLoad %float %110
+        %112 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+        %113 = OpLoad %int %112
+        %114 = OpAccessChain %_ptr_Function_float %sums %113
+        %115 = OpLoad %float %114
+        %116 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+        %117 = OpLoad %float %116
+        %118 = OpFAdd %float %111 %115
+        %119 = OpFOrdEqual %bool %118 %117
+               OpSelectionMerge %120 None
+               OpBranchConditional %119 %121 %122
+        %121 = OpLabel
+        %123 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+        %124 = OpLoad %int %123
+        %125 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+        %126 = OpLoad %int %125
+        %127 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+        %128 = OpLoad %int %127
+        %129 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+        %130 = OpLoad %int %129
+        %131 = OpConvertSToF %float %124
+        %132 = OpConvertSToF %float %126
+        %133 = OpConvertSToF %float %128
+        %134 = OpConvertSToF %float %130
+        %135 = OpCompositeConstruct %v4float %131 %132 %133 %134
+               OpStore %x_GLF_color %135
+               OpBranch %120
+        %122 = OpLabel
+        %136 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+        %137 = OpLoad %int %136
+        %138 = OpConvertSToF %float %137
+        %139 = OpCompositeConstruct %v4float %138 %138 %138 %138
+               OpStore %x_GLF_color %139
+               OpBranch %120
+        %120 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %140
+%tint_symbol = OpFunctionParameter %main_out
+        %144 = OpLabel
+        %145 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %145
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %147 = OpLabel
+        %148 = OpFunctionCall %void %main_1
+        %150 = OpLoad %v4float %x_GLF_color
+        %151 = OpCompositeConstruct %main_out %150
+        %149 = OpFunctionCall %void %tint_symbol_2 %151
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..7c1756e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,97 @@
+type Arr = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m43 : mat4x3<f32>;
+  var sums : Arr;
+  var i : i32;
+  var a : i32;
+  var x_67_phi : i32;
+  let x_44 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_48 : vec3<f32> = vec3<f32>(0.0, 0.0, 0.0);
+  m43 = mat4x3<f32>(vec3<f32>(x_44, 0.0, 0.0), vec3<f32>(0.0, x_44, 0.0), vec3<f32>(0.0, 0.0, x_44), vec3<f32>(0.0, 0.0, 0.0));
+  let x_51 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_53 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_55 : f32 = x_6.x_GLF_uniform_float_values[0];
+  m43[x_51][x_53] = x_55;
+  let x_58 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_60 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_62 : f32 = x_6.x_GLF_uniform_float_values[0];
+  sums = Arr(x_58, x_60, x_62);
+  let x_65 : i32 = x_8.x_GLF_uniform_int_values[0];
+  i = x_65;
+  x_67_phi = x_65;
+  loop {
+    let x_67 : i32 = x_67_phi;
+    let x_73 : i32 = x_8.x_GLF_uniform_int_values[3];
+    if ((x_67 < x_73)) {
+    } else {
+      break;
+    }
+    let x_77 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_79 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_81 : f32 = m43[x_67][x_79];
+    let x_83 : f32 = sums[x_77];
+    sums[x_77] = (x_83 + x_81);
+
+    continuing {
+      let x_68 : i32 = (x_67 + 1);
+      i = x_68;
+      x_67_phi = x_68;
+    }
+  }
+  let x_87 : i32 = x_8.x_GLF_uniform_int_values[1];
+  if ((x_87 == 1)) {
+    a = 4;
+    let x_92 : i32 = x_8.x_GLF_uniform_int_values[2];
+    let x_94 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_96 : f32 = m43[4][x_94];
+    let x_98 : f32 = sums[x_92];
+    sums[x_92] = (x_98 + x_96);
+  }
+  let x_102 : i32 = x_8.x_GLF_uniform_int_values[1];
+  let x_104 : f32 = sums[x_102];
+  let x_106 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_108 : f32 = sums[x_106];
+  let x_111 : f32 = x_6.x_GLF_uniform_float_values[2];
+  if (((x_104 + x_108) == x_111)) {
+    let x_117 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_120 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_123 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_126 : i32 = x_8.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_117), f32(x_120), f32(x_123), f32(x_126));
+  } else {
+    let x_130 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_131 : f32 = f32(x_130);
+    x_GLF_color = vec4<f32>(x_131, x_131, x_131, x_131);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.wgsl
new file mode 100644
index 0000000..7c1756e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.wgsl
@@ -0,0 +1,97 @@
+type Arr = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m43 : mat4x3<f32>;
+  var sums : Arr;
+  var i : i32;
+  var a : i32;
+  var x_67_phi : i32;
+  let x_44 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_48 : vec3<f32> = vec3<f32>(0.0, 0.0, 0.0);
+  m43 = mat4x3<f32>(vec3<f32>(x_44, 0.0, 0.0), vec3<f32>(0.0, x_44, 0.0), vec3<f32>(0.0, 0.0, x_44), vec3<f32>(0.0, 0.0, 0.0));
+  let x_51 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_53 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_55 : f32 = x_6.x_GLF_uniform_float_values[0];
+  m43[x_51][x_53] = x_55;
+  let x_58 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_60 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_62 : f32 = x_6.x_GLF_uniform_float_values[0];
+  sums = Arr(x_58, x_60, x_62);
+  let x_65 : i32 = x_8.x_GLF_uniform_int_values[0];
+  i = x_65;
+  x_67_phi = x_65;
+  loop {
+    let x_67 : i32 = x_67_phi;
+    let x_73 : i32 = x_8.x_GLF_uniform_int_values[3];
+    if ((x_67 < x_73)) {
+    } else {
+      break;
+    }
+    let x_77 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_79 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_81 : f32 = m43[x_67][x_79];
+    let x_83 : f32 = sums[x_77];
+    sums[x_77] = (x_83 + x_81);
+
+    continuing {
+      let x_68 : i32 = (x_67 + 1);
+      i = x_68;
+      x_67_phi = x_68;
+    }
+  }
+  let x_87 : i32 = x_8.x_GLF_uniform_int_values[1];
+  if ((x_87 == 1)) {
+    a = 4;
+    let x_92 : i32 = x_8.x_GLF_uniform_int_values[2];
+    let x_94 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_96 : f32 = m43[4][x_94];
+    let x_98 : f32 = sums[x_92];
+    sums[x_92] = (x_98 + x_96);
+  }
+  let x_102 : i32 = x_8.x_GLF_uniform_int_values[1];
+  let x_104 : f32 = sums[x_102];
+  let x_106 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_108 : f32 = sums[x_106];
+  let x_111 : f32 = x_6.x_GLF_uniform_float_values[2];
+  if (((x_104 + x_108) == x_111)) {
+    let x_117 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_120 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_123 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_126 : i32 = x_8.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_117), f32(x_120), f32(x_123), f32(x_126));
+  } else {
+    let x_130 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_131 : f32 = f32(x_130);
+    x_GLF_color = vec4<f32>(x_131, x_131, x_131, x_131);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..75c82ea
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,109 @@
+void set_float3(inout float3 vec, int idx, float val) {
+  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
+}
+
+struct tint_padded_array_element {
+  float el;
+};
+
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[3];
+};
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4x3 m43 = float4x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  tint_padded_array_element sums[3] = (tint_padded_array_element[3])0;
+  int i = 0;
+  int a = 0;
+  int x_67_phi = 0;
+  const float x_44 = asfloat(x_6[1].x);
+  const float3 x_48 = float3(0.0f, 0.0f, 0.0f);
+  m43 = float4x3(float3(x_44, 0.0f, 0.0f), float3(0.0f, x_44, 0.0f), float3(0.0f, 0.0f, x_44), float3(0.0f, 0.0f, 0.0f));
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_51 = asint(x_8[scalar_offset / 4][scalar_offset % 4]);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_53 = asint(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const float x_55 = asfloat(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  set_float3(m43[x_51], x_53, x_55);
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const float x_58 = asfloat(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+  const float x_60 = asfloat(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+  const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+  const float x_62 = asfloat(x_6[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+  const tint_padded_array_element tint_symbol_4[3] = {{x_58}, {x_60}, {x_62}};
+  sums = tint_symbol_4;
+  const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+  const int x_65 = asint(x_8[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+  i = x_65;
+  x_67_phi = x_65;
+  while (true) {
+    const int x_67 = x_67_phi;
+    const int x_73 = asint(x_8[3].x);
+    if ((x_67 < x_73)) {
+    } else {
+      break;
+    }
+    const uint scalar_offset_7 = ((16u * uint(0))) / 4;
+    const int x_77 = asint(x_8[scalar_offset_7 / 4][scalar_offset_7 % 4]);
+    const uint scalar_offset_8 = ((16u * uint(0))) / 4;
+    const int x_79 = asint(x_8[scalar_offset_8 / 4][scalar_offset_8 % 4]);
+    const float x_81 = m43[x_67][x_79];
+    const float x_83 = sums[x_77].el;
+    sums[x_77].el = (x_83 + x_81);
+    {
+      const int x_68 = (x_67 + 1);
+      i = x_68;
+      x_67_phi = x_68;
+    }
+  }
+  const int x_87 = asint(x_8[1].x);
+  if ((x_87 == 1)) {
+    a = 4;
+    const int x_92 = asint(x_8[2].x);
+    const uint scalar_offset_9 = ((16u * uint(0))) / 4;
+    const int x_94 = asint(x_8[scalar_offset_9 / 4][scalar_offset_9 % 4]);
+    const float x_96 = m43[4][x_94];
+    const float x_98 = sums[x_92].el;
+    sums[x_92].el = (x_98 + x_96);
+  }
+  const int x_102 = asint(x_8[1].x);
+  const float x_104 = sums[x_102].el;
+  const uint scalar_offset_10 = ((16u * uint(0))) / 4;
+  const int x_106 = asint(x_8[scalar_offset_10 / 4][scalar_offset_10 % 4]);
+  const float x_108 = sums[x_106].el;
+  const float x_111 = asfloat(x_6[2].x);
+  if (((x_104 + x_108) == x_111)) {
+    const uint scalar_offset_11 = ((16u * uint(0))) / 4;
+    const int x_117 = asint(x_8[scalar_offset_11 / 4][scalar_offset_11 % 4]);
+    const int x_120 = asint(x_8[1].x);
+    const int x_123 = asint(x_8[1].x);
+    const uint scalar_offset_12 = ((16u * uint(0))) / 4;
+    const int x_126 = asint(x_8[scalar_offset_12 / 4][scalar_offset_12 % 4]);
+    x_GLF_color = float4(float(x_117), float(x_120), float(x_123), float(x_126));
+  } else {
+    const int x_130 = asint(x_8[1].x);
+    const float x_131 = float(x_130);
+    x_GLF_color = float4(x_131, x_131, x_131, x_131);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..3fc4376
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.wgsl.expected.msl
@@ -0,0 +1,105 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_8, thread float4* const tint_symbol_5) {
+  float4x3 m43 = float4x3(0.0f);
+  tint_array_wrapper sums = {};
+  int i = 0;
+  int a = 0;
+  int x_67_phi = 0;
+  float const x_44 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  float3 const x_48 = float3(0.0f, 0.0f, 0.0f);
+  m43 = float4x3(float3(x_44, 0.0f, 0.0f), float3(0.0f, x_44, 0.0f), float3(0.0f, 0.0f, x_44), float3(0.0f, 0.0f, 0.0f));
+  int const x_51 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  int const x_53 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  float const x_55 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  m43[x_51][x_53] = x_55;
+  float const x_58 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_60 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  float const x_62 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  tint_array_wrapper const tint_symbol_3 = {.arr={{.el=x_58}, {.el=x_60}, {.el=x_62}}};
+  sums = tint_symbol_3;
+  int const x_65 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  i = x_65;
+  x_67_phi = x_65;
+  while (true) {
+    int const x_67 = x_67_phi;
+    int const x_73 = x_8.x_GLF_uniform_int_values.arr[3].el;
+    if ((x_67 < x_73)) {
+    } else {
+      break;
+    }
+    int const x_77 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    int const x_79 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    float const x_81 = m43[x_67][x_79];
+    float const x_83 = sums.arr[x_77].el;
+    sums.arr[x_77].el = (x_83 + x_81);
+    {
+      int const x_68 = (x_67 + 1);
+      i = x_68;
+      x_67_phi = x_68;
+    }
+  }
+  int const x_87 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_87 == 1)) {
+    a = 4;
+    int const x_92 = x_8.x_GLF_uniform_int_values.arr[2].el;
+    int const x_94 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    float const x_96 = m43[4][x_94];
+    float const x_98 = sums.arr[x_92].el;
+    sums.arr[x_92].el = (x_98 + x_96);
+  }
+  int const x_102 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  float const x_104 = sums.arr[x_102].el;
+  int const x_106 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  float const x_108 = sums.arr[x_106].el;
+  float const x_111 = x_6.x_GLF_uniform_float_values.arr[2].el;
+  if (((x_104 + x_108) == x_111)) {
+    int const x_117 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    int const x_120 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    int const x_123 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    int const x_126 = x_8.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_5) = float4(float(x_117), float(x_120), float(x_123), float(x_126));
+  } else {
+    int const x_130 = x_8.x_GLF_uniform_int_values.arr[1].el;
+    float const x_131 = float(x_130);
+    *(tint_symbol_5) = float4(x_131, x_131, x_131, x_131);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_6, x_8, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..c63ce32
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,228 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 152
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %m43 "m43"
+               OpName %sums "sums"
+               OpName %i "i"
+               OpName %a "a"
+               OpName %x_67_phi "x_67_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf1 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+    %v3float = OpTypeVector %float 3
+%mat4v3float = OpTypeMatrix %v3float 4
+%_ptr_Function_mat4v3float = OpTypePointer Function %mat4v3float
+         %28 = OpConstantNull %mat4v3float
+%_ptr_Function__arr_float_uint_3 = OpTypePointer Function %_arr_float_uint_3
+         %31 = OpConstantNull %_arr_float_uint_3
+%_ptr_Function_int = OpTypePointer Function %int
+         %34 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_0 = OpConstant %float 0
+         %43 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_3 = OpConstant %int 3
+       %bool = OpTypeBool
+      %int_4 = OpConstant %int 4
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+        %140 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+        %m43 = OpVariable %_ptr_Function_mat4v3float Function %28
+       %sums = OpVariable %_ptr_Function__arr_float_uint_3 Function %31
+          %i = OpVariable %_ptr_Function_int Function %34
+          %a = OpVariable %_ptr_Function_int Function %34
+   %x_67_phi = OpVariable %_ptr_Function_int Function %34
+         %40 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %41 = OpLoad %float %40
+         %44 = OpCompositeConstruct %v3float %41 %float_0 %float_0
+         %45 = OpCompositeConstruct %v3float %float_0 %41 %float_0
+         %46 = OpCompositeConstruct %v3float %float_0 %float_0 %41
+         %47 = OpCompositeConstruct %mat4v3float %44 %45 %46 %43
+               OpStore %m43 %47
+         %50 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %51 = OpLoad %int %50
+         %52 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %53 = OpLoad %int %52
+         %54 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %55 = OpLoad %float %54
+         %57 = OpAccessChain %_ptr_Function_float %m43 %51 %53
+               OpStore %57 %55
+         %58 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %59 = OpLoad %float %58
+         %60 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %61 = OpLoad %float %60
+         %62 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %63 = OpLoad %float %62
+         %64 = OpCompositeConstruct %_arr_float_uint_3 %59 %61 %63
+               OpStore %sums %64
+         %65 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %66 = OpLoad %int %65
+               OpStore %i %66
+               OpStore %x_67_phi %66
+               OpBranch %67
+         %67 = OpLabel
+               OpLoopMerge %68 %69 None
+               OpBranch %70
+         %70 = OpLabel
+         %71 = OpLoad %int %x_67_phi
+         %73 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_3
+         %74 = OpLoad %int %73
+         %75 = OpSLessThan %bool %71 %74
+               OpSelectionMerge %77 None
+               OpBranchConditional %75 %78 %79
+         %78 = OpLabel
+               OpBranch %77
+         %79 = OpLabel
+               OpBranch %68
+         %77 = OpLabel
+         %80 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %81 = OpLoad %int %80
+         %82 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %83 = OpLoad %int %82
+         %84 = OpAccessChain %_ptr_Function_float %m43 %71 %83
+         %85 = OpLoad %float %84
+         %86 = OpAccessChain %_ptr_Function_float %sums %81
+         %87 = OpLoad %float %86
+         %88 = OpAccessChain %_ptr_Function_float %sums %81
+         %89 = OpFAdd %float %87 %85
+               OpStore %88 %89
+               OpBranch %69
+         %69 = OpLabel
+         %90 = OpIAdd %int %71 %int_1
+               OpStore %i %90
+               OpStore %x_67_phi %90
+               OpBranch %67
+         %68 = OpLabel
+         %91 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %92 = OpLoad %int %91
+         %93 = OpIEqual %bool %92 %int_1
+               OpSelectionMerge %94 None
+               OpBranchConditional %93 %95 %94
+         %95 = OpLabel
+               OpStore %a %int_4
+         %98 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+         %99 = OpLoad %int %98
+        %100 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+        %101 = OpLoad %int %100
+        %102 = OpAccessChain %_ptr_Function_float %m43 %int_4 %101
+        %103 = OpLoad %float %102
+        %104 = OpAccessChain %_ptr_Function_float %sums %99
+        %105 = OpLoad %float %104
+        %106 = OpAccessChain %_ptr_Function_float %sums %99
+        %107 = OpFAdd %float %105 %103
+               OpStore %106 %107
+               OpBranch %94
+         %94 = OpLabel
+        %108 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+        %109 = OpLoad %int %108
+        %110 = OpAccessChain %_ptr_Function_float %sums %109
+        %111 = OpLoad %float %110
+        %112 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+        %113 = OpLoad %int %112
+        %114 = OpAccessChain %_ptr_Function_float %sums %113
+        %115 = OpLoad %float %114
+        %116 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+        %117 = OpLoad %float %116
+        %118 = OpFAdd %float %111 %115
+        %119 = OpFOrdEqual %bool %118 %117
+               OpSelectionMerge %120 None
+               OpBranchConditional %119 %121 %122
+        %121 = OpLabel
+        %123 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+        %124 = OpLoad %int %123
+        %125 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+        %126 = OpLoad %int %125
+        %127 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+        %128 = OpLoad %int %127
+        %129 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+        %130 = OpLoad %int %129
+        %131 = OpConvertSToF %float %124
+        %132 = OpConvertSToF %float %126
+        %133 = OpConvertSToF %float %128
+        %134 = OpConvertSToF %float %130
+        %135 = OpCompositeConstruct %v4float %131 %132 %133 %134
+               OpStore %x_GLF_color %135
+               OpBranch %120
+        %122 = OpLabel
+        %136 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+        %137 = OpLoad %int %136
+        %138 = OpConvertSToF %float %137
+        %139 = OpCompositeConstruct %v4float %138 %138 %138 %138
+               OpStore %x_GLF_color %139
+               OpBranch %120
+        %120 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %140
+%tint_symbol = OpFunctionParameter %main_out
+        %144 = OpLabel
+        %145 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %145
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %147 = OpLabel
+        %148 = OpFunctionCall %void %main_1
+        %150 = OpLoad %v4float %x_GLF_color
+        %151 = OpCompositeConstruct %main_out %150
+        %149 = OpFunctionCall %void %tint_symbol_2 %151
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..7c1756e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-unused-access-past-matrix-elements/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,97 @@
+type Arr = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m43 : mat4x3<f32>;
+  var sums : Arr;
+  var i : i32;
+  var a : i32;
+  var x_67_phi : i32;
+  let x_44 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_48 : vec3<f32> = vec3<f32>(0.0, 0.0, 0.0);
+  m43 = mat4x3<f32>(vec3<f32>(x_44, 0.0, 0.0), vec3<f32>(0.0, x_44, 0.0), vec3<f32>(0.0, 0.0, x_44), vec3<f32>(0.0, 0.0, 0.0));
+  let x_51 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_53 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_55 : f32 = x_6.x_GLF_uniform_float_values[0];
+  m43[x_51][x_53] = x_55;
+  let x_58 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_60 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_62 : f32 = x_6.x_GLF_uniform_float_values[0];
+  sums = Arr(x_58, x_60, x_62);
+  let x_65 : i32 = x_8.x_GLF_uniform_int_values[0];
+  i = x_65;
+  x_67_phi = x_65;
+  loop {
+    let x_67 : i32 = x_67_phi;
+    let x_73 : i32 = x_8.x_GLF_uniform_int_values[3];
+    if ((x_67 < x_73)) {
+    } else {
+      break;
+    }
+    let x_77 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_79 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_81 : f32 = m43[x_67][x_79];
+    let x_83 : f32 = sums[x_77];
+    sums[x_77] = (x_83 + x_81);
+
+    continuing {
+      let x_68 : i32 = (x_67 + 1);
+      i = x_68;
+      x_67_phi = x_68;
+    }
+  }
+  let x_87 : i32 = x_8.x_GLF_uniform_int_values[1];
+  if ((x_87 == 1)) {
+    a = 4;
+    let x_92 : i32 = x_8.x_GLF_uniform_int_values[2];
+    let x_94 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_96 : f32 = m43[4][x_94];
+    let x_98 : f32 = sums[x_92];
+    sums[x_92] = (x_98 + x_96);
+  }
+  let x_102 : i32 = x_8.x_GLF_uniform_int_values[1];
+  let x_104 : f32 = sums[x_102];
+  let x_106 : i32 = x_8.x_GLF_uniform_int_values[0];
+  let x_108 : f32 = sums[x_106];
+  let x_111 : f32 = x_6.x_GLF_uniform_float_values[2];
+  if (((x_104 + x_108) == x_111)) {
+    let x_117 : i32 = x_8.x_GLF_uniform_int_values[0];
+    let x_120 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_123 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_126 : i32 = x_8.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_117), f32(x_120), f32(x_123), f32(x_126));
+  } else {
+    let x_130 : i32 = x_8.x_GLF_uniform_int_values[1];
+    let x_131 : f32 = f32(x_130);
+    x_GLF_color = vec4<f32>(x_131, x_131, x_131, x_131);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.spvasm
new file mode 100644
index 0000000..a44e425
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.spvasm
@@ -0,0 +1,218 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %m0 "m0"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %c "c"
+               OpName %m1 "m1"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%mat4v4float = OpTypeMatrix %v4float 4
+%_ptr_Function_mat4v4float = OpTypePointer Function %mat4v4float
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf1 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_float = OpTypePointer Function %float
+     %v4bool = OpTypeVector %bool 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %14
+         %38 = OpLabel
+         %m0 = OpVariable %_ptr_Function_mat4v4float Function
+          %c = OpVariable %_ptr_Function_int Function
+         %m1 = OpVariable %_ptr_Function_mat4v4float Function
+         %39 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %40 = OpLoad %int %39
+         %41 = OpConvertSToF %float %40
+         %42 = OpCompositeConstruct %v4float %41 %float_0 %float_0 %float_0
+         %43 = OpCompositeConstruct %v4float %float_0 %41 %float_0 %float_0
+         %44 = OpCompositeConstruct %v4float %float_0 %float_0 %41 %float_0
+         %45 = OpCompositeConstruct %v4float %float_0 %float_0 %float_0 %41
+         %46 = OpCompositeConstruct %mat4v4float %42 %43 %44 %45
+               OpStore %m0 %46
+         %47 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %48 = OpLoad %int %47
+               OpStore %c %48
+               OpBranch %49
+         %49 = OpLabel
+               OpLoopMerge %50 %51 None
+               OpBranch %52
+         %52 = OpLabel
+         %53 = OpLoad %int %c
+         %54 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %55 = OpLoad %int %54
+         %56 = OpSLessThan %bool %53 %55
+               OpBranchConditional %56 %57 %50
+         %57 = OpLabel
+         %58 = OpLoad %mat4v4float %m0
+               OpStore %m1 %58
+         %59 = OpLoad %int %c
+         %60 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %61 = OpLoad %int %60
+         %62 = OpSMod %int %59 %61
+         %63 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %64 = OpLoad %int %63
+         %65 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %66 = OpLoad %float %65
+         %67 = OpAccessChain %_ptr_Function_float %m1 %62 %64
+               OpStore %67 %66
+         %68 = OpLoad %int %c
+         %69 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %70 = OpLoad %int %69
+         %71 = OpSMod %int %68 %70
+         %72 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %73 = OpLoad %int %72
+         %74 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %75 = OpLoad %float %74
+         %76 = OpAccessChain %_ptr_Function_float %m0 %71 %73
+               OpStore %76 %75
+               OpBranch %51
+         %51 = OpLabel
+         %77 = OpLoad %int %c
+         %78 = OpIAdd %int %77 %int_1
+               OpStore %c %78
+               OpBranch %49
+         %50 = OpLabel
+         %79 = OpLoad %mat4v4float %m0
+         %80 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %81 = OpLoad %int %80
+         %82 = OpConvertSToF %float %81
+         %83 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %84 = OpLoad %int %83
+         %85 = OpConvertSToF %float %84
+         %86 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %87 = OpLoad %int %86
+         %88 = OpConvertSToF %float %87
+         %89 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %90 = OpLoad %int %89
+         %91 = OpConvertSToF %float %90
+         %92 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %93 = OpLoad %int %92
+         %94 = OpConvertSToF %float %93
+         %95 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %96 = OpLoad %int %95
+         %97 = OpConvertSToF %float %96
+         %98 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %99 = OpLoad %int %98
+        %100 = OpConvertSToF %float %99
+        %101 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+        %102 = OpLoad %int %101
+        %103 = OpConvertSToF %float %102
+        %104 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+        %105 = OpLoad %int %104
+        %106 = OpConvertSToF %float %105
+        %107 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+        %108 = OpLoad %int %107
+        %109 = OpConvertSToF %float %108
+        %110 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+        %111 = OpLoad %int %110
+        %112 = OpConvertSToF %float %111
+        %113 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+        %114 = OpLoad %int %113
+        %115 = OpConvertSToF %float %114
+        %116 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+        %117 = OpLoad %int %116
+        %118 = OpConvertSToF %float %117
+        %119 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+        %120 = OpLoad %int %119
+        %121 = OpConvertSToF %float %120
+        %122 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+        %123 = OpLoad %int %122
+        %124 = OpConvertSToF %float %123
+        %125 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+        %126 = OpLoad %int %125
+        %127 = OpConvertSToF %float %126
+        %128 = OpCompositeConstruct %v4float %82 %85 %88 %91
+        %129 = OpCompositeConstruct %v4float %94 %97 %100 %103
+        %130 = OpCompositeConstruct %v4float %106 %109 %112 %115
+        %131 = OpCompositeConstruct %v4float %118 %121 %124 %127
+        %132 = OpCompositeConstruct %mat4v4float %128 %129 %130 %131
+        %133 = OpCompositeExtract %v4float %79 0
+        %134 = OpCompositeExtract %v4float %132 0
+        %135 = OpFOrdEqual %v4bool %133 %134
+        %136 = OpAll %bool %135
+        %137 = OpCompositeExtract %v4float %79 1
+        %138 = OpCompositeExtract %v4float %132 1
+        %139 = OpFOrdEqual %v4bool %137 %138
+        %140 = OpAll %bool %139
+        %141 = OpLogicalAnd %bool %136 %140
+        %142 = OpCompositeExtract %v4float %79 2
+        %143 = OpCompositeExtract %v4float %132 2
+        %144 = OpFOrdEqual %v4bool %142 %143
+        %145 = OpAll %bool %144
+        %146 = OpLogicalAnd %bool %141 %145
+        %147 = OpCompositeExtract %v4float %79 3
+        %148 = OpCompositeExtract %v4float %132 3
+        %149 = OpFOrdEqual %v4bool %147 %148
+        %150 = OpAll %bool %149
+        %151 = OpLogicalAnd %bool %146 %150
+               OpSelectionMerge %152 None
+               OpBranchConditional %151 %153 %154
+        %153 = OpLabel
+        %155 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+        %156 = OpLoad %int %155
+        %157 = OpConvertSToF %float %156
+        %158 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+        %159 = OpLoad %int %158
+        %160 = OpConvertSToF %float %159
+        %161 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+        %162 = OpLoad %int %161
+        %163 = OpConvertSToF %float %162
+        %164 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+        %165 = OpLoad %int %164
+        %166 = OpConvertSToF %float %165
+        %167 = OpCompositeConstruct %v4float %157 %160 %163 %166
+               OpStore %_GLF_color %167
+               OpBranch %152
+        %154 = OpLabel
+        %168 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+        %169 = OpLoad %int %168
+        %170 = OpConvertSToF %float %169
+        %171 = OpCompositeConstruct %v4float %170 %170 %170 %170
+               OpStore %_GLF_color %171
+               OpBranch %152
+        %152 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..258443f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,103 @@
+void set_float4(inout float4 vec, int idx, float val) {
+  vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
+}
+
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[4];
+};
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4x4 m0 = float4x4(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  int c = 0;
+  float4x4 m1 = float4x4(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  const int x_40 = asint(x_6[1].x);
+  const float x_41 = float(x_40);
+  m0 = float4x4(float4(x_41, 0.0f, 0.0f, 0.0f), float4(0.0f, x_41, 0.0f, 0.0f), float4(0.0f, 0.0f, x_41, 0.0f), float4(0.0f, 0.0f, 0.0f, x_41));
+  const int x_48 = asint(x_6[2].x);
+  c = x_48;
+  while (true) {
+    const int x_53 = c;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_55 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_53 < x_55)) {
+    } else {
+      break;
+    }
+    m1 = m0;
+    const int x_59 = c;
+    const int x_61 = asint(x_6[3].x);
+    const int x_64 = asint(x_6[2].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const float x_66 = asfloat(x_10[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    set_float4(m1[(x_59 % x_61)], x_64, x_66);
+    const int x_68 = c;
+    const int x_70 = asint(x_6[3].x);
+    const int x_73 = asint(x_6[2].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const float x_75 = asfloat(x_10[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    set_float4(m0[(x_68 % x_70)], x_73, x_75);
+    {
+      c = (c + 1);
+    }
+  }
+  const float4x4 x_79 = m0;
+  const int x_81 = asint(x_6[1].x);
+  const int x_84 = asint(x_6[2].x);
+  const int x_87 = asint(x_6[1].x);
+  const int x_90 = asint(x_6[1].x);
+  const int x_93 = asint(x_6[1].x);
+  const int x_96 = asint(x_6[2].x);
+  const int x_99 = asint(x_6[1].x);
+  const int x_102 = asint(x_6[1].x);
+  const int x_105 = asint(x_6[1].x);
+  const int x_108 = asint(x_6[2].x);
+  const int x_111 = asint(x_6[1].x);
+  const int x_114 = asint(x_6[1].x);
+  const int x_117 = asint(x_6[1].x);
+  const int x_120 = asint(x_6[2].x);
+  const int x_123 = asint(x_6[1].x);
+  const int x_126 = asint(x_6[1].x);
+  const float4x4 x_132 = float4x4(float4(float(x_81), float(x_84), float(x_87), float(x_90)), float4(float(x_93), float(x_96), float(x_99), float(x_102)), float4(float(x_105), float(x_108), float(x_111), float(x_114)), float4(float(x_117), float(x_120), float(x_123), float(x_126)));
+  bool tint_tmp_2 = all((x_79[0u] == x_132[0u]));
+  if (tint_tmp_2) {
+    tint_tmp_2 = all((x_79[1u] == x_132[1u]));
+  }
+  bool tint_tmp_1 = (tint_tmp_2);
+  if (tint_tmp_1) {
+    tint_tmp_1 = all((x_79[2u] == x_132[2u]));
+  }
+  bool tint_tmp = (tint_tmp_1);
+  if (tint_tmp) {
+    tint_tmp = all((x_79[3u] == x_132[3u]));
+  }
+  if ((tint_tmp)) {
+    const int x_156 = asint(x_6[2].x);
+    const int x_159 = asint(x_6[1].x);
+    const int x_162 = asint(x_6[1].x);
+    const int x_165 = asint(x_6[2].x);
+    x_GLF_color = float4(float(x_156), float(x_159), float(x_162), float(x_165));
+  } else {
+    const int x_169 = asint(x_6[1].x);
+    const float x_170 = float(x_169);
+    x_GLF_color = float4(x_170, x_170, x_170, x_170);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..2e9eaea
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.spvasm.expected.msl
@@ -0,0 +1,103 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_10, thread float4* const tint_symbol_4) {
+  float4x4 m0 = float4x4(0.0f);
+  int c = 0;
+  float4x4 m1 = float4x4(0.0f);
+  int const x_40 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  float const x_41 = float(x_40);
+  m0 = float4x4(float4(x_41, 0.0f, 0.0f, 0.0f), float4(0.0f, x_41, 0.0f, 0.0f), float4(0.0f, 0.0f, x_41, 0.0f), float4(0.0f, 0.0f, 0.0f, x_41));
+  int const x_48 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  c = x_48;
+  while (true) {
+    int const x_53 = c;
+    int const x_55 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_53 < x_55)) {
+    } else {
+      break;
+    }
+    float4x4 const x_58 = m0;
+    m1 = x_58;
+    int const x_59 = c;
+    int const x_61 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    int const x_64 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    float const x_66 = x_10.x_GLF_uniform_float_values.arr[0].el;
+    m1[(x_59 % x_61)][x_64] = x_66;
+    int const x_68 = c;
+    int const x_70 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    int const x_73 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    float const x_75 = x_10.x_GLF_uniform_float_values.arr[0].el;
+    m0[(x_68 % x_70)][x_73] = x_75;
+    {
+      int const x_77 = c;
+      c = (x_77 + 1);
+    }
+  }
+  float4x4 const x_79 = m0;
+  int const x_81 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_84 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_87 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_90 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_93 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_96 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_99 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_102 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_105 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_108 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_111 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_114 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_117 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_120 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_123 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_126 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  float4x4 const x_132 = float4x4(float4(float(x_81), float(x_84), float(x_87), float(x_90)), float4(float(x_93), float(x_96), float(x_99), float(x_102)), float4(float(x_105), float(x_108), float(x_111), float(x_114)), float4(float(x_117), float(x_120), float(x_123), float(x_126)));
+  if ((((all((x_79[0u] == x_132[0u])) && all((x_79[1u] == x_132[1u]))) && all((x_79[2u] == x_132[2u]))) && all((x_79[3u] == x_132[3u])))) {
+    int const x_156 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_159 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_162 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_165 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    *(tint_symbol_4) = float4(float(x_156), float(x_159), float(x_162), float(x_165));
+  } else {
+    int const x_169 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    float const x_170 = float(x_169);
+    *(tint_symbol_4) = float4(x_170, x_170, x_170, x_170);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_10 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..1bf7a3d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,274 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 198
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %m0 "m0"
+               OpName %c "c"
+               OpName %m1 "m1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf1 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %float = OpTypeFloat 32
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%mat4v4float = OpTypeMatrix %v4float 4
+%_ptr_Function_mat4v4float = OpTypePointer Function %mat4v4float
+         %27 = OpConstantNull %mat4v4float
+%_ptr_Function_int = OpTypePointer Function %int
+         %30 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+    %float_0 = OpConstant %float 0
+      %int_2 = OpConstant %int 2
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_float = OpTypePointer Function %float
+     %v4bool = OpTypeVector %bool 4
+     %uint_2 = OpConstant %uint 2
+     %uint_3 = OpConstant %uint 3
+   %main_out = OpTypeStruct %v4float
+        %186 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+         %m0 = OpVariable %_ptr_Function_mat4v4float Function %27
+          %c = OpVariable %_ptr_Function_int Function %30
+         %m1 = OpVariable %_ptr_Function_mat4v4float Function %27
+         %35 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %36 = OpLoad %int %35
+         %37 = OpConvertSToF %float %36
+         %39 = OpCompositeConstruct %v4float %37 %float_0 %float_0 %float_0
+         %40 = OpCompositeConstruct %v4float %float_0 %37 %float_0 %float_0
+         %41 = OpCompositeConstruct %v4float %float_0 %float_0 %37 %float_0
+         %42 = OpCompositeConstruct %v4float %float_0 %float_0 %float_0 %37
+         %43 = OpCompositeConstruct %mat4v4float %39 %40 %41 %42
+               OpStore %m0 %43
+         %45 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %46 = OpLoad %int %45
+               OpStore %c %46
+               OpBranch %47
+         %47 = OpLabel
+               OpLoopMerge %48 %49 None
+               OpBranch %50
+         %50 = OpLabel
+         %51 = OpLoad %int %c
+         %53 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %54 = OpLoad %int %53
+         %55 = OpSLessThan %bool %51 %54
+               OpSelectionMerge %57 None
+               OpBranchConditional %55 %58 %59
+         %58 = OpLabel
+               OpBranch %57
+         %59 = OpLabel
+               OpBranch %48
+         %57 = OpLabel
+         %60 = OpLoad %mat4v4float %m0
+               OpStore %m1 %60
+         %61 = OpLoad %int %c
+         %63 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %64 = OpLoad %int %63
+         %65 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %66 = OpLoad %int %65
+         %68 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_0
+         %69 = OpLoad %float %68
+         %70 = OpSMod %int %61 %64
+         %72 = OpAccessChain %_ptr_Function_float %m1 %70 %66
+               OpStore %72 %69
+         %73 = OpLoad %int %c
+         %74 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %75 = OpLoad %int %74
+         %76 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %77 = OpLoad %int %76
+         %78 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_0
+         %79 = OpLoad %float %78
+         %80 = OpSMod %int %73 %75
+         %81 = OpAccessChain %_ptr_Function_float %m0 %80 %77
+               OpStore %81 %79
+               OpBranch %49
+         %49 = OpLabel
+         %82 = OpLoad %int %c
+         %83 = OpIAdd %int %82 %int_1
+               OpStore %c %83
+               OpBranch %47
+         %48 = OpLabel
+         %84 = OpLoad %mat4v4float %m0
+         %85 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %88 = OpLoad %int %87
+         %89 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %90 = OpLoad %int %89
+         %91 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %92 = OpLoad %int %91
+         %93 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %94 = OpLoad %int %93
+         %95 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %96 = OpLoad %int %95
+         %97 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %98 = OpLoad %int %97
+         %99 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %100 = OpLoad %int %99
+        %101 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %102 = OpLoad %int %101
+        %103 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %104 = OpLoad %int %103
+        %105 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %106 = OpLoad %int %105
+        %107 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %108 = OpLoad %int %107
+        %109 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %110 = OpLoad %int %109
+        %111 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %112 = OpLoad %int %111
+        %113 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %114 = OpLoad %int %113
+        %115 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %116 = OpLoad %int %115
+        %117 = OpConvertSToF %float %86
+        %118 = OpConvertSToF %float %88
+        %119 = OpConvertSToF %float %90
+        %120 = OpConvertSToF %float %92
+        %121 = OpCompositeConstruct %v4float %117 %118 %119 %120
+        %122 = OpConvertSToF %float %94
+        %123 = OpConvertSToF %float %96
+        %124 = OpConvertSToF %float %98
+        %125 = OpConvertSToF %float %100
+        %126 = OpCompositeConstruct %v4float %122 %123 %124 %125
+        %127 = OpConvertSToF %float %102
+        %128 = OpConvertSToF %float %104
+        %129 = OpConvertSToF %float %106
+        %130 = OpConvertSToF %float %108
+        %131 = OpCompositeConstruct %v4float %127 %128 %129 %130
+        %132 = OpConvertSToF %float %110
+        %133 = OpConvertSToF %float %112
+        %134 = OpConvertSToF %float %114
+        %135 = OpConvertSToF %float %116
+        %136 = OpCompositeConstruct %v4float %132 %133 %134 %135
+        %137 = OpCompositeConstruct %mat4v4float %121 %126 %131 %136
+        %139 = OpCompositeExtract %v4float %84 0
+        %140 = OpCompositeExtract %v4float %137 0
+        %141 = OpFOrdEqual %v4bool %139 %140
+        %138 = OpAll %bool %141
+               OpSelectionMerge %143 None
+               OpBranchConditional %138 %144 %143
+        %144 = OpLabel
+        %146 = OpCompositeExtract %v4float %84 1
+        %147 = OpCompositeExtract %v4float %137 1
+        %148 = OpFOrdEqual %v4bool %146 %147
+        %145 = OpAll %bool %148
+               OpBranch %143
+        %143 = OpLabel
+        %149 = OpPhi %bool %138 %48 %145 %144
+               OpSelectionMerge %150 None
+               OpBranchConditional %149 %151 %150
+        %151 = OpLabel
+        %154 = OpCompositeExtract %v4float %84 2
+        %155 = OpCompositeExtract %v4float %137 2
+        %156 = OpFOrdEqual %v4bool %154 %155
+        %152 = OpAll %bool %156
+               OpBranch %150
+        %150 = OpLabel
+        %157 = OpPhi %bool %149 %143 %152 %151
+               OpSelectionMerge %158 None
+               OpBranchConditional %157 %159 %158
+        %159 = OpLabel
+        %162 = OpCompositeExtract %v4float %84 3
+        %163 = OpCompositeExtract %v4float %137 3
+        %164 = OpFOrdEqual %v4bool %162 %163
+        %160 = OpAll %bool %164
+               OpBranch %158
+        %158 = OpLabel
+        %165 = OpPhi %bool %157 %150 %160 %159
+               OpSelectionMerge %166 None
+               OpBranchConditional %165 %167 %168
+        %167 = OpLabel
+        %169 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %170 = OpLoad %int %169
+        %171 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %172 = OpLoad %int %171
+        %173 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %174 = OpLoad %int %173
+        %175 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %176 = OpLoad %int %175
+        %177 = OpConvertSToF %float %170
+        %178 = OpConvertSToF %float %172
+        %179 = OpConvertSToF %float %174
+        %180 = OpConvertSToF %float %176
+        %181 = OpCompositeConstruct %v4float %177 %178 %179 %180
+               OpStore %x_GLF_color %181
+               OpBranch %166
+        %168 = OpLabel
+        %182 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %183 = OpLoad %int %182
+        %184 = OpConvertSToF %float %183
+        %185 = OpCompositeConstruct %v4float %184 %184 %184 %184
+               OpStore %x_GLF_color %185
+               OpBranch %166
+        %166 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %186
+%tint_symbol = OpFunctionParameter %main_out
+        %190 = OpLabel
+        %191 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %191
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %193 = OpLabel
+        %194 = OpFunctionCall %void %main_1
+        %196 = OpLoad %v4float %x_GLF_color
+        %197 = OpCompositeConstruct %main_out %196
+        %195 = OpFunctionCall %void %tint_symbol_2 %197
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..cd04198
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,96 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m0 : mat4x4<f32>;
+  var c : i32;
+  var m1 : mat4x4<f32>;
+  let x_40 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_41 : f32 = f32(x_40);
+  m0 = mat4x4<f32>(vec4<f32>(x_41, 0.0, 0.0, 0.0), vec4<f32>(0.0, x_41, 0.0, 0.0), vec4<f32>(0.0, 0.0, x_41, 0.0), vec4<f32>(0.0, 0.0, 0.0, x_41));
+  let x_48 : i32 = x_6.x_GLF_uniform_int_values[2];
+  c = x_48;
+  loop {
+    let x_53 : i32 = c;
+    let x_55 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_53 < x_55)) {
+    } else {
+      break;
+    }
+    let x_58 : mat4x4<f32> = m0;
+    m1 = x_58;
+    let x_59 : i32 = c;
+    let x_61 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_64 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_66 : f32 = x_10.x_GLF_uniform_float_values[0];
+    m1[(x_59 % x_61)][x_64] = x_66;
+    let x_68 : i32 = c;
+    let x_70 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_73 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_75 : f32 = x_10.x_GLF_uniform_float_values[0];
+    m0[(x_68 % x_70)][x_73] = x_75;
+
+    continuing {
+      let x_77 : i32 = c;
+      c = (x_77 + 1);
+    }
+  }
+  let x_79 : mat4x4<f32> = m0;
+  let x_81 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_84 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_87 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_90 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_93 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_96 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_99 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_102 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_105 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_108 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_111 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_114 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_117 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_120 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_123 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_126 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_132 : mat4x4<f32> = mat4x4<f32>(vec4<f32>(f32(x_81), f32(x_84), f32(x_87), f32(x_90)), vec4<f32>(f32(x_93), f32(x_96), f32(x_99), f32(x_102)), vec4<f32>(f32(x_105), f32(x_108), f32(x_111), f32(x_114)), vec4<f32>(f32(x_117), f32(x_120), f32(x_123), f32(x_126)));
+  if ((((all((x_79[0u] == x_132[0u])) && all((x_79[1u] == x_132[1u]))) && all((x_79[2u] == x_132[2u]))) && all((x_79[3u] == x_132[3u])))) {
+    let x_156 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_159 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_162 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_165 : i32 = x_6.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_156), f32(x_159), f32(x_162), f32(x_165));
+  } else {
+    let x_169 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_170 : f32 = f32(x_169);
+    x_GLF_color = vec4<f32>(x_170, x_170, x_170, x_170);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.wgsl
new file mode 100644
index 0000000..cd04198
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.wgsl
@@ -0,0 +1,96 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m0 : mat4x4<f32>;
+  var c : i32;
+  var m1 : mat4x4<f32>;
+  let x_40 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_41 : f32 = f32(x_40);
+  m0 = mat4x4<f32>(vec4<f32>(x_41, 0.0, 0.0, 0.0), vec4<f32>(0.0, x_41, 0.0, 0.0), vec4<f32>(0.0, 0.0, x_41, 0.0), vec4<f32>(0.0, 0.0, 0.0, x_41));
+  let x_48 : i32 = x_6.x_GLF_uniform_int_values[2];
+  c = x_48;
+  loop {
+    let x_53 : i32 = c;
+    let x_55 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_53 < x_55)) {
+    } else {
+      break;
+    }
+    let x_58 : mat4x4<f32> = m0;
+    m1 = x_58;
+    let x_59 : i32 = c;
+    let x_61 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_64 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_66 : f32 = x_10.x_GLF_uniform_float_values[0];
+    m1[(x_59 % x_61)][x_64] = x_66;
+    let x_68 : i32 = c;
+    let x_70 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_73 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_75 : f32 = x_10.x_GLF_uniform_float_values[0];
+    m0[(x_68 % x_70)][x_73] = x_75;
+
+    continuing {
+      let x_77 : i32 = c;
+      c = (x_77 + 1);
+    }
+  }
+  let x_79 : mat4x4<f32> = m0;
+  let x_81 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_84 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_87 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_90 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_93 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_96 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_99 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_102 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_105 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_108 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_111 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_114 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_117 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_120 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_123 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_126 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_132 : mat4x4<f32> = mat4x4<f32>(vec4<f32>(f32(x_81), f32(x_84), f32(x_87), f32(x_90)), vec4<f32>(f32(x_93), f32(x_96), f32(x_99), f32(x_102)), vec4<f32>(f32(x_105), f32(x_108), f32(x_111), f32(x_114)), vec4<f32>(f32(x_117), f32(x_120), f32(x_123), f32(x_126)));
+  if ((((all((x_79[0u] == x_132[0u])) && all((x_79[1u] == x_132[1u]))) && all((x_79[2u] == x_132[2u]))) && all((x_79[3u] == x_132[3u])))) {
+    let x_156 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_159 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_162 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_165 : i32 = x_6.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_156), f32(x_159), f32(x_162), f32(x_165));
+  } else {
+    let x_169 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_170 : f32 = f32(x_169);
+    x_GLF_color = vec4<f32>(x_170, x_170, x_170, x_170);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..258443f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,103 @@
+void set_float4(inout float4 vec, int idx, float val) {
+  vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
+}
+
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[4];
+};
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4x4 m0 = float4x4(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  int c = 0;
+  float4x4 m1 = float4x4(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  const int x_40 = asint(x_6[1].x);
+  const float x_41 = float(x_40);
+  m0 = float4x4(float4(x_41, 0.0f, 0.0f, 0.0f), float4(0.0f, x_41, 0.0f, 0.0f), float4(0.0f, 0.0f, x_41, 0.0f), float4(0.0f, 0.0f, 0.0f, x_41));
+  const int x_48 = asint(x_6[2].x);
+  c = x_48;
+  while (true) {
+    const int x_53 = c;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_55 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_53 < x_55)) {
+    } else {
+      break;
+    }
+    m1 = m0;
+    const int x_59 = c;
+    const int x_61 = asint(x_6[3].x);
+    const int x_64 = asint(x_6[2].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const float x_66 = asfloat(x_10[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    set_float4(m1[(x_59 % x_61)], x_64, x_66);
+    const int x_68 = c;
+    const int x_70 = asint(x_6[3].x);
+    const int x_73 = asint(x_6[2].x);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const float x_75 = asfloat(x_10[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    set_float4(m0[(x_68 % x_70)], x_73, x_75);
+    {
+      c = (c + 1);
+    }
+  }
+  const float4x4 x_79 = m0;
+  const int x_81 = asint(x_6[1].x);
+  const int x_84 = asint(x_6[2].x);
+  const int x_87 = asint(x_6[1].x);
+  const int x_90 = asint(x_6[1].x);
+  const int x_93 = asint(x_6[1].x);
+  const int x_96 = asint(x_6[2].x);
+  const int x_99 = asint(x_6[1].x);
+  const int x_102 = asint(x_6[1].x);
+  const int x_105 = asint(x_6[1].x);
+  const int x_108 = asint(x_6[2].x);
+  const int x_111 = asint(x_6[1].x);
+  const int x_114 = asint(x_6[1].x);
+  const int x_117 = asint(x_6[1].x);
+  const int x_120 = asint(x_6[2].x);
+  const int x_123 = asint(x_6[1].x);
+  const int x_126 = asint(x_6[1].x);
+  const float4x4 x_132 = float4x4(float4(float(x_81), float(x_84), float(x_87), float(x_90)), float4(float(x_93), float(x_96), float(x_99), float(x_102)), float4(float(x_105), float(x_108), float(x_111), float(x_114)), float4(float(x_117), float(x_120), float(x_123), float(x_126)));
+  bool tint_tmp_2 = all((x_79[0u] == x_132[0u]));
+  if (tint_tmp_2) {
+    tint_tmp_2 = all((x_79[1u] == x_132[1u]));
+  }
+  bool tint_tmp_1 = (tint_tmp_2);
+  if (tint_tmp_1) {
+    tint_tmp_1 = all((x_79[2u] == x_132[2u]));
+  }
+  bool tint_tmp = (tint_tmp_1);
+  if (tint_tmp) {
+    tint_tmp = all((x_79[3u] == x_132[3u]));
+  }
+  if ((tint_tmp)) {
+    const int x_156 = asint(x_6[2].x);
+    const int x_159 = asint(x_6[1].x);
+    const int x_162 = asint(x_6[1].x);
+    const int x_165 = asint(x_6[2].x);
+    x_GLF_color = float4(float(x_156), float(x_159), float(x_162), float(x_165));
+  } else {
+    const int x_169 = asint(x_6[1].x);
+    const float x_170 = float(x_169);
+    x_GLF_color = float4(x_170, x_170, x_170, x_170);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..2e9eaea
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.wgsl.expected.msl
@@ -0,0 +1,103 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_10, thread float4* const tint_symbol_4) {
+  float4x4 m0 = float4x4(0.0f);
+  int c = 0;
+  float4x4 m1 = float4x4(0.0f);
+  int const x_40 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  float const x_41 = float(x_40);
+  m0 = float4x4(float4(x_41, 0.0f, 0.0f, 0.0f), float4(0.0f, x_41, 0.0f, 0.0f), float4(0.0f, 0.0f, x_41, 0.0f), float4(0.0f, 0.0f, 0.0f, x_41));
+  int const x_48 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  c = x_48;
+  while (true) {
+    int const x_53 = c;
+    int const x_55 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_53 < x_55)) {
+    } else {
+      break;
+    }
+    float4x4 const x_58 = m0;
+    m1 = x_58;
+    int const x_59 = c;
+    int const x_61 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    int const x_64 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    float const x_66 = x_10.x_GLF_uniform_float_values.arr[0].el;
+    m1[(x_59 % x_61)][x_64] = x_66;
+    int const x_68 = c;
+    int const x_70 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    int const x_73 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    float const x_75 = x_10.x_GLF_uniform_float_values.arr[0].el;
+    m0[(x_68 % x_70)][x_73] = x_75;
+    {
+      int const x_77 = c;
+      c = (x_77 + 1);
+    }
+  }
+  float4x4 const x_79 = m0;
+  int const x_81 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_84 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_87 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_90 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_93 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_96 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_99 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_102 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_105 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_108 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_111 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_114 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_117 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_120 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_123 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_126 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  float4x4 const x_132 = float4x4(float4(float(x_81), float(x_84), float(x_87), float(x_90)), float4(float(x_93), float(x_96), float(x_99), float(x_102)), float4(float(x_105), float(x_108), float(x_111), float(x_114)), float4(float(x_117), float(x_120), float(x_123), float(x_126)));
+  if ((((all((x_79[0u] == x_132[0u])) && all((x_79[1u] == x_132[1u]))) && all((x_79[2u] == x_132[2u]))) && all((x_79[3u] == x_132[3u])))) {
+    int const x_156 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_159 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_162 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_165 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    *(tint_symbol_4) = float4(float(x_156), float(x_159), float(x_162), float(x_165));
+  } else {
+    int const x_169 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    float const x_170 = float(x_169);
+    *(tint_symbol_4) = float4(x_170, x_170, x_170, x_170);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_10 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..1bf7a3d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,274 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 198
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_float_values"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %m0 "m0"
+               OpName %c "c"
+               OpName %m1 "m1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf1 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %float = OpTypeFloat 32
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf0 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%mat4v4float = OpTypeMatrix %v4float 4
+%_ptr_Function_mat4v4float = OpTypePointer Function %mat4v4float
+         %27 = OpConstantNull %mat4v4float
+%_ptr_Function_int = OpTypePointer Function %int
+         %30 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+    %float_0 = OpConstant %float 0
+      %int_2 = OpConstant %int 2
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_float = OpTypePointer Function %float
+     %v4bool = OpTypeVector %bool 4
+     %uint_2 = OpConstant %uint 2
+     %uint_3 = OpConstant %uint 3
+   %main_out = OpTypeStruct %v4float
+        %186 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+         %m0 = OpVariable %_ptr_Function_mat4v4float Function %27
+          %c = OpVariable %_ptr_Function_int Function %30
+         %m1 = OpVariable %_ptr_Function_mat4v4float Function %27
+         %35 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %36 = OpLoad %int %35
+         %37 = OpConvertSToF %float %36
+         %39 = OpCompositeConstruct %v4float %37 %float_0 %float_0 %float_0
+         %40 = OpCompositeConstruct %v4float %float_0 %37 %float_0 %float_0
+         %41 = OpCompositeConstruct %v4float %float_0 %float_0 %37 %float_0
+         %42 = OpCompositeConstruct %v4float %float_0 %float_0 %float_0 %37
+         %43 = OpCompositeConstruct %mat4v4float %39 %40 %41 %42
+               OpStore %m0 %43
+         %45 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %46 = OpLoad %int %45
+               OpStore %c %46
+               OpBranch %47
+         %47 = OpLabel
+               OpLoopMerge %48 %49 None
+               OpBranch %50
+         %50 = OpLabel
+         %51 = OpLoad %int %c
+         %53 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %54 = OpLoad %int %53
+         %55 = OpSLessThan %bool %51 %54
+               OpSelectionMerge %57 None
+               OpBranchConditional %55 %58 %59
+         %58 = OpLabel
+               OpBranch %57
+         %59 = OpLabel
+               OpBranch %48
+         %57 = OpLabel
+         %60 = OpLoad %mat4v4float %m0
+               OpStore %m1 %60
+         %61 = OpLoad %int %c
+         %63 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %64 = OpLoad %int %63
+         %65 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %66 = OpLoad %int %65
+         %68 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_0
+         %69 = OpLoad %float %68
+         %70 = OpSMod %int %61 %64
+         %72 = OpAccessChain %_ptr_Function_float %m1 %70 %66
+               OpStore %72 %69
+         %73 = OpLoad %int %c
+         %74 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %75 = OpLoad %int %74
+         %76 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %77 = OpLoad %int %76
+         %78 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %int_0
+         %79 = OpLoad %float %78
+         %80 = OpSMod %int %73 %75
+         %81 = OpAccessChain %_ptr_Function_float %m0 %80 %77
+               OpStore %81 %79
+               OpBranch %49
+         %49 = OpLabel
+         %82 = OpLoad %int %c
+         %83 = OpIAdd %int %82 %int_1
+               OpStore %c %83
+               OpBranch %47
+         %48 = OpLabel
+         %84 = OpLoad %mat4v4float %m0
+         %85 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %88 = OpLoad %int %87
+         %89 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %90 = OpLoad %int %89
+         %91 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %92 = OpLoad %int %91
+         %93 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %94 = OpLoad %int %93
+         %95 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %96 = OpLoad %int %95
+         %97 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %98 = OpLoad %int %97
+         %99 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %100 = OpLoad %int %99
+        %101 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %102 = OpLoad %int %101
+        %103 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %104 = OpLoad %int %103
+        %105 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %106 = OpLoad %int %105
+        %107 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %108 = OpLoad %int %107
+        %109 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %110 = OpLoad %int %109
+        %111 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %112 = OpLoad %int %111
+        %113 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %114 = OpLoad %int %113
+        %115 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %116 = OpLoad %int %115
+        %117 = OpConvertSToF %float %86
+        %118 = OpConvertSToF %float %88
+        %119 = OpConvertSToF %float %90
+        %120 = OpConvertSToF %float %92
+        %121 = OpCompositeConstruct %v4float %117 %118 %119 %120
+        %122 = OpConvertSToF %float %94
+        %123 = OpConvertSToF %float %96
+        %124 = OpConvertSToF %float %98
+        %125 = OpConvertSToF %float %100
+        %126 = OpCompositeConstruct %v4float %122 %123 %124 %125
+        %127 = OpConvertSToF %float %102
+        %128 = OpConvertSToF %float %104
+        %129 = OpConvertSToF %float %106
+        %130 = OpConvertSToF %float %108
+        %131 = OpCompositeConstruct %v4float %127 %128 %129 %130
+        %132 = OpConvertSToF %float %110
+        %133 = OpConvertSToF %float %112
+        %134 = OpConvertSToF %float %114
+        %135 = OpConvertSToF %float %116
+        %136 = OpCompositeConstruct %v4float %132 %133 %134 %135
+        %137 = OpCompositeConstruct %mat4v4float %121 %126 %131 %136
+        %139 = OpCompositeExtract %v4float %84 0
+        %140 = OpCompositeExtract %v4float %137 0
+        %141 = OpFOrdEqual %v4bool %139 %140
+        %138 = OpAll %bool %141
+               OpSelectionMerge %143 None
+               OpBranchConditional %138 %144 %143
+        %144 = OpLabel
+        %146 = OpCompositeExtract %v4float %84 1
+        %147 = OpCompositeExtract %v4float %137 1
+        %148 = OpFOrdEqual %v4bool %146 %147
+        %145 = OpAll %bool %148
+               OpBranch %143
+        %143 = OpLabel
+        %149 = OpPhi %bool %138 %48 %145 %144
+               OpSelectionMerge %150 None
+               OpBranchConditional %149 %151 %150
+        %151 = OpLabel
+        %154 = OpCompositeExtract %v4float %84 2
+        %155 = OpCompositeExtract %v4float %137 2
+        %156 = OpFOrdEqual %v4bool %154 %155
+        %152 = OpAll %bool %156
+               OpBranch %150
+        %150 = OpLabel
+        %157 = OpPhi %bool %149 %143 %152 %151
+               OpSelectionMerge %158 None
+               OpBranchConditional %157 %159 %158
+        %159 = OpLabel
+        %162 = OpCompositeExtract %v4float %84 3
+        %163 = OpCompositeExtract %v4float %137 3
+        %164 = OpFOrdEqual %v4bool %162 %163
+        %160 = OpAll %bool %164
+               OpBranch %158
+        %158 = OpLabel
+        %165 = OpPhi %bool %157 %150 %160 %159
+               OpSelectionMerge %166 None
+               OpBranchConditional %165 %167 %168
+        %167 = OpLabel
+        %169 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %170 = OpLoad %int %169
+        %171 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %172 = OpLoad %int %171
+        %173 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %174 = OpLoad %int %173
+        %175 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %176 = OpLoad %int %175
+        %177 = OpConvertSToF %float %170
+        %178 = OpConvertSToF %float %172
+        %179 = OpConvertSToF %float %174
+        %180 = OpConvertSToF %float %176
+        %181 = OpCompositeConstruct %v4float %177 %178 %179 %180
+               OpStore %x_GLF_color %181
+               OpBranch %166
+        %168 = OpLabel
+        %182 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %183 = OpLoad %int %182
+        %184 = OpConvertSToF %float %183
+        %185 = OpCompositeConstruct %v4float %184 %184 %184 %184
+               OpStore %x_GLF_color %185
+               OpBranch %166
+        %166 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %186
+%tint_symbol = OpFunctionParameter %main_out
+        %190 = OpLabel
+        %191 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %191
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %193 = OpLabel
+        %194 = OpFunctionCall %void %main_1
+        %196 = OpLoad %v4float %x_GLF_color
+        %197 = OpCompositeConstruct %main_out %196
+        %195 = OpFunctionCall %void %tint_symbol_2 %197
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..cd04198
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,96 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m0 : mat4x4<f32>;
+  var c : i32;
+  var m1 : mat4x4<f32>;
+  let x_40 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_41 : f32 = f32(x_40);
+  m0 = mat4x4<f32>(vec4<f32>(x_41, 0.0, 0.0, 0.0), vec4<f32>(0.0, x_41, 0.0, 0.0), vec4<f32>(0.0, 0.0, x_41, 0.0), vec4<f32>(0.0, 0.0, 0.0, x_41));
+  let x_48 : i32 = x_6.x_GLF_uniform_int_values[2];
+  c = x_48;
+  loop {
+    let x_53 : i32 = c;
+    let x_55 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_53 < x_55)) {
+    } else {
+      break;
+    }
+    let x_58 : mat4x4<f32> = m0;
+    m1 = x_58;
+    let x_59 : i32 = c;
+    let x_61 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_64 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_66 : f32 = x_10.x_GLF_uniform_float_values[0];
+    m1[(x_59 % x_61)][x_64] = x_66;
+    let x_68 : i32 = c;
+    let x_70 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_73 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_75 : f32 = x_10.x_GLF_uniform_float_values[0];
+    m0[(x_68 % x_70)][x_73] = x_75;
+
+    continuing {
+      let x_77 : i32 = c;
+      c = (x_77 + 1);
+    }
+  }
+  let x_79 : mat4x4<f32> = m0;
+  let x_81 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_84 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_87 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_90 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_93 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_96 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_99 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_102 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_105 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_108 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_111 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_114 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_117 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_120 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_123 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_126 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_132 : mat4x4<f32> = mat4x4<f32>(vec4<f32>(f32(x_81), f32(x_84), f32(x_87), f32(x_90)), vec4<f32>(f32(x_93), f32(x_96), f32(x_99), f32(x_102)), vec4<f32>(f32(x_105), f32(x_108), f32(x_111), f32(x_114)), vec4<f32>(f32(x_117), f32(x_120), f32(x_123), f32(x_126)));
+  if ((((all((x_79[0u] == x_132[0u])) && all((x_79[1u] == x_132[1u]))) && all((x_79[2u] == x_132[2u]))) && all((x_79[3u] == x_132[3u])))) {
+    let x_156 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_159 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_162 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_165 : i32 = x_6.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_156), f32(x_159), f32(x_162), f32(x_165));
+  } else {
+    let x_169 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_170 : f32 = f32(x_169);
+    x_GLF_color = vec4<f32>(x_170, x_170, x_170, x_170);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.spvasm
new file mode 100644
index 0000000..5591664
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.spvasm
@@ -0,0 +1,67 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %22 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %23 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %8
+         %24 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+               OpStore %a %int_0
+         %25 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %26 = OpLoad %int %25
+               OpSelectionMerge %27 None
+               OpSwitch %26 %28 2 %29 3 %29 4 %30
+         %28 = OpLabel
+               OpStore %a %int_2
+               OpBranch %27
+         %29 = OpLabel
+               OpStore %a %int_1
+               OpBranch %30
+         %30 = OpLabel
+               OpBranch %27
+         %27 = OpLabel
+         %31 = OpLoad %int %a
+         %32 = OpIEqual %bool %31 %int_2
+               OpSelectionMerge %33 None
+               OpBranchConditional %32 %34 %35
+         %34 = OpLabel
+               OpStore %_GLF_color %22
+               OpBranch %33
+         %35 = OpLabel
+               OpStore %_GLF_color %23
+               OpBranch %33
+         %33 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..60bd733
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,44 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  a = 0;
+  const int x_26 = asint(x_6[0].x);
+  switch(x_26) {
+    case 2:
+    case 3: {
+      a = 1;
+      /* fallthrough */
+    }
+    case 4: {
+      break;
+    }
+    default: {
+      a = 2;
+      break;
+    }
+  }
+  if ((a == 2)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..4c04e10
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.spvasm.expected.msl
@@ -0,0 +1,48 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int a = 0;
+  a = 0;
+  int const x_26 = x_6.one;
+  switch(x_26) {
+    case 2:
+    case 3: {
+      a = 1;
+      /* fallthrough */
+    }
+    case 4: {
+      break;
+    }
+    default: {
+      a = 2;
+      break;
+    }
+  }
+  int const x_31 = a;
+  if ((x_31 == 2)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..b35e4cc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,101 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 53
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %39 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %40 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %41 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %18
+               OpStore %a %int_0
+         %23 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0
+         %24 = OpLoad %int %23
+               OpSelectionMerge %25 None
+               OpSwitch %24 %26 2 %27 3 %27 4 %28
+         %27 = OpLabel
+               OpStore %a %int_1
+               OpBranch %28
+         %28 = OpLabel
+               OpBranch %25
+         %26 = OpLabel
+               OpStore %a %int_2
+               OpBranch %25
+         %25 = OpLabel
+         %31 = OpLoad %int %a
+         %32 = OpIEqual %bool %31 %int_2
+               OpSelectionMerge %34 None
+               OpBranchConditional %32 %35 %36
+         %35 = OpLabel
+               OpStore %x_GLF_color %39
+               OpBranch %34
+         %36 = OpLabel
+               OpStore %x_GLF_color %40
+               OpBranch %34
+         %34 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %41
+%tint_symbol = OpFunctionParameter %main_out
+         %45 = OpLabel
+         %46 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %46
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %48 = OpLabel
+         %49 = OpFunctionCall %void %main_1
+         %51 = OpLoad %v4float %x_GLF_color
+         %52 = OpCompositeConstruct %main_out %51
+         %50 = OpFunctionCall %void %tint_symbol_2 %52
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..7ac234c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,43 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  a = 0;
+  let x_26 : i32 = x_6.one;
+  switch(x_26) {
+    case 2, 3: {
+      a = 1;
+      fallthrough;
+    }
+    case 4: {
+    }
+    default: {
+      a = 2;
+    }
+  }
+  let x_31 : i32 = a;
+  if ((x_31 == 2)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.wgsl
new file mode 100644
index 0000000..7ac234c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.wgsl
@@ -0,0 +1,43 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  a = 0;
+  let x_26 : i32 = x_6.one;
+  switch(x_26) {
+    case 2, 3: {
+      a = 1;
+      fallthrough;
+    }
+    case 4: {
+    }
+    default: {
+      a = 2;
+    }
+  }
+  let x_31 : i32 = a;
+  if ((x_31 == 2)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..60bd733
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,44 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  a = 0;
+  const int x_26 = asint(x_6[0].x);
+  switch(x_26) {
+    case 2:
+    case 3: {
+      a = 1;
+      /* fallthrough */
+    }
+    case 4: {
+      break;
+    }
+    default: {
+      a = 2;
+      break;
+    }
+  }
+  if ((a == 2)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..4c04e10
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.wgsl.expected.msl
@@ -0,0 +1,48 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int a = 0;
+  a = 0;
+  int const x_26 = x_6.one;
+  switch(x_26) {
+    case 2:
+    case 3: {
+      a = 1;
+      /* fallthrough */
+    }
+    case 4: {
+      break;
+    }
+    default: {
+      a = 2;
+      break;
+    }
+  }
+  int const x_31 = a;
+  if ((x_31 == 2)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..b35e4cc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,101 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 53
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %39 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %40 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %41 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %18
+               OpStore %a %int_0
+         %23 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0
+         %24 = OpLoad %int %23
+               OpSelectionMerge %25 None
+               OpSwitch %24 %26 2 %27 3 %27 4 %28
+         %27 = OpLabel
+               OpStore %a %int_1
+               OpBranch %28
+         %28 = OpLabel
+               OpBranch %25
+         %26 = OpLabel
+               OpStore %a %int_2
+               OpBranch %25
+         %25 = OpLabel
+         %31 = OpLoad %int %a
+         %32 = OpIEqual %bool %31 %int_2
+               OpSelectionMerge %34 None
+               OpBranchConditional %32 %35 %36
+         %35 = OpLabel
+               OpStore %x_GLF_color %39
+               OpBranch %34
+         %36 = OpLabel
+               OpStore %x_GLF_color %40
+               OpBranch %34
+         %34 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %41
+%tint_symbol = OpFunctionParameter %main_out
+         %45 = OpLabel
+         %46 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %46
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %48 = OpLabel
+         %49 = OpFunctionCall %void %main_1
+         %51 = OpLoad %v4float %x_GLF_color
+         %52 = OpCompositeConstruct %main_out %51
+         %50 = OpFunctionCall %void %tint_symbol_2 %52
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..7ac234c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,43 @@
+[[block]]
+struct buf0 {
+  one : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  a = 0;
+  let x_26 : i32 = x_6.one;
+  switch(x_26) {
+    case 2, 3: {
+      a = 1;
+      fallthrough;
+    }
+    case 4: {
+    }
+    default: {
+      a = 2;
+    }
+  }
+  let x_31 : i32 = a;
+  if ((x_31 == 2)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-inst-combine-select-value-tracking-flip-bits/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-value-inst-combine-select-value-tracking-flip-bits/0-opt.spvasm
new file mode 100644
index 0000000..0528283
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-inst-combine-select-value-tracking-flip-bits/0-opt.spvasm
@@ -0,0 +1,115 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %i "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %A "A"
+               OpName %a "a"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+%_ptr_Function__arr_int_uint_2 = OpTypePointer Function %_arr_int_uint_2
+      %int_2 = OpConstant %int 2
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %11
+         %28 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+          %A = OpVariable %_ptr_Function__arr_int_uint_2 Function
+          %a = OpVariable %_ptr_Function_int Function
+         %29 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %30 = OpLoad %int %29
+               OpStore %i %30
+               OpBranch %31
+         %31 = OpLabel
+               OpLoopMerge %32 %33 None
+               OpBranch %34
+         %34 = OpLabel
+         %35 = OpLoad %int %i
+         %36 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %37 = OpLoad %int %36
+         %38 = OpSLessThan %bool %35 %37
+               OpBranchConditional %38 %39 %32
+         %39 = OpLabel
+         %40 = OpLoad %int %i
+         %41 = OpLoad %int %i
+         %42 = OpAccessChain %_ptr_Function_int %A %40
+               OpStore %42 %41
+               OpBranch %33
+         %33 = OpLabel
+         %43 = OpLoad %int %i
+         %44 = OpIAdd %int %43 %int_1
+               OpStore %i %44
+               OpBranch %31
+         %32 = OpLabel
+         %45 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %46 = OpLoad %int %45
+         %47 = OpAccessChain %_ptr_Function_int %A %46
+         %48 = OpLoad %int %47
+         %49 = OpNot %int %48
+         %50 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %51 = OpLoad %int %50
+         %52 = OpAccessChain %_ptr_Function_int %A %51
+         %53 = OpLoad %int %52
+         %54 = OpNot %int %53
+         %55 = OpExtInst %int %1 SMin %49 %54
+               OpStore %a %55
+         %56 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %57 = OpLoad %int %56
+         %58 = OpConvertSToF %float %57
+         %59 = OpCompositeConstruct %v4float %58 %58 %58 %58
+               OpStore %_GLF_color %59
+         %60 = OpLoad %int %a
+         %61 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %62 = OpLoad %int %61
+         %63 = OpSNegate %int %62
+         %64 = OpIEqual %bool %60 %63
+               OpSelectionMerge %65 None
+               OpBranchConditional %64 %66 %65
+         %66 = OpLabel
+         %67 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %68 = OpLoad %int %67
+         %69 = OpConvertSToF %float %68
+         %70 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %71 = OpLoad %int %70
+         %72 = OpConvertSToF %float %71
+         %73 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %74 = OpLoad %int %73
+         %75 = OpConvertSToF %float %74
+         %76 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %77 = OpLoad %int %76
+         %78 = OpConvertSToF %float %77
+         %79 = OpCompositeConstruct %v4float %69 %72 %75 %78
+               OpStore %_GLF_color %79
+               OpBranch %65
+         %65 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-inst-combine-select-value-tracking-flip-bits/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-value-inst-combine-select-value-tracking-flip-bits/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..b0be04f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-inst-combine-select-value-tracking-flip-bits/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,58 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int i = 0;
+  int A[2] = (int[2])0;
+  int a = 0;
+  const int x_30 = asint(x_6[1].x);
+  i = x_30;
+  while (true) {
+    const int x_35 = i;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_37 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_35 < x_37)) {
+    } else {
+      break;
+    }
+    A[i] = i;
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_46 = asint(x_6[1].x);
+  const int x_48 = A[x_46];
+  const int x_51 = asint(x_6[2].x);
+  const int x_53 = A[x_51];
+  a = min(~(x_48), ~(x_53));
+  const int x_57 = asint(x_6[1].x);
+  const float x_58 = float(x_57);
+  x_GLF_color = float4(x_58, x_58, x_58, x_58);
+  const int x_60 = a;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_62 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_60 == -(x_62))) {
+    const int x_68 = asint(x_6[2].x);
+    const int x_71 = asint(x_6[1].x);
+    const int x_74 = asint(x_6[1].x);
+    const int x_77 = asint(x_6[2].x);
+    x_GLF_color = float4(float(x_68), float(x_71), float(x_74), float(x_77));
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-inst-combine-select-value-tracking-flip-bits/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-value-inst-combine-select-value-tracking-flip-bits/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..4aaf44e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-inst-combine-select-value-tracking-flip-bits/0-opt.spvasm.expected.msl
@@ -0,0 +1,72 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_1 {
+  int arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int i = 0;
+  tint_array_wrapper_1 A = {};
+  int a = 0;
+  int const x_30 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  i = x_30;
+  while (true) {
+    int const x_35 = i;
+    int const x_37 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_35 < x_37)) {
+    } else {
+      break;
+    }
+    int const x_40 = i;
+    int const x_41 = i;
+    A.arr[x_40] = x_41;
+    {
+      int const x_43 = i;
+      i = (x_43 + 1);
+    }
+  }
+  int const x_46 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_48 = A.arr[x_46];
+  int const x_51 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_53 = A.arr[x_51];
+  a = min(~(x_48), ~(x_53));
+  int const x_57 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  float const x_58 = float(x_57);
+  *(tint_symbol_4) = float4(x_58, x_58, x_58, x_58);
+  int const x_60 = a;
+  int const x_62 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  if ((x_60 == -(x_62))) {
+    int const x_68 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_71 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_74 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_77 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    *(tint_symbol_4) = float4(float(x_68), float(x_71), float(x_74), float(x_77));
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-inst-combine-select-value-tracking-flip-bits/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-value-inst-combine-select-value-tracking-flip-bits/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..35b828d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-inst-combine-select-value-tracking-flip-bits/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,156 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 100
+; Schema: 0
+               OpCapability Shader
+         %61 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %A "A"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+%_ptr_Function__arr_int_uint_2 = OpTypePointer Function %_arr_int_uint_2
+         %26 = OpConstantNull %_arr_int_uint_2
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+         %88 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %21
+          %A = OpVariable %_ptr_Function__arr_int_uint_2 Function %26
+          %a = OpVariable %_ptr_Function_int Function %21
+         %31 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %32 = OpLoad %int %31
+               OpStore %i %32
+               OpBranch %33
+         %33 = OpLabel
+               OpLoopMerge %34 %35 None
+               OpBranch %36
+         %36 = OpLabel
+         %37 = OpLoad %int %i
+         %39 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %40 = OpLoad %int %39
+         %41 = OpSLessThan %bool %37 %40
+               OpSelectionMerge %43 None
+               OpBranchConditional %41 %44 %45
+         %44 = OpLabel
+               OpBranch %43
+         %45 = OpLabel
+               OpBranch %34
+         %43 = OpLabel
+         %46 = OpLoad %int %i
+         %47 = OpLoad %int %i
+         %48 = OpAccessChain %_ptr_Function_int %A %46
+               OpStore %48 %47
+               OpBranch %35
+         %35 = OpLabel
+         %49 = OpLoad %int %i
+         %50 = OpIAdd %int %49 %int_1
+               OpStore %i %50
+               OpBranch %33
+         %34 = OpLabel
+         %51 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %52 = OpLoad %int %51
+         %53 = OpAccessChain %_ptr_Function_int %A %52
+         %54 = OpLoad %int %53
+         %56 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %57 = OpLoad %int %56
+         %58 = OpAccessChain %_ptr_Function_int %A %57
+         %59 = OpLoad %int %58
+         %62 = OpNot %int %54
+         %63 = OpNot %int %59
+         %60 = OpExtInst %int %61 SMin %62 %63
+               OpStore %a %60
+         %64 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %65 = OpLoad %int %64
+         %66 = OpConvertSToF %float %65
+         %67 = OpCompositeConstruct %v4float %66 %66 %66 %66
+               OpStore %x_GLF_color %67
+         %68 = OpLoad %int %a
+         %69 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %70 = OpLoad %int %69
+         %71 = OpSNegate %int %70
+         %72 = OpIEqual %bool %68 %71
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %74 %73
+         %74 = OpLabel
+         %75 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %76 = OpLoad %int %75
+         %77 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %78 = OpLoad %int %77
+         %79 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %80 = OpLoad %int %79
+         %81 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %82 = OpLoad %int %81
+         %83 = OpConvertSToF %float %76
+         %84 = OpConvertSToF %float %78
+         %85 = OpConvertSToF %float %80
+         %86 = OpConvertSToF %float %82
+         %87 = OpCompositeConstruct %v4float %83 %84 %85 %86
+               OpStore %x_GLF_color %87
+               OpBranch %73
+         %73 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %88
+%tint_symbol = OpFunctionParameter %main_out
+         %92 = OpLabel
+         %93 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %93
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %95 = OpLabel
+         %96 = OpFunctionCall %void %main_1
+         %98 = OpLoad %v4float %x_GLF_color
+         %99 = OpCompositeConstruct %main_out %98
+         %97 = OpFunctionCall %void %tint_symbol_2 %99
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-inst-combine-select-value-tracking-flip-bits/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-value-inst-combine-select-value-tracking-flip-bits/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..c17f0bb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-inst-combine-select-value-tracking-flip-bits/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,63 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  var A : array<i32, 2>;
+  var a : i32;
+  let x_30 : i32 = x_6.x_GLF_uniform_int_values[1];
+  i = x_30;
+  loop {
+    let x_35 : i32 = i;
+    let x_37 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_35 < x_37)) {
+    } else {
+      break;
+    }
+    let x_40 : i32 = i;
+    let x_41 : i32 = i;
+    A[x_40] = x_41;
+
+    continuing {
+      let x_43 : i32 = i;
+      i = (x_43 + 1);
+    }
+  }
+  let x_46 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_48 : i32 = A[x_46];
+  let x_51 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_53 : i32 = A[x_51];
+  a = min(~(x_48), ~(x_53));
+  let x_57 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_58 : f32 = f32(x_57);
+  x_GLF_color = vec4<f32>(x_58, x_58, x_58, x_58);
+  let x_60 : i32 = a;
+  let x_62 : i32 = x_6.x_GLF_uniform_int_values[0];
+  if ((x_60 == -(x_62))) {
+    let x_68 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_71 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_74 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_77 : i32 = x_6.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_68), f32(x_71), f32(x_74), f32(x_77));
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-inst-combine-select-value-tracking-flip-bits/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-value-inst-combine-select-value-tracking-flip-bits/0-opt.wgsl
new file mode 100644
index 0000000..c17f0bb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-inst-combine-select-value-tracking-flip-bits/0-opt.wgsl
@@ -0,0 +1,63 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  var A : array<i32, 2>;
+  var a : i32;
+  let x_30 : i32 = x_6.x_GLF_uniform_int_values[1];
+  i = x_30;
+  loop {
+    let x_35 : i32 = i;
+    let x_37 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_35 < x_37)) {
+    } else {
+      break;
+    }
+    let x_40 : i32 = i;
+    let x_41 : i32 = i;
+    A[x_40] = x_41;
+
+    continuing {
+      let x_43 : i32 = i;
+      i = (x_43 + 1);
+    }
+  }
+  let x_46 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_48 : i32 = A[x_46];
+  let x_51 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_53 : i32 = A[x_51];
+  a = min(~(x_48), ~(x_53));
+  let x_57 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_58 : f32 = f32(x_57);
+  x_GLF_color = vec4<f32>(x_58, x_58, x_58, x_58);
+  let x_60 : i32 = a;
+  let x_62 : i32 = x_6.x_GLF_uniform_int_values[0];
+  if ((x_60 == -(x_62))) {
+    let x_68 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_71 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_74 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_77 : i32 = x_6.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_68), f32(x_71), f32(x_74), f32(x_77));
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-inst-combine-select-value-tracking-flip-bits/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-value-inst-combine-select-value-tracking-flip-bits/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..b0be04f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-inst-combine-select-value-tracking-flip-bits/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,58 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int i = 0;
+  int A[2] = (int[2])0;
+  int a = 0;
+  const int x_30 = asint(x_6[1].x);
+  i = x_30;
+  while (true) {
+    const int x_35 = i;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_37 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_35 < x_37)) {
+    } else {
+      break;
+    }
+    A[i] = i;
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_46 = asint(x_6[1].x);
+  const int x_48 = A[x_46];
+  const int x_51 = asint(x_6[2].x);
+  const int x_53 = A[x_51];
+  a = min(~(x_48), ~(x_53));
+  const int x_57 = asint(x_6[1].x);
+  const float x_58 = float(x_57);
+  x_GLF_color = float4(x_58, x_58, x_58, x_58);
+  const int x_60 = a;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_62 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_60 == -(x_62))) {
+    const int x_68 = asint(x_6[2].x);
+    const int x_71 = asint(x_6[1].x);
+    const int x_74 = asint(x_6[1].x);
+    const int x_77 = asint(x_6[2].x);
+    x_GLF_color = float4(float(x_68), float(x_71), float(x_74), float(x_77));
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-inst-combine-select-value-tracking-flip-bits/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-value-inst-combine-select-value-tracking-flip-bits/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..4aaf44e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-inst-combine-select-value-tracking-flip-bits/0-opt.wgsl.expected.msl
@@ -0,0 +1,72 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_1 {
+  int arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int i = 0;
+  tint_array_wrapper_1 A = {};
+  int a = 0;
+  int const x_30 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  i = x_30;
+  while (true) {
+    int const x_35 = i;
+    int const x_37 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_35 < x_37)) {
+    } else {
+      break;
+    }
+    int const x_40 = i;
+    int const x_41 = i;
+    A.arr[x_40] = x_41;
+    {
+      int const x_43 = i;
+      i = (x_43 + 1);
+    }
+  }
+  int const x_46 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_48 = A.arr[x_46];
+  int const x_51 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_53 = A.arr[x_51];
+  a = min(~(x_48), ~(x_53));
+  int const x_57 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  float const x_58 = float(x_57);
+  *(tint_symbol_4) = float4(x_58, x_58, x_58, x_58);
+  int const x_60 = a;
+  int const x_62 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  if ((x_60 == -(x_62))) {
+    int const x_68 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_71 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_74 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_77 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    *(tint_symbol_4) = float4(float(x_68), float(x_71), float(x_74), float(x_77));
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-inst-combine-select-value-tracking-flip-bits/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-value-inst-combine-select-value-tracking-flip-bits/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..35b828d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-inst-combine-select-value-tracking-flip-bits/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,156 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 100
+; Schema: 0
+               OpCapability Shader
+         %61 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %A "A"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+%_ptr_Function__arr_int_uint_2 = OpTypePointer Function %_arr_int_uint_2
+         %26 = OpConstantNull %_arr_int_uint_2
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+         %88 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %21
+          %A = OpVariable %_ptr_Function__arr_int_uint_2 Function %26
+          %a = OpVariable %_ptr_Function_int Function %21
+         %31 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %32 = OpLoad %int %31
+               OpStore %i %32
+               OpBranch %33
+         %33 = OpLabel
+               OpLoopMerge %34 %35 None
+               OpBranch %36
+         %36 = OpLabel
+         %37 = OpLoad %int %i
+         %39 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %40 = OpLoad %int %39
+         %41 = OpSLessThan %bool %37 %40
+               OpSelectionMerge %43 None
+               OpBranchConditional %41 %44 %45
+         %44 = OpLabel
+               OpBranch %43
+         %45 = OpLabel
+               OpBranch %34
+         %43 = OpLabel
+         %46 = OpLoad %int %i
+         %47 = OpLoad %int %i
+         %48 = OpAccessChain %_ptr_Function_int %A %46
+               OpStore %48 %47
+               OpBranch %35
+         %35 = OpLabel
+         %49 = OpLoad %int %i
+         %50 = OpIAdd %int %49 %int_1
+               OpStore %i %50
+               OpBranch %33
+         %34 = OpLabel
+         %51 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %52 = OpLoad %int %51
+         %53 = OpAccessChain %_ptr_Function_int %A %52
+         %54 = OpLoad %int %53
+         %56 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %57 = OpLoad %int %56
+         %58 = OpAccessChain %_ptr_Function_int %A %57
+         %59 = OpLoad %int %58
+         %62 = OpNot %int %54
+         %63 = OpNot %int %59
+         %60 = OpExtInst %int %61 SMin %62 %63
+               OpStore %a %60
+         %64 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %65 = OpLoad %int %64
+         %66 = OpConvertSToF %float %65
+         %67 = OpCompositeConstruct %v4float %66 %66 %66 %66
+               OpStore %x_GLF_color %67
+         %68 = OpLoad %int %a
+         %69 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %70 = OpLoad %int %69
+         %71 = OpSNegate %int %70
+         %72 = OpIEqual %bool %68 %71
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %74 %73
+         %74 = OpLabel
+         %75 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %76 = OpLoad %int %75
+         %77 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %78 = OpLoad %int %77
+         %79 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %80 = OpLoad %int %79
+         %81 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %82 = OpLoad %int %81
+         %83 = OpConvertSToF %float %76
+         %84 = OpConvertSToF %float %78
+         %85 = OpConvertSToF %float %80
+         %86 = OpConvertSToF %float %82
+         %87 = OpCompositeConstruct %v4float %83 %84 %85 %86
+               OpStore %x_GLF_color %87
+               OpBranch %73
+         %73 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %88
+%tint_symbol = OpFunctionParameter %main_out
+         %92 = OpLabel
+         %93 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %93
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %95 = OpLabel
+         %96 = OpFunctionCall %void %main_1
+         %98 = OpLoad %v4float %x_GLF_color
+         %99 = OpCompositeConstruct %main_out %98
+         %97 = OpFunctionCall %void %tint_symbol_2 %99
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-inst-combine-select-value-tracking-flip-bits/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-value-inst-combine-select-value-tracking-flip-bits/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..c17f0bb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-inst-combine-select-value-tracking-flip-bits/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,63 @@
+type Arr = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  var A : array<i32, 2>;
+  var a : i32;
+  let x_30 : i32 = x_6.x_GLF_uniform_int_values[1];
+  i = x_30;
+  loop {
+    let x_35 : i32 = i;
+    let x_37 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_35 < x_37)) {
+    } else {
+      break;
+    }
+    let x_40 : i32 = i;
+    let x_41 : i32 = i;
+    A[x_40] = x_41;
+
+    continuing {
+      let x_43 : i32 = i;
+      i = (x_43 + 1);
+    }
+  }
+  let x_46 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_48 : i32 = A[x_46];
+  let x_51 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_53 : i32 = A[x_51];
+  a = min(~(x_48), ~(x_53));
+  let x_57 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_58 : f32 = f32(x_57);
+  x_GLF_color = vec4<f32>(x_58, x_58, x_58, x_58);
+  let x_60 : i32 = a;
+  let x_62 : i32 = x_6.x_GLF_uniform_int_values[0];
+  if ((x_60 == -(x_62))) {
+    let x_68 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_71 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_74 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_77 : i32 = x_6.x_GLF_uniform_int_values[2];
+    x_GLF_color = vec4<f32>(f32(x_68), f32(x_71), f32(x_74), f32(x_77));
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-apint-inst-combine-simplify-one-mod-loop-iterator/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-apint-inst-combine-simplify-one-mod-loop-iterator/0-opt.spvasm
new file mode 100644
index 0000000..5730c8b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-apint-inst-combine-simplify-one-mod-loop-iterator/0-opt.spvasm
@@ -0,0 +1,112 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %10
+         %25 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+         %26 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %27 = OpLoad %int %26
+               OpStore %a %27
+         %28 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %29 = OpLoad %int %28
+               OpStore %i %29
+               OpBranch %30
+         %30 = OpLabel
+               OpLoopMerge %31 %32 None
+               OpBranch %33
+         %33 = OpLabel
+         %34 = OpLoad %int %i
+         %35 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %36 = OpLoad %int %35
+         %37 = OpSLessThan %bool %34 %36
+               OpBranchConditional %37 %38 %31
+         %38 = OpLabel
+         %39 = OpLoad %int %i
+         %40 = OpSMod %int %int_1 %39
+         %41 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %42 = OpLoad %int %41
+         %43 = OpIEqual %bool %40 %42
+               OpSelectionMerge %44 None
+               OpBranchConditional %43 %45 %44
+         %45 = OpLabel
+               OpBranch %32
+         %44 = OpLabel
+         %46 = OpLoad %int %a
+         %47 = OpIAdd %int %46 %int_1
+               OpStore %a %47
+               OpBranch %32
+         %32 = OpLabel
+         %48 = OpLoad %int %i
+         %49 = OpIAdd %int %48 %int_1
+               OpStore %i %49
+               OpBranch %30
+         %31 = OpLabel
+         %50 = OpLoad %int %a
+         %51 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %52 = OpLoad %int %51
+         %53 = OpIEqual %bool %50 %52
+               OpSelectionMerge %54 None
+               OpBranchConditional %53 %55 %56
+         %55 = OpLabel
+         %57 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %58 = OpLoad %int %57
+         %59 = OpConvertSToF %float %58
+         %60 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %61 = OpLoad %int %60
+         %62 = OpConvertSToF %float %61
+         %63 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %64 = OpLoad %int %63
+         %65 = OpConvertSToF %float %64
+         %66 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %67 = OpLoad %int %66
+         %68 = OpConvertSToF %float %67
+         %69 = OpCompositeConstruct %v4float %59 %62 %65 %68
+               OpStore %_GLF_color %69
+               OpBranch %54
+         %56 = OpLabel
+         %70 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %71 = OpLoad %int %70
+         %72 = OpConvertSToF %float %71
+         %73 = OpCompositeConstruct %v4float %72 %72 %72 %72
+               OpStore %_GLF_color %73
+               OpBranch %54
+         %54 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-apint-inst-combine-simplify-one-mod-loop-iterator/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-apint-inst-combine-simplify-one-mod-loop-iterator/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..ad949e0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-apint-inst-combine-simplify-one-mod-loop-iterator/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,62 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  int i = 0;
+  const int x_27 = asint(x_6[2].x);
+  a = x_27;
+  const int x_29 = asint(x_6[3].x);
+  i = x_29;
+  while (true) {
+    const int x_34 = i;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_36 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_34 < x_36)) {
+    } else {
+      break;
+    }
+    const int x_39 = i;
+    const int x_42 = asint(x_6[2].x);
+    if (((1 % x_39) == x_42)) {
+      {
+        i = (i + 1);
+      }
+      continue;
+    }
+    a = (a + 1);
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_50 = a;
+  const int x_52 = asint(x_6[1].x);
+  if ((x_50 == x_52)) {
+    const int x_58 = asint(x_6[3].x);
+    const int x_61 = asint(x_6[2].x);
+    const int x_64 = asint(x_6[2].x);
+    const int x_67 = asint(x_6[3].x);
+    x_GLF_color = float4(float(x_58), float(x_61), float(x_64), float(x_67));
+  } else {
+    const int x_71 = asint(x_6[2].x);
+    const float x_72 = float(x_71);
+    x_GLF_color = float4(x_72, x_72, x_72, x_72);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-apint-inst-combine-simplify-one-mod-loop-iterator/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-apint-inst-combine-simplify-one-mod-loop-iterator/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..bd9b04a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-apint-inst-combine-simplify-one-mod-loop-iterator/0-opt.spvasm.expected.msl
@@ -0,0 +1,74 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int i = 0;
+  int const x_27 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  a = x_27;
+  int const x_29 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  i = x_29;
+  while (true) {
+    int const x_34 = i;
+    int const x_36 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_34 < x_36)) {
+    } else {
+      break;
+    }
+    int const x_39 = i;
+    int const x_42 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    if (((1 % x_39) == x_42)) {
+      {
+        int const x_48 = i;
+        i = (x_48 + 1);
+      }
+      continue;
+    }
+    int const x_46 = a;
+    a = (x_46 + 1);
+    {
+      int const x_48 = i;
+      i = (x_48 + 1);
+    }
+  }
+  int const x_50 = a;
+  int const x_52 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_50 == x_52)) {
+    int const x_58 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    int const x_61 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_64 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_67 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    *(tint_symbol_4) = float4(float(x_58), float(x_61), float(x_64), float(x_67));
+  } else {
+    int const x_71 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    float const x_72 = float(x_71);
+    *(tint_symbol_4) = float4(x_72, x_72, x_72, x_72);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-apint-inst-combine-simplify-one-mod-loop-iterator/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-apint-inst-combine-simplify-one-mod-loop-iterator/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..815ee58
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-apint-inst-combine-simplify-one-mod-loop-iterator/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,150 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 92
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %80 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+          %i = OpVariable %_ptr_Function_int Function %21
+         %26 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %27 = OpLoad %int %26
+               OpStore %a %27
+         %29 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %30 = OpLoad %int %29
+               OpStore %i %30
+               OpBranch %31
+         %31 = OpLabel
+               OpLoopMerge %32 %33 None
+               OpBranch %34
+         %34 = OpLabel
+         %35 = OpLoad %int %i
+         %37 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %38 = OpLoad %int %37
+         %39 = OpSLessThan %bool %35 %38
+               OpSelectionMerge %41 None
+               OpBranchConditional %39 %42 %43
+         %42 = OpLabel
+               OpBranch %41
+         %43 = OpLabel
+               OpBranch %32
+         %41 = OpLabel
+         %44 = OpLoad %int %i
+         %45 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %46 = OpLoad %int %45
+         %48 = OpSMod %int %int_1 %44
+         %49 = OpIEqual %bool %48 %46
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %50
+         %51 = OpLabel
+               OpBranch %33
+         %50 = OpLabel
+         %52 = OpLoad %int %a
+         %53 = OpIAdd %int %52 %int_1
+               OpStore %a %53
+               OpBranch %33
+         %33 = OpLabel
+         %54 = OpLoad %int %i
+         %55 = OpIAdd %int %54 %int_1
+               OpStore %i %55
+               OpBranch %31
+         %32 = OpLabel
+         %56 = OpLoad %int %a
+         %57 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %58 = OpLoad %int %57
+         %59 = OpIEqual %bool %56 %58
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %62
+         %61 = OpLabel
+         %63 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %64 = OpLoad %int %63
+         %65 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %66 = OpLoad %int %65
+         %67 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %68 = OpLoad %int %67
+         %69 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %70 = OpLoad %int %69
+         %71 = OpConvertSToF %float %64
+         %72 = OpConvertSToF %float %66
+         %73 = OpConvertSToF %float %68
+         %74 = OpConvertSToF %float %70
+         %75 = OpCompositeConstruct %v4float %71 %72 %73 %74
+               OpStore %x_GLF_color %75
+               OpBranch %60
+         %62 = OpLabel
+         %76 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %77 = OpLoad %int %76
+         %78 = OpConvertSToF %float %77
+         %79 = OpCompositeConstruct %v4float %78 %78 %78 %78
+               OpStore %x_GLF_color %79
+               OpBranch %60
+         %60 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %80
+%tint_symbol = OpFunctionParameter %main_out
+         %84 = OpLabel
+         %85 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %85
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %87 = OpLabel
+         %88 = OpFunctionCall %void %main_1
+         %90 = OpLoad %v4float %x_GLF_color
+         %91 = OpCompositeConstruct %main_out %90
+         %89 = OpFunctionCall %void %tint_symbol_2 %91
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-apint-inst-combine-simplify-one-mod-loop-iterator/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-apint-inst-combine-simplify-one-mod-loop-iterator/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..d11bb08
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-apint-inst-combine-simplify-one-mod-loop-iterator/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,64 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  let x_27 : i32 = x_6.x_GLF_uniform_int_values[2];
+  a = x_27;
+  let x_29 : i32 = x_6.x_GLF_uniform_int_values[3];
+  i = x_29;
+  loop {
+    let x_34 : i32 = i;
+    let x_36 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_34 < x_36)) {
+    } else {
+      break;
+    }
+    let x_39 : i32 = i;
+    let x_42 : i32 = x_6.x_GLF_uniform_int_values[2];
+    if (((1 % x_39) == x_42)) {
+      continue;
+    }
+    let x_46 : i32 = a;
+    a = (x_46 + 1);
+
+    continuing {
+      let x_48 : i32 = i;
+      i = (x_48 + 1);
+    }
+  }
+  let x_50 : i32 = a;
+  let x_52 : i32 = x_6.x_GLF_uniform_int_values[1];
+  if ((x_50 == x_52)) {
+    let x_58 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_61 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_64 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_67 : i32 = x_6.x_GLF_uniform_int_values[3];
+    x_GLF_color = vec4<f32>(f32(x_58), f32(x_61), f32(x_64), f32(x_67));
+  } else {
+    let x_71 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_72 : f32 = f32(x_71);
+    x_GLF_color = vec4<f32>(x_72, x_72, x_72, x_72);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-apint-inst-combine-simplify-one-mod-loop-iterator/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-apint-inst-combine-simplify-one-mod-loop-iterator/0-opt.wgsl
new file mode 100644
index 0000000..d11bb08
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-apint-inst-combine-simplify-one-mod-loop-iterator/0-opt.wgsl
@@ -0,0 +1,64 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  let x_27 : i32 = x_6.x_GLF_uniform_int_values[2];
+  a = x_27;
+  let x_29 : i32 = x_6.x_GLF_uniform_int_values[3];
+  i = x_29;
+  loop {
+    let x_34 : i32 = i;
+    let x_36 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_34 < x_36)) {
+    } else {
+      break;
+    }
+    let x_39 : i32 = i;
+    let x_42 : i32 = x_6.x_GLF_uniform_int_values[2];
+    if (((1 % x_39) == x_42)) {
+      continue;
+    }
+    let x_46 : i32 = a;
+    a = (x_46 + 1);
+
+    continuing {
+      let x_48 : i32 = i;
+      i = (x_48 + 1);
+    }
+  }
+  let x_50 : i32 = a;
+  let x_52 : i32 = x_6.x_GLF_uniform_int_values[1];
+  if ((x_50 == x_52)) {
+    let x_58 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_61 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_64 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_67 : i32 = x_6.x_GLF_uniform_int_values[3];
+    x_GLF_color = vec4<f32>(f32(x_58), f32(x_61), f32(x_64), f32(x_67));
+  } else {
+    let x_71 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_72 : f32 = f32(x_71);
+    x_GLF_color = vec4<f32>(x_72, x_72, x_72, x_72);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-apint-inst-combine-simplify-one-mod-loop-iterator/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-apint-inst-combine-simplify-one-mod-loop-iterator/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..ad949e0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-apint-inst-combine-simplify-one-mod-loop-iterator/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,62 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  int i = 0;
+  const int x_27 = asint(x_6[2].x);
+  a = x_27;
+  const int x_29 = asint(x_6[3].x);
+  i = x_29;
+  while (true) {
+    const int x_34 = i;
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const int x_36 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_34 < x_36)) {
+    } else {
+      break;
+    }
+    const int x_39 = i;
+    const int x_42 = asint(x_6[2].x);
+    if (((1 % x_39) == x_42)) {
+      {
+        i = (i + 1);
+      }
+      continue;
+    }
+    a = (a + 1);
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_50 = a;
+  const int x_52 = asint(x_6[1].x);
+  if ((x_50 == x_52)) {
+    const int x_58 = asint(x_6[3].x);
+    const int x_61 = asint(x_6[2].x);
+    const int x_64 = asint(x_6[2].x);
+    const int x_67 = asint(x_6[3].x);
+    x_GLF_color = float4(float(x_58), float(x_61), float(x_64), float(x_67));
+  } else {
+    const int x_71 = asint(x_6[2].x);
+    const float x_72 = float(x_71);
+    x_GLF_color = float4(x_72, x_72, x_72, x_72);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-apint-inst-combine-simplify-one-mod-loop-iterator/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-apint-inst-combine-simplify-one-mod-loop-iterator/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..bd9b04a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-apint-inst-combine-simplify-one-mod-loop-iterator/0-opt.wgsl.expected.msl
@@ -0,0 +1,74 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int i = 0;
+  int const x_27 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  a = x_27;
+  int const x_29 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  i = x_29;
+  while (true) {
+    int const x_34 = i;
+    int const x_36 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    if ((x_34 < x_36)) {
+    } else {
+      break;
+    }
+    int const x_39 = i;
+    int const x_42 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    if (((1 % x_39) == x_42)) {
+      {
+        int const x_48 = i;
+        i = (x_48 + 1);
+      }
+      continue;
+    }
+    int const x_46 = a;
+    a = (x_46 + 1);
+    {
+      int const x_48 = i;
+      i = (x_48 + 1);
+    }
+  }
+  int const x_50 = a;
+  int const x_52 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_50 == x_52)) {
+    int const x_58 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    int const x_61 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_64 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    int const x_67 = x_6.x_GLF_uniform_int_values.arr[3].el;
+    *(tint_symbol_4) = float4(float(x_58), float(x_61), float(x_64), float(x_67));
+  } else {
+    int const x_71 = x_6.x_GLF_uniform_int_values.arr[2].el;
+    float const x_72 = float(x_71);
+    *(tint_symbol_4) = float4(x_72, x_72, x_72, x_72);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-apint-inst-combine-simplify-one-mod-loop-iterator/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-apint-inst-combine-simplify-one-mod-loop-iterator/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..815ee58
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-apint-inst-combine-simplify-one-mod-loop-iterator/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,150 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 92
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_2 = OpConstant %int 2
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %80 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+          %i = OpVariable %_ptr_Function_int Function %21
+         %26 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %27 = OpLoad %int %26
+               OpStore %a %27
+         %29 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %30 = OpLoad %int %29
+               OpStore %i %30
+               OpBranch %31
+         %31 = OpLabel
+               OpLoopMerge %32 %33 None
+               OpBranch %34
+         %34 = OpLabel
+         %35 = OpLoad %int %i
+         %37 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %38 = OpLoad %int %37
+         %39 = OpSLessThan %bool %35 %38
+               OpSelectionMerge %41 None
+               OpBranchConditional %39 %42 %43
+         %42 = OpLabel
+               OpBranch %41
+         %43 = OpLabel
+               OpBranch %32
+         %41 = OpLabel
+         %44 = OpLoad %int %i
+         %45 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %46 = OpLoad %int %45
+         %48 = OpSMod %int %int_1 %44
+         %49 = OpIEqual %bool %48 %46
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %50
+         %51 = OpLabel
+               OpBranch %33
+         %50 = OpLabel
+         %52 = OpLoad %int %a
+         %53 = OpIAdd %int %52 %int_1
+               OpStore %a %53
+               OpBranch %33
+         %33 = OpLabel
+         %54 = OpLoad %int %i
+         %55 = OpIAdd %int %54 %int_1
+               OpStore %i %55
+               OpBranch %31
+         %32 = OpLabel
+         %56 = OpLoad %int %a
+         %57 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %58 = OpLoad %int %57
+         %59 = OpIEqual %bool %56 %58
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %62
+         %61 = OpLabel
+         %63 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %64 = OpLoad %int %63
+         %65 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %66 = OpLoad %int %65
+         %67 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %68 = OpLoad %int %67
+         %69 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %70 = OpLoad %int %69
+         %71 = OpConvertSToF %float %64
+         %72 = OpConvertSToF %float %66
+         %73 = OpConvertSToF %float %68
+         %74 = OpConvertSToF %float %70
+         %75 = OpCompositeConstruct %v4float %71 %72 %73 %74
+               OpStore %x_GLF_color %75
+               OpBranch %60
+         %62 = OpLabel
+         %76 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %77 = OpLoad %int %76
+         %78 = OpConvertSToF %float %77
+         %79 = OpCompositeConstruct %v4float %78 %78 %78 %78
+               OpStore %x_GLF_color %79
+               OpBranch %60
+         %60 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %80
+%tint_symbol = OpFunctionParameter %main_out
+         %84 = OpLabel
+         %85 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %85
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %87 = OpLabel
+         %88 = OpFunctionCall %void %main_1
+         %90 = OpLoad %v4float %x_GLF_color
+         %91 = OpCompositeConstruct %main_out %90
+         %89 = OpFunctionCall %void %tint_symbol_2 %91
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-apint-inst-combine-simplify-one-mod-loop-iterator/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-apint-inst-combine-simplify-one-mod-loop-iterator/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..d11bb08
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-apint-inst-combine-simplify-one-mod-loop-iterator/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,64 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  let x_27 : i32 = x_6.x_GLF_uniform_int_values[2];
+  a = x_27;
+  let x_29 : i32 = x_6.x_GLF_uniform_int_values[3];
+  i = x_29;
+  loop {
+    let x_34 : i32 = i;
+    let x_36 : i32 = x_6.x_GLF_uniform_int_values[0];
+    if ((x_34 < x_36)) {
+    } else {
+      break;
+    }
+    let x_39 : i32 = i;
+    let x_42 : i32 = x_6.x_GLF_uniform_int_values[2];
+    if (((1 % x_39) == x_42)) {
+      continue;
+    }
+    let x_46 : i32 = a;
+    a = (x_46 + 1);
+
+    continuing {
+      let x_48 : i32 = i;
+      i = (x_48 + 1);
+    }
+  }
+  let x_50 : i32 = a;
+  let x_52 : i32 = x_6.x_GLF_uniform_int_values[1];
+  if ((x_50 == x_52)) {
+    let x_58 : i32 = x_6.x_GLF_uniform_int_values[3];
+    let x_61 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_64 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_67 : i32 = x_6.x_GLF_uniform_int_values[3];
+    x_GLF_color = vec4<f32>(f32(x_58), f32(x_61), f32(x_64), f32(x_67));
+  } else {
+    let x_71 : i32 = x_6.x_GLF_uniform_int_values[2];
+    let x_72 : f32 = f32(x_71);
+    x_GLF_color = vec4<f32>(x_72, x_72, x_72, x_72);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-inclusive-or/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-inclusive-or/0-opt.spvasm
new file mode 100644
index 0000000..c0e7096
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-inclusive-or/0-opt.spvasm
@@ -0,0 +1,77 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "two"
+               OpName %_ ""
+               OpDecorate %_GLF_color Location 0
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+     %int_n2 = OpConstant %int -2
+      %int_1 = OpConstant %int 1
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %22 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %23 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+       %main = OpFunction %void None %9
+         %25 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+               OpStore %a %int_0
+               OpStore %i %int_0
+               OpBranch %26
+         %26 = OpLabel
+               OpLoopMerge %27 %28 None
+               OpBranch %29
+         %29 = OpLabel
+         %30 = OpLoad %int %i
+         %31 = OpSLessThan %bool %30 %int_2
+               OpBranchConditional %31 %32 %27
+         %32 = OpLabel
+         %33 = OpLoad %int %i
+         %34 = OpBitwiseOr %int %33 %int_n2
+         %35 = OpISub %int %34 %int_1
+               OpStore %a %35
+               OpBranch %28
+         %28 = OpLabel
+         %36 = OpLoad %int %i
+         %37 = OpIAdd %int %36 %int_1
+               OpStore %i %37
+               OpBranch %26
+         %27 = OpLabel
+         %38 = OpLoad %int %a
+         %39 = OpIEqual %bool %38 %int_n2
+               OpSelectionMerge %40 None
+               OpBranchConditional %39 %41 %42
+         %41 = OpLabel
+               OpStore %_GLF_color %22
+               OpBranch %40
+         %42 = OpLabel
+               OpStore %_GLF_color %23
+               OpBranch %40
+         %40 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-inclusive-or/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-inclusive-or/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..cf1aef6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-inclusive-or/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,36 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[1];
+};
+
+void main_1() {
+  int a = 0;
+  int i = 0;
+  a = 0;
+  i = 0;
+  {
+    for(; (i < 2); i = (i + 1)) {
+      a = ((i | -2) - 1);
+    }
+  }
+  if ((a == -2)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-inclusive-or/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-inclusive-or/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..f06e3b0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-inclusive-or/0-opt.spvasm.expected.msl
@@ -0,0 +1,48 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int two;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  int a = 0;
+  int i = 0;
+  a = 0;
+  i = 0;
+  while (true) {
+    int const x_30 = i;
+    if ((x_30 < 2)) {
+    } else {
+      break;
+    }
+    int const x_33 = i;
+    a = ((x_33 | -2) - 1);
+    {
+      int const x_36 = i;
+      i = (x_36 + 1);
+    }
+  }
+  int const x_38 = a;
+  if ((x_38 == -2)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-inclusive-or/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-inclusive-or/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..04cf099
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-inclusive-or/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,114 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 60
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "two"
+               OpName %x_7 "x_7"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+     %int_n2 = OpConstant %int -2
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %46 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %47 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %48 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %18
+          %i = OpVariable %_ptr_Function_int Function %18
+               OpStore %a %int_0
+               OpStore %i %int_0
+               OpBranch %21
+         %21 = OpLabel
+               OpLoopMerge %22 %23 None
+               OpBranch %24
+         %24 = OpLabel
+         %25 = OpLoad %int %i
+         %27 = OpSLessThan %bool %25 %int_2
+               OpSelectionMerge %29 None
+               OpBranchConditional %27 %30 %31
+         %30 = OpLabel
+               OpBranch %29
+         %31 = OpLabel
+               OpBranch %22
+         %29 = OpLabel
+         %32 = OpLoad %int %i
+         %34 = OpBitwiseOr %int %32 %int_n2
+         %36 = OpISub %int %34 %int_1
+               OpStore %a %36
+               OpBranch %23
+         %23 = OpLabel
+         %37 = OpLoad %int %i
+         %38 = OpIAdd %int %37 %int_1
+               OpStore %i %38
+               OpBranch %21
+         %22 = OpLabel
+         %39 = OpLoad %int %a
+         %40 = OpIEqual %bool %39 %int_n2
+               OpSelectionMerge %41 None
+               OpBranchConditional %40 %42 %43
+         %42 = OpLabel
+               OpStore %x_GLF_color %46
+               OpBranch %41
+         %43 = OpLabel
+               OpStore %x_GLF_color %47
+               OpBranch %41
+         %41 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %48
+%tint_symbol = OpFunctionParameter %main_out
+         %52 = OpLabel
+         %53 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %53
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %55 = OpLabel
+         %56 = OpFunctionCall %void %main_1
+         %58 = OpLoad %v4float %x_GLF_color
+         %59 = OpCompositeConstruct %main_out %58
+         %57 = OpFunctionCall %void %tint_symbol_2 %59
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-inclusive-or/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-inclusive-or/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..5aa3bbe
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-inclusive-or/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,47 @@
+[[block]]
+struct buf0 {
+  two : i32;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  a = 0;
+  i = 0;
+  loop {
+    let x_30 : i32 = i;
+    if ((x_30 < 2)) {
+    } else {
+      break;
+    }
+    let x_33 : i32 = i;
+    a = ((x_33 | -2) - 1);
+
+    continuing {
+      let x_36 : i32 = i;
+      i = (x_36 + 1);
+    }
+  }
+  let x_38 : i32 = a;
+  if ((x_38 == -2)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-inclusive-or/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-inclusive-or/0-opt.wgsl
new file mode 100644
index 0000000..5aa3bbe
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-inclusive-or/0-opt.wgsl
@@ -0,0 +1,47 @@
+[[block]]
+struct buf0 {
+  two : i32;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  a = 0;
+  i = 0;
+  loop {
+    let x_30 : i32 = i;
+    if ((x_30 < 2)) {
+    } else {
+      break;
+    }
+    let x_33 : i32 = i;
+    a = ((x_33 | -2) - 1);
+
+    continuing {
+      let x_36 : i32 = i;
+      i = (x_36 + 1);
+    }
+  }
+  let x_38 : i32 = a;
+  if ((x_38 == -2)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-inclusive-or/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-inclusive-or/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..cf1aef6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-inclusive-or/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,36 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[1];
+};
+
+void main_1() {
+  int a = 0;
+  int i = 0;
+  a = 0;
+  i = 0;
+  {
+    for(; (i < 2); i = (i + 1)) {
+      a = ((i | -2) - 1);
+    }
+  }
+  if ((a == -2)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-inclusive-or/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-inclusive-or/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..f06e3b0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-inclusive-or/0-opt.wgsl.expected.msl
@@ -0,0 +1,48 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int two;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  int a = 0;
+  int i = 0;
+  a = 0;
+  i = 0;
+  while (true) {
+    int const x_30 = i;
+    if ((x_30 < 2)) {
+    } else {
+      break;
+    }
+    int const x_33 = i;
+    a = ((x_33 | -2) - 1);
+    {
+      int const x_36 = i;
+      i = (x_36 + 1);
+    }
+  }
+  int const x_38 = a;
+  if ((x_38 == -2)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-inclusive-or/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-inclusive-or/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..04cf099
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-inclusive-or/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,114 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 60
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "two"
+               OpName %x_7 "x_7"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+     %int_n2 = OpConstant %int -2
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %46 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %47 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %48 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %18
+          %i = OpVariable %_ptr_Function_int Function %18
+               OpStore %a %int_0
+               OpStore %i %int_0
+               OpBranch %21
+         %21 = OpLabel
+               OpLoopMerge %22 %23 None
+               OpBranch %24
+         %24 = OpLabel
+         %25 = OpLoad %int %i
+         %27 = OpSLessThan %bool %25 %int_2
+               OpSelectionMerge %29 None
+               OpBranchConditional %27 %30 %31
+         %30 = OpLabel
+               OpBranch %29
+         %31 = OpLabel
+               OpBranch %22
+         %29 = OpLabel
+         %32 = OpLoad %int %i
+         %34 = OpBitwiseOr %int %32 %int_n2
+         %36 = OpISub %int %34 %int_1
+               OpStore %a %36
+               OpBranch %23
+         %23 = OpLabel
+         %37 = OpLoad %int %i
+         %38 = OpIAdd %int %37 %int_1
+               OpStore %i %38
+               OpBranch %21
+         %22 = OpLabel
+         %39 = OpLoad %int %a
+         %40 = OpIEqual %bool %39 %int_n2
+               OpSelectionMerge %41 None
+               OpBranchConditional %40 %42 %43
+         %42 = OpLabel
+               OpStore %x_GLF_color %46
+               OpBranch %41
+         %43 = OpLabel
+               OpStore %x_GLF_color %47
+               OpBranch %41
+         %41 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %48
+%tint_symbol = OpFunctionParameter %main_out
+         %52 = OpLabel
+         %53 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %53
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %55 = OpLabel
+         %56 = OpFunctionCall %void %main_1
+         %58 = OpLoad %v4float %x_GLF_color
+         %59 = OpCompositeConstruct %main_out %58
+         %57 = OpFunctionCall %void %tint_symbol_2 %59
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-inclusive-or/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-inclusive-or/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..5aa3bbe
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-inclusive-or/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,47 @@
+[[block]]
+struct buf0 {
+  two : i32;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+fn main_1() {
+  var a : i32;
+  var i : i32;
+  a = 0;
+  i = 0;
+  loop {
+    let x_30 : i32 = i;
+    if ((x_30 < 2)) {
+    } else {
+      break;
+    }
+    let x_33 : i32 = i;
+    a = ((x_33 | -2) - 1);
+
+    continuing {
+      let x_36 : i32 = i;
+      i = (x_36 + 1);
+    }
+  }
+  let x_38 : i32 = a;
+  if ((x_38 == -2)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-known-nonzero/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-known-nonzero/0-opt.spvasm
new file mode 100644
index 0000000..924fb9e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-known-nonzero/0-opt.spvasm
@@ -0,0 +1,117 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %sum "sum"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+  %int_65536 = OpConstant %int 65536
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %11
+         %27 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function
+        %sum = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+               OpStore %a %int_65536
+         %28 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %29 = OpLoad %int %28
+               OpStore %sum %29
+         %30 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %31 = OpLoad %int %30
+         %32 = OpIEqual %bool %int_1 %31
+               OpSelectionMerge %33 None
+               OpBranchConditional %32 %34 %33
+         %34 = OpLabel
+         %35 = OpLoad %int %a
+         %36 = OpISub %int %35 %int_1
+               OpStore %a %36
+               OpBranch %33
+         %33 = OpLabel
+               OpStore %i %int_0
+               OpBranch %37
+         %37 = OpLabel
+               OpLoopMerge %38 %39 None
+               OpBranch %40
+         %40 = OpLabel
+         %41 = OpLoad %int %i
+         %42 = OpLoad %int %a
+         %43 = OpSLessThan %bool %41 %42
+               OpBranchConditional %43 %44 %38
+         %44 = OpLabel
+         %45 = OpLoad %int %i
+         %46 = OpLoad %int %sum
+         %47 = OpIAdd %int %46 %45
+               OpStore %sum %47
+               OpBranch %39
+         %39 = OpLabel
+         %48 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %49 = OpLoad %int %48
+         %50 = OpLoad %int %i
+         %51 = OpIAdd %int %50 %49
+               OpStore %i %51
+               OpBranch %37
+         %38 = OpLabel
+         %52 = OpLoad %int %sum
+         %53 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %54 = OpLoad %int %53
+         %55 = OpIEqual %bool %52 %54
+               OpSelectionMerge %56 None
+               OpBranchConditional %55 %57 %58
+         %57 = OpLabel
+         %59 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %60 = OpLoad %int %59
+         %61 = OpConvertSToF %float %60
+         %62 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %63 = OpLoad %int %62
+         %64 = OpConvertSToF %float %63
+         %65 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %66 = OpLoad %int %65
+         %67 = OpConvertSToF %float %66
+         %68 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %69 = OpLoad %int %68
+         %70 = OpConvertSToF %float %69
+         %71 = OpCompositeConstruct %v4float %61 %64 %67 %70
+               OpStore %_GLF_color %71
+               OpBranch %56
+         %58 = OpLabel
+         %72 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %73 = OpLoad %int %72
+         %74 = OpConvertSToF %float %73
+         %75 = OpCompositeConstruct %v4float %74 %74 %74 %74
+               OpStore %_GLF_color %75
+               OpBranch %56
+         %56 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-known-nonzero/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-known-nonzero/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..08b57e0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-known-nonzero/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,61 @@
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  int sum = 0;
+  int i = 0;
+  a = 65536;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_29 = asint(x_7[scalar_offset / 4][scalar_offset % 4]);
+  sum = x_29;
+  const int x_31 = asint(x_7[1].x);
+  if ((1 == x_31)) {
+    a = (a - 1);
+  }
+  i = 0;
+  while (true) {
+    if ((i < a)) {
+    } else {
+      break;
+    }
+    sum = (sum + i);
+    {
+      const int x_49 = asint(x_7[2].x);
+      i = (i + x_49);
+    }
+  }
+  const int x_52 = sum;
+  const int x_54 = asint(x_7[3].x);
+  if ((x_52 == x_54)) {
+    const int x_60 = asint(x_7[1].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_63 = asint(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_66 = asint(x_7[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_69 = asint(x_7[1].x);
+    x_GLF_color = float4(float(x_60), float(x_63), float(x_66), float(x_69));
+  } else {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_73 = asint(x_7[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const float x_74 = float(x_73);
+    x_GLF_color = float4(x_74, x_74, x_74, x_74);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-known-nonzero/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-known-nonzero/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..aca4892
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-known-nonzero/0-opt.spvasm.expected.msl
@@ -0,0 +1,73 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int sum = 0;
+  int i = 0;
+  a = 65536;
+  int const x_29 = x_7.x_GLF_uniform_int_values.arr[0].el;
+  sum = x_29;
+  int const x_31 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  if ((1 == x_31)) {
+    int const x_35 = a;
+    a = (x_35 - 1);
+  }
+  i = 0;
+  while (true) {
+    int const x_41 = i;
+    int const x_42 = a;
+    if ((x_41 < x_42)) {
+    } else {
+      break;
+    }
+    int const x_45 = i;
+    int const x_46 = sum;
+    sum = (x_46 + x_45);
+    {
+      int const x_49 = x_7.x_GLF_uniform_int_values.arr[2].el;
+      int const x_50 = i;
+      i = (x_50 + x_49);
+    }
+  }
+  int const x_52 = sum;
+  int const x_54 = x_7.x_GLF_uniform_int_values.arr[3].el;
+  if ((x_52 == x_54)) {
+    int const x_60 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    int const x_63 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_66 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_69 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_60), float(x_63), float(x_66), float(x_69));
+  } else {
+    int const x_73 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    float const x_74 = float(x_73);
+    *(tint_symbol_4) = float4(x_74, x_74, x_74, x_74);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-known-nonzero/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-known-nonzero/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..0d08156
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-known-nonzero/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,155 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 94
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %sum "sum"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+  %int_65536 = OpConstant %int 65536
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+   %main_out = OpTypeStruct %v4float
+         %82 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+        %sum = OpVariable %_ptr_Function_int Function %21
+          %i = OpVariable %_ptr_Function_int Function %21
+               OpStore %a %int_65536
+         %28 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %29 = OpLoad %int %28
+               OpStore %sum %29
+         %31 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %32 = OpLoad %int %31
+         %33 = OpIEqual %bool %int_1 %32
+               OpSelectionMerge %35 None
+               OpBranchConditional %33 %36 %35
+         %36 = OpLabel
+         %37 = OpLoad %int %a
+         %38 = OpISub %int %37 %int_1
+               OpStore %a %38
+               OpBranch %35
+         %35 = OpLabel
+               OpStore %i %int_0
+               OpBranch %39
+         %39 = OpLabel
+               OpLoopMerge %40 %41 None
+               OpBranch %42
+         %42 = OpLabel
+         %43 = OpLoad %int %i
+         %44 = OpLoad %int %a
+         %45 = OpSLessThan %bool %43 %44
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %48
+         %47 = OpLabel
+               OpBranch %46
+         %48 = OpLabel
+               OpBranch %40
+         %46 = OpLabel
+         %49 = OpLoad %int %i
+         %50 = OpLoad %int %sum
+         %51 = OpIAdd %int %50 %49
+               OpStore %sum %51
+               OpBranch %41
+         %41 = OpLabel
+         %53 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %54 = OpLoad %int %53
+         %55 = OpLoad %int %i
+         %56 = OpIAdd %int %55 %54
+               OpStore %i %56
+               OpBranch %39
+         %40 = OpLabel
+         %57 = OpLoad %int %sum
+         %59 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_3
+         %60 = OpLoad %int %59
+         %61 = OpIEqual %bool %57 %60
+               OpSelectionMerge %62 None
+               OpBranchConditional %61 %63 %64
+         %63 = OpLabel
+         %65 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %66 = OpLoad %int %65
+         %67 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %68 = OpLoad %int %67
+         %69 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %70 = OpLoad %int %69
+         %71 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %72 = OpLoad %int %71
+         %73 = OpConvertSToF %float %66
+         %74 = OpConvertSToF %float %68
+         %75 = OpConvertSToF %float %70
+         %76 = OpConvertSToF %float %72
+         %77 = OpCompositeConstruct %v4float %73 %74 %75 %76
+               OpStore %x_GLF_color %77
+               OpBranch %62
+         %64 = OpLabel
+         %78 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %79 = OpLoad %int %78
+         %80 = OpConvertSToF %float %79
+         %81 = OpCompositeConstruct %v4float %80 %80 %80 %80
+               OpStore %x_GLF_color %81
+               OpBranch %62
+         %62 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %82
+%tint_symbol = OpFunctionParameter %main_out
+         %86 = OpLabel
+         %87 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %87
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %89 = OpLabel
+         %90 = OpFunctionCall %void %main_1
+         %92 = OpLoad %v4float %x_GLF_color
+         %93 = OpCompositeConstruct %main_out %92
+         %91 = OpFunctionCall %void %tint_symbol_2 %93
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-known-nonzero/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-known-nonzero/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..c8d8ccc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-known-nonzero/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,67 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var sum : i32;
+  var i : i32;
+  a = 65536;
+  let x_29 : i32 = x_7.x_GLF_uniform_int_values[0];
+  sum = x_29;
+  let x_31 : i32 = x_7.x_GLF_uniform_int_values[1];
+  if ((1 == x_31)) {
+    let x_35 : i32 = a;
+    a = (x_35 - 1);
+  }
+  i = 0;
+  loop {
+    let x_41 : i32 = i;
+    let x_42 : i32 = a;
+    if ((x_41 < x_42)) {
+    } else {
+      break;
+    }
+    let x_45 : i32 = i;
+    let x_46 : i32 = sum;
+    sum = (x_46 + x_45);
+
+    continuing {
+      let x_49 : i32 = x_7.x_GLF_uniform_int_values[2];
+      let x_50 : i32 = i;
+      i = (x_50 + x_49);
+    }
+  }
+  let x_52 : i32 = sum;
+  let x_54 : i32 = x_7.x_GLF_uniform_int_values[3];
+  if ((x_52 == x_54)) {
+    let x_60 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_63 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_66 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_69 : i32 = x_7.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_60), f32(x_63), f32(x_66), f32(x_69));
+  } else {
+    let x_73 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_74 : f32 = f32(x_73);
+    x_GLF_color = vec4<f32>(x_74, x_74, x_74, x_74);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-known-nonzero/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-known-nonzero/0-opt.wgsl
new file mode 100644
index 0000000..c8d8ccc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-known-nonzero/0-opt.wgsl
@@ -0,0 +1,67 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var sum : i32;
+  var i : i32;
+  a = 65536;
+  let x_29 : i32 = x_7.x_GLF_uniform_int_values[0];
+  sum = x_29;
+  let x_31 : i32 = x_7.x_GLF_uniform_int_values[1];
+  if ((1 == x_31)) {
+    let x_35 : i32 = a;
+    a = (x_35 - 1);
+  }
+  i = 0;
+  loop {
+    let x_41 : i32 = i;
+    let x_42 : i32 = a;
+    if ((x_41 < x_42)) {
+    } else {
+      break;
+    }
+    let x_45 : i32 = i;
+    let x_46 : i32 = sum;
+    sum = (x_46 + x_45);
+
+    continuing {
+      let x_49 : i32 = x_7.x_GLF_uniform_int_values[2];
+      let x_50 : i32 = i;
+      i = (x_50 + x_49);
+    }
+  }
+  let x_52 : i32 = sum;
+  let x_54 : i32 = x_7.x_GLF_uniform_int_values[3];
+  if ((x_52 == x_54)) {
+    let x_60 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_63 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_66 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_69 : i32 = x_7.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_60), f32(x_63), f32(x_66), f32(x_69));
+  } else {
+    let x_73 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_74 : f32 = f32(x_73);
+    x_GLF_color = vec4<f32>(x_74, x_74, x_74, x_74);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-known-nonzero/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-known-nonzero/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..08b57e0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-known-nonzero/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,61 @@
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int a = 0;
+  int sum = 0;
+  int i = 0;
+  a = 65536;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_29 = asint(x_7[scalar_offset / 4][scalar_offset % 4]);
+  sum = x_29;
+  const int x_31 = asint(x_7[1].x);
+  if ((1 == x_31)) {
+    a = (a - 1);
+  }
+  i = 0;
+  while (true) {
+    if ((i < a)) {
+    } else {
+      break;
+    }
+    sum = (sum + i);
+    {
+      const int x_49 = asint(x_7[2].x);
+      i = (i + x_49);
+    }
+  }
+  const int x_52 = sum;
+  const int x_54 = asint(x_7[3].x);
+  if ((x_52 == x_54)) {
+    const int x_60 = asint(x_7[1].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_63 = asint(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_66 = asint(x_7[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_69 = asint(x_7[1].x);
+    x_GLF_color = float4(float(x_60), float(x_63), float(x_66), float(x_69));
+  } else {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_73 = asint(x_7[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const float x_74 = float(x_73);
+    x_GLF_color = float4(x_74, x_74, x_74, x_74);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-known-nonzero/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-known-nonzero/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..aca4892
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-known-nonzero/0-opt.wgsl.expected.msl
@@ -0,0 +1,73 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_4) {
+  int a = 0;
+  int sum = 0;
+  int i = 0;
+  a = 65536;
+  int const x_29 = x_7.x_GLF_uniform_int_values.arr[0].el;
+  sum = x_29;
+  int const x_31 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  if ((1 == x_31)) {
+    int const x_35 = a;
+    a = (x_35 - 1);
+  }
+  i = 0;
+  while (true) {
+    int const x_41 = i;
+    int const x_42 = a;
+    if ((x_41 < x_42)) {
+    } else {
+      break;
+    }
+    int const x_45 = i;
+    int const x_46 = sum;
+    sum = (x_46 + x_45);
+    {
+      int const x_49 = x_7.x_GLF_uniform_int_values.arr[2].el;
+      int const x_50 = i;
+      i = (x_50 + x_49);
+    }
+  }
+  int const x_52 = sum;
+  int const x_54 = x_7.x_GLF_uniform_int_values.arr[3].el;
+  if ((x_52 == x_54)) {
+    int const x_60 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    int const x_63 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_66 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_69 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_60), float(x_63), float(x_66), float(x_69));
+  } else {
+    int const x_73 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    float const x_74 = float(x_73);
+    *(tint_symbol_4) = float4(x_74, x_74, x_74, x_74);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-known-nonzero/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-known-nonzero/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..0d08156
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-known-nonzero/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,155 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 94
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %sum "sum"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %21 = OpConstantNull %int
+  %int_65536 = OpConstant %int 65536
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+   %main_out = OpTypeStruct %v4float
+         %82 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %a = OpVariable %_ptr_Function_int Function %21
+        %sum = OpVariable %_ptr_Function_int Function %21
+          %i = OpVariable %_ptr_Function_int Function %21
+               OpStore %a %int_65536
+         %28 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %29 = OpLoad %int %28
+               OpStore %sum %29
+         %31 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %32 = OpLoad %int %31
+         %33 = OpIEqual %bool %int_1 %32
+               OpSelectionMerge %35 None
+               OpBranchConditional %33 %36 %35
+         %36 = OpLabel
+         %37 = OpLoad %int %a
+         %38 = OpISub %int %37 %int_1
+               OpStore %a %38
+               OpBranch %35
+         %35 = OpLabel
+               OpStore %i %int_0
+               OpBranch %39
+         %39 = OpLabel
+               OpLoopMerge %40 %41 None
+               OpBranch %42
+         %42 = OpLabel
+         %43 = OpLoad %int %i
+         %44 = OpLoad %int %a
+         %45 = OpSLessThan %bool %43 %44
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %48
+         %47 = OpLabel
+               OpBranch %46
+         %48 = OpLabel
+               OpBranch %40
+         %46 = OpLabel
+         %49 = OpLoad %int %i
+         %50 = OpLoad %int %sum
+         %51 = OpIAdd %int %50 %49
+               OpStore %sum %51
+               OpBranch %41
+         %41 = OpLabel
+         %53 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_2
+         %54 = OpLoad %int %53
+         %55 = OpLoad %int %i
+         %56 = OpIAdd %int %55 %54
+               OpStore %i %56
+               OpBranch %39
+         %40 = OpLabel
+         %57 = OpLoad %int %sum
+         %59 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_3
+         %60 = OpLoad %int %59
+         %61 = OpIEqual %bool %57 %60
+               OpSelectionMerge %62 None
+               OpBranchConditional %61 %63 %64
+         %63 = OpLabel
+         %65 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %66 = OpLoad %int %65
+         %67 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %68 = OpLoad %int %67
+         %69 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %70 = OpLoad %int %69
+         %71 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %72 = OpLoad %int %71
+         %73 = OpConvertSToF %float %66
+         %74 = OpConvertSToF %float %68
+         %75 = OpConvertSToF %float %70
+         %76 = OpConvertSToF %float %72
+         %77 = OpCompositeConstruct %v4float %73 %74 %75 %76
+               OpStore %x_GLF_color %77
+               OpBranch %62
+         %64 = OpLabel
+         %78 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %79 = OpLoad %int %78
+         %80 = OpConvertSToF %float %79
+         %81 = OpCompositeConstruct %v4float %80 %80 %80 %80
+               OpStore %x_GLF_color %81
+               OpBranch %62
+         %62 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %82
+%tint_symbol = OpFunctionParameter %main_out
+         %86 = OpLabel
+         %87 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %87
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %89 = OpLabel
+         %90 = OpFunctionCall %void %main_1
+         %92 = OpLoad %v4float %x_GLF_color
+         %93 = OpCompositeConstruct %main_out %92
+         %91 = OpFunctionCall %void %tint_symbol_2 %93
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-known-nonzero/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-known-nonzero/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..c8d8ccc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-known-nonzero/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,67 @@
+type Arr = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : i32;
+  var sum : i32;
+  var i : i32;
+  a = 65536;
+  let x_29 : i32 = x_7.x_GLF_uniform_int_values[0];
+  sum = x_29;
+  let x_31 : i32 = x_7.x_GLF_uniform_int_values[1];
+  if ((1 == x_31)) {
+    let x_35 : i32 = a;
+    a = (x_35 - 1);
+  }
+  i = 0;
+  loop {
+    let x_41 : i32 = i;
+    let x_42 : i32 = a;
+    if ((x_41 < x_42)) {
+    } else {
+      break;
+    }
+    let x_45 : i32 = i;
+    let x_46 : i32 = sum;
+    sum = (x_46 + x_45);
+
+    continuing {
+      let x_49 : i32 = x_7.x_GLF_uniform_int_values[2];
+      let x_50 : i32 = i;
+      i = (x_50 + x_49);
+    }
+  }
+  let x_52 : i32 = sum;
+  let x_54 : i32 = x_7.x_GLF_uniform_int_values[3];
+  if ((x_52 == x_54)) {
+    let x_60 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_63 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_66 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_69 : i32 = x_7.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_60), f32(x_63), f32(x_66), f32(x_69));
+  } else {
+    let x_73 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_74 : f32 = f32(x_73);
+    x_GLF_color = vec4<f32>(x_74, x_74, x_74, x_74);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-max-uintbitstofloat/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-max-uintbitstofloat/0-opt.spvasm
new file mode 100644
index 0000000..6ad3bbd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-max-uintbitstofloat/0-opt.spvasm
@@ -0,0 +1,104 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %f "f"
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "_GLF_uniform_uint_values"
+               OpName %_ ""
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %__1 ""
+               OpDecorate %_arr_uint_uint_1 ArrayStride 16
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %buf2 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 2
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__1 DescriptorSet 0
+               OpDecorate %__1 Binding 0
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+       %uint = OpTypeInt 32 0
+   %uint_100 = OpConstant %uint 100
+     %uint_1 = OpConstant %uint 1
+%_arr_uint_uint_1 = OpTypeArray %uint %uint_1
+       %buf2 = OpTypeStruct %_arr_uint_uint_1
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+          %_ = OpVariable %_ptr_Uniform_buf2 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf1 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__1 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %main = OpFunction %void None %15
+         %34 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function
+         %35 = OpAccessChain %_ptr_Uniform_uint %_ %int_0 %int_0
+         %36 = OpLoad %uint %35
+         %37 = OpExtInst %uint %1 UMax %uint_100 %36
+         %38 = OpBitcast %float %37
+               OpStore %f %38
+         %39 = OpLoad %float %f
+         %40 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %41 = OpLoad %float %40
+         %42 = OpFOrdEqual %bool %39 %41
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %45
+         %44 = OpLabel
+         %46 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_0
+         %47 = OpLoad %int %46
+         %48 = OpConvertSToF %float %47
+         %49 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_1
+         %50 = OpLoad %int %49
+         %51 = OpConvertSToF %float %50
+         %52 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_1
+         %53 = OpLoad %int %52
+         %54 = OpConvertSToF %float %53
+         %55 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_0
+         %56 = OpLoad %int %55
+         %57 = OpConvertSToF %float %56
+         %58 = OpCompositeConstruct %v4float %48 %51 %54 %57
+               OpStore %_GLF_color %58
+               OpBranch %43
+         %45 = OpLabel
+         %59 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_1
+         %60 = OpLoad %int %59
+         %61 = OpConvertSToF %float %60
+         %62 = OpCompositeConstruct %v4float %61 %61 %61 %61
+               OpStore %_GLF_color %62
+               OpBranch %43
+         %43 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-max-uintbitstofloat/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-max-uintbitstofloat/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..d3a37e6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-max-uintbitstofloat/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,48 @@
+cbuffer cbuffer_x_6 : register(b2, space0) {
+  uint4 x_6[1];
+};
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[2];
+};
+
+void main_1() {
+  float f = 0.0f;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const uint x_36 = x_6[scalar_offset / 4][scalar_offset % 4];
+  f = asfloat(max(100u, x_36));
+  const float x_39 = f;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_41 = asfloat(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_39 == x_41)) {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_47 = asint(x_10[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_50 = asint(x_10[1].x);
+    const int x_53 = asint(x_10[1].x);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_56 = asint(x_10[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    x_GLF_color = float4(float(x_47), float(x_50), float(x_53), float(x_56));
+  } else {
+    const int x_60 = asint(x_10[1].x);
+    const float x_61 = float(x_60);
+    x_GLF_color = float4(x_61, x_61, x_61, x_61);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-max-uintbitstofloat/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-max-uintbitstofloat/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..89ab95d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-max-uintbitstofloat/0-opt.spvasm.expected.msl
@@ -0,0 +1,68 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ uint el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[1];
+};
+struct buf2 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_uint_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_2 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_2[12];
+};
+struct tint_array_wrapper_2 {
+  /* 0x0000 */ tint_padded_array_element_2 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_2 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf2& x_6, constant buf1& x_8, constant buf0& x_10, thread float4* const tint_symbol_4) {
+  float f = 0.0f;
+  uint const x_36 = x_6.x_GLF_uniform_uint_values.arr[0].el;
+  f = as_type<float>(max(100u, x_36));
+  float const x_39 = f;
+  float const x_41 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_39 == x_41)) {
+    int const x_47 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    int const x_50 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_53 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_56 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_47), float(x_50), float(x_53), float(x_56));
+  } else {
+    int const x_60 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    float const x_61 = float(x_60);
+    *(tint_symbol_4) = float4(x_61, x_61, x_61, x_61);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf2& x_6 [[buffer(2)]], constant buf1& x_8 [[buffer(1)]], constant buf0& x_10 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-max-uintbitstofloat/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-max-uintbitstofloat/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..1b834bb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-max-uintbitstofloat/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,140 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 80
+; Schema: 0
+               OpCapability Shader
+         %38 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "x_GLF_uniform_uint_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf2 Block
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %_arr_uint_uint_1 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 2
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_uint_uint_1 = OpTypeArray %uint %uint_1
+       %buf2 = OpTypeStruct %_arr_uint_uint_1
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+        %x_6 = OpVariable %_ptr_Uniform_buf2 Uniform
+      %float = OpTypeFloat 32
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf1 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %15 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %15
+        %int = OpTypeInt 32 1
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %15
+       %void = OpTypeVoid
+         %24 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %30 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+   %uint_100 = OpConstant %uint 100
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %68 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %24
+         %27 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %30
+         %34 = OpAccessChain %_ptr_Uniform_uint %x_6 %uint_0 %int_0
+         %35 = OpLoad %uint %34
+         %37 = OpExtInst %uint %38 UMax %uint_100 %35
+         %36 = OpBitcast %float %37
+               OpStore %f %36
+         %40 = OpLoad %float %f
+         %42 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %43 = OpLoad %float %42
+         %44 = OpFOrdEqual %bool %40 %43
+               OpSelectionMerge %46 None
+               OpBranchConditional %44 %47 %48
+         %47 = OpLabel
+         %50 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %51 = OpLoad %int %50
+         %53 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %54 = OpLoad %int %53
+         %55 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %56 = OpLoad %int %55
+         %57 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %58 = OpLoad %int %57
+         %59 = OpConvertSToF %float %51
+         %60 = OpConvertSToF %float %54
+         %61 = OpConvertSToF %float %56
+         %62 = OpConvertSToF %float %58
+         %63 = OpCompositeConstruct %v4float %59 %60 %61 %62
+               OpStore %x_GLF_color %63
+               OpBranch %46
+         %48 = OpLabel
+         %64 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %65 = OpLoad %int %64
+         %66 = OpConvertSToF %float %65
+         %67 = OpCompositeConstruct %v4float %66 %66 %66 %66
+               OpStore %x_GLF_color %67
+               OpBranch %46
+         %46 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %68
+%tint_symbol = OpFunctionParameter %main_out
+         %72 = OpLabel
+         %73 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %73
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %24
+         %75 = OpLabel
+         %76 = OpFunctionCall %void %main_1
+         %78 = OpLoad %v4float %x_GLF_color
+         %79 = OpCompositeConstruct %main_out %78
+         %77 = OpFunctionCall %void %tint_symbol_2 %79
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-max-uintbitstofloat/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-max-uintbitstofloat/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..0bf1020
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-max-uintbitstofloat/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,59 @@
+type Arr = [[stride(16)]] array<u32, 1>;
+
+[[block]]
+struct buf2 {
+  x_GLF_uniform_uint_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+type Arr_2 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_2;
+};
+
+[[group(0), binding(2)]] var<uniform> x_6 : buf2;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+fn main_1() {
+  var f : f32;
+  let x_36 : u32 = x_6.x_GLF_uniform_uint_values[0];
+  f = bitcast<f32>(max(100u, x_36));
+  let x_39 : f32 = f;
+  let x_41 : f32 = x_8.x_GLF_uniform_float_values[0];
+  if ((x_39 == x_41)) {
+    let x_47 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_50 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_53 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_56 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_47), f32(x_50), f32(x_53), f32(x_56));
+  } else {
+    let x_60 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_61 : f32 = f32(x_60);
+    x_GLF_color = vec4<f32>(x_61, x_61, x_61, x_61);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-max-uintbitstofloat/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-max-uintbitstofloat/0-opt.wgsl
new file mode 100644
index 0000000..0bf1020
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-max-uintbitstofloat/0-opt.wgsl
@@ -0,0 +1,59 @@
+type Arr = [[stride(16)]] array<u32, 1>;
+
+[[block]]
+struct buf2 {
+  x_GLF_uniform_uint_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+type Arr_2 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_2;
+};
+
+[[group(0), binding(2)]] var<uniform> x_6 : buf2;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+fn main_1() {
+  var f : f32;
+  let x_36 : u32 = x_6.x_GLF_uniform_uint_values[0];
+  f = bitcast<f32>(max(100u, x_36));
+  let x_39 : f32 = f;
+  let x_41 : f32 = x_8.x_GLF_uniform_float_values[0];
+  if ((x_39 == x_41)) {
+    let x_47 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_50 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_53 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_56 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_47), f32(x_50), f32(x_53), f32(x_56));
+  } else {
+    let x_60 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_61 : f32 = f32(x_60);
+    x_GLF_color = vec4<f32>(x_61, x_61, x_61, x_61);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-max-uintbitstofloat/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-max-uintbitstofloat/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..d3a37e6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-max-uintbitstofloat/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,48 @@
+cbuffer cbuffer_x_6 : register(b2, space0) {
+  uint4 x_6[1];
+};
+cbuffer cbuffer_x_8 : register(b1, space0) {
+  uint4 x_8[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[2];
+};
+
+void main_1() {
+  float f = 0.0f;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const uint x_36 = x_6[scalar_offset / 4][scalar_offset % 4];
+  f = asfloat(max(100u, x_36));
+  const float x_39 = f;
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_41 = asfloat(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_39 == x_41)) {
+    const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+    const int x_47 = asint(x_10[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+    const int x_50 = asint(x_10[1].x);
+    const int x_53 = asint(x_10[1].x);
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_56 = asint(x_10[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    x_GLF_color = float4(float(x_47), float(x_50), float(x_53), float(x_56));
+  } else {
+    const int x_60 = asint(x_10[1].x);
+    const float x_61 = float(x_60);
+    x_GLF_color = float4(x_61, x_61, x_61, x_61);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-max-uintbitstofloat/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-max-uintbitstofloat/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..89ab95d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-max-uintbitstofloat/0-opt.wgsl.expected.msl
@@ -0,0 +1,68 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ uint el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[1];
+};
+struct buf2 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_uint_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_2 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_2[12];
+};
+struct tint_array_wrapper_2 {
+  /* 0x0000 */ tint_padded_array_element_2 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_2 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf2& x_6, constant buf1& x_8, constant buf0& x_10, thread float4* const tint_symbol_4) {
+  float f = 0.0f;
+  uint const x_36 = x_6.x_GLF_uniform_uint_values.arr[0].el;
+  f = as_type<float>(max(100u, x_36));
+  float const x_39 = f;
+  float const x_41 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  if ((x_39 == x_41)) {
+    int const x_47 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    int const x_50 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_53 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    int const x_56 = x_10.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_47), float(x_50), float(x_53), float(x_56));
+  } else {
+    int const x_60 = x_10.x_GLF_uniform_int_values.arr[1].el;
+    float const x_61 = float(x_60);
+    *(tint_symbol_4) = float4(x_61, x_61, x_61, x_61);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf2& x_6 [[buffer(2)]], constant buf1& x_8 [[buffer(1)]], constant buf0& x_10 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, x_10, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-max-uintbitstofloat/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-max-uintbitstofloat/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..1b834bb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-max-uintbitstofloat/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,140 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 80
+; Schema: 0
+               OpCapability Shader
+         %38 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "x_GLF_uniform_uint_values"
+               OpName %x_6 "x_6"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_10 "x_10"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf2 Block
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %_arr_uint_uint_1 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 2
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_uint_uint_1 = OpTypeArray %uint %uint_1
+       %buf2 = OpTypeStruct %_arr_uint_uint_1
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+        %x_6 = OpVariable %_ptr_Uniform_buf2 Uniform
+      %float = OpTypeFloat 32
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf1 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %15 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %15
+        %int = OpTypeInt 32 1
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %15
+       %void = OpTypeVoid
+         %24 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %30 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+   %uint_100 = OpConstant %uint 100
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %68 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %24
+         %27 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %30
+         %34 = OpAccessChain %_ptr_Uniform_uint %x_6 %uint_0 %int_0
+         %35 = OpLoad %uint %34
+         %37 = OpExtInst %uint %38 UMax %uint_100 %35
+         %36 = OpBitcast %float %37
+               OpStore %f %36
+         %40 = OpLoad %float %f
+         %42 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %43 = OpLoad %float %42
+         %44 = OpFOrdEqual %bool %40 %43
+               OpSelectionMerge %46 None
+               OpBranchConditional %44 %47 %48
+         %47 = OpLabel
+         %50 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %51 = OpLoad %int %50
+         %53 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %54 = OpLoad %int %53
+         %55 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %56 = OpLoad %int %55
+         %57 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_0
+         %58 = OpLoad %int %57
+         %59 = OpConvertSToF %float %51
+         %60 = OpConvertSToF %float %54
+         %61 = OpConvertSToF %float %56
+         %62 = OpConvertSToF %float %58
+         %63 = OpCompositeConstruct %v4float %59 %60 %61 %62
+               OpStore %x_GLF_color %63
+               OpBranch %46
+         %48 = OpLabel
+         %64 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0 %int_1
+         %65 = OpLoad %int %64
+         %66 = OpConvertSToF %float %65
+         %67 = OpCompositeConstruct %v4float %66 %66 %66 %66
+               OpStore %x_GLF_color %67
+               OpBranch %46
+         %46 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %68
+%tint_symbol = OpFunctionParameter %main_out
+         %72 = OpLabel
+         %73 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %73
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %24
+         %75 = OpLabel
+         %76 = OpFunctionCall %void %main_1
+         %78 = OpLoad %v4float %x_GLF_color
+         %79 = OpCompositeConstruct %main_out %78
+         %77 = OpFunctionCall %void %tint_symbol_2 %79
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-max-uintbitstofloat/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-max-uintbitstofloat/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..0bf1020
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-max-uintbitstofloat/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,59 @@
+type Arr = [[stride(16)]] array<u32, 1>;
+
+[[block]]
+struct buf2 {
+  x_GLF_uniform_uint_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+type Arr_2 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_2;
+};
+
+[[group(0), binding(2)]] var<uniform> x_6 : buf2;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+fn main_1() {
+  var f : f32;
+  let x_36 : u32 = x_6.x_GLF_uniform_uint_values[0];
+  f = bitcast<f32>(max(100u, x_36));
+  let x_39 : f32 = f;
+  let x_41 : f32 = x_8.x_GLF_uniform_float_values[0];
+  if ((x_39 == x_41)) {
+    let x_47 : i32 = x_10.x_GLF_uniform_int_values[0];
+    let x_50 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_53 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_56 : i32 = x_10.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_47), f32(x_50), f32(x_53), f32(x_56));
+  } else {
+    let x_60 : i32 = x_10.x_GLF_uniform_int_values[1];
+    let x_61 : f32 = f32(x_60);
+    x_GLF_color = vec4<f32>(x_61, x_61, x_61, x_61);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-selection-dag-negation-clamp-loop/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-selection-dag-negation-clamp-loop/0-opt.spvasm
new file mode 100644
index 0000000..45abf52
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-selection-dag-negation-clamp-loop/0-opt.spvasm
@@ -0,0 +1,305 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %ref "ref"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %data "data"
+               OpName %i_0 "i"
+               OpName %i_1 "i"
+               OpName %i_2 "i"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_16 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_15 = OpConstant %uint 15
+%_arr_int_uint_15 = OpTypeArray %int %uint_15
+%_ptr_Function__arr_int_uint_15 = OpTypePointer Function %_arr_int_uint_15
+    %uint_16 = OpConstant %uint 16
+%_arr_int_uint_16 = OpTypeArray %int %uint_16
+       %buf0 = OpTypeStruct %_arr_int_uint_16
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_8 = OpConstant %int 8
+      %int_9 = OpConstant %int 9
+     %int_10 = OpConstant %int 10
+     %int_11 = OpConstant %int 11
+      %int_6 = OpConstant %int 6
+     %int_12 = OpConstant %int 12
+     %int_13 = OpConstant %int 13
+     %int_14 = OpConstant %int 14
+     %int_15 = OpConstant %int 15
+       %bool = OpTypeBool
+      %int_7 = OpConstant %int 7
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %14
+         %44 = OpLabel
+        %ref = OpVariable %_ptr_Function__arr_int_uint_15 Function
+          %i = OpVariable %_ptr_Function_int Function
+       %data = OpVariable %_ptr_Function__arr_int_uint_15 Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+        %i_1 = OpVariable %_ptr_Function_int Function
+        %i_2 = OpVariable %_ptr_Function_int Function
+         %45 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %46 = OpLoad %int %45
+         %47 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %48 = OpLoad %int %47
+         %49 = OpAccessChain %_ptr_Function_int %ref %46
+               OpStore %49 %48
+         %50 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %51 = OpLoad %int %50
+         %52 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %53 = OpLoad %int %52
+         %54 = OpAccessChain %_ptr_Function_int %ref %51
+               OpStore %54 %53
+         %55 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %56 = OpLoad %int %55
+         %57 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+         %58 = OpLoad %int %57
+         %59 = OpAccessChain %_ptr_Function_int %ref %56
+               OpStore %59 %58
+         %60 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %61 = OpLoad %int %60
+         %62 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
+         %63 = OpLoad %int %62
+         %64 = OpAccessChain %_ptr_Function_int %ref %61
+               OpStore %64 %63
+         %65 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_4
+         %66 = OpLoad %int %65
+         %67 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_4
+         %68 = OpLoad %int %67
+         %69 = OpAccessChain %_ptr_Function_int %ref %66
+               OpStore %69 %68
+         %70 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_5
+         %71 = OpLoad %int %70
+         %72 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %73 = OpLoad %int %72
+         %74 = OpSNegate %int %73
+         %75 = OpAccessChain %_ptr_Function_int %ref %71
+               OpStore %75 %74
+         %76 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_8
+         %77 = OpLoad %int %76
+         %78 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %79 = OpLoad %int %78
+         %80 = OpSNegate %int %79
+         %81 = OpAccessChain %_ptr_Function_int %ref %77
+               OpStore %81 %80
+         %82 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_9
+         %83 = OpLoad %int %82
+         %84 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %85 = OpLoad %int %84
+         %86 = OpSNegate %int %85
+         %87 = OpAccessChain %_ptr_Function_int %ref %83
+               OpStore %87 %86
+         %88 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_10
+         %89 = OpLoad %int %88
+         %90 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %91 = OpLoad %int %90
+         %92 = OpSNegate %int %91
+         %93 = OpAccessChain %_ptr_Function_int %ref %89
+               OpStore %93 %92
+         %94 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_11
+         %95 = OpLoad %int %94
+         %96 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %97 = OpLoad %int %96
+         %98 = OpSNegate %int %97
+         %99 = OpAccessChain %_ptr_Function_int %ref %95
+               OpStore %99 %98
+        %100 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_6
+        %101 = OpLoad %int %100
+        %102 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+        %103 = OpLoad %int %102
+        %104 = OpSNegate %int %103
+        %105 = OpAccessChain %_ptr_Function_int %ref %101
+               OpStore %105 %104
+        %106 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_12
+        %107 = OpLoad %int %106
+        %108 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+        %109 = OpLoad %int %108
+        %110 = OpSNegate %int %109
+        %111 = OpAccessChain %_ptr_Function_int %ref %107
+               OpStore %111 %110
+        %112 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_13
+        %113 = OpLoad %int %112
+        %114 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+        %115 = OpLoad %int %114
+        %116 = OpSNegate %int %115
+        %117 = OpAccessChain %_ptr_Function_int %ref %113
+               OpStore %117 %116
+        %118 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_14
+        %119 = OpLoad %int %118
+        %120 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+        %121 = OpLoad %int %120
+        %122 = OpSNegate %int %121
+        %123 = OpAccessChain %_ptr_Function_int %ref %119
+               OpStore %123 %122
+        %124 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_15
+        %125 = OpLoad %int %124
+        %126 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
+        %127 = OpLoad %int %126
+        %128 = OpSNegate %int %127
+        %129 = OpAccessChain %_ptr_Function_int %ref %125
+               OpStore %129 %128
+               OpStore %i %int_0
+               OpBranch %130
+        %130 = OpLabel
+               OpLoopMerge %131 %132 None
+               OpBranch %133
+        %133 = OpLabel
+        %134 = OpLoad %int %i
+        %135 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_5
+        %136 = OpLoad %int %135
+        %137 = OpSLessThan %bool %134 %136
+               OpBranchConditional %137 %138 %131
+        %138 = OpLabel
+        %139 = OpLoad %int %i
+        %140 = OpLoad %int %i
+        %141 = OpNot %int %140
+        %142 = OpLoad %int %i
+        %143 = OpNot %int %142
+        %144 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+        %145 = OpLoad %int %144
+        %146 = OpExtInst %int %1 SClamp %141 %143 %145
+        %147 = OpNot %int %146
+        %148 = OpAccessChain %_ptr_Function_int %data %139
+               OpStore %148 %147
+               OpBranch %132
+        %132 = OpLabel
+        %149 = OpLoad %int %i
+        %150 = OpIAdd %int %149 %int_1
+               OpStore %i %150
+               OpBranch %130
+        %131 = OpLabel
+        %151 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_5
+        %152 = OpLoad %int %151
+               OpStore %i_0 %152
+               OpBranch %153
+        %153 = OpLabel
+               OpLoopMerge %154 %155 None
+               OpBranch %156
+        %156 = OpLabel
+        %157 = OpLoad %int %i_0
+        %158 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_6
+        %159 = OpLoad %int %158
+        %160 = OpSLessThan %bool %157 %159
+               OpBranchConditional %160 %161 %154
+        %161 = OpLabel
+        %162 = OpLoad %int %i_0
+        %163 = OpLoad %int %i_0
+        %164 = OpNot %int %163
+        %165 = OpExtInst %int %1 SClamp %164 %int_0 %int_1
+        %166 = OpNot %int %165
+        %167 = OpAccessChain %_ptr_Function_int %data %162
+               OpStore %167 %166
+               OpBranch %155
+        %155 = OpLabel
+        %168 = OpLoad %int %i_0
+        %169 = OpIAdd %int %168 %int_1
+               OpStore %i_0 %169
+               OpBranch %153
+        %154 = OpLabel
+        %170 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_6
+        %171 = OpLoad %int %170
+               OpStore %i_1 %171
+               OpBranch %172
+        %172 = OpLabel
+               OpLoopMerge %173 %174 None
+               OpBranch %175
+        %175 = OpLabel
+        %176 = OpLoad %int %i_1
+        %177 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_7
+        %178 = OpLoad %int %177
+        %179 = OpSLessThan %bool %176 %178
+               OpBranchConditional %179 %180 %173
+        %180 = OpLabel
+        %181 = OpLoad %int %i_1
+        %182 = OpLoad %int %i_1
+        %183 = OpExtInst %int %1 SClamp %182 %int_0 %int_1
+        %184 = OpNot %int %183
+        %185 = OpAccessChain %_ptr_Function_int %data %181
+               OpStore %185 %184
+               OpBranch %174
+        %174 = OpLabel
+        %186 = OpLoad %int %i_1
+        %187 = OpIAdd %int %186 %int_1
+               OpStore %i_1 %187
+               OpBranch %172
+        %173 = OpLabel
+        %188 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+        %189 = OpLoad %int %188
+               OpStore %i_2 %189
+               OpBranch %190
+        %190 = OpLabel
+               OpLoopMerge %191 %192 None
+               OpBranch %193
+        %193 = OpLabel
+        %194 = OpLoad %int %i_2
+        %195 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_7
+        %196 = OpLoad %int %195
+        %197 = OpSLessThan %bool %194 %196
+               OpBranchConditional %197 %198 %191
+        %198 = OpLabel
+        %199 = OpLoad %int %i_2
+        %200 = OpAccessChain %_ptr_Function_int %data %199
+        %201 = OpLoad %int %200
+        %202 = OpLoad %int %i_2
+        %203 = OpAccessChain %_ptr_Function_int %ref %202
+        %204 = OpLoad %int %203
+        %205 = OpINotEqual %bool %201 %204
+               OpSelectionMerge %206 None
+               OpBranchConditional %205 %207 %206
+        %207 = OpLabel
+        %208 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+        %209 = OpLoad %int %208
+        %210 = OpConvertSToF %float %209
+        %211 = OpCompositeConstruct %v4float %210 %210 %210 %210
+               OpStore %_GLF_color %211
+               OpReturn
+        %206 = OpLabel
+               OpBranch %192
+        %192 = OpLabel
+        %212 = OpLoad %int %i_2
+        %213 = OpIAdd %int %212 %int_1
+               OpStore %i_2 %213
+               OpBranch %190
+        %191 = OpLabel
+        %214 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+        %215 = OpLoad %int %214
+        %216 = OpConvertSToF %float %215
+        %217 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+        %218 = OpLoad %int %217
+        %219 = OpConvertSToF %float %218
+        %220 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+        %221 = OpLoad %int %220
+        %222 = OpConvertSToF %float %221
+        %223 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+        %224 = OpLoad %int %223
+        %225 = OpConvertSToF %float %224
+        %226 = OpCompositeConstruct %v4float %216 %219 %222 %225
+               OpStore %_GLF_color %226
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-selection-dag-negation-clamp-loop/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-selection-dag-negation-clamp-loop/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..8b5cb07
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-selection-dag-negation-clamp-loop/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,150 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[16];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int ref[15] = (int[15])0;
+  int i = 0;
+  int data[15] = (int[15])0;
+  int i_1 = 0;
+  int i_2 = 0;
+  int i_3 = 0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_46 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_48 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  ref[x_46] = x_48;
+  const int x_51 = asint(x_6[1].x);
+  const int x_53 = asint(x_6[1].x);
+  ref[x_51] = x_53;
+  const int x_56 = asint(x_6[2].x);
+  const int x_58 = asint(x_6[2].x);
+  ref[x_56] = x_58;
+  const int x_61 = asint(x_6[3].x);
+  const int x_63 = asint(x_6[3].x);
+  ref[x_61] = x_63;
+  const int x_66 = asint(x_6[4].x);
+  const int x_68 = asint(x_6[4].x);
+  ref[x_66] = x_68;
+  const int x_71 = asint(x_6[5].x);
+  const int x_73 = asint(x_6[1].x);
+  ref[x_71] = -(x_73);
+  const int x_77 = asint(x_6[8].x);
+  const int x_79 = asint(x_6[1].x);
+  ref[x_77] = -(x_79);
+  const int x_83 = asint(x_6[9].x);
+  const int x_85 = asint(x_6[1].x);
+  ref[x_83] = -(x_85);
+  const int x_89 = asint(x_6[10].x);
+  const int x_91 = asint(x_6[1].x);
+  ref[x_89] = -(x_91);
+  const int x_95 = asint(x_6[11].x);
+  const int x_97 = asint(x_6[1].x);
+  ref[x_95] = -(x_97);
+  const int x_101 = asint(x_6[6].x);
+  const int x_103 = asint(x_6[2].x);
+  ref[x_101] = -(x_103);
+  const int x_107 = asint(x_6[12].x);
+  const int x_109 = asint(x_6[2].x);
+  ref[x_107] = -(x_109);
+  const int x_113 = asint(x_6[13].x);
+  const int x_115 = asint(x_6[2].x);
+  ref[x_113] = -(x_115);
+  const int x_119 = asint(x_6[14].x);
+  const int x_121 = asint(x_6[2].x);
+  ref[x_119] = -(x_121);
+  const int x_125 = asint(x_6[15].x);
+  const int x_127 = asint(x_6[2].x);
+  ref[x_125] = -(x_127);
+  i = 0;
+  while (true) {
+    const int x_134 = i;
+    const int x_136 = asint(x_6[5].x);
+    if ((x_134 < x_136)) {
+    } else {
+      break;
+    }
+    const int x_139 = i;
+    const int x_140 = i;
+    const int x_142 = i;
+    const int x_145 = asint(x_6[1].x);
+    data[x_139] = ~(clamp(~(x_140), ~(x_142), x_145));
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_152 = asint(x_6[5].x);
+  i_1 = x_152;
+  while (true) {
+    const int x_157 = i_1;
+    const int x_159 = asint(x_6[6].x);
+    if ((x_157 < x_159)) {
+    } else {
+      break;
+    }
+    data[i_1] = ~(clamp(~(i_1), 0, 1));
+    {
+      i_1 = (i_1 + 1);
+    }
+  }
+  const int x_171 = asint(x_6[6].x);
+  i_2 = x_171;
+  while (true) {
+    const int x_176 = i_2;
+    const int x_178 = asint(x_6[7].x);
+    if ((x_176 < x_178)) {
+    } else {
+      break;
+    }
+    data[i_2] = ~(clamp(i_2, 0, 1));
+    {
+      i_2 = (i_2 + 1);
+    }
+  }
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const int x_189 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  i_3 = x_189;
+  while (true) {
+    const int x_194 = i_3;
+    const int x_196 = asint(x_6[7].x);
+    if ((x_194 < x_196)) {
+    } else {
+      break;
+    }
+    const int x_201 = data[i_3];
+    const int x_204 = ref[i_3];
+    if ((x_201 != x_204)) {
+      const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+      const int x_209 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+      const float x_210 = float(x_209);
+      x_GLF_color = float4(x_210, x_210, x_210, x_210);
+      return;
+    }
+    {
+      i_3 = (i_3 + 1);
+    }
+  }
+  const int x_215 = asint(x_6[1].x);
+  const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+  const int x_218 = asint(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+  const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+  const int x_221 = asint(x_6[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+  const int x_224 = asint(x_6[1].x);
+  x_GLF_color = float4(float(x_215), float(x_218), float(x_221), float(x_224));
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-selection-dag-negation-clamp-loop/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-selection-dag-negation-clamp-loop/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..cceaae5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-selection-dag-negation-clamp-loop/0-opt.spvasm.expected.msl
@@ -0,0 +1,167 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[16];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_1 {
+  int arr[15];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  tint_array_wrapper_1 ref = {};
+  int i = 0;
+  tint_array_wrapper_1 data = {};
+  int i_1 = 0;
+  int i_2 = 0;
+  int i_3 = 0;
+  int const x_46 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_48 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  ref.arr[x_46] = x_48;
+  int const x_51 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_53 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  ref.arr[x_51] = x_53;
+  int const x_56 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_58 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  ref.arr[x_56] = x_58;
+  int const x_61 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  int const x_63 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  ref.arr[x_61] = x_63;
+  int const x_66 = x_6.x_GLF_uniform_int_values.arr[4].el;
+  int const x_68 = x_6.x_GLF_uniform_int_values.arr[4].el;
+  ref.arr[x_66] = x_68;
+  int const x_71 = x_6.x_GLF_uniform_int_values.arr[5].el;
+  int const x_73 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  ref.arr[x_71] = -(x_73);
+  int const x_77 = x_6.x_GLF_uniform_int_values.arr[8].el;
+  int const x_79 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  ref.arr[x_77] = -(x_79);
+  int const x_83 = x_6.x_GLF_uniform_int_values.arr[9].el;
+  int const x_85 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  ref.arr[x_83] = -(x_85);
+  int const x_89 = x_6.x_GLF_uniform_int_values.arr[10].el;
+  int const x_91 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  ref.arr[x_89] = -(x_91);
+  int const x_95 = x_6.x_GLF_uniform_int_values.arr[11].el;
+  int const x_97 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  ref.arr[x_95] = -(x_97);
+  int const x_101 = x_6.x_GLF_uniform_int_values.arr[6].el;
+  int const x_103 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  ref.arr[x_101] = -(x_103);
+  int const x_107 = x_6.x_GLF_uniform_int_values.arr[12].el;
+  int const x_109 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  ref.arr[x_107] = -(x_109);
+  int const x_113 = x_6.x_GLF_uniform_int_values.arr[13].el;
+  int const x_115 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  ref.arr[x_113] = -(x_115);
+  int const x_119 = x_6.x_GLF_uniform_int_values.arr[14].el;
+  int const x_121 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  ref.arr[x_119] = -(x_121);
+  int const x_125 = x_6.x_GLF_uniform_int_values.arr[15].el;
+  int const x_127 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  ref.arr[x_125] = -(x_127);
+  i = 0;
+  while (true) {
+    int const x_134 = i;
+    int const x_136 = x_6.x_GLF_uniform_int_values.arr[5].el;
+    if ((x_134 < x_136)) {
+    } else {
+      break;
+    }
+    int const x_139 = i;
+    int const x_140 = i;
+    int const x_142 = i;
+    int const x_145 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    data.arr[x_139] = ~(clamp(~(x_140), ~(x_142), x_145));
+    {
+      int const x_149 = i;
+      i = (x_149 + 1);
+    }
+  }
+  int const x_152 = x_6.x_GLF_uniform_int_values.arr[5].el;
+  i_1 = x_152;
+  while (true) {
+    int const x_157 = i_1;
+    int const x_159 = x_6.x_GLF_uniform_int_values.arr[6].el;
+    if ((x_157 < x_159)) {
+    } else {
+      break;
+    }
+    int const x_162 = i_1;
+    int const x_163 = i_1;
+    data.arr[x_162] = ~(clamp(~(x_163), 0, 1));
+    {
+      int const x_168 = i_1;
+      i_1 = (x_168 + 1);
+    }
+  }
+  int const x_171 = x_6.x_GLF_uniform_int_values.arr[6].el;
+  i_2 = x_171;
+  while (true) {
+    int const x_176 = i_2;
+    int const x_178 = x_6.x_GLF_uniform_int_values.arr[7].el;
+    if ((x_176 < x_178)) {
+    } else {
+      break;
+    }
+    int const x_181 = i_2;
+    int const x_182 = i_2;
+    data.arr[x_181] = ~(clamp(x_182, 0, 1));
+    {
+      int const x_186 = i_2;
+      i_2 = (x_186 + 1);
+    }
+  }
+  int const x_189 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  i_3 = x_189;
+  while (true) {
+    int const x_194 = i_3;
+    int const x_196 = x_6.x_GLF_uniform_int_values.arr[7].el;
+    if ((x_194 < x_196)) {
+    } else {
+      break;
+    }
+    int const x_199 = i_3;
+    int const x_201 = data.arr[x_199];
+    int const x_202 = i_3;
+    int const x_204 = ref.arr[x_202];
+    if ((x_201 != x_204)) {
+      int const x_209 = x_6.x_GLF_uniform_int_values.arr[0].el;
+      float const x_210 = float(x_209);
+      *(tint_symbol_4) = float4(x_210, x_210, x_210, x_210);
+      return;
+    }
+    {
+      int const x_212 = i_3;
+      i_3 = (x_212 + 1);
+    }
+  }
+  int const x_215 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_218 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_221 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_224 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  *(tint_symbol_4) = float4(float(x_215), float(x_218), float(x_221), float(x_224));
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-selection-dag-negation-clamp-loop/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-selection-dag-negation-clamp-loop/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..0879b72
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-selection-dag-negation-clamp-loop/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,361 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 253
+; Schema: 0
+               OpCapability Shader
+        %153 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %ref "ref"
+               OpName %i "i"
+               OpName %data "data"
+               OpName %i_1 "i_1"
+               OpName %i_2 "i_2"
+               OpName %i_3 "i_3"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_16 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_15 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_16 = OpConstant %uint 16
+%_arr_int_uint_16 = OpTypeArray %int %uint_16
+       %buf0 = OpTypeStruct %_arr_int_uint_16
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+    %uint_15 = OpConstant %uint 15
+%_arr_int_uint_15 = OpTypeArray %int %uint_15
+%_ptr_Function__arr_int_uint_15 = OpTypePointer Function %_arr_int_uint_15
+         %23 = OpConstantNull %_arr_int_uint_15
+%_ptr_Function_int = OpTypePointer Function %int
+         %26 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_8 = OpConstant %int 8
+      %int_9 = OpConstant %int 9
+     %int_10 = OpConstant %int 10
+     %int_11 = OpConstant %int 11
+      %int_6 = OpConstant %int 6
+     %int_12 = OpConstant %int 12
+     %int_13 = OpConstant %int 13
+     %int_14 = OpConstant %int 14
+     %int_15 = OpConstant %int 15
+       %bool = OpTypeBool
+      %int_7 = OpConstant %int 7
+   %main_out = OpTypeStruct %v4float
+        %241 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+        %ref = OpVariable %_ptr_Function__arr_int_uint_15 Function %23
+          %i = OpVariable %_ptr_Function_int Function %26
+       %data = OpVariable %_ptr_Function__arr_int_uint_15 Function %23
+        %i_1 = OpVariable %_ptr_Function_int Function %26
+        %i_2 = OpVariable %_ptr_Function_int Function %26
+        %i_3 = OpVariable %_ptr_Function_int Function %26
+         %34 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %35 = OpLoad %int %34
+         %36 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %37 = OpLoad %int %36
+         %38 = OpAccessChain %_ptr_Function_int %ref %35
+               OpStore %38 %37
+         %40 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %41 = OpLoad %int %40
+         %42 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %43 = OpLoad %int %42
+         %44 = OpAccessChain %_ptr_Function_int %ref %41
+               OpStore %44 %43
+         %46 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %47 = OpLoad %int %46
+         %48 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %49 = OpLoad %int %48
+         %50 = OpAccessChain %_ptr_Function_int %ref %47
+               OpStore %50 %49
+         %52 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %53 = OpLoad %int %52
+         %54 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %55 = OpLoad %int %54
+         %56 = OpAccessChain %_ptr_Function_int %ref %53
+               OpStore %56 %55
+         %58 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+         %59 = OpLoad %int %58
+         %60 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+         %61 = OpLoad %int %60
+         %62 = OpAccessChain %_ptr_Function_int %ref %59
+               OpStore %62 %61
+         %64 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_5
+         %65 = OpLoad %int %64
+         %66 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %67 = OpLoad %int %66
+         %68 = OpAccessChain %_ptr_Function_int %ref %65
+         %69 = OpSNegate %int %67
+               OpStore %68 %69
+         %71 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_8
+         %72 = OpLoad %int %71
+         %73 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %74 = OpLoad %int %73
+         %75 = OpAccessChain %_ptr_Function_int %ref %72
+         %76 = OpSNegate %int %74
+               OpStore %75 %76
+         %78 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_9
+         %79 = OpLoad %int %78
+         %80 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %81 = OpLoad %int %80
+         %82 = OpAccessChain %_ptr_Function_int %ref %79
+         %83 = OpSNegate %int %81
+               OpStore %82 %83
+         %85 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_10
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %88 = OpLoad %int %87
+         %89 = OpAccessChain %_ptr_Function_int %ref %86
+         %90 = OpSNegate %int %88
+               OpStore %89 %90
+         %92 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_11
+         %93 = OpLoad %int %92
+         %94 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %95 = OpLoad %int %94
+         %96 = OpAccessChain %_ptr_Function_int %ref %93
+         %97 = OpSNegate %int %95
+               OpStore %96 %97
+         %99 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_6
+        %100 = OpLoad %int %99
+        %101 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %102 = OpLoad %int %101
+        %103 = OpAccessChain %_ptr_Function_int %ref %100
+        %104 = OpSNegate %int %102
+               OpStore %103 %104
+        %106 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_12
+        %107 = OpLoad %int %106
+        %108 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %109 = OpLoad %int %108
+        %110 = OpAccessChain %_ptr_Function_int %ref %107
+        %111 = OpSNegate %int %109
+               OpStore %110 %111
+        %113 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_13
+        %114 = OpLoad %int %113
+        %115 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %116 = OpLoad %int %115
+        %117 = OpAccessChain %_ptr_Function_int %ref %114
+        %118 = OpSNegate %int %116
+               OpStore %117 %118
+        %120 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_14
+        %121 = OpLoad %int %120
+        %122 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %123 = OpLoad %int %122
+        %124 = OpAccessChain %_ptr_Function_int %ref %121
+        %125 = OpSNegate %int %123
+               OpStore %124 %125
+        %127 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_15
+        %128 = OpLoad %int %127
+        %129 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %130 = OpLoad %int %129
+        %131 = OpAccessChain %_ptr_Function_int %ref %128
+        %132 = OpSNegate %int %130
+               OpStore %131 %132
+               OpStore %i %int_0
+               OpBranch %133
+        %133 = OpLabel
+               OpLoopMerge %134 %135 None
+               OpBranch %136
+        %136 = OpLabel
+        %137 = OpLoad %int %i
+        %138 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_5
+        %139 = OpLoad %int %138
+        %140 = OpSLessThan %bool %137 %139
+               OpSelectionMerge %142 None
+               OpBranchConditional %140 %143 %144
+        %143 = OpLabel
+               OpBranch %142
+        %144 = OpLabel
+               OpBranch %134
+        %142 = OpLabel
+        %145 = OpLoad %int %i
+        %146 = OpLoad %int %i
+        %147 = OpLoad %int %i
+        %148 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %149 = OpLoad %int %148
+        %150 = OpAccessChain %_ptr_Function_int %data %145
+        %154 = OpNot %int %146
+        %155 = OpNot %int %147
+        %152 = OpExtInst %int %153 SClamp %154 %155 %149
+        %151 = OpNot %int %152
+               OpStore %150 %151
+               OpBranch %135
+        %135 = OpLabel
+        %156 = OpLoad %int %i
+        %157 = OpIAdd %int %156 %int_1
+               OpStore %i %157
+               OpBranch %133
+        %134 = OpLabel
+        %158 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_5
+        %159 = OpLoad %int %158
+               OpStore %i_1 %159
+               OpBranch %160
+        %160 = OpLabel
+               OpLoopMerge %161 %162 None
+               OpBranch %163
+        %163 = OpLabel
+        %164 = OpLoad %int %i_1
+        %165 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_6
+        %166 = OpLoad %int %165
+        %167 = OpSLessThan %bool %164 %166
+               OpSelectionMerge %168 None
+               OpBranchConditional %167 %169 %170
+        %169 = OpLabel
+               OpBranch %168
+        %170 = OpLabel
+               OpBranch %161
+        %168 = OpLabel
+        %171 = OpLoad %int %i_1
+        %172 = OpLoad %int %i_1
+        %173 = OpAccessChain %_ptr_Function_int %data %171
+        %176 = OpNot %int %172
+        %175 = OpExtInst %int %153 SClamp %176 %int_0 %int_1
+        %174 = OpNot %int %175
+               OpStore %173 %174
+               OpBranch %162
+        %162 = OpLabel
+        %177 = OpLoad %int %i_1
+        %178 = OpIAdd %int %177 %int_1
+               OpStore %i_1 %178
+               OpBranch %160
+        %161 = OpLabel
+        %179 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_6
+        %180 = OpLoad %int %179
+               OpStore %i_2 %180
+               OpBranch %181
+        %181 = OpLabel
+               OpLoopMerge %182 %183 None
+               OpBranch %184
+        %184 = OpLabel
+        %185 = OpLoad %int %i_2
+        %187 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_7
+        %188 = OpLoad %int %187
+        %189 = OpSLessThan %bool %185 %188
+               OpSelectionMerge %190 None
+               OpBranchConditional %189 %191 %192
+        %191 = OpLabel
+               OpBranch %190
+        %192 = OpLabel
+               OpBranch %182
+        %190 = OpLabel
+        %193 = OpLoad %int %i_2
+        %194 = OpLoad %int %i_2
+        %195 = OpAccessChain %_ptr_Function_int %data %193
+        %197 = OpExtInst %int %153 SClamp %194 %int_0 %int_1
+        %196 = OpNot %int %197
+               OpStore %195 %196
+               OpBranch %183
+        %183 = OpLabel
+        %198 = OpLoad %int %i_2
+        %199 = OpIAdd %int %198 %int_1
+               OpStore %i_2 %199
+               OpBranch %181
+        %182 = OpLabel
+        %200 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %201 = OpLoad %int %200
+               OpStore %i_3 %201
+               OpBranch %202
+        %202 = OpLabel
+               OpLoopMerge %203 %204 None
+               OpBranch %205
+        %205 = OpLabel
+        %206 = OpLoad %int %i_3
+        %207 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_7
+        %208 = OpLoad %int %207
+        %209 = OpSLessThan %bool %206 %208
+               OpSelectionMerge %210 None
+               OpBranchConditional %209 %211 %212
+        %211 = OpLabel
+               OpBranch %210
+        %212 = OpLabel
+               OpBranch %203
+        %210 = OpLabel
+        %213 = OpLoad %int %i_3
+        %214 = OpAccessChain %_ptr_Function_int %data %213
+        %215 = OpLoad %int %214
+        %216 = OpLoad %int %i_3
+        %217 = OpAccessChain %_ptr_Function_int %ref %216
+        %218 = OpLoad %int %217
+        %219 = OpINotEqual %bool %215 %218
+               OpSelectionMerge %220 None
+               OpBranchConditional %219 %221 %220
+        %221 = OpLabel
+        %222 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %223 = OpLoad %int %222
+        %224 = OpConvertSToF %float %223
+        %225 = OpCompositeConstruct %v4float %224 %224 %224 %224
+               OpStore %x_GLF_color %225
+               OpReturn
+        %220 = OpLabel
+               OpBranch %204
+        %204 = OpLabel
+        %226 = OpLoad %int %i_3
+        %227 = OpIAdd %int %226 %int_1
+               OpStore %i_3 %227
+               OpBranch %202
+        %203 = OpLabel
+        %228 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %229 = OpLoad %int %228
+        %230 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %231 = OpLoad %int %230
+        %232 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %233 = OpLoad %int %232
+        %234 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %235 = OpLoad %int %234
+        %236 = OpConvertSToF %float %229
+        %237 = OpConvertSToF %float %231
+        %238 = OpConvertSToF %float %233
+        %239 = OpConvertSToF %float %235
+        %240 = OpCompositeConstruct %v4float %236 %237 %238 %239
+               OpStore %x_GLF_color %240
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %241
+%tint_symbol = OpFunctionParameter %main_out
+        %245 = OpLabel
+        %246 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %246
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %248 = OpLabel
+        %249 = OpFunctionCall %void %main_1
+        %251 = OpLoad %v4float %x_GLF_color
+        %252 = OpCompositeConstruct %main_out %251
+        %250 = OpFunctionCall %void %tint_symbol_2 %252
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-selection-dag-negation-clamp-loop/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-selection-dag-negation-clamp-loop/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..2dc09e0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-selection-dag-negation-clamp-loop/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,161 @@
+type Arr = [[stride(16)]] array<i32, 16>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var ref : array<i32, 15>;
+  var i : i32;
+  var data : array<i32, 15>;
+  var i_1 : i32;
+  var i_2 : i32;
+  var i_3 : i32;
+  let x_46 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_48 : i32 = x_6.x_GLF_uniform_int_values[0];
+  ref[x_46] = x_48;
+  let x_51 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_53 : i32 = x_6.x_GLF_uniform_int_values[1];
+  ref[x_51] = x_53;
+  let x_56 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_58 : i32 = x_6.x_GLF_uniform_int_values[2];
+  ref[x_56] = x_58;
+  let x_61 : i32 = x_6.x_GLF_uniform_int_values[3];
+  let x_63 : i32 = x_6.x_GLF_uniform_int_values[3];
+  ref[x_61] = x_63;
+  let x_66 : i32 = x_6.x_GLF_uniform_int_values[4];
+  let x_68 : i32 = x_6.x_GLF_uniform_int_values[4];
+  ref[x_66] = x_68;
+  let x_71 : i32 = x_6.x_GLF_uniform_int_values[5];
+  let x_73 : i32 = x_6.x_GLF_uniform_int_values[1];
+  ref[x_71] = -(x_73);
+  let x_77 : i32 = x_6.x_GLF_uniform_int_values[8];
+  let x_79 : i32 = x_6.x_GLF_uniform_int_values[1];
+  ref[x_77] = -(x_79);
+  let x_83 : i32 = x_6.x_GLF_uniform_int_values[9];
+  let x_85 : i32 = x_6.x_GLF_uniform_int_values[1];
+  ref[x_83] = -(x_85);
+  let x_89 : i32 = x_6.x_GLF_uniform_int_values[10];
+  let x_91 : i32 = x_6.x_GLF_uniform_int_values[1];
+  ref[x_89] = -(x_91);
+  let x_95 : i32 = x_6.x_GLF_uniform_int_values[11];
+  let x_97 : i32 = x_6.x_GLF_uniform_int_values[1];
+  ref[x_95] = -(x_97);
+  let x_101 : i32 = x_6.x_GLF_uniform_int_values[6];
+  let x_103 : i32 = x_6.x_GLF_uniform_int_values[2];
+  ref[x_101] = -(x_103);
+  let x_107 : i32 = x_6.x_GLF_uniform_int_values[12];
+  let x_109 : i32 = x_6.x_GLF_uniform_int_values[2];
+  ref[x_107] = -(x_109);
+  let x_113 : i32 = x_6.x_GLF_uniform_int_values[13];
+  let x_115 : i32 = x_6.x_GLF_uniform_int_values[2];
+  ref[x_113] = -(x_115);
+  let x_119 : i32 = x_6.x_GLF_uniform_int_values[14];
+  let x_121 : i32 = x_6.x_GLF_uniform_int_values[2];
+  ref[x_119] = -(x_121);
+  let x_125 : i32 = x_6.x_GLF_uniform_int_values[15];
+  let x_127 : i32 = x_6.x_GLF_uniform_int_values[2];
+  ref[x_125] = -(x_127);
+  i = 0;
+  loop {
+    let x_134 : i32 = i;
+    let x_136 : i32 = x_6.x_GLF_uniform_int_values[5];
+    if ((x_134 < x_136)) {
+    } else {
+      break;
+    }
+    let x_139 : i32 = i;
+    let x_140 : i32 = i;
+    let x_142 : i32 = i;
+    let x_145 : i32 = x_6.x_GLF_uniform_int_values[1];
+    data[x_139] = ~(clamp(~(x_140), ~(x_142), x_145));
+
+    continuing {
+      let x_149 : i32 = i;
+      i = (x_149 + 1);
+    }
+  }
+  let x_152 : i32 = x_6.x_GLF_uniform_int_values[5];
+  i_1 = x_152;
+  loop {
+    let x_157 : i32 = i_1;
+    let x_159 : i32 = x_6.x_GLF_uniform_int_values[6];
+    if ((x_157 < x_159)) {
+    } else {
+      break;
+    }
+    let x_162 : i32 = i_1;
+    let x_163 : i32 = i_1;
+    data[x_162] = ~(clamp(~(x_163), 0, 1));
+
+    continuing {
+      let x_168 : i32 = i_1;
+      i_1 = (x_168 + 1);
+    }
+  }
+  let x_171 : i32 = x_6.x_GLF_uniform_int_values[6];
+  i_2 = x_171;
+  loop {
+    let x_176 : i32 = i_2;
+    let x_178 : i32 = x_6.x_GLF_uniform_int_values[7];
+    if ((x_176 < x_178)) {
+    } else {
+      break;
+    }
+    let x_181 : i32 = i_2;
+    let x_182 : i32 = i_2;
+    data[x_181] = ~(clamp(x_182, 0, 1));
+
+    continuing {
+      let x_186 : i32 = i_2;
+      i_2 = (x_186 + 1);
+    }
+  }
+  let x_189 : i32 = x_6.x_GLF_uniform_int_values[0];
+  i_3 = x_189;
+  loop {
+    let x_194 : i32 = i_3;
+    let x_196 : i32 = x_6.x_GLF_uniform_int_values[7];
+    if ((x_194 < x_196)) {
+    } else {
+      break;
+    }
+    let x_199 : i32 = i_3;
+    let x_201 : i32 = data[x_199];
+    let x_202 : i32 = i_3;
+    let x_204 : i32 = ref[x_202];
+    if ((x_201 != x_204)) {
+      let x_209 : i32 = x_6.x_GLF_uniform_int_values[0];
+      let x_210 : f32 = f32(x_209);
+      x_GLF_color = vec4<f32>(x_210, x_210, x_210, x_210);
+      return;
+    }
+
+    continuing {
+      let x_212 : i32 = i_3;
+      i_3 = (x_212 + 1);
+    }
+  }
+  let x_215 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_218 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_221 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_224 : i32 = x_6.x_GLF_uniform_int_values[1];
+  x_GLF_color = vec4<f32>(f32(x_215), f32(x_218), f32(x_221), f32(x_224));
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-selection-dag-negation-clamp-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-selection-dag-negation-clamp-loop/0-opt.wgsl
new file mode 100644
index 0000000..2dc09e0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-selection-dag-negation-clamp-loop/0-opt.wgsl
@@ -0,0 +1,161 @@
+type Arr = [[stride(16)]] array<i32, 16>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var ref : array<i32, 15>;
+  var i : i32;
+  var data : array<i32, 15>;
+  var i_1 : i32;
+  var i_2 : i32;
+  var i_3 : i32;
+  let x_46 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_48 : i32 = x_6.x_GLF_uniform_int_values[0];
+  ref[x_46] = x_48;
+  let x_51 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_53 : i32 = x_6.x_GLF_uniform_int_values[1];
+  ref[x_51] = x_53;
+  let x_56 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_58 : i32 = x_6.x_GLF_uniform_int_values[2];
+  ref[x_56] = x_58;
+  let x_61 : i32 = x_6.x_GLF_uniform_int_values[3];
+  let x_63 : i32 = x_6.x_GLF_uniform_int_values[3];
+  ref[x_61] = x_63;
+  let x_66 : i32 = x_6.x_GLF_uniform_int_values[4];
+  let x_68 : i32 = x_6.x_GLF_uniform_int_values[4];
+  ref[x_66] = x_68;
+  let x_71 : i32 = x_6.x_GLF_uniform_int_values[5];
+  let x_73 : i32 = x_6.x_GLF_uniform_int_values[1];
+  ref[x_71] = -(x_73);
+  let x_77 : i32 = x_6.x_GLF_uniform_int_values[8];
+  let x_79 : i32 = x_6.x_GLF_uniform_int_values[1];
+  ref[x_77] = -(x_79);
+  let x_83 : i32 = x_6.x_GLF_uniform_int_values[9];
+  let x_85 : i32 = x_6.x_GLF_uniform_int_values[1];
+  ref[x_83] = -(x_85);
+  let x_89 : i32 = x_6.x_GLF_uniform_int_values[10];
+  let x_91 : i32 = x_6.x_GLF_uniform_int_values[1];
+  ref[x_89] = -(x_91);
+  let x_95 : i32 = x_6.x_GLF_uniform_int_values[11];
+  let x_97 : i32 = x_6.x_GLF_uniform_int_values[1];
+  ref[x_95] = -(x_97);
+  let x_101 : i32 = x_6.x_GLF_uniform_int_values[6];
+  let x_103 : i32 = x_6.x_GLF_uniform_int_values[2];
+  ref[x_101] = -(x_103);
+  let x_107 : i32 = x_6.x_GLF_uniform_int_values[12];
+  let x_109 : i32 = x_6.x_GLF_uniform_int_values[2];
+  ref[x_107] = -(x_109);
+  let x_113 : i32 = x_6.x_GLF_uniform_int_values[13];
+  let x_115 : i32 = x_6.x_GLF_uniform_int_values[2];
+  ref[x_113] = -(x_115);
+  let x_119 : i32 = x_6.x_GLF_uniform_int_values[14];
+  let x_121 : i32 = x_6.x_GLF_uniform_int_values[2];
+  ref[x_119] = -(x_121);
+  let x_125 : i32 = x_6.x_GLF_uniform_int_values[15];
+  let x_127 : i32 = x_6.x_GLF_uniform_int_values[2];
+  ref[x_125] = -(x_127);
+  i = 0;
+  loop {
+    let x_134 : i32 = i;
+    let x_136 : i32 = x_6.x_GLF_uniform_int_values[5];
+    if ((x_134 < x_136)) {
+    } else {
+      break;
+    }
+    let x_139 : i32 = i;
+    let x_140 : i32 = i;
+    let x_142 : i32 = i;
+    let x_145 : i32 = x_6.x_GLF_uniform_int_values[1];
+    data[x_139] = ~(clamp(~(x_140), ~(x_142), x_145));
+
+    continuing {
+      let x_149 : i32 = i;
+      i = (x_149 + 1);
+    }
+  }
+  let x_152 : i32 = x_6.x_GLF_uniform_int_values[5];
+  i_1 = x_152;
+  loop {
+    let x_157 : i32 = i_1;
+    let x_159 : i32 = x_6.x_GLF_uniform_int_values[6];
+    if ((x_157 < x_159)) {
+    } else {
+      break;
+    }
+    let x_162 : i32 = i_1;
+    let x_163 : i32 = i_1;
+    data[x_162] = ~(clamp(~(x_163), 0, 1));
+
+    continuing {
+      let x_168 : i32 = i_1;
+      i_1 = (x_168 + 1);
+    }
+  }
+  let x_171 : i32 = x_6.x_GLF_uniform_int_values[6];
+  i_2 = x_171;
+  loop {
+    let x_176 : i32 = i_2;
+    let x_178 : i32 = x_6.x_GLF_uniform_int_values[7];
+    if ((x_176 < x_178)) {
+    } else {
+      break;
+    }
+    let x_181 : i32 = i_2;
+    let x_182 : i32 = i_2;
+    data[x_181] = ~(clamp(x_182, 0, 1));
+
+    continuing {
+      let x_186 : i32 = i_2;
+      i_2 = (x_186 + 1);
+    }
+  }
+  let x_189 : i32 = x_6.x_GLF_uniform_int_values[0];
+  i_3 = x_189;
+  loop {
+    let x_194 : i32 = i_3;
+    let x_196 : i32 = x_6.x_GLF_uniform_int_values[7];
+    if ((x_194 < x_196)) {
+    } else {
+      break;
+    }
+    let x_199 : i32 = i_3;
+    let x_201 : i32 = data[x_199];
+    let x_202 : i32 = i_3;
+    let x_204 : i32 = ref[x_202];
+    if ((x_201 != x_204)) {
+      let x_209 : i32 = x_6.x_GLF_uniform_int_values[0];
+      let x_210 : f32 = f32(x_209);
+      x_GLF_color = vec4<f32>(x_210, x_210, x_210, x_210);
+      return;
+    }
+
+    continuing {
+      let x_212 : i32 = i_3;
+      i_3 = (x_212 + 1);
+    }
+  }
+  let x_215 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_218 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_221 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_224 : i32 = x_6.x_GLF_uniform_int_values[1];
+  x_GLF_color = vec4<f32>(f32(x_215), f32(x_218), f32(x_221), f32(x_224));
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-selection-dag-negation-clamp-loop/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-selection-dag-negation-clamp-loop/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..8b5cb07
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-selection-dag-negation-clamp-loop/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,150 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[16];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int ref[15] = (int[15])0;
+  int i = 0;
+  int data[15] = (int[15])0;
+  int i_1 = 0;
+  int i_2 = 0;
+  int i_3 = 0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_46 = asint(x_6[scalar_offset / 4][scalar_offset % 4]);
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_48 = asint(x_6[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  ref[x_46] = x_48;
+  const int x_51 = asint(x_6[1].x);
+  const int x_53 = asint(x_6[1].x);
+  ref[x_51] = x_53;
+  const int x_56 = asint(x_6[2].x);
+  const int x_58 = asint(x_6[2].x);
+  ref[x_56] = x_58;
+  const int x_61 = asint(x_6[3].x);
+  const int x_63 = asint(x_6[3].x);
+  ref[x_61] = x_63;
+  const int x_66 = asint(x_6[4].x);
+  const int x_68 = asint(x_6[4].x);
+  ref[x_66] = x_68;
+  const int x_71 = asint(x_6[5].x);
+  const int x_73 = asint(x_6[1].x);
+  ref[x_71] = -(x_73);
+  const int x_77 = asint(x_6[8].x);
+  const int x_79 = asint(x_6[1].x);
+  ref[x_77] = -(x_79);
+  const int x_83 = asint(x_6[9].x);
+  const int x_85 = asint(x_6[1].x);
+  ref[x_83] = -(x_85);
+  const int x_89 = asint(x_6[10].x);
+  const int x_91 = asint(x_6[1].x);
+  ref[x_89] = -(x_91);
+  const int x_95 = asint(x_6[11].x);
+  const int x_97 = asint(x_6[1].x);
+  ref[x_95] = -(x_97);
+  const int x_101 = asint(x_6[6].x);
+  const int x_103 = asint(x_6[2].x);
+  ref[x_101] = -(x_103);
+  const int x_107 = asint(x_6[12].x);
+  const int x_109 = asint(x_6[2].x);
+  ref[x_107] = -(x_109);
+  const int x_113 = asint(x_6[13].x);
+  const int x_115 = asint(x_6[2].x);
+  ref[x_113] = -(x_115);
+  const int x_119 = asint(x_6[14].x);
+  const int x_121 = asint(x_6[2].x);
+  ref[x_119] = -(x_121);
+  const int x_125 = asint(x_6[15].x);
+  const int x_127 = asint(x_6[2].x);
+  ref[x_125] = -(x_127);
+  i = 0;
+  while (true) {
+    const int x_134 = i;
+    const int x_136 = asint(x_6[5].x);
+    if ((x_134 < x_136)) {
+    } else {
+      break;
+    }
+    const int x_139 = i;
+    const int x_140 = i;
+    const int x_142 = i;
+    const int x_145 = asint(x_6[1].x);
+    data[x_139] = ~(clamp(~(x_140), ~(x_142), x_145));
+    {
+      i = (i + 1);
+    }
+  }
+  const int x_152 = asint(x_6[5].x);
+  i_1 = x_152;
+  while (true) {
+    const int x_157 = i_1;
+    const int x_159 = asint(x_6[6].x);
+    if ((x_157 < x_159)) {
+    } else {
+      break;
+    }
+    data[i_1] = ~(clamp(~(i_1), 0, 1));
+    {
+      i_1 = (i_1 + 1);
+    }
+  }
+  const int x_171 = asint(x_6[6].x);
+  i_2 = x_171;
+  while (true) {
+    const int x_176 = i_2;
+    const int x_178 = asint(x_6[7].x);
+    if ((x_176 < x_178)) {
+    } else {
+      break;
+    }
+    data[i_2] = ~(clamp(i_2, 0, 1));
+    {
+      i_2 = (i_2 + 1);
+    }
+  }
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const int x_189 = asint(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  i_3 = x_189;
+  while (true) {
+    const int x_194 = i_3;
+    const int x_196 = asint(x_6[7].x);
+    if ((x_194 < x_196)) {
+    } else {
+      break;
+    }
+    const int x_201 = data[i_3];
+    const int x_204 = ref[i_3];
+    if ((x_201 != x_204)) {
+      const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+      const int x_209 = asint(x_6[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+      const float x_210 = float(x_209);
+      x_GLF_color = float4(x_210, x_210, x_210, x_210);
+      return;
+    }
+    {
+      i_3 = (i_3 + 1);
+    }
+  }
+  const int x_215 = asint(x_6[1].x);
+  const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+  const int x_218 = asint(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+  const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+  const int x_221 = asint(x_6[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+  const int x_224 = asint(x_6[1].x);
+  x_GLF_color = float4(float(x_215), float(x_218), float(x_221), float(x_224));
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-selection-dag-negation-clamp-loop/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-selection-dag-negation-clamp-loop/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..cceaae5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-selection-dag-negation-clamp-loop/0-opt.wgsl.expected.msl
@@ -0,0 +1,167 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[16];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_1 {
+  int arr[15];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  tint_array_wrapper_1 ref = {};
+  int i = 0;
+  tint_array_wrapper_1 data = {};
+  int i_1 = 0;
+  int i_2 = 0;
+  int i_3 = 0;
+  int const x_46 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_48 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  ref.arr[x_46] = x_48;
+  int const x_51 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_53 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  ref.arr[x_51] = x_53;
+  int const x_56 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  int const x_58 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  ref.arr[x_56] = x_58;
+  int const x_61 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  int const x_63 = x_6.x_GLF_uniform_int_values.arr[3].el;
+  ref.arr[x_61] = x_63;
+  int const x_66 = x_6.x_GLF_uniform_int_values.arr[4].el;
+  int const x_68 = x_6.x_GLF_uniform_int_values.arr[4].el;
+  ref.arr[x_66] = x_68;
+  int const x_71 = x_6.x_GLF_uniform_int_values.arr[5].el;
+  int const x_73 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  ref.arr[x_71] = -(x_73);
+  int const x_77 = x_6.x_GLF_uniform_int_values.arr[8].el;
+  int const x_79 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  ref.arr[x_77] = -(x_79);
+  int const x_83 = x_6.x_GLF_uniform_int_values.arr[9].el;
+  int const x_85 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  ref.arr[x_83] = -(x_85);
+  int const x_89 = x_6.x_GLF_uniform_int_values.arr[10].el;
+  int const x_91 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  ref.arr[x_89] = -(x_91);
+  int const x_95 = x_6.x_GLF_uniform_int_values.arr[11].el;
+  int const x_97 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  ref.arr[x_95] = -(x_97);
+  int const x_101 = x_6.x_GLF_uniform_int_values.arr[6].el;
+  int const x_103 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  ref.arr[x_101] = -(x_103);
+  int const x_107 = x_6.x_GLF_uniform_int_values.arr[12].el;
+  int const x_109 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  ref.arr[x_107] = -(x_109);
+  int const x_113 = x_6.x_GLF_uniform_int_values.arr[13].el;
+  int const x_115 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  ref.arr[x_113] = -(x_115);
+  int const x_119 = x_6.x_GLF_uniform_int_values.arr[14].el;
+  int const x_121 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  ref.arr[x_119] = -(x_121);
+  int const x_125 = x_6.x_GLF_uniform_int_values.arr[15].el;
+  int const x_127 = x_6.x_GLF_uniform_int_values.arr[2].el;
+  ref.arr[x_125] = -(x_127);
+  i = 0;
+  while (true) {
+    int const x_134 = i;
+    int const x_136 = x_6.x_GLF_uniform_int_values.arr[5].el;
+    if ((x_134 < x_136)) {
+    } else {
+      break;
+    }
+    int const x_139 = i;
+    int const x_140 = i;
+    int const x_142 = i;
+    int const x_145 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    data.arr[x_139] = ~(clamp(~(x_140), ~(x_142), x_145));
+    {
+      int const x_149 = i;
+      i = (x_149 + 1);
+    }
+  }
+  int const x_152 = x_6.x_GLF_uniform_int_values.arr[5].el;
+  i_1 = x_152;
+  while (true) {
+    int const x_157 = i_1;
+    int const x_159 = x_6.x_GLF_uniform_int_values.arr[6].el;
+    if ((x_157 < x_159)) {
+    } else {
+      break;
+    }
+    int const x_162 = i_1;
+    int const x_163 = i_1;
+    data.arr[x_162] = ~(clamp(~(x_163), 0, 1));
+    {
+      int const x_168 = i_1;
+      i_1 = (x_168 + 1);
+    }
+  }
+  int const x_171 = x_6.x_GLF_uniform_int_values.arr[6].el;
+  i_2 = x_171;
+  while (true) {
+    int const x_176 = i_2;
+    int const x_178 = x_6.x_GLF_uniform_int_values.arr[7].el;
+    if ((x_176 < x_178)) {
+    } else {
+      break;
+    }
+    int const x_181 = i_2;
+    int const x_182 = i_2;
+    data.arr[x_181] = ~(clamp(x_182, 0, 1));
+    {
+      int const x_186 = i_2;
+      i_2 = (x_186 + 1);
+    }
+  }
+  int const x_189 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  i_3 = x_189;
+  while (true) {
+    int const x_194 = i_3;
+    int const x_196 = x_6.x_GLF_uniform_int_values.arr[7].el;
+    if ((x_194 < x_196)) {
+    } else {
+      break;
+    }
+    int const x_199 = i_3;
+    int const x_201 = data.arr[x_199];
+    int const x_202 = i_3;
+    int const x_204 = ref.arr[x_202];
+    if ((x_201 != x_204)) {
+      int const x_209 = x_6.x_GLF_uniform_int_values.arr[0].el;
+      float const x_210 = float(x_209);
+      *(tint_symbol_4) = float4(x_210, x_210, x_210, x_210);
+      return;
+    }
+    {
+      int const x_212 = i_3;
+      i_3 = (x_212 + 1);
+    }
+  }
+  int const x_215 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  int const x_218 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_221 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  int const x_224 = x_6.x_GLF_uniform_int_values.arr[1].el;
+  *(tint_symbol_4) = float4(float(x_215), float(x_218), float(x_221), float(x_224));
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-selection-dag-negation-clamp-loop/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-selection-dag-negation-clamp-loop/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..0879b72
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-selection-dag-negation-clamp-loop/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,361 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 253
+; Schema: 0
+               OpCapability Shader
+        %153 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %ref "ref"
+               OpName %i "i"
+               OpName %data "data"
+               OpName %i_1 "i_1"
+               OpName %i_2 "i_2"
+               OpName %i_3 "i_3"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_16 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_15 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_16 = OpConstant %uint 16
+%_arr_int_uint_16 = OpTypeArray %int %uint_16
+       %buf0 = OpTypeStruct %_arr_int_uint_16
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+    %uint_15 = OpConstant %uint 15
+%_arr_int_uint_15 = OpTypeArray %int %uint_15
+%_ptr_Function__arr_int_uint_15 = OpTypePointer Function %_arr_int_uint_15
+         %23 = OpConstantNull %_arr_int_uint_15
+%_ptr_Function_int = OpTypePointer Function %int
+         %26 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_8 = OpConstant %int 8
+      %int_9 = OpConstant %int 9
+     %int_10 = OpConstant %int 10
+     %int_11 = OpConstant %int 11
+      %int_6 = OpConstant %int 6
+     %int_12 = OpConstant %int 12
+     %int_13 = OpConstant %int 13
+     %int_14 = OpConstant %int 14
+     %int_15 = OpConstant %int 15
+       %bool = OpTypeBool
+      %int_7 = OpConstant %int 7
+   %main_out = OpTypeStruct %v4float
+        %241 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+        %ref = OpVariable %_ptr_Function__arr_int_uint_15 Function %23
+          %i = OpVariable %_ptr_Function_int Function %26
+       %data = OpVariable %_ptr_Function__arr_int_uint_15 Function %23
+        %i_1 = OpVariable %_ptr_Function_int Function %26
+        %i_2 = OpVariable %_ptr_Function_int Function %26
+        %i_3 = OpVariable %_ptr_Function_int Function %26
+         %34 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %35 = OpLoad %int %34
+         %36 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %37 = OpLoad %int %36
+         %38 = OpAccessChain %_ptr_Function_int %ref %35
+               OpStore %38 %37
+         %40 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %41 = OpLoad %int %40
+         %42 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %43 = OpLoad %int %42
+         %44 = OpAccessChain %_ptr_Function_int %ref %41
+               OpStore %44 %43
+         %46 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %47 = OpLoad %int %46
+         %48 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+         %49 = OpLoad %int %48
+         %50 = OpAccessChain %_ptr_Function_int %ref %47
+               OpStore %50 %49
+         %52 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %53 = OpLoad %int %52
+         %54 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_3
+         %55 = OpLoad %int %54
+         %56 = OpAccessChain %_ptr_Function_int %ref %53
+               OpStore %56 %55
+         %58 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+         %59 = OpLoad %int %58
+         %60 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_4
+         %61 = OpLoad %int %60
+         %62 = OpAccessChain %_ptr_Function_int %ref %59
+               OpStore %62 %61
+         %64 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_5
+         %65 = OpLoad %int %64
+         %66 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %67 = OpLoad %int %66
+         %68 = OpAccessChain %_ptr_Function_int %ref %65
+         %69 = OpSNegate %int %67
+               OpStore %68 %69
+         %71 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_8
+         %72 = OpLoad %int %71
+         %73 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %74 = OpLoad %int %73
+         %75 = OpAccessChain %_ptr_Function_int %ref %72
+         %76 = OpSNegate %int %74
+               OpStore %75 %76
+         %78 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_9
+         %79 = OpLoad %int %78
+         %80 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %81 = OpLoad %int %80
+         %82 = OpAccessChain %_ptr_Function_int %ref %79
+         %83 = OpSNegate %int %81
+               OpStore %82 %83
+         %85 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_10
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %88 = OpLoad %int %87
+         %89 = OpAccessChain %_ptr_Function_int %ref %86
+         %90 = OpSNegate %int %88
+               OpStore %89 %90
+         %92 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_11
+         %93 = OpLoad %int %92
+         %94 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %95 = OpLoad %int %94
+         %96 = OpAccessChain %_ptr_Function_int %ref %93
+         %97 = OpSNegate %int %95
+               OpStore %96 %97
+         %99 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_6
+        %100 = OpLoad %int %99
+        %101 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %102 = OpLoad %int %101
+        %103 = OpAccessChain %_ptr_Function_int %ref %100
+        %104 = OpSNegate %int %102
+               OpStore %103 %104
+        %106 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_12
+        %107 = OpLoad %int %106
+        %108 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %109 = OpLoad %int %108
+        %110 = OpAccessChain %_ptr_Function_int %ref %107
+        %111 = OpSNegate %int %109
+               OpStore %110 %111
+        %113 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_13
+        %114 = OpLoad %int %113
+        %115 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %116 = OpLoad %int %115
+        %117 = OpAccessChain %_ptr_Function_int %ref %114
+        %118 = OpSNegate %int %116
+               OpStore %117 %118
+        %120 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_14
+        %121 = OpLoad %int %120
+        %122 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %123 = OpLoad %int %122
+        %124 = OpAccessChain %_ptr_Function_int %ref %121
+        %125 = OpSNegate %int %123
+               OpStore %124 %125
+        %127 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_15
+        %128 = OpLoad %int %127
+        %129 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_2
+        %130 = OpLoad %int %129
+        %131 = OpAccessChain %_ptr_Function_int %ref %128
+        %132 = OpSNegate %int %130
+               OpStore %131 %132
+               OpStore %i %int_0
+               OpBranch %133
+        %133 = OpLabel
+               OpLoopMerge %134 %135 None
+               OpBranch %136
+        %136 = OpLabel
+        %137 = OpLoad %int %i
+        %138 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_5
+        %139 = OpLoad %int %138
+        %140 = OpSLessThan %bool %137 %139
+               OpSelectionMerge %142 None
+               OpBranchConditional %140 %143 %144
+        %143 = OpLabel
+               OpBranch %142
+        %144 = OpLabel
+               OpBranch %134
+        %142 = OpLabel
+        %145 = OpLoad %int %i
+        %146 = OpLoad %int %i
+        %147 = OpLoad %int %i
+        %148 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %149 = OpLoad %int %148
+        %150 = OpAccessChain %_ptr_Function_int %data %145
+        %154 = OpNot %int %146
+        %155 = OpNot %int %147
+        %152 = OpExtInst %int %153 SClamp %154 %155 %149
+        %151 = OpNot %int %152
+               OpStore %150 %151
+               OpBranch %135
+        %135 = OpLabel
+        %156 = OpLoad %int %i
+        %157 = OpIAdd %int %156 %int_1
+               OpStore %i %157
+               OpBranch %133
+        %134 = OpLabel
+        %158 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_5
+        %159 = OpLoad %int %158
+               OpStore %i_1 %159
+               OpBranch %160
+        %160 = OpLabel
+               OpLoopMerge %161 %162 None
+               OpBranch %163
+        %163 = OpLabel
+        %164 = OpLoad %int %i_1
+        %165 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_6
+        %166 = OpLoad %int %165
+        %167 = OpSLessThan %bool %164 %166
+               OpSelectionMerge %168 None
+               OpBranchConditional %167 %169 %170
+        %169 = OpLabel
+               OpBranch %168
+        %170 = OpLabel
+               OpBranch %161
+        %168 = OpLabel
+        %171 = OpLoad %int %i_1
+        %172 = OpLoad %int %i_1
+        %173 = OpAccessChain %_ptr_Function_int %data %171
+        %176 = OpNot %int %172
+        %175 = OpExtInst %int %153 SClamp %176 %int_0 %int_1
+        %174 = OpNot %int %175
+               OpStore %173 %174
+               OpBranch %162
+        %162 = OpLabel
+        %177 = OpLoad %int %i_1
+        %178 = OpIAdd %int %177 %int_1
+               OpStore %i_1 %178
+               OpBranch %160
+        %161 = OpLabel
+        %179 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_6
+        %180 = OpLoad %int %179
+               OpStore %i_2 %180
+               OpBranch %181
+        %181 = OpLabel
+               OpLoopMerge %182 %183 None
+               OpBranch %184
+        %184 = OpLabel
+        %185 = OpLoad %int %i_2
+        %187 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_7
+        %188 = OpLoad %int %187
+        %189 = OpSLessThan %bool %185 %188
+               OpSelectionMerge %190 None
+               OpBranchConditional %189 %191 %192
+        %191 = OpLabel
+               OpBranch %190
+        %192 = OpLabel
+               OpBranch %182
+        %190 = OpLabel
+        %193 = OpLoad %int %i_2
+        %194 = OpLoad %int %i_2
+        %195 = OpAccessChain %_ptr_Function_int %data %193
+        %197 = OpExtInst %int %153 SClamp %194 %int_0 %int_1
+        %196 = OpNot %int %197
+               OpStore %195 %196
+               OpBranch %183
+        %183 = OpLabel
+        %198 = OpLoad %int %i_2
+        %199 = OpIAdd %int %198 %int_1
+               OpStore %i_2 %199
+               OpBranch %181
+        %182 = OpLabel
+        %200 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %201 = OpLoad %int %200
+               OpStore %i_3 %201
+               OpBranch %202
+        %202 = OpLabel
+               OpLoopMerge %203 %204 None
+               OpBranch %205
+        %205 = OpLabel
+        %206 = OpLoad %int %i_3
+        %207 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_7
+        %208 = OpLoad %int %207
+        %209 = OpSLessThan %bool %206 %208
+               OpSelectionMerge %210 None
+               OpBranchConditional %209 %211 %212
+        %211 = OpLabel
+               OpBranch %210
+        %212 = OpLabel
+               OpBranch %203
+        %210 = OpLabel
+        %213 = OpLoad %int %i_3
+        %214 = OpAccessChain %_ptr_Function_int %data %213
+        %215 = OpLoad %int %214
+        %216 = OpLoad %int %i_3
+        %217 = OpAccessChain %_ptr_Function_int %ref %216
+        %218 = OpLoad %int %217
+        %219 = OpINotEqual %bool %215 %218
+               OpSelectionMerge %220 None
+               OpBranchConditional %219 %221 %220
+        %221 = OpLabel
+        %222 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %223 = OpLoad %int %222
+        %224 = OpConvertSToF %float %223
+        %225 = OpCompositeConstruct %v4float %224 %224 %224 %224
+               OpStore %x_GLF_color %225
+               OpReturn
+        %220 = OpLabel
+               OpBranch %204
+        %204 = OpLabel
+        %226 = OpLoad %int %i_3
+        %227 = OpIAdd %int %226 %int_1
+               OpStore %i_3 %227
+               OpBranch %202
+        %203 = OpLabel
+        %228 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %229 = OpLoad %int %228
+        %230 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %231 = OpLoad %int %230
+        %232 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+        %233 = OpLoad %int %232
+        %234 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+        %235 = OpLoad %int %234
+        %236 = OpConvertSToF %float %229
+        %237 = OpConvertSToF %float %231
+        %238 = OpConvertSToF %float %233
+        %239 = OpConvertSToF %float %235
+        %240 = OpCompositeConstruct %v4float %236 %237 %238 %239
+               OpStore %x_GLF_color %240
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %241
+%tint_symbol = OpFunctionParameter %main_out
+        %245 = OpLabel
+        %246 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %246
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %248 = OpLabel
+        %249 = OpFunctionCall %void %main_1
+        %251 = OpLoad %v4float %x_GLF_color
+        %252 = OpCompositeConstruct %main_out %251
+        %250 = OpFunctionCall %void %tint_symbol_2 %252
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-selection-dag-negation-clamp-loop/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-selection-dag-negation-clamp-loop/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..2dc09e0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-selection-dag-negation-clamp-loop/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,161 @@
+type Arr = [[stride(16)]] array<i32, 16>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var ref : array<i32, 15>;
+  var i : i32;
+  var data : array<i32, 15>;
+  var i_1 : i32;
+  var i_2 : i32;
+  var i_3 : i32;
+  let x_46 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_48 : i32 = x_6.x_GLF_uniform_int_values[0];
+  ref[x_46] = x_48;
+  let x_51 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_53 : i32 = x_6.x_GLF_uniform_int_values[1];
+  ref[x_51] = x_53;
+  let x_56 : i32 = x_6.x_GLF_uniform_int_values[2];
+  let x_58 : i32 = x_6.x_GLF_uniform_int_values[2];
+  ref[x_56] = x_58;
+  let x_61 : i32 = x_6.x_GLF_uniform_int_values[3];
+  let x_63 : i32 = x_6.x_GLF_uniform_int_values[3];
+  ref[x_61] = x_63;
+  let x_66 : i32 = x_6.x_GLF_uniform_int_values[4];
+  let x_68 : i32 = x_6.x_GLF_uniform_int_values[4];
+  ref[x_66] = x_68;
+  let x_71 : i32 = x_6.x_GLF_uniform_int_values[5];
+  let x_73 : i32 = x_6.x_GLF_uniform_int_values[1];
+  ref[x_71] = -(x_73);
+  let x_77 : i32 = x_6.x_GLF_uniform_int_values[8];
+  let x_79 : i32 = x_6.x_GLF_uniform_int_values[1];
+  ref[x_77] = -(x_79);
+  let x_83 : i32 = x_6.x_GLF_uniform_int_values[9];
+  let x_85 : i32 = x_6.x_GLF_uniform_int_values[1];
+  ref[x_83] = -(x_85);
+  let x_89 : i32 = x_6.x_GLF_uniform_int_values[10];
+  let x_91 : i32 = x_6.x_GLF_uniform_int_values[1];
+  ref[x_89] = -(x_91);
+  let x_95 : i32 = x_6.x_GLF_uniform_int_values[11];
+  let x_97 : i32 = x_6.x_GLF_uniform_int_values[1];
+  ref[x_95] = -(x_97);
+  let x_101 : i32 = x_6.x_GLF_uniform_int_values[6];
+  let x_103 : i32 = x_6.x_GLF_uniform_int_values[2];
+  ref[x_101] = -(x_103);
+  let x_107 : i32 = x_6.x_GLF_uniform_int_values[12];
+  let x_109 : i32 = x_6.x_GLF_uniform_int_values[2];
+  ref[x_107] = -(x_109);
+  let x_113 : i32 = x_6.x_GLF_uniform_int_values[13];
+  let x_115 : i32 = x_6.x_GLF_uniform_int_values[2];
+  ref[x_113] = -(x_115);
+  let x_119 : i32 = x_6.x_GLF_uniform_int_values[14];
+  let x_121 : i32 = x_6.x_GLF_uniform_int_values[2];
+  ref[x_119] = -(x_121);
+  let x_125 : i32 = x_6.x_GLF_uniform_int_values[15];
+  let x_127 : i32 = x_6.x_GLF_uniform_int_values[2];
+  ref[x_125] = -(x_127);
+  i = 0;
+  loop {
+    let x_134 : i32 = i;
+    let x_136 : i32 = x_6.x_GLF_uniform_int_values[5];
+    if ((x_134 < x_136)) {
+    } else {
+      break;
+    }
+    let x_139 : i32 = i;
+    let x_140 : i32 = i;
+    let x_142 : i32 = i;
+    let x_145 : i32 = x_6.x_GLF_uniform_int_values[1];
+    data[x_139] = ~(clamp(~(x_140), ~(x_142), x_145));
+
+    continuing {
+      let x_149 : i32 = i;
+      i = (x_149 + 1);
+    }
+  }
+  let x_152 : i32 = x_6.x_GLF_uniform_int_values[5];
+  i_1 = x_152;
+  loop {
+    let x_157 : i32 = i_1;
+    let x_159 : i32 = x_6.x_GLF_uniform_int_values[6];
+    if ((x_157 < x_159)) {
+    } else {
+      break;
+    }
+    let x_162 : i32 = i_1;
+    let x_163 : i32 = i_1;
+    data[x_162] = ~(clamp(~(x_163), 0, 1));
+
+    continuing {
+      let x_168 : i32 = i_1;
+      i_1 = (x_168 + 1);
+    }
+  }
+  let x_171 : i32 = x_6.x_GLF_uniform_int_values[6];
+  i_2 = x_171;
+  loop {
+    let x_176 : i32 = i_2;
+    let x_178 : i32 = x_6.x_GLF_uniform_int_values[7];
+    if ((x_176 < x_178)) {
+    } else {
+      break;
+    }
+    let x_181 : i32 = i_2;
+    let x_182 : i32 = i_2;
+    data[x_181] = ~(clamp(x_182, 0, 1));
+
+    continuing {
+      let x_186 : i32 = i_2;
+      i_2 = (x_186 + 1);
+    }
+  }
+  let x_189 : i32 = x_6.x_GLF_uniform_int_values[0];
+  i_3 = x_189;
+  loop {
+    let x_194 : i32 = i_3;
+    let x_196 : i32 = x_6.x_GLF_uniform_int_values[7];
+    if ((x_194 < x_196)) {
+    } else {
+      break;
+    }
+    let x_199 : i32 = i_3;
+    let x_201 : i32 = data[x_199];
+    let x_202 : i32 = i_3;
+    let x_204 : i32 = ref[x_202];
+    if ((x_201 != x_204)) {
+      let x_209 : i32 = x_6.x_GLF_uniform_int_values[0];
+      let x_210 : f32 = f32(x_209);
+      x_GLF_color = vec4<f32>(x_210, x_210, x_210, x_210);
+      return;
+    }
+
+    continuing {
+      let x_212 : i32 = i_3;
+      i_3 = (x_212 + 1);
+    }
+  }
+  let x_215 : i32 = x_6.x_GLF_uniform_int_values[1];
+  let x_218 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_221 : i32 = x_6.x_GLF_uniform_int_values[0];
+  let x_224 : i32 = x_6.x_GLF_uniform_int_values[1];
+  x_GLF_color = vec4<f32>(f32(x_215), f32(x_218), f32(x_221), f32(x_224));
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-uniform-incident/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-uniform-incident/0-opt.spvasm
new file mode 100644
index 0000000..91ff6bc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-uniform-incident/0-opt.spvasm
@@ -0,0 +1,86 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %N "N"
+               OpName %I "I"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "quarter"
+               OpName %_ ""
+               OpName %Nref "Nref"
+               OpName %v "v"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+    %float_4 = OpConstant %float 4
+         %19 = OpConstantComposite %v4float %float_1 %float_2 %float_3 %float_4
+%float_87_5899963 = OpConstant %float 87.5899963
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%float_92_5100021 = OpConstant %float 92.5100021
+%float_17_0499992 = OpConstant %float 17.0499992
+%float_n6_0999999 = OpConstant %float -6.0999999
+%float_4329_37061 = OpConstant %float 4329.37061
+%float_2_70000005 = OpConstant %float 2.70000005
+         %30 = OpConstantComposite %v4float %float_17_0499992 %float_n6_0999999 %float_4329_37061 %float_2_70000005
+   %float_n1 = OpConstant %float -1
+   %float_n2 = OpConstant %float -2
+   %float_n3 = OpConstant %float -3
+   %float_n4 = OpConstant %float -4
+         %35 = OpConstantComposite %v4float %float_n1 %float_n2 %float_n3 %float_n4
+       %bool = OpTypeBool
+     %v4bool = OpTypeVector %bool 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %40 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %41 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %11
+         %42 = OpLabel
+          %N = OpVariable %_ptr_Function_v4float Function
+          %I = OpVariable %_ptr_Function_v4float Function
+       %Nref = OpVariable %_ptr_Function_v4float Function
+          %v = OpVariable %_ptr_Function_v4float Function
+               OpStore %N %19
+         %43 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %44 = OpLoad %float %43
+         %45 = OpCompositeConstruct %v4float %float_4 %float_87_5899963 %44 %float_92_5100021
+               OpStore %I %45
+               OpStore %Nref %30
+         %46 = OpLoad %v4float %N
+         %47 = OpLoad %v4float %I
+         %48 = OpLoad %v4float %Nref
+         %49 = OpExtInst %v4float %1 FaceForward %46 %47 %48
+               OpStore %v %49
+         %50 = OpLoad %v4float %v
+         %51 = OpFOrdEqual %v4bool %50 %35
+         %52 = OpAll %bool %51
+               OpSelectionMerge %53 None
+               OpBranchConditional %52 %54 %55
+         %54 = OpLabel
+               OpStore %_GLF_color %40
+               OpBranch %53
+         %55 = OpLabel
+               OpStore %_GLF_color %41
+               OpBranch %53
+         %53 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-uniform-incident/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-uniform-incident/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..11fb504
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-uniform-incident/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,36 @@
+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() {
+  float4 N = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 I = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 Nref = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 v = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  N = float4(1.0f, 2.0f, 3.0f, 4.0f);
+  const float x_44 = asfloat(x_7[0].x);
+  I = float4(4.0f, 87.589996338f, x_44, 92.510002136f);
+  Nref = float4(17.049999237f, -6.099999905f, 4329.370605469f, 2.700000048f);
+  v = faceforward(N, I, Nref);
+  if (all((v == float4(-1.0f, -2.0f, -3.0f, -4.0f)))) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-uniform-incident/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-uniform-incident/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..0c883ed
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-uniform-incident/0-opt.spvasm.expected.msl
@@ -0,0 +1,43 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float quarter;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_4) {
+  float4 N = 0.0f;
+  float4 I = 0.0f;
+  float4 Nref = 0.0f;
+  float4 v = 0.0f;
+  N = float4(1.0f, 2.0f, 3.0f, 4.0f);
+  float const x_44 = x_7.quarter;
+  I = float4(4.0f, 87.589996338f, x_44, 92.510002136f);
+  Nref = float4(17.049999237f, -6.099999905f, 4329.370605469f, 2.700000048f);
+  float4 const x_46 = N;
+  float4 const x_47 = I;
+  float4 const x_48 = Nref;
+  v = faceforward(x_46, x_47, x_48);
+  float4 const x_50 = v;
+  if (all((x_50 == float4(-1.0f, -2.0f, -3.0f, -4.0f)))) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-uniform-incident/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-uniform-incident/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..bba0bd0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-uniform-incident/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,118 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 71
+; Schema: 0
+               OpCapability Shader
+         %42 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "quarter"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %N "N"
+               OpName %I "I"
+               OpName %Nref "Nref"
+               OpName %v "v"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+    %float_4 = OpConstant %float 4
+         %24 = OpConstantComposite %v4float %float_1 %float_2 %float_3 %float_4
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%float_87_5899963 = OpConstant %float 87.5899963
+%float_92_5100021 = OpConstant %float 92.5100021
+%float_17_0499992 = OpConstant %float 17.0499992
+%float_n6_0999999 = OpConstant %float -6.0999999
+%float_4329_37061 = OpConstant %float 4329.37061
+%float_2_70000005 = OpConstant %float 2.70000005
+         %37 = OpConstantComposite %v4float %float_17_0499992 %float_n6_0999999 %float_4329_37061 %float_2_70000005
+       %bool = OpTypeBool
+   %float_n1 = OpConstant %float -1
+   %float_n2 = OpConstant %float -2
+   %float_n3 = OpConstant %float -3
+   %float_n4 = OpConstant %float -4
+         %50 = OpConstantComposite %v4float %float_n1 %float_n2 %float_n3 %float_n4
+     %v4bool = OpTypeVector %bool 4
+    %float_0 = OpConstant %float 0
+         %57 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %58 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %59 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+          %N = OpVariable %_ptr_Function_v4float Function %8
+          %I = OpVariable %_ptr_Function_v4float Function %8
+       %Nref = OpVariable %_ptr_Function_v4float Function %8
+          %v = OpVariable %_ptr_Function_v4float Function %8
+               OpStore %N %24
+         %28 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0
+         %29 = OpLoad %float %28
+         %32 = OpCompositeConstruct %v4float %float_4 %float_87_5899963 %29 %float_92_5100021
+               OpStore %I %32
+               OpStore %Nref %37
+         %38 = OpLoad %v4float %N
+         %39 = OpLoad %v4float %I
+         %40 = OpLoad %v4float %Nref
+         %41 = OpExtInst %v4float %42 FaceForward %38 %39 %40
+               OpStore %v %41
+         %43 = OpLoad %v4float %v
+         %51 = OpFOrdEqual %v4bool %43 %50
+         %44 = OpAll %bool %51
+               OpSelectionMerge %53 None
+               OpBranchConditional %44 %54 %55
+         %54 = OpLabel
+               OpStore %x_GLF_color %57
+               OpBranch %53
+         %55 = OpLabel
+               OpStore %x_GLF_color %58
+               OpBranch %53
+         %53 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %59
+%tint_symbol = OpFunctionParameter %main_out
+         %63 = OpLabel
+         %64 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %64
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %66 = OpLabel
+         %67 = OpFunctionCall %void %main_1
+         %69 = OpLoad %v4float %x_GLF_color
+         %70 = OpCompositeConstruct %main_out %69
+         %68 = OpFunctionCall %void %tint_symbol_2 %70
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-uniform-incident/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-uniform-incident/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..40281ef
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-uniform-incident/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,41 @@
+[[block]]
+struct buf0 {
+  quarter : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var N : vec4<f32>;
+  var I : vec4<f32>;
+  var Nref : vec4<f32>;
+  var v : vec4<f32>;
+  N = vec4<f32>(1.0, 2.0, 3.0, 4.0);
+  let x_44 : f32 = x_7.quarter;
+  I = vec4<f32>(4.0, 87.589996338, x_44, 92.510002136);
+  Nref = vec4<f32>(17.049999237, -6.099999905, 4329.370605469, 2.700000048);
+  let x_46 : vec4<f32> = N;
+  let x_47 : vec4<f32> = I;
+  let x_48 : vec4<f32> = Nref;
+  v = faceForward(x_46, x_47, x_48);
+  let x_50 : vec4<f32> = v;
+  if (all((x_50 == vec4<f32>(-1.0, -2.0, -3.0, -4.0)))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-uniform-incident/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-uniform-incident/0-opt.wgsl
new file mode 100644
index 0000000..40281ef
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-uniform-incident/0-opt.wgsl
@@ -0,0 +1,41 @@
+[[block]]
+struct buf0 {
+  quarter : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var N : vec4<f32>;
+  var I : vec4<f32>;
+  var Nref : vec4<f32>;
+  var v : vec4<f32>;
+  N = vec4<f32>(1.0, 2.0, 3.0, 4.0);
+  let x_44 : f32 = x_7.quarter;
+  I = vec4<f32>(4.0, 87.589996338, x_44, 92.510002136);
+  Nref = vec4<f32>(17.049999237, -6.099999905, 4329.370605469, 2.700000048);
+  let x_46 : vec4<f32> = N;
+  let x_47 : vec4<f32> = I;
+  let x_48 : vec4<f32> = Nref;
+  v = faceForward(x_46, x_47, x_48);
+  let x_50 : vec4<f32> = v;
+  if (all((x_50 == vec4<f32>(-1.0, -2.0, -3.0, -4.0)))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-uniform-incident/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-uniform-incident/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..11fb504
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-uniform-incident/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,36 @@
+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() {
+  float4 N = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 I = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 Nref = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 v = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  N = float4(1.0f, 2.0f, 3.0f, 4.0f);
+  const float x_44 = asfloat(x_7[0].x);
+  I = float4(4.0f, 87.589996338f, x_44, 92.510002136f);
+  Nref = float4(17.049999237f, -6.099999905f, 4329.370605469f, 2.700000048f);
+  v = faceforward(N, I, Nref);
+  if (all((v == float4(-1.0f, -2.0f, -3.0f, -4.0f)))) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-uniform-incident/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-uniform-incident/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..0c883ed
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-uniform-incident/0-opt.wgsl.expected.msl
@@ -0,0 +1,43 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float quarter;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_4) {
+  float4 N = 0.0f;
+  float4 I = 0.0f;
+  float4 Nref = 0.0f;
+  float4 v = 0.0f;
+  N = float4(1.0f, 2.0f, 3.0f, 4.0f);
+  float const x_44 = x_7.quarter;
+  I = float4(4.0f, 87.589996338f, x_44, 92.510002136f);
+  Nref = float4(17.049999237f, -6.099999905f, 4329.370605469f, 2.700000048f);
+  float4 const x_46 = N;
+  float4 const x_47 = I;
+  float4 const x_48 = Nref;
+  v = faceforward(x_46, x_47, x_48);
+  float4 const x_50 = v;
+  if (all((x_50 == float4(-1.0f, -2.0f, -3.0f, -4.0f)))) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-uniform-incident/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-uniform-incident/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..bba0bd0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-uniform-incident/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,118 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 71
+; Schema: 0
+               OpCapability Shader
+         %42 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "quarter"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %N "N"
+               OpName %I "I"
+               OpName %Nref "Nref"
+               OpName %v "v"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+    %float_4 = OpConstant %float 4
+         %24 = OpConstantComposite %v4float %float_1 %float_2 %float_3 %float_4
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%float_87_5899963 = OpConstant %float 87.5899963
+%float_92_5100021 = OpConstant %float 92.5100021
+%float_17_0499992 = OpConstant %float 17.0499992
+%float_n6_0999999 = OpConstant %float -6.0999999
+%float_4329_37061 = OpConstant %float 4329.37061
+%float_2_70000005 = OpConstant %float 2.70000005
+         %37 = OpConstantComposite %v4float %float_17_0499992 %float_n6_0999999 %float_4329_37061 %float_2_70000005
+       %bool = OpTypeBool
+   %float_n1 = OpConstant %float -1
+   %float_n2 = OpConstant %float -2
+   %float_n3 = OpConstant %float -3
+   %float_n4 = OpConstant %float -4
+         %50 = OpConstantComposite %v4float %float_n1 %float_n2 %float_n3 %float_n4
+     %v4bool = OpTypeVector %bool 4
+    %float_0 = OpConstant %float 0
+         %57 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %58 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %59 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+          %N = OpVariable %_ptr_Function_v4float Function %8
+          %I = OpVariable %_ptr_Function_v4float Function %8
+       %Nref = OpVariable %_ptr_Function_v4float Function %8
+          %v = OpVariable %_ptr_Function_v4float Function %8
+               OpStore %N %24
+         %28 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0
+         %29 = OpLoad %float %28
+         %32 = OpCompositeConstruct %v4float %float_4 %float_87_5899963 %29 %float_92_5100021
+               OpStore %I %32
+               OpStore %Nref %37
+         %38 = OpLoad %v4float %N
+         %39 = OpLoad %v4float %I
+         %40 = OpLoad %v4float %Nref
+         %41 = OpExtInst %v4float %42 FaceForward %38 %39 %40
+               OpStore %v %41
+         %43 = OpLoad %v4float %v
+         %51 = OpFOrdEqual %v4bool %43 %50
+         %44 = OpAll %bool %51
+               OpSelectionMerge %53 None
+               OpBranchConditional %44 %54 %55
+         %54 = OpLabel
+               OpStore %x_GLF_color %57
+               OpBranch %53
+         %55 = OpLabel
+               OpStore %x_GLF_color %58
+               OpBranch %53
+         %53 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %59
+%tint_symbol = OpFunctionParameter %main_out
+         %63 = OpLabel
+         %64 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %64
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %66 = OpLabel
+         %67 = OpFunctionCall %void %main_1
+         %69 = OpLoad %v4float %x_GLF_color
+         %70 = OpCompositeConstruct %main_out %69
+         %68 = OpFunctionCall %void %tint_symbol_2 %70
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-uniform-incident/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-uniform-incident/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..40281ef
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-value-tracking-uniform-incident/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,41 @@
+[[block]]
+struct buf0 {
+  quarter : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var N : vec4<f32>;
+  var I : vec4<f32>;
+  var Nref : vec4<f32>;
+  var v : vec4<f32>;
+  N = vec4<f32>(1.0, 2.0, 3.0, 4.0);
+  let x_44 : f32 = x_7.quarter;
+  I = vec4<f32>(4.0, 87.589996338, x_44, 92.510002136);
+  Nref = vec4<f32>(17.049999237, -6.099999905, 4329.370605469, 2.700000048);
+  let x_46 : vec4<f32> = N;
+  let x_47 : vec4<f32> = I;
+  let x_48 : vec4<f32> = Nref;
+  v = faceForward(x_46, x_47, x_48);
+  let x_50 : vec4<f32> = v;
+  if (all((x_50 == vec4<f32>(-1.0, -2.0, -3.0, -4.0)))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-inc-unused-comp/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-inc-unused-comp/0-opt.spvasm
new file mode 100644
index 0000000..d1e03b7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-inc-unused-comp/0-opt.spvasm
@@ -0,0 +1,86 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %_ ""
+               OpName %b "b"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+    %float_1 = OpConstant %float 1
+         %14 = OpConstantComposite %v2float %float_1 %float_1
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+         %27 = OpConstantComposite %v2float %float_2 %float_3
+    %float_4 = OpConstant %float 4
+         %29 = OpConstantComposite %v2float %float_3 %float_4
+     %v2bool = OpTypeVector %bool 2
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %34 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %35 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %9
+         %36 = OpLabel
+          %a = OpVariable %_ptr_Function_v2float Function
+          %b = OpVariable %_ptr_Function_v2float Function
+               OpStore %a %14
+         %37 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %38 = OpLoad %int %37
+         %39 = OpIEqual %bool %38 %int_1
+               OpSelectionMerge %40 None
+               OpBranchConditional %39 %41 %40
+         %41 = OpLabel
+         %42 = OpAccessChain %_ptr_Function_float %a %uint_0
+         %43 = OpLoad %float %42
+         %44 = OpFAdd %float %43 %float_1
+         %45 = OpAccessChain %_ptr_Function_float %a %uint_0
+               OpStore %45 %44
+               OpBranch %40
+         %40 = OpLabel
+         %46 = OpAccessChain %_ptr_Function_float %a %uint_1
+         %47 = OpLoad %float %46
+         %48 = OpCompositeConstruct %v2float %47 %47
+         %49 = OpFAdd %v2float %48 %27
+               OpStore %b %49
+         %50 = OpLoad %v2float %b
+         %51 = OpFOrdEqual %v2bool %50 %29
+         %52 = OpAll %bool %51
+               OpSelectionMerge %53 None
+               OpBranchConditional %52 %54 %55
+         %54 = OpLabel
+               OpStore %_GLF_color %34
+               OpBranch %53
+         %55 = OpLabel
+               OpStore %_GLF_color %35
+               OpBranch %53
+         %53 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-inc-unused-comp/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-inc-unused-comp/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..d6dd5f8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-inc-unused-comp/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,37 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2 a = float2(0.0f, 0.0f);
+  float2 b = float2(0.0f, 0.0f);
+  a = float2(1.0f, 1.0f);
+  const int x_38 = asint(x_6[0].x);
+  if ((x_38 == 1)) {
+    const float x_43 = a.x;
+    a.x = (x_43 + 1.0f);
+  }
+  const float x_47 = a.y;
+  b = (float2(x_47, x_47) + float2(2.0f, 3.0f));
+  if (all((b == float2(3.0f, 4.0f)))) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-inc-unused-comp/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-inc-unused-comp/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..9bf6ea8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-inc-unused-comp/0-opt.spvasm.expected.msl
@@ -0,0 +1,41 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int zero;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float2 a = 0.0f;
+  float2 b = 0.0f;
+  a = float2(1.0f, 1.0f);
+  int const x_38 = x_6.zero;
+  if ((x_38 == 1)) {
+    float const x_43 = a.x;
+    a.x = (x_43 + 1.0f);
+  }
+  float const x_47 = a.y;
+  b = (float2(x_47, x_47) + float2(2.0f, 3.0f));
+  float2 const x_50 = b;
+  if (all((x_50 == float2(3.0f, 4.0f)))) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-inc-unused-comp/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-inc-unused-comp/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..a8b0d8c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-inc-unused-comp/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,117 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 70
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %19 = OpConstantNull %v2float
+    %float_1 = OpConstant %float 1
+         %22 = OpConstantComposite %v2float %float_1 %float_1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+         %44 = OpConstantComposite %v2float %float_2 %float_3
+    %float_4 = OpConstant %float 4
+         %49 = OpConstantComposite %v2float %float_3 %float_4
+     %v2bool = OpTypeVector %bool 2
+    %float_0 = OpConstant %float 0
+         %56 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %57 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %58 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %a = OpVariable %_ptr_Function_v2float Function %19
+          %b = OpVariable %_ptr_Function_v2float Function %19
+               OpStore %a %22
+         %26 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0
+         %27 = OpLoad %int %26
+         %29 = OpIEqual %bool %27 %int_1
+               OpSelectionMerge %31 None
+               OpBranchConditional %29 %32 %31
+         %32 = OpLabel
+         %34 = OpAccessChain %_ptr_Function_float %a %uint_0
+         %35 = OpLoad %float %34
+         %36 = OpAccessChain %_ptr_Function_float %a %uint_0
+         %37 = OpFAdd %float %35 %float_1
+               OpStore %36 %37
+               OpBranch %31
+         %31 = OpLabel
+         %39 = OpAccessChain %_ptr_Function_float %a %uint_1
+         %40 = OpLoad %float %39
+         %41 = OpCompositeConstruct %v2float %40 %40
+         %45 = OpFAdd %v2float %41 %44
+               OpStore %b %45
+         %46 = OpLoad %v2float %b
+         %50 = OpFOrdEqual %v2bool %46 %49
+         %47 = OpAll %bool %50
+               OpSelectionMerge %52 None
+               OpBranchConditional %47 %53 %54
+         %53 = OpLabel
+               OpStore %x_GLF_color %56
+               OpBranch %52
+         %54 = OpLabel
+               OpStore %x_GLF_color %57
+               OpBranch %52
+         %52 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %58
+%tint_symbol = OpFunctionParameter %main_out
+         %62 = OpLabel
+         %63 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %63
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %65 = OpLabel
+         %66 = OpFunctionCall %void %main_1
+         %68 = OpLoad %v4float %x_GLF_color
+         %69 = OpCompositeConstruct %main_out %68
+         %67 = OpFunctionCall %void %tint_symbol_2 %69
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-inc-unused-comp/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-inc-unused-comp/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..ef1ccfe
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-inc-unused-comp/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,39 @@
+[[block]]
+struct buf0 {
+  zero : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : vec2<f32>;
+  var b : vec2<f32>;
+  a = vec2<f32>(1.0, 1.0);
+  let x_38 : i32 = x_6.zero;
+  if ((x_38 == 1)) {
+    let x_43 : f32 = a.x;
+    a.x = (x_43 + 1.0);
+  }
+  let x_47 : f32 = a.y;
+  b = (vec2<f32>(x_47, x_47) + vec2<f32>(2.0, 3.0));
+  let x_50 : vec2<f32> = b;
+  if (all((x_50 == vec2<f32>(3.0, 4.0)))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-inc-unused-comp/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-inc-unused-comp/0-opt.wgsl
new file mode 100644
index 0000000..ef1ccfe
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-inc-unused-comp/0-opt.wgsl
@@ -0,0 +1,39 @@
+[[block]]
+struct buf0 {
+  zero : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : vec2<f32>;
+  var b : vec2<f32>;
+  a = vec2<f32>(1.0, 1.0);
+  let x_38 : i32 = x_6.zero;
+  if ((x_38 == 1)) {
+    let x_43 : f32 = a.x;
+    a.x = (x_43 + 1.0);
+  }
+  let x_47 : f32 = a.y;
+  b = (vec2<f32>(x_47, x_47) + vec2<f32>(2.0, 3.0));
+  let x_50 : vec2<f32> = b;
+  if (all((x_50 == vec2<f32>(3.0, 4.0)))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-inc-unused-comp/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-inc-unused-comp/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..d6dd5f8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-inc-unused-comp/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,37 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2 a = float2(0.0f, 0.0f);
+  float2 b = float2(0.0f, 0.0f);
+  a = float2(1.0f, 1.0f);
+  const int x_38 = asint(x_6[0].x);
+  if ((x_38 == 1)) {
+    const float x_43 = a.x;
+    a.x = (x_43 + 1.0f);
+  }
+  const float x_47 = a.y;
+  b = (float2(x_47, x_47) + float2(2.0f, 3.0f));
+  if (all((b == float2(3.0f, 4.0f)))) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-inc-unused-comp/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-inc-unused-comp/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..9bf6ea8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-inc-unused-comp/0-opt.wgsl.expected.msl
@@ -0,0 +1,41 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int zero;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float2 a = 0.0f;
+  float2 b = 0.0f;
+  a = float2(1.0f, 1.0f);
+  int const x_38 = x_6.zero;
+  if ((x_38 == 1)) {
+    float const x_43 = a.x;
+    a.x = (x_43 + 1.0f);
+  }
+  float const x_47 = a.y;
+  b = (float2(x_47, x_47) + float2(2.0f, 3.0f));
+  float2 const x_50 = b;
+  if (all((x_50 == float2(3.0f, 4.0f)))) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-inc-unused-comp/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-inc-unused-comp/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..a8b0d8c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-inc-unused-comp/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,117 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 70
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %19 = OpConstantNull %v2float
+    %float_1 = OpConstant %float 1
+         %22 = OpConstantComposite %v2float %float_1 %float_1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+         %44 = OpConstantComposite %v2float %float_2 %float_3
+    %float_4 = OpConstant %float 4
+         %49 = OpConstantComposite %v2float %float_3 %float_4
+     %v2bool = OpTypeVector %bool 2
+    %float_0 = OpConstant %float 0
+         %56 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %57 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %58 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %a = OpVariable %_ptr_Function_v2float Function %19
+          %b = OpVariable %_ptr_Function_v2float Function %19
+               OpStore %a %22
+         %26 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0
+         %27 = OpLoad %int %26
+         %29 = OpIEqual %bool %27 %int_1
+               OpSelectionMerge %31 None
+               OpBranchConditional %29 %32 %31
+         %32 = OpLabel
+         %34 = OpAccessChain %_ptr_Function_float %a %uint_0
+         %35 = OpLoad %float %34
+         %36 = OpAccessChain %_ptr_Function_float %a %uint_0
+         %37 = OpFAdd %float %35 %float_1
+               OpStore %36 %37
+               OpBranch %31
+         %31 = OpLabel
+         %39 = OpAccessChain %_ptr_Function_float %a %uint_1
+         %40 = OpLoad %float %39
+         %41 = OpCompositeConstruct %v2float %40 %40
+         %45 = OpFAdd %v2float %41 %44
+               OpStore %b %45
+         %46 = OpLoad %v2float %b
+         %50 = OpFOrdEqual %v2bool %46 %49
+         %47 = OpAll %bool %50
+               OpSelectionMerge %52 None
+               OpBranchConditional %47 %53 %54
+         %53 = OpLabel
+               OpStore %x_GLF_color %56
+               OpBranch %52
+         %54 = OpLabel
+               OpStore %x_GLF_color %57
+               OpBranch %52
+         %52 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %58
+%tint_symbol = OpFunctionParameter %main_out
+         %62 = OpLabel
+         %63 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %63
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %65 = OpLabel
+         %66 = OpFunctionCall %void %main_1
+         %68 = OpLoad %v4float %x_GLF_color
+         %69 = OpCompositeConstruct %main_out %68
+         %67 = OpFunctionCall %void %tint_symbol_2 %69
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-inc-unused-comp/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-inc-unused-comp/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..ef1ccfe
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-inc-unused-comp/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,39 @@
+[[block]]
+struct buf0 {
+  zero : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : vec2<f32>;
+  var b : vec2<f32>;
+  a = vec2<f32>(1.0, 1.0);
+  let x_38 : i32 = x_6.zero;
+  if ((x_38 == 1)) {
+    let x_43 : f32 = a.x;
+    a.x = (x_43 + 1.0);
+  }
+  let x_47 : f32 = a.y;
+  b = (vec2<f32>(x_47, x_47) + vec2<f32>(2.0, 3.0));
+  let x_50 : vec2<f32> = b;
+  if (all((x_50 == vec2<f32>(3.0, 4.0)))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-unused-component/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-unused-component/0-opt.spvasm
new file mode 100644
index 0000000..746f3a7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-unused-component/0-opt.spvasm
@@ -0,0 +1,56 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+    %float_1 = OpConstant %float 1
+         %12 = OpConstantComposite %v2float %float_1 %float_1
+  %float_0_5 = OpConstant %float 0.5
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %21 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %22 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %7
+         %23 = OpLabel
+          %a = OpVariable %_ptr_Function_v2float Function
+          %b = OpVariable %_ptr_Function_v2float Function
+               OpStore %a %12
+         %24 = OpAccessChain %_ptr_Function_float %a %uint_0
+         %25 = OpLoad %float %24
+         %26 = OpFAdd %float %25 %float_0_5
+         %27 = OpAccessChain %_ptr_Function_float %a %uint_0
+               OpStore %27 %26
+         %28 = OpLoad %v2float %a
+         %29 = OpExtInst %v2float %1 Fract %28
+               OpStore %b %29
+         %30 = OpAccessChain %_ptr_Function_float %b %uint_0
+         %31 = OpLoad %float %30
+         %32 = OpFOrdEqual %bool %31 %float_0_5
+               OpSelectionMerge %33 None
+               OpBranchConditional %32 %34 %35
+         %34 = OpLabel
+               OpStore %_GLF_color %21
+               OpBranch %33
+         %35 = OpLabel
+               OpStore %_GLF_color %22
+               OpBranch %33
+         %33 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-unused-component/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-unused-component/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..b0f9a87
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-unused-component/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,31 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2 a = float2(0.0f, 0.0f);
+  float2 b = float2(0.0f, 0.0f);
+  a = float2(1.0f, 1.0f);
+  const float x_25 = a.x;
+  a.x = (x_25 + 0.5f);
+  b = frac(a);
+  const float x_31 = b.x;
+  if ((x_31 == 0.5f)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-unused-component/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-unused-component/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..f64ba57
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-unused-component/0-opt.spvasm.expected.msl
@@ -0,0 +1,35 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  float2 a = 0.0f;
+  float2 b = 0.0f;
+  a = float2(1.0f, 1.0f);
+  float const x_25 = a.x;
+  a.x = (x_25 + 0.5f);
+  float2 const x_28 = a;
+  b = fract(x_28);
+  float const x_31 = b.x;
+  if ((x_31 == 0.5f)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-unused-component/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-unused-component/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..0722d66
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-unused-component/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,88 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 52
+; Schema: 0
+               OpCapability Shader
+         %29 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %15 = OpConstantNull %v2float
+    %float_1 = OpConstant %float 1
+         %18 = OpConstantComposite %v2float %float_1 %float_1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+  %float_0_5 = OpConstant %float 0.5
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+         %38 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %39 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %40 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %a = OpVariable %_ptr_Function_v2float Function %15
+          %b = OpVariable %_ptr_Function_v2float Function %15
+               OpStore %a %18
+         %22 = OpAccessChain %_ptr_Function_float %a %uint_0
+         %23 = OpLoad %float %22
+         %24 = OpAccessChain %_ptr_Function_float %a %uint_0
+         %26 = OpFAdd %float %23 %float_0_5
+               OpStore %24 %26
+         %27 = OpLoad %v2float %a
+         %28 = OpExtInst %v2float %29 Fract %27
+               OpStore %b %28
+         %30 = OpAccessChain %_ptr_Function_float %b %uint_0
+         %31 = OpLoad %float %30
+         %32 = OpFOrdEqual %bool %31 %float_0_5
+               OpSelectionMerge %34 None
+               OpBranchConditional %32 %35 %36
+         %35 = OpLabel
+               OpStore %x_GLF_color %38
+               OpBranch %34
+         %36 = OpLabel
+               OpStore %x_GLF_color %39
+               OpBranch %34
+         %34 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %40
+%tint_symbol = OpFunctionParameter %main_out
+         %44 = OpLabel
+         %45 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %45
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %47 = OpLabel
+         %48 = OpFunctionCall %void %main_1
+         %50 = OpLoad %v4float %x_GLF_color
+         %51 = OpCompositeConstruct %main_out %50
+         %49 = OpFunctionCall %void %tint_symbol_2 %51
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-unused-component/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-unused-component/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..5be7339
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-unused-component/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,29 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : vec2<f32>;
+  var b : vec2<f32>;
+  a = vec2<f32>(1.0, 1.0);
+  let x_25 : f32 = a.x;
+  a.x = (x_25 + 0.5);
+  let x_28 : vec2<f32> = a;
+  b = fract(x_28);
+  let x_31 : f32 = b.x;
+  if ((x_31 == 0.5)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-unused-component/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-unused-component/0-opt.wgsl
new file mode 100644
index 0000000..5be7339
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-unused-component/0-opt.wgsl
@@ -0,0 +1,29 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : vec2<f32>;
+  var b : vec2<f32>;
+  a = vec2<f32>(1.0, 1.0);
+  let x_25 : f32 = a.x;
+  a.x = (x_25 + 0.5);
+  let x_28 : vec2<f32> = a;
+  b = fract(x_28);
+  let x_31 : f32 = b.x;
+  if ((x_31 == 0.5)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-unused-component/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-unused-component/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..b0f9a87
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-unused-component/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,31 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2 a = float2(0.0f, 0.0f);
+  float2 b = float2(0.0f, 0.0f);
+  a = float2(1.0f, 1.0f);
+  const float x_25 = a.x;
+  a.x = (x_25 + 0.5f);
+  b = frac(a);
+  const float x_31 = b.x;
+  if ((x_31 == 0.5f)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-unused-component/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-unused-component/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..f64ba57
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-unused-component/0-opt.wgsl.expected.msl
@@ -0,0 +1,35 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  float2 a = 0.0f;
+  float2 b = 0.0f;
+  a = float2(1.0f, 1.0f);
+  float const x_25 = a.x;
+  a.x = (x_25 + 0.5f);
+  float2 const x_28 = a;
+  b = fract(x_28);
+  float const x_31 = b.x;
+  if ((x_31 == 0.5f)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-unused-component/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-unused-component/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..0722d66
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-unused-component/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,88 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 52
+; Schema: 0
+               OpCapability Shader
+         %29 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %15 = OpConstantNull %v2float
+    %float_1 = OpConstant %float 1
+         %18 = OpConstantComposite %v2float %float_1 %float_1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+  %float_0_5 = OpConstant %float 0.5
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+         %38 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %39 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %40 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %a = OpVariable %_ptr_Function_v2float Function %15
+          %b = OpVariable %_ptr_Function_v2float Function %15
+               OpStore %a %18
+         %22 = OpAccessChain %_ptr_Function_float %a %uint_0
+         %23 = OpLoad %float %22
+         %24 = OpAccessChain %_ptr_Function_float %a %uint_0
+         %26 = OpFAdd %float %23 %float_0_5
+               OpStore %24 %26
+         %27 = OpLoad %v2float %a
+         %28 = OpExtInst %v2float %29 Fract %27
+               OpStore %b %28
+         %30 = OpAccessChain %_ptr_Function_float %b %uint_0
+         %31 = OpLoad %float %30
+         %32 = OpFOrdEqual %bool %31 %float_0_5
+               OpSelectionMerge %34 None
+               OpBranchConditional %32 %35 %36
+         %35 = OpLabel
+               OpStore %x_GLF_color %38
+               OpBranch %34
+         %36 = OpLabel
+               OpStore %x_GLF_color %39
+               OpBranch %34
+         %34 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %40
+%tint_symbol = OpFunctionParameter %main_out
+         %44 = OpLabel
+         %45 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %45
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %47 = OpLabel
+         %48 = OpFunctionCall %void %main_1
+         %50 = OpLoad %v4float %x_GLF_color
+         %51 = OpCompositeConstruct %main_out %50
+         %49 = OpFunctionCall %void %tint_symbol_2 %51
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-unused-component/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-unused-component/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..5be7339
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-vector-dce-unused-component/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,29 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var a : vec2<f32>;
+  var b : vec2<f32>;
+  a = vec2<f32>(1.0, 1.0);
+  let x_25 : f32 = a.x;
+  a.x = (x_25 + 0.5);
+  let x_28 : vec2<f32> = a;
+  b = fract(x_28);
+  let x_31 : f32 = b.x;
+  if ((x_31 == 0.5)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-vector-log2-cosh/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-vector-log2-cosh/0-opt.spvasm
new file mode 100644
index 0000000..b4a995a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-vector-log2-cosh/0-opt.spvasm
@@ -0,0 +1,51 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %v "v"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %6 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+    %float_1 = OpConstant %float 1
+  %float_100 = OpConstant %float 100
+         %12 = OpConstantComposite %v2float %float_1 %float_100
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %21 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %22 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %6
+         %23 = OpLabel
+          %v = OpVariable %_ptr_Function_v2float Function
+         %24 = OpExtInst %v2float %1 Cosh %12
+         %25 = OpExtInst %v2float %1 Log2 %24
+               OpStore %v %25
+         %26 = OpAccessChain %_ptr_Function_float %v %uint_0
+         %27 = OpLoad %float %26
+         %28 = OpAccessChain %_ptr_Function_float %v %uint_1
+         %29 = OpLoad %float %28
+         %30 = OpFOrdLessThan %bool %27 %29
+               OpSelectionMerge %31 None
+               OpBranchConditional %30 %32 %33
+         %32 = OpLabel
+               OpStore %_GLF_color %21
+               OpBranch %31
+         %33 = OpLabel
+               OpStore %_GLF_color %22
+               OpBranch %31
+         %31 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-vector-log2-cosh/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-vector-log2-cosh/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..c513660
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-vector-log2-cosh/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,28 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2 v = float2(0.0f, 0.0f);
+  v = log2(cosh(float2(1.0f, 100.0f)));
+  const float x_27 = v.x;
+  const float x_29 = v.y;
+  if ((x_27 < x_29)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-vector-log2-cosh/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-vector-log2-cosh/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..d1585b5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-vector-log2-cosh/0-opt.spvasm.expected.msl
@@ -0,0 +1,31 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  float2 v = 0.0f;
+  v = log2(cosh(float2(1.0f, 100.0f)));
+  float const x_27 = v.x;
+  float const x_29 = v.y;
+  if ((x_27 < x_29)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-vector-log2-cosh/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-vector-log2-cosh/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..77d6182
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-vector-log2-cosh/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,83 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 50
+; Schema: 0
+               OpCapability Shader
+         %17 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v "v"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %15 = OpConstantNull %v2float
+    %float_1 = OpConstant %float 1
+  %float_100 = OpConstant %float 100
+         %21 = OpConstantComposite %v2float %float_1 %float_100
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+         %36 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %37 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %38 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %v = OpVariable %_ptr_Function_v2float Function %15
+         %18 = OpExtInst %v2float %17 Cosh %21
+         %16 = OpExtInst %v2float %17 Log2 %18
+               OpStore %v %16
+         %25 = OpAccessChain %_ptr_Function_float %v %uint_0
+         %26 = OpLoad %float %25
+         %28 = OpAccessChain %_ptr_Function_float %v %uint_1
+         %29 = OpLoad %float %28
+         %30 = OpFOrdLessThan %bool %26 %29
+               OpSelectionMerge %32 None
+               OpBranchConditional %30 %33 %34
+         %33 = OpLabel
+               OpStore %x_GLF_color %36
+               OpBranch %32
+         %34 = OpLabel
+               OpStore %x_GLF_color %37
+               OpBranch %32
+         %32 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %38
+%tint_symbol = OpFunctionParameter %main_out
+         %42 = OpLabel
+         %43 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %43
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %45 = OpLabel
+         %46 = OpFunctionCall %void %main_1
+         %48 = OpLoad %v4float %x_GLF_color
+         %49 = OpCompositeConstruct %main_out %48
+         %47 = OpFunctionCall %void %tint_symbol_2 %49
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-vector-log2-cosh/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-vector-log2-cosh/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..2cecb75
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-vector-log2-cosh/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,25 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v : vec2<f32>;
+  v = log2(cosh(vec2<f32>(1.0, 100.0)));
+  let x_27 : f32 = v.x;
+  let x_29 : f32 = v.y;
+  if ((x_27 < x_29)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-vector-log2-cosh/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-vector-log2-cosh/0-opt.wgsl
new file mode 100644
index 0000000..2cecb75
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-vector-log2-cosh/0-opt.wgsl
@@ -0,0 +1,25 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v : vec2<f32>;
+  v = log2(cosh(vec2<f32>(1.0, 100.0)));
+  let x_27 : f32 = v.x;
+  let x_29 : f32 = v.y;
+  if ((x_27 < x_29)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-vector-log2-cosh/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-vector-log2-cosh/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..c513660
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-vector-log2-cosh/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,28 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2 v = float2(0.0f, 0.0f);
+  v = log2(cosh(float2(1.0f, 100.0f)));
+  const float x_27 = v.x;
+  const float x_29 = v.y;
+  if ((x_27 < x_29)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-vector-log2-cosh/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-vector-log2-cosh/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..d1585b5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-vector-log2-cosh/0-opt.wgsl.expected.msl
@@ -0,0 +1,31 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  float2 v = 0.0f;
+  v = log2(cosh(float2(1.0f, 100.0f)));
+  float const x_27 = v.x;
+  float const x_29 = v.y;
+  if ((x_27 < x_29)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-vector-log2-cosh/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-vector-log2-cosh/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..77d6182
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-vector-log2-cosh/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,83 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 50
+; Schema: 0
+               OpCapability Shader
+         %17 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v "v"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %15 = OpConstantNull %v2float
+    %float_1 = OpConstant %float 1
+  %float_100 = OpConstant %float 100
+         %21 = OpConstantComposite %v2float %float_1 %float_100
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+         %36 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %37 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %38 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %v = OpVariable %_ptr_Function_v2float Function %15
+         %18 = OpExtInst %v2float %17 Cosh %21
+         %16 = OpExtInst %v2float %17 Log2 %18
+               OpStore %v %16
+         %25 = OpAccessChain %_ptr_Function_float %v %uint_0
+         %26 = OpLoad %float %25
+         %28 = OpAccessChain %_ptr_Function_float %v %uint_1
+         %29 = OpLoad %float %28
+         %30 = OpFOrdLessThan %bool %26 %29
+               OpSelectionMerge %32 None
+               OpBranchConditional %30 %33 %34
+         %33 = OpLabel
+               OpStore %x_GLF_color %36
+               OpBranch %32
+         %34 = OpLabel
+               OpStore %x_GLF_color %37
+               OpBranch %32
+         %32 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %38
+%tint_symbol = OpFunctionParameter %main_out
+         %42 = OpLabel
+         %43 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %43
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %45 = OpLabel
+         %46 = OpFunctionCall %void %main_1
+         %48 = OpLoad %v4float %x_GLF_color
+         %49 = OpCompositeConstruct %main_out %48
+         %47 = OpFunctionCall %void %tint_symbol_2 %49
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-vector-log2-cosh/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-vector-log2-cosh/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..2cecb75
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-vector-log2-cosh/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,25 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var v : vec2<f32>;
+  v = log2(cosh(vec2<f32>(1.0, 100.0)));
+  let x_27 : f32 = v.x;
+  let x_29 : f32 = v.y;
+  if ((x_27 < x_29)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-for-loop/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-for-loop/0-opt.spvasm
new file mode 100644
index 0000000..96a060d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-for-loop/0-opt.spvasm
@@ -0,0 +1,91 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %func_i1_ "func(i1;"
+               OpName %x "x"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpName %i "i"
+               OpName %param "param"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %14 = OpTypeFunction %void %_ptr_Function_int
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_8 = OpConstant %int 8
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %25 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %26 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+     %int_10 = OpConstant %int 10
+      %int_1 = OpConstant %int 1
+       %main = OpFunction %void None %11
+         %29 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_int Function
+               OpStore %_GLF_color %26
+               OpStore %i %int_0
+               OpBranch %30
+         %30 = OpLabel
+         %31 = OpPhi %int %int_0 %29 %32 %33
+         %34 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %35 = OpLoad %int %34
+         %36 = OpIAdd %int %int_10 %35
+         %37 = OpSLessThan %bool %31 %36
+               OpLoopMerge %38 %33 None
+               OpBranchConditional %37 %33 %38
+         %33 = OpLabel
+               OpStore %param %31
+         %39 = OpFunctionCall %void %func_i1_ %param
+         %32 = OpIAdd %int %31 %int_1
+               OpStore %i %32
+               OpBranch %30
+         %38 = OpLabel
+               OpReturn
+               OpFunctionEnd
+   %func_i1_ = OpFunction %void None %14
+          %x = OpFunctionParameter %_ptr_Function_int
+         %40 = OpLabel
+         %41 = OpLoad %int %x
+         %42 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %43 = OpLoad %int %42
+         %44 = OpSLessThan %bool %41 %43
+               OpSelectionMerge %45 None
+               OpBranchConditional %44 %46 %45
+         %46 = OpLabel
+               OpKill
+         %45 = OpLabel
+         %47 = OpLoad %int %x
+         %48 = OpSGreaterThan %bool %47 %int_8
+               OpSelectionMerge %49 None
+               OpBranchConditional %48 %50 %51
+         %50 = OpLabel
+               OpStore %_GLF_color %25
+               OpBranch %49
+         %51 = OpLabel
+               OpStore %_GLF_color %26
+               OpBranch %49
+         %49 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-for-loop/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-for-loop/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..e223102
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-for-loop/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,58 @@
+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 func_i1_(inout int x) {
+  const int x_41 = x;
+  const int x_43 = asint(x_7[0].x);
+  if ((x_41 < x_43)) {
+    discard;
+  }
+  const int x_47 = x;
+  if ((x_47 > 8)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+void main_1() {
+  int i = 0;
+  int param = 0;
+  int x_31_phi = 0;
+  x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  i = 0;
+  x_31_phi = 0;
+  while (true) {
+    const int x_31 = x_31_phi;
+    const int x_35 = asint(x_7[0].x);
+    if ((x_31 < (10 + x_35))) {
+    } else {
+      break;
+    }
+    {
+      param = x_31;
+      func_i1_(param);
+      const int x_32 = (x_31 + 1);
+      i = x_32;
+      x_31_phi = x_32;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-for-loop/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-for-loop/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..2843739
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-for-loop/0-opt.spvasm.expected.msl
@@ -0,0 +1,61 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int zero;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void func_i1_(constant buf0& x_7, thread int* const x, thread float4* const tint_symbol_4) {
+  int const x_41 = *(x);
+  int const x_43 = x_7.zero;
+  if ((x_41 < x_43)) {
+    discard_fragment();
+  }
+  int const x_47 = *(x);
+  if ((x_47 > 8)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_5) {
+  int i = 0;
+  int param = 0;
+  int x_31_phi = 0;
+  *(tint_symbol_5) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  i = 0;
+  x_31_phi = 0;
+  while (true) {
+    int const x_31 = x_31_phi;
+    int const x_35 = x_7.zero;
+    if ((x_31 < (10 + x_35))) {
+    } else {
+      break;
+    }
+    {
+      param = x_31;
+      func_i1_(x_7, &(param), tint_symbol_5);
+      int const x_32 = (x_31 + 1);
+      i = x_32;
+      x_31_phi = x_32;
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_7, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-for-loop/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-for-loop/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..faecfdf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-for-loop/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,138 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 77
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_i1_ "func_i1_"
+               OpName %x "x"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %param "param"
+               OpName %x_31_phi "x_31_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+         %12 = OpTypeFunction %void %_ptr_Function_int
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_8 = OpConstant %int 8
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %38 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %39 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+         %40 = OpTypeFunction %void
+         %44 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+     %int_10 = OpConstant %int 10
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %65 = OpTypeFunction %void %main_out
+   %func_i1_ = OpFunction %void None %12
+          %x = OpFunctionParameter %_ptr_Function_int
+         %17 = OpLabel
+         %19 = OpLoad %int %x
+         %23 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %24 = OpLoad %int %23
+         %25 = OpSLessThan %bool %19 %24
+               OpSelectionMerge %27 None
+               OpBranchConditional %25 %28 %27
+         %28 = OpLabel
+               OpKill
+         %27 = OpLabel
+         %30 = OpLoad %int %x
+         %32 = OpSGreaterThan %bool %30 %int_8
+               OpSelectionMerge %33 None
+               OpBranchConditional %32 %34 %35
+         %34 = OpLabel
+               OpStore %x_GLF_color %38
+               OpBranch %33
+         %35 = OpLabel
+               OpStore %x_GLF_color %39
+               OpBranch %33
+         %33 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %40
+         %42 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %44
+      %param = OpVariable %_ptr_Function_int Function %44
+   %x_31_phi = OpVariable %_ptr_Function_int Function %44
+               OpStore %x_GLF_color %39
+               OpStore %i %int_0
+               OpStore %x_31_phi %int_0
+               OpBranch %48
+         %48 = OpLabel
+               OpLoopMerge %49 %50 None
+               OpBranch %51
+         %51 = OpLabel
+         %52 = OpLoad %int %x_31_phi
+         %53 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %54 = OpLoad %int %53
+         %56 = OpIAdd %int %int_10 %54
+         %57 = OpSLessThan %bool %52 %56
+               OpSelectionMerge %58 None
+               OpBranchConditional %57 %59 %60
+         %59 = OpLabel
+               OpBranch %58
+         %60 = OpLabel
+               OpBranch %49
+         %58 = OpLabel
+               OpBranch %50
+         %50 = OpLabel
+               OpStore %param %52
+         %61 = OpFunctionCall %void %func_i1_ %param
+         %64 = OpIAdd %int %52 %int_1
+               OpStore %i %64
+               OpStore %x_31_phi %64
+               OpBranch %48
+         %49 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %65
+%tint_symbol = OpFunctionParameter %main_out
+         %69 = OpLabel
+         %70 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %70
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %40
+         %72 = OpLabel
+         %73 = OpFunctionCall %void %main_1
+         %75 = OpLoad %v4float %x_GLF_color
+         %76 = OpCompositeConstruct %main_out %75
+         %74 = OpFunctionCall %void %tint_symbol_2 %76
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-for-loop/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-for-loop/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..f53a636
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-for-loop/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,60 @@
+[[block]]
+struct buf0 {
+  zero : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_i1_(x : ptr<function, i32>) {
+  let x_41 : i32 = *(x);
+  let x_43 : i32 = x_7.zero;
+  if ((x_41 < x_43)) {
+    discard;
+  }
+  let x_47 : i32 = *(x);
+  if ((x_47 > 8)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+fn main_1() {
+  var i : i32;
+  var param : i32;
+  var x_31_phi : i32;
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  i = 0;
+  x_31_phi = 0;
+  loop {
+    let x_31 : i32 = x_31_phi;
+    let x_35 : i32 = x_7.zero;
+    if ((x_31 < (10 + x_35))) {
+    } else {
+      break;
+    }
+
+    continuing {
+      param = x_31;
+      func_i1_(&(param));
+      let x_32 : i32 = (x_31 + 1);
+      i = x_32;
+      x_31_phi = x_32;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-for-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-for-loop/0-opt.wgsl
new file mode 100644
index 0000000..f53a636
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-for-loop/0-opt.wgsl
@@ -0,0 +1,60 @@
+[[block]]
+struct buf0 {
+  zero : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_i1_(x : ptr<function, i32>) {
+  let x_41 : i32 = *(x);
+  let x_43 : i32 = x_7.zero;
+  if ((x_41 < x_43)) {
+    discard;
+  }
+  let x_47 : i32 = *(x);
+  if ((x_47 > 8)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+fn main_1() {
+  var i : i32;
+  var param : i32;
+  var x_31_phi : i32;
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  i = 0;
+  x_31_phi = 0;
+  loop {
+    let x_31 : i32 = x_31_phi;
+    let x_35 : i32 = x_7.zero;
+    if ((x_31 < (10 + x_35))) {
+    } else {
+      break;
+    }
+
+    continuing {
+      param = x_31;
+      func_i1_(&(param));
+      let x_32 : i32 = (x_31 + 1);
+      i = x_32;
+      x_31_phi = x_32;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-for-loop/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-for-loop/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..e223102
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-for-loop/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,58 @@
+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 func_i1_(inout int x) {
+  const int x_41 = x;
+  const int x_43 = asint(x_7[0].x);
+  if ((x_41 < x_43)) {
+    discard;
+  }
+  const int x_47 = x;
+  if ((x_47 > 8)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+void main_1() {
+  int i = 0;
+  int param = 0;
+  int x_31_phi = 0;
+  x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  i = 0;
+  x_31_phi = 0;
+  while (true) {
+    const int x_31 = x_31_phi;
+    const int x_35 = asint(x_7[0].x);
+    if ((x_31 < (10 + x_35))) {
+    } else {
+      break;
+    }
+    {
+      param = x_31;
+      func_i1_(param);
+      const int x_32 = (x_31 + 1);
+      i = x_32;
+      x_31_phi = x_32;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-for-loop/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-for-loop/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..2843739
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-for-loop/0-opt.wgsl.expected.msl
@@ -0,0 +1,61 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int zero;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void func_i1_(constant buf0& x_7, thread int* const x, thread float4* const tint_symbol_4) {
+  int const x_41 = *(x);
+  int const x_43 = x_7.zero;
+  if ((x_41 < x_43)) {
+    discard_fragment();
+  }
+  int const x_47 = *(x);
+  if ((x_47 > 8)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_5) {
+  int i = 0;
+  int param = 0;
+  int x_31_phi = 0;
+  *(tint_symbol_5) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  i = 0;
+  x_31_phi = 0;
+  while (true) {
+    int const x_31 = x_31_phi;
+    int const x_35 = x_7.zero;
+    if ((x_31 < (10 + x_35))) {
+    } else {
+      break;
+    }
+    {
+      param = x_31;
+      func_i1_(x_7, &(param), tint_symbol_5);
+      int const x_32 = (x_31 + 1);
+      i = x_32;
+      x_31_phi = x_32;
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_7, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-for-loop/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-for-loop/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..faecfdf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-for-loop/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,138 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 77
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_i1_ "func_i1_"
+               OpName %x "x"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %param "param"
+               OpName %x_31_phi "x_31_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+         %12 = OpTypeFunction %void %_ptr_Function_int
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+      %int_8 = OpConstant %int 8
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %38 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %39 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+         %40 = OpTypeFunction %void
+         %44 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+     %int_10 = OpConstant %int 10
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %65 = OpTypeFunction %void %main_out
+   %func_i1_ = OpFunction %void None %12
+          %x = OpFunctionParameter %_ptr_Function_int
+         %17 = OpLabel
+         %19 = OpLoad %int %x
+         %23 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %24 = OpLoad %int %23
+         %25 = OpSLessThan %bool %19 %24
+               OpSelectionMerge %27 None
+               OpBranchConditional %25 %28 %27
+         %28 = OpLabel
+               OpKill
+         %27 = OpLabel
+         %30 = OpLoad %int %x
+         %32 = OpSGreaterThan %bool %30 %int_8
+               OpSelectionMerge %33 None
+               OpBranchConditional %32 %34 %35
+         %34 = OpLabel
+               OpStore %x_GLF_color %38
+               OpBranch %33
+         %35 = OpLabel
+               OpStore %x_GLF_color %39
+               OpBranch %33
+         %33 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %40
+         %42 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %44
+      %param = OpVariable %_ptr_Function_int Function %44
+   %x_31_phi = OpVariable %_ptr_Function_int Function %44
+               OpStore %x_GLF_color %39
+               OpStore %i %int_0
+               OpStore %x_31_phi %int_0
+               OpBranch %48
+         %48 = OpLabel
+               OpLoopMerge %49 %50 None
+               OpBranch %51
+         %51 = OpLabel
+         %52 = OpLoad %int %x_31_phi
+         %53 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0
+         %54 = OpLoad %int %53
+         %56 = OpIAdd %int %int_10 %54
+         %57 = OpSLessThan %bool %52 %56
+               OpSelectionMerge %58 None
+               OpBranchConditional %57 %59 %60
+         %59 = OpLabel
+               OpBranch %58
+         %60 = OpLabel
+               OpBranch %49
+         %58 = OpLabel
+               OpBranch %50
+         %50 = OpLabel
+               OpStore %param %52
+         %61 = OpFunctionCall %void %func_i1_ %param
+         %64 = OpIAdd %int %52 %int_1
+               OpStore %i %64
+               OpStore %x_31_phi %64
+               OpBranch %48
+         %49 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %65
+%tint_symbol = OpFunctionParameter %main_out
+         %69 = OpLabel
+         %70 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %70
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %40
+         %72 = OpLabel
+         %73 = OpFunctionCall %void %main_1
+         %75 = OpLoad %v4float %x_GLF_color
+         %76 = OpCompositeConstruct %main_out %75
+         %74 = OpFunctionCall %void %tint_symbol_2 %76
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-for-loop/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-for-loop/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..f53a636
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-for-loop/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,60 @@
+[[block]]
+struct buf0 {
+  zero : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_i1_(x : ptr<function, i32>) {
+  let x_41 : i32 = *(x);
+  let x_43 : i32 = x_7.zero;
+  if ((x_41 < x_43)) {
+    discard;
+  }
+  let x_47 : i32 = *(x);
+  if ((x_47 > 8)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+fn main_1() {
+  var i : i32;
+  var param : i32;
+  var x_31_phi : i32;
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  i = 0;
+  x_31_phi = 0;
+  loop {
+    let x_31 : i32 = x_31_phi;
+    let x_35 : i32 = x_7.zero;
+    if ((x_31 < (10 + x_35))) {
+    } else {
+      break;
+    }
+
+    continuing {
+      param = x_31;
+      func_i1_(&(param));
+      let x_32 : i32 = (x_31 + 1);
+      i = x_32;
+      x_31_phi = x_32;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-two-branches/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-two-branches/0-opt.spvasm
new file mode 100644
index 0000000..fa125c0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-two-branches/0-opt.spvasm
@@ -0,0 +1,123 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %func_f1_ "func(f1;"
+               OpName %x "x"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %f "f"
+               OpName %i "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "five"
+               OpName %_ ""
+               OpName %param "param"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+         %16 = OpTypeFunction %float %_ptr_Function_float
+    %float_5 = OpConstant %float 5
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+  %float_0_5 = OpConstant %float 0.5
+     %uint_1 = OpConstant %uint 1
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %35 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %36 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %13
+         %37 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function
+          %i = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_float Function
+               OpStore %f %float_0
+               OpStore %i %int_0
+               OpBranch %38
+         %38 = OpLabel
+         %39 = OpLoad %int %i
+         %40 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %41 = OpLoad %int %40
+         %42 = OpSLessThan %bool %39 %41
+               OpLoopMerge %43 %44 None
+               OpBranchConditional %42 %44 %43
+         %44 = OpLabel
+         %45 = OpLoad %int %i
+         %46 = OpConvertSToF %float %45
+               OpStore %param %46
+         %47 = OpFunctionCall %float %func_f1_ %param
+               OpStore %f %47
+         %48 = OpLoad %int %i
+         %49 = OpIAdd %int %48 %int_1
+               OpStore %i %49
+               OpBranch %38
+         %43 = OpLabel
+         %50 = OpLoad %float %f
+         %51 = OpFOrdEqual %bool %50 %float_5
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %54
+         %53 = OpLabel
+               OpStore %_GLF_color %35
+               OpBranch %52
+         %54 = OpLabel
+               OpStore %_GLF_color %36
+               OpBranch %52
+         %52 = OpLabel
+               OpReturn
+               OpFunctionEnd
+   %func_f1_ = OpFunction %float None %16
+          %x = OpFunctionParameter %_ptr_Function_float
+         %55 = OpLabel
+         %56 = OpLoad %float %x
+         %57 = OpFOrdGreaterThan %bool %56 %float_5
+               OpSelectionMerge %58 None
+               OpBranchConditional %57 %59 %58
+         %59 = OpLabel
+         %60 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %61 = OpLoad %float %60
+         %62 = OpFOrdLessThan %bool %61 %float_0_5
+               OpSelectionMerge %63 None
+               OpBranchConditional %62 %64 %65
+         %64 = OpLabel
+               OpKill
+         %65 = OpLabel
+         %66 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %67 = OpLoad %float %66
+         %68 = OpFOrdLessThan %bool %67 %float_0_5
+               OpSelectionMerge %69 None
+               OpBranchConditional %68 %70 %69
+         %70 = OpLabel
+               OpKill
+         %69 = OpLabel
+               OpBranch %63
+         %63 = OpLabel
+               OpBranch %58
+         %58 = OpLabel
+         %71 = OpLoad %float %x
+         %72 = OpFAdd %float %71 %float_1
+               OpReturnValue %72
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-two-branches/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-two-branches/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..279a0dd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-two-branches/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,69 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float func_f1_(inout float x) {
+  const float x_56 = x;
+  if ((x_56 > 5.0f)) {
+    const float x_61 = gl_FragCoord.x;
+    if ((x_61 < 0.5f)) {
+      discard;
+    } else {
+      const float x_67 = gl_FragCoord.y;
+      if ((x_67 < 0.5f)) {
+        discard;
+      }
+    }
+  }
+  const float x_71 = x;
+  return (x_71 + 1.0f);
+}
+
+void main_1() {
+  float f = 0.0f;
+  int i = 0;
+  float param = 0.0f;
+  f = 0.0f;
+  i = 0;
+  while (true) {
+    const int x_39 = i;
+    const int x_41 = asint(x_10[0].x);
+    if ((x_39 < x_41)) {
+    } else {
+      break;
+    }
+    {
+      param = float(i);
+      const float x_47 = func_f1_(param);
+      f = x_47;
+      i = (i + 1);
+    }
+  }
+  if ((f == 5.0f)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-two-branches/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-two-branches/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..df17a9a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-two-branches/0-opt.spvasm.expected.msl
@@ -0,0 +1,71 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int five;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float func_f1_(thread float* const x, thread float4* const tint_symbol_5) {
+  float const x_56 = *(x);
+  if ((x_56 > 5.0f)) {
+    float const x_61 = (*(tint_symbol_5)).x;
+    if ((x_61 < 0.5f)) {
+      discard_fragment();
+    } else {
+      float const x_67 = (*(tint_symbol_5)).y;
+      if ((x_67 < 0.5f)) {
+        discard_fragment();
+      }
+    }
+  }
+  float const x_71 = *(x);
+  return (x_71 + 1.0f);
+}
+
+void main_1(constant buf0& x_10, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  float f = 0.0f;
+  int i = 0;
+  float param = 0.0f;
+  f = 0.0f;
+  i = 0;
+  while (true) {
+    int const x_39 = i;
+    int const x_41 = x_10.five;
+    if ((x_39 < x_41)) {
+    } else {
+      break;
+    }
+    {
+      int const x_45 = i;
+      param = float(x_45);
+      float const x_47 = func_f1_(&(param), tint_symbol_6);
+      f = x_47;
+      int const x_48 = i;
+      i = (x_48 + 1);
+    }
+  }
+  float const x_50 = f;
+  if ((x_50 == 5.0f)) {
+    *(tint_symbol_7) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_7) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_10 [[buffer(0)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_10, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-two-branches/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-two-branches/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..b497a16
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-two-branches/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,169 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 98
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "five"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %func_f1_ "func_f1_"
+               OpName %x "x"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %i "i"
+               OpName %param "param"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Function_float = OpTypePointer Function %float
+         %15 = OpTypeFunction %float %_ptr_Function_float
+    %float_5 = OpConstant %float 5
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+  %float_0_5 = OpConstant %float 0.5
+     %uint_1 = OpConstant %uint 1
+    %float_1 = OpConstant %float 1
+       %void = OpTypeVoid
+         %47 = OpTypeFunction %void
+         %52 = OpConstantNull %float
+%_ptr_Function_int = OpTypePointer Function %int
+         %55 = OpConstantNull %int
+    %float_0 = OpConstant %float 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+         %83 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %84 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %85 = OpTypeFunction %void %main_out
+   %func_f1_ = OpFunction %float None %15
+          %x = OpFunctionParameter %_ptr_Function_float
+         %19 = OpLabel
+         %21 = OpLoad %float %x
+         %23 = OpFOrdGreaterThan %bool %21 %float_5
+               OpSelectionMerge %25 None
+               OpBranchConditional %23 %26 %25
+         %26 = OpLabel
+         %30 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %31 = OpLoad %float %30
+         %33 = OpFOrdLessThan %bool %31 %float_0_5
+               OpSelectionMerge %34 None
+               OpBranchConditional %33 %35 %36
+         %35 = OpLabel
+               OpKill
+         %36 = OpLabel
+         %38 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %39 = OpLoad %float %38
+         %40 = OpFOrdLessThan %bool %39 %float_0_5
+               OpSelectionMerge %41 None
+               OpBranchConditional %40 %42 %41
+         %42 = OpLabel
+               OpKill
+         %41 = OpLabel
+               OpBranch %34
+         %34 = OpLabel
+               OpBranch %25
+         %25 = OpLabel
+         %44 = OpLoad %float %x
+         %46 = OpFAdd %float %44 %float_1
+               OpReturnValue %46
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %47
+         %50 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %52
+          %i = OpVariable %_ptr_Function_int Function %55
+      %param = OpVariable %_ptr_Function_float Function %52
+               OpStore %f %float_0
+               OpStore %i %int_0
+               OpBranch %59
+         %59 = OpLabel
+               OpLoopMerge %60 %61 None
+               OpBranch %62
+         %62 = OpLabel
+         %63 = OpLoad %int %i
+         %65 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0
+         %66 = OpLoad %int %65
+         %67 = OpSLessThan %bool %63 %66
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %70
+         %69 = OpLabel
+               OpBranch %68
+         %70 = OpLabel
+               OpBranch %60
+         %68 = OpLabel
+               OpBranch %61
+         %61 = OpLabel
+         %71 = OpLoad %int %i
+         %72 = OpConvertSToF %float %71
+               OpStore %param %72
+         %73 = OpFunctionCall %float %func_f1_ %param
+               OpStore %f %73
+         %75 = OpLoad %int %i
+         %77 = OpIAdd %int %75 %int_1
+               OpStore %i %77
+               OpBranch %59
+         %60 = OpLabel
+         %78 = OpLoad %float %f
+         %79 = OpFOrdEqual %bool %78 %float_5
+               OpSelectionMerge %80 None
+               OpBranchConditional %79 %81 %82
+         %81 = OpLabel
+               OpStore %x_GLF_color %83
+               OpBranch %80
+         %82 = OpLabel
+               OpStore %x_GLF_color %84
+               OpBranch %80
+         %80 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %85
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %89 = OpLabel
+         %90 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %90
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %47
+         %92 = OpLabel
+         %93 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %93
+         %94 = OpFunctionCall %void %main_1
+         %96 = OpLoad %v4float %x_GLF_color
+         %97 = OpCompositeConstruct %main_out %96
+         %95 = OpFunctionCall %void %tint_symbol_3 %97
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-two-branches/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-two-branches/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..d25c0e5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-two-branches/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,71 @@
+[[block]]
+struct buf0 {
+  five : i32;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_f1_(x : ptr<function, f32>) -> f32 {
+  let x_56 : f32 = *(x);
+  if ((x_56 > 5.0)) {
+    let x_61 : f32 = gl_FragCoord.x;
+    if ((x_61 < 0.5)) {
+      discard;
+    } else {
+      let x_67 : f32 = gl_FragCoord.y;
+      if ((x_67 < 0.5)) {
+        discard;
+      }
+    }
+  }
+  let x_71 : f32 = *(x);
+  return (x_71 + 1.0);
+}
+
+fn main_1() {
+  var f : f32;
+  var i : i32;
+  var param : f32;
+  f = 0.0;
+  i = 0;
+  loop {
+    let x_39 : i32 = i;
+    let x_41 : i32 = x_10.five;
+    if ((x_39 < x_41)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_45 : i32 = i;
+      param = f32(x_45);
+      let x_47 : f32 = func_f1_(&(param));
+      f = x_47;
+      let x_48 : i32 = i;
+      i = (x_48 + 1);
+    }
+  }
+  let x_50 : f32 = f;
+  if ((x_50 == 5.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-two-branches/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-two-branches/0-opt.wgsl
new file mode 100644
index 0000000..d25c0e5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-two-branches/0-opt.wgsl
@@ -0,0 +1,71 @@
+[[block]]
+struct buf0 {
+  five : i32;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_f1_(x : ptr<function, f32>) -> f32 {
+  let x_56 : f32 = *(x);
+  if ((x_56 > 5.0)) {
+    let x_61 : f32 = gl_FragCoord.x;
+    if ((x_61 < 0.5)) {
+      discard;
+    } else {
+      let x_67 : f32 = gl_FragCoord.y;
+      if ((x_67 < 0.5)) {
+        discard;
+      }
+    }
+  }
+  let x_71 : f32 = *(x);
+  return (x_71 + 1.0);
+}
+
+fn main_1() {
+  var f : f32;
+  var i : i32;
+  var param : f32;
+  f = 0.0;
+  i = 0;
+  loop {
+    let x_39 : i32 = i;
+    let x_41 : i32 = x_10.five;
+    if ((x_39 < x_41)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_45 : i32 = i;
+      param = f32(x_45);
+      let x_47 : f32 = func_f1_(&(param));
+      f = x_47;
+      let x_48 : i32 = i;
+      i = (x_48 + 1);
+    }
+  }
+  let x_50 : f32 = f;
+  if ((x_50 == 5.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-two-branches/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-two-branches/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..279a0dd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-two-branches/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,69 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float func_f1_(inout float x) {
+  const float x_56 = x;
+  if ((x_56 > 5.0f)) {
+    const float x_61 = gl_FragCoord.x;
+    if ((x_61 < 0.5f)) {
+      discard;
+    } else {
+      const float x_67 = gl_FragCoord.y;
+      if ((x_67 < 0.5f)) {
+        discard;
+      }
+    }
+  }
+  const float x_71 = x;
+  return (x_71 + 1.0f);
+}
+
+void main_1() {
+  float f = 0.0f;
+  int i = 0;
+  float param = 0.0f;
+  f = 0.0f;
+  i = 0;
+  while (true) {
+    const int x_39 = i;
+    const int x_41 = asint(x_10[0].x);
+    if ((x_39 < x_41)) {
+    } else {
+      break;
+    }
+    {
+      param = float(i);
+      const float x_47 = func_f1_(param);
+      f = x_47;
+      i = (i + 1);
+    }
+  }
+  if ((f == 5.0f)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-two-branches/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-two-branches/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..df17a9a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-two-branches/0-opt.wgsl.expected.msl
@@ -0,0 +1,71 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int five;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float func_f1_(thread float* const x, thread float4* const tint_symbol_5) {
+  float const x_56 = *(x);
+  if ((x_56 > 5.0f)) {
+    float const x_61 = (*(tint_symbol_5)).x;
+    if ((x_61 < 0.5f)) {
+      discard_fragment();
+    } else {
+      float const x_67 = (*(tint_symbol_5)).y;
+      if ((x_67 < 0.5f)) {
+        discard_fragment();
+      }
+    }
+  }
+  float const x_71 = *(x);
+  return (x_71 + 1.0f);
+}
+
+void main_1(constant buf0& x_10, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  float f = 0.0f;
+  int i = 0;
+  float param = 0.0f;
+  f = 0.0f;
+  i = 0;
+  while (true) {
+    int const x_39 = i;
+    int const x_41 = x_10.five;
+    if ((x_39 < x_41)) {
+    } else {
+      break;
+    }
+    {
+      int const x_45 = i;
+      param = float(x_45);
+      float const x_47 = func_f1_(&(param), tint_symbol_6);
+      f = x_47;
+      int const x_48 = i;
+      i = (x_48 + 1);
+    }
+  }
+  float const x_50 = f;
+  if ((x_50 == 5.0f)) {
+    *(tint_symbol_7) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_7) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_10 [[buffer(0)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_10, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-two-branches/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-two-branches/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..b497a16
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-two-branches/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,169 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 98
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "five"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %func_f1_ "func_f1_"
+               OpName %x "x"
+               OpName %main_1 "main_1"
+               OpName %f "f"
+               OpName %i "i"
+               OpName %param "param"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Function_float = OpTypePointer Function %float
+         %15 = OpTypeFunction %float %_ptr_Function_float
+    %float_5 = OpConstant %float 5
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+  %float_0_5 = OpConstant %float 0.5
+     %uint_1 = OpConstant %uint 1
+    %float_1 = OpConstant %float 1
+       %void = OpTypeVoid
+         %47 = OpTypeFunction %void
+         %52 = OpConstantNull %float
+%_ptr_Function_int = OpTypePointer Function %int
+         %55 = OpConstantNull %int
+    %float_0 = OpConstant %float 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+         %83 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %84 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %85 = OpTypeFunction %void %main_out
+   %func_f1_ = OpFunction %float None %15
+          %x = OpFunctionParameter %_ptr_Function_float
+         %19 = OpLabel
+         %21 = OpLoad %float %x
+         %23 = OpFOrdGreaterThan %bool %21 %float_5
+               OpSelectionMerge %25 None
+               OpBranchConditional %23 %26 %25
+         %26 = OpLabel
+         %30 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %31 = OpLoad %float %30
+         %33 = OpFOrdLessThan %bool %31 %float_0_5
+               OpSelectionMerge %34 None
+               OpBranchConditional %33 %35 %36
+         %35 = OpLabel
+               OpKill
+         %36 = OpLabel
+         %38 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %39 = OpLoad %float %38
+         %40 = OpFOrdLessThan %bool %39 %float_0_5
+               OpSelectionMerge %41 None
+               OpBranchConditional %40 %42 %41
+         %42 = OpLabel
+               OpKill
+         %41 = OpLabel
+               OpBranch %34
+         %34 = OpLabel
+               OpBranch %25
+         %25 = OpLabel
+         %44 = OpLoad %float %x
+         %46 = OpFAdd %float %44 %float_1
+               OpReturnValue %46
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %47
+         %50 = OpLabel
+          %f = OpVariable %_ptr_Function_float Function %52
+          %i = OpVariable %_ptr_Function_int Function %55
+      %param = OpVariable %_ptr_Function_float Function %52
+               OpStore %f %float_0
+               OpStore %i %int_0
+               OpBranch %59
+         %59 = OpLabel
+               OpLoopMerge %60 %61 None
+               OpBranch %62
+         %62 = OpLabel
+         %63 = OpLoad %int %i
+         %65 = OpAccessChain %_ptr_Uniform_int %x_10 %uint_0
+         %66 = OpLoad %int %65
+         %67 = OpSLessThan %bool %63 %66
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %70
+         %69 = OpLabel
+               OpBranch %68
+         %70 = OpLabel
+               OpBranch %60
+         %68 = OpLabel
+               OpBranch %61
+         %61 = OpLabel
+         %71 = OpLoad %int %i
+         %72 = OpConvertSToF %float %71
+               OpStore %param %72
+         %73 = OpFunctionCall %float %func_f1_ %param
+               OpStore %f %73
+         %75 = OpLoad %int %i
+         %77 = OpIAdd %int %75 %int_1
+               OpStore %i %77
+               OpBranch %59
+         %60 = OpLabel
+         %78 = OpLoad %float %f
+         %79 = OpFOrdEqual %bool %78 %float_5
+               OpSelectionMerge %80 None
+               OpBranchConditional %79 %81 %82
+         %81 = OpLabel
+               OpStore %x_GLF_color %83
+               OpBranch %80
+         %82 = OpLabel
+               OpStore %x_GLF_color %84
+               OpBranch %80
+         %80 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %85
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %89 = OpLabel
+         %90 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %90
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %47
+         %92 = OpLabel
+         %93 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %93
+         %94 = OpFunctionCall %void %main_1
+         %96 = OpLoad %v4float %x_GLF_color
+         %97 = OpCompositeConstruct %main_out %96
+         %95 = OpFunctionCall %void %tint_symbol_3 %97
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-two-branches/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-two-branches/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..d25c0e5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-wrap-op-kill-two-branches/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,71 @@
+[[block]]
+struct buf0 {
+  five : i32;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_f1_(x : ptr<function, f32>) -> f32 {
+  let x_56 : f32 = *(x);
+  if ((x_56 > 5.0)) {
+    let x_61 : f32 = gl_FragCoord.x;
+    if ((x_61 < 0.5)) {
+      discard;
+    } else {
+      let x_67 : f32 = gl_FragCoord.y;
+      if ((x_67 < 0.5)) {
+        discard;
+      }
+    }
+  }
+  let x_71 : f32 = *(x);
+  return (x_71 + 1.0);
+}
+
+fn main_1() {
+  var f : f32;
+  var i : i32;
+  var param : f32;
+  f = 0.0;
+  i = 0;
+  loop {
+    let x_39 : i32 = i;
+    let x_41 : i32 = x_10.five;
+    if ((x_39 < x_41)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_45 : i32 = i;
+      param = f32(x_45);
+      let x_47 : f32 = func_f1_(&(param));
+      f = x_47;
+      let x_48 : i32 = i;
+      i = (x_48 + 1);
+    }
+  }
+  let x_50 : f32 = f;
+  if ((x_50 == 5.0)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.spvasm
new file mode 100644
index 0000000..97dd177
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.spvasm
@@ -0,0 +1,112 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %m32 "m32"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %sums "sums"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%mat3v2float = OpTypeMatrix %v2float 3
+%_ptr_Function_mat3v2float = OpTypePointer Function %mat3v2float
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_0 = OpConstant %float 0
+      %int_3 = OpConstant %int 3
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+%_ptr_Function_float = OpTypePointer Function %float
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+%_ptr_Function__arr_float_uint_3 = OpTypePointer Function %_arr_float_uint_3
+      %int_2 = OpConstant %int 2
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %37 = OpConstantComposite %v2float %float_0 %float_0
+       %main = OpFunction %void None %13
+         %38 = OpLabel
+        %m32 = OpVariable %_ptr_Function_mat3v2float Function
+       %sums = OpVariable %_ptr_Function__arr_float_uint_3 Function
+         %39 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %40 = OpLoad %float %39
+         %41 = OpCompositeConstruct %v2float %40 %float_0
+         %42 = OpCompositeConstruct %v2float %float_0 %40
+         %43 = OpCompositeConstruct %mat3v2float %41 %42 %37
+               OpStore %m32 %43
+         %44 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %45 = OpLoad %int %44
+         %46 = OpIEqual %bool %45 %int_1
+               OpSelectionMerge %47 None
+               OpBranchConditional %46 %48 %47
+         %48 = OpLabel
+         %49 = OpAccessChain %_ptr_Function_float %m32 %int_3 %45
+               OpStore %49 %40
+               OpBranch %47
+         %47 = OpLabel
+         %50 = OpCompositeConstruct %_arr_float_uint_3 %40 %40 %40
+               OpStore %sums %50
+               OpBranch %51
+         %51 = OpLabel
+         %52 = OpPhi %int %45 %47 %53 %54
+         %55 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %56 = OpLoad %int %55
+         %57 = OpSLessThan %bool %52 %56
+               OpLoopMerge %58 %54 None
+               OpBranchConditional %57 %54 %58
+         %54 = OpLabel
+         %59 = OpAccessChain %_ptr_Function_float %m32 %52 %45
+         %60 = OpLoad %float %59
+         %61 = OpAccessChain %_ptr_Function_float %sums %56
+         %62 = OpLoad %float %61
+         %63 = OpFAdd %float %62 %60
+               OpStore %61 %63
+         %53 = OpIAdd %int %52 %int_1
+               OpBranch %51
+         %58 = OpLabel
+         %64 = OpAccessChain %_ptr_Function_float %sums %45
+         %65 = OpLoad %float %64
+         %66 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %67 = OpLoad %float %66
+         %68 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %69 = OpLoad %int %68
+         %70 = OpAccessChain %_ptr_Function_float %sums %69
+         %71 = OpLoad %float %70
+         %72 = OpCompositeConstruct %v4float %65 %67 %67 %71
+               OpStore %_GLF_color %72
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.spvasm.expected.hlsl
new file mode 100755
index 0000000..db312d4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.spvasm.expected.hlsl
@@ -0,0 +1,72 @@
+SKIP: FAILED
+
+void set_float2(inout float2 vec, int idx, float val) {
+  vec = (idx.xx == int2(0, 1)) ? val.xx : vec;
+}
+
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[2];
+};
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float3x2 m32 = float3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  float sums[3] = (float[3])0;
+  int x_52_phi = 0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_40 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  m32 = float3x2(float2(x_40, 0.0f), float2(0.0f, x_40), float2(0.0f, 0.0f));
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_45 = asint(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_45 == 1)) {
+    set_float2(m32[3], x_45, x_40);
+  }
+  const float tint_symbol_4[3] = {x_40, x_40, x_40};
+  sums = tint_symbol_4;
+  x_52_phi = x_45;
+  while (true) {
+    int x_53 = 0;
+    const int x_52 = x_52_phi;
+    const int x_56 = asint(x_8[2].x);
+    if ((x_52 < x_56)) {
+    } else {
+      break;
+    }
+    {
+      const float x_60 = m32[x_52][x_45];
+      const int x_61_save = x_56;
+      const float x_62 = sums[x_61_save];
+      sums[x_61_save] = (x_62 + x_60);
+      x_53 = (x_52 + 1);
+      x_52_phi = x_53;
+    }
+  }
+  const float x_65 = sums[x_45];
+  const float x_67 = asfloat(x_6[1].x);
+  const int x_69 = asint(x_8[1].x);
+  const float x_71 = sums[x_69];
+  x_GLF_color = float4(x_65, x_67, x_67, x_71);
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
+T:\tmp\u93g.0:23:20: error: matrix row index '3' is out of bounds
+    set_float2(m32[3], x_45, x_40);
+                   ^
+
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.spvasm.expected.msl
new file mode 100644
index 0000000..852c328
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.spvasm.expected.msl
@@ -0,0 +1,79 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_2 {
+  float arr[3];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_8, thread float4* const tint_symbol_5) {
+  float3x2 m32 = float3x2(0.0f);
+  tint_array_wrapper_2 sums = {};
+  int x_52_phi = 0;
+  float const x_40 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  m32 = float3x2(float2(x_40, 0.0f), float2(0.0f, x_40), float2(0.0f, 0.0f));
+  int const x_45 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  if ((x_45 == 1)) {
+    m32[3][x_45] = x_40;
+  }
+  tint_array_wrapper_2 const tint_symbol_3 = {.arr={x_40, x_40, x_40}};
+  sums = tint_symbol_3;
+  x_52_phi = x_45;
+  while (true) {
+    int x_53 = 0;
+    int const x_52 = x_52_phi;
+    int const x_56 = x_8.x_GLF_uniform_int_values.arr[2].el;
+    if ((x_52 < x_56)) {
+    } else {
+      break;
+    }
+    {
+      float const x_60 = m32[x_52][x_45];
+      int const x_61_save = x_56;
+      float const x_62 = sums.arr[x_61_save];
+      sums.arr[x_61_save] = (x_62 + x_60);
+      x_53 = (x_52 + 1);
+      x_52_phi = x_53;
+    }
+  }
+  float const x_65 = sums.arr[x_45];
+  float const x_67 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  int const x_69 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  float const x_71 = sums.arr[x_69];
+  *(tint_symbol_5) = float4(x_65, x_67, x_67, x_71);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_6, x_8, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..47ebb6d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.spvasm.expected.spvasm
@@ -0,0 +1,168 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 100
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %m32 "m32"
+               OpName %sums "sums"
+               OpName %x_52_phi "x_52_phi"
+               OpName %x_53 "x_53"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%mat3v2float = OpTypeMatrix %v2float 3
+%_ptr_Function_mat3v2float = OpTypePointer Function %mat3v2float
+         %28 = OpConstantNull %mat3v2float
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+%_ptr_Function__arr_float_uint_3 = OpTypePointer Function %_arr_float_uint_3
+         %32 = OpConstantNull %_arr_float_uint_3
+%_ptr_Function_int = OpTypePointer Function %int
+         %35 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_0 = OpConstant %float 0
+         %44 = OpConstantComposite %v2float %float_0 %float_0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+         %88 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+        %m32 = OpVariable %_ptr_Function_mat3v2float Function %28
+       %sums = OpVariable %_ptr_Function__arr_float_uint_3 Function %32
+   %x_52_phi = OpVariable %_ptr_Function_int Function %35
+       %x_53 = OpVariable %_ptr_Function_int Function %35
+         %39 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %40 = OpLoad %float %39
+         %42 = OpCompositeConstruct %v2float %40 %float_0
+         %43 = OpCompositeConstruct %v2float %float_0 %40
+         %45 = OpCompositeConstruct %mat3v2float %42 %43 %44
+               OpStore %m32 %45
+         %47 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %48 = OpLoad %int %47
+         %50 = OpIEqual %bool %48 %int_1
+               OpSelectionMerge %52 None
+               OpBranchConditional %50 %53 %52
+         %53 = OpLabel
+         %56 = OpAccessChain %_ptr_Function_float %m32 %int_3 %48
+               OpStore %56 %40
+               OpBranch %52
+         %52 = OpLabel
+         %57 = OpCompositeConstruct %_arr_float_uint_3 %40 %40 %40
+               OpStore %sums %57
+               OpStore %x_52_phi %48
+               OpBranch %58
+         %58 = OpLabel
+               OpLoopMerge %59 %60 None
+               OpBranch %61
+         %61 = OpLabel
+         %63 = OpLoad %int %x_52_phi
+         %65 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+         %66 = OpLoad %int %65
+         %67 = OpSLessThan %bool %63 %66
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %70
+         %69 = OpLabel
+               OpBranch %68
+         %70 = OpLabel
+               OpBranch %59
+         %68 = OpLabel
+               OpBranch %60
+         %60 = OpLabel
+         %71 = OpAccessChain %_ptr_Function_float %m32 %63 %48
+         %72 = OpLoad %float %71
+         %73 = OpAccessChain %_ptr_Function_float %sums %66
+         %74 = OpLoad %float %73
+         %75 = OpAccessChain %_ptr_Function_float %sums %66
+         %76 = OpFAdd %float %74 %72
+               OpStore %75 %76
+         %77 = OpIAdd %int %63 %int_1
+               OpStore %x_53 %77
+         %78 = OpLoad %int %x_53
+               OpStore %x_52_phi %78
+               OpBranch %58
+         %59 = OpLabel
+         %79 = OpAccessChain %_ptr_Function_float %sums %48
+         %80 = OpLoad %float %79
+         %81 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %82 = OpLoad %float %81
+         %83 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %84 = OpLoad %int %83
+         %85 = OpAccessChain %_ptr_Function_float %sums %84
+         %86 = OpLoad %float %85
+         %87 = OpCompositeConstruct %v4float %80 %82 %82 %86
+               OpStore %x_GLF_color %87
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %88
+%tint_symbol = OpFunctionParameter %main_out
+         %92 = OpLabel
+         %93 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %93
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+         %95 = OpLabel
+         %96 = OpFunctionCall %void %main_1
+         %98 = OpLoad %v4float %x_GLF_color
+         %99 = OpCompositeConstruct %main_out %98
+         %97 = OpFunctionCall %void %tint_symbol_2 %99
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..712a69e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.spvasm.expected.wgsl
@@ -0,0 +1,68 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m32 : mat3x2<f32>;
+  var sums : array<f32, 3>;
+  var x_52_phi : i32;
+  let x_40 : f32 = x_6.x_GLF_uniform_float_values[0];
+  m32 = mat3x2<f32>(vec2<f32>(x_40, 0.0), vec2<f32>(0.0, x_40), vec2<f32>(0.0, 0.0));
+  let x_45 : i32 = x_8.x_GLF_uniform_int_values[0];
+  if ((x_45 == 1)) {
+    m32[3][x_45] = x_40;
+  }
+  sums = array<f32, 3>(x_40, x_40, x_40);
+  x_52_phi = x_45;
+  loop {
+    var x_53 : i32;
+    let x_52 : i32 = x_52_phi;
+    let x_56 : i32 = x_8.x_GLF_uniform_int_values[2];
+    if ((x_52 < x_56)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_60 : f32 = m32[x_52][x_45];
+      let x_61 : ptr<function, f32> = &(sums[x_56]);
+      let x_62 : f32 = *(x_61);
+      *(x_61) = (x_62 + x_60);
+      x_53 = (x_52 + 1);
+      x_52_phi = x_53;
+    }
+  }
+  let x_65 : f32 = sums[x_45];
+  let x_67 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_69 : i32 = x_8.x_GLF_uniform_int_values[1];
+  let x_71 : f32 = sums[x_69];
+  x_GLF_color = vec4<f32>(x_65, x_67, x_67, x_71);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.wgsl
new file mode 100644
index 0000000..712a69e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.wgsl
@@ -0,0 +1,68 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m32 : mat3x2<f32>;
+  var sums : array<f32, 3>;
+  var x_52_phi : i32;
+  let x_40 : f32 = x_6.x_GLF_uniform_float_values[0];
+  m32 = mat3x2<f32>(vec2<f32>(x_40, 0.0), vec2<f32>(0.0, x_40), vec2<f32>(0.0, 0.0));
+  let x_45 : i32 = x_8.x_GLF_uniform_int_values[0];
+  if ((x_45 == 1)) {
+    m32[3][x_45] = x_40;
+  }
+  sums = array<f32, 3>(x_40, x_40, x_40);
+  x_52_phi = x_45;
+  loop {
+    var x_53 : i32;
+    let x_52 : i32 = x_52_phi;
+    let x_56 : i32 = x_8.x_GLF_uniform_int_values[2];
+    if ((x_52 < x_56)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_60 : f32 = m32[x_52][x_45];
+      let x_61 : ptr<function, f32> = &(sums[x_56]);
+      let x_62 : f32 = *(x_61);
+      *(x_61) = (x_62 + x_60);
+      x_53 = (x_52 + 1);
+      x_52_phi = x_53;
+    }
+  }
+  let x_65 : f32 = sums[x_45];
+  let x_67 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_69 : i32 = x_8.x_GLF_uniform_int_values[1];
+  let x_71 : f32 = sums[x_69];
+  x_GLF_color = vec4<f32>(x_65, x_67, x_67, x_71);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.wgsl.expected.hlsl
new file mode 100755
index 0000000..3ba9bc4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.wgsl.expected.hlsl
@@ -0,0 +1,72 @@
+SKIP: FAILED
+
+void set_float2(inout float2 vec, int idx, float val) {
+  vec = (idx.xx == int2(0, 1)) ? val.xx : vec;
+}
+
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[2];
+};
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[3];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float3x2 m32 = float3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  float sums[3] = (float[3])0;
+  int x_52_phi = 0;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const float x_40 = asfloat(x_6[scalar_offset / 4][scalar_offset % 4]);
+  m32 = float3x2(float2(x_40, 0.0f), float2(0.0f, x_40), float2(0.0f, 0.0f));
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const int x_45 = asint(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  if ((x_45 == 1)) {
+    set_float2(m32[3], x_45, x_40);
+  }
+  const float tint_symbol_4[3] = {x_40, x_40, x_40};
+  sums = tint_symbol_4;
+  x_52_phi = x_45;
+  while (true) {
+    int x_53 = 0;
+    const int x_52 = x_52_phi;
+    const int x_56 = asint(x_8[2].x);
+    if ((x_52 < x_56)) {
+    } else {
+      break;
+    }
+    {
+      const float x_60 = m32[x_52][x_45];
+      const int x_61_save = x_56;
+      const float x_62 = sums[x_61_save];
+      sums[x_61_save] = (x_62 + x_60);
+      x_53 = (x_52 + 1);
+      x_52_phi = x_53;
+    }
+  }
+  const float x_65 = sums[x_45];
+  const float x_67 = asfloat(x_6[1].x);
+  const int x_69 = asint(x_8[1].x);
+  const float x_71 = sums[x_69];
+  x_GLF_color = float4(x_65, x_67, x_67, x_71);
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
+T:\tmp\uffo.0:23:20: error: matrix row index '3' is out of bounds
+    set_float2(m32[3], x_45, x_40);
+                   ^
+
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.wgsl.expected.msl
new file mode 100644
index 0000000..852c328
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.wgsl.expected.msl
@@ -0,0 +1,79 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[3];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_2 {
+  float arr[3];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_8, thread float4* const tint_symbol_5) {
+  float3x2 m32 = float3x2(0.0f);
+  tint_array_wrapper_2 sums = {};
+  int x_52_phi = 0;
+  float const x_40 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  m32 = float3x2(float2(x_40, 0.0f), float2(0.0f, x_40), float2(0.0f, 0.0f));
+  int const x_45 = x_8.x_GLF_uniform_int_values.arr[0].el;
+  if ((x_45 == 1)) {
+    m32[3][x_45] = x_40;
+  }
+  tint_array_wrapper_2 const tint_symbol_3 = {.arr={x_40, x_40, x_40}};
+  sums = tint_symbol_3;
+  x_52_phi = x_45;
+  while (true) {
+    int x_53 = 0;
+    int const x_52 = x_52_phi;
+    int const x_56 = x_8.x_GLF_uniform_int_values.arr[2].el;
+    if ((x_52 < x_56)) {
+    } else {
+      break;
+    }
+    {
+      float const x_60 = m32[x_52][x_45];
+      int const x_61_save = x_56;
+      float const x_62 = sums.arr[x_61_save];
+      sums.arr[x_61_save] = (x_62 + x_60);
+      x_53 = (x_52 + 1);
+      x_52_phi = x_53;
+    }
+  }
+  float const x_65 = sums.arr[x_45];
+  float const x_67 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  int const x_69 = x_8.x_GLF_uniform_int_values.arr[1].el;
+  float const x_71 = sums.arr[x_69];
+  *(tint_symbol_5) = float4(x_65, x_67, x_67, x_71);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_6, x_8, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..47ebb6d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.wgsl.expected.spvasm
@@ -0,0 +1,168 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 100
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %m32 "m32"
+               OpName %sums "sums"
+               OpName %x_52_phi "x_52_phi"
+               OpName %x_53 "x_53"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_3 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+     %uint_3 = OpConstant %uint 3
+%_arr_int_uint_3 = OpTypeArray %int %uint_3
+       %buf0 = OpTypeStruct %_arr_int_uint_3
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%mat3v2float = OpTypeMatrix %v2float 3
+%_ptr_Function_mat3v2float = OpTypePointer Function %mat3v2float
+         %28 = OpConstantNull %mat3v2float
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+%_ptr_Function__arr_float_uint_3 = OpTypePointer Function %_arr_float_uint_3
+         %32 = OpConstantNull %_arr_float_uint_3
+%_ptr_Function_int = OpTypePointer Function %int
+         %35 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_0 = OpConstant %float 0
+         %44 = OpConstantComposite %v2float %float_0 %float_0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+         %88 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+        %m32 = OpVariable %_ptr_Function_mat3v2float Function %28
+       %sums = OpVariable %_ptr_Function__arr_float_uint_3 Function %32
+   %x_52_phi = OpVariable %_ptr_Function_int Function %35
+       %x_53 = OpVariable %_ptr_Function_int Function %35
+         %39 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %40 = OpLoad %float %39
+         %42 = OpCompositeConstruct %v2float %40 %float_0
+         %43 = OpCompositeConstruct %v2float %float_0 %40
+         %45 = OpCompositeConstruct %mat3v2float %42 %43 %44
+               OpStore %m32 %45
+         %47 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_0
+         %48 = OpLoad %int %47
+         %50 = OpIEqual %bool %48 %int_1
+               OpSelectionMerge %52 None
+               OpBranchConditional %50 %53 %52
+         %53 = OpLabel
+         %56 = OpAccessChain %_ptr_Function_float %m32 %int_3 %48
+               OpStore %56 %40
+               OpBranch %52
+         %52 = OpLabel
+         %57 = OpCompositeConstruct %_arr_float_uint_3 %40 %40 %40
+               OpStore %sums %57
+               OpStore %x_52_phi %48
+               OpBranch %58
+         %58 = OpLabel
+               OpLoopMerge %59 %60 None
+               OpBranch %61
+         %61 = OpLabel
+         %63 = OpLoad %int %x_52_phi
+         %65 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_2
+         %66 = OpLoad %int %65
+         %67 = OpSLessThan %bool %63 %66
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %70
+         %69 = OpLabel
+               OpBranch %68
+         %70 = OpLabel
+               OpBranch %59
+         %68 = OpLabel
+               OpBranch %60
+         %60 = OpLabel
+         %71 = OpAccessChain %_ptr_Function_float %m32 %63 %48
+         %72 = OpLoad %float %71
+         %73 = OpAccessChain %_ptr_Function_float %sums %66
+         %74 = OpLoad %float %73
+         %75 = OpAccessChain %_ptr_Function_float %sums %66
+         %76 = OpFAdd %float %74 %72
+               OpStore %75 %76
+         %77 = OpIAdd %int %63 %int_1
+               OpStore %x_53 %77
+         %78 = OpLoad %int %x_53
+               OpStore %x_52_phi %78
+               OpBranch %58
+         %59 = OpLabel
+         %79 = OpAccessChain %_ptr_Function_float %sums %48
+         %80 = OpLoad %float %79
+         %81 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %82 = OpLoad %float %81
+         %83 = OpAccessChain %_ptr_Uniform_int %x_8 %uint_0 %int_1
+         %84 = OpLoad %int %83
+         %85 = OpAccessChain %_ptr_Function_float %sums %84
+         %86 = OpLoad %float %85
+         %87 = OpCompositeConstruct %v4float %80 %82 %82 %86
+               OpStore %x_GLF_color %87
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %88
+%tint_symbol = OpFunctionParameter %main_out
+         %92 = OpLabel
+         %93 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %93
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+         %95 = OpLabel
+         %96 = OpFunctionCall %void %main_1
+         %98 = OpLoad %v4float %x_GLF_color
+         %99 = OpCompositeConstruct %main_out %98
+         %97 = OpFunctionCall %void %tint_symbol_2 %99
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..712a69e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-write-past-matrix-elements-unused/0.wgsl.expected.wgsl
@@ -0,0 +1,68 @@
+type Arr = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 3>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m32 : mat3x2<f32>;
+  var sums : array<f32, 3>;
+  var x_52_phi : i32;
+  let x_40 : f32 = x_6.x_GLF_uniform_float_values[0];
+  m32 = mat3x2<f32>(vec2<f32>(x_40, 0.0), vec2<f32>(0.0, x_40), vec2<f32>(0.0, 0.0));
+  let x_45 : i32 = x_8.x_GLF_uniform_int_values[0];
+  if ((x_45 == 1)) {
+    m32[3][x_45] = x_40;
+  }
+  sums = array<f32, 3>(x_40, x_40, x_40);
+  x_52_phi = x_45;
+  loop {
+    var x_53 : i32;
+    let x_52 : i32 = x_52_phi;
+    let x_56 : i32 = x_8.x_GLF_uniform_int_values[2];
+    if ((x_52 < x_56)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_60 : f32 = m32[x_52][x_45];
+      let x_61 : ptr<function, f32> = &(sums[x_56]);
+      let x_62 : f32 = *(x_61);
+      *(x_61) = (x_62 + x_60);
+      x_53 = (x_52 + 1);
+      x_52_phi = x_53;
+    }
+  }
+  let x_65 : f32 = sums[x_45];
+  let x_67 : f32 = x_6.x_GLF_uniform_float_values[1];
+  let x_69 : i32 = x_8.x_GLF_uniform_int_values[1];
+  let x_71 : f32 = sums[x_69];
+  x_GLF_color = vec4<f32>(x_65, x_67, x_67, x_71);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-apfloat-nan-cos-cos/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-apfloat-nan-cos-cos/0-opt.spvasm
new file mode 100644
index 0000000..a176ba5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-apfloat-nan-cos-cos/0-opt.spvasm
@@ -0,0 +1,113 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %v1 "v1"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+        %int = OpTypeInt 32 1
+     %int_n1 = OpConstant %int -1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %v2int = OpTypeVector %int 2
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+       %bool = OpTypeBool
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+       %main = OpFunction %void None %12
+         %33 = OpLabel
+         %v1 = OpVariable %_ptr_Function_v2float Function
+         %34 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %35 = OpLoad %int %34
+         %36 = OpCompositeConstruct %v2int %int_n1 %35
+         %37 = OpBitcast %v2float %36
+         %38 = OpExtInst %v2float %1 Cos %37
+         %39 = OpExtInst %v2float %1 Cos %38
+               OpStore %v1 %39
+         %40 = OpAccessChain %_ptr_Function_float %v1 %uint_0
+         %41 = OpLoad %float %40
+         %42 = OpCompositeConstruct %v4float %41 %41 %41 %41
+               OpStore %_GLF_color %42
+         %43 = OpAccessChain %_ptr_Function_float %v1 %uint_1
+         %44 = OpLoad %float %43
+         %45 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %46 = OpLoad %float %45
+         %47 = OpFOrdGreaterThan %bool %44 %46
+               OpSelectionMerge %48 None
+               OpBranchConditional %47 %49 %48
+         %49 = OpLabel
+         %50 = OpAccessChain %_ptr_Function_float %v1 %uint_1
+         %51 = OpLoad %float %50
+         %52 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_1
+         %53 = OpLoad %float %52
+         %54 = OpFOrdLessThan %bool %51 %53
+               OpBranch %48
+         %48 = OpLabel
+         %55 = OpPhi %bool %47 %33 %54 %49
+               OpSelectionMerge %56 None
+               OpBranchConditional %55 %57 %58
+         %57 = OpLabel
+         %59 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %60 = OpLoad %int %59
+         %61 = OpConvertSToF %float %60
+         %62 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %63 = OpLoad %int %62
+         %64 = OpConvertSToF %float %63
+         %65 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %66 = OpLoad %int %65
+         %67 = OpConvertSToF %float %66
+         %68 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %69 = OpLoad %int %68
+         %70 = OpConvertSToF %float %69
+         %71 = OpCompositeConstruct %v4float %61 %64 %67 %70
+               OpStore %_GLF_color %71
+               OpBranch %56
+         %58 = OpLabel
+         %72 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %73 = OpLoad %int %72
+         %74 = OpConvertSToF %float %73
+         %75 = OpCompositeConstruct %v4float %74 %74 %74 %74
+               OpStore %_GLF_color %75
+               OpBranch %56
+         %56 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-apfloat-nan-cos-cos/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-apfloat-nan-cos-cos/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..bb3eeaf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-apfloat-nan-cos-cos/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,68 @@
+SKIP: FAILED
+
+
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+fn main_1() {
+  var v1 : vec2<f32>;
+  var x_54 : bool;
+  var x_55_phi : bool;
+  let x_35 : i32 = x_6.x_GLF_uniform_int_values[0];
+  v1 = cos(cos(bitcast<vec2<f32>>(vec2<i32>(-1, x_35))));
+  let x_41 : f32 = v1.x;
+  x_GLF_color = vec4<f32>(x_41, x_41, x_41, x_41);
+  let x_44 : f32 = v1.y;
+  let x_46 : f32 = x_8.x_GLF_uniform_float_values[0];
+  let x_47 : bool = (x_44 > x_46);
+  x_55_phi = x_47;
+  if (x_47) {
+    let x_51 : f32 = v1.y;
+    let x_53 : f32 = x_8.x_GLF_uniform_float_values[1];
+    x_54 = (x_51 < x_53);
+    x_55_phi = x_54;
+  }
+  let x_55 : bool = x_55_phi;
+  if (x_55) {
+    let x_60 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_63 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_66 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_69 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_60), f32(x_63), f32(x_66), f32(x_69));
+  } else {
+    let x_73 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_74 : f32 = f32(x_73);
+    x_GLF_color = vec4<f32>(x_74, x_74, x_74, x_74);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+Failed to generate: error: Unable to do bitcast to type __vec_2__f32
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-apfloat-nan-cos-cos/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-apfloat-nan-cos-cos/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..4ef589f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-apfloat-nan-cos-cos/0-opt.spvasm.expected.msl
@@ -0,0 +1,71 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_8, thread float4* const tint_symbol_4) {
+  float2 v1 = 0.0f;
+  bool x_54 = false;
+  bool x_55_phi = false;
+  int const x_35 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  v1 = cos(cos(as_type<float2>(int2(-1, x_35))));
+  float const x_41 = v1.x;
+  *(tint_symbol_4) = float4(x_41, x_41, x_41, x_41);
+  float const x_44 = v1.y;
+  float const x_46 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  bool const x_47 = (x_44 > x_46);
+  x_55_phi = x_47;
+  if (x_47) {
+    float const x_51 = v1.y;
+    float const x_53 = x_8.x_GLF_uniform_float_values.arr[1].el;
+    x_54 = (x_51 < x_53);
+    x_55_phi = x_54;
+  }
+  bool const x_55 = x_55_phi;
+  if (x_55) {
+    int const x_60 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_63 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_66 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_69 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_60), float(x_63), float(x_66), float(x_69));
+  } else {
+    int const x_73 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    float const x_74 = float(x_73);
+    *(tint_symbol_4) = float4(x_74, x_74, x_74, x_74);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_8 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-apfloat-nan-cos-cos/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-apfloat-nan-cos-cos/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..43172e9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-apfloat-nan-cos-cos/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,157 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 97
+; Schema: 0
+               OpCapability Shader
+         %38 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v1 "v1"
+               OpName %x_54 "x_54"
+               OpName %x_55_phi "x_55_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %26 = OpConstantNull %v2float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %30 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %v2int = OpTypeVector %int 2
+     %int_n1 = OpConstant %int -1
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %85 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+         %v1 = OpVariable %_ptr_Function_v2float Function %26
+       %x_54 = OpVariable %_ptr_Function_bool Function %30
+   %x_55_phi = OpVariable %_ptr_Function_bool Function %30
+         %35 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %36 = OpLoad %int %35
+         %43 = OpCompositeConstruct %v2int %int_n1 %36
+         %40 = OpBitcast %v2float %43
+         %39 = OpExtInst %v2float %38 Cos %40
+         %37 = OpExtInst %v2float %38 Cos %39
+               OpStore %v1 %37
+         %45 = OpAccessChain %_ptr_Function_float %v1 %uint_0
+         %46 = OpLoad %float %45
+         %47 = OpCompositeConstruct %v4float %46 %46 %46 %46
+               OpStore %x_GLF_color %47
+         %49 = OpAccessChain %_ptr_Function_float %v1 %uint_1
+         %50 = OpLoad %float %49
+         %52 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %53 = OpLoad %float %52
+         %54 = OpFOrdGreaterThan %bool %50 %53
+               OpStore %x_55_phi %54
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %55
+         %56 = OpLabel
+         %57 = OpAccessChain %_ptr_Function_float %v1 %uint_1
+         %58 = OpLoad %float %57
+         %60 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+         %61 = OpLoad %float %60
+         %62 = OpFOrdLessThan %bool %58 %61
+               OpStore %x_54 %62
+         %63 = OpLoad %bool %x_54
+               OpStore %x_55_phi %63
+               OpBranch %55
+         %55 = OpLabel
+         %64 = OpLoad %bool %x_55_phi
+               OpSelectionMerge %65 None
+               OpBranchConditional %64 %66 %67
+         %66 = OpLabel
+         %68 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %69 = OpLoad %int %68
+         %70 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %71 = OpLoad %int %70
+         %72 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %73 = OpLoad %int %72
+         %74 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %75 = OpLoad %int %74
+         %76 = OpConvertSToF %float %69
+         %77 = OpConvertSToF %float %71
+         %78 = OpConvertSToF %float %73
+         %79 = OpConvertSToF %float %75
+         %80 = OpCompositeConstruct %v4float %76 %77 %78 %79
+               OpStore %x_GLF_color %80
+               OpBranch %65
+         %67 = OpLabel
+         %81 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %82 = OpLoad %int %81
+         %83 = OpConvertSToF %float %82
+         %84 = OpCompositeConstruct %v4float %83 %83 %83 %83
+               OpStore %x_GLF_color %84
+               OpBranch %65
+         %65 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %85
+%tint_symbol = OpFunctionParameter %main_out
+         %89 = OpLabel
+         %90 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %90
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+         %92 = OpLabel
+         %93 = OpFunctionCall %void %main_1
+         %95 = OpLoad %v4float %x_GLF_color
+         %96 = OpCompositeConstruct %main_out %95
+         %94 = OpFunctionCall %void %tint_symbol_2 %96
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-apfloat-nan-cos-cos/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-apfloat-nan-cos-cos/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..5e5c216
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-apfloat-nan-cos-cos/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,63 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+fn main_1() {
+  var v1 : vec2<f32>;
+  var x_54 : bool;
+  var x_55_phi : bool;
+  let x_35 : i32 = x_6.x_GLF_uniform_int_values[0];
+  v1 = cos(cos(bitcast<vec2<f32>>(vec2<i32>(-1, x_35))));
+  let x_41 : f32 = v1.x;
+  x_GLF_color = vec4<f32>(x_41, x_41, x_41, x_41);
+  let x_44 : f32 = v1.y;
+  let x_46 : f32 = x_8.x_GLF_uniform_float_values[0];
+  let x_47 : bool = (x_44 > x_46);
+  x_55_phi = x_47;
+  if (x_47) {
+    let x_51 : f32 = v1.y;
+    let x_53 : f32 = x_8.x_GLF_uniform_float_values[1];
+    x_54 = (x_51 < x_53);
+    x_55_phi = x_54;
+  }
+  let x_55 : bool = x_55_phi;
+  if (x_55) {
+    let x_60 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_63 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_66 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_69 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_60), f32(x_63), f32(x_66), f32(x_69));
+  } else {
+    let x_73 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_74 : f32 = f32(x_73);
+    x_GLF_color = vec4<f32>(x_74, x_74, x_74, x_74);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-apfloat-nan-cos-cos/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-apfloat-nan-cos-cos/0-opt.wgsl
new file mode 100644
index 0000000..5e5c216
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-apfloat-nan-cos-cos/0-opt.wgsl
@@ -0,0 +1,63 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+fn main_1() {
+  var v1 : vec2<f32>;
+  var x_54 : bool;
+  var x_55_phi : bool;
+  let x_35 : i32 = x_6.x_GLF_uniform_int_values[0];
+  v1 = cos(cos(bitcast<vec2<f32>>(vec2<i32>(-1, x_35))));
+  let x_41 : f32 = v1.x;
+  x_GLF_color = vec4<f32>(x_41, x_41, x_41, x_41);
+  let x_44 : f32 = v1.y;
+  let x_46 : f32 = x_8.x_GLF_uniform_float_values[0];
+  let x_47 : bool = (x_44 > x_46);
+  x_55_phi = x_47;
+  if (x_47) {
+    let x_51 : f32 = v1.y;
+    let x_53 : f32 = x_8.x_GLF_uniform_float_values[1];
+    x_54 = (x_51 < x_53);
+    x_55_phi = x_54;
+  }
+  let x_55 : bool = x_55_phi;
+  if (x_55) {
+    let x_60 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_63 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_66 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_69 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_60), f32(x_63), f32(x_66), f32(x_69));
+  } else {
+    let x_73 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_74 : f32 = f32(x_73);
+    x_GLF_color = vec4<f32>(x_74, x_74, x_74, x_74);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-apfloat-nan-cos-cos/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-apfloat-nan-cos-cos/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..bb3eeaf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-apfloat-nan-cos-cos/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,68 @@
+SKIP: FAILED
+
+
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+fn main_1() {
+  var v1 : vec2<f32>;
+  var x_54 : bool;
+  var x_55_phi : bool;
+  let x_35 : i32 = x_6.x_GLF_uniform_int_values[0];
+  v1 = cos(cos(bitcast<vec2<f32>>(vec2<i32>(-1, x_35))));
+  let x_41 : f32 = v1.x;
+  x_GLF_color = vec4<f32>(x_41, x_41, x_41, x_41);
+  let x_44 : f32 = v1.y;
+  let x_46 : f32 = x_8.x_GLF_uniform_float_values[0];
+  let x_47 : bool = (x_44 > x_46);
+  x_55_phi = x_47;
+  if (x_47) {
+    let x_51 : f32 = v1.y;
+    let x_53 : f32 = x_8.x_GLF_uniform_float_values[1];
+    x_54 = (x_51 < x_53);
+    x_55_phi = x_54;
+  }
+  let x_55 : bool = x_55_phi;
+  if (x_55) {
+    let x_60 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_63 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_66 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_69 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_60), f32(x_63), f32(x_66), f32(x_69));
+  } else {
+    let x_73 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_74 : f32 = f32(x_73);
+    x_GLF_color = vec4<f32>(x_74, x_74, x_74, x_74);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+Failed to generate: error: Unable to do bitcast to type __vec_2__f32
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-apfloat-nan-cos-cos/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-apfloat-nan-cos-cos/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..4ef589f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-apfloat-nan-cos-cos/0-opt.wgsl.expected.msl
@@ -0,0 +1,71 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, constant buf1& x_8, thread float4* const tint_symbol_4) {
+  float2 v1 = 0.0f;
+  bool x_54 = false;
+  bool x_55_phi = false;
+  int const x_35 = x_6.x_GLF_uniform_int_values.arr[0].el;
+  v1 = cos(cos(as_type<float2>(int2(-1, x_35))));
+  float const x_41 = v1.x;
+  *(tint_symbol_4) = float4(x_41, x_41, x_41, x_41);
+  float const x_44 = v1.y;
+  float const x_46 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  bool const x_47 = (x_44 > x_46);
+  x_55_phi = x_47;
+  if (x_47) {
+    float const x_51 = v1.y;
+    float const x_53 = x_8.x_GLF_uniform_float_values.arr[1].el;
+    x_54 = (x_51 < x_53);
+    x_55_phi = x_54;
+  }
+  bool const x_55 = x_55_phi;
+  if (x_55) {
+    int const x_60 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    int const x_63 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_66 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    int const x_69 = x_6.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_60), float(x_63), float(x_66), float(x_69));
+  } else {
+    int const x_73 = x_6.x_GLF_uniform_int_values.arr[1].el;
+    float const x_74 = float(x_73);
+    *(tint_symbol_4) = float4(x_74, x_74, x_74, x_74);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_8 [[buffer(1)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-apfloat-nan-cos-cos/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-apfloat-nan-cos-cos/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..43172e9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-apfloat-nan-cos-cos/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,157 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 97
+; Schema: 0
+               OpCapability Shader
+         %38 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %v1 "v1"
+               OpName %x_54 "x_54"
+               OpName %x_55_phi "x_55_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 1
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+       %buf1 = OpTypeStruct %_arr_float_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_8 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %26 = OpConstantNull %v2float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %30 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %v2int = OpTypeVector %int 2
+     %int_n1 = OpConstant %int -1
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %85 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %19
+         %22 = OpLabel
+         %v1 = OpVariable %_ptr_Function_v2float Function %26
+       %x_54 = OpVariable %_ptr_Function_bool Function %30
+   %x_55_phi = OpVariable %_ptr_Function_bool Function %30
+         %35 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %36 = OpLoad %int %35
+         %43 = OpCompositeConstruct %v2int %int_n1 %36
+         %40 = OpBitcast %v2float %43
+         %39 = OpExtInst %v2float %38 Cos %40
+         %37 = OpExtInst %v2float %38 Cos %39
+               OpStore %v1 %37
+         %45 = OpAccessChain %_ptr_Function_float %v1 %uint_0
+         %46 = OpLoad %float %45
+         %47 = OpCompositeConstruct %v4float %46 %46 %46 %46
+               OpStore %x_GLF_color %47
+         %49 = OpAccessChain %_ptr_Function_float %v1 %uint_1
+         %50 = OpLoad %float %49
+         %52 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %53 = OpLoad %float %52
+         %54 = OpFOrdGreaterThan %bool %50 %53
+               OpStore %x_55_phi %54
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %55
+         %56 = OpLabel
+         %57 = OpAccessChain %_ptr_Function_float %v1 %uint_1
+         %58 = OpLoad %float %57
+         %60 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_1
+         %61 = OpLoad %float %60
+         %62 = OpFOrdLessThan %bool %58 %61
+               OpStore %x_54 %62
+         %63 = OpLoad %bool %x_54
+               OpStore %x_55_phi %63
+               OpBranch %55
+         %55 = OpLabel
+         %64 = OpLoad %bool %x_55_phi
+               OpSelectionMerge %65 None
+               OpBranchConditional %64 %66 %67
+         %66 = OpLabel
+         %68 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %69 = OpLoad %int %68
+         %70 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %71 = OpLoad %int %70
+         %72 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %73 = OpLoad %int %72
+         %74 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_0
+         %75 = OpLoad %int %74
+         %76 = OpConvertSToF %float %69
+         %77 = OpConvertSToF %float %71
+         %78 = OpConvertSToF %float %73
+         %79 = OpConvertSToF %float %75
+         %80 = OpCompositeConstruct %v4float %76 %77 %78 %79
+               OpStore %x_GLF_color %80
+               OpBranch %65
+         %67 = OpLabel
+         %81 = OpAccessChain %_ptr_Uniform_int %x_6 %uint_0 %int_1
+         %82 = OpLoad %int %81
+         %83 = OpConvertSToF %float %82
+         %84 = OpCompositeConstruct %v4float %83 %83 %83 %83
+               OpStore %x_GLF_color %84
+               OpBranch %65
+         %65 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %85
+%tint_symbol = OpFunctionParameter %main_out
+         %89 = OpLabel
+         %90 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %90
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %19
+         %92 = OpLabel
+         %93 = OpFunctionCall %void %main_1
+         %95 = OpLoad %v4float %x_GLF_color
+         %96 = OpCompositeConstruct %main_out %95
+         %94 = OpFunctionCall %void %tint_symbol_2 %96
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-apfloat-nan-cos-cos/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-apfloat-nan-cos-cos/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..5e5c216
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-apfloat-nan-cos-cos/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,63 @@
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_8 : buf1;
+
+fn main_1() {
+  var v1 : vec2<f32>;
+  var x_54 : bool;
+  var x_55_phi : bool;
+  let x_35 : i32 = x_6.x_GLF_uniform_int_values[0];
+  v1 = cos(cos(bitcast<vec2<f32>>(vec2<i32>(-1, x_35))));
+  let x_41 : f32 = v1.x;
+  x_GLF_color = vec4<f32>(x_41, x_41, x_41, x_41);
+  let x_44 : f32 = v1.y;
+  let x_46 : f32 = x_8.x_GLF_uniform_float_values[0];
+  let x_47 : bool = (x_44 > x_46);
+  x_55_phi = x_47;
+  if (x_47) {
+    let x_51 : f32 = v1.y;
+    let x_53 : f32 = x_8.x_GLF_uniform_float_values[1];
+    x_54 = (x_51 < x_53);
+    x_55_phi = x_54;
+  }
+  let x_55 : bool = x_55_phi;
+  if (x_55) {
+    let x_60 : i32 = x_6.x_GLF_uniform_int_values[0];
+    let x_63 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_66 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_69 : i32 = x_6.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_60), f32(x_63), f32(x_66), f32(x_69));
+  } else {
+    let x_73 : i32 = x_6.x_GLF_uniform_int_values[1];
+    let x_74 : f32 = f32(x_73);
+    x_GLF_color = vec4<f32>(x_74, x_74, x_74, x_74);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-machine-value-type-uint-to-float/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-machine-value-type-uint-to-float/0-opt.spvasm
new file mode 100644
index 0000000..29dcd71
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-machine-value-type-uint-to-float/0-opt.spvasm
@@ -0,0 +1,114 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %a "a"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_uint_values"
+               OpName %_ ""
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "_GLF_uniform_float_values"
+               OpName %__0 ""
+               OpName %b "b"
+               OpName %c "c"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %__1 ""
+               OpDecorate %_arr_uint_uint_2 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %buf2 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 2
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__1 DescriptorSet 0
+               OpDecorate %__1 Binding 0
+       %void = OpTypeVoid
+         %17 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+     %uint_2 = OpConstant %uint 2
+%_arr_uint_uint_2 = OpTypeArray %uint %uint_2
+       %buf1 = OpTypeStruct %_arr_uint_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+      %float = OpTypeFloat 32
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf2 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+        %__0 = OpVariable %_ptr_Uniform_buf2 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_float = OpTypePointer Function %float
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__1 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+       %main = OpFunction %void None %17
+         %36 = OpLabel
+          %a = OpVariable %_ptr_Function_uint Function
+          %b = OpVariable %_ptr_Function_float Function
+          %c = OpVariable %_ptr_Function_uint Function
+         %37 = OpAccessChain %_ptr_Uniform_uint %_ %int_0 %int_0
+         %38 = OpLoad %uint %37
+         %39 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %int_0
+         %40 = OpLoad %float %39
+         %41 = OpConvertFToU %uint %40
+         %42 = OpShiftRightLogical %uint %38 %41
+               OpStore %a %42
+         %43 = OpLoad %uint %a
+         %44 = OpBitcast %float %43
+               OpStore %b %44
+         %45 = OpLoad %float %b
+         %46 = OpBitcast %uint %45
+               OpStore %c %46
+         %47 = OpLoad %uint %c
+         %48 = OpAccessChain %_ptr_Uniform_uint %_ %int_0 %int_0
+         %49 = OpLoad %uint %48
+         %50 = OpIEqual %bool %47 %49
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %53
+         %52 = OpLabel
+         %54 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_0
+         %55 = OpLoad %int %54
+         %56 = OpConvertSToF %float %55
+         %57 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_1
+         %58 = OpLoad %int %57
+         %59 = OpConvertSToF %float %58
+         %60 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_1
+         %61 = OpLoad %int %60
+         %62 = OpConvertSToF %float %61
+         %63 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_0
+         %64 = OpLoad %int %63
+         %65 = OpConvertSToF %float %64
+         %66 = OpCompositeConstruct %v4float %56 %59 %62 %65
+               OpStore %_GLF_color %66
+               OpBranch %51
+         %53 = OpLabel
+         %67 = OpLoad %float %b
+         %68 = OpCompositeConstruct %v4float %67 %67 %67 %67
+               OpStore %_GLF_color %68
+               OpBranch %51
+         %51 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-machine-value-type-uint-to-float/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-machine-value-type-uint-to-float/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..a94b9b7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-machine-value-type-uint-to-float/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,53 @@
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[2];
+};
+cbuffer cbuffer_x_8 : register(b2, space0) {
+  uint4 x_8[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_12 : register(b0, space0) {
+  uint4 x_12[2];
+};
+
+void main_1() {
+  uint a = 0u;
+  float b = 0.0f;
+  uint c = 0u;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const uint x_38 = x_6[scalar_offset / 4][scalar_offset % 4];
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_40 = asfloat(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  a = (x_38 >> uint(x_40));
+  b = asfloat(a);
+  c = asuint(b);
+  const uint x_47 = c;
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const uint x_49 = x_6[scalar_offset_2 / 4][scalar_offset_2 % 4];
+  if ((x_47 == x_49)) {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_55 = asint(x_12[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const int x_58 = asint(x_12[1].x);
+    const int x_61 = asint(x_12[1].x);
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_64 = asint(x_12[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    x_GLF_color = float4(float(x_55), float(x_58), float(x_61), float(x_64));
+  } else {
+    const float x_67 = b;
+    x_GLF_color = float4(x_67, x_67, x_67, x_67);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-machine-value-type-uint-to-float/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-machine-value-type-uint-to-float/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..d120e27
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-machine-value-type-uint-to-float/0-opt.spvasm.expected.msl
@@ -0,0 +1,74 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ uint el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_uint_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf2 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_2 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_2[12];
+};
+struct tint_array_wrapper_2 {
+  /* 0x0000 */ tint_padded_array_element_2 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_2 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf2& x_8, constant buf0& x_12, thread float4* const tint_symbol_4) {
+  uint a = 0u;
+  float b = 0.0f;
+  uint c = 0u;
+  uint const x_38 = x_6.x_GLF_uniform_uint_values.arr[0].el;
+  float const x_40 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  a = (x_38 >> uint(x_40));
+  uint const x_43 = a;
+  b = as_type<float>(x_43);
+  float const x_45 = b;
+  c = as_type<uint>(x_45);
+  uint const x_47 = c;
+  uint const x_49 = x_6.x_GLF_uniform_uint_values.arr[0].el;
+  if ((x_47 == x_49)) {
+    int const x_55 = x_12.x_GLF_uniform_int_values.arr[0].el;
+    int const x_58 = x_12.x_GLF_uniform_int_values.arr[1].el;
+    int const x_61 = x_12.x_GLF_uniform_int_values.arr[1].el;
+    int const x_64 = x_12.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_55), float(x_58), float(x_61), float(x_64));
+  } else {
+    float const x_67 = b;
+    *(tint_symbol_4) = float4(x_67, x_67, x_67, x_67);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf2& x_8 [[buffer(2)]], constant buf0& x_12 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, x_12, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-machine-value-type-uint-to-float/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-machine-value-type-uint-to-float/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..8b2693b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-machine-value-type-uint-to-float/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,150 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 86
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_uint_values"
+               OpName %x_6 "x_6"
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_12 "x_12"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_uint_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf2 Block
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 2
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_12 NonWritable
+               OpDecorate %x_12 DescriptorSet 0
+               OpDecorate %x_12 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_uint_uint_2 = OpTypeArray %uint %uint_2
+       %buf1 = OpTypeStruct %_arr_uint_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %float = OpTypeFloat 32
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf2 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+        %x_8 = OpVariable %_ptr_Uniform_buf2 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %16
+        %int = OpTypeInt 32 1
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_12 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %16
+       %void = OpTypeVoid
+         %24 = OpTypeFunction %void
+%_ptr_Function_uint = OpTypePointer Function %uint
+         %30 = OpConstantNull %uint
+%_ptr_Function_float = OpTypePointer Function %float
+         %33 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %74 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %24
+         %27 = OpLabel
+          %a = OpVariable %_ptr_Function_uint Function %30
+          %b = OpVariable %_ptr_Function_float Function %33
+          %c = OpVariable %_ptr_Function_uint Function %30
+         %38 = OpAccessChain %_ptr_Uniform_uint %x_6 %uint_0 %int_0
+         %39 = OpLoad %uint %38
+         %41 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %42 = OpLoad %float %41
+         %43 = OpConvertFToU %uint %42
+         %44 = OpShiftRightLogical %uint %39 %43
+               OpStore %a %44
+         %45 = OpLoad %uint %a
+         %46 = OpBitcast %float %45
+               OpStore %b %46
+         %47 = OpLoad %float %b
+         %48 = OpBitcast %uint %47
+               OpStore %c %48
+         %49 = OpLoad %uint %c
+         %50 = OpAccessChain %_ptr_Uniform_uint %x_6 %uint_0 %int_0
+         %51 = OpLoad %uint %50
+         %52 = OpIEqual %bool %49 %51
+               OpSelectionMerge %54 None
+               OpBranchConditional %52 %55 %56
+         %55 = OpLabel
+         %58 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_0
+         %59 = OpLoad %int %58
+         %61 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_1
+         %62 = OpLoad %int %61
+         %63 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_1
+         %64 = OpLoad %int %63
+         %65 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_0
+         %66 = OpLoad %int %65
+         %67 = OpConvertSToF %float %59
+         %68 = OpConvertSToF %float %62
+         %69 = OpConvertSToF %float %64
+         %70 = OpConvertSToF %float %66
+         %71 = OpCompositeConstruct %v4float %67 %68 %69 %70
+               OpStore %x_GLF_color %71
+               OpBranch %54
+         %56 = OpLabel
+         %72 = OpLoad %float %b
+         %73 = OpCompositeConstruct %v4float %72 %72 %72 %72
+               OpStore %x_GLF_color %73
+               OpBranch %54
+         %54 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %74
+%tint_symbol = OpFunctionParameter %main_out
+         %78 = OpLabel
+         %79 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %79
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %24
+         %81 = OpLabel
+         %82 = OpFunctionCall %void %main_1
+         %84 = OpLoad %v4float %x_GLF_color
+         %85 = OpCompositeConstruct %main_out %84
+         %83 = OpFunctionCall %void %tint_symbol_2 %85
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-machine-value-type-uint-to-float/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-machine-value-type-uint-to-float/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..79c6767
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-machine-value-type-uint-to-float/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,65 @@
+type Arr = [[stride(16)]] array<u32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_uint_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf2 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+type Arr_2 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_2;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(2)]] var<uniform> x_8 : buf2;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_12 : buf0;
+
+fn main_1() {
+  var a : u32;
+  var b : f32;
+  var c : u32;
+  let x_38 : u32 = x_6.x_GLF_uniform_uint_values[0];
+  let x_40 : f32 = x_8.x_GLF_uniform_float_values[0];
+  a = (x_38 >> u32(x_40));
+  let x_43 : u32 = a;
+  b = bitcast<f32>(x_43);
+  let x_45 : f32 = b;
+  c = bitcast<u32>(x_45);
+  let x_47 : u32 = c;
+  let x_49 : u32 = x_6.x_GLF_uniform_uint_values[0];
+  if ((x_47 == x_49)) {
+    let x_55 : i32 = x_12.x_GLF_uniform_int_values[0];
+    let x_58 : i32 = x_12.x_GLF_uniform_int_values[1];
+    let x_61 : i32 = x_12.x_GLF_uniform_int_values[1];
+    let x_64 : i32 = x_12.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_55), f32(x_58), f32(x_61), f32(x_64));
+  } else {
+    let x_67 : f32 = b;
+    x_GLF_color = vec4<f32>(x_67, x_67, x_67, x_67);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-machine-value-type-uint-to-float/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-machine-value-type-uint-to-float/0-opt.wgsl
new file mode 100644
index 0000000..79c6767
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-machine-value-type-uint-to-float/0-opt.wgsl
@@ -0,0 +1,65 @@
+type Arr = [[stride(16)]] array<u32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_uint_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf2 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+type Arr_2 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_2;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(2)]] var<uniform> x_8 : buf2;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_12 : buf0;
+
+fn main_1() {
+  var a : u32;
+  var b : f32;
+  var c : u32;
+  let x_38 : u32 = x_6.x_GLF_uniform_uint_values[0];
+  let x_40 : f32 = x_8.x_GLF_uniform_float_values[0];
+  a = (x_38 >> u32(x_40));
+  let x_43 : u32 = a;
+  b = bitcast<f32>(x_43);
+  let x_45 : f32 = b;
+  c = bitcast<u32>(x_45);
+  let x_47 : u32 = c;
+  let x_49 : u32 = x_6.x_GLF_uniform_uint_values[0];
+  if ((x_47 == x_49)) {
+    let x_55 : i32 = x_12.x_GLF_uniform_int_values[0];
+    let x_58 : i32 = x_12.x_GLF_uniform_int_values[1];
+    let x_61 : i32 = x_12.x_GLF_uniform_int_values[1];
+    let x_64 : i32 = x_12.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_55), f32(x_58), f32(x_61), f32(x_64));
+  } else {
+    let x_67 : f32 = b;
+    x_GLF_color = vec4<f32>(x_67, x_67, x_67, x_67);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-machine-value-type-uint-to-float/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-machine-value-type-uint-to-float/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..a94b9b7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-machine-value-type-uint-to-float/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,53 @@
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[2];
+};
+cbuffer cbuffer_x_8 : register(b2, space0) {
+  uint4 x_8[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_12 : register(b0, space0) {
+  uint4 x_12[2];
+};
+
+void main_1() {
+  uint a = 0u;
+  float b = 0.0f;
+  uint c = 0u;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const uint x_38 = x_6[scalar_offset / 4][scalar_offset % 4];
+  const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+  const float x_40 = asfloat(x_8[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+  a = (x_38 >> uint(x_40));
+  b = asfloat(a);
+  c = asuint(b);
+  const uint x_47 = c;
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const uint x_49 = x_6[scalar_offset_2 / 4][scalar_offset_2 % 4];
+  if ((x_47 == x_49)) {
+    const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+    const int x_55 = asint(x_12[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+    const int x_58 = asint(x_12[1].x);
+    const int x_61 = asint(x_12[1].x);
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_64 = asint(x_12[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    x_GLF_color = float4(float(x_55), float(x_58), float(x_61), float(x_64));
+  } else {
+    const float x_67 = b;
+    x_GLF_color = float4(x_67, x_67, x_67, x_67);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-machine-value-type-uint-to-float/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-machine-value-type-uint-to-float/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..d120e27
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-machine-value-type-uint-to-float/0-opt.wgsl.expected.msl
@@ -0,0 +1,74 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ uint el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_uint_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[1];
+};
+struct buf2 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_2 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_2[12];
+};
+struct tint_array_wrapper_2 {
+  /* 0x0000 */ tint_padded_array_element_2 arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_2 x_GLF_uniform_int_values;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf2& x_8, constant buf0& x_12, thread float4* const tint_symbol_4) {
+  uint a = 0u;
+  float b = 0.0f;
+  uint c = 0u;
+  uint const x_38 = x_6.x_GLF_uniform_uint_values.arr[0].el;
+  float const x_40 = x_8.x_GLF_uniform_float_values.arr[0].el;
+  a = (x_38 >> uint(x_40));
+  uint const x_43 = a;
+  b = as_type<float>(x_43);
+  float const x_45 = b;
+  c = as_type<uint>(x_45);
+  uint const x_47 = c;
+  uint const x_49 = x_6.x_GLF_uniform_uint_values.arr[0].el;
+  if ((x_47 == x_49)) {
+    int const x_55 = x_12.x_GLF_uniform_int_values.arr[0].el;
+    int const x_58 = x_12.x_GLF_uniform_int_values.arr[1].el;
+    int const x_61 = x_12.x_GLF_uniform_int_values.arr[1].el;
+    int const x_64 = x_12.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_4) = float4(float(x_55), float(x_58), float(x_61), float(x_64));
+  } else {
+    float const x_67 = b;
+    *(tint_symbol_4) = float4(x_67, x_67, x_67, x_67);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf2& x_8 [[buffer(2)]], constant buf0& x_12 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_8, x_12, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-machine-value-type-uint-to-float/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-machine-value-type-uint-to-float/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..8b2693b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-machine-value-type-uint-to-float/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,150 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 86
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_uint_values"
+               OpName %x_6 "x_6"
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "x_GLF_uniform_float_values"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_12 "x_12"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_uint_uint_2 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf2 Block
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 2
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_12 NonWritable
+               OpDecorate %x_12 DescriptorSet 0
+               OpDecorate %x_12 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_uint_uint_2 = OpTypeArray %uint %uint_2
+       %buf1 = OpTypeStruct %_arr_uint_uint_2
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+      %float = OpTypeFloat 32
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+       %buf2 = OpTypeStruct %_arr_float_uint_1
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+        %x_8 = OpVariable %_ptr_Uniform_buf2 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %16
+        %int = OpTypeInt 32 1
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_12 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %16
+       %void = OpTypeVoid
+         %24 = OpTypeFunction %void
+%_ptr_Function_uint = OpTypePointer Function %uint
+         %30 = OpConstantNull %uint
+%_ptr_Function_float = OpTypePointer Function %float
+         %33 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %74 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %24
+         %27 = OpLabel
+          %a = OpVariable %_ptr_Function_uint Function %30
+          %b = OpVariable %_ptr_Function_float Function %33
+          %c = OpVariable %_ptr_Function_uint Function %30
+         %38 = OpAccessChain %_ptr_Uniform_uint %x_6 %uint_0 %int_0
+         %39 = OpLoad %uint %38
+         %41 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0
+         %42 = OpLoad %float %41
+         %43 = OpConvertFToU %uint %42
+         %44 = OpShiftRightLogical %uint %39 %43
+               OpStore %a %44
+         %45 = OpLoad %uint %a
+         %46 = OpBitcast %float %45
+               OpStore %b %46
+         %47 = OpLoad %float %b
+         %48 = OpBitcast %uint %47
+               OpStore %c %48
+         %49 = OpLoad %uint %c
+         %50 = OpAccessChain %_ptr_Uniform_uint %x_6 %uint_0 %int_0
+         %51 = OpLoad %uint %50
+         %52 = OpIEqual %bool %49 %51
+               OpSelectionMerge %54 None
+               OpBranchConditional %52 %55 %56
+         %55 = OpLabel
+         %58 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_0
+         %59 = OpLoad %int %58
+         %61 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_1
+         %62 = OpLoad %int %61
+         %63 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_1
+         %64 = OpLoad %int %63
+         %65 = OpAccessChain %_ptr_Uniform_int %x_12 %uint_0 %int_0
+         %66 = OpLoad %int %65
+         %67 = OpConvertSToF %float %59
+         %68 = OpConvertSToF %float %62
+         %69 = OpConvertSToF %float %64
+         %70 = OpConvertSToF %float %66
+         %71 = OpCompositeConstruct %v4float %67 %68 %69 %70
+               OpStore %x_GLF_color %71
+               OpBranch %54
+         %56 = OpLabel
+         %72 = OpLoad %float %b
+         %73 = OpCompositeConstruct %v4float %72 %72 %72 %72
+               OpStore %x_GLF_color %73
+               OpBranch %54
+         %54 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %74
+%tint_symbol = OpFunctionParameter %main_out
+         %78 = OpLabel
+         %79 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %79
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %24
+         %81 = OpLabel
+         %82 = OpFunctionCall %void %main_1
+         %84 = OpLoad %v4float %x_GLF_color
+         %85 = OpCompositeConstruct %main_out %84
+         %83 = OpFunctionCall %void %tint_symbol_2 %85
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-machine-value-type-uint-to-float/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-machine-value-type-uint-to-float/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..79c6767
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-machine-value-type-uint-to-float/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,65 @@
+type Arr = [[stride(16)]] array<u32, 2>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_uint_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<f32, 1>;
+
+[[block]]
+struct buf2 {
+  x_GLF_uniform_float_values : Arr_1;
+};
+
+type Arr_2 = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_2;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(2)]] var<uniform> x_8 : buf2;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_12 : buf0;
+
+fn main_1() {
+  var a : u32;
+  var b : f32;
+  var c : u32;
+  let x_38 : u32 = x_6.x_GLF_uniform_uint_values[0];
+  let x_40 : f32 = x_8.x_GLF_uniform_float_values[0];
+  a = (x_38 >> u32(x_40));
+  let x_43 : u32 = a;
+  b = bitcast<f32>(x_43);
+  let x_45 : f32 = b;
+  c = bitcast<u32>(x_45);
+  let x_47 : u32 = c;
+  let x_49 : u32 = x_6.x_GLF_uniform_uint_values[0];
+  if ((x_47 == x_49)) {
+    let x_55 : i32 = x_12.x_GLF_uniform_int_values[0];
+    let x_58 : i32 = x_12.x_GLF_uniform_int_values[1];
+    let x_61 : i32 = x_12.x_GLF_uniform_int_values[1];
+    let x_64 : i32 = x_12.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_55), f32(x_58), f32(x_61), f32(x_64));
+  } else {
+    let x_67 : f32 = b;
+    x_GLF_color = vec4<f32>(x_67, x_67, x_67, x_67);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-negative-left-shift/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-negative-left-shift/0-opt.spvasm
new file mode 100644
index 0000000..3fb84ce
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-negative-left-shift/0-opt.spvasm
@@ -0,0 +1,187 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %A "A"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "_GLF_uniform_float_values"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %__0 ""
+               OpName %j "j"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+%_ptr_Function__arr_float_uint_2 = OpTypePointer Function %_arr_float_uint_2
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf1 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_float = OpTypePointer Function %float
+%_ptr_Function_int = OpTypePointer Function %int
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+%int_n2147483648 = OpConstant %int -2147483648
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %14
+         %37 = OpLabel
+          %A = OpVariable %_ptr_Function__arr_float_uint_2 Function
+          %i = OpVariable %_ptr_Function_int Function
+          %j = OpVariable %_ptr_Function_int Function
+         %38 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %39 = OpLoad %float %38
+         %40 = OpAccessChain %_ptr_Function_float %A %int_0
+               OpStore %40 %39
+         %41 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+         %42 = OpLoad %float %41
+         %43 = OpAccessChain %_ptr_Function_float %A %int_1
+               OpStore %43 %42
+         %44 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %45 = OpLoad %int %44
+               OpStore %i %45
+               OpBranch %46
+         %46 = OpLabel
+               OpLoopMerge %47 %48 None
+               OpBranch %49
+         %49 = OpLabel
+         %50 = OpLoad %int %i
+         %51 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_3
+         %52 = OpLoad %int %51
+         %53 = OpSLessThan %bool %50 %52
+               OpBranchConditional %53 %54 %47
+         %54 = OpLabel
+         %55 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %56 = OpLoad %int %55
+               OpStore %j %56
+               OpBranch %57
+         %57 = OpLabel
+               OpLoopMerge %58 %59 None
+               OpBranch %60
+         %60 = OpLabel
+         %61 = OpLoad %int %j
+         %62 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_2
+         %63 = OpLoad %int %62
+         %64 = OpSLessThan %bool %61 %63
+               OpBranchConditional %64 %65 %58
+         %65 = OpLabel
+         %66 = OpLoad %int %j
+               OpSelectionMerge %67 None
+               OpSwitch %66 %67 0 %68 1 %69
+         %68 = OpLabel
+         %70 = OpLoad %int %i
+         %71 = OpSLessThan %bool %int_n2147483648 %70
+               OpSelectionMerge %72 None
+               OpBranchConditional %71 %73 %72
+         %73 = OpLabel
+               OpBranch %59
+         %72 = OpLabel
+         %74 = OpLoad %int %i
+         %75 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_2
+         %76 = OpLoad %float %75
+         %77 = OpAccessChain %_ptr_Function_float %A %74
+               OpStore %77 %76
+               OpBranch %67
+         %69 = OpLabel
+         %78 = OpLoad %int %i
+         %79 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %80 = OpLoad %float %79
+         %81 = OpAccessChain %_ptr_Function_float %A %78
+               OpStore %81 %80
+               OpBranch %67
+         %67 = OpLabel
+               OpBranch %59
+         %59 = OpLabel
+         %82 = OpLoad %int %j
+         %83 = OpIAdd %int %82 %int_1
+               OpStore %j %83
+               OpBranch %57
+         %58 = OpLabel
+               OpBranch %48
+         %48 = OpLabel
+         %84 = OpLoad %int %i
+         %85 = OpIAdd %int %84 %int_1
+               OpStore %i %85
+               OpBranch %46
+         %47 = OpLabel
+         %86 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+         %87 = OpLoad %int %86
+         %88 = OpAccessChain %_ptr_Function_float %A %87
+         %89 = OpLoad %float %88
+         %90 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+         %91 = OpLoad %float %90
+         %92 = OpFOrdEqual %bool %89 %91
+               OpSelectionMerge %93 None
+               OpBranchConditional %92 %94 %93
+         %94 = OpLabel
+         %95 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+         %96 = OpLoad %int %95
+         %97 = OpAccessChain %_ptr_Function_float %A %96
+         %98 = OpLoad %float %97
+         %99 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+        %100 = OpLoad %float %99
+        %101 = OpFOrdEqual %bool %98 %100
+               OpBranch %93
+         %93 = OpLabel
+        %102 = OpPhi %bool %92 %47 %101 %94
+               OpSelectionMerge %103 None
+               OpBranchConditional %102 %104 %105
+        %104 = OpLabel
+        %106 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %107 = OpLoad %int %106
+        %108 = OpConvertSToF %float %107
+        %109 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+        %110 = OpLoad %int %109
+        %111 = OpConvertSToF %float %110
+        %112 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_0
+        %113 = OpLoad %int %112
+        %114 = OpConvertSToF %float %113
+        %115 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %116 = OpLoad %int %115
+        %117 = OpConvertSToF %float %116
+        %118 = OpCompositeConstruct %v4float %108 %111 %114 %117
+               OpStore %_GLF_color %118
+               OpBranch %103
+        %105 = OpLabel
+        %119 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 %int_1
+        %120 = OpLoad %int %119
+        %121 = OpConvertSToF %float %120
+        %122 = OpCompositeConstruct %v4float %121 %121 %121 %121
+               OpStore %_GLF_color %122
+               OpBranch %103
+        %103 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-negative-left-shift/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-negative-left-shift/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..d2685c7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-negative-left-shift/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,114 @@
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[3];
+};
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float A[2] = (float[2])0;
+  int i = 0;
+  int j = 0;
+  bool x_101 = false;
+  bool x_102_phi = false;
+  const float x_39 = asfloat(x_6[1].x);
+  A[0] = x_39;
+  const float x_42 = asfloat(x_6[1].x);
+  A[1] = x_42;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_45 = asint(x_9[scalar_offset / 4][scalar_offset % 4]);
+  i = x_45;
+  while (true) {
+    const int x_50 = i;
+    const int x_52 = asint(x_9[3].x);
+    if ((x_50 < x_52)) {
+    } else {
+      break;
+    }
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_56 = asint(x_9[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    j = x_56;
+    while (true) {
+      const int x_61 = j;
+      const int x_63 = asint(x_9[2].x);
+      if ((x_61 < x_63)) {
+      } else {
+        break;
+      }
+      switch(j) {
+        case 1: {
+          const int x_78 = i;
+          const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+          const float x_80 = asfloat(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+          A[x_78] = x_80;
+          break;
+        }
+        case 0: {
+          if ((-2147483648 < i)) {
+            {
+              j = (j + 1);
+            }
+            continue;
+          }
+          const int x_74 = i;
+          const float x_76 = asfloat(x_6[2].x);
+          A[x_74] = x_76;
+          break;
+        }
+        default: {
+          break;
+        }
+      }
+      {
+        j = (j + 1);
+      }
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const int x_87 = asint(x_9[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  const float x_89 = A[x_87];
+  const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+  const float x_91 = asfloat(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+  const bool x_92 = (x_89 == x_91);
+  x_102_phi = x_92;
+  if (x_92) {
+    const int x_96 = asint(x_9[1].x);
+    const float x_98 = A[x_96];
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const float x_100 = asfloat(x_6[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    x_101 = (x_98 == x_100);
+    x_102_phi = x_101;
+  }
+  if (x_102_phi) {
+    const int x_107 = asint(x_9[1].x);
+    const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+    const int x_110 = asint(x_9[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+    const uint scalar_offset_7 = ((16u * uint(0))) / 4;
+    const int x_113 = asint(x_9[scalar_offset_7 / 4][scalar_offset_7 % 4]);
+    const int x_116 = asint(x_9[1].x);
+    x_GLF_color = float4(float(x_107), float(x_110), float(x_113), float(x_116));
+  } else {
+    const int x_120 = asint(x_9[1].x);
+    const float x_121 = float(x_120);
+    x_GLF_color = float4(x_121, x_121, x_121, x_121);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-negative-left-shift/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-negative-left-shift/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..a7a8dbb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-negative-left-shift/0-opt.spvasm.expected.msl
@@ -0,0 +1,132 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_2 {
+  float arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_9, thread float4* const tint_symbol_4) {
+  tint_array_wrapper_2 A = {};
+  int i = 0;
+  int j = 0;
+  bool x_101 = false;
+  bool x_102_phi = false;
+  float const x_39 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  A.arr[0] = x_39;
+  float const x_42 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  A.arr[1] = x_42;
+  int const x_45 = x_9.x_GLF_uniform_int_values.arr[0].el;
+  i = x_45;
+  while (true) {
+    int const x_50 = i;
+    int const x_52 = x_9.x_GLF_uniform_int_values.arr[3].el;
+    if ((x_50 < x_52)) {
+    } else {
+      break;
+    }
+    int const x_56 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    j = x_56;
+    while (true) {
+      int const x_61 = j;
+      int const x_63 = x_9.x_GLF_uniform_int_values.arr[2].el;
+      if ((x_61 < x_63)) {
+      } else {
+        break;
+      }
+      int const x_66 = j;
+      switch(x_66) {
+        case 1: {
+          int const x_78 = i;
+          float const x_80 = x_6.x_GLF_uniform_float_values.arr[0].el;
+          A.arr[x_78] = x_80;
+          break;
+        }
+        case 0: {
+          int const x_70 = i;
+          if ((-2147483648 < x_70)) {
+            {
+              int const x_82 = j;
+              j = (x_82 + 1);
+            }
+            continue;
+          }
+          int const x_74 = i;
+          float const x_76 = x_6.x_GLF_uniform_float_values.arr[2].el;
+          A.arr[x_74] = x_76;
+          break;
+        }
+        default: {
+          break;
+        }
+      }
+      {
+        int const x_82 = j;
+        j = (x_82 + 1);
+      }
+    }
+    {
+      int const x_84 = i;
+      i = (x_84 + 1);
+    }
+  }
+  int const x_87 = x_9.x_GLF_uniform_int_values.arr[0].el;
+  float const x_89 = A.arr[x_87];
+  float const x_91 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  bool const x_92 = (x_89 == x_91);
+  x_102_phi = x_92;
+  if (x_92) {
+    int const x_96 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    float const x_98 = A.arr[x_96];
+    float const x_100 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    x_101 = (x_98 == x_100);
+    x_102_phi = x_101;
+  }
+  bool const x_102 = x_102_phi;
+  if (x_102) {
+    int const x_107 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_110 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    int const x_113 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    int const x_116 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_107), float(x_110), float(x_113), float(x_116));
+  } else {
+    int const x_120 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    float const x_121 = float(x_120);
+    *(tint_symbol_4) = float4(x_121, x_121, x_121, x_121);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-negative-left-shift/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-negative-left-shift/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..9acf823
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-negative-left-shift/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,245 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 150
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %A "A"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %x_101 "x_101"
+               OpName %x_102_phi "x_102_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf1 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+%_ptr_Function__arr_float_uint_2 = OpTypePointer Function %_arr_float_uint_2
+         %28 = OpConstantNull %_arr_float_uint_2
+%_ptr_Function_int = OpTypePointer Function %int
+         %31 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %36 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_0 = OpConstant %int 0
+%_ptr_Function_float = OpTypePointer Function %float
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+      %int_2 = OpConstant %int 2
+%int_n2147483648 = OpConstant %int -2147483648
+   %main_out = OpTypeStruct %v4float
+        %138 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+          %A = OpVariable %_ptr_Function__arr_float_uint_2 Function %28
+          %i = OpVariable %_ptr_Function_int Function %31
+          %j = OpVariable %_ptr_Function_int Function %31
+      %x_101 = OpVariable %_ptr_Function_bool Function %36
+  %x_102_phi = OpVariable %_ptr_Function_bool Function %36
+         %41 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %42 = OpLoad %float %41
+         %45 = OpAccessChain %_ptr_Function_float %A %int_0
+               OpStore %45 %42
+         %46 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %47 = OpLoad %float %46
+         %48 = OpAccessChain %_ptr_Function_float %A %int_1
+               OpStore %48 %47
+         %50 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %51 = OpLoad %int %50
+               OpStore %i %51
+               OpBranch %52
+         %52 = OpLabel
+               OpLoopMerge %53 %54 None
+               OpBranch %55
+         %55 = OpLabel
+         %56 = OpLoad %int %i
+         %58 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_3
+         %59 = OpLoad %int %58
+         %60 = OpSLessThan %bool %56 %59
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %63
+         %62 = OpLabel
+               OpBranch %61
+         %63 = OpLabel
+               OpBranch %53
+         %61 = OpLabel
+         %64 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %65 = OpLoad %int %64
+               OpStore %j %65
+               OpBranch %66
+         %66 = OpLabel
+               OpLoopMerge %67 %68 None
+               OpBranch %69
+         %69 = OpLabel
+         %70 = OpLoad %int %j
+         %72 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_2
+         %73 = OpLoad %int %72
+         %74 = OpSLessThan %bool %70 %73
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %77
+         %76 = OpLabel
+               OpBranch %75
+         %77 = OpLabel
+               OpBranch %67
+         %75 = OpLabel
+         %78 = OpLoad %int %j
+               OpSelectionMerge %79 None
+               OpSwitch %78 %80 1 %81 0 %82
+         %81 = OpLabel
+         %83 = OpLoad %int %i
+         %84 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %85 = OpLoad %float %84
+         %86 = OpAccessChain %_ptr_Function_float %A %83
+               OpStore %86 %85
+               OpBranch %79
+         %82 = OpLabel
+         %87 = OpLoad %int %i
+         %89 = OpSLessThan %bool %int_n2147483648 %87
+               OpSelectionMerge %90 None
+               OpBranchConditional %89 %91 %90
+         %91 = OpLabel
+               OpBranch %68
+         %90 = OpLabel
+         %92 = OpLoad %int %i
+         %93 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %94 = OpLoad %float %93
+         %95 = OpAccessChain %_ptr_Function_float %A %92
+               OpStore %95 %94
+               OpBranch %79
+         %80 = OpLabel
+               OpBranch %79
+         %79 = OpLabel
+               OpBranch %68
+         %68 = OpLabel
+         %96 = OpLoad %int %j
+         %97 = OpIAdd %int %96 %int_1
+               OpStore %j %97
+               OpBranch %66
+         %67 = OpLabel
+               OpBranch %54
+         %54 = OpLabel
+         %98 = OpLoad %int %i
+         %99 = OpIAdd %int %98 %int_1
+               OpStore %i %99
+               OpBranch %52
+         %53 = OpLabel
+        %100 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+        %101 = OpLoad %int %100
+        %102 = OpAccessChain %_ptr_Function_float %A %101
+        %103 = OpLoad %float %102
+        %104 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+        %105 = OpLoad %float %104
+        %106 = OpFOrdEqual %bool %103 %105
+               OpStore %x_102_phi %106
+               OpSelectionMerge %107 None
+               OpBranchConditional %106 %108 %107
+        %108 = OpLabel
+        %109 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+        %110 = OpLoad %int %109
+        %111 = OpAccessChain %_ptr_Function_float %A %110
+        %112 = OpLoad %float %111
+        %113 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+        %114 = OpLoad %float %113
+        %115 = OpFOrdEqual %bool %112 %114
+               OpStore %x_101 %115
+        %116 = OpLoad %bool %x_101
+               OpStore %x_102_phi %116
+               OpBranch %107
+        %107 = OpLabel
+        %117 = OpLoad %bool %x_102_phi
+               OpSelectionMerge %118 None
+               OpBranchConditional %117 %119 %120
+        %119 = OpLabel
+        %121 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+        %122 = OpLoad %int %121
+        %123 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+        %124 = OpLoad %int %123
+        %125 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+        %126 = OpLoad %int %125
+        %127 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+        %128 = OpLoad %int %127
+        %129 = OpConvertSToF %float %122
+        %130 = OpConvertSToF %float %124
+        %131 = OpConvertSToF %float %126
+        %132 = OpConvertSToF %float %128
+        %133 = OpCompositeConstruct %v4float %129 %130 %131 %132
+               OpStore %x_GLF_color %133
+               OpBranch %118
+        %120 = OpLabel
+        %134 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+        %135 = OpLoad %int %134
+        %136 = OpConvertSToF %float %135
+        %137 = OpCompositeConstruct %v4float %136 %136 %136 %136
+               OpStore %x_GLF_color %137
+               OpBranch %118
+        %118 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %138
+%tint_symbol = OpFunctionParameter %main_out
+        %142 = OpLabel
+        %143 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %143
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %145 = OpLabel
+        %146 = OpFunctionCall %void %main_1
+        %148 = OpLoad %v4float %x_GLF_color
+        %149 = OpCompositeConstruct %main_out %148
+        %147 = OpFunctionCall %void %tint_symbol_2 %149
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-negative-left-shift/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-negative-left-shift/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..e999646
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-negative-left-shift/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,116 @@
+type Arr = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var A : array<f32, 2>;
+  var i : i32;
+  var j : i32;
+  var x_101 : bool;
+  var x_102_phi : bool;
+  let x_39 : f32 = x_6.x_GLF_uniform_float_values[1];
+  A[0] = x_39;
+  let x_42 : f32 = x_6.x_GLF_uniform_float_values[1];
+  A[1] = x_42;
+  let x_45 : i32 = x_9.x_GLF_uniform_int_values[0];
+  i = x_45;
+  loop {
+    let x_50 : i32 = i;
+    let x_52 : i32 = x_9.x_GLF_uniform_int_values[3];
+    if ((x_50 < x_52)) {
+    } else {
+      break;
+    }
+    let x_56 : i32 = x_9.x_GLF_uniform_int_values[0];
+    j = x_56;
+    loop {
+      let x_61 : i32 = j;
+      let x_63 : i32 = x_9.x_GLF_uniform_int_values[2];
+      if ((x_61 < x_63)) {
+      } else {
+        break;
+      }
+      let x_66 : i32 = j;
+      switch(x_66) {
+        case 1: {
+          let x_78 : i32 = i;
+          let x_80 : f32 = x_6.x_GLF_uniform_float_values[0];
+          A[x_78] = x_80;
+        }
+        case 0: {
+          let x_70 : i32 = i;
+          if ((-2147483648 < x_70)) {
+            continue;
+          }
+          let x_74 : i32 = i;
+          let x_76 : f32 = x_6.x_GLF_uniform_float_values[2];
+          A[x_74] = x_76;
+        }
+        default: {
+        }
+      }
+
+      continuing {
+        let x_82 : i32 = j;
+        j = (x_82 + 1);
+      }
+    }
+
+    continuing {
+      let x_84 : i32 = i;
+      i = (x_84 + 1);
+    }
+  }
+  let x_87 : i32 = x_9.x_GLF_uniform_int_values[0];
+  let x_89 : f32 = A[x_87];
+  let x_91 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_92 : bool = (x_89 == x_91);
+  x_102_phi = x_92;
+  if (x_92) {
+    let x_96 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_98 : f32 = A[x_96];
+    let x_100 : f32 = x_6.x_GLF_uniform_float_values[0];
+    x_101 = (x_98 == x_100);
+    x_102_phi = x_101;
+  }
+  let x_102 : bool = x_102_phi;
+  if (x_102) {
+    let x_107 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_110 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_113 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_116 : i32 = x_9.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_107), f32(x_110), f32(x_113), f32(x_116));
+  } else {
+    let x_120 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_121 : f32 = f32(x_120);
+    x_GLF_color = vec4<f32>(x_121, x_121, x_121, x_121);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-negative-left-shift/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-negative-left-shift/0-opt.wgsl
new file mode 100644
index 0000000..e999646
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-negative-left-shift/0-opt.wgsl
@@ -0,0 +1,116 @@
+type Arr = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var A : array<f32, 2>;
+  var i : i32;
+  var j : i32;
+  var x_101 : bool;
+  var x_102_phi : bool;
+  let x_39 : f32 = x_6.x_GLF_uniform_float_values[1];
+  A[0] = x_39;
+  let x_42 : f32 = x_6.x_GLF_uniform_float_values[1];
+  A[1] = x_42;
+  let x_45 : i32 = x_9.x_GLF_uniform_int_values[0];
+  i = x_45;
+  loop {
+    let x_50 : i32 = i;
+    let x_52 : i32 = x_9.x_GLF_uniform_int_values[3];
+    if ((x_50 < x_52)) {
+    } else {
+      break;
+    }
+    let x_56 : i32 = x_9.x_GLF_uniform_int_values[0];
+    j = x_56;
+    loop {
+      let x_61 : i32 = j;
+      let x_63 : i32 = x_9.x_GLF_uniform_int_values[2];
+      if ((x_61 < x_63)) {
+      } else {
+        break;
+      }
+      let x_66 : i32 = j;
+      switch(x_66) {
+        case 1: {
+          let x_78 : i32 = i;
+          let x_80 : f32 = x_6.x_GLF_uniform_float_values[0];
+          A[x_78] = x_80;
+        }
+        case 0: {
+          let x_70 : i32 = i;
+          if ((-2147483648 < x_70)) {
+            continue;
+          }
+          let x_74 : i32 = i;
+          let x_76 : f32 = x_6.x_GLF_uniform_float_values[2];
+          A[x_74] = x_76;
+        }
+        default: {
+        }
+      }
+
+      continuing {
+        let x_82 : i32 = j;
+        j = (x_82 + 1);
+      }
+    }
+
+    continuing {
+      let x_84 : i32 = i;
+      i = (x_84 + 1);
+    }
+  }
+  let x_87 : i32 = x_9.x_GLF_uniform_int_values[0];
+  let x_89 : f32 = A[x_87];
+  let x_91 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_92 : bool = (x_89 == x_91);
+  x_102_phi = x_92;
+  if (x_92) {
+    let x_96 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_98 : f32 = A[x_96];
+    let x_100 : f32 = x_6.x_GLF_uniform_float_values[0];
+    x_101 = (x_98 == x_100);
+    x_102_phi = x_101;
+  }
+  let x_102 : bool = x_102_phi;
+  if (x_102) {
+    let x_107 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_110 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_113 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_116 : i32 = x_9.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_107), f32(x_110), f32(x_113), f32(x_116));
+  } else {
+    let x_120 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_121 : f32 = f32(x_120);
+    x_GLF_color = vec4<f32>(x_121, x_121, x_121, x_121);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-negative-left-shift/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-negative-left-shift/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..d2685c7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-negative-left-shift/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,114 @@
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[3];
+};
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float A[2] = (float[2])0;
+  int i = 0;
+  int j = 0;
+  bool x_101 = false;
+  bool x_102_phi = false;
+  const float x_39 = asfloat(x_6[1].x);
+  A[0] = x_39;
+  const float x_42 = asfloat(x_6[1].x);
+  A[1] = x_42;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_45 = asint(x_9[scalar_offset / 4][scalar_offset % 4]);
+  i = x_45;
+  while (true) {
+    const int x_50 = i;
+    const int x_52 = asint(x_9[3].x);
+    if ((x_50 < x_52)) {
+    } else {
+      break;
+    }
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_56 = asint(x_9[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    j = x_56;
+    while (true) {
+      const int x_61 = j;
+      const int x_63 = asint(x_9[2].x);
+      if ((x_61 < x_63)) {
+      } else {
+        break;
+      }
+      switch(j) {
+        case 1: {
+          const int x_78 = i;
+          const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+          const float x_80 = asfloat(x_6[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+          A[x_78] = x_80;
+          break;
+        }
+        case 0: {
+          if ((-2147483648 < i)) {
+            {
+              j = (j + 1);
+            }
+            continue;
+          }
+          const int x_74 = i;
+          const float x_76 = asfloat(x_6[2].x);
+          A[x_74] = x_76;
+          break;
+        }
+        default: {
+          break;
+        }
+      }
+      {
+        j = (j + 1);
+      }
+    }
+    {
+      i = (i + 1);
+    }
+  }
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const int x_87 = asint(x_9[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  const float x_89 = A[x_87];
+  const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+  const float x_91 = asfloat(x_6[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+  const bool x_92 = (x_89 == x_91);
+  x_102_phi = x_92;
+  if (x_92) {
+    const int x_96 = asint(x_9[1].x);
+    const float x_98 = A[x_96];
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const float x_100 = asfloat(x_6[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    x_101 = (x_98 == x_100);
+    x_102_phi = x_101;
+  }
+  if (x_102_phi) {
+    const int x_107 = asint(x_9[1].x);
+    const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+    const int x_110 = asint(x_9[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+    const uint scalar_offset_7 = ((16u * uint(0))) / 4;
+    const int x_113 = asint(x_9[scalar_offset_7 / 4][scalar_offset_7 % 4]);
+    const int x_116 = asint(x_9[1].x);
+    x_GLF_color = float4(float(x_107), float(x_110), float(x_113), float(x_116));
+  } else {
+    const int x_120 = asint(x_9[1].x);
+    const float x_121 = float(x_120);
+    x_GLF_color = float4(x_121, x_121, x_121, x_121);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-negative-left-shift/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-negative-left-shift/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..a7a8dbb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-negative-left-shift/0-opt.wgsl.expected.msl
@@ -0,0 +1,132 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_padded_array_element {
+  /* 0x0000 */ float el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[3];
+};
+struct buf1 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
+};
+struct tint_padded_array_element_1 {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad_1[12];
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ tint_padded_array_element_1 arr[4];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_2 {
+  float arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf1& x_6, constant buf0& x_9, thread float4* const tint_symbol_4) {
+  tint_array_wrapper_2 A = {};
+  int i = 0;
+  int j = 0;
+  bool x_101 = false;
+  bool x_102_phi = false;
+  float const x_39 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  A.arr[0] = x_39;
+  float const x_42 = x_6.x_GLF_uniform_float_values.arr[1].el;
+  A.arr[1] = x_42;
+  int const x_45 = x_9.x_GLF_uniform_int_values.arr[0].el;
+  i = x_45;
+  while (true) {
+    int const x_50 = i;
+    int const x_52 = x_9.x_GLF_uniform_int_values.arr[3].el;
+    if ((x_50 < x_52)) {
+    } else {
+      break;
+    }
+    int const x_56 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    j = x_56;
+    while (true) {
+      int const x_61 = j;
+      int const x_63 = x_9.x_GLF_uniform_int_values.arr[2].el;
+      if ((x_61 < x_63)) {
+      } else {
+        break;
+      }
+      int const x_66 = j;
+      switch(x_66) {
+        case 1: {
+          int const x_78 = i;
+          float const x_80 = x_6.x_GLF_uniform_float_values.arr[0].el;
+          A.arr[x_78] = x_80;
+          break;
+        }
+        case 0: {
+          int const x_70 = i;
+          if ((-2147483648 < x_70)) {
+            {
+              int const x_82 = j;
+              j = (x_82 + 1);
+            }
+            continue;
+          }
+          int const x_74 = i;
+          float const x_76 = x_6.x_GLF_uniform_float_values.arr[2].el;
+          A.arr[x_74] = x_76;
+          break;
+        }
+        default: {
+          break;
+        }
+      }
+      {
+        int const x_82 = j;
+        j = (x_82 + 1);
+      }
+    }
+    {
+      int const x_84 = i;
+      i = (x_84 + 1);
+    }
+  }
+  int const x_87 = x_9.x_GLF_uniform_int_values.arr[0].el;
+  float const x_89 = A.arr[x_87];
+  float const x_91 = x_6.x_GLF_uniform_float_values.arr[0].el;
+  bool const x_92 = (x_89 == x_91);
+  x_102_phi = x_92;
+  if (x_92) {
+    int const x_96 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    float const x_98 = A.arr[x_96];
+    float const x_100 = x_6.x_GLF_uniform_float_values.arr[0].el;
+    x_101 = (x_98 == x_100);
+    x_102_phi = x_101;
+  }
+  bool const x_102 = x_102_phi;
+  if (x_102) {
+    int const x_107 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    int const x_110 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    int const x_113 = x_9.x_GLF_uniform_int_values.arr[0].el;
+    int const x_116 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    *(tint_symbol_4) = float4(float(x_107), float(x_110), float(x_113), float(x_116));
+  } else {
+    int const x_120 = x_9.x_GLF_uniform_int_values.arr[1].el;
+    float const x_121 = float(x_120);
+    *(tint_symbol_4) = float4(x_121, x_121, x_121, x_121);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-negative-left-shift/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-negative-left-shift/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..9acf823
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-negative-left-shift/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,245 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 150
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "x_GLF_uniform_float_values"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %A "A"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %x_101 "x_101"
+               OpName %x_102_phi "x_102_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %_arr_float_uint_3 ArrayStride 16
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_4 ArrayStride 16
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_float_uint_3 = OpTypeArray %float %uint_3
+       %buf1 = OpTypeStruct %_arr_float_uint_3
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+     %uint_4 = OpConstant %uint 4
+%_arr_int_uint_4 = OpTypeArray %int %uint_4
+       %buf0 = OpTypeStruct %_arr_int_uint_4
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+%_ptr_Function__arr_float_uint_2 = OpTypePointer Function %_arr_float_uint_2
+         %28 = OpConstantNull %_arr_float_uint_2
+%_ptr_Function_int = OpTypePointer Function %int
+         %31 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %36 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_0 = OpConstant %int 0
+%_ptr_Function_float = OpTypePointer Function %float
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_3 = OpConstant %int 3
+      %int_2 = OpConstant %int 2
+%int_n2147483648 = OpConstant %int -2147483648
+   %main_out = OpTypeStruct %v4float
+        %138 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+          %A = OpVariable %_ptr_Function__arr_float_uint_2 Function %28
+          %i = OpVariable %_ptr_Function_int Function %31
+          %j = OpVariable %_ptr_Function_int Function %31
+      %x_101 = OpVariable %_ptr_Function_bool Function %36
+  %x_102_phi = OpVariable %_ptr_Function_bool Function %36
+         %41 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %42 = OpLoad %float %41
+         %45 = OpAccessChain %_ptr_Function_float %A %int_0
+               OpStore %45 %42
+         %46 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_1
+         %47 = OpLoad %float %46
+         %48 = OpAccessChain %_ptr_Function_float %A %int_1
+               OpStore %48 %47
+         %50 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %51 = OpLoad %int %50
+               OpStore %i %51
+               OpBranch %52
+         %52 = OpLabel
+               OpLoopMerge %53 %54 None
+               OpBranch %55
+         %55 = OpLabel
+         %56 = OpLoad %int %i
+         %58 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_3
+         %59 = OpLoad %int %58
+         %60 = OpSLessThan %bool %56 %59
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %63
+         %62 = OpLabel
+               OpBranch %61
+         %63 = OpLabel
+               OpBranch %53
+         %61 = OpLabel
+         %64 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+         %65 = OpLoad %int %64
+               OpStore %j %65
+               OpBranch %66
+         %66 = OpLabel
+               OpLoopMerge %67 %68 None
+               OpBranch %69
+         %69 = OpLabel
+         %70 = OpLoad %int %j
+         %72 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_2
+         %73 = OpLoad %int %72
+         %74 = OpSLessThan %bool %70 %73
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %77
+         %76 = OpLabel
+               OpBranch %75
+         %77 = OpLabel
+               OpBranch %67
+         %75 = OpLabel
+         %78 = OpLoad %int %j
+               OpSelectionMerge %79 None
+               OpSwitch %78 %80 1 %81 0 %82
+         %81 = OpLabel
+         %83 = OpLoad %int %i
+         %84 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+         %85 = OpLoad %float %84
+         %86 = OpAccessChain %_ptr_Function_float %A %83
+               OpStore %86 %85
+               OpBranch %79
+         %82 = OpLabel
+         %87 = OpLoad %int %i
+         %89 = OpSLessThan %bool %int_n2147483648 %87
+               OpSelectionMerge %90 None
+               OpBranchConditional %89 %91 %90
+         %91 = OpLabel
+               OpBranch %68
+         %90 = OpLabel
+         %92 = OpLoad %int %i
+         %93 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_2
+         %94 = OpLoad %float %93
+         %95 = OpAccessChain %_ptr_Function_float %A %92
+               OpStore %95 %94
+               OpBranch %79
+         %80 = OpLabel
+               OpBranch %79
+         %79 = OpLabel
+               OpBranch %68
+         %68 = OpLabel
+         %96 = OpLoad %int %j
+         %97 = OpIAdd %int %96 %int_1
+               OpStore %j %97
+               OpBranch %66
+         %67 = OpLabel
+               OpBranch %54
+         %54 = OpLabel
+         %98 = OpLoad %int %i
+         %99 = OpIAdd %int %98 %int_1
+               OpStore %i %99
+               OpBranch %52
+         %53 = OpLabel
+        %100 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+        %101 = OpLoad %int %100
+        %102 = OpAccessChain %_ptr_Function_float %A %101
+        %103 = OpLoad %float %102
+        %104 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+        %105 = OpLoad %float %104
+        %106 = OpFOrdEqual %bool %103 %105
+               OpStore %x_102_phi %106
+               OpSelectionMerge %107 None
+               OpBranchConditional %106 %108 %107
+        %108 = OpLabel
+        %109 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+        %110 = OpLoad %int %109
+        %111 = OpAccessChain %_ptr_Function_float %A %110
+        %112 = OpLoad %float %111
+        %113 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %int_0
+        %114 = OpLoad %float %113
+        %115 = OpFOrdEqual %bool %112 %114
+               OpStore %x_101 %115
+        %116 = OpLoad %bool %x_101
+               OpStore %x_102_phi %116
+               OpBranch %107
+        %107 = OpLabel
+        %117 = OpLoad %bool %x_102_phi
+               OpSelectionMerge %118 None
+               OpBranchConditional %117 %119 %120
+        %119 = OpLabel
+        %121 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+        %122 = OpLoad %int %121
+        %123 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+        %124 = OpLoad %int %123
+        %125 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_0
+        %126 = OpLoad %int %125
+        %127 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+        %128 = OpLoad %int %127
+        %129 = OpConvertSToF %float %122
+        %130 = OpConvertSToF %float %124
+        %131 = OpConvertSToF %float %126
+        %132 = OpConvertSToF %float %128
+        %133 = OpCompositeConstruct %v4float %129 %130 %131 %132
+               OpStore %x_GLF_color %133
+               OpBranch %118
+        %120 = OpLabel
+        %134 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0 %int_1
+        %135 = OpLoad %int %134
+        %136 = OpConvertSToF %float %135
+        %137 = OpCompositeConstruct %v4float %136 %136 %136 %136
+               OpStore %x_GLF_color %137
+               OpBranch %118
+        %118 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %138
+%tint_symbol = OpFunctionParameter %main_out
+        %142 = OpLabel
+        %143 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %143
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+        %145 = OpLabel
+        %146 = OpFunctionCall %void %main_1
+        %148 = OpLoad %v4float %x_GLF_color
+        %149 = OpCompositeConstruct %main_out %148
+        %147 = OpFunctionCall %void %tint_symbol_2 %149
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-negative-left-shift/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-negative-left-shift/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..e999646
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-negative-left-shift/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,116 @@
+type Arr = [[stride(16)]] array<f32, 3>;
+
+[[block]]
+struct buf1 {
+  x_GLF_uniform_float_values : Arr;
+};
+
+type Arr_1 = [[stride(16)]] array<i32, 4>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr_1;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var A : array<f32, 2>;
+  var i : i32;
+  var j : i32;
+  var x_101 : bool;
+  var x_102_phi : bool;
+  let x_39 : f32 = x_6.x_GLF_uniform_float_values[1];
+  A[0] = x_39;
+  let x_42 : f32 = x_6.x_GLF_uniform_float_values[1];
+  A[1] = x_42;
+  let x_45 : i32 = x_9.x_GLF_uniform_int_values[0];
+  i = x_45;
+  loop {
+    let x_50 : i32 = i;
+    let x_52 : i32 = x_9.x_GLF_uniform_int_values[3];
+    if ((x_50 < x_52)) {
+    } else {
+      break;
+    }
+    let x_56 : i32 = x_9.x_GLF_uniform_int_values[0];
+    j = x_56;
+    loop {
+      let x_61 : i32 = j;
+      let x_63 : i32 = x_9.x_GLF_uniform_int_values[2];
+      if ((x_61 < x_63)) {
+      } else {
+        break;
+      }
+      let x_66 : i32 = j;
+      switch(x_66) {
+        case 1: {
+          let x_78 : i32 = i;
+          let x_80 : f32 = x_6.x_GLF_uniform_float_values[0];
+          A[x_78] = x_80;
+        }
+        case 0: {
+          let x_70 : i32 = i;
+          if ((-2147483648 < x_70)) {
+            continue;
+          }
+          let x_74 : i32 = i;
+          let x_76 : f32 = x_6.x_GLF_uniform_float_values[2];
+          A[x_74] = x_76;
+        }
+        default: {
+        }
+      }
+
+      continuing {
+        let x_82 : i32 = j;
+        j = (x_82 + 1);
+      }
+    }
+
+    continuing {
+      let x_84 : i32 = i;
+      i = (x_84 + 1);
+    }
+  }
+  let x_87 : i32 = x_9.x_GLF_uniform_int_values[0];
+  let x_89 : f32 = A[x_87];
+  let x_91 : f32 = x_6.x_GLF_uniform_float_values[0];
+  let x_92 : bool = (x_89 == x_91);
+  x_102_phi = x_92;
+  if (x_92) {
+    let x_96 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_98 : f32 = A[x_96];
+    let x_100 : f32 = x_6.x_GLF_uniform_float_values[0];
+    x_101 = (x_98 == x_100);
+    x_102_phi = x_101;
+  }
+  let x_102 : bool = x_102_phi;
+  if (x_102) {
+    let x_107 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_110 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_113 : i32 = x_9.x_GLF_uniform_int_values[0];
+    let x_116 : i32 = x_9.x_GLF_uniform_int_values[1];
+    x_GLF_color = vec4<f32>(f32(x_107), f32(x_110), f32(x_113), f32(x_116));
+  } else {
+    let x_120 : i32 = x_9.x_GLF_uniform_int_values[1];
+    let x_121 : f32 = f32(x_120);
+    x_GLF_color = vec4<f32>(x_121, x_121, x_121, x_121);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-selection-dag-struct-array-clamp-index/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-selection-dag-struct-array-clamp-index/0-opt.spvasm
new file mode 100644
index 0000000..3b3dec7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-selection-dag-struct-array-clamp-index/0-opt.spvasm
@@ -0,0 +1,124 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %S "S"
+               OpMemberName %S 0 "a"
+               OpMemberName %S 1 "b"
+               OpMemberName %S 2 "c"
+               OpName %A "A"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "_GLF_uniform_int_values"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+          %S = OpTypeStruct %int %int %int
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_S_uint_2 = OpTypeArray %S %uint_2
+%_ptr_Function__arr_S_uint_2 = OpTypePointer Function %_arr_S_uint_2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_S = OpTypePointer Function %S
+%_ptr_Function_int = OpTypePointer Function %int
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %10
+         %27 = OpLabel
+          %A = OpVariable %_ptr_Function__arr_S_uint_2 Function
+         %28 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %29 = OpLoad %int %28
+         %30 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %31 = OpLoad %int %30
+         %32 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %33 = OpLoad %int %32
+         %34 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %35 = OpLoad %int %34
+         %36 = OpCompositeConstruct %S %31 %33 %35
+         %37 = OpAccessChain %_ptr_Function_S %A %29
+               OpStore %37 %36
+         %38 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %39 = OpLoad %int %38
+         %40 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %41 = OpLoad %int %40
+         %42 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %43 = OpLoad %int %42
+         %44 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %45 = OpLoad %int %44
+         %46 = OpCompositeConstruct %S %41 %43 %45
+         %47 = OpAccessChain %_ptr_Function_S %A %39
+               OpStore %47 %46
+         %48 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %49 = OpLoad %int %48
+         %50 = OpAccessChain %_ptr_Function_int %A %49 %int_1
+         %51 = OpLoad %int %50
+         %52 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %53 = OpLoad %int %52
+         %54 = OpIEqual %bool %51 %53
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %55
+         %56 = OpLabel
+         %57 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %58 = OpLoad %int %57
+         %59 = OpExtInst %int %1 SClamp %58 %int_1 %int_2
+         %60 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %61 = OpLoad %int %60
+         %62 = OpAccessChain %_ptr_Function_int %A %59 %int_1
+               OpStore %62 %61
+               OpBranch %55
+         %55 = OpLabel
+         %63 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %64 = OpLoad %int %63
+         %65 = OpAccessChain %_ptr_Function_int %A %64 %int_1
+         %66 = OpLoad %int %65
+         %67 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %68 = OpLoad %int %67
+         %69 = OpIEqual %bool %66 %68
+               OpSelectionMerge %70 None
+               OpBranchConditional %69 %71 %72
+         %71 = OpLabel
+         %73 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %74 = OpLoad %int %73
+         %75 = OpConvertSToF %float %74
+         %76 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %77 = OpLoad %int %76
+         %78 = OpConvertSToF %float %77
+         %79 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
+         %80 = OpLoad %int %79
+         %81 = OpConvertSToF %float %80
+         %82 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %83 = OpLoad %int %82
+         %84 = OpConvertSToF %float %83
+         %85 = OpCompositeConstruct %v4float %75 %78 %81 %84
+               OpStore %_GLF_color %85
+               OpBranch %70
+         %72 = OpLabel
+         %86 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
+         %87 = OpLoad %int %86
+         %88 = OpConvertSToF %float %87
+         %89 = OpCompositeConstruct %v4float %88 %88 %88 %88
+               OpStore %_GLF_color %89
+               OpBranch %70
+         %70 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-selection-dag-struct-array-clamp-index/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-selection-dag-struct-array-clamp-index/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..9591e38
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-selection-dag-struct-array-clamp-index/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,70 @@
+struct S {
+  int a;
+  int b;
+  int c;
+};
+
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  S A[2] = (S[2])0;
+  const int x_29 = asint(x_7[1].x);
+  const int x_31 = asint(x_7[1].x);
+  const int x_33 = asint(x_7[1].x);
+  const int x_35 = asint(x_7[1].x);
+  const S tint_symbol_3 = {x_31, x_33, x_35};
+  A[x_29] = tint_symbol_3;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_39 = asint(x_7[scalar_offset / 4][scalar_offset % 4]);
+  const int x_41 = asint(x_7[1].x);
+  const int x_43 = asint(x_7[1].x);
+  const int x_45 = asint(x_7[1].x);
+  const S tint_symbol_4 = {x_41, x_43, x_45};
+  A[x_39] = tint_symbol_4;
+  const int x_49 = asint(x_7[1].x);
+  const int x_51 = A[x_49].b;
+  const int x_53 = asint(x_7[1].x);
+  if ((x_51 == x_53)) {
+    const int x_58 = asint(x_7[1].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_61 = asint(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    A[clamp(x_58, 1, 2)].b = x_61;
+  }
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const int x_64 = asint(x_7[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  const int x_66 = A[x_64].b;
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const int x_68 = asint(x_7[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  if ((x_66 == x_68)) {
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_74 = asint(x_7[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const int x_77 = asint(x_7[1].x);
+    const int x_80 = asint(x_7[1].x);
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const int x_83 = asint(x_7[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    x_GLF_color = float4(float(x_74), float(x_77), float(x_80), float(x_83));
+  } else {
+    const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+    const int x_87 = asint(x_7[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+    const float x_88 = float(x_87);
+    x_GLF_color = float4(x_88, x_88, x_88, x_88);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-selection-dag-struct-array-clamp-index/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-selection-dag-struct-array-clamp-index/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..69de413
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-selection-dag-struct-array-clamp-index/0-opt.spvasm.expected.msl
@@ -0,0 +1,75 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  int a;
+  int b;
+  int c;
+};
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_1 {
+  S arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_6) {
+  tint_array_wrapper_1 A = {};
+  int const x_29 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  int const x_31 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  int const x_33 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  int const x_35 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  S const tint_symbol_3 = {.a=x_31, .b=x_33, .c=x_35};
+  A.arr[x_29] = tint_symbol_3;
+  int const x_39 = x_7.x_GLF_uniform_int_values.arr[0].el;
+  int const x_41 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  int const x_43 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  int const x_45 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  S const tint_symbol_4 = {.a=x_41, .b=x_43, .c=x_45};
+  A.arr[x_39] = tint_symbol_4;
+  int const x_49 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  int const x_51 = A.arr[x_49].b;
+  int const x_53 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_51 == x_53)) {
+    int const x_58 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    int const x_61 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    A.arr[clamp(x_58, 1, 2)].b = x_61;
+  }
+  int const x_64 = x_7.x_GLF_uniform_int_values.arr[0].el;
+  int const x_66 = A.arr[x_64].b;
+  int const x_68 = x_7.x_GLF_uniform_int_values.arr[0].el;
+  if ((x_66 == x_68)) {
+    int const x_74 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_77 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    int const x_80 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    int const x_83 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_6) = float4(float(x_74), float(x_77), float(x_80), float(x_83));
+  } else {
+    int const x_87 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    float const x_88 = float(x_87);
+    *(tint_symbol_6) = float4(x_88, x_88, x_88, x_88);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  main_1(x_7, &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-selection-dag-struct-array-clamp-index/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-selection-dag-struct-array-clamp-index/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..d53643b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-selection-dag-struct-array-clamp-index/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,163 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 108
+; Schema: 0
+               OpCapability Shader
+         %66 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %S "S"
+               OpMemberName %S 0 "a"
+               OpMemberName %S 1 "b"
+               OpMemberName %S 2 "c"
+               OpName %A "A"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %S 0 Offset 0
+               OpMemberDecorate %S 1 Offset 4
+               OpMemberDecorate %S 2 Offset 8
+               OpDecorate %_arr_S_uint_2 ArrayStride 12
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+          %S = OpTypeStruct %int %int %int
+%_arr_S_uint_2 = OpTypeArray %S %uint_2
+%_ptr_Function__arr_S_uint_2 = OpTypePointer Function %_arr_S_uint_2
+         %23 = OpConstantNull %_arr_S_uint_2
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_S = OpTypePointer Function %S
+      %int_0 = OpConstant %int 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+         %96 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %A = OpVariable %_ptr_Function__arr_S_uint_2 Function %23
+         %27 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %28 = OpLoad %int %27
+         %29 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %30 = OpLoad %int %29
+         %31 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %32 = OpLoad %int %31
+         %33 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %34 = OpLoad %int %33
+         %36 = OpAccessChain %_ptr_Function_S %A %28
+         %37 = OpCompositeConstruct %S %30 %32 %34
+               OpStore %36 %37
+         %39 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %40 = OpLoad %int %39
+         %41 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %42 = OpLoad %int %41
+         %43 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %44 = OpLoad %int %43
+         %45 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %46 = OpLoad %int %45
+         %47 = OpAccessChain %_ptr_Function_S %A %40
+         %48 = OpCompositeConstruct %S %42 %44 %46
+               OpStore %47 %48
+         %49 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %50 = OpLoad %int %49
+         %53 = OpAccessChain %_ptr_Function_int %A %50 %uint_1
+         %54 = OpLoad %int %53
+         %55 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %56 = OpLoad %int %55
+         %57 = OpIEqual %bool %54 %56
+               OpSelectionMerge %59 None
+               OpBranchConditional %57 %60 %59
+         %60 = OpLabel
+         %61 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %62 = OpLoad %int %61
+         %63 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %64 = OpLoad %int %63
+         %65 = OpExtInst %int %66 SClamp %62 %int_1 %int_2
+         %68 = OpAccessChain %_ptr_Function_int %A %65 %uint_1
+               OpStore %68 %64
+               OpBranch %59
+         %59 = OpLabel
+         %69 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %70 = OpLoad %int %69
+         %71 = OpAccessChain %_ptr_Function_int %A %70 %uint_1
+         %72 = OpLoad %int %71
+         %73 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %74 = OpLoad %int %73
+         %75 = OpIEqual %bool %72 %74
+               OpSelectionMerge %76 None
+               OpBranchConditional %75 %77 %78
+         %77 = OpLabel
+         %79 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %80 = OpLoad %int %79
+         %81 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %82 = OpLoad %int %81
+         %83 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %84 = OpLoad %int %83
+         %85 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %86 = OpLoad %int %85
+         %87 = OpConvertSToF %float %80
+         %88 = OpConvertSToF %float %82
+         %89 = OpConvertSToF %float %84
+         %90 = OpConvertSToF %float %86
+         %91 = OpCompositeConstruct %v4float %87 %88 %89 %90
+               OpStore %x_GLF_color %91
+               OpBranch %76
+         %78 = OpLabel
+         %92 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %93 = OpLoad %int %92
+         %94 = OpConvertSToF %float %93
+         %95 = OpCompositeConstruct %v4float %94 %94 %94 %94
+               OpStore %x_GLF_color %95
+               OpBranch %76
+         %76 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %96
+%tint_symbol = OpFunctionParameter %main_out
+        %100 = OpLabel
+        %101 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %101
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %103 = OpLabel
+        %104 = OpFunctionCall %void %main_1
+        %106 = OpLoad %v4float %x_GLF_color
+        %107 = OpCompositeConstruct %main_out %106
+        %105 = OpFunctionCall %void %tint_symbol_2 %107
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-selection-dag-struct-array-clamp-index/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-selection-dag-struct-array-clamp-index/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..af4102c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-selection-dag-struct-array-clamp-index/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,64 @@
+struct S {
+  a : i32;
+  b : i32;
+  c : i32;
+};
+
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var A : array<S, 2>;
+  let x_29 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_31 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_33 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_35 : i32 = x_7.x_GLF_uniform_int_values[1];
+  A[x_29] = S(x_31, x_33, x_35);
+  let x_39 : i32 = x_7.x_GLF_uniform_int_values[0];
+  let x_41 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_43 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_45 : i32 = x_7.x_GLF_uniform_int_values[1];
+  A[x_39] = S(x_41, x_43, x_45);
+  let x_49 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_51 : i32 = A[x_49].b;
+  let x_53 : i32 = x_7.x_GLF_uniform_int_values[1];
+  if ((x_51 == x_53)) {
+    let x_58 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_61 : i32 = x_7.x_GLF_uniform_int_values[0];
+    A[clamp(x_58, 1, 2)].b = x_61;
+  }
+  let x_64 : i32 = x_7.x_GLF_uniform_int_values[0];
+  let x_66 : i32 = A[x_64].b;
+  let x_68 : i32 = x_7.x_GLF_uniform_int_values[0];
+  if ((x_66 == x_68)) {
+    let x_74 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_77 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_80 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_83 : i32 = x_7.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_74), f32(x_77), f32(x_80), f32(x_83));
+  } else {
+    let x_87 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_88 : f32 = f32(x_87);
+    x_GLF_color = vec4<f32>(x_88, x_88, x_88, x_88);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-selection-dag-struct-array-clamp-index/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-selection-dag-struct-array-clamp-index/0-opt.wgsl
new file mode 100644
index 0000000..af4102c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-selection-dag-struct-array-clamp-index/0-opt.wgsl
@@ -0,0 +1,64 @@
+struct S {
+  a : i32;
+  b : i32;
+  c : i32;
+};
+
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var A : array<S, 2>;
+  let x_29 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_31 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_33 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_35 : i32 = x_7.x_GLF_uniform_int_values[1];
+  A[x_29] = S(x_31, x_33, x_35);
+  let x_39 : i32 = x_7.x_GLF_uniform_int_values[0];
+  let x_41 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_43 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_45 : i32 = x_7.x_GLF_uniform_int_values[1];
+  A[x_39] = S(x_41, x_43, x_45);
+  let x_49 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_51 : i32 = A[x_49].b;
+  let x_53 : i32 = x_7.x_GLF_uniform_int_values[1];
+  if ((x_51 == x_53)) {
+    let x_58 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_61 : i32 = x_7.x_GLF_uniform_int_values[0];
+    A[clamp(x_58, 1, 2)].b = x_61;
+  }
+  let x_64 : i32 = x_7.x_GLF_uniform_int_values[0];
+  let x_66 : i32 = A[x_64].b;
+  let x_68 : i32 = x_7.x_GLF_uniform_int_values[0];
+  if ((x_66 == x_68)) {
+    let x_74 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_77 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_80 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_83 : i32 = x_7.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_74), f32(x_77), f32(x_80), f32(x_83));
+  } else {
+    let x_87 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_88 : f32 = f32(x_87);
+    x_GLF_color = vec4<f32>(x_88, x_88, x_88, x_88);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-selection-dag-struct-array-clamp-index/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-selection-dag-struct-array-clamp-index/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..9591e38
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-selection-dag-struct-array-clamp-index/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,70 @@
+struct S {
+  int a;
+  int b;
+  int c;
+};
+
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[2];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  S A[2] = (S[2])0;
+  const int x_29 = asint(x_7[1].x);
+  const int x_31 = asint(x_7[1].x);
+  const int x_33 = asint(x_7[1].x);
+  const int x_35 = asint(x_7[1].x);
+  const S tint_symbol_3 = {x_31, x_33, x_35};
+  A[x_29] = tint_symbol_3;
+  const uint scalar_offset = ((16u * uint(0))) / 4;
+  const int x_39 = asint(x_7[scalar_offset / 4][scalar_offset % 4]);
+  const int x_41 = asint(x_7[1].x);
+  const int x_43 = asint(x_7[1].x);
+  const int x_45 = asint(x_7[1].x);
+  const S tint_symbol_4 = {x_41, x_43, x_45};
+  A[x_39] = tint_symbol_4;
+  const int x_49 = asint(x_7[1].x);
+  const int x_51 = A[x_49].b;
+  const int x_53 = asint(x_7[1].x);
+  if ((x_51 == x_53)) {
+    const int x_58 = asint(x_7[1].x);
+    const uint scalar_offset_1 = ((16u * uint(0))) / 4;
+    const int x_61 = asint(x_7[scalar_offset_1 / 4][scalar_offset_1 % 4]);
+    A[clamp(x_58, 1, 2)].b = x_61;
+  }
+  const uint scalar_offset_2 = ((16u * uint(0))) / 4;
+  const int x_64 = asint(x_7[scalar_offset_2 / 4][scalar_offset_2 % 4]);
+  const int x_66 = A[x_64].b;
+  const uint scalar_offset_3 = ((16u * uint(0))) / 4;
+  const int x_68 = asint(x_7[scalar_offset_3 / 4][scalar_offset_3 % 4]);
+  if ((x_66 == x_68)) {
+    const uint scalar_offset_4 = ((16u * uint(0))) / 4;
+    const int x_74 = asint(x_7[scalar_offset_4 / 4][scalar_offset_4 % 4]);
+    const int x_77 = asint(x_7[1].x);
+    const int x_80 = asint(x_7[1].x);
+    const uint scalar_offset_5 = ((16u * uint(0))) / 4;
+    const int x_83 = asint(x_7[scalar_offset_5 / 4][scalar_offset_5 % 4]);
+    x_GLF_color = float4(float(x_74), float(x_77), float(x_80), float(x_83));
+  } else {
+    const uint scalar_offset_6 = ((16u * uint(0))) / 4;
+    const int x_87 = asint(x_7[scalar_offset_6 / 4][scalar_offset_6 % 4]);
+    const float x_88 = float(x_87);
+    x_GLF_color = float4(x_88, x_88, x_88, x_88);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_5 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-selection-dag-struct-array-clamp-index/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-selection-dag-struct-array-clamp-index/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..69de413
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-selection-dag-struct-array-clamp-index/0-opt.wgsl.expected.msl
@@ -0,0 +1,75 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  int a;
+  int b;
+  int c;
+};
+struct tint_padded_array_element {
+  /* 0x0000 */ int el;
+  /* 0x0004 */ int8_t tint_pad[12];
+};
+struct tint_array_wrapper {
+  /* 0x0000 */ tint_padded_array_element arr[2];
+};
+struct buf0 {
+  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
+};
+struct tint_array_wrapper_1 {
+  S arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_6) {
+  tint_array_wrapper_1 A = {};
+  int const x_29 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  int const x_31 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  int const x_33 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  int const x_35 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  S const tint_symbol_3 = {.a=x_31, .b=x_33, .c=x_35};
+  A.arr[x_29] = tint_symbol_3;
+  int const x_39 = x_7.x_GLF_uniform_int_values.arr[0].el;
+  int const x_41 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  int const x_43 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  int const x_45 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  S const tint_symbol_4 = {.a=x_41, .b=x_43, .c=x_45};
+  A.arr[x_39] = tint_symbol_4;
+  int const x_49 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  int const x_51 = A.arr[x_49].b;
+  int const x_53 = x_7.x_GLF_uniform_int_values.arr[1].el;
+  if ((x_51 == x_53)) {
+    int const x_58 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    int const x_61 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    A.arr[clamp(x_58, 1, 2)].b = x_61;
+  }
+  int const x_64 = x_7.x_GLF_uniform_int_values.arr[0].el;
+  int const x_66 = A.arr[x_64].b;
+  int const x_68 = x_7.x_GLF_uniform_int_values.arr[0].el;
+  if ((x_66 == x_68)) {
+    int const x_74 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    int const x_77 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    int const x_80 = x_7.x_GLF_uniform_int_values.arr[1].el;
+    int const x_83 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    *(tint_symbol_6) = float4(float(x_74), float(x_77), float(x_80), float(x_83));
+  } else {
+    int const x_87 = x_7.x_GLF_uniform_int_values.arr[0].el;
+    float const x_88 = float(x_87);
+    *(tint_symbol_6) = float4(x_88, x_88, x_88, x_88);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  main_1(x_7, &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-selection-dag-struct-array-clamp-index/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-selection-dag-struct-array-clamp-index/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..d53643b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-selection-dag-struct-array-clamp-index/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,163 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 108
+; Schema: 0
+               OpCapability Shader
+         %66 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "x_GLF_uniform_int_values"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %S "S"
+               OpMemberName %S 0 "a"
+               OpMemberName %S 1 "b"
+               OpMemberName %S 2 "c"
+               OpName %A "A"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %_arr_int_uint_2 ArrayStride 16
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %S 0 Offset 0
+               OpMemberDecorate %S 1 Offset 4
+               OpMemberDecorate %S 2 Offset 8
+               OpDecorate %_arr_S_uint_2 ArrayStride 12
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+       %buf0 = OpTypeStruct %_arr_int_uint_2
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+          %S = OpTypeStruct %int %int %int
+%_arr_S_uint_2 = OpTypeArray %S %uint_2
+%_ptr_Function__arr_S_uint_2 = OpTypePointer Function %_arr_S_uint_2
+         %23 = OpConstantNull %_arr_S_uint_2
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_S = OpTypePointer Function %S
+      %int_0 = OpConstant %int 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %bool = OpTypeBool
+      %int_2 = OpConstant %int 2
+   %main_out = OpTypeStruct %v4float
+         %96 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %A = OpVariable %_ptr_Function__arr_S_uint_2 Function %23
+         %27 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %28 = OpLoad %int %27
+         %29 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %30 = OpLoad %int %29
+         %31 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %32 = OpLoad %int %31
+         %33 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %34 = OpLoad %int %33
+         %36 = OpAccessChain %_ptr_Function_S %A %28
+         %37 = OpCompositeConstruct %S %30 %32 %34
+               OpStore %36 %37
+         %39 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %40 = OpLoad %int %39
+         %41 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %42 = OpLoad %int %41
+         %43 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %44 = OpLoad %int %43
+         %45 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %46 = OpLoad %int %45
+         %47 = OpAccessChain %_ptr_Function_S %A %40
+         %48 = OpCompositeConstruct %S %42 %44 %46
+               OpStore %47 %48
+         %49 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %50 = OpLoad %int %49
+         %53 = OpAccessChain %_ptr_Function_int %A %50 %uint_1
+         %54 = OpLoad %int %53
+         %55 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %56 = OpLoad %int %55
+         %57 = OpIEqual %bool %54 %56
+               OpSelectionMerge %59 None
+               OpBranchConditional %57 %60 %59
+         %60 = OpLabel
+         %61 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %62 = OpLoad %int %61
+         %63 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %64 = OpLoad %int %63
+         %65 = OpExtInst %int %66 SClamp %62 %int_1 %int_2
+         %68 = OpAccessChain %_ptr_Function_int %A %65 %uint_1
+               OpStore %68 %64
+               OpBranch %59
+         %59 = OpLabel
+         %69 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %70 = OpLoad %int %69
+         %71 = OpAccessChain %_ptr_Function_int %A %70 %uint_1
+         %72 = OpLoad %int %71
+         %73 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %74 = OpLoad %int %73
+         %75 = OpIEqual %bool %72 %74
+               OpSelectionMerge %76 None
+               OpBranchConditional %75 %77 %78
+         %77 = OpLabel
+         %79 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %80 = OpLoad %int %79
+         %81 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %82 = OpLoad %int %81
+         %83 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_1
+         %84 = OpLoad %int %83
+         %85 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %86 = OpLoad %int %85
+         %87 = OpConvertSToF %float %80
+         %88 = OpConvertSToF %float %82
+         %89 = OpConvertSToF %float %84
+         %90 = OpConvertSToF %float %86
+         %91 = OpCompositeConstruct %v4float %87 %88 %89 %90
+               OpStore %x_GLF_color %91
+               OpBranch %76
+         %78 = OpLabel
+         %92 = OpAccessChain %_ptr_Uniform_int %x_7 %uint_0 %int_0
+         %93 = OpLoad %int %92
+         %94 = OpConvertSToF %float %93
+         %95 = OpCompositeConstruct %v4float %94 %94 %94 %94
+               OpStore %x_GLF_color %95
+               OpBranch %76
+         %76 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %96
+%tint_symbol = OpFunctionParameter %main_out
+        %100 = OpLabel
+        %101 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %101
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %103 = OpLabel
+        %104 = OpFunctionCall %void %main_1
+        %106 = OpLoad %v4float %x_GLF_color
+        %107 = OpCompositeConstruct %main_out %106
+        %105 = OpFunctionCall %void %tint_symbol_2 %107
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-selection-dag-struct-array-clamp-index/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-selection-dag-struct-array-clamp-index/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..af4102c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/cov-x86-isel-lowering-selection-dag-struct-array-clamp-index/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,64 @@
+struct S {
+  a : i32;
+  b : i32;
+  c : i32;
+};
+
+type Arr = [[stride(16)]] array<i32, 2>;
+
+[[block]]
+struct buf0 {
+  x_GLF_uniform_int_values : Arr;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var A : array<S, 2>;
+  let x_29 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_31 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_33 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_35 : i32 = x_7.x_GLF_uniform_int_values[1];
+  A[x_29] = S(x_31, x_33, x_35);
+  let x_39 : i32 = x_7.x_GLF_uniform_int_values[0];
+  let x_41 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_43 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_45 : i32 = x_7.x_GLF_uniform_int_values[1];
+  A[x_39] = S(x_41, x_43, x_45);
+  let x_49 : i32 = x_7.x_GLF_uniform_int_values[1];
+  let x_51 : i32 = A[x_49].b;
+  let x_53 : i32 = x_7.x_GLF_uniform_int_values[1];
+  if ((x_51 == x_53)) {
+    let x_58 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_61 : i32 = x_7.x_GLF_uniform_int_values[0];
+    A[clamp(x_58, 1, 2)].b = x_61;
+  }
+  let x_64 : i32 = x_7.x_GLF_uniform_int_values[0];
+  let x_66 : i32 = A[x_64].b;
+  let x_68 : i32 = x_7.x_GLF_uniform_int_values[0];
+  if ((x_66 == x_68)) {
+    let x_74 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_77 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_80 : i32 = x_7.x_GLF_uniform_int_values[1];
+    let x_83 : i32 = x_7.x_GLF_uniform_int_values[0];
+    x_GLF_color = vec4<f32>(f32(x_74), f32(x_77), f32(x_80), f32(x_83));
+  } else {
+    let x_87 : i32 = x_7.x_GLF_uniform_int_values[0];
+    let x_88 : f32 = f32(x_87);
+    x_GLF_color = vec4<f32>(x_88, x_88, x_88, x_88);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.spvasm
new file mode 100644
index 0000000..2c268fb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.spvasm
@@ -0,0 +1,174 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color %gl_FragCoord
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %v "v"
+               OpName %floats "floats"
+               OpName %one "one"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %alwaysFalse "alwaysFalse"
+               OpName %_GLF_color "_GLF_color"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+    %float_0 = OpConstant %float 0
+         %18 = OpConstantComposite %v2float %float_0 %float_0
+       %uint = OpTypeInt 32 0
+     %uint_9 = OpConstant %uint 9
+%_arr_float_uint_9 = OpTypeArray %float %uint_9
+%_ptr_Function__arr_float_uint_9 = OpTypePointer Function %_arr_float_uint_9
+        %int = OpTypeInt 32 1
+      %int_1 = OpConstant %int 1
+%_ptr_Function_float = OpTypePointer Function %float
+%_ptr_Function_int = OpTypePointer Function %int
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+     %uint_0 = OpConstant %uint 0
+    %float_1 = OpConstant %float 1
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %37 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+         %38 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+%_ptr_Input_float = OpTypePointer Input %float
+         %41 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %42 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %main = OpFunction %void None %13
+         %43 = OpLabel
+          %v = OpVariable %_ptr_Function_v2float Function
+     %floats = OpVariable %_ptr_Function__arr_float_uint_9 Function
+        %one = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+%alwaysFalse = OpVariable %_ptr_Function_bool Function
+               OpStore %v %18
+         %44 = OpAccessChain %_ptr_Function_float %floats %int_1
+               OpStore %44 %float_0
+         %45 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %46 = OpLoad %float %45
+         %47 = OpConvertFToS %int %46
+               OpStore %one %47
+               OpBranch %48
+         %48 = OpLabel
+               OpLoopMerge %49 %50 None
+               OpBranch %51
+         %51 = OpLabel
+               OpStore %i %int_0
+               OpBranch %52
+         %52 = OpLabel
+               OpLoopMerge %53 %54 None
+               OpBranch %55
+         %55 = OpLabel
+         %56 = OpLoad %int %i
+         %57 = OpLoad %int %one
+         %58 = OpSLessThan %bool %56 %57
+               OpBranchConditional %58 %59 %53
+         %59 = OpLabel
+         %60 = OpLoad %int %i
+         %61 = OpIEqual %bool %60 %int_0
+               OpSelectionMerge %62 None
+               OpBranchConditional %61 %63 %62
+         %63 = OpLabel
+         %64 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %65 = OpLoad %float %64
+         %66 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %67 = OpLoad %float %66
+         %68 = OpFOrdGreaterThan %bool %65 %67
+               OpStore %alwaysFalse %68
+         %69 = OpLoad %bool %alwaysFalse
+         %70 = OpLogicalNot %bool %69
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %71
+         %72 = OpLabel
+         %73 = OpLoad %int %one
+         %74 = OpAccessChain %_ptr_Function_float %floats %73
+               OpStore %74 %float_1
+               OpStore %_GLF_color %37
+               OpBranch %71
+         %71 = OpLabel
+         %75 = OpLoad %int %one
+         %76 = OpAccessChain %_ptr_Function_float %v %75
+               OpStore %76 %float_1
+         %77 = OpLoad %bool %alwaysFalse
+               OpSelectionMerge %78 None
+               OpBranchConditional %77 %79 %78
+         %79 = OpLabel
+               OpKill
+         %78 = OpLabel
+         %80 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %81 = OpLoad %float %80
+         %82 = OpFOrdLessThan %bool %81 %float_0
+               OpSelectionMerge %83 None
+               OpBranchConditional %82 %84 %83
+         %84 = OpLabel
+               OpStore %_GLF_color %38
+               OpBranch %83
+         %83 = OpLabel
+               OpBranch %62
+         %62 = OpLabel
+               OpBranch %54
+         %54 = OpLabel
+         %85 = OpLoad %int %i
+         %86 = OpIAdd %int %85 %int_1
+               OpStore %i %86
+               OpBranch %52
+         %53 = OpLabel
+               OpBranch %50
+         %50 = OpLabel
+         %87 = OpLoad %int %one
+         %88 = OpSLessThan %bool %87 %int_0
+               OpBranchConditional %88 %48 %49
+         %49 = OpLabel
+         %89 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %90 = OpLoad %float %89
+         %91 = OpFOrdGreaterThanEqual %bool %90 %float_0
+               OpSelectionMerge %92 None
+               OpBranchConditional %91 %93 %94
+         %93 = OpLabel
+         %95 = OpAccessChain %_ptr_Function_float %v %uint_1
+         %96 = OpLoad %float %95
+         %97 = OpFOrdEqual %bool %96 %float_1
+               OpSelectionMerge %98 None
+               OpBranchConditional %97 %99 %98
+         %99 = OpLabel
+        %100 = OpAccessChain %_ptr_Function_float %floats %int_1
+        %101 = OpLoad %float %100
+        %102 = OpFOrdEqual %bool %101 %float_1
+               OpBranch %98
+         %98 = OpLabel
+        %103 = OpPhi %bool %97 %93 %102 %99
+               OpSelectionMerge %104 None
+               OpBranchConditional %103 %105 %104
+        %105 = OpLabel
+               OpStore %_GLF_color %41
+               OpBranch %104
+        %104 = OpLabel
+               OpBranch %92
+         %94 = OpLabel
+               OpStore %_GLF_color %42
+               OpBranch %92
+         %92 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..6f9a2b7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,89 @@
+void set_float2(inout float2 vec, int idx, float val) {
+  vec = (idx.xx == int2(0, 1)) ? val.xx : vec;
+}
+
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2 v = float2(0.0f, 0.0f);
+  float floats[9] = (float[9])0;
+  int one = 0;
+  int i = 0;
+  bool alwaysFalse = false;
+  v = float2(0.0f, 0.0f);
+  floats[1] = 0.0f;
+  const float x_46 = asfloat(x_9[0].y);
+  one = int(x_46);
+  while (true) {
+    i = 0;
+    {
+      for(; (i < one); i = (i + 1)) {
+        if ((i == 0)) {
+          const float x_65 = asfloat(x_9[0].x);
+          const float x_67 = asfloat(x_9[0].y);
+          alwaysFalse = (x_65 > x_67);
+          if (!(alwaysFalse)) {
+            floats[one] = 1.0f;
+            x_GLF_color = float4(1.0f, 1.0f, 0.0f, 1.0f);
+          }
+          set_float2(v, one, 1.0f);
+          if (alwaysFalse) {
+            discard;
+          }
+          const float x_81 = asfloat(x_9[0].y);
+          if ((x_81 < 0.0f)) {
+            x_GLF_color = float4(0.0f, 1.0f, 0.0f, 1.0f);
+          }
+        }
+      }
+    }
+    {
+      if ((one < 0)) {
+      } else {
+        break;
+      }
+    }
+  }
+  bool x_102 = false;
+  bool x_103_phi = false;
+  const float x_90 = gl_FragCoord.y;
+  if ((x_90 >= 0.0f)) {
+    const float x_96 = v.y;
+    const bool x_97 = (x_96 == 1.0f);
+    x_103_phi = x_97;
+    if (x_97) {
+      const float x_101 = floats[1];
+      x_102 = (x_101 == 1.0f);
+      x_103_phi = x_102;
+    }
+    if (x_103_phi) {
+      x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    }
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..bea4a4b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.spvasm.expected.msl
@@ -0,0 +1,102 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  float arr[9];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_9, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float2 v = 0.0f;
+  tint_array_wrapper floats = {};
+  int one = 0;
+  int i = 0;
+  bool alwaysFalse = false;
+  v = float2(0.0f, 0.0f);
+  floats.arr[1] = 0.0f;
+  float const x_46 = x_9.injectionSwitch.y;
+  one = int(x_46);
+  while (true) {
+    i = 0;
+    while (true) {
+      int const x_56 = i;
+      int const x_57 = one;
+      if ((x_56 < x_57)) {
+      } else {
+        break;
+      }
+      int const x_60 = i;
+      if ((x_60 == 0)) {
+        float const x_65 = x_9.injectionSwitch.x;
+        float const x_67 = x_9.injectionSwitch.y;
+        alwaysFalse = (x_65 > x_67);
+        bool const x_69 = alwaysFalse;
+        if (!(x_69)) {
+          int const x_73 = one;
+          floats.arr[x_73] = 1.0f;
+          *(tint_symbol_5) = float4(1.0f, 1.0f, 0.0f, 1.0f);
+        }
+        int const x_75 = one;
+        v[x_75] = 1.0f;
+        bool const x_77 = alwaysFalse;
+        if (x_77) {
+          discard_fragment();
+        }
+        float const x_81 = x_9.injectionSwitch.y;
+        if ((x_81 < 0.0f)) {
+          *(tint_symbol_5) = float4(0.0f, 1.0f, 0.0f, 1.0f);
+        }
+      }
+      {
+        int const x_85 = i;
+        i = (x_85 + 1);
+      }
+    }
+    {
+      int const x_87 = one;
+      if ((x_87 < 0)) {
+      } else {
+        break;
+      }
+    }
+  }
+  bool x_102 = false;
+  bool x_103_phi = false;
+  float const x_90 = (*(tint_symbol_6)).y;
+  if ((x_90 >= 0.0f)) {
+    float const x_96 = v.y;
+    bool const x_97 = (x_96 == 1.0f);
+    x_103_phi = x_97;
+    if (x_97) {
+      float const x_101 = floats.arr[1];
+      x_102 = (x_101 == 1.0f);
+      x_103_phi = x_102;
+    }
+    bool const x_103 = x_103_phi;
+    if (x_103) {
+      *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    }
+  } else {
+    *(tint_symbol_5) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_9, &(tint_symbol_8), &(tint_symbol_7));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..f3b9a3a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,239 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 134
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %v "v"
+               OpName %floats "floats"
+               OpName %one "one"
+               OpName %i "i"
+               OpName %alwaysFalse "alwaysFalse"
+               OpName %x_102 "x_102"
+               OpName %x_103_phi "x_103_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_float_uint_9 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %21 = OpConstantNull %v2float
+       %uint = OpTypeInt 32 0
+     %uint_9 = OpConstant %uint 9
+%_arr_float_uint_9 = OpTypeArray %float %uint_9
+%_ptr_Function__arr_float_uint_9 = OpTypePointer Function %_arr_float_uint_9
+         %27 = OpConstantNull %_arr_float_uint_9
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %31 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %36 = OpConstantNull %bool
+    %float_0 = OpConstant %float 0
+         %38 = OpConstantComposite %v2float %float_0 %float_0
+      %int_1 = OpConstant %int 1
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_0 = OpConstant %int 0
+    %float_1 = OpConstant %float 1
+         %79 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+         %90 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+%_ptr_Private_float = OpTypePointer Private %float
+        %119 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %120 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+        %121 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %v = OpVariable %_ptr_Function_v2float Function %21
+     %floats = OpVariable %_ptr_Function__arr_float_uint_9 Function %27
+        %one = OpVariable %_ptr_Function_int Function %31
+          %i = OpVariable %_ptr_Function_int Function %31
+%alwaysFalse = OpVariable %_ptr_Function_bool Function %36
+      %x_102 = OpVariable %_ptr_Function_bool Function %36
+  %x_103_phi = OpVariable %_ptr_Function_bool Function %36
+               OpStore %v %38
+         %41 = OpAccessChain %_ptr_Function_float %floats %int_1
+               OpStore %41 %float_0
+         %45 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_1
+         %46 = OpLoad %float %45
+         %47 = OpConvertFToS %int %46
+               OpStore %one %47
+               OpBranch %48
+         %48 = OpLabel
+               OpLoopMerge %49 %50 None
+               OpBranch %51
+         %51 = OpLabel
+               OpStore %i %int_0
+               OpBranch %53
+         %53 = OpLabel
+               OpLoopMerge %54 %55 None
+               OpBranch %56
+         %56 = OpLabel
+         %57 = OpLoad %int %i
+         %58 = OpLoad %int %one
+         %59 = OpSLessThan %bool %57 %58
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %62
+         %61 = OpLabel
+               OpBranch %60
+         %62 = OpLabel
+               OpBranch %54
+         %60 = OpLabel
+         %63 = OpLoad %int %i
+         %64 = OpIEqual %bool %63 %int_0
+               OpSelectionMerge %65 None
+               OpBranchConditional %64 %66 %65
+         %66 = OpLabel
+         %67 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_0
+         %68 = OpLoad %float %67
+         %69 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_1
+         %70 = OpLoad %float %69
+         %71 = OpFOrdGreaterThan %bool %68 %70
+               OpStore %alwaysFalse %71
+         %72 = OpLoad %bool %alwaysFalse
+         %73 = OpLogicalNot %bool %72
+               OpSelectionMerge %74 None
+               OpBranchConditional %73 %75 %74
+         %75 = OpLabel
+         %76 = OpLoad %int %one
+         %77 = OpAccessChain %_ptr_Function_float %floats %76
+               OpStore %77 %float_1
+               OpStore %x_GLF_color %79
+               OpBranch %74
+         %74 = OpLabel
+         %80 = OpLoad %int %one
+         %81 = OpAccessChain %_ptr_Function_float %v %80
+               OpStore %81 %float_1
+         %82 = OpLoad %bool %alwaysFalse
+               OpSelectionMerge %83 None
+               OpBranchConditional %82 %84 %83
+         %84 = OpLabel
+               OpKill
+         %83 = OpLabel
+         %85 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_1
+         %86 = OpLoad %float %85
+         %87 = OpFOrdLessThan %bool %86 %float_0
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %88
+         %89 = OpLabel
+               OpStore %x_GLF_color %90
+               OpBranch %88
+         %88 = OpLabel
+               OpBranch %65
+         %65 = OpLabel
+               OpBranch %55
+         %55 = OpLabel
+         %91 = OpLoad %int %i
+         %92 = OpIAdd %int %91 %int_1
+               OpStore %i %92
+               OpBranch %53
+         %54 = OpLabel
+               OpBranch %50
+         %50 = OpLabel
+         %93 = OpLoad %int %one
+         %94 = OpSLessThan %bool %93 %int_0
+               OpSelectionMerge %95 None
+               OpBranchConditional %94 %96 %97
+         %96 = OpLabel
+               OpBranch %95
+         %97 = OpLabel
+               OpBranch %49
+         %95 = OpLabel
+               OpBranch %48
+         %49 = OpLabel
+        %101 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %102 = OpLoad %float %101
+        %103 = OpFOrdGreaterThanEqual %bool %102 %float_0
+               OpSelectionMerge %104 None
+               OpBranchConditional %103 %105 %106
+        %105 = OpLabel
+        %107 = OpAccessChain %_ptr_Function_float %v %uint_1
+        %108 = OpLoad %float %107
+        %109 = OpFOrdEqual %bool %108 %float_1
+               OpStore %x_103_phi %109
+               OpSelectionMerge %110 None
+               OpBranchConditional %109 %111 %110
+        %111 = OpLabel
+        %112 = OpAccessChain %_ptr_Function_float %floats %int_1
+        %113 = OpLoad %float %112
+        %114 = OpFOrdEqual %bool %113 %float_1
+               OpStore %x_102 %114
+        %115 = OpLoad %bool %x_102
+               OpStore %x_103_phi %115
+               OpBranch %110
+        %110 = OpLabel
+        %116 = OpLoad %bool %x_103_phi
+               OpSelectionMerge %117 None
+               OpBranchConditional %116 %118 %117
+        %118 = OpLabel
+               OpStore %x_GLF_color %119
+               OpBranch %117
+        %117 = OpLabel
+               OpBranch %104
+        %106 = OpLabel
+               OpStore %x_GLF_color %120
+               OpBranch %104
+        %104 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %121
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %125 = OpLabel
+        %126 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %126
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %128 = OpLabel
+        %129 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %129
+        %130 = OpFunctionCall %void %main_1
+        %132 = OpLoad %v4float %x_GLF_color
+        %133 = OpCompositeConstruct %main_out %132
+        %131 = OpFunctionCall %void %tint_symbol_3 %133
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 50[%50] is not post dominated by the back-edge block 95[%95]
+  %95 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..6d6d467
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,100 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  var v : vec2<f32>;
+  var floats : array<f32, 9>;
+  var one : i32;
+  var i : i32;
+  var alwaysFalse : bool;
+  v = vec2<f32>(0.0, 0.0);
+  floats[1] = 0.0;
+  let x_46 : f32 = x_9.injectionSwitch.y;
+  one = i32(x_46);
+  loop {
+    i = 0;
+    loop {
+      let x_56 : i32 = i;
+      let x_57 : i32 = one;
+      if ((x_56 < x_57)) {
+      } else {
+        break;
+      }
+      let x_60 : i32 = i;
+      if ((x_60 == 0)) {
+        let x_65 : f32 = x_9.injectionSwitch.x;
+        let x_67 : f32 = x_9.injectionSwitch.y;
+        alwaysFalse = (x_65 > x_67);
+        let x_69 : bool = alwaysFalse;
+        if (!(x_69)) {
+          let x_73 : i32 = one;
+          floats[x_73] = 1.0;
+          x_GLF_color = vec4<f32>(1.0, 1.0, 0.0, 1.0);
+        }
+        let x_75 : i32 = one;
+        v[x_75] = 1.0;
+        let x_77 : bool = alwaysFalse;
+        if (x_77) {
+          discard;
+        }
+        let x_81 : f32 = x_9.injectionSwitch.y;
+        if ((x_81 < 0.0)) {
+          x_GLF_color = vec4<f32>(0.0, 1.0, 0.0, 1.0);
+        }
+      }
+
+      continuing {
+        let x_85 : i32 = i;
+        i = (x_85 + 1);
+      }
+    }
+
+    continuing {
+      let x_87 : i32 = one;
+      if ((x_87 < 0)) {
+      } else {
+        break;
+      }
+    }
+  }
+  var x_102 : bool;
+  var x_103_phi : bool;
+  let x_90 : f32 = gl_FragCoord.y;
+  if ((x_90 >= 0.0)) {
+    let x_96 : f32 = v.y;
+    let x_97 : bool = (x_96 == 1.0);
+    x_103_phi = x_97;
+    if (x_97) {
+      let x_101 : f32 = floats[1];
+      x_102 = (x_101 == 1.0);
+      x_103_phi = x_102;
+    }
+    let x_103 : bool = x_103_phi;
+    if (x_103) {
+      x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    }
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.wgsl
new file mode 100644
index 0000000..6d6d467
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.wgsl
@@ -0,0 +1,100 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  var v : vec2<f32>;
+  var floats : array<f32, 9>;
+  var one : i32;
+  var i : i32;
+  var alwaysFalse : bool;
+  v = vec2<f32>(0.0, 0.0);
+  floats[1] = 0.0;
+  let x_46 : f32 = x_9.injectionSwitch.y;
+  one = i32(x_46);
+  loop {
+    i = 0;
+    loop {
+      let x_56 : i32 = i;
+      let x_57 : i32 = one;
+      if ((x_56 < x_57)) {
+      } else {
+        break;
+      }
+      let x_60 : i32 = i;
+      if ((x_60 == 0)) {
+        let x_65 : f32 = x_9.injectionSwitch.x;
+        let x_67 : f32 = x_9.injectionSwitch.y;
+        alwaysFalse = (x_65 > x_67);
+        let x_69 : bool = alwaysFalse;
+        if (!(x_69)) {
+          let x_73 : i32 = one;
+          floats[x_73] = 1.0;
+          x_GLF_color = vec4<f32>(1.0, 1.0, 0.0, 1.0);
+        }
+        let x_75 : i32 = one;
+        v[x_75] = 1.0;
+        let x_77 : bool = alwaysFalse;
+        if (x_77) {
+          discard;
+        }
+        let x_81 : f32 = x_9.injectionSwitch.y;
+        if ((x_81 < 0.0)) {
+          x_GLF_color = vec4<f32>(0.0, 1.0, 0.0, 1.0);
+        }
+      }
+
+      continuing {
+        let x_85 : i32 = i;
+        i = (x_85 + 1);
+      }
+    }
+
+    continuing {
+      let x_87 : i32 = one;
+      if ((x_87 < 0)) {
+      } else {
+        break;
+      }
+    }
+  }
+  var x_102 : bool;
+  var x_103_phi : bool;
+  let x_90 : f32 = gl_FragCoord.y;
+  if ((x_90 >= 0.0)) {
+    let x_96 : f32 = v.y;
+    let x_97 : bool = (x_96 == 1.0);
+    x_103_phi = x_97;
+    if (x_97) {
+      let x_101 : f32 = floats[1];
+      x_102 = (x_101 == 1.0);
+      x_103_phi = x_102;
+    }
+    let x_103 : bool = x_103_phi;
+    if (x_103) {
+      x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    }
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..6f9a2b7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,89 @@
+void set_float2(inout float2 vec, int idx, float val) {
+  vec = (idx.xx == int2(0, 1)) ? val.xx : vec;
+}
+
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2 v = float2(0.0f, 0.0f);
+  float floats[9] = (float[9])0;
+  int one = 0;
+  int i = 0;
+  bool alwaysFalse = false;
+  v = float2(0.0f, 0.0f);
+  floats[1] = 0.0f;
+  const float x_46 = asfloat(x_9[0].y);
+  one = int(x_46);
+  while (true) {
+    i = 0;
+    {
+      for(; (i < one); i = (i + 1)) {
+        if ((i == 0)) {
+          const float x_65 = asfloat(x_9[0].x);
+          const float x_67 = asfloat(x_9[0].y);
+          alwaysFalse = (x_65 > x_67);
+          if (!(alwaysFalse)) {
+            floats[one] = 1.0f;
+            x_GLF_color = float4(1.0f, 1.0f, 0.0f, 1.0f);
+          }
+          set_float2(v, one, 1.0f);
+          if (alwaysFalse) {
+            discard;
+          }
+          const float x_81 = asfloat(x_9[0].y);
+          if ((x_81 < 0.0f)) {
+            x_GLF_color = float4(0.0f, 1.0f, 0.0f, 1.0f);
+          }
+        }
+      }
+    }
+    {
+      if ((one < 0)) {
+      } else {
+        break;
+      }
+    }
+  }
+  bool x_102 = false;
+  bool x_103_phi = false;
+  const float x_90 = gl_FragCoord.y;
+  if ((x_90 >= 0.0f)) {
+    const float x_96 = v.y;
+    const bool x_97 = (x_96 == 1.0f);
+    x_103_phi = x_97;
+    if (x_97) {
+      const float x_101 = floats[1];
+      x_102 = (x_101 == 1.0f);
+      x_103_phi = x_102;
+    }
+    if (x_103_phi) {
+      x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    }
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..bea4a4b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.wgsl.expected.msl
@@ -0,0 +1,102 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  float arr[9];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_9, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float2 v = 0.0f;
+  tint_array_wrapper floats = {};
+  int one = 0;
+  int i = 0;
+  bool alwaysFalse = false;
+  v = float2(0.0f, 0.0f);
+  floats.arr[1] = 0.0f;
+  float const x_46 = x_9.injectionSwitch.y;
+  one = int(x_46);
+  while (true) {
+    i = 0;
+    while (true) {
+      int const x_56 = i;
+      int const x_57 = one;
+      if ((x_56 < x_57)) {
+      } else {
+        break;
+      }
+      int const x_60 = i;
+      if ((x_60 == 0)) {
+        float const x_65 = x_9.injectionSwitch.x;
+        float const x_67 = x_9.injectionSwitch.y;
+        alwaysFalse = (x_65 > x_67);
+        bool const x_69 = alwaysFalse;
+        if (!(x_69)) {
+          int const x_73 = one;
+          floats.arr[x_73] = 1.0f;
+          *(tint_symbol_5) = float4(1.0f, 1.0f, 0.0f, 1.0f);
+        }
+        int const x_75 = one;
+        v[x_75] = 1.0f;
+        bool const x_77 = alwaysFalse;
+        if (x_77) {
+          discard_fragment();
+        }
+        float const x_81 = x_9.injectionSwitch.y;
+        if ((x_81 < 0.0f)) {
+          *(tint_symbol_5) = float4(0.0f, 1.0f, 0.0f, 1.0f);
+        }
+      }
+      {
+        int const x_85 = i;
+        i = (x_85 + 1);
+      }
+    }
+    {
+      int const x_87 = one;
+      if ((x_87 < 0)) {
+      } else {
+        break;
+      }
+    }
+  }
+  bool x_102 = false;
+  bool x_103_phi = false;
+  float const x_90 = (*(tint_symbol_6)).y;
+  if ((x_90 >= 0.0f)) {
+    float const x_96 = v.y;
+    bool const x_97 = (x_96 == 1.0f);
+    x_103_phi = x_97;
+    if (x_97) {
+      float const x_101 = floats.arr[1];
+      x_102 = (x_101 == 1.0f);
+      x_103_phi = x_102;
+    }
+    bool const x_103 = x_103_phi;
+    if (x_103) {
+      *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    }
+  } else {
+    *(tint_symbol_5) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_9, &(tint_symbol_8), &(tint_symbol_7));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..f3b9a3a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,239 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 134
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %v "v"
+               OpName %floats "floats"
+               OpName %one "one"
+               OpName %i "i"
+               OpName %alwaysFalse "alwaysFalse"
+               OpName %x_102 "x_102"
+               OpName %x_103_phi "x_103_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_float_uint_9 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %21 = OpConstantNull %v2float
+       %uint = OpTypeInt 32 0
+     %uint_9 = OpConstant %uint 9
+%_arr_float_uint_9 = OpTypeArray %float %uint_9
+%_ptr_Function__arr_float_uint_9 = OpTypePointer Function %_arr_float_uint_9
+         %27 = OpConstantNull %_arr_float_uint_9
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %31 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %36 = OpConstantNull %bool
+    %float_0 = OpConstant %float 0
+         %38 = OpConstantComposite %v2float %float_0 %float_0
+      %int_1 = OpConstant %int 1
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_0 = OpConstant %int 0
+    %float_1 = OpConstant %float 1
+         %79 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+         %90 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+%_ptr_Private_float = OpTypePointer Private %float
+        %119 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %120 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+        %121 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %v = OpVariable %_ptr_Function_v2float Function %21
+     %floats = OpVariable %_ptr_Function__arr_float_uint_9 Function %27
+        %one = OpVariable %_ptr_Function_int Function %31
+          %i = OpVariable %_ptr_Function_int Function %31
+%alwaysFalse = OpVariable %_ptr_Function_bool Function %36
+      %x_102 = OpVariable %_ptr_Function_bool Function %36
+  %x_103_phi = OpVariable %_ptr_Function_bool Function %36
+               OpStore %v %38
+         %41 = OpAccessChain %_ptr_Function_float %floats %int_1
+               OpStore %41 %float_0
+         %45 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_1
+         %46 = OpLoad %float %45
+         %47 = OpConvertFToS %int %46
+               OpStore %one %47
+               OpBranch %48
+         %48 = OpLabel
+               OpLoopMerge %49 %50 None
+               OpBranch %51
+         %51 = OpLabel
+               OpStore %i %int_0
+               OpBranch %53
+         %53 = OpLabel
+               OpLoopMerge %54 %55 None
+               OpBranch %56
+         %56 = OpLabel
+         %57 = OpLoad %int %i
+         %58 = OpLoad %int %one
+         %59 = OpSLessThan %bool %57 %58
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %62
+         %61 = OpLabel
+               OpBranch %60
+         %62 = OpLabel
+               OpBranch %54
+         %60 = OpLabel
+         %63 = OpLoad %int %i
+         %64 = OpIEqual %bool %63 %int_0
+               OpSelectionMerge %65 None
+               OpBranchConditional %64 %66 %65
+         %66 = OpLabel
+         %67 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_0
+         %68 = OpLoad %float %67
+         %69 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_1
+         %70 = OpLoad %float %69
+         %71 = OpFOrdGreaterThan %bool %68 %70
+               OpStore %alwaysFalse %71
+         %72 = OpLoad %bool %alwaysFalse
+         %73 = OpLogicalNot %bool %72
+               OpSelectionMerge %74 None
+               OpBranchConditional %73 %75 %74
+         %75 = OpLabel
+         %76 = OpLoad %int %one
+         %77 = OpAccessChain %_ptr_Function_float %floats %76
+               OpStore %77 %float_1
+               OpStore %x_GLF_color %79
+               OpBranch %74
+         %74 = OpLabel
+         %80 = OpLoad %int %one
+         %81 = OpAccessChain %_ptr_Function_float %v %80
+               OpStore %81 %float_1
+         %82 = OpLoad %bool %alwaysFalse
+               OpSelectionMerge %83 None
+               OpBranchConditional %82 %84 %83
+         %84 = OpLabel
+               OpKill
+         %83 = OpLabel
+         %85 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_1
+         %86 = OpLoad %float %85
+         %87 = OpFOrdLessThan %bool %86 %float_0
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %88
+         %89 = OpLabel
+               OpStore %x_GLF_color %90
+               OpBranch %88
+         %88 = OpLabel
+               OpBranch %65
+         %65 = OpLabel
+               OpBranch %55
+         %55 = OpLabel
+         %91 = OpLoad %int %i
+         %92 = OpIAdd %int %91 %int_1
+               OpStore %i %92
+               OpBranch %53
+         %54 = OpLabel
+               OpBranch %50
+         %50 = OpLabel
+         %93 = OpLoad %int %one
+         %94 = OpSLessThan %bool %93 %int_0
+               OpSelectionMerge %95 None
+               OpBranchConditional %94 %96 %97
+         %96 = OpLabel
+               OpBranch %95
+         %97 = OpLabel
+               OpBranch %49
+         %95 = OpLabel
+               OpBranch %48
+         %49 = OpLabel
+        %101 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %102 = OpLoad %float %101
+        %103 = OpFOrdGreaterThanEqual %bool %102 %float_0
+               OpSelectionMerge %104 None
+               OpBranchConditional %103 %105 %106
+        %105 = OpLabel
+        %107 = OpAccessChain %_ptr_Function_float %v %uint_1
+        %108 = OpLoad %float %107
+        %109 = OpFOrdEqual %bool %108 %float_1
+               OpStore %x_103_phi %109
+               OpSelectionMerge %110 None
+               OpBranchConditional %109 %111 %110
+        %111 = OpLabel
+        %112 = OpAccessChain %_ptr_Function_float %floats %int_1
+        %113 = OpLoad %float %112
+        %114 = OpFOrdEqual %bool %113 %float_1
+               OpStore %x_102 %114
+        %115 = OpLoad %bool %x_102
+               OpStore %x_103_phi %115
+               OpBranch %110
+        %110 = OpLabel
+        %116 = OpLoad %bool %x_103_phi
+               OpSelectionMerge %117 None
+               OpBranchConditional %116 %118 %117
+        %118 = OpLabel
+               OpStore %x_GLF_color %119
+               OpBranch %117
+        %117 = OpLabel
+               OpBranch %104
+        %106 = OpLabel
+               OpStore %x_GLF_color %120
+               OpBranch %104
+        %104 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %121
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %125 = OpLabel
+        %126 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %126
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %128 = OpLabel
+        %129 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %129
+        %130 = OpFunctionCall %void %main_1
+        %132 = OpLoad %v4float %x_GLF_color
+        %133 = OpCompositeConstruct %main_out %132
+        %131 = OpFunctionCall %void %tint_symbol_3 %133
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 50[%50] is not post dominated by the back-edge block 95[%95]
+  %95 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..6d6d467
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/create-color-in-do-while-for-loop/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,100 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  var v : vec2<f32>;
+  var floats : array<f32, 9>;
+  var one : i32;
+  var i : i32;
+  var alwaysFalse : bool;
+  v = vec2<f32>(0.0, 0.0);
+  floats[1] = 0.0;
+  let x_46 : f32 = x_9.injectionSwitch.y;
+  one = i32(x_46);
+  loop {
+    i = 0;
+    loop {
+      let x_56 : i32 = i;
+      let x_57 : i32 = one;
+      if ((x_56 < x_57)) {
+      } else {
+        break;
+      }
+      let x_60 : i32 = i;
+      if ((x_60 == 0)) {
+        let x_65 : f32 = x_9.injectionSwitch.x;
+        let x_67 : f32 = x_9.injectionSwitch.y;
+        alwaysFalse = (x_65 > x_67);
+        let x_69 : bool = alwaysFalse;
+        if (!(x_69)) {
+          let x_73 : i32 = one;
+          floats[x_73] = 1.0;
+          x_GLF_color = vec4<f32>(1.0, 1.0, 0.0, 1.0);
+        }
+        let x_75 : i32 = one;
+        v[x_75] = 1.0;
+        let x_77 : bool = alwaysFalse;
+        if (x_77) {
+          discard;
+        }
+        let x_81 : f32 = x_9.injectionSwitch.y;
+        if ((x_81 < 0.0)) {
+          x_GLF_color = vec4<f32>(0.0, 1.0, 0.0, 1.0);
+        }
+      }
+
+      continuing {
+        let x_85 : i32 = i;
+        i = (x_85 + 1);
+      }
+    }
+
+    continuing {
+      let x_87 : i32 = one;
+      if ((x_87 < 0)) {
+      } else {
+        break;
+      }
+    }
+  }
+  var x_102 : bool;
+  var x_103_phi : bool;
+  let x_90 : f32 = gl_FragCoord.y;
+  if ((x_90 >= 0.0)) {
+    let x_96 : f32 = v.y;
+    let x_97 : bool = (x_96 == 1.0);
+    x_103_phi = x_97;
+    if (x_97) {
+      let x_101 : f32 = floats[1];
+      x_102 = (x_101 == 1.0);
+      x_103_phi = x_102;
+    }
+    let x_103 : bool = x_103_phi;
+    if (x_103) {
+      x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    }
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/dead-barriers-in-loops/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/dead-barriers-in-loops/0-opt.spvasm
new file mode 100644
index 0000000..a59ed0e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/dead-barriers-in-loops/0-opt.spvasm
@@ -0,0 +1,196 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main"
+               OpExecutionMode %main LocalSize 1 1 1
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %theSSBO "theSSBO"
+               OpMemberName %theSSBO 0 "out_data"
+               OpName %_ ""
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "injectionSwitch"
+               OpName %__0 ""
+               OpName %i "i"
+               OpName %GLF_live3s "GLF_live3s"
+               OpName %i_0 "i"
+               OpName %z "z"
+               OpMemberDecorate %theSSBO 0 Offset 0
+               OpDecorate %theSSBO BufferBlock
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+    %theSSBO = OpTypeStruct %int
+%_ptr_Uniform_theSSBO = OpTypePointer Uniform %theSSBO
+          %_ = OpVariable %_ptr_Uniform_theSSBO Uniform
+      %int_0 = OpConstant %int 0
+     %int_42 = OpConstant %int 42
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+     %uint_2 = OpConstant %uint 2
+   %uint_264 = OpConstant %uint 264
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_0 = OpConstant %float 0
+      %int_2 = OpConstant %int 2
+    %float_1 = OpConstant %float 1
+       %main = OpFunction %void None %12
+         %34 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+ %GLF_live3s = OpVariable %_ptr_Function_float Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+          %z = OpVariable %_ptr_Function_int Function
+         %35 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+               OpStore %35 %int_42
+         %36 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %uint_0
+         %37 = OpLoad %float %36
+         %38 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %uint_1
+         %39 = OpLoad %float %38
+         %40 = OpFOrdGreaterThan %bool %37 %39
+               OpSelectionMerge %41 None
+               OpBranchConditional %40 %42 %41
+         %42 = OpLabel
+               OpControlBarrier %uint_2 %uint_2 %uint_264
+               OpBranch %41
+         %41 = OpLabel
+         %43 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %uint_0
+         %44 = OpLoad %float %43
+         %45 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %uint_1
+         %46 = OpLoad %float %45
+         %47 = OpFOrdGreaterThan %bool %44 %46
+               OpSelectionMerge %48 None
+               OpBranchConditional %47 %49 %48
+         %49 = OpLabel
+               OpControlBarrier %uint_2 %uint_2 %uint_264
+               OpBranch %48
+         %48 = OpLabel
+         %50 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %uint_1
+         %51 = OpLoad %float %50
+         %52 = OpConvertFToS %int %51
+               OpStore %i %52
+               OpBranch %53
+         %53 = OpLabel
+               OpLoopMerge %54 %55 None
+               OpBranch %56
+         %56 = OpLabel
+         %57 = OpLoad %int %i
+         %58 = OpSGreaterThan %bool %57 %int_0
+               OpBranchConditional %58 %59 %54
+         %59 = OpLabel
+               OpControlBarrier %uint_2 %uint_2 %uint_264
+               OpBranch %55
+         %55 = OpLabel
+         %60 = OpLoad %int %i
+         %61 = OpISub %int %60 %int_1
+               OpStore %i %61
+               OpBranch %53
+         %54 = OpLabel
+               OpStore %GLF_live3s %float_0
+               OpBranch %62
+         %62 = OpLabel
+               OpLoopMerge %63 %64 None
+               OpBranch %65
+         %65 = OpLabel
+               OpStore %i_0 %int_1
+               OpBranch %66
+         %66 = OpLabel
+               OpLoopMerge %67 %68 None
+               OpBranch %69
+         %69 = OpLabel
+         %70 = OpLoad %int %i_0
+         %71 = OpSLessThan %bool %70 %int_2
+               OpBranchConditional %71 %72 %67
+         %72 = OpLabel
+         %73 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %uint_0
+         %74 = OpLoad %float %73
+         %75 = OpFOrdGreaterThan %bool %74 %float_1
+               OpSelectionMerge %76 None
+               OpBranchConditional %75 %77 %76
+         %77 = OpLabel
+               OpControlBarrier %uint_2 %uint_2 %uint_264
+               OpBranch %76
+         %76 = OpLabel
+         %78 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %uint_0
+         %79 = OpLoad %float %78
+         %80 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %uint_1
+         %81 = OpLoad %float %80
+         %82 = OpFOrdGreaterThan %bool %79 %81
+               OpSelectionMerge %83 None
+               OpBranchConditional %82 %84 %83
+         %84 = OpLabel
+               OpControlBarrier %uint_2 %uint_2 %uint_264
+               OpBranch %83
+         %83 = OpLabel
+         %85 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %uint_1
+         %86 = OpLoad %float %85
+         %87 = OpConvertFToS %int %86
+               OpStore %z %87
+               OpBranch %88
+         %88 = OpLabel
+               OpLoopMerge %89 %90 None
+               OpBranch %91
+         %91 = OpLabel
+         %92 = OpLoad %int %z
+         %93 = OpSGreaterThan %bool %92 %int_0
+               OpBranchConditional %93 %94 %89
+         %94 = OpLabel
+         %95 = OpLoad %float %GLF_live3s
+         %96 = OpFAdd %float %95 %float_1
+               OpStore %GLF_live3s %96
+               OpBranch %90
+         %90 = OpLabel
+         %97 = OpLoad %int %z
+         %98 = OpISub %int %97 %int_1
+               OpStore %z %98
+               OpBranch %88
+         %89 = OpLabel
+         %99 = OpLoad %int %i_0
+        %100 = OpSGreaterThanEqual %bool %99 %int_1
+               OpSelectionMerge %101 None
+               OpBranchConditional %100 %102 %101
+        %102 = OpLabel
+        %103 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %uint_0
+        %104 = OpLoad %float %103
+        %105 = OpFOrdGreaterThan %bool %104 %float_1
+               OpSelectionMerge %106 None
+               OpBranchConditional %105 %107 %106
+        %107 = OpLabel
+               OpControlBarrier %uint_2 %uint_2 %uint_264
+               OpBranch %106
+        %106 = OpLabel
+               OpBranch %101
+        %101 = OpLabel
+               OpBranch %68
+         %68 = OpLabel
+        %108 = OpLoad %int %i_0
+        %109 = OpIAdd %int %108 %int_1
+               OpStore %i_0 %109
+               OpBranch %66
+         %67 = OpLabel
+               OpBranch %64
+         %64 = OpLabel
+        %110 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %uint_0
+        %111 = OpLoad %float %110
+        %112 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %uint_1
+        %113 = OpLoad %float %112
+        %114 = OpFOrdGreaterThan %bool %111 %113
+               OpBranchConditional %114 %62 %63
+         %63 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/dead-barriers-in-loops/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/dead-barriers-in-loops/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..a18cdf6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/dead-barriers-in-loops/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,74 @@
+RWByteAddressBuffer x_4 : register(u0, space0);
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[1];
+};
+
+void main_1() {
+  int i = 0;
+  float GLF_live3s = 0.0f;
+  int i_1 = 0;
+  int z = 0;
+  x_4.Store(0u, asuint(42));
+  const float x_37 = asfloat(x_6[0].x);
+  const float x_39 = asfloat(x_6[0].y);
+  if ((x_37 > x_39)) {
+    GroupMemoryBarrierWithGroupSync();
+  }
+  const float x_44 = asfloat(x_6[0].x);
+  const float x_46 = asfloat(x_6[0].y);
+  if ((x_44 > x_46)) {
+    GroupMemoryBarrierWithGroupSync();
+  }
+  const float x_51 = asfloat(x_6[0].y);
+  i = int(x_51);
+  {
+    for(; (i > 0); i = (i - 1)) {
+      GroupMemoryBarrierWithGroupSync();
+    }
+  }
+  GLF_live3s = 0.0f;
+  while (true) {
+    i_1 = 1;
+    {
+      for(; (i_1 < 2); i_1 = (i_1 + 1)) {
+        const float x_74 = asfloat(x_6[0].x);
+        if ((x_74 > 1.0f)) {
+          GroupMemoryBarrierWithGroupSync();
+        }
+        const float x_79 = asfloat(x_6[0].x);
+        const float x_81 = asfloat(x_6[0].y);
+        if ((x_79 > x_81)) {
+          GroupMemoryBarrierWithGroupSync();
+        }
+        const float x_86 = asfloat(x_6[0].y);
+        z = int(x_86);
+        {
+          for(; (z > 0); z = (z - 1)) {
+            GLF_live3s = (GLF_live3s + 1.0f);
+          }
+        }
+        if ((i_1 >= 1)) {
+          const float x_104 = asfloat(x_6[0].x);
+          if ((x_104 > 1.0f)) {
+            GroupMemoryBarrierWithGroupSync();
+          }
+        }
+      }
+    }
+    {
+      const float x_111 = asfloat(x_6[0].x);
+      const float x_113 = asfloat(x_6[0].y);
+      if ((x_111 > x_113)) {
+      } else {
+        break;
+      }
+    }
+  }
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void main() {
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/dead-barriers-in-loops/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/dead-barriers-in-loops/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..3fa3858
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/dead-barriers-in-loops/0-opt.spvasm.expected.msl
@@ -0,0 +1,102 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct theSSBO {
+  /* 0x0000 */ int out_data;
+};
+struct buf1 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+
+void main_1(constant buf1& x_6, device theSSBO& x_4) {
+  int i = 0;
+  float GLF_live3s = 0.0f;
+  int i_1 = 0;
+  int z = 0;
+  x_4.out_data = 42;
+  float const x_37 = x_6.injectionSwitch.x;
+  float const x_39 = x_6.injectionSwitch.y;
+  if ((x_37 > x_39)) {
+    threadgroup_barrier(mem_flags::mem_threadgroup);
+  }
+  float const x_44 = x_6.injectionSwitch.x;
+  float const x_46 = x_6.injectionSwitch.y;
+  if ((x_44 > x_46)) {
+    threadgroup_barrier(mem_flags::mem_threadgroup);
+  }
+  float const x_51 = x_6.injectionSwitch.y;
+  i = int(x_51);
+  while (true) {
+    int const x_57 = i;
+    if ((x_57 > 0)) {
+    } else {
+      break;
+    }
+    threadgroup_barrier(mem_flags::mem_threadgroup);
+    {
+      int const x_60 = i;
+      i = (x_60 - 1);
+    }
+  }
+  GLF_live3s = 0.0f;
+  while (true) {
+    i_1 = 1;
+    while (true) {
+      int const x_70 = i_1;
+      if ((x_70 < 2)) {
+      } else {
+        break;
+      }
+      float const x_74 = x_6.injectionSwitch.x;
+      if ((x_74 > 1.0f)) {
+        threadgroup_barrier(mem_flags::mem_threadgroup);
+      }
+      float const x_79 = x_6.injectionSwitch.x;
+      float const x_81 = x_6.injectionSwitch.y;
+      if ((x_79 > x_81)) {
+        threadgroup_barrier(mem_flags::mem_threadgroup);
+      }
+      float const x_86 = x_6.injectionSwitch.y;
+      z = int(x_86);
+      while (true) {
+        int const x_92 = z;
+        if ((x_92 > 0)) {
+        } else {
+          break;
+        }
+        float const x_95 = GLF_live3s;
+        GLF_live3s = (x_95 + 1.0f);
+        {
+          int const x_97 = z;
+          z = (x_97 - 1);
+        }
+      }
+      int const x_99 = i_1;
+      if ((x_99 >= 1)) {
+        float const x_104 = x_6.injectionSwitch.x;
+        if ((x_104 > 1.0f)) {
+          threadgroup_barrier(mem_flags::mem_threadgroup);
+        }
+      }
+      {
+        int const x_108 = i_1;
+        i_1 = (x_108 + 1);
+      }
+    }
+    {
+      float const x_111 = x_6.injectionSwitch.x;
+      float const x_113 = x_6.injectionSwitch.y;
+      if ((x_111 > x_113)) {
+      } else {
+        break;
+      }
+    }
+  }
+  return;
+}
+
+kernel void tint_symbol(constant buf1& x_6 [[buffer(1)]], device theSSBO& x_4 [[buffer(0)]]) {
+  main_1(x_6, x_4);
+  return;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/dead-barriers-in-loops/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/dead-barriers-in-loops/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..62ce971
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/dead-barriers-in-loops/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,235 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 134
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main"
+               OpExecutionMode %main LocalSize 1 1 1
+               OpName %theSSBO "theSSBO"
+               OpMemberName %theSSBO 0 "out_data"
+               OpName %x_4 "x_4"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %GLF_live3s "GLF_live3s"
+               OpName %i_1 "i_1"
+               OpName %z "z"
+               OpName %main "main"
+               OpDecorate %theSSBO Block
+               OpMemberDecorate %theSSBO 0 Offset 0
+               OpDecorate %x_4 DescriptorSet 0
+               OpDecorate %x_4 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+        %int = OpTypeInt 32 1
+    %theSSBO = OpTypeStruct %int
+%_ptr_StorageBuffer_theSSBO = OpTypePointer StorageBuffer %theSSBO
+        %x_4 = OpVariable %_ptr_StorageBuffer_theSSBO StorageBuffer
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %16 = OpConstantNull %int
+%_ptr_Function_float = OpTypePointer Function %float
+         %19 = OpConstantNull %float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+     %int_42 = OpConstant %int 42
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+     %uint_2 = OpConstant %uint 2
+   %uint_264 = OpConstant %uint 264
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+      %int_2 = OpConstant %int 2
+    %float_1 = OpConstant %float 1
+     %main_1 = OpFunction %void None %10
+         %13 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %16
+ %GLF_live3s = OpVariable %_ptr_Function_float Function %19
+        %i_1 = OpVariable %_ptr_Function_int Function %16
+          %z = OpVariable %_ptr_Function_int Function %16
+         %25 = OpAccessChain %_ptr_StorageBuffer_int %x_4 %uint_0
+               OpStore %25 %int_42
+         %28 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+         %29 = OpLoad %float %28
+         %31 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %32 = OpLoad %float %31
+         %33 = OpFOrdGreaterThan %bool %29 %32
+               OpSelectionMerge %35 None
+               OpBranchConditional %33 %36 %35
+         %36 = OpLabel
+               OpControlBarrier %uint_2 %uint_2 %uint_264
+               OpBranch %35
+         %35 = OpLabel
+         %40 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+         %41 = OpLoad %float %40
+         %42 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %43 = OpLoad %float %42
+         %44 = OpFOrdGreaterThan %bool %41 %43
+               OpSelectionMerge %45 None
+               OpBranchConditional %44 %46 %45
+         %46 = OpLabel
+               OpControlBarrier %uint_2 %uint_2 %uint_264
+               OpBranch %45
+         %45 = OpLabel
+         %48 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %49 = OpLoad %float %48
+         %50 = OpConvertFToS %int %49
+               OpStore %i %50
+               OpBranch %51
+         %51 = OpLabel
+               OpLoopMerge %52 %53 None
+               OpBranch %54
+         %54 = OpLabel
+         %55 = OpLoad %int %i
+         %57 = OpSGreaterThan %bool %55 %int_0
+               OpSelectionMerge %58 None
+               OpBranchConditional %57 %59 %60
+         %59 = OpLabel
+               OpBranch %58
+         %60 = OpLabel
+               OpBranch %52
+         %58 = OpLabel
+               OpControlBarrier %uint_2 %uint_2 %uint_264
+               OpBranch %53
+         %53 = OpLabel
+         %62 = OpLoad %int %i
+         %64 = OpISub %int %62 %int_1
+               OpStore %i %64
+               OpBranch %51
+         %52 = OpLabel
+               OpStore %GLF_live3s %float_0
+               OpBranch %66
+         %66 = OpLabel
+               OpLoopMerge %67 %68 None
+               OpBranch %69
+         %69 = OpLabel
+               OpStore %i_1 %int_1
+               OpBranch %70
+         %70 = OpLabel
+               OpLoopMerge %71 %72 None
+               OpBranch %73
+         %73 = OpLabel
+         %74 = OpLoad %int %i_1
+         %76 = OpSLessThan %bool %74 %int_2
+               OpSelectionMerge %77 None
+               OpBranchConditional %76 %78 %79
+         %78 = OpLabel
+               OpBranch %77
+         %79 = OpLabel
+               OpBranch %71
+         %77 = OpLabel
+         %80 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+         %81 = OpLoad %float %80
+         %83 = OpFOrdGreaterThan %bool %81 %float_1
+               OpSelectionMerge %84 None
+               OpBranchConditional %83 %85 %84
+         %85 = OpLabel
+               OpControlBarrier %uint_2 %uint_2 %uint_264
+               OpBranch %84
+         %84 = OpLabel
+         %87 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+         %88 = OpLoad %float %87
+         %89 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %90 = OpLoad %float %89
+         %91 = OpFOrdGreaterThan %bool %88 %90
+               OpSelectionMerge %92 None
+               OpBranchConditional %91 %93 %92
+         %93 = OpLabel
+               OpControlBarrier %uint_2 %uint_2 %uint_264
+               OpBranch %92
+         %92 = OpLabel
+         %95 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %96 = OpLoad %float %95
+         %97 = OpConvertFToS %int %96
+               OpStore %z %97
+               OpBranch %98
+         %98 = OpLabel
+               OpLoopMerge %99 %100 None
+               OpBranch %101
+        %101 = OpLabel
+        %102 = OpLoad %int %z
+        %103 = OpSGreaterThan %bool %102 %int_0
+               OpSelectionMerge %104 None
+               OpBranchConditional %103 %105 %106
+        %105 = OpLabel
+               OpBranch %104
+        %106 = OpLabel
+               OpBranch %99
+        %104 = OpLabel
+        %107 = OpLoad %float %GLF_live3s
+        %108 = OpFAdd %float %107 %float_1
+               OpStore %GLF_live3s %108
+               OpBranch %100
+        %100 = OpLabel
+        %109 = OpLoad %int %z
+        %110 = OpISub %int %109 %int_1
+               OpStore %z %110
+               OpBranch %98
+         %99 = OpLabel
+        %111 = OpLoad %int %i_1
+        %112 = OpSGreaterThanEqual %bool %111 %int_1
+               OpSelectionMerge %113 None
+               OpBranchConditional %112 %114 %113
+        %114 = OpLabel
+        %115 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+        %116 = OpLoad %float %115
+        %117 = OpFOrdGreaterThan %bool %116 %float_1
+               OpSelectionMerge %118 None
+               OpBranchConditional %117 %119 %118
+        %119 = OpLabel
+               OpControlBarrier %uint_2 %uint_2 %uint_264
+               OpBranch %118
+        %118 = OpLabel
+               OpBranch %113
+        %113 = OpLabel
+               OpBranch %72
+         %72 = OpLabel
+        %121 = OpLoad %int %i_1
+        %122 = OpIAdd %int %121 %int_1
+               OpStore %i_1 %122
+               OpBranch %70
+         %71 = OpLabel
+               OpBranch %68
+         %68 = OpLabel
+        %123 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+        %124 = OpLoad %float %123
+        %125 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+        %126 = OpLoad %float %125
+        %127 = OpFOrdGreaterThan %bool %124 %126
+               OpSelectionMerge %128 None
+               OpBranchConditional %127 %129 %130
+        %129 = OpLabel
+               OpBranch %128
+        %130 = OpLabel
+               OpBranch %67
+        %128 = OpLabel
+               OpBranch %66
+         %67 = OpLabel
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %10
+        %132 = OpLabel
+        %133 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 68[%68] is not post dominated by the back-edge block 128[%128]
+  %128 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/dead-barriers-in-loops/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/dead-barriers-in-loops/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..899baac
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/dead-barriers-in-loops/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,109 @@
+[[block]]
+struct theSSBO {
+  out_data : i32;
+};
+
+[[block]]
+struct buf1 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<storage, read_write> x_4 : theSSBO;
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+fn main_1() {
+  var i : i32;
+  var GLF_live3s : f32;
+  var i_1 : i32;
+  var z : i32;
+  x_4.out_data = 42;
+  let x_37 : f32 = x_6.injectionSwitch.x;
+  let x_39 : f32 = x_6.injectionSwitch.y;
+  if ((x_37 > x_39)) {
+    workgroupBarrier();
+  }
+  let x_44 : f32 = x_6.injectionSwitch.x;
+  let x_46 : f32 = x_6.injectionSwitch.y;
+  if ((x_44 > x_46)) {
+    workgroupBarrier();
+  }
+  let x_51 : f32 = x_6.injectionSwitch.y;
+  i = i32(x_51);
+  loop {
+    let x_57 : i32 = i;
+    if ((x_57 > 0)) {
+    } else {
+      break;
+    }
+    workgroupBarrier();
+
+    continuing {
+      let x_60 : i32 = i;
+      i = (x_60 - 1);
+    }
+  }
+  GLF_live3s = 0.0;
+  loop {
+    i_1 = 1;
+    loop {
+      let x_70 : i32 = i_1;
+      if ((x_70 < 2)) {
+      } else {
+        break;
+      }
+      let x_74 : f32 = x_6.injectionSwitch.x;
+      if ((x_74 > 1.0)) {
+        workgroupBarrier();
+      }
+      let x_79 : f32 = x_6.injectionSwitch.x;
+      let x_81 : f32 = x_6.injectionSwitch.y;
+      if ((x_79 > x_81)) {
+        workgroupBarrier();
+      }
+      let x_86 : f32 = x_6.injectionSwitch.y;
+      z = i32(x_86);
+      loop {
+        let x_92 : i32 = z;
+        if ((x_92 > 0)) {
+        } else {
+          break;
+        }
+        let x_95 : f32 = GLF_live3s;
+        GLF_live3s = (x_95 + 1.0);
+
+        continuing {
+          let x_97 : i32 = z;
+          z = (x_97 - 1);
+        }
+      }
+      let x_99 : i32 = i_1;
+      if ((x_99 >= 1)) {
+        let x_104 : f32 = x_6.injectionSwitch.x;
+        if ((x_104 > 1.0)) {
+          workgroupBarrier();
+        }
+      }
+
+      continuing {
+        let x_108 : i32 = i_1;
+        i_1 = (x_108 + 1);
+      }
+    }
+
+    continuing {
+      let x_111 : f32 = x_6.injectionSwitch.x;
+      let x_113 : f32 = x_6.injectionSwitch.y;
+      if ((x_111 > x_113)) {
+      } else {
+        break;
+      }
+    }
+  }
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main() {
+  main_1();
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/dead-barriers-in-loops/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/dead-barriers-in-loops/0-opt.wgsl
new file mode 100644
index 0000000..899baac
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/dead-barriers-in-loops/0-opt.wgsl
@@ -0,0 +1,109 @@
+[[block]]
+struct theSSBO {
+  out_data : i32;
+};
+
+[[block]]
+struct buf1 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<storage, read_write> x_4 : theSSBO;
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+fn main_1() {
+  var i : i32;
+  var GLF_live3s : f32;
+  var i_1 : i32;
+  var z : i32;
+  x_4.out_data = 42;
+  let x_37 : f32 = x_6.injectionSwitch.x;
+  let x_39 : f32 = x_6.injectionSwitch.y;
+  if ((x_37 > x_39)) {
+    workgroupBarrier();
+  }
+  let x_44 : f32 = x_6.injectionSwitch.x;
+  let x_46 : f32 = x_6.injectionSwitch.y;
+  if ((x_44 > x_46)) {
+    workgroupBarrier();
+  }
+  let x_51 : f32 = x_6.injectionSwitch.y;
+  i = i32(x_51);
+  loop {
+    let x_57 : i32 = i;
+    if ((x_57 > 0)) {
+    } else {
+      break;
+    }
+    workgroupBarrier();
+
+    continuing {
+      let x_60 : i32 = i;
+      i = (x_60 - 1);
+    }
+  }
+  GLF_live3s = 0.0;
+  loop {
+    i_1 = 1;
+    loop {
+      let x_70 : i32 = i_1;
+      if ((x_70 < 2)) {
+      } else {
+        break;
+      }
+      let x_74 : f32 = x_6.injectionSwitch.x;
+      if ((x_74 > 1.0)) {
+        workgroupBarrier();
+      }
+      let x_79 : f32 = x_6.injectionSwitch.x;
+      let x_81 : f32 = x_6.injectionSwitch.y;
+      if ((x_79 > x_81)) {
+        workgroupBarrier();
+      }
+      let x_86 : f32 = x_6.injectionSwitch.y;
+      z = i32(x_86);
+      loop {
+        let x_92 : i32 = z;
+        if ((x_92 > 0)) {
+        } else {
+          break;
+        }
+        let x_95 : f32 = GLF_live3s;
+        GLF_live3s = (x_95 + 1.0);
+
+        continuing {
+          let x_97 : i32 = z;
+          z = (x_97 - 1);
+        }
+      }
+      let x_99 : i32 = i_1;
+      if ((x_99 >= 1)) {
+        let x_104 : f32 = x_6.injectionSwitch.x;
+        if ((x_104 > 1.0)) {
+          workgroupBarrier();
+        }
+      }
+
+      continuing {
+        let x_108 : i32 = i_1;
+        i_1 = (x_108 + 1);
+      }
+    }
+
+    continuing {
+      let x_111 : f32 = x_6.injectionSwitch.x;
+      let x_113 : f32 = x_6.injectionSwitch.y;
+      if ((x_111 > x_113)) {
+      } else {
+        break;
+      }
+    }
+  }
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main() {
+  main_1();
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/dead-barriers-in-loops/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/dead-barriers-in-loops/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..a18cdf6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/dead-barriers-in-loops/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,74 @@
+RWByteAddressBuffer x_4 : register(u0, space0);
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[1];
+};
+
+void main_1() {
+  int i = 0;
+  float GLF_live3s = 0.0f;
+  int i_1 = 0;
+  int z = 0;
+  x_4.Store(0u, asuint(42));
+  const float x_37 = asfloat(x_6[0].x);
+  const float x_39 = asfloat(x_6[0].y);
+  if ((x_37 > x_39)) {
+    GroupMemoryBarrierWithGroupSync();
+  }
+  const float x_44 = asfloat(x_6[0].x);
+  const float x_46 = asfloat(x_6[0].y);
+  if ((x_44 > x_46)) {
+    GroupMemoryBarrierWithGroupSync();
+  }
+  const float x_51 = asfloat(x_6[0].y);
+  i = int(x_51);
+  {
+    for(; (i > 0); i = (i - 1)) {
+      GroupMemoryBarrierWithGroupSync();
+    }
+  }
+  GLF_live3s = 0.0f;
+  while (true) {
+    i_1 = 1;
+    {
+      for(; (i_1 < 2); i_1 = (i_1 + 1)) {
+        const float x_74 = asfloat(x_6[0].x);
+        if ((x_74 > 1.0f)) {
+          GroupMemoryBarrierWithGroupSync();
+        }
+        const float x_79 = asfloat(x_6[0].x);
+        const float x_81 = asfloat(x_6[0].y);
+        if ((x_79 > x_81)) {
+          GroupMemoryBarrierWithGroupSync();
+        }
+        const float x_86 = asfloat(x_6[0].y);
+        z = int(x_86);
+        {
+          for(; (z > 0); z = (z - 1)) {
+            GLF_live3s = (GLF_live3s + 1.0f);
+          }
+        }
+        if ((i_1 >= 1)) {
+          const float x_104 = asfloat(x_6[0].x);
+          if ((x_104 > 1.0f)) {
+            GroupMemoryBarrierWithGroupSync();
+          }
+        }
+      }
+    }
+    {
+      const float x_111 = asfloat(x_6[0].x);
+      const float x_113 = asfloat(x_6[0].y);
+      if ((x_111 > x_113)) {
+      } else {
+        break;
+      }
+    }
+  }
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void main() {
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/dead-barriers-in-loops/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/dead-barriers-in-loops/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..3fa3858
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/dead-barriers-in-loops/0-opt.wgsl.expected.msl
@@ -0,0 +1,102 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct theSSBO {
+  /* 0x0000 */ int out_data;
+};
+struct buf1 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+
+void main_1(constant buf1& x_6, device theSSBO& x_4) {
+  int i = 0;
+  float GLF_live3s = 0.0f;
+  int i_1 = 0;
+  int z = 0;
+  x_4.out_data = 42;
+  float const x_37 = x_6.injectionSwitch.x;
+  float const x_39 = x_6.injectionSwitch.y;
+  if ((x_37 > x_39)) {
+    threadgroup_barrier(mem_flags::mem_threadgroup);
+  }
+  float const x_44 = x_6.injectionSwitch.x;
+  float const x_46 = x_6.injectionSwitch.y;
+  if ((x_44 > x_46)) {
+    threadgroup_barrier(mem_flags::mem_threadgroup);
+  }
+  float const x_51 = x_6.injectionSwitch.y;
+  i = int(x_51);
+  while (true) {
+    int const x_57 = i;
+    if ((x_57 > 0)) {
+    } else {
+      break;
+    }
+    threadgroup_barrier(mem_flags::mem_threadgroup);
+    {
+      int const x_60 = i;
+      i = (x_60 - 1);
+    }
+  }
+  GLF_live3s = 0.0f;
+  while (true) {
+    i_1 = 1;
+    while (true) {
+      int const x_70 = i_1;
+      if ((x_70 < 2)) {
+      } else {
+        break;
+      }
+      float const x_74 = x_6.injectionSwitch.x;
+      if ((x_74 > 1.0f)) {
+        threadgroup_barrier(mem_flags::mem_threadgroup);
+      }
+      float const x_79 = x_6.injectionSwitch.x;
+      float const x_81 = x_6.injectionSwitch.y;
+      if ((x_79 > x_81)) {
+        threadgroup_barrier(mem_flags::mem_threadgroup);
+      }
+      float const x_86 = x_6.injectionSwitch.y;
+      z = int(x_86);
+      while (true) {
+        int const x_92 = z;
+        if ((x_92 > 0)) {
+        } else {
+          break;
+        }
+        float const x_95 = GLF_live3s;
+        GLF_live3s = (x_95 + 1.0f);
+        {
+          int const x_97 = z;
+          z = (x_97 - 1);
+        }
+      }
+      int const x_99 = i_1;
+      if ((x_99 >= 1)) {
+        float const x_104 = x_6.injectionSwitch.x;
+        if ((x_104 > 1.0f)) {
+          threadgroup_barrier(mem_flags::mem_threadgroup);
+        }
+      }
+      {
+        int const x_108 = i_1;
+        i_1 = (x_108 + 1);
+      }
+    }
+    {
+      float const x_111 = x_6.injectionSwitch.x;
+      float const x_113 = x_6.injectionSwitch.y;
+      if ((x_111 > x_113)) {
+      } else {
+        break;
+      }
+    }
+  }
+  return;
+}
+
+kernel void tint_symbol(constant buf1& x_6 [[buffer(1)]], device theSSBO& x_4 [[buffer(0)]]) {
+  main_1(x_6, x_4);
+  return;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/dead-barriers-in-loops/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/dead-barriers-in-loops/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..62ce971
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/dead-barriers-in-loops/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,235 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 134
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main"
+               OpExecutionMode %main LocalSize 1 1 1
+               OpName %theSSBO "theSSBO"
+               OpMemberName %theSSBO 0 "out_data"
+               OpName %x_4 "x_4"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %GLF_live3s "GLF_live3s"
+               OpName %i_1 "i_1"
+               OpName %z "z"
+               OpName %main "main"
+               OpDecorate %theSSBO Block
+               OpMemberDecorate %theSSBO 0 Offset 0
+               OpDecorate %x_4 DescriptorSet 0
+               OpDecorate %x_4 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+        %int = OpTypeInt 32 1
+    %theSSBO = OpTypeStruct %int
+%_ptr_StorageBuffer_theSSBO = OpTypePointer StorageBuffer %theSSBO
+        %x_4 = OpVariable %_ptr_StorageBuffer_theSSBO StorageBuffer
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %16 = OpConstantNull %int
+%_ptr_Function_float = OpTypePointer Function %float
+         %19 = OpConstantNull %float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+     %int_42 = OpConstant %int 42
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+     %uint_2 = OpConstant %uint 2
+   %uint_264 = OpConstant %uint 264
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+      %int_2 = OpConstant %int 2
+    %float_1 = OpConstant %float 1
+     %main_1 = OpFunction %void None %10
+         %13 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %16
+ %GLF_live3s = OpVariable %_ptr_Function_float Function %19
+        %i_1 = OpVariable %_ptr_Function_int Function %16
+          %z = OpVariable %_ptr_Function_int Function %16
+         %25 = OpAccessChain %_ptr_StorageBuffer_int %x_4 %uint_0
+               OpStore %25 %int_42
+         %28 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+         %29 = OpLoad %float %28
+         %31 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %32 = OpLoad %float %31
+         %33 = OpFOrdGreaterThan %bool %29 %32
+               OpSelectionMerge %35 None
+               OpBranchConditional %33 %36 %35
+         %36 = OpLabel
+               OpControlBarrier %uint_2 %uint_2 %uint_264
+               OpBranch %35
+         %35 = OpLabel
+         %40 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+         %41 = OpLoad %float %40
+         %42 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %43 = OpLoad %float %42
+         %44 = OpFOrdGreaterThan %bool %41 %43
+               OpSelectionMerge %45 None
+               OpBranchConditional %44 %46 %45
+         %46 = OpLabel
+               OpControlBarrier %uint_2 %uint_2 %uint_264
+               OpBranch %45
+         %45 = OpLabel
+         %48 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %49 = OpLoad %float %48
+         %50 = OpConvertFToS %int %49
+               OpStore %i %50
+               OpBranch %51
+         %51 = OpLabel
+               OpLoopMerge %52 %53 None
+               OpBranch %54
+         %54 = OpLabel
+         %55 = OpLoad %int %i
+         %57 = OpSGreaterThan %bool %55 %int_0
+               OpSelectionMerge %58 None
+               OpBranchConditional %57 %59 %60
+         %59 = OpLabel
+               OpBranch %58
+         %60 = OpLabel
+               OpBranch %52
+         %58 = OpLabel
+               OpControlBarrier %uint_2 %uint_2 %uint_264
+               OpBranch %53
+         %53 = OpLabel
+         %62 = OpLoad %int %i
+         %64 = OpISub %int %62 %int_1
+               OpStore %i %64
+               OpBranch %51
+         %52 = OpLabel
+               OpStore %GLF_live3s %float_0
+               OpBranch %66
+         %66 = OpLabel
+               OpLoopMerge %67 %68 None
+               OpBranch %69
+         %69 = OpLabel
+               OpStore %i_1 %int_1
+               OpBranch %70
+         %70 = OpLabel
+               OpLoopMerge %71 %72 None
+               OpBranch %73
+         %73 = OpLabel
+         %74 = OpLoad %int %i_1
+         %76 = OpSLessThan %bool %74 %int_2
+               OpSelectionMerge %77 None
+               OpBranchConditional %76 %78 %79
+         %78 = OpLabel
+               OpBranch %77
+         %79 = OpLabel
+               OpBranch %71
+         %77 = OpLabel
+         %80 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+         %81 = OpLoad %float %80
+         %83 = OpFOrdGreaterThan %bool %81 %float_1
+               OpSelectionMerge %84 None
+               OpBranchConditional %83 %85 %84
+         %85 = OpLabel
+               OpControlBarrier %uint_2 %uint_2 %uint_264
+               OpBranch %84
+         %84 = OpLabel
+         %87 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+         %88 = OpLoad %float %87
+         %89 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %90 = OpLoad %float %89
+         %91 = OpFOrdGreaterThan %bool %88 %90
+               OpSelectionMerge %92 None
+               OpBranchConditional %91 %93 %92
+         %93 = OpLabel
+               OpControlBarrier %uint_2 %uint_2 %uint_264
+               OpBranch %92
+         %92 = OpLabel
+         %95 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %96 = OpLoad %float %95
+         %97 = OpConvertFToS %int %96
+               OpStore %z %97
+               OpBranch %98
+         %98 = OpLabel
+               OpLoopMerge %99 %100 None
+               OpBranch %101
+        %101 = OpLabel
+        %102 = OpLoad %int %z
+        %103 = OpSGreaterThan %bool %102 %int_0
+               OpSelectionMerge %104 None
+               OpBranchConditional %103 %105 %106
+        %105 = OpLabel
+               OpBranch %104
+        %106 = OpLabel
+               OpBranch %99
+        %104 = OpLabel
+        %107 = OpLoad %float %GLF_live3s
+        %108 = OpFAdd %float %107 %float_1
+               OpStore %GLF_live3s %108
+               OpBranch %100
+        %100 = OpLabel
+        %109 = OpLoad %int %z
+        %110 = OpISub %int %109 %int_1
+               OpStore %z %110
+               OpBranch %98
+         %99 = OpLabel
+        %111 = OpLoad %int %i_1
+        %112 = OpSGreaterThanEqual %bool %111 %int_1
+               OpSelectionMerge %113 None
+               OpBranchConditional %112 %114 %113
+        %114 = OpLabel
+        %115 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+        %116 = OpLoad %float %115
+        %117 = OpFOrdGreaterThan %bool %116 %float_1
+               OpSelectionMerge %118 None
+               OpBranchConditional %117 %119 %118
+        %119 = OpLabel
+               OpControlBarrier %uint_2 %uint_2 %uint_264
+               OpBranch %118
+        %118 = OpLabel
+               OpBranch %113
+        %113 = OpLabel
+               OpBranch %72
+         %72 = OpLabel
+        %121 = OpLoad %int %i_1
+        %122 = OpIAdd %int %121 %int_1
+               OpStore %i_1 %122
+               OpBranch %70
+         %71 = OpLabel
+               OpBranch %68
+         %68 = OpLabel
+        %123 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+        %124 = OpLoad %float %123
+        %125 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+        %126 = OpLoad %float %125
+        %127 = OpFOrdGreaterThan %bool %124 %126
+               OpSelectionMerge %128 None
+               OpBranchConditional %127 %129 %130
+        %129 = OpLabel
+               OpBranch %128
+        %130 = OpLabel
+               OpBranch %67
+        %128 = OpLabel
+               OpBranch %66
+         %67 = OpLabel
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %10
+        %132 = OpLabel
+        %133 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 68[%68] is not post dominated by the back-edge block 128[%128]
+  %128 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/dead-barriers-in-loops/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/dead-barriers-in-loops/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..899baac
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/dead-barriers-in-loops/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,109 @@
+[[block]]
+struct theSSBO {
+  out_data : i32;
+};
+
+[[block]]
+struct buf1 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<storage, read_write> x_4 : theSSBO;
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+fn main_1() {
+  var i : i32;
+  var GLF_live3s : f32;
+  var i_1 : i32;
+  var z : i32;
+  x_4.out_data = 42;
+  let x_37 : f32 = x_6.injectionSwitch.x;
+  let x_39 : f32 = x_6.injectionSwitch.y;
+  if ((x_37 > x_39)) {
+    workgroupBarrier();
+  }
+  let x_44 : f32 = x_6.injectionSwitch.x;
+  let x_46 : f32 = x_6.injectionSwitch.y;
+  if ((x_44 > x_46)) {
+    workgroupBarrier();
+  }
+  let x_51 : f32 = x_6.injectionSwitch.y;
+  i = i32(x_51);
+  loop {
+    let x_57 : i32 = i;
+    if ((x_57 > 0)) {
+    } else {
+      break;
+    }
+    workgroupBarrier();
+
+    continuing {
+      let x_60 : i32 = i;
+      i = (x_60 - 1);
+    }
+  }
+  GLF_live3s = 0.0;
+  loop {
+    i_1 = 1;
+    loop {
+      let x_70 : i32 = i_1;
+      if ((x_70 < 2)) {
+      } else {
+        break;
+      }
+      let x_74 : f32 = x_6.injectionSwitch.x;
+      if ((x_74 > 1.0)) {
+        workgroupBarrier();
+      }
+      let x_79 : f32 = x_6.injectionSwitch.x;
+      let x_81 : f32 = x_6.injectionSwitch.y;
+      if ((x_79 > x_81)) {
+        workgroupBarrier();
+      }
+      let x_86 : f32 = x_6.injectionSwitch.y;
+      z = i32(x_86);
+      loop {
+        let x_92 : i32 = z;
+        if ((x_92 > 0)) {
+        } else {
+          break;
+        }
+        let x_95 : f32 = GLF_live3s;
+        GLF_live3s = (x_95 + 1.0);
+
+        continuing {
+          let x_97 : i32 = z;
+          z = (x_97 - 1);
+        }
+      }
+      let x_99 : i32 = i_1;
+      if ((x_99 >= 1)) {
+        let x_104 : f32 = x_6.injectionSwitch.x;
+        if ((x_104 > 1.0)) {
+          workgroupBarrier();
+        }
+      }
+
+      continuing {
+        let x_108 : i32 = i_1;
+        i_1 = (x_108 + 1);
+      }
+    }
+
+    continuing {
+      let x_111 : f32 = x_6.injectionSwitch.x;
+      let x_113 : f32 = x_6.injectionSwitch.y;
+      if ((x_111 > x_113)) {
+      } else {
+        break;
+      }
+    }
+  }
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main() {
+  main_1();
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/disc-and-add-in-func-in-loop/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/disc-and-add-in-func-in-loop/0-opt.spvasm
new file mode 100644
index 0000000..7aefe46
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/disc-and-add-in-func-in-loop/0-opt.spvasm
@@ -0,0 +1,103 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+         %20 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %true = OpConstantTrue %bool
+     %uint_1 = OpConstant %uint 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+      %false = OpConstantFalse %bool
+       %main = OpFunction %void None %7
+         %25 = OpLabel
+               OpBranch %26
+         %26 = OpLabel
+               OpLoopMerge %27 %28 None
+               OpBranch %29
+         %29 = OpLabel
+         %30 = OpPhi %bool %false %26 %31 %32
+               OpLoopMerge %33 %32 None
+               OpBranch %34
+         %34 = OpLabel
+         %35 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %36 = OpLoad %float %35
+         %37 = OpFOrdGreaterThan %bool %36 %float_0
+               OpLoopMerge %38 %39 None
+               OpBranchConditional %37 %40 %38
+         %40 = OpLabel
+               OpBranch %41
+         %41 = OpLabel
+               OpLoopMerge %42 %43 None
+               OpBranch %44
+         %44 = OpLabel
+         %45 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %46 = OpLoad %float %45
+         %47 = OpFOrdGreaterThan %bool %46 %float_0
+               OpSelectionMerge %48 None
+               OpBranchConditional %47 %49 %48
+         %49 = OpLabel
+         %50 = OpFunctionCall %void %51
+         %52 = OpUndef %v4float
+               OpBranch %42
+         %48 = OpLabel
+         %53 = OpCompositeConstruct %v4float %46 %46 %46 %46
+         %54 = OpFAdd %v4float %20 %53
+               OpBranch %42
+         %43 = OpLabel
+               OpBranch %41
+         %42 = OpLabel
+         %55 = OpPhi %v4float %52 %49 %54 %48
+               OpStore %_GLF_color %55
+               OpBranch %38
+         %39 = OpLabel
+               OpBranch %34
+         %38 = OpLabel
+         %31 = OpPhi %bool %30 %34 %true %42
+               OpSelectionMerge %56 None
+               OpBranchConditional %31 %33 %32
+         %56 = OpLabel
+               OpBranch %32
+         %32 = OpLabel
+               OpBranch %29
+         %33 = OpLabel
+               OpSelectionMerge %57 None
+               OpBranchConditional %31 %27 %57
+         %57 = OpLabel
+               OpBranch %27
+         %28 = OpLabel
+               OpBranch %26
+         %27 = OpLabel
+               OpReturn
+               OpFunctionEnd
+         %51 = OpFunction %void None %7
+         %58 = OpLabel
+               OpKill
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/disc-and-add-in-func-in-loop/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/disc-and-add-in-func-in-loop/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..43d7f1d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/disc-and-add-in-func-in-loop/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,77 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void x_51() {
+  discard;
+}
+
+void main_1() {
+  while (true) {
+    bool x_31 = false;
+    bool x_30_phi = false;
+    x_30_phi = false;
+    while (true) {
+      bool x_31_phi = false;
+      const bool x_30 = x_30_phi;
+      while (true) {
+        float4 x_52 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        float4 x_54 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        float4 x_55_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        const float x_36 = asfloat(x_5[0].y);
+        x_31_phi = x_30;
+        if ((x_36 > 0.0f)) {
+        } else {
+          break;
+        }
+        while (true) {
+          const float x_46 = asfloat(x_5[0].x);
+          if ((x_46 > 0.0f)) {
+            x_51();
+            x_52 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+            x_55_phi = x_52;
+            break;
+          }
+          x_54 = (float4(1.0f, 0.0f, 0.0f, 1.0f) + float4(x_46, x_46, x_46, x_46));
+          x_55_phi = x_54;
+          break;
+        }
+        x_GLF_color = x_55_phi;
+        x_31_phi = true;
+        break;
+      }
+      x_31 = x_31_phi;
+      if (x_31) {
+        break;
+      } else {
+        {
+          x_30_phi = x_31;
+        }
+        continue;
+      }
+      {
+        x_30_phi = x_31;
+      }
+    }
+    if (x_31) {
+      break;
+    }
+    break;
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/disc-and-add-in-func-in-loop/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/disc-and-add-in-func-in-loop/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..41639eb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/disc-and-add-in-func-in-loop/0-opt.spvasm.expected.msl
@@ -0,0 +1,81 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void x_51() {
+  discard_fragment();
+}
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  while (true) {
+    bool x_31 = false;
+    bool x_30_phi = false;
+    x_30_phi = false;
+    while (true) {
+      bool x_31_phi = false;
+      bool const x_30 = x_30_phi;
+      while (true) {
+        float4 x_52 = 0.0f;
+        float4 x_54 = 0.0f;
+        float4 x_55_phi = 0.0f;
+        float const x_36 = x_5.injectionSwitch.y;
+        x_31_phi = x_30;
+        if ((x_36 > 0.0f)) {
+        } else {
+          break;
+        }
+        while (true) {
+          float const x_46 = x_5.injectionSwitch.x;
+          if ((x_46 > 0.0f)) {
+            x_51();
+            x_52 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+            x_55_phi = x_52;
+            break;
+          }
+          x_54 = (float4(1.0f, 0.0f, 0.0f, 1.0f) + float4(x_46, x_46, x_46, x_46));
+          x_55_phi = x_54;
+          break;
+        }
+        float4 const x_55 = x_55_phi;
+        *(tint_symbol_4) = x_55;
+        x_31_phi = true;
+        break;
+      }
+      x_31 = x_31_phi;
+      if (x_31) {
+        break;
+      } else {
+        {
+          x_30_phi = x_31;
+        }
+        continue;
+      }
+      {
+        x_30_phi = x_31;
+      }
+    }
+    if (x_31) {
+      break;
+    }
+    break;
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/disc-and-add-in-func-in-loop/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/disc-and-add-in-func-in-loop/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..6e67011
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/disc-and-add-in-func-in-loop/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,179 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 93
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %x_51 "x_51"
+               OpName %main_1 "main_1"
+               OpName %x_31 "x_31"
+               OpName %x_30_phi "x_30_phi"
+               OpName %x_31_phi "x_31_phi"
+               OpName %x_52 "x_52"
+               OpName %x_54 "x_54"
+               OpName %x_55_phi "x_55_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %25 = OpConstantNull %bool
+      %false = OpConstantFalse %bool
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_0 = OpConstant %float 0
+         %63 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+    %float_1 = OpConstant %float 1
+         %66 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %true = OpConstantTrue %bool
+   %main_out = OpTypeStruct %v4float
+         %81 = OpTypeFunction %void %main_out
+       %x_51 = OpFunction %void None %12
+         %15 = OpLabel
+               OpKill
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %12
+         %17 = OpLabel
+       %x_31 = OpVariable %_ptr_Function_bool Function %25
+   %x_30_phi = OpVariable %_ptr_Function_bool Function %25
+   %x_31_phi = OpVariable %_ptr_Function_bool Function %25
+       %x_52 = OpVariable %_ptr_Function_v4float Function %9
+       %x_54 = OpVariable %_ptr_Function_v4float Function %9
+   %x_55_phi = OpVariable %_ptr_Function_v4float Function %9
+               OpBranch %18
+         %18 = OpLabel
+               OpLoopMerge %19 %20 None
+               OpBranch %21
+         %21 = OpLabel
+               OpStore %x_30_phi %false
+               OpBranch %28
+         %28 = OpLabel
+               OpLoopMerge %29 %30 None
+               OpBranch %31
+         %31 = OpLabel
+         %33 = OpLoad %bool %x_30_phi
+               OpBranch %34
+         %34 = OpLabel
+               OpLoopMerge %35 %36 None
+               OpBranch %37
+         %37 = OpLabel
+         %46 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %uint_1
+         %47 = OpLoad %float %46
+               OpStore %x_31_phi %33
+         %49 = OpFOrdGreaterThan %bool %47 %float_0
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %52
+         %51 = OpLabel
+               OpBranch %50
+         %52 = OpLabel
+               OpBranch %35
+         %50 = OpLabel
+               OpBranch %53
+         %53 = OpLabel
+               OpLoopMerge %54 %55 None
+               OpBranch %56
+         %56 = OpLabel
+         %57 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %uint_0
+         %58 = OpLoad %float %57
+         %59 = OpFOrdGreaterThan %bool %58 %float_0
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %60
+         %61 = OpLabel
+         %62 = OpFunctionCall %void %x_51
+               OpStore %x_52 %63
+         %64 = OpLoad %v4float %x_52
+               OpStore %x_55_phi %64
+               OpBranch %54
+         %60 = OpLabel
+         %67 = OpCompositeConstruct %v4float %58 %58 %58 %58
+         %68 = OpFAdd %v4float %66 %67
+               OpStore %x_54 %68
+         %69 = OpLoad %v4float %x_54
+               OpStore %x_55_phi %69
+               OpBranch %54
+         %55 = OpLabel
+               OpBranch %53
+         %54 = OpLabel
+         %70 = OpLoad %v4float %x_55_phi
+               OpStore %x_GLF_color %70
+               OpStore %x_31_phi %true
+               OpBranch %35
+         %36 = OpLabel
+               OpBranch %34
+         %35 = OpLabel
+         %72 = OpLoad %bool %x_31_phi
+               OpStore %x_31 %72
+         %73 = OpLoad %bool %x_31
+               OpSelectionMerge %74 None
+               OpBranchConditional %73 %75 %76
+         %75 = OpLabel
+               OpBranch %29
+         %76 = OpLabel
+               OpBranch %30
+         %74 = OpLabel
+               OpBranch %30
+         %30 = OpLabel
+         %77 = OpLoad %bool %x_31
+               OpStore %x_30_phi %77
+               OpBranch %28
+         %29 = OpLabel
+         %78 = OpLoad %bool %x_31
+               OpSelectionMerge %79 None
+               OpBranchConditional %78 %80 %79
+         %80 = OpLabel
+               OpBranch %19
+         %79 = OpLabel
+               OpBranch %19
+         %20 = OpLabel
+               OpBranch %18
+         %19 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %81
+%tint_symbol = OpFunctionParameter %main_out
+         %85 = OpLabel
+         %86 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %86
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %88 = OpLabel
+         %89 = OpFunctionCall %void %main_1
+         %91 = OpLoad %v4float %x_GLF_color
+         %92 = OpCompositeConstruct %main_out %91
+         %90 = OpFunctionCall %void %tint_symbol_2 %92
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/disc-and-add-in-func-in-loop/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/disc-and-add-in-func-in-loop/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..96cc10e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/disc-and-add-in-func-in-loop/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,77 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn x_51() {
+  discard;
+}
+
+fn main_1() {
+  loop {
+    var x_31 : bool;
+    var x_30_phi : bool;
+    x_30_phi = false;
+    loop {
+      var x_31_phi : bool;
+      let x_30 : bool = x_30_phi;
+      loop {
+        var x_52 : vec4<f32>;
+        var x_54 : vec4<f32>;
+        var x_55_phi : vec4<f32>;
+        let x_36 : f32 = x_5.injectionSwitch.y;
+        x_31_phi = x_30;
+        if ((x_36 > 0.0)) {
+        } else {
+          break;
+        }
+        loop {
+          let x_46 : f32 = x_5.injectionSwitch.x;
+          if ((x_46 > 0.0)) {
+            x_51();
+            x_52 = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+            x_55_phi = x_52;
+            break;
+          }
+          x_54 = (vec4<f32>(1.0, 0.0, 0.0, 1.0) + vec4<f32>(x_46, x_46, x_46, x_46));
+          x_55_phi = x_54;
+          break;
+        }
+        let x_55 : vec4<f32> = x_55_phi;
+        x_GLF_color = x_55;
+        x_31_phi = true;
+        break;
+      }
+      x_31 = x_31_phi;
+      if (x_31) {
+        break;
+      } else {
+        continue;
+      }
+
+      continuing {
+        x_30_phi = x_31;
+      }
+    }
+    if (x_31) {
+      break;
+    }
+    break;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/disc-and-add-in-func-in-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/disc-and-add-in-func-in-loop/0-opt.wgsl
new file mode 100644
index 0000000..96cc10e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/disc-and-add-in-func-in-loop/0-opt.wgsl
@@ -0,0 +1,77 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn x_51() {
+  discard;
+}
+
+fn main_1() {
+  loop {
+    var x_31 : bool;
+    var x_30_phi : bool;
+    x_30_phi = false;
+    loop {
+      var x_31_phi : bool;
+      let x_30 : bool = x_30_phi;
+      loop {
+        var x_52 : vec4<f32>;
+        var x_54 : vec4<f32>;
+        var x_55_phi : vec4<f32>;
+        let x_36 : f32 = x_5.injectionSwitch.y;
+        x_31_phi = x_30;
+        if ((x_36 > 0.0)) {
+        } else {
+          break;
+        }
+        loop {
+          let x_46 : f32 = x_5.injectionSwitch.x;
+          if ((x_46 > 0.0)) {
+            x_51();
+            x_52 = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+            x_55_phi = x_52;
+            break;
+          }
+          x_54 = (vec4<f32>(1.0, 0.0, 0.0, 1.0) + vec4<f32>(x_46, x_46, x_46, x_46));
+          x_55_phi = x_54;
+          break;
+        }
+        let x_55 : vec4<f32> = x_55_phi;
+        x_GLF_color = x_55;
+        x_31_phi = true;
+        break;
+      }
+      x_31 = x_31_phi;
+      if (x_31) {
+        break;
+      } else {
+        continue;
+      }
+
+      continuing {
+        x_30_phi = x_31;
+      }
+    }
+    if (x_31) {
+      break;
+    }
+    break;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/disc-and-add-in-func-in-loop/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/disc-and-add-in-func-in-loop/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..43d7f1d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/disc-and-add-in-func-in-loop/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,77 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void x_51() {
+  discard;
+}
+
+void main_1() {
+  while (true) {
+    bool x_31 = false;
+    bool x_30_phi = false;
+    x_30_phi = false;
+    while (true) {
+      bool x_31_phi = false;
+      const bool x_30 = x_30_phi;
+      while (true) {
+        float4 x_52 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        float4 x_54 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        float4 x_55_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        const float x_36 = asfloat(x_5[0].y);
+        x_31_phi = x_30;
+        if ((x_36 > 0.0f)) {
+        } else {
+          break;
+        }
+        while (true) {
+          const float x_46 = asfloat(x_5[0].x);
+          if ((x_46 > 0.0f)) {
+            x_51();
+            x_52 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+            x_55_phi = x_52;
+            break;
+          }
+          x_54 = (float4(1.0f, 0.0f, 0.0f, 1.0f) + float4(x_46, x_46, x_46, x_46));
+          x_55_phi = x_54;
+          break;
+        }
+        x_GLF_color = x_55_phi;
+        x_31_phi = true;
+        break;
+      }
+      x_31 = x_31_phi;
+      if (x_31) {
+        break;
+      } else {
+        {
+          x_30_phi = x_31;
+        }
+        continue;
+      }
+      {
+        x_30_phi = x_31;
+      }
+    }
+    if (x_31) {
+      break;
+    }
+    break;
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/disc-and-add-in-func-in-loop/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/disc-and-add-in-func-in-loop/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..41639eb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/disc-and-add-in-func-in-loop/0-opt.wgsl.expected.msl
@@ -0,0 +1,81 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void x_51() {
+  discard_fragment();
+}
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  while (true) {
+    bool x_31 = false;
+    bool x_30_phi = false;
+    x_30_phi = false;
+    while (true) {
+      bool x_31_phi = false;
+      bool const x_30 = x_30_phi;
+      while (true) {
+        float4 x_52 = 0.0f;
+        float4 x_54 = 0.0f;
+        float4 x_55_phi = 0.0f;
+        float const x_36 = x_5.injectionSwitch.y;
+        x_31_phi = x_30;
+        if ((x_36 > 0.0f)) {
+        } else {
+          break;
+        }
+        while (true) {
+          float const x_46 = x_5.injectionSwitch.x;
+          if ((x_46 > 0.0f)) {
+            x_51();
+            x_52 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+            x_55_phi = x_52;
+            break;
+          }
+          x_54 = (float4(1.0f, 0.0f, 0.0f, 1.0f) + float4(x_46, x_46, x_46, x_46));
+          x_55_phi = x_54;
+          break;
+        }
+        float4 const x_55 = x_55_phi;
+        *(tint_symbol_4) = x_55;
+        x_31_phi = true;
+        break;
+      }
+      x_31 = x_31_phi;
+      if (x_31) {
+        break;
+      } else {
+        {
+          x_30_phi = x_31;
+        }
+        continue;
+      }
+      {
+        x_30_phi = x_31;
+      }
+    }
+    if (x_31) {
+      break;
+    }
+    break;
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/disc-and-add-in-func-in-loop/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/disc-and-add-in-func-in-loop/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..6e67011
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/disc-and-add-in-func-in-loop/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,179 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 93
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %x_51 "x_51"
+               OpName %main_1 "main_1"
+               OpName %x_31 "x_31"
+               OpName %x_30_phi "x_30_phi"
+               OpName %x_31_phi "x_31_phi"
+               OpName %x_52 "x_52"
+               OpName %x_54 "x_54"
+               OpName %x_55_phi "x_55_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %25 = OpConstantNull %bool
+      %false = OpConstantFalse %bool
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_0 = OpConstant %float 0
+         %63 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+    %float_1 = OpConstant %float 1
+         %66 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %true = OpConstantTrue %bool
+   %main_out = OpTypeStruct %v4float
+         %81 = OpTypeFunction %void %main_out
+       %x_51 = OpFunction %void None %12
+         %15 = OpLabel
+               OpKill
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %12
+         %17 = OpLabel
+       %x_31 = OpVariable %_ptr_Function_bool Function %25
+   %x_30_phi = OpVariable %_ptr_Function_bool Function %25
+   %x_31_phi = OpVariable %_ptr_Function_bool Function %25
+       %x_52 = OpVariable %_ptr_Function_v4float Function %9
+       %x_54 = OpVariable %_ptr_Function_v4float Function %9
+   %x_55_phi = OpVariable %_ptr_Function_v4float Function %9
+               OpBranch %18
+         %18 = OpLabel
+               OpLoopMerge %19 %20 None
+               OpBranch %21
+         %21 = OpLabel
+               OpStore %x_30_phi %false
+               OpBranch %28
+         %28 = OpLabel
+               OpLoopMerge %29 %30 None
+               OpBranch %31
+         %31 = OpLabel
+         %33 = OpLoad %bool %x_30_phi
+               OpBranch %34
+         %34 = OpLabel
+               OpLoopMerge %35 %36 None
+               OpBranch %37
+         %37 = OpLabel
+         %46 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %uint_1
+         %47 = OpLoad %float %46
+               OpStore %x_31_phi %33
+         %49 = OpFOrdGreaterThan %bool %47 %float_0
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %52
+         %51 = OpLabel
+               OpBranch %50
+         %52 = OpLabel
+               OpBranch %35
+         %50 = OpLabel
+               OpBranch %53
+         %53 = OpLabel
+               OpLoopMerge %54 %55 None
+               OpBranch %56
+         %56 = OpLabel
+         %57 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %uint_0
+         %58 = OpLoad %float %57
+         %59 = OpFOrdGreaterThan %bool %58 %float_0
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %60
+         %61 = OpLabel
+         %62 = OpFunctionCall %void %x_51
+               OpStore %x_52 %63
+         %64 = OpLoad %v4float %x_52
+               OpStore %x_55_phi %64
+               OpBranch %54
+         %60 = OpLabel
+         %67 = OpCompositeConstruct %v4float %58 %58 %58 %58
+         %68 = OpFAdd %v4float %66 %67
+               OpStore %x_54 %68
+         %69 = OpLoad %v4float %x_54
+               OpStore %x_55_phi %69
+               OpBranch %54
+         %55 = OpLabel
+               OpBranch %53
+         %54 = OpLabel
+         %70 = OpLoad %v4float %x_55_phi
+               OpStore %x_GLF_color %70
+               OpStore %x_31_phi %true
+               OpBranch %35
+         %36 = OpLabel
+               OpBranch %34
+         %35 = OpLabel
+         %72 = OpLoad %bool %x_31_phi
+               OpStore %x_31 %72
+         %73 = OpLoad %bool %x_31
+               OpSelectionMerge %74 None
+               OpBranchConditional %73 %75 %76
+         %75 = OpLabel
+               OpBranch %29
+         %76 = OpLabel
+               OpBranch %30
+         %74 = OpLabel
+               OpBranch %30
+         %30 = OpLabel
+         %77 = OpLoad %bool %x_31
+               OpStore %x_30_phi %77
+               OpBranch %28
+         %29 = OpLabel
+         %78 = OpLoad %bool %x_31
+               OpSelectionMerge %79 None
+               OpBranchConditional %78 %80 %79
+         %80 = OpLabel
+               OpBranch %19
+         %79 = OpLabel
+               OpBranch %19
+         %20 = OpLabel
+               OpBranch %18
+         %19 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %81
+%tint_symbol = OpFunctionParameter %main_out
+         %85 = OpLabel
+         %86 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %86
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %88 = OpLabel
+         %89 = OpFunctionCall %void %main_1
+         %91 = OpLoad %v4float %x_GLF_color
+         %92 = OpCompositeConstruct %main_out %91
+         %90 = OpFunctionCall %void %tint_symbol_2 %92
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/disc-and-add-in-func-in-loop/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/disc-and-add-in-func-in-loop/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..96cc10e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/disc-and-add-in-func-in-loop/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,77 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn x_51() {
+  discard;
+}
+
+fn main_1() {
+  loop {
+    var x_31 : bool;
+    var x_30_phi : bool;
+    x_30_phi = false;
+    loop {
+      var x_31_phi : bool;
+      let x_30 : bool = x_30_phi;
+      loop {
+        var x_52 : vec4<f32>;
+        var x_54 : vec4<f32>;
+        var x_55_phi : vec4<f32>;
+        let x_36 : f32 = x_5.injectionSwitch.y;
+        x_31_phi = x_30;
+        if ((x_36 > 0.0)) {
+        } else {
+          break;
+        }
+        loop {
+          let x_46 : f32 = x_5.injectionSwitch.x;
+          if ((x_46 > 0.0)) {
+            x_51();
+            x_52 = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+            x_55_phi = x_52;
+            break;
+          }
+          x_54 = (vec4<f32>(1.0, 0.0, 0.0, 1.0) + vec4<f32>(x_46, x_46, x_46, x_46));
+          x_55_phi = x_54;
+          break;
+        }
+        let x_55 : vec4<f32> = x_55_phi;
+        x_GLF_color = x_55;
+        x_31_phi = true;
+        break;
+      }
+      x_31 = x_31_phi;
+      if (x_31) {
+        break;
+      } else {
+        continue;
+      }
+
+      continuing {
+        x_30_phi = x_31;
+      }
+    }
+    if (x_31) {
+      break;
+    }
+    break;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-continue-return/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/discard-continue-return/0-opt.spvasm
new file mode 100644
index 0000000..0891e97
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-continue-return/0-opt.spvasm
@@ -0,0 +1,84 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %false = OpConstantFalse %bool
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %26 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %true = OpConstantTrue %bool
+       %main = OpFunction %void None %8
+         %28 = OpLabel
+               OpBranch %29
+         %29 = OpLabel
+               OpLoopMerge %30 %31 None
+               OpBranch %32
+         %32 = OpLabel
+               OpLoopMerge %33 %34 None
+               OpBranch %35
+         %35 = OpLabel
+         %36 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %37 = OpLoad %float %36
+         %38 = OpFOrdLessThan %bool %37 %float_0
+               OpSelectionMerge %39 None
+               OpBranchConditional %38 %40 %39
+         %40 = OpLabel
+         %41 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %42 = OpLoad %float %41
+         %43 = OpFOrdGreaterThan %bool %float_1 %42
+               OpSelectionMerge %44 None
+               OpBranchConditional %43 %45 %34
+         %45 = OpLabel
+               OpKill
+         %44 = OpLabel
+               OpBranch %34
+         %34 = OpLabel
+               OpBranchConditional %false %32 %33
+         %39 = OpLabel
+               OpBranch %33
+         %33 = OpLabel
+         %46 = OpPhi %bool %true %39 %false %34
+               OpSelectionMerge %47 None
+               OpBranchConditional %46 %30 %47
+         %47 = OpLabel
+               OpBranch %30
+         %31 = OpLabel
+               OpBranch %29
+         %30 = OpLabel
+               OpStore %_GLF_color %26
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-continue-return/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/discard-continue-return/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..4dda860
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-continue-return/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,71 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  while (true) {
+    bool x_46_phi = false;
+    while (true) {
+      const float x_37 = gl_FragCoord.x;
+      if ((x_37 < 0.0f)) {
+        const float x_42 = asfloat(x_6[0].y);
+        if ((1.0f > x_42)) {
+          discard;
+        } else {
+          {
+            x_46_phi = false;
+            if (false) {
+            } else {
+              break;
+            }
+          }
+          continue;
+        }
+        {
+          x_46_phi = false;
+          if (false) {
+          } else {
+            break;
+          }
+        }
+        continue;
+      }
+      x_46_phi = true;
+      break;
+      {
+        x_46_phi = false;
+        if (false) {
+        } else {
+          break;
+        }
+      }
+    }
+    if (x_46_phi) {
+      break;
+    }
+    break;
+  }
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-continue-return/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/discard-continue-return/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..28d4e20
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-continue-return/0-opt.spvasm.expected.msl
@@ -0,0 +1,71 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  while (true) {
+    bool x_46_phi = false;
+    while (true) {
+      float const x_37 = (*(tint_symbol_5)).x;
+      if ((x_37 < 0.0f)) {
+        float const x_42 = x_6.injectionSwitch.y;
+        if ((1.0f > x_42)) {
+          discard_fragment();
+        } else {
+          {
+            x_46_phi = false;
+            if (false) {
+            } else {
+              break;
+            }
+          }
+          continue;
+        }
+        {
+          x_46_phi = false;
+          if (false) {
+          } else {
+            break;
+          }
+        }
+        continue;
+      }
+      x_46_phi = true;
+      break;
+      {
+        x_46_phi = false;
+        if (false) {
+        } else {
+          break;
+        }
+      }
+    }
+    bool const x_46 = x_46_phi;
+    if (x_46) {
+      break;
+    }
+    break;
+  }
+  *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-continue-return/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/discard-continue-return/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..67f484d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-continue-return/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,141 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 71
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %x_46_phi "x_46_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %26 = OpConstantNull %bool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+       %true = OpConstantTrue %bool
+      %false = OpConstantFalse %bool
+         %57 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %58 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+   %x_46_phi = OpVariable %_ptr_Function_bool Function %26
+               OpBranch %19
+         %19 = OpLabel
+               OpLoopMerge %20 %21 None
+               OpBranch %22
+         %22 = OpLabel
+               OpBranch %27
+         %27 = OpLabel
+               OpLoopMerge %28 %29 None
+               OpBranch %30
+         %30 = OpLabel
+         %34 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %35 = OpLoad %float %34
+         %37 = OpFOrdLessThan %bool %35 %float_0
+               OpSelectionMerge %38 None
+               OpBranchConditional %37 %39 %38
+         %39 = OpLabel
+         %42 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %43 = OpLoad %float %42
+         %45 = OpFOrdGreaterThan %bool %float_1 %43
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %48
+         %47 = OpLabel
+               OpKill
+         %48 = OpLabel
+               OpBranch %29
+         %46 = OpLabel
+               OpBranch %29
+         %38 = OpLabel
+               OpStore %x_46_phi %true
+               OpBranch %28
+         %29 = OpLabel
+               OpStore %x_46_phi %false
+               OpSelectionMerge %51 None
+               OpBranchConditional %false %52 %53
+         %52 = OpLabel
+               OpBranch %51
+         %53 = OpLabel
+               OpBranch %28
+         %51 = OpLabel
+               OpBranch %27
+         %28 = OpLabel
+         %54 = OpLoad %bool %x_46_phi
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %55
+         %56 = OpLabel
+               OpBranch %20
+         %55 = OpLabel
+               OpBranch %20
+         %21 = OpLabel
+               OpBranch %19
+         %20 = OpLabel
+               OpStore %x_GLF_color %57
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %58
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %62 = OpLabel
+         %63 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %63
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %65 = OpLabel
+         %66 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %66
+         %67 = OpFunctionCall %void %main_1
+         %69 = OpLoad %v4float %x_GLF_color
+         %70 = OpCompositeConstruct %main_out %69
+         %68 = OpFunctionCall %void %tint_symbol_3 %70
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 29[%29] is not post dominated by the back-edge block 51[%51]
+  %51 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-continue-return/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/discard-continue-return/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..2da08c5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-continue-return/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,57 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  loop {
+    var x_46_phi : bool;
+    loop {
+      let x_37 : f32 = gl_FragCoord.x;
+      if ((x_37 < 0.0)) {
+        let x_42 : f32 = x_6.injectionSwitch.y;
+        if ((1.0 > x_42)) {
+          discard;
+        } else {
+          continue;
+        }
+        continue;
+      }
+      x_46_phi = true;
+      break;
+
+      continuing {
+        x_46_phi = false;
+        if (false) {
+        } else {
+          break;
+        }
+      }
+    }
+    let x_46 : bool = x_46_phi;
+    if (x_46) {
+      break;
+    }
+    break;
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-continue-return/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/discard-continue-return/0-opt.wgsl
new file mode 100644
index 0000000..2da08c5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-continue-return/0-opt.wgsl
@@ -0,0 +1,57 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  loop {
+    var x_46_phi : bool;
+    loop {
+      let x_37 : f32 = gl_FragCoord.x;
+      if ((x_37 < 0.0)) {
+        let x_42 : f32 = x_6.injectionSwitch.y;
+        if ((1.0 > x_42)) {
+          discard;
+        } else {
+          continue;
+        }
+        continue;
+      }
+      x_46_phi = true;
+      break;
+
+      continuing {
+        x_46_phi = false;
+        if (false) {
+        } else {
+          break;
+        }
+      }
+    }
+    let x_46 : bool = x_46_phi;
+    if (x_46) {
+      break;
+    }
+    break;
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-continue-return/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/discard-continue-return/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..4dda860
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-continue-return/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,71 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  while (true) {
+    bool x_46_phi = false;
+    while (true) {
+      const float x_37 = gl_FragCoord.x;
+      if ((x_37 < 0.0f)) {
+        const float x_42 = asfloat(x_6[0].y);
+        if ((1.0f > x_42)) {
+          discard;
+        } else {
+          {
+            x_46_phi = false;
+            if (false) {
+            } else {
+              break;
+            }
+          }
+          continue;
+        }
+        {
+          x_46_phi = false;
+          if (false) {
+          } else {
+            break;
+          }
+        }
+        continue;
+      }
+      x_46_phi = true;
+      break;
+      {
+        x_46_phi = false;
+        if (false) {
+        } else {
+          break;
+        }
+      }
+    }
+    if (x_46_phi) {
+      break;
+    }
+    break;
+  }
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-continue-return/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/discard-continue-return/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..28d4e20
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-continue-return/0-opt.wgsl.expected.msl
@@ -0,0 +1,71 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  while (true) {
+    bool x_46_phi = false;
+    while (true) {
+      float const x_37 = (*(tint_symbol_5)).x;
+      if ((x_37 < 0.0f)) {
+        float const x_42 = x_6.injectionSwitch.y;
+        if ((1.0f > x_42)) {
+          discard_fragment();
+        } else {
+          {
+            x_46_phi = false;
+            if (false) {
+            } else {
+              break;
+            }
+          }
+          continue;
+        }
+        {
+          x_46_phi = false;
+          if (false) {
+          } else {
+            break;
+          }
+        }
+        continue;
+      }
+      x_46_phi = true;
+      break;
+      {
+        x_46_phi = false;
+        if (false) {
+        } else {
+          break;
+        }
+      }
+    }
+    bool const x_46 = x_46_phi;
+    if (x_46) {
+      break;
+    }
+    break;
+  }
+  *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-continue-return/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/discard-continue-return/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..67f484d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-continue-return/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,141 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 71
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %x_46_phi "x_46_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %26 = OpConstantNull %bool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+       %true = OpConstantTrue %bool
+      %false = OpConstantFalse %bool
+         %57 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %58 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+   %x_46_phi = OpVariable %_ptr_Function_bool Function %26
+               OpBranch %19
+         %19 = OpLabel
+               OpLoopMerge %20 %21 None
+               OpBranch %22
+         %22 = OpLabel
+               OpBranch %27
+         %27 = OpLabel
+               OpLoopMerge %28 %29 None
+               OpBranch %30
+         %30 = OpLabel
+         %34 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %35 = OpLoad %float %34
+         %37 = OpFOrdLessThan %bool %35 %float_0
+               OpSelectionMerge %38 None
+               OpBranchConditional %37 %39 %38
+         %39 = OpLabel
+         %42 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %43 = OpLoad %float %42
+         %45 = OpFOrdGreaterThan %bool %float_1 %43
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %48
+         %47 = OpLabel
+               OpKill
+         %48 = OpLabel
+               OpBranch %29
+         %46 = OpLabel
+               OpBranch %29
+         %38 = OpLabel
+               OpStore %x_46_phi %true
+               OpBranch %28
+         %29 = OpLabel
+               OpStore %x_46_phi %false
+               OpSelectionMerge %51 None
+               OpBranchConditional %false %52 %53
+         %52 = OpLabel
+               OpBranch %51
+         %53 = OpLabel
+               OpBranch %28
+         %51 = OpLabel
+               OpBranch %27
+         %28 = OpLabel
+         %54 = OpLoad %bool %x_46_phi
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %55
+         %56 = OpLabel
+               OpBranch %20
+         %55 = OpLabel
+               OpBranch %20
+         %21 = OpLabel
+               OpBranch %19
+         %20 = OpLabel
+               OpStore %x_GLF_color %57
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %58
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %62 = OpLabel
+         %63 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %63
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %65 = OpLabel
+         %66 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %66
+         %67 = OpFunctionCall %void %main_1
+         %69 = OpLoad %v4float %x_GLF_color
+         %70 = OpCompositeConstruct %main_out %69
+         %68 = OpFunctionCall %void %tint_symbol_3 %70
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 29[%29] is not post dominated by the back-edge block 51[%51]
+  %51 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-continue-return/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/discard-continue-return/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..2da08c5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-continue-return/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,57 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  loop {
+    var x_46_phi : bool;
+    loop {
+      let x_37 : f32 = gl_FragCoord.x;
+      if ((x_37 < 0.0)) {
+        let x_42 : f32 = x_6.injectionSwitch.y;
+        if ((1.0 > x_42)) {
+          discard;
+        } else {
+          continue;
+        }
+        continue;
+      }
+      x_46_phi = true;
+      break;
+
+      continuing {
+        x_46_phi = false;
+        if (false) {
+        } else {
+          break;
+        }
+      }
+    }
+    let x_46 : bool = x_46_phi;
+    if (x_46) {
+      break;
+    }
+    break;
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-in-array-manipulating-loop/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/discard-in-array-manipulating-loop/0-opt.spvasm
new file mode 100644
index 0000000..cb630a6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-in-array-manipulating-loop/0-opt.spvasm
@@ -0,0 +1,92 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %data "data"
+               OpName %i "i"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %i RelaxedPrecision
+               OpDecorate %7 RelaxedPrecision
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %8 RelaxedPrecision
+               OpDecorate %9 RelaxedPrecision
+               OpDecorate %10 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_float_uint_10 = OpTypeArray %float %uint_10
+%_ptr_Function__arr_float_uint_10 = OpTypePointer Function %_arr_float_uint_10
+%float_0_100000001 = OpConstant %float 0.100000001
+%float_0_200000003 = OpConstant %float 0.200000003
+%float_0_300000012 = OpConstant %float 0.300000012
+%float_0_400000006 = OpConstant %float 0.400000006
+  %float_0_5 = OpConstant %float 0.5
+%float_0_600000024 = OpConstant %float 0.600000024
+%float_0_699999988 = OpConstant %float 0.699999988
+%float_0_800000012 = OpConstant %float 0.800000012
+%float_0_899999976 = OpConstant %float 0.899999976
+    %float_1 = OpConstant %float 1
+         %28 = OpConstantComposite %_arr_float_uint_10 %float_0_100000001 %float_0_200000003 %float_0_300000012 %float_0_400000006 %float_0_5 %float_0_600000024 %float_0_699999988 %float_0_800000012 %float_0_899999976 %float_1
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+     %int_10 = OpConstant %int 10
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_0 = OpConstant %float 0
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_1 = OpConstant %int 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %12
+         %42 = OpLabel
+       %data = OpVariable %_ptr_Function__arr_float_uint_10 Function
+          %i = OpVariable %_ptr_Function_int Function
+               OpStore %data %28
+               OpStore %i %int_0
+               OpBranch %43
+         %43 = OpLabel
+               OpLoopMerge %44 %45 None
+               OpBranch %46
+         %46 = OpLabel
+          %7 = OpLoad %int %i
+         %47 = OpSLessThan %bool %7 %int_10
+               OpBranchConditional %47 %48 %44
+         %48 = OpLabel
+         %49 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %50 = OpLoad %float %49
+         %51 = OpFOrdLessThan %bool %50 %float_0
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %52
+         %53 = OpLabel
+               OpKill
+         %52 = OpLabel
+          %8 = OpLoad %int %i
+         %54 = OpAccessChain %_ptr_Function_float %data %8
+         %55 = OpLoad %float %54
+         %56 = OpAccessChain %_ptr_Function_float %data %int_0
+               OpStore %56 %55
+               OpBranch %45
+         %45 = OpLabel
+          %9 = OpLoad %int %i
+         %10 = OpIAdd %int %9 %int_1
+               OpStore %i %10
+               OpBranch %43
+         %44 = OpLabel
+         %57 = OpAccessChain %_ptr_Function_float %data %int_0
+         %58 = OpLoad %float %57
+         %59 = OpCompositeConstruct %v4float %58 %float_0 %float_0 %float_1
+               OpStore %_GLF_color %59
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-in-array-manipulating-loop/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/discard-in-array-manipulating-loop/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..669e1a2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-in-array-manipulating-loop/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,42 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float data[10] = (float[10])0;
+  int i = 0;
+  const float tint_symbol_4[10] = {0.100000001f, 0.200000003f, 0.300000012f, 0.400000006f, 0.5f, 0.600000024f, 0.699999988f, 0.800000012f, 0.899999976f, 1.0f};
+  data = tint_symbol_4;
+  i = 0;
+  {
+    for(; (i < 10); i = (i + 1)) {
+      const float x_50 = gl_FragCoord.x;
+      if ((x_50 < 0.0f)) {
+        discard;
+      }
+      const float x_55 = data[i];
+      data[0] = x_55;
+    }
+  }
+  const float x_58 = data[0];
+  x_GLF_color = float4(x_58, 0.0f, 0.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-in-array-manipulating-loop/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/discard-in-array-manipulating-loop/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..08b8b28
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-in-array-manipulating-loop/0-opt.spvasm.expected.msl
@@ -0,0 +1,52 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  float arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  tint_array_wrapper data = {};
+  int i = 0;
+  tint_array_wrapper const tint_symbol_4 = {.arr={0.100000001f, 0.200000003f, 0.300000012f, 0.400000006f, 0.5f, 0.600000024f, 0.699999988f, 0.800000012f, 0.899999976f, 1.0f}};
+  data = tint_symbol_4;
+  i = 0;
+  while (true) {
+    int const x_7 = i;
+    if ((x_7 < 10)) {
+    } else {
+      break;
+    }
+    float const x_50 = (*(tint_symbol_6)).x;
+    if ((x_50 < 0.0f)) {
+      discard_fragment();
+    }
+    int const x_8 = i;
+    float const x_55 = data.arr[x_8];
+    data.arr[0] = x_55;
+    {
+      int const x_9 = i;
+      i = (x_9 + 1);
+    }
+  }
+  float const x_58 = data.arr[0];
+  *(tint_symbol_7) = float4(x_58, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(&(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-in-array-manipulating-loop/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/discard-in-array-manipulating-loop/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..ca3016a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-in-array-manipulating-loop/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,129 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 80
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %data "data"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_float_uint_10 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_float_uint_10 = OpTypeArray %float %uint_10
+%_ptr_Function__arr_float_uint_10 = OpTypePointer Function %_arr_float_uint_10
+         %20 = OpConstantNull %_arr_float_uint_10
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %24 = OpConstantNull %int
+%float_0_100000001 = OpConstant %float 0.100000001
+%float_0_200000003 = OpConstant %float 0.200000003
+%float_0_300000012 = OpConstant %float 0.300000012
+%float_0_400000006 = OpConstant %float 0.400000006
+  %float_0_5 = OpConstant %float 0.5
+%float_0_600000024 = OpConstant %float 0.600000024
+%float_0_699999988 = OpConstant %float 0.699999988
+%float_0_800000012 = OpConstant %float 0.800000012
+%float_0_899999976 = OpConstant %float 0.899999976
+    %float_1 = OpConstant %float 1
+         %35 = OpConstantComposite %_arr_float_uint_10 %float_0_100000001 %float_0_200000003 %float_0_300000012 %float_0_400000006 %float_0_5 %float_0_600000024 %float_0_699999988 %float_0_800000012 %float_0_899999976 %float_1
+      %int_0 = OpConstant %int 0
+     %int_10 = OpConstant %int 10
+       %bool = OpTypeBool
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %67 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+       %data = OpVariable %_ptr_Function__arr_float_uint_10 Function %20
+          %i = OpVariable %_ptr_Function_int Function %24
+               OpStore %data %35
+               OpStore %i %int_0
+               OpBranch %37
+         %37 = OpLabel
+               OpLoopMerge %38 %39 None
+               OpBranch %40
+         %40 = OpLabel
+         %41 = OpLoad %int %i
+         %43 = OpSLessThan %bool %41 %int_10
+               OpSelectionMerge %45 None
+               OpBranchConditional %43 %46 %47
+         %46 = OpLabel
+               OpBranch %45
+         %47 = OpLabel
+               OpBranch %38
+         %45 = OpLabel
+         %50 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %51 = OpLoad %float %50
+         %53 = OpFOrdLessThan %bool %51 %float_0
+               OpSelectionMerge %54 None
+               OpBranchConditional %53 %55 %54
+         %55 = OpLabel
+               OpKill
+         %54 = OpLabel
+         %56 = OpLoad %int %i
+         %58 = OpAccessChain %_ptr_Function_float %data %56
+         %59 = OpLoad %float %58
+         %60 = OpAccessChain %_ptr_Function_float %data %int_0
+               OpStore %60 %59
+               OpBranch %39
+         %39 = OpLabel
+         %61 = OpLoad %int %i
+         %63 = OpIAdd %int %61 %int_1
+               OpStore %i %63
+               OpBranch %37
+         %38 = OpLabel
+         %64 = OpAccessChain %_ptr_Function_float %data %int_0
+         %65 = OpLoad %float %64
+         %66 = OpCompositeConstruct %v4float %65 %float_0 %float_0 %float_1
+               OpStore %x_GLF_color %66
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %67
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %71 = OpLabel
+         %72 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %72
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %74 = OpLabel
+         %75 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %75
+         %76 = OpFunctionCall %void %main_1
+         %78 = OpLoad %v4float %x_GLF_color
+         %79 = OpCompositeConstruct %main_out %78
+         %77 = OpFunctionCall %void %tint_symbol_3 %79
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-in-array-manipulating-loop/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/discard-in-array-manipulating-loop/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..6981641
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-in-array-manipulating-loop/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,44 @@
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var data : array<f32, 10>;
+  var i : i32;
+  data = array<f32, 10>(0.100000001, 0.200000003, 0.300000012, 0.400000006, 0.5, 0.600000024, 0.699999988, 0.800000012, 0.899999976, 1.0);
+  i = 0;
+  loop {
+    let x_7 : i32 = i;
+    if ((x_7 < 10)) {
+    } else {
+      break;
+    }
+    let x_50 : f32 = gl_FragCoord.x;
+    if ((x_50 < 0.0)) {
+      discard;
+    }
+    let x_8 : i32 = i;
+    let x_55 : f32 = data[x_8];
+    data[0] = x_55;
+
+    continuing {
+      let x_9 : i32 = i;
+      i = (x_9 + 1);
+    }
+  }
+  let x_58 : f32 = data[0];
+  x_GLF_color = vec4<f32>(x_58, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-in-array-manipulating-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/discard-in-array-manipulating-loop/0-opt.wgsl
new file mode 100644
index 0000000..6981641
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-in-array-manipulating-loop/0-opt.wgsl
@@ -0,0 +1,44 @@
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var data : array<f32, 10>;
+  var i : i32;
+  data = array<f32, 10>(0.100000001, 0.200000003, 0.300000012, 0.400000006, 0.5, 0.600000024, 0.699999988, 0.800000012, 0.899999976, 1.0);
+  i = 0;
+  loop {
+    let x_7 : i32 = i;
+    if ((x_7 < 10)) {
+    } else {
+      break;
+    }
+    let x_50 : f32 = gl_FragCoord.x;
+    if ((x_50 < 0.0)) {
+      discard;
+    }
+    let x_8 : i32 = i;
+    let x_55 : f32 = data[x_8];
+    data[0] = x_55;
+
+    continuing {
+      let x_9 : i32 = i;
+      i = (x_9 + 1);
+    }
+  }
+  let x_58 : f32 = data[0];
+  x_GLF_color = vec4<f32>(x_58, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-in-array-manipulating-loop/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/discard-in-array-manipulating-loop/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..669e1a2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-in-array-manipulating-loop/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,42 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float data[10] = (float[10])0;
+  int i = 0;
+  const float tint_symbol_4[10] = {0.100000001f, 0.200000003f, 0.300000012f, 0.400000006f, 0.5f, 0.600000024f, 0.699999988f, 0.800000012f, 0.899999976f, 1.0f};
+  data = tint_symbol_4;
+  i = 0;
+  {
+    for(; (i < 10); i = (i + 1)) {
+      const float x_50 = gl_FragCoord.x;
+      if ((x_50 < 0.0f)) {
+        discard;
+      }
+      const float x_55 = data[i];
+      data[0] = x_55;
+    }
+  }
+  const float x_58 = data[0];
+  x_GLF_color = float4(x_58, 0.0f, 0.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-in-array-manipulating-loop/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/discard-in-array-manipulating-loop/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..08b8b28
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-in-array-manipulating-loop/0-opt.wgsl.expected.msl
@@ -0,0 +1,52 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  float arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  tint_array_wrapper data = {};
+  int i = 0;
+  tint_array_wrapper const tint_symbol_4 = {.arr={0.100000001f, 0.200000003f, 0.300000012f, 0.400000006f, 0.5f, 0.600000024f, 0.699999988f, 0.800000012f, 0.899999976f, 1.0f}};
+  data = tint_symbol_4;
+  i = 0;
+  while (true) {
+    int const x_7 = i;
+    if ((x_7 < 10)) {
+    } else {
+      break;
+    }
+    float const x_50 = (*(tint_symbol_6)).x;
+    if ((x_50 < 0.0f)) {
+      discard_fragment();
+    }
+    int const x_8 = i;
+    float const x_55 = data.arr[x_8];
+    data.arr[0] = x_55;
+    {
+      int const x_9 = i;
+      i = (x_9 + 1);
+    }
+  }
+  float const x_58 = data.arr[0];
+  *(tint_symbol_7) = float4(x_58, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(&(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-in-array-manipulating-loop/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/discard-in-array-manipulating-loop/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..ca3016a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-in-array-manipulating-loop/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,129 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 80
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %data "data"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_float_uint_10 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_float_uint_10 = OpTypeArray %float %uint_10
+%_ptr_Function__arr_float_uint_10 = OpTypePointer Function %_arr_float_uint_10
+         %20 = OpConstantNull %_arr_float_uint_10
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %24 = OpConstantNull %int
+%float_0_100000001 = OpConstant %float 0.100000001
+%float_0_200000003 = OpConstant %float 0.200000003
+%float_0_300000012 = OpConstant %float 0.300000012
+%float_0_400000006 = OpConstant %float 0.400000006
+  %float_0_5 = OpConstant %float 0.5
+%float_0_600000024 = OpConstant %float 0.600000024
+%float_0_699999988 = OpConstant %float 0.699999988
+%float_0_800000012 = OpConstant %float 0.800000012
+%float_0_899999976 = OpConstant %float 0.899999976
+    %float_1 = OpConstant %float 1
+         %35 = OpConstantComposite %_arr_float_uint_10 %float_0_100000001 %float_0_200000003 %float_0_300000012 %float_0_400000006 %float_0_5 %float_0_600000024 %float_0_699999988 %float_0_800000012 %float_0_899999976 %float_1
+      %int_0 = OpConstant %int 0
+     %int_10 = OpConstant %int 10
+       %bool = OpTypeBool
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %67 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+       %data = OpVariable %_ptr_Function__arr_float_uint_10 Function %20
+          %i = OpVariable %_ptr_Function_int Function %24
+               OpStore %data %35
+               OpStore %i %int_0
+               OpBranch %37
+         %37 = OpLabel
+               OpLoopMerge %38 %39 None
+               OpBranch %40
+         %40 = OpLabel
+         %41 = OpLoad %int %i
+         %43 = OpSLessThan %bool %41 %int_10
+               OpSelectionMerge %45 None
+               OpBranchConditional %43 %46 %47
+         %46 = OpLabel
+               OpBranch %45
+         %47 = OpLabel
+               OpBranch %38
+         %45 = OpLabel
+         %50 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %51 = OpLoad %float %50
+         %53 = OpFOrdLessThan %bool %51 %float_0
+               OpSelectionMerge %54 None
+               OpBranchConditional %53 %55 %54
+         %55 = OpLabel
+               OpKill
+         %54 = OpLabel
+         %56 = OpLoad %int %i
+         %58 = OpAccessChain %_ptr_Function_float %data %56
+         %59 = OpLoad %float %58
+         %60 = OpAccessChain %_ptr_Function_float %data %int_0
+               OpStore %60 %59
+               OpBranch %39
+         %39 = OpLabel
+         %61 = OpLoad %int %i
+         %63 = OpIAdd %int %61 %int_1
+               OpStore %i %63
+               OpBranch %37
+         %38 = OpLabel
+         %64 = OpAccessChain %_ptr_Function_float %data %int_0
+         %65 = OpLoad %float %64
+         %66 = OpCompositeConstruct %v4float %65 %float_0 %float_0 %float_1
+               OpStore %x_GLF_color %66
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %67
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %71 = OpLabel
+         %72 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %72
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %74 = OpLabel
+         %75 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %75
+         %76 = OpFunctionCall %void %main_1
+         %78 = OpLoad %v4float %x_GLF_color
+         %79 = OpCompositeConstruct %main_out %78
+         %77 = OpFunctionCall %void %tint_symbol_3 %79
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-in-array-manipulating-loop/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/discard-in-array-manipulating-loop/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..6981641
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-in-array-manipulating-loop/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,44 @@
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var data : array<f32, 10>;
+  var i : i32;
+  data = array<f32, 10>(0.100000001, 0.200000003, 0.300000012, 0.400000006, 0.5, 0.600000024, 0.699999988, 0.800000012, 0.899999976, 1.0);
+  i = 0;
+  loop {
+    let x_7 : i32 = i;
+    if ((x_7 < 10)) {
+    } else {
+      break;
+    }
+    let x_50 : f32 = gl_FragCoord.x;
+    if ((x_50 < 0.0)) {
+      discard;
+    }
+    let x_8 : i32 = i;
+    let x_55 : f32 = data[x_8];
+    data[0] = x_55;
+
+    continuing {
+      let x_9 : i32 = i;
+      i = (x_9 + 1);
+    }
+  }
+  let x_58 : f32 = data[0];
+  x_GLF_color = vec4<f32>(x_58, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-in-loop-in-function/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/discard-in-loop-in-function/0-opt.spvasm
new file mode 100644
index 0000000..3159420
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-in-loop-in-function/0-opt.spvasm
@@ -0,0 +1,77 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %f_ "f("
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %float_1 = OpConstant %float 1
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_0 = OpConstant %float 0
+      %false = OpConstantFalse %bool
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %26 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %9
+         %27 = OpLabel
+         %28 = OpFunctionCall %void %f_
+               OpStore %_GLF_color %26
+               OpReturn
+               OpFunctionEnd
+         %f_ = OpFunction %void None %9
+         %29 = OpLabel
+               OpBranch %30
+         %30 = OpLabel
+               OpLoopMerge %31 %32 None
+               OpBranch %33
+         %33 = OpLabel
+         %34 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %35 = OpLoad %float %34
+         %36 = OpFOrdGreaterThan %bool %float_1 %35
+               OpSelectionMerge %37 None
+               OpBranchConditional %36 %38 %37
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %40 = OpLoad %float %39
+         %41 = OpFOrdLessThan %bool %40 %float_0
+               OpSelectionMerge %42 None
+               OpBranchConditional %41 %43 %32
+         %43 = OpLabel
+               OpBranch %32
+         %42 = OpLabel
+               OpBranch %32
+         %32 = OpLabel
+               OpBranchConditional %false %30 %31
+         %37 = OpLabel
+               OpKill
+         %31 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-in-loop-in-function/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/discard-in-loop-in-function/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..bc52353
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-in-loop-in-function/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,71 @@
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void f_() {
+  while (true) {
+    const float x_35 = asfloat(x_7[0].y);
+    if ((1.0f > x_35)) {
+      const float x_40 = gl_FragCoord.y;
+      if ((x_40 < 0.0f)) {
+        {
+          if (false) {
+          } else {
+            break;
+          }
+        }
+        continue;
+      } else {
+        {
+          if (false) {
+          } else {
+            break;
+          }
+        }
+        continue;
+      }
+      {
+        if (false) {
+        } else {
+          break;
+        }
+      }
+      continue;
+    }
+    discard;
+    {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  return;
+}
+
+void main_1() {
+  f_();
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-in-loop-in-function/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/discard-in-loop-in-function/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..d61e94e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-in-loop-in-function/0-opt.spvasm.expected.msl
@@ -0,0 +1,70 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void f_(constant buf0& x_7, thread float4* const tint_symbol_5) {
+  while (true) {
+    float const x_35 = x_7.injectionSwitch.y;
+    if ((1.0f > x_35)) {
+      float const x_40 = (*(tint_symbol_5)).y;
+      if ((x_40 < 0.0f)) {
+        {
+          if (false) {
+          } else {
+            break;
+          }
+        }
+        continue;
+      } else {
+        {
+          if (false) {
+          } else {
+            break;
+          }
+        }
+        continue;
+      }
+      {
+        if (false) {
+        } else {
+          break;
+        }
+      }
+      continue;
+    }
+    discard_fragment();
+    {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  return;
+}
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  f_(x_7, tint_symbol_6);
+  *(tint_symbol_7) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_7, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-in-loop-in-function/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/discard-in-loop-in-function/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..79cac68
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-in-loop-in-function/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,125 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 63
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_7 "x_7"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %f_ "f_"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+       %bool = OpTypeBool
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+      %false = OpConstantFalse %bool
+         %49 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %50 = OpTypeFunction %void %main_out
+         %f_ = OpFunction %void None %15
+         %18 = OpLabel
+               OpBranch %19
+         %19 = OpLabel
+               OpLoopMerge %20 %21 None
+               OpBranch %22
+         %22 = OpLabel
+         %27 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_1
+         %28 = OpLoad %float %27
+         %30 = OpFOrdGreaterThan %bool %float_1 %28
+               OpSelectionMerge %32 None
+               OpBranchConditional %30 %33 %32
+         %33 = OpLabel
+         %35 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %36 = OpLoad %float %35
+         %38 = OpFOrdLessThan %bool %36 %float_0
+               OpSelectionMerge %39 None
+               OpBranchConditional %38 %40 %41
+         %40 = OpLabel
+               OpBranch %21
+         %41 = OpLabel
+               OpBranch %21
+         %39 = OpLabel
+               OpBranch %21
+         %32 = OpLabel
+               OpKill
+         %21 = OpLabel
+               OpSelectionMerge %43 None
+               OpBranchConditional %false %44 %45
+         %44 = OpLabel
+               OpBranch %43
+         %45 = OpLabel
+               OpBranch %20
+         %43 = OpLabel
+               OpBranch %19
+         %20 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %15
+         %47 = OpLabel
+         %48 = OpFunctionCall %void %f_
+               OpStore %x_GLF_color %49
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %50
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %54 = OpLabel
+         %55 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %55
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %57 = OpLabel
+         %58 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %58
+         %59 = OpFunctionCall %void %main_1
+         %61 = OpLoad %v4float %x_GLF_color
+         %62 = OpCompositeConstruct %main_out %61
+         %60 = OpFunctionCall %void %tint_symbol_3 %62
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 21[%21] is not post dominated by the back-edge block 43[%43]
+  %43 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-in-loop-in-function/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/discard-in-loop-in-function/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..bf03fdc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-in-loop-in-function/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,52 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn f_() {
+  loop {
+    let x_35 : f32 = x_7.injectionSwitch.y;
+    if ((1.0 > x_35)) {
+      let x_40 : f32 = gl_FragCoord.y;
+      if ((x_40 < 0.0)) {
+        continue;
+      } else {
+        continue;
+      }
+      continue;
+    }
+    discard;
+
+    continuing {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  f_();
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-in-loop-in-function/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/discard-in-loop-in-function/0-opt.wgsl
new file mode 100644
index 0000000..bf03fdc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-in-loop-in-function/0-opt.wgsl
@@ -0,0 +1,52 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn f_() {
+  loop {
+    let x_35 : f32 = x_7.injectionSwitch.y;
+    if ((1.0 > x_35)) {
+      let x_40 : f32 = gl_FragCoord.y;
+      if ((x_40 < 0.0)) {
+        continue;
+      } else {
+        continue;
+      }
+      continue;
+    }
+    discard;
+
+    continuing {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  f_();
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-in-loop-in-function/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/discard-in-loop-in-function/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..bc52353
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-in-loop-in-function/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,71 @@
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void f_() {
+  while (true) {
+    const float x_35 = asfloat(x_7[0].y);
+    if ((1.0f > x_35)) {
+      const float x_40 = gl_FragCoord.y;
+      if ((x_40 < 0.0f)) {
+        {
+          if (false) {
+          } else {
+            break;
+          }
+        }
+        continue;
+      } else {
+        {
+          if (false) {
+          } else {
+            break;
+          }
+        }
+        continue;
+      }
+      {
+        if (false) {
+        } else {
+          break;
+        }
+      }
+      continue;
+    }
+    discard;
+    {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  return;
+}
+
+void main_1() {
+  f_();
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-in-loop-in-function/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/discard-in-loop-in-function/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..d61e94e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-in-loop-in-function/0-opt.wgsl.expected.msl
@@ -0,0 +1,70 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void f_(constant buf0& x_7, thread float4* const tint_symbol_5) {
+  while (true) {
+    float const x_35 = x_7.injectionSwitch.y;
+    if ((1.0f > x_35)) {
+      float const x_40 = (*(tint_symbol_5)).y;
+      if ((x_40 < 0.0f)) {
+        {
+          if (false) {
+          } else {
+            break;
+          }
+        }
+        continue;
+      } else {
+        {
+          if (false) {
+          } else {
+            break;
+          }
+        }
+        continue;
+      }
+      {
+        if (false) {
+        } else {
+          break;
+        }
+      }
+      continue;
+    }
+    discard_fragment();
+    {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  return;
+}
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  f_(x_7, tint_symbol_6);
+  *(tint_symbol_7) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_7, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-in-loop-in-function/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/discard-in-loop-in-function/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..79cac68
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-in-loop-in-function/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,125 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 63
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_7 "x_7"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %f_ "f_"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+       %bool = OpTypeBool
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+      %false = OpConstantFalse %bool
+         %49 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %50 = OpTypeFunction %void %main_out
+         %f_ = OpFunction %void None %15
+         %18 = OpLabel
+               OpBranch %19
+         %19 = OpLabel
+               OpLoopMerge %20 %21 None
+               OpBranch %22
+         %22 = OpLabel
+         %27 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_1
+         %28 = OpLoad %float %27
+         %30 = OpFOrdGreaterThan %bool %float_1 %28
+               OpSelectionMerge %32 None
+               OpBranchConditional %30 %33 %32
+         %33 = OpLabel
+         %35 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %36 = OpLoad %float %35
+         %38 = OpFOrdLessThan %bool %36 %float_0
+               OpSelectionMerge %39 None
+               OpBranchConditional %38 %40 %41
+         %40 = OpLabel
+               OpBranch %21
+         %41 = OpLabel
+               OpBranch %21
+         %39 = OpLabel
+               OpBranch %21
+         %32 = OpLabel
+               OpKill
+         %21 = OpLabel
+               OpSelectionMerge %43 None
+               OpBranchConditional %false %44 %45
+         %44 = OpLabel
+               OpBranch %43
+         %45 = OpLabel
+               OpBranch %20
+         %43 = OpLabel
+               OpBranch %19
+         %20 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %15
+         %47 = OpLabel
+         %48 = OpFunctionCall %void %f_
+               OpStore %x_GLF_color %49
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %50
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %54 = OpLabel
+         %55 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %55
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %57 = OpLabel
+         %58 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %58
+         %59 = OpFunctionCall %void %main_1
+         %61 = OpLoad %v4float %x_GLF_color
+         %62 = OpCompositeConstruct %main_out %61
+         %60 = OpFunctionCall %void %tint_symbol_3 %62
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 21[%21] is not post dominated by the back-edge block 43[%43]
+  %43 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-in-loop-in-function/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/discard-in-loop-in-function/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..bf03fdc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-in-loop-in-function/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,52 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn f_() {
+  loop {
+    let x_35 : f32 = x_7.injectionSwitch.y;
+    if ((1.0 > x_35)) {
+      let x_40 : f32 = gl_FragCoord.y;
+      if ((x_40 < 0.0)) {
+        continue;
+      } else {
+        continue;
+      }
+      continue;
+    }
+    discard;
+
+    continuing {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  f_();
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-in-loop/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/discard-in-loop/0-opt.spvasm
new file mode 100644
index 0000000..3c03959
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-in-loop/0-opt.spvasm
@@ -0,0 +1,82 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %6 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+     %int_10 = OpConstant %int 10
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_0 = OpConstant %float 0
+     %uint_0 = OpConstant %uint 0
+      %int_1 = OpConstant %int 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+         %22 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %false = OpConstantFalse %bool
+       %true = OpConstantTrue %bool
+       %main = OpFunction %void None %6
+         %25 = OpLabel
+               OpBranch %26
+         %26 = OpLabel
+               OpLoopMerge %27 %28 None
+               OpBranch %29
+         %29 = OpLabel
+         %30 = OpPhi %int %int_0 %26 %31 %32
+         %33 = OpSLessThan %bool %30 %int_10
+               OpLoopMerge %34 %32 None
+               OpBranchConditional %33 %35 %34
+         %35 = OpLabel
+         %36 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %37 = OpLoad %float %36
+         %38 = OpFOrdLessThan %bool %37 %float_0
+               OpSelectionMerge %39 None
+               OpBranchConditional %38 %40 %39
+         %40 = OpLabel
+         %41 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %42 = OpLoad %float %41
+         %43 = OpFOrdLessThan %bool %42 %float_0
+               OpSelectionMerge %44 None
+               OpBranchConditional %43 %45 %32
+         %45 = OpLabel
+               OpBranch %34
+         %44 = OpLabel
+               OpBranch %32
+         %32 = OpLabel
+         %31 = OpIAdd %int %30 %int_1
+               OpBranch %29
+         %39 = OpLabel
+         %46 = OpFunctionCall %void %47
+               OpBranch %34
+         %34 = OpLabel
+         %48 = OpPhi %bool %false %29 %false %45 %true %39
+               OpSelectionMerge %49 None
+               OpBranchConditional %48 %27 %49
+         %49 = OpLabel
+               OpStore %_GLF_color %22
+               OpBranch %27
+         %28 = OpLabel
+               OpBranch %26
+         %27 = OpLabel
+               OpReturn
+               OpFunctionEnd
+         %47 = OpFunction %void None %6
+         %50 = OpLabel
+               OpKill
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-in-loop/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/discard-in-loop/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..a01424a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-in-loop/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,74 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void x_47() {
+  discard;
+}
+
+void main_1() {
+  while (true) {
+    int x_30_phi = 0;
+    bool x_48_phi = false;
+    x_30_phi = 0;
+    while (true) {
+      int x_31 = 0;
+      const int x_30 = x_30_phi;
+      x_48_phi = false;
+      if ((x_30 < 10)) {
+      } else {
+        break;
+      }
+      const float x_37 = gl_FragCoord.y;
+      if ((x_37 < 0.0f)) {
+        const float x_42 = gl_FragCoord.x;
+        if ((x_42 < 0.0f)) {
+          x_48_phi = false;
+          break;
+        } else {
+          {
+            x_31 = (x_30 + 1);
+            x_30_phi = x_31;
+          }
+          continue;
+        }
+        {
+          x_31 = (x_30 + 1);
+          x_30_phi = x_31;
+        }
+        continue;
+      }
+      x_47();
+      x_48_phi = true;
+      break;
+      {
+        x_31 = (x_30 + 1);
+        x_30_phi = x_31;
+      }
+    }
+    if (x_48_phi) {
+      break;
+    }
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    break;
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-in-loop/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/discard-in-loop/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..9e3108a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-in-loop/0-opt.spvasm.expected.msl
@@ -0,0 +1,74 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void x_47() {
+  discard_fragment();
+}
+
+void main_1(thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  while (true) {
+    int x_30_phi = 0;
+    bool x_48_phi = false;
+    x_30_phi = 0;
+    while (true) {
+      int x_31 = 0;
+      int const x_30 = x_30_phi;
+      x_48_phi = false;
+      if ((x_30 < 10)) {
+      } else {
+        break;
+      }
+      float const x_37 = (*(tint_symbol_5)).y;
+      if ((x_37 < 0.0f)) {
+        float const x_42 = (*(tint_symbol_5)).x;
+        if ((x_42 < 0.0f)) {
+          x_48_phi = false;
+          break;
+        } else {
+          {
+            x_31 = (x_30 + 1);
+            x_30_phi = x_31;
+          }
+          continue;
+        }
+        {
+          x_31 = (x_30 + 1);
+          x_30_phi = x_31;
+        }
+        continue;
+      }
+      x_47();
+      x_48_phi = true;
+      break;
+      {
+        x_31 = (x_30 + 1);
+        x_30_phi = x_31;
+      }
+    }
+    bool const x_48 = x_48_phi;
+    if (x_48) {
+      break;
+    }
+    *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    break;
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(&(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-in-loop/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/discard-in-loop/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..fb9fd81
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-in-loop/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,147 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 81
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %x_47 "x_47"
+               OpName %main_1 "main_1"
+               OpName %x_30_phi "x_30_phi"
+               OpName %x_48_phi "x_48_phi"
+               OpName %x_31 "x_31"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %24 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %28 = OpConstantNull %bool
+      %int_0 = OpConstant %int 0
+      %false = OpConstantFalse %bool
+     %int_10 = OpConstant %int 10
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+     %uint_0 = OpConstant %uint 0
+       %true = OpConstantTrue %bool
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+         %67 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %68 = OpTypeFunction %void %main_out
+       %x_47 = OpFunction %void None %11
+         %14 = OpLabel
+               OpKill
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %11
+         %16 = OpLabel
+   %x_30_phi = OpVariable %_ptr_Function_int Function %24
+   %x_48_phi = OpVariable %_ptr_Function_bool Function %28
+       %x_31 = OpVariable %_ptr_Function_int Function %24
+               OpBranch %17
+         %17 = OpLabel
+               OpLoopMerge %18 %19 None
+               OpBranch %20
+         %20 = OpLabel
+               OpStore %x_30_phi %int_0
+               OpBranch %30
+         %30 = OpLabel
+               OpLoopMerge %31 %32 None
+               OpBranch %33
+         %33 = OpLabel
+         %35 = OpLoad %int %x_30_phi
+               OpStore %x_48_phi %false
+         %38 = OpSLessThan %bool %35 %int_10
+               OpSelectionMerge %39 None
+               OpBranchConditional %38 %40 %41
+         %40 = OpLabel
+               OpBranch %39
+         %41 = OpLabel
+               OpBranch %31
+         %39 = OpLabel
+         %45 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %46 = OpLoad %float %45
+         %48 = OpFOrdLessThan %bool %46 %float_0
+               OpSelectionMerge %49 None
+               OpBranchConditional %48 %50 %49
+         %50 = OpLabel
+         %52 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %53 = OpLoad %float %52
+         %54 = OpFOrdLessThan %bool %53 %float_0
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %57
+         %56 = OpLabel
+               OpStore %x_48_phi %false
+               OpBranch %31
+         %57 = OpLabel
+               OpBranch %32
+         %55 = OpLabel
+               OpBranch %32
+         %49 = OpLabel
+         %58 = OpFunctionCall %void %x_47
+               OpStore %x_48_phi %true
+               OpBranch %31
+         %32 = OpLabel
+         %61 = OpIAdd %int %35 %int_1
+               OpStore %x_31 %61
+         %62 = OpLoad %int %x_31
+               OpStore %x_30_phi %62
+               OpBranch %30
+         %31 = OpLabel
+         %63 = OpLoad %bool %x_48_phi
+               OpSelectionMerge %64 None
+               OpBranchConditional %63 %65 %64
+         %65 = OpLabel
+               OpBranch %18
+         %64 = OpLabel
+               OpStore %x_GLF_color %67
+               OpBranch %18
+         %19 = OpLabel
+               OpBranch %17
+         %18 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %68
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %72 = OpLabel
+         %73 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %73
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %75 = OpLabel
+         %76 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %76
+         %77 = OpFunctionCall %void %main_1
+         %79 = OpLoad %v4float %x_GLF_color
+         %80 = OpCompositeConstruct %main_out %79
+         %78 = OpFunctionCall %void %tint_symbol_3 %80
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-in-loop/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/discard-in-loop/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..83948ce
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-in-loop/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,62 @@
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn x_47() {
+  discard;
+}
+
+fn main_1() {
+  loop {
+    var x_30_phi : i32;
+    var x_48_phi : bool;
+    x_30_phi = 0;
+    loop {
+      var x_31 : i32;
+      let x_30 : i32 = x_30_phi;
+      x_48_phi = false;
+      if ((x_30 < 10)) {
+      } else {
+        break;
+      }
+      let x_37 : f32 = gl_FragCoord.y;
+      if ((x_37 < 0.0)) {
+        let x_42 : f32 = gl_FragCoord.x;
+        if ((x_42 < 0.0)) {
+          x_48_phi = false;
+          break;
+        } else {
+          continue;
+        }
+        continue;
+      }
+      x_47();
+      x_48_phi = true;
+      break;
+
+      continuing {
+        x_31 = (x_30 + 1);
+        x_30_phi = x_31;
+      }
+    }
+    let x_48 : bool = x_48_phi;
+    if (x_48) {
+      break;
+    }
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    break;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-in-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/discard-in-loop/0-opt.wgsl
new file mode 100644
index 0000000..83948ce
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-in-loop/0-opt.wgsl
@@ -0,0 +1,62 @@
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn x_47() {
+  discard;
+}
+
+fn main_1() {
+  loop {
+    var x_30_phi : i32;
+    var x_48_phi : bool;
+    x_30_phi = 0;
+    loop {
+      var x_31 : i32;
+      let x_30 : i32 = x_30_phi;
+      x_48_phi = false;
+      if ((x_30 < 10)) {
+      } else {
+        break;
+      }
+      let x_37 : f32 = gl_FragCoord.y;
+      if ((x_37 < 0.0)) {
+        let x_42 : f32 = gl_FragCoord.x;
+        if ((x_42 < 0.0)) {
+          x_48_phi = false;
+          break;
+        } else {
+          continue;
+        }
+        continue;
+      }
+      x_47();
+      x_48_phi = true;
+      break;
+
+      continuing {
+        x_31 = (x_30 + 1);
+        x_30_phi = x_31;
+      }
+    }
+    let x_48 : bool = x_48_phi;
+    if (x_48) {
+      break;
+    }
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    break;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-in-loop/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/discard-in-loop/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..a01424a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-in-loop/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,74 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void x_47() {
+  discard;
+}
+
+void main_1() {
+  while (true) {
+    int x_30_phi = 0;
+    bool x_48_phi = false;
+    x_30_phi = 0;
+    while (true) {
+      int x_31 = 0;
+      const int x_30 = x_30_phi;
+      x_48_phi = false;
+      if ((x_30 < 10)) {
+      } else {
+        break;
+      }
+      const float x_37 = gl_FragCoord.y;
+      if ((x_37 < 0.0f)) {
+        const float x_42 = gl_FragCoord.x;
+        if ((x_42 < 0.0f)) {
+          x_48_phi = false;
+          break;
+        } else {
+          {
+            x_31 = (x_30 + 1);
+            x_30_phi = x_31;
+          }
+          continue;
+        }
+        {
+          x_31 = (x_30 + 1);
+          x_30_phi = x_31;
+        }
+        continue;
+      }
+      x_47();
+      x_48_phi = true;
+      break;
+      {
+        x_31 = (x_30 + 1);
+        x_30_phi = x_31;
+      }
+    }
+    if (x_48_phi) {
+      break;
+    }
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    break;
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-in-loop/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/discard-in-loop/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..9e3108a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-in-loop/0-opt.wgsl.expected.msl
@@ -0,0 +1,74 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void x_47() {
+  discard_fragment();
+}
+
+void main_1(thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  while (true) {
+    int x_30_phi = 0;
+    bool x_48_phi = false;
+    x_30_phi = 0;
+    while (true) {
+      int x_31 = 0;
+      int const x_30 = x_30_phi;
+      x_48_phi = false;
+      if ((x_30 < 10)) {
+      } else {
+        break;
+      }
+      float const x_37 = (*(tint_symbol_5)).y;
+      if ((x_37 < 0.0f)) {
+        float const x_42 = (*(tint_symbol_5)).x;
+        if ((x_42 < 0.0f)) {
+          x_48_phi = false;
+          break;
+        } else {
+          {
+            x_31 = (x_30 + 1);
+            x_30_phi = x_31;
+          }
+          continue;
+        }
+        {
+          x_31 = (x_30 + 1);
+          x_30_phi = x_31;
+        }
+        continue;
+      }
+      x_47();
+      x_48_phi = true;
+      break;
+      {
+        x_31 = (x_30 + 1);
+        x_30_phi = x_31;
+      }
+    }
+    bool const x_48 = x_48_phi;
+    if (x_48) {
+      break;
+    }
+    *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    break;
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(&(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-in-loop/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/discard-in-loop/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..fb9fd81
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-in-loop/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,147 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 81
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %x_47 "x_47"
+               OpName %main_1 "main_1"
+               OpName %x_30_phi "x_30_phi"
+               OpName %x_48_phi "x_48_phi"
+               OpName %x_31 "x_31"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %24 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %28 = OpConstantNull %bool
+      %int_0 = OpConstant %int 0
+      %false = OpConstantFalse %bool
+     %int_10 = OpConstant %int 10
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+     %uint_0 = OpConstant %uint 0
+       %true = OpConstantTrue %bool
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+         %67 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %68 = OpTypeFunction %void %main_out
+       %x_47 = OpFunction %void None %11
+         %14 = OpLabel
+               OpKill
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %11
+         %16 = OpLabel
+   %x_30_phi = OpVariable %_ptr_Function_int Function %24
+   %x_48_phi = OpVariable %_ptr_Function_bool Function %28
+       %x_31 = OpVariable %_ptr_Function_int Function %24
+               OpBranch %17
+         %17 = OpLabel
+               OpLoopMerge %18 %19 None
+               OpBranch %20
+         %20 = OpLabel
+               OpStore %x_30_phi %int_0
+               OpBranch %30
+         %30 = OpLabel
+               OpLoopMerge %31 %32 None
+               OpBranch %33
+         %33 = OpLabel
+         %35 = OpLoad %int %x_30_phi
+               OpStore %x_48_phi %false
+         %38 = OpSLessThan %bool %35 %int_10
+               OpSelectionMerge %39 None
+               OpBranchConditional %38 %40 %41
+         %40 = OpLabel
+               OpBranch %39
+         %41 = OpLabel
+               OpBranch %31
+         %39 = OpLabel
+         %45 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %46 = OpLoad %float %45
+         %48 = OpFOrdLessThan %bool %46 %float_0
+               OpSelectionMerge %49 None
+               OpBranchConditional %48 %50 %49
+         %50 = OpLabel
+         %52 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %53 = OpLoad %float %52
+         %54 = OpFOrdLessThan %bool %53 %float_0
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %57
+         %56 = OpLabel
+               OpStore %x_48_phi %false
+               OpBranch %31
+         %57 = OpLabel
+               OpBranch %32
+         %55 = OpLabel
+               OpBranch %32
+         %49 = OpLabel
+         %58 = OpFunctionCall %void %x_47
+               OpStore %x_48_phi %true
+               OpBranch %31
+         %32 = OpLabel
+         %61 = OpIAdd %int %35 %int_1
+               OpStore %x_31 %61
+         %62 = OpLoad %int %x_31
+               OpStore %x_30_phi %62
+               OpBranch %30
+         %31 = OpLabel
+         %63 = OpLoad %bool %x_48_phi
+               OpSelectionMerge %64 None
+               OpBranchConditional %63 %65 %64
+         %65 = OpLabel
+               OpBranch %18
+         %64 = OpLabel
+               OpStore %x_GLF_color %67
+               OpBranch %18
+         %19 = OpLabel
+               OpBranch %17
+         %18 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %68
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %72 = OpLabel
+         %73 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %73
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %75 = OpLabel
+         %76 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %76
+         %77 = OpFunctionCall %void %main_1
+         %79 = OpLoad %v4float %x_GLF_color
+         %80 = OpCompositeConstruct %main_out %79
+         %78 = OpFunctionCall %void %tint_symbol_3 %80
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/discard-in-loop/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/discard-in-loop/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..83948ce
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discard-in-loop/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,62 @@
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn x_47() {
+  discard;
+}
+
+fn main_1() {
+  loop {
+    var x_30_phi : i32;
+    var x_48_phi : bool;
+    x_30_phi = 0;
+    loop {
+      var x_31 : i32;
+      let x_30 : i32 = x_30_phi;
+      x_48_phi = false;
+      if ((x_30 < 10)) {
+      } else {
+        break;
+      }
+      let x_37 : f32 = gl_FragCoord.y;
+      if ((x_37 < 0.0)) {
+        let x_42 : f32 = gl_FragCoord.x;
+        if ((x_42 < 0.0)) {
+          x_48_phi = false;
+          break;
+        } else {
+          continue;
+        }
+        continue;
+      }
+      x_47();
+      x_48_phi = true;
+      break;
+
+      continuing {
+        x_31 = (x_30 + 1);
+        x_30_phi = x_31;
+      }
+    }
+    let x_48 : bool = x_48_phi;
+    if (x_48) {
+      break;
+    }
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    break;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/discards-in-control-flow/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/discards-in-control-flow/0-opt.spvasm
new file mode 100644
index 0000000..6911dee
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discards-in-control-flow/0-opt.spvasm
@@ -0,0 +1,91 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color %gl_FragCoord
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %ll "ll"
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %ll RelaxedPrecision
+               OpDecorate %6 RelaxedPrecision
+               OpDecorate %7 RelaxedPrecision
+               OpDecorate %8 RelaxedPrecision
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %16 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+        %int = OpTypeInt 32 1
+   %int_2000 = OpConstant %int 2000
+       %bool = OpTypeBool
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %int_5 = OpConstant %int 5
+      %int_1 = OpConstant %int 1
+       %main = OpFunction %void None %10
+         %28 = OpLabel
+         %ll = OpVariable %_ptr_Function_int Function
+               OpStore %_GLF_color %16
+         %29 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %30 = OpLoad %float %29
+         %31 = OpConvertFToS %int %30
+         %32 = OpSLessThan %bool %31 %int_2000
+               OpSelectionMerge %33 None
+               OpBranchConditional %32 %34 %35
+         %34 = OpLabel
+               OpBranch %33
+         %35 = OpLabel
+               OpStore %ll %int_0
+               OpBranch %36
+         %36 = OpLabel
+               OpLoopMerge %37 %38 None
+               OpBranch %39
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %41 = OpLoad %float %40
+         %42 = OpFOrdLessThan %bool %41 %float_0
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %43
+         %44 = OpLabel
+               OpKill
+         %43 = OpLabel
+          %6 = OpLoad %int %ll
+         %45 = OpSGreaterThanEqual %bool %6 %int_5
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %46
+         %47 = OpLabel
+               OpBranch %37
+         %46 = OpLabel
+               OpBranch %38
+         %38 = OpLabel
+          %7 = OpLoad %int %ll
+          %8 = OpIAdd %int %7 %int_1
+               OpStore %ll %8
+               OpBranch %36
+         %37 = OpLabel
+         %48 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %49 = OpLoad %float %48
+         %50 = OpConvertFToS %int %49
+         %51 = OpSGreaterThanEqual %bool %50 %int_2000
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %52
+         %53 = OpLabel
+               OpKill
+         %52 = OpLabel
+               OpBranch %33
+         %33 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/discards-in-control-flow/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/discards-in-control-flow/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..7a88372
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discards-in-control-flow/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,48 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int ll = 0;
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  const float x_30 = gl_FragCoord.x;
+  if ((int(x_30) < 2000)) {
+  } else {
+    ll = 0;
+    while (true) {
+      const float x_41 = gl_FragCoord.x;
+      if ((x_41 < 0.0f)) {
+        discard;
+      }
+      if ((ll >= 5)) {
+        break;
+      }
+      {
+        ll = (ll + 1);
+      }
+    }
+    const float x_49 = gl_FragCoord.x;
+    if ((int(x_49) >= 2000)) {
+      discard;
+    }
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/discards-in-control-flow/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/discards-in-control-flow/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..f11683a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discards-in-control-flow/0-opt.spvasm.expected.msl
@@ -0,0 +1,49 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int ll = 0;
+  *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  float const x_30 = (*(tint_symbol_6)).x;
+  if ((int(x_30) < 2000)) {
+  } else {
+    ll = 0;
+    while (true) {
+      float const x_41 = (*(tint_symbol_6)).x;
+      if ((x_41 < 0.0f)) {
+        discard_fragment();
+      }
+      int const x_6 = ll;
+      if ((x_6 >= 5)) {
+        break;
+      }
+      {
+        int const x_7 = ll;
+        ll = (x_7 + 1);
+      }
+    }
+    float const x_49 = (*(tint_symbol_6)).x;
+    if ((int(x_49) >= 2000)) {
+      discard_fragment();
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(&(tint_symbol_8), &(tint_symbol_7));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/discards-in-control-flow/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/discards-in-control-flow/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..1a87cf4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discards-in-control-flow/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,122 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 71
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %ll "ll"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %21 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+   %int_2000 = OpConstant %int 2000
+       %bool = OpTypeBool
+      %int_0 = OpConstant %int 0
+      %int_5 = OpConstant %int 5
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %58 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+         %ll = OpVariable %_ptr_Function_int Function %18
+               OpStore %x_GLF_color %21
+         %25 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %26 = OpLoad %float %25
+         %27 = OpConvertFToS %int %26
+         %29 = OpSLessThan %bool %27 %int_2000
+               OpSelectionMerge %31 None
+               OpBranchConditional %29 %32 %33
+         %32 = OpLabel
+               OpBranch %31
+         %33 = OpLabel
+               OpStore %ll %int_0
+               OpBranch %35
+         %35 = OpLabel
+               OpLoopMerge %36 %37 None
+               OpBranch %38
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %40 = OpLoad %float %39
+         %41 = OpFOrdLessThan %bool %40 %float_0
+               OpSelectionMerge %42 None
+               OpBranchConditional %41 %43 %42
+         %43 = OpLabel
+               OpKill
+         %42 = OpLabel
+         %44 = OpLoad %int %ll
+         %46 = OpSGreaterThanEqual %bool %44 %int_5
+               OpSelectionMerge %47 None
+               OpBranchConditional %46 %48 %47
+         %48 = OpLabel
+               OpBranch %36
+         %47 = OpLabel
+               OpBranch %37
+         %37 = OpLabel
+         %49 = OpLoad %int %ll
+         %51 = OpIAdd %int %49 %int_1
+               OpStore %ll %51
+               OpBranch %35
+         %36 = OpLabel
+         %52 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %53 = OpLoad %float %52
+         %54 = OpConvertFToS %int %53
+         %55 = OpSGreaterThanEqual %bool %54 %int_2000
+               OpSelectionMerge %56 None
+               OpBranchConditional %55 %57 %56
+         %57 = OpLabel
+               OpKill
+         %56 = OpLabel
+               OpBranch %31
+         %31 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %58
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %62 = OpLabel
+         %63 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %63
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %65 = OpLabel
+         %66 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %66
+         %67 = OpFunctionCall %void %main_1
+         %69 = OpLoad %v4float %x_GLF_color
+         %70 = OpCompositeConstruct %main_out %69
+         %68 = OpFunctionCall %void %tint_symbol_3 %70
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/discards-in-control-flow/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/discards-in-control-flow/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..926c273
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discards-in-control-flow/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,45 @@
+var<private> x_GLF_color : vec4<f32>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  var ll : i32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  let x_30 : f32 = gl_FragCoord.x;
+  if ((i32(x_30) < 2000)) {
+  } else {
+    ll = 0;
+    loop {
+      let x_41 : f32 = gl_FragCoord.x;
+      if ((x_41 < 0.0)) {
+        discard;
+      }
+      let x_6 : i32 = ll;
+      if ((x_6 >= 5)) {
+        break;
+      }
+
+      continuing {
+        let x_7 : i32 = ll;
+        ll = (x_7 + 1);
+      }
+    }
+    let x_49 : f32 = gl_FragCoord.x;
+    if ((i32(x_49) >= 2000)) {
+      discard;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/discards-in-control-flow/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/discards-in-control-flow/0-opt.wgsl
new file mode 100644
index 0000000..926c273
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discards-in-control-flow/0-opt.wgsl
@@ -0,0 +1,45 @@
+var<private> x_GLF_color : vec4<f32>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  var ll : i32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  let x_30 : f32 = gl_FragCoord.x;
+  if ((i32(x_30) < 2000)) {
+  } else {
+    ll = 0;
+    loop {
+      let x_41 : f32 = gl_FragCoord.x;
+      if ((x_41 < 0.0)) {
+        discard;
+      }
+      let x_6 : i32 = ll;
+      if ((x_6 >= 5)) {
+        break;
+      }
+
+      continuing {
+        let x_7 : i32 = ll;
+        ll = (x_7 + 1);
+      }
+    }
+    let x_49 : f32 = gl_FragCoord.x;
+    if ((i32(x_49) >= 2000)) {
+      discard;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/discards-in-control-flow/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/discards-in-control-flow/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..7a88372
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discards-in-control-flow/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,48 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int ll = 0;
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  const float x_30 = gl_FragCoord.x;
+  if ((int(x_30) < 2000)) {
+  } else {
+    ll = 0;
+    while (true) {
+      const float x_41 = gl_FragCoord.x;
+      if ((x_41 < 0.0f)) {
+        discard;
+      }
+      if ((ll >= 5)) {
+        break;
+      }
+      {
+        ll = (ll + 1);
+      }
+    }
+    const float x_49 = gl_FragCoord.x;
+    if ((int(x_49) >= 2000)) {
+      discard;
+    }
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/discards-in-control-flow/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/discards-in-control-flow/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..f11683a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discards-in-control-flow/0-opt.wgsl.expected.msl
@@ -0,0 +1,49 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int ll = 0;
+  *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  float const x_30 = (*(tint_symbol_6)).x;
+  if ((int(x_30) < 2000)) {
+  } else {
+    ll = 0;
+    while (true) {
+      float const x_41 = (*(tint_symbol_6)).x;
+      if ((x_41 < 0.0f)) {
+        discard_fragment();
+      }
+      int const x_6 = ll;
+      if ((x_6 >= 5)) {
+        break;
+      }
+      {
+        int const x_7 = ll;
+        ll = (x_7 + 1);
+      }
+    }
+    float const x_49 = (*(tint_symbol_6)).x;
+    if ((int(x_49) >= 2000)) {
+      discard_fragment();
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(&(tint_symbol_8), &(tint_symbol_7));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/discards-in-control-flow/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/discards-in-control-flow/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..1a87cf4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discards-in-control-flow/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,122 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 71
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %ll "ll"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %21 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+   %int_2000 = OpConstant %int 2000
+       %bool = OpTypeBool
+      %int_0 = OpConstant %int 0
+      %int_5 = OpConstant %int 5
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %58 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+         %ll = OpVariable %_ptr_Function_int Function %18
+               OpStore %x_GLF_color %21
+         %25 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %26 = OpLoad %float %25
+         %27 = OpConvertFToS %int %26
+         %29 = OpSLessThan %bool %27 %int_2000
+               OpSelectionMerge %31 None
+               OpBranchConditional %29 %32 %33
+         %32 = OpLabel
+               OpBranch %31
+         %33 = OpLabel
+               OpStore %ll %int_0
+               OpBranch %35
+         %35 = OpLabel
+               OpLoopMerge %36 %37 None
+               OpBranch %38
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %40 = OpLoad %float %39
+         %41 = OpFOrdLessThan %bool %40 %float_0
+               OpSelectionMerge %42 None
+               OpBranchConditional %41 %43 %42
+         %43 = OpLabel
+               OpKill
+         %42 = OpLabel
+         %44 = OpLoad %int %ll
+         %46 = OpSGreaterThanEqual %bool %44 %int_5
+               OpSelectionMerge %47 None
+               OpBranchConditional %46 %48 %47
+         %48 = OpLabel
+               OpBranch %36
+         %47 = OpLabel
+               OpBranch %37
+         %37 = OpLabel
+         %49 = OpLoad %int %ll
+         %51 = OpIAdd %int %49 %int_1
+               OpStore %ll %51
+               OpBranch %35
+         %36 = OpLabel
+         %52 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %53 = OpLoad %float %52
+         %54 = OpConvertFToS %int %53
+         %55 = OpSGreaterThanEqual %bool %54 %int_2000
+               OpSelectionMerge %56 None
+               OpBranchConditional %55 %57 %56
+         %57 = OpLabel
+               OpKill
+         %56 = OpLabel
+               OpBranch %31
+         %31 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %58
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %62 = OpLabel
+         %63 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %63
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %65 = OpLabel
+         %66 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %66
+         %67 = OpFunctionCall %void %main_1
+         %69 = OpLoad %v4float %x_GLF_color
+         %70 = OpCompositeConstruct %main_out %69
+         %68 = OpFunctionCall %void %tint_symbol_3 %70
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/discards-in-control-flow/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/discards-in-control-flow/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..926c273
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/discards-in-control-flow/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,45 @@
+var<private> x_GLF_color : vec4<f32>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  var ll : i32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  let x_30 : f32 = gl_FragCoord.x;
+  if ((i32(x_30) < 2000)) {
+  } else {
+    ll = 0;
+    loop {
+      let x_41 : f32 = gl_FragCoord.x;
+      if ((x_41 < 0.0)) {
+        discard;
+      }
+      let x_6 : i32 = ll;
+      if ((x_6 >= 5)) {
+        break;
+      }
+
+      continuing {
+        let x_7 : i32 = ll;
+        ll = (x_7 + 1);
+      }
+    }
+    let x_49 : f32 = gl_FragCoord.x;
+    if ((i32(x_49) >= 2000)) {
+      discard;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/do-while-false-loops/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/do-while-false-loops/0-opt.spvasm
new file mode 100644
index 0000000..9931dae
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/do-while-false-loops/0-opt.spvasm
@@ -0,0 +1,113 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %f_ "f("
+               OpName %iteration "iteration"
+               OpName %k "k"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %iteration RelaxedPrecision
+               OpDecorate %k RelaxedPrecision
+               OpDecorate %7 RelaxedPrecision
+               OpDecorate %8 RelaxedPrecision
+               OpDecorate %9 RelaxedPrecision
+               OpDecorate %10 RelaxedPrecision
+               OpDecorate %11 RelaxedPrecision
+               OpDecorate %12 RelaxedPrecision
+               OpDecorate %13 RelaxedPrecision
+               OpDecorate %14 RelaxedPrecision
+               OpDecorate %15 RelaxedPrecision
+               OpDecorate %16 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+         %21 = OpTypeFunction %v3float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+    %int_100 = OpConstant %int 100
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %30 = OpConstantComposite %v3float %float_1 %float_0 %float_0
+      %false = OpConstantFalse %bool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %18
+         %34 = OpLabel
+         %35 = OpFunctionCall %v3float %f_
+         %36 = OpCompositeExtract %float %35 0
+         %37 = OpCompositeExtract %float %35 1
+         %38 = OpCompositeExtract %float %35 2
+         %39 = OpCompositeConstruct %v4float %36 %37 %38 %float_1
+               OpStore %_GLF_color %39
+               OpReturn
+               OpFunctionEnd
+         %f_ = OpFunction %v3float None %21
+         %40 = OpLabel
+  %iteration = OpVariable %_ptr_Function_int Function
+          %k = OpVariable %_ptr_Function_int Function
+               OpStore %iteration %int_0
+               OpStore %k %int_0
+               OpBranch %41
+         %41 = OpLabel
+               OpLoopMerge %42 %43 None
+               OpBranch %44
+         %44 = OpLabel
+          %7 = OpLoad %int %k
+         %45 = OpSLessThan %bool %7 %int_100
+               OpBranchConditional %45 %46 %42
+         %46 = OpLabel
+          %8 = OpLoad %int %iteration
+          %9 = OpIAdd %int %8 %int_1
+               OpStore %iteration %9
+               OpBranch %43
+         %43 = OpLabel
+         %10 = OpLoad %int %k
+         %11 = OpIAdd %int %10 %int_1
+               OpStore %k %11
+               OpBranch %41
+         %42 = OpLabel
+         %12 = OpLoad %int %iteration
+         %47 = OpSLessThan %bool %12 %int_100
+               OpSelectionMerge %48 None
+               OpBranchConditional %47 %49 %50
+         %49 = OpLabel
+         %13 = OpLoad %int %iteration
+         %14 = OpISub %int %13 %int_1
+         %51 = OpConvertSToF %float %14
+         %15 = OpLoad %int %iteration
+         %16 = OpISub %int %15 %int_1
+         %52 = OpConvertSToF %float %16
+         %53 = OpCompositeConstruct %v3float %float_1 %51 %52
+               OpReturnValue %53
+         %50 = OpLabel
+               OpBranch %54
+         %54 = OpLabel
+               OpLoopMerge %55 %56 None
+               OpBranch %57
+         %57 = OpLabel
+               OpBranch %58
+         %58 = OpLabel
+               OpLoopMerge %59 %60 None
+               OpBranch %61
+         %61 = OpLabel
+               OpReturnValue %30
+         %60 = OpLabel
+               OpBranch %58
+         %59 = OpLabel
+               OpUnreachable
+         %56 = OpLabel
+               OpBranch %54
+         %55 = OpLabel
+               OpUnreachable
+         %48 = OpLabel
+               OpUnreachable
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/do-while-false-loops/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/do-while-false-loops/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..f128d4c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/do-while-false-loops/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,45 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float3 f_() {
+  int iteration = 0;
+  int k = 0;
+  iteration = 0;
+  k = 0;
+  {
+    for(; (k < 100); k = (k + 1)) {
+      iteration = (iteration + 1);
+    }
+  }
+  if ((iteration < 100)) {
+    return float3(1.0f, float((iteration - 1)), float((iteration - 1)));
+  } else {
+    while (true) {
+      while (true) {
+        return float3(1.0f, 0.0f, 0.0f);
+      }
+      return float3(0.0f, 0.0f, 0.0f);
+    }
+    return float3(0.0f, 0.0f, 0.0f);
+  }
+  return float3(0.0f, 0.0f, 0.0f);
+}
+
+void main_1() {
+  const float3 x_35 = f_();
+  x_GLF_color = float4(x_35.x, x_35.y, x_35.z, 1.0f);
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/do-while-false-loops/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/do-while-false-loops/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..428b891
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/do-while-false-loops/0-opt.spvasm.expected.msl
@@ -0,0 +1,59 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float3 f_() {
+  int iteration = 0;
+  int k = 0;
+  iteration = 0;
+  k = 0;
+  while (true) {
+    int const x_7 = k;
+    if ((x_7 < 100)) {
+    } else {
+      break;
+    }
+    int const x_8 = iteration;
+    iteration = (x_8 + 1);
+    {
+      int const x_10 = k;
+      k = (x_10 + 1);
+    }
+  }
+  int const x_12 = iteration;
+  if ((x_12 < 100)) {
+    int const x_13 = iteration;
+    int const x_15 = iteration;
+    return float3(1.0f, float((x_13 - 1)), float((x_15 - 1)));
+  } else {
+    while (true) {
+      while (true) {
+        return float3(1.0f, 0.0f, 0.0f);
+      }
+      return float3(0.0f, 0.0f, 0.0f);
+    }
+    return float3(0.0f, 0.0f, 0.0f);
+  }
+  return float3(0.0f, 0.0f, 0.0f);
+}
+
+void main_1(thread float4* const tint_symbol_4) {
+  float3 const x_35 = f_();
+  *(tint_symbol_4) = float4(x_35.x, x_35.y, x_35.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/do-while-false-loops/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/do-while-false-loops/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..2c77aec
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/do-while-false-loops/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,137 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 79
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %f_ "f_"
+               OpName %iteration "iteration"
+               OpName %k "k"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+    %v3float = OpTypeVector %float 3
+          %8 = OpTypeFunction %v3float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %15 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+    %int_100 = OpConstant %int 100
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %56 = OpConstantComposite %v3float %float_1 %float_0 %float_0
+         %57 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+       %void = OpTypeVoid
+         %58 = OpTypeFunction %void
+   %main_out = OpTypeStruct %v4float
+         %67 = OpTypeFunction %void %main_out
+         %f_ = OpFunction %v3float None %8
+         %11 = OpLabel
+  %iteration = OpVariable %_ptr_Function_int Function %15
+          %k = OpVariable %_ptr_Function_int Function %15
+               OpStore %iteration %int_0
+               OpStore %k %int_0
+               OpBranch %18
+         %18 = OpLabel
+               OpLoopMerge %19 %20 None
+               OpBranch %21
+         %21 = OpLabel
+         %22 = OpLoad %int %k
+         %24 = OpSLessThan %bool %22 %int_100
+               OpSelectionMerge %26 None
+               OpBranchConditional %24 %27 %28
+         %27 = OpLabel
+               OpBranch %26
+         %28 = OpLabel
+               OpBranch %19
+         %26 = OpLabel
+         %29 = OpLoad %int %iteration
+         %31 = OpIAdd %int %29 %int_1
+               OpStore %iteration %31
+               OpBranch %20
+         %20 = OpLabel
+         %32 = OpLoad %int %k
+         %33 = OpIAdd %int %32 %int_1
+               OpStore %k %33
+               OpBranch %18
+         %19 = OpLabel
+         %34 = OpLoad %int %iteration
+         %35 = OpSLessThan %bool %34 %int_100
+               OpSelectionMerge %36 None
+               OpBranchConditional %35 %37 %38
+         %37 = OpLabel
+         %39 = OpLoad %int %iteration
+         %40 = OpLoad %int %iteration
+         %43 = OpISub %int %39 %int_1
+         %42 = OpConvertSToF %float %43
+         %45 = OpISub %int %40 %int_1
+         %44 = OpConvertSToF %float %45
+         %46 = OpCompositeConstruct %v3float %float_1 %42 %44
+               OpReturnValue %46
+         %38 = OpLabel
+               OpBranch %47
+         %47 = OpLabel
+               OpLoopMerge %48 %49 None
+               OpBranch %50
+         %50 = OpLabel
+               OpBranch %51
+         %51 = OpLabel
+               OpLoopMerge %52 %53 None
+               OpBranch %54
+         %54 = OpLabel
+               OpReturnValue %56
+         %53 = OpLabel
+               OpBranch %51
+         %52 = OpLabel
+               OpReturnValue %57
+         %49 = OpLabel
+               OpBranch %47
+         %48 = OpLabel
+               OpReturnValue %57
+         %36 = OpLabel
+               OpReturnValue %57
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %58
+         %61 = OpLabel
+         %62 = OpFunctionCall %v3float %f_
+         %63 = OpCompositeExtract %float %62 0
+         %64 = OpCompositeExtract %float %62 1
+         %65 = OpCompositeExtract %float %62 2
+         %66 = OpCompositeConstruct %v4float %63 %64 %65 %float_1
+               OpStore %x_GLF_color %66
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %67
+%tint_symbol = OpFunctionParameter %main_out
+         %71 = OpLabel
+         %72 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %72
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %58
+         %74 = OpLabel
+         %75 = OpFunctionCall %void %main_1
+         %77 = OpLoad %v4float %x_GLF_color
+         %78 = OpCompositeConstruct %main_out %77
+         %76 = OpFunctionCall %void %tint_symbol_2 %78
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/do-while-false-loops/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/do-while-false-loops/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..c2fa551
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/do-while-false-loops/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,54 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn f_() -> vec3<f32> {
+  var iteration : i32;
+  var k : i32;
+  iteration = 0;
+  k = 0;
+  loop {
+    let x_7 : i32 = k;
+    if ((x_7 < 100)) {
+    } else {
+      break;
+    }
+    let x_8 : i32 = iteration;
+    iteration = (x_8 + 1);
+
+    continuing {
+      let x_10 : i32 = k;
+      k = (x_10 + 1);
+    }
+  }
+  let x_12 : i32 = iteration;
+  if ((x_12 < 100)) {
+    let x_13 : i32 = iteration;
+    let x_15 : i32 = iteration;
+    return vec3<f32>(1.0, f32((x_13 - 1)), f32((x_15 - 1)));
+  } else {
+    loop {
+      loop {
+        return vec3<f32>(1.0, 0.0, 0.0);
+      }
+      return vec3<f32>(0.0, 0.0, 0.0);
+    }
+    return vec3<f32>(0.0, 0.0, 0.0);
+  }
+  return vec3<f32>(0.0, 0.0, 0.0);
+}
+
+fn main_1() {
+  let x_35 : vec3<f32> = f_();
+  x_GLF_color = vec4<f32>(x_35.x, x_35.y, x_35.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/do-while-false-loops/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/do-while-false-loops/0-opt.wgsl
new file mode 100644
index 0000000..c2fa551
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/do-while-false-loops/0-opt.wgsl
@@ -0,0 +1,54 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn f_() -> vec3<f32> {
+  var iteration : i32;
+  var k : i32;
+  iteration = 0;
+  k = 0;
+  loop {
+    let x_7 : i32 = k;
+    if ((x_7 < 100)) {
+    } else {
+      break;
+    }
+    let x_8 : i32 = iteration;
+    iteration = (x_8 + 1);
+
+    continuing {
+      let x_10 : i32 = k;
+      k = (x_10 + 1);
+    }
+  }
+  let x_12 : i32 = iteration;
+  if ((x_12 < 100)) {
+    let x_13 : i32 = iteration;
+    let x_15 : i32 = iteration;
+    return vec3<f32>(1.0, f32((x_13 - 1)), f32((x_15 - 1)));
+  } else {
+    loop {
+      loop {
+        return vec3<f32>(1.0, 0.0, 0.0);
+      }
+      return vec3<f32>(0.0, 0.0, 0.0);
+    }
+    return vec3<f32>(0.0, 0.0, 0.0);
+  }
+  return vec3<f32>(0.0, 0.0, 0.0);
+}
+
+fn main_1() {
+  let x_35 : vec3<f32> = f_();
+  x_GLF_color = vec4<f32>(x_35.x, x_35.y, x_35.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/do-while-false-loops/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/do-while-false-loops/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..f128d4c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/do-while-false-loops/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,45 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float3 f_() {
+  int iteration = 0;
+  int k = 0;
+  iteration = 0;
+  k = 0;
+  {
+    for(; (k < 100); k = (k + 1)) {
+      iteration = (iteration + 1);
+    }
+  }
+  if ((iteration < 100)) {
+    return float3(1.0f, float((iteration - 1)), float((iteration - 1)));
+  } else {
+    while (true) {
+      while (true) {
+        return float3(1.0f, 0.0f, 0.0f);
+      }
+      return float3(0.0f, 0.0f, 0.0f);
+    }
+    return float3(0.0f, 0.0f, 0.0f);
+  }
+  return float3(0.0f, 0.0f, 0.0f);
+}
+
+void main_1() {
+  const float3 x_35 = f_();
+  x_GLF_color = float4(x_35.x, x_35.y, x_35.z, 1.0f);
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/do-while-false-loops/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/do-while-false-loops/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..428b891
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/do-while-false-loops/0-opt.wgsl.expected.msl
@@ -0,0 +1,59 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float3 f_() {
+  int iteration = 0;
+  int k = 0;
+  iteration = 0;
+  k = 0;
+  while (true) {
+    int const x_7 = k;
+    if ((x_7 < 100)) {
+    } else {
+      break;
+    }
+    int const x_8 = iteration;
+    iteration = (x_8 + 1);
+    {
+      int const x_10 = k;
+      k = (x_10 + 1);
+    }
+  }
+  int const x_12 = iteration;
+  if ((x_12 < 100)) {
+    int const x_13 = iteration;
+    int const x_15 = iteration;
+    return float3(1.0f, float((x_13 - 1)), float((x_15 - 1)));
+  } else {
+    while (true) {
+      while (true) {
+        return float3(1.0f, 0.0f, 0.0f);
+      }
+      return float3(0.0f, 0.0f, 0.0f);
+    }
+    return float3(0.0f, 0.0f, 0.0f);
+  }
+  return float3(0.0f, 0.0f, 0.0f);
+}
+
+void main_1(thread float4* const tint_symbol_4) {
+  float3 const x_35 = f_();
+  *(tint_symbol_4) = float4(x_35.x, x_35.y, x_35.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/do-while-false-loops/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/do-while-false-loops/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..2c77aec
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/do-while-false-loops/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,137 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 79
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %f_ "f_"
+               OpName %iteration "iteration"
+               OpName %k "k"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+    %v3float = OpTypeVector %float 3
+          %8 = OpTypeFunction %v3float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %15 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+    %int_100 = OpConstant %int 100
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %56 = OpConstantComposite %v3float %float_1 %float_0 %float_0
+         %57 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+       %void = OpTypeVoid
+         %58 = OpTypeFunction %void
+   %main_out = OpTypeStruct %v4float
+         %67 = OpTypeFunction %void %main_out
+         %f_ = OpFunction %v3float None %8
+         %11 = OpLabel
+  %iteration = OpVariable %_ptr_Function_int Function %15
+          %k = OpVariable %_ptr_Function_int Function %15
+               OpStore %iteration %int_0
+               OpStore %k %int_0
+               OpBranch %18
+         %18 = OpLabel
+               OpLoopMerge %19 %20 None
+               OpBranch %21
+         %21 = OpLabel
+         %22 = OpLoad %int %k
+         %24 = OpSLessThan %bool %22 %int_100
+               OpSelectionMerge %26 None
+               OpBranchConditional %24 %27 %28
+         %27 = OpLabel
+               OpBranch %26
+         %28 = OpLabel
+               OpBranch %19
+         %26 = OpLabel
+         %29 = OpLoad %int %iteration
+         %31 = OpIAdd %int %29 %int_1
+               OpStore %iteration %31
+               OpBranch %20
+         %20 = OpLabel
+         %32 = OpLoad %int %k
+         %33 = OpIAdd %int %32 %int_1
+               OpStore %k %33
+               OpBranch %18
+         %19 = OpLabel
+         %34 = OpLoad %int %iteration
+         %35 = OpSLessThan %bool %34 %int_100
+               OpSelectionMerge %36 None
+               OpBranchConditional %35 %37 %38
+         %37 = OpLabel
+         %39 = OpLoad %int %iteration
+         %40 = OpLoad %int %iteration
+         %43 = OpISub %int %39 %int_1
+         %42 = OpConvertSToF %float %43
+         %45 = OpISub %int %40 %int_1
+         %44 = OpConvertSToF %float %45
+         %46 = OpCompositeConstruct %v3float %float_1 %42 %44
+               OpReturnValue %46
+         %38 = OpLabel
+               OpBranch %47
+         %47 = OpLabel
+               OpLoopMerge %48 %49 None
+               OpBranch %50
+         %50 = OpLabel
+               OpBranch %51
+         %51 = OpLabel
+               OpLoopMerge %52 %53 None
+               OpBranch %54
+         %54 = OpLabel
+               OpReturnValue %56
+         %53 = OpLabel
+               OpBranch %51
+         %52 = OpLabel
+               OpReturnValue %57
+         %49 = OpLabel
+               OpBranch %47
+         %48 = OpLabel
+               OpReturnValue %57
+         %36 = OpLabel
+               OpReturnValue %57
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %58
+         %61 = OpLabel
+         %62 = OpFunctionCall %v3float %f_
+         %63 = OpCompositeExtract %float %62 0
+         %64 = OpCompositeExtract %float %62 1
+         %65 = OpCompositeExtract %float %62 2
+         %66 = OpCompositeConstruct %v4float %63 %64 %65 %float_1
+               OpStore %x_GLF_color %66
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %67
+%tint_symbol = OpFunctionParameter %main_out
+         %71 = OpLabel
+         %72 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %72
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %58
+         %74 = OpLabel
+         %75 = OpFunctionCall %void %main_1
+         %77 = OpLoad %v4float %x_GLF_color
+         %78 = OpCompositeConstruct %main_out %77
+         %76 = OpFunctionCall %void %tint_symbol_2 %78
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/do-while-false-loops/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/do-while-false-loops/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..c2fa551
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/do-while-false-loops/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,54 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn f_() -> vec3<f32> {
+  var iteration : i32;
+  var k : i32;
+  iteration = 0;
+  k = 0;
+  loop {
+    let x_7 : i32 = k;
+    if ((x_7 < 100)) {
+    } else {
+      break;
+    }
+    let x_8 : i32 = iteration;
+    iteration = (x_8 + 1);
+
+    continuing {
+      let x_10 : i32 = k;
+      k = (x_10 + 1);
+    }
+  }
+  let x_12 : i32 = iteration;
+  if ((x_12 < 100)) {
+    let x_13 : i32 = iteration;
+    let x_15 : i32 = iteration;
+    return vec3<f32>(1.0, f32((x_13 - 1)), f32((x_15 - 1)));
+  } else {
+    loop {
+      loop {
+        return vec3<f32>(1.0, 0.0, 0.0);
+      }
+      return vec3<f32>(0.0, 0.0, 0.0);
+    }
+    return vec3<f32>(0.0, 0.0, 0.0);
+  }
+  return vec3<f32>(0.0, 0.0, 0.0);
+}
+
+fn main_1() {
+  let x_35 : vec3<f32> = f_();
+  x_GLF_color = vec4<f32>(x_35.x, x_35.y, x_35.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/do-while-if-return/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/do-while-if-return/0-opt.spvasm
new file mode 100644
index 0000000..1ead4df
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/do-while-if-return/0-opt.spvasm
@@ -0,0 +1,110 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %func_ "func("
+               OpName %loop_count "loop_count"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+         %11 = OpTypeFunction %int
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+    %int_100 = OpConstant %int 100
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %28 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %29 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+       %main = OpFunction %void None %9
+         %30 = OpLabel
+         %31 = OpFunctionCall %int %func_
+         %32 = OpIEqual %bool %31 %int_1
+               OpSelectionMerge %33 None
+               OpBranchConditional %32 %34 %35
+         %34 = OpLabel
+               OpStore %_GLF_color %28
+               OpBranch %33
+         %35 = OpLabel
+               OpStore %_GLF_color %29
+               OpBranch %33
+         %33 = OpLabel
+               OpReturn
+               OpFunctionEnd
+      %func_ = OpFunction %int None %11
+         %36 = OpLabel
+ %loop_count = OpVariable %_ptr_Function_int Function
+               OpStore %loop_count %int_0
+               OpBranch %37
+         %37 = OpLabel
+         %38 = OpPhi %int %int_0 %36 %39 %40
+               OpLoopMerge %41 %40 None
+               OpBranch %42
+         %42 = OpLabel
+         %43 = OpIAdd %int %38 %int_1
+               OpStore %loop_count %43
+               OpBranch %44
+         %44 = OpLabel
+         %45 = OpPhi %int %43 %42 %39 %46
+               OpLoopMerge %47 %46 None
+               OpBranch %48
+         %48 = OpLabel
+         %39 = OpIAdd %int %45 %int_1
+               OpStore %loop_count %39
+         %49 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %50 = OpLoad %float %49
+         %51 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %52 = OpLoad %float %51
+         %53 = OpFOrdLessThan %bool %50 %52
+               OpSelectionMerge %54 None
+               OpBranchConditional %53 %55 %54
+         %55 = OpLabel
+               OpReturnValue %int_1
+         %54 = OpLabel
+         %56 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %57 = OpLoad %float %56
+         %58 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %59 = OpLoad %float %58
+         %60 = OpFOrdLessThan %bool %57 %59
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %61
+         %62 = OpLabel
+               OpBranch %47
+         %61 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+         %63 = OpSLessThan %bool %39 %int_100
+               OpBranchConditional %63 %44 %47
+         %47 = OpLabel
+               OpBranch %40
+         %40 = OpLabel
+         %64 = OpSLessThan %bool %39 %int_100
+               OpBranchConditional %64 %37 %41
+         %41 = OpLabel
+               OpReturnValue %int_0
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/do-while-if-return/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/do-while-if-return/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..db404f6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/do-while-if-return/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,71 @@
+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);
+
+int func_() {
+  int loop_count = 0;
+  int x_38_phi = 0;
+  loop_count = 0;
+  x_38_phi = 0;
+  while (true) {
+    int x_39 = 0;
+    int x_45_phi = 0;
+    const int x_43 = (x_38_phi + 1);
+    loop_count = x_43;
+    x_45_phi = x_43;
+    while (true) {
+      x_39 = (x_45_phi + 1);
+      loop_count = x_39;
+      const float x_50 = asfloat(x_7[0].x);
+      const float x_52 = asfloat(x_7[0].y);
+      if ((x_50 < x_52)) {
+        return 1;
+      }
+      const float x_57 = asfloat(x_7[0].x);
+      const float x_59 = asfloat(x_7[0].y);
+      if ((x_57 < x_59)) {
+        break;
+      }
+      {
+        x_45_phi = x_39;
+        if ((x_39 < 100)) {
+        } else {
+          break;
+        }
+      }
+    }
+    {
+      x_38_phi = x_39;
+      if ((x_39 < 100)) {
+      } else {
+        break;
+      }
+    }
+  }
+  return 0;
+}
+
+void main_1() {
+  const int x_31 = func_();
+  if ((x_31 == 1)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/do-while-if-return/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/do-while-if-return/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..a19b54d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/do-while-if-return/0-opt.spvasm.expected.msl
@@ -0,0 +1,76 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int func_(constant buf0& x_7) {
+  int loop_count = 0;
+  int x_38_phi = 0;
+  loop_count = 0;
+  x_38_phi = 0;
+  while (true) {
+    int x_39 = 0;
+    int x_45_phi = 0;
+    int const x_38 = x_38_phi;
+    int const x_43 = (x_38 + 1);
+    loop_count = x_43;
+    x_45_phi = x_43;
+    while (true) {
+      int const x_45 = x_45_phi;
+      x_39 = (x_45 + 1);
+      loop_count = x_39;
+      float const x_50 = x_7.injectionSwitch.x;
+      float const x_52 = x_7.injectionSwitch.y;
+      if ((x_50 < x_52)) {
+        return 1;
+      }
+      float const x_57 = x_7.injectionSwitch.x;
+      float const x_59 = x_7.injectionSwitch.y;
+      if ((x_57 < x_59)) {
+        break;
+      }
+      {
+        x_45_phi = x_39;
+        if ((x_39 < 100)) {
+        } else {
+          break;
+        }
+      }
+    }
+    {
+      x_38_phi = x_39;
+      if ((x_39 < 100)) {
+      } else {
+        break;
+      }
+    }
+  }
+  return 0;
+}
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_4) {
+  int const x_31 = func_(x_7);
+  if ((x_31 == 1)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/do-while-if-return/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/do-while-if-return/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..3892134
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/do-while-if-return/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,177 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 94
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_ "func_"
+               OpName %loop_count "loop_count"
+               OpName %x_38_phi "x_38_phi"
+               OpName %x_39 "x_39"
+               OpName %x_45_phi "x_45_phi"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+        %int = OpTypeInt 32 1
+         %12 = OpTypeFunction %int
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+    %int_100 = OpConstant %int 100
+       %void = OpTypeVoid
+         %69 = OpTypeFunction %void
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %80 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %81 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+         %82 = OpTypeFunction %void %main_out
+      %func_ = OpFunction %int None %12
+         %15 = OpLabel
+ %loop_count = OpVariable %_ptr_Function_int Function %18
+   %x_38_phi = OpVariable %_ptr_Function_int Function %18
+       %x_39 = OpVariable %_ptr_Function_int Function %18
+   %x_45_phi = OpVariable %_ptr_Function_int Function %18
+               OpStore %loop_count %int_0
+               OpStore %x_38_phi %int_0
+               OpBranch %21
+         %21 = OpLabel
+               OpLoopMerge %22 %23 None
+               OpBranch %24
+         %24 = OpLabel
+         %27 = OpLoad %int %x_38_phi
+         %29 = OpIAdd %int %27 %int_1
+               OpStore %loop_count %29
+               OpStore %x_45_phi %29
+               OpBranch %30
+         %30 = OpLabel
+               OpLoopMerge %31 %32 None
+               OpBranch %33
+         %33 = OpLabel
+         %34 = OpLoad %int %x_45_phi
+         %35 = OpIAdd %int %34 %int_1
+               OpStore %x_39 %35
+         %36 = OpLoad %int %x_39
+               OpStore %loop_count %36
+         %40 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_0
+         %41 = OpLoad %float %40
+         %43 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_1
+         %44 = OpLoad %float %43
+         %45 = OpFOrdLessThan %bool %41 %44
+               OpSelectionMerge %47 None
+               OpBranchConditional %45 %48 %47
+         %48 = OpLabel
+               OpReturnValue %int_1
+         %47 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_0
+         %50 = OpLoad %float %49
+         %51 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_1
+         %52 = OpLoad %float %51
+         %53 = OpFOrdLessThan %bool %50 %52
+               OpSelectionMerge %54 None
+               OpBranchConditional %53 %55 %54
+         %55 = OpLabel
+               OpBranch %31
+         %54 = OpLabel
+               OpBranch %32
+         %32 = OpLabel
+         %56 = OpLoad %int %x_39
+               OpStore %x_45_phi %56
+         %57 = OpLoad %int %x_39
+         %59 = OpSLessThan %bool %57 %int_100
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %62
+         %61 = OpLabel
+               OpBranch %60
+         %62 = OpLabel
+               OpBranch %31
+         %60 = OpLabel
+               OpBranch %30
+         %31 = OpLabel
+               OpBranch %23
+         %23 = OpLabel
+         %63 = OpLoad %int %x_39
+               OpStore %x_38_phi %63
+         %64 = OpLoad %int %x_39
+         %65 = OpSLessThan %bool %64 %int_100
+               OpSelectionMerge %66 None
+               OpBranchConditional %65 %67 %68
+         %67 = OpLabel
+               OpBranch %66
+         %68 = OpLabel
+               OpBranch %22
+         %66 = OpLabel
+               OpBranch %21
+         %22 = OpLabel
+               OpReturnValue %int_0
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %69
+         %72 = OpLabel
+         %73 = OpFunctionCall %int %func_
+         %74 = OpIEqual %bool %73 %int_1
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %77
+         %76 = OpLabel
+               OpStore %x_GLF_color %80
+               OpBranch %75
+         %77 = OpLabel
+               OpStore %x_GLF_color %81
+               OpBranch %75
+         %75 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %82
+%tint_symbol = OpFunctionParameter %main_out
+         %86 = OpLabel
+         %87 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %87
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %69
+         %89 = OpLabel
+         %90 = OpFunctionCall %void %main_1
+         %92 = OpLoad %v4float %x_GLF_color
+         %93 = OpCompositeConstruct %main_out %92
+         %91 = OpFunctionCall %void %tint_symbol_2 %93
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 23[%23] is not post dominated by the back-edge block 66[%66]
+  %66 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/do-while-if-return/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/do-while-if-return/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..43fb691
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/do-while-if-return/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,76 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> i32 {
+  var loop_count : i32;
+  var x_38_phi : i32;
+  loop_count = 0;
+  x_38_phi = 0;
+  loop {
+    var x_39 : i32;
+    var x_45_phi : i32;
+    let x_38 : i32 = x_38_phi;
+    let x_43 : i32 = (x_38 + 1);
+    loop_count = x_43;
+    x_45_phi = x_43;
+    loop {
+      let x_45 : i32 = x_45_phi;
+      x_39 = (x_45 + 1);
+      loop_count = x_39;
+      let x_50 : f32 = x_7.injectionSwitch.x;
+      let x_52 : f32 = x_7.injectionSwitch.y;
+      if ((x_50 < x_52)) {
+        return 1;
+      }
+      let x_57 : f32 = x_7.injectionSwitch.x;
+      let x_59 : f32 = x_7.injectionSwitch.y;
+      if ((x_57 < x_59)) {
+        break;
+      }
+
+      continuing {
+        x_45_phi = x_39;
+        if ((x_39 < 100)) {
+        } else {
+          break;
+        }
+      }
+    }
+
+    continuing {
+      x_38_phi = x_39;
+      if ((x_39 < 100)) {
+      } else {
+        break;
+      }
+    }
+  }
+  return 0;
+}
+
+fn main_1() {
+  let x_31 : i32 = func_();
+  if ((x_31 == 1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/do-while-if-return/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/do-while-if-return/0-opt.wgsl
new file mode 100644
index 0000000..43fb691
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/do-while-if-return/0-opt.wgsl
@@ -0,0 +1,76 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> i32 {
+  var loop_count : i32;
+  var x_38_phi : i32;
+  loop_count = 0;
+  x_38_phi = 0;
+  loop {
+    var x_39 : i32;
+    var x_45_phi : i32;
+    let x_38 : i32 = x_38_phi;
+    let x_43 : i32 = (x_38 + 1);
+    loop_count = x_43;
+    x_45_phi = x_43;
+    loop {
+      let x_45 : i32 = x_45_phi;
+      x_39 = (x_45 + 1);
+      loop_count = x_39;
+      let x_50 : f32 = x_7.injectionSwitch.x;
+      let x_52 : f32 = x_7.injectionSwitch.y;
+      if ((x_50 < x_52)) {
+        return 1;
+      }
+      let x_57 : f32 = x_7.injectionSwitch.x;
+      let x_59 : f32 = x_7.injectionSwitch.y;
+      if ((x_57 < x_59)) {
+        break;
+      }
+
+      continuing {
+        x_45_phi = x_39;
+        if ((x_39 < 100)) {
+        } else {
+          break;
+        }
+      }
+    }
+
+    continuing {
+      x_38_phi = x_39;
+      if ((x_39 < 100)) {
+      } else {
+        break;
+      }
+    }
+  }
+  return 0;
+}
+
+fn main_1() {
+  let x_31 : i32 = func_();
+  if ((x_31 == 1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/do-while-if-return/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/do-while-if-return/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..db404f6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/do-while-if-return/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,71 @@
+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);
+
+int func_() {
+  int loop_count = 0;
+  int x_38_phi = 0;
+  loop_count = 0;
+  x_38_phi = 0;
+  while (true) {
+    int x_39 = 0;
+    int x_45_phi = 0;
+    const int x_43 = (x_38_phi + 1);
+    loop_count = x_43;
+    x_45_phi = x_43;
+    while (true) {
+      x_39 = (x_45_phi + 1);
+      loop_count = x_39;
+      const float x_50 = asfloat(x_7[0].x);
+      const float x_52 = asfloat(x_7[0].y);
+      if ((x_50 < x_52)) {
+        return 1;
+      }
+      const float x_57 = asfloat(x_7[0].x);
+      const float x_59 = asfloat(x_7[0].y);
+      if ((x_57 < x_59)) {
+        break;
+      }
+      {
+        x_45_phi = x_39;
+        if ((x_39 < 100)) {
+        } else {
+          break;
+        }
+      }
+    }
+    {
+      x_38_phi = x_39;
+      if ((x_39 < 100)) {
+      } else {
+        break;
+      }
+    }
+  }
+  return 0;
+}
+
+void main_1() {
+  const int x_31 = func_();
+  if ((x_31 == 1)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/do-while-if-return/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/do-while-if-return/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..a19b54d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/do-while-if-return/0-opt.wgsl.expected.msl
@@ -0,0 +1,76 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int func_(constant buf0& x_7) {
+  int loop_count = 0;
+  int x_38_phi = 0;
+  loop_count = 0;
+  x_38_phi = 0;
+  while (true) {
+    int x_39 = 0;
+    int x_45_phi = 0;
+    int const x_38 = x_38_phi;
+    int const x_43 = (x_38 + 1);
+    loop_count = x_43;
+    x_45_phi = x_43;
+    while (true) {
+      int const x_45 = x_45_phi;
+      x_39 = (x_45 + 1);
+      loop_count = x_39;
+      float const x_50 = x_7.injectionSwitch.x;
+      float const x_52 = x_7.injectionSwitch.y;
+      if ((x_50 < x_52)) {
+        return 1;
+      }
+      float const x_57 = x_7.injectionSwitch.x;
+      float const x_59 = x_7.injectionSwitch.y;
+      if ((x_57 < x_59)) {
+        break;
+      }
+      {
+        x_45_phi = x_39;
+        if ((x_39 < 100)) {
+        } else {
+          break;
+        }
+      }
+    }
+    {
+      x_38_phi = x_39;
+      if ((x_39 < 100)) {
+      } else {
+        break;
+      }
+    }
+  }
+  return 0;
+}
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_4) {
+  int const x_31 = func_(x_7);
+  if ((x_31 == 1)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/do-while-if-return/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/do-while-if-return/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..3892134
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/do-while-if-return/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,177 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 94
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_ "func_"
+               OpName %loop_count "loop_count"
+               OpName %x_38_phi "x_38_phi"
+               OpName %x_39 "x_39"
+               OpName %x_45_phi "x_45_phi"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+        %int = OpTypeInt 32 1
+         %12 = OpTypeFunction %int
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+    %int_100 = OpConstant %int 100
+       %void = OpTypeVoid
+         %69 = OpTypeFunction %void
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %80 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %81 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+         %82 = OpTypeFunction %void %main_out
+      %func_ = OpFunction %int None %12
+         %15 = OpLabel
+ %loop_count = OpVariable %_ptr_Function_int Function %18
+   %x_38_phi = OpVariable %_ptr_Function_int Function %18
+       %x_39 = OpVariable %_ptr_Function_int Function %18
+   %x_45_phi = OpVariable %_ptr_Function_int Function %18
+               OpStore %loop_count %int_0
+               OpStore %x_38_phi %int_0
+               OpBranch %21
+         %21 = OpLabel
+               OpLoopMerge %22 %23 None
+               OpBranch %24
+         %24 = OpLabel
+         %27 = OpLoad %int %x_38_phi
+         %29 = OpIAdd %int %27 %int_1
+               OpStore %loop_count %29
+               OpStore %x_45_phi %29
+               OpBranch %30
+         %30 = OpLabel
+               OpLoopMerge %31 %32 None
+               OpBranch %33
+         %33 = OpLabel
+         %34 = OpLoad %int %x_45_phi
+         %35 = OpIAdd %int %34 %int_1
+               OpStore %x_39 %35
+         %36 = OpLoad %int %x_39
+               OpStore %loop_count %36
+         %40 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_0
+         %41 = OpLoad %float %40
+         %43 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_1
+         %44 = OpLoad %float %43
+         %45 = OpFOrdLessThan %bool %41 %44
+               OpSelectionMerge %47 None
+               OpBranchConditional %45 %48 %47
+         %48 = OpLabel
+               OpReturnValue %int_1
+         %47 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_0
+         %50 = OpLoad %float %49
+         %51 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_1
+         %52 = OpLoad %float %51
+         %53 = OpFOrdLessThan %bool %50 %52
+               OpSelectionMerge %54 None
+               OpBranchConditional %53 %55 %54
+         %55 = OpLabel
+               OpBranch %31
+         %54 = OpLabel
+               OpBranch %32
+         %32 = OpLabel
+         %56 = OpLoad %int %x_39
+               OpStore %x_45_phi %56
+         %57 = OpLoad %int %x_39
+         %59 = OpSLessThan %bool %57 %int_100
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %62
+         %61 = OpLabel
+               OpBranch %60
+         %62 = OpLabel
+               OpBranch %31
+         %60 = OpLabel
+               OpBranch %30
+         %31 = OpLabel
+               OpBranch %23
+         %23 = OpLabel
+         %63 = OpLoad %int %x_39
+               OpStore %x_38_phi %63
+         %64 = OpLoad %int %x_39
+         %65 = OpSLessThan %bool %64 %int_100
+               OpSelectionMerge %66 None
+               OpBranchConditional %65 %67 %68
+         %67 = OpLabel
+               OpBranch %66
+         %68 = OpLabel
+               OpBranch %22
+         %66 = OpLabel
+               OpBranch %21
+         %22 = OpLabel
+               OpReturnValue %int_0
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %69
+         %72 = OpLabel
+         %73 = OpFunctionCall %int %func_
+         %74 = OpIEqual %bool %73 %int_1
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %77
+         %76 = OpLabel
+               OpStore %x_GLF_color %80
+               OpBranch %75
+         %77 = OpLabel
+               OpStore %x_GLF_color %81
+               OpBranch %75
+         %75 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %82
+%tint_symbol = OpFunctionParameter %main_out
+         %86 = OpLabel
+         %87 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %87
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %69
+         %89 = OpLabel
+         %90 = OpFunctionCall %void %main_1
+         %92 = OpLoad %v4float %x_GLF_color
+         %93 = OpCompositeConstruct %main_out %92
+         %91 = OpFunctionCall %void %tint_symbol_2 %93
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 23[%23] is not post dominated by the back-edge block 66[%66]
+  %66 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/do-while-if-return/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/do-while-if-return/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..43fb691
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/do-while-if-return/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,76 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> i32 {
+  var loop_count : i32;
+  var x_38_phi : i32;
+  loop_count = 0;
+  x_38_phi = 0;
+  loop {
+    var x_39 : i32;
+    var x_45_phi : i32;
+    let x_38 : i32 = x_38_phi;
+    let x_43 : i32 = (x_38 + 1);
+    loop_count = x_43;
+    x_45_phi = x_43;
+    loop {
+      let x_45 : i32 = x_45_phi;
+      x_39 = (x_45 + 1);
+      loop_count = x_39;
+      let x_50 : f32 = x_7.injectionSwitch.x;
+      let x_52 : f32 = x_7.injectionSwitch.y;
+      if ((x_50 < x_52)) {
+        return 1;
+      }
+      let x_57 : f32 = x_7.injectionSwitch.x;
+      let x_59 : f32 = x_7.injectionSwitch.y;
+      if ((x_57 < x_59)) {
+        break;
+      }
+
+      continuing {
+        x_45_phi = x_39;
+        if ((x_39 < 100)) {
+        } else {
+          break;
+        }
+      }
+    }
+
+    continuing {
+      x_38_phi = x_39;
+      if ((x_39 < 100)) {
+      } else {
+        break;
+      }
+    }
+  }
+  return 0;
+}
+
+fn main_1() {
+  let x_31 : i32 = func_();
+  if ((x_31 == 1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/do-while-loop-in-conditionals/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/do-while-loop-in-conditionals/0-opt.spvasm
new file mode 100644
index 0000000..ad3300e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/do-while-loop-in-conditionals/0-opt.spvasm
@@ -0,0 +1,58 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color %gl_FragCoord
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+       %void = OpTypeVoid
+          %6 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %12 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+       %main = OpFunction %void None %6
+         %19 = OpLabel
+               OpStore %_GLF_color %12
+               OpSelectionMerge %20 None
+               OpBranchConditional %true %21 %20
+         %21 = OpLabel
+         %22 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %23 = OpLoad %float %22
+         %24 = OpFOrdLessThan %bool %23 %float_0
+               OpSelectionMerge %25 None
+               OpBranchConditional %24 %26 %25
+         %26 = OpLabel
+               OpBranch %27
+         %27 = OpLabel
+               OpLoopMerge %28 %29 None
+               OpBranch %30
+         %30 = OpLabel
+               OpStore %_GLF_color %12
+               OpBranch %29
+         %29 = OpLabel
+         %31 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %32 = OpLoad %float %31
+         %33 = OpFOrdLessThan %bool %32 %float_0
+               OpBranchConditional %33 %27 %28
+         %28 = OpLabel
+               OpBranch %25
+         %25 = OpLabel
+               OpBranch %20
+         %20 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/do-while-loop-in-conditionals/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/do-while-loop-in-conditionals/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..d23c22a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/do-while-loop-in-conditionals/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,41 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  if (true) {
+    const float x_23 = gl_FragCoord.x;
+    if ((x_23 < 0.0f)) {
+      while (true) {
+        x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+        {
+          const float x_32 = gl_FragCoord.x;
+          if ((x_32 < 0.0f)) {
+          } else {
+            break;
+          }
+        }
+      }
+    }
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/do-while-loop-in-conditionals/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/do-while-loop-in-conditionals/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..84c6e5e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/do-while-loop-in-conditionals/0-opt.spvasm.expected.msl
@@ -0,0 +1,40 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  if (true) {
+    float const x_23 = (*(tint_symbol_6)).x;
+    if ((x_23 < 0.0f)) {
+      while (true) {
+        *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+        {
+          float const x_32 = (*(tint_symbol_6)).x;
+          if ((x_32 < 0.0f)) {
+          } else {
+            break;
+          }
+        }
+      }
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(&(tint_symbol_8), &(tint_symbol_7));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/do-while-loop-in-conditionals/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/do-while-loop-in-conditionals/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..1de795f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/do-while-loop-in-conditionals/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,104 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 53
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %17 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+   %main_out = OpTypeStruct %v4float
+         %40 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+               OpStore %x_GLF_color %17
+               OpSelectionMerge %20 None
+               OpBranchConditional %true %21 %20
+         %21 = OpLabel
+         %25 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %26 = OpLoad %float %25
+         %27 = OpFOrdLessThan %bool %26 %float_0
+               OpSelectionMerge %28 None
+               OpBranchConditional %27 %29 %28
+         %29 = OpLabel
+               OpBranch %30
+         %30 = OpLabel
+               OpLoopMerge %31 %32 None
+               OpBranch %33
+         %33 = OpLabel
+               OpStore %x_GLF_color %17
+               OpBranch %32
+         %32 = OpLabel
+         %34 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %35 = OpLoad %float %34
+         %36 = OpFOrdLessThan %bool %35 %float_0
+               OpSelectionMerge %37 None
+               OpBranchConditional %36 %38 %39
+         %38 = OpLabel
+               OpBranch %37
+         %39 = OpLabel
+               OpBranch %31
+         %37 = OpLabel
+               OpBranch %30
+         %31 = OpLabel
+               OpBranch %28
+         %28 = OpLabel
+               OpBranch %20
+         %20 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %40
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %44 = OpLabel
+         %45 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %45
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %47 = OpLabel
+         %48 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %48
+         %49 = OpFunctionCall %void %main_1
+         %51 = OpLoad %v4float %x_GLF_color
+         %52 = OpCompositeConstruct %main_out %51
+         %50 = OpFunctionCall %void %tint_symbol_3 %52
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 32[%32] is not post dominated by the back-edge block 37[%37]
+  %37 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/do-while-loop-in-conditionals/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/do-while-loop-in-conditionals/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..2c077a3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/do-while-loop-in-conditionals/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,36 @@
+var<private> x_GLF_color : vec4<f32>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  if (true) {
+    let x_23 : f32 = gl_FragCoord.x;
+    if ((x_23 < 0.0)) {
+      loop {
+        x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+
+        continuing {
+          let x_32 : f32 = gl_FragCoord.x;
+          if ((x_32 < 0.0)) {
+          } else {
+            break;
+          }
+        }
+      }
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/do-while-loop-in-conditionals/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/do-while-loop-in-conditionals/0-opt.wgsl
new file mode 100644
index 0000000..2c077a3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/do-while-loop-in-conditionals/0-opt.wgsl
@@ -0,0 +1,36 @@
+var<private> x_GLF_color : vec4<f32>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  if (true) {
+    let x_23 : f32 = gl_FragCoord.x;
+    if ((x_23 < 0.0)) {
+      loop {
+        x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+
+        continuing {
+          let x_32 : f32 = gl_FragCoord.x;
+          if ((x_32 < 0.0)) {
+          } else {
+            break;
+          }
+        }
+      }
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/do-while-loop-in-conditionals/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/do-while-loop-in-conditionals/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..d23c22a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/do-while-loop-in-conditionals/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,41 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  if (true) {
+    const float x_23 = gl_FragCoord.x;
+    if ((x_23 < 0.0f)) {
+      while (true) {
+        x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+        {
+          const float x_32 = gl_FragCoord.x;
+          if ((x_32 < 0.0f)) {
+          } else {
+            break;
+          }
+        }
+      }
+    }
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/do-while-loop-in-conditionals/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/do-while-loop-in-conditionals/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..84c6e5e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/do-while-loop-in-conditionals/0-opt.wgsl.expected.msl
@@ -0,0 +1,40 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  if (true) {
+    float const x_23 = (*(tint_symbol_6)).x;
+    if ((x_23 < 0.0f)) {
+      while (true) {
+        *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+        {
+          float const x_32 = (*(tint_symbol_6)).x;
+          if ((x_32 < 0.0f)) {
+          } else {
+            break;
+          }
+        }
+      }
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(&(tint_symbol_8), &(tint_symbol_7));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/do-while-loop-in-conditionals/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/do-while-loop-in-conditionals/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..1de795f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/do-while-loop-in-conditionals/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,104 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 53
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %17 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+   %main_out = OpTypeStruct %v4float
+         %40 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+               OpStore %x_GLF_color %17
+               OpSelectionMerge %20 None
+               OpBranchConditional %true %21 %20
+         %21 = OpLabel
+         %25 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %26 = OpLoad %float %25
+         %27 = OpFOrdLessThan %bool %26 %float_0
+               OpSelectionMerge %28 None
+               OpBranchConditional %27 %29 %28
+         %29 = OpLabel
+               OpBranch %30
+         %30 = OpLabel
+               OpLoopMerge %31 %32 None
+               OpBranch %33
+         %33 = OpLabel
+               OpStore %x_GLF_color %17
+               OpBranch %32
+         %32 = OpLabel
+         %34 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %35 = OpLoad %float %34
+         %36 = OpFOrdLessThan %bool %35 %float_0
+               OpSelectionMerge %37 None
+               OpBranchConditional %36 %38 %39
+         %38 = OpLabel
+               OpBranch %37
+         %39 = OpLabel
+               OpBranch %31
+         %37 = OpLabel
+               OpBranch %30
+         %31 = OpLabel
+               OpBranch %28
+         %28 = OpLabel
+               OpBranch %20
+         %20 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %40
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %44 = OpLabel
+         %45 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %45
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %47 = OpLabel
+         %48 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %48
+         %49 = OpFunctionCall %void %main_1
+         %51 = OpLoad %v4float %x_GLF_color
+         %52 = OpCompositeConstruct %main_out %51
+         %50 = OpFunctionCall %void %tint_symbol_3 %52
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 32[%32] is not post dominated by the back-edge block 37[%37]
+  %37 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/do-while-loop-in-conditionals/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/do-while-loop-in-conditionals/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..2c077a3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/do-while-loop-in-conditionals/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,36 @@
+var<private> x_GLF_color : vec4<f32>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  if (true) {
+    let x_23 : f32 = gl_FragCoord.x;
+    if ((x_23 < 0.0)) {
+      loop {
+        x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+
+        continuing {
+          let x_32 : f32 = gl_FragCoord.x;
+          if ((x_32 < 0.0)) {
+          } else {
+            break;
+          }
+        }
+      }
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/early-return-and-barrier/0.spvasm b/test/vk-gl-cts/graphicsfuzz/early-return-and-barrier/0.spvasm
new file mode 100644
index 0000000..bd48a95
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/early-return-and-barrier/0.spvasm
@@ -0,0 +1,78 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main"
+               OpExecutionMode %main LocalSize 1 1 1
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %theSSBO "theSSBO"
+               OpMemberName %theSSBO 0 "out_data"
+               OpName %_ ""
+               OpMemberDecorate %theSSBO 0 Offset 0
+               OpDecorate %theSSBO BufferBlock
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+       %void = OpTypeVoid
+          %6 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+    %float_1 = OpConstant %float 1
+       %uint = OpTypeInt 32 0
+       %bool = OpTypeBool
+     %uint_2 = OpConstant %uint 2
+   %uint_264 = OpConstant %uint 264
+        %int = OpTypeInt 32 1
+    %theSSBO = OpTypeStruct %int
+%_ptr_Uniform_theSSBO = OpTypePointer Uniform %theSSBO
+          %_ = OpVariable %_ptr_Uniform_theSSBO Uniform
+      %int_0 = OpConstant %int 0
+     %int_42 = OpConstant %int 42
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_1 = OpConstant %int 1
+%mat2v2float = OpTypeMatrix %v2float 2
+    %float_0 = OpConstant %float 0
+         %22 = OpConstantComposite %v2float %float_1 %float_0
+         %23 = OpConstantComposite %v2float %float_0 %float_1
+         %24 = OpConstantComposite %mat2v2float %22 %23
+         %25 = OpConstantComposite %v2float %float_1 %float_1
+         %26 = OpUndef %mat2v2float
+       %main = OpFunction %void None %6
+         %27 = OpLabel
+         %28 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+               OpStore %28 %int_42
+               OpBranch %29
+         %29 = OpLabel
+         %30 = OpPhi %mat2v2float %26 %27 %24 %31
+         %32 = OpPhi %int %int_1 %27 %33 %31
+         %34 = OpSGreaterThan %bool %32 %int_0
+               OpLoopMerge %35 %31 None
+               OpBranchConditional %34 %31 %35
+         %31 = OpLabel
+         %33 = OpISub %int %32 %int_1
+               OpBranch %29
+         %35 = OpLabel
+         %36 = OpCompositeExtract %v2float %30 0
+         %37 = OpFSub %v2float %36 %22
+         %38 = OpCompositeExtract %v2float %30 1
+         %39 = OpFSub %v2float %38 %23
+         %40 = OpCompositeConstruct %mat2v2float %37 %39
+         %41 = OpVectorTimesMatrix %v2float %25 %40
+               OpBranch %42
+         %42 = OpLabel
+               OpLoopMerge %43 %44 None
+               OpBranch %45
+         %45 = OpLabel
+         %46 = OpCompositeExtract %float %41 0
+         %47 = OpFOrdLessThan %bool %float_1 %46
+               OpSelectionMerge %48 None
+               OpBranchConditional %47 %49 %48
+         %49 = OpLabel
+               OpBranch %43
+         %48 = OpLabel
+               OpControlBarrier %uint_2 %uint_2 %uint_264
+               OpBranch %43
+         %44 = OpLabel
+               OpBranch %42
+         %43 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/early-return-and-barrier/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/early-return-and-barrier/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..7909f45
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/early-return-and-barrier/0.spvasm.expected.hlsl
@@ -0,0 +1,39 @@
+RWByteAddressBuffer x_4 : register(u0, space0);
+
+void main_1() {
+  float2x2 x_30 = float2x2(0.0f, 0.0f, 0.0f, 0.0f);
+  float2x2 x_30_phi = float2x2(0.0f, 0.0f, 0.0f, 0.0f);
+  int x_32_phi = 0;
+  x_4.Store(0u, asuint(42));
+  x_30_phi = float2x2(float2(0.0f, 0.0f), float2(0.0f, 0.0f));
+  x_32_phi = 1;
+  while (true) {
+    int x_33 = 0;
+    x_30 = x_30_phi;
+    const int x_32 = x_32_phi;
+    if ((x_32 > 0)) {
+    } else {
+      break;
+    }
+    {
+      x_33 = (x_32 - 1);
+      x_30_phi = float2x2(float2(1.0f, 0.0f), float2(0.0f, 1.0f));
+      x_32_phi = x_33;
+    }
+  }
+  const float2 x_41 = mul(float2x2((x_30[0u] - float2(1.0f, 0.0f)), (x_30[1u] - float2(0.0f, 1.0f))), float2(1.0f, 1.0f));
+  while (true) {
+    if ((1.0f < x_41.x)) {
+      break;
+    }
+    GroupMemoryBarrierWithGroupSync();
+    break;
+  }
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void main() {
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/early-return-and-barrier/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/early-return-and-barrier/0.spvasm.expected.msl
new file mode 100644
index 0000000..d4c94f7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/early-return-and-barrier/0.spvasm.expected.msl
@@ -0,0 +1,44 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct theSSBO {
+  /* 0x0000 */ int out_data;
+};
+
+void main_1(device theSSBO& x_4) {
+  float2x2 x_30 = float2x2(0.0f);
+  float2x2 x_30_phi = float2x2(0.0f);
+  int x_32_phi = 0;
+  x_4.out_data = 42;
+  x_30_phi = float2x2(float2(0.0f, 0.0f), float2(0.0f, 0.0f));
+  x_32_phi = 1;
+  while (true) {
+    int x_33 = 0;
+    x_30 = x_30_phi;
+    int const x_32 = x_32_phi;
+    if ((x_32 > 0)) {
+    } else {
+      break;
+    }
+    {
+      x_33 = (x_32 - 1);
+      x_30_phi = float2x2(float2(1.0f, 0.0f), float2(0.0f, 1.0f));
+      x_32_phi = x_33;
+    }
+  }
+  float2 const x_41 = (float2(1.0f, 1.0f) * float2x2((x_30[0u] - float2(1.0f, 0.0f)), (x_30[1u] - float2(0.0f, 1.0f))));
+  while (true) {
+    if ((1.0f < x_41.x)) {
+      break;
+    }
+    threadgroup_barrier(mem_flags::mem_threadgroup);
+    break;
+  }
+  return;
+}
+
+kernel void tint_symbol(device theSSBO& x_4 [[buffer(0)]]) {
+  main_1(x_4);
+  return;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/early-return-and-barrier/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/early-return-and-barrier/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..a2f71c5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/early-return-and-barrier/0.spvasm.expected.spvasm
@@ -0,0 +1,121 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 72
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main"
+               OpExecutionMode %main LocalSize 1 1 1
+               OpName %theSSBO "theSSBO"
+               OpMemberName %theSSBO 0 "out_data"
+               OpName %x_4 "x_4"
+               OpName %main_1 "main_1"
+               OpName %x_30 "x_30"
+               OpName %x_30_phi "x_30_phi"
+               OpName %x_32_phi "x_32_phi"
+               OpName %x_33 "x_33"
+               OpName %main "main"
+               OpDecorate %theSSBO Block
+               OpMemberDecorate %theSSBO 0 Offset 0
+               OpDecorate %x_4 DescriptorSet 0
+               OpDecorate %x_4 Binding 0
+        %int = OpTypeInt 32 1
+    %theSSBO = OpTypeStruct %int
+%_ptr_StorageBuffer_theSSBO = OpTypePointer StorageBuffer %theSSBO
+        %x_4 = OpVariable %_ptr_StorageBuffer_theSSBO StorageBuffer
+       %void = OpTypeVoid
+          %5 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%mat2v2float = OpTypeMatrix %v2float 2
+%_ptr_Function_mat2v2float = OpTypePointer Function %mat2v2float
+         %14 = OpConstantNull %mat2v2float
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+     %int_42 = OpConstant %int 42
+    %float_0 = OpConstant %float 0
+         %25 = OpConstantComposite %v2float %float_0 %float_0
+         %26 = OpConstantComposite %mat2v2float %25 %25
+      %int_1 = OpConstant %int 1
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+         %43 = OpConstantComposite %v2float %float_1 %float_0
+         %44 = OpConstantComposite %v2float %float_0 %float_1
+         %45 = OpConstantComposite %mat2v2float %43 %44
+         %47 = OpConstantComposite %v2float %float_1 %float_1
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+   %uint_264 = OpConstant %uint 264
+     %main_1 = OpFunction %void None %5
+          %8 = OpLabel
+       %x_30 = OpVariable %_ptr_Function_mat2v2float Function %14
+   %x_30_phi = OpVariable %_ptr_Function_mat2v2float Function %14
+   %x_32_phi = OpVariable %_ptr_Function_int Function %18
+       %x_33 = OpVariable %_ptr_Function_int Function %18
+         %22 = OpAccessChain %_ptr_StorageBuffer_int %x_4 %uint_0
+               OpStore %22 %int_42
+               OpStore %x_30_phi %26
+               OpStore %x_32_phi %int_1
+               OpBranch %28
+         %28 = OpLabel
+               OpLoopMerge %29 %30 None
+               OpBranch %31
+         %31 = OpLabel
+         %33 = OpLoad %mat2v2float %x_30_phi
+               OpStore %x_30 %33
+         %34 = OpLoad %int %x_32_phi
+         %36 = OpSGreaterThan %bool %34 %int_0
+               OpSelectionMerge %38 None
+               OpBranchConditional %36 %39 %40
+         %39 = OpLabel
+               OpBranch %38
+         %40 = OpLabel
+               OpBranch %29
+         %38 = OpLabel
+               OpBranch %30
+         %30 = OpLabel
+         %41 = OpISub %int %34 %int_1
+               OpStore %x_33 %41
+               OpStore %x_30_phi %45
+         %46 = OpLoad %int %x_33
+               OpStore %x_32_phi %46
+               OpBranch %28
+         %29 = OpLabel
+         %49 = OpAccessChain %_ptr_Function_v2float %x_30 %uint_0
+         %50 = OpLoad %v2float %49
+         %51 = OpFSub %v2float %50 %43
+         %53 = OpAccessChain %_ptr_Function_v2float %x_30 %uint_1
+         %54 = OpLoad %v2float %53
+         %55 = OpFSub %v2float %54 %44
+         %56 = OpCompositeConstruct %mat2v2float %51 %55
+         %57 = OpVectorTimesMatrix %v2float %47 %56
+               OpBranch %58
+         %58 = OpLabel
+               OpLoopMerge %59 %60 None
+               OpBranch %61
+         %61 = OpLabel
+         %62 = OpCompositeExtract %float %57 0
+         %63 = OpFOrdLessThan %bool %float_1 %62
+               OpSelectionMerge %64 None
+               OpBranchConditional %63 %65 %64
+         %65 = OpLabel
+               OpBranch %59
+         %64 = OpLabel
+               OpControlBarrier %uint_2 %uint_2 %uint_264
+               OpBranch %59
+         %60 = OpLabel
+               OpBranch %58
+         %59 = OpLabel
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %5
+         %70 = OpLabel
+         %71 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/early-return-and-barrier/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/early-return-and-barrier/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..7eaea5b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/early-return-and-barrier/0.spvasm.expected.wgsl
@@ -0,0 +1,44 @@
+[[block]]
+struct theSSBO {
+  out_data : i32;
+};
+
+[[group(0), binding(0)]] var<storage, read_write> x_4 : theSSBO;
+
+fn main_1() {
+  var x_30 : mat2x2<f32>;
+  var x_30_phi : mat2x2<f32>;
+  var x_32_phi : i32;
+  x_4.out_data = 42;
+  x_30_phi = mat2x2<f32>(vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0));
+  x_32_phi = 1;
+  loop {
+    var x_33 : i32;
+    x_30 = x_30_phi;
+    let x_32 : i32 = x_32_phi;
+    if ((x_32 > 0)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_33 = (x_32 - 1);
+      x_30_phi = mat2x2<f32>(vec2<f32>(1.0, 0.0), vec2<f32>(0.0, 1.0));
+      x_32_phi = x_33;
+    }
+  }
+  let x_41 : vec2<f32> = (vec2<f32>(1.0, 1.0) * mat2x2<f32>((x_30[0u] - vec2<f32>(1.0, 0.0)), (x_30[1u] - vec2<f32>(0.0, 1.0))));
+  loop {
+    if ((1.0 < x_41.x)) {
+      break;
+    }
+    workgroupBarrier();
+    break;
+  }
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main() {
+  main_1();
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/early-return-and-barrier/0.wgsl b/test/vk-gl-cts/graphicsfuzz/early-return-and-barrier/0.wgsl
new file mode 100644
index 0000000..7eaea5b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/early-return-and-barrier/0.wgsl
@@ -0,0 +1,44 @@
+[[block]]
+struct theSSBO {
+  out_data : i32;
+};
+
+[[group(0), binding(0)]] var<storage, read_write> x_4 : theSSBO;
+
+fn main_1() {
+  var x_30 : mat2x2<f32>;
+  var x_30_phi : mat2x2<f32>;
+  var x_32_phi : i32;
+  x_4.out_data = 42;
+  x_30_phi = mat2x2<f32>(vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0));
+  x_32_phi = 1;
+  loop {
+    var x_33 : i32;
+    x_30 = x_30_phi;
+    let x_32 : i32 = x_32_phi;
+    if ((x_32 > 0)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_33 = (x_32 - 1);
+      x_30_phi = mat2x2<f32>(vec2<f32>(1.0, 0.0), vec2<f32>(0.0, 1.0));
+      x_32_phi = x_33;
+    }
+  }
+  let x_41 : vec2<f32> = (vec2<f32>(1.0, 1.0) * mat2x2<f32>((x_30[0u] - vec2<f32>(1.0, 0.0)), (x_30[1u] - vec2<f32>(0.0, 1.0))));
+  loop {
+    if ((1.0 < x_41.x)) {
+      break;
+    }
+    workgroupBarrier();
+    break;
+  }
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main() {
+  main_1();
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/early-return-and-barrier/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/early-return-and-barrier/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..7909f45
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/early-return-and-barrier/0.wgsl.expected.hlsl
@@ -0,0 +1,39 @@
+RWByteAddressBuffer x_4 : register(u0, space0);
+
+void main_1() {
+  float2x2 x_30 = float2x2(0.0f, 0.0f, 0.0f, 0.0f);
+  float2x2 x_30_phi = float2x2(0.0f, 0.0f, 0.0f, 0.0f);
+  int x_32_phi = 0;
+  x_4.Store(0u, asuint(42));
+  x_30_phi = float2x2(float2(0.0f, 0.0f), float2(0.0f, 0.0f));
+  x_32_phi = 1;
+  while (true) {
+    int x_33 = 0;
+    x_30 = x_30_phi;
+    const int x_32 = x_32_phi;
+    if ((x_32 > 0)) {
+    } else {
+      break;
+    }
+    {
+      x_33 = (x_32 - 1);
+      x_30_phi = float2x2(float2(1.0f, 0.0f), float2(0.0f, 1.0f));
+      x_32_phi = x_33;
+    }
+  }
+  const float2 x_41 = mul(float2x2((x_30[0u] - float2(1.0f, 0.0f)), (x_30[1u] - float2(0.0f, 1.0f))), float2(1.0f, 1.0f));
+  while (true) {
+    if ((1.0f < x_41.x)) {
+      break;
+    }
+    GroupMemoryBarrierWithGroupSync();
+    break;
+  }
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void main() {
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/early-return-and-barrier/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/early-return-and-barrier/0.wgsl.expected.msl
new file mode 100644
index 0000000..d4c94f7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/early-return-and-barrier/0.wgsl.expected.msl
@@ -0,0 +1,44 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct theSSBO {
+  /* 0x0000 */ int out_data;
+};
+
+void main_1(device theSSBO& x_4) {
+  float2x2 x_30 = float2x2(0.0f);
+  float2x2 x_30_phi = float2x2(0.0f);
+  int x_32_phi = 0;
+  x_4.out_data = 42;
+  x_30_phi = float2x2(float2(0.0f, 0.0f), float2(0.0f, 0.0f));
+  x_32_phi = 1;
+  while (true) {
+    int x_33 = 0;
+    x_30 = x_30_phi;
+    int const x_32 = x_32_phi;
+    if ((x_32 > 0)) {
+    } else {
+      break;
+    }
+    {
+      x_33 = (x_32 - 1);
+      x_30_phi = float2x2(float2(1.0f, 0.0f), float2(0.0f, 1.0f));
+      x_32_phi = x_33;
+    }
+  }
+  float2 const x_41 = (float2(1.0f, 1.0f) * float2x2((x_30[0u] - float2(1.0f, 0.0f)), (x_30[1u] - float2(0.0f, 1.0f))));
+  while (true) {
+    if ((1.0f < x_41.x)) {
+      break;
+    }
+    threadgroup_barrier(mem_flags::mem_threadgroup);
+    break;
+  }
+  return;
+}
+
+kernel void tint_symbol(device theSSBO& x_4 [[buffer(0)]]) {
+  main_1(x_4);
+  return;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/early-return-and-barrier/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/early-return-and-barrier/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..a2f71c5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/early-return-and-barrier/0.wgsl.expected.spvasm
@@ -0,0 +1,121 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 72
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main"
+               OpExecutionMode %main LocalSize 1 1 1
+               OpName %theSSBO "theSSBO"
+               OpMemberName %theSSBO 0 "out_data"
+               OpName %x_4 "x_4"
+               OpName %main_1 "main_1"
+               OpName %x_30 "x_30"
+               OpName %x_30_phi "x_30_phi"
+               OpName %x_32_phi "x_32_phi"
+               OpName %x_33 "x_33"
+               OpName %main "main"
+               OpDecorate %theSSBO Block
+               OpMemberDecorate %theSSBO 0 Offset 0
+               OpDecorate %x_4 DescriptorSet 0
+               OpDecorate %x_4 Binding 0
+        %int = OpTypeInt 32 1
+    %theSSBO = OpTypeStruct %int
+%_ptr_StorageBuffer_theSSBO = OpTypePointer StorageBuffer %theSSBO
+        %x_4 = OpVariable %_ptr_StorageBuffer_theSSBO StorageBuffer
+       %void = OpTypeVoid
+          %5 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%mat2v2float = OpTypeMatrix %v2float 2
+%_ptr_Function_mat2v2float = OpTypePointer Function %mat2v2float
+         %14 = OpConstantNull %mat2v2float
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+     %int_42 = OpConstant %int 42
+    %float_0 = OpConstant %float 0
+         %25 = OpConstantComposite %v2float %float_0 %float_0
+         %26 = OpConstantComposite %mat2v2float %25 %25
+      %int_1 = OpConstant %int 1
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+         %43 = OpConstantComposite %v2float %float_1 %float_0
+         %44 = OpConstantComposite %v2float %float_0 %float_1
+         %45 = OpConstantComposite %mat2v2float %43 %44
+         %47 = OpConstantComposite %v2float %float_1 %float_1
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+   %uint_264 = OpConstant %uint 264
+     %main_1 = OpFunction %void None %5
+          %8 = OpLabel
+       %x_30 = OpVariable %_ptr_Function_mat2v2float Function %14
+   %x_30_phi = OpVariable %_ptr_Function_mat2v2float Function %14
+   %x_32_phi = OpVariable %_ptr_Function_int Function %18
+       %x_33 = OpVariable %_ptr_Function_int Function %18
+         %22 = OpAccessChain %_ptr_StorageBuffer_int %x_4 %uint_0
+               OpStore %22 %int_42
+               OpStore %x_30_phi %26
+               OpStore %x_32_phi %int_1
+               OpBranch %28
+         %28 = OpLabel
+               OpLoopMerge %29 %30 None
+               OpBranch %31
+         %31 = OpLabel
+         %33 = OpLoad %mat2v2float %x_30_phi
+               OpStore %x_30 %33
+         %34 = OpLoad %int %x_32_phi
+         %36 = OpSGreaterThan %bool %34 %int_0
+               OpSelectionMerge %38 None
+               OpBranchConditional %36 %39 %40
+         %39 = OpLabel
+               OpBranch %38
+         %40 = OpLabel
+               OpBranch %29
+         %38 = OpLabel
+               OpBranch %30
+         %30 = OpLabel
+         %41 = OpISub %int %34 %int_1
+               OpStore %x_33 %41
+               OpStore %x_30_phi %45
+         %46 = OpLoad %int %x_33
+               OpStore %x_32_phi %46
+               OpBranch %28
+         %29 = OpLabel
+         %49 = OpAccessChain %_ptr_Function_v2float %x_30 %uint_0
+         %50 = OpLoad %v2float %49
+         %51 = OpFSub %v2float %50 %43
+         %53 = OpAccessChain %_ptr_Function_v2float %x_30 %uint_1
+         %54 = OpLoad %v2float %53
+         %55 = OpFSub %v2float %54 %44
+         %56 = OpCompositeConstruct %mat2v2float %51 %55
+         %57 = OpVectorTimesMatrix %v2float %47 %56
+               OpBranch %58
+         %58 = OpLabel
+               OpLoopMerge %59 %60 None
+               OpBranch %61
+         %61 = OpLabel
+         %62 = OpCompositeExtract %float %57 0
+         %63 = OpFOrdLessThan %bool %float_1 %62
+               OpSelectionMerge %64 None
+               OpBranchConditional %63 %65 %64
+         %65 = OpLabel
+               OpBranch %59
+         %64 = OpLabel
+               OpControlBarrier %uint_2 %uint_2 %uint_264
+               OpBranch %59
+         %60 = OpLabel
+               OpBranch %58
+         %59 = OpLabel
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %5
+         %70 = OpLabel
+         %71 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/early-return-and-barrier/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/early-return-and-barrier/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..7eaea5b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/early-return-and-barrier/0.wgsl.expected.wgsl
@@ -0,0 +1,44 @@
+[[block]]
+struct theSSBO {
+  out_data : i32;
+};
+
+[[group(0), binding(0)]] var<storage, read_write> x_4 : theSSBO;
+
+fn main_1() {
+  var x_30 : mat2x2<f32>;
+  var x_30_phi : mat2x2<f32>;
+  var x_32_phi : i32;
+  x_4.out_data = 42;
+  x_30_phi = mat2x2<f32>(vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0));
+  x_32_phi = 1;
+  loop {
+    var x_33 : i32;
+    x_30 = x_30_phi;
+    let x_32 : i32 = x_32_phi;
+    if ((x_32 > 0)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_33 = (x_32 - 1);
+      x_30_phi = mat2x2<f32>(vec2<f32>(1.0, 0.0), vec2<f32>(0.0, 1.0));
+      x_32_phi = x_33;
+    }
+  }
+  let x_41 : vec2<f32> = (vec2<f32>(1.0, 1.0) * mat2x2<f32>((x_30[0u] - vec2<f32>(1.0, 0.0)), (x_30[1u] - vec2<f32>(0.0, 1.0))));
+  loop {
+    if ((1.0 < x_41.x)) {
+      break;
+    }
+    workgroupBarrier();
+    break;
+  }
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main() {
+  main_1();
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/flag-always-false-if/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/flag-always-false-if/0-opt.spvasm
new file mode 100644
index 0000000..5bc78c6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/flag-always-false-if/0-opt.spvasm
@@ -0,0 +1,139 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %loop_count "loop_count"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_0 = OpConstant %float 0
+    %int_100 = OpConstant %int 100
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+         %28 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+         %29 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %int_1 = OpConstant %int 1
+       %main = OpFunction %void None %9
+         %31 = OpLabel
+ %loop_count = OpVariable %_ptr_Function_int Function
+               OpStore %loop_count %int_0
+         %32 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %33 = OpLoad %float %32
+         %34 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %35 = OpLoad %float %34
+         %36 = OpFOrdGreaterThan %bool %33 %35
+               OpSelectionMerge %37 None
+               OpBranchConditional %36 %38 %37
+         %38 = OpLabel
+               OpReturn
+         %37 = OpLabel
+         %39 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %40 = OpLoad %float %39
+         %41 = OpFOrdLessThan %bool %40 %float_0
+               OpBranch %42
+         %42 = OpLabel
+         %43 = OpLoad %int %loop_count
+         %44 = OpSLessThan %bool %43 %int_100
+               OpLoopMerge %45 %46 None
+               OpBranchConditional %44 %47 %45
+         %47 = OpLabel
+               OpSelectionMerge %48 None
+               OpBranchConditional %36 %49 %48
+         %49 = OpLabel
+               OpBranch %45
+         %48 = OpLabel
+               OpSelectionMerge %50 None
+               OpBranchConditional %36 %51 %52
+         %51 = OpLabel
+               OpStore %_GLF_color %28
+               OpBranch %50
+         %52 = OpLabel
+               OpSelectionMerge %53 None
+               OpBranchConditional %41 %54 %53
+         %54 = OpLabel
+               OpReturn
+         %53 = OpLabel
+               OpBranch %50
+         %50 = OpLabel
+               OpSelectionMerge %55 None
+               OpBranchConditional %36 %56 %57
+         %56 = OpLabel
+               OpStore %_GLF_color %28
+               OpBranch %55
+         %57 = OpLabel
+               OpStore %_GLF_color %29
+               OpBranch %55
+         %55 = OpLabel
+               OpSelectionMerge %58 None
+               OpBranchConditional %36 %59 %58
+         %59 = OpLabel
+               OpReturn
+         %58 = OpLabel
+               OpSelectionMerge %60 None
+               OpBranchConditional %41 %61 %60
+         %61 = OpLabel
+               OpBranch %62
+         %62 = OpLabel
+         %63 = OpLoad %int %loop_count
+         %64 = OpSLessThan %bool %63 %int_100
+               OpLoopMerge %65 %66 None
+               OpBranchConditional %64 %66 %65
+         %66 = OpLabel
+         %67 = OpLoad %int %loop_count
+         %68 = OpIAdd %int %67 %int_1
+               OpStore %loop_count %68
+               OpBranch %62
+         %65 = OpLabel
+               OpBranch %60
+         %60 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+         %69 = OpLoad %int %loop_count
+         %70 = OpIAdd %int %69 %int_1
+               OpStore %loop_count %70
+               OpBranch %42
+         %45 = OpLabel
+         %71 = OpLoad %int %loop_count
+         %72 = OpSGreaterThanEqual %bool %71 %int_100
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %74 %75
+         %74 = OpLabel
+               OpStore %_GLF_color %29
+               OpBranch %73
+         %75 = OpLabel
+               OpStore %_GLF_color %28
+               OpBranch %73
+         %73 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/flag-always-false-if/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/flag-always-false-if/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..6da0503
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/flag-always-false-if/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,71 @@
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int loop_count = 0;
+  loop_count = 0;
+  const float x_33 = asfloat(x_7[0].x);
+  const float x_35 = asfloat(x_7[0].y);
+  const bool x_36 = (x_33 > x_35);
+  if (x_36) {
+    return;
+  }
+  const float x_40 = gl_FragCoord.x;
+  const bool x_41 = (x_40 < 0.0f);
+  {
+    for(; (loop_count < 100); loop_count = (loop_count + 1)) {
+      if (x_36) {
+        break;
+      }
+      if (x_36) {
+        x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+      } else {
+        if (x_41) {
+          return;
+        }
+      }
+      if (x_36) {
+        x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+      } else {
+        x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+      }
+      if (x_36) {
+        return;
+      }
+      if (x_41) {
+        {
+          for(; (loop_count < 100); loop_count = (loop_count + 1)) {
+          }
+        }
+      }
+    }
+  }
+  if ((loop_count >= 100)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(1.0f, 1.0f, 1.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/flag-always-false-if/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/flag-always-false-if/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..763a5d8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/flag-always-false-if/0-opt.spvasm.expected.msl
@@ -0,0 +1,85 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int loop_count = 0;
+  loop_count = 0;
+  float const x_33 = x_7.injectionSwitch.x;
+  float const x_35 = x_7.injectionSwitch.y;
+  bool const x_36 = (x_33 > x_35);
+  if (x_36) {
+    return;
+  }
+  float const x_40 = (*(tint_symbol_5)).x;
+  bool const x_41 = (x_40 < 0.0f);
+  while (true) {
+    int const x_43 = loop_count;
+    if ((x_43 < 100)) {
+    } else {
+      break;
+    }
+    if (x_36) {
+      break;
+    }
+    if (x_36) {
+      *(tint_symbol_6) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+    } else {
+      if (x_41) {
+        return;
+      }
+    }
+    if (x_36) {
+      *(tint_symbol_6) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+    } else {
+      *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    }
+    if (x_36) {
+      return;
+    }
+    if (x_41) {
+      while (true) {
+        int const x_63 = loop_count;
+        if ((x_63 < 100)) {
+        } else {
+          break;
+        }
+        {
+          int const x_67 = loop_count;
+          loop_count = (x_67 + 1);
+        }
+      }
+    }
+    {
+      int const x_69 = loop_count;
+      loop_count = (x_69 + 1);
+    }
+  }
+  int const x_71 = loop_count;
+  if ((x_71 >= 100)) {
+    *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_6) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_7, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/flag-always-false-if/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/flag-always-false-if/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..ddaaf92
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/flag-always-false-if/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,191 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 100
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_7 "x_7"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %loop_count "loop_count"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %22 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+    %int_100 = OpConstant %int 100
+    %float_1 = OpConstant %float 1
+         %57 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+         %63 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %87 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+ %loop_count = OpVariable %_ptr_Function_int Function %22
+               OpStore %loop_count %int_0
+         %27 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_0
+         %28 = OpLoad %float %27
+         %30 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_1
+         %31 = OpLoad %float %30
+         %32 = OpFOrdGreaterThan %bool %28 %31
+               OpSelectionMerge %34 None
+               OpBranchConditional %32 %35 %34
+         %35 = OpLabel
+               OpReturn
+         %34 = OpLabel
+         %37 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %38 = OpLoad %float %37
+         %40 = OpFOrdLessThan %bool %38 %float_0
+               OpBranch %41
+         %41 = OpLabel
+               OpLoopMerge %42 %43 None
+               OpBranch %44
+         %44 = OpLabel
+         %45 = OpLoad %int %loop_count
+         %47 = OpSLessThan %bool %45 %int_100
+               OpSelectionMerge %48 None
+               OpBranchConditional %47 %49 %50
+         %49 = OpLabel
+               OpBranch %48
+         %50 = OpLabel
+               OpBranch %42
+         %48 = OpLabel
+               OpSelectionMerge %51 None
+               OpBranchConditional %32 %52 %51
+         %52 = OpLabel
+               OpBranch %42
+         %51 = OpLabel
+               OpSelectionMerge %53 None
+               OpBranchConditional %32 %54 %55
+         %54 = OpLabel
+               OpStore %x_GLF_color %57
+               OpBranch %53
+         %55 = OpLabel
+               OpSelectionMerge %58 None
+               OpBranchConditional %40 %59 %58
+         %59 = OpLabel
+               OpReturn
+         %58 = OpLabel
+               OpBranch %53
+         %53 = OpLabel
+               OpSelectionMerge %60 None
+               OpBranchConditional %32 %61 %62
+         %61 = OpLabel
+               OpStore %x_GLF_color %57
+               OpBranch %60
+         %62 = OpLabel
+               OpStore %x_GLF_color %63
+               OpBranch %60
+         %60 = OpLabel
+               OpSelectionMerge %64 None
+               OpBranchConditional %32 %65 %64
+         %65 = OpLabel
+               OpReturn
+         %64 = OpLabel
+               OpSelectionMerge %66 None
+               OpBranchConditional %40 %67 %66
+         %67 = OpLabel
+               OpBranch %68
+         %68 = OpLabel
+               OpLoopMerge %69 %70 None
+               OpBranch %71
+         %71 = OpLabel
+         %72 = OpLoad %int %loop_count
+         %73 = OpSLessThan %bool %72 %int_100
+               OpSelectionMerge %74 None
+               OpBranchConditional %73 %75 %76
+         %75 = OpLabel
+               OpBranch %74
+         %76 = OpLabel
+               OpBranch %69
+         %74 = OpLabel
+               OpBranch %70
+         %70 = OpLabel
+         %77 = OpLoad %int %loop_count
+         %79 = OpIAdd %int %77 %int_1
+               OpStore %loop_count %79
+               OpBranch %68
+         %69 = OpLabel
+               OpBranch %66
+         %66 = OpLabel
+               OpBranch %43
+         %43 = OpLabel
+         %80 = OpLoad %int %loop_count
+         %81 = OpIAdd %int %80 %int_1
+               OpStore %loop_count %81
+               OpBranch %41
+         %42 = OpLabel
+         %82 = OpLoad %int %loop_count
+         %83 = OpSGreaterThanEqual %bool %82 %int_100
+               OpSelectionMerge %84 None
+               OpBranchConditional %83 %85 %86
+         %85 = OpLabel
+               OpStore %x_GLF_color %63
+               OpBranch %84
+         %86 = OpLabel
+               OpStore %x_GLF_color %57
+               OpBranch %84
+         %84 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %87
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %91 = OpLabel
+         %92 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %92
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %94 = OpLabel
+         %95 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %95
+         %96 = OpFunctionCall %void %main_1
+         %98 = OpLoad %v4float %x_GLF_color
+         %99 = OpCompositeConstruct %main_out %98
+         %97 = OpFunctionCall %void %tint_symbol_3 %99
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/flag-always-false-if/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/flag-always-false-if/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..08be511
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/flag-always-false-if/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,86 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var loop_count : i32;
+  loop_count = 0;
+  let x_33 : f32 = x_7.injectionSwitch.x;
+  let x_35 : f32 = x_7.injectionSwitch.y;
+  let x_36 : bool = (x_33 > x_35);
+  if (x_36) {
+    return;
+  }
+  let x_40 : f32 = gl_FragCoord.x;
+  let x_41 : bool = (x_40 < 0.0);
+  loop {
+    let x_43 : i32 = loop_count;
+    if ((x_43 < 100)) {
+    } else {
+      break;
+    }
+    if (x_36) {
+      break;
+    }
+    if (x_36) {
+      x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+    } else {
+      if (x_41) {
+        return;
+      }
+    }
+    if (x_36) {
+      x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+    } else {
+      x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    }
+    if (x_36) {
+      return;
+    }
+    if (x_41) {
+      loop {
+        let x_63 : i32 = loop_count;
+        if ((x_63 < 100)) {
+        } else {
+          break;
+        }
+
+        continuing {
+          let x_67 : i32 = loop_count;
+          loop_count = (x_67 + 1);
+        }
+      }
+    }
+
+    continuing {
+      let x_69 : i32 = loop_count;
+      loop_count = (x_69 + 1);
+    }
+  }
+  let x_71 : i32 = loop_count;
+  if ((x_71 >= 100)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/flag-always-false-if/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/flag-always-false-if/0-opt.wgsl
new file mode 100644
index 0000000..08be511
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/flag-always-false-if/0-opt.wgsl
@@ -0,0 +1,86 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var loop_count : i32;
+  loop_count = 0;
+  let x_33 : f32 = x_7.injectionSwitch.x;
+  let x_35 : f32 = x_7.injectionSwitch.y;
+  let x_36 : bool = (x_33 > x_35);
+  if (x_36) {
+    return;
+  }
+  let x_40 : f32 = gl_FragCoord.x;
+  let x_41 : bool = (x_40 < 0.0);
+  loop {
+    let x_43 : i32 = loop_count;
+    if ((x_43 < 100)) {
+    } else {
+      break;
+    }
+    if (x_36) {
+      break;
+    }
+    if (x_36) {
+      x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+    } else {
+      if (x_41) {
+        return;
+      }
+    }
+    if (x_36) {
+      x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+    } else {
+      x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    }
+    if (x_36) {
+      return;
+    }
+    if (x_41) {
+      loop {
+        let x_63 : i32 = loop_count;
+        if ((x_63 < 100)) {
+        } else {
+          break;
+        }
+
+        continuing {
+          let x_67 : i32 = loop_count;
+          loop_count = (x_67 + 1);
+        }
+      }
+    }
+
+    continuing {
+      let x_69 : i32 = loop_count;
+      loop_count = (x_69 + 1);
+    }
+  }
+  let x_71 : i32 = loop_count;
+  if ((x_71 >= 100)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/flag-always-false-if/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/flag-always-false-if/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..6da0503
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/flag-always-false-if/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,71 @@
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int loop_count = 0;
+  loop_count = 0;
+  const float x_33 = asfloat(x_7[0].x);
+  const float x_35 = asfloat(x_7[0].y);
+  const bool x_36 = (x_33 > x_35);
+  if (x_36) {
+    return;
+  }
+  const float x_40 = gl_FragCoord.x;
+  const bool x_41 = (x_40 < 0.0f);
+  {
+    for(; (loop_count < 100); loop_count = (loop_count + 1)) {
+      if (x_36) {
+        break;
+      }
+      if (x_36) {
+        x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+      } else {
+        if (x_41) {
+          return;
+        }
+      }
+      if (x_36) {
+        x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+      } else {
+        x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+      }
+      if (x_36) {
+        return;
+      }
+      if (x_41) {
+        {
+          for(; (loop_count < 100); loop_count = (loop_count + 1)) {
+          }
+        }
+      }
+    }
+  }
+  if ((loop_count >= 100)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(1.0f, 1.0f, 1.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/flag-always-false-if/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/flag-always-false-if/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..763a5d8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/flag-always-false-if/0-opt.wgsl.expected.msl
@@ -0,0 +1,85 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int loop_count = 0;
+  loop_count = 0;
+  float const x_33 = x_7.injectionSwitch.x;
+  float const x_35 = x_7.injectionSwitch.y;
+  bool const x_36 = (x_33 > x_35);
+  if (x_36) {
+    return;
+  }
+  float const x_40 = (*(tint_symbol_5)).x;
+  bool const x_41 = (x_40 < 0.0f);
+  while (true) {
+    int const x_43 = loop_count;
+    if ((x_43 < 100)) {
+    } else {
+      break;
+    }
+    if (x_36) {
+      break;
+    }
+    if (x_36) {
+      *(tint_symbol_6) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+    } else {
+      if (x_41) {
+        return;
+      }
+    }
+    if (x_36) {
+      *(tint_symbol_6) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+    } else {
+      *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    }
+    if (x_36) {
+      return;
+    }
+    if (x_41) {
+      while (true) {
+        int const x_63 = loop_count;
+        if ((x_63 < 100)) {
+        } else {
+          break;
+        }
+        {
+          int const x_67 = loop_count;
+          loop_count = (x_67 + 1);
+        }
+      }
+    }
+    {
+      int const x_69 = loop_count;
+      loop_count = (x_69 + 1);
+    }
+  }
+  int const x_71 = loop_count;
+  if ((x_71 >= 100)) {
+    *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_6) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_7, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/flag-always-false-if/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/flag-always-false-if/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..ddaaf92
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/flag-always-false-if/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,191 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 100
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_7 "x_7"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %loop_count "loop_count"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %22 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+    %int_100 = OpConstant %int 100
+    %float_1 = OpConstant %float 1
+         %57 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+         %63 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %87 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+ %loop_count = OpVariable %_ptr_Function_int Function %22
+               OpStore %loop_count %int_0
+         %27 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_0
+         %28 = OpLoad %float %27
+         %30 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_1
+         %31 = OpLoad %float %30
+         %32 = OpFOrdGreaterThan %bool %28 %31
+               OpSelectionMerge %34 None
+               OpBranchConditional %32 %35 %34
+         %35 = OpLabel
+               OpReturn
+         %34 = OpLabel
+         %37 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %38 = OpLoad %float %37
+         %40 = OpFOrdLessThan %bool %38 %float_0
+               OpBranch %41
+         %41 = OpLabel
+               OpLoopMerge %42 %43 None
+               OpBranch %44
+         %44 = OpLabel
+         %45 = OpLoad %int %loop_count
+         %47 = OpSLessThan %bool %45 %int_100
+               OpSelectionMerge %48 None
+               OpBranchConditional %47 %49 %50
+         %49 = OpLabel
+               OpBranch %48
+         %50 = OpLabel
+               OpBranch %42
+         %48 = OpLabel
+               OpSelectionMerge %51 None
+               OpBranchConditional %32 %52 %51
+         %52 = OpLabel
+               OpBranch %42
+         %51 = OpLabel
+               OpSelectionMerge %53 None
+               OpBranchConditional %32 %54 %55
+         %54 = OpLabel
+               OpStore %x_GLF_color %57
+               OpBranch %53
+         %55 = OpLabel
+               OpSelectionMerge %58 None
+               OpBranchConditional %40 %59 %58
+         %59 = OpLabel
+               OpReturn
+         %58 = OpLabel
+               OpBranch %53
+         %53 = OpLabel
+               OpSelectionMerge %60 None
+               OpBranchConditional %32 %61 %62
+         %61 = OpLabel
+               OpStore %x_GLF_color %57
+               OpBranch %60
+         %62 = OpLabel
+               OpStore %x_GLF_color %63
+               OpBranch %60
+         %60 = OpLabel
+               OpSelectionMerge %64 None
+               OpBranchConditional %32 %65 %64
+         %65 = OpLabel
+               OpReturn
+         %64 = OpLabel
+               OpSelectionMerge %66 None
+               OpBranchConditional %40 %67 %66
+         %67 = OpLabel
+               OpBranch %68
+         %68 = OpLabel
+               OpLoopMerge %69 %70 None
+               OpBranch %71
+         %71 = OpLabel
+         %72 = OpLoad %int %loop_count
+         %73 = OpSLessThan %bool %72 %int_100
+               OpSelectionMerge %74 None
+               OpBranchConditional %73 %75 %76
+         %75 = OpLabel
+               OpBranch %74
+         %76 = OpLabel
+               OpBranch %69
+         %74 = OpLabel
+               OpBranch %70
+         %70 = OpLabel
+         %77 = OpLoad %int %loop_count
+         %79 = OpIAdd %int %77 %int_1
+               OpStore %loop_count %79
+               OpBranch %68
+         %69 = OpLabel
+               OpBranch %66
+         %66 = OpLabel
+               OpBranch %43
+         %43 = OpLabel
+         %80 = OpLoad %int %loop_count
+         %81 = OpIAdd %int %80 %int_1
+               OpStore %loop_count %81
+               OpBranch %41
+         %42 = OpLabel
+         %82 = OpLoad %int %loop_count
+         %83 = OpSGreaterThanEqual %bool %82 %int_100
+               OpSelectionMerge %84 None
+               OpBranchConditional %83 %85 %86
+         %85 = OpLabel
+               OpStore %x_GLF_color %63
+               OpBranch %84
+         %86 = OpLabel
+               OpStore %x_GLF_color %57
+               OpBranch %84
+         %84 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %87
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %91 = OpLabel
+         %92 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %92
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %94 = OpLabel
+         %95 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %95
+         %96 = OpFunctionCall %void %main_1
+         %98 = OpLoad %v4float %x_GLF_color
+         %99 = OpCompositeConstruct %main_out %98
+         %97 = OpFunctionCall %void %tint_symbol_3 %99
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/flag-always-false-if/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/flag-always-false-if/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..08be511
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/flag-always-false-if/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,86 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var loop_count : i32;
+  loop_count = 0;
+  let x_33 : f32 = x_7.injectionSwitch.x;
+  let x_35 : f32 = x_7.injectionSwitch.y;
+  let x_36 : bool = (x_33 > x_35);
+  if (x_36) {
+    return;
+  }
+  let x_40 : f32 = gl_FragCoord.x;
+  let x_41 : bool = (x_40 < 0.0);
+  loop {
+    let x_43 : i32 = loop_count;
+    if ((x_43 < 100)) {
+    } else {
+      break;
+    }
+    if (x_36) {
+      break;
+    }
+    if (x_36) {
+      x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+    } else {
+      if (x_41) {
+        return;
+      }
+    }
+    if (x_36) {
+      x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+    } else {
+      x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    }
+    if (x_36) {
+      return;
+    }
+    if (x_41) {
+      loop {
+        let x_63 : i32 = loop_count;
+        if ((x_63 < 100)) {
+        } else {
+          break;
+        }
+
+        continuing {
+          let x_67 : i32 = loop_count;
+          loop_count = (x_67 + 1);
+        }
+      }
+    }
+
+    continuing {
+      let x_69 : i32 = loop_count;
+      loop_count = (x_69 + 1);
+    }
+  }
+  let x_71 : i32 = loop_count;
+  if ((x_71 >= 100)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/for-condition-always-false/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/for-condition-always-false/0-opt.spvasm
new file mode 100644
index 0000000..d28f656
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/for-condition-always-false/0-opt.spvasm
@@ -0,0 +1,62 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %drawShape_vf2_ "drawShape(vf2;"
+               OpName %pos "pos"
+               OpName %c3 "c3"
+               OpName %param "param"
+               OpName %color "color"
+               OpDecorate %color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+    %v3float = OpTypeVector %float 3
+         %14 = OpTypeFunction %v3float %_ptr_Function_v2float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_1 = OpConstant %float 1
+         %21 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+         %22 = OpConstantComposite %v2float %float_1 %float_1
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+      %color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %26 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %27 = OpUndef %bool
+       %main = OpFunction %void None %9
+         %28 = OpLabel
+      %param = OpVariable %_ptr_Function_v2float Function
+               OpStore %param %22
+         %29 = OpFunctionCall %v3float %drawShape_vf2_ %param
+               OpStore %color %26
+               OpReturn
+               OpFunctionEnd
+%drawShape_vf2_ = OpFunction %v3float None %14
+        %pos = OpFunctionParameter %_ptr_Function_v2float
+         %30 = OpLabel
+         %c3 = OpVariable %_ptr_Function_bool Function
+         %31 = OpAccessChain %_ptr_Function_float %pos %uint_1
+         %32 = OpLoad %float %31
+         %33 = OpFOrdLessThan %bool %32 %float_1
+               OpStore %c3 %33
+               OpBranch %34
+         %34 = OpLabel
+         %35 = OpPhi %bool %33 %30 %27 %36
+               OpLoopMerge %37 %36 None
+               OpBranchConditional %35 %38 %37
+         %38 = OpLabel
+               OpReturnValue %21
+         %36 = OpLabel
+               OpBranch %34
+         %37 = OpLabel
+               OpReturnValue %21
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/for-condition-always-false/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/for-condition-always-false/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..658f19b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/for-condition-always-false/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,47 @@
+SKIP: FAILED
+
+
+var<private> color : vec4<f32>;
+
+fn drawShape_vf2_(pos : ptr<function, vec2<f32>>) -> vec3<f32> {
+  var c3 : bool;
+  var x_35_phi : bool;
+  let x_32 : f32 = (*(pos)).y;
+  let x_33 : bool = (x_32 < 1.0);
+  c3 = x_33;
+  x_35_phi = x_33;
+  loop {
+    let x_35 : bool = x_35_phi;
+    if (x_35) {
+    } else {
+      break;
+    }
+    return vec3<f32>(1.0, 1.0, 1.0);
+
+    continuing {
+      x_35_phi = false;
+    }
+  }
+  return vec3<f32>(1.0, 1.0, 1.0);
+}
+
+fn main_1() {
+  var param : vec2<f32>;
+  param = vec2<f32>(1.0, 1.0);
+  let x_29 : vec3<f32> = drawShape_vf2_(&(param));
+  color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(color);
+}
+
+Failed to generate: error: for-loop condition must be bool, got bool
diff --git a/test/vk-gl-cts/graphicsfuzz/for-condition-always-false/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/for-condition-always-false/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..876f990
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/for-condition-always-false/0-opt.spvasm.expected.msl
@@ -0,0 +1,47 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 color_1;
+};
+struct tint_symbol_1 {
+  float4 color_1 [[color(0)]];
+};
+
+float3 drawShape_vf2_(thread float2* const pos) {
+  bool c3 = false;
+  bool x_35_phi = false;
+  float const x_32 = (*(pos)).y;
+  bool const x_33 = (x_32 < 1.0f);
+  c3 = x_33;
+  x_35_phi = x_33;
+  while (true) {
+    bool const x_35 = x_35_phi;
+    if (x_35) {
+    } else {
+      break;
+    }
+    return float3(1.0f, 1.0f, 1.0f);
+    {
+      x_35_phi = false;
+    }
+  }
+  return float3(1.0f, 1.0f, 1.0f);
+}
+
+void main_1(thread float4* const tint_symbol_4) {
+  float2 param = 0.0f;
+  param = float2(1.0f, 1.0f);
+  float3 const x_29 = drawShape_vf2_(&(param));
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.color_1=tint_symbol_2.color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/for-condition-always-false/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/for-condition-always-false/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..945adf2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/for-condition-always-false/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,105 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 61
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %color "color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %drawShape_vf2_ "drawShape_vf2_"
+               OpName %pos "pos"
+               OpName %c3 "c3"
+               OpName %x_35_phi "x_35_phi"
+               OpName %main_1 "main_1"
+               OpName %param "param"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+      %color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+    %v3float = OpTypeVector %float 3
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+          %8 = OpTypeFunction %v3float %_ptr_Function_v2float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %18 = OpConstantNull %bool
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_1 = OpConstant %float 1
+         %36 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+      %false = OpConstantFalse %bool
+       %void = OpTypeVoid
+         %38 = OpTypeFunction %void
+         %43 = OpConstantNull %v2float
+         %44 = OpConstantComposite %v2float %float_1 %float_1
+    %float_0 = OpConstant %float 0
+         %48 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %49 = OpTypeFunction %void %main_out
+%drawShape_vf2_ = OpFunction %v3float None %8
+        %pos = OpFunctionParameter %_ptr_Function_v2float
+         %14 = OpLabel
+         %c3 = OpVariable %_ptr_Function_bool Function %18
+   %x_35_phi = OpVariable %_ptr_Function_bool Function %18
+         %24 = OpAccessChain %_ptr_Function_float %pos %uint_1
+         %25 = OpLoad %float %24
+         %27 = OpFOrdLessThan %bool %25 %float_1
+               OpStore %c3 %27
+               OpStore %x_35_phi %27
+               OpBranch %28
+         %28 = OpLabel
+               OpLoopMerge %29 %30 None
+               OpBranch %31
+         %31 = OpLabel
+         %32 = OpLoad %bool %x_35_phi
+               OpSelectionMerge %33 None
+               OpBranchConditional %32 %34 %35
+         %34 = OpLabel
+               OpBranch %33
+         %35 = OpLabel
+               OpBranch %29
+         %33 = OpLabel
+               OpReturnValue %36
+         %30 = OpLabel
+               OpStore %x_35_phi %false
+               OpBranch %28
+         %29 = OpLabel
+               OpReturnValue %36
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %38
+         %41 = OpLabel
+      %param = OpVariable %_ptr_Function_v2float Function %43
+               OpStore %param %44
+         %45 = OpFunctionCall %v3float %drawShape_vf2_ %param
+               OpStore %color %48
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %49
+%tint_symbol = OpFunctionParameter %main_out
+         %53 = OpLabel
+         %54 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %54
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %38
+         %56 = OpLabel
+         %57 = OpFunctionCall %void %main_1
+         %59 = OpLoad %v4float %color
+         %60 = OpCompositeConstruct %main_out %59
+         %58 = OpFunctionCall %void %tint_symbol_2 %60
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/for-condition-always-false/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/for-condition-always-false/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..3817d55
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/for-condition-always-false/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,42 @@
+var<private> color : vec4<f32>;
+
+fn drawShape_vf2_(pos : ptr<function, vec2<f32>>) -> vec3<f32> {
+  var c3 : bool;
+  var x_35_phi : bool;
+  let x_32 : f32 = (*(pos)).y;
+  let x_33 : bool = (x_32 < 1.0);
+  c3 = x_33;
+  x_35_phi = x_33;
+  loop {
+    let x_35 : bool = x_35_phi;
+    if (x_35) {
+    } else {
+      break;
+    }
+    return vec3<f32>(1.0, 1.0, 1.0);
+
+    continuing {
+      x_35_phi = false;
+    }
+  }
+  return vec3<f32>(1.0, 1.0, 1.0);
+}
+
+fn main_1() {
+  var param : vec2<f32>;
+  param = vec2<f32>(1.0, 1.0);
+  let x_29 : vec3<f32> = drawShape_vf2_(&(param));
+  color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/for-condition-always-false/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/for-condition-always-false/0-opt.wgsl
new file mode 100644
index 0000000..3817d55
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/for-condition-always-false/0-opt.wgsl
@@ -0,0 +1,42 @@
+var<private> color : vec4<f32>;
+
+fn drawShape_vf2_(pos : ptr<function, vec2<f32>>) -> vec3<f32> {
+  var c3 : bool;
+  var x_35_phi : bool;
+  let x_32 : f32 = (*(pos)).y;
+  let x_33 : bool = (x_32 < 1.0);
+  c3 = x_33;
+  x_35_phi = x_33;
+  loop {
+    let x_35 : bool = x_35_phi;
+    if (x_35) {
+    } else {
+      break;
+    }
+    return vec3<f32>(1.0, 1.0, 1.0);
+
+    continuing {
+      x_35_phi = false;
+    }
+  }
+  return vec3<f32>(1.0, 1.0, 1.0);
+}
+
+fn main_1() {
+  var param : vec2<f32>;
+  param = vec2<f32>(1.0, 1.0);
+  let x_29 : vec3<f32> = drawShape_vf2_(&(param));
+  color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/for-condition-always-false/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/for-condition-always-false/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..028dc34
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/for-condition-always-false/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,50 @@
+SKIP: FAILED
+
+
+var<private> color : vec4<f32>;
+
+fn drawShape_vf2_(pos : ptr<function, vec2<f32>>) -> vec3<f32> {
+  var c3 : bool;
+  var x_35_phi : bool;
+  let x_32 : f32 = (*(pos)).y;
+  let x_33 : bool = (x_32 < 1.0);
+  c3 = x_33;
+  x_35_phi = x_33;
+  loop {
+    let x_35 : bool = x_35_phi;
+    if (x_35) {
+    } else {
+      break;
+    }
+    return vec3<f32>(1.0, 1.0, 1.0);
+
+    continuing {
+      x_35_phi = false;
+    }
+  }
+  return vec3<f32>(1.0, 1.0, 1.0);
+}
+
+fn main_1() {
+  var param : vec2<f32>;
+  param = vec2<f32>(1.0, 1.0);
+  let x_29 : vec3<f32> = drawShape_vf2_(&(param));
+  color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(color);
+}
+
+Failed to generate: graphicsfuzz/for-condition-always-false/0-opt.wgsl:11:23 error: for-loop condition must be bool, got bool
+    let x_35 : bool = x_35_phi;
+                      ^^^^^^^^
+
diff --git a/test/vk-gl-cts/graphicsfuzz/for-condition-always-false/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/for-condition-always-false/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..876f990
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/for-condition-always-false/0-opt.wgsl.expected.msl
@@ -0,0 +1,47 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 color_1;
+};
+struct tint_symbol_1 {
+  float4 color_1 [[color(0)]];
+};
+
+float3 drawShape_vf2_(thread float2* const pos) {
+  bool c3 = false;
+  bool x_35_phi = false;
+  float const x_32 = (*(pos)).y;
+  bool const x_33 = (x_32 < 1.0f);
+  c3 = x_33;
+  x_35_phi = x_33;
+  while (true) {
+    bool const x_35 = x_35_phi;
+    if (x_35) {
+    } else {
+      break;
+    }
+    return float3(1.0f, 1.0f, 1.0f);
+    {
+      x_35_phi = false;
+    }
+  }
+  return float3(1.0f, 1.0f, 1.0f);
+}
+
+void main_1(thread float4* const tint_symbol_4) {
+  float2 param = 0.0f;
+  param = float2(1.0f, 1.0f);
+  float3 const x_29 = drawShape_vf2_(&(param));
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.color_1=tint_symbol_2.color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/for-condition-always-false/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/for-condition-always-false/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..945adf2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/for-condition-always-false/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,105 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 61
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %color "color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %drawShape_vf2_ "drawShape_vf2_"
+               OpName %pos "pos"
+               OpName %c3 "c3"
+               OpName %x_35_phi "x_35_phi"
+               OpName %main_1 "main_1"
+               OpName %param "param"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+      %color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+    %v3float = OpTypeVector %float 3
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+          %8 = OpTypeFunction %v3float %_ptr_Function_v2float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %18 = OpConstantNull %bool
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_1 = OpConstant %float 1
+         %36 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+      %false = OpConstantFalse %bool
+       %void = OpTypeVoid
+         %38 = OpTypeFunction %void
+         %43 = OpConstantNull %v2float
+         %44 = OpConstantComposite %v2float %float_1 %float_1
+    %float_0 = OpConstant %float 0
+         %48 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %49 = OpTypeFunction %void %main_out
+%drawShape_vf2_ = OpFunction %v3float None %8
+        %pos = OpFunctionParameter %_ptr_Function_v2float
+         %14 = OpLabel
+         %c3 = OpVariable %_ptr_Function_bool Function %18
+   %x_35_phi = OpVariable %_ptr_Function_bool Function %18
+         %24 = OpAccessChain %_ptr_Function_float %pos %uint_1
+         %25 = OpLoad %float %24
+         %27 = OpFOrdLessThan %bool %25 %float_1
+               OpStore %c3 %27
+               OpStore %x_35_phi %27
+               OpBranch %28
+         %28 = OpLabel
+               OpLoopMerge %29 %30 None
+               OpBranch %31
+         %31 = OpLabel
+         %32 = OpLoad %bool %x_35_phi
+               OpSelectionMerge %33 None
+               OpBranchConditional %32 %34 %35
+         %34 = OpLabel
+               OpBranch %33
+         %35 = OpLabel
+               OpBranch %29
+         %33 = OpLabel
+               OpReturnValue %36
+         %30 = OpLabel
+               OpStore %x_35_phi %false
+               OpBranch %28
+         %29 = OpLabel
+               OpReturnValue %36
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %38
+         %41 = OpLabel
+      %param = OpVariable %_ptr_Function_v2float Function %43
+               OpStore %param %44
+         %45 = OpFunctionCall %v3float %drawShape_vf2_ %param
+               OpStore %color %48
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %49
+%tint_symbol = OpFunctionParameter %main_out
+         %53 = OpLabel
+         %54 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %54
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %38
+         %56 = OpLabel
+         %57 = OpFunctionCall %void %main_1
+         %59 = OpLoad %v4float %color
+         %60 = OpCompositeConstruct %main_out %59
+         %58 = OpFunctionCall %void %tint_symbol_2 %60
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/for-condition-always-false/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/for-condition-always-false/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..3817d55
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/for-condition-always-false/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,42 @@
+var<private> color : vec4<f32>;
+
+fn drawShape_vf2_(pos : ptr<function, vec2<f32>>) -> vec3<f32> {
+  var c3 : bool;
+  var x_35_phi : bool;
+  let x_32 : f32 = (*(pos)).y;
+  let x_33 : bool = (x_32 < 1.0);
+  c3 = x_33;
+  x_35_phi = x_33;
+  loop {
+    let x_35 : bool = x_35_phi;
+    if (x_35) {
+    } else {
+      break;
+    }
+    return vec3<f32>(1.0, 1.0, 1.0);
+
+    continuing {
+      x_35_phi = false;
+    }
+  }
+  return vec3<f32>(1.0, 1.0, 1.0);
+}
+
+fn main_1() {
+  var param : vec2<f32>;
+  param = vec2<f32>(1.0, 1.0);
+  let x_29 : vec3<f32> = drawShape_vf2_(&(param));
+  color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/for-loop-with-return/0.spvasm b/test/vk-gl-cts/graphicsfuzz/for-loop-with-return/0.spvasm
new file mode 100644
index 0000000..f11e6d9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/for-loop-with-return/0.spvasm
@@ -0,0 +1,50 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %mand_ "mand("
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %6 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+          %9 = OpTypeFunction %v3float
+    %float_1 = OpConstant %float 1
+         %11 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %15 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %6
+         %16 = OpLabel
+         %17 = OpFunctionCall %v3float %mand_
+               OpBranch %18
+         %18 = OpLabel
+               OpLoopMerge %19 %20 None
+               OpBranch %21
+         %21 = OpLabel
+               OpStore %_GLF_color %15
+               OpReturn
+         %20 = OpLabel
+               OpBranch %18
+         %19 = OpLabel
+               OpUnreachable
+               OpFunctionEnd
+      %mand_ = OpFunction %v3float None %9
+         %22 = OpLabel
+               OpBranch %23
+         %23 = OpLabel
+               OpLoopMerge %24 %25 None
+               OpBranch %26
+         %26 = OpLabel
+               OpReturnValue %11
+         %25 = OpLabel
+               OpBranch %23
+         %24 = OpLabel
+               OpUnreachable
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/for-loop-with-return/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/for-loop-with-return/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..71965c1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/for-loop-with-return/0.spvasm.expected.hlsl
@@ -0,0 +1,31 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float3 mand_() {
+  while (true) {
+    return float3(1.0f, 1.0f, 1.0f);
+  }
+  return float3(0.0f, 0.0f, 0.0f);
+}
+
+void main_1() {
+  const float3 x_17 = mand_();
+  while (true) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    return;
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/for-loop-with-return/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/for-loop-with-return/0.spvasm.expected.msl
new file mode 100644
index 0000000..5b8b718
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/for-loop-with-return/0.spvasm.expected.msl
@@ -0,0 +1,34 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float3 mand_() {
+  while (true) {
+    return float3(1.0f, 1.0f, 1.0f);
+  }
+  return float3(0.0f, 0.0f, 0.0f);
+}
+
+void main_1(thread float4* const tint_symbol_4) {
+  float3 const x_17 = mand_();
+  while (true) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    return;
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/for-loop-with-return/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/for-loop-with-return/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..3e35963
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/for-loop-with-return/0.spvasm.expected.spvasm
@@ -0,0 +1,81 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 42
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %mand_ "mand_"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+    %v3float = OpTypeVector %float 3
+          %8 = OpTypeFunction %v3float
+    %float_1 = OpConstant %float 1
+         %17 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+    %float_0 = OpConstant %float 0
+         %19 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+         %29 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %30 = OpTypeFunction %void %main_out
+      %mand_ = OpFunction %v3float None %8
+         %11 = OpLabel
+               OpBranch %12
+         %12 = OpLabel
+               OpLoopMerge %13 %14 None
+               OpBranch %15
+         %15 = OpLabel
+               OpReturnValue %17
+         %14 = OpLabel
+               OpBranch %12
+         %13 = OpLabel
+               OpReturnValue %19
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+         %24 = OpFunctionCall %v3float %mand_
+               OpBranch %25
+         %25 = OpLabel
+               OpLoopMerge %26 %27 None
+               OpBranch %28
+         %28 = OpLabel
+               OpStore %x_GLF_color %29
+               OpReturn
+         %27 = OpLabel
+               OpBranch %25
+         %26 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %30
+%tint_symbol = OpFunctionParameter %main_out
+         %34 = OpLabel
+         %35 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %35
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+         %37 = OpLabel
+         %38 = OpFunctionCall %void %main_1
+         %40 = OpLoad %v4float %x_GLF_color
+         %41 = OpCompositeConstruct %main_out %40
+         %39 = OpFunctionCall %void %tint_symbol_2 %41
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/for-loop-with-return/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/for-loop-with-return/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..1478c3b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/for-loop-with-return/0.spvasm.expected.wgsl
@@ -0,0 +1,28 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn mand_() -> vec3<f32> {
+  loop {
+    return vec3<f32>(1.0, 1.0, 1.0);
+  }
+  return vec3<f32>(0.0, 0.0, 0.0);
+}
+
+fn main_1() {
+  let x_17 : vec3<f32> = mand_();
+  loop {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    return;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/for-loop-with-return/0.wgsl b/test/vk-gl-cts/graphicsfuzz/for-loop-with-return/0.wgsl
new file mode 100644
index 0000000..1478c3b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/for-loop-with-return/0.wgsl
@@ -0,0 +1,28 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn mand_() -> vec3<f32> {
+  loop {
+    return vec3<f32>(1.0, 1.0, 1.0);
+  }
+  return vec3<f32>(0.0, 0.0, 0.0);
+}
+
+fn main_1() {
+  let x_17 : vec3<f32> = mand_();
+  loop {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    return;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/for-loop-with-return/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/for-loop-with-return/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..71965c1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/for-loop-with-return/0.wgsl.expected.hlsl
@@ -0,0 +1,31 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float3 mand_() {
+  while (true) {
+    return float3(1.0f, 1.0f, 1.0f);
+  }
+  return float3(0.0f, 0.0f, 0.0f);
+}
+
+void main_1() {
+  const float3 x_17 = mand_();
+  while (true) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    return;
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/for-loop-with-return/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/for-loop-with-return/0.wgsl.expected.msl
new file mode 100644
index 0000000..5b8b718
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/for-loop-with-return/0.wgsl.expected.msl
@@ -0,0 +1,34 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float3 mand_() {
+  while (true) {
+    return float3(1.0f, 1.0f, 1.0f);
+  }
+  return float3(0.0f, 0.0f, 0.0f);
+}
+
+void main_1(thread float4* const tint_symbol_4) {
+  float3 const x_17 = mand_();
+  while (true) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    return;
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/for-loop-with-return/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/for-loop-with-return/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..3e35963
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/for-loop-with-return/0.wgsl.expected.spvasm
@@ -0,0 +1,81 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 42
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %mand_ "mand_"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+    %v3float = OpTypeVector %float 3
+          %8 = OpTypeFunction %v3float
+    %float_1 = OpConstant %float 1
+         %17 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+    %float_0 = OpConstant %float 0
+         %19 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+         %29 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %30 = OpTypeFunction %void %main_out
+      %mand_ = OpFunction %v3float None %8
+         %11 = OpLabel
+               OpBranch %12
+         %12 = OpLabel
+               OpLoopMerge %13 %14 None
+               OpBranch %15
+         %15 = OpLabel
+               OpReturnValue %17
+         %14 = OpLabel
+               OpBranch %12
+         %13 = OpLabel
+               OpReturnValue %19
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+         %24 = OpFunctionCall %v3float %mand_
+               OpBranch %25
+         %25 = OpLabel
+               OpLoopMerge %26 %27 None
+               OpBranch %28
+         %28 = OpLabel
+               OpStore %x_GLF_color %29
+               OpReturn
+         %27 = OpLabel
+               OpBranch %25
+         %26 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %30
+%tint_symbol = OpFunctionParameter %main_out
+         %34 = OpLabel
+         %35 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %35
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+         %37 = OpLabel
+         %38 = OpFunctionCall %void %main_1
+         %40 = OpLoad %v4float %x_GLF_color
+         %41 = OpCompositeConstruct %main_out %40
+         %39 = OpFunctionCall %void %tint_symbol_2 %41
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/for-loop-with-return/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/for-loop-with-return/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..1478c3b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/for-loop-with-return/0.wgsl.expected.wgsl
@@ -0,0 +1,28 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn mand_() -> vec3<f32> {
+  loop {
+    return vec3<f32>(1.0, 1.0, 1.0);
+  }
+  return vec3<f32>(0.0, 0.0, 0.0);
+}
+
+fn main_1() {
+  let x_17 : vec3<f32> = mand_();
+  loop {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    return;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/for-with-ifs-and-return/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/for-with-ifs-and-return/0-opt.spvasm
new file mode 100644
index 0000000..59f0b30
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/for-with-ifs-and-return/0-opt.spvasm
@@ -0,0 +1,78 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color %gl_FragCoord
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpName %i "i"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %i RelaxedPrecision
+               OpDecorate %6 RelaxedPrecision
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %7 RelaxedPrecision
+               OpDecorate %8 RelaxedPrecision
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %16 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+     %uint_0 = OpConstant %uint 0
+%float_226_695999 = OpConstant %float 226.695999
+         %28 = OpConstantComposite %v4float %float_226_695999 %float_1 %float_1 %float_1
+       %main = OpFunction %void None %10
+         %29 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+               OpStore %_GLF_color %16
+               OpStore %i %int_1
+               OpBranch %30
+         %30 = OpLabel
+               OpLoopMerge %31 %32 None
+               OpBranch %33
+         %33 = OpLabel
+          %6 = OpLoad %int %i
+         %34 = OpSLessThan %bool %6 %int_2
+               OpBranchConditional %34 %35 %31
+         %35 = OpLabel
+         %36 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %37 = OpLoad %float %36
+         %38 = OpFOrdLessThan %bool %37 %float_0
+               OpSelectionMerge %39 None
+               OpBranchConditional %38 %40 %39
+         %40 = OpLabel
+         %41 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %42 = OpLoad %float %41
+         %43 = OpFOrdLessThan %bool %42 %float_0
+               OpSelectionMerge %44 None
+               OpBranchConditional %43 %45 %44
+         %45 = OpLabel
+               OpStore %_GLF_color %28
+               OpBranch %44
+         %44 = OpLabel
+               OpBranch %32
+         %39 = OpLabel
+               OpReturn
+         %32 = OpLabel
+          %7 = OpLoad %int %i
+          %8 = OpIAdd %int %7 %int_1
+               OpStore %i %8
+               OpBranch %30
+         %31 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/for-with-ifs-and-return/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/for-with-ifs-and-return/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..2d3183d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/for-with-ifs-and-return/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,41 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int i = 0;
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  i = 1;
+  {
+    for(; (i < 2); i = (i + 1)) {
+      const float x_37 = gl_FragCoord.y;
+      if ((x_37 < 0.0f)) {
+        const float x_42 = gl_FragCoord.x;
+        if ((x_42 < 0.0f)) {
+          x_GLF_color = float4(226.695999146f, 1.0f, 1.0f, 1.0f);
+        }
+        continue;
+      }
+      return;
+    }
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/for-with-ifs-and-return/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/for-with-ifs-and-return/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..d32227c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/for-with-ifs-and-return/0-opt.spvasm.expected.msl
@@ -0,0 +1,51 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int i = 0;
+  *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  i = 1;
+  while (true) {
+    int const x_6 = i;
+    if ((x_6 < 2)) {
+    } else {
+      break;
+    }
+    float const x_37 = (*(tint_symbol_6)).y;
+    if ((x_37 < 0.0f)) {
+      float const x_42 = (*(tint_symbol_6)).x;
+      if ((x_42 < 0.0f)) {
+        *(tint_symbol_5) = float4(226.695999146f, 1.0f, 1.0f, 1.0f);
+      }
+      {
+        int const x_7 = i;
+        i = (x_7 + 1);
+      }
+      continue;
+    }
+    return;
+    {
+      int const x_7 = i;
+      i = (x_7 + 1);
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(&(tint_symbol_8), &(tint_symbol_7));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/for-with-ifs-and-return/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/for-with-ifs-and-return/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..42a7dcd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/for-with-ifs-and-return/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,114 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 65
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %21 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %uint_0 = OpConstant %uint 0
+%float_226_695999 = OpConstant %float 226.695999
+         %49 = OpConstantComposite %v4float %float_226_695999 %float_1 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+         %52 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %18
+               OpStore %x_GLF_color %21
+               OpStore %i %int_1
+               OpBranch %23
+         %23 = OpLabel
+               OpLoopMerge %24 %25 None
+               OpBranch %26
+         %26 = OpLabel
+         %27 = OpLoad %int %i
+         %29 = OpSLessThan %bool %27 %int_2
+               OpSelectionMerge %31 None
+               OpBranchConditional %29 %32 %33
+         %32 = OpLabel
+               OpBranch %31
+         %33 = OpLabel
+               OpBranch %24
+         %31 = OpLabel
+         %37 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %38 = OpLoad %float %37
+         %39 = OpFOrdLessThan %bool %38 %float_0
+               OpSelectionMerge %40 None
+               OpBranchConditional %39 %41 %40
+         %41 = OpLabel
+         %43 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %44 = OpLoad %float %43
+         %45 = OpFOrdLessThan %bool %44 %float_0
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %46
+         %47 = OpLabel
+               OpStore %x_GLF_color %49
+               OpBranch %46
+         %46 = OpLabel
+               OpBranch %25
+         %40 = OpLabel
+               OpReturn
+         %25 = OpLabel
+         %50 = OpLoad %int %i
+         %51 = OpIAdd %int %50 %int_1
+               OpStore %i %51
+               OpBranch %23
+         %24 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %52
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %56 = OpLabel
+         %57 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %57
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %59 = OpLabel
+         %60 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %60
+         %61 = OpFunctionCall %void %main_1
+         %63 = OpLoad %v4float %x_GLF_color
+         %64 = OpCompositeConstruct %main_out %63
+         %62 = OpFunctionCall %void %tint_symbol_3 %64
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/for-with-ifs-and-return/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/for-with-ifs-and-return/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..869d8a9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/for-with-ifs-and-return/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,43 @@
+var<private> x_GLF_color : vec4<f32>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  i = 1;
+  loop {
+    let x_6 : i32 = i;
+    if ((x_6 < 2)) {
+    } else {
+      break;
+    }
+    let x_37 : f32 = gl_FragCoord.y;
+    if ((x_37 < 0.0)) {
+      let x_42 : f32 = gl_FragCoord.x;
+      if ((x_42 < 0.0)) {
+        x_GLF_color = vec4<f32>(226.695999146, 1.0, 1.0, 1.0);
+      }
+      continue;
+    }
+    return;
+
+    continuing {
+      let x_7 : i32 = i;
+      i = (x_7 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/for-with-ifs-and-return/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/for-with-ifs-and-return/0-opt.wgsl
new file mode 100644
index 0000000..869d8a9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/for-with-ifs-and-return/0-opt.wgsl
@@ -0,0 +1,43 @@
+var<private> x_GLF_color : vec4<f32>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  i = 1;
+  loop {
+    let x_6 : i32 = i;
+    if ((x_6 < 2)) {
+    } else {
+      break;
+    }
+    let x_37 : f32 = gl_FragCoord.y;
+    if ((x_37 < 0.0)) {
+      let x_42 : f32 = gl_FragCoord.x;
+      if ((x_42 < 0.0)) {
+        x_GLF_color = vec4<f32>(226.695999146, 1.0, 1.0, 1.0);
+      }
+      continue;
+    }
+    return;
+
+    continuing {
+      let x_7 : i32 = i;
+      i = (x_7 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/for-with-ifs-and-return/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/for-with-ifs-and-return/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..2d3183d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/for-with-ifs-and-return/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,41 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int i = 0;
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  i = 1;
+  {
+    for(; (i < 2); i = (i + 1)) {
+      const float x_37 = gl_FragCoord.y;
+      if ((x_37 < 0.0f)) {
+        const float x_42 = gl_FragCoord.x;
+        if ((x_42 < 0.0f)) {
+          x_GLF_color = float4(226.695999146f, 1.0f, 1.0f, 1.0f);
+        }
+        continue;
+      }
+      return;
+    }
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/for-with-ifs-and-return/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/for-with-ifs-and-return/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..d32227c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/for-with-ifs-and-return/0-opt.wgsl.expected.msl
@@ -0,0 +1,51 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int i = 0;
+  *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  i = 1;
+  while (true) {
+    int const x_6 = i;
+    if ((x_6 < 2)) {
+    } else {
+      break;
+    }
+    float const x_37 = (*(tint_symbol_6)).y;
+    if ((x_37 < 0.0f)) {
+      float const x_42 = (*(tint_symbol_6)).x;
+      if ((x_42 < 0.0f)) {
+        *(tint_symbol_5) = float4(226.695999146f, 1.0f, 1.0f, 1.0f);
+      }
+      {
+        int const x_7 = i;
+        i = (x_7 + 1);
+      }
+      continue;
+    }
+    return;
+    {
+      int const x_7 = i;
+      i = (x_7 + 1);
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(&(tint_symbol_8), &(tint_symbol_7));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/for-with-ifs-and-return/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/for-with-ifs-and-return/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..42a7dcd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/for-with-ifs-and-return/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,114 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 65
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %21 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %uint_0 = OpConstant %uint 0
+%float_226_695999 = OpConstant %float 226.695999
+         %49 = OpConstantComposite %v4float %float_226_695999 %float_1 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+         %52 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %18
+               OpStore %x_GLF_color %21
+               OpStore %i %int_1
+               OpBranch %23
+         %23 = OpLabel
+               OpLoopMerge %24 %25 None
+               OpBranch %26
+         %26 = OpLabel
+         %27 = OpLoad %int %i
+         %29 = OpSLessThan %bool %27 %int_2
+               OpSelectionMerge %31 None
+               OpBranchConditional %29 %32 %33
+         %32 = OpLabel
+               OpBranch %31
+         %33 = OpLabel
+               OpBranch %24
+         %31 = OpLabel
+         %37 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %38 = OpLoad %float %37
+         %39 = OpFOrdLessThan %bool %38 %float_0
+               OpSelectionMerge %40 None
+               OpBranchConditional %39 %41 %40
+         %41 = OpLabel
+         %43 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %44 = OpLoad %float %43
+         %45 = OpFOrdLessThan %bool %44 %float_0
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %46
+         %47 = OpLabel
+               OpStore %x_GLF_color %49
+               OpBranch %46
+         %46 = OpLabel
+               OpBranch %25
+         %40 = OpLabel
+               OpReturn
+         %25 = OpLabel
+         %50 = OpLoad %int %i
+         %51 = OpIAdd %int %50 %int_1
+               OpStore %i %51
+               OpBranch %23
+         %24 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %52
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %56 = OpLabel
+         %57 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %57
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %59 = OpLabel
+         %60 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %60
+         %61 = OpFunctionCall %void %main_1
+         %63 = OpLoad %v4float %x_GLF_color
+         %64 = OpCompositeConstruct %main_out %63
+         %62 = OpFunctionCall %void %tint_symbol_3 %64
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/for-with-ifs-and-return/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/for-with-ifs-and-return/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..869d8a9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/for-with-ifs-and-return/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,43 @@
+var<private> x_GLF_color : vec4<f32>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  i = 1;
+  loop {
+    let x_6 : i32 = i;
+    if ((x_6 < 2)) {
+    } else {
+      break;
+    }
+    let x_37 : f32 = gl_FragCoord.y;
+    if ((x_37 < 0.0)) {
+      let x_42 : f32 = gl_FragCoord.x;
+      if ((x_42 < 0.0)) {
+        x_GLF_color = vec4<f32>(226.695999146, 1.0, 1.0, 1.0);
+      }
+      continue;
+    }
+    return;
+
+    continuing {
+      let x_7 : i32 = i;
+      i = (x_7 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/frag-coord-func-call-and-ifs/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/frag-coord-func-call-and-ifs/0-opt.spvasm
new file mode 100644
index 0000000..6435034
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/frag-coord-func-call-and-ifs/0-opt.spvasm
@@ -0,0 +1,206 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %alwaysZero_vf2_ "alwaysZero(vf2;"
+               OpName %coord "coord"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %b "b"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %zero "zero"
+               OpName %param "param"
+               OpName %_GLF_color "_GLF_color"
+               OpName %temp "temp"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+        %int = OpTypeInt 32 1
+         %20 = OpTypeFunction %int %_ptr_Function_v2float
+%_ptr_Function_float = OpTypePointer Function %float
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+   %float_50 = OpConstant %float 50
+       %bool = OpTypeBool
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_0 = OpConstant %float 0
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_1 = OpConstant %float 1
+      %int_1 = OpConstant %int 1
+%_ptr_Function_int = OpTypePointer Function %int
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %37 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+     %uint_0 = OpConstant %uint 0
+%_ptr_Output_float = OpTypePointer Output %float
+     %uint_2 = OpConstant %uint 2
+      %false = OpConstantFalse %bool
+       %main = OpFunction %void None %15
+         %42 = OpLabel
+         %43 = OpVariable %_ptr_Function_float Function
+         %44 = OpVariable %_ptr_Function_float Function
+         %45 = OpVariable %_ptr_Function_float Function
+         %46 = OpVariable %_ptr_Function_int Function
+       %zero = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_v2float Function
+       %temp = OpVariable %_ptr_Function_v2float Function
+         %47 = OpLoad %v4float %gl_FragCoord
+         %48 = OpVectorShuffle %v2float %47 %47 0 1
+               OpStore %param %48
+               OpBranch %49
+         %49 = OpLabel
+               OpLoopMerge %50 %51 None
+               OpBranch %52
+         %52 = OpLabel
+         %53 = OpAccessChain %_ptr_Function_float %param %uint_1
+         %54 = OpLoad %float %53
+         %55 = OpFOrdLessThan %bool %54 %float_50
+               OpSelectionMerge %56 None
+               OpBranchConditional %55 %57 %58
+         %57 = OpLabel
+         %59 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %60 = OpLoad %float %59
+               OpStore %44 %60
+               OpBranch %56
+         %58 = OpLabel
+               OpStore %44 %float_0
+               OpBranch %56
+         %56 = OpLabel
+         %61 = OpLoad %float %44
+               OpStore %43 %61
+         %62 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %63 = OpLoad %float %62
+         %64 = OpFOrdLessThan %bool %63 %float_50
+         %65 = OpSelect %float %64 %float_1 %float_0
+               OpStore %45 %65
+         %66 = OpFSub %float %61 %65
+         %67 = OpFOrdLessThan %bool %66 %float_1
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %68
+         %69 = OpLabel
+               OpStore %46 %int_0
+               OpBranch %50
+         %68 = OpLabel
+               OpStore %46 %int_1
+               OpBranch %50
+         %51 = OpLabel
+               OpBranchConditional %false %49 %50
+         %50 = OpLabel
+         %70 = OpLoad %int %46
+               OpStore %zero %70
+         %71 = OpIEqual %bool %70 %int_1
+               OpSelectionMerge %72 None
+               OpBranchConditional %71 %73 %72
+         %73 = OpLabel
+               OpReturn
+         %72 = OpLabel
+               OpStore %_GLF_color %37
+         %74 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %75 = OpLoad %float %74
+         %76 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %77 = OpLoad %float %76
+         %78 = OpFOrdGreaterThanEqual %bool %75 %77
+               OpSelectionMerge %79 None
+               OpBranchConditional %78 %80 %79
+         %80 = OpLabel
+         %81 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %82 = OpLoad %float %81
+         %83 = OpFOrdGreaterThanEqual %bool %82 %float_0
+               OpSelectionMerge %84 None
+               OpBranchConditional %83 %85 %84
+         %85 = OpLabel
+         %86 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %87 = OpLoad %float %86
+         %88 = OpAccessChain %_ptr_Output_float %_GLF_color %uint_0
+               OpStore %88 %87
+               OpBranch %84
+         %84 = OpLabel
+               OpBranch %79
+         %79 = OpLabel
+         %89 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %90 = OpLoad %float %89
+         %91 = OpFOrdGreaterThanEqual %bool %90 %float_0
+               OpSelectionMerge %92 None
+               OpBranchConditional %91 %93 %92
+         %93 = OpLabel
+         %94 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %95 = OpLoad %float %94
+         %96 = OpAccessChain %_ptr_Output_float %_GLF_color %uint_1
+               OpStore %96 %95
+               OpBranch %92
+         %92 = OpLabel
+         %97 = OpLoad %v4float %gl_FragCoord
+         %98 = OpVectorShuffle %v2float %97 %97 0 1
+         %99 = OpCompositeExtract %float %98 0
+        %100 = OpCompositeExtract %float %98 1
+        %101 = OpCompositeConstruct %v2float %99 %100
+               OpStore %temp %101
+        %102 = OpCompositeExtract %float %101 1
+        %103 = OpFOrdGreaterThanEqual %bool %102 %float_0
+               OpSelectionMerge %104 None
+               OpBranchConditional %103 %105 %104
+        %105 = OpLabel
+        %106 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+        %107 = OpLoad %float %106
+        %108 = OpAccessChain %_ptr_Output_float %_GLF_color %uint_2
+               OpStore %108 %107
+               OpBranch %104
+        %104 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%alwaysZero_vf2_ = OpFunction %int None %20
+      %coord = OpFunctionParameter %_ptr_Function_v2float
+        %109 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function
+        %110 = OpVariable %_ptr_Function_float Function
+          %b = OpVariable %_ptr_Function_float Function
+        %111 = OpAccessChain %_ptr_Function_float %coord %uint_1
+        %112 = OpLoad %float %111
+        %113 = OpFOrdLessThan %bool %112 %float_50
+               OpSelectionMerge %114 None
+               OpBranchConditional %113 %115 %116
+        %115 = OpLabel
+        %117 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+        %118 = OpLoad %float %117
+               OpStore %110 %118
+               OpBranch %114
+        %116 = OpLabel
+               OpStore %110 %float_0
+               OpBranch %114
+        %114 = OpLabel
+        %119 = OpLoad %float %110
+               OpStore %a %119
+        %120 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %121 = OpLoad %float %120
+        %122 = OpFOrdLessThan %bool %121 %float_50
+        %123 = OpSelect %float %122 %float_1 %float_0
+               OpStore %b %123
+        %124 = OpFSub %float %119 %123
+        %125 = OpFOrdLessThan %bool %124 %float_1
+               OpSelectionMerge %126 None
+               OpBranchConditional %125 %127 %126
+        %127 = OpLabel
+               OpReturnValue %int_0
+        %126 = OpLabel
+               OpReturnValue %int_1
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/frag-coord-func-call-and-ifs/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/frag-coord-func-call-and-ifs/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..3bb430f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/frag-coord-func-call-and-ifs/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,113 @@
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float x_43 = 0.0f;
+  float x_44 = 0.0f;
+  float x_45 = 0.0f;
+  int x_46 = 0;
+  int zero = 0;
+  float2 param = float2(0.0f, 0.0f);
+  float2 temp = float2(0.0f, 0.0f);
+  const float4 x_47 = gl_FragCoord;
+  param = float2(x_47.x, x_47.y);
+  while (true) {
+    const float x_54 = param.y;
+    if ((x_54 < 50.0f)) {
+      const float x_60 = asfloat(x_9[0].y);
+      x_44 = x_60;
+    } else {
+      x_44 = 0.0f;
+    }
+    const float x_61 = x_44;
+    x_43 = x_61;
+    const float x_63 = gl_FragCoord.y;
+    const float x_65 = ((x_63 < 50.0f) ? 1.0f : 0.0f);
+    x_45 = x_65;
+    if (((x_61 - x_65) < 1.0f)) {
+      x_46 = 0;
+      break;
+    }
+    x_46 = 1;
+    break;
+    {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  const int x_70 = x_46;
+  zero = x_70;
+  if ((x_70 == 1)) {
+    return;
+  }
+  x_GLF_color = float4(0.0f, 1.0f, 1.0f, 1.0f);
+  const float x_75 = gl_FragCoord.x;
+  const float x_77 = asfloat(x_9[0].x);
+  if ((x_75 >= x_77)) {
+    const float x_82 = gl_FragCoord.y;
+    if ((x_82 >= 0.0f)) {
+      const float x_87 = asfloat(x_9[0].y);
+      x_GLF_color.x = x_87;
+    }
+  }
+  const float x_90 = gl_FragCoord.y;
+  if ((x_90 >= 0.0f)) {
+    const float x_95 = asfloat(x_9[0].x);
+    x_GLF_color.y = x_95;
+  }
+  const float4 x_97 = gl_FragCoord;
+  const float2 x_98 = float2(x_97.x, x_97.y);
+  const float2 x_101 = float2(x_98.x, x_98.y);
+  temp = x_101;
+  if ((x_101.y >= 0.0f)) {
+    const float x_107 = asfloat(x_9[0].x);
+    x_GLF_color.z = x_107;
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
+int alwaysZero_vf2_(inout float2 coord) {
+  float a = 0.0f;
+  float x_110 = 0.0f;
+  float b = 0.0f;
+  const float x_112 = coord.y;
+  if ((x_112 < 50.0f)) {
+    const float x_118 = asfloat(x_9[0].y);
+    x_110 = x_118;
+  } else {
+    x_110 = 0.0f;
+  }
+  const float x_119 = x_110;
+  a = x_119;
+  const float x_121 = gl_FragCoord.y;
+  const float x_123 = ((x_121 < 50.0f) ? 1.0f : 0.0f);
+  b = x_123;
+  if (((x_119 - x_123) < 1.0f)) {
+    return 0;
+  }
+  return 1;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/frag-coord-func-call-and-ifs/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/frag-coord-func-call-and-ifs/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..01561c4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/frag-coord-func-call-and-ifs/0-opt.spvasm.expected.msl
@@ -0,0 +1,112 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_9, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float x_43 = 0.0f;
+  float x_44 = 0.0f;
+  float x_45 = 0.0f;
+  int x_46 = 0;
+  int zero = 0;
+  float2 param = 0.0f;
+  float2 temp = 0.0f;
+  float4 const x_47 = *(tint_symbol_5);
+  param = float2(x_47.x, x_47.y);
+  while (true) {
+    float const x_54 = param.y;
+    if ((x_54 < 50.0f)) {
+      float const x_60 = x_9.injectionSwitch.y;
+      x_44 = x_60;
+    } else {
+      x_44 = 0.0f;
+    }
+    float const x_61 = x_44;
+    x_43 = x_61;
+    float const x_63 = (*(tint_symbol_5)).y;
+    float const x_65 = select(0.0f, 1.0f, (x_63 < 50.0f));
+    x_45 = x_65;
+    if (((x_61 - x_65) < 1.0f)) {
+      x_46 = 0;
+      break;
+    }
+    x_46 = 1;
+    break;
+    {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  int const x_70 = x_46;
+  zero = x_70;
+  if ((x_70 == 1)) {
+    return;
+  }
+  *(tint_symbol_6) = float4(0.0f, 1.0f, 1.0f, 1.0f);
+  float const x_75 = (*(tint_symbol_5)).x;
+  float const x_77 = x_9.injectionSwitch.x;
+  if ((x_75 >= x_77)) {
+    float const x_82 = (*(tint_symbol_5)).y;
+    if ((x_82 >= 0.0f)) {
+      float const x_87 = x_9.injectionSwitch.y;
+      (*(tint_symbol_6)).x = x_87;
+    }
+  }
+  float const x_90 = (*(tint_symbol_5)).y;
+  if ((x_90 >= 0.0f)) {
+    float const x_95 = x_9.injectionSwitch.x;
+    (*(tint_symbol_6)).y = x_95;
+  }
+  float4 const x_97 = *(tint_symbol_5);
+  float2 const x_98 = float2(x_97.x, x_97.y);
+  float2 const x_101 = float2(x_98.x, x_98.y);
+  temp = x_101;
+  if ((x_101.y >= 0.0f)) {
+    float const x_107 = x_9.injectionSwitch.x;
+    (*(tint_symbol_6)).z = x_107;
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_9, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
+int alwaysZero_vf2_(constant buf0& x_9, thread float2* const coord, thread float4* const tint_symbol_9) {
+  float a = 0.0f;
+  float x_110 = 0.0f;
+  float b = 0.0f;
+  float const x_112 = (*(coord)).y;
+  if ((x_112 < 50.0f)) {
+    float const x_118 = x_9.injectionSwitch.y;
+    x_110 = x_118;
+  } else {
+    x_110 = 0.0f;
+  }
+  float const x_119 = x_110;
+  a = x_119;
+  float const x_121 = (*(tint_symbol_9)).y;
+  float const x_123 = select(0.0f, 1.0f, (x_121 < 50.0f));
+  b = x_123;
+  if (((x_119 - x_123) < 1.0f)) {
+    return 0;
+  }
+  return 1;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/frag-coord-func-call-and-ifs/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/frag-coord-func-call-and-ifs/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..7cdda6c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/frag-coord-func-call-and-ifs/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,259 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 154
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_9 "x_9"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %x_43 "x_43"
+               OpName %x_44 "x_44"
+               OpName %x_45 "x_45"
+               OpName %x_46 "x_46"
+               OpName %zero "zero"
+               OpName %param "param"
+               OpName %temp "temp"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpName %alwaysZero_vf2_ "alwaysZero_vf2_"
+               OpName %coord "coord"
+               OpName %a "a"
+               OpName %x_110 "x_110"
+               OpName %b "b"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %21 = OpConstantNull %float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %27 = OpConstantNull %int
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %31 = OpConstantNull %v2float
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+   %float_50 = OpConstant %float 50
+       %bool = OpTypeBool
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_0 = OpConstant %float 0
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_1 = OpConstant %float 1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+      %false = OpConstantFalse %bool
+         %77 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+     %uint_2 = OpConstant %uint 2
+   %main_out = OpTypeStruct %v4float
+        %116 = OpTypeFunction %void %main_out
+        %129 = OpTypeFunction %int %_ptr_Function_v2float
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+       %x_43 = OpVariable %_ptr_Function_float Function %21
+       %x_44 = OpVariable %_ptr_Function_float Function %21
+       %x_45 = OpVariable %_ptr_Function_float Function %21
+       %x_46 = OpVariable %_ptr_Function_int Function %27
+       %zero = OpVariable %_ptr_Function_int Function %27
+      %param = OpVariable %_ptr_Function_v2float Function %31
+       %temp = OpVariable %_ptr_Function_v2float Function %31
+         %33 = OpLoad %v4float %gl_FragCoord
+         %34 = OpCompositeExtract %float %33 0
+         %35 = OpCompositeExtract %float %33 1
+         %36 = OpCompositeConstruct %v2float %34 %35
+               OpStore %param %36
+               OpBranch %37
+         %37 = OpLabel
+               OpLoopMerge %38 %39 None
+               OpBranch %40
+         %40 = OpLabel
+         %43 = OpAccessChain %_ptr_Function_float %param %uint_1
+         %44 = OpLoad %float %43
+         %46 = OpFOrdLessThan %bool %44 %float_50
+               OpSelectionMerge %48 None
+               OpBranchConditional %46 %49 %50
+         %49 = OpLabel
+         %53 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_1
+         %54 = OpLoad %float %53
+               OpStore %x_44 %54
+               OpBranch %48
+         %50 = OpLabel
+               OpStore %x_44 %float_0
+               OpBranch %48
+         %48 = OpLabel
+         %56 = OpLoad %float %x_44
+               OpStore %x_43 %56
+         %58 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %59 = OpLoad %float %58
+         %61 = OpFOrdLessThan %bool %59 %float_50
+         %60 = OpSelect %float %61 %float_1 %float_0
+               OpStore %x_45 %60
+         %63 = OpFSub %float %56 %60
+         %64 = OpFOrdLessThan %bool %63 %float_1
+               OpSelectionMerge %65 None
+               OpBranchConditional %64 %66 %65
+         %66 = OpLabel
+               OpStore %x_46 %int_0
+               OpBranch %38
+         %65 = OpLabel
+               OpStore %x_46 %int_1
+               OpBranch %38
+         %39 = OpLabel
+               OpSelectionMerge %70 None
+               OpBranchConditional %false %71 %72
+         %71 = OpLabel
+               OpBranch %70
+         %72 = OpLabel
+               OpBranch %38
+         %70 = OpLabel
+               OpBranch %37
+         %38 = OpLabel
+         %73 = OpLoad %int %x_46
+               OpStore %zero %73
+         %74 = OpIEqual %bool %73 %int_1
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %75
+         %76 = OpLabel
+               OpReturn
+         %75 = OpLabel
+               OpStore %x_GLF_color %77
+         %78 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %79 = OpLoad %float %78
+         %80 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_0
+         %81 = OpLoad %float %80
+         %82 = OpFOrdGreaterThanEqual %bool %79 %81
+               OpSelectionMerge %83 None
+               OpBranchConditional %82 %84 %83
+         %84 = OpLabel
+         %85 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %86 = OpLoad %float %85
+         %87 = OpFOrdGreaterThanEqual %bool %86 %float_0
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %88
+         %89 = OpLabel
+         %90 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_1
+         %91 = OpLoad %float %90
+         %92 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_0
+               OpStore %92 %91
+               OpBranch %88
+         %88 = OpLabel
+               OpBranch %83
+         %83 = OpLabel
+         %93 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %94 = OpLoad %float %93
+         %95 = OpFOrdGreaterThanEqual %bool %94 %float_0
+               OpSelectionMerge %96 None
+               OpBranchConditional %95 %97 %96
+         %97 = OpLabel
+         %98 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_0
+         %99 = OpLoad %float %98
+        %100 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_1
+               OpStore %100 %99
+               OpBranch %96
+         %96 = OpLabel
+        %101 = OpLoad %v4float %gl_FragCoord
+        %102 = OpCompositeExtract %float %101 0
+        %103 = OpCompositeExtract %float %101 1
+        %104 = OpCompositeConstruct %v2float %102 %103
+        %105 = OpCompositeExtract %float %104 0
+        %106 = OpCompositeExtract %float %104 1
+        %107 = OpCompositeConstruct %v2float %105 %106
+               OpStore %temp %107
+        %108 = OpCompositeExtract %float %107 1
+        %109 = OpFOrdGreaterThanEqual %bool %108 %float_0
+               OpSelectionMerge %110 None
+               OpBranchConditional %109 %111 %110
+        %111 = OpLabel
+        %112 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_0
+        %113 = OpLoad %float %112
+        %115 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_2
+               OpStore %115 %113
+               OpBranch %110
+        %110 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %116
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %120 = OpLabel
+        %121 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %121
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %123 = OpLabel
+        %124 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %124
+        %125 = OpFunctionCall %void %main_1
+        %127 = OpLoad %v4float %x_GLF_color
+        %128 = OpCompositeConstruct %main_out %127
+        %126 = OpFunctionCall %void %tint_symbol_3 %128
+               OpReturn
+               OpFunctionEnd
+%alwaysZero_vf2_ = OpFunction %int None %129
+      %coord = OpFunctionParameter %_ptr_Function_v2float
+        %132 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function %21
+      %x_110 = OpVariable %_ptr_Function_float Function %21
+          %b = OpVariable %_ptr_Function_float Function %21
+        %137 = OpAccessChain %_ptr_Function_float %coord %uint_1
+        %138 = OpLoad %float %137
+        %139 = OpFOrdLessThan %bool %138 %float_50
+               OpSelectionMerge %140 None
+               OpBranchConditional %139 %141 %142
+        %141 = OpLabel
+        %143 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_1
+        %144 = OpLoad %float %143
+               OpStore %x_110 %144
+               OpBranch %140
+        %142 = OpLabel
+               OpStore %x_110 %float_0
+               OpBranch %140
+        %140 = OpLabel
+        %145 = OpLoad %float %x_110
+               OpStore %a %145
+        %146 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %147 = OpLoad %float %146
+        %149 = OpFOrdLessThan %bool %147 %float_50
+        %148 = OpSelect %float %149 %float_1 %float_0
+               OpStore %b %148
+        %150 = OpFSub %float %145 %148
+        %151 = OpFOrdLessThan %bool %150 %float_1
+               OpSelectionMerge %152 None
+               OpBranchConditional %151 %153 %152
+        %153 = OpLabel
+               OpReturnValue %int_0
+        %152 = OpLabel
+               OpReturnValue %int_1
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/frag-coord-func-call-and-ifs/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/frag-coord-func-call-and-ifs/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..f94238d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/frag-coord-func-call-and-ifs/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,112 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_43 : f32;
+  var x_44 : f32;
+  var x_45 : f32;
+  var x_46 : i32;
+  var zero : i32;
+  var param : vec2<f32>;
+  var temp : vec2<f32>;
+  let x_47 : vec4<f32> = gl_FragCoord;
+  param = vec2<f32>(x_47.x, x_47.y);
+  loop {
+    let x_54 : f32 = param.y;
+    if ((x_54 < 50.0)) {
+      let x_60 : f32 = x_9.injectionSwitch.y;
+      x_44 = x_60;
+    } else {
+      x_44 = 0.0;
+    }
+    let x_61 : f32 = x_44;
+    x_43 = x_61;
+    let x_63 : f32 = gl_FragCoord.y;
+    let x_65 : f32 = select(0.0, 1.0, (x_63 < 50.0));
+    x_45 = x_65;
+    if (((x_61 - x_65) < 1.0)) {
+      x_46 = 0;
+      break;
+    }
+    x_46 = 1;
+    break;
+
+    continuing {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_70 : i32 = x_46;
+  zero = x_70;
+  if ((x_70 == 1)) {
+    return;
+  }
+  x_GLF_color = vec4<f32>(0.0, 1.0, 1.0, 1.0);
+  let x_75 : f32 = gl_FragCoord.x;
+  let x_77 : f32 = x_9.injectionSwitch.x;
+  if ((x_75 >= x_77)) {
+    let x_82 : f32 = gl_FragCoord.y;
+    if ((x_82 >= 0.0)) {
+      let x_87 : f32 = x_9.injectionSwitch.y;
+      x_GLF_color.x = x_87;
+    }
+  }
+  let x_90 : f32 = gl_FragCoord.y;
+  if ((x_90 >= 0.0)) {
+    let x_95 : f32 = x_9.injectionSwitch.x;
+    x_GLF_color.y = x_95;
+  }
+  let x_97 : vec4<f32> = gl_FragCoord;
+  let x_98 : vec2<f32> = vec2<f32>(x_97.x, x_97.y);
+  let x_101 : vec2<f32> = vec2<f32>(x_98.x, x_98.y);
+  temp = x_101;
+  if ((x_101.y >= 0.0)) {
+    let x_107 : f32 = x_9.injectionSwitch.x;
+    x_GLF_color.z = x_107;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+fn alwaysZero_vf2_(coord : ptr<function, vec2<f32>>) -> i32 {
+  var a : f32;
+  var x_110 : f32;
+  var b : f32;
+  let x_112 : f32 = (*(coord)).y;
+  if ((x_112 < 50.0)) {
+    let x_118 : f32 = x_9.injectionSwitch.y;
+    x_110 = x_118;
+  } else {
+    x_110 = 0.0;
+  }
+  let x_119 : f32 = x_110;
+  a = x_119;
+  let x_121 : f32 = gl_FragCoord.y;
+  let x_123 : f32 = select(0.0, 1.0, (x_121 < 50.0));
+  b = x_123;
+  if (((x_119 - x_123) < 1.0)) {
+    return 0;
+  }
+  return 1;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/frag-coord-func-call-and-ifs/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/frag-coord-func-call-and-ifs/0-opt.wgsl
new file mode 100644
index 0000000..f94238d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/frag-coord-func-call-and-ifs/0-opt.wgsl
@@ -0,0 +1,112 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_43 : f32;
+  var x_44 : f32;
+  var x_45 : f32;
+  var x_46 : i32;
+  var zero : i32;
+  var param : vec2<f32>;
+  var temp : vec2<f32>;
+  let x_47 : vec4<f32> = gl_FragCoord;
+  param = vec2<f32>(x_47.x, x_47.y);
+  loop {
+    let x_54 : f32 = param.y;
+    if ((x_54 < 50.0)) {
+      let x_60 : f32 = x_9.injectionSwitch.y;
+      x_44 = x_60;
+    } else {
+      x_44 = 0.0;
+    }
+    let x_61 : f32 = x_44;
+    x_43 = x_61;
+    let x_63 : f32 = gl_FragCoord.y;
+    let x_65 : f32 = select(0.0, 1.0, (x_63 < 50.0));
+    x_45 = x_65;
+    if (((x_61 - x_65) < 1.0)) {
+      x_46 = 0;
+      break;
+    }
+    x_46 = 1;
+    break;
+
+    continuing {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_70 : i32 = x_46;
+  zero = x_70;
+  if ((x_70 == 1)) {
+    return;
+  }
+  x_GLF_color = vec4<f32>(0.0, 1.0, 1.0, 1.0);
+  let x_75 : f32 = gl_FragCoord.x;
+  let x_77 : f32 = x_9.injectionSwitch.x;
+  if ((x_75 >= x_77)) {
+    let x_82 : f32 = gl_FragCoord.y;
+    if ((x_82 >= 0.0)) {
+      let x_87 : f32 = x_9.injectionSwitch.y;
+      x_GLF_color.x = x_87;
+    }
+  }
+  let x_90 : f32 = gl_FragCoord.y;
+  if ((x_90 >= 0.0)) {
+    let x_95 : f32 = x_9.injectionSwitch.x;
+    x_GLF_color.y = x_95;
+  }
+  let x_97 : vec4<f32> = gl_FragCoord;
+  let x_98 : vec2<f32> = vec2<f32>(x_97.x, x_97.y);
+  let x_101 : vec2<f32> = vec2<f32>(x_98.x, x_98.y);
+  temp = x_101;
+  if ((x_101.y >= 0.0)) {
+    let x_107 : f32 = x_9.injectionSwitch.x;
+    x_GLF_color.z = x_107;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+fn alwaysZero_vf2_(coord : ptr<function, vec2<f32>>) -> i32 {
+  var a : f32;
+  var x_110 : f32;
+  var b : f32;
+  let x_112 : f32 = (*(coord)).y;
+  if ((x_112 < 50.0)) {
+    let x_118 : f32 = x_9.injectionSwitch.y;
+    x_110 = x_118;
+  } else {
+    x_110 = 0.0;
+  }
+  let x_119 : f32 = x_110;
+  a = x_119;
+  let x_121 : f32 = gl_FragCoord.y;
+  let x_123 : f32 = select(0.0, 1.0, (x_121 < 50.0));
+  b = x_123;
+  if (((x_119 - x_123) < 1.0)) {
+    return 0;
+  }
+  return 1;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/frag-coord-func-call-and-ifs/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/frag-coord-func-call-and-ifs/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..3bb430f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/frag-coord-func-call-and-ifs/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,113 @@
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float x_43 = 0.0f;
+  float x_44 = 0.0f;
+  float x_45 = 0.0f;
+  int x_46 = 0;
+  int zero = 0;
+  float2 param = float2(0.0f, 0.0f);
+  float2 temp = float2(0.0f, 0.0f);
+  const float4 x_47 = gl_FragCoord;
+  param = float2(x_47.x, x_47.y);
+  while (true) {
+    const float x_54 = param.y;
+    if ((x_54 < 50.0f)) {
+      const float x_60 = asfloat(x_9[0].y);
+      x_44 = x_60;
+    } else {
+      x_44 = 0.0f;
+    }
+    const float x_61 = x_44;
+    x_43 = x_61;
+    const float x_63 = gl_FragCoord.y;
+    const float x_65 = ((x_63 < 50.0f) ? 1.0f : 0.0f);
+    x_45 = x_65;
+    if (((x_61 - x_65) < 1.0f)) {
+      x_46 = 0;
+      break;
+    }
+    x_46 = 1;
+    break;
+    {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  const int x_70 = x_46;
+  zero = x_70;
+  if ((x_70 == 1)) {
+    return;
+  }
+  x_GLF_color = float4(0.0f, 1.0f, 1.0f, 1.0f);
+  const float x_75 = gl_FragCoord.x;
+  const float x_77 = asfloat(x_9[0].x);
+  if ((x_75 >= x_77)) {
+    const float x_82 = gl_FragCoord.y;
+    if ((x_82 >= 0.0f)) {
+      const float x_87 = asfloat(x_9[0].y);
+      x_GLF_color.x = x_87;
+    }
+  }
+  const float x_90 = gl_FragCoord.y;
+  if ((x_90 >= 0.0f)) {
+    const float x_95 = asfloat(x_9[0].x);
+    x_GLF_color.y = x_95;
+  }
+  const float4 x_97 = gl_FragCoord;
+  const float2 x_98 = float2(x_97.x, x_97.y);
+  const float2 x_101 = float2(x_98.x, x_98.y);
+  temp = x_101;
+  if ((x_101.y >= 0.0f)) {
+    const float x_107 = asfloat(x_9[0].x);
+    x_GLF_color.z = x_107;
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
+int alwaysZero_vf2_(inout float2 coord) {
+  float a = 0.0f;
+  float x_110 = 0.0f;
+  float b = 0.0f;
+  const float x_112 = coord.y;
+  if ((x_112 < 50.0f)) {
+    const float x_118 = asfloat(x_9[0].y);
+    x_110 = x_118;
+  } else {
+    x_110 = 0.0f;
+  }
+  const float x_119 = x_110;
+  a = x_119;
+  const float x_121 = gl_FragCoord.y;
+  const float x_123 = ((x_121 < 50.0f) ? 1.0f : 0.0f);
+  b = x_123;
+  if (((x_119 - x_123) < 1.0f)) {
+    return 0;
+  }
+  return 1;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/frag-coord-func-call-and-ifs/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/frag-coord-func-call-and-ifs/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..01561c4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/frag-coord-func-call-and-ifs/0-opt.wgsl.expected.msl
@@ -0,0 +1,112 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_9, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float x_43 = 0.0f;
+  float x_44 = 0.0f;
+  float x_45 = 0.0f;
+  int x_46 = 0;
+  int zero = 0;
+  float2 param = 0.0f;
+  float2 temp = 0.0f;
+  float4 const x_47 = *(tint_symbol_5);
+  param = float2(x_47.x, x_47.y);
+  while (true) {
+    float const x_54 = param.y;
+    if ((x_54 < 50.0f)) {
+      float const x_60 = x_9.injectionSwitch.y;
+      x_44 = x_60;
+    } else {
+      x_44 = 0.0f;
+    }
+    float const x_61 = x_44;
+    x_43 = x_61;
+    float const x_63 = (*(tint_symbol_5)).y;
+    float const x_65 = select(0.0f, 1.0f, (x_63 < 50.0f));
+    x_45 = x_65;
+    if (((x_61 - x_65) < 1.0f)) {
+      x_46 = 0;
+      break;
+    }
+    x_46 = 1;
+    break;
+    {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  int const x_70 = x_46;
+  zero = x_70;
+  if ((x_70 == 1)) {
+    return;
+  }
+  *(tint_symbol_6) = float4(0.0f, 1.0f, 1.0f, 1.0f);
+  float const x_75 = (*(tint_symbol_5)).x;
+  float const x_77 = x_9.injectionSwitch.x;
+  if ((x_75 >= x_77)) {
+    float const x_82 = (*(tint_symbol_5)).y;
+    if ((x_82 >= 0.0f)) {
+      float const x_87 = x_9.injectionSwitch.y;
+      (*(tint_symbol_6)).x = x_87;
+    }
+  }
+  float const x_90 = (*(tint_symbol_5)).y;
+  if ((x_90 >= 0.0f)) {
+    float const x_95 = x_9.injectionSwitch.x;
+    (*(tint_symbol_6)).y = x_95;
+  }
+  float4 const x_97 = *(tint_symbol_5);
+  float2 const x_98 = float2(x_97.x, x_97.y);
+  float2 const x_101 = float2(x_98.x, x_98.y);
+  temp = x_101;
+  if ((x_101.y >= 0.0f)) {
+    float const x_107 = x_9.injectionSwitch.x;
+    (*(tint_symbol_6)).z = x_107;
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_9, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
+int alwaysZero_vf2_(constant buf0& x_9, thread float2* const coord, thread float4* const tint_symbol_9) {
+  float a = 0.0f;
+  float x_110 = 0.0f;
+  float b = 0.0f;
+  float const x_112 = (*(coord)).y;
+  if ((x_112 < 50.0f)) {
+    float const x_118 = x_9.injectionSwitch.y;
+    x_110 = x_118;
+  } else {
+    x_110 = 0.0f;
+  }
+  float const x_119 = x_110;
+  a = x_119;
+  float const x_121 = (*(tint_symbol_9)).y;
+  float const x_123 = select(0.0f, 1.0f, (x_121 < 50.0f));
+  b = x_123;
+  if (((x_119 - x_123) < 1.0f)) {
+    return 0;
+  }
+  return 1;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/frag-coord-func-call-and-ifs/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/frag-coord-func-call-and-ifs/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..7cdda6c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/frag-coord-func-call-and-ifs/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,259 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 154
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_9 "x_9"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %x_43 "x_43"
+               OpName %x_44 "x_44"
+               OpName %x_45 "x_45"
+               OpName %x_46 "x_46"
+               OpName %zero "zero"
+               OpName %param "param"
+               OpName %temp "temp"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpName %alwaysZero_vf2_ "alwaysZero_vf2_"
+               OpName %coord "coord"
+               OpName %a "a"
+               OpName %x_110 "x_110"
+               OpName %b "b"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %21 = OpConstantNull %float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %27 = OpConstantNull %int
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %31 = OpConstantNull %v2float
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+   %float_50 = OpConstant %float 50
+       %bool = OpTypeBool
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_0 = OpConstant %float 0
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_1 = OpConstant %float 1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+      %false = OpConstantFalse %bool
+         %77 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+     %uint_2 = OpConstant %uint 2
+   %main_out = OpTypeStruct %v4float
+        %116 = OpTypeFunction %void %main_out
+        %129 = OpTypeFunction %int %_ptr_Function_v2float
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+       %x_43 = OpVariable %_ptr_Function_float Function %21
+       %x_44 = OpVariable %_ptr_Function_float Function %21
+       %x_45 = OpVariable %_ptr_Function_float Function %21
+       %x_46 = OpVariable %_ptr_Function_int Function %27
+       %zero = OpVariable %_ptr_Function_int Function %27
+      %param = OpVariable %_ptr_Function_v2float Function %31
+       %temp = OpVariable %_ptr_Function_v2float Function %31
+         %33 = OpLoad %v4float %gl_FragCoord
+         %34 = OpCompositeExtract %float %33 0
+         %35 = OpCompositeExtract %float %33 1
+         %36 = OpCompositeConstruct %v2float %34 %35
+               OpStore %param %36
+               OpBranch %37
+         %37 = OpLabel
+               OpLoopMerge %38 %39 None
+               OpBranch %40
+         %40 = OpLabel
+         %43 = OpAccessChain %_ptr_Function_float %param %uint_1
+         %44 = OpLoad %float %43
+         %46 = OpFOrdLessThan %bool %44 %float_50
+               OpSelectionMerge %48 None
+               OpBranchConditional %46 %49 %50
+         %49 = OpLabel
+         %53 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_1
+         %54 = OpLoad %float %53
+               OpStore %x_44 %54
+               OpBranch %48
+         %50 = OpLabel
+               OpStore %x_44 %float_0
+               OpBranch %48
+         %48 = OpLabel
+         %56 = OpLoad %float %x_44
+               OpStore %x_43 %56
+         %58 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %59 = OpLoad %float %58
+         %61 = OpFOrdLessThan %bool %59 %float_50
+         %60 = OpSelect %float %61 %float_1 %float_0
+               OpStore %x_45 %60
+         %63 = OpFSub %float %56 %60
+         %64 = OpFOrdLessThan %bool %63 %float_1
+               OpSelectionMerge %65 None
+               OpBranchConditional %64 %66 %65
+         %66 = OpLabel
+               OpStore %x_46 %int_0
+               OpBranch %38
+         %65 = OpLabel
+               OpStore %x_46 %int_1
+               OpBranch %38
+         %39 = OpLabel
+               OpSelectionMerge %70 None
+               OpBranchConditional %false %71 %72
+         %71 = OpLabel
+               OpBranch %70
+         %72 = OpLabel
+               OpBranch %38
+         %70 = OpLabel
+               OpBranch %37
+         %38 = OpLabel
+         %73 = OpLoad %int %x_46
+               OpStore %zero %73
+         %74 = OpIEqual %bool %73 %int_1
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %75
+         %76 = OpLabel
+               OpReturn
+         %75 = OpLabel
+               OpStore %x_GLF_color %77
+         %78 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %79 = OpLoad %float %78
+         %80 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_0
+         %81 = OpLoad %float %80
+         %82 = OpFOrdGreaterThanEqual %bool %79 %81
+               OpSelectionMerge %83 None
+               OpBranchConditional %82 %84 %83
+         %84 = OpLabel
+         %85 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %86 = OpLoad %float %85
+         %87 = OpFOrdGreaterThanEqual %bool %86 %float_0
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %88
+         %89 = OpLabel
+         %90 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_1
+         %91 = OpLoad %float %90
+         %92 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_0
+               OpStore %92 %91
+               OpBranch %88
+         %88 = OpLabel
+               OpBranch %83
+         %83 = OpLabel
+         %93 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %94 = OpLoad %float %93
+         %95 = OpFOrdGreaterThanEqual %bool %94 %float_0
+               OpSelectionMerge %96 None
+               OpBranchConditional %95 %97 %96
+         %97 = OpLabel
+         %98 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_0
+         %99 = OpLoad %float %98
+        %100 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_1
+               OpStore %100 %99
+               OpBranch %96
+         %96 = OpLabel
+        %101 = OpLoad %v4float %gl_FragCoord
+        %102 = OpCompositeExtract %float %101 0
+        %103 = OpCompositeExtract %float %101 1
+        %104 = OpCompositeConstruct %v2float %102 %103
+        %105 = OpCompositeExtract %float %104 0
+        %106 = OpCompositeExtract %float %104 1
+        %107 = OpCompositeConstruct %v2float %105 %106
+               OpStore %temp %107
+        %108 = OpCompositeExtract %float %107 1
+        %109 = OpFOrdGreaterThanEqual %bool %108 %float_0
+               OpSelectionMerge %110 None
+               OpBranchConditional %109 %111 %110
+        %111 = OpLabel
+        %112 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_0
+        %113 = OpLoad %float %112
+        %115 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_2
+               OpStore %115 %113
+               OpBranch %110
+        %110 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %116
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %120 = OpLabel
+        %121 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %121
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %123 = OpLabel
+        %124 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %124
+        %125 = OpFunctionCall %void %main_1
+        %127 = OpLoad %v4float %x_GLF_color
+        %128 = OpCompositeConstruct %main_out %127
+        %126 = OpFunctionCall %void %tint_symbol_3 %128
+               OpReturn
+               OpFunctionEnd
+%alwaysZero_vf2_ = OpFunction %int None %129
+      %coord = OpFunctionParameter %_ptr_Function_v2float
+        %132 = OpLabel
+          %a = OpVariable %_ptr_Function_float Function %21
+      %x_110 = OpVariable %_ptr_Function_float Function %21
+          %b = OpVariable %_ptr_Function_float Function %21
+        %137 = OpAccessChain %_ptr_Function_float %coord %uint_1
+        %138 = OpLoad %float %137
+        %139 = OpFOrdLessThan %bool %138 %float_50
+               OpSelectionMerge %140 None
+               OpBranchConditional %139 %141 %142
+        %141 = OpLabel
+        %143 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_1
+        %144 = OpLoad %float %143
+               OpStore %x_110 %144
+               OpBranch %140
+        %142 = OpLabel
+               OpStore %x_110 %float_0
+               OpBranch %140
+        %140 = OpLabel
+        %145 = OpLoad %float %x_110
+               OpStore %a %145
+        %146 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %147 = OpLoad %float %146
+        %149 = OpFOrdLessThan %bool %147 %float_50
+        %148 = OpSelect %float %149 %float_1 %float_0
+               OpStore %b %148
+        %150 = OpFSub %float %145 %148
+        %151 = OpFOrdLessThan %bool %150 %float_1
+               OpSelectionMerge %152 None
+               OpBranchConditional %151 %153 %152
+        %153 = OpLabel
+               OpReturnValue %int_0
+        %152 = OpLabel
+               OpReturnValue %int_1
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/frag-coord-func-call-and-ifs/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/frag-coord-func-call-and-ifs/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..f94238d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/frag-coord-func-call-and-ifs/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,112 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_43 : f32;
+  var x_44 : f32;
+  var x_45 : f32;
+  var x_46 : i32;
+  var zero : i32;
+  var param : vec2<f32>;
+  var temp : vec2<f32>;
+  let x_47 : vec4<f32> = gl_FragCoord;
+  param = vec2<f32>(x_47.x, x_47.y);
+  loop {
+    let x_54 : f32 = param.y;
+    if ((x_54 < 50.0)) {
+      let x_60 : f32 = x_9.injectionSwitch.y;
+      x_44 = x_60;
+    } else {
+      x_44 = 0.0;
+    }
+    let x_61 : f32 = x_44;
+    x_43 = x_61;
+    let x_63 : f32 = gl_FragCoord.y;
+    let x_65 : f32 = select(0.0, 1.0, (x_63 < 50.0));
+    x_45 = x_65;
+    if (((x_61 - x_65) < 1.0)) {
+      x_46 = 0;
+      break;
+    }
+    x_46 = 1;
+    break;
+
+    continuing {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_70 : i32 = x_46;
+  zero = x_70;
+  if ((x_70 == 1)) {
+    return;
+  }
+  x_GLF_color = vec4<f32>(0.0, 1.0, 1.0, 1.0);
+  let x_75 : f32 = gl_FragCoord.x;
+  let x_77 : f32 = x_9.injectionSwitch.x;
+  if ((x_75 >= x_77)) {
+    let x_82 : f32 = gl_FragCoord.y;
+    if ((x_82 >= 0.0)) {
+      let x_87 : f32 = x_9.injectionSwitch.y;
+      x_GLF_color.x = x_87;
+    }
+  }
+  let x_90 : f32 = gl_FragCoord.y;
+  if ((x_90 >= 0.0)) {
+    let x_95 : f32 = x_9.injectionSwitch.x;
+    x_GLF_color.y = x_95;
+  }
+  let x_97 : vec4<f32> = gl_FragCoord;
+  let x_98 : vec2<f32> = vec2<f32>(x_97.x, x_97.y);
+  let x_101 : vec2<f32> = vec2<f32>(x_98.x, x_98.y);
+  temp = x_101;
+  if ((x_101.y >= 0.0)) {
+    let x_107 : f32 = x_9.injectionSwitch.x;
+    x_GLF_color.z = x_107;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+fn alwaysZero_vf2_(coord : ptr<function, vec2<f32>>) -> i32 {
+  var a : f32;
+  var x_110 : f32;
+  var b : f32;
+  let x_112 : f32 = (*(coord)).y;
+  if ((x_112 < 50.0)) {
+    let x_118 : f32 = x_9.injectionSwitch.y;
+    x_110 = x_118;
+  } else {
+    x_110 = 0.0;
+  }
+  let x_119 : f32 = x_110;
+  a = x_119;
+  let x_121 : f32 = gl_FragCoord.y;
+  let x_123 : f32 = select(0.0, 1.0, (x_121 < 50.0));
+  b = x_123;
+  if (((x_119 - x_123) < 1.0)) {
+    return 0;
+  }
+  return 1;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/function-with-uniform-return/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/function-with-uniform-return/0-opt.spvasm
new file mode 100644
index 0000000..496c8d3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/function-with-uniform-return/0-opt.spvasm
@@ -0,0 +1,108 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %fx_ "fx("
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpName %x2 "x2"
+               OpName %B "B"
+               OpName %k0 "k0"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+         %14 = OpTypeFunction %float
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %true = OpConstantTrue %bool
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+         %30 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_2 = OpConstant %float 2
+       %main = OpFunction %void None %12
+         %33 = OpLabel
+         %x2 = OpVariable %_ptr_Function_float Function
+          %B = OpVariable %_ptr_Function_float Function
+         %k0 = OpVariable %_ptr_Function_float Function
+               OpStore %x2 %float_1
+               OpStore %B %float_1
+         %34 = OpFunctionCall %float %fx_
+         %35 = OpCompositeConstruct %v4float %34 %float_0 %float_0 %float_1
+               OpStore %_GLF_color %35
+               OpBranch %36
+         %36 = OpLabel
+               OpLoopMerge %37 %38 None
+               OpBranch %39
+         %39 = OpLabel
+         %40 = OpLoad %float %x2
+         %41 = OpFOrdGreaterThan %bool %40 %float_2
+               OpBranchConditional %41 %42 %37
+         %42 = OpLabel
+         %43 = OpFunctionCall %float %fx_
+         %44 = OpFunctionCall %float %fx_
+         %45 = OpFSub %float %43 %44
+               OpStore %k0 %45
+         %46 = OpLoad %float %k0
+               OpStore %B %46
+         %47 = OpLoad %float %B
+               OpStore %x2 %47
+               OpBranch %38
+         %38 = OpLabel
+               OpBranch %36
+         %37 = OpLabel
+               OpReturn
+               OpFunctionEnd
+        %fx_ = OpFunction %float None %14
+         %48 = OpLabel
+         %49 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %50 = OpLoad %float %49
+         %51 = OpFOrdGreaterThanEqual %bool %50 %float_0
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %52
+         %53 = OpLabel
+         %54 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %55 = OpLoad %float %54
+               OpReturnValue %55
+         %52 = OpLabel
+               OpBranch %56
+         %56 = OpLabel
+               OpLoopMerge %57 %58 None
+               OpBranch %59
+         %59 = OpLabel
+               OpBranchConditional %true %60 %57
+         %60 = OpLabel
+               OpStore %_GLF_color %30
+               OpBranch %58
+         %58 = OpLabel
+               OpBranch %56
+         %57 = OpLabel
+         %61 = OpUndef %float
+               OpReturnValue %61
+               OpFunctionEnd
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
new file mode 100755
index 0000000..4b3e3a8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/function-with-uniform-return/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,70 @@
+SKIP: FAILED
+
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+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);
+
+float fx_() {
+  const float x_50 = gl_FragCoord.y;
+  if ((x_50 >= 0.0f)) {
+    const float x_55 = asfloat(x_7[0].y);
+    return x_55;
+  }
+  while (true) {
+    if (true) {
+    } else {
+      break;
+    }
+    x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  }
+  return 0.0f;
+}
+
+void main_1() {
+  float x2 = 0.0f;
+  float B = 0.0f;
+  float k0 = 0.0f;
+  x2 = 1.0f;
+  B = 1.0f;
+  const float x_34 = fx_();
+  x_GLF_color = float4(x_34, 0.0f, 0.0f, 1.0f);
+  while (true) {
+    if ((x2 > 2.0f)) {
+    } else {
+      break;
+    }
+    const float x_43 = fx_();
+    const float x_44 = fx_();
+    k0 = (x_43 - x_44);
+    B = k0;
+    x2 = B;
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
+error: validation errors
+T:\tmp\u9kk.0:55: error: Loop must have break.
+Validation failed.
+
+
+
diff --git a/test/vk-gl-cts/graphicsfuzz/function-with-uniform-return/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/function-with-uniform-return/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..53d236b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/function-with-uniform-return/0-opt.spvasm.expected.msl
@@ -0,0 +1,64 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float fx_(constant buf0& x_7, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float const x_50 = (*(tint_symbol_5)).y;
+  if ((x_50 >= 0.0f)) {
+    float const x_55 = x_7.injectionSwitch.y;
+    return x_55;
+  }
+  while (true) {
+    if (true) {
+    } else {
+      break;
+    }
+    *(tint_symbol_6) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  }
+  return 0.0f;
+}
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_7, thread float4* const tint_symbol_8) {
+  float x2 = 0.0f;
+  float B = 0.0f;
+  float k0 = 0.0f;
+  x2 = 1.0f;
+  B = 1.0f;
+  float const x_34 = fx_(x_7, tint_symbol_7, tint_symbol_8);
+  *(tint_symbol_8) = float4(x_34, 0.0f, 0.0f, 1.0f);
+  while (true) {
+    float const x_40 = x2;
+    if ((x_40 > 2.0f)) {
+    } else {
+      break;
+    }
+    float const x_43 = fx_(x_7, tint_symbol_7, tint_symbol_8);
+    float const x_44 = fx_(x_7, tint_symbol_7, tint_symbol_8);
+    k0 = (x_43 - x_44);
+    float const x_46 = k0;
+    B = x_46;
+    float const x_47 = B;
+    x2 = x_47;
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_9 = 0.0f;
+  thread float4 tint_symbol_10 = 0.0f;
+  tint_symbol_9 = gl_FragCoord_param;
+  main_1(x_7, &(tint_symbol_9), &(tint_symbol_10));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_10};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/function-with-uniform-return/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/function-with-uniform-return/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..3606a34
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/function-with-uniform-return/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,152 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 81
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %fx_ "fx_"
+               OpName %main_1 "main_1"
+               OpName %x2 "x2"
+               OpName %B "B"
+               OpName %k0 "k0"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+         %15 = OpTypeFunction %float
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %true = OpConstantTrue %bool
+    %float_1 = OpConstant %float 1
+         %41 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+       %void = OpTypeVoid
+         %42 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %48 = OpConstantNull %float
+    %float_2 = OpConstant %float 2
+   %main_out = OpTypeStruct %v4float
+         %68 = OpTypeFunction %void %main_out
+        %fx_ = OpFunction %float None %15
+         %17 = OpLabel
+         %21 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %22 = OpLoad %float %21
+         %24 = OpFOrdGreaterThanEqual %bool %22 %float_0
+               OpSelectionMerge %26 None
+               OpBranchConditional %24 %27 %26
+         %27 = OpLabel
+         %30 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_1
+         %31 = OpLoad %float %30
+               OpReturnValue %31
+         %26 = OpLabel
+               OpBranch %32
+         %32 = OpLabel
+               OpLoopMerge %33 %34 None
+               OpBranch %35
+         %35 = OpLabel
+               OpSelectionMerge %37 None
+               OpBranchConditional %true %38 %39
+         %38 = OpLabel
+               OpBranch %37
+         %39 = OpLabel
+               OpBranch %33
+         %37 = OpLabel
+               OpStore %x_GLF_color %41
+               OpBranch %34
+         %34 = OpLabel
+               OpBranch %32
+         %33 = OpLabel
+               OpReturnValue %float_0
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %42
+         %45 = OpLabel
+         %x2 = OpVariable %_ptr_Function_float Function %48
+          %B = OpVariable %_ptr_Function_float Function %48
+         %k0 = OpVariable %_ptr_Function_float Function %48
+               OpStore %x2 %float_1
+               OpStore %B %float_1
+         %51 = OpFunctionCall %float %fx_
+         %52 = OpCompositeConstruct %v4float %51 %float_0 %float_0 %float_1
+               OpStore %x_GLF_color %52
+               OpBranch %53
+         %53 = OpLabel
+               OpLoopMerge %54 %55 None
+               OpBranch %56
+         %56 = OpLabel
+         %57 = OpLoad %float %x2
+         %59 = OpFOrdGreaterThan %bool %57 %float_2
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %62
+         %61 = OpLabel
+               OpBranch %60
+         %62 = OpLabel
+               OpBranch %54
+         %60 = OpLabel
+         %63 = OpFunctionCall %float %fx_
+         %64 = OpFunctionCall %float %fx_
+         %65 = OpFSub %float %63 %64
+               OpStore %k0 %65
+         %66 = OpLoad %float %k0
+               OpStore %B %66
+         %67 = OpLoad %float %B
+               OpStore %x2 %67
+               OpBranch %55
+         %55 = OpLabel
+               OpBranch %53
+         %54 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %68
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %72 = OpLabel
+         %73 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %73
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %42
+         %75 = OpLabel
+         %76 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %76
+         %77 = OpFunctionCall %void %main_1
+         %79 = OpLoad %v4float %x_GLF_color
+         %80 = OpCompositeConstruct %main_out %79
+         %78 = OpFunctionCall %void %tint_symbol_3 %80
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/function-with-uniform-return/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/function-with-uniform-return/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..ad60ab7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/function-with-uniform-return/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,63 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn fx_() -> f32 {
+  let x_50 : f32 = gl_FragCoord.y;
+  if ((x_50 >= 0.0)) {
+    let x_55 : f32 = x_7.injectionSwitch.y;
+    return x_55;
+  }
+  loop {
+    if (true) {
+    } else {
+      break;
+    }
+    x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+  }
+  return 0.0;
+}
+
+fn main_1() {
+  var x2 : f32;
+  var B : f32;
+  var k0 : f32;
+  x2 = 1.0;
+  B = 1.0;
+  let x_34 : f32 = fx_();
+  x_GLF_color = vec4<f32>(x_34, 0.0, 0.0, 1.0);
+  loop {
+    let x_40 : f32 = x2;
+    if ((x_40 > 2.0)) {
+    } else {
+      break;
+    }
+    let x_43 : f32 = fx_();
+    let x_44 : f32 = fx_();
+    k0 = (x_43 - x_44);
+    let x_46 : f32 = k0;
+    B = x_46;
+    let x_47 : f32 = B;
+    x2 = x_47;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/function-with-uniform-return/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/function-with-uniform-return/0-opt.wgsl
new file mode 100644
index 0000000..ad60ab7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/function-with-uniform-return/0-opt.wgsl
@@ -0,0 +1,63 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn fx_() -> f32 {
+  let x_50 : f32 = gl_FragCoord.y;
+  if ((x_50 >= 0.0)) {
+    let x_55 : f32 = x_7.injectionSwitch.y;
+    return x_55;
+  }
+  loop {
+    if (true) {
+    } else {
+      break;
+    }
+    x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+  }
+  return 0.0;
+}
+
+fn main_1() {
+  var x2 : f32;
+  var B : f32;
+  var k0 : f32;
+  x2 = 1.0;
+  B = 1.0;
+  let x_34 : f32 = fx_();
+  x_GLF_color = vec4<f32>(x_34, 0.0, 0.0, 1.0);
+  loop {
+    let x_40 : f32 = x2;
+    if ((x_40 > 2.0)) {
+    } else {
+      break;
+    }
+    let x_43 : f32 = fx_();
+    let x_44 : f32 = fx_();
+    k0 = (x_43 - x_44);
+    let x_46 : f32 = k0;
+    B = x_46;
+    let x_47 : f32 = B;
+    x2 = x_47;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
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
new file mode 100755
index 0000000..e4b7943
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/function-with-uniform-return/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,70 @@
+SKIP: FAILED
+
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+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);
+
+float fx_() {
+  const float x_50 = gl_FragCoord.y;
+  if ((x_50 >= 0.0f)) {
+    const float x_55 = asfloat(x_7[0].y);
+    return x_55;
+  }
+  while (true) {
+    if (true) {
+    } else {
+      break;
+    }
+    x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  }
+  return 0.0f;
+}
+
+void main_1() {
+  float x2 = 0.0f;
+  float B = 0.0f;
+  float k0 = 0.0f;
+  x2 = 1.0f;
+  B = 1.0f;
+  const float x_34 = fx_();
+  x_GLF_color = float4(x_34, 0.0f, 0.0f, 1.0f);
+  while (true) {
+    if ((x2 > 2.0f)) {
+    } else {
+      break;
+    }
+    const float x_43 = fx_();
+    const float x_44 = fx_();
+    k0 = (x_43 - x_44);
+    B = k0;
+    x2 = B;
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
+error: validation errors
+T:\tmp\udf0.0:55: error: Loop must have break.
+Validation failed.
+
+
+
diff --git a/test/vk-gl-cts/graphicsfuzz/function-with-uniform-return/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/function-with-uniform-return/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..53d236b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/function-with-uniform-return/0-opt.wgsl.expected.msl
@@ -0,0 +1,64 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float fx_(constant buf0& x_7, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float const x_50 = (*(tint_symbol_5)).y;
+  if ((x_50 >= 0.0f)) {
+    float const x_55 = x_7.injectionSwitch.y;
+    return x_55;
+  }
+  while (true) {
+    if (true) {
+    } else {
+      break;
+    }
+    *(tint_symbol_6) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  }
+  return 0.0f;
+}
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_7, thread float4* const tint_symbol_8) {
+  float x2 = 0.0f;
+  float B = 0.0f;
+  float k0 = 0.0f;
+  x2 = 1.0f;
+  B = 1.0f;
+  float const x_34 = fx_(x_7, tint_symbol_7, tint_symbol_8);
+  *(tint_symbol_8) = float4(x_34, 0.0f, 0.0f, 1.0f);
+  while (true) {
+    float const x_40 = x2;
+    if ((x_40 > 2.0f)) {
+    } else {
+      break;
+    }
+    float const x_43 = fx_(x_7, tint_symbol_7, tint_symbol_8);
+    float const x_44 = fx_(x_7, tint_symbol_7, tint_symbol_8);
+    k0 = (x_43 - x_44);
+    float const x_46 = k0;
+    B = x_46;
+    float const x_47 = B;
+    x2 = x_47;
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_9 = 0.0f;
+  thread float4 tint_symbol_10 = 0.0f;
+  tint_symbol_9 = gl_FragCoord_param;
+  main_1(x_7, &(tint_symbol_9), &(tint_symbol_10));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_10};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/function-with-uniform-return/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/function-with-uniform-return/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..3606a34
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/function-with-uniform-return/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,152 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 81
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %fx_ "fx_"
+               OpName %main_1 "main_1"
+               OpName %x2 "x2"
+               OpName %B "B"
+               OpName %k0 "k0"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+         %15 = OpTypeFunction %float
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %true = OpConstantTrue %bool
+    %float_1 = OpConstant %float 1
+         %41 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+       %void = OpTypeVoid
+         %42 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %48 = OpConstantNull %float
+    %float_2 = OpConstant %float 2
+   %main_out = OpTypeStruct %v4float
+         %68 = OpTypeFunction %void %main_out
+        %fx_ = OpFunction %float None %15
+         %17 = OpLabel
+         %21 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %22 = OpLoad %float %21
+         %24 = OpFOrdGreaterThanEqual %bool %22 %float_0
+               OpSelectionMerge %26 None
+               OpBranchConditional %24 %27 %26
+         %27 = OpLabel
+         %30 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_1
+         %31 = OpLoad %float %30
+               OpReturnValue %31
+         %26 = OpLabel
+               OpBranch %32
+         %32 = OpLabel
+               OpLoopMerge %33 %34 None
+               OpBranch %35
+         %35 = OpLabel
+               OpSelectionMerge %37 None
+               OpBranchConditional %true %38 %39
+         %38 = OpLabel
+               OpBranch %37
+         %39 = OpLabel
+               OpBranch %33
+         %37 = OpLabel
+               OpStore %x_GLF_color %41
+               OpBranch %34
+         %34 = OpLabel
+               OpBranch %32
+         %33 = OpLabel
+               OpReturnValue %float_0
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %42
+         %45 = OpLabel
+         %x2 = OpVariable %_ptr_Function_float Function %48
+          %B = OpVariable %_ptr_Function_float Function %48
+         %k0 = OpVariable %_ptr_Function_float Function %48
+               OpStore %x2 %float_1
+               OpStore %B %float_1
+         %51 = OpFunctionCall %float %fx_
+         %52 = OpCompositeConstruct %v4float %51 %float_0 %float_0 %float_1
+               OpStore %x_GLF_color %52
+               OpBranch %53
+         %53 = OpLabel
+               OpLoopMerge %54 %55 None
+               OpBranch %56
+         %56 = OpLabel
+         %57 = OpLoad %float %x2
+         %59 = OpFOrdGreaterThan %bool %57 %float_2
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %62
+         %61 = OpLabel
+               OpBranch %60
+         %62 = OpLabel
+               OpBranch %54
+         %60 = OpLabel
+         %63 = OpFunctionCall %float %fx_
+         %64 = OpFunctionCall %float %fx_
+         %65 = OpFSub %float %63 %64
+               OpStore %k0 %65
+         %66 = OpLoad %float %k0
+               OpStore %B %66
+         %67 = OpLoad %float %B
+               OpStore %x2 %67
+               OpBranch %55
+         %55 = OpLabel
+               OpBranch %53
+         %54 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %68
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %72 = OpLabel
+         %73 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %73
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %42
+         %75 = OpLabel
+         %76 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %76
+         %77 = OpFunctionCall %void %main_1
+         %79 = OpLoad %v4float %x_GLF_color
+         %80 = OpCompositeConstruct %main_out %79
+         %78 = OpFunctionCall %void %tint_symbol_3 %80
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/function-with-uniform-return/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/function-with-uniform-return/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..ad60ab7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/function-with-uniform-return/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,63 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn fx_() -> f32 {
+  let x_50 : f32 = gl_FragCoord.y;
+  if ((x_50 >= 0.0)) {
+    let x_55 : f32 = x_7.injectionSwitch.y;
+    return x_55;
+  }
+  loop {
+    if (true) {
+    } else {
+      break;
+    }
+    x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+  }
+  return 0.0;
+}
+
+fn main_1() {
+  var x2 : f32;
+  var B : f32;
+  var k0 : f32;
+  x2 = 1.0;
+  B = 1.0;
+  let x_34 : f32 = fx_();
+  x_GLF_color = vec4<f32>(x_34, 0.0, 0.0, 1.0);
+  loop {
+    let x_40 : f32 = x2;
+    if ((x_40 > 2.0)) {
+    } else {
+      break;
+    }
+    let x_43 : f32 = fx_();
+    let x_44 : f32 = fx_();
+    k0 = (x_43 - x_44);
+    let x_46 : f32 = k0;
+    B = x_46;
+    let x_47 : f32 = B;
+    x2 = x_47;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/global-array-loops/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/global-array-loops/0-opt.spvasm
new file mode 100644
index 0000000..263c389
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/global-array-loops/0-opt.spvasm
@@ -0,0 +1,257 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %yieldsZero_ "yieldsZero("
+               OpName %globalNumbers "globalNumbers"
+               OpName %i "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %_ ""
+               OpName %acc "acc"
+               OpName %i_0 "i"
+               OpName %localNumbers "localNumbers"
+               OpName %param "param"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %yieldsZero_ RelaxedPrecision
+               OpDecorate %globalNumbers RelaxedPrecision
+               OpDecorate %i RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %acc RelaxedPrecision
+               OpDecorate %i_0 RelaxedPrecision
+               OpDecorate %localNumbers RelaxedPrecision
+               OpDecorate %13 RelaxedPrecision
+               OpDecorate %14 RelaxedPrecision
+               OpDecorate %15 RelaxedPrecision
+               OpDecorate %16 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %17 RelaxedPrecision
+               OpDecorate %18 RelaxedPrecision
+               OpDecorate %19 RelaxedPrecision
+               OpDecorate %20 RelaxedPrecision
+               OpDecorate %21 RelaxedPrecision
+               OpDecorate %22 RelaxedPrecision
+               OpDecorate %23 RelaxedPrecision
+               OpDecorate %24 RelaxedPrecision
+               OpDecorate %25 RelaxedPrecision
+               OpDecorate %26 RelaxedPrecision
+               OpDecorate %27 RelaxedPrecision
+               OpDecorate %28 RelaxedPrecision
+               OpDecorate %29 RelaxedPrecision
+               OpDecorate %30 RelaxedPrecision
+               OpDecorate %31 RelaxedPrecision
+               OpDecorate %32 RelaxedPrecision
+               OpDecorate %33 RelaxedPrecision
+               OpDecorate %34 RelaxedPrecision
+       %void = OpTypeVoid
+         %36 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %39 = OpTypeFunction %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Private__arr_int_uint_10 = OpTypePointer Private %_arr_int_uint_10
+%_ptr_Private_int = OpTypePointer Private %int
+      %int_1 = OpConstant %int 1
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_4 = OpConstant %int 4
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+%_ptr_Function__arr_int_uint_2 = OpTypePointer Function %_arr_int_uint_2
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %59 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %60 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+      %false = OpConstantFalse %bool
+%_ptr_Function_bool = OpTypePointer Function %bool
+       %true = OpConstantTrue %bool
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+         %65 = OpUndef %int
+         %66 = OpUndef %bool
+       %main = OpFunction %void None %36
+         %67 = OpLabel
+         %68 = OpVariable %_ptr_Function_bool Function %false
+         %29 = OpVariable %_ptr_Function_int Function
+         %30 = OpVariable %_ptr_Function_int Function
+         %31 = OpVariable %_ptr_Function_int Function
+%globalNumbers = OpVariable %_ptr_Function__arr_int_uint_10 Function
+         %17 = OpVariable %_ptr_Function_int Function
+        %acc = OpVariable %_ptr_Function_int Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+%localNumbers = OpVariable %_ptr_Function__arr_int_uint_2 Function
+      %param = OpVariable %_ptr_Function_int Function
+               OpStore %acc %int_0
+               OpStore %i_0 %int_0
+               OpBranch %69
+         %69 = OpLabel
+         %24 = OpPhi %int %int_0 %67 %15 %70
+         %23 = OpPhi %int %int_0 %67 %16 %70
+               OpLoopMerge %71 %70 None
+               OpBranch %72
+         %72 = OpLabel
+         %73 = OpSLessThan %bool %23 %int_4
+               OpBranchConditional %73 %74 %71
+         %74 = OpLabel
+               OpStore %68 %false
+               OpBranch %75
+         %75 = OpLabel
+         %76 = OpPhi %bool %false %74 %66 %77
+               OpLoopMerge %78 %77 None
+               OpBranch %79
+         %79 = OpLabel
+               OpStore %30 %int_0
+               OpBranch %80
+         %80 = OpLabel
+         %81 = OpPhi %bool %76 %79 %66 %82
+         %32 = OpPhi %int %int_0 %79 %65 %82
+               OpLoopMerge %83 %82 None
+               OpBranch %84
+         %84 = OpLabel
+         %85 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %86 = OpLoad %float %85
+         %87 = OpConvertFToS %int %86
+         %88 = OpSLessThan %bool %32 %87
+               OpBranchConditional %88 %89 %83
+         %89 = OpLabel
+               OpStore %68 %true
+               OpStore %29 %32
+               OpBranch %83
+         %82 = OpLabel
+               OpBranch %80
+         %83 = OpLabel
+         %33 = OpPhi %int %65 %84 %32 %89
+         %90 = OpPhi %bool %81 %84 %true %89
+               OpSelectionMerge %91 None
+               OpBranchConditional %90 %78 %91
+         %91 = OpLabel
+         %92 = OpUndef %int
+               OpStore %68 %true
+               OpStore %29 %92
+               OpBranch %78
+         %77 = OpLabel
+               OpBranch %75
+         %78 = OpLabel
+         %34 = OpPhi %int %33 %83 %92 %91
+               OpStore %31 %34
+         %93 = OpLoad %int %31
+         %21 = OpLoad %_arr_int_uint_2 %localNumbers
+         %22 = OpCompositeInsert %_arr_int_uint_2 %93 %21 1
+               OpStore %localNumbers %22
+         %94 = OpAccessChain %_ptr_Function_int %globalNumbers %int_0
+               OpStore %94 %int_0
+         %95 = OpAccessChain %_ptr_Function_int %localNumbers %int_1
+         %13 = OpCompositeExtract %int %22 1
+               OpStore %param %13
+               OpStore %17 %int_0
+               OpBranch %96
+         %96 = OpLabel
+         %25 = OpPhi %int %int_0 %78 %19 %97
+               OpLoopMerge %98 %97 None
+               OpBranch %99
+         %99 = OpLabel
+        %100 = OpSLessThanEqual %bool %25 %13
+               OpBranchConditional %100 %101 %98
+        %101 = OpLabel
+        %102 = OpAccessChain %_ptr_Function_int %globalNumbers %13
+         %18 = OpLoad %int %102
+        %103 = OpSLessThanEqual %bool %18 %int_1
+               OpSelectionMerge %104 None
+               OpBranchConditional %103 %105 %104
+        %105 = OpLabel
+               OpStore %102 %int_1
+               OpBranch %104
+        %104 = OpLabel
+               OpBranch %97
+         %97 = OpLabel
+         %19 = OpIAdd %int %25 %int_1
+               OpStore %17 %19
+               OpBranch %96
+         %98 = OpLabel
+        %106 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+        %107 = OpLoad %float %106
+        %108 = OpConvertFToS %int %107
+        %109 = OpISub %int %108 %int_1
+        %110 = OpAccessChain %_ptr_Function_int %globalNumbers %109
+         %14 = OpLoad %int %110
+         %15 = OpIAdd %int %24 %14
+               OpStore %acc %15
+               OpBranch %70
+         %70 = OpLabel
+         %16 = OpIAdd %int %23 %int_1
+               OpStore %i_0 %16
+               OpBranch %69
+         %71 = OpLabel
+        %111 = OpIEqual %bool %24 %int_4
+               OpSelectionMerge %112 None
+               OpBranchConditional %111 %113 %114
+        %113 = OpLabel
+               OpStore %_GLF_color %59
+               OpBranch %112
+        %114 = OpLabel
+               OpStore %_GLF_color %60
+               OpBranch %112
+        %112 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%yieldsZero_ = OpFunction %int None %39
+        %115 = OpLabel
+        %116 = OpVariable %_ptr_Function_bool Function %false
+         %20 = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+               OpBranch %117
+        %117 = OpLabel
+        %118 = OpPhi %bool %false %115 %66 %119
+               OpLoopMerge %120 %119 None
+               OpBranch %121
+        %121 = OpLabel
+               OpStore %i %int_0
+               OpBranch %122
+        %122 = OpLabel
+        %123 = OpPhi %bool %118 %121 %66 %124
+         %28 = OpPhi %int %int_0 %121 %65 %124
+               OpLoopMerge %125 %124 None
+               OpBranch %126
+        %126 = OpLabel
+        %127 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+        %128 = OpLoad %float %127
+        %129 = OpConvertFToS %int %128
+        %130 = OpSLessThan %bool %28 %129
+               OpBranchConditional %130 %131 %125
+        %131 = OpLabel
+               OpStore %116 %true
+               OpStore %20 %28
+               OpBranch %125
+        %124 = OpLabel
+               OpBranch %122
+        %125 = OpLabel
+         %26 = OpPhi %int %65 %126 %28 %131
+        %132 = OpPhi %bool %123 %126 %true %131
+               OpSelectionMerge %133 None
+               OpBranchConditional %132 %120 %133
+        %133 = OpLabel
+        %134 = OpUndef %int
+               OpStore %116 %true
+               OpStore %20 %134
+               OpBranch %120
+        %119 = OpLabel
+               OpBranch %117
+        %120 = OpLabel
+         %27 = OpPhi %int %26 %125 %134 %133
+               OpReturnValue %27
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/global-array-loops/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/global-array-loops/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..adb4b13
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/global-array-loops/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,201 @@
+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);
+
+void main_1() {
+  bool x_68 = false;
+  int x_29 = 0;
+  int x_30 = 0;
+  int x_31 = 0;
+  int globalNumbers[10] = (int[10])0;
+  int x_17 = 0;
+  int acc = 0;
+  int i_1 = 0;
+  int localNumbers[2] = (int[2])0;
+  int param = 0;
+  int x_24 = 0;
+  int x_24_phi = 0;
+  int x_23_phi = 0;
+  acc = 0;
+  i_1 = 0;
+  x_24_phi = 0;
+  x_23_phi = 0;
+  while (true) {
+    int x_33 = 0;
+    int x_92 = 0;
+    bool x_76_phi = false;
+    int x_34_phi = 0;
+    int x_25_phi = 0;
+    x_24 = x_24_phi;
+    const int x_23 = x_23_phi;
+    if ((x_23 < 4)) {
+    } else {
+      break;
+    }
+    x_68 = false;
+    x_76_phi = false;
+    while (true) {
+      bool x_81 = false;
+      int x_32 = 0;
+      bool x_81_phi = false;
+      int x_32_phi = 0;
+      int x_33_phi = 0;
+      bool x_90_phi = false;
+      const bool x_76 = x_76_phi;
+      x_30 = 0;
+      x_81_phi = x_76;
+      x_32_phi = 0;
+      while (true) {
+        x_81 = x_81_phi;
+        x_32 = x_32_phi;
+        const float x_86 = asfloat(x_8[0].x);
+        x_33_phi = 0;
+        x_90_phi = x_81;
+        if ((x_32 < int(x_86))) {
+        } else {
+          break;
+        }
+        x_68 = true;
+        x_29 = x_32;
+        x_33_phi = x_32;
+        x_90_phi = true;
+        break;
+        {
+          x_81_phi = false;
+          x_32_phi = 0;
+        }
+      }
+      x_33 = x_33_phi;
+      const bool x_90 = x_90_phi;
+      x_34_phi = x_33;
+      if (x_90) {
+        break;
+      }
+      x_92 = 0;
+      x_68 = true;
+      x_29 = x_92;
+      x_34_phi = x_92;
+      break;
+      {
+        x_76_phi = false;
+      }
+    }
+    x_31 = x_34_phi;
+    const int x_93 = x_31;
+    int x_22_1[2] = localNumbers;
+    x_22_1[1u] = x_93;
+    const int x_22[2] = x_22_1;
+    localNumbers = x_22;
+    globalNumbers[0] = 0;
+    const int x_13 = x_22[1u];
+    param = x_13;
+    x_17 = 0;
+    x_25_phi = 0;
+    while (true) {
+      const int x_25 = x_25_phi;
+      if ((x_25 <= x_13)) {
+      } else {
+        break;
+      }
+      const int x_102_save = x_13;
+      const int x_18 = globalNumbers[x_102_save];
+      if ((x_18 <= 1)) {
+        globalNumbers[x_102_save] = 1;
+      }
+      {
+        const int x_19 = (x_25 + 1);
+        x_17 = x_19;
+        x_25_phi = x_19;
+      }
+    }
+    const float x_107 = asfloat(x_8[0].x);
+    const int x_14 = globalNumbers[(int(x_107) - 1)];
+    const int x_15 = asint((x_24 + asint(x_14)));
+    acc = x_15;
+    {
+      const int x_16 = (x_23 + 1);
+      i_1 = x_16;
+      x_24_phi = x_15;
+      x_23_phi = x_16;
+    }
+  }
+  if ((x_24 == asint(4))) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
+int yieldsZero_() {
+  bool x_116 = false;
+  int x_20 = 0;
+  int i = 0;
+  int x_26 = 0;
+  int x_134 = 0;
+  bool x_118_phi = false;
+  int x_27_phi = 0;
+  x_118_phi = false;
+  while (true) {
+    bool x_123 = false;
+    int x_28 = 0;
+    bool x_123_phi = false;
+    int x_28_phi = 0;
+    int x_26_phi = 0;
+    bool x_132_phi = false;
+    const bool x_118 = x_118_phi;
+    i = 0;
+    x_123_phi = x_118;
+    x_28_phi = 0;
+    while (true) {
+      x_123 = x_123_phi;
+      x_28 = x_28_phi;
+      const float x_128 = asfloat(x_8[0].x);
+      x_26_phi = 0;
+      x_132_phi = x_123;
+      if ((x_28 < int(x_128))) {
+      } else {
+        break;
+      }
+      x_116 = true;
+      x_20 = x_28;
+      x_26_phi = x_28;
+      x_132_phi = true;
+      break;
+      {
+        x_123_phi = false;
+        x_28_phi = 0;
+      }
+    }
+    x_26 = x_26_phi;
+    const bool x_132 = x_132_phi;
+    x_27_phi = x_26;
+    if (x_132) {
+      break;
+    }
+    x_134 = 0;
+    x_116 = true;
+    x_20 = x_134;
+    x_27_phi = x_134;
+    break;
+    {
+      x_118_phi = false;
+    }
+  }
+  return x_27_phi;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/global-array-loops/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/global-array-loops/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..7d54d73
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/global-array-loops/0-opt.spvasm.expected.msl
@@ -0,0 +1,213 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float one;
+};
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct tint_array_wrapper_1 {
+  int arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_4) {
+  bool x_68 = false;
+  int x_29 = 0;
+  int x_30 = 0;
+  int x_31 = 0;
+  tint_array_wrapper globalNumbers = {};
+  int x_17 = 0;
+  int acc = 0;
+  int i_1 = 0;
+  tint_array_wrapper_1 localNumbers = {};
+  int param = 0;
+  int x_24 = 0;
+  int x_24_phi = 0;
+  int x_23_phi = 0;
+  acc = 0;
+  i_1 = 0;
+  x_24_phi = 0;
+  x_23_phi = 0;
+  while (true) {
+    int x_33 = 0;
+    int x_92 = 0;
+    bool x_76_phi = false;
+    int x_34_phi = 0;
+    int x_25_phi = 0;
+    x_24 = x_24_phi;
+    int const x_23 = x_23_phi;
+    if ((x_23 < 4)) {
+    } else {
+      break;
+    }
+    x_68 = false;
+    x_76_phi = false;
+    while (true) {
+      bool x_81 = false;
+      int x_32 = 0;
+      bool x_81_phi = false;
+      int x_32_phi = 0;
+      int x_33_phi = 0;
+      bool x_90_phi = false;
+      bool const x_76 = x_76_phi;
+      x_30 = 0;
+      x_81_phi = x_76;
+      x_32_phi = 0;
+      while (true) {
+        x_81 = x_81_phi;
+        x_32 = x_32_phi;
+        float const x_86 = x_8.one;
+        x_33_phi = 0;
+        x_90_phi = x_81;
+        if ((x_32 < int(x_86))) {
+        } else {
+          break;
+        }
+        x_68 = true;
+        x_29 = x_32;
+        x_33_phi = x_32;
+        x_90_phi = true;
+        break;
+        {
+          x_81_phi = false;
+          x_32_phi = 0;
+        }
+      }
+      x_33 = x_33_phi;
+      bool const x_90 = x_90_phi;
+      x_34_phi = x_33;
+      if (x_90) {
+        break;
+      }
+      x_92 = 0;
+      x_68 = true;
+      x_29 = x_92;
+      x_34_phi = x_92;
+      break;
+      {
+        x_76_phi = false;
+      }
+    }
+    int const x_34 = x_34_phi;
+    x_31 = x_34;
+    int const x_93 = x_31;
+    tint_array_wrapper_1 const x_21 = localNumbers;
+    tint_array_wrapper_1 x_22_1 = x_21;
+    x_22_1.arr[1u] = x_93;
+    tint_array_wrapper_1 const x_22 = x_22_1;
+    localNumbers = x_22;
+    globalNumbers.arr[0] = 0;
+    int const x_13 = x_22.arr[1u];
+    param = x_13;
+    x_17 = 0;
+    x_25_phi = 0;
+    while (true) {
+      int const x_25 = x_25_phi;
+      if ((x_25 <= x_13)) {
+      } else {
+        break;
+      }
+      int const x_102_save = x_13;
+      int const x_18 = globalNumbers.arr[x_102_save];
+      if ((x_18 <= 1)) {
+        globalNumbers.arr[x_102_save] = 1;
+      }
+      {
+        int const x_19 = (x_25 + 1);
+        x_17 = x_19;
+        x_25_phi = x_19;
+      }
+    }
+    float const x_107 = x_8.one;
+    int const x_14 = globalNumbers.arr[(int(x_107) - 1)];
+    int const x_15 = as_type<int>((x_24 + as_type<int>(x_14)));
+    acc = x_15;
+    {
+      int const x_16 = (x_23 + 1);
+      i_1 = x_16;
+      x_24_phi = x_15;
+      x_23_phi = x_16;
+    }
+  }
+  if ((x_24 == as_type<int>(4))) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
+int yieldsZero_(constant buf0& x_8) {
+  bool x_116 = false;
+  int x_20 = 0;
+  int i = 0;
+  int x_26 = 0;
+  int x_134 = 0;
+  bool x_118_phi = false;
+  int x_27_phi = 0;
+  x_118_phi = false;
+  while (true) {
+    bool x_123 = false;
+    int x_28 = 0;
+    bool x_123_phi = false;
+    int x_28_phi = 0;
+    int x_26_phi = 0;
+    bool x_132_phi = false;
+    bool const x_118 = x_118_phi;
+    i = 0;
+    x_123_phi = x_118;
+    x_28_phi = 0;
+    while (true) {
+      x_123 = x_123_phi;
+      x_28 = x_28_phi;
+      float const x_128 = x_8.one;
+      x_26_phi = 0;
+      x_132_phi = x_123;
+      if ((x_28 < int(x_128))) {
+      } else {
+        break;
+      }
+      x_116 = true;
+      x_20 = x_28;
+      x_26_phi = x_28;
+      x_132_phi = true;
+      break;
+      {
+        x_123_phi = false;
+        x_28_phi = 0;
+      }
+    }
+    x_26 = x_26_phi;
+    bool const x_132 = x_132_phi;
+    x_27_phi = x_26;
+    if (x_132) {
+      break;
+    }
+    x_134 = 0;
+    x_116 = true;
+    x_20 = x_134;
+    x_27_phi = x_134;
+    break;
+    {
+      x_118_phi = false;
+    }
+  }
+  int const x_27 = x_27_phi;
+  return x_27;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/global-array-loops/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/global-array-loops/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..02fd4f3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/global-array-loops/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,406 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 204
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_68 "x_68"
+               OpName %x_29 "x_29"
+               OpName %x_30 "x_30"
+               OpName %x_31 "x_31"
+               OpName %globalNumbers "globalNumbers"
+               OpName %x_17 "x_17"
+               OpName %acc "acc"
+               OpName %i_1 "i_1"
+               OpName %localNumbers "localNumbers"
+               OpName %param "param"
+               OpName %x_24 "x_24"
+               OpName %x_24_phi "x_24_phi"
+               OpName %x_23_phi "x_23_phi"
+               OpName %x_33 "x_33"
+               OpName %x_92 "x_92"
+               OpName %x_76_phi "x_76_phi"
+               OpName %x_34_phi "x_34_phi"
+               OpName %x_25_phi "x_25_phi"
+               OpName %x_81 "x_81"
+               OpName %x_32 "x_32"
+               OpName %x_81_phi "x_81_phi"
+               OpName %x_32_phi "x_32_phi"
+               OpName %x_33_phi "x_33_phi"
+               OpName %x_90_phi "x_90_phi"
+               OpName %x_22_1 "x_22_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpName %yieldsZero_ "yieldsZero_"
+               OpName %x_116 "x_116"
+               OpName %x_20 "x_20"
+               OpName %i "i"
+               OpName %x_26 "x_26"
+               OpName %x_134 "x_134"
+               OpName %x_118_phi "x_118_phi"
+               OpName %x_27_phi "x_27_phi"
+               OpName %x_123 "x_123"
+               OpName %x_28 "x_28"
+               OpName %x_123_phi "x_123_phi"
+               OpName %x_28_phi "x_28_phi"
+               OpName %x_26_phi "x_26_phi"
+               OpName %x_132_phi "x_132_phi"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %_arr_int_uint_2 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %19 = OpConstantNull %bool
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+         %31 = OpConstantNull %_arr_int_uint_10
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+%_ptr_Function__arr_int_uint_2 = OpTypePointer Function %_arr_int_uint_2
+         %39 = OpConstantNull %_arr_int_uint_2
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %true = OpConstantTrue %bool
+     %uint_1 = OpConstant %uint 1
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+        %144 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %145 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %146 = OpTypeFunction %void %main_out
+        %158 = OpTypeFunction %int
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+       %x_68 = OpVariable %_ptr_Function_bool Function %19
+       %x_29 = OpVariable %_ptr_Function_int Function %23
+       %x_30 = OpVariable %_ptr_Function_int Function %23
+       %x_31 = OpVariable %_ptr_Function_int Function %23
+%globalNumbers = OpVariable %_ptr_Function__arr_int_uint_10 Function %31
+       %x_17 = OpVariable %_ptr_Function_int Function %23
+        %acc = OpVariable %_ptr_Function_int Function %23
+        %i_1 = OpVariable %_ptr_Function_int Function %23
+%localNumbers = OpVariable %_ptr_Function__arr_int_uint_2 Function %39
+      %param = OpVariable %_ptr_Function_int Function %23
+       %x_24 = OpVariable %_ptr_Function_int Function %23
+   %x_24_phi = OpVariable %_ptr_Function_int Function %23
+   %x_23_phi = OpVariable %_ptr_Function_int Function %23
+       %x_33 = OpVariable %_ptr_Function_int Function %23
+       %x_92 = OpVariable %_ptr_Function_int Function %23
+   %x_76_phi = OpVariable %_ptr_Function_bool Function %19
+   %x_34_phi = OpVariable %_ptr_Function_int Function %23
+   %x_25_phi = OpVariable %_ptr_Function_int Function %23
+       %x_81 = OpVariable %_ptr_Function_bool Function %19
+       %x_32 = OpVariable %_ptr_Function_int Function %23
+   %x_81_phi = OpVariable %_ptr_Function_bool Function %19
+   %x_32_phi = OpVariable %_ptr_Function_int Function %23
+   %x_33_phi = OpVariable %_ptr_Function_int Function %23
+   %x_90_phi = OpVariable %_ptr_Function_bool Function %19
+     %x_22_1 = OpVariable %_ptr_Function__arr_int_uint_2 Function %39
+               OpStore %x_68 %false
+               OpStore %acc %int_0
+               OpStore %i_1 %int_0
+               OpStore %x_24_phi %int_0
+               OpStore %x_23_phi %int_0
+               OpBranch %45
+         %45 = OpLabel
+               OpLoopMerge %46 %47 None
+               OpBranch %48
+         %48 = OpLabel
+         %54 = OpLoad %int %x_24_phi
+               OpStore %x_24 %54
+         %55 = OpLoad %int %x_23_phi
+         %57 = OpSLessThan %bool %55 %int_4
+               OpSelectionMerge %58 None
+               OpBranchConditional %57 %59 %60
+         %59 = OpLabel
+               OpBranch %58
+         %60 = OpLabel
+               OpBranch %46
+         %58 = OpLabel
+               OpStore %x_68 %false
+               OpStore %x_76_phi %false
+               OpBranch %61
+         %61 = OpLabel
+               OpLoopMerge %62 %63 None
+               OpBranch %64
+         %64 = OpLabel
+         %71 = OpLoad %bool %x_76_phi
+               OpStore %x_30 %int_0
+               OpStore %x_81_phi %71
+               OpStore %x_32_phi %int_0
+               OpBranch %72
+         %72 = OpLabel
+               OpLoopMerge %73 %74 None
+               OpBranch %75
+         %75 = OpLabel
+         %76 = OpLoad %bool %x_81_phi
+               OpStore %x_81 %76
+         %77 = OpLoad %int %x_32_phi
+               OpStore %x_32 %77
+         %80 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0
+         %81 = OpLoad %float %80
+               OpStore %x_33_phi %int_0
+         %82 = OpLoad %bool %x_81
+               OpStore %x_90_phi %82
+         %83 = OpLoad %int %x_32
+         %84 = OpConvertFToS %int %81
+         %85 = OpSLessThan %bool %83 %84
+               OpSelectionMerge %86 None
+               OpBranchConditional %85 %87 %88
+         %87 = OpLabel
+               OpBranch %86
+         %88 = OpLabel
+               OpBranch %73
+         %86 = OpLabel
+               OpStore %x_68 %true
+         %90 = OpLoad %int %x_32
+               OpStore %x_29 %90
+         %91 = OpLoad %int %x_32
+               OpStore %x_33_phi %91
+               OpStore %x_90_phi %true
+               OpBranch %73
+         %74 = OpLabel
+               OpStore %x_81_phi %false
+               OpStore %x_32_phi %int_0
+               OpBranch %72
+         %73 = OpLabel
+         %92 = OpLoad %int %x_33_phi
+               OpStore %x_33 %92
+         %93 = OpLoad %bool %x_90_phi
+         %94 = OpLoad %int %x_33
+               OpStore %x_34_phi %94
+               OpSelectionMerge %95 None
+               OpBranchConditional %93 %96 %95
+         %96 = OpLabel
+               OpBranch %62
+         %95 = OpLabel
+               OpStore %x_92 %int_0
+               OpStore %x_68 %true
+         %97 = OpLoad %int %x_92
+               OpStore %x_29 %97
+         %98 = OpLoad %int %x_92
+               OpStore %x_34_phi %98
+               OpBranch %62
+         %63 = OpLabel
+               OpStore %x_76_phi %false
+               OpBranch %61
+         %62 = OpLabel
+         %99 = OpLoad %int %x_34_phi
+               OpStore %x_31 %99
+        %100 = OpLoad %int %x_31
+        %101 = OpLoad %_arr_int_uint_2 %localNumbers
+               OpStore %x_22_1 %101
+        %104 = OpAccessChain %_ptr_Function_int %x_22_1 %uint_1
+               OpStore %104 %100
+        %105 = OpLoad %_arr_int_uint_2 %x_22_1
+               OpStore %localNumbers %105
+        %106 = OpAccessChain %_ptr_Function_int %globalNumbers %int_0
+               OpStore %106 %int_0
+        %107 = OpCompositeExtract %int %105 1
+               OpStore %param %107
+               OpStore %x_17 %int_0
+               OpStore %x_25_phi %int_0
+               OpBranch %108
+        %108 = OpLabel
+               OpLoopMerge %109 %110 None
+               OpBranch %111
+        %111 = OpLabel
+        %112 = OpLoad %int %x_25_phi
+        %113 = OpSLessThanEqual %bool %112 %107
+               OpSelectionMerge %114 None
+               OpBranchConditional %113 %115 %116
+        %115 = OpLabel
+               OpBranch %114
+        %116 = OpLabel
+               OpBranch %109
+        %114 = OpLabel
+        %117 = OpAccessChain %_ptr_Function_int %globalNumbers %107
+        %118 = OpLoad %int %117
+        %120 = OpSLessThanEqual %bool %118 %int_1
+               OpSelectionMerge %121 None
+               OpBranchConditional %120 %122 %121
+        %122 = OpLabel
+        %123 = OpAccessChain %_ptr_Function_int %globalNumbers %107
+               OpStore %123 %int_1
+               OpBranch %121
+        %121 = OpLabel
+               OpBranch %110
+        %110 = OpLabel
+        %124 = OpIAdd %int %112 %int_1
+               OpStore %x_17 %124
+               OpStore %x_25_phi %124
+               OpBranch %108
+        %109 = OpLabel
+        %125 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0
+        %126 = OpLoad %float %125
+        %127 = OpConvertFToS %int %126
+        %128 = OpISub %int %127 %int_1
+        %129 = OpAccessChain %_ptr_Function_int %globalNumbers %128
+        %130 = OpLoad %int %129
+        %132 = OpLoad %int %x_24
+        %133 = OpCopyObject %int %130
+        %134 = OpIAdd %int %132 %133
+        %131 = OpCopyObject %int %134
+               OpStore %acc %131
+               OpBranch %47
+         %47 = OpLabel
+        %135 = OpIAdd %int %55 %int_1
+               OpStore %i_1 %135
+               OpStore %x_24_phi %131
+               OpStore %x_23_phi %135
+               OpBranch %45
+         %46 = OpLabel
+        %136 = OpLoad %int %x_24
+        %137 = OpCopyObject %int %int_4
+        %138 = OpIEqual %bool %136 %137
+               OpSelectionMerge %139 None
+               OpBranchConditional %138 %140 %141
+        %140 = OpLabel
+               OpStore %x_GLF_color %144
+               OpBranch %139
+        %141 = OpLabel
+               OpStore %x_GLF_color %145
+               OpBranch %139
+        %139 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %146
+%tint_symbol = OpFunctionParameter %main_out
+        %150 = OpLabel
+        %151 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %151
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+        %153 = OpLabel
+        %154 = OpFunctionCall %void %main_1
+        %156 = OpLoad %v4float %x_GLF_color
+        %157 = OpCompositeConstruct %main_out %156
+        %155 = OpFunctionCall %void %tint_symbol_2 %157
+               OpReturn
+               OpFunctionEnd
+%yieldsZero_ = OpFunction %int None %158
+        %160 = OpLabel
+      %x_116 = OpVariable %_ptr_Function_bool Function %19
+       %x_20 = OpVariable %_ptr_Function_int Function %23
+          %i = OpVariable %_ptr_Function_int Function %23
+       %x_26 = OpVariable %_ptr_Function_int Function %23
+      %x_134 = OpVariable %_ptr_Function_int Function %23
+  %x_118_phi = OpVariable %_ptr_Function_bool Function %19
+   %x_27_phi = OpVariable %_ptr_Function_int Function %23
+      %x_123 = OpVariable %_ptr_Function_bool Function %19
+       %x_28 = OpVariable %_ptr_Function_int Function %23
+  %x_123_phi = OpVariable %_ptr_Function_bool Function %19
+   %x_28_phi = OpVariable %_ptr_Function_int Function %23
+   %x_26_phi = OpVariable %_ptr_Function_int Function %23
+  %x_132_phi = OpVariable %_ptr_Function_bool Function %19
+               OpStore %x_116 %false
+               OpStore %x_118_phi %false
+               OpBranch %168
+        %168 = OpLabel
+               OpLoopMerge %169 %170 None
+               OpBranch %171
+        %171 = OpLabel
+        %178 = OpLoad %bool %x_118_phi
+               OpStore %i %int_0
+               OpStore %x_123_phi %178
+               OpStore %x_28_phi %int_0
+               OpBranch %179
+        %179 = OpLabel
+               OpLoopMerge %180 %181 None
+               OpBranch %182
+        %182 = OpLabel
+        %183 = OpLoad %bool %x_123_phi
+               OpStore %x_123 %183
+        %184 = OpLoad %int %x_28_phi
+               OpStore %x_28 %184
+        %185 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0
+        %186 = OpLoad %float %185
+               OpStore %x_26_phi %int_0
+        %187 = OpLoad %bool %x_123
+               OpStore %x_132_phi %187
+        %188 = OpLoad %int %x_28
+        %189 = OpConvertFToS %int %186
+        %190 = OpSLessThan %bool %188 %189
+               OpSelectionMerge %191 None
+               OpBranchConditional %190 %192 %193
+        %192 = OpLabel
+               OpBranch %191
+        %193 = OpLabel
+               OpBranch %180
+        %191 = OpLabel
+               OpStore %x_116 %true
+        %194 = OpLoad %int %x_28
+               OpStore %x_20 %194
+        %195 = OpLoad %int %x_28
+               OpStore %x_26_phi %195
+               OpStore %x_132_phi %true
+               OpBranch %180
+        %181 = OpLabel
+               OpStore %x_123_phi %false
+               OpStore %x_28_phi %int_0
+               OpBranch %179
+        %180 = OpLabel
+        %196 = OpLoad %int %x_26_phi
+               OpStore %x_26 %196
+        %197 = OpLoad %bool %x_132_phi
+        %198 = OpLoad %int %x_26
+               OpStore %x_27_phi %198
+               OpSelectionMerge %199 None
+               OpBranchConditional %197 %200 %199
+        %200 = OpLabel
+               OpBranch %169
+        %199 = OpLabel
+               OpStore %x_134 %int_0
+               OpStore %x_116 %true
+        %201 = OpLoad %int %x_134
+               OpStore %x_20 %201
+        %202 = OpLoad %int %x_134
+               OpStore %x_27_phi %202
+               OpBranch %169
+        %170 = OpLabel
+               OpStore %x_118_phi %false
+               OpBranch %168
+        %169 = OpLabel
+        %203 = OpLoad %int %x_27_phi
+               OpReturnValue %203
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/global-array-loops/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/global-array-loops/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..68df8e3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/global-array-loops/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,212 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_68 : bool = false;
+  var x_29 : i32;
+  var x_30 : i32;
+  var x_31 : i32;
+  var globalNumbers : array<i32, 10>;
+  var x_17 : i32;
+  var acc : i32;
+  var i_1 : i32;
+  var localNumbers : array<i32, 2>;
+  var param : i32;
+  var x_24 : i32;
+  var x_24_phi : i32;
+  var x_23_phi : i32;
+  acc = 0;
+  i_1 = 0;
+  x_24_phi = 0;
+  x_23_phi = 0;
+  loop {
+    var x_33 : i32;
+    var x_92 : i32;
+    var x_76_phi : bool;
+    var x_34_phi : i32;
+    var x_25_phi : i32;
+    x_24 = x_24_phi;
+    let x_23 : i32 = x_23_phi;
+    if ((x_23 < 4)) {
+    } else {
+      break;
+    }
+    x_68 = false;
+    x_76_phi = false;
+    loop {
+      var x_81 : bool;
+      var x_32 : i32;
+      var x_81_phi : bool;
+      var x_32_phi : i32;
+      var x_33_phi : i32;
+      var x_90_phi : bool;
+      let x_76 : bool = x_76_phi;
+      x_30 = 0;
+      x_81_phi = x_76;
+      x_32_phi = 0;
+      loop {
+        x_81 = x_81_phi;
+        x_32 = x_32_phi;
+        let x_86 : f32 = x_8.one;
+        x_33_phi = 0;
+        x_90_phi = x_81;
+        if ((x_32 < i32(x_86))) {
+        } else {
+          break;
+        }
+        x_68 = true;
+        x_29 = x_32;
+        x_33_phi = x_32;
+        x_90_phi = true;
+        break;
+
+        continuing {
+          x_81_phi = false;
+          x_32_phi = 0;
+        }
+      }
+      x_33 = x_33_phi;
+      let x_90 : bool = x_90_phi;
+      x_34_phi = x_33;
+      if (x_90) {
+        break;
+      }
+      x_92 = 0;
+      x_68 = true;
+      x_29 = x_92;
+      x_34_phi = x_92;
+      break;
+
+      continuing {
+        x_76_phi = false;
+      }
+    }
+    let x_34 : i32 = x_34_phi;
+    x_31 = x_34;
+    let x_93 : i32 = x_31;
+    let x_21 : array<i32, 2> = localNumbers;
+    var x_22_1 : array<i32, 2> = x_21;
+    x_22_1[1u] = x_93;
+    let x_22 : array<i32, 2> = x_22_1;
+    localNumbers = x_22;
+    globalNumbers[0] = 0;
+    let x_95 : ptr<function, i32> = &(localNumbers[1]);
+    let x_13 : i32 = x_22[1u];
+    param = x_13;
+    x_17 = 0;
+    x_25_phi = 0;
+    loop {
+      let x_25 : i32 = x_25_phi;
+      if ((x_25 <= x_13)) {
+      } else {
+        break;
+      }
+      let x_102 : ptr<function, i32> = &(globalNumbers[x_13]);
+      let x_18 : i32 = *(x_102);
+      if ((x_18 <= 1)) {
+        *(x_102) = 1;
+      }
+
+      continuing {
+        let x_19 : i32 = (x_25 + 1);
+        x_17 = x_19;
+        x_25_phi = x_19;
+      }
+    }
+    let x_107 : f32 = x_8.one;
+    let x_14 : i32 = globalNumbers[(i32(x_107) - 1)];
+    let x_15 : i32 = bitcast<i32>((x_24 + bitcast<i32>(x_14)));
+    acc = x_15;
+
+    continuing {
+      let x_16 : i32 = (x_23 + 1);
+      i_1 = x_16;
+      x_24_phi = x_15;
+      x_23_phi = x_16;
+    }
+  }
+  if ((x_24 == bitcast<i32>(4))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+fn yieldsZero_() -> i32 {
+  var x_116 : bool = false;
+  var x_20 : i32;
+  var i : i32;
+  var x_26 : i32;
+  var x_134 : i32;
+  var x_118_phi : bool;
+  var x_27_phi : i32;
+  x_118_phi = false;
+  loop {
+    var x_123 : bool;
+    var x_28 : i32;
+    var x_123_phi : bool;
+    var x_28_phi : i32;
+    var x_26_phi : i32;
+    var x_132_phi : bool;
+    let x_118 : bool = x_118_phi;
+    i = 0;
+    x_123_phi = x_118;
+    x_28_phi = 0;
+    loop {
+      x_123 = x_123_phi;
+      x_28 = x_28_phi;
+      let x_128 : f32 = x_8.one;
+      x_26_phi = 0;
+      x_132_phi = x_123;
+      if ((x_28 < i32(x_128))) {
+      } else {
+        break;
+      }
+      x_116 = true;
+      x_20 = x_28;
+      x_26_phi = x_28;
+      x_132_phi = true;
+      break;
+
+      continuing {
+        x_123_phi = false;
+        x_28_phi = 0;
+      }
+    }
+    x_26 = x_26_phi;
+    let x_132 : bool = x_132_phi;
+    x_27_phi = x_26;
+    if (x_132) {
+      break;
+    }
+    x_134 = 0;
+    x_116 = true;
+    x_20 = x_134;
+    x_27_phi = x_134;
+    break;
+
+    continuing {
+      x_118_phi = false;
+    }
+  }
+  let x_27 : i32 = x_27_phi;
+  return x_27;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/global-array-loops/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/global-array-loops/0-opt.wgsl
new file mode 100644
index 0000000..68df8e3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/global-array-loops/0-opt.wgsl
@@ -0,0 +1,212 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_68 : bool = false;
+  var x_29 : i32;
+  var x_30 : i32;
+  var x_31 : i32;
+  var globalNumbers : array<i32, 10>;
+  var x_17 : i32;
+  var acc : i32;
+  var i_1 : i32;
+  var localNumbers : array<i32, 2>;
+  var param : i32;
+  var x_24 : i32;
+  var x_24_phi : i32;
+  var x_23_phi : i32;
+  acc = 0;
+  i_1 = 0;
+  x_24_phi = 0;
+  x_23_phi = 0;
+  loop {
+    var x_33 : i32;
+    var x_92 : i32;
+    var x_76_phi : bool;
+    var x_34_phi : i32;
+    var x_25_phi : i32;
+    x_24 = x_24_phi;
+    let x_23 : i32 = x_23_phi;
+    if ((x_23 < 4)) {
+    } else {
+      break;
+    }
+    x_68 = false;
+    x_76_phi = false;
+    loop {
+      var x_81 : bool;
+      var x_32 : i32;
+      var x_81_phi : bool;
+      var x_32_phi : i32;
+      var x_33_phi : i32;
+      var x_90_phi : bool;
+      let x_76 : bool = x_76_phi;
+      x_30 = 0;
+      x_81_phi = x_76;
+      x_32_phi = 0;
+      loop {
+        x_81 = x_81_phi;
+        x_32 = x_32_phi;
+        let x_86 : f32 = x_8.one;
+        x_33_phi = 0;
+        x_90_phi = x_81;
+        if ((x_32 < i32(x_86))) {
+        } else {
+          break;
+        }
+        x_68 = true;
+        x_29 = x_32;
+        x_33_phi = x_32;
+        x_90_phi = true;
+        break;
+
+        continuing {
+          x_81_phi = false;
+          x_32_phi = 0;
+        }
+      }
+      x_33 = x_33_phi;
+      let x_90 : bool = x_90_phi;
+      x_34_phi = x_33;
+      if (x_90) {
+        break;
+      }
+      x_92 = 0;
+      x_68 = true;
+      x_29 = x_92;
+      x_34_phi = x_92;
+      break;
+
+      continuing {
+        x_76_phi = false;
+      }
+    }
+    let x_34 : i32 = x_34_phi;
+    x_31 = x_34;
+    let x_93 : i32 = x_31;
+    let x_21 : array<i32, 2> = localNumbers;
+    var x_22_1 : array<i32, 2> = x_21;
+    x_22_1[1u] = x_93;
+    let x_22 : array<i32, 2> = x_22_1;
+    localNumbers = x_22;
+    globalNumbers[0] = 0;
+    let x_95 : ptr<function, i32> = &(localNumbers[1]);
+    let x_13 : i32 = x_22[1u];
+    param = x_13;
+    x_17 = 0;
+    x_25_phi = 0;
+    loop {
+      let x_25 : i32 = x_25_phi;
+      if ((x_25 <= x_13)) {
+      } else {
+        break;
+      }
+      let x_102 : ptr<function, i32> = &(globalNumbers[x_13]);
+      let x_18 : i32 = *(x_102);
+      if ((x_18 <= 1)) {
+        *(x_102) = 1;
+      }
+
+      continuing {
+        let x_19 : i32 = (x_25 + 1);
+        x_17 = x_19;
+        x_25_phi = x_19;
+      }
+    }
+    let x_107 : f32 = x_8.one;
+    let x_14 : i32 = globalNumbers[(i32(x_107) - 1)];
+    let x_15 : i32 = bitcast<i32>((x_24 + bitcast<i32>(x_14)));
+    acc = x_15;
+
+    continuing {
+      let x_16 : i32 = (x_23 + 1);
+      i_1 = x_16;
+      x_24_phi = x_15;
+      x_23_phi = x_16;
+    }
+  }
+  if ((x_24 == bitcast<i32>(4))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+fn yieldsZero_() -> i32 {
+  var x_116 : bool = false;
+  var x_20 : i32;
+  var i : i32;
+  var x_26 : i32;
+  var x_134 : i32;
+  var x_118_phi : bool;
+  var x_27_phi : i32;
+  x_118_phi = false;
+  loop {
+    var x_123 : bool;
+    var x_28 : i32;
+    var x_123_phi : bool;
+    var x_28_phi : i32;
+    var x_26_phi : i32;
+    var x_132_phi : bool;
+    let x_118 : bool = x_118_phi;
+    i = 0;
+    x_123_phi = x_118;
+    x_28_phi = 0;
+    loop {
+      x_123 = x_123_phi;
+      x_28 = x_28_phi;
+      let x_128 : f32 = x_8.one;
+      x_26_phi = 0;
+      x_132_phi = x_123;
+      if ((x_28 < i32(x_128))) {
+      } else {
+        break;
+      }
+      x_116 = true;
+      x_20 = x_28;
+      x_26_phi = x_28;
+      x_132_phi = true;
+      break;
+
+      continuing {
+        x_123_phi = false;
+        x_28_phi = 0;
+      }
+    }
+    x_26 = x_26_phi;
+    let x_132 : bool = x_132_phi;
+    x_27_phi = x_26;
+    if (x_132) {
+      break;
+    }
+    x_134 = 0;
+    x_116 = true;
+    x_20 = x_134;
+    x_27_phi = x_134;
+    break;
+
+    continuing {
+      x_118_phi = false;
+    }
+  }
+  let x_27 : i32 = x_27_phi;
+  return x_27;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/global-array-loops/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/global-array-loops/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..adb4b13
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/global-array-loops/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,201 @@
+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);
+
+void main_1() {
+  bool x_68 = false;
+  int x_29 = 0;
+  int x_30 = 0;
+  int x_31 = 0;
+  int globalNumbers[10] = (int[10])0;
+  int x_17 = 0;
+  int acc = 0;
+  int i_1 = 0;
+  int localNumbers[2] = (int[2])0;
+  int param = 0;
+  int x_24 = 0;
+  int x_24_phi = 0;
+  int x_23_phi = 0;
+  acc = 0;
+  i_1 = 0;
+  x_24_phi = 0;
+  x_23_phi = 0;
+  while (true) {
+    int x_33 = 0;
+    int x_92 = 0;
+    bool x_76_phi = false;
+    int x_34_phi = 0;
+    int x_25_phi = 0;
+    x_24 = x_24_phi;
+    const int x_23 = x_23_phi;
+    if ((x_23 < 4)) {
+    } else {
+      break;
+    }
+    x_68 = false;
+    x_76_phi = false;
+    while (true) {
+      bool x_81 = false;
+      int x_32 = 0;
+      bool x_81_phi = false;
+      int x_32_phi = 0;
+      int x_33_phi = 0;
+      bool x_90_phi = false;
+      const bool x_76 = x_76_phi;
+      x_30 = 0;
+      x_81_phi = x_76;
+      x_32_phi = 0;
+      while (true) {
+        x_81 = x_81_phi;
+        x_32 = x_32_phi;
+        const float x_86 = asfloat(x_8[0].x);
+        x_33_phi = 0;
+        x_90_phi = x_81;
+        if ((x_32 < int(x_86))) {
+        } else {
+          break;
+        }
+        x_68 = true;
+        x_29 = x_32;
+        x_33_phi = x_32;
+        x_90_phi = true;
+        break;
+        {
+          x_81_phi = false;
+          x_32_phi = 0;
+        }
+      }
+      x_33 = x_33_phi;
+      const bool x_90 = x_90_phi;
+      x_34_phi = x_33;
+      if (x_90) {
+        break;
+      }
+      x_92 = 0;
+      x_68 = true;
+      x_29 = x_92;
+      x_34_phi = x_92;
+      break;
+      {
+        x_76_phi = false;
+      }
+    }
+    x_31 = x_34_phi;
+    const int x_93 = x_31;
+    int x_22_1[2] = localNumbers;
+    x_22_1[1u] = x_93;
+    const int x_22[2] = x_22_1;
+    localNumbers = x_22;
+    globalNumbers[0] = 0;
+    const int x_13 = x_22[1u];
+    param = x_13;
+    x_17 = 0;
+    x_25_phi = 0;
+    while (true) {
+      const int x_25 = x_25_phi;
+      if ((x_25 <= x_13)) {
+      } else {
+        break;
+      }
+      const int x_102_save = x_13;
+      const int x_18 = globalNumbers[x_102_save];
+      if ((x_18 <= 1)) {
+        globalNumbers[x_102_save] = 1;
+      }
+      {
+        const int x_19 = (x_25 + 1);
+        x_17 = x_19;
+        x_25_phi = x_19;
+      }
+    }
+    const float x_107 = asfloat(x_8[0].x);
+    const int x_14 = globalNumbers[(int(x_107) - 1)];
+    const int x_15 = asint((x_24 + asint(x_14)));
+    acc = x_15;
+    {
+      const int x_16 = (x_23 + 1);
+      i_1 = x_16;
+      x_24_phi = x_15;
+      x_23_phi = x_16;
+    }
+  }
+  if ((x_24 == asint(4))) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
+int yieldsZero_() {
+  bool x_116 = false;
+  int x_20 = 0;
+  int i = 0;
+  int x_26 = 0;
+  int x_134 = 0;
+  bool x_118_phi = false;
+  int x_27_phi = 0;
+  x_118_phi = false;
+  while (true) {
+    bool x_123 = false;
+    int x_28 = 0;
+    bool x_123_phi = false;
+    int x_28_phi = 0;
+    int x_26_phi = 0;
+    bool x_132_phi = false;
+    const bool x_118 = x_118_phi;
+    i = 0;
+    x_123_phi = x_118;
+    x_28_phi = 0;
+    while (true) {
+      x_123 = x_123_phi;
+      x_28 = x_28_phi;
+      const float x_128 = asfloat(x_8[0].x);
+      x_26_phi = 0;
+      x_132_phi = x_123;
+      if ((x_28 < int(x_128))) {
+      } else {
+        break;
+      }
+      x_116 = true;
+      x_20 = x_28;
+      x_26_phi = x_28;
+      x_132_phi = true;
+      break;
+      {
+        x_123_phi = false;
+        x_28_phi = 0;
+      }
+    }
+    x_26 = x_26_phi;
+    const bool x_132 = x_132_phi;
+    x_27_phi = x_26;
+    if (x_132) {
+      break;
+    }
+    x_134 = 0;
+    x_116 = true;
+    x_20 = x_134;
+    x_27_phi = x_134;
+    break;
+    {
+      x_118_phi = false;
+    }
+  }
+  return x_27_phi;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/global-array-loops/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/global-array-loops/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..7d54d73
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/global-array-loops/0-opt.wgsl.expected.msl
@@ -0,0 +1,213 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float one;
+};
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct tint_array_wrapper_1 {
+  int arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_4) {
+  bool x_68 = false;
+  int x_29 = 0;
+  int x_30 = 0;
+  int x_31 = 0;
+  tint_array_wrapper globalNumbers = {};
+  int x_17 = 0;
+  int acc = 0;
+  int i_1 = 0;
+  tint_array_wrapper_1 localNumbers = {};
+  int param = 0;
+  int x_24 = 0;
+  int x_24_phi = 0;
+  int x_23_phi = 0;
+  acc = 0;
+  i_1 = 0;
+  x_24_phi = 0;
+  x_23_phi = 0;
+  while (true) {
+    int x_33 = 0;
+    int x_92 = 0;
+    bool x_76_phi = false;
+    int x_34_phi = 0;
+    int x_25_phi = 0;
+    x_24 = x_24_phi;
+    int const x_23 = x_23_phi;
+    if ((x_23 < 4)) {
+    } else {
+      break;
+    }
+    x_68 = false;
+    x_76_phi = false;
+    while (true) {
+      bool x_81 = false;
+      int x_32 = 0;
+      bool x_81_phi = false;
+      int x_32_phi = 0;
+      int x_33_phi = 0;
+      bool x_90_phi = false;
+      bool const x_76 = x_76_phi;
+      x_30 = 0;
+      x_81_phi = x_76;
+      x_32_phi = 0;
+      while (true) {
+        x_81 = x_81_phi;
+        x_32 = x_32_phi;
+        float const x_86 = x_8.one;
+        x_33_phi = 0;
+        x_90_phi = x_81;
+        if ((x_32 < int(x_86))) {
+        } else {
+          break;
+        }
+        x_68 = true;
+        x_29 = x_32;
+        x_33_phi = x_32;
+        x_90_phi = true;
+        break;
+        {
+          x_81_phi = false;
+          x_32_phi = 0;
+        }
+      }
+      x_33 = x_33_phi;
+      bool const x_90 = x_90_phi;
+      x_34_phi = x_33;
+      if (x_90) {
+        break;
+      }
+      x_92 = 0;
+      x_68 = true;
+      x_29 = x_92;
+      x_34_phi = x_92;
+      break;
+      {
+        x_76_phi = false;
+      }
+    }
+    int const x_34 = x_34_phi;
+    x_31 = x_34;
+    int const x_93 = x_31;
+    tint_array_wrapper_1 const x_21 = localNumbers;
+    tint_array_wrapper_1 x_22_1 = x_21;
+    x_22_1.arr[1u] = x_93;
+    tint_array_wrapper_1 const x_22 = x_22_1;
+    localNumbers = x_22;
+    globalNumbers.arr[0] = 0;
+    int const x_13 = x_22.arr[1u];
+    param = x_13;
+    x_17 = 0;
+    x_25_phi = 0;
+    while (true) {
+      int const x_25 = x_25_phi;
+      if ((x_25 <= x_13)) {
+      } else {
+        break;
+      }
+      int const x_102_save = x_13;
+      int const x_18 = globalNumbers.arr[x_102_save];
+      if ((x_18 <= 1)) {
+        globalNumbers.arr[x_102_save] = 1;
+      }
+      {
+        int const x_19 = (x_25 + 1);
+        x_17 = x_19;
+        x_25_phi = x_19;
+      }
+    }
+    float const x_107 = x_8.one;
+    int const x_14 = globalNumbers.arr[(int(x_107) - 1)];
+    int const x_15 = as_type<int>((x_24 + as_type<int>(x_14)));
+    acc = x_15;
+    {
+      int const x_16 = (x_23 + 1);
+      i_1 = x_16;
+      x_24_phi = x_15;
+      x_23_phi = x_16;
+    }
+  }
+  if ((x_24 == as_type<int>(4))) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
+int yieldsZero_(constant buf0& x_8) {
+  bool x_116 = false;
+  int x_20 = 0;
+  int i = 0;
+  int x_26 = 0;
+  int x_134 = 0;
+  bool x_118_phi = false;
+  int x_27_phi = 0;
+  x_118_phi = false;
+  while (true) {
+    bool x_123 = false;
+    int x_28 = 0;
+    bool x_123_phi = false;
+    int x_28_phi = 0;
+    int x_26_phi = 0;
+    bool x_132_phi = false;
+    bool const x_118 = x_118_phi;
+    i = 0;
+    x_123_phi = x_118;
+    x_28_phi = 0;
+    while (true) {
+      x_123 = x_123_phi;
+      x_28 = x_28_phi;
+      float const x_128 = x_8.one;
+      x_26_phi = 0;
+      x_132_phi = x_123;
+      if ((x_28 < int(x_128))) {
+      } else {
+        break;
+      }
+      x_116 = true;
+      x_20 = x_28;
+      x_26_phi = x_28;
+      x_132_phi = true;
+      break;
+      {
+        x_123_phi = false;
+        x_28_phi = 0;
+      }
+    }
+    x_26 = x_26_phi;
+    bool const x_132 = x_132_phi;
+    x_27_phi = x_26;
+    if (x_132) {
+      break;
+    }
+    x_134 = 0;
+    x_116 = true;
+    x_20 = x_134;
+    x_27_phi = x_134;
+    break;
+    {
+      x_118_phi = false;
+    }
+  }
+  int const x_27 = x_27_phi;
+  return x_27;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/global-array-loops/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/global-array-loops/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..02fd4f3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/global-array-loops/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,406 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 204
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_68 "x_68"
+               OpName %x_29 "x_29"
+               OpName %x_30 "x_30"
+               OpName %x_31 "x_31"
+               OpName %globalNumbers "globalNumbers"
+               OpName %x_17 "x_17"
+               OpName %acc "acc"
+               OpName %i_1 "i_1"
+               OpName %localNumbers "localNumbers"
+               OpName %param "param"
+               OpName %x_24 "x_24"
+               OpName %x_24_phi "x_24_phi"
+               OpName %x_23_phi "x_23_phi"
+               OpName %x_33 "x_33"
+               OpName %x_92 "x_92"
+               OpName %x_76_phi "x_76_phi"
+               OpName %x_34_phi "x_34_phi"
+               OpName %x_25_phi "x_25_phi"
+               OpName %x_81 "x_81"
+               OpName %x_32 "x_32"
+               OpName %x_81_phi "x_81_phi"
+               OpName %x_32_phi "x_32_phi"
+               OpName %x_33_phi "x_33_phi"
+               OpName %x_90_phi "x_90_phi"
+               OpName %x_22_1 "x_22_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpName %yieldsZero_ "yieldsZero_"
+               OpName %x_116 "x_116"
+               OpName %x_20 "x_20"
+               OpName %i "i"
+               OpName %x_26 "x_26"
+               OpName %x_134 "x_134"
+               OpName %x_118_phi "x_118_phi"
+               OpName %x_27_phi "x_27_phi"
+               OpName %x_123 "x_123"
+               OpName %x_28 "x_28"
+               OpName %x_123_phi "x_123_phi"
+               OpName %x_28_phi "x_28_phi"
+               OpName %x_26_phi "x_26_phi"
+               OpName %x_132_phi "x_132_phi"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %_arr_int_uint_2 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %19 = OpConstantNull %bool
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+         %31 = OpConstantNull %_arr_int_uint_10
+     %uint_2 = OpConstant %uint 2
+%_arr_int_uint_2 = OpTypeArray %int %uint_2
+%_ptr_Function__arr_int_uint_2 = OpTypePointer Function %_arr_int_uint_2
+         %39 = OpConstantNull %_arr_int_uint_2
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %true = OpConstantTrue %bool
+     %uint_1 = OpConstant %uint 1
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+        %144 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %145 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %146 = OpTypeFunction %void %main_out
+        %158 = OpTypeFunction %int
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+       %x_68 = OpVariable %_ptr_Function_bool Function %19
+       %x_29 = OpVariable %_ptr_Function_int Function %23
+       %x_30 = OpVariable %_ptr_Function_int Function %23
+       %x_31 = OpVariable %_ptr_Function_int Function %23
+%globalNumbers = OpVariable %_ptr_Function__arr_int_uint_10 Function %31
+       %x_17 = OpVariable %_ptr_Function_int Function %23
+        %acc = OpVariable %_ptr_Function_int Function %23
+        %i_1 = OpVariable %_ptr_Function_int Function %23
+%localNumbers = OpVariable %_ptr_Function__arr_int_uint_2 Function %39
+      %param = OpVariable %_ptr_Function_int Function %23
+       %x_24 = OpVariable %_ptr_Function_int Function %23
+   %x_24_phi = OpVariable %_ptr_Function_int Function %23
+   %x_23_phi = OpVariable %_ptr_Function_int Function %23
+       %x_33 = OpVariable %_ptr_Function_int Function %23
+       %x_92 = OpVariable %_ptr_Function_int Function %23
+   %x_76_phi = OpVariable %_ptr_Function_bool Function %19
+   %x_34_phi = OpVariable %_ptr_Function_int Function %23
+   %x_25_phi = OpVariable %_ptr_Function_int Function %23
+       %x_81 = OpVariable %_ptr_Function_bool Function %19
+       %x_32 = OpVariable %_ptr_Function_int Function %23
+   %x_81_phi = OpVariable %_ptr_Function_bool Function %19
+   %x_32_phi = OpVariable %_ptr_Function_int Function %23
+   %x_33_phi = OpVariable %_ptr_Function_int Function %23
+   %x_90_phi = OpVariable %_ptr_Function_bool Function %19
+     %x_22_1 = OpVariable %_ptr_Function__arr_int_uint_2 Function %39
+               OpStore %x_68 %false
+               OpStore %acc %int_0
+               OpStore %i_1 %int_0
+               OpStore %x_24_phi %int_0
+               OpStore %x_23_phi %int_0
+               OpBranch %45
+         %45 = OpLabel
+               OpLoopMerge %46 %47 None
+               OpBranch %48
+         %48 = OpLabel
+         %54 = OpLoad %int %x_24_phi
+               OpStore %x_24 %54
+         %55 = OpLoad %int %x_23_phi
+         %57 = OpSLessThan %bool %55 %int_4
+               OpSelectionMerge %58 None
+               OpBranchConditional %57 %59 %60
+         %59 = OpLabel
+               OpBranch %58
+         %60 = OpLabel
+               OpBranch %46
+         %58 = OpLabel
+               OpStore %x_68 %false
+               OpStore %x_76_phi %false
+               OpBranch %61
+         %61 = OpLabel
+               OpLoopMerge %62 %63 None
+               OpBranch %64
+         %64 = OpLabel
+         %71 = OpLoad %bool %x_76_phi
+               OpStore %x_30 %int_0
+               OpStore %x_81_phi %71
+               OpStore %x_32_phi %int_0
+               OpBranch %72
+         %72 = OpLabel
+               OpLoopMerge %73 %74 None
+               OpBranch %75
+         %75 = OpLabel
+         %76 = OpLoad %bool %x_81_phi
+               OpStore %x_81 %76
+         %77 = OpLoad %int %x_32_phi
+               OpStore %x_32 %77
+         %80 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0
+         %81 = OpLoad %float %80
+               OpStore %x_33_phi %int_0
+         %82 = OpLoad %bool %x_81
+               OpStore %x_90_phi %82
+         %83 = OpLoad %int %x_32
+         %84 = OpConvertFToS %int %81
+         %85 = OpSLessThan %bool %83 %84
+               OpSelectionMerge %86 None
+               OpBranchConditional %85 %87 %88
+         %87 = OpLabel
+               OpBranch %86
+         %88 = OpLabel
+               OpBranch %73
+         %86 = OpLabel
+               OpStore %x_68 %true
+         %90 = OpLoad %int %x_32
+               OpStore %x_29 %90
+         %91 = OpLoad %int %x_32
+               OpStore %x_33_phi %91
+               OpStore %x_90_phi %true
+               OpBranch %73
+         %74 = OpLabel
+               OpStore %x_81_phi %false
+               OpStore %x_32_phi %int_0
+               OpBranch %72
+         %73 = OpLabel
+         %92 = OpLoad %int %x_33_phi
+               OpStore %x_33 %92
+         %93 = OpLoad %bool %x_90_phi
+         %94 = OpLoad %int %x_33
+               OpStore %x_34_phi %94
+               OpSelectionMerge %95 None
+               OpBranchConditional %93 %96 %95
+         %96 = OpLabel
+               OpBranch %62
+         %95 = OpLabel
+               OpStore %x_92 %int_0
+               OpStore %x_68 %true
+         %97 = OpLoad %int %x_92
+               OpStore %x_29 %97
+         %98 = OpLoad %int %x_92
+               OpStore %x_34_phi %98
+               OpBranch %62
+         %63 = OpLabel
+               OpStore %x_76_phi %false
+               OpBranch %61
+         %62 = OpLabel
+         %99 = OpLoad %int %x_34_phi
+               OpStore %x_31 %99
+        %100 = OpLoad %int %x_31
+        %101 = OpLoad %_arr_int_uint_2 %localNumbers
+               OpStore %x_22_1 %101
+        %104 = OpAccessChain %_ptr_Function_int %x_22_1 %uint_1
+               OpStore %104 %100
+        %105 = OpLoad %_arr_int_uint_2 %x_22_1
+               OpStore %localNumbers %105
+        %106 = OpAccessChain %_ptr_Function_int %globalNumbers %int_0
+               OpStore %106 %int_0
+        %107 = OpCompositeExtract %int %105 1
+               OpStore %param %107
+               OpStore %x_17 %int_0
+               OpStore %x_25_phi %int_0
+               OpBranch %108
+        %108 = OpLabel
+               OpLoopMerge %109 %110 None
+               OpBranch %111
+        %111 = OpLabel
+        %112 = OpLoad %int %x_25_phi
+        %113 = OpSLessThanEqual %bool %112 %107
+               OpSelectionMerge %114 None
+               OpBranchConditional %113 %115 %116
+        %115 = OpLabel
+               OpBranch %114
+        %116 = OpLabel
+               OpBranch %109
+        %114 = OpLabel
+        %117 = OpAccessChain %_ptr_Function_int %globalNumbers %107
+        %118 = OpLoad %int %117
+        %120 = OpSLessThanEqual %bool %118 %int_1
+               OpSelectionMerge %121 None
+               OpBranchConditional %120 %122 %121
+        %122 = OpLabel
+        %123 = OpAccessChain %_ptr_Function_int %globalNumbers %107
+               OpStore %123 %int_1
+               OpBranch %121
+        %121 = OpLabel
+               OpBranch %110
+        %110 = OpLabel
+        %124 = OpIAdd %int %112 %int_1
+               OpStore %x_17 %124
+               OpStore %x_25_phi %124
+               OpBranch %108
+        %109 = OpLabel
+        %125 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0
+        %126 = OpLoad %float %125
+        %127 = OpConvertFToS %int %126
+        %128 = OpISub %int %127 %int_1
+        %129 = OpAccessChain %_ptr_Function_int %globalNumbers %128
+        %130 = OpLoad %int %129
+        %132 = OpLoad %int %x_24
+        %133 = OpCopyObject %int %130
+        %134 = OpIAdd %int %132 %133
+        %131 = OpCopyObject %int %134
+               OpStore %acc %131
+               OpBranch %47
+         %47 = OpLabel
+        %135 = OpIAdd %int %55 %int_1
+               OpStore %i_1 %135
+               OpStore %x_24_phi %131
+               OpStore %x_23_phi %135
+               OpBranch %45
+         %46 = OpLabel
+        %136 = OpLoad %int %x_24
+        %137 = OpCopyObject %int %int_4
+        %138 = OpIEqual %bool %136 %137
+               OpSelectionMerge %139 None
+               OpBranchConditional %138 %140 %141
+        %140 = OpLabel
+               OpStore %x_GLF_color %144
+               OpBranch %139
+        %141 = OpLabel
+               OpStore %x_GLF_color %145
+               OpBranch %139
+        %139 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %146
+%tint_symbol = OpFunctionParameter %main_out
+        %150 = OpLabel
+        %151 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %151
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+        %153 = OpLabel
+        %154 = OpFunctionCall %void %main_1
+        %156 = OpLoad %v4float %x_GLF_color
+        %157 = OpCompositeConstruct %main_out %156
+        %155 = OpFunctionCall %void %tint_symbol_2 %157
+               OpReturn
+               OpFunctionEnd
+%yieldsZero_ = OpFunction %int None %158
+        %160 = OpLabel
+      %x_116 = OpVariable %_ptr_Function_bool Function %19
+       %x_20 = OpVariable %_ptr_Function_int Function %23
+          %i = OpVariable %_ptr_Function_int Function %23
+       %x_26 = OpVariable %_ptr_Function_int Function %23
+      %x_134 = OpVariable %_ptr_Function_int Function %23
+  %x_118_phi = OpVariable %_ptr_Function_bool Function %19
+   %x_27_phi = OpVariable %_ptr_Function_int Function %23
+      %x_123 = OpVariable %_ptr_Function_bool Function %19
+       %x_28 = OpVariable %_ptr_Function_int Function %23
+  %x_123_phi = OpVariable %_ptr_Function_bool Function %19
+   %x_28_phi = OpVariable %_ptr_Function_int Function %23
+   %x_26_phi = OpVariable %_ptr_Function_int Function %23
+  %x_132_phi = OpVariable %_ptr_Function_bool Function %19
+               OpStore %x_116 %false
+               OpStore %x_118_phi %false
+               OpBranch %168
+        %168 = OpLabel
+               OpLoopMerge %169 %170 None
+               OpBranch %171
+        %171 = OpLabel
+        %178 = OpLoad %bool %x_118_phi
+               OpStore %i %int_0
+               OpStore %x_123_phi %178
+               OpStore %x_28_phi %int_0
+               OpBranch %179
+        %179 = OpLabel
+               OpLoopMerge %180 %181 None
+               OpBranch %182
+        %182 = OpLabel
+        %183 = OpLoad %bool %x_123_phi
+               OpStore %x_123 %183
+        %184 = OpLoad %int %x_28_phi
+               OpStore %x_28 %184
+        %185 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0
+        %186 = OpLoad %float %185
+               OpStore %x_26_phi %int_0
+        %187 = OpLoad %bool %x_123
+               OpStore %x_132_phi %187
+        %188 = OpLoad %int %x_28
+        %189 = OpConvertFToS %int %186
+        %190 = OpSLessThan %bool %188 %189
+               OpSelectionMerge %191 None
+               OpBranchConditional %190 %192 %193
+        %192 = OpLabel
+               OpBranch %191
+        %193 = OpLabel
+               OpBranch %180
+        %191 = OpLabel
+               OpStore %x_116 %true
+        %194 = OpLoad %int %x_28
+               OpStore %x_20 %194
+        %195 = OpLoad %int %x_28
+               OpStore %x_26_phi %195
+               OpStore %x_132_phi %true
+               OpBranch %180
+        %181 = OpLabel
+               OpStore %x_123_phi %false
+               OpStore %x_28_phi %int_0
+               OpBranch %179
+        %180 = OpLabel
+        %196 = OpLoad %int %x_26_phi
+               OpStore %x_26 %196
+        %197 = OpLoad %bool %x_132_phi
+        %198 = OpLoad %int %x_26
+               OpStore %x_27_phi %198
+               OpSelectionMerge %199 None
+               OpBranchConditional %197 %200 %199
+        %200 = OpLabel
+               OpBranch %169
+        %199 = OpLabel
+               OpStore %x_134 %int_0
+               OpStore %x_116 %true
+        %201 = OpLoad %int %x_134
+               OpStore %x_20 %201
+        %202 = OpLoad %int %x_134
+               OpStore %x_27_phi %202
+               OpBranch %169
+        %170 = OpLabel
+               OpStore %x_118_phi %false
+               OpBranch %168
+        %169 = OpLabel
+        %203 = OpLoad %int %x_27_phi
+               OpReturnValue %203
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/global-array-loops/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/global-array-loops/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..68df8e3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/global-array-loops/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,212 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_68 : bool = false;
+  var x_29 : i32;
+  var x_30 : i32;
+  var x_31 : i32;
+  var globalNumbers : array<i32, 10>;
+  var x_17 : i32;
+  var acc : i32;
+  var i_1 : i32;
+  var localNumbers : array<i32, 2>;
+  var param : i32;
+  var x_24 : i32;
+  var x_24_phi : i32;
+  var x_23_phi : i32;
+  acc = 0;
+  i_1 = 0;
+  x_24_phi = 0;
+  x_23_phi = 0;
+  loop {
+    var x_33 : i32;
+    var x_92 : i32;
+    var x_76_phi : bool;
+    var x_34_phi : i32;
+    var x_25_phi : i32;
+    x_24 = x_24_phi;
+    let x_23 : i32 = x_23_phi;
+    if ((x_23 < 4)) {
+    } else {
+      break;
+    }
+    x_68 = false;
+    x_76_phi = false;
+    loop {
+      var x_81 : bool;
+      var x_32 : i32;
+      var x_81_phi : bool;
+      var x_32_phi : i32;
+      var x_33_phi : i32;
+      var x_90_phi : bool;
+      let x_76 : bool = x_76_phi;
+      x_30 = 0;
+      x_81_phi = x_76;
+      x_32_phi = 0;
+      loop {
+        x_81 = x_81_phi;
+        x_32 = x_32_phi;
+        let x_86 : f32 = x_8.one;
+        x_33_phi = 0;
+        x_90_phi = x_81;
+        if ((x_32 < i32(x_86))) {
+        } else {
+          break;
+        }
+        x_68 = true;
+        x_29 = x_32;
+        x_33_phi = x_32;
+        x_90_phi = true;
+        break;
+
+        continuing {
+          x_81_phi = false;
+          x_32_phi = 0;
+        }
+      }
+      x_33 = x_33_phi;
+      let x_90 : bool = x_90_phi;
+      x_34_phi = x_33;
+      if (x_90) {
+        break;
+      }
+      x_92 = 0;
+      x_68 = true;
+      x_29 = x_92;
+      x_34_phi = x_92;
+      break;
+
+      continuing {
+        x_76_phi = false;
+      }
+    }
+    let x_34 : i32 = x_34_phi;
+    x_31 = x_34;
+    let x_93 : i32 = x_31;
+    let x_21 : array<i32, 2> = localNumbers;
+    var x_22_1 : array<i32, 2> = x_21;
+    x_22_1[1u] = x_93;
+    let x_22 : array<i32, 2> = x_22_1;
+    localNumbers = x_22;
+    globalNumbers[0] = 0;
+    let x_95 : ptr<function, i32> = &(localNumbers[1]);
+    let x_13 : i32 = x_22[1u];
+    param = x_13;
+    x_17 = 0;
+    x_25_phi = 0;
+    loop {
+      let x_25 : i32 = x_25_phi;
+      if ((x_25 <= x_13)) {
+      } else {
+        break;
+      }
+      let x_102 : ptr<function, i32> = &(globalNumbers[x_13]);
+      let x_18 : i32 = *(x_102);
+      if ((x_18 <= 1)) {
+        *(x_102) = 1;
+      }
+
+      continuing {
+        let x_19 : i32 = (x_25 + 1);
+        x_17 = x_19;
+        x_25_phi = x_19;
+      }
+    }
+    let x_107 : f32 = x_8.one;
+    let x_14 : i32 = globalNumbers[(i32(x_107) - 1)];
+    let x_15 : i32 = bitcast<i32>((x_24 + bitcast<i32>(x_14)));
+    acc = x_15;
+
+    continuing {
+      let x_16 : i32 = (x_23 + 1);
+      i_1 = x_16;
+      x_24_phi = x_15;
+      x_23_phi = x_16;
+    }
+  }
+  if ((x_24 == bitcast<i32>(4))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+fn yieldsZero_() -> i32 {
+  var x_116 : bool = false;
+  var x_20 : i32;
+  var i : i32;
+  var x_26 : i32;
+  var x_134 : i32;
+  var x_118_phi : bool;
+  var x_27_phi : i32;
+  x_118_phi = false;
+  loop {
+    var x_123 : bool;
+    var x_28 : i32;
+    var x_123_phi : bool;
+    var x_28_phi : i32;
+    var x_26_phi : i32;
+    var x_132_phi : bool;
+    let x_118 : bool = x_118_phi;
+    i = 0;
+    x_123_phi = x_118;
+    x_28_phi = 0;
+    loop {
+      x_123 = x_123_phi;
+      x_28 = x_28_phi;
+      let x_128 : f32 = x_8.one;
+      x_26_phi = 0;
+      x_132_phi = x_123;
+      if ((x_28 < i32(x_128))) {
+      } else {
+        break;
+      }
+      x_116 = true;
+      x_20 = x_28;
+      x_26_phi = x_28;
+      x_132_phi = true;
+      break;
+
+      continuing {
+        x_123_phi = false;
+        x_28_phi = 0;
+      }
+    }
+    x_26 = x_26_phi;
+    let x_132 : bool = x_132_phi;
+    x_27_phi = x_26;
+    if (x_132) {
+      break;
+    }
+    x_134 = 0;
+    x_116 = true;
+    x_20 = x_134;
+    x_27_phi = x_134;
+    break;
+
+    continuing {
+      x_118_phi = false;
+    }
+  }
+  let x_27 : i32 = x_27_phi;
+  return x_27;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/if-and-switch/0.spvasm b/test/vk-gl-cts/graphicsfuzz/if-and-switch/0.spvasm
new file mode 100644
index 0000000..28e20bd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/if-and-switch/0.spvasm
@@ -0,0 +1,74 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %data "data"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+%_ptr_Function__arr_float_uint_2 = OpTypePointer Function %_arr_float_uint_2
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_1 = OpConstant %int 1
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %26 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %bool = OpTypeBool
+         %28 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+         %29 = OpUndef %float
+       %main = OpFunction %void None %8
+         %30 = OpLabel
+       %data = OpVariable %_ptr_Function__arr_float_uint_2 Function
+         %31 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %32 = OpLoad %float %31
+         %33 = OpAccessChain %_ptr_Function_float %data %int_0
+               OpStore %33 %32
+         %34 = OpAccessChain %_ptr_Function_float %data %int_1
+               OpStore %34 %32
+               OpStore %_GLF_color %26
+         %35 = OpLoad %float %34
+         %36 = OpFOrdGreaterThan %bool %35 %float_1
+               OpSelectionMerge %37 None
+               OpBranchConditional %36 %38 %37
+         %38 = OpLabel
+         %39 = OpConvertFToS %int %32
+               OpSelectionMerge %40 None
+               OpSwitch %39 %40 0 %41 1 %42
+         %40 = OpLabel
+               OpBranch %37
+         %41 = OpLabel
+               OpBranch %42
+         %42 = OpLabel
+         %43 = OpPhi %float %29 %38 %float_1 %41
+         %44 = OpAccessChain %_ptr_Function_float %data %39
+               OpStore %44 %43
+               OpStore %_GLF_color %28
+               OpBranch %40
+         %37 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/if-and-switch/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/if-and-switch/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..583cd97
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/if-and-switch/0.spvasm.expected.hlsl
@@ -0,0 +1,48 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float data[2] = (float[2])0;
+  float x_32 = 0.0f;
+  x_32 = asfloat(x_6[0].x);
+  data[0] = x_32;
+  data[1] = x_32;
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  const float x_35 = data[1];
+  if ((x_35 > 1.0f)) {
+    float x_43_phi = 0.0f;
+    const int x_39 = int(x_32);
+    x_43_phi = 0.0f;
+    switch(x_39) {
+      case 0: {
+        x_43_phi = 1.0f;
+        /* fallthrough */
+      }
+      case 1: {
+        data[x_39] = x_43_phi;
+        x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/if-and-switch/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/if-and-switch/0.spvasm.expected.msl
new file mode 100644
index 0000000..b4c618f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/if-and-switch/0.spvasm.expected.msl
@@ -0,0 +1,55 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  float arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  tint_array_wrapper data = {};
+  float x_32 = 0.0f;
+  x_32 = x_6.injectionSwitch.x;
+  data.arr[0] = x_32;
+  data.arr[1] = x_32;
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  float const x_35 = data.arr[1];
+  if ((x_35 > 1.0f)) {
+    float x_43_phi = 0.0f;
+    int const x_39 = int(x_32);
+    x_43_phi = 0.0f;
+    switch(x_39) {
+      case 0: {
+        x_43_phi = 1.0f;
+        /* fallthrough */
+      }
+      case 1: {
+        float const x_43 = x_43_phi;
+        data.arr[x_39] = x_43;
+        *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/if-and-switch/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/if-and-switch/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..a5e407d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/if-and-switch/0.spvasm.expected.spvasm
@@ -0,0 +1,120 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 67
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %data "data"
+               OpName %x_32 "x_32"
+               OpName %x_43_phi "x_43_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+%_ptr_Function__arr_float_uint_2 = OpTypePointer Function %_arr_float_uint_2
+         %21 = OpConstantNull %_arr_float_uint_2
+%_ptr_Function_float = OpTypePointer Function %float
+         %24 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %38 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %bool = OpTypeBool
+         %54 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %55 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+       %data = OpVariable %_ptr_Function__arr_float_uint_2 Function %21
+       %x_32 = OpVariable %_ptr_Function_float Function %24
+   %x_43_phi = OpVariable %_ptr_Function_float Function %24
+         %27 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+         %28 = OpLoad %float %27
+               OpStore %x_32 %28
+         %31 = OpAccessChain %_ptr_Function_float %data %int_0
+         %32 = OpLoad %float %x_32
+               OpStore %31 %32
+         %34 = OpAccessChain %_ptr_Function_float %data %int_1
+         %35 = OpLoad %float %x_32
+               OpStore %34 %35
+               OpStore %x_GLF_color %38
+         %39 = OpAccessChain %_ptr_Function_float %data %int_1
+         %40 = OpLoad %float %39
+         %41 = OpFOrdGreaterThan %bool %40 %float_1
+               OpSelectionMerge %43 None
+               OpBranchConditional %41 %44 %43
+         %44 = OpLabel
+         %47 = OpLoad %float %x_32
+         %46 = OpConvertFToS %int %47
+               OpStore %x_43_phi %float_0
+               OpSelectionMerge %48 None
+               OpSwitch %46 %49 0 %50 1 %51
+         %50 = OpLabel
+               OpStore %x_43_phi %float_1
+               OpBranch %51
+         %51 = OpLabel
+         %52 = OpLoad %float %x_43_phi
+         %53 = OpAccessChain %_ptr_Function_float %data %46
+               OpStore %53 %52
+               OpStore %x_GLF_color %54
+               OpBranch %48
+         %49 = OpLabel
+               OpBranch %48
+         %48 = OpLabel
+               OpBranch %43
+         %43 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %55
+%tint_symbol = OpFunctionParameter %main_out
+         %59 = OpLabel
+         %60 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %60
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %62 = OpLabel
+         %63 = OpFunctionCall %void %main_1
+         %65 = OpLoad %v4float %x_GLF_color
+         %66 = OpCompositeConstruct %main_out %65
+         %64 = OpFunctionCall %void %tint_symbol_2 %66
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/if-and-switch/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/if-and-switch/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..71828f6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/if-and-switch/0.spvasm.expected.wgsl
@@ -0,0 +1,49 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var data : array<f32, 2>;
+  var x_32 : f32;
+  x_32 = x_6.injectionSwitch.x;
+  data[0] = x_32;
+  let x_34 : ptr<function, f32> = &(data[1]);
+  *(x_34) = x_32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  let x_35 : f32 = *(x_34);
+  if ((x_35 > 1.0)) {
+    var x_43_phi : f32;
+    let x_39 : i32 = i32(x_32);
+    x_43_phi = 0.0;
+    switch(x_39) {
+      case 0: {
+        x_43_phi = 1.0;
+        fallthrough;
+      }
+      case 1: {
+        let x_43 : f32 = x_43_phi;
+        data[x_39] = x_43;
+        x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+      }
+      default: {
+      }
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/if-and-switch/0.wgsl b/test/vk-gl-cts/graphicsfuzz/if-and-switch/0.wgsl
new file mode 100644
index 0000000..71828f6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/if-and-switch/0.wgsl
@@ -0,0 +1,49 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var data : array<f32, 2>;
+  var x_32 : f32;
+  x_32 = x_6.injectionSwitch.x;
+  data[0] = x_32;
+  let x_34 : ptr<function, f32> = &(data[1]);
+  *(x_34) = x_32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  let x_35 : f32 = *(x_34);
+  if ((x_35 > 1.0)) {
+    var x_43_phi : f32;
+    let x_39 : i32 = i32(x_32);
+    x_43_phi = 0.0;
+    switch(x_39) {
+      case 0: {
+        x_43_phi = 1.0;
+        fallthrough;
+      }
+      case 1: {
+        let x_43 : f32 = x_43_phi;
+        data[x_39] = x_43;
+        x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+      }
+      default: {
+      }
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/if-and-switch/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/if-and-switch/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..583cd97
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/if-and-switch/0.wgsl.expected.hlsl
@@ -0,0 +1,48 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float data[2] = (float[2])0;
+  float x_32 = 0.0f;
+  x_32 = asfloat(x_6[0].x);
+  data[0] = x_32;
+  data[1] = x_32;
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  const float x_35 = data[1];
+  if ((x_35 > 1.0f)) {
+    float x_43_phi = 0.0f;
+    const int x_39 = int(x_32);
+    x_43_phi = 0.0f;
+    switch(x_39) {
+      case 0: {
+        x_43_phi = 1.0f;
+        /* fallthrough */
+      }
+      case 1: {
+        data[x_39] = x_43_phi;
+        x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/if-and-switch/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/if-and-switch/0.wgsl.expected.msl
new file mode 100644
index 0000000..b4c618f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/if-and-switch/0.wgsl.expected.msl
@@ -0,0 +1,55 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  float arr[2];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  tint_array_wrapper data = {};
+  float x_32 = 0.0f;
+  x_32 = x_6.injectionSwitch.x;
+  data.arr[0] = x_32;
+  data.arr[1] = x_32;
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  float const x_35 = data.arr[1];
+  if ((x_35 > 1.0f)) {
+    float x_43_phi = 0.0f;
+    int const x_39 = int(x_32);
+    x_43_phi = 0.0f;
+    switch(x_39) {
+      case 0: {
+        x_43_phi = 1.0f;
+        /* fallthrough */
+      }
+      case 1: {
+        float const x_43 = x_43_phi;
+        data.arr[x_39] = x_43;
+        *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/if-and-switch/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/if-and-switch/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..a5e407d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/if-and-switch/0.wgsl.expected.spvasm
@@ -0,0 +1,120 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 67
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %data "data"
+               OpName %x_32 "x_32"
+               OpName %x_43_phi "x_43_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_float_uint_2 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_arr_float_uint_2 = OpTypeArray %float %uint_2
+%_ptr_Function__arr_float_uint_2 = OpTypePointer Function %_arr_float_uint_2
+         %21 = OpConstantNull %_arr_float_uint_2
+%_ptr_Function_float = OpTypePointer Function %float
+         %24 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %38 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %bool = OpTypeBool
+         %54 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+         %55 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+       %data = OpVariable %_ptr_Function__arr_float_uint_2 Function %21
+       %x_32 = OpVariable %_ptr_Function_float Function %24
+   %x_43_phi = OpVariable %_ptr_Function_float Function %24
+         %27 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+         %28 = OpLoad %float %27
+               OpStore %x_32 %28
+         %31 = OpAccessChain %_ptr_Function_float %data %int_0
+         %32 = OpLoad %float %x_32
+               OpStore %31 %32
+         %34 = OpAccessChain %_ptr_Function_float %data %int_1
+         %35 = OpLoad %float %x_32
+               OpStore %34 %35
+               OpStore %x_GLF_color %38
+         %39 = OpAccessChain %_ptr_Function_float %data %int_1
+         %40 = OpLoad %float %39
+         %41 = OpFOrdGreaterThan %bool %40 %float_1
+               OpSelectionMerge %43 None
+               OpBranchConditional %41 %44 %43
+         %44 = OpLabel
+         %47 = OpLoad %float %x_32
+         %46 = OpConvertFToS %int %47
+               OpStore %x_43_phi %float_0
+               OpSelectionMerge %48 None
+               OpSwitch %46 %49 0 %50 1 %51
+         %50 = OpLabel
+               OpStore %x_43_phi %float_1
+               OpBranch %51
+         %51 = OpLabel
+         %52 = OpLoad %float %x_43_phi
+         %53 = OpAccessChain %_ptr_Function_float %data %46
+               OpStore %53 %52
+               OpStore %x_GLF_color %54
+               OpBranch %48
+         %49 = OpLabel
+               OpBranch %48
+         %48 = OpLabel
+               OpBranch %43
+         %43 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %55
+%tint_symbol = OpFunctionParameter %main_out
+         %59 = OpLabel
+         %60 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %60
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %62 = OpLabel
+         %63 = OpFunctionCall %void %main_1
+         %65 = OpLoad %v4float %x_GLF_color
+         %66 = OpCompositeConstruct %main_out %65
+         %64 = OpFunctionCall %void %tint_symbol_2 %66
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/if-and-switch/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/if-and-switch/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..71828f6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/if-and-switch/0.wgsl.expected.wgsl
@@ -0,0 +1,49 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var data : array<f32, 2>;
+  var x_32 : f32;
+  x_32 = x_6.injectionSwitch.x;
+  data[0] = x_32;
+  let x_34 : ptr<function, f32> = &(data[1]);
+  *(x_34) = x_32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  let x_35 : f32 = *(x_34);
+  if ((x_35 > 1.0)) {
+    var x_43_phi : f32;
+    let x_39 : i32 = i32(x_32);
+    x_43_phi = 0.0;
+    switch(x_39) {
+      case 0: {
+        x_43_phi = 1.0;
+        fallthrough;
+      }
+      case 1: {
+        let x_43 : f32 = x_43_phi;
+        data[x_39] = x_43;
+        x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+      }
+      default: {
+      }
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/increment-value-in-nested-for-loop/0.spvasm b/test/vk-gl-cts/graphicsfuzz/increment-value-in-nested-for-loop/0.spvasm
new file mode 100644
index 0000000..e901276
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/increment-value-in-nested-for-loop/0.spvasm
@@ -0,0 +1,275 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+   %float_n1 = OpConstant %float -1
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_0 = OpConstant %float 0
+      %int_1 = OpConstant %int 1
+     %uint_1 = OpConstant %uint 1
+     %int_10 = OpConstant %int 10
+    %int_100 = OpConstant %int 100
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+      %int_4 = OpConstant %int 4
+         %32 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %33 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+      %false = OpConstantFalse %bool
+       %true = OpConstantTrue %bool
+         %36 = OpUndef %int
+       %main = OpFunction %void None %8
+         %37 = OpLabel
+               OpBranch %38
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %40 = OpLoad %float %39
+         %41 = OpFOrdLessThan %bool %40 %float_n1
+               OpLoopMerge %42 %43 None
+               OpBranch %44
+         %44 = OpLabel
+         %45 = OpPhi %bool %false %38 %46 %47
+         %48 = OpPhi %int %int_0 %38 %49 %47
+         %50 = OpPhi %int %36 %38 %51 %47
+         %52 = OpPhi %int %int_0 %38 %53 %47
+         %54 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %55 = OpLoad %float %54
+         %56 = OpFOrdGreaterThan %bool %55 %float_n1
+         %57 = OpSelect %int %56 %int_10 %int_100
+         %58 = OpSLessThan %bool %52 %57
+               OpLoopMerge %59 %47 None
+               OpBranchConditional %58 %60 %59
+         %60 = OpLabel
+               OpBranch %61
+         %61 = OpLabel
+         %62 = OpPhi %int %48 %60 %63 %64
+         %65 = OpPhi %int %50 %60 %66 %64
+         %67 = OpPhi %int %int_0 %60 %68 %64
+         %69 = OpSLessThan %bool %67 %int_2
+               OpLoopMerge %70 %64 None
+               OpBranchConditional %69 %71 %70
+         %71 = OpLabel
+               OpBranch %72
+         %72 = OpLabel
+               OpLoopMerge %73 %74 None
+               OpBranch %75
+         %75 = OpLabel
+         %76 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %77 = OpLoad %float %76
+         %78 = OpFOrdLessThan %bool %77 %float_n1
+         %79 = OpFOrdLessThan %bool %40 %float_0
+         %80 = OpLogicalNot %bool %79
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %81
+         %82 = OpLabel
+               OpSelectionMerge %83 None
+               OpBranchConditional %78 %84 %83
+         %84 = OpLabel
+               OpBranch %73
+         %83 = OpLabel
+               OpBranch %85
+         %85 = OpLabel
+         %86 = OpPhi %int %int_1 %83 %87 %88
+         %89 = OpSLessThan %bool %86 %int_3
+               OpLoopMerge %90 %88 None
+               OpBranchConditional %89 %91 %90
+         %91 = OpLabel
+               OpSelectionMerge %92 None
+               OpBranchConditional %78 %93 %92
+         %93 = OpLabel
+               OpBranch %88
+         %92 = OpLabel
+         %94 = OpSGreaterThan %bool %86 %int_0
+               OpSelectionMerge %95 None
+               OpBranchConditional %94 %96 %95
+         %96 = OpLabel
+               OpBranch %90
+         %95 = OpLabel
+               OpBranch %88
+         %88 = OpLabel
+         %87 = OpIAdd %int %86 %int_1
+               OpBranch %85
+         %90 = OpLabel
+         %97 = OpPhi %int %65 %85 %int_1 %96
+         %98 = OpPhi %bool %false %85 %true %96
+               OpSelectionMerge %99 None
+               OpBranchConditional %98 %73 %99
+         %99 = OpLabel
+               OpBranch %81
+         %81 = OpLabel
+               OpBranch %73
+         %74 = OpLabel
+               OpBranch %72
+         %73 = OpLabel
+         %66 = OpPhi %int %int_0 %84 %97 %90 %int_0 %81
+         %63 = OpIAdd %int %62 %66
+               OpSelectionMerge %100 None
+               OpBranchConditional %41 %101 %100
+        %101 = OpLabel
+               OpBranch %102
+        %102 = OpLabel
+               OpLoopMerge %103 %104 None
+               OpBranchConditional %41 %104 %103
+        %104 = OpLabel
+        %105 = OpConvertSToF %float %52
+        %106 = OpCompositeConstruct %v4float %105 %105 %105 %105
+               OpStore %_GLF_color %106
+               OpBranch %102
+        %103 = OpLabel
+               OpBranch %70
+        %100 = OpLabel
+               OpBranch %64
+         %64 = OpLabel
+         %68 = OpIAdd %int %67 %int_1
+               OpBranch %61
+         %70 = OpLabel
+         %51 = OpPhi %int %65 %61 %66 %103
+         %49 = OpPhi %int %62 %61 %63 %103
+         %46 = OpPhi %bool %45 %61 %true %103
+               OpSelectionMerge %107 None
+               OpBranchConditional %46 %59 %107
+        %107 = OpLabel
+        %108 = OpLogicalNot %bool %41
+               OpSelectionMerge %109 None
+               OpBranchConditional %108 %110 %109
+        %110 = OpLabel
+               OpBranch %59
+        %109 = OpLabel
+               OpBranch %47
+         %47 = OpLabel
+         %53 = OpIAdd %int %52 %int_1
+               OpBranch %44
+         %59 = OpLabel
+        %111 = OpPhi %int %48 %44 %49 %70 %49 %110
+        %112 = OpPhi %bool %45 %44 %46 %70 %46 %110
+               OpSelectionMerge %113 None
+               OpBranchConditional %112 %42 %113
+        %113 = OpLabel
+               OpBranch %114
+        %114 = OpLabel
+        %115 = OpPhi %int %111 %113 %116 %117
+        %118 = OpPhi %int %36 %113 %119 %117
+        %120 = OpPhi %int %int_0 %113 %121 %117
+        %122 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+        %123 = OpLoad %float %122
+        %124 = OpFAdd %float %123 %float_1
+        %125 = OpConvertFToS %int %124
+        %126 = OpSLessThan %bool %120 %125
+               OpLoopMerge %127 %117 None
+               OpBranchConditional %126 %128 %127
+        %128 = OpLabel
+               OpBranch %129
+        %129 = OpLabel
+               OpLoopMerge %130 %131 None
+               OpBranch %132
+        %132 = OpLabel
+        %133 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+        %134 = OpLoad %float %133
+        %135 = OpFOrdLessThan %bool %134 %float_n1
+        %136 = OpFOrdLessThan %bool %40 %float_0
+        %137 = OpLogicalNot %bool %136
+               OpSelectionMerge %138 None
+               OpBranchConditional %137 %139 %138
+        %139 = OpLabel
+               OpSelectionMerge %140 None
+               OpBranchConditional %135 %141 %140
+        %141 = OpLabel
+               OpBranch %130
+        %140 = OpLabel
+               OpBranch %142
+        %142 = OpLabel
+        %143 = OpPhi %int %int_1 %140 %144 %145
+        %146 = OpSLessThan %bool %143 %int_3
+               OpLoopMerge %147 %145 None
+               OpBranchConditional %146 %148 %147
+        %148 = OpLabel
+               OpSelectionMerge %149 None
+               OpBranchConditional %135 %150 %149
+        %150 = OpLabel
+               OpBranch %145
+        %149 = OpLabel
+        %151 = OpSGreaterThan %bool %143 %int_0
+               OpSelectionMerge %152 None
+               OpBranchConditional %151 %153 %152
+        %153 = OpLabel
+               OpBranch %147
+        %152 = OpLabel
+               OpBranch %145
+        %145 = OpLabel
+        %144 = OpIAdd %int %143 %int_1
+               OpBranch %142
+        %147 = OpLabel
+        %154 = OpPhi %int %118 %142 %int_1 %153
+        %155 = OpPhi %bool %false %142 %true %153
+               OpSelectionMerge %156 None
+               OpBranchConditional %155 %130 %156
+        %156 = OpLabel
+               OpBranch %138
+        %138 = OpLabel
+               OpBranch %130
+        %131 = OpLabel
+               OpBranch %129
+        %130 = OpLabel
+        %119 = OpPhi %int %int_0 %141 %154 %147 %int_0 %138
+        %116 = OpIAdd %int %115 %119
+        %157 = OpLogicalNot %bool %41
+        %158 = OpSelect %bool %157 %false %41
+               OpSelectionMerge %159 None
+               OpBranchConditional %158 %160 %159
+        %160 = OpLabel
+               OpBranch %127
+        %159 = OpLabel
+               OpBranch %117
+        %117 = OpLabel
+        %121 = OpIAdd %int %120 %int_1
+               OpBranch %114
+        %127 = OpLabel
+        %161 = OpPhi %int %115 %114 %116 %160
+        %162 = OpIEqual %bool %161 %int_4
+               OpSelectionMerge %163 None
+               OpBranchConditional %162 %164 %165
+        %165 = OpLabel
+               OpStore %_GLF_color %33
+               OpBranch %163
+        %164 = OpLabel
+               OpStore %_GLF_color %32
+               OpBranch %163
+        %163 = OpLabel
+               OpBranch %42
+         %43 = OpLabel
+               OpBranch %38
+         %42 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/increment-value-in-nested-for-loop/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/increment-value-in-nested-for-loop/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..f57ad42
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/increment-value-in-nested-for-loop/0.spvasm.expected.hlsl
@@ -0,0 +1,276 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  while (true) {
+    bool x_45 = false;
+    int x_48 = 0;
+    int x_49 = 0;
+    bool x_46 = false;
+    int x_115 = 0;
+    int x_116 = 0;
+    bool x_45_phi = false;
+    int x_48_phi = 0;
+    int x_50_phi = 0;
+    int x_52_phi = 0;
+    int x_111_phi = 0;
+    bool x_112_phi = false;
+    int x_115_phi = 0;
+    int x_118_phi = 0;
+    int x_120_phi = 0;
+    int x_161_phi = 0;
+    const float x_40 = asfloat(x_6[0].x);
+    const bool x_41 = (x_40 < -1.0f);
+    x_45_phi = false;
+    x_48_phi = 0;
+    x_50_phi = 0;
+    x_52_phi = 0;
+    while (true) {
+      int x_62 = 0;
+      int x_65 = 0;
+      int x_66 = 0;
+      int x_63 = 0;
+      int x_53 = 0;
+      int x_62_phi = 0;
+      int x_65_phi = 0;
+      int x_67_phi = 0;
+      int x_51_phi = 0;
+      int x_49_phi = 0;
+      bool x_46_phi = false;
+      x_45 = x_45_phi;
+      x_48 = x_48_phi;
+      const int x_50 = x_50_phi;
+      const int x_52 = x_52_phi;
+      const float x_55 = gl_FragCoord.y;
+      x_111_phi = x_48;
+      x_112_phi = x_45;
+      if ((x_52 < ((x_55 > -1.0f) ? 10 : 100))) {
+      } else {
+        break;
+      }
+      x_62_phi = x_48;
+      x_65_phi = x_50;
+      x_67_phi = 0;
+      while (true) {
+        int x_97 = 0;
+        int x_68 = 0;
+        int x_66_phi = 0;
+        x_62 = x_62_phi;
+        x_65 = x_65_phi;
+        const int x_67 = x_67_phi;
+        x_51_phi = x_65;
+        x_49_phi = x_62;
+        x_46_phi = x_45;
+        if ((x_67 < 2)) {
+        } else {
+          break;
+        }
+        while (true) {
+          bool x_78 = false;
+          int x_86_phi = 0;
+          int x_97_phi = 0;
+          bool x_98_phi = false;
+          const float x_77 = gl_FragCoord.x;
+          x_78 = (x_77 < -1.0f);
+          if (!((x_40 < 0.0f))) {
+            if (x_78) {
+              x_66_phi = 0;
+              break;
+            }
+            x_86_phi = 1;
+            while (true) {
+              int x_87 = 0;
+              const int x_86 = x_86_phi;
+              x_97_phi = x_65;
+              x_98_phi = false;
+              if ((x_86 < 3)) {
+              } else {
+                break;
+              }
+              if (x_78) {
+                {
+                  x_87 = (x_86 + 1);
+                  x_86_phi = x_87;
+                }
+                continue;
+              }
+              if ((x_86 > 0)) {
+                x_97_phi = 1;
+                x_98_phi = true;
+                break;
+              }
+              {
+                x_87 = (x_86 + 1);
+                x_86_phi = x_87;
+              }
+            }
+            x_97 = x_97_phi;
+            const bool x_98 = x_98_phi;
+            x_66_phi = x_97;
+            if (x_98) {
+              break;
+            }
+          }
+          x_66_phi = 0;
+          break;
+        }
+        x_66 = x_66_phi;
+        x_63 = asint((x_62 + x_66));
+        if (x_41) {
+          while (true) {
+            if (x_41) {
+            } else {
+              break;
+            }
+            {
+              const float x_105 = float(x_52);
+              x_GLF_color = float4(x_105, x_105, x_105, x_105);
+            }
+          }
+          x_51_phi = x_66;
+          x_49_phi = x_63;
+          x_46_phi = true;
+          break;
+        }
+        {
+          x_68 = (x_67 + 1);
+          x_62_phi = x_63;
+          x_65_phi = x_66;
+          x_67_phi = x_68;
+        }
+      }
+      const int x_51 = x_51_phi;
+      x_49 = x_49_phi;
+      x_46 = x_46_phi;
+      x_111_phi = x_49;
+      x_112_phi = x_46;
+      if (x_46) {
+        break;
+      }
+      if (!(x_41)) {
+        x_111_phi = x_49;
+        x_112_phi = x_46;
+        break;
+      }
+      {
+        x_53 = (x_52 + 1);
+        x_45_phi = x_46;
+        x_48_phi = x_49;
+        x_50_phi = x_51;
+        x_52_phi = x_53;
+      }
+    }
+    const int x_111 = x_111_phi;
+    if (x_112_phi) {
+      break;
+    }
+    x_115_phi = x_111;
+    x_118_phi = 0;
+    x_120_phi = 0;
+    while (true) {
+      int x_154 = 0;
+      int x_121 = 0;
+      int x_119_phi = 0;
+      x_115 = x_115_phi;
+      const int x_118 = x_118_phi;
+      const int x_120 = x_120_phi;
+      const float x_123 = asfloat(x_6[0].y);
+      x_161_phi = x_115;
+      if ((x_120 < int((x_123 + 1.0f)))) {
+      } else {
+        break;
+      }
+      while (true) {
+        bool x_135 = false;
+        int x_143_phi = 0;
+        int x_154_phi = 0;
+        bool x_155_phi = false;
+        const float x_134 = gl_FragCoord.x;
+        x_135 = (x_134 < -1.0f);
+        if (!((x_40 < 0.0f))) {
+          if (x_135) {
+            x_119_phi = 0;
+            break;
+          }
+          x_143_phi = 1;
+          while (true) {
+            int x_144 = 0;
+            const int x_143 = x_143_phi;
+            x_154_phi = x_118;
+            x_155_phi = false;
+            if ((x_143 < 3)) {
+            } else {
+              break;
+            }
+            if (x_135) {
+              {
+                x_144 = (x_143 + 1);
+                x_143_phi = x_144;
+              }
+              continue;
+            }
+            if ((x_143 > 0)) {
+              x_154_phi = 1;
+              x_155_phi = true;
+              break;
+            }
+            {
+              x_144 = (x_143 + 1);
+              x_143_phi = x_144;
+            }
+          }
+          x_154 = x_154_phi;
+          const bool x_155 = x_155_phi;
+          x_119_phi = x_154;
+          if (x_155) {
+            break;
+          }
+        }
+        x_119_phi = 0;
+        break;
+      }
+      int x_119 = 0;
+      x_119 = x_119_phi;
+      x_116 = asint((x_115 + x_119));
+      if ((!(x_41) ? false : x_41)) {
+        x_161_phi = x_116;
+        break;
+      }
+      {
+        x_121 = (x_120 + 1);
+        x_115_phi = x_116;
+        x_118_phi = x_119;
+        x_120_phi = x_121;
+      }
+    }
+    if ((x_161_phi == 4)) {
+      x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    } else {
+      x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    }
+    break;
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/increment-value-in-nested-for-loop/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/increment-value-in-nested-for-loop/0.spvasm.expected.msl
new file mode 100644
index 0000000..f21f0fa
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/increment-value-in-nested-for-loop/0.spvasm.expected.msl
@@ -0,0 +1,277 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  while (true) {
+    bool x_45 = false;
+    int x_48 = 0;
+    int x_49 = 0;
+    bool x_46 = false;
+    int x_115 = 0;
+    int x_116 = 0;
+    bool x_45_phi = false;
+    int x_48_phi = 0;
+    int x_50_phi = 0;
+    int x_52_phi = 0;
+    int x_111_phi = 0;
+    bool x_112_phi = false;
+    int x_115_phi = 0;
+    int x_118_phi = 0;
+    int x_120_phi = 0;
+    int x_161_phi = 0;
+    float const x_40 = x_6.injectionSwitch.x;
+    bool const x_41 = (x_40 < -1.0f);
+    x_45_phi = false;
+    x_48_phi = 0;
+    x_50_phi = 0;
+    x_52_phi = 0;
+    while (true) {
+      int x_62 = 0;
+      int x_65 = 0;
+      int x_66 = 0;
+      int x_63 = 0;
+      int x_53 = 0;
+      int x_62_phi = 0;
+      int x_65_phi = 0;
+      int x_67_phi = 0;
+      int x_51_phi = 0;
+      int x_49_phi = 0;
+      bool x_46_phi = false;
+      x_45 = x_45_phi;
+      x_48 = x_48_phi;
+      int const x_50 = x_50_phi;
+      int const x_52 = x_52_phi;
+      float const x_55 = (*(tint_symbol_5)).y;
+      x_111_phi = x_48;
+      x_112_phi = x_45;
+      if ((x_52 < select(100, 10, (x_55 > -1.0f)))) {
+      } else {
+        break;
+      }
+      x_62_phi = x_48;
+      x_65_phi = x_50;
+      x_67_phi = 0;
+      while (true) {
+        int x_97 = 0;
+        int x_68 = 0;
+        int x_66_phi = 0;
+        x_62 = x_62_phi;
+        x_65 = x_65_phi;
+        int const x_67 = x_67_phi;
+        x_51_phi = x_65;
+        x_49_phi = x_62;
+        x_46_phi = x_45;
+        if ((x_67 < 2)) {
+        } else {
+          break;
+        }
+        while (true) {
+          bool x_78 = false;
+          int x_86_phi = 0;
+          int x_97_phi = 0;
+          bool x_98_phi = false;
+          float const x_77 = (*(tint_symbol_5)).x;
+          x_78 = (x_77 < -1.0f);
+          if (!((x_40 < 0.0f))) {
+            if (x_78) {
+              x_66_phi = 0;
+              break;
+            }
+            x_86_phi = 1;
+            while (true) {
+              int x_87 = 0;
+              int const x_86 = x_86_phi;
+              x_97_phi = x_65;
+              x_98_phi = false;
+              if ((x_86 < 3)) {
+              } else {
+                break;
+              }
+              if (x_78) {
+                {
+                  x_87 = (x_86 + 1);
+                  x_86_phi = x_87;
+                }
+                continue;
+              }
+              if ((x_86 > 0)) {
+                x_97_phi = 1;
+                x_98_phi = true;
+                break;
+              }
+              {
+                x_87 = (x_86 + 1);
+                x_86_phi = x_87;
+              }
+            }
+            x_97 = x_97_phi;
+            bool const x_98 = x_98_phi;
+            x_66_phi = x_97;
+            if (x_98) {
+              break;
+            }
+          }
+          x_66_phi = 0;
+          break;
+        }
+        x_66 = x_66_phi;
+        x_63 = as_type<int>((x_62 + x_66));
+        if (x_41) {
+          while (true) {
+            if (x_41) {
+            } else {
+              break;
+            }
+            {
+              float const x_105 = float(x_52);
+              *(tint_symbol_6) = float4(x_105, x_105, x_105, x_105);
+            }
+          }
+          x_51_phi = x_66;
+          x_49_phi = x_63;
+          x_46_phi = true;
+          break;
+        }
+        {
+          x_68 = (x_67 + 1);
+          x_62_phi = x_63;
+          x_65_phi = x_66;
+          x_67_phi = x_68;
+        }
+      }
+      int const x_51 = x_51_phi;
+      x_49 = x_49_phi;
+      x_46 = x_46_phi;
+      x_111_phi = x_49;
+      x_112_phi = x_46;
+      if (x_46) {
+        break;
+      }
+      if (!(x_41)) {
+        x_111_phi = x_49;
+        x_112_phi = x_46;
+        break;
+      }
+      {
+        x_53 = (x_52 + 1);
+        x_45_phi = x_46;
+        x_48_phi = x_49;
+        x_50_phi = x_51;
+        x_52_phi = x_53;
+      }
+    }
+    int const x_111 = x_111_phi;
+    bool const x_112 = x_112_phi;
+    if (x_112) {
+      break;
+    }
+    x_115_phi = x_111;
+    x_118_phi = 0;
+    x_120_phi = 0;
+    while (true) {
+      int x_154 = 0;
+      int x_121 = 0;
+      int x_119_phi = 0;
+      x_115 = x_115_phi;
+      int const x_118 = x_118_phi;
+      int const x_120 = x_120_phi;
+      float const x_123 = x_6.injectionSwitch.y;
+      x_161_phi = x_115;
+      if ((x_120 < int((x_123 + 1.0f)))) {
+      } else {
+        break;
+      }
+      while (true) {
+        bool x_135 = false;
+        int x_143_phi = 0;
+        int x_154_phi = 0;
+        bool x_155_phi = false;
+        float const x_134 = (*(tint_symbol_5)).x;
+        x_135 = (x_134 < -1.0f);
+        if (!((x_40 < 0.0f))) {
+          if (x_135) {
+            x_119_phi = 0;
+            break;
+          }
+          x_143_phi = 1;
+          while (true) {
+            int x_144 = 0;
+            int const x_143 = x_143_phi;
+            x_154_phi = x_118;
+            x_155_phi = false;
+            if ((x_143 < 3)) {
+            } else {
+              break;
+            }
+            if (x_135) {
+              {
+                x_144 = (x_143 + 1);
+                x_143_phi = x_144;
+              }
+              continue;
+            }
+            if ((x_143 > 0)) {
+              x_154_phi = 1;
+              x_155_phi = true;
+              break;
+            }
+            {
+              x_144 = (x_143 + 1);
+              x_143_phi = x_144;
+            }
+          }
+          x_154 = x_154_phi;
+          bool const x_155 = x_155_phi;
+          x_119_phi = x_154;
+          if (x_155) {
+            break;
+          }
+        }
+        x_119_phi = 0;
+        break;
+      }
+      int x_119 = 0;
+      x_119 = x_119_phi;
+      x_116 = as_type<int>((x_115 + x_119));
+      if (select(x_41, false, !(x_41))) {
+        x_161_phi = x_116;
+        break;
+      }
+      {
+        x_121 = (x_120 + 1);
+        x_115_phi = x_116;
+        x_118_phi = x_119;
+        x_120_phi = x_121;
+      }
+    }
+    int const x_161 = x_161_phi;
+    if ((x_161 == 4)) {
+      *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    } else {
+      *(tint_symbol_6) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    }
+    break;
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/increment-value-in-nested-for-loop/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/increment-value-in-nested-for-loop/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..5bea6cc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/increment-value-in-nested-for-loop/0.spvasm.expected.spvasm
@@ -0,0 +1,566 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 292
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %x_45 "x_45"
+               OpName %x_48 "x_48"
+               OpName %x_49 "x_49"
+               OpName %x_46 "x_46"
+               OpName %x_115 "x_115"
+               OpName %x_116 "x_116"
+               OpName %x_45_phi "x_45_phi"
+               OpName %x_48_phi "x_48_phi"
+               OpName %x_50_phi "x_50_phi"
+               OpName %x_52_phi "x_52_phi"
+               OpName %x_111_phi "x_111_phi"
+               OpName %x_112_phi "x_112_phi"
+               OpName %x_115_phi "x_115_phi"
+               OpName %x_118_phi "x_118_phi"
+               OpName %x_120_phi "x_120_phi"
+               OpName %x_161_phi "x_161_phi"
+               OpName %x_62 "x_62"
+               OpName %x_65 "x_65"
+               OpName %x_66 "x_66"
+               OpName %x_63 "x_63"
+               OpName %x_53 "x_53"
+               OpName %x_62_phi "x_62_phi"
+               OpName %x_65_phi "x_65_phi"
+               OpName %x_67_phi "x_67_phi"
+               OpName %x_51_phi "x_51_phi"
+               OpName %x_49_phi "x_49_phi"
+               OpName %x_46_phi "x_46_phi"
+               OpName %x_97 "x_97"
+               OpName %x_68 "x_68"
+               OpName %x_66_phi "x_66_phi"
+               OpName %x_78 "x_78"
+               OpName %x_86_phi "x_86_phi"
+               OpName %x_97_phi "x_97_phi"
+               OpName %x_98_phi "x_98_phi"
+               OpName %x_87 "x_87"
+               OpName %x_154 "x_154"
+               OpName %x_121 "x_121"
+               OpName %x_119_phi "x_119_phi"
+               OpName %x_135 "x_135"
+               OpName %x_143_phi "x_143_phi"
+               OpName %x_154_phi "x_154_phi"
+               OpName %x_155_phi "x_155_phi"
+               OpName %x_144 "x_144"
+               OpName %x_119 "x_119"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %26 = OpConstantNull %bool
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %30 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+   %float_n1 = OpConstant %float -1
+      %false = OpConstantFalse %bool
+      %int_0 = OpConstant %int 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %int_10 = OpConstant %int 10
+    %int_100 = OpConstant %int 100
+      %int_2 = OpConstant %int 2
+    %float_0 = OpConstant %float 0
+      %int_1 = OpConstant %int 1
+      %int_3 = OpConstant %int 3
+       %true = OpConstantTrue %bool
+    %float_1 = OpConstant %float 1
+      %int_4 = OpConstant %int 4
+        %277 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %278 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+        %279 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+       %x_45 = OpVariable %_ptr_Function_bool Function %26
+       %x_48 = OpVariable %_ptr_Function_int Function %30
+       %x_49 = OpVariable %_ptr_Function_int Function %30
+       %x_46 = OpVariable %_ptr_Function_bool Function %26
+      %x_115 = OpVariable %_ptr_Function_int Function %30
+      %x_116 = OpVariable %_ptr_Function_int Function %30
+   %x_45_phi = OpVariable %_ptr_Function_bool Function %26
+   %x_48_phi = OpVariable %_ptr_Function_int Function %30
+   %x_50_phi = OpVariable %_ptr_Function_int Function %30
+   %x_52_phi = OpVariable %_ptr_Function_int Function %30
+  %x_111_phi = OpVariable %_ptr_Function_int Function %30
+  %x_112_phi = OpVariable %_ptr_Function_bool Function %26
+  %x_115_phi = OpVariable %_ptr_Function_int Function %30
+  %x_118_phi = OpVariable %_ptr_Function_int Function %30
+  %x_120_phi = OpVariable %_ptr_Function_int Function %30
+  %x_161_phi = OpVariable %_ptr_Function_int Function %30
+       %x_62 = OpVariable %_ptr_Function_int Function %30
+       %x_65 = OpVariable %_ptr_Function_int Function %30
+       %x_66 = OpVariable %_ptr_Function_int Function %30
+       %x_63 = OpVariable %_ptr_Function_int Function %30
+       %x_53 = OpVariable %_ptr_Function_int Function %30
+   %x_62_phi = OpVariable %_ptr_Function_int Function %30
+   %x_65_phi = OpVariable %_ptr_Function_int Function %30
+   %x_67_phi = OpVariable %_ptr_Function_int Function %30
+   %x_51_phi = OpVariable %_ptr_Function_int Function %30
+   %x_49_phi = OpVariable %_ptr_Function_int Function %30
+   %x_46_phi = OpVariable %_ptr_Function_bool Function %26
+       %x_97 = OpVariable %_ptr_Function_int Function %30
+       %x_68 = OpVariable %_ptr_Function_int Function %30
+   %x_66_phi = OpVariable %_ptr_Function_int Function %30
+       %x_78 = OpVariable %_ptr_Function_bool Function %26
+   %x_86_phi = OpVariable %_ptr_Function_int Function %30
+   %x_97_phi = OpVariable %_ptr_Function_int Function %30
+   %x_98_phi = OpVariable %_ptr_Function_bool Function %26
+       %x_87 = OpVariable %_ptr_Function_int Function %30
+      %x_154 = OpVariable %_ptr_Function_int Function %30
+      %x_121 = OpVariable %_ptr_Function_int Function %30
+  %x_119_phi = OpVariable %_ptr_Function_int Function %30
+      %x_135 = OpVariable %_ptr_Function_bool Function %26
+  %x_143_phi = OpVariable %_ptr_Function_int Function %30
+  %x_154_phi = OpVariable %_ptr_Function_int Function %30
+  %x_155_phi = OpVariable %_ptr_Function_bool Function %26
+      %x_144 = OpVariable %_ptr_Function_int Function %30
+      %x_119 = OpVariable %_ptr_Function_int Function %30
+               OpBranch %19
+         %19 = OpLabel
+               OpLoopMerge %20 %21 None
+               OpBranch %22
+         %22 = OpLabel
+         %48 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+         %49 = OpLoad %float %48
+         %51 = OpFOrdLessThan %bool %49 %float_n1
+               OpStore %x_45_phi %false
+               OpStore %x_48_phi %int_0
+               OpStore %x_50_phi %int_0
+               OpStore %x_52_phi %int_0
+               OpBranch %54
+         %54 = OpLabel
+               OpLoopMerge %55 %56 None
+               OpBranch %57
+         %57 = OpLabel
+         %69 = OpLoad %bool %x_45_phi
+               OpStore %x_45 %69
+         %70 = OpLoad %int %x_48_phi
+               OpStore %x_48 %70
+         %71 = OpLoad %int %x_50_phi
+         %72 = OpLoad %int %x_52_phi
+         %75 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %76 = OpLoad %float %75
+         %77 = OpLoad %int %x_48
+               OpStore %x_111_phi %77
+         %78 = OpLoad %bool %x_45
+               OpStore %x_112_phi %78
+         %80 = OpFOrdGreaterThan %bool %76 %float_n1
+         %79 = OpSelect %int %80 %int_10 %int_100
+         %83 = OpSLessThan %bool %72 %79
+               OpSelectionMerge %84 None
+               OpBranchConditional %83 %85 %86
+         %85 = OpLabel
+               OpBranch %84
+         %86 = OpLabel
+               OpBranch %55
+         %84 = OpLabel
+         %87 = OpLoad %int %x_48
+               OpStore %x_62_phi %87
+               OpStore %x_65_phi %71
+               OpStore %x_67_phi %int_0
+               OpBranch %88
+         %88 = OpLabel
+               OpLoopMerge %89 %90 None
+               OpBranch %91
+         %91 = OpLabel
+         %95 = OpLoad %int %x_62_phi
+               OpStore %x_62 %95
+         %96 = OpLoad %int %x_65_phi
+               OpStore %x_65 %96
+         %97 = OpLoad %int %x_67_phi
+         %98 = OpLoad %int %x_65
+               OpStore %x_51_phi %98
+         %99 = OpLoad %int %x_62
+               OpStore %x_49_phi %99
+        %100 = OpLoad %bool %x_45
+               OpStore %x_46_phi %100
+        %102 = OpSLessThan %bool %97 %int_2
+               OpSelectionMerge %103 None
+               OpBranchConditional %102 %104 %105
+        %104 = OpLabel
+               OpBranch %103
+        %105 = OpLabel
+               OpBranch %89
+        %103 = OpLabel
+               OpBranch %106
+        %106 = OpLabel
+               OpLoopMerge %107 %108 None
+               OpBranch %109
+        %109 = OpLabel
+        %114 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+        %115 = OpLoad %float %114
+        %116 = OpFOrdLessThan %bool %115 %float_n1
+               OpStore %x_78 %116
+        %119 = OpFOrdLessThan %bool %49 %float_0
+        %117 = OpLogicalNot %bool %119
+               OpSelectionMerge %120 None
+               OpBranchConditional %117 %121 %120
+        %121 = OpLabel
+        %122 = OpLoad %bool %x_78
+               OpSelectionMerge %123 None
+               OpBranchConditional %122 %124 %123
+        %124 = OpLabel
+               OpStore %x_66_phi %int_0
+               OpBranch %107
+        %123 = OpLabel
+               OpStore %x_86_phi %int_1
+               OpBranch %126
+        %126 = OpLabel
+               OpLoopMerge %127 %128 None
+               OpBranch %129
+        %129 = OpLabel
+        %131 = OpLoad %int %x_86_phi
+        %132 = OpLoad %int %x_65
+               OpStore %x_97_phi %132
+               OpStore %x_98_phi %false
+        %134 = OpSLessThan %bool %131 %int_3
+               OpSelectionMerge %135 None
+               OpBranchConditional %134 %136 %137
+        %136 = OpLabel
+               OpBranch %135
+        %137 = OpLabel
+               OpBranch %127
+        %135 = OpLabel
+        %138 = OpLoad %bool %x_78
+               OpSelectionMerge %139 None
+               OpBranchConditional %138 %140 %139
+        %140 = OpLabel
+               OpBranch %128
+        %139 = OpLabel
+        %141 = OpSGreaterThan %bool %131 %int_0
+               OpSelectionMerge %142 None
+               OpBranchConditional %141 %143 %142
+        %143 = OpLabel
+               OpStore %x_97_phi %int_1
+               OpStore %x_98_phi %true
+               OpBranch %127
+        %142 = OpLabel
+               OpBranch %128
+        %128 = OpLabel
+        %145 = OpIAdd %int %131 %int_1
+               OpStore %x_87 %145
+        %146 = OpLoad %int %x_87
+               OpStore %x_86_phi %146
+               OpBranch %126
+        %127 = OpLabel
+        %147 = OpLoad %int %x_97_phi
+               OpStore %x_97 %147
+        %148 = OpLoad %bool %x_98_phi
+        %149 = OpLoad %int %x_97
+               OpStore %x_66_phi %149
+               OpSelectionMerge %150 None
+               OpBranchConditional %148 %151 %150
+        %151 = OpLabel
+               OpBranch %107
+        %150 = OpLabel
+               OpBranch %120
+        %120 = OpLabel
+               OpStore %x_66_phi %int_0
+               OpBranch %107
+        %108 = OpLabel
+               OpBranch %106
+        %107 = OpLabel
+        %152 = OpLoad %int %x_66_phi
+               OpStore %x_66 %152
+        %154 = OpLoad %int %x_62
+        %155 = OpLoad %int %x_66
+        %156 = OpIAdd %int %154 %155
+        %153 = OpCopyObject %int %156
+               OpStore %x_63 %153
+               OpSelectionMerge %157 None
+               OpBranchConditional %51 %158 %157
+        %158 = OpLabel
+               OpBranch %159
+        %159 = OpLabel
+               OpLoopMerge %160 %161 None
+               OpBranch %162
+        %162 = OpLabel
+               OpSelectionMerge %163 None
+               OpBranchConditional %51 %164 %165
+        %164 = OpLabel
+               OpBranch %163
+        %165 = OpLabel
+               OpBranch %160
+        %163 = OpLabel
+               OpBranch %161
+        %161 = OpLabel
+        %166 = OpConvertSToF %float %72
+        %167 = OpCompositeConstruct %v4float %166 %166 %166 %166
+               OpStore %x_GLF_color %167
+               OpBranch %159
+        %160 = OpLabel
+        %168 = OpLoad %int %x_66
+               OpStore %x_51_phi %168
+        %169 = OpLoad %int %x_63
+               OpStore %x_49_phi %169
+               OpStore %x_46_phi %true
+               OpBranch %89
+        %157 = OpLabel
+               OpBranch %90
+         %90 = OpLabel
+        %170 = OpIAdd %int %97 %int_1
+               OpStore %x_68 %170
+        %171 = OpLoad %int %x_63
+               OpStore %x_62_phi %171
+        %172 = OpLoad %int %x_66
+               OpStore %x_65_phi %172
+        %173 = OpLoad %int %x_68
+               OpStore %x_67_phi %173
+               OpBranch %88
+         %89 = OpLabel
+        %174 = OpLoad %int %x_51_phi
+        %175 = OpLoad %int %x_49_phi
+               OpStore %x_49 %175
+        %176 = OpLoad %bool %x_46_phi
+               OpStore %x_46 %176
+        %177 = OpLoad %int %x_49
+               OpStore %x_111_phi %177
+        %178 = OpLoad %bool %x_46
+               OpStore %x_112_phi %178
+        %179 = OpLoad %bool %x_46
+               OpSelectionMerge %180 None
+               OpBranchConditional %179 %181 %180
+        %181 = OpLabel
+               OpBranch %55
+        %180 = OpLabel
+        %182 = OpLogicalNot %bool %51
+               OpSelectionMerge %183 None
+               OpBranchConditional %182 %184 %183
+        %184 = OpLabel
+        %185 = OpLoad %int %x_49
+               OpStore %x_111_phi %185
+        %186 = OpLoad %bool %x_46
+               OpStore %x_112_phi %186
+               OpBranch %55
+        %183 = OpLabel
+               OpBranch %56
+         %56 = OpLabel
+        %187 = OpIAdd %int %72 %int_1
+               OpStore %x_53 %187
+        %188 = OpLoad %bool %x_46
+               OpStore %x_45_phi %188
+        %189 = OpLoad %int %x_49
+               OpStore %x_48_phi %189
+               OpStore %x_50_phi %174
+        %190 = OpLoad %int %x_53
+               OpStore %x_52_phi %190
+               OpBranch %54
+         %55 = OpLabel
+        %191 = OpLoad %int %x_111_phi
+        %192 = OpLoad %bool %x_112_phi
+               OpSelectionMerge %193 None
+               OpBranchConditional %192 %194 %193
+        %194 = OpLabel
+               OpBranch %20
+        %193 = OpLabel
+               OpStore %x_115_phi %191
+               OpStore %x_118_phi %int_0
+               OpStore %x_120_phi %int_0
+               OpBranch %195
+        %195 = OpLabel
+               OpLoopMerge %196 %197 None
+               OpBranch %198
+        %198 = OpLabel
+        %202 = OpLoad %int %x_115_phi
+               OpStore %x_115 %202
+        %203 = OpLoad %int %x_118_phi
+        %204 = OpLoad %int %x_120_phi
+        %205 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+        %206 = OpLoad %float %205
+        %207 = OpLoad %int %x_115
+               OpStore %x_161_phi %207
+        %210 = OpFAdd %float %206 %float_1
+        %208 = OpConvertFToS %int %210
+        %211 = OpSLessThan %bool %204 %208
+               OpSelectionMerge %212 None
+               OpBranchConditional %211 %213 %214
+        %213 = OpLabel
+               OpBranch %212
+        %214 = OpLabel
+               OpBranch %196
+        %212 = OpLabel
+               OpBranch %215
+        %215 = OpLabel
+               OpLoopMerge %216 %217 None
+               OpBranch %218
+        %218 = OpLabel
+        %223 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+        %224 = OpLoad %float %223
+        %225 = OpFOrdLessThan %bool %224 %float_n1
+               OpStore %x_135 %225
+        %227 = OpFOrdLessThan %bool %49 %float_0
+        %226 = OpLogicalNot %bool %227
+               OpSelectionMerge %228 None
+               OpBranchConditional %226 %229 %228
+        %229 = OpLabel
+        %230 = OpLoad %bool %x_135
+               OpSelectionMerge %231 None
+               OpBranchConditional %230 %232 %231
+        %232 = OpLabel
+               OpStore %x_119_phi %int_0
+               OpBranch %216
+        %231 = OpLabel
+               OpStore %x_143_phi %int_1
+               OpBranch %233
+        %233 = OpLabel
+               OpLoopMerge %234 %235 None
+               OpBranch %236
+        %236 = OpLabel
+        %238 = OpLoad %int %x_143_phi
+               OpStore %x_154_phi %203
+               OpStore %x_155_phi %false
+        %239 = OpSLessThan %bool %238 %int_3
+               OpSelectionMerge %240 None
+               OpBranchConditional %239 %241 %242
+        %241 = OpLabel
+               OpBranch %240
+        %242 = OpLabel
+               OpBranch %234
+        %240 = OpLabel
+        %243 = OpLoad %bool %x_135
+               OpSelectionMerge %244 None
+               OpBranchConditional %243 %245 %244
+        %245 = OpLabel
+               OpBranch %235
+        %244 = OpLabel
+        %246 = OpSGreaterThan %bool %238 %int_0
+               OpSelectionMerge %247 None
+               OpBranchConditional %246 %248 %247
+        %248 = OpLabel
+               OpStore %x_154_phi %int_1
+               OpStore %x_155_phi %true
+               OpBranch %234
+        %247 = OpLabel
+               OpBranch %235
+        %235 = OpLabel
+        %249 = OpIAdd %int %238 %int_1
+               OpStore %x_144 %249
+        %250 = OpLoad %int %x_144
+               OpStore %x_143_phi %250
+               OpBranch %233
+        %234 = OpLabel
+        %251 = OpLoad %int %x_154_phi
+               OpStore %x_154 %251
+        %252 = OpLoad %bool %x_155_phi
+        %253 = OpLoad %int %x_154
+               OpStore %x_119_phi %253
+               OpSelectionMerge %254 None
+               OpBranchConditional %252 %255 %254
+        %255 = OpLabel
+               OpBranch %216
+        %254 = OpLabel
+               OpBranch %228
+        %228 = OpLabel
+               OpStore %x_119_phi %int_0
+               OpBranch %216
+        %217 = OpLabel
+               OpBranch %215
+        %216 = OpLabel
+        %257 = OpLoad %int %x_119_phi
+               OpStore %x_119 %257
+        %259 = OpLoad %int %x_115
+        %260 = OpLoad %int %x_119
+        %261 = OpIAdd %int %259 %260
+        %258 = OpCopyObject %int %261
+               OpStore %x_116 %258
+        %263 = OpLogicalNot %bool %51
+        %262 = OpSelect %bool %263 %false %51
+               OpSelectionMerge %264 None
+               OpBranchConditional %262 %265 %264
+        %265 = OpLabel
+        %266 = OpLoad %int %x_116
+               OpStore %x_161_phi %266
+               OpBranch %196
+        %264 = OpLabel
+               OpBranch %197
+        %197 = OpLabel
+        %267 = OpIAdd %int %204 %int_1
+               OpStore %x_121 %267
+        %268 = OpLoad %int %x_116
+               OpStore %x_115_phi %268
+        %269 = OpLoad %int %x_119
+               OpStore %x_118_phi %269
+        %270 = OpLoad %int %x_121
+               OpStore %x_120_phi %270
+               OpBranch %195
+        %196 = OpLabel
+        %271 = OpLoad %int %x_161_phi
+        %273 = OpIEqual %bool %271 %int_4
+               OpSelectionMerge %274 None
+               OpBranchConditional %273 %275 %276
+        %275 = OpLabel
+               OpStore %x_GLF_color %277
+               OpBranch %274
+        %276 = OpLabel
+               OpStore %x_GLF_color %278
+               OpBranch %274
+        %274 = OpLabel
+               OpBranch %20
+         %21 = OpLabel
+               OpBranch %19
+         %20 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %279
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %283 = OpLabel
+        %284 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %284
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %286 = OpLabel
+        %287 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %287
+        %288 = OpFunctionCall %void %main_1
+        %290 = OpLoad %v4float %x_GLF_color
+        %291 = OpCompositeConstruct %main_out %290
+        %289 = OpFunctionCall %void %tint_symbol_3 %291
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/increment-value-in-nested-for-loop/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/increment-value-in-nested-for-loop/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..7b1d980
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/increment-value-in-nested-for-loop/0.spvasm.expected.wgsl
@@ -0,0 +1,274 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  loop {
+    var x_45 : bool;
+    var x_48 : i32;
+    var x_49 : i32;
+    var x_46 : bool;
+    var x_115 : i32;
+    var x_116 : i32;
+    var x_45_phi : bool;
+    var x_48_phi : i32;
+    var x_50_phi : i32;
+    var x_52_phi : i32;
+    var x_111_phi : i32;
+    var x_112_phi : bool;
+    var x_115_phi : i32;
+    var x_118_phi : i32;
+    var x_120_phi : i32;
+    var x_161_phi : i32;
+    let x_40 : f32 = x_6.injectionSwitch.x;
+    let x_41 : bool = (x_40 < -1.0);
+    x_45_phi = false;
+    x_48_phi = 0;
+    x_50_phi = 0;
+    x_52_phi = 0;
+    loop {
+      var x_62 : i32;
+      var x_65 : i32;
+      var x_66 : i32;
+      var x_63 : i32;
+      var x_53 : i32;
+      var x_62_phi : i32;
+      var x_65_phi : i32;
+      var x_67_phi : i32;
+      var x_51_phi : i32;
+      var x_49_phi : i32;
+      var x_46_phi : bool;
+      x_45 = x_45_phi;
+      x_48 = x_48_phi;
+      let x_50 : i32 = x_50_phi;
+      let x_52 : i32 = x_52_phi;
+      let x_55 : f32 = gl_FragCoord.y;
+      x_111_phi = x_48;
+      x_112_phi = x_45;
+      if ((x_52 < select(100, 10, (x_55 > -1.0)))) {
+      } else {
+        break;
+      }
+      x_62_phi = x_48;
+      x_65_phi = x_50;
+      x_67_phi = 0;
+      loop {
+        var x_97 : i32;
+        var x_68 : i32;
+        var x_66_phi : i32;
+        x_62 = x_62_phi;
+        x_65 = x_65_phi;
+        let x_67 : i32 = x_67_phi;
+        x_51_phi = x_65;
+        x_49_phi = x_62;
+        x_46_phi = x_45;
+        if ((x_67 < 2)) {
+        } else {
+          break;
+        }
+        loop {
+          var x_78 : bool;
+          var x_86_phi : i32;
+          var x_97_phi : i32;
+          var x_98_phi : bool;
+          let x_77 : f32 = gl_FragCoord.x;
+          x_78 = (x_77 < -1.0);
+          if (!((x_40 < 0.0))) {
+            if (x_78) {
+              x_66_phi = 0;
+              break;
+            }
+            x_86_phi = 1;
+            loop {
+              var x_87 : i32;
+              let x_86 : i32 = x_86_phi;
+              x_97_phi = x_65;
+              x_98_phi = false;
+              if ((x_86 < 3)) {
+              } else {
+                break;
+              }
+              if (x_78) {
+                continue;
+              }
+              if ((x_86 > 0)) {
+                x_97_phi = 1;
+                x_98_phi = true;
+                break;
+              }
+
+              continuing {
+                x_87 = (x_86 + 1);
+                x_86_phi = x_87;
+              }
+            }
+            x_97 = x_97_phi;
+            let x_98 : bool = x_98_phi;
+            x_66_phi = x_97;
+            if (x_98) {
+              break;
+            }
+          }
+          x_66_phi = 0;
+          break;
+        }
+        x_66 = x_66_phi;
+        x_63 = bitcast<i32>((x_62 + x_66));
+        if (x_41) {
+          loop {
+            if (x_41) {
+            } else {
+              break;
+            }
+
+            continuing {
+              let x_105 : f32 = f32(x_52);
+              x_GLF_color = vec4<f32>(x_105, x_105, x_105, x_105);
+            }
+          }
+          x_51_phi = x_66;
+          x_49_phi = x_63;
+          x_46_phi = true;
+          break;
+        }
+
+        continuing {
+          x_68 = (x_67 + 1);
+          x_62_phi = x_63;
+          x_65_phi = x_66;
+          x_67_phi = x_68;
+        }
+      }
+      let x_51 : i32 = x_51_phi;
+      x_49 = x_49_phi;
+      x_46 = x_46_phi;
+      x_111_phi = x_49;
+      x_112_phi = x_46;
+      if (x_46) {
+        break;
+      }
+      if (!(x_41)) {
+        x_111_phi = x_49;
+        x_112_phi = x_46;
+        break;
+      }
+
+      continuing {
+        x_53 = (x_52 + 1);
+        x_45_phi = x_46;
+        x_48_phi = x_49;
+        x_50_phi = x_51;
+        x_52_phi = x_53;
+      }
+    }
+    let x_111 : i32 = x_111_phi;
+    let x_112 : bool = x_112_phi;
+    if (x_112) {
+      break;
+    }
+    x_115_phi = x_111;
+    x_118_phi = 0;
+    x_120_phi = 0;
+    loop {
+      var x_154 : i32;
+      var x_121 : i32;
+      var x_119_phi : i32;
+      x_115 = x_115_phi;
+      let x_118 : i32 = x_118_phi;
+      let x_120 : i32 = x_120_phi;
+      let x_123 : f32 = x_6.injectionSwitch.y;
+      x_161_phi = x_115;
+      if ((x_120 < i32((x_123 + 1.0)))) {
+      } else {
+        break;
+      }
+      loop {
+        var x_135 : bool;
+        var x_143_phi : i32;
+        var x_154_phi : i32;
+        var x_155_phi : bool;
+        let x_134 : f32 = gl_FragCoord.x;
+        x_135 = (x_134 < -1.0);
+        if (!((x_40 < 0.0))) {
+          if (x_135) {
+            x_119_phi = 0;
+            break;
+          }
+          x_143_phi = 1;
+          loop {
+            var x_144 : i32;
+            let x_143 : i32 = x_143_phi;
+            x_154_phi = x_118;
+            x_155_phi = false;
+            if ((x_143 < 3)) {
+            } else {
+              break;
+            }
+            if (x_135) {
+              continue;
+            }
+            if ((x_143 > 0)) {
+              x_154_phi = 1;
+              x_155_phi = true;
+              break;
+            }
+
+            continuing {
+              x_144 = (x_143 + 1);
+              x_143_phi = x_144;
+            }
+          }
+          x_154 = x_154_phi;
+          let x_155 : bool = x_155_phi;
+          x_119_phi = x_154;
+          if (x_155) {
+            break;
+          }
+        }
+        x_119_phi = 0;
+        break;
+      }
+      var x_119 : i32;
+      x_119 = x_119_phi;
+      x_116 = bitcast<i32>((x_115 + x_119));
+      if (select(x_41, false, !(x_41))) {
+        x_161_phi = x_116;
+        break;
+      }
+
+      continuing {
+        x_121 = (x_120 + 1);
+        x_115_phi = x_116;
+        x_118_phi = x_119;
+        x_120_phi = x_121;
+      }
+    }
+    let x_161 : i32 = x_161_phi;
+    if ((x_161 == 4)) {
+      x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    } else {
+      x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+    }
+    break;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/increment-value-in-nested-for-loop/0.wgsl b/test/vk-gl-cts/graphicsfuzz/increment-value-in-nested-for-loop/0.wgsl
new file mode 100644
index 0000000..7b1d980
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/increment-value-in-nested-for-loop/0.wgsl
@@ -0,0 +1,274 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  loop {
+    var x_45 : bool;
+    var x_48 : i32;
+    var x_49 : i32;
+    var x_46 : bool;
+    var x_115 : i32;
+    var x_116 : i32;
+    var x_45_phi : bool;
+    var x_48_phi : i32;
+    var x_50_phi : i32;
+    var x_52_phi : i32;
+    var x_111_phi : i32;
+    var x_112_phi : bool;
+    var x_115_phi : i32;
+    var x_118_phi : i32;
+    var x_120_phi : i32;
+    var x_161_phi : i32;
+    let x_40 : f32 = x_6.injectionSwitch.x;
+    let x_41 : bool = (x_40 < -1.0);
+    x_45_phi = false;
+    x_48_phi = 0;
+    x_50_phi = 0;
+    x_52_phi = 0;
+    loop {
+      var x_62 : i32;
+      var x_65 : i32;
+      var x_66 : i32;
+      var x_63 : i32;
+      var x_53 : i32;
+      var x_62_phi : i32;
+      var x_65_phi : i32;
+      var x_67_phi : i32;
+      var x_51_phi : i32;
+      var x_49_phi : i32;
+      var x_46_phi : bool;
+      x_45 = x_45_phi;
+      x_48 = x_48_phi;
+      let x_50 : i32 = x_50_phi;
+      let x_52 : i32 = x_52_phi;
+      let x_55 : f32 = gl_FragCoord.y;
+      x_111_phi = x_48;
+      x_112_phi = x_45;
+      if ((x_52 < select(100, 10, (x_55 > -1.0)))) {
+      } else {
+        break;
+      }
+      x_62_phi = x_48;
+      x_65_phi = x_50;
+      x_67_phi = 0;
+      loop {
+        var x_97 : i32;
+        var x_68 : i32;
+        var x_66_phi : i32;
+        x_62 = x_62_phi;
+        x_65 = x_65_phi;
+        let x_67 : i32 = x_67_phi;
+        x_51_phi = x_65;
+        x_49_phi = x_62;
+        x_46_phi = x_45;
+        if ((x_67 < 2)) {
+        } else {
+          break;
+        }
+        loop {
+          var x_78 : bool;
+          var x_86_phi : i32;
+          var x_97_phi : i32;
+          var x_98_phi : bool;
+          let x_77 : f32 = gl_FragCoord.x;
+          x_78 = (x_77 < -1.0);
+          if (!((x_40 < 0.0))) {
+            if (x_78) {
+              x_66_phi = 0;
+              break;
+            }
+            x_86_phi = 1;
+            loop {
+              var x_87 : i32;
+              let x_86 : i32 = x_86_phi;
+              x_97_phi = x_65;
+              x_98_phi = false;
+              if ((x_86 < 3)) {
+              } else {
+                break;
+              }
+              if (x_78) {
+                continue;
+              }
+              if ((x_86 > 0)) {
+                x_97_phi = 1;
+                x_98_phi = true;
+                break;
+              }
+
+              continuing {
+                x_87 = (x_86 + 1);
+                x_86_phi = x_87;
+              }
+            }
+            x_97 = x_97_phi;
+            let x_98 : bool = x_98_phi;
+            x_66_phi = x_97;
+            if (x_98) {
+              break;
+            }
+          }
+          x_66_phi = 0;
+          break;
+        }
+        x_66 = x_66_phi;
+        x_63 = bitcast<i32>((x_62 + x_66));
+        if (x_41) {
+          loop {
+            if (x_41) {
+            } else {
+              break;
+            }
+
+            continuing {
+              let x_105 : f32 = f32(x_52);
+              x_GLF_color = vec4<f32>(x_105, x_105, x_105, x_105);
+            }
+          }
+          x_51_phi = x_66;
+          x_49_phi = x_63;
+          x_46_phi = true;
+          break;
+        }
+
+        continuing {
+          x_68 = (x_67 + 1);
+          x_62_phi = x_63;
+          x_65_phi = x_66;
+          x_67_phi = x_68;
+        }
+      }
+      let x_51 : i32 = x_51_phi;
+      x_49 = x_49_phi;
+      x_46 = x_46_phi;
+      x_111_phi = x_49;
+      x_112_phi = x_46;
+      if (x_46) {
+        break;
+      }
+      if (!(x_41)) {
+        x_111_phi = x_49;
+        x_112_phi = x_46;
+        break;
+      }
+
+      continuing {
+        x_53 = (x_52 + 1);
+        x_45_phi = x_46;
+        x_48_phi = x_49;
+        x_50_phi = x_51;
+        x_52_phi = x_53;
+      }
+    }
+    let x_111 : i32 = x_111_phi;
+    let x_112 : bool = x_112_phi;
+    if (x_112) {
+      break;
+    }
+    x_115_phi = x_111;
+    x_118_phi = 0;
+    x_120_phi = 0;
+    loop {
+      var x_154 : i32;
+      var x_121 : i32;
+      var x_119_phi : i32;
+      x_115 = x_115_phi;
+      let x_118 : i32 = x_118_phi;
+      let x_120 : i32 = x_120_phi;
+      let x_123 : f32 = x_6.injectionSwitch.y;
+      x_161_phi = x_115;
+      if ((x_120 < i32((x_123 + 1.0)))) {
+      } else {
+        break;
+      }
+      loop {
+        var x_135 : bool;
+        var x_143_phi : i32;
+        var x_154_phi : i32;
+        var x_155_phi : bool;
+        let x_134 : f32 = gl_FragCoord.x;
+        x_135 = (x_134 < -1.0);
+        if (!((x_40 < 0.0))) {
+          if (x_135) {
+            x_119_phi = 0;
+            break;
+          }
+          x_143_phi = 1;
+          loop {
+            var x_144 : i32;
+            let x_143 : i32 = x_143_phi;
+            x_154_phi = x_118;
+            x_155_phi = false;
+            if ((x_143 < 3)) {
+            } else {
+              break;
+            }
+            if (x_135) {
+              continue;
+            }
+            if ((x_143 > 0)) {
+              x_154_phi = 1;
+              x_155_phi = true;
+              break;
+            }
+
+            continuing {
+              x_144 = (x_143 + 1);
+              x_143_phi = x_144;
+            }
+          }
+          x_154 = x_154_phi;
+          let x_155 : bool = x_155_phi;
+          x_119_phi = x_154;
+          if (x_155) {
+            break;
+          }
+        }
+        x_119_phi = 0;
+        break;
+      }
+      var x_119 : i32;
+      x_119 = x_119_phi;
+      x_116 = bitcast<i32>((x_115 + x_119));
+      if (select(x_41, false, !(x_41))) {
+        x_161_phi = x_116;
+        break;
+      }
+
+      continuing {
+        x_121 = (x_120 + 1);
+        x_115_phi = x_116;
+        x_118_phi = x_119;
+        x_120_phi = x_121;
+      }
+    }
+    let x_161 : i32 = x_161_phi;
+    if ((x_161 == 4)) {
+      x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    } else {
+      x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+    }
+    break;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/increment-value-in-nested-for-loop/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/increment-value-in-nested-for-loop/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..f57ad42
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/increment-value-in-nested-for-loop/0.wgsl.expected.hlsl
@@ -0,0 +1,276 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  while (true) {
+    bool x_45 = false;
+    int x_48 = 0;
+    int x_49 = 0;
+    bool x_46 = false;
+    int x_115 = 0;
+    int x_116 = 0;
+    bool x_45_phi = false;
+    int x_48_phi = 0;
+    int x_50_phi = 0;
+    int x_52_phi = 0;
+    int x_111_phi = 0;
+    bool x_112_phi = false;
+    int x_115_phi = 0;
+    int x_118_phi = 0;
+    int x_120_phi = 0;
+    int x_161_phi = 0;
+    const float x_40 = asfloat(x_6[0].x);
+    const bool x_41 = (x_40 < -1.0f);
+    x_45_phi = false;
+    x_48_phi = 0;
+    x_50_phi = 0;
+    x_52_phi = 0;
+    while (true) {
+      int x_62 = 0;
+      int x_65 = 0;
+      int x_66 = 0;
+      int x_63 = 0;
+      int x_53 = 0;
+      int x_62_phi = 0;
+      int x_65_phi = 0;
+      int x_67_phi = 0;
+      int x_51_phi = 0;
+      int x_49_phi = 0;
+      bool x_46_phi = false;
+      x_45 = x_45_phi;
+      x_48 = x_48_phi;
+      const int x_50 = x_50_phi;
+      const int x_52 = x_52_phi;
+      const float x_55 = gl_FragCoord.y;
+      x_111_phi = x_48;
+      x_112_phi = x_45;
+      if ((x_52 < ((x_55 > -1.0f) ? 10 : 100))) {
+      } else {
+        break;
+      }
+      x_62_phi = x_48;
+      x_65_phi = x_50;
+      x_67_phi = 0;
+      while (true) {
+        int x_97 = 0;
+        int x_68 = 0;
+        int x_66_phi = 0;
+        x_62 = x_62_phi;
+        x_65 = x_65_phi;
+        const int x_67 = x_67_phi;
+        x_51_phi = x_65;
+        x_49_phi = x_62;
+        x_46_phi = x_45;
+        if ((x_67 < 2)) {
+        } else {
+          break;
+        }
+        while (true) {
+          bool x_78 = false;
+          int x_86_phi = 0;
+          int x_97_phi = 0;
+          bool x_98_phi = false;
+          const float x_77 = gl_FragCoord.x;
+          x_78 = (x_77 < -1.0f);
+          if (!((x_40 < 0.0f))) {
+            if (x_78) {
+              x_66_phi = 0;
+              break;
+            }
+            x_86_phi = 1;
+            while (true) {
+              int x_87 = 0;
+              const int x_86 = x_86_phi;
+              x_97_phi = x_65;
+              x_98_phi = false;
+              if ((x_86 < 3)) {
+              } else {
+                break;
+              }
+              if (x_78) {
+                {
+                  x_87 = (x_86 + 1);
+                  x_86_phi = x_87;
+                }
+                continue;
+              }
+              if ((x_86 > 0)) {
+                x_97_phi = 1;
+                x_98_phi = true;
+                break;
+              }
+              {
+                x_87 = (x_86 + 1);
+                x_86_phi = x_87;
+              }
+            }
+            x_97 = x_97_phi;
+            const bool x_98 = x_98_phi;
+            x_66_phi = x_97;
+            if (x_98) {
+              break;
+            }
+          }
+          x_66_phi = 0;
+          break;
+        }
+        x_66 = x_66_phi;
+        x_63 = asint((x_62 + x_66));
+        if (x_41) {
+          while (true) {
+            if (x_41) {
+            } else {
+              break;
+            }
+            {
+              const float x_105 = float(x_52);
+              x_GLF_color = float4(x_105, x_105, x_105, x_105);
+            }
+          }
+          x_51_phi = x_66;
+          x_49_phi = x_63;
+          x_46_phi = true;
+          break;
+        }
+        {
+          x_68 = (x_67 + 1);
+          x_62_phi = x_63;
+          x_65_phi = x_66;
+          x_67_phi = x_68;
+        }
+      }
+      const int x_51 = x_51_phi;
+      x_49 = x_49_phi;
+      x_46 = x_46_phi;
+      x_111_phi = x_49;
+      x_112_phi = x_46;
+      if (x_46) {
+        break;
+      }
+      if (!(x_41)) {
+        x_111_phi = x_49;
+        x_112_phi = x_46;
+        break;
+      }
+      {
+        x_53 = (x_52 + 1);
+        x_45_phi = x_46;
+        x_48_phi = x_49;
+        x_50_phi = x_51;
+        x_52_phi = x_53;
+      }
+    }
+    const int x_111 = x_111_phi;
+    if (x_112_phi) {
+      break;
+    }
+    x_115_phi = x_111;
+    x_118_phi = 0;
+    x_120_phi = 0;
+    while (true) {
+      int x_154 = 0;
+      int x_121 = 0;
+      int x_119_phi = 0;
+      x_115 = x_115_phi;
+      const int x_118 = x_118_phi;
+      const int x_120 = x_120_phi;
+      const float x_123 = asfloat(x_6[0].y);
+      x_161_phi = x_115;
+      if ((x_120 < int((x_123 + 1.0f)))) {
+      } else {
+        break;
+      }
+      while (true) {
+        bool x_135 = false;
+        int x_143_phi = 0;
+        int x_154_phi = 0;
+        bool x_155_phi = false;
+        const float x_134 = gl_FragCoord.x;
+        x_135 = (x_134 < -1.0f);
+        if (!((x_40 < 0.0f))) {
+          if (x_135) {
+            x_119_phi = 0;
+            break;
+          }
+          x_143_phi = 1;
+          while (true) {
+            int x_144 = 0;
+            const int x_143 = x_143_phi;
+            x_154_phi = x_118;
+            x_155_phi = false;
+            if ((x_143 < 3)) {
+            } else {
+              break;
+            }
+            if (x_135) {
+              {
+                x_144 = (x_143 + 1);
+                x_143_phi = x_144;
+              }
+              continue;
+            }
+            if ((x_143 > 0)) {
+              x_154_phi = 1;
+              x_155_phi = true;
+              break;
+            }
+            {
+              x_144 = (x_143 + 1);
+              x_143_phi = x_144;
+            }
+          }
+          x_154 = x_154_phi;
+          const bool x_155 = x_155_phi;
+          x_119_phi = x_154;
+          if (x_155) {
+            break;
+          }
+        }
+        x_119_phi = 0;
+        break;
+      }
+      int x_119 = 0;
+      x_119 = x_119_phi;
+      x_116 = asint((x_115 + x_119));
+      if ((!(x_41) ? false : x_41)) {
+        x_161_phi = x_116;
+        break;
+      }
+      {
+        x_121 = (x_120 + 1);
+        x_115_phi = x_116;
+        x_118_phi = x_119;
+        x_120_phi = x_121;
+      }
+    }
+    if ((x_161_phi == 4)) {
+      x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    } else {
+      x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    }
+    break;
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/increment-value-in-nested-for-loop/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/increment-value-in-nested-for-loop/0.wgsl.expected.msl
new file mode 100644
index 0000000..f21f0fa
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/increment-value-in-nested-for-loop/0.wgsl.expected.msl
@@ -0,0 +1,277 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  while (true) {
+    bool x_45 = false;
+    int x_48 = 0;
+    int x_49 = 0;
+    bool x_46 = false;
+    int x_115 = 0;
+    int x_116 = 0;
+    bool x_45_phi = false;
+    int x_48_phi = 0;
+    int x_50_phi = 0;
+    int x_52_phi = 0;
+    int x_111_phi = 0;
+    bool x_112_phi = false;
+    int x_115_phi = 0;
+    int x_118_phi = 0;
+    int x_120_phi = 0;
+    int x_161_phi = 0;
+    float const x_40 = x_6.injectionSwitch.x;
+    bool const x_41 = (x_40 < -1.0f);
+    x_45_phi = false;
+    x_48_phi = 0;
+    x_50_phi = 0;
+    x_52_phi = 0;
+    while (true) {
+      int x_62 = 0;
+      int x_65 = 0;
+      int x_66 = 0;
+      int x_63 = 0;
+      int x_53 = 0;
+      int x_62_phi = 0;
+      int x_65_phi = 0;
+      int x_67_phi = 0;
+      int x_51_phi = 0;
+      int x_49_phi = 0;
+      bool x_46_phi = false;
+      x_45 = x_45_phi;
+      x_48 = x_48_phi;
+      int const x_50 = x_50_phi;
+      int const x_52 = x_52_phi;
+      float const x_55 = (*(tint_symbol_5)).y;
+      x_111_phi = x_48;
+      x_112_phi = x_45;
+      if ((x_52 < select(100, 10, (x_55 > -1.0f)))) {
+      } else {
+        break;
+      }
+      x_62_phi = x_48;
+      x_65_phi = x_50;
+      x_67_phi = 0;
+      while (true) {
+        int x_97 = 0;
+        int x_68 = 0;
+        int x_66_phi = 0;
+        x_62 = x_62_phi;
+        x_65 = x_65_phi;
+        int const x_67 = x_67_phi;
+        x_51_phi = x_65;
+        x_49_phi = x_62;
+        x_46_phi = x_45;
+        if ((x_67 < 2)) {
+        } else {
+          break;
+        }
+        while (true) {
+          bool x_78 = false;
+          int x_86_phi = 0;
+          int x_97_phi = 0;
+          bool x_98_phi = false;
+          float const x_77 = (*(tint_symbol_5)).x;
+          x_78 = (x_77 < -1.0f);
+          if (!((x_40 < 0.0f))) {
+            if (x_78) {
+              x_66_phi = 0;
+              break;
+            }
+            x_86_phi = 1;
+            while (true) {
+              int x_87 = 0;
+              int const x_86 = x_86_phi;
+              x_97_phi = x_65;
+              x_98_phi = false;
+              if ((x_86 < 3)) {
+              } else {
+                break;
+              }
+              if (x_78) {
+                {
+                  x_87 = (x_86 + 1);
+                  x_86_phi = x_87;
+                }
+                continue;
+              }
+              if ((x_86 > 0)) {
+                x_97_phi = 1;
+                x_98_phi = true;
+                break;
+              }
+              {
+                x_87 = (x_86 + 1);
+                x_86_phi = x_87;
+              }
+            }
+            x_97 = x_97_phi;
+            bool const x_98 = x_98_phi;
+            x_66_phi = x_97;
+            if (x_98) {
+              break;
+            }
+          }
+          x_66_phi = 0;
+          break;
+        }
+        x_66 = x_66_phi;
+        x_63 = as_type<int>((x_62 + x_66));
+        if (x_41) {
+          while (true) {
+            if (x_41) {
+            } else {
+              break;
+            }
+            {
+              float const x_105 = float(x_52);
+              *(tint_symbol_6) = float4(x_105, x_105, x_105, x_105);
+            }
+          }
+          x_51_phi = x_66;
+          x_49_phi = x_63;
+          x_46_phi = true;
+          break;
+        }
+        {
+          x_68 = (x_67 + 1);
+          x_62_phi = x_63;
+          x_65_phi = x_66;
+          x_67_phi = x_68;
+        }
+      }
+      int const x_51 = x_51_phi;
+      x_49 = x_49_phi;
+      x_46 = x_46_phi;
+      x_111_phi = x_49;
+      x_112_phi = x_46;
+      if (x_46) {
+        break;
+      }
+      if (!(x_41)) {
+        x_111_phi = x_49;
+        x_112_phi = x_46;
+        break;
+      }
+      {
+        x_53 = (x_52 + 1);
+        x_45_phi = x_46;
+        x_48_phi = x_49;
+        x_50_phi = x_51;
+        x_52_phi = x_53;
+      }
+    }
+    int const x_111 = x_111_phi;
+    bool const x_112 = x_112_phi;
+    if (x_112) {
+      break;
+    }
+    x_115_phi = x_111;
+    x_118_phi = 0;
+    x_120_phi = 0;
+    while (true) {
+      int x_154 = 0;
+      int x_121 = 0;
+      int x_119_phi = 0;
+      x_115 = x_115_phi;
+      int const x_118 = x_118_phi;
+      int const x_120 = x_120_phi;
+      float const x_123 = x_6.injectionSwitch.y;
+      x_161_phi = x_115;
+      if ((x_120 < int((x_123 + 1.0f)))) {
+      } else {
+        break;
+      }
+      while (true) {
+        bool x_135 = false;
+        int x_143_phi = 0;
+        int x_154_phi = 0;
+        bool x_155_phi = false;
+        float const x_134 = (*(tint_symbol_5)).x;
+        x_135 = (x_134 < -1.0f);
+        if (!((x_40 < 0.0f))) {
+          if (x_135) {
+            x_119_phi = 0;
+            break;
+          }
+          x_143_phi = 1;
+          while (true) {
+            int x_144 = 0;
+            int const x_143 = x_143_phi;
+            x_154_phi = x_118;
+            x_155_phi = false;
+            if ((x_143 < 3)) {
+            } else {
+              break;
+            }
+            if (x_135) {
+              {
+                x_144 = (x_143 + 1);
+                x_143_phi = x_144;
+              }
+              continue;
+            }
+            if ((x_143 > 0)) {
+              x_154_phi = 1;
+              x_155_phi = true;
+              break;
+            }
+            {
+              x_144 = (x_143 + 1);
+              x_143_phi = x_144;
+            }
+          }
+          x_154 = x_154_phi;
+          bool const x_155 = x_155_phi;
+          x_119_phi = x_154;
+          if (x_155) {
+            break;
+          }
+        }
+        x_119_phi = 0;
+        break;
+      }
+      int x_119 = 0;
+      x_119 = x_119_phi;
+      x_116 = as_type<int>((x_115 + x_119));
+      if (select(x_41, false, !(x_41))) {
+        x_161_phi = x_116;
+        break;
+      }
+      {
+        x_121 = (x_120 + 1);
+        x_115_phi = x_116;
+        x_118_phi = x_119;
+        x_120_phi = x_121;
+      }
+    }
+    int const x_161 = x_161_phi;
+    if ((x_161 == 4)) {
+      *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    } else {
+      *(tint_symbol_6) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    }
+    break;
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/increment-value-in-nested-for-loop/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/increment-value-in-nested-for-loop/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..5bea6cc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/increment-value-in-nested-for-loop/0.wgsl.expected.spvasm
@@ -0,0 +1,566 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 292
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %x_45 "x_45"
+               OpName %x_48 "x_48"
+               OpName %x_49 "x_49"
+               OpName %x_46 "x_46"
+               OpName %x_115 "x_115"
+               OpName %x_116 "x_116"
+               OpName %x_45_phi "x_45_phi"
+               OpName %x_48_phi "x_48_phi"
+               OpName %x_50_phi "x_50_phi"
+               OpName %x_52_phi "x_52_phi"
+               OpName %x_111_phi "x_111_phi"
+               OpName %x_112_phi "x_112_phi"
+               OpName %x_115_phi "x_115_phi"
+               OpName %x_118_phi "x_118_phi"
+               OpName %x_120_phi "x_120_phi"
+               OpName %x_161_phi "x_161_phi"
+               OpName %x_62 "x_62"
+               OpName %x_65 "x_65"
+               OpName %x_66 "x_66"
+               OpName %x_63 "x_63"
+               OpName %x_53 "x_53"
+               OpName %x_62_phi "x_62_phi"
+               OpName %x_65_phi "x_65_phi"
+               OpName %x_67_phi "x_67_phi"
+               OpName %x_51_phi "x_51_phi"
+               OpName %x_49_phi "x_49_phi"
+               OpName %x_46_phi "x_46_phi"
+               OpName %x_97 "x_97"
+               OpName %x_68 "x_68"
+               OpName %x_66_phi "x_66_phi"
+               OpName %x_78 "x_78"
+               OpName %x_86_phi "x_86_phi"
+               OpName %x_97_phi "x_97_phi"
+               OpName %x_98_phi "x_98_phi"
+               OpName %x_87 "x_87"
+               OpName %x_154 "x_154"
+               OpName %x_121 "x_121"
+               OpName %x_119_phi "x_119_phi"
+               OpName %x_135 "x_135"
+               OpName %x_143_phi "x_143_phi"
+               OpName %x_154_phi "x_154_phi"
+               OpName %x_155_phi "x_155_phi"
+               OpName %x_144 "x_144"
+               OpName %x_119 "x_119"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %26 = OpConstantNull %bool
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %30 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+   %float_n1 = OpConstant %float -1
+      %false = OpConstantFalse %bool
+      %int_0 = OpConstant %int 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %int_10 = OpConstant %int 10
+    %int_100 = OpConstant %int 100
+      %int_2 = OpConstant %int 2
+    %float_0 = OpConstant %float 0
+      %int_1 = OpConstant %int 1
+      %int_3 = OpConstant %int 3
+       %true = OpConstantTrue %bool
+    %float_1 = OpConstant %float 1
+      %int_4 = OpConstant %int 4
+        %277 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %278 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+        %279 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+       %x_45 = OpVariable %_ptr_Function_bool Function %26
+       %x_48 = OpVariable %_ptr_Function_int Function %30
+       %x_49 = OpVariable %_ptr_Function_int Function %30
+       %x_46 = OpVariable %_ptr_Function_bool Function %26
+      %x_115 = OpVariable %_ptr_Function_int Function %30
+      %x_116 = OpVariable %_ptr_Function_int Function %30
+   %x_45_phi = OpVariable %_ptr_Function_bool Function %26
+   %x_48_phi = OpVariable %_ptr_Function_int Function %30
+   %x_50_phi = OpVariable %_ptr_Function_int Function %30
+   %x_52_phi = OpVariable %_ptr_Function_int Function %30
+  %x_111_phi = OpVariable %_ptr_Function_int Function %30
+  %x_112_phi = OpVariable %_ptr_Function_bool Function %26
+  %x_115_phi = OpVariable %_ptr_Function_int Function %30
+  %x_118_phi = OpVariable %_ptr_Function_int Function %30
+  %x_120_phi = OpVariable %_ptr_Function_int Function %30
+  %x_161_phi = OpVariable %_ptr_Function_int Function %30
+       %x_62 = OpVariable %_ptr_Function_int Function %30
+       %x_65 = OpVariable %_ptr_Function_int Function %30
+       %x_66 = OpVariable %_ptr_Function_int Function %30
+       %x_63 = OpVariable %_ptr_Function_int Function %30
+       %x_53 = OpVariable %_ptr_Function_int Function %30
+   %x_62_phi = OpVariable %_ptr_Function_int Function %30
+   %x_65_phi = OpVariable %_ptr_Function_int Function %30
+   %x_67_phi = OpVariable %_ptr_Function_int Function %30
+   %x_51_phi = OpVariable %_ptr_Function_int Function %30
+   %x_49_phi = OpVariable %_ptr_Function_int Function %30
+   %x_46_phi = OpVariable %_ptr_Function_bool Function %26
+       %x_97 = OpVariable %_ptr_Function_int Function %30
+       %x_68 = OpVariable %_ptr_Function_int Function %30
+   %x_66_phi = OpVariable %_ptr_Function_int Function %30
+       %x_78 = OpVariable %_ptr_Function_bool Function %26
+   %x_86_phi = OpVariable %_ptr_Function_int Function %30
+   %x_97_phi = OpVariable %_ptr_Function_int Function %30
+   %x_98_phi = OpVariable %_ptr_Function_bool Function %26
+       %x_87 = OpVariable %_ptr_Function_int Function %30
+      %x_154 = OpVariable %_ptr_Function_int Function %30
+      %x_121 = OpVariable %_ptr_Function_int Function %30
+  %x_119_phi = OpVariable %_ptr_Function_int Function %30
+      %x_135 = OpVariable %_ptr_Function_bool Function %26
+  %x_143_phi = OpVariable %_ptr_Function_int Function %30
+  %x_154_phi = OpVariable %_ptr_Function_int Function %30
+  %x_155_phi = OpVariable %_ptr_Function_bool Function %26
+      %x_144 = OpVariable %_ptr_Function_int Function %30
+      %x_119 = OpVariable %_ptr_Function_int Function %30
+               OpBranch %19
+         %19 = OpLabel
+               OpLoopMerge %20 %21 None
+               OpBranch %22
+         %22 = OpLabel
+         %48 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+         %49 = OpLoad %float %48
+         %51 = OpFOrdLessThan %bool %49 %float_n1
+               OpStore %x_45_phi %false
+               OpStore %x_48_phi %int_0
+               OpStore %x_50_phi %int_0
+               OpStore %x_52_phi %int_0
+               OpBranch %54
+         %54 = OpLabel
+               OpLoopMerge %55 %56 None
+               OpBranch %57
+         %57 = OpLabel
+         %69 = OpLoad %bool %x_45_phi
+               OpStore %x_45 %69
+         %70 = OpLoad %int %x_48_phi
+               OpStore %x_48 %70
+         %71 = OpLoad %int %x_50_phi
+         %72 = OpLoad %int %x_52_phi
+         %75 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %76 = OpLoad %float %75
+         %77 = OpLoad %int %x_48
+               OpStore %x_111_phi %77
+         %78 = OpLoad %bool %x_45
+               OpStore %x_112_phi %78
+         %80 = OpFOrdGreaterThan %bool %76 %float_n1
+         %79 = OpSelect %int %80 %int_10 %int_100
+         %83 = OpSLessThan %bool %72 %79
+               OpSelectionMerge %84 None
+               OpBranchConditional %83 %85 %86
+         %85 = OpLabel
+               OpBranch %84
+         %86 = OpLabel
+               OpBranch %55
+         %84 = OpLabel
+         %87 = OpLoad %int %x_48
+               OpStore %x_62_phi %87
+               OpStore %x_65_phi %71
+               OpStore %x_67_phi %int_0
+               OpBranch %88
+         %88 = OpLabel
+               OpLoopMerge %89 %90 None
+               OpBranch %91
+         %91 = OpLabel
+         %95 = OpLoad %int %x_62_phi
+               OpStore %x_62 %95
+         %96 = OpLoad %int %x_65_phi
+               OpStore %x_65 %96
+         %97 = OpLoad %int %x_67_phi
+         %98 = OpLoad %int %x_65
+               OpStore %x_51_phi %98
+         %99 = OpLoad %int %x_62
+               OpStore %x_49_phi %99
+        %100 = OpLoad %bool %x_45
+               OpStore %x_46_phi %100
+        %102 = OpSLessThan %bool %97 %int_2
+               OpSelectionMerge %103 None
+               OpBranchConditional %102 %104 %105
+        %104 = OpLabel
+               OpBranch %103
+        %105 = OpLabel
+               OpBranch %89
+        %103 = OpLabel
+               OpBranch %106
+        %106 = OpLabel
+               OpLoopMerge %107 %108 None
+               OpBranch %109
+        %109 = OpLabel
+        %114 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+        %115 = OpLoad %float %114
+        %116 = OpFOrdLessThan %bool %115 %float_n1
+               OpStore %x_78 %116
+        %119 = OpFOrdLessThan %bool %49 %float_0
+        %117 = OpLogicalNot %bool %119
+               OpSelectionMerge %120 None
+               OpBranchConditional %117 %121 %120
+        %121 = OpLabel
+        %122 = OpLoad %bool %x_78
+               OpSelectionMerge %123 None
+               OpBranchConditional %122 %124 %123
+        %124 = OpLabel
+               OpStore %x_66_phi %int_0
+               OpBranch %107
+        %123 = OpLabel
+               OpStore %x_86_phi %int_1
+               OpBranch %126
+        %126 = OpLabel
+               OpLoopMerge %127 %128 None
+               OpBranch %129
+        %129 = OpLabel
+        %131 = OpLoad %int %x_86_phi
+        %132 = OpLoad %int %x_65
+               OpStore %x_97_phi %132
+               OpStore %x_98_phi %false
+        %134 = OpSLessThan %bool %131 %int_3
+               OpSelectionMerge %135 None
+               OpBranchConditional %134 %136 %137
+        %136 = OpLabel
+               OpBranch %135
+        %137 = OpLabel
+               OpBranch %127
+        %135 = OpLabel
+        %138 = OpLoad %bool %x_78
+               OpSelectionMerge %139 None
+               OpBranchConditional %138 %140 %139
+        %140 = OpLabel
+               OpBranch %128
+        %139 = OpLabel
+        %141 = OpSGreaterThan %bool %131 %int_0
+               OpSelectionMerge %142 None
+               OpBranchConditional %141 %143 %142
+        %143 = OpLabel
+               OpStore %x_97_phi %int_1
+               OpStore %x_98_phi %true
+               OpBranch %127
+        %142 = OpLabel
+               OpBranch %128
+        %128 = OpLabel
+        %145 = OpIAdd %int %131 %int_1
+               OpStore %x_87 %145
+        %146 = OpLoad %int %x_87
+               OpStore %x_86_phi %146
+               OpBranch %126
+        %127 = OpLabel
+        %147 = OpLoad %int %x_97_phi
+               OpStore %x_97 %147
+        %148 = OpLoad %bool %x_98_phi
+        %149 = OpLoad %int %x_97
+               OpStore %x_66_phi %149
+               OpSelectionMerge %150 None
+               OpBranchConditional %148 %151 %150
+        %151 = OpLabel
+               OpBranch %107
+        %150 = OpLabel
+               OpBranch %120
+        %120 = OpLabel
+               OpStore %x_66_phi %int_0
+               OpBranch %107
+        %108 = OpLabel
+               OpBranch %106
+        %107 = OpLabel
+        %152 = OpLoad %int %x_66_phi
+               OpStore %x_66 %152
+        %154 = OpLoad %int %x_62
+        %155 = OpLoad %int %x_66
+        %156 = OpIAdd %int %154 %155
+        %153 = OpCopyObject %int %156
+               OpStore %x_63 %153
+               OpSelectionMerge %157 None
+               OpBranchConditional %51 %158 %157
+        %158 = OpLabel
+               OpBranch %159
+        %159 = OpLabel
+               OpLoopMerge %160 %161 None
+               OpBranch %162
+        %162 = OpLabel
+               OpSelectionMerge %163 None
+               OpBranchConditional %51 %164 %165
+        %164 = OpLabel
+               OpBranch %163
+        %165 = OpLabel
+               OpBranch %160
+        %163 = OpLabel
+               OpBranch %161
+        %161 = OpLabel
+        %166 = OpConvertSToF %float %72
+        %167 = OpCompositeConstruct %v4float %166 %166 %166 %166
+               OpStore %x_GLF_color %167
+               OpBranch %159
+        %160 = OpLabel
+        %168 = OpLoad %int %x_66
+               OpStore %x_51_phi %168
+        %169 = OpLoad %int %x_63
+               OpStore %x_49_phi %169
+               OpStore %x_46_phi %true
+               OpBranch %89
+        %157 = OpLabel
+               OpBranch %90
+         %90 = OpLabel
+        %170 = OpIAdd %int %97 %int_1
+               OpStore %x_68 %170
+        %171 = OpLoad %int %x_63
+               OpStore %x_62_phi %171
+        %172 = OpLoad %int %x_66
+               OpStore %x_65_phi %172
+        %173 = OpLoad %int %x_68
+               OpStore %x_67_phi %173
+               OpBranch %88
+         %89 = OpLabel
+        %174 = OpLoad %int %x_51_phi
+        %175 = OpLoad %int %x_49_phi
+               OpStore %x_49 %175
+        %176 = OpLoad %bool %x_46_phi
+               OpStore %x_46 %176
+        %177 = OpLoad %int %x_49
+               OpStore %x_111_phi %177
+        %178 = OpLoad %bool %x_46
+               OpStore %x_112_phi %178
+        %179 = OpLoad %bool %x_46
+               OpSelectionMerge %180 None
+               OpBranchConditional %179 %181 %180
+        %181 = OpLabel
+               OpBranch %55
+        %180 = OpLabel
+        %182 = OpLogicalNot %bool %51
+               OpSelectionMerge %183 None
+               OpBranchConditional %182 %184 %183
+        %184 = OpLabel
+        %185 = OpLoad %int %x_49
+               OpStore %x_111_phi %185
+        %186 = OpLoad %bool %x_46
+               OpStore %x_112_phi %186
+               OpBranch %55
+        %183 = OpLabel
+               OpBranch %56
+         %56 = OpLabel
+        %187 = OpIAdd %int %72 %int_1
+               OpStore %x_53 %187
+        %188 = OpLoad %bool %x_46
+               OpStore %x_45_phi %188
+        %189 = OpLoad %int %x_49
+               OpStore %x_48_phi %189
+               OpStore %x_50_phi %174
+        %190 = OpLoad %int %x_53
+               OpStore %x_52_phi %190
+               OpBranch %54
+         %55 = OpLabel
+        %191 = OpLoad %int %x_111_phi
+        %192 = OpLoad %bool %x_112_phi
+               OpSelectionMerge %193 None
+               OpBranchConditional %192 %194 %193
+        %194 = OpLabel
+               OpBranch %20
+        %193 = OpLabel
+               OpStore %x_115_phi %191
+               OpStore %x_118_phi %int_0
+               OpStore %x_120_phi %int_0
+               OpBranch %195
+        %195 = OpLabel
+               OpLoopMerge %196 %197 None
+               OpBranch %198
+        %198 = OpLabel
+        %202 = OpLoad %int %x_115_phi
+               OpStore %x_115 %202
+        %203 = OpLoad %int %x_118_phi
+        %204 = OpLoad %int %x_120_phi
+        %205 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+        %206 = OpLoad %float %205
+        %207 = OpLoad %int %x_115
+               OpStore %x_161_phi %207
+        %210 = OpFAdd %float %206 %float_1
+        %208 = OpConvertFToS %int %210
+        %211 = OpSLessThan %bool %204 %208
+               OpSelectionMerge %212 None
+               OpBranchConditional %211 %213 %214
+        %213 = OpLabel
+               OpBranch %212
+        %214 = OpLabel
+               OpBranch %196
+        %212 = OpLabel
+               OpBranch %215
+        %215 = OpLabel
+               OpLoopMerge %216 %217 None
+               OpBranch %218
+        %218 = OpLabel
+        %223 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+        %224 = OpLoad %float %223
+        %225 = OpFOrdLessThan %bool %224 %float_n1
+               OpStore %x_135 %225
+        %227 = OpFOrdLessThan %bool %49 %float_0
+        %226 = OpLogicalNot %bool %227
+               OpSelectionMerge %228 None
+               OpBranchConditional %226 %229 %228
+        %229 = OpLabel
+        %230 = OpLoad %bool %x_135
+               OpSelectionMerge %231 None
+               OpBranchConditional %230 %232 %231
+        %232 = OpLabel
+               OpStore %x_119_phi %int_0
+               OpBranch %216
+        %231 = OpLabel
+               OpStore %x_143_phi %int_1
+               OpBranch %233
+        %233 = OpLabel
+               OpLoopMerge %234 %235 None
+               OpBranch %236
+        %236 = OpLabel
+        %238 = OpLoad %int %x_143_phi
+               OpStore %x_154_phi %203
+               OpStore %x_155_phi %false
+        %239 = OpSLessThan %bool %238 %int_3
+               OpSelectionMerge %240 None
+               OpBranchConditional %239 %241 %242
+        %241 = OpLabel
+               OpBranch %240
+        %242 = OpLabel
+               OpBranch %234
+        %240 = OpLabel
+        %243 = OpLoad %bool %x_135
+               OpSelectionMerge %244 None
+               OpBranchConditional %243 %245 %244
+        %245 = OpLabel
+               OpBranch %235
+        %244 = OpLabel
+        %246 = OpSGreaterThan %bool %238 %int_0
+               OpSelectionMerge %247 None
+               OpBranchConditional %246 %248 %247
+        %248 = OpLabel
+               OpStore %x_154_phi %int_1
+               OpStore %x_155_phi %true
+               OpBranch %234
+        %247 = OpLabel
+               OpBranch %235
+        %235 = OpLabel
+        %249 = OpIAdd %int %238 %int_1
+               OpStore %x_144 %249
+        %250 = OpLoad %int %x_144
+               OpStore %x_143_phi %250
+               OpBranch %233
+        %234 = OpLabel
+        %251 = OpLoad %int %x_154_phi
+               OpStore %x_154 %251
+        %252 = OpLoad %bool %x_155_phi
+        %253 = OpLoad %int %x_154
+               OpStore %x_119_phi %253
+               OpSelectionMerge %254 None
+               OpBranchConditional %252 %255 %254
+        %255 = OpLabel
+               OpBranch %216
+        %254 = OpLabel
+               OpBranch %228
+        %228 = OpLabel
+               OpStore %x_119_phi %int_0
+               OpBranch %216
+        %217 = OpLabel
+               OpBranch %215
+        %216 = OpLabel
+        %257 = OpLoad %int %x_119_phi
+               OpStore %x_119 %257
+        %259 = OpLoad %int %x_115
+        %260 = OpLoad %int %x_119
+        %261 = OpIAdd %int %259 %260
+        %258 = OpCopyObject %int %261
+               OpStore %x_116 %258
+        %263 = OpLogicalNot %bool %51
+        %262 = OpSelect %bool %263 %false %51
+               OpSelectionMerge %264 None
+               OpBranchConditional %262 %265 %264
+        %265 = OpLabel
+        %266 = OpLoad %int %x_116
+               OpStore %x_161_phi %266
+               OpBranch %196
+        %264 = OpLabel
+               OpBranch %197
+        %197 = OpLabel
+        %267 = OpIAdd %int %204 %int_1
+               OpStore %x_121 %267
+        %268 = OpLoad %int %x_116
+               OpStore %x_115_phi %268
+        %269 = OpLoad %int %x_119
+               OpStore %x_118_phi %269
+        %270 = OpLoad %int %x_121
+               OpStore %x_120_phi %270
+               OpBranch %195
+        %196 = OpLabel
+        %271 = OpLoad %int %x_161_phi
+        %273 = OpIEqual %bool %271 %int_4
+               OpSelectionMerge %274 None
+               OpBranchConditional %273 %275 %276
+        %275 = OpLabel
+               OpStore %x_GLF_color %277
+               OpBranch %274
+        %276 = OpLabel
+               OpStore %x_GLF_color %278
+               OpBranch %274
+        %274 = OpLabel
+               OpBranch %20
+         %21 = OpLabel
+               OpBranch %19
+         %20 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %279
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %283 = OpLabel
+        %284 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %284
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %286 = OpLabel
+        %287 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %287
+        %288 = OpFunctionCall %void %main_1
+        %290 = OpLoad %v4float %x_GLF_color
+        %291 = OpCompositeConstruct %main_out %290
+        %289 = OpFunctionCall %void %tint_symbol_3 %291
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/increment-value-in-nested-for-loop/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/increment-value-in-nested-for-loop/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..7b1d980
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/increment-value-in-nested-for-loop/0.wgsl.expected.wgsl
@@ -0,0 +1,274 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  loop {
+    var x_45 : bool;
+    var x_48 : i32;
+    var x_49 : i32;
+    var x_46 : bool;
+    var x_115 : i32;
+    var x_116 : i32;
+    var x_45_phi : bool;
+    var x_48_phi : i32;
+    var x_50_phi : i32;
+    var x_52_phi : i32;
+    var x_111_phi : i32;
+    var x_112_phi : bool;
+    var x_115_phi : i32;
+    var x_118_phi : i32;
+    var x_120_phi : i32;
+    var x_161_phi : i32;
+    let x_40 : f32 = x_6.injectionSwitch.x;
+    let x_41 : bool = (x_40 < -1.0);
+    x_45_phi = false;
+    x_48_phi = 0;
+    x_50_phi = 0;
+    x_52_phi = 0;
+    loop {
+      var x_62 : i32;
+      var x_65 : i32;
+      var x_66 : i32;
+      var x_63 : i32;
+      var x_53 : i32;
+      var x_62_phi : i32;
+      var x_65_phi : i32;
+      var x_67_phi : i32;
+      var x_51_phi : i32;
+      var x_49_phi : i32;
+      var x_46_phi : bool;
+      x_45 = x_45_phi;
+      x_48 = x_48_phi;
+      let x_50 : i32 = x_50_phi;
+      let x_52 : i32 = x_52_phi;
+      let x_55 : f32 = gl_FragCoord.y;
+      x_111_phi = x_48;
+      x_112_phi = x_45;
+      if ((x_52 < select(100, 10, (x_55 > -1.0)))) {
+      } else {
+        break;
+      }
+      x_62_phi = x_48;
+      x_65_phi = x_50;
+      x_67_phi = 0;
+      loop {
+        var x_97 : i32;
+        var x_68 : i32;
+        var x_66_phi : i32;
+        x_62 = x_62_phi;
+        x_65 = x_65_phi;
+        let x_67 : i32 = x_67_phi;
+        x_51_phi = x_65;
+        x_49_phi = x_62;
+        x_46_phi = x_45;
+        if ((x_67 < 2)) {
+        } else {
+          break;
+        }
+        loop {
+          var x_78 : bool;
+          var x_86_phi : i32;
+          var x_97_phi : i32;
+          var x_98_phi : bool;
+          let x_77 : f32 = gl_FragCoord.x;
+          x_78 = (x_77 < -1.0);
+          if (!((x_40 < 0.0))) {
+            if (x_78) {
+              x_66_phi = 0;
+              break;
+            }
+            x_86_phi = 1;
+            loop {
+              var x_87 : i32;
+              let x_86 : i32 = x_86_phi;
+              x_97_phi = x_65;
+              x_98_phi = false;
+              if ((x_86 < 3)) {
+              } else {
+                break;
+              }
+              if (x_78) {
+                continue;
+              }
+              if ((x_86 > 0)) {
+                x_97_phi = 1;
+                x_98_phi = true;
+                break;
+              }
+
+              continuing {
+                x_87 = (x_86 + 1);
+                x_86_phi = x_87;
+              }
+            }
+            x_97 = x_97_phi;
+            let x_98 : bool = x_98_phi;
+            x_66_phi = x_97;
+            if (x_98) {
+              break;
+            }
+          }
+          x_66_phi = 0;
+          break;
+        }
+        x_66 = x_66_phi;
+        x_63 = bitcast<i32>((x_62 + x_66));
+        if (x_41) {
+          loop {
+            if (x_41) {
+            } else {
+              break;
+            }
+
+            continuing {
+              let x_105 : f32 = f32(x_52);
+              x_GLF_color = vec4<f32>(x_105, x_105, x_105, x_105);
+            }
+          }
+          x_51_phi = x_66;
+          x_49_phi = x_63;
+          x_46_phi = true;
+          break;
+        }
+
+        continuing {
+          x_68 = (x_67 + 1);
+          x_62_phi = x_63;
+          x_65_phi = x_66;
+          x_67_phi = x_68;
+        }
+      }
+      let x_51 : i32 = x_51_phi;
+      x_49 = x_49_phi;
+      x_46 = x_46_phi;
+      x_111_phi = x_49;
+      x_112_phi = x_46;
+      if (x_46) {
+        break;
+      }
+      if (!(x_41)) {
+        x_111_phi = x_49;
+        x_112_phi = x_46;
+        break;
+      }
+
+      continuing {
+        x_53 = (x_52 + 1);
+        x_45_phi = x_46;
+        x_48_phi = x_49;
+        x_50_phi = x_51;
+        x_52_phi = x_53;
+      }
+    }
+    let x_111 : i32 = x_111_phi;
+    let x_112 : bool = x_112_phi;
+    if (x_112) {
+      break;
+    }
+    x_115_phi = x_111;
+    x_118_phi = 0;
+    x_120_phi = 0;
+    loop {
+      var x_154 : i32;
+      var x_121 : i32;
+      var x_119_phi : i32;
+      x_115 = x_115_phi;
+      let x_118 : i32 = x_118_phi;
+      let x_120 : i32 = x_120_phi;
+      let x_123 : f32 = x_6.injectionSwitch.y;
+      x_161_phi = x_115;
+      if ((x_120 < i32((x_123 + 1.0)))) {
+      } else {
+        break;
+      }
+      loop {
+        var x_135 : bool;
+        var x_143_phi : i32;
+        var x_154_phi : i32;
+        var x_155_phi : bool;
+        let x_134 : f32 = gl_FragCoord.x;
+        x_135 = (x_134 < -1.0);
+        if (!((x_40 < 0.0))) {
+          if (x_135) {
+            x_119_phi = 0;
+            break;
+          }
+          x_143_phi = 1;
+          loop {
+            var x_144 : i32;
+            let x_143 : i32 = x_143_phi;
+            x_154_phi = x_118;
+            x_155_phi = false;
+            if ((x_143 < 3)) {
+            } else {
+              break;
+            }
+            if (x_135) {
+              continue;
+            }
+            if ((x_143 > 0)) {
+              x_154_phi = 1;
+              x_155_phi = true;
+              break;
+            }
+
+            continuing {
+              x_144 = (x_143 + 1);
+              x_143_phi = x_144;
+            }
+          }
+          x_154 = x_154_phi;
+          let x_155 : bool = x_155_phi;
+          x_119_phi = x_154;
+          if (x_155) {
+            break;
+          }
+        }
+        x_119_phi = 0;
+        break;
+      }
+      var x_119 : i32;
+      x_119 = x_119_phi;
+      x_116 = bitcast<i32>((x_115 + x_119));
+      if (select(x_41, false, !(x_41))) {
+        x_161_phi = x_116;
+        break;
+      }
+
+      continuing {
+        x_121 = (x_120 + 1);
+        x_115_phi = x_116;
+        x_118_phi = x_119;
+        x_120_phi = x_121;
+      }
+    }
+    let x_161 : i32 = x_161_phi;
+    if ((x_161 == 4)) {
+      x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    } else {
+      x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+    }
+    break;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/injection-switch-as-comparison/0.spvasm b/test/vk-gl-cts/graphicsfuzz/injection-switch-as-comparison/0.spvasm
new file mode 100644
index 0000000..de646e8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/injection-switch-as-comparison/0.spvasm
@@ -0,0 +1,106 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %makeFrame_ "makeFrame("
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %7 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %8 RelaxedPrecision
+               OpDecorate %9 RelaxedPrecision
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+         %13 = OpTypeFunction %float
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %27 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %false = OpConstantFalse %bool
+       %true = OpConstantTrue %bool
+         %30 = OpUndef %float
+         %31 = OpUndef %bool
+         %32 = OpUndef %int
+       %main = OpFunction %void None %11
+         %33 = OpLabel
+         %34 = OpFunctionCall %float %makeFrame_
+               OpStore %_GLF_color %27
+               OpReturn
+               OpFunctionEnd
+ %makeFrame_ = OpFunction %float None %13
+         %35 = OpLabel
+               OpBranch %36
+         %36 = OpLabel
+               OpLoopMerge %37 %38 None
+               OpBranch %39
+         %39 = OpLabel
+               OpBranch %40
+         %40 = OpLabel
+         %41 = OpPhi %bool %false %39 %42 %43
+          %8 = OpPhi %int %int_0 %39 %7 %43
+         %44 = OpPhi %float %30 %39 %45 %43
+         %46 = OpSLessThan %bool %8 %int_1
+               OpLoopMerge %47 %43 None
+               OpBranchConditional %46 %48 %47
+         %48 = OpLabel
+               OpBranch %49
+         %49 = OpLabel
+         %50 = OpPhi %float %44 %48 %30 %51
+          %9 = OpPhi %int %8 %48 %32 %51
+         %52 = OpPhi %bool %41 %48 %31 %51
+         %53 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %54 = OpLoad %float %53
+         %55 = OpConvertFToS %int %54
+         %56 = OpSLessThan %bool %int_1 %55
+               OpLoopMerge %57 %51 None
+               OpBranchConditional %56 %58 %57
+         %58 = OpLabel
+               OpBranch %57
+         %51 = OpLabel
+               OpBranch %49
+         %57 = OpLabel
+         %45 = OpPhi %float %50 %49 %float_1 %58
+         %42 = OpPhi %bool %52 %49 %true %58
+               OpSelectionMerge %59 None
+               OpBranchConditional %42 %47 %59
+         %59 = OpLabel
+               OpBranch %43
+         %43 = OpLabel
+          %7 = OpIAdd %int %9 %int_1
+               OpBranch %40
+         %47 = OpLabel
+         %60 = OpPhi %float %44 %40 %45 %57
+         %61 = OpPhi %bool %41 %40 %42 %57
+               OpSelectionMerge %62 None
+               OpBranchConditional %61 %37 %62
+         %62 = OpLabel
+               OpBranch %37
+         %38 = OpLabel
+               OpBranch %36
+         %37 = OpLabel
+         %63 = OpPhi %float %60 %47 %float_1 %62
+               OpReturnValue %63
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/injection-switch-as-comparison/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/injection-switch-as-comparison/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..569cc6a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/injection-switch-as-comparison/0.spvasm.expected.hlsl
@@ -0,0 +1,108 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float makeFrame_() {
+  float x_60 = 0.0f;
+  float x_63_phi = 0.0f;
+  while (true) {
+    bool x_41 = false;
+    float x_44 = 0.0f;
+    float x_45 = 0.0f;
+    bool x_42 = false;
+    bool x_41_phi = false;
+    int x_8_phi = 0;
+    float x_44_phi = 0.0f;
+    float x_60_phi = 0.0f;
+    bool x_61_phi = false;
+    x_41_phi = false;
+    x_8_phi = 0;
+    x_44_phi = 0.0f;
+    while (true) {
+      float x_50 = 0.0f;
+      int x_9 = 0;
+      bool x_52 = false;
+      int x_7 = 0;
+      float x_50_phi = 0.0f;
+      int x_9_phi = 0;
+      bool x_52_phi = false;
+      float x_45_phi = 0.0f;
+      bool x_42_phi = false;
+      x_41 = x_41_phi;
+      const int x_8 = x_8_phi;
+      x_44 = x_44_phi;
+      x_60_phi = x_44;
+      x_61_phi = x_41;
+      if ((x_8 < 1)) {
+      } else {
+        break;
+      }
+      x_50_phi = x_44;
+      x_9_phi = x_8;
+      x_52_phi = x_41;
+      while (true) {
+        x_50 = x_50_phi;
+        x_9 = x_9_phi;
+        x_52 = x_52_phi;
+        const float x_54 = asfloat(x_6[0].y);
+        x_45_phi = x_50;
+        x_42_phi = x_52;
+        if ((1 < int(x_54))) {
+        } else {
+          break;
+        }
+        x_45_phi = 1.0f;
+        x_42_phi = true;
+        break;
+        {
+          x_50_phi = 0.0f;
+          x_9_phi = 0;
+          x_52_phi = false;
+        }
+      }
+      x_45 = x_45_phi;
+      x_42 = x_42_phi;
+      x_60_phi = x_45;
+      x_61_phi = x_42;
+      if (x_42) {
+        break;
+      }
+      {
+        x_7 = asint((x_9 + asint(1)));
+        x_41_phi = x_42;
+        x_8_phi = x_7;
+        x_44_phi = x_45;
+      }
+    }
+    x_60 = x_60_phi;
+    const bool x_61 = x_61_phi;
+    x_63_phi = x_60;
+    if (x_61) {
+      break;
+    }
+    x_63_phi = 1.0f;
+    break;
+  }
+  return x_63_phi;
+}
+
+void main_1() {
+  const float x_34 = makeFrame_();
+  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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/injection-switch-as-comparison/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/injection-switch-as-comparison/0.spvasm.expected.msl
new file mode 100644
index 0000000..c1f7672
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/injection-switch-as-comparison/0.spvasm.expected.msl
@@ -0,0 +1,112 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float makeFrame_(constant buf0& x_6) {
+  float x_60 = 0.0f;
+  float x_63_phi = 0.0f;
+  while (true) {
+    bool x_41 = false;
+    float x_44 = 0.0f;
+    float x_45 = 0.0f;
+    bool x_42 = false;
+    bool x_41_phi = false;
+    int x_8_phi = 0;
+    float x_44_phi = 0.0f;
+    float x_60_phi = 0.0f;
+    bool x_61_phi = false;
+    x_41_phi = false;
+    x_8_phi = 0;
+    x_44_phi = 0.0f;
+    while (true) {
+      float x_50 = 0.0f;
+      int x_9 = 0;
+      bool x_52 = false;
+      int x_7 = 0;
+      float x_50_phi = 0.0f;
+      int x_9_phi = 0;
+      bool x_52_phi = false;
+      float x_45_phi = 0.0f;
+      bool x_42_phi = false;
+      x_41 = x_41_phi;
+      int const x_8 = x_8_phi;
+      x_44 = x_44_phi;
+      x_60_phi = x_44;
+      x_61_phi = x_41;
+      if ((x_8 < 1)) {
+      } else {
+        break;
+      }
+      x_50_phi = x_44;
+      x_9_phi = x_8;
+      x_52_phi = x_41;
+      while (true) {
+        x_50 = x_50_phi;
+        x_9 = x_9_phi;
+        x_52 = x_52_phi;
+        float const x_54 = x_6.injectionSwitch.y;
+        x_45_phi = x_50;
+        x_42_phi = x_52;
+        if ((1 < int(x_54))) {
+        } else {
+          break;
+        }
+        x_45_phi = 1.0f;
+        x_42_phi = true;
+        break;
+        {
+          x_50_phi = 0.0f;
+          x_9_phi = 0;
+          x_52_phi = false;
+        }
+      }
+      x_45 = x_45_phi;
+      x_42 = x_42_phi;
+      x_60_phi = x_45;
+      x_61_phi = x_42;
+      if (x_42) {
+        break;
+      }
+      {
+        x_7 = as_type<int>((x_9 + as_type<int>(1)));
+        x_41_phi = x_42;
+        x_8_phi = x_7;
+        x_44_phi = x_45;
+      }
+    }
+    x_60 = x_60_phi;
+    bool const x_61 = x_61_phi;
+    x_63_phi = x_60;
+    if (x_61) {
+      break;
+    }
+    x_63_phi = 1.0f;
+    break;
+  }
+  float const x_63 = x_63_phi;
+  return x_63;
+}
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float const x_34 = makeFrame_(x_6);
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/injection-switch-as-comparison/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/injection-switch-as-comparison/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..ecb0861
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/injection-switch-as-comparison/0.spvasm.expected.spvasm
@@ -0,0 +1,243 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 126
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %makeFrame_ "makeFrame_"
+               OpName %x_60 "x_60"
+               OpName %x_63_phi "x_63_phi"
+               OpName %x_41 "x_41"
+               OpName %x_44 "x_44"
+               OpName %x_45 "x_45"
+               OpName %x_42 "x_42"
+               OpName %x_41_phi "x_41_phi"
+               OpName %x_8_phi "x_8_phi"
+               OpName %x_44_phi "x_44_phi"
+               OpName %x_60_phi "x_60_phi"
+               OpName %x_61_phi "x_61_phi"
+               OpName %x_50 "x_50"
+               OpName %x_9 "x_9"
+               OpName %x_52 "x_52"
+               OpName %x_7 "x_7"
+               OpName %x_50_phi "x_50_phi"
+               OpName %x_9_phi "x_9_phi"
+               OpName %x_52_phi "x_52_phi"
+               OpName %x_45_phi "x_45_phi"
+               OpName %x_42_phi "x_42_phi"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+         %12 = OpTypeFunction %float
+%_ptr_Function_float = OpTypePointer Function %float
+         %17 = OpConstantNull %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %26 = OpConstantNull %bool
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %34 = OpConstantNull %int
+      %false = OpConstantFalse %bool
+      %int_0 = OpConstant %int 0
+    %float_0 = OpConstant %float 0
+      %int_1 = OpConstant %int 1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+       %true = OpConstantTrue %bool
+       %void = OpTypeVoid
+        %108 = OpTypeFunction %void
+        %113 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %114 = OpTypeFunction %void %main_out
+ %makeFrame_ = OpFunction %float None %12
+         %14 = OpLabel
+       %x_60 = OpVariable %_ptr_Function_float Function %17
+   %x_63_phi = OpVariable %_ptr_Function_float Function %17
+       %x_41 = OpVariable %_ptr_Function_bool Function %26
+       %x_44 = OpVariable %_ptr_Function_float Function %17
+       %x_45 = OpVariable %_ptr_Function_float Function %17
+       %x_42 = OpVariable %_ptr_Function_bool Function %26
+   %x_41_phi = OpVariable %_ptr_Function_bool Function %26
+    %x_8_phi = OpVariable %_ptr_Function_int Function %34
+   %x_44_phi = OpVariable %_ptr_Function_float Function %17
+   %x_60_phi = OpVariable %_ptr_Function_float Function %17
+   %x_61_phi = OpVariable %_ptr_Function_bool Function %26
+       %x_50 = OpVariable %_ptr_Function_float Function %17
+        %x_9 = OpVariable %_ptr_Function_int Function %34
+       %x_52 = OpVariable %_ptr_Function_bool Function %26
+        %x_7 = OpVariable %_ptr_Function_int Function %34
+   %x_50_phi = OpVariable %_ptr_Function_float Function %17
+    %x_9_phi = OpVariable %_ptr_Function_int Function %34
+   %x_52_phi = OpVariable %_ptr_Function_bool Function %26
+   %x_45_phi = OpVariable %_ptr_Function_float Function %17
+   %x_42_phi = OpVariable %_ptr_Function_bool Function %26
+               OpBranch %19
+         %19 = OpLabel
+               OpLoopMerge %20 %21 None
+               OpBranch %22
+         %22 = OpLabel
+               OpStore %x_41_phi %false
+               OpStore %x_8_phi %int_0
+               OpStore %x_44_phi %float_0
+               OpBranch %41
+         %41 = OpLabel
+               OpLoopMerge %42 %43 None
+               OpBranch %44
+         %44 = OpLabel
+         %54 = OpLoad %bool %x_41_phi
+               OpStore %x_41 %54
+         %55 = OpLoad %int %x_8_phi
+         %56 = OpLoad %float %x_44_phi
+               OpStore %x_44 %56
+         %57 = OpLoad %float %x_44
+               OpStore %x_60_phi %57
+         %58 = OpLoad %bool %x_41
+               OpStore %x_61_phi %58
+         %60 = OpSLessThan %bool %55 %int_1
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %63
+         %62 = OpLabel
+               OpBranch %61
+         %63 = OpLabel
+               OpBranch %42
+         %61 = OpLabel
+         %64 = OpLoad %float %x_44
+               OpStore %x_50_phi %64
+               OpStore %x_9_phi %55
+         %65 = OpLoad %bool %x_41
+               OpStore %x_52_phi %65
+               OpBranch %66
+         %66 = OpLabel
+               OpLoopMerge %67 %68 None
+               OpBranch %69
+         %69 = OpLabel
+         %70 = OpLoad %float %x_50_phi
+               OpStore %x_50 %70
+         %71 = OpLoad %int %x_9_phi
+               OpStore %x_9 %71
+         %72 = OpLoad %bool %x_52_phi
+               OpStore %x_52 %72
+         %77 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %78 = OpLoad %float %77
+         %79 = OpLoad %float %x_50
+               OpStore %x_45_phi %79
+         %80 = OpLoad %bool %x_52
+               OpStore %x_42_phi %80
+         %81 = OpConvertFToS %int %78
+         %82 = OpSLessThan %bool %int_1 %81
+               OpSelectionMerge %83 None
+               OpBranchConditional %82 %84 %85
+         %84 = OpLabel
+               OpBranch %83
+         %85 = OpLabel
+               OpBranch %67
+         %83 = OpLabel
+               OpStore %x_45_phi %float_1
+               OpStore %x_42_phi %true
+               OpBranch %67
+         %68 = OpLabel
+               OpStore %x_50_phi %float_0
+               OpStore %x_9_phi %int_0
+               OpStore %x_52_phi %false
+               OpBranch %66
+         %67 = OpLabel
+         %88 = OpLoad %float %x_45_phi
+               OpStore %x_45 %88
+         %89 = OpLoad %bool %x_42_phi
+               OpStore %x_42 %89
+         %90 = OpLoad %float %x_45
+               OpStore %x_60_phi %90
+         %91 = OpLoad %bool %x_42
+               OpStore %x_61_phi %91
+         %92 = OpLoad %bool %x_42
+               OpSelectionMerge %93 None
+               OpBranchConditional %92 %94 %93
+         %94 = OpLabel
+               OpBranch %42
+         %93 = OpLabel
+               OpBranch %43
+         %43 = OpLabel
+         %96 = OpLoad %int %x_9
+         %97 = OpCopyObject %int %int_1
+         %98 = OpIAdd %int %96 %97
+         %95 = OpCopyObject %int %98
+               OpStore %x_7 %95
+         %99 = OpLoad %bool %x_42
+               OpStore %x_41_phi %99
+        %100 = OpLoad %int %x_7
+               OpStore %x_8_phi %100
+        %101 = OpLoad %float %x_45
+               OpStore %x_44_phi %101
+               OpBranch %41
+         %42 = OpLabel
+        %102 = OpLoad %float %x_60_phi
+               OpStore %x_60 %102
+        %103 = OpLoad %bool %x_61_phi
+        %104 = OpLoad %float %x_60
+               OpStore %x_63_phi %104
+               OpSelectionMerge %105 None
+               OpBranchConditional %103 %106 %105
+        %106 = OpLabel
+               OpBranch %20
+        %105 = OpLabel
+               OpStore %x_63_phi %float_1
+               OpBranch %20
+         %21 = OpLabel
+               OpBranch %19
+         %20 = OpLabel
+        %107 = OpLoad %float %x_63_phi
+               OpReturnValue %107
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %108
+        %111 = OpLabel
+        %112 = OpFunctionCall %float %makeFrame_
+               OpStore %x_GLF_color %113
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %114
+%tint_symbol = OpFunctionParameter %main_out
+        %118 = OpLabel
+        %119 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %119
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %108
+        %121 = OpLabel
+        %122 = OpFunctionCall %void %main_1
+        %124 = OpLoad %v4float %x_GLF_color
+        %125 = OpCompositeConstruct %main_out %124
+        %123 = OpFunctionCall %void %tint_symbol_2 %125
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/injection-switch-as-comparison/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/injection-switch-as-comparison/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..d594596
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/injection-switch-as-comparison/0.spvasm.expected.wgsl
@@ -0,0 +1,112 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn makeFrame_() -> f32 {
+  var x_60 : f32;
+  var x_63_phi : f32;
+  loop {
+    var x_41 : bool;
+    var x_44 : f32;
+    var x_45 : f32;
+    var x_42 : bool;
+    var x_41_phi : bool;
+    var x_8_phi : i32;
+    var x_44_phi : f32;
+    var x_60_phi : f32;
+    var x_61_phi : bool;
+    x_41_phi = false;
+    x_8_phi = 0;
+    x_44_phi = 0.0;
+    loop {
+      var x_50 : f32;
+      var x_9 : i32;
+      var x_52 : bool;
+      var x_7 : i32;
+      var x_50_phi : f32;
+      var x_9_phi : i32;
+      var x_52_phi : bool;
+      var x_45_phi : f32;
+      var x_42_phi : bool;
+      x_41 = x_41_phi;
+      let x_8 : i32 = x_8_phi;
+      x_44 = x_44_phi;
+      x_60_phi = x_44;
+      x_61_phi = x_41;
+      if ((x_8 < 1)) {
+      } else {
+        break;
+      }
+      x_50_phi = x_44;
+      x_9_phi = x_8;
+      x_52_phi = x_41;
+      loop {
+        x_50 = x_50_phi;
+        x_9 = x_9_phi;
+        x_52 = x_52_phi;
+        let x_54 : f32 = x_6.injectionSwitch.y;
+        x_45_phi = x_50;
+        x_42_phi = x_52;
+        if ((1 < i32(x_54))) {
+        } else {
+          break;
+        }
+        x_45_phi = 1.0;
+        x_42_phi = true;
+        break;
+
+        continuing {
+          x_50_phi = 0.0;
+          x_9_phi = 0;
+          x_52_phi = false;
+        }
+      }
+      x_45 = x_45_phi;
+      x_42 = x_42_phi;
+      x_60_phi = x_45;
+      x_61_phi = x_42;
+      if (x_42) {
+        break;
+      }
+
+      continuing {
+        x_7 = bitcast<i32>((x_9 + bitcast<i32>(1)));
+        x_41_phi = x_42;
+        x_8_phi = x_7;
+        x_44_phi = x_45;
+      }
+    }
+    x_60 = x_60_phi;
+    let x_61 : bool = x_61_phi;
+    x_63_phi = x_60;
+    if (x_61) {
+      break;
+    }
+    x_63_phi = 1.0;
+    break;
+  }
+  let x_63 : f32 = x_63_phi;
+  return x_63;
+}
+
+fn main_1() {
+  let x_34 : f32 = makeFrame_();
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/injection-switch-as-comparison/0.wgsl b/test/vk-gl-cts/graphicsfuzz/injection-switch-as-comparison/0.wgsl
new file mode 100644
index 0000000..d594596
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/injection-switch-as-comparison/0.wgsl
@@ -0,0 +1,112 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn makeFrame_() -> f32 {
+  var x_60 : f32;
+  var x_63_phi : f32;
+  loop {
+    var x_41 : bool;
+    var x_44 : f32;
+    var x_45 : f32;
+    var x_42 : bool;
+    var x_41_phi : bool;
+    var x_8_phi : i32;
+    var x_44_phi : f32;
+    var x_60_phi : f32;
+    var x_61_phi : bool;
+    x_41_phi = false;
+    x_8_phi = 0;
+    x_44_phi = 0.0;
+    loop {
+      var x_50 : f32;
+      var x_9 : i32;
+      var x_52 : bool;
+      var x_7 : i32;
+      var x_50_phi : f32;
+      var x_9_phi : i32;
+      var x_52_phi : bool;
+      var x_45_phi : f32;
+      var x_42_phi : bool;
+      x_41 = x_41_phi;
+      let x_8 : i32 = x_8_phi;
+      x_44 = x_44_phi;
+      x_60_phi = x_44;
+      x_61_phi = x_41;
+      if ((x_8 < 1)) {
+      } else {
+        break;
+      }
+      x_50_phi = x_44;
+      x_9_phi = x_8;
+      x_52_phi = x_41;
+      loop {
+        x_50 = x_50_phi;
+        x_9 = x_9_phi;
+        x_52 = x_52_phi;
+        let x_54 : f32 = x_6.injectionSwitch.y;
+        x_45_phi = x_50;
+        x_42_phi = x_52;
+        if ((1 < i32(x_54))) {
+        } else {
+          break;
+        }
+        x_45_phi = 1.0;
+        x_42_phi = true;
+        break;
+
+        continuing {
+          x_50_phi = 0.0;
+          x_9_phi = 0;
+          x_52_phi = false;
+        }
+      }
+      x_45 = x_45_phi;
+      x_42 = x_42_phi;
+      x_60_phi = x_45;
+      x_61_phi = x_42;
+      if (x_42) {
+        break;
+      }
+
+      continuing {
+        x_7 = bitcast<i32>((x_9 + bitcast<i32>(1)));
+        x_41_phi = x_42;
+        x_8_phi = x_7;
+        x_44_phi = x_45;
+      }
+    }
+    x_60 = x_60_phi;
+    let x_61 : bool = x_61_phi;
+    x_63_phi = x_60;
+    if (x_61) {
+      break;
+    }
+    x_63_phi = 1.0;
+    break;
+  }
+  let x_63 : f32 = x_63_phi;
+  return x_63;
+}
+
+fn main_1() {
+  let x_34 : f32 = makeFrame_();
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/injection-switch-as-comparison/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/injection-switch-as-comparison/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..569cc6a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/injection-switch-as-comparison/0.wgsl.expected.hlsl
@@ -0,0 +1,108 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float makeFrame_() {
+  float x_60 = 0.0f;
+  float x_63_phi = 0.0f;
+  while (true) {
+    bool x_41 = false;
+    float x_44 = 0.0f;
+    float x_45 = 0.0f;
+    bool x_42 = false;
+    bool x_41_phi = false;
+    int x_8_phi = 0;
+    float x_44_phi = 0.0f;
+    float x_60_phi = 0.0f;
+    bool x_61_phi = false;
+    x_41_phi = false;
+    x_8_phi = 0;
+    x_44_phi = 0.0f;
+    while (true) {
+      float x_50 = 0.0f;
+      int x_9 = 0;
+      bool x_52 = false;
+      int x_7 = 0;
+      float x_50_phi = 0.0f;
+      int x_9_phi = 0;
+      bool x_52_phi = false;
+      float x_45_phi = 0.0f;
+      bool x_42_phi = false;
+      x_41 = x_41_phi;
+      const int x_8 = x_8_phi;
+      x_44 = x_44_phi;
+      x_60_phi = x_44;
+      x_61_phi = x_41;
+      if ((x_8 < 1)) {
+      } else {
+        break;
+      }
+      x_50_phi = x_44;
+      x_9_phi = x_8;
+      x_52_phi = x_41;
+      while (true) {
+        x_50 = x_50_phi;
+        x_9 = x_9_phi;
+        x_52 = x_52_phi;
+        const float x_54 = asfloat(x_6[0].y);
+        x_45_phi = x_50;
+        x_42_phi = x_52;
+        if ((1 < int(x_54))) {
+        } else {
+          break;
+        }
+        x_45_phi = 1.0f;
+        x_42_phi = true;
+        break;
+        {
+          x_50_phi = 0.0f;
+          x_9_phi = 0;
+          x_52_phi = false;
+        }
+      }
+      x_45 = x_45_phi;
+      x_42 = x_42_phi;
+      x_60_phi = x_45;
+      x_61_phi = x_42;
+      if (x_42) {
+        break;
+      }
+      {
+        x_7 = asint((x_9 + asint(1)));
+        x_41_phi = x_42;
+        x_8_phi = x_7;
+        x_44_phi = x_45;
+      }
+    }
+    x_60 = x_60_phi;
+    const bool x_61 = x_61_phi;
+    x_63_phi = x_60;
+    if (x_61) {
+      break;
+    }
+    x_63_phi = 1.0f;
+    break;
+  }
+  return x_63_phi;
+}
+
+void main_1() {
+  const float x_34 = makeFrame_();
+  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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/injection-switch-as-comparison/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/injection-switch-as-comparison/0.wgsl.expected.msl
new file mode 100644
index 0000000..c1f7672
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/injection-switch-as-comparison/0.wgsl.expected.msl
@@ -0,0 +1,112 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float makeFrame_(constant buf0& x_6) {
+  float x_60 = 0.0f;
+  float x_63_phi = 0.0f;
+  while (true) {
+    bool x_41 = false;
+    float x_44 = 0.0f;
+    float x_45 = 0.0f;
+    bool x_42 = false;
+    bool x_41_phi = false;
+    int x_8_phi = 0;
+    float x_44_phi = 0.0f;
+    float x_60_phi = 0.0f;
+    bool x_61_phi = false;
+    x_41_phi = false;
+    x_8_phi = 0;
+    x_44_phi = 0.0f;
+    while (true) {
+      float x_50 = 0.0f;
+      int x_9 = 0;
+      bool x_52 = false;
+      int x_7 = 0;
+      float x_50_phi = 0.0f;
+      int x_9_phi = 0;
+      bool x_52_phi = false;
+      float x_45_phi = 0.0f;
+      bool x_42_phi = false;
+      x_41 = x_41_phi;
+      int const x_8 = x_8_phi;
+      x_44 = x_44_phi;
+      x_60_phi = x_44;
+      x_61_phi = x_41;
+      if ((x_8 < 1)) {
+      } else {
+        break;
+      }
+      x_50_phi = x_44;
+      x_9_phi = x_8;
+      x_52_phi = x_41;
+      while (true) {
+        x_50 = x_50_phi;
+        x_9 = x_9_phi;
+        x_52 = x_52_phi;
+        float const x_54 = x_6.injectionSwitch.y;
+        x_45_phi = x_50;
+        x_42_phi = x_52;
+        if ((1 < int(x_54))) {
+        } else {
+          break;
+        }
+        x_45_phi = 1.0f;
+        x_42_phi = true;
+        break;
+        {
+          x_50_phi = 0.0f;
+          x_9_phi = 0;
+          x_52_phi = false;
+        }
+      }
+      x_45 = x_45_phi;
+      x_42 = x_42_phi;
+      x_60_phi = x_45;
+      x_61_phi = x_42;
+      if (x_42) {
+        break;
+      }
+      {
+        x_7 = as_type<int>((x_9 + as_type<int>(1)));
+        x_41_phi = x_42;
+        x_8_phi = x_7;
+        x_44_phi = x_45;
+      }
+    }
+    x_60 = x_60_phi;
+    bool const x_61 = x_61_phi;
+    x_63_phi = x_60;
+    if (x_61) {
+      break;
+    }
+    x_63_phi = 1.0f;
+    break;
+  }
+  float const x_63 = x_63_phi;
+  return x_63;
+}
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float const x_34 = makeFrame_(x_6);
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/injection-switch-as-comparison/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/injection-switch-as-comparison/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..ecb0861
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/injection-switch-as-comparison/0.wgsl.expected.spvasm
@@ -0,0 +1,243 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 126
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %makeFrame_ "makeFrame_"
+               OpName %x_60 "x_60"
+               OpName %x_63_phi "x_63_phi"
+               OpName %x_41 "x_41"
+               OpName %x_44 "x_44"
+               OpName %x_45 "x_45"
+               OpName %x_42 "x_42"
+               OpName %x_41_phi "x_41_phi"
+               OpName %x_8_phi "x_8_phi"
+               OpName %x_44_phi "x_44_phi"
+               OpName %x_60_phi "x_60_phi"
+               OpName %x_61_phi "x_61_phi"
+               OpName %x_50 "x_50"
+               OpName %x_9 "x_9"
+               OpName %x_52 "x_52"
+               OpName %x_7 "x_7"
+               OpName %x_50_phi "x_50_phi"
+               OpName %x_9_phi "x_9_phi"
+               OpName %x_52_phi "x_52_phi"
+               OpName %x_45_phi "x_45_phi"
+               OpName %x_42_phi "x_42_phi"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+         %12 = OpTypeFunction %float
+%_ptr_Function_float = OpTypePointer Function %float
+         %17 = OpConstantNull %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %26 = OpConstantNull %bool
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %34 = OpConstantNull %int
+      %false = OpConstantFalse %bool
+      %int_0 = OpConstant %int 0
+    %float_0 = OpConstant %float 0
+      %int_1 = OpConstant %int 1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+       %true = OpConstantTrue %bool
+       %void = OpTypeVoid
+        %108 = OpTypeFunction %void
+        %113 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %114 = OpTypeFunction %void %main_out
+ %makeFrame_ = OpFunction %float None %12
+         %14 = OpLabel
+       %x_60 = OpVariable %_ptr_Function_float Function %17
+   %x_63_phi = OpVariable %_ptr_Function_float Function %17
+       %x_41 = OpVariable %_ptr_Function_bool Function %26
+       %x_44 = OpVariable %_ptr_Function_float Function %17
+       %x_45 = OpVariable %_ptr_Function_float Function %17
+       %x_42 = OpVariable %_ptr_Function_bool Function %26
+   %x_41_phi = OpVariable %_ptr_Function_bool Function %26
+    %x_8_phi = OpVariable %_ptr_Function_int Function %34
+   %x_44_phi = OpVariable %_ptr_Function_float Function %17
+   %x_60_phi = OpVariable %_ptr_Function_float Function %17
+   %x_61_phi = OpVariable %_ptr_Function_bool Function %26
+       %x_50 = OpVariable %_ptr_Function_float Function %17
+        %x_9 = OpVariable %_ptr_Function_int Function %34
+       %x_52 = OpVariable %_ptr_Function_bool Function %26
+        %x_7 = OpVariable %_ptr_Function_int Function %34
+   %x_50_phi = OpVariable %_ptr_Function_float Function %17
+    %x_9_phi = OpVariable %_ptr_Function_int Function %34
+   %x_52_phi = OpVariable %_ptr_Function_bool Function %26
+   %x_45_phi = OpVariable %_ptr_Function_float Function %17
+   %x_42_phi = OpVariable %_ptr_Function_bool Function %26
+               OpBranch %19
+         %19 = OpLabel
+               OpLoopMerge %20 %21 None
+               OpBranch %22
+         %22 = OpLabel
+               OpStore %x_41_phi %false
+               OpStore %x_8_phi %int_0
+               OpStore %x_44_phi %float_0
+               OpBranch %41
+         %41 = OpLabel
+               OpLoopMerge %42 %43 None
+               OpBranch %44
+         %44 = OpLabel
+         %54 = OpLoad %bool %x_41_phi
+               OpStore %x_41 %54
+         %55 = OpLoad %int %x_8_phi
+         %56 = OpLoad %float %x_44_phi
+               OpStore %x_44 %56
+         %57 = OpLoad %float %x_44
+               OpStore %x_60_phi %57
+         %58 = OpLoad %bool %x_41
+               OpStore %x_61_phi %58
+         %60 = OpSLessThan %bool %55 %int_1
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %63
+         %62 = OpLabel
+               OpBranch %61
+         %63 = OpLabel
+               OpBranch %42
+         %61 = OpLabel
+         %64 = OpLoad %float %x_44
+               OpStore %x_50_phi %64
+               OpStore %x_9_phi %55
+         %65 = OpLoad %bool %x_41
+               OpStore %x_52_phi %65
+               OpBranch %66
+         %66 = OpLabel
+               OpLoopMerge %67 %68 None
+               OpBranch %69
+         %69 = OpLabel
+         %70 = OpLoad %float %x_50_phi
+               OpStore %x_50 %70
+         %71 = OpLoad %int %x_9_phi
+               OpStore %x_9 %71
+         %72 = OpLoad %bool %x_52_phi
+               OpStore %x_52 %72
+         %77 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %78 = OpLoad %float %77
+         %79 = OpLoad %float %x_50
+               OpStore %x_45_phi %79
+         %80 = OpLoad %bool %x_52
+               OpStore %x_42_phi %80
+         %81 = OpConvertFToS %int %78
+         %82 = OpSLessThan %bool %int_1 %81
+               OpSelectionMerge %83 None
+               OpBranchConditional %82 %84 %85
+         %84 = OpLabel
+               OpBranch %83
+         %85 = OpLabel
+               OpBranch %67
+         %83 = OpLabel
+               OpStore %x_45_phi %float_1
+               OpStore %x_42_phi %true
+               OpBranch %67
+         %68 = OpLabel
+               OpStore %x_50_phi %float_0
+               OpStore %x_9_phi %int_0
+               OpStore %x_52_phi %false
+               OpBranch %66
+         %67 = OpLabel
+         %88 = OpLoad %float %x_45_phi
+               OpStore %x_45 %88
+         %89 = OpLoad %bool %x_42_phi
+               OpStore %x_42 %89
+         %90 = OpLoad %float %x_45
+               OpStore %x_60_phi %90
+         %91 = OpLoad %bool %x_42
+               OpStore %x_61_phi %91
+         %92 = OpLoad %bool %x_42
+               OpSelectionMerge %93 None
+               OpBranchConditional %92 %94 %93
+         %94 = OpLabel
+               OpBranch %42
+         %93 = OpLabel
+               OpBranch %43
+         %43 = OpLabel
+         %96 = OpLoad %int %x_9
+         %97 = OpCopyObject %int %int_1
+         %98 = OpIAdd %int %96 %97
+         %95 = OpCopyObject %int %98
+               OpStore %x_7 %95
+         %99 = OpLoad %bool %x_42
+               OpStore %x_41_phi %99
+        %100 = OpLoad %int %x_7
+               OpStore %x_8_phi %100
+        %101 = OpLoad %float %x_45
+               OpStore %x_44_phi %101
+               OpBranch %41
+         %42 = OpLabel
+        %102 = OpLoad %float %x_60_phi
+               OpStore %x_60 %102
+        %103 = OpLoad %bool %x_61_phi
+        %104 = OpLoad %float %x_60
+               OpStore %x_63_phi %104
+               OpSelectionMerge %105 None
+               OpBranchConditional %103 %106 %105
+        %106 = OpLabel
+               OpBranch %20
+        %105 = OpLabel
+               OpStore %x_63_phi %float_1
+               OpBranch %20
+         %21 = OpLabel
+               OpBranch %19
+         %20 = OpLabel
+        %107 = OpLoad %float %x_63_phi
+               OpReturnValue %107
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %108
+        %111 = OpLabel
+        %112 = OpFunctionCall %float %makeFrame_
+               OpStore %x_GLF_color %113
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %114
+%tint_symbol = OpFunctionParameter %main_out
+        %118 = OpLabel
+        %119 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %119
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %108
+        %121 = OpLabel
+        %122 = OpFunctionCall %void %main_1
+        %124 = OpLoad %v4float %x_GLF_color
+        %125 = OpCompositeConstruct %main_out %124
+        %123 = OpFunctionCall %void %tint_symbol_2 %125
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/injection-switch-as-comparison/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/injection-switch-as-comparison/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..d594596
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/injection-switch-as-comparison/0.wgsl.expected.wgsl
@@ -0,0 +1,112 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn makeFrame_() -> f32 {
+  var x_60 : f32;
+  var x_63_phi : f32;
+  loop {
+    var x_41 : bool;
+    var x_44 : f32;
+    var x_45 : f32;
+    var x_42 : bool;
+    var x_41_phi : bool;
+    var x_8_phi : i32;
+    var x_44_phi : f32;
+    var x_60_phi : f32;
+    var x_61_phi : bool;
+    x_41_phi = false;
+    x_8_phi = 0;
+    x_44_phi = 0.0;
+    loop {
+      var x_50 : f32;
+      var x_9 : i32;
+      var x_52 : bool;
+      var x_7 : i32;
+      var x_50_phi : f32;
+      var x_9_phi : i32;
+      var x_52_phi : bool;
+      var x_45_phi : f32;
+      var x_42_phi : bool;
+      x_41 = x_41_phi;
+      let x_8 : i32 = x_8_phi;
+      x_44 = x_44_phi;
+      x_60_phi = x_44;
+      x_61_phi = x_41;
+      if ((x_8 < 1)) {
+      } else {
+        break;
+      }
+      x_50_phi = x_44;
+      x_9_phi = x_8;
+      x_52_phi = x_41;
+      loop {
+        x_50 = x_50_phi;
+        x_9 = x_9_phi;
+        x_52 = x_52_phi;
+        let x_54 : f32 = x_6.injectionSwitch.y;
+        x_45_phi = x_50;
+        x_42_phi = x_52;
+        if ((1 < i32(x_54))) {
+        } else {
+          break;
+        }
+        x_45_phi = 1.0;
+        x_42_phi = true;
+        break;
+
+        continuing {
+          x_50_phi = 0.0;
+          x_9_phi = 0;
+          x_52_phi = false;
+        }
+      }
+      x_45 = x_45_phi;
+      x_42 = x_42_phi;
+      x_60_phi = x_45;
+      x_61_phi = x_42;
+      if (x_42) {
+        break;
+      }
+
+      continuing {
+        x_7 = bitcast<i32>((x_9 + bitcast<i32>(1)));
+        x_41_phi = x_42;
+        x_8_phi = x_7;
+        x_44_phi = x_45;
+      }
+    }
+    x_60 = x_60_phi;
+    let x_61 : bool = x_61_phi;
+    x_63_phi = x_60;
+    if (x_61) {
+      break;
+    }
+    x_63_phi = 1.0;
+    break;
+  }
+  let x_63 : f32 = x_63_phi;
+  return x_63;
+}
+
+fn main_1() {
+  let x_34 : f32 = makeFrame_();
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/int-mat2-struct/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/int-mat2-struct/0-opt.spvasm
new file mode 100644
index 0000000..9ec352e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/int-mat2-struct/0-opt.spvasm
@@ -0,0 +1,96 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %S "S"
+               OpMemberName %S 0 "f1"
+               OpMemberName %S 1 "f2"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %S 0 RelaxedPrecision
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %6 RelaxedPrecision
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%mat2v2float = OpTypeMatrix %v2float 2
+          %S = OpTypeStruct %int %mat2v2float
+%_ptr_Function_S = OpTypePointer Function %S
+      %int_1 = OpConstant %int 1
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+%_ptr_Function_mat2v2float = OpTypePointer Function %mat2v2float
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+         %25 = OpConstantComposite %v2float %float_1 %float_2
+    %float_3 = OpConstant %float 3
+    %float_4 = OpConstant %float 4
+         %28 = OpConstantComposite %v2float %float_3 %float_4
+         %29 = OpConstantComposite %mat2v2float %25 %28
+  %float_0_5 = OpConstant %float 0.5
+ %float_n0_5 = OpConstant %float -0.5
+         %32 = OpConstantComposite %v2float %float_0_5 %float_n0_5
+         %33 = OpConstantComposite %v2float %float_n0_5 %float_0_5
+         %34 = OpConstantComposite %mat2v2float %32 %33
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+      %int_0 = OpConstant %int 0
+%_ptr_Function_int = OpTypePointer Function %int
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+       %main = OpFunction %void None %8
+         %40 = OpLabel
+         %41 = OpVariable %_ptr_Function_mat2v2float Function
+          %6 = OpVariable %_ptr_Function_int Function
+         %42 = OpVariable %_ptr_Function_mat2v2float Function
+         %43 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %44 = OpLoad %float %43
+         %45 = OpFOrdLessThan %bool %44 %float_0
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %48
+         %47 = OpLabel
+               OpStore %42 %29
+               OpBranch %46
+         %48 = OpLabel
+               OpStore %42 %34
+               OpBranch %46
+         %46 = OpLabel
+         %49 = OpPhi %mat2v2float %29 %47 %34 %48
+         %50 = OpTranspose %mat2v2float %49
+         %51 = OpCompositeConstruct %S %int_1 %50
+         %52 = OpCompositeExtract %int %51 0
+               OpStore %6 %52
+         %53 = OpCompositeExtract %mat2v2float %51 1
+               OpStore %41 %53
+         %54 = OpConvertSToF %float %52
+         %55 = OpAccessChain %_ptr_Function_float %41 %int_0 %uint_0
+         %56 = OpLoad %mat2v2float %41
+         %57 = OpCompositeExtract %float %56 0 0
+         %58 = OpAccessChain %_ptr_Function_float %41 %int_1 %uint_0
+         %59 = OpLoad %mat2v2float %41
+         %60 = OpCompositeExtract %float %59 1 0
+         %61 = OpFAdd %float %57 %60
+         %62 = OpAccessChain %_ptr_Function_float %41 %int_0 %uint_1
+         %63 = OpLoad %mat2v2float %41
+         %64 = OpCompositeExtract %float %63 0 1
+         %65 = OpAccessChain %_ptr_Function_float %41 %int_1 %uint_1
+         %66 = OpLoad %mat2v2float %41
+         %67 = OpCompositeExtract %float %66 1 1
+         %68 = OpFAdd %float %64 %67
+         %69 = OpConvertSToF %float %52
+         %70 = OpCompositeConstruct %v4float %54 %61 %68 %69
+               OpStore %_GLF_color %70
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/int-mat2-struct/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/int-mat2-struct/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..c0d5468
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/int-mat2-struct/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,50 @@
+struct S {
+  int f1;
+  float2x2 f2;
+};
+
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2x2 x_41 = float2x2(0.0f, 0.0f, 0.0f, 0.0f);
+  int x_6 = 0;
+  float2x2 x_42 = float2x2(0.0f, 0.0f, 0.0f, 0.0f);
+  float2x2 x_49_phi = float2x2(0.0f, 0.0f, 0.0f, 0.0f);
+  const float x_44 = gl_FragCoord.x;
+  if ((x_44 < 0.0f)) {
+    x_42 = float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f));
+    x_49_phi = float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f));
+  } else {
+    x_42 = float2x2(float2(0.5f, -0.5f), float2(-0.5f, 0.5f));
+    x_49_phi = float2x2(float2(0.5f, -0.5f), float2(-0.5f, 0.5f));
+  }
+  const S x_51 = {1, transpose(x_49_phi)};
+  const int x_52 = x_51.f1;
+  x_6 = x_52;
+  x_41 = x_51.f2;
+  const float2x2 x_56 = x_41;
+  const float2x2 x_59 = x_41;
+  const float2x2 x_63 = x_41;
+  x_GLF_color = float4(float(x_52), (x_56[0u].x + x_59[1u].x), (x_63[0u].y + x_41[1u].y), float(x_52));
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/int-mat2-struct/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/int-mat2-struct/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..256e64b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/int-mat2-struct/0-opt.spvasm.expected.msl
@@ -0,0 +1,50 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  int f1;
+  float2x2 f2;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float2x2 x_41 = float2x2(0.0f);
+  int x_6 = 0;
+  float2x2 x_42 = float2x2(0.0f);
+  float2x2 x_49_phi = float2x2(0.0f);
+  float const x_44 = (*(tint_symbol_5)).x;
+  if ((x_44 < 0.0f)) {
+    x_42 = float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f));
+    x_49_phi = float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f));
+  } else {
+    x_42 = float2x2(float2(0.5f, -0.5f), float2(-0.5f, 0.5f));
+    x_49_phi = float2x2(float2(0.5f, -0.5f), float2(-0.5f, 0.5f));
+  }
+  float2x2 const x_49 = x_49_phi;
+  S const x_51 = {.f1=1, .f2=transpose(x_49)};
+  int const x_52 = x_51.f1;
+  x_6 = x_52;
+  x_41 = x_51.f2;
+  float2x2 const x_56 = x_41;
+  float2x2 const x_59 = x_41;
+  float2x2 const x_63 = x_41;
+  float2x2 const x_66 = x_41;
+  *(tint_symbol_6) = float4(float(x_52), (x_56[0u].x + x_59[1u].x), (x_63[0u].y + x_66[1u].y), float(x_52));
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(&(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/int-mat2-struct/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/int-mat2-struct/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..5706393
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/int-mat2-struct/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,138 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 87
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %x_41 "x_41"
+               OpName %x_6 "x_6"
+               OpName %x_42 "x_42"
+               OpName %x_49_phi "x_49_phi"
+               OpName %S "S"
+               OpMemberName %S 0 "f1"
+               OpMemberName %S 1 "f2"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %S 0 Offset 0
+               OpMemberDecorate %S 1 Offset 8
+               OpMemberDecorate %S 1 ColMajor
+               OpMemberDecorate %S 1 MatrixStride 8
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%mat2v2float = OpTypeMatrix %v2float 2
+%_ptr_Function_mat2v2float = OpTypePointer Function %mat2v2float
+         %19 = OpConstantNull %mat2v2float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+         %39 = OpConstantComposite %v2float %float_1 %float_2
+    %float_3 = OpConstant %float 3
+    %float_4 = OpConstant %float 4
+         %42 = OpConstantComposite %v2float %float_3 %float_4
+         %43 = OpConstantComposite %mat2v2float %39 %42
+  %float_0_5 = OpConstant %float 0.5
+ %float_n0_5 = OpConstant %float -0.5
+         %46 = OpConstantComposite %v2float %float_0_5 %float_n0_5
+         %47 = OpConstantComposite %v2float %float_n0_5 %float_0_5
+         %48 = OpConstantComposite %mat2v2float %46 %47
+          %S = OpTypeStruct %int %mat2v2float
+      %int_1 = OpConstant %int 1
+     %uint_1 = OpConstant %uint 1
+   %main_out = OpTypeStruct %v4float
+         %74 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+       %x_41 = OpVariable %_ptr_Function_mat2v2float Function %19
+        %x_6 = OpVariable %_ptr_Function_int Function %23
+       %x_42 = OpVariable %_ptr_Function_mat2v2float Function %19
+   %x_49_phi = OpVariable %_ptr_Function_mat2v2float Function %19
+         %29 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %30 = OpLoad %float %29
+         %32 = OpFOrdLessThan %bool %30 %float_0
+               OpSelectionMerge %34 None
+               OpBranchConditional %32 %35 %36
+         %35 = OpLabel
+               OpStore %x_42 %43
+               OpStore %x_49_phi %43
+               OpBranch %34
+         %36 = OpLabel
+               OpStore %x_42 %48
+               OpStore %x_49_phi %48
+               OpBranch %34
+         %34 = OpLabel
+         %49 = OpLoad %mat2v2float %x_49_phi
+         %52 = OpTranspose %mat2v2float %49
+         %53 = OpCompositeConstruct %S %int_1 %52
+         %54 = OpCompositeExtract %int %53 0
+               OpStore %x_6 %54
+         %55 = OpCompositeExtract %mat2v2float %53 1
+               OpStore %x_41 %55
+         %56 = OpLoad %mat2v2float %x_41
+         %57 = OpLoad %mat2v2float %x_41
+         %58 = OpLoad %mat2v2float %x_41
+         %59 = OpLoad %mat2v2float %x_41
+         %60 = OpConvertSToF %float %54
+         %61 = OpCompositeExtract %v2float %56 0
+         %62 = OpCompositeExtract %float %61 0
+         %64 = OpCompositeExtract %v2float %57 1
+         %65 = OpCompositeExtract %float %64 0
+         %66 = OpFAdd %float %62 %65
+         %67 = OpCompositeExtract %v2float %58 0
+         %68 = OpCompositeExtract %float %67 1
+         %69 = OpCompositeExtract %v2float %59 1
+         %70 = OpCompositeExtract %float %69 1
+         %71 = OpFAdd %float %68 %70
+         %72 = OpConvertSToF %float %54
+         %73 = OpCompositeConstruct %v4float %60 %66 %71 %72
+               OpStore %x_GLF_color %73
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %74
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %78 = OpLabel
+         %79 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %79
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %81 = OpLabel
+         %82 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %82
+         %83 = OpFunctionCall %void %main_1
+         %85 = OpLoad %v4float %x_GLF_color
+         %86 = OpCompositeConstruct %main_out %85
+         %84 = OpFunctionCall %void %tint_symbol_3 %86
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/int-mat2-struct/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/int-mat2-struct/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..4df9f94
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/int-mat2-struct/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,50 @@
+struct S {
+  f1 : i32;
+  f2 : mat2x2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_41 : mat2x2<f32>;
+  var x_6 : i32;
+  var x_42 : mat2x2<f32>;
+  var x_49_phi : mat2x2<f32>;
+  let x_44 : f32 = gl_FragCoord.x;
+  if ((x_44 < 0.0)) {
+    x_42 = mat2x2<f32>(vec2<f32>(1.0, 2.0), vec2<f32>(3.0, 4.0));
+    x_49_phi = mat2x2<f32>(vec2<f32>(1.0, 2.0), vec2<f32>(3.0, 4.0));
+  } else {
+    x_42 = mat2x2<f32>(vec2<f32>(0.5, -0.5), vec2<f32>(-0.5, 0.5));
+    x_49_phi = mat2x2<f32>(vec2<f32>(0.5, -0.5), vec2<f32>(-0.5, 0.5));
+  }
+  let x_49 : mat2x2<f32> = x_49_phi;
+  let x_51 : S = S(1, transpose(x_49));
+  let x_52 : i32 = x_51.f1;
+  x_6 = x_52;
+  x_41 = x_51.f2;
+  let x_55 : ptr<function, f32> = &(x_41[0].x);
+  let x_56 : mat2x2<f32> = x_41;
+  let x_58 : ptr<function, f32> = &(x_41[1].x);
+  let x_59 : mat2x2<f32> = x_41;
+  let x_62 : ptr<function, f32> = &(x_41[0].y);
+  let x_63 : mat2x2<f32> = x_41;
+  let x_65 : ptr<function, f32> = &(x_41[1].y);
+  let x_66 : mat2x2<f32> = x_41;
+  x_GLF_color = vec4<f32>(f32(x_52), (x_56[0u].x + x_59[1u].x), (x_63[0u].y + x_66[1u].y), f32(x_52));
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/int-mat2-struct/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/int-mat2-struct/0-opt.wgsl
new file mode 100644
index 0000000..4df9f94
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/int-mat2-struct/0-opt.wgsl
@@ -0,0 +1,50 @@
+struct S {
+  f1 : i32;
+  f2 : mat2x2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_41 : mat2x2<f32>;
+  var x_6 : i32;
+  var x_42 : mat2x2<f32>;
+  var x_49_phi : mat2x2<f32>;
+  let x_44 : f32 = gl_FragCoord.x;
+  if ((x_44 < 0.0)) {
+    x_42 = mat2x2<f32>(vec2<f32>(1.0, 2.0), vec2<f32>(3.0, 4.0));
+    x_49_phi = mat2x2<f32>(vec2<f32>(1.0, 2.0), vec2<f32>(3.0, 4.0));
+  } else {
+    x_42 = mat2x2<f32>(vec2<f32>(0.5, -0.5), vec2<f32>(-0.5, 0.5));
+    x_49_phi = mat2x2<f32>(vec2<f32>(0.5, -0.5), vec2<f32>(-0.5, 0.5));
+  }
+  let x_49 : mat2x2<f32> = x_49_phi;
+  let x_51 : S = S(1, transpose(x_49));
+  let x_52 : i32 = x_51.f1;
+  x_6 = x_52;
+  x_41 = x_51.f2;
+  let x_55 : ptr<function, f32> = &(x_41[0].x);
+  let x_56 : mat2x2<f32> = x_41;
+  let x_58 : ptr<function, f32> = &(x_41[1].x);
+  let x_59 : mat2x2<f32> = x_41;
+  let x_62 : ptr<function, f32> = &(x_41[0].y);
+  let x_63 : mat2x2<f32> = x_41;
+  let x_65 : ptr<function, f32> = &(x_41[1].y);
+  let x_66 : mat2x2<f32> = x_41;
+  x_GLF_color = vec4<f32>(f32(x_52), (x_56[0u].x + x_59[1u].x), (x_63[0u].y + x_66[1u].y), f32(x_52));
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/int-mat2-struct/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/int-mat2-struct/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..c0d5468
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/int-mat2-struct/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,50 @@
+struct S {
+  int f1;
+  float2x2 f2;
+};
+
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2x2 x_41 = float2x2(0.0f, 0.0f, 0.0f, 0.0f);
+  int x_6 = 0;
+  float2x2 x_42 = float2x2(0.0f, 0.0f, 0.0f, 0.0f);
+  float2x2 x_49_phi = float2x2(0.0f, 0.0f, 0.0f, 0.0f);
+  const float x_44 = gl_FragCoord.x;
+  if ((x_44 < 0.0f)) {
+    x_42 = float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f));
+    x_49_phi = float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f));
+  } else {
+    x_42 = float2x2(float2(0.5f, -0.5f), float2(-0.5f, 0.5f));
+    x_49_phi = float2x2(float2(0.5f, -0.5f), float2(-0.5f, 0.5f));
+  }
+  const S x_51 = {1, transpose(x_49_phi)};
+  const int x_52 = x_51.f1;
+  x_6 = x_52;
+  x_41 = x_51.f2;
+  const float2x2 x_56 = x_41;
+  const float2x2 x_59 = x_41;
+  const float2x2 x_63 = x_41;
+  x_GLF_color = float4(float(x_52), (x_56[0u].x + x_59[1u].x), (x_63[0u].y + x_41[1u].y), float(x_52));
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/int-mat2-struct/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/int-mat2-struct/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..256e64b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/int-mat2-struct/0-opt.wgsl.expected.msl
@@ -0,0 +1,50 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  int f1;
+  float2x2 f2;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float2x2 x_41 = float2x2(0.0f);
+  int x_6 = 0;
+  float2x2 x_42 = float2x2(0.0f);
+  float2x2 x_49_phi = float2x2(0.0f);
+  float const x_44 = (*(tint_symbol_5)).x;
+  if ((x_44 < 0.0f)) {
+    x_42 = float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f));
+    x_49_phi = float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f));
+  } else {
+    x_42 = float2x2(float2(0.5f, -0.5f), float2(-0.5f, 0.5f));
+    x_49_phi = float2x2(float2(0.5f, -0.5f), float2(-0.5f, 0.5f));
+  }
+  float2x2 const x_49 = x_49_phi;
+  S const x_51 = {.f1=1, .f2=transpose(x_49)};
+  int const x_52 = x_51.f1;
+  x_6 = x_52;
+  x_41 = x_51.f2;
+  float2x2 const x_56 = x_41;
+  float2x2 const x_59 = x_41;
+  float2x2 const x_63 = x_41;
+  float2x2 const x_66 = x_41;
+  *(tint_symbol_6) = float4(float(x_52), (x_56[0u].x + x_59[1u].x), (x_63[0u].y + x_66[1u].y), float(x_52));
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(&(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/int-mat2-struct/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/int-mat2-struct/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..5706393
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/int-mat2-struct/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,138 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 87
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %x_41 "x_41"
+               OpName %x_6 "x_6"
+               OpName %x_42 "x_42"
+               OpName %x_49_phi "x_49_phi"
+               OpName %S "S"
+               OpMemberName %S 0 "f1"
+               OpMemberName %S 1 "f2"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %S 0 Offset 0
+               OpMemberDecorate %S 1 Offset 8
+               OpMemberDecorate %S 1 ColMajor
+               OpMemberDecorate %S 1 MatrixStride 8
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%mat2v2float = OpTypeMatrix %v2float 2
+%_ptr_Function_mat2v2float = OpTypePointer Function %mat2v2float
+         %19 = OpConstantNull %mat2v2float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+         %39 = OpConstantComposite %v2float %float_1 %float_2
+    %float_3 = OpConstant %float 3
+    %float_4 = OpConstant %float 4
+         %42 = OpConstantComposite %v2float %float_3 %float_4
+         %43 = OpConstantComposite %mat2v2float %39 %42
+  %float_0_5 = OpConstant %float 0.5
+ %float_n0_5 = OpConstant %float -0.5
+         %46 = OpConstantComposite %v2float %float_0_5 %float_n0_5
+         %47 = OpConstantComposite %v2float %float_n0_5 %float_0_5
+         %48 = OpConstantComposite %mat2v2float %46 %47
+          %S = OpTypeStruct %int %mat2v2float
+      %int_1 = OpConstant %int 1
+     %uint_1 = OpConstant %uint 1
+   %main_out = OpTypeStruct %v4float
+         %74 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+       %x_41 = OpVariable %_ptr_Function_mat2v2float Function %19
+        %x_6 = OpVariable %_ptr_Function_int Function %23
+       %x_42 = OpVariable %_ptr_Function_mat2v2float Function %19
+   %x_49_phi = OpVariable %_ptr_Function_mat2v2float Function %19
+         %29 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %30 = OpLoad %float %29
+         %32 = OpFOrdLessThan %bool %30 %float_0
+               OpSelectionMerge %34 None
+               OpBranchConditional %32 %35 %36
+         %35 = OpLabel
+               OpStore %x_42 %43
+               OpStore %x_49_phi %43
+               OpBranch %34
+         %36 = OpLabel
+               OpStore %x_42 %48
+               OpStore %x_49_phi %48
+               OpBranch %34
+         %34 = OpLabel
+         %49 = OpLoad %mat2v2float %x_49_phi
+         %52 = OpTranspose %mat2v2float %49
+         %53 = OpCompositeConstruct %S %int_1 %52
+         %54 = OpCompositeExtract %int %53 0
+               OpStore %x_6 %54
+         %55 = OpCompositeExtract %mat2v2float %53 1
+               OpStore %x_41 %55
+         %56 = OpLoad %mat2v2float %x_41
+         %57 = OpLoad %mat2v2float %x_41
+         %58 = OpLoad %mat2v2float %x_41
+         %59 = OpLoad %mat2v2float %x_41
+         %60 = OpConvertSToF %float %54
+         %61 = OpCompositeExtract %v2float %56 0
+         %62 = OpCompositeExtract %float %61 0
+         %64 = OpCompositeExtract %v2float %57 1
+         %65 = OpCompositeExtract %float %64 0
+         %66 = OpFAdd %float %62 %65
+         %67 = OpCompositeExtract %v2float %58 0
+         %68 = OpCompositeExtract %float %67 1
+         %69 = OpCompositeExtract %v2float %59 1
+         %70 = OpCompositeExtract %float %69 1
+         %71 = OpFAdd %float %68 %70
+         %72 = OpConvertSToF %float %54
+         %73 = OpCompositeConstruct %v4float %60 %66 %71 %72
+               OpStore %x_GLF_color %73
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %74
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %78 = OpLabel
+         %79 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %79
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %81 = OpLabel
+         %82 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %82
+         %83 = OpFunctionCall %void %main_1
+         %85 = OpLoad %v4float %x_GLF_color
+         %86 = OpCompositeConstruct %main_out %85
+         %84 = OpFunctionCall %void %tint_symbol_3 %86
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/int-mat2-struct/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/int-mat2-struct/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..4df9f94
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/int-mat2-struct/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,50 @@
+struct S {
+  f1 : i32;
+  f2 : mat2x2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_41 : mat2x2<f32>;
+  var x_6 : i32;
+  var x_42 : mat2x2<f32>;
+  var x_49_phi : mat2x2<f32>;
+  let x_44 : f32 = gl_FragCoord.x;
+  if ((x_44 < 0.0)) {
+    x_42 = mat2x2<f32>(vec2<f32>(1.0, 2.0), vec2<f32>(3.0, 4.0));
+    x_49_phi = mat2x2<f32>(vec2<f32>(1.0, 2.0), vec2<f32>(3.0, 4.0));
+  } else {
+    x_42 = mat2x2<f32>(vec2<f32>(0.5, -0.5), vec2<f32>(-0.5, 0.5));
+    x_49_phi = mat2x2<f32>(vec2<f32>(0.5, -0.5), vec2<f32>(-0.5, 0.5));
+  }
+  let x_49 : mat2x2<f32> = x_49_phi;
+  let x_51 : S = S(1, transpose(x_49));
+  let x_52 : i32 = x_51.f1;
+  x_6 = x_52;
+  x_41 = x_51.f2;
+  let x_55 : ptr<function, f32> = &(x_41[0].x);
+  let x_56 : mat2x2<f32> = x_41;
+  let x_58 : ptr<function, f32> = &(x_41[1].x);
+  let x_59 : mat2x2<f32> = x_41;
+  let x_62 : ptr<function, f32> = &(x_41[0].y);
+  let x_63 : mat2x2<f32> = x_41;
+  let x_65 : ptr<function, f32> = &(x_41[1].y);
+  let x_66 : mat2x2<f32> = x_41;
+  x_GLF_color = vec4<f32>(f32(x_52), (x_56[0u].x + x_59[1u].x), (x_63[0u].y + x_66[1u].y), f32(x_52));
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/loop-dead-if-loop/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/loop-dead-if-loop/0-opt.spvasm
new file mode 100644
index 0000000..d758ac5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/loop-dead-if-loop/0-opt.spvasm
@@ -0,0 +1,168 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %k "k"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %GLF_dead0j "GLF_dead0j"
+               OpName %donor_replacementGLF_dead0stack "donor_replacementGLF_dead0stack"
+               OpName %donor_replacementGLF_dead0top "donor_replacementGLF_dead0top"
+               OpName %matrix_b "matrix_b"
+               OpName %b "b"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %k RelaxedPrecision
+               OpDecorate %12 RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %GLF_dead0j RelaxedPrecision
+               OpDecorate %donor_replacementGLF_dead0stack RelaxedPrecision
+               OpDecorate %13 RelaxedPrecision
+               OpDecorate %donor_replacementGLF_dead0top RelaxedPrecision
+               OpDecorate %14 RelaxedPrecision
+               OpDecorate %15 RelaxedPrecision
+               OpDecorate %16 RelaxedPrecision
+               OpDecorate %17 RelaxedPrecision
+               OpDecorate %18 RelaxedPrecision
+               OpDecorate %b RelaxedPrecision
+               OpDecorate %19 RelaxedPrecision
+               OpDecorate %20 RelaxedPrecision
+               OpDecorate %21 RelaxedPrecision
+               OpDecorate %22 RelaxedPrecision
+               OpDecorate %23 RelaxedPrecision
+               OpDecorate %24 RelaxedPrecision
+               OpDecorate %25 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+    %float_0 = OpConstant %float 0
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+      %int_9 = OpConstant %int 9
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+         %47 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+      %int_3 = OpConstant %int 3
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_1 = OpConstant %float 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %52 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %27
+         %53 = OpLabel
+          %k = OpVariable %_ptr_Function_int Function
+ %GLF_dead0j = OpVariable %_ptr_Function_int Function
+%donor_replacementGLF_dead0stack = OpVariable %_ptr_Function__arr_int_uint_10 Function
+%donor_replacementGLF_dead0top = OpVariable %_ptr_Function_int Function
+         %54 = OpVariable %_ptr_Function_int Function
+   %matrix_b = OpVariable %_ptr_Function_v4float Function
+          %b = OpVariable %_ptr_Function_int Function
+               OpStore %k %int_0
+               OpBranch %55
+         %55 = OpLabel
+               OpLoopMerge %56 %57 None
+               OpBranch %58
+         %58 = OpLabel
+         %12 = OpLoad %int %k
+         %59 = OpSLessThan %bool %12 %int_4
+               OpBranchConditional %59 %60 %56
+         %60 = OpLabel
+         %61 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %62 = OpLoad %float %61
+         %63 = OpFOrdGreaterThan %bool %float_0 %62
+               OpSelectionMerge %64 None
+               OpBranchConditional %63 %65 %64
+         %65 = OpLabel
+               OpStore %GLF_dead0j %int_1
+               OpBranch %66
+         %66 = OpLabel
+               OpLoopMerge %67 %68 None
+               OpBranch %69
+         %69 = OpLabel
+         %70 = OpAccessChain %_ptr_Function_int %donor_replacementGLF_dead0stack %int_0
+         %13 = OpLoad %int %70
+         %71 = OpSLessThanEqual %bool %int_1 %13
+               OpBranchConditional %71 %72 %67
+         %72 = OpLabel
+               OpBranch %68
+         %68 = OpLabel
+               OpBranch %66
+         %67 = OpLabel
+         %14 = OpLoad %int %donor_replacementGLF_dead0top
+         %73 = OpSGreaterThanEqual %bool %14 %int_0
+         %15 = OpLoad %int %donor_replacementGLF_dead0top
+         %74 = OpSLessThan %bool %15 %int_9
+         %75 = OpLogicalAnd %bool %73 %74
+               OpSelectionMerge %76 None
+               OpBranchConditional %75 %77 %78
+         %77 = OpLabel
+         %16 = OpLoad %int %donor_replacementGLF_dead0top
+         %17 = OpIAdd %int %16 %int_1
+               OpStore %donor_replacementGLF_dead0top %17
+               OpStore %54 %17
+               OpBranch %76
+         %78 = OpLabel
+               OpStore %54 %int_0
+               OpBranch %76
+         %76 = OpLabel
+         %18 = OpLoad %int %54
+         %79 = OpAccessChain %_ptr_Function_int %donor_replacementGLF_dead0stack %18
+               OpStore %79 %int_1
+               OpBranch %64
+         %64 = OpLabel
+               OpStore %matrix_b %47
+               OpStore %b %int_3
+               OpBranch %80
+         %80 = OpLabel
+               OpLoopMerge %81 %82 None
+               OpBranch %83
+         %83 = OpLabel
+         %19 = OpLoad %int %b
+         %84 = OpSGreaterThanEqual %bool %19 %int_0
+               OpBranchConditional %84 %85 %81
+         %85 = OpLabel
+         %20 = OpLoad %int %b
+         %21 = OpLoad %int %b
+         %86 = OpAccessChain %_ptr_Function_float %matrix_b %21
+         %87 = OpLoad %float %86
+         %88 = OpFSub %float %87 %float_1
+         %89 = OpAccessChain %_ptr_Function_float %matrix_b %20
+               OpStore %89 %88
+               OpBranch %82
+         %82 = OpLabel
+         %22 = OpLoad %int %b
+         %23 = OpISub %int %22 %int_1
+               OpStore %b %23
+               OpBranch %80
+         %81 = OpLabel
+               OpBranch %57
+         %57 = OpLabel
+         %24 = OpLoad %int %k
+         %25 = OpIAdd %int %24 %int_1
+               OpStore %k %25
+               OpBranch %55
+         %56 = OpLabel
+               OpStore %_GLF_color %52
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/loop-dead-if-loop/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/loop-dead-if-loop/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..f1268b0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/loop-dead-if-loop/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,71 @@
+void set_float4(inout float4 vec, int idx, float val) {
+  vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
+}
+
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int k = 0;
+  int GLF_dead0j = 0;
+  int donor_replacementGLF_dead0stack[10] = (int[10])0;
+  int donor_replacementGLF_dead0top = 0;
+  int x_54 = 0;
+  float4 matrix_b = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int b = 0;
+  k = 0;
+  {
+    for(; (k < 4); k = (k + 1)) {
+      const float x_62 = asfloat(x_6[0].y);
+      if ((0.0f > x_62)) {
+        GLF_dead0j = 1;
+        while (true) {
+          const int x_13 = donor_replacementGLF_dead0stack[0];
+          if ((1 <= x_13)) {
+          } else {
+            break;
+          }
+        }
+        bool tint_tmp = (donor_replacementGLF_dead0top >= 0);
+        if (tint_tmp) {
+          tint_tmp = (donor_replacementGLF_dead0top < 9);
+        }
+        if ((tint_tmp)) {
+          const int x_17 = (donor_replacementGLF_dead0top + 1);
+          donor_replacementGLF_dead0top = x_17;
+          x_54 = x_17;
+        } else {
+          x_54 = 0;
+        }
+        donor_replacementGLF_dead0stack[x_54] = 1;
+      }
+      matrix_b = float4(0.0f, 0.0f, 0.0f, 0.0f);
+      b = 3;
+      {
+        for(; (b >= 0); b = (b - 1)) {
+          const int x_20 = b;
+          const float x_87 = matrix_b[b];
+          set_float4(matrix_b, x_20, (x_87 - 1.0f));
+        }
+      }
+    }
+  }
+  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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/loop-dead-if-loop/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/loop-dead-if-loop/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..837b916
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/loop-dead-if-loop/0-opt.spvasm.expected.msl
@@ -0,0 +1,88 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int k = 0;
+  int GLF_dead0j = 0;
+  tint_array_wrapper donor_replacementGLF_dead0stack = {};
+  int donor_replacementGLF_dead0top = 0;
+  int x_54 = 0;
+  float4 matrix_b = 0.0f;
+  int b = 0;
+  k = 0;
+  while (true) {
+    int const x_12 = k;
+    if ((x_12 < 4)) {
+    } else {
+      break;
+    }
+    float const x_62 = x_6.injectionSwitch.y;
+    if ((0.0f > x_62)) {
+      GLF_dead0j = 1;
+      while (true) {
+        int const x_13 = donor_replacementGLF_dead0stack.arr[0];
+        if ((1 <= x_13)) {
+        } else {
+          break;
+        }
+      }
+      int const x_14 = donor_replacementGLF_dead0top;
+      int const x_15 = donor_replacementGLF_dead0top;
+      if (((x_14 >= 0) && (x_15 < 9))) {
+        int const x_16 = donor_replacementGLF_dead0top;
+        int const x_17 = (x_16 + 1);
+        donor_replacementGLF_dead0top = x_17;
+        x_54 = x_17;
+      } else {
+        x_54 = 0;
+      }
+      int const x_18 = x_54;
+      donor_replacementGLF_dead0stack.arr[x_18] = 1;
+    }
+    matrix_b = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    b = 3;
+    while (true) {
+      int const x_19 = b;
+      if ((x_19 >= 0)) {
+      } else {
+        break;
+      }
+      int const x_20 = b;
+      int const x_21 = b;
+      float const x_87 = matrix_b[x_21];
+      matrix_b[x_20] = (x_87 - 1.0f);
+      {
+        int const x_22 = b;
+        b = (x_22 - 1);
+      }
+    }
+    {
+      int const x_24 = k;
+      k = (x_24 + 1);
+    }
+  }
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/loop-dead-if-loop/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/loop-dead-if-loop/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..de2d980
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/loop-dead-if-loop/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,205 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 115
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %k "k"
+               OpName %GLF_dead0j "GLF_dead0j"
+               OpName %donor_replacementGLF_dead0stack "donor_replacementGLF_dead0stack"
+               OpName %donor_replacementGLF_dead0top "donor_replacementGLF_dead0top"
+               OpName %x_54 "x_54"
+               OpName %matrix_b "matrix_b"
+               OpName %b "b"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %19 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+         %26 = OpConstantNull %_arr_int_uint_10
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+       %bool = OpTypeBool
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_0 = OpConstant %float 0
+      %int_1 = OpConstant %int 1
+      %int_9 = OpConstant %int 9
+         %79 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+      %int_3 = OpConstant %int 3
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_1 = OpConstant %float 1
+        %102 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %103 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %k = OpVariable %_ptr_Function_int Function %19
+ %GLF_dead0j = OpVariable %_ptr_Function_int Function %19
+%donor_replacementGLF_dead0stack = OpVariable %_ptr_Function__arr_int_uint_10 Function %26
+%donor_replacementGLF_dead0top = OpVariable %_ptr_Function_int Function %19
+       %x_54 = OpVariable %_ptr_Function_int Function %19
+   %matrix_b = OpVariable %_ptr_Function_v4float Function %9
+          %b = OpVariable %_ptr_Function_int Function %19
+               OpStore %k %int_0
+               OpBranch %33
+         %33 = OpLabel
+               OpLoopMerge %34 %35 None
+               OpBranch %36
+         %36 = OpLabel
+         %37 = OpLoad %int %k
+         %39 = OpSLessThan %bool %37 %int_4
+               OpSelectionMerge %41 None
+               OpBranchConditional %39 %42 %43
+         %42 = OpLabel
+               OpBranch %41
+         %43 = OpLabel
+               OpBranch %34
+         %41 = OpLabel
+         %47 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %48 = OpLoad %float %47
+         %50 = OpFOrdGreaterThan %bool %float_0 %48
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %51
+         %52 = OpLabel
+               OpStore %GLF_dead0j %int_1
+               OpBranch %54
+         %54 = OpLabel
+               OpLoopMerge %55 %56 None
+               OpBranch %57
+         %57 = OpLabel
+         %58 = OpAccessChain %_ptr_Function_int %donor_replacementGLF_dead0stack %int_0
+         %59 = OpLoad %int %58
+         %60 = OpSLessThanEqual %bool %int_1 %59
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %63
+         %62 = OpLabel
+               OpBranch %61
+         %63 = OpLabel
+               OpBranch %55
+         %61 = OpLabel
+               OpBranch %56
+         %56 = OpLabel
+               OpBranch %54
+         %55 = OpLabel
+         %64 = OpLoad %int %donor_replacementGLF_dead0top
+         %65 = OpLoad %int %donor_replacementGLF_dead0top
+         %66 = OpSGreaterThanEqual %bool %64 %int_0
+               OpSelectionMerge %67 None
+               OpBranchConditional %66 %68 %67
+         %68 = OpLabel
+         %70 = OpSLessThan %bool %65 %int_9
+               OpBranch %67
+         %67 = OpLabel
+         %71 = OpPhi %bool %66 %55 %70 %68
+               OpSelectionMerge %72 None
+               OpBranchConditional %71 %73 %74
+         %73 = OpLabel
+         %75 = OpLoad %int %donor_replacementGLF_dead0top
+         %76 = OpIAdd %int %75 %int_1
+               OpStore %donor_replacementGLF_dead0top %76
+               OpStore %x_54 %76
+               OpBranch %72
+         %74 = OpLabel
+               OpStore %x_54 %int_0
+               OpBranch %72
+         %72 = OpLabel
+         %77 = OpLoad %int %x_54
+         %78 = OpAccessChain %_ptr_Function_int %donor_replacementGLF_dead0stack %77
+               OpStore %78 %int_1
+               OpBranch %51
+         %51 = OpLabel
+               OpStore %matrix_b %79
+               OpStore %b %int_3
+               OpBranch %81
+         %81 = OpLabel
+               OpLoopMerge %82 %83 None
+               OpBranch %84
+         %84 = OpLabel
+         %85 = OpLoad %int %b
+         %86 = OpSGreaterThanEqual %bool %85 %int_0
+               OpSelectionMerge %87 None
+               OpBranchConditional %86 %88 %89
+         %88 = OpLabel
+               OpBranch %87
+         %89 = OpLabel
+               OpBranch %82
+         %87 = OpLabel
+         %90 = OpLoad %int %b
+         %91 = OpLoad %int %b
+         %93 = OpAccessChain %_ptr_Function_float %matrix_b %91
+         %94 = OpLoad %float %93
+         %95 = OpAccessChain %_ptr_Function_float %matrix_b %90
+         %97 = OpFSub %float %94 %float_1
+               OpStore %95 %97
+               OpBranch %83
+         %83 = OpLabel
+         %98 = OpLoad %int %b
+         %99 = OpISub %int %98 %int_1
+               OpStore %b %99
+               OpBranch %81
+         %82 = OpLabel
+               OpBranch %35
+         %35 = OpLabel
+        %100 = OpLoad %int %k
+        %101 = OpIAdd %int %100 %int_1
+               OpStore %k %101
+               OpBranch %33
+         %34 = OpLabel
+               OpStore %x_GLF_color %102
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %103
+%tint_symbol = OpFunctionParameter %main_out
+        %107 = OpLabel
+        %108 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %108
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+        %110 = OpLabel
+        %111 = OpFunctionCall %void %main_1
+        %113 = OpLoad %v4float %x_GLF_color
+        %114 = OpCompositeConstruct %main_out %113
+        %112 = OpFunctionCall %void %tint_symbol_2 %114
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/loop-dead-if-loop/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/loop-dead-if-loop/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..26a8a10
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/loop-dead-if-loop/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,85 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var k : i32;
+  var GLF_dead0j : i32;
+  var donor_replacementGLF_dead0stack : array<i32, 10>;
+  var donor_replacementGLF_dead0top : i32;
+  var x_54 : i32;
+  var matrix_b : vec4<f32>;
+  var b : i32;
+  k = 0;
+  loop {
+    let x_12 : i32 = k;
+    if ((x_12 < 4)) {
+    } else {
+      break;
+    }
+    let x_62 : f32 = x_6.injectionSwitch.y;
+    if ((0.0 > x_62)) {
+      GLF_dead0j = 1;
+      loop {
+        let x_13 : i32 = donor_replacementGLF_dead0stack[0];
+        if ((1 <= x_13)) {
+        } else {
+          break;
+        }
+      }
+      let x_14 : i32 = donor_replacementGLF_dead0top;
+      let x_15 : i32 = donor_replacementGLF_dead0top;
+      if (((x_14 >= 0) && (x_15 < 9))) {
+        let x_16 : i32 = donor_replacementGLF_dead0top;
+        let x_17 : i32 = (x_16 + 1);
+        donor_replacementGLF_dead0top = x_17;
+        x_54 = x_17;
+      } else {
+        x_54 = 0;
+      }
+      let x_18 : i32 = x_54;
+      donor_replacementGLF_dead0stack[x_18] = 1;
+    }
+    matrix_b = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+    b = 3;
+    loop {
+      let x_19 : i32 = b;
+      if ((x_19 >= 0)) {
+      } else {
+        break;
+      }
+      let x_20 : i32 = b;
+      let x_21 : i32 = b;
+      let x_87 : f32 = matrix_b[x_21];
+      matrix_b[x_20] = (x_87 - 1.0);
+
+      continuing {
+        let x_22 : i32 = b;
+        b = (x_22 - 1);
+      }
+    }
+
+    continuing {
+      let x_24 : i32 = k;
+      k = (x_24 + 1);
+    }
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/loop-dead-if-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/loop-dead-if-loop/0-opt.wgsl
new file mode 100644
index 0000000..26a8a10
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/loop-dead-if-loop/0-opt.wgsl
@@ -0,0 +1,85 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var k : i32;
+  var GLF_dead0j : i32;
+  var donor_replacementGLF_dead0stack : array<i32, 10>;
+  var donor_replacementGLF_dead0top : i32;
+  var x_54 : i32;
+  var matrix_b : vec4<f32>;
+  var b : i32;
+  k = 0;
+  loop {
+    let x_12 : i32 = k;
+    if ((x_12 < 4)) {
+    } else {
+      break;
+    }
+    let x_62 : f32 = x_6.injectionSwitch.y;
+    if ((0.0 > x_62)) {
+      GLF_dead0j = 1;
+      loop {
+        let x_13 : i32 = donor_replacementGLF_dead0stack[0];
+        if ((1 <= x_13)) {
+        } else {
+          break;
+        }
+      }
+      let x_14 : i32 = donor_replacementGLF_dead0top;
+      let x_15 : i32 = donor_replacementGLF_dead0top;
+      if (((x_14 >= 0) && (x_15 < 9))) {
+        let x_16 : i32 = donor_replacementGLF_dead0top;
+        let x_17 : i32 = (x_16 + 1);
+        donor_replacementGLF_dead0top = x_17;
+        x_54 = x_17;
+      } else {
+        x_54 = 0;
+      }
+      let x_18 : i32 = x_54;
+      donor_replacementGLF_dead0stack[x_18] = 1;
+    }
+    matrix_b = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+    b = 3;
+    loop {
+      let x_19 : i32 = b;
+      if ((x_19 >= 0)) {
+      } else {
+        break;
+      }
+      let x_20 : i32 = b;
+      let x_21 : i32 = b;
+      let x_87 : f32 = matrix_b[x_21];
+      matrix_b[x_20] = (x_87 - 1.0);
+
+      continuing {
+        let x_22 : i32 = b;
+        b = (x_22 - 1);
+      }
+    }
+
+    continuing {
+      let x_24 : i32 = k;
+      k = (x_24 + 1);
+    }
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/loop-dead-if-loop/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/loop-dead-if-loop/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..f1268b0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/loop-dead-if-loop/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,71 @@
+void set_float4(inout float4 vec, int idx, float val) {
+  vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
+}
+
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int k = 0;
+  int GLF_dead0j = 0;
+  int donor_replacementGLF_dead0stack[10] = (int[10])0;
+  int donor_replacementGLF_dead0top = 0;
+  int x_54 = 0;
+  float4 matrix_b = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int b = 0;
+  k = 0;
+  {
+    for(; (k < 4); k = (k + 1)) {
+      const float x_62 = asfloat(x_6[0].y);
+      if ((0.0f > x_62)) {
+        GLF_dead0j = 1;
+        while (true) {
+          const int x_13 = donor_replacementGLF_dead0stack[0];
+          if ((1 <= x_13)) {
+          } else {
+            break;
+          }
+        }
+        bool tint_tmp = (donor_replacementGLF_dead0top >= 0);
+        if (tint_tmp) {
+          tint_tmp = (donor_replacementGLF_dead0top < 9);
+        }
+        if ((tint_tmp)) {
+          const int x_17 = (donor_replacementGLF_dead0top + 1);
+          donor_replacementGLF_dead0top = x_17;
+          x_54 = x_17;
+        } else {
+          x_54 = 0;
+        }
+        donor_replacementGLF_dead0stack[x_54] = 1;
+      }
+      matrix_b = float4(0.0f, 0.0f, 0.0f, 0.0f);
+      b = 3;
+      {
+        for(; (b >= 0); b = (b - 1)) {
+          const int x_20 = b;
+          const float x_87 = matrix_b[b];
+          set_float4(matrix_b, x_20, (x_87 - 1.0f));
+        }
+      }
+    }
+  }
+  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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/loop-dead-if-loop/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/loop-dead-if-loop/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..837b916
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/loop-dead-if-loop/0-opt.wgsl.expected.msl
@@ -0,0 +1,88 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int k = 0;
+  int GLF_dead0j = 0;
+  tint_array_wrapper donor_replacementGLF_dead0stack = {};
+  int donor_replacementGLF_dead0top = 0;
+  int x_54 = 0;
+  float4 matrix_b = 0.0f;
+  int b = 0;
+  k = 0;
+  while (true) {
+    int const x_12 = k;
+    if ((x_12 < 4)) {
+    } else {
+      break;
+    }
+    float const x_62 = x_6.injectionSwitch.y;
+    if ((0.0f > x_62)) {
+      GLF_dead0j = 1;
+      while (true) {
+        int const x_13 = donor_replacementGLF_dead0stack.arr[0];
+        if ((1 <= x_13)) {
+        } else {
+          break;
+        }
+      }
+      int const x_14 = donor_replacementGLF_dead0top;
+      int const x_15 = donor_replacementGLF_dead0top;
+      if (((x_14 >= 0) && (x_15 < 9))) {
+        int const x_16 = donor_replacementGLF_dead0top;
+        int const x_17 = (x_16 + 1);
+        donor_replacementGLF_dead0top = x_17;
+        x_54 = x_17;
+      } else {
+        x_54 = 0;
+      }
+      int const x_18 = x_54;
+      donor_replacementGLF_dead0stack.arr[x_18] = 1;
+    }
+    matrix_b = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    b = 3;
+    while (true) {
+      int const x_19 = b;
+      if ((x_19 >= 0)) {
+      } else {
+        break;
+      }
+      int const x_20 = b;
+      int const x_21 = b;
+      float const x_87 = matrix_b[x_21];
+      matrix_b[x_20] = (x_87 - 1.0f);
+      {
+        int const x_22 = b;
+        b = (x_22 - 1);
+      }
+    }
+    {
+      int const x_24 = k;
+      k = (x_24 + 1);
+    }
+  }
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/loop-dead-if-loop/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/loop-dead-if-loop/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..de2d980
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/loop-dead-if-loop/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,205 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 115
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %k "k"
+               OpName %GLF_dead0j "GLF_dead0j"
+               OpName %donor_replacementGLF_dead0stack "donor_replacementGLF_dead0stack"
+               OpName %donor_replacementGLF_dead0top "donor_replacementGLF_dead0top"
+               OpName %x_54 "x_54"
+               OpName %matrix_b "matrix_b"
+               OpName %b "b"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %19 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+         %26 = OpConstantNull %_arr_int_uint_10
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+       %bool = OpTypeBool
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_0 = OpConstant %float 0
+      %int_1 = OpConstant %int 1
+      %int_9 = OpConstant %int 9
+         %79 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+      %int_3 = OpConstant %int 3
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_1 = OpConstant %float 1
+        %102 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %103 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %k = OpVariable %_ptr_Function_int Function %19
+ %GLF_dead0j = OpVariable %_ptr_Function_int Function %19
+%donor_replacementGLF_dead0stack = OpVariable %_ptr_Function__arr_int_uint_10 Function %26
+%donor_replacementGLF_dead0top = OpVariable %_ptr_Function_int Function %19
+       %x_54 = OpVariable %_ptr_Function_int Function %19
+   %matrix_b = OpVariable %_ptr_Function_v4float Function %9
+          %b = OpVariable %_ptr_Function_int Function %19
+               OpStore %k %int_0
+               OpBranch %33
+         %33 = OpLabel
+               OpLoopMerge %34 %35 None
+               OpBranch %36
+         %36 = OpLabel
+         %37 = OpLoad %int %k
+         %39 = OpSLessThan %bool %37 %int_4
+               OpSelectionMerge %41 None
+               OpBranchConditional %39 %42 %43
+         %42 = OpLabel
+               OpBranch %41
+         %43 = OpLabel
+               OpBranch %34
+         %41 = OpLabel
+         %47 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %48 = OpLoad %float %47
+         %50 = OpFOrdGreaterThan %bool %float_0 %48
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %51
+         %52 = OpLabel
+               OpStore %GLF_dead0j %int_1
+               OpBranch %54
+         %54 = OpLabel
+               OpLoopMerge %55 %56 None
+               OpBranch %57
+         %57 = OpLabel
+         %58 = OpAccessChain %_ptr_Function_int %donor_replacementGLF_dead0stack %int_0
+         %59 = OpLoad %int %58
+         %60 = OpSLessThanEqual %bool %int_1 %59
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %63
+         %62 = OpLabel
+               OpBranch %61
+         %63 = OpLabel
+               OpBranch %55
+         %61 = OpLabel
+               OpBranch %56
+         %56 = OpLabel
+               OpBranch %54
+         %55 = OpLabel
+         %64 = OpLoad %int %donor_replacementGLF_dead0top
+         %65 = OpLoad %int %donor_replacementGLF_dead0top
+         %66 = OpSGreaterThanEqual %bool %64 %int_0
+               OpSelectionMerge %67 None
+               OpBranchConditional %66 %68 %67
+         %68 = OpLabel
+         %70 = OpSLessThan %bool %65 %int_9
+               OpBranch %67
+         %67 = OpLabel
+         %71 = OpPhi %bool %66 %55 %70 %68
+               OpSelectionMerge %72 None
+               OpBranchConditional %71 %73 %74
+         %73 = OpLabel
+         %75 = OpLoad %int %donor_replacementGLF_dead0top
+         %76 = OpIAdd %int %75 %int_1
+               OpStore %donor_replacementGLF_dead0top %76
+               OpStore %x_54 %76
+               OpBranch %72
+         %74 = OpLabel
+               OpStore %x_54 %int_0
+               OpBranch %72
+         %72 = OpLabel
+         %77 = OpLoad %int %x_54
+         %78 = OpAccessChain %_ptr_Function_int %donor_replacementGLF_dead0stack %77
+               OpStore %78 %int_1
+               OpBranch %51
+         %51 = OpLabel
+               OpStore %matrix_b %79
+               OpStore %b %int_3
+               OpBranch %81
+         %81 = OpLabel
+               OpLoopMerge %82 %83 None
+               OpBranch %84
+         %84 = OpLabel
+         %85 = OpLoad %int %b
+         %86 = OpSGreaterThanEqual %bool %85 %int_0
+               OpSelectionMerge %87 None
+               OpBranchConditional %86 %88 %89
+         %88 = OpLabel
+               OpBranch %87
+         %89 = OpLabel
+               OpBranch %82
+         %87 = OpLabel
+         %90 = OpLoad %int %b
+         %91 = OpLoad %int %b
+         %93 = OpAccessChain %_ptr_Function_float %matrix_b %91
+         %94 = OpLoad %float %93
+         %95 = OpAccessChain %_ptr_Function_float %matrix_b %90
+         %97 = OpFSub %float %94 %float_1
+               OpStore %95 %97
+               OpBranch %83
+         %83 = OpLabel
+         %98 = OpLoad %int %b
+         %99 = OpISub %int %98 %int_1
+               OpStore %b %99
+               OpBranch %81
+         %82 = OpLabel
+               OpBranch %35
+         %35 = OpLabel
+        %100 = OpLoad %int %k
+        %101 = OpIAdd %int %100 %int_1
+               OpStore %k %101
+               OpBranch %33
+         %34 = OpLabel
+               OpStore %x_GLF_color %102
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %103
+%tint_symbol = OpFunctionParameter %main_out
+        %107 = OpLabel
+        %108 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %108
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+        %110 = OpLabel
+        %111 = OpFunctionCall %void %main_1
+        %113 = OpLoad %v4float %x_GLF_color
+        %114 = OpCompositeConstruct %main_out %113
+        %112 = OpFunctionCall %void %tint_symbol_2 %114
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/loop-dead-if-loop/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/loop-dead-if-loop/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..26a8a10
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/loop-dead-if-loop/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,85 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var k : i32;
+  var GLF_dead0j : i32;
+  var donor_replacementGLF_dead0stack : array<i32, 10>;
+  var donor_replacementGLF_dead0top : i32;
+  var x_54 : i32;
+  var matrix_b : vec4<f32>;
+  var b : i32;
+  k = 0;
+  loop {
+    let x_12 : i32 = k;
+    if ((x_12 < 4)) {
+    } else {
+      break;
+    }
+    let x_62 : f32 = x_6.injectionSwitch.y;
+    if ((0.0 > x_62)) {
+      GLF_dead0j = 1;
+      loop {
+        let x_13 : i32 = donor_replacementGLF_dead0stack[0];
+        if ((1 <= x_13)) {
+        } else {
+          break;
+        }
+      }
+      let x_14 : i32 = donor_replacementGLF_dead0top;
+      let x_15 : i32 = donor_replacementGLF_dead0top;
+      if (((x_14 >= 0) && (x_15 < 9))) {
+        let x_16 : i32 = donor_replacementGLF_dead0top;
+        let x_17 : i32 = (x_16 + 1);
+        donor_replacementGLF_dead0top = x_17;
+        x_54 = x_17;
+      } else {
+        x_54 = 0;
+      }
+      let x_18 : i32 = x_54;
+      donor_replacementGLF_dead0stack[x_18] = 1;
+    }
+    matrix_b = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+    b = 3;
+    loop {
+      let x_19 : i32 = b;
+      if ((x_19 >= 0)) {
+      } else {
+        break;
+      }
+      let x_20 : i32 = b;
+      let x_21 : i32 = b;
+      let x_87 : f32 = matrix_b[x_21];
+      matrix_b[x_20] = (x_87 - 1.0);
+
+      continuing {
+        let x_22 : i32 = b;
+        b = (x_22 - 1);
+      }
+    }
+
+    continuing {
+      let x_24 : i32 = k;
+      k = (x_24 + 1);
+    }
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/loop-nested-ifs/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/loop-nested-ifs/0-opt.spvasm
new file mode 100644
index 0000000..90e4996
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/loop-nested-ifs/0-opt.spvasm
@@ -0,0 +1,101 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %j "j"
+               OpName %_GLF_color "_GLF_color"
+               OpName %a "a"
+               OpDecorate %j RelaxedPrecision
+               OpDecorate %6 RelaxedPrecision
+               OpDecorate %7 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %8 RelaxedPrecision
+               OpDecorate %9 RelaxedPrecision
+               OpDecorate %10 RelaxedPrecision
+               OpDecorate %11 RelaxedPrecision
+               OpDecorate %12 RelaxedPrecision
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %26 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Output_float = OpTypePointer Output %float
+%_ptr_Function_float = OpTypePointer Function %float
+       %main = OpFunction %void None %14
+         %34 = OpLabel
+          %j = OpVariable %_ptr_Function_int Function
+          %a = OpVariable %_ptr_Function_float Function
+               OpStore %j %int_0
+               OpBranch %35
+         %35 = OpLabel
+               OpLoopMerge %36 %37 None
+               OpBranch %38
+         %38 = OpLabel
+          %6 = OpLoad %int %j
+         %39 = OpSLessThan %bool %6 %int_2
+               OpBranchConditional %39 %40 %36
+         %40 = OpLabel
+          %7 = OpLoad %int %j
+         %41 = OpSLessThan %bool %7 %int_1
+               OpSelectionMerge %42 None
+               OpBranchConditional %41 %43 %42
+         %43 = OpLabel
+               OpStore %_GLF_color %26
+               OpBranch %42
+         %42 = OpLabel
+          %8 = OpLoad %int %j
+         %44 = OpINotEqual %bool %8 %int_3
+               OpSelectionMerge %45 None
+               OpBranchConditional %44 %46 %45
+         %46 = OpLabel
+          %9 = OpLoad %int %j
+         %47 = OpINotEqual %bool %9 %int_4
+               OpSelectionMerge %48 None
+               OpBranchConditional %47 %49 %48
+         %49 = OpLabel
+         %10 = OpLoad %int %j
+         %50 = OpIEqual %bool %10 %int_5
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %53
+         %52 = OpLabel
+         %54 = OpExtInst %float %1 Ldexp %float_1 %int_2
+         %55 = OpAccessChain %_ptr_Output_float %_GLF_color %uint_0
+               OpStore %55 %54
+               OpBranch %51
+         %53 = OpLabel
+         %56 = OpExtInst %float %1 Ldexp %float_1 %int_2
+               OpStore %a %56
+               OpStore %_GLF_color %26
+               OpBranch %51
+         %51 = OpLabel
+               OpBranch %48
+         %48 = OpLabel
+               OpBranch %45
+         %45 = OpLabel
+               OpBranch %37
+         %37 = OpLabel
+         %11 = OpLoad %int %j
+         %12 = OpIAdd %int %11 %int_1
+               OpStore %j %12
+               OpBranch %35
+         %36 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/loop-nested-ifs/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/loop-nested-ifs/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..9862ea7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/loop-nested-ifs/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,39 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int j = 0;
+  float a = 0.0f;
+  j = 0;
+  {
+    for(; (j < 2); j = (j + 1)) {
+      if ((j < 1)) {
+        x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+      }
+      if ((j != 3)) {
+        if ((j != 4)) {
+          if ((j == 5)) {
+            x_GLF_color.x = ldexp(1.0f, 2);
+          } else {
+            a = ldexp(1.0f, 2);
+            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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/loop-nested-ifs/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/loop-nested-ifs/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..447bbeb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/loop-nested-ifs/0-opt.spvasm.expected.msl
@@ -0,0 +1,53 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  int j = 0;
+  float a = 0.0f;
+  j = 0;
+  while (true) {
+    int const x_6 = j;
+    if ((x_6 < 2)) {
+    } else {
+      break;
+    }
+    int const x_7 = j;
+    if ((x_7 < 1)) {
+      *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    }
+    int const x_8 = j;
+    if ((x_8 != 3)) {
+      int const x_9 = j;
+      if ((x_9 != 4)) {
+        int const x_10 = j;
+        if ((x_10 == 5)) {
+          (*(tint_symbol_4)).x = ldexp(1.0f, 2);
+        } else {
+          a = ldexp(1.0f, 2);
+          *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+        }
+      }
+    }
+    {
+      int const x_11 = j;
+      j = (x_11 + 1);
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/loop-nested-ifs/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/loop-nested-ifs/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..2978632
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/loop-nested-ifs/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,131 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 76
+; Schema: 0
+               OpCapability Shader
+         %60 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %j "j"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %15 = OpConstantNull %int
+%_ptr_Function_float = OpTypePointer Function %float
+         %18 = OpConstantNull %float
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %38 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+   %main_out = OpTypeStruct %v4float
+         %64 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %j = OpVariable %_ptr_Function_int Function %15
+          %a = OpVariable %_ptr_Function_float Function %18
+               OpStore %j %int_0
+               OpBranch %20
+         %20 = OpLabel
+               OpLoopMerge %21 %22 None
+               OpBranch %23
+         %23 = OpLabel
+         %24 = OpLoad %int %j
+         %26 = OpSLessThan %bool %24 %int_2
+               OpSelectionMerge %28 None
+               OpBranchConditional %26 %29 %30
+         %29 = OpLabel
+               OpBranch %28
+         %30 = OpLabel
+               OpBranch %21
+         %28 = OpLabel
+         %31 = OpLoad %int %j
+         %33 = OpSLessThan %bool %31 %int_1
+               OpSelectionMerge %34 None
+               OpBranchConditional %33 %35 %34
+         %35 = OpLabel
+               OpStore %x_GLF_color %38
+               OpBranch %34
+         %34 = OpLabel
+         %39 = OpLoad %int %j
+         %41 = OpINotEqual %bool %39 %int_3
+               OpSelectionMerge %42 None
+               OpBranchConditional %41 %43 %42
+         %43 = OpLabel
+         %44 = OpLoad %int %j
+         %46 = OpINotEqual %bool %44 %int_4
+               OpSelectionMerge %47 None
+               OpBranchConditional %46 %48 %47
+         %48 = OpLabel
+         %49 = OpLoad %int %j
+         %51 = OpIEqual %bool %49 %int_5
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %54
+         %53 = OpLabel
+         %58 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_0
+         %59 = OpExtInst %float %60 Ldexp %float_1 %int_2
+               OpStore %58 %59
+               OpBranch %52
+         %54 = OpLabel
+         %61 = OpExtInst %float %60 Ldexp %float_1 %int_2
+               OpStore %a %61
+               OpStore %x_GLF_color %38
+               OpBranch %52
+         %52 = OpLabel
+               OpBranch %47
+         %47 = OpLabel
+               OpBranch %42
+         %42 = OpLabel
+               OpBranch %22
+         %22 = OpLabel
+         %62 = OpLoad %int %j
+         %63 = OpIAdd %int %62 %int_1
+               OpStore %j %63
+               OpBranch %20
+         %21 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %64
+%tint_symbol = OpFunctionParameter %main_out
+         %68 = OpLabel
+         %69 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %69
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %71 = OpLabel
+         %72 = OpFunctionCall %void %main_1
+         %74 = OpLoad %v4float %x_GLF_color
+         %75 = OpCompositeConstruct %main_out %74
+         %73 = OpFunctionCall %void %tint_symbol_2 %75
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/loop-nested-ifs/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/loop-nested-ifs/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..b8234b5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/loop-nested-ifs/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,48 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var j : i32;
+  var a : f32;
+  j = 0;
+  loop {
+    let x_6 : i32 = j;
+    if ((x_6 < 2)) {
+    } else {
+      break;
+    }
+    let x_7 : i32 = j;
+    if ((x_7 < 1)) {
+      x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    }
+    let x_8 : i32 = j;
+    if ((x_8 != 3)) {
+      let x_9 : i32 = j;
+      if ((x_9 != 4)) {
+        let x_10 : i32 = j;
+        if ((x_10 == 5)) {
+          x_GLF_color.x = ldexp(1.0, 2);
+        } else {
+          a = ldexp(1.0, 2);
+          x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+        }
+      }
+    }
+
+    continuing {
+      let x_11 : i32 = j;
+      j = (x_11 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/loop-nested-ifs/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/loop-nested-ifs/0-opt.wgsl
new file mode 100644
index 0000000..b8234b5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/loop-nested-ifs/0-opt.wgsl
@@ -0,0 +1,48 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var j : i32;
+  var a : f32;
+  j = 0;
+  loop {
+    let x_6 : i32 = j;
+    if ((x_6 < 2)) {
+    } else {
+      break;
+    }
+    let x_7 : i32 = j;
+    if ((x_7 < 1)) {
+      x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    }
+    let x_8 : i32 = j;
+    if ((x_8 != 3)) {
+      let x_9 : i32 = j;
+      if ((x_9 != 4)) {
+        let x_10 : i32 = j;
+        if ((x_10 == 5)) {
+          x_GLF_color.x = ldexp(1.0, 2);
+        } else {
+          a = ldexp(1.0, 2);
+          x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+        }
+      }
+    }
+
+    continuing {
+      let x_11 : i32 = j;
+      j = (x_11 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/loop-nested-ifs/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/loop-nested-ifs/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..9862ea7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/loop-nested-ifs/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,39 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int j = 0;
+  float a = 0.0f;
+  j = 0;
+  {
+    for(; (j < 2); j = (j + 1)) {
+      if ((j < 1)) {
+        x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+      }
+      if ((j != 3)) {
+        if ((j != 4)) {
+          if ((j == 5)) {
+            x_GLF_color.x = ldexp(1.0f, 2);
+          } else {
+            a = ldexp(1.0f, 2);
+            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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/loop-nested-ifs/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/loop-nested-ifs/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..447bbeb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/loop-nested-ifs/0-opt.wgsl.expected.msl
@@ -0,0 +1,53 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  int j = 0;
+  float a = 0.0f;
+  j = 0;
+  while (true) {
+    int const x_6 = j;
+    if ((x_6 < 2)) {
+    } else {
+      break;
+    }
+    int const x_7 = j;
+    if ((x_7 < 1)) {
+      *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    }
+    int const x_8 = j;
+    if ((x_8 != 3)) {
+      int const x_9 = j;
+      if ((x_9 != 4)) {
+        int const x_10 = j;
+        if ((x_10 == 5)) {
+          (*(tint_symbol_4)).x = ldexp(1.0f, 2);
+        } else {
+          a = ldexp(1.0f, 2);
+          *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+        }
+      }
+    }
+    {
+      int const x_11 = j;
+      j = (x_11 + 1);
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/loop-nested-ifs/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/loop-nested-ifs/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..2978632
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/loop-nested-ifs/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,131 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 76
+; Schema: 0
+               OpCapability Shader
+         %60 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %j "j"
+               OpName %a "a"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %15 = OpConstantNull %int
+%_ptr_Function_float = OpTypePointer Function %float
+         %18 = OpConstantNull %float
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %38 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+   %main_out = OpTypeStruct %v4float
+         %64 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %j = OpVariable %_ptr_Function_int Function %15
+          %a = OpVariable %_ptr_Function_float Function %18
+               OpStore %j %int_0
+               OpBranch %20
+         %20 = OpLabel
+               OpLoopMerge %21 %22 None
+               OpBranch %23
+         %23 = OpLabel
+         %24 = OpLoad %int %j
+         %26 = OpSLessThan %bool %24 %int_2
+               OpSelectionMerge %28 None
+               OpBranchConditional %26 %29 %30
+         %29 = OpLabel
+               OpBranch %28
+         %30 = OpLabel
+               OpBranch %21
+         %28 = OpLabel
+         %31 = OpLoad %int %j
+         %33 = OpSLessThan %bool %31 %int_1
+               OpSelectionMerge %34 None
+               OpBranchConditional %33 %35 %34
+         %35 = OpLabel
+               OpStore %x_GLF_color %38
+               OpBranch %34
+         %34 = OpLabel
+         %39 = OpLoad %int %j
+         %41 = OpINotEqual %bool %39 %int_3
+               OpSelectionMerge %42 None
+               OpBranchConditional %41 %43 %42
+         %43 = OpLabel
+         %44 = OpLoad %int %j
+         %46 = OpINotEqual %bool %44 %int_4
+               OpSelectionMerge %47 None
+               OpBranchConditional %46 %48 %47
+         %48 = OpLabel
+         %49 = OpLoad %int %j
+         %51 = OpIEqual %bool %49 %int_5
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %54
+         %53 = OpLabel
+         %58 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_0
+         %59 = OpExtInst %float %60 Ldexp %float_1 %int_2
+               OpStore %58 %59
+               OpBranch %52
+         %54 = OpLabel
+         %61 = OpExtInst %float %60 Ldexp %float_1 %int_2
+               OpStore %a %61
+               OpStore %x_GLF_color %38
+               OpBranch %52
+         %52 = OpLabel
+               OpBranch %47
+         %47 = OpLabel
+               OpBranch %42
+         %42 = OpLabel
+               OpBranch %22
+         %22 = OpLabel
+         %62 = OpLoad %int %j
+         %63 = OpIAdd %int %62 %int_1
+               OpStore %j %63
+               OpBranch %20
+         %21 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %64
+%tint_symbol = OpFunctionParameter %main_out
+         %68 = OpLabel
+         %69 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %69
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %71 = OpLabel
+         %72 = OpFunctionCall %void %main_1
+         %74 = OpLoad %v4float %x_GLF_color
+         %75 = OpCompositeConstruct %main_out %74
+         %73 = OpFunctionCall %void %tint_symbol_2 %75
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/loop-nested-ifs/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/loop-nested-ifs/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..b8234b5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/loop-nested-ifs/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,48 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var j : i32;
+  var a : f32;
+  j = 0;
+  loop {
+    let x_6 : i32 = j;
+    if ((x_6 < 2)) {
+    } else {
+      break;
+    }
+    let x_7 : i32 = j;
+    if ((x_7 < 1)) {
+      x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    }
+    let x_8 : i32 = j;
+    if ((x_8 != 3)) {
+      let x_9 : i32 = j;
+      if ((x_9 != 4)) {
+        let x_10 : i32 = j;
+        if ((x_10 == 5)) {
+          x_GLF_color.x = ldexp(1.0, 2);
+        } else {
+          a = ldexp(1.0, 2);
+          x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+        }
+      }
+    }
+
+    continuing {
+      let x_11 : i32 = j;
+      j = (x_11 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/loops-ifs-continues-call/0.spvasm b/test/vk-gl-cts/graphicsfuzz/loops-ifs-continues-call/0.spvasm
new file mode 100644
index 0000000..d37a387
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/loops-ifs-continues-call/0.spvasm
@@ -0,0 +1,181 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %BinarySearchObject "BinarySearchObject"
+               OpMemberName %BinarySearchObject 0 "prime_numbers"
+               OpName %binarySearch_struct_BinarySearchObject_i1_10_1_ "binarySearch(struct-BinarySearchObject-i1[10]1;"
+               OpName %obj "obj"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %m "m"
+               OpName %i "i"
+               OpName %obj_0 "obj"
+               OpName %param "param"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %BinarySearchObject 0 RelaxedPrecision
+               OpDecorate %binarySearch_struct_BinarySearchObject_i1_10_1_ RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %m RelaxedPrecision
+               OpDecorate %13 RelaxedPrecision
+               OpDecorate %14 RelaxedPrecision
+               OpDecorate %15 RelaxedPrecision
+               OpDecorate %i RelaxedPrecision
+               OpDecorate %16 RelaxedPrecision
+               OpDecorate %17 RelaxedPrecision
+               OpDecorate %18 RelaxedPrecision
+               OpDecorate %19 RelaxedPrecision
+               OpDecorate %20 RelaxedPrecision
+               OpDecorate %21 RelaxedPrecision
+               OpDecorate %22 RelaxedPrecision
+               OpDecorate %23 RelaxedPrecision
+               OpDecorate %24 RelaxedPrecision
+               OpDecorate %25 RelaxedPrecision
+               OpDecorate %26 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%BinarySearchObject = OpTypeStruct %_arr_int_uint_10
+%_ptr_Function_BinarySearchObject = OpTypePointer Function %BinarySearchObject
+         %34 = OpTypeFunction %int %_ptr_Function_BinarySearchObject
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+       %bool = OpTypeBool
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+     %int_10 = OpConstant %int 10
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+     %int_11 = OpConstant %int 11
+      %int_6 = OpConstant %int 6
+     %int_17 = OpConstant %int 17
+    %float_0 = OpConstant %float 0
+     %uint_1 = OpConstant %uint 1
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %55 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %28
+         %56 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+      %obj_0 = OpVariable %_ptr_Function_BinarySearchObject Function
+      %param = OpVariable %_ptr_Function_BinarySearchObject Function
+               OpStore %i %int_0
+               OpBranch %57
+         %57 = OpLabel
+               OpLoopMerge %58 %59 None
+               OpBranch %60
+         %60 = OpLabel
+         %16 = OpLoad %int %i
+         %61 = OpSLessThan %bool %16 %int_10
+               OpBranchConditional %61 %62 %58
+         %62 = OpLabel
+         %17 = OpLoad %int %i
+         %63 = OpINotEqual %bool %17 %int_3
+               OpSelectionMerge %64 None
+               OpBranchConditional %63 %65 %64
+         %65 = OpLabel
+         %18 = OpLoad %int %i
+         %66 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %67 = OpLoad %float %66
+         %19 = OpConvertFToS %int %67
+         %20 = OpISub %int %18 %19
+         %68 = OpIEqual %bool %20 %int_4
+               OpSelectionMerge %69 None
+               OpBranchConditional %68 %70 %71
+         %70 = OpLabel
+         %21 = OpLoad %int %i
+         %72 = OpAccessChain %_ptr_Function_int %obj_0 %int_0 %21
+               OpStore %72 %int_11
+               OpBranch %69
+         %71 = OpLabel
+         %22 = OpLoad %int %i
+         %73 = OpIEqual %bool %22 %int_6
+               OpSelectionMerge %74 None
+               OpBranchConditional %73 %75 %74
+         %75 = OpLabel
+         %23 = OpLoad %int %i
+         %76 = OpAccessChain %_ptr_Function_int %obj_0 %int_0 %23
+               OpStore %76 %int_17
+               OpBranch %74
+         %74 = OpLabel
+               OpBranch %59
+         %69 = OpLabel
+               OpBranch %64
+         %64 = OpLabel
+               OpBranch %77
+         %77 = OpLabel
+               OpLoopMerge %78 %79 None
+               OpBranch %80
+         %80 = OpLabel
+               OpBranch %79
+         %79 = OpLabel
+         %81 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %82 = OpLoad %float %81
+         %83 = OpFOrdGreaterThan %bool %float_0 %82
+               OpBranchConditional %83 %77 %78
+         %78 = OpLabel
+               OpBranch %59
+         %59 = OpLabel
+         %24 = OpLoad %int %i
+         %25 = OpIAdd %int %24 %int_1
+               OpStore %i %25
+               OpBranch %57
+         %58 = OpLabel
+         %84 = OpLoad %BinarySearchObject %obj_0
+               OpStore %param %84
+         %26 = OpFunctionCall %int %binarySearch_struct_BinarySearchObject_i1_10_1_ %param
+               OpStore %_GLF_color %55
+               OpReturn
+               OpFunctionEnd
+%binarySearch_struct_BinarySearchObject_i1_10_1_ = OpFunction %int None %34
+        %obj = OpFunctionParameter %_ptr_Function_BinarySearchObject
+         %85 = OpLabel
+          %m = OpVariable %_ptr_Function_int Function
+               OpBranch %86
+         %86 = OpLabel
+               OpLoopMerge %87 %88 None
+               OpBranch %89
+         %89 = OpLabel
+         %90 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %91 = OpLoad %float %90
+         %92 = OpFOrdGreaterThan %bool %91 %float_1
+               OpBranchConditional %92 %93 %87
+         %93 = OpLabel
+         %94 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %95 = OpLoad %float %94
+         %13 = OpConvertFToS %int %95
+               OpStore %m %13
+         %14 = OpLoad %int %m
+         %96 = OpAccessChain %_ptr_Function_int %obj %int_0 %14
+         %15 = OpLoad %int %96
+         %97 = OpIEqual %bool %15 %int_1
+               OpSelectionMerge %98 None
+               OpBranchConditional %97 %99 %98
+         %99 = OpLabel
+               OpReturnValue %int_1
+         %98 = OpLabel
+               OpBranch %88
+         %88 = OpLabel
+               OpBranch %86
+         %87 = OpLabel
+               OpReturnValue %int_1
+               OpFunctionEnd
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
new file mode 100644
index 0000000..4ca646f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/loops-ifs-continues-call/0.spvasm.expected.hlsl
@@ -0,0 +1,76 @@
+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;
+  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;
+  {
+    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;
+        }
+      }
+      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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/loops-ifs-continues-call/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/loops-ifs-continues-call/0.spvasm.expected.msl
new file mode 100644
index 0000000..dee463b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/loops-ifs-continues-call/0.spvasm.expected.msl
@@ -0,0 +1,98 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct BinarySearchObject {
+  tint_array_wrapper prime_numbers;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int binarySearch_struct_BinarySearchObject_i1_10_1_(constant buf0& x_8, thread BinarySearchObject* const obj) {
+  int m = 0;
+  while (true) {
+    float const x_91 = x_8.injectionSwitch.x;
+    if ((x_91 > 1.0f)) {
+    } else {
+      break;
+    }
+    float const x_95 = x_8.injectionSwitch.x;
+    m = int(x_95);
+    int const x_14 = m;
+    int const x_15 = (*(obj)).prime_numbers.arr[x_14];
+    if ((x_15 == 1)) {
+      return 1;
+    }
+  }
+  return 1;
+}
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_4) {
+  int i = 0;
+  BinarySearchObject obj_1 = {};
+  BinarySearchObject param = {};
+  i = 0;
+  while (true) {
+    int const x_16 = i;
+    if ((x_16 < 10)) {
+    } else {
+      break;
+    }
+    int const x_17 = i;
+    if ((x_17 != 3)) {
+      int const x_18 = i;
+      float const x_67 = x_8.injectionSwitch.x;
+      if (((x_18 - int(x_67)) == 4)) {
+        int const x_21 = i;
+        obj_1.prime_numbers.arr[x_21] = 11;
+      } else {
+        int const x_22 = i;
+        if ((x_22 == 6)) {
+          int const x_23 = i;
+          obj_1.prime_numbers.arr[x_23] = 17;
+        }
+        {
+          int const x_24 = i;
+          i = (x_24 + 1);
+        }
+        continue;
+      }
+    }
+    while (true) {
+      {
+        float const x_82 = x_8.injectionSwitch.y;
+        if ((0.0f > x_82)) {
+        } else {
+          break;
+        }
+      }
+    }
+    {
+      int const x_24 = i;
+      i = (x_24 + 1);
+    }
+  }
+  BinarySearchObject const x_84 = obj_1;
+  param = x_84;
+  int const x_26 = binarySearch_struct_BinarySearchObject_i1_10_1_(x_8, &(param));
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/loops-ifs-continues-call/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/loops-ifs-continues-call/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..763929e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/loops-ifs-continues-call/0.spvasm.expected.spvasm
@@ -0,0 +1,220 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 125
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %BinarySearchObject "BinarySearchObject"
+               OpMemberName %BinarySearchObject 0 "prime_numbers"
+               OpName %binarySearch_struct_BinarySearchObject_i1_10_1_ "binarySearch_struct_BinarySearchObject_i1_10_1_"
+               OpName %obj "obj"
+               OpName %m "m"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %obj_1 "obj_1"
+               OpName %param "param"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %BinarySearchObject 0 Offset 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%BinarySearchObject = OpTypeStruct %_arr_int_uint_10
+%_ptr_Function_BinarySearchObject = OpTypePointer Function %BinarySearchObject
+         %12 = OpTypeFunction %int %_ptr_Function_BinarySearchObject
+%_ptr_Function_int = OpTypePointer Function %int
+         %24 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+       %void = OpTypeVoid
+         %50 = OpTypeFunction %void
+         %56 = OpConstantNull %BinarySearchObject
+      %int_0 = OpConstant %int 0
+     %int_10 = OpConstant %int 10
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+     %int_11 = OpConstant %int 11
+      %int_6 = OpConstant %int 6
+     %int_17 = OpConstant %int 17
+     %uint_1 = OpConstant %uint 1
+    %float_0 = OpConstant %float 0
+        %112 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %113 = OpTypeFunction %void %main_out
+%binarySearch_struct_BinarySearchObject_i1_10_1_ = OpFunction %int None %12
+        %obj = OpFunctionParameter %_ptr_Function_BinarySearchObject
+         %21 = OpLabel
+          %m = OpVariable %_ptr_Function_int Function %24
+               OpBranch %25
+         %25 = OpLabel
+               OpLoopMerge %26 %27 None
+               OpBranch %28
+         %28 = OpLabel
+         %31 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+         %32 = OpLoad %float %31
+         %34 = OpFOrdGreaterThan %bool %32 %float_1
+               OpSelectionMerge %36 None
+               OpBranchConditional %34 %37 %38
+         %37 = OpLabel
+               OpBranch %36
+         %38 = OpLabel
+               OpBranch %26
+         %36 = OpLabel
+         %39 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+         %40 = OpLoad %float %39
+         %41 = OpConvertFToS %int %40
+               OpStore %m %41
+         %42 = OpLoad %int %m
+         %44 = OpAccessChain %_ptr_Function_int %obj %uint_0 %42
+         %45 = OpLoad %int %44
+         %47 = OpIEqual %bool %45 %int_1
+               OpSelectionMerge %48 None
+               OpBranchConditional %47 %49 %48
+         %49 = OpLabel
+               OpReturnValue %int_1
+         %48 = OpLabel
+               OpBranch %27
+         %27 = OpLabel
+               OpBranch %25
+         %26 = OpLabel
+               OpReturnValue %int_1
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %50
+         %53 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %24
+      %obj_1 = OpVariable %_ptr_Function_BinarySearchObject Function %56
+      %param = OpVariable %_ptr_Function_BinarySearchObject Function %56
+               OpStore %i %int_0
+               OpBranch %59
+         %59 = OpLabel
+               OpLoopMerge %60 %61 None
+               OpBranch %62
+         %62 = OpLabel
+         %63 = OpLoad %int %i
+         %65 = OpSLessThan %bool %63 %int_10
+               OpSelectionMerge %66 None
+               OpBranchConditional %65 %67 %68
+         %67 = OpLabel
+               OpBranch %66
+         %68 = OpLabel
+               OpBranch %60
+         %66 = OpLabel
+         %69 = OpLoad %int %i
+         %71 = OpINotEqual %bool %69 %int_3
+               OpSelectionMerge %72 None
+               OpBranchConditional %71 %73 %72
+         %73 = OpLabel
+         %74 = OpLoad %int %i
+         %75 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+         %76 = OpLoad %float %75
+         %77 = OpConvertFToS %int %76
+         %78 = OpISub %int %74 %77
+         %80 = OpIEqual %bool %78 %int_4
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %83
+         %82 = OpLabel
+         %84 = OpLoad %int %i
+         %85 = OpAccessChain %_ptr_Function_int %obj_1 %uint_0 %84
+               OpStore %85 %int_11
+               OpBranch %81
+         %83 = OpLabel
+         %87 = OpLoad %int %i
+         %89 = OpIEqual %bool %87 %int_6
+               OpSelectionMerge %90 None
+               OpBranchConditional %89 %91 %90
+         %91 = OpLabel
+         %92 = OpLoad %int %i
+         %93 = OpAccessChain %_ptr_Function_int %obj_1 %uint_0 %92
+               OpStore %93 %int_17
+               OpBranch %90
+         %90 = OpLabel
+               OpBranch %61
+         %81 = OpLabel
+               OpBranch %72
+         %72 = OpLabel
+               OpBranch %95
+         %95 = OpLabel
+               OpLoopMerge %96 %97 None
+               OpBranch %98
+         %98 = OpLabel
+               OpBranch %97
+         %97 = OpLabel
+        %100 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+        %101 = OpLoad %float %100
+        %103 = OpFOrdGreaterThan %bool %float_0 %101
+               OpSelectionMerge %104 None
+               OpBranchConditional %103 %105 %106
+        %105 = OpLabel
+               OpBranch %104
+        %106 = OpLabel
+               OpBranch %96
+        %104 = OpLabel
+               OpBranch %95
+         %96 = OpLabel
+               OpBranch %61
+         %61 = OpLabel
+        %107 = OpLoad %int %i
+        %108 = OpIAdd %int %107 %int_1
+               OpStore %i %108
+               OpBranch %59
+         %60 = OpLabel
+        %109 = OpLoad %BinarySearchObject %obj_1
+               OpStore %param %109
+        %110 = OpFunctionCall %int %binarySearch_struct_BinarySearchObject_i1_10_1_ %param
+               OpStore %x_GLF_color %112
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %113
+%tint_symbol = OpFunctionParameter %main_out
+        %117 = OpLabel
+        %118 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %118
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %50
+        %120 = OpLabel
+        %121 = OpFunctionCall %void %main_1
+        %123 = OpLoad %v4float %x_GLF_color
+        %124 = OpCompositeConstruct %main_out %123
+        %122 = OpFunctionCall %void %tint_symbol_2 %124
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 97[%97] is not post dominated by the back-edge block 104[%104]
+  %104 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/loops-ifs-continues-call/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/loops-ifs-continues-call/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..9d9f80c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/loops-ifs-continues-call/0.spvasm.expected.wgsl
@@ -0,0 +1,92 @@
+struct BinarySearchObject {
+  prime_numbers : array<i32, 10>;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn binarySearch_struct_BinarySearchObject_i1_10_1_(obj : ptr<function, BinarySearchObject>) -> i32 {
+  var m : i32;
+  loop {
+    let x_91 : f32 = x_8.injectionSwitch.x;
+    if ((x_91 > 1.0)) {
+    } else {
+      break;
+    }
+    let x_95 : f32 = x_8.injectionSwitch.x;
+    m = i32(x_95);
+    let x_14 : i32 = m;
+    let x_15 : i32 = (*(obj)).prime_numbers[x_14];
+    if ((x_15 == 1)) {
+      return 1;
+    }
+  }
+  return 1;
+}
+
+fn main_1() {
+  var i : i32;
+  var obj_1 : BinarySearchObject;
+  var param : BinarySearchObject;
+  i = 0;
+  loop {
+    let x_16 : i32 = i;
+    if ((x_16 < 10)) {
+    } else {
+      break;
+    }
+    let x_17 : i32 = i;
+    if ((x_17 != 3)) {
+      let x_18 : i32 = i;
+      let x_67 : f32 = x_8.injectionSwitch.x;
+      if (((x_18 - i32(x_67)) == 4)) {
+        let x_21 : i32 = i;
+        obj_1.prime_numbers[x_21] = 11;
+      } else {
+        let x_22 : i32 = i;
+        if ((x_22 == 6)) {
+          let x_23 : i32 = i;
+          obj_1.prime_numbers[x_23] = 17;
+        }
+        continue;
+      }
+    }
+    loop {
+
+      continuing {
+        let x_82 : f32 = x_8.injectionSwitch.y;
+        if ((0.0 > x_82)) {
+        } else {
+          break;
+        }
+      }
+    }
+
+    continuing {
+      let x_24 : i32 = i;
+      i = (x_24 + 1);
+    }
+  }
+  let x_84 : BinarySearchObject = obj_1;
+  param = x_84;
+  let x_26 : i32 = binarySearch_struct_BinarySearchObject_i1_10_1_(&(param));
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/loops-ifs-continues-call/0.wgsl b/test/vk-gl-cts/graphicsfuzz/loops-ifs-continues-call/0.wgsl
new file mode 100644
index 0000000..9d9f80c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/loops-ifs-continues-call/0.wgsl
@@ -0,0 +1,92 @@
+struct BinarySearchObject {
+  prime_numbers : array<i32, 10>;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn binarySearch_struct_BinarySearchObject_i1_10_1_(obj : ptr<function, BinarySearchObject>) -> i32 {
+  var m : i32;
+  loop {
+    let x_91 : f32 = x_8.injectionSwitch.x;
+    if ((x_91 > 1.0)) {
+    } else {
+      break;
+    }
+    let x_95 : f32 = x_8.injectionSwitch.x;
+    m = i32(x_95);
+    let x_14 : i32 = m;
+    let x_15 : i32 = (*(obj)).prime_numbers[x_14];
+    if ((x_15 == 1)) {
+      return 1;
+    }
+  }
+  return 1;
+}
+
+fn main_1() {
+  var i : i32;
+  var obj_1 : BinarySearchObject;
+  var param : BinarySearchObject;
+  i = 0;
+  loop {
+    let x_16 : i32 = i;
+    if ((x_16 < 10)) {
+    } else {
+      break;
+    }
+    let x_17 : i32 = i;
+    if ((x_17 != 3)) {
+      let x_18 : i32 = i;
+      let x_67 : f32 = x_8.injectionSwitch.x;
+      if (((x_18 - i32(x_67)) == 4)) {
+        let x_21 : i32 = i;
+        obj_1.prime_numbers[x_21] = 11;
+      } else {
+        let x_22 : i32 = i;
+        if ((x_22 == 6)) {
+          let x_23 : i32 = i;
+          obj_1.prime_numbers[x_23] = 17;
+        }
+        continue;
+      }
+    }
+    loop {
+
+      continuing {
+        let x_82 : f32 = x_8.injectionSwitch.y;
+        if ((0.0 > x_82)) {
+        } else {
+          break;
+        }
+      }
+    }
+
+    continuing {
+      let x_24 : i32 = i;
+      i = (x_24 + 1);
+    }
+  }
+  let x_84 : BinarySearchObject = obj_1;
+  param = x_84;
+  let x_26 : i32 = binarySearch_struct_BinarySearchObject_i1_10_1_(&(param));
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
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
new file mode 100644
index 0000000..4ca646f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/loops-ifs-continues-call/0.wgsl.expected.hlsl
@@ -0,0 +1,76 @@
+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;
+  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;
+  {
+    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;
+        }
+      }
+      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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/loops-ifs-continues-call/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/loops-ifs-continues-call/0.wgsl.expected.msl
new file mode 100644
index 0000000..dee463b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/loops-ifs-continues-call/0.wgsl.expected.msl
@@ -0,0 +1,98 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct BinarySearchObject {
+  tint_array_wrapper prime_numbers;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int binarySearch_struct_BinarySearchObject_i1_10_1_(constant buf0& x_8, thread BinarySearchObject* const obj) {
+  int m = 0;
+  while (true) {
+    float const x_91 = x_8.injectionSwitch.x;
+    if ((x_91 > 1.0f)) {
+    } else {
+      break;
+    }
+    float const x_95 = x_8.injectionSwitch.x;
+    m = int(x_95);
+    int const x_14 = m;
+    int const x_15 = (*(obj)).prime_numbers.arr[x_14];
+    if ((x_15 == 1)) {
+      return 1;
+    }
+  }
+  return 1;
+}
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_4) {
+  int i = 0;
+  BinarySearchObject obj_1 = {};
+  BinarySearchObject param = {};
+  i = 0;
+  while (true) {
+    int const x_16 = i;
+    if ((x_16 < 10)) {
+    } else {
+      break;
+    }
+    int const x_17 = i;
+    if ((x_17 != 3)) {
+      int const x_18 = i;
+      float const x_67 = x_8.injectionSwitch.x;
+      if (((x_18 - int(x_67)) == 4)) {
+        int const x_21 = i;
+        obj_1.prime_numbers.arr[x_21] = 11;
+      } else {
+        int const x_22 = i;
+        if ((x_22 == 6)) {
+          int const x_23 = i;
+          obj_1.prime_numbers.arr[x_23] = 17;
+        }
+        {
+          int const x_24 = i;
+          i = (x_24 + 1);
+        }
+        continue;
+      }
+    }
+    while (true) {
+      {
+        float const x_82 = x_8.injectionSwitch.y;
+        if ((0.0f > x_82)) {
+        } else {
+          break;
+        }
+      }
+    }
+    {
+      int const x_24 = i;
+      i = (x_24 + 1);
+    }
+  }
+  BinarySearchObject const x_84 = obj_1;
+  param = x_84;
+  int const x_26 = binarySearch_struct_BinarySearchObject_i1_10_1_(x_8, &(param));
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/loops-ifs-continues-call/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/loops-ifs-continues-call/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..763929e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/loops-ifs-continues-call/0.wgsl.expected.spvasm
@@ -0,0 +1,220 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 125
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %BinarySearchObject "BinarySearchObject"
+               OpMemberName %BinarySearchObject 0 "prime_numbers"
+               OpName %binarySearch_struct_BinarySearchObject_i1_10_1_ "binarySearch_struct_BinarySearchObject_i1_10_1_"
+               OpName %obj "obj"
+               OpName %m "m"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %obj_1 "obj_1"
+               OpName %param "param"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %BinarySearchObject 0 Offset 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%BinarySearchObject = OpTypeStruct %_arr_int_uint_10
+%_ptr_Function_BinarySearchObject = OpTypePointer Function %BinarySearchObject
+         %12 = OpTypeFunction %int %_ptr_Function_BinarySearchObject
+%_ptr_Function_int = OpTypePointer Function %int
+         %24 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+       %void = OpTypeVoid
+         %50 = OpTypeFunction %void
+         %56 = OpConstantNull %BinarySearchObject
+      %int_0 = OpConstant %int 0
+     %int_10 = OpConstant %int 10
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+     %int_11 = OpConstant %int 11
+      %int_6 = OpConstant %int 6
+     %int_17 = OpConstant %int 17
+     %uint_1 = OpConstant %uint 1
+    %float_0 = OpConstant %float 0
+        %112 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %113 = OpTypeFunction %void %main_out
+%binarySearch_struct_BinarySearchObject_i1_10_1_ = OpFunction %int None %12
+        %obj = OpFunctionParameter %_ptr_Function_BinarySearchObject
+         %21 = OpLabel
+          %m = OpVariable %_ptr_Function_int Function %24
+               OpBranch %25
+         %25 = OpLabel
+               OpLoopMerge %26 %27 None
+               OpBranch %28
+         %28 = OpLabel
+         %31 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+         %32 = OpLoad %float %31
+         %34 = OpFOrdGreaterThan %bool %32 %float_1
+               OpSelectionMerge %36 None
+               OpBranchConditional %34 %37 %38
+         %37 = OpLabel
+               OpBranch %36
+         %38 = OpLabel
+               OpBranch %26
+         %36 = OpLabel
+         %39 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+         %40 = OpLoad %float %39
+         %41 = OpConvertFToS %int %40
+               OpStore %m %41
+         %42 = OpLoad %int %m
+         %44 = OpAccessChain %_ptr_Function_int %obj %uint_0 %42
+         %45 = OpLoad %int %44
+         %47 = OpIEqual %bool %45 %int_1
+               OpSelectionMerge %48 None
+               OpBranchConditional %47 %49 %48
+         %49 = OpLabel
+               OpReturnValue %int_1
+         %48 = OpLabel
+               OpBranch %27
+         %27 = OpLabel
+               OpBranch %25
+         %26 = OpLabel
+               OpReturnValue %int_1
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %50
+         %53 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %24
+      %obj_1 = OpVariable %_ptr_Function_BinarySearchObject Function %56
+      %param = OpVariable %_ptr_Function_BinarySearchObject Function %56
+               OpStore %i %int_0
+               OpBranch %59
+         %59 = OpLabel
+               OpLoopMerge %60 %61 None
+               OpBranch %62
+         %62 = OpLabel
+         %63 = OpLoad %int %i
+         %65 = OpSLessThan %bool %63 %int_10
+               OpSelectionMerge %66 None
+               OpBranchConditional %65 %67 %68
+         %67 = OpLabel
+               OpBranch %66
+         %68 = OpLabel
+               OpBranch %60
+         %66 = OpLabel
+         %69 = OpLoad %int %i
+         %71 = OpINotEqual %bool %69 %int_3
+               OpSelectionMerge %72 None
+               OpBranchConditional %71 %73 %72
+         %73 = OpLabel
+         %74 = OpLoad %int %i
+         %75 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+         %76 = OpLoad %float %75
+         %77 = OpConvertFToS %int %76
+         %78 = OpISub %int %74 %77
+         %80 = OpIEqual %bool %78 %int_4
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %83
+         %82 = OpLabel
+         %84 = OpLoad %int %i
+         %85 = OpAccessChain %_ptr_Function_int %obj_1 %uint_0 %84
+               OpStore %85 %int_11
+               OpBranch %81
+         %83 = OpLabel
+         %87 = OpLoad %int %i
+         %89 = OpIEqual %bool %87 %int_6
+               OpSelectionMerge %90 None
+               OpBranchConditional %89 %91 %90
+         %91 = OpLabel
+         %92 = OpLoad %int %i
+         %93 = OpAccessChain %_ptr_Function_int %obj_1 %uint_0 %92
+               OpStore %93 %int_17
+               OpBranch %90
+         %90 = OpLabel
+               OpBranch %61
+         %81 = OpLabel
+               OpBranch %72
+         %72 = OpLabel
+               OpBranch %95
+         %95 = OpLabel
+               OpLoopMerge %96 %97 None
+               OpBranch %98
+         %98 = OpLabel
+               OpBranch %97
+         %97 = OpLabel
+        %100 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+        %101 = OpLoad %float %100
+        %103 = OpFOrdGreaterThan %bool %float_0 %101
+               OpSelectionMerge %104 None
+               OpBranchConditional %103 %105 %106
+        %105 = OpLabel
+               OpBranch %104
+        %106 = OpLabel
+               OpBranch %96
+        %104 = OpLabel
+               OpBranch %95
+         %96 = OpLabel
+               OpBranch %61
+         %61 = OpLabel
+        %107 = OpLoad %int %i
+        %108 = OpIAdd %int %107 %int_1
+               OpStore %i %108
+               OpBranch %59
+         %60 = OpLabel
+        %109 = OpLoad %BinarySearchObject %obj_1
+               OpStore %param %109
+        %110 = OpFunctionCall %int %binarySearch_struct_BinarySearchObject_i1_10_1_ %param
+               OpStore %x_GLF_color %112
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %113
+%tint_symbol = OpFunctionParameter %main_out
+        %117 = OpLabel
+        %118 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %118
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %50
+        %120 = OpLabel
+        %121 = OpFunctionCall %void %main_1
+        %123 = OpLoad %v4float %x_GLF_color
+        %124 = OpCompositeConstruct %main_out %123
+        %122 = OpFunctionCall %void %tint_symbol_2 %124
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 97[%97] is not post dominated by the back-edge block 104[%104]
+  %104 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/loops-ifs-continues-call/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/loops-ifs-continues-call/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..9d9f80c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/loops-ifs-continues-call/0.wgsl.expected.wgsl
@@ -0,0 +1,92 @@
+struct BinarySearchObject {
+  prime_numbers : array<i32, 10>;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn binarySearch_struct_BinarySearchObject_i1_10_1_(obj : ptr<function, BinarySearchObject>) -> i32 {
+  var m : i32;
+  loop {
+    let x_91 : f32 = x_8.injectionSwitch.x;
+    if ((x_91 > 1.0)) {
+    } else {
+      break;
+    }
+    let x_95 : f32 = x_8.injectionSwitch.x;
+    m = i32(x_95);
+    let x_14 : i32 = m;
+    let x_15 : i32 = (*(obj)).prime_numbers[x_14];
+    if ((x_15 == 1)) {
+      return 1;
+    }
+  }
+  return 1;
+}
+
+fn main_1() {
+  var i : i32;
+  var obj_1 : BinarySearchObject;
+  var param : BinarySearchObject;
+  i = 0;
+  loop {
+    let x_16 : i32 = i;
+    if ((x_16 < 10)) {
+    } else {
+      break;
+    }
+    let x_17 : i32 = i;
+    if ((x_17 != 3)) {
+      let x_18 : i32 = i;
+      let x_67 : f32 = x_8.injectionSwitch.x;
+      if (((x_18 - i32(x_67)) == 4)) {
+        let x_21 : i32 = i;
+        obj_1.prime_numbers[x_21] = 11;
+      } else {
+        let x_22 : i32 = i;
+        if ((x_22 == 6)) {
+          let x_23 : i32 = i;
+          obj_1.prime_numbers[x_23] = 17;
+        }
+        continue;
+      }
+    }
+    loop {
+
+      continuing {
+        let x_82 : f32 = x_8.injectionSwitch.y;
+        if ((0.0 > x_82)) {
+        } else {
+          break;
+        }
+      }
+    }
+
+    continuing {
+      let x_24 : i32 = i;
+      i = (x_24 + 1);
+    }
+  }
+  let x_84 : BinarySearchObject = obj_1;
+  param = x_84;
+  let x_26 : i32 = binarySearch_struct_BinarySearchObject_i1_10_1_(&(param));
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/matrices-and-return-in-loop/0.spvasm b/test/vk-gl-cts/graphicsfuzz/matrices-and-return-in-loop/0.spvasm
new file mode 100644
index 0000000..8fc1abc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/matrices-and-return-in-loop/0.spvasm
@@ -0,0 +1,72 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %f_mf22_ "f(mf22;"
+               OpName %m "m"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %param "param"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%mat2v2float = OpTypeMatrix %v2float 2
+%_ptr_Function_mat2v2float = OpTypePointer Function %mat2v2float
+    %v3float = OpTypeVector %float 3
+         %15 = OpTypeFunction %v3float %_ptr_Function_mat2v2float
+    %float_1 = OpConstant %float 1
+         %17 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+         %20 = OpConstantComposite %v2float %float_0 %float_0
+         %21 = OpConstantComposite %mat2v2float %20 %20
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+         %27 = OpConstantComposite %v2float %float_1 %float_0
+         %28 = OpConstantComposite %v2float %float_0 %float_1
+         %29 = OpConstantComposite %mat2v2float %27 %28
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %31 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %9
+         %32 = OpLabel
+      %param = OpVariable %_ptr_Function_mat2v2float Function
+         %33 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %34 = OpLoad %float %33
+         %35 = OpFOrdGreaterThanEqual %bool %34 %float_0
+               OpSelectionMerge %36 None
+               OpBranchConditional %35 %37 %36
+         %37 = OpLabel
+               OpBranch %36
+         %36 = OpLabel
+         %38 = OpPhi %mat2v2float %21 %32 %29 %37
+         %39 = OpMatrixTimesMatrix %mat2v2float %38 %38
+               OpStore %param %39
+         %40 = OpFunctionCall %v3float %f_mf22_ %param
+               OpStore %_GLF_color %31
+               OpReturn
+               OpFunctionEnd
+    %f_mf22_ = OpFunction %v3float None %15
+          %m = OpFunctionParameter %_ptr_Function_mat2v2float
+         %41 = OpLabel
+               OpBranch %42
+         %42 = OpLabel
+               OpLoopMerge %43 %44 None
+               OpBranch %45
+         %45 = OpLabel
+               OpReturnValue %17
+         %44 = OpLabel
+               OpBranch %42
+         %43 = OpLabel
+               OpUnreachable
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/matrices-and-return-in-loop/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/matrices-and-return-in-loop/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..91e6f7c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/matrices-and-return-in-loop/0.spvasm.expected.hlsl
@@ -0,0 +1,43 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float3 f_mf22_(inout float2x2 m) {
+  while (true) {
+    return float3(1.0f, 1.0f, 1.0f);
+  }
+  return float3(0.0f, 0.0f, 0.0f);
+}
+
+void main_1() {
+  float2x2 param = float2x2(0.0f, 0.0f, 0.0f, 0.0f);
+  float2x2 x_38_phi = float2x2(0.0f, 0.0f, 0.0f, 0.0f);
+  const float x_34 = gl_FragCoord.x;
+  x_38_phi = float2x2(float2(0.0f, 0.0f), float2(0.0f, 0.0f));
+  if ((x_34 >= 0.0f)) {
+    x_38_phi = float2x2(float2(1.0f, 0.0f), float2(0.0f, 1.0f));
+  }
+  const float2x2 x_38 = x_38_phi;
+  param = mul(x_38, x_38);
+  const float3 x_40 = f_mf22_(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_1 {
+  float4 gl_FragCoord_param : SV_Position;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/matrices-and-return-in-loop/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/matrices-and-return-in-loop/0.spvasm.expected.msl
new file mode 100644
index 0000000..6ff0d16
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/matrices-and-return-in-loop/0.spvasm.expected.msl
@@ -0,0 +1,42 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float3 f_mf22_(thread float2x2* const m) {
+  while (true) {
+    return float3(1.0f, 1.0f, 1.0f);
+  }
+  return float3(0.0f, 0.0f, 0.0f);
+}
+
+void main_1(thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float2x2 param = float2x2(0.0f);
+  float2x2 x_38_phi = float2x2(0.0f);
+  float const x_34 = (*(tint_symbol_5)).x;
+  x_38_phi = float2x2(float2(0.0f, 0.0f), float2(0.0f, 0.0f));
+  if ((x_34 >= 0.0f)) {
+    x_38_phi = float2x2(float2(1.0f, 0.0f), float2(0.0f, 1.0f));
+  }
+  float2x2 const x_38 = x_38_phi;
+  param = (x_38 * x_38);
+  float3 const x_40 = f_mf22_(&(param));
+  *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(&(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/matrices-and-return-in-loop/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/matrices-and-return-in-loop/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..6623b07
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/matrices-and-return-in-loop/0.spvasm.expected.spvasm
@@ -0,0 +1,112 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 66
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %f_mf22_ "f_mf22_"
+               OpName %m "m"
+               OpName %main_1 "main_1"
+               OpName %param "param"
+               OpName %x_38_phi "x_38_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+    %v3float = OpTypeVector %float 3
+    %v2float = OpTypeVector %float 2
+%mat2v2float = OpTypeMatrix %v2float 2
+%_ptr_Function_mat2v2float = OpTypePointer Function %mat2v2float
+         %11 = OpTypeFunction %v3float %_ptr_Function_mat2v2float
+    %float_1 = OpConstant %float 1
+         %24 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+    %float_0 = OpConstant %float 0
+         %26 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
+         %32 = OpConstantNull %mat2v2float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+         %39 = OpConstantComposite %v2float %float_0 %float_0
+         %40 = OpConstantComposite %mat2v2float %39 %39
+       %bool = OpTypeBool
+         %45 = OpConstantComposite %v2float %float_1 %float_0
+         %46 = OpConstantComposite %v2float %float_0 %float_1
+         %47 = OpConstantComposite %mat2v2float %45 %46
+         %52 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %53 = OpTypeFunction %void %main_out
+    %f_mf22_ = OpFunction %v3float None %11
+          %m = OpFunctionParameter %_ptr_Function_mat2v2float
+         %18 = OpLabel
+               OpBranch %19
+         %19 = OpLabel
+               OpLoopMerge %20 %21 None
+               OpBranch %22
+         %22 = OpLabel
+               OpReturnValue %24
+         %21 = OpLabel
+               OpBranch %19
+         %20 = OpLabel
+               OpReturnValue %26
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %27
+         %30 = OpLabel
+      %param = OpVariable %_ptr_Function_mat2v2float Function %32
+   %x_38_phi = OpVariable %_ptr_Function_mat2v2float Function %32
+         %37 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %38 = OpLoad %float %37
+               OpStore %x_38_phi %40
+         %41 = OpFOrdGreaterThanEqual %bool %38 %float_0
+               OpSelectionMerge %43 None
+               OpBranchConditional %41 %44 %43
+         %44 = OpLabel
+               OpStore %x_38_phi %47
+               OpBranch %43
+         %43 = OpLabel
+         %48 = OpLoad %mat2v2float %x_38_phi
+         %49 = OpMatrixTimesMatrix %mat2v2float %48 %48
+               OpStore %param %49
+         %50 = OpFunctionCall %v3float %f_mf22_ %param
+               OpStore %x_GLF_color %52
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %53
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %57 = OpLabel
+         %58 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %58
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %27
+         %60 = OpLabel
+         %61 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %61
+         %62 = OpFunctionCall %void %main_1
+         %64 = OpLoad %v4float %x_GLF_color
+         %65 = OpCompositeConstruct %main_out %64
+         %63 = OpFunctionCall %void %tint_symbol_3 %65
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/matrices-and-return-in-loop/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/matrices-and-return-in-loop/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..ee6e11e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/matrices-and-return-in-loop/0.spvasm.expected.wgsl
@@ -0,0 +1,37 @@
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn f_mf22_(m : ptr<function, mat2x2<f32>>) -> vec3<f32> {
+  loop {
+    return vec3<f32>(1.0, 1.0, 1.0);
+  }
+  return vec3<f32>(0.0, 0.0, 0.0);
+}
+
+fn main_1() {
+  var param : mat2x2<f32>;
+  var x_38_phi : mat2x2<f32>;
+  let x_34 : f32 = gl_FragCoord.x;
+  x_38_phi = mat2x2<f32>(vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0));
+  if ((x_34 >= 0.0)) {
+    x_38_phi = mat2x2<f32>(vec2<f32>(1.0, 0.0), vec2<f32>(0.0, 1.0));
+  }
+  let x_38 : mat2x2<f32> = x_38_phi;
+  param = (x_38 * x_38);
+  let x_40 : vec3<f32> = f_mf22_(&(param));
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/matrices-and-return-in-loop/0.wgsl b/test/vk-gl-cts/graphicsfuzz/matrices-and-return-in-loop/0.wgsl
new file mode 100644
index 0000000..ee6e11e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/matrices-and-return-in-loop/0.wgsl
@@ -0,0 +1,37 @@
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn f_mf22_(m : ptr<function, mat2x2<f32>>) -> vec3<f32> {
+  loop {
+    return vec3<f32>(1.0, 1.0, 1.0);
+  }
+  return vec3<f32>(0.0, 0.0, 0.0);
+}
+
+fn main_1() {
+  var param : mat2x2<f32>;
+  var x_38_phi : mat2x2<f32>;
+  let x_34 : f32 = gl_FragCoord.x;
+  x_38_phi = mat2x2<f32>(vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0));
+  if ((x_34 >= 0.0)) {
+    x_38_phi = mat2x2<f32>(vec2<f32>(1.0, 0.0), vec2<f32>(0.0, 1.0));
+  }
+  let x_38 : mat2x2<f32> = x_38_phi;
+  param = (x_38 * x_38);
+  let x_40 : vec3<f32> = f_mf22_(&(param));
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/matrices-and-return-in-loop/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/matrices-and-return-in-loop/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..91e6f7c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/matrices-and-return-in-loop/0.wgsl.expected.hlsl
@@ -0,0 +1,43 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float3 f_mf22_(inout float2x2 m) {
+  while (true) {
+    return float3(1.0f, 1.0f, 1.0f);
+  }
+  return float3(0.0f, 0.0f, 0.0f);
+}
+
+void main_1() {
+  float2x2 param = float2x2(0.0f, 0.0f, 0.0f, 0.0f);
+  float2x2 x_38_phi = float2x2(0.0f, 0.0f, 0.0f, 0.0f);
+  const float x_34 = gl_FragCoord.x;
+  x_38_phi = float2x2(float2(0.0f, 0.0f), float2(0.0f, 0.0f));
+  if ((x_34 >= 0.0f)) {
+    x_38_phi = float2x2(float2(1.0f, 0.0f), float2(0.0f, 1.0f));
+  }
+  const float2x2 x_38 = x_38_phi;
+  param = mul(x_38, x_38);
+  const float3 x_40 = f_mf22_(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_1 {
+  float4 gl_FragCoord_param : SV_Position;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/matrices-and-return-in-loop/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/matrices-and-return-in-loop/0.wgsl.expected.msl
new file mode 100644
index 0000000..6ff0d16
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/matrices-and-return-in-loop/0.wgsl.expected.msl
@@ -0,0 +1,42 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float3 f_mf22_(thread float2x2* const m) {
+  while (true) {
+    return float3(1.0f, 1.0f, 1.0f);
+  }
+  return float3(0.0f, 0.0f, 0.0f);
+}
+
+void main_1(thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float2x2 param = float2x2(0.0f);
+  float2x2 x_38_phi = float2x2(0.0f);
+  float const x_34 = (*(tint_symbol_5)).x;
+  x_38_phi = float2x2(float2(0.0f, 0.0f), float2(0.0f, 0.0f));
+  if ((x_34 >= 0.0f)) {
+    x_38_phi = float2x2(float2(1.0f, 0.0f), float2(0.0f, 1.0f));
+  }
+  float2x2 const x_38 = x_38_phi;
+  param = (x_38 * x_38);
+  float3 const x_40 = f_mf22_(&(param));
+  *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(&(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/matrices-and-return-in-loop/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/matrices-and-return-in-loop/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..6623b07
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/matrices-and-return-in-loop/0.wgsl.expected.spvasm
@@ -0,0 +1,112 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 66
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %f_mf22_ "f_mf22_"
+               OpName %m "m"
+               OpName %main_1 "main_1"
+               OpName %param "param"
+               OpName %x_38_phi "x_38_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+    %v3float = OpTypeVector %float 3
+    %v2float = OpTypeVector %float 2
+%mat2v2float = OpTypeMatrix %v2float 2
+%_ptr_Function_mat2v2float = OpTypePointer Function %mat2v2float
+         %11 = OpTypeFunction %v3float %_ptr_Function_mat2v2float
+    %float_1 = OpConstant %float 1
+         %24 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+    %float_0 = OpConstant %float 0
+         %26 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
+         %32 = OpConstantNull %mat2v2float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+         %39 = OpConstantComposite %v2float %float_0 %float_0
+         %40 = OpConstantComposite %mat2v2float %39 %39
+       %bool = OpTypeBool
+         %45 = OpConstantComposite %v2float %float_1 %float_0
+         %46 = OpConstantComposite %v2float %float_0 %float_1
+         %47 = OpConstantComposite %mat2v2float %45 %46
+         %52 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %53 = OpTypeFunction %void %main_out
+    %f_mf22_ = OpFunction %v3float None %11
+          %m = OpFunctionParameter %_ptr_Function_mat2v2float
+         %18 = OpLabel
+               OpBranch %19
+         %19 = OpLabel
+               OpLoopMerge %20 %21 None
+               OpBranch %22
+         %22 = OpLabel
+               OpReturnValue %24
+         %21 = OpLabel
+               OpBranch %19
+         %20 = OpLabel
+               OpReturnValue %26
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %27
+         %30 = OpLabel
+      %param = OpVariable %_ptr_Function_mat2v2float Function %32
+   %x_38_phi = OpVariable %_ptr_Function_mat2v2float Function %32
+         %37 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %38 = OpLoad %float %37
+               OpStore %x_38_phi %40
+         %41 = OpFOrdGreaterThanEqual %bool %38 %float_0
+               OpSelectionMerge %43 None
+               OpBranchConditional %41 %44 %43
+         %44 = OpLabel
+               OpStore %x_38_phi %47
+               OpBranch %43
+         %43 = OpLabel
+         %48 = OpLoad %mat2v2float %x_38_phi
+         %49 = OpMatrixTimesMatrix %mat2v2float %48 %48
+               OpStore %param %49
+         %50 = OpFunctionCall %v3float %f_mf22_ %param
+               OpStore %x_GLF_color %52
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %53
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %57 = OpLabel
+         %58 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %58
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %27
+         %60 = OpLabel
+         %61 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %61
+         %62 = OpFunctionCall %void %main_1
+         %64 = OpLoad %v4float %x_GLF_color
+         %65 = OpCompositeConstruct %main_out %64
+         %63 = OpFunctionCall %void %tint_symbol_3 %65
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/matrices-and-return-in-loop/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/matrices-and-return-in-loop/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..ee6e11e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/matrices-and-return-in-loop/0.wgsl.expected.wgsl
@@ -0,0 +1,37 @@
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn f_mf22_(m : ptr<function, mat2x2<f32>>) -> vec3<f32> {
+  loop {
+    return vec3<f32>(1.0, 1.0, 1.0);
+  }
+  return vec3<f32>(0.0, 0.0, 0.0);
+}
+
+fn main_1() {
+  var param : mat2x2<f32>;
+  var x_38_phi : mat2x2<f32>;
+  let x_34 : f32 = gl_FragCoord.x;
+  x_38_phi = mat2x2<f32>(vec2<f32>(0.0, 0.0), vec2<f32>(0.0, 0.0));
+  if ((x_34 >= 0.0)) {
+    x_38_phi = mat2x2<f32>(vec2<f32>(1.0, 0.0), vec2<f32>(0.0, 1.0));
+  }
+  let x_38 : mat2x2<f32> = x_38_phi;
+  param = (x_38 * x_38);
+  let x_40 : vec3<f32> = f_mf22_(&(param));
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/max-mix-conditional-discard/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/max-mix-conditional-discard/0-opt.spvasm
new file mode 100644
index 0000000..7b3e22d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/max-mix-conditional-discard/0-opt.spvasm
@@ -0,0 +1,87 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %temp "temp"
+               OpName %gv "gv"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %gv RelaxedPrecision
+               OpDecorate %8 RelaxedPrecision
+               OpDecorate %9 RelaxedPrecision
+               OpDecorate %10 RelaxedPrecision
+               OpDecorate %11 RelaxedPrecision
+               OpDecorate %12 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_2 = OpConstant %float 2
+       %bool = OpTypeBool
+%_ptr_Function_int = OpTypePointer Function %int
+    %v4float = OpTypeVector %float 4
+    %float_1 = OpConstant %float 1
+         %28 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %gv = OpVariable %_ptr_Private_v4float Private
+%float_8_60000038 = OpConstant %float 8.60000038
+     %uint_1 = OpConstant %uint 1
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %36 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %14
+         %37 = OpLabel
+       %temp = OpVariable %_ptr_Function_int Function
+         %38 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %39 = OpLoad %float %38
+         %40 = OpFOrdGreaterThan %bool %39 %float_2
+               OpSelectionMerge %41 None
+               OpBranchConditional %40 %42 %41
+         %42 = OpLabel
+          %8 = OpLoad %v4float %gv
+          %9 = OpExtInst %v4float %1 FMix %28 %28 %8
+         %10 = OpCompositeConstruct %v4float %float_8_60000038 %float_8_60000038 %float_8_60000038 %float_8_60000038
+         %11 = OpExtInst %v4float %1 FMax %9 %10
+         %12 = OpCompositeExtract %float %11 1
+         %43 = OpConvertFToS %int %12
+               OpStore %temp %43
+         %44 = OpLoad %int %temp
+         %45 = OpSLessThan %bool %44 %int_150
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %46
+         %47 = OpLabel
+               OpKill
+         %46 = OpLabel
+         %48 = OpLoad %int %temp
+         %49 = OpSLessThan %bool %48 %int_180
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %50
+         %51 = OpLabel
+               OpKill
+         %50 = OpLabel
+               OpBranch %41
+         %41 = OpLabel
+               OpStore %_GLF_color %36
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/max-mix-conditional-discard/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/max-mix-conditional-discard/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..0628a80
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/max-mix-conditional-discard/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,35 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 gv = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int temp = 0;
+  const float x_39 = asfloat(x_5[0].x);
+  if ((x_39 > 2.0f)) {
+    temp = int(max(lerp(float4(1.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f), gv), float4(8.600000381f, 8.600000381f, 8.600000381f, 8.600000381f)).y);
+    if ((temp < 150)) {
+      discard;
+    }
+    if ((temp < 180)) {
+      discard;
+    }
+  }
+  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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/max-mix-conditional-discard/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/max-mix-conditional-discard/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..388fcc6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/max-mix-conditional-discard/0-opt.spvasm.expected.msl
@@ -0,0 +1,41 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4, thread float4* const tint_symbol_5) {
+  int temp = 0;
+  float const x_39 = x_5.injectionSwitch.x;
+  if ((x_39 > 2.0f)) {
+    float4 const x_8 = *(tint_symbol_4);
+    temp = int(fmax(mix(float4(1.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f), x_8), float4(8.600000381f, 8.600000381f, 8.600000381f, 8.600000381f)).y);
+    int const x_44 = temp;
+    if ((x_44 < 150)) {
+      discard_fragment();
+    }
+    int const x_48 = temp;
+    if ((x_48 < 180)) {
+      discard_fragment();
+    }
+  }
+  *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  thread float4 tint_symbol_7 = 0.0f;
+  main_1(x_5, &(tint_symbol_6), &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/max-mix-conditional-discard/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/max-mix-conditional-discard/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..ad29d54
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/max-mix-conditional-discard/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,111 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 65
+; Schema: 0
+               OpCapability Shader
+         %34 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_5 "x_5"
+               OpName %gv "gv"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %temp "temp"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+         %gv = OpVariable %_ptr_Private_v4float Private %9
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %20 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_2 = OpConstant %float 2
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+         %37 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+%float_8_60000038 = OpConstant %float 8.60000038
+         %39 = OpConstantComposite %v4float %float_8_60000038 %float_8_60000038 %float_8_60000038 %float_8_60000038
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+    %float_0 = OpConstant %float 0
+         %52 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %53 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %13
+         %16 = OpLabel
+       %temp = OpVariable %_ptr_Function_int Function %20
+         %24 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %uint_0
+         %25 = OpLoad %float %24
+         %27 = OpFOrdGreaterThan %bool %25 %float_2
+               OpSelectionMerge %29 None
+               OpBranchConditional %27 %30 %29
+         %30 = OpLabel
+         %31 = OpLoad %v4float %gv
+         %35 = OpExtInst %v4float %34 FMix %37 %37 %31
+         %33 = OpExtInst %v4float %34 NMax %35 %39
+         %40 = OpCompositeExtract %float %33 1
+         %32 = OpConvertFToS %int %40
+               OpStore %temp %32
+         %41 = OpLoad %int %temp
+         %43 = OpSLessThan %bool %41 %int_150
+               OpSelectionMerge %44 None
+               OpBranchConditional %43 %45 %44
+         %45 = OpLabel
+               OpKill
+         %44 = OpLabel
+         %46 = OpLoad %int %temp
+         %48 = OpSLessThan %bool %46 %int_180
+               OpSelectionMerge %49 None
+               OpBranchConditional %48 %50 %49
+         %50 = OpLabel
+               OpKill
+         %49 = OpLabel
+               OpBranch %29
+         %29 = OpLabel
+               OpStore %x_GLF_color %52
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %53
+%tint_symbol = OpFunctionParameter %main_out
+         %57 = OpLabel
+         %58 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %58
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %13
+         %60 = OpLabel
+         %61 = OpFunctionCall %void %main_1
+         %63 = OpLoad %v4float %x_GLF_color
+         %64 = OpCompositeConstruct %main_out %63
+         %62 = OpFunctionCall %void %tint_symbol_2 %64
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/max-mix-conditional-discard/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/max-mix-conditional-discard/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..f4bf9c7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/max-mix-conditional-discard/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,40 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> gv : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var temp : i32;
+  let x_39 : f32 = x_5.injectionSwitch.x;
+  if ((x_39 > 2.0)) {
+    let x_8 : vec4<f32> = gv;
+    temp = i32(max(mix(vec4<f32>(1.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0), x_8), vec4<f32>(8.600000381, 8.600000381, 8.600000381, 8.600000381)).y);
+    let x_44 : i32 = temp;
+    if ((x_44 < 150)) {
+      discard;
+    }
+    let x_48 : i32 = temp;
+    if ((x_48 < 180)) {
+      discard;
+    }
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/max-mix-conditional-discard/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/max-mix-conditional-discard/0-opt.wgsl
new file mode 100644
index 0000000..f4bf9c7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/max-mix-conditional-discard/0-opt.wgsl
@@ -0,0 +1,40 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> gv : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var temp : i32;
+  let x_39 : f32 = x_5.injectionSwitch.x;
+  if ((x_39 > 2.0)) {
+    let x_8 : vec4<f32> = gv;
+    temp = i32(max(mix(vec4<f32>(1.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0), x_8), vec4<f32>(8.600000381, 8.600000381, 8.600000381, 8.600000381)).y);
+    let x_44 : i32 = temp;
+    if ((x_44 < 150)) {
+      discard;
+    }
+    let x_48 : i32 = temp;
+    if ((x_48 < 180)) {
+      discard;
+    }
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/max-mix-conditional-discard/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/max-mix-conditional-discard/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..0628a80
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/max-mix-conditional-discard/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,35 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 gv = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int temp = 0;
+  const float x_39 = asfloat(x_5[0].x);
+  if ((x_39 > 2.0f)) {
+    temp = int(max(lerp(float4(1.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f), gv), float4(8.600000381f, 8.600000381f, 8.600000381f, 8.600000381f)).y);
+    if ((temp < 150)) {
+      discard;
+    }
+    if ((temp < 180)) {
+      discard;
+    }
+  }
+  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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/max-mix-conditional-discard/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/max-mix-conditional-discard/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..388fcc6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/max-mix-conditional-discard/0-opt.wgsl.expected.msl
@@ -0,0 +1,41 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4, thread float4* const tint_symbol_5) {
+  int temp = 0;
+  float const x_39 = x_5.injectionSwitch.x;
+  if ((x_39 > 2.0f)) {
+    float4 const x_8 = *(tint_symbol_4);
+    temp = int(fmax(mix(float4(1.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f), x_8), float4(8.600000381f, 8.600000381f, 8.600000381f, 8.600000381f)).y);
+    int const x_44 = temp;
+    if ((x_44 < 150)) {
+      discard_fragment();
+    }
+    int const x_48 = temp;
+    if ((x_48 < 180)) {
+      discard_fragment();
+    }
+  }
+  *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  thread float4 tint_symbol_7 = 0.0f;
+  main_1(x_5, &(tint_symbol_6), &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/max-mix-conditional-discard/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/max-mix-conditional-discard/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..ad29d54
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/max-mix-conditional-discard/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,111 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 65
+; Schema: 0
+               OpCapability Shader
+         %34 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_5 "x_5"
+               OpName %gv "gv"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %temp "temp"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+         %gv = OpVariable %_ptr_Private_v4float Private %9
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %20 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_2 = OpConstant %float 2
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+         %37 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+%float_8_60000038 = OpConstant %float 8.60000038
+         %39 = OpConstantComposite %v4float %float_8_60000038 %float_8_60000038 %float_8_60000038 %float_8_60000038
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+    %float_0 = OpConstant %float 0
+         %52 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %53 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %13
+         %16 = OpLabel
+       %temp = OpVariable %_ptr_Function_int Function %20
+         %24 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %uint_0
+         %25 = OpLoad %float %24
+         %27 = OpFOrdGreaterThan %bool %25 %float_2
+               OpSelectionMerge %29 None
+               OpBranchConditional %27 %30 %29
+         %30 = OpLabel
+         %31 = OpLoad %v4float %gv
+         %35 = OpExtInst %v4float %34 FMix %37 %37 %31
+         %33 = OpExtInst %v4float %34 NMax %35 %39
+         %40 = OpCompositeExtract %float %33 1
+         %32 = OpConvertFToS %int %40
+               OpStore %temp %32
+         %41 = OpLoad %int %temp
+         %43 = OpSLessThan %bool %41 %int_150
+               OpSelectionMerge %44 None
+               OpBranchConditional %43 %45 %44
+         %45 = OpLabel
+               OpKill
+         %44 = OpLabel
+         %46 = OpLoad %int %temp
+         %48 = OpSLessThan %bool %46 %int_180
+               OpSelectionMerge %49 None
+               OpBranchConditional %48 %50 %49
+         %50 = OpLabel
+               OpKill
+         %49 = OpLabel
+               OpBranch %29
+         %29 = OpLabel
+               OpStore %x_GLF_color %52
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %53
+%tint_symbol = OpFunctionParameter %main_out
+         %57 = OpLabel
+         %58 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %58
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %13
+         %60 = OpLabel
+         %61 = OpFunctionCall %void %main_1
+         %63 = OpLoad %v4float %x_GLF_color
+         %64 = OpCompositeConstruct %main_out %63
+         %62 = OpFunctionCall %void %tint_symbol_2 %64
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/max-mix-conditional-discard/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/max-mix-conditional-discard/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..f4bf9c7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/max-mix-conditional-discard/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,40 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> gv : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var temp : i32;
+  let x_39 : f32 = x_5.injectionSwitch.x;
+  if ((x_39 > 2.0)) {
+    let x_8 : vec4<f32> = gv;
+    temp = i32(max(mix(vec4<f32>(1.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0), x_8), vec4<f32>(8.600000381, 8.600000381, 8.600000381, 8.600000381)).y);
+    let x_44 : i32 = temp;
+    if ((x_44 < 150)) {
+      discard;
+    }
+    let x_48 : i32 = temp;
+    if ((x_48 < 180)) {
+      discard;
+    }
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/mix-floor-add/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/mix-floor-add/0-opt.spvasm
new file mode 100644
index 0000000..7c1f536
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/mix-floor-add/0-opt.spvasm
@@ -0,0 +1,44 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %GLF_live6mand_ "GLF_live6mand("
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %6 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+          %9 = OpTypeFunction %v3float
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+ %uint_38730 = OpConstant %uint 38730
+ %uint_63193 = OpConstant %uint 63193
+ %uint_63173 = OpConstant %uint 63173
+         %15 = OpConstantComposite %v3uint %uint_38730 %uint_63193 %uint_63173
+  %float_463 = OpConstant %float 463
+    %float_4 = OpConstant %float 4
+    %float_0 = OpConstant %float 0
+         %19 = OpConstantComposite %v3float %float_463 %float_4 %float_0
+    %float_2 = OpConstant %float 2
+         %21 = OpConstantComposite %v3float %float_2 %float_2 %float_2
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+         %25 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %6
+         %26 = OpLabel
+         %27 = OpFunctionCall %v3float %GLF_live6mand_
+               OpStore %_GLF_color %25
+               OpReturn
+               OpFunctionEnd
+%GLF_live6mand_ = OpFunction %v3float None %9
+         %28 = OpLabel
+         %29 = OpBitcast %v3float %15
+         %30 = OpExtInst %v3float %1 FMix %29 %19 %21
+               OpReturnValue %30
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/mix-floor-add/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/mix-floor-add/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..90b1ba3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/mix-floor-add/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,27 @@
+SKIP: FAILED
+
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn GLF_live6mand_() -> vec3<f32> {
+  return mix(bitcast<vec3<f32>>(vec3<u32>(38730u, 63193u, 63173u)), vec3<f32>(463.0, 4.0, 0.0), vec3<f32>(2.0, 2.0, 2.0));
+}
+
+fn main_1() {
+  let x_27 : vec3<f32> = GLF_live6mand_();
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+Failed to generate: error: Unable to do bitcast to type __vec_3__f32
diff --git a/test/vk-gl-cts/graphicsfuzz/mix-floor-add/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/mix-floor-add/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..46dbf20
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/mix-floor-add/0-opt.spvasm.expected.msl
@@ -0,0 +1,28 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float3 GLF_live6mand_() {
+  return mix(as_type<float3>(uint3(38730u, 63193u, 63173u)), float3(463.0f, 4.0f, 0.0f), float3(2.0f, 2.0f, 2.0f));
+}
+
+void main_1(thread float4* const tint_symbol_4) {
+  float3 const x_27 = GLF_live6mand_();
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/mix-floor-add/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/mix-floor-add/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..02d804c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/mix-floor-add/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,75 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 46
+; Schema: 0
+               OpCapability Shader
+         %13 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %GLF_live6mand_ "GLF_live6mand_"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+    %v3float = OpTypeVector %float 3
+          %8 = OpTypeFunction %v3float
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+ %uint_38730 = OpConstant %uint 38730
+ %uint_63193 = OpConstant %uint 63193
+ %uint_63173 = OpConstant %uint 63173
+         %20 = OpConstantComposite %v3uint %uint_38730 %uint_63193 %uint_63173
+  %float_463 = OpConstant %float 463
+    %float_4 = OpConstant %float 4
+    %float_0 = OpConstant %float 0
+         %24 = OpConstantComposite %v3float %float_463 %float_4 %float_0
+    %float_2 = OpConstant %float 2
+         %26 = OpConstantComposite %v3float %float_2 %float_2 %float_2
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
+    %float_1 = OpConstant %float 1
+         %33 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %34 = OpTypeFunction %void %main_out
+%GLF_live6mand_ = OpFunction %v3float None %8
+         %11 = OpLabel
+         %14 = OpBitcast %v3float %20
+         %12 = OpExtInst %v3float %13 FMix %14 %24 %26
+               OpReturnValue %12
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %27
+         %30 = OpLabel
+         %31 = OpFunctionCall %v3float %GLF_live6mand_
+               OpStore %x_GLF_color %33
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %34
+%tint_symbol = OpFunctionParameter %main_out
+         %38 = OpLabel
+         %39 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %39
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %27
+         %41 = OpLabel
+         %42 = OpFunctionCall %void %main_1
+         %44 = OpLoad %v4float %x_GLF_color
+         %45 = OpCompositeConstruct %main_out %44
+         %43 = OpFunctionCall %void %tint_symbol_2 %45
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/mix-floor-add/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/mix-floor-add/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..99c613e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/mix-floor-add/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,22 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn GLF_live6mand_() -> vec3<f32> {
+  return mix(bitcast<vec3<f32>>(vec3<u32>(38730u, 63193u, 63173u)), vec3<f32>(463.0, 4.0, 0.0), vec3<f32>(2.0, 2.0, 2.0));
+}
+
+fn main_1() {
+  let x_27 : vec3<f32> = GLF_live6mand_();
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/mix-floor-add/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/mix-floor-add/0-opt.wgsl
new file mode 100644
index 0000000..99c613e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/mix-floor-add/0-opt.wgsl
@@ -0,0 +1,22 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn GLF_live6mand_() -> vec3<f32> {
+  return mix(bitcast<vec3<f32>>(vec3<u32>(38730u, 63193u, 63173u)), vec3<f32>(463.0, 4.0, 0.0), vec3<f32>(2.0, 2.0, 2.0));
+}
+
+fn main_1() {
+  let x_27 : vec3<f32> = GLF_live6mand_();
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/mix-floor-add/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/mix-floor-add/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..90b1ba3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/mix-floor-add/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,27 @@
+SKIP: FAILED
+
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn GLF_live6mand_() -> vec3<f32> {
+  return mix(bitcast<vec3<f32>>(vec3<u32>(38730u, 63193u, 63173u)), vec3<f32>(463.0, 4.0, 0.0), vec3<f32>(2.0, 2.0, 2.0));
+}
+
+fn main_1() {
+  let x_27 : vec3<f32> = GLF_live6mand_();
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+Failed to generate: error: Unable to do bitcast to type __vec_3__f32
diff --git a/test/vk-gl-cts/graphicsfuzz/mix-floor-add/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/mix-floor-add/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..46dbf20
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/mix-floor-add/0-opt.wgsl.expected.msl
@@ -0,0 +1,28 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float3 GLF_live6mand_() {
+  return mix(as_type<float3>(uint3(38730u, 63193u, 63173u)), float3(463.0f, 4.0f, 0.0f), float3(2.0f, 2.0f, 2.0f));
+}
+
+void main_1(thread float4* const tint_symbol_4) {
+  float3 const x_27 = GLF_live6mand_();
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/mix-floor-add/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/mix-floor-add/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..02d804c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/mix-floor-add/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,75 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 46
+; Schema: 0
+               OpCapability Shader
+         %13 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %GLF_live6mand_ "GLF_live6mand_"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+    %v3float = OpTypeVector %float 3
+          %8 = OpTypeFunction %v3float
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+ %uint_38730 = OpConstant %uint 38730
+ %uint_63193 = OpConstant %uint 63193
+ %uint_63173 = OpConstant %uint 63173
+         %20 = OpConstantComposite %v3uint %uint_38730 %uint_63193 %uint_63173
+  %float_463 = OpConstant %float 463
+    %float_4 = OpConstant %float 4
+    %float_0 = OpConstant %float 0
+         %24 = OpConstantComposite %v3float %float_463 %float_4 %float_0
+    %float_2 = OpConstant %float 2
+         %26 = OpConstantComposite %v3float %float_2 %float_2 %float_2
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
+    %float_1 = OpConstant %float 1
+         %33 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %34 = OpTypeFunction %void %main_out
+%GLF_live6mand_ = OpFunction %v3float None %8
+         %11 = OpLabel
+         %14 = OpBitcast %v3float %20
+         %12 = OpExtInst %v3float %13 FMix %14 %24 %26
+               OpReturnValue %12
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %27
+         %30 = OpLabel
+         %31 = OpFunctionCall %v3float %GLF_live6mand_
+               OpStore %x_GLF_color %33
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %34
+%tint_symbol = OpFunctionParameter %main_out
+         %38 = OpLabel
+         %39 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %39
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %27
+         %41 = OpLabel
+         %42 = OpFunctionCall %void %main_1
+         %44 = OpLoad %v4float %x_GLF_color
+         %45 = OpCompositeConstruct %main_out %44
+         %43 = OpFunctionCall %void %tint_symbol_2 %45
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/mix-floor-add/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/mix-floor-add/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..99c613e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/mix-floor-add/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,22 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn GLF_live6mand_() -> vec3<f32> {
+  return mix(bitcast<vec3<f32>>(vec3<u32>(38730u, 63193u, 63173u)), vec3<f32>(463.0, 4.0, 0.0), vec3<f32>(2.0, 2.0, 2.0));
+}
+
+fn main_1() {
+  let x_27 : vec3<f32> = GLF_live6mand_();
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.spvasm b/test/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.spvasm
new file mode 100644
index 0000000..0ec3da2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.spvasm
@@ -0,0 +1,122 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %m44 "m44"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %8 RelaxedPrecision
+               OpDecorate %9 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %10 RelaxedPrecision
+               OpDecorate %11 RelaxedPrecision
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%mat4v4float = OpTypeMatrix %v4float 4
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+    %float_4 = OpConstant %float 4
+         %21 = OpConstantComposite %v4float %float_1 %float_2 %float_3 %float_4
+    %float_5 = OpConstant %float 5
+    %float_6 = OpConstant %float 6
+    %float_7 = OpConstant %float 7
+    %float_8 = OpConstant %float 8
+         %26 = OpConstantComposite %v4float %float_5 %float_6 %float_7 %float_8
+    %float_9 = OpConstant %float 9
+   %float_10 = OpConstant %float 10
+   %float_11 = OpConstant %float 11
+   %float_12 = OpConstant %float 12
+         %31 = OpConstantComposite %v4float %float_9 %float_10 %float_11 %float_12
+   %float_13 = OpConstant %float 13
+   %float_14 = OpConstant %float 14
+   %float_15 = OpConstant %float 15
+   %float_16 = OpConstant %float 16
+         %36 = OpConstantComposite %v4float %float_13 %float_14 %float_15 %float_16
+         %37 = OpConstantComposite %mat4v4float %21 %26 %31 %36
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+       %bool = OpTypeBool
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_0 = OpConstant %float 0
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+         %50 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_2 = OpConstant %int 2
+     %uint_2 = OpConstant %uint 2
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+%_ptr_Function_mat4v4float = OpTypePointer Function %mat4v4float
+       %main = OpFunction %void None %13
+         %56 = OpLabel
+        %m44 = OpVariable %_ptr_Function_mat4v4float Function
+               OpStore %m44 %37
+               OpBranch %57
+         %57 = OpLabel
+         %10 = OpPhi %int %int_0 %56 %9 %58
+         %59 = OpSLessThan %bool %10 %int_4
+               OpLoopMerge %60 %58 None
+               OpBranchConditional %59 %61 %60
+         %61 = OpLabel
+         %62 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %63 = OpLoad %float %62
+         %64 = OpFOrdLessThan %bool %63 %float_0
+               OpSelectionMerge %65 None
+               OpBranchConditional %64 %66 %65
+         %66 = OpLabel
+               OpBranch %60
+         %65 = OpLabel
+               OpBranch %67
+         %67 = OpLabel
+         %11 = OpPhi %int %int_0 %65 %8 %68
+         %69 = OpSLessThan %bool %11 %int_4
+               OpLoopMerge %70 %68 None
+               OpBranchConditional %69 %68 %70
+         %68 = OpLabel
+         %71 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %72 = OpLoad %float %71
+         %73 = OpAccessChain %_ptr_Function_float %m44 %10 %11
+         %74 = OpLoad %float %73
+         %75 = OpFAdd %float %74 %72
+               OpStore %73 %75
+          %8 = OpIAdd %int %11 %int_1
+               OpBranch %67
+         %70 = OpLabel
+               OpBranch %58
+         %58 = OpLabel
+          %9 = OpIAdd %int %10 %int_1
+               OpBranch %57
+         %60 = OpLabel
+         %76 = OpAccessChain %_ptr_Function_float %m44 %int_1 %uint_1
+         %77 = OpLoad %float %76
+         %78 = OpFSub %float %77 %float_6
+         %79 = OpCompositeInsert %v4float %78 %50 0
+         %80 = OpAccessChain %_ptr_Function_float %m44 %int_2 %uint_2
+         %81 = OpLoad %float %80
+         %82 = OpFSub %float %81 %float_11
+         %83 = OpCompositeInsert %v4float %82 %79 3
+               OpStore %_GLF_color %83
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..69942c8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.spvasm.expected.hlsl
@@ -0,0 +1,79 @@
+void set_float4(inout float4 vec, int idx, float val) {
+  vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
+}
+
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+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() {
+  float4x4 m44 = float4x4(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  int x_10_phi = 0;
+  m44 = float4x4(float4(1.0f, 2.0f, 3.0f, 4.0f), float4(5.0f, 6.0f, 7.0f, 8.0f), float4(9.0f, 10.0f, 11.0f, 12.0f), float4(13.0f, 14.0f, 15.0f, 16.0f));
+  x_10_phi = 0;
+  while (true) {
+    int x_9 = 0;
+    int x_11_phi = 0;
+    const int x_10 = x_10_phi;
+    if ((x_10 < 4)) {
+    } else {
+      break;
+    }
+    const float x_63 = gl_FragCoord.y;
+    if ((x_63 < 0.0f)) {
+      break;
+    }
+    x_11_phi = 0;
+    while (true) {
+      int x_8 = 0;
+      const int x_11 = x_11_phi;
+      if ((x_11 < 4)) {
+      } else {
+        break;
+      }
+      {
+        const float x_72 = asfloat(x_7[0].x);
+        const int x_73_save = x_10;
+        const int x_73_save_1 = x_11;
+        const float x_74 = m44[x_73_save][x_73_save_1];
+        set_float4(m44[x_73_save], x_73_save_1, (x_74 + x_72));
+        x_8 = (x_11 + 1);
+        x_11_phi = x_8;
+      }
+    }
+    {
+      x_9 = (x_10 + 1);
+      x_10_phi = x_9;
+    }
+  }
+  const float x_77 = m44[1].y;
+  float4 x_79_1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  x_79_1.x = (x_77 - 6.0f);
+  const float4 x_79 = x_79_1;
+  const float x_81 = m44[2].z;
+  float4 x_83_1 = x_79;
+  x_83_1.w = (x_81 - 11.0f);
+  x_GLF_color = x_83_1;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.spvasm.expected.msl
new file mode 100644
index 0000000..998e2de
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.spvasm.expected.msl
@@ -0,0 +1,75 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float4x4 m44 = float4x4(0.0f);
+  int x_10_phi = 0;
+  m44 = float4x4(float4(1.0f, 2.0f, 3.0f, 4.0f), float4(5.0f, 6.0f, 7.0f, 8.0f), float4(9.0f, 10.0f, 11.0f, 12.0f), float4(13.0f, 14.0f, 15.0f, 16.0f));
+  x_10_phi = 0;
+  while (true) {
+    int x_9 = 0;
+    int x_11_phi = 0;
+    int const x_10 = x_10_phi;
+    if ((x_10 < 4)) {
+    } else {
+      break;
+    }
+    float const x_63 = (*(tint_symbol_5)).y;
+    if ((x_63 < 0.0f)) {
+      break;
+    }
+    x_11_phi = 0;
+    while (true) {
+      int x_8 = 0;
+      int const x_11 = x_11_phi;
+      if ((x_11 < 4)) {
+      } else {
+        break;
+      }
+      {
+        float const x_72 = x_7.one;
+        int const x_73_save = x_10;
+        int const x_73_save_1 = x_11;
+        float const x_74 = m44[x_73_save][x_73_save_1];
+        m44[x_73_save][x_73_save_1] = (x_74 + x_72);
+        x_8 = (x_11 + 1);
+        x_11_phi = x_8;
+      }
+    }
+    {
+      x_9 = (x_10 + 1);
+      x_10_phi = x_9;
+    }
+  }
+  float const x_77 = m44[1].y;
+  float4 x_79_1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  x_79_1.x = (x_77 - 6.0f);
+  float4 const x_79 = x_79_1;
+  float const x_81 = m44[2].z;
+  float4 x_83_1 = x_79;
+  x_83_1.w = (x_81 - 11.0f);
+  float4 const x_83 = x_83_1;
+  *(tint_symbol_6) = x_83;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_7, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..312327e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.spvasm.expected.spvasm
@@ -0,0 +1,202 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 124
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %m44 "m44"
+               OpName %x_10_phi "x_10_phi"
+               OpName %x_9 "x_9"
+               OpName %x_11_phi "x_11_phi"
+               OpName %x_8 "x_8"
+               OpName %x_79_1 "x_79_1"
+               OpName %x_83_1 "x_83_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+%mat4v4float = OpTypeMatrix %v4float 4
+%_ptr_Function_mat4v4float = OpTypePointer Function %mat4v4float
+         %21 = OpConstantNull %mat4v4float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %25 = OpConstantNull %int
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+    %float_4 = OpConstant %float 4
+         %30 = OpConstantComposite %v4float %float_1 %float_2 %float_3 %float_4
+    %float_5 = OpConstant %float 5
+    %float_6 = OpConstant %float 6
+    %float_7 = OpConstant %float 7
+    %float_8 = OpConstant %float 8
+         %35 = OpConstantComposite %v4float %float_5 %float_6 %float_7 %float_8
+    %float_9 = OpConstant %float 9
+   %float_10 = OpConstant %float 10
+   %float_11 = OpConstant %float 11
+   %float_12 = OpConstant %float 12
+         %40 = OpConstantComposite %v4float %float_9 %float_10 %float_11 %float_12
+   %float_13 = OpConstant %float 13
+   %float_14 = OpConstant %float 14
+   %float_15 = OpConstant %float 15
+   %float_16 = OpConstant %float 16
+         %45 = OpConstantComposite %v4float %float_13 %float_14 %float_15 %float_16
+         %46 = OpConstantComposite %mat4v4float %30 %35 %40 %45
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_1 = OpConstant %int 1
+         %96 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+      %int_2 = OpConstant %int 2
+     %uint_2 = OpConstant %uint 2
+     %uint_3 = OpConstant %uint 3
+   %main_out = OpTypeStruct %v4float
+        %111 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+        %m44 = OpVariable %_ptr_Function_mat4v4float Function %21
+   %x_10_phi = OpVariable %_ptr_Function_int Function %25
+        %x_9 = OpVariable %_ptr_Function_int Function %25
+   %x_11_phi = OpVariable %_ptr_Function_int Function %25
+        %x_8 = OpVariable %_ptr_Function_int Function %25
+     %x_79_1 = OpVariable %_ptr_Function_v4float Function %5
+     %x_83_1 = OpVariable %_ptr_Function_v4float Function %5
+               OpStore %m44 %46
+               OpStore %x_10_phi %int_0
+               OpBranch %48
+         %48 = OpLabel
+               OpLoopMerge %49 %50 None
+               OpBranch %51
+         %51 = OpLabel
+         %54 = OpLoad %int %x_10_phi
+         %56 = OpSLessThan %bool %54 %int_4
+               OpSelectionMerge %58 None
+               OpBranchConditional %56 %59 %60
+         %59 = OpLabel
+               OpBranch %58
+         %60 = OpLabel
+               OpBranch %49
+         %58 = OpLabel
+         %64 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %65 = OpLoad %float %64
+         %67 = OpFOrdLessThan %bool %65 %float_0
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %68
+         %69 = OpLabel
+               OpBranch %49
+         %68 = OpLabel
+               OpStore %x_11_phi %int_0
+               OpBranch %70
+         %70 = OpLabel
+               OpLoopMerge %71 %72 None
+               OpBranch %73
+         %73 = OpLabel
+         %75 = OpLoad %int %x_11_phi
+         %76 = OpSLessThan %bool %75 %int_4
+               OpSelectionMerge %77 None
+               OpBranchConditional %76 %78 %79
+         %78 = OpLabel
+               OpBranch %77
+         %79 = OpLabel
+               OpBranch %71
+         %77 = OpLabel
+               OpBranch %72
+         %72 = OpLabel
+         %82 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0
+         %83 = OpLoad %float %82
+         %85 = OpAccessChain %_ptr_Function_float %m44 %54 %75
+         %86 = OpLoad %float %85
+         %87 = OpAccessChain %_ptr_Function_float %m44 %54 %75
+         %88 = OpFAdd %float %86 %83
+               OpStore %87 %88
+         %90 = OpIAdd %int %75 %int_1
+               OpStore %x_8 %90
+         %91 = OpLoad %int %x_8
+               OpStore %x_11_phi %91
+               OpBranch %70
+         %71 = OpLabel
+               OpBranch %50
+         %50 = OpLabel
+         %92 = OpIAdd %int %54 %int_1
+               OpStore %x_9 %92
+         %93 = OpLoad %int %x_9
+               OpStore %x_10_phi %93
+               OpBranch %48
+         %49 = OpLabel
+         %94 = OpAccessChain %_ptr_Function_float %m44 %int_1 %uint_1
+         %95 = OpLoad %float %94
+               OpStore %x_79_1 %96
+         %99 = OpAccessChain %_ptr_Function_float %x_79_1 %uint_0
+        %100 = OpFSub %float %95 %float_6
+               OpStore %99 %100
+        %101 = OpLoad %v4float %x_79_1
+        %104 = OpAccessChain %_ptr_Function_float %m44 %int_2 %uint_2
+        %105 = OpLoad %float %104
+               OpStore %x_83_1 %101
+        %108 = OpAccessChain %_ptr_Function_float %x_83_1 %uint_3
+        %109 = OpFSub %float %105 %float_11
+               OpStore %108 %109
+        %110 = OpLoad %v4float %x_83_1
+               OpStore %x_GLF_color %110
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %111
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %115 = OpLabel
+        %116 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %116
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+        %118 = OpLabel
+        %119 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %119
+        %120 = OpFunctionCall %void %main_1
+        %122 = OpLoad %v4float %x_GLF_color
+        %123 = OpCompositeConstruct %main_out %122
+        %121 = OpFunctionCall %void %tint_symbol_3 %123
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..8f6639e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.spvasm.expected.wgsl
@@ -0,0 +1,75 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m44 : mat4x4<f32>;
+  var x_10_phi : i32;
+  m44 = mat4x4<f32>(vec4<f32>(1.0, 2.0, 3.0, 4.0), vec4<f32>(5.0, 6.0, 7.0, 8.0), vec4<f32>(9.0, 10.0, 11.0, 12.0), vec4<f32>(13.0, 14.0, 15.0, 16.0));
+  x_10_phi = 0;
+  loop {
+    var x_9 : i32;
+    var x_11_phi : i32;
+    let x_10 : i32 = x_10_phi;
+    if ((x_10 < 4)) {
+    } else {
+      break;
+    }
+    let x_63 : f32 = gl_FragCoord.y;
+    if ((x_63 < 0.0)) {
+      break;
+    }
+    x_11_phi = 0;
+    loop {
+      var x_8 : i32;
+      let x_11 : i32 = x_11_phi;
+      if ((x_11 < 4)) {
+      } else {
+        break;
+      }
+
+      continuing {
+        let x_72 : f32 = x_7.one;
+        let x_73 : ptr<function, f32> = &(m44[x_10][x_11]);
+        let x_74 : f32 = *(x_73);
+        *(x_73) = (x_74 + x_72);
+        x_8 = (x_11 + 1);
+        x_11_phi = x_8;
+      }
+    }
+
+    continuing {
+      x_9 = (x_10 + 1);
+      x_10_phi = x_9;
+    }
+  }
+  let x_77 : f32 = m44[1].y;
+  var x_79_1 : vec4<f32> = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  x_79_1.x = (x_77 - 6.0);
+  let x_79 : vec4<f32> = x_79_1;
+  let x_81 : f32 = m44[2].z;
+  var x_83_1 : vec4<f32> = x_79;
+  x_83_1.w = (x_81 - 11.0);
+  let x_83 : vec4<f32> = x_83_1;
+  x_GLF_color = x_83;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.wgsl b/test/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.wgsl
new file mode 100644
index 0000000..8f6639e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.wgsl
@@ -0,0 +1,75 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m44 : mat4x4<f32>;
+  var x_10_phi : i32;
+  m44 = mat4x4<f32>(vec4<f32>(1.0, 2.0, 3.0, 4.0), vec4<f32>(5.0, 6.0, 7.0, 8.0), vec4<f32>(9.0, 10.0, 11.0, 12.0), vec4<f32>(13.0, 14.0, 15.0, 16.0));
+  x_10_phi = 0;
+  loop {
+    var x_9 : i32;
+    var x_11_phi : i32;
+    let x_10 : i32 = x_10_phi;
+    if ((x_10 < 4)) {
+    } else {
+      break;
+    }
+    let x_63 : f32 = gl_FragCoord.y;
+    if ((x_63 < 0.0)) {
+      break;
+    }
+    x_11_phi = 0;
+    loop {
+      var x_8 : i32;
+      let x_11 : i32 = x_11_phi;
+      if ((x_11 < 4)) {
+      } else {
+        break;
+      }
+
+      continuing {
+        let x_72 : f32 = x_7.one;
+        let x_73 : ptr<function, f32> = &(m44[x_10][x_11]);
+        let x_74 : f32 = *(x_73);
+        *(x_73) = (x_74 + x_72);
+        x_8 = (x_11 + 1);
+        x_11_phi = x_8;
+      }
+    }
+
+    continuing {
+      x_9 = (x_10 + 1);
+      x_10_phi = x_9;
+    }
+  }
+  let x_77 : f32 = m44[1].y;
+  var x_79_1 : vec4<f32> = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  x_79_1.x = (x_77 - 6.0);
+  let x_79 : vec4<f32> = x_79_1;
+  let x_81 : f32 = m44[2].z;
+  var x_83_1 : vec4<f32> = x_79;
+  x_83_1.w = (x_81 - 11.0);
+  let x_83 : vec4<f32> = x_83_1;
+  x_GLF_color = x_83;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..69942c8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.wgsl.expected.hlsl
@@ -0,0 +1,79 @@
+void set_float4(inout float4 vec, int idx, float val) {
+  vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
+}
+
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+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() {
+  float4x4 m44 = float4x4(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  int x_10_phi = 0;
+  m44 = float4x4(float4(1.0f, 2.0f, 3.0f, 4.0f), float4(5.0f, 6.0f, 7.0f, 8.0f), float4(9.0f, 10.0f, 11.0f, 12.0f), float4(13.0f, 14.0f, 15.0f, 16.0f));
+  x_10_phi = 0;
+  while (true) {
+    int x_9 = 0;
+    int x_11_phi = 0;
+    const int x_10 = x_10_phi;
+    if ((x_10 < 4)) {
+    } else {
+      break;
+    }
+    const float x_63 = gl_FragCoord.y;
+    if ((x_63 < 0.0f)) {
+      break;
+    }
+    x_11_phi = 0;
+    while (true) {
+      int x_8 = 0;
+      const int x_11 = x_11_phi;
+      if ((x_11 < 4)) {
+      } else {
+        break;
+      }
+      {
+        const float x_72 = asfloat(x_7[0].x);
+        const int x_73_save = x_10;
+        const int x_73_save_1 = x_11;
+        const float x_74 = m44[x_73_save][x_73_save_1];
+        set_float4(m44[x_73_save], x_73_save_1, (x_74 + x_72));
+        x_8 = (x_11 + 1);
+        x_11_phi = x_8;
+      }
+    }
+    {
+      x_9 = (x_10 + 1);
+      x_10_phi = x_9;
+    }
+  }
+  const float x_77 = m44[1].y;
+  float4 x_79_1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  x_79_1.x = (x_77 - 6.0f);
+  const float4 x_79 = x_79_1;
+  const float x_81 = m44[2].z;
+  float4 x_83_1 = x_79;
+  x_83_1.w = (x_81 - 11.0f);
+  x_GLF_color = x_83_1;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.wgsl.expected.msl
new file mode 100644
index 0000000..998e2de
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.wgsl.expected.msl
@@ -0,0 +1,75 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float one;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float4x4 m44 = float4x4(0.0f);
+  int x_10_phi = 0;
+  m44 = float4x4(float4(1.0f, 2.0f, 3.0f, 4.0f), float4(5.0f, 6.0f, 7.0f, 8.0f), float4(9.0f, 10.0f, 11.0f, 12.0f), float4(13.0f, 14.0f, 15.0f, 16.0f));
+  x_10_phi = 0;
+  while (true) {
+    int x_9 = 0;
+    int x_11_phi = 0;
+    int const x_10 = x_10_phi;
+    if ((x_10 < 4)) {
+    } else {
+      break;
+    }
+    float const x_63 = (*(tint_symbol_5)).y;
+    if ((x_63 < 0.0f)) {
+      break;
+    }
+    x_11_phi = 0;
+    while (true) {
+      int x_8 = 0;
+      int const x_11 = x_11_phi;
+      if ((x_11 < 4)) {
+      } else {
+        break;
+      }
+      {
+        float const x_72 = x_7.one;
+        int const x_73_save = x_10;
+        int const x_73_save_1 = x_11;
+        float const x_74 = m44[x_73_save][x_73_save_1];
+        m44[x_73_save][x_73_save_1] = (x_74 + x_72);
+        x_8 = (x_11 + 1);
+        x_11_phi = x_8;
+      }
+    }
+    {
+      x_9 = (x_10 + 1);
+      x_10_phi = x_9;
+    }
+  }
+  float const x_77 = m44[1].y;
+  float4 x_79_1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  x_79_1.x = (x_77 - 6.0f);
+  float4 const x_79 = x_79_1;
+  float const x_81 = m44[2].z;
+  float4 x_83_1 = x_79;
+  x_83_1.w = (x_81 - 11.0f);
+  float4 const x_83 = x_83_1;
+  *(tint_symbol_6) = x_83;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_7, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..312327e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.wgsl.expected.spvasm
@@ -0,0 +1,202 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 124
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "one"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %m44 "m44"
+               OpName %x_10_phi "x_10_phi"
+               OpName %x_9 "x_9"
+               OpName %x_11_phi "x_11_phi"
+               OpName %x_8 "x_8"
+               OpName %x_79_1 "x_79_1"
+               OpName %x_83_1 "x_83_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+%mat4v4float = OpTypeMatrix %v4float 4
+%_ptr_Function_mat4v4float = OpTypePointer Function %mat4v4float
+         %21 = OpConstantNull %mat4v4float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %25 = OpConstantNull %int
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+    %float_4 = OpConstant %float 4
+         %30 = OpConstantComposite %v4float %float_1 %float_2 %float_3 %float_4
+    %float_5 = OpConstant %float 5
+    %float_6 = OpConstant %float 6
+    %float_7 = OpConstant %float 7
+    %float_8 = OpConstant %float 8
+         %35 = OpConstantComposite %v4float %float_5 %float_6 %float_7 %float_8
+    %float_9 = OpConstant %float 9
+   %float_10 = OpConstant %float 10
+   %float_11 = OpConstant %float 11
+   %float_12 = OpConstant %float 12
+         %40 = OpConstantComposite %v4float %float_9 %float_10 %float_11 %float_12
+   %float_13 = OpConstant %float 13
+   %float_14 = OpConstant %float 14
+   %float_15 = OpConstant %float 15
+   %float_16 = OpConstant %float 16
+         %45 = OpConstantComposite %v4float %float_13 %float_14 %float_15 %float_16
+         %46 = OpConstantComposite %mat4v4float %30 %35 %40 %45
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_1 = OpConstant %int 1
+         %96 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+      %int_2 = OpConstant %int 2
+     %uint_2 = OpConstant %uint 2
+     %uint_3 = OpConstant %uint 3
+   %main_out = OpTypeStruct %v4float
+        %111 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+        %m44 = OpVariable %_ptr_Function_mat4v4float Function %21
+   %x_10_phi = OpVariable %_ptr_Function_int Function %25
+        %x_9 = OpVariable %_ptr_Function_int Function %25
+   %x_11_phi = OpVariable %_ptr_Function_int Function %25
+        %x_8 = OpVariable %_ptr_Function_int Function %25
+     %x_79_1 = OpVariable %_ptr_Function_v4float Function %5
+     %x_83_1 = OpVariable %_ptr_Function_v4float Function %5
+               OpStore %m44 %46
+               OpStore %x_10_phi %int_0
+               OpBranch %48
+         %48 = OpLabel
+               OpLoopMerge %49 %50 None
+               OpBranch %51
+         %51 = OpLabel
+         %54 = OpLoad %int %x_10_phi
+         %56 = OpSLessThan %bool %54 %int_4
+               OpSelectionMerge %58 None
+               OpBranchConditional %56 %59 %60
+         %59 = OpLabel
+               OpBranch %58
+         %60 = OpLabel
+               OpBranch %49
+         %58 = OpLabel
+         %64 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %65 = OpLoad %float %64
+         %67 = OpFOrdLessThan %bool %65 %float_0
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %68
+         %69 = OpLabel
+               OpBranch %49
+         %68 = OpLabel
+               OpStore %x_11_phi %int_0
+               OpBranch %70
+         %70 = OpLabel
+               OpLoopMerge %71 %72 None
+               OpBranch %73
+         %73 = OpLabel
+         %75 = OpLoad %int %x_11_phi
+         %76 = OpSLessThan %bool %75 %int_4
+               OpSelectionMerge %77 None
+               OpBranchConditional %76 %78 %79
+         %78 = OpLabel
+               OpBranch %77
+         %79 = OpLabel
+               OpBranch %71
+         %77 = OpLabel
+               OpBranch %72
+         %72 = OpLabel
+         %82 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0
+         %83 = OpLoad %float %82
+         %85 = OpAccessChain %_ptr_Function_float %m44 %54 %75
+         %86 = OpLoad %float %85
+         %87 = OpAccessChain %_ptr_Function_float %m44 %54 %75
+         %88 = OpFAdd %float %86 %83
+               OpStore %87 %88
+         %90 = OpIAdd %int %75 %int_1
+               OpStore %x_8 %90
+         %91 = OpLoad %int %x_8
+               OpStore %x_11_phi %91
+               OpBranch %70
+         %71 = OpLabel
+               OpBranch %50
+         %50 = OpLabel
+         %92 = OpIAdd %int %54 %int_1
+               OpStore %x_9 %92
+         %93 = OpLoad %int %x_9
+               OpStore %x_10_phi %93
+               OpBranch %48
+         %49 = OpLabel
+         %94 = OpAccessChain %_ptr_Function_float %m44 %int_1 %uint_1
+         %95 = OpLoad %float %94
+               OpStore %x_79_1 %96
+         %99 = OpAccessChain %_ptr_Function_float %x_79_1 %uint_0
+        %100 = OpFSub %float %95 %float_6
+               OpStore %99 %100
+        %101 = OpLoad %v4float %x_79_1
+        %104 = OpAccessChain %_ptr_Function_float %m44 %int_2 %uint_2
+        %105 = OpLoad %float %104
+               OpStore %x_83_1 %101
+        %108 = OpAccessChain %_ptr_Function_float %x_83_1 %uint_3
+        %109 = OpFSub %float %105 %float_11
+               OpStore %108 %109
+        %110 = OpLoad %v4float %x_83_1
+               OpStore %x_GLF_color %110
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %111
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %115 = OpLabel
+        %116 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %116
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+        %118 = OpLabel
+        %119 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %119
+        %120 = OpFunctionCall %void %main_1
+        %122 = OpLoad %v4float %x_GLF_color
+        %123 = OpCompositeConstruct %main_out %122
+        %121 = OpFunctionCall %void %tint_symbol_3 %123
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..8f6639e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-for-break-mat-color/0.wgsl.expected.wgsl
@@ -0,0 +1,75 @@
+[[block]]
+struct buf0 {
+  one : f32;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m44 : mat4x4<f32>;
+  var x_10_phi : i32;
+  m44 = mat4x4<f32>(vec4<f32>(1.0, 2.0, 3.0, 4.0), vec4<f32>(5.0, 6.0, 7.0, 8.0), vec4<f32>(9.0, 10.0, 11.0, 12.0), vec4<f32>(13.0, 14.0, 15.0, 16.0));
+  x_10_phi = 0;
+  loop {
+    var x_9 : i32;
+    var x_11_phi : i32;
+    let x_10 : i32 = x_10_phi;
+    if ((x_10 < 4)) {
+    } else {
+      break;
+    }
+    let x_63 : f32 = gl_FragCoord.y;
+    if ((x_63 < 0.0)) {
+      break;
+    }
+    x_11_phi = 0;
+    loop {
+      var x_8 : i32;
+      let x_11 : i32 = x_11_phi;
+      if ((x_11 < 4)) {
+      } else {
+        break;
+      }
+
+      continuing {
+        let x_72 : f32 = x_7.one;
+        let x_73 : ptr<function, f32> = &(m44[x_10][x_11]);
+        let x_74 : f32 = *(x_73);
+        *(x_73) = (x_74 + x_72);
+        x_8 = (x_11 + 1);
+        x_11_phi = x_8;
+      }
+    }
+
+    continuing {
+      x_9 = (x_10 + 1);
+      x_10_phi = x_9;
+    }
+  }
+  let x_77 : f32 = m44[1].y;
+  var x_79_1 : vec4<f32> = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  x_79_1.x = (x_77 - 6.0);
+  let x_79 : vec4<f32> = x_79_1;
+  let x_81 : f32 = m44[2].z;
+  var x_83_1 : vec4<f32> = x_79;
+  x_83_1.w = (x_81 - 11.0);
+  let x_83 : vec4<f32> = x_83_1;
+  x_GLF_color = x_83;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-for-loops-with-return/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/nested-for-loops-with-return/0-opt.spvasm
new file mode 100644
index 0000000..f854eb0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-for-loops-with-return/0-opt.spvasm
@@ -0,0 +1,86 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %nb_mod_f1_ "nb_mod(f1;"
+               OpName %limit "limit"
+               OpName %_injected_loop_counter "_injected_loop_counter"
+               OpName %_injected_loop_counter_0 "_injected_loop_counter"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %param "param"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_injected_loop_counter RelaxedPrecision
+               OpDecorate %_injected_loop_counter_0 RelaxedPrecision
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+         %14 = OpTypeFunction %float %_ptr_Function_float
+    %float_1 = OpConstant %float 1
+       %bool = OpTypeBool
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+      %int_1 = OpConstant %int 1
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %29 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %30 = OpUndef %int
+       %true = OpConstantTrue %bool
+       %main = OpFunction %void None %11
+         %32 = OpLabel
+      %param = OpVariable %_ptr_Function_float Function
+         %33 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %34 = OpLoad %float %33
+               OpStore %param %34
+         %35 = OpFunctionCall %float %nb_mod_f1_ %param
+               OpStore %_GLF_color %29
+               OpReturn
+               OpFunctionEnd
+ %nb_mod_f1_ = OpFunction %float None %14
+      %limit = OpFunctionParameter %_ptr_Function_float
+         %36 = OpLabel
+%_injected_loop_counter = OpVariable %_ptr_Function_int Function
+%_injected_loop_counter_0 = OpVariable %_ptr_Function_int Function
+         %37 = OpLoad %float %limit
+         %38 = OpFOrdGreaterThanEqual %bool %float_1 %37
+               OpSelectionMerge %39 None
+               OpBranchConditional %38 %40 %39
+         %40 = OpLabel
+               OpReturnValue %float_1
+         %39 = OpLabel
+               OpStore %_injected_loop_counter %int_0
+               OpBranch %41
+         %41 = OpLabel
+         %42 = OpSLessThan %bool %int_0 %int_2
+               OpLoopMerge %43 %44 None
+               OpBranch %45
+         %45 = OpLabel
+               OpStore %_injected_loop_counter_0 %int_0
+               OpBranch %46
+         %46 = OpLabel
+         %47 = OpSLessThan %bool %int_0 %int_1
+               OpLoopMerge %44 %48 None
+               OpBranch %49
+         %49 = OpLabel
+               OpReturnValue %float_1
+         %48 = OpLabel
+               OpBranch %46
+         %44 = OpLabel
+               OpBranch %41
+         %43 = OpLabel
+               OpUnreachable
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-for-loops-with-return/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/nested-for-loops-with-return/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..861538a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-for-loops-with-return/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,49 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float nb_mod_f1_(inout float limit) {
+  int x_injected_loop_counter = 0;
+  int x_injected_loop_counter_1 = 0;
+  const float x_37 = limit;
+  if ((1.0f >= x_37)) {
+    return 1.0f;
+  }
+  x_injected_loop_counter = 0;
+  while (true) {
+    const bool x_42 = (0 < 2);
+    x_injected_loop_counter_1 = 0;
+    while (true) {
+      const bool x_47 = (0 < 1);
+      return 1.0f;
+    }
+  }
+  return 0.0f;
+}
+
+void main_1() {
+  float param = 0.0f;
+  const float x_34 = gl_FragCoord.x;
+  param = x_34;
+  const float x_35 = nb_mod_f1_(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_1 {
+  float4 gl_FragCoord_param : SV_Position;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-for-loops-with-return/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/nested-for-loops-with-return/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..2455128
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-for-loops-with-return/0-opt.spvasm.expected.msl
@@ -0,0 +1,48 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float nb_mod_f1_(thread float* const limit) {
+  int x_injected_loop_counter = 0;
+  int x_injected_loop_counter_1 = 0;
+  float const x_37 = *(limit);
+  if ((1.0f >= x_37)) {
+    return 1.0f;
+  }
+  x_injected_loop_counter = 0;
+  while (true) {
+    bool const x_42 = (0 < 2);
+    x_injected_loop_counter_1 = 0;
+    while (true) {
+      bool const x_47 = (0 < 1);
+      return 1.0f;
+    }
+  }
+  return 0.0f;
+}
+
+void main_1(thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float param = 0.0f;
+  float const x_34 = (*(tint_symbol_5)).x;
+  param = x_34;
+  float const x_35 = nb_mod_f1_(&(param));
+  *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(&(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-for-loops-with-return/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/nested-for-loops-with-return/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..eca9c85
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-for-loops-with-return/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,120 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 69
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %nb_mod_f1_ "nb_mod_f1_"
+               OpName %limit "limit"
+               OpName %x_injected_loop_counter "x_injected_loop_counter"
+               OpName %x_injected_loop_counter_1 "x_injected_loop_counter_1"
+               OpName %main_1 "main_1"
+               OpName %param "param"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Function_float = OpTypePointer Function %float
+         %11 = OpTypeFunction %float %_ptr_Function_float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %19 = OpConstantNull %int
+    %float_1 = OpConstant %float 1
+       %bool = OpTypeBool
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+       %void = OpTypeVoid
+         %42 = OpTypeFunction %void
+         %47 = OpConstantNull %float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+         %55 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %56 = OpTypeFunction %void %main_out
+ %nb_mod_f1_ = OpFunction %float None %11
+      %limit = OpFunctionParameter %_ptr_Function_float
+         %15 = OpLabel
+%x_injected_loop_counter = OpVariable %_ptr_Function_int Function %19
+%x_injected_loop_counter_1 = OpVariable %_ptr_Function_int Function %19
+         %22 = OpLoad %float %limit
+         %24 = OpFOrdGreaterThanEqual %bool %float_1 %22
+               OpSelectionMerge %26 None
+               OpBranchConditional %24 %27 %26
+         %27 = OpLabel
+               OpReturnValue %float_1
+         %26 = OpLabel
+               OpStore %x_injected_loop_counter %int_0
+               OpBranch %29
+         %29 = OpLabel
+               OpLoopMerge %30 %31 None
+               OpBranch %32
+         %32 = OpLabel
+         %34 = OpSLessThan %bool %int_0 %int_2
+               OpStore %x_injected_loop_counter_1 %int_0
+               OpBranch %35
+         %35 = OpLabel
+               OpLoopMerge %36 %37 None
+               OpBranch %38
+         %38 = OpLabel
+         %40 = OpSLessThan %bool %int_0 %int_1
+               OpReturnValue %float_1
+         %37 = OpLabel
+               OpBranch %35
+         %36 = OpLabel
+               OpBranch %31
+         %31 = OpLabel
+               OpBranch %29
+         %30 = OpLabel
+               OpReturnValue %float_0
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %42
+         %45 = OpLabel
+      %param = OpVariable %_ptr_Function_float Function %47
+         %51 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %52 = OpLoad %float %51
+               OpStore %param %52
+         %53 = OpFunctionCall %float %nb_mod_f1_ %param
+               OpStore %x_GLF_color %55
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %56
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %60 = OpLabel
+         %61 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %61
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %42
+         %63 = OpLabel
+         %64 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %64
+         %65 = OpFunctionCall %void %main_1
+         %67 = OpLoad %v4float %x_GLF_color
+         %68 = OpCompositeConstruct %main_out %67
+         %66 = OpFunctionCall %void %tint_symbol_3 %68
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-for-loops-with-return/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/nested-for-loops-with-return/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..f37535c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-for-loops-with-return/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,43 @@
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn nb_mod_f1_(limit : ptr<function, f32>) -> f32 {
+  var x_injected_loop_counter : i32;
+  var x_injected_loop_counter_1 : i32;
+  let x_37 : f32 = *(limit);
+  if ((1.0 >= x_37)) {
+    return 1.0;
+  }
+  x_injected_loop_counter = 0;
+  loop {
+    let x_42 : bool = (0 < 2);
+    x_injected_loop_counter_1 = 0;
+    loop {
+      let x_47 : bool = (0 < 1);
+      return 1.0;
+    }
+  }
+  return 0.0;
+}
+
+fn main_1() {
+  var param : f32;
+  let x_34 : f32 = gl_FragCoord.x;
+  param = x_34;
+  let x_35 : f32 = nb_mod_f1_(&(param));
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-for-loops-with-return/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/nested-for-loops-with-return/0-opt.wgsl
new file mode 100644
index 0000000..f37535c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-for-loops-with-return/0-opt.wgsl
@@ -0,0 +1,43 @@
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn nb_mod_f1_(limit : ptr<function, f32>) -> f32 {
+  var x_injected_loop_counter : i32;
+  var x_injected_loop_counter_1 : i32;
+  let x_37 : f32 = *(limit);
+  if ((1.0 >= x_37)) {
+    return 1.0;
+  }
+  x_injected_loop_counter = 0;
+  loop {
+    let x_42 : bool = (0 < 2);
+    x_injected_loop_counter_1 = 0;
+    loop {
+      let x_47 : bool = (0 < 1);
+      return 1.0;
+    }
+  }
+  return 0.0;
+}
+
+fn main_1() {
+  var param : f32;
+  let x_34 : f32 = gl_FragCoord.x;
+  param = x_34;
+  let x_35 : f32 = nb_mod_f1_(&(param));
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-for-loops-with-return/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/nested-for-loops-with-return/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..861538a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-for-loops-with-return/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,49 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float nb_mod_f1_(inout float limit) {
+  int x_injected_loop_counter = 0;
+  int x_injected_loop_counter_1 = 0;
+  const float x_37 = limit;
+  if ((1.0f >= x_37)) {
+    return 1.0f;
+  }
+  x_injected_loop_counter = 0;
+  while (true) {
+    const bool x_42 = (0 < 2);
+    x_injected_loop_counter_1 = 0;
+    while (true) {
+      const bool x_47 = (0 < 1);
+      return 1.0f;
+    }
+  }
+  return 0.0f;
+}
+
+void main_1() {
+  float param = 0.0f;
+  const float x_34 = gl_FragCoord.x;
+  param = x_34;
+  const float x_35 = nb_mod_f1_(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_1 {
+  float4 gl_FragCoord_param : SV_Position;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-for-loops-with-return/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/nested-for-loops-with-return/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..2455128
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-for-loops-with-return/0-opt.wgsl.expected.msl
@@ -0,0 +1,48 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float nb_mod_f1_(thread float* const limit) {
+  int x_injected_loop_counter = 0;
+  int x_injected_loop_counter_1 = 0;
+  float const x_37 = *(limit);
+  if ((1.0f >= x_37)) {
+    return 1.0f;
+  }
+  x_injected_loop_counter = 0;
+  while (true) {
+    bool const x_42 = (0 < 2);
+    x_injected_loop_counter_1 = 0;
+    while (true) {
+      bool const x_47 = (0 < 1);
+      return 1.0f;
+    }
+  }
+  return 0.0f;
+}
+
+void main_1(thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float param = 0.0f;
+  float const x_34 = (*(tint_symbol_5)).x;
+  param = x_34;
+  float const x_35 = nb_mod_f1_(&(param));
+  *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(&(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-for-loops-with-return/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/nested-for-loops-with-return/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..eca9c85
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-for-loops-with-return/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,120 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 69
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %nb_mod_f1_ "nb_mod_f1_"
+               OpName %limit "limit"
+               OpName %x_injected_loop_counter "x_injected_loop_counter"
+               OpName %x_injected_loop_counter_1 "x_injected_loop_counter_1"
+               OpName %main_1 "main_1"
+               OpName %param "param"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Function_float = OpTypePointer Function %float
+         %11 = OpTypeFunction %float %_ptr_Function_float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %19 = OpConstantNull %int
+    %float_1 = OpConstant %float 1
+       %bool = OpTypeBool
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+       %void = OpTypeVoid
+         %42 = OpTypeFunction %void
+         %47 = OpConstantNull %float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+         %55 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %56 = OpTypeFunction %void %main_out
+ %nb_mod_f1_ = OpFunction %float None %11
+      %limit = OpFunctionParameter %_ptr_Function_float
+         %15 = OpLabel
+%x_injected_loop_counter = OpVariable %_ptr_Function_int Function %19
+%x_injected_loop_counter_1 = OpVariable %_ptr_Function_int Function %19
+         %22 = OpLoad %float %limit
+         %24 = OpFOrdGreaterThanEqual %bool %float_1 %22
+               OpSelectionMerge %26 None
+               OpBranchConditional %24 %27 %26
+         %27 = OpLabel
+               OpReturnValue %float_1
+         %26 = OpLabel
+               OpStore %x_injected_loop_counter %int_0
+               OpBranch %29
+         %29 = OpLabel
+               OpLoopMerge %30 %31 None
+               OpBranch %32
+         %32 = OpLabel
+         %34 = OpSLessThan %bool %int_0 %int_2
+               OpStore %x_injected_loop_counter_1 %int_0
+               OpBranch %35
+         %35 = OpLabel
+               OpLoopMerge %36 %37 None
+               OpBranch %38
+         %38 = OpLabel
+         %40 = OpSLessThan %bool %int_0 %int_1
+               OpReturnValue %float_1
+         %37 = OpLabel
+               OpBranch %35
+         %36 = OpLabel
+               OpBranch %31
+         %31 = OpLabel
+               OpBranch %29
+         %30 = OpLabel
+               OpReturnValue %float_0
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %42
+         %45 = OpLabel
+      %param = OpVariable %_ptr_Function_float Function %47
+         %51 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %52 = OpLoad %float %51
+               OpStore %param %52
+         %53 = OpFunctionCall %float %nb_mod_f1_ %param
+               OpStore %x_GLF_color %55
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %56
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %60 = OpLabel
+         %61 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %61
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %42
+         %63 = OpLabel
+         %64 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %64
+         %65 = OpFunctionCall %void %main_1
+         %67 = OpLoad %v4float %x_GLF_color
+         %68 = OpCompositeConstruct %main_out %67
+         %66 = OpFunctionCall %void %tint_symbol_3 %68
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-for-loops-with-return/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/nested-for-loops-with-return/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..f37535c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-for-loops-with-return/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,43 @@
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn nb_mod_f1_(limit : ptr<function, f32>) -> f32 {
+  var x_injected_loop_counter : i32;
+  var x_injected_loop_counter_1 : i32;
+  let x_37 : f32 = *(limit);
+  if ((1.0 >= x_37)) {
+    return 1.0;
+  }
+  x_injected_loop_counter = 0;
+  loop {
+    let x_42 : bool = (0 < 2);
+    x_injected_loop_counter_1 = 0;
+    loop {
+      let x_47 : bool = (0 < 1);
+      return 1.0;
+    }
+  }
+  return 0.0;
+}
+
+fn main_1() {
+  var param : f32;
+  let x_34 : f32 = gl_FragCoord.x;
+  param = x_34;
+  let x_35 : f32 = nb_mod_f1_(&(param));
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-ifs-and-return-in-for-loop/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/nested-ifs-and-return-in-for-loop/0-opt.spvasm
new file mode 100644
index 0000000..f77dde3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-ifs-and-return-in-for-loop/0-opt.spvasm
@@ -0,0 +1,83 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpName %i "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %i RelaxedPrecision
+               OpDecorate %7 RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %8 RelaxedPrecision
+               OpDecorate %9 RelaxedPrecision
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %17 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+     %int_10 = OpConstant %int 10
+       %bool = OpTypeBool
+         %23 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %true = OpConstantTrue %bool
+      %int_1 = OpConstant %int 1
+       %main = OpFunction %void None %11
+         %31 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+               OpStore %_GLF_color %17
+               OpStore %i %int_0
+               OpBranch %32
+         %32 = OpLabel
+               OpLoopMerge %33 %34 None
+               OpBranch %35
+         %35 = OpLabel
+          %7 = OpLoad %int %i
+         %36 = OpSLessThan %bool %7 %int_10
+               OpBranchConditional %36 %37 %33
+         %37 = OpLabel
+               OpStore %_GLF_color %23
+         %38 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %39 = OpLoad %float %38
+         %40 = OpFOrdGreaterThan %bool %float_1 %39
+               OpSelectionMerge %41 None
+               OpBranchConditional %40 %42 %41
+         %42 = OpLabel
+               OpStore %_GLF_color %17
+               OpSelectionMerge %43 None
+               OpBranchConditional %true %44 %43
+         %44 = OpLabel
+               OpReturn
+         %43 = OpLabel
+               OpBranch %41
+         %41 = OpLabel
+               OpBranch %34
+         %34 = OpLabel
+          %8 = OpLoad %int %i
+          %9 = OpIAdd %int %8 %int_1
+               OpStore %i %9
+               OpBranch %32
+         %33 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-ifs-and-return-in-for-loop/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/nested-ifs-and-return-in-for-loop/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..d41e23b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-ifs-and-return-in-for-loop/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,37 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+
+void main_1() {
+  int i = 0;
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  i = 0;
+  {
+    for(; (i < 10); i = (i + 1)) {
+      x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+      const float x_39 = asfloat(x_6[0].y);
+      if ((1.0f > x_39)) {
+        x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+        if (true) {
+          return;
+        }
+      }
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-ifs-and-return-in-for-loop/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/nested-ifs-and-return-in-for-loop/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..54dd6b3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-ifs-and-return-in-for-loop/0-opt.spvasm.expected.msl
@@ -0,0 +1,47 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int i = 0;
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  i = 0;
+  while (true) {
+    int const x_7 = i;
+    if ((x_7 < 10)) {
+    } else {
+      break;
+    }
+    *(tint_symbol_4) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+    float const x_39 = x_6.injectionSwitch.y;
+    if ((1.0f > x_39)) {
+      *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+      if (true) {
+        return;
+      }
+    }
+    {
+      int const x_8 = i;
+      i = (x_8 + 1);
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-ifs-and-return-in-for-loop/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/nested-ifs-and-return-in-for-loop/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..e38a6fc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-ifs-and-return-in-for-loop/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,117 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 63
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %19 = OpConstantNull %int
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %22 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %int_0 = OpConstant %int 0
+     %int_10 = OpConstant %int 10
+       %bool = OpTypeBool
+         %35 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %true = OpConstantTrue %bool
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %51 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %19
+               OpStore %x_GLF_color %22
+               OpStore %i %int_0
+               OpBranch %24
+         %24 = OpLabel
+               OpLoopMerge %25 %26 None
+               OpBranch %27
+         %27 = OpLabel
+         %28 = OpLoad %int %i
+         %30 = OpSLessThan %bool %28 %int_10
+               OpSelectionMerge %32 None
+               OpBranchConditional %30 %33 %34
+         %33 = OpLabel
+               OpBranch %32
+         %34 = OpLabel
+               OpBranch %25
+         %32 = OpLabel
+               OpStore %x_GLF_color %35
+         %40 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %41 = OpLoad %float %40
+         %42 = OpFOrdGreaterThan %bool %float_1 %41
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %43
+         %44 = OpLabel
+               OpStore %x_GLF_color %22
+               OpSelectionMerge %46 None
+               OpBranchConditional %true %47 %46
+         %47 = OpLabel
+               OpReturn
+         %46 = OpLabel
+               OpBranch %43
+         %43 = OpLabel
+               OpBranch %26
+         %26 = OpLabel
+         %48 = OpLoad %int %i
+         %50 = OpIAdd %int %48 %int_1
+               OpStore %i %50
+               OpBranch %24
+         %25 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %51
+%tint_symbol = OpFunctionParameter %main_out
+         %55 = OpLabel
+         %56 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %56
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %58 = OpLabel
+         %59 = OpFunctionCall %void %main_1
+         %61 = OpLoad %v4float %x_GLF_color
+         %62 = OpCompositeConstruct %main_out %61
+         %60 = OpFunctionCall %void %tint_symbol_2 %62
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-ifs-and-return-in-for-loop/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/nested-ifs-and-return-in-for-loop/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..ac61d8e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-ifs-and-return-in-for-loop/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,46 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+fn main_1() {
+  var i : i32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  i = 0;
+  loop {
+    let x_7 : i32 = i;
+    if ((x_7 < 10)) {
+    } else {
+      break;
+    }
+    x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+    let x_39 : f32 = x_6.injectionSwitch.y;
+    if ((1.0 > x_39)) {
+      x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+      if (true) {
+        return;
+      }
+    }
+
+    continuing {
+      let x_8 : i32 = i;
+      i = (x_8 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-ifs-and-return-in-for-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/nested-ifs-and-return-in-for-loop/0-opt.wgsl
new file mode 100644
index 0000000..ac61d8e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-ifs-and-return-in-for-loop/0-opt.wgsl
@@ -0,0 +1,46 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+fn main_1() {
+  var i : i32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  i = 0;
+  loop {
+    let x_7 : i32 = i;
+    if ((x_7 < 10)) {
+    } else {
+      break;
+    }
+    x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+    let x_39 : f32 = x_6.injectionSwitch.y;
+    if ((1.0 > x_39)) {
+      x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+      if (true) {
+        return;
+      }
+    }
+
+    continuing {
+      let x_8 : i32 = i;
+      i = (x_8 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-ifs-and-return-in-for-loop/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/nested-ifs-and-return-in-for-loop/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..d41e23b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-ifs-and-return-in-for-loop/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,37 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+
+void main_1() {
+  int i = 0;
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  i = 0;
+  {
+    for(; (i < 10); i = (i + 1)) {
+      x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+      const float x_39 = asfloat(x_6[0].y);
+      if ((1.0f > x_39)) {
+        x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+        if (true) {
+          return;
+        }
+      }
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-ifs-and-return-in-for-loop/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/nested-ifs-and-return-in-for-loop/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..54dd6b3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-ifs-and-return-in-for-loop/0-opt.wgsl.expected.msl
@@ -0,0 +1,47 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int i = 0;
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  i = 0;
+  while (true) {
+    int const x_7 = i;
+    if ((x_7 < 10)) {
+    } else {
+      break;
+    }
+    *(tint_symbol_4) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+    float const x_39 = x_6.injectionSwitch.y;
+    if ((1.0f > x_39)) {
+      *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+      if (true) {
+        return;
+      }
+    }
+    {
+      int const x_8 = i;
+      i = (x_8 + 1);
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-ifs-and-return-in-for-loop/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/nested-ifs-and-return-in-for-loop/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..e38a6fc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-ifs-and-return-in-for-loop/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,117 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 63
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %19 = OpConstantNull %int
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %22 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %int_0 = OpConstant %int 0
+     %int_10 = OpConstant %int 10
+       %bool = OpTypeBool
+         %35 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %true = OpConstantTrue %bool
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %51 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %19
+               OpStore %x_GLF_color %22
+               OpStore %i %int_0
+               OpBranch %24
+         %24 = OpLabel
+               OpLoopMerge %25 %26 None
+               OpBranch %27
+         %27 = OpLabel
+         %28 = OpLoad %int %i
+         %30 = OpSLessThan %bool %28 %int_10
+               OpSelectionMerge %32 None
+               OpBranchConditional %30 %33 %34
+         %33 = OpLabel
+               OpBranch %32
+         %34 = OpLabel
+               OpBranch %25
+         %32 = OpLabel
+               OpStore %x_GLF_color %35
+         %40 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %41 = OpLoad %float %40
+         %42 = OpFOrdGreaterThan %bool %float_1 %41
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %43
+         %44 = OpLabel
+               OpStore %x_GLF_color %22
+               OpSelectionMerge %46 None
+               OpBranchConditional %true %47 %46
+         %47 = OpLabel
+               OpReturn
+         %46 = OpLabel
+               OpBranch %43
+         %43 = OpLabel
+               OpBranch %26
+         %26 = OpLabel
+         %48 = OpLoad %int %i
+         %50 = OpIAdd %int %48 %int_1
+               OpStore %i %50
+               OpBranch %24
+         %25 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %51
+%tint_symbol = OpFunctionParameter %main_out
+         %55 = OpLabel
+         %56 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %56
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %58 = OpLabel
+         %59 = OpFunctionCall %void %main_1
+         %61 = OpLoad %v4float %x_GLF_color
+         %62 = OpCompositeConstruct %main_out %61
+         %60 = OpFunctionCall %void %tint_symbol_2 %62
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-ifs-and-return-in-for-loop/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/nested-ifs-and-return-in-for-loop/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..ac61d8e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-ifs-and-return-in-for-loop/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,46 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+fn main_1() {
+  var i : i32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  i = 0;
+  loop {
+    let x_7 : i32 = i;
+    if ((x_7 < 10)) {
+    } else {
+      break;
+    }
+    x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+    let x_39 : f32 = x_6.injectionSwitch.y;
+    if ((1.0 > x_39)) {
+      x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+      if (true) {
+        return;
+      }
+    }
+
+    continuing {
+      let x_8 : i32 = i;
+      i = (x_8 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-loops-switch/0.spvasm b/test/vk-gl-cts/graphicsfuzz/nested-loops-switch/0.spvasm
new file mode 100644
index 0000000..c76e153
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-loops-switch/0.spvasm
@@ -0,0 +1,189 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %i "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %GLF_dead5cols "GLF_dead5cols"
+               OpName %GLF_dead5rows "GLF_dead5rows"
+               OpName %GLF_dead5c "GLF_dead5c"
+               OpName %GLF_dead5r "GLF_dead5r"
+               OpName %msb10 "msb10"
+               OpName %donor_replacementGLF_dead5sums "donor_replacementGLF_dead5sums"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+     %uint_1 = OpConstant %uint 1
+      %int_2 = OpConstant %int 2
+      %int_4 = OpConstant %int 4
+     %uint_9 = OpConstant %uint 9
+%_arr_float_uint_9 = OpTypeArray %float %uint_9
+%_ptr_Function__arr_float_uint_9 = OpTypePointer Function %_arr_float_uint_9
+      %int_9 = OpConstant %int 9
+    %float_1 = OpConstant %float 1
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_1 = OpConstant %int 1
+    %int_200 = OpConstant %int 200
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %39 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %14
+         %40 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+%GLF_dead5cols = OpVariable %_ptr_Function_int Function
+%GLF_dead5rows = OpVariable %_ptr_Function_int Function
+ %GLF_dead5c = OpVariable %_ptr_Function_int Function
+ %GLF_dead5r = OpVariable %_ptr_Function_int Function
+      %msb10 = OpVariable %_ptr_Function_int Function
+%donor_replacementGLF_dead5sums = OpVariable %_ptr_Function__arr_float_uint_9 Function
+               OpStore %i %int_0
+               OpBranch %41
+         %41 = OpLabel
+               OpLoopMerge %42 %43 None
+               OpBranch %44
+         %44 = OpLabel
+         %45 = OpLoad %int %i
+         %46 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %47 = OpLoad %float %46
+         %48 = OpConvertFToS %int %47
+         %49 = OpSGreaterThanEqual %bool %45 %48
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %50
+         %51 = OpLabel
+               OpBranch %42
+         %50 = OpLabel
+         %52 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %53 = OpLoad %float %52
+         %54 = OpFOrdGreaterThan %bool %float_0 %53
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %55
+         %56 = OpLabel
+               OpStore %GLF_dead5cols %int_2
+               OpBranch %57
+         %57 = OpLabel
+               OpLoopMerge %58 %59 None
+               OpBranch %60
+         %60 = OpLabel
+         %61 = OpLoad %int %GLF_dead5cols
+         %62 = OpSLessThanEqual %bool %61 %int_4
+               OpBranchConditional %62 %63 %58
+         %63 = OpLabel
+               OpStore %GLF_dead5rows %int_2
+               OpBranch %64
+         %64 = OpLabel
+               OpLoopMerge %65 %66 None
+               OpBranch %67
+         %67 = OpLabel
+         %68 = OpLoad %int %GLF_dead5rows
+         %69 = OpSLessThanEqual %bool %68 %int_4
+               OpBranchConditional %69 %70 %65
+         %70 = OpLabel
+               OpStore %GLF_dead5c %int_0
+               OpBranch %71
+         %71 = OpLabel
+               OpLoopMerge %72 %73 None
+               OpBranch %74
+         %74 = OpLabel
+         %75 = OpLoad %int %GLF_dead5c
+         %76 = OpLoad %int %GLF_dead5cols
+         %77 = OpSLessThan %bool %75 %76
+               OpBranchConditional %77 %78 %72
+         %78 = OpLabel
+               OpStore %GLF_dead5r %int_0
+               OpBranch %79
+         %79 = OpLabel
+               OpLoopMerge %80 %81 None
+               OpBranch %82
+         %82 = OpLabel
+         %83 = OpLoad %int %GLF_dead5r
+         %84 = OpLoad %int %GLF_dead5rows
+         %85 = OpSLessThan %bool %83 %84
+               OpBranchConditional %85 %86 %80
+         %86 = OpLabel
+         %87 = OpLoad %int %msb10
+               OpSelectionMerge %88 None
+               OpSwitch %87 %88 1 %89 8 %89
+         %89 = OpLabel
+         %90 = OpLoad %int %msb10
+         %91 = OpSGreaterThanEqual %bool %90 %int_0
+         %92 = OpLoad %int %msb10
+         %93 = OpSLessThan %bool %92 %int_9
+         %94 = OpLogicalAnd %bool %91 %93
+         %95 = OpLoad %int %msb10
+         %96 = OpSelect %int %94 %95 %int_0
+         %97 = OpAccessChain %_ptr_Function_float %donor_replacementGLF_dead5sums %96
+         %98 = OpLoad %float %97
+         %99 = OpFAdd %float %98 %float_1
+        %100 = OpAccessChain %_ptr_Function_float %donor_replacementGLF_dead5sums %96
+               OpStore %100 %99
+               OpBranch %88
+         %88 = OpLabel
+               OpBranch %81
+         %81 = OpLabel
+        %101 = OpLoad %int %GLF_dead5r
+        %102 = OpIAdd %int %101 %int_1
+               OpStore %GLF_dead5r %102
+               OpBranch %79
+         %80 = OpLabel
+               OpBranch %73
+         %73 = OpLabel
+        %103 = OpLoad %int %GLF_dead5c
+        %104 = OpIAdd %int %103 %int_1
+               OpStore %GLF_dead5c %104
+               OpBranch %71
+         %72 = OpLabel
+        %105 = OpLoad %int %msb10
+        %106 = OpIAdd %int %105 %int_1
+               OpStore %msb10 %106
+               OpBranch %66
+         %66 = OpLabel
+        %107 = OpLoad %int %GLF_dead5rows
+        %108 = OpIAdd %int %107 %int_1
+               OpStore %GLF_dead5rows %108
+               OpBranch %64
+         %65 = OpLabel
+               OpBranch %59
+         %59 = OpLabel
+        %109 = OpLoad %int %GLF_dead5cols
+        %110 = OpIAdd %int %109 %int_1
+               OpStore %GLF_dead5cols %110
+               OpBranch %57
+         %58 = OpLabel
+               OpBranch %55
+         %55 = OpLabel
+        %111 = OpLoad %int %i
+        %112 = OpIAdd %int %111 %int_1
+               OpStore %i %112
+               OpBranch %43
+         %43 = OpLabel
+        %113 = OpLoad %int %i
+        %114 = OpSLessThan %bool %113 %int_200
+               OpBranchConditional %114 %41 %42
+         %42 = OpLabel
+               OpStore %_GLF_color %39
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-loops-switch/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/nested-loops-switch/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..938e563
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-loops-switch/0.spvasm.expected.hlsl
@@ -0,0 +1,85 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int i = 0;
+  int GLF_dead5cols = 0;
+  int GLF_dead5rows = 0;
+  int GLF_dead5c = 0;
+  int GLF_dead5r = 0;
+  int msb10 = 0;
+  float donor_replacementGLF_dead5sums[9] = (float[9])0;
+  i = 0;
+  while (true) {
+    const int x_45 = i;
+    const float x_47 = asfloat(x_6[0].x);
+    if ((x_45 >= int(x_47))) {
+      break;
+    }
+    const float x_53 = asfloat(x_6[0].y);
+    if ((0.0f > x_53)) {
+      GLF_dead5cols = 2;
+      {
+        for(; (GLF_dead5cols <= 4); GLF_dead5cols = (GLF_dead5cols + 1)) {
+          GLF_dead5rows = 2;
+          {
+            for(; (GLF_dead5rows <= 4); GLF_dead5rows = (GLF_dead5rows + 1)) {
+              GLF_dead5c = 0;
+              {
+                for(; (GLF_dead5c < GLF_dead5cols); GLF_dead5c = (GLF_dead5c + 1)) {
+                  GLF_dead5r = 0;
+                  {
+                    for(; (GLF_dead5r < GLF_dead5rows); GLF_dead5r = (GLF_dead5r + 1)) {
+                      switch(msb10) {
+                        case 1:
+                        case 8: {
+                          bool tint_tmp = (msb10 >= 0);
+                          if (tint_tmp) {
+                            tint_tmp = (msb10 < 9);
+                          }
+                          const int x_96 = ((tint_tmp) ? msb10 : 0);
+                          const float x_98 = donor_replacementGLF_dead5sums[x_96];
+                          donor_replacementGLF_dead5sums[x_96] = (x_98 + 1.0f);
+                          break;
+                        }
+                        default: {
+                          break;
+                        }
+                      }
+                    }
+                  }
+                }
+              }
+              msb10 = (msb10 + 1);
+            }
+          }
+        }
+      }
+    }
+    i = (i + 1);
+    {
+      if ((i < 200)) {
+      } else {
+        break;
+      }
+    }
+  }
+  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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-loops-switch/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/nested-loops-switch/0.spvasm.expected.msl
new file mode 100644
index 0000000..d1d24c8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-loops-switch/0.spvasm.expected.msl
@@ -0,0 +1,124 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  float arr[9];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int i = 0;
+  int GLF_dead5cols = 0;
+  int GLF_dead5rows = 0;
+  int GLF_dead5c = 0;
+  int GLF_dead5r = 0;
+  int msb10 = 0;
+  tint_array_wrapper donor_replacementGLF_dead5sums = {};
+  i = 0;
+  while (true) {
+    int const x_45 = i;
+    float const x_47 = x_6.injectionSwitch.x;
+    if ((x_45 >= int(x_47))) {
+      break;
+    }
+    float const x_53 = x_6.injectionSwitch.y;
+    if ((0.0f > x_53)) {
+      GLF_dead5cols = 2;
+      while (true) {
+        int const x_61 = GLF_dead5cols;
+        if ((x_61 <= 4)) {
+        } else {
+          break;
+        }
+        GLF_dead5rows = 2;
+        while (true) {
+          int const x_68 = GLF_dead5rows;
+          if ((x_68 <= 4)) {
+          } else {
+            break;
+          }
+          GLF_dead5c = 0;
+          while (true) {
+            int const x_75 = GLF_dead5c;
+            int const x_76 = GLF_dead5cols;
+            if ((x_75 < x_76)) {
+            } else {
+              break;
+            }
+            GLF_dead5r = 0;
+            while (true) {
+              int const x_83 = GLF_dead5r;
+              int const x_84 = GLF_dead5rows;
+              if ((x_83 < x_84)) {
+              } else {
+                break;
+              }
+              int const x_87 = msb10;
+              switch(x_87) {
+                case 1:
+                case 8: {
+                  int const x_90 = msb10;
+                  int const x_92 = msb10;
+                  int const x_95 = msb10;
+                  int const x_96 = select(0, x_95, ((x_90 >= 0) && (x_92 < 9)));
+                  float const x_98 = donor_replacementGLF_dead5sums.arr[x_96];
+                  donor_replacementGLF_dead5sums.arr[x_96] = (x_98 + 1.0f);
+                  break;
+                }
+                default: {
+                  break;
+                }
+              }
+              {
+                int const x_101 = GLF_dead5r;
+                GLF_dead5r = (x_101 + 1);
+              }
+            }
+            {
+              int const x_103 = GLF_dead5c;
+              GLF_dead5c = (x_103 + 1);
+            }
+          }
+          int const x_105 = msb10;
+          msb10 = (x_105 + 1);
+          {
+            int const x_107 = GLF_dead5rows;
+            GLF_dead5rows = (x_107 + 1);
+          }
+        }
+        {
+          int const x_109 = GLF_dead5cols;
+          GLF_dead5cols = (x_109 + 1);
+        }
+      }
+    }
+    int const x_111 = i;
+    i = (x_111 + 1);
+    {
+      int const x_113 = i;
+      if ((x_113 < 200)) {
+      } else {
+        break;
+      }
+    }
+  }
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-loops-switch/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/nested-loops-switch/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..cb7cc44
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-loops-switch/0.spvasm.expected.spvasm
@@ -0,0 +1,262 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 145
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %GLF_dead5cols "GLF_dead5cols"
+               OpName %GLF_dead5rows "GLF_dead5rows"
+               OpName %GLF_dead5c "GLF_dead5c"
+               OpName %GLF_dead5r "GLF_dead5r"
+               OpName %msb10 "msb10"
+               OpName %donor_replacementGLF_dead5sums "donor_replacementGLF_dead5sums"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_float_uint_9 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %19 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_9 = OpConstant %uint 9
+%_arr_float_uint_9 = OpTypeArray %float %uint_9
+%_ptr_Function__arr_float_uint_9 = OpTypePointer Function %_arr_float_uint_9
+         %30 = OpConstantNull %_arr_float_uint_9
+      %int_0 = OpConstant %int 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+     %uint_1 = OpConstant %uint 1
+    %float_0 = OpConstant %float 0
+      %int_2 = OpConstant %int 2
+      %int_4 = OpConstant %int 4
+      %int_9 = OpConstant %int 9
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_1 = OpConstant %float 1
+      %int_1 = OpConstant %int 1
+    %int_200 = OpConstant %int 200
+        %132 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %133 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %19
+%GLF_dead5cols = OpVariable %_ptr_Function_int Function %19
+%GLF_dead5rows = OpVariable %_ptr_Function_int Function %19
+ %GLF_dead5c = OpVariable %_ptr_Function_int Function %19
+ %GLF_dead5r = OpVariable %_ptr_Function_int Function %19
+      %msb10 = OpVariable %_ptr_Function_int Function %19
+%donor_replacementGLF_dead5sums = OpVariable %_ptr_Function__arr_float_uint_9 Function %30
+               OpStore %i %int_0
+               OpBranch %32
+         %32 = OpLabel
+               OpLoopMerge %33 %34 None
+               OpBranch %35
+         %35 = OpLabel
+         %36 = OpLoad %int %i
+         %39 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+         %40 = OpLoad %float %39
+         %41 = OpConvertFToS %int %40
+         %42 = OpSGreaterThanEqual %bool %36 %41
+               OpSelectionMerge %44 None
+               OpBranchConditional %42 %45 %44
+         %45 = OpLabel
+               OpBranch %33
+         %44 = OpLabel
+         %47 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %48 = OpLoad %float %47
+         %50 = OpFOrdGreaterThan %bool %float_0 %48
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %51
+         %52 = OpLabel
+               OpStore %GLF_dead5cols %int_2
+               OpBranch %54
+         %54 = OpLabel
+               OpLoopMerge %55 %56 None
+               OpBranch %57
+         %57 = OpLabel
+         %58 = OpLoad %int %GLF_dead5cols
+         %60 = OpSLessThanEqual %bool %58 %int_4
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %63
+         %62 = OpLabel
+               OpBranch %61
+         %63 = OpLabel
+               OpBranch %55
+         %61 = OpLabel
+               OpStore %GLF_dead5rows %int_2
+               OpBranch %64
+         %64 = OpLabel
+               OpLoopMerge %65 %66 None
+               OpBranch %67
+         %67 = OpLabel
+         %68 = OpLoad %int %GLF_dead5rows
+         %69 = OpSLessThanEqual %bool %68 %int_4
+               OpSelectionMerge %70 None
+               OpBranchConditional %69 %71 %72
+         %71 = OpLabel
+               OpBranch %70
+         %72 = OpLabel
+               OpBranch %65
+         %70 = OpLabel
+               OpStore %GLF_dead5c %int_0
+               OpBranch %73
+         %73 = OpLabel
+               OpLoopMerge %74 %75 None
+               OpBranch %76
+         %76 = OpLabel
+         %77 = OpLoad %int %GLF_dead5c
+         %78 = OpLoad %int %GLF_dead5cols
+         %79 = OpSLessThan %bool %77 %78
+               OpSelectionMerge %80 None
+               OpBranchConditional %79 %81 %82
+         %81 = OpLabel
+               OpBranch %80
+         %82 = OpLabel
+               OpBranch %74
+         %80 = OpLabel
+               OpStore %GLF_dead5r %int_0
+               OpBranch %83
+         %83 = OpLabel
+               OpLoopMerge %84 %85 None
+               OpBranch %86
+         %86 = OpLabel
+         %87 = OpLoad %int %GLF_dead5r
+         %88 = OpLoad %int %GLF_dead5rows
+         %89 = OpSLessThan %bool %87 %88
+               OpSelectionMerge %90 None
+               OpBranchConditional %89 %91 %92
+         %91 = OpLabel
+               OpBranch %90
+         %92 = OpLabel
+               OpBranch %84
+         %90 = OpLabel
+         %93 = OpLoad %int %msb10
+               OpSelectionMerge %94 None
+               OpSwitch %93 %95 1 %96 8 %96
+         %96 = OpLabel
+         %97 = OpLoad %int %msb10
+         %98 = OpLoad %int %msb10
+         %99 = OpLoad %int %msb10
+        %101 = OpSGreaterThanEqual %bool %97 %int_0
+               OpSelectionMerge %102 None
+               OpBranchConditional %101 %103 %102
+        %103 = OpLabel
+        %105 = OpSLessThan %bool %98 %int_9
+               OpBranch %102
+        %102 = OpLabel
+        %106 = OpPhi %bool %101 %96 %105 %103
+        %100 = OpSelect %int %106 %99 %int_0
+        %108 = OpAccessChain %_ptr_Function_float %donor_replacementGLF_dead5sums %100
+        %109 = OpLoad %float %108
+        %110 = OpAccessChain %_ptr_Function_float %donor_replacementGLF_dead5sums %100
+        %112 = OpFAdd %float %109 %float_1
+               OpStore %110 %112
+               OpBranch %94
+         %95 = OpLabel
+               OpBranch %94
+         %94 = OpLabel
+               OpBranch %85
+         %85 = OpLabel
+        %113 = OpLoad %int %GLF_dead5r
+        %115 = OpIAdd %int %113 %int_1
+               OpStore %GLF_dead5r %115
+               OpBranch %83
+         %84 = OpLabel
+               OpBranch %75
+         %75 = OpLabel
+        %116 = OpLoad %int %GLF_dead5c
+        %117 = OpIAdd %int %116 %int_1
+               OpStore %GLF_dead5c %117
+               OpBranch %73
+         %74 = OpLabel
+        %118 = OpLoad %int %msb10
+        %119 = OpIAdd %int %118 %int_1
+               OpStore %msb10 %119
+               OpBranch %66
+         %66 = OpLabel
+        %120 = OpLoad %int %GLF_dead5rows
+        %121 = OpIAdd %int %120 %int_1
+               OpStore %GLF_dead5rows %121
+               OpBranch %64
+         %65 = OpLabel
+               OpBranch %56
+         %56 = OpLabel
+        %122 = OpLoad %int %GLF_dead5cols
+        %123 = OpIAdd %int %122 %int_1
+               OpStore %GLF_dead5cols %123
+               OpBranch %54
+         %55 = OpLabel
+               OpBranch %51
+         %51 = OpLabel
+        %124 = OpLoad %int %i
+        %125 = OpIAdd %int %124 %int_1
+               OpStore %i %125
+               OpBranch %34
+         %34 = OpLabel
+        %126 = OpLoad %int %i
+        %128 = OpSLessThan %bool %126 %int_200
+               OpSelectionMerge %129 None
+               OpBranchConditional %128 %130 %131
+        %130 = OpLabel
+               OpBranch %129
+        %131 = OpLabel
+               OpBranch %33
+        %129 = OpLabel
+               OpBranch %32
+         %33 = OpLabel
+               OpStore %x_GLF_color %132
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %133
+%tint_symbol = OpFunctionParameter %main_out
+        %137 = OpLabel
+        %138 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %138
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+        %140 = OpLabel
+        %141 = OpFunctionCall %void %main_1
+        %143 = OpLoad %v4float %x_GLF_color
+        %144 = OpCompositeConstruct %main_out %143
+        %142 = OpFunctionCall %void %tint_symbol_2 %144
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 34[%34] is not post dominated by the back-edge block 129[%129]
+  %129 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-loops-switch/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/nested-loops-switch/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..31f3f0e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-loops-switch/0.spvasm.expected.wgsl
@@ -0,0 +1,121 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  var GLF_dead5cols : i32;
+  var GLF_dead5rows : i32;
+  var GLF_dead5c : i32;
+  var GLF_dead5r : i32;
+  var msb10 : i32;
+  var donor_replacementGLF_dead5sums : array<f32, 9>;
+  i = 0;
+  loop {
+    let x_45 : i32 = i;
+    let x_47 : f32 = x_6.injectionSwitch.x;
+    if ((x_45 >= i32(x_47))) {
+      break;
+    }
+    let x_53 : f32 = x_6.injectionSwitch.y;
+    if ((0.0 > x_53)) {
+      GLF_dead5cols = 2;
+      loop {
+        let x_61 : i32 = GLF_dead5cols;
+        if ((x_61 <= 4)) {
+        } else {
+          break;
+        }
+        GLF_dead5rows = 2;
+        loop {
+          let x_68 : i32 = GLF_dead5rows;
+          if ((x_68 <= 4)) {
+          } else {
+            break;
+          }
+          GLF_dead5c = 0;
+          loop {
+            let x_75 : i32 = GLF_dead5c;
+            let x_76 : i32 = GLF_dead5cols;
+            if ((x_75 < x_76)) {
+            } else {
+              break;
+            }
+            GLF_dead5r = 0;
+            loop {
+              let x_83 : i32 = GLF_dead5r;
+              let x_84 : i32 = GLF_dead5rows;
+              if ((x_83 < x_84)) {
+              } else {
+                break;
+              }
+              let x_87 : i32 = msb10;
+              switch(x_87) {
+                case 1, 8: {
+                  let x_90 : i32 = msb10;
+                  let x_92 : i32 = msb10;
+                  let x_95 : i32 = msb10;
+                  let x_96 : i32 = select(0, x_95, ((x_90 >= 0) && (x_92 < 9)));
+                  let x_98 : f32 = donor_replacementGLF_dead5sums[x_96];
+                  donor_replacementGLF_dead5sums[x_96] = (x_98 + 1.0);
+                }
+                default: {
+                }
+              }
+
+              continuing {
+                let x_101 : i32 = GLF_dead5r;
+                GLF_dead5r = (x_101 + 1);
+              }
+            }
+
+            continuing {
+              let x_103 : i32 = GLF_dead5c;
+              GLF_dead5c = (x_103 + 1);
+            }
+          }
+          let x_105 : i32 = msb10;
+          msb10 = (x_105 + 1);
+
+          continuing {
+            let x_107 : i32 = GLF_dead5rows;
+            GLF_dead5rows = (x_107 + 1);
+          }
+        }
+
+        continuing {
+          let x_109 : i32 = GLF_dead5cols;
+          GLF_dead5cols = (x_109 + 1);
+        }
+      }
+    }
+    let x_111 : i32 = i;
+    i = (x_111 + 1);
+
+    continuing {
+      let x_113 : i32 = i;
+      if ((x_113 < 200)) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-loops-switch/0.wgsl b/test/vk-gl-cts/graphicsfuzz/nested-loops-switch/0.wgsl
new file mode 100644
index 0000000..31f3f0e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-loops-switch/0.wgsl
@@ -0,0 +1,121 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  var GLF_dead5cols : i32;
+  var GLF_dead5rows : i32;
+  var GLF_dead5c : i32;
+  var GLF_dead5r : i32;
+  var msb10 : i32;
+  var donor_replacementGLF_dead5sums : array<f32, 9>;
+  i = 0;
+  loop {
+    let x_45 : i32 = i;
+    let x_47 : f32 = x_6.injectionSwitch.x;
+    if ((x_45 >= i32(x_47))) {
+      break;
+    }
+    let x_53 : f32 = x_6.injectionSwitch.y;
+    if ((0.0 > x_53)) {
+      GLF_dead5cols = 2;
+      loop {
+        let x_61 : i32 = GLF_dead5cols;
+        if ((x_61 <= 4)) {
+        } else {
+          break;
+        }
+        GLF_dead5rows = 2;
+        loop {
+          let x_68 : i32 = GLF_dead5rows;
+          if ((x_68 <= 4)) {
+          } else {
+            break;
+          }
+          GLF_dead5c = 0;
+          loop {
+            let x_75 : i32 = GLF_dead5c;
+            let x_76 : i32 = GLF_dead5cols;
+            if ((x_75 < x_76)) {
+            } else {
+              break;
+            }
+            GLF_dead5r = 0;
+            loop {
+              let x_83 : i32 = GLF_dead5r;
+              let x_84 : i32 = GLF_dead5rows;
+              if ((x_83 < x_84)) {
+              } else {
+                break;
+              }
+              let x_87 : i32 = msb10;
+              switch(x_87) {
+                case 1, 8: {
+                  let x_90 : i32 = msb10;
+                  let x_92 : i32 = msb10;
+                  let x_95 : i32 = msb10;
+                  let x_96 : i32 = select(0, x_95, ((x_90 >= 0) && (x_92 < 9)));
+                  let x_98 : f32 = donor_replacementGLF_dead5sums[x_96];
+                  donor_replacementGLF_dead5sums[x_96] = (x_98 + 1.0);
+                }
+                default: {
+                }
+              }
+
+              continuing {
+                let x_101 : i32 = GLF_dead5r;
+                GLF_dead5r = (x_101 + 1);
+              }
+            }
+
+            continuing {
+              let x_103 : i32 = GLF_dead5c;
+              GLF_dead5c = (x_103 + 1);
+            }
+          }
+          let x_105 : i32 = msb10;
+          msb10 = (x_105 + 1);
+
+          continuing {
+            let x_107 : i32 = GLF_dead5rows;
+            GLF_dead5rows = (x_107 + 1);
+          }
+        }
+
+        continuing {
+          let x_109 : i32 = GLF_dead5cols;
+          GLF_dead5cols = (x_109 + 1);
+        }
+      }
+    }
+    let x_111 : i32 = i;
+    i = (x_111 + 1);
+
+    continuing {
+      let x_113 : i32 = i;
+      if ((x_113 < 200)) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-loops-switch/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/nested-loops-switch/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..938e563
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-loops-switch/0.wgsl.expected.hlsl
@@ -0,0 +1,85 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int i = 0;
+  int GLF_dead5cols = 0;
+  int GLF_dead5rows = 0;
+  int GLF_dead5c = 0;
+  int GLF_dead5r = 0;
+  int msb10 = 0;
+  float donor_replacementGLF_dead5sums[9] = (float[9])0;
+  i = 0;
+  while (true) {
+    const int x_45 = i;
+    const float x_47 = asfloat(x_6[0].x);
+    if ((x_45 >= int(x_47))) {
+      break;
+    }
+    const float x_53 = asfloat(x_6[0].y);
+    if ((0.0f > x_53)) {
+      GLF_dead5cols = 2;
+      {
+        for(; (GLF_dead5cols <= 4); GLF_dead5cols = (GLF_dead5cols + 1)) {
+          GLF_dead5rows = 2;
+          {
+            for(; (GLF_dead5rows <= 4); GLF_dead5rows = (GLF_dead5rows + 1)) {
+              GLF_dead5c = 0;
+              {
+                for(; (GLF_dead5c < GLF_dead5cols); GLF_dead5c = (GLF_dead5c + 1)) {
+                  GLF_dead5r = 0;
+                  {
+                    for(; (GLF_dead5r < GLF_dead5rows); GLF_dead5r = (GLF_dead5r + 1)) {
+                      switch(msb10) {
+                        case 1:
+                        case 8: {
+                          bool tint_tmp = (msb10 >= 0);
+                          if (tint_tmp) {
+                            tint_tmp = (msb10 < 9);
+                          }
+                          const int x_96 = ((tint_tmp) ? msb10 : 0);
+                          const float x_98 = donor_replacementGLF_dead5sums[x_96];
+                          donor_replacementGLF_dead5sums[x_96] = (x_98 + 1.0f);
+                          break;
+                        }
+                        default: {
+                          break;
+                        }
+                      }
+                    }
+                  }
+                }
+              }
+              msb10 = (msb10 + 1);
+            }
+          }
+        }
+      }
+    }
+    i = (i + 1);
+    {
+      if ((i < 200)) {
+      } else {
+        break;
+      }
+    }
+  }
+  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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-loops-switch/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/nested-loops-switch/0.wgsl.expected.msl
new file mode 100644
index 0000000..d1d24c8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-loops-switch/0.wgsl.expected.msl
@@ -0,0 +1,124 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  float arr[9];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int i = 0;
+  int GLF_dead5cols = 0;
+  int GLF_dead5rows = 0;
+  int GLF_dead5c = 0;
+  int GLF_dead5r = 0;
+  int msb10 = 0;
+  tint_array_wrapper donor_replacementGLF_dead5sums = {};
+  i = 0;
+  while (true) {
+    int const x_45 = i;
+    float const x_47 = x_6.injectionSwitch.x;
+    if ((x_45 >= int(x_47))) {
+      break;
+    }
+    float const x_53 = x_6.injectionSwitch.y;
+    if ((0.0f > x_53)) {
+      GLF_dead5cols = 2;
+      while (true) {
+        int const x_61 = GLF_dead5cols;
+        if ((x_61 <= 4)) {
+        } else {
+          break;
+        }
+        GLF_dead5rows = 2;
+        while (true) {
+          int const x_68 = GLF_dead5rows;
+          if ((x_68 <= 4)) {
+          } else {
+            break;
+          }
+          GLF_dead5c = 0;
+          while (true) {
+            int const x_75 = GLF_dead5c;
+            int const x_76 = GLF_dead5cols;
+            if ((x_75 < x_76)) {
+            } else {
+              break;
+            }
+            GLF_dead5r = 0;
+            while (true) {
+              int const x_83 = GLF_dead5r;
+              int const x_84 = GLF_dead5rows;
+              if ((x_83 < x_84)) {
+              } else {
+                break;
+              }
+              int const x_87 = msb10;
+              switch(x_87) {
+                case 1:
+                case 8: {
+                  int const x_90 = msb10;
+                  int const x_92 = msb10;
+                  int const x_95 = msb10;
+                  int const x_96 = select(0, x_95, ((x_90 >= 0) && (x_92 < 9)));
+                  float const x_98 = donor_replacementGLF_dead5sums.arr[x_96];
+                  donor_replacementGLF_dead5sums.arr[x_96] = (x_98 + 1.0f);
+                  break;
+                }
+                default: {
+                  break;
+                }
+              }
+              {
+                int const x_101 = GLF_dead5r;
+                GLF_dead5r = (x_101 + 1);
+              }
+            }
+            {
+              int const x_103 = GLF_dead5c;
+              GLF_dead5c = (x_103 + 1);
+            }
+          }
+          int const x_105 = msb10;
+          msb10 = (x_105 + 1);
+          {
+            int const x_107 = GLF_dead5rows;
+            GLF_dead5rows = (x_107 + 1);
+          }
+        }
+        {
+          int const x_109 = GLF_dead5cols;
+          GLF_dead5cols = (x_109 + 1);
+        }
+      }
+    }
+    int const x_111 = i;
+    i = (x_111 + 1);
+    {
+      int const x_113 = i;
+      if ((x_113 < 200)) {
+      } else {
+        break;
+      }
+    }
+  }
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-loops-switch/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/nested-loops-switch/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..cb7cc44
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-loops-switch/0.wgsl.expected.spvasm
@@ -0,0 +1,262 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 145
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %GLF_dead5cols "GLF_dead5cols"
+               OpName %GLF_dead5rows "GLF_dead5rows"
+               OpName %GLF_dead5c "GLF_dead5c"
+               OpName %GLF_dead5r "GLF_dead5r"
+               OpName %msb10 "msb10"
+               OpName %donor_replacementGLF_dead5sums "donor_replacementGLF_dead5sums"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_float_uint_9 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %19 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_9 = OpConstant %uint 9
+%_arr_float_uint_9 = OpTypeArray %float %uint_9
+%_ptr_Function__arr_float_uint_9 = OpTypePointer Function %_arr_float_uint_9
+         %30 = OpConstantNull %_arr_float_uint_9
+      %int_0 = OpConstant %int 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+     %uint_1 = OpConstant %uint 1
+    %float_0 = OpConstant %float 0
+      %int_2 = OpConstant %int 2
+      %int_4 = OpConstant %int 4
+      %int_9 = OpConstant %int 9
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_1 = OpConstant %float 1
+      %int_1 = OpConstant %int 1
+    %int_200 = OpConstant %int 200
+        %132 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %133 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %19
+%GLF_dead5cols = OpVariable %_ptr_Function_int Function %19
+%GLF_dead5rows = OpVariable %_ptr_Function_int Function %19
+ %GLF_dead5c = OpVariable %_ptr_Function_int Function %19
+ %GLF_dead5r = OpVariable %_ptr_Function_int Function %19
+      %msb10 = OpVariable %_ptr_Function_int Function %19
+%donor_replacementGLF_dead5sums = OpVariable %_ptr_Function__arr_float_uint_9 Function %30
+               OpStore %i %int_0
+               OpBranch %32
+         %32 = OpLabel
+               OpLoopMerge %33 %34 None
+               OpBranch %35
+         %35 = OpLabel
+         %36 = OpLoad %int %i
+         %39 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+         %40 = OpLoad %float %39
+         %41 = OpConvertFToS %int %40
+         %42 = OpSGreaterThanEqual %bool %36 %41
+               OpSelectionMerge %44 None
+               OpBranchConditional %42 %45 %44
+         %45 = OpLabel
+               OpBranch %33
+         %44 = OpLabel
+         %47 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %48 = OpLoad %float %47
+         %50 = OpFOrdGreaterThan %bool %float_0 %48
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %51
+         %52 = OpLabel
+               OpStore %GLF_dead5cols %int_2
+               OpBranch %54
+         %54 = OpLabel
+               OpLoopMerge %55 %56 None
+               OpBranch %57
+         %57 = OpLabel
+         %58 = OpLoad %int %GLF_dead5cols
+         %60 = OpSLessThanEqual %bool %58 %int_4
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %63
+         %62 = OpLabel
+               OpBranch %61
+         %63 = OpLabel
+               OpBranch %55
+         %61 = OpLabel
+               OpStore %GLF_dead5rows %int_2
+               OpBranch %64
+         %64 = OpLabel
+               OpLoopMerge %65 %66 None
+               OpBranch %67
+         %67 = OpLabel
+         %68 = OpLoad %int %GLF_dead5rows
+         %69 = OpSLessThanEqual %bool %68 %int_4
+               OpSelectionMerge %70 None
+               OpBranchConditional %69 %71 %72
+         %71 = OpLabel
+               OpBranch %70
+         %72 = OpLabel
+               OpBranch %65
+         %70 = OpLabel
+               OpStore %GLF_dead5c %int_0
+               OpBranch %73
+         %73 = OpLabel
+               OpLoopMerge %74 %75 None
+               OpBranch %76
+         %76 = OpLabel
+         %77 = OpLoad %int %GLF_dead5c
+         %78 = OpLoad %int %GLF_dead5cols
+         %79 = OpSLessThan %bool %77 %78
+               OpSelectionMerge %80 None
+               OpBranchConditional %79 %81 %82
+         %81 = OpLabel
+               OpBranch %80
+         %82 = OpLabel
+               OpBranch %74
+         %80 = OpLabel
+               OpStore %GLF_dead5r %int_0
+               OpBranch %83
+         %83 = OpLabel
+               OpLoopMerge %84 %85 None
+               OpBranch %86
+         %86 = OpLabel
+         %87 = OpLoad %int %GLF_dead5r
+         %88 = OpLoad %int %GLF_dead5rows
+         %89 = OpSLessThan %bool %87 %88
+               OpSelectionMerge %90 None
+               OpBranchConditional %89 %91 %92
+         %91 = OpLabel
+               OpBranch %90
+         %92 = OpLabel
+               OpBranch %84
+         %90 = OpLabel
+         %93 = OpLoad %int %msb10
+               OpSelectionMerge %94 None
+               OpSwitch %93 %95 1 %96 8 %96
+         %96 = OpLabel
+         %97 = OpLoad %int %msb10
+         %98 = OpLoad %int %msb10
+         %99 = OpLoad %int %msb10
+        %101 = OpSGreaterThanEqual %bool %97 %int_0
+               OpSelectionMerge %102 None
+               OpBranchConditional %101 %103 %102
+        %103 = OpLabel
+        %105 = OpSLessThan %bool %98 %int_9
+               OpBranch %102
+        %102 = OpLabel
+        %106 = OpPhi %bool %101 %96 %105 %103
+        %100 = OpSelect %int %106 %99 %int_0
+        %108 = OpAccessChain %_ptr_Function_float %donor_replacementGLF_dead5sums %100
+        %109 = OpLoad %float %108
+        %110 = OpAccessChain %_ptr_Function_float %donor_replacementGLF_dead5sums %100
+        %112 = OpFAdd %float %109 %float_1
+               OpStore %110 %112
+               OpBranch %94
+         %95 = OpLabel
+               OpBranch %94
+         %94 = OpLabel
+               OpBranch %85
+         %85 = OpLabel
+        %113 = OpLoad %int %GLF_dead5r
+        %115 = OpIAdd %int %113 %int_1
+               OpStore %GLF_dead5r %115
+               OpBranch %83
+         %84 = OpLabel
+               OpBranch %75
+         %75 = OpLabel
+        %116 = OpLoad %int %GLF_dead5c
+        %117 = OpIAdd %int %116 %int_1
+               OpStore %GLF_dead5c %117
+               OpBranch %73
+         %74 = OpLabel
+        %118 = OpLoad %int %msb10
+        %119 = OpIAdd %int %118 %int_1
+               OpStore %msb10 %119
+               OpBranch %66
+         %66 = OpLabel
+        %120 = OpLoad %int %GLF_dead5rows
+        %121 = OpIAdd %int %120 %int_1
+               OpStore %GLF_dead5rows %121
+               OpBranch %64
+         %65 = OpLabel
+               OpBranch %56
+         %56 = OpLabel
+        %122 = OpLoad %int %GLF_dead5cols
+        %123 = OpIAdd %int %122 %int_1
+               OpStore %GLF_dead5cols %123
+               OpBranch %54
+         %55 = OpLabel
+               OpBranch %51
+         %51 = OpLabel
+        %124 = OpLoad %int %i
+        %125 = OpIAdd %int %124 %int_1
+               OpStore %i %125
+               OpBranch %34
+         %34 = OpLabel
+        %126 = OpLoad %int %i
+        %128 = OpSLessThan %bool %126 %int_200
+               OpSelectionMerge %129 None
+               OpBranchConditional %128 %130 %131
+        %130 = OpLabel
+               OpBranch %129
+        %131 = OpLabel
+               OpBranch %33
+        %129 = OpLabel
+               OpBranch %32
+         %33 = OpLabel
+               OpStore %x_GLF_color %132
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %133
+%tint_symbol = OpFunctionParameter %main_out
+        %137 = OpLabel
+        %138 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %138
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+        %140 = OpLabel
+        %141 = OpFunctionCall %void %main_1
+        %143 = OpLoad %v4float %x_GLF_color
+        %144 = OpCompositeConstruct %main_out %143
+        %142 = OpFunctionCall %void %tint_symbol_2 %144
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 34[%34] is not post dominated by the back-edge block 129[%129]
+  %129 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-loops-switch/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/nested-loops-switch/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..31f3f0e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-loops-switch/0.wgsl.expected.wgsl
@@ -0,0 +1,121 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  var GLF_dead5cols : i32;
+  var GLF_dead5rows : i32;
+  var GLF_dead5c : i32;
+  var GLF_dead5r : i32;
+  var msb10 : i32;
+  var donor_replacementGLF_dead5sums : array<f32, 9>;
+  i = 0;
+  loop {
+    let x_45 : i32 = i;
+    let x_47 : f32 = x_6.injectionSwitch.x;
+    if ((x_45 >= i32(x_47))) {
+      break;
+    }
+    let x_53 : f32 = x_6.injectionSwitch.y;
+    if ((0.0 > x_53)) {
+      GLF_dead5cols = 2;
+      loop {
+        let x_61 : i32 = GLF_dead5cols;
+        if ((x_61 <= 4)) {
+        } else {
+          break;
+        }
+        GLF_dead5rows = 2;
+        loop {
+          let x_68 : i32 = GLF_dead5rows;
+          if ((x_68 <= 4)) {
+          } else {
+            break;
+          }
+          GLF_dead5c = 0;
+          loop {
+            let x_75 : i32 = GLF_dead5c;
+            let x_76 : i32 = GLF_dead5cols;
+            if ((x_75 < x_76)) {
+            } else {
+              break;
+            }
+            GLF_dead5r = 0;
+            loop {
+              let x_83 : i32 = GLF_dead5r;
+              let x_84 : i32 = GLF_dead5rows;
+              if ((x_83 < x_84)) {
+              } else {
+                break;
+              }
+              let x_87 : i32 = msb10;
+              switch(x_87) {
+                case 1, 8: {
+                  let x_90 : i32 = msb10;
+                  let x_92 : i32 = msb10;
+                  let x_95 : i32 = msb10;
+                  let x_96 : i32 = select(0, x_95, ((x_90 >= 0) && (x_92 < 9)));
+                  let x_98 : f32 = donor_replacementGLF_dead5sums[x_96];
+                  donor_replacementGLF_dead5sums[x_96] = (x_98 + 1.0);
+                }
+                default: {
+                }
+              }
+
+              continuing {
+                let x_101 : i32 = GLF_dead5r;
+                GLF_dead5r = (x_101 + 1);
+              }
+            }
+
+            continuing {
+              let x_103 : i32 = GLF_dead5c;
+              GLF_dead5c = (x_103 + 1);
+            }
+          }
+          let x_105 : i32 = msb10;
+          msb10 = (x_105 + 1);
+
+          continuing {
+            let x_107 : i32 = GLF_dead5rows;
+            GLF_dead5rows = (x_107 + 1);
+          }
+        }
+
+        continuing {
+          let x_109 : i32 = GLF_dead5cols;
+          GLF_dead5cols = (x_109 + 1);
+        }
+      }
+    }
+    let x_111 : i32 = i;
+    i = (x_111 + 1);
+
+    continuing {
+      let x_113 : i32 = i;
+      if ((x_113 < 200)) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.spvasm
new file mode 100644
index 0000000..7a18a05
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.spvasm
@@ -0,0 +1,72 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color %gl_FragCoord
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpDecorate %_GLF_color Location 0
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %14 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+       %bool = OpTypeBool
+         %27 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %8
+         %28 = OpLabel
+               OpStore %_GLF_color %14
+         %29 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %30 = OpLoad %float %29
+         %31 = OpConvertFToS %int %30
+               OpSelectionMerge %32 None
+               OpSwitch %31 %32 0 %33 42 %34
+         %33 = OpLabel
+               OpSelectionMerge %35 None
+               OpSwitch %int_1 %35 1 %36
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %38 = OpLoad %float %37
+         %39 = OpFOrdGreaterThanEqual %bool %38 %float_0
+               OpSelectionMerge %40 None
+               OpBranchConditional %39 %41 %40
+         %41 = OpLabel
+               OpStore %_GLF_color %27
+               OpBranch %35
+         %40 = OpLabel
+               OpKill
+         %35 = OpLabel
+               OpBranch %34
+         %34 = OpLabel
+               OpBranch %32
+         %32 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..c45a7a5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,55 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  x_GLF_color = float4(0.0f, 0.0f, 0.0f, 1.0f);
+  const float x_30 = asfloat(x_6[0].x);
+  switch(int(x_30)) {
+    case 0: {
+      switch(1) {
+        case 1: {
+          const float x_38 = gl_FragCoord.y;
+          if ((x_38 >= 0.0f)) {
+            x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+            break;
+          }
+          discard;
+          break;
+        }
+        default: {
+          break;
+        }
+      }
+      /* fallthrough */
+    }
+    case 42: {
+      break;
+    }
+    default: {
+      break;
+    }
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..4f27a35
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.spvasm.expected.msl
@@ -0,0 +1,54 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  *(tint_symbol_5) = float4(0.0f, 0.0f, 0.0f, 1.0f);
+  float const x_30 = x_6.injectionSwitch.x;
+  switch(int(x_30)) {
+    case 0: {
+      switch(1) {
+        case 1: {
+          float const x_38 = (*(tint_symbol_6)).y;
+          if ((x_38 >= 0.0f)) {
+            *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+            break;
+          }
+          discard_fragment();
+          break;
+        }
+        default: {
+          break;
+        }
+      }
+      /* fallthrough */
+    }
+    case 42: {
+      break;
+    }
+    default: {
+      break;
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_8), &(tint_symbol_7));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..6a58a17
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,110 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 59
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %21 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+        %int = OpTypeInt 32 1
+      %int_1 = OpConstant %int 1
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+       %bool = OpTypeBool
+         %45 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %46 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+               OpStore %x_GLF_color %21
+         %25 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+         %26 = OpLoad %float %25
+         %28 = OpConvertFToS %int %26
+               OpSelectionMerge %27 None
+               OpSwitch %28 %30 0 %31 42 %32
+         %31 = OpLabel
+               OpSelectionMerge %33 None
+               OpSwitch %int_1 %35 1 %36
+         %36 = OpLabel
+         %39 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %40 = OpLoad %float %39
+         %41 = OpFOrdGreaterThanEqual %bool %40 %float_0
+               OpSelectionMerge %43 None
+               OpBranchConditional %41 %44 %43
+         %44 = OpLabel
+               OpStore %x_GLF_color %45
+               OpBranch %33
+         %43 = OpLabel
+               OpKill
+         %35 = OpLabel
+               OpBranch %33
+         %33 = OpLabel
+               OpBranch %32
+         %32 = OpLabel
+               OpBranch %27
+         %30 = OpLabel
+               OpBranch %27
+         %27 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %46
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %50 = OpLabel
+         %51 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %51
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %53 = OpLabel
+         %54 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %54
+         %55 = OpFunctionCall %void %main_1
+         %57 = OpLoad %v4float %x_GLF_color
+         %58 = OpCompositeConstruct %main_out %57
+         %56 = OpFunctionCall %void %tint_symbol_3 %58
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..44294d2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,49 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  let x_30 : f32 = x_6.injectionSwitch.x;
+  switch(i32(x_30)) {
+    case 0: {
+      switch(1) {
+        case 1: {
+          let x_38 : f32 = gl_FragCoord.y;
+          if ((x_38 >= 0.0)) {
+            x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+            break;
+          }
+          discard;
+        }
+        default: {
+        }
+      }
+      fallthrough;
+    }
+    case 42: {
+    }
+    default: {
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.wgsl
new file mode 100644
index 0000000..44294d2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.wgsl
@@ -0,0 +1,49 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  let x_30 : f32 = x_6.injectionSwitch.x;
+  switch(i32(x_30)) {
+    case 0: {
+      switch(1) {
+        case 1: {
+          let x_38 : f32 = gl_FragCoord.y;
+          if ((x_38 >= 0.0)) {
+            x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+            break;
+          }
+          discard;
+        }
+        default: {
+        }
+      }
+      fallthrough;
+    }
+    case 42: {
+    }
+    default: {
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..c45a7a5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,55 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  x_GLF_color = float4(0.0f, 0.0f, 0.0f, 1.0f);
+  const float x_30 = asfloat(x_6[0].x);
+  switch(int(x_30)) {
+    case 0: {
+      switch(1) {
+        case 1: {
+          const float x_38 = gl_FragCoord.y;
+          if ((x_38 >= 0.0f)) {
+            x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+            break;
+          }
+          discard;
+          break;
+        }
+        default: {
+          break;
+        }
+      }
+      /* fallthrough */
+    }
+    case 42: {
+      break;
+    }
+    default: {
+      break;
+    }
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..4f27a35
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.wgsl.expected.msl
@@ -0,0 +1,54 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  *(tint_symbol_5) = float4(0.0f, 0.0f, 0.0f, 1.0f);
+  float const x_30 = x_6.injectionSwitch.x;
+  switch(int(x_30)) {
+    case 0: {
+      switch(1) {
+        case 1: {
+          float const x_38 = (*(tint_symbol_6)).y;
+          if ((x_38 >= 0.0f)) {
+            *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+            break;
+          }
+          discard_fragment();
+          break;
+        }
+        default: {
+          break;
+        }
+      }
+      /* fallthrough */
+    }
+    case 42: {
+      break;
+    }
+    default: {
+      break;
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_8), &(tint_symbol_7));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..6a58a17
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,110 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 59
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %21 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+        %int = OpTypeInt 32 1
+      %int_1 = OpConstant %int 1
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+       %bool = OpTypeBool
+         %45 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %46 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+               OpStore %x_GLF_color %21
+         %25 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+         %26 = OpLoad %float %25
+         %28 = OpConvertFToS %int %26
+               OpSelectionMerge %27 None
+               OpSwitch %28 %30 0 %31 42 %32
+         %31 = OpLabel
+               OpSelectionMerge %33 None
+               OpSwitch %int_1 %35 1 %36
+         %36 = OpLabel
+         %39 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %40 = OpLoad %float %39
+         %41 = OpFOrdGreaterThanEqual %bool %40 %float_0
+               OpSelectionMerge %43 None
+               OpBranchConditional %41 %44 %43
+         %44 = OpLabel
+               OpStore %x_GLF_color %45
+               OpBranch %33
+         %43 = OpLabel
+               OpKill
+         %35 = OpLabel
+               OpBranch %33
+         %33 = OpLabel
+               OpBranch %32
+         %32 = OpLabel
+               OpBranch %27
+         %30 = OpLabel
+               OpBranch %27
+         %27 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %46
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %50 = OpLabel
+         %51 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %51
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %53 = OpLabel
+         %54 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %54
+         %55 = OpFunctionCall %void %main_1
+         %57 = OpLoad %v4float %x_GLF_color
+         %58 = OpCompositeConstruct %main_out %57
+         %56 = OpFunctionCall %void %tint_symbol_3 %58
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..44294d2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,49 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  let x_30 : f32 = x_6.injectionSwitch.x;
+  switch(i32(x_30)) {
+    case 0: {
+      switch(1) {
+        case 1: {
+          let x_38 : f32 = gl_FragCoord.y;
+          if ((x_38 >= 0.0)) {
+            x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+            break;
+          }
+          discard;
+        }
+        default: {
+        }
+      }
+      fallthrough;
+    }
+    case 42: {
+    }
+    default: {
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/one-sized-array/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/one-sized-array/0-opt.spvasm
new file mode 100644
index 0000000..4864c87
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/one-sized-array/0-opt.spvasm
@@ -0,0 +1,87 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %_ ""
+               OpDecorate %_GLF_color Location 0
+               OpMemberDecorate %buf0 0 RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %6 RelaxedPrecision
+               OpDecorate %7 RelaxedPrecision
+               OpDecorate %8 RelaxedPrecision
+               OpDecorate %9 RelaxedPrecision
+               OpDecorate %10 RelaxedPrecision
+               OpDecorate %11 RelaxedPrecision
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_int_uint_1 = OpTypeArray %int %uint_1
+%_ptr_Function_int = OpTypePointer Function %int
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %23 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+    %float_1 = OpConstant %float 1
+         %31 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function__arr_int_uint_1 = OpTypePointer Function %_arr_int_uint_1
+       %main = OpFunction %void None %13
+         %34 = OpLabel
+         %10 = OpVariable %_ptr_Function__arr_int_uint_1 Function
+          %9 = OpVariable %_ptr_Function__arr_int_uint_1 Function
+         %35 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+          %6 = OpLoad %int %35
+         %36 = OpAccessChain %_ptr_Function_int %9 %int_0
+               OpStore %36 %6
+         %37 = OpLoad %_arr_int_uint_1 %9
+               OpStore %10 %37
+         %38 = OpAccessChain %_ptr_Function_int %9 %int_0
+          %7 = OpLoad %int %38
+               OpSelectionMerge %39 None
+               OpSwitch %uint_0 %40
+         %40 = OpLabel
+               OpStore %_GLF_color %23
+         %41 = OpAccessChain %_ptr_Function_int %10 %int_0
+          %8 = OpLoad %int %41
+         %42 = OpIEqual %bool %8 %7
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %43
+         %44 = OpLabel
+               OpBranch %39
+         %43 = OpLabel
+               OpBranch %39
+         %39 = OpLabel
+         %11 = OpPhi %int %int_1 %44 %int_2 %43
+         %45 = OpIEqual %bool %11 %int_1
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %48
+         %47 = OpLabel
+               OpStore %_GLF_color %31
+               OpBranch %46
+         %48 = OpLabel
+               OpStore %_GLF_color %23
+               OpBranch %46
+         %46 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/one-sized-array/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/one-sized-array/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..b530d09
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/one-sized-array/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,47 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+
+void main_1() {
+  int x_10[1] = (int[1])0;
+  int x_9[1] = (int[1])0;
+  int x_7 = 0;
+  int x_11_phi = 0;
+  const int x_6 = asint(x_5[0].x);
+  x_9[0] = x_6;
+  x_10 = x_9;
+  x_7 = x_9[0];
+  switch(0u) {
+    default: {
+      x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+      const int x_8 = x_10[0];
+      if ((x_8 == asint(x_7))) {
+        x_11_phi = 1;
+        break;
+      }
+      x_11_phi = 2;
+      break;
+    }
+  }
+  if ((x_11_phi == 1)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/one-sized-array/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/one-sized-array/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..7e85bb9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/one-sized-array/0-opt.spvasm.expected.msl
@@ -0,0 +1,55 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int zero;
+};
+struct tint_array_wrapper {
+  int arr[1];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  tint_array_wrapper x_10 = {};
+  tint_array_wrapper x_9 = {};
+  int x_7 = 0;
+  int x_11_phi = 0;
+  int const x_6 = x_5.zero;
+  x_9.arr[0] = x_6;
+  tint_array_wrapper const x_37 = x_9;
+  x_10 = x_37;
+  x_7 = x_9.arr[0];
+  switch(0u) {
+    default: {
+      *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+      int const x_8 = x_10.arr[0];
+      if ((x_8 == as_type<int>(x_7))) {
+        x_11_phi = 1;
+        break;
+      }
+      x_11_phi = 2;
+      break;
+    }
+  }
+  int const x_11 = x_11_phi;
+  if ((x_11 == 1)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/one-sized-array/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/one-sized-array/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..06b6414
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/one-sized-array/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,125 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 69
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %x_5 "x_5"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_10 "x_10"
+               OpName %x_9 "x_9"
+               OpName %x_7 "x_7"
+               OpName %x_11_phi "x_11_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_1 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_int_uint_1 = OpTypeArray %int %uint_1
+%_ptr_Function__arr_int_uint_1 = OpTypePointer Function %_arr_int_uint_1
+         %21 = OpConstantNull %_arr_int_uint_1
+%_ptr_Function_int = OpTypePointer Function %int
+         %25 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+    %float_0 = OpConstant %float 0
+         %39 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+    %float_1 = OpConstant %float 1
+         %56 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %57 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+       %x_10 = OpVariable %_ptr_Function__arr_int_uint_1 Function %21
+        %x_9 = OpVariable %_ptr_Function__arr_int_uint_1 Function %21
+        %x_7 = OpVariable %_ptr_Function_int Function %25
+   %x_11_phi = OpVariable %_ptr_Function_int Function %25
+         %29 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0
+         %30 = OpLoad %int %29
+         %32 = OpAccessChain %_ptr_Function_int %x_9 %int_0
+               OpStore %32 %30
+         %33 = OpLoad %_arr_int_uint_1 %x_9
+               OpStore %x_10 %33
+         %34 = OpAccessChain %_ptr_Function_int %x_9 %int_0
+         %35 = OpLoad %int %34
+               OpStore %x_7 %35
+               OpSelectionMerge %36 None
+               OpSwitch %uint_0 %37
+         %37 = OpLabel
+               OpStore %x_GLF_color %39
+         %40 = OpAccessChain %_ptr_Function_int %x_10 %int_0
+         %41 = OpLoad %int %40
+         %43 = OpLoad %int %x_7
+         %42 = OpCopyObject %int %43
+         %44 = OpIEqual %bool %41 %42
+               OpSelectionMerge %46 None
+               OpBranchConditional %44 %47 %46
+         %47 = OpLabel
+               OpStore %x_11_phi %int_1
+               OpBranch %36
+         %46 = OpLabel
+               OpStore %x_11_phi %int_2
+               OpBranch %36
+         %36 = OpLabel
+         %50 = OpLoad %int %x_11_phi
+         %51 = OpIEqual %bool %50 %int_1
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %54
+         %53 = OpLabel
+               OpStore %x_GLF_color %56
+               OpBranch %52
+         %54 = OpLabel
+               OpStore %x_GLF_color %39
+               OpBranch %52
+         %52 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %57
+%tint_symbol = OpFunctionParameter %main_out
+         %61 = OpLabel
+         %62 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %62
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %64 = OpLabel
+         %65 = OpFunctionCall %void %main_1
+         %67 = OpLoad %v4float %x_GLF_color
+         %68 = OpCompositeConstruct %main_out %67
+         %66 = OpFunctionCall %void %tint_symbol_2 %68
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/one-sized-array/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/one-sized-array/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..62409af
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/one-sized-array/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,49 @@
+[[block]]
+struct buf0 {
+  zero : i32;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+fn main_1() {
+  var x_10 : array<i32, 1>;
+  var x_9 : array<i32, 1>;
+  var x_7 : i32;
+  var x_11_phi : i32;
+  let x_6 : i32 = x_5.zero;
+  x_9[0] = x_6;
+  let x_37 : array<i32, 1> = x_9;
+  x_10 = x_37;
+  x_7 = x_9[0];
+  switch(0u) {
+    default: {
+      x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+      let x_8 : i32 = x_10[0];
+      if ((x_8 == bitcast<i32>(x_7))) {
+        x_11_phi = 1;
+        break;
+      }
+      x_11_phi = 2;
+    }
+  }
+  let x_11 : i32 = x_11_phi;
+  if ((x_11 == 1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/one-sized-array/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/one-sized-array/0-opt.wgsl
new file mode 100644
index 0000000..62409af
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/one-sized-array/0-opt.wgsl
@@ -0,0 +1,49 @@
+[[block]]
+struct buf0 {
+  zero : i32;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+fn main_1() {
+  var x_10 : array<i32, 1>;
+  var x_9 : array<i32, 1>;
+  var x_7 : i32;
+  var x_11_phi : i32;
+  let x_6 : i32 = x_5.zero;
+  x_9[0] = x_6;
+  let x_37 : array<i32, 1> = x_9;
+  x_10 = x_37;
+  x_7 = x_9[0];
+  switch(0u) {
+    default: {
+      x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+      let x_8 : i32 = x_10[0];
+      if ((x_8 == bitcast<i32>(x_7))) {
+        x_11_phi = 1;
+        break;
+      }
+      x_11_phi = 2;
+    }
+  }
+  let x_11 : i32 = x_11_phi;
+  if ((x_11 == 1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/one-sized-array/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/one-sized-array/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..b530d09
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/one-sized-array/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,47 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+
+void main_1() {
+  int x_10[1] = (int[1])0;
+  int x_9[1] = (int[1])0;
+  int x_7 = 0;
+  int x_11_phi = 0;
+  const int x_6 = asint(x_5[0].x);
+  x_9[0] = x_6;
+  x_10 = x_9;
+  x_7 = x_9[0];
+  switch(0u) {
+    default: {
+      x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+      const int x_8 = x_10[0];
+      if ((x_8 == asint(x_7))) {
+        x_11_phi = 1;
+        break;
+      }
+      x_11_phi = 2;
+      break;
+    }
+  }
+  if ((x_11_phi == 1)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/one-sized-array/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/one-sized-array/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..7e85bb9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/one-sized-array/0-opt.wgsl.expected.msl
@@ -0,0 +1,55 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int zero;
+};
+struct tint_array_wrapper {
+  int arr[1];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  tint_array_wrapper x_10 = {};
+  tint_array_wrapper x_9 = {};
+  int x_7 = 0;
+  int x_11_phi = 0;
+  int const x_6 = x_5.zero;
+  x_9.arr[0] = x_6;
+  tint_array_wrapper const x_37 = x_9;
+  x_10 = x_37;
+  x_7 = x_9.arr[0];
+  switch(0u) {
+    default: {
+      *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+      int const x_8 = x_10.arr[0];
+      if ((x_8 == as_type<int>(x_7))) {
+        x_11_phi = 1;
+        break;
+      }
+      x_11_phi = 2;
+      break;
+    }
+  }
+  int const x_11 = x_11_phi;
+  if ((x_11 == 1)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/one-sized-array/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/one-sized-array/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..06b6414
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/one-sized-array/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,125 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 69
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %x_5 "x_5"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_10 "x_10"
+               OpName %x_9 "x_9"
+               OpName %x_7 "x_7"
+               OpName %x_11_phi "x_11_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_1 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_int_uint_1 = OpTypeArray %int %uint_1
+%_ptr_Function__arr_int_uint_1 = OpTypePointer Function %_arr_int_uint_1
+         %21 = OpConstantNull %_arr_int_uint_1
+%_ptr_Function_int = OpTypePointer Function %int
+         %25 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_0 = OpConstant %int 0
+    %float_0 = OpConstant %float 0
+         %39 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+    %float_1 = OpConstant %float 1
+         %56 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %57 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+       %x_10 = OpVariable %_ptr_Function__arr_int_uint_1 Function %21
+        %x_9 = OpVariable %_ptr_Function__arr_int_uint_1 Function %21
+        %x_7 = OpVariable %_ptr_Function_int Function %25
+   %x_11_phi = OpVariable %_ptr_Function_int Function %25
+         %29 = OpAccessChain %_ptr_Uniform_int %x_5 %uint_0
+         %30 = OpLoad %int %29
+         %32 = OpAccessChain %_ptr_Function_int %x_9 %int_0
+               OpStore %32 %30
+         %33 = OpLoad %_arr_int_uint_1 %x_9
+               OpStore %x_10 %33
+         %34 = OpAccessChain %_ptr_Function_int %x_9 %int_0
+         %35 = OpLoad %int %34
+               OpStore %x_7 %35
+               OpSelectionMerge %36 None
+               OpSwitch %uint_0 %37
+         %37 = OpLabel
+               OpStore %x_GLF_color %39
+         %40 = OpAccessChain %_ptr_Function_int %x_10 %int_0
+         %41 = OpLoad %int %40
+         %43 = OpLoad %int %x_7
+         %42 = OpCopyObject %int %43
+         %44 = OpIEqual %bool %41 %42
+               OpSelectionMerge %46 None
+               OpBranchConditional %44 %47 %46
+         %47 = OpLabel
+               OpStore %x_11_phi %int_1
+               OpBranch %36
+         %46 = OpLabel
+               OpStore %x_11_phi %int_2
+               OpBranch %36
+         %36 = OpLabel
+         %50 = OpLoad %int %x_11_phi
+         %51 = OpIEqual %bool %50 %int_1
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %54
+         %53 = OpLabel
+               OpStore %x_GLF_color %56
+               OpBranch %52
+         %54 = OpLabel
+               OpStore %x_GLF_color %39
+               OpBranch %52
+         %52 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %57
+%tint_symbol = OpFunctionParameter %main_out
+         %61 = OpLabel
+         %62 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %62
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %64 = OpLabel
+         %65 = OpFunctionCall %void %main_1
+         %67 = OpLoad %v4float %x_GLF_color
+         %68 = OpCompositeConstruct %main_out %67
+         %66 = OpFunctionCall %void %tint_symbol_2 %68
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/one-sized-array/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/one-sized-array/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..62409af
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/one-sized-array/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,49 @@
+[[block]]
+struct buf0 {
+  zero : i32;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+fn main_1() {
+  var x_10 : array<i32, 1>;
+  var x_9 : array<i32, 1>;
+  var x_7 : i32;
+  var x_11_phi : i32;
+  let x_6 : i32 = x_5.zero;
+  x_9[0] = x_6;
+  let x_37 : array<i32, 1> = x_9;
+  x_10 = x_37;
+  x_7 = x_9[0];
+  switch(0u) {
+    default: {
+      x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+      let x_8 : i32 = x_10[0];
+      if ((x_8 == bitcast<i32>(x_7))) {
+        x_11_phi = 1;
+        break;
+      }
+      x_11_phi = 2;
+    }
+  }
+  let x_11 : i32 = x_11_phi;
+  if ((x_11 == 1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/return-float-from-while-loop/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/return-float-from-while-loop/0-opt.spvasm
new file mode 100644
index 0000000..ef091fe
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/return-float-from-while-loop/0-opt.spvasm
@@ -0,0 +1,87 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+        %int = OpTypeInt 32 1
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_0 = OpConstant %float 0
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %24 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %25 = OpUndef %float
+         %26 = OpUndef %v4float
+       %main = OpFunction %void None %8
+         %27 = OpLabel
+         %28 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %29 = OpLoad %float %28
+         %30 = OpFOrdGreaterThan %bool %29 %float_1
+               OpSelectionMerge %31 None
+               OpBranchConditional %30 %32 %31
+         %32 = OpLabel
+               OpBranch %33
+         %33 = OpLabel
+               OpLoopMerge %34 %35 None
+               OpBranch %36
+         %36 = OpLabel
+               OpLoopMerge %37 %38 None
+               OpBranch %39
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %41 = OpLoad %float %40
+         %42 = OpFOrdLessThan %bool %41 %float_0
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %43
+         %44 = OpLabel
+               OpSelectionMerge %45 None
+               OpBranchConditional %30 %46 %38
+         %46 = OpLabel
+               OpBranch %37
+         %45 = OpLabel
+               OpBranch %38
+         %38 = OpLabel
+               OpBranch %36
+         %43 = OpLabel
+               OpBranch %37
+         %37 = OpLabel
+         %47 = OpPhi %float %float_1 %46 %25 %43
+               OpBranch %34
+         %35 = OpLabel
+               OpBranch %33
+         %34 = OpLabel
+         %48 = OpCompositeInsert %v4float %47 %26 1
+               OpStore %_GLF_color %48
+               OpBranch %31
+         %31 = OpLabel
+               OpStore %_GLF_color %24
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/return-float-from-while-loop/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/return-float-from-while-loop/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..abeefe6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/return-float-from-while-loop/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,57 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  bool x_30 = false;
+  float x_47 = 0.0f;
+  const float x_29 = asfloat(x_6[0].x);
+  x_30 = (x_29 > 1.0f);
+  if (x_30) {
+    while (true) {
+      float x_47_phi = 0.0f;
+      while (true) {
+        const float x_41 = gl_FragCoord.x;
+        if ((x_41 < 0.0f)) {
+          if (x_30) {
+            x_47_phi = 1.0f;
+            break;
+          } else {
+            continue;
+          }
+          continue;
+        }
+        x_47_phi = 0.0f;
+        break;
+      }
+      x_47 = x_47_phi;
+      break;
+    }
+    float4 x_48_1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    x_48_1.y = x_47;
+    x_GLF_color = x_48_1;
+  }
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/return-float-from-while-loop/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/return-float-from-while-loop/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..cd6a109
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/return-float-from-while-loop/0-opt.spvasm.expected.msl
@@ -0,0 +1,57 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  bool x_30 = false;
+  float x_47 = 0.0f;
+  float const x_29 = x_6.injectionSwitch.x;
+  x_30 = (x_29 > 1.0f);
+  if (x_30) {
+    while (true) {
+      float x_47_phi = 0.0f;
+      while (true) {
+        float const x_41 = (*(tint_symbol_5)).x;
+        if ((x_41 < 0.0f)) {
+          if (x_30) {
+            x_47_phi = 1.0f;
+            break;
+          } else {
+            continue;
+          }
+          continue;
+        }
+        x_47_phi = 0.0f;
+        break;
+      }
+      x_47 = x_47_phi;
+      break;
+    }
+    float4 x_48_1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    x_48_1.y = x_47;
+    float4 const x_48 = x_48_1;
+    *(tint_symbol_6) = x_48;
+  }
+  *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/return-float-from-while-loop/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/return-float-from-while-loop/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..cbe84e4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/return-float-from-while-loop/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,147 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 78
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %x_30 "x_30"
+               OpName %x_47 "x_47"
+               OpName %x_47_phi "x_47_phi"
+               OpName %x_48_1 "x_48_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %22 = OpConstantNull %bool
+%_ptr_Function_float = OpTypePointer Function %float
+         %25 = OpConstantNull %float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+         %57 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
+         %64 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %65 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+       %x_30 = OpVariable %_ptr_Function_bool Function %22
+       %x_47 = OpVariable %_ptr_Function_float Function %25
+   %x_47_phi = OpVariable %_ptr_Function_float Function %25
+     %x_48_1 = OpVariable %_ptr_Function_v4float Function %5
+         %29 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+         %30 = OpLoad %float %29
+         %32 = OpFOrdGreaterThan %bool %30 %float_1
+               OpStore %x_30 %32
+         %33 = OpLoad %bool %x_30
+               OpSelectionMerge %34 None
+               OpBranchConditional %33 %35 %34
+         %35 = OpLabel
+               OpBranch %36
+         %36 = OpLabel
+               OpLoopMerge %37 %38 None
+               OpBranch %39
+         %39 = OpLabel
+               OpBranch %41
+         %41 = OpLabel
+               OpLoopMerge %42 %43 None
+               OpBranch %44
+         %44 = OpLabel
+         %46 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %47 = OpLoad %float %46
+         %49 = OpFOrdLessThan %bool %47 %float_0
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %50
+         %51 = OpLabel
+         %52 = OpLoad %bool %x_30
+               OpSelectionMerge %53 None
+               OpBranchConditional %52 %54 %55
+         %54 = OpLabel
+               OpStore %x_47_phi %float_1
+               OpBranch %42
+         %55 = OpLabel
+               OpBranch %43
+         %53 = OpLabel
+               OpBranch %43
+         %50 = OpLabel
+               OpStore %x_47_phi %float_0
+               OpBranch %42
+         %43 = OpLabel
+               OpBranch %41
+         %42 = OpLabel
+         %56 = OpLoad %float %x_47_phi
+               OpStore %x_47 %56
+               OpBranch %37
+         %38 = OpLabel
+               OpBranch %36
+         %37 = OpLabel
+               OpStore %x_48_1 %57
+         %61 = OpAccessChain %_ptr_Function_float %x_48_1 %uint_1
+         %62 = OpLoad %float %x_47
+               OpStore %61 %62
+         %63 = OpLoad %v4float %x_48_1
+               OpStore %x_GLF_color %63
+               OpBranch %34
+         %34 = OpLabel
+               OpStore %x_GLF_color %64
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %65
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %69 = OpLabel
+         %70 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %70
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %72 = OpLabel
+         %73 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %73
+         %74 = OpFunctionCall %void %main_1
+         %76 = OpLoad %v4float %x_GLF_color
+         %77 = OpCompositeConstruct %main_out %76
+         %75 = OpFunctionCall %void %tint_symbol_3 %77
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/return-float-from-while-loop/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/return-float-from-while-loop/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..fd8fb0e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/return-float-from-while-loop/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,56 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_30 : bool;
+  var x_47 : f32;
+  let x_29 : f32 = x_6.injectionSwitch.x;
+  x_30 = (x_29 > 1.0);
+  if (x_30) {
+    loop {
+      var x_47_phi : f32;
+      loop {
+        let x_41 : f32 = gl_FragCoord.x;
+        if ((x_41 < 0.0)) {
+          if (x_30) {
+            x_47_phi = 1.0;
+            break;
+          } else {
+            continue;
+          }
+          continue;
+        }
+        x_47_phi = 0.0;
+        break;
+      }
+      x_47 = x_47_phi;
+      break;
+    }
+    var x_48_1 : vec4<f32> = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+    x_48_1.y = x_47;
+    let x_48 : vec4<f32> = x_48_1;
+    x_GLF_color = x_48;
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/return-float-from-while-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/return-float-from-while-loop/0-opt.wgsl
new file mode 100644
index 0000000..fd8fb0e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/return-float-from-while-loop/0-opt.wgsl
@@ -0,0 +1,56 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_30 : bool;
+  var x_47 : f32;
+  let x_29 : f32 = x_6.injectionSwitch.x;
+  x_30 = (x_29 > 1.0);
+  if (x_30) {
+    loop {
+      var x_47_phi : f32;
+      loop {
+        let x_41 : f32 = gl_FragCoord.x;
+        if ((x_41 < 0.0)) {
+          if (x_30) {
+            x_47_phi = 1.0;
+            break;
+          } else {
+            continue;
+          }
+          continue;
+        }
+        x_47_phi = 0.0;
+        break;
+      }
+      x_47 = x_47_phi;
+      break;
+    }
+    var x_48_1 : vec4<f32> = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+    x_48_1.y = x_47;
+    let x_48 : vec4<f32> = x_48_1;
+    x_GLF_color = x_48;
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/return-float-from-while-loop/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/return-float-from-while-loop/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..abeefe6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/return-float-from-while-loop/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,57 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  bool x_30 = false;
+  float x_47 = 0.0f;
+  const float x_29 = asfloat(x_6[0].x);
+  x_30 = (x_29 > 1.0f);
+  if (x_30) {
+    while (true) {
+      float x_47_phi = 0.0f;
+      while (true) {
+        const float x_41 = gl_FragCoord.x;
+        if ((x_41 < 0.0f)) {
+          if (x_30) {
+            x_47_phi = 1.0f;
+            break;
+          } else {
+            continue;
+          }
+          continue;
+        }
+        x_47_phi = 0.0f;
+        break;
+      }
+      x_47 = x_47_phi;
+      break;
+    }
+    float4 x_48_1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    x_48_1.y = x_47;
+    x_GLF_color = x_48_1;
+  }
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/return-float-from-while-loop/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/return-float-from-while-loop/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..cd6a109
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/return-float-from-while-loop/0-opt.wgsl.expected.msl
@@ -0,0 +1,57 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  bool x_30 = false;
+  float x_47 = 0.0f;
+  float const x_29 = x_6.injectionSwitch.x;
+  x_30 = (x_29 > 1.0f);
+  if (x_30) {
+    while (true) {
+      float x_47_phi = 0.0f;
+      while (true) {
+        float const x_41 = (*(tint_symbol_5)).x;
+        if ((x_41 < 0.0f)) {
+          if (x_30) {
+            x_47_phi = 1.0f;
+            break;
+          } else {
+            continue;
+          }
+          continue;
+        }
+        x_47_phi = 0.0f;
+        break;
+      }
+      x_47 = x_47_phi;
+      break;
+    }
+    float4 x_48_1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    x_48_1.y = x_47;
+    float4 const x_48 = x_48_1;
+    *(tint_symbol_6) = x_48;
+  }
+  *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/return-float-from-while-loop/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/return-float-from-while-loop/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..cbe84e4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/return-float-from-while-loop/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,147 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 78
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %x_30 "x_30"
+               OpName %x_47 "x_47"
+               OpName %x_47_phi "x_47_phi"
+               OpName %x_48_1 "x_48_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %22 = OpConstantNull %bool
+%_ptr_Function_float = OpTypePointer Function %float
+         %25 = OpConstantNull %float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+         %57 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+     %uint_1 = OpConstant %uint 1
+         %64 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %65 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+       %x_30 = OpVariable %_ptr_Function_bool Function %22
+       %x_47 = OpVariable %_ptr_Function_float Function %25
+   %x_47_phi = OpVariable %_ptr_Function_float Function %25
+     %x_48_1 = OpVariable %_ptr_Function_v4float Function %5
+         %29 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+         %30 = OpLoad %float %29
+         %32 = OpFOrdGreaterThan %bool %30 %float_1
+               OpStore %x_30 %32
+         %33 = OpLoad %bool %x_30
+               OpSelectionMerge %34 None
+               OpBranchConditional %33 %35 %34
+         %35 = OpLabel
+               OpBranch %36
+         %36 = OpLabel
+               OpLoopMerge %37 %38 None
+               OpBranch %39
+         %39 = OpLabel
+               OpBranch %41
+         %41 = OpLabel
+               OpLoopMerge %42 %43 None
+               OpBranch %44
+         %44 = OpLabel
+         %46 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %47 = OpLoad %float %46
+         %49 = OpFOrdLessThan %bool %47 %float_0
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %50
+         %51 = OpLabel
+         %52 = OpLoad %bool %x_30
+               OpSelectionMerge %53 None
+               OpBranchConditional %52 %54 %55
+         %54 = OpLabel
+               OpStore %x_47_phi %float_1
+               OpBranch %42
+         %55 = OpLabel
+               OpBranch %43
+         %53 = OpLabel
+               OpBranch %43
+         %50 = OpLabel
+               OpStore %x_47_phi %float_0
+               OpBranch %42
+         %43 = OpLabel
+               OpBranch %41
+         %42 = OpLabel
+         %56 = OpLoad %float %x_47_phi
+               OpStore %x_47 %56
+               OpBranch %37
+         %38 = OpLabel
+               OpBranch %36
+         %37 = OpLabel
+               OpStore %x_48_1 %57
+         %61 = OpAccessChain %_ptr_Function_float %x_48_1 %uint_1
+         %62 = OpLoad %float %x_47
+               OpStore %61 %62
+         %63 = OpLoad %v4float %x_48_1
+               OpStore %x_GLF_color %63
+               OpBranch %34
+         %34 = OpLabel
+               OpStore %x_GLF_color %64
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %65
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %69 = OpLabel
+         %70 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %70
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %72 = OpLabel
+         %73 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %73
+         %74 = OpFunctionCall %void %main_1
+         %76 = OpLoad %v4float %x_GLF_color
+         %77 = OpCompositeConstruct %main_out %76
+         %75 = OpFunctionCall %void %tint_symbol_3 %77
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/return-float-from-while-loop/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/return-float-from-while-loop/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..fd8fb0e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/return-float-from-while-loop/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,56 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_30 : bool;
+  var x_47 : f32;
+  let x_29 : f32 = x_6.injectionSwitch.x;
+  x_30 = (x_29 > 1.0);
+  if (x_30) {
+    loop {
+      var x_47_phi : f32;
+      loop {
+        let x_41 : f32 = gl_FragCoord.x;
+        if ((x_41 < 0.0)) {
+          if (x_30) {
+            x_47_phi = 1.0;
+            break;
+          } else {
+            continue;
+          }
+          continue;
+        }
+        x_47_phi = 0.0;
+        break;
+      }
+      x_47 = x_47_phi;
+      break;
+    }
+    var x_48_1 : vec4<f32> = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+    x_48_1.y = x_47;
+    let x_48 : vec4<f32> = x_48_1;
+    x_GLF_color = x_48;
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/return-in-loop-in-function/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/return-in-loop-in-function/0-opt.spvasm
new file mode 100644
index 0000000..6f810d5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/return-in-loop-in-function/0-opt.spvasm
@@ -0,0 +1,95 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %f_ "f("
+               OpName %i "i"
+               OpName %c "c"
+               OpName %i_0 "i"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %i RelaxedPrecision
+               OpDecorate %8 RelaxedPrecision
+               OpDecorate %9 RelaxedPrecision
+               OpDecorate %10 RelaxedPrecision
+               OpDecorate %11 RelaxedPrecision
+               OpDecorate %i_0 RelaxedPrecision
+               OpDecorate %12 RelaxedPrecision
+               OpDecorate %13 RelaxedPrecision
+               OpDecorate %14 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %16 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+         %18 = OpTypeFunction %float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+     %int_10 = OpConstant %int 10
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+    %float_0 = OpConstant %float 0
+         %28 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %16
+         %34 = OpLabel
+          %c = OpVariable %_ptr_Function_v4float Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+               OpStore %c %28
+               OpStore %i_0 %int_0
+               OpBranch %35
+         %35 = OpLabel
+         %12 = OpLoad %int %i_0
+         %36 = OpSLessThan %bool %12 %int_1
+               OpLoopMerge %37 %38 None
+               OpBranchConditional %36 %38 %37
+         %38 = OpLabel
+         %39 = OpFunctionCall %float %f_
+         %40 = OpAccessChain %_ptr_Function_float %c %uint_0
+               OpStore %40 %39
+         %13 = OpLoad %int %i_0
+         %14 = OpIAdd %int %13 %int_1
+               OpStore %i_0 %14
+               OpBranch %35
+         %37 = OpLabel
+         %41 = OpLoad %v4float %c
+               OpStore %_GLF_color %41
+               OpReturn
+               OpFunctionEnd
+         %f_ = OpFunction %float None %18
+         %42 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+               OpStore %i %int_1
+               OpBranch %43
+         %43 = OpLabel
+          %8 = OpLoad %int %i
+         %44 = OpSLessThan %bool %8 %int_10
+               OpLoopMerge %45 %46 None
+               OpBranchConditional %44 %47 %45
+         %47 = OpLabel
+          %9 = OpLoad %int %i
+         %48 = OpConvertSToF %float %9
+         %49 = OpFOrdGreaterThanEqual %bool %48 %float_1
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %46
+         %51 = OpLabel
+               OpReturnValue %float_1
+         %50 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+         %10 = OpLoad %int %i
+         %11 = OpIAdd %int %10 %int_1
+               OpStore %i %11
+               OpBranch %43
+         %45 = OpLabel
+               OpReturnValue %float_1
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/return-in-loop-in-function/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/return-in-loop-in-function/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..6ebe635
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/return-in-loop-in-function/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,50 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float f_() {
+  int i = 0;
+  i = 1;
+  {
+    for(; (i < 10); i = (i + 1)) {
+      if ((float(i) >= 1.0f)) {
+        return 1.0f;
+      } else {
+        continue;
+      }
+    }
+  }
+  return 1.0f;
+}
+
+void main_1() {
+  float4 c = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int i_1 = 0;
+  c = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  i_1 = 0;
+  while (true) {
+    if ((i_1 < 1)) {
+    } else {
+      break;
+    }
+    {
+      const float x_39 = f_();
+      c.x = x_39;
+      i_1 = (i_1 + 1);
+    }
+  }
+  x_GLF_color = c;
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/return-in-loop-in-function/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/return-in-loop-in-function/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..110e1af
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/return-in-loop-in-function/0-opt.spvasm.expected.msl
@@ -0,0 +1,68 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float f_() {
+  int i = 0;
+  i = 1;
+  while (true) {
+    int const x_8 = i;
+    if ((x_8 < 10)) {
+    } else {
+      break;
+    }
+    int const x_9 = i;
+    if ((float(x_9) >= 1.0f)) {
+      return 1.0f;
+    } else {
+      {
+        int const x_10 = i;
+        i = (x_10 + 1);
+      }
+      continue;
+    }
+    {
+      int const x_10 = i;
+      i = (x_10 + 1);
+    }
+  }
+  return 1.0f;
+}
+
+void main_1(thread float4* const tint_symbol_4) {
+  float4 c = 0.0f;
+  int i_1 = 0;
+  c = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  i_1 = 0;
+  while (true) {
+    int const x_12 = i_1;
+    if ((x_12 < 1)) {
+    } else {
+      break;
+    }
+    {
+      float const x_39 = f_();
+      c.x = x_39;
+      int const x_13 = i_1;
+      i_1 = (x_13 + 1);
+    }
+  }
+  float4 const x_41 = c;
+  *(tint_symbol_4) = x_41;
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/return-in-loop-in-function/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/return-in-loop-in-function/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..b4f0236
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/return-in-loop-in-function/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,135 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 75
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %f_ "f_"
+               OpName %i "i"
+               OpName %main_1 "main_1"
+               OpName %c "c"
+               OpName %i_1 "i_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+          %8 = OpTypeFunction %float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %14 = OpConstantNull %int
+      %int_1 = OpConstant %int 1
+     %int_10 = OpConstant %int 10
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+       %void = OpTypeVoid
+         %36 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+    %float_0 = OpConstant %float 0
+         %44 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+   %main_out = OpTypeStruct %v4float
+         %63 = OpTypeFunction %void %main_out
+         %f_ = OpFunction %float None %8
+         %10 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %14
+               OpStore %i %int_1
+               OpBranch %16
+         %16 = OpLabel
+               OpLoopMerge %17 %18 None
+               OpBranch %19
+         %19 = OpLabel
+         %20 = OpLoad %int %i
+         %22 = OpSLessThan %bool %20 %int_10
+               OpSelectionMerge %24 None
+               OpBranchConditional %22 %25 %26
+         %25 = OpLabel
+               OpBranch %24
+         %26 = OpLabel
+               OpBranch %17
+         %24 = OpLabel
+         %27 = OpLoad %int %i
+         %28 = OpConvertSToF %float %27
+         %30 = OpFOrdGreaterThanEqual %bool %28 %float_1
+               OpSelectionMerge %31 None
+               OpBranchConditional %30 %32 %33
+         %32 = OpLabel
+               OpReturnValue %float_1
+         %33 = OpLabel
+               OpBranch %18
+         %31 = OpLabel
+               OpBranch %18
+         %18 = OpLabel
+         %34 = OpLoad %int %i
+         %35 = OpIAdd %int %34 %int_1
+               OpStore %i %35
+               OpBranch %16
+         %17 = OpLabel
+               OpReturnValue %float_1
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %36
+         %39 = OpLabel
+          %c = OpVariable %_ptr_Function_v4float Function %5
+        %i_1 = OpVariable %_ptr_Function_int Function %14
+               OpStore %c %44
+               OpStore %i_1 %int_0
+               OpBranch %46
+         %46 = OpLabel
+               OpLoopMerge %47 %48 None
+               OpBranch %49
+         %49 = OpLabel
+         %50 = OpLoad %int %i_1
+         %51 = OpSLessThan %bool %50 %int_1
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %54
+         %53 = OpLabel
+               OpBranch %52
+         %54 = OpLabel
+               OpBranch %47
+         %52 = OpLabel
+               OpBranch %48
+         %48 = OpLabel
+         %55 = OpFunctionCall %float %f_
+         %59 = OpAccessChain %_ptr_Function_float %c %uint_0
+               OpStore %59 %55
+         %60 = OpLoad %int %i_1
+         %61 = OpIAdd %int %60 %int_1
+               OpStore %i_1 %61
+               OpBranch %46
+         %47 = OpLabel
+         %62 = OpLoad %v4float %c
+               OpStore %x_GLF_color %62
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %63
+%tint_symbol = OpFunctionParameter %main_out
+         %67 = OpLabel
+         %68 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %68
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %36
+         %70 = OpLabel
+         %71 = OpFunctionCall %void %main_1
+         %73 = OpLoad %v4float %x_GLF_color
+         %74 = OpCompositeConstruct %main_out %73
+         %72 = OpFunctionCall %void %tint_symbol_2 %74
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/return-in-loop-in-function/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/return-in-loop-in-function/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..8e2cc4c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/return-in-loop-in-function/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,60 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn f_() -> f32 {
+  var i : i32;
+  i = 1;
+  loop {
+    let x_8 : i32 = i;
+    if ((x_8 < 10)) {
+    } else {
+      break;
+    }
+    let x_9 : i32 = i;
+    if ((f32(x_9) >= 1.0)) {
+      return 1.0;
+    } else {
+      continue;
+    }
+
+    continuing {
+      let x_10 : i32 = i;
+      i = (x_10 + 1);
+    }
+  }
+  return 1.0;
+}
+
+fn main_1() {
+  var c : vec4<f32>;
+  var i_1 : i32;
+  c = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  i_1 = 0;
+  loop {
+    let x_12 : i32 = i_1;
+    if ((x_12 < 1)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_39 : f32 = f_();
+      c.x = x_39;
+      let x_13 : i32 = i_1;
+      i_1 = (x_13 + 1);
+    }
+  }
+  let x_41 : vec4<f32> = c;
+  x_GLF_color = x_41;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/return-in-loop-in-function/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/return-in-loop-in-function/0-opt.wgsl
new file mode 100644
index 0000000..8e2cc4c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/return-in-loop-in-function/0-opt.wgsl
@@ -0,0 +1,60 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn f_() -> f32 {
+  var i : i32;
+  i = 1;
+  loop {
+    let x_8 : i32 = i;
+    if ((x_8 < 10)) {
+    } else {
+      break;
+    }
+    let x_9 : i32 = i;
+    if ((f32(x_9) >= 1.0)) {
+      return 1.0;
+    } else {
+      continue;
+    }
+
+    continuing {
+      let x_10 : i32 = i;
+      i = (x_10 + 1);
+    }
+  }
+  return 1.0;
+}
+
+fn main_1() {
+  var c : vec4<f32>;
+  var i_1 : i32;
+  c = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  i_1 = 0;
+  loop {
+    let x_12 : i32 = i_1;
+    if ((x_12 < 1)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_39 : f32 = f_();
+      c.x = x_39;
+      let x_13 : i32 = i_1;
+      i_1 = (x_13 + 1);
+    }
+  }
+  let x_41 : vec4<f32> = c;
+  x_GLF_color = x_41;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/return-in-loop-in-function/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/return-in-loop-in-function/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..6ebe635
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/return-in-loop-in-function/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,50 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float f_() {
+  int i = 0;
+  i = 1;
+  {
+    for(; (i < 10); i = (i + 1)) {
+      if ((float(i) >= 1.0f)) {
+        return 1.0f;
+      } else {
+        continue;
+      }
+    }
+  }
+  return 1.0f;
+}
+
+void main_1() {
+  float4 c = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int i_1 = 0;
+  c = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  i_1 = 0;
+  while (true) {
+    if ((i_1 < 1)) {
+    } else {
+      break;
+    }
+    {
+      const float x_39 = f_();
+      c.x = x_39;
+      i_1 = (i_1 + 1);
+    }
+  }
+  x_GLF_color = c;
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/return-in-loop-in-function/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/return-in-loop-in-function/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..110e1af
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/return-in-loop-in-function/0-opt.wgsl.expected.msl
@@ -0,0 +1,68 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float f_() {
+  int i = 0;
+  i = 1;
+  while (true) {
+    int const x_8 = i;
+    if ((x_8 < 10)) {
+    } else {
+      break;
+    }
+    int const x_9 = i;
+    if ((float(x_9) >= 1.0f)) {
+      return 1.0f;
+    } else {
+      {
+        int const x_10 = i;
+        i = (x_10 + 1);
+      }
+      continue;
+    }
+    {
+      int const x_10 = i;
+      i = (x_10 + 1);
+    }
+  }
+  return 1.0f;
+}
+
+void main_1(thread float4* const tint_symbol_4) {
+  float4 c = 0.0f;
+  int i_1 = 0;
+  c = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  i_1 = 0;
+  while (true) {
+    int const x_12 = i_1;
+    if ((x_12 < 1)) {
+    } else {
+      break;
+    }
+    {
+      float const x_39 = f_();
+      c.x = x_39;
+      int const x_13 = i_1;
+      i_1 = (x_13 + 1);
+    }
+  }
+  float4 const x_41 = c;
+  *(tint_symbol_4) = x_41;
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/return-in-loop-in-function/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/return-in-loop-in-function/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..b4f0236
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/return-in-loop-in-function/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,135 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 75
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %f_ "f_"
+               OpName %i "i"
+               OpName %main_1 "main_1"
+               OpName %c "c"
+               OpName %i_1 "i_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+          %8 = OpTypeFunction %float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %14 = OpConstantNull %int
+      %int_1 = OpConstant %int 1
+     %int_10 = OpConstant %int 10
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+       %void = OpTypeVoid
+         %36 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+    %float_0 = OpConstant %float 0
+         %44 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+   %main_out = OpTypeStruct %v4float
+         %63 = OpTypeFunction %void %main_out
+         %f_ = OpFunction %float None %8
+         %10 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %14
+               OpStore %i %int_1
+               OpBranch %16
+         %16 = OpLabel
+               OpLoopMerge %17 %18 None
+               OpBranch %19
+         %19 = OpLabel
+         %20 = OpLoad %int %i
+         %22 = OpSLessThan %bool %20 %int_10
+               OpSelectionMerge %24 None
+               OpBranchConditional %22 %25 %26
+         %25 = OpLabel
+               OpBranch %24
+         %26 = OpLabel
+               OpBranch %17
+         %24 = OpLabel
+         %27 = OpLoad %int %i
+         %28 = OpConvertSToF %float %27
+         %30 = OpFOrdGreaterThanEqual %bool %28 %float_1
+               OpSelectionMerge %31 None
+               OpBranchConditional %30 %32 %33
+         %32 = OpLabel
+               OpReturnValue %float_1
+         %33 = OpLabel
+               OpBranch %18
+         %31 = OpLabel
+               OpBranch %18
+         %18 = OpLabel
+         %34 = OpLoad %int %i
+         %35 = OpIAdd %int %34 %int_1
+               OpStore %i %35
+               OpBranch %16
+         %17 = OpLabel
+               OpReturnValue %float_1
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %36
+         %39 = OpLabel
+          %c = OpVariable %_ptr_Function_v4float Function %5
+        %i_1 = OpVariable %_ptr_Function_int Function %14
+               OpStore %c %44
+               OpStore %i_1 %int_0
+               OpBranch %46
+         %46 = OpLabel
+               OpLoopMerge %47 %48 None
+               OpBranch %49
+         %49 = OpLabel
+         %50 = OpLoad %int %i_1
+         %51 = OpSLessThan %bool %50 %int_1
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %54
+         %53 = OpLabel
+               OpBranch %52
+         %54 = OpLabel
+               OpBranch %47
+         %52 = OpLabel
+               OpBranch %48
+         %48 = OpLabel
+         %55 = OpFunctionCall %float %f_
+         %59 = OpAccessChain %_ptr_Function_float %c %uint_0
+               OpStore %59 %55
+         %60 = OpLoad %int %i_1
+         %61 = OpIAdd %int %60 %int_1
+               OpStore %i_1 %61
+               OpBranch %46
+         %47 = OpLabel
+         %62 = OpLoad %v4float %c
+               OpStore %x_GLF_color %62
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %63
+%tint_symbol = OpFunctionParameter %main_out
+         %67 = OpLabel
+         %68 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %68
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %36
+         %70 = OpLabel
+         %71 = OpFunctionCall %void %main_1
+         %73 = OpLoad %v4float %x_GLF_color
+         %74 = OpCompositeConstruct %main_out %73
+         %72 = OpFunctionCall %void %tint_symbol_2 %74
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/return-in-loop-in-function/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/return-in-loop-in-function/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..8e2cc4c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/return-in-loop-in-function/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,60 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn f_() -> f32 {
+  var i : i32;
+  i = 1;
+  loop {
+    let x_8 : i32 = i;
+    if ((x_8 < 10)) {
+    } else {
+      break;
+    }
+    let x_9 : i32 = i;
+    if ((f32(x_9) >= 1.0)) {
+      return 1.0;
+    } else {
+      continue;
+    }
+
+    continuing {
+      let x_10 : i32 = i;
+      i = (x_10 + 1);
+    }
+  }
+  return 1.0;
+}
+
+fn main_1() {
+  var c : vec4<f32>;
+  var i_1 : i32;
+  c = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  i_1 = 0;
+  loop {
+    let x_12 : i32 = i_1;
+    if ((x_12 < 1)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_39 : f32 = f_();
+      c.x = x_39;
+      let x_13 : i32 = i_1;
+      i_1 = (x_13 + 1);
+    }
+  }
+  let x_41 : vec4<f32> = c;
+  x_GLF_color = x_41;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/return-inside-loop-in-function/0.spvasm b/test/vk-gl-cts/graphicsfuzz/return-inside-loop-in-function/0.spvasm
new file mode 100644
index 0000000..adc2dd2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/return-inside-loop-in-function/0.spvasm
@@ -0,0 +1,130 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %GLF_live4drawShape_ "GLF_live4drawShape("
+               OpName %i "i"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %i RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %6 RelaxedPrecision
+               OpDecorate %7 RelaxedPrecision
+               OpDecorate %8 RelaxedPrecision
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+         %13 = OpTypeFunction %v3float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+         %19 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+      %int_1 = OpConstant %int 1
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %24 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+      %false = OpConstantFalse %bool
+%_ptr_Function_bool = OpTypePointer Function %bool
+       %true = OpConstantTrue %bool
+         %29 = OpUndef %v3float
+         %30 = OpUndef %int
+         %31 = OpUndef %bool
+         %32 = OpUndef %v3float
+         %33 = OpUndef %int
+         %34 = OpUndef %bool
+       %main = OpFunction %void None %10
+         %35 = OpLabel
+         %36 = OpVariable %_ptr_Function_bool Function %false
+         %37 = OpVariable %_ptr_Function_v3float Function
+          %6 = OpVariable %_ptr_Function_int Function
+         %38 = OpVariable %_ptr_Function_v3float Function
+               OpStore %_GLF_color %24
+               OpStore %36 %false
+               OpBranch %39
+         %39 = OpLabel
+         %40 = OpPhi %bool %false %35 %31 %41
+               OpLoopMerge %42 %41 None
+               OpBranch %43
+         %43 = OpLabel
+               OpStore %6 %int_0
+               OpBranch %44
+         %44 = OpLabel
+         %45 = OpPhi %bool %40 %43 %31 %46
+          %7 = OpPhi %int %int_0 %43 %30 %46
+               OpLoopMerge %47 %46 None
+               OpBranch %48
+         %48 = OpLabel
+         %49 = OpSLessThan %bool %7 %int_0
+               OpBranchConditional %49 %50 %47
+         %50 = OpLabel
+               OpStore %36 %true
+               OpStore %37 %19
+               OpBranch %47
+         %46 = OpLabel
+               OpBranch %44
+         %47 = OpLabel
+         %51 = OpPhi %v3float %29 %48 %19 %50
+         %52 = OpPhi %bool %45 %48 %true %50
+               OpSelectionMerge %53 None
+               OpBranchConditional %52 %42 %53
+         %53 = OpLabel
+         %54 = OpUndef %v3float
+               OpStore %36 %true
+               OpBranch %42
+         %41 = OpLabel
+               OpBranch %39
+         %42 = OpLabel
+         %55 = OpPhi %v3float %51 %47 %54 %53
+               OpStore %38 %55
+               OpReturn
+               OpFunctionEnd
+%GLF_live4drawShape_ = OpFunction %v3float None %13
+         %56 = OpLabel
+         %57 = OpVariable %_ptr_Function_bool Function %false
+         %58 = OpVariable %_ptr_Function_v3float Function
+          %i = OpVariable %_ptr_Function_int Function
+               OpBranch %59
+         %59 = OpLabel
+         %60 = OpPhi %bool %false %56 %34 %61
+               OpLoopMerge %62 %61 None
+               OpBranch %63
+         %63 = OpLabel
+               OpStore %i %int_0
+               OpBranch %64
+         %64 = OpLabel
+         %65 = OpPhi %bool %60 %63 %34 %66
+          %8 = OpPhi %int %int_0 %63 %33 %66
+               OpLoopMerge %67 %66 None
+               OpBranch %68
+         %68 = OpLabel
+         %69 = OpSLessThan %bool %8 %int_0
+               OpBranchConditional %69 %70 %67
+         %70 = OpLabel
+               OpStore %57 %true
+               OpStore %58 %19
+               OpBranch %67
+         %66 = OpLabel
+               OpBranch %64
+         %67 = OpLabel
+         %71 = OpPhi %v3float %32 %68 %19 %70
+         %72 = OpPhi %bool %65 %68 %true %70
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %62 %73
+         %73 = OpLabel
+         %74 = OpUndef %v3float
+               OpStore %57 %true
+               OpBranch %62
+         %61 = OpLabel
+               OpBranch %59
+         %62 = OpLabel
+         %75 = OpPhi %v3float %71 %67 %74 %73
+               OpReturnValue %75
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/return-inside-loop-in-function/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/return-inside-loop-in-function/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..3c94412
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/return-inside-loop-in-function/0.spvasm.expected.hlsl
@@ -0,0 +1,129 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  bool x_36 = false;
+  float3 x_37 = float3(0.0f, 0.0f, 0.0f);
+  int x_6 = 0;
+  float3 x_38 = float3(0.0f, 0.0f, 0.0f);
+  float3 x_51 = float3(0.0f, 0.0f, 0.0f);
+  float3 x_54 = float3(0.0f, 0.0f, 0.0f);
+  bool x_40_phi = false;
+  float3 x_55_phi = float3(0.0f, 0.0f, 0.0f);
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  x_36 = false;
+  x_40_phi = false;
+  while (true) {
+    bool x_45 = false;
+    bool x_45_phi = false;
+    int x_7_phi = 0;
+    float3 x_51_phi = float3(0.0f, 0.0f, 0.0f);
+    bool x_52_phi = false;
+    const bool x_40 = x_40_phi;
+    x_6 = 0;
+    x_45_phi = x_40;
+    x_7_phi = 0;
+    while (true) {
+      x_45 = x_45_phi;
+      const int x_7 = x_7_phi;
+      x_51_phi = float3(0.0f, 0.0f, 0.0f);
+      x_52_phi = x_45;
+      if ((x_7 < 0)) {
+      } else {
+        break;
+      }
+      x_36 = true;
+      x_37 = float3(1.0f, 1.0f, 1.0f);
+      x_51_phi = float3(1.0f, 1.0f, 1.0f);
+      x_52_phi = true;
+      break;
+      {
+        x_45_phi = false;
+        x_7_phi = 0;
+      }
+    }
+    x_51 = x_51_phi;
+    const bool x_52 = x_52_phi;
+    x_55_phi = x_51;
+    if (x_52) {
+      break;
+    }
+    x_54 = float3(0.0f, 0.0f, 0.0f);
+    x_36 = true;
+    x_55_phi = x_54;
+    break;
+    {
+      x_40_phi = false;
+    }
+  }
+  x_38 = x_55_phi;
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
+
+float3 GLF_live4drawShape_() {
+  bool x_57 = false;
+  float3 x_58 = float3(0.0f, 0.0f, 0.0f);
+  int i = 0;
+  float3 x_71 = float3(0.0f, 0.0f, 0.0f);
+  float3 x_74 = float3(0.0f, 0.0f, 0.0f);
+  bool x_60_phi = false;
+  float3 x_75_phi = float3(0.0f, 0.0f, 0.0f);
+  x_60_phi = false;
+  while (true) {
+    bool x_65 = false;
+    bool x_65_phi = false;
+    int x_8_phi = 0;
+    float3 x_71_phi = float3(0.0f, 0.0f, 0.0f);
+    bool x_72_phi = false;
+    const bool x_60 = x_60_phi;
+    i = 0;
+    x_65_phi = x_60;
+    x_8_phi = 0;
+    while (true) {
+      x_65 = x_65_phi;
+      const int x_8 = x_8_phi;
+      x_71_phi = float3(0.0f, 0.0f, 0.0f);
+      x_72_phi = x_65;
+      if ((x_8 < 0)) {
+      } else {
+        break;
+      }
+      x_57 = true;
+      x_58 = float3(1.0f, 1.0f, 1.0f);
+      x_71_phi = float3(1.0f, 1.0f, 1.0f);
+      x_72_phi = true;
+      break;
+      {
+        x_65_phi = false;
+        x_8_phi = 0;
+      }
+    }
+    x_71 = x_71_phi;
+    const bool x_72 = x_72_phi;
+    x_75_phi = x_71;
+    if (x_72) {
+      break;
+    }
+    x_74 = float3(0.0f, 0.0f, 0.0f);
+    x_57 = true;
+    x_75_phi = x_74;
+    break;
+    {
+      x_60_phi = false;
+    }
+  }
+  return x_75_phi;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/return-inside-loop-in-function/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/return-inside-loop-in-function/0.spvasm.expected.msl
new file mode 100644
index 0000000..75d8b9b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/return-inside-loop-in-function/0.spvasm.expected.msl
@@ -0,0 +1,134 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  bool x_36 = false;
+  float3 x_37 = 0.0f;
+  int x_6 = 0;
+  float3 x_38 = 0.0f;
+  float3 x_51 = 0.0f;
+  float3 x_54 = 0.0f;
+  bool x_40_phi = false;
+  float3 x_55_phi = 0.0f;
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  x_36 = false;
+  x_40_phi = false;
+  while (true) {
+    bool x_45 = false;
+    bool x_45_phi = false;
+    int x_7_phi = 0;
+    float3 x_51_phi = 0.0f;
+    bool x_52_phi = false;
+    bool const x_40 = x_40_phi;
+    x_6 = 0;
+    x_45_phi = x_40;
+    x_7_phi = 0;
+    while (true) {
+      x_45 = x_45_phi;
+      int const x_7 = x_7_phi;
+      x_51_phi = float3(0.0f, 0.0f, 0.0f);
+      x_52_phi = x_45;
+      if ((x_7 < 0)) {
+      } else {
+        break;
+      }
+      x_36 = true;
+      x_37 = float3(1.0f, 1.0f, 1.0f);
+      x_51_phi = float3(1.0f, 1.0f, 1.0f);
+      x_52_phi = true;
+      break;
+      {
+        x_45_phi = false;
+        x_7_phi = 0;
+      }
+    }
+    x_51 = x_51_phi;
+    bool const x_52 = x_52_phi;
+    x_55_phi = x_51;
+    if (x_52) {
+      break;
+    }
+    x_54 = float3(0.0f, 0.0f, 0.0f);
+    x_36 = true;
+    x_55_phi = x_54;
+    break;
+    {
+      x_40_phi = false;
+    }
+  }
+  float3 const x_55 = x_55_phi;
+  x_38 = x_55;
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
+float3 GLF_live4drawShape_() {
+  bool x_57 = false;
+  float3 x_58 = 0.0f;
+  int i = 0;
+  float3 x_71 = 0.0f;
+  float3 x_74 = 0.0f;
+  bool x_60_phi = false;
+  float3 x_75_phi = 0.0f;
+  x_60_phi = false;
+  while (true) {
+    bool x_65 = false;
+    bool x_65_phi = false;
+    int x_8_phi = 0;
+    float3 x_71_phi = 0.0f;
+    bool x_72_phi = false;
+    bool const x_60 = x_60_phi;
+    i = 0;
+    x_65_phi = x_60;
+    x_8_phi = 0;
+    while (true) {
+      x_65 = x_65_phi;
+      int const x_8 = x_8_phi;
+      x_71_phi = float3(0.0f, 0.0f, 0.0f);
+      x_72_phi = x_65;
+      if ((x_8 < 0)) {
+      } else {
+        break;
+      }
+      x_57 = true;
+      x_58 = float3(1.0f, 1.0f, 1.0f);
+      x_71_phi = float3(1.0f, 1.0f, 1.0f);
+      x_72_phi = true;
+      break;
+      {
+        x_65_phi = false;
+        x_8_phi = 0;
+      }
+    }
+    x_71 = x_71_phi;
+    bool const x_72 = x_72_phi;
+    x_75_phi = x_71;
+    if (x_72) {
+      break;
+    }
+    x_74 = float3(0.0f, 0.0f, 0.0f);
+    x_57 = true;
+    x_75_phi = x_74;
+    break;
+    {
+      x_60_phi = false;
+    }
+  }
+  float3 const x_75 = x_75_phi;
+  return x_75;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/return-inside-loop-in-function/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/return-inside-loop-in-function/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..9396999
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/return-inside-loop-in-function/0.spvasm.expected.spvasm
@@ -0,0 +1,245 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 115
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_36 "x_36"
+               OpName %x_37 "x_37"
+               OpName %x_6 "x_6"
+               OpName %x_38 "x_38"
+               OpName %x_51 "x_51"
+               OpName %x_54 "x_54"
+               OpName %x_40_phi "x_40_phi"
+               OpName %x_55_phi "x_55_phi"
+               OpName %x_45 "x_45"
+               OpName %x_45_phi "x_45_phi"
+               OpName %x_7_phi "x_7_phi"
+               OpName %x_51_phi "x_51_phi"
+               OpName %x_52_phi "x_52_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpName %GLF_live4drawShape_ "GLF_live4drawShape_"
+               OpName %x_57 "x_57"
+               OpName %x_58 "x_58"
+               OpName %i "i"
+               OpName %x_71 "x_71"
+               OpName %x_74 "x_74"
+               OpName %x_60_phi "x_60_phi"
+               OpName %x_75_phi "x_75_phi"
+               OpName %x_65 "x_65"
+               OpName %x_65_phi "x_65_phi"
+               OpName %x_8_phi "x_8_phi"
+               OpName %x_71_phi "x_71_phi"
+               OpName %x_72_phi "x_72_phi"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %16 = OpConstantNull %bool
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %20 = OpConstantNull %v3float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %24 = OpConstantNull %int
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %32 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %int_0 = OpConstant %int 0
+         %50 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+       %true = OpConstantTrue %bool
+         %57 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+         %65 = OpTypeFunction %void %main_out
+         %77 = OpTypeFunction %v3float
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+       %x_36 = OpVariable %_ptr_Function_bool Function %16
+       %x_37 = OpVariable %_ptr_Function_v3float Function %20
+        %x_6 = OpVariable %_ptr_Function_int Function %24
+       %x_38 = OpVariable %_ptr_Function_v3float Function %20
+       %x_51 = OpVariable %_ptr_Function_v3float Function %20
+       %x_54 = OpVariable %_ptr_Function_v3float Function %20
+   %x_40_phi = OpVariable %_ptr_Function_bool Function %16
+   %x_55_phi = OpVariable %_ptr_Function_v3float Function %20
+       %x_45 = OpVariable %_ptr_Function_bool Function %16
+   %x_45_phi = OpVariable %_ptr_Function_bool Function %16
+    %x_7_phi = OpVariable %_ptr_Function_int Function %24
+   %x_51_phi = OpVariable %_ptr_Function_v3float Function %20
+   %x_52_phi = OpVariable %_ptr_Function_bool Function %16
+               OpStore %x_36 %false
+               OpStore %x_GLF_color %32
+               OpStore %x_36 %false
+               OpStore %x_40_phi %false
+               OpBranch %33
+         %33 = OpLabel
+               OpLoopMerge %34 %35 None
+               OpBranch %36
+         %36 = OpLabel
+         %42 = OpLoad %bool %x_40_phi
+               OpStore %x_6 %int_0
+               OpStore %x_45_phi %42
+               OpStore %x_7_phi %int_0
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %48 = OpLoad %bool %x_45_phi
+               OpStore %x_45 %48
+         %49 = OpLoad %int %x_7_phi
+               OpStore %x_51_phi %50
+         %51 = OpLoad %bool %x_45
+               OpStore %x_52_phi %51
+         %52 = OpSLessThan %bool %49 %int_0
+               OpSelectionMerge %53 None
+               OpBranchConditional %52 %54 %55
+         %54 = OpLabel
+               OpBranch %53
+         %55 = OpLabel
+               OpBranch %45
+         %53 = OpLabel
+               OpStore %x_36 %true
+               OpStore %x_37 %57
+               OpStore %x_51_phi %57
+               OpStore %x_52_phi %true
+               OpBranch %45
+         %46 = OpLabel
+               OpStore %x_45_phi %false
+               OpStore %x_7_phi %int_0
+               OpBranch %44
+         %45 = OpLabel
+         %58 = OpLoad %v3float %x_51_phi
+               OpStore %x_51 %58
+         %59 = OpLoad %bool %x_52_phi
+         %60 = OpLoad %v3float %x_51
+               OpStore %x_55_phi %60
+               OpSelectionMerge %61 None
+               OpBranchConditional %59 %62 %61
+         %62 = OpLabel
+               OpBranch %34
+         %61 = OpLabel
+               OpStore %x_54 %50
+               OpStore %x_36 %true
+         %63 = OpLoad %v3float %x_54
+               OpStore %x_55_phi %63
+               OpBranch %34
+         %35 = OpLabel
+               OpStore %x_40_phi %false
+               OpBranch %33
+         %34 = OpLabel
+         %64 = OpLoad %v3float %x_55_phi
+               OpStore %x_38 %64
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %65
+%tint_symbol = OpFunctionParameter %main_out
+         %69 = OpLabel
+         %70 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %70
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %72 = OpLabel
+         %73 = OpFunctionCall %void %main_1
+         %75 = OpLoad %v4float %x_GLF_color
+         %76 = OpCompositeConstruct %main_out %75
+         %74 = OpFunctionCall %void %tint_symbol_2 %76
+               OpReturn
+               OpFunctionEnd
+%GLF_live4drawShape_ = OpFunction %v3float None %77
+         %79 = OpLabel
+       %x_57 = OpVariable %_ptr_Function_bool Function %16
+       %x_58 = OpVariable %_ptr_Function_v3float Function %20
+          %i = OpVariable %_ptr_Function_int Function %24
+       %x_71 = OpVariable %_ptr_Function_v3float Function %20
+       %x_74 = OpVariable %_ptr_Function_v3float Function %20
+   %x_60_phi = OpVariable %_ptr_Function_bool Function %16
+   %x_75_phi = OpVariable %_ptr_Function_v3float Function %20
+       %x_65 = OpVariable %_ptr_Function_bool Function %16
+   %x_65_phi = OpVariable %_ptr_Function_bool Function %16
+    %x_8_phi = OpVariable %_ptr_Function_int Function %24
+   %x_71_phi = OpVariable %_ptr_Function_v3float Function %20
+   %x_72_phi = OpVariable %_ptr_Function_bool Function %16
+               OpStore %x_57 %false
+               OpStore %x_60_phi %false
+               OpBranch %87
+         %87 = OpLabel
+               OpLoopMerge %88 %89 None
+               OpBranch %90
+         %90 = OpLabel
+         %96 = OpLoad %bool %x_60_phi
+               OpStore %i %int_0
+               OpStore %x_65_phi %96
+               OpStore %x_8_phi %int_0
+               OpBranch %97
+         %97 = OpLabel
+               OpLoopMerge %98 %99 None
+               OpBranch %100
+        %100 = OpLabel
+        %101 = OpLoad %bool %x_65_phi
+               OpStore %x_65 %101
+        %102 = OpLoad %int %x_8_phi
+               OpStore %x_71_phi %50
+        %103 = OpLoad %bool %x_65
+               OpStore %x_72_phi %103
+        %104 = OpSLessThan %bool %102 %int_0
+               OpSelectionMerge %105 None
+               OpBranchConditional %104 %106 %107
+        %106 = OpLabel
+               OpBranch %105
+        %107 = OpLabel
+               OpBranch %98
+        %105 = OpLabel
+               OpStore %x_57 %true
+               OpStore %x_58 %57
+               OpStore %x_71_phi %57
+               OpStore %x_72_phi %true
+               OpBranch %98
+         %99 = OpLabel
+               OpStore %x_65_phi %false
+               OpStore %x_8_phi %int_0
+               OpBranch %97
+         %98 = OpLabel
+        %108 = OpLoad %v3float %x_71_phi
+               OpStore %x_71 %108
+        %109 = OpLoad %bool %x_72_phi
+        %110 = OpLoad %v3float %x_71
+               OpStore %x_75_phi %110
+               OpSelectionMerge %111 None
+               OpBranchConditional %109 %112 %111
+        %112 = OpLabel
+               OpBranch %88
+        %111 = OpLabel
+               OpStore %x_74 %50
+               OpStore %x_57 %true
+        %113 = OpLoad %v3float %x_74
+               OpStore %x_75_phi %113
+               OpBranch %88
+         %89 = OpLabel
+               OpStore %x_60_phi %false
+               OpBranch %87
+         %88 = OpLabel
+        %114 = OpLoad %v3float %x_75_phi
+               OpReturnValue %114
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/return-inside-loop-in-function/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/return-inside-loop-in-function/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..def4326
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/return-inside-loop-in-function/0.spvasm.expected.wgsl
@@ -0,0 +1,132 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_36 : bool = false;
+  var x_37 : vec3<f32>;
+  var x_6 : i32;
+  var x_38 : vec3<f32>;
+  var x_51 : vec3<f32>;
+  var x_54 : vec3<f32>;
+  var x_40_phi : bool;
+  var x_55_phi : vec3<f32>;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  x_36 = false;
+  x_40_phi = false;
+  loop {
+    var x_45 : bool;
+    var x_45_phi : bool;
+    var x_7_phi : i32;
+    var x_51_phi : vec3<f32>;
+    var x_52_phi : bool;
+    let x_40 : bool = x_40_phi;
+    x_6 = 0;
+    x_45_phi = x_40;
+    x_7_phi = 0;
+    loop {
+      x_45 = x_45_phi;
+      let x_7 : i32 = x_7_phi;
+      x_51_phi = vec3<f32>(0.0, 0.0, 0.0);
+      x_52_phi = x_45;
+      if ((x_7 < 0)) {
+      } else {
+        break;
+      }
+      x_36 = true;
+      x_37 = vec3<f32>(1.0, 1.0, 1.0);
+      x_51_phi = vec3<f32>(1.0, 1.0, 1.0);
+      x_52_phi = true;
+      break;
+
+      continuing {
+        x_45_phi = false;
+        x_7_phi = 0;
+      }
+    }
+    x_51 = x_51_phi;
+    let x_52 : bool = x_52_phi;
+    x_55_phi = x_51;
+    if (x_52) {
+      break;
+    }
+    x_54 = vec3<f32>(0.0, 0.0, 0.0);
+    x_36 = true;
+    x_55_phi = x_54;
+    break;
+
+    continuing {
+      x_40_phi = false;
+    }
+  }
+  let x_55 : vec3<f32> = x_55_phi;
+  x_38 = x_55;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+fn GLF_live4drawShape_() -> vec3<f32> {
+  var x_57 : bool = false;
+  var x_58 : vec3<f32>;
+  var i : i32;
+  var x_71 : vec3<f32>;
+  var x_74 : vec3<f32>;
+  var x_60_phi : bool;
+  var x_75_phi : vec3<f32>;
+  x_60_phi = false;
+  loop {
+    var x_65 : bool;
+    var x_65_phi : bool;
+    var x_8_phi : i32;
+    var x_71_phi : vec3<f32>;
+    var x_72_phi : bool;
+    let x_60 : bool = x_60_phi;
+    i = 0;
+    x_65_phi = x_60;
+    x_8_phi = 0;
+    loop {
+      x_65 = x_65_phi;
+      let x_8 : i32 = x_8_phi;
+      x_71_phi = vec3<f32>(0.0, 0.0, 0.0);
+      x_72_phi = x_65;
+      if ((x_8 < 0)) {
+      } else {
+        break;
+      }
+      x_57 = true;
+      x_58 = vec3<f32>(1.0, 1.0, 1.0);
+      x_71_phi = vec3<f32>(1.0, 1.0, 1.0);
+      x_72_phi = true;
+      break;
+
+      continuing {
+        x_65_phi = false;
+        x_8_phi = 0;
+      }
+    }
+    x_71 = x_71_phi;
+    let x_72 : bool = x_72_phi;
+    x_75_phi = x_71;
+    if (x_72) {
+      break;
+    }
+    x_74 = vec3<f32>(0.0, 0.0, 0.0);
+    x_57 = true;
+    x_75_phi = x_74;
+    break;
+
+    continuing {
+      x_60_phi = false;
+    }
+  }
+  let x_75 : vec3<f32> = x_75_phi;
+  return x_75;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/return-inside-loop-in-function/0.wgsl b/test/vk-gl-cts/graphicsfuzz/return-inside-loop-in-function/0.wgsl
new file mode 100644
index 0000000..def4326
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/return-inside-loop-in-function/0.wgsl
@@ -0,0 +1,132 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_36 : bool = false;
+  var x_37 : vec3<f32>;
+  var x_6 : i32;
+  var x_38 : vec3<f32>;
+  var x_51 : vec3<f32>;
+  var x_54 : vec3<f32>;
+  var x_40_phi : bool;
+  var x_55_phi : vec3<f32>;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  x_36 = false;
+  x_40_phi = false;
+  loop {
+    var x_45 : bool;
+    var x_45_phi : bool;
+    var x_7_phi : i32;
+    var x_51_phi : vec3<f32>;
+    var x_52_phi : bool;
+    let x_40 : bool = x_40_phi;
+    x_6 = 0;
+    x_45_phi = x_40;
+    x_7_phi = 0;
+    loop {
+      x_45 = x_45_phi;
+      let x_7 : i32 = x_7_phi;
+      x_51_phi = vec3<f32>(0.0, 0.0, 0.0);
+      x_52_phi = x_45;
+      if ((x_7 < 0)) {
+      } else {
+        break;
+      }
+      x_36 = true;
+      x_37 = vec3<f32>(1.0, 1.0, 1.0);
+      x_51_phi = vec3<f32>(1.0, 1.0, 1.0);
+      x_52_phi = true;
+      break;
+
+      continuing {
+        x_45_phi = false;
+        x_7_phi = 0;
+      }
+    }
+    x_51 = x_51_phi;
+    let x_52 : bool = x_52_phi;
+    x_55_phi = x_51;
+    if (x_52) {
+      break;
+    }
+    x_54 = vec3<f32>(0.0, 0.0, 0.0);
+    x_36 = true;
+    x_55_phi = x_54;
+    break;
+
+    continuing {
+      x_40_phi = false;
+    }
+  }
+  let x_55 : vec3<f32> = x_55_phi;
+  x_38 = x_55;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+fn GLF_live4drawShape_() -> vec3<f32> {
+  var x_57 : bool = false;
+  var x_58 : vec3<f32>;
+  var i : i32;
+  var x_71 : vec3<f32>;
+  var x_74 : vec3<f32>;
+  var x_60_phi : bool;
+  var x_75_phi : vec3<f32>;
+  x_60_phi = false;
+  loop {
+    var x_65 : bool;
+    var x_65_phi : bool;
+    var x_8_phi : i32;
+    var x_71_phi : vec3<f32>;
+    var x_72_phi : bool;
+    let x_60 : bool = x_60_phi;
+    i = 0;
+    x_65_phi = x_60;
+    x_8_phi = 0;
+    loop {
+      x_65 = x_65_phi;
+      let x_8 : i32 = x_8_phi;
+      x_71_phi = vec3<f32>(0.0, 0.0, 0.0);
+      x_72_phi = x_65;
+      if ((x_8 < 0)) {
+      } else {
+        break;
+      }
+      x_57 = true;
+      x_58 = vec3<f32>(1.0, 1.0, 1.0);
+      x_71_phi = vec3<f32>(1.0, 1.0, 1.0);
+      x_72_phi = true;
+      break;
+
+      continuing {
+        x_65_phi = false;
+        x_8_phi = 0;
+      }
+    }
+    x_71 = x_71_phi;
+    let x_72 : bool = x_72_phi;
+    x_75_phi = x_71;
+    if (x_72) {
+      break;
+    }
+    x_74 = vec3<f32>(0.0, 0.0, 0.0);
+    x_57 = true;
+    x_75_phi = x_74;
+    break;
+
+    continuing {
+      x_60_phi = false;
+    }
+  }
+  let x_75 : vec3<f32> = x_75_phi;
+  return x_75;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/return-inside-loop-in-function/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/return-inside-loop-in-function/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..3c94412
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/return-inside-loop-in-function/0.wgsl.expected.hlsl
@@ -0,0 +1,129 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  bool x_36 = false;
+  float3 x_37 = float3(0.0f, 0.0f, 0.0f);
+  int x_6 = 0;
+  float3 x_38 = float3(0.0f, 0.0f, 0.0f);
+  float3 x_51 = float3(0.0f, 0.0f, 0.0f);
+  float3 x_54 = float3(0.0f, 0.0f, 0.0f);
+  bool x_40_phi = false;
+  float3 x_55_phi = float3(0.0f, 0.0f, 0.0f);
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  x_36 = false;
+  x_40_phi = false;
+  while (true) {
+    bool x_45 = false;
+    bool x_45_phi = false;
+    int x_7_phi = 0;
+    float3 x_51_phi = float3(0.0f, 0.0f, 0.0f);
+    bool x_52_phi = false;
+    const bool x_40 = x_40_phi;
+    x_6 = 0;
+    x_45_phi = x_40;
+    x_7_phi = 0;
+    while (true) {
+      x_45 = x_45_phi;
+      const int x_7 = x_7_phi;
+      x_51_phi = float3(0.0f, 0.0f, 0.0f);
+      x_52_phi = x_45;
+      if ((x_7 < 0)) {
+      } else {
+        break;
+      }
+      x_36 = true;
+      x_37 = float3(1.0f, 1.0f, 1.0f);
+      x_51_phi = float3(1.0f, 1.0f, 1.0f);
+      x_52_phi = true;
+      break;
+      {
+        x_45_phi = false;
+        x_7_phi = 0;
+      }
+    }
+    x_51 = x_51_phi;
+    const bool x_52 = x_52_phi;
+    x_55_phi = x_51;
+    if (x_52) {
+      break;
+    }
+    x_54 = float3(0.0f, 0.0f, 0.0f);
+    x_36 = true;
+    x_55_phi = x_54;
+    break;
+    {
+      x_40_phi = false;
+    }
+  }
+  x_38 = x_55_phi;
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
+
+float3 GLF_live4drawShape_() {
+  bool x_57 = false;
+  float3 x_58 = float3(0.0f, 0.0f, 0.0f);
+  int i = 0;
+  float3 x_71 = float3(0.0f, 0.0f, 0.0f);
+  float3 x_74 = float3(0.0f, 0.0f, 0.0f);
+  bool x_60_phi = false;
+  float3 x_75_phi = float3(0.0f, 0.0f, 0.0f);
+  x_60_phi = false;
+  while (true) {
+    bool x_65 = false;
+    bool x_65_phi = false;
+    int x_8_phi = 0;
+    float3 x_71_phi = float3(0.0f, 0.0f, 0.0f);
+    bool x_72_phi = false;
+    const bool x_60 = x_60_phi;
+    i = 0;
+    x_65_phi = x_60;
+    x_8_phi = 0;
+    while (true) {
+      x_65 = x_65_phi;
+      const int x_8 = x_8_phi;
+      x_71_phi = float3(0.0f, 0.0f, 0.0f);
+      x_72_phi = x_65;
+      if ((x_8 < 0)) {
+      } else {
+        break;
+      }
+      x_57 = true;
+      x_58 = float3(1.0f, 1.0f, 1.0f);
+      x_71_phi = float3(1.0f, 1.0f, 1.0f);
+      x_72_phi = true;
+      break;
+      {
+        x_65_phi = false;
+        x_8_phi = 0;
+      }
+    }
+    x_71 = x_71_phi;
+    const bool x_72 = x_72_phi;
+    x_75_phi = x_71;
+    if (x_72) {
+      break;
+    }
+    x_74 = float3(0.0f, 0.0f, 0.0f);
+    x_57 = true;
+    x_75_phi = x_74;
+    break;
+    {
+      x_60_phi = false;
+    }
+  }
+  return x_75_phi;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/return-inside-loop-in-function/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/return-inside-loop-in-function/0.wgsl.expected.msl
new file mode 100644
index 0000000..75d8b9b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/return-inside-loop-in-function/0.wgsl.expected.msl
@@ -0,0 +1,134 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  bool x_36 = false;
+  float3 x_37 = 0.0f;
+  int x_6 = 0;
+  float3 x_38 = 0.0f;
+  float3 x_51 = 0.0f;
+  float3 x_54 = 0.0f;
+  bool x_40_phi = false;
+  float3 x_55_phi = 0.0f;
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  x_36 = false;
+  x_40_phi = false;
+  while (true) {
+    bool x_45 = false;
+    bool x_45_phi = false;
+    int x_7_phi = 0;
+    float3 x_51_phi = 0.0f;
+    bool x_52_phi = false;
+    bool const x_40 = x_40_phi;
+    x_6 = 0;
+    x_45_phi = x_40;
+    x_7_phi = 0;
+    while (true) {
+      x_45 = x_45_phi;
+      int const x_7 = x_7_phi;
+      x_51_phi = float3(0.0f, 0.0f, 0.0f);
+      x_52_phi = x_45;
+      if ((x_7 < 0)) {
+      } else {
+        break;
+      }
+      x_36 = true;
+      x_37 = float3(1.0f, 1.0f, 1.0f);
+      x_51_phi = float3(1.0f, 1.0f, 1.0f);
+      x_52_phi = true;
+      break;
+      {
+        x_45_phi = false;
+        x_7_phi = 0;
+      }
+    }
+    x_51 = x_51_phi;
+    bool const x_52 = x_52_phi;
+    x_55_phi = x_51;
+    if (x_52) {
+      break;
+    }
+    x_54 = float3(0.0f, 0.0f, 0.0f);
+    x_36 = true;
+    x_55_phi = x_54;
+    break;
+    {
+      x_40_phi = false;
+    }
+  }
+  float3 const x_55 = x_55_phi;
+  x_38 = x_55;
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
+float3 GLF_live4drawShape_() {
+  bool x_57 = false;
+  float3 x_58 = 0.0f;
+  int i = 0;
+  float3 x_71 = 0.0f;
+  float3 x_74 = 0.0f;
+  bool x_60_phi = false;
+  float3 x_75_phi = 0.0f;
+  x_60_phi = false;
+  while (true) {
+    bool x_65 = false;
+    bool x_65_phi = false;
+    int x_8_phi = 0;
+    float3 x_71_phi = 0.0f;
+    bool x_72_phi = false;
+    bool const x_60 = x_60_phi;
+    i = 0;
+    x_65_phi = x_60;
+    x_8_phi = 0;
+    while (true) {
+      x_65 = x_65_phi;
+      int const x_8 = x_8_phi;
+      x_71_phi = float3(0.0f, 0.0f, 0.0f);
+      x_72_phi = x_65;
+      if ((x_8 < 0)) {
+      } else {
+        break;
+      }
+      x_57 = true;
+      x_58 = float3(1.0f, 1.0f, 1.0f);
+      x_71_phi = float3(1.0f, 1.0f, 1.0f);
+      x_72_phi = true;
+      break;
+      {
+        x_65_phi = false;
+        x_8_phi = 0;
+      }
+    }
+    x_71 = x_71_phi;
+    bool const x_72 = x_72_phi;
+    x_75_phi = x_71;
+    if (x_72) {
+      break;
+    }
+    x_74 = float3(0.0f, 0.0f, 0.0f);
+    x_57 = true;
+    x_75_phi = x_74;
+    break;
+    {
+      x_60_phi = false;
+    }
+  }
+  float3 const x_75 = x_75_phi;
+  return x_75;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/return-inside-loop-in-function/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/return-inside-loop-in-function/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..9396999
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/return-inside-loop-in-function/0.wgsl.expected.spvasm
@@ -0,0 +1,245 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 115
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_36 "x_36"
+               OpName %x_37 "x_37"
+               OpName %x_6 "x_6"
+               OpName %x_38 "x_38"
+               OpName %x_51 "x_51"
+               OpName %x_54 "x_54"
+               OpName %x_40_phi "x_40_phi"
+               OpName %x_55_phi "x_55_phi"
+               OpName %x_45 "x_45"
+               OpName %x_45_phi "x_45_phi"
+               OpName %x_7_phi "x_7_phi"
+               OpName %x_51_phi "x_51_phi"
+               OpName %x_52_phi "x_52_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpName %GLF_live4drawShape_ "GLF_live4drawShape_"
+               OpName %x_57 "x_57"
+               OpName %x_58 "x_58"
+               OpName %i "i"
+               OpName %x_71 "x_71"
+               OpName %x_74 "x_74"
+               OpName %x_60_phi "x_60_phi"
+               OpName %x_75_phi "x_75_phi"
+               OpName %x_65 "x_65"
+               OpName %x_65_phi "x_65_phi"
+               OpName %x_8_phi "x_8_phi"
+               OpName %x_71_phi "x_71_phi"
+               OpName %x_72_phi "x_72_phi"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %16 = OpConstantNull %bool
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %20 = OpConstantNull %v3float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %24 = OpConstantNull %int
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %32 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %int_0 = OpConstant %int 0
+         %50 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+       %true = OpConstantTrue %bool
+         %57 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+         %65 = OpTypeFunction %void %main_out
+         %77 = OpTypeFunction %v3float
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+       %x_36 = OpVariable %_ptr_Function_bool Function %16
+       %x_37 = OpVariable %_ptr_Function_v3float Function %20
+        %x_6 = OpVariable %_ptr_Function_int Function %24
+       %x_38 = OpVariable %_ptr_Function_v3float Function %20
+       %x_51 = OpVariable %_ptr_Function_v3float Function %20
+       %x_54 = OpVariable %_ptr_Function_v3float Function %20
+   %x_40_phi = OpVariable %_ptr_Function_bool Function %16
+   %x_55_phi = OpVariable %_ptr_Function_v3float Function %20
+       %x_45 = OpVariable %_ptr_Function_bool Function %16
+   %x_45_phi = OpVariable %_ptr_Function_bool Function %16
+    %x_7_phi = OpVariable %_ptr_Function_int Function %24
+   %x_51_phi = OpVariable %_ptr_Function_v3float Function %20
+   %x_52_phi = OpVariable %_ptr_Function_bool Function %16
+               OpStore %x_36 %false
+               OpStore %x_GLF_color %32
+               OpStore %x_36 %false
+               OpStore %x_40_phi %false
+               OpBranch %33
+         %33 = OpLabel
+               OpLoopMerge %34 %35 None
+               OpBranch %36
+         %36 = OpLabel
+         %42 = OpLoad %bool %x_40_phi
+               OpStore %x_6 %int_0
+               OpStore %x_45_phi %42
+               OpStore %x_7_phi %int_0
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %48 = OpLoad %bool %x_45_phi
+               OpStore %x_45 %48
+         %49 = OpLoad %int %x_7_phi
+               OpStore %x_51_phi %50
+         %51 = OpLoad %bool %x_45
+               OpStore %x_52_phi %51
+         %52 = OpSLessThan %bool %49 %int_0
+               OpSelectionMerge %53 None
+               OpBranchConditional %52 %54 %55
+         %54 = OpLabel
+               OpBranch %53
+         %55 = OpLabel
+               OpBranch %45
+         %53 = OpLabel
+               OpStore %x_36 %true
+               OpStore %x_37 %57
+               OpStore %x_51_phi %57
+               OpStore %x_52_phi %true
+               OpBranch %45
+         %46 = OpLabel
+               OpStore %x_45_phi %false
+               OpStore %x_7_phi %int_0
+               OpBranch %44
+         %45 = OpLabel
+         %58 = OpLoad %v3float %x_51_phi
+               OpStore %x_51 %58
+         %59 = OpLoad %bool %x_52_phi
+         %60 = OpLoad %v3float %x_51
+               OpStore %x_55_phi %60
+               OpSelectionMerge %61 None
+               OpBranchConditional %59 %62 %61
+         %62 = OpLabel
+               OpBranch %34
+         %61 = OpLabel
+               OpStore %x_54 %50
+               OpStore %x_36 %true
+         %63 = OpLoad %v3float %x_54
+               OpStore %x_55_phi %63
+               OpBranch %34
+         %35 = OpLabel
+               OpStore %x_40_phi %false
+               OpBranch %33
+         %34 = OpLabel
+         %64 = OpLoad %v3float %x_55_phi
+               OpStore %x_38 %64
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %65
+%tint_symbol = OpFunctionParameter %main_out
+         %69 = OpLabel
+         %70 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %70
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %72 = OpLabel
+         %73 = OpFunctionCall %void %main_1
+         %75 = OpLoad %v4float %x_GLF_color
+         %76 = OpCompositeConstruct %main_out %75
+         %74 = OpFunctionCall %void %tint_symbol_2 %76
+               OpReturn
+               OpFunctionEnd
+%GLF_live4drawShape_ = OpFunction %v3float None %77
+         %79 = OpLabel
+       %x_57 = OpVariable %_ptr_Function_bool Function %16
+       %x_58 = OpVariable %_ptr_Function_v3float Function %20
+          %i = OpVariable %_ptr_Function_int Function %24
+       %x_71 = OpVariable %_ptr_Function_v3float Function %20
+       %x_74 = OpVariable %_ptr_Function_v3float Function %20
+   %x_60_phi = OpVariable %_ptr_Function_bool Function %16
+   %x_75_phi = OpVariable %_ptr_Function_v3float Function %20
+       %x_65 = OpVariable %_ptr_Function_bool Function %16
+   %x_65_phi = OpVariable %_ptr_Function_bool Function %16
+    %x_8_phi = OpVariable %_ptr_Function_int Function %24
+   %x_71_phi = OpVariable %_ptr_Function_v3float Function %20
+   %x_72_phi = OpVariable %_ptr_Function_bool Function %16
+               OpStore %x_57 %false
+               OpStore %x_60_phi %false
+               OpBranch %87
+         %87 = OpLabel
+               OpLoopMerge %88 %89 None
+               OpBranch %90
+         %90 = OpLabel
+         %96 = OpLoad %bool %x_60_phi
+               OpStore %i %int_0
+               OpStore %x_65_phi %96
+               OpStore %x_8_phi %int_0
+               OpBranch %97
+         %97 = OpLabel
+               OpLoopMerge %98 %99 None
+               OpBranch %100
+        %100 = OpLabel
+        %101 = OpLoad %bool %x_65_phi
+               OpStore %x_65 %101
+        %102 = OpLoad %int %x_8_phi
+               OpStore %x_71_phi %50
+        %103 = OpLoad %bool %x_65
+               OpStore %x_72_phi %103
+        %104 = OpSLessThan %bool %102 %int_0
+               OpSelectionMerge %105 None
+               OpBranchConditional %104 %106 %107
+        %106 = OpLabel
+               OpBranch %105
+        %107 = OpLabel
+               OpBranch %98
+        %105 = OpLabel
+               OpStore %x_57 %true
+               OpStore %x_58 %57
+               OpStore %x_71_phi %57
+               OpStore %x_72_phi %true
+               OpBranch %98
+         %99 = OpLabel
+               OpStore %x_65_phi %false
+               OpStore %x_8_phi %int_0
+               OpBranch %97
+         %98 = OpLabel
+        %108 = OpLoad %v3float %x_71_phi
+               OpStore %x_71 %108
+        %109 = OpLoad %bool %x_72_phi
+        %110 = OpLoad %v3float %x_71
+               OpStore %x_75_phi %110
+               OpSelectionMerge %111 None
+               OpBranchConditional %109 %112 %111
+        %112 = OpLabel
+               OpBranch %88
+        %111 = OpLabel
+               OpStore %x_74 %50
+               OpStore %x_57 %true
+        %113 = OpLoad %v3float %x_74
+               OpStore %x_75_phi %113
+               OpBranch %88
+         %89 = OpLabel
+               OpStore %x_60_phi %false
+               OpBranch %87
+         %88 = OpLabel
+        %114 = OpLoad %v3float %x_75_phi
+               OpReturnValue %114
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/return-inside-loop-in-function/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/return-inside-loop-in-function/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..def4326
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/return-inside-loop-in-function/0.wgsl.expected.wgsl
@@ -0,0 +1,132 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_36 : bool = false;
+  var x_37 : vec3<f32>;
+  var x_6 : i32;
+  var x_38 : vec3<f32>;
+  var x_51 : vec3<f32>;
+  var x_54 : vec3<f32>;
+  var x_40_phi : bool;
+  var x_55_phi : vec3<f32>;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  x_36 = false;
+  x_40_phi = false;
+  loop {
+    var x_45 : bool;
+    var x_45_phi : bool;
+    var x_7_phi : i32;
+    var x_51_phi : vec3<f32>;
+    var x_52_phi : bool;
+    let x_40 : bool = x_40_phi;
+    x_6 = 0;
+    x_45_phi = x_40;
+    x_7_phi = 0;
+    loop {
+      x_45 = x_45_phi;
+      let x_7 : i32 = x_7_phi;
+      x_51_phi = vec3<f32>(0.0, 0.0, 0.0);
+      x_52_phi = x_45;
+      if ((x_7 < 0)) {
+      } else {
+        break;
+      }
+      x_36 = true;
+      x_37 = vec3<f32>(1.0, 1.0, 1.0);
+      x_51_phi = vec3<f32>(1.0, 1.0, 1.0);
+      x_52_phi = true;
+      break;
+
+      continuing {
+        x_45_phi = false;
+        x_7_phi = 0;
+      }
+    }
+    x_51 = x_51_phi;
+    let x_52 : bool = x_52_phi;
+    x_55_phi = x_51;
+    if (x_52) {
+      break;
+    }
+    x_54 = vec3<f32>(0.0, 0.0, 0.0);
+    x_36 = true;
+    x_55_phi = x_54;
+    break;
+
+    continuing {
+      x_40_phi = false;
+    }
+  }
+  let x_55 : vec3<f32> = x_55_phi;
+  x_38 = x_55;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+fn GLF_live4drawShape_() -> vec3<f32> {
+  var x_57 : bool = false;
+  var x_58 : vec3<f32>;
+  var i : i32;
+  var x_71 : vec3<f32>;
+  var x_74 : vec3<f32>;
+  var x_60_phi : bool;
+  var x_75_phi : vec3<f32>;
+  x_60_phi = false;
+  loop {
+    var x_65 : bool;
+    var x_65_phi : bool;
+    var x_8_phi : i32;
+    var x_71_phi : vec3<f32>;
+    var x_72_phi : bool;
+    let x_60 : bool = x_60_phi;
+    i = 0;
+    x_65_phi = x_60;
+    x_8_phi = 0;
+    loop {
+      x_65 = x_65_phi;
+      let x_8 : i32 = x_8_phi;
+      x_71_phi = vec3<f32>(0.0, 0.0, 0.0);
+      x_72_phi = x_65;
+      if ((x_8 < 0)) {
+      } else {
+        break;
+      }
+      x_57 = true;
+      x_58 = vec3<f32>(1.0, 1.0, 1.0);
+      x_71_phi = vec3<f32>(1.0, 1.0, 1.0);
+      x_72_phi = true;
+      break;
+
+      continuing {
+        x_65_phi = false;
+        x_8_phi = 0;
+      }
+    }
+    x_71 = x_71_phi;
+    let x_72 : bool = x_72_phi;
+    x_75_phi = x_71;
+    if (x_72) {
+      break;
+    }
+    x_74 = vec3<f32>(0.0, 0.0, 0.0);
+    x_57 = true;
+    x_75_phi = x_74;
+    break;
+
+    continuing {
+      x_60_phi = false;
+    }
+  }
+  let x_75 : vec3<f32> = x_75_phi;
+  return x_75;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/returned-boolean-in-vector/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/returned-boolean-in-vector/0-opt.spvasm
new file mode 100644
index 0000000..f81fa10
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/returned-boolean-in-vector/0-opt.spvasm
@@ -0,0 +1,124 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %color "color"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %7 RelaxedPrecision
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+       %bool = OpTypeBool
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+       %true = OpConstantTrue %bool
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_0 = OpConstant %float 0
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+    %float_1 = OpConstant %float 1
+         %26 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+      %false = OpConstantFalse %bool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %30 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %32 = OpUndef %v3float
+         %33 = OpUndef %bool
+         %34 = OpUndef %int
+       %main = OpFunction %void None %9
+         %35 = OpLabel
+         %36 = OpVariable %_ptr_Function_bool Function %false
+         %37 = OpVariable %_ptr_Function_bool Function
+          %7 = OpVariable %_ptr_Function_int Function
+         %38 = OpVariable %_ptr_Function_bool Function
+      %color = OpVariable %_ptr_Function_v3float Function
+               OpBranch %39
+         %39 = OpLabel
+         %40 = OpPhi %bool %33 %35 %40 %41
+         %42 = OpPhi %v3float %32 %35 %43 %41
+               OpLoopMerge %44 %41 None
+               OpBranch %45
+         %45 = OpLabel
+         %46 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %47 = OpLoad %float %46
+         %48 = OpFOrdLessThan %bool %47 %float_0
+               OpSelectionMerge %49 None
+               OpBranchConditional %48 %50 %49
+         %50 = OpLabel
+               OpStore %color %26
+               OpBranch %49
+         %49 = OpLabel
+         %43 = OpPhi %v3float %42 %45 %26 %50
+               OpBranch %41
+         %41 = OpLabel
+               OpBranchConditional %false %39 %44
+         %44 = OpLabel
+         %51 = OpCompositeExtract %float %43 0
+         %52 = OpCompositeExtract %float %43 1
+         %53 = OpCompositeExtract %float %43 2
+         %54 = OpCompositeConstruct %v4float %51 %52 %53 %float_1
+               OpStore %36 %false
+               OpBranch %55
+         %55 = OpLabel
+         %56 = OpPhi %bool %40 %44 %33 %57
+         %58 = OpPhi %bool %false %44 %33 %57
+               OpLoopMerge %59 %57 None
+               OpBranch %60
+         %60 = OpLabel
+               OpStore %7 %int_0
+               OpBranch %61
+         %61 = OpLabel
+         %62 = OpPhi %bool %56 %60 %33 %63
+         %64 = OpPhi %bool %false %60 %33 %63
+         %65 = OpPhi %int %int_0 %60 %34 %63
+               OpLoopMerge %66 %63 None
+               OpBranch %67
+         %67 = OpLabel
+         %68 = OpSLessThan %bool %int_0 %int_1
+               OpBranchConditional %true %69 %66
+         %69 = OpLabel
+               OpStore %36 %true
+               OpStore %37 %true
+               OpBranch %66
+         %63 = OpLabel
+               OpBranch %61
+         %66 = OpLabel
+         %70 = OpPhi %bool %62 %67 %true %69
+         %71 = OpPhi %bool %false %67 %true %69
+               OpSelectionMerge %72 None
+               OpBranchConditional %true %59 %72
+         %72 = OpLabel
+               OpStore %36 %true
+               OpBranch %59
+         %57 = OpLabel
+               OpBranch %55
+         %59 = OpLabel
+               OpStore %38 %true
+         %73 = OpSelect %float %true %float_1 %float_0
+         %74 = OpCompositeConstruct %v4float %73 %73 %73 %73
+         %75 = OpFAdd %v4float %54 %74
+               OpStore %_GLF_color %75
+               OpStore %_GLF_color %30
+               OpReturn
+               OpFunctionEnd
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
new file mode 100755
index 0000000..b1d646d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/returned-boolean-in-vector/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,113 @@
+SKIP: FAILED
+
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  bool x_36 = false;
+  bool x_37 = false;
+  int x_7 = 0;
+  bool x_38 = false;
+  float3 color = float3(0.0f, 0.0f, 0.0f);
+  bool x_40 = false;
+  float3 x_43 = float3(0.0f, 0.0f, 0.0f);
+  bool x_40_phi = false;
+  float3 x_42_phi = float3(0.0f, 0.0f, 0.0f);
+  bool x_56_phi = false;
+  bool x_58_phi = false;
+  x_40_phi = false;
+  x_42_phi = float3(0.0f, 0.0f, 0.0f);
+  while (true) {
+    float3 x_43_phi = float3(0.0f, 0.0f, 0.0f);
+    x_40 = x_40_phi;
+    const float3 x_42 = x_42_phi;
+    const float x_47 = asfloat(x_5[0].y);
+    x_43_phi = x_42;
+    if ((x_47 < 0.0f)) {
+      color = float3(1.0f, 1.0f, 1.0f);
+      x_43_phi = float3(1.0f, 1.0f, 1.0f);
+    }
+    x_43 = x_43_phi;
+    {
+      x_40_phi = x_40;
+      x_42_phi = x_43;
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_36 = false;
+  x_56_phi = x_40;
+  x_58_phi = false;
+  while (true) {
+    bool x_62 = false;
+    bool x_62_phi = false;
+    bool x_64_phi = false;
+    int x_65_phi = 0;
+    bool x_70_phi = false;
+    bool x_71_phi = false;
+    const bool x_56 = x_56_phi;
+    const bool x_58 = x_58_phi;
+    x_7 = 0;
+    x_62_phi = x_56;
+    x_64_phi = false;
+    x_65_phi = 0;
+    while (true) {
+      x_62 = x_62_phi;
+      const bool x_64 = x_64_phi;
+      const int x_65 = x_65_phi;
+      const bool x_68 = (0 < 1);
+      x_70_phi = x_62;
+      x_71_phi = false;
+      if (true) {
+      } else {
+        break;
+      }
+      x_36 = true;
+      x_37 = true;
+      x_70_phi = true;
+      x_71_phi = true;
+      break;
+      {
+        x_62_phi = false;
+        x_64_phi = false;
+        x_65_phi = 0;
+      }
+    }
+    const bool x_70 = x_70_phi;
+    const bool x_71 = x_71_phi;
+    if (true) {
+      break;
+    }
+    x_36 = true;
+    break;
+    {
+      x_56_phi = false;
+      x_58_phi = false;
+    }
+  }
+  x_38 = true;
+  const float x_73 = (true ? 1.0f : 0.0f);
+  x_GLF_color = (float4(x_43.x, x_43.y, x_43.z, 1.0f) + float4(x_73, x_73, x_73, x_73));
+  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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
+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.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/returned-boolean-in-vector/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..9946472
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/returned-boolean-in-vector/0-opt.spvasm.expected.msl
@@ -0,0 +1,112 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  bool x_36 = false;
+  bool x_37 = false;
+  int x_7 = 0;
+  bool x_38 = false;
+  float3 color = 0.0f;
+  bool x_40 = false;
+  float3 x_43 = 0.0f;
+  bool x_40_phi = false;
+  float3 x_42_phi = 0.0f;
+  bool x_56_phi = false;
+  bool x_58_phi = false;
+  x_40_phi = false;
+  x_42_phi = float3(0.0f, 0.0f, 0.0f);
+  while (true) {
+    float3 x_43_phi = 0.0f;
+    x_40 = x_40_phi;
+    float3 const x_42 = x_42_phi;
+    float const x_47 = x_5.injectionSwitch.y;
+    x_43_phi = x_42;
+    if ((x_47 < 0.0f)) {
+      color = float3(1.0f, 1.0f, 1.0f);
+      x_43_phi = float3(1.0f, 1.0f, 1.0f);
+    }
+    x_43 = x_43_phi;
+    {
+      x_40_phi = x_40;
+      x_42_phi = x_43;
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_36 = false;
+  x_56_phi = x_40;
+  x_58_phi = false;
+  while (true) {
+    bool x_62 = false;
+    bool x_62_phi = false;
+    bool x_64_phi = false;
+    int x_65_phi = 0;
+    bool x_70_phi = false;
+    bool x_71_phi = false;
+    bool const x_56 = x_56_phi;
+    bool const x_58 = x_58_phi;
+    x_7 = 0;
+    x_62_phi = x_56;
+    x_64_phi = false;
+    x_65_phi = 0;
+    while (true) {
+      x_62 = x_62_phi;
+      bool const x_64 = x_64_phi;
+      int const x_65 = x_65_phi;
+      bool const x_68 = (0 < 1);
+      x_70_phi = x_62;
+      x_71_phi = false;
+      if (true) {
+      } else {
+        break;
+      }
+      x_36 = true;
+      x_37 = true;
+      x_70_phi = true;
+      x_71_phi = true;
+      break;
+      {
+        x_62_phi = false;
+        x_64_phi = false;
+        x_65_phi = 0;
+      }
+    }
+    bool const x_70 = x_70_phi;
+    bool const x_71 = x_71_phi;
+    if (true) {
+      break;
+    }
+    x_36 = true;
+    break;
+    {
+      x_56_phi = false;
+      x_58_phi = false;
+    }
+  }
+  x_38 = true;
+  float const x_73 = select(0.0f, 1.0f, true);
+  *(tint_symbol_4) = (float4(x_43.x, x_43.y, x_43.z, 1.0f) + float4(x_73, x_73, x_73, x_73));
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/returned-boolean-in-vector/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/returned-boolean-in-vector/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..093acdc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/returned-boolean-in-vector/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,238 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 120
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_36 "x_36"
+               OpName %x_37 "x_37"
+               OpName %x_7 "x_7"
+               OpName %x_38 "x_38"
+               OpName %color "color"
+               OpName %x_40 "x_40"
+               OpName %x_43 "x_43"
+               OpName %x_40_phi "x_40_phi"
+               OpName %x_42_phi "x_42_phi"
+               OpName %x_56_phi "x_56_phi"
+               OpName %x_58_phi "x_58_phi"
+               OpName %x_43_phi "x_43_phi"
+               OpName %x_62 "x_62"
+               OpName %x_62_phi "x_62_phi"
+               OpName %x_64_phi "x_64_phi"
+               OpName %x_65_phi "x_65_phi"
+               OpName %x_70_phi "x_70_phi"
+               OpName %x_71_phi "x_71_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %20 = OpConstantNull %bool
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %25 = OpConstantNull %int
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %30 = OpConstantNull %v3float
+    %float_0 = OpConstant %float 0
+         %38 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+         %56 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+       %true = OpConstantTrue %bool
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_2 = OpConstant %uint 2
+        %107 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %108 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+       %x_36 = OpVariable %_ptr_Function_bool Function %20
+       %x_37 = OpVariable %_ptr_Function_bool Function %20
+        %x_7 = OpVariable %_ptr_Function_int Function %25
+       %x_38 = OpVariable %_ptr_Function_bool Function %20
+      %color = OpVariable %_ptr_Function_v3float Function %30
+       %x_40 = OpVariable %_ptr_Function_bool Function %20
+       %x_43 = OpVariable %_ptr_Function_v3float Function %30
+   %x_40_phi = OpVariable %_ptr_Function_bool Function %20
+   %x_42_phi = OpVariable %_ptr_Function_v3float Function %30
+   %x_56_phi = OpVariable %_ptr_Function_bool Function %20
+   %x_58_phi = OpVariable %_ptr_Function_bool Function %20
+   %x_43_phi = OpVariable %_ptr_Function_v3float Function %30
+       %x_62 = OpVariable %_ptr_Function_bool Function %20
+   %x_62_phi = OpVariable %_ptr_Function_bool Function %20
+   %x_64_phi = OpVariable %_ptr_Function_bool Function %20
+   %x_65_phi = OpVariable %_ptr_Function_int Function %25
+   %x_70_phi = OpVariable %_ptr_Function_bool Function %20
+   %x_71_phi = OpVariable %_ptr_Function_bool Function %20
+               OpStore %x_36 %false
+               OpStore %x_40_phi %false
+               OpStore %x_42_phi %38
+               OpBranch %39
+         %39 = OpLabel
+               OpLoopMerge %40 %41 None
+               OpBranch %42
+         %42 = OpLabel
+         %44 = OpLoad %bool %x_40_phi
+               OpStore %x_40 %44
+         %45 = OpLoad %v3float %x_42_phi
+         %50 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %uint_1
+         %51 = OpLoad %float %50
+               OpStore %x_43_phi %45
+         %52 = OpFOrdLessThan %bool %51 %float_0
+               OpSelectionMerge %53 None
+               OpBranchConditional %52 %54 %53
+         %54 = OpLabel
+               OpStore %color %56
+               OpStore %x_43_phi %56
+               OpBranch %53
+         %53 = OpLabel
+         %57 = OpLoad %v3float %x_43_phi
+               OpStore %x_43 %57
+               OpBranch %41
+         %41 = OpLabel
+         %58 = OpLoad %bool %x_40
+               OpStore %x_40_phi %58
+         %59 = OpLoad %v3float %x_43
+               OpStore %x_42_phi %59
+               OpSelectionMerge %60 None
+               OpBranchConditional %false %61 %62
+         %61 = OpLabel
+               OpBranch %60
+         %62 = OpLabel
+               OpBranch %40
+         %60 = OpLabel
+               OpBranch %39
+         %40 = OpLabel
+               OpStore %x_36 %false
+         %63 = OpLoad %bool %x_40
+               OpStore %x_56_phi %63
+               OpStore %x_58_phi %false
+               OpBranch %64
+         %64 = OpLabel
+               OpLoopMerge %65 %66 None
+               OpBranch %67
+         %67 = OpLabel
+         %74 = OpLoad %bool %x_56_phi
+         %75 = OpLoad %bool %x_58_phi
+               OpStore %x_7 %int_0
+               OpStore %x_62_phi %74
+               OpStore %x_64_phi %false
+               OpStore %x_65_phi %int_0
+               OpBranch %77
+         %77 = OpLabel
+               OpLoopMerge %78 %79 None
+               OpBranch %80
+         %80 = OpLabel
+         %81 = OpLoad %bool %x_62_phi
+               OpStore %x_62 %81
+         %82 = OpLoad %bool %x_64_phi
+         %83 = OpLoad %int %x_65_phi
+         %85 = OpSLessThan %bool %int_0 %int_1
+         %86 = OpLoad %bool %x_62
+               OpStore %x_70_phi %86
+               OpStore %x_71_phi %false
+               OpSelectionMerge %88 None
+               OpBranchConditional %true %89 %90
+         %89 = OpLabel
+               OpBranch %88
+         %90 = OpLabel
+               OpBranch %78
+         %88 = OpLabel
+               OpStore %x_36 %true
+               OpStore %x_37 %true
+               OpStore %x_70_phi %true
+               OpStore %x_71_phi %true
+               OpBranch %78
+         %79 = OpLabel
+               OpStore %x_62_phi %false
+               OpStore %x_64_phi %false
+               OpStore %x_65_phi %int_0
+               OpBranch %77
+         %78 = OpLabel
+         %91 = OpLoad %bool %x_70_phi
+         %92 = OpLoad %bool %x_71_phi
+               OpSelectionMerge %93 None
+               OpBranchConditional %true %94 %93
+         %94 = OpLabel
+               OpBranch %65
+         %93 = OpLabel
+               OpStore %x_36 %true
+               OpBranch %65
+         %66 = OpLabel
+               OpStore %x_56_phi %false
+               OpStore %x_58_phi %false
+               OpBranch %64
+         %65 = OpLabel
+               OpStore %x_38 %true
+         %95 = OpSelect %float %true %float_1 %float_0
+         %97 = OpAccessChain %_ptr_Function_float %x_43 %uint_0
+         %98 = OpLoad %float %97
+         %99 = OpAccessChain %_ptr_Function_float %x_43 %uint_1
+        %100 = OpLoad %float %99
+        %102 = OpAccessChain %_ptr_Function_float %x_43 %uint_2
+        %103 = OpLoad %float %102
+        %104 = OpCompositeConstruct %v4float %98 %100 %103 %float_1
+        %105 = OpCompositeConstruct %v4float %95 %95 %95 %95
+        %106 = OpFAdd %v4float %104 %105
+               OpStore %x_GLF_color %106
+               OpStore %x_GLF_color %107
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %108
+%tint_symbol = OpFunctionParameter %main_out
+        %112 = OpLabel
+        %113 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %113
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+        %115 = OpLabel
+        %116 = OpFunctionCall %void %main_1
+        %118 = OpLoad %v4float %x_GLF_color
+        %119 = OpCompositeConstruct %main_out %118
+        %117 = OpFunctionCall %void %tint_symbol_2 %119
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 41[%41] is not post dominated by the back-edge block 60[%60]
+  %60 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/returned-boolean-in-vector/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/returned-boolean-in-vector/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..b1bfcca
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/returned-boolean-in-vector/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,113 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_36 : bool = false;
+  var x_37 : bool;
+  var x_7 : i32;
+  var x_38 : bool;
+  var color : vec3<f32>;
+  var x_40 : bool;
+  var x_43 : vec3<f32>;
+  var x_40_phi : bool;
+  var x_42_phi : vec3<f32>;
+  var x_56_phi : bool;
+  var x_58_phi : bool;
+  x_40_phi = false;
+  x_42_phi = vec3<f32>(0.0, 0.0, 0.0);
+  loop {
+    var x_43_phi : vec3<f32>;
+    x_40 = x_40_phi;
+    let x_42 : vec3<f32> = x_42_phi;
+    let x_47 : f32 = x_5.injectionSwitch.y;
+    x_43_phi = x_42;
+    if ((x_47 < 0.0)) {
+      color = vec3<f32>(1.0, 1.0, 1.0);
+      x_43_phi = vec3<f32>(1.0, 1.0, 1.0);
+    }
+    x_43 = x_43_phi;
+
+    continuing {
+      x_40_phi = x_40;
+      x_42_phi = x_43;
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_36 = false;
+  x_56_phi = x_40;
+  x_58_phi = false;
+  loop {
+    var x_62 : bool;
+    var x_62_phi : bool;
+    var x_64_phi : bool;
+    var x_65_phi : i32;
+    var x_70_phi : bool;
+    var x_71_phi : bool;
+    let x_56 : bool = x_56_phi;
+    let x_58 : bool = x_58_phi;
+    x_7 = 0;
+    x_62_phi = x_56;
+    x_64_phi = false;
+    x_65_phi = 0;
+    loop {
+      x_62 = x_62_phi;
+      let x_64 : bool = x_64_phi;
+      let x_65 : i32 = x_65_phi;
+      let x_68 : bool = (0 < 1);
+      x_70_phi = x_62;
+      x_71_phi = false;
+      if (true) {
+      } else {
+        break;
+      }
+      x_36 = true;
+      x_37 = true;
+      x_70_phi = true;
+      x_71_phi = true;
+      break;
+
+      continuing {
+        x_62_phi = false;
+        x_64_phi = false;
+        x_65_phi = 0;
+      }
+    }
+    let x_70 : bool = x_70_phi;
+    let x_71 : bool = x_71_phi;
+    if (true) {
+      break;
+    }
+    x_36 = true;
+    break;
+
+    continuing {
+      x_56_phi = false;
+      x_58_phi = false;
+    }
+  }
+  x_38 = true;
+  let x_73 : f32 = select(0.0, 1.0, true);
+  x_GLF_color = (vec4<f32>(x_43.x, x_43.y, x_43.z, 1.0) + vec4<f32>(x_73, x_73, x_73, x_73));
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/returned-boolean-in-vector/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/returned-boolean-in-vector/0-opt.wgsl
new file mode 100644
index 0000000..b1bfcca
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/returned-boolean-in-vector/0-opt.wgsl
@@ -0,0 +1,113 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_36 : bool = false;
+  var x_37 : bool;
+  var x_7 : i32;
+  var x_38 : bool;
+  var color : vec3<f32>;
+  var x_40 : bool;
+  var x_43 : vec3<f32>;
+  var x_40_phi : bool;
+  var x_42_phi : vec3<f32>;
+  var x_56_phi : bool;
+  var x_58_phi : bool;
+  x_40_phi = false;
+  x_42_phi = vec3<f32>(0.0, 0.0, 0.0);
+  loop {
+    var x_43_phi : vec3<f32>;
+    x_40 = x_40_phi;
+    let x_42 : vec3<f32> = x_42_phi;
+    let x_47 : f32 = x_5.injectionSwitch.y;
+    x_43_phi = x_42;
+    if ((x_47 < 0.0)) {
+      color = vec3<f32>(1.0, 1.0, 1.0);
+      x_43_phi = vec3<f32>(1.0, 1.0, 1.0);
+    }
+    x_43 = x_43_phi;
+
+    continuing {
+      x_40_phi = x_40;
+      x_42_phi = x_43;
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_36 = false;
+  x_56_phi = x_40;
+  x_58_phi = false;
+  loop {
+    var x_62 : bool;
+    var x_62_phi : bool;
+    var x_64_phi : bool;
+    var x_65_phi : i32;
+    var x_70_phi : bool;
+    var x_71_phi : bool;
+    let x_56 : bool = x_56_phi;
+    let x_58 : bool = x_58_phi;
+    x_7 = 0;
+    x_62_phi = x_56;
+    x_64_phi = false;
+    x_65_phi = 0;
+    loop {
+      x_62 = x_62_phi;
+      let x_64 : bool = x_64_phi;
+      let x_65 : i32 = x_65_phi;
+      let x_68 : bool = (0 < 1);
+      x_70_phi = x_62;
+      x_71_phi = false;
+      if (true) {
+      } else {
+        break;
+      }
+      x_36 = true;
+      x_37 = true;
+      x_70_phi = true;
+      x_71_phi = true;
+      break;
+
+      continuing {
+        x_62_phi = false;
+        x_64_phi = false;
+        x_65_phi = 0;
+      }
+    }
+    let x_70 : bool = x_70_phi;
+    let x_71 : bool = x_71_phi;
+    if (true) {
+      break;
+    }
+    x_36 = true;
+    break;
+
+    continuing {
+      x_56_phi = false;
+      x_58_phi = false;
+    }
+  }
+  x_38 = true;
+  let x_73 : f32 = select(0.0, 1.0, true);
+  x_GLF_color = (vec4<f32>(x_43.x, x_43.y, x_43.z, 1.0) + vec4<f32>(x_73, x_73, x_73, x_73));
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
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
new file mode 100755
index 0000000..b1d646d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/returned-boolean-in-vector/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,113 @@
+SKIP: FAILED
+
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  bool x_36 = false;
+  bool x_37 = false;
+  int x_7 = 0;
+  bool x_38 = false;
+  float3 color = float3(0.0f, 0.0f, 0.0f);
+  bool x_40 = false;
+  float3 x_43 = float3(0.0f, 0.0f, 0.0f);
+  bool x_40_phi = false;
+  float3 x_42_phi = float3(0.0f, 0.0f, 0.0f);
+  bool x_56_phi = false;
+  bool x_58_phi = false;
+  x_40_phi = false;
+  x_42_phi = float3(0.0f, 0.0f, 0.0f);
+  while (true) {
+    float3 x_43_phi = float3(0.0f, 0.0f, 0.0f);
+    x_40 = x_40_phi;
+    const float3 x_42 = x_42_phi;
+    const float x_47 = asfloat(x_5[0].y);
+    x_43_phi = x_42;
+    if ((x_47 < 0.0f)) {
+      color = float3(1.0f, 1.0f, 1.0f);
+      x_43_phi = float3(1.0f, 1.0f, 1.0f);
+    }
+    x_43 = x_43_phi;
+    {
+      x_40_phi = x_40;
+      x_42_phi = x_43;
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_36 = false;
+  x_56_phi = x_40;
+  x_58_phi = false;
+  while (true) {
+    bool x_62 = false;
+    bool x_62_phi = false;
+    bool x_64_phi = false;
+    int x_65_phi = 0;
+    bool x_70_phi = false;
+    bool x_71_phi = false;
+    const bool x_56 = x_56_phi;
+    const bool x_58 = x_58_phi;
+    x_7 = 0;
+    x_62_phi = x_56;
+    x_64_phi = false;
+    x_65_phi = 0;
+    while (true) {
+      x_62 = x_62_phi;
+      const bool x_64 = x_64_phi;
+      const int x_65 = x_65_phi;
+      const bool x_68 = (0 < 1);
+      x_70_phi = x_62;
+      x_71_phi = false;
+      if (true) {
+      } else {
+        break;
+      }
+      x_36 = true;
+      x_37 = true;
+      x_70_phi = true;
+      x_71_phi = true;
+      break;
+      {
+        x_62_phi = false;
+        x_64_phi = false;
+        x_65_phi = 0;
+      }
+    }
+    const bool x_70 = x_70_phi;
+    const bool x_71 = x_71_phi;
+    if (true) {
+      break;
+    }
+    x_36 = true;
+    break;
+    {
+      x_56_phi = false;
+      x_58_phi = false;
+    }
+  }
+  x_38 = true;
+  const float x_73 = (true ? 1.0f : 0.0f);
+  x_GLF_color = (float4(x_43.x, x_43.y, x_43.z, 1.0f) + float4(x_73, x_73, x_73, x_73));
+  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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
+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.msl b/test/vk-gl-cts/graphicsfuzz/returned-boolean-in-vector/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..9946472
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/returned-boolean-in-vector/0-opt.wgsl.expected.msl
@@ -0,0 +1,112 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  bool x_36 = false;
+  bool x_37 = false;
+  int x_7 = 0;
+  bool x_38 = false;
+  float3 color = 0.0f;
+  bool x_40 = false;
+  float3 x_43 = 0.0f;
+  bool x_40_phi = false;
+  float3 x_42_phi = 0.0f;
+  bool x_56_phi = false;
+  bool x_58_phi = false;
+  x_40_phi = false;
+  x_42_phi = float3(0.0f, 0.0f, 0.0f);
+  while (true) {
+    float3 x_43_phi = 0.0f;
+    x_40 = x_40_phi;
+    float3 const x_42 = x_42_phi;
+    float const x_47 = x_5.injectionSwitch.y;
+    x_43_phi = x_42;
+    if ((x_47 < 0.0f)) {
+      color = float3(1.0f, 1.0f, 1.0f);
+      x_43_phi = float3(1.0f, 1.0f, 1.0f);
+    }
+    x_43 = x_43_phi;
+    {
+      x_40_phi = x_40;
+      x_42_phi = x_43;
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_36 = false;
+  x_56_phi = x_40;
+  x_58_phi = false;
+  while (true) {
+    bool x_62 = false;
+    bool x_62_phi = false;
+    bool x_64_phi = false;
+    int x_65_phi = 0;
+    bool x_70_phi = false;
+    bool x_71_phi = false;
+    bool const x_56 = x_56_phi;
+    bool const x_58 = x_58_phi;
+    x_7 = 0;
+    x_62_phi = x_56;
+    x_64_phi = false;
+    x_65_phi = 0;
+    while (true) {
+      x_62 = x_62_phi;
+      bool const x_64 = x_64_phi;
+      int const x_65 = x_65_phi;
+      bool const x_68 = (0 < 1);
+      x_70_phi = x_62;
+      x_71_phi = false;
+      if (true) {
+      } else {
+        break;
+      }
+      x_36 = true;
+      x_37 = true;
+      x_70_phi = true;
+      x_71_phi = true;
+      break;
+      {
+        x_62_phi = false;
+        x_64_phi = false;
+        x_65_phi = 0;
+      }
+    }
+    bool const x_70 = x_70_phi;
+    bool const x_71 = x_71_phi;
+    if (true) {
+      break;
+    }
+    x_36 = true;
+    break;
+    {
+      x_56_phi = false;
+      x_58_phi = false;
+    }
+  }
+  x_38 = true;
+  float const x_73 = select(0.0f, 1.0f, true);
+  *(tint_symbol_4) = (float4(x_43.x, x_43.y, x_43.z, 1.0f) + float4(x_73, x_73, x_73, x_73));
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/returned-boolean-in-vector/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/returned-boolean-in-vector/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..093acdc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/returned-boolean-in-vector/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,238 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 120
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_36 "x_36"
+               OpName %x_37 "x_37"
+               OpName %x_7 "x_7"
+               OpName %x_38 "x_38"
+               OpName %color "color"
+               OpName %x_40 "x_40"
+               OpName %x_43 "x_43"
+               OpName %x_40_phi "x_40_phi"
+               OpName %x_42_phi "x_42_phi"
+               OpName %x_56_phi "x_56_phi"
+               OpName %x_58_phi "x_58_phi"
+               OpName %x_43_phi "x_43_phi"
+               OpName %x_62 "x_62"
+               OpName %x_62_phi "x_62_phi"
+               OpName %x_64_phi "x_64_phi"
+               OpName %x_65_phi "x_65_phi"
+               OpName %x_70_phi "x_70_phi"
+               OpName %x_71_phi "x_71_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %20 = OpConstantNull %bool
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %25 = OpConstantNull %int
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %30 = OpConstantNull %v3float
+    %float_0 = OpConstant %float 0
+         %38 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+         %56 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+       %true = OpConstantTrue %bool
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_2 = OpConstant %uint 2
+        %107 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %108 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+       %x_36 = OpVariable %_ptr_Function_bool Function %20
+       %x_37 = OpVariable %_ptr_Function_bool Function %20
+        %x_7 = OpVariable %_ptr_Function_int Function %25
+       %x_38 = OpVariable %_ptr_Function_bool Function %20
+      %color = OpVariable %_ptr_Function_v3float Function %30
+       %x_40 = OpVariable %_ptr_Function_bool Function %20
+       %x_43 = OpVariable %_ptr_Function_v3float Function %30
+   %x_40_phi = OpVariable %_ptr_Function_bool Function %20
+   %x_42_phi = OpVariable %_ptr_Function_v3float Function %30
+   %x_56_phi = OpVariable %_ptr_Function_bool Function %20
+   %x_58_phi = OpVariable %_ptr_Function_bool Function %20
+   %x_43_phi = OpVariable %_ptr_Function_v3float Function %30
+       %x_62 = OpVariable %_ptr_Function_bool Function %20
+   %x_62_phi = OpVariable %_ptr_Function_bool Function %20
+   %x_64_phi = OpVariable %_ptr_Function_bool Function %20
+   %x_65_phi = OpVariable %_ptr_Function_int Function %25
+   %x_70_phi = OpVariable %_ptr_Function_bool Function %20
+   %x_71_phi = OpVariable %_ptr_Function_bool Function %20
+               OpStore %x_36 %false
+               OpStore %x_40_phi %false
+               OpStore %x_42_phi %38
+               OpBranch %39
+         %39 = OpLabel
+               OpLoopMerge %40 %41 None
+               OpBranch %42
+         %42 = OpLabel
+         %44 = OpLoad %bool %x_40_phi
+               OpStore %x_40 %44
+         %45 = OpLoad %v3float %x_42_phi
+         %50 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %uint_1
+         %51 = OpLoad %float %50
+               OpStore %x_43_phi %45
+         %52 = OpFOrdLessThan %bool %51 %float_0
+               OpSelectionMerge %53 None
+               OpBranchConditional %52 %54 %53
+         %54 = OpLabel
+               OpStore %color %56
+               OpStore %x_43_phi %56
+               OpBranch %53
+         %53 = OpLabel
+         %57 = OpLoad %v3float %x_43_phi
+               OpStore %x_43 %57
+               OpBranch %41
+         %41 = OpLabel
+         %58 = OpLoad %bool %x_40
+               OpStore %x_40_phi %58
+         %59 = OpLoad %v3float %x_43
+               OpStore %x_42_phi %59
+               OpSelectionMerge %60 None
+               OpBranchConditional %false %61 %62
+         %61 = OpLabel
+               OpBranch %60
+         %62 = OpLabel
+               OpBranch %40
+         %60 = OpLabel
+               OpBranch %39
+         %40 = OpLabel
+               OpStore %x_36 %false
+         %63 = OpLoad %bool %x_40
+               OpStore %x_56_phi %63
+               OpStore %x_58_phi %false
+               OpBranch %64
+         %64 = OpLabel
+               OpLoopMerge %65 %66 None
+               OpBranch %67
+         %67 = OpLabel
+         %74 = OpLoad %bool %x_56_phi
+         %75 = OpLoad %bool %x_58_phi
+               OpStore %x_7 %int_0
+               OpStore %x_62_phi %74
+               OpStore %x_64_phi %false
+               OpStore %x_65_phi %int_0
+               OpBranch %77
+         %77 = OpLabel
+               OpLoopMerge %78 %79 None
+               OpBranch %80
+         %80 = OpLabel
+         %81 = OpLoad %bool %x_62_phi
+               OpStore %x_62 %81
+         %82 = OpLoad %bool %x_64_phi
+         %83 = OpLoad %int %x_65_phi
+         %85 = OpSLessThan %bool %int_0 %int_1
+         %86 = OpLoad %bool %x_62
+               OpStore %x_70_phi %86
+               OpStore %x_71_phi %false
+               OpSelectionMerge %88 None
+               OpBranchConditional %true %89 %90
+         %89 = OpLabel
+               OpBranch %88
+         %90 = OpLabel
+               OpBranch %78
+         %88 = OpLabel
+               OpStore %x_36 %true
+               OpStore %x_37 %true
+               OpStore %x_70_phi %true
+               OpStore %x_71_phi %true
+               OpBranch %78
+         %79 = OpLabel
+               OpStore %x_62_phi %false
+               OpStore %x_64_phi %false
+               OpStore %x_65_phi %int_0
+               OpBranch %77
+         %78 = OpLabel
+         %91 = OpLoad %bool %x_70_phi
+         %92 = OpLoad %bool %x_71_phi
+               OpSelectionMerge %93 None
+               OpBranchConditional %true %94 %93
+         %94 = OpLabel
+               OpBranch %65
+         %93 = OpLabel
+               OpStore %x_36 %true
+               OpBranch %65
+         %66 = OpLabel
+               OpStore %x_56_phi %false
+               OpStore %x_58_phi %false
+               OpBranch %64
+         %65 = OpLabel
+               OpStore %x_38 %true
+         %95 = OpSelect %float %true %float_1 %float_0
+         %97 = OpAccessChain %_ptr_Function_float %x_43 %uint_0
+         %98 = OpLoad %float %97
+         %99 = OpAccessChain %_ptr_Function_float %x_43 %uint_1
+        %100 = OpLoad %float %99
+        %102 = OpAccessChain %_ptr_Function_float %x_43 %uint_2
+        %103 = OpLoad %float %102
+        %104 = OpCompositeConstruct %v4float %98 %100 %103 %float_1
+        %105 = OpCompositeConstruct %v4float %95 %95 %95 %95
+        %106 = OpFAdd %v4float %104 %105
+               OpStore %x_GLF_color %106
+               OpStore %x_GLF_color %107
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %108
+%tint_symbol = OpFunctionParameter %main_out
+        %112 = OpLabel
+        %113 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %113
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+        %115 = OpLabel
+        %116 = OpFunctionCall %void %main_1
+        %118 = OpLoad %v4float %x_GLF_color
+        %119 = OpCompositeConstruct %main_out %118
+        %117 = OpFunctionCall %void %tint_symbol_2 %119
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 41[%41] is not post dominated by the back-edge block 60[%60]
+  %60 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/returned-boolean-in-vector/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/returned-boolean-in-vector/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..b1bfcca
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/returned-boolean-in-vector/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,113 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_36 : bool = false;
+  var x_37 : bool;
+  var x_7 : i32;
+  var x_38 : bool;
+  var color : vec3<f32>;
+  var x_40 : bool;
+  var x_43 : vec3<f32>;
+  var x_40_phi : bool;
+  var x_42_phi : vec3<f32>;
+  var x_56_phi : bool;
+  var x_58_phi : bool;
+  x_40_phi = false;
+  x_42_phi = vec3<f32>(0.0, 0.0, 0.0);
+  loop {
+    var x_43_phi : vec3<f32>;
+    x_40 = x_40_phi;
+    let x_42 : vec3<f32> = x_42_phi;
+    let x_47 : f32 = x_5.injectionSwitch.y;
+    x_43_phi = x_42;
+    if ((x_47 < 0.0)) {
+      color = vec3<f32>(1.0, 1.0, 1.0);
+      x_43_phi = vec3<f32>(1.0, 1.0, 1.0);
+    }
+    x_43 = x_43_phi;
+
+    continuing {
+      x_40_phi = x_40;
+      x_42_phi = x_43;
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_36 = false;
+  x_56_phi = x_40;
+  x_58_phi = false;
+  loop {
+    var x_62 : bool;
+    var x_62_phi : bool;
+    var x_64_phi : bool;
+    var x_65_phi : i32;
+    var x_70_phi : bool;
+    var x_71_phi : bool;
+    let x_56 : bool = x_56_phi;
+    let x_58 : bool = x_58_phi;
+    x_7 = 0;
+    x_62_phi = x_56;
+    x_64_phi = false;
+    x_65_phi = 0;
+    loop {
+      x_62 = x_62_phi;
+      let x_64 : bool = x_64_phi;
+      let x_65 : i32 = x_65_phi;
+      let x_68 : bool = (0 < 1);
+      x_70_phi = x_62;
+      x_71_phi = false;
+      if (true) {
+      } else {
+        break;
+      }
+      x_36 = true;
+      x_37 = true;
+      x_70_phi = true;
+      x_71_phi = true;
+      break;
+
+      continuing {
+        x_62_phi = false;
+        x_64_phi = false;
+        x_65_phi = 0;
+      }
+    }
+    let x_70 : bool = x_70_phi;
+    let x_71 : bool = x_71_phi;
+    if (true) {
+      break;
+    }
+    x_36 = true;
+    break;
+
+    continuing {
+      x_56_phi = false;
+      x_58_phi = false;
+    }
+  }
+  x_38 = true;
+  let x_73 : f32 = select(0.0, 1.0, true);
+  x_GLF_color = (vec4<f32>(x_43.x, x_43.y, x_43.z, 1.0) + vec4<f32>(x_73, x_73, x_73, x_73));
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/set-color-in-one-iteration-while-loop/0.spvasm b/test/vk-gl-cts/graphicsfuzz/set-color-in-one-iteration-while-loop/0.spvasm
new file mode 100644
index 0000000..f1e613f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/set-color-in-one-iteration-while-loop/0.spvasm
@@ -0,0 +1,119 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %18 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+      %int_0 = OpConstant %int 0
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+      %false = OpConstantFalse %bool
+       %true = OpConstantTrue %bool
+       %main = OpFunction %void None %8
+         %29 = OpLabel
+               OpBranch %30
+         %30 = OpLabel
+         %31 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %32 = OpLoad %float %31
+         %33 = OpExtInst %float %1 FClamp %32 %float_0 %float_1
+         %34 = OpConvertFToS %int %33
+               OpStore %_GLF_color %18
+               OpLoopMerge %35 %36 None
+               OpBranch %37
+         %37 = OpLabel
+         %38 = OpPhi %bool %false %30 %39 %40
+         %41 = OpPhi %v4float %18 %30 %42 %40
+               OpLoopMerge %43 %40 None
+               OpBranch %44
+         %44 = OpLabel
+         %42 = OpPhi %v4float %41 %37 %45 %46
+         %47 = OpPhi %int %int_0 %37 %48 %46
+         %49 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %50 = OpLoad %float %49
+         %51 = OpConvertFToS %int %50
+         %52 = OpIAdd %int %34 %51
+         %53 = OpSLessThan %bool %47 %52
+               OpLoopMerge %54 %46 None
+               OpBranchConditional %53 %55 %54
+         %55 = OpLabel
+         %56 = OpSLessThan %bool %34 %int_0
+               OpSelectionMerge %57 None
+               OpBranchConditional %56 %58 %59
+         %58 = OpLabel
+               OpBranch %54
+         %59 = OpLabel
+         %60 = OpIEqual %bool %34 %int_1
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %63
+         %62 = OpLabel
+         %64 = OpConvertSToF %float %34
+         %65 = OpCompositeConstruct %v2float %64 %64
+         %66 = OpVectorShuffle %v4float %42 %65 4 1 2 5
+               OpBranch %61
+         %63 = OpLabel
+         %67 = OpIAdd %int %34 %int_1
+         %68 = OpConvertSToF %float %67
+         %69 = OpCompositeConstruct %v2float %68 %68
+         %70 = OpVectorShuffle %v4float %42 %69 4 1 2 5
+               OpBranch %61
+         %61 = OpLabel
+         %45 = OpPhi %v4float %66 %62 %70 %63
+               OpBranch %57
+         %57 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+         %48 = OpIAdd %int %47 %int_1
+               OpBranch %44
+         %54 = OpLabel
+         %39 = OpPhi %bool %38 %44 %true %58
+               OpSelectionMerge %71 None
+               OpBranchConditional %39 %43 %71
+         %71 = OpLabel
+               OpBranch %40
+         %40 = OpLabel
+         %72 = OpSLessThan %bool %34 %int_0
+               OpBranchConditional %72 %37 %43
+         %43 = OpLabel
+               OpSelectionMerge %73 None
+               OpBranchConditional %39 %35 %73
+         %73 = OpLabel
+               OpStore %_GLF_color %42
+               OpBranch %35
+         %36 = OpLabel
+               OpBranch %30
+         %35 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/set-color-in-one-iteration-while-loop/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/set-color-in-one-iteration-while-loop/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..a6f8c4b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/set-color-in-one-iteration-while-loop/0.spvasm.expected.hlsl
@@ -0,0 +1,101 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+
+void main_1() {
+  while (true) {
+    float4 x_42 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    bool x_39 = false;
+    bool x_38_phi = false;
+    float4 x_41_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    const float x_32 = gl_FragCoord.x;
+    const int x_34 = int(clamp(x_32, 0.0f, 1.0f));
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    x_38_phi = false;
+    x_41_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    while (true) {
+      float4 x_42_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+      int x_47_phi = 0;
+      bool x_39_phi = false;
+      const bool x_38 = x_38_phi;
+      x_42_phi = x_41_phi;
+      x_47_phi = 0;
+      while (true) {
+        float4 x_45 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        int x_48 = 0;
+        x_42 = x_42_phi;
+        const int x_47 = x_47_phi;
+        const float x_50 = asfloat(x_6[0].y);
+        x_39_phi = x_38;
+        if ((x_47 < (x_34 + int(x_50)))) {
+        } else {
+          break;
+        }
+        float4 x_66 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        float4 x_70 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        float4 x_45_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        if ((x_34 < 0)) {
+          x_39_phi = true;
+          break;
+        } else {
+          if ((x_34 == 1)) {
+            const float x_64 = float(x_34);
+            const float2 x_65 = float2(x_64, x_64);
+            x_66 = float4(x_65.x, x_42.y, x_42.z, x_65.y);
+            x_45_phi = x_66;
+          } else {
+            const float x_68 = float((x_34 + 1));
+            const float2 x_69 = float2(x_68, x_68);
+            x_70 = float4(x_69.x, x_42.y, x_42.z, x_69.y);
+            x_45_phi = x_70;
+          }
+          x_45 = x_45_phi;
+        }
+        {
+          x_48 = (x_47 + 1);
+          x_42_phi = x_45;
+          x_47_phi = x_48;
+        }
+      }
+      x_39 = x_39_phi;
+      if (x_39) {
+        break;
+      }
+      {
+        x_38_phi = x_39;
+        x_41_phi = x_42;
+        if ((x_34 < 0)) {
+        } else {
+          break;
+        }
+      }
+    }
+    if (x_39) {
+      break;
+    }
+    x_GLF_color = x_42;
+    break;
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/set-color-in-one-iteration-while-loop/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/set-color-in-one-iteration-while-loop/0.spvasm.expected.msl
new file mode 100644
index 0000000..9694480
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/set-color-in-one-iteration-while-loop/0.spvasm.expected.msl
@@ -0,0 +1,101 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  while (true) {
+    float4 x_42 = 0.0f;
+    bool x_39 = false;
+    bool x_38_phi = false;
+    float4 x_41_phi = 0.0f;
+    float const x_32 = (*(tint_symbol_5)).x;
+    int const x_34 = int(clamp(x_32, 0.0f, 1.0f));
+    *(tint_symbol_6) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    x_38_phi = false;
+    x_41_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    while (true) {
+      float4 x_42_phi = 0.0f;
+      int x_47_phi = 0;
+      bool x_39_phi = false;
+      bool const x_38 = x_38_phi;
+      float4 const x_41 = x_41_phi;
+      x_42_phi = x_41;
+      x_47_phi = 0;
+      while (true) {
+        float4 x_45 = 0.0f;
+        int x_48 = 0;
+        x_42 = x_42_phi;
+        int const x_47 = x_47_phi;
+        float const x_50 = x_6.injectionSwitch.y;
+        x_39_phi = x_38;
+        if ((x_47 < (x_34 + int(x_50)))) {
+        } else {
+          break;
+        }
+        float4 x_66 = 0.0f;
+        float4 x_70 = 0.0f;
+        float4 x_45_phi = 0.0f;
+        if ((x_34 < 0)) {
+          x_39_phi = true;
+          break;
+        } else {
+          if ((x_34 == 1)) {
+            float const x_64 = float(x_34);
+            float2 const x_65 = float2(x_64, x_64);
+            x_66 = float4(x_65.x, x_42.y, x_42.z, x_65.y);
+            x_45_phi = x_66;
+          } else {
+            float const x_68 = float((x_34 + 1));
+            float2 const x_69 = float2(x_68, x_68);
+            x_70 = float4(x_69.x, x_42.y, x_42.z, x_69.y);
+            x_45_phi = x_70;
+          }
+          x_45 = x_45_phi;
+        }
+        {
+          x_48 = (x_47 + 1);
+          x_42_phi = x_45;
+          x_47_phi = x_48;
+        }
+      }
+      x_39 = x_39_phi;
+      if (x_39) {
+        break;
+      }
+      {
+        x_38_phi = x_39;
+        x_41_phi = x_42;
+        if ((x_34 < 0)) {
+        } else {
+          break;
+        }
+      }
+    }
+    if (x_39) {
+      break;
+    }
+    *(tint_symbol_6) = x_42;
+    break;
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/set-color-in-one-iteration-while-loop/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/set-color-in-one-iteration-while-loop/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..ef40c26
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/set-color-in-one-iteration-while-loop/0.spvasm.expected.spvasm
@@ -0,0 +1,252 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 141
+; Schema: 0
+               OpCapability Shader
+         %39 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %x_42 "x_42"
+               OpName %x_39 "x_39"
+               OpName %x_38_phi "x_38_phi"
+               OpName %x_41_phi "x_41_phi"
+               OpName %x_42_phi "x_42_phi"
+               OpName %x_47_phi "x_47_phi"
+               OpName %x_39_phi "x_39_phi"
+               OpName %x_45 "x_45"
+               OpName %x_48 "x_48"
+               OpName %x_66 "x_66"
+               OpName %x_70 "x_70"
+               OpName %x_45_phi "x_45_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %28 = OpConstantNull %bool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+        %int = OpTypeInt 32 1
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %42 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+      %false = OpConstantFalse %bool
+%_ptr_Function_int = OpTypePointer Function %int
+         %51 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %true = OpConstantTrue %bool
+      %int_1 = OpConstant %int 1
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_2 = OpConstant %uint 2
+   %main_out = OpTypeStruct %v4float
+        %128 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+       %x_42 = OpVariable %_ptr_Function_v4float Function %5
+       %x_39 = OpVariable %_ptr_Function_bool Function %28
+   %x_38_phi = OpVariable %_ptr_Function_bool Function %28
+   %x_41_phi = OpVariable %_ptr_Function_v4float Function %5
+   %x_42_phi = OpVariable %_ptr_Function_v4float Function %5
+   %x_47_phi = OpVariable %_ptr_Function_int Function %51
+   %x_39_phi = OpVariable %_ptr_Function_bool Function %28
+       %x_45 = OpVariable %_ptr_Function_v4float Function %5
+       %x_48 = OpVariable %_ptr_Function_int Function %51
+       %x_66 = OpVariable %_ptr_Function_v4float Function %5
+       %x_70 = OpVariable %_ptr_Function_v4float Function %5
+   %x_45_phi = OpVariable %_ptr_Function_v4float Function %5
+               OpBranch %19
+         %19 = OpLabel
+               OpLoopMerge %20 %21 None
+               OpBranch %22
+         %22 = OpLabel
+         %34 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %35 = OpLoad %float %34
+         %38 = OpExtInst %float %39 NClamp %35 %float_0 %float_1
+         %36 = OpConvertFToS %int %38
+               OpStore %x_GLF_color %42
+               OpStore %x_38_phi %false
+               OpStore %x_41_phi %42
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %53 = OpLoad %bool %x_38_phi
+         %54 = OpLoad %v4float %x_41_phi
+               OpStore %x_42_phi %54
+               OpStore %x_47_phi %int_0
+               OpBranch %56
+         %56 = OpLabel
+               OpLoopMerge %57 %58 None
+               OpBranch %59
+         %59 = OpLabel
+         %62 = OpLoad %v4float %x_42_phi
+               OpStore %x_42 %62
+         %63 = OpLoad %int %x_47_phi
+         %66 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %67 = OpLoad %float %66
+               OpStore %x_39_phi %53
+         %68 = OpConvertFToS %int %67
+         %69 = OpIAdd %int %36 %68
+         %70 = OpSLessThan %bool %63 %69
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %73
+         %72 = OpLabel
+               OpBranch %71
+         %73 = OpLabel
+               OpBranch %57
+         %71 = OpLabel
+         %77 = OpSLessThan %bool %36 %int_0
+               OpSelectionMerge %78 None
+               OpBranchConditional %77 %79 %80
+         %79 = OpLabel
+               OpStore %x_39_phi %true
+               OpBranch %57
+         %80 = OpLabel
+         %83 = OpIEqual %bool %36 %int_1
+               OpSelectionMerge %84 None
+               OpBranchConditional %83 %85 %86
+         %85 = OpLabel
+         %87 = OpConvertSToF %float %36
+         %88 = OpCompositeConstruct %v2float %87 %87
+         %89 = OpCompositeExtract %float %88 0
+         %91 = OpAccessChain %_ptr_Function_float %x_42 %uint_1
+         %92 = OpLoad %float %91
+         %94 = OpAccessChain %_ptr_Function_float %x_42 %uint_2
+         %95 = OpLoad %float %94
+         %96 = OpCompositeExtract %float %88 1
+         %97 = OpCompositeConstruct %v4float %89 %92 %95 %96
+               OpStore %x_66 %97
+         %98 = OpLoad %v4float %x_66
+               OpStore %x_45_phi %98
+               OpBranch %84
+         %86 = OpLabel
+        %100 = OpIAdd %int %36 %int_1
+         %99 = OpConvertSToF %float %100
+        %101 = OpCompositeConstruct %v2float %99 %99
+        %102 = OpCompositeExtract %float %101 0
+        %103 = OpAccessChain %_ptr_Function_float %x_42 %uint_1
+        %104 = OpLoad %float %103
+        %105 = OpAccessChain %_ptr_Function_float %x_42 %uint_2
+        %106 = OpLoad %float %105
+        %107 = OpCompositeExtract %float %101 1
+        %108 = OpCompositeConstruct %v4float %102 %104 %106 %107
+               OpStore %x_70 %108
+        %109 = OpLoad %v4float %x_70
+               OpStore %x_45_phi %109
+               OpBranch %84
+         %84 = OpLabel
+        %110 = OpLoad %v4float %x_45_phi
+               OpStore %x_45 %110
+               OpBranch %78
+         %78 = OpLabel
+               OpBranch %58
+         %58 = OpLabel
+        %111 = OpIAdd %int %63 %int_1
+               OpStore %x_48 %111
+        %112 = OpLoad %v4float %x_45
+               OpStore %x_42_phi %112
+        %113 = OpLoad %int %x_48
+               OpStore %x_47_phi %113
+               OpBranch %56
+         %57 = OpLabel
+        %114 = OpLoad %bool %x_39_phi
+               OpStore %x_39 %114
+        %115 = OpLoad %bool %x_39
+               OpSelectionMerge %116 None
+               OpBranchConditional %115 %117 %116
+        %117 = OpLabel
+               OpBranch %45
+        %116 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+        %118 = OpLoad %bool %x_39
+               OpStore %x_38_phi %118
+        %119 = OpLoad %v4float %x_42
+               OpStore %x_41_phi %119
+        %120 = OpSLessThan %bool %36 %int_0
+               OpSelectionMerge %121 None
+               OpBranchConditional %120 %122 %123
+        %122 = OpLabel
+               OpBranch %121
+        %123 = OpLabel
+               OpBranch %45
+        %121 = OpLabel
+               OpBranch %44
+         %45 = OpLabel
+        %124 = OpLoad %bool %x_39
+               OpSelectionMerge %125 None
+               OpBranchConditional %124 %126 %125
+        %126 = OpLabel
+               OpBranch %20
+        %125 = OpLabel
+        %127 = OpLoad %v4float %x_42
+               OpStore %x_GLF_color %127
+               OpBranch %20
+         %21 = OpLabel
+               OpBranch %19
+         %20 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %128
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %132 = OpLabel
+        %133 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %133
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %135 = OpLabel
+        %136 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %136
+        %137 = OpFunctionCall %void %main_1
+        %139 = OpLoad %v4float %x_GLF_color
+        %140 = OpCompositeConstruct %main_out %139
+        %138 = OpFunctionCall %void %tint_symbol_3 %140
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 46[%46] is not post dominated by the back-edge block 121[%121]
+  %121 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/set-color-in-one-iteration-while-loop/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/set-color-in-one-iteration-while-loop/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..ee729d9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/set-color-in-one-iteration-while-loop/0.spvasm.expected.wgsl
@@ -0,0 +1,102 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+fn main_1() {
+  loop {
+    var x_42 : vec4<f32>;
+    var x_39 : bool;
+    var x_38_phi : bool;
+    var x_41_phi : vec4<f32>;
+    let x_32 : f32 = gl_FragCoord.x;
+    let x_34 : i32 = i32(clamp(x_32, 0.0, 1.0));
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+    x_38_phi = false;
+    x_41_phi = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+    loop {
+      var x_42_phi : vec4<f32>;
+      var x_47_phi : i32;
+      var x_39_phi : bool;
+      let x_38 : bool = x_38_phi;
+      let x_41 : vec4<f32> = x_41_phi;
+      x_42_phi = x_41;
+      x_47_phi = 0;
+      loop {
+        var x_45 : vec4<f32>;
+        var x_48 : i32;
+        x_42 = x_42_phi;
+        let x_47 : i32 = x_47_phi;
+        let x_50 : f32 = x_6.injectionSwitch.y;
+        x_39_phi = x_38;
+        if ((x_47 < (x_34 + i32(x_50)))) {
+        } else {
+          break;
+        }
+        var x_66 : vec4<f32>;
+        var x_70 : vec4<f32>;
+        var x_45_phi : vec4<f32>;
+        if ((x_34 < 0)) {
+          x_39_phi = true;
+          break;
+        } else {
+          if ((x_34 == 1)) {
+            let x_64 : f32 = f32(x_34);
+            let x_65 : vec2<f32> = vec2<f32>(x_64, x_64);
+            x_66 = vec4<f32>(x_65.x, x_42.y, x_42.z, x_65.y);
+            x_45_phi = x_66;
+          } else {
+            let x_68 : f32 = f32((x_34 + 1));
+            let x_69 : vec2<f32> = vec2<f32>(x_68, x_68);
+            x_70 = vec4<f32>(x_69.x, x_42.y, x_42.z, x_69.y);
+            x_45_phi = x_70;
+          }
+          x_45 = x_45_phi;
+        }
+
+        continuing {
+          x_48 = (x_47 + 1);
+          x_42_phi = x_45;
+          x_47_phi = x_48;
+        }
+      }
+      x_39 = x_39_phi;
+      if (x_39) {
+        break;
+      }
+
+      continuing {
+        x_38_phi = x_39;
+        x_41_phi = x_42;
+        if ((x_34 < 0)) {
+        } else {
+          break;
+        }
+      }
+    }
+    if (x_39) {
+      break;
+    }
+    x_GLF_color = x_42;
+    break;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/set-color-in-one-iteration-while-loop/0.wgsl b/test/vk-gl-cts/graphicsfuzz/set-color-in-one-iteration-while-loop/0.wgsl
new file mode 100644
index 0000000..ee729d9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/set-color-in-one-iteration-while-loop/0.wgsl
@@ -0,0 +1,102 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+fn main_1() {
+  loop {
+    var x_42 : vec4<f32>;
+    var x_39 : bool;
+    var x_38_phi : bool;
+    var x_41_phi : vec4<f32>;
+    let x_32 : f32 = gl_FragCoord.x;
+    let x_34 : i32 = i32(clamp(x_32, 0.0, 1.0));
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+    x_38_phi = false;
+    x_41_phi = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+    loop {
+      var x_42_phi : vec4<f32>;
+      var x_47_phi : i32;
+      var x_39_phi : bool;
+      let x_38 : bool = x_38_phi;
+      let x_41 : vec4<f32> = x_41_phi;
+      x_42_phi = x_41;
+      x_47_phi = 0;
+      loop {
+        var x_45 : vec4<f32>;
+        var x_48 : i32;
+        x_42 = x_42_phi;
+        let x_47 : i32 = x_47_phi;
+        let x_50 : f32 = x_6.injectionSwitch.y;
+        x_39_phi = x_38;
+        if ((x_47 < (x_34 + i32(x_50)))) {
+        } else {
+          break;
+        }
+        var x_66 : vec4<f32>;
+        var x_70 : vec4<f32>;
+        var x_45_phi : vec4<f32>;
+        if ((x_34 < 0)) {
+          x_39_phi = true;
+          break;
+        } else {
+          if ((x_34 == 1)) {
+            let x_64 : f32 = f32(x_34);
+            let x_65 : vec2<f32> = vec2<f32>(x_64, x_64);
+            x_66 = vec4<f32>(x_65.x, x_42.y, x_42.z, x_65.y);
+            x_45_phi = x_66;
+          } else {
+            let x_68 : f32 = f32((x_34 + 1));
+            let x_69 : vec2<f32> = vec2<f32>(x_68, x_68);
+            x_70 = vec4<f32>(x_69.x, x_42.y, x_42.z, x_69.y);
+            x_45_phi = x_70;
+          }
+          x_45 = x_45_phi;
+        }
+
+        continuing {
+          x_48 = (x_47 + 1);
+          x_42_phi = x_45;
+          x_47_phi = x_48;
+        }
+      }
+      x_39 = x_39_phi;
+      if (x_39) {
+        break;
+      }
+
+      continuing {
+        x_38_phi = x_39;
+        x_41_phi = x_42;
+        if ((x_34 < 0)) {
+        } else {
+          break;
+        }
+      }
+    }
+    if (x_39) {
+      break;
+    }
+    x_GLF_color = x_42;
+    break;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/set-color-in-one-iteration-while-loop/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/set-color-in-one-iteration-while-loop/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..a6f8c4b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/set-color-in-one-iteration-while-loop/0.wgsl.expected.hlsl
@@ -0,0 +1,101 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+
+void main_1() {
+  while (true) {
+    float4 x_42 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    bool x_39 = false;
+    bool x_38_phi = false;
+    float4 x_41_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    const float x_32 = gl_FragCoord.x;
+    const int x_34 = int(clamp(x_32, 0.0f, 1.0f));
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    x_38_phi = false;
+    x_41_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    while (true) {
+      float4 x_42_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+      int x_47_phi = 0;
+      bool x_39_phi = false;
+      const bool x_38 = x_38_phi;
+      x_42_phi = x_41_phi;
+      x_47_phi = 0;
+      while (true) {
+        float4 x_45 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        int x_48 = 0;
+        x_42 = x_42_phi;
+        const int x_47 = x_47_phi;
+        const float x_50 = asfloat(x_6[0].y);
+        x_39_phi = x_38;
+        if ((x_47 < (x_34 + int(x_50)))) {
+        } else {
+          break;
+        }
+        float4 x_66 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        float4 x_70 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        float4 x_45_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        if ((x_34 < 0)) {
+          x_39_phi = true;
+          break;
+        } else {
+          if ((x_34 == 1)) {
+            const float x_64 = float(x_34);
+            const float2 x_65 = float2(x_64, x_64);
+            x_66 = float4(x_65.x, x_42.y, x_42.z, x_65.y);
+            x_45_phi = x_66;
+          } else {
+            const float x_68 = float((x_34 + 1));
+            const float2 x_69 = float2(x_68, x_68);
+            x_70 = float4(x_69.x, x_42.y, x_42.z, x_69.y);
+            x_45_phi = x_70;
+          }
+          x_45 = x_45_phi;
+        }
+        {
+          x_48 = (x_47 + 1);
+          x_42_phi = x_45;
+          x_47_phi = x_48;
+        }
+      }
+      x_39 = x_39_phi;
+      if (x_39) {
+        break;
+      }
+      {
+        x_38_phi = x_39;
+        x_41_phi = x_42;
+        if ((x_34 < 0)) {
+        } else {
+          break;
+        }
+      }
+    }
+    if (x_39) {
+      break;
+    }
+    x_GLF_color = x_42;
+    break;
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/set-color-in-one-iteration-while-loop/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/set-color-in-one-iteration-while-loop/0.wgsl.expected.msl
new file mode 100644
index 0000000..9694480
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/set-color-in-one-iteration-while-loop/0.wgsl.expected.msl
@@ -0,0 +1,101 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  while (true) {
+    float4 x_42 = 0.0f;
+    bool x_39 = false;
+    bool x_38_phi = false;
+    float4 x_41_phi = 0.0f;
+    float const x_32 = (*(tint_symbol_5)).x;
+    int const x_34 = int(clamp(x_32, 0.0f, 1.0f));
+    *(tint_symbol_6) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    x_38_phi = false;
+    x_41_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    while (true) {
+      float4 x_42_phi = 0.0f;
+      int x_47_phi = 0;
+      bool x_39_phi = false;
+      bool const x_38 = x_38_phi;
+      float4 const x_41 = x_41_phi;
+      x_42_phi = x_41;
+      x_47_phi = 0;
+      while (true) {
+        float4 x_45 = 0.0f;
+        int x_48 = 0;
+        x_42 = x_42_phi;
+        int const x_47 = x_47_phi;
+        float const x_50 = x_6.injectionSwitch.y;
+        x_39_phi = x_38;
+        if ((x_47 < (x_34 + int(x_50)))) {
+        } else {
+          break;
+        }
+        float4 x_66 = 0.0f;
+        float4 x_70 = 0.0f;
+        float4 x_45_phi = 0.0f;
+        if ((x_34 < 0)) {
+          x_39_phi = true;
+          break;
+        } else {
+          if ((x_34 == 1)) {
+            float const x_64 = float(x_34);
+            float2 const x_65 = float2(x_64, x_64);
+            x_66 = float4(x_65.x, x_42.y, x_42.z, x_65.y);
+            x_45_phi = x_66;
+          } else {
+            float const x_68 = float((x_34 + 1));
+            float2 const x_69 = float2(x_68, x_68);
+            x_70 = float4(x_69.x, x_42.y, x_42.z, x_69.y);
+            x_45_phi = x_70;
+          }
+          x_45 = x_45_phi;
+        }
+        {
+          x_48 = (x_47 + 1);
+          x_42_phi = x_45;
+          x_47_phi = x_48;
+        }
+      }
+      x_39 = x_39_phi;
+      if (x_39) {
+        break;
+      }
+      {
+        x_38_phi = x_39;
+        x_41_phi = x_42;
+        if ((x_34 < 0)) {
+        } else {
+          break;
+        }
+      }
+    }
+    if (x_39) {
+      break;
+    }
+    *(tint_symbol_6) = x_42;
+    break;
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/set-color-in-one-iteration-while-loop/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/set-color-in-one-iteration-while-loop/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..ef40c26
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/set-color-in-one-iteration-while-loop/0.wgsl.expected.spvasm
@@ -0,0 +1,252 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 141
+; Schema: 0
+               OpCapability Shader
+         %39 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %x_42 "x_42"
+               OpName %x_39 "x_39"
+               OpName %x_38_phi "x_38_phi"
+               OpName %x_41_phi "x_41_phi"
+               OpName %x_42_phi "x_42_phi"
+               OpName %x_47_phi "x_47_phi"
+               OpName %x_39_phi "x_39_phi"
+               OpName %x_45 "x_45"
+               OpName %x_48 "x_48"
+               OpName %x_66 "x_66"
+               OpName %x_70 "x_70"
+               OpName %x_45_phi "x_45_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %28 = OpConstantNull %bool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+        %int = OpTypeInt 32 1
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %42 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+      %false = OpConstantFalse %bool
+%_ptr_Function_int = OpTypePointer Function %int
+         %51 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %true = OpConstantTrue %bool
+      %int_1 = OpConstant %int 1
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_2 = OpConstant %uint 2
+   %main_out = OpTypeStruct %v4float
+        %128 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+       %x_42 = OpVariable %_ptr_Function_v4float Function %5
+       %x_39 = OpVariable %_ptr_Function_bool Function %28
+   %x_38_phi = OpVariable %_ptr_Function_bool Function %28
+   %x_41_phi = OpVariable %_ptr_Function_v4float Function %5
+   %x_42_phi = OpVariable %_ptr_Function_v4float Function %5
+   %x_47_phi = OpVariable %_ptr_Function_int Function %51
+   %x_39_phi = OpVariable %_ptr_Function_bool Function %28
+       %x_45 = OpVariable %_ptr_Function_v4float Function %5
+       %x_48 = OpVariable %_ptr_Function_int Function %51
+       %x_66 = OpVariable %_ptr_Function_v4float Function %5
+       %x_70 = OpVariable %_ptr_Function_v4float Function %5
+   %x_45_phi = OpVariable %_ptr_Function_v4float Function %5
+               OpBranch %19
+         %19 = OpLabel
+               OpLoopMerge %20 %21 None
+               OpBranch %22
+         %22 = OpLabel
+         %34 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %35 = OpLoad %float %34
+         %38 = OpExtInst %float %39 NClamp %35 %float_0 %float_1
+         %36 = OpConvertFToS %int %38
+               OpStore %x_GLF_color %42
+               OpStore %x_38_phi %false
+               OpStore %x_41_phi %42
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %53 = OpLoad %bool %x_38_phi
+         %54 = OpLoad %v4float %x_41_phi
+               OpStore %x_42_phi %54
+               OpStore %x_47_phi %int_0
+               OpBranch %56
+         %56 = OpLabel
+               OpLoopMerge %57 %58 None
+               OpBranch %59
+         %59 = OpLabel
+         %62 = OpLoad %v4float %x_42_phi
+               OpStore %x_42 %62
+         %63 = OpLoad %int %x_47_phi
+         %66 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %67 = OpLoad %float %66
+               OpStore %x_39_phi %53
+         %68 = OpConvertFToS %int %67
+         %69 = OpIAdd %int %36 %68
+         %70 = OpSLessThan %bool %63 %69
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %73
+         %72 = OpLabel
+               OpBranch %71
+         %73 = OpLabel
+               OpBranch %57
+         %71 = OpLabel
+         %77 = OpSLessThan %bool %36 %int_0
+               OpSelectionMerge %78 None
+               OpBranchConditional %77 %79 %80
+         %79 = OpLabel
+               OpStore %x_39_phi %true
+               OpBranch %57
+         %80 = OpLabel
+         %83 = OpIEqual %bool %36 %int_1
+               OpSelectionMerge %84 None
+               OpBranchConditional %83 %85 %86
+         %85 = OpLabel
+         %87 = OpConvertSToF %float %36
+         %88 = OpCompositeConstruct %v2float %87 %87
+         %89 = OpCompositeExtract %float %88 0
+         %91 = OpAccessChain %_ptr_Function_float %x_42 %uint_1
+         %92 = OpLoad %float %91
+         %94 = OpAccessChain %_ptr_Function_float %x_42 %uint_2
+         %95 = OpLoad %float %94
+         %96 = OpCompositeExtract %float %88 1
+         %97 = OpCompositeConstruct %v4float %89 %92 %95 %96
+               OpStore %x_66 %97
+         %98 = OpLoad %v4float %x_66
+               OpStore %x_45_phi %98
+               OpBranch %84
+         %86 = OpLabel
+        %100 = OpIAdd %int %36 %int_1
+         %99 = OpConvertSToF %float %100
+        %101 = OpCompositeConstruct %v2float %99 %99
+        %102 = OpCompositeExtract %float %101 0
+        %103 = OpAccessChain %_ptr_Function_float %x_42 %uint_1
+        %104 = OpLoad %float %103
+        %105 = OpAccessChain %_ptr_Function_float %x_42 %uint_2
+        %106 = OpLoad %float %105
+        %107 = OpCompositeExtract %float %101 1
+        %108 = OpCompositeConstruct %v4float %102 %104 %106 %107
+               OpStore %x_70 %108
+        %109 = OpLoad %v4float %x_70
+               OpStore %x_45_phi %109
+               OpBranch %84
+         %84 = OpLabel
+        %110 = OpLoad %v4float %x_45_phi
+               OpStore %x_45 %110
+               OpBranch %78
+         %78 = OpLabel
+               OpBranch %58
+         %58 = OpLabel
+        %111 = OpIAdd %int %63 %int_1
+               OpStore %x_48 %111
+        %112 = OpLoad %v4float %x_45
+               OpStore %x_42_phi %112
+        %113 = OpLoad %int %x_48
+               OpStore %x_47_phi %113
+               OpBranch %56
+         %57 = OpLabel
+        %114 = OpLoad %bool %x_39_phi
+               OpStore %x_39 %114
+        %115 = OpLoad %bool %x_39
+               OpSelectionMerge %116 None
+               OpBranchConditional %115 %117 %116
+        %117 = OpLabel
+               OpBranch %45
+        %116 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+        %118 = OpLoad %bool %x_39
+               OpStore %x_38_phi %118
+        %119 = OpLoad %v4float %x_42
+               OpStore %x_41_phi %119
+        %120 = OpSLessThan %bool %36 %int_0
+               OpSelectionMerge %121 None
+               OpBranchConditional %120 %122 %123
+        %122 = OpLabel
+               OpBranch %121
+        %123 = OpLabel
+               OpBranch %45
+        %121 = OpLabel
+               OpBranch %44
+         %45 = OpLabel
+        %124 = OpLoad %bool %x_39
+               OpSelectionMerge %125 None
+               OpBranchConditional %124 %126 %125
+        %126 = OpLabel
+               OpBranch %20
+        %125 = OpLabel
+        %127 = OpLoad %v4float %x_42
+               OpStore %x_GLF_color %127
+               OpBranch %20
+         %21 = OpLabel
+               OpBranch %19
+         %20 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %128
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %132 = OpLabel
+        %133 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %133
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %135 = OpLabel
+        %136 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %136
+        %137 = OpFunctionCall %void %main_1
+        %139 = OpLoad %v4float %x_GLF_color
+        %140 = OpCompositeConstruct %main_out %139
+        %138 = OpFunctionCall %void %tint_symbol_3 %140
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 46[%46] is not post dominated by the back-edge block 121[%121]
+  %121 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/set-color-in-one-iteration-while-loop/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/set-color-in-one-iteration-while-loop/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..ee729d9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/set-color-in-one-iteration-while-loop/0.wgsl.expected.wgsl
@@ -0,0 +1,102 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+fn main_1() {
+  loop {
+    var x_42 : vec4<f32>;
+    var x_39 : bool;
+    var x_38_phi : bool;
+    var x_41_phi : vec4<f32>;
+    let x_32 : f32 = gl_FragCoord.x;
+    let x_34 : i32 = i32(clamp(x_32, 0.0, 1.0));
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+    x_38_phi = false;
+    x_41_phi = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+    loop {
+      var x_42_phi : vec4<f32>;
+      var x_47_phi : i32;
+      var x_39_phi : bool;
+      let x_38 : bool = x_38_phi;
+      let x_41 : vec4<f32> = x_41_phi;
+      x_42_phi = x_41;
+      x_47_phi = 0;
+      loop {
+        var x_45 : vec4<f32>;
+        var x_48 : i32;
+        x_42 = x_42_phi;
+        let x_47 : i32 = x_47_phi;
+        let x_50 : f32 = x_6.injectionSwitch.y;
+        x_39_phi = x_38;
+        if ((x_47 < (x_34 + i32(x_50)))) {
+        } else {
+          break;
+        }
+        var x_66 : vec4<f32>;
+        var x_70 : vec4<f32>;
+        var x_45_phi : vec4<f32>;
+        if ((x_34 < 0)) {
+          x_39_phi = true;
+          break;
+        } else {
+          if ((x_34 == 1)) {
+            let x_64 : f32 = f32(x_34);
+            let x_65 : vec2<f32> = vec2<f32>(x_64, x_64);
+            x_66 = vec4<f32>(x_65.x, x_42.y, x_42.z, x_65.y);
+            x_45_phi = x_66;
+          } else {
+            let x_68 : f32 = f32((x_34 + 1));
+            let x_69 : vec2<f32> = vec2<f32>(x_68, x_68);
+            x_70 = vec4<f32>(x_69.x, x_42.y, x_42.z, x_69.y);
+            x_45_phi = x_70;
+          }
+          x_45 = x_45_phi;
+        }
+
+        continuing {
+          x_48 = (x_47 + 1);
+          x_42_phi = x_45;
+          x_47_phi = x_48;
+        }
+      }
+      x_39 = x_39_phi;
+      if (x_39) {
+        break;
+      }
+
+      continuing {
+        x_38_phi = x_39;
+        x_41_phi = x_42;
+        if ((x_34 < 0)) {
+        } else {
+          break;
+        }
+      }
+    }
+    if (x_39) {
+      break;
+    }
+    x_GLF_color = x_42;
+    break;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/similar-nested-ifs/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/similar-nested-ifs/0-opt.spvasm
new file mode 100644
index 0000000..2e26a63
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/similar-nested-ifs/0-opt.spvasm
@@ -0,0 +1,152 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %lv "lv"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %gv "gv"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %GLF_live5r "GLF_live5r"
+               OpName %GLF_live5_looplimiter6 "GLF_live5_looplimiter6"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %GLF_live5r RelaxedPrecision
+               OpDecorate %GLF_live5_looplimiter6 RelaxedPrecision
+               OpDecorate %11 RelaxedPrecision
+               OpDecorate %12 RelaxedPrecision
+               OpDecorate %13 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_1 = OpConstant %float 1
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+%_ptr_Private_float = OpTypePointer Private %float
+         %gv = OpVariable %_ptr_Private_float Private
+  %float_260 = OpConstant %float 260
+    %int_250 = OpConstant %int 250
+    %int_180 = OpConstant %int 180
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_0 = OpConstant %float 0
+    %int_210 = OpConstant %int 210
+       %true = OpConstantTrue %bool
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_6 = OpConstant %int 6
+      %int_1 = OpConstant %int 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %41 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %15
+         %42 = OpLabel
+         %lv = OpVariable %_ptr_Function_float Function
+         %43 = OpVariable %_ptr_Function_float Function
+ %GLF_live5r = OpVariable %_ptr_Function_int Function
+%GLF_live5_looplimiter6 = OpVariable %_ptr_Function_int Function
+         %44 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %45 = OpLoad %float %44
+         %46 = OpFOrdGreaterThan %bool %float_1 %45
+               OpSelectionMerge %47 None
+               OpBranchConditional %46 %48 %49
+         %48 = OpLabel
+         %50 = OpLoad %float %gv
+         %51 = OpExtInst %float %1 FAbs %50
+               OpStore %43 %51
+               OpBranch %47
+         %49 = OpLabel
+               OpStore %43 %float_260
+               OpBranch %47
+         %47 = OpLabel
+         %52 = OpLoad %float %43
+               OpStore %lv %52
+         %53 = OpLoad %float %lv
+         %54 = OpConvertFToS %int %53
+         %55 = OpSLessThan %bool %54 %int_250
+               OpSelectionMerge %56 None
+               OpBranchConditional %55 %57 %56
+         %57 = OpLabel
+         %58 = OpLoad %float %lv
+         %59 = OpConvertFToS %int %58
+         %60 = OpSLessThan %bool %59 %int_180
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %63
+         %62 = OpLabel
+         %64 = OpLoad %float %lv
+         %65 = OpExtInst %float %1 FClamp %64 %float_1 %float_1
+               OpBranch %61
+         %63 = OpLabel
+         %66 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %67 = OpLoad %float %66
+         %68 = OpFOrdLessThan %bool %67 %float_0
+               OpSelectionMerge %69 None
+               OpBranchConditional %68 %70 %69
+         %70 = OpLabel
+         %71 = OpLoad %float %lv
+         %72 = OpConvertFToS %int %71
+         %73 = OpSLessThan %bool %72 %int_210
+               OpSelectionMerge %74 None
+               OpBranchConditional %73 %75 %74
+         %75 = OpLabel
+               OpBranch %76
+         %76 = OpLabel
+               OpLoopMerge %77 %78 None
+               OpBranch %79
+         %79 = OpLabel
+               OpBranch %78
+         %78 = OpLabel
+               OpBranchConditional %true %76 %77
+         %77 = OpLabel
+               OpBranch %74
+         %74 = OpLabel
+               OpStore %GLF_live5r %int_0
+               OpBranch %80
+         %80 = OpLabel
+               OpLoopMerge %81 %82 None
+               OpBranch %83
+         %83 = OpLabel
+               OpBranchConditional %true %84 %81
+         %84 = OpLabel
+         %11 = OpLoad %int %GLF_live5_looplimiter6
+         %85 = OpSGreaterThanEqual %bool %11 %int_6
+               OpSelectionMerge %86 None
+               OpBranchConditional %85 %87 %86
+         %87 = OpLabel
+               OpBranch %81
+         %86 = OpLabel
+         %12 = OpLoad %int %GLF_live5_looplimiter6
+         %13 = OpIAdd %int %12 %int_1
+               OpStore %GLF_live5_looplimiter6 %13
+               OpBranch %82
+         %82 = OpLabel
+               OpBranch %80
+         %81 = OpLabel
+               OpBranch %69
+         %69 = OpLabel
+               OpBranch %61
+         %61 = OpLabel
+               OpBranch %56
+         %56 = OpLabel
+               OpStore %_GLF_color %41
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/similar-nested-ifs/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/similar-nested-ifs/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..2b57a30
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/similar-nested-ifs/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,71 @@
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[1];
+};
+static float gv = 0.0f;
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float lv = 0.0f;
+  float x_43 = 0.0f;
+  int GLF_live5r = 0;
+  int GLF_live5_looplimiter6 = 0;
+  const float x_45 = asfloat(x_7[0].y);
+  if ((1.0f > x_45)) {
+    x_43 = abs(gv);
+  } else {
+    x_43 = 260.0f;
+  }
+  lv = x_43;
+  if ((int(lv) < 250)) {
+    if ((int(lv) < 180)) {
+      const float x_65 = clamp(lv, 1.0f, 1.0f);
+    } else {
+      const float x_67 = gl_FragCoord.y;
+      if ((x_67 < 0.0f)) {
+        if ((int(lv) < 210)) {
+          while (true) {
+            {
+              if (true) {
+              } else {
+                break;
+              }
+            }
+          }
+        }
+        GLF_live5r = 0;
+        while (true) {
+          if (true) {
+          } else {
+            break;
+          }
+          if ((GLF_live5_looplimiter6 >= 6)) {
+            break;
+          }
+          GLF_live5_looplimiter6 = (GLF_live5_looplimiter6 + 1);
+        }
+      }
+    }
+  }
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/similar-nested-ifs/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/similar-nested-ifs/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..3bfd32e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/similar-nested-ifs/0-opt.spvasm.expected.msl
@@ -0,0 +1,78 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float* const tint_symbol_5, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  float lv = 0.0f;
+  float x_43 = 0.0f;
+  int GLF_live5r = 0;
+  int GLF_live5_looplimiter6 = 0;
+  float const x_45 = x_7.injectionSwitch.y;
+  if ((1.0f > x_45)) {
+    float const x_50 = *(tint_symbol_5);
+    x_43 = fabs(x_50);
+  } else {
+    x_43 = 260.0f;
+  }
+  float const x_52 = x_43;
+  lv = x_52;
+  float const x_53 = lv;
+  if ((int(x_53) < 250)) {
+    float const x_58 = lv;
+    if ((int(x_58) < 180)) {
+      float const x_64 = lv;
+      float const x_65 = clamp(x_64, 1.0f, 1.0f);
+    } else {
+      float const x_67 = (*(tint_symbol_6)).y;
+      if ((x_67 < 0.0f)) {
+        float const x_71 = lv;
+        if ((int(x_71) < 210)) {
+          while (true) {
+            {
+              if (true) {
+              } else {
+                break;
+              }
+            }
+          }
+        }
+        GLF_live5r = 0;
+        while (true) {
+          if (true) {
+          } else {
+            break;
+          }
+          int const x_11 = GLF_live5_looplimiter6;
+          if ((x_11 >= 6)) {
+            break;
+          }
+          int const x_12 = GLF_live5_looplimiter6;
+          GLF_live5_looplimiter6 = (x_12 + 1);
+        }
+      }
+    }
+  }
+  *(tint_symbol_7) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float tint_symbol_9 = 0.0f;
+  thread float4 tint_symbol_10 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_7, &(tint_symbol_9), &(tint_symbol_8), &(tint_symbol_10));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_10};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/similar-nested-ifs/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/similar-nested-ifs/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..17f5fb7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/similar-nested-ifs/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,203 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 112
+; Schema: 0
+               OpCapability Shader
+         %44 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_7 "x_7"
+               OpName %gv "gv"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %lv "lv"
+               OpName %x_43 "x_43"
+               OpName %GLF_live5r "GLF_live5r"
+               OpName %GLF_live5_looplimiter6 "GLF_live5_looplimiter6"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Private_float = OpTypePointer Private %float
+          %8 = OpConstantNull %float
+         %gv = OpVariable %_ptr_Private_float Private %8
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %12
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %28 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+       %bool = OpTypeBool
+  %float_260 = OpConstant %float 260
+    %int_250 = OpConstant %int 250
+    %int_180 = OpConstant %int 180
+    %float_0 = OpConstant %float 0
+    %int_210 = OpConstant %int 210
+       %true = OpConstantTrue %bool
+      %int_0 = OpConstant %int 0
+      %int_6 = OpConstant %int 6
+      %int_1 = OpConstant %int 1
+         %98 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %99 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %18
+         %21 = OpLabel
+         %lv = OpVariable %_ptr_Function_float Function %8
+       %x_43 = OpVariable %_ptr_Function_float Function %8
+ %GLF_live5r = OpVariable %_ptr_Function_int Function %28
+%GLF_live5_looplimiter6 = OpVariable %_ptr_Function_int Function %28
+         %34 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_1
+         %35 = OpLoad %float %34
+         %37 = OpFOrdGreaterThan %bool %float_1 %35
+               OpSelectionMerge %39 None
+               OpBranchConditional %37 %40 %41
+         %40 = OpLabel
+         %42 = OpLoad %float %gv
+         %43 = OpExtInst %float %44 FAbs %42
+               OpStore %x_43 %43
+               OpBranch %39
+         %41 = OpLabel
+               OpStore %x_43 %float_260
+               OpBranch %39
+         %39 = OpLabel
+         %46 = OpLoad %float %x_43
+               OpStore %lv %46
+         %47 = OpLoad %float %lv
+         %48 = OpConvertFToS %int %47
+         %50 = OpSLessThan %bool %48 %int_250
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %51
+         %52 = OpLabel
+         %53 = OpLoad %float %lv
+         %54 = OpConvertFToS %int %53
+         %56 = OpSLessThan %bool %54 %int_180
+               OpSelectionMerge %57 None
+               OpBranchConditional %56 %58 %59
+         %58 = OpLabel
+         %60 = OpLoad %float %lv
+         %61 = OpExtInst %float %44 NClamp %60 %float_1 %float_1
+               OpBranch %57
+         %59 = OpLabel
+         %62 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %63 = OpLoad %float %62
+         %65 = OpFOrdLessThan %bool %63 %float_0
+               OpSelectionMerge %66 None
+               OpBranchConditional %65 %67 %66
+         %67 = OpLabel
+         %68 = OpLoad %float %lv
+         %69 = OpConvertFToS %int %68
+         %71 = OpSLessThan %bool %69 %int_210
+               OpSelectionMerge %72 None
+               OpBranchConditional %71 %73 %72
+         %73 = OpLabel
+               OpBranch %74
+         %74 = OpLabel
+               OpLoopMerge %75 %76 None
+               OpBranch %77
+         %77 = OpLabel
+               OpBranch %76
+         %76 = OpLabel
+               OpSelectionMerge %79 None
+               OpBranchConditional %true %80 %81
+         %80 = OpLabel
+               OpBranch %79
+         %81 = OpLabel
+               OpBranch %75
+         %79 = OpLabel
+               OpBranch %74
+         %75 = OpLabel
+               OpBranch %72
+         %72 = OpLabel
+               OpStore %GLF_live5r %int_0
+               OpBranch %83
+         %83 = OpLabel
+               OpLoopMerge %84 %85 None
+               OpBranch %86
+         %86 = OpLabel
+               OpSelectionMerge %87 None
+               OpBranchConditional %true %88 %89
+         %88 = OpLabel
+               OpBranch %87
+         %89 = OpLabel
+               OpBranch %84
+         %87 = OpLabel
+         %90 = OpLoad %int %GLF_live5_looplimiter6
+         %92 = OpSGreaterThanEqual %bool %90 %int_6
+               OpSelectionMerge %93 None
+               OpBranchConditional %92 %94 %93
+         %94 = OpLabel
+               OpBranch %84
+         %93 = OpLabel
+         %95 = OpLoad %int %GLF_live5_looplimiter6
+         %97 = OpIAdd %int %95 %int_1
+               OpStore %GLF_live5_looplimiter6 %97
+               OpBranch %85
+         %85 = OpLabel
+               OpBranch %83
+         %84 = OpLabel
+               OpBranch %66
+         %66 = OpLabel
+               OpBranch %57
+         %57 = OpLabel
+               OpBranch %51
+         %51 = OpLabel
+               OpStore %x_GLF_color %98
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %99
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %103 = OpLabel
+        %104 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %104
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %18
+        %106 = OpLabel
+        %107 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %107
+        %108 = OpFunctionCall %void %main_1
+        %110 = OpLoad %v4float %x_GLF_color
+        %111 = OpCompositeConstruct %main_out %110
+        %109 = OpFunctionCall %void %tint_symbol_3 %111
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 76[%76] is not post dominated by the back-edge block 79[%79]
+  %79 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/similar-nested-ifs/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/similar-nested-ifs/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..592be78
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/similar-nested-ifs/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,79 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> gv : f32;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var lv : f32;
+  var x_43 : f32;
+  var GLF_live5r : i32;
+  var GLF_live5_looplimiter6 : i32;
+  let x_45 : f32 = x_7.injectionSwitch.y;
+  if ((1.0 > x_45)) {
+    let x_50 : f32 = gv;
+    x_43 = abs(x_50);
+  } else {
+    x_43 = 260.0;
+  }
+  let x_52 : f32 = x_43;
+  lv = x_52;
+  let x_53 : f32 = lv;
+  if ((i32(x_53) < 250)) {
+    let x_58 : f32 = lv;
+    if ((i32(x_58) < 180)) {
+      let x_64 : f32 = lv;
+      let x_65 : f32 = clamp(x_64, 1.0, 1.0);
+    } else {
+      let x_67 : f32 = gl_FragCoord.y;
+      if ((x_67 < 0.0)) {
+        let x_71 : f32 = lv;
+        if ((i32(x_71) < 210)) {
+          loop {
+
+            continuing {
+              if (true) {
+              } else {
+                break;
+              }
+            }
+          }
+        }
+        GLF_live5r = 0;
+        loop {
+          if (true) {
+          } else {
+            break;
+          }
+          let x_11 : i32 = GLF_live5_looplimiter6;
+          if ((x_11 >= 6)) {
+            break;
+          }
+          let x_12 : i32 = GLF_live5_looplimiter6;
+          GLF_live5_looplimiter6 = (x_12 + 1);
+        }
+      }
+    }
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/similar-nested-ifs/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/similar-nested-ifs/0-opt.wgsl
new file mode 100644
index 0000000..592be78
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/similar-nested-ifs/0-opt.wgsl
@@ -0,0 +1,79 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> gv : f32;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var lv : f32;
+  var x_43 : f32;
+  var GLF_live5r : i32;
+  var GLF_live5_looplimiter6 : i32;
+  let x_45 : f32 = x_7.injectionSwitch.y;
+  if ((1.0 > x_45)) {
+    let x_50 : f32 = gv;
+    x_43 = abs(x_50);
+  } else {
+    x_43 = 260.0;
+  }
+  let x_52 : f32 = x_43;
+  lv = x_52;
+  let x_53 : f32 = lv;
+  if ((i32(x_53) < 250)) {
+    let x_58 : f32 = lv;
+    if ((i32(x_58) < 180)) {
+      let x_64 : f32 = lv;
+      let x_65 : f32 = clamp(x_64, 1.0, 1.0);
+    } else {
+      let x_67 : f32 = gl_FragCoord.y;
+      if ((x_67 < 0.0)) {
+        let x_71 : f32 = lv;
+        if ((i32(x_71) < 210)) {
+          loop {
+
+            continuing {
+              if (true) {
+              } else {
+                break;
+              }
+            }
+          }
+        }
+        GLF_live5r = 0;
+        loop {
+          if (true) {
+          } else {
+            break;
+          }
+          let x_11 : i32 = GLF_live5_looplimiter6;
+          if ((x_11 >= 6)) {
+            break;
+          }
+          let x_12 : i32 = GLF_live5_looplimiter6;
+          GLF_live5_looplimiter6 = (x_12 + 1);
+        }
+      }
+    }
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/similar-nested-ifs/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/similar-nested-ifs/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..2b57a30
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/similar-nested-ifs/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,71 @@
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[1];
+};
+static float gv = 0.0f;
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float lv = 0.0f;
+  float x_43 = 0.0f;
+  int GLF_live5r = 0;
+  int GLF_live5_looplimiter6 = 0;
+  const float x_45 = asfloat(x_7[0].y);
+  if ((1.0f > x_45)) {
+    x_43 = abs(gv);
+  } else {
+    x_43 = 260.0f;
+  }
+  lv = x_43;
+  if ((int(lv) < 250)) {
+    if ((int(lv) < 180)) {
+      const float x_65 = clamp(lv, 1.0f, 1.0f);
+    } else {
+      const float x_67 = gl_FragCoord.y;
+      if ((x_67 < 0.0f)) {
+        if ((int(lv) < 210)) {
+          while (true) {
+            {
+              if (true) {
+              } else {
+                break;
+              }
+            }
+          }
+        }
+        GLF_live5r = 0;
+        while (true) {
+          if (true) {
+          } else {
+            break;
+          }
+          if ((GLF_live5_looplimiter6 >= 6)) {
+            break;
+          }
+          GLF_live5_looplimiter6 = (GLF_live5_looplimiter6 + 1);
+        }
+      }
+    }
+  }
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/similar-nested-ifs/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/similar-nested-ifs/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..3bfd32e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/similar-nested-ifs/0-opt.wgsl.expected.msl
@@ -0,0 +1,78 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float* const tint_symbol_5, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  float lv = 0.0f;
+  float x_43 = 0.0f;
+  int GLF_live5r = 0;
+  int GLF_live5_looplimiter6 = 0;
+  float const x_45 = x_7.injectionSwitch.y;
+  if ((1.0f > x_45)) {
+    float const x_50 = *(tint_symbol_5);
+    x_43 = fabs(x_50);
+  } else {
+    x_43 = 260.0f;
+  }
+  float const x_52 = x_43;
+  lv = x_52;
+  float const x_53 = lv;
+  if ((int(x_53) < 250)) {
+    float const x_58 = lv;
+    if ((int(x_58) < 180)) {
+      float const x_64 = lv;
+      float const x_65 = clamp(x_64, 1.0f, 1.0f);
+    } else {
+      float const x_67 = (*(tint_symbol_6)).y;
+      if ((x_67 < 0.0f)) {
+        float const x_71 = lv;
+        if ((int(x_71) < 210)) {
+          while (true) {
+            {
+              if (true) {
+              } else {
+                break;
+              }
+            }
+          }
+        }
+        GLF_live5r = 0;
+        while (true) {
+          if (true) {
+          } else {
+            break;
+          }
+          int const x_11 = GLF_live5_looplimiter6;
+          if ((x_11 >= 6)) {
+            break;
+          }
+          int const x_12 = GLF_live5_looplimiter6;
+          GLF_live5_looplimiter6 = (x_12 + 1);
+        }
+      }
+    }
+  }
+  *(tint_symbol_7) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float tint_symbol_9 = 0.0f;
+  thread float4 tint_symbol_10 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_7, &(tint_symbol_9), &(tint_symbol_8), &(tint_symbol_10));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_10};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/similar-nested-ifs/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/similar-nested-ifs/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..17f5fb7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/similar-nested-ifs/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,203 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 112
+; Schema: 0
+               OpCapability Shader
+         %44 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_7 "x_7"
+               OpName %gv "gv"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %lv "lv"
+               OpName %x_43 "x_43"
+               OpName %GLF_live5r "GLF_live5r"
+               OpName %GLF_live5_looplimiter6 "GLF_live5_looplimiter6"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Private_float = OpTypePointer Private %float
+          %8 = OpConstantNull %float
+         %gv = OpVariable %_ptr_Private_float Private %8
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %12
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %28 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+       %bool = OpTypeBool
+  %float_260 = OpConstant %float 260
+    %int_250 = OpConstant %int 250
+    %int_180 = OpConstant %int 180
+    %float_0 = OpConstant %float 0
+    %int_210 = OpConstant %int 210
+       %true = OpConstantTrue %bool
+      %int_0 = OpConstant %int 0
+      %int_6 = OpConstant %int 6
+      %int_1 = OpConstant %int 1
+         %98 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %99 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %18
+         %21 = OpLabel
+         %lv = OpVariable %_ptr_Function_float Function %8
+       %x_43 = OpVariable %_ptr_Function_float Function %8
+ %GLF_live5r = OpVariable %_ptr_Function_int Function %28
+%GLF_live5_looplimiter6 = OpVariable %_ptr_Function_int Function %28
+         %34 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_1
+         %35 = OpLoad %float %34
+         %37 = OpFOrdGreaterThan %bool %float_1 %35
+               OpSelectionMerge %39 None
+               OpBranchConditional %37 %40 %41
+         %40 = OpLabel
+         %42 = OpLoad %float %gv
+         %43 = OpExtInst %float %44 FAbs %42
+               OpStore %x_43 %43
+               OpBranch %39
+         %41 = OpLabel
+               OpStore %x_43 %float_260
+               OpBranch %39
+         %39 = OpLabel
+         %46 = OpLoad %float %x_43
+               OpStore %lv %46
+         %47 = OpLoad %float %lv
+         %48 = OpConvertFToS %int %47
+         %50 = OpSLessThan %bool %48 %int_250
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %51
+         %52 = OpLabel
+         %53 = OpLoad %float %lv
+         %54 = OpConvertFToS %int %53
+         %56 = OpSLessThan %bool %54 %int_180
+               OpSelectionMerge %57 None
+               OpBranchConditional %56 %58 %59
+         %58 = OpLabel
+         %60 = OpLoad %float %lv
+         %61 = OpExtInst %float %44 NClamp %60 %float_1 %float_1
+               OpBranch %57
+         %59 = OpLabel
+         %62 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %63 = OpLoad %float %62
+         %65 = OpFOrdLessThan %bool %63 %float_0
+               OpSelectionMerge %66 None
+               OpBranchConditional %65 %67 %66
+         %67 = OpLabel
+         %68 = OpLoad %float %lv
+         %69 = OpConvertFToS %int %68
+         %71 = OpSLessThan %bool %69 %int_210
+               OpSelectionMerge %72 None
+               OpBranchConditional %71 %73 %72
+         %73 = OpLabel
+               OpBranch %74
+         %74 = OpLabel
+               OpLoopMerge %75 %76 None
+               OpBranch %77
+         %77 = OpLabel
+               OpBranch %76
+         %76 = OpLabel
+               OpSelectionMerge %79 None
+               OpBranchConditional %true %80 %81
+         %80 = OpLabel
+               OpBranch %79
+         %81 = OpLabel
+               OpBranch %75
+         %79 = OpLabel
+               OpBranch %74
+         %75 = OpLabel
+               OpBranch %72
+         %72 = OpLabel
+               OpStore %GLF_live5r %int_0
+               OpBranch %83
+         %83 = OpLabel
+               OpLoopMerge %84 %85 None
+               OpBranch %86
+         %86 = OpLabel
+               OpSelectionMerge %87 None
+               OpBranchConditional %true %88 %89
+         %88 = OpLabel
+               OpBranch %87
+         %89 = OpLabel
+               OpBranch %84
+         %87 = OpLabel
+         %90 = OpLoad %int %GLF_live5_looplimiter6
+         %92 = OpSGreaterThanEqual %bool %90 %int_6
+               OpSelectionMerge %93 None
+               OpBranchConditional %92 %94 %93
+         %94 = OpLabel
+               OpBranch %84
+         %93 = OpLabel
+         %95 = OpLoad %int %GLF_live5_looplimiter6
+         %97 = OpIAdd %int %95 %int_1
+               OpStore %GLF_live5_looplimiter6 %97
+               OpBranch %85
+         %85 = OpLabel
+               OpBranch %83
+         %84 = OpLabel
+               OpBranch %66
+         %66 = OpLabel
+               OpBranch %57
+         %57 = OpLabel
+               OpBranch %51
+         %51 = OpLabel
+               OpStore %x_GLF_color %98
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %99
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %103 = OpLabel
+        %104 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %104
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %18
+        %106 = OpLabel
+        %107 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %107
+        %108 = OpFunctionCall %void %main_1
+        %110 = OpLoad %v4float %x_GLF_color
+        %111 = OpCompositeConstruct %main_out %110
+        %109 = OpFunctionCall %void %tint_symbol_3 %111
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 76[%76] is not post dominated by the back-edge block 79[%79]
+  %79 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/similar-nested-ifs/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/similar-nested-ifs/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..592be78
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/similar-nested-ifs/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,79 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> gv : f32;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var lv : f32;
+  var x_43 : f32;
+  var GLF_live5r : i32;
+  var GLF_live5_looplimiter6 : i32;
+  let x_45 : f32 = x_7.injectionSwitch.y;
+  if ((1.0 > x_45)) {
+    let x_50 : f32 = gv;
+    x_43 = abs(x_50);
+  } else {
+    x_43 = 260.0;
+  }
+  let x_52 : f32 = x_43;
+  lv = x_52;
+  let x_53 : f32 = lv;
+  if ((i32(x_53) < 250)) {
+    let x_58 : f32 = lv;
+    if ((i32(x_58) < 180)) {
+      let x_64 : f32 = lv;
+      let x_65 : f32 = clamp(x_64, 1.0, 1.0);
+    } else {
+      let x_67 : f32 = gl_FragCoord.y;
+      if ((x_67 < 0.0)) {
+        let x_71 : f32 = lv;
+        if ((i32(x_71) < 210)) {
+          loop {
+
+            continuing {
+              if (true) {
+              } else {
+                break;
+              }
+            }
+          }
+        }
+        GLF_live5r = 0;
+        loop {
+          if (true) {
+          } else {
+            break;
+          }
+          let x_11 : i32 = GLF_live5_looplimiter6;
+          if ((x_11 >= 6)) {
+            break;
+          }
+          let x_12 : i32 = GLF_live5_looplimiter6;
+          GLF_live5_looplimiter6 = (x_12 + 1);
+        }
+      }
+    }
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/smoothstep-after-loop/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/smoothstep-after-loop/0-opt.spvasm
new file mode 100644
index 0000000..e7e836b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/smoothstep-after-loop/0-opt.spvasm
@@ -0,0 +1,58 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %GLF_live9r "GLF_live9r"
+               OpName %g "g"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+    %float_1 = OpConstant %float 1
+         %13 = OpConstantComposite %v2float %float_1 %float_1
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_3 = OpConstant %float 3
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+       %main = OpFunction %void None %7
+         %23 = OpLabel
+ %GLF_live9r = OpVariable %_ptr_Function_int Function
+          %g = OpVariable %_ptr_Function_float Function
+               OpBranch %24
+         %24 = OpLabel
+               OpLoopMerge %25 %26 None
+               OpBranch %27
+         %27 = OpLabel
+               OpBranchConditional %true %28 %25
+         %28 = OpLabel
+               OpSelectionMerge %29 None
+               OpBranchConditional %true %30 %29
+         %30 = OpLabel
+               OpBranch %25
+         %29 = OpLabel
+         %31 = OpLoad %int %GLF_live9r
+         %32 = OpExtInst %int %1 SClamp %31 %int_0 %int_1
+               OpBranch %26
+         %26 = OpLabel
+               OpBranch %24
+         %25 = OpLabel
+               OpStore %g %float_3
+         %33 = OpLoad %float %g
+         %34 = OpExtInst %float %1 SmoothStep %float_0 %float_1 %33
+         %35 = OpCompositeConstruct %v4float %34 %float_0 %float_0 %float_1
+               OpStore %_GLF_color %35
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/smoothstep-after-loop/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/smoothstep-after-loop/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..bbaed1e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/smoothstep-after-loop/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,33 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int GLF_live9r = 0;
+  float g = 0.0f;
+  while (true) {
+    if (true) {
+    } else {
+      break;
+    }
+    if (true) {
+      break;
+    }
+    const int x_32 = clamp(GLF_live9r, 0, 1);
+  }
+  g = 3.0f;
+  x_GLF_color = float4(smoothstep(0.0f, 1.0f, g), 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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/smoothstep-after-loop/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/smoothstep-after-loop/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..f979602
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/smoothstep-after-loop/0-opt.spvasm.expected.msl
@@ -0,0 +1,38 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  int GLF_live9r = 0;
+  float g = 0.0f;
+  while (true) {
+    if (true) {
+    } else {
+      break;
+    }
+    if (true) {
+      break;
+    }
+    int const x_31 = GLF_live9r;
+    int const x_32 = clamp(x_31, 0, 1);
+  }
+  g = 3.0f;
+  float const x_33 = g;
+  *(tint_symbol_4) = float4(smoothstep(0.0f, 1.0f, x_33), 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/smoothstep-after-loop/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/smoothstep-after-loop/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..e273234
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/smoothstep-after-loop/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,94 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 53
+; Schema: 0
+               OpCapability Shader
+         %32 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %GLF_live9r "GLF_live9r"
+               OpName %g "g"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %15 = OpConstantNull %int
+%_ptr_Function_float = OpTypePointer Function %float
+         %18 = OpConstantNull %float
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+    %float_3 = OpConstant %float 3
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+         %41 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+ %GLF_live9r = OpVariable %_ptr_Function_int Function %15
+          %g = OpVariable %_ptr_Function_float Function %18
+               OpBranch %19
+         %19 = OpLabel
+               OpLoopMerge %20 %21 None
+               OpBranch %22
+         %22 = OpLabel
+               OpSelectionMerge %25 None
+               OpBranchConditional %true %26 %27
+         %26 = OpLabel
+               OpBranch %25
+         %27 = OpLabel
+               OpBranch %20
+         %25 = OpLabel
+               OpSelectionMerge %28 None
+               OpBranchConditional %true %29 %28
+         %29 = OpLabel
+               OpBranch %20
+         %28 = OpLabel
+         %30 = OpLoad %int %GLF_live9r
+         %31 = OpExtInst %int %32 SClamp %30 %int_0 %int_1
+               OpBranch %21
+         %21 = OpLabel
+               OpBranch %19
+         %20 = OpLabel
+               OpStore %g %float_3
+         %36 = OpLoad %float %g
+         %37 = OpExtInst %float %32 SmoothStep %float_0 %float_1 %36
+         %40 = OpCompositeConstruct %v4float %37 %float_0 %float_0 %float_1
+               OpStore %x_GLF_color %40
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %41
+%tint_symbol = OpFunctionParameter %main_out
+         %45 = OpLabel
+         %46 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %46
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %48 = OpLabel
+         %49 = OpFunctionCall %void %main_1
+         %51 = OpLoad %v4float %x_GLF_color
+         %52 = OpCompositeConstruct %main_out %51
+         %50 = OpFunctionCall %void %tint_symbol_2 %52
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/smoothstep-after-loop/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/smoothstep-after-loop/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..3f8d86d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/smoothstep-after-loop/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,32 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var GLF_live9r : i32;
+  var g : f32;
+  loop {
+    if (true) {
+    } else {
+      break;
+    }
+    if (true) {
+      break;
+    }
+    let x_31 : i32 = GLF_live9r;
+    let x_32 : i32 = clamp(x_31, 0, 1);
+  }
+  g = 3.0;
+  let x_33 : f32 = g;
+  x_GLF_color = vec4<f32>(smoothStep(0.0, 1.0, x_33), 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/smoothstep-after-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/smoothstep-after-loop/0-opt.wgsl
new file mode 100644
index 0000000..3f8d86d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/smoothstep-after-loop/0-opt.wgsl
@@ -0,0 +1,32 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var GLF_live9r : i32;
+  var g : f32;
+  loop {
+    if (true) {
+    } else {
+      break;
+    }
+    if (true) {
+      break;
+    }
+    let x_31 : i32 = GLF_live9r;
+    let x_32 : i32 = clamp(x_31, 0, 1);
+  }
+  g = 3.0;
+  let x_33 : f32 = g;
+  x_GLF_color = vec4<f32>(smoothStep(0.0, 1.0, x_33), 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/smoothstep-after-loop/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/smoothstep-after-loop/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..bbaed1e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/smoothstep-after-loop/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,33 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int GLF_live9r = 0;
+  float g = 0.0f;
+  while (true) {
+    if (true) {
+    } else {
+      break;
+    }
+    if (true) {
+      break;
+    }
+    const int x_32 = clamp(GLF_live9r, 0, 1);
+  }
+  g = 3.0f;
+  x_GLF_color = float4(smoothstep(0.0f, 1.0f, g), 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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/smoothstep-after-loop/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/smoothstep-after-loop/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..f979602
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/smoothstep-after-loop/0-opt.wgsl.expected.msl
@@ -0,0 +1,38 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  int GLF_live9r = 0;
+  float g = 0.0f;
+  while (true) {
+    if (true) {
+    } else {
+      break;
+    }
+    if (true) {
+      break;
+    }
+    int const x_31 = GLF_live9r;
+    int const x_32 = clamp(x_31, 0, 1);
+  }
+  g = 3.0f;
+  float const x_33 = g;
+  *(tint_symbol_4) = float4(smoothstep(0.0f, 1.0f, x_33), 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/smoothstep-after-loop/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/smoothstep-after-loop/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..e273234
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/smoothstep-after-loop/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,94 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 53
+; Schema: 0
+               OpCapability Shader
+         %32 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %GLF_live9r "GLF_live9r"
+               OpName %g "g"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %15 = OpConstantNull %int
+%_ptr_Function_float = OpTypePointer Function %float
+         %18 = OpConstantNull %float
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+    %float_3 = OpConstant %float 3
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+         %41 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+ %GLF_live9r = OpVariable %_ptr_Function_int Function %15
+          %g = OpVariable %_ptr_Function_float Function %18
+               OpBranch %19
+         %19 = OpLabel
+               OpLoopMerge %20 %21 None
+               OpBranch %22
+         %22 = OpLabel
+               OpSelectionMerge %25 None
+               OpBranchConditional %true %26 %27
+         %26 = OpLabel
+               OpBranch %25
+         %27 = OpLabel
+               OpBranch %20
+         %25 = OpLabel
+               OpSelectionMerge %28 None
+               OpBranchConditional %true %29 %28
+         %29 = OpLabel
+               OpBranch %20
+         %28 = OpLabel
+         %30 = OpLoad %int %GLF_live9r
+         %31 = OpExtInst %int %32 SClamp %30 %int_0 %int_1
+               OpBranch %21
+         %21 = OpLabel
+               OpBranch %19
+         %20 = OpLabel
+               OpStore %g %float_3
+         %36 = OpLoad %float %g
+         %37 = OpExtInst %float %32 SmoothStep %float_0 %float_1 %36
+         %40 = OpCompositeConstruct %v4float %37 %float_0 %float_0 %float_1
+               OpStore %x_GLF_color %40
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %41
+%tint_symbol = OpFunctionParameter %main_out
+         %45 = OpLabel
+         %46 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %46
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %48 = OpLabel
+         %49 = OpFunctionCall %void %main_1
+         %51 = OpLoad %v4float %x_GLF_color
+         %52 = OpCompositeConstruct %main_out %51
+         %50 = OpFunctionCall %void %tint_symbol_2 %52
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/smoothstep-after-loop/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/smoothstep-after-loop/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..3f8d86d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/smoothstep-after-loop/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,32 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var GLF_live9r : i32;
+  var g : f32;
+  loop {
+    if (true) {
+    } else {
+      break;
+    }
+    if (true) {
+      break;
+    }
+    let x_31 : i32 = GLF_live9r;
+    let x_32 : i32 = clamp(x_31, 0, 1);
+  }
+  g = 3.0;
+  let x_33 : f32 = g;
+  x_GLF_color = vec4<f32>(smoothStep(0.0, 1.0, x_33), 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-access-chains/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-access-chains/0-opt.spvasm
new file mode 100644
index 0000000..4596d90
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-access-chains/0-opt.spvasm
@@ -0,0 +1,609 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %pos "pos"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %ipos "ipos"
+               OpName %i "i"
+               OpName %map "map"
+               OpName %p "p"
+               OpName %canwalk "canwalk"
+               OpName %v "v"
+               OpName %directions "directions"
+               OpName %j "j"
+               OpName %d "d"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+   %float_16 = OpConstant %float 16
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_int = OpTypePointer Function %int
+    %int_256 = OpConstant %int 256
+       %bool = OpTypeBool
+   %uint_256 = OpConstant %uint 256
+%_arr_int_uint_256 = OpTypeArray %int %uint_256
+%_ptr_Private__arr_int_uint_256 = OpTypePointer Private %_arr_int_uint_256
+        %map = OpVariable %_ptr_Private__arr_int_uint_256 Private
+%_ptr_Private_int = OpTypePointer Private %int
+      %int_1 = OpConstant %int 1
+         %43 = OpConstantComposite %v2int %int_0 %int_0
+%_ptr_Function_bool = OpTypePointer Function %bool
+       %true = OpConstantTrue %bool
+      %int_2 = OpConstant %int 2
+     %int_16 = OpConstant %int 16
+     %int_14 = OpConstant %int 14
+      %false = OpConstantFalse %bool
+      %int_8 = OpConstant %int 8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+         %53 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+    %float_0 = OpConstant %float 0
+         %55 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %18
+         %56 = OpLabel
+        %pos = OpVariable %_ptr_Function_v2float Function
+       %ipos = OpVariable %_ptr_Function_v2int Function
+          %i = OpVariable %_ptr_Function_int Function
+          %p = OpVariable %_ptr_Function_v2int Function
+    %canwalk = OpVariable %_ptr_Function_bool Function
+          %v = OpVariable %_ptr_Function_int Function
+ %directions = OpVariable %_ptr_Function_int Function
+          %j = OpVariable %_ptr_Function_int Function
+          %d = OpVariable %_ptr_Function_int Function
+         %57 = OpLoad %v4float %gl_FragCoord
+         %58 = OpVectorShuffle %v2float %57 %57 0 1
+         %59 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+         %60 = OpLoad %v2float %59
+         %61 = OpFDiv %v2float %58 %60
+               OpStore %pos %61
+         %62 = OpAccessChain %_ptr_Function_float %pos %uint_0
+         %63 = OpLoad %float %62
+         %64 = OpFMul %float %63 %float_16
+         %65 = OpConvertFToS %int %64
+         %66 = OpAccessChain %_ptr_Function_float %pos %uint_1
+         %67 = OpLoad %float %66
+         %68 = OpFMul %float %67 %float_16
+         %69 = OpConvertFToS %int %68
+         %70 = OpCompositeConstruct %v2int %65 %69
+               OpStore %ipos %70
+               OpStore %i %int_0
+               OpBranch %71
+         %71 = OpLabel
+               OpLoopMerge %72 %73 None
+               OpBranch %74
+         %74 = OpLabel
+         %75 = OpLoad %int %i
+         %76 = OpSLessThan %bool %75 %int_256
+               OpBranchConditional %76 %77 %72
+         %77 = OpLabel
+         %78 = OpLoad %int %i
+         %79 = OpAccessChain %_ptr_Private_int %map %78
+               OpStore %79 %int_0
+               OpBranch %73
+         %73 = OpLabel
+         %80 = OpLoad %int %i
+         %81 = OpIAdd %int %80 %int_1
+               OpStore %i %81
+               OpBranch %71
+         %72 = OpLabel
+               OpStore %p %43
+               OpStore %canwalk %true
+               OpStore %v %int_0
+               OpBranch %82
+         %82 = OpLabel
+               OpLoopMerge %83 %84 None
+               OpBranch %85
+         %85 = OpLabel
+         %86 = OpLoad %int %v
+         %87 = OpIAdd %int %86 %int_1
+               OpStore %v %87
+               OpStore %directions %int_0
+         %88 = OpAccessChain %_ptr_Function_int %p %uint_0
+         %89 = OpLoad %int %88
+         %90 = OpSGreaterThan %bool %89 %int_0
+               OpSelectionMerge %91 None
+               OpBranchConditional %90 %92 %91
+         %92 = OpLabel
+         %93 = OpAccessChain %_ptr_Function_int %p %uint_0
+         %94 = OpLoad %int %93
+         %95 = OpISub %int %94 %int_2
+         %96 = OpAccessChain %_ptr_Function_int %p %uint_1
+         %97 = OpLoad %int %96
+         %98 = OpIMul %int %97 %int_16
+         %99 = OpIAdd %int %95 %98
+        %100 = OpAccessChain %_ptr_Private_int %map %99
+        %101 = OpLoad %int %100
+        %102 = OpIEqual %bool %101 %int_0
+               OpBranch %91
+         %91 = OpLabel
+        %103 = OpPhi %bool %90 %85 %102 %92
+               OpSelectionMerge %104 None
+               OpBranchConditional %103 %105 %104
+        %105 = OpLabel
+        %106 = OpLoad %int %directions
+        %107 = OpIAdd %int %106 %int_1
+               OpStore %directions %107
+               OpBranch %104
+        %104 = OpLabel
+        %108 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %109 = OpLoad %int %108
+        %110 = OpSGreaterThan %bool %109 %int_0
+               OpSelectionMerge %111 None
+               OpBranchConditional %110 %112 %111
+        %112 = OpLabel
+        %113 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %114 = OpLoad %int %113
+        %115 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %116 = OpLoad %int %115
+        %117 = OpISub %int %116 %int_2
+        %118 = OpIMul %int %117 %int_16
+        %119 = OpIAdd %int %114 %118
+        %120 = OpAccessChain %_ptr_Private_int %map %119
+        %121 = OpLoad %int %120
+        %122 = OpIEqual %bool %121 %int_0
+               OpBranch %111
+        %111 = OpLabel
+        %123 = OpPhi %bool %110 %104 %122 %112
+               OpSelectionMerge %124 None
+               OpBranchConditional %123 %125 %124
+        %125 = OpLabel
+        %126 = OpLoad %int %directions
+        %127 = OpIAdd %int %126 %int_1
+               OpStore %directions %127
+               OpBranch %124
+        %124 = OpLabel
+        %128 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %129 = OpLoad %int %128
+        %130 = OpSLessThan %bool %129 %int_14
+               OpSelectionMerge %131 None
+               OpBranchConditional %130 %132 %131
+        %132 = OpLabel
+        %133 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %134 = OpLoad %int %133
+        %135 = OpIAdd %int %134 %int_2
+        %136 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %137 = OpLoad %int %136
+        %138 = OpIMul %int %137 %int_16
+        %139 = OpIAdd %int %135 %138
+        %140 = OpAccessChain %_ptr_Private_int %map %139
+        %141 = OpLoad %int %140
+        %142 = OpIEqual %bool %141 %int_0
+               OpBranch %131
+        %131 = OpLabel
+        %143 = OpPhi %bool %130 %124 %142 %132
+               OpSelectionMerge %144 None
+               OpBranchConditional %143 %145 %144
+        %145 = OpLabel
+        %146 = OpLoad %int %directions
+        %147 = OpIAdd %int %146 %int_1
+               OpStore %directions %147
+               OpBranch %144
+        %144 = OpLabel
+        %148 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %149 = OpLoad %int %148
+        %150 = OpSLessThan %bool %149 %int_14
+               OpSelectionMerge %151 None
+               OpBranchConditional %150 %152 %151
+        %152 = OpLabel
+        %153 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %154 = OpLoad %int %153
+        %155 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %156 = OpLoad %int %155
+        %157 = OpIAdd %int %156 %int_2
+        %158 = OpIMul %int %157 %int_16
+        %159 = OpIAdd %int %154 %158
+        %160 = OpAccessChain %_ptr_Private_int %map %159
+        %161 = OpLoad %int %160
+        %162 = OpIEqual %bool %161 %int_0
+               OpBranch %151
+        %151 = OpLabel
+        %163 = OpPhi %bool %150 %144 %162 %152
+               OpSelectionMerge %164 None
+               OpBranchConditional %163 %165 %164
+        %165 = OpLabel
+        %166 = OpLoad %int %directions
+        %167 = OpIAdd %int %166 %int_1
+               OpStore %directions %167
+               OpBranch %164
+        %164 = OpLabel
+        %168 = OpLoad %int %directions
+        %169 = OpIEqual %bool %168 %int_0
+               OpSelectionMerge %170 None
+               OpBranchConditional %169 %171 %172
+        %171 = OpLabel
+               OpStore %canwalk %false
+               OpStore %i %int_0
+               OpBranch %173
+        %173 = OpLabel
+               OpLoopMerge %174 %175 None
+               OpBranch %176
+        %176 = OpLabel
+        %177 = OpLoad %int %i
+        %178 = OpSLessThan %bool %177 %int_8
+               OpBranchConditional %178 %179 %174
+        %179 = OpLabel
+               OpStore %j %int_0
+               OpBranch %180
+        %180 = OpLabel
+               OpLoopMerge %181 %182 None
+               OpBranch %183
+        %183 = OpLabel
+        %184 = OpLoad %int %j
+        %185 = OpSLessThan %bool %184 %int_8
+               OpBranchConditional %185 %186 %181
+        %186 = OpLabel
+        %187 = OpLoad %int %j
+        %188 = OpIMul %int %187 %int_2
+        %189 = OpLoad %int %i
+        %190 = OpIMul %int %189 %int_2
+        %191 = OpIMul %int %190 %int_16
+        %192 = OpIAdd %int %188 %191
+        %193 = OpAccessChain %_ptr_Private_int %map %192
+        %194 = OpLoad %int %193
+        %195 = OpIEqual %bool %194 %int_0
+               OpSelectionMerge %196 None
+               OpBranchConditional %195 %197 %196
+        %197 = OpLabel
+        %198 = OpLoad %int %j
+        %199 = OpIMul %int %198 %int_2
+        %200 = OpAccessChain %_ptr_Function_int %p %uint_0
+               OpStore %200 %199
+        %201 = OpLoad %int %i
+        %202 = OpIMul %int %201 %int_2
+        %203 = OpAccessChain %_ptr_Function_int %p %uint_1
+               OpStore %203 %202
+               OpStore %canwalk %true
+               OpBranch %196
+        %196 = OpLabel
+               OpBranch %182
+        %182 = OpLabel
+        %204 = OpLoad %int %j
+        %205 = OpIAdd %int %204 %int_1
+               OpStore %j %205
+               OpBranch %180
+        %181 = OpLabel
+               OpBranch %175
+        %175 = OpLabel
+        %206 = OpLoad %int %i
+        %207 = OpIAdd %int %206 %int_1
+               OpStore %i %207
+               OpBranch %173
+        %174 = OpLabel
+        %208 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %209 = OpLoad %int %208
+        %210 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %211 = OpLoad %int %210
+        %212 = OpIMul %int %211 %int_16
+        %213 = OpIAdd %int %209 %212
+        %214 = OpAccessChain %_ptr_Private_int %map %213
+               OpStore %214 %int_1
+               OpBranch %170
+        %172 = OpLabel
+        %215 = OpLoad %int %v
+        %216 = OpLoad %int %directions
+        %217 = OpSMod %int %215 %216
+               OpStore %d %217
+        %218 = OpLoad %int %directions
+        %219 = OpLoad %int %v
+        %220 = OpIAdd %int %219 %218
+               OpStore %v %220
+        %221 = OpLoad %int %d
+        %222 = OpSGreaterThanEqual %bool %221 %int_0
+               OpSelectionMerge %223 None
+               OpBranchConditional %222 %224 %223
+        %224 = OpLabel
+        %225 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %226 = OpLoad %int %225
+        %227 = OpSGreaterThan %bool %226 %int_0
+               OpBranch %223
+        %223 = OpLabel
+        %228 = OpPhi %bool %222 %172 %227 %224
+               OpSelectionMerge %229 None
+               OpBranchConditional %228 %230 %229
+        %230 = OpLabel
+        %231 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %232 = OpLoad %int %231
+        %233 = OpISub %int %232 %int_2
+        %234 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %235 = OpLoad %int %234
+        %236 = OpIMul %int %235 %int_16
+        %237 = OpIAdd %int %233 %236
+        %238 = OpAccessChain %_ptr_Private_int %map %237
+        %239 = OpLoad %int %238
+        %240 = OpIEqual %bool %239 %int_0
+               OpBranch %229
+        %229 = OpLabel
+        %241 = OpPhi %bool %228 %223 %240 %230
+               OpSelectionMerge %242 None
+               OpBranchConditional %241 %243 %242
+        %243 = OpLabel
+        %244 = OpLoad %int %d
+        %245 = OpISub %int %244 %int_1
+               OpStore %d %245
+        %246 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %247 = OpLoad %int %246
+        %248 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %249 = OpLoad %int %248
+        %250 = OpIMul %int %249 %int_16
+        %251 = OpIAdd %int %247 %250
+        %252 = OpAccessChain %_ptr_Private_int %map %251
+               OpStore %252 %int_1
+        %253 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %254 = OpLoad %int %253
+        %255 = OpISub %int %254 %int_1
+        %256 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %257 = OpLoad %int %256
+        %258 = OpIMul %int %257 %int_16
+        %259 = OpIAdd %int %255 %258
+        %260 = OpAccessChain %_ptr_Private_int %map %259
+               OpStore %260 %int_1
+        %261 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %262 = OpLoad %int %261
+        %263 = OpISub %int %262 %int_2
+        %264 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %265 = OpLoad %int %264
+        %266 = OpIMul %int %265 %int_16
+        %267 = OpIAdd %int %263 %266
+        %268 = OpAccessChain %_ptr_Private_int %map %267
+               OpStore %268 %int_1
+        %269 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %270 = OpLoad %int %269
+        %271 = OpISub %int %270 %int_2
+        %272 = OpAccessChain %_ptr_Function_int %p %uint_0
+               OpStore %272 %271
+               OpBranch %242
+        %242 = OpLabel
+        %273 = OpLoad %int %d
+        %274 = OpSGreaterThanEqual %bool %273 %int_0
+               OpSelectionMerge %275 None
+               OpBranchConditional %274 %276 %275
+        %276 = OpLabel
+        %277 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %278 = OpLoad %int %277
+        %279 = OpSGreaterThan %bool %278 %int_0
+               OpBranch %275
+        %275 = OpLabel
+        %280 = OpPhi %bool %274 %242 %279 %276
+               OpSelectionMerge %281 None
+               OpBranchConditional %280 %282 %281
+        %282 = OpLabel
+        %283 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %284 = OpLoad %int %283
+        %285 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %286 = OpLoad %int %285
+        %287 = OpISub %int %286 %int_2
+        %288 = OpIMul %int %287 %int_16
+        %289 = OpIAdd %int %284 %288
+        %290 = OpAccessChain %_ptr_Private_int %map %289
+        %291 = OpLoad %int %290
+        %292 = OpIEqual %bool %291 %int_0
+               OpBranch %281
+        %281 = OpLabel
+        %293 = OpPhi %bool %280 %275 %292 %282
+               OpSelectionMerge %294 None
+               OpBranchConditional %293 %295 %294
+        %295 = OpLabel
+        %296 = OpLoad %int %d
+        %297 = OpISub %int %296 %int_1
+               OpStore %d %297
+        %298 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %299 = OpLoad %int %298
+        %300 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %301 = OpLoad %int %300
+        %302 = OpIMul %int %301 %int_16
+        %303 = OpIAdd %int %299 %302
+        %304 = OpAccessChain %_ptr_Private_int %map %303
+               OpStore %304 %int_1
+        %305 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %306 = OpLoad %int %305
+        %307 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %308 = OpLoad %int %307
+        %309 = OpISub %int %308 %int_1
+        %310 = OpIMul %int %309 %int_16
+        %311 = OpIAdd %int %306 %310
+        %312 = OpAccessChain %_ptr_Private_int %map %311
+               OpStore %312 %int_1
+        %313 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %314 = OpLoad %int %313
+        %315 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %316 = OpLoad %int %315
+        %317 = OpISub %int %316 %int_2
+        %318 = OpIMul %int %317 %int_16
+        %319 = OpIAdd %int %314 %318
+        %320 = OpAccessChain %_ptr_Private_int %map %319
+               OpStore %320 %int_1
+        %321 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %322 = OpLoad %int %321
+        %323 = OpISub %int %322 %int_2
+        %324 = OpAccessChain %_ptr_Function_int %p %uint_1
+               OpStore %324 %323
+               OpBranch %294
+        %294 = OpLabel
+        %325 = OpLoad %int %d
+        %326 = OpSGreaterThanEqual %bool %325 %int_0
+               OpSelectionMerge %327 None
+               OpBranchConditional %326 %328 %327
+        %328 = OpLabel
+        %329 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %330 = OpLoad %int %329
+        %331 = OpSLessThan %bool %330 %int_14
+               OpBranch %327
+        %327 = OpLabel
+        %332 = OpPhi %bool %326 %294 %331 %328
+               OpSelectionMerge %333 None
+               OpBranchConditional %332 %334 %333
+        %334 = OpLabel
+        %335 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %336 = OpLoad %int %335
+        %337 = OpIAdd %int %336 %int_2
+        %338 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %339 = OpLoad %int %338
+        %340 = OpIMul %int %339 %int_16
+        %341 = OpIAdd %int %337 %340
+        %342 = OpAccessChain %_ptr_Private_int %map %341
+        %343 = OpLoad %int %342
+        %344 = OpIEqual %bool %343 %int_0
+               OpBranch %333
+        %333 = OpLabel
+        %345 = OpPhi %bool %332 %327 %344 %334
+               OpSelectionMerge %346 None
+               OpBranchConditional %345 %347 %346
+        %347 = OpLabel
+        %348 = OpLoad %int %d
+        %349 = OpISub %int %348 %int_1
+               OpStore %d %349
+        %350 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %351 = OpLoad %int %350
+        %352 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %353 = OpLoad %int %352
+        %354 = OpIMul %int %353 %int_16
+        %355 = OpIAdd %int %351 %354
+        %356 = OpAccessChain %_ptr_Private_int %map %355
+               OpStore %356 %int_1
+        %357 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %358 = OpLoad %int %357
+        %359 = OpIAdd %int %358 %int_1
+        %360 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %361 = OpLoad %int %360
+        %362 = OpIMul %int %361 %int_16
+        %363 = OpIAdd %int %359 %362
+        %364 = OpAccessChain %_ptr_Private_int %map %363
+               OpStore %364 %int_1
+        %365 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %366 = OpLoad %int %365
+        %367 = OpIAdd %int %366 %int_2
+        %368 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %369 = OpLoad %int %368
+        %370 = OpIMul %int %369 %int_16
+        %371 = OpIAdd %int %367 %370
+        %372 = OpAccessChain %_ptr_Private_int %map %371
+               OpStore %372 %int_1
+        %373 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %374 = OpLoad %int %373
+        %375 = OpIAdd %int %374 %int_2
+        %376 = OpAccessChain %_ptr_Function_int %p %uint_0
+               OpStore %376 %375
+               OpBranch %346
+        %346 = OpLabel
+        %377 = OpLoad %int %d
+        %378 = OpSGreaterThanEqual %bool %377 %int_0
+               OpSelectionMerge %379 None
+               OpBranchConditional %378 %380 %379
+        %380 = OpLabel
+        %381 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %382 = OpLoad %int %381
+        %383 = OpSLessThan %bool %382 %int_14
+               OpBranch %379
+        %379 = OpLabel
+        %384 = OpPhi %bool %378 %346 %383 %380
+               OpSelectionMerge %385 None
+               OpBranchConditional %384 %386 %385
+        %386 = OpLabel
+        %387 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %388 = OpLoad %int %387
+        %389 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %390 = OpLoad %int %389
+        %391 = OpIAdd %int %390 %int_2
+        %392 = OpIMul %int %391 %int_16
+        %393 = OpIAdd %int %388 %392
+        %394 = OpAccessChain %_ptr_Private_int %map %393
+        %395 = OpLoad %int %394
+        %396 = OpIEqual %bool %395 %int_0
+               OpBranch %385
+        %385 = OpLabel
+        %397 = OpPhi %bool %384 %379 %396 %386
+               OpSelectionMerge %398 None
+               OpBranchConditional %397 %399 %398
+        %399 = OpLabel
+        %400 = OpLoad %int %d
+        %401 = OpISub %int %400 %int_1
+               OpStore %d %401
+        %402 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %403 = OpLoad %int %402
+        %404 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %405 = OpLoad %int %404
+        %406 = OpIMul %int %405 %int_16
+        %407 = OpIAdd %int %403 %406
+        %408 = OpAccessChain %_ptr_Private_int %map %407
+               OpStore %408 %int_1
+        %409 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %410 = OpLoad %int %409
+        %411 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %412 = OpLoad %int %411
+        %413 = OpIAdd %int %412 %int_1
+        %414 = OpIMul %int %413 %int_16
+        %415 = OpIAdd %int %410 %414
+        %416 = OpAccessChain %_ptr_Private_int %map %415
+               OpStore %416 %int_1
+        %417 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %418 = OpLoad %int %417
+        %419 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %420 = OpLoad %int %419
+        %421 = OpIAdd %int %420 %int_2
+        %422 = OpIMul %int %421 %int_16
+        %423 = OpIAdd %int %418 %422
+        %424 = OpAccessChain %_ptr_Private_int %map %423
+               OpStore %424 %int_1
+        %425 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %426 = OpLoad %int %425
+        %427 = OpIAdd %int %426 %int_2
+        %428 = OpAccessChain %_ptr_Function_int %p %uint_1
+               OpStore %428 %427
+               OpBranch %398
+        %398 = OpLabel
+               OpBranch %170
+        %170 = OpLabel
+        %429 = OpAccessChain %_ptr_Function_int %ipos %uint_1
+        %430 = OpLoad %int %429
+        %431 = OpIMul %int %430 %int_16
+        %432 = OpAccessChain %_ptr_Function_int %ipos %uint_0
+        %433 = OpLoad %int %432
+        %434 = OpIAdd %int %431 %433
+        %435 = OpAccessChain %_ptr_Private_int %map %434
+        %436 = OpLoad %int %435
+        %437 = OpIEqual %bool %436 %int_1
+               OpSelectionMerge %438 None
+               OpBranchConditional %437 %439 %438
+        %439 = OpLabel
+               OpStore %_GLF_color %53
+               OpReturn
+        %438 = OpLabel
+               OpBranch %84
+         %84 = OpLabel
+        %440 = OpLoad %bool %canwalk
+               OpBranchConditional %440 %82 %83
+         %83 = OpLabel
+               OpStore %_GLF_color %55
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-access-chains/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-access-chains/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..a5177e1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-access-chains/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,292 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[1];
+};
+static int map[256] = (int[256])0;
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2 pos = float2(0.0f, 0.0f);
+  int2 ipos = int2(0, 0);
+  int i = 0;
+  int2 p = int2(0, 0);
+  bool canwalk = false;
+  int v = 0;
+  int directions = 0;
+  int j = 0;
+  int d = 0;
+  const float4 x_57 = gl_FragCoord;
+  const float2 x_60 = asfloat(x_7[0].xy);
+  pos = (float2(x_57.x, x_57.y) / x_60);
+  const float x_63 = pos.x;
+  const float x_67 = pos.y;
+  ipos = int2(int((x_63 * 16.0f)), int((x_67 * 16.0f)));
+  i = 0;
+  {
+    for(; (i < 256); i = (i + 1)) {
+      map[i] = 0;
+    }
+  }
+  p = int2(0, 0);
+  canwalk = true;
+  v = 0;
+  while (true) {
+    bool x_102 = false;
+    bool x_122 = false;
+    bool x_142 = false;
+    bool x_162 = false;
+    bool x_103_phi = false;
+    bool x_123_phi = false;
+    bool x_143_phi = false;
+    bool x_163_phi = false;
+    v = (v + 1);
+    directions = 0;
+    const int x_89 = p.x;
+    const bool x_90 = (x_89 > 0);
+    x_103_phi = x_90;
+    if (x_90) {
+      const int x_94 = p.x;
+      const int x_97 = p.y;
+      const int x_101 = map[((x_94 - 2) + (x_97 * 16))];
+      x_102 = (x_101 == 0);
+      x_103_phi = x_102;
+    }
+    if (x_103_phi) {
+      directions = (directions + 1);
+    }
+    const int x_109 = p.y;
+    const bool x_110 = (x_109 > 0);
+    x_123_phi = x_110;
+    if (x_110) {
+      const int x_114 = p.x;
+      const int x_116 = p.y;
+      const int x_121 = map[(x_114 + ((x_116 - 2) * 16))];
+      x_122 = (x_121 == 0);
+      x_123_phi = x_122;
+    }
+    if (x_123_phi) {
+      directions = (directions + 1);
+    }
+    const int x_129 = p.x;
+    const bool x_130 = (x_129 < 14);
+    x_143_phi = x_130;
+    if (x_130) {
+      const int x_134 = p.x;
+      const int x_137 = p.y;
+      const int x_141 = map[((x_134 + 2) + (x_137 * 16))];
+      x_142 = (x_141 == 0);
+      x_143_phi = x_142;
+    }
+    if (x_143_phi) {
+      directions = (directions + 1);
+    }
+    const int x_149 = p.y;
+    const bool x_150 = (x_149 < 14);
+    x_163_phi = x_150;
+    if (x_150) {
+      const int x_154 = p.x;
+      const int x_156 = p.y;
+      const int x_161 = map[(x_154 + ((x_156 + 2) * 16))];
+      x_162 = (x_161 == 0);
+      x_163_phi = x_162;
+    }
+    if (x_163_phi) {
+      directions = (directions + 1);
+    }
+    bool x_227 = false;
+    bool x_240 = false;
+    bool x_279 = false;
+    bool x_292 = false;
+    bool x_331 = false;
+    bool x_344 = false;
+    bool x_383 = false;
+    bool x_396 = false;
+    bool x_228_phi = false;
+    bool x_241_phi = false;
+    bool x_280_phi = false;
+    bool x_293_phi = false;
+    bool x_332_phi = false;
+    bool x_345_phi = false;
+    bool x_384_phi = false;
+    bool x_397_phi = false;
+    if ((directions == 0)) {
+      canwalk = false;
+      i = 0;
+      {
+        for(; (i < 8); i = (i + 1)) {
+          j = 0;
+          {
+            for(; (j < 8); j = (j + 1)) {
+              const int x_194 = map[((j * 2) + ((i * 2) * 16))];
+              if ((x_194 == 0)) {
+                p.x = (j * 2);
+                p.y = (i * 2);
+                canwalk = true;
+              }
+            }
+          }
+        }
+      }
+      const int x_209 = p.x;
+      const int x_211 = p.y;
+      map[(x_209 + (x_211 * 16))] = 1;
+    } else {
+      d = (v % directions);
+      v = (v + directions);
+      const bool x_222 = (d >= 0);
+      x_228_phi = x_222;
+      if (x_222) {
+        const int x_226 = p.x;
+        x_227 = (x_226 > 0);
+        x_228_phi = x_227;
+      }
+      const bool x_228 = x_228_phi;
+      x_241_phi = x_228;
+      if (x_228) {
+        const int x_232 = p.x;
+        const int x_235 = p.y;
+        const int x_239 = map[((x_232 - 2) + (x_235 * 16))];
+        x_240 = (x_239 == 0);
+        x_241_phi = x_240;
+      }
+      if (x_241_phi) {
+        d = (d - 1);
+        const int x_247 = p.x;
+        const int x_249 = p.y;
+        map[(x_247 + (x_249 * 16))] = 1;
+        const int x_254 = p.x;
+        const int x_257 = p.y;
+        map[((x_254 - 1) + (x_257 * 16))] = 1;
+        const int x_262 = p.x;
+        const int x_265 = p.y;
+        map[((x_262 - 2) + (x_265 * 16))] = 1;
+        const int x_270 = p.x;
+        p.x = (x_270 - 2);
+      }
+      const bool x_274 = (d >= 0);
+      x_280_phi = x_274;
+      if (x_274) {
+        const int x_278 = p.y;
+        x_279 = (x_278 > 0);
+        x_280_phi = x_279;
+      }
+      const bool x_280 = x_280_phi;
+      x_293_phi = x_280;
+      if (x_280) {
+        const int x_284 = p.x;
+        const int x_286 = p.y;
+        const int x_291 = map[(x_284 + ((x_286 - 2) * 16))];
+        x_292 = (x_291 == 0);
+        x_293_phi = x_292;
+      }
+      if (x_293_phi) {
+        d = (d - 1);
+        const int x_299 = p.x;
+        const int x_301 = p.y;
+        map[(x_299 + (x_301 * 16))] = 1;
+        const int x_306 = p.x;
+        const int x_308 = p.y;
+        map[(x_306 + ((x_308 - 1) * 16))] = 1;
+        const int x_314 = p.x;
+        const int x_316 = p.y;
+        map[(x_314 + ((x_316 - 2) * 16))] = 1;
+        const int x_322 = p.y;
+        p.y = (x_322 - 2);
+      }
+      const bool x_326 = (d >= 0);
+      x_332_phi = x_326;
+      if (x_326) {
+        const int x_330 = p.x;
+        x_331 = (x_330 < 14);
+        x_332_phi = x_331;
+      }
+      const bool x_332 = x_332_phi;
+      x_345_phi = x_332;
+      if (x_332) {
+        const int x_336 = p.x;
+        const int x_339 = p.y;
+        const int x_343 = map[((x_336 + 2) + (x_339 * 16))];
+        x_344 = (x_343 == 0);
+        x_345_phi = x_344;
+      }
+      if (x_345_phi) {
+        d = (d - 1);
+        const int x_351 = p.x;
+        const int x_353 = p.y;
+        map[(x_351 + (x_353 * 16))] = 1;
+        const int x_358 = p.x;
+        const int x_361 = p.y;
+        map[((x_358 + 1) + (x_361 * 16))] = 1;
+        const int x_366 = p.x;
+        const int x_369 = p.y;
+        map[((x_366 + 2) + (x_369 * 16))] = 1;
+        const int x_374 = p.x;
+        p.x = (x_374 + 2);
+      }
+      const bool x_378 = (d >= 0);
+      x_384_phi = x_378;
+      if (x_378) {
+        const int x_382 = p.y;
+        x_383 = (x_382 < 14);
+        x_384_phi = x_383;
+      }
+      const bool x_384 = x_384_phi;
+      x_397_phi = x_384;
+      if (x_384) {
+        const int x_388 = p.x;
+        const int x_390 = p.y;
+        const int x_395 = map[(x_388 + ((x_390 + 2) * 16))];
+        x_396 = (x_395 == 0);
+        x_397_phi = x_396;
+      }
+      if (x_397_phi) {
+        d = (d - 1);
+        const int x_403 = p.x;
+        const int x_405 = p.y;
+        map[(x_403 + (x_405 * 16))] = 1;
+        const int x_410 = p.x;
+        const int x_412 = p.y;
+        map[(x_410 + ((x_412 + 1) * 16))] = 1;
+        const int x_418 = p.x;
+        const int x_420 = p.y;
+        map[(x_418 + ((x_420 + 2) * 16))] = 1;
+        const int x_426 = p.y;
+        p.y = (x_426 + 2);
+      }
+    }
+    const int x_430 = ipos.y;
+    const int x_433 = ipos.x;
+    const int x_436 = map[((x_430 * 16) + x_433)];
+    if ((x_436 == 1)) {
+      x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+      return;
+    }
+    {
+      if (canwalk) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_GLF_color = float4(0.0f, 0.0f, 0.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-access-chains/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-access-chains/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..e1df0f2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-access-chains/0-opt.spvasm.expected.msl
@@ -0,0 +1,347 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  int arr[256];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_5, thread tint_array_wrapper* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  float2 pos = 0.0f;
+  int2 ipos = 0;
+  int i = 0;
+  int2 p = 0;
+  bool canwalk = false;
+  int v = 0;
+  int directions = 0;
+  int j = 0;
+  int d = 0;
+  float4 const x_57 = *(tint_symbol_5);
+  float2 const x_60 = x_7.resolution;
+  pos = (float2(x_57.x, x_57.y) / x_60);
+  float const x_63 = pos.x;
+  float const x_67 = pos.y;
+  ipos = int2(int((x_63 * 16.0f)), int((x_67 * 16.0f)));
+  i = 0;
+  while (true) {
+    int const x_75 = i;
+    if ((x_75 < 256)) {
+    } else {
+      break;
+    }
+    int const x_78 = i;
+    (*(tint_symbol_6)).arr[x_78] = 0;
+    {
+      int const x_80 = i;
+      i = (x_80 + 1);
+    }
+  }
+  p = int2(0, 0);
+  canwalk = true;
+  v = 0;
+  while (true) {
+    bool x_102 = false;
+    bool x_122 = false;
+    bool x_142 = false;
+    bool x_162 = false;
+    bool x_103_phi = false;
+    bool x_123_phi = false;
+    bool x_143_phi = false;
+    bool x_163_phi = false;
+    int const x_86 = v;
+    v = (x_86 + 1);
+    directions = 0;
+    int const x_89 = p.x;
+    bool const x_90 = (x_89 > 0);
+    x_103_phi = x_90;
+    if (x_90) {
+      int const x_94 = p.x;
+      int const x_97 = p.y;
+      int const x_101 = (*(tint_symbol_6)).arr[((x_94 - 2) + (x_97 * 16))];
+      x_102 = (x_101 == 0);
+      x_103_phi = x_102;
+    }
+    bool const x_103 = x_103_phi;
+    if (x_103) {
+      int const x_106 = directions;
+      directions = (x_106 + 1);
+    }
+    int const x_109 = p.y;
+    bool const x_110 = (x_109 > 0);
+    x_123_phi = x_110;
+    if (x_110) {
+      int const x_114 = p.x;
+      int const x_116 = p.y;
+      int const x_121 = (*(tint_symbol_6)).arr[(x_114 + ((x_116 - 2) * 16))];
+      x_122 = (x_121 == 0);
+      x_123_phi = x_122;
+    }
+    bool const x_123 = x_123_phi;
+    if (x_123) {
+      int const x_126 = directions;
+      directions = (x_126 + 1);
+    }
+    int const x_129 = p.x;
+    bool const x_130 = (x_129 < 14);
+    x_143_phi = x_130;
+    if (x_130) {
+      int const x_134 = p.x;
+      int const x_137 = p.y;
+      int const x_141 = (*(tint_symbol_6)).arr[((x_134 + 2) + (x_137 * 16))];
+      x_142 = (x_141 == 0);
+      x_143_phi = x_142;
+    }
+    bool const x_143 = x_143_phi;
+    if (x_143) {
+      int const x_146 = directions;
+      directions = (x_146 + 1);
+    }
+    int const x_149 = p.y;
+    bool const x_150 = (x_149 < 14);
+    x_163_phi = x_150;
+    if (x_150) {
+      int const x_154 = p.x;
+      int const x_156 = p.y;
+      int const x_161 = (*(tint_symbol_6)).arr[(x_154 + ((x_156 + 2) * 16))];
+      x_162 = (x_161 == 0);
+      x_163_phi = x_162;
+    }
+    bool const x_163 = x_163_phi;
+    if (x_163) {
+      int const x_166 = directions;
+      directions = (x_166 + 1);
+    }
+    bool x_227 = false;
+    bool x_240 = false;
+    bool x_279 = false;
+    bool x_292 = false;
+    bool x_331 = false;
+    bool x_344 = false;
+    bool x_383 = false;
+    bool x_396 = false;
+    bool x_228_phi = false;
+    bool x_241_phi = false;
+    bool x_280_phi = false;
+    bool x_293_phi = false;
+    bool x_332_phi = false;
+    bool x_345_phi = false;
+    bool x_384_phi = false;
+    bool x_397_phi = false;
+    int const x_168 = directions;
+    if ((x_168 == 0)) {
+      canwalk = false;
+      i = 0;
+      while (true) {
+        int const x_177 = i;
+        if ((x_177 < 8)) {
+        } else {
+          break;
+        }
+        j = 0;
+        while (true) {
+          int const x_184 = j;
+          if ((x_184 < 8)) {
+          } else {
+            break;
+          }
+          int const x_187 = j;
+          int const x_189 = i;
+          int const x_194 = (*(tint_symbol_6)).arr[((x_187 * 2) + ((x_189 * 2) * 16))];
+          if ((x_194 == 0)) {
+            int const x_198 = j;
+            p.x = (x_198 * 2);
+            int const x_201 = i;
+            p.y = (x_201 * 2);
+            canwalk = true;
+          }
+          {
+            int const x_204 = j;
+            j = (x_204 + 1);
+          }
+        }
+        {
+          int const x_206 = i;
+          i = (x_206 + 1);
+        }
+      }
+      int const x_209 = p.x;
+      int const x_211 = p.y;
+      (*(tint_symbol_6)).arr[(x_209 + (x_211 * 16))] = 1;
+    } else {
+      int const x_215 = v;
+      int const x_216 = directions;
+      d = (x_215 % x_216);
+      int const x_218 = directions;
+      int const x_219 = v;
+      v = (x_219 + x_218);
+      int const x_221 = d;
+      bool const x_222 = (x_221 >= 0);
+      x_228_phi = x_222;
+      if (x_222) {
+        int const x_226 = p.x;
+        x_227 = (x_226 > 0);
+        x_228_phi = x_227;
+      }
+      bool const x_228 = x_228_phi;
+      x_241_phi = x_228;
+      if (x_228) {
+        int const x_232 = p.x;
+        int const x_235 = p.y;
+        int const x_239 = (*(tint_symbol_6)).arr[((x_232 - 2) + (x_235 * 16))];
+        x_240 = (x_239 == 0);
+        x_241_phi = x_240;
+      }
+      bool const x_241 = x_241_phi;
+      if (x_241) {
+        int const x_244 = d;
+        d = (x_244 - 1);
+        int const x_247 = p.x;
+        int const x_249 = p.y;
+        (*(tint_symbol_6)).arr[(x_247 + (x_249 * 16))] = 1;
+        int const x_254 = p.x;
+        int const x_257 = p.y;
+        (*(tint_symbol_6)).arr[((x_254 - 1) + (x_257 * 16))] = 1;
+        int const x_262 = p.x;
+        int const x_265 = p.y;
+        (*(tint_symbol_6)).arr[((x_262 - 2) + (x_265 * 16))] = 1;
+        int const x_270 = p.x;
+        p.x = (x_270 - 2);
+      }
+      int const x_273 = d;
+      bool const x_274 = (x_273 >= 0);
+      x_280_phi = x_274;
+      if (x_274) {
+        int const x_278 = p.y;
+        x_279 = (x_278 > 0);
+        x_280_phi = x_279;
+      }
+      bool const x_280 = x_280_phi;
+      x_293_phi = x_280;
+      if (x_280) {
+        int const x_284 = p.x;
+        int const x_286 = p.y;
+        int const x_291 = (*(tint_symbol_6)).arr[(x_284 + ((x_286 - 2) * 16))];
+        x_292 = (x_291 == 0);
+        x_293_phi = x_292;
+      }
+      bool const x_293 = x_293_phi;
+      if (x_293) {
+        int const x_296 = d;
+        d = (x_296 - 1);
+        int const x_299 = p.x;
+        int const x_301 = p.y;
+        (*(tint_symbol_6)).arr[(x_299 + (x_301 * 16))] = 1;
+        int const x_306 = p.x;
+        int const x_308 = p.y;
+        (*(tint_symbol_6)).arr[(x_306 + ((x_308 - 1) * 16))] = 1;
+        int const x_314 = p.x;
+        int const x_316 = p.y;
+        (*(tint_symbol_6)).arr[(x_314 + ((x_316 - 2) * 16))] = 1;
+        int const x_322 = p.y;
+        p.y = (x_322 - 2);
+      }
+      int const x_325 = d;
+      bool const x_326 = (x_325 >= 0);
+      x_332_phi = x_326;
+      if (x_326) {
+        int const x_330 = p.x;
+        x_331 = (x_330 < 14);
+        x_332_phi = x_331;
+      }
+      bool const x_332 = x_332_phi;
+      x_345_phi = x_332;
+      if (x_332) {
+        int const x_336 = p.x;
+        int const x_339 = p.y;
+        int const x_343 = (*(tint_symbol_6)).arr[((x_336 + 2) + (x_339 * 16))];
+        x_344 = (x_343 == 0);
+        x_345_phi = x_344;
+      }
+      bool const x_345 = x_345_phi;
+      if (x_345) {
+        int const x_348 = d;
+        d = (x_348 - 1);
+        int const x_351 = p.x;
+        int const x_353 = p.y;
+        (*(tint_symbol_6)).arr[(x_351 + (x_353 * 16))] = 1;
+        int const x_358 = p.x;
+        int const x_361 = p.y;
+        (*(tint_symbol_6)).arr[((x_358 + 1) + (x_361 * 16))] = 1;
+        int const x_366 = p.x;
+        int const x_369 = p.y;
+        (*(tint_symbol_6)).arr[((x_366 + 2) + (x_369 * 16))] = 1;
+        int const x_374 = p.x;
+        p.x = (x_374 + 2);
+      }
+      int const x_377 = d;
+      bool const x_378 = (x_377 >= 0);
+      x_384_phi = x_378;
+      if (x_378) {
+        int const x_382 = p.y;
+        x_383 = (x_382 < 14);
+        x_384_phi = x_383;
+      }
+      bool const x_384 = x_384_phi;
+      x_397_phi = x_384;
+      if (x_384) {
+        int const x_388 = p.x;
+        int const x_390 = p.y;
+        int const x_395 = (*(tint_symbol_6)).arr[(x_388 + ((x_390 + 2) * 16))];
+        x_396 = (x_395 == 0);
+        x_397_phi = x_396;
+      }
+      bool const x_397 = x_397_phi;
+      if (x_397) {
+        int const x_400 = d;
+        d = (x_400 - 1);
+        int const x_403 = p.x;
+        int const x_405 = p.y;
+        (*(tint_symbol_6)).arr[(x_403 + (x_405 * 16))] = 1;
+        int const x_410 = p.x;
+        int const x_412 = p.y;
+        (*(tint_symbol_6)).arr[(x_410 + ((x_412 + 1) * 16))] = 1;
+        int const x_418 = p.x;
+        int const x_420 = p.y;
+        (*(tint_symbol_6)).arr[(x_418 + ((x_420 + 2) * 16))] = 1;
+        int const x_426 = p.y;
+        p.y = (x_426 + 2);
+      }
+    }
+    int const x_430 = ipos.y;
+    int const x_433 = ipos.x;
+    int const x_436 = (*(tint_symbol_6)).arr[((x_430 * 16) + x_433)];
+    if ((x_436 == 1)) {
+      *(tint_symbol_7) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+      return;
+    }
+    {
+      bool const x_440 = canwalk;
+      if (x_440) {
+      } else {
+        break;
+      }
+    }
+  }
+  *(tint_symbol_7) = float4(0.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread tint_array_wrapper tint_symbol_9 = {};
+  thread float4 tint_symbol_10 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_7, &(tint_symbol_8), &(tint_symbol_9), &(tint_symbol_10));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_10};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-access-chains/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-access-chains/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..4613f9f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-access-chains/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,775 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 509
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_7 "x_7"
+               OpName %map "map"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %pos "pos"
+               OpName %ipos "ipos"
+               OpName %i "i"
+               OpName %p "p"
+               OpName %canwalk "canwalk"
+               OpName %v "v"
+               OpName %directions "directions"
+               OpName %j "j"
+               OpName %d "d"
+               OpName %x_102 "x_102"
+               OpName %x_122 "x_122"
+               OpName %x_142 "x_142"
+               OpName %x_162 "x_162"
+               OpName %x_103_phi "x_103_phi"
+               OpName %x_123_phi "x_123_phi"
+               OpName %x_143_phi "x_143_phi"
+               OpName %x_163_phi "x_163_phi"
+               OpName %x_227 "x_227"
+               OpName %x_240 "x_240"
+               OpName %x_279 "x_279"
+               OpName %x_292 "x_292"
+               OpName %x_331 "x_331"
+               OpName %x_344 "x_344"
+               OpName %x_383 "x_383"
+               OpName %x_396 "x_396"
+               OpName %x_228_phi "x_228_phi"
+               OpName %x_241_phi "x_241_phi"
+               OpName %x_280_phi "x_280_phi"
+               OpName %x_293_phi "x_293_phi"
+               OpName %x_332_phi "x_332_phi"
+               OpName %x_345_phi "x_345_phi"
+               OpName %x_384_phi "x_384_phi"
+               OpName %x_397_phi "x_397_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %_arr_int_uint_256 ArrayStride 4
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+   %uint_256 = OpConstant %uint 256
+%_arr_int_uint_256 = OpTypeArray %int %uint_256
+%_ptr_Private__arr_int_uint_256 = OpTypePointer Private %_arr_int_uint_256
+         %16 = OpConstantNull %_arr_int_uint_256
+        %map = OpVariable %_ptr_Private__arr_int_uint_256 Private %16
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %22 = OpTypeFunction %void
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %28 = OpConstantNull %v2float
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %32 = OpConstantNull %v2int
+%_ptr_Function_int = OpTypePointer Function %int
+         %35 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %40 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+   %float_16 = OpConstant %float 16
+      %int_0 = OpConstant %int 0
+    %int_256 = OpConstant %int 256
+%_ptr_Private_int = OpTypePointer Private %int
+      %int_1 = OpConstant %int 1
+         %83 = OpConstantComposite %v2int %int_0 %int_0
+       %true = OpConstantTrue %bool
+      %int_2 = OpConstant %int 2
+     %int_16 = OpConstant %int 16
+     %int_14 = OpConstant %int 14
+      %false = OpConstantFalse %bool
+      %int_8 = OpConstant %int 8
+    %float_1 = OpConstant %float 1
+        %489 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+    %float_0 = OpConstant %float 0
+        %495 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %496 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %22
+         %25 = OpLabel
+        %pos = OpVariable %_ptr_Function_v2float Function %28
+       %ipos = OpVariable %_ptr_Function_v2int Function %32
+          %i = OpVariable %_ptr_Function_int Function %35
+          %p = OpVariable %_ptr_Function_v2int Function %32
+    %canwalk = OpVariable %_ptr_Function_bool Function %40
+          %v = OpVariable %_ptr_Function_int Function %35
+ %directions = OpVariable %_ptr_Function_int Function %35
+          %j = OpVariable %_ptr_Function_int Function %35
+          %d = OpVariable %_ptr_Function_int Function %35
+      %x_102 = OpVariable %_ptr_Function_bool Function %40
+      %x_122 = OpVariable %_ptr_Function_bool Function %40
+      %x_142 = OpVariable %_ptr_Function_bool Function %40
+      %x_162 = OpVariable %_ptr_Function_bool Function %40
+  %x_103_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_123_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_143_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_163_phi = OpVariable %_ptr_Function_bool Function %40
+      %x_227 = OpVariable %_ptr_Function_bool Function %40
+      %x_240 = OpVariable %_ptr_Function_bool Function %40
+      %x_279 = OpVariable %_ptr_Function_bool Function %40
+      %x_292 = OpVariable %_ptr_Function_bool Function %40
+      %x_331 = OpVariable %_ptr_Function_bool Function %40
+      %x_344 = OpVariable %_ptr_Function_bool Function %40
+      %x_383 = OpVariable %_ptr_Function_bool Function %40
+      %x_396 = OpVariable %_ptr_Function_bool Function %40
+  %x_228_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_241_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_280_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_293_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_332_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_345_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_384_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_397_phi = OpVariable %_ptr_Function_bool Function %40
+         %45 = OpLoad %v4float %gl_FragCoord
+         %48 = OpAccessChain %_ptr_Uniform_v2float %x_7 %uint_0
+         %49 = OpLoad %v2float %48
+         %50 = OpCompositeExtract %float %45 0
+         %51 = OpCompositeExtract %float %45 1
+         %52 = OpCompositeConstruct %v2float %50 %51
+         %53 = OpFDiv %v2float %52 %49
+               OpStore %pos %53
+         %55 = OpAccessChain %_ptr_Function_float %pos %uint_0
+         %56 = OpLoad %float %55
+         %58 = OpAccessChain %_ptr_Function_float %pos %uint_1
+         %59 = OpLoad %float %58
+         %62 = OpFMul %float %56 %float_16
+         %60 = OpConvertFToS %int %62
+         %64 = OpFMul %float %59 %float_16
+         %63 = OpConvertFToS %int %64
+         %65 = OpCompositeConstruct %v2int %60 %63
+               OpStore %ipos %65
+               OpStore %i %int_0
+               OpBranch %67
+         %67 = OpLabel
+               OpLoopMerge %68 %69 None
+               OpBranch %70
+         %70 = OpLabel
+         %71 = OpLoad %int %i
+         %73 = OpSLessThan %bool %71 %int_256
+               OpSelectionMerge %74 None
+               OpBranchConditional %73 %75 %76
+         %75 = OpLabel
+               OpBranch %74
+         %76 = OpLabel
+               OpBranch %68
+         %74 = OpLabel
+         %77 = OpLoad %int %i
+         %79 = OpAccessChain %_ptr_Private_int %map %77
+               OpStore %79 %int_0
+               OpBranch %69
+         %69 = OpLabel
+         %80 = OpLoad %int %i
+         %82 = OpIAdd %int %80 %int_1
+               OpStore %i %82
+               OpBranch %67
+         %68 = OpLabel
+               OpStore %p %83
+               OpStore %canwalk %true
+               OpStore %v %int_0
+               OpBranch %85
+         %85 = OpLabel
+               OpLoopMerge %86 %87 None
+               OpBranch %88
+         %88 = OpLabel
+         %97 = OpLoad %int %v
+         %98 = OpIAdd %int %97 %int_1
+               OpStore %v %98
+               OpStore %directions %int_0
+         %99 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %100 = OpLoad %int %99
+        %101 = OpSGreaterThan %bool %100 %int_0
+               OpStore %x_103_phi %101
+               OpSelectionMerge %102 None
+               OpBranchConditional %101 %103 %102
+        %103 = OpLabel
+        %104 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %105 = OpLoad %int %104
+        %106 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %107 = OpLoad %int %106
+        %109 = OpISub %int %105 %int_2
+        %111 = OpIMul %int %107 %int_16
+        %112 = OpIAdd %int %109 %111
+        %113 = OpAccessChain %_ptr_Private_int %map %112
+        %114 = OpLoad %int %113
+        %115 = OpIEqual %bool %114 %int_0
+               OpStore %x_102 %115
+        %116 = OpLoad %bool %x_102
+               OpStore %x_103_phi %116
+               OpBranch %102
+        %102 = OpLabel
+        %117 = OpLoad %bool %x_103_phi
+               OpSelectionMerge %118 None
+               OpBranchConditional %117 %119 %118
+        %119 = OpLabel
+        %120 = OpLoad %int %directions
+        %121 = OpIAdd %int %120 %int_1
+               OpStore %directions %121
+               OpBranch %118
+        %118 = OpLabel
+        %122 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %123 = OpLoad %int %122
+        %124 = OpSGreaterThan %bool %123 %int_0
+               OpStore %x_123_phi %124
+               OpSelectionMerge %125 None
+               OpBranchConditional %124 %126 %125
+        %126 = OpLabel
+        %127 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %128 = OpLoad %int %127
+        %129 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %130 = OpLoad %int %129
+        %131 = OpISub %int %130 %int_2
+        %132 = OpIMul %int %131 %int_16
+        %133 = OpIAdd %int %128 %132
+        %134 = OpAccessChain %_ptr_Private_int %map %133
+        %135 = OpLoad %int %134
+        %136 = OpIEqual %bool %135 %int_0
+               OpStore %x_122 %136
+        %137 = OpLoad %bool %x_122
+               OpStore %x_123_phi %137
+               OpBranch %125
+        %125 = OpLabel
+        %138 = OpLoad %bool %x_123_phi
+               OpSelectionMerge %139 None
+               OpBranchConditional %138 %140 %139
+        %140 = OpLabel
+        %141 = OpLoad %int %directions
+        %142 = OpIAdd %int %141 %int_1
+               OpStore %directions %142
+               OpBranch %139
+        %139 = OpLabel
+        %143 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %144 = OpLoad %int %143
+        %146 = OpSLessThan %bool %144 %int_14
+               OpStore %x_143_phi %146
+               OpSelectionMerge %147 None
+               OpBranchConditional %146 %148 %147
+        %148 = OpLabel
+        %149 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %150 = OpLoad %int %149
+        %151 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %152 = OpLoad %int %151
+        %153 = OpIAdd %int %150 %int_2
+        %154 = OpIMul %int %152 %int_16
+        %155 = OpIAdd %int %153 %154
+        %156 = OpAccessChain %_ptr_Private_int %map %155
+        %157 = OpLoad %int %156
+        %158 = OpIEqual %bool %157 %int_0
+               OpStore %x_142 %158
+        %159 = OpLoad %bool %x_142
+               OpStore %x_143_phi %159
+               OpBranch %147
+        %147 = OpLabel
+        %160 = OpLoad %bool %x_143_phi
+               OpSelectionMerge %161 None
+               OpBranchConditional %160 %162 %161
+        %162 = OpLabel
+        %163 = OpLoad %int %directions
+        %164 = OpIAdd %int %163 %int_1
+               OpStore %directions %164
+               OpBranch %161
+        %161 = OpLabel
+        %165 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %166 = OpLoad %int %165
+        %167 = OpSLessThan %bool %166 %int_14
+               OpStore %x_163_phi %167
+               OpSelectionMerge %168 None
+               OpBranchConditional %167 %169 %168
+        %169 = OpLabel
+        %170 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %171 = OpLoad %int %170
+        %172 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %173 = OpLoad %int %172
+        %174 = OpIAdd %int %173 %int_2
+        %175 = OpIMul %int %174 %int_16
+        %176 = OpIAdd %int %171 %175
+        %177 = OpAccessChain %_ptr_Private_int %map %176
+        %178 = OpLoad %int %177
+        %179 = OpIEqual %bool %178 %int_0
+               OpStore %x_162 %179
+        %180 = OpLoad %bool %x_162
+               OpStore %x_163_phi %180
+               OpBranch %168
+        %168 = OpLabel
+        %181 = OpLoad %bool %x_163_phi
+               OpSelectionMerge %182 None
+               OpBranchConditional %181 %183 %182
+        %183 = OpLabel
+        %184 = OpLoad %int %directions
+        %185 = OpIAdd %int %184 %int_1
+               OpStore %directions %185
+               OpBranch %182
+        %182 = OpLabel
+        %202 = OpLoad %int %directions
+        %203 = OpIEqual %bool %202 %int_0
+               OpSelectionMerge %204 None
+               OpBranchConditional %203 %205 %206
+        %205 = OpLabel
+               OpStore %canwalk %false
+               OpStore %i %int_0
+               OpBranch %208
+        %208 = OpLabel
+               OpLoopMerge %209 %210 None
+               OpBranch %211
+        %211 = OpLabel
+        %212 = OpLoad %int %i
+        %214 = OpSLessThan %bool %212 %int_8
+               OpSelectionMerge %215 None
+               OpBranchConditional %214 %216 %217
+        %216 = OpLabel
+               OpBranch %215
+        %217 = OpLabel
+               OpBranch %209
+        %215 = OpLabel
+               OpStore %j %int_0
+               OpBranch %218
+        %218 = OpLabel
+               OpLoopMerge %219 %220 None
+               OpBranch %221
+        %221 = OpLabel
+        %222 = OpLoad %int %j
+        %223 = OpSLessThan %bool %222 %int_8
+               OpSelectionMerge %224 None
+               OpBranchConditional %223 %225 %226
+        %225 = OpLabel
+               OpBranch %224
+        %226 = OpLabel
+               OpBranch %219
+        %224 = OpLabel
+        %227 = OpLoad %int %j
+        %228 = OpLoad %int %i
+        %229 = OpIMul %int %227 %int_2
+        %230 = OpIMul %int %228 %int_2
+        %231 = OpIMul %int %230 %int_16
+        %232 = OpIAdd %int %229 %231
+        %233 = OpAccessChain %_ptr_Private_int %map %232
+        %234 = OpLoad %int %233
+        %235 = OpIEqual %bool %234 %int_0
+               OpSelectionMerge %236 None
+               OpBranchConditional %235 %237 %236
+        %237 = OpLabel
+        %238 = OpLoad %int %j
+        %239 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %240 = OpIMul %int %238 %int_2
+               OpStore %239 %240
+        %241 = OpLoad %int %i
+        %242 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %243 = OpIMul %int %241 %int_2
+               OpStore %242 %243
+               OpStore %canwalk %true
+               OpBranch %236
+        %236 = OpLabel
+               OpBranch %220
+        %220 = OpLabel
+        %244 = OpLoad %int %j
+        %245 = OpIAdd %int %244 %int_1
+               OpStore %j %245
+               OpBranch %218
+        %219 = OpLabel
+               OpBranch %210
+        %210 = OpLabel
+        %246 = OpLoad %int %i
+        %247 = OpIAdd %int %246 %int_1
+               OpStore %i %247
+               OpBranch %208
+        %209 = OpLabel
+        %248 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %249 = OpLoad %int %248
+        %250 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %251 = OpLoad %int %250
+        %252 = OpIMul %int %251 %int_16
+        %253 = OpIAdd %int %249 %252
+        %254 = OpAccessChain %_ptr_Private_int %map %253
+               OpStore %254 %int_1
+               OpBranch %204
+        %206 = OpLabel
+        %255 = OpLoad %int %v
+        %256 = OpLoad %int %directions
+        %257 = OpSMod %int %255 %256
+               OpStore %d %257
+        %258 = OpLoad %int %directions
+        %259 = OpLoad %int %v
+        %260 = OpIAdd %int %259 %258
+               OpStore %v %260
+        %261 = OpLoad %int %d
+        %262 = OpSGreaterThanEqual %bool %261 %int_0
+               OpStore %x_228_phi %262
+               OpSelectionMerge %263 None
+               OpBranchConditional %262 %264 %263
+        %264 = OpLabel
+        %265 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %266 = OpLoad %int %265
+        %267 = OpSGreaterThan %bool %266 %int_0
+               OpStore %x_227 %267
+        %268 = OpLoad %bool %x_227
+               OpStore %x_228_phi %268
+               OpBranch %263
+        %263 = OpLabel
+        %269 = OpLoad %bool %x_228_phi
+               OpStore %x_241_phi %269
+               OpSelectionMerge %270 None
+               OpBranchConditional %269 %271 %270
+        %271 = OpLabel
+        %272 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %273 = OpLoad %int %272
+        %274 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %275 = OpLoad %int %274
+        %276 = OpISub %int %273 %int_2
+        %277 = OpIMul %int %275 %int_16
+        %278 = OpIAdd %int %276 %277
+        %279 = OpAccessChain %_ptr_Private_int %map %278
+        %280 = OpLoad %int %279
+        %281 = OpIEqual %bool %280 %int_0
+               OpStore %x_240 %281
+        %282 = OpLoad %bool %x_240
+               OpStore %x_241_phi %282
+               OpBranch %270
+        %270 = OpLabel
+        %283 = OpLoad %bool %x_241_phi
+               OpSelectionMerge %284 None
+               OpBranchConditional %283 %285 %284
+        %285 = OpLabel
+        %286 = OpLoad %int %d
+        %287 = OpISub %int %286 %int_1
+               OpStore %d %287
+        %288 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %289 = OpLoad %int %288
+        %290 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %291 = OpLoad %int %290
+        %292 = OpIMul %int %291 %int_16
+        %293 = OpIAdd %int %289 %292
+        %294 = OpAccessChain %_ptr_Private_int %map %293
+               OpStore %294 %int_1
+        %295 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %296 = OpLoad %int %295
+        %297 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %298 = OpLoad %int %297
+        %299 = OpISub %int %296 %int_1
+        %300 = OpIMul %int %298 %int_16
+        %301 = OpIAdd %int %299 %300
+        %302 = OpAccessChain %_ptr_Private_int %map %301
+               OpStore %302 %int_1
+        %303 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %304 = OpLoad %int %303
+        %305 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %306 = OpLoad %int %305
+        %307 = OpISub %int %304 %int_2
+        %308 = OpIMul %int %306 %int_16
+        %309 = OpIAdd %int %307 %308
+        %310 = OpAccessChain %_ptr_Private_int %map %309
+               OpStore %310 %int_1
+        %311 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %312 = OpLoad %int %311
+        %313 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %314 = OpISub %int %312 %int_2
+               OpStore %313 %314
+               OpBranch %284
+        %284 = OpLabel
+        %315 = OpLoad %int %d
+        %316 = OpSGreaterThanEqual %bool %315 %int_0
+               OpStore %x_280_phi %316
+               OpSelectionMerge %317 None
+               OpBranchConditional %316 %318 %317
+        %318 = OpLabel
+        %319 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %320 = OpLoad %int %319
+        %321 = OpSGreaterThan %bool %320 %int_0
+               OpStore %x_279 %321
+        %322 = OpLoad %bool %x_279
+               OpStore %x_280_phi %322
+               OpBranch %317
+        %317 = OpLabel
+        %323 = OpLoad %bool %x_280_phi
+               OpStore %x_293_phi %323
+               OpSelectionMerge %324 None
+               OpBranchConditional %323 %325 %324
+        %325 = OpLabel
+        %326 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %327 = OpLoad %int %326
+        %328 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %329 = OpLoad %int %328
+        %330 = OpISub %int %329 %int_2
+        %331 = OpIMul %int %330 %int_16
+        %332 = OpIAdd %int %327 %331
+        %333 = OpAccessChain %_ptr_Private_int %map %332
+        %334 = OpLoad %int %333
+        %335 = OpIEqual %bool %334 %int_0
+               OpStore %x_292 %335
+        %336 = OpLoad %bool %x_292
+               OpStore %x_293_phi %336
+               OpBranch %324
+        %324 = OpLabel
+        %337 = OpLoad %bool %x_293_phi
+               OpSelectionMerge %338 None
+               OpBranchConditional %337 %339 %338
+        %339 = OpLabel
+        %340 = OpLoad %int %d
+        %341 = OpISub %int %340 %int_1
+               OpStore %d %341
+        %342 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %343 = OpLoad %int %342
+        %344 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %345 = OpLoad %int %344
+        %346 = OpIMul %int %345 %int_16
+        %347 = OpIAdd %int %343 %346
+        %348 = OpAccessChain %_ptr_Private_int %map %347
+               OpStore %348 %int_1
+        %349 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %350 = OpLoad %int %349
+        %351 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %352 = OpLoad %int %351
+        %353 = OpISub %int %352 %int_1
+        %354 = OpIMul %int %353 %int_16
+        %355 = OpIAdd %int %350 %354
+        %356 = OpAccessChain %_ptr_Private_int %map %355
+               OpStore %356 %int_1
+        %357 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %358 = OpLoad %int %357
+        %359 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %360 = OpLoad %int %359
+        %361 = OpISub %int %360 %int_2
+        %362 = OpIMul %int %361 %int_16
+        %363 = OpIAdd %int %358 %362
+        %364 = OpAccessChain %_ptr_Private_int %map %363
+               OpStore %364 %int_1
+        %365 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %366 = OpLoad %int %365
+        %367 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %368 = OpISub %int %366 %int_2
+               OpStore %367 %368
+               OpBranch %338
+        %338 = OpLabel
+        %369 = OpLoad %int %d
+        %370 = OpSGreaterThanEqual %bool %369 %int_0
+               OpStore %x_332_phi %370
+               OpSelectionMerge %371 None
+               OpBranchConditional %370 %372 %371
+        %372 = OpLabel
+        %373 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %374 = OpLoad %int %373
+        %375 = OpSLessThan %bool %374 %int_14
+               OpStore %x_331 %375
+        %376 = OpLoad %bool %x_331
+               OpStore %x_332_phi %376
+               OpBranch %371
+        %371 = OpLabel
+        %377 = OpLoad %bool %x_332_phi
+               OpStore %x_345_phi %377
+               OpSelectionMerge %378 None
+               OpBranchConditional %377 %379 %378
+        %379 = OpLabel
+        %380 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %381 = OpLoad %int %380
+        %382 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %383 = OpLoad %int %382
+        %384 = OpIAdd %int %381 %int_2
+        %385 = OpIMul %int %383 %int_16
+        %386 = OpIAdd %int %384 %385
+        %387 = OpAccessChain %_ptr_Private_int %map %386
+        %388 = OpLoad %int %387
+        %389 = OpIEqual %bool %388 %int_0
+               OpStore %x_344 %389
+        %390 = OpLoad %bool %x_344
+               OpStore %x_345_phi %390
+               OpBranch %378
+        %378 = OpLabel
+        %391 = OpLoad %bool %x_345_phi
+               OpSelectionMerge %392 None
+               OpBranchConditional %391 %393 %392
+        %393 = OpLabel
+        %394 = OpLoad %int %d
+        %395 = OpISub %int %394 %int_1
+               OpStore %d %395
+        %396 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %397 = OpLoad %int %396
+        %398 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %399 = OpLoad %int %398
+        %400 = OpIMul %int %399 %int_16
+        %401 = OpIAdd %int %397 %400
+        %402 = OpAccessChain %_ptr_Private_int %map %401
+               OpStore %402 %int_1
+        %403 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %404 = OpLoad %int %403
+        %405 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %406 = OpLoad %int %405
+        %407 = OpIAdd %int %404 %int_1
+        %408 = OpIMul %int %406 %int_16
+        %409 = OpIAdd %int %407 %408
+        %410 = OpAccessChain %_ptr_Private_int %map %409
+               OpStore %410 %int_1
+        %411 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %412 = OpLoad %int %411
+        %413 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %414 = OpLoad %int %413
+        %415 = OpIAdd %int %412 %int_2
+        %416 = OpIMul %int %414 %int_16
+        %417 = OpIAdd %int %415 %416
+        %418 = OpAccessChain %_ptr_Private_int %map %417
+               OpStore %418 %int_1
+        %419 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %420 = OpLoad %int %419
+        %421 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %422 = OpIAdd %int %420 %int_2
+               OpStore %421 %422
+               OpBranch %392
+        %392 = OpLabel
+        %423 = OpLoad %int %d
+        %424 = OpSGreaterThanEqual %bool %423 %int_0
+               OpStore %x_384_phi %424
+               OpSelectionMerge %425 None
+               OpBranchConditional %424 %426 %425
+        %426 = OpLabel
+        %427 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %428 = OpLoad %int %427
+        %429 = OpSLessThan %bool %428 %int_14
+               OpStore %x_383 %429
+        %430 = OpLoad %bool %x_383
+               OpStore %x_384_phi %430
+               OpBranch %425
+        %425 = OpLabel
+        %431 = OpLoad %bool %x_384_phi
+               OpStore %x_397_phi %431
+               OpSelectionMerge %432 None
+               OpBranchConditional %431 %433 %432
+        %433 = OpLabel
+        %434 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %435 = OpLoad %int %434
+        %436 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %437 = OpLoad %int %436
+        %438 = OpIAdd %int %437 %int_2
+        %439 = OpIMul %int %438 %int_16
+        %440 = OpIAdd %int %435 %439
+        %441 = OpAccessChain %_ptr_Private_int %map %440
+        %442 = OpLoad %int %441
+        %443 = OpIEqual %bool %442 %int_0
+               OpStore %x_396 %443
+        %444 = OpLoad %bool %x_396
+               OpStore %x_397_phi %444
+               OpBranch %432
+        %432 = OpLabel
+        %445 = OpLoad %bool %x_397_phi
+               OpSelectionMerge %446 None
+               OpBranchConditional %445 %447 %446
+        %447 = OpLabel
+        %448 = OpLoad %int %d
+        %449 = OpISub %int %448 %int_1
+               OpStore %d %449
+        %450 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %451 = OpLoad %int %450
+        %452 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %453 = OpLoad %int %452
+        %454 = OpIMul %int %453 %int_16
+        %455 = OpIAdd %int %451 %454
+        %456 = OpAccessChain %_ptr_Private_int %map %455
+               OpStore %456 %int_1
+        %457 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %458 = OpLoad %int %457
+        %459 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %460 = OpLoad %int %459
+        %461 = OpIAdd %int %460 %int_1
+        %462 = OpIMul %int %461 %int_16
+        %463 = OpIAdd %int %458 %462
+        %464 = OpAccessChain %_ptr_Private_int %map %463
+               OpStore %464 %int_1
+        %465 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %466 = OpLoad %int %465
+        %467 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %468 = OpLoad %int %467
+        %469 = OpIAdd %int %468 %int_2
+        %470 = OpIMul %int %469 %int_16
+        %471 = OpIAdd %int %466 %470
+        %472 = OpAccessChain %_ptr_Private_int %map %471
+               OpStore %472 %int_1
+        %473 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %474 = OpLoad %int %473
+        %475 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %476 = OpIAdd %int %474 %int_2
+               OpStore %475 %476
+               OpBranch %446
+        %446 = OpLabel
+               OpBranch %204
+        %204 = OpLabel
+        %477 = OpAccessChain %_ptr_Function_int %ipos %uint_1
+        %478 = OpLoad %int %477
+        %479 = OpAccessChain %_ptr_Function_int %ipos %uint_0
+        %480 = OpLoad %int %479
+        %481 = OpIMul %int %478 %int_16
+        %482 = OpIAdd %int %481 %480
+        %483 = OpAccessChain %_ptr_Private_int %map %482
+        %484 = OpLoad %int %483
+        %485 = OpIEqual %bool %484 %int_1
+               OpSelectionMerge %486 None
+               OpBranchConditional %485 %487 %486
+        %487 = OpLabel
+               OpStore %x_GLF_color %489
+               OpReturn
+        %486 = OpLabel
+               OpBranch %87
+         %87 = OpLabel
+        %490 = OpLoad %bool %canwalk
+               OpSelectionMerge %491 None
+               OpBranchConditional %490 %492 %493
+        %492 = OpLabel
+               OpBranch %491
+        %493 = OpLabel
+               OpBranch %86
+        %491 = OpLabel
+               OpBranch %85
+         %86 = OpLabel
+               OpStore %x_GLF_color %495
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %496
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %500 = OpLabel
+        %501 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %501
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %22
+        %503 = OpLabel
+        %504 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %504
+        %505 = OpFunctionCall %void %main_1
+        %507 = OpLoad %v4float %x_GLF_color
+        %508 = OpCompositeConstruct %main_out %507
+        %506 = OpFunctionCall %void %tint_symbol_3 %508
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 87[%87] is not post dominated by the back-edge block 491[%491]
+  %491 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-access-chains/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-access-chains/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..4128fb7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-access-chains/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,348 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> map : array<i32, 256>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var pos : vec2<f32>;
+  var ipos : vec2<i32>;
+  var i : i32;
+  var p : vec2<i32>;
+  var canwalk : bool;
+  var v : i32;
+  var directions : i32;
+  var j : i32;
+  var d : i32;
+  let x_57 : vec4<f32> = gl_FragCoord;
+  let x_60 : vec2<f32> = x_7.resolution;
+  pos = (vec2<f32>(x_57.x, x_57.y) / x_60);
+  let x_63 : f32 = pos.x;
+  let x_67 : f32 = pos.y;
+  ipos = vec2<i32>(i32((x_63 * 16.0)), i32((x_67 * 16.0)));
+  i = 0;
+  loop {
+    let x_75 : i32 = i;
+    if ((x_75 < 256)) {
+    } else {
+      break;
+    }
+    let x_78 : i32 = i;
+    map[x_78] = 0;
+
+    continuing {
+      let x_80 : i32 = i;
+      i = (x_80 + 1);
+    }
+  }
+  p = vec2<i32>(0, 0);
+  canwalk = true;
+  v = 0;
+  loop {
+    var x_102 : bool;
+    var x_122 : bool;
+    var x_142 : bool;
+    var x_162 : bool;
+    var x_103_phi : bool;
+    var x_123_phi : bool;
+    var x_143_phi : bool;
+    var x_163_phi : bool;
+    let x_86 : i32 = v;
+    v = (x_86 + 1);
+    directions = 0;
+    let x_89 : i32 = p.x;
+    let x_90 : bool = (x_89 > 0);
+    x_103_phi = x_90;
+    if (x_90) {
+      let x_94 : i32 = p.x;
+      let x_97 : i32 = p.y;
+      let x_101 : i32 = map[((x_94 - 2) + (x_97 * 16))];
+      x_102 = (x_101 == 0);
+      x_103_phi = x_102;
+    }
+    let x_103 : bool = x_103_phi;
+    if (x_103) {
+      let x_106 : i32 = directions;
+      directions = (x_106 + 1);
+    }
+    let x_109 : i32 = p.y;
+    let x_110 : bool = (x_109 > 0);
+    x_123_phi = x_110;
+    if (x_110) {
+      let x_114 : i32 = p.x;
+      let x_116 : i32 = p.y;
+      let x_121 : i32 = map[(x_114 + ((x_116 - 2) * 16))];
+      x_122 = (x_121 == 0);
+      x_123_phi = x_122;
+    }
+    let x_123 : bool = x_123_phi;
+    if (x_123) {
+      let x_126 : i32 = directions;
+      directions = (x_126 + 1);
+    }
+    let x_129 : i32 = p.x;
+    let x_130 : bool = (x_129 < 14);
+    x_143_phi = x_130;
+    if (x_130) {
+      let x_134 : i32 = p.x;
+      let x_137 : i32 = p.y;
+      let x_141 : i32 = map[((x_134 + 2) + (x_137 * 16))];
+      x_142 = (x_141 == 0);
+      x_143_phi = x_142;
+    }
+    let x_143 : bool = x_143_phi;
+    if (x_143) {
+      let x_146 : i32 = directions;
+      directions = (x_146 + 1);
+    }
+    let x_149 : i32 = p.y;
+    let x_150 : bool = (x_149 < 14);
+    x_163_phi = x_150;
+    if (x_150) {
+      let x_154 : i32 = p.x;
+      let x_156 : i32 = p.y;
+      let x_161 : i32 = map[(x_154 + ((x_156 + 2) * 16))];
+      x_162 = (x_161 == 0);
+      x_163_phi = x_162;
+    }
+    let x_163 : bool = x_163_phi;
+    if (x_163) {
+      let x_166 : i32 = directions;
+      directions = (x_166 + 1);
+    }
+    var x_227 : bool;
+    var x_240 : bool;
+    var x_279 : bool;
+    var x_292 : bool;
+    var x_331 : bool;
+    var x_344 : bool;
+    var x_383 : bool;
+    var x_396 : bool;
+    var x_228_phi : bool;
+    var x_241_phi : bool;
+    var x_280_phi : bool;
+    var x_293_phi : bool;
+    var x_332_phi : bool;
+    var x_345_phi : bool;
+    var x_384_phi : bool;
+    var x_397_phi : bool;
+    let x_168 : i32 = directions;
+    if ((x_168 == 0)) {
+      canwalk = false;
+      i = 0;
+      loop {
+        let x_177 : i32 = i;
+        if ((x_177 < 8)) {
+        } else {
+          break;
+        }
+        j = 0;
+        loop {
+          let x_184 : i32 = j;
+          if ((x_184 < 8)) {
+          } else {
+            break;
+          }
+          let x_187 : i32 = j;
+          let x_189 : i32 = i;
+          let x_194 : i32 = map[((x_187 * 2) + ((x_189 * 2) * 16))];
+          if ((x_194 == 0)) {
+            let x_198 : i32 = j;
+            p.x = (x_198 * 2);
+            let x_201 : i32 = i;
+            p.y = (x_201 * 2);
+            canwalk = true;
+          }
+
+          continuing {
+            let x_204 : i32 = j;
+            j = (x_204 + 1);
+          }
+        }
+
+        continuing {
+          let x_206 : i32 = i;
+          i = (x_206 + 1);
+        }
+      }
+      let x_209 : i32 = p.x;
+      let x_211 : i32 = p.y;
+      map[(x_209 + (x_211 * 16))] = 1;
+    } else {
+      let x_215 : i32 = v;
+      let x_216 : i32 = directions;
+      d = (x_215 % x_216);
+      let x_218 : i32 = directions;
+      let x_219 : i32 = v;
+      v = (x_219 + x_218);
+      let x_221 : i32 = d;
+      let x_222 : bool = (x_221 >= 0);
+      x_228_phi = x_222;
+      if (x_222) {
+        let x_226 : i32 = p.x;
+        x_227 = (x_226 > 0);
+        x_228_phi = x_227;
+      }
+      let x_228 : bool = x_228_phi;
+      x_241_phi = x_228;
+      if (x_228) {
+        let x_232 : i32 = p.x;
+        let x_235 : i32 = p.y;
+        let x_239 : i32 = map[((x_232 - 2) + (x_235 * 16))];
+        x_240 = (x_239 == 0);
+        x_241_phi = x_240;
+      }
+      let x_241 : bool = x_241_phi;
+      if (x_241) {
+        let x_244 : i32 = d;
+        d = (x_244 - 1);
+        let x_247 : i32 = p.x;
+        let x_249 : i32 = p.y;
+        map[(x_247 + (x_249 * 16))] = 1;
+        let x_254 : i32 = p.x;
+        let x_257 : i32 = p.y;
+        map[((x_254 - 1) + (x_257 * 16))] = 1;
+        let x_262 : i32 = p.x;
+        let x_265 : i32 = p.y;
+        map[((x_262 - 2) + (x_265 * 16))] = 1;
+        let x_270 : i32 = p.x;
+        p.x = (x_270 - 2);
+      }
+      let x_273 : i32 = d;
+      let x_274 : bool = (x_273 >= 0);
+      x_280_phi = x_274;
+      if (x_274) {
+        let x_278 : i32 = p.y;
+        x_279 = (x_278 > 0);
+        x_280_phi = x_279;
+      }
+      let x_280 : bool = x_280_phi;
+      x_293_phi = x_280;
+      if (x_280) {
+        let x_284 : i32 = p.x;
+        let x_286 : i32 = p.y;
+        let x_291 : i32 = map[(x_284 + ((x_286 - 2) * 16))];
+        x_292 = (x_291 == 0);
+        x_293_phi = x_292;
+      }
+      let x_293 : bool = x_293_phi;
+      if (x_293) {
+        let x_296 : i32 = d;
+        d = (x_296 - 1);
+        let x_299 : i32 = p.x;
+        let x_301 : i32 = p.y;
+        map[(x_299 + (x_301 * 16))] = 1;
+        let x_306 : i32 = p.x;
+        let x_308 : i32 = p.y;
+        map[(x_306 + ((x_308 - 1) * 16))] = 1;
+        let x_314 : i32 = p.x;
+        let x_316 : i32 = p.y;
+        map[(x_314 + ((x_316 - 2) * 16))] = 1;
+        let x_322 : i32 = p.y;
+        p.y = (x_322 - 2);
+      }
+      let x_325 : i32 = d;
+      let x_326 : bool = (x_325 >= 0);
+      x_332_phi = x_326;
+      if (x_326) {
+        let x_330 : i32 = p.x;
+        x_331 = (x_330 < 14);
+        x_332_phi = x_331;
+      }
+      let x_332 : bool = x_332_phi;
+      x_345_phi = x_332;
+      if (x_332) {
+        let x_336 : i32 = p.x;
+        let x_339 : i32 = p.y;
+        let x_343 : i32 = map[((x_336 + 2) + (x_339 * 16))];
+        x_344 = (x_343 == 0);
+        x_345_phi = x_344;
+      }
+      let x_345 : bool = x_345_phi;
+      if (x_345) {
+        let x_348 : i32 = d;
+        d = (x_348 - 1);
+        let x_351 : i32 = p.x;
+        let x_353 : i32 = p.y;
+        map[(x_351 + (x_353 * 16))] = 1;
+        let x_358 : i32 = p.x;
+        let x_361 : i32 = p.y;
+        map[((x_358 + 1) + (x_361 * 16))] = 1;
+        let x_366 : i32 = p.x;
+        let x_369 : i32 = p.y;
+        map[((x_366 + 2) + (x_369 * 16))] = 1;
+        let x_374 : i32 = p.x;
+        p.x = (x_374 + 2);
+      }
+      let x_377 : i32 = d;
+      let x_378 : bool = (x_377 >= 0);
+      x_384_phi = x_378;
+      if (x_378) {
+        let x_382 : i32 = p.y;
+        x_383 = (x_382 < 14);
+        x_384_phi = x_383;
+      }
+      let x_384 : bool = x_384_phi;
+      x_397_phi = x_384;
+      if (x_384) {
+        let x_388 : i32 = p.x;
+        let x_390 : i32 = p.y;
+        let x_395 : i32 = map[(x_388 + ((x_390 + 2) * 16))];
+        x_396 = (x_395 == 0);
+        x_397_phi = x_396;
+      }
+      let x_397 : bool = x_397_phi;
+      if (x_397) {
+        let x_400 : i32 = d;
+        d = (x_400 - 1);
+        let x_403 : i32 = p.x;
+        let x_405 : i32 = p.y;
+        map[(x_403 + (x_405 * 16))] = 1;
+        let x_410 : i32 = p.x;
+        let x_412 : i32 = p.y;
+        map[(x_410 + ((x_412 + 1) * 16))] = 1;
+        let x_418 : i32 = p.x;
+        let x_420 : i32 = p.y;
+        map[(x_418 + ((x_420 + 2) * 16))] = 1;
+        let x_426 : i32 = p.y;
+        p.y = (x_426 + 2);
+      }
+    }
+    let x_430 : i32 = ipos.y;
+    let x_433 : i32 = ipos.x;
+    let x_436 : i32 = map[((x_430 * 16) + x_433)];
+    if ((x_436 == 1)) {
+      x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+      return;
+    }
+
+    continuing {
+      let x_440 : bool = canwalk;
+      if (x_440) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-access-chains/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-access-chains/0-opt.wgsl
new file mode 100644
index 0000000..4128fb7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-access-chains/0-opt.wgsl
@@ -0,0 +1,348 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> map : array<i32, 256>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var pos : vec2<f32>;
+  var ipos : vec2<i32>;
+  var i : i32;
+  var p : vec2<i32>;
+  var canwalk : bool;
+  var v : i32;
+  var directions : i32;
+  var j : i32;
+  var d : i32;
+  let x_57 : vec4<f32> = gl_FragCoord;
+  let x_60 : vec2<f32> = x_7.resolution;
+  pos = (vec2<f32>(x_57.x, x_57.y) / x_60);
+  let x_63 : f32 = pos.x;
+  let x_67 : f32 = pos.y;
+  ipos = vec2<i32>(i32((x_63 * 16.0)), i32((x_67 * 16.0)));
+  i = 0;
+  loop {
+    let x_75 : i32 = i;
+    if ((x_75 < 256)) {
+    } else {
+      break;
+    }
+    let x_78 : i32 = i;
+    map[x_78] = 0;
+
+    continuing {
+      let x_80 : i32 = i;
+      i = (x_80 + 1);
+    }
+  }
+  p = vec2<i32>(0, 0);
+  canwalk = true;
+  v = 0;
+  loop {
+    var x_102 : bool;
+    var x_122 : bool;
+    var x_142 : bool;
+    var x_162 : bool;
+    var x_103_phi : bool;
+    var x_123_phi : bool;
+    var x_143_phi : bool;
+    var x_163_phi : bool;
+    let x_86 : i32 = v;
+    v = (x_86 + 1);
+    directions = 0;
+    let x_89 : i32 = p.x;
+    let x_90 : bool = (x_89 > 0);
+    x_103_phi = x_90;
+    if (x_90) {
+      let x_94 : i32 = p.x;
+      let x_97 : i32 = p.y;
+      let x_101 : i32 = map[((x_94 - 2) + (x_97 * 16))];
+      x_102 = (x_101 == 0);
+      x_103_phi = x_102;
+    }
+    let x_103 : bool = x_103_phi;
+    if (x_103) {
+      let x_106 : i32 = directions;
+      directions = (x_106 + 1);
+    }
+    let x_109 : i32 = p.y;
+    let x_110 : bool = (x_109 > 0);
+    x_123_phi = x_110;
+    if (x_110) {
+      let x_114 : i32 = p.x;
+      let x_116 : i32 = p.y;
+      let x_121 : i32 = map[(x_114 + ((x_116 - 2) * 16))];
+      x_122 = (x_121 == 0);
+      x_123_phi = x_122;
+    }
+    let x_123 : bool = x_123_phi;
+    if (x_123) {
+      let x_126 : i32 = directions;
+      directions = (x_126 + 1);
+    }
+    let x_129 : i32 = p.x;
+    let x_130 : bool = (x_129 < 14);
+    x_143_phi = x_130;
+    if (x_130) {
+      let x_134 : i32 = p.x;
+      let x_137 : i32 = p.y;
+      let x_141 : i32 = map[((x_134 + 2) + (x_137 * 16))];
+      x_142 = (x_141 == 0);
+      x_143_phi = x_142;
+    }
+    let x_143 : bool = x_143_phi;
+    if (x_143) {
+      let x_146 : i32 = directions;
+      directions = (x_146 + 1);
+    }
+    let x_149 : i32 = p.y;
+    let x_150 : bool = (x_149 < 14);
+    x_163_phi = x_150;
+    if (x_150) {
+      let x_154 : i32 = p.x;
+      let x_156 : i32 = p.y;
+      let x_161 : i32 = map[(x_154 + ((x_156 + 2) * 16))];
+      x_162 = (x_161 == 0);
+      x_163_phi = x_162;
+    }
+    let x_163 : bool = x_163_phi;
+    if (x_163) {
+      let x_166 : i32 = directions;
+      directions = (x_166 + 1);
+    }
+    var x_227 : bool;
+    var x_240 : bool;
+    var x_279 : bool;
+    var x_292 : bool;
+    var x_331 : bool;
+    var x_344 : bool;
+    var x_383 : bool;
+    var x_396 : bool;
+    var x_228_phi : bool;
+    var x_241_phi : bool;
+    var x_280_phi : bool;
+    var x_293_phi : bool;
+    var x_332_phi : bool;
+    var x_345_phi : bool;
+    var x_384_phi : bool;
+    var x_397_phi : bool;
+    let x_168 : i32 = directions;
+    if ((x_168 == 0)) {
+      canwalk = false;
+      i = 0;
+      loop {
+        let x_177 : i32 = i;
+        if ((x_177 < 8)) {
+        } else {
+          break;
+        }
+        j = 0;
+        loop {
+          let x_184 : i32 = j;
+          if ((x_184 < 8)) {
+          } else {
+            break;
+          }
+          let x_187 : i32 = j;
+          let x_189 : i32 = i;
+          let x_194 : i32 = map[((x_187 * 2) + ((x_189 * 2) * 16))];
+          if ((x_194 == 0)) {
+            let x_198 : i32 = j;
+            p.x = (x_198 * 2);
+            let x_201 : i32 = i;
+            p.y = (x_201 * 2);
+            canwalk = true;
+          }
+
+          continuing {
+            let x_204 : i32 = j;
+            j = (x_204 + 1);
+          }
+        }
+
+        continuing {
+          let x_206 : i32 = i;
+          i = (x_206 + 1);
+        }
+      }
+      let x_209 : i32 = p.x;
+      let x_211 : i32 = p.y;
+      map[(x_209 + (x_211 * 16))] = 1;
+    } else {
+      let x_215 : i32 = v;
+      let x_216 : i32 = directions;
+      d = (x_215 % x_216);
+      let x_218 : i32 = directions;
+      let x_219 : i32 = v;
+      v = (x_219 + x_218);
+      let x_221 : i32 = d;
+      let x_222 : bool = (x_221 >= 0);
+      x_228_phi = x_222;
+      if (x_222) {
+        let x_226 : i32 = p.x;
+        x_227 = (x_226 > 0);
+        x_228_phi = x_227;
+      }
+      let x_228 : bool = x_228_phi;
+      x_241_phi = x_228;
+      if (x_228) {
+        let x_232 : i32 = p.x;
+        let x_235 : i32 = p.y;
+        let x_239 : i32 = map[((x_232 - 2) + (x_235 * 16))];
+        x_240 = (x_239 == 0);
+        x_241_phi = x_240;
+      }
+      let x_241 : bool = x_241_phi;
+      if (x_241) {
+        let x_244 : i32 = d;
+        d = (x_244 - 1);
+        let x_247 : i32 = p.x;
+        let x_249 : i32 = p.y;
+        map[(x_247 + (x_249 * 16))] = 1;
+        let x_254 : i32 = p.x;
+        let x_257 : i32 = p.y;
+        map[((x_254 - 1) + (x_257 * 16))] = 1;
+        let x_262 : i32 = p.x;
+        let x_265 : i32 = p.y;
+        map[((x_262 - 2) + (x_265 * 16))] = 1;
+        let x_270 : i32 = p.x;
+        p.x = (x_270 - 2);
+      }
+      let x_273 : i32 = d;
+      let x_274 : bool = (x_273 >= 0);
+      x_280_phi = x_274;
+      if (x_274) {
+        let x_278 : i32 = p.y;
+        x_279 = (x_278 > 0);
+        x_280_phi = x_279;
+      }
+      let x_280 : bool = x_280_phi;
+      x_293_phi = x_280;
+      if (x_280) {
+        let x_284 : i32 = p.x;
+        let x_286 : i32 = p.y;
+        let x_291 : i32 = map[(x_284 + ((x_286 - 2) * 16))];
+        x_292 = (x_291 == 0);
+        x_293_phi = x_292;
+      }
+      let x_293 : bool = x_293_phi;
+      if (x_293) {
+        let x_296 : i32 = d;
+        d = (x_296 - 1);
+        let x_299 : i32 = p.x;
+        let x_301 : i32 = p.y;
+        map[(x_299 + (x_301 * 16))] = 1;
+        let x_306 : i32 = p.x;
+        let x_308 : i32 = p.y;
+        map[(x_306 + ((x_308 - 1) * 16))] = 1;
+        let x_314 : i32 = p.x;
+        let x_316 : i32 = p.y;
+        map[(x_314 + ((x_316 - 2) * 16))] = 1;
+        let x_322 : i32 = p.y;
+        p.y = (x_322 - 2);
+      }
+      let x_325 : i32 = d;
+      let x_326 : bool = (x_325 >= 0);
+      x_332_phi = x_326;
+      if (x_326) {
+        let x_330 : i32 = p.x;
+        x_331 = (x_330 < 14);
+        x_332_phi = x_331;
+      }
+      let x_332 : bool = x_332_phi;
+      x_345_phi = x_332;
+      if (x_332) {
+        let x_336 : i32 = p.x;
+        let x_339 : i32 = p.y;
+        let x_343 : i32 = map[((x_336 + 2) + (x_339 * 16))];
+        x_344 = (x_343 == 0);
+        x_345_phi = x_344;
+      }
+      let x_345 : bool = x_345_phi;
+      if (x_345) {
+        let x_348 : i32 = d;
+        d = (x_348 - 1);
+        let x_351 : i32 = p.x;
+        let x_353 : i32 = p.y;
+        map[(x_351 + (x_353 * 16))] = 1;
+        let x_358 : i32 = p.x;
+        let x_361 : i32 = p.y;
+        map[((x_358 + 1) + (x_361 * 16))] = 1;
+        let x_366 : i32 = p.x;
+        let x_369 : i32 = p.y;
+        map[((x_366 + 2) + (x_369 * 16))] = 1;
+        let x_374 : i32 = p.x;
+        p.x = (x_374 + 2);
+      }
+      let x_377 : i32 = d;
+      let x_378 : bool = (x_377 >= 0);
+      x_384_phi = x_378;
+      if (x_378) {
+        let x_382 : i32 = p.y;
+        x_383 = (x_382 < 14);
+        x_384_phi = x_383;
+      }
+      let x_384 : bool = x_384_phi;
+      x_397_phi = x_384;
+      if (x_384) {
+        let x_388 : i32 = p.x;
+        let x_390 : i32 = p.y;
+        let x_395 : i32 = map[(x_388 + ((x_390 + 2) * 16))];
+        x_396 = (x_395 == 0);
+        x_397_phi = x_396;
+      }
+      let x_397 : bool = x_397_phi;
+      if (x_397) {
+        let x_400 : i32 = d;
+        d = (x_400 - 1);
+        let x_403 : i32 = p.x;
+        let x_405 : i32 = p.y;
+        map[(x_403 + (x_405 * 16))] = 1;
+        let x_410 : i32 = p.x;
+        let x_412 : i32 = p.y;
+        map[(x_410 + ((x_412 + 1) * 16))] = 1;
+        let x_418 : i32 = p.x;
+        let x_420 : i32 = p.y;
+        map[(x_418 + ((x_420 + 2) * 16))] = 1;
+        let x_426 : i32 = p.y;
+        p.y = (x_426 + 2);
+      }
+    }
+    let x_430 : i32 = ipos.y;
+    let x_433 : i32 = ipos.x;
+    let x_436 : i32 = map[((x_430 * 16) + x_433)];
+    if ((x_436 == 1)) {
+      x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+      return;
+    }
+
+    continuing {
+      let x_440 : bool = canwalk;
+      if (x_440) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-access-chains/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-access-chains/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..a5177e1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-access-chains/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,292 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[1];
+};
+static int map[256] = (int[256])0;
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2 pos = float2(0.0f, 0.0f);
+  int2 ipos = int2(0, 0);
+  int i = 0;
+  int2 p = int2(0, 0);
+  bool canwalk = false;
+  int v = 0;
+  int directions = 0;
+  int j = 0;
+  int d = 0;
+  const float4 x_57 = gl_FragCoord;
+  const float2 x_60 = asfloat(x_7[0].xy);
+  pos = (float2(x_57.x, x_57.y) / x_60);
+  const float x_63 = pos.x;
+  const float x_67 = pos.y;
+  ipos = int2(int((x_63 * 16.0f)), int((x_67 * 16.0f)));
+  i = 0;
+  {
+    for(; (i < 256); i = (i + 1)) {
+      map[i] = 0;
+    }
+  }
+  p = int2(0, 0);
+  canwalk = true;
+  v = 0;
+  while (true) {
+    bool x_102 = false;
+    bool x_122 = false;
+    bool x_142 = false;
+    bool x_162 = false;
+    bool x_103_phi = false;
+    bool x_123_phi = false;
+    bool x_143_phi = false;
+    bool x_163_phi = false;
+    v = (v + 1);
+    directions = 0;
+    const int x_89 = p.x;
+    const bool x_90 = (x_89 > 0);
+    x_103_phi = x_90;
+    if (x_90) {
+      const int x_94 = p.x;
+      const int x_97 = p.y;
+      const int x_101 = map[((x_94 - 2) + (x_97 * 16))];
+      x_102 = (x_101 == 0);
+      x_103_phi = x_102;
+    }
+    if (x_103_phi) {
+      directions = (directions + 1);
+    }
+    const int x_109 = p.y;
+    const bool x_110 = (x_109 > 0);
+    x_123_phi = x_110;
+    if (x_110) {
+      const int x_114 = p.x;
+      const int x_116 = p.y;
+      const int x_121 = map[(x_114 + ((x_116 - 2) * 16))];
+      x_122 = (x_121 == 0);
+      x_123_phi = x_122;
+    }
+    if (x_123_phi) {
+      directions = (directions + 1);
+    }
+    const int x_129 = p.x;
+    const bool x_130 = (x_129 < 14);
+    x_143_phi = x_130;
+    if (x_130) {
+      const int x_134 = p.x;
+      const int x_137 = p.y;
+      const int x_141 = map[((x_134 + 2) + (x_137 * 16))];
+      x_142 = (x_141 == 0);
+      x_143_phi = x_142;
+    }
+    if (x_143_phi) {
+      directions = (directions + 1);
+    }
+    const int x_149 = p.y;
+    const bool x_150 = (x_149 < 14);
+    x_163_phi = x_150;
+    if (x_150) {
+      const int x_154 = p.x;
+      const int x_156 = p.y;
+      const int x_161 = map[(x_154 + ((x_156 + 2) * 16))];
+      x_162 = (x_161 == 0);
+      x_163_phi = x_162;
+    }
+    if (x_163_phi) {
+      directions = (directions + 1);
+    }
+    bool x_227 = false;
+    bool x_240 = false;
+    bool x_279 = false;
+    bool x_292 = false;
+    bool x_331 = false;
+    bool x_344 = false;
+    bool x_383 = false;
+    bool x_396 = false;
+    bool x_228_phi = false;
+    bool x_241_phi = false;
+    bool x_280_phi = false;
+    bool x_293_phi = false;
+    bool x_332_phi = false;
+    bool x_345_phi = false;
+    bool x_384_phi = false;
+    bool x_397_phi = false;
+    if ((directions == 0)) {
+      canwalk = false;
+      i = 0;
+      {
+        for(; (i < 8); i = (i + 1)) {
+          j = 0;
+          {
+            for(; (j < 8); j = (j + 1)) {
+              const int x_194 = map[((j * 2) + ((i * 2) * 16))];
+              if ((x_194 == 0)) {
+                p.x = (j * 2);
+                p.y = (i * 2);
+                canwalk = true;
+              }
+            }
+          }
+        }
+      }
+      const int x_209 = p.x;
+      const int x_211 = p.y;
+      map[(x_209 + (x_211 * 16))] = 1;
+    } else {
+      d = (v % directions);
+      v = (v + directions);
+      const bool x_222 = (d >= 0);
+      x_228_phi = x_222;
+      if (x_222) {
+        const int x_226 = p.x;
+        x_227 = (x_226 > 0);
+        x_228_phi = x_227;
+      }
+      const bool x_228 = x_228_phi;
+      x_241_phi = x_228;
+      if (x_228) {
+        const int x_232 = p.x;
+        const int x_235 = p.y;
+        const int x_239 = map[((x_232 - 2) + (x_235 * 16))];
+        x_240 = (x_239 == 0);
+        x_241_phi = x_240;
+      }
+      if (x_241_phi) {
+        d = (d - 1);
+        const int x_247 = p.x;
+        const int x_249 = p.y;
+        map[(x_247 + (x_249 * 16))] = 1;
+        const int x_254 = p.x;
+        const int x_257 = p.y;
+        map[((x_254 - 1) + (x_257 * 16))] = 1;
+        const int x_262 = p.x;
+        const int x_265 = p.y;
+        map[((x_262 - 2) + (x_265 * 16))] = 1;
+        const int x_270 = p.x;
+        p.x = (x_270 - 2);
+      }
+      const bool x_274 = (d >= 0);
+      x_280_phi = x_274;
+      if (x_274) {
+        const int x_278 = p.y;
+        x_279 = (x_278 > 0);
+        x_280_phi = x_279;
+      }
+      const bool x_280 = x_280_phi;
+      x_293_phi = x_280;
+      if (x_280) {
+        const int x_284 = p.x;
+        const int x_286 = p.y;
+        const int x_291 = map[(x_284 + ((x_286 - 2) * 16))];
+        x_292 = (x_291 == 0);
+        x_293_phi = x_292;
+      }
+      if (x_293_phi) {
+        d = (d - 1);
+        const int x_299 = p.x;
+        const int x_301 = p.y;
+        map[(x_299 + (x_301 * 16))] = 1;
+        const int x_306 = p.x;
+        const int x_308 = p.y;
+        map[(x_306 + ((x_308 - 1) * 16))] = 1;
+        const int x_314 = p.x;
+        const int x_316 = p.y;
+        map[(x_314 + ((x_316 - 2) * 16))] = 1;
+        const int x_322 = p.y;
+        p.y = (x_322 - 2);
+      }
+      const bool x_326 = (d >= 0);
+      x_332_phi = x_326;
+      if (x_326) {
+        const int x_330 = p.x;
+        x_331 = (x_330 < 14);
+        x_332_phi = x_331;
+      }
+      const bool x_332 = x_332_phi;
+      x_345_phi = x_332;
+      if (x_332) {
+        const int x_336 = p.x;
+        const int x_339 = p.y;
+        const int x_343 = map[((x_336 + 2) + (x_339 * 16))];
+        x_344 = (x_343 == 0);
+        x_345_phi = x_344;
+      }
+      if (x_345_phi) {
+        d = (d - 1);
+        const int x_351 = p.x;
+        const int x_353 = p.y;
+        map[(x_351 + (x_353 * 16))] = 1;
+        const int x_358 = p.x;
+        const int x_361 = p.y;
+        map[((x_358 + 1) + (x_361 * 16))] = 1;
+        const int x_366 = p.x;
+        const int x_369 = p.y;
+        map[((x_366 + 2) + (x_369 * 16))] = 1;
+        const int x_374 = p.x;
+        p.x = (x_374 + 2);
+      }
+      const bool x_378 = (d >= 0);
+      x_384_phi = x_378;
+      if (x_378) {
+        const int x_382 = p.y;
+        x_383 = (x_382 < 14);
+        x_384_phi = x_383;
+      }
+      const bool x_384 = x_384_phi;
+      x_397_phi = x_384;
+      if (x_384) {
+        const int x_388 = p.x;
+        const int x_390 = p.y;
+        const int x_395 = map[(x_388 + ((x_390 + 2) * 16))];
+        x_396 = (x_395 == 0);
+        x_397_phi = x_396;
+      }
+      if (x_397_phi) {
+        d = (d - 1);
+        const int x_403 = p.x;
+        const int x_405 = p.y;
+        map[(x_403 + (x_405 * 16))] = 1;
+        const int x_410 = p.x;
+        const int x_412 = p.y;
+        map[(x_410 + ((x_412 + 1) * 16))] = 1;
+        const int x_418 = p.x;
+        const int x_420 = p.y;
+        map[(x_418 + ((x_420 + 2) * 16))] = 1;
+        const int x_426 = p.y;
+        p.y = (x_426 + 2);
+      }
+    }
+    const int x_430 = ipos.y;
+    const int x_433 = ipos.x;
+    const int x_436 = map[((x_430 * 16) + x_433)];
+    if ((x_436 == 1)) {
+      x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+      return;
+    }
+    {
+      if (canwalk) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_GLF_color = float4(0.0f, 0.0f, 0.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-access-chains/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-access-chains/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..e1df0f2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-access-chains/0-opt.wgsl.expected.msl
@@ -0,0 +1,347 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  int arr[256];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_5, thread tint_array_wrapper* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  float2 pos = 0.0f;
+  int2 ipos = 0;
+  int i = 0;
+  int2 p = 0;
+  bool canwalk = false;
+  int v = 0;
+  int directions = 0;
+  int j = 0;
+  int d = 0;
+  float4 const x_57 = *(tint_symbol_5);
+  float2 const x_60 = x_7.resolution;
+  pos = (float2(x_57.x, x_57.y) / x_60);
+  float const x_63 = pos.x;
+  float const x_67 = pos.y;
+  ipos = int2(int((x_63 * 16.0f)), int((x_67 * 16.0f)));
+  i = 0;
+  while (true) {
+    int const x_75 = i;
+    if ((x_75 < 256)) {
+    } else {
+      break;
+    }
+    int const x_78 = i;
+    (*(tint_symbol_6)).arr[x_78] = 0;
+    {
+      int const x_80 = i;
+      i = (x_80 + 1);
+    }
+  }
+  p = int2(0, 0);
+  canwalk = true;
+  v = 0;
+  while (true) {
+    bool x_102 = false;
+    bool x_122 = false;
+    bool x_142 = false;
+    bool x_162 = false;
+    bool x_103_phi = false;
+    bool x_123_phi = false;
+    bool x_143_phi = false;
+    bool x_163_phi = false;
+    int const x_86 = v;
+    v = (x_86 + 1);
+    directions = 0;
+    int const x_89 = p.x;
+    bool const x_90 = (x_89 > 0);
+    x_103_phi = x_90;
+    if (x_90) {
+      int const x_94 = p.x;
+      int const x_97 = p.y;
+      int const x_101 = (*(tint_symbol_6)).arr[((x_94 - 2) + (x_97 * 16))];
+      x_102 = (x_101 == 0);
+      x_103_phi = x_102;
+    }
+    bool const x_103 = x_103_phi;
+    if (x_103) {
+      int const x_106 = directions;
+      directions = (x_106 + 1);
+    }
+    int const x_109 = p.y;
+    bool const x_110 = (x_109 > 0);
+    x_123_phi = x_110;
+    if (x_110) {
+      int const x_114 = p.x;
+      int const x_116 = p.y;
+      int const x_121 = (*(tint_symbol_6)).arr[(x_114 + ((x_116 - 2) * 16))];
+      x_122 = (x_121 == 0);
+      x_123_phi = x_122;
+    }
+    bool const x_123 = x_123_phi;
+    if (x_123) {
+      int const x_126 = directions;
+      directions = (x_126 + 1);
+    }
+    int const x_129 = p.x;
+    bool const x_130 = (x_129 < 14);
+    x_143_phi = x_130;
+    if (x_130) {
+      int const x_134 = p.x;
+      int const x_137 = p.y;
+      int const x_141 = (*(tint_symbol_6)).arr[((x_134 + 2) + (x_137 * 16))];
+      x_142 = (x_141 == 0);
+      x_143_phi = x_142;
+    }
+    bool const x_143 = x_143_phi;
+    if (x_143) {
+      int const x_146 = directions;
+      directions = (x_146 + 1);
+    }
+    int const x_149 = p.y;
+    bool const x_150 = (x_149 < 14);
+    x_163_phi = x_150;
+    if (x_150) {
+      int const x_154 = p.x;
+      int const x_156 = p.y;
+      int const x_161 = (*(tint_symbol_6)).arr[(x_154 + ((x_156 + 2) * 16))];
+      x_162 = (x_161 == 0);
+      x_163_phi = x_162;
+    }
+    bool const x_163 = x_163_phi;
+    if (x_163) {
+      int const x_166 = directions;
+      directions = (x_166 + 1);
+    }
+    bool x_227 = false;
+    bool x_240 = false;
+    bool x_279 = false;
+    bool x_292 = false;
+    bool x_331 = false;
+    bool x_344 = false;
+    bool x_383 = false;
+    bool x_396 = false;
+    bool x_228_phi = false;
+    bool x_241_phi = false;
+    bool x_280_phi = false;
+    bool x_293_phi = false;
+    bool x_332_phi = false;
+    bool x_345_phi = false;
+    bool x_384_phi = false;
+    bool x_397_phi = false;
+    int const x_168 = directions;
+    if ((x_168 == 0)) {
+      canwalk = false;
+      i = 0;
+      while (true) {
+        int const x_177 = i;
+        if ((x_177 < 8)) {
+        } else {
+          break;
+        }
+        j = 0;
+        while (true) {
+          int const x_184 = j;
+          if ((x_184 < 8)) {
+          } else {
+            break;
+          }
+          int const x_187 = j;
+          int const x_189 = i;
+          int const x_194 = (*(tint_symbol_6)).arr[((x_187 * 2) + ((x_189 * 2) * 16))];
+          if ((x_194 == 0)) {
+            int const x_198 = j;
+            p.x = (x_198 * 2);
+            int const x_201 = i;
+            p.y = (x_201 * 2);
+            canwalk = true;
+          }
+          {
+            int const x_204 = j;
+            j = (x_204 + 1);
+          }
+        }
+        {
+          int const x_206 = i;
+          i = (x_206 + 1);
+        }
+      }
+      int const x_209 = p.x;
+      int const x_211 = p.y;
+      (*(tint_symbol_6)).arr[(x_209 + (x_211 * 16))] = 1;
+    } else {
+      int const x_215 = v;
+      int const x_216 = directions;
+      d = (x_215 % x_216);
+      int const x_218 = directions;
+      int const x_219 = v;
+      v = (x_219 + x_218);
+      int const x_221 = d;
+      bool const x_222 = (x_221 >= 0);
+      x_228_phi = x_222;
+      if (x_222) {
+        int const x_226 = p.x;
+        x_227 = (x_226 > 0);
+        x_228_phi = x_227;
+      }
+      bool const x_228 = x_228_phi;
+      x_241_phi = x_228;
+      if (x_228) {
+        int const x_232 = p.x;
+        int const x_235 = p.y;
+        int const x_239 = (*(tint_symbol_6)).arr[((x_232 - 2) + (x_235 * 16))];
+        x_240 = (x_239 == 0);
+        x_241_phi = x_240;
+      }
+      bool const x_241 = x_241_phi;
+      if (x_241) {
+        int const x_244 = d;
+        d = (x_244 - 1);
+        int const x_247 = p.x;
+        int const x_249 = p.y;
+        (*(tint_symbol_6)).arr[(x_247 + (x_249 * 16))] = 1;
+        int const x_254 = p.x;
+        int const x_257 = p.y;
+        (*(tint_symbol_6)).arr[((x_254 - 1) + (x_257 * 16))] = 1;
+        int const x_262 = p.x;
+        int const x_265 = p.y;
+        (*(tint_symbol_6)).arr[((x_262 - 2) + (x_265 * 16))] = 1;
+        int const x_270 = p.x;
+        p.x = (x_270 - 2);
+      }
+      int const x_273 = d;
+      bool const x_274 = (x_273 >= 0);
+      x_280_phi = x_274;
+      if (x_274) {
+        int const x_278 = p.y;
+        x_279 = (x_278 > 0);
+        x_280_phi = x_279;
+      }
+      bool const x_280 = x_280_phi;
+      x_293_phi = x_280;
+      if (x_280) {
+        int const x_284 = p.x;
+        int const x_286 = p.y;
+        int const x_291 = (*(tint_symbol_6)).arr[(x_284 + ((x_286 - 2) * 16))];
+        x_292 = (x_291 == 0);
+        x_293_phi = x_292;
+      }
+      bool const x_293 = x_293_phi;
+      if (x_293) {
+        int const x_296 = d;
+        d = (x_296 - 1);
+        int const x_299 = p.x;
+        int const x_301 = p.y;
+        (*(tint_symbol_6)).arr[(x_299 + (x_301 * 16))] = 1;
+        int const x_306 = p.x;
+        int const x_308 = p.y;
+        (*(tint_symbol_6)).arr[(x_306 + ((x_308 - 1) * 16))] = 1;
+        int const x_314 = p.x;
+        int const x_316 = p.y;
+        (*(tint_symbol_6)).arr[(x_314 + ((x_316 - 2) * 16))] = 1;
+        int const x_322 = p.y;
+        p.y = (x_322 - 2);
+      }
+      int const x_325 = d;
+      bool const x_326 = (x_325 >= 0);
+      x_332_phi = x_326;
+      if (x_326) {
+        int const x_330 = p.x;
+        x_331 = (x_330 < 14);
+        x_332_phi = x_331;
+      }
+      bool const x_332 = x_332_phi;
+      x_345_phi = x_332;
+      if (x_332) {
+        int const x_336 = p.x;
+        int const x_339 = p.y;
+        int const x_343 = (*(tint_symbol_6)).arr[((x_336 + 2) + (x_339 * 16))];
+        x_344 = (x_343 == 0);
+        x_345_phi = x_344;
+      }
+      bool const x_345 = x_345_phi;
+      if (x_345) {
+        int const x_348 = d;
+        d = (x_348 - 1);
+        int const x_351 = p.x;
+        int const x_353 = p.y;
+        (*(tint_symbol_6)).arr[(x_351 + (x_353 * 16))] = 1;
+        int const x_358 = p.x;
+        int const x_361 = p.y;
+        (*(tint_symbol_6)).arr[((x_358 + 1) + (x_361 * 16))] = 1;
+        int const x_366 = p.x;
+        int const x_369 = p.y;
+        (*(tint_symbol_6)).arr[((x_366 + 2) + (x_369 * 16))] = 1;
+        int const x_374 = p.x;
+        p.x = (x_374 + 2);
+      }
+      int const x_377 = d;
+      bool const x_378 = (x_377 >= 0);
+      x_384_phi = x_378;
+      if (x_378) {
+        int const x_382 = p.y;
+        x_383 = (x_382 < 14);
+        x_384_phi = x_383;
+      }
+      bool const x_384 = x_384_phi;
+      x_397_phi = x_384;
+      if (x_384) {
+        int const x_388 = p.x;
+        int const x_390 = p.y;
+        int const x_395 = (*(tint_symbol_6)).arr[(x_388 + ((x_390 + 2) * 16))];
+        x_396 = (x_395 == 0);
+        x_397_phi = x_396;
+      }
+      bool const x_397 = x_397_phi;
+      if (x_397) {
+        int const x_400 = d;
+        d = (x_400 - 1);
+        int const x_403 = p.x;
+        int const x_405 = p.y;
+        (*(tint_symbol_6)).arr[(x_403 + (x_405 * 16))] = 1;
+        int const x_410 = p.x;
+        int const x_412 = p.y;
+        (*(tint_symbol_6)).arr[(x_410 + ((x_412 + 1) * 16))] = 1;
+        int const x_418 = p.x;
+        int const x_420 = p.y;
+        (*(tint_symbol_6)).arr[(x_418 + ((x_420 + 2) * 16))] = 1;
+        int const x_426 = p.y;
+        p.y = (x_426 + 2);
+      }
+    }
+    int const x_430 = ipos.y;
+    int const x_433 = ipos.x;
+    int const x_436 = (*(tint_symbol_6)).arr[((x_430 * 16) + x_433)];
+    if ((x_436 == 1)) {
+      *(tint_symbol_7) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+      return;
+    }
+    {
+      bool const x_440 = canwalk;
+      if (x_440) {
+      } else {
+        break;
+      }
+    }
+  }
+  *(tint_symbol_7) = float4(0.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread tint_array_wrapper tint_symbol_9 = {};
+  thread float4 tint_symbol_10 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_7, &(tint_symbol_8), &(tint_symbol_9), &(tint_symbol_10));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_10};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-access-chains/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-access-chains/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..4613f9f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-access-chains/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,775 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 509
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_7 "x_7"
+               OpName %map "map"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %pos "pos"
+               OpName %ipos "ipos"
+               OpName %i "i"
+               OpName %p "p"
+               OpName %canwalk "canwalk"
+               OpName %v "v"
+               OpName %directions "directions"
+               OpName %j "j"
+               OpName %d "d"
+               OpName %x_102 "x_102"
+               OpName %x_122 "x_122"
+               OpName %x_142 "x_142"
+               OpName %x_162 "x_162"
+               OpName %x_103_phi "x_103_phi"
+               OpName %x_123_phi "x_123_phi"
+               OpName %x_143_phi "x_143_phi"
+               OpName %x_163_phi "x_163_phi"
+               OpName %x_227 "x_227"
+               OpName %x_240 "x_240"
+               OpName %x_279 "x_279"
+               OpName %x_292 "x_292"
+               OpName %x_331 "x_331"
+               OpName %x_344 "x_344"
+               OpName %x_383 "x_383"
+               OpName %x_396 "x_396"
+               OpName %x_228_phi "x_228_phi"
+               OpName %x_241_phi "x_241_phi"
+               OpName %x_280_phi "x_280_phi"
+               OpName %x_293_phi "x_293_phi"
+               OpName %x_332_phi "x_332_phi"
+               OpName %x_345_phi "x_345_phi"
+               OpName %x_384_phi "x_384_phi"
+               OpName %x_397_phi "x_397_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %_arr_int_uint_256 ArrayStride 4
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+   %uint_256 = OpConstant %uint 256
+%_arr_int_uint_256 = OpTypeArray %int %uint_256
+%_ptr_Private__arr_int_uint_256 = OpTypePointer Private %_arr_int_uint_256
+         %16 = OpConstantNull %_arr_int_uint_256
+        %map = OpVariable %_ptr_Private__arr_int_uint_256 Private %16
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %22 = OpTypeFunction %void
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %28 = OpConstantNull %v2float
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %32 = OpConstantNull %v2int
+%_ptr_Function_int = OpTypePointer Function %int
+         %35 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %40 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+   %float_16 = OpConstant %float 16
+      %int_0 = OpConstant %int 0
+    %int_256 = OpConstant %int 256
+%_ptr_Private_int = OpTypePointer Private %int
+      %int_1 = OpConstant %int 1
+         %83 = OpConstantComposite %v2int %int_0 %int_0
+       %true = OpConstantTrue %bool
+      %int_2 = OpConstant %int 2
+     %int_16 = OpConstant %int 16
+     %int_14 = OpConstant %int 14
+      %false = OpConstantFalse %bool
+      %int_8 = OpConstant %int 8
+    %float_1 = OpConstant %float 1
+        %489 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+    %float_0 = OpConstant %float 0
+        %495 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %496 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %22
+         %25 = OpLabel
+        %pos = OpVariable %_ptr_Function_v2float Function %28
+       %ipos = OpVariable %_ptr_Function_v2int Function %32
+          %i = OpVariable %_ptr_Function_int Function %35
+          %p = OpVariable %_ptr_Function_v2int Function %32
+    %canwalk = OpVariable %_ptr_Function_bool Function %40
+          %v = OpVariable %_ptr_Function_int Function %35
+ %directions = OpVariable %_ptr_Function_int Function %35
+          %j = OpVariable %_ptr_Function_int Function %35
+          %d = OpVariable %_ptr_Function_int Function %35
+      %x_102 = OpVariable %_ptr_Function_bool Function %40
+      %x_122 = OpVariable %_ptr_Function_bool Function %40
+      %x_142 = OpVariable %_ptr_Function_bool Function %40
+      %x_162 = OpVariable %_ptr_Function_bool Function %40
+  %x_103_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_123_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_143_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_163_phi = OpVariable %_ptr_Function_bool Function %40
+      %x_227 = OpVariable %_ptr_Function_bool Function %40
+      %x_240 = OpVariable %_ptr_Function_bool Function %40
+      %x_279 = OpVariable %_ptr_Function_bool Function %40
+      %x_292 = OpVariable %_ptr_Function_bool Function %40
+      %x_331 = OpVariable %_ptr_Function_bool Function %40
+      %x_344 = OpVariable %_ptr_Function_bool Function %40
+      %x_383 = OpVariable %_ptr_Function_bool Function %40
+      %x_396 = OpVariable %_ptr_Function_bool Function %40
+  %x_228_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_241_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_280_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_293_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_332_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_345_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_384_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_397_phi = OpVariable %_ptr_Function_bool Function %40
+         %45 = OpLoad %v4float %gl_FragCoord
+         %48 = OpAccessChain %_ptr_Uniform_v2float %x_7 %uint_0
+         %49 = OpLoad %v2float %48
+         %50 = OpCompositeExtract %float %45 0
+         %51 = OpCompositeExtract %float %45 1
+         %52 = OpCompositeConstruct %v2float %50 %51
+         %53 = OpFDiv %v2float %52 %49
+               OpStore %pos %53
+         %55 = OpAccessChain %_ptr_Function_float %pos %uint_0
+         %56 = OpLoad %float %55
+         %58 = OpAccessChain %_ptr_Function_float %pos %uint_1
+         %59 = OpLoad %float %58
+         %62 = OpFMul %float %56 %float_16
+         %60 = OpConvertFToS %int %62
+         %64 = OpFMul %float %59 %float_16
+         %63 = OpConvertFToS %int %64
+         %65 = OpCompositeConstruct %v2int %60 %63
+               OpStore %ipos %65
+               OpStore %i %int_0
+               OpBranch %67
+         %67 = OpLabel
+               OpLoopMerge %68 %69 None
+               OpBranch %70
+         %70 = OpLabel
+         %71 = OpLoad %int %i
+         %73 = OpSLessThan %bool %71 %int_256
+               OpSelectionMerge %74 None
+               OpBranchConditional %73 %75 %76
+         %75 = OpLabel
+               OpBranch %74
+         %76 = OpLabel
+               OpBranch %68
+         %74 = OpLabel
+         %77 = OpLoad %int %i
+         %79 = OpAccessChain %_ptr_Private_int %map %77
+               OpStore %79 %int_0
+               OpBranch %69
+         %69 = OpLabel
+         %80 = OpLoad %int %i
+         %82 = OpIAdd %int %80 %int_1
+               OpStore %i %82
+               OpBranch %67
+         %68 = OpLabel
+               OpStore %p %83
+               OpStore %canwalk %true
+               OpStore %v %int_0
+               OpBranch %85
+         %85 = OpLabel
+               OpLoopMerge %86 %87 None
+               OpBranch %88
+         %88 = OpLabel
+         %97 = OpLoad %int %v
+         %98 = OpIAdd %int %97 %int_1
+               OpStore %v %98
+               OpStore %directions %int_0
+         %99 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %100 = OpLoad %int %99
+        %101 = OpSGreaterThan %bool %100 %int_0
+               OpStore %x_103_phi %101
+               OpSelectionMerge %102 None
+               OpBranchConditional %101 %103 %102
+        %103 = OpLabel
+        %104 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %105 = OpLoad %int %104
+        %106 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %107 = OpLoad %int %106
+        %109 = OpISub %int %105 %int_2
+        %111 = OpIMul %int %107 %int_16
+        %112 = OpIAdd %int %109 %111
+        %113 = OpAccessChain %_ptr_Private_int %map %112
+        %114 = OpLoad %int %113
+        %115 = OpIEqual %bool %114 %int_0
+               OpStore %x_102 %115
+        %116 = OpLoad %bool %x_102
+               OpStore %x_103_phi %116
+               OpBranch %102
+        %102 = OpLabel
+        %117 = OpLoad %bool %x_103_phi
+               OpSelectionMerge %118 None
+               OpBranchConditional %117 %119 %118
+        %119 = OpLabel
+        %120 = OpLoad %int %directions
+        %121 = OpIAdd %int %120 %int_1
+               OpStore %directions %121
+               OpBranch %118
+        %118 = OpLabel
+        %122 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %123 = OpLoad %int %122
+        %124 = OpSGreaterThan %bool %123 %int_0
+               OpStore %x_123_phi %124
+               OpSelectionMerge %125 None
+               OpBranchConditional %124 %126 %125
+        %126 = OpLabel
+        %127 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %128 = OpLoad %int %127
+        %129 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %130 = OpLoad %int %129
+        %131 = OpISub %int %130 %int_2
+        %132 = OpIMul %int %131 %int_16
+        %133 = OpIAdd %int %128 %132
+        %134 = OpAccessChain %_ptr_Private_int %map %133
+        %135 = OpLoad %int %134
+        %136 = OpIEqual %bool %135 %int_0
+               OpStore %x_122 %136
+        %137 = OpLoad %bool %x_122
+               OpStore %x_123_phi %137
+               OpBranch %125
+        %125 = OpLabel
+        %138 = OpLoad %bool %x_123_phi
+               OpSelectionMerge %139 None
+               OpBranchConditional %138 %140 %139
+        %140 = OpLabel
+        %141 = OpLoad %int %directions
+        %142 = OpIAdd %int %141 %int_1
+               OpStore %directions %142
+               OpBranch %139
+        %139 = OpLabel
+        %143 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %144 = OpLoad %int %143
+        %146 = OpSLessThan %bool %144 %int_14
+               OpStore %x_143_phi %146
+               OpSelectionMerge %147 None
+               OpBranchConditional %146 %148 %147
+        %148 = OpLabel
+        %149 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %150 = OpLoad %int %149
+        %151 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %152 = OpLoad %int %151
+        %153 = OpIAdd %int %150 %int_2
+        %154 = OpIMul %int %152 %int_16
+        %155 = OpIAdd %int %153 %154
+        %156 = OpAccessChain %_ptr_Private_int %map %155
+        %157 = OpLoad %int %156
+        %158 = OpIEqual %bool %157 %int_0
+               OpStore %x_142 %158
+        %159 = OpLoad %bool %x_142
+               OpStore %x_143_phi %159
+               OpBranch %147
+        %147 = OpLabel
+        %160 = OpLoad %bool %x_143_phi
+               OpSelectionMerge %161 None
+               OpBranchConditional %160 %162 %161
+        %162 = OpLabel
+        %163 = OpLoad %int %directions
+        %164 = OpIAdd %int %163 %int_1
+               OpStore %directions %164
+               OpBranch %161
+        %161 = OpLabel
+        %165 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %166 = OpLoad %int %165
+        %167 = OpSLessThan %bool %166 %int_14
+               OpStore %x_163_phi %167
+               OpSelectionMerge %168 None
+               OpBranchConditional %167 %169 %168
+        %169 = OpLabel
+        %170 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %171 = OpLoad %int %170
+        %172 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %173 = OpLoad %int %172
+        %174 = OpIAdd %int %173 %int_2
+        %175 = OpIMul %int %174 %int_16
+        %176 = OpIAdd %int %171 %175
+        %177 = OpAccessChain %_ptr_Private_int %map %176
+        %178 = OpLoad %int %177
+        %179 = OpIEqual %bool %178 %int_0
+               OpStore %x_162 %179
+        %180 = OpLoad %bool %x_162
+               OpStore %x_163_phi %180
+               OpBranch %168
+        %168 = OpLabel
+        %181 = OpLoad %bool %x_163_phi
+               OpSelectionMerge %182 None
+               OpBranchConditional %181 %183 %182
+        %183 = OpLabel
+        %184 = OpLoad %int %directions
+        %185 = OpIAdd %int %184 %int_1
+               OpStore %directions %185
+               OpBranch %182
+        %182 = OpLabel
+        %202 = OpLoad %int %directions
+        %203 = OpIEqual %bool %202 %int_0
+               OpSelectionMerge %204 None
+               OpBranchConditional %203 %205 %206
+        %205 = OpLabel
+               OpStore %canwalk %false
+               OpStore %i %int_0
+               OpBranch %208
+        %208 = OpLabel
+               OpLoopMerge %209 %210 None
+               OpBranch %211
+        %211 = OpLabel
+        %212 = OpLoad %int %i
+        %214 = OpSLessThan %bool %212 %int_8
+               OpSelectionMerge %215 None
+               OpBranchConditional %214 %216 %217
+        %216 = OpLabel
+               OpBranch %215
+        %217 = OpLabel
+               OpBranch %209
+        %215 = OpLabel
+               OpStore %j %int_0
+               OpBranch %218
+        %218 = OpLabel
+               OpLoopMerge %219 %220 None
+               OpBranch %221
+        %221 = OpLabel
+        %222 = OpLoad %int %j
+        %223 = OpSLessThan %bool %222 %int_8
+               OpSelectionMerge %224 None
+               OpBranchConditional %223 %225 %226
+        %225 = OpLabel
+               OpBranch %224
+        %226 = OpLabel
+               OpBranch %219
+        %224 = OpLabel
+        %227 = OpLoad %int %j
+        %228 = OpLoad %int %i
+        %229 = OpIMul %int %227 %int_2
+        %230 = OpIMul %int %228 %int_2
+        %231 = OpIMul %int %230 %int_16
+        %232 = OpIAdd %int %229 %231
+        %233 = OpAccessChain %_ptr_Private_int %map %232
+        %234 = OpLoad %int %233
+        %235 = OpIEqual %bool %234 %int_0
+               OpSelectionMerge %236 None
+               OpBranchConditional %235 %237 %236
+        %237 = OpLabel
+        %238 = OpLoad %int %j
+        %239 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %240 = OpIMul %int %238 %int_2
+               OpStore %239 %240
+        %241 = OpLoad %int %i
+        %242 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %243 = OpIMul %int %241 %int_2
+               OpStore %242 %243
+               OpStore %canwalk %true
+               OpBranch %236
+        %236 = OpLabel
+               OpBranch %220
+        %220 = OpLabel
+        %244 = OpLoad %int %j
+        %245 = OpIAdd %int %244 %int_1
+               OpStore %j %245
+               OpBranch %218
+        %219 = OpLabel
+               OpBranch %210
+        %210 = OpLabel
+        %246 = OpLoad %int %i
+        %247 = OpIAdd %int %246 %int_1
+               OpStore %i %247
+               OpBranch %208
+        %209 = OpLabel
+        %248 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %249 = OpLoad %int %248
+        %250 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %251 = OpLoad %int %250
+        %252 = OpIMul %int %251 %int_16
+        %253 = OpIAdd %int %249 %252
+        %254 = OpAccessChain %_ptr_Private_int %map %253
+               OpStore %254 %int_1
+               OpBranch %204
+        %206 = OpLabel
+        %255 = OpLoad %int %v
+        %256 = OpLoad %int %directions
+        %257 = OpSMod %int %255 %256
+               OpStore %d %257
+        %258 = OpLoad %int %directions
+        %259 = OpLoad %int %v
+        %260 = OpIAdd %int %259 %258
+               OpStore %v %260
+        %261 = OpLoad %int %d
+        %262 = OpSGreaterThanEqual %bool %261 %int_0
+               OpStore %x_228_phi %262
+               OpSelectionMerge %263 None
+               OpBranchConditional %262 %264 %263
+        %264 = OpLabel
+        %265 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %266 = OpLoad %int %265
+        %267 = OpSGreaterThan %bool %266 %int_0
+               OpStore %x_227 %267
+        %268 = OpLoad %bool %x_227
+               OpStore %x_228_phi %268
+               OpBranch %263
+        %263 = OpLabel
+        %269 = OpLoad %bool %x_228_phi
+               OpStore %x_241_phi %269
+               OpSelectionMerge %270 None
+               OpBranchConditional %269 %271 %270
+        %271 = OpLabel
+        %272 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %273 = OpLoad %int %272
+        %274 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %275 = OpLoad %int %274
+        %276 = OpISub %int %273 %int_2
+        %277 = OpIMul %int %275 %int_16
+        %278 = OpIAdd %int %276 %277
+        %279 = OpAccessChain %_ptr_Private_int %map %278
+        %280 = OpLoad %int %279
+        %281 = OpIEqual %bool %280 %int_0
+               OpStore %x_240 %281
+        %282 = OpLoad %bool %x_240
+               OpStore %x_241_phi %282
+               OpBranch %270
+        %270 = OpLabel
+        %283 = OpLoad %bool %x_241_phi
+               OpSelectionMerge %284 None
+               OpBranchConditional %283 %285 %284
+        %285 = OpLabel
+        %286 = OpLoad %int %d
+        %287 = OpISub %int %286 %int_1
+               OpStore %d %287
+        %288 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %289 = OpLoad %int %288
+        %290 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %291 = OpLoad %int %290
+        %292 = OpIMul %int %291 %int_16
+        %293 = OpIAdd %int %289 %292
+        %294 = OpAccessChain %_ptr_Private_int %map %293
+               OpStore %294 %int_1
+        %295 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %296 = OpLoad %int %295
+        %297 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %298 = OpLoad %int %297
+        %299 = OpISub %int %296 %int_1
+        %300 = OpIMul %int %298 %int_16
+        %301 = OpIAdd %int %299 %300
+        %302 = OpAccessChain %_ptr_Private_int %map %301
+               OpStore %302 %int_1
+        %303 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %304 = OpLoad %int %303
+        %305 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %306 = OpLoad %int %305
+        %307 = OpISub %int %304 %int_2
+        %308 = OpIMul %int %306 %int_16
+        %309 = OpIAdd %int %307 %308
+        %310 = OpAccessChain %_ptr_Private_int %map %309
+               OpStore %310 %int_1
+        %311 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %312 = OpLoad %int %311
+        %313 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %314 = OpISub %int %312 %int_2
+               OpStore %313 %314
+               OpBranch %284
+        %284 = OpLabel
+        %315 = OpLoad %int %d
+        %316 = OpSGreaterThanEqual %bool %315 %int_0
+               OpStore %x_280_phi %316
+               OpSelectionMerge %317 None
+               OpBranchConditional %316 %318 %317
+        %318 = OpLabel
+        %319 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %320 = OpLoad %int %319
+        %321 = OpSGreaterThan %bool %320 %int_0
+               OpStore %x_279 %321
+        %322 = OpLoad %bool %x_279
+               OpStore %x_280_phi %322
+               OpBranch %317
+        %317 = OpLabel
+        %323 = OpLoad %bool %x_280_phi
+               OpStore %x_293_phi %323
+               OpSelectionMerge %324 None
+               OpBranchConditional %323 %325 %324
+        %325 = OpLabel
+        %326 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %327 = OpLoad %int %326
+        %328 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %329 = OpLoad %int %328
+        %330 = OpISub %int %329 %int_2
+        %331 = OpIMul %int %330 %int_16
+        %332 = OpIAdd %int %327 %331
+        %333 = OpAccessChain %_ptr_Private_int %map %332
+        %334 = OpLoad %int %333
+        %335 = OpIEqual %bool %334 %int_0
+               OpStore %x_292 %335
+        %336 = OpLoad %bool %x_292
+               OpStore %x_293_phi %336
+               OpBranch %324
+        %324 = OpLabel
+        %337 = OpLoad %bool %x_293_phi
+               OpSelectionMerge %338 None
+               OpBranchConditional %337 %339 %338
+        %339 = OpLabel
+        %340 = OpLoad %int %d
+        %341 = OpISub %int %340 %int_1
+               OpStore %d %341
+        %342 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %343 = OpLoad %int %342
+        %344 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %345 = OpLoad %int %344
+        %346 = OpIMul %int %345 %int_16
+        %347 = OpIAdd %int %343 %346
+        %348 = OpAccessChain %_ptr_Private_int %map %347
+               OpStore %348 %int_1
+        %349 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %350 = OpLoad %int %349
+        %351 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %352 = OpLoad %int %351
+        %353 = OpISub %int %352 %int_1
+        %354 = OpIMul %int %353 %int_16
+        %355 = OpIAdd %int %350 %354
+        %356 = OpAccessChain %_ptr_Private_int %map %355
+               OpStore %356 %int_1
+        %357 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %358 = OpLoad %int %357
+        %359 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %360 = OpLoad %int %359
+        %361 = OpISub %int %360 %int_2
+        %362 = OpIMul %int %361 %int_16
+        %363 = OpIAdd %int %358 %362
+        %364 = OpAccessChain %_ptr_Private_int %map %363
+               OpStore %364 %int_1
+        %365 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %366 = OpLoad %int %365
+        %367 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %368 = OpISub %int %366 %int_2
+               OpStore %367 %368
+               OpBranch %338
+        %338 = OpLabel
+        %369 = OpLoad %int %d
+        %370 = OpSGreaterThanEqual %bool %369 %int_0
+               OpStore %x_332_phi %370
+               OpSelectionMerge %371 None
+               OpBranchConditional %370 %372 %371
+        %372 = OpLabel
+        %373 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %374 = OpLoad %int %373
+        %375 = OpSLessThan %bool %374 %int_14
+               OpStore %x_331 %375
+        %376 = OpLoad %bool %x_331
+               OpStore %x_332_phi %376
+               OpBranch %371
+        %371 = OpLabel
+        %377 = OpLoad %bool %x_332_phi
+               OpStore %x_345_phi %377
+               OpSelectionMerge %378 None
+               OpBranchConditional %377 %379 %378
+        %379 = OpLabel
+        %380 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %381 = OpLoad %int %380
+        %382 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %383 = OpLoad %int %382
+        %384 = OpIAdd %int %381 %int_2
+        %385 = OpIMul %int %383 %int_16
+        %386 = OpIAdd %int %384 %385
+        %387 = OpAccessChain %_ptr_Private_int %map %386
+        %388 = OpLoad %int %387
+        %389 = OpIEqual %bool %388 %int_0
+               OpStore %x_344 %389
+        %390 = OpLoad %bool %x_344
+               OpStore %x_345_phi %390
+               OpBranch %378
+        %378 = OpLabel
+        %391 = OpLoad %bool %x_345_phi
+               OpSelectionMerge %392 None
+               OpBranchConditional %391 %393 %392
+        %393 = OpLabel
+        %394 = OpLoad %int %d
+        %395 = OpISub %int %394 %int_1
+               OpStore %d %395
+        %396 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %397 = OpLoad %int %396
+        %398 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %399 = OpLoad %int %398
+        %400 = OpIMul %int %399 %int_16
+        %401 = OpIAdd %int %397 %400
+        %402 = OpAccessChain %_ptr_Private_int %map %401
+               OpStore %402 %int_1
+        %403 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %404 = OpLoad %int %403
+        %405 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %406 = OpLoad %int %405
+        %407 = OpIAdd %int %404 %int_1
+        %408 = OpIMul %int %406 %int_16
+        %409 = OpIAdd %int %407 %408
+        %410 = OpAccessChain %_ptr_Private_int %map %409
+               OpStore %410 %int_1
+        %411 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %412 = OpLoad %int %411
+        %413 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %414 = OpLoad %int %413
+        %415 = OpIAdd %int %412 %int_2
+        %416 = OpIMul %int %414 %int_16
+        %417 = OpIAdd %int %415 %416
+        %418 = OpAccessChain %_ptr_Private_int %map %417
+               OpStore %418 %int_1
+        %419 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %420 = OpLoad %int %419
+        %421 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %422 = OpIAdd %int %420 %int_2
+               OpStore %421 %422
+               OpBranch %392
+        %392 = OpLabel
+        %423 = OpLoad %int %d
+        %424 = OpSGreaterThanEqual %bool %423 %int_0
+               OpStore %x_384_phi %424
+               OpSelectionMerge %425 None
+               OpBranchConditional %424 %426 %425
+        %426 = OpLabel
+        %427 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %428 = OpLoad %int %427
+        %429 = OpSLessThan %bool %428 %int_14
+               OpStore %x_383 %429
+        %430 = OpLoad %bool %x_383
+               OpStore %x_384_phi %430
+               OpBranch %425
+        %425 = OpLabel
+        %431 = OpLoad %bool %x_384_phi
+               OpStore %x_397_phi %431
+               OpSelectionMerge %432 None
+               OpBranchConditional %431 %433 %432
+        %433 = OpLabel
+        %434 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %435 = OpLoad %int %434
+        %436 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %437 = OpLoad %int %436
+        %438 = OpIAdd %int %437 %int_2
+        %439 = OpIMul %int %438 %int_16
+        %440 = OpIAdd %int %435 %439
+        %441 = OpAccessChain %_ptr_Private_int %map %440
+        %442 = OpLoad %int %441
+        %443 = OpIEqual %bool %442 %int_0
+               OpStore %x_396 %443
+        %444 = OpLoad %bool %x_396
+               OpStore %x_397_phi %444
+               OpBranch %432
+        %432 = OpLabel
+        %445 = OpLoad %bool %x_397_phi
+               OpSelectionMerge %446 None
+               OpBranchConditional %445 %447 %446
+        %447 = OpLabel
+        %448 = OpLoad %int %d
+        %449 = OpISub %int %448 %int_1
+               OpStore %d %449
+        %450 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %451 = OpLoad %int %450
+        %452 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %453 = OpLoad %int %452
+        %454 = OpIMul %int %453 %int_16
+        %455 = OpIAdd %int %451 %454
+        %456 = OpAccessChain %_ptr_Private_int %map %455
+               OpStore %456 %int_1
+        %457 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %458 = OpLoad %int %457
+        %459 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %460 = OpLoad %int %459
+        %461 = OpIAdd %int %460 %int_1
+        %462 = OpIMul %int %461 %int_16
+        %463 = OpIAdd %int %458 %462
+        %464 = OpAccessChain %_ptr_Private_int %map %463
+               OpStore %464 %int_1
+        %465 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %466 = OpLoad %int %465
+        %467 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %468 = OpLoad %int %467
+        %469 = OpIAdd %int %468 %int_2
+        %470 = OpIMul %int %469 %int_16
+        %471 = OpIAdd %int %466 %470
+        %472 = OpAccessChain %_ptr_Private_int %map %471
+               OpStore %472 %int_1
+        %473 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %474 = OpLoad %int %473
+        %475 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %476 = OpIAdd %int %474 %int_2
+               OpStore %475 %476
+               OpBranch %446
+        %446 = OpLabel
+               OpBranch %204
+        %204 = OpLabel
+        %477 = OpAccessChain %_ptr_Function_int %ipos %uint_1
+        %478 = OpLoad %int %477
+        %479 = OpAccessChain %_ptr_Function_int %ipos %uint_0
+        %480 = OpLoad %int %479
+        %481 = OpIMul %int %478 %int_16
+        %482 = OpIAdd %int %481 %480
+        %483 = OpAccessChain %_ptr_Private_int %map %482
+        %484 = OpLoad %int %483
+        %485 = OpIEqual %bool %484 %int_1
+               OpSelectionMerge %486 None
+               OpBranchConditional %485 %487 %486
+        %487 = OpLabel
+               OpStore %x_GLF_color %489
+               OpReturn
+        %486 = OpLabel
+               OpBranch %87
+         %87 = OpLabel
+        %490 = OpLoad %bool %canwalk
+               OpSelectionMerge %491 None
+               OpBranchConditional %490 %492 %493
+        %492 = OpLabel
+               OpBranch %491
+        %493 = OpLabel
+               OpBranch %86
+        %491 = OpLabel
+               OpBranch %85
+         %86 = OpLabel
+               OpStore %x_GLF_color %495
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %496
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %500 = OpLabel
+        %501 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %501
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %22
+        %503 = OpLabel
+        %504 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %504
+        %505 = OpFunctionCall %void %main_1
+        %507 = OpLoad %v4float %x_GLF_color
+        %508 = OpCompositeConstruct %main_out %507
+        %506 = OpFunctionCall %void %tint_symbol_3 %508
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 87[%87] is not post dominated by the back-edge block 491[%491]
+  %491 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-access-chains/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-access-chains/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..4128fb7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-access-chains/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,348 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> map : array<i32, 256>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var pos : vec2<f32>;
+  var ipos : vec2<i32>;
+  var i : i32;
+  var p : vec2<i32>;
+  var canwalk : bool;
+  var v : i32;
+  var directions : i32;
+  var j : i32;
+  var d : i32;
+  let x_57 : vec4<f32> = gl_FragCoord;
+  let x_60 : vec2<f32> = x_7.resolution;
+  pos = (vec2<f32>(x_57.x, x_57.y) / x_60);
+  let x_63 : f32 = pos.x;
+  let x_67 : f32 = pos.y;
+  ipos = vec2<i32>(i32((x_63 * 16.0)), i32((x_67 * 16.0)));
+  i = 0;
+  loop {
+    let x_75 : i32 = i;
+    if ((x_75 < 256)) {
+    } else {
+      break;
+    }
+    let x_78 : i32 = i;
+    map[x_78] = 0;
+
+    continuing {
+      let x_80 : i32 = i;
+      i = (x_80 + 1);
+    }
+  }
+  p = vec2<i32>(0, 0);
+  canwalk = true;
+  v = 0;
+  loop {
+    var x_102 : bool;
+    var x_122 : bool;
+    var x_142 : bool;
+    var x_162 : bool;
+    var x_103_phi : bool;
+    var x_123_phi : bool;
+    var x_143_phi : bool;
+    var x_163_phi : bool;
+    let x_86 : i32 = v;
+    v = (x_86 + 1);
+    directions = 0;
+    let x_89 : i32 = p.x;
+    let x_90 : bool = (x_89 > 0);
+    x_103_phi = x_90;
+    if (x_90) {
+      let x_94 : i32 = p.x;
+      let x_97 : i32 = p.y;
+      let x_101 : i32 = map[((x_94 - 2) + (x_97 * 16))];
+      x_102 = (x_101 == 0);
+      x_103_phi = x_102;
+    }
+    let x_103 : bool = x_103_phi;
+    if (x_103) {
+      let x_106 : i32 = directions;
+      directions = (x_106 + 1);
+    }
+    let x_109 : i32 = p.y;
+    let x_110 : bool = (x_109 > 0);
+    x_123_phi = x_110;
+    if (x_110) {
+      let x_114 : i32 = p.x;
+      let x_116 : i32 = p.y;
+      let x_121 : i32 = map[(x_114 + ((x_116 - 2) * 16))];
+      x_122 = (x_121 == 0);
+      x_123_phi = x_122;
+    }
+    let x_123 : bool = x_123_phi;
+    if (x_123) {
+      let x_126 : i32 = directions;
+      directions = (x_126 + 1);
+    }
+    let x_129 : i32 = p.x;
+    let x_130 : bool = (x_129 < 14);
+    x_143_phi = x_130;
+    if (x_130) {
+      let x_134 : i32 = p.x;
+      let x_137 : i32 = p.y;
+      let x_141 : i32 = map[((x_134 + 2) + (x_137 * 16))];
+      x_142 = (x_141 == 0);
+      x_143_phi = x_142;
+    }
+    let x_143 : bool = x_143_phi;
+    if (x_143) {
+      let x_146 : i32 = directions;
+      directions = (x_146 + 1);
+    }
+    let x_149 : i32 = p.y;
+    let x_150 : bool = (x_149 < 14);
+    x_163_phi = x_150;
+    if (x_150) {
+      let x_154 : i32 = p.x;
+      let x_156 : i32 = p.y;
+      let x_161 : i32 = map[(x_154 + ((x_156 + 2) * 16))];
+      x_162 = (x_161 == 0);
+      x_163_phi = x_162;
+    }
+    let x_163 : bool = x_163_phi;
+    if (x_163) {
+      let x_166 : i32 = directions;
+      directions = (x_166 + 1);
+    }
+    var x_227 : bool;
+    var x_240 : bool;
+    var x_279 : bool;
+    var x_292 : bool;
+    var x_331 : bool;
+    var x_344 : bool;
+    var x_383 : bool;
+    var x_396 : bool;
+    var x_228_phi : bool;
+    var x_241_phi : bool;
+    var x_280_phi : bool;
+    var x_293_phi : bool;
+    var x_332_phi : bool;
+    var x_345_phi : bool;
+    var x_384_phi : bool;
+    var x_397_phi : bool;
+    let x_168 : i32 = directions;
+    if ((x_168 == 0)) {
+      canwalk = false;
+      i = 0;
+      loop {
+        let x_177 : i32 = i;
+        if ((x_177 < 8)) {
+        } else {
+          break;
+        }
+        j = 0;
+        loop {
+          let x_184 : i32 = j;
+          if ((x_184 < 8)) {
+          } else {
+            break;
+          }
+          let x_187 : i32 = j;
+          let x_189 : i32 = i;
+          let x_194 : i32 = map[((x_187 * 2) + ((x_189 * 2) * 16))];
+          if ((x_194 == 0)) {
+            let x_198 : i32 = j;
+            p.x = (x_198 * 2);
+            let x_201 : i32 = i;
+            p.y = (x_201 * 2);
+            canwalk = true;
+          }
+
+          continuing {
+            let x_204 : i32 = j;
+            j = (x_204 + 1);
+          }
+        }
+
+        continuing {
+          let x_206 : i32 = i;
+          i = (x_206 + 1);
+        }
+      }
+      let x_209 : i32 = p.x;
+      let x_211 : i32 = p.y;
+      map[(x_209 + (x_211 * 16))] = 1;
+    } else {
+      let x_215 : i32 = v;
+      let x_216 : i32 = directions;
+      d = (x_215 % x_216);
+      let x_218 : i32 = directions;
+      let x_219 : i32 = v;
+      v = (x_219 + x_218);
+      let x_221 : i32 = d;
+      let x_222 : bool = (x_221 >= 0);
+      x_228_phi = x_222;
+      if (x_222) {
+        let x_226 : i32 = p.x;
+        x_227 = (x_226 > 0);
+        x_228_phi = x_227;
+      }
+      let x_228 : bool = x_228_phi;
+      x_241_phi = x_228;
+      if (x_228) {
+        let x_232 : i32 = p.x;
+        let x_235 : i32 = p.y;
+        let x_239 : i32 = map[((x_232 - 2) + (x_235 * 16))];
+        x_240 = (x_239 == 0);
+        x_241_phi = x_240;
+      }
+      let x_241 : bool = x_241_phi;
+      if (x_241) {
+        let x_244 : i32 = d;
+        d = (x_244 - 1);
+        let x_247 : i32 = p.x;
+        let x_249 : i32 = p.y;
+        map[(x_247 + (x_249 * 16))] = 1;
+        let x_254 : i32 = p.x;
+        let x_257 : i32 = p.y;
+        map[((x_254 - 1) + (x_257 * 16))] = 1;
+        let x_262 : i32 = p.x;
+        let x_265 : i32 = p.y;
+        map[((x_262 - 2) + (x_265 * 16))] = 1;
+        let x_270 : i32 = p.x;
+        p.x = (x_270 - 2);
+      }
+      let x_273 : i32 = d;
+      let x_274 : bool = (x_273 >= 0);
+      x_280_phi = x_274;
+      if (x_274) {
+        let x_278 : i32 = p.y;
+        x_279 = (x_278 > 0);
+        x_280_phi = x_279;
+      }
+      let x_280 : bool = x_280_phi;
+      x_293_phi = x_280;
+      if (x_280) {
+        let x_284 : i32 = p.x;
+        let x_286 : i32 = p.y;
+        let x_291 : i32 = map[(x_284 + ((x_286 - 2) * 16))];
+        x_292 = (x_291 == 0);
+        x_293_phi = x_292;
+      }
+      let x_293 : bool = x_293_phi;
+      if (x_293) {
+        let x_296 : i32 = d;
+        d = (x_296 - 1);
+        let x_299 : i32 = p.x;
+        let x_301 : i32 = p.y;
+        map[(x_299 + (x_301 * 16))] = 1;
+        let x_306 : i32 = p.x;
+        let x_308 : i32 = p.y;
+        map[(x_306 + ((x_308 - 1) * 16))] = 1;
+        let x_314 : i32 = p.x;
+        let x_316 : i32 = p.y;
+        map[(x_314 + ((x_316 - 2) * 16))] = 1;
+        let x_322 : i32 = p.y;
+        p.y = (x_322 - 2);
+      }
+      let x_325 : i32 = d;
+      let x_326 : bool = (x_325 >= 0);
+      x_332_phi = x_326;
+      if (x_326) {
+        let x_330 : i32 = p.x;
+        x_331 = (x_330 < 14);
+        x_332_phi = x_331;
+      }
+      let x_332 : bool = x_332_phi;
+      x_345_phi = x_332;
+      if (x_332) {
+        let x_336 : i32 = p.x;
+        let x_339 : i32 = p.y;
+        let x_343 : i32 = map[((x_336 + 2) + (x_339 * 16))];
+        x_344 = (x_343 == 0);
+        x_345_phi = x_344;
+      }
+      let x_345 : bool = x_345_phi;
+      if (x_345) {
+        let x_348 : i32 = d;
+        d = (x_348 - 1);
+        let x_351 : i32 = p.x;
+        let x_353 : i32 = p.y;
+        map[(x_351 + (x_353 * 16))] = 1;
+        let x_358 : i32 = p.x;
+        let x_361 : i32 = p.y;
+        map[((x_358 + 1) + (x_361 * 16))] = 1;
+        let x_366 : i32 = p.x;
+        let x_369 : i32 = p.y;
+        map[((x_366 + 2) + (x_369 * 16))] = 1;
+        let x_374 : i32 = p.x;
+        p.x = (x_374 + 2);
+      }
+      let x_377 : i32 = d;
+      let x_378 : bool = (x_377 >= 0);
+      x_384_phi = x_378;
+      if (x_378) {
+        let x_382 : i32 = p.y;
+        x_383 = (x_382 < 14);
+        x_384_phi = x_383;
+      }
+      let x_384 : bool = x_384_phi;
+      x_397_phi = x_384;
+      if (x_384) {
+        let x_388 : i32 = p.x;
+        let x_390 : i32 = p.y;
+        let x_395 : i32 = map[(x_388 + ((x_390 + 2) * 16))];
+        x_396 = (x_395 == 0);
+        x_397_phi = x_396;
+      }
+      let x_397 : bool = x_397_phi;
+      if (x_397) {
+        let x_400 : i32 = d;
+        d = (x_400 - 1);
+        let x_403 : i32 = p.x;
+        let x_405 : i32 = p.y;
+        map[(x_403 + (x_405 * 16))] = 1;
+        let x_410 : i32 = p.x;
+        let x_412 : i32 = p.y;
+        map[(x_410 + ((x_412 + 1) * 16))] = 1;
+        let x_418 : i32 = p.x;
+        let x_420 : i32 = p.y;
+        map[(x_418 + ((x_420 + 2) * 16))] = 1;
+        let x_426 : i32 = p.y;
+        p.y = (x_426 + 2);
+      }
+    }
+    let x_430 : i32 = ipos.y;
+    let x_433 : i32 = ipos.x;
+    let x_436 : i32 = map[((x_430 * 16) + x_433)];
+    if ((x_436 == 1)) {
+      x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+      return;
+    }
+
+    continuing {
+      let x_440 : bool = canwalk;
+      if (x_440) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/0.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/0.spvasm
new file mode 100644
index 0000000..208f178
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/0.spvasm
@@ -0,0 +1,223 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %c "c"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+ %float_n0_5 = OpConstant %float -0.5
+        %int = OpTypeInt 32 1
+      %int_1 = OpConstant %int 1
+    %int_800 = OpConstant %int 800
+       %bool = OpTypeBool
+     %int_32 = OpConstant %int 32
+      %int_0 = OpConstant %int 0
+%float_0_400000006 = OpConstant %float 0.400000006
+%float_0_00999999978 = OpConstant %float 0.00999999978
+  %float_100 = OpConstant %float 100
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+    %float_7 = OpConstant %float 7
+    %float_8 = OpConstant %float 8
+    %float_9 = OpConstant %float 9
+         %27 = OpConstantComposite %v3float %float_7 %float_8 %float_9
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+%_ptr_Input_float = OpTypePointer Input %float
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+      %int_3 = OpConstant %int 3
+    %float_1 = OpConstant %float 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+      %false = OpConstantFalse %bool
+       %true = OpConstantTrue %bool
+         %43 = OpUndef %float
+%float_0_125 = OpConstant %float 0.125
+       %main = OpFunction %void None %9
+         %45 = OpLabel
+          %c = OpVariable %_ptr_Function_v3float Function
+               OpStore %c %27
+         %46 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %47 = OpLoad %float %46
+         %48 = OpFMul %float %47 %float_0_125
+         %49 = OpExtInst %float %1 Round %48
+         %50 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %51 = OpLoad %float %50
+               OpSelectionMerge %52 None
+               OpSwitch %uint_0 %53
+         %53 = OpLabel
+               OpBranch %54
+         %54 = OpLabel
+         %55 = OpPhi %float %float_n0_5 %53 %56 %57
+         %58 = OpPhi %int %int_1 %53 %59 %57
+         %60 = OpSLessThan %bool %58 %int_800
+               OpLoopMerge %61 %57 None
+               OpBranchConditional %60 %62 %61
+         %62 = OpLabel
+         %63 = OpSMod %int %58 %int_32
+         %64 = OpIEqual %bool %63 %int_0
+               OpSelectionMerge %65 None
+               OpBranchConditional %64 %66 %67
+         %66 = OpLabel
+         %68 = OpFAdd %float %55 %float_0_400000006
+               OpBranch %65
+         %67 = OpLabel
+         %69 = OpConvertSToF %float %58
+         %70 = OpExtInst %float %1 Round %49
+         %71 = OpFMod %float %69 %70
+         %72 = OpFOrdLessThanEqual %bool %71 %float_0_00999999978
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %74 %73
+         %74 = OpLabel
+         %75 = OpFAdd %float %55 %float_100
+               OpBranch %73
+         %73 = OpLabel
+         %76 = OpPhi %float %55 %67 %75 %74
+               OpBranch %65
+         %65 = OpLabel
+         %56 = OpPhi %float %68 %66 %76 %73
+         %77 = OpConvertSToF %float %58
+         %78 = OpFOrdGreaterThanEqual %bool %77 %51
+               OpSelectionMerge %79 None
+               OpBranchConditional %78 %80 %79
+         %80 = OpLabel
+               OpBranch %61
+         %79 = OpLabel
+               OpBranch %57
+         %57 = OpLabel
+         %59 = OpIAdd %int %58 %int_1
+               OpBranch %54
+         %61 = OpLabel
+         %81 = OpPhi %float %43 %54 %56 %80
+         %82 = OpPhi %float %55 %54 %56 %80
+         %83 = OpPhi %bool %false %54 %true %80
+               OpSelectionMerge %84 None
+               OpBranchConditional %83 %52 %84
+         %84 = OpLabel
+               OpBranch %52
+         %52 = OpLabel
+         %85 = OpPhi %float %81 %61 %82 %84
+         %86 = OpAccessChain %_ptr_Function_float %c %uint_0
+               OpStore %86 %85
+         %87 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %88 = OpLoad %float %87
+               OpSelectionMerge %89 None
+               OpSwitch %uint_0 %90
+         %90 = OpLabel
+               OpBranch %91
+         %91 = OpLabel
+         %92 = OpPhi %float %float_n0_5 %90 %93 %94
+         %95 = OpPhi %int %int_1 %90 %96 %94
+         %97 = OpSLessThan %bool %95 %int_800
+               OpLoopMerge %98 %94 None
+               OpBranchConditional %97 %99 %98
+         %99 = OpLabel
+        %100 = OpSMod %int %95 %int_32
+        %101 = OpIEqual %bool %100 %int_0
+               OpSelectionMerge %102 None
+               OpBranchConditional %101 %103 %104
+        %103 = OpLabel
+        %105 = OpFAdd %float %92 %float_0_400000006
+               OpBranch %102
+        %104 = OpLabel
+        %106 = OpConvertSToF %float %95
+        %107 = OpExtInst %float %1 Round %49
+        %108 = OpFMod %float %106 %107
+        %109 = OpFOrdLessThanEqual %bool %108 %float_0_00999999978
+               OpSelectionMerge %110 None
+               OpBranchConditional %109 %111 %110
+        %111 = OpLabel
+        %112 = OpFAdd %float %92 %float_100
+               OpBranch %110
+        %110 = OpLabel
+        %113 = OpPhi %float %92 %104 %112 %111
+               OpBranch %102
+        %102 = OpLabel
+         %93 = OpPhi %float %105 %103 %113 %110
+        %114 = OpConvertSToF %float %95
+        %115 = OpFOrdGreaterThanEqual %bool %114 %88
+               OpSelectionMerge %116 None
+               OpBranchConditional %115 %117 %116
+        %117 = OpLabel
+               OpBranch %98
+        %116 = OpLabel
+               OpBranch %94
+         %94 = OpLabel
+         %96 = OpIAdd %int %95 %int_1
+               OpBranch %91
+         %98 = OpLabel
+        %118 = OpPhi %float %43 %91 %93 %117
+        %119 = OpPhi %float %92 %91 %93 %117
+        %120 = OpPhi %bool %false %91 %true %117
+               OpSelectionMerge %121 None
+               OpBranchConditional %120 %89 %121
+        %121 = OpLabel
+               OpBranch %89
+         %89 = OpLabel
+        %122 = OpPhi %float %118 %98 %119 %121
+        %123 = OpAccessChain %_ptr_Function_float %c %uint_1
+               OpStore %123 %122
+        %124 = OpLoad %float %86
+        %125 = OpLoad %float %123
+        %126 = OpFAdd %float %124 %125
+        %127 = OpAccessChain %_ptr_Function_float %c %uint_2
+               OpStore %127 %126
+               OpBranch %128
+        %128 = OpLabel
+        %129 = OpPhi %int %int_0 %89 %130 %131
+        %132 = OpSLessThan %bool %129 %int_3
+               OpLoopMerge %133 %131 None
+               OpBranchConditional %132 %134 %133
+        %134 = OpLabel
+        %135 = OpAccessChain %_ptr_Function_float %c %129
+        %136 = OpLoad %float %135
+        %137 = OpFOrdGreaterThanEqual %bool %136 %float_1
+               OpSelectionMerge %138 None
+               OpBranchConditional %137 %139 %138
+        %139 = OpLabel
+        %140 = OpLoad %float %135
+        %141 = OpLoad %float %135
+        %142 = OpFMul %float %140 %141
+               OpStore %135 %142
+               OpBranch %138
+        %138 = OpLabel
+               OpBranch %131
+        %131 = OpLabel
+        %130 = OpIAdd %int %129 %int_1
+               OpBranch %128
+        %133 = OpLabel
+        %143 = OpLoad %v3float %c
+        %144 = OpExtInst %v3float %1 FAbs %143
+        %145 = OpExtInst %v3float %1 Normalize %144
+        %146 = OpCompositeExtract %float %145 0
+        %147 = OpCompositeExtract %float %145 1
+        %148 = OpCompositeExtract %float %145 2
+        %149 = OpCompositeConstruct %v4float %146 %147 %148 %float_1
+               OpStore %_GLF_color %149
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..8d53961
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/0.spvasm.expected.hlsl
@@ -0,0 +1,202 @@
+void set_float3(inout float3 vec, int idx, float val) {
+  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
+}
+
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float3 c = float3(0.0f, 0.0f, 0.0f);
+  float x_51 = 0.0f;
+  float x_55 = 0.0f;
+  float x_56 = 0.0f;
+  float x_81 = 0.0f;
+  float x_82 = 0.0f;
+  float x_118 = 0.0f;
+  float x_119 = 0.0f;
+  float x_55_phi = 0.0f;
+  int x_58_phi = 0;
+  float x_81_phi = 0.0f;
+  float x_82_phi = 0.0f;
+  bool x_83_phi = false;
+  float x_85_phi = 0.0f;
+  float x_122_phi = 0.0f;
+  int x_129_phi = 0;
+  c = float3(7.0f, 8.0f, 9.0f);
+  const float x_47 = asfloat(x_7[0].x);
+  const float x_49 = round((x_47 * 0.125f));
+  x_51 = gl_FragCoord.x;
+  switch(0u) {
+    default: {
+      x_55_phi = -0.5f;
+      x_58_phi = 1;
+      while (true) {
+        float x_68 = 0.0f;
+        float x_76 = 0.0f;
+        int x_59 = 0;
+        float x_56_phi = 0.0f;
+        x_55 = x_55_phi;
+        const int x_58 = x_58_phi;
+        x_81_phi = 0.0f;
+        x_82_phi = x_55;
+        x_83_phi = false;
+        if ((x_58 < 800)) {
+        } else {
+          break;
+        }
+        float x_75 = 0.0f;
+        float x_76_phi = 0.0f;
+        if (((x_58 % 32) == 0)) {
+          x_68 = (x_55 + 0.400000006f);
+          x_56_phi = x_68;
+        } else {
+          x_76_phi = x_55;
+          if (((float(x_58) % round(x_49)) <= 0.01f)) {
+            x_75 = (x_55 + 100.0f);
+            x_76_phi = x_75;
+          }
+          x_76 = x_76_phi;
+          x_56_phi = x_76;
+        }
+        x_56 = x_56_phi;
+        if ((float(x_58) >= x_51)) {
+          x_81_phi = x_56;
+          x_82_phi = x_56;
+          x_83_phi = true;
+          break;
+        }
+        {
+          x_59 = (x_58 + 1);
+          x_55_phi = x_56;
+          x_58_phi = x_59;
+        }
+      }
+      x_81 = x_81_phi;
+      x_82 = x_82_phi;
+      const bool x_83 = x_83_phi;
+      x_85_phi = x_81;
+      if (x_83) {
+        break;
+      }
+      x_85_phi = x_82;
+      break;
+    }
+  }
+  float x_88 = 0.0f;
+  float x_92 = 0.0f;
+  float x_93 = 0.0f;
+  float x_92_phi = 0.0f;
+  int x_95_phi = 0;
+  float x_118_phi = 0.0f;
+  float x_119_phi = 0.0f;
+  bool x_120_phi = false;
+  const float x_85 = x_85_phi;
+  c.x = x_85;
+  x_88 = gl_FragCoord.y;
+  switch(0u) {
+    default: {
+      x_92_phi = -0.5f;
+      x_95_phi = 1;
+      while (true) {
+        float x_105 = 0.0f;
+        float x_113 = 0.0f;
+        int x_96 = 0;
+        float x_93_phi = 0.0f;
+        x_92 = x_92_phi;
+        const int x_95 = x_95_phi;
+        x_118_phi = 0.0f;
+        x_119_phi = x_92;
+        x_120_phi = false;
+        if ((x_95 < 800)) {
+        } else {
+          break;
+        }
+        float x_112 = 0.0f;
+        float x_113_phi = 0.0f;
+        if (((x_95 % 32) == 0)) {
+          x_105 = (x_92 + 0.400000006f);
+          x_93_phi = x_105;
+        } else {
+          x_113_phi = x_92;
+          if (((float(x_95) % round(x_49)) <= 0.01f)) {
+            x_112 = (x_92 + 100.0f);
+            x_113_phi = x_112;
+          }
+          x_113 = x_113_phi;
+          x_93_phi = x_113;
+        }
+        x_93 = x_93_phi;
+        if ((float(x_95) >= x_88)) {
+          x_118_phi = x_93;
+          x_119_phi = x_93;
+          x_120_phi = true;
+          break;
+        }
+        {
+          x_96 = (x_95 + 1);
+          x_92_phi = x_93;
+          x_95_phi = x_96;
+        }
+      }
+      x_118 = x_118_phi;
+      x_119 = x_119_phi;
+      const bool x_120 = x_120_phi;
+      x_122_phi = x_118;
+      if (x_120) {
+        break;
+      }
+      x_122_phi = x_119;
+      break;
+    }
+  }
+  const float x_122 = x_122_phi;
+  c.y = x_122;
+  const float x_124 = c.x;
+  const float x_125 = c.y;
+  c.z = (x_124 + x_125);
+  x_129_phi = 0;
+  while (true) {
+    int x_130 = 0;
+    const int x_129 = x_129_phi;
+    if ((x_129 < 3)) {
+    } else {
+      break;
+    }
+    const int x_135_save = x_129;
+    const float x_136 = c[x_135_save];
+    if ((x_136 >= 1.0f)) {
+      const float x_140 = c[x_135_save];
+      const float x_141 = c[x_135_save];
+      set_float3(c, x_135_save, (x_140 * x_141));
+    }
+    {
+      x_130 = (x_129 + 1);
+      x_129_phi = x_130;
+    }
+  }
+  const float3 x_145 = normalize(abs(c));
+  x_GLF_color = float4(x_145.x, x_145.y, x_145.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/0.spvasm.expected.msl
new file mode 100755
index 0000000..6b28523
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/0.spvasm.expected.msl
@@ -0,0 +1,208 @@
+SKIP: FAILED
+
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float3 c = 0.0f;
+  float x_51 = 0.0f;
+  float x_55 = 0.0f;
+  float x_56 = 0.0f;
+  float x_81 = 0.0f;
+  float x_82 = 0.0f;
+  float x_118 = 0.0f;
+  float x_119 = 0.0f;
+  float x_55_phi = 0.0f;
+  int x_58_phi = 0;
+  float x_81_phi = 0.0f;
+  float x_82_phi = 0.0f;
+  bool x_83_phi = false;
+  float x_85_phi = 0.0f;
+  float x_122_phi = 0.0f;
+  int x_129_phi = 0;
+  c = float3(7.0f, 8.0f, 9.0f);
+  float const x_47 = x_7.resolution.x;
+  float const x_49 = rint((x_47 * 0.125f));
+  x_51 = (*(tint_symbol_5)).x;
+  switch(0u) {
+    default: {
+      x_55_phi = -0.5f;
+      x_58_phi = 1;
+      while (true) {
+        float x_68 = 0.0f;
+        float x_76 = 0.0f;
+        int x_59 = 0;
+        float x_56_phi = 0.0f;
+        x_55 = x_55_phi;
+        int const x_58 = x_58_phi;
+        x_81_phi = 0.0f;
+        x_82_phi = x_55;
+        x_83_phi = false;
+        if ((x_58 < 800)) {
+        } else {
+          break;
+        }
+        float x_75 = 0.0f;
+        float x_76_phi = 0.0f;
+        if (((x_58 % 32) == 0)) {
+          x_68 = (x_55 + 0.400000006f);
+          x_56_phi = x_68;
+        } else {
+          x_76_phi = x_55;
+          if (((float(x_58) % rint(x_49)) <= 0.01f)) {
+            x_75 = (x_55 + 100.0f);
+            x_76_phi = x_75;
+          }
+          x_76 = x_76_phi;
+          x_56_phi = x_76;
+        }
+        x_56 = x_56_phi;
+        if ((float(x_58) >= x_51)) {
+          x_81_phi = x_56;
+          x_82_phi = x_56;
+          x_83_phi = true;
+          break;
+        }
+        {
+          x_59 = (x_58 + 1);
+          x_55_phi = x_56;
+          x_58_phi = x_59;
+        }
+      }
+      x_81 = x_81_phi;
+      x_82 = x_82_phi;
+      bool const x_83 = x_83_phi;
+      x_85_phi = x_81;
+      if (x_83) {
+        break;
+      }
+      x_85_phi = x_82;
+      break;
+    }
+  }
+  float x_88 = 0.0f;
+  float x_92 = 0.0f;
+  float x_93 = 0.0f;
+  float x_92_phi = 0.0f;
+  int x_95_phi = 0;
+  float x_118_phi = 0.0f;
+  float x_119_phi = 0.0f;
+  bool x_120_phi = false;
+  float const x_85 = x_85_phi;
+  c.x = x_85;
+  x_88 = (*(tint_symbol_5)).y;
+  switch(0u) {
+    default: {
+      x_92_phi = -0.5f;
+      x_95_phi = 1;
+      while (true) {
+        float x_105 = 0.0f;
+        float x_113 = 0.0f;
+        int x_96 = 0;
+        float x_93_phi = 0.0f;
+        x_92 = x_92_phi;
+        int const x_95 = x_95_phi;
+        x_118_phi = 0.0f;
+        x_119_phi = x_92;
+        x_120_phi = false;
+        if ((x_95 < 800)) {
+        } else {
+          break;
+        }
+        float x_112 = 0.0f;
+        float x_113_phi = 0.0f;
+        if (((x_95 % 32) == 0)) {
+          x_105 = (x_92 + 0.400000006f);
+          x_93_phi = x_105;
+        } else {
+          x_113_phi = x_92;
+          if (((float(x_95) % rint(x_49)) <= 0.01f)) {
+            x_112 = (x_92 + 100.0f);
+            x_113_phi = x_112;
+          }
+          x_113 = x_113_phi;
+          x_93_phi = x_113;
+        }
+        x_93 = x_93_phi;
+        if ((float(x_95) >= x_88)) {
+          x_118_phi = x_93;
+          x_119_phi = x_93;
+          x_120_phi = true;
+          break;
+        }
+        {
+          x_96 = (x_95 + 1);
+          x_92_phi = x_93;
+          x_95_phi = x_96;
+        }
+      }
+      x_118 = x_118_phi;
+      x_119 = x_119_phi;
+      bool const x_120 = x_120_phi;
+      x_122_phi = x_118;
+      if (x_120) {
+        break;
+      }
+      x_122_phi = x_119;
+      break;
+    }
+  }
+  float const x_122 = x_122_phi;
+  c.y = x_122;
+  float const x_124 = c.x;
+  float const x_125 = c.y;
+  c.z = (x_124 + x_125);
+  x_129_phi = 0;
+  while (true) {
+    int x_130 = 0;
+    int const x_129 = x_129_phi;
+    if ((x_129 < 3)) {
+    } else {
+      break;
+    }
+    int const x_135_save = x_129;
+    float const x_136 = c[x_135_save];
+    if ((x_136 >= 1.0f)) {
+      float const x_140 = c[x_135_save];
+      float const x_141 = c[x_135_save];
+      c[x_135_save] = (x_140 * x_141);
+    }
+    {
+      x_130 = (x_129 + 1);
+      x_129_phi = x_130;
+    }
+  }
+  float3 const x_143 = c;
+  float3 const x_145 = normalize(fabs(x_143));
+  *(tint_symbol_6) = float4(x_145.x, x_145.y, x_145.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_7, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
+T:\tmp\u2mo.0.metal:60:29: error: invalid operands to binary expression ('float' and 'float')
+          if (((float(x_58) % rint(x_49)) <= 0.01f)) {
+                ~~~~~~~~~~~ ^ ~~~~~~~~~~
+T:\tmp\u2mo.0.metal:127:29: error: invalid operands to binary expression ('float' and 'float')
+          if (((float(x_95) % rint(x_49)) <= 0.01f)) {
+                ~~~~~~~~~~~ ^ ~~~~~~~~~~
+2 errors generated.
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..fdd3fe1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/0.spvasm.expected.spvasm
@@ -0,0 +1,449 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 254
+; Schema: 0
+               OpCapability Shader
+         %56 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_7 "x_7"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %c "c"
+               OpName %x_51 "x_51"
+               OpName %x_55 "x_55"
+               OpName %x_56 "x_56"
+               OpName %x_81 "x_81"
+               OpName %x_82 "x_82"
+               OpName %x_118 "x_118"
+               OpName %x_119 "x_119"
+               OpName %x_55_phi "x_55_phi"
+               OpName %x_58_phi "x_58_phi"
+               OpName %x_81_phi "x_81_phi"
+               OpName %x_82_phi "x_82_phi"
+               OpName %x_83_phi "x_83_phi"
+               OpName %x_85_phi "x_85_phi"
+               OpName %x_122_phi "x_122_phi"
+               OpName %x_129_phi "x_129_phi"
+               OpName %x_68 "x_68"
+               OpName %x_76 "x_76"
+               OpName %x_59 "x_59"
+               OpName %x_56_phi "x_56_phi"
+               OpName %x_75 "x_75"
+               OpName %x_76_phi "x_76_phi"
+               OpName %x_88 "x_88"
+               OpName %x_92 "x_92"
+               OpName %x_93 "x_93"
+               OpName %x_92_phi "x_92_phi"
+               OpName %x_95_phi "x_95_phi"
+               OpName %x_118_phi "x_118_phi"
+               OpName %x_119_phi "x_119_phi"
+               OpName %x_120_phi "x_120_phi"
+               OpName %x_105 "x_105"
+               OpName %x_113 "x_113"
+               OpName %x_96 "x_96"
+               OpName %x_93_phi "x_93_phi"
+               OpName %x_112 "x_112"
+               OpName %x_113_phi "x_113_phi"
+               OpName %x_130 "x_130"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %22 = OpConstantNull %v3float
+%_ptr_Function_float = OpTypePointer Function %float
+         %25 = OpConstantNull %float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %36 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %42 = OpConstantNull %bool
+    %float_7 = OpConstant %float 7
+    %float_8 = OpConstant %float 8
+    %float_9 = OpConstant %float 9
+         %49 = OpConstantComposite %v3float %float_7 %float_8 %float_9
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%float_0_125 = OpConstant %float 0.125
+%_ptr_Private_float = OpTypePointer Private %float
+ %float_n0_5 = OpConstant %float -0.5
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+      %false = OpConstantFalse %bool
+    %int_800 = OpConstant %int 800
+     %int_32 = OpConstant %int 32
+      %int_0 = OpConstant %int 0
+%float_0_400000006 = OpConstant %float 0.400000006
+%float_0_00999999978 = OpConstant %float 0.00999999978
+  %float_100 = OpConstant %float 100
+       %true = OpConstantTrue %bool
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+      %int_3 = OpConstant %int 3
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %241 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %c = OpVariable %_ptr_Function_v3float Function %22
+       %x_51 = OpVariable %_ptr_Function_float Function %25
+       %x_55 = OpVariable %_ptr_Function_float Function %25
+       %x_56 = OpVariable %_ptr_Function_float Function %25
+       %x_81 = OpVariable %_ptr_Function_float Function %25
+       %x_82 = OpVariable %_ptr_Function_float Function %25
+      %x_118 = OpVariable %_ptr_Function_float Function %25
+      %x_119 = OpVariable %_ptr_Function_float Function %25
+   %x_55_phi = OpVariable %_ptr_Function_float Function %25
+   %x_58_phi = OpVariable %_ptr_Function_int Function %36
+   %x_81_phi = OpVariable %_ptr_Function_float Function %25
+   %x_82_phi = OpVariable %_ptr_Function_float Function %25
+   %x_83_phi = OpVariable %_ptr_Function_bool Function %42
+   %x_85_phi = OpVariable %_ptr_Function_float Function %25
+  %x_122_phi = OpVariable %_ptr_Function_float Function %25
+  %x_129_phi = OpVariable %_ptr_Function_int Function %36
+       %x_68 = OpVariable %_ptr_Function_float Function %25
+       %x_76 = OpVariable %_ptr_Function_float Function %25
+       %x_59 = OpVariable %_ptr_Function_int Function %36
+   %x_56_phi = OpVariable %_ptr_Function_float Function %25
+       %x_75 = OpVariable %_ptr_Function_float Function %25
+   %x_76_phi = OpVariable %_ptr_Function_float Function %25
+       %x_88 = OpVariable %_ptr_Function_float Function %25
+       %x_92 = OpVariable %_ptr_Function_float Function %25
+       %x_93 = OpVariable %_ptr_Function_float Function %25
+   %x_92_phi = OpVariable %_ptr_Function_float Function %25
+   %x_95_phi = OpVariable %_ptr_Function_int Function %36
+  %x_118_phi = OpVariable %_ptr_Function_float Function %25
+  %x_119_phi = OpVariable %_ptr_Function_float Function %25
+  %x_120_phi = OpVariable %_ptr_Function_bool Function %42
+      %x_105 = OpVariable %_ptr_Function_float Function %25
+      %x_113 = OpVariable %_ptr_Function_float Function %25
+       %x_96 = OpVariable %_ptr_Function_int Function %36
+   %x_93_phi = OpVariable %_ptr_Function_float Function %25
+      %x_112 = OpVariable %_ptr_Function_float Function %25
+  %x_113_phi = OpVariable %_ptr_Function_float Function %25
+      %x_130 = OpVariable %_ptr_Function_int Function %36
+               OpStore %c %49
+         %53 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_0
+         %54 = OpLoad %float %53
+         %58 = OpFMul %float %54 %float_0_125
+         %55 = OpExtInst %float %56 RoundEven %58
+         %60 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %61 = OpLoad %float %60
+               OpStore %x_51 %61
+               OpSelectionMerge %62 None
+               OpSwitch %uint_0 %63
+         %63 = OpLabel
+               OpStore %x_55_phi %float_n0_5
+               OpStore %x_58_phi %int_1
+               OpBranch %66
+         %66 = OpLabel
+               OpLoopMerge %67 %68 None
+               OpBranch %69
+         %69 = OpLabel
+         %74 = OpLoad %float %x_55_phi
+               OpStore %x_55 %74
+         %75 = OpLoad %int %x_58_phi
+               OpStore %x_81_phi %float_0
+         %77 = OpLoad %float %x_55
+               OpStore %x_82_phi %77
+               OpStore %x_83_phi %false
+         %80 = OpSLessThan %bool %75 %int_800
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %83
+         %82 = OpLabel
+               OpBranch %81
+         %83 = OpLabel
+               OpBranch %67
+         %81 = OpLabel
+         %87 = OpSMod %int %75 %int_32
+         %89 = OpIEqual %bool %87 %int_0
+               OpSelectionMerge %90 None
+               OpBranchConditional %89 %91 %92
+         %91 = OpLabel
+         %93 = OpLoad %float %x_55
+         %95 = OpFAdd %float %93 %float_0_400000006
+               OpStore %x_68 %95
+         %96 = OpLoad %float %x_68
+               OpStore %x_56_phi %96
+               OpBranch %90
+         %92 = OpLabel
+         %97 = OpLoad %float %x_55
+               OpStore %x_76_phi %97
+         %98 = OpConvertSToF %float %75
+         %99 = OpExtInst %float %56 RoundEven %55
+        %100 = OpFMod %float %98 %99
+        %102 = OpFOrdLessThanEqual %bool %100 %float_0_00999999978
+               OpSelectionMerge %103 None
+               OpBranchConditional %102 %104 %103
+        %104 = OpLabel
+        %105 = OpLoad %float %x_55
+        %107 = OpFAdd %float %105 %float_100
+               OpStore %x_75 %107
+        %108 = OpLoad %float %x_75
+               OpStore %x_76_phi %108
+               OpBranch %103
+        %103 = OpLabel
+        %109 = OpLoad %float %x_76_phi
+               OpStore %x_76 %109
+        %110 = OpLoad %float %x_76
+               OpStore %x_56_phi %110
+               OpBranch %90
+         %90 = OpLabel
+        %111 = OpLoad %float %x_56_phi
+               OpStore %x_56 %111
+        %112 = OpConvertSToF %float %75
+        %113 = OpLoad %float %x_51
+        %114 = OpFOrdGreaterThanEqual %bool %112 %113
+               OpSelectionMerge %115 None
+               OpBranchConditional %114 %116 %115
+        %116 = OpLabel
+        %117 = OpLoad %float %x_56
+               OpStore %x_81_phi %117
+        %118 = OpLoad %float %x_56
+               OpStore %x_82_phi %118
+               OpStore %x_83_phi %true
+               OpBranch %67
+        %115 = OpLabel
+               OpBranch %68
+         %68 = OpLabel
+        %120 = OpIAdd %int %75 %int_1
+               OpStore %x_59 %120
+        %121 = OpLoad %float %x_56
+               OpStore %x_55_phi %121
+        %122 = OpLoad %int %x_59
+               OpStore %x_58_phi %122
+               OpBranch %66
+         %67 = OpLabel
+        %123 = OpLoad %float %x_81_phi
+               OpStore %x_81 %123
+        %124 = OpLoad %float %x_82_phi
+               OpStore %x_82 %124
+        %125 = OpLoad %bool %x_83_phi
+        %126 = OpLoad %float %x_81
+               OpStore %x_85_phi %126
+               OpSelectionMerge %127 None
+               OpBranchConditional %125 %128 %127
+        %128 = OpLabel
+               OpBranch %62
+        %127 = OpLabel
+        %129 = OpLoad %float %x_82
+               OpStore %x_85_phi %129
+               OpBranch %62
+         %62 = OpLabel
+        %138 = OpLoad %float %x_85_phi
+        %139 = OpAccessChain %_ptr_Function_float %c %uint_0
+               OpStore %139 %138
+        %141 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %142 = OpLoad %float %141
+               OpStore %x_88 %142
+               OpSelectionMerge %143 None
+               OpSwitch %uint_0 %144
+        %144 = OpLabel
+               OpStore %x_92_phi %float_n0_5
+               OpStore %x_95_phi %int_1
+               OpBranch %145
+        %145 = OpLabel
+               OpLoopMerge %146 %147 None
+               OpBranch %148
+        %148 = OpLabel
+        %153 = OpLoad %float %x_92_phi
+               OpStore %x_92 %153
+        %154 = OpLoad %int %x_95_phi
+               OpStore %x_118_phi %float_0
+        %155 = OpLoad %float %x_92
+               OpStore %x_119_phi %155
+               OpStore %x_120_phi %false
+        %156 = OpSLessThan %bool %154 %int_800
+               OpSelectionMerge %157 None
+               OpBranchConditional %156 %158 %159
+        %158 = OpLabel
+               OpBranch %157
+        %159 = OpLabel
+               OpBranch %146
+        %157 = OpLabel
+        %162 = OpSMod %int %154 %int_32
+        %163 = OpIEqual %bool %162 %int_0
+               OpSelectionMerge %164 None
+               OpBranchConditional %163 %165 %166
+        %165 = OpLabel
+        %167 = OpLoad %float %x_92
+        %168 = OpFAdd %float %167 %float_0_400000006
+               OpStore %x_105 %168
+        %169 = OpLoad %float %x_105
+               OpStore %x_93_phi %169
+               OpBranch %164
+        %166 = OpLabel
+        %170 = OpLoad %float %x_92
+               OpStore %x_113_phi %170
+        %171 = OpConvertSToF %float %154
+        %172 = OpExtInst %float %56 RoundEven %55
+        %173 = OpFMod %float %171 %172
+        %174 = OpFOrdLessThanEqual %bool %173 %float_0_00999999978
+               OpSelectionMerge %175 None
+               OpBranchConditional %174 %176 %175
+        %176 = OpLabel
+        %177 = OpLoad %float %x_92
+        %178 = OpFAdd %float %177 %float_100
+               OpStore %x_112 %178
+        %179 = OpLoad %float %x_112
+               OpStore %x_113_phi %179
+               OpBranch %175
+        %175 = OpLabel
+        %180 = OpLoad %float %x_113_phi
+               OpStore %x_113 %180
+        %181 = OpLoad %float %x_113
+               OpStore %x_93_phi %181
+               OpBranch %164
+        %164 = OpLabel
+        %182 = OpLoad %float %x_93_phi
+               OpStore %x_93 %182
+        %183 = OpConvertSToF %float %154
+        %184 = OpLoad %float %x_88
+        %185 = OpFOrdGreaterThanEqual %bool %183 %184
+               OpSelectionMerge %186 None
+               OpBranchConditional %185 %187 %186
+        %187 = OpLabel
+        %188 = OpLoad %float %x_93
+               OpStore %x_118_phi %188
+        %189 = OpLoad %float %x_93
+               OpStore %x_119_phi %189
+               OpStore %x_120_phi %true
+               OpBranch %146
+        %186 = OpLabel
+               OpBranch %147
+        %147 = OpLabel
+        %190 = OpIAdd %int %154 %int_1
+               OpStore %x_96 %190
+        %191 = OpLoad %float %x_93
+               OpStore %x_92_phi %191
+        %192 = OpLoad %int %x_96
+               OpStore %x_95_phi %192
+               OpBranch %145
+        %146 = OpLabel
+        %193 = OpLoad %float %x_118_phi
+               OpStore %x_118 %193
+        %194 = OpLoad %float %x_119_phi
+               OpStore %x_119 %194
+        %195 = OpLoad %bool %x_120_phi
+        %196 = OpLoad %float %x_118
+               OpStore %x_122_phi %196
+               OpSelectionMerge %197 None
+               OpBranchConditional %195 %198 %197
+        %198 = OpLabel
+               OpBranch %143
+        %197 = OpLabel
+        %199 = OpLoad %float %x_119
+               OpStore %x_122_phi %199
+               OpBranch %143
+        %143 = OpLabel
+        %200 = OpLoad %float %x_122_phi
+        %201 = OpAccessChain %_ptr_Function_float %c %uint_1
+               OpStore %201 %200
+        %202 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %203 = OpLoad %float %202
+        %204 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %205 = OpLoad %float %204
+        %207 = OpAccessChain %_ptr_Function_float %c %uint_2
+        %208 = OpFAdd %float %203 %205
+               OpStore %207 %208
+               OpStore %x_129_phi %int_0
+               OpBranch %209
+        %209 = OpLabel
+               OpLoopMerge %210 %211 None
+               OpBranch %212
+        %212 = OpLabel
+        %214 = OpLoad %int %x_129_phi
+        %216 = OpSLessThan %bool %214 %int_3
+               OpSelectionMerge %217 None
+               OpBranchConditional %216 %218 %219
+        %218 = OpLabel
+               OpBranch %217
+        %219 = OpLabel
+               OpBranch %210
+        %217 = OpLabel
+        %220 = OpAccessChain %_ptr_Function_float %c %214
+        %221 = OpLoad %float %220
+        %223 = OpFOrdGreaterThanEqual %bool %221 %float_1
+               OpSelectionMerge %224 None
+               OpBranchConditional %223 %225 %224
+        %225 = OpLabel
+        %226 = OpAccessChain %_ptr_Function_float %c %214
+        %227 = OpLoad %float %226
+        %228 = OpAccessChain %_ptr_Function_float %c %214
+        %229 = OpLoad %float %228
+        %230 = OpAccessChain %_ptr_Function_float %c %214
+        %231 = OpFMul %float %227 %229
+               OpStore %230 %231
+               OpBranch %224
+        %224 = OpLabel
+               OpBranch %211
+        %211 = OpLabel
+        %232 = OpIAdd %int %214 %int_1
+               OpStore %x_130 %232
+        %233 = OpLoad %int %x_130
+               OpStore %x_129_phi %233
+               OpBranch %209
+        %210 = OpLabel
+        %234 = OpLoad %v3float %c
+        %236 = OpExtInst %v3float %56 FAbs %234
+        %235 = OpExtInst %v3float %56 Normalize %236
+        %237 = OpCompositeExtract %float %235 0
+        %238 = OpCompositeExtract %float %235 1
+        %239 = OpCompositeExtract %float %235 2
+        %240 = OpCompositeConstruct %v4float %237 %238 %239 %float_1
+               OpStore %x_GLF_color %240
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %241
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %245 = OpLabel
+        %246 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %246
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %248 = OpLabel
+        %249 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %249
+        %250 = OpFunctionCall %void %main_1
+        %252 = OpLoad %v4float %x_GLF_color
+        %253 = OpCompositeConstruct %main_out %252
+        %251 = OpFunctionCall %void %tint_symbol_3 %253
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..41e57f4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/0.spvasm.expected.wgsl
@@ -0,0 +1,200 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var c : vec3<f32>;
+  var x_51 : f32;
+  var x_55 : f32;
+  var x_56 : f32;
+  var x_81 : f32;
+  var x_82 : f32;
+  var x_118 : f32;
+  var x_119 : f32;
+  var x_55_phi : f32;
+  var x_58_phi : i32;
+  var x_81_phi : f32;
+  var x_82_phi : f32;
+  var x_83_phi : bool;
+  var x_85_phi : f32;
+  var x_122_phi : f32;
+  var x_129_phi : i32;
+  c = vec3<f32>(7.0, 8.0, 9.0);
+  let x_47 : f32 = x_7.resolution.x;
+  let x_49 : f32 = round((x_47 * 0.125));
+  x_51 = gl_FragCoord.x;
+  switch(0u) {
+    default: {
+      x_55_phi = -0.5;
+      x_58_phi = 1;
+      loop {
+        var x_68 : f32;
+        var x_76 : f32;
+        var x_59 : i32;
+        var x_56_phi : f32;
+        x_55 = x_55_phi;
+        let x_58 : i32 = x_58_phi;
+        x_81_phi = 0.0;
+        x_82_phi = x_55;
+        x_83_phi = false;
+        if ((x_58 < 800)) {
+        } else {
+          break;
+        }
+        var x_75 : f32;
+        var x_76_phi : f32;
+        if (((x_58 % 32) == 0)) {
+          x_68 = (x_55 + 0.400000006);
+          x_56_phi = x_68;
+        } else {
+          x_76_phi = x_55;
+          if (((f32(x_58) % round(x_49)) <= 0.01)) {
+            x_75 = (x_55 + 100.0);
+            x_76_phi = x_75;
+          }
+          x_76 = x_76_phi;
+          x_56_phi = x_76;
+        }
+        x_56 = x_56_phi;
+        if ((f32(x_58) >= x_51)) {
+          x_81_phi = x_56;
+          x_82_phi = x_56;
+          x_83_phi = true;
+          break;
+        }
+
+        continuing {
+          x_59 = (x_58 + 1);
+          x_55_phi = x_56;
+          x_58_phi = x_59;
+        }
+      }
+      x_81 = x_81_phi;
+      x_82 = x_82_phi;
+      let x_83 : bool = x_83_phi;
+      x_85_phi = x_81;
+      if (x_83) {
+        break;
+      }
+      x_85_phi = x_82;
+    }
+  }
+  var x_88 : f32;
+  var x_92 : f32;
+  var x_93 : f32;
+  var x_92_phi : f32;
+  var x_95_phi : i32;
+  var x_118_phi : f32;
+  var x_119_phi : f32;
+  var x_120_phi : bool;
+  let x_85 : f32 = x_85_phi;
+  let x_86 : ptr<function, f32> = &(c.x);
+  *(x_86) = x_85;
+  x_88 = gl_FragCoord.y;
+  switch(0u) {
+    default: {
+      x_92_phi = -0.5;
+      x_95_phi = 1;
+      loop {
+        var x_105 : f32;
+        var x_113 : f32;
+        var x_96 : i32;
+        var x_93_phi : f32;
+        x_92 = x_92_phi;
+        let x_95 : i32 = x_95_phi;
+        x_118_phi = 0.0;
+        x_119_phi = x_92;
+        x_120_phi = false;
+        if ((x_95 < 800)) {
+        } else {
+          break;
+        }
+        var x_112 : f32;
+        var x_113_phi : f32;
+        if (((x_95 % 32) == 0)) {
+          x_105 = (x_92 + 0.400000006);
+          x_93_phi = x_105;
+        } else {
+          x_113_phi = x_92;
+          if (((f32(x_95) % round(x_49)) <= 0.01)) {
+            x_112 = (x_92 + 100.0);
+            x_113_phi = x_112;
+          }
+          x_113 = x_113_phi;
+          x_93_phi = x_113;
+        }
+        x_93 = x_93_phi;
+        if ((f32(x_95) >= x_88)) {
+          x_118_phi = x_93;
+          x_119_phi = x_93;
+          x_120_phi = true;
+          break;
+        }
+
+        continuing {
+          x_96 = (x_95 + 1);
+          x_92_phi = x_93;
+          x_95_phi = x_96;
+        }
+      }
+      x_118 = x_118_phi;
+      x_119 = x_119_phi;
+      let x_120 : bool = x_120_phi;
+      x_122_phi = x_118;
+      if (x_120) {
+        break;
+      }
+      x_122_phi = x_119;
+    }
+  }
+  let x_122 : f32 = x_122_phi;
+  let x_123 : ptr<function, f32> = &(c.y);
+  *(x_123) = x_122;
+  let x_124 : f32 = *(x_86);
+  let x_125 : f32 = *(x_123);
+  c.z = (x_124 + x_125);
+  x_129_phi = 0;
+  loop {
+    var x_130 : i32;
+    let x_129 : i32 = x_129_phi;
+    if ((x_129 < 3)) {
+    } else {
+      break;
+    }
+    let x_135 : ptr<function, f32> = &(c[x_129]);
+    let x_136 : f32 = *(x_135);
+    if ((x_136 >= 1.0)) {
+      let x_140 : f32 = *(x_135);
+      let x_141 : f32 = *(x_135);
+      *(x_135) = (x_140 * x_141);
+    }
+
+    continuing {
+      x_130 = (x_129 + 1);
+      x_129_phi = x_130;
+    }
+  }
+  let x_143 : vec3<f32> = c;
+  let x_145 : vec3<f32> = normalize(abs(x_143));
+  x_GLF_color = vec4<f32>(x_145.x, x_145.y, x_145.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/0.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/0.wgsl
new file mode 100644
index 0000000..41e57f4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/0.wgsl
@@ -0,0 +1,200 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var c : vec3<f32>;
+  var x_51 : f32;
+  var x_55 : f32;
+  var x_56 : f32;
+  var x_81 : f32;
+  var x_82 : f32;
+  var x_118 : f32;
+  var x_119 : f32;
+  var x_55_phi : f32;
+  var x_58_phi : i32;
+  var x_81_phi : f32;
+  var x_82_phi : f32;
+  var x_83_phi : bool;
+  var x_85_phi : f32;
+  var x_122_phi : f32;
+  var x_129_phi : i32;
+  c = vec3<f32>(7.0, 8.0, 9.0);
+  let x_47 : f32 = x_7.resolution.x;
+  let x_49 : f32 = round((x_47 * 0.125));
+  x_51 = gl_FragCoord.x;
+  switch(0u) {
+    default: {
+      x_55_phi = -0.5;
+      x_58_phi = 1;
+      loop {
+        var x_68 : f32;
+        var x_76 : f32;
+        var x_59 : i32;
+        var x_56_phi : f32;
+        x_55 = x_55_phi;
+        let x_58 : i32 = x_58_phi;
+        x_81_phi = 0.0;
+        x_82_phi = x_55;
+        x_83_phi = false;
+        if ((x_58 < 800)) {
+        } else {
+          break;
+        }
+        var x_75 : f32;
+        var x_76_phi : f32;
+        if (((x_58 % 32) == 0)) {
+          x_68 = (x_55 + 0.400000006);
+          x_56_phi = x_68;
+        } else {
+          x_76_phi = x_55;
+          if (((f32(x_58) % round(x_49)) <= 0.01)) {
+            x_75 = (x_55 + 100.0);
+            x_76_phi = x_75;
+          }
+          x_76 = x_76_phi;
+          x_56_phi = x_76;
+        }
+        x_56 = x_56_phi;
+        if ((f32(x_58) >= x_51)) {
+          x_81_phi = x_56;
+          x_82_phi = x_56;
+          x_83_phi = true;
+          break;
+        }
+
+        continuing {
+          x_59 = (x_58 + 1);
+          x_55_phi = x_56;
+          x_58_phi = x_59;
+        }
+      }
+      x_81 = x_81_phi;
+      x_82 = x_82_phi;
+      let x_83 : bool = x_83_phi;
+      x_85_phi = x_81;
+      if (x_83) {
+        break;
+      }
+      x_85_phi = x_82;
+    }
+  }
+  var x_88 : f32;
+  var x_92 : f32;
+  var x_93 : f32;
+  var x_92_phi : f32;
+  var x_95_phi : i32;
+  var x_118_phi : f32;
+  var x_119_phi : f32;
+  var x_120_phi : bool;
+  let x_85 : f32 = x_85_phi;
+  let x_86 : ptr<function, f32> = &(c.x);
+  *(x_86) = x_85;
+  x_88 = gl_FragCoord.y;
+  switch(0u) {
+    default: {
+      x_92_phi = -0.5;
+      x_95_phi = 1;
+      loop {
+        var x_105 : f32;
+        var x_113 : f32;
+        var x_96 : i32;
+        var x_93_phi : f32;
+        x_92 = x_92_phi;
+        let x_95 : i32 = x_95_phi;
+        x_118_phi = 0.0;
+        x_119_phi = x_92;
+        x_120_phi = false;
+        if ((x_95 < 800)) {
+        } else {
+          break;
+        }
+        var x_112 : f32;
+        var x_113_phi : f32;
+        if (((x_95 % 32) == 0)) {
+          x_105 = (x_92 + 0.400000006);
+          x_93_phi = x_105;
+        } else {
+          x_113_phi = x_92;
+          if (((f32(x_95) % round(x_49)) <= 0.01)) {
+            x_112 = (x_92 + 100.0);
+            x_113_phi = x_112;
+          }
+          x_113 = x_113_phi;
+          x_93_phi = x_113;
+        }
+        x_93 = x_93_phi;
+        if ((f32(x_95) >= x_88)) {
+          x_118_phi = x_93;
+          x_119_phi = x_93;
+          x_120_phi = true;
+          break;
+        }
+
+        continuing {
+          x_96 = (x_95 + 1);
+          x_92_phi = x_93;
+          x_95_phi = x_96;
+        }
+      }
+      x_118 = x_118_phi;
+      x_119 = x_119_phi;
+      let x_120 : bool = x_120_phi;
+      x_122_phi = x_118;
+      if (x_120) {
+        break;
+      }
+      x_122_phi = x_119;
+    }
+  }
+  let x_122 : f32 = x_122_phi;
+  let x_123 : ptr<function, f32> = &(c.y);
+  *(x_123) = x_122;
+  let x_124 : f32 = *(x_86);
+  let x_125 : f32 = *(x_123);
+  c.z = (x_124 + x_125);
+  x_129_phi = 0;
+  loop {
+    var x_130 : i32;
+    let x_129 : i32 = x_129_phi;
+    if ((x_129 < 3)) {
+    } else {
+      break;
+    }
+    let x_135 : ptr<function, f32> = &(c[x_129]);
+    let x_136 : f32 = *(x_135);
+    if ((x_136 >= 1.0)) {
+      let x_140 : f32 = *(x_135);
+      let x_141 : f32 = *(x_135);
+      *(x_135) = (x_140 * x_141);
+    }
+
+    continuing {
+      x_130 = (x_129 + 1);
+      x_129_phi = x_130;
+    }
+  }
+  let x_143 : vec3<f32> = c;
+  let x_145 : vec3<f32> = normalize(abs(x_143));
+  x_GLF_color = vec4<f32>(x_145.x, x_145.y, x_145.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..8d53961
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/0.wgsl.expected.hlsl
@@ -0,0 +1,202 @@
+void set_float3(inout float3 vec, int idx, float val) {
+  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
+}
+
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float3 c = float3(0.0f, 0.0f, 0.0f);
+  float x_51 = 0.0f;
+  float x_55 = 0.0f;
+  float x_56 = 0.0f;
+  float x_81 = 0.0f;
+  float x_82 = 0.0f;
+  float x_118 = 0.0f;
+  float x_119 = 0.0f;
+  float x_55_phi = 0.0f;
+  int x_58_phi = 0;
+  float x_81_phi = 0.0f;
+  float x_82_phi = 0.0f;
+  bool x_83_phi = false;
+  float x_85_phi = 0.0f;
+  float x_122_phi = 0.0f;
+  int x_129_phi = 0;
+  c = float3(7.0f, 8.0f, 9.0f);
+  const float x_47 = asfloat(x_7[0].x);
+  const float x_49 = round((x_47 * 0.125f));
+  x_51 = gl_FragCoord.x;
+  switch(0u) {
+    default: {
+      x_55_phi = -0.5f;
+      x_58_phi = 1;
+      while (true) {
+        float x_68 = 0.0f;
+        float x_76 = 0.0f;
+        int x_59 = 0;
+        float x_56_phi = 0.0f;
+        x_55 = x_55_phi;
+        const int x_58 = x_58_phi;
+        x_81_phi = 0.0f;
+        x_82_phi = x_55;
+        x_83_phi = false;
+        if ((x_58 < 800)) {
+        } else {
+          break;
+        }
+        float x_75 = 0.0f;
+        float x_76_phi = 0.0f;
+        if (((x_58 % 32) == 0)) {
+          x_68 = (x_55 + 0.400000006f);
+          x_56_phi = x_68;
+        } else {
+          x_76_phi = x_55;
+          if (((float(x_58) % round(x_49)) <= 0.01f)) {
+            x_75 = (x_55 + 100.0f);
+            x_76_phi = x_75;
+          }
+          x_76 = x_76_phi;
+          x_56_phi = x_76;
+        }
+        x_56 = x_56_phi;
+        if ((float(x_58) >= x_51)) {
+          x_81_phi = x_56;
+          x_82_phi = x_56;
+          x_83_phi = true;
+          break;
+        }
+        {
+          x_59 = (x_58 + 1);
+          x_55_phi = x_56;
+          x_58_phi = x_59;
+        }
+      }
+      x_81 = x_81_phi;
+      x_82 = x_82_phi;
+      const bool x_83 = x_83_phi;
+      x_85_phi = x_81;
+      if (x_83) {
+        break;
+      }
+      x_85_phi = x_82;
+      break;
+    }
+  }
+  float x_88 = 0.0f;
+  float x_92 = 0.0f;
+  float x_93 = 0.0f;
+  float x_92_phi = 0.0f;
+  int x_95_phi = 0;
+  float x_118_phi = 0.0f;
+  float x_119_phi = 0.0f;
+  bool x_120_phi = false;
+  const float x_85 = x_85_phi;
+  c.x = x_85;
+  x_88 = gl_FragCoord.y;
+  switch(0u) {
+    default: {
+      x_92_phi = -0.5f;
+      x_95_phi = 1;
+      while (true) {
+        float x_105 = 0.0f;
+        float x_113 = 0.0f;
+        int x_96 = 0;
+        float x_93_phi = 0.0f;
+        x_92 = x_92_phi;
+        const int x_95 = x_95_phi;
+        x_118_phi = 0.0f;
+        x_119_phi = x_92;
+        x_120_phi = false;
+        if ((x_95 < 800)) {
+        } else {
+          break;
+        }
+        float x_112 = 0.0f;
+        float x_113_phi = 0.0f;
+        if (((x_95 % 32) == 0)) {
+          x_105 = (x_92 + 0.400000006f);
+          x_93_phi = x_105;
+        } else {
+          x_113_phi = x_92;
+          if (((float(x_95) % round(x_49)) <= 0.01f)) {
+            x_112 = (x_92 + 100.0f);
+            x_113_phi = x_112;
+          }
+          x_113 = x_113_phi;
+          x_93_phi = x_113;
+        }
+        x_93 = x_93_phi;
+        if ((float(x_95) >= x_88)) {
+          x_118_phi = x_93;
+          x_119_phi = x_93;
+          x_120_phi = true;
+          break;
+        }
+        {
+          x_96 = (x_95 + 1);
+          x_92_phi = x_93;
+          x_95_phi = x_96;
+        }
+      }
+      x_118 = x_118_phi;
+      x_119 = x_119_phi;
+      const bool x_120 = x_120_phi;
+      x_122_phi = x_118;
+      if (x_120) {
+        break;
+      }
+      x_122_phi = x_119;
+      break;
+    }
+  }
+  const float x_122 = x_122_phi;
+  c.y = x_122;
+  const float x_124 = c.x;
+  const float x_125 = c.y;
+  c.z = (x_124 + x_125);
+  x_129_phi = 0;
+  while (true) {
+    int x_130 = 0;
+    const int x_129 = x_129_phi;
+    if ((x_129 < 3)) {
+    } else {
+      break;
+    }
+    const int x_135_save = x_129;
+    const float x_136 = c[x_135_save];
+    if ((x_136 >= 1.0f)) {
+      const float x_140 = c[x_135_save];
+      const float x_141 = c[x_135_save];
+      set_float3(c, x_135_save, (x_140 * x_141));
+    }
+    {
+      x_130 = (x_129 + 1);
+      x_129_phi = x_130;
+    }
+  }
+  const float3 x_145 = normalize(abs(c));
+  x_GLF_color = float4(x_145.x, x_145.y, x_145.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/0.wgsl.expected.msl
new file mode 100755
index 0000000..a68104d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/0.wgsl.expected.msl
@@ -0,0 +1,208 @@
+SKIP: FAILED
+
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float3 c = 0.0f;
+  float x_51 = 0.0f;
+  float x_55 = 0.0f;
+  float x_56 = 0.0f;
+  float x_81 = 0.0f;
+  float x_82 = 0.0f;
+  float x_118 = 0.0f;
+  float x_119 = 0.0f;
+  float x_55_phi = 0.0f;
+  int x_58_phi = 0;
+  float x_81_phi = 0.0f;
+  float x_82_phi = 0.0f;
+  bool x_83_phi = false;
+  float x_85_phi = 0.0f;
+  float x_122_phi = 0.0f;
+  int x_129_phi = 0;
+  c = float3(7.0f, 8.0f, 9.0f);
+  float const x_47 = x_7.resolution.x;
+  float const x_49 = rint((x_47 * 0.125f));
+  x_51 = (*(tint_symbol_5)).x;
+  switch(0u) {
+    default: {
+      x_55_phi = -0.5f;
+      x_58_phi = 1;
+      while (true) {
+        float x_68 = 0.0f;
+        float x_76 = 0.0f;
+        int x_59 = 0;
+        float x_56_phi = 0.0f;
+        x_55 = x_55_phi;
+        int const x_58 = x_58_phi;
+        x_81_phi = 0.0f;
+        x_82_phi = x_55;
+        x_83_phi = false;
+        if ((x_58 < 800)) {
+        } else {
+          break;
+        }
+        float x_75 = 0.0f;
+        float x_76_phi = 0.0f;
+        if (((x_58 % 32) == 0)) {
+          x_68 = (x_55 + 0.400000006f);
+          x_56_phi = x_68;
+        } else {
+          x_76_phi = x_55;
+          if (((float(x_58) % rint(x_49)) <= 0.01f)) {
+            x_75 = (x_55 + 100.0f);
+            x_76_phi = x_75;
+          }
+          x_76 = x_76_phi;
+          x_56_phi = x_76;
+        }
+        x_56 = x_56_phi;
+        if ((float(x_58) >= x_51)) {
+          x_81_phi = x_56;
+          x_82_phi = x_56;
+          x_83_phi = true;
+          break;
+        }
+        {
+          x_59 = (x_58 + 1);
+          x_55_phi = x_56;
+          x_58_phi = x_59;
+        }
+      }
+      x_81 = x_81_phi;
+      x_82 = x_82_phi;
+      bool const x_83 = x_83_phi;
+      x_85_phi = x_81;
+      if (x_83) {
+        break;
+      }
+      x_85_phi = x_82;
+      break;
+    }
+  }
+  float x_88 = 0.0f;
+  float x_92 = 0.0f;
+  float x_93 = 0.0f;
+  float x_92_phi = 0.0f;
+  int x_95_phi = 0;
+  float x_118_phi = 0.0f;
+  float x_119_phi = 0.0f;
+  bool x_120_phi = false;
+  float const x_85 = x_85_phi;
+  c.x = x_85;
+  x_88 = (*(tint_symbol_5)).y;
+  switch(0u) {
+    default: {
+      x_92_phi = -0.5f;
+      x_95_phi = 1;
+      while (true) {
+        float x_105 = 0.0f;
+        float x_113 = 0.0f;
+        int x_96 = 0;
+        float x_93_phi = 0.0f;
+        x_92 = x_92_phi;
+        int const x_95 = x_95_phi;
+        x_118_phi = 0.0f;
+        x_119_phi = x_92;
+        x_120_phi = false;
+        if ((x_95 < 800)) {
+        } else {
+          break;
+        }
+        float x_112 = 0.0f;
+        float x_113_phi = 0.0f;
+        if (((x_95 % 32) == 0)) {
+          x_105 = (x_92 + 0.400000006f);
+          x_93_phi = x_105;
+        } else {
+          x_113_phi = x_92;
+          if (((float(x_95) % rint(x_49)) <= 0.01f)) {
+            x_112 = (x_92 + 100.0f);
+            x_113_phi = x_112;
+          }
+          x_113 = x_113_phi;
+          x_93_phi = x_113;
+        }
+        x_93 = x_93_phi;
+        if ((float(x_95) >= x_88)) {
+          x_118_phi = x_93;
+          x_119_phi = x_93;
+          x_120_phi = true;
+          break;
+        }
+        {
+          x_96 = (x_95 + 1);
+          x_92_phi = x_93;
+          x_95_phi = x_96;
+        }
+      }
+      x_118 = x_118_phi;
+      x_119 = x_119_phi;
+      bool const x_120 = x_120_phi;
+      x_122_phi = x_118;
+      if (x_120) {
+        break;
+      }
+      x_122_phi = x_119;
+      break;
+    }
+  }
+  float const x_122 = x_122_phi;
+  c.y = x_122;
+  float const x_124 = c.x;
+  float const x_125 = c.y;
+  c.z = (x_124 + x_125);
+  x_129_phi = 0;
+  while (true) {
+    int x_130 = 0;
+    int const x_129 = x_129_phi;
+    if ((x_129 < 3)) {
+    } else {
+      break;
+    }
+    int const x_135_save = x_129;
+    float const x_136 = c[x_135_save];
+    if ((x_136 >= 1.0f)) {
+      float const x_140 = c[x_135_save];
+      float const x_141 = c[x_135_save];
+      c[x_135_save] = (x_140 * x_141);
+    }
+    {
+      x_130 = (x_129 + 1);
+      x_129_phi = x_130;
+    }
+  }
+  float3 const x_143 = c;
+  float3 const x_145 = normalize(fabs(x_143));
+  *(tint_symbol_6) = float4(x_145.x, x_145.y, x_145.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_7, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
+T:\tmp\u938.0.metal:60:29: error: invalid operands to binary expression ('float' and 'float')
+          if (((float(x_58) % rint(x_49)) <= 0.01f)) {
+                ~~~~~~~~~~~ ^ ~~~~~~~~~~
+T:\tmp\u938.0.metal:127:29: error: invalid operands to binary expression ('float' and 'float')
+          if (((float(x_95) % rint(x_49)) <= 0.01f)) {
+                ~~~~~~~~~~~ ^ ~~~~~~~~~~
+2 errors generated.
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..fdd3fe1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/0.wgsl.expected.spvasm
@@ -0,0 +1,449 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 254
+; Schema: 0
+               OpCapability Shader
+         %56 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_7 "x_7"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %c "c"
+               OpName %x_51 "x_51"
+               OpName %x_55 "x_55"
+               OpName %x_56 "x_56"
+               OpName %x_81 "x_81"
+               OpName %x_82 "x_82"
+               OpName %x_118 "x_118"
+               OpName %x_119 "x_119"
+               OpName %x_55_phi "x_55_phi"
+               OpName %x_58_phi "x_58_phi"
+               OpName %x_81_phi "x_81_phi"
+               OpName %x_82_phi "x_82_phi"
+               OpName %x_83_phi "x_83_phi"
+               OpName %x_85_phi "x_85_phi"
+               OpName %x_122_phi "x_122_phi"
+               OpName %x_129_phi "x_129_phi"
+               OpName %x_68 "x_68"
+               OpName %x_76 "x_76"
+               OpName %x_59 "x_59"
+               OpName %x_56_phi "x_56_phi"
+               OpName %x_75 "x_75"
+               OpName %x_76_phi "x_76_phi"
+               OpName %x_88 "x_88"
+               OpName %x_92 "x_92"
+               OpName %x_93 "x_93"
+               OpName %x_92_phi "x_92_phi"
+               OpName %x_95_phi "x_95_phi"
+               OpName %x_118_phi "x_118_phi"
+               OpName %x_119_phi "x_119_phi"
+               OpName %x_120_phi "x_120_phi"
+               OpName %x_105 "x_105"
+               OpName %x_113 "x_113"
+               OpName %x_96 "x_96"
+               OpName %x_93_phi "x_93_phi"
+               OpName %x_112 "x_112"
+               OpName %x_113_phi "x_113_phi"
+               OpName %x_130 "x_130"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %22 = OpConstantNull %v3float
+%_ptr_Function_float = OpTypePointer Function %float
+         %25 = OpConstantNull %float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %36 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %42 = OpConstantNull %bool
+    %float_7 = OpConstant %float 7
+    %float_8 = OpConstant %float 8
+    %float_9 = OpConstant %float 9
+         %49 = OpConstantComposite %v3float %float_7 %float_8 %float_9
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%float_0_125 = OpConstant %float 0.125
+%_ptr_Private_float = OpTypePointer Private %float
+ %float_n0_5 = OpConstant %float -0.5
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+      %false = OpConstantFalse %bool
+    %int_800 = OpConstant %int 800
+     %int_32 = OpConstant %int 32
+      %int_0 = OpConstant %int 0
+%float_0_400000006 = OpConstant %float 0.400000006
+%float_0_00999999978 = OpConstant %float 0.00999999978
+  %float_100 = OpConstant %float 100
+       %true = OpConstantTrue %bool
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+      %int_3 = OpConstant %int 3
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %241 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %c = OpVariable %_ptr_Function_v3float Function %22
+       %x_51 = OpVariable %_ptr_Function_float Function %25
+       %x_55 = OpVariable %_ptr_Function_float Function %25
+       %x_56 = OpVariable %_ptr_Function_float Function %25
+       %x_81 = OpVariable %_ptr_Function_float Function %25
+       %x_82 = OpVariable %_ptr_Function_float Function %25
+      %x_118 = OpVariable %_ptr_Function_float Function %25
+      %x_119 = OpVariable %_ptr_Function_float Function %25
+   %x_55_phi = OpVariable %_ptr_Function_float Function %25
+   %x_58_phi = OpVariable %_ptr_Function_int Function %36
+   %x_81_phi = OpVariable %_ptr_Function_float Function %25
+   %x_82_phi = OpVariable %_ptr_Function_float Function %25
+   %x_83_phi = OpVariable %_ptr_Function_bool Function %42
+   %x_85_phi = OpVariable %_ptr_Function_float Function %25
+  %x_122_phi = OpVariable %_ptr_Function_float Function %25
+  %x_129_phi = OpVariable %_ptr_Function_int Function %36
+       %x_68 = OpVariable %_ptr_Function_float Function %25
+       %x_76 = OpVariable %_ptr_Function_float Function %25
+       %x_59 = OpVariable %_ptr_Function_int Function %36
+   %x_56_phi = OpVariable %_ptr_Function_float Function %25
+       %x_75 = OpVariable %_ptr_Function_float Function %25
+   %x_76_phi = OpVariable %_ptr_Function_float Function %25
+       %x_88 = OpVariable %_ptr_Function_float Function %25
+       %x_92 = OpVariable %_ptr_Function_float Function %25
+       %x_93 = OpVariable %_ptr_Function_float Function %25
+   %x_92_phi = OpVariable %_ptr_Function_float Function %25
+   %x_95_phi = OpVariable %_ptr_Function_int Function %36
+  %x_118_phi = OpVariable %_ptr_Function_float Function %25
+  %x_119_phi = OpVariable %_ptr_Function_float Function %25
+  %x_120_phi = OpVariable %_ptr_Function_bool Function %42
+      %x_105 = OpVariable %_ptr_Function_float Function %25
+      %x_113 = OpVariable %_ptr_Function_float Function %25
+       %x_96 = OpVariable %_ptr_Function_int Function %36
+   %x_93_phi = OpVariable %_ptr_Function_float Function %25
+      %x_112 = OpVariable %_ptr_Function_float Function %25
+  %x_113_phi = OpVariable %_ptr_Function_float Function %25
+      %x_130 = OpVariable %_ptr_Function_int Function %36
+               OpStore %c %49
+         %53 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_0
+         %54 = OpLoad %float %53
+         %58 = OpFMul %float %54 %float_0_125
+         %55 = OpExtInst %float %56 RoundEven %58
+         %60 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %61 = OpLoad %float %60
+               OpStore %x_51 %61
+               OpSelectionMerge %62 None
+               OpSwitch %uint_0 %63
+         %63 = OpLabel
+               OpStore %x_55_phi %float_n0_5
+               OpStore %x_58_phi %int_1
+               OpBranch %66
+         %66 = OpLabel
+               OpLoopMerge %67 %68 None
+               OpBranch %69
+         %69 = OpLabel
+         %74 = OpLoad %float %x_55_phi
+               OpStore %x_55 %74
+         %75 = OpLoad %int %x_58_phi
+               OpStore %x_81_phi %float_0
+         %77 = OpLoad %float %x_55
+               OpStore %x_82_phi %77
+               OpStore %x_83_phi %false
+         %80 = OpSLessThan %bool %75 %int_800
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %83
+         %82 = OpLabel
+               OpBranch %81
+         %83 = OpLabel
+               OpBranch %67
+         %81 = OpLabel
+         %87 = OpSMod %int %75 %int_32
+         %89 = OpIEqual %bool %87 %int_0
+               OpSelectionMerge %90 None
+               OpBranchConditional %89 %91 %92
+         %91 = OpLabel
+         %93 = OpLoad %float %x_55
+         %95 = OpFAdd %float %93 %float_0_400000006
+               OpStore %x_68 %95
+         %96 = OpLoad %float %x_68
+               OpStore %x_56_phi %96
+               OpBranch %90
+         %92 = OpLabel
+         %97 = OpLoad %float %x_55
+               OpStore %x_76_phi %97
+         %98 = OpConvertSToF %float %75
+         %99 = OpExtInst %float %56 RoundEven %55
+        %100 = OpFMod %float %98 %99
+        %102 = OpFOrdLessThanEqual %bool %100 %float_0_00999999978
+               OpSelectionMerge %103 None
+               OpBranchConditional %102 %104 %103
+        %104 = OpLabel
+        %105 = OpLoad %float %x_55
+        %107 = OpFAdd %float %105 %float_100
+               OpStore %x_75 %107
+        %108 = OpLoad %float %x_75
+               OpStore %x_76_phi %108
+               OpBranch %103
+        %103 = OpLabel
+        %109 = OpLoad %float %x_76_phi
+               OpStore %x_76 %109
+        %110 = OpLoad %float %x_76
+               OpStore %x_56_phi %110
+               OpBranch %90
+         %90 = OpLabel
+        %111 = OpLoad %float %x_56_phi
+               OpStore %x_56 %111
+        %112 = OpConvertSToF %float %75
+        %113 = OpLoad %float %x_51
+        %114 = OpFOrdGreaterThanEqual %bool %112 %113
+               OpSelectionMerge %115 None
+               OpBranchConditional %114 %116 %115
+        %116 = OpLabel
+        %117 = OpLoad %float %x_56
+               OpStore %x_81_phi %117
+        %118 = OpLoad %float %x_56
+               OpStore %x_82_phi %118
+               OpStore %x_83_phi %true
+               OpBranch %67
+        %115 = OpLabel
+               OpBranch %68
+         %68 = OpLabel
+        %120 = OpIAdd %int %75 %int_1
+               OpStore %x_59 %120
+        %121 = OpLoad %float %x_56
+               OpStore %x_55_phi %121
+        %122 = OpLoad %int %x_59
+               OpStore %x_58_phi %122
+               OpBranch %66
+         %67 = OpLabel
+        %123 = OpLoad %float %x_81_phi
+               OpStore %x_81 %123
+        %124 = OpLoad %float %x_82_phi
+               OpStore %x_82 %124
+        %125 = OpLoad %bool %x_83_phi
+        %126 = OpLoad %float %x_81
+               OpStore %x_85_phi %126
+               OpSelectionMerge %127 None
+               OpBranchConditional %125 %128 %127
+        %128 = OpLabel
+               OpBranch %62
+        %127 = OpLabel
+        %129 = OpLoad %float %x_82
+               OpStore %x_85_phi %129
+               OpBranch %62
+         %62 = OpLabel
+        %138 = OpLoad %float %x_85_phi
+        %139 = OpAccessChain %_ptr_Function_float %c %uint_0
+               OpStore %139 %138
+        %141 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %142 = OpLoad %float %141
+               OpStore %x_88 %142
+               OpSelectionMerge %143 None
+               OpSwitch %uint_0 %144
+        %144 = OpLabel
+               OpStore %x_92_phi %float_n0_5
+               OpStore %x_95_phi %int_1
+               OpBranch %145
+        %145 = OpLabel
+               OpLoopMerge %146 %147 None
+               OpBranch %148
+        %148 = OpLabel
+        %153 = OpLoad %float %x_92_phi
+               OpStore %x_92 %153
+        %154 = OpLoad %int %x_95_phi
+               OpStore %x_118_phi %float_0
+        %155 = OpLoad %float %x_92
+               OpStore %x_119_phi %155
+               OpStore %x_120_phi %false
+        %156 = OpSLessThan %bool %154 %int_800
+               OpSelectionMerge %157 None
+               OpBranchConditional %156 %158 %159
+        %158 = OpLabel
+               OpBranch %157
+        %159 = OpLabel
+               OpBranch %146
+        %157 = OpLabel
+        %162 = OpSMod %int %154 %int_32
+        %163 = OpIEqual %bool %162 %int_0
+               OpSelectionMerge %164 None
+               OpBranchConditional %163 %165 %166
+        %165 = OpLabel
+        %167 = OpLoad %float %x_92
+        %168 = OpFAdd %float %167 %float_0_400000006
+               OpStore %x_105 %168
+        %169 = OpLoad %float %x_105
+               OpStore %x_93_phi %169
+               OpBranch %164
+        %166 = OpLabel
+        %170 = OpLoad %float %x_92
+               OpStore %x_113_phi %170
+        %171 = OpConvertSToF %float %154
+        %172 = OpExtInst %float %56 RoundEven %55
+        %173 = OpFMod %float %171 %172
+        %174 = OpFOrdLessThanEqual %bool %173 %float_0_00999999978
+               OpSelectionMerge %175 None
+               OpBranchConditional %174 %176 %175
+        %176 = OpLabel
+        %177 = OpLoad %float %x_92
+        %178 = OpFAdd %float %177 %float_100
+               OpStore %x_112 %178
+        %179 = OpLoad %float %x_112
+               OpStore %x_113_phi %179
+               OpBranch %175
+        %175 = OpLabel
+        %180 = OpLoad %float %x_113_phi
+               OpStore %x_113 %180
+        %181 = OpLoad %float %x_113
+               OpStore %x_93_phi %181
+               OpBranch %164
+        %164 = OpLabel
+        %182 = OpLoad %float %x_93_phi
+               OpStore %x_93 %182
+        %183 = OpConvertSToF %float %154
+        %184 = OpLoad %float %x_88
+        %185 = OpFOrdGreaterThanEqual %bool %183 %184
+               OpSelectionMerge %186 None
+               OpBranchConditional %185 %187 %186
+        %187 = OpLabel
+        %188 = OpLoad %float %x_93
+               OpStore %x_118_phi %188
+        %189 = OpLoad %float %x_93
+               OpStore %x_119_phi %189
+               OpStore %x_120_phi %true
+               OpBranch %146
+        %186 = OpLabel
+               OpBranch %147
+        %147 = OpLabel
+        %190 = OpIAdd %int %154 %int_1
+               OpStore %x_96 %190
+        %191 = OpLoad %float %x_93
+               OpStore %x_92_phi %191
+        %192 = OpLoad %int %x_96
+               OpStore %x_95_phi %192
+               OpBranch %145
+        %146 = OpLabel
+        %193 = OpLoad %float %x_118_phi
+               OpStore %x_118 %193
+        %194 = OpLoad %float %x_119_phi
+               OpStore %x_119 %194
+        %195 = OpLoad %bool %x_120_phi
+        %196 = OpLoad %float %x_118
+               OpStore %x_122_phi %196
+               OpSelectionMerge %197 None
+               OpBranchConditional %195 %198 %197
+        %198 = OpLabel
+               OpBranch %143
+        %197 = OpLabel
+        %199 = OpLoad %float %x_119
+               OpStore %x_122_phi %199
+               OpBranch %143
+        %143 = OpLabel
+        %200 = OpLoad %float %x_122_phi
+        %201 = OpAccessChain %_ptr_Function_float %c %uint_1
+               OpStore %201 %200
+        %202 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %203 = OpLoad %float %202
+        %204 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %205 = OpLoad %float %204
+        %207 = OpAccessChain %_ptr_Function_float %c %uint_2
+        %208 = OpFAdd %float %203 %205
+               OpStore %207 %208
+               OpStore %x_129_phi %int_0
+               OpBranch %209
+        %209 = OpLabel
+               OpLoopMerge %210 %211 None
+               OpBranch %212
+        %212 = OpLabel
+        %214 = OpLoad %int %x_129_phi
+        %216 = OpSLessThan %bool %214 %int_3
+               OpSelectionMerge %217 None
+               OpBranchConditional %216 %218 %219
+        %218 = OpLabel
+               OpBranch %217
+        %219 = OpLabel
+               OpBranch %210
+        %217 = OpLabel
+        %220 = OpAccessChain %_ptr_Function_float %c %214
+        %221 = OpLoad %float %220
+        %223 = OpFOrdGreaterThanEqual %bool %221 %float_1
+               OpSelectionMerge %224 None
+               OpBranchConditional %223 %225 %224
+        %225 = OpLabel
+        %226 = OpAccessChain %_ptr_Function_float %c %214
+        %227 = OpLoad %float %226
+        %228 = OpAccessChain %_ptr_Function_float %c %214
+        %229 = OpLoad %float %228
+        %230 = OpAccessChain %_ptr_Function_float %c %214
+        %231 = OpFMul %float %227 %229
+               OpStore %230 %231
+               OpBranch %224
+        %224 = OpLabel
+               OpBranch %211
+        %211 = OpLabel
+        %232 = OpIAdd %int %214 %int_1
+               OpStore %x_130 %232
+        %233 = OpLoad %int %x_130
+               OpStore %x_129_phi %233
+               OpBranch %209
+        %210 = OpLabel
+        %234 = OpLoad %v3float %c
+        %236 = OpExtInst %v3float %56 FAbs %234
+        %235 = OpExtInst %v3float %56 Normalize %236
+        %237 = OpCompositeExtract %float %235 0
+        %238 = OpCompositeExtract %float %235 1
+        %239 = OpCompositeExtract %float %235 2
+        %240 = OpCompositeConstruct %v4float %237 %238 %239 %float_1
+               OpStore %x_GLF_color %240
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %241
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %245 = OpLabel
+        %246 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %246
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %248 = OpLabel
+        %249 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %249
+        %250 = OpFunctionCall %void %main_1
+        %252 = OpLoad %v4float %x_GLF_color
+        %253 = OpCompositeConstruct %main_out %252
+        %251 = OpFunctionCall %void %tint_symbol_3 %253
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..41e57f4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/0.wgsl.expected.wgsl
@@ -0,0 +1,200 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var c : vec3<f32>;
+  var x_51 : f32;
+  var x_55 : f32;
+  var x_56 : f32;
+  var x_81 : f32;
+  var x_82 : f32;
+  var x_118 : f32;
+  var x_119 : f32;
+  var x_55_phi : f32;
+  var x_58_phi : i32;
+  var x_81_phi : f32;
+  var x_82_phi : f32;
+  var x_83_phi : bool;
+  var x_85_phi : f32;
+  var x_122_phi : f32;
+  var x_129_phi : i32;
+  c = vec3<f32>(7.0, 8.0, 9.0);
+  let x_47 : f32 = x_7.resolution.x;
+  let x_49 : f32 = round((x_47 * 0.125));
+  x_51 = gl_FragCoord.x;
+  switch(0u) {
+    default: {
+      x_55_phi = -0.5;
+      x_58_phi = 1;
+      loop {
+        var x_68 : f32;
+        var x_76 : f32;
+        var x_59 : i32;
+        var x_56_phi : f32;
+        x_55 = x_55_phi;
+        let x_58 : i32 = x_58_phi;
+        x_81_phi = 0.0;
+        x_82_phi = x_55;
+        x_83_phi = false;
+        if ((x_58 < 800)) {
+        } else {
+          break;
+        }
+        var x_75 : f32;
+        var x_76_phi : f32;
+        if (((x_58 % 32) == 0)) {
+          x_68 = (x_55 + 0.400000006);
+          x_56_phi = x_68;
+        } else {
+          x_76_phi = x_55;
+          if (((f32(x_58) % round(x_49)) <= 0.01)) {
+            x_75 = (x_55 + 100.0);
+            x_76_phi = x_75;
+          }
+          x_76 = x_76_phi;
+          x_56_phi = x_76;
+        }
+        x_56 = x_56_phi;
+        if ((f32(x_58) >= x_51)) {
+          x_81_phi = x_56;
+          x_82_phi = x_56;
+          x_83_phi = true;
+          break;
+        }
+
+        continuing {
+          x_59 = (x_58 + 1);
+          x_55_phi = x_56;
+          x_58_phi = x_59;
+        }
+      }
+      x_81 = x_81_phi;
+      x_82 = x_82_phi;
+      let x_83 : bool = x_83_phi;
+      x_85_phi = x_81;
+      if (x_83) {
+        break;
+      }
+      x_85_phi = x_82;
+    }
+  }
+  var x_88 : f32;
+  var x_92 : f32;
+  var x_93 : f32;
+  var x_92_phi : f32;
+  var x_95_phi : i32;
+  var x_118_phi : f32;
+  var x_119_phi : f32;
+  var x_120_phi : bool;
+  let x_85 : f32 = x_85_phi;
+  let x_86 : ptr<function, f32> = &(c.x);
+  *(x_86) = x_85;
+  x_88 = gl_FragCoord.y;
+  switch(0u) {
+    default: {
+      x_92_phi = -0.5;
+      x_95_phi = 1;
+      loop {
+        var x_105 : f32;
+        var x_113 : f32;
+        var x_96 : i32;
+        var x_93_phi : f32;
+        x_92 = x_92_phi;
+        let x_95 : i32 = x_95_phi;
+        x_118_phi = 0.0;
+        x_119_phi = x_92;
+        x_120_phi = false;
+        if ((x_95 < 800)) {
+        } else {
+          break;
+        }
+        var x_112 : f32;
+        var x_113_phi : f32;
+        if (((x_95 % 32) == 0)) {
+          x_105 = (x_92 + 0.400000006);
+          x_93_phi = x_105;
+        } else {
+          x_113_phi = x_92;
+          if (((f32(x_95) % round(x_49)) <= 0.01)) {
+            x_112 = (x_92 + 100.0);
+            x_113_phi = x_112;
+          }
+          x_113 = x_113_phi;
+          x_93_phi = x_113;
+        }
+        x_93 = x_93_phi;
+        if ((f32(x_95) >= x_88)) {
+          x_118_phi = x_93;
+          x_119_phi = x_93;
+          x_120_phi = true;
+          break;
+        }
+
+        continuing {
+          x_96 = (x_95 + 1);
+          x_92_phi = x_93;
+          x_95_phi = x_96;
+        }
+      }
+      x_118 = x_118_phi;
+      x_119 = x_119_phi;
+      let x_120 : bool = x_120_phi;
+      x_122_phi = x_118;
+      if (x_120) {
+        break;
+      }
+      x_122_phi = x_119;
+    }
+  }
+  let x_122 : f32 = x_122_phi;
+  let x_123 : ptr<function, f32> = &(c.y);
+  *(x_123) = x_122;
+  let x_124 : f32 = *(x_86);
+  let x_125 : f32 = *(x_123);
+  c.z = (x_124 + x_125);
+  x_129_phi = 0;
+  loop {
+    var x_130 : i32;
+    let x_129 : i32 = x_129_phi;
+    if ((x_129 < 3)) {
+    } else {
+      break;
+    }
+    let x_135 : ptr<function, f32> = &(c[x_129]);
+    let x_136 : f32 = *(x_135);
+    if ((x_136 >= 1.0)) {
+      let x_140 : f32 = *(x_135);
+      let x_141 : f32 = *(x_135);
+      *(x_135) = (x_140 * x_141);
+    }
+
+    continuing {
+      x_130 = (x_129 + 1);
+      x_129_phi = x_130;
+    }
+  }
+  let x_143 : vec3<f32> = c;
+  let x_145 : vec3<f32> = normalize(abs(x_143));
+  x_GLF_color = vec4<f32>(x_145.x, x_145.y, x_145.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/1.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/1.spvasm
new file mode 100644
index 0000000..918bcf7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/1.spvasm
@@ -0,0 +1,229 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %c "c"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+ %float_n0_5 = OpConstant %float -0.5
+        %int = OpTypeInt 32 1
+      %int_1 = OpConstant %int 1
+    %int_800 = OpConstant %int 800
+       %bool = OpTypeBool
+     %int_32 = OpConstant %int 32
+      %int_0 = OpConstant %int 0
+%float_0_400000006 = OpConstant %float 0.400000006
+%float_0_00999999978 = OpConstant %float 0.00999999978
+  %float_100 = OpConstant %float 100
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+    %float_7 = OpConstant %float 7
+    %float_8 = OpConstant %float 8
+    %float_9 = OpConstant %float 9
+         %27 = OpConstantComposite %v3float %float_7 %float_8 %float_9
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+%_ptr_Input_float = OpTypePointer Input %float
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+      %int_3 = OpConstant %int 3
+    %float_1 = OpConstant %float 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+      %false = OpConstantFalse %bool
+       %true = OpConstantTrue %bool
+         %43 = OpUndef %float
+%float_0_125 = OpConstant %float 0.125
+       %main = OpFunction %void None %9
+         %45 = OpLabel
+          %c = OpVariable %_ptr_Function_v3float Function
+               OpStore %c %27
+         %46 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %47 = OpLoad %float %46
+         %48 = OpCompositeConstruct %v2float %float_1 %47
+         %49 = OpFMul %float %47 %float_0_125
+         %50 = OpExtInst %float %1 Round %49
+         %51 = OpCompositeConstruct %v2float %43 %float_n0_5
+         %52 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %53 = OpLoad %float %52
+               OpSelectionMerge %54 None
+               OpSwitch %uint_0 %55
+         %55 = OpLabel
+               OpBranch %56
+         %56 = OpLabel
+         %57 = OpPhi %float %float_n0_5 %55 %58 %59
+         %60 = OpPhi %int %int_1 %55 %61 %59
+         %62 = OpSLessThan %bool %60 %int_800
+               OpLoopMerge %63 %59 None
+               OpBranchConditional %62 %64 %63
+         %64 = OpLabel
+         %65 = OpSMod %int %60 %int_32
+         %66 = OpIEqual %bool %65 %int_0
+               OpSelectionMerge %67 None
+               OpBranchConditional %66 %68 %69
+         %68 = OpLabel
+         %70 = OpFAdd %float %57 %float_0_400000006
+               OpBranch %67
+         %69 = OpLabel
+         %71 = OpConvertSToF %float %60
+         %72 = OpExtInst %float %1 Round %50
+         %73 = OpFMod %float %71 %72
+         %74 = OpFOrdLessThanEqual %bool %73 %float_0_00999999978
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %75
+         %76 = OpLabel
+         %77 = OpFAdd %float %57 %float_100
+               OpBranch %75
+         %75 = OpLabel
+         %78 = OpPhi %float %57 %69 %77 %76
+               OpBranch %67
+         %67 = OpLabel
+         %58 = OpPhi %float %70 %68 %78 %75
+         %79 = OpConvertSToF %float %60
+         %80 = OpFOrdGreaterThanEqual %bool %79 %53
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %81
+         %82 = OpLabel
+               OpBranch %63
+         %81 = OpLabel
+               OpBranch %59
+         %59 = OpLabel
+         %61 = OpIAdd %int %60 %int_1
+               OpBranch %56
+         %63 = OpLabel
+         %83 = OpPhi %float %43 %56 %58 %82
+         %84 = OpPhi %float %57 %56 %58 %82
+         %85 = OpPhi %bool %false %56 %true %82
+               OpSelectionMerge %86 None
+               OpBranchConditional %85 %54 %86
+         %86 = OpLabel
+               OpBranch %54
+         %54 = OpLabel
+         %87 = OpPhi %float %83 %63 %84 %86
+         %88 = OpAccessChain %_ptr_Function_float %c %uint_0
+         %89 = OpCompositeConstruct %v4float %84 %float_0_400000006 %83 %float_0_400000006
+         %90 = OpCompositeConstruct %v3float %48 %float_n0_5
+               OpStore %88 %87
+         %91 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %92 = OpLoad %float %91
+               OpSelectionMerge %93 None
+               OpSwitch %uint_0 %94
+         %94 = OpLabel
+         %95 = OpCompositeConstruct %v4float %51 %43 %57
+         %96 = OpCompositeExtract %float %90 2
+               OpBranch %97
+         %97 = OpLabel
+         %98 = OpPhi %float %96 %94 %99 %100
+        %101 = OpPhi %int %int_1 %94 %102 %100
+        %103 = OpSLessThan %bool %101 %int_800
+               OpLoopMerge %104 %100 None
+               OpBranchConditional %103 %105 %104
+        %105 = OpLabel
+        %106 = OpSMod %int %101 %int_32
+        %107 = OpIEqual %bool %106 %int_0
+               OpSelectionMerge %108 None
+               OpBranchConditional %107 %109 %110
+        %109 = OpLabel
+        %111 = OpFAdd %float %98 %float_0_400000006
+               OpBranch %108
+        %110 = OpLabel
+        %112 = OpConvertSToF %float %101
+        %113 = OpExtInst %float %1 Round %50
+        %114 = OpFMod %float %112 %113
+        %115 = OpFOrdLessThanEqual %bool %114 %float_0_00999999978
+               OpSelectionMerge %116 None
+               OpBranchConditional %115 %117 %116
+        %117 = OpLabel
+        %118 = OpFAdd %float %98 %float_100
+               OpBranch %116
+        %116 = OpLabel
+        %119 = OpPhi %float %98 %110 %118 %117
+               OpBranch %108
+        %108 = OpLabel
+         %99 = OpPhi %float %111 %109 %119 %116
+        %120 = OpConvertSToF %float %101
+        %121 = OpFOrdGreaterThanEqual %bool %120 %92
+               OpSelectionMerge %122 None
+               OpBranchConditional %121 %123 %122
+        %123 = OpLabel
+               OpBranch %104
+        %122 = OpLabel
+               OpBranch %100
+        %100 = OpLabel
+        %102 = OpIAdd %int %101 %int_1
+               OpBranch %97
+        %104 = OpLabel
+        %124 = OpPhi %float %43 %97 %99 %123
+        %125 = OpPhi %float %98 %97 %99 %123
+        %126 = OpPhi %bool %false %97 %true %123
+               OpSelectionMerge %127 None
+               OpBranchConditional %126 %93 %127
+        %127 = OpLabel
+               OpBranch %93
+         %93 = OpLabel
+        %128 = OpPhi %float %124 %104 %125 %127
+        %129 = OpAccessChain %_ptr_Function_float %c %uint_1
+               OpStore %129 %128
+        %130 = OpLoad %float %88
+        %131 = OpLoad %float %129
+        %132 = OpFAdd %float %130 %131
+        %133 = OpAccessChain %_ptr_Function_float %c %uint_2
+               OpStore %133 %132
+               OpBranch %134
+        %134 = OpLabel
+        %135 = OpPhi %int %int_0 %93 %136 %137
+        %138 = OpSLessThan %bool %135 %int_3
+               OpLoopMerge %139 %137 None
+               OpBranchConditional %138 %140 %139
+        %140 = OpLabel
+        %141 = OpAccessChain %_ptr_Function_float %c %135
+        %142 = OpLoad %float %141
+        %143 = OpFOrdGreaterThanEqual %bool %142 %float_1
+               OpSelectionMerge %144 None
+               OpBranchConditional %143 %145 %144
+        %145 = OpLabel
+        %146 = OpLoad %float %141
+        %147 = OpLoad %float %141
+        %148 = OpFMul %float %146 %147
+               OpStore %141 %148
+               OpBranch %144
+        %144 = OpLabel
+               OpBranch %137
+        %137 = OpLabel
+        %136 = OpIAdd %int %135 %int_1
+               OpBranch %134
+        %139 = OpLabel
+        %149 = OpLoad %v3float %c
+        %150 = OpExtInst %v3float %1 FAbs %149
+        %151 = OpExtInst %v3float %1 Normalize %150
+        %152 = OpCompositeExtract %float %151 0
+        %153 = OpCompositeExtract %float %151 1
+        %154 = OpCompositeExtract %float %151 2
+        %155 = OpCompositeConstruct %v4float %152 %153 %154 %float_1
+               OpStore %_GLF_color %155
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..f5c9fb0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/1.spvasm.expected.hlsl
@@ -0,0 +1,207 @@
+void set_float3(inout float3 vec, int idx, float val) {
+  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
+}
+
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float3 c = float3(0.0f, 0.0f, 0.0f);
+  float x_53 = 0.0f;
+  float x_57 = 0.0f;
+  float x_58 = 0.0f;
+  float x_83 = 0.0f;
+  float x_84 = 0.0f;
+  float x_124 = 0.0f;
+  float x_125 = 0.0f;
+  float x_57_phi = 0.0f;
+  int x_60_phi = 0;
+  float x_83_phi = 0.0f;
+  float x_84_phi = 0.0f;
+  bool x_85_phi = false;
+  float x_87_phi = 0.0f;
+  float x_128_phi = 0.0f;
+  int x_135_phi = 0;
+  c = float3(7.0f, 8.0f, 9.0f);
+  const float x_47 = asfloat(x_7[0].x);
+  const float2 x_48 = float2(1.0f, x_47);
+  const float x_50 = round((x_47 * 0.125f));
+  const float2 x_51 = float2(0.0f, -0.5f);
+  x_53 = gl_FragCoord.x;
+  switch(0u) {
+    default: {
+      x_57_phi = -0.5f;
+      x_60_phi = 1;
+      while (true) {
+        float x_70 = 0.0f;
+        float x_78 = 0.0f;
+        int x_61 = 0;
+        float x_58_phi = 0.0f;
+        x_57 = x_57_phi;
+        const int x_60 = x_60_phi;
+        x_83_phi = 0.0f;
+        x_84_phi = x_57;
+        x_85_phi = false;
+        if ((x_60 < 800)) {
+        } else {
+          break;
+        }
+        float x_77 = 0.0f;
+        float x_78_phi = 0.0f;
+        if (((x_60 % 32) == 0)) {
+          x_70 = (x_57 + 0.400000006f);
+          x_58_phi = x_70;
+        } else {
+          x_78_phi = x_57;
+          if (((float(x_60) % round(x_50)) <= 0.01f)) {
+            x_77 = (x_57 + 100.0f);
+            x_78_phi = x_77;
+          }
+          x_78 = x_78_phi;
+          x_58_phi = x_78;
+        }
+        x_58 = x_58_phi;
+        if ((float(x_60) >= x_53)) {
+          x_83_phi = x_58;
+          x_84_phi = x_58;
+          x_85_phi = true;
+          break;
+        }
+        {
+          x_61 = (x_60 + 1);
+          x_57_phi = x_58;
+          x_60_phi = x_61;
+        }
+      }
+      x_83 = x_83_phi;
+      x_84 = x_84_phi;
+      const bool x_85 = x_85_phi;
+      x_87_phi = x_83;
+      if (x_85) {
+        break;
+      }
+      x_87_phi = x_84;
+      break;
+    }
+  }
+  float x_92 = 0.0f;
+  float x_98 = 0.0f;
+  float x_99 = 0.0f;
+  float x_98_phi = 0.0f;
+  int x_101_phi = 0;
+  float x_124_phi = 0.0f;
+  float x_125_phi = 0.0f;
+  bool x_126_phi = false;
+  const float x_87 = x_87_phi;
+  const float4 x_89 = float4(x_84, 0.400000006f, x_83, 0.400000006f);
+  c.x = x_87;
+  x_92 = gl_FragCoord.y;
+  switch(0u) {
+    default: {
+      const float4 x_95 = float4(x_51, 0.0f, x_57);
+      const float x_96 = float3(x_48, -0.5f).z;
+      x_98_phi = x_96;
+      x_101_phi = 1;
+      while (true) {
+        float x_111 = 0.0f;
+        float x_119 = 0.0f;
+        int x_102 = 0;
+        float x_99_phi = 0.0f;
+        x_98 = x_98_phi;
+        const int x_101 = x_101_phi;
+        x_124_phi = 0.0f;
+        x_125_phi = x_98;
+        x_126_phi = false;
+        if ((x_101 < 800)) {
+        } else {
+          break;
+        }
+        float x_118 = 0.0f;
+        float x_119_phi = 0.0f;
+        if (((x_101 % 32) == 0)) {
+          x_111 = (x_98 + 0.400000006f);
+          x_99_phi = x_111;
+        } else {
+          x_119_phi = x_98;
+          if (((float(x_101) % round(x_50)) <= 0.01f)) {
+            x_118 = (x_98 + 100.0f);
+            x_119_phi = x_118;
+          }
+          x_119 = x_119_phi;
+          x_99_phi = x_119;
+        }
+        x_99 = x_99_phi;
+        if ((float(x_101) >= x_92)) {
+          x_124_phi = x_99;
+          x_125_phi = x_99;
+          x_126_phi = true;
+          break;
+        }
+        {
+          x_102 = (x_101 + 1);
+          x_98_phi = x_99;
+          x_101_phi = x_102;
+        }
+      }
+      x_124 = x_124_phi;
+      x_125 = x_125_phi;
+      const bool x_126 = x_126_phi;
+      x_128_phi = x_124;
+      if (x_126) {
+        break;
+      }
+      x_128_phi = x_125;
+      break;
+    }
+  }
+  const float x_128 = x_128_phi;
+  c.y = x_128;
+  const float x_130 = c.x;
+  const float x_131 = c.y;
+  c.z = (x_130 + x_131);
+  x_135_phi = 0;
+  while (true) {
+    int x_136 = 0;
+    const int x_135 = x_135_phi;
+    if ((x_135 < 3)) {
+    } else {
+      break;
+    }
+    const int x_141_save = x_135;
+    const float x_142 = c[x_141_save];
+    if ((x_142 >= 1.0f)) {
+      const float x_146 = c[x_141_save];
+      const float x_147 = c[x_141_save];
+      set_float3(c, x_141_save, (x_146 * x_147));
+    }
+    {
+      x_136 = (x_135 + 1);
+      x_135_phi = x_136;
+    }
+  }
+  const float3 x_151 = normalize(abs(c));
+  x_GLF_color = float4(x_151.x, x_151.y, x_151.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/1.spvasm.expected.msl
new file mode 100755
index 0000000..1a98de4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/1.spvasm.expected.msl
@@ -0,0 +1,213 @@
+SKIP: FAILED
+
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float3 c = 0.0f;
+  float x_53 = 0.0f;
+  float x_57 = 0.0f;
+  float x_58 = 0.0f;
+  float x_83 = 0.0f;
+  float x_84 = 0.0f;
+  float x_124 = 0.0f;
+  float x_125 = 0.0f;
+  float x_57_phi = 0.0f;
+  int x_60_phi = 0;
+  float x_83_phi = 0.0f;
+  float x_84_phi = 0.0f;
+  bool x_85_phi = false;
+  float x_87_phi = 0.0f;
+  float x_128_phi = 0.0f;
+  int x_135_phi = 0;
+  c = float3(7.0f, 8.0f, 9.0f);
+  float const x_47 = x_7.resolution.x;
+  float2 const x_48 = float2(1.0f, x_47);
+  float const x_50 = rint((x_47 * 0.125f));
+  float2 const x_51 = float2(0.0f, -0.5f);
+  x_53 = (*(tint_symbol_5)).x;
+  switch(0u) {
+    default: {
+      x_57_phi = -0.5f;
+      x_60_phi = 1;
+      while (true) {
+        float x_70 = 0.0f;
+        float x_78 = 0.0f;
+        int x_61 = 0;
+        float x_58_phi = 0.0f;
+        x_57 = x_57_phi;
+        int const x_60 = x_60_phi;
+        x_83_phi = 0.0f;
+        x_84_phi = x_57;
+        x_85_phi = false;
+        if ((x_60 < 800)) {
+        } else {
+          break;
+        }
+        float x_77 = 0.0f;
+        float x_78_phi = 0.0f;
+        if (((x_60 % 32) == 0)) {
+          x_70 = (x_57 + 0.400000006f);
+          x_58_phi = x_70;
+        } else {
+          x_78_phi = x_57;
+          if (((float(x_60) % rint(x_50)) <= 0.01f)) {
+            x_77 = (x_57 + 100.0f);
+            x_78_phi = x_77;
+          }
+          x_78 = x_78_phi;
+          x_58_phi = x_78;
+        }
+        x_58 = x_58_phi;
+        if ((float(x_60) >= x_53)) {
+          x_83_phi = x_58;
+          x_84_phi = x_58;
+          x_85_phi = true;
+          break;
+        }
+        {
+          x_61 = (x_60 + 1);
+          x_57_phi = x_58;
+          x_60_phi = x_61;
+        }
+      }
+      x_83 = x_83_phi;
+      x_84 = x_84_phi;
+      bool const x_85 = x_85_phi;
+      x_87_phi = x_83;
+      if (x_85) {
+        break;
+      }
+      x_87_phi = x_84;
+      break;
+    }
+  }
+  float x_92 = 0.0f;
+  float x_98 = 0.0f;
+  float x_99 = 0.0f;
+  float x_98_phi = 0.0f;
+  int x_101_phi = 0;
+  float x_124_phi = 0.0f;
+  float x_125_phi = 0.0f;
+  bool x_126_phi = false;
+  float const x_87 = x_87_phi;
+  float4 const x_89 = float4(x_84, 0.400000006f, x_83, 0.400000006f);
+  c.x = x_87;
+  x_92 = (*(tint_symbol_5)).y;
+  switch(0u) {
+    default: {
+      float4 const x_95 = float4(x_51, 0.0f, x_57);
+      float const x_96 = float3(x_48, -0.5f).z;
+      x_98_phi = x_96;
+      x_101_phi = 1;
+      while (true) {
+        float x_111 = 0.0f;
+        float x_119 = 0.0f;
+        int x_102 = 0;
+        float x_99_phi = 0.0f;
+        x_98 = x_98_phi;
+        int const x_101 = x_101_phi;
+        x_124_phi = 0.0f;
+        x_125_phi = x_98;
+        x_126_phi = false;
+        if ((x_101 < 800)) {
+        } else {
+          break;
+        }
+        float x_118 = 0.0f;
+        float x_119_phi = 0.0f;
+        if (((x_101 % 32) == 0)) {
+          x_111 = (x_98 + 0.400000006f);
+          x_99_phi = x_111;
+        } else {
+          x_119_phi = x_98;
+          if (((float(x_101) % rint(x_50)) <= 0.01f)) {
+            x_118 = (x_98 + 100.0f);
+            x_119_phi = x_118;
+          }
+          x_119 = x_119_phi;
+          x_99_phi = x_119;
+        }
+        x_99 = x_99_phi;
+        if ((float(x_101) >= x_92)) {
+          x_124_phi = x_99;
+          x_125_phi = x_99;
+          x_126_phi = true;
+          break;
+        }
+        {
+          x_102 = (x_101 + 1);
+          x_98_phi = x_99;
+          x_101_phi = x_102;
+        }
+      }
+      x_124 = x_124_phi;
+      x_125 = x_125_phi;
+      bool const x_126 = x_126_phi;
+      x_128_phi = x_124;
+      if (x_126) {
+        break;
+      }
+      x_128_phi = x_125;
+      break;
+    }
+  }
+  float const x_128 = x_128_phi;
+  c.y = x_128;
+  float const x_130 = c.x;
+  float const x_131 = c.y;
+  c.z = (x_130 + x_131);
+  x_135_phi = 0;
+  while (true) {
+    int x_136 = 0;
+    int const x_135 = x_135_phi;
+    if ((x_135 < 3)) {
+    } else {
+      break;
+    }
+    int const x_141_save = x_135;
+    float const x_142 = c[x_141_save];
+    if ((x_142 >= 1.0f)) {
+      float const x_146 = c[x_141_save];
+      float const x_147 = c[x_141_save];
+      c[x_141_save] = (x_146 * x_147);
+    }
+    {
+      x_136 = (x_135 + 1);
+      x_135_phi = x_136;
+    }
+  }
+  float3 const x_149 = c;
+  float3 const x_151 = normalize(fabs(x_149));
+  *(tint_symbol_6) = float4(x_151.x, x_151.y, x_151.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_7, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
+T:\tmp\ufm8.0.metal:62:29: error: invalid operands to binary expression ('float' and 'float')
+          if (((float(x_60) % rint(x_50)) <= 0.01f)) {
+                ~~~~~~~~~~~ ^ ~~~~~~~~~~
+T:\tmp\ufm8.0.metal:132:30: error: invalid operands to binary expression ('float' and 'float')
+          if (((float(x_101) % rint(x_50)) <= 0.01f)) {
+                ~~~~~~~~~~~~ ^ ~~~~~~~~~~
+2 errors generated.
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..59c0cdb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/1.spvasm.expected.spvasm
@@ -0,0 +1,462 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 267
+; Schema: 0
+               OpCapability Shader
+         %58 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_7 "x_7"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %c "c"
+               OpName %x_53 "x_53"
+               OpName %x_57 "x_57"
+               OpName %x_58 "x_58"
+               OpName %x_83 "x_83"
+               OpName %x_84 "x_84"
+               OpName %x_124 "x_124"
+               OpName %x_125 "x_125"
+               OpName %x_57_phi "x_57_phi"
+               OpName %x_60_phi "x_60_phi"
+               OpName %x_83_phi "x_83_phi"
+               OpName %x_84_phi "x_84_phi"
+               OpName %x_85_phi "x_85_phi"
+               OpName %x_87_phi "x_87_phi"
+               OpName %x_128_phi "x_128_phi"
+               OpName %x_135_phi "x_135_phi"
+               OpName %x_70 "x_70"
+               OpName %x_78 "x_78"
+               OpName %x_61 "x_61"
+               OpName %x_58_phi "x_58_phi"
+               OpName %x_77 "x_77"
+               OpName %x_78_phi "x_78_phi"
+               OpName %x_92 "x_92"
+               OpName %x_98 "x_98"
+               OpName %x_99 "x_99"
+               OpName %x_98_phi "x_98_phi"
+               OpName %x_101_phi "x_101_phi"
+               OpName %x_124_phi "x_124_phi"
+               OpName %x_125_phi "x_125_phi"
+               OpName %x_126_phi "x_126_phi"
+               OpName %x_111 "x_111"
+               OpName %x_119 "x_119"
+               OpName %x_102 "x_102"
+               OpName %x_99_phi "x_99_phi"
+               OpName %x_118 "x_118"
+               OpName %x_119_phi "x_119_phi"
+               OpName %x_136 "x_136"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %22 = OpConstantNull %v3float
+%_ptr_Function_float = OpTypePointer Function %float
+         %25 = OpConstantNull %float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %36 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %42 = OpConstantNull %bool
+    %float_7 = OpConstant %float 7
+    %float_8 = OpConstant %float 8
+    %float_9 = OpConstant %float 9
+         %49 = OpConstantComposite %v3float %float_7 %float_8 %float_9
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+%float_0_125 = OpConstant %float 0.125
+    %float_0 = OpConstant %float 0
+ %float_n0_5 = OpConstant %float -0.5
+         %63 = OpConstantComposite %v2float %float_0 %float_n0_5
+%_ptr_Private_float = OpTypePointer Private %float
+      %int_1 = OpConstant %int 1
+      %false = OpConstantFalse %bool
+    %int_800 = OpConstant %int 800
+     %int_32 = OpConstant %int 32
+      %int_0 = OpConstant %int 0
+%float_0_400000006 = OpConstant %float 0.400000006
+%float_0_00999999978 = OpConstant %float 0.00999999978
+  %float_100 = OpConstant %float 100
+       %true = OpConstantTrue %bool
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+      %int_3 = OpConstant %int 3
+   %main_out = OpTypeStruct %v4float
+        %254 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %c = OpVariable %_ptr_Function_v3float Function %22
+       %x_53 = OpVariable %_ptr_Function_float Function %25
+       %x_57 = OpVariable %_ptr_Function_float Function %25
+       %x_58 = OpVariable %_ptr_Function_float Function %25
+       %x_83 = OpVariable %_ptr_Function_float Function %25
+       %x_84 = OpVariable %_ptr_Function_float Function %25
+      %x_124 = OpVariable %_ptr_Function_float Function %25
+      %x_125 = OpVariable %_ptr_Function_float Function %25
+   %x_57_phi = OpVariable %_ptr_Function_float Function %25
+   %x_60_phi = OpVariable %_ptr_Function_int Function %36
+   %x_83_phi = OpVariable %_ptr_Function_float Function %25
+   %x_84_phi = OpVariable %_ptr_Function_float Function %25
+   %x_85_phi = OpVariable %_ptr_Function_bool Function %42
+   %x_87_phi = OpVariable %_ptr_Function_float Function %25
+  %x_128_phi = OpVariable %_ptr_Function_float Function %25
+  %x_135_phi = OpVariable %_ptr_Function_int Function %36
+       %x_70 = OpVariable %_ptr_Function_float Function %25
+       %x_78 = OpVariable %_ptr_Function_float Function %25
+       %x_61 = OpVariable %_ptr_Function_int Function %36
+   %x_58_phi = OpVariable %_ptr_Function_float Function %25
+       %x_77 = OpVariable %_ptr_Function_float Function %25
+   %x_78_phi = OpVariable %_ptr_Function_float Function %25
+       %x_92 = OpVariable %_ptr_Function_float Function %25
+       %x_98 = OpVariable %_ptr_Function_float Function %25
+       %x_99 = OpVariable %_ptr_Function_float Function %25
+   %x_98_phi = OpVariable %_ptr_Function_float Function %25
+  %x_101_phi = OpVariable %_ptr_Function_int Function %36
+  %x_124_phi = OpVariable %_ptr_Function_float Function %25
+  %x_125_phi = OpVariable %_ptr_Function_float Function %25
+  %x_126_phi = OpVariable %_ptr_Function_bool Function %42
+      %x_111 = OpVariable %_ptr_Function_float Function %25
+      %x_119 = OpVariable %_ptr_Function_float Function %25
+      %x_102 = OpVariable %_ptr_Function_int Function %36
+   %x_99_phi = OpVariable %_ptr_Function_float Function %25
+      %x_118 = OpVariable %_ptr_Function_float Function %25
+  %x_119_phi = OpVariable %_ptr_Function_float Function %25
+      %x_136 = OpVariable %_ptr_Function_int Function %36
+               OpStore %c %49
+         %53 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_0
+         %54 = OpLoad %float %53
+         %56 = OpCompositeConstruct %v2float %float_1 %54
+         %60 = OpFMul %float %54 %float_0_125
+         %57 = OpExtInst %float %58 RoundEven %60
+         %65 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %66 = OpLoad %float %65
+               OpStore %x_53 %66
+               OpSelectionMerge %67 None
+               OpSwitch %uint_0 %68
+         %68 = OpLabel
+               OpStore %x_57_phi %float_n0_5
+               OpStore %x_60_phi %int_1
+               OpBranch %70
+         %70 = OpLabel
+               OpLoopMerge %71 %72 None
+               OpBranch %73
+         %73 = OpLabel
+         %78 = OpLoad %float %x_57_phi
+               OpStore %x_57 %78
+         %79 = OpLoad %int %x_60_phi
+               OpStore %x_83_phi %float_0
+         %80 = OpLoad %float %x_57
+               OpStore %x_84_phi %80
+               OpStore %x_85_phi %false
+         %83 = OpSLessThan %bool %79 %int_800
+               OpSelectionMerge %84 None
+               OpBranchConditional %83 %85 %86
+         %85 = OpLabel
+               OpBranch %84
+         %86 = OpLabel
+               OpBranch %71
+         %84 = OpLabel
+         %90 = OpSMod %int %79 %int_32
+         %92 = OpIEqual %bool %90 %int_0
+               OpSelectionMerge %93 None
+               OpBranchConditional %92 %94 %95
+         %94 = OpLabel
+         %96 = OpLoad %float %x_57
+         %98 = OpFAdd %float %96 %float_0_400000006
+               OpStore %x_70 %98
+         %99 = OpLoad %float %x_70
+               OpStore %x_58_phi %99
+               OpBranch %93
+         %95 = OpLabel
+        %100 = OpLoad %float %x_57
+               OpStore %x_78_phi %100
+        %101 = OpConvertSToF %float %79
+        %102 = OpExtInst %float %58 RoundEven %57
+        %103 = OpFMod %float %101 %102
+        %105 = OpFOrdLessThanEqual %bool %103 %float_0_00999999978
+               OpSelectionMerge %106 None
+               OpBranchConditional %105 %107 %106
+        %107 = OpLabel
+        %108 = OpLoad %float %x_57
+        %110 = OpFAdd %float %108 %float_100
+               OpStore %x_77 %110
+        %111 = OpLoad %float %x_77
+               OpStore %x_78_phi %111
+               OpBranch %106
+        %106 = OpLabel
+        %112 = OpLoad %float %x_78_phi
+               OpStore %x_78 %112
+        %113 = OpLoad %float %x_78
+               OpStore %x_58_phi %113
+               OpBranch %93
+         %93 = OpLabel
+        %114 = OpLoad %float %x_58_phi
+               OpStore %x_58 %114
+        %115 = OpConvertSToF %float %79
+        %116 = OpLoad %float %x_53
+        %117 = OpFOrdGreaterThanEqual %bool %115 %116
+               OpSelectionMerge %118 None
+               OpBranchConditional %117 %119 %118
+        %119 = OpLabel
+        %120 = OpLoad %float %x_58
+               OpStore %x_83_phi %120
+        %121 = OpLoad %float %x_58
+               OpStore %x_84_phi %121
+               OpStore %x_85_phi %true
+               OpBranch %71
+        %118 = OpLabel
+               OpBranch %72
+         %72 = OpLabel
+        %123 = OpIAdd %int %79 %int_1
+               OpStore %x_61 %123
+        %124 = OpLoad %float %x_58
+               OpStore %x_57_phi %124
+        %125 = OpLoad %int %x_61
+               OpStore %x_60_phi %125
+               OpBranch %70
+         %71 = OpLabel
+        %126 = OpLoad %float %x_83_phi
+               OpStore %x_83 %126
+        %127 = OpLoad %float %x_84_phi
+               OpStore %x_84 %127
+        %128 = OpLoad %bool %x_85_phi
+        %129 = OpLoad %float %x_83
+               OpStore %x_87_phi %129
+               OpSelectionMerge %130 None
+               OpBranchConditional %128 %131 %130
+        %131 = OpLabel
+               OpBranch %67
+        %130 = OpLabel
+        %132 = OpLoad %float %x_84
+               OpStore %x_87_phi %132
+               OpBranch %67
+         %67 = OpLabel
+        %141 = OpLoad %float %x_87_phi
+        %142 = OpLoad %float %x_84
+        %143 = OpLoad %float %x_83
+        %144 = OpCompositeConstruct %v4float %142 %float_0_400000006 %143 %float_0_400000006
+        %145 = OpAccessChain %_ptr_Function_float %c %uint_0
+               OpStore %145 %141
+        %147 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %148 = OpLoad %float %147
+               OpStore %x_92 %148
+               OpSelectionMerge %149 None
+               OpSwitch %uint_0 %150
+        %150 = OpLabel
+        %151 = OpCompositeExtract %float %63 0
+        %152 = OpCompositeExtract %float %63 1
+        %153 = OpLoad %float %x_57
+        %154 = OpCompositeConstruct %v4float %151 %152 %float_0 %153
+        %155 = OpCompositeExtract %float %56 0
+        %156 = OpCompositeExtract %float %56 1
+        %157 = OpCompositeConstruct %v3float %155 %156 %float_n0_5
+        %158 = OpCompositeExtract %float %157 2
+               OpStore %x_98_phi %158
+               OpStore %x_101_phi %int_1
+               OpBranch %159
+        %159 = OpLabel
+               OpLoopMerge %160 %161 None
+               OpBranch %162
+        %162 = OpLabel
+        %167 = OpLoad %float %x_98_phi
+               OpStore %x_98 %167
+        %168 = OpLoad %int %x_101_phi
+               OpStore %x_124_phi %float_0
+        %169 = OpLoad %float %x_98
+               OpStore %x_125_phi %169
+               OpStore %x_126_phi %false
+        %170 = OpSLessThan %bool %168 %int_800
+               OpSelectionMerge %171 None
+               OpBranchConditional %170 %172 %173
+        %172 = OpLabel
+               OpBranch %171
+        %173 = OpLabel
+               OpBranch %160
+        %171 = OpLabel
+        %176 = OpSMod %int %168 %int_32
+        %177 = OpIEqual %bool %176 %int_0
+               OpSelectionMerge %178 None
+               OpBranchConditional %177 %179 %180
+        %179 = OpLabel
+        %181 = OpLoad %float %x_98
+        %182 = OpFAdd %float %181 %float_0_400000006
+               OpStore %x_111 %182
+        %183 = OpLoad %float %x_111
+               OpStore %x_99_phi %183
+               OpBranch %178
+        %180 = OpLabel
+        %184 = OpLoad %float %x_98
+               OpStore %x_119_phi %184
+        %185 = OpConvertSToF %float %168
+        %186 = OpExtInst %float %58 RoundEven %57
+        %187 = OpFMod %float %185 %186
+        %188 = OpFOrdLessThanEqual %bool %187 %float_0_00999999978
+               OpSelectionMerge %189 None
+               OpBranchConditional %188 %190 %189
+        %190 = OpLabel
+        %191 = OpLoad %float %x_98
+        %192 = OpFAdd %float %191 %float_100
+               OpStore %x_118 %192
+        %193 = OpLoad %float %x_118
+               OpStore %x_119_phi %193
+               OpBranch %189
+        %189 = OpLabel
+        %194 = OpLoad %float %x_119_phi
+               OpStore %x_119 %194
+        %195 = OpLoad %float %x_119
+               OpStore %x_99_phi %195
+               OpBranch %178
+        %178 = OpLabel
+        %196 = OpLoad %float %x_99_phi
+               OpStore %x_99 %196
+        %197 = OpConvertSToF %float %168
+        %198 = OpLoad %float %x_92
+        %199 = OpFOrdGreaterThanEqual %bool %197 %198
+               OpSelectionMerge %200 None
+               OpBranchConditional %199 %201 %200
+        %201 = OpLabel
+        %202 = OpLoad %float %x_99
+               OpStore %x_124_phi %202
+        %203 = OpLoad %float %x_99
+               OpStore %x_125_phi %203
+               OpStore %x_126_phi %true
+               OpBranch %160
+        %200 = OpLabel
+               OpBranch %161
+        %161 = OpLabel
+        %204 = OpIAdd %int %168 %int_1
+               OpStore %x_102 %204
+        %205 = OpLoad %float %x_99
+               OpStore %x_98_phi %205
+        %206 = OpLoad %int %x_102
+               OpStore %x_101_phi %206
+               OpBranch %159
+        %160 = OpLabel
+        %207 = OpLoad %float %x_124_phi
+               OpStore %x_124 %207
+        %208 = OpLoad %float %x_125_phi
+               OpStore %x_125 %208
+        %209 = OpLoad %bool %x_126_phi
+        %210 = OpLoad %float %x_124
+               OpStore %x_128_phi %210
+               OpSelectionMerge %211 None
+               OpBranchConditional %209 %212 %211
+        %212 = OpLabel
+               OpBranch %149
+        %211 = OpLabel
+        %213 = OpLoad %float %x_125
+               OpStore %x_128_phi %213
+               OpBranch %149
+        %149 = OpLabel
+        %214 = OpLoad %float %x_128_phi
+        %215 = OpAccessChain %_ptr_Function_float %c %uint_1
+               OpStore %215 %214
+        %216 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %217 = OpLoad %float %216
+        %218 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %219 = OpLoad %float %218
+        %221 = OpAccessChain %_ptr_Function_float %c %uint_2
+        %222 = OpFAdd %float %217 %219
+               OpStore %221 %222
+               OpStore %x_135_phi %int_0
+               OpBranch %223
+        %223 = OpLabel
+               OpLoopMerge %224 %225 None
+               OpBranch %226
+        %226 = OpLabel
+        %228 = OpLoad %int %x_135_phi
+        %230 = OpSLessThan %bool %228 %int_3
+               OpSelectionMerge %231 None
+               OpBranchConditional %230 %232 %233
+        %232 = OpLabel
+               OpBranch %231
+        %233 = OpLabel
+               OpBranch %224
+        %231 = OpLabel
+        %234 = OpAccessChain %_ptr_Function_float %c %228
+        %235 = OpLoad %float %234
+        %236 = OpFOrdGreaterThanEqual %bool %235 %float_1
+               OpSelectionMerge %237 None
+               OpBranchConditional %236 %238 %237
+        %238 = OpLabel
+        %239 = OpAccessChain %_ptr_Function_float %c %228
+        %240 = OpLoad %float %239
+        %241 = OpAccessChain %_ptr_Function_float %c %228
+        %242 = OpLoad %float %241
+        %243 = OpAccessChain %_ptr_Function_float %c %228
+        %244 = OpFMul %float %240 %242
+               OpStore %243 %244
+               OpBranch %237
+        %237 = OpLabel
+               OpBranch %225
+        %225 = OpLabel
+        %245 = OpIAdd %int %228 %int_1
+               OpStore %x_136 %245
+        %246 = OpLoad %int %x_136
+               OpStore %x_135_phi %246
+               OpBranch %223
+        %224 = OpLabel
+        %247 = OpLoad %v3float %c
+        %249 = OpExtInst %v3float %58 FAbs %247
+        %248 = OpExtInst %v3float %58 Normalize %249
+        %250 = OpCompositeExtract %float %248 0
+        %251 = OpCompositeExtract %float %248 1
+        %252 = OpCompositeExtract %float %248 2
+        %253 = OpCompositeConstruct %v4float %250 %251 %252 %float_1
+               OpStore %x_GLF_color %253
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %254
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %258 = OpLabel
+        %259 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %259
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %261 = OpLabel
+        %262 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %262
+        %263 = OpFunctionCall %void %main_1
+        %265 = OpLoad %v4float %x_GLF_color
+        %266 = OpCompositeConstruct %main_out %265
+        %264 = OpFunctionCall %void %tint_symbol_3 %266
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..c2ad2e8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/1.spvasm.expected.wgsl
@@ -0,0 +1,205 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var c : vec3<f32>;
+  var x_53 : f32;
+  var x_57 : f32;
+  var x_58 : f32;
+  var x_83 : f32;
+  var x_84 : f32;
+  var x_124 : f32;
+  var x_125 : f32;
+  var x_57_phi : f32;
+  var x_60_phi : i32;
+  var x_83_phi : f32;
+  var x_84_phi : f32;
+  var x_85_phi : bool;
+  var x_87_phi : f32;
+  var x_128_phi : f32;
+  var x_135_phi : i32;
+  c = vec3<f32>(7.0, 8.0, 9.0);
+  let x_47 : f32 = x_7.resolution.x;
+  let x_48 : vec2<f32> = vec2<f32>(1.0, x_47);
+  let x_50 : f32 = round((x_47 * 0.125));
+  let x_51 : vec2<f32> = vec2<f32>(0.0, -0.5);
+  x_53 = gl_FragCoord.x;
+  switch(0u) {
+    default: {
+      x_57_phi = -0.5;
+      x_60_phi = 1;
+      loop {
+        var x_70 : f32;
+        var x_78 : f32;
+        var x_61 : i32;
+        var x_58_phi : f32;
+        x_57 = x_57_phi;
+        let x_60 : i32 = x_60_phi;
+        x_83_phi = 0.0;
+        x_84_phi = x_57;
+        x_85_phi = false;
+        if ((x_60 < 800)) {
+        } else {
+          break;
+        }
+        var x_77 : f32;
+        var x_78_phi : f32;
+        if (((x_60 % 32) == 0)) {
+          x_70 = (x_57 + 0.400000006);
+          x_58_phi = x_70;
+        } else {
+          x_78_phi = x_57;
+          if (((f32(x_60) % round(x_50)) <= 0.01)) {
+            x_77 = (x_57 + 100.0);
+            x_78_phi = x_77;
+          }
+          x_78 = x_78_phi;
+          x_58_phi = x_78;
+        }
+        x_58 = x_58_phi;
+        if ((f32(x_60) >= x_53)) {
+          x_83_phi = x_58;
+          x_84_phi = x_58;
+          x_85_phi = true;
+          break;
+        }
+
+        continuing {
+          x_61 = (x_60 + 1);
+          x_57_phi = x_58;
+          x_60_phi = x_61;
+        }
+      }
+      x_83 = x_83_phi;
+      x_84 = x_84_phi;
+      let x_85 : bool = x_85_phi;
+      x_87_phi = x_83;
+      if (x_85) {
+        break;
+      }
+      x_87_phi = x_84;
+    }
+  }
+  var x_92 : f32;
+  var x_98 : f32;
+  var x_99 : f32;
+  var x_98_phi : f32;
+  var x_101_phi : i32;
+  var x_124_phi : f32;
+  var x_125_phi : f32;
+  var x_126_phi : bool;
+  let x_87 : f32 = x_87_phi;
+  let x_88 : ptr<function, f32> = &(c.x);
+  let x_89 : vec4<f32> = vec4<f32>(x_84, 0.400000006, x_83, 0.400000006);
+  *(x_88) = x_87;
+  x_92 = gl_FragCoord.y;
+  switch(0u) {
+    default: {
+      let x_95 : vec4<f32> = vec4<f32>(x_51, 0.0, x_57);
+      let x_96 : f32 = vec3<f32>(x_48, -0.5).z;
+      x_98_phi = x_96;
+      x_101_phi = 1;
+      loop {
+        var x_111 : f32;
+        var x_119 : f32;
+        var x_102 : i32;
+        var x_99_phi : f32;
+        x_98 = x_98_phi;
+        let x_101 : i32 = x_101_phi;
+        x_124_phi = 0.0;
+        x_125_phi = x_98;
+        x_126_phi = false;
+        if ((x_101 < 800)) {
+        } else {
+          break;
+        }
+        var x_118 : f32;
+        var x_119_phi : f32;
+        if (((x_101 % 32) == 0)) {
+          x_111 = (x_98 + 0.400000006);
+          x_99_phi = x_111;
+        } else {
+          x_119_phi = x_98;
+          if (((f32(x_101) % round(x_50)) <= 0.01)) {
+            x_118 = (x_98 + 100.0);
+            x_119_phi = x_118;
+          }
+          x_119 = x_119_phi;
+          x_99_phi = x_119;
+        }
+        x_99 = x_99_phi;
+        if ((f32(x_101) >= x_92)) {
+          x_124_phi = x_99;
+          x_125_phi = x_99;
+          x_126_phi = true;
+          break;
+        }
+
+        continuing {
+          x_102 = (x_101 + 1);
+          x_98_phi = x_99;
+          x_101_phi = x_102;
+        }
+      }
+      x_124 = x_124_phi;
+      x_125 = x_125_phi;
+      let x_126 : bool = x_126_phi;
+      x_128_phi = x_124;
+      if (x_126) {
+        break;
+      }
+      x_128_phi = x_125;
+    }
+  }
+  let x_128 : f32 = x_128_phi;
+  let x_129 : ptr<function, f32> = &(c.y);
+  *(x_129) = x_128;
+  let x_130 : f32 = *(x_88);
+  let x_131 : f32 = *(x_129);
+  c.z = (x_130 + x_131);
+  x_135_phi = 0;
+  loop {
+    var x_136 : i32;
+    let x_135 : i32 = x_135_phi;
+    if ((x_135 < 3)) {
+    } else {
+      break;
+    }
+    let x_141 : ptr<function, f32> = &(c[x_135]);
+    let x_142 : f32 = *(x_141);
+    if ((x_142 >= 1.0)) {
+      let x_146 : f32 = *(x_141);
+      let x_147 : f32 = *(x_141);
+      *(x_141) = (x_146 * x_147);
+    }
+
+    continuing {
+      x_136 = (x_135 + 1);
+      x_135_phi = x_136;
+    }
+  }
+  let x_149 : vec3<f32> = c;
+  let x_151 : vec3<f32> = normalize(abs(x_149));
+  x_GLF_color = vec4<f32>(x_151.x, x_151.y, x_151.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/1.wgsl
new file mode 100644
index 0000000..c2ad2e8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/1.wgsl
@@ -0,0 +1,205 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var c : vec3<f32>;
+  var x_53 : f32;
+  var x_57 : f32;
+  var x_58 : f32;
+  var x_83 : f32;
+  var x_84 : f32;
+  var x_124 : f32;
+  var x_125 : f32;
+  var x_57_phi : f32;
+  var x_60_phi : i32;
+  var x_83_phi : f32;
+  var x_84_phi : f32;
+  var x_85_phi : bool;
+  var x_87_phi : f32;
+  var x_128_phi : f32;
+  var x_135_phi : i32;
+  c = vec3<f32>(7.0, 8.0, 9.0);
+  let x_47 : f32 = x_7.resolution.x;
+  let x_48 : vec2<f32> = vec2<f32>(1.0, x_47);
+  let x_50 : f32 = round((x_47 * 0.125));
+  let x_51 : vec2<f32> = vec2<f32>(0.0, -0.5);
+  x_53 = gl_FragCoord.x;
+  switch(0u) {
+    default: {
+      x_57_phi = -0.5;
+      x_60_phi = 1;
+      loop {
+        var x_70 : f32;
+        var x_78 : f32;
+        var x_61 : i32;
+        var x_58_phi : f32;
+        x_57 = x_57_phi;
+        let x_60 : i32 = x_60_phi;
+        x_83_phi = 0.0;
+        x_84_phi = x_57;
+        x_85_phi = false;
+        if ((x_60 < 800)) {
+        } else {
+          break;
+        }
+        var x_77 : f32;
+        var x_78_phi : f32;
+        if (((x_60 % 32) == 0)) {
+          x_70 = (x_57 + 0.400000006);
+          x_58_phi = x_70;
+        } else {
+          x_78_phi = x_57;
+          if (((f32(x_60) % round(x_50)) <= 0.01)) {
+            x_77 = (x_57 + 100.0);
+            x_78_phi = x_77;
+          }
+          x_78 = x_78_phi;
+          x_58_phi = x_78;
+        }
+        x_58 = x_58_phi;
+        if ((f32(x_60) >= x_53)) {
+          x_83_phi = x_58;
+          x_84_phi = x_58;
+          x_85_phi = true;
+          break;
+        }
+
+        continuing {
+          x_61 = (x_60 + 1);
+          x_57_phi = x_58;
+          x_60_phi = x_61;
+        }
+      }
+      x_83 = x_83_phi;
+      x_84 = x_84_phi;
+      let x_85 : bool = x_85_phi;
+      x_87_phi = x_83;
+      if (x_85) {
+        break;
+      }
+      x_87_phi = x_84;
+    }
+  }
+  var x_92 : f32;
+  var x_98 : f32;
+  var x_99 : f32;
+  var x_98_phi : f32;
+  var x_101_phi : i32;
+  var x_124_phi : f32;
+  var x_125_phi : f32;
+  var x_126_phi : bool;
+  let x_87 : f32 = x_87_phi;
+  let x_88 : ptr<function, f32> = &(c.x);
+  let x_89 : vec4<f32> = vec4<f32>(x_84, 0.400000006, x_83, 0.400000006);
+  *(x_88) = x_87;
+  x_92 = gl_FragCoord.y;
+  switch(0u) {
+    default: {
+      let x_95 : vec4<f32> = vec4<f32>(x_51, 0.0, x_57);
+      let x_96 : f32 = vec3<f32>(x_48, -0.5).z;
+      x_98_phi = x_96;
+      x_101_phi = 1;
+      loop {
+        var x_111 : f32;
+        var x_119 : f32;
+        var x_102 : i32;
+        var x_99_phi : f32;
+        x_98 = x_98_phi;
+        let x_101 : i32 = x_101_phi;
+        x_124_phi = 0.0;
+        x_125_phi = x_98;
+        x_126_phi = false;
+        if ((x_101 < 800)) {
+        } else {
+          break;
+        }
+        var x_118 : f32;
+        var x_119_phi : f32;
+        if (((x_101 % 32) == 0)) {
+          x_111 = (x_98 + 0.400000006);
+          x_99_phi = x_111;
+        } else {
+          x_119_phi = x_98;
+          if (((f32(x_101) % round(x_50)) <= 0.01)) {
+            x_118 = (x_98 + 100.0);
+            x_119_phi = x_118;
+          }
+          x_119 = x_119_phi;
+          x_99_phi = x_119;
+        }
+        x_99 = x_99_phi;
+        if ((f32(x_101) >= x_92)) {
+          x_124_phi = x_99;
+          x_125_phi = x_99;
+          x_126_phi = true;
+          break;
+        }
+
+        continuing {
+          x_102 = (x_101 + 1);
+          x_98_phi = x_99;
+          x_101_phi = x_102;
+        }
+      }
+      x_124 = x_124_phi;
+      x_125 = x_125_phi;
+      let x_126 : bool = x_126_phi;
+      x_128_phi = x_124;
+      if (x_126) {
+        break;
+      }
+      x_128_phi = x_125;
+    }
+  }
+  let x_128 : f32 = x_128_phi;
+  let x_129 : ptr<function, f32> = &(c.y);
+  *(x_129) = x_128;
+  let x_130 : f32 = *(x_88);
+  let x_131 : f32 = *(x_129);
+  c.z = (x_130 + x_131);
+  x_135_phi = 0;
+  loop {
+    var x_136 : i32;
+    let x_135 : i32 = x_135_phi;
+    if ((x_135 < 3)) {
+    } else {
+      break;
+    }
+    let x_141 : ptr<function, f32> = &(c[x_135]);
+    let x_142 : f32 = *(x_141);
+    if ((x_142 >= 1.0)) {
+      let x_146 : f32 = *(x_141);
+      let x_147 : f32 = *(x_141);
+      *(x_141) = (x_146 * x_147);
+    }
+
+    continuing {
+      x_136 = (x_135 + 1);
+      x_135_phi = x_136;
+    }
+  }
+  let x_149 : vec3<f32> = c;
+  let x_151 : vec3<f32> = normalize(abs(x_149));
+  x_GLF_color = vec4<f32>(x_151.x, x_151.y, x_151.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..f5c9fb0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/1.wgsl.expected.hlsl
@@ -0,0 +1,207 @@
+void set_float3(inout float3 vec, int idx, float val) {
+  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
+}
+
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float3 c = float3(0.0f, 0.0f, 0.0f);
+  float x_53 = 0.0f;
+  float x_57 = 0.0f;
+  float x_58 = 0.0f;
+  float x_83 = 0.0f;
+  float x_84 = 0.0f;
+  float x_124 = 0.0f;
+  float x_125 = 0.0f;
+  float x_57_phi = 0.0f;
+  int x_60_phi = 0;
+  float x_83_phi = 0.0f;
+  float x_84_phi = 0.0f;
+  bool x_85_phi = false;
+  float x_87_phi = 0.0f;
+  float x_128_phi = 0.0f;
+  int x_135_phi = 0;
+  c = float3(7.0f, 8.0f, 9.0f);
+  const float x_47 = asfloat(x_7[0].x);
+  const float2 x_48 = float2(1.0f, x_47);
+  const float x_50 = round((x_47 * 0.125f));
+  const float2 x_51 = float2(0.0f, -0.5f);
+  x_53 = gl_FragCoord.x;
+  switch(0u) {
+    default: {
+      x_57_phi = -0.5f;
+      x_60_phi = 1;
+      while (true) {
+        float x_70 = 0.0f;
+        float x_78 = 0.0f;
+        int x_61 = 0;
+        float x_58_phi = 0.0f;
+        x_57 = x_57_phi;
+        const int x_60 = x_60_phi;
+        x_83_phi = 0.0f;
+        x_84_phi = x_57;
+        x_85_phi = false;
+        if ((x_60 < 800)) {
+        } else {
+          break;
+        }
+        float x_77 = 0.0f;
+        float x_78_phi = 0.0f;
+        if (((x_60 % 32) == 0)) {
+          x_70 = (x_57 + 0.400000006f);
+          x_58_phi = x_70;
+        } else {
+          x_78_phi = x_57;
+          if (((float(x_60) % round(x_50)) <= 0.01f)) {
+            x_77 = (x_57 + 100.0f);
+            x_78_phi = x_77;
+          }
+          x_78 = x_78_phi;
+          x_58_phi = x_78;
+        }
+        x_58 = x_58_phi;
+        if ((float(x_60) >= x_53)) {
+          x_83_phi = x_58;
+          x_84_phi = x_58;
+          x_85_phi = true;
+          break;
+        }
+        {
+          x_61 = (x_60 + 1);
+          x_57_phi = x_58;
+          x_60_phi = x_61;
+        }
+      }
+      x_83 = x_83_phi;
+      x_84 = x_84_phi;
+      const bool x_85 = x_85_phi;
+      x_87_phi = x_83;
+      if (x_85) {
+        break;
+      }
+      x_87_phi = x_84;
+      break;
+    }
+  }
+  float x_92 = 0.0f;
+  float x_98 = 0.0f;
+  float x_99 = 0.0f;
+  float x_98_phi = 0.0f;
+  int x_101_phi = 0;
+  float x_124_phi = 0.0f;
+  float x_125_phi = 0.0f;
+  bool x_126_phi = false;
+  const float x_87 = x_87_phi;
+  const float4 x_89 = float4(x_84, 0.400000006f, x_83, 0.400000006f);
+  c.x = x_87;
+  x_92 = gl_FragCoord.y;
+  switch(0u) {
+    default: {
+      const float4 x_95 = float4(x_51, 0.0f, x_57);
+      const float x_96 = float3(x_48, -0.5f).z;
+      x_98_phi = x_96;
+      x_101_phi = 1;
+      while (true) {
+        float x_111 = 0.0f;
+        float x_119 = 0.0f;
+        int x_102 = 0;
+        float x_99_phi = 0.0f;
+        x_98 = x_98_phi;
+        const int x_101 = x_101_phi;
+        x_124_phi = 0.0f;
+        x_125_phi = x_98;
+        x_126_phi = false;
+        if ((x_101 < 800)) {
+        } else {
+          break;
+        }
+        float x_118 = 0.0f;
+        float x_119_phi = 0.0f;
+        if (((x_101 % 32) == 0)) {
+          x_111 = (x_98 + 0.400000006f);
+          x_99_phi = x_111;
+        } else {
+          x_119_phi = x_98;
+          if (((float(x_101) % round(x_50)) <= 0.01f)) {
+            x_118 = (x_98 + 100.0f);
+            x_119_phi = x_118;
+          }
+          x_119 = x_119_phi;
+          x_99_phi = x_119;
+        }
+        x_99 = x_99_phi;
+        if ((float(x_101) >= x_92)) {
+          x_124_phi = x_99;
+          x_125_phi = x_99;
+          x_126_phi = true;
+          break;
+        }
+        {
+          x_102 = (x_101 + 1);
+          x_98_phi = x_99;
+          x_101_phi = x_102;
+        }
+      }
+      x_124 = x_124_phi;
+      x_125 = x_125_phi;
+      const bool x_126 = x_126_phi;
+      x_128_phi = x_124;
+      if (x_126) {
+        break;
+      }
+      x_128_phi = x_125;
+      break;
+    }
+  }
+  const float x_128 = x_128_phi;
+  c.y = x_128;
+  const float x_130 = c.x;
+  const float x_131 = c.y;
+  c.z = (x_130 + x_131);
+  x_135_phi = 0;
+  while (true) {
+    int x_136 = 0;
+    const int x_135 = x_135_phi;
+    if ((x_135 < 3)) {
+    } else {
+      break;
+    }
+    const int x_141_save = x_135;
+    const float x_142 = c[x_141_save];
+    if ((x_142 >= 1.0f)) {
+      const float x_146 = c[x_141_save];
+      const float x_147 = c[x_141_save];
+      set_float3(c, x_141_save, (x_146 * x_147));
+    }
+    {
+      x_136 = (x_135 + 1);
+      x_135_phi = x_136;
+    }
+  }
+  const float3 x_151 = normalize(abs(c));
+  x_GLF_color = float4(x_151.x, x_151.y, x_151.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/1.wgsl.expected.msl
new file mode 100755
index 0000000..4bdc690
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/1.wgsl.expected.msl
@@ -0,0 +1,213 @@
+SKIP: FAILED
+
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float3 c = 0.0f;
+  float x_53 = 0.0f;
+  float x_57 = 0.0f;
+  float x_58 = 0.0f;
+  float x_83 = 0.0f;
+  float x_84 = 0.0f;
+  float x_124 = 0.0f;
+  float x_125 = 0.0f;
+  float x_57_phi = 0.0f;
+  int x_60_phi = 0;
+  float x_83_phi = 0.0f;
+  float x_84_phi = 0.0f;
+  bool x_85_phi = false;
+  float x_87_phi = 0.0f;
+  float x_128_phi = 0.0f;
+  int x_135_phi = 0;
+  c = float3(7.0f, 8.0f, 9.0f);
+  float const x_47 = x_7.resolution.x;
+  float2 const x_48 = float2(1.0f, x_47);
+  float const x_50 = rint((x_47 * 0.125f));
+  float2 const x_51 = float2(0.0f, -0.5f);
+  x_53 = (*(tint_symbol_5)).x;
+  switch(0u) {
+    default: {
+      x_57_phi = -0.5f;
+      x_60_phi = 1;
+      while (true) {
+        float x_70 = 0.0f;
+        float x_78 = 0.0f;
+        int x_61 = 0;
+        float x_58_phi = 0.0f;
+        x_57 = x_57_phi;
+        int const x_60 = x_60_phi;
+        x_83_phi = 0.0f;
+        x_84_phi = x_57;
+        x_85_phi = false;
+        if ((x_60 < 800)) {
+        } else {
+          break;
+        }
+        float x_77 = 0.0f;
+        float x_78_phi = 0.0f;
+        if (((x_60 % 32) == 0)) {
+          x_70 = (x_57 + 0.400000006f);
+          x_58_phi = x_70;
+        } else {
+          x_78_phi = x_57;
+          if (((float(x_60) % rint(x_50)) <= 0.01f)) {
+            x_77 = (x_57 + 100.0f);
+            x_78_phi = x_77;
+          }
+          x_78 = x_78_phi;
+          x_58_phi = x_78;
+        }
+        x_58 = x_58_phi;
+        if ((float(x_60) >= x_53)) {
+          x_83_phi = x_58;
+          x_84_phi = x_58;
+          x_85_phi = true;
+          break;
+        }
+        {
+          x_61 = (x_60 + 1);
+          x_57_phi = x_58;
+          x_60_phi = x_61;
+        }
+      }
+      x_83 = x_83_phi;
+      x_84 = x_84_phi;
+      bool const x_85 = x_85_phi;
+      x_87_phi = x_83;
+      if (x_85) {
+        break;
+      }
+      x_87_phi = x_84;
+      break;
+    }
+  }
+  float x_92 = 0.0f;
+  float x_98 = 0.0f;
+  float x_99 = 0.0f;
+  float x_98_phi = 0.0f;
+  int x_101_phi = 0;
+  float x_124_phi = 0.0f;
+  float x_125_phi = 0.0f;
+  bool x_126_phi = false;
+  float const x_87 = x_87_phi;
+  float4 const x_89 = float4(x_84, 0.400000006f, x_83, 0.400000006f);
+  c.x = x_87;
+  x_92 = (*(tint_symbol_5)).y;
+  switch(0u) {
+    default: {
+      float4 const x_95 = float4(x_51, 0.0f, x_57);
+      float const x_96 = float3(x_48, -0.5f).z;
+      x_98_phi = x_96;
+      x_101_phi = 1;
+      while (true) {
+        float x_111 = 0.0f;
+        float x_119 = 0.0f;
+        int x_102 = 0;
+        float x_99_phi = 0.0f;
+        x_98 = x_98_phi;
+        int const x_101 = x_101_phi;
+        x_124_phi = 0.0f;
+        x_125_phi = x_98;
+        x_126_phi = false;
+        if ((x_101 < 800)) {
+        } else {
+          break;
+        }
+        float x_118 = 0.0f;
+        float x_119_phi = 0.0f;
+        if (((x_101 % 32) == 0)) {
+          x_111 = (x_98 + 0.400000006f);
+          x_99_phi = x_111;
+        } else {
+          x_119_phi = x_98;
+          if (((float(x_101) % rint(x_50)) <= 0.01f)) {
+            x_118 = (x_98 + 100.0f);
+            x_119_phi = x_118;
+          }
+          x_119 = x_119_phi;
+          x_99_phi = x_119;
+        }
+        x_99 = x_99_phi;
+        if ((float(x_101) >= x_92)) {
+          x_124_phi = x_99;
+          x_125_phi = x_99;
+          x_126_phi = true;
+          break;
+        }
+        {
+          x_102 = (x_101 + 1);
+          x_98_phi = x_99;
+          x_101_phi = x_102;
+        }
+      }
+      x_124 = x_124_phi;
+      x_125 = x_125_phi;
+      bool const x_126 = x_126_phi;
+      x_128_phi = x_124;
+      if (x_126) {
+        break;
+      }
+      x_128_phi = x_125;
+      break;
+    }
+  }
+  float const x_128 = x_128_phi;
+  c.y = x_128;
+  float const x_130 = c.x;
+  float const x_131 = c.y;
+  c.z = (x_130 + x_131);
+  x_135_phi = 0;
+  while (true) {
+    int x_136 = 0;
+    int const x_135 = x_135_phi;
+    if ((x_135 < 3)) {
+    } else {
+      break;
+    }
+    int const x_141_save = x_135;
+    float const x_142 = c[x_141_save];
+    if ((x_142 >= 1.0f)) {
+      float const x_146 = c[x_141_save];
+      float const x_147 = c[x_141_save];
+      c[x_141_save] = (x_146 * x_147);
+    }
+    {
+      x_136 = (x_135 + 1);
+      x_135_phi = x_136;
+    }
+  }
+  float3 const x_149 = c;
+  float3 const x_151 = normalize(fabs(x_149));
+  *(tint_symbol_6) = float4(x_151.x, x_151.y, x_151.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_7, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
+T:\tmp\u9vw.0.metal:62:29: error: invalid operands to binary expression ('float' and 'float')
+          if (((float(x_60) % rint(x_50)) <= 0.01f)) {
+                ~~~~~~~~~~~ ^ ~~~~~~~~~~
+T:\tmp\u9vw.0.metal:132:30: error: invalid operands to binary expression ('float' and 'float')
+          if (((float(x_101) % rint(x_50)) <= 0.01f)) {
+                ~~~~~~~~~~~~ ^ ~~~~~~~~~~
+2 errors generated.
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..59c0cdb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/1.wgsl.expected.spvasm
@@ -0,0 +1,462 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 267
+; Schema: 0
+               OpCapability Shader
+         %58 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_7 "x_7"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %c "c"
+               OpName %x_53 "x_53"
+               OpName %x_57 "x_57"
+               OpName %x_58 "x_58"
+               OpName %x_83 "x_83"
+               OpName %x_84 "x_84"
+               OpName %x_124 "x_124"
+               OpName %x_125 "x_125"
+               OpName %x_57_phi "x_57_phi"
+               OpName %x_60_phi "x_60_phi"
+               OpName %x_83_phi "x_83_phi"
+               OpName %x_84_phi "x_84_phi"
+               OpName %x_85_phi "x_85_phi"
+               OpName %x_87_phi "x_87_phi"
+               OpName %x_128_phi "x_128_phi"
+               OpName %x_135_phi "x_135_phi"
+               OpName %x_70 "x_70"
+               OpName %x_78 "x_78"
+               OpName %x_61 "x_61"
+               OpName %x_58_phi "x_58_phi"
+               OpName %x_77 "x_77"
+               OpName %x_78_phi "x_78_phi"
+               OpName %x_92 "x_92"
+               OpName %x_98 "x_98"
+               OpName %x_99 "x_99"
+               OpName %x_98_phi "x_98_phi"
+               OpName %x_101_phi "x_101_phi"
+               OpName %x_124_phi "x_124_phi"
+               OpName %x_125_phi "x_125_phi"
+               OpName %x_126_phi "x_126_phi"
+               OpName %x_111 "x_111"
+               OpName %x_119 "x_119"
+               OpName %x_102 "x_102"
+               OpName %x_99_phi "x_99_phi"
+               OpName %x_118 "x_118"
+               OpName %x_119_phi "x_119_phi"
+               OpName %x_136 "x_136"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %22 = OpConstantNull %v3float
+%_ptr_Function_float = OpTypePointer Function %float
+         %25 = OpConstantNull %float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %36 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %42 = OpConstantNull %bool
+    %float_7 = OpConstant %float 7
+    %float_8 = OpConstant %float 8
+    %float_9 = OpConstant %float 9
+         %49 = OpConstantComposite %v3float %float_7 %float_8 %float_9
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+%float_0_125 = OpConstant %float 0.125
+    %float_0 = OpConstant %float 0
+ %float_n0_5 = OpConstant %float -0.5
+         %63 = OpConstantComposite %v2float %float_0 %float_n0_5
+%_ptr_Private_float = OpTypePointer Private %float
+      %int_1 = OpConstant %int 1
+      %false = OpConstantFalse %bool
+    %int_800 = OpConstant %int 800
+     %int_32 = OpConstant %int 32
+      %int_0 = OpConstant %int 0
+%float_0_400000006 = OpConstant %float 0.400000006
+%float_0_00999999978 = OpConstant %float 0.00999999978
+  %float_100 = OpConstant %float 100
+       %true = OpConstantTrue %bool
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+      %int_3 = OpConstant %int 3
+   %main_out = OpTypeStruct %v4float
+        %254 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %c = OpVariable %_ptr_Function_v3float Function %22
+       %x_53 = OpVariable %_ptr_Function_float Function %25
+       %x_57 = OpVariable %_ptr_Function_float Function %25
+       %x_58 = OpVariable %_ptr_Function_float Function %25
+       %x_83 = OpVariable %_ptr_Function_float Function %25
+       %x_84 = OpVariable %_ptr_Function_float Function %25
+      %x_124 = OpVariable %_ptr_Function_float Function %25
+      %x_125 = OpVariable %_ptr_Function_float Function %25
+   %x_57_phi = OpVariable %_ptr_Function_float Function %25
+   %x_60_phi = OpVariable %_ptr_Function_int Function %36
+   %x_83_phi = OpVariable %_ptr_Function_float Function %25
+   %x_84_phi = OpVariable %_ptr_Function_float Function %25
+   %x_85_phi = OpVariable %_ptr_Function_bool Function %42
+   %x_87_phi = OpVariable %_ptr_Function_float Function %25
+  %x_128_phi = OpVariable %_ptr_Function_float Function %25
+  %x_135_phi = OpVariable %_ptr_Function_int Function %36
+       %x_70 = OpVariable %_ptr_Function_float Function %25
+       %x_78 = OpVariable %_ptr_Function_float Function %25
+       %x_61 = OpVariable %_ptr_Function_int Function %36
+   %x_58_phi = OpVariable %_ptr_Function_float Function %25
+       %x_77 = OpVariable %_ptr_Function_float Function %25
+   %x_78_phi = OpVariable %_ptr_Function_float Function %25
+       %x_92 = OpVariable %_ptr_Function_float Function %25
+       %x_98 = OpVariable %_ptr_Function_float Function %25
+       %x_99 = OpVariable %_ptr_Function_float Function %25
+   %x_98_phi = OpVariable %_ptr_Function_float Function %25
+  %x_101_phi = OpVariable %_ptr_Function_int Function %36
+  %x_124_phi = OpVariable %_ptr_Function_float Function %25
+  %x_125_phi = OpVariable %_ptr_Function_float Function %25
+  %x_126_phi = OpVariable %_ptr_Function_bool Function %42
+      %x_111 = OpVariable %_ptr_Function_float Function %25
+      %x_119 = OpVariable %_ptr_Function_float Function %25
+      %x_102 = OpVariable %_ptr_Function_int Function %36
+   %x_99_phi = OpVariable %_ptr_Function_float Function %25
+      %x_118 = OpVariable %_ptr_Function_float Function %25
+  %x_119_phi = OpVariable %_ptr_Function_float Function %25
+      %x_136 = OpVariable %_ptr_Function_int Function %36
+               OpStore %c %49
+         %53 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_0
+         %54 = OpLoad %float %53
+         %56 = OpCompositeConstruct %v2float %float_1 %54
+         %60 = OpFMul %float %54 %float_0_125
+         %57 = OpExtInst %float %58 RoundEven %60
+         %65 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %66 = OpLoad %float %65
+               OpStore %x_53 %66
+               OpSelectionMerge %67 None
+               OpSwitch %uint_0 %68
+         %68 = OpLabel
+               OpStore %x_57_phi %float_n0_5
+               OpStore %x_60_phi %int_1
+               OpBranch %70
+         %70 = OpLabel
+               OpLoopMerge %71 %72 None
+               OpBranch %73
+         %73 = OpLabel
+         %78 = OpLoad %float %x_57_phi
+               OpStore %x_57 %78
+         %79 = OpLoad %int %x_60_phi
+               OpStore %x_83_phi %float_0
+         %80 = OpLoad %float %x_57
+               OpStore %x_84_phi %80
+               OpStore %x_85_phi %false
+         %83 = OpSLessThan %bool %79 %int_800
+               OpSelectionMerge %84 None
+               OpBranchConditional %83 %85 %86
+         %85 = OpLabel
+               OpBranch %84
+         %86 = OpLabel
+               OpBranch %71
+         %84 = OpLabel
+         %90 = OpSMod %int %79 %int_32
+         %92 = OpIEqual %bool %90 %int_0
+               OpSelectionMerge %93 None
+               OpBranchConditional %92 %94 %95
+         %94 = OpLabel
+         %96 = OpLoad %float %x_57
+         %98 = OpFAdd %float %96 %float_0_400000006
+               OpStore %x_70 %98
+         %99 = OpLoad %float %x_70
+               OpStore %x_58_phi %99
+               OpBranch %93
+         %95 = OpLabel
+        %100 = OpLoad %float %x_57
+               OpStore %x_78_phi %100
+        %101 = OpConvertSToF %float %79
+        %102 = OpExtInst %float %58 RoundEven %57
+        %103 = OpFMod %float %101 %102
+        %105 = OpFOrdLessThanEqual %bool %103 %float_0_00999999978
+               OpSelectionMerge %106 None
+               OpBranchConditional %105 %107 %106
+        %107 = OpLabel
+        %108 = OpLoad %float %x_57
+        %110 = OpFAdd %float %108 %float_100
+               OpStore %x_77 %110
+        %111 = OpLoad %float %x_77
+               OpStore %x_78_phi %111
+               OpBranch %106
+        %106 = OpLabel
+        %112 = OpLoad %float %x_78_phi
+               OpStore %x_78 %112
+        %113 = OpLoad %float %x_78
+               OpStore %x_58_phi %113
+               OpBranch %93
+         %93 = OpLabel
+        %114 = OpLoad %float %x_58_phi
+               OpStore %x_58 %114
+        %115 = OpConvertSToF %float %79
+        %116 = OpLoad %float %x_53
+        %117 = OpFOrdGreaterThanEqual %bool %115 %116
+               OpSelectionMerge %118 None
+               OpBranchConditional %117 %119 %118
+        %119 = OpLabel
+        %120 = OpLoad %float %x_58
+               OpStore %x_83_phi %120
+        %121 = OpLoad %float %x_58
+               OpStore %x_84_phi %121
+               OpStore %x_85_phi %true
+               OpBranch %71
+        %118 = OpLabel
+               OpBranch %72
+         %72 = OpLabel
+        %123 = OpIAdd %int %79 %int_1
+               OpStore %x_61 %123
+        %124 = OpLoad %float %x_58
+               OpStore %x_57_phi %124
+        %125 = OpLoad %int %x_61
+               OpStore %x_60_phi %125
+               OpBranch %70
+         %71 = OpLabel
+        %126 = OpLoad %float %x_83_phi
+               OpStore %x_83 %126
+        %127 = OpLoad %float %x_84_phi
+               OpStore %x_84 %127
+        %128 = OpLoad %bool %x_85_phi
+        %129 = OpLoad %float %x_83
+               OpStore %x_87_phi %129
+               OpSelectionMerge %130 None
+               OpBranchConditional %128 %131 %130
+        %131 = OpLabel
+               OpBranch %67
+        %130 = OpLabel
+        %132 = OpLoad %float %x_84
+               OpStore %x_87_phi %132
+               OpBranch %67
+         %67 = OpLabel
+        %141 = OpLoad %float %x_87_phi
+        %142 = OpLoad %float %x_84
+        %143 = OpLoad %float %x_83
+        %144 = OpCompositeConstruct %v4float %142 %float_0_400000006 %143 %float_0_400000006
+        %145 = OpAccessChain %_ptr_Function_float %c %uint_0
+               OpStore %145 %141
+        %147 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %148 = OpLoad %float %147
+               OpStore %x_92 %148
+               OpSelectionMerge %149 None
+               OpSwitch %uint_0 %150
+        %150 = OpLabel
+        %151 = OpCompositeExtract %float %63 0
+        %152 = OpCompositeExtract %float %63 1
+        %153 = OpLoad %float %x_57
+        %154 = OpCompositeConstruct %v4float %151 %152 %float_0 %153
+        %155 = OpCompositeExtract %float %56 0
+        %156 = OpCompositeExtract %float %56 1
+        %157 = OpCompositeConstruct %v3float %155 %156 %float_n0_5
+        %158 = OpCompositeExtract %float %157 2
+               OpStore %x_98_phi %158
+               OpStore %x_101_phi %int_1
+               OpBranch %159
+        %159 = OpLabel
+               OpLoopMerge %160 %161 None
+               OpBranch %162
+        %162 = OpLabel
+        %167 = OpLoad %float %x_98_phi
+               OpStore %x_98 %167
+        %168 = OpLoad %int %x_101_phi
+               OpStore %x_124_phi %float_0
+        %169 = OpLoad %float %x_98
+               OpStore %x_125_phi %169
+               OpStore %x_126_phi %false
+        %170 = OpSLessThan %bool %168 %int_800
+               OpSelectionMerge %171 None
+               OpBranchConditional %170 %172 %173
+        %172 = OpLabel
+               OpBranch %171
+        %173 = OpLabel
+               OpBranch %160
+        %171 = OpLabel
+        %176 = OpSMod %int %168 %int_32
+        %177 = OpIEqual %bool %176 %int_0
+               OpSelectionMerge %178 None
+               OpBranchConditional %177 %179 %180
+        %179 = OpLabel
+        %181 = OpLoad %float %x_98
+        %182 = OpFAdd %float %181 %float_0_400000006
+               OpStore %x_111 %182
+        %183 = OpLoad %float %x_111
+               OpStore %x_99_phi %183
+               OpBranch %178
+        %180 = OpLabel
+        %184 = OpLoad %float %x_98
+               OpStore %x_119_phi %184
+        %185 = OpConvertSToF %float %168
+        %186 = OpExtInst %float %58 RoundEven %57
+        %187 = OpFMod %float %185 %186
+        %188 = OpFOrdLessThanEqual %bool %187 %float_0_00999999978
+               OpSelectionMerge %189 None
+               OpBranchConditional %188 %190 %189
+        %190 = OpLabel
+        %191 = OpLoad %float %x_98
+        %192 = OpFAdd %float %191 %float_100
+               OpStore %x_118 %192
+        %193 = OpLoad %float %x_118
+               OpStore %x_119_phi %193
+               OpBranch %189
+        %189 = OpLabel
+        %194 = OpLoad %float %x_119_phi
+               OpStore %x_119 %194
+        %195 = OpLoad %float %x_119
+               OpStore %x_99_phi %195
+               OpBranch %178
+        %178 = OpLabel
+        %196 = OpLoad %float %x_99_phi
+               OpStore %x_99 %196
+        %197 = OpConvertSToF %float %168
+        %198 = OpLoad %float %x_92
+        %199 = OpFOrdGreaterThanEqual %bool %197 %198
+               OpSelectionMerge %200 None
+               OpBranchConditional %199 %201 %200
+        %201 = OpLabel
+        %202 = OpLoad %float %x_99
+               OpStore %x_124_phi %202
+        %203 = OpLoad %float %x_99
+               OpStore %x_125_phi %203
+               OpStore %x_126_phi %true
+               OpBranch %160
+        %200 = OpLabel
+               OpBranch %161
+        %161 = OpLabel
+        %204 = OpIAdd %int %168 %int_1
+               OpStore %x_102 %204
+        %205 = OpLoad %float %x_99
+               OpStore %x_98_phi %205
+        %206 = OpLoad %int %x_102
+               OpStore %x_101_phi %206
+               OpBranch %159
+        %160 = OpLabel
+        %207 = OpLoad %float %x_124_phi
+               OpStore %x_124 %207
+        %208 = OpLoad %float %x_125_phi
+               OpStore %x_125 %208
+        %209 = OpLoad %bool %x_126_phi
+        %210 = OpLoad %float %x_124
+               OpStore %x_128_phi %210
+               OpSelectionMerge %211 None
+               OpBranchConditional %209 %212 %211
+        %212 = OpLabel
+               OpBranch %149
+        %211 = OpLabel
+        %213 = OpLoad %float %x_125
+               OpStore %x_128_phi %213
+               OpBranch %149
+        %149 = OpLabel
+        %214 = OpLoad %float %x_128_phi
+        %215 = OpAccessChain %_ptr_Function_float %c %uint_1
+               OpStore %215 %214
+        %216 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %217 = OpLoad %float %216
+        %218 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %219 = OpLoad %float %218
+        %221 = OpAccessChain %_ptr_Function_float %c %uint_2
+        %222 = OpFAdd %float %217 %219
+               OpStore %221 %222
+               OpStore %x_135_phi %int_0
+               OpBranch %223
+        %223 = OpLabel
+               OpLoopMerge %224 %225 None
+               OpBranch %226
+        %226 = OpLabel
+        %228 = OpLoad %int %x_135_phi
+        %230 = OpSLessThan %bool %228 %int_3
+               OpSelectionMerge %231 None
+               OpBranchConditional %230 %232 %233
+        %232 = OpLabel
+               OpBranch %231
+        %233 = OpLabel
+               OpBranch %224
+        %231 = OpLabel
+        %234 = OpAccessChain %_ptr_Function_float %c %228
+        %235 = OpLoad %float %234
+        %236 = OpFOrdGreaterThanEqual %bool %235 %float_1
+               OpSelectionMerge %237 None
+               OpBranchConditional %236 %238 %237
+        %238 = OpLabel
+        %239 = OpAccessChain %_ptr_Function_float %c %228
+        %240 = OpLoad %float %239
+        %241 = OpAccessChain %_ptr_Function_float %c %228
+        %242 = OpLoad %float %241
+        %243 = OpAccessChain %_ptr_Function_float %c %228
+        %244 = OpFMul %float %240 %242
+               OpStore %243 %244
+               OpBranch %237
+        %237 = OpLabel
+               OpBranch %225
+        %225 = OpLabel
+        %245 = OpIAdd %int %228 %int_1
+               OpStore %x_136 %245
+        %246 = OpLoad %int %x_136
+               OpStore %x_135_phi %246
+               OpBranch %223
+        %224 = OpLabel
+        %247 = OpLoad %v3float %c
+        %249 = OpExtInst %v3float %58 FAbs %247
+        %248 = OpExtInst %v3float %58 Normalize %249
+        %250 = OpCompositeExtract %float %248 0
+        %251 = OpCompositeExtract %float %248 1
+        %252 = OpCompositeExtract %float %248 2
+        %253 = OpCompositeConstruct %v4float %250 %251 %252 %float_1
+               OpStore %x_GLF_color %253
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %254
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %258 = OpLabel
+        %259 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %259
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %261 = OpLabel
+        %262 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %262
+        %263 = OpFunctionCall %void %main_1
+        %265 = OpLoad %v4float %x_GLF_color
+        %266 = OpCompositeConstruct %main_out %265
+        %264 = OpFunctionCall %void %tint_symbol_3 %266
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..c2ad2e8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite-phi/1.wgsl.expected.wgsl
@@ -0,0 +1,205 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var c : vec3<f32>;
+  var x_53 : f32;
+  var x_57 : f32;
+  var x_58 : f32;
+  var x_83 : f32;
+  var x_84 : f32;
+  var x_124 : f32;
+  var x_125 : f32;
+  var x_57_phi : f32;
+  var x_60_phi : i32;
+  var x_83_phi : f32;
+  var x_84_phi : f32;
+  var x_85_phi : bool;
+  var x_87_phi : f32;
+  var x_128_phi : f32;
+  var x_135_phi : i32;
+  c = vec3<f32>(7.0, 8.0, 9.0);
+  let x_47 : f32 = x_7.resolution.x;
+  let x_48 : vec2<f32> = vec2<f32>(1.0, x_47);
+  let x_50 : f32 = round((x_47 * 0.125));
+  let x_51 : vec2<f32> = vec2<f32>(0.0, -0.5);
+  x_53 = gl_FragCoord.x;
+  switch(0u) {
+    default: {
+      x_57_phi = -0.5;
+      x_60_phi = 1;
+      loop {
+        var x_70 : f32;
+        var x_78 : f32;
+        var x_61 : i32;
+        var x_58_phi : f32;
+        x_57 = x_57_phi;
+        let x_60 : i32 = x_60_phi;
+        x_83_phi = 0.0;
+        x_84_phi = x_57;
+        x_85_phi = false;
+        if ((x_60 < 800)) {
+        } else {
+          break;
+        }
+        var x_77 : f32;
+        var x_78_phi : f32;
+        if (((x_60 % 32) == 0)) {
+          x_70 = (x_57 + 0.400000006);
+          x_58_phi = x_70;
+        } else {
+          x_78_phi = x_57;
+          if (((f32(x_60) % round(x_50)) <= 0.01)) {
+            x_77 = (x_57 + 100.0);
+            x_78_phi = x_77;
+          }
+          x_78 = x_78_phi;
+          x_58_phi = x_78;
+        }
+        x_58 = x_58_phi;
+        if ((f32(x_60) >= x_53)) {
+          x_83_phi = x_58;
+          x_84_phi = x_58;
+          x_85_phi = true;
+          break;
+        }
+
+        continuing {
+          x_61 = (x_60 + 1);
+          x_57_phi = x_58;
+          x_60_phi = x_61;
+        }
+      }
+      x_83 = x_83_phi;
+      x_84 = x_84_phi;
+      let x_85 : bool = x_85_phi;
+      x_87_phi = x_83;
+      if (x_85) {
+        break;
+      }
+      x_87_phi = x_84;
+    }
+  }
+  var x_92 : f32;
+  var x_98 : f32;
+  var x_99 : f32;
+  var x_98_phi : f32;
+  var x_101_phi : i32;
+  var x_124_phi : f32;
+  var x_125_phi : f32;
+  var x_126_phi : bool;
+  let x_87 : f32 = x_87_phi;
+  let x_88 : ptr<function, f32> = &(c.x);
+  let x_89 : vec4<f32> = vec4<f32>(x_84, 0.400000006, x_83, 0.400000006);
+  *(x_88) = x_87;
+  x_92 = gl_FragCoord.y;
+  switch(0u) {
+    default: {
+      let x_95 : vec4<f32> = vec4<f32>(x_51, 0.0, x_57);
+      let x_96 : f32 = vec3<f32>(x_48, -0.5).z;
+      x_98_phi = x_96;
+      x_101_phi = 1;
+      loop {
+        var x_111 : f32;
+        var x_119 : f32;
+        var x_102 : i32;
+        var x_99_phi : f32;
+        x_98 = x_98_phi;
+        let x_101 : i32 = x_101_phi;
+        x_124_phi = 0.0;
+        x_125_phi = x_98;
+        x_126_phi = false;
+        if ((x_101 < 800)) {
+        } else {
+          break;
+        }
+        var x_118 : f32;
+        var x_119_phi : f32;
+        if (((x_101 % 32) == 0)) {
+          x_111 = (x_98 + 0.400000006);
+          x_99_phi = x_111;
+        } else {
+          x_119_phi = x_98;
+          if (((f32(x_101) % round(x_50)) <= 0.01)) {
+            x_118 = (x_98 + 100.0);
+            x_119_phi = x_118;
+          }
+          x_119 = x_119_phi;
+          x_99_phi = x_119;
+        }
+        x_99 = x_99_phi;
+        if ((f32(x_101) >= x_92)) {
+          x_124_phi = x_99;
+          x_125_phi = x_99;
+          x_126_phi = true;
+          break;
+        }
+
+        continuing {
+          x_102 = (x_101 + 1);
+          x_98_phi = x_99;
+          x_101_phi = x_102;
+        }
+      }
+      x_124 = x_124_phi;
+      x_125 = x_125_phi;
+      let x_126 : bool = x_126_phi;
+      x_128_phi = x_124;
+      if (x_126) {
+        break;
+      }
+      x_128_phi = x_125;
+    }
+  }
+  let x_128 : f32 = x_128_phi;
+  let x_129 : ptr<function, f32> = &(c.y);
+  *(x_129) = x_128;
+  let x_130 : f32 = *(x_88);
+  let x_131 : f32 = *(x_129);
+  c.z = (x_130 + x_131);
+  x_135_phi = 0;
+  loop {
+    var x_136 : i32;
+    let x_135 : i32 = x_135_phi;
+    if ((x_135 < 3)) {
+    } else {
+      break;
+    }
+    let x_141 : ptr<function, f32> = &(c[x_135]);
+    let x_142 : f32 = *(x_141);
+    if ((x_142 >= 1.0)) {
+      let x_146 : f32 = *(x_141);
+      let x_147 : f32 = *(x_141);
+      *(x_141) = (x_146 * x_147);
+    }
+
+    continuing {
+      x_136 = (x_135 + 1);
+      x_135_phi = x_136;
+    }
+  }
+  let x_149 : vec3<f32> = c;
+  let x_151 : vec3<f32> = normalize(abs(x_149));
+  x_GLF_color = vec4<f32>(x_151.x, x_151.y, x_151.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite2/0.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-composite2/0.spvasm
new file mode 100644
index 0000000..a12759d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite2/0.spvasm
@@ -0,0 +1,104 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpName %indexable "indexable"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+       %uint = OpTypeInt 32 0
+   %float_10 = OpConstant %float 10
+     %int_10 = OpConstant %int 10
+    %int_100 = OpConstant %int 100
+       %bool = OpTypeBool
+      %int_4 = OpConstant %int 4
+   %int_1000 = OpConstant %int 1000
+      %int_1 = OpConstant %int 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %31 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+  %float_0_5 = OpConstant %float 0.5
+         %33 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+         %34 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+         %35 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+         %36 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+         %37 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+         %38 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+         %39 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+         %40 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %41 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+         %42 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+         %43 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+         %44 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+         %45 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+         %46 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+         %47 = OpConstantComposite %_arr_v4float_uint_16 %31 %33 %34 %35 %36 %37 %38 %39 %31 %40 %41 %42 %43 %44 %45 %46
+     %int_16 = OpConstant %int 16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %main = OpFunction %void None %9
+         %51 = OpLabel
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_16 Function
+         %52 = OpLoad %v4float %gl_FragCoord
+         %53 = OpVectorShuffle %v2float %52 %52 0 1
+         %54 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+         %55 = OpLoad %v2float %54
+         %56 = OpFDiv %v2float %53 %55
+         %57 = OpCompositeExtract %float %56 0
+         %58 = OpFMul %float %57 %float_10
+         %59 = OpConvertFToS %int %58
+         %60 = OpCompositeExtract %float %56 1
+         %61 = OpFMul %float %60 %float_10
+         %62 = OpConvertFToS %int %61
+         %63 = OpIMul %int %62 %int_10
+         %64 = OpIAdd %int %59 %63
+               OpBranch %65
+         %65 = OpLabel
+         %66 = OpPhi %int %int_100 %51 %67 %68
+         %69 = OpPhi %int %int_0 %51 %70 %68
+         %71 = OpSLessThan %bool %69 %64
+               OpLoopMerge %72 %68 None
+               OpBranchConditional %71 %68 %72
+         %68 = OpLabel
+         %73 = OpIMul %int %int_4 %66
+         %74 = OpISub %int %int_1000 %66
+         %75 = OpIMul %int %73 %74
+         %67 = OpSDiv %int %75 %int_1000
+         %70 = OpIAdd %int %69 %int_1
+               OpBranch %65
+         %72 = OpLabel
+         %76 = OpSMod %int %66 %int_16
+               OpStore %indexable %47
+         %77 = OpAccessChain %_ptr_Function_v4float %indexable %76
+         %78 = OpLoad %v4float %77
+               OpStore %_GLF_color %78
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite2/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-composite2/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..14cc0b5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite2/0.spvasm.expected.hlsl
@@ -0,0 +1,58 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 indexable[16] = (float4[16])0;
+  int x_66 = 0;
+  int x_66_phi = 0;
+  int x_69_phi = 0;
+  const float4 x_52 = gl_FragCoord;
+  const float2 x_55 = asfloat(x_6[0].xy);
+  const float2 x_56 = (float2(x_52.x, x_52.y) / x_55);
+  const int x_64 = (int((x_56.x * 10.0f)) + (int((x_56.y * 10.0f)) * 10));
+  x_66_phi = 100;
+  x_69_phi = 0;
+  while (true) {
+    int x_67 = 0;
+    int x_70 = 0;
+    x_66 = x_66_phi;
+    const int x_69 = x_69_phi;
+    if ((x_69 < x_64)) {
+    } else {
+      break;
+    }
+    {
+      x_67 = (((4 * asint(x_66)) * (1000 - asint(x_66))) / 1000);
+      x_70 = (x_69 + 1);
+      x_66_phi = x_67;
+      x_69_phi = x_70;
+    }
+  }
+  const float4 tint_symbol_5[16] = {float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)};
+  indexable = tint_symbol_5;
+  const float4 x_78 = indexable[asint((x_66 % 16))];
+  x_GLF_color = x_78;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite2/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-composite2/0.spvasm.expected.msl
new file mode 100644
index 0000000..f5bbeb8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite2/0.spvasm.expected.msl
@@ -0,0 +1,60 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  float4 arr[16];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  tint_array_wrapper indexable = {};
+  int x_66 = 0;
+  int x_66_phi = 0;
+  int x_69_phi = 0;
+  float4 const x_52 = *(tint_symbol_6);
+  float2 const x_55 = x_6.resolution;
+  float2 const x_56 = (float2(x_52.x, x_52.y) / x_55);
+  int const x_64 = (int((x_56.x * 10.0f)) + (int((x_56.y * 10.0f)) * 10));
+  x_66_phi = 100;
+  x_69_phi = 0;
+  while (true) {
+    int x_67 = 0;
+    int x_70 = 0;
+    x_66 = x_66_phi;
+    int const x_69 = x_69_phi;
+    if ((x_69 < x_64)) {
+    } else {
+      break;
+    }
+    {
+      x_67 = (((4 * as_type<int>(x_66)) * (1000 - as_type<int>(x_66))) / 1000);
+      x_70 = (x_69 + 1);
+      x_66_phi = x_67;
+      x_69_phi = x_70;
+    }
+  }
+  tint_array_wrapper const tint_symbol_4 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
+  indexable = tint_symbol_4;
+  float4 const x_78 = indexable.arr[as_type<int>((x_66 % 16))];
+  *(tint_symbol_7) = x_78;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite2/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-composite2/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..feaee7c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite2/0.spvasm.expected.spvasm
@@ -0,0 +1,180 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 118
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %indexable "indexable"
+               OpName %x_66 "x_66"
+               OpName %x_66_phi "x_66_phi"
+               OpName %x_69_phi "x_69_phi"
+               OpName %x_67 "x_67"
+               OpName %x_70 "x_70"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v4float_uint_16 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+         %24 = OpConstantNull %_arr_v4float_uint_16
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %28 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+   %float_10 = OpConstant %float 10
+     %int_10 = OpConstant %int 10
+    %int_100 = OpConstant %int 100
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_4 = OpConstant %int 4
+   %int_1000 = OpConstant %int 1000
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %81 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+  %float_0_5 = OpConstant %float 0.5
+         %83 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+         %84 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+         %85 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+         %86 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+         %87 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+         %88 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+         %89 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+         %90 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %91 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+         %92 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+         %93 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+         %94 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+         %95 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+         %96 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+         %97 = OpConstantComposite %_arr_v4float_uint_16 %81 %83 %84 %85 %86 %87 %88 %89 %81 %90 %91 %92 %93 %94 %95 %96
+     %int_16 = OpConstant %int 16
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+   %main_out = OpTypeStruct %v4float
+        %105 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_16 Function %24
+       %x_66 = OpVariable %_ptr_Function_int Function %28
+   %x_66_phi = OpVariable %_ptr_Function_int Function %28
+   %x_69_phi = OpVariable %_ptr_Function_int Function %28
+       %x_67 = OpVariable %_ptr_Function_int Function %28
+       %x_70 = OpVariable %_ptr_Function_int Function %28
+         %31 = OpLoad %v4float %gl_FragCoord
+         %34 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %35 = OpLoad %v2float %34
+         %36 = OpCompositeExtract %float %31 0
+         %37 = OpCompositeExtract %float %31 1
+         %38 = OpCompositeConstruct %v2float %36 %37
+         %39 = OpFDiv %v2float %38 %35
+         %41 = OpCompositeExtract %float %39 0
+         %43 = OpFMul %float %41 %float_10
+         %40 = OpConvertFToS %int %43
+         %45 = OpCompositeExtract %float %39 1
+         %46 = OpFMul %float %45 %float_10
+         %44 = OpConvertFToS %int %46
+         %48 = OpIMul %int %44 %int_10
+         %49 = OpIAdd %int %40 %48
+               OpStore %x_66_phi %int_100
+               OpStore %x_69_phi %int_0
+               OpBranch %52
+         %52 = OpLabel
+               OpLoopMerge %53 %54 None
+               OpBranch %55
+         %55 = OpLabel
+         %58 = OpLoad %int %x_66_phi
+               OpStore %x_66 %58
+         %59 = OpLoad %int %x_69_phi
+         %60 = OpSLessThan %bool %59 %49
+               OpSelectionMerge %62 None
+               OpBranchConditional %60 %63 %64
+         %63 = OpLabel
+               OpBranch %62
+         %64 = OpLabel
+               OpBranch %53
+         %62 = OpLabel
+               OpBranch %54
+         %54 = OpLabel
+         %67 = OpLoad %int %x_66
+         %66 = OpCopyObject %int %67
+         %68 = OpIMul %int %int_4 %66
+         %71 = OpLoad %int %x_66
+         %70 = OpCopyObject %int %71
+         %72 = OpISub %int %int_1000 %70
+         %73 = OpIMul %int %68 %72
+         %74 = OpSDiv %int %73 %int_1000
+               OpStore %x_67 %74
+         %76 = OpIAdd %int %59 %int_1
+               OpStore %x_70 %76
+         %77 = OpLoad %int %x_67
+               OpStore %x_66_phi %77
+         %78 = OpLoad %int %x_70
+               OpStore %x_69_phi %78
+               OpBranch %52
+         %53 = OpLabel
+               OpStore %indexable %97
+         %99 = OpLoad %int %x_66
+        %101 = OpSMod %int %99 %int_16
+         %98 = OpCopyObject %int %101
+        %103 = OpAccessChain %_ptr_Function_v4float %indexable %98
+        %104 = OpLoad %v4float %103
+               OpStore %x_GLF_color %104
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %105
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %109 = OpLabel
+        %110 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %110
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %112 = OpLabel
+        %113 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %113
+        %114 = OpFunctionCall %void %main_1
+        %116 = OpLoad %v4float %x_GLF_color
+        %117 = OpCompositeConstruct %main_out %116
+        %115 = OpFunctionCall %void %tint_symbol_3 %117
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite2/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-composite2/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..8d0080b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite2/0.spvasm.expected.wgsl
@@ -0,0 +1,56 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var indexable : array<vec4<f32>, 16>;
+  var x_66 : i32;
+  var x_66_phi : i32;
+  var x_69_phi : i32;
+  let x_52 : vec4<f32> = gl_FragCoord;
+  let x_55 : vec2<f32> = x_6.resolution;
+  let x_56 : vec2<f32> = (vec2<f32>(x_52.x, x_52.y) / x_55);
+  let x_64 : i32 = (i32((x_56.x * 10.0)) + (i32((x_56.y * 10.0)) * 10));
+  x_66_phi = 100;
+  x_69_phi = 0;
+  loop {
+    var x_67 : i32;
+    var x_70 : i32;
+    x_66 = x_66_phi;
+    let x_69 : i32 = x_69_phi;
+    if ((x_69 < x_64)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_67 = (((4 * bitcast<i32>(x_66)) * (1000 - bitcast<i32>(x_66))) / 1000);
+      x_70 = (x_69 + 1);
+      x_66_phi = x_67;
+      x_69_phi = x_70;
+    }
+  }
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+  let x_78 : vec4<f32> = indexable[bitcast<i32>((x_66 % 16))];
+  x_GLF_color = x_78;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite2/0.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-composite2/0.wgsl
new file mode 100644
index 0000000..8d0080b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite2/0.wgsl
@@ -0,0 +1,56 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var indexable : array<vec4<f32>, 16>;
+  var x_66 : i32;
+  var x_66_phi : i32;
+  var x_69_phi : i32;
+  let x_52 : vec4<f32> = gl_FragCoord;
+  let x_55 : vec2<f32> = x_6.resolution;
+  let x_56 : vec2<f32> = (vec2<f32>(x_52.x, x_52.y) / x_55);
+  let x_64 : i32 = (i32((x_56.x * 10.0)) + (i32((x_56.y * 10.0)) * 10));
+  x_66_phi = 100;
+  x_69_phi = 0;
+  loop {
+    var x_67 : i32;
+    var x_70 : i32;
+    x_66 = x_66_phi;
+    let x_69 : i32 = x_69_phi;
+    if ((x_69 < x_64)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_67 = (((4 * bitcast<i32>(x_66)) * (1000 - bitcast<i32>(x_66))) / 1000);
+      x_70 = (x_69 + 1);
+      x_66_phi = x_67;
+      x_69_phi = x_70;
+    }
+  }
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+  let x_78 : vec4<f32> = indexable[bitcast<i32>((x_66 % 16))];
+  x_GLF_color = x_78;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite2/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-composite2/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..14cc0b5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite2/0.wgsl.expected.hlsl
@@ -0,0 +1,58 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 indexable[16] = (float4[16])0;
+  int x_66 = 0;
+  int x_66_phi = 0;
+  int x_69_phi = 0;
+  const float4 x_52 = gl_FragCoord;
+  const float2 x_55 = asfloat(x_6[0].xy);
+  const float2 x_56 = (float2(x_52.x, x_52.y) / x_55);
+  const int x_64 = (int((x_56.x * 10.0f)) + (int((x_56.y * 10.0f)) * 10));
+  x_66_phi = 100;
+  x_69_phi = 0;
+  while (true) {
+    int x_67 = 0;
+    int x_70 = 0;
+    x_66 = x_66_phi;
+    const int x_69 = x_69_phi;
+    if ((x_69 < x_64)) {
+    } else {
+      break;
+    }
+    {
+      x_67 = (((4 * asint(x_66)) * (1000 - asint(x_66))) / 1000);
+      x_70 = (x_69 + 1);
+      x_66_phi = x_67;
+      x_69_phi = x_70;
+    }
+  }
+  const float4 tint_symbol_5[16] = {float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)};
+  indexable = tint_symbol_5;
+  const float4 x_78 = indexable[asint((x_66 % 16))];
+  x_GLF_color = x_78;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite2/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-composite2/0.wgsl.expected.msl
new file mode 100644
index 0000000..f5bbeb8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite2/0.wgsl.expected.msl
@@ -0,0 +1,60 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  float4 arr[16];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  tint_array_wrapper indexable = {};
+  int x_66 = 0;
+  int x_66_phi = 0;
+  int x_69_phi = 0;
+  float4 const x_52 = *(tint_symbol_6);
+  float2 const x_55 = x_6.resolution;
+  float2 const x_56 = (float2(x_52.x, x_52.y) / x_55);
+  int const x_64 = (int((x_56.x * 10.0f)) + (int((x_56.y * 10.0f)) * 10));
+  x_66_phi = 100;
+  x_69_phi = 0;
+  while (true) {
+    int x_67 = 0;
+    int x_70 = 0;
+    x_66 = x_66_phi;
+    int const x_69 = x_69_phi;
+    if ((x_69 < x_64)) {
+    } else {
+      break;
+    }
+    {
+      x_67 = (((4 * as_type<int>(x_66)) * (1000 - as_type<int>(x_66))) / 1000);
+      x_70 = (x_69 + 1);
+      x_66_phi = x_67;
+      x_69_phi = x_70;
+    }
+  }
+  tint_array_wrapper const tint_symbol_4 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
+  indexable = tint_symbol_4;
+  float4 const x_78 = indexable.arr[as_type<int>((x_66 % 16))];
+  *(tint_symbol_7) = x_78;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite2/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-composite2/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..feaee7c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite2/0.wgsl.expected.spvasm
@@ -0,0 +1,180 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 118
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %indexable "indexable"
+               OpName %x_66 "x_66"
+               OpName %x_66_phi "x_66_phi"
+               OpName %x_69_phi "x_69_phi"
+               OpName %x_67 "x_67"
+               OpName %x_70 "x_70"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v4float_uint_16 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+         %24 = OpConstantNull %_arr_v4float_uint_16
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %28 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+   %float_10 = OpConstant %float 10
+     %int_10 = OpConstant %int 10
+    %int_100 = OpConstant %int 100
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_4 = OpConstant %int 4
+   %int_1000 = OpConstant %int 1000
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %81 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+  %float_0_5 = OpConstant %float 0.5
+         %83 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+         %84 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+         %85 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+         %86 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+         %87 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+         %88 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+         %89 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+         %90 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %91 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+         %92 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+         %93 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+         %94 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+         %95 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+         %96 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+         %97 = OpConstantComposite %_arr_v4float_uint_16 %81 %83 %84 %85 %86 %87 %88 %89 %81 %90 %91 %92 %93 %94 %95 %96
+     %int_16 = OpConstant %int 16
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+   %main_out = OpTypeStruct %v4float
+        %105 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_16 Function %24
+       %x_66 = OpVariable %_ptr_Function_int Function %28
+   %x_66_phi = OpVariable %_ptr_Function_int Function %28
+   %x_69_phi = OpVariable %_ptr_Function_int Function %28
+       %x_67 = OpVariable %_ptr_Function_int Function %28
+       %x_70 = OpVariable %_ptr_Function_int Function %28
+         %31 = OpLoad %v4float %gl_FragCoord
+         %34 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %35 = OpLoad %v2float %34
+         %36 = OpCompositeExtract %float %31 0
+         %37 = OpCompositeExtract %float %31 1
+         %38 = OpCompositeConstruct %v2float %36 %37
+         %39 = OpFDiv %v2float %38 %35
+         %41 = OpCompositeExtract %float %39 0
+         %43 = OpFMul %float %41 %float_10
+         %40 = OpConvertFToS %int %43
+         %45 = OpCompositeExtract %float %39 1
+         %46 = OpFMul %float %45 %float_10
+         %44 = OpConvertFToS %int %46
+         %48 = OpIMul %int %44 %int_10
+         %49 = OpIAdd %int %40 %48
+               OpStore %x_66_phi %int_100
+               OpStore %x_69_phi %int_0
+               OpBranch %52
+         %52 = OpLabel
+               OpLoopMerge %53 %54 None
+               OpBranch %55
+         %55 = OpLabel
+         %58 = OpLoad %int %x_66_phi
+               OpStore %x_66 %58
+         %59 = OpLoad %int %x_69_phi
+         %60 = OpSLessThan %bool %59 %49
+               OpSelectionMerge %62 None
+               OpBranchConditional %60 %63 %64
+         %63 = OpLabel
+               OpBranch %62
+         %64 = OpLabel
+               OpBranch %53
+         %62 = OpLabel
+               OpBranch %54
+         %54 = OpLabel
+         %67 = OpLoad %int %x_66
+         %66 = OpCopyObject %int %67
+         %68 = OpIMul %int %int_4 %66
+         %71 = OpLoad %int %x_66
+         %70 = OpCopyObject %int %71
+         %72 = OpISub %int %int_1000 %70
+         %73 = OpIMul %int %68 %72
+         %74 = OpSDiv %int %73 %int_1000
+               OpStore %x_67 %74
+         %76 = OpIAdd %int %59 %int_1
+               OpStore %x_70 %76
+         %77 = OpLoad %int %x_67
+               OpStore %x_66_phi %77
+         %78 = OpLoad %int %x_70
+               OpStore %x_69_phi %78
+               OpBranch %52
+         %53 = OpLabel
+               OpStore %indexable %97
+         %99 = OpLoad %int %x_66
+        %101 = OpSMod %int %99 %int_16
+         %98 = OpCopyObject %int %101
+        %103 = OpAccessChain %_ptr_Function_v4float %indexable %98
+        %104 = OpLoad %v4float %103
+               OpStore %x_GLF_color %104
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %105
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %109 = OpLabel
+        %110 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %110
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %112 = OpLabel
+        %113 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %113
+        %114 = OpFunctionCall %void %main_1
+        %116 = OpLoad %v4float %x_GLF_color
+        %117 = OpCompositeConstruct %main_out %116
+        %115 = OpFunctionCall %void %tint_symbol_3 %117
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite2/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-composite2/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..8d0080b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite2/0.wgsl.expected.wgsl
@@ -0,0 +1,56 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var indexable : array<vec4<f32>, 16>;
+  var x_66 : i32;
+  var x_66_phi : i32;
+  var x_69_phi : i32;
+  let x_52 : vec4<f32> = gl_FragCoord;
+  let x_55 : vec2<f32> = x_6.resolution;
+  let x_56 : vec2<f32> = (vec2<f32>(x_52.x, x_52.y) / x_55);
+  let x_64 : i32 = (i32((x_56.x * 10.0)) + (i32((x_56.y * 10.0)) * 10));
+  x_66_phi = 100;
+  x_69_phi = 0;
+  loop {
+    var x_67 : i32;
+    var x_70 : i32;
+    x_66 = x_66_phi;
+    let x_69 : i32 = x_69_phi;
+    if ((x_69 < x_64)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_67 = (((4 * bitcast<i32>(x_66)) * (1000 - bitcast<i32>(x_66))) / 1000);
+      x_70 = (x_69 + 1);
+      x_66_phi = x_67;
+      x_69_phi = x_70;
+    }
+  }
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+  let x_78 : vec4<f32> = indexable[bitcast<i32>((x_66 % 16))];
+  x_GLF_color = x_78;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite2/1.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-composite2/1.spvasm
new file mode 100644
index 0000000..1f2cac9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite2/1.spvasm
@@ -0,0 +1,110 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpName %indexable "indexable"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+       %uint = OpTypeInt 32 0
+   %float_10 = OpConstant %float 10
+     %int_10 = OpConstant %int 10
+    %int_100 = OpConstant %int 100
+       %bool = OpTypeBool
+      %int_4 = OpConstant %int 4
+   %int_1000 = OpConstant %int 1000
+      %int_1 = OpConstant %int 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %31 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+  %float_0_5 = OpConstant %float 0.5
+         %33 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+         %34 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+         %35 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+         %36 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+         %37 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+         %38 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+         %39 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+         %40 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %41 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+         %42 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+         %43 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+         %44 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+         %45 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+         %46 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+         %47 = OpConstantComposite %_arr_v4float_uint_16 %31 %33 %34 %35 %36 %37 %38 %39 %31 %40 %41 %42 %43 %44 %45 %46
+     %int_16 = OpConstant %int 16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+         %51 = OpConstantComposite %v2float %float_0 %float_0
+%float_0_5_0 = OpConstant %float 0.5
+       %main = OpFunction %void None %9
+         %53 = OpLabel
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_16 Function
+         %54 = OpLoad %v4float %gl_FragCoord
+         %55 = OpVectorShuffle %v2float %54 %54 0 1
+         %56 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+         %57 = OpCompositeConstruct %v4float %float_0 %55 %float_0_5_0
+         %58 = OpLoad %v2float %56
+         %59 = OpFDiv %v2float %55 %58
+         %60 = OpCompositeExtract %float %59 0
+         %61 = OpCompositeExtract %float %57 3
+         %62 = OpCompositeConstruct %v4float %61 %float_10 %51
+         %63 = OpCompositeExtract %float %62 1
+         %64 = OpFMul %float %60 %63
+         %65 = OpConvertFToS %int %64
+         %66 = OpCompositeExtract %float %59 1
+         %67 = OpFMul %float %66 %float_10
+         %68 = OpConvertFToS %int %67
+         %69 = OpIMul %int %68 %int_10
+         %70 = OpIAdd %int %65 %69
+               OpBranch %71
+         %71 = OpLabel
+         %72 = OpPhi %int %int_100 %53 %73 %74
+         %75 = OpPhi %int %int_0 %53 %76 %74
+         %77 = OpSLessThan %bool %75 %70
+               OpLoopMerge %78 %74 None
+               OpBranchConditional %77 %74 %78
+         %74 = OpLabel
+         %79 = OpIMul %int %int_4 %72
+         %80 = OpISub %int %int_1000 %72
+         %81 = OpIMul %int %79 %80
+         %73 = OpSDiv %int %81 %int_1000
+         %76 = OpIAdd %int %75 %int_1
+               OpBranch %71
+         %78 = OpLabel
+         %82 = OpSMod %int %72 %int_16
+               OpStore %indexable %47
+         %83 = OpAccessChain %_ptr_Function_v4float %indexable %82
+         %84 = OpLoad %v4float %83
+               OpStore %_GLF_color %84
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite2/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-composite2/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..ca60803
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite2/1.spvasm.expected.hlsl
@@ -0,0 +1,59 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 indexable[16] = (float4[16])0;
+  int x_72 = 0;
+  int x_72_phi = 0;
+  int x_75_phi = 0;
+  const float4 x_54 = gl_FragCoord;
+  const float2 x_55 = float2(x_54.x, x_54.y);
+  const float2 x_58 = asfloat(x_6[0].xy);
+  const float2 x_59 = (x_55 / x_58);
+  const int x_70 = (int((x_59.x * float4(float4(0.0f, x_55, 0.5f).w, 10.0f, float2(0.0f, 0.0f)).y)) + (int((x_59.y * 10.0f)) * 10));
+  x_72_phi = 100;
+  x_75_phi = 0;
+  while (true) {
+    int x_73 = 0;
+    int x_76 = 0;
+    x_72 = x_72_phi;
+    const int x_75 = x_75_phi;
+    if ((x_75 < x_70)) {
+    } else {
+      break;
+    }
+    {
+      x_73 = (((4 * asint(x_72)) * (1000 - asint(x_72))) / 1000);
+      x_76 = (x_75 + 1);
+      x_72_phi = x_73;
+      x_75_phi = x_76;
+    }
+  }
+  const float4 tint_symbol_5[16] = {float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)};
+  indexable = tint_symbol_5;
+  const float4 x_84 = indexable[asint((x_72 % 16))];
+  x_GLF_color = x_84;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite2/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-composite2/1.spvasm.expected.msl
new file mode 100644
index 0000000..7c00279
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite2/1.spvasm.expected.msl
@@ -0,0 +1,61 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  float4 arr[16];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  tint_array_wrapper indexable = {};
+  int x_72 = 0;
+  int x_72_phi = 0;
+  int x_75_phi = 0;
+  float4 const x_54 = *(tint_symbol_6);
+  float2 const x_55 = float2(x_54.x, x_54.y);
+  float2 const x_58 = x_6.resolution;
+  float2 const x_59 = (x_55 / x_58);
+  int const x_70 = (int((x_59.x * float4(float4(0.0f, x_55, 0.5f).w, 10.0f, float2(0.0f, 0.0f)).y)) + (int((x_59.y * 10.0f)) * 10));
+  x_72_phi = 100;
+  x_75_phi = 0;
+  while (true) {
+    int x_73 = 0;
+    int x_76 = 0;
+    x_72 = x_72_phi;
+    int const x_75 = x_75_phi;
+    if ((x_75 < x_70)) {
+    } else {
+      break;
+    }
+    {
+      x_73 = (((4 * as_type<int>(x_72)) * (1000 - as_type<int>(x_72))) / 1000);
+      x_76 = (x_75 + 1);
+      x_72_phi = x_73;
+      x_75_phi = x_76;
+    }
+  }
+  tint_array_wrapper const tint_symbol_4 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
+  indexable = tint_symbol_4;
+  float4 const x_84 = indexable.arr[as_type<int>((x_72 % 16))];
+  *(tint_symbol_7) = x_84;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite2/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-composite2/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..f9920e1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite2/1.spvasm.expected.spvasm
@@ -0,0 +1,189 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 127
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %indexable "indexable"
+               OpName %x_72 "x_72"
+               OpName %x_72_phi "x_72_phi"
+               OpName %x_75_phi "x_75_phi"
+               OpName %x_73 "x_73"
+               OpName %x_76 "x_76"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v4float_uint_16 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+         %24 = OpConstantNull %_arr_v4float_uint_16
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %28 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_0 = OpConstant %float 0
+  %float_0_5 = OpConstant %float 0.5
+   %float_10 = OpConstant %float 10
+         %49 = OpConstantComposite %v2float %float_0 %float_0
+     %int_10 = OpConstant %int 10
+    %int_100 = OpConstant %int 100
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_4 = OpConstant %int 4
+   %int_1000 = OpConstant %int 1000
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+         %91 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+         %92 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+         %93 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+         %94 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+         %95 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+         %96 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+         %97 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+         %98 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+         %99 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %100 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+        %101 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+        %102 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+        %103 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+        %104 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+        %105 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+        %106 = OpConstantComposite %_arr_v4float_uint_16 %91 %92 %93 %94 %95 %96 %97 %98 %91 %99 %100 %101 %102 %103 %104 %105
+     %int_16 = OpConstant %int 16
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+   %main_out = OpTypeStruct %v4float
+        %114 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_16 Function %24
+       %x_72 = OpVariable %_ptr_Function_int Function %28
+   %x_72_phi = OpVariable %_ptr_Function_int Function %28
+   %x_75_phi = OpVariable %_ptr_Function_int Function %28
+       %x_73 = OpVariable %_ptr_Function_int Function %28
+       %x_76 = OpVariable %_ptr_Function_int Function %28
+         %31 = OpLoad %v4float %gl_FragCoord
+         %32 = OpCompositeExtract %float %31 0
+         %33 = OpCompositeExtract %float %31 1
+         %34 = OpCompositeConstruct %v2float %32 %33
+         %37 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %38 = OpLoad %v2float %37
+         %39 = OpFDiv %v2float %34 %38
+         %41 = OpCompositeExtract %float %39 0
+         %43 = OpCompositeExtract %float %34 0
+         %44 = OpCompositeExtract %float %34 1
+         %46 = OpCompositeConstruct %v4float %float_0 %43 %44 %float_0_5
+         %47 = OpCompositeExtract %float %46 3
+         %50 = OpCompositeExtract %float %49 0
+         %51 = OpCompositeExtract %float %49 1
+         %52 = OpCompositeConstruct %v4float %47 %float_10 %50 %51
+         %53 = OpCompositeExtract %float %52 1
+         %54 = OpFMul %float %41 %53
+         %40 = OpConvertFToS %int %54
+         %56 = OpCompositeExtract %float %39 1
+         %57 = OpFMul %float %56 %float_10
+         %55 = OpConvertFToS %int %57
+         %59 = OpIMul %int %55 %int_10
+         %60 = OpIAdd %int %40 %59
+               OpStore %x_72_phi %int_100
+               OpStore %x_75_phi %int_0
+               OpBranch %63
+         %63 = OpLabel
+               OpLoopMerge %64 %65 None
+               OpBranch %66
+         %66 = OpLabel
+         %69 = OpLoad %int %x_72_phi
+               OpStore %x_72 %69
+         %70 = OpLoad %int %x_75_phi
+         %71 = OpSLessThan %bool %70 %60
+               OpSelectionMerge %73 None
+               OpBranchConditional %71 %74 %75
+         %74 = OpLabel
+               OpBranch %73
+         %75 = OpLabel
+               OpBranch %64
+         %73 = OpLabel
+               OpBranch %65
+         %65 = OpLabel
+         %78 = OpLoad %int %x_72
+         %77 = OpCopyObject %int %78
+         %79 = OpIMul %int %int_4 %77
+         %82 = OpLoad %int %x_72
+         %81 = OpCopyObject %int %82
+         %83 = OpISub %int %int_1000 %81
+         %84 = OpIMul %int %79 %83
+         %85 = OpSDiv %int %84 %int_1000
+               OpStore %x_73 %85
+         %87 = OpIAdd %int %70 %int_1
+               OpStore %x_76 %87
+         %88 = OpLoad %int %x_73
+               OpStore %x_72_phi %88
+         %89 = OpLoad %int %x_76
+               OpStore %x_75_phi %89
+               OpBranch %63
+         %64 = OpLabel
+               OpStore %indexable %106
+        %108 = OpLoad %int %x_72
+        %110 = OpSMod %int %108 %int_16
+        %107 = OpCopyObject %int %110
+        %112 = OpAccessChain %_ptr_Function_v4float %indexable %107
+        %113 = OpLoad %v4float %112
+               OpStore %x_GLF_color %113
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %114
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %118 = OpLabel
+        %119 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %119
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %121 = OpLabel
+        %122 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %122
+        %123 = OpFunctionCall %void %main_1
+        %125 = OpLoad %v4float %x_GLF_color
+        %126 = OpCompositeConstruct %main_out %125
+        %124 = OpFunctionCall %void %tint_symbol_3 %126
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite2/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-composite2/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..daa4973
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite2/1.spvasm.expected.wgsl
@@ -0,0 +1,57 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var indexable : array<vec4<f32>, 16>;
+  var x_72 : i32;
+  var x_72_phi : i32;
+  var x_75_phi : i32;
+  let x_54 : vec4<f32> = gl_FragCoord;
+  let x_55 : vec2<f32> = vec2<f32>(x_54.x, x_54.y);
+  let x_58 : vec2<f32> = x_6.resolution;
+  let x_59 : vec2<f32> = (x_55 / x_58);
+  let x_70 : i32 = (i32((x_59.x * vec4<f32>(vec4<f32>(0.0, x_55, 0.5).w, 10.0, vec2<f32>(0.0, 0.0)).y)) + (i32((x_59.y * 10.0)) * 10));
+  x_72_phi = 100;
+  x_75_phi = 0;
+  loop {
+    var x_73 : i32;
+    var x_76 : i32;
+    x_72 = x_72_phi;
+    let x_75 : i32 = x_75_phi;
+    if ((x_75 < x_70)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_73 = (((4 * bitcast<i32>(x_72)) * (1000 - bitcast<i32>(x_72))) / 1000);
+      x_76 = (x_75 + 1);
+      x_72_phi = x_73;
+      x_75_phi = x_76;
+    }
+  }
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+  let x_84 : vec4<f32> = indexable[bitcast<i32>((x_72 % 16))];
+  x_GLF_color = x_84;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite2/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-composite2/1.wgsl
new file mode 100644
index 0000000..daa4973
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite2/1.wgsl
@@ -0,0 +1,57 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var indexable : array<vec4<f32>, 16>;
+  var x_72 : i32;
+  var x_72_phi : i32;
+  var x_75_phi : i32;
+  let x_54 : vec4<f32> = gl_FragCoord;
+  let x_55 : vec2<f32> = vec2<f32>(x_54.x, x_54.y);
+  let x_58 : vec2<f32> = x_6.resolution;
+  let x_59 : vec2<f32> = (x_55 / x_58);
+  let x_70 : i32 = (i32((x_59.x * vec4<f32>(vec4<f32>(0.0, x_55, 0.5).w, 10.0, vec2<f32>(0.0, 0.0)).y)) + (i32((x_59.y * 10.0)) * 10));
+  x_72_phi = 100;
+  x_75_phi = 0;
+  loop {
+    var x_73 : i32;
+    var x_76 : i32;
+    x_72 = x_72_phi;
+    let x_75 : i32 = x_75_phi;
+    if ((x_75 < x_70)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_73 = (((4 * bitcast<i32>(x_72)) * (1000 - bitcast<i32>(x_72))) / 1000);
+      x_76 = (x_75 + 1);
+      x_72_phi = x_73;
+      x_75_phi = x_76;
+    }
+  }
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+  let x_84 : vec4<f32> = indexable[bitcast<i32>((x_72 % 16))];
+  x_GLF_color = x_84;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite2/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-composite2/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..ca60803
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite2/1.wgsl.expected.hlsl
@@ -0,0 +1,59 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 indexable[16] = (float4[16])0;
+  int x_72 = 0;
+  int x_72_phi = 0;
+  int x_75_phi = 0;
+  const float4 x_54 = gl_FragCoord;
+  const float2 x_55 = float2(x_54.x, x_54.y);
+  const float2 x_58 = asfloat(x_6[0].xy);
+  const float2 x_59 = (x_55 / x_58);
+  const int x_70 = (int((x_59.x * float4(float4(0.0f, x_55, 0.5f).w, 10.0f, float2(0.0f, 0.0f)).y)) + (int((x_59.y * 10.0f)) * 10));
+  x_72_phi = 100;
+  x_75_phi = 0;
+  while (true) {
+    int x_73 = 0;
+    int x_76 = 0;
+    x_72 = x_72_phi;
+    const int x_75 = x_75_phi;
+    if ((x_75 < x_70)) {
+    } else {
+      break;
+    }
+    {
+      x_73 = (((4 * asint(x_72)) * (1000 - asint(x_72))) / 1000);
+      x_76 = (x_75 + 1);
+      x_72_phi = x_73;
+      x_75_phi = x_76;
+    }
+  }
+  const float4 tint_symbol_5[16] = {float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)};
+  indexable = tint_symbol_5;
+  const float4 x_84 = indexable[asint((x_72 % 16))];
+  x_GLF_color = x_84;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite2/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-composite2/1.wgsl.expected.msl
new file mode 100644
index 0000000..7c00279
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite2/1.wgsl.expected.msl
@@ -0,0 +1,61 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  float4 arr[16];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  tint_array_wrapper indexable = {};
+  int x_72 = 0;
+  int x_72_phi = 0;
+  int x_75_phi = 0;
+  float4 const x_54 = *(tint_symbol_6);
+  float2 const x_55 = float2(x_54.x, x_54.y);
+  float2 const x_58 = x_6.resolution;
+  float2 const x_59 = (x_55 / x_58);
+  int const x_70 = (int((x_59.x * float4(float4(0.0f, x_55, 0.5f).w, 10.0f, float2(0.0f, 0.0f)).y)) + (int((x_59.y * 10.0f)) * 10));
+  x_72_phi = 100;
+  x_75_phi = 0;
+  while (true) {
+    int x_73 = 0;
+    int x_76 = 0;
+    x_72 = x_72_phi;
+    int const x_75 = x_75_phi;
+    if ((x_75 < x_70)) {
+    } else {
+      break;
+    }
+    {
+      x_73 = (((4 * as_type<int>(x_72)) * (1000 - as_type<int>(x_72))) / 1000);
+      x_76 = (x_75 + 1);
+      x_72_phi = x_73;
+      x_75_phi = x_76;
+    }
+  }
+  tint_array_wrapper const tint_symbol_4 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
+  indexable = tint_symbol_4;
+  float4 const x_84 = indexable.arr[as_type<int>((x_72 % 16))];
+  *(tint_symbol_7) = x_84;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite2/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-composite2/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..f9920e1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite2/1.wgsl.expected.spvasm
@@ -0,0 +1,189 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 127
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %indexable "indexable"
+               OpName %x_72 "x_72"
+               OpName %x_72_phi "x_72_phi"
+               OpName %x_75_phi "x_75_phi"
+               OpName %x_73 "x_73"
+               OpName %x_76 "x_76"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v4float_uint_16 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+         %24 = OpConstantNull %_arr_v4float_uint_16
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %28 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_0 = OpConstant %float 0
+  %float_0_5 = OpConstant %float 0.5
+   %float_10 = OpConstant %float 10
+         %49 = OpConstantComposite %v2float %float_0 %float_0
+     %int_10 = OpConstant %int 10
+    %int_100 = OpConstant %int 100
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_4 = OpConstant %int 4
+   %int_1000 = OpConstant %int 1000
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+         %91 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+         %92 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+         %93 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+         %94 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+         %95 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+         %96 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+         %97 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+         %98 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+         %99 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %100 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+        %101 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+        %102 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+        %103 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+        %104 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+        %105 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+        %106 = OpConstantComposite %_arr_v4float_uint_16 %91 %92 %93 %94 %95 %96 %97 %98 %91 %99 %100 %101 %102 %103 %104 %105
+     %int_16 = OpConstant %int 16
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+   %main_out = OpTypeStruct %v4float
+        %114 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_16 Function %24
+       %x_72 = OpVariable %_ptr_Function_int Function %28
+   %x_72_phi = OpVariable %_ptr_Function_int Function %28
+   %x_75_phi = OpVariable %_ptr_Function_int Function %28
+       %x_73 = OpVariable %_ptr_Function_int Function %28
+       %x_76 = OpVariable %_ptr_Function_int Function %28
+         %31 = OpLoad %v4float %gl_FragCoord
+         %32 = OpCompositeExtract %float %31 0
+         %33 = OpCompositeExtract %float %31 1
+         %34 = OpCompositeConstruct %v2float %32 %33
+         %37 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %38 = OpLoad %v2float %37
+         %39 = OpFDiv %v2float %34 %38
+         %41 = OpCompositeExtract %float %39 0
+         %43 = OpCompositeExtract %float %34 0
+         %44 = OpCompositeExtract %float %34 1
+         %46 = OpCompositeConstruct %v4float %float_0 %43 %44 %float_0_5
+         %47 = OpCompositeExtract %float %46 3
+         %50 = OpCompositeExtract %float %49 0
+         %51 = OpCompositeExtract %float %49 1
+         %52 = OpCompositeConstruct %v4float %47 %float_10 %50 %51
+         %53 = OpCompositeExtract %float %52 1
+         %54 = OpFMul %float %41 %53
+         %40 = OpConvertFToS %int %54
+         %56 = OpCompositeExtract %float %39 1
+         %57 = OpFMul %float %56 %float_10
+         %55 = OpConvertFToS %int %57
+         %59 = OpIMul %int %55 %int_10
+         %60 = OpIAdd %int %40 %59
+               OpStore %x_72_phi %int_100
+               OpStore %x_75_phi %int_0
+               OpBranch %63
+         %63 = OpLabel
+               OpLoopMerge %64 %65 None
+               OpBranch %66
+         %66 = OpLabel
+         %69 = OpLoad %int %x_72_phi
+               OpStore %x_72 %69
+         %70 = OpLoad %int %x_75_phi
+         %71 = OpSLessThan %bool %70 %60
+               OpSelectionMerge %73 None
+               OpBranchConditional %71 %74 %75
+         %74 = OpLabel
+               OpBranch %73
+         %75 = OpLabel
+               OpBranch %64
+         %73 = OpLabel
+               OpBranch %65
+         %65 = OpLabel
+         %78 = OpLoad %int %x_72
+         %77 = OpCopyObject %int %78
+         %79 = OpIMul %int %int_4 %77
+         %82 = OpLoad %int %x_72
+         %81 = OpCopyObject %int %82
+         %83 = OpISub %int %int_1000 %81
+         %84 = OpIMul %int %79 %83
+         %85 = OpSDiv %int %84 %int_1000
+               OpStore %x_73 %85
+         %87 = OpIAdd %int %70 %int_1
+               OpStore %x_76 %87
+         %88 = OpLoad %int %x_73
+               OpStore %x_72_phi %88
+         %89 = OpLoad %int %x_76
+               OpStore %x_75_phi %89
+               OpBranch %63
+         %64 = OpLabel
+               OpStore %indexable %106
+        %108 = OpLoad %int %x_72
+        %110 = OpSMod %int %108 %int_16
+        %107 = OpCopyObject %int %110
+        %112 = OpAccessChain %_ptr_Function_v4float %indexable %107
+        %113 = OpLoad %v4float %112
+               OpStore %x_GLF_color %113
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %114
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %118 = OpLabel
+        %119 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %119
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %121 = OpLabel
+        %122 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %122
+        %123 = OpFunctionCall %void %main_1
+        %125 = OpLoad %v4float %x_GLF_color
+        %126 = OpCompositeConstruct %main_out %125
+        %124 = OpFunctionCall %void %tint_symbol_3 %126
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composite2/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-composite2/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..daa4973
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composite2/1.wgsl.expected.wgsl
@@ -0,0 +1,57 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var indexable : array<vec4<f32>, 16>;
+  var x_72 : i32;
+  var x_72_phi : i32;
+  var x_75_phi : i32;
+  let x_54 : vec4<f32> = gl_FragCoord;
+  let x_55 : vec2<f32> = vec2<f32>(x_54.x, x_54.y);
+  let x_58 : vec2<f32> = x_6.resolution;
+  let x_59 : vec2<f32> = (x_55 / x_58);
+  let x_70 : i32 = (i32((x_59.x * vec4<f32>(vec4<f32>(0.0, x_55, 0.5).w, 10.0, vec2<f32>(0.0, 0.0)).y)) + (i32((x_59.y * 10.0)) * 10));
+  x_72_phi = 100;
+  x_75_phi = 0;
+  loop {
+    var x_73 : i32;
+    var x_76 : i32;
+    x_72 = x_72_phi;
+    let x_75 : i32 = x_75_phi;
+    if ((x_75 < x_70)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_73 = (((4 * bitcast<i32>(x_72)) * (1000 - bitcast<i32>(x_72))) / 1000);
+      x_76 = (x_75 + 1);
+      x_72_phi = x_73;
+      x_75_phi = x_76;
+    }
+  }
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+  let x_84 : vec4<f32> = indexable[bitcast<i32>((x_72 % 16))];
+  x_GLF_color = x_84;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composites/0.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-composites/0.spvasm
new file mode 100644
index 0000000..b87985b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composites/0.spvasm
@@ -0,0 +1,285 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+       %uint = OpTypeInt 32 0
+%_ptr_Function_int = OpTypePointer Function %int
+    %int_256 = OpConstant %int 256
+       %bool = OpTypeBool
+     %uint_0 = OpConstant %uint 0
+   %uint_256 = OpConstant %uint 256
+%_arr_int_uint_256 = OpTypeArray %int %uint_256
+    %int_115 = OpConstant %int 115
+    %int_133 = OpConstant %int 133
+    %int_150 = OpConstant %int 150
+    %int_164 = OpConstant %int 164
+    %int_176 = OpConstant %int 176
+    %int_184 = OpConstant %int 184
+    %int_190 = OpConstant %int 190
+    %int_192 = OpConstant %int 192
+    %int_191 = OpConstant %int 191
+    %int_187 = OpConstant %int 187
+    %int_181 = OpConstant %int 181
+    %int_172 = OpConstant %int 172
+    %int_163 = OpConstant %int 163
+    %int_153 = OpConstant %int 153
+    %int_143 = OpConstant %int 143
+    %int_134 = OpConstant %int 134
+    %int_126 = OpConstant %int 126
+    %int_120 = OpConstant %int 120
+    %int_116 = OpConstant %int 116
+    %int_114 = OpConstant %int 114
+    %int_117 = OpConstant %int 117
+    %int_121 = OpConstant %int 121
+    %int_127 = OpConstant %int 127
+    %int_141 = OpConstant %int 141
+    %int_148 = OpConstant %int 148
+    %int_154 = OpConstant %int 154
+    %int_159 = OpConstant %int 159
+    %int_162 = OpConstant %int 162
+    %int_161 = OpConstant %int 161
+    %int_157 = OpConstant %int 157
+    %int_151 = OpConstant %int 151
+    %int_124 = OpConstant %int 124
+    %int_113 = OpConstant %int 113
+    %int_103 = OpConstant %int 103
+     %int_94 = OpConstant %int 94
+     %int_87 = OpConstant %int 87
+     %int_82 = OpConstant %int 82
+     %int_79 = OpConstant %int 79
+     %int_80 = OpConstant %int 80
+     %int_84 = OpConstant %int 84
+     %int_91 = OpConstant %int 91
+    %int_101 = OpConstant %int 101
+    %int_130 = OpConstant %int 130
+    %int_146 = OpConstant %int 146
+    %int_182 = OpConstant %int 182
+    %int_199 = OpConstant %int 199
+    %int_215 = OpConstant %int 215
+    %int_229 = OpConstant %int 229
+    %int_240 = OpConstant %int 240
+    %int_249 = OpConstant %int 249
+    %int_254 = OpConstant %int 254
+    %int_250 = OpConstant %int 250
+    %int_243 = OpConstant %int 243
+    %int_233 = OpConstant %int 233
+    %int_223 = OpConstant %int 223
+    %int_212 = OpConstant %int 212
+    %int_200 = OpConstant %int 200
+    %int_180 = OpConstant %int 180
+    %int_166 = OpConstant %int 166
+    %int_169 = OpConstant %int 169
+    %int_174 = OpConstant %int 174
+    %int_179 = OpConstant %int 179
+    %int_185 = OpConstant %int 185
+    %int_193 = OpConstant %int 193
+    %int_195 = OpConstant %int 195
+    %int_188 = OpConstant %int 188
+    %int_171 = OpConstant %int 171
+    %int_149 = OpConstant %int 149
+    %int_137 = OpConstant %int 137
+    %int_125 = OpConstant %int 125
+    %int_105 = OpConstant %int 105
+     %int_97 = OpConstant %int 97
+     %int_93 = OpConstant %int 93
+     %int_98 = OpConstant %int 98
+    %int_106 = OpConstant %int 106
+    %int_145 = OpConstant %int 145
+    %int_177 = OpConstant %int 177
+    %int_208 = OpConstant %int 208
+    %int_221 = OpConstant %int 221
+    %int_231 = OpConstant %int 231
+    %int_239 = OpConstant %int 239
+    %int_244 = OpConstant %int 244
+    %int_242 = OpConstant %int 242
+    %int_236 = OpConstant %int 236
+    %int_228 = OpConstant %int 228
+    %int_218 = OpConstant %int 218
+    %int_207 = OpConstant %int 207
+    %int_194 = OpConstant %int 194
+    %int_158 = OpConstant %int 158
+    %int_135 = OpConstant %int 135
+    %int_132 = OpConstant %int 132
+    %int_131 = OpConstant %int 131
+    %int_138 = OpConstant %int 138
+    %int_147 = OpConstant %int 147
+    %int_155 = OpConstant %int 155
+    %int_152 = OpConstant %int 152
+    %int_139 = OpConstant %int 139
+    %int_129 = OpConstant %int 129
+    %int_118 = OpConstant %int 118
+     %int_68 = OpConstant %int 68
+     %int_58 = OpConstant %int 58
+     %int_49 = OpConstant %int 49
+     %int_43 = OpConstant %int 43
+     %int_40 = OpConstant %int 40
+     %int_41 = OpConstant %int 41
+     %int_44 = OpConstant %int 44
+     %int_51 = OpConstant %int 51
+     %int_61 = OpConstant %int 61
+     %int_73 = OpConstant %int 73
+    %int_119 = OpConstant %int 119
+    %int_173 = OpConstant %int 173
+    %int_186 = OpConstant %int 186
+    %int_128 = OpConstant %int 128
+    %int_104 = OpConstant %int 104
+     %int_86 = OpConstant %int 86
+     %int_81 = OpConstant %int 81
+     %int_77 = OpConstant %int 77
+     %int_76 = OpConstant %int 76
+     %int_89 = OpConstant %int 89
+    %int_102 = OpConstant %int 102
+     %int_92 = OpConstant %int 92
+     %int_83 = OpConstant %int 83
+     %int_62 = OpConstant %int 62
+     %int_50 = OpConstant %int 50
+     %int_38 = OpConstant %int 38
+     %int_26 = OpConstant %int 26
+     %int_16 = OpConstant %int 16
+      %int_8 = OpConstant %int 8
+      %int_2 = OpConstant %int 2
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+     %int_11 = OpConstant %int 11
+     %int_21 = OpConstant %int 21
+     %int_33 = OpConstant %int 33
+     %int_48 = OpConstant %int 48
+     %int_64 = OpConstant %int 64
+    %int_144 = OpConstant %int 144
+    %int_123 = OpConstant %int 123
+    %int_112 = OpConstant %int 112
+    %int_100 = OpConstant %int 100
+     %int_90 = OpConstant %int 90
+     %int_65 = OpConstant %int 65
+     %int_67 = OpConstant %int 67
+     %int_70 = OpConstant %int 70
+     %int_75 = OpConstant %int 75
+     %int_95 = OpConstant %int 95
+     %int_88 = OpConstant %int 88
+     %int_69 = OpConstant %int 69
+     %int_47 = OpConstant %int 47
+     %int_36 = OpConstant %int 36
+     %int_18 = OpConstant %int 18
+     %int_13 = OpConstant %int 13
+     %int_15 = OpConstant %int 15
+     %int_22 = OpConstant %int 22
+     %int_32 = OpConstant %int 32
+     %int_45 = OpConstant %int 45
+     %int_60 = OpConstant %int 60
+        %177 = OpConstantComposite %_arr_int_uint_256 %int_115 %int_133 %int_150 %int_164 %int_176 %int_184 %int_190 %int_192 %int_191 %int_187 %int_181 %int_172 %int_163 %int_153 %int_143 %int_134 %int_126 %int_120 %int_116 %int_114 %int_114 %int_117 %int_121 %int_127 %int_134 %int_141 %int_148 %int_154 %int_159 %int_162 %int_163 %int_161 %int_157 %int_151 %int_143 %int_134 %int_124 %int_113 %int_103 %int_94 %int_87 %int_82 %int_79 %int_80 %int_84 %int_91 %int_101 %int_114 %int_130 %int_146 %int_164 %int_182 %int_199 %int_215 %int_229 %int_240 %int_249 %int_254 %int_256 %int_254 %int_250 %int_243 %int_233 %int_223 %int_212 %int_200 %int_190 %int_180 %int_172 %int_166 %int_163 %int_161 %int_162 %int_164 %int_169 %int_174 %int_179 %int_185 %int_190 %int_193 %int_195 %int_195 %int_192 %int_188 %int_180 %int_171 %int_161 %int_149 %int_137 %int_125 %int_114 %int_105 %int_97 %int_93 %int_91 %int_93 %int_98 %int_106 %int_117 %int_130 %int_145 %int_161 %int_177 %int_193 %int_208 %int_221 %int_231 %int_239 %int_243 %int_244 %int_242 %int_236 %int_228 %int_218 %int_207 %int_194 %int_181 %int_169 %int_158 %int_148 %int_141 %int_135 %int_132 %int_131 %int_132 %int_135 %int_138 %int_143 %int_147 %int_151 %int_154 %int_155 %int_155 %int_152 %int_146 %int_139 %int_129 %int_118 %int_106 %int_93 %int_80 %int_68 %int_58 %int_49 %int_43 %int_40 %int_41 %int_44 %int_51 %int_61 %int_73 %int_87 %int_103 %int_119 %int_134 %int_149 %int_162 %int_173 %int_181 %int_186 %int_188 %int_186 %int_181 %int_174 %int_164 %int_153 %int_141 %int_128 %int_116 %int_104 %int_94 %int_86 %int_81 %int_77 %int_76 %int_77 %int_80 %int_84 %int_89 %int_94 %int_98 %int_102 %int_104 %int_104 %int_102 %int_98 %int_92 %int_83 %int_73 %int_62 %int_50 %int_38 %int_26 %int_16 %int_8 %int_2 %int_0 %int_0 %int_4 %int_11 %int_21 %int_33 %int_48 %int_64 %int_81 %int_98 %int_114 %int_129 %int_141 %int_151 %int_158 %int_161 %int_161 %int_158 %int_152 %int_144 %int_134 %int_123 %int_112 %int_100 %int_90 %int_81 %int_73 %int_68 %int_65 %int_65 %int_67 %int_70 %int_75 %int_81 %int_87 %int_92 %int_97 %int_101 %int_103 %int_102 %int_100 %int_95 %int_88 %int_79 %int_69 %int_58 %int_47 %int_36 %int_26 %int_18 %int_13 %int_11 %int_11 %int_15 %int_22 %int_32 %int_45 %int_60 %int_77 %int_94
+%_ptr_Function__arr_int_uint_256 = OpTypePointer Function %_arr_int_uint_256
+   %float_15 = OpConstant %float 15
+    %float_1 = OpConstant %float 1
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+        %183 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+    %v2float = OpTypeVector %float 2
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+  %float_256 = OpConstant %float 256
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+      %false = OpConstantFalse %bool
+       %true = OpConstantTrue %bool
+        %192 = OpUndef %v4float
+%float_0_0666666701 = OpConstant %float 0.0666666701
+       %main = OpFunction %void None %8
+        %194 = OpLabel
+        %195 = OpVariable %_ptr_Function__arr_int_uint_256 Function
+        %196 = OpVariable %_ptr_Function__arr_int_uint_256 Function
+        %197 = OpVariable %_ptr_Function__arr_int_uint_256 Function
+        %198 = OpLoad %v4float %gl_FragCoord
+        %199 = OpVectorShuffle %v2float %198 %198 0 1
+        %200 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+        %201 = OpLoad %v2float %200
+        %202 = OpFDiv %v2float %199 %201
+        %203 = OpCompositeExtract %float %202 0
+        %204 = OpFMul %float %203 %float_256
+        %205 = OpConvertFToS %int %204
+        %206 = OpCompositeExtract %float %202 1
+        %207 = OpFMul %float %206 %float_256
+        %208 = OpConvertFToS %int %207
+        %209 = OpCompositeConstruct %v2int %205 %208
+               OpSelectionMerge %210 None
+               OpSwitch %uint_0 %211
+        %211 = OpLabel
+               OpBranch %212
+        %212 = OpLabel
+        %213 = OpPhi %v2int %209 %211 %214 %215
+        %216 = OpCompositeExtract %int %213 1
+        %217 = OpINotEqual %bool %216 %int_256
+               OpLoopMerge %218 %215 None
+               OpBranchConditional %217 %219 %218
+        %219 = OpLabel
+        %220 = OpCompositeExtract %int %213 0
+               OpStore %195 %177
+        %221 = OpAccessChain %_ptr_Function_int %195 %216
+        %222 = OpLoad %int %221
+        %223 = OpIAdd %int %222 %int_15
+        %224 = OpSLessThan %bool %220 %223
+               OpSelectionMerge %225 None
+               OpBranchConditional %224 %226 %225
+        %226 = OpLabel
+               OpStore %196 %177
+        %227 = OpAccessChain %_ptr_Function_int %196 %216
+        %228 = OpLoad %int %227
+        %229 = OpISub %int %228 %int_15
+        %230 = OpSGreaterThan %bool %220 %229
+               OpBranch %225
+        %225 = OpLabel
+        %231 = OpPhi %bool %224 %219 %230 %226
+               OpSelectionMerge %232 None
+               OpBranchConditional %231 %233 %232
+        %233 = OpLabel
+               OpStore %197 %177
+        %234 = OpAccessChain %_ptr_Function_int %197 %216
+        %235 = OpLoad %int %234
+        %236 = OpISub %int %220 %235
+        %237 = OpConvertSToF %float %236
+        %238 = OpExtInst %float %1 FAbs %237
+        %239 = OpFSub %float %float_15 %238
+        %240 = OpFMul %float %239 %float_0_0666666701
+        %241 = OpCompositeConstruct %v4float %240 %240 %240 %float_1
+               OpBranch %218
+        %232 = OpLabel
+        %242 = OpIAdd %int %216 %int_1
+        %214 = OpCompositeInsert %v2int %242 %213 1
+               OpBranch %215
+        %215 = OpLabel
+               OpBranch %212
+        %218 = OpLabel
+        %243 = OpPhi %v4float %192 %212 %241 %233
+        %244 = OpPhi %bool %false %212 %true %233
+               OpSelectionMerge %245 None
+               OpBranchConditional %244 %210 %245
+        %245 = OpLabel
+               OpBranch %210
+        %210 = OpLabel
+        %246 = OpPhi %v4float %243 %218 %183 %245
+               OpStore %_GLF_color %246
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composites/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-composites/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..cd5825d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composites/0.spvasm.expected.hlsl
@@ -0,0 +1,97 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int x_195[256] = (int[256])0;
+  int x_196[256] = (int[256])0;
+  int x_197[256] = (int[256])0;
+  int2 x_209 = int2(0, 0);
+  float4 x_241 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 x_243 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int2 x_213_phi = int2(0, 0);
+  float4 x_243_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  bool x_244_phi = false;
+  float4 x_246_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  const float4 x_198 = gl_FragCoord;
+  const float2 x_201 = asfloat(x_6[0].xy);
+  const float2 x_202 = (float2(x_198.x, x_198.y) / x_201);
+  x_209 = int2(int((x_202.x * 256.0f)), int((x_202.y * 256.0f)));
+  switch(0u) {
+    default: {
+      x_213_phi = x_209;
+      while (true) {
+        bool x_230 = false;
+        bool x_231_phi = false;
+        const int2 x_213 = x_213_phi;
+        const int x_216 = x_213.y;
+        x_243_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        x_244_phi = false;
+        if ((x_216 != 256)) {
+        } else {
+          break;
+        }
+        const int x_220 = x_213.x;
+        const int tint_symbol_5[256] = {115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94};
+        x_195 = tint_symbol_5;
+        const int x_222 = x_195[x_216];
+        const bool x_224 = (x_220 < (x_222 + 15));
+        x_231_phi = x_224;
+        if (x_224) {
+          const int tint_symbol_6[256] = {115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94};
+          x_196 = tint_symbol_6;
+          const int x_228 = x_196[x_216];
+          x_230 = (x_220 > (x_228 - 15));
+          x_231_phi = x_230;
+        }
+        if (x_231_phi) {
+          const int tint_symbol_7[256] = {115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94};
+          x_197 = tint_symbol_7;
+          const int x_235 = x_197[x_216];
+          const float x_240 = ((15.0f - abs(float((x_220 - x_235)))) * 0.06666667f);
+          x_241 = float4(x_240, x_240, x_240, 1.0f);
+          x_243_phi = x_241;
+          x_244_phi = true;
+          break;
+        }
+        int2 x_214_1 = x_213;
+        x_214_1.y = (x_216 + 1);
+        const int2 x_214 = x_214_1;
+        {
+          x_213_phi = x_214;
+        }
+      }
+      x_243 = x_243_phi;
+      const bool x_244 = x_244_phi;
+      x_246_phi = x_243;
+      if (x_244) {
+        break;
+      }
+      x_246_phi = float4(0.0f, 0.0f, 0.0f, 1.0f);
+      break;
+    }
+  }
+  x_GLF_color = x_246_phi;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_8 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_8;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composites/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-composites/0.spvasm.expected.msl
new file mode 100644
index 0000000..4c8e613
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composites/0.spvasm.expected.msl
@@ -0,0 +1,101 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  int arr[256];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_8, thread float4* const tint_symbol_9) {
+  tint_array_wrapper x_195 = {};
+  tint_array_wrapper x_196 = {};
+  tint_array_wrapper x_197 = {};
+  int2 x_209 = 0;
+  float4 x_241 = 0.0f;
+  float4 x_243 = 0.0f;
+  int2 x_213_phi = 0;
+  float4 x_243_phi = 0.0f;
+  bool x_244_phi = false;
+  float4 x_246_phi = 0.0f;
+  float4 const x_198 = *(tint_symbol_8);
+  float2 const x_201 = x_6.resolution;
+  float2 const x_202 = (float2(x_198.x, x_198.y) / x_201);
+  x_209 = int2(int((x_202.x * 256.0f)), int((x_202.y * 256.0f)));
+  switch(0u) {
+    default: {
+      x_213_phi = x_209;
+      while (true) {
+        bool x_230 = false;
+        bool x_231_phi = false;
+        int2 const x_213 = x_213_phi;
+        int const x_216 = x_213.y;
+        x_243_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        x_244_phi = false;
+        if ((x_216 != 256)) {
+        } else {
+          break;
+        }
+        int const x_220 = x_213.x;
+        tint_array_wrapper const tint_symbol_4 = {.arr={115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94}};
+        x_195 = tint_symbol_4;
+        int const x_222 = x_195.arr[x_216];
+        bool const x_224 = (x_220 < (x_222 + 15));
+        x_231_phi = x_224;
+        if (x_224) {
+          tint_array_wrapper const tint_symbol_5 = {.arr={115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94}};
+          x_196 = tint_symbol_5;
+          int const x_228 = x_196.arr[x_216];
+          x_230 = (x_220 > (x_228 - 15));
+          x_231_phi = x_230;
+        }
+        bool const x_231 = x_231_phi;
+        if (x_231) {
+          tint_array_wrapper const tint_symbol_6 = {.arr={115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94}};
+          x_197 = tint_symbol_6;
+          int const x_235 = x_197.arr[x_216];
+          float const x_240 = ((15.0f - fabs(float((x_220 - x_235)))) * 0.06666667f);
+          x_241 = float4(x_240, x_240, x_240, 1.0f);
+          x_243_phi = x_241;
+          x_244_phi = true;
+          break;
+        }
+        int2 x_214_1 = x_213;
+        x_214_1.y = (x_216 + 1);
+        int2 const x_214 = x_214_1;
+        {
+          x_213_phi = x_214;
+        }
+      }
+      x_243 = x_243_phi;
+      bool const x_244 = x_244_phi;
+      x_246_phi = x_243;
+      if (x_244) {
+        break;
+      }
+      x_246_phi = float4(0.0f, 0.0f, 0.0f, 1.0f);
+      break;
+    }
+  }
+  float4 const x_246 = x_246_phi;
+  *(tint_symbol_9) = x_246;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_10 = 0.0f;
+  thread float4 tint_symbol_11 = 0.0f;
+  tint_symbol_10 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_10), &(tint_symbol_11));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_11};
+  tint_symbol_2 const tint_symbol_7 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_7;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composites/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-composites/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..4a43cab
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composites/0.spvasm.expected.spvasm
@@ -0,0 +1,384 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 292
+; Schema: 0
+               OpCapability Shader
+        %256 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %x_195 "x_195"
+               OpName %x_196 "x_196"
+               OpName %x_197 "x_197"
+               OpName %x_209 "x_209"
+               OpName %x_241 "x_241"
+               OpName %x_243 "x_243"
+               OpName %x_213_phi "x_213_phi"
+               OpName %x_243_phi "x_243_phi"
+               OpName %x_244_phi "x_244_phi"
+               OpName %x_246_phi "x_246_phi"
+               OpName %x_230 "x_230"
+               OpName %x_231_phi "x_231_phi"
+               OpName %x_214_1 "x_214_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_int_uint_256 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+   %uint_256 = OpConstant %uint 256
+%_arr_int_uint_256 = OpTypeArray %int %uint_256
+%_ptr_Function__arr_int_uint_256 = OpTypePointer Function %_arr_int_uint_256
+         %25 = OpConstantNull %_arr_int_uint_256
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %31 = OpConstantNull %v2int
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %40 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+  %float_256 = OpConstant %float 256
+    %float_0 = OpConstant %float 0
+         %71 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+      %false = OpConstantFalse %bool
+    %int_256 = OpConstant %int 256
+    %int_115 = OpConstant %int 115
+    %int_133 = OpConstant %int 133
+    %int_150 = OpConstant %int 150
+    %int_164 = OpConstant %int 164
+    %int_176 = OpConstant %int 176
+    %int_184 = OpConstant %int 184
+    %int_190 = OpConstant %int 190
+    %int_192 = OpConstant %int 192
+    %int_191 = OpConstant %int 191
+    %int_187 = OpConstant %int 187
+    %int_181 = OpConstant %int 181
+    %int_172 = OpConstant %int 172
+    %int_163 = OpConstant %int 163
+    %int_153 = OpConstant %int 153
+    %int_143 = OpConstant %int 143
+    %int_134 = OpConstant %int 134
+    %int_126 = OpConstant %int 126
+    %int_120 = OpConstant %int 120
+    %int_116 = OpConstant %int 116
+    %int_114 = OpConstant %int 114
+    %int_117 = OpConstant %int 117
+    %int_121 = OpConstant %int 121
+    %int_127 = OpConstant %int 127
+    %int_141 = OpConstant %int 141
+    %int_148 = OpConstant %int 148
+    %int_154 = OpConstant %int 154
+    %int_159 = OpConstant %int 159
+    %int_162 = OpConstant %int 162
+    %int_161 = OpConstant %int 161
+    %int_157 = OpConstant %int 157
+    %int_151 = OpConstant %int 151
+    %int_124 = OpConstant %int 124
+    %int_113 = OpConstant %int 113
+    %int_103 = OpConstant %int 103
+     %int_94 = OpConstant %int 94
+     %int_87 = OpConstant %int 87
+     %int_82 = OpConstant %int 82
+     %int_79 = OpConstant %int 79
+     %int_80 = OpConstant %int 80
+     %int_84 = OpConstant %int 84
+     %int_91 = OpConstant %int 91
+    %int_101 = OpConstant %int 101
+    %int_130 = OpConstant %int 130
+    %int_146 = OpConstant %int 146
+    %int_182 = OpConstant %int 182
+    %int_199 = OpConstant %int 199
+    %int_215 = OpConstant %int 215
+    %int_229 = OpConstant %int 229
+    %int_240 = OpConstant %int 240
+    %int_249 = OpConstant %int 249
+    %int_254 = OpConstant %int 254
+    %int_250 = OpConstant %int 250
+    %int_243 = OpConstant %int 243
+    %int_233 = OpConstant %int 233
+    %int_223 = OpConstant %int 223
+    %int_212 = OpConstant %int 212
+    %int_200 = OpConstant %int 200
+    %int_180 = OpConstant %int 180
+    %int_166 = OpConstant %int 166
+    %int_169 = OpConstant %int 169
+    %int_174 = OpConstant %int 174
+    %int_179 = OpConstant %int 179
+    %int_185 = OpConstant %int 185
+    %int_193 = OpConstant %int 193
+    %int_195 = OpConstant %int 195
+    %int_188 = OpConstant %int 188
+    %int_171 = OpConstant %int 171
+    %int_149 = OpConstant %int 149
+    %int_137 = OpConstant %int 137
+    %int_125 = OpConstant %int 125
+    %int_105 = OpConstant %int 105
+     %int_97 = OpConstant %int 97
+     %int_93 = OpConstant %int 93
+     %int_98 = OpConstant %int 98
+    %int_106 = OpConstant %int 106
+    %int_145 = OpConstant %int 145
+    %int_177 = OpConstant %int 177
+    %int_208 = OpConstant %int 208
+    %int_221 = OpConstant %int 221
+    %int_231 = OpConstant %int 231
+    %int_239 = OpConstant %int 239
+    %int_244 = OpConstant %int 244
+    %int_242 = OpConstant %int 242
+    %int_236 = OpConstant %int 236
+    %int_228 = OpConstant %int 228
+    %int_218 = OpConstant %int 218
+    %int_207 = OpConstant %int 207
+    %int_194 = OpConstant %int 194
+    %int_158 = OpConstant %int 158
+    %int_135 = OpConstant %int 135
+    %int_132 = OpConstant %int 132
+    %int_131 = OpConstant %int 131
+    %int_138 = OpConstant %int 138
+    %int_147 = OpConstant %int 147
+    %int_155 = OpConstant %int 155
+    %int_152 = OpConstant %int 152
+    %int_139 = OpConstant %int 139
+    %int_129 = OpConstant %int 129
+    %int_118 = OpConstant %int 118
+     %int_68 = OpConstant %int 68
+     %int_58 = OpConstant %int 58
+     %int_49 = OpConstant %int 49
+     %int_43 = OpConstant %int 43
+     %int_40 = OpConstant %int 40
+     %int_41 = OpConstant %int 41
+     %int_44 = OpConstant %int 44
+     %int_51 = OpConstant %int 51
+     %int_61 = OpConstant %int 61
+     %int_73 = OpConstant %int 73
+    %int_119 = OpConstant %int 119
+    %int_173 = OpConstant %int 173
+    %int_186 = OpConstant %int 186
+    %int_128 = OpConstant %int 128
+    %int_104 = OpConstant %int 104
+     %int_86 = OpConstant %int 86
+     %int_81 = OpConstant %int 81
+     %int_77 = OpConstant %int 77
+     %int_76 = OpConstant %int 76
+     %int_89 = OpConstant %int 89
+    %int_102 = OpConstant %int 102
+     %int_92 = OpConstant %int 92
+     %int_83 = OpConstant %int 83
+     %int_62 = OpConstant %int 62
+     %int_50 = OpConstant %int 50
+     %int_38 = OpConstant %int 38
+     %int_26 = OpConstant %int 26
+     %int_16 = OpConstant %int 16
+      %int_8 = OpConstant %int 8
+      %int_2 = OpConstant %int 2
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+     %int_11 = OpConstant %int 11
+     %int_21 = OpConstant %int 21
+     %int_33 = OpConstant %int 33
+     %int_48 = OpConstant %int 48
+     %int_64 = OpConstant %int 64
+    %int_144 = OpConstant %int 144
+    %int_123 = OpConstant %int 123
+    %int_112 = OpConstant %int 112
+    %int_100 = OpConstant %int 100
+     %int_90 = OpConstant %int 90
+     %int_65 = OpConstant %int 65
+     %int_67 = OpConstant %int 67
+     %int_70 = OpConstant %int 70
+     %int_75 = OpConstant %int 75
+     %int_95 = OpConstant %int 95
+     %int_88 = OpConstant %int 88
+     %int_69 = OpConstant %int 69
+     %int_47 = OpConstant %int 47
+     %int_36 = OpConstant %int 36
+     %int_18 = OpConstant %int 18
+     %int_13 = OpConstant %int 13
+     %int_15 = OpConstant %int 15
+     %int_22 = OpConstant %int 22
+     %int_32 = OpConstant %int 32
+     %int_45 = OpConstant %int 45
+     %int_60 = OpConstant %int 60
+        %236 = OpConstantComposite %_arr_int_uint_256 %int_115 %int_133 %int_150 %int_164 %int_176 %int_184 %int_190 %int_192 %int_191 %int_187 %int_181 %int_172 %int_163 %int_153 %int_143 %int_134 %int_126 %int_120 %int_116 %int_114 %int_114 %int_117 %int_121 %int_127 %int_134 %int_141 %int_148 %int_154 %int_159 %int_162 %int_163 %int_161 %int_157 %int_151 %int_143 %int_134 %int_124 %int_113 %int_103 %int_94 %int_87 %int_82 %int_79 %int_80 %int_84 %int_91 %int_101 %int_114 %int_130 %int_146 %int_164 %int_182 %int_199 %int_215 %int_229 %int_240 %int_249 %int_254 %int_256 %int_254 %int_250 %int_243 %int_233 %int_223 %int_212 %int_200 %int_190 %int_180 %int_172 %int_166 %int_163 %int_161 %int_162 %int_164 %int_169 %int_174 %int_179 %int_185 %int_190 %int_193 %int_195 %int_195 %int_192 %int_188 %int_180 %int_171 %int_161 %int_149 %int_137 %int_125 %int_114 %int_105 %int_97 %int_93 %int_91 %int_93 %int_98 %int_106 %int_117 %int_130 %int_145 %int_161 %int_177 %int_193 %int_208 %int_221 %int_231 %int_239 %int_243 %int_244 %int_242 %int_236 %int_228 %int_218 %int_207 %int_194 %int_181 %int_169 %int_158 %int_148 %int_141 %int_135 %int_132 %int_131 %int_132 %int_135 %int_138 %int_143 %int_147 %int_151 %int_154 %int_155 %int_155 %int_152 %int_146 %int_139 %int_129 %int_118 %int_106 %int_93 %int_80 %int_68 %int_58 %int_49 %int_43 %int_40 %int_41 %int_44 %int_51 %int_61 %int_73 %int_87 %int_103 %int_119 %int_134 %int_149 %int_162 %int_173 %int_181 %int_186 %int_188 %int_186 %int_181 %int_174 %int_164 %int_153 %int_141 %int_128 %int_116 %int_104 %int_94 %int_86 %int_81 %int_77 %int_76 %int_77 %int_80 %int_84 %int_89 %int_94 %int_98 %int_102 %int_104 %int_104 %int_102 %int_98 %int_92 %int_83 %int_73 %int_62 %int_50 %int_38 %int_26 %int_16 %int_8 %int_2 %int_0 %int_0 %int_4 %int_11 %int_21 %int_33 %int_48 %int_64 %int_81 %int_98 %int_114 %int_129 %int_141 %int_151 %int_158 %int_161 %int_161 %int_158 %int_152 %int_144 %int_134 %int_123 %int_112 %int_100 %int_90 %int_81 %int_73 %int_68 %int_65 %int_65 %int_67 %int_70 %int_75 %int_81 %int_87 %int_92 %int_97 %int_101 %int_103 %int_102 %int_100 %int_95 %int_88 %int_79 %int_69 %int_58 %int_47 %int_36 %int_26 %int_18 %int_13 %int_11 %int_11 %int_15 %int_22 %int_32 %int_45 %int_60 %int_77 %int_94
+%_ptr_Function_int = OpTypePointer Function %int
+   %float_15 = OpConstant %float 15
+%float_0_0666666701 = OpConstant %float 0.0666666701
+    %float_1 = OpConstant %float 1
+       %true = OpConstantTrue %bool
+     %uint_1 = OpConstant %uint 1
+      %int_1 = OpConstant %int 1
+        %277 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %279 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+      %x_195 = OpVariable %_ptr_Function__arr_int_uint_256 Function %25
+      %x_196 = OpVariable %_ptr_Function__arr_int_uint_256 Function %25
+      %x_197 = OpVariable %_ptr_Function__arr_int_uint_256 Function %25
+      %x_209 = OpVariable %_ptr_Function_v2int Function %31
+      %x_241 = OpVariable %_ptr_Function_v4float Function %5
+      %x_243 = OpVariable %_ptr_Function_v4float Function %5
+  %x_213_phi = OpVariable %_ptr_Function_v2int Function %31
+  %x_243_phi = OpVariable %_ptr_Function_v4float Function %5
+  %x_244_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_246_phi = OpVariable %_ptr_Function_v4float Function %5
+      %x_230 = OpVariable %_ptr_Function_bool Function %40
+  %x_231_phi = OpVariable %_ptr_Function_bool Function %40
+    %x_214_1 = OpVariable %_ptr_Function_v2int Function %31
+         %42 = OpLoad %v4float %gl_FragCoord
+         %45 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %46 = OpLoad %v2float %45
+         %47 = OpCompositeExtract %float %42 0
+         %48 = OpCompositeExtract %float %42 1
+         %49 = OpCompositeConstruct %v2float %47 %48
+         %50 = OpFDiv %v2float %49 %46
+         %52 = OpCompositeExtract %float %50 0
+         %54 = OpFMul %float %52 %float_256
+         %51 = OpConvertFToS %int %54
+         %56 = OpCompositeExtract %float %50 1
+         %57 = OpFMul %float %56 %float_256
+         %55 = OpConvertFToS %int %57
+         %58 = OpCompositeConstruct %v2int %51 %55
+               OpStore %x_209 %58
+               OpSelectionMerge %59 None
+               OpSwitch %uint_0 %60
+         %60 = OpLabel
+         %61 = OpLoad %v2int %x_209
+               OpStore %x_213_phi %61
+               OpBranch %62
+         %62 = OpLabel
+               OpLoopMerge %63 %64 None
+               OpBranch %65
+         %65 = OpLabel
+         %68 = OpLoad %v2int %x_213_phi
+         %69 = OpCompositeExtract %int %68 1
+               OpStore %x_243_phi %71
+               OpStore %x_244_phi %false
+         %74 = OpINotEqual %bool %69 %int_256
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %77
+         %76 = OpLabel
+               OpBranch %75
+         %77 = OpLabel
+               OpBranch %63
+         %75 = OpLabel
+         %78 = OpCompositeExtract %int %68 0
+               OpStore %x_195 %236
+        %238 = OpAccessChain %_ptr_Function_int %x_195 %69
+        %239 = OpLoad %int %238
+        %240 = OpIAdd %int %239 %int_15
+        %241 = OpSLessThan %bool %78 %240
+               OpStore %x_231_phi %241
+               OpSelectionMerge %242 None
+               OpBranchConditional %241 %243 %242
+        %243 = OpLabel
+               OpStore %x_196 %236
+        %244 = OpAccessChain %_ptr_Function_int %x_196 %69
+        %245 = OpLoad %int %244
+        %246 = OpISub %int %245 %int_15
+        %247 = OpSGreaterThan %bool %78 %246
+               OpStore %x_230 %247
+        %248 = OpLoad %bool %x_230
+               OpStore %x_231_phi %248
+               OpBranch %242
+        %242 = OpLabel
+        %249 = OpLoad %bool %x_231_phi
+               OpSelectionMerge %250 None
+               OpBranchConditional %249 %251 %250
+        %251 = OpLabel
+               OpStore %x_197 %236
+        %252 = OpAccessChain %_ptr_Function_int %x_197 %69
+        %253 = OpLoad %int %252
+        %258 = OpISub %int %78 %253
+        %257 = OpConvertSToF %float %258
+        %255 = OpExtInst %float %256 FAbs %257
+        %259 = OpFSub %float %float_15 %255
+        %261 = OpFMul %float %259 %float_0_0666666701
+        %263 = OpCompositeConstruct %v4float %261 %261 %261 %float_1
+               OpStore %x_241 %263
+        %264 = OpLoad %v4float %x_241
+               OpStore %x_243_phi %264
+               OpStore %x_244_phi %true
+               OpBranch %63
+        %250 = OpLabel
+               OpStore %x_214_1 %68
+        %268 = OpAccessChain %_ptr_Function_int %x_214_1 %uint_1
+        %270 = OpIAdd %int %69 %int_1
+               OpStore %268 %270
+        %271 = OpLoad %v2int %x_214_1
+               OpBranch %64
+         %64 = OpLabel
+               OpStore %x_213_phi %271
+               OpBranch %62
+         %63 = OpLabel
+        %272 = OpLoad %v4float %x_243_phi
+               OpStore %x_243 %272
+        %273 = OpLoad %bool %x_244_phi
+        %274 = OpLoad %v4float %x_243
+               OpStore %x_246_phi %274
+               OpSelectionMerge %275 None
+               OpBranchConditional %273 %276 %275
+        %276 = OpLabel
+               OpBranch %59
+        %275 = OpLabel
+               OpStore %x_246_phi %277
+               OpBranch %59
+         %59 = OpLabel
+        %278 = OpLoad %v4float %x_246_phi
+               OpStore %x_GLF_color %278
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %279
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %283 = OpLabel
+        %284 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %284
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %286 = OpLabel
+        %287 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %287
+        %288 = OpFunctionCall %void %main_1
+        %290 = OpLoad %v4float %x_GLF_color
+        %291 = OpCompositeConstruct %main_out %290
+        %289 = OpFunctionCall %void %tint_symbol_3 %291
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composites/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-composites/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..bdc7096
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composites/0.spvasm.expected.wgsl
@@ -0,0 +1,94 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_195 : array<i32, 256>;
+  var x_196 : array<i32, 256>;
+  var x_197 : array<i32, 256>;
+  var x_209 : vec2<i32>;
+  var x_241 : vec4<f32>;
+  var x_243 : vec4<f32>;
+  var x_213_phi : vec2<i32>;
+  var x_243_phi : vec4<f32>;
+  var x_244_phi : bool;
+  var x_246_phi : vec4<f32>;
+  let x_198 : vec4<f32> = gl_FragCoord;
+  let x_201 : vec2<f32> = x_6.resolution;
+  let x_202 : vec2<f32> = (vec2<f32>(x_198.x, x_198.y) / x_201);
+  x_209 = vec2<i32>(i32((x_202.x * 256.0)), i32((x_202.y * 256.0)));
+  switch(0u) {
+    default: {
+      x_213_phi = x_209;
+      loop {
+        var x_230 : bool;
+        var x_231_phi : bool;
+        let x_213 : vec2<i32> = x_213_phi;
+        let x_216 : i32 = x_213.y;
+        x_243_phi = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+        x_244_phi = false;
+        if ((x_216 != 256)) {
+        } else {
+          break;
+        }
+        let x_220 : i32 = x_213.x;
+        x_195 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+        let x_222 : i32 = x_195[x_216];
+        let x_224 : bool = (x_220 < (x_222 + 15));
+        x_231_phi = x_224;
+        if (x_224) {
+          x_196 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+          let x_228 : i32 = x_196[x_216];
+          x_230 = (x_220 > (x_228 - 15));
+          x_231_phi = x_230;
+        }
+        let x_231 : bool = x_231_phi;
+        if (x_231) {
+          x_197 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+          let x_235 : i32 = x_197[x_216];
+          let x_240 : f32 = ((15.0 - abs(f32((x_220 - x_235)))) * 0.06666667);
+          x_241 = vec4<f32>(x_240, x_240, x_240, 1.0);
+          x_243_phi = x_241;
+          x_244_phi = true;
+          break;
+        }
+        var x_214_1 : vec2<i32> = x_213;
+        x_214_1.y = (x_216 + 1);
+        let x_214 : vec2<i32> = x_214_1;
+
+        continuing {
+          x_213_phi = x_214;
+        }
+      }
+      x_243 = x_243_phi;
+      let x_244 : bool = x_244_phi;
+      x_246_phi = x_243;
+      if (x_244) {
+        break;
+      }
+      x_246_phi = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+    }
+  }
+  let x_246 : vec4<f32> = x_246_phi;
+  x_GLF_color = x_246;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composites/0.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-composites/0.wgsl
new file mode 100644
index 0000000..bdc7096
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composites/0.wgsl
@@ -0,0 +1,94 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_195 : array<i32, 256>;
+  var x_196 : array<i32, 256>;
+  var x_197 : array<i32, 256>;
+  var x_209 : vec2<i32>;
+  var x_241 : vec4<f32>;
+  var x_243 : vec4<f32>;
+  var x_213_phi : vec2<i32>;
+  var x_243_phi : vec4<f32>;
+  var x_244_phi : bool;
+  var x_246_phi : vec4<f32>;
+  let x_198 : vec4<f32> = gl_FragCoord;
+  let x_201 : vec2<f32> = x_6.resolution;
+  let x_202 : vec2<f32> = (vec2<f32>(x_198.x, x_198.y) / x_201);
+  x_209 = vec2<i32>(i32((x_202.x * 256.0)), i32((x_202.y * 256.0)));
+  switch(0u) {
+    default: {
+      x_213_phi = x_209;
+      loop {
+        var x_230 : bool;
+        var x_231_phi : bool;
+        let x_213 : vec2<i32> = x_213_phi;
+        let x_216 : i32 = x_213.y;
+        x_243_phi = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+        x_244_phi = false;
+        if ((x_216 != 256)) {
+        } else {
+          break;
+        }
+        let x_220 : i32 = x_213.x;
+        x_195 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+        let x_222 : i32 = x_195[x_216];
+        let x_224 : bool = (x_220 < (x_222 + 15));
+        x_231_phi = x_224;
+        if (x_224) {
+          x_196 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+          let x_228 : i32 = x_196[x_216];
+          x_230 = (x_220 > (x_228 - 15));
+          x_231_phi = x_230;
+        }
+        let x_231 : bool = x_231_phi;
+        if (x_231) {
+          x_197 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+          let x_235 : i32 = x_197[x_216];
+          let x_240 : f32 = ((15.0 - abs(f32((x_220 - x_235)))) * 0.06666667);
+          x_241 = vec4<f32>(x_240, x_240, x_240, 1.0);
+          x_243_phi = x_241;
+          x_244_phi = true;
+          break;
+        }
+        var x_214_1 : vec2<i32> = x_213;
+        x_214_1.y = (x_216 + 1);
+        let x_214 : vec2<i32> = x_214_1;
+
+        continuing {
+          x_213_phi = x_214;
+        }
+      }
+      x_243 = x_243_phi;
+      let x_244 : bool = x_244_phi;
+      x_246_phi = x_243;
+      if (x_244) {
+        break;
+      }
+      x_246_phi = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+    }
+  }
+  let x_246 : vec4<f32> = x_246_phi;
+  x_GLF_color = x_246;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composites/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-composites/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..cd5825d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composites/0.wgsl.expected.hlsl
@@ -0,0 +1,97 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int x_195[256] = (int[256])0;
+  int x_196[256] = (int[256])0;
+  int x_197[256] = (int[256])0;
+  int2 x_209 = int2(0, 0);
+  float4 x_241 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 x_243 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int2 x_213_phi = int2(0, 0);
+  float4 x_243_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  bool x_244_phi = false;
+  float4 x_246_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  const float4 x_198 = gl_FragCoord;
+  const float2 x_201 = asfloat(x_6[0].xy);
+  const float2 x_202 = (float2(x_198.x, x_198.y) / x_201);
+  x_209 = int2(int((x_202.x * 256.0f)), int((x_202.y * 256.0f)));
+  switch(0u) {
+    default: {
+      x_213_phi = x_209;
+      while (true) {
+        bool x_230 = false;
+        bool x_231_phi = false;
+        const int2 x_213 = x_213_phi;
+        const int x_216 = x_213.y;
+        x_243_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        x_244_phi = false;
+        if ((x_216 != 256)) {
+        } else {
+          break;
+        }
+        const int x_220 = x_213.x;
+        const int tint_symbol_5[256] = {115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94};
+        x_195 = tint_symbol_5;
+        const int x_222 = x_195[x_216];
+        const bool x_224 = (x_220 < (x_222 + 15));
+        x_231_phi = x_224;
+        if (x_224) {
+          const int tint_symbol_6[256] = {115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94};
+          x_196 = tint_symbol_6;
+          const int x_228 = x_196[x_216];
+          x_230 = (x_220 > (x_228 - 15));
+          x_231_phi = x_230;
+        }
+        if (x_231_phi) {
+          const int tint_symbol_7[256] = {115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94};
+          x_197 = tint_symbol_7;
+          const int x_235 = x_197[x_216];
+          const float x_240 = ((15.0f - abs(float((x_220 - x_235)))) * 0.06666667f);
+          x_241 = float4(x_240, x_240, x_240, 1.0f);
+          x_243_phi = x_241;
+          x_244_phi = true;
+          break;
+        }
+        int2 x_214_1 = x_213;
+        x_214_1.y = (x_216 + 1);
+        const int2 x_214 = x_214_1;
+        {
+          x_213_phi = x_214;
+        }
+      }
+      x_243 = x_243_phi;
+      const bool x_244 = x_244_phi;
+      x_246_phi = x_243;
+      if (x_244) {
+        break;
+      }
+      x_246_phi = float4(0.0f, 0.0f, 0.0f, 1.0f);
+      break;
+    }
+  }
+  x_GLF_color = x_246_phi;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_8 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_8;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composites/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-composites/0.wgsl.expected.msl
new file mode 100644
index 0000000..4c8e613
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composites/0.wgsl.expected.msl
@@ -0,0 +1,101 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  int arr[256];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_8, thread float4* const tint_symbol_9) {
+  tint_array_wrapper x_195 = {};
+  tint_array_wrapper x_196 = {};
+  tint_array_wrapper x_197 = {};
+  int2 x_209 = 0;
+  float4 x_241 = 0.0f;
+  float4 x_243 = 0.0f;
+  int2 x_213_phi = 0;
+  float4 x_243_phi = 0.0f;
+  bool x_244_phi = false;
+  float4 x_246_phi = 0.0f;
+  float4 const x_198 = *(tint_symbol_8);
+  float2 const x_201 = x_6.resolution;
+  float2 const x_202 = (float2(x_198.x, x_198.y) / x_201);
+  x_209 = int2(int((x_202.x * 256.0f)), int((x_202.y * 256.0f)));
+  switch(0u) {
+    default: {
+      x_213_phi = x_209;
+      while (true) {
+        bool x_230 = false;
+        bool x_231_phi = false;
+        int2 const x_213 = x_213_phi;
+        int const x_216 = x_213.y;
+        x_243_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        x_244_phi = false;
+        if ((x_216 != 256)) {
+        } else {
+          break;
+        }
+        int const x_220 = x_213.x;
+        tint_array_wrapper const tint_symbol_4 = {.arr={115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94}};
+        x_195 = tint_symbol_4;
+        int const x_222 = x_195.arr[x_216];
+        bool const x_224 = (x_220 < (x_222 + 15));
+        x_231_phi = x_224;
+        if (x_224) {
+          tint_array_wrapper const tint_symbol_5 = {.arr={115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94}};
+          x_196 = tint_symbol_5;
+          int const x_228 = x_196.arr[x_216];
+          x_230 = (x_220 > (x_228 - 15));
+          x_231_phi = x_230;
+        }
+        bool const x_231 = x_231_phi;
+        if (x_231) {
+          tint_array_wrapper const tint_symbol_6 = {.arr={115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94}};
+          x_197 = tint_symbol_6;
+          int const x_235 = x_197.arr[x_216];
+          float const x_240 = ((15.0f - fabs(float((x_220 - x_235)))) * 0.06666667f);
+          x_241 = float4(x_240, x_240, x_240, 1.0f);
+          x_243_phi = x_241;
+          x_244_phi = true;
+          break;
+        }
+        int2 x_214_1 = x_213;
+        x_214_1.y = (x_216 + 1);
+        int2 const x_214 = x_214_1;
+        {
+          x_213_phi = x_214;
+        }
+      }
+      x_243 = x_243_phi;
+      bool const x_244 = x_244_phi;
+      x_246_phi = x_243;
+      if (x_244) {
+        break;
+      }
+      x_246_phi = float4(0.0f, 0.0f, 0.0f, 1.0f);
+      break;
+    }
+  }
+  float4 const x_246 = x_246_phi;
+  *(tint_symbol_9) = x_246;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_10 = 0.0f;
+  thread float4 tint_symbol_11 = 0.0f;
+  tint_symbol_10 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_10), &(tint_symbol_11));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_11};
+  tint_symbol_2 const tint_symbol_7 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_7;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composites/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-composites/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..4a43cab
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composites/0.wgsl.expected.spvasm
@@ -0,0 +1,384 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 292
+; Schema: 0
+               OpCapability Shader
+        %256 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %x_195 "x_195"
+               OpName %x_196 "x_196"
+               OpName %x_197 "x_197"
+               OpName %x_209 "x_209"
+               OpName %x_241 "x_241"
+               OpName %x_243 "x_243"
+               OpName %x_213_phi "x_213_phi"
+               OpName %x_243_phi "x_243_phi"
+               OpName %x_244_phi "x_244_phi"
+               OpName %x_246_phi "x_246_phi"
+               OpName %x_230 "x_230"
+               OpName %x_231_phi "x_231_phi"
+               OpName %x_214_1 "x_214_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_int_uint_256 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+   %uint_256 = OpConstant %uint 256
+%_arr_int_uint_256 = OpTypeArray %int %uint_256
+%_ptr_Function__arr_int_uint_256 = OpTypePointer Function %_arr_int_uint_256
+         %25 = OpConstantNull %_arr_int_uint_256
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %31 = OpConstantNull %v2int
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %40 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+  %float_256 = OpConstant %float 256
+    %float_0 = OpConstant %float 0
+         %71 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+      %false = OpConstantFalse %bool
+    %int_256 = OpConstant %int 256
+    %int_115 = OpConstant %int 115
+    %int_133 = OpConstant %int 133
+    %int_150 = OpConstant %int 150
+    %int_164 = OpConstant %int 164
+    %int_176 = OpConstant %int 176
+    %int_184 = OpConstant %int 184
+    %int_190 = OpConstant %int 190
+    %int_192 = OpConstant %int 192
+    %int_191 = OpConstant %int 191
+    %int_187 = OpConstant %int 187
+    %int_181 = OpConstant %int 181
+    %int_172 = OpConstant %int 172
+    %int_163 = OpConstant %int 163
+    %int_153 = OpConstant %int 153
+    %int_143 = OpConstant %int 143
+    %int_134 = OpConstant %int 134
+    %int_126 = OpConstant %int 126
+    %int_120 = OpConstant %int 120
+    %int_116 = OpConstant %int 116
+    %int_114 = OpConstant %int 114
+    %int_117 = OpConstant %int 117
+    %int_121 = OpConstant %int 121
+    %int_127 = OpConstant %int 127
+    %int_141 = OpConstant %int 141
+    %int_148 = OpConstant %int 148
+    %int_154 = OpConstant %int 154
+    %int_159 = OpConstant %int 159
+    %int_162 = OpConstant %int 162
+    %int_161 = OpConstant %int 161
+    %int_157 = OpConstant %int 157
+    %int_151 = OpConstant %int 151
+    %int_124 = OpConstant %int 124
+    %int_113 = OpConstant %int 113
+    %int_103 = OpConstant %int 103
+     %int_94 = OpConstant %int 94
+     %int_87 = OpConstant %int 87
+     %int_82 = OpConstant %int 82
+     %int_79 = OpConstant %int 79
+     %int_80 = OpConstant %int 80
+     %int_84 = OpConstant %int 84
+     %int_91 = OpConstant %int 91
+    %int_101 = OpConstant %int 101
+    %int_130 = OpConstant %int 130
+    %int_146 = OpConstant %int 146
+    %int_182 = OpConstant %int 182
+    %int_199 = OpConstant %int 199
+    %int_215 = OpConstant %int 215
+    %int_229 = OpConstant %int 229
+    %int_240 = OpConstant %int 240
+    %int_249 = OpConstant %int 249
+    %int_254 = OpConstant %int 254
+    %int_250 = OpConstant %int 250
+    %int_243 = OpConstant %int 243
+    %int_233 = OpConstant %int 233
+    %int_223 = OpConstant %int 223
+    %int_212 = OpConstant %int 212
+    %int_200 = OpConstant %int 200
+    %int_180 = OpConstant %int 180
+    %int_166 = OpConstant %int 166
+    %int_169 = OpConstant %int 169
+    %int_174 = OpConstant %int 174
+    %int_179 = OpConstant %int 179
+    %int_185 = OpConstant %int 185
+    %int_193 = OpConstant %int 193
+    %int_195 = OpConstant %int 195
+    %int_188 = OpConstant %int 188
+    %int_171 = OpConstant %int 171
+    %int_149 = OpConstant %int 149
+    %int_137 = OpConstant %int 137
+    %int_125 = OpConstant %int 125
+    %int_105 = OpConstant %int 105
+     %int_97 = OpConstant %int 97
+     %int_93 = OpConstant %int 93
+     %int_98 = OpConstant %int 98
+    %int_106 = OpConstant %int 106
+    %int_145 = OpConstant %int 145
+    %int_177 = OpConstant %int 177
+    %int_208 = OpConstant %int 208
+    %int_221 = OpConstant %int 221
+    %int_231 = OpConstant %int 231
+    %int_239 = OpConstant %int 239
+    %int_244 = OpConstant %int 244
+    %int_242 = OpConstant %int 242
+    %int_236 = OpConstant %int 236
+    %int_228 = OpConstant %int 228
+    %int_218 = OpConstant %int 218
+    %int_207 = OpConstant %int 207
+    %int_194 = OpConstant %int 194
+    %int_158 = OpConstant %int 158
+    %int_135 = OpConstant %int 135
+    %int_132 = OpConstant %int 132
+    %int_131 = OpConstant %int 131
+    %int_138 = OpConstant %int 138
+    %int_147 = OpConstant %int 147
+    %int_155 = OpConstant %int 155
+    %int_152 = OpConstant %int 152
+    %int_139 = OpConstant %int 139
+    %int_129 = OpConstant %int 129
+    %int_118 = OpConstant %int 118
+     %int_68 = OpConstant %int 68
+     %int_58 = OpConstant %int 58
+     %int_49 = OpConstant %int 49
+     %int_43 = OpConstant %int 43
+     %int_40 = OpConstant %int 40
+     %int_41 = OpConstant %int 41
+     %int_44 = OpConstant %int 44
+     %int_51 = OpConstant %int 51
+     %int_61 = OpConstant %int 61
+     %int_73 = OpConstant %int 73
+    %int_119 = OpConstant %int 119
+    %int_173 = OpConstant %int 173
+    %int_186 = OpConstant %int 186
+    %int_128 = OpConstant %int 128
+    %int_104 = OpConstant %int 104
+     %int_86 = OpConstant %int 86
+     %int_81 = OpConstant %int 81
+     %int_77 = OpConstant %int 77
+     %int_76 = OpConstant %int 76
+     %int_89 = OpConstant %int 89
+    %int_102 = OpConstant %int 102
+     %int_92 = OpConstant %int 92
+     %int_83 = OpConstant %int 83
+     %int_62 = OpConstant %int 62
+     %int_50 = OpConstant %int 50
+     %int_38 = OpConstant %int 38
+     %int_26 = OpConstant %int 26
+     %int_16 = OpConstant %int 16
+      %int_8 = OpConstant %int 8
+      %int_2 = OpConstant %int 2
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+     %int_11 = OpConstant %int 11
+     %int_21 = OpConstant %int 21
+     %int_33 = OpConstant %int 33
+     %int_48 = OpConstant %int 48
+     %int_64 = OpConstant %int 64
+    %int_144 = OpConstant %int 144
+    %int_123 = OpConstant %int 123
+    %int_112 = OpConstant %int 112
+    %int_100 = OpConstant %int 100
+     %int_90 = OpConstant %int 90
+     %int_65 = OpConstant %int 65
+     %int_67 = OpConstant %int 67
+     %int_70 = OpConstant %int 70
+     %int_75 = OpConstant %int 75
+     %int_95 = OpConstant %int 95
+     %int_88 = OpConstant %int 88
+     %int_69 = OpConstant %int 69
+     %int_47 = OpConstant %int 47
+     %int_36 = OpConstant %int 36
+     %int_18 = OpConstant %int 18
+     %int_13 = OpConstant %int 13
+     %int_15 = OpConstant %int 15
+     %int_22 = OpConstant %int 22
+     %int_32 = OpConstant %int 32
+     %int_45 = OpConstant %int 45
+     %int_60 = OpConstant %int 60
+        %236 = OpConstantComposite %_arr_int_uint_256 %int_115 %int_133 %int_150 %int_164 %int_176 %int_184 %int_190 %int_192 %int_191 %int_187 %int_181 %int_172 %int_163 %int_153 %int_143 %int_134 %int_126 %int_120 %int_116 %int_114 %int_114 %int_117 %int_121 %int_127 %int_134 %int_141 %int_148 %int_154 %int_159 %int_162 %int_163 %int_161 %int_157 %int_151 %int_143 %int_134 %int_124 %int_113 %int_103 %int_94 %int_87 %int_82 %int_79 %int_80 %int_84 %int_91 %int_101 %int_114 %int_130 %int_146 %int_164 %int_182 %int_199 %int_215 %int_229 %int_240 %int_249 %int_254 %int_256 %int_254 %int_250 %int_243 %int_233 %int_223 %int_212 %int_200 %int_190 %int_180 %int_172 %int_166 %int_163 %int_161 %int_162 %int_164 %int_169 %int_174 %int_179 %int_185 %int_190 %int_193 %int_195 %int_195 %int_192 %int_188 %int_180 %int_171 %int_161 %int_149 %int_137 %int_125 %int_114 %int_105 %int_97 %int_93 %int_91 %int_93 %int_98 %int_106 %int_117 %int_130 %int_145 %int_161 %int_177 %int_193 %int_208 %int_221 %int_231 %int_239 %int_243 %int_244 %int_242 %int_236 %int_228 %int_218 %int_207 %int_194 %int_181 %int_169 %int_158 %int_148 %int_141 %int_135 %int_132 %int_131 %int_132 %int_135 %int_138 %int_143 %int_147 %int_151 %int_154 %int_155 %int_155 %int_152 %int_146 %int_139 %int_129 %int_118 %int_106 %int_93 %int_80 %int_68 %int_58 %int_49 %int_43 %int_40 %int_41 %int_44 %int_51 %int_61 %int_73 %int_87 %int_103 %int_119 %int_134 %int_149 %int_162 %int_173 %int_181 %int_186 %int_188 %int_186 %int_181 %int_174 %int_164 %int_153 %int_141 %int_128 %int_116 %int_104 %int_94 %int_86 %int_81 %int_77 %int_76 %int_77 %int_80 %int_84 %int_89 %int_94 %int_98 %int_102 %int_104 %int_104 %int_102 %int_98 %int_92 %int_83 %int_73 %int_62 %int_50 %int_38 %int_26 %int_16 %int_8 %int_2 %int_0 %int_0 %int_4 %int_11 %int_21 %int_33 %int_48 %int_64 %int_81 %int_98 %int_114 %int_129 %int_141 %int_151 %int_158 %int_161 %int_161 %int_158 %int_152 %int_144 %int_134 %int_123 %int_112 %int_100 %int_90 %int_81 %int_73 %int_68 %int_65 %int_65 %int_67 %int_70 %int_75 %int_81 %int_87 %int_92 %int_97 %int_101 %int_103 %int_102 %int_100 %int_95 %int_88 %int_79 %int_69 %int_58 %int_47 %int_36 %int_26 %int_18 %int_13 %int_11 %int_11 %int_15 %int_22 %int_32 %int_45 %int_60 %int_77 %int_94
+%_ptr_Function_int = OpTypePointer Function %int
+   %float_15 = OpConstant %float 15
+%float_0_0666666701 = OpConstant %float 0.0666666701
+    %float_1 = OpConstant %float 1
+       %true = OpConstantTrue %bool
+     %uint_1 = OpConstant %uint 1
+      %int_1 = OpConstant %int 1
+        %277 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %279 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+      %x_195 = OpVariable %_ptr_Function__arr_int_uint_256 Function %25
+      %x_196 = OpVariable %_ptr_Function__arr_int_uint_256 Function %25
+      %x_197 = OpVariable %_ptr_Function__arr_int_uint_256 Function %25
+      %x_209 = OpVariable %_ptr_Function_v2int Function %31
+      %x_241 = OpVariable %_ptr_Function_v4float Function %5
+      %x_243 = OpVariable %_ptr_Function_v4float Function %5
+  %x_213_phi = OpVariable %_ptr_Function_v2int Function %31
+  %x_243_phi = OpVariable %_ptr_Function_v4float Function %5
+  %x_244_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_246_phi = OpVariable %_ptr_Function_v4float Function %5
+      %x_230 = OpVariable %_ptr_Function_bool Function %40
+  %x_231_phi = OpVariable %_ptr_Function_bool Function %40
+    %x_214_1 = OpVariable %_ptr_Function_v2int Function %31
+         %42 = OpLoad %v4float %gl_FragCoord
+         %45 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %46 = OpLoad %v2float %45
+         %47 = OpCompositeExtract %float %42 0
+         %48 = OpCompositeExtract %float %42 1
+         %49 = OpCompositeConstruct %v2float %47 %48
+         %50 = OpFDiv %v2float %49 %46
+         %52 = OpCompositeExtract %float %50 0
+         %54 = OpFMul %float %52 %float_256
+         %51 = OpConvertFToS %int %54
+         %56 = OpCompositeExtract %float %50 1
+         %57 = OpFMul %float %56 %float_256
+         %55 = OpConvertFToS %int %57
+         %58 = OpCompositeConstruct %v2int %51 %55
+               OpStore %x_209 %58
+               OpSelectionMerge %59 None
+               OpSwitch %uint_0 %60
+         %60 = OpLabel
+         %61 = OpLoad %v2int %x_209
+               OpStore %x_213_phi %61
+               OpBranch %62
+         %62 = OpLabel
+               OpLoopMerge %63 %64 None
+               OpBranch %65
+         %65 = OpLabel
+         %68 = OpLoad %v2int %x_213_phi
+         %69 = OpCompositeExtract %int %68 1
+               OpStore %x_243_phi %71
+               OpStore %x_244_phi %false
+         %74 = OpINotEqual %bool %69 %int_256
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %77
+         %76 = OpLabel
+               OpBranch %75
+         %77 = OpLabel
+               OpBranch %63
+         %75 = OpLabel
+         %78 = OpCompositeExtract %int %68 0
+               OpStore %x_195 %236
+        %238 = OpAccessChain %_ptr_Function_int %x_195 %69
+        %239 = OpLoad %int %238
+        %240 = OpIAdd %int %239 %int_15
+        %241 = OpSLessThan %bool %78 %240
+               OpStore %x_231_phi %241
+               OpSelectionMerge %242 None
+               OpBranchConditional %241 %243 %242
+        %243 = OpLabel
+               OpStore %x_196 %236
+        %244 = OpAccessChain %_ptr_Function_int %x_196 %69
+        %245 = OpLoad %int %244
+        %246 = OpISub %int %245 %int_15
+        %247 = OpSGreaterThan %bool %78 %246
+               OpStore %x_230 %247
+        %248 = OpLoad %bool %x_230
+               OpStore %x_231_phi %248
+               OpBranch %242
+        %242 = OpLabel
+        %249 = OpLoad %bool %x_231_phi
+               OpSelectionMerge %250 None
+               OpBranchConditional %249 %251 %250
+        %251 = OpLabel
+               OpStore %x_197 %236
+        %252 = OpAccessChain %_ptr_Function_int %x_197 %69
+        %253 = OpLoad %int %252
+        %258 = OpISub %int %78 %253
+        %257 = OpConvertSToF %float %258
+        %255 = OpExtInst %float %256 FAbs %257
+        %259 = OpFSub %float %float_15 %255
+        %261 = OpFMul %float %259 %float_0_0666666701
+        %263 = OpCompositeConstruct %v4float %261 %261 %261 %float_1
+               OpStore %x_241 %263
+        %264 = OpLoad %v4float %x_241
+               OpStore %x_243_phi %264
+               OpStore %x_244_phi %true
+               OpBranch %63
+        %250 = OpLabel
+               OpStore %x_214_1 %68
+        %268 = OpAccessChain %_ptr_Function_int %x_214_1 %uint_1
+        %270 = OpIAdd %int %69 %int_1
+               OpStore %268 %270
+        %271 = OpLoad %v2int %x_214_1
+               OpBranch %64
+         %64 = OpLabel
+               OpStore %x_213_phi %271
+               OpBranch %62
+         %63 = OpLabel
+        %272 = OpLoad %v4float %x_243_phi
+               OpStore %x_243 %272
+        %273 = OpLoad %bool %x_244_phi
+        %274 = OpLoad %v4float %x_243
+               OpStore %x_246_phi %274
+               OpSelectionMerge %275 None
+               OpBranchConditional %273 %276 %275
+        %276 = OpLabel
+               OpBranch %59
+        %275 = OpLabel
+               OpStore %x_246_phi %277
+               OpBranch %59
+         %59 = OpLabel
+        %278 = OpLoad %v4float %x_246_phi
+               OpStore %x_GLF_color %278
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %279
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %283 = OpLabel
+        %284 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %284
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %286 = OpLabel
+        %287 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %287
+        %288 = OpFunctionCall %void %main_1
+        %290 = OpLoad %v4float %x_GLF_color
+        %291 = OpCompositeConstruct %main_out %290
+        %289 = OpFunctionCall %void %tint_symbol_3 %291
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composites/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-composites/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..bdc7096
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composites/0.wgsl.expected.wgsl
@@ -0,0 +1,94 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_195 : array<i32, 256>;
+  var x_196 : array<i32, 256>;
+  var x_197 : array<i32, 256>;
+  var x_209 : vec2<i32>;
+  var x_241 : vec4<f32>;
+  var x_243 : vec4<f32>;
+  var x_213_phi : vec2<i32>;
+  var x_243_phi : vec4<f32>;
+  var x_244_phi : bool;
+  var x_246_phi : vec4<f32>;
+  let x_198 : vec4<f32> = gl_FragCoord;
+  let x_201 : vec2<f32> = x_6.resolution;
+  let x_202 : vec2<f32> = (vec2<f32>(x_198.x, x_198.y) / x_201);
+  x_209 = vec2<i32>(i32((x_202.x * 256.0)), i32((x_202.y * 256.0)));
+  switch(0u) {
+    default: {
+      x_213_phi = x_209;
+      loop {
+        var x_230 : bool;
+        var x_231_phi : bool;
+        let x_213 : vec2<i32> = x_213_phi;
+        let x_216 : i32 = x_213.y;
+        x_243_phi = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+        x_244_phi = false;
+        if ((x_216 != 256)) {
+        } else {
+          break;
+        }
+        let x_220 : i32 = x_213.x;
+        x_195 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+        let x_222 : i32 = x_195[x_216];
+        let x_224 : bool = (x_220 < (x_222 + 15));
+        x_231_phi = x_224;
+        if (x_224) {
+          x_196 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+          let x_228 : i32 = x_196[x_216];
+          x_230 = (x_220 > (x_228 - 15));
+          x_231_phi = x_230;
+        }
+        let x_231 : bool = x_231_phi;
+        if (x_231) {
+          x_197 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+          let x_235 : i32 = x_197[x_216];
+          let x_240 : f32 = ((15.0 - abs(f32((x_220 - x_235)))) * 0.06666667);
+          x_241 = vec4<f32>(x_240, x_240, x_240, 1.0);
+          x_243_phi = x_241;
+          x_244_phi = true;
+          break;
+        }
+        var x_214_1 : vec2<i32> = x_213;
+        x_214_1.y = (x_216 + 1);
+        let x_214 : vec2<i32> = x_214_1;
+
+        continuing {
+          x_213_phi = x_214;
+        }
+      }
+      x_243 = x_243_phi;
+      let x_244 : bool = x_244_phi;
+      x_246_phi = x_243;
+      if (x_244) {
+        break;
+      }
+      x_246_phi = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+    }
+  }
+  let x_246 : vec4<f32> = x_246_phi;
+  x_GLF_color = x_246;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composites/1.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-composites/1.spvasm
new file mode 100644
index 0000000..80382f4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composites/1.spvasm
@@ -0,0 +1,293 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+       %uint = OpTypeInt 32 0
+%_ptr_Function_int = OpTypePointer Function %int
+    %int_256 = OpConstant %int 256
+       %bool = OpTypeBool
+     %uint_0 = OpConstant %uint 0
+   %uint_256 = OpConstant %uint 256
+%_arr_int_uint_256 = OpTypeArray %int %uint_256
+    %int_115 = OpConstant %int 115
+    %int_133 = OpConstant %int 133
+    %int_150 = OpConstant %int 150
+    %int_164 = OpConstant %int 164
+    %int_176 = OpConstant %int 176
+    %int_184 = OpConstant %int 184
+    %int_190 = OpConstant %int 190
+    %int_192 = OpConstant %int 192
+    %int_191 = OpConstant %int 191
+    %int_187 = OpConstant %int 187
+    %int_181 = OpConstant %int 181
+    %int_172 = OpConstant %int 172
+    %int_163 = OpConstant %int 163
+    %int_153 = OpConstant %int 153
+    %int_143 = OpConstant %int 143
+    %int_134 = OpConstant %int 134
+    %int_126 = OpConstant %int 126
+    %int_120 = OpConstant %int 120
+    %int_116 = OpConstant %int 116
+    %int_114 = OpConstant %int 114
+    %int_117 = OpConstant %int 117
+    %int_121 = OpConstant %int 121
+    %int_127 = OpConstant %int 127
+    %int_141 = OpConstant %int 141
+    %int_148 = OpConstant %int 148
+    %int_154 = OpConstant %int 154
+    %int_159 = OpConstant %int 159
+    %int_162 = OpConstant %int 162
+    %int_161 = OpConstant %int 161
+    %int_157 = OpConstant %int 157
+    %int_151 = OpConstant %int 151
+    %int_124 = OpConstant %int 124
+    %int_113 = OpConstant %int 113
+    %int_103 = OpConstant %int 103
+     %int_94 = OpConstant %int 94
+     %int_87 = OpConstant %int 87
+     %int_82 = OpConstant %int 82
+     %int_79 = OpConstant %int 79
+     %int_80 = OpConstant %int 80
+     %int_84 = OpConstant %int 84
+     %int_91 = OpConstant %int 91
+    %int_101 = OpConstant %int 101
+    %int_130 = OpConstant %int 130
+    %int_146 = OpConstant %int 146
+    %int_182 = OpConstant %int 182
+    %int_199 = OpConstant %int 199
+    %int_215 = OpConstant %int 215
+    %int_229 = OpConstant %int 229
+    %int_240 = OpConstant %int 240
+    %int_249 = OpConstant %int 249
+    %int_254 = OpConstant %int 254
+    %int_250 = OpConstant %int 250
+    %int_243 = OpConstant %int 243
+    %int_233 = OpConstant %int 233
+    %int_223 = OpConstant %int 223
+    %int_212 = OpConstant %int 212
+    %int_200 = OpConstant %int 200
+    %int_180 = OpConstant %int 180
+    %int_166 = OpConstant %int 166
+    %int_169 = OpConstant %int 169
+    %int_174 = OpConstant %int 174
+    %int_179 = OpConstant %int 179
+    %int_185 = OpConstant %int 185
+    %int_193 = OpConstant %int 193
+    %int_195 = OpConstant %int 195
+    %int_188 = OpConstant %int 188
+    %int_171 = OpConstant %int 171
+    %int_149 = OpConstant %int 149
+    %int_137 = OpConstant %int 137
+    %int_125 = OpConstant %int 125
+    %int_105 = OpConstant %int 105
+     %int_97 = OpConstant %int 97
+     %int_93 = OpConstant %int 93
+     %int_98 = OpConstant %int 98
+    %int_106 = OpConstant %int 106
+    %int_145 = OpConstant %int 145
+    %int_177 = OpConstant %int 177
+    %int_208 = OpConstant %int 208
+    %int_221 = OpConstant %int 221
+    %int_231 = OpConstant %int 231
+    %int_239 = OpConstant %int 239
+    %int_244 = OpConstant %int 244
+    %int_242 = OpConstant %int 242
+    %int_236 = OpConstant %int 236
+    %int_228 = OpConstant %int 228
+    %int_218 = OpConstant %int 218
+    %int_207 = OpConstant %int 207
+    %int_194 = OpConstant %int 194
+    %int_158 = OpConstant %int 158
+    %int_135 = OpConstant %int 135
+    %int_132 = OpConstant %int 132
+    %int_131 = OpConstant %int 131
+    %int_138 = OpConstant %int 138
+    %int_147 = OpConstant %int 147
+    %int_155 = OpConstant %int 155
+    %int_152 = OpConstant %int 152
+    %int_139 = OpConstant %int 139
+    %int_129 = OpConstant %int 129
+    %int_118 = OpConstant %int 118
+     %int_68 = OpConstant %int 68
+     %int_58 = OpConstant %int 58
+     %int_49 = OpConstant %int 49
+     %int_43 = OpConstant %int 43
+     %int_40 = OpConstant %int 40
+     %int_41 = OpConstant %int 41
+     %int_44 = OpConstant %int 44
+     %int_51 = OpConstant %int 51
+     %int_61 = OpConstant %int 61
+     %int_73 = OpConstant %int 73
+    %int_119 = OpConstant %int 119
+    %int_173 = OpConstant %int 173
+    %int_186 = OpConstant %int 186
+    %int_128 = OpConstant %int 128
+    %int_104 = OpConstant %int 104
+     %int_86 = OpConstant %int 86
+     %int_81 = OpConstant %int 81
+     %int_77 = OpConstant %int 77
+     %int_76 = OpConstant %int 76
+     %int_89 = OpConstant %int 89
+    %int_102 = OpConstant %int 102
+     %int_92 = OpConstant %int 92
+     %int_83 = OpConstant %int 83
+     %int_62 = OpConstant %int 62
+     %int_50 = OpConstant %int 50
+     %int_38 = OpConstant %int 38
+     %int_26 = OpConstant %int 26
+     %int_16 = OpConstant %int 16
+      %int_8 = OpConstant %int 8
+      %int_2 = OpConstant %int 2
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+     %int_11 = OpConstant %int 11
+     %int_21 = OpConstant %int 21
+     %int_33 = OpConstant %int 33
+     %int_48 = OpConstant %int 48
+     %int_64 = OpConstant %int 64
+    %int_144 = OpConstant %int 144
+    %int_123 = OpConstant %int 123
+    %int_112 = OpConstant %int 112
+    %int_100 = OpConstant %int 100
+     %int_90 = OpConstant %int 90
+     %int_65 = OpConstant %int 65
+     %int_67 = OpConstant %int 67
+     %int_70 = OpConstant %int 70
+     %int_75 = OpConstant %int 75
+     %int_95 = OpConstant %int 95
+     %int_88 = OpConstant %int 88
+     %int_69 = OpConstant %int 69
+     %int_47 = OpConstant %int 47
+     %int_36 = OpConstant %int 36
+     %int_18 = OpConstant %int 18
+     %int_13 = OpConstant %int 13
+     %int_15 = OpConstant %int 15
+     %int_22 = OpConstant %int 22
+     %int_32 = OpConstant %int 32
+     %int_45 = OpConstant %int 45
+     %int_60 = OpConstant %int 60
+        %177 = OpConstantComposite %_arr_int_uint_256 %int_115 %int_133 %int_150 %int_164 %int_176 %int_184 %int_190 %int_192 %int_191 %int_187 %int_181 %int_172 %int_163 %int_153 %int_143 %int_134 %int_126 %int_120 %int_116 %int_114 %int_114 %int_117 %int_121 %int_127 %int_134 %int_141 %int_148 %int_154 %int_159 %int_162 %int_163 %int_161 %int_157 %int_151 %int_143 %int_134 %int_124 %int_113 %int_103 %int_94 %int_87 %int_82 %int_79 %int_80 %int_84 %int_91 %int_101 %int_114 %int_130 %int_146 %int_164 %int_182 %int_199 %int_215 %int_229 %int_240 %int_249 %int_254 %int_256 %int_254 %int_250 %int_243 %int_233 %int_223 %int_212 %int_200 %int_190 %int_180 %int_172 %int_166 %int_163 %int_161 %int_162 %int_164 %int_169 %int_174 %int_179 %int_185 %int_190 %int_193 %int_195 %int_195 %int_192 %int_188 %int_180 %int_171 %int_161 %int_149 %int_137 %int_125 %int_114 %int_105 %int_97 %int_93 %int_91 %int_93 %int_98 %int_106 %int_117 %int_130 %int_145 %int_161 %int_177 %int_193 %int_208 %int_221 %int_231 %int_239 %int_243 %int_244 %int_242 %int_236 %int_228 %int_218 %int_207 %int_194 %int_181 %int_169 %int_158 %int_148 %int_141 %int_135 %int_132 %int_131 %int_132 %int_135 %int_138 %int_143 %int_147 %int_151 %int_154 %int_155 %int_155 %int_152 %int_146 %int_139 %int_129 %int_118 %int_106 %int_93 %int_80 %int_68 %int_58 %int_49 %int_43 %int_40 %int_41 %int_44 %int_51 %int_61 %int_73 %int_87 %int_103 %int_119 %int_134 %int_149 %int_162 %int_173 %int_181 %int_186 %int_188 %int_186 %int_181 %int_174 %int_164 %int_153 %int_141 %int_128 %int_116 %int_104 %int_94 %int_86 %int_81 %int_77 %int_76 %int_77 %int_80 %int_84 %int_89 %int_94 %int_98 %int_102 %int_104 %int_104 %int_102 %int_98 %int_92 %int_83 %int_73 %int_62 %int_50 %int_38 %int_26 %int_16 %int_8 %int_2 %int_0 %int_0 %int_4 %int_11 %int_21 %int_33 %int_48 %int_64 %int_81 %int_98 %int_114 %int_129 %int_141 %int_151 %int_158 %int_161 %int_161 %int_158 %int_152 %int_144 %int_134 %int_123 %int_112 %int_100 %int_90 %int_81 %int_73 %int_68 %int_65 %int_65 %int_67 %int_70 %int_75 %int_81 %int_87 %int_92 %int_97 %int_101 %int_103 %int_102 %int_100 %int_95 %int_88 %int_79 %int_69 %int_58 %int_47 %int_36 %int_26 %int_18 %int_13 %int_11 %int_11 %int_15 %int_22 %int_32 %int_45 %int_60 %int_77 %int_94
+%_ptr_Function__arr_int_uint_256 = OpTypePointer Function %_arr_int_uint_256
+   %float_15 = OpConstant %float 15
+    %float_1 = OpConstant %float 1
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+        %183 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+    %v2float = OpTypeVector %float 2
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+  %float_256 = OpConstant %float 256
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+      %false = OpConstantFalse %bool
+       %true = OpConstantTrue %bool
+        %192 = OpUndef %v4float
+%float_0_0666666701 = OpConstant %float 0.0666666701
+       %main = OpFunction %void None %8
+        %194 = OpLabel
+        %195 = OpVariable %_ptr_Function__arr_int_uint_256 Function
+        %196 = OpVariable %_ptr_Function__arr_int_uint_256 Function
+        %197 = OpVariable %_ptr_Function__arr_int_uint_256 Function
+        %198 = OpLoad %v4float %gl_FragCoord
+        %199 = OpVectorShuffle %v2float %198 %198 0 1
+        %200 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+        %201 = OpLoad %v2float %200
+        %202 = OpFDiv %v2float %199 %201
+        %203 = OpCompositeConstruct %v4float %201 %float_15 %float_15
+        %204 = OpSNegate %int %int_82
+        %205 = OpCompositeExtract %float %202 0
+        %206 = OpFMul %float %205 %float_256
+        %207 = OpCompositeExtract %float %203 2
+        %208 = OpCompositeConstruct %v2float %float_0 %207
+        %209 = OpISub %int %int_120 %int_0
+        %210 = OpConvertFToS %int %206
+        %211 = OpCompositeExtract %float %202 1
+        %212 = OpFMul %float %211 %float_256
+        %213 = OpConvertFToS %int %212
+        %214 = OpCompositeConstruct %v2int %210 %213
+               OpSelectionMerge %215 None
+               OpSwitch %uint_0 %216
+        %216 = OpLabel
+               OpBranch %217
+        %217 = OpLabel
+        %218 = OpPhi %v2int %214 %216 %219 %220
+        %221 = OpCompositeExtract %int %218 1
+        %222 = OpINotEqual %bool %221 %int_256
+               OpLoopMerge %223 %220 None
+               OpBranchConditional %222 %224 %223
+        %224 = OpLabel
+        %225 = OpCompositeExtract %int %218 0
+               OpStore %195 %177
+        %226 = OpAccessChain %_ptr_Function_int %195 %221
+        %227 = OpLoad %int %226
+        %228 = OpIAdd %int %227 %int_15
+        %229 = OpSLessThan %bool %225 %228
+               OpSelectionMerge %230 None
+               OpBranchConditional %229 %231 %230
+        %231 = OpLabel
+               OpStore %196 %177
+        %232 = OpAccessChain %_ptr_Function_int %196 %221
+        %233 = OpLoad %int %232
+        %234 = OpISub %int %233 %int_15
+        %235 = OpSGreaterThan %bool %225 %234
+               OpBranch %230
+        %230 = OpLabel
+        %236 = OpPhi %bool %229 %224 %235 %231
+               OpSelectionMerge %237 None
+               OpBranchConditional %236 %238 %237
+        %238 = OpLabel
+               OpStore %197 %177
+        %239 = OpAccessChain %_ptr_Function_int %197 %221
+        %240 = OpLoad %int %239
+        %241 = OpISub %int %225 %240
+        %242 = OpConvertSToF %float %241
+        %243 = OpCompositeConstruct %buf0 %208
+        %244 = OpIAdd %int %int_91 %int_244
+        %245 = OpExtInst %float %1 FAbs %242
+        %246 = OpCompositeExtract %float %243 0 1
+        %247 = OpFSub %float %246 %245
+        %248 = OpFMul %float %247 %float_0_0666666701
+        %249 = OpCompositeConstruct %v4float %248 %248 %248 %float_1
+               OpBranch %223
+        %237 = OpLabel
+        %250 = OpIAdd %int %221 %int_1
+        %219 = OpCompositeInsert %v2int %250 %218 1
+               OpBranch %220
+        %220 = OpLabel
+               OpBranch %217
+        %223 = OpLabel
+        %251 = OpPhi %v4float %192 %217 %249 %238
+        %252 = OpPhi %bool %false %217 %true %238
+               OpSelectionMerge %253 None
+               OpBranchConditional %252 %215 %253
+        %253 = OpLabel
+               OpBranch %215
+        %215 = OpLabel
+        %254 = OpPhi %v4float %251 %223 %183 %253
+               OpStore %_GLF_color %254
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composites/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-composites/1.spvasm.expected.hlsl
new file mode 100755
index 0000000..6f779cc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composites/1.spvasm.expected.hlsl
@@ -0,0 +1,10 @@
+SKIP: FAILED
+
+..\..\src\writer\hlsl\generator_impl.cc:3099 internal compiler error: unhandled struct member attribute: offset
+********************************************************************
+*  The tint shader compiler has encountered an unexpected error.   *
+*                                                                  *
+*  Please help us fix this issue by submitting a bug report at     *
+*  crbug.com/tint with the source program that triggered the bug.  *
+********************************************************************
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composites/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-composites/1.spvasm.expected.msl
new file mode 100644
index 0000000..805d16d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composites/1.spvasm.expected.msl
@@ -0,0 +1,107 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  int arr[256];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10) {
+  tint_array_wrapper x_195 = {};
+  tint_array_wrapper x_196 = {};
+  tint_array_wrapper x_197 = {};
+  float2 x_208 = 0.0f;
+  int2 x_214 = 0;
+  float4 x_249 = 0.0f;
+  float4 x_251 = 0.0f;
+  int2 x_218_phi = 0;
+  float4 x_251_phi = 0.0f;
+  bool x_252_phi = false;
+  float4 x_254_phi = 0.0f;
+  float4 const x_198 = *(tint_symbol_9);
+  float2 const x_201 = x_6.resolution;
+  float2 const x_202 = (float2(x_198.x, x_198.y) / x_201);
+  int const x_204 = -(82);
+  x_208 = float2(0.0f, float4(x_201, 15.0f, 15.0f).z);
+  int const x_209 = (120 - 0);
+  x_214 = int2(int((x_202.x * 256.0f)), int((x_202.y * 256.0f)));
+  switch(0u) {
+    default: {
+      x_218_phi = x_214;
+      while (true) {
+        bool x_235 = false;
+        bool x_236_phi = false;
+        int2 const x_218 = x_218_phi;
+        int const x_221 = x_218.y;
+        x_251_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        x_252_phi = false;
+        if ((x_221 != 256)) {
+        } else {
+          break;
+        }
+        int const x_225 = x_218.x;
+        tint_array_wrapper const tint_symbol_4 = {.arr={115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94}};
+        x_195 = tint_symbol_4;
+        int const x_227 = x_195.arr[x_221];
+        bool const x_229 = (x_225 < (x_227 + 15));
+        x_236_phi = x_229;
+        if (x_229) {
+          tint_array_wrapper const tint_symbol_5 = {.arr={115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94}};
+          x_196 = tint_symbol_5;
+          int const x_233 = x_196.arr[x_221];
+          x_235 = (x_225 > (x_233 - 15));
+          x_236_phi = x_235;
+        }
+        bool const x_236 = x_236_phi;
+        if (x_236) {
+          tint_array_wrapper const tint_symbol_6 = {.arr={115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94}};
+          x_197 = tint_symbol_6;
+          int const x_240 = x_197.arr[x_221];
+          int const x_244 = (91 + 244);
+          buf0 const tint_symbol_7 = {.resolution=x_208};
+          float const x_248 = ((tint_symbol_7.resolution.y - fabs(float((x_225 - x_240)))) * 0.06666667f);
+          x_249 = float4(x_248, x_248, x_248, 1.0f);
+          x_251_phi = x_249;
+          x_252_phi = true;
+          break;
+        }
+        int2 x_219_1 = x_218;
+        x_219_1.y = (x_221 + 1);
+        int2 const x_219 = x_219_1;
+        {
+          x_218_phi = x_219;
+        }
+      }
+      x_251 = x_251_phi;
+      bool const x_252 = x_252_phi;
+      x_254_phi = x_251;
+      if (x_252) {
+        break;
+      }
+      x_254_phi = float4(0.0f, 0.0f, 0.0f, 1.0f);
+      break;
+    }
+  }
+  float4 const x_254 = x_254_phi;
+  *(tint_symbol_10) = x_254;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_11 = 0.0f;
+  thread float4 tint_symbol_12 = 0.0f;
+  tint_symbol_11 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_11), &(tint_symbol_12));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_12};
+  tint_symbol_2 const tint_symbol_8 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_8;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composites/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-composites/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..8f758b6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composites/1.spvasm.expected.spvasm
@@ -0,0 +1,401 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 307
+; Schema: 0
+               OpCapability Shader
+        %271 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %x_195 "x_195"
+               OpName %x_196 "x_196"
+               OpName %x_197 "x_197"
+               OpName %x_208 "x_208"
+               OpName %x_214 "x_214"
+               OpName %x_249 "x_249"
+               OpName %x_251 "x_251"
+               OpName %x_218_phi "x_218_phi"
+               OpName %x_251_phi "x_251_phi"
+               OpName %x_252_phi "x_252_phi"
+               OpName %x_254_phi "x_254_phi"
+               OpName %x_235 "x_235"
+               OpName %x_236_phi "x_236_phi"
+               OpName %x_219_1 "x_219_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_int_uint_256 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+   %uint_256 = OpConstant %uint 256
+%_arr_int_uint_256 = OpTypeArray %int %uint_256
+%_ptr_Function__arr_int_uint_256 = OpTypePointer Function %_arr_int_uint_256
+         %25 = OpConstantNull %_arr_int_uint_256
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %30 = OpConstantNull %v2float
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %34 = OpConstantNull %v2int
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %43 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+     %int_82 = OpConstant %int 82
+    %float_0 = OpConstant %float 0
+   %float_15 = OpConstant %float 15
+    %int_120 = OpConstant %int 120
+      %int_0 = OpConstant %int 0
+  %float_256 = OpConstant %float 256
+         %85 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+      %false = OpConstantFalse %bool
+    %int_256 = OpConstant %int 256
+    %int_115 = OpConstant %int 115
+    %int_133 = OpConstant %int 133
+    %int_150 = OpConstant %int 150
+    %int_164 = OpConstant %int 164
+    %int_176 = OpConstant %int 176
+    %int_184 = OpConstant %int 184
+    %int_190 = OpConstant %int 190
+    %int_192 = OpConstant %int 192
+    %int_191 = OpConstant %int 191
+    %int_187 = OpConstant %int 187
+    %int_181 = OpConstant %int 181
+    %int_172 = OpConstant %int 172
+    %int_163 = OpConstant %int 163
+    %int_153 = OpConstant %int 153
+    %int_143 = OpConstant %int 143
+    %int_134 = OpConstant %int 134
+    %int_126 = OpConstant %int 126
+    %int_116 = OpConstant %int 116
+    %int_114 = OpConstant %int 114
+    %int_117 = OpConstant %int 117
+    %int_121 = OpConstant %int 121
+    %int_127 = OpConstant %int 127
+    %int_141 = OpConstant %int 141
+    %int_148 = OpConstant %int 148
+    %int_154 = OpConstant %int 154
+    %int_159 = OpConstant %int 159
+    %int_162 = OpConstant %int 162
+    %int_161 = OpConstant %int 161
+    %int_157 = OpConstant %int 157
+    %int_151 = OpConstant %int 151
+    %int_124 = OpConstant %int 124
+    %int_113 = OpConstant %int 113
+    %int_103 = OpConstant %int 103
+     %int_94 = OpConstant %int 94
+     %int_87 = OpConstant %int 87
+     %int_79 = OpConstant %int 79
+     %int_80 = OpConstant %int 80
+     %int_84 = OpConstant %int 84
+     %int_91 = OpConstant %int 91
+    %int_101 = OpConstant %int 101
+    %int_130 = OpConstant %int 130
+    %int_146 = OpConstant %int 146
+    %int_182 = OpConstant %int 182
+    %int_199 = OpConstant %int 199
+    %int_215 = OpConstant %int 215
+    %int_229 = OpConstant %int 229
+    %int_240 = OpConstant %int 240
+    %int_249 = OpConstant %int 249
+    %int_254 = OpConstant %int 254
+    %int_250 = OpConstant %int 250
+    %int_243 = OpConstant %int 243
+    %int_233 = OpConstant %int 233
+    %int_223 = OpConstant %int 223
+    %int_212 = OpConstant %int 212
+    %int_200 = OpConstant %int 200
+    %int_180 = OpConstant %int 180
+    %int_166 = OpConstant %int 166
+    %int_169 = OpConstant %int 169
+    %int_174 = OpConstant %int 174
+    %int_179 = OpConstant %int 179
+    %int_185 = OpConstant %int 185
+    %int_193 = OpConstant %int 193
+    %int_195 = OpConstant %int 195
+    %int_188 = OpConstant %int 188
+    %int_171 = OpConstant %int 171
+    %int_149 = OpConstant %int 149
+    %int_137 = OpConstant %int 137
+    %int_125 = OpConstant %int 125
+    %int_105 = OpConstant %int 105
+     %int_97 = OpConstant %int 97
+     %int_93 = OpConstant %int 93
+     %int_98 = OpConstant %int 98
+    %int_106 = OpConstant %int 106
+    %int_145 = OpConstant %int 145
+    %int_177 = OpConstant %int 177
+    %int_208 = OpConstant %int 208
+    %int_221 = OpConstant %int 221
+    %int_231 = OpConstant %int 231
+    %int_239 = OpConstant %int 239
+    %int_244 = OpConstant %int 244
+    %int_242 = OpConstant %int 242
+    %int_236 = OpConstant %int 236
+    %int_228 = OpConstant %int 228
+    %int_218 = OpConstant %int 218
+    %int_207 = OpConstant %int 207
+    %int_194 = OpConstant %int 194
+    %int_158 = OpConstant %int 158
+    %int_135 = OpConstant %int 135
+    %int_132 = OpConstant %int 132
+    %int_131 = OpConstant %int 131
+    %int_138 = OpConstant %int 138
+    %int_147 = OpConstant %int 147
+    %int_155 = OpConstant %int 155
+    %int_152 = OpConstant %int 152
+    %int_139 = OpConstant %int 139
+    %int_129 = OpConstant %int 129
+    %int_118 = OpConstant %int 118
+     %int_68 = OpConstant %int 68
+     %int_58 = OpConstant %int 58
+     %int_49 = OpConstant %int 49
+     %int_43 = OpConstant %int 43
+     %int_40 = OpConstant %int 40
+     %int_41 = OpConstant %int 41
+     %int_44 = OpConstant %int 44
+     %int_51 = OpConstant %int 51
+     %int_61 = OpConstant %int 61
+     %int_73 = OpConstant %int 73
+    %int_119 = OpConstant %int 119
+    %int_173 = OpConstant %int 173
+    %int_186 = OpConstant %int 186
+    %int_128 = OpConstant %int 128
+    %int_104 = OpConstant %int 104
+     %int_86 = OpConstant %int 86
+     %int_81 = OpConstant %int 81
+     %int_77 = OpConstant %int 77
+     %int_76 = OpConstant %int 76
+     %int_89 = OpConstant %int 89
+    %int_102 = OpConstant %int 102
+     %int_92 = OpConstant %int 92
+     %int_83 = OpConstant %int 83
+     %int_62 = OpConstant %int 62
+     %int_50 = OpConstant %int 50
+     %int_38 = OpConstant %int 38
+     %int_26 = OpConstant %int 26
+     %int_16 = OpConstant %int 16
+      %int_8 = OpConstant %int 8
+      %int_2 = OpConstant %int 2
+      %int_4 = OpConstant %int 4
+     %int_11 = OpConstant %int 11
+     %int_21 = OpConstant %int 21
+     %int_33 = OpConstant %int 33
+     %int_48 = OpConstant %int 48
+     %int_64 = OpConstant %int 64
+    %int_144 = OpConstant %int 144
+    %int_123 = OpConstant %int 123
+    %int_112 = OpConstant %int 112
+    %int_100 = OpConstant %int 100
+     %int_90 = OpConstant %int 90
+     %int_65 = OpConstant %int 65
+     %int_67 = OpConstant %int 67
+     %int_70 = OpConstant %int 70
+     %int_75 = OpConstant %int 75
+     %int_95 = OpConstant %int 95
+     %int_88 = OpConstant %int 88
+     %int_69 = OpConstant %int 69
+     %int_47 = OpConstant %int 47
+     %int_36 = OpConstant %int 36
+     %int_18 = OpConstant %int 18
+     %int_13 = OpConstant %int 13
+     %int_15 = OpConstant %int 15
+     %int_22 = OpConstant %int 22
+     %int_32 = OpConstant %int 32
+     %int_45 = OpConstant %int 45
+     %int_60 = OpConstant %int 60
+        %247 = OpConstantComposite %_arr_int_uint_256 %int_115 %int_133 %int_150 %int_164 %int_176 %int_184 %int_190 %int_192 %int_191 %int_187 %int_181 %int_172 %int_163 %int_153 %int_143 %int_134 %int_126 %int_120 %int_116 %int_114 %int_114 %int_117 %int_121 %int_127 %int_134 %int_141 %int_148 %int_154 %int_159 %int_162 %int_163 %int_161 %int_157 %int_151 %int_143 %int_134 %int_124 %int_113 %int_103 %int_94 %int_87 %int_82 %int_79 %int_80 %int_84 %int_91 %int_101 %int_114 %int_130 %int_146 %int_164 %int_182 %int_199 %int_215 %int_229 %int_240 %int_249 %int_254 %int_256 %int_254 %int_250 %int_243 %int_233 %int_223 %int_212 %int_200 %int_190 %int_180 %int_172 %int_166 %int_163 %int_161 %int_162 %int_164 %int_169 %int_174 %int_179 %int_185 %int_190 %int_193 %int_195 %int_195 %int_192 %int_188 %int_180 %int_171 %int_161 %int_149 %int_137 %int_125 %int_114 %int_105 %int_97 %int_93 %int_91 %int_93 %int_98 %int_106 %int_117 %int_130 %int_145 %int_161 %int_177 %int_193 %int_208 %int_221 %int_231 %int_239 %int_243 %int_244 %int_242 %int_236 %int_228 %int_218 %int_207 %int_194 %int_181 %int_169 %int_158 %int_148 %int_141 %int_135 %int_132 %int_131 %int_132 %int_135 %int_138 %int_143 %int_147 %int_151 %int_154 %int_155 %int_155 %int_152 %int_146 %int_139 %int_129 %int_118 %int_106 %int_93 %int_80 %int_68 %int_58 %int_49 %int_43 %int_40 %int_41 %int_44 %int_51 %int_61 %int_73 %int_87 %int_103 %int_119 %int_134 %int_149 %int_162 %int_173 %int_181 %int_186 %int_188 %int_186 %int_181 %int_174 %int_164 %int_153 %int_141 %int_128 %int_116 %int_104 %int_94 %int_86 %int_81 %int_77 %int_76 %int_77 %int_80 %int_84 %int_89 %int_94 %int_98 %int_102 %int_104 %int_104 %int_102 %int_98 %int_92 %int_83 %int_73 %int_62 %int_50 %int_38 %int_26 %int_16 %int_8 %int_2 %int_0 %int_0 %int_4 %int_11 %int_21 %int_33 %int_48 %int_64 %int_81 %int_98 %int_114 %int_129 %int_141 %int_151 %int_158 %int_161 %int_161 %int_158 %int_152 %int_144 %int_134 %int_123 %int_112 %int_100 %int_90 %int_81 %int_73 %int_68 %int_65 %int_65 %int_67 %int_70 %int_75 %int_81 %int_87 %int_92 %int_97 %int_101 %int_103 %int_102 %int_100 %int_95 %int_88 %int_79 %int_69 %int_58 %int_47 %int_36 %int_26 %int_18 %int_13 %int_11 %int_11 %int_15 %int_22 %int_32 %int_45 %int_60 %int_77 %int_94
+%_ptr_Function_int = OpTypePointer Function %int
+%float_0_0666666701 = OpConstant %float 0.0666666701
+    %float_1 = OpConstant %float 1
+       %true = OpConstantTrue %bool
+     %uint_1 = OpConstant %uint 1
+      %int_1 = OpConstant %int 1
+        %292 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %294 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+      %x_195 = OpVariable %_ptr_Function__arr_int_uint_256 Function %25
+      %x_196 = OpVariable %_ptr_Function__arr_int_uint_256 Function %25
+      %x_197 = OpVariable %_ptr_Function__arr_int_uint_256 Function %25
+      %x_208 = OpVariable %_ptr_Function_v2float Function %30
+      %x_214 = OpVariable %_ptr_Function_v2int Function %34
+      %x_249 = OpVariable %_ptr_Function_v4float Function %5
+      %x_251 = OpVariable %_ptr_Function_v4float Function %5
+  %x_218_phi = OpVariable %_ptr_Function_v2int Function %34
+  %x_251_phi = OpVariable %_ptr_Function_v4float Function %5
+  %x_252_phi = OpVariable %_ptr_Function_bool Function %43
+  %x_254_phi = OpVariable %_ptr_Function_v4float Function %5
+      %x_235 = OpVariable %_ptr_Function_bool Function %43
+  %x_236_phi = OpVariable %_ptr_Function_bool Function %43
+    %x_219_1 = OpVariable %_ptr_Function_v2int Function %34
+         %45 = OpLoad %v4float %gl_FragCoord
+         %48 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %49 = OpLoad %v2float %48
+         %50 = OpCompositeExtract %float %45 0
+         %51 = OpCompositeExtract %float %45 1
+         %52 = OpCompositeConstruct %v2float %50 %51
+         %53 = OpFDiv %v2float %52 %49
+         %54 = OpSNegate %int %int_82
+         %57 = OpCompositeExtract %float %49 0
+         %58 = OpCompositeExtract %float %49 1
+         %60 = OpCompositeConstruct %v4float %57 %58 %float_15 %float_15
+         %61 = OpCompositeExtract %float %60 2
+         %62 = OpCompositeConstruct %v2float %float_0 %61
+               OpStore %x_208 %62
+         %65 = OpISub %int %int_120 %int_0
+         %67 = OpCompositeExtract %float %53 0
+         %69 = OpFMul %float %67 %float_256
+         %66 = OpConvertFToS %int %69
+         %71 = OpCompositeExtract %float %53 1
+         %72 = OpFMul %float %71 %float_256
+         %70 = OpConvertFToS %int %72
+         %73 = OpCompositeConstruct %v2int %66 %70
+               OpStore %x_214 %73
+               OpSelectionMerge %74 None
+               OpSwitch %uint_0 %75
+         %75 = OpLabel
+         %76 = OpLoad %v2int %x_214
+               OpStore %x_218_phi %76
+               OpBranch %77
+         %77 = OpLabel
+               OpLoopMerge %78 %79 None
+               OpBranch %80
+         %80 = OpLabel
+         %83 = OpLoad %v2int %x_218_phi
+         %84 = OpCompositeExtract %int %83 1
+               OpStore %x_251_phi %85
+               OpStore %x_252_phi %false
+         %88 = OpINotEqual %bool %84 %int_256
+               OpSelectionMerge %89 None
+               OpBranchConditional %88 %90 %91
+         %90 = OpLabel
+               OpBranch %89
+         %91 = OpLabel
+               OpBranch %78
+         %89 = OpLabel
+         %92 = OpCompositeExtract %int %83 0
+               OpStore %x_195 %247
+        %249 = OpAccessChain %_ptr_Function_int %x_195 %84
+        %250 = OpLoad %int %249
+        %251 = OpIAdd %int %250 %int_15
+        %252 = OpSLessThan %bool %92 %251
+               OpStore %x_236_phi %252
+               OpSelectionMerge %253 None
+               OpBranchConditional %252 %254 %253
+        %254 = OpLabel
+               OpStore %x_196 %247
+        %255 = OpAccessChain %_ptr_Function_int %x_196 %84
+        %256 = OpLoad %int %255
+        %257 = OpISub %int %256 %int_15
+        %258 = OpSGreaterThan %bool %92 %257
+               OpStore %x_235 %258
+        %259 = OpLoad %bool %x_235
+               OpStore %x_236_phi %259
+               OpBranch %253
+        %253 = OpLabel
+        %260 = OpLoad %bool %x_236_phi
+               OpSelectionMerge %261 None
+               OpBranchConditional %260 %262 %261
+        %262 = OpLabel
+               OpStore %x_197 %247
+        %263 = OpAccessChain %_ptr_Function_int %x_197 %84
+        %264 = OpLoad %int %263
+        %265 = OpIAdd %int %int_91 %int_244
+        %266 = OpLoad %v2float %x_208
+        %267 = OpCompositeConstruct %buf0 %266
+        %268 = OpCompositeExtract %v2float %267 0
+        %269 = OpCompositeExtract %float %268 1
+        %273 = OpISub %int %92 %264
+        %272 = OpConvertSToF %float %273
+        %270 = OpExtInst %float %271 FAbs %272
+        %274 = OpFSub %float %269 %270
+        %276 = OpFMul %float %274 %float_0_0666666701
+        %278 = OpCompositeConstruct %v4float %276 %276 %276 %float_1
+               OpStore %x_249 %278
+        %279 = OpLoad %v4float %x_249
+               OpStore %x_251_phi %279
+               OpStore %x_252_phi %true
+               OpBranch %78
+        %261 = OpLabel
+               OpStore %x_219_1 %83
+        %283 = OpAccessChain %_ptr_Function_int %x_219_1 %uint_1
+        %285 = OpIAdd %int %84 %int_1
+               OpStore %283 %285
+        %286 = OpLoad %v2int %x_219_1
+               OpBranch %79
+         %79 = OpLabel
+               OpStore %x_218_phi %286
+               OpBranch %77
+         %78 = OpLabel
+        %287 = OpLoad %v4float %x_251_phi
+               OpStore %x_251 %287
+        %288 = OpLoad %bool %x_252_phi
+        %289 = OpLoad %v4float %x_251
+               OpStore %x_254_phi %289
+               OpSelectionMerge %290 None
+               OpBranchConditional %288 %291 %290
+        %291 = OpLabel
+               OpBranch %74
+        %290 = OpLabel
+               OpStore %x_254_phi %292
+               OpBranch %74
+         %74 = OpLabel
+        %293 = OpLoad %v4float %x_254_phi
+               OpStore %x_GLF_color %293
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %294
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %298 = OpLabel
+        %299 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %299
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %301 = OpLabel
+        %302 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %302
+        %303 = OpFunctionCall %void %main_1
+        %305 = OpLoad %v4float %x_GLF_color
+        %306 = OpCompositeConstruct %main_out %305
+        %304 = OpFunctionCall %void %tint_symbol_3 %306
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composites/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-composites/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..a8a9633
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composites/1.spvasm.expected.wgsl
@@ -0,0 +1,99 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_195 : array<i32, 256>;
+  var x_196 : array<i32, 256>;
+  var x_197 : array<i32, 256>;
+  var x_208 : vec2<f32>;
+  var x_214 : vec2<i32>;
+  var x_249 : vec4<f32>;
+  var x_251 : vec4<f32>;
+  var x_218_phi : vec2<i32>;
+  var x_251_phi : vec4<f32>;
+  var x_252_phi : bool;
+  var x_254_phi : vec4<f32>;
+  let x_198 : vec4<f32> = gl_FragCoord;
+  let x_201 : vec2<f32> = x_6.resolution;
+  let x_202 : vec2<f32> = (vec2<f32>(x_198.x, x_198.y) / x_201);
+  let x_204 : i32 = -(82);
+  x_208 = vec2<f32>(0.0, vec4<f32>(x_201, 15.0, 15.0).z);
+  let x_209 : i32 = (120 - 0);
+  x_214 = vec2<i32>(i32((x_202.x * 256.0)), i32((x_202.y * 256.0)));
+  switch(0u) {
+    default: {
+      x_218_phi = x_214;
+      loop {
+        var x_235 : bool;
+        var x_236_phi : bool;
+        let x_218 : vec2<i32> = x_218_phi;
+        let x_221 : i32 = x_218.y;
+        x_251_phi = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+        x_252_phi = false;
+        if ((x_221 != 256)) {
+        } else {
+          break;
+        }
+        let x_225 : i32 = x_218.x;
+        x_195 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+        let x_227 : i32 = x_195[x_221];
+        let x_229 : bool = (x_225 < (x_227 + 15));
+        x_236_phi = x_229;
+        if (x_229) {
+          x_196 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+          let x_233 : i32 = x_196[x_221];
+          x_235 = (x_225 > (x_233 - 15));
+          x_236_phi = x_235;
+        }
+        let x_236 : bool = x_236_phi;
+        if (x_236) {
+          x_197 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+          let x_240 : i32 = x_197[x_221];
+          let x_244 : i32 = (91 + 244);
+          let x_248 : f32 = ((buf0(x_208).resolution.y - abs(f32((x_225 - x_240)))) * 0.06666667);
+          x_249 = vec4<f32>(x_248, x_248, x_248, 1.0);
+          x_251_phi = x_249;
+          x_252_phi = true;
+          break;
+        }
+        var x_219_1 : vec2<i32> = x_218;
+        x_219_1.y = (x_221 + 1);
+        let x_219 : vec2<i32> = x_219_1;
+
+        continuing {
+          x_218_phi = x_219;
+        }
+      }
+      x_251 = x_251_phi;
+      let x_252 : bool = x_252_phi;
+      x_254_phi = x_251;
+      if (x_252) {
+        break;
+      }
+      x_254_phi = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+    }
+  }
+  let x_254 : vec4<f32> = x_254_phi;
+  x_GLF_color = x_254;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composites/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-composites/1.wgsl
new file mode 100644
index 0000000..a8a9633
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composites/1.wgsl
@@ -0,0 +1,99 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_195 : array<i32, 256>;
+  var x_196 : array<i32, 256>;
+  var x_197 : array<i32, 256>;
+  var x_208 : vec2<f32>;
+  var x_214 : vec2<i32>;
+  var x_249 : vec4<f32>;
+  var x_251 : vec4<f32>;
+  var x_218_phi : vec2<i32>;
+  var x_251_phi : vec4<f32>;
+  var x_252_phi : bool;
+  var x_254_phi : vec4<f32>;
+  let x_198 : vec4<f32> = gl_FragCoord;
+  let x_201 : vec2<f32> = x_6.resolution;
+  let x_202 : vec2<f32> = (vec2<f32>(x_198.x, x_198.y) / x_201);
+  let x_204 : i32 = -(82);
+  x_208 = vec2<f32>(0.0, vec4<f32>(x_201, 15.0, 15.0).z);
+  let x_209 : i32 = (120 - 0);
+  x_214 = vec2<i32>(i32((x_202.x * 256.0)), i32((x_202.y * 256.0)));
+  switch(0u) {
+    default: {
+      x_218_phi = x_214;
+      loop {
+        var x_235 : bool;
+        var x_236_phi : bool;
+        let x_218 : vec2<i32> = x_218_phi;
+        let x_221 : i32 = x_218.y;
+        x_251_phi = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+        x_252_phi = false;
+        if ((x_221 != 256)) {
+        } else {
+          break;
+        }
+        let x_225 : i32 = x_218.x;
+        x_195 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+        let x_227 : i32 = x_195[x_221];
+        let x_229 : bool = (x_225 < (x_227 + 15));
+        x_236_phi = x_229;
+        if (x_229) {
+          x_196 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+          let x_233 : i32 = x_196[x_221];
+          x_235 = (x_225 > (x_233 - 15));
+          x_236_phi = x_235;
+        }
+        let x_236 : bool = x_236_phi;
+        if (x_236) {
+          x_197 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+          let x_240 : i32 = x_197[x_221];
+          let x_244 : i32 = (91 + 244);
+          let x_248 : f32 = ((buf0(x_208).resolution.y - abs(f32((x_225 - x_240)))) * 0.06666667);
+          x_249 = vec4<f32>(x_248, x_248, x_248, 1.0);
+          x_251_phi = x_249;
+          x_252_phi = true;
+          break;
+        }
+        var x_219_1 : vec2<i32> = x_218;
+        x_219_1.y = (x_221 + 1);
+        let x_219 : vec2<i32> = x_219_1;
+
+        continuing {
+          x_218_phi = x_219;
+        }
+      }
+      x_251 = x_251_phi;
+      let x_252 : bool = x_252_phi;
+      x_254_phi = x_251;
+      if (x_252) {
+        break;
+      }
+      x_254_phi = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+    }
+  }
+  let x_254 : vec4<f32> = x_254_phi;
+  x_GLF_color = x_254;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composites/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-composites/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..0e4020b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composites/1.wgsl.expected.hlsl
@@ -0,0 +1,107 @@
+struct buf0 {
+  float2 resolution;
+};
+
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int x_195[256] = (int[256])0;
+  int x_196[256] = (int[256])0;
+  int x_197[256] = (int[256])0;
+  float2 x_208 = float2(0.0f, 0.0f);
+  int2 x_214 = int2(0, 0);
+  float4 x_249 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 x_251 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int2 x_218_phi = int2(0, 0);
+  float4 x_251_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  bool x_252_phi = false;
+  float4 x_254_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  const float4 x_198 = gl_FragCoord;
+  const float2 x_201 = asfloat(x_6[0].xy);
+  const float2 x_202 = (float2(x_198.x, x_198.y) / x_201);
+  const int x_204 = -(82);
+  x_208 = float2(0.0f, float4(x_201, 15.0f, 15.0f).z);
+  const int x_209 = (120 - 0);
+  x_214 = int2(int((x_202.x * 256.0f)), int((x_202.y * 256.0f)));
+  switch(0u) {
+    default: {
+      x_218_phi = x_214;
+      while (true) {
+        bool x_235 = false;
+        bool x_236_phi = false;
+        const int2 x_218 = x_218_phi;
+        const int x_221 = x_218.y;
+        x_251_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        x_252_phi = false;
+        if ((x_221 != 256)) {
+        } else {
+          break;
+        }
+        const int x_225 = x_218.x;
+        const int tint_symbol_5[256] = {115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94};
+        x_195 = tint_symbol_5;
+        const int x_227 = x_195[x_221];
+        const bool x_229 = (x_225 < (x_227 + 15));
+        x_236_phi = x_229;
+        if (x_229) {
+          const int tint_symbol_6[256] = {115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94};
+          x_196 = tint_symbol_6;
+          const int x_233 = x_196[x_221];
+          x_235 = (x_225 > (x_233 - 15));
+          x_236_phi = x_235;
+        }
+        if (x_236_phi) {
+          const int tint_symbol_7[256] = {115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94};
+          x_197 = tint_symbol_7;
+          const int x_240 = x_197[x_221];
+          const int x_244 = (91 + 244);
+          const buf0 tint_symbol_8 = {x_208};
+          const float x_248 = ((tint_symbol_8.resolution.y - abs(float((x_225 - x_240)))) * 0.06666667f);
+          x_249 = float4(x_248, x_248, x_248, 1.0f);
+          x_251_phi = x_249;
+          x_252_phi = true;
+          break;
+        }
+        int2 x_219_1 = x_218;
+        x_219_1.y = (x_221 + 1);
+        const int2 x_219 = x_219_1;
+        {
+          x_218_phi = x_219;
+        }
+      }
+      x_251 = x_251_phi;
+      const bool x_252 = x_252_phi;
+      x_254_phi = x_251;
+      if (x_252) {
+        break;
+      }
+      x_254_phi = float4(0.0f, 0.0f, 0.0f, 1.0f);
+      break;
+    }
+  }
+  x_GLF_color = x_254_phi;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_9 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_9;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composites/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-composites/1.wgsl.expected.msl
new file mode 100644
index 0000000..805d16d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composites/1.wgsl.expected.msl
@@ -0,0 +1,107 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  int arr[256];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10) {
+  tint_array_wrapper x_195 = {};
+  tint_array_wrapper x_196 = {};
+  tint_array_wrapper x_197 = {};
+  float2 x_208 = 0.0f;
+  int2 x_214 = 0;
+  float4 x_249 = 0.0f;
+  float4 x_251 = 0.0f;
+  int2 x_218_phi = 0;
+  float4 x_251_phi = 0.0f;
+  bool x_252_phi = false;
+  float4 x_254_phi = 0.0f;
+  float4 const x_198 = *(tint_symbol_9);
+  float2 const x_201 = x_6.resolution;
+  float2 const x_202 = (float2(x_198.x, x_198.y) / x_201);
+  int const x_204 = -(82);
+  x_208 = float2(0.0f, float4(x_201, 15.0f, 15.0f).z);
+  int const x_209 = (120 - 0);
+  x_214 = int2(int((x_202.x * 256.0f)), int((x_202.y * 256.0f)));
+  switch(0u) {
+    default: {
+      x_218_phi = x_214;
+      while (true) {
+        bool x_235 = false;
+        bool x_236_phi = false;
+        int2 const x_218 = x_218_phi;
+        int const x_221 = x_218.y;
+        x_251_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        x_252_phi = false;
+        if ((x_221 != 256)) {
+        } else {
+          break;
+        }
+        int const x_225 = x_218.x;
+        tint_array_wrapper const tint_symbol_4 = {.arr={115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94}};
+        x_195 = tint_symbol_4;
+        int const x_227 = x_195.arr[x_221];
+        bool const x_229 = (x_225 < (x_227 + 15));
+        x_236_phi = x_229;
+        if (x_229) {
+          tint_array_wrapper const tint_symbol_5 = {.arr={115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94}};
+          x_196 = tint_symbol_5;
+          int const x_233 = x_196.arr[x_221];
+          x_235 = (x_225 > (x_233 - 15));
+          x_236_phi = x_235;
+        }
+        bool const x_236 = x_236_phi;
+        if (x_236) {
+          tint_array_wrapper const tint_symbol_6 = {.arr={115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94}};
+          x_197 = tint_symbol_6;
+          int const x_240 = x_197.arr[x_221];
+          int const x_244 = (91 + 244);
+          buf0 const tint_symbol_7 = {.resolution=x_208};
+          float const x_248 = ((tint_symbol_7.resolution.y - fabs(float((x_225 - x_240)))) * 0.06666667f);
+          x_249 = float4(x_248, x_248, x_248, 1.0f);
+          x_251_phi = x_249;
+          x_252_phi = true;
+          break;
+        }
+        int2 x_219_1 = x_218;
+        x_219_1.y = (x_221 + 1);
+        int2 const x_219 = x_219_1;
+        {
+          x_218_phi = x_219;
+        }
+      }
+      x_251 = x_251_phi;
+      bool const x_252 = x_252_phi;
+      x_254_phi = x_251;
+      if (x_252) {
+        break;
+      }
+      x_254_phi = float4(0.0f, 0.0f, 0.0f, 1.0f);
+      break;
+    }
+  }
+  float4 const x_254 = x_254_phi;
+  *(tint_symbol_10) = x_254;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_11 = 0.0f;
+  thread float4 tint_symbol_12 = 0.0f;
+  tint_symbol_11 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_11), &(tint_symbol_12));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_12};
+  tint_symbol_2 const tint_symbol_8 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_8;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composites/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-composites/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..8f758b6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composites/1.wgsl.expected.spvasm
@@ -0,0 +1,401 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 307
+; Schema: 0
+               OpCapability Shader
+        %271 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %x_195 "x_195"
+               OpName %x_196 "x_196"
+               OpName %x_197 "x_197"
+               OpName %x_208 "x_208"
+               OpName %x_214 "x_214"
+               OpName %x_249 "x_249"
+               OpName %x_251 "x_251"
+               OpName %x_218_phi "x_218_phi"
+               OpName %x_251_phi "x_251_phi"
+               OpName %x_252_phi "x_252_phi"
+               OpName %x_254_phi "x_254_phi"
+               OpName %x_235 "x_235"
+               OpName %x_236_phi "x_236_phi"
+               OpName %x_219_1 "x_219_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_int_uint_256 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+   %uint_256 = OpConstant %uint 256
+%_arr_int_uint_256 = OpTypeArray %int %uint_256
+%_ptr_Function__arr_int_uint_256 = OpTypePointer Function %_arr_int_uint_256
+         %25 = OpConstantNull %_arr_int_uint_256
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %30 = OpConstantNull %v2float
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %34 = OpConstantNull %v2int
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %43 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+     %int_82 = OpConstant %int 82
+    %float_0 = OpConstant %float 0
+   %float_15 = OpConstant %float 15
+    %int_120 = OpConstant %int 120
+      %int_0 = OpConstant %int 0
+  %float_256 = OpConstant %float 256
+         %85 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+      %false = OpConstantFalse %bool
+    %int_256 = OpConstant %int 256
+    %int_115 = OpConstant %int 115
+    %int_133 = OpConstant %int 133
+    %int_150 = OpConstant %int 150
+    %int_164 = OpConstant %int 164
+    %int_176 = OpConstant %int 176
+    %int_184 = OpConstant %int 184
+    %int_190 = OpConstant %int 190
+    %int_192 = OpConstant %int 192
+    %int_191 = OpConstant %int 191
+    %int_187 = OpConstant %int 187
+    %int_181 = OpConstant %int 181
+    %int_172 = OpConstant %int 172
+    %int_163 = OpConstant %int 163
+    %int_153 = OpConstant %int 153
+    %int_143 = OpConstant %int 143
+    %int_134 = OpConstant %int 134
+    %int_126 = OpConstant %int 126
+    %int_116 = OpConstant %int 116
+    %int_114 = OpConstant %int 114
+    %int_117 = OpConstant %int 117
+    %int_121 = OpConstant %int 121
+    %int_127 = OpConstant %int 127
+    %int_141 = OpConstant %int 141
+    %int_148 = OpConstant %int 148
+    %int_154 = OpConstant %int 154
+    %int_159 = OpConstant %int 159
+    %int_162 = OpConstant %int 162
+    %int_161 = OpConstant %int 161
+    %int_157 = OpConstant %int 157
+    %int_151 = OpConstant %int 151
+    %int_124 = OpConstant %int 124
+    %int_113 = OpConstant %int 113
+    %int_103 = OpConstant %int 103
+     %int_94 = OpConstant %int 94
+     %int_87 = OpConstant %int 87
+     %int_79 = OpConstant %int 79
+     %int_80 = OpConstant %int 80
+     %int_84 = OpConstant %int 84
+     %int_91 = OpConstant %int 91
+    %int_101 = OpConstant %int 101
+    %int_130 = OpConstant %int 130
+    %int_146 = OpConstant %int 146
+    %int_182 = OpConstant %int 182
+    %int_199 = OpConstant %int 199
+    %int_215 = OpConstant %int 215
+    %int_229 = OpConstant %int 229
+    %int_240 = OpConstant %int 240
+    %int_249 = OpConstant %int 249
+    %int_254 = OpConstant %int 254
+    %int_250 = OpConstant %int 250
+    %int_243 = OpConstant %int 243
+    %int_233 = OpConstant %int 233
+    %int_223 = OpConstant %int 223
+    %int_212 = OpConstant %int 212
+    %int_200 = OpConstant %int 200
+    %int_180 = OpConstant %int 180
+    %int_166 = OpConstant %int 166
+    %int_169 = OpConstant %int 169
+    %int_174 = OpConstant %int 174
+    %int_179 = OpConstant %int 179
+    %int_185 = OpConstant %int 185
+    %int_193 = OpConstant %int 193
+    %int_195 = OpConstant %int 195
+    %int_188 = OpConstant %int 188
+    %int_171 = OpConstant %int 171
+    %int_149 = OpConstant %int 149
+    %int_137 = OpConstant %int 137
+    %int_125 = OpConstant %int 125
+    %int_105 = OpConstant %int 105
+     %int_97 = OpConstant %int 97
+     %int_93 = OpConstant %int 93
+     %int_98 = OpConstant %int 98
+    %int_106 = OpConstant %int 106
+    %int_145 = OpConstant %int 145
+    %int_177 = OpConstant %int 177
+    %int_208 = OpConstant %int 208
+    %int_221 = OpConstant %int 221
+    %int_231 = OpConstant %int 231
+    %int_239 = OpConstant %int 239
+    %int_244 = OpConstant %int 244
+    %int_242 = OpConstant %int 242
+    %int_236 = OpConstant %int 236
+    %int_228 = OpConstant %int 228
+    %int_218 = OpConstant %int 218
+    %int_207 = OpConstant %int 207
+    %int_194 = OpConstant %int 194
+    %int_158 = OpConstant %int 158
+    %int_135 = OpConstant %int 135
+    %int_132 = OpConstant %int 132
+    %int_131 = OpConstant %int 131
+    %int_138 = OpConstant %int 138
+    %int_147 = OpConstant %int 147
+    %int_155 = OpConstant %int 155
+    %int_152 = OpConstant %int 152
+    %int_139 = OpConstant %int 139
+    %int_129 = OpConstant %int 129
+    %int_118 = OpConstant %int 118
+     %int_68 = OpConstant %int 68
+     %int_58 = OpConstant %int 58
+     %int_49 = OpConstant %int 49
+     %int_43 = OpConstant %int 43
+     %int_40 = OpConstant %int 40
+     %int_41 = OpConstant %int 41
+     %int_44 = OpConstant %int 44
+     %int_51 = OpConstant %int 51
+     %int_61 = OpConstant %int 61
+     %int_73 = OpConstant %int 73
+    %int_119 = OpConstant %int 119
+    %int_173 = OpConstant %int 173
+    %int_186 = OpConstant %int 186
+    %int_128 = OpConstant %int 128
+    %int_104 = OpConstant %int 104
+     %int_86 = OpConstant %int 86
+     %int_81 = OpConstant %int 81
+     %int_77 = OpConstant %int 77
+     %int_76 = OpConstant %int 76
+     %int_89 = OpConstant %int 89
+    %int_102 = OpConstant %int 102
+     %int_92 = OpConstant %int 92
+     %int_83 = OpConstant %int 83
+     %int_62 = OpConstant %int 62
+     %int_50 = OpConstant %int 50
+     %int_38 = OpConstant %int 38
+     %int_26 = OpConstant %int 26
+     %int_16 = OpConstant %int 16
+      %int_8 = OpConstant %int 8
+      %int_2 = OpConstant %int 2
+      %int_4 = OpConstant %int 4
+     %int_11 = OpConstant %int 11
+     %int_21 = OpConstant %int 21
+     %int_33 = OpConstant %int 33
+     %int_48 = OpConstant %int 48
+     %int_64 = OpConstant %int 64
+    %int_144 = OpConstant %int 144
+    %int_123 = OpConstant %int 123
+    %int_112 = OpConstant %int 112
+    %int_100 = OpConstant %int 100
+     %int_90 = OpConstant %int 90
+     %int_65 = OpConstant %int 65
+     %int_67 = OpConstant %int 67
+     %int_70 = OpConstant %int 70
+     %int_75 = OpConstant %int 75
+     %int_95 = OpConstant %int 95
+     %int_88 = OpConstant %int 88
+     %int_69 = OpConstant %int 69
+     %int_47 = OpConstant %int 47
+     %int_36 = OpConstant %int 36
+     %int_18 = OpConstant %int 18
+     %int_13 = OpConstant %int 13
+     %int_15 = OpConstant %int 15
+     %int_22 = OpConstant %int 22
+     %int_32 = OpConstant %int 32
+     %int_45 = OpConstant %int 45
+     %int_60 = OpConstant %int 60
+        %247 = OpConstantComposite %_arr_int_uint_256 %int_115 %int_133 %int_150 %int_164 %int_176 %int_184 %int_190 %int_192 %int_191 %int_187 %int_181 %int_172 %int_163 %int_153 %int_143 %int_134 %int_126 %int_120 %int_116 %int_114 %int_114 %int_117 %int_121 %int_127 %int_134 %int_141 %int_148 %int_154 %int_159 %int_162 %int_163 %int_161 %int_157 %int_151 %int_143 %int_134 %int_124 %int_113 %int_103 %int_94 %int_87 %int_82 %int_79 %int_80 %int_84 %int_91 %int_101 %int_114 %int_130 %int_146 %int_164 %int_182 %int_199 %int_215 %int_229 %int_240 %int_249 %int_254 %int_256 %int_254 %int_250 %int_243 %int_233 %int_223 %int_212 %int_200 %int_190 %int_180 %int_172 %int_166 %int_163 %int_161 %int_162 %int_164 %int_169 %int_174 %int_179 %int_185 %int_190 %int_193 %int_195 %int_195 %int_192 %int_188 %int_180 %int_171 %int_161 %int_149 %int_137 %int_125 %int_114 %int_105 %int_97 %int_93 %int_91 %int_93 %int_98 %int_106 %int_117 %int_130 %int_145 %int_161 %int_177 %int_193 %int_208 %int_221 %int_231 %int_239 %int_243 %int_244 %int_242 %int_236 %int_228 %int_218 %int_207 %int_194 %int_181 %int_169 %int_158 %int_148 %int_141 %int_135 %int_132 %int_131 %int_132 %int_135 %int_138 %int_143 %int_147 %int_151 %int_154 %int_155 %int_155 %int_152 %int_146 %int_139 %int_129 %int_118 %int_106 %int_93 %int_80 %int_68 %int_58 %int_49 %int_43 %int_40 %int_41 %int_44 %int_51 %int_61 %int_73 %int_87 %int_103 %int_119 %int_134 %int_149 %int_162 %int_173 %int_181 %int_186 %int_188 %int_186 %int_181 %int_174 %int_164 %int_153 %int_141 %int_128 %int_116 %int_104 %int_94 %int_86 %int_81 %int_77 %int_76 %int_77 %int_80 %int_84 %int_89 %int_94 %int_98 %int_102 %int_104 %int_104 %int_102 %int_98 %int_92 %int_83 %int_73 %int_62 %int_50 %int_38 %int_26 %int_16 %int_8 %int_2 %int_0 %int_0 %int_4 %int_11 %int_21 %int_33 %int_48 %int_64 %int_81 %int_98 %int_114 %int_129 %int_141 %int_151 %int_158 %int_161 %int_161 %int_158 %int_152 %int_144 %int_134 %int_123 %int_112 %int_100 %int_90 %int_81 %int_73 %int_68 %int_65 %int_65 %int_67 %int_70 %int_75 %int_81 %int_87 %int_92 %int_97 %int_101 %int_103 %int_102 %int_100 %int_95 %int_88 %int_79 %int_69 %int_58 %int_47 %int_36 %int_26 %int_18 %int_13 %int_11 %int_11 %int_15 %int_22 %int_32 %int_45 %int_60 %int_77 %int_94
+%_ptr_Function_int = OpTypePointer Function %int
+%float_0_0666666701 = OpConstant %float 0.0666666701
+    %float_1 = OpConstant %float 1
+       %true = OpConstantTrue %bool
+     %uint_1 = OpConstant %uint 1
+      %int_1 = OpConstant %int 1
+        %292 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %294 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+      %x_195 = OpVariable %_ptr_Function__arr_int_uint_256 Function %25
+      %x_196 = OpVariable %_ptr_Function__arr_int_uint_256 Function %25
+      %x_197 = OpVariable %_ptr_Function__arr_int_uint_256 Function %25
+      %x_208 = OpVariable %_ptr_Function_v2float Function %30
+      %x_214 = OpVariable %_ptr_Function_v2int Function %34
+      %x_249 = OpVariable %_ptr_Function_v4float Function %5
+      %x_251 = OpVariable %_ptr_Function_v4float Function %5
+  %x_218_phi = OpVariable %_ptr_Function_v2int Function %34
+  %x_251_phi = OpVariable %_ptr_Function_v4float Function %5
+  %x_252_phi = OpVariable %_ptr_Function_bool Function %43
+  %x_254_phi = OpVariable %_ptr_Function_v4float Function %5
+      %x_235 = OpVariable %_ptr_Function_bool Function %43
+  %x_236_phi = OpVariable %_ptr_Function_bool Function %43
+    %x_219_1 = OpVariable %_ptr_Function_v2int Function %34
+         %45 = OpLoad %v4float %gl_FragCoord
+         %48 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %49 = OpLoad %v2float %48
+         %50 = OpCompositeExtract %float %45 0
+         %51 = OpCompositeExtract %float %45 1
+         %52 = OpCompositeConstruct %v2float %50 %51
+         %53 = OpFDiv %v2float %52 %49
+         %54 = OpSNegate %int %int_82
+         %57 = OpCompositeExtract %float %49 0
+         %58 = OpCompositeExtract %float %49 1
+         %60 = OpCompositeConstruct %v4float %57 %58 %float_15 %float_15
+         %61 = OpCompositeExtract %float %60 2
+         %62 = OpCompositeConstruct %v2float %float_0 %61
+               OpStore %x_208 %62
+         %65 = OpISub %int %int_120 %int_0
+         %67 = OpCompositeExtract %float %53 0
+         %69 = OpFMul %float %67 %float_256
+         %66 = OpConvertFToS %int %69
+         %71 = OpCompositeExtract %float %53 1
+         %72 = OpFMul %float %71 %float_256
+         %70 = OpConvertFToS %int %72
+         %73 = OpCompositeConstruct %v2int %66 %70
+               OpStore %x_214 %73
+               OpSelectionMerge %74 None
+               OpSwitch %uint_0 %75
+         %75 = OpLabel
+         %76 = OpLoad %v2int %x_214
+               OpStore %x_218_phi %76
+               OpBranch %77
+         %77 = OpLabel
+               OpLoopMerge %78 %79 None
+               OpBranch %80
+         %80 = OpLabel
+         %83 = OpLoad %v2int %x_218_phi
+         %84 = OpCompositeExtract %int %83 1
+               OpStore %x_251_phi %85
+               OpStore %x_252_phi %false
+         %88 = OpINotEqual %bool %84 %int_256
+               OpSelectionMerge %89 None
+               OpBranchConditional %88 %90 %91
+         %90 = OpLabel
+               OpBranch %89
+         %91 = OpLabel
+               OpBranch %78
+         %89 = OpLabel
+         %92 = OpCompositeExtract %int %83 0
+               OpStore %x_195 %247
+        %249 = OpAccessChain %_ptr_Function_int %x_195 %84
+        %250 = OpLoad %int %249
+        %251 = OpIAdd %int %250 %int_15
+        %252 = OpSLessThan %bool %92 %251
+               OpStore %x_236_phi %252
+               OpSelectionMerge %253 None
+               OpBranchConditional %252 %254 %253
+        %254 = OpLabel
+               OpStore %x_196 %247
+        %255 = OpAccessChain %_ptr_Function_int %x_196 %84
+        %256 = OpLoad %int %255
+        %257 = OpISub %int %256 %int_15
+        %258 = OpSGreaterThan %bool %92 %257
+               OpStore %x_235 %258
+        %259 = OpLoad %bool %x_235
+               OpStore %x_236_phi %259
+               OpBranch %253
+        %253 = OpLabel
+        %260 = OpLoad %bool %x_236_phi
+               OpSelectionMerge %261 None
+               OpBranchConditional %260 %262 %261
+        %262 = OpLabel
+               OpStore %x_197 %247
+        %263 = OpAccessChain %_ptr_Function_int %x_197 %84
+        %264 = OpLoad %int %263
+        %265 = OpIAdd %int %int_91 %int_244
+        %266 = OpLoad %v2float %x_208
+        %267 = OpCompositeConstruct %buf0 %266
+        %268 = OpCompositeExtract %v2float %267 0
+        %269 = OpCompositeExtract %float %268 1
+        %273 = OpISub %int %92 %264
+        %272 = OpConvertSToF %float %273
+        %270 = OpExtInst %float %271 FAbs %272
+        %274 = OpFSub %float %269 %270
+        %276 = OpFMul %float %274 %float_0_0666666701
+        %278 = OpCompositeConstruct %v4float %276 %276 %276 %float_1
+               OpStore %x_249 %278
+        %279 = OpLoad %v4float %x_249
+               OpStore %x_251_phi %279
+               OpStore %x_252_phi %true
+               OpBranch %78
+        %261 = OpLabel
+               OpStore %x_219_1 %83
+        %283 = OpAccessChain %_ptr_Function_int %x_219_1 %uint_1
+        %285 = OpIAdd %int %84 %int_1
+               OpStore %283 %285
+        %286 = OpLoad %v2int %x_219_1
+               OpBranch %79
+         %79 = OpLabel
+               OpStore %x_218_phi %286
+               OpBranch %77
+         %78 = OpLabel
+        %287 = OpLoad %v4float %x_251_phi
+               OpStore %x_251 %287
+        %288 = OpLoad %bool %x_252_phi
+        %289 = OpLoad %v4float %x_251
+               OpStore %x_254_phi %289
+               OpSelectionMerge %290 None
+               OpBranchConditional %288 %291 %290
+        %291 = OpLabel
+               OpBranch %74
+        %290 = OpLabel
+               OpStore %x_254_phi %292
+               OpBranch %74
+         %74 = OpLabel
+        %293 = OpLoad %v4float %x_254_phi
+               OpStore %x_GLF_color %293
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %294
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %298 = OpLabel
+        %299 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %299
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %301 = OpLabel
+        %302 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %302
+        %303 = OpFunctionCall %void %main_1
+        %305 = OpLoad %v4float %x_GLF_color
+        %306 = OpCompositeConstruct %main_out %305
+        %304 = OpFunctionCall %void %tint_symbol_3 %306
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-composites/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-composites/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..a8a9633
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-composites/1.wgsl.expected.wgsl
@@ -0,0 +1,99 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_195 : array<i32, 256>;
+  var x_196 : array<i32, 256>;
+  var x_197 : array<i32, 256>;
+  var x_208 : vec2<f32>;
+  var x_214 : vec2<i32>;
+  var x_249 : vec4<f32>;
+  var x_251 : vec4<f32>;
+  var x_218_phi : vec2<i32>;
+  var x_251_phi : vec4<f32>;
+  var x_252_phi : bool;
+  var x_254_phi : vec4<f32>;
+  let x_198 : vec4<f32> = gl_FragCoord;
+  let x_201 : vec2<f32> = x_6.resolution;
+  let x_202 : vec2<f32> = (vec2<f32>(x_198.x, x_198.y) / x_201);
+  let x_204 : i32 = -(82);
+  x_208 = vec2<f32>(0.0, vec4<f32>(x_201, 15.0, 15.0).z);
+  let x_209 : i32 = (120 - 0);
+  x_214 = vec2<i32>(i32((x_202.x * 256.0)), i32((x_202.y * 256.0)));
+  switch(0u) {
+    default: {
+      x_218_phi = x_214;
+      loop {
+        var x_235 : bool;
+        var x_236_phi : bool;
+        let x_218 : vec2<i32> = x_218_phi;
+        let x_221 : i32 = x_218.y;
+        x_251_phi = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+        x_252_phi = false;
+        if ((x_221 != 256)) {
+        } else {
+          break;
+        }
+        let x_225 : i32 = x_218.x;
+        x_195 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+        let x_227 : i32 = x_195[x_221];
+        let x_229 : bool = (x_225 < (x_227 + 15));
+        x_236_phi = x_229;
+        if (x_229) {
+          x_196 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+          let x_233 : i32 = x_196[x_221];
+          x_235 = (x_225 > (x_233 - 15));
+          x_236_phi = x_235;
+        }
+        let x_236 : bool = x_236_phi;
+        if (x_236) {
+          x_197 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+          let x_240 : i32 = x_197[x_221];
+          let x_244 : i32 = (91 + 244);
+          let x_248 : f32 = ((buf0(x_208).resolution.y - abs(f32((x_225 - x_240)))) * 0.06666667);
+          x_249 = vec4<f32>(x_248, x_248, x_248, 1.0);
+          x_251_phi = x_249;
+          x_252_phi = true;
+          break;
+        }
+        var x_219_1 : vec2<i32> = x_218;
+        x_219_1.y = (x_221 + 1);
+        let x_219 : vec2<i32> = x_219_1;
+
+        continuing {
+          x_218_phi = x_219;
+        }
+      }
+      x_251 = x_251_phi;
+      let x_252 : bool = x_252_phi;
+      x_254_phi = x_251;
+      if (x_252) {
+        break;
+      }
+      x_254_phi = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+    }
+  }
+  let x_254 : vec4<f32> = x_254_phi;
+  x_GLF_color = x_254;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-dead-break-and-unroll/1.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-dead-break-and-unroll/1.spvasm
new file mode 100644
index 0000000..b8609d3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-dead-break-and-unroll/1.spvasm
@@ -0,0 +1,620 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %pos "pos"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %ipos "ipos"
+               OpName %i "i"
+               OpName %map "map"
+               OpName %p "p"
+               OpName %canwalk "canwalk"
+               OpName %v "v"
+               OpName %directions "directions"
+               OpName %j "j"
+               OpName %d "d"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+   %float_16 = OpConstant %float 16
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_int = OpTypePointer Function %int
+    %int_256 = OpConstant %int 256
+       %bool = OpTypeBool
+   %uint_256 = OpConstant %uint 256
+%_arr_int_uint_256 = OpTypeArray %int %uint_256
+%_ptr_Private__arr_int_uint_256 = OpTypePointer Private %_arr_int_uint_256
+        %map = OpVariable %_ptr_Private__arr_int_uint_256 Private
+%_ptr_Private_int = OpTypePointer Private %int
+      %int_1 = OpConstant %int 1
+         %43 = OpConstantComposite %v2int %int_0 %int_0
+%_ptr_Function_bool = OpTypePointer Function %bool
+       %true = OpConstantTrue %bool
+      %int_2 = OpConstant %int 2
+     %int_16 = OpConstant %int 16
+     %int_14 = OpConstant %int 14
+      %false = OpConstantFalse %bool
+      %int_8 = OpConstant %int 8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+         %53 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+    %float_0 = OpConstant %float 0
+         %55 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+%mat2v4float = OpTypeMatrix %v4float 2
+%_ptr_Private_mat2v4float = OpTypePointer Private %mat2v4float
+         %58 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+         %59 = OpConstantComposite %mat2v4float %58 %58
+         %60 = OpVariable %_ptr_Private_mat2v4float Private %59
+         %61 = OpConstantNull %bool
+       %main = OpFunction %void None %18
+         %62 = OpLabel
+        %pos = OpVariable %_ptr_Function_v2float Function
+       %ipos = OpVariable %_ptr_Function_v2int Function
+          %i = OpVariable %_ptr_Function_int Function
+          %p = OpVariable %_ptr_Function_v2int Function
+    %canwalk = OpVariable %_ptr_Function_bool Function
+          %v = OpVariable %_ptr_Function_int Function
+ %directions = OpVariable %_ptr_Function_int Function
+          %j = OpVariable %_ptr_Function_int Function
+          %d = OpVariable %_ptr_Function_int Function
+         %63 = OpLoad %v4float %gl_FragCoord
+         %64 = OpVectorShuffle %v2float %63 %63 0 1
+         %65 = OpISub %int %int_256 %int_14
+         %66 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+         %67 = OpLoad %v2float %66
+         %68 = OpSNegate %int %65
+         %69 = OpFDiv %v2float %64 %67
+               OpStore %pos %69
+         %70 = OpAccessChain %_ptr_Function_float %pos %uint_0
+         %71 = OpLoad %float %70
+         %72 = OpFMul %float %71 %float_16
+         %73 = OpConvertFToS %int %72
+         %74 = OpAccessChain %_ptr_Function_float %pos %uint_1
+         %75 = OpLoad %float %74
+         %76 = OpFMul %float %75 %float_16
+         %77 = OpConvertFToS %int %76
+         %78 = OpCompositeConstruct %v2int %73 %77
+               OpStore %ipos %78
+               OpStore %i %int_0
+               OpBranch %79
+         %79 = OpLabel
+               OpLoopMerge %80 %81 None
+               OpBranch %82
+         %82 = OpLabel
+         %83 = OpLoad %int %i
+         %84 = OpSLessThan %bool %83 %int_256
+               OpBranchConditional %84 %85 %80
+         %85 = OpLabel
+         %86 = OpLoad %int %i
+         %87 = OpAccessChain %_ptr_Private_int %map %86
+               OpStore %87 %int_0
+               OpBranch %81
+         %81 = OpLabel
+         %88 = OpLoad %int %i
+         %89 = OpIAdd %int %88 %int_1
+               OpStore %i %89
+               OpBranch %79
+         %80 = OpLabel
+               OpStore %p %43
+               OpStore %canwalk %true
+               OpStore %v %int_0
+               OpBranch %90
+         %90 = OpLabel
+               OpLoopMerge %91 %92 None
+               OpBranch %93
+         %93 = OpLabel
+         %94 = OpLoad %int %v
+         %95 = OpIAdd %int %94 %int_1
+               OpStore %v %95
+               OpStore %directions %int_0
+         %96 = OpAccessChain %_ptr_Function_int %p %uint_0
+         %97 = OpLoad %int %96
+         %98 = OpSGreaterThan %bool %97 %int_0
+               OpSelectionMerge %99 None
+               OpBranchConditional %98 %100 %99
+        %100 = OpLabel
+        %101 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %102 = OpLoad %int %101
+        %103 = OpISub %int %102 %int_2
+        %104 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %105 = OpLoad %int %104
+        %106 = OpIMul %int %105 %int_16
+        %107 = OpIAdd %int %103 %106
+        %108 = OpAccessChain %_ptr_Private_int %map %107
+        %109 = OpLoad %int %108
+        %110 = OpIEqual %bool %109 %int_0
+               OpBranch %99
+         %99 = OpLabel
+        %111 = OpPhi %bool %98 %93 %110 %100
+               OpSelectionMerge %112 None
+               OpBranchConditional %111 %113 %112
+        %113 = OpLabel
+        %114 = OpLoad %int %directions
+        %115 = OpIAdd %int %114 %int_1
+               OpStore %directions %115
+               OpBranch %112
+        %112 = OpLabel
+        %116 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %117 = OpLoad %int %116
+        %118 = OpSGreaterThan %bool %117 %int_0
+               OpSelectionMerge %119 None
+               OpBranchConditional %118 %120 %119
+        %120 = OpLabel
+        %121 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %122 = OpLoad %int %121
+        %123 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %124 = OpLoad %int %123
+        %125 = OpISub %int %124 %int_2
+        %126 = OpIMul %int %125 %int_16
+        %127 = OpIAdd %int %122 %126
+        %128 = OpAccessChain %_ptr_Private_int %map %127
+        %129 = OpLoad %int %128
+        %130 = OpIEqual %bool %129 %int_0
+               OpBranch %119
+        %119 = OpLabel
+        %131 = OpPhi %bool %118 %112 %130 %120
+               OpSelectionMerge %132 None
+               OpBranchConditional %131 %133 %132
+        %133 = OpLabel
+        %134 = OpLoad %int %directions
+        %135 = OpIAdd %int %134 %int_1
+               OpStore %directions %135
+               OpBranch %132
+        %132 = OpLabel
+        %136 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %137 = OpLoad %int %136
+        %138 = OpSLessThan %bool %137 %int_14
+               OpSelectionMerge %139 None
+               OpBranchConditional %138 %140 %139
+        %140 = OpLabel
+        %141 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %142 = OpLoad %int %141
+        %143 = OpIAdd %int %142 %int_2
+        %144 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %145 = OpLoad %int %144
+        %146 = OpIMul %int %145 %int_16
+        %147 = OpIAdd %int %143 %146
+        %148 = OpAccessChain %_ptr_Private_int %map %147
+        %149 = OpLoad %int %148
+        %150 = OpIEqual %bool %149 %int_0
+               OpBranch %139
+        %139 = OpLabel
+        %151 = OpPhi %bool %138 %132 %150 %140
+               OpSelectionMerge %152 None
+               OpBranchConditional %151 %153 %152
+        %153 = OpLabel
+        %154 = OpLoad %int %directions
+        %155 = OpIAdd %int %154 %int_1
+               OpStore %directions %155
+               OpBranch %152
+        %152 = OpLabel
+        %156 = OpISub %int %int_256 %68
+        %157 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %158 = OpLoad %int %157
+        %159 = OpSLessThan %bool %158 %int_14
+               OpSelectionMerge %160 None
+               OpBranchConditional %159 %161 %160
+        %161 = OpLabel
+        %162 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %163 = OpLoad %int %162
+        %164 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %165 = OpLoad %int %164
+        %166 = OpIAdd %int %165 %int_2
+        %167 = OpIMul %int %166 %int_16
+        %168 = OpIAdd %int %163 %167
+        %169 = OpAccessChain %_ptr_Private_int %map %168
+        %170 = OpLoad %int %169
+        %171 = OpIEqual %bool %170 %int_0
+               OpBranch %160
+        %160 = OpLabel
+        %172 = OpPhi %bool %159 %152 %171 %161
+               OpSelectionMerge %173 None
+               OpBranchConditional %172 %174 %173
+        %174 = OpLabel
+        %175 = OpLoad %int %directions
+        %176 = OpIAdd %int %175 %int_1
+               OpStore %directions %176
+               OpBranch %173
+        %173 = OpLabel
+        %177 = OpLoad %int %directions
+        %178 = OpIEqual %bool %177 %int_0
+               OpSelectionMerge %179 None
+               OpBranchConditional %178 %180 %181
+        %180 = OpLabel
+               OpStore %canwalk %false
+               OpStore %i %int_0
+               OpBranch %182
+        %182 = OpLabel
+               OpLoopMerge %183 %184 None
+               OpBranch %185
+        %185 = OpLabel
+        %186 = OpLoad %int %i
+        %187 = OpSLessThan %bool %186 %int_8
+               OpBranchConditional %187 %188 %183
+        %188 = OpLabel
+               OpStore %j %int_0
+        %189 = OpISub %int %156 %186
+               OpStore %60 %59
+               OpBranchConditional %61 %184 %190
+        %190 = OpLabel
+               OpLoopMerge %191 %192 Unroll
+               OpBranch %193
+        %193 = OpLabel
+        %194 = OpLoad %int %j
+        %195 = OpSLessThan %bool %194 %int_8
+               OpBranchConditional %195 %196 %191
+        %196 = OpLabel
+        %197 = OpLoad %int %j
+        %198 = OpIMul %int %197 %int_2
+        %199 = OpLoad %int %i
+        %200 = OpIMul %int %199 %int_2
+        %201 = OpIMul %int %200 %int_16
+        %202 = OpIAdd %int %198 %201
+        %203 = OpAccessChain %_ptr_Private_int %map %202
+        %204 = OpLoad %int %203
+        %205 = OpIEqual %bool %204 %int_0
+               OpSelectionMerge %206 None
+               OpBranchConditional %205 %207 %206
+        %207 = OpLabel
+        %208 = OpLoad %int %j
+        %209 = OpIMul %int %208 %int_2
+        %210 = OpAccessChain %_ptr_Function_int %p %uint_0
+               OpStore %210 %209
+        %211 = OpLoad %int %i
+        %212 = OpIMul %int %211 %int_2
+        %213 = OpAccessChain %_ptr_Function_int %p %uint_1
+               OpStore %213 %212
+               OpStore %canwalk %true
+               OpBranch %206
+        %206 = OpLabel
+               OpBranch %192
+        %192 = OpLabel
+        %214 = OpLoad %int %j
+        %215 = OpIAdd %int %214 %int_1
+               OpStore %j %215
+               OpBranch %190
+        %191 = OpLabel
+               OpBranch %184
+        %184 = OpLabel
+        %216 = OpLoad %int %i
+        %217 = OpIAdd %int %216 %int_1
+               OpStore %i %217
+               OpBranch %182
+        %183 = OpLabel
+        %218 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %219 = OpLoad %int %218
+        %220 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %221 = OpLoad %int %220
+        %222 = OpIMul %int %221 %int_16
+        %223 = OpIAdd %int %219 %222
+        %224 = OpAccessChain %_ptr_Private_int %map %223
+               OpStore %224 %int_1
+               OpBranch %179
+        %181 = OpLabel
+        %225 = OpLoad %int %v
+        %226 = OpLoad %int %directions
+        %227 = OpSMod %int %225 %226
+               OpStore %d %227
+        %228 = OpLoad %int %directions
+        %229 = OpLoad %int %v
+        %230 = OpIAdd %int %229 %228
+               OpStore %v %230
+        %231 = OpLoad %int %d
+        %232 = OpSGreaterThanEqual %bool %231 %int_0
+               OpSelectionMerge %233 None
+               OpBranchConditional %232 %234 %233
+        %234 = OpLabel
+        %235 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %236 = OpLoad %int %235
+        %237 = OpSGreaterThan %bool %236 %int_0
+               OpBranch %233
+        %233 = OpLabel
+        %238 = OpPhi %bool %232 %181 %237 %234
+               OpSelectionMerge %239 None
+               OpBranchConditional %238 %240 %239
+        %240 = OpLabel
+        %241 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %242 = OpLoad %int %241
+        %243 = OpISub %int %242 %int_2
+        %244 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %245 = OpLoad %int %244
+        %246 = OpIMul %int %245 %int_16
+        %247 = OpIAdd %int %243 %246
+        %248 = OpAccessChain %_ptr_Private_int %map %247
+        %249 = OpLoad %int %248
+        %250 = OpIEqual %bool %249 %int_0
+               OpBranch %239
+        %239 = OpLabel
+        %251 = OpPhi %bool %238 %233 %250 %240
+               OpSelectionMerge %252 None
+               OpBranchConditional %251 %253 %252
+        %253 = OpLabel
+        %254 = OpLoad %int %d
+        %255 = OpISub %int %254 %int_1
+               OpStore %d %255
+        %256 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %257 = OpLoad %int %256
+        %258 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %259 = OpLoad %int %258
+        %260 = OpIMul %int %259 %int_16
+        %261 = OpIAdd %int %257 %260
+        %262 = OpAccessChain %_ptr_Private_int %map %261
+               OpStore %262 %int_1
+        %263 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %264 = OpLoad %int %263
+        %265 = OpISub %int %264 %int_1
+        %266 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %267 = OpLoad %int %266
+        %268 = OpIMul %int %267 %int_16
+        %269 = OpIAdd %int %265 %268
+        %270 = OpAccessChain %_ptr_Private_int %map %269
+               OpStore %270 %int_1
+        %271 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %272 = OpLoad %int %271
+        %273 = OpISub %int %272 %int_2
+        %274 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %275 = OpLoad %int %274
+        %276 = OpIMul %int %275 %int_16
+        %277 = OpIAdd %int %273 %276
+        %278 = OpAccessChain %_ptr_Private_int %map %277
+               OpStore %278 %int_1
+        %279 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %280 = OpLoad %int %279
+        %281 = OpISub %int %280 %int_2
+        %282 = OpAccessChain %_ptr_Function_int %p %uint_0
+               OpStore %282 %281
+               OpBranch %252
+        %252 = OpLabel
+        %283 = OpLoad %int %d
+        %284 = OpSGreaterThanEqual %bool %283 %int_0
+               OpSelectionMerge %285 None
+               OpBranchConditional %284 %286 %285
+        %286 = OpLabel
+        %287 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %288 = OpLoad %int %287
+        %289 = OpSGreaterThan %bool %288 %int_0
+               OpBranch %285
+        %285 = OpLabel
+        %290 = OpPhi %bool %284 %252 %289 %286
+               OpSelectionMerge %291 None
+               OpBranchConditional %290 %292 %291
+        %292 = OpLabel
+        %293 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %294 = OpLoad %int %293
+        %295 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %296 = OpLoad %int %295
+        %297 = OpISub %int %296 %int_2
+        %298 = OpIMul %int %297 %int_16
+        %299 = OpIAdd %int %294 %298
+        %300 = OpAccessChain %_ptr_Private_int %map %299
+        %301 = OpLoad %int %300
+        %302 = OpIEqual %bool %301 %int_0
+               OpBranch %291
+        %291 = OpLabel
+        %303 = OpPhi %bool %290 %285 %302 %292
+               OpSelectionMerge %304 None
+               OpBranchConditional %303 %305 %304
+        %305 = OpLabel
+        %306 = OpLoad %int %d
+        %307 = OpISub %int %306 %int_1
+               OpStore %d %307
+        %308 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %309 = OpLoad %int %308
+        %310 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %311 = OpLoad %int %310
+        %312 = OpIMul %int %311 %int_16
+        %313 = OpIAdd %int %309 %312
+        %314 = OpAccessChain %_ptr_Private_int %map %313
+               OpStore %314 %int_1
+        %315 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %316 = OpLoad %int %315
+        %317 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %318 = OpLoad %int %317
+        %319 = OpISub %int %318 %int_1
+        %320 = OpIMul %int %319 %int_16
+        %321 = OpIAdd %int %316 %320
+        %322 = OpAccessChain %_ptr_Private_int %map %321
+               OpStore %322 %int_1
+        %323 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %324 = OpLoad %int %323
+        %325 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %326 = OpLoad %int %325
+        %327 = OpISub %int %326 %int_2
+        %328 = OpIMul %int %327 %int_16
+        %329 = OpIAdd %int %324 %328
+        %330 = OpAccessChain %_ptr_Private_int %map %329
+               OpStore %330 %int_1
+        %331 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %332 = OpLoad %int %331
+        %333 = OpISub %int %332 %int_2
+        %334 = OpAccessChain %_ptr_Function_int %p %uint_1
+               OpStore %334 %333
+               OpBranch %304
+        %304 = OpLabel
+        %335 = OpLoad %int %d
+        %336 = OpSGreaterThanEqual %bool %335 %int_0
+               OpSelectionMerge %337 None
+               OpBranchConditional %336 %338 %337
+        %338 = OpLabel
+        %339 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %340 = OpLoad %int %339
+        %341 = OpSLessThan %bool %340 %int_14
+               OpBranch %337
+        %337 = OpLabel
+        %342 = OpPhi %bool %336 %304 %341 %338
+               OpSelectionMerge %343 None
+               OpBranchConditional %342 %344 %343
+        %344 = OpLabel
+        %345 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %346 = OpLoad %int %345
+        %347 = OpIAdd %int %346 %int_2
+        %348 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %349 = OpLoad %int %348
+        %350 = OpIMul %int %349 %int_16
+        %351 = OpIAdd %int %347 %350
+        %352 = OpAccessChain %_ptr_Private_int %map %351
+        %353 = OpLoad %int %352
+        %354 = OpIEqual %bool %353 %int_0
+               OpBranch %343
+        %343 = OpLabel
+        %355 = OpPhi %bool %342 %337 %354 %344
+               OpSelectionMerge %356 None
+               OpBranchConditional %355 %357 %356
+        %357 = OpLabel
+        %358 = OpLoad %int %d
+        %359 = OpISub %int %358 %int_1
+               OpStore %d %359
+        %360 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %361 = OpLoad %int %360
+        %362 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %363 = OpLoad %int %362
+        %364 = OpIMul %int %363 %int_16
+        %365 = OpIAdd %int %361 %364
+        %366 = OpAccessChain %_ptr_Private_int %map %365
+               OpStore %366 %int_1
+        %367 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %368 = OpLoad %int %367
+        %369 = OpIAdd %int %368 %int_1
+        %370 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %371 = OpLoad %int %370
+        %372 = OpIMul %int %371 %int_16
+        %373 = OpIAdd %int %369 %372
+        %374 = OpAccessChain %_ptr_Private_int %map %373
+               OpStore %374 %int_1
+        %375 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %376 = OpLoad %int %375
+        %377 = OpIAdd %int %376 %int_2
+        %378 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %379 = OpLoad %int %378
+        %380 = OpIMul %int %379 %int_16
+        %381 = OpIAdd %int %377 %380
+        %382 = OpAccessChain %_ptr_Private_int %map %381
+               OpStore %382 %int_1
+        %383 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %384 = OpLoad %int %383
+        %385 = OpIAdd %int %384 %int_2
+        %386 = OpAccessChain %_ptr_Function_int %p %uint_0
+               OpStore %386 %385
+               OpBranch %356
+        %356 = OpLabel
+        %387 = OpLoad %int %d
+        %388 = OpSGreaterThanEqual %bool %387 %int_0
+               OpSelectionMerge %389 None
+               OpBranchConditional %388 %390 %389
+        %390 = OpLabel
+        %391 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %392 = OpLoad %int %391
+        %393 = OpSLessThan %bool %392 %int_14
+               OpBranch %389
+        %389 = OpLabel
+        %394 = OpPhi %bool %388 %356 %393 %390
+               OpSelectionMerge %395 None
+               OpBranchConditional %394 %396 %395
+        %396 = OpLabel
+        %397 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %398 = OpLoad %int %397
+        %399 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %400 = OpLoad %int %399
+        %401 = OpIAdd %int %400 %int_2
+        %402 = OpIMul %int %401 %int_16
+        %403 = OpIAdd %int %398 %402
+        %404 = OpAccessChain %_ptr_Private_int %map %403
+        %405 = OpLoad %int %404
+        %406 = OpIEqual %bool %405 %int_0
+               OpBranch %395
+        %395 = OpLabel
+        %407 = OpPhi %bool %394 %389 %406 %396
+               OpSelectionMerge %408 None
+               OpBranchConditional %407 %409 %408
+        %409 = OpLabel
+        %410 = OpLoad %int %d
+        %411 = OpISub %int %410 %int_1
+               OpStore %d %411
+        %412 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %413 = OpLoad %int %412
+        %414 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %415 = OpLoad %int %414
+        %416 = OpIMul %int %415 %int_16
+        %417 = OpIAdd %int %413 %416
+        %418 = OpAccessChain %_ptr_Private_int %map %417
+               OpStore %418 %int_1
+        %419 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %420 = OpLoad %int %419
+        %421 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %422 = OpLoad %int %421
+        %423 = OpIAdd %int %422 %int_1
+        %424 = OpIMul %int %423 %int_16
+        %425 = OpIAdd %int %420 %424
+        %426 = OpAccessChain %_ptr_Private_int %map %425
+               OpStore %426 %int_1
+        %427 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %428 = OpLoad %int %427
+        %429 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %430 = OpLoad %int %429
+        %431 = OpIAdd %int %430 %int_2
+        %432 = OpIMul %int %431 %int_16
+        %433 = OpIAdd %int %428 %432
+        %434 = OpAccessChain %_ptr_Private_int %map %433
+               OpStore %434 %int_1
+        %435 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %436 = OpLoad %int %435
+        %437 = OpIAdd %int %436 %int_2
+        %438 = OpAccessChain %_ptr_Function_int %p %uint_1
+               OpStore %438 %437
+               OpBranch %408
+        %408 = OpLabel
+               OpBranch %179
+        %179 = OpLabel
+        %439 = OpAccessChain %_ptr_Function_int %ipos %uint_1
+        %440 = OpLoad %int %439
+        %441 = OpIMul %int %440 %int_16
+        %442 = OpAccessChain %_ptr_Function_int %ipos %uint_0
+        %443 = OpLoad %int %442
+        %444 = OpIAdd %int %441 %443
+        %445 = OpAccessChain %_ptr_Private_int %map %444
+        %446 = OpLoad %int %445
+        %447 = OpIEqual %bool %446 %int_1
+               OpSelectionMerge %448 None
+               OpBranchConditional %447 %449 %448
+        %449 = OpLabel
+               OpStore %_GLF_color %53
+               OpReturn
+        %448 = OpLabel
+               OpBranch %92
+         %92 = OpLabel
+        %450 = OpLoad %bool %canwalk
+               OpBranchConditional %450 %90 %91
+         %91 = OpLabel
+               OpStore %_GLF_color %55
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-dead-break-and-unroll/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-dead-break-and-unroll/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..d8420f8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-dead-break-and-unroll/1.spvasm.expected.hlsl
@@ -0,0 +1,309 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[1];
+};
+static int map[256] = (int[256])0;
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float2x4 x_60 = float2x4(float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f));
+
+void main_1() {
+  float2 pos = float2(0.0f, 0.0f);
+  int2 ipos = int2(0, 0);
+  int i = 0;
+  int2 p = int2(0, 0);
+  bool canwalk = false;
+  int v = 0;
+  int directions = 0;
+  int j = 0;
+  int d = 0;
+  const float4 x_63 = gl_FragCoord;
+  const float2 x_67 = asfloat(x_7[0].xy);
+  const int x_68 = -((256 - 14));
+  pos = (float2(x_63.x, x_63.y) / x_67);
+  const float x_71 = pos.x;
+  const float x_75 = pos.y;
+  ipos = int2(int((x_71 * 16.0f)), int((x_75 * 16.0f)));
+  i = 0;
+  {
+    for(; (i < 256); i = (i + 1)) {
+      map[i] = 0;
+    }
+  }
+  p = int2(0, 0);
+  canwalk = true;
+  v = 0;
+  while (true) {
+    bool x_110 = false;
+    bool x_130 = false;
+    bool x_150 = false;
+    bool x_171 = false;
+    bool x_111_phi = false;
+    bool x_131_phi = false;
+    bool x_151_phi = false;
+    bool x_172_phi = false;
+    v = (v + 1);
+    directions = 0;
+    const int x_97 = p.x;
+    const bool x_98 = (x_97 > 0);
+    x_111_phi = x_98;
+    if (x_98) {
+      const int x_102 = p.x;
+      const int x_105 = p.y;
+      const int x_109 = map[((x_102 - 2) + (x_105 * 16))];
+      x_110 = (x_109 == 0);
+      x_111_phi = x_110;
+    }
+    if (x_111_phi) {
+      directions = (directions + 1);
+    }
+    const int x_117 = p.y;
+    const bool x_118 = (x_117 > 0);
+    x_131_phi = x_118;
+    if (x_118) {
+      const int x_122 = p.x;
+      const int x_124 = p.y;
+      const int x_129 = map[(x_122 + ((x_124 - 2) * 16))];
+      x_130 = (x_129 == 0);
+      x_131_phi = x_130;
+    }
+    if (x_131_phi) {
+      directions = (directions + 1);
+    }
+    const int x_137 = p.x;
+    const bool x_138 = (x_137 < 14);
+    x_151_phi = x_138;
+    if (x_138) {
+      const int x_142 = p.x;
+      const int x_145 = p.y;
+      const int x_149 = map[((x_142 + 2) + (x_145 * 16))];
+      x_150 = (x_149 == 0);
+      x_151_phi = x_150;
+    }
+    if (x_151_phi) {
+      directions = (directions + 1);
+    }
+    const int x_156 = (256 - x_68);
+    const int x_158 = p.y;
+    const bool x_159 = (x_158 < 14);
+    x_172_phi = x_159;
+    if (x_159) {
+      const int x_163 = p.x;
+      const int x_165 = p.y;
+      const int x_170 = map[(x_163 + ((x_165 + 2) * 16))];
+      x_171 = (x_170 == 0);
+      x_172_phi = x_171;
+    }
+    if (x_172_phi) {
+      directions = (directions + 1);
+    }
+    bool x_237 = false;
+    bool x_250 = false;
+    bool x_289 = false;
+    bool x_302 = false;
+    bool x_341 = false;
+    bool x_354 = false;
+    bool x_393 = false;
+    bool x_406 = false;
+    bool x_238_phi = false;
+    bool x_251_phi = false;
+    bool x_290_phi = false;
+    bool x_303_phi = false;
+    bool x_342_phi = false;
+    bool x_355_phi = false;
+    bool x_394_phi = false;
+    bool x_407_phi = false;
+    if ((directions == 0)) {
+      canwalk = false;
+      i = 0;
+      while (true) {
+        const int x_186 = i;
+        if ((x_186 < 8)) {
+        } else {
+          break;
+        }
+        j = 0;
+        const int x_189 = (x_156 - x_186);
+        x_60 = float2x4(float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f));
+        if (false) {
+          {
+            i = (i + 1);
+          }
+          continue;
+        }
+        {
+          for(; (j < 8); j = (j + 1)) {
+            const int x_204 = map[((j * 2) + ((i * 2) * 16))];
+            if ((x_204 == 0)) {
+              p.x = (j * 2);
+              p.y = (i * 2);
+              canwalk = true;
+            }
+          }
+        }
+        {
+          i = (i + 1);
+        }
+      }
+      const int x_219 = p.x;
+      const int x_221 = p.y;
+      map[(x_219 + (x_221 * 16))] = 1;
+    } else {
+      d = (v % directions);
+      v = (v + directions);
+      const bool x_232 = (d >= 0);
+      x_238_phi = x_232;
+      if (x_232) {
+        const int x_236 = p.x;
+        x_237 = (x_236 > 0);
+        x_238_phi = x_237;
+      }
+      const bool x_238 = x_238_phi;
+      x_251_phi = x_238;
+      if (x_238) {
+        const int x_242 = p.x;
+        const int x_245 = p.y;
+        const int x_249 = map[((x_242 - 2) + (x_245 * 16))];
+        x_250 = (x_249 == 0);
+        x_251_phi = x_250;
+      }
+      if (x_251_phi) {
+        d = (d - 1);
+        const int x_257 = p.x;
+        const int x_259 = p.y;
+        map[(x_257 + (x_259 * 16))] = 1;
+        const int x_264 = p.x;
+        const int x_267 = p.y;
+        map[((x_264 - 1) + (x_267 * 16))] = 1;
+        const int x_272 = p.x;
+        const int x_275 = p.y;
+        map[((x_272 - 2) + (x_275 * 16))] = 1;
+        const int x_280 = p.x;
+        p.x = (x_280 - 2);
+      }
+      const bool x_284 = (d >= 0);
+      x_290_phi = x_284;
+      if (x_284) {
+        const int x_288 = p.y;
+        x_289 = (x_288 > 0);
+        x_290_phi = x_289;
+      }
+      const bool x_290 = x_290_phi;
+      x_303_phi = x_290;
+      if (x_290) {
+        const int x_294 = p.x;
+        const int x_296 = p.y;
+        const int x_301 = map[(x_294 + ((x_296 - 2) * 16))];
+        x_302 = (x_301 == 0);
+        x_303_phi = x_302;
+      }
+      if (x_303_phi) {
+        d = (d - 1);
+        const int x_309 = p.x;
+        const int x_311 = p.y;
+        map[(x_309 + (x_311 * 16))] = 1;
+        const int x_316 = p.x;
+        const int x_318 = p.y;
+        map[(x_316 + ((x_318 - 1) * 16))] = 1;
+        const int x_324 = p.x;
+        const int x_326 = p.y;
+        map[(x_324 + ((x_326 - 2) * 16))] = 1;
+        const int x_332 = p.y;
+        p.y = (x_332 - 2);
+      }
+      const bool x_336 = (d >= 0);
+      x_342_phi = x_336;
+      if (x_336) {
+        const int x_340 = p.x;
+        x_341 = (x_340 < 14);
+        x_342_phi = x_341;
+      }
+      const bool x_342 = x_342_phi;
+      x_355_phi = x_342;
+      if (x_342) {
+        const int x_346 = p.x;
+        const int x_349 = p.y;
+        const int x_353 = map[((x_346 + 2) + (x_349 * 16))];
+        x_354 = (x_353 == 0);
+        x_355_phi = x_354;
+      }
+      if (x_355_phi) {
+        d = (d - 1);
+        const int x_361 = p.x;
+        const int x_363 = p.y;
+        map[(x_361 + (x_363 * 16))] = 1;
+        const int x_368 = p.x;
+        const int x_371 = p.y;
+        map[((x_368 + 1) + (x_371 * 16))] = 1;
+        const int x_376 = p.x;
+        const int x_379 = p.y;
+        map[((x_376 + 2) + (x_379 * 16))] = 1;
+        const int x_384 = p.x;
+        p.x = (x_384 + 2);
+      }
+      const bool x_388 = (d >= 0);
+      x_394_phi = x_388;
+      if (x_388) {
+        const int x_392 = p.y;
+        x_393 = (x_392 < 14);
+        x_394_phi = x_393;
+      }
+      const bool x_394 = x_394_phi;
+      x_407_phi = x_394;
+      if (x_394) {
+        const int x_398 = p.x;
+        const int x_400 = p.y;
+        const int x_405 = map[(x_398 + ((x_400 + 2) * 16))];
+        x_406 = (x_405 == 0);
+        x_407_phi = x_406;
+      }
+      if (x_407_phi) {
+        d = (d - 1);
+        const int x_413 = p.x;
+        const int x_415 = p.y;
+        map[(x_413 + (x_415 * 16))] = 1;
+        const int x_420 = p.x;
+        const int x_422 = p.y;
+        map[(x_420 + ((x_422 + 1) * 16))] = 1;
+        const int x_428 = p.x;
+        const int x_430 = p.y;
+        map[(x_428 + ((x_430 + 2) * 16))] = 1;
+        const int x_436 = p.y;
+        p.y = (x_436 + 2);
+      }
+    }
+    const int x_440 = ipos.y;
+    const int x_443 = ipos.x;
+    const int x_446 = map[((x_440 * 16) + x_443)];
+    if ((x_446 == 1)) {
+      x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+      return;
+    }
+    {
+      if (canwalk) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_GLF_color = float4(0.0f, 0.0f, 0.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-dead-break-and-unroll/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-dead-break-and-unroll/1.spvasm.expected.msl
new file mode 100644
index 0000000..192b6aa
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-dead-break-and-unroll/1.spvasm.expected.msl
@@ -0,0 +1,359 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  int arr[256];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_5, thread tint_array_wrapper* const tint_symbol_6, thread float2x4* const tint_symbol_7, thread float4* const tint_symbol_8) {
+  float2 pos = 0.0f;
+  int2 ipos = 0;
+  int i = 0;
+  int2 p = 0;
+  bool canwalk = false;
+  int v = 0;
+  int directions = 0;
+  int j = 0;
+  int d = 0;
+  float4 const x_63 = *(tint_symbol_5);
+  float2 const x_67 = x_7.resolution;
+  int const x_68 = -((256 - 14));
+  pos = (float2(x_63.x, x_63.y) / x_67);
+  float const x_71 = pos.x;
+  float const x_75 = pos.y;
+  ipos = int2(int((x_71 * 16.0f)), int((x_75 * 16.0f)));
+  i = 0;
+  while (true) {
+    int const x_83 = i;
+    if ((x_83 < 256)) {
+    } else {
+      break;
+    }
+    int const x_86 = i;
+    (*(tint_symbol_6)).arr[x_86] = 0;
+    {
+      int const x_88 = i;
+      i = (x_88 + 1);
+    }
+  }
+  p = int2(0, 0);
+  canwalk = true;
+  v = 0;
+  while (true) {
+    bool x_110 = false;
+    bool x_130 = false;
+    bool x_150 = false;
+    bool x_171 = false;
+    bool x_111_phi = false;
+    bool x_131_phi = false;
+    bool x_151_phi = false;
+    bool x_172_phi = false;
+    int const x_94 = v;
+    v = (x_94 + 1);
+    directions = 0;
+    int const x_97 = p.x;
+    bool const x_98 = (x_97 > 0);
+    x_111_phi = x_98;
+    if (x_98) {
+      int const x_102 = p.x;
+      int const x_105 = p.y;
+      int const x_109 = (*(tint_symbol_6)).arr[((x_102 - 2) + (x_105 * 16))];
+      x_110 = (x_109 == 0);
+      x_111_phi = x_110;
+    }
+    bool const x_111 = x_111_phi;
+    if (x_111) {
+      int const x_114 = directions;
+      directions = (x_114 + 1);
+    }
+    int const x_117 = p.y;
+    bool const x_118 = (x_117 > 0);
+    x_131_phi = x_118;
+    if (x_118) {
+      int const x_122 = p.x;
+      int const x_124 = p.y;
+      int const x_129 = (*(tint_symbol_6)).arr[(x_122 + ((x_124 - 2) * 16))];
+      x_130 = (x_129 == 0);
+      x_131_phi = x_130;
+    }
+    bool const x_131 = x_131_phi;
+    if (x_131) {
+      int const x_134 = directions;
+      directions = (x_134 + 1);
+    }
+    int const x_137 = p.x;
+    bool const x_138 = (x_137 < 14);
+    x_151_phi = x_138;
+    if (x_138) {
+      int const x_142 = p.x;
+      int const x_145 = p.y;
+      int const x_149 = (*(tint_symbol_6)).arr[((x_142 + 2) + (x_145 * 16))];
+      x_150 = (x_149 == 0);
+      x_151_phi = x_150;
+    }
+    bool const x_151 = x_151_phi;
+    if (x_151) {
+      int const x_154 = directions;
+      directions = (x_154 + 1);
+    }
+    int const x_156 = (256 - x_68);
+    int const x_158 = p.y;
+    bool const x_159 = (x_158 < 14);
+    x_172_phi = x_159;
+    if (x_159) {
+      int const x_163 = p.x;
+      int const x_165 = p.y;
+      int const x_170 = (*(tint_symbol_6)).arr[(x_163 + ((x_165 + 2) * 16))];
+      x_171 = (x_170 == 0);
+      x_172_phi = x_171;
+    }
+    bool const x_172 = x_172_phi;
+    if (x_172) {
+      int const x_175 = directions;
+      directions = (x_175 + 1);
+    }
+    bool x_237 = false;
+    bool x_250 = false;
+    bool x_289 = false;
+    bool x_302 = false;
+    bool x_341 = false;
+    bool x_354 = false;
+    bool x_393 = false;
+    bool x_406 = false;
+    bool x_238_phi = false;
+    bool x_251_phi = false;
+    bool x_290_phi = false;
+    bool x_303_phi = false;
+    bool x_342_phi = false;
+    bool x_355_phi = false;
+    bool x_394_phi = false;
+    bool x_407_phi = false;
+    int const x_177 = directions;
+    if ((x_177 == 0)) {
+      canwalk = false;
+      i = 0;
+      while (true) {
+        int const x_186 = i;
+        if ((x_186 < 8)) {
+        } else {
+          break;
+        }
+        j = 0;
+        int const x_189 = (x_156 - x_186);
+        *(tint_symbol_7) = float2x4(float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f));
+        if (false) {
+          {
+            int const x_216 = i;
+            i = (x_216 + 1);
+          }
+          continue;
+        }
+        while (true) {
+          int const x_194 = j;
+          if ((x_194 < 8)) {
+          } else {
+            break;
+          }
+          int const x_197 = j;
+          int const x_199 = i;
+          int const x_204 = (*(tint_symbol_6)).arr[((x_197 * 2) + ((x_199 * 2) * 16))];
+          if ((x_204 == 0)) {
+            int const x_208 = j;
+            p.x = (x_208 * 2);
+            int const x_211 = i;
+            p.y = (x_211 * 2);
+            canwalk = true;
+          }
+          {
+            int const x_214 = j;
+            j = (x_214 + 1);
+          }
+        }
+        {
+          int const x_216 = i;
+          i = (x_216 + 1);
+        }
+      }
+      int const x_219 = p.x;
+      int const x_221 = p.y;
+      (*(tint_symbol_6)).arr[(x_219 + (x_221 * 16))] = 1;
+    } else {
+      int const x_225 = v;
+      int const x_226 = directions;
+      d = (x_225 % x_226);
+      int const x_228 = directions;
+      int const x_229 = v;
+      v = (x_229 + x_228);
+      int const x_231 = d;
+      bool const x_232 = (x_231 >= 0);
+      x_238_phi = x_232;
+      if (x_232) {
+        int const x_236 = p.x;
+        x_237 = (x_236 > 0);
+        x_238_phi = x_237;
+      }
+      bool const x_238 = x_238_phi;
+      x_251_phi = x_238;
+      if (x_238) {
+        int const x_242 = p.x;
+        int const x_245 = p.y;
+        int const x_249 = (*(tint_symbol_6)).arr[((x_242 - 2) + (x_245 * 16))];
+        x_250 = (x_249 == 0);
+        x_251_phi = x_250;
+      }
+      bool const x_251 = x_251_phi;
+      if (x_251) {
+        int const x_254 = d;
+        d = (x_254 - 1);
+        int const x_257 = p.x;
+        int const x_259 = p.y;
+        (*(tint_symbol_6)).arr[(x_257 + (x_259 * 16))] = 1;
+        int const x_264 = p.x;
+        int const x_267 = p.y;
+        (*(tint_symbol_6)).arr[((x_264 - 1) + (x_267 * 16))] = 1;
+        int const x_272 = p.x;
+        int const x_275 = p.y;
+        (*(tint_symbol_6)).arr[((x_272 - 2) + (x_275 * 16))] = 1;
+        int const x_280 = p.x;
+        p.x = (x_280 - 2);
+      }
+      int const x_283 = d;
+      bool const x_284 = (x_283 >= 0);
+      x_290_phi = x_284;
+      if (x_284) {
+        int const x_288 = p.y;
+        x_289 = (x_288 > 0);
+        x_290_phi = x_289;
+      }
+      bool const x_290 = x_290_phi;
+      x_303_phi = x_290;
+      if (x_290) {
+        int const x_294 = p.x;
+        int const x_296 = p.y;
+        int const x_301 = (*(tint_symbol_6)).arr[(x_294 + ((x_296 - 2) * 16))];
+        x_302 = (x_301 == 0);
+        x_303_phi = x_302;
+      }
+      bool const x_303 = x_303_phi;
+      if (x_303) {
+        int const x_306 = d;
+        d = (x_306 - 1);
+        int const x_309 = p.x;
+        int const x_311 = p.y;
+        (*(tint_symbol_6)).arr[(x_309 + (x_311 * 16))] = 1;
+        int const x_316 = p.x;
+        int const x_318 = p.y;
+        (*(tint_symbol_6)).arr[(x_316 + ((x_318 - 1) * 16))] = 1;
+        int const x_324 = p.x;
+        int const x_326 = p.y;
+        (*(tint_symbol_6)).arr[(x_324 + ((x_326 - 2) * 16))] = 1;
+        int const x_332 = p.y;
+        p.y = (x_332 - 2);
+      }
+      int const x_335 = d;
+      bool const x_336 = (x_335 >= 0);
+      x_342_phi = x_336;
+      if (x_336) {
+        int const x_340 = p.x;
+        x_341 = (x_340 < 14);
+        x_342_phi = x_341;
+      }
+      bool const x_342 = x_342_phi;
+      x_355_phi = x_342;
+      if (x_342) {
+        int const x_346 = p.x;
+        int const x_349 = p.y;
+        int const x_353 = (*(tint_symbol_6)).arr[((x_346 + 2) + (x_349 * 16))];
+        x_354 = (x_353 == 0);
+        x_355_phi = x_354;
+      }
+      bool const x_355 = x_355_phi;
+      if (x_355) {
+        int const x_358 = d;
+        d = (x_358 - 1);
+        int const x_361 = p.x;
+        int const x_363 = p.y;
+        (*(tint_symbol_6)).arr[(x_361 + (x_363 * 16))] = 1;
+        int const x_368 = p.x;
+        int const x_371 = p.y;
+        (*(tint_symbol_6)).arr[((x_368 + 1) + (x_371 * 16))] = 1;
+        int const x_376 = p.x;
+        int const x_379 = p.y;
+        (*(tint_symbol_6)).arr[((x_376 + 2) + (x_379 * 16))] = 1;
+        int const x_384 = p.x;
+        p.x = (x_384 + 2);
+      }
+      int const x_387 = d;
+      bool const x_388 = (x_387 >= 0);
+      x_394_phi = x_388;
+      if (x_388) {
+        int const x_392 = p.y;
+        x_393 = (x_392 < 14);
+        x_394_phi = x_393;
+      }
+      bool const x_394 = x_394_phi;
+      x_407_phi = x_394;
+      if (x_394) {
+        int const x_398 = p.x;
+        int const x_400 = p.y;
+        int const x_405 = (*(tint_symbol_6)).arr[(x_398 + ((x_400 + 2) * 16))];
+        x_406 = (x_405 == 0);
+        x_407_phi = x_406;
+      }
+      bool const x_407 = x_407_phi;
+      if (x_407) {
+        int const x_410 = d;
+        d = (x_410 - 1);
+        int const x_413 = p.x;
+        int const x_415 = p.y;
+        (*(tint_symbol_6)).arr[(x_413 + (x_415 * 16))] = 1;
+        int const x_420 = p.x;
+        int const x_422 = p.y;
+        (*(tint_symbol_6)).arr[(x_420 + ((x_422 + 1) * 16))] = 1;
+        int const x_428 = p.x;
+        int const x_430 = p.y;
+        (*(tint_symbol_6)).arr[(x_428 + ((x_430 + 2) * 16))] = 1;
+        int const x_436 = p.y;
+        p.y = (x_436 + 2);
+      }
+    }
+    int const x_440 = ipos.y;
+    int const x_443 = ipos.x;
+    int const x_446 = (*(tint_symbol_6)).arr[((x_440 * 16) + x_443)];
+    if ((x_446 == 1)) {
+      *(tint_symbol_8) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+      return;
+    }
+    {
+      bool const x_450 = canwalk;
+      if (x_450) {
+      } else {
+        break;
+      }
+    }
+  }
+  *(tint_symbol_8) = float4(0.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_9 = 0.0f;
+  thread tint_array_wrapper tint_symbol_10 = {};
+  thread float2x4 tint_symbol_11 = float2x4(float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f));
+  thread float4 tint_symbol_12 = 0.0f;
+  tint_symbol_9 = gl_FragCoord_param;
+  main_1(x_7, &(tint_symbol_9), &(tint_symbol_10), &(tint_symbol_11), &(tint_symbol_12));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_12};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-dead-break-and-unroll/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-dead-break-and-unroll/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..efc1a09
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-dead-break-and-unroll/1.spvasm.expected.spvasm
@@ -0,0 +1,791 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 520
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_7 "x_7"
+               OpName %map "map"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %x_60 "x_60"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %pos "pos"
+               OpName %ipos "ipos"
+               OpName %i "i"
+               OpName %p "p"
+               OpName %canwalk "canwalk"
+               OpName %v "v"
+               OpName %directions "directions"
+               OpName %j "j"
+               OpName %d "d"
+               OpName %x_110 "x_110"
+               OpName %x_130 "x_130"
+               OpName %x_150 "x_150"
+               OpName %x_171 "x_171"
+               OpName %x_111_phi "x_111_phi"
+               OpName %x_131_phi "x_131_phi"
+               OpName %x_151_phi "x_151_phi"
+               OpName %x_172_phi "x_172_phi"
+               OpName %x_237 "x_237"
+               OpName %x_250 "x_250"
+               OpName %x_289 "x_289"
+               OpName %x_302 "x_302"
+               OpName %x_341 "x_341"
+               OpName %x_354 "x_354"
+               OpName %x_393 "x_393"
+               OpName %x_406 "x_406"
+               OpName %x_238_phi "x_238_phi"
+               OpName %x_251_phi "x_251_phi"
+               OpName %x_290_phi "x_290_phi"
+               OpName %x_303_phi "x_303_phi"
+               OpName %x_342_phi "x_342_phi"
+               OpName %x_355_phi "x_355_phi"
+               OpName %x_394_phi "x_394_phi"
+               OpName %x_407_phi "x_407_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %_arr_int_uint_256 ArrayStride 4
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+   %uint_256 = OpConstant %uint 256
+%_arr_int_uint_256 = OpTypeArray %int %uint_256
+%_ptr_Private__arr_int_uint_256 = OpTypePointer Private %_arr_int_uint_256
+         %16 = OpConstantNull %_arr_int_uint_256
+        %map = OpVariable %_ptr_Private__arr_int_uint_256 Private %16
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%mat2v4float = OpTypeMatrix %v4float 2
+    %float_0 = OpConstant %float 0
+         %20 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+         %21 = OpConstantComposite %mat2v4float %20 %20
+%_ptr_Private_mat2v4float = OpTypePointer Private %mat2v4float
+       %x_60 = OpVariable %_ptr_Private_mat2v4float Private %21
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %34 = OpConstantNull %v2float
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %38 = OpConstantNull %v2int
+%_ptr_Function_int = OpTypePointer Function %int
+         %41 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %46 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %int_256 = OpConstant %int 256
+     %int_14 = OpConstant %int 14
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+   %float_16 = OpConstant %float 16
+      %int_0 = OpConstant %int 0
+%_ptr_Private_int = OpTypePointer Private %int
+      %int_1 = OpConstant %int 1
+         %92 = OpConstantComposite %v2int %int_0 %int_0
+       %true = OpConstantTrue %bool
+      %int_2 = OpConstant %int 2
+     %int_16 = OpConstant %int 16
+      %false = OpConstantFalse %bool
+      %int_8 = OpConstant %int 8
+    %float_1 = OpConstant %float 1
+        %501 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+        %506 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %507 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %28
+         %31 = OpLabel
+        %pos = OpVariable %_ptr_Function_v2float Function %34
+       %ipos = OpVariable %_ptr_Function_v2int Function %38
+          %i = OpVariable %_ptr_Function_int Function %41
+          %p = OpVariable %_ptr_Function_v2int Function %38
+    %canwalk = OpVariable %_ptr_Function_bool Function %46
+          %v = OpVariable %_ptr_Function_int Function %41
+ %directions = OpVariable %_ptr_Function_int Function %41
+          %j = OpVariable %_ptr_Function_int Function %41
+          %d = OpVariable %_ptr_Function_int Function %41
+      %x_110 = OpVariable %_ptr_Function_bool Function %46
+      %x_130 = OpVariable %_ptr_Function_bool Function %46
+      %x_150 = OpVariable %_ptr_Function_bool Function %46
+      %x_171 = OpVariable %_ptr_Function_bool Function %46
+  %x_111_phi = OpVariable %_ptr_Function_bool Function %46
+  %x_131_phi = OpVariable %_ptr_Function_bool Function %46
+  %x_151_phi = OpVariable %_ptr_Function_bool Function %46
+  %x_172_phi = OpVariable %_ptr_Function_bool Function %46
+      %x_237 = OpVariable %_ptr_Function_bool Function %46
+      %x_250 = OpVariable %_ptr_Function_bool Function %46
+      %x_289 = OpVariable %_ptr_Function_bool Function %46
+      %x_302 = OpVariable %_ptr_Function_bool Function %46
+      %x_341 = OpVariable %_ptr_Function_bool Function %46
+      %x_354 = OpVariable %_ptr_Function_bool Function %46
+      %x_393 = OpVariable %_ptr_Function_bool Function %46
+      %x_406 = OpVariable %_ptr_Function_bool Function %46
+  %x_238_phi = OpVariable %_ptr_Function_bool Function %46
+  %x_251_phi = OpVariable %_ptr_Function_bool Function %46
+  %x_290_phi = OpVariable %_ptr_Function_bool Function %46
+  %x_303_phi = OpVariable %_ptr_Function_bool Function %46
+  %x_342_phi = OpVariable %_ptr_Function_bool Function %46
+  %x_355_phi = OpVariable %_ptr_Function_bool Function %46
+  %x_394_phi = OpVariable %_ptr_Function_bool Function %46
+  %x_407_phi = OpVariable %_ptr_Function_bool Function %46
+         %51 = OpLoad %v4float %gl_FragCoord
+         %54 = OpAccessChain %_ptr_Uniform_v2float %x_7 %uint_0
+         %55 = OpLoad %v2float %54
+         %59 = OpISub %int %int_256 %int_14
+         %56 = OpSNegate %int %59
+         %60 = OpCompositeExtract %float %51 0
+         %61 = OpCompositeExtract %float %51 1
+         %62 = OpCompositeConstruct %v2float %60 %61
+         %63 = OpFDiv %v2float %62 %55
+               OpStore %pos %63
+         %65 = OpAccessChain %_ptr_Function_float %pos %uint_0
+         %66 = OpLoad %float %65
+         %68 = OpAccessChain %_ptr_Function_float %pos %uint_1
+         %69 = OpLoad %float %68
+         %72 = OpFMul %float %66 %float_16
+         %70 = OpConvertFToS %int %72
+         %74 = OpFMul %float %69 %float_16
+         %73 = OpConvertFToS %int %74
+         %75 = OpCompositeConstruct %v2int %70 %73
+               OpStore %ipos %75
+               OpStore %i %int_0
+               OpBranch %77
+         %77 = OpLabel
+               OpLoopMerge %78 %79 None
+               OpBranch %80
+         %80 = OpLabel
+         %81 = OpLoad %int %i
+         %82 = OpSLessThan %bool %81 %int_256
+               OpSelectionMerge %83 None
+               OpBranchConditional %82 %84 %85
+         %84 = OpLabel
+               OpBranch %83
+         %85 = OpLabel
+               OpBranch %78
+         %83 = OpLabel
+         %86 = OpLoad %int %i
+         %88 = OpAccessChain %_ptr_Private_int %map %86
+               OpStore %88 %int_0
+               OpBranch %79
+         %79 = OpLabel
+         %89 = OpLoad %int %i
+         %91 = OpIAdd %int %89 %int_1
+               OpStore %i %91
+               OpBranch %77
+         %78 = OpLabel
+               OpStore %p %92
+               OpStore %canwalk %true
+               OpStore %v %int_0
+               OpBranch %94
+         %94 = OpLabel
+               OpLoopMerge %95 %96 None
+               OpBranch %97
+         %97 = OpLabel
+        %106 = OpLoad %int %v
+        %107 = OpIAdd %int %106 %int_1
+               OpStore %v %107
+               OpStore %directions %int_0
+        %108 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %109 = OpLoad %int %108
+        %110 = OpSGreaterThan %bool %109 %int_0
+               OpStore %x_111_phi %110
+               OpSelectionMerge %111 None
+               OpBranchConditional %110 %112 %111
+        %112 = OpLabel
+        %113 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %114 = OpLoad %int %113
+        %115 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %116 = OpLoad %int %115
+        %118 = OpISub %int %114 %int_2
+        %120 = OpIMul %int %116 %int_16
+        %121 = OpIAdd %int %118 %120
+        %122 = OpAccessChain %_ptr_Private_int %map %121
+        %123 = OpLoad %int %122
+        %124 = OpIEqual %bool %123 %int_0
+               OpStore %x_110 %124
+        %125 = OpLoad %bool %x_110
+               OpStore %x_111_phi %125
+               OpBranch %111
+        %111 = OpLabel
+        %126 = OpLoad %bool %x_111_phi
+               OpSelectionMerge %127 None
+               OpBranchConditional %126 %128 %127
+        %128 = OpLabel
+        %129 = OpLoad %int %directions
+        %130 = OpIAdd %int %129 %int_1
+               OpStore %directions %130
+               OpBranch %127
+        %127 = OpLabel
+        %131 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %132 = OpLoad %int %131
+        %133 = OpSGreaterThan %bool %132 %int_0
+               OpStore %x_131_phi %133
+               OpSelectionMerge %134 None
+               OpBranchConditional %133 %135 %134
+        %135 = OpLabel
+        %136 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %137 = OpLoad %int %136
+        %138 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %139 = OpLoad %int %138
+        %140 = OpISub %int %139 %int_2
+        %141 = OpIMul %int %140 %int_16
+        %142 = OpIAdd %int %137 %141
+        %143 = OpAccessChain %_ptr_Private_int %map %142
+        %144 = OpLoad %int %143
+        %145 = OpIEqual %bool %144 %int_0
+               OpStore %x_130 %145
+        %146 = OpLoad %bool %x_130
+               OpStore %x_131_phi %146
+               OpBranch %134
+        %134 = OpLabel
+        %147 = OpLoad %bool %x_131_phi
+               OpSelectionMerge %148 None
+               OpBranchConditional %147 %149 %148
+        %149 = OpLabel
+        %150 = OpLoad %int %directions
+        %151 = OpIAdd %int %150 %int_1
+               OpStore %directions %151
+               OpBranch %148
+        %148 = OpLabel
+        %152 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %153 = OpLoad %int %152
+        %154 = OpSLessThan %bool %153 %int_14
+               OpStore %x_151_phi %154
+               OpSelectionMerge %155 None
+               OpBranchConditional %154 %156 %155
+        %156 = OpLabel
+        %157 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %158 = OpLoad %int %157
+        %159 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %160 = OpLoad %int %159
+        %161 = OpIAdd %int %158 %int_2
+        %162 = OpIMul %int %160 %int_16
+        %163 = OpIAdd %int %161 %162
+        %164 = OpAccessChain %_ptr_Private_int %map %163
+        %165 = OpLoad %int %164
+        %166 = OpIEqual %bool %165 %int_0
+               OpStore %x_150 %166
+        %167 = OpLoad %bool %x_150
+               OpStore %x_151_phi %167
+               OpBranch %155
+        %155 = OpLabel
+        %168 = OpLoad %bool %x_151_phi
+               OpSelectionMerge %169 None
+               OpBranchConditional %168 %170 %169
+        %170 = OpLabel
+        %171 = OpLoad %int %directions
+        %172 = OpIAdd %int %171 %int_1
+               OpStore %directions %172
+               OpBranch %169
+        %169 = OpLabel
+        %173 = OpISub %int %int_256 %56
+        %174 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %175 = OpLoad %int %174
+        %176 = OpSLessThan %bool %175 %int_14
+               OpStore %x_172_phi %176
+               OpSelectionMerge %177 None
+               OpBranchConditional %176 %178 %177
+        %178 = OpLabel
+        %179 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %180 = OpLoad %int %179
+        %181 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %182 = OpLoad %int %181
+        %183 = OpIAdd %int %182 %int_2
+        %184 = OpIMul %int %183 %int_16
+        %185 = OpIAdd %int %180 %184
+        %186 = OpAccessChain %_ptr_Private_int %map %185
+        %187 = OpLoad %int %186
+        %188 = OpIEqual %bool %187 %int_0
+               OpStore %x_171 %188
+        %189 = OpLoad %bool %x_171
+               OpStore %x_172_phi %189
+               OpBranch %177
+        %177 = OpLabel
+        %190 = OpLoad %bool %x_172_phi
+               OpSelectionMerge %191 None
+               OpBranchConditional %190 %192 %191
+        %192 = OpLabel
+        %193 = OpLoad %int %directions
+        %194 = OpIAdd %int %193 %int_1
+               OpStore %directions %194
+               OpBranch %191
+        %191 = OpLabel
+        %211 = OpLoad %int %directions
+        %212 = OpIEqual %bool %211 %int_0
+               OpSelectionMerge %213 None
+               OpBranchConditional %212 %214 %215
+        %214 = OpLabel
+               OpStore %canwalk %false
+               OpStore %i %int_0
+               OpBranch %217
+        %217 = OpLabel
+               OpLoopMerge %218 %219 None
+               OpBranch %220
+        %220 = OpLabel
+        %221 = OpLoad %int %i
+        %223 = OpSLessThan %bool %221 %int_8
+               OpSelectionMerge %224 None
+               OpBranchConditional %223 %225 %226
+        %225 = OpLabel
+               OpBranch %224
+        %226 = OpLabel
+               OpBranch %218
+        %224 = OpLabel
+               OpStore %j %int_0
+        %227 = OpISub %int %173 %221
+               OpStore %x_60 %21
+               OpSelectionMerge %228 None
+               OpBranchConditional %false %229 %228
+        %229 = OpLabel
+               OpBranch %219
+        %228 = OpLabel
+               OpBranch %230
+        %230 = OpLabel
+               OpLoopMerge %231 %232 None
+               OpBranch %233
+        %233 = OpLabel
+        %234 = OpLoad %int %j
+        %235 = OpSLessThan %bool %234 %int_8
+               OpSelectionMerge %236 None
+               OpBranchConditional %235 %237 %238
+        %237 = OpLabel
+               OpBranch %236
+        %238 = OpLabel
+               OpBranch %231
+        %236 = OpLabel
+        %239 = OpLoad %int %j
+        %240 = OpLoad %int %i
+        %241 = OpIMul %int %239 %int_2
+        %242 = OpIMul %int %240 %int_2
+        %243 = OpIMul %int %242 %int_16
+        %244 = OpIAdd %int %241 %243
+        %245 = OpAccessChain %_ptr_Private_int %map %244
+        %246 = OpLoad %int %245
+        %247 = OpIEqual %bool %246 %int_0
+               OpSelectionMerge %248 None
+               OpBranchConditional %247 %249 %248
+        %249 = OpLabel
+        %250 = OpLoad %int %j
+        %251 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %252 = OpIMul %int %250 %int_2
+               OpStore %251 %252
+        %253 = OpLoad %int %i
+        %254 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %255 = OpIMul %int %253 %int_2
+               OpStore %254 %255
+               OpStore %canwalk %true
+               OpBranch %248
+        %248 = OpLabel
+               OpBranch %232
+        %232 = OpLabel
+        %256 = OpLoad %int %j
+        %257 = OpIAdd %int %256 %int_1
+               OpStore %j %257
+               OpBranch %230
+        %231 = OpLabel
+               OpBranch %219
+        %219 = OpLabel
+        %258 = OpLoad %int %i
+        %259 = OpIAdd %int %258 %int_1
+               OpStore %i %259
+               OpBranch %217
+        %218 = OpLabel
+        %260 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %261 = OpLoad %int %260
+        %262 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %263 = OpLoad %int %262
+        %264 = OpIMul %int %263 %int_16
+        %265 = OpIAdd %int %261 %264
+        %266 = OpAccessChain %_ptr_Private_int %map %265
+               OpStore %266 %int_1
+               OpBranch %213
+        %215 = OpLabel
+        %267 = OpLoad %int %v
+        %268 = OpLoad %int %directions
+        %269 = OpSMod %int %267 %268
+               OpStore %d %269
+        %270 = OpLoad %int %directions
+        %271 = OpLoad %int %v
+        %272 = OpIAdd %int %271 %270
+               OpStore %v %272
+        %273 = OpLoad %int %d
+        %274 = OpSGreaterThanEqual %bool %273 %int_0
+               OpStore %x_238_phi %274
+               OpSelectionMerge %275 None
+               OpBranchConditional %274 %276 %275
+        %276 = OpLabel
+        %277 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %278 = OpLoad %int %277
+        %279 = OpSGreaterThan %bool %278 %int_0
+               OpStore %x_237 %279
+        %280 = OpLoad %bool %x_237
+               OpStore %x_238_phi %280
+               OpBranch %275
+        %275 = OpLabel
+        %281 = OpLoad %bool %x_238_phi
+               OpStore %x_251_phi %281
+               OpSelectionMerge %282 None
+               OpBranchConditional %281 %283 %282
+        %283 = OpLabel
+        %284 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %285 = OpLoad %int %284
+        %286 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %287 = OpLoad %int %286
+        %288 = OpISub %int %285 %int_2
+        %289 = OpIMul %int %287 %int_16
+        %290 = OpIAdd %int %288 %289
+        %291 = OpAccessChain %_ptr_Private_int %map %290
+        %292 = OpLoad %int %291
+        %293 = OpIEqual %bool %292 %int_0
+               OpStore %x_250 %293
+        %294 = OpLoad %bool %x_250
+               OpStore %x_251_phi %294
+               OpBranch %282
+        %282 = OpLabel
+        %295 = OpLoad %bool %x_251_phi
+               OpSelectionMerge %296 None
+               OpBranchConditional %295 %297 %296
+        %297 = OpLabel
+        %298 = OpLoad %int %d
+        %299 = OpISub %int %298 %int_1
+               OpStore %d %299
+        %300 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %301 = OpLoad %int %300
+        %302 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %303 = OpLoad %int %302
+        %304 = OpIMul %int %303 %int_16
+        %305 = OpIAdd %int %301 %304
+        %306 = OpAccessChain %_ptr_Private_int %map %305
+               OpStore %306 %int_1
+        %307 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %308 = OpLoad %int %307
+        %309 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %310 = OpLoad %int %309
+        %311 = OpISub %int %308 %int_1
+        %312 = OpIMul %int %310 %int_16
+        %313 = OpIAdd %int %311 %312
+        %314 = OpAccessChain %_ptr_Private_int %map %313
+               OpStore %314 %int_1
+        %315 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %316 = OpLoad %int %315
+        %317 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %318 = OpLoad %int %317
+        %319 = OpISub %int %316 %int_2
+        %320 = OpIMul %int %318 %int_16
+        %321 = OpIAdd %int %319 %320
+        %322 = OpAccessChain %_ptr_Private_int %map %321
+               OpStore %322 %int_1
+        %323 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %324 = OpLoad %int %323
+        %325 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %326 = OpISub %int %324 %int_2
+               OpStore %325 %326
+               OpBranch %296
+        %296 = OpLabel
+        %327 = OpLoad %int %d
+        %328 = OpSGreaterThanEqual %bool %327 %int_0
+               OpStore %x_290_phi %328
+               OpSelectionMerge %329 None
+               OpBranchConditional %328 %330 %329
+        %330 = OpLabel
+        %331 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %332 = OpLoad %int %331
+        %333 = OpSGreaterThan %bool %332 %int_0
+               OpStore %x_289 %333
+        %334 = OpLoad %bool %x_289
+               OpStore %x_290_phi %334
+               OpBranch %329
+        %329 = OpLabel
+        %335 = OpLoad %bool %x_290_phi
+               OpStore %x_303_phi %335
+               OpSelectionMerge %336 None
+               OpBranchConditional %335 %337 %336
+        %337 = OpLabel
+        %338 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %339 = OpLoad %int %338
+        %340 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %341 = OpLoad %int %340
+        %342 = OpISub %int %341 %int_2
+        %343 = OpIMul %int %342 %int_16
+        %344 = OpIAdd %int %339 %343
+        %345 = OpAccessChain %_ptr_Private_int %map %344
+        %346 = OpLoad %int %345
+        %347 = OpIEqual %bool %346 %int_0
+               OpStore %x_302 %347
+        %348 = OpLoad %bool %x_302
+               OpStore %x_303_phi %348
+               OpBranch %336
+        %336 = OpLabel
+        %349 = OpLoad %bool %x_303_phi
+               OpSelectionMerge %350 None
+               OpBranchConditional %349 %351 %350
+        %351 = OpLabel
+        %352 = OpLoad %int %d
+        %353 = OpISub %int %352 %int_1
+               OpStore %d %353
+        %354 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %355 = OpLoad %int %354
+        %356 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %357 = OpLoad %int %356
+        %358 = OpIMul %int %357 %int_16
+        %359 = OpIAdd %int %355 %358
+        %360 = OpAccessChain %_ptr_Private_int %map %359
+               OpStore %360 %int_1
+        %361 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %362 = OpLoad %int %361
+        %363 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %364 = OpLoad %int %363
+        %365 = OpISub %int %364 %int_1
+        %366 = OpIMul %int %365 %int_16
+        %367 = OpIAdd %int %362 %366
+        %368 = OpAccessChain %_ptr_Private_int %map %367
+               OpStore %368 %int_1
+        %369 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %370 = OpLoad %int %369
+        %371 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %372 = OpLoad %int %371
+        %373 = OpISub %int %372 %int_2
+        %374 = OpIMul %int %373 %int_16
+        %375 = OpIAdd %int %370 %374
+        %376 = OpAccessChain %_ptr_Private_int %map %375
+               OpStore %376 %int_1
+        %377 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %378 = OpLoad %int %377
+        %379 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %380 = OpISub %int %378 %int_2
+               OpStore %379 %380
+               OpBranch %350
+        %350 = OpLabel
+        %381 = OpLoad %int %d
+        %382 = OpSGreaterThanEqual %bool %381 %int_0
+               OpStore %x_342_phi %382
+               OpSelectionMerge %383 None
+               OpBranchConditional %382 %384 %383
+        %384 = OpLabel
+        %385 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %386 = OpLoad %int %385
+        %387 = OpSLessThan %bool %386 %int_14
+               OpStore %x_341 %387
+        %388 = OpLoad %bool %x_341
+               OpStore %x_342_phi %388
+               OpBranch %383
+        %383 = OpLabel
+        %389 = OpLoad %bool %x_342_phi
+               OpStore %x_355_phi %389
+               OpSelectionMerge %390 None
+               OpBranchConditional %389 %391 %390
+        %391 = OpLabel
+        %392 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %393 = OpLoad %int %392
+        %394 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %395 = OpLoad %int %394
+        %396 = OpIAdd %int %393 %int_2
+        %397 = OpIMul %int %395 %int_16
+        %398 = OpIAdd %int %396 %397
+        %399 = OpAccessChain %_ptr_Private_int %map %398
+        %400 = OpLoad %int %399
+        %401 = OpIEqual %bool %400 %int_0
+               OpStore %x_354 %401
+        %402 = OpLoad %bool %x_354
+               OpStore %x_355_phi %402
+               OpBranch %390
+        %390 = OpLabel
+        %403 = OpLoad %bool %x_355_phi
+               OpSelectionMerge %404 None
+               OpBranchConditional %403 %405 %404
+        %405 = OpLabel
+        %406 = OpLoad %int %d
+        %407 = OpISub %int %406 %int_1
+               OpStore %d %407
+        %408 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %409 = OpLoad %int %408
+        %410 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %411 = OpLoad %int %410
+        %412 = OpIMul %int %411 %int_16
+        %413 = OpIAdd %int %409 %412
+        %414 = OpAccessChain %_ptr_Private_int %map %413
+               OpStore %414 %int_1
+        %415 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %416 = OpLoad %int %415
+        %417 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %418 = OpLoad %int %417
+        %419 = OpIAdd %int %416 %int_1
+        %420 = OpIMul %int %418 %int_16
+        %421 = OpIAdd %int %419 %420
+        %422 = OpAccessChain %_ptr_Private_int %map %421
+               OpStore %422 %int_1
+        %423 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %424 = OpLoad %int %423
+        %425 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %426 = OpLoad %int %425
+        %427 = OpIAdd %int %424 %int_2
+        %428 = OpIMul %int %426 %int_16
+        %429 = OpIAdd %int %427 %428
+        %430 = OpAccessChain %_ptr_Private_int %map %429
+               OpStore %430 %int_1
+        %431 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %432 = OpLoad %int %431
+        %433 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %434 = OpIAdd %int %432 %int_2
+               OpStore %433 %434
+               OpBranch %404
+        %404 = OpLabel
+        %435 = OpLoad %int %d
+        %436 = OpSGreaterThanEqual %bool %435 %int_0
+               OpStore %x_394_phi %436
+               OpSelectionMerge %437 None
+               OpBranchConditional %436 %438 %437
+        %438 = OpLabel
+        %439 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %440 = OpLoad %int %439
+        %441 = OpSLessThan %bool %440 %int_14
+               OpStore %x_393 %441
+        %442 = OpLoad %bool %x_393
+               OpStore %x_394_phi %442
+               OpBranch %437
+        %437 = OpLabel
+        %443 = OpLoad %bool %x_394_phi
+               OpStore %x_407_phi %443
+               OpSelectionMerge %444 None
+               OpBranchConditional %443 %445 %444
+        %445 = OpLabel
+        %446 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %447 = OpLoad %int %446
+        %448 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %449 = OpLoad %int %448
+        %450 = OpIAdd %int %449 %int_2
+        %451 = OpIMul %int %450 %int_16
+        %452 = OpIAdd %int %447 %451
+        %453 = OpAccessChain %_ptr_Private_int %map %452
+        %454 = OpLoad %int %453
+        %455 = OpIEqual %bool %454 %int_0
+               OpStore %x_406 %455
+        %456 = OpLoad %bool %x_406
+               OpStore %x_407_phi %456
+               OpBranch %444
+        %444 = OpLabel
+        %457 = OpLoad %bool %x_407_phi
+               OpSelectionMerge %458 None
+               OpBranchConditional %457 %459 %458
+        %459 = OpLabel
+        %460 = OpLoad %int %d
+        %461 = OpISub %int %460 %int_1
+               OpStore %d %461
+        %462 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %463 = OpLoad %int %462
+        %464 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %465 = OpLoad %int %464
+        %466 = OpIMul %int %465 %int_16
+        %467 = OpIAdd %int %463 %466
+        %468 = OpAccessChain %_ptr_Private_int %map %467
+               OpStore %468 %int_1
+        %469 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %470 = OpLoad %int %469
+        %471 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %472 = OpLoad %int %471
+        %473 = OpIAdd %int %472 %int_1
+        %474 = OpIMul %int %473 %int_16
+        %475 = OpIAdd %int %470 %474
+        %476 = OpAccessChain %_ptr_Private_int %map %475
+               OpStore %476 %int_1
+        %477 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %478 = OpLoad %int %477
+        %479 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %480 = OpLoad %int %479
+        %481 = OpIAdd %int %480 %int_2
+        %482 = OpIMul %int %481 %int_16
+        %483 = OpIAdd %int %478 %482
+        %484 = OpAccessChain %_ptr_Private_int %map %483
+               OpStore %484 %int_1
+        %485 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %486 = OpLoad %int %485
+        %487 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %488 = OpIAdd %int %486 %int_2
+               OpStore %487 %488
+               OpBranch %458
+        %458 = OpLabel
+               OpBranch %213
+        %213 = OpLabel
+        %489 = OpAccessChain %_ptr_Function_int %ipos %uint_1
+        %490 = OpLoad %int %489
+        %491 = OpAccessChain %_ptr_Function_int %ipos %uint_0
+        %492 = OpLoad %int %491
+        %493 = OpIMul %int %490 %int_16
+        %494 = OpIAdd %int %493 %492
+        %495 = OpAccessChain %_ptr_Private_int %map %494
+        %496 = OpLoad %int %495
+        %497 = OpIEqual %bool %496 %int_1
+               OpSelectionMerge %498 None
+               OpBranchConditional %497 %499 %498
+        %499 = OpLabel
+               OpStore %x_GLF_color %501
+               OpReturn
+        %498 = OpLabel
+               OpBranch %96
+         %96 = OpLabel
+        %502 = OpLoad %bool %canwalk
+               OpSelectionMerge %503 None
+               OpBranchConditional %502 %504 %505
+        %504 = OpLabel
+               OpBranch %503
+        %505 = OpLabel
+               OpBranch %95
+        %503 = OpLabel
+               OpBranch %94
+         %95 = OpLabel
+               OpStore %x_GLF_color %506
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %507
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %511 = OpLabel
+        %512 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %512
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %28
+        %514 = OpLabel
+        %515 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %515
+        %516 = OpFunctionCall %void %main_1
+        %518 = OpLoad %v4float %x_GLF_color
+        %519 = OpCompositeConstruct %main_out %518
+        %517 = OpFunctionCall %void %tint_symbol_3 %519
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 96[%96] is not post dominated by the back-edge block 503[%503]
+  %503 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-dead-break-and-unroll/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-dead-break-and-unroll/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..14e531e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-dead-break-and-unroll/1.spvasm.expected.wgsl
@@ -0,0 +1,357 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> map : array<i32, 256>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+var<private> x_60 : mat2x4<f32> = mat2x4<f32>(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
+
+fn main_1() {
+  var pos : vec2<f32>;
+  var ipos : vec2<i32>;
+  var i : i32;
+  var p : vec2<i32>;
+  var canwalk : bool;
+  var v : i32;
+  var directions : i32;
+  var j : i32;
+  var d : i32;
+  let x_63 : vec4<f32> = gl_FragCoord;
+  let x_67 : vec2<f32> = x_7.resolution;
+  let x_68 : i32 = -((256 - 14));
+  pos = (vec2<f32>(x_63.x, x_63.y) / x_67);
+  let x_71 : f32 = pos.x;
+  let x_75 : f32 = pos.y;
+  ipos = vec2<i32>(i32((x_71 * 16.0)), i32((x_75 * 16.0)));
+  i = 0;
+  loop {
+    let x_83 : i32 = i;
+    if ((x_83 < 256)) {
+    } else {
+      break;
+    }
+    let x_86 : i32 = i;
+    map[x_86] = 0;
+
+    continuing {
+      let x_88 : i32 = i;
+      i = (x_88 + 1);
+    }
+  }
+  p = vec2<i32>(0, 0);
+  canwalk = true;
+  v = 0;
+  loop {
+    var x_110 : bool;
+    var x_130 : bool;
+    var x_150 : bool;
+    var x_171 : bool;
+    var x_111_phi : bool;
+    var x_131_phi : bool;
+    var x_151_phi : bool;
+    var x_172_phi : bool;
+    let x_94 : i32 = v;
+    v = (x_94 + 1);
+    directions = 0;
+    let x_97 : i32 = p.x;
+    let x_98 : bool = (x_97 > 0);
+    x_111_phi = x_98;
+    if (x_98) {
+      let x_102 : i32 = p.x;
+      let x_105 : i32 = p.y;
+      let x_109 : i32 = map[((x_102 - 2) + (x_105 * 16))];
+      x_110 = (x_109 == 0);
+      x_111_phi = x_110;
+    }
+    let x_111 : bool = x_111_phi;
+    if (x_111) {
+      let x_114 : i32 = directions;
+      directions = (x_114 + 1);
+    }
+    let x_117 : i32 = p.y;
+    let x_118 : bool = (x_117 > 0);
+    x_131_phi = x_118;
+    if (x_118) {
+      let x_122 : i32 = p.x;
+      let x_124 : i32 = p.y;
+      let x_129 : i32 = map[(x_122 + ((x_124 - 2) * 16))];
+      x_130 = (x_129 == 0);
+      x_131_phi = x_130;
+    }
+    let x_131 : bool = x_131_phi;
+    if (x_131) {
+      let x_134 : i32 = directions;
+      directions = (x_134 + 1);
+    }
+    let x_137 : i32 = p.x;
+    let x_138 : bool = (x_137 < 14);
+    x_151_phi = x_138;
+    if (x_138) {
+      let x_142 : i32 = p.x;
+      let x_145 : i32 = p.y;
+      let x_149 : i32 = map[((x_142 + 2) + (x_145 * 16))];
+      x_150 = (x_149 == 0);
+      x_151_phi = x_150;
+    }
+    let x_151 : bool = x_151_phi;
+    if (x_151) {
+      let x_154 : i32 = directions;
+      directions = (x_154 + 1);
+    }
+    let x_156 : i32 = (256 - x_68);
+    let x_158 : i32 = p.y;
+    let x_159 : bool = (x_158 < 14);
+    x_172_phi = x_159;
+    if (x_159) {
+      let x_163 : i32 = p.x;
+      let x_165 : i32 = p.y;
+      let x_170 : i32 = map[(x_163 + ((x_165 + 2) * 16))];
+      x_171 = (x_170 == 0);
+      x_172_phi = x_171;
+    }
+    let x_172 : bool = x_172_phi;
+    if (x_172) {
+      let x_175 : i32 = directions;
+      directions = (x_175 + 1);
+    }
+    var x_237 : bool;
+    var x_250 : bool;
+    var x_289 : bool;
+    var x_302 : bool;
+    var x_341 : bool;
+    var x_354 : bool;
+    var x_393 : bool;
+    var x_406 : bool;
+    var x_238_phi : bool;
+    var x_251_phi : bool;
+    var x_290_phi : bool;
+    var x_303_phi : bool;
+    var x_342_phi : bool;
+    var x_355_phi : bool;
+    var x_394_phi : bool;
+    var x_407_phi : bool;
+    let x_177 : i32 = directions;
+    if ((x_177 == 0)) {
+      canwalk = false;
+      i = 0;
+      loop {
+        let x_186 : i32 = i;
+        if ((x_186 < 8)) {
+        } else {
+          break;
+        }
+        j = 0;
+        let x_189 : i32 = (x_156 - x_186);
+        x_60 = mat2x4<f32>(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
+        if (false) {
+          continue;
+        }
+        loop {
+          let x_194 : i32 = j;
+          if ((x_194 < 8)) {
+          } else {
+            break;
+          }
+          let x_197 : i32 = j;
+          let x_199 : i32 = i;
+          let x_204 : i32 = map[((x_197 * 2) + ((x_199 * 2) * 16))];
+          if ((x_204 == 0)) {
+            let x_208 : i32 = j;
+            p.x = (x_208 * 2);
+            let x_211 : i32 = i;
+            p.y = (x_211 * 2);
+            canwalk = true;
+          }
+
+          continuing {
+            let x_214 : i32 = j;
+            j = (x_214 + 1);
+          }
+        }
+
+        continuing {
+          let x_216 : i32 = i;
+          i = (x_216 + 1);
+        }
+      }
+      let x_219 : i32 = p.x;
+      let x_221 : i32 = p.y;
+      map[(x_219 + (x_221 * 16))] = 1;
+    } else {
+      let x_225 : i32 = v;
+      let x_226 : i32 = directions;
+      d = (x_225 % x_226);
+      let x_228 : i32 = directions;
+      let x_229 : i32 = v;
+      v = (x_229 + x_228);
+      let x_231 : i32 = d;
+      let x_232 : bool = (x_231 >= 0);
+      x_238_phi = x_232;
+      if (x_232) {
+        let x_236 : i32 = p.x;
+        x_237 = (x_236 > 0);
+        x_238_phi = x_237;
+      }
+      let x_238 : bool = x_238_phi;
+      x_251_phi = x_238;
+      if (x_238) {
+        let x_242 : i32 = p.x;
+        let x_245 : i32 = p.y;
+        let x_249 : i32 = map[((x_242 - 2) + (x_245 * 16))];
+        x_250 = (x_249 == 0);
+        x_251_phi = x_250;
+      }
+      let x_251 : bool = x_251_phi;
+      if (x_251) {
+        let x_254 : i32 = d;
+        d = (x_254 - 1);
+        let x_257 : i32 = p.x;
+        let x_259 : i32 = p.y;
+        map[(x_257 + (x_259 * 16))] = 1;
+        let x_264 : i32 = p.x;
+        let x_267 : i32 = p.y;
+        map[((x_264 - 1) + (x_267 * 16))] = 1;
+        let x_272 : i32 = p.x;
+        let x_275 : i32 = p.y;
+        map[((x_272 - 2) + (x_275 * 16))] = 1;
+        let x_280 : i32 = p.x;
+        p.x = (x_280 - 2);
+      }
+      let x_283 : i32 = d;
+      let x_284 : bool = (x_283 >= 0);
+      x_290_phi = x_284;
+      if (x_284) {
+        let x_288 : i32 = p.y;
+        x_289 = (x_288 > 0);
+        x_290_phi = x_289;
+      }
+      let x_290 : bool = x_290_phi;
+      x_303_phi = x_290;
+      if (x_290) {
+        let x_294 : i32 = p.x;
+        let x_296 : i32 = p.y;
+        let x_301 : i32 = map[(x_294 + ((x_296 - 2) * 16))];
+        x_302 = (x_301 == 0);
+        x_303_phi = x_302;
+      }
+      let x_303 : bool = x_303_phi;
+      if (x_303) {
+        let x_306 : i32 = d;
+        d = (x_306 - 1);
+        let x_309 : i32 = p.x;
+        let x_311 : i32 = p.y;
+        map[(x_309 + (x_311 * 16))] = 1;
+        let x_316 : i32 = p.x;
+        let x_318 : i32 = p.y;
+        map[(x_316 + ((x_318 - 1) * 16))] = 1;
+        let x_324 : i32 = p.x;
+        let x_326 : i32 = p.y;
+        map[(x_324 + ((x_326 - 2) * 16))] = 1;
+        let x_332 : i32 = p.y;
+        p.y = (x_332 - 2);
+      }
+      let x_335 : i32 = d;
+      let x_336 : bool = (x_335 >= 0);
+      x_342_phi = x_336;
+      if (x_336) {
+        let x_340 : i32 = p.x;
+        x_341 = (x_340 < 14);
+        x_342_phi = x_341;
+      }
+      let x_342 : bool = x_342_phi;
+      x_355_phi = x_342;
+      if (x_342) {
+        let x_346 : i32 = p.x;
+        let x_349 : i32 = p.y;
+        let x_353 : i32 = map[((x_346 + 2) + (x_349 * 16))];
+        x_354 = (x_353 == 0);
+        x_355_phi = x_354;
+      }
+      let x_355 : bool = x_355_phi;
+      if (x_355) {
+        let x_358 : i32 = d;
+        d = (x_358 - 1);
+        let x_361 : i32 = p.x;
+        let x_363 : i32 = p.y;
+        map[(x_361 + (x_363 * 16))] = 1;
+        let x_368 : i32 = p.x;
+        let x_371 : i32 = p.y;
+        map[((x_368 + 1) + (x_371 * 16))] = 1;
+        let x_376 : i32 = p.x;
+        let x_379 : i32 = p.y;
+        map[((x_376 + 2) + (x_379 * 16))] = 1;
+        let x_384 : i32 = p.x;
+        p.x = (x_384 + 2);
+      }
+      let x_387 : i32 = d;
+      let x_388 : bool = (x_387 >= 0);
+      x_394_phi = x_388;
+      if (x_388) {
+        let x_392 : i32 = p.y;
+        x_393 = (x_392 < 14);
+        x_394_phi = x_393;
+      }
+      let x_394 : bool = x_394_phi;
+      x_407_phi = x_394;
+      if (x_394) {
+        let x_398 : i32 = p.x;
+        let x_400 : i32 = p.y;
+        let x_405 : i32 = map[(x_398 + ((x_400 + 2) * 16))];
+        x_406 = (x_405 == 0);
+        x_407_phi = x_406;
+      }
+      let x_407 : bool = x_407_phi;
+      if (x_407) {
+        let x_410 : i32 = d;
+        d = (x_410 - 1);
+        let x_413 : i32 = p.x;
+        let x_415 : i32 = p.y;
+        map[(x_413 + (x_415 * 16))] = 1;
+        let x_420 : i32 = p.x;
+        let x_422 : i32 = p.y;
+        map[(x_420 + ((x_422 + 1) * 16))] = 1;
+        let x_428 : i32 = p.x;
+        let x_430 : i32 = p.y;
+        map[(x_428 + ((x_430 + 2) * 16))] = 1;
+        let x_436 : i32 = p.y;
+        p.y = (x_436 + 2);
+      }
+    }
+    let x_440 : i32 = ipos.y;
+    let x_443 : i32 = ipos.x;
+    let x_446 : i32 = map[((x_440 * 16) + x_443)];
+    if ((x_446 == 1)) {
+      x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+      return;
+    }
+
+    continuing {
+      let x_450 : bool = canwalk;
+      if (x_450) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-dead-break-and-unroll/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-dead-break-and-unroll/1.wgsl
new file mode 100644
index 0000000..14e531e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-dead-break-and-unroll/1.wgsl
@@ -0,0 +1,357 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> map : array<i32, 256>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+var<private> x_60 : mat2x4<f32> = mat2x4<f32>(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
+
+fn main_1() {
+  var pos : vec2<f32>;
+  var ipos : vec2<i32>;
+  var i : i32;
+  var p : vec2<i32>;
+  var canwalk : bool;
+  var v : i32;
+  var directions : i32;
+  var j : i32;
+  var d : i32;
+  let x_63 : vec4<f32> = gl_FragCoord;
+  let x_67 : vec2<f32> = x_7.resolution;
+  let x_68 : i32 = -((256 - 14));
+  pos = (vec2<f32>(x_63.x, x_63.y) / x_67);
+  let x_71 : f32 = pos.x;
+  let x_75 : f32 = pos.y;
+  ipos = vec2<i32>(i32((x_71 * 16.0)), i32((x_75 * 16.0)));
+  i = 0;
+  loop {
+    let x_83 : i32 = i;
+    if ((x_83 < 256)) {
+    } else {
+      break;
+    }
+    let x_86 : i32 = i;
+    map[x_86] = 0;
+
+    continuing {
+      let x_88 : i32 = i;
+      i = (x_88 + 1);
+    }
+  }
+  p = vec2<i32>(0, 0);
+  canwalk = true;
+  v = 0;
+  loop {
+    var x_110 : bool;
+    var x_130 : bool;
+    var x_150 : bool;
+    var x_171 : bool;
+    var x_111_phi : bool;
+    var x_131_phi : bool;
+    var x_151_phi : bool;
+    var x_172_phi : bool;
+    let x_94 : i32 = v;
+    v = (x_94 + 1);
+    directions = 0;
+    let x_97 : i32 = p.x;
+    let x_98 : bool = (x_97 > 0);
+    x_111_phi = x_98;
+    if (x_98) {
+      let x_102 : i32 = p.x;
+      let x_105 : i32 = p.y;
+      let x_109 : i32 = map[((x_102 - 2) + (x_105 * 16))];
+      x_110 = (x_109 == 0);
+      x_111_phi = x_110;
+    }
+    let x_111 : bool = x_111_phi;
+    if (x_111) {
+      let x_114 : i32 = directions;
+      directions = (x_114 + 1);
+    }
+    let x_117 : i32 = p.y;
+    let x_118 : bool = (x_117 > 0);
+    x_131_phi = x_118;
+    if (x_118) {
+      let x_122 : i32 = p.x;
+      let x_124 : i32 = p.y;
+      let x_129 : i32 = map[(x_122 + ((x_124 - 2) * 16))];
+      x_130 = (x_129 == 0);
+      x_131_phi = x_130;
+    }
+    let x_131 : bool = x_131_phi;
+    if (x_131) {
+      let x_134 : i32 = directions;
+      directions = (x_134 + 1);
+    }
+    let x_137 : i32 = p.x;
+    let x_138 : bool = (x_137 < 14);
+    x_151_phi = x_138;
+    if (x_138) {
+      let x_142 : i32 = p.x;
+      let x_145 : i32 = p.y;
+      let x_149 : i32 = map[((x_142 + 2) + (x_145 * 16))];
+      x_150 = (x_149 == 0);
+      x_151_phi = x_150;
+    }
+    let x_151 : bool = x_151_phi;
+    if (x_151) {
+      let x_154 : i32 = directions;
+      directions = (x_154 + 1);
+    }
+    let x_156 : i32 = (256 - x_68);
+    let x_158 : i32 = p.y;
+    let x_159 : bool = (x_158 < 14);
+    x_172_phi = x_159;
+    if (x_159) {
+      let x_163 : i32 = p.x;
+      let x_165 : i32 = p.y;
+      let x_170 : i32 = map[(x_163 + ((x_165 + 2) * 16))];
+      x_171 = (x_170 == 0);
+      x_172_phi = x_171;
+    }
+    let x_172 : bool = x_172_phi;
+    if (x_172) {
+      let x_175 : i32 = directions;
+      directions = (x_175 + 1);
+    }
+    var x_237 : bool;
+    var x_250 : bool;
+    var x_289 : bool;
+    var x_302 : bool;
+    var x_341 : bool;
+    var x_354 : bool;
+    var x_393 : bool;
+    var x_406 : bool;
+    var x_238_phi : bool;
+    var x_251_phi : bool;
+    var x_290_phi : bool;
+    var x_303_phi : bool;
+    var x_342_phi : bool;
+    var x_355_phi : bool;
+    var x_394_phi : bool;
+    var x_407_phi : bool;
+    let x_177 : i32 = directions;
+    if ((x_177 == 0)) {
+      canwalk = false;
+      i = 0;
+      loop {
+        let x_186 : i32 = i;
+        if ((x_186 < 8)) {
+        } else {
+          break;
+        }
+        j = 0;
+        let x_189 : i32 = (x_156 - x_186);
+        x_60 = mat2x4<f32>(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
+        if (false) {
+          continue;
+        }
+        loop {
+          let x_194 : i32 = j;
+          if ((x_194 < 8)) {
+          } else {
+            break;
+          }
+          let x_197 : i32 = j;
+          let x_199 : i32 = i;
+          let x_204 : i32 = map[((x_197 * 2) + ((x_199 * 2) * 16))];
+          if ((x_204 == 0)) {
+            let x_208 : i32 = j;
+            p.x = (x_208 * 2);
+            let x_211 : i32 = i;
+            p.y = (x_211 * 2);
+            canwalk = true;
+          }
+
+          continuing {
+            let x_214 : i32 = j;
+            j = (x_214 + 1);
+          }
+        }
+
+        continuing {
+          let x_216 : i32 = i;
+          i = (x_216 + 1);
+        }
+      }
+      let x_219 : i32 = p.x;
+      let x_221 : i32 = p.y;
+      map[(x_219 + (x_221 * 16))] = 1;
+    } else {
+      let x_225 : i32 = v;
+      let x_226 : i32 = directions;
+      d = (x_225 % x_226);
+      let x_228 : i32 = directions;
+      let x_229 : i32 = v;
+      v = (x_229 + x_228);
+      let x_231 : i32 = d;
+      let x_232 : bool = (x_231 >= 0);
+      x_238_phi = x_232;
+      if (x_232) {
+        let x_236 : i32 = p.x;
+        x_237 = (x_236 > 0);
+        x_238_phi = x_237;
+      }
+      let x_238 : bool = x_238_phi;
+      x_251_phi = x_238;
+      if (x_238) {
+        let x_242 : i32 = p.x;
+        let x_245 : i32 = p.y;
+        let x_249 : i32 = map[((x_242 - 2) + (x_245 * 16))];
+        x_250 = (x_249 == 0);
+        x_251_phi = x_250;
+      }
+      let x_251 : bool = x_251_phi;
+      if (x_251) {
+        let x_254 : i32 = d;
+        d = (x_254 - 1);
+        let x_257 : i32 = p.x;
+        let x_259 : i32 = p.y;
+        map[(x_257 + (x_259 * 16))] = 1;
+        let x_264 : i32 = p.x;
+        let x_267 : i32 = p.y;
+        map[((x_264 - 1) + (x_267 * 16))] = 1;
+        let x_272 : i32 = p.x;
+        let x_275 : i32 = p.y;
+        map[((x_272 - 2) + (x_275 * 16))] = 1;
+        let x_280 : i32 = p.x;
+        p.x = (x_280 - 2);
+      }
+      let x_283 : i32 = d;
+      let x_284 : bool = (x_283 >= 0);
+      x_290_phi = x_284;
+      if (x_284) {
+        let x_288 : i32 = p.y;
+        x_289 = (x_288 > 0);
+        x_290_phi = x_289;
+      }
+      let x_290 : bool = x_290_phi;
+      x_303_phi = x_290;
+      if (x_290) {
+        let x_294 : i32 = p.x;
+        let x_296 : i32 = p.y;
+        let x_301 : i32 = map[(x_294 + ((x_296 - 2) * 16))];
+        x_302 = (x_301 == 0);
+        x_303_phi = x_302;
+      }
+      let x_303 : bool = x_303_phi;
+      if (x_303) {
+        let x_306 : i32 = d;
+        d = (x_306 - 1);
+        let x_309 : i32 = p.x;
+        let x_311 : i32 = p.y;
+        map[(x_309 + (x_311 * 16))] = 1;
+        let x_316 : i32 = p.x;
+        let x_318 : i32 = p.y;
+        map[(x_316 + ((x_318 - 1) * 16))] = 1;
+        let x_324 : i32 = p.x;
+        let x_326 : i32 = p.y;
+        map[(x_324 + ((x_326 - 2) * 16))] = 1;
+        let x_332 : i32 = p.y;
+        p.y = (x_332 - 2);
+      }
+      let x_335 : i32 = d;
+      let x_336 : bool = (x_335 >= 0);
+      x_342_phi = x_336;
+      if (x_336) {
+        let x_340 : i32 = p.x;
+        x_341 = (x_340 < 14);
+        x_342_phi = x_341;
+      }
+      let x_342 : bool = x_342_phi;
+      x_355_phi = x_342;
+      if (x_342) {
+        let x_346 : i32 = p.x;
+        let x_349 : i32 = p.y;
+        let x_353 : i32 = map[((x_346 + 2) + (x_349 * 16))];
+        x_354 = (x_353 == 0);
+        x_355_phi = x_354;
+      }
+      let x_355 : bool = x_355_phi;
+      if (x_355) {
+        let x_358 : i32 = d;
+        d = (x_358 - 1);
+        let x_361 : i32 = p.x;
+        let x_363 : i32 = p.y;
+        map[(x_361 + (x_363 * 16))] = 1;
+        let x_368 : i32 = p.x;
+        let x_371 : i32 = p.y;
+        map[((x_368 + 1) + (x_371 * 16))] = 1;
+        let x_376 : i32 = p.x;
+        let x_379 : i32 = p.y;
+        map[((x_376 + 2) + (x_379 * 16))] = 1;
+        let x_384 : i32 = p.x;
+        p.x = (x_384 + 2);
+      }
+      let x_387 : i32 = d;
+      let x_388 : bool = (x_387 >= 0);
+      x_394_phi = x_388;
+      if (x_388) {
+        let x_392 : i32 = p.y;
+        x_393 = (x_392 < 14);
+        x_394_phi = x_393;
+      }
+      let x_394 : bool = x_394_phi;
+      x_407_phi = x_394;
+      if (x_394) {
+        let x_398 : i32 = p.x;
+        let x_400 : i32 = p.y;
+        let x_405 : i32 = map[(x_398 + ((x_400 + 2) * 16))];
+        x_406 = (x_405 == 0);
+        x_407_phi = x_406;
+      }
+      let x_407 : bool = x_407_phi;
+      if (x_407) {
+        let x_410 : i32 = d;
+        d = (x_410 - 1);
+        let x_413 : i32 = p.x;
+        let x_415 : i32 = p.y;
+        map[(x_413 + (x_415 * 16))] = 1;
+        let x_420 : i32 = p.x;
+        let x_422 : i32 = p.y;
+        map[(x_420 + ((x_422 + 1) * 16))] = 1;
+        let x_428 : i32 = p.x;
+        let x_430 : i32 = p.y;
+        map[(x_428 + ((x_430 + 2) * 16))] = 1;
+        let x_436 : i32 = p.y;
+        p.y = (x_436 + 2);
+      }
+    }
+    let x_440 : i32 = ipos.y;
+    let x_443 : i32 = ipos.x;
+    let x_446 : i32 = map[((x_440 * 16) + x_443)];
+    if ((x_446 == 1)) {
+      x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+      return;
+    }
+
+    continuing {
+      let x_450 : bool = canwalk;
+      if (x_450) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-dead-break-and-unroll/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-dead-break-and-unroll/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..d8420f8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-dead-break-and-unroll/1.wgsl.expected.hlsl
@@ -0,0 +1,309 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[1];
+};
+static int map[256] = (int[256])0;
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float2x4 x_60 = float2x4(float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f));
+
+void main_1() {
+  float2 pos = float2(0.0f, 0.0f);
+  int2 ipos = int2(0, 0);
+  int i = 0;
+  int2 p = int2(0, 0);
+  bool canwalk = false;
+  int v = 0;
+  int directions = 0;
+  int j = 0;
+  int d = 0;
+  const float4 x_63 = gl_FragCoord;
+  const float2 x_67 = asfloat(x_7[0].xy);
+  const int x_68 = -((256 - 14));
+  pos = (float2(x_63.x, x_63.y) / x_67);
+  const float x_71 = pos.x;
+  const float x_75 = pos.y;
+  ipos = int2(int((x_71 * 16.0f)), int((x_75 * 16.0f)));
+  i = 0;
+  {
+    for(; (i < 256); i = (i + 1)) {
+      map[i] = 0;
+    }
+  }
+  p = int2(0, 0);
+  canwalk = true;
+  v = 0;
+  while (true) {
+    bool x_110 = false;
+    bool x_130 = false;
+    bool x_150 = false;
+    bool x_171 = false;
+    bool x_111_phi = false;
+    bool x_131_phi = false;
+    bool x_151_phi = false;
+    bool x_172_phi = false;
+    v = (v + 1);
+    directions = 0;
+    const int x_97 = p.x;
+    const bool x_98 = (x_97 > 0);
+    x_111_phi = x_98;
+    if (x_98) {
+      const int x_102 = p.x;
+      const int x_105 = p.y;
+      const int x_109 = map[((x_102 - 2) + (x_105 * 16))];
+      x_110 = (x_109 == 0);
+      x_111_phi = x_110;
+    }
+    if (x_111_phi) {
+      directions = (directions + 1);
+    }
+    const int x_117 = p.y;
+    const bool x_118 = (x_117 > 0);
+    x_131_phi = x_118;
+    if (x_118) {
+      const int x_122 = p.x;
+      const int x_124 = p.y;
+      const int x_129 = map[(x_122 + ((x_124 - 2) * 16))];
+      x_130 = (x_129 == 0);
+      x_131_phi = x_130;
+    }
+    if (x_131_phi) {
+      directions = (directions + 1);
+    }
+    const int x_137 = p.x;
+    const bool x_138 = (x_137 < 14);
+    x_151_phi = x_138;
+    if (x_138) {
+      const int x_142 = p.x;
+      const int x_145 = p.y;
+      const int x_149 = map[((x_142 + 2) + (x_145 * 16))];
+      x_150 = (x_149 == 0);
+      x_151_phi = x_150;
+    }
+    if (x_151_phi) {
+      directions = (directions + 1);
+    }
+    const int x_156 = (256 - x_68);
+    const int x_158 = p.y;
+    const bool x_159 = (x_158 < 14);
+    x_172_phi = x_159;
+    if (x_159) {
+      const int x_163 = p.x;
+      const int x_165 = p.y;
+      const int x_170 = map[(x_163 + ((x_165 + 2) * 16))];
+      x_171 = (x_170 == 0);
+      x_172_phi = x_171;
+    }
+    if (x_172_phi) {
+      directions = (directions + 1);
+    }
+    bool x_237 = false;
+    bool x_250 = false;
+    bool x_289 = false;
+    bool x_302 = false;
+    bool x_341 = false;
+    bool x_354 = false;
+    bool x_393 = false;
+    bool x_406 = false;
+    bool x_238_phi = false;
+    bool x_251_phi = false;
+    bool x_290_phi = false;
+    bool x_303_phi = false;
+    bool x_342_phi = false;
+    bool x_355_phi = false;
+    bool x_394_phi = false;
+    bool x_407_phi = false;
+    if ((directions == 0)) {
+      canwalk = false;
+      i = 0;
+      while (true) {
+        const int x_186 = i;
+        if ((x_186 < 8)) {
+        } else {
+          break;
+        }
+        j = 0;
+        const int x_189 = (x_156 - x_186);
+        x_60 = float2x4(float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f));
+        if (false) {
+          {
+            i = (i + 1);
+          }
+          continue;
+        }
+        {
+          for(; (j < 8); j = (j + 1)) {
+            const int x_204 = map[((j * 2) + ((i * 2) * 16))];
+            if ((x_204 == 0)) {
+              p.x = (j * 2);
+              p.y = (i * 2);
+              canwalk = true;
+            }
+          }
+        }
+        {
+          i = (i + 1);
+        }
+      }
+      const int x_219 = p.x;
+      const int x_221 = p.y;
+      map[(x_219 + (x_221 * 16))] = 1;
+    } else {
+      d = (v % directions);
+      v = (v + directions);
+      const bool x_232 = (d >= 0);
+      x_238_phi = x_232;
+      if (x_232) {
+        const int x_236 = p.x;
+        x_237 = (x_236 > 0);
+        x_238_phi = x_237;
+      }
+      const bool x_238 = x_238_phi;
+      x_251_phi = x_238;
+      if (x_238) {
+        const int x_242 = p.x;
+        const int x_245 = p.y;
+        const int x_249 = map[((x_242 - 2) + (x_245 * 16))];
+        x_250 = (x_249 == 0);
+        x_251_phi = x_250;
+      }
+      if (x_251_phi) {
+        d = (d - 1);
+        const int x_257 = p.x;
+        const int x_259 = p.y;
+        map[(x_257 + (x_259 * 16))] = 1;
+        const int x_264 = p.x;
+        const int x_267 = p.y;
+        map[((x_264 - 1) + (x_267 * 16))] = 1;
+        const int x_272 = p.x;
+        const int x_275 = p.y;
+        map[((x_272 - 2) + (x_275 * 16))] = 1;
+        const int x_280 = p.x;
+        p.x = (x_280 - 2);
+      }
+      const bool x_284 = (d >= 0);
+      x_290_phi = x_284;
+      if (x_284) {
+        const int x_288 = p.y;
+        x_289 = (x_288 > 0);
+        x_290_phi = x_289;
+      }
+      const bool x_290 = x_290_phi;
+      x_303_phi = x_290;
+      if (x_290) {
+        const int x_294 = p.x;
+        const int x_296 = p.y;
+        const int x_301 = map[(x_294 + ((x_296 - 2) * 16))];
+        x_302 = (x_301 == 0);
+        x_303_phi = x_302;
+      }
+      if (x_303_phi) {
+        d = (d - 1);
+        const int x_309 = p.x;
+        const int x_311 = p.y;
+        map[(x_309 + (x_311 * 16))] = 1;
+        const int x_316 = p.x;
+        const int x_318 = p.y;
+        map[(x_316 + ((x_318 - 1) * 16))] = 1;
+        const int x_324 = p.x;
+        const int x_326 = p.y;
+        map[(x_324 + ((x_326 - 2) * 16))] = 1;
+        const int x_332 = p.y;
+        p.y = (x_332 - 2);
+      }
+      const bool x_336 = (d >= 0);
+      x_342_phi = x_336;
+      if (x_336) {
+        const int x_340 = p.x;
+        x_341 = (x_340 < 14);
+        x_342_phi = x_341;
+      }
+      const bool x_342 = x_342_phi;
+      x_355_phi = x_342;
+      if (x_342) {
+        const int x_346 = p.x;
+        const int x_349 = p.y;
+        const int x_353 = map[((x_346 + 2) + (x_349 * 16))];
+        x_354 = (x_353 == 0);
+        x_355_phi = x_354;
+      }
+      if (x_355_phi) {
+        d = (d - 1);
+        const int x_361 = p.x;
+        const int x_363 = p.y;
+        map[(x_361 + (x_363 * 16))] = 1;
+        const int x_368 = p.x;
+        const int x_371 = p.y;
+        map[((x_368 + 1) + (x_371 * 16))] = 1;
+        const int x_376 = p.x;
+        const int x_379 = p.y;
+        map[((x_376 + 2) + (x_379 * 16))] = 1;
+        const int x_384 = p.x;
+        p.x = (x_384 + 2);
+      }
+      const bool x_388 = (d >= 0);
+      x_394_phi = x_388;
+      if (x_388) {
+        const int x_392 = p.y;
+        x_393 = (x_392 < 14);
+        x_394_phi = x_393;
+      }
+      const bool x_394 = x_394_phi;
+      x_407_phi = x_394;
+      if (x_394) {
+        const int x_398 = p.x;
+        const int x_400 = p.y;
+        const int x_405 = map[(x_398 + ((x_400 + 2) * 16))];
+        x_406 = (x_405 == 0);
+        x_407_phi = x_406;
+      }
+      if (x_407_phi) {
+        d = (d - 1);
+        const int x_413 = p.x;
+        const int x_415 = p.y;
+        map[(x_413 + (x_415 * 16))] = 1;
+        const int x_420 = p.x;
+        const int x_422 = p.y;
+        map[(x_420 + ((x_422 + 1) * 16))] = 1;
+        const int x_428 = p.x;
+        const int x_430 = p.y;
+        map[(x_428 + ((x_430 + 2) * 16))] = 1;
+        const int x_436 = p.y;
+        p.y = (x_436 + 2);
+      }
+    }
+    const int x_440 = ipos.y;
+    const int x_443 = ipos.x;
+    const int x_446 = map[((x_440 * 16) + x_443)];
+    if ((x_446 == 1)) {
+      x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+      return;
+    }
+    {
+      if (canwalk) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_GLF_color = float4(0.0f, 0.0f, 0.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-dead-break-and-unroll/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-dead-break-and-unroll/1.wgsl.expected.msl
new file mode 100644
index 0000000..192b6aa
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-dead-break-and-unroll/1.wgsl.expected.msl
@@ -0,0 +1,359 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  int arr[256];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_5, thread tint_array_wrapper* const tint_symbol_6, thread float2x4* const tint_symbol_7, thread float4* const tint_symbol_8) {
+  float2 pos = 0.0f;
+  int2 ipos = 0;
+  int i = 0;
+  int2 p = 0;
+  bool canwalk = false;
+  int v = 0;
+  int directions = 0;
+  int j = 0;
+  int d = 0;
+  float4 const x_63 = *(tint_symbol_5);
+  float2 const x_67 = x_7.resolution;
+  int const x_68 = -((256 - 14));
+  pos = (float2(x_63.x, x_63.y) / x_67);
+  float const x_71 = pos.x;
+  float const x_75 = pos.y;
+  ipos = int2(int((x_71 * 16.0f)), int((x_75 * 16.0f)));
+  i = 0;
+  while (true) {
+    int const x_83 = i;
+    if ((x_83 < 256)) {
+    } else {
+      break;
+    }
+    int const x_86 = i;
+    (*(tint_symbol_6)).arr[x_86] = 0;
+    {
+      int const x_88 = i;
+      i = (x_88 + 1);
+    }
+  }
+  p = int2(0, 0);
+  canwalk = true;
+  v = 0;
+  while (true) {
+    bool x_110 = false;
+    bool x_130 = false;
+    bool x_150 = false;
+    bool x_171 = false;
+    bool x_111_phi = false;
+    bool x_131_phi = false;
+    bool x_151_phi = false;
+    bool x_172_phi = false;
+    int const x_94 = v;
+    v = (x_94 + 1);
+    directions = 0;
+    int const x_97 = p.x;
+    bool const x_98 = (x_97 > 0);
+    x_111_phi = x_98;
+    if (x_98) {
+      int const x_102 = p.x;
+      int const x_105 = p.y;
+      int const x_109 = (*(tint_symbol_6)).arr[((x_102 - 2) + (x_105 * 16))];
+      x_110 = (x_109 == 0);
+      x_111_phi = x_110;
+    }
+    bool const x_111 = x_111_phi;
+    if (x_111) {
+      int const x_114 = directions;
+      directions = (x_114 + 1);
+    }
+    int const x_117 = p.y;
+    bool const x_118 = (x_117 > 0);
+    x_131_phi = x_118;
+    if (x_118) {
+      int const x_122 = p.x;
+      int const x_124 = p.y;
+      int const x_129 = (*(tint_symbol_6)).arr[(x_122 + ((x_124 - 2) * 16))];
+      x_130 = (x_129 == 0);
+      x_131_phi = x_130;
+    }
+    bool const x_131 = x_131_phi;
+    if (x_131) {
+      int const x_134 = directions;
+      directions = (x_134 + 1);
+    }
+    int const x_137 = p.x;
+    bool const x_138 = (x_137 < 14);
+    x_151_phi = x_138;
+    if (x_138) {
+      int const x_142 = p.x;
+      int const x_145 = p.y;
+      int const x_149 = (*(tint_symbol_6)).arr[((x_142 + 2) + (x_145 * 16))];
+      x_150 = (x_149 == 0);
+      x_151_phi = x_150;
+    }
+    bool const x_151 = x_151_phi;
+    if (x_151) {
+      int const x_154 = directions;
+      directions = (x_154 + 1);
+    }
+    int const x_156 = (256 - x_68);
+    int const x_158 = p.y;
+    bool const x_159 = (x_158 < 14);
+    x_172_phi = x_159;
+    if (x_159) {
+      int const x_163 = p.x;
+      int const x_165 = p.y;
+      int const x_170 = (*(tint_symbol_6)).arr[(x_163 + ((x_165 + 2) * 16))];
+      x_171 = (x_170 == 0);
+      x_172_phi = x_171;
+    }
+    bool const x_172 = x_172_phi;
+    if (x_172) {
+      int const x_175 = directions;
+      directions = (x_175 + 1);
+    }
+    bool x_237 = false;
+    bool x_250 = false;
+    bool x_289 = false;
+    bool x_302 = false;
+    bool x_341 = false;
+    bool x_354 = false;
+    bool x_393 = false;
+    bool x_406 = false;
+    bool x_238_phi = false;
+    bool x_251_phi = false;
+    bool x_290_phi = false;
+    bool x_303_phi = false;
+    bool x_342_phi = false;
+    bool x_355_phi = false;
+    bool x_394_phi = false;
+    bool x_407_phi = false;
+    int const x_177 = directions;
+    if ((x_177 == 0)) {
+      canwalk = false;
+      i = 0;
+      while (true) {
+        int const x_186 = i;
+        if ((x_186 < 8)) {
+        } else {
+          break;
+        }
+        j = 0;
+        int const x_189 = (x_156 - x_186);
+        *(tint_symbol_7) = float2x4(float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f));
+        if (false) {
+          {
+            int const x_216 = i;
+            i = (x_216 + 1);
+          }
+          continue;
+        }
+        while (true) {
+          int const x_194 = j;
+          if ((x_194 < 8)) {
+          } else {
+            break;
+          }
+          int const x_197 = j;
+          int const x_199 = i;
+          int const x_204 = (*(tint_symbol_6)).arr[((x_197 * 2) + ((x_199 * 2) * 16))];
+          if ((x_204 == 0)) {
+            int const x_208 = j;
+            p.x = (x_208 * 2);
+            int const x_211 = i;
+            p.y = (x_211 * 2);
+            canwalk = true;
+          }
+          {
+            int const x_214 = j;
+            j = (x_214 + 1);
+          }
+        }
+        {
+          int const x_216 = i;
+          i = (x_216 + 1);
+        }
+      }
+      int const x_219 = p.x;
+      int const x_221 = p.y;
+      (*(tint_symbol_6)).arr[(x_219 + (x_221 * 16))] = 1;
+    } else {
+      int const x_225 = v;
+      int const x_226 = directions;
+      d = (x_225 % x_226);
+      int const x_228 = directions;
+      int const x_229 = v;
+      v = (x_229 + x_228);
+      int const x_231 = d;
+      bool const x_232 = (x_231 >= 0);
+      x_238_phi = x_232;
+      if (x_232) {
+        int const x_236 = p.x;
+        x_237 = (x_236 > 0);
+        x_238_phi = x_237;
+      }
+      bool const x_238 = x_238_phi;
+      x_251_phi = x_238;
+      if (x_238) {
+        int const x_242 = p.x;
+        int const x_245 = p.y;
+        int const x_249 = (*(tint_symbol_6)).arr[((x_242 - 2) + (x_245 * 16))];
+        x_250 = (x_249 == 0);
+        x_251_phi = x_250;
+      }
+      bool const x_251 = x_251_phi;
+      if (x_251) {
+        int const x_254 = d;
+        d = (x_254 - 1);
+        int const x_257 = p.x;
+        int const x_259 = p.y;
+        (*(tint_symbol_6)).arr[(x_257 + (x_259 * 16))] = 1;
+        int const x_264 = p.x;
+        int const x_267 = p.y;
+        (*(tint_symbol_6)).arr[((x_264 - 1) + (x_267 * 16))] = 1;
+        int const x_272 = p.x;
+        int const x_275 = p.y;
+        (*(tint_symbol_6)).arr[((x_272 - 2) + (x_275 * 16))] = 1;
+        int const x_280 = p.x;
+        p.x = (x_280 - 2);
+      }
+      int const x_283 = d;
+      bool const x_284 = (x_283 >= 0);
+      x_290_phi = x_284;
+      if (x_284) {
+        int const x_288 = p.y;
+        x_289 = (x_288 > 0);
+        x_290_phi = x_289;
+      }
+      bool const x_290 = x_290_phi;
+      x_303_phi = x_290;
+      if (x_290) {
+        int const x_294 = p.x;
+        int const x_296 = p.y;
+        int const x_301 = (*(tint_symbol_6)).arr[(x_294 + ((x_296 - 2) * 16))];
+        x_302 = (x_301 == 0);
+        x_303_phi = x_302;
+      }
+      bool const x_303 = x_303_phi;
+      if (x_303) {
+        int const x_306 = d;
+        d = (x_306 - 1);
+        int const x_309 = p.x;
+        int const x_311 = p.y;
+        (*(tint_symbol_6)).arr[(x_309 + (x_311 * 16))] = 1;
+        int const x_316 = p.x;
+        int const x_318 = p.y;
+        (*(tint_symbol_6)).arr[(x_316 + ((x_318 - 1) * 16))] = 1;
+        int const x_324 = p.x;
+        int const x_326 = p.y;
+        (*(tint_symbol_6)).arr[(x_324 + ((x_326 - 2) * 16))] = 1;
+        int const x_332 = p.y;
+        p.y = (x_332 - 2);
+      }
+      int const x_335 = d;
+      bool const x_336 = (x_335 >= 0);
+      x_342_phi = x_336;
+      if (x_336) {
+        int const x_340 = p.x;
+        x_341 = (x_340 < 14);
+        x_342_phi = x_341;
+      }
+      bool const x_342 = x_342_phi;
+      x_355_phi = x_342;
+      if (x_342) {
+        int const x_346 = p.x;
+        int const x_349 = p.y;
+        int const x_353 = (*(tint_symbol_6)).arr[((x_346 + 2) + (x_349 * 16))];
+        x_354 = (x_353 == 0);
+        x_355_phi = x_354;
+      }
+      bool const x_355 = x_355_phi;
+      if (x_355) {
+        int const x_358 = d;
+        d = (x_358 - 1);
+        int const x_361 = p.x;
+        int const x_363 = p.y;
+        (*(tint_symbol_6)).arr[(x_361 + (x_363 * 16))] = 1;
+        int const x_368 = p.x;
+        int const x_371 = p.y;
+        (*(tint_symbol_6)).arr[((x_368 + 1) + (x_371 * 16))] = 1;
+        int const x_376 = p.x;
+        int const x_379 = p.y;
+        (*(tint_symbol_6)).arr[((x_376 + 2) + (x_379 * 16))] = 1;
+        int const x_384 = p.x;
+        p.x = (x_384 + 2);
+      }
+      int const x_387 = d;
+      bool const x_388 = (x_387 >= 0);
+      x_394_phi = x_388;
+      if (x_388) {
+        int const x_392 = p.y;
+        x_393 = (x_392 < 14);
+        x_394_phi = x_393;
+      }
+      bool const x_394 = x_394_phi;
+      x_407_phi = x_394;
+      if (x_394) {
+        int const x_398 = p.x;
+        int const x_400 = p.y;
+        int const x_405 = (*(tint_symbol_6)).arr[(x_398 + ((x_400 + 2) * 16))];
+        x_406 = (x_405 == 0);
+        x_407_phi = x_406;
+      }
+      bool const x_407 = x_407_phi;
+      if (x_407) {
+        int const x_410 = d;
+        d = (x_410 - 1);
+        int const x_413 = p.x;
+        int const x_415 = p.y;
+        (*(tint_symbol_6)).arr[(x_413 + (x_415 * 16))] = 1;
+        int const x_420 = p.x;
+        int const x_422 = p.y;
+        (*(tint_symbol_6)).arr[(x_420 + ((x_422 + 1) * 16))] = 1;
+        int const x_428 = p.x;
+        int const x_430 = p.y;
+        (*(tint_symbol_6)).arr[(x_428 + ((x_430 + 2) * 16))] = 1;
+        int const x_436 = p.y;
+        p.y = (x_436 + 2);
+      }
+    }
+    int const x_440 = ipos.y;
+    int const x_443 = ipos.x;
+    int const x_446 = (*(tint_symbol_6)).arr[((x_440 * 16) + x_443)];
+    if ((x_446 == 1)) {
+      *(tint_symbol_8) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+      return;
+    }
+    {
+      bool const x_450 = canwalk;
+      if (x_450) {
+      } else {
+        break;
+      }
+    }
+  }
+  *(tint_symbol_8) = float4(0.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_9 = 0.0f;
+  thread tint_array_wrapper tint_symbol_10 = {};
+  thread float2x4 tint_symbol_11 = float2x4(float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f));
+  thread float4 tint_symbol_12 = 0.0f;
+  tint_symbol_9 = gl_FragCoord_param;
+  main_1(x_7, &(tint_symbol_9), &(tint_symbol_10), &(tint_symbol_11), &(tint_symbol_12));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_12};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-dead-break-and-unroll/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-dead-break-and-unroll/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..efc1a09
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-dead-break-and-unroll/1.wgsl.expected.spvasm
@@ -0,0 +1,791 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 520
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_7 "x_7"
+               OpName %map "map"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %x_60 "x_60"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %pos "pos"
+               OpName %ipos "ipos"
+               OpName %i "i"
+               OpName %p "p"
+               OpName %canwalk "canwalk"
+               OpName %v "v"
+               OpName %directions "directions"
+               OpName %j "j"
+               OpName %d "d"
+               OpName %x_110 "x_110"
+               OpName %x_130 "x_130"
+               OpName %x_150 "x_150"
+               OpName %x_171 "x_171"
+               OpName %x_111_phi "x_111_phi"
+               OpName %x_131_phi "x_131_phi"
+               OpName %x_151_phi "x_151_phi"
+               OpName %x_172_phi "x_172_phi"
+               OpName %x_237 "x_237"
+               OpName %x_250 "x_250"
+               OpName %x_289 "x_289"
+               OpName %x_302 "x_302"
+               OpName %x_341 "x_341"
+               OpName %x_354 "x_354"
+               OpName %x_393 "x_393"
+               OpName %x_406 "x_406"
+               OpName %x_238_phi "x_238_phi"
+               OpName %x_251_phi "x_251_phi"
+               OpName %x_290_phi "x_290_phi"
+               OpName %x_303_phi "x_303_phi"
+               OpName %x_342_phi "x_342_phi"
+               OpName %x_355_phi "x_355_phi"
+               OpName %x_394_phi "x_394_phi"
+               OpName %x_407_phi "x_407_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %_arr_int_uint_256 ArrayStride 4
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+   %uint_256 = OpConstant %uint 256
+%_arr_int_uint_256 = OpTypeArray %int %uint_256
+%_ptr_Private__arr_int_uint_256 = OpTypePointer Private %_arr_int_uint_256
+         %16 = OpConstantNull %_arr_int_uint_256
+        %map = OpVariable %_ptr_Private__arr_int_uint_256 Private %16
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%mat2v4float = OpTypeMatrix %v4float 2
+    %float_0 = OpConstant %float 0
+         %20 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+         %21 = OpConstantComposite %mat2v4float %20 %20
+%_ptr_Private_mat2v4float = OpTypePointer Private %mat2v4float
+       %x_60 = OpVariable %_ptr_Private_mat2v4float Private %21
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %34 = OpConstantNull %v2float
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %38 = OpConstantNull %v2int
+%_ptr_Function_int = OpTypePointer Function %int
+         %41 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %46 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %int_256 = OpConstant %int 256
+     %int_14 = OpConstant %int 14
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+   %float_16 = OpConstant %float 16
+      %int_0 = OpConstant %int 0
+%_ptr_Private_int = OpTypePointer Private %int
+      %int_1 = OpConstant %int 1
+         %92 = OpConstantComposite %v2int %int_0 %int_0
+       %true = OpConstantTrue %bool
+      %int_2 = OpConstant %int 2
+     %int_16 = OpConstant %int 16
+      %false = OpConstantFalse %bool
+      %int_8 = OpConstant %int 8
+    %float_1 = OpConstant %float 1
+        %501 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+        %506 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %507 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %28
+         %31 = OpLabel
+        %pos = OpVariable %_ptr_Function_v2float Function %34
+       %ipos = OpVariable %_ptr_Function_v2int Function %38
+          %i = OpVariable %_ptr_Function_int Function %41
+          %p = OpVariable %_ptr_Function_v2int Function %38
+    %canwalk = OpVariable %_ptr_Function_bool Function %46
+          %v = OpVariable %_ptr_Function_int Function %41
+ %directions = OpVariable %_ptr_Function_int Function %41
+          %j = OpVariable %_ptr_Function_int Function %41
+          %d = OpVariable %_ptr_Function_int Function %41
+      %x_110 = OpVariable %_ptr_Function_bool Function %46
+      %x_130 = OpVariable %_ptr_Function_bool Function %46
+      %x_150 = OpVariable %_ptr_Function_bool Function %46
+      %x_171 = OpVariable %_ptr_Function_bool Function %46
+  %x_111_phi = OpVariable %_ptr_Function_bool Function %46
+  %x_131_phi = OpVariable %_ptr_Function_bool Function %46
+  %x_151_phi = OpVariable %_ptr_Function_bool Function %46
+  %x_172_phi = OpVariable %_ptr_Function_bool Function %46
+      %x_237 = OpVariable %_ptr_Function_bool Function %46
+      %x_250 = OpVariable %_ptr_Function_bool Function %46
+      %x_289 = OpVariable %_ptr_Function_bool Function %46
+      %x_302 = OpVariable %_ptr_Function_bool Function %46
+      %x_341 = OpVariable %_ptr_Function_bool Function %46
+      %x_354 = OpVariable %_ptr_Function_bool Function %46
+      %x_393 = OpVariable %_ptr_Function_bool Function %46
+      %x_406 = OpVariable %_ptr_Function_bool Function %46
+  %x_238_phi = OpVariable %_ptr_Function_bool Function %46
+  %x_251_phi = OpVariable %_ptr_Function_bool Function %46
+  %x_290_phi = OpVariable %_ptr_Function_bool Function %46
+  %x_303_phi = OpVariable %_ptr_Function_bool Function %46
+  %x_342_phi = OpVariable %_ptr_Function_bool Function %46
+  %x_355_phi = OpVariable %_ptr_Function_bool Function %46
+  %x_394_phi = OpVariable %_ptr_Function_bool Function %46
+  %x_407_phi = OpVariable %_ptr_Function_bool Function %46
+         %51 = OpLoad %v4float %gl_FragCoord
+         %54 = OpAccessChain %_ptr_Uniform_v2float %x_7 %uint_0
+         %55 = OpLoad %v2float %54
+         %59 = OpISub %int %int_256 %int_14
+         %56 = OpSNegate %int %59
+         %60 = OpCompositeExtract %float %51 0
+         %61 = OpCompositeExtract %float %51 1
+         %62 = OpCompositeConstruct %v2float %60 %61
+         %63 = OpFDiv %v2float %62 %55
+               OpStore %pos %63
+         %65 = OpAccessChain %_ptr_Function_float %pos %uint_0
+         %66 = OpLoad %float %65
+         %68 = OpAccessChain %_ptr_Function_float %pos %uint_1
+         %69 = OpLoad %float %68
+         %72 = OpFMul %float %66 %float_16
+         %70 = OpConvertFToS %int %72
+         %74 = OpFMul %float %69 %float_16
+         %73 = OpConvertFToS %int %74
+         %75 = OpCompositeConstruct %v2int %70 %73
+               OpStore %ipos %75
+               OpStore %i %int_0
+               OpBranch %77
+         %77 = OpLabel
+               OpLoopMerge %78 %79 None
+               OpBranch %80
+         %80 = OpLabel
+         %81 = OpLoad %int %i
+         %82 = OpSLessThan %bool %81 %int_256
+               OpSelectionMerge %83 None
+               OpBranchConditional %82 %84 %85
+         %84 = OpLabel
+               OpBranch %83
+         %85 = OpLabel
+               OpBranch %78
+         %83 = OpLabel
+         %86 = OpLoad %int %i
+         %88 = OpAccessChain %_ptr_Private_int %map %86
+               OpStore %88 %int_0
+               OpBranch %79
+         %79 = OpLabel
+         %89 = OpLoad %int %i
+         %91 = OpIAdd %int %89 %int_1
+               OpStore %i %91
+               OpBranch %77
+         %78 = OpLabel
+               OpStore %p %92
+               OpStore %canwalk %true
+               OpStore %v %int_0
+               OpBranch %94
+         %94 = OpLabel
+               OpLoopMerge %95 %96 None
+               OpBranch %97
+         %97 = OpLabel
+        %106 = OpLoad %int %v
+        %107 = OpIAdd %int %106 %int_1
+               OpStore %v %107
+               OpStore %directions %int_0
+        %108 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %109 = OpLoad %int %108
+        %110 = OpSGreaterThan %bool %109 %int_0
+               OpStore %x_111_phi %110
+               OpSelectionMerge %111 None
+               OpBranchConditional %110 %112 %111
+        %112 = OpLabel
+        %113 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %114 = OpLoad %int %113
+        %115 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %116 = OpLoad %int %115
+        %118 = OpISub %int %114 %int_2
+        %120 = OpIMul %int %116 %int_16
+        %121 = OpIAdd %int %118 %120
+        %122 = OpAccessChain %_ptr_Private_int %map %121
+        %123 = OpLoad %int %122
+        %124 = OpIEqual %bool %123 %int_0
+               OpStore %x_110 %124
+        %125 = OpLoad %bool %x_110
+               OpStore %x_111_phi %125
+               OpBranch %111
+        %111 = OpLabel
+        %126 = OpLoad %bool %x_111_phi
+               OpSelectionMerge %127 None
+               OpBranchConditional %126 %128 %127
+        %128 = OpLabel
+        %129 = OpLoad %int %directions
+        %130 = OpIAdd %int %129 %int_1
+               OpStore %directions %130
+               OpBranch %127
+        %127 = OpLabel
+        %131 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %132 = OpLoad %int %131
+        %133 = OpSGreaterThan %bool %132 %int_0
+               OpStore %x_131_phi %133
+               OpSelectionMerge %134 None
+               OpBranchConditional %133 %135 %134
+        %135 = OpLabel
+        %136 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %137 = OpLoad %int %136
+        %138 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %139 = OpLoad %int %138
+        %140 = OpISub %int %139 %int_2
+        %141 = OpIMul %int %140 %int_16
+        %142 = OpIAdd %int %137 %141
+        %143 = OpAccessChain %_ptr_Private_int %map %142
+        %144 = OpLoad %int %143
+        %145 = OpIEqual %bool %144 %int_0
+               OpStore %x_130 %145
+        %146 = OpLoad %bool %x_130
+               OpStore %x_131_phi %146
+               OpBranch %134
+        %134 = OpLabel
+        %147 = OpLoad %bool %x_131_phi
+               OpSelectionMerge %148 None
+               OpBranchConditional %147 %149 %148
+        %149 = OpLabel
+        %150 = OpLoad %int %directions
+        %151 = OpIAdd %int %150 %int_1
+               OpStore %directions %151
+               OpBranch %148
+        %148 = OpLabel
+        %152 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %153 = OpLoad %int %152
+        %154 = OpSLessThan %bool %153 %int_14
+               OpStore %x_151_phi %154
+               OpSelectionMerge %155 None
+               OpBranchConditional %154 %156 %155
+        %156 = OpLabel
+        %157 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %158 = OpLoad %int %157
+        %159 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %160 = OpLoad %int %159
+        %161 = OpIAdd %int %158 %int_2
+        %162 = OpIMul %int %160 %int_16
+        %163 = OpIAdd %int %161 %162
+        %164 = OpAccessChain %_ptr_Private_int %map %163
+        %165 = OpLoad %int %164
+        %166 = OpIEqual %bool %165 %int_0
+               OpStore %x_150 %166
+        %167 = OpLoad %bool %x_150
+               OpStore %x_151_phi %167
+               OpBranch %155
+        %155 = OpLabel
+        %168 = OpLoad %bool %x_151_phi
+               OpSelectionMerge %169 None
+               OpBranchConditional %168 %170 %169
+        %170 = OpLabel
+        %171 = OpLoad %int %directions
+        %172 = OpIAdd %int %171 %int_1
+               OpStore %directions %172
+               OpBranch %169
+        %169 = OpLabel
+        %173 = OpISub %int %int_256 %56
+        %174 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %175 = OpLoad %int %174
+        %176 = OpSLessThan %bool %175 %int_14
+               OpStore %x_172_phi %176
+               OpSelectionMerge %177 None
+               OpBranchConditional %176 %178 %177
+        %178 = OpLabel
+        %179 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %180 = OpLoad %int %179
+        %181 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %182 = OpLoad %int %181
+        %183 = OpIAdd %int %182 %int_2
+        %184 = OpIMul %int %183 %int_16
+        %185 = OpIAdd %int %180 %184
+        %186 = OpAccessChain %_ptr_Private_int %map %185
+        %187 = OpLoad %int %186
+        %188 = OpIEqual %bool %187 %int_0
+               OpStore %x_171 %188
+        %189 = OpLoad %bool %x_171
+               OpStore %x_172_phi %189
+               OpBranch %177
+        %177 = OpLabel
+        %190 = OpLoad %bool %x_172_phi
+               OpSelectionMerge %191 None
+               OpBranchConditional %190 %192 %191
+        %192 = OpLabel
+        %193 = OpLoad %int %directions
+        %194 = OpIAdd %int %193 %int_1
+               OpStore %directions %194
+               OpBranch %191
+        %191 = OpLabel
+        %211 = OpLoad %int %directions
+        %212 = OpIEqual %bool %211 %int_0
+               OpSelectionMerge %213 None
+               OpBranchConditional %212 %214 %215
+        %214 = OpLabel
+               OpStore %canwalk %false
+               OpStore %i %int_0
+               OpBranch %217
+        %217 = OpLabel
+               OpLoopMerge %218 %219 None
+               OpBranch %220
+        %220 = OpLabel
+        %221 = OpLoad %int %i
+        %223 = OpSLessThan %bool %221 %int_8
+               OpSelectionMerge %224 None
+               OpBranchConditional %223 %225 %226
+        %225 = OpLabel
+               OpBranch %224
+        %226 = OpLabel
+               OpBranch %218
+        %224 = OpLabel
+               OpStore %j %int_0
+        %227 = OpISub %int %173 %221
+               OpStore %x_60 %21
+               OpSelectionMerge %228 None
+               OpBranchConditional %false %229 %228
+        %229 = OpLabel
+               OpBranch %219
+        %228 = OpLabel
+               OpBranch %230
+        %230 = OpLabel
+               OpLoopMerge %231 %232 None
+               OpBranch %233
+        %233 = OpLabel
+        %234 = OpLoad %int %j
+        %235 = OpSLessThan %bool %234 %int_8
+               OpSelectionMerge %236 None
+               OpBranchConditional %235 %237 %238
+        %237 = OpLabel
+               OpBranch %236
+        %238 = OpLabel
+               OpBranch %231
+        %236 = OpLabel
+        %239 = OpLoad %int %j
+        %240 = OpLoad %int %i
+        %241 = OpIMul %int %239 %int_2
+        %242 = OpIMul %int %240 %int_2
+        %243 = OpIMul %int %242 %int_16
+        %244 = OpIAdd %int %241 %243
+        %245 = OpAccessChain %_ptr_Private_int %map %244
+        %246 = OpLoad %int %245
+        %247 = OpIEqual %bool %246 %int_0
+               OpSelectionMerge %248 None
+               OpBranchConditional %247 %249 %248
+        %249 = OpLabel
+        %250 = OpLoad %int %j
+        %251 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %252 = OpIMul %int %250 %int_2
+               OpStore %251 %252
+        %253 = OpLoad %int %i
+        %254 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %255 = OpIMul %int %253 %int_2
+               OpStore %254 %255
+               OpStore %canwalk %true
+               OpBranch %248
+        %248 = OpLabel
+               OpBranch %232
+        %232 = OpLabel
+        %256 = OpLoad %int %j
+        %257 = OpIAdd %int %256 %int_1
+               OpStore %j %257
+               OpBranch %230
+        %231 = OpLabel
+               OpBranch %219
+        %219 = OpLabel
+        %258 = OpLoad %int %i
+        %259 = OpIAdd %int %258 %int_1
+               OpStore %i %259
+               OpBranch %217
+        %218 = OpLabel
+        %260 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %261 = OpLoad %int %260
+        %262 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %263 = OpLoad %int %262
+        %264 = OpIMul %int %263 %int_16
+        %265 = OpIAdd %int %261 %264
+        %266 = OpAccessChain %_ptr_Private_int %map %265
+               OpStore %266 %int_1
+               OpBranch %213
+        %215 = OpLabel
+        %267 = OpLoad %int %v
+        %268 = OpLoad %int %directions
+        %269 = OpSMod %int %267 %268
+               OpStore %d %269
+        %270 = OpLoad %int %directions
+        %271 = OpLoad %int %v
+        %272 = OpIAdd %int %271 %270
+               OpStore %v %272
+        %273 = OpLoad %int %d
+        %274 = OpSGreaterThanEqual %bool %273 %int_0
+               OpStore %x_238_phi %274
+               OpSelectionMerge %275 None
+               OpBranchConditional %274 %276 %275
+        %276 = OpLabel
+        %277 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %278 = OpLoad %int %277
+        %279 = OpSGreaterThan %bool %278 %int_0
+               OpStore %x_237 %279
+        %280 = OpLoad %bool %x_237
+               OpStore %x_238_phi %280
+               OpBranch %275
+        %275 = OpLabel
+        %281 = OpLoad %bool %x_238_phi
+               OpStore %x_251_phi %281
+               OpSelectionMerge %282 None
+               OpBranchConditional %281 %283 %282
+        %283 = OpLabel
+        %284 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %285 = OpLoad %int %284
+        %286 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %287 = OpLoad %int %286
+        %288 = OpISub %int %285 %int_2
+        %289 = OpIMul %int %287 %int_16
+        %290 = OpIAdd %int %288 %289
+        %291 = OpAccessChain %_ptr_Private_int %map %290
+        %292 = OpLoad %int %291
+        %293 = OpIEqual %bool %292 %int_0
+               OpStore %x_250 %293
+        %294 = OpLoad %bool %x_250
+               OpStore %x_251_phi %294
+               OpBranch %282
+        %282 = OpLabel
+        %295 = OpLoad %bool %x_251_phi
+               OpSelectionMerge %296 None
+               OpBranchConditional %295 %297 %296
+        %297 = OpLabel
+        %298 = OpLoad %int %d
+        %299 = OpISub %int %298 %int_1
+               OpStore %d %299
+        %300 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %301 = OpLoad %int %300
+        %302 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %303 = OpLoad %int %302
+        %304 = OpIMul %int %303 %int_16
+        %305 = OpIAdd %int %301 %304
+        %306 = OpAccessChain %_ptr_Private_int %map %305
+               OpStore %306 %int_1
+        %307 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %308 = OpLoad %int %307
+        %309 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %310 = OpLoad %int %309
+        %311 = OpISub %int %308 %int_1
+        %312 = OpIMul %int %310 %int_16
+        %313 = OpIAdd %int %311 %312
+        %314 = OpAccessChain %_ptr_Private_int %map %313
+               OpStore %314 %int_1
+        %315 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %316 = OpLoad %int %315
+        %317 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %318 = OpLoad %int %317
+        %319 = OpISub %int %316 %int_2
+        %320 = OpIMul %int %318 %int_16
+        %321 = OpIAdd %int %319 %320
+        %322 = OpAccessChain %_ptr_Private_int %map %321
+               OpStore %322 %int_1
+        %323 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %324 = OpLoad %int %323
+        %325 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %326 = OpISub %int %324 %int_2
+               OpStore %325 %326
+               OpBranch %296
+        %296 = OpLabel
+        %327 = OpLoad %int %d
+        %328 = OpSGreaterThanEqual %bool %327 %int_0
+               OpStore %x_290_phi %328
+               OpSelectionMerge %329 None
+               OpBranchConditional %328 %330 %329
+        %330 = OpLabel
+        %331 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %332 = OpLoad %int %331
+        %333 = OpSGreaterThan %bool %332 %int_0
+               OpStore %x_289 %333
+        %334 = OpLoad %bool %x_289
+               OpStore %x_290_phi %334
+               OpBranch %329
+        %329 = OpLabel
+        %335 = OpLoad %bool %x_290_phi
+               OpStore %x_303_phi %335
+               OpSelectionMerge %336 None
+               OpBranchConditional %335 %337 %336
+        %337 = OpLabel
+        %338 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %339 = OpLoad %int %338
+        %340 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %341 = OpLoad %int %340
+        %342 = OpISub %int %341 %int_2
+        %343 = OpIMul %int %342 %int_16
+        %344 = OpIAdd %int %339 %343
+        %345 = OpAccessChain %_ptr_Private_int %map %344
+        %346 = OpLoad %int %345
+        %347 = OpIEqual %bool %346 %int_0
+               OpStore %x_302 %347
+        %348 = OpLoad %bool %x_302
+               OpStore %x_303_phi %348
+               OpBranch %336
+        %336 = OpLabel
+        %349 = OpLoad %bool %x_303_phi
+               OpSelectionMerge %350 None
+               OpBranchConditional %349 %351 %350
+        %351 = OpLabel
+        %352 = OpLoad %int %d
+        %353 = OpISub %int %352 %int_1
+               OpStore %d %353
+        %354 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %355 = OpLoad %int %354
+        %356 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %357 = OpLoad %int %356
+        %358 = OpIMul %int %357 %int_16
+        %359 = OpIAdd %int %355 %358
+        %360 = OpAccessChain %_ptr_Private_int %map %359
+               OpStore %360 %int_1
+        %361 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %362 = OpLoad %int %361
+        %363 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %364 = OpLoad %int %363
+        %365 = OpISub %int %364 %int_1
+        %366 = OpIMul %int %365 %int_16
+        %367 = OpIAdd %int %362 %366
+        %368 = OpAccessChain %_ptr_Private_int %map %367
+               OpStore %368 %int_1
+        %369 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %370 = OpLoad %int %369
+        %371 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %372 = OpLoad %int %371
+        %373 = OpISub %int %372 %int_2
+        %374 = OpIMul %int %373 %int_16
+        %375 = OpIAdd %int %370 %374
+        %376 = OpAccessChain %_ptr_Private_int %map %375
+               OpStore %376 %int_1
+        %377 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %378 = OpLoad %int %377
+        %379 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %380 = OpISub %int %378 %int_2
+               OpStore %379 %380
+               OpBranch %350
+        %350 = OpLabel
+        %381 = OpLoad %int %d
+        %382 = OpSGreaterThanEqual %bool %381 %int_0
+               OpStore %x_342_phi %382
+               OpSelectionMerge %383 None
+               OpBranchConditional %382 %384 %383
+        %384 = OpLabel
+        %385 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %386 = OpLoad %int %385
+        %387 = OpSLessThan %bool %386 %int_14
+               OpStore %x_341 %387
+        %388 = OpLoad %bool %x_341
+               OpStore %x_342_phi %388
+               OpBranch %383
+        %383 = OpLabel
+        %389 = OpLoad %bool %x_342_phi
+               OpStore %x_355_phi %389
+               OpSelectionMerge %390 None
+               OpBranchConditional %389 %391 %390
+        %391 = OpLabel
+        %392 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %393 = OpLoad %int %392
+        %394 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %395 = OpLoad %int %394
+        %396 = OpIAdd %int %393 %int_2
+        %397 = OpIMul %int %395 %int_16
+        %398 = OpIAdd %int %396 %397
+        %399 = OpAccessChain %_ptr_Private_int %map %398
+        %400 = OpLoad %int %399
+        %401 = OpIEqual %bool %400 %int_0
+               OpStore %x_354 %401
+        %402 = OpLoad %bool %x_354
+               OpStore %x_355_phi %402
+               OpBranch %390
+        %390 = OpLabel
+        %403 = OpLoad %bool %x_355_phi
+               OpSelectionMerge %404 None
+               OpBranchConditional %403 %405 %404
+        %405 = OpLabel
+        %406 = OpLoad %int %d
+        %407 = OpISub %int %406 %int_1
+               OpStore %d %407
+        %408 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %409 = OpLoad %int %408
+        %410 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %411 = OpLoad %int %410
+        %412 = OpIMul %int %411 %int_16
+        %413 = OpIAdd %int %409 %412
+        %414 = OpAccessChain %_ptr_Private_int %map %413
+               OpStore %414 %int_1
+        %415 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %416 = OpLoad %int %415
+        %417 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %418 = OpLoad %int %417
+        %419 = OpIAdd %int %416 %int_1
+        %420 = OpIMul %int %418 %int_16
+        %421 = OpIAdd %int %419 %420
+        %422 = OpAccessChain %_ptr_Private_int %map %421
+               OpStore %422 %int_1
+        %423 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %424 = OpLoad %int %423
+        %425 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %426 = OpLoad %int %425
+        %427 = OpIAdd %int %424 %int_2
+        %428 = OpIMul %int %426 %int_16
+        %429 = OpIAdd %int %427 %428
+        %430 = OpAccessChain %_ptr_Private_int %map %429
+               OpStore %430 %int_1
+        %431 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %432 = OpLoad %int %431
+        %433 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %434 = OpIAdd %int %432 %int_2
+               OpStore %433 %434
+               OpBranch %404
+        %404 = OpLabel
+        %435 = OpLoad %int %d
+        %436 = OpSGreaterThanEqual %bool %435 %int_0
+               OpStore %x_394_phi %436
+               OpSelectionMerge %437 None
+               OpBranchConditional %436 %438 %437
+        %438 = OpLabel
+        %439 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %440 = OpLoad %int %439
+        %441 = OpSLessThan %bool %440 %int_14
+               OpStore %x_393 %441
+        %442 = OpLoad %bool %x_393
+               OpStore %x_394_phi %442
+               OpBranch %437
+        %437 = OpLabel
+        %443 = OpLoad %bool %x_394_phi
+               OpStore %x_407_phi %443
+               OpSelectionMerge %444 None
+               OpBranchConditional %443 %445 %444
+        %445 = OpLabel
+        %446 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %447 = OpLoad %int %446
+        %448 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %449 = OpLoad %int %448
+        %450 = OpIAdd %int %449 %int_2
+        %451 = OpIMul %int %450 %int_16
+        %452 = OpIAdd %int %447 %451
+        %453 = OpAccessChain %_ptr_Private_int %map %452
+        %454 = OpLoad %int %453
+        %455 = OpIEqual %bool %454 %int_0
+               OpStore %x_406 %455
+        %456 = OpLoad %bool %x_406
+               OpStore %x_407_phi %456
+               OpBranch %444
+        %444 = OpLabel
+        %457 = OpLoad %bool %x_407_phi
+               OpSelectionMerge %458 None
+               OpBranchConditional %457 %459 %458
+        %459 = OpLabel
+        %460 = OpLoad %int %d
+        %461 = OpISub %int %460 %int_1
+               OpStore %d %461
+        %462 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %463 = OpLoad %int %462
+        %464 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %465 = OpLoad %int %464
+        %466 = OpIMul %int %465 %int_16
+        %467 = OpIAdd %int %463 %466
+        %468 = OpAccessChain %_ptr_Private_int %map %467
+               OpStore %468 %int_1
+        %469 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %470 = OpLoad %int %469
+        %471 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %472 = OpLoad %int %471
+        %473 = OpIAdd %int %472 %int_1
+        %474 = OpIMul %int %473 %int_16
+        %475 = OpIAdd %int %470 %474
+        %476 = OpAccessChain %_ptr_Private_int %map %475
+               OpStore %476 %int_1
+        %477 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %478 = OpLoad %int %477
+        %479 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %480 = OpLoad %int %479
+        %481 = OpIAdd %int %480 %int_2
+        %482 = OpIMul %int %481 %int_16
+        %483 = OpIAdd %int %478 %482
+        %484 = OpAccessChain %_ptr_Private_int %map %483
+               OpStore %484 %int_1
+        %485 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %486 = OpLoad %int %485
+        %487 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %488 = OpIAdd %int %486 %int_2
+               OpStore %487 %488
+               OpBranch %458
+        %458 = OpLabel
+               OpBranch %213
+        %213 = OpLabel
+        %489 = OpAccessChain %_ptr_Function_int %ipos %uint_1
+        %490 = OpLoad %int %489
+        %491 = OpAccessChain %_ptr_Function_int %ipos %uint_0
+        %492 = OpLoad %int %491
+        %493 = OpIMul %int %490 %int_16
+        %494 = OpIAdd %int %493 %492
+        %495 = OpAccessChain %_ptr_Private_int %map %494
+        %496 = OpLoad %int %495
+        %497 = OpIEqual %bool %496 %int_1
+               OpSelectionMerge %498 None
+               OpBranchConditional %497 %499 %498
+        %499 = OpLabel
+               OpStore %x_GLF_color %501
+               OpReturn
+        %498 = OpLabel
+               OpBranch %96
+         %96 = OpLabel
+        %502 = OpLoad %bool %canwalk
+               OpSelectionMerge %503 None
+               OpBranchConditional %502 %504 %505
+        %504 = OpLabel
+               OpBranch %503
+        %505 = OpLabel
+               OpBranch %95
+        %503 = OpLabel
+               OpBranch %94
+         %95 = OpLabel
+               OpStore %x_GLF_color %506
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %507
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %511 = OpLabel
+        %512 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %512
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %28
+        %514 = OpLabel
+        %515 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %515
+        %516 = OpFunctionCall %void %main_1
+        %518 = OpLoad %v4float %x_GLF_color
+        %519 = OpCompositeConstruct %main_out %518
+        %517 = OpFunctionCall %void %tint_symbol_3 %519
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 96[%96] is not post dominated by the back-edge block 503[%503]
+  %503 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-dead-break-and-unroll/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-dead-break-and-unroll/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..14e531e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-dead-break-and-unroll/1.wgsl.expected.wgsl
@@ -0,0 +1,357 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> map : array<i32, 256>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+var<private> x_60 : mat2x4<f32> = mat2x4<f32>(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
+
+fn main_1() {
+  var pos : vec2<f32>;
+  var ipos : vec2<i32>;
+  var i : i32;
+  var p : vec2<i32>;
+  var canwalk : bool;
+  var v : i32;
+  var directions : i32;
+  var j : i32;
+  var d : i32;
+  let x_63 : vec4<f32> = gl_FragCoord;
+  let x_67 : vec2<f32> = x_7.resolution;
+  let x_68 : i32 = -((256 - 14));
+  pos = (vec2<f32>(x_63.x, x_63.y) / x_67);
+  let x_71 : f32 = pos.x;
+  let x_75 : f32 = pos.y;
+  ipos = vec2<i32>(i32((x_71 * 16.0)), i32((x_75 * 16.0)));
+  i = 0;
+  loop {
+    let x_83 : i32 = i;
+    if ((x_83 < 256)) {
+    } else {
+      break;
+    }
+    let x_86 : i32 = i;
+    map[x_86] = 0;
+
+    continuing {
+      let x_88 : i32 = i;
+      i = (x_88 + 1);
+    }
+  }
+  p = vec2<i32>(0, 0);
+  canwalk = true;
+  v = 0;
+  loop {
+    var x_110 : bool;
+    var x_130 : bool;
+    var x_150 : bool;
+    var x_171 : bool;
+    var x_111_phi : bool;
+    var x_131_phi : bool;
+    var x_151_phi : bool;
+    var x_172_phi : bool;
+    let x_94 : i32 = v;
+    v = (x_94 + 1);
+    directions = 0;
+    let x_97 : i32 = p.x;
+    let x_98 : bool = (x_97 > 0);
+    x_111_phi = x_98;
+    if (x_98) {
+      let x_102 : i32 = p.x;
+      let x_105 : i32 = p.y;
+      let x_109 : i32 = map[((x_102 - 2) + (x_105 * 16))];
+      x_110 = (x_109 == 0);
+      x_111_phi = x_110;
+    }
+    let x_111 : bool = x_111_phi;
+    if (x_111) {
+      let x_114 : i32 = directions;
+      directions = (x_114 + 1);
+    }
+    let x_117 : i32 = p.y;
+    let x_118 : bool = (x_117 > 0);
+    x_131_phi = x_118;
+    if (x_118) {
+      let x_122 : i32 = p.x;
+      let x_124 : i32 = p.y;
+      let x_129 : i32 = map[(x_122 + ((x_124 - 2) * 16))];
+      x_130 = (x_129 == 0);
+      x_131_phi = x_130;
+    }
+    let x_131 : bool = x_131_phi;
+    if (x_131) {
+      let x_134 : i32 = directions;
+      directions = (x_134 + 1);
+    }
+    let x_137 : i32 = p.x;
+    let x_138 : bool = (x_137 < 14);
+    x_151_phi = x_138;
+    if (x_138) {
+      let x_142 : i32 = p.x;
+      let x_145 : i32 = p.y;
+      let x_149 : i32 = map[((x_142 + 2) + (x_145 * 16))];
+      x_150 = (x_149 == 0);
+      x_151_phi = x_150;
+    }
+    let x_151 : bool = x_151_phi;
+    if (x_151) {
+      let x_154 : i32 = directions;
+      directions = (x_154 + 1);
+    }
+    let x_156 : i32 = (256 - x_68);
+    let x_158 : i32 = p.y;
+    let x_159 : bool = (x_158 < 14);
+    x_172_phi = x_159;
+    if (x_159) {
+      let x_163 : i32 = p.x;
+      let x_165 : i32 = p.y;
+      let x_170 : i32 = map[(x_163 + ((x_165 + 2) * 16))];
+      x_171 = (x_170 == 0);
+      x_172_phi = x_171;
+    }
+    let x_172 : bool = x_172_phi;
+    if (x_172) {
+      let x_175 : i32 = directions;
+      directions = (x_175 + 1);
+    }
+    var x_237 : bool;
+    var x_250 : bool;
+    var x_289 : bool;
+    var x_302 : bool;
+    var x_341 : bool;
+    var x_354 : bool;
+    var x_393 : bool;
+    var x_406 : bool;
+    var x_238_phi : bool;
+    var x_251_phi : bool;
+    var x_290_phi : bool;
+    var x_303_phi : bool;
+    var x_342_phi : bool;
+    var x_355_phi : bool;
+    var x_394_phi : bool;
+    var x_407_phi : bool;
+    let x_177 : i32 = directions;
+    if ((x_177 == 0)) {
+      canwalk = false;
+      i = 0;
+      loop {
+        let x_186 : i32 = i;
+        if ((x_186 < 8)) {
+        } else {
+          break;
+        }
+        j = 0;
+        let x_189 : i32 = (x_156 - x_186);
+        x_60 = mat2x4<f32>(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
+        if (false) {
+          continue;
+        }
+        loop {
+          let x_194 : i32 = j;
+          if ((x_194 < 8)) {
+          } else {
+            break;
+          }
+          let x_197 : i32 = j;
+          let x_199 : i32 = i;
+          let x_204 : i32 = map[((x_197 * 2) + ((x_199 * 2) * 16))];
+          if ((x_204 == 0)) {
+            let x_208 : i32 = j;
+            p.x = (x_208 * 2);
+            let x_211 : i32 = i;
+            p.y = (x_211 * 2);
+            canwalk = true;
+          }
+
+          continuing {
+            let x_214 : i32 = j;
+            j = (x_214 + 1);
+          }
+        }
+
+        continuing {
+          let x_216 : i32 = i;
+          i = (x_216 + 1);
+        }
+      }
+      let x_219 : i32 = p.x;
+      let x_221 : i32 = p.y;
+      map[(x_219 + (x_221 * 16))] = 1;
+    } else {
+      let x_225 : i32 = v;
+      let x_226 : i32 = directions;
+      d = (x_225 % x_226);
+      let x_228 : i32 = directions;
+      let x_229 : i32 = v;
+      v = (x_229 + x_228);
+      let x_231 : i32 = d;
+      let x_232 : bool = (x_231 >= 0);
+      x_238_phi = x_232;
+      if (x_232) {
+        let x_236 : i32 = p.x;
+        x_237 = (x_236 > 0);
+        x_238_phi = x_237;
+      }
+      let x_238 : bool = x_238_phi;
+      x_251_phi = x_238;
+      if (x_238) {
+        let x_242 : i32 = p.x;
+        let x_245 : i32 = p.y;
+        let x_249 : i32 = map[((x_242 - 2) + (x_245 * 16))];
+        x_250 = (x_249 == 0);
+        x_251_phi = x_250;
+      }
+      let x_251 : bool = x_251_phi;
+      if (x_251) {
+        let x_254 : i32 = d;
+        d = (x_254 - 1);
+        let x_257 : i32 = p.x;
+        let x_259 : i32 = p.y;
+        map[(x_257 + (x_259 * 16))] = 1;
+        let x_264 : i32 = p.x;
+        let x_267 : i32 = p.y;
+        map[((x_264 - 1) + (x_267 * 16))] = 1;
+        let x_272 : i32 = p.x;
+        let x_275 : i32 = p.y;
+        map[((x_272 - 2) + (x_275 * 16))] = 1;
+        let x_280 : i32 = p.x;
+        p.x = (x_280 - 2);
+      }
+      let x_283 : i32 = d;
+      let x_284 : bool = (x_283 >= 0);
+      x_290_phi = x_284;
+      if (x_284) {
+        let x_288 : i32 = p.y;
+        x_289 = (x_288 > 0);
+        x_290_phi = x_289;
+      }
+      let x_290 : bool = x_290_phi;
+      x_303_phi = x_290;
+      if (x_290) {
+        let x_294 : i32 = p.x;
+        let x_296 : i32 = p.y;
+        let x_301 : i32 = map[(x_294 + ((x_296 - 2) * 16))];
+        x_302 = (x_301 == 0);
+        x_303_phi = x_302;
+      }
+      let x_303 : bool = x_303_phi;
+      if (x_303) {
+        let x_306 : i32 = d;
+        d = (x_306 - 1);
+        let x_309 : i32 = p.x;
+        let x_311 : i32 = p.y;
+        map[(x_309 + (x_311 * 16))] = 1;
+        let x_316 : i32 = p.x;
+        let x_318 : i32 = p.y;
+        map[(x_316 + ((x_318 - 1) * 16))] = 1;
+        let x_324 : i32 = p.x;
+        let x_326 : i32 = p.y;
+        map[(x_324 + ((x_326 - 2) * 16))] = 1;
+        let x_332 : i32 = p.y;
+        p.y = (x_332 - 2);
+      }
+      let x_335 : i32 = d;
+      let x_336 : bool = (x_335 >= 0);
+      x_342_phi = x_336;
+      if (x_336) {
+        let x_340 : i32 = p.x;
+        x_341 = (x_340 < 14);
+        x_342_phi = x_341;
+      }
+      let x_342 : bool = x_342_phi;
+      x_355_phi = x_342;
+      if (x_342) {
+        let x_346 : i32 = p.x;
+        let x_349 : i32 = p.y;
+        let x_353 : i32 = map[((x_346 + 2) + (x_349 * 16))];
+        x_354 = (x_353 == 0);
+        x_355_phi = x_354;
+      }
+      let x_355 : bool = x_355_phi;
+      if (x_355) {
+        let x_358 : i32 = d;
+        d = (x_358 - 1);
+        let x_361 : i32 = p.x;
+        let x_363 : i32 = p.y;
+        map[(x_361 + (x_363 * 16))] = 1;
+        let x_368 : i32 = p.x;
+        let x_371 : i32 = p.y;
+        map[((x_368 + 1) + (x_371 * 16))] = 1;
+        let x_376 : i32 = p.x;
+        let x_379 : i32 = p.y;
+        map[((x_376 + 2) + (x_379 * 16))] = 1;
+        let x_384 : i32 = p.x;
+        p.x = (x_384 + 2);
+      }
+      let x_387 : i32 = d;
+      let x_388 : bool = (x_387 >= 0);
+      x_394_phi = x_388;
+      if (x_388) {
+        let x_392 : i32 = p.y;
+        x_393 = (x_392 < 14);
+        x_394_phi = x_393;
+      }
+      let x_394 : bool = x_394_phi;
+      x_407_phi = x_394;
+      if (x_394) {
+        let x_398 : i32 = p.x;
+        let x_400 : i32 = p.y;
+        let x_405 : i32 = map[(x_398 + ((x_400 + 2) * 16))];
+        x_406 = (x_405 == 0);
+        x_407_phi = x_406;
+      }
+      let x_407 : bool = x_407_phi;
+      if (x_407) {
+        let x_410 : i32 = d;
+        d = (x_410 - 1);
+        let x_413 : i32 = p.x;
+        let x_415 : i32 = p.y;
+        map[(x_413 + (x_415 * 16))] = 1;
+        let x_420 : i32 = p.x;
+        let x_422 : i32 = p.y;
+        map[(x_420 + ((x_422 + 1) * 16))] = 1;
+        let x_428 : i32 = p.x;
+        let x_430 : i32 = p.y;
+        map[(x_428 + ((x_430 + 2) * 16))] = 1;
+        let x_436 : i32 = p.y;
+        p.y = (x_436 + 2);
+      }
+    }
+    let x_440 : i32 = ipos.y;
+    let x_443 : i32 = ipos.x;
+    let x_446 : i32 = map[((x_440 * 16) + x_443)];
+    if ((x_446 == 1)) {
+      x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+      return;
+    }
+
+    continuing {
+      let x_450 : bool = canwalk;
+      if (x_450) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/0-opt.spvasm
new file mode 100644
index 0000000..2f78252
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/0-opt.spvasm
@@ -0,0 +1,255 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %collision_vf2_vf4_ "collision(vf2;vf4;"
+               OpName %pos "pos"
+               OpName %quad "quad"
+               OpName %match_vf2_ "match(vf2;"
+               OpName %pos_0 "pos"
+               OpName %res "res"
+               OpName %i "i"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %indexable "indexable"
+               OpName %indexable_0 "indexable"
+               OpName %indexable_1 "indexable"
+               OpName %indexable_2 "indexable"
+               OpName %lin "lin"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpName %param_1 "param"
+               OpName %index "index"
+               OpName %state "state"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %25 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %bool = OpTypeBool
+         %32 = OpTypeFunction %bool %_ptr_Function_v2float %_ptr_Function_v4float
+         %33 = OpTypeFunction %v4float %_ptr_Function_v2float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+      %false = OpConstantFalse %bool
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+     %uint_3 = OpConstant %uint 3
+       %true = OpConstantTrue %bool
+  %float_0_5 = OpConstant %float 0.5
+    %float_1 = OpConstant %float 1
+         %44 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_1 %float_1
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %int_8 = OpConstant %int 8
+     %uint_8 = OpConstant %uint 8
+%_arr_v4float_uint_8 = OpTypeArray %v4float %uint_8
+    %float_4 = OpConstant %float 4
+   %float_20 = OpConstant %float 20
+         %53 = OpConstantComposite %v4float %float_4 %float_4 %float_20 %float_4
+         %54 = OpConstantComposite %v4float %float_4 %float_4 %float_4 %float_20
+         %55 = OpConstantComposite %v4float %float_4 %float_20 %float_20 %float_4
+    %float_8 = OpConstant %float 8
+         %57 = OpConstantComposite %v4float %float_20 %float_4 %float_4 %float_8
+    %float_6 = OpConstant %float 6
+    %float_2 = OpConstant %float 2
+         %60 = OpConstantComposite %v4float %float_8 %float_6 %float_4 %float_2
+   %float_12 = OpConstant %float 12
+         %62 = OpConstantComposite %v4float %float_2 %float_12 %float_2 %float_4
+   %float_16 = OpConstant %float 16
+         %64 = OpConstantComposite %v4float %float_16 %float_2 %float_4 %float_4
+   %float_22 = OpConstant %float 22
+         %66 = OpConstantComposite %v4float %float_12 %float_22 %float_4 %float_4
+         %67 = OpConstantComposite %_arr_v4float_uint_8 %53 %54 %55 %57 %60 %62 %64 %66
+%_ptr_Function__arr_v4float_uint_8 = OpTypePointer Function %_arr_v4float_uint_8
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+    %float_0 = OpConstant %float 0
+         %72 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+         %73 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+         %74 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+         %75 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+         %76 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+         %77 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+         %78 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+         %79 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+         %80 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %81 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+         %82 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+         %83 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+         %84 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+         %85 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+         %86 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+         %87 = OpConstantComposite %_arr_v4float_uint_16 %72 %73 %74 %75 %76 %77 %78 %79 %72 %80 %81 %82 %83 %84 %85 %86
+      %int_9 = OpConstant %int 9
+     %int_11 = OpConstant %int 11
+     %int_16 = OpConstant %int 16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+      %int_1 = OpConstant %int 1
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+   %float_32 = OpConstant %float 32
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+%_ptr_Private_int = OpTypePointer Private %int
+      %index = OpVariable %_ptr_Private_int Private
+%_arr_int_uint_16 = OpTypeArray %int %uint_16
+%_ptr_Private__arr_int_uint_16 = OpTypePointer Private %_arr_int_uint_16
+      %state = OpVariable %_ptr_Private__arr_int_uint_16 Private
+       %main = OpFunction %void None %25
+        %101 = OpLabel
+        %lin = OpVariable %_ptr_Function_v2float Function
+    %param_1 = OpVariable %_ptr_Function_v2float Function
+        %102 = OpLoad %v4float %gl_FragCoord
+        %103 = OpVectorShuffle %v2float %102 %102 0 1
+        %104 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+        %105 = OpLoad %v2float %104
+        %106 = OpFDiv %v2float %103 %105
+               OpStore %lin %106
+        %107 = OpLoad %v2float %lin
+        %108 = OpVectorTimesScalar %v2float %107 %float_32
+        %109 = OpExtInst %v2float %1 Floor %108
+               OpStore %lin %109
+        %110 = OpLoad %v2float %lin
+               OpStore %param_1 %110
+        %111 = OpFunctionCall %v4float %match_vf2_ %param_1
+               OpStore %_GLF_color %111
+               OpReturn
+               OpFunctionEnd
+%collision_vf2_vf4_ = OpFunction %bool None %32
+        %pos = OpFunctionParameter %_ptr_Function_v2float
+       %quad = OpFunctionParameter %_ptr_Function_v4float
+        %112 = OpLabel
+        %113 = OpAccessChain %_ptr_Function_float %pos %uint_0
+        %114 = OpLoad %float %113
+        %115 = OpAccessChain %_ptr_Function_float %quad %uint_0
+        %116 = OpLoad %float %115
+        %117 = OpFOrdLessThan %bool %114 %116
+               OpSelectionMerge %118 None
+               OpBranchConditional %117 %119 %118
+        %119 = OpLabel
+               OpReturnValue %false
+        %118 = OpLabel
+        %120 = OpAccessChain %_ptr_Function_float %pos %uint_1
+        %121 = OpLoad %float %120
+        %122 = OpAccessChain %_ptr_Function_float %quad %uint_1
+        %123 = OpLoad %float %122
+        %124 = OpFOrdLessThan %bool %121 %123
+               OpSelectionMerge %125 None
+               OpBranchConditional %124 %126 %125
+        %126 = OpLabel
+               OpReturnValue %false
+        %125 = OpLabel
+        %127 = OpAccessChain %_ptr_Function_float %pos %uint_0
+        %128 = OpLoad %float %127
+        %129 = OpAccessChain %_ptr_Function_float %quad %uint_0
+        %130 = OpLoad %float %129
+        %131 = OpAccessChain %_ptr_Function_float %quad %uint_2
+        %132 = OpLoad %float %131
+        %133 = OpFAdd %float %130 %132
+        %134 = OpFOrdGreaterThan %bool %128 %133
+               OpSelectionMerge %135 None
+               OpBranchConditional %134 %136 %135
+        %136 = OpLabel
+               OpReturnValue %false
+        %135 = OpLabel
+        %137 = OpAccessChain %_ptr_Function_float %pos %uint_1
+        %138 = OpLoad %float %137
+        %139 = OpAccessChain %_ptr_Function_float %quad %uint_1
+        %140 = OpLoad %float %139
+        %141 = OpAccessChain %_ptr_Function_float %quad %uint_3
+        %142 = OpLoad %float %141
+        %143 = OpFAdd %float %140 %142
+        %144 = OpFOrdGreaterThan %bool %138 %143
+               OpSelectionMerge %145 None
+               OpBranchConditional %144 %146 %145
+        %146 = OpLabel
+               OpReturnValue %false
+        %145 = OpLabel
+               OpReturnValue %true
+               OpFunctionEnd
+ %match_vf2_ = OpFunction %v4float None %33
+      %pos_0 = OpFunctionParameter %_ptr_Function_v2float
+        %147 = OpLabel
+        %res = OpVariable %_ptr_Function_v4float Function
+          %i = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_v2float Function
+    %param_0 = OpVariable %_ptr_Function_v4float Function
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_8 Function
+%indexable_0 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function
+%indexable_1 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function
+%indexable_2 = OpVariable %_ptr_Function__arr_v4float_uint_16 Function
+               OpStore %res %44
+               OpStore %i %int_0
+               OpBranch %148
+        %148 = OpLabel
+               OpLoopMerge %149 %150 None
+               OpBranch %151
+        %151 = OpLabel
+        %152 = OpLoad %int %i
+        %153 = OpSLessThan %bool %152 %int_8
+               OpBranchConditional %153 %154 %149
+        %154 = OpLabel
+        %155 = OpLoad %int %i
+        %156 = OpLoad %v2float %pos_0
+               OpStore %param %156
+               OpStore %indexable %67
+        %157 = OpAccessChain %_ptr_Function_v4float %indexable %155
+        %158 = OpLoad %v4float %157
+               OpStore %param_0 %158
+        %159 = OpFunctionCall %bool %collision_vf2_vf4_ %param %param_0
+               OpSelectionMerge %160 None
+               OpBranchConditional %159 %161 %160
+        %161 = OpLabel
+        %162 = OpLoad %int %i
+               OpStore %indexable_0 %67
+        %163 = OpAccessChain %_ptr_Function_float %indexable_0 %162 %uint_0
+        %164 = OpLoad %float %163
+        %165 = OpConvertFToS %int %164
+        %166 = OpLoad %int %i
+               OpStore %indexable_1 %67
+        %167 = OpAccessChain %_ptr_Function_float %indexable_1 %166 %uint_1
+        %168 = OpLoad %float %167
+        %169 = OpConvertFToS %int %168
+        %170 = OpIMul %int %165 %169
+        %171 = OpLoad %int %i
+        %172 = OpIMul %int %171 %int_9
+        %173 = OpIAdd %int %170 %172
+        %174 = OpIAdd %int %173 %int_11
+        %175 = OpSMod %int %174 %int_16
+               OpStore %indexable_2 %87
+        %176 = OpAccessChain %_ptr_Function_v4float %indexable_2 %175
+        %177 = OpLoad %v4float %176
+               OpStore %res %177
+               OpBranch %160
+        %160 = OpLabel
+               OpBranch %150
+        %150 = OpLabel
+        %178 = OpLoad %int %i
+        %179 = OpIAdd %int %178 %int_1
+               OpStore %i %179
+               OpBranch %148
+        %149 = OpLabel
+        %180 = OpLoad %v4float %res
+               OpReturnValue %180
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..3588689
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,106 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_20 : register(b0, space0) {
+  uint4 x_20[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static int index = 0;
+static int state[16] = (int[16])0;
+
+bool collision_vf2_vf4_(inout float2 pos, inout float4 quad) {
+  const float x_114 = pos.x;
+  const float x_116 = quad.x;
+  if ((x_114 < x_116)) {
+    return false;
+  }
+  const float x_121 = pos.y;
+  const float x_123 = quad.y;
+  if ((x_121 < x_123)) {
+    return false;
+  }
+  const float x_128 = pos.x;
+  const float x_130 = quad.x;
+  const float x_132 = quad.z;
+  if ((x_128 > (x_130 + x_132))) {
+    return false;
+  }
+  const float x_138 = pos.y;
+  const float x_140 = quad.y;
+  const float x_142 = quad.w;
+  if ((x_138 > (x_140 + x_142))) {
+    return false;
+  }
+  return true;
+}
+
+float4 match_vf2_(inout float2 pos_1) {
+  float4 res = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int i = 0;
+  float2 param = float2(0.0f, 0.0f);
+  float4 param_1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 indexable[8] = (float4[8])0;
+  float4 indexable_1[8] = (float4[8])0;
+  float4 indexable_2[8] = (float4[8])0;
+  float4 indexable_3[16] = (float4[16])0;
+  res = float4(0.5f, 0.5f, 1.0f, 1.0f);
+  i = 0;
+  {
+    for(; (i < 8); i = (i + 1)) {
+      const int x_155 = i;
+      const float2 x_156 = pos_1;
+      param = x_156;
+      const float4 tint_symbol_5[8] = {float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)};
+      indexable = tint_symbol_5;
+      const float4 x_158 = indexable[x_155];
+      param_1 = x_158;
+      const bool x_159 = collision_vf2_vf4_(param, param_1);
+      if (x_159) {
+        const int x_162 = i;
+        const float4 tint_symbol_6[8] = {float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)};
+        indexable_1 = tint_symbol_6;
+        const float x_164 = indexable_1[x_162].x;
+        const int x_166 = i;
+        const float4 tint_symbol_7[8] = {float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)};
+        indexable_2 = tint_symbol_7;
+        const float x_168 = indexable_2[x_166].y;
+        const int x_171 = i;
+        const float4 tint_symbol_8[16] = {float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)};
+        indexable_3 = tint_symbol_8;
+        const float4 x_177 = indexable_3[((((int(x_164) * int(x_168)) + (x_171 * 9)) + 11) % 16)];
+        res = x_177;
+      }
+    }
+  }
+  return res;
+}
+
+void main_1() {
+  float2 lin = float2(0.0f, 0.0f);
+  float2 param_2 = float2(0.0f, 0.0f);
+  const float4 x_102 = gl_FragCoord;
+  const float2 x_105 = asfloat(x_20[0].xy);
+  lin = (float2(x_102.x, x_102.y) / x_105);
+  lin = floor((lin * 32.0f));
+  param_2 = lin;
+  const float4 x_111 = match_vf2_(param_2);
+  x_GLF_color = x_111;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_9 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_9;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..8780c86
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/0-opt.spvasm.expected.msl
@@ -0,0 +1,122 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  int arr[16];
+};
+struct tint_array_wrapper_1 {
+  float4 arr[8];
+};
+struct tint_array_wrapper_2 {
+  float4 arr[16];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+bool collision_vf2_vf4_(thread float2* const pos, thread float4* const quad) {
+  float const x_114 = (*(pos)).x;
+  float const x_116 = (*(quad)).x;
+  if ((x_114 < x_116)) {
+    return false;
+  }
+  float const x_121 = (*(pos)).y;
+  float const x_123 = (*(quad)).y;
+  if ((x_121 < x_123)) {
+    return false;
+  }
+  float const x_128 = (*(pos)).x;
+  float const x_130 = (*(quad)).x;
+  float const x_132 = (*(quad)).z;
+  if ((x_128 > (x_130 + x_132))) {
+    return false;
+  }
+  float const x_138 = (*(pos)).y;
+  float const x_140 = (*(quad)).y;
+  float const x_142 = (*(quad)).w;
+  if ((x_138 > (x_140 + x_142))) {
+    return false;
+  }
+  return true;
+}
+
+float4 match_vf2_(thread float2* const pos_1) {
+  float4 res = 0.0f;
+  int i = 0;
+  float2 param = 0.0f;
+  float4 param_1 = 0.0f;
+  tint_array_wrapper_1 indexable = {};
+  tint_array_wrapper_1 indexable_1 = {};
+  tint_array_wrapper_1 indexable_2 = {};
+  tint_array_wrapper_2 indexable_3 = {};
+  res = float4(0.5f, 0.5f, 1.0f, 1.0f);
+  i = 0;
+  while (true) {
+    int const x_152 = i;
+    if ((x_152 < 8)) {
+    } else {
+      break;
+    }
+    int const x_155 = i;
+    float2 const x_156 = *(pos_1);
+    param = x_156;
+    tint_array_wrapper_1 const tint_symbol_4 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
+    indexable = tint_symbol_4;
+    float4 const x_158 = indexable.arr[x_155];
+    param_1 = x_158;
+    bool const x_159 = collision_vf2_vf4_(&(param), &(param_1));
+    if (x_159) {
+      int const x_162 = i;
+      tint_array_wrapper_1 const tint_symbol_5 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
+      indexable_1 = tint_symbol_5;
+      float const x_164 = indexable_1.arr[x_162].x;
+      int const x_166 = i;
+      tint_array_wrapper_1 const tint_symbol_6 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
+      indexable_2 = tint_symbol_6;
+      float const x_168 = indexable_2.arr[x_166].y;
+      int const x_171 = i;
+      tint_array_wrapper_2 const tint_symbol_7 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
+      indexable_3 = tint_symbol_7;
+      float4 const x_177 = indexable_3.arr[((((int(x_164) * int(x_168)) + (x_171 * 9)) + 11) % 16)];
+      res = x_177;
+    }
+    {
+      int const x_178 = i;
+      i = (x_178 + 1);
+    }
+  }
+  float4 const x_180 = res;
+  return x_180;
+}
+
+void main_1(constant buf0& x_20, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10) {
+  float2 lin = 0.0f;
+  float2 param_2 = 0.0f;
+  float4 const x_102 = *(tint_symbol_9);
+  float2 const x_105 = x_20.resolution;
+  lin = (float2(x_102.x, x_102.y) / x_105);
+  float2 const x_107 = lin;
+  lin = floor((x_107 * 32.0f));
+  float2 const x_110 = lin;
+  param_2 = x_110;
+  float4 const x_111 = match_vf2_(&(param_2));
+  *(tint_symbol_10) = x_111;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_20 [[buffer(0)]]) {
+  thread float4 tint_symbol_11 = 0.0f;
+  thread float4 tint_symbol_12 = 0.0f;
+  tint_symbol_11 = gl_FragCoord_param;
+  main_1(x_20, &(tint_symbol_11), &(tint_symbol_12));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_12};
+  tint_symbol_2 const tint_symbol_8 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_8;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..d01b8b5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,306 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 221
+; Schema: 0
+               OpCapability Shader
+        %202 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_20 "x_20"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %index "index"
+               OpName %state "state"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %collision_vf2_vf4_ "collision_vf2_vf4_"
+               OpName %pos "pos"
+               OpName %quad "quad"
+               OpName %match_vf2_ "match_vf2_"
+               OpName %pos_1 "pos_1"
+               OpName %res "res"
+               OpName %i "i"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %indexable "indexable"
+               OpName %indexable_1 "indexable_1"
+               OpName %indexable_2 "indexable_2"
+               OpName %indexable_3 "indexable_3"
+               OpName %main_1 "main_1"
+               OpName %lin "lin"
+               OpName %param_2 "param_2"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_20 NonWritable
+               OpDecorate %x_20 DescriptorSet 0
+               OpDecorate %x_20 Binding 0
+               OpDecorate %_arr_int_uint_16 ArrayStride 4
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v4float_uint_8 ArrayStride 16
+               OpDecorate %_arr_v4float_uint_16 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_20 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+         %14 = OpConstantNull %int
+      %index = OpVariable %_ptr_Private_int Private %14
+       %uint = OpTypeInt 32 0
+    %uint_16 = OpConstant %uint 16
+%_arr_int_uint_16 = OpTypeArray %int %uint_16
+%_ptr_Private__arr_int_uint_16 = OpTypePointer Private %_arr_int_uint_16
+         %20 = OpConstantNull %_arr_int_uint_16
+      %state = OpVariable %_ptr_Private__arr_int_uint_16 Private %20
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %bool = OpTypeBool
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+         %25 = OpTypeFunction %bool %_ptr_Function_v2float %_ptr_Function_v4float
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+      %false = OpConstantFalse %bool
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+     %uint_3 = OpConstant %uint 3
+       %true = OpConstantTrue %bool
+         %84 = OpTypeFunction %v4float %_ptr_Function_v2float
+%_ptr_Function_int = OpTypePointer Function %int
+         %92 = OpConstantNull %v2float
+     %uint_8 = OpConstant %uint 8
+%_arr_v4float_uint_8 = OpTypeArray %v4float %uint_8
+%_ptr_Function__arr_v4float_uint_8 = OpTypePointer Function %_arr_v4float_uint_8
+         %98 = OpConstantNull %_arr_v4float_uint_8
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+        %104 = OpConstantNull %_arr_v4float_uint_16
+  %float_0_5 = OpConstant %float 0.5
+    %float_1 = OpConstant %float 1
+        %107 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_1 %float_1
+      %int_0 = OpConstant %int 0
+      %int_8 = OpConstant %int 8
+    %float_4 = OpConstant %float 4
+   %float_20 = OpConstant %float 20
+        %124 = OpConstantComposite %v4float %float_4 %float_4 %float_20 %float_4
+        %125 = OpConstantComposite %v4float %float_4 %float_4 %float_4 %float_20
+        %126 = OpConstantComposite %v4float %float_4 %float_20 %float_20 %float_4
+    %float_8 = OpConstant %float 8
+        %128 = OpConstantComposite %v4float %float_20 %float_4 %float_4 %float_8
+    %float_6 = OpConstant %float 6
+    %float_2 = OpConstant %float 2
+        %131 = OpConstantComposite %v4float %float_8 %float_6 %float_4 %float_2
+   %float_12 = OpConstant %float 12
+        %133 = OpConstantComposite %v4float %float_2 %float_12 %float_2 %float_4
+   %float_16 = OpConstant %float 16
+        %135 = OpConstantComposite %v4float %float_16 %float_2 %float_4 %float_4
+   %float_22 = OpConstant %float 22
+        %137 = OpConstantComposite %v4float %float_12 %float_22 %float_4 %float_4
+        %138 = OpConstantComposite %_arr_v4float_uint_8 %124 %125 %126 %128 %131 %133 %135 %137
+    %float_0 = OpConstant %float 0
+        %154 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+        %155 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+        %156 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+        %157 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+        %158 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+        %159 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+        %160 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+        %161 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+        %162 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %163 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+        %164 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+        %165 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+        %166 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+        %167 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+        %168 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+        %169 = OpConstantComposite %_arr_v4float_uint_16 %154 %155 %156 %157 %158 %159 %160 %161 %154 %162 %163 %164 %165 %166 %167 %168
+      %int_9 = OpConstant %int 9
+     %int_11 = OpConstant %int 11
+     %int_16 = OpConstant %int 16
+      %int_1 = OpConstant %int 1
+       %void = OpTypeVoid
+        %186 = OpTypeFunction %void
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+   %float_32 = OpConstant %float 32
+   %main_out = OpTypeStruct %v4float
+        %208 = OpTypeFunction %void %main_out
+%collision_vf2_vf4_ = OpFunction %bool None %25
+        %pos = OpFunctionParameter %_ptr_Function_v2float
+       %quad = OpFunctionParameter %_ptr_Function_v4float
+         %32 = OpLabel
+         %36 = OpAccessChain %_ptr_Function_float %pos %uint_0
+         %37 = OpLoad %float %36
+         %39 = OpAccessChain %_ptr_Function_float %quad %uint_0
+         %40 = OpLoad %float %39
+         %41 = OpFOrdLessThan %bool %37 %40
+               OpSelectionMerge %42 None
+               OpBranchConditional %41 %43 %42
+         %43 = OpLabel
+               OpReturnValue %false
+         %42 = OpLabel
+         %47 = OpAccessChain %_ptr_Function_float %pos %uint_1
+         %48 = OpLoad %float %47
+         %50 = OpAccessChain %_ptr_Function_float %quad %uint_1
+         %51 = OpLoad %float %50
+         %52 = OpFOrdLessThan %bool %48 %51
+               OpSelectionMerge %53 None
+               OpBranchConditional %52 %54 %53
+         %54 = OpLabel
+               OpReturnValue %false
+         %53 = OpLabel
+         %56 = OpAccessChain %_ptr_Function_float %pos %uint_0
+         %57 = OpLoad %float %56
+         %59 = OpAccessChain %_ptr_Function_float %quad %uint_0
+         %60 = OpLoad %float %59
+         %63 = OpAccessChain %_ptr_Function_float %quad %uint_2
+         %64 = OpLoad %float %63
+         %65 = OpFAdd %float %60 %64
+         %66 = OpFOrdGreaterThan %bool %57 %65
+               OpSelectionMerge %67 None
+               OpBranchConditional %66 %68 %67
+         %68 = OpLabel
+               OpReturnValue %false
+         %67 = OpLabel
+         %70 = OpAccessChain %_ptr_Function_float %pos %uint_1
+         %71 = OpLoad %float %70
+         %73 = OpAccessChain %_ptr_Function_float %quad %uint_1
+         %74 = OpLoad %float %73
+         %77 = OpAccessChain %_ptr_Function_float %quad %uint_3
+         %78 = OpLoad %float %77
+         %79 = OpFAdd %float %74 %78
+         %80 = OpFOrdGreaterThan %bool %71 %79
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %81
+         %82 = OpLabel
+               OpReturnValue %false
+         %81 = OpLabel
+               OpReturnValue %true
+               OpFunctionEnd
+ %match_vf2_ = OpFunction %v4float None %84
+      %pos_1 = OpFunctionParameter %_ptr_Function_v2float
+         %87 = OpLabel
+        %res = OpVariable %_ptr_Function_v4float Function %5
+          %i = OpVariable %_ptr_Function_int Function %14
+      %param = OpVariable %_ptr_Function_v2float Function %92
+    %param_1 = OpVariable %_ptr_Function_v4float Function %5
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %98
+%indexable_1 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %98
+%indexable_2 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %98
+%indexable_3 = OpVariable %_ptr_Function__arr_v4float_uint_16 Function %104
+               OpStore %res %107
+               OpStore %i %int_0
+               OpBranch %109
+        %109 = OpLabel
+               OpLoopMerge %110 %111 None
+               OpBranch %112
+        %112 = OpLabel
+        %113 = OpLoad %int %i
+        %115 = OpSLessThan %bool %113 %int_8
+               OpSelectionMerge %116 None
+               OpBranchConditional %115 %117 %118
+        %117 = OpLabel
+               OpBranch %116
+        %118 = OpLabel
+               OpBranch %110
+        %116 = OpLabel
+        %119 = OpLoad %int %i
+        %121 = OpLoad %v2float %pos_1
+               OpStore %param %121
+               OpStore %indexable %138
+        %139 = OpAccessChain %_ptr_Function_v4float %indexable %119
+        %140 = OpLoad %v4float %139
+               OpStore %param_1 %140
+        %141 = OpFunctionCall %bool %collision_vf2_vf4_ %param %param_1
+               OpSelectionMerge %144 None
+               OpBranchConditional %141 %145 %144
+        %145 = OpLabel
+        %146 = OpLoad %int %i
+               OpStore %indexable_1 %138
+        %147 = OpAccessChain %_ptr_Function_float %indexable_1 %146 %uint_0
+        %148 = OpLoad %float %147
+        %149 = OpLoad %int %i
+               OpStore %indexable_2 %138
+        %150 = OpAccessChain %_ptr_Function_float %indexable_2 %149 %uint_1
+        %151 = OpLoad %float %150
+        %152 = OpLoad %int %i
+               OpStore %indexable_3 %169
+        %170 = OpConvertFToS %int %148
+        %171 = OpConvertFToS %int %151
+        %172 = OpIMul %int %170 %171
+        %174 = OpIMul %int %152 %int_9
+        %175 = OpIAdd %int %172 %174
+        %177 = OpIAdd %int %175 %int_11
+        %179 = OpSMod %int %177 %int_16
+        %180 = OpAccessChain %_ptr_Function_v4float %indexable_3 %179
+        %181 = OpLoad %v4float %180
+               OpStore %res %181
+               OpBranch %144
+        %144 = OpLabel
+               OpBranch %111
+        %111 = OpLabel
+        %182 = OpLoad %int %i
+        %184 = OpIAdd %int %182 %int_1
+               OpStore %i %184
+               OpBranch %109
+        %110 = OpLabel
+        %185 = OpLoad %v4float %res
+               OpReturnValue %185
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %186
+        %189 = OpLabel
+        %lin = OpVariable %_ptr_Function_v2float Function %92
+    %param_2 = OpVariable %_ptr_Function_v2float Function %92
+        %192 = OpLoad %v4float %gl_FragCoord
+        %194 = OpAccessChain %_ptr_Uniform_v2float %x_20 %uint_0
+        %195 = OpLoad %v2float %194
+        %196 = OpCompositeExtract %float %192 0
+        %197 = OpCompositeExtract %float %192 1
+        %198 = OpCompositeConstruct %v2float %196 %197
+        %199 = OpFDiv %v2float %198 %195
+               OpStore %lin %199
+        %200 = OpLoad %v2float %lin
+        %204 = OpVectorTimesScalar %v2float %200 %float_32
+        %201 = OpExtInst %v2float %202 Floor %204
+               OpStore %lin %201
+        %205 = OpLoad %v2float %lin
+               OpStore %param_2 %205
+        %206 = OpFunctionCall %v4float %match_vf2_ %param_2
+               OpStore %x_GLF_color %206
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %208
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %212 = OpLabel
+        %213 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %213
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %186
+        %215 = OpLabel
+        %216 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %216
+        %217 = OpFunctionCall %void %main_1
+        %219 = OpLoad %v4float %x_GLF_color
+        %220 = OpCompositeConstruct %main_out %219
+        %218 = OpFunctionCall %void %tint_symbol_3 %220
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..f8f9584
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,113 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_20 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+var<private> index : i32;
+
+var<private> state : array<i32, 16>;
+
+fn collision_vf2_vf4_(pos : ptr<function, vec2<f32>>, quad : ptr<function, vec4<f32>>) -> bool {
+  let x_114 : f32 = (*(pos)).x;
+  let x_116 : f32 = (*(quad)).x;
+  if ((x_114 < x_116)) {
+    return false;
+  }
+  let x_121 : f32 = (*(pos)).y;
+  let x_123 : f32 = (*(quad)).y;
+  if ((x_121 < x_123)) {
+    return false;
+  }
+  let x_128 : f32 = (*(pos)).x;
+  let x_130 : f32 = (*(quad)).x;
+  let x_132 : f32 = (*(quad)).z;
+  if ((x_128 > (x_130 + x_132))) {
+    return false;
+  }
+  let x_138 : f32 = (*(pos)).y;
+  let x_140 : f32 = (*(quad)).y;
+  let x_142 : f32 = (*(quad)).w;
+  if ((x_138 > (x_140 + x_142))) {
+    return false;
+  }
+  return true;
+}
+
+fn match_vf2_(pos_1 : ptr<function, vec2<f32>>) -> vec4<f32> {
+  var res : vec4<f32>;
+  var i : i32;
+  var param : vec2<f32>;
+  var param_1 : vec4<f32>;
+  var indexable : array<vec4<f32>, 8>;
+  var indexable_1 : array<vec4<f32>, 8>;
+  var indexable_2 : array<vec4<f32>, 8>;
+  var indexable_3 : array<vec4<f32>, 16>;
+  res = vec4<f32>(0.5, 0.5, 1.0, 1.0);
+  i = 0;
+  loop {
+    let x_152 : i32 = i;
+    if ((x_152 < 8)) {
+    } else {
+      break;
+    }
+    let x_155 : i32 = i;
+    let x_156 : vec2<f32> = *(pos_1);
+    param = x_156;
+    indexable = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+    let x_158 : vec4<f32> = indexable[x_155];
+    param_1 = x_158;
+    let x_159 : bool = collision_vf2_vf4_(&(param), &(param_1));
+    if (x_159) {
+      let x_162 : i32 = i;
+      indexable_1 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+      let x_164 : f32 = indexable_1[x_162].x;
+      let x_166 : i32 = i;
+      indexable_2 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+      let x_168 : f32 = indexable_2[x_166].y;
+      let x_171 : i32 = i;
+      indexable_3 = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+      let x_177 : vec4<f32> = indexable_3[((((i32(x_164) * i32(x_168)) + (x_171 * 9)) + 11) % 16)];
+      res = x_177;
+    }
+
+    continuing {
+      let x_178 : i32 = i;
+      i = (x_178 + 1);
+    }
+  }
+  let x_180 : vec4<f32> = res;
+  return x_180;
+}
+
+fn main_1() {
+  var lin : vec2<f32>;
+  var param_2 : vec2<f32>;
+  let x_102 : vec4<f32> = gl_FragCoord;
+  let x_105 : vec2<f32> = x_20.resolution;
+  lin = (vec2<f32>(x_102.x, x_102.y) / x_105);
+  let x_107 : vec2<f32> = lin;
+  lin = floor((x_107 * 32.0));
+  let x_110 : vec2<f32> = lin;
+  param_2 = x_110;
+  let x_111 : vec4<f32> = match_vf2_(&(param_2));
+  x_GLF_color = x_111;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/0-opt.wgsl
new file mode 100644
index 0000000..f8f9584
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/0-opt.wgsl
@@ -0,0 +1,113 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_20 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+var<private> index : i32;
+
+var<private> state : array<i32, 16>;
+
+fn collision_vf2_vf4_(pos : ptr<function, vec2<f32>>, quad : ptr<function, vec4<f32>>) -> bool {
+  let x_114 : f32 = (*(pos)).x;
+  let x_116 : f32 = (*(quad)).x;
+  if ((x_114 < x_116)) {
+    return false;
+  }
+  let x_121 : f32 = (*(pos)).y;
+  let x_123 : f32 = (*(quad)).y;
+  if ((x_121 < x_123)) {
+    return false;
+  }
+  let x_128 : f32 = (*(pos)).x;
+  let x_130 : f32 = (*(quad)).x;
+  let x_132 : f32 = (*(quad)).z;
+  if ((x_128 > (x_130 + x_132))) {
+    return false;
+  }
+  let x_138 : f32 = (*(pos)).y;
+  let x_140 : f32 = (*(quad)).y;
+  let x_142 : f32 = (*(quad)).w;
+  if ((x_138 > (x_140 + x_142))) {
+    return false;
+  }
+  return true;
+}
+
+fn match_vf2_(pos_1 : ptr<function, vec2<f32>>) -> vec4<f32> {
+  var res : vec4<f32>;
+  var i : i32;
+  var param : vec2<f32>;
+  var param_1 : vec4<f32>;
+  var indexable : array<vec4<f32>, 8>;
+  var indexable_1 : array<vec4<f32>, 8>;
+  var indexable_2 : array<vec4<f32>, 8>;
+  var indexable_3 : array<vec4<f32>, 16>;
+  res = vec4<f32>(0.5, 0.5, 1.0, 1.0);
+  i = 0;
+  loop {
+    let x_152 : i32 = i;
+    if ((x_152 < 8)) {
+    } else {
+      break;
+    }
+    let x_155 : i32 = i;
+    let x_156 : vec2<f32> = *(pos_1);
+    param = x_156;
+    indexable = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+    let x_158 : vec4<f32> = indexable[x_155];
+    param_1 = x_158;
+    let x_159 : bool = collision_vf2_vf4_(&(param), &(param_1));
+    if (x_159) {
+      let x_162 : i32 = i;
+      indexable_1 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+      let x_164 : f32 = indexable_1[x_162].x;
+      let x_166 : i32 = i;
+      indexable_2 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+      let x_168 : f32 = indexable_2[x_166].y;
+      let x_171 : i32 = i;
+      indexable_3 = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+      let x_177 : vec4<f32> = indexable_3[((((i32(x_164) * i32(x_168)) + (x_171 * 9)) + 11) % 16)];
+      res = x_177;
+    }
+
+    continuing {
+      let x_178 : i32 = i;
+      i = (x_178 + 1);
+    }
+  }
+  let x_180 : vec4<f32> = res;
+  return x_180;
+}
+
+fn main_1() {
+  var lin : vec2<f32>;
+  var param_2 : vec2<f32>;
+  let x_102 : vec4<f32> = gl_FragCoord;
+  let x_105 : vec2<f32> = x_20.resolution;
+  lin = (vec2<f32>(x_102.x, x_102.y) / x_105);
+  let x_107 : vec2<f32> = lin;
+  lin = floor((x_107 * 32.0));
+  let x_110 : vec2<f32> = lin;
+  param_2 = x_110;
+  let x_111 : vec4<f32> = match_vf2_(&(param_2));
+  x_GLF_color = x_111;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..3588689
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,106 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_20 : register(b0, space0) {
+  uint4 x_20[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static int index = 0;
+static int state[16] = (int[16])0;
+
+bool collision_vf2_vf4_(inout float2 pos, inout float4 quad) {
+  const float x_114 = pos.x;
+  const float x_116 = quad.x;
+  if ((x_114 < x_116)) {
+    return false;
+  }
+  const float x_121 = pos.y;
+  const float x_123 = quad.y;
+  if ((x_121 < x_123)) {
+    return false;
+  }
+  const float x_128 = pos.x;
+  const float x_130 = quad.x;
+  const float x_132 = quad.z;
+  if ((x_128 > (x_130 + x_132))) {
+    return false;
+  }
+  const float x_138 = pos.y;
+  const float x_140 = quad.y;
+  const float x_142 = quad.w;
+  if ((x_138 > (x_140 + x_142))) {
+    return false;
+  }
+  return true;
+}
+
+float4 match_vf2_(inout float2 pos_1) {
+  float4 res = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int i = 0;
+  float2 param = float2(0.0f, 0.0f);
+  float4 param_1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 indexable[8] = (float4[8])0;
+  float4 indexable_1[8] = (float4[8])0;
+  float4 indexable_2[8] = (float4[8])0;
+  float4 indexable_3[16] = (float4[16])0;
+  res = float4(0.5f, 0.5f, 1.0f, 1.0f);
+  i = 0;
+  {
+    for(; (i < 8); i = (i + 1)) {
+      const int x_155 = i;
+      const float2 x_156 = pos_1;
+      param = x_156;
+      const float4 tint_symbol_5[8] = {float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)};
+      indexable = tint_symbol_5;
+      const float4 x_158 = indexable[x_155];
+      param_1 = x_158;
+      const bool x_159 = collision_vf2_vf4_(param, param_1);
+      if (x_159) {
+        const int x_162 = i;
+        const float4 tint_symbol_6[8] = {float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)};
+        indexable_1 = tint_symbol_6;
+        const float x_164 = indexable_1[x_162].x;
+        const int x_166 = i;
+        const float4 tint_symbol_7[8] = {float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)};
+        indexable_2 = tint_symbol_7;
+        const float x_168 = indexable_2[x_166].y;
+        const int x_171 = i;
+        const float4 tint_symbol_8[16] = {float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)};
+        indexable_3 = tint_symbol_8;
+        const float4 x_177 = indexable_3[((((int(x_164) * int(x_168)) + (x_171 * 9)) + 11) % 16)];
+        res = x_177;
+      }
+    }
+  }
+  return res;
+}
+
+void main_1() {
+  float2 lin = float2(0.0f, 0.0f);
+  float2 param_2 = float2(0.0f, 0.0f);
+  const float4 x_102 = gl_FragCoord;
+  const float2 x_105 = asfloat(x_20[0].xy);
+  lin = (float2(x_102.x, x_102.y) / x_105);
+  lin = floor((lin * 32.0f));
+  param_2 = lin;
+  const float4 x_111 = match_vf2_(param_2);
+  x_GLF_color = x_111;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_9 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_9;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..8780c86
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/0-opt.wgsl.expected.msl
@@ -0,0 +1,122 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  int arr[16];
+};
+struct tint_array_wrapper_1 {
+  float4 arr[8];
+};
+struct tint_array_wrapper_2 {
+  float4 arr[16];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+bool collision_vf2_vf4_(thread float2* const pos, thread float4* const quad) {
+  float const x_114 = (*(pos)).x;
+  float const x_116 = (*(quad)).x;
+  if ((x_114 < x_116)) {
+    return false;
+  }
+  float const x_121 = (*(pos)).y;
+  float const x_123 = (*(quad)).y;
+  if ((x_121 < x_123)) {
+    return false;
+  }
+  float const x_128 = (*(pos)).x;
+  float const x_130 = (*(quad)).x;
+  float const x_132 = (*(quad)).z;
+  if ((x_128 > (x_130 + x_132))) {
+    return false;
+  }
+  float const x_138 = (*(pos)).y;
+  float const x_140 = (*(quad)).y;
+  float const x_142 = (*(quad)).w;
+  if ((x_138 > (x_140 + x_142))) {
+    return false;
+  }
+  return true;
+}
+
+float4 match_vf2_(thread float2* const pos_1) {
+  float4 res = 0.0f;
+  int i = 0;
+  float2 param = 0.0f;
+  float4 param_1 = 0.0f;
+  tint_array_wrapper_1 indexable = {};
+  tint_array_wrapper_1 indexable_1 = {};
+  tint_array_wrapper_1 indexable_2 = {};
+  tint_array_wrapper_2 indexable_3 = {};
+  res = float4(0.5f, 0.5f, 1.0f, 1.0f);
+  i = 0;
+  while (true) {
+    int const x_152 = i;
+    if ((x_152 < 8)) {
+    } else {
+      break;
+    }
+    int const x_155 = i;
+    float2 const x_156 = *(pos_1);
+    param = x_156;
+    tint_array_wrapper_1 const tint_symbol_4 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
+    indexable = tint_symbol_4;
+    float4 const x_158 = indexable.arr[x_155];
+    param_1 = x_158;
+    bool const x_159 = collision_vf2_vf4_(&(param), &(param_1));
+    if (x_159) {
+      int const x_162 = i;
+      tint_array_wrapper_1 const tint_symbol_5 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
+      indexable_1 = tint_symbol_5;
+      float const x_164 = indexable_1.arr[x_162].x;
+      int const x_166 = i;
+      tint_array_wrapper_1 const tint_symbol_6 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
+      indexable_2 = tint_symbol_6;
+      float const x_168 = indexable_2.arr[x_166].y;
+      int const x_171 = i;
+      tint_array_wrapper_2 const tint_symbol_7 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
+      indexable_3 = tint_symbol_7;
+      float4 const x_177 = indexable_3.arr[((((int(x_164) * int(x_168)) + (x_171 * 9)) + 11) % 16)];
+      res = x_177;
+    }
+    {
+      int const x_178 = i;
+      i = (x_178 + 1);
+    }
+  }
+  float4 const x_180 = res;
+  return x_180;
+}
+
+void main_1(constant buf0& x_20, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10) {
+  float2 lin = 0.0f;
+  float2 param_2 = 0.0f;
+  float4 const x_102 = *(tint_symbol_9);
+  float2 const x_105 = x_20.resolution;
+  lin = (float2(x_102.x, x_102.y) / x_105);
+  float2 const x_107 = lin;
+  lin = floor((x_107 * 32.0f));
+  float2 const x_110 = lin;
+  param_2 = x_110;
+  float4 const x_111 = match_vf2_(&(param_2));
+  *(tint_symbol_10) = x_111;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_20 [[buffer(0)]]) {
+  thread float4 tint_symbol_11 = 0.0f;
+  thread float4 tint_symbol_12 = 0.0f;
+  tint_symbol_11 = gl_FragCoord_param;
+  main_1(x_20, &(tint_symbol_11), &(tint_symbol_12));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_12};
+  tint_symbol_2 const tint_symbol_8 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_8;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..d01b8b5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,306 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 221
+; Schema: 0
+               OpCapability Shader
+        %202 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_20 "x_20"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %index "index"
+               OpName %state "state"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %collision_vf2_vf4_ "collision_vf2_vf4_"
+               OpName %pos "pos"
+               OpName %quad "quad"
+               OpName %match_vf2_ "match_vf2_"
+               OpName %pos_1 "pos_1"
+               OpName %res "res"
+               OpName %i "i"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %indexable "indexable"
+               OpName %indexable_1 "indexable_1"
+               OpName %indexable_2 "indexable_2"
+               OpName %indexable_3 "indexable_3"
+               OpName %main_1 "main_1"
+               OpName %lin "lin"
+               OpName %param_2 "param_2"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_20 NonWritable
+               OpDecorate %x_20 DescriptorSet 0
+               OpDecorate %x_20 Binding 0
+               OpDecorate %_arr_int_uint_16 ArrayStride 4
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v4float_uint_8 ArrayStride 16
+               OpDecorate %_arr_v4float_uint_16 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_20 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+         %14 = OpConstantNull %int
+      %index = OpVariable %_ptr_Private_int Private %14
+       %uint = OpTypeInt 32 0
+    %uint_16 = OpConstant %uint 16
+%_arr_int_uint_16 = OpTypeArray %int %uint_16
+%_ptr_Private__arr_int_uint_16 = OpTypePointer Private %_arr_int_uint_16
+         %20 = OpConstantNull %_arr_int_uint_16
+      %state = OpVariable %_ptr_Private__arr_int_uint_16 Private %20
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %bool = OpTypeBool
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+         %25 = OpTypeFunction %bool %_ptr_Function_v2float %_ptr_Function_v4float
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+      %false = OpConstantFalse %bool
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+     %uint_3 = OpConstant %uint 3
+       %true = OpConstantTrue %bool
+         %84 = OpTypeFunction %v4float %_ptr_Function_v2float
+%_ptr_Function_int = OpTypePointer Function %int
+         %92 = OpConstantNull %v2float
+     %uint_8 = OpConstant %uint 8
+%_arr_v4float_uint_8 = OpTypeArray %v4float %uint_8
+%_ptr_Function__arr_v4float_uint_8 = OpTypePointer Function %_arr_v4float_uint_8
+         %98 = OpConstantNull %_arr_v4float_uint_8
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+        %104 = OpConstantNull %_arr_v4float_uint_16
+  %float_0_5 = OpConstant %float 0.5
+    %float_1 = OpConstant %float 1
+        %107 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_1 %float_1
+      %int_0 = OpConstant %int 0
+      %int_8 = OpConstant %int 8
+    %float_4 = OpConstant %float 4
+   %float_20 = OpConstant %float 20
+        %124 = OpConstantComposite %v4float %float_4 %float_4 %float_20 %float_4
+        %125 = OpConstantComposite %v4float %float_4 %float_4 %float_4 %float_20
+        %126 = OpConstantComposite %v4float %float_4 %float_20 %float_20 %float_4
+    %float_8 = OpConstant %float 8
+        %128 = OpConstantComposite %v4float %float_20 %float_4 %float_4 %float_8
+    %float_6 = OpConstant %float 6
+    %float_2 = OpConstant %float 2
+        %131 = OpConstantComposite %v4float %float_8 %float_6 %float_4 %float_2
+   %float_12 = OpConstant %float 12
+        %133 = OpConstantComposite %v4float %float_2 %float_12 %float_2 %float_4
+   %float_16 = OpConstant %float 16
+        %135 = OpConstantComposite %v4float %float_16 %float_2 %float_4 %float_4
+   %float_22 = OpConstant %float 22
+        %137 = OpConstantComposite %v4float %float_12 %float_22 %float_4 %float_4
+        %138 = OpConstantComposite %_arr_v4float_uint_8 %124 %125 %126 %128 %131 %133 %135 %137
+    %float_0 = OpConstant %float 0
+        %154 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+        %155 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+        %156 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+        %157 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+        %158 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+        %159 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+        %160 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+        %161 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+        %162 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %163 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+        %164 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+        %165 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+        %166 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+        %167 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+        %168 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+        %169 = OpConstantComposite %_arr_v4float_uint_16 %154 %155 %156 %157 %158 %159 %160 %161 %154 %162 %163 %164 %165 %166 %167 %168
+      %int_9 = OpConstant %int 9
+     %int_11 = OpConstant %int 11
+     %int_16 = OpConstant %int 16
+      %int_1 = OpConstant %int 1
+       %void = OpTypeVoid
+        %186 = OpTypeFunction %void
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+   %float_32 = OpConstant %float 32
+   %main_out = OpTypeStruct %v4float
+        %208 = OpTypeFunction %void %main_out
+%collision_vf2_vf4_ = OpFunction %bool None %25
+        %pos = OpFunctionParameter %_ptr_Function_v2float
+       %quad = OpFunctionParameter %_ptr_Function_v4float
+         %32 = OpLabel
+         %36 = OpAccessChain %_ptr_Function_float %pos %uint_0
+         %37 = OpLoad %float %36
+         %39 = OpAccessChain %_ptr_Function_float %quad %uint_0
+         %40 = OpLoad %float %39
+         %41 = OpFOrdLessThan %bool %37 %40
+               OpSelectionMerge %42 None
+               OpBranchConditional %41 %43 %42
+         %43 = OpLabel
+               OpReturnValue %false
+         %42 = OpLabel
+         %47 = OpAccessChain %_ptr_Function_float %pos %uint_1
+         %48 = OpLoad %float %47
+         %50 = OpAccessChain %_ptr_Function_float %quad %uint_1
+         %51 = OpLoad %float %50
+         %52 = OpFOrdLessThan %bool %48 %51
+               OpSelectionMerge %53 None
+               OpBranchConditional %52 %54 %53
+         %54 = OpLabel
+               OpReturnValue %false
+         %53 = OpLabel
+         %56 = OpAccessChain %_ptr_Function_float %pos %uint_0
+         %57 = OpLoad %float %56
+         %59 = OpAccessChain %_ptr_Function_float %quad %uint_0
+         %60 = OpLoad %float %59
+         %63 = OpAccessChain %_ptr_Function_float %quad %uint_2
+         %64 = OpLoad %float %63
+         %65 = OpFAdd %float %60 %64
+         %66 = OpFOrdGreaterThan %bool %57 %65
+               OpSelectionMerge %67 None
+               OpBranchConditional %66 %68 %67
+         %68 = OpLabel
+               OpReturnValue %false
+         %67 = OpLabel
+         %70 = OpAccessChain %_ptr_Function_float %pos %uint_1
+         %71 = OpLoad %float %70
+         %73 = OpAccessChain %_ptr_Function_float %quad %uint_1
+         %74 = OpLoad %float %73
+         %77 = OpAccessChain %_ptr_Function_float %quad %uint_3
+         %78 = OpLoad %float %77
+         %79 = OpFAdd %float %74 %78
+         %80 = OpFOrdGreaterThan %bool %71 %79
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %81
+         %82 = OpLabel
+               OpReturnValue %false
+         %81 = OpLabel
+               OpReturnValue %true
+               OpFunctionEnd
+ %match_vf2_ = OpFunction %v4float None %84
+      %pos_1 = OpFunctionParameter %_ptr_Function_v2float
+         %87 = OpLabel
+        %res = OpVariable %_ptr_Function_v4float Function %5
+          %i = OpVariable %_ptr_Function_int Function %14
+      %param = OpVariable %_ptr_Function_v2float Function %92
+    %param_1 = OpVariable %_ptr_Function_v4float Function %5
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %98
+%indexable_1 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %98
+%indexable_2 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %98
+%indexable_3 = OpVariable %_ptr_Function__arr_v4float_uint_16 Function %104
+               OpStore %res %107
+               OpStore %i %int_0
+               OpBranch %109
+        %109 = OpLabel
+               OpLoopMerge %110 %111 None
+               OpBranch %112
+        %112 = OpLabel
+        %113 = OpLoad %int %i
+        %115 = OpSLessThan %bool %113 %int_8
+               OpSelectionMerge %116 None
+               OpBranchConditional %115 %117 %118
+        %117 = OpLabel
+               OpBranch %116
+        %118 = OpLabel
+               OpBranch %110
+        %116 = OpLabel
+        %119 = OpLoad %int %i
+        %121 = OpLoad %v2float %pos_1
+               OpStore %param %121
+               OpStore %indexable %138
+        %139 = OpAccessChain %_ptr_Function_v4float %indexable %119
+        %140 = OpLoad %v4float %139
+               OpStore %param_1 %140
+        %141 = OpFunctionCall %bool %collision_vf2_vf4_ %param %param_1
+               OpSelectionMerge %144 None
+               OpBranchConditional %141 %145 %144
+        %145 = OpLabel
+        %146 = OpLoad %int %i
+               OpStore %indexable_1 %138
+        %147 = OpAccessChain %_ptr_Function_float %indexable_1 %146 %uint_0
+        %148 = OpLoad %float %147
+        %149 = OpLoad %int %i
+               OpStore %indexable_2 %138
+        %150 = OpAccessChain %_ptr_Function_float %indexable_2 %149 %uint_1
+        %151 = OpLoad %float %150
+        %152 = OpLoad %int %i
+               OpStore %indexable_3 %169
+        %170 = OpConvertFToS %int %148
+        %171 = OpConvertFToS %int %151
+        %172 = OpIMul %int %170 %171
+        %174 = OpIMul %int %152 %int_9
+        %175 = OpIAdd %int %172 %174
+        %177 = OpIAdd %int %175 %int_11
+        %179 = OpSMod %int %177 %int_16
+        %180 = OpAccessChain %_ptr_Function_v4float %indexable_3 %179
+        %181 = OpLoad %v4float %180
+               OpStore %res %181
+               OpBranch %144
+        %144 = OpLabel
+               OpBranch %111
+        %111 = OpLabel
+        %182 = OpLoad %int %i
+        %184 = OpIAdd %int %182 %int_1
+               OpStore %i %184
+               OpBranch %109
+        %110 = OpLabel
+        %185 = OpLoad %v4float %res
+               OpReturnValue %185
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %186
+        %189 = OpLabel
+        %lin = OpVariable %_ptr_Function_v2float Function %92
+    %param_2 = OpVariable %_ptr_Function_v2float Function %92
+        %192 = OpLoad %v4float %gl_FragCoord
+        %194 = OpAccessChain %_ptr_Uniform_v2float %x_20 %uint_0
+        %195 = OpLoad %v2float %194
+        %196 = OpCompositeExtract %float %192 0
+        %197 = OpCompositeExtract %float %192 1
+        %198 = OpCompositeConstruct %v2float %196 %197
+        %199 = OpFDiv %v2float %198 %195
+               OpStore %lin %199
+        %200 = OpLoad %v2float %lin
+        %204 = OpVectorTimesScalar %v2float %200 %float_32
+        %201 = OpExtInst %v2float %202 Floor %204
+               OpStore %lin %201
+        %205 = OpLoad %v2float %lin
+               OpStore %param_2 %205
+        %206 = OpFunctionCall %v4float %match_vf2_ %param_2
+               OpStore %x_GLF_color %206
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %208
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %212 = OpLabel
+        %213 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %213
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %186
+        %215 = OpLabel
+        %216 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %216
+        %217 = OpFunctionCall %void %main_1
+        %219 = OpLoad %v4float %x_GLF_color
+        %220 = OpCompositeConstruct %main_out %219
+        %218 = OpFunctionCall %void %tint_symbol_3 %220
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..f8f9584
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,113 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_20 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+var<private> index : i32;
+
+var<private> state : array<i32, 16>;
+
+fn collision_vf2_vf4_(pos : ptr<function, vec2<f32>>, quad : ptr<function, vec4<f32>>) -> bool {
+  let x_114 : f32 = (*(pos)).x;
+  let x_116 : f32 = (*(quad)).x;
+  if ((x_114 < x_116)) {
+    return false;
+  }
+  let x_121 : f32 = (*(pos)).y;
+  let x_123 : f32 = (*(quad)).y;
+  if ((x_121 < x_123)) {
+    return false;
+  }
+  let x_128 : f32 = (*(pos)).x;
+  let x_130 : f32 = (*(quad)).x;
+  let x_132 : f32 = (*(quad)).z;
+  if ((x_128 > (x_130 + x_132))) {
+    return false;
+  }
+  let x_138 : f32 = (*(pos)).y;
+  let x_140 : f32 = (*(quad)).y;
+  let x_142 : f32 = (*(quad)).w;
+  if ((x_138 > (x_140 + x_142))) {
+    return false;
+  }
+  return true;
+}
+
+fn match_vf2_(pos_1 : ptr<function, vec2<f32>>) -> vec4<f32> {
+  var res : vec4<f32>;
+  var i : i32;
+  var param : vec2<f32>;
+  var param_1 : vec4<f32>;
+  var indexable : array<vec4<f32>, 8>;
+  var indexable_1 : array<vec4<f32>, 8>;
+  var indexable_2 : array<vec4<f32>, 8>;
+  var indexable_3 : array<vec4<f32>, 16>;
+  res = vec4<f32>(0.5, 0.5, 1.0, 1.0);
+  i = 0;
+  loop {
+    let x_152 : i32 = i;
+    if ((x_152 < 8)) {
+    } else {
+      break;
+    }
+    let x_155 : i32 = i;
+    let x_156 : vec2<f32> = *(pos_1);
+    param = x_156;
+    indexable = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+    let x_158 : vec4<f32> = indexable[x_155];
+    param_1 = x_158;
+    let x_159 : bool = collision_vf2_vf4_(&(param), &(param_1));
+    if (x_159) {
+      let x_162 : i32 = i;
+      indexable_1 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+      let x_164 : f32 = indexable_1[x_162].x;
+      let x_166 : i32 = i;
+      indexable_2 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+      let x_168 : f32 = indexable_2[x_166].y;
+      let x_171 : i32 = i;
+      indexable_3 = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+      let x_177 : vec4<f32> = indexable_3[((((i32(x_164) * i32(x_168)) + (x_171 * 9)) + 11) % 16)];
+      res = x_177;
+    }
+
+    continuing {
+      let x_178 : i32 = i;
+      i = (x_178 + 1);
+    }
+  }
+  let x_180 : vec4<f32> = res;
+  return x_180;
+}
+
+fn main_1() {
+  var lin : vec2<f32>;
+  var param_2 : vec2<f32>;
+  let x_102 : vec4<f32> = gl_FragCoord;
+  let x_105 : vec2<f32> = x_20.resolution;
+  lin = (vec2<f32>(x_102.x, x_102.y) / x_105);
+  let x_107 : vec2<f32> = lin;
+  lin = floor((x_107 * 32.0));
+  let x_110 : vec2<f32> = lin;
+  param_2 = x_110;
+  let x_111 : vec4<f32> = match_vf2_(&(param_2));
+  x_GLF_color = x_111;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/1.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/1.spvasm
new file mode 100644
index 0000000..e2303ec
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/1.spvasm
@@ -0,0 +1,259 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %collision_vf2_vf4_ "collision(vf2;vf4;"
+               OpName %pos "pos"
+               OpName %quad "quad"
+               OpName %match_vf2_ "match(vf2;"
+               OpName %pos_0 "pos"
+               OpName %res "res"
+               OpName %i "i"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %indexable "indexable"
+               OpName %indexable_0 "indexable"
+               OpName %indexable_1 "indexable"
+               OpName %indexable_2 "indexable"
+               OpName %lin "lin"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpName %param_1 "param"
+               OpName %index "index"
+               OpName %state "state"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %25 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %bool = OpTypeBool
+         %32 = OpTypeFunction %bool %_ptr_Function_v2float %_ptr_Function_v4float
+         %33 = OpTypeFunction %v4float %_ptr_Function_v2float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+      %false = OpConstantFalse %bool
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+     %uint_3 = OpConstant %uint 3
+       %true = OpConstantTrue %bool
+  %float_0_5 = OpConstant %float 0.5
+    %float_1 = OpConstant %float 1
+         %44 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_1 %float_1
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %int_8 = OpConstant %int 8
+     %uint_8 = OpConstant %uint 8
+%_arr_v4float_uint_8 = OpTypeArray %v4float %uint_8
+    %float_4 = OpConstant %float 4
+   %float_20 = OpConstant %float 20
+         %53 = OpConstantComposite %v4float %float_4 %float_4 %float_20 %float_4
+         %54 = OpConstantComposite %v4float %float_4 %float_4 %float_4 %float_20
+         %55 = OpConstantComposite %v4float %float_4 %float_20 %float_20 %float_4
+    %float_8 = OpConstant %float 8
+         %57 = OpConstantComposite %v4float %float_20 %float_4 %float_4 %float_8
+    %float_6 = OpConstant %float 6
+    %float_2 = OpConstant %float 2
+         %60 = OpConstantComposite %v4float %float_8 %float_6 %float_4 %float_2
+   %float_12 = OpConstant %float 12
+         %62 = OpConstantComposite %v4float %float_2 %float_12 %float_2 %float_4
+   %float_16 = OpConstant %float 16
+         %64 = OpConstantComposite %v4float %float_16 %float_2 %float_4 %float_4
+   %float_22 = OpConstant %float 22
+         %66 = OpConstantComposite %v4float %float_12 %float_22 %float_4 %float_4
+         %67 = OpConstantComposite %_arr_v4float_uint_8 %53 %54 %55 %57 %60 %62 %64 %66
+%_ptr_Function__arr_v4float_uint_8 = OpTypePointer Function %_arr_v4float_uint_8
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+    %float_0 = OpConstant %float 0
+         %72 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+         %73 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+         %74 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+         %75 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+         %76 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+         %77 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+         %78 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+         %79 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+         %80 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %81 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+         %82 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+         %83 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+         %84 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+         %85 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+         %86 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+         %87 = OpConstantComposite %_arr_v4float_uint_16 %72 %73 %74 %75 %76 %77 %78 %79 %72 %80 %81 %82 %83 %84 %85 %86
+      %int_9 = OpConstant %int 9
+     %int_11 = OpConstant %int 11
+     %int_16 = OpConstant %int 16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+      %int_1 = OpConstant %int 1
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+   %float_32 = OpConstant %float 32
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+%_ptr_Private_int = OpTypePointer Private %int
+      %index = OpVariable %_ptr_Private_int Private
+%_arr_int_uint_16 = OpTypeArray %int %uint_16
+%_ptr_Private__arr_int_uint_16 = OpTypePointer Private %_arr_int_uint_16
+      %state = OpVariable %_ptr_Private__arr_int_uint_16 Private
+     %v4bool = OpTypeVector %bool 4
+%_ptr_Function_v4bool = OpTypePointer Function %v4bool
+        %103 = OpConstantComposite %v4bool %false %false %false %false
+       %main = OpFunction %void None %25
+        %104 = OpLabel
+        %lin = OpVariable %_ptr_Function_v2float Function
+    %param_1 = OpVariable %_ptr_Function_v2float Function
+        %105 = OpLoad %v4float %gl_FragCoord
+        %106 = OpVectorShuffle %v2float %105 %105 0 1
+        %107 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+        %108 = OpLoad %v2float %107
+        %109 = OpFDiv %v2float %106 %108
+               OpStore %lin %109
+        %110 = OpLoad %v2float %lin
+        %111 = OpVectorTimesScalar %v2float %110 %float_32
+        %112 = OpExtInst %v2float %1 Floor %111
+               OpStore %lin %112
+        %113 = OpLoad %v2float %lin
+               OpStore %param_1 %113
+        %114 = OpFunctionCall %v4float %match_vf2_ %param_1
+               OpStore %_GLF_color %114
+               OpReturn
+               OpFunctionEnd
+%collision_vf2_vf4_ = OpFunction %bool None %32
+        %pos = OpFunctionParameter %_ptr_Function_v2float
+       %quad = OpFunctionParameter %_ptr_Function_v4float
+        %115 = OpLabel
+        %116 = OpVariable %_ptr_Function_v4bool Function %103
+        %117 = OpAccessChain %_ptr_Function_float %pos %uint_0
+        %118 = OpLoad %float %117
+        %119 = OpAccessChain %_ptr_Function_float %quad %uint_0
+        %120 = OpLoad %float %119
+        %121 = OpFOrdLessThan %bool %118 %120
+               OpSelectionMerge %122 None
+               OpBranchConditional %121 %123 %122
+        %123 = OpLabel
+               OpReturnValue %false
+        %122 = OpLabel
+        %124 = OpAccessChain %_ptr_Function_float %pos %uint_1
+        %125 = OpLoad %float %124
+        %126 = OpAccessChain %_ptr_Function_float %quad %uint_1
+        %127 = OpLoad %float %126
+        %128 = OpFOrdLessThan %bool %125 %127
+               OpSelectionMerge %129 None
+               OpBranchConditional %128 %130 %129
+        %130 = OpLabel
+               OpReturnValue %false
+        %129 = OpLabel
+        %131 = OpAccessChain %_ptr_Function_float %pos %uint_0
+        %132 = OpLoad %float %131
+        %133 = OpAccessChain %_ptr_Function_float %quad %uint_0
+        %134 = OpLoad %float %133
+        %135 = OpAccessChain %_ptr_Function_float %quad %uint_2
+        %136 = OpLoad %float %135
+        %137 = OpFAdd %float %134 %136
+        %138 = OpFOrdGreaterThan %bool %132 %137
+               OpSelectionMerge %139 None
+               OpBranchConditional %138 %140 %139
+        %140 = OpLabel
+               OpReturnValue %false
+        %139 = OpLabel
+        %141 = OpAccessChain %_ptr_Function_float %pos %uint_1
+        %142 = OpLoad %float %141
+        %143 = OpAccessChain %_ptr_Function_float %quad %uint_1
+        %144 = OpLoad %float %143
+        %145 = OpAccessChain %_ptr_Function_float %quad %uint_3
+        %146 = OpLoad %float %145
+        %147 = OpFAdd %float %144 %146
+        %148 = OpFOrdGreaterThan %bool %142 %147
+               OpSelectionMerge %149 None
+               OpBranchConditional %148 %150 %149
+        %150 = OpLabel
+               OpReturnValue %false
+        %149 = OpLabel
+               OpReturnValue %true
+               OpFunctionEnd
+ %match_vf2_ = OpFunction %v4float None %33
+      %pos_0 = OpFunctionParameter %_ptr_Function_v2float
+        %151 = OpLabel
+        %res = OpVariable %_ptr_Function_v4float Function
+          %i = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_v2float Function
+    %param_0 = OpVariable %_ptr_Function_v4float Function
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_8 Function
+%indexable_0 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function
+%indexable_1 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function
+%indexable_2 = OpVariable %_ptr_Function__arr_v4float_uint_16 Function
+               OpStore %res %44
+               OpStore %i %int_0
+               OpBranch %152
+        %152 = OpLabel
+               OpLoopMerge %153 %154 None
+               OpBranch %155
+        %155 = OpLabel
+        %156 = OpLoad %int %i
+        %157 = OpSLessThan %bool %156 %int_8
+               OpBranchConditional %157 %158 %153
+        %158 = OpLabel
+        %159 = OpLoad %int %i
+        %160 = OpLoad %v2float %pos_0
+               OpStore %param %160
+               OpStore %indexable %67
+        %161 = OpAccessChain %_ptr_Function_v4float %indexable %159
+        %162 = OpLoad %v4float %161
+               OpStore %param_0 %162
+        %163 = OpFunctionCall %bool %collision_vf2_vf4_ %param %param_0
+               OpSelectionMerge %164 None
+               OpBranchConditional %163 %165 %164
+        %165 = OpLabel
+        %166 = OpLoad %int %i
+               OpStore %indexable_0 %67
+        %167 = OpAccessChain %_ptr_Function_float %indexable_0 %166 %uint_0
+        %168 = OpLoad %float %167
+        %169 = OpConvertFToS %int %168
+        %170 = OpLoad %int %i
+               OpStore %indexable_1 %67
+        %171 = OpAccessChain %_ptr_Function_float %indexable_1 %170 %uint_1
+        %172 = OpLoad %float %171
+        %173 = OpConvertFToS %int %172
+        %174 = OpIMul %int %169 %173
+        %175 = OpLoad %int %i
+        %176 = OpIMul %int %175 %int_9
+        %177 = OpIAdd %int %174 %176
+        %178 = OpIAdd %int %177 %int_11
+        %179 = OpSMod %int %178 %int_16
+               OpStore %indexable_2 %87
+        %180 = OpAccessChain %_ptr_Function_v4float %indexable_2 %179
+        %181 = OpLoad %v4float %180
+               OpStore %res %181
+               OpBranch %164
+        %164 = OpLabel
+               OpBranch %154
+        %154 = OpLabel
+        %182 = OpLoad %int %i
+        %183 = OpIAdd %int %182 %int_1
+               OpStore %i %183
+               OpBranch %152
+        %153 = OpLabel
+        %184 = OpLoad %v4float %res
+               OpReturnValue %184
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..fb19885
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/1.spvasm.expected.hlsl
@@ -0,0 +1,107 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_20 : register(b0, space0) {
+  uint4 x_20[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static int index = 0;
+static int state[16] = (int[16])0;
+
+bool collision_vf2_vf4_(inout float2 pos, inout float4 quad) {
+  bool4 x_116 = bool4(false, false, false, false);
+  const float x_118 = pos.x;
+  const float x_120 = quad.x;
+  if ((x_118 < x_120)) {
+    return false;
+  }
+  const float x_125 = pos.y;
+  const float x_127 = quad.y;
+  if ((x_125 < x_127)) {
+    return false;
+  }
+  const float x_132 = pos.x;
+  const float x_134 = quad.x;
+  const float x_136 = quad.z;
+  if ((x_132 > (x_134 + x_136))) {
+    return false;
+  }
+  const float x_142 = pos.y;
+  const float x_144 = quad.y;
+  const float x_146 = quad.w;
+  if ((x_142 > (x_144 + x_146))) {
+    return false;
+  }
+  return true;
+}
+
+float4 match_vf2_(inout float2 pos_1) {
+  float4 res = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int i = 0;
+  float2 param = float2(0.0f, 0.0f);
+  float4 param_1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 indexable[8] = (float4[8])0;
+  float4 indexable_1[8] = (float4[8])0;
+  float4 indexable_2[8] = (float4[8])0;
+  float4 indexable_3[16] = (float4[16])0;
+  res = float4(0.5f, 0.5f, 1.0f, 1.0f);
+  i = 0;
+  {
+    for(; (i < 8); i = (i + 1)) {
+      const int x_159 = i;
+      const float2 x_160 = pos_1;
+      param = x_160;
+      const float4 tint_symbol_5[8] = {float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)};
+      indexable = tint_symbol_5;
+      const float4 x_162 = indexable[x_159];
+      param_1 = x_162;
+      const bool x_163 = collision_vf2_vf4_(param, param_1);
+      if (x_163) {
+        const int x_166 = i;
+        const float4 tint_symbol_6[8] = {float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)};
+        indexable_1 = tint_symbol_6;
+        const float x_168 = indexable_1[x_166].x;
+        const int x_170 = i;
+        const float4 tint_symbol_7[8] = {float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)};
+        indexable_2 = tint_symbol_7;
+        const float x_172 = indexable_2[x_170].y;
+        const int x_175 = i;
+        const float4 tint_symbol_8[16] = {float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)};
+        indexable_3 = tint_symbol_8;
+        const float4 x_181 = indexable_3[((((int(x_168) * int(x_172)) + (x_175 * 9)) + 11) % 16)];
+        res = x_181;
+      }
+    }
+  }
+  return res;
+}
+
+void main_1() {
+  float2 lin = float2(0.0f, 0.0f);
+  float2 param_2 = float2(0.0f, 0.0f);
+  const float4 x_105 = gl_FragCoord;
+  const float2 x_108 = asfloat(x_20[0].xy);
+  lin = (float2(x_105.x, x_105.y) / x_108);
+  lin = floor((lin * 32.0f));
+  param_2 = lin;
+  const float4 x_114 = match_vf2_(param_2);
+  x_GLF_color = x_114;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_9 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_9;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/1.spvasm.expected.msl
new file mode 100644
index 0000000..5b43db6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/1.spvasm.expected.msl
@@ -0,0 +1,123 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  int arr[16];
+};
+struct tint_array_wrapper_1 {
+  float4 arr[8];
+};
+struct tint_array_wrapper_2 {
+  float4 arr[16];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+bool collision_vf2_vf4_(thread float2* const pos, thread float4* const quad) {
+  bool4 x_116 = bool4(false, false, false, false);
+  float const x_118 = (*(pos)).x;
+  float const x_120 = (*(quad)).x;
+  if ((x_118 < x_120)) {
+    return false;
+  }
+  float const x_125 = (*(pos)).y;
+  float const x_127 = (*(quad)).y;
+  if ((x_125 < x_127)) {
+    return false;
+  }
+  float const x_132 = (*(pos)).x;
+  float const x_134 = (*(quad)).x;
+  float const x_136 = (*(quad)).z;
+  if ((x_132 > (x_134 + x_136))) {
+    return false;
+  }
+  float const x_142 = (*(pos)).y;
+  float const x_144 = (*(quad)).y;
+  float const x_146 = (*(quad)).w;
+  if ((x_142 > (x_144 + x_146))) {
+    return false;
+  }
+  return true;
+}
+
+float4 match_vf2_(thread float2* const pos_1) {
+  float4 res = 0.0f;
+  int i = 0;
+  float2 param = 0.0f;
+  float4 param_1 = 0.0f;
+  tint_array_wrapper_1 indexable = {};
+  tint_array_wrapper_1 indexable_1 = {};
+  tint_array_wrapper_1 indexable_2 = {};
+  tint_array_wrapper_2 indexable_3 = {};
+  res = float4(0.5f, 0.5f, 1.0f, 1.0f);
+  i = 0;
+  while (true) {
+    int const x_156 = i;
+    if ((x_156 < 8)) {
+    } else {
+      break;
+    }
+    int const x_159 = i;
+    float2 const x_160 = *(pos_1);
+    param = x_160;
+    tint_array_wrapper_1 const tint_symbol_4 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
+    indexable = tint_symbol_4;
+    float4 const x_162 = indexable.arr[x_159];
+    param_1 = x_162;
+    bool const x_163 = collision_vf2_vf4_(&(param), &(param_1));
+    if (x_163) {
+      int const x_166 = i;
+      tint_array_wrapper_1 const tint_symbol_5 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
+      indexable_1 = tint_symbol_5;
+      float const x_168 = indexable_1.arr[x_166].x;
+      int const x_170 = i;
+      tint_array_wrapper_1 const tint_symbol_6 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
+      indexable_2 = tint_symbol_6;
+      float const x_172 = indexable_2.arr[x_170].y;
+      int const x_175 = i;
+      tint_array_wrapper_2 const tint_symbol_7 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
+      indexable_3 = tint_symbol_7;
+      float4 const x_181 = indexable_3.arr[((((int(x_168) * int(x_172)) + (x_175 * 9)) + 11) % 16)];
+      res = x_181;
+    }
+    {
+      int const x_182 = i;
+      i = (x_182 + 1);
+    }
+  }
+  float4 const x_184 = res;
+  return x_184;
+}
+
+void main_1(constant buf0& x_20, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10) {
+  float2 lin = 0.0f;
+  float2 param_2 = 0.0f;
+  float4 const x_105 = *(tint_symbol_9);
+  float2 const x_108 = x_20.resolution;
+  lin = (float2(x_105.x, x_105.y) / x_108);
+  float2 const x_110 = lin;
+  lin = floor((x_110 * 32.0f));
+  float2 const x_113 = lin;
+  param_2 = x_113;
+  float4 const x_114 = match_vf2_(&(param_2));
+  *(tint_symbol_10) = x_114;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_20 [[buffer(0)]]) {
+  thread float4 tint_symbol_11 = 0.0f;
+  thread float4 tint_symbol_12 = 0.0f;
+  tint_symbol_11 = gl_FragCoord_param;
+  main_1(x_20, &(tint_symbol_11), &(tint_symbol_12));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_12};
+  tint_symbol_2 const tint_symbol_8 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_8;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..44345bd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/1.spvasm.expected.spvasm
@@ -0,0 +1,313 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 226
+; Schema: 0
+               OpCapability Shader
+        %207 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_20 "x_20"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %index "index"
+               OpName %state "state"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %collision_vf2_vf4_ "collision_vf2_vf4_"
+               OpName %pos "pos"
+               OpName %quad "quad"
+               OpName %x_116 "x_116"
+               OpName %match_vf2_ "match_vf2_"
+               OpName %pos_1 "pos_1"
+               OpName %res "res"
+               OpName %i "i"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %indexable "indexable"
+               OpName %indexable_1 "indexable_1"
+               OpName %indexable_2 "indexable_2"
+               OpName %indexable_3 "indexable_3"
+               OpName %main_1 "main_1"
+               OpName %lin "lin"
+               OpName %param_2 "param_2"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_20 NonWritable
+               OpDecorate %x_20 DescriptorSet 0
+               OpDecorate %x_20 Binding 0
+               OpDecorate %_arr_int_uint_16 ArrayStride 4
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v4float_uint_8 ArrayStride 16
+               OpDecorate %_arr_v4float_uint_16 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_20 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+         %14 = OpConstantNull %int
+      %index = OpVariable %_ptr_Private_int Private %14
+       %uint = OpTypeInt 32 0
+    %uint_16 = OpConstant %uint 16
+%_arr_int_uint_16 = OpTypeArray %int %uint_16
+%_ptr_Private__arr_int_uint_16 = OpTypePointer Private %_arr_int_uint_16
+         %20 = OpConstantNull %_arr_int_uint_16
+      %state = OpVariable %_ptr_Private__arr_int_uint_16 Private %20
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %bool = OpTypeBool
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+         %25 = OpTypeFunction %bool %_ptr_Function_v2float %_ptr_Function_v4float
+     %v4bool = OpTypeVector %bool 4
+      %false = OpConstantFalse %bool
+         %35 = OpConstantComposite %v4bool %false %false %false %false
+%_ptr_Function_v4bool = OpTypePointer Function %v4bool
+         %38 = OpConstantNull %v4bool
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+     %uint_3 = OpConstant %uint 3
+       %true = OpConstantTrue %bool
+         %89 = OpTypeFunction %v4float %_ptr_Function_v2float
+%_ptr_Function_int = OpTypePointer Function %int
+         %97 = OpConstantNull %v2float
+     %uint_8 = OpConstant %uint 8
+%_arr_v4float_uint_8 = OpTypeArray %v4float %uint_8
+%_ptr_Function__arr_v4float_uint_8 = OpTypePointer Function %_arr_v4float_uint_8
+        %103 = OpConstantNull %_arr_v4float_uint_8
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+        %109 = OpConstantNull %_arr_v4float_uint_16
+  %float_0_5 = OpConstant %float 0.5
+    %float_1 = OpConstant %float 1
+        %112 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_1 %float_1
+      %int_0 = OpConstant %int 0
+      %int_8 = OpConstant %int 8
+    %float_4 = OpConstant %float 4
+   %float_20 = OpConstant %float 20
+        %129 = OpConstantComposite %v4float %float_4 %float_4 %float_20 %float_4
+        %130 = OpConstantComposite %v4float %float_4 %float_4 %float_4 %float_20
+        %131 = OpConstantComposite %v4float %float_4 %float_20 %float_20 %float_4
+    %float_8 = OpConstant %float 8
+        %133 = OpConstantComposite %v4float %float_20 %float_4 %float_4 %float_8
+    %float_6 = OpConstant %float 6
+    %float_2 = OpConstant %float 2
+        %136 = OpConstantComposite %v4float %float_8 %float_6 %float_4 %float_2
+   %float_12 = OpConstant %float 12
+        %138 = OpConstantComposite %v4float %float_2 %float_12 %float_2 %float_4
+   %float_16 = OpConstant %float 16
+        %140 = OpConstantComposite %v4float %float_16 %float_2 %float_4 %float_4
+   %float_22 = OpConstant %float 22
+        %142 = OpConstantComposite %v4float %float_12 %float_22 %float_4 %float_4
+        %143 = OpConstantComposite %_arr_v4float_uint_8 %129 %130 %131 %133 %136 %138 %140 %142
+    %float_0 = OpConstant %float 0
+        %159 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+        %160 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+        %161 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+        %162 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+        %163 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+        %164 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+        %165 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+        %166 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+        %167 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %168 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+        %169 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+        %170 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+        %171 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+        %172 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+        %173 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+        %174 = OpConstantComposite %_arr_v4float_uint_16 %159 %160 %161 %162 %163 %164 %165 %166 %159 %167 %168 %169 %170 %171 %172 %173
+      %int_9 = OpConstant %int 9
+     %int_11 = OpConstant %int 11
+     %int_16 = OpConstant %int 16
+      %int_1 = OpConstant %int 1
+       %void = OpTypeVoid
+        %191 = OpTypeFunction %void
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+   %float_32 = OpConstant %float 32
+   %main_out = OpTypeStruct %v4float
+        %213 = OpTypeFunction %void %main_out
+%collision_vf2_vf4_ = OpFunction %bool None %25
+        %pos = OpFunctionParameter %_ptr_Function_v2float
+       %quad = OpFunctionParameter %_ptr_Function_v4float
+         %32 = OpLabel
+      %x_116 = OpVariable %_ptr_Function_v4bool Function %38
+               OpStore %x_116 %35
+         %42 = OpAccessChain %_ptr_Function_float %pos %uint_0
+         %43 = OpLoad %float %42
+         %45 = OpAccessChain %_ptr_Function_float %quad %uint_0
+         %46 = OpLoad %float %45
+         %47 = OpFOrdLessThan %bool %43 %46
+               OpSelectionMerge %48 None
+               OpBranchConditional %47 %49 %48
+         %49 = OpLabel
+               OpReturnValue %false
+         %48 = OpLabel
+         %52 = OpAccessChain %_ptr_Function_float %pos %uint_1
+         %53 = OpLoad %float %52
+         %55 = OpAccessChain %_ptr_Function_float %quad %uint_1
+         %56 = OpLoad %float %55
+         %57 = OpFOrdLessThan %bool %53 %56
+               OpSelectionMerge %58 None
+               OpBranchConditional %57 %59 %58
+         %59 = OpLabel
+               OpReturnValue %false
+         %58 = OpLabel
+         %61 = OpAccessChain %_ptr_Function_float %pos %uint_0
+         %62 = OpLoad %float %61
+         %64 = OpAccessChain %_ptr_Function_float %quad %uint_0
+         %65 = OpLoad %float %64
+         %68 = OpAccessChain %_ptr_Function_float %quad %uint_2
+         %69 = OpLoad %float %68
+         %70 = OpFAdd %float %65 %69
+         %71 = OpFOrdGreaterThan %bool %62 %70
+               OpSelectionMerge %72 None
+               OpBranchConditional %71 %73 %72
+         %73 = OpLabel
+               OpReturnValue %false
+         %72 = OpLabel
+         %75 = OpAccessChain %_ptr_Function_float %pos %uint_1
+         %76 = OpLoad %float %75
+         %78 = OpAccessChain %_ptr_Function_float %quad %uint_1
+         %79 = OpLoad %float %78
+         %82 = OpAccessChain %_ptr_Function_float %quad %uint_3
+         %83 = OpLoad %float %82
+         %84 = OpFAdd %float %79 %83
+         %85 = OpFOrdGreaterThan %bool %76 %84
+               OpSelectionMerge %86 None
+               OpBranchConditional %85 %87 %86
+         %87 = OpLabel
+               OpReturnValue %false
+         %86 = OpLabel
+               OpReturnValue %true
+               OpFunctionEnd
+ %match_vf2_ = OpFunction %v4float None %89
+      %pos_1 = OpFunctionParameter %_ptr_Function_v2float
+         %92 = OpLabel
+        %res = OpVariable %_ptr_Function_v4float Function %5
+          %i = OpVariable %_ptr_Function_int Function %14
+      %param = OpVariable %_ptr_Function_v2float Function %97
+    %param_1 = OpVariable %_ptr_Function_v4float Function %5
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %103
+%indexable_1 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %103
+%indexable_2 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %103
+%indexable_3 = OpVariable %_ptr_Function__arr_v4float_uint_16 Function %109
+               OpStore %res %112
+               OpStore %i %int_0
+               OpBranch %114
+        %114 = OpLabel
+               OpLoopMerge %115 %116 None
+               OpBranch %117
+        %117 = OpLabel
+        %118 = OpLoad %int %i
+        %120 = OpSLessThan %bool %118 %int_8
+               OpSelectionMerge %121 None
+               OpBranchConditional %120 %122 %123
+        %122 = OpLabel
+               OpBranch %121
+        %123 = OpLabel
+               OpBranch %115
+        %121 = OpLabel
+        %124 = OpLoad %int %i
+        %126 = OpLoad %v2float %pos_1
+               OpStore %param %126
+               OpStore %indexable %143
+        %144 = OpAccessChain %_ptr_Function_v4float %indexable %124
+        %145 = OpLoad %v4float %144
+               OpStore %param_1 %145
+        %146 = OpFunctionCall %bool %collision_vf2_vf4_ %param %param_1
+               OpSelectionMerge %149 None
+               OpBranchConditional %146 %150 %149
+        %150 = OpLabel
+        %151 = OpLoad %int %i
+               OpStore %indexable_1 %143
+        %152 = OpAccessChain %_ptr_Function_float %indexable_1 %151 %uint_0
+        %153 = OpLoad %float %152
+        %154 = OpLoad %int %i
+               OpStore %indexable_2 %143
+        %155 = OpAccessChain %_ptr_Function_float %indexable_2 %154 %uint_1
+        %156 = OpLoad %float %155
+        %157 = OpLoad %int %i
+               OpStore %indexable_3 %174
+        %175 = OpConvertFToS %int %153
+        %176 = OpConvertFToS %int %156
+        %177 = OpIMul %int %175 %176
+        %179 = OpIMul %int %157 %int_9
+        %180 = OpIAdd %int %177 %179
+        %182 = OpIAdd %int %180 %int_11
+        %184 = OpSMod %int %182 %int_16
+        %185 = OpAccessChain %_ptr_Function_v4float %indexable_3 %184
+        %186 = OpLoad %v4float %185
+               OpStore %res %186
+               OpBranch %149
+        %149 = OpLabel
+               OpBranch %116
+        %116 = OpLabel
+        %187 = OpLoad %int %i
+        %189 = OpIAdd %int %187 %int_1
+               OpStore %i %189
+               OpBranch %114
+        %115 = OpLabel
+        %190 = OpLoad %v4float %res
+               OpReturnValue %190
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %191
+        %194 = OpLabel
+        %lin = OpVariable %_ptr_Function_v2float Function %97
+    %param_2 = OpVariable %_ptr_Function_v2float Function %97
+        %197 = OpLoad %v4float %gl_FragCoord
+        %199 = OpAccessChain %_ptr_Uniform_v2float %x_20 %uint_0
+        %200 = OpLoad %v2float %199
+        %201 = OpCompositeExtract %float %197 0
+        %202 = OpCompositeExtract %float %197 1
+        %203 = OpCompositeConstruct %v2float %201 %202
+        %204 = OpFDiv %v2float %203 %200
+               OpStore %lin %204
+        %205 = OpLoad %v2float %lin
+        %209 = OpVectorTimesScalar %v2float %205 %float_32
+        %206 = OpExtInst %v2float %207 Floor %209
+               OpStore %lin %206
+        %210 = OpLoad %v2float %lin
+               OpStore %param_2 %210
+        %211 = OpFunctionCall %v4float %match_vf2_ %param_2
+               OpStore %x_GLF_color %211
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %213
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %217 = OpLabel
+        %218 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %218
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %191
+        %220 = OpLabel
+        %221 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %221
+        %222 = OpFunctionCall %void %main_1
+        %224 = OpLoad %v4float %x_GLF_color
+        %225 = OpCompositeConstruct %main_out %224
+        %223 = OpFunctionCall %void %tint_symbol_3 %225
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..f70d557
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/1.spvasm.expected.wgsl
@@ -0,0 +1,114 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_20 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+var<private> index : i32;
+
+var<private> state : array<i32, 16>;
+
+fn collision_vf2_vf4_(pos : ptr<function, vec2<f32>>, quad : ptr<function, vec4<f32>>) -> bool {
+  var x_116 : vec4<bool> = vec4<bool>(false, false, false, false);
+  let x_118 : f32 = (*(pos)).x;
+  let x_120 : f32 = (*(quad)).x;
+  if ((x_118 < x_120)) {
+    return false;
+  }
+  let x_125 : f32 = (*(pos)).y;
+  let x_127 : f32 = (*(quad)).y;
+  if ((x_125 < x_127)) {
+    return false;
+  }
+  let x_132 : f32 = (*(pos)).x;
+  let x_134 : f32 = (*(quad)).x;
+  let x_136 : f32 = (*(quad)).z;
+  if ((x_132 > (x_134 + x_136))) {
+    return false;
+  }
+  let x_142 : f32 = (*(pos)).y;
+  let x_144 : f32 = (*(quad)).y;
+  let x_146 : f32 = (*(quad)).w;
+  if ((x_142 > (x_144 + x_146))) {
+    return false;
+  }
+  return true;
+}
+
+fn match_vf2_(pos_1 : ptr<function, vec2<f32>>) -> vec4<f32> {
+  var res : vec4<f32>;
+  var i : i32;
+  var param : vec2<f32>;
+  var param_1 : vec4<f32>;
+  var indexable : array<vec4<f32>, 8>;
+  var indexable_1 : array<vec4<f32>, 8>;
+  var indexable_2 : array<vec4<f32>, 8>;
+  var indexable_3 : array<vec4<f32>, 16>;
+  res = vec4<f32>(0.5, 0.5, 1.0, 1.0);
+  i = 0;
+  loop {
+    let x_156 : i32 = i;
+    if ((x_156 < 8)) {
+    } else {
+      break;
+    }
+    let x_159 : i32 = i;
+    let x_160 : vec2<f32> = *(pos_1);
+    param = x_160;
+    indexable = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+    let x_162 : vec4<f32> = indexable[x_159];
+    param_1 = x_162;
+    let x_163 : bool = collision_vf2_vf4_(&(param), &(param_1));
+    if (x_163) {
+      let x_166 : i32 = i;
+      indexable_1 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+      let x_168 : f32 = indexable_1[x_166].x;
+      let x_170 : i32 = i;
+      indexable_2 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+      let x_172 : f32 = indexable_2[x_170].y;
+      let x_175 : i32 = i;
+      indexable_3 = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+      let x_181 : vec4<f32> = indexable_3[((((i32(x_168) * i32(x_172)) + (x_175 * 9)) + 11) % 16)];
+      res = x_181;
+    }
+
+    continuing {
+      let x_182 : i32 = i;
+      i = (x_182 + 1);
+    }
+  }
+  let x_184 : vec4<f32> = res;
+  return x_184;
+}
+
+fn main_1() {
+  var lin : vec2<f32>;
+  var param_2 : vec2<f32>;
+  let x_105 : vec4<f32> = gl_FragCoord;
+  let x_108 : vec2<f32> = x_20.resolution;
+  lin = (vec2<f32>(x_105.x, x_105.y) / x_108);
+  let x_110 : vec2<f32> = lin;
+  lin = floor((x_110 * 32.0));
+  let x_113 : vec2<f32> = lin;
+  param_2 = x_113;
+  let x_114 : vec4<f32> = match_vf2_(&(param_2));
+  x_GLF_color = x_114;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/1.wgsl
new file mode 100644
index 0000000..f70d557
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/1.wgsl
@@ -0,0 +1,114 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_20 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+var<private> index : i32;
+
+var<private> state : array<i32, 16>;
+
+fn collision_vf2_vf4_(pos : ptr<function, vec2<f32>>, quad : ptr<function, vec4<f32>>) -> bool {
+  var x_116 : vec4<bool> = vec4<bool>(false, false, false, false);
+  let x_118 : f32 = (*(pos)).x;
+  let x_120 : f32 = (*(quad)).x;
+  if ((x_118 < x_120)) {
+    return false;
+  }
+  let x_125 : f32 = (*(pos)).y;
+  let x_127 : f32 = (*(quad)).y;
+  if ((x_125 < x_127)) {
+    return false;
+  }
+  let x_132 : f32 = (*(pos)).x;
+  let x_134 : f32 = (*(quad)).x;
+  let x_136 : f32 = (*(quad)).z;
+  if ((x_132 > (x_134 + x_136))) {
+    return false;
+  }
+  let x_142 : f32 = (*(pos)).y;
+  let x_144 : f32 = (*(quad)).y;
+  let x_146 : f32 = (*(quad)).w;
+  if ((x_142 > (x_144 + x_146))) {
+    return false;
+  }
+  return true;
+}
+
+fn match_vf2_(pos_1 : ptr<function, vec2<f32>>) -> vec4<f32> {
+  var res : vec4<f32>;
+  var i : i32;
+  var param : vec2<f32>;
+  var param_1 : vec4<f32>;
+  var indexable : array<vec4<f32>, 8>;
+  var indexable_1 : array<vec4<f32>, 8>;
+  var indexable_2 : array<vec4<f32>, 8>;
+  var indexable_3 : array<vec4<f32>, 16>;
+  res = vec4<f32>(0.5, 0.5, 1.0, 1.0);
+  i = 0;
+  loop {
+    let x_156 : i32 = i;
+    if ((x_156 < 8)) {
+    } else {
+      break;
+    }
+    let x_159 : i32 = i;
+    let x_160 : vec2<f32> = *(pos_1);
+    param = x_160;
+    indexable = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+    let x_162 : vec4<f32> = indexable[x_159];
+    param_1 = x_162;
+    let x_163 : bool = collision_vf2_vf4_(&(param), &(param_1));
+    if (x_163) {
+      let x_166 : i32 = i;
+      indexable_1 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+      let x_168 : f32 = indexable_1[x_166].x;
+      let x_170 : i32 = i;
+      indexable_2 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+      let x_172 : f32 = indexable_2[x_170].y;
+      let x_175 : i32 = i;
+      indexable_3 = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+      let x_181 : vec4<f32> = indexable_3[((((i32(x_168) * i32(x_172)) + (x_175 * 9)) + 11) % 16)];
+      res = x_181;
+    }
+
+    continuing {
+      let x_182 : i32 = i;
+      i = (x_182 + 1);
+    }
+  }
+  let x_184 : vec4<f32> = res;
+  return x_184;
+}
+
+fn main_1() {
+  var lin : vec2<f32>;
+  var param_2 : vec2<f32>;
+  let x_105 : vec4<f32> = gl_FragCoord;
+  let x_108 : vec2<f32> = x_20.resolution;
+  lin = (vec2<f32>(x_105.x, x_105.y) / x_108);
+  let x_110 : vec2<f32> = lin;
+  lin = floor((x_110 * 32.0));
+  let x_113 : vec2<f32> = lin;
+  param_2 = x_113;
+  let x_114 : vec4<f32> = match_vf2_(&(param_2));
+  x_GLF_color = x_114;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..fb19885
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/1.wgsl.expected.hlsl
@@ -0,0 +1,107 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_20 : register(b0, space0) {
+  uint4 x_20[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static int index = 0;
+static int state[16] = (int[16])0;
+
+bool collision_vf2_vf4_(inout float2 pos, inout float4 quad) {
+  bool4 x_116 = bool4(false, false, false, false);
+  const float x_118 = pos.x;
+  const float x_120 = quad.x;
+  if ((x_118 < x_120)) {
+    return false;
+  }
+  const float x_125 = pos.y;
+  const float x_127 = quad.y;
+  if ((x_125 < x_127)) {
+    return false;
+  }
+  const float x_132 = pos.x;
+  const float x_134 = quad.x;
+  const float x_136 = quad.z;
+  if ((x_132 > (x_134 + x_136))) {
+    return false;
+  }
+  const float x_142 = pos.y;
+  const float x_144 = quad.y;
+  const float x_146 = quad.w;
+  if ((x_142 > (x_144 + x_146))) {
+    return false;
+  }
+  return true;
+}
+
+float4 match_vf2_(inout float2 pos_1) {
+  float4 res = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int i = 0;
+  float2 param = float2(0.0f, 0.0f);
+  float4 param_1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 indexable[8] = (float4[8])0;
+  float4 indexable_1[8] = (float4[8])0;
+  float4 indexable_2[8] = (float4[8])0;
+  float4 indexable_3[16] = (float4[16])0;
+  res = float4(0.5f, 0.5f, 1.0f, 1.0f);
+  i = 0;
+  {
+    for(; (i < 8); i = (i + 1)) {
+      const int x_159 = i;
+      const float2 x_160 = pos_1;
+      param = x_160;
+      const float4 tint_symbol_5[8] = {float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)};
+      indexable = tint_symbol_5;
+      const float4 x_162 = indexable[x_159];
+      param_1 = x_162;
+      const bool x_163 = collision_vf2_vf4_(param, param_1);
+      if (x_163) {
+        const int x_166 = i;
+        const float4 tint_symbol_6[8] = {float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)};
+        indexable_1 = tint_symbol_6;
+        const float x_168 = indexable_1[x_166].x;
+        const int x_170 = i;
+        const float4 tint_symbol_7[8] = {float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)};
+        indexable_2 = tint_symbol_7;
+        const float x_172 = indexable_2[x_170].y;
+        const int x_175 = i;
+        const float4 tint_symbol_8[16] = {float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)};
+        indexable_3 = tint_symbol_8;
+        const float4 x_181 = indexable_3[((((int(x_168) * int(x_172)) + (x_175 * 9)) + 11) % 16)];
+        res = x_181;
+      }
+    }
+  }
+  return res;
+}
+
+void main_1() {
+  float2 lin = float2(0.0f, 0.0f);
+  float2 param_2 = float2(0.0f, 0.0f);
+  const float4 x_105 = gl_FragCoord;
+  const float2 x_108 = asfloat(x_20[0].xy);
+  lin = (float2(x_105.x, x_105.y) / x_108);
+  lin = floor((lin * 32.0f));
+  param_2 = lin;
+  const float4 x_114 = match_vf2_(param_2);
+  x_GLF_color = x_114;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_9 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_9;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/1.wgsl.expected.msl
new file mode 100644
index 0000000..5b43db6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/1.wgsl.expected.msl
@@ -0,0 +1,123 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  int arr[16];
+};
+struct tint_array_wrapper_1 {
+  float4 arr[8];
+};
+struct tint_array_wrapper_2 {
+  float4 arr[16];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+bool collision_vf2_vf4_(thread float2* const pos, thread float4* const quad) {
+  bool4 x_116 = bool4(false, false, false, false);
+  float const x_118 = (*(pos)).x;
+  float const x_120 = (*(quad)).x;
+  if ((x_118 < x_120)) {
+    return false;
+  }
+  float const x_125 = (*(pos)).y;
+  float const x_127 = (*(quad)).y;
+  if ((x_125 < x_127)) {
+    return false;
+  }
+  float const x_132 = (*(pos)).x;
+  float const x_134 = (*(quad)).x;
+  float const x_136 = (*(quad)).z;
+  if ((x_132 > (x_134 + x_136))) {
+    return false;
+  }
+  float const x_142 = (*(pos)).y;
+  float const x_144 = (*(quad)).y;
+  float const x_146 = (*(quad)).w;
+  if ((x_142 > (x_144 + x_146))) {
+    return false;
+  }
+  return true;
+}
+
+float4 match_vf2_(thread float2* const pos_1) {
+  float4 res = 0.0f;
+  int i = 0;
+  float2 param = 0.0f;
+  float4 param_1 = 0.0f;
+  tint_array_wrapper_1 indexable = {};
+  tint_array_wrapper_1 indexable_1 = {};
+  tint_array_wrapper_1 indexable_2 = {};
+  tint_array_wrapper_2 indexable_3 = {};
+  res = float4(0.5f, 0.5f, 1.0f, 1.0f);
+  i = 0;
+  while (true) {
+    int const x_156 = i;
+    if ((x_156 < 8)) {
+    } else {
+      break;
+    }
+    int const x_159 = i;
+    float2 const x_160 = *(pos_1);
+    param = x_160;
+    tint_array_wrapper_1 const tint_symbol_4 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
+    indexable = tint_symbol_4;
+    float4 const x_162 = indexable.arr[x_159];
+    param_1 = x_162;
+    bool const x_163 = collision_vf2_vf4_(&(param), &(param_1));
+    if (x_163) {
+      int const x_166 = i;
+      tint_array_wrapper_1 const tint_symbol_5 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
+      indexable_1 = tint_symbol_5;
+      float const x_168 = indexable_1.arr[x_166].x;
+      int const x_170 = i;
+      tint_array_wrapper_1 const tint_symbol_6 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
+      indexable_2 = tint_symbol_6;
+      float const x_172 = indexable_2.arr[x_170].y;
+      int const x_175 = i;
+      tint_array_wrapper_2 const tint_symbol_7 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
+      indexable_3 = tint_symbol_7;
+      float4 const x_181 = indexable_3.arr[((((int(x_168) * int(x_172)) + (x_175 * 9)) + 11) % 16)];
+      res = x_181;
+    }
+    {
+      int const x_182 = i;
+      i = (x_182 + 1);
+    }
+  }
+  float4 const x_184 = res;
+  return x_184;
+}
+
+void main_1(constant buf0& x_20, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10) {
+  float2 lin = 0.0f;
+  float2 param_2 = 0.0f;
+  float4 const x_105 = *(tint_symbol_9);
+  float2 const x_108 = x_20.resolution;
+  lin = (float2(x_105.x, x_105.y) / x_108);
+  float2 const x_110 = lin;
+  lin = floor((x_110 * 32.0f));
+  float2 const x_113 = lin;
+  param_2 = x_113;
+  float4 const x_114 = match_vf2_(&(param_2));
+  *(tint_symbol_10) = x_114;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_20 [[buffer(0)]]) {
+  thread float4 tint_symbol_11 = 0.0f;
+  thread float4 tint_symbol_12 = 0.0f;
+  tint_symbol_11 = gl_FragCoord_param;
+  main_1(x_20, &(tint_symbol_11), &(tint_symbol_12));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_12};
+  tint_symbol_2 const tint_symbol_8 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_8;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..44345bd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/1.wgsl.expected.spvasm
@@ -0,0 +1,313 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 226
+; Schema: 0
+               OpCapability Shader
+        %207 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_20 "x_20"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %index "index"
+               OpName %state "state"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %collision_vf2_vf4_ "collision_vf2_vf4_"
+               OpName %pos "pos"
+               OpName %quad "quad"
+               OpName %x_116 "x_116"
+               OpName %match_vf2_ "match_vf2_"
+               OpName %pos_1 "pos_1"
+               OpName %res "res"
+               OpName %i "i"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %indexable "indexable"
+               OpName %indexable_1 "indexable_1"
+               OpName %indexable_2 "indexable_2"
+               OpName %indexable_3 "indexable_3"
+               OpName %main_1 "main_1"
+               OpName %lin "lin"
+               OpName %param_2 "param_2"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_20 NonWritable
+               OpDecorate %x_20 DescriptorSet 0
+               OpDecorate %x_20 Binding 0
+               OpDecorate %_arr_int_uint_16 ArrayStride 4
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v4float_uint_8 ArrayStride 16
+               OpDecorate %_arr_v4float_uint_16 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_20 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+         %14 = OpConstantNull %int
+      %index = OpVariable %_ptr_Private_int Private %14
+       %uint = OpTypeInt 32 0
+    %uint_16 = OpConstant %uint 16
+%_arr_int_uint_16 = OpTypeArray %int %uint_16
+%_ptr_Private__arr_int_uint_16 = OpTypePointer Private %_arr_int_uint_16
+         %20 = OpConstantNull %_arr_int_uint_16
+      %state = OpVariable %_ptr_Private__arr_int_uint_16 Private %20
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %bool = OpTypeBool
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+         %25 = OpTypeFunction %bool %_ptr_Function_v2float %_ptr_Function_v4float
+     %v4bool = OpTypeVector %bool 4
+      %false = OpConstantFalse %bool
+         %35 = OpConstantComposite %v4bool %false %false %false %false
+%_ptr_Function_v4bool = OpTypePointer Function %v4bool
+         %38 = OpConstantNull %v4bool
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+     %uint_3 = OpConstant %uint 3
+       %true = OpConstantTrue %bool
+         %89 = OpTypeFunction %v4float %_ptr_Function_v2float
+%_ptr_Function_int = OpTypePointer Function %int
+         %97 = OpConstantNull %v2float
+     %uint_8 = OpConstant %uint 8
+%_arr_v4float_uint_8 = OpTypeArray %v4float %uint_8
+%_ptr_Function__arr_v4float_uint_8 = OpTypePointer Function %_arr_v4float_uint_8
+        %103 = OpConstantNull %_arr_v4float_uint_8
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+        %109 = OpConstantNull %_arr_v4float_uint_16
+  %float_0_5 = OpConstant %float 0.5
+    %float_1 = OpConstant %float 1
+        %112 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_1 %float_1
+      %int_0 = OpConstant %int 0
+      %int_8 = OpConstant %int 8
+    %float_4 = OpConstant %float 4
+   %float_20 = OpConstant %float 20
+        %129 = OpConstantComposite %v4float %float_4 %float_4 %float_20 %float_4
+        %130 = OpConstantComposite %v4float %float_4 %float_4 %float_4 %float_20
+        %131 = OpConstantComposite %v4float %float_4 %float_20 %float_20 %float_4
+    %float_8 = OpConstant %float 8
+        %133 = OpConstantComposite %v4float %float_20 %float_4 %float_4 %float_8
+    %float_6 = OpConstant %float 6
+    %float_2 = OpConstant %float 2
+        %136 = OpConstantComposite %v4float %float_8 %float_6 %float_4 %float_2
+   %float_12 = OpConstant %float 12
+        %138 = OpConstantComposite %v4float %float_2 %float_12 %float_2 %float_4
+   %float_16 = OpConstant %float 16
+        %140 = OpConstantComposite %v4float %float_16 %float_2 %float_4 %float_4
+   %float_22 = OpConstant %float 22
+        %142 = OpConstantComposite %v4float %float_12 %float_22 %float_4 %float_4
+        %143 = OpConstantComposite %_arr_v4float_uint_8 %129 %130 %131 %133 %136 %138 %140 %142
+    %float_0 = OpConstant %float 0
+        %159 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+        %160 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+        %161 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+        %162 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+        %163 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+        %164 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+        %165 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+        %166 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+        %167 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %168 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+        %169 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+        %170 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+        %171 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+        %172 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+        %173 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+        %174 = OpConstantComposite %_arr_v4float_uint_16 %159 %160 %161 %162 %163 %164 %165 %166 %159 %167 %168 %169 %170 %171 %172 %173
+      %int_9 = OpConstant %int 9
+     %int_11 = OpConstant %int 11
+     %int_16 = OpConstant %int 16
+      %int_1 = OpConstant %int 1
+       %void = OpTypeVoid
+        %191 = OpTypeFunction %void
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+   %float_32 = OpConstant %float 32
+   %main_out = OpTypeStruct %v4float
+        %213 = OpTypeFunction %void %main_out
+%collision_vf2_vf4_ = OpFunction %bool None %25
+        %pos = OpFunctionParameter %_ptr_Function_v2float
+       %quad = OpFunctionParameter %_ptr_Function_v4float
+         %32 = OpLabel
+      %x_116 = OpVariable %_ptr_Function_v4bool Function %38
+               OpStore %x_116 %35
+         %42 = OpAccessChain %_ptr_Function_float %pos %uint_0
+         %43 = OpLoad %float %42
+         %45 = OpAccessChain %_ptr_Function_float %quad %uint_0
+         %46 = OpLoad %float %45
+         %47 = OpFOrdLessThan %bool %43 %46
+               OpSelectionMerge %48 None
+               OpBranchConditional %47 %49 %48
+         %49 = OpLabel
+               OpReturnValue %false
+         %48 = OpLabel
+         %52 = OpAccessChain %_ptr_Function_float %pos %uint_1
+         %53 = OpLoad %float %52
+         %55 = OpAccessChain %_ptr_Function_float %quad %uint_1
+         %56 = OpLoad %float %55
+         %57 = OpFOrdLessThan %bool %53 %56
+               OpSelectionMerge %58 None
+               OpBranchConditional %57 %59 %58
+         %59 = OpLabel
+               OpReturnValue %false
+         %58 = OpLabel
+         %61 = OpAccessChain %_ptr_Function_float %pos %uint_0
+         %62 = OpLoad %float %61
+         %64 = OpAccessChain %_ptr_Function_float %quad %uint_0
+         %65 = OpLoad %float %64
+         %68 = OpAccessChain %_ptr_Function_float %quad %uint_2
+         %69 = OpLoad %float %68
+         %70 = OpFAdd %float %65 %69
+         %71 = OpFOrdGreaterThan %bool %62 %70
+               OpSelectionMerge %72 None
+               OpBranchConditional %71 %73 %72
+         %73 = OpLabel
+               OpReturnValue %false
+         %72 = OpLabel
+         %75 = OpAccessChain %_ptr_Function_float %pos %uint_1
+         %76 = OpLoad %float %75
+         %78 = OpAccessChain %_ptr_Function_float %quad %uint_1
+         %79 = OpLoad %float %78
+         %82 = OpAccessChain %_ptr_Function_float %quad %uint_3
+         %83 = OpLoad %float %82
+         %84 = OpFAdd %float %79 %83
+         %85 = OpFOrdGreaterThan %bool %76 %84
+               OpSelectionMerge %86 None
+               OpBranchConditional %85 %87 %86
+         %87 = OpLabel
+               OpReturnValue %false
+         %86 = OpLabel
+               OpReturnValue %true
+               OpFunctionEnd
+ %match_vf2_ = OpFunction %v4float None %89
+      %pos_1 = OpFunctionParameter %_ptr_Function_v2float
+         %92 = OpLabel
+        %res = OpVariable %_ptr_Function_v4float Function %5
+          %i = OpVariable %_ptr_Function_int Function %14
+      %param = OpVariable %_ptr_Function_v2float Function %97
+    %param_1 = OpVariable %_ptr_Function_v4float Function %5
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %103
+%indexable_1 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %103
+%indexable_2 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %103
+%indexable_3 = OpVariable %_ptr_Function__arr_v4float_uint_16 Function %109
+               OpStore %res %112
+               OpStore %i %int_0
+               OpBranch %114
+        %114 = OpLabel
+               OpLoopMerge %115 %116 None
+               OpBranch %117
+        %117 = OpLabel
+        %118 = OpLoad %int %i
+        %120 = OpSLessThan %bool %118 %int_8
+               OpSelectionMerge %121 None
+               OpBranchConditional %120 %122 %123
+        %122 = OpLabel
+               OpBranch %121
+        %123 = OpLabel
+               OpBranch %115
+        %121 = OpLabel
+        %124 = OpLoad %int %i
+        %126 = OpLoad %v2float %pos_1
+               OpStore %param %126
+               OpStore %indexable %143
+        %144 = OpAccessChain %_ptr_Function_v4float %indexable %124
+        %145 = OpLoad %v4float %144
+               OpStore %param_1 %145
+        %146 = OpFunctionCall %bool %collision_vf2_vf4_ %param %param_1
+               OpSelectionMerge %149 None
+               OpBranchConditional %146 %150 %149
+        %150 = OpLabel
+        %151 = OpLoad %int %i
+               OpStore %indexable_1 %143
+        %152 = OpAccessChain %_ptr_Function_float %indexable_1 %151 %uint_0
+        %153 = OpLoad %float %152
+        %154 = OpLoad %int %i
+               OpStore %indexable_2 %143
+        %155 = OpAccessChain %_ptr_Function_float %indexable_2 %154 %uint_1
+        %156 = OpLoad %float %155
+        %157 = OpLoad %int %i
+               OpStore %indexable_3 %174
+        %175 = OpConvertFToS %int %153
+        %176 = OpConvertFToS %int %156
+        %177 = OpIMul %int %175 %176
+        %179 = OpIMul %int %157 %int_9
+        %180 = OpIAdd %int %177 %179
+        %182 = OpIAdd %int %180 %int_11
+        %184 = OpSMod %int %182 %int_16
+        %185 = OpAccessChain %_ptr_Function_v4float %indexable_3 %184
+        %186 = OpLoad %v4float %185
+               OpStore %res %186
+               OpBranch %149
+        %149 = OpLabel
+               OpBranch %116
+        %116 = OpLabel
+        %187 = OpLoad %int %i
+        %189 = OpIAdd %int %187 %int_1
+               OpStore %i %189
+               OpBranch %114
+        %115 = OpLabel
+        %190 = OpLoad %v4float %res
+               OpReturnValue %190
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %191
+        %194 = OpLabel
+        %lin = OpVariable %_ptr_Function_v2float Function %97
+    %param_2 = OpVariable %_ptr_Function_v2float Function %97
+        %197 = OpLoad %v4float %gl_FragCoord
+        %199 = OpAccessChain %_ptr_Uniform_v2float %x_20 %uint_0
+        %200 = OpLoad %v2float %199
+        %201 = OpCompositeExtract %float %197 0
+        %202 = OpCompositeExtract %float %197 1
+        %203 = OpCompositeConstruct %v2float %201 %202
+        %204 = OpFDiv %v2float %203 %200
+               OpStore %lin %204
+        %205 = OpLoad %v2float %lin
+        %209 = OpVectorTimesScalar %v2float %205 %float_32
+        %206 = OpExtInst %v2float %207 Floor %209
+               OpStore %lin %206
+        %210 = OpLoad %v2float %lin
+               OpStore %param_2 %210
+        %211 = OpFunctionCall %v4float %match_vf2_ %param_2
+               OpStore %x_GLF_color %211
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %213
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %217 = OpLabel
+        %218 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %218
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %191
+        %220 = OpLabel
+        %221 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %221
+        %222 = OpFunctionCall %void %main_1
+        %224 = OpLoad %v4float %x_GLF_color
+        %225 = OpCompositeConstruct %main_out %224
+        %223 = OpFunctionCall %void %tint_symbol_3 %225
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..f70d557
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-declare-bvec4/1.wgsl.expected.wgsl
@@ -0,0 +1,114 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_20 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+var<private> index : i32;
+
+var<private> state : array<i32, 16>;
+
+fn collision_vf2_vf4_(pos : ptr<function, vec2<f32>>, quad : ptr<function, vec4<f32>>) -> bool {
+  var x_116 : vec4<bool> = vec4<bool>(false, false, false, false);
+  let x_118 : f32 = (*(pos)).x;
+  let x_120 : f32 = (*(quad)).x;
+  if ((x_118 < x_120)) {
+    return false;
+  }
+  let x_125 : f32 = (*(pos)).y;
+  let x_127 : f32 = (*(quad)).y;
+  if ((x_125 < x_127)) {
+    return false;
+  }
+  let x_132 : f32 = (*(pos)).x;
+  let x_134 : f32 = (*(quad)).x;
+  let x_136 : f32 = (*(quad)).z;
+  if ((x_132 > (x_134 + x_136))) {
+    return false;
+  }
+  let x_142 : f32 = (*(pos)).y;
+  let x_144 : f32 = (*(quad)).y;
+  let x_146 : f32 = (*(quad)).w;
+  if ((x_142 > (x_144 + x_146))) {
+    return false;
+  }
+  return true;
+}
+
+fn match_vf2_(pos_1 : ptr<function, vec2<f32>>) -> vec4<f32> {
+  var res : vec4<f32>;
+  var i : i32;
+  var param : vec2<f32>;
+  var param_1 : vec4<f32>;
+  var indexable : array<vec4<f32>, 8>;
+  var indexable_1 : array<vec4<f32>, 8>;
+  var indexable_2 : array<vec4<f32>, 8>;
+  var indexable_3 : array<vec4<f32>, 16>;
+  res = vec4<f32>(0.5, 0.5, 1.0, 1.0);
+  i = 0;
+  loop {
+    let x_156 : i32 = i;
+    if ((x_156 < 8)) {
+    } else {
+      break;
+    }
+    let x_159 : i32 = i;
+    let x_160 : vec2<f32> = *(pos_1);
+    param = x_160;
+    indexable = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+    let x_162 : vec4<f32> = indexable[x_159];
+    param_1 = x_162;
+    let x_163 : bool = collision_vf2_vf4_(&(param), &(param_1));
+    if (x_163) {
+      let x_166 : i32 = i;
+      indexable_1 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+      let x_168 : f32 = indexable_1[x_166].x;
+      let x_170 : i32 = i;
+      indexable_2 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+      let x_172 : f32 = indexable_2[x_170].y;
+      let x_175 : i32 = i;
+      indexable_3 = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+      let x_181 : vec4<f32> = indexable_3[((((i32(x_168) * i32(x_172)) + (x_175 * 9)) + 11) % 16)];
+      res = x_181;
+    }
+
+    continuing {
+      let x_182 : i32 = i;
+      i = (x_182 + 1);
+    }
+  }
+  let x_184 : vec4<f32> = res;
+  return x_184;
+}
+
+fn main_1() {
+  var lin : vec2<f32>;
+  var param_2 : vec2<f32>;
+  let x_105 : vec4<f32> = gl_FragCoord;
+  let x_108 : vec2<f32> = x_20.resolution;
+  lin = (vec2<f32>(x_105.x, x_105.y) / x_108);
+  let x_110 : vec2<f32> = lin;
+  lin = floor((x_110 * 32.0));
+  let x_113 : vec2<f32> = lin;
+  param_2 = x_113;
+  let x_114 : vec4<f32> = match_vf2_(&(param_2));
+  x_GLF_color = x_114;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/0-opt.spvasm
new file mode 100644
index 0000000..a8c4c53
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/0-opt.spvasm
@@ -0,0 +1,565 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %merge_i1_i1_i1_ "merge(i1;i1;i1;"
+               OpName %from "from"
+               OpName %mid "mid"
+               OpName %to "to"
+               OpName %mergeSort_ "mergeSort("
+               OpName %k "k"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %data "data"
+               OpName %temp "temp"
+               OpName %i_0 "i"
+               OpName %low "low"
+               OpName %high "high"
+               OpName %m "m"
+               OpName %i_1 "i"
+               OpName %from_0 "from"
+               OpName %mid_0 "mid"
+               OpName %to_0 "to"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %param_1 "param"
+               OpName %i_2 "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %j_0 "j"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %grey "grey"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "resolution"
+               OpName %__0 ""
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+       %void = OpTypeVoid
+         %34 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %37 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int %_ptr_Function_int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Private__arr_int_uint_10 = OpTypePointer Private %_arr_int_uint_10
+       %data = OpVariable %_ptr_Private__arr_int_uint_10 Private
+%_ptr_Private_int = OpTypePointer Private %int
+       %temp = OpVariable %_ptr_Private__arr_int_uint_10 Private
+     %int_10 = OpConstant %int 10
+      %int_0 = OpConstant %int 0
+      %int_9 = OpConstant %int 9
+      %int_2 = OpConstant %int 2
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_4 = OpConstant %int 4
+      %int_3 = OpConstant %int 3
+     %int_n1 = OpConstant %int -1
+     %int_n2 = OpConstant %int -2
+     %int_n3 = OpConstant %int -3
+     %int_n4 = OpConstant %int -4
+     %int_n5 = OpConstant %int -5
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+     %int_30 = OpConstant %int 30
+%_ptr_Function_float = OpTypePointer Function %float
+  %float_0_5 = OpConstant %float 0.5
+   %float_10 = OpConstant %float 10
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %v3float = OpTypeVector %float 3
+    %float_1 = OpConstant %float 1
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+       %main = OpFunction %void None %34
+         %85 = OpLabel
+        %i_2 = OpVariable %_ptr_Function_int Function
+        %j_0 = OpVariable %_ptr_Function_int Function
+       %grey = OpVariable %_ptr_Function_float Function
+         %86 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %87 = OpLoad %float %86
+         %88 = OpConvertFToS %int %87
+               OpStore %i_2 %88
+               OpBranch %89
+         %89 = OpLabel
+               OpLoopMerge %90 %91 None
+               OpBranch %92
+         %92 = OpLabel
+         %93 = OpLoad %int %i_2
+               OpSelectionMerge %94 None
+               OpSwitch %93 %94 0 %95 1 %96 2 %97 3 %98 4 %99 5 %100 6 %101 7 %102 8 %103 9 %104
+         %95 = OpLabel
+        %105 = OpLoad %int %i_2
+        %106 = OpAccessChain %_ptr_Private_int %data %105
+               OpStore %106 %int_4
+               OpBranch %94
+         %96 = OpLabel
+        %107 = OpLoad %int %i_2
+        %108 = OpAccessChain %_ptr_Private_int %data %107
+               OpStore %108 %int_3
+               OpBranch %94
+         %97 = OpLabel
+        %109 = OpLoad %int %i_2
+        %110 = OpAccessChain %_ptr_Private_int %data %109
+               OpStore %110 %int_2
+               OpBranch %94
+         %98 = OpLabel
+        %111 = OpLoad %int %i_2
+        %112 = OpAccessChain %_ptr_Private_int %data %111
+               OpStore %112 %int_1
+               OpBranch %94
+         %99 = OpLabel
+        %113 = OpLoad %int %i_2
+        %114 = OpAccessChain %_ptr_Private_int %data %113
+               OpStore %114 %int_0
+               OpBranch %94
+        %100 = OpLabel
+        %115 = OpLoad %int %i_2
+        %116 = OpAccessChain %_ptr_Private_int %data %115
+               OpStore %116 %int_n1
+               OpBranch %94
+        %101 = OpLabel
+        %117 = OpLoad %int %i_2
+        %118 = OpAccessChain %_ptr_Private_int %data %117
+               OpStore %118 %int_n2
+               OpBranch %94
+        %102 = OpLabel
+        %119 = OpLoad %int %i_2
+        %120 = OpAccessChain %_ptr_Private_int %data %119
+               OpStore %120 %int_n3
+               OpBranch %94
+        %103 = OpLabel
+        %121 = OpLoad %int %i_2
+        %122 = OpAccessChain %_ptr_Private_int %data %121
+               OpStore %122 %int_n4
+               OpBranch %94
+        %104 = OpLabel
+        %123 = OpLoad %int %i_2
+        %124 = OpAccessChain %_ptr_Private_int %data %123
+               OpStore %124 %int_n5
+               OpBranch %94
+         %94 = OpLabel
+        %125 = OpLoad %int %i_2
+        %126 = OpIAdd %int %125 %int_1
+               OpStore %i_2 %126
+               OpBranch %91
+         %91 = OpLabel
+        %127 = OpLoad %int %i_2
+        %128 = OpSLessThan %bool %127 %int_10
+               OpBranchConditional %128 %89 %90
+         %90 = OpLabel
+               OpStore %j_0 %int_0
+               OpBranch %129
+        %129 = OpLabel
+               OpLoopMerge %130 %131 None
+               OpBranch %132
+        %132 = OpLabel
+        %133 = OpLoad %int %j_0
+        %134 = OpSLessThan %bool %133 %int_10
+               OpBranchConditional %134 %135 %130
+        %135 = OpLabel
+        %136 = OpLoad %int %j_0
+        %137 = OpLoad %int %j_0
+        %138 = OpAccessChain %_ptr_Private_int %data %137
+        %139 = OpLoad %int %138
+        %140 = OpAccessChain %_ptr_Private_int %temp %136
+               OpStore %140 %139
+               OpBranch %131
+        %131 = OpLabel
+        %141 = OpLoad %int %j_0
+        %142 = OpIAdd %int %141 %int_1
+               OpStore %j_0 %142
+               OpBranch %129
+        %130 = OpLabel
+        %143 = OpFunctionCall %void %mergeSort_
+        %144 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %145 = OpLoad %float %144
+        %146 = OpConvertFToS %int %145
+        %147 = OpSLessThan %bool %146 %int_30
+               OpSelectionMerge %148 None
+               OpBranchConditional %147 %149 %150
+        %149 = OpLabel
+        %151 = OpAccessChain %_ptr_Private_int %data %int_0
+        %152 = OpLoad %int %151
+        %153 = OpConvertSToF %float %152
+        %154 = OpFDiv %float %153 %float_10
+        %155 = OpFAdd %float %float_0_5 %154
+               OpStore %grey %155
+               OpBranch %148
+        %150 = OpLabel
+        %156 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %157 = OpLoad %float %156
+        %158 = OpConvertFToS %int %157
+        %159 = OpSLessThan %bool %158 %int_60
+               OpSelectionMerge %160 None
+               OpBranchConditional %159 %161 %162
+        %161 = OpLabel
+        %163 = OpAccessChain %_ptr_Private_int %data %int_1
+        %164 = OpLoad %int %163
+        %165 = OpConvertSToF %float %164
+        %166 = OpFDiv %float %165 %float_10
+        %167 = OpFAdd %float %float_0_5 %166
+               OpStore %grey %167
+               OpBranch %160
+        %162 = OpLabel
+        %168 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %169 = OpLoad %float %168
+        %170 = OpConvertFToS %int %169
+        %171 = OpSLessThan %bool %170 %int_90
+               OpSelectionMerge %172 None
+               OpBranchConditional %171 %173 %174
+        %173 = OpLabel
+        %175 = OpAccessChain %_ptr_Private_int %data %int_2
+        %176 = OpLoad %int %175
+        %177 = OpConvertSToF %float %176
+        %178 = OpFDiv %float %177 %float_10
+        %179 = OpFAdd %float %float_0_5 %178
+               OpStore %grey %179
+               OpBranch %172
+        %174 = OpLabel
+        %180 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %181 = OpLoad %float %180
+        %182 = OpConvertFToS %int %181
+        %183 = OpSLessThan %bool %182 %int_120
+               OpSelectionMerge %184 None
+               OpBranchConditional %183 %185 %186
+        %185 = OpLabel
+        %187 = OpAccessChain %_ptr_Private_int %data %int_3
+        %188 = OpLoad %int %187
+        %189 = OpConvertSToF %float %188
+        %190 = OpFDiv %float %189 %float_10
+        %191 = OpFAdd %float %float_0_5 %190
+               OpStore %grey %191
+               OpBranch %184
+        %186 = OpLabel
+        %192 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %193 = OpLoad %float %192
+        %194 = OpConvertFToS %int %193
+        %195 = OpSLessThan %bool %194 %int_150
+               OpSelectionMerge %196 None
+               OpBranchConditional %195 %197 %198
+        %197 = OpLabel
+               OpKill
+        %198 = OpLabel
+        %199 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %200 = OpLoad %float %199
+        %201 = OpConvertFToS %int %200
+        %202 = OpSLessThan %bool %201 %int_180
+               OpSelectionMerge %203 None
+               OpBranchConditional %202 %204 %205
+        %204 = OpLabel
+        %206 = OpAccessChain %_ptr_Private_int %data %int_5
+        %207 = OpLoad %int %206
+        %208 = OpConvertSToF %float %207
+        %209 = OpFDiv %float %208 %float_10
+        %210 = OpFAdd %float %float_0_5 %209
+               OpStore %grey %210
+               OpBranch %203
+        %205 = OpLabel
+        %211 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %212 = OpLoad %float %211
+        %213 = OpConvertFToS %int %212
+        %214 = OpSLessThan %bool %213 %int_210
+               OpSelectionMerge %215 None
+               OpBranchConditional %214 %216 %217
+        %216 = OpLabel
+        %218 = OpAccessChain %_ptr_Private_int %data %int_6
+        %219 = OpLoad %int %218
+        %220 = OpConvertSToF %float %219
+        %221 = OpFDiv %float %220 %float_10
+        %222 = OpFAdd %float %float_0_5 %221
+               OpStore %grey %222
+               OpBranch %215
+        %217 = OpLabel
+        %223 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %224 = OpLoad %float %223
+        %225 = OpConvertFToS %int %224
+        %226 = OpSLessThan %bool %225 %int_240
+               OpSelectionMerge %227 None
+               OpBranchConditional %226 %228 %229
+        %228 = OpLabel
+        %230 = OpAccessChain %_ptr_Private_int %data %int_7
+        %231 = OpLoad %int %230
+        %232 = OpConvertSToF %float %231
+        %233 = OpFDiv %float %232 %float_10
+        %234 = OpFAdd %float %float_0_5 %233
+               OpStore %grey %234
+               OpBranch %227
+        %229 = OpLabel
+        %235 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %236 = OpLoad %float %235
+        %237 = OpConvertFToS %int %236
+        %238 = OpSLessThan %bool %237 %int_270
+               OpSelectionMerge %239 None
+               OpBranchConditional %238 %240 %241
+        %240 = OpLabel
+        %242 = OpAccessChain %_ptr_Private_int %data %int_8
+        %243 = OpLoad %int %242
+        %244 = OpConvertSToF %float %243
+        %245 = OpFDiv %float %244 %float_10
+        %246 = OpFAdd %float %float_0_5 %245
+               OpStore %grey %246
+               OpBranch %239
+        %241 = OpLabel
+               OpKill
+        %239 = OpLabel
+               OpBranch %227
+        %227 = OpLabel
+               OpBranch %215
+        %215 = OpLabel
+               OpBranch %203
+        %203 = OpLabel
+               OpBranch %196
+        %196 = OpLabel
+               OpBranch %184
+        %184 = OpLabel
+               OpBranch %172
+        %172 = OpLabel
+               OpBranch %160
+        %160 = OpLabel
+               OpBranch %148
+        %148 = OpLabel
+        %247 = OpLoad %float %grey
+        %248 = OpCompositeConstruct %v3float %247 %247 %247
+        %249 = OpCompositeExtract %float %248 0
+        %250 = OpCompositeExtract %float %248 1
+        %251 = OpCompositeExtract %float %248 2
+        %252 = OpCompositeConstruct %v4float %249 %250 %251 %float_1
+               OpStore %_GLF_color %252
+               OpReturn
+               OpFunctionEnd
+%merge_i1_i1_i1_ = OpFunction %void None %37
+       %from = OpFunctionParameter %_ptr_Function_int
+        %mid = OpFunctionParameter %_ptr_Function_int
+         %to = OpFunctionParameter %_ptr_Function_int
+        %253 = OpLabel
+          %k = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+          %j = OpVariable %_ptr_Function_int Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+        %254 = OpLoad %int %from
+               OpStore %k %254
+        %255 = OpLoad %int %from
+               OpStore %i %255
+        %256 = OpLoad %int %mid
+        %257 = OpIAdd %int %256 %int_1
+               OpStore %j %257
+               OpBranch %258
+        %258 = OpLabel
+               OpLoopMerge %259 %260 None
+               OpBranch %261
+        %261 = OpLabel
+        %262 = OpLoad %int %i
+        %263 = OpLoad %int %mid
+        %264 = OpSLessThanEqual %bool %262 %263
+        %265 = OpLoad %int %j
+        %266 = OpLoad %int %to
+        %267 = OpSLessThanEqual %bool %265 %266
+        %268 = OpLogicalAnd %bool %264 %267
+               OpBranchConditional %268 %269 %259
+        %269 = OpLabel
+        %270 = OpLoad %int %i
+        %271 = OpAccessChain %_ptr_Private_int %data %270
+        %272 = OpLoad %int %271
+        %273 = OpLoad %int %j
+        %274 = OpAccessChain %_ptr_Private_int %data %273
+        %275 = OpLoad %int %274
+        %276 = OpSLessThan %bool %272 %275
+               OpSelectionMerge %277 None
+               OpBranchConditional %276 %278 %279
+        %278 = OpLabel
+        %280 = OpLoad %int %k
+        %281 = OpIAdd %int %280 %int_1
+               OpStore %k %281
+        %282 = OpLoad %int %i
+        %283 = OpIAdd %int %282 %int_1
+               OpStore %i %283
+        %284 = OpAccessChain %_ptr_Private_int %data %282
+        %285 = OpLoad %int %284
+        %286 = OpAccessChain %_ptr_Private_int %temp %280
+               OpStore %286 %285
+               OpBranch %277
+        %279 = OpLabel
+        %287 = OpLoad %int %k
+        %288 = OpIAdd %int %287 %int_1
+               OpStore %k %288
+        %289 = OpLoad %int %j
+        %290 = OpIAdd %int %289 %int_1
+               OpStore %j %290
+        %291 = OpAccessChain %_ptr_Private_int %data %289
+        %292 = OpLoad %int %291
+        %293 = OpAccessChain %_ptr_Private_int %temp %287
+               OpStore %293 %292
+               OpBranch %277
+        %277 = OpLabel
+               OpBranch %260
+        %260 = OpLabel
+               OpBranch %258
+        %259 = OpLabel
+               OpBranch %294
+        %294 = OpLabel
+               OpLoopMerge %295 %296 None
+               OpBranch %297
+        %297 = OpLabel
+        %298 = OpLoad %int %i
+        %299 = OpSLessThan %bool %298 %int_10
+        %300 = OpLoad %int %i
+        %301 = OpLoad %int %mid
+        %302 = OpSLessThanEqual %bool %300 %301
+        %303 = OpLogicalAnd %bool %299 %302
+               OpBranchConditional %303 %304 %295
+        %304 = OpLabel
+        %305 = OpLoad %int %k
+        %306 = OpIAdd %int %305 %int_1
+               OpStore %k %306
+        %307 = OpLoad %int %i
+        %308 = OpIAdd %int %307 %int_1
+               OpStore %i %308
+        %309 = OpAccessChain %_ptr_Private_int %data %307
+        %310 = OpLoad %int %309
+        %311 = OpAccessChain %_ptr_Private_int %temp %305
+               OpStore %311 %310
+               OpBranch %296
+        %296 = OpLabel
+               OpBranch %294
+        %295 = OpLabel
+        %312 = OpLoad %int %from
+               OpStore %i_0 %312
+               OpBranch %313
+        %313 = OpLabel
+               OpLoopMerge %314 %315 None
+               OpBranch %316
+        %316 = OpLabel
+        %317 = OpLoad %int %i_0
+        %318 = OpLoad %int %to
+        %319 = OpSLessThanEqual %bool %317 %318
+               OpBranchConditional %319 %320 %314
+        %320 = OpLabel
+        %321 = OpLoad %int %i_0
+        %322 = OpLoad %int %i_0
+        %323 = OpAccessChain %_ptr_Private_int %temp %322
+        %324 = OpLoad %int %323
+        %325 = OpAccessChain %_ptr_Private_int %data %321
+               OpStore %325 %324
+               OpBranch %315
+        %315 = OpLabel
+        %326 = OpLoad %int %i_0
+        %327 = OpIAdd %int %326 %int_1
+               OpStore %i_0 %327
+               OpBranch %313
+        %314 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %mergeSort_ = OpFunction %void None %34
+        %328 = OpLabel
+        %low = OpVariable %_ptr_Function_int Function
+       %high = OpVariable %_ptr_Function_int Function
+          %m = OpVariable %_ptr_Function_int Function
+        %i_1 = OpVariable %_ptr_Function_int Function
+     %from_0 = OpVariable %_ptr_Function_int Function
+      %mid_0 = OpVariable %_ptr_Function_int Function
+       %to_0 = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_int Function
+    %param_0 = OpVariable %_ptr_Function_int Function
+    %param_1 = OpVariable %_ptr_Function_int Function
+               OpStore %low %int_0
+               OpStore %high %int_9
+               OpStore %m %int_1
+               OpBranch %329
+        %329 = OpLabel
+               OpLoopMerge %330 %331 None
+               OpBranch %332
+        %332 = OpLabel
+        %333 = OpLoad %int %m
+        %334 = OpLoad %int %high
+        %335 = OpSLessThanEqual %bool %333 %334
+               OpBranchConditional %335 %336 %330
+        %336 = OpLabel
+        %337 = OpLoad %int %low
+               OpStore %i_1 %337
+               OpBranch %338
+        %338 = OpLabel
+               OpLoopMerge %339 %340 None
+               OpBranch %341
+        %341 = OpLabel
+        %342 = OpLoad %int %i_1
+        %343 = OpLoad %int %high
+        %344 = OpSLessThan %bool %342 %343
+               OpBranchConditional %344 %345 %339
+        %345 = OpLabel
+        %346 = OpLoad %int %i_1
+               OpStore %from_0 %346
+        %347 = OpLoad %int %i_1
+        %348 = OpLoad %int %m
+        %349 = OpIAdd %int %347 %348
+        %350 = OpISub %int %349 %int_1
+               OpStore %mid_0 %350
+        %351 = OpLoad %int %i_1
+        %352 = OpLoad %int %m
+        %353 = OpIMul %int %int_2 %352
+        %354 = OpIAdd %int %351 %353
+        %355 = OpISub %int %354 %int_1
+        %356 = OpLoad %int %high
+        %357 = OpExtInst %int %1 SMin %355 %356
+               OpStore %to_0 %357
+        %358 = OpLoad %int %from_0
+               OpStore %param %358
+        %359 = OpLoad %int %mid_0
+               OpStore %param_0 %359
+        %360 = OpLoad %int %to_0
+               OpStore %param_1 %360
+        %361 = OpFunctionCall %void %merge_i1_i1_i1_ %param %param_0 %param_1
+               OpBranch %340
+        %340 = OpLabel
+        %362 = OpLoad %int %m
+        %363 = OpIMul %int %int_2 %362
+        %364 = OpLoad %int %i_1
+        %365 = OpIAdd %int %364 %363
+               OpStore %i_1 %365
+               OpBranch %338
+        %339 = OpLabel
+               OpBranch %331
+        %331 = OpLabel
+        %366 = OpLoad %int %m
+        %367 = OpIMul %int %int_2 %366
+               OpStore %m %367
+               OpBranch %329
+        %330 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..be184c8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,271 @@
+static int data[10] = (int[10])0;
+static int temp[10] = (int[10])0;
+cbuffer cbuffer_x_28 : register(b0, space0) {
+  uint4 x_28[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_32 : register(b1, space0) {
+  uint4 x_32[1];
+};
+
+void merge_i1_i1_i1_(inout int from, inout int mid, inout int to) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  const int x_254 = from;
+  k = x_254;
+  const int x_255 = from;
+  i = x_255;
+  const int x_256 = mid;
+  j = (x_256 + 1);
+  while (true) {
+    const int x_262 = i;
+    const int x_263 = mid;
+    const int x_265 = j;
+    const int x_266 = to;
+    bool tint_tmp = (x_262 <= x_263);
+    if (tint_tmp) {
+      tint_tmp = (x_265 <= x_266);
+    }
+    if ((tint_tmp)) {
+    } else {
+      break;
+    }
+    const int x_272 = data[i];
+    const int x_275 = data[j];
+    if ((x_272 < x_275)) {
+      const int x_280 = k;
+      k = (x_280 + 1);
+      const int x_282 = i;
+      i = (x_282 + 1);
+      const int x_285 = data[x_282];
+      temp[x_280] = x_285;
+    } else {
+      const int x_287 = k;
+      k = (x_287 + 1);
+      const int x_289 = j;
+      j = (x_289 + 1);
+      const int x_292 = data[x_289];
+      temp[x_287] = x_292;
+    }
+  }
+  while (true) {
+    const int x_298 = i;
+    const int x_300 = i;
+    const int x_301 = mid;
+    bool tint_tmp_1 = (x_298 < 10);
+    if (tint_tmp_1) {
+      tint_tmp_1 = (x_300 <= x_301);
+    }
+    if ((tint_tmp_1)) {
+    } else {
+      break;
+    }
+    const int x_305 = k;
+    k = (x_305 + 1);
+    const int x_307 = i;
+    i = (x_307 + 1);
+    const int x_310 = data[x_307];
+    temp[x_305] = x_310;
+  }
+  const int x_312 = from;
+  i_1 = x_312;
+  while (true) {
+    const int x_317 = i_1;
+    const int x_318 = to;
+    if ((x_317 <= x_318)) {
+    } else {
+      break;
+    }
+    const int x_321 = i_1;
+    const int x_324 = temp[i_1];
+    data[x_321] = x_324;
+    {
+      i_1 = (i_1 + 1);
+    }
+  }
+  return;
+}
+
+void mergeSort_() {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  {
+    for(; (m <= high); m = (2 * m)) {
+      i_2 = low;
+      {
+        for(; (i_2 < high); i_2 = (i_2 + (2 * m))) {
+          from_1 = i_2;
+          mid_1 = ((i_2 + m) - 1);
+          to_1 = min(((i_2 + (2 * m)) - 1), high);
+          param = from_1;
+          param_1 = mid_1;
+          param_2 = to_1;
+          merge_i1_i1_i1_(param, param_1, param_2);
+        }
+      }
+    }
+  }
+  return;
+}
+
+void main_1() {
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  const float x_87 = asfloat(x_28[0].x);
+  i_3 = int(x_87);
+  while (true) {
+    switch(i_3) {
+      case 9: {
+        data[i_3] = -5;
+        break;
+      }
+      case 8: {
+        data[i_3] = -4;
+        break;
+      }
+      case 7: {
+        data[i_3] = -3;
+        break;
+      }
+      case 6: {
+        data[i_3] = -2;
+        break;
+      }
+      case 5: {
+        data[i_3] = -1;
+        break;
+      }
+      case 4: {
+        data[i_3] = 0;
+        break;
+      }
+      case 3: {
+        data[i_3] = 1;
+        break;
+      }
+      case 2: {
+        data[i_3] = 2;
+        break;
+      }
+      case 1: {
+        data[i_3] = 3;
+        break;
+      }
+      case 0: {
+        data[i_3] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    i_3 = (i_3 + 1);
+    {
+      if ((i_3 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  {
+    for(; (j_1 < 10); j_1 = (j_1 + 1)) {
+      const int x_136 = j_1;
+      const int x_139 = data[j_1];
+      temp[x_136] = x_139;
+    }
+  }
+  mergeSort_();
+  const float x_145 = gl_FragCoord.y;
+  if ((int(x_145) < 30)) {
+    const int x_152 = data[0];
+    grey = (0.5f + (float(x_152) / 10.0f));
+  } else {
+    const float x_157 = gl_FragCoord.y;
+    if ((int(x_157) < 60)) {
+      const int x_164 = data[1];
+      grey = (0.5f + (float(x_164) / 10.0f));
+    } else {
+      const float x_169 = gl_FragCoord.y;
+      if ((int(x_169) < 90)) {
+        const int x_176 = data[2];
+        grey = (0.5f + (float(x_176) / 10.0f));
+      } else {
+        const float x_181 = gl_FragCoord.y;
+        if ((int(x_181) < 120)) {
+          const int x_188 = data[3];
+          grey = (0.5f + (float(x_188) / 10.0f));
+        } else {
+          const float x_193 = gl_FragCoord.y;
+          if ((int(x_193) < 150)) {
+            discard;
+          } else {
+            const float x_200 = gl_FragCoord.y;
+            if ((int(x_200) < 180)) {
+              const int x_207 = data[5];
+              grey = (0.5f + (float(x_207) / 10.0f));
+            } else {
+              const float x_212 = gl_FragCoord.y;
+              if ((int(x_212) < 210)) {
+                const int x_219 = data[6];
+                grey = (0.5f + (float(x_219) / 10.0f));
+              } else {
+                const float x_224 = gl_FragCoord.y;
+                if ((int(x_224) < 240)) {
+                  const int x_231 = data[7];
+                  grey = (0.5f + (float(x_231) / 10.0f));
+                } else {
+                  const float x_236 = gl_FragCoord.y;
+                  if ((int(x_236) < 270)) {
+                    const int x_243 = data[8];
+                    grey = (0.5f + (float(x_243) / 10.0f));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  const float x_247 = grey;
+  const float3 x_248 = float3(x_247, x_247, x_247);
+  x_GLF_color = float4(x_248.x, x_248.y, x_248.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..6e7adb4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/0-opt.spvasm.expected.msl
@@ -0,0 +1,317 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct buf1 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void merge_i1_i1_i1_(thread int* const from, thread int* const mid, thread int* const to, thread tint_array_wrapper* const tint_symbol_5, thread tint_array_wrapper* const tint_symbol_6) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  int const x_254 = *(from);
+  k = x_254;
+  int const x_255 = *(from);
+  i = x_255;
+  int const x_256 = *(mid);
+  j = (x_256 + 1);
+  while (true) {
+    int const x_262 = i;
+    int const x_263 = *(mid);
+    int const x_265 = j;
+    int const x_266 = *(to);
+    if (((x_262 <= x_263) && (x_265 <= x_266))) {
+    } else {
+      break;
+    }
+    int const x_270 = i;
+    int const x_272 = (*(tint_symbol_5)).arr[x_270];
+    int const x_273 = j;
+    int const x_275 = (*(tint_symbol_5)).arr[x_273];
+    if ((x_272 < x_275)) {
+      int const x_280 = k;
+      k = (x_280 + 1);
+      int const x_282 = i;
+      i = (x_282 + 1);
+      int const x_285 = (*(tint_symbol_5)).arr[x_282];
+      (*(tint_symbol_6)).arr[x_280] = x_285;
+    } else {
+      int const x_287 = k;
+      k = (x_287 + 1);
+      int const x_289 = j;
+      j = (x_289 + 1);
+      int const x_292 = (*(tint_symbol_5)).arr[x_289];
+      (*(tint_symbol_6)).arr[x_287] = x_292;
+    }
+  }
+  while (true) {
+    int const x_298 = i;
+    int const x_300 = i;
+    int const x_301 = *(mid);
+    if (((x_298 < 10) && (x_300 <= x_301))) {
+    } else {
+      break;
+    }
+    int const x_305 = k;
+    k = (x_305 + 1);
+    int const x_307 = i;
+    i = (x_307 + 1);
+    int const x_310 = (*(tint_symbol_5)).arr[x_307];
+    (*(tint_symbol_6)).arr[x_305] = x_310;
+  }
+  int const x_312 = *(from);
+  i_1 = x_312;
+  while (true) {
+    int const x_317 = i_1;
+    int const x_318 = *(to);
+    if ((x_317 <= x_318)) {
+    } else {
+      break;
+    }
+    int const x_321 = i_1;
+    int const x_322 = i_1;
+    int const x_324 = (*(tint_symbol_6)).arr[x_322];
+    (*(tint_symbol_5)).arr[x_321] = x_324;
+    {
+      int const x_326 = i_1;
+      i_1 = (x_326 + 1);
+    }
+  }
+  return;
+}
+
+void mergeSort_(thread tint_array_wrapper* const tint_symbol_7, thread tint_array_wrapper* const tint_symbol_8) {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  while (true) {
+    int const x_333 = m;
+    int const x_334 = high;
+    if ((x_333 <= x_334)) {
+    } else {
+      break;
+    }
+    int const x_337 = low;
+    i_2 = x_337;
+    while (true) {
+      int const x_342 = i_2;
+      int const x_343 = high;
+      if ((x_342 < x_343)) {
+      } else {
+        break;
+      }
+      int const x_346 = i_2;
+      from_1 = x_346;
+      int const x_347 = i_2;
+      int const x_348 = m;
+      mid_1 = ((x_347 + x_348) - 1);
+      int const x_351 = i_2;
+      int const x_352 = m;
+      int const x_356 = high;
+      to_1 = min(((x_351 + (2 * x_352)) - 1), x_356);
+      int const x_358 = from_1;
+      param = x_358;
+      int const x_359 = mid_1;
+      param_1 = x_359;
+      int const x_360 = to_1;
+      param_2 = x_360;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2), tint_symbol_7, tint_symbol_8);
+      {
+        int const x_362 = m;
+        int const x_364 = i_2;
+        i_2 = (x_364 + (2 * x_362));
+      }
+    }
+    {
+      int const x_366 = m;
+      m = (2 * x_366);
+    }
+  }
+  return;
+}
+
+void main_1(constant buf0& x_28, thread tint_array_wrapper* const tint_symbol_9, thread tint_array_wrapper* const tint_symbol_10, thread float4* const tint_symbol_11, thread float4* const tint_symbol_12) {
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  float const x_87 = x_28.injectionSwitch.x;
+  i_3 = int(x_87);
+  while (true) {
+    int const x_93 = i_3;
+    switch(x_93) {
+      case 9: {
+        int const x_123 = i_3;
+        (*(tint_symbol_9)).arr[x_123] = -5;
+        break;
+      }
+      case 8: {
+        int const x_121 = i_3;
+        (*(tint_symbol_9)).arr[x_121] = -4;
+        break;
+      }
+      case 7: {
+        int const x_119 = i_3;
+        (*(tint_symbol_9)).arr[x_119] = -3;
+        break;
+      }
+      case 6: {
+        int const x_117 = i_3;
+        (*(tint_symbol_9)).arr[x_117] = -2;
+        break;
+      }
+      case 5: {
+        int const x_115 = i_3;
+        (*(tint_symbol_9)).arr[x_115] = -1;
+        break;
+      }
+      case 4: {
+        int const x_113 = i_3;
+        (*(tint_symbol_9)).arr[x_113] = 0;
+        break;
+      }
+      case 3: {
+        int const x_111 = i_3;
+        (*(tint_symbol_9)).arr[x_111] = 1;
+        break;
+      }
+      case 2: {
+        int const x_109 = i_3;
+        (*(tint_symbol_9)).arr[x_109] = 2;
+        break;
+      }
+      case 1: {
+        int const x_107 = i_3;
+        (*(tint_symbol_9)).arr[x_107] = 3;
+        break;
+      }
+      case 0: {
+        int const x_105 = i_3;
+        (*(tint_symbol_9)).arr[x_105] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    int const x_125 = i_3;
+    i_3 = (x_125 + 1);
+    {
+      int const x_127 = i_3;
+      if ((x_127 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  while (true) {
+    int const x_133 = j_1;
+    if ((x_133 < 10)) {
+    } else {
+      break;
+    }
+    int const x_136 = j_1;
+    int const x_137 = j_1;
+    int const x_139 = (*(tint_symbol_9)).arr[x_137];
+    (*(tint_symbol_10)).arr[x_136] = x_139;
+    {
+      int const x_141 = j_1;
+      j_1 = (x_141 + 1);
+    }
+  }
+  mergeSort_(tint_symbol_9, tint_symbol_10);
+  float const x_145 = (*(tint_symbol_11)).y;
+  if ((int(x_145) < 30)) {
+    int const x_152 = (*(tint_symbol_9)).arr[0];
+    grey = (0.5f + (float(x_152) / 10.0f));
+  } else {
+    float const x_157 = (*(tint_symbol_11)).y;
+    if ((int(x_157) < 60)) {
+      int const x_164 = (*(tint_symbol_9)).arr[1];
+      grey = (0.5f + (float(x_164) / 10.0f));
+    } else {
+      float const x_169 = (*(tint_symbol_11)).y;
+      if ((int(x_169) < 90)) {
+        int const x_176 = (*(tint_symbol_9)).arr[2];
+        grey = (0.5f + (float(x_176) / 10.0f));
+      } else {
+        float const x_181 = (*(tint_symbol_11)).y;
+        if ((int(x_181) < 120)) {
+          int const x_188 = (*(tint_symbol_9)).arr[3];
+          grey = (0.5f + (float(x_188) / 10.0f));
+        } else {
+          float const x_193 = (*(tint_symbol_11)).y;
+          if ((int(x_193) < 150)) {
+            discard_fragment();
+          } else {
+            float const x_200 = (*(tint_symbol_11)).y;
+            if ((int(x_200) < 180)) {
+              int const x_207 = (*(tint_symbol_9)).arr[5];
+              grey = (0.5f + (float(x_207) / 10.0f));
+            } else {
+              float const x_212 = (*(tint_symbol_11)).y;
+              if ((int(x_212) < 210)) {
+                int const x_219 = (*(tint_symbol_9)).arr[6];
+                grey = (0.5f + (float(x_219) / 10.0f));
+              } else {
+                float const x_224 = (*(tint_symbol_11)).y;
+                if ((int(x_224) < 240)) {
+                  int const x_231 = (*(tint_symbol_9)).arr[7];
+                  grey = (0.5f + (float(x_231) / 10.0f));
+                } else {
+                  float const x_236 = (*(tint_symbol_11)).y;
+                  if ((int(x_236) < 270)) {
+                    int const x_243 = (*(tint_symbol_9)).arr[8];
+                    grey = (0.5f + (float(x_243) / 10.0f));
+                  } else {
+                    discard_fragment();
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  float const x_247 = grey;
+  float3 const x_248 = float3(x_247, x_247, x_247);
+  *(tint_symbol_12) = float4(x_248.x, x_248.y, x_248.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_28 [[buffer(0)]]) {
+  thread float4 tint_symbol_13 = 0.0f;
+  thread tint_array_wrapper tint_symbol_14 = {};
+  thread tint_array_wrapper tint_symbol_15 = {};
+  thread float4 tint_symbol_16 = 0.0f;
+  tint_symbol_13 = gl_FragCoord_param;
+  main_1(x_28, &(tint_symbol_14), &(tint_symbol_15), &(tint_symbol_13), &(tint_symbol_16));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_16};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..9042981
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,660 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 419
+; Schema: 0
+               OpCapability Shader
+        %180 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %data "data"
+               OpName %temp "temp"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_28 "x_28"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "resolution"
+               OpName %x_32 "x_32"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %merge_i1_i1_i1_ "merge_i1_i1_i1_"
+               OpName %from "from"
+               OpName %mid "mid"
+               OpName %to "to"
+               OpName %k "k"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %i_1 "i_1"
+               OpName %mergeSort_ "mergeSort_"
+               OpName %low "low"
+               OpName %high "high"
+               OpName %m "m"
+               OpName %i_2 "i_2"
+               OpName %from_1 "from_1"
+               OpName %mid_1 "mid_1"
+               OpName %to_1 "to_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %main_1 "main_1"
+               OpName %i_3 "i_3"
+               OpName %j_1 "j_1"
+               OpName %grey "grey"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_28 NonWritable
+               OpDecorate %x_28 DescriptorSet 0
+               OpDecorate %x_28 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_32 NonWritable
+               OpDecorate %x_32 DescriptorSet 0
+               OpDecorate %x_32 Binding 1
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Private__arr_int_uint_10 = OpTypePointer Private %_arr_int_uint_10
+          %7 = OpConstantNull %_arr_int_uint_10
+       %data = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+       %temp = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_28 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %17
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_32 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+         %26 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int %_ptr_Function_int
+         %35 = OpConstantNull %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+%_ptr_Private_int = OpTypePointer Private %int
+     %int_10 = OpConstant %int 10
+        %135 = OpTypeFunction %void
+      %int_0 = OpConstant %int 0
+      %int_9 = OpConstant %int 9
+      %int_2 = OpConstant %int 2
+%_ptr_Function_float = OpTypePointer Function %float
+        %204 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %int_n5 = OpConstant %int -5
+     %int_n4 = OpConstant %int -4
+     %int_n3 = OpConstant %int -3
+     %int_n2 = OpConstant %int -2
+     %int_n1 = OpConstant %int -1
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %int_30 = OpConstant %int 30
+  %float_0_5 = OpConstant %float 0.5
+   %float_10 = OpConstant %float 10
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+    %v3float = OpTypeVector %float 3
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %406 = OpTypeFunction %void %main_out
+%merge_i1_i1_i1_ = OpFunction %void None %26
+       %from = OpFunctionParameter %_ptr_Function_int
+        %mid = OpFunctionParameter %_ptr_Function_int
+         %to = OpFunctionParameter %_ptr_Function_int
+         %33 = OpLabel
+          %k = OpVariable %_ptr_Function_int Function %35
+          %i = OpVariable %_ptr_Function_int Function %35
+          %j = OpVariable %_ptr_Function_int Function %35
+        %i_1 = OpVariable %_ptr_Function_int Function %35
+         %40 = OpLoad %int %from
+               OpStore %k %40
+         %42 = OpLoad %int %from
+               OpStore %i %42
+         %44 = OpLoad %int %mid
+         %46 = OpIAdd %int %44 %int_1
+               OpStore %j %46
+               OpBranch %47
+         %47 = OpLabel
+               OpLoopMerge %48 %49 None
+               OpBranch %50
+         %50 = OpLabel
+         %51 = OpLoad %int %i
+         %53 = OpLoad %int %mid
+         %54 = OpLoad %int %j
+         %56 = OpLoad %int %to
+         %57 = OpSLessThanEqual %bool %51 %53
+               OpSelectionMerge %59 None
+               OpBranchConditional %57 %60 %59
+         %60 = OpLabel
+         %61 = OpSLessThanEqual %bool %54 %56
+               OpBranch %59
+         %59 = OpLabel
+         %62 = OpPhi %bool %57 %50 %61 %60
+               OpSelectionMerge %63 None
+               OpBranchConditional %62 %64 %65
+         %64 = OpLabel
+               OpBranch %63
+         %65 = OpLabel
+               OpBranch %48
+         %63 = OpLabel
+         %66 = OpLoad %int %i
+         %68 = OpAccessChain %_ptr_Private_int %data %66
+         %69 = OpLoad %int %68
+         %70 = OpLoad %int %j
+         %71 = OpAccessChain %_ptr_Private_int %data %70
+         %72 = OpLoad %int %71
+         %73 = OpSLessThan %bool %69 %72
+               OpSelectionMerge %74 None
+               OpBranchConditional %73 %75 %76
+         %75 = OpLabel
+         %77 = OpLoad %int %k
+         %78 = OpIAdd %int %77 %int_1
+               OpStore %k %78
+         %79 = OpLoad %int %i
+         %80 = OpIAdd %int %79 %int_1
+               OpStore %i %80
+         %81 = OpAccessChain %_ptr_Private_int %data %79
+         %82 = OpLoad %int %81
+         %83 = OpAccessChain %_ptr_Private_int %temp %77
+               OpStore %83 %82
+               OpBranch %74
+         %76 = OpLabel
+         %84 = OpLoad %int %k
+         %85 = OpIAdd %int %84 %int_1
+               OpStore %k %85
+         %86 = OpLoad %int %j
+         %87 = OpIAdd %int %86 %int_1
+               OpStore %j %87
+         %88 = OpAccessChain %_ptr_Private_int %data %86
+         %89 = OpLoad %int %88
+         %90 = OpAccessChain %_ptr_Private_int %temp %84
+               OpStore %90 %89
+               OpBranch %74
+         %74 = OpLabel
+               OpBranch %49
+         %49 = OpLabel
+               OpBranch %47
+         %48 = OpLabel
+               OpBranch %91
+         %91 = OpLabel
+               OpLoopMerge %92 %93 None
+               OpBranch %94
+         %94 = OpLabel
+         %95 = OpLoad %int %i
+         %96 = OpLoad %int %i
+         %98 = OpLoad %int %mid
+        %100 = OpSLessThan %bool %95 %int_10
+               OpSelectionMerge %101 None
+               OpBranchConditional %100 %102 %101
+        %102 = OpLabel
+        %103 = OpSLessThanEqual %bool %96 %98
+               OpBranch %101
+        %101 = OpLabel
+        %104 = OpPhi %bool %100 %94 %103 %102
+               OpSelectionMerge %105 None
+               OpBranchConditional %104 %106 %107
+        %106 = OpLabel
+               OpBranch %105
+        %107 = OpLabel
+               OpBranch %92
+        %105 = OpLabel
+        %108 = OpLoad %int %k
+        %109 = OpIAdd %int %108 %int_1
+               OpStore %k %109
+        %110 = OpLoad %int %i
+        %111 = OpIAdd %int %110 %int_1
+               OpStore %i %111
+        %112 = OpAccessChain %_ptr_Private_int %data %110
+        %113 = OpLoad %int %112
+        %114 = OpAccessChain %_ptr_Private_int %temp %108
+               OpStore %114 %113
+               OpBranch %93
+         %93 = OpLabel
+               OpBranch %91
+         %92 = OpLabel
+        %116 = OpLoad %int %from
+               OpStore %i_1 %116
+               OpBranch %117
+        %117 = OpLabel
+               OpLoopMerge %118 %119 None
+               OpBranch %120
+        %120 = OpLabel
+        %121 = OpLoad %int %i_1
+        %123 = OpLoad %int %to
+        %124 = OpSLessThanEqual %bool %121 %123
+               OpSelectionMerge %125 None
+               OpBranchConditional %124 %126 %127
+        %126 = OpLabel
+               OpBranch %125
+        %127 = OpLabel
+               OpBranch %118
+        %125 = OpLabel
+        %128 = OpLoad %int %i_1
+        %129 = OpLoad %int %i_1
+        %130 = OpAccessChain %_ptr_Private_int %temp %129
+        %131 = OpLoad %int %130
+        %132 = OpAccessChain %_ptr_Private_int %data %128
+               OpStore %132 %131
+               OpBranch %119
+        %119 = OpLabel
+        %133 = OpLoad %int %i_1
+        %134 = OpIAdd %int %133 %int_1
+               OpStore %i_1 %134
+               OpBranch %117
+        %118 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %mergeSort_ = OpFunction %void None %135
+        %137 = OpLabel
+        %low = OpVariable %_ptr_Function_int Function %35
+       %high = OpVariable %_ptr_Function_int Function %35
+          %m = OpVariable %_ptr_Function_int Function %35
+        %i_2 = OpVariable %_ptr_Function_int Function %35
+     %from_1 = OpVariable %_ptr_Function_int Function %35
+      %mid_1 = OpVariable %_ptr_Function_int Function %35
+       %to_1 = OpVariable %_ptr_Function_int Function %35
+      %param = OpVariable %_ptr_Function_int Function %35
+    %param_1 = OpVariable %_ptr_Function_int Function %35
+    %param_2 = OpVariable %_ptr_Function_int Function %35
+               OpStore %low %int_0
+               OpStore %high %int_9
+               OpStore %m %int_1
+               OpBranch %150
+        %150 = OpLabel
+               OpLoopMerge %151 %152 None
+               OpBranch %153
+        %153 = OpLabel
+        %154 = OpLoad %int %m
+        %155 = OpLoad %int %high
+        %156 = OpSLessThanEqual %bool %154 %155
+               OpSelectionMerge %157 None
+               OpBranchConditional %156 %158 %159
+        %158 = OpLabel
+               OpBranch %157
+        %159 = OpLabel
+               OpBranch %151
+        %157 = OpLabel
+        %160 = OpLoad %int %low
+               OpStore %i_2 %160
+               OpBranch %161
+        %161 = OpLabel
+               OpLoopMerge %162 %163 None
+               OpBranch %164
+        %164 = OpLabel
+        %165 = OpLoad %int %i_2
+        %166 = OpLoad %int %high
+        %167 = OpSLessThan %bool %165 %166
+               OpSelectionMerge %168 None
+               OpBranchConditional %167 %169 %170
+        %169 = OpLabel
+               OpBranch %168
+        %170 = OpLabel
+               OpBranch %162
+        %168 = OpLabel
+        %171 = OpLoad %int %i_2
+               OpStore %from_1 %171
+        %172 = OpLoad %int %i_2
+        %173 = OpLoad %int %m
+        %174 = OpIAdd %int %172 %173
+        %175 = OpISub %int %174 %int_1
+               OpStore %mid_1 %175
+        %176 = OpLoad %int %i_2
+        %177 = OpLoad %int %m
+        %178 = OpLoad %int %high
+        %182 = OpIMul %int %int_2 %177
+        %183 = OpIAdd %int %176 %182
+        %184 = OpISub %int %183 %int_1
+        %179 = OpExtInst %int %180 SMin %184 %178
+               OpStore %to_1 %179
+        %185 = OpLoad %int %from_1
+               OpStore %param %185
+        %186 = OpLoad %int %mid_1
+               OpStore %param_1 %186
+        %187 = OpLoad %int %to_1
+               OpStore %param_2 %187
+        %188 = OpFunctionCall %void %merge_i1_i1_i1_ %param %param_1 %param_2
+               OpBranch %163
+        %163 = OpLabel
+        %192 = OpLoad %int %m
+        %193 = OpLoad %int %i_2
+        %194 = OpIMul %int %int_2 %192
+        %195 = OpIAdd %int %193 %194
+               OpStore %i_2 %195
+               OpBranch %161
+        %162 = OpLabel
+               OpBranch %152
+        %152 = OpLabel
+        %196 = OpLoad %int %m
+        %197 = OpIMul %int %int_2 %196
+               OpStore %m %197
+               OpBranch %150
+        %151 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %135
+        %199 = OpLabel
+        %i_3 = OpVariable %_ptr_Function_int Function %35
+        %j_1 = OpVariable %_ptr_Function_int Function %35
+       %grey = OpVariable %_ptr_Function_float Function %204
+        %207 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_0
+        %208 = OpLoad %float %207
+        %209 = OpConvertFToS %int %208
+               OpStore %i_3 %209
+               OpBranch %210
+        %210 = OpLabel
+               OpLoopMerge %211 %212 None
+               OpBranch %213
+        %213 = OpLabel
+        %214 = OpLoad %int %i_3
+               OpSelectionMerge %215 None
+               OpSwitch %214 %216 9 %217 8 %218 7 %219 6 %220 5 %221 4 %222 3 %223 2 %224 1 %225 0 %226
+        %217 = OpLabel
+        %227 = OpLoad %int %i_3
+        %228 = OpAccessChain %_ptr_Private_int %data %227
+               OpStore %228 %int_n5
+               OpBranch %215
+        %218 = OpLabel
+        %230 = OpLoad %int %i_3
+        %231 = OpAccessChain %_ptr_Private_int %data %230
+               OpStore %231 %int_n4
+               OpBranch %215
+        %219 = OpLabel
+        %233 = OpLoad %int %i_3
+        %234 = OpAccessChain %_ptr_Private_int %data %233
+               OpStore %234 %int_n3
+               OpBranch %215
+        %220 = OpLabel
+        %236 = OpLoad %int %i_3
+        %237 = OpAccessChain %_ptr_Private_int %data %236
+               OpStore %237 %int_n2
+               OpBranch %215
+        %221 = OpLabel
+        %239 = OpLoad %int %i_3
+        %240 = OpAccessChain %_ptr_Private_int %data %239
+               OpStore %240 %int_n1
+               OpBranch %215
+        %222 = OpLabel
+        %242 = OpLoad %int %i_3
+        %243 = OpAccessChain %_ptr_Private_int %data %242
+               OpStore %243 %int_0
+               OpBranch %215
+        %223 = OpLabel
+        %244 = OpLoad %int %i_3
+        %245 = OpAccessChain %_ptr_Private_int %data %244
+               OpStore %245 %int_1
+               OpBranch %215
+        %224 = OpLabel
+        %246 = OpLoad %int %i_3
+        %247 = OpAccessChain %_ptr_Private_int %data %246
+               OpStore %247 %int_2
+               OpBranch %215
+        %225 = OpLabel
+        %248 = OpLoad %int %i_3
+        %249 = OpAccessChain %_ptr_Private_int %data %248
+               OpStore %249 %int_3
+               OpBranch %215
+        %226 = OpLabel
+        %251 = OpLoad %int %i_3
+        %252 = OpAccessChain %_ptr_Private_int %data %251
+               OpStore %252 %int_4
+               OpBranch %215
+        %216 = OpLabel
+               OpBranch %215
+        %215 = OpLabel
+        %254 = OpLoad %int %i_3
+        %255 = OpIAdd %int %254 %int_1
+               OpStore %i_3 %255
+               OpBranch %212
+        %212 = OpLabel
+        %256 = OpLoad %int %i_3
+        %257 = OpSLessThan %bool %256 %int_10
+               OpSelectionMerge %258 None
+               OpBranchConditional %257 %259 %260
+        %259 = OpLabel
+               OpBranch %258
+        %260 = OpLabel
+               OpBranch %211
+        %258 = OpLabel
+               OpBranch %210
+        %211 = OpLabel
+               OpStore %j_1 %int_0
+               OpBranch %261
+        %261 = OpLabel
+               OpLoopMerge %262 %263 None
+               OpBranch %264
+        %264 = OpLabel
+        %265 = OpLoad %int %j_1
+        %266 = OpSLessThan %bool %265 %int_10
+               OpSelectionMerge %267 None
+               OpBranchConditional %266 %268 %269
+        %268 = OpLabel
+               OpBranch %267
+        %269 = OpLabel
+               OpBranch %262
+        %267 = OpLabel
+        %270 = OpLoad %int %j_1
+        %271 = OpLoad %int %j_1
+        %272 = OpAccessChain %_ptr_Private_int %data %271
+        %273 = OpLoad %int %272
+        %274 = OpAccessChain %_ptr_Private_int %temp %270
+               OpStore %274 %273
+               OpBranch %263
+        %263 = OpLabel
+        %275 = OpLoad %int %j_1
+        %276 = OpIAdd %int %275 %int_1
+               OpStore %j_1 %276
+               OpBranch %261
+        %262 = OpLabel
+        %277 = OpFunctionCall %void %mergeSort_
+        %280 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %281 = OpLoad %float %280
+        %282 = OpConvertFToS %int %281
+        %284 = OpSLessThan %bool %282 %int_30
+               OpSelectionMerge %285 None
+               OpBranchConditional %284 %286 %287
+        %286 = OpLabel
+        %288 = OpAccessChain %_ptr_Private_int %data %int_0
+        %289 = OpLoad %int %288
+        %291 = OpConvertSToF %float %289
+        %293 = OpFDiv %float %291 %float_10
+        %294 = OpFAdd %float %float_0_5 %293
+               OpStore %grey %294
+               OpBranch %285
+        %287 = OpLabel
+        %295 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %296 = OpLoad %float %295
+        %297 = OpConvertFToS %int %296
+        %299 = OpSLessThan %bool %297 %int_60
+               OpSelectionMerge %300 None
+               OpBranchConditional %299 %301 %302
+        %301 = OpLabel
+        %303 = OpAccessChain %_ptr_Private_int %data %int_1
+        %304 = OpLoad %int %303
+        %305 = OpConvertSToF %float %304
+        %306 = OpFDiv %float %305 %float_10
+        %307 = OpFAdd %float %float_0_5 %306
+               OpStore %grey %307
+               OpBranch %300
+        %302 = OpLabel
+        %308 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %309 = OpLoad %float %308
+        %310 = OpConvertFToS %int %309
+        %312 = OpSLessThan %bool %310 %int_90
+               OpSelectionMerge %313 None
+               OpBranchConditional %312 %314 %315
+        %314 = OpLabel
+        %316 = OpAccessChain %_ptr_Private_int %data %int_2
+        %317 = OpLoad %int %316
+        %318 = OpConvertSToF %float %317
+        %319 = OpFDiv %float %318 %float_10
+        %320 = OpFAdd %float %float_0_5 %319
+               OpStore %grey %320
+               OpBranch %313
+        %315 = OpLabel
+        %321 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %322 = OpLoad %float %321
+        %323 = OpConvertFToS %int %322
+        %325 = OpSLessThan %bool %323 %int_120
+               OpSelectionMerge %326 None
+               OpBranchConditional %325 %327 %328
+        %327 = OpLabel
+        %329 = OpAccessChain %_ptr_Private_int %data %int_3
+        %330 = OpLoad %int %329
+        %331 = OpConvertSToF %float %330
+        %332 = OpFDiv %float %331 %float_10
+        %333 = OpFAdd %float %float_0_5 %332
+               OpStore %grey %333
+               OpBranch %326
+        %328 = OpLabel
+        %334 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %335 = OpLoad %float %334
+        %336 = OpConvertFToS %int %335
+        %338 = OpSLessThan %bool %336 %int_150
+               OpSelectionMerge %339 None
+               OpBranchConditional %338 %340 %341
+        %340 = OpLabel
+               OpKill
+        %341 = OpLabel
+        %342 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %343 = OpLoad %float %342
+        %344 = OpConvertFToS %int %343
+        %346 = OpSLessThan %bool %344 %int_180
+               OpSelectionMerge %347 None
+               OpBranchConditional %346 %348 %349
+        %348 = OpLabel
+        %351 = OpAccessChain %_ptr_Private_int %data %int_5
+        %352 = OpLoad %int %351
+        %353 = OpConvertSToF %float %352
+        %354 = OpFDiv %float %353 %float_10
+        %355 = OpFAdd %float %float_0_5 %354
+               OpStore %grey %355
+               OpBranch %347
+        %349 = OpLabel
+        %356 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %357 = OpLoad %float %356
+        %358 = OpConvertFToS %int %357
+        %360 = OpSLessThan %bool %358 %int_210
+               OpSelectionMerge %361 None
+               OpBranchConditional %360 %362 %363
+        %362 = OpLabel
+        %365 = OpAccessChain %_ptr_Private_int %data %int_6
+        %366 = OpLoad %int %365
+        %367 = OpConvertSToF %float %366
+        %368 = OpFDiv %float %367 %float_10
+        %369 = OpFAdd %float %float_0_5 %368
+               OpStore %grey %369
+               OpBranch %361
+        %363 = OpLabel
+        %370 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %371 = OpLoad %float %370
+        %372 = OpConvertFToS %int %371
+        %374 = OpSLessThan %bool %372 %int_240
+               OpSelectionMerge %375 None
+               OpBranchConditional %374 %376 %377
+        %376 = OpLabel
+        %379 = OpAccessChain %_ptr_Private_int %data %int_7
+        %380 = OpLoad %int %379
+        %381 = OpConvertSToF %float %380
+        %382 = OpFDiv %float %381 %float_10
+        %383 = OpFAdd %float %float_0_5 %382
+               OpStore %grey %383
+               OpBranch %375
+        %377 = OpLabel
+        %384 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %385 = OpLoad %float %384
+        %386 = OpConvertFToS %int %385
+        %388 = OpSLessThan %bool %386 %int_270
+               OpSelectionMerge %389 None
+               OpBranchConditional %388 %390 %391
+        %390 = OpLabel
+        %393 = OpAccessChain %_ptr_Private_int %data %int_8
+        %394 = OpLoad %int %393
+        %395 = OpConvertSToF %float %394
+        %396 = OpFDiv %float %395 %float_10
+        %397 = OpFAdd %float %float_0_5 %396
+               OpStore %grey %397
+               OpBranch %389
+        %391 = OpLabel
+               OpKill
+        %389 = OpLabel
+               OpBranch %375
+        %375 = OpLabel
+               OpBranch %361
+        %361 = OpLabel
+               OpBranch %347
+        %347 = OpLabel
+               OpBranch %339
+        %339 = OpLabel
+               OpBranch %326
+        %326 = OpLabel
+               OpBranch %313
+        %313 = OpLabel
+               OpBranch %300
+        %300 = OpLabel
+               OpBranch %285
+        %285 = OpLabel
+        %398 = OpLoad %float %grey
+        %400 = OpCompositeConstruct %v3float %398 %398 %398
+        %401 = OpCompositeExtract %float %400 0
+        %402 = OpCompositeExtract %float %400 1
+        %403 = OpCompositeExtract %float %400 2
+        %405 = OpCompositeConstruct %v4float %401 %402 %403 %float_1
+               OpStore %x_GLF_color %405
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %406
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %410 = OpLabel
+        %411 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %411
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %135
+        %413 = OpLabel
+        %414 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %414
+        %415 = OpFunctionCall %void %main_1
+        %417 = OpLoad %v4float %x_GLF_color
+        %418 = OpCompositeConstruct %main_out %417
+        %416 = OpFunctionCall %void %tint_symbol_3 %418
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 212[%212] is not post dominated by the back-edge block 258[%258]
+  %258 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..e61feb5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,313 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[block]]
+struct buf1 {
+  resolution : vec2<f32>;
+};
+
+var<private> data : array<i32, 10>;
+
+var<private> temp : array<i32, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_32 : buf1;
+
+fn merge_i1_i1_i1_(from : ptr<function, i32>, mid : ptr<function, i32>, to : ptr<function, i32>) {
+  var k : i32;
+  var i : i32;
+  var j : i32;
+  var i_1 : i32;
+  let x_254 : i32 = *(from);
+  k = x_254;
+  let x_255 : i32 = *(from);
+  i = x_255;
+  let x_256 : i32 = *(mid);
+  j = (x_256 + 1);
+  loop {
+    let x_262 : i32 = i;
+    let x_263 : i32 = *(mid);
+    let x_265 : i32 = j;
+    let x_266 : i32 = *(to);
+    if (((x_262 <= x_263) && (x_265 <= x_266))) {
+    } else {
+      break;
+    }
+    let x_270 : i32 = i;
+    let x_272 : i32 = data[x_270];
+    let x_273 : i32 = j;
+    let x_275 : i32 = data[x_273];
+    if ((x_272 < x_275)) {
+      let x_280 : i32 = k;
+      k = (x_280 + 1);
+      let x_282 : i32 = i;
+      i = (x_282 + 1);
+      let x_285 : i32 = data[x_282];
+      temp[x_280] = x_285;
+    } else {
+      let x_287 : i32 = k;
+      k = (x_287 + 1);
+      let x_289 : i32 = j;
+      j = (x_289 + 1);
+      let x_292 : i32 = data[x_289];
+      temp[x_287] = x_292;
+    }
+  }
+  loop {
+    let x_298 : i32 = i;
+    let x_300 : i32 = i;
+    let x_301 : i32 = *(mid);
+    if (((x_298 < 10) && (x_300 <= x_301))) {
+    } else {
+      break;
+    }
+    let x_305 : i32 = k;
+    k = (x_305 + 1);
+    let x_307 : i32 = i;
+    i = (x_307 + 1);
+    let x_310 : i32 = data[x_307];
+    temp[x_305] = x_310;
+  }
+  let x_312 : i32 = *(from);
+  i_1 = x_312;
+  loop {
+    let x_317 : i32 = i_1;
+    let x_318 : i32 = *(to);
+    if ((x_317 <= x_318)) {
+    } else {
+      break;
+    }
+    let x_321 : i32 = i_1;
+    let x_322 : i32 = i_1;
+    let x_324 : i32 = temp[x_322];
+    data[x_321] = x_324;
+
+    continuing {
+      let x_326 : i32 = i_1;
+      i_1 = (x_326 + 1);
+    }
+  }
+  return;
+}
+
+fn mergeSort_() {
+  var low : i32;
+  var high : i32;
+  var m : i32;
+  var i_2 : i32;
+  var from_1 : i32;
+  var mid_1 : i32;
+  var to_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  low = 0;
+  high = 9;
+  m = 1;
+  loop {
+    let x_333 : i32 = m;
+    let x_334 : i32 = high;
+    if ((x_333 <= x_334)) {
+    } else {
+      break;
+    }
+    let x_337 : i32 = low;
+    i_2 = x_337;
+    loop {
+      let x_342 : i32 = i_2;
+      let x_343 : i32 = high;
+      if ((x_342 < x_343)) {
+      } else {
+        break;
+      }
+      let x_346 : i32 = i_2;
+      from_1 = x_346;
+      let x_347 : i32 = i_2;
+      let x_348 : i32 = m;
+      mid_1 = ((x_347 + x_348) - 1);
+      let x_351 : i32 = i_2;
+      let x_352 : i32 = m;
+      let x_356 : i32 = high;
+      to_1 = min(((x_351 + (2 * x_352)) - 1), x_356);
+      let x_358 : i32 = from_1;
+      param = x_358;
+      let x_359 : i32 = mid_1;
+      param_1 = x_359;
+      let x_360 : i32 = to_1;
+      param_2 = x_360;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2));
+
+      continuing {
+        let x_362 : i32 = m;
+        let x_364 : i32 = i_2;
+        i_2 = (x_364 + (2 * x_362));
+      }
+    }
+
+    continuing {
+      let x_366 : i32 = m;
+      m = (2 * x_366);
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_3 : i32;
+  var j_1 : i32;
+  var grey : f32;
+  let x_87 : f32 = x_28.injectionSwitch.x;
+  i_3 = i32(x_87);
+  loop {
+    let x_93 : i32 = i_3;
+    switch(x_93) {
+      case 9: {
+        let x_123 : i32 = i_3;
+        data[x_123] = -5;
+      }
+      case 8: {
+        let x_121 : i32 = i_3;
+        data[x_121] = -4;
+      }
+      case 7: {
+        let x_119 : i32 = i_3;
+        data[x_119] = -3;
+      }
+      case 6: {
+        let x_117 : i32 = i_3;
+        data[x_117] = -2;
+      }
+      case 5: {
+        let x_115 : i32 = i_3;
+        data[x_115] = -1;
+      }
+      case 4: {
+        let x_113 : i32 = i_3;
+        data[x_113] = 0;
+      }
+      case 3: {
+        let x_111 : i32 = i_3;
+        data[x_111] = 1;
+      }
+      case 2: {
+        let x_109 : i32 = i_3;
+        data[x_109] = 2;
+      }
+      case 1: {
+        let x_107 : i32 = i_3;
+        data[x_107] = 3;
+      }
+      case 0: {
+        let x_105 : i32 = i_3;
+        data[x_105] = 4;
+      }
+      default: {
+      }
+    }
+    let x_125 : i32 = i_3;
+    i_3 = (x_125 + 1);
+
+    continuing {
+      let x_127 : i32 = i_3;
+      if ((x_127 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  loop {
+    let x_133 : i32 = j_1;
+    if ((x_133 < 10)) {
+    } else {
+      break;
+    }
+    let x_136 : i32 = j_1;
+    let x_137 : i32 = j_1;
+    let x_139 : i32 = data[x_137];
+    temp[x_136] = x_139;
+
+    continuing {
+      let x_141 : i32 = j_1;
+      j_1 = (x_141 + 1);
+    }
+  }
+  mergeSort_();
+  let x_145 : f32 = gl_FragCoord.y;
+  if ((i32(x_145) < 30)) {
+    let x_152 : i32 = data[0];
+    grey = (0.5 + (f32(x_152) / 10.0));
+  } else {
+    let x_157 : f32 = gl_FragCoord.y;
+    if ((i32(x_157) < 60)) {
+      let x_164 : i32 = data[1];
+      grey = (0.5 + (f32(x_164) / 10.0));
+    } else {
+      let x_169 : f32 = gl_FragCoord.y;
+      if ((i32(x_169) < 90)) {
+        let x_176 : i32 = data[2];
+        grey = (0.5 + (f32(x_176) / 10.0));
+      } else {
+        let x_181 : f32 = gl_FragCoord.y;
+        if ((i32(x_181) < 120)) {
+          let x_188 : i32 = data[3];
+          grey = (0.5 + (f32(x_188) / 10.0));
+        } else {
+          let x_193 : f32 = gl_FragCoord.y;
+          if ((i32(x_193) < 150)) {
+            discard;
+          } else {
+            let x_200 : f32 = gl_FragCoord.y;
+            if ((i32(x_200) < 180)) {
+              let x_207 : i32 = data[5];
+              grey = (0.5 + (f32(x_207) / 10.0));
+            } else {
+              let x_212 : f32 = gl_FragCoord.y;
+              if ((i32(x_212) < 210)) {
+                let x_219 : i32 = data[6];
+                grey = (0.5 + (f32(x_219) / 10.0));
+              } else {
+                let x_224 : f32 = gl_FragCoord.y;
+                if ((i32(x_224) < 240)) {
+                  let x_231 : i32 = data[7];
+                  grey = (0.5 + (f32(x_231) / 10.0));
+                } else {
+                  let x_236 : f32 = gl_FragCoord.y;
+                  if ((i32(x_236) < 270)) {
+                    let x_243 : i32 = data[8];
+                    grey = (0.5 + (f32(x_243) / 10.0));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  let x_247 : f32 = grey;
+  let x_248 : vec3<f32> = vec3<f32>(x_247, x_247, x_247);
+  x_GLF_color = vec4<f32>(x_248.x, x_248.y, x_248.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/0-opt.wgsl
new file mode 100644
index 0000000..e61feb5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/0-opt.wgsl
@@ -0,0 +1,313 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[block]]
+struct buf1 {
+  resolution : vec2<f32>;
+};
+
+var<private> data : array<i32, 10>;
+
+var<private> temp : array<i32, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_32 : buf1;
+
+fn merge_i1_i1_i1_(from : ptr<function, i32>, mid : ptr<function, i32>, to : ptr<function, i32>) {
+  var k : i32;
+  var i : i32;
+  var j : i32;
+  var i_1 : i32;
+  let x_254 : i32 = *(from);
+  k = x_254;
+  let x_255 : i32 = *(from);
+  i = x_255;
+  let x_256 : i32 = *(mid);
+  j = (x_256 + 1);
+  loop {
+    let x_262 : i32 = i;
+    let x_263 : i32 = *(mid);
+    let x_265 : i32 = j;
+    let x_266 : i32 = *(to);
+    if (((x_262 <= x_263) && (x_265 <= x_266))) {
+    } else {
+      break;
+    }
+    let x_270 : i32 = i;
+    let x_272 : i32 = data[x_270];
+    let x_273 : i32 = j;
+    let x_275 : i32 = data[x_273];
+    if ((x_272 < x_275)) {
+      let x_280 : i32 = k;
+      k = (x_280 + 1);
+      let x_282 : i32 = i;
+      i = (x_282 + 1);
+      let x_285 : i32 = data[x_282];
+      temp[x_280] = x_285;
+    } else {
+      let x_287 : i32 = k;
+      k = (x_287 + 1);
+      let x_289 : i32 = j;
+      j = (x_289 + 1);
+      let x_292 : i32 = data[x_289];
+      temp[x_287] = x_292;
+    }
+  }
+  loop {
+    let x_298 : i32 = i;
+    let x_300 : i32 = i;
+    let x_301 : i32 = *(mid);
+    if (((x_298 < 10) && (x_300 <= x_301))) {
+    } else {
+      break;
+    }
+    let x_305 : i32 = k;
+    k = (x_305 + 1);
+    let x_307 : i32 = i;
+    i = (x_307 + 1);
+    let x_310 : i32 = data[x_307];
+    temp[x_305] = x_310;
+  }
+  let x_312 : i32 = *(from);
+  i_1 = x_312;
+  loop {
+    let x_317 : i32 = i_1;
+    let x_318 : i32 = *(to);
+    if ((x_317 <= x_318)) {
+    } else {
+      break;
+    }
+    let x_321 : i32 = i_1;
+    let x_322 : i32 = i_1;
+    let x_324 : i32 = temp[x_322];
+    data[x_321] = x_324;
+
+    continuing {
+      let x_326 : i32 = i_1;
+      i_1 = (x_326 + 1);
+    }
+  }
+  return;
+}
+
+fn mergeSort_() {
+  var low : i32;
+  var high : i32;
+  var m : i32;
+  var i_2 : i32;
+  var from_1 : i32;
+  var mid_1 : i32;
+  var to_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  low = 0;
+  high = 9;
+  m = 1;
+  loop {
+    let x_333 : i32 = m;
+    let x_334 : i32 = high;
+    if ((x_333 <= x_334)) {
+    } else {
+      break;
+    }
+    let x_337 : i32 = low;
+    i_2 = x_337;
+    loop {
+      let x_342 : i32 = i_2;
+      let x_343 : i32 = high;
+      if ((x_342 < x_343)) {
+      } else {
+        break;
+      }
+      let x_346 : i32 = i_2;
+      from_1 = x_346;
+      let x_347 : i32 = i_2;
+      let x_348 : i32 = m;
+      mid_1 = ((x_347 + x_348) - 1);
+      let x_351 : i32 = i_2;
+      let x_352 : i32 = m;
+      let x_356 : i32 = high;
+      to_1 = min(((x_351 + (2 * x_352)) - 1), x_356);
+      let x_358 : i32 = from_1;
+      param = x_358;
+      let x_359 : i32 = mid_1;
+      param_1 = x_359;
+      let x_360 : i32 = to_1;
+      param_2 = x_360;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2));
+
+      continuing {
+        let x_362 : i32 = m;
+        let x_364 : i32 = i_2;
+        i_2 = (x_364 + (2 * x_362));
+      }
+    }
+
+    continuing {
+      let x_366 : i32 = m;
+      m = (2 * x_366);
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_3 : i32;
+  var j_1 : i32;
+  var grey : f32;
+  let x_87 : f32 = x_28.injectionSwitch.x;
+  i_3 = i32(x_87);
+  loop {
+    let x_93 : i32 = i_3;
+    switch(x_93) {
+      case 9: {
+        let x_123 : i32 = i_3;
+        data[x_123] = -5;
+      }
+      case 8: {
+        let x_121 : i32 = i_3;
+        data[x_121] = -4;
+      }
+      case 7: {
+        let x_119 : i32 = i_3;
+        data[x_119] = -3;
+      }
+      case 6: {
+        let x_117 : i32 = i_3;
+        data[x_117] = -2;
+      }
+      case 5: {
+        let x_115 : i32 = i_3;
+        data[x_115] = -1;
+      }
+      case 4: {
+        let x_113 : i32 = i_3;
+        data[x_113] = 0;
+      }
+      case 3: {
+        let x_111 : i32 = i_3;
+        data[x_111] = 1;
+      }
+      case 2: {
+        let x_109 : i32 = i_3;
+        data[x_109] = 2;
+      }
+      case 1: {
+        let x_107 : i32 = i_3;
+        data[x_107] = 3;
+      }
+      case 0: {
+        let x_105 : i32 = i_3;
+        data[x_105] = 4;
+      }
+      default: {
+      }
+    }
+    let x_125 : i32 = i_3;
+    i_3 = (x_125 + 1);
+
+    continuing {
+      let x_127 : i32 = i_3;
+      if ((x_127 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  loop {
+    let x_133 : i32 = j_1;
+    if ((x_133 < 10)) {
+    } else {
+      break;
+    }
+    let x_136 : i32 = j_1;
+    let x_137 : i32 = j_1;
+    let x_139 : i32 = data[x_137];
+    temp[x_136] = x_139;
+
+    continuing {
+      let x_141 : i32 = j_1;
+      j_1 = (x_141 + 1);
+    }
+  }
+  mergeSort_();
+  let x_145 : f32 = gl_FragCoord.y;
+  if ((i32(x_145) < 30)) {
+    let x_152 : i32 = data[0];
+    grey = (0.5 + (f32(x_152) / 10.0));
+  } else {
+    let x_157 : f32 = gl_FragCoord.y;
+    if ((i32(x_157) < 60)) {
+      let x_164 : i32 = data[1];
+      grey = (0.5 + (f32(x_164) / 10.0));
+    } else {
+      let x_169 : f32 = gl_FragCoord.y;
+      if ((i32(x_169) < 90)) {
+        let x_176 : i32 = data[2];
+        grey = (0.5 + (f32(x_176) / 10.0));
+      } else {
+        let x_181 : f32 = gl_FragCoord.y;
+        if ((i32(x_181) < 120)) {
+          let x_188 : i32 = data[3];
+          grey = (0.5 + (f32(x_188) / 10.0));
+        } else {
+          let x_193 : f32 = gl_FragCoord.y;
+          if ((i32(x_193) < 150)) {
+            discard;
+          } else {
+            let x_200 : f32 = gl_FragCoord.y;
+            if ((i32(x_200) < 180)) {
+              let x_207 : i32 = data[5];
+              grey = (0.5 + (f32(x_207) / 10.0));
+            } else {
+              let x_212 : f32 = gl_FragCoord.y;
+              if ((i32(x_212) < 210)) {
+                let x_219 : i32 = data[6];
+                grey = (0.5 + (f32(x_219) / 10.0));
+              } else {
+                let x_224 : f32 = gl_FragCoord.y;
+                if ((i32(x_224) < 240)) {
+                  let x_231 : i32 = data[7];
+                  grey = (0.5 + (f32(x_231) / 10.0));
+                } else {
+                  let x_236 : f32 = gl_FragCoord.y;
+                  if ((i32(x_236) < 270)) {
+                    let x_243 : i32 = data[8];
+                    grey = (0.5 + (f32(x_243) / 10.0));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  let x_247 : f32 = grey;
+  let x_248 : vec3<f32> = vec3<f32>(x_247, x_247, x_247);
+  x_GLF_color = vec4<f32>(x_248.x, x_248.y, x_248.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..be184c8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,271 @@
+static int data[10] = (int[10])0;
+static int temp[10] = (int[10])0;
+cbuffer cbuffer_x_28 : register(b0, space0) {
+  uint4 x_28[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_32 : register(b1, space0) {
+  uint4 x_32[1];
+};
+
+void merge_i1_i1_i1_(inout int from, inout int mid, inout int to) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  const int x_254 = from;
+  k = x_254;
+  const int x_255 = from;
+  i = x_255;
+  const int x_256 = mid;
+  j = (x_256 + 1);
+  while (true) {
+    const int x_262 = i;
+    const int x_263 = mid;
+    const int x_265 = j;
+    const int x_266 = to;
+    bool tint_tmp = (x_262 <= x_263);
+    if (tint_tmp) {
+      tint_tmp = (x_265 <= x_266);
+    }
+    if ((tint_tmp)) {
+    } else {
+      break;
+    }
+    const int x_272 = data[i];
+    const int x_275 = data[j];
+    if ((x_272 < x_275)) {
+      const int x_280 = k;
+      k = (x_280 + 1);
+      const int x_282 = i;
+      i = (x_282 + 1);
+      const int x_285 = data[x_282];
+      temp[x_280] = x_285;
+    } else {
+      const int x_287 = k;
+      k = (x_287 + 1);
+      const int x_289 = j;
+      j = (x_289 + 1);
+      const int x_292 = data[x_289];
+      temp[x_287] = x_292;
+    }
+  }
+  while (true) {
+    const int x_298 = i;
+    const int x_300 = i;
+    const int x_301 = mid;
+    bool tint_tmp_1 = (x_298 < 10);
+    if (tint_tmp_1) {
+      tint_tmp_1 = (x_300 <= x_301);
+    }
+    if ((tint_tmp_1)) {
+    } else {
+      break;
+    }
+    const int x_305 = k;
+    k = (x_305 + 1);
+    const int x_307 = i;
+    i = (x_307 + 1);
+    const int x_310 = data[x_307];
+    temp[x_305] = x_310;
+  }
+  const int x_312 = from;
+  i_1 = x_312;
+  while (true) {
+    const int x_317 = i_1;
+    const int x_318 = to;
+    if ((x_317 <= x_318)) {
+    } else {
+      break;
+    }
+    const int x_321 = i_1;
+    const int x_324 = temp[i_1];
+    data[x_321] = x_324;
+    {
+      i_1 = (i_1 + 1);
+    }
+  }
+  return;
+}
+
+void mergeSort_() {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  {
+    for(; (m <= high); m = (2 * m)) {
+      i_2 = low;
+      {
+        for(; (i_2 < high); i_2 = (i_2 + (2 * m))) {
+          from_1 = i_2;
+          mid_1 = ((i_2 + m) - 1);
+          to_1 = min(((i_2 + (2 * m)) - 1), high);
+          param = from_1;
+          param_1 = mid_1;
+          param_2 = to_1;
+          merge_i1_i1_i1_(param, param_1, param_2);
+        }
+      }
+    }
+  }
+  return;
+}
+
+void main_1() {
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  const float x_87 = asfloat(x_28[0].x);
+  i_3 = int(x_87);
+  while (true) {
+    switch(i_3) {
+      case 9: {
+        data[i_3] = -5;
+        break;
+      }
+      case 8: {
+        data[i_3] = -4;
+        break;
+      }
+      case 7: {
+        data[i_3] = -3;
+        break;
+      }
+      case 6: {
+        data[i_3] = -2;
+        break;
+      }
+      case 5: {
+        data[i_3] = -1;
+        break;
+      }
+      case 4: {
+        data[i_3] = 0;
+        break;
+      }
+      case 3: {
+        data[i_3] = 1;
+        break;
+      }
+      case 2: {
+        data[i_3] = 2;
+        break;
+      }
+      case 1: {
+        data[i_3] = 3;
+        break;
+      }
+      case 0: {
+        data[i_3] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    i_3 = (i_3 + 1);
+    {
+      if ((i_3 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  {
+    for(; (j_1 < 10); j_1 = (j_1 + 1)) {
+      const int x_136 = j_1;
+      const int x_139 = data[j_1];
+      temp[x_136] = x_139;
+    }
+  }
+  mergeSort_();
+  const float x_145 = gl_FragCoord.y;
+  if ((int(x_145) < 30)) {
+    const int x_152 = data[0];
+    grey = (0.5f + (float(x_152) / 10.0f));
+  } else {
+    const float x_157 = gl_FragCoord.y;
+    if ((int(x_157) < 60)) {
+      const int x_164 = data[1];
+      grey = (0.5f + (float(x_164) / 10.0f));
+    } else {
+      const float x_169 = gl_FragCoord.y;
+      if ((int(x_169) < 90)) {
+        const int x_176 = data[2];
+        grey = (0.5f + (float(x_176) / 10.0f));
+      } else {
+        const float x_181 = gl_FragCoord.y;
+        if ((int(x_181) < 120)) {
+          const int x_188 = data[3];
+          grey = (0.5f + (float(x_188) / 10.0f));
+        } else {
+          const float x_193 = gl_FragCoord.y;
+          if ((int(x_193) < 150)) {
+            discard;
+          } else {
+            const float x_200 = gl_FragCoord.y;
+            if ((int(x_200) < 180)) {
+              const int x_207 = data[5];
+              grey = (0.5f + (float(x_207) / 10.0f));
+            } else {
+              const float x_212 = gl_FragCoord.y;
+              if ((int(x_212) < 210)) {
+                const int x_219 = data[6];
+                grey = (0.5f + (float(x_219) / 10.0f));
+              } else {
+                const float x_224 = gl_FragCoord.y;
+                if ((int(x_224) < 240)) {
+                  const int x_231 = data[7];
+                  grey = (0.5f + (float(x_231) / 10.0f));
+                } else {
+                  const float x_236 = gl_FragCoord.y;
+                  if ((int(x_236) < 270)) {
+                    const int x_243 = data[8];
+                    grey = (0.5f + (float(x_243) / 10.0f));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  const float x_247 = grey;
+  const float3 x_248 = float3(x_247, x_247, x_247);
+  x_GLF_color = float4(x_248.x, x_248.y, x_248.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..6e7adb4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/0-opt.wgsl.expected.msl
@@ -0,0 +1,317 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct buf1 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void merge_i1_i1_i1_(thread int* const from, thread int* const mid, thread int* const to, thread tint_array_wrapper* const tint_symbol_5, thread tint_array_wrapper* const tint_symbol_6) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  int const x_254 = *(from);
+  k = x_254;
+  int const x_255 = *(from);
+  i = x_255;
+  int const x_256 = *(mid);
+  j = (x_256 + 1);
+  while (true) {
+    int const x_262 = i;
+    int const x_263 = *(mid);
+    int const x_265 = j;
+    int const x_266 = *(to);
+    if (((x_262 <= x_263) && (x_265 <= x_266))) {
+    } else {
+      break;
+    }
+    int const x_270 = i;
+    int const x_272 = (*(tint_symbol_5)).arr[x_270];
+    int const x_273 = j;
+    int const x_275 = (*(tint_symbol_5)).arr[x_273];
+    if ((x_272 < x_275)) {
+      int const x_280 = k;
+      k = (x_280 + 1);
+      int const x_282 = i;
+      i = (x_282 + 1);
+      int const x_285 = (*(tint_symbol_5)).arr[x_282];
+      (*(tint_symbol_6)).arr[x_280] = x_285;
+    } else {
+      int const x_287 = k;
+      k = (x_287 + 1);
+      int const x_289 = j;
+      j = (x_289 + 1);
+      int const x_292 = (*(tint_symbol_5)).arr[x_289];
+      (*(tint_symbol_6)).arr[x_287] = x_292;
+    }
+  }
+  while (true) {
+    int const x_298 = i;
+    int const x_300 = i;
+    int const x_301 = *(mid);
+    if (((x_298 < 10) && (x_300 <= x_301))) {
+    } else {
+      break;
+    }
+    int const x_305 = k;
+    k = (x_305 + 1);
+    int const x_307 = i;
+    i = (x_307 + 1);
+    int const x_310 = (*(tint_symbol_5)).arr[x_307];
+    (*(tint_symbol_6)).arr[x_305] = x_310;
+  }
+  int const x_312 = *(from);
+  i_1 = x_312;
+  while (true) {
+    int const x_317 = i_1;
+    int const x_318 = *(to);
+    if ((x_317 <= x_318)) {
+    } else {
+      break;
+    }
+    int const x_321 = i_1;
+    int const x_322 = i_1;
+    int const x_324 = (*(tint_symbol_6)).arr[x_322];
+    (*(tint_symbol_5)).arr[x_321] = x_324;
+    {
+      int const x_326 = i_1;
+      i_1 = (x_326 + 1);
+    }
+  }
+  return;
+}
+
+void mergeSort_(thread tint_array_wrapper* const tint_symbol_7, thread tint_array_wrapper* const tint_symbol_8) {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  while (true) {
+    int const x_333 = m;
+    int const x_334 = high;
+    if ((x_333 <= x_334)) {
+    } else {
+      break;
+    }
+    int const x_337 = low;
+    i_2 = x_337;
+    while (true) {
+      int const x_342 = i_2;
+      int const x_343 = high;
+      if ((x_342 < x_343)) {
+      } else {
+        break;
+      }
+      int const x_346 = i_2;
+      from_1 = x_346;
+      int const x_347 = i_2;
+      int const x_348 = m;
+      mid_1 = ((x_347 + x_348) - 1);
+      int const x_351 = i_2;
+      int const x_352 = m;
+      int const x_356 = high;
+      to_1 = min(((x_351 + (2 * x_352)) - 1), x_356);
+      int const x_358 = from_1;
+      param = x_358;
+      int const x_359 = mid_1;
+      param_1 = x_359;
+      int const x_360 = to_1;
+      param_2 = x_360;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2), tint_symbol_7, tint_symbol_8);
+      {
+        int const x_362 = m;
+        int const x_364 = i_2;
+        i_2 = (x_364 + (2 * x_362));
+      }
+    }
+    {
+      int const x_366 = m;
+      m = (2 * x_366);
+    }
+  }
+  return;
+}
+
+void main_1(constant buf0& x_28, thread tint_array_wrapper* const tint_symbol_9, thread tint_array_wrapper* const tint_symbol_10, thread float4* const tint_symbol_11, thread float4* const tint_symbol_12) {
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  float const x_87 = x_28.injectionSwitch.x;
+  i_3 = int(x_87);
+  while (true) {
+    int const x_93 = i_3;
+    switch(x_93) {
+      case 9: {
+        int const x_123 = i_3;
+        (*(tint_symbol_9)).arr[x_123] = -5;
+        break;
+      }
+      case 8: {
+        int const x_121 = i_3;
+        (*(tint_symbol_9)).arr[x_121] = -4;
+        break;
+      }
+      case 7: {
+        int const x_119 = i_3;
+        (*(tint_symbol_9)).arr[x_119] = -3;
+        break;
+      }
+      case 6: {
+        int const x_117 = i_3;
+        (*(tint_symbol_9)).arr[x_117] = -2;
+        break;
+      }
+      case 5: {
+        int const x_115 = i_3;
+        (*(tint_symbol_9)).arr[x_115] = -1;
+        break;
+      }
+      case 4: {
+        int const x_113 = i_3;
+        (*(tint_symbol_9)).arr[x_113] = 0;
+        break;
+      }
+      case 3: {
+        int const x_111 = i_3;
+        (*(tint_symbol_9)).arr[x_111] = 1;
+        break;
+      }
+      case 2: {
+        int const x_109 = i_3;
+        (*(tint_symbol_9)).arr[x_109] = 2;
+        break;
+      }
+      case 1: {
+        int const x_107 = i_3;
+        (*(tint_symbol_9)).arr[x_107] = 3;
+        break;
+      }
+      case 0: {
+        int const x_105 = i_3;
+        (*(tint_symbol_9)).arr[x_105] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    int const x_125 = i_3;
+    i_3 = (x_125 + 1);
+    {
+      int const x_127 = i_3;
+      if ((x_127 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  while (true) {
+    int const x_133 = j_1;
+    if ((x_133 < 10)) {
+    } else {
+      break;
+    }
+    int const x_136 = j_1;
+    int const x_137 = j_1;
+    int const x_139 = (*(tint_symbol_9)).arr[x_137];
+    (*(tint_symbol_10)).arr[x_136] = x_139;
+    {
+      int const x_141 = j_1;
+      j_1 = (x_141 + 1);
+    }
+  }
+  mergeSort_(tint_symbol_9, tint_symbol_10);
+  float const x_145 = (*(tint_symbol_11)).y;
+  if ((int(x_145) < 30)) {
+    int const x_152 = (*(tint_symbol_9)).arr[0];
+    grey = (0.5f + (float(x_152) / 10.0f));
+  } else {
+    float const x_157 = (*(tint_symbol_11)).y;
+    if ((int(x_157) < 60)) {
+      int const x_164 = (*(tint_symbol_9)).arr[1];
+      grey = (0.5f + (float(x_164) / 10.0f));
+    } else {
+      float const x_169 = (*(tint_symbol_11)).y;
+      if ((int(x_169) < 90)) {
+        int const x_176 = (*(tint_symbol_9)).arr[2];
+        grey = (0.5f + (float(x_176) / 10.0f));
+      } else {
+        float const x_181 = (*(tint_symbol_11)).y;
+        if ((int(x_181) < 120)) {
+          int const x_188 = (*(tint_symbol_9)).arr[3];
+          grey = (0.5f + (float(x_188) / 10.0f));
+        } else {
+          float const x_193 = (*(tint_symbol_11)).y;
+          if ((int(x_193) < 150)) {
+            discard_fragment();
+          } else {
+            float const x_200 = (*(tint_symbol_11)).y;
+            if ((int(x_200) < 180)) {
+              int const x_207 = (*(tint_symbol_9)).arr[5];
+              grey = (0.5f + (float(x_207) / 10.0f));
+            } else {
+              float const x_212 = (*(tint_symbol_11)).y;
+              if ((int(x_212) < 210)) {
+                int const x_219 = (*(tint_symbol_9)).arr[6];
+                grey = (0.5f + (float(x_219) / 10.0f));
+              } else {
+                float const x_224 = (*(tint_symbol_11)).y;
+                if ((int(x_224) < 240)) {
+                  int const x_231 = (*(tint_symbol_9)).arr[7];
+                  grey = (0.5f + (float(x_231) / 10.0f));
+                } else {
+                  float const x_236 = (*(tint_symbol_11)).y;
+                  if ((int(x_236) < 270)) {
+                    int const x_243 = (*(tint_symbol_9)).arr[8];
+                    grey = (0.5f + (float(x_243) / 10.0f));
+                  } else {
+                    discard_fragment();
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  float const x_247 = grey;
+  float3 const x_248 = float3(x_247, x_247, x_247);
+  *(tint_symbol_12) = float4(x_248.x, x_248.y, x_248.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_28 [[buffer(0)]]) {
+  thread float4 tint_symbol_13 = 0.0f;
+  thread tint_array_wrapper tint_symbol_14 = {};
+  thread tint_array_wrapper tint_symbol_15 = {};
+  thread float4 tint_symbol_16 = 0.0f;
+  tint_symbol_13 = gl_FragCoord_param;
+  main_1(x_28, &(tint_symbol_14), &(tint_symbol_15), &(tint_symbol_13), &(tint_symbol_16));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_16};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..9042981
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,660 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 419
+; Schema: 0
+               OpCapability Shader
+        %180 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %data "data"
+               OpName %temp "temp"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_28 "x_28"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "resolution"
+               OpName %x_32 "x_32"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %merge_i1_i1_i1_ "merge_i1_i1_i1_"
+               OpName %from "from"
+               OpName %mid "mid"
+               OpName %to "to"
+               OpName %k "k"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %i_1 "i_1"
+               OpName %mergeSort_ "mergeSort_"
+               OpName %low "low"
+               OpName %high "high"
+               OpName %m "m"
+               OpName %i_2 "i_2"
+               OpName %from_1 "from_1"
+               OpName %mid_1 "mid_1"
+               OpName %to_1 "to_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %main_1 "main_1"
+               OpName %i_3 "i_3"
+               OpName %j_1 "j_1"
+               OpName %grey "grey"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_28 NonWritable
+               OpDecorate %x_28 DescriptorSet 0
+               OpDecorate %x_28 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_32 NonWritable
+               OpDecorate %x_32 DescriptorSet 0
+               OpDecorate %x_32 Binding 1
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Private__arr_int_uint_10 = OpTypePointer Private %_arr_int_uint_10
+          %7 = OpConstantNull %_arr_int_uint_10
+       %data = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+       %temp = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_28 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %17
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_32 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+         %26 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int %_ptr_Function_int
+         %35 = OpConstantNull %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+%_ptr_Private_int = OpTypePointer Private %int
+     %int_10 = OpConstant %int 10
+        %135 = OpTypeFunction %void
+      %int_0 = OpConstant %int 0
+      %int_9 = OpConstant %int 9
+      %int_2 = OpConstant %int 2
+%_ptr_Function_float = OpTypePointer Function %float
+        %204 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %int_n5 = OpConstant %int -5
+     %int_n4 = OpConstant %int -4
+     %int_n3 = OpConstant %int -3
+     %int_n2 = OpConstant %int -2
+     %int_n1 = OpConstant %int -1
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %int_30 = OpConstant %int 30
+  %float_0_5 = OpConstant %float 0.5
+   %float_10 = OpConstant %float 10
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+    %v3float = OpTypeVector %float 3
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %406 = OpTypeFunction %void %main_out
+%merge_i1_i1_i1_ = OpFunction %void None %26
+       %from = OpFunctionParameter %_ptr_Function_int
+        %mid = OpFunctionParameter %_ptr_Function_int
+         %to = OpFunctionParameter %_ptr_Function_int
+         %33 = OpLabel
+          %k = OpVariable %_ptr_Function_int Function %35
+          %i = OpVariable %_ptr_Function_int Function %35
+          %j = OpVariable %_ptr_Function_int Function %35
+        %i_1 = OpVariable %_ptr_Function_int Function %35
+         %40 = OpLoad %int %from
+               OpStore %k %40
+         %42 = OpLoad %int %from
+               OpStore %i %42
+         %44 = OpLoad %int %mid
+         %46 = OpIAdd %int %44 %int_1
+               OpStore %j %46
+               OpBranch %47
+         %47 = OpLabel
+               OpLoopMerge %48 %49 None
+               OpBranch %50
+         %50 = OpLabel
+         %51 = OpLoad %int %i
+         %53 = OpLoad %int %mid
+         %54 = OpLoad %int %j
+         %56 = OpLoad %int %to
+         %57 = OpSLessThanEqual %bool %51 %53
+               OpSelectionMerge %59 None
+               OpBranchConditional %57 %60 %59
+         %60 = OpLabel
+         %61 = OpSLessThanEqual %bool %54 %56
+               OpBranch %59
+         %59 = OpLabel
+         %62 = OpPhi %bool %57 %50 %61 %60
+               OpSelectionMerge %63 None
+               OpBranchConditional %62 %64 %65
+         %64 = OpLabel
+               OpBranch %63
+         %65 = OpLabel
+               OpBranch %48
+         %63 = OpLabel
+         %66 = OpLoad %int %i
+         %68 = OpAccessChain %_ptr_Private_int %data %66
+         %69 = OpLoad %int %68
+         %70 = OpLoad %int %j
+         %71 = OpAccessChain %_ptr_Private_int %data %70
+         %72 = OpLoad %int %71
+         %73 = OpSLessThan %bool %69 %72
+               OpSelectionMerge %74 None
+               OpBranchConditional %73 %75 %76
+         %75 = OpLabel
+         %77 = OpLoad %int %k
+         %78 = OpIAdd %int %77 %int_1
+               OpStore %k %78
+         %79 = OpLoad %int %i
+         %80 = OpIAdd %int %79 %int_1
+               OpStore %i %80
+         %81 = OpAccessChain %_ptr_Private_int %data %79
+         %82 = OpLoad %int %81
+         %83 = OpAccessChain %_ptr_Private_int %temp %77
+               OpStore %83 %82
+               OpBranch %74
+         %76 = OpLabel
+         %84 = OpLoad %int %k
+         %85 = OpIAdd %int %84 %int_1
+               OpStore %k %85
+         %86 = OpLoad %int %j
+         %87 = OpIAdd %int %86 %int_1
+               OpStore %j %87
+         %88 = OpAccessChain %_ptr_Private_int %data %86
+         %89 = OpLoad %int %88
+         %90 = OpAccessChain %_ptr_Private_int %temp %84
+               OpStore %90 %89
+               OpBranch %74
+         %74 = OpLabel
+               OpBranch %49
+         %49 = OpLabel
+               OpBranch %47
+         %48 = OpLabel
+               OpBranch %91
+         %91 = OpLabel
+               OpLoopMerge %92 %93 None
+               OpBranch %94
+         %94 = OpLabel
+         %95 = OpLoad %int %i
+         %96 = OpLoad %int %i
+         %98 = OpLoad %int %mid
+        %100 = OpSLessThan %bool %95 %int_10
+               OpSelectionMerge %101 None
+               OpBranchConditional %100 %102 %101
+        %102 = OpLabel
+        %103 = OpSLessThanEqual %bool %96 %98
+               OpBranch %101
+        %101 = OpLabel
+        %104 = OpPhi %bool %100 %94 %103 %102
+               OpSelectionMerge %105 None
+               OpBranchConditional %104 %106 %107
+        %106 = OpLabel
+               OpBranch %105
+        %107 = OpLabel
+               OpBranch %92
+        %105 = OpLabel
+        %108 = OpLoad %int %k
+        %109 = OpIAdd %int %108 %int_1
+               OpStore %k %109
+        %110 = OpLoad %int %i
+        %111 = OpIAdd %int %110 %int_1
+               OpStore %i %111
+        %112 = OpAccessChain %_ptr_Private_int %data %110
+        %113 = OpLoad %int %112
+        %114 = OpAccessChain %_ptr_Private_int %temp %108
+               OpStore %114 %113
+               OpBranch %93
+         %93 = OpLabel
+               OpBranch %91
+         %92 = OpLabel
+        %116 = OpLoad %int %from
+               OpStore %i_1 %116
+               OpBranch %117
+        %117 = OpLabel
+               OpLoopMerge %118 %119 None
+               OpBranch %120
+        %120 = OpLabel
+        %121 = OpLoad %int %i_1
+        %123 = OpLoad %int %to
+        %124 = OpSLessThanEqual %bool %121 %123
+               OpSelectionMerge %125 None
+               OpBranchConditional %124 %126 %127
+        %126 = OpLabel
+               OpBranch %125
+        %127 = OpLabel
+               OpBranch %118
+        %125 = OpLabel
+        %128 = OpLoad %int %i_1
+        %129 = OpLoad %int %i_1
+        %130 = OpAccessChain %_ptr_Private_int %temp %129
+        %131 = OpLoad %int %130
+        %132 = OpAccessChain %_ptr_Private_int %data %128
+               OpStore %132 %131
+               OpBranch %119
+        %119 = OpLabel
+        %133 = OpLoad %int %i_1
+        %134 = OpIAdd %int %133 %int_1
+               OpStore %i_1 %134
+               OpBranch %117
+        %118 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %mergeSort_ = OpFunction %void None %135
+        %137 = OpLabel
+        %low = OpVariable %_ptr_Function_int Function %35
+       %high = OpVariable %_ptr_Function_int Function %35
+          %m = OpVariable %_ptr_Function_int Function %35
+        %i_2 = OpVariable %_ptr_Function_int Function %35
+     %from_1 = OpVariable %_ptr_Function_int Function %35
+      %mid_1 = OpVariable %_ptr_Function_int Function %35
+       %to_1 = OpVariable %_ptr_Function_int Function %35
+      %param = OpVariable %_ptr_Function_int Function %35
+    %param_1 = OpVariable %_ptr_Function_int Function %35
+    %param_2 = OpVariable %_ptr_Function_int Function %35
+               OpStore %low %int_0
+               OpStore %high %int_9
+               OpStore %m %int_1
+               OpBranch %150
+        %150 = OpLabel
+               OpLoopMerge %151 %152 None
+               OpBranch %153
+        %153 = OpLabel
+        %154 = OpLoad %int %m
+        %155 = OpLoad %int %high
+        %156 = OpSLessThanEqual %bool %154 %155
+               OpSelectionMerge %157 None
+               OpBranchConditional %156 %158 %159
+        %158 = OpLabel
+               OpBranch %157
+        %159 = OpLabel
+               OpBranch %151
+        %157 = OpLabel
+        %160 = OpLoad %int %low
+               OpStore %i_2 %160
+               OpBranch %161
+        %161 = OpLabel
+               OpLoopMerge %162 %163 None
+               OpBranch %164
+        %164 = OpLabel
+        %165 = OpLoad %int %i_2
+        %166 = OpLoad %int %high
+        %167 = OpSLessThan %bool %165 %166
+               OpSelectionMerge %168 None
+               OpBranchConditional %167 %169 %170
+        %169 = OpLabel
+               OpBranch %168
+        %170 = OpLabel
+               OpBranch %162
+        %168 = OpLabel
+        %171 = OpLoad %int %i_2
+               OpStore %from_1 %171
+        %172 = OpLoad %int %i_2
+        %173 = OpLoad %int %m
+        %174 = OpIAdd %int %172 %173
+        %175 = OpISub %int %174 %int_1
+               OpStore %mid_1 %175
+        %176 = OpLoad %int %i_2
+        %177 = OpLoad %int %m
+        %178 = OpLoad %int %high
+        %182 = OpIMul %int %int_2 %177
+        %183 = OpIAdd %int %176 %182
+        %184 = OpISub %int %183 %int_1
+        %179 = OpExtInst %int %180 SMin %184 %178
+               OpStore %to_1 %179
+        %185 = OpLoad %int %from_1
+               OpStore %param %185
+        %186 = OpLoad %int %mid_1
+               OpStore %param_1 %186
+        %187 = OpLoad %int %to_1
+               OpStore %param_2 %187
+        %188 = OpFunctionCall %void %merge_i1_i1_i1_ %param %param_1 %param_2
+               OpBranch %163
+        %163 = OpLabel
+        %192 = OpLoad %int %m
+        %193 = OpLoad %int %i_2
+        %194 = OpIMul %int %int_2 %192
+        %195 = OpIAdd %int %193 %194
+               OpStore %i_2 %195
+               OpBranch %161
+        %162 = OpLabel
+               OpBranch %152
+        %152 = OpLabel
+        %196 = OpLoad %int %m
+        %197 = OpIMul %int %int_2 %196
+               OpStore %m %197
+               OpBranch %150
+        %151 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %135
+        %199 = OpLabel
+        %i_3 = OpVariable %_ptr_Function_int Function %35
+        %j_1 = OpVariable %_ptr_Function_int Function %35
+       %grey = OpVariable %_ptr_Function_float Function %204
+        %207 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_0
+        %208 = OpLoad %float %207
+        %209 = OpConvertFToS %int %208
+               OpStore %i_3 %209
+               OpBranch %210
+        %210 = OpLabel
+               OpLoopMerge %211 %212 None
+               OpBranch %213
+        %213 = OpLabel
+        %214 = OpLoad %int %i_3
+               OpSelectionMerge %215 None
+               OpSwitch %214 %216 9 %217 8 %218 7 %219 6 %220 5 %221 4 %222 3 %223 2 %224 1 %225 0 %226
+        %217 = OpLabel
+        %227 = OpLoad %int %i_3
+        %228 = OpAccessChain %_ptr_Private_int %data %227
+               OpStore %228 %int_n5
+               OpBranch %215
+        %218 = OpLabel
+        %230 = OpLoad %int %i_3
+        %231 = OpAccessChain %_ptr_Private_int %data %230
+               OpStore %231 %int_n4
+               OpBranch %215
+        %219 = OpLabel
+        %233 = OpLoad %int %i_3
+        %234 = OpAccessChain %_ptr_Private_int %data %233
+               OpStore %234 %int_n3
+               OpBranch %215
+        %220 = OpLabel
+        %236 = OpLoad %int %i_3
+        %237 = OpAccessChain %_ptr_Private_int %data %236
+               OpStore %237 %int_n2
+               OpBranch %215
+        %221 = OpLabel
+        %239 = OpLoad %int %i_3
+        %240 = OpAccessChain %_ptr_Private_int %data %239
+               OpStore %240 %int_n1
+               OpBranch %215
+        %222 = OpLabel
+        %242 = OpLoad %int %i_3
+        %243 = OpAccessChain %_ptr_Private_int %data %242
+               OpStore %243 %int_0
+               OpBranch %215
+        %223 = OpLabel
+        %244 = OpLoad %int %i_3
+        %245 = OpAccessChain %_ptr_Private_int %data %244
+               OpStore %245 %int_1
+               OpBranch %215
+        %224 = OpLabel
+        %246 = OpLoad %int %i_3
+        %247 = OpAccessChain %_ptr_Private_int %data %246
+               OpStore %247 %int_2
+               OpBranch %215
+        %225 = OpLabel
+        %248 = OpLoad %int %i_3
+        %249 = OpAccessChain %_ptr_Private_int %data %248
+               OpStore %249 %int_3
+               OpBranch %215
+        %226 = OpLabel
+        %251 = OpLoad %int %i_3
+        %252 = OpAccessChain %_ptr_Private_int %data %251
+               OpStore %252 %int_4
+               OpBranch %215
+        %216 = OpLabel
+               OpBranch %215
+        %215 = OpLabel
+        %254 = OpLoad %int %i_3
+        %255 = OpIAdd %int %254 %int_1
+               OpStore %i_3 %255
+               OpBranch %212
+        %212 = OpLabel
+        %256 = OpLoad %int %i_3
+        %257 = OpSLessThan %bool %256 %int_10
+               OpSelectionMerge %258 None
+               OpBranchConditional %257 %259 %260
+        %259 = OpLabel
+               OpBranch %258
+        %260 = OpLabel
+               OpBranch %211
+        %258 = OpLabel
+               OpBranch %210
+        %211 = OpLabel
+               OpStore %j_1 %int_0
+               OpBranch %261
+        %261 = OpLabel
+               OpLoopMerge %262 %263 None
+               OpBranch %264
+        %264 = OpLabel
+        %265 = OpLoad %int %j_1
+        %266 = OpSLessThan %bool %265 %int_10
+               OpSelectionMerge %267 None
+               OpBranchConditional %266 %268 %269
+        %268 = OpLabel
+               OpBranch %267
+        %269 = OpLabel
+               OpBranch %262
+        %267 = OpLabel
+        %270 = OpLoad %int %j_1
+        %271 = OpLoad %int %j_1
+        %272 = OpAccessChain %_ptr_Private_int %data %271
+        %273 = OpLoad %int %272
+        %274 = OpAccessChain %_ptr_Private_int %temp %270
+               OpStore %274 %273
+               OpBranch %263
+        %263 = OpLabel
+        %275 = OpLoad %int %j_1
+        %276 = OpIAdd %int %275 %int_1
+               OpStore %j_1 %276
+               OpBranch %261
+        %262 = OpLabel
+        %277 = OpFunctionCall %void %mergeSort_
+        %280 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %281 = OpLoad %float %280
+        %282 = OpConvertFToS %int %281
+        %284 = OpSLessThan %bool %282 %int_30
+               OpSelectionMerge %285 None
+               OpBranchConditional %284 %286 %287
+        %286 = OpLabel
+        %288 = OpAccessChain %_ptr_Private_int %data %int_0
+        %289 = OpLoad %int %288
+        %291 = OpConvertSToF %float %289
+        %293 = OpFDiv %float %291 %float_10
+        %294 = OpFAdd %float %float_0_5 %293
+               OpStore %grey %294
+               OpBranch %285
+        %287 = OpLabel
+        %295 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %296 = OpLoad %float %295
+        %297 = OpConvertFToS %int %296
+        %299 = OpSLessThan %bool %297 %int_60
+               OpSelectionMerge %300 None
+               OpBranchConditional %299 %301 %302
+        %301 = OpLabel
+        %303 = OpAccessChain %_ptr_Private_int %data %int_1
+        %304 = OpLoad %int %303
+        %305 = OpConvertSToF %float %304
+        %306 = OpFDiv %float %305 %float_10
+        %307 = OpFAdd %float %float_0_5 %306
+               OpStore %grey %307
+               OpBranch %300
+        %302 = OpLabel
+        %308 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %309 = OpLoad %float %308
+        %310 = OpConvertFToS %int %309
+        %312 = OpSLessThan %bool %310 %int_90
+               OpSelectionMerge %313 None
+               OpBranchConditional %312 %314 %315
+        %314 = OpLabel
+        %316 = OpAccessChain %_ptr_Private_int %data %int_2
+        %317 = OpLoad %int %316
+        %318 = OpConvertSToF %float %317
+        %319 = OpFDiv %float %318 %float_10
+        %320 = OpFAdd %float %float_0_5 %319
+               OpStore %grey %320
+               OpBranch %313
+        %315 = OpLabel
+        %321 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %322 = OpLoad %float %321
+        %323 = OpConvertFToS %int %322
+        %325 = OpSLessThan %bool %323 %int_120
+               OpSelectionMerge %326 None
+               OpBranchConditional %325 %327 %328
+        %327 = OpLabel
+        %329 = OpAccessChain %_ptr_Private_int %data %int_3
+        %330 = OpLoad %int %329
+        %331 = OpConvertSToF %float %330
+        %332 = OpFDiv %float %331 %float_10
+        %333 = OpFAdd %float %float_0_5 %332
+               OpStore %grey %333
+               OpBranch %326
+        %328 = OpLabel
+        %334 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %335 = OpLoad %float %334
+        %336 = OpConvertFToS %int %335
+        %338 = OpSLessThan %bool %336 %int_150
+               OpSelectionMerge %339 None
+               OpBranchConditional %338 %340 %341
+        %340 = OpLabel
+               OpKill
+        %341 = OpLabel
+        %342 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %343 = OpLoad %float %342
+        %344 = OpConvertFToS %int %343
+        %346 = OpSLessThan %bool %344 %int_180
+               OpSelectionMerge %347 None
+               OpBranchConditional %346 %348 %349
+        %348 = OpLabel
+        %351 = OpAccessChain %_ptr_Private_int %data %int_5
+        %352 = OpLoad %int %351
+        %353 = OpConvertSToF %float %352
+        %354 = OpFDiv %float %353 %float_10
+        %355 = OpFAdd %float %float_0_5 %354
+               OpStore %grey %355
+               OpBranch %347
+        %349 = OpLabel
+        %356 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %357 = OpLoad %float %356
+        %358 = OpConvertFToS %int %357
+        %360 = OpSLessThan %bool %358 %int_210
+               OpSelectionMerge %361 None
+               OpBranchConditional %360 %362 %363
+        %362 = OpLabel
+        %365 = OpAccessChain %_ptr_Private_int %data %int_6
+        %366 = OpLoad %int %365
+        %367 = OpConvertSToF %float %366
+        %368 = OpFDiv %float %367 %float_10
+        %369 = OpFAdd %float %float_0_5 %368
+               OpStore %grey %369
+               OpBranch %361
+        %363 = OpLabel
+        %370 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %371 = OpLoad %float %370
+        %372 = OpConvertFToS %int %371
+        %374 = OpSLessThan %bool %372 %int_240
+               OpSelectionMerge %375 None
+               OpBranchConditional %374 %376 %377
+        %376 = OpLabel
+        %379 = OpAccessChain %_ptr_Private_int %data %int_7
+        %380 = OpLoad %int %379
+        %381 = OpConvertSToF %float %380
+        %382 = OpFDiv %float %381 %float_10
+        %383 = OpFAdd %float %float_0_5 %382
+               OpStore %grey %383
+               OpBranch %375
+        %377 = OpLabel
+        %384 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %385 = OpLoad %float %384
+        %386 = OpConvertFToS %int %385
+        %388 = OpSLessThan %bool %386 %int_270
+               OpSelectionMerge %389 None
+               OpBranchConditional %388 %390 %391
+        %390 = OpLabel
+        %393 = OpAccessChain %_ptr_Private_int %data %int_8
+        %394 = OpLoad %int %393
+        %395 = OpConvertSToF %float %394
+        %396 = OpFDiv %float %395 %float_10
+        %397 = OpFAdd %float %float_0_5 %396
+               OpStore %grey %397
+               OpBranch %389
+        %391 = OpLabel
+               OpKill
+        %389 = OpLabel
+               OpBranch %375
+        %375 = OpLabel
+               OpBranch %361
+        %361 = OpLabel
+               OpBranch %347
+        %347 = OpLabel
+               OpBranch %339
+        %339 = OpLabel
+               OpBranch %326
+        %326 = OpLabel
+               OpBranch %313
+        %313 = OpLabel
+               OpBranch %300
+        %300 = OpLabel
+               OpBranch %285
+        %285 = OpLabel
+        %398 = OpLoad %float %grey
+        %400 = OpCompositeConstruct %v3float %398 %398 %398
+        %401 = OpCompositeExtract %float %400 0
+        %402 = OpCompositeExtract %float %400 1
+        %403 = OpCompositeExtract %float %400 2
+        %405 = OpCompositeConstruct %v4float %401 %402 %403 %float_1
+               OpStore %x_GLF_color %405
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %406
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %410 = OpLabel
+        %411 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %411
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %135
+        %413 = OpLabel
+        %414 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %414
+        %415 = OpFunctionCall %void %main_1
+        %417 = OpLoad %v4float %x_GLF_color
+        %418 = OpCompositeConstruct %main_out %417
+        %416 = OpFunctionCall %void %tint_symbol_3 %418
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 212[%212] is not post dominated by the back-edge block 258[%258]
+  %258 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..e61feb5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,313 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[block]]
+struct buf1 {
+  resolution : vec2<f32>;
+};
+
+var<private> data : array<i32, 10>;
+
+var<private> temp : array<i32, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_32 : buf1;
+
+fn merge_i1_i1_i1_(from : ptr<function, i32>, mid : ptr<function, i32>, to : ptr<function, i32>) {
+  var k : i32;
+  var i : i32;
+  var j : i32;
+  var i_1 : i32;
+  let x_254 : i32 = *(from);
+  k = x_254;
+  let x_255 : i32 = *(from);
+  i = x_255;
+  let x_256 : i32 = *(mid);
+  j = (x_256 + 1);
+  loop {
+    let x_262 : i32 = i;
+    let x_263 : i32 = *(mid);
+    let x_265 : i32 = j;
+    let x_266 : i32 = *(to);
+    if (((x_262 <= x_263) && (x_265 <= x_266))) {
+    } else {
+      break;
+    }
+    let x_270 : i32 = i;
+    let x_272 : i32 = data[x_270];
+    let x_273 : i32 = j;
+    let x_275 : i32 = data[x_273];
+    if ((x_272 < x_275)) {
+      let x_280 : i32 = k;
+      k = (x_280 + 1);
+      let x_282 : i32 = i;
+      i = (x_282 + 1);
+      let x_285 : i32 = data[x_282];
+      temp[x_280] = x_285;
+    } else {
+      let x_287 : i32 = k;
+      k = (x_287 + 1);
+      let x_289 : i32 = j;
+      j = (x_289 + 1);
+      let x_292 : i32 = data[x_289];
+      temp[x_287] = x_292;
+    }
+  }
+  loop {
+    let x_298 : i32 = i;
+    let x_300 : i32 = i;
+    let x_301 : i32 = *(mid);
+    if (((x_298 < 10) && (x_300 <= x_301))) {
+    } else {
+      break;
+    }
+    let x_305 : i32 = k;
+    k = (x_305 + 1);
+    let x_307 : i32 = i;
+    i = (x_307 + 1);
+    let x_310 : i32 = data[x_307];
+    temp[x_305] = x_310;
+  }
+  let x_312 : i32 = *(from);
+  i_1 = x_312;
+  loop {
+    let x_317 : i32 = i_1;
+    let x_318 : i32 = *(to);
+    if ((x_317 <= x_318)) {
+    } else {
+      break;
+    }
+    let x_321 : i32 = i_1;
+    let x_322 : i32 = i_1;
+    let x_324 : i32 = temp[x_322];
+    data[x_321] = x_324;
+
+    continuing {
+      let x_326 : i32 = i_1;
+      i_1 = (x_326 + 1);
+    }
+  }
+  return;
+}
+
+fn mergeSort_() {
+  var low : i32;
+  var high : i32;
+  var m : i32;
+  var i_2 : i32;
+  var from_1 : i32;
+  var mid_1 : i32;
+  var to_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  low = 0;
+  high = 9;
+  m = 1;
+  loop {
+    let x_333 : i32 = m;
+    let x_334 : i32 = high;
+    if ((x_333 <= x_334)) {
+    } else {
+      break;
+    }
+    let x_337 : i32 = low;
+    i_2 = x_337;
+    loop {
+      let x_342 : i32 = i_2;
+      let x_343 : i32 = high;
+      if ((x_342 < x_343)) {
+      } else {
+        break;
+      }
+      let x_346 : i32 = i_2;
+      from_1 = x_346;
+      let x_347 : i32 = i_2;
+      let x_348 : i32 = m;
+      mid_1 = ((x_347 + x_348) - 1);
+      let x_351 : i32 = i_2;
+      let x_352 : i32 = m;
+      let x_356 : i32 = high;
+      to_1 = min(((x_351 + (2 * x_352)) - 1), x_356);
+      let x_358 : i32 = from_1;
+      param = x_358;
+      let x_359 : i32 = mid_1;
+      param_1 = x_359;
+      let x_360 : i32 = to_1;
+      param_2 = x_360;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2));
+
+      continuing {
+        let x_362 : i32 = m;
+        let x_364 : i32 = i_2;
+        i_2 = (x_364 + (2 * x_362));
+      }
+    }
+
+    continuing {
+      let x_366 : i32 = m;
+      m = (2 * x_366);
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_3 : i32;
+  var j_1 : i32;
+  var grey : f32;
+  let x_87 : f32 = x_28.injectionSwitch.x;
+  i_3 = i32(x_87);
+  loop {
+    let x_93 : i32 = i_3;
+    switch(x_93) {
+      case 9: {
+        let x_123 : i32 = i_3;
+        data[x_123] = -5;
+      }
+      case 8: {
+        let x_121 : i32 = i_3;
+        data[x_121] = -4;
+      }
+      case 7: {
+        let x_119 : i32 = i_3;
+        data[x_119] = -3;
+      }
+      case 6: {
+        let x_117 : i32 = i_3;
+        data[x_117] = -2;
+      }
+      case 5: {
+        let x_115 : i32 = i_3;
+        data[x_115] = -1;
+      }
+      case 4: {
+        let x_113 : i32 = i_3;
+        data[x_113] = 0;
+      }
+      case 3: {
+        let x_111 : i32 = i_3;
+        data[x_111] = 1;
+      }
+      case 2: {
+        let x_109 : i32 = i_3;
+        data[x_109] = 2;
+      }
+      case 1: {
+        let x_107 : i32 = i_3;
+        data[x_107] = 3;
+      }
+      case 0: {
+        let x_105 : i32 = i_3;
+        data[x_105] = 4;
+      }
+      default: {
+      }
+    }
+    let x_125 : i32 = i_3;
+    i_3 = (x_125 + 1);
+
+    continuing {
+      let x_127 : i32 = i_3;
+      if ((x_127 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  loop {
+    let x_133 : i32 = j_1;
+    if ((x_133 < 10)) {
+    } else {
+      break;
+    }
+    let x_136 : i32 = j_1;
+    let x_137 : i32 = j_1;
+    let x_139 : i32 = data[x_137];
+    temp[x_136] = x_139;
+
+    continuing {
+      let x_141 : i32 = j_1;
+      j_1 = (x_141 + 1);
+    }
+  }
+  mergeSort_();
+  let x_145 : f32 = gl_FragCoord.y;
+  if ((i32(x_145) < 30)) {
+    let x_152 : i32 = data[0];
+    grey = (0.5 + (f32(x_152) / 10.0));
+  } else {
+    let x_157 : f32 = gl_FragCoord.y;
+    if ((i32(x_157) < 60)) {
+      let x_164 : i32 = data[1];
+      grey = (0.5 + (f32(x_164) / 10.0));
+    } else {
+      let x_169 : f32 = gl_FragCoord.y;
+      if ((i32(x_169) < 90)) {
+        let x_176 : i32 = data[2];
+        grey = (0.5 + (f32(x_176) / 10.0));
+      } else {
+        let x_181 : f32 = gl_FragCoord.y;
+        if ((i32(x_181) < 120)) {
+          let x_188 : i32 = data[3];
+          grey = (0.5 + (f32(x_188) / 10.0));
+        } else {
+          let x_193 : f32 = gl_FragCoord.y;
+          if ((i32(x_193) < 150)) {
+            discard;
+          } else {
+            let x_200 : f32 = gl_FragCoord.y;
+            if ((i32(x_200) < 180)) {
+              let x_207 : i32 = data[5];
+              grey = (0.5 + (f32(x_207) / 10.0));
+            } else {
+              let x_212 : f32 = gl_FragCoord.y;
+              if ((i32(x_212) < 210)) {
+                let x_219 : i32 = data[6];
+                grey = (0.5 + (f32(x_219) / 10.0));
+              } else {
+                let x_224 : f32 = gl_FragCoord.y;
+                if ((i32(x_224) < 240)) {
+                  let x_231 : i32 = data[7];
+                  grey = (0.5 + (f32(x_231) / 10.0));
+                } else {
+                  let x_236 : f32 = gl_FragCoord.y;
+                  if ((i32(x_236) < 270)) {
+                    let x_243 : i32 = data[8];
+                    grey = (0.5 + (f32(x_243) / 10.0));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  let x_247 : f32 = grey;
+  let x_248 : vec3<f32> = vec3<f32>(x_247, x_247, x_247);
+  x_GLF_color = vec4<f32>(x_248.x, x_248.y, x_248.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/1.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/1.spvasm
new file mode 100644
index 0000000..1746285
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/1.spvasm
@@ -0,0 +1,566 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %merge_i1_i1_i1_ "merge(i1;i1;i1;"
+               OpName %from "from"
+               OpName %mid "mid"
+               OpName %to "to"
+               OpName %mergeSort_ "mergeSort("
+               OpName %k "k"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %data "data"
+               OpName %temp "temp"
+               OpName %i_0 "i"
+               OpName %low "low"
+               OpName %high "high"
+               OpName %m "m"
+               OpName %i_1 "i"
+               OpName %from_0 "from"
+               OpName %mid_0 "mid"
+               OpName %to_0 "to"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %param_1 "param"
+               OpName %i_2 "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %j_0 "j"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %grey "grey"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "resolution"
+               OpName %__0 ""
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+       %void = OpTypeVoid
+         %34 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %37 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int %_ptr_Function_int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Private__arr_int_uint_10 = OpTypePointer Private %_arr_int_uint_10
+       %data = OpVariable %_ptr_Private__arr_int_uint_10 Private
+%_ptr_Private_int = OpTypePointer Private %int
+       %temp = OpVariable %_ptr_Private__arr_int_uint_10 Private
+     %int_10 = OpConstant %int 10
+      %int_0 = OpConstant %int 0
+      %int_9 = OpConstant %int 9
+      %int_2 = OpConstant %int 2
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_4 = OpConstant %int 4
+      %int_3 = OpConstant %int 3
+     %int_n1 = OpConstant %int -1
+     %int_n2 = OpConstant %int -2
+     %int_n3 = OpConstant %int -3
+     %int_n4 = OpConstant %int -4
+     %int_n5 = OpConstant %int -5
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+     %int_30 = OpConstant %int 30
+%_ptr_Function_float = OpTypePointer Function %float
+  %float_0_5 = OpConstant %float 0.5
+   %float_10 = OpConstant %float 10
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %v3float = OpTypeVector %float 3
+    %float_1 = OpConstant %float 1
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+       %true = OpConstantTrue %bool
+       %main = OpFunction %void None %34
+         %86 = OpLabel
+        %i_2 = OpVariable %_ptr_Function_int Function
+        %j_0 = OpVariable %_ptr_Function_int Function
+       %grey = OpVariable %_ptr_Function_float Function
+         %87 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %88 = OpLoad %float %87
+         %89 = OpConvertFToS %int %88
+               OpStore %i_2 %89
+               OpBranch %90
+         %90 = OpLabel
+               OpLoopMerge %91 %92 None
+               OpBranch %93
+         %93 = OpLabel
+         %94 = OpLoad %int %i_2
+               OpSelectionMerge %95 None
+               OpSwitch %94 %95 0 %96 1 %97 2 %98 3 %99 4 %100 5 %101 6 %102 7 %103 8 %104 9 %105
+         %96 = OpLabel
+        %106 = OpLoad %int %i_2
+        %107 = OpAccessChain %_ptr_Private_int %data %106
+               OpStore %107 %int_4
+               OpBranch %95
+         %97 = OpLabel
+        %108 = OpLoad %int %i_2
+        %109 = OpAccessChain %_ptr_Private_int %data %108
+               OpStore %109 %int_3
+               OpBranch %95
+         %98 = OpLabel
+        %110 = OpLoad %int %i_2
+        %111 = OpAccessChain %_ptr_Private_int %data %110
+               OpStore %111 %int_2
+               OpBranch %95
+         %99 = OpLabel
+        %112 = OpLoad %int %i_2
+        %113 = OpAccessChain %_ptr_Private_int %data %112
+               OpStore %113 %int_1
+               OpBranch %95
+        %100 = OpLabel
+        %114 = OpLoad %int %i_2
+        %115 = OpAccessChain %_ptr_Private_int %data %114
+               OpStore %115 %int_0
+               OpBranch %95
+        %101 = OpLabel
+        %116 = OpLoad %int %i_2
+        %117 = OpAccessChain %_ptr_Private_int %data %116
+               OpStore %117 %int_n1
+               OpBranch %95
+        %102 = OpLabel
+        %118 = OpLoad %int %i_2
+        %119 = OpAccessChain %_ptr_Private_int %data %118
+               OpStore %119 %int_n2
+               OpBranch %95
+        %103 = OpLabel
+        %120 = OpLoad %int %i_2
+        %121 = OpAccessChain %_ptr_Private_int %data %120
+               OpStore %121 %int_n3
+               OpBranch %95
+        %104 = OpLabel
+        %122 = OpLoad %int %i_2
+        %123 = OpAccessChain %_ptr_Private_int %data %122
+               OpStore %123 %int_n4
+               OpBranch %95
+        %105 = OpLabel
+        %124 = OpLoad %int %i_2
+        %125 = OpAccessChain %_ptr_Private_int %data %124
+               OpStore %125 %int_n5
+               OpBranchConditional %true %95 %92
+         %95 = OpLabel
+        %126 = OpLoad %int %i_2
+        %127 = OpIAdd %int %126 %int_1
+               OpStore %i_2 %127
+               OpBranchConditional %true %92 %92
+         %92 = OpLabel
+        %128 = OpLoad %int %i_2
+        %129 = OpSLessThan %bool %128 %int_10
+               OpBranchConditional %129 %90 %91
+         %91 = OpLabel
+               OpStore %j_0 %int_0
+               OpBranch %130
+        %130 = OpLabel
+               OpLoopMerge %131 %132 None
+               OpBranch %133
+        %133 = OpLabel
+        %134 = OpLoad %int %j_0
+        %135 = OpSLessThan %bool %134 %int_10
+               OpBranchConditional %135 %136 %131
+        %136 = OpLabel
+        %137 = OpLoad %int %j_0
+        %138 = OpLoad %int %j_0
+        %139 = OpAccessChain %_ptr_Private_int %data %138
+        %140 = OpLoad %int %139
+        %141 = OpAccessChain %_ptr_Private_int %temp %137
+               OpStore %141 %140
+               OpBranch %132
+        %132 = OpLabel
+        %142 = OpLoad %int %j_0
+        %143 = OpIAdd %int %142 %int_1
+               OpStore %j_0 %143
+               OpBranch %130
+        %131 = OpLabel
+        %144 = OpFunctionCall %void %mergeSort_
+        %145 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %146 = OpLoad %float %145
+        %147 = OpConvertFToS %int %146
+        %148 = OpSLessThan %bool %147 %int_30
+               OpSelectionMerge %149 None
+               OpBranchConditional %148 %150 %151
+        %150 = OpLabel
+        %152 = OpAccessChain %_ptr_Private_int %data %int_0
+        %153 = OpLoad %int %152
+        %154 = OpConvertSToF %float %153
+        %155 = OpFDiv %float %154 %float_10
+        %156 = OpFAdd %float %float_0_5 %155
+               OpStore %grey %156
+               OpBranch %149
+        %151 = OpLabel
+        %157 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %158 = OpLoad %float %157
+        %159 = OpConvertFToS %int %158
+        %160 = OpSLessThan %bool %159 %int_60
+               OpSelectionMerge %161 None
+               OpBranchConditional %160 %162 %163
+        %162 = OpLabel
+        %164 = OpAccessChain %_ptr_Private_int %data %int_1
+        %165 = OpLoad %int %164
+        %166 = OpConvertSToF %float %165
+        %167 = OpFDiv %float %166 %float_10
+        %168 = OpFAdd %float %float_0_5 %167
+               OpStore %grey %168
+               OpBranch %161
+        %163 = OpLabel
+        %169 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %170 = OpLoad %float %169
+        %171 = OpConvertFToS %int %170
+        %172 = OpSLessThan %bool %171 %int_90
+               OpSelectionMerge %173 None
+               OpBranchConditional %172 %174 %175
+        %174 = OpLabel
+        %176 = OpAccessChain %_ptr_Private_int %data %int_2
+        %177 = OpLoad %int %176
+        %178 = OpConvertSToF %float %177
+        %179 = OpFDiv %float %178 %float_10
+        %180 = OpFAdd %float %float_0_5 %179
+               OpStore %grey %180
+               OpBranch %173
+        %175 = OpLabel
+        %181 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %182 = OpLoad %float %181
+        %183 = OpConvertFToS %int %182
+        %184 = OpSLessThan %bool %183 %int_120
+               OpSelectionMerge %185 None
+               OpBranchConditional %184 %186 %187
+        %186 = OpLabel
+        %188 = OpAccessChain %_ptr_Private_int %data %int_3
+        %189 = OpLoad %int %188
+        %190 = OpConvertSToF %float %189
+        %191 = OpFDiv %float %190 %float_10
+        %192 = OpFAdd %float %float_0_5 %191
+               OpStore %grey %192
+               OpBranch %185
+        %187 = OpLabel
+        %193 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %194 = OpLoad %float %193
+        %195 = OpConvertFToS %int %194
+        %196 = OpSLessThan %bool %195 %int_150
+               OpSelectionMerge %197 None
+               OpBranchConditional %196 %198 %199
+        %198 = OpLabel
+               OpKill
+        %199 = OpLabel
+        %200 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %201 = OpLoad %float %200
+        %202 = OpConvertFToS %int %201
+        %203 = OpSLessThan %bool %202 %int_180
+               OpSelectionMerge %204 None
+               OpBranchConditional %203 %205 %206
+        %205 = OpLabel
+        %207 = OpAccessChain %_ptr_Private_int %data %int_5
+        %208 = OpLoad %int %207
+        %209 = OpConvertSToF %float %208
+        %210 = OpFDiv %float %209 %float_10
+        %211 = OpFAdd %float %float_0_5 %210
+               OpStore %grey %211
+               OpBranch %204
+        %206 = OpLabel
+        %212 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %213 = OpLoad %float %212
+        %214 = OpConvertFToS %int %213
+        %215 = OpSLessThan %bool %214 %int_210
+               OpSelectionMerge %216 None
+               OpBranchConditional %215 %217 %218
+        %217 = OpLabel
+        %219 = OpAccessChain %_ptr_Private_int %data %int_6
+        %220 = OpLoad %int %219
+        %221 = OpConvertSToF %float %220
+        %222 = OpFDiv %float %221 %float_10
+        %223 = OpFAdd %float %float_0_5 %222
+               OpStore %grey %223
+               OpBranch %216
+        %218 = OpLabel
+        %224 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %225 = OpLoad %float %224
+        %226 = OpConvertFToS %int %225
+        %227 = OpSLessThan %bool %226 %int_240
+               OpSelectionMerge %228 None
+               OpBranchConditional %227 %229 %230
+        %229 = OpLabel
+        %231 = OpAccessChain %_ptr_Private_int %data %int_7
+        %232 = OpLoad %int %231
+        %233 = OpConvertSToF %float %232
+        %234 = OpFDiv %float %233 %float_10
+        %235 = OpFAdd %float %float_0_5 %234
+               OpStore %grey %235
+               OpBranch %228
+        %230 = OpLabel
+        %236 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %237 = OpLoad %float %236
+        %238 = OpConvertFToS %int %237
+        %239 = OpSLessThan %bool %238 %int_270
+               OpSelectionMerge %240 None
+               OpBranchConditional %239 %241 %242
+        %241 = OpLabel
+        %243 = OpAccessChain %_ptr_Private_int %data %int_8
+        %244 = OpLoad %int %243
+        %245 = OpConvertSToF %float %244
+        %246 = OpFDiv %float %245 %float_10
+        %247 = OpFAdd %float %float_0_5 %246
+               OpStore %grey %247
+               OpBranch %240
+        %242 = OpLabel
+               OpKill
+        %240 = OpLabel
+               OpBranch %228
+        %228 = OpLabel
+               OpBranch %216
+        %216 = OpLabel
+               OpBranch %204
+        %204 = OpLabel
+               OpBranch %197
+        %197 = OpLabel
+               OpBranch %185
+        %185 = OpLabel
+               OpBranch %173
+        %173 = OpLabel
+               OpBranch %161
+        %161 = OpLabel
+               OpBranch %149
+        %149 = OpLabel
+        %248 = OpLoad %float %grey
+        %249 = OpCompositeConstruct %v3float %248 %248 %248
+        %250 = OpCompositeExtract %float %249 0
+        %251 = OpCompositeExtract %float %249 1
+        %252 = OpCompositeExtract %float %249 2
+        %253 = OpCompositeConstruct %v4float %250 %251 %252 %float_1
+               OpStore %_GLF_color %253
+               OpReturn
+               OpFunctionEnd
+%merge_i1_i1_i1_ = OpFunction %void None %37
+       %from = OpFunctionParameter %_ptr_Function_int
+        %mid = OpFunctionParameter %_ptr_Function_int
+         %to = OpFunctionParameter %_ptr_Function_int
+        %254 = OpLabel
+          %k = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+          %j = OpVariable %_ptr_Function_int Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+        %255 = OpLoad %int %from
+               OpStore %k %255
+        %256 = OpLoad %int %from
+               OpStore %i %256
+        %257 = OpLoad %int %mid
+        %258 = OpIAdd %int %257 %int_1
+               OpStore %j %258
+               OpBranch %259
+        %259 = OpLabel
+               OpLoopMerge %260 %261 None
+               OpBranch %262
+        %262 = OpLabel
+        %263 = OpLoad %int %i
+        %264 = OpLoad %int %mid
+        %265 = OpSLessThanEqual %bool %263 %264
+        %266 = OpLoad %int %j
+        %267 = OpLoad %int %to
+        %268 = OpSLessThanEqual %bool %266 %267
+        %269 = OpLogicalAnd %bool %265 %268
+               OpBranchConditional %269 %270 %260
+        %270 = OpLabel
+        %271 = OpLoad %int %i
+        %272 = OpAccessChain %_ptr_Private_int %data %271
+        %273 = OpLoad %int %272
+        %274 = OpLoad %int %j
+        %275 = OpAccessChain %_ptr_Private_int %data %274
+        %276 = OpLoad %int %275
+        %277 = OpSLessThan %bool %273 %276
+               OpSelectionMerge %278 None
+               OpBranchConditional %277 %279 %280
+        %279 = OpLabel
+        %281 = OpLoad %int %k
+        %282 = OpIAdd %int %281 %int_1
+               OpStore %k %282
+        %283 = OpLoad %int %i
+        %284 = OpIAdd %int %283 %int_1
+               OpStore %i %284
+        %285 = OpAccessChain %_ptr_Private_int %data %283
+        %286 = OpLoad %int %285
+        %287 = OpAccessChain %_ptr_Private_int %temp %281
+               OpStore %287 %286
+               OpBranch %278
+        %280 = OpLabel
+        %288 = OpLoad %int %k
+        %289 = OpIAdd %int %288 %int_1
+               OpStore %k %289
+        %290 = OpLoad %int %j
+        %291 = OpIAdd %int %290 %int_1
+               OpStore %j %291
+        %292 = OpAccessChain %_ptr_Private_int %data %290
+        %293 = OpLoad %int %292
+        %294 = OpAccessChain %_ptr_Private_int %temp %288
+               OpStore %294 %293
+               OpBranch %278
+        %278 = OpLabel
+               OpBranch %261
+        %261 = OpLabel
+               OpBranch %259
+        %260 = OpLabel
+               OpBranch %295
+        %295 = OpLabel
+               OpLoopMerge %296 %297 None
+               OpBranch %298
+        %298 = OpLabel
+        %299 = OpLoad %int %i
+        %300 = OpSLessThan %bool %299 %int_10
+        %301 = OpLoad %int %i
+        %302 = OpLoad %int %mid
+        %303 = OpSLessThanEqual %bool %301 %302
+        %304 = OpLogicalAnd %bool %300 %303
+               OpBranchConditional %304 %305 %296
+        %305 = OpLabel
+        %306 = OpLoad %int %k
+        %307 = OpIAdd %int %306 %int_1
+               OpStore %k %307
+        %308 = OpLoad %int %i
+        %309 = OpIAdd %int %308 %int_1
+               OpStore %i %309
+        %310 = OpAccessChain %_ptr_Private_int %data %308
+        %311 = OpLoad %int %310
+        %312 = OpAccessChain %_ptr_Private_int %temp %306
+               OpStore %312 %311
+               OpBranch %297
+        %297 = OpLabel
+               OpBranch %295
+        %296 = OpLabel
+        %313 = OpLoad %int %from
+               OpStore %i_0 %313
+               OpBranch %314
+        %314 = OpLabel
+               OpLoopMerge %315 %316 None
+               OpBranch %317
+        %317 = OpLabel
+        %318 = OpLoad %int %i_0
+        %319 = OpLoad %int %to
+        %320 = OpSLessThanEqual %bool %318 %319
+               OpBranchConditional %320 %321 %315
+        %321 = OpLabel
+        %322 = OpLoad %int %i_0
+        %323 = OpLoad %int %i_0
+        %324 = OpAccessChain %_ptr_Private_int %temp %323
+        %325 = OpLoad %int %324
+        %326 = OpAccessChain %_ptr_Private_int %data %322
+               OpStore %326 %325
+               OpBranch %316
+        %316 = OpLabel
+        %327 = OpLoad %int %i_0
+        %328 = OpIAdd %int %327 %int_1
+               OpStore %i_0 %328
+               OpBranch %314
+        %315 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %mergeSort_ = OpFunction %void None %34
+        %329 = OpLabel
+        %low = OpVariable %_ptr_Function_int Function
+       %high = OpVariable %_ptr_Function_int Function
+          %m = OpVariable %_ptr_Function_int Function
+        %i_1 = OpVariable %_ptr_Function_int Function
+     %from_0 = OpVariable %_ptr_Function_int Function
+      %mid_0 = OpVariable %_ptr_Function_int Function
+       %to_0 = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_int Function
+    %param_0 = OpVariable %_ptr_Function_int Function
+    %param_1 = OpVariable %_ptr_Function_int Function
+               OpStore %low %int_0
+               OpStore %high %int_9
+               OpStore %m %int_1
+               OpBranch %330
+        %330 = OpLabel
+               OpLoopMerge %331 %332 None
+               OpBranch %333
+        %333 = OpLabel
+        %334 = OpLoad %int %m
+        %335 = OpLoad %int %high
+        %336 = OpSLessThanEqual %bool %334 %335
+               OpBranchConditional %336 %337 %331
+        %337 = OpLabel
+        %338 = OpLoad %int %low
+               OpStore %i_1 %338
+               OpBranch %339
+        %339 = OpLabel
+               OpLoopMerge %340 %341 None
+               OpBranch %342
+        %342 = OpLabel
+        %343 = OpLoad %int %i_1
+        %344 = OpLoad %int %high
+        %345 = OpSLessThan %bool %343 %344
+               OpBranchConditional %345 %346 %340
+        %346 = OpLabel
+        %347 = OpLoad %int %i_1
+               OpStore %from_0 %347
+        %348 = OpLoad %int %i_1
+        %349 = OpLoad %int %m
+        %350 = OpIAdd %int %348 %349
+        %351 = OpISub %int %350 %int_1
+               OpStore %mid_0 %351
+        %352 = OpLoad %int %i_1
+        %353 = OpLoad %int %m
+        %354 = OpIMul %int %int_2 %353
+        %355 = OpIAdd %int %352 %354
+        %356 = OpISub %int %355 %int_1
+        %357 = OpLoad %int %high
+        %358 = OpExtInst %int %1 SMin %356 %357
+               OpStore %to_0 %358
+        %359 = OpLoad %int %from_0
+               OpStore %param %359
+        %360 = OpLoad %int %mid_0
+               OpStore %param_0 %360
+        %361 = OpLoad %int %to_0
+               OpStore %param_1 %361
+        %362 = OpFunctionCall %void %merge_i1_i1_i1_ %param %param_0 %param_1
+               OpBranch %341
+        %341 = OpLabel
+        %363 = OpLoad %int %m
+        %364 = OpIMul %int %int_2 %363
+        %365 = OpLoad %int %i_1
+        %366 = OpIAdd %int %365 %364
+               OpStore %i_1 %366
+               OpBranch %339
+        %340 = OpLabel
+               OpBranch %332
+        %332 = OpLabel
+        %367 = OpLoad %int %m
+        %368 = OpIMul %int %int_2 %367
+               OpStore %m %368
+               OpBranch %330
+        %331 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..b6f582e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/1.spvasm.expected.hlsl
@@ -0,0 +1,281 @@
+static int data[10] = (int[10])0;
+static int temp[10] = (int[10])0;
+cbuffer cbuffer_x_28 : register(b0, space0) {
+  uint4 x_28[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_32 : register(b1, space0) {
+  uint4 x_32[1];
+};
+
+void merge_i1_i1_i1_(inout int from, inout int mid, inout int to) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  const int x_255 = from;
+  k = x_255;
+  const int x_256 = from;
+  i = x_256;
+  const int x_257 = mid;
+  j = (x_257 + 1);
+  while (true) {
+    const int x_263 = i;
+    const int x_264 = mid;
+    const int x_266 = j;
+    const int x_267 = to;
+    bool tint_tmp = (x_263 <= x_264);
+    if (tint_tmp) {
+      tint_tmp = (x_266 <= x_267);
+    }
+    if ((tint_tmp)) {
+    } else {
+      break;
+    }
+    const int x_273 = data[i];
+    const int x_276 = data[j];
+    if ((x_273 < x_276)) {
+      const int x_281 = k;
+      k = (x_281 + 1);
+      const int x_283 = i;
+      i = (x_283 + 1);
+      const int x_286 = data[x_283];
+      temp[x_281] = x_286;
+    } else {
+      const int x_288 = k;
+      k = (x_288 + 1);
+      const int x_290 = j;
+      j = (x_290 + 1);
+      const int x_293 = data[x_290];
+      temp[x_288] = x_293;
+    }
+  }
+  while (true) {
+    const int x_299 = i;
+    const int x_301 = i;
+    const int x_302 = mid;
+    bool tint_tmp_1 = (x_299 < 10);
+    if (tint_tmp_1) {
+      tint_tmp_1 = (x_301 <= x_302);
+    }
+    if ((tint_tmp_1)) {
+    } else {
+      break;
+    }
+    const int x_306 = k;
+    k = (x_306 + 1);
+    const int x_308 = i;
+    i = (x_308 + 1);
+    const int x_311 = data[x_308];
+    temp[x_306] = x_311;
+  }
+  const int x_313 = from;
+  i_1 = x_313;
+  while (true) {
+    const int x_318 = i_1;
+    const int x_319 = to;
+    if ((x_318 <= x_319)) {
+    } else {
+      break;
+    }
+    const int x_322 = i_1;
+    const int x_325 = temp[i_1];
+    data[x_322] = x_325;
+    {
+      i_1 = (i_1 + 1);
+    }
+  }
+  return;
+}
+
+void mergeSort_() {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  {
+    for(; (m <= high); m = (2 * m)) {
+      i_2 = low;
+      {
+        for(; (i_2 < high); i_2 = (i_2 + (2 * m))) {
+          from_1 = i_2;
+          mid_1 = ((i_2 + m) - 1);
+          to_1 = min(((i_2 + (2 * m)) - 1), high);
+          param = from_1;
+          param_1 = mid_1;
+          param_2 = to_1;
+          merge_i1_i1_i1_(param, param_1, param_2);
+        }
+      }
+    }
+  }
+  return;
+}
+
+void main_1() {
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  const float x_88 = asfloat(x_28[0].x);
+  i_3 = int(x_88);
+  while (true) {
+    switch(i_3) {
+      case 9: {
+        data[i_3] = -5;
+        if (true) {
+        } else {
+          {
+            if ((i_3 < 10)) {
+            } else {
+              break;
+            }
+          }
+          continue;
+        }
+        break;
+      }
+      case 8: {
+        data[i_3] = -4;
+        break;
+      }
+      case 7: {
+        data[i_3] = -3;
+        break;
+      }
+      case 6: {
+        data[i_3] = -2;
+        break;
+      }
+      case 5: {
+        data[i_3] = -1;
+        break;
+      }
+      case 4: {
+        data[i_3] = 0;
+        break;
+      }
+      case 3: {
+        data[i_3] = 1;
+        break;
+      }
+      case 2: {
+        data[i_3] = 2;
+        break;
+      }
+      case 1: {
+        data[i_3] = 3;
+        break;
+      }
+      case 0: {
+        data[i_3] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    i_3 = (i_3 + 1);
+    {
+      if ((i_3 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  {
+    for(; (j_1 < 10); j_1 = (j_1 + 1)) {
+      const int x_137 = j_1;
+      const int x_140 = data[j_1];
+      temp[x_137] = x_140;
+    }
+  }
+  mergeSort_();
+  const float x_146 = gl_FragCoord.y;
+  if ((int(x_146) < 30)) {
+    const int x_153 = data[0];
+    grey = (0.5f + (float(x_153) / 10.0f));
+  } else {
+    const float x_158 = gl_FragCoord.y;
+    if ((int(x_158) < 60)) {
+      const int x_165 = data[1];
+      grey = (0.5f + (float(x_165) / 10.0f));
+    } else {
+      const float x_170 = gl_FragCoord.y;
+      if ((int(x_170) < 90)) {
+        const int x_177 = data[2];
+        grey = (0.5f + (float(x_177) / 10.0f));
+      } else {
+        const float x_182 = gl_FragCoord.y;
+        if ((int(x_182) < 120)) {
+          const int x_189 = data[3];
+          grey = (0.5f + (float(x_189) / 10.0f));
+        } else {
+          const float x_194 = gl_FragCoord.y;
+          if ((int(x_194) < 150)) {
+            discard;
+          } else {
+            const float x_201 = gl_FragCoord.y;
+            if ((int(x_201) < 180)) {
+              const int x_208 = data[5];
+              grey = (0.5f + (float(x_208) / 10.0f));
+            } else {
+              const float x_213 = gl_FragCoord.y;
+              if ((int(x_213) < 210)) {
+                const int x_220 = data[6];
+                grey = (0.5f + (float(x_220) / 10.0f));
+              } else {
+                const float x_225 = gl_FragCoord.y;
+                if ((int(x_225) < 240)) {
+                  const int x_232 = data[7];
+                  grey = (0.5f + (float(x_232) / 10.0f));
+                } else {
+                  const float x_237 = gl_FragCoord.y;
+                  if ((int(x_237) < 270)) {
+                    const int x_244 = data[8];
+                    grey = (0.5f + (float(x_244) / 10.0f));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  const float x_248 = grey;
+  const float3 x_249 = float3(x_248, x_248, x_248);
+  x_GLF_color = float4(x_249.x, x_249.y, x_249.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/1.spvasm.expected.msl
new file mode 100644
index 0000000..983295b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/1.spvasm.expected.msl
@@ -0,0 +1,328 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct buf1 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void merge_i1_i1_i1_(thread int* const from, thread int* const mid, thread int* const to, thread tint_array_wrapper* const tint_symbol_5, thread tint_array_wrapper* const tint_symbol_6) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  int const x_255 = *(from);
+  k = x_255;
+  int const x_256 = *(from);
+  i = x_256;
+  int const x_257 = *(mid);
+  j = (x_257 + 1);
+  while (true) {
+    int const x_263 = i;
+    int const x_264 = *(mid);
+    int const x_266 = j;
+    int const x_267 = *(to);
+    if (((x_263 <= x_264) && (x_266 <= x_267))) {
+    } else {
+      break;
+    }
+    int const x_271 = i;
+    int const x_273 = (*(tint_symbol_5)).arr[x_271];
+    int const x_274 = j;
+    int const x_276 = (*(tint_symbol_5)).arr[x_274];
+    if ((x_273 < x_276)) {
+      int const x_281 = k;
+      k = (x_281 + 1);
+      int const x_283 = i;
+      i = (x_283 + 1);
+      int const x_286 = (*(tint_symbol_5)).arr[x_283];
+      (*(tint_symbol_6)).arr[x_281] = x_286;
+    } else {
+      int const x_288 = k;
+      k = (x_288 + 1);
+      int const x_290 = j;
+      j = (x_290 + 1);
+      int const x_293 = (*(tint_symbol_5)).arr[x_290];
+      (*(tint_symbol_6)).arr[x_288] = x_293;
+    }
+  }
+  while (true) {
+    int const x_299 = i;
+    int const x_301 = i;
+    int const x_302 = *(mid);
+    if (((x_299 < 10) && (x_301 <= x_302))) {
+    } else {
+      break;
+    }
+    int const x_306 = k;
+    k = (x_306 + 1);
+    int const x_308 = i;
+    i = (x_308 + 1);
+    int const x_311 = (*(tint_symbol_5)).arr[x_308];
+    (*(tint_symbol_6)).arr[x_306] = x_311;
+  }
+  int const x_313 = *(from);
+  i_1 = x_313;
+  while (true) {
+    int const x_318 = i_1;
+    int const x_319 = *(to);
+    if ((x_318 <= x_319)) {
+    } else {
+      break;
+    }
+    int const x_322 = i_1;
+    int const x_323 = i_1;
+    int const x_325 = (*(tint_symbol_6)).arr[x_323];
+    (*(tint_symbol_5)).arr[x_322] = x_325;
+    {
+      int const x_327 = i_1;
+      i_1 = (x_327 + 1);
+    }
+  }
+  return;
+}
+
+void mergeSort_(thread tint_array_wrapper* const tint_symbol_7, thread tint_array_wrapper* const tint_symbol_8) {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  while (true) {
+    int const x_334 = m;
+    int const x_335 = high;
+    if ((x_334 <= x_335)) {
+    } else {
+      break;
+    }
+    int const x_338 = low;
+    i_2 = x_338;
+    while (true) {
+      int const x_343 = i_2;
+      int const x_344 = high;
+      if ((x_343 < x_344)) {
+      } else {
+        break;
+      }
+      int const x_347 = i_2;
+      from_1 = x_347;
+      int const x_348 = i_2;
+      int const x_349 = m;
+      mid_1 = ((x_348 + x_349) - 1);
+      int const x_352 = i_2;
+      int const x_353 = m;
+      int const x_357 = high;
+      to_1 = min(((x_352 + (2 * x_353)) - 1), x_357);
+      int const x_359 = from_1;
+      param = x_359;
+      int const x_360 = mid_1;
+      param_1 = x_360;
+      int const x_361 = to_1;
+      param_2 = x_361;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2), tint_symbol_7, tint_symbol_8);
+      {
+        int const x_363 = m;
+        int const x_365 = i_2;
+        i_2 = (x_365 + (2 * x_363));
+      }
+    }
+    {
+      int const x_367 = m;
+      m = (2 * x_367);
+    }
+  }
+  return;
+}
+
+void main_1(constant buf0& x_28, thread tint_array_wrapper* const tint_symbol_9, thread tint_array_wrapper* const tint_symbol_10, thread float4* const tint_symbol_11, thread float4* const tint_symbol_12) {
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  float const x_88 = x_28.injectionSwitch.x;
+  i_3 = int(x_88);
+  while (true) {
+    int const x_94 = i_3;
+    switch(x_94) {
+      case 9: {
+        int const x_124 = i_3;
+        (*(tint_symbol_9)).arr[x_124] = -5;
+        if (true) {
+        } else {
+          {
+            int const x_128 = i_3;
+            if ((x_128 < 10)) {
+            } else {
+              break;
+            }
+          }
+          continue;
+        }
+        break;
+      }
+      case 8: {
+        int const x_122 = i_3;
+        (*(tint_symbol_9)).arr[x_122] = -4;
+        break;
+      }
+      case 7: {
+        int const x_120 = i_3;
+        (*(tint_symbol_9)).arr[x_120] = -3;
+        break;
+      }
+      case 6: {
+        int const x_118 = i_3;
+        (*(tint_symbol_9)).arr[x_118] = -2;
+        break;
+      }
+      case 5: {
+        int const x_116 = i_3;
+        (*(tint_symbol_9)).arr[x_116] = -1;
+        break;
+      }
+      case 4: {
+        int const x_114 = i_3;
+        (*(tint_symbol_9)).arr[x_114] = 0;
+        break;
+      }
+      case 3: {
+        int const x_112 = i_3;
+        (*(tint_symbol_9)).arr[x_112] = 1;
+        break;
+      }
+      case 2: {
+        int const x_110 = i_3;
+        (*(tint_symbol_9)).arr[x_110] = 2;
+        break;
+      }
+      case 1: {
+        int const x_108 = i_3;
+        (*(tint_symbol_9)).arr[x_108] = 3;
+        break;
+      }
+      case 0: {
+        int const x_106 = i_3;
+        (*(tint_symbol_9)).arr[x_106] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    int const x_126 = i_3;
+    i_3 = (x_126 + 1);
+    {
+      int const x_128 = i_3;
+      if ((x_128 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  while (true) {
+    int const x_134 = j_1;
+    if ((x_134 < 10)) {
+    } else {
+      break;
+    }
+    int const x_137 = j_1;
+    int const x_138 = j_1;
+    int const x_140 = (*(tint_symbol_9)).arr[x_138];
+    (*(tint_symbol_10)).arr[x_137] = x_140;
+    {
+      int const x_142 = j_1;
+      j_1 = (x_142 + 1);
+    }
+  }
+  mergeSort_(tint_symbol_9, tint_symbol_10);
+  float const x_146 = (*(tint_symbol_11)).y;
+  if ((int(x_146) < 30)) {
+    int const x_153 = (*(tint_symbol_9)).arr[0];
+    grey = (0.5f + (float(x_153) / 10.0f));
+  } else {
+    float const x_158 = (*(tint_symbol_11)).y;
+    if ((int(x_158) < 60)) {
+      int const x_165 = (*(tint_symbol_9)).arr[1];
+      grey = (0.5f + (float(x_165) / 10.0f));
+    } else {
+      float const x_170 = (*(tint_symbol_11)).y;
+      if ((int(x_170) < 90)) {
+        int const x_177 = (*(tint_symbol_9)).arr[2];
+        grey = (0.5f + (float(x_177) / 10.0f));
+      } else {
+        float const x_182 = (*(tint_symbol_11)).y;
+        if ((int(x_182) < 120)) {
+          int const x_189 = (*(tint_symbol_9)).arr[3];
+          grey = (0.5f + (float(x_189) / 10.0f));
+        } else {
+          float const x_194 = (*(tint_symbol_11)).y;
+          if ((int(x_194) < 150)) {
+            discard_fragment();
+          } else {
+            float const x_201 = (*(tint_symbol_11)).y;
+            if ((int(x_201) < 180)) {
+              int const x_208 = (*(tint_symbol_9)).arr[5];
+              grey = (0.5f + (float(x_208) / 10.0f));
+            } else {
+              float const x_213 = (*(tint_symbol_11)).y;
+              if ((int(x_213) < 210)) {
+                int const x_220 = (*(tint_symbol_9)).arr[6];
+                grey = (0.5f + (float(x_220) / 10.0f));
+              } else {
+                float const x_225 = (*(tint_symbol_11)).y;
+                if ((int(x_225) < 240)) {
+                  int const x_232 = (*(tint_symbol_9)).arr[7];
+                  grey = (0.5f + (float(x_232) / 10.0f));
+                } else {
+                  float const x_237 = (*(tint_symbol_11)).y;
+                  if ((int(x_237) < 270)) {
+                    int const x_244 = (*(tint_symbol_9)).arr[8];
+                    grey = (0.5f + (float(x_244) / 10.0f));
+                  } else {
+                    discard_fragment();
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  float const x_248 = grey;
+  float3 const x_249 = float3(x_248, x_248, x_248);
+  *(tint_symbol_12) = float4(x_249.x, x_249.y, x_249.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_28 [[buffer(0)]]) {
+  thread float4 tint_symbol_13 = 0.0f;
+  thread tint_array_wrapper tint_symbol_14 = {};
+  thread tint_array_wrapper tint_symbol_15 = {};
+  thread float4 tint_symbol_16 = 0.0f;
+  tint_symbol_13 = gl_FragCoord_param;
+  main_1(x_28, &(tint_symbol_14), &(tint_symbol_15), &(tint_symbol_13), &(tint_symbol_16));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_16};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..a382317
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/1.spvasm.expected.spvasm
@@ -0,0 +1,668 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 423
+; Schema: 0
+               OpCapability Shader
+        %180 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %data "data"
+               OpName %temp "temp"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_28 "x_28"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "resolution"
+               OpName %x_32 "x_32"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %merge_i1_i1_i1_ "merge_i1_i1_i1_"
+               OpName %from "from"
+               OpName %mid "mid"
+               OpName %to "to"
+               OpName %k "k"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %i_1 "i_1"
+               OpName %mergeSort_ "mergeSort_"
+               OpName %low "low"
+               OpName %high "high"
+               OpName %m "m"
+               OpName %i_2 "i_2"
+               OpName %from_1 "from_1"
+               OpName %mid_1 "mid_1"
+               OpName %to_1 "to_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %main_1 "main_1"
+               OpName %i_3 "i_3"
+               OpName %j_1 "j_1"
+               OpName %grey "grey"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_28 NonWritable
+               OpDecorate %x_28 DescriptorSet 0
+               OpDecorate %x_28 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_32 NonWritable
+               OpDecorate %x_32 DescriptorSet 0
+               OpDecorate %x_32 Binding 1
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Private__arr_int_uint_10 = OpTypePointer Private %_arr_int_uint_10
+          %7 = OpConstantNull %_arr_int_uint_10
+       %data = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+       %temp = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_28 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %17
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_32 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+         %26 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int %_ptr_Function_int
+         %35 = OpConstantNull %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+%_ptr_Private_int = OpTypePointer Private %int
+     %int_10 = OpConstant %int 10
+        %135 = OpTypeFunction %void
+      %int_0 = OpConstant %int 0
+      %int_9 = OpConstant %int 9
+      %int_2 = OpConstant %int 2
+%_ptr_Function_float = OpTypePointer Function %float
+        %204 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %int_n5 = OpConstant %int -5
+       %true = OpConstantTrue %bool
+     %int_n4 = OpConstant %int -4
+     %int_n3 = OpConstant %int -3
+     %int_n2 = OpConstant %int -2
+     %int_n1 = OpConstant %int -1
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %int_30 = OpConstant %int 30
+  %float_0_5 = OpConstant %float 0.5
+   %float_10 = OpConstant %float 10
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+    %v3float = OpTypeVector %float 3
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %410 = OpTypeFunction %void %main_out
+%merge_i1_i1_i1_ = OpFunction %void None %26
+       %from = OpFunctionParameter %_ptr_Function_int
+        %mid = OpFunctionParameter %_ptr_Function_int
+         %to = OpFunctionParameter %_ptr_Function_int
+         %33 = OpLabel
+          %k = OpVariable %_ptr_Function_int Function %35
+          %i = OpVariable %_ptr_Function_int Function %35
+          %j = OpVariable %_ptr_Function_int Function %35
+        %i_1 = OpVariable %_ptr_Function_int Function %35
+         %40 = OpLoad %int %from
+               OpStore %k %40
+         %42 = OpLoad %int %from
+               OpStore %i %42
+         %44 = OpLoad %int %mid
+         %46 = OpIAdd %int %44 %int_1
+               OpStore %j %46
+               OpBranch %47
+         %47 = OpLabel
+               OpLoopMerge %48 %49 None
+               OpBranch %50
+         %50 = OpLabel
+         %51 = OpLoad %int %i
+         %53 = OpLoad %int %mid
+         %54 = OpLoad %int %j
+         %56 = OpLoad %int %to
+         %57 = OpSLessThanEqual %bool %51 %53
+               OpSelectionMerge %59 None
+               OpBranchConditional %57 %60 %59
+         %60 = OpLabel
+         %61 = OpSLessThanEqual %bool %54 %56
+               OpBranch %59
+         %59 = OpLabel
+         %62 = OpPhi %bool %57 %50 %61 %60
+               OpSelectionMerge %63 None
+               OpBranchConditional %62 %64 %65
+         %64 = OpLabel
+               OpBranch %63
+         %65 = OpLabel
+               OpBranch %48
+         %63 = OpLabel
+         %66 = OpLoad %int %i
+         %68 = OpAccessChain %_ptr_Private_int %data %66
+         %69 = OpLoad %int %68
+         %70 = OpLoad %int %j
+         %71 = OpAccessChain %_ptr_Private_int %data %70
+         %72 = OpLoad %int %71
+         %73 = OpSLessThan %bool %69 %72
+               OpSelectionMerge %74 None
+               OpBranchConditional %73 %75 %76
+         %75 = OpLabel
+         %77 = OpLoad %int %k
+         %78 = OpIAdd %int %77 %int_1
+               OpStore %k %78
+         %79 = OpLoad %int %i
+         %80 = OpIAdd %int %79 %int_1
+               OpStore %i %80
+         %81 = OpAccessChain %_ptr_Private_int %data %79
+         %82 = OpLoad %int %81
+         %83 = OpAccessChain %_ptr_Private_int %temp %77
+               OpStore %83 %82
+               OpBranch %74
+         %76 = OpLabel
+         %84 = OpLoad %int %k
+         %85 = OpIAdd %int %84 %int_1
+               OpStore %k %85
+         %86 = OpLoad %int %j
+         %87 = OpIAdd %int %86 %int_1
+               OpStore %j %87
+         %88 = OpAccessChain %_ptr_Private_int %data %86
+         %89 = OpLoad %int %88
+         %90 = OpAccessChain %_ptr_Private_int %temp %84
+               OpStore %90 %89
+               OpBranch %74
+         %74 = OpLabel
+               OpBranch %49
+         %49 = OpLabel
+               OpBranch %47
+         %48 = OpLabel
+               OpBranch %91
+         %91 = OpLabel
+               OpLoopMerge %92 %93 None
+               OpBranch %94
+         %94 = OpLabel
+         %95 = OpLoad %int %i
+         %96 = OpLoad %int %i
+         %98 = OpLoad %int %mid
+        %100 = OpSLessThan %bool %95 %int_10
+               OpSelectionMerge %101 None
+               OpBranchConditional %100 %102 %101
+        %102 = OpLabel
+        %103 = OpSLessThanEqual %bool %96 %98
+               OpBranch %101
+        %101 = OpLabel
+        %104 = OpPhi %bool %100 %94 %103 %102
+               OpSelectionMerge %105 None
+               OpBranchConditional %104 %106 %107
+        %106 = OpLabel
+               OpBranch %105
+        %107 = OpLabel
+               OpBranch %92
+        %105 = OpLabel
+        %108 = OpLoad %int %k
+        %109 = OpIAdd %int %108 %int_1
+               OpStore %k %109
+        %110 = OpLoad %int %i
+        %111 = OpIAdd %int %110 %int_1
+               OpStore %i %111
+        %112 = OpAccessChain %_ptr_Private_int %data %110
+        %113 = OpLoad %int %112
+        %114 = OpAccessChain %_ptr_Private_int %temp %108
+               OpStore %114 %113
+               OpBranch %93
+         %93 = OpLabel
+               OpBranch %91
+         %92 = OpLabel
+        %116 = OpLoad %int %from
+               OpStore %i_1 %116
+               OpBranch %117
+        %117 = OpLabel
+               OpLoopMerge %118 %119 None
+               OpBranch %120
+        %120 = OpLabel
+        %121 = OpLoad %int %i_1
+        %123 = OpLoad %int %to
+        %124 = OpSLessThanEqual %bool %121 %123
+               OpSelectionMerge %125 None
+               OpBranchConditional %124 %126 %127
+        %126 = OpLabel
+               OpBranch %125
+        %127 = OpLabel
+               OpBranch %118
+        %125 = OpLabel
+        %128 = OpLoad %int %i_1
+        %129 = OpLoad %int %i_1
+        %130 = OpAccessChain %_ptr_Private_int %temp %129
+        %131 = OpLoad %int %130
+        %132 = OpAccessChain %_ptr_Private_int %data %128
+               OpStore %132 %131
+               OpBranch %119
+        %119 = OpLabel
+        %133 = OpLoad %int %i_1
+        %134 = OpIAdd %int %133 %int_1
+               OpStore %i_1 %134
+               OpBranch %117
+        %118 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %mergeSort_ = OpFunction %void None %135
+        %137 = OpLabel
+        %low = OpVariable %_ptr_Function_int Function %35
+       %high = OpVariable %_ptr_Function_int Function %35
+          %m = OpVariable %_ptr_Function_int Function %35
+        %i_2 = OpVariable %_ptr_Function_int Function %35
+     %from_1 = OpVariable %_ptr_Function_int Function %35
+      %mid_1 = OpVariable %_ptr_Function_int Function %35
+       %to_1 = OpVariable %_ptr_Function_int Function %35
+      %param = OpVariable %_ptr_Function_int Function %35
+    %param_1 = OpVariable %_ptr_Function_int Function %35
+    %param_2 = OpVariable %_ptr_Function_int Function %35
+               OpStore %low %int_0
+               OpStore %high %int_9
+               OpStore %m %int_1
+               OpBranch %150
+        %150 = OpLabel
+               OpLoopMerge %151 %152 None
+               OpBranch %153
+        %153 = OpLabel
+        %154 = OpLoad %int %m
+        %155 = OpLoad %int %high
+        %156 = OpSLessThanEqual %bool %154 %155
+               OpSelectionMerge %157 None
+               OpBranchConditional %156 %158 %159
+        %158 = OpLabel
+               OpBranch %157
+        %159 = OpLabel
+               OpBranch %151
+        %157 = OpLabel
+        %160 = OpLoad %int %low
+               OpStore %i_2 %160
+               OpBranch %161
+        %161 = OpLabel
+               OpLoopMerge %162 %163 None
+               OpBranch %164
+        %164 = OpLabel
+        %165 = OpLoad %int %i_2
+        %166 = OpLoad %int %high
+        %167 = OpSLessThan %bool %165 %166
+               OpSelectionMerge %168 None
+               OpBranchConditional %167 %169 %170
+        %169 = OpLabel
+               OpBranch %168
+        %170 = OpLabel
+               OpBranch %162
+        %168 = OpLabel
+        %171 = OpLoad %int %i_2
+               OpStore %from_1 %171
+        %172 = OpLoad %int %i_2
+        %173 = OpLoad %int %m
+        %174 = OpIAdd %int %172 %173
+        %175 = OpISub %int %174 %int_1
+               OpStore %mid_1 %175
+        %176 = OpLoad %int %i_2
+        %177 = OpLoad %int %m
+        %178 = OpLoad %int %high
+        %182 = OpIMul %int %int_2 %177
+        %183 = OpIAdd %int %176 %182
+        %184 = OpISub %int %183 %int_1
+        %179 = OpExtInst %int %180 SMin %184 %178
+               OpStore %to_1 %179
+        %185 = OpLoad %int %from_1
+               OpStore %param %185
+        %186 = OpLoad %int %mid_1
+               OpStore %param_1 %186
+        %187 = OpLoad %int %to_1
+               OpStore %param_2 %187
+        %188 = OpFunctionCall %void %merge_i1_i1_i1_ %param %param_1 %param_2
+               OpBranch %163
+        %163 = OpLabel
+        %192 = OpLoad %int %m
+        %193 = OpLoad %int %i_2
+        %194 = OpIMul %int %int_2 %192
+        %195 = OpIAdd %int %193 %194
+               OpStore %i_2 %195
+               OpBranch %161
+        %162 = OpLabel
+               OpBranch %152
+        %152 = OpLabel
+        %196 = OpLoad %int %m
+        %197 = OpIMul %int %int_2 %196
+               OpStore %m %197
+               OpBranch %150
+        %151 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %135
+        %199 = OpLabel
+        %i_3 = OpVariable %_ptr_Function_int Function %35
+        %j_1 = OpVariable %_ptr_Function_int Function %35
+       %grey = OpVariable %_ptr_Function_float Function %204
+        %207 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_0
+        %208 = OpLoad %float %207
+        %209 = OpConvertFToS %int %208
+               OpStore %i_3 %209
+               OpBranch %210
+        %210 = OpLabel
+               OpLoopMerge %211 %212 None
+               OpBranch %213
+        %213 = OpLabel
+        %214 = OpLoad %int %i_3
+               OpSelectionMerge %215 None
+               OpSwitch %214 %216 9 %217 8 %218 7 %219 6 %220 5 %221 4 %222 3 %223 2 %224 1 %225 0 %226
+        %217 = OpLabel
+        %227 = OpLoad %int %i_3
+        %228 = OpAccessChain %_ptr_Private_int %data %227
+               OpStore %228 %int_n5
+               OpSelectionMerge %231 None
+               OpBranchConditional %true %232 %233
+        %232 = OpLabel
+               OpBranch %231
+        %233 = OpLabel
+               OpBranch %212
+        %231 = OpLabel
+               OpBranch %215
+        %218 = OpLabel
+        %234 = OpLoad %int %i_3
+        %235 = OpAccessChain %_ptr_Private_int %data %234
+               OpStore %235 %int_n4
+               OpBranch %215
+        %219 = OpLabel
+        %237 = OpLoad %int %i_3
+        %238 = OpAccessChain %_ptr_Private_int %data %237
+               OpStore %238 %int_n3
+               OpBranch %215
+        %220 = OpLabel
+        %240 = OpLoad %int %i_3
+        %241 = OpAccessChain %_ptr_Private_int %data %240
+               OpStore %241 %int_n2
+               OpBranch %215
+        %221 = OpLabel
+        %243 = OpLoad %int %i_3
+        %244 = OpAccessChain %_ptr_Private_int %data %243
+               OpStore %244 %int_n1
+               OpBranch %215
+        %222 = OpLabel
+        %246 = OpLoad %int %i_3
+        %247 = OpAccessChain %_ptr_Private_int %data %246
+               OpStore %247 %int_0
+               OpBranch %215
+        %223 = OpLabel
+        %248 = OpLoad %int %i_3
+        %249 = OpAccessChain %_ptr_Private_int %data %248
+               OpStore %249 %int_1
+               OpBranch %215
+        %224 = OpLabel
+        %250 = OpLoad %int %i_3
+        %251 = OpAccessChain %_ptr_Private_int %data %250
+               OpStore %251 %int_2
+               OpBranch %215
+        %225 = OpLabel
+        %252 = OpLoad %int %i_3
+        %253 = OpAccessChain %_ptr_Private_int %data %252
+               OpStore %253 %int_3
+               OpBranch %215
+        %226 = OpLabel
+        %255 = OpLoad %int %i_3
+        %256 = OpAccessChain %_ptr_Private_int %data %255
+               OpStore %256 %int_4
+               OpBranch %215
+        %216 = OpLabel
+               OpBranch %215
+        %215 = OpLabel
+        %258 = OpLoad %int %i_3
+        %259 = OpIAdd %int %258 %int_1
+               OpStore %i_3 %259
+               OpBranch %212
+        %212 = OpLabel
+        %260 = OpLoad %int %i_3
+        %261 = OpSLessThan %bool %260 %int_10
+               OpSelectionMerge %262 None
+               OpBranchConditional %261 %263 %264
+        %263 = OpLabel
+               OpBranch %262
+        %264 = OpLabel
+               OpBranch %211
+        %262 = OpLabel
+               OpBranch %210
+        %211 = OpLabel
+               OpStore %j_1 %int_0
+               OpBranch %265
+        %265 = OpLabel
+               OpLoopMerge %266 %267 None
+               OpBranch %268
+        %268 = OpLabel
+        %269 = OpLoad %int %j_1
+        %270 = OpSLessThan %bool %269 %int_10
+               OpSelectionMerge %271 None
+               OpBranchConditional %270 %272 %273
+        %272 = OpLabel
+               OpBranch %271
+        %273 = OpLabel
+               OpBranch %266
+        %271 = OpLabel
+        %274 = OpLoad %int %j_1
+        %275 = OpLoad %int %j_1
+        %276 = OpAccessChain %_ptr_Private_int %data %275
+        %277 = OpLoad %int %276
+        %278 = OpAccessChain %_ptr_Private_int %temp %274
+               OpStore %278 %277
+               OpBranch %267
+        %267 = OpLabel
+        %279 = OpLoad %int %j_1
+        %280 = OpIAdd %int %279 %int_1
+               OpStore %j_1 %280
+               OpBranch %265
+        %266 = OpLabel
+        %281 = OpFunctionCall %void %mergeSort_
+        %284 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %285 = OpLoad %float %284
+        %286 = OpConvertFToS %int %285
+        %288 = OpSLessThan %bool %286 %int_30
+               OpSelectionMerge %289 None
+               OpBranchConditional %288 %290 %291
+        %290 = OpLabel
+        %292 = OpAccessChain %_ptr_Private_int %data %int_0
+        %293 = OpLoad %int %292
+        %295 = OpConvertSToF %float %293
+        %297 = OpFDiv %float %295 %float_10
+        %298 = OpFAdd %float %float_0_5 %297
+               OpStore %grey %298
+               OpBranch %289
+        %291 = OpLabel
+        %299 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %300 = OpLoad %float %299
+        %301 = OpConvertFToS %int %300
+        %303 = OpSLessThan %bool %301 %int_60
+               OpSelectionMerge %304 None
+               OpBranchConditional %303 %305 %306
+        %305 = OpLabel
+        %307 = OpAccessChain %_ptr_Private_int %data %int_1
+        %308 = OpLoad %int %307
+        %309 = OpConvertSToF %float %308
+        %310 = OpFDiv %float %309 %float_10
+        %311 = OpFAdd %float %float_0_5 %310
+               OpStore %grey %311
+               OpBranch %304
+        %306 = OpLabel
+        %312 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %313 = OpLoad %float %312
+        %314 = OpConvertFToS %int %313
+        %316 = OpSLessThan %bool %314 %int_90
+               OpSelectionMerge %317 None
+               OpBranchConditional %316 %318 %319
+        %318 = OpLabel
+        %320 = OpAccessChain %_ptr_Private_int %data %int_2
+        %321 = OpLoad %int %320
+        %322 = OpConvertSToF %float %321
+        %323 = OpFDiv %float %322 %float_10
+        %324 = OpFAdd %float %float_0_5 %323
+               OpStore %grey %324
+               OpBranch %317
+        %319 = OpLabel
+        %325 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %326 = OpLoad %float %325
+        %327 = OpConvertFToS %int %326
+        %329 = OpSLessThan %bool %327 %int_120
+               OpSelectionMerge %330 None
+               OpBranchConditional %329 %331 %332
+        %331 = OpLabel
+        %333 = OpAccessChain %_ptr_Private_int %data %int_3
+        %334 = OpLoad %int %333
+        %335 = OpConvertSToF %float %334
+        %336 = OpFDiv %float %335 %float_10
+        %337 = OpFAdd %float %float_0_5 %336
+               OpStore %grey %337
+               OpBranch %330
+        %332 = OpLabel
+        %338 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %339 = OpLoad %float %338
+        %340 = OpConvertFToS %int %339
+        %342 = OpSLessThan %bool %340 %int_150
+               OpSelectionMerge %343 None
+               OpBranchConditional %342 %344 %345
+        %344 = OpLabel
+               OpKill
+        %345 = OpLabel
+        %346 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %347 = OpLoad %float %346
+        %348 = OpConvertFToS %int %347
+        %350 = OpSLessThan %bool %348 %int_180
+               OpSelectionMerge %351 None
+               OpBranchConditional %350 %352 %353
+        %352 = OpLabel
+        %355 = OpAccessChain %_ptr_Private_int %data %int_5
+        %356 = OpLoad %int %355
+        %357 = OpConvertSToF %float %356
+        %358 = OpFDiv %float %357 %float_10
+        %359 = OpFAdd %float %float_0_5 %358
+               OpStore %grey %359
+               OpBranch %351
+        %353 = OpLabel
+        %360 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %361 = OpLoad %float %360
+        %362 = OpConvertFToS %int %361
+        %364 = OpSLessThan %bool %362 %int_210
+               OpSelectionMerge %365 None
+               OpBranchConditional %364 %366 %367
+        %366 = OpLabel
+        %369 = OpAccessChain %_ptr_Private_int %data %int_6
+        %370 = OpLoad %int %369
+        %371 = OpConvertSToF %float %370
+        %372 = OpFDiv %float %371 %float_10
+        %373 = OpFAdd %float %float_0_5 %372
+               OpStore %grey %373
+               OpBranch %365
+        %367 = OpLabel
+        %374 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %375 = OpLoad %float %374
+        %376 = OpConvertFToS %int %375
+        %378 = OpSLessThan %bool %376 %int_240
+               OpSelectionMerge %379 None
+               OpBranchConditional %378 %380 %381
+        %380 = OpLabel
+        %383 = OpAccessChain %_ptr_Private_int %data %int_7
+        %384 = OpLoad %int %383
+        %385 = OpConvertSToF %float %384
+        %386 = OpFDiv %float %385 %float_10
+        %387 = OpFAdd %float %float_0_5 %386
+               OpStore %grey %387
+               OpBranch %379
+        %381 = OpLabel
+        %388 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %389 = OpLoad %float %388
+        %390 = OpConvertFToS %int %389
+        %392 = OpSLessThan %bool %390 %int_270
+               OpSelectionMerge %393 None
+               OpBranchConditional %392 %394 %395
+        %394 = OpLabel
+        %397 = OpAccessChain %_ptr_Private_int %data %int_8
+        %398 = OpLoad %int %397
+        %399 = OpConvertSToF %float %398
+        %400 = OpFDiv %float %399 %float_10
+        %401 = OpFAdd %float %float_0_5 %400
+               OpStore %grey %401
+               OpBranch %393
+        %395 = OpLabel
+               OpKill
+        %393 = OpLabel
+               OpBranch %379
+        %379 = OpLabel
+               OpBranch %365
+        %365 = OpLabel
+               OpBranch %351
+        %351 = OpLabel
+               OpBranch %343
+        %343 = OpLabel
+               OpBranch %330
+        %330 = OpLabel
+               OpBranch %317
+        %317 = OpLabel
+               OpBranch %304
+        %304 = OpLabel
+               OpBranch %289
+        %289 = OpLabel
+        %402 = OpLoad %float %grey
+        %404 = OpCompositeConstruct %v3float %402 %402 %402
+        %405 = OpCompositeExtract %float %404 0
+        %406 = OpCompositeExtract %float %404 1
+        %407 = OpCompositeExtract %float %404 2
+        %409 = OpCompositeConstruct %v4float %405 %406 %407 %float_1
+               OpStore %x_GLF_color %409
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %410
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %414 = OpLabel
+        %415 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %415
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %135
+        %417 = OpLabel
+        %418 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %418
+        %419 = OpFunctionCall %void %main_1
+        %421 = OpLoad %v4float %x_GLF_color
+        %422 = OpCompositeConstruct %main_out %421
+        %420 = OpFunctionCall %void %tint_symbol_3 %422
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 212[%212] is not post dominated by the back-edge block 262[%262]
+  %262 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..b969e06
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/1.spvasm.expected.wgsl
@@ -0,0 +1,317 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[block]]
+struct buf1 {
+  resolution : vec2<f32>;
+};
+
+var<private> data : array<i32, 10>;
+
+var<private> temp : array<i32, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_32 : buf1;
+
+fn merge_i1_i1_i1_(from : ptr<function, i32>, mid : ptr<function, i32>, to : ptr<function, i32>) {
+  var k : i32;
+  var i : i32;
+  var j : i32;
+  var i_1 : i32;
+  let x_255 : i32 = *(from);
+  k = x_255;
+  let x_256 : i32 = *(from);
+  i = x_256;
+  let x_257 : i32 = *(mid);
+  j = (x_257 + 1);
+  loop {
+    let x_263 : i32 = i;
+    let x_264 : i32 = *(mid);
+    let x_266 : i32 = j;
+    let x_267 : i32 = *(to);
+    if (((x_263 <= x_264) && (x_266 <= x_267))) {
+    } else {
+      break;
+    }
+    let x_271 : i32 = i;
+    let x_273 : i32 = data[x_271];
+    let x_274 : i32 = j;
+    let x_276 : i32 = data[x_274];
+    if ((x_273 < x_276)) {
+      let x_281 : i32 = k;
+      k = (x_281 + 1);
+      let x_283 : i32 = i;
+      i = (x_283 + 1);
+      let x_286 : i32 = data[x_283];
+      temp[x_281] = x_286;
+    } else {
+      let x_288 : i32 = k;
+      k = (x_288 + 1);
+      let x_290 : i32 = j;
+      j = (x_290 + 1);
+      let x_293 : i32 = data[x_290];
+      temp[x_288] = x_293;
+    }
+  }
+  loop {
+    let x_299 : i32 = i;
+    let x_301 : i32 = i;
+    let x_302 : i32 = *(mid);
+    if (((x_299 < 10) && (x_301 <= x_302))) {
+    } else {
+      break;
+    }
+    let x_306 : i32 = k;
+    k = (x_306 + 1);
+    let x_308 : i32 = i;
+    i = (x_308 + 1);
+    let x_311 : i32 = data[x_308];
+    temp[x_306] = x_311;
+  }
+  let x_313 : i32 = *(from);
+  i_1 = x_313;
+  loop {
+    let x_318 : i32 = i_1;
+    let x_319 : i32 = *(to);
+    if ((x_318 <= x_319)) {
+    } else {
+      break;
+    }
+    let x_322 : i32 = i_1;
+    let x_323 : i32 = i_1;
+    let x_325 : i32 = temp[x_323];
+    data[x_322] = x_325;
+
+    continuing {
+      let x_327 : i32 = i_1;
+      i_1 = (x_327 + 1);
+    }
+  }
+  return;
+}
+
+fn mergeSort_() {
+  var low : i32;
+  var high : i32;
+  var m : i32;
+  var i_2 : i32;
+  var from_1 : i32;
+  var mid_1 : i32;
+  var to_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  low = 0;
+  high = 9;
+  m = 1;
+  loop {
+    let x_334 : i32 = m;
+    let x_335 : i32 = high;
+    if ((x_334 <= x_335)) {
+    } else {
+      break;
+    }
+    let x_338 : i32 = low;
+    i_2 = x_338;
+    loop {
+      let x_343 : i32 = i_2;
+      let x_344 : i32 = high;
+      if ((x_343 < x_344)) {
+      } else {
+        break;
+      }
+      let x_347 : i32 = i_2;
+      from_1 = x_347;
+      let x_348 : i32 = i_2;
+      let x_349 : i32 = m;
+      mid_1 = ((x_348 + x_349) - 1);
+      let x_352 : i32 = i_2;
+      let x_353 : i32 = m;
+      let x_357 : i32 = high;
+      to_1 = min(((x_352 + (2 * x_353)) - 1), x_357);
+      let x_359 : i32 = from_1;
+      param = x_359;
+      let x_360 : i32 = mid_1;
+      param_1 = x_360;
+      let x_361 : i32 = to_1;
+      param_2 = x_361;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2));
+
+      continuing {
+        let x_363 : i32 = m;
+        let x_365 : i32 = i_2;
+        i_2 = (x_365 + (2 * x_363));
+      }
+    }
+
+    continuing {
+      let x_367 : i32 = m;
+      m = (2 * x_367);
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_3 : i32;
+  var j_1 : i32;
+  var grey : f32;
+  let x_88 : f32 = x_28.injectionSwitch.x;
+  i_3 = i32(x_88);
+  loop {
+    let x_94 : i32 = i_3;
+    switch(x_94) {
+      case 9: {
+        let x_124 : i32 = i_3;
+        data[x_124] = -5;
+        if (true) {
+        } else {
+          continue;
+        }
+      }
+      case 8: {
+        let x_122 : i32 = i_3;
+        data[x_122] = -4;
+      }
+      case 7: {
+        let x_120 : i32 = i_3;
+        data[x_120] = -3;
+      }
+      case 6: {
+        let x_118 : i32 = i_3;
+        data[x_118] = -2;
+      }
+      case 5: {
+        let x_116 : i32 = i_3;
+        data[x_116] = -1;
+      }
+      case 4: {
+        let x_114 : i32 = i_3;
+        data[x_114] = 0;
+      }
+      case 3: {
+        let x_112 : i32 = i_3;
+        data[x_112] = 1;
+      }
+      case 2: {
+        let x_110 : i32 = i_3;
+        data[x_110] = 2;
+      }
+      case 1: {
+        let x_108 : i32 = i_3;
+        data[x_108] = 3;
+      }
+      case 0: {
+        let x_106 : i32 = i_3;
+        data[x_106] = 4;
+      }
+      default: {
+      }
+    }
+    let x_126 : i32 = i_3;
+    i_3 = (x_126 + 1);
+
+    continuing {
+      let x_128 : i32 = i_3;
+      if ((x_128 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  loop {
+    let x_134 : i32 = j_1;
+    if ((x_134 < 10)) {
+    } else {
+      break;
+    }
+    let x_137 : i32 = j_1;
+    let x_138 : i32 = j_1;
+    let x_140 : i32 = data[x_138];
+    temp[x_137] = x_140;
+
+    continuing {
+      let x_142 : i32 = j_1;
+      j_1 = (x_142 + 1);
+    }
+  }
+  mergeSort_();
+  let x_146 : f32 = gl_FragCoord.y;
+  if ((i32(x_146) < 30)) {
+    let x_153 : i32 = data[0];
+    grey = (0.5 + (f32(x_153) / 10.0));
+  } else {
+    let x_158 : f32 = gl_FragCoord.y;
+    if ((i32(x_158) < 60)) {
+      let x_165 : i32 = data[1];
+      grey = (0.5 + (f32(x_165) / 10.0));
+    } else {
+      let x_170 : f32 = gl_FragCoord.y;
+      if ((i32(x_170) < 90)) {
+        let x_177 : i32 = data[2];
+        grey = (0.5 + (f32(x_177) / 10.0));
+      } else {
+        let x_182 : f32 = gl_FragCoord.y;
+        if ((i32(x_182) < 120)) {
+          let x_189 : i32 = data[3];
+          grey = (0.5 + (f32(x_189) / 10.0));
+        } else {
+          let x_194 : f32 = gl_FragCoord.y;
+          if ((i32(x_194) < 150)) {
+            discard;
+          } else {
+            let x_201 : f32 = gl_FragCoord.y;
+            if ((i32(x_201) < 180)) {
+              let x_208 : i32 = data[5];
+              grey = (0.5 + (f32(x_208) / 10.0));
+            } else {
+              let x_213 : f32 = gl_FragCoord.y;
+              if ((i32(x_213) < 210)) {
+                let x_220 : i32 = data[6];
+                grey = (0.5 + (f32(x_220) / 10.0));
+              } else {
+                let x_225 : f32 = gl_FragCoord.y;
+                if ((i32(x_225) < 240)) {
+                  let x_232 : i32 = data[7];
+                  grey = (0.5 + (f32(x_232) / 10.0));
+                } else {
+                  let x_237 : f32 = gl_FragCoord.y;
+                  if ((i32(x_237) < 270)) {
+                    let x_244 : i32 = data[8];
+                    grey = (0.5 + (f32(x_244) / 10.0));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  let x_248 : f32 = grey;
+  let x_249 : vec3<f32> = vec3<f32>(x_248, x_248, x_248);
+  x_GLF_color = vec4<f32>(x_249.x, x_249.y, x_249.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/1.wgsl
new file mode 100644
index 0000000..b969e06
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/1.wgsl
@@ -0,0 +1,317 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[block]]
+struct buf1 {
+  resolution : vec2<f32>;
+};
+
+var<private> data : array<i32, 10>;
+
+var<private> temp : array<i32, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_32 : buf1;
+
+fn merge_i1_i1_i1_(from : ptr<function, i32>, mid : ptr<function, i32>, to : ptr<function, i32>) {
+  var k : i32;
+  var i : i32;
+  var j : i32;
+  var i_1 : i32;
+  let x_255 : i32 = *(from);
+  k = x_255;
+  let x_256 : i32 = *(from);
+  i = x_256;
+  let x_257 : i32 = *(mid);
+  j = (x_257 + 1);
+  loop {
+    let x_263 : i32 = i;
+    let x_264 : i32 = *(mid);
+    let x_266 : i32 = j;
+    let x_267 : i32 = *(to);
+    if (((x_263 <= x_264) && (x_266 <= x_267))) {
+    } else {
+      break;
+    }
+    let x_271 : i32 = i;
+    let x_273 : i32 = data[x_271];
+    let x_274 : i32 = j;
+    let x_276 : i32 = data[x_274];
+    if ((x_273 < x_276)) {
+      let x_281 : i32 = k;
+      k = (x_281 + 1);
+      let x_283 : i32 = i;
+      i = (x_283 + 1);
+      let x_286 : i32 = data[x_283];
+      temp[x_281] = x_286;
+    } else {
+      let x_288 : i32 = k;
+      k = (x_288 + 1);
+      let x_290 : i32 = j;
+      j = (x_290 + 1);
+      let x_293 : i32 = data[x_290];
+      temp[x_288] = x_293;
+    }
+  }
+  loop {
+    let x_299 : i32 = i;
+    let x_301 : i32 = i;
+    let x_302 : i32 = *(mid);
+    if (((x_299 < 10) && (x_301 <= x_302))) {
+    } else {
+      break;
+    }
+    let x_306 : i32 = k;
+    k = (x_306 + 1);
+    let x_308 : i32 = i;
+    i = (x_308 + 1);
+    let x_311 : i32 = data[x_308];
+    temp[x_306] = x_311;
+  }
+  let x_313 : i32 = *(from);
+  i_1 = x_313;
+  loop {
+    let x_318 : i32 = i_1;
+    let x_319 : i32 = *(to);
+    if ((x_318 <= x_319)) {
+    } else {
+      break;
+    }
+    let x_322 : i32 = i_1;
+    let x_323 : i32 = i_1;
+    let x_325 : i32 = temp[x_323];
+    data[x_322] = x_325;
+
+    continuing {
+      let x_327 : i32 = i_1;
+      i_1 = (x_327 + 1);
+    }
+  }
+  return;
+}
+
+fn mergeSort_() {
+  var low : i32;
+  var high : i32;
+  var m : i32;
+  var i_2 : i32;
+  var from_1 : i32;
+  var mid_1 : i32;
+  var to_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  low = 0;
+  high = 9;
+  m = 1;
+  loop {
+    let x_334 : i32 = m;
+    let x_335 : i32 = high;
+    if ((x_334 <= x_335)) {
+    } else {
+      break;
+    }
+    let x_338 : i32 = low;
+    i_2 = x_338;
+    loop {
+      let x_343 : i32 = i_2;
+      let x_344 : i32 = high;
+      if ((x_343 < x_344)) {
+      } else {
+        break;
+      }
+      let x_347 : i32 = i_2;
+      from_1 = x_347;
+      let x_348 : i32 = i_2;
+      let x_349 : i32 = m;
+      mid_1 = ((x_348 + x_349) - 1);
+      let x_352 : i32 = i_2;
+      let x_353 : i32 = m;
+      let x_357 : i32 = high;
+      to_1 = min(((x_352 + (2 * x_353)) - 1), x_357);
+      let x_359 : i32 = from_1;
+      param = x_359;
+      let x_360 : i32 = mid_1;
+      param_1 = x_360;
+      let x_361 : i32 = to_1;
+      param_2 = x_361;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2));
+
+      continuing {
+        let x_363 : i32 = m;
+        let x_365 : i32 = i_2;
+        i_2 = (x_365 + (2 * x_363));
+      }
+    }
+
+    continuing {
+      let x_367 : i32 = m;
+      m = (2 * x_367);
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_3 : i32;
+  var j_1 : i32;
+  var grey : f32;
+  let x_88 : f32 = x_28.injectionSwitch.x;
+  i_3 = i32(x_88);
+  loop {
+    let x_94 : i32 = i_3;
+    switch(x_94) {
+      case 9: {
+        let x_124 : i32 = i_3;
+        data[x_124] = -5;
+        if (true) {
+        } else {
+          continue;
+        }
+      }
+      case 8: {
+        let x_122 : i32 = i_3;
+        data[x_122] = -4;
+      }
+      case 7: {
+        let x_120 : i32 = i_3;
+        data[x_120] = -3;
+      }
+      case 6: {
+        let x_118 : i32 = i_3;
+        data[x_118] = -2;
+      }
+      case 5: {
+        let x_116 : i32 = i_3;
+        data[x_116] = -1;
+      }
+      case 4: {
+        let x_114 : i32 = i_3;
+        data[x_114] = 0;
+      }
+      case 3: {
+        let x_112 : i32 = i_3;
+        data[x_112] = 1;
+      }
+      case 2: {
+        let x_110 : i32 = i_3;
+        data[x_110] = 2;
+      }
+      case 1: {
+        let x_108 : i32 = i_3;
+        data[x_108] = 3;
+      }
+      case 0: {
+        let x_106 : i32 = i_3;
+        data[x_106] = 4;
+      }
+      default: {
+      }
+    }
+    let x_126 : i32 = i_3;
+    i_3 = (x_126 + 1);
+
+    continuing {
+      let x_128 : i32 = i_3;
+      if ((x_128 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  loop {
+    let x_134 : i32 = j_1;
+    if ((x_134 < 10)) {
+    } else {
+      break;
+    }
+    let x_137 : i32 = j_1;
+    let x_138 : i32 = j_1;
+    let x_140 : i32 = data[x_138];
+    temp[x_137] = x_140;
+
+    continuing {
+      let x_142 : i32 = j_1;
+      j_1 = (x_142 + 1);
+    }
+  }
+  mergeSort_();
+  let x_146 : f32 = gl_FragCoord.y;
+  if ((i32(x_146) < 30)) {
+    let x_153 : i32 = data[0];
+    grey = (0.5 + (f32(x_153) / 10.0));
+  } else {
+    let x_158 : f32 = gl_FragCoord.y;
+    if ((i32(x_158) < 60)) {
+      let x_165 : i32 = data[1];
+      grey = (0.5 + (f32(x_165) / 10.0));
+    } else {
+      let x_170 : f32 = gl_FragCoord.y;
+      if ((i32(x_170) < 90)) {
+        let x_177 : i32 = data[2];
+        grey = (0.5 + (f32(x_177) / 10.0));
+      } else {
+        let x_182 : f32 = gl_FragCoord.y;
+        if ((i32(x_182) < 120)) {
+          let x_189 : i32 = data[3];
+          grey = (0.5 + (f32(x_189) / 10.0));
+        } else {
+          let x_194 : f32 = gl_FragCoord.y;
+          if ((i32(x_194) < 150)) {
+            discard;
+          } else {
+            let x_201 : f32 = gl_FragCoord.y;
+            if ((i32(x_201) < 180)) {
+              let x_208 : i32 = data[5];
+              grey = (0.5 + (f32(x_208) / 10.0));
+            } else {
+              let x_213 : f32 = gl_FragCoord.y;
+              if ((i32(x_213) < 210)) {
+                let x_220 : i32 = data[6];
+                grey = (0.5 + (f32(x_220) / 10.0));
+              } else {
+                let x_225 : f32 = gl_FragCoord.y;
+                if ((i32(x_225) < 240)) {
+                  let x_232 : i32 = data[7];
+                  grey = (0.5 + (f32(x_232) / 10.0));
+                } else {
+                  let x_237 : f32 = gl_FragCoord.y;
+                  if ((i32(x_237) < 270)) {
+                    let x_244 : i32 = data[8];
+                    grey = (0.5 + (f32(x_244) / 10.0));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  let x_248 : f32 = grey;
+  let x_249 : vec3<f32> = vec3<f32>(x_248, x_248, x_248);
+  x_GLF_color = vec4<f32>(x_249.x, x_249.y, x_249.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..b6f582e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/1.wgsl.expected.hlsl
@@ -0,0 +1,281 @@
+static int data[10] = (int[10])0;
+static int temp[10] = (int[10])0;
+cbuffer cbuffer_x_28 : register(b0, space0) {
+  uint4 x_28[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_32 : register(b1, space0) {
+  uint4 x_32[1];
+};
+
+void merge_i1_i1_i1_(inout int from, inout int mid, inout int to) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  const int x_255 = from;
+  k = x_255;
+  const int x_256 = from;
+  i = x_256;
+  const int x_257 = mid;
+  j = (x_257 + 1);
+  while (true) {
+    const int x_263 = i;
+    const int x_264 = mid;
+    const int x_266 = j;
+    const int x_267 = to;
+    bool tint_tmp = (x_263 <= x_264);
+    if (tint_tmp) {
+      tint_tmp = (x_266 <= x_267);
+    }
+    if ((tint_tmp)) {
+    } else {
+      break;
+    }
+    const int x_273 = data[i];
+    const int x_276 = data[j];
+    if ((x_273 < x_276)) {
+      const int x_281 = k;
+      k = (x_281 + 1);
+      const int x_283 = i;
+      i = (x_283 + 1);
+      const int x_286 = data[x_283];
+      temp[x_281] = x_286;
+    } else {
+      const int x_288 = k;
+      k = (x_288 + 1);
+      const int x_290 = j;
+      j = (x_290 + 1);
+      const int x_293 = data[x_290];
+      temp[x_288] = x_293;
+    }
+  }
+  while (true) {
+    const int x_299 = i;
+    const int x_301 = i;
+    const int x_302 = mid;
+    bool tint_tmp_1 = (x_299 < 10);
+    if (tint_tmp_1) {
+      tint_tmp_1 = (x_301 <= x_302);
+    }
+    if ((tint_tmp_1)) {
+    } else {
+      break;
+    }
+    const int x_306 = k;
+    k = (x_306 + 1);
+    const int x_308 = i;
+    i = (x_308 + 1);
+    const int x_311 = data[x_308];
+    temp[x_306] = x_311;
+  }
+  const int x_313 = from;
+  i_1 = x_313;
+  while (true) {
+    const int x_318 = i_1;
+    const int x_319 = to;
+    if ((x_318 <= x_319)) {
+    } else {
+      break;
+    }
+    const int x_322 = i_1;
+    const int x_325 = temp[i_1];
+    data[x_322] = x_325;
+    {
+      i_1 = (i_1 + 1);
+    }
+  }
+  return;
+}
+
+void mergeSort_() {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  {
+    for(; (m <= high); m = (2 * m)) {
+      i_2 = low;
+      {
+        for(; (i_2 < high); i_2 = (i_2 + (2 * m))) {
+          from_1 = i_2;
+          mid_1 = ((i_2 + m) - 1);
+          to_1 = min(((i_2 + (2 * m)) - 1), high);
+          param = from_1;
+          param_1 = mid_1;
+          param_2 = to_1;
+          merge_i1_i1_i1_(param, param_1, param_2);
+        }
+      }
+    }
+  }
+  return;
+}
+
+void main_1() {
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  const float x_88 = asfloat(x_28[0].x);
+  i_3 = int(x_88);
+  while (true) {
+    switch(i_3) {
+      case 9: {
+        data[i_3] = -5;
+        if (true) {
+        } else {
+          {
+            if ((i_3 < 10)) {
+            } else {
+              break;
+            }
+          }
+          continue;
+        }
+        break;
+      }
+      case 8: {
+        data[i_3] = -4;
+        break;
+      }
+      case 7: {
+        data[i_3] = -3;
+        break;
+      }
+      case 6: {
+        data[i_3] = -2;
+        break;
+      }
+      case 5: {
+        data[i_3] = -1;
+        break;
+      }
+      case 4: {
+        data[i_3] = 0;
+        break;
+      }
+      case 3: {
+        data[i_3] = 1;
+        break;
+      }
+      case 2: {
+        data[i_3] = 2;
+        break;
+      }
+      case 1: {
+        data[i_3] = 3;
+        break;
+      }
+      case 0: {
+        data[i_3] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    i_3 = (i_3 + 1);
+    {
+      if ((i_3 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  {
+    for(; (j_1 < 10); j_1 = (j_1 + 1)) {
+      const int x_137 = j_1;
+      const int x_140 = data[j_1];
+      temp[x_137] = x_140;
+    }
+  }
+  mergeSort_();
+  const float x_146 = gl_FragCoord.y;
+  if ((int(x_146) < 30)) {
+    const int x_153 = data[0];
+    grey = (0.5f + (float(x_153) / 10.0f));
+  } else {
+    const float x_158 = gl_FragCoord.y;
+    if ((int(x_158) < 60)) {
+      const int x_165 = data[1];
+      grey = (0.5f + (float(x_165) / 10.0f));
+    } else {
+      const float x_170 = gl_FragCoord.y;
+      if ((int(x_170) < 90)) {
+        const int x_177 = data[2];
+        grey = (0.5f + (float(x_177) / 10.0f));
+      } else {
+        const float x_182 = gl_FragCoord.y;
+        if ((int(x_182) < 120)) {
+          const int x_189 = data[3];
+          grey = (0.5f + (float(x_189) / 10.0f));
+        } else {
+          const float x_194 = gl_FragCoord.y;
+          if ((int(x_194) < 150)) {
+            discard;
+          } else {
+            const float x_201 = gl_FragCoord.y;
+            if ((int(x_201) < 180)) {
+              const int x_208 = data[5];
+              grey = (0.5f + (float(x_208) / 10.0f));
+            } else {
+              const float x_213 = gl_FragCoord.y;
+              if ((int(x_213) < 210)) {
+                const int x_220 = data[6];
+                grey = (0.5f + (float(x_220) / 10.0f));
+              } else {
+                const float x_225 = gl_FragCoord.y;
+                if ((int(x_225) < 240)) {
+                  const int x_232 = data[7];
+                  grey = (0.5f + (float(x_232) / 10.0f));
+                } else {
+                  const float x_237 = gl_FragCoord.y;
+                  if ((int(x_237) < 270)) {
+                    const int x_244 = data[8];
+                    grey = (0.5f + (float(x_244) / 10.0f));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  const float x_248 = grey;
+  const float3 x_249 = float3(x_248, x_248, x_248);
+  x_GLF_color = float4(x_249.x, x_249.y, x_249.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/1.wgsl.expected.msl
new file mode 100644
index 0000000..983295b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/1.wgsl.expected.msl
@@ -0,0 +1,328 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct buf1 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void merge_i1_i1_i1_(thread int* const from, thread int* const mid, thread int* const to, thread tint_array_wrapper* const tint_symbol_5, thread tint_array_wrapper* const tint_symbol_6) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  int const x_255 = *(from);
+  k = x_255;
+  int const x_256 = *(from);
+  i = x_256;
+  int const x_257 = *(mid);
+  j = (x_257 + 1);
+  while (true) {
+    int const x_263 = i;
+    int const x_264 = *(mid);
+    int const x_266 = j;
+    int const x_267 = *(to);
+    if (((x_263 <= x_264) && (x_266 <= x_267))) {
+    } else {
+      break;
+    }
+    int const x_271 = i;
+    int const x_273 = (*(tint_symbol_5)).arr[x_271];
+    int const x_274 = j;
+    int const x_276 = (*(tint_symbol_5)).arr[x_274];
+    if ((x_273 < x_276)) {
+      int const x_281 = k;
+      k = (x_281 + 1);
+      int const x_283 = i;
+      i = (x_283 + 1);
+      int const x_286 = (*(tint_symbol_5)).arr[x_283];
+      (*(tint_symbol_6)).arr[x_281] = x_286;
+    } else {
+      int const x_288 = k;
+      k = (x_288 + 1);
+      int const x_290 = j;
+      j = (x_290 + 1);
+      int const x_293 = (*(tint_symbol_5)).arr[x_290];
+      (*(tint_symbol_6)).arr[x_288] = x_293;
+    }
+  }
+  while (true) {
+    int const x_299 = i;
+    int const x_301 = i;
+    int const x_302 = *(mid);
+    if (((x_299 < 10) && (x_301 <= x_302))) {
+    } else {
+      break;
+    }
+    int const x_306 = k;
+    k = (x_306 + 1);
+    int const x_308 = i;
+    i = (x_308 + 1);
+    int const x_311 = (*(tint_symbol_5)).arr[x_308];
+    (*(tint_symbol_6)).arr[x_306] = x_311;
+  }
+  int const x_313 = *(from);
+  i_1 = x_313;
+  while (true) {
+    int const x_318 = i_1;
+    int const x_319 = *(to);
+    if ((x_318 <= x_319)) {
+    } else {
+      break;
+    }
+    int const x_322 = i_1;
+    int const x_323 = i_1;
+    int const x_325 = (*(tint_symbol_6)).arr[x_323];
+    (*(tint_symbol_5)).arr[x_322] = x_325;
+    {
+      int const x_327 = i_1;
+      i_1 = (x_327 + 1);
+    }
+  }
+  return;
+}
+
+void mergeSort_(thread tint_array_wrapper* const tint_symbol_7, thread tint_array_wrapper* const tint_symbol_8) {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  while (true) {
+    int const x_334 = m;
+    int const x_335 = high;
+    if ((x_334 <= x_335)) {
+    } else {
+      break;
+    }
+    int const x_338 = low;
+    i_2 = x_338;
+    while (true) {
+      int const x_343 = i_2;
+      int const x_344 = high;
+      if ((x_343 < x_344)) {
+      } else {
+        break;
+      }
+      int const x_347 = i_2;
+      from_1 = x_347;
+      int const x_348 = i_2;
+      int const x_349 = m;
+      mid_1 = ((x_348 + x_349) - 1);
+      int const x_352 = i_2;
+      int const x_353 = m;
+      int const x_357 = high;
+      to_1 = min(((x_352 + (2 * x_353)) - 1), x_357);
+      int const x_359 = from_1;
+      param = x_359;
+      int const x_360 = mid_1;
+      param_1 = x_360;
+      int const x_361 = to_1;
+      param_2 = x_361;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2), tint_symbol_7, tint_symbol_8);
+      {
+        int const x_363 = m;
+        int const x_365 = i_2;
+        i_2 = (x_365 + (2 * x_363));
+      }
+    }
+    {
+      int const x_367 = m;
+      m = (2 * x_367);
+    }
+  }
+  return;
+}
+
+void main_1(constant buf0& x_28, thread tint_array_wrapper* const tint_symbol_9, thread tint_array_wrapper* const tint_symbol_10, thread float4* const tint_symbol_11, thread float4* const tint_symbol_12) {
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  float const x_88 = x_28.injectionSwitch.x;
+  i_3 = int(x_88);
+  while (true) {
+    int const x_94 = i_3;
+    switch(x_94) {
+      case 9: {
+        int const x_124 = i_3;
+        (*(tint_symbol_9)).arr[x_124] = -5;
+        if (true) {
+        } else {
+          {
+            int const x_128 = i_3;
+            if ((x_128 < 10)) {
+            } else {
+              break;
+            }
+          }
+          continue;
+        }
+        break;
+      }
+      case 8: {
+        int const x_122 = i_3;
+        (*(tint_symbol_9)).arr[x_122] = -4;
+        break;
+      }
+      case 7: {
+        int const x_120 = i_3;
+        (*(tint_symbol_9)).arr[x_120] = -3;
+        break;
+      }
+      case 6: {
+        int const x_118 = i_3;
+        (*(tint_symbol_9)).arr[x_118] = -2;
+        break;
+      }
+      case 5: {
+        int const x_116 = i_3;
+        (*(tint_symbol_9)).arr[x_116] = -1;
+        break;
+      }
+      case 4: {
+        int const x_114 = i_3;
+        (*(tint_symbol_9)).arr[x_114] = 0;
+        break;
+      }
+      case 3: {
+        int const x_112 = i_3;
+        (*(tint_symbol_9)).arr[x_112] = 1;
+        break;
+      }
+      case 2: {
+        int const x_110 = i_3;
+        (*(tint_symbol_9)).arr[x_110] = 2;
+        break;
+      }
+      case 1: {
+        int const x_108 = i_3;
+        (*(tint_symbol_9)).arr[x_108] = 3;
+        break;
+      }
+      case 0: {
+        int const x_106 = i_3;
+        (*(tint_symbol_9)).arr[x_106] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    int const x_126 = i_3;
+    i_3 = (x_126 + 1);
+    {
+      int const x_128 = i_3;
+      if ((x_128 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  while (true) {
+    int const x_134 = j_1;
+    if ((x_134 < 10)) {
+    } else {
+      break;
+    }
+    int const x_137 = j_1;
+    int const x_138 = j_1;
+    int const x_140 = (*(tint_symbol_9)).arr[x_138];
+    (*(tint_symbol_10)).arr[x_137] = x_140;
+    {
+      int const x_142 = j_1;
+      j_1 = (x_142 + 1);
+    }
+  }
+  mergeSort_(tint_symbol_9, tint_symbol_10);
+  float const x_146 = (*(tint_symbol_11)).y;
+  if ((int(x_146) < 30)) {
+    int const x_153 = (*(tint_symbol_9)).arr[0];
+    grey = (0.5f + (float(x_153) / 10.0f));
+  } else {
+    float const x_158 = (*(tint_symbol_11)).y;
+    if ((int(x_158) < 60)) {
+      int const x_165 = (*(tint_symbol_9)).arr[1];
+      grey = (0.5f + (float(x_165) / 10.0f));
+    } else {
+      float const x_170 = (*(tint_symbol_11)).y;
+      if ((int(x_170) < 90)) {
+        int const x_177 = (*(tint_symbol_9)).arr[2];
+        grey = (0.5f + (float(x_177) / 10.0f));
+      } else {
+        float const x_182 = (*(tint_symbol_11)).y;
+        if ((int(x_182) < 120)) {
+          int const x_189 = (*(tint_symbol_9)).arr[3];
+          grey = (0.5f + (float(x_189) / 10.0f));
+        } else {
+          float const x_194 = (*(tint_symbol_11)).y;
+          if ((int(x_194) < 150)) {
+            discard_fragment();
+          } else {
+            float const x_201 = (*(tint_symbol_11)).y;
+            if ((int(x_201) < 180)) {
+              int const x_208 = (*(tint_symbol_9)).arr[5];
+              grey = (0.5f + (float(x_208) / 10.0f));
+            } else {
+              float const x_213 = (*(tint_symbol_11)).y;
+              if ((int(x_213) < 210)) {
+                int const x_220 = (*(tint_symbol_9)).arr[6];
+                grey = (0.5f + (float(x_220) / 10.0f));
+              } else {
+                float const x_225 = (*(tint_symbol_11)).y;
+                if ((int(x_225) < 240)) {
+                  int const x_232 = (*(tint_symbol_9)).arr[7];
+                  grey = (0.5f + (float(x_232) / 10.0f));
+                } else {
+                  float const x_237 = (*(tint_symbol_11)).y;
+                  if ((int(x_237) < 270)) {
+                    int const x_244 = (*(tint_symbol_9)).arr[8];
+                    grey = (0.5f + (float(x_244) / 10.0f));
+                  } else {
+                    discard_fragment();
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  float const x_248 = grey;
+  float3 const x_249 = float3(x_248, x_248, x_248);
+  *(tint_symbol_12) = float4(x_249.x, x_249.y, x_249.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_28 [[buffer(0)]]) {
+  thread float4 tint_symbol_13 = 0.0f;
+  thread tint_array_wrapper tint_symbol_14 = {};
+  thread tint_array_wrapper tint_symbol_15 = {};
+  thread float4 tint_symbol_16 = 0.0f;
+  tint_symbol_13 = gl_FragCoord_param;
+  main_1(x_28, &(tint_symbol_14), &(tint_symbol_15), &(tint_symbol_13), &(tint_symbol_16));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_16};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..a382317
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/1.wgsl.expected.spvasm
@@ -0,0 +1,668 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 423
+; Schema: 0
+               OpCapability Shader
+        %180 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %data "data"
+               OpName %temp "temp"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_28 "x_28"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "resolution"
+               OpName %x_32 "x_32"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %merge_i1_i1_i1_ "merge_i1_i1_i1_"
+               OpName %from "from"
+               OpName %mid "mid"
+               OpName %to "to"
+               OpName %k "k"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %i_1 "i_1"
+               OpName %mergeSort_ "mergeSort_"
+               OpName %low "low"
+               OpName %high "high"
+               OpName %m "m"
+               OpName %i_2 "i_2"
+               OpName %from_1 "from_1"
+               OpName %mid_1 "mid_1"
+               OpName %to_1 "to_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %main_1 "main_1"
+               OpName %i_3 "i_3"
+               OpName %j_1 "j_1"
+               OpName %grey "grey"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_28 NonWritable
+               OpDecorate %x_28 DescriptorSet 0
+               OpDecorate %x_28 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_32 NonWritable
+               OpDecorate %x_32 DescriptorSet 0
+               OpDecorate %x_32 Binding 1
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Private__arr_int_uint_10 = OpTypePointer Private %_arr_int_uint_10
+          %7 = OpConstantNull %_arr_int_uint_10
+       %data = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+       %temp = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_28 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %17
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_32 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+         %26 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int %_ptr_Function_int
+         %35 = OpConstantNull %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+%_ptr_Private_int = OpTypePointer Private %int
+     %int_10 = OpConstant %int 10
+        %135 = OpTypeFunction %void
+      %int_0 = OpConstant %int 0
+      %int_9 = OpConstant %int 9
+      %int_2 = OpConstant %int 2
+%_ptr_Function_float = OpTypePointer Function %float
+        %204 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %int_n5 = OpConstant %int -5
+       %true = OpConstantTrue %bool
+     %int_n4 = OpConstant %int -4
+     %int_n3 = OpConstant %int -3
+     %int_n2 = OpConstant %int -2
+     %int_n1 = OpConstant %int -1
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %int_30 = OpConstant %int 30
+  %float_0_5 = OpConstant %float 0.5
+   %float_10 = OpConstant %float 10
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+    %v3float = OpTypeVector %float 3
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %410 = OpTypeFunction %void %main_out
+%merge_i1_i1_i1_ = OpFunction %void None %26
+       %from = OpFunctionParameter %_ptr_Function_int
+        %mid = OpFunctionParameter %_ptr_Function_int
+         %to = OpFunctionParameter %_ptr_Function_int
+         %33 = OpLabel
+          %k = OpVariable %_ptr_Function_int Function %35
+          %i = OpVariable %_ptr_Function_int Function %35
+          %j = OpVariable %_ptr_Function_int Function %35
+        %i_1 = OpVariable %_ptr_Function_int Function %35
+         %40 = OpLoad %int %from
+               OpStore %k %40
+         %42 = OpLoad %int %from
+               OpStore %i %42
+         %44 = OpLoad %int %mid
+         %46 = OpIAdd %int %44 %int_1
+               OpStore %j %46
+               OpBranch %47
+         %47 = OpLabel
+               OpLoopMerge %48 %49 None
+               OpBranch %50
+         %50 = OpLabel
+         %51 = OpLoad %int %i
+         %53 = OpLoad %int %mid
+         %54 = OpLoad %int %j
+         %56 = OpLoad %int %to
+         %57 = OpSLessThanEqual %bool %51 %53
+               OpSelectionMerge %59 None
+               OpBranchConditional %57 %60 %59
+         %60 = OpLabel
+         %61 = OpSLessThanEqual %bool %54 %56
+               OpBranch %59
+         %59 = OpLabel
+         %62 = OpPhi %bool %57 %50 %61 %60
+               OpSelectionMerge %63 None
+               OpBranchConditional %62 %64 %65
+         %64 = OpLabel
+               OpBranch %63
+         %65 = OpLabel
+               OpBranch %48
+         %63 = OpLabel
+         %66 = OpLoad %int %i
+         %68 = OpAccessChain %_ptr_Private_int %data %66
+         %69 = OpLoad %int %68
+         %70 = OpLoad %int %j
+         %71 = OpAccessChain %_ptr_Private_int %data %70
+         %72 = OpLoad %int %71
+         %73 = OpSLessThan %bool %69 %72
+               OpSelectionMerge %74 None
+               OpBranchConditional %73 %75 %76
+         %75 = OpLabel
+         %77 = OpLoad %int %k
+         %78 = OpIAdd %int %77 %int_1
+               OpStore %k %78
+         %79 = OpLoad %int %i
+         %80 = OpIAdd %int %79 %int_1
+               OpStore %i %80
+         %81 = OpAccessChain %_ptr_Private_int %data %79
+         %82 = OpLoad %int %81
+         %83 = OpAccessChain %_ptr_Private_int %temp %77
+               OpStore %83 %82
+               OpBranch %74
+         %76 = OpLabel
+         %84 = OpLoad %int %k
+         %85 = OpIAdd %int %84 %int_1
+               OpStore %k %85
+         %86 = OpLoad %int %j
+         %87 = OpIAdd %int %86 %int_1
+               OpStore %j %87
+         %88 = OpAccessChain %_ptr_Private_int %data %86
+         %89 = OpLoad %int %88
+         %90 = OpAccessChain %_ptr_Private_int %temp %84
+               OpStore %90 %89
+               OpBranch %74
+         %74 = OpLabel
+               OpBranch %49
+         %49 = OpLabel
+               OpBranch %47
+         %48 = OpLabel
+               OpBranch %91
+         %91 = OpLabel
+               OpLoopMerge %92 %93 None
+               OpBranch %94
+         %94 = OpLabel
+         %95 = OpLoad %int %i
+         %96 = OpLoad %int %i
+         %98 = OpLoad %int %mid
+        %100 = OpSLessThan %bool %95 %int_10
+               OpSelectionMerge %101 None
+               OpBranchConditional %100 %102 %101
+        %102 = OpLabel
+        %103 = OpSLessThanEqual %bool %96 %98
+               OpBranch %101
+        %101 = OpLabel
+        %104 = OpPhi %bool %100 %94 %103 %102
+               OpSelectionMerge %105 None
+               OpBranchConditional %104 %106 %107
+        %106 = OpLabel
+               OpBranch %105
+        %107 = OpLabel
+               OpBranch %92
+        %105 = OpLabel
+        %108 = OpLoad %int %k
+        %109 = OpIAdd %int %108 %int_1
+               OpStore %k %109
+        %110 = OpLoad %int %i
+        %111 = OpIAdd %int %110 %int_1
+               OpStore %i %111
+        %112 = OpAccessChain %_ptr_Private_int %data %110
+        %113 = OpLoad %int %112
+        %114 = OpAccessChain %_ptr_Private_int %temp %108
+               OpStore %114 %113
+               OpBranch %93
+         %93 = OpLabel
+               OpBranch %91
+         %92 = OpLabel
+        %116 = OpLoad %int %from
+               OpStore %i_1 %116
+               OpBranch %117
+        %117 = OpLabel
+               OpLoopMerge %118 %119 None
+               OpBranch %120
+        %120 = OpLabel
+        %121 = OpLoad %int %i_1
+        %123 = OpLoad %int %to
+        %124 = OpSLessThanEqual %bool %121 %123
+               OpSelectionMerge %125 None
+               OpBranchConditional %124 %126 %127
+        %126 = OpLabel
+               OpBranch %125
+        %127 = OpLabel
+               OpBranch %118
+        %125 = OpLabel
+        %128 = OpLoad %int %i_1
+        %129 = OpLoad %int %i_1
+        %130 = OpAccessChain %_ptr_Private_int %temp %129
+        %131 = OpLoad %int %130
+        %132 = OpAccessChain %_ptr_Private_int %data %128
+               OpStore %132 %131
+               OpBranch %119
+        %119 = OpLabel
+        %133 = OpLoad %int %i_1
+        %134 = OpIAdd %int %133 %int_1
+               OpStore %i_1 %134
+               OpBranch %117
+        %118 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %mergeSort_ = OpFunction %void None %135
+        %137 = OpLabel
+        %low = OpVariable %_ptr_Function_int Function %35
+       %high = OpVariable %_ptr_Function_int Function %35
+          %m = OpVariable %_ptr_Function_int Function %35
+        %i_2 = OpVariable %_ptr_Function_int Function %35
+     %from_1 = OpVariable %_ptr_Function_int Function %35
+      %mid_1 = OpVariable %_ptr_Function_int Function %35
+       %to_1 = OpVariable %_ptr_Function_int Function %35
+      %param = OpVariable %_ptr_Function_int Function %35
+    %param_1 = OpVariable %_ptr_Function_int Function %35
+    %param_2 = OpVariable %_ptr_Function_int Function %35
+               OpStore %low %int_0
+               OpStore %high %int_9
+               OpStore %m %int_1
+               OpBranch %150
+        %150 = OpLabel
+               OpLoopMerge %151 %152 None
+               OpBranch %153
+        %153 = OpLabel
+        %154 = OpLoad %int %m
+        %155 = OpLoad %int %high
+        %156 = OpSLessThanEqual %bool %154 %155
+               OpSelectionMerge %157 None
+               OpBranchConditional %156 %158 %159
+        %158 = OpLabel
+               OpBranch %157
+        %159 = OpLabel
+               OpBranch %151
+        %157 = OpLabel
+        %160 = OpLoad %int %low
+               OpStore %i_2 %160
+               OpBranch %161
+        %161 = OpLabel
+               OpLoopMerge %162 %163 None
+               OpBranch %164
+        %164 = OpLabel
+        %165 = OpLoad %int %i_2
+        %166 = OpLoad %int %high
+        %167 = OpSLessThan %bool %165 %166
+               OpSelectionMerge %168 None
+               OpBranchConditional %167 %169 %170
+        %169 = OpLabel
+               OpBranch %168
+        %170 = OpLabel
+               OpBranch %162
+        %168 = OpLabel
+        %171 = OpLoad %int %i_2
+               OpStore %from_1 %171
+        %172 = OpLoad %int %i_2
+        %173 = OpLoad %int %m
+        %174 = OpIAdd %int %172 %173
+        %175 = OpISub %int %174 %int_1
+               OpStore %mid_1 %175
+        %176 = OpLoad %int %i_2
+        %177 = OpLoad %int %m
+        %178 = OpLoad %int %high
+        %182 = OpIMul %int %int_2 %177
+        %183 = OpIAdd %int %176 %182
+        %184 = OpISub %int %183 %int_1
+        %179 = OpExtInst %int %180 SMin %184 %178
+               OpStore %to_1 %179
+        %185 = OpLoad %int %from_1
+               OpStore %param %185
+        %186 = OpLoad %int %mid_1
+               OpStore %param_1 %186
+        %187 = OpLoad %int %to_1
+               OpStore %param_2 %187
+        %188 = OpFunctionCall %void %merge_i1_i1_i1_ %param %param_1 %param_2
+               OpBranch %163
+        %163 = OpLabel
+        %192 = OpLoad %int %m
+        %193 = OpLoad %int %i_2
+        %194 = OpIMul %int %int_2 %192
+        %195 = OpIAdd %int %193 %194
+               OpStore %i_2 %195
+               OpBranch %161
+        %162 = OpLabel
+               OpBranch %152
+        %152 = OpLabel
+        %196 = OpLoad %int %m
+        %197 = OpIMul %int %int_2 %196
+               OpStore %m %197
+               OpBranch %150
+        %151 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %135
+        %199 = OpLabel
+        %i_3 = OpVariable %_ptr_Function_int Function %35
+        %j_1 = OpVariable %_ptr_Function_int Function %35
+       %grey = OpVariable %_ptr_Function_float Function %204
+        %207 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_0
+        %208 = OpLoad %float %207
+        %209 = OpConvertFToS %int %208
+               OpStore %i_3 %209
+               OpBranch %210
+        %210 = OpLabel
+               OpLoopMerge %211 %212 None
+               OpBranch %213
+        %213 = OpLabel
+        %214 = OpLoad %int %i_3
+               OpSelectionMerge %215 None
+               OpSwitch %214 %216 9 %217 8 %218 7 %219 6 %220 5 %221 4 %222 3 %223 2 %224 1 %225 0 %226
+        %217 = OpLabel
+        %227 = OpLoad %int %i_3
+        %228 = OpAccessChain %_ptr_Private_int %data %227
+               OpStore %228 %int_n5
+               OpSelectionMerge %231 None
+               OpBranchConditional %true %232 %233
+        %232 = OpLabel
+               OpBranch %231
+        %233 = OpLabel
+               OpBranch %212
+        %231 = OpLabel
+               OpBranch %215
+        %218 = OpLabel
+        %234 = OpLoad %int %i_3
+        %235 = OpAccessChain %_ptr_Private_int %data %234
+               OpStore %235 %int_n4
+               OpBranch %215
+        %219 = OpLabel
+        %237 = OpLoad %int %i_3
+        %238 = OpAccessChain %_ptr_Private_int %data %237
+               OpStore %238 %int_n3
+               OpBranch %215
+        %220 = OpLabel
+        %240 = OpLoad %int %i_3
+        %241 = OpAccessChain %_ptr_Private_int %data %240
+               OpStore %241 %int_n2
+               OpBranch %215
+        %221 = OpLabel
+        %243 = OpLoad %int %i_3
+        %244 = OpAccessChain %_ptr_Private_int %data %243
+               OpStore %244 %int_n1
+               OpBranch %215
+        %222 = OpLabel
+        %246 = OpLoad %int %i_3
+        %247 = OpAccessChain %_ptr_Private_int %data %246
+               OpStore %247 %int_0
+               OpBranch %215
+        %223 = OpLabel
+        %248 = OpLoad %int %i_3
+        %249 = OpAccessChain %_ptr_Private_int %data %248
+               OpStore %249 %int_1
+               OpBranch %215
+        %224 = OpLabel
+        %250 = OpLoad %int %i_3
+        %251 = OpAccessChain %_ptr_Private_int %data %250
+               OpStore %251 %int_2
+               OpBranch %215
+        %225 = OpLabel
+        %252 = OpLoad %int %i_3
+        %253 = OpAccessChain %_ptr_Private_int %data %252
+               OpStore %253 %int_3
+               OpBranch %215
+        %226 = OpLabel
+        %255 = OpLoad %int %i_3
+        %256 = OpAccessChain %_ptr_Private_int %data %255
+               OpStore %256 %int_4
+               OpBranch %215
+        %216 = OpLabel
+               OpBranch %215
+        %215 = OpLabel
+        %258 = OpLoad %int %i_3
+        %259 = OpIAdd %int %258 %int_1
+               OpStore %i_3 %259
+               OpBranch %212
+        %212 = OpLabel
+        %260 = OpLoad %int %i_3
+        %261 = OpSLessThan %bool %260 %int_10
+               OpSelectionMerge %262 None
+               OpBranchConditional %261 %263 %264
+        %263 = OpLabel
+               OpBranch %262
+        %264 = OpLabel
+               OpBranch %211
+        %262 = OpLabel
+               OpBranch %210
+        %211 = OpLabel
+               OpStore %j_1 %int_0
+               OpBranch %265
+        %265 = OpLabel
+               OpLoopMerge %266 %267 None
+               OpBranch %268
+        %268 = OpLabel
+        %269 = OpLoad %int %j_1
+        %270 = OpSLessThan %bool %269 %int_10
+               OpSelectionMerge %271 None
+               OpBranchConditional %270 %272 %273
+        %272 = OpLabel
+               OpBranch %271
+        %273 = OpLabel
+               OpBranch %266
+        %271 = OpLabel
+        %274 = OpLoad %int %j_1
+        %275 = OpLoad %int %j_1
+        %276 = OpAccessChain %_ptr_Private_int %data %275
+        %277 = OpLoad %int %276
+        %278 = OpAccessChain %_ptr_Private_int %temp %274
+               OpStore %278 %277
+               OpBranch %267
+        %267 = OpLabel
+        %279 = OpLoad %int %j_1
+        %280 = OpIAdd %int %279 %int_1
+               OpStore %j_1 %280
+               OpBranch %265
+        %266 = OpLabel
+        %281 = OpFunctionCall %void %mergeSort_
+        %284 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %285 = OpLoad %float %284
+        %286 = OpConvertFToS %int %285
+        %288 = OpSLessThan %bool %286 %int_30
+               OpSelectionMerge %289 None
+               OpBranchConditional %288 %290 %291
+        %290 = OpLabel
+        %292 = OpAccessChain %_ptr_Private_int %data %int_0
+        %293 = OpLoad %int %292
+        %295 = OpConvertSToF %float %293
+        %297 = OpFDiv %float %295 %float_10
+        %298 = OpFAdd %float %float_0_5 %297
+               OpStore %grey %298
+               OpBranch %289
+        %291 = OpLabel
+        %299 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %300 = OpLoad %float %299
+        %301 = OpConvertFToS %int %300
+        %303 = OpSLessThan %bool %301 %int_60
+               OpSelectionMerge %304 None
+               OpBranchConditional %303 %305 %306
+        %305 = OpLabel
+        %307 = OpAccessChain %_ptr_Private_int %data %int_1
+        %308 = OpLoad %int %307
+        %309 = OpConvertSToF %float %308
+        %310 = OpFDiv %float %309 %float_10
+        %311 = OpFAdd %float %float_0_5 %310
+               OpStore %grey %311
+               OpBranch %304
+        %306 = OpLabel
+        %312 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %313 = OpLoad %float %312
+        %314 = OpConvertFToS %int %313
+        %316 = OpSLessThan %bool %314 %int_90
+               OpSelectionMerge %317 None
+               OpBranchConditional %316 %318 %319
+        %318 = OpLabel
+        %320 = OpAccessChain %_ptr_Private_int %data %int_2
+        %321 = OpLoad %int %320
+        %322 = OpConvertSToF %float %321
+        %323 = OpFDiv %float %322 %float_10
+        %324 = OpFAdd %float %float_0_5 %323
+               OpStore %grey %324
+               OpBranch %317
+        %319 = OpLabel
+        %325 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %326 = OpLoad %float %325
+        %327 = OpConvertFToS %int %326
+        %329 = OpSLessThan %bool %327 %int_120
+               OpSelectionMerge %330 None
+               OpBranchConditional %329 %331 %332
+        %331 = OpLabel
+        %333 = OpAccessChain %_ptr_Private_int %data %int_3
+        %334 = OpLoad %int %333
+        %335 = OpConvertSToF %float %334
+        %336 = OpFDiv %float %335 %float_10
+        %337 = OpFAdd %float %float_0_5 %336
+               OpStore %grey %337
+               OpBranch %330
+        %332 = OpLabel
+        %338 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %339 = OpLoad %float %338
+        %340 = OpConvertFToS %int %339
+        %342 = OpSLessThan %bool %340 %int_150
+               OpSelectionMerge %343 None
+               OpBranchConditional %342 %344 %345
+        %344 = OpLabel
+               OpKill
+        %345 = OpLabel
+        %346 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %347 = OpLoad %float %346
+        %348 = OpConvertFToS %int %347
+        %350 = OpSLessThan %bool %348 %int_180
+               OpSelectionMerge %351 None
+               OpBranchConditional %350 %352 %353
+        %352 = OpLabel
+        %355 = OpAccessChain %_ptr_Private_int %data %int_5
+        %356 = OpLoad %int %355
+        %357 = OpConvertSToF %float %356
+        %358 = OpFDiv %float %357 %float_10
+        %359 = OpFAdd %float %float_0_5 %358
+               OpStore %grey %359
+               OpBranch %351
+        %353 = OpLabel
+        %360 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %361 = OpLoad %float %360
+        %362 = OpConvertFToS %int %361
+        %364 = OpSLessThan %bool %362 %int_210
+               OpSelectionMerge %365 None
+               OpBranchConditional %364 %366 %367
+        %366 = OpLabel
+        %369 = OpAccessChain %_ptr_Private_int %data %int_6
+        %370 = OpLoad %int %369
+        %371 = OpConvertSToF %float %370
+        %372 = OpFDiv %float %371 %float_10
+        %373 = OpFAdd %float %float_0_5 %372
+               OpStore %grey %373
+               OpBranch %365
+        %367 = OpLabel
+        %374 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %375 = OpLoad %float %374
+        %376 = OpConvertFToS %int %375
+        %378 = OpSLessThan %bool %376 %int_240
+               OpSelectionMerge %379 None
+               OpBranchConditional %378 %380 %381
+        %380 = OpLabel
+        %383 = OpAccessChain %_ptr_Private_int %data %int_7
+        %384 = OpLoad %int %383
+        %385 = OpConvertSToF %float %384
+        %386 = OpFDiv %float %385 %float_10
+        %387 = OpFAdd %float %float_0_5 %386
+               OpStore %grey %387
+               OpBranch %379
+        %381 = OpLabel
+        %388 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %389 = OpLoad %float %388
+        %390 = OpConvertFToS %int %389
+        %392 = OpSLessThan %bool %390 %int_270
+               OpSelectionMerge %393 None
+               OpBranchConditional %392 %394 %395
+        %394 = OpLabel
+        %397 = OpAccessChain %_ptr_Private_int %data %int_8
+        %398 = OpLoad %int %397
+        %399 = OpConvertSToF %float %398
+        %400 = OpFDiv %float %399 %float_10
+        %401 = OpFAdd %float %float_0_5 %400
+               OpStore %grey %401
+               OpBranch %393
+        %395 = OpLabel
+               OpKill
+        %393 = OpLabel
+               OpBranch %379
+        %379 = OpLabel
+               OpBranch %365
+        %365 = OpLabel
+               OpBranch %351
+        %351 = OpLabel
+               OpBranch %343
+        %343 = OpLabel
+               OpBranch %330
+        %330 = OpLabel
+               OpBranch %317
+        %317 = OpLabel
+               OpBranch %304
+        %304 = OpLabel
+               OpBranch %289
+        %289 = OpLabel
+        %402 = OpLoad %float %grey
+        %404 = OpCompositeConstruct %v3float %402 %402 %402
+        %405 = OpCompositeExtract %float %404 0
+        %406 = OpCompositeExtract %float %404 1
+        %407 = OpCompositeExtract %float %404 2
+        %409 = OpCompositeConstruct %v4float %405 %406 %407 %float_1
+               OpStore %x_GLF_color %409
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %410
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %414 = OpLabel
+        %415 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %415
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %135
+        %417 = OpLabel
+        %418 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %418
+        %419 = OpFunctionCall %void %main_1
+        %421 = OpLoad %v4float %x_GLF_color
+        %422 = OpCompositeConstruct %main_out %421
+        %420 = OpFunctionCall %void %tint_symbol_3 %422
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 212[%212] is not post dominated by the back-edge block 262[%262]
+  %262 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..b969e06
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/1.wgsl.expected.wgsl
@@ -0,0 +1,317 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[block]]
+struct buf1 {
+  resolution : vec2<f32>;
+};
+
+var<private> data : array<i32, 10>;
+
+var<private> temp : array<i32, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_32 : buf1;
+
+fn merge_i1_i1_i1_(from : ptr<function, i32>, mid : ptr<function, i32>, to : ptr<function, i32>) {
+  var k : i32;
+  var i : i32;
+  var j : i32;
+  var i_1 : i32;
+  let x_255 : i32 = *(from);
+  k = x_255;
+  let x_256 : i32 = *(from);
+  i = x_256;
+  let x_257 : i32 = *(mid);
+  j = (x_257 + 1);
+  loop {
+    let x_263 : i32 = i;
+    let x_264 : i32 = *(mid);
+    let x_266 : i32 = j;
+    let x_267 : i32 = *(to);
+    if (((x_263 <= x_264) && (x_266 <= x_267))) {
+    } else {
+      break;
+    }
+    let x_271 : i32 = i;
+    let x_273 : i32 = data[x_271];
+    let x_274 : i32 = j;
+    let x_276 : i32 = data[x_274];
+    if ((x_273 < x_276)) {
+      let x_281 : i32 = k;
+      k = (x_281 + 1);
+      let x_283 : i32 = i;
+      i = (x_283 + 1);
+      let x_286 : i32 = data[x_283];
+      temp[x_281] = x_286;
+    } else {
+      let x_288 : i32 = k;
+      k = (x_288 + 1);
+      let x_290 : i32 = j;
+      j = (x_290 + 1);
+      let x_293 : i32 = data[x_290];
+      temp[x_288] = x_293;
+    }
+  }
+  loop {
+    let x_299 : i32 = i;
+    let x_301 : i32 = i;
+    let x_302 : i32 = *(mid);
+    if (((x_299 < 10) && (x_301 <= x_302))) {
+    } else {
+      break;
+    }
+    let x_306 : i32 = k;
+    k = (x_306 + 1);
+    let x_308 : i32 = i;
+    i = (x_308 + 1);
+    let x_311 : i32 = data[x_308];
+    temp[x_306] = x_311;
+  }
+  let x_313 : i32 = *(from);
+  i_1 = x_313;
+  loop {
+    let x_318 : i32 = i_1;
+    let x_319 : i32 = *(to);
+    if ((x_318 <= x_319)) {
+    } else {
+      break;
+    }
+    let x_322 : i32 = i_1;
+    let x_323 : i32 = i_1;
+    let x_325 : i32 = temp[x_323];
+    data[x_322] = x_325;
+
+    continuing {
+      let x_327 : i32 = i_1;
+      i_1 = (x_327 + 1);
+    }
+  }
+  return;
+}
+
+fn mergeSort_() {
+  var low : i32;
+  var high : i32;
+  var m : i32;
+  var i_2 : i32;
+  var from_1 : i32;
+  var mid_1 : i32;
+  var to_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  low = 0;
+  high = 9;
+  m = 1;
+  loop {
+    let x_334 : i32 = m;
+    let x_335 : i32 = high;
+    if ((x_334 <= x_335)) {
+    } else {
+      break;
+    }
+    let x_338 : i32 = low;
+    i_2 = x_338;
+    loop {
+      let x_343 : i32 = i_2;
+      let x_344 : i32 = high;
+      if ((x_343 < x_344)) {
+      } else {
+        break;
+      }
+      let x_347 : i32 = i_2;
+      from_1 = x_347;
+      let x_348 : i32 = i_2;
+      let x_349 : i32 = m;
+      mid_1 = ((x_348 + x_349) - 1);
+      let x_352 : i32 = i_2;
+      let x_353 : i32 = m;
+      let x_357 : i32 = high;
+      to_1 = min(((x_352 + (2 * x_353)) - 1), x_357);
+      let x_359 : i32 = from_1;
+      param = x_359;
+      let x_360 : i32 = mid_1;
+      param_1 = x_360;
+      let x_361 : i32 = to_1;
+      param_2 = x_361;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2));
+
+      continuing {
+        let x_363 : i32 = m;
+        let x_365 : i32 = i_2;
+        i_2 = (x_365 + (2 * x_363));
+      }
+    }
+
+    continuing {
+      let x_367 : i32 = m;
+      m = (2 * x_367);
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_3 : i32;
+  var j_1 : i32;
+  var grey : f32;
+  let x_88 : f32 = x_28.injectionSwitch.x;
+  i_3 = i32(x_88);
+  loop {
+    let x_94 : i32 = i_3;
+    switch(x_94) {
+      case 9: {
+        let x_124 : i32 = i_3;
+        data[x_124] = -5;
+        if (true) {
+        } else {
+          continue;
+        }
+      }
+      case 8: {
+        let x_122 : i32 = i_3;
+        data[x_122] = -4;
+      }
+      case 7: {
+        let x_120 : i32 = i_3;
+        data[x_120] = -3;
+      }
+      case 6: {
+        let x_118 : i32 = i_3;
+        data[x_118] = -2;
+      }
+      case 5: {
+        let x_116 : i32 = i_3;
+        data[x_116] = -1;
+      }
+      case 4: {
+        let x_114 : i32 = i_3;
+        data[x_114] = 0;
+      }
+      case 3: {
+        let x_112 : i32 = i_3;
+        data[x_112] = 1;
+      }
+      case 2: {
+        let x_110 : i32 = i_3;
+        data[x_110] = 2;
+      }
+      case 1: {
+        let x_108 : i32 = i_3;
+        data[x_108] = 3;
+      }
+      case 0: {
+        let x_106 : i32 = i_3;
+        data[x_106] = 4;
+      }
+      default: {
+      }
+    }
+    let x_126 : i32 = i_3;
+    i_3 = (x_126 + 1);
+
+    continuing {
+      let x_128 : i32 = i_3;
+      if ((x_128 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  loop {
+    let x_134 : i32 = j_1;
+    if ((x_134 < 10)) {
+    } else {
+      break;
+    }
+    let x_137 : i32 = j_1;
+    let x_138 : i32 = j_1;
+    let x_140 : i32 = data[x_138];
+    temp[x_137] = x_140;
+
+    continuing {
+      let x_142 : i32 = j_1;
+      j_1 = (x_142 + 1);
+    }
+  }
+  mergeSort_();
+  let x_146 : f32 = gl_FragCoord.y;
+  if ((i32(x_146) < 30)) {
+    let x_153 : i32 = data[0];
+    grey = (0.5 + (f32(x_153) / 10.0));
+  } else {
+    let x_158 : f32 = gl_FragCoord.y;
+    if ((i32(x_158) < 60)) {
+      let x_165 : i32 = data[1];
+      grey = (0.5 + (f32(x_165) / 10.0));
+    } else {
+      let x_170 : f32 = gl_FragCoord.y;
+      if ((i32(x_170) < 90)) {
+        let x_177 : i32 = data[2];
+        grey = (0.5 + (f32(x_177) / 10.0));
+      } else {
+        let x_182 : f32 = gl_FragCoord.y;
+        if ((i32(x_182) < 120)) {
+          let x_189 : i32 = data[3];
+          grey = (0.5 + (f32(x_189) / 10.0));
+        } else {
+          let x_194 : f32 = gl_FragCoord.y;
+          if ((i32(x_194) < 150)) {
+            discard;
+          } else {
+            let x_201 : f32 = gl_FragCoord.y;
+            if ((i32(x_201) < 180)) {
+              let x_208 : i32 = data[5];
+              grey = (0.5 + (f32(x_208) / 10.0));
+            } else {
+              let x_213 : f32 = gl_FragCoord.y;
+              if ((i32(x_213) < 210)) {
+                let x_220 : i32 = data[6];
+                grey = (0.5 + (f32(x_220) / 10.0));
+              } else {
+                let x_225 : f32 = gl_FragCoord.y;
+                if ((i32(x_225) < 240)) {
+                  let x_232 : i32 = data[7];
+                  grey = (0.5 + (f32(x_232) / 10.0));
+                } else {
+                  let x_237 : f32 = gl_FragCoord.y;
+                  if ((i32(x_237) < 270)) {
+                    let x_244 : i32 = data[8];
+                    grey = (0.5 + (f32(x_244) / 10.0));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  let x_248 : f32 = grey;
+  let x_249 : vec3<f32> = vec3<f32>(x_248, x_248, x_248);
+  x_GLF_color = vec4<f32>(x_249.x, x_249.y, x_249.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/0.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/0.spvasm
new file mode 100644
index 0000000..9da572b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/0.spvasm
@@ -0,0 +1,177 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "resolution"
+               OpName %_ ""
+               OpName %data "data"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %__0 ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %int_10 = OpConstant %int 10
+    %uint_10 = OpConstant %uint 10
+%_arr_float_uint_10 = OpTypeArray %float %uint_10
+%_ptr_Function__arr_float_uint_10 = OpTypePointer Function %_arr_float_uint_10
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_1 = OpConstant %int 1
+      %int_9 = OpConstant %int 9
+     %uint_0 = OpConstant %uint 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+      %int_5 = OpConstant %int 5
+    %float_1 = OpConstant %float 1
+  %float_0_5 = OpConstant %float 0.5
+%float_0_100000001 = OpConstant %float 0.100000001
+       %main = OpFunction %void None %11
+         %38 = OpLabel
+       %data = OpVariable %_ptr_Function__arr_float_uint_10 Function
+               OpBranch %39
+         %39 = OpLabel
+         %40 = OpPhi %int %int_0 %38 %41 %42
+         %43 = OpSLessThan %bool %40 %int_10
+               OpLoopMerge %44 %42 None
+               OpBranchConditional %43 %42 %44
+         %42 = OpLabel
+         %45 = OpISub %int %int_10 %40
+         %46 = OpConvertSToF %float %45
+         %47 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %uint_1
+         %48 = OpLoad %float %47
+         %49 = OpFMul %float %46 %48
+         %50 = OpAccessChain %_ptr_Function_float %data %40
+               OpStore %50 %49
+         %41 = OpIAdd %int %40 %int_1
+               OpBranch %39
+         %44 = OpLabel
+               OpBranch %51
+         %51 = OpLabel
+         %52 = OpPhi %int %int_0 %44 %53 %54
+         %55 = OpSLessThan %bool %52 %int_9
+               OpLoopMerge %56 %54 None
+               OpBranchConditional %55 %57 %56
+         %57 = OpLabel
+               OpBranch %58
+         %58 = OpLabel
+         %59 = OpPhi %int %int_0 %57 %60 %61
+         %62 = OpSLessThan %bool %59 %int_10
+               OpLoopMerge %63 %61 None
+               OpBranchConditional %62 %64 %63
+         %64 = OpLabel
+         %65 = OpIAdd %int %52 %int_1
+         %66 = OpSLessThan %bool %59 %65
+               OpSelectionMerge %67 None
+               OpBranchConditional %66 %68 %67
+         %68 = OpLabel
+               OpBranch %61
+         %67 = OpLabel
+         %69 = OpAccessChain %_ptr_Function_float %data %52
+         %70 = OpLoad %float %69
+         %71 = OpAccessChain %_ptr_Function_float %data %59
+         %72 = OpLoad %float %71
+         %73 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %74 = OpLoad %float %73
+         %75 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %76 = OpLoad %float %75
+         %77 = OpFMul %float %76 %float_0_5
+         %78 = OpFOrdLessThan %bool %74 %77
+               OpSelectionMerge %79 None
+               OpBranchConditional %78 %80 %81
+         %80 = OpLabel
+         %82 = OpFOrdGreaterThan %bool %70 %72
+               OpBranch %79
+         %81 = OpLabel
+         %83 = OpFOrdLessThan %bool %70 %72
+               OpBranch %79
+         %79 = OpLabel
+         %84 = OpPhi %bool %82 %80 %83 %81
+               OpSelectionMerge %85 None
+               OpBranchConditional %84 %86 %85
+         %86 = OpLabel
+         %87 = OpLoad %float %69
+         %88 = OpLoad %float %71
+               OpStore %69 %88
+               OpStore %71 %87
+               OpBranch %85
+         %85 = OpLabel
+               OpBranch %61
+         %61 = OpLabel
+         %60 = OpIAdd %int %59 %int_1
+               OpBranch %58
+         %63 = OpLabel
+               OpBranch %54
+         %54 = OpLabel
+         %53 = OpIAdd %int %52 %int_1
+               OpBranch %51
+         %56 = OpLabel
+         %89 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %90 = OpLoad %float %89
+         %91 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %92 = OpLoad %float %91
+         %93 = OpFMul %float %92 %float_0_5
+         %94 = OpFOrdLessThan %bool %90 %93
+               OpSelectionMerge %95 None
+               OpBranchConditional %94 %96 %97
+         %96 = OpLabel
+         %98 = OpAccessChain %_ptr_Function_float %data %int_0
+         %99 = OpLoad %float %98
+        %100 = OpFMul %float %99 %float_0_100000001
+        %101 = OpAccessChain %_ptr_Function_float %data %int_5
+        %102 = OpLoad %float %101
+        %103 = OpFMul %float %102 %float_0_100000001
+        %104 = OpAccessChain %_ptr_Function_float %data %int_9
+        %105 = OpLoad %float %104
+        %106 = OpFMul %float %105 %float_0_100000001
+        %107 = OpCompositeConstruct %v4float %100 %103 %106 %float_1
+               OpStore %_GLF_color %107
+               OpBranch %95
+         %97 = OpLabel
+        %108 = OpAccessChain %_ptr_Function_float %data %int_5
+        %109 = OpLoad %float %108
+        %110 = OpFMul %float %109 %float_0_100000001
+        %111 = OpAccessChain %_ptr_Function_float %data %int_9
+        %112 = OpLoad %float %111
+        %113 = OpFMul %float %112 %float_0_100000001
+        %114 = OpAccessChain %_ptr_Function_float %data %int_0
+        %115 = OpLoad %float %114
+        %116 = OpFMul %float %115 %float_0_100000001
+        %117 = OpCompositeConstruct %v4float %110 %113 %116 %float_1
+               OpStore %_GLF_color %117
+               OpBranch %95
+         %95 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..059390e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/0.spvasm.expected.hlsl
@@ -0,0 +1,118 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[1];
+};
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float data[10] = (float[10])0;
+  int x_40_phi = 0;
+  int x_52_phi = 0;
+  x_40_phi = 0;
+  while (true) {
+    int x_41 = 0;
+    const int x_40 = x_40_phi;
+    if ((x_40 < 10)) {
+    } else {
+      break;
+    }
+    {
+      const float x_48 = asfloat(x_9[0].y);
+      data[x_40] = (float((10 - x_40)) * x_48);
+      x_41 = (x_40 + 1);
+      x_40_phi = x_41;
+    }
+  }
+  x_52_phi = 0;
+  while (true) {
+    int x_53 = 0;
+    int x_59_phi = 0;
+    const int x_52 = x_52_phi;
+    if ((x_52 < 9)) {
+    } else {
+      break;
+    }
+    x_59_phi = 0;
+    while (true) {
+      bool x_82 = false;
+      bool x_83 = false;
+      int x_60 = 0;
+      bool x_84_phi = false;
+      const int x_59 = x_59_phi;
+      if ((x_59 < 10)) {
+      } else {
+        break;
+      }
+      if ((x_59 < (x_52 + 1))) {
+        {
+          x_60 = (x_59 + 1);
+          x_59_phi = x_60;
+        }
+        continue;
+      }
+      const int x_69_save = x_52;
+      const float x_70 = data[x_69_save];
+      const int x_71_save = x_59;
+      const float x_72 = data[x_71_save];
+      const float x_74 = gl_FragCoord.y;
+      const float x_76 = asfloat(x_6[0].y);
+      if ((x_74 < (x_76 * 0.5f))) {
+        x_82 = (x_70 > x_72);
+        x_84_phi = x_82;
+      } else {
+        x_83 = (x_70 < x_72);
+        x_84_phi = x_83;
+      }
+      if (x_84_phi) {
+        const float x_87 = data[x_69_save];
+        const float x_88 = data[x_71_save];
+        data[x_69_save] = x_88;
+        data[x_71_save] = x_87;
+      }
+      {
+        x_60 = (x_59 + 1);
+        x_59_phi = x_60;
+      }
+    }
+    {
+      x_53 = (x_52 + 1);
+      x_52_phi = x_53;
+    }
+  }
+  const float x_90 = gl_FragCoord.x;
+  const float x_92 = asfloat(x_6[0].x);
+  if ((x_90 < (x_92 * 0.5f))) {
+    const float x_99 = data[0];
+    const float x_102 = data[5];
+    const float x_105 = data[9];
+    x_GLF_color = float4((x_99 * 0.100000001f), (x_102 * 0.100000001f), (x_105 * 0.100000001f), 1.0f);
+  } else {
+    const float x_109 = data[5];
+    const float x_112 = data[9];
+    const float x_115 = data[0];
+    x_GLF_color = float4((x_109 * 0.100000001f), (x_112 * 0.100000001f), (x_115 * 0.100000001f), 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/0.spvasm.expected.msl
new file mode 100644
index 0000000..45769f1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/0.spvasm.expected.msl
@@ -0,0 +1,121 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf1 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  float arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_9, constant buf1& x_6, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  tint_array_wrapper data = {};
+  int x_40_phi = 0;
+  int x_52_phi = 0;
+  x_40_phi = 0;
+  while (true) {
+    int x_41 = 0;
+    int const x_40 = x_40_phi;
+    if ((x_40 < 10)) {
+    } else {
+      break;
+    }
+    {
+      float const x_48 = x_9.injectionSwitch.y;
+      data.arr[x_40] = (float((10 - x_40)) * x_48);
+      x_41 = (x_40 + 1);
+      x_40_phi = x_41;
+    }
+  }
+  x_52_phi = 0;
+  while (true) {
+    int x_53 = 0;
+    int x_59_phi = 0;
+    int const x_52 = x_52_phi;
+    if ((x_52 < 9)) {
+    } else {
+      break;
+    }
+    x_59_phi = 0;
+    while (true) {
+      bool x_82 = false;
+      bool x_83 = false;
+      int x_60 = 0;
+      bool x_84_phi = false;
+      int const x_59 = x_59_phi;
+      if ((x_59 < 10)) {
+      } else {
+        break;
+      }
+      if ((x_59 < (x_52 + 1))) {
+        {
+          x_60 = (x_59 + 1);
+          x_59_phi = x_60;
+        }
+        continue;
+      }
+      int const x_69_save = x_52;
+      float const x_70 = data.arr[x_69_save];
+      int const x_71_save = x_59;
+      float const x_72 = data.arr[x_71_save];
+      float const x_74 = (*(tint_symbol_5)).y;
+      float const x_76 = x_6.resolution.y;
+      if ((x_74 < (x_76 * 0.5f))) {
+        x_82 = (x_70 > x_72);
+        x_84_phi = x_82;
+      } else {
+        x_83 = (x_70 < x_72);
+        x_84_phi = x_83;
+      }
+      bool const x_84 = x_84_phi;
+      if (x_84) {
+        float const x_87 = data.arr[x_69_save];
+        float const x_88 = data.arr[x_71_save];
+        data.arr[x_69_save] = x_88;
+        data.arr[x_71_save] = x_87;
+      }
+      {
+        x_60 = (x_59 + 1);
+        x_59_phi = x_60;
+      }
+    }
+    {
+      x_53 = (x_52 + 1);
+      x_52_phi = x_53;
+    }
+  }
+  float const x_90 = (*(tint_symbol_5)).x;
+  float const x_92 = x_6.resolution.x;
+  if ((x_90 < (x_92 * 0.5f))) {
+    float const x_99 = data.arr[0];
+    float const x_102 = data.arr[5];
+    float const x_105 = data.arr[9];
+    *(tint_symbol_6) = float4((x_99 * 0.100000001f), (x_102 * 0.100000001f), (x_105 * 0.100000001f), 1.0f);
+  } else {
+    float const x_109 = data.arr[5];
+    float const x_112 = data.arr[9];
+    float const x_115 = data.arr[0];
+    *(tint_symbol_6) = float4((x_109 * 0.100000001f), (x_112 * 0.100000001f), (x_115 * 0.100000001f), 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_9 [[buffer(0)]], constant buf1& x_6 [[buffer(1)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_9, x_6, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..43b700f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/0.spvasm.expected.spvasm
@@ -0,0 +1,282 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 167
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %data "data"
+               OpName %x_40_phi "x_40_phi"
+               OpName %x_52_phi "x_52_phi"
+               OpName %x_41 "x_41"
+               OpName %x_53 "x_53"
+               OpName %x_59_phi "x_59_phi"
+               OpName %x_82 "x_82"
+               OpName %x_83 "x_83"
+               OpName %x_60 "x_60"
+               OpName %x_84_phi "x_84_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_float_uint_10 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_float_uint_10 = OpTypeArray %float %uint_10
+%_ptr_Function__arr_float_uint_10 = OpTypePointer Function %_arr_float_uint_10
+         %27 = OpConstantNull %_arr_float_uint_10
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %31 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+     %int_10 = OpConstant %int 10
+       %bool = OpTypeBool
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_1 = OpConstant %int 1
+      %int_9 = OpConstant %int 9
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %77 = OpConstantNull %bool
+%_ptr_Private_float = OpTypePointer Private %float
+  %float_0_5 = OpConstant %float 0.5
+      %int_5 = OpConstant %int 5
+%float_0_100000001 = OpConstant %float 0.100000001
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %154 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %18
+         %21 = OpLabel
+       %data = OpVariable %_ptr_Function__arr_float_uint_10 Function %27
+   %x_40_phi = OpVariable %_ptr_Function_int Function %31
+   %x_52_phi = OpVariable %_ptr_Function_int Function %31
+       %x_41 = OpVariable %_ptr_Function_int Function %31
+       %x_53 = OpVariable %_ptr_Function_int Function %31
+   %x_59_phi = OpVariable %_ptr_Function_int Function %31
+       %x_82 = OpVariable %_ptr_Function_bool Function %77
+       %x_83 = OpVariable %_ptr_Function_bool Function %77
+       %x_60 = OpVariable %_ptr_Function_int Function %31
+   %x_84_phi = OpVariable %_ptr_Function_bool Function %77
+               OpStore %x_40_phi %int_0
+               OpBranch %34
+         %34 = OpLabel
+               OpLoopMerge %35 %36 None
+               OpBranch %37
+         %37 = OpLabel
+         %39 = OpLoad %int %x_40_phi
+         %41 = OpSLessThan %bool %39 %int_10
+               OpSelectionMerge %43 None
+               OpBranchConditional %41 %44 %45
+         %44 = OpLabel
+               OpBranch %43
+         %45 = OpLabel
+               OpBranch %35
+         %43 = OpLabel
+               OpBranch %36
+         %36 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_1
+         %50 = OpLoad %float %49
+         %52 = OpAccessChain %_ptr_Function_float %data %39
+         %54 = OpISub %int %int_10 %39
+         %53 = OpConvertSToF %float %54
+         %55 = OpFMul %float %53 %50
+               OpStore %52 %55
+         %57 = OpIAdd %int %39 %int_1
+               OpStore %x_41 %57
+         %58 = OpLoad %int %x_41
+               OpStore %x_40_phi %58
+               OpBranch %34
+         %35 = OpLabel
+               OpStore %x_52_phi %int_0
+               OpBranch %59
+         %59 = OpLabel
+               OpLoopMerge %60 %61 None
+               OpBranch %62
+         %62 = OpLabel
+         %65 = OpLoad %int %x_52_phi
+         %67 = OpSLessThan %bool %65 %int_9
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %70
+         %69 = OpLabel
+               OpBranch %68
+         %70 = OpLabel
+               OpBranch %60
+         %68 = OpLabel
+               OpStore %x_59_phi %int_0
+               OpBranch %71
+         %71 = OpLabel
+               OpLoopMerge %72 %73 None
+               OpBranch %74
+         %74 = OpLabel
+         %81 = OpLoad %int %x_59_phi
+         %82 = OpSLessThan %bool %81 %int_10
+               OpSelectionMerge %83 None
+               OpBranchConditional %82 %84 %85
+         %84 = OpLabel
+               OpBranch %83
+         %85 = OpLabel
+               OpBranch %72
+         %83 = OpLabel
+         %86 = OpIAdd %int %65 %int_1
+         %87 = OpSLessThan %bool %81 %86
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %88
+         %89 = OpLabel
+               OpBranch %73
+         %88 = OpLabel
+         %90 = OpAccessChain %_ptr_Function_float %data %65
+         %91 = OpLoad %float %90
+         %92 = OpAccessChain %_ptr_Function_float %data %81
+         %93 = OpLoad %float %92
+         %95 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %96 = OpLoad %float %95
+         %97 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %98 = OpLoad %float %97
+        %100 = OpFMul %float %98 %float_0_5
+        %101 = OpFOrdLessThan %bool %96 %100
+               OpSelectionMerge %102 None
+               OpBranchConditional %101 %103 %104
+        %103 = OpLabel
+        %105 = OpFOrdGreaterThan %bool %91 %93
+               OpStore %x_82 %105
+        %106 = OpLoad %bool %x_82
+               OpStore %x_84_phi %106
+               OpBranch %102
+        %104 = OpLabel
+        %107 = OpFOrdLessThan %bool %91 %93
+               OpStore %x_83 %107
+        %108 = OpLoad %bool %x_83
+               OpStore %x_84_phi %108
+               OpBranch %102
+        %102 = OpLabel
+        %109 = OpLoad %bool %x_84_phi
+               OpSelectionMerge %110 None
+               OpBranchConditional %109 %111 %110
+        %111 = OpLabel
+        %112 = OpAccessChain %_ptr_Function_float %data %65
+        %113 = OpLoad %float %112
+        %114 = OpAccessChain %_ptr_Function_float %data %81
+        %115 = OpLoad %float %114
+        %116 = OpAccessChain %_ptr_Function_float %data %65
+               OpStore %116 %115
+        %117 = OpAccessChain %_ptr_Function_float %data %81
+               OpStore %117 %113
+               OpBranch %110
+        %110 = OpLabel
+               OpBranch %73
+         %73 = OpLabel
+        %118 = OpIAdd %int %81 %int_1
+               OpStore %x_60 %118
+        %119 = OpLoad %int %x_60
+               OpStore %x_59_phi %119
+               OpBranch %71
+         %72 = OpLabel
+               OpBranch %61
+         %61 = OpLabel
+        %120 = OpIAdd %int %65 %int_1
+               OpStore %x_53 %120
+        %121 = OpLoad %int %x_53
+               OpStore %x_52_phi %121
+               OpBranch %59
+         %60 = OpLabel
+        %122 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+        %123 = OpLoad %float %122
+        %124 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+        %125 = OpLoad %float %124
+        %126 = OpFMul %float %125 %float_0_5
+        %127 = OpFOrdLessThan %bool %123 %126
+               OpSelectionMerge %128 None
+               OpBranchConditional %127 %129 %130
+        %129 = OpLabel
+        %131 = OpAccessChain %_ptr_Function_float %data %int_0
+        %132 = OpLoad %float %131
+        %134 = OpAccessChain %_ptr_Function_float %data %int_5
+        %135 = OpLoad %float %134
+        %136 = OpAccessChain %_ptr_Function_float %data %int_9
+        %137 = OpLoad %float %136
+        %139 = OpFMul %float %132 %float_0_100000001
+        %140 = OpFMul %float %135 %float_0_100000001
+        %141 = OpFMul %float %137 %float_0_100000001
+        %143 = OpCompositeConstruct %v4float %139 %140 %141 %float_1
+               OpStore %x_GLF_color %143
+               OpBranch %128
+        %130 = OpLabel
+        %144 = OpAccessChain %_ptr_Function_float %data %int_5
+        %145 = OpLoad %float %144
+        %146 = OpAccessChain %_ptr_Function_float %data %int_9
+        %147 = OpLoad %float %146
+        %148 = OpAccessChain %_ptr_Function_float %data %int_0
+        %149 = OpLoad %float %148
+        %150 = OpFMul %float %145 %float_0_100000001
+        %151 = OpFMul %float %147 %float_0_100000001
+        %152 = OpFMul %float %149 %float_0_100000001
+        %153 = OpCompositeConstruct %v4float %150 %151 %152 %float_1
+               OpStore %x_GLF_color %153
+               OpBranch %128
+        %128 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %154
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %158 = OpLabel
+        %159 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %159
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %18
+        %161 = OpLabel
+        %162 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %162
+        %163 = OpFunctionCall %void %main_1
+        %165 = OpLoad %v4float %x_GLF_color
+        %166 = OpCompositeConstruct %main_out %165
+        %164 = OpFunctionCall %void %tint_symbol_3 %166
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..819f07b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/0.spvasm.expected.wgsl
@@ -0,0 +1,120 @@
+[[block]]
+struct buf1 {
+  resolution : vec2<f32>;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var data : array<f32, 10>;
+  var x_40_phi : i32;
+  var x_52_phi : i32;
+  x_40_phi = 0;
+  loop {
+    var x_41 : i32;
+    let x_40 : i32 = x_40_phi;
+    if ((x_40 < 10)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_48 : f32 = x_9.injectionSwitch.y;
+      data[x_40] = (f32((10 - x_40)) * x_48);
+      x_41 = (x_40 + 1);
+      x_40_phi = x_41;
+    }
+  }
+  x_52_phi = 0;
+  loop {
+    var x_53 : i32;
+    var x_59_phi : i32;
+    let x_52 : i32 = x_52_phi;
+    if ((x_52 < 9)) {
+    } else {
+      break;
+    }
+    x_59_phi = 0;
+    loop {
+      var x_82 : bool;
+      var x_83 : bool;
+      var x_60 : i32;
+      var x_84_phi : bool;
+      let x_59 : i32 = x_59_phi;
+      if ((x_59 < 10)) {
+      } else {
+        break;
+      }
+      if ((x_59 < (x_52 + 1))) {
+        continue;
+      }
+      let x_69 : ptr<function, f32> = &(data[x_52]);
+      let x_70 : f32 = *(x_69);
+      let x_71 : ptr<function, f32> = &(data[x_59]);
+      let x_72 : f32 = *(x_71);
+      let x_74 : f32 = gl_FragCoord.y;
+      let x_76 : f32 = x_6.resolution.y;
+      if ((x_74 < (x_76 * 0.5))) {
+        x_82 = (x_70 > x_72);
+        x_84_phi = x_82;
+      } else {
+        x_83 = (x_70 < x_72);
+        x_84_phi = x_83;
+      }
+      let x_84 : bool = x_84_phi;
+      if (x_84) {
+        let x_87 : f32 = *(x_69);
+        let x_88 : f32 = *(x_71);
+        *(x_69) = x_88;
+        *(x_71) = x_87;
+      }
+
+      continuing {
+        x_60 = (x_59 + 1);
+        x_59_phi = x_60;
+      }
+    }
+
+    continuing {
+      x_53 = (x_52 + 1);
+      x_52_phi = x_53;
+    }
+  }
+  let x_90 : f32 = gl_FragCoord.x;
+  let x_92 : f32 = x_6.resolution.x;
+  if ((x_90 < (x_92 * 0.5))) {
+    let x_99 : f32 = data[0];
+    let x_102 : f32 = data[5];
+    let x_105 : f32 = data[9];
+    x_GLF_color = vec4<f32>((x_99 * 0.100000001), (x_102 * 0.100000001), (x_105 * 0.100000001), 1.0);
+  } else {
+    let x_109 : f32 = data[5];
+    let x_112 : f32 = data[9];
+    let x_115 : f32 = data[0];
+    x_GLF_color = vec4<f32>((x_109 * 0.100000001), (x_112 * 0.100000001), (x_115 * 0.100000001), 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/0.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/0.wgsl
new file mode 100644
index 0000000..819f07b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/0.wgsl
@@ -0,0 +1,120 @@
+[[block]]
+struct buf1 {
+  resolution : vec2<f32>;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var data : array<f32, 10>;
+  var x_40_phi : i32;
+  var x_52_phi : i32;
+  x_40_phi = 0;
+  loop {
+    var x_41 : i32;
+    let x_40 : i32 = x_40_phi;
+    if ((x_40 < 10)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_48 : f32 = x_9.injectionSwitch.y;
+      data[x_40] = (f32((10 - x_40)) * x_48);
+      x_41 = (x_40 + 1);
+      x_40_phi = x_41;
+    }
+  }
+  x_52_phi = 0;
+  loop {
+    var x_53 : i32;
+    var x_59_phi : i32;
+    let x_52 : i32 = x_52_phi;
+    if ((x_52 < 9)) {
+    } else {
+      break;
+    }
+    x_59_phi = 0;
+    loop {
+      var x_82 : bool;
+      var x_83 : bool;
+      var x_60 : i32;
+      var x_84_phi : bool;
+      let x_59 : i32 = x_59_phi;
+      if ((x_59 < 10)) {
+      } else {
+        break;
+      }
+      if ((x_59 < (x_52 + 1))) {
+        continue;
+      }
+      let x_69 : ptr<function, f32> = &(data[x_52]);
+      let x_70 : f32 = *(x_69);
+      let x_71 : ptr<function, f32> = &(data[x_59]);
+      let x_72 : f32 = *(x_71);
+      let x_74 : f32 = gl_FragCoord.y;
+      let x_76 : f32 = x_6.resolution.y;
+      if ((x_74 < (x_76 * 0.5))) {
+        x_82 = (x_70 > x_72);
+        x_84_phi = x_82;
+      } else {
+        x_83 = (x_70 < x_72);
+        x_84_phi = x_83;
+      }
+      let x_84 : bool = x_84_phi;
+      if (x_84) {
+        let x_87 : f32 = *(x_69);
+        let x_88 : f32 = *(x_71);
+        *(x_69) = x_88;
+        *(x_71) = x_87;
+      }
+
+      continuing {
+        x_60 = (x_59 + 1);
+        x_59_phi = x_60;
+      }
+    }
+
+    continuing {
+      x_53 = (x_52 + 1);
+      x_52_phi = x_53;
+    }
+  }
+  let x_90 : f32 = gl_FragCoord.x;
+  let x_92 : f32 = x_6.resolution.x;
+  if ((x_90 < (x_92 * 0.5))) {
+    let x_99 : f32 = data[0];
+    let x_102 : f32 = data[5];
+    let x_105 : f32 = data[9];
+    x_GLF_color = vec4<f32>((x_99 * 0.100000001), (x_102 * 0.100000001), (x_105 * 0.100000001), 1.0);
+  } else {
+    let x_109 : f32 = data[5];
+    let x_112 : f32 = data[9];
+    let x_115 : f32 = data[0];
+    x_GLF_color = vec4<f32>((x_109 * 0.100000001), (x_112 * 0.100000001), (x_115 * 0.100000001), 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..059390e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/0.wgsl.expected.hlsl
@@ -0,0 +1,118 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[1];
+};
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float data[10] = (float[10])0;
+  int x_40_phi = 0;
+  int x_52_phi = 0;
+  x_40_phi = 0;
+  while (true) {
+    int x_41 = 0;
+    const int x_40 = x_40_phi;
+    if ((x_40 < 10)) {
+    } else {
+      break;
+    }
+    {
+      const float x_48 = asfloat(x_9[0].y);
+      data[x_40] = (float((10 - x_40)) * x_48);
+      x_41 = (x_40 + 1);
+      x_40_phi = x_41;
+    }
+  }
+  x_52_phi = 0;
+  while (true) {
+    int x_53 = 0;
+    int x_59_phi = 0;
+    const int x_52 = x_52_phi;
+    if ((x_52 < 9)) {
+    } else {
+      break;
+    }
+    x_59_phi = 0;
+    while (true) {
+      bool x_82 = false;
+      bool x_83 = false;
+      int x_60 = 0;
+      bool x_84_phi = false;
+      const int x_59 = x_59_phi;
+      if ((x_59 < 10)) {
+      } else {
+        break;
+      }
+      if ((x_59 < (x_52 + 1))) {
+        {
+          x_60 = (x_59 + 1);
+          x_59_phi = x_60;
+        }
+        continue;
+      }
+      const int x_69_save = x_52;
+      const float x_70 = data[x_69_save];
+      const int x_71_save = x_59;
+      const float x_72 = data[x_71_save];
+      const float x_74 = gl_FragCoord.y;
+      const float x_76 = asfloat(x_6[0].y);
+      if ((x_74 < (x_76 * 0.5f))) {
+        x_82 = (x_70 > x_72);
+        x_84_phi = x_82;
+      } else {
+        x_83 = (x_70 < x_72);
+        x_84_phi = x_83;
+      }
+      if (x_84_phi) {
+        const float x_87 = data[x_69_save];
+        const float x_88 = data[x_71_save];
+        data[x_69_save] = x_88;
+        data[x_71_save] = x_87;
+      }
+      {
+        x_60 = (x_59 + 1);
+        x_59_phi = x_60;
+      }
+    }
+    {
+      x_53 = (x_52 + 1);
+      x_52_phi = x_53;
+    }
+  }
+  const float x_90 = gl_FragCoord.x;
+  const float x_92 = asfloat(x_6[0].x);
+  if ((x_90 < (x_92 * 0.5f))) {
+    const float x_99 = data[0];
+    const float x_102 = data[5];
+    const float x_105 = data[9];
+    x_GLF_color = float4((x_99 * 0.100000001f), (x_102 * 0.100000001f), (x_105 * 0.100000001f), 1.0f);
+  } else {
+    const float x_109 = data[5];
+    const float x_112 = data[9];
+    const float x_115 = data[0];
+    x_GLF_color = float4((x_109 * 0.100000001f), (x_112 * 0.100000001f), (x_115 * 0.100000001f), 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/0.wgsl.expected.msl
new file mode 100644
index 0000000..45769f1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/0.wgsl.expected.msl
@@ -0,0 +1,121 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf1 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  float arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_9, constant buf1& x_6, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  tint_array_wrapper data = {};
+  int x_40_phi = 0;
+  int x_52_phi = 0;
+  x_40_phi = 0;
+  while (true) {
+    int x_41 = 0;
+    int const x_40 = x_40_phi;
+    if ((x_40 < 10)) {
+    } else {
+      break;
+    }
+    {
+      float const x_48 = x_9.injectionSwitch.y;
+      data.arr[x_40] = (float((10 - x_40)) * x_48);
+      x_41 = (x_40 + 1);
+      x_40_phi = x_41;
+    }
+  }
+  x_52_phi = 0;
+  while (true) {
+    int x_53 = 0;
+    int x_59_phi = 0;
+    int const x_52 = x_52_phi;
+    if ((x_52 < 9)) {
+    } else {
+      break;
+    }
+    x_59_phi = 0;
+    while (true) {
+      bool x_82 = false;
+      bool x_83 = false;
+      int x_60 = 0;
+      bool x_84_phi = false;
+      int const x_59 = x_59_phi;
+      if ((x_59 < 10)) {
+      } else {
+        break;
+      }
+      if ((x_59 < (x_52 + 1))) {
+        {
+          x_60 = (x_59 + 1);
+          x_59_phi = x_60;
+        }
+        continue;
+      }
+      int const x_69_save = x_52;
+      float const x_70 = data.arr[x_69_save];
+      int const x_71_save = x_59;
+      float const x_72 = data.arr[x_71_save];
+      float const x_74 = (*(tint_symbol_5)).y;
+      float const x_76 = x_6.resolution.y;
+      if ((x_74 < (x_76 * 0.5f))) {
+        x_82 = (x_70 > x_72);
+        x_84_phi = x_82;
+      } else {
+        x_83 = (x_70 < x_72);
+        x_84_phi = x_83;
+      }
+      bool const x_84 = x_84_phi;
+      if (x_84) {
+        float const x_87 = data.arr[x_69_save];
+        float const x_88 = data.arr[x_71_save];
+        data.arr[x_69_save] = x_88;
+        data.arr[x_71_save] = x_87;
+      }
+      {
+        x_60 = (x_59 + 1);
+        x_59_phi = x_60;
+      }
+    }
+    {
+      x_53 = (x_52 + 1);
+      x_52_phi = x_53;
+    }
+  }
+  float const x_90 = (*(tint_symbol_5)).x;
+  float const x_92 = x_6.resolution.x;
+  if ((x_90 < (x_92 * 0.5f))) {
+    float const x_99 = data.arr[0];
+    float const x_102 = data.arr[5];
+    float const x_105 = data.arr[9];
+    *(tint_symbol_6) = float4((x_99 * 0.100000001f), (x_102 * 0.100000001f), (x_105 * 0.100000001f), 1.0f);
+  } else {
+    float const x_109 = data.arr[5];
+    float const x_112 = data.arr[9];
+    float const x_115 = data.arr[0];
+    *(tint_symbol_6) = float4((x_109 * 0.100000001f), (x_112 * 0.100000001f), (x_115 * 0.100000001f), 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_9 [[buffer(0)]], constant buf1& x_6 [[buffer(1)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_9, x_6, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..43b700f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/0.wgsl.expected.spvasm
@@ -0,0 +1,282 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 167
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %data "data"
+               OpName %x_40_phi "x_40_phi"
+               OpName %x_52_phi "x_52_phi"
+               OpName %x_41 "x_41"
+               OpName %x_53 "x_53"
+               OpName %x_59_phi "x_59_phi"
+               OpName %x_82 "x_82"
+               OpName %x_83 "x_83"
+               OpName %x_60 "x_60"
+               OpName %x_84_phi "x_84_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_float_uint_10 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_float_uint_10 = OpTypeArray %float %uint_10
+%_ptr_Function__arr_float_uint_10 = OpTypePointer Function %_arr_float_uint_10
+         %27 = OpConstantNull %_arr_float_uint_10
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %31 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+     %int_10 = OpConstant %int 10
+       %bool = OpTypeBool
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_1 = OpConstant %int 1
+      %int_9 = OpConstant %int 9
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %77 = OpConstantNull %bool
+%_ptr_Private_float = OpTypePointer Private %float
+  %float_0_5 = OpConstant %float 0.5
+      %int_5 = OpConstant %int 5
+%float_0_100000001 = OpConstant %float 0.100000001
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %154 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %18
+         %21 = OpLabel
+       %data = OpVariable %_ptr_Function__arr_float_uint_10 Function %27
+   %x_40_phi = OpVariable %_ptr_Function_int Function %31
+   %x_52_phi = OpVariable %_ptr_Function_int Function %31
+       %x_41 = OpVariable %_ptr_Function_int Function %31
+       %x_53 = OpVariable %_ptr_Function_int Function %31
+   %x_59_phi = OpVariable %_ptr_Function_int Function %31
+       %x_82 = OpVariable %_ptr_Function_bool Function %77
+       %x_83 = OpVariable %_ptr_Function_bool Function %77
+       %x_60 = OpVariable %_ptr_Function_int Function %31
+   %x_84_phi = OpVariable %_ptr_Function_bool Function %77
+               OpStore %x_40_phi %int_0
+               OpBranch %34
+         %34 = OpLabel
+               OpLoopMerge %35 %36 None
+               OpBranch %37
+         %37 = OpLabel
+         %39 = OpLoad %int %x_40_phi
+         %41 = OpSLessThan %bool %39 %int_10
+               OpSelectionMerge %43 None
+               OpBranchConditional %41 %44 %45
+         %44 = OpLabel
+               OpBranch %43
+         %45 = OpLabel
+               OpBranch %35
+         %43 = OpLabel
+               OpBranch %36
+         %36 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_1
+         %50 = OpLoad %float %49
+         %52 = OpAccessChain %_ptr_Function_float %data %39
+         %54 = OpISub %int %int_10 %39
+         %53 = OpConvertSToF %float %54
+         %55 = OpFMul %float %53 %50
+               OpStore %52 %55
+         %57 = OpIAdd %int %39 %int_1
+               OpStore %x_41 %57
+         %58 = OpLoad %int %x_41
+               OpStore %x_40_phi %58
+               OpBranch %34
+         %35 = OpLabel
+               OpStore %x_52_phi %int_0
+               OpBranch %59
+         %59 = OpLabel
+               OpLoopMerge %60 %61 None
+               OpBranch %62
+         %62 = OpLabel
+         %65 = OpLoad %int %x_52_phi
+         %67 = OpSLessThan %bool %65 %int_9
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %70
+         %69 = OpLabel
+               OpBranch %68
+         %70 = OpLabel
+               OpBranch %60
+         %68 = OpLabel
+               OpStore %x_59_phi %int_0
+               OpBranch %71
+         %71 = OpLabel
+               OpLoopMerge %72 %73 None
+               OpBranch %74
+         %74 = OpLabel
+         %81 = OpLoad %int %x_59_phi
+         %82 = OpSLessThan %bool %81 %int_10
+               OpSelectionMerge %83 None
+               OpBranchConditional %82 %84 %85
+         %84 = OpLabel
+               OpBranch %83
+         %85 = OpLabel
+               OpBranch %72
+         %83 = OpLabel
+         %86 = OpIAdd %int %65 %int_1
+         %87 = OpSLessThan %bool %81 %86
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %88
+         %89 = OpLabel
+               OpBranch %73
+         %88 = OpLabel
+         %90 = OpAccessChain %_ptr_Function_float %data %65
+         %91 = OpLoad %float %90
+         %92 = OpAccessChain %_ptr_Function_float %data %81
+         %93 = OpLoad %float %92
+         %95 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %96 = OpLoad %float %95
+         %97 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %98 = OpLoad %float %97
+        %100 = OpFMul %float %98 %float_0_5
+        %101 = OpFOrdLessThan %bool %96 %100
+               OpSelectionMerge %102 None
+               OpBranchConditional %101 %103 %104
+        %103 = OpLabel
+        %105 = OpFOrdGreaterThan %bool %91 %93
+               OpStore %x_82 %105
+        %106 = OpLoad %bool %x_82
+               OpStore %x_84_phi %106
+               OpBranch %102
+        %104 = OpLabel
+        %107 = OpFOrdLessThan %bool %91 %93
+               OpStore %x_83 %107
+        %108 = OpLoad %bool %x_83
+               OpStore %x_84_phi %108
+               OpBranch %102
+        %102 = OpLabel
+        %109 = OpLoad %bool %x_84_phi
+               OpSelectionMerge %110 None
+               OpBranchConditional %109 %111 %110
+        %111 = OpLabel
+        %112 = OpAccessChain %_ptr_Function_float %data %65
+        %113 = OpLoad %float %112
+        %114 = OpAccessChain %_ptr_Function_float %data %81
+        %115 = OpLoad %float %114
+        %116 = OpAccessChain %_ptr_Function_float %data %65
+               OpStore %116 %115
+        %117 = OpAccessChain %_ptr_Function_float %data %81
+               OpStore %117 %113
+               OpBranch %110
+        %110 = OpLabel
+               OpBranch %73
+         %73 = OpLabel
+        %118 = OpIAdd %int %81 %int_1
+               OpStore %x_60 %118
+        %119 = OpLoad %int %x_60
+               OpStore %x_59_phi %119
+               OpBranch %71
+         %72 = OpLabel
+               OpBranch %61
+         %61 = OpLabel
+        %120 = OpIAdd %int %65 %int_1
+               OpStore %x_53 %120
+        %121 = OpLoad %int %x_53
+               OpStore %x_52_phi %121
+               OpBranch %59
+         %60 = OpLabel
+        %122 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+        %123 = OpLoad %float %122
+        %124 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+        %125 = OpLoad %float %124
+        %126 = OpFMul %float %125 %float_0_5
+        %127 = OpFOrdLessThan %bool %123 %126
+               OpSelectionMerge %128 None
+               OpBranchConditional %127 %129 %130
+        %129 = OpLabel
+        %131 = OpAccessChain %_ptr_Function_float %data %int_0
+        %132 = OpLoad %float %131
+        %134 = OpAccessChain %_ptr_Function_float %data %int_5
+        %135 = OpLoad %float %134
+        %136 = OpAccessChain %_ptr_Function_float %data %int_9
+        %137 = OpLoad %float %136
+        %139 = OpFMul %float %132 %float_0_100000001
+        %140 = OpFMul %float %135 %float_0_100000001
+        %141 = OpFMul %float %137 %float_0_100000001
+        %143 = OpCompositeConstruct %v4float %139 %140 %141 %float_1
+               OpStore %x_GLF_color %143
+               OpBranch %128
+        %130 = OpLabel
+        %144 = OpAccessChain %_ptr_Function_float %data %int_5
+        %145 = OpLoad %float %144
+        %146 = OpAccessChain %_ptr_Function_float %data %int_9
+        %147 = OpLoad %float %146
+        %148 = OpAccessChain %_ptr_Function_float %data %int_0
+        %149 = OpLoad %float %148
+        %150 = OpFMul %float %145 %float_0_100000001
+        %151 = OpFMul %float %147 %float_0_100000001
+        %152 = OpFMul %float %149 %float_0_100000001
+        %153 = OpCompositeConstruct %v4float %150 %151 %152 %float_1
+               OpStore %x_GLF_color %153
+               OpBranch %128
+        %128 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %154
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %158 = OpLabel
+        %159 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %159
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %18
+        %161 = OpLabel
+        %162 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %162
+        %163 = OpFunctionCall %void %main_1
+        %165 = OpLoad %v4float %x_GLF_color
+        %166 = OpCompositeConstruct %main_out %165
+        %164 = OpFunctionCall %void %tint_symbol_3 %166
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..819f07b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/0.wgsl.expected.wgsl
@@ -0,0 +1,120 @@
+[[block]]
+struct buf1 {
+  resolution : vec2<f32>;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var data : array<f32, 10>;
+  var x_40_phi : i32;
+  var x_52_phi : i32;
+  x_40_phi = 0;
+  loop {
+    var x_41 : i32;
+    let x_40 : i32 = x_40_phi;
+    if ((x_40 < 10)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_48 : f32 = x_9.injectionSwitch.y;
+      data[x_40] = (f32((10 - x_40)) * x_48);
+      x_41 = (x_40 + 1);
+      x_40_phi = x_41;
+    }
+  }
+  x_52_phi = 0;
+  loop {
+    var x_53 : i32;
+    var x_59_phi : i32;
+    let x_52 : i32 = x_52_phi;
+    if ((x_52 < 9)) {
+    } else {
+      break;
+    }
+    x_59_phi = 0;
+    loop {
+      var x_82 : bool;
+      var x_83 : bool;
+      var x_60 : i32;
+      var x_84_phi : bool;
+      let x_59 : i32 = x_59_phi;
+      if ((x_59 < 10)) {
+      } else {
+        break;
+      }
+      if ((x_59 < (x_52 + 1))) {
+        continue;
+      }
+      let x_69 : ptr<function, f32> = &(data[x_52]);
+      let x_70 : f32 = *(x_69);
+      let x_71 : ptr<function, f32> = &(data[x_59]);
+      let x_72 : f32 = *(x_71);
+      let x_74 : f32 = gl_FragCoord.y;
+      let x_76 : f32 = x_6.resolution.y;
+      if ((x_74 < (x_76 * 0.5))) {
+        x_82 = (x_70 > x_72);
+        x_84_phi = x_82;
+      } else {
+        x_83 = (x_70 < x_72);
+        x_84_phi = x_83;
+      }
+      let x_84 : bool = x_84_phi;
+      if (x_84) {
+        let x_87 : f32 = *(x_69);
+        let x_88 : f32 = *(x_71);
+        *(x_69) = x_88;
+        *(x_71) = x_87;
+      }
+
+      continuing {
+        x_60 = (x_59 + 1);
+        x_59_phi = x_60;
+      }
+    }
+
+    continuing {
+      x_53 = (x_52 + 1);
+      x_52_phi = x_53;
+    }
+  }
+  let x_90 : f32 = gl_FragCoord.x;
+  let x_92 : f32 = x_6.resolution.x;
+  if ((x_90 < (x_92 * 0.5))) {
+    let x_99 : f32 = data[0];
+    let x_102 : f32 = data[5];
+    let x_105 : f32 = data[9];
+    x_GLF_color = vec4<f32>((x_99 * 0.100000001), (x_102 * 0.100000001), (x_105 * 0.100000001), 1.0);
+  } else {
+    let x_109 : f32 = data[5];
+    let x_112 : f32 = data[9];
+    let x_115 : f32 = data[0];
+    x_GLF_color = vec4<f32>((x_109 * 0.100000001), (x_112 * 0.100000001), (x_115 * 0.100000001), 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/1.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/1.spvasm
new file mode 100644
index 0000000..1199569
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/1.spvasm
@@ -0,0 +1,178 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "resolution"
+               OpName %_ ""
+               OpName %data "data"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %__0 ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %int_10 = OpConstant %int 10
+    %uint_10 = OpConstant %uint 10
+%_arr_float_uint_10 = OpTypeArray %float %uint_10
+%_ptr_Function__arr_float_uint_10 = OpTypePointer Function %_arr_float_uint_10
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_1 = OpConstant %int 1
+      %int_9 = OpConstant %int 9
+     %uint_0 = OpConstant %uint 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+      %int_5 = OpConstant %int 5
+    %float_1 = OpConstant %float 1
+  %float_0_5 = OpConstant %float 0.5
+%float_0_100000001 = OpConstant %float 0.100000001
+       %true = OpConstantTrue %bool
+       %main = OpFunction %void None %11
+         %39 = OpLabel
+       %data = OpVariable %_ptr_Function__arr_float_uint_10 Function
+               OpBranch %40
+         %40 = OpLabel
+         %41 = OpPhi %int %int_0 %39 %42 %43
+         %44 = OpSLessThan %bool %41 %int_10
+               OpLoopMerge %45 %43 None
+               OpBranchConditional %44 %43 %45
+         %43 = OpLabel
+         %46 = OpISub %int %int_10 %41
+         %47 = OpConvertSToF %float %46
+         %48 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %uint_1
+         %49 = OpLoad %float %48
+         %50 = OpFMul %float %47 %49
+         %51 = OpAccessChain %_ptr_Function_float %data %41
+               OpStore %51 %50
+         %42 = OpIAdd %int %41 %int_1
+               OpBranch %40
+         %45 = OpLabel
+               OpBranch %52
+         %52 = OpLabel
+         %53 = OpPhi %int %int_0 %45 %54 %55
+         %56 = OpSLessThan %bool %53 %int_9
+               OpLoopMerge %57 %55 None
+               OpBranchConditional %56 %58 %57
+         %58 = OpLabel
+               OpBranch %59
+         %59 = OpLabel
+         %60 = OpPhi %int %int_0 %58 %61 %62
+         %63 = OpSLessThan %bool %60 %int_10
+               OpLoopMerge %64 %62 None
+               OpBranchConditional %63 %65 %64
+         %65 = OpLabel
+         %66 = OpIAdd %int %53 %int_1
+         %67 = OpSLessThan %bool %60 %66
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %68
+         %69 = OpLabel
+               OpBranch %62
+         %68 = OpLabel
+         %70 = OpAccessChain %_ptr_Function_float %data %53
+         %71 = OpLoad %float %70
+         %72 = OpAccessChain %_ptr_Function_float %data %60
+         %73 = OpLoad %float %72
+         %74 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %75 = OpLoad %float %74
+         %76 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %77 = OpLoad %float %76
+         %78 = OpFMul %float %77 %float_0_5
+         %79 = OpFOrdLessThan %bool %75 %78
+               OpSelectionMerge %80 None
+               OpBranchConditional %79 %81 %82
+         %81 = OpLabel
+         %83 = OpFOrdGreaterThan %bool %71 %73
+               OpBranch %80
+         %82 = OpLabel
+         %84 = OpFOrdLessThan %bool %71 %73
+               OpBranch %80
+         %80 = OpLabel
+         %85 = OpPhi %bool %83 %81 %84 %82
+               OpSelectionMerge %86 None
+               OpBranchConditional %85 %87 %86
+         %87 = OpLabel
+         %88 = OpLoad %float %70
+         %89 = OpLoad %float %72
+               OpStore %70 %89
+               OpStore %72 %88
+               OpBranch %86
+         %86 = OpLabel
+               OpBranch %62
+         %62 = OpLabel
+         %61 = OpIAdd %int %60 %int_1
+               OpBranch %59
+         %64 = OpLabel
+               OpBranch %55
+         %55 = OpLabel
+         %54 = OpIAdd %int %53 %int_1
+               OpBranch %52
+         %57 = OpLabel
+         %90 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %91 = OpLoad %float %90
+         %92 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %93 = OpLoad %float %92
+         %94 = OpFMul %float %93 %float_0_5
+         %95 = OpFOrdLessThan %bool %91 %94
+               OpSelectionMerge %96 None
+               OpBranchConditional %95 %97 %98
+         %97 = OpLabel
+         %99 = OpAccessChain %_ptr_Function_float %data %int_0
+        %100 = OpLoad %float %99
+        %101 = OpFMul %float %100 %float_0_100000001
+        %102 = OpAccessChain %_ptr_Function_float %data %int_5
+        %103 = OpLoad %float %102
+        %104 = OpFMul %float %103 %float_0_100000001
+        %105 = OpAccessChain %_ptr_Function_float %data %int_9
+        %106 = OpLoad %float %105
+        %107 = OpFMul %float %106 %float_0_100000001
+        %108 = OpCompositeConstruct %v4float %101 %104 %107 %float_1
+               OpStore %_GLF_color %108
+               OpBranch %96
+         %98 = OpLabel
+        %109 = OpAccessChain %_ptr_Function_float %data %int_5
+        %110 = OpLoad %float %109
+        %111 = OpFMul %float %110 %float_0_100000001
+        %112 = OpAccessChain %_ptr_Function_float %data %int_9
+        %113 = OpLoad %float %112
+        %114 = OpFMul %float %113 %float_0_100000001
+        %115 = OpAccessChain %_ptr_Function_float %data %int_0
+        %116 = OpLoad %float %115
+        %117 = OpFMul %float %116 %float_0_100000001
+        %118 = OpCompositeConstruct %v4float %111 %114 %117 %float_1
+               OpStore %_GLF_color %118
+               OpBranchConditional %true %96 %96
+         %96 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..9792c8f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/1.spvasm.expected.hlsl
@@ -0,0 +1,118 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[1];
+};
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float data[10] = (float[10])0;
+  int x_41_phi = 0;
+  int x_53_phi = 0;
+  x_41_phi = 0;
+  while (true) {
+    int x_42 = 0;
+    const int x_41 = x_41_phi;
+    if ((x_41 < 10)) {
+    } else {
+      break;
+    }
+    {
+      const float x_49 = asfloat(x_9[0].y);
+      data[x_41] = (float((10 - x_41)) * x_49);
+      x_42 = (x_41 + 1);
+      x_41_phi = x_42;
+    }
+  }
+  x_53_phi = 0;
+  while (true) {
+    int x_54 = 0;
+    int x_60_phi = 0;
+    const int x_53 = x_53_phi;
+    if ((x_53 < 9)) {
+    } else {
+      break;
+    }
+    x_60_phi = 0;
+    while (true) {
+      bool x_83 = false;
+      bool x_84 = false;
+      int x_61 = 0;
+      bool x_85_phi = false;
+      const int x_60 = x_60_phi;
+      if ((x_60 < 10)) {
+      } else {
+        break;
+      }
+      if ((x_60 < (x_53 + 1))) {
+        {
+          x_61 = (x_60 + 1);
+          x_60_phi = x_61;
+        }
+        continue;
+      }
+      const int x_70_save = x_53;
+      const float x_71 = data[x_70_save];
+      const int x_72_save = x_60;
+      const float x_73 = data[x_72_save];
+      const float x_75 = gl_FragCoord.y;
+      const float x_77 = asfloat(x_6[0].y);
+      if ((x_75 < (x_77 * 0.5f))) {
+        x_83 = (x_71 > x_73);
+        x_85_phi = x_83;
+      } else {
+        x_84 = (x_71 < x_73);
+        x_85_phi = x_84;
+      }
+      if (x_85_phi) {
+        const float x_88 = data[x_70_save];
+        const float x_89 = data[x_72_save];
+        data[x_70_save] = x_89;
+        data[x_72_save] = x_88;
+      }
+      {
+        x_61 = (x_60 + 1);
+        x_60_phi = x_61;
+      }
+    }
+    {
+      x_54 = (x_53 + 1);
+      x_53_phi = x_54;
+    }
+  }
+  const float x_91 = gl_FragCoord.x;
+  const float x_93 = asfloat(x_6[0].x);
+  if ((x_91 < (x_93 * 0.5f))) {
+    const float x_100 = data[0];
+    const float x_103 = data[5];
+    const float x_106 = data[9];
+    x_GLF_color = float4((x_100 * 0.100000001f), (x_103 * 0.100000001f), (x_106 * 0.100000001f), 1.0f);
+  } else {
+    const float x_110 = data[5];
+    const float x_113 = data[9];
+    const float x_116 = data[0];
+    x_GLF_color = float4((x_110 * 0.100000001f), (x_113 * 0.100000001f), (x_116 * 0.100000001f), 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/1.spvasm.expected.msl
new file mode 100644
index 0000000..0bcea9e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/1.spvasm.expected.msl
@@ -0,0 +1,121 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf1 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  float arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_9, constant buf1& x_6, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  tint_array_wrapper data = {};
+  int x_41_phi = 0;
+  int x_53_phi = 0;
+  x_41_phi = 0;
+  while (true) {
+    int x_42 = 0;
+    int const x_41 = x_41_phi;
+    if ((x_41 < 10)) {
+    } else {
+      break;
+    }
+    {
+      float const x_49 = x_9.injectionSwitch.y;
+      data.arr[x_41] = (float((10 - x_41)) * x_49);
+      x_42 = (x_41 + 1);
+      x_41_phi = x_42;
+    }
+  }
+  x_53_phi = 0;
+  while (true) {
+    int x_54 = 0;
+    int x_60_phi = 0;
+    int const x_53 = x_53_phi;
+    if ((x_53 < 9)) {
+    } else {
+      break;
+    }
+    x_60_phi = 0;
+    while (true) {
+      bool x_83 = false;
+      bool x_84 = false;
+      int x_61 = 0;
+      bool x_85_phi = false;
+      int const x_60 = x_60_phi;
+      if ((x_60 < 10)) {
+      } else {
+        break;
+      }
+      if ((x_60 < (x_53 + 1))) {
+        {
+          x_61 = (x_60 + 1);
+          x_60_phi = x_61;
+        }
+        continue;
+      }
+      int const x_70_save = x_53;
+      float const x_71 = data.arr[x_70_save];
+      int const x_72_save = x_60;
+      float const x_73 = data.arr[x_72_save];
+      float const x_75 = (*(tint_symbol_5)).y;
+      float const x_77 = x_6.resolution.y;
+      if ((x_75 < (x_77 * 0.5f))) {
+        x_83 = (x_71 > x_73);
+        x_85_phi = x_83;
+      } else {
+        x_84 = (x_71 < x_73);
+        x_85_phi = x_84;
+      }
+      bool const x_85 = x_85_phi;
+      if (x_85) {
+        float const x_88 = data.arr[x_70_save];
+        float const x_89 = data.arr[x_72_save];
+        data.arr[x_70_save] = x_89;
+        data.arr[x_72_save] = x_88;
+      }
+      {
+        x_61 = (x_60 + 1);
+        x_60_phi = x_61;
+      }
+    }
+    {
+      x_54 = (x_53 + 1);
+      x_53_phi = x_54;
+    }
+  }
+  float const x_91 = (*(tint_symbol_5)).x;
+  float const x_93 = x_6.resolution.x;
+  if ((x_91 < (x_93 * 0.5f))) {
+    float const x_100 = data.arr[0];
+    float const x_103 = data.arr[5];
+    float const x_106 = data.arr[9];
+    *(tint_symbol_6) = float4((x_100 * 0.100000001f), (x_103 * 0.100000001f), (x_106 * 0.100000001f), 1.0f);
+  } else {
+    float const x_110 = data.arr[5];
+    float const x_113 = data.arr[9];
+    float const x_116 = data.arr[0];
+    *(tint_symbol_6) = float4((x_110 * 0.100000001f), (x_113 * 0.100000001f), (x_116 * 0.100000001f), 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_9 [[buffer(0)]], constant buf1& x_6 [[buffer(1)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_9, x_6, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..8a60eb4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/1.spvasm.expected.spvasm
@@ -0,0 +1,282 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 167
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %data "data"
+               OpName %x_41_phi "x_41_phi"
+               OpName %x_53_phi "x_53_phi"
+               OpName %x_42 "x_42"
+               OpName %x_54 "x_54"
+               OpName %x_60_phi "x_60_phi"
+               OpName %x_83 "x_83"
+               OpName %x_84 "x_84"
+               OpName %x_61 "x_61"
+               OpName %x_85_phi "x_85_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_float_uint_10 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_float_uint_10 = OpTypeArray %float %uint_10
+%_ptr_Function__arr_float_uint_10 = OpTypePointer Function %_arr_float_uint_10
+         %27 = OpConstantNull %_arr_float_uint_10
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %31 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+     %int_10 = OpConstant %int 10
+       %bool = OpTypeBool
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_1 = OpConstant %int 1
+      %int_9 = OpConstant %int 9
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %77 = OpConstantNull %bool
+%_ptr_Private_float = OpTypePointer Private %float
+  %float_0_5 = OpConstant %float 0.5
+      %int_5 = OpConstant %int 5
+%float_0_100000001 = OpConstant %float 0.100000001
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %154 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %18
+         %21 = OpLabel
+       %data = OpVariable %_ptr_Function__arr_float_uint_10 Function %27
+   %x_41_phi = OpVariable %_ptr_Function_int Function %31
+   %x_53_phi = OpVariable %_ptr_Function_int Function %31
+       %x_42 = OpVariable %_ptr_Function_int Function %31
+       %x_54 = OpVariable %_ptr_Function_int Function %31
+   %x_60_phi = OpVariable %_ptr_Function_int Function %31
+       %x_83 = OpVariable %_ptr_Function_bool Function %77
+       %x_84 = OpVariable %_ptr_Function_bool Function %77
+       %x_61 = OpVariable %_ptr_Function_int Function %31
+   %x_85_phi = OpVariable %_ptr_Function_bool Function %77
+               OpStore %x_41_phi %int_0
+               OpBranch %34
+         %34 = OpLabel
+               OpLoopMerge %35 %36 None
+               OpBranch %37
+         %37 = OpLabel
+         %39 = OpLoad %int %x_41_phi
+         %41 = OpSLessThan %bool %39 %int_10
+               OpSelectionMerge %43 None
+               OpBranchConditional %41 %44 %45
+         %44 = OpLabel
+               OpBranch %43
+         %45 = OpLabel
+               OpBranch %35
+         %43 = OpLabel
+               OpBranch %36
+         %36 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_1
+         %50 = OpLoad %float %49
+         %52 = OpAccessChain %_ptr_Function_float %data %39
+         %54 = OpISub %int %int_10 %39
+         %53 = OpConvertSToF %float %54
+         %55 = OpFMul %float %53 %50
+               OpStore %52 %55
+         %57 = OpIAdd %int %39 %int_1
+               OpStore %x_42 %57
+         %58 = OpLoad %int %x_42
+               OpStore %x_41_phi %58
+               OpBranch %34
+         %35 = OpLabel
+               OpStore %x_53_phi %int_0
+               OpBranch %59
+         %59 = OpLabel
+               OpLoopMerge %60 %61 None
+               OpBranch %62
+         %62 = OpLabel
+         %65 = OpLoad %int %x_53_phi
+         %67 = OpSLessThan %bool %65 %int_9
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %70
+         %69 = OpLabel
+               OpBranch %68
+         %70 = OpLabel
+               OpBranch %60
+         %68 = OpLabel
+               OpStore %x_60_phi %int_0
+               OpBranch %71
+         %71 = OpLabel
+               OpLoopMerge %72 %73 None
+               OpBranch %74
+         %74 = OpLabel
+         %81 = OpLoad %int %x_60_phi
+         %82 = OpSLessThan %bool %81 %int_10
+               OpSelectionMerge %83 None
+               OpBranchConditional %82 %84 %85
+         %84 = OpLabel
+               OpBranch %83
+         %85 = OpLabel
+               OpBranch %72
+         %83 = OpLabel
+         %86 = OpIAdd %int %65 %int_1
+         %87 = OpSLessThan %bool %81 %86
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %88
+         %89 = OpLabel
+               OpBranch %73
+         %88 = OpLabel
+         %90 = OpAccessChain %_ptr_Function_float %data %65
+         %91 = OpLoad %float %90
+         %92 = OpAccessChain %_ptr_Function_float %data %81
+         %93 = OpLoad %float %92
+         %95 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %96 = OpLoad %float %95
+         %97 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %98 = OpLoad %float %97
+        %100 = OpFMul %float %98 %float_0_5
+        %101 = OpFOrdLessThan %bool %96 %100
+               OpSelectionMerge %102 None
+               OpBranchConditional %101 %103 %104
+        %103 = OpLabel
+        %105 = OpFOrdGreaterThan %bool %91 %93
+               OpStore %x_83 %105
+        %106 = OpLoad %bool %x_83
+               OpStore %x_85_phi %106
+               OpBranch %102
+        %104 = OpLabel
+        %107 = OpFOrdLessThan %bool %91 %93
+               OpStore %x_84 %107
+        %108 = OpLoad %bool %x_84
+               OpStore %x_85_phi %108
+               OpBranch %102
+        %102 = OpLabel
+        %109 = OpLoad %bool %x_85_phi
+               OpSelectionMerge %110 None
+               OpBranchConditional %109 %111 %110
+        %111 = OpLabel
+        %112 = OpAccessChain %_ptr_Function_float %data %65
+        %113 = OpLoad %float %112
+        %114 = OpAccessChain %_ptr_Function_float %data %81
+        %115 = OpLoad %float %114
+        %116 = OpAccessChain %_ptr_Function_float %data %65
+               OpStore %116 %115
+        %117 = OpAccessChain %_ptr_Function_float %data %81
+               OpStore %117 %113
+               OpBranch %110
+        %110 = OpLabel
+               OpBranch %73
+         %73 = OpLabel
+        %118 = OpIAdd %int %81 %int_1
+               OpStore %x_61 %118
+        %119 = OpLoad %int %x_61
+               OpStore %x_60_phi %119
+               OpBranch %71
+         %72 = OpLabel
+               OpBranch %61
+         %61 = OpLabel
+        %120 = OpIAdd %int %65 %int_1
+               OpStore %x_54 %120
+        %121 = OpLoad %int %x_54
+               OpStore %x_53_phi %121
+               OpBranch %59
+         %60 = OpLabel
+        %122 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+        %123 = OpLoad %float %122
+        %124 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+        %125 = OpLoad %float %124
+        %126 = OpFMul %float %125 %float_0_5
+        %127 = OpFOrdLessThan %bool %123 %126
+               OpSelectionMerge %128 None
+               OpBranchConditional %127 %129 %130
+        %129 = OpLabel
+        %131 = OpAccessChain %_ptr_Function_float %data %int_0
+        %132 = OpLoad %float %131
+        %134 = OpAccessChain %_ptr_Function_float %data %int_5
+        %135 = OpLoad %float %134
+        %136 = OpAccessChain %_ptr_Function_float %data %int_9
+        %137 = OpLoad %float %136
+        %139 = OpFMul %float %132 %float_0_100000001
+        %140 = OpFMul %float %135 %float_0_100000001
+        %141 = OpFMul %float %137 %float_0_100000001
+        %143 = OpCompositeConstruct %v4float %139 %140 %141 %float_1
+               OpStore %x_GLF_color %143
+               OpBranch %128
+        %130 = OpLabel
+        %144 = OpAccessChain %_ptr_Function_float %data %int_5
+        %145 = OpLoad %float %144
+        %146 = OpAccessChain %_ptr_Function_float %data %int_9
+        %147 = OpLoad %float %146
+        %148 = OpAccessChain %_ptr_Function_float %data %int_0
+        %149 = OpLoad %float %148
+        %150 = OpFMul %float %145 %float_0_100000001
+        %151 = OpFMul %float %147 %float_0_100000001
+        %152 = OpFMul %float %149 %float_0_100000001
+        %153 = OpCompositeConstruct %v4float %150 %151 %152 %float_1
+               OpStore %x_GLF_color %153
+               OpBranch %128
+        %128 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %154
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %158 = OpLabel
+        %159 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %159
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %18
+        %161 = OpLabel
+        %162 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %162
+        %163 = OpFunctionCall %void %main_1
+        %165 = OpLoad %v4float %x_GLF_color
+        %166 = OpCompositeConstruct %main_out %165
+        %164 = OpFunctionCall %void %tint_symbol_3 %166
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..aac8d57
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/1.spvasm.expected.wgsl
@@ -0,0 +1,120 @@
+[[block]]
+struct buf1 {
+  resolution : vec2<f32>;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var data : array<f32, 10>;
+  var x_41_phi : i32;
+  var x_53_phi : i32;
+  x_41_phi = 0;
+  loop {
+    var x_42 : i32;
+    let x_41 : i32 = x_41_phi;
+    if ((x_41 < 10)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_49 : f32 = x_9.injectionSwitch.y;
+      data[x_41] = (f32((10 - x_41)) * x_49);
+      x_42 = (x_41 + 1);
+      x_41_phi = x_42;
+    }
+  }
+  x_53_phi = 0;
+  loop {
+    var x_54 : i32;
+    var x_60_phi : i32;
+    let x_53 : i32 = x_53_phi;
+    if ((x_53 < 9)) {
+    } else {
+      break;
+    }
+    x_60_phi = 0;
+    loop {
+      var x_83 : bool;
+      var x_84 : bool;
+      var x_61 : i32;
+      var x_85_phi : bool;
+      let x_60 : i32 = x_60_phi;
+      if ((x_60 < 10)) {
+      } else {
+        break;
+      }
+      if ((x_60 < (x_53 + 1))) {
+        continue;
+      }
+      let x_70 : ptr<function, f32> = &(data[x_53]);
+      let x_71 : f32 = *(x_70);
+      let x_72 : ptr<function, f32> = &(data[x_60]);
+      let x_73 : f32 = *(x_72);
+      let x_75 : f32 = gl_FragCoord.y;
+      let x_77 : f32 = x_6.resolution.y;
+      if ((x_75 < (x_77 * 0.5))) {
+        x_83 = (x_71 > x_73);
+        x_85_phi = x_83;
+      } else {
+        x_84 = (x_71 < x_73);
+        x_85_phi = x_84;
+      }
+      let x_85 : bool = x_85_phi;
+      if (x_85) {
+        let x_88 : f32 = *(x_70);
+        let x_89 : f32 = *(x_72);
+        *(x_70) = x_89;
+        *(x_72) = x_88;
+      }
+
+      continuing {
+        x_61 = (x_60 + 1);
+        x_60_phi = x_61;
+      }
+    }
+
+    continuing {
+      x_54 = (x_53 + 1);
+      x_53_phi = x_54;
+    }
+  }
+  let x_91 : f32 = gl_FragCoord.x;
+  let x_93 : f32 = x_6.resolution.x;
+  if ((x_91 < (x_93 * 0.5))) {
+    let x_100 : f32 = data[0];
+    let x_103 : f32 = data[5];
+    let x_106 : f32 = data[9];
+    x_GLF_color = vec4<f32>((x_100 * 0.100000001), (x_103 * 0.100000001), (x_106 * 0.100000001), 1.0);
+  } else {
+    let x_110 : f32 = data[5];
+    let x_113 : f32 = data[9];
+    let x_116 : f32 = data[0];
+    x_GLF_color = vec4<f32>((x_110 * 0.100000001), (x_113 * 0.100000001), (x_116 * 0.100000001), 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/1.wgsl
new file mode 100644
index 0000000..aac8d57
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/1.wgsl
@@ -0,0 +1,120 @@
+[[block]]
+struct buf1 {
+  resolution : vec2<f32>;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var data : array<f32, 10>;
+  var x_41_phi : i32;
+  var x_53_phi : i32;
+  x_41_phi = 0;
+  loop {
+    var x_42 : i32;
+    let x_41 : i32 = x_41_phi;
+    if ((x_41 < 10)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_49 : f32 = x_9.injectionSwitch.y;
+      data[x_41] = (f32((10 - x_41)) * x_49);
+      x_42 = (x_41 + 1);
+      x_41_phi = x_42;
+    }
+  }
+  x_53_phi = 0;
+  loop {
+    var x_54 : i32;
+    var x_60_phi : i32;
+    let x_53 : i32 = x_53_phi;
+    if ((x_53 < 9)) {
+    } else {
+      break;
+    }
+    x_60_phi = 0;
+    loop {
+      var x_83 : bool;
+      var x_84 : bool;
+      var x_61 : i32;
+      var x_85_phi : bool;
+      let x_60 : i32 = x_60_phi;
+      if ((x_60 < 10)) {
+      } else {
+        break;
+      }
+      if ((x_60 < (x_53 + 1))) {
+        continue;
+      }
+      let x_70 : ptr<function, f32> = &(data[x_53]);
+      let x_71 : f32 = *(x_70);
+      let x_72 : ptr<function, f32> = &(data[x_60]);
+      let x_73 : f32 = *(x_72);
+      let x_75 : f32 = gl_FragCoord.y;
+      let x_77 : f32 = x_6.resolution.y;
+      if ((x_75 < (x_77 * 0.5))) {
+        x_83 = (x_71 > x_73);
+        x_85_phi = x_83;
+      } else {
+        x_84 = (x_71 < x_73);
+        x_85_phi = x_84;
+      }
+      let x_85 : bool = x_85_phi;
+      if (x_85) {
+        let x_88 : f32 = *(x_70);
+        let x_89 : f32 = *(x_72);
+        *(x_70) = x_89;
+        *(x_72) = x_88;
+      }
+
+      continuing {
+        x_61 = (x_60 + 1);
+        x_60_phi = x_61;
+      }
+    }
+
+    continuing {
+      x_54 = (x_53 + 1);
+      x_53_phi = x_54;
+    }
+  }
+  let x_91 : f32 = gl_FragCoord.x;
+  let x_93 : f32 = x_6.resolution.x;
+  if ((x_91 < (x_93 * 0.5))) {
+    let x_100 : f32 = data[0];
+    let x_103 : f32 = data[5];
+    let x_106 : f32 = data[9];
+    x_GLF_color = vec4<f32>((x_100 * 0.100000001), (x_103 * 0.100000001), (x_106 * 0.100000001), 1.0);
+  } else {
+    let x_110 : f32 = data[5];
+    let x_113 : f32 = data[9];
+    let x_116 : f32 = data[0];
+    x_GLF_color = vec4<f32>((x_110 * 0.100000001), (x_113 * 0.100000001), (x_116 * 0.100000001), 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..9792c8f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/1.wgsl.expected.hlsl
@@ -0,0 +1,118 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[1];
+};
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float data[10] = (float[10])0;
+  int x_41_phi = 0;
+  int x_53_phi = 0;
+  x_41_phi = 0;
+  while (true) {
+    int x_42 = 0;
+    const int x_41 = x_41_phi;
+    if ((x_41 < 10)) {
+    } else {
+      break;
+    }
+    {
+      const float x_49 = asfloat(x_9[0].y);
+      data[x_41] = (float((10 - x_41)) * x_49);
+      x_42 = (x_41 + 1);
+      x_41_phi = x_42;
+    }
+  }
+  x_53_phi = 0;
+  while (true) {
+    int x_54 = 0;
+    int x_60_phi = 0;
+    const int x_53 = x_53_phi;
+    if ((x_53 < 9)) {
+    } else {
+      break;
+    }
+    x_60_phi = 0;
+    while (true) {
+      bool x_83 = false;
+      bool x_84 = false;
+      int x_61 = 0;
+      bool x_85_phi = false;
+      const int x_60 = x_60_phi;
+      if ((x_60 < 10)) {
+      } else {
+        break;
+      }
+      if ((x_60 < (x_53 + 1))) {
+        {
+          x_61 = (x_60 + 1);
+          x_60_phi = x_61;
+        }
+        continue;
+      }
+      const int x_70_save = x_53;
+      const float x_71 = data[x_70_save];
+      const int x_72_save = x_60;
+      const float x_73 = data[x_72_save];
+      const float x_75 = gl_FragCoord.y;
+      const float x_77 = asfloat(x_6[0].y);
+      if ((x_75 < (x_77 * 0.5f))) {
+        x_83 = (x_71 > x_73);
+        x_85_phi = x_83;
+      } else {
+        x_84 = (x_71 < x_73);
+        x_85_phi = x_84;
+      }
+      if (x_85_phi) {
+        const float x_88 = data[x_70_save];
+        const float x_89 = data[x_72_save];
+        data[x_70_save] = x_89;
+        data[x_72_save] = x_88;
+      }
+      {
+        x_61 = (x_60 + 1);
+        x_60_phi = x_61;
+      }
+    }
+    {
+      x_54 = (x_53 + 1);
+      x_53_phi = x_54;
+    }
+  }
+  const float x_91 = gl_FragCoord.x;
+  const float x_93 = asfloat(x_6[0].x);
+  if ((x_91 < (x_93 * 0.5f))) {
+    const float x_100 = data[0];
+    const float x_103 = data[5];
+    const float x_106 = data[9];
+    x_GLF_color = float4((x_100 * 0.100000001f), (x_103 * 0.100000001f), (x_106 * 0.100000001f), 1.0f);
+  } else {
+    const float x_110 = data[5];
+    const float x_113 = data[9];
+    const float x_116 = data[0];
+    x_GLF_color = float4((x_110 * 0.100000001f), (x_113 * 0.100000001f), (x_116 * 0.100000001f), 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/1.wgsl.expected.msl
new file mode 100644
index 0000000..0bcea9e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/1.wgsl.expected.msl
@@ -0,0 +1,121 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf1 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  float arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_9, constant buf1& x_6, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  tint_array_wrapper data = {};
+  int x_41_phi = 0;
+  int x_53_phi = 0;
+  x_41_phi = 0;
+  while (true) {
+    int x_42 = 0;
+    int const x_41 = x_41_phi;
+    if ((x_41 < 10)) {
+    } else {
+      break;
+    }
+    {
+      float const x_49 = x_9.injectionSwitch.y;
+      data.arr[x_41] = (float((10 - x_41)) * x_49);
+      x_42 = (x_41 + 1);
+      x_41_phi = x_42;
+    }
+  }
+  x_53_phi = 0;
+  while (true) {
+    int x_54 = 0;
+    int x_60_phi = 0;
+    int const x_53 = x_53_phi;
+    if ((x_53 < 9)) {
+    } else {
+      break;
+    }
+    x_60_phi = 0;
+    while (true) {
+      bool x_83 = false;
+      bool x_84 = false;
+      int x_61 = 0;
+      bool x_85_phi = false;
+      int const x_60 = x_60_phi;
+      if ((x_60 < 10)) {
+      } else {
+        break;
+      }
+      if ((x_60 < (x_53 + 1))) {
+        {
+          x_61 = (x_60 + 1);
+          x_60_phi = x_61;
+        }
+        continue;
+      }
+      int const x_70_save = x_53;
+      float const x_71 = data.arr[x_70_save];
+      int const x_72_save = x_60;
+      float const x_73 = data.arr[x_72_save];
+      float const x_75 = (*(tint_symbol_5)).y;
+      float const x_77 = x_6.resolution.y;
+      if ((x_75 < (x_77 * 0.5f))) {
+        x_83 = (x_71 > x_73);
+        x_85_phi = x_83;
+      } else {
+        x_84 = (x_71 < x_73);
+        x_85_phi = x_84;
+      }
+      bool const x_85 = x_85_phi;
+      if (x_85) {
+        float const x_88 = data.arr[x_70_save];
+        float const x_89 = data.arr[x_72_save];
+        data.arr[x_70_save] = x_89;
+        data.arr[x_72_save] = x_88;
+      }
+      {
+        x_61 = (x_60 + 1);
+        x_60_phi = x_61;
+      }
+    }
+    {
+      x_54 = (x_53 + 1);
+      x_53_phi = x_54;
+    }
+  }
+  float const x_91 = (*(tint_symbol_5)).x;
+  float const x_93 = x_6.resolution.x;
+  if ((x_91 < (x_93 * 0.5f))) {
+    float const x_100 = data.arr[0];
+    float const x_103 = data.arr[5];
+    float const x_106 = data.arr[9];
+    *(tint_symbol_6) = float4((x_100 * 0.100000001f), (x_103 * 0.100000001f), (x_106 * 0.100000001f), 1.0f);
+  } else {
+    float const x_110 = data.arr[5];
+    float const x_113 = data.arr[9];
+    float const x_116 = data.arr[0];
+    *(tint_symbol_6) = float4((x_110 * 0.100000001f), (x_113 * 0.100000001f), (x_116 * 0.100000001f), 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_9 [[buffer(0)]], constant buf1& x_6 [[buffer(1)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_9, x_6, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..8a60eb4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/1.wgsl.expected.spvasm
@@ -0,0 +1,282 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 167
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %data "data"
+               OpName %x_41_phi "x_41_phi"
+               OpName %x_53_phi "x_53_phi"
+               OpName %x_42 "x_42"
+               OpName %x_54 "x_54"
+               OpName %x_60_phi "x_60_phi"
+               OpName %x_83 "x_83"
+               OpName %x_84 "x_84"
+               OpName %x_61 "x_61"
+               OpName %x_85_phi "x_85_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_float_uint_10 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_float_uint_10 = OpTypeArray %float %uint_10
+%_ptr_Function__arr_float_uint_10 = OpTypePointer Function %_arr_float_uint_10
+         %27 = OpConstantNull %_arr_float_uint_10
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %31 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+     %int_10 = OpConstant %int 10
+       %bool = OpTypeBool
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_1 = OpConstant %int 1
+      %int_9 = OpConstant %int 9
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %77 = OpConstantNull %bool
+%_ptr_Private_float = OpTypePointer Private %float
+  %float_0_5 = OpConstant %float 0.5
+      %int_5 = OpConstant %int 5
+%float_0_100000001 = OpConstant %float 0.100000001
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %154 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %18
+         %21 = OpLabel
+       %data = OpVariable %_ptr_Function__arr_float_uint_10 Function %27
+   %x_41_phi = OpVariable %_ptr_Function_int Function %31
+   %x_53_phi = OpVariable %_ptr_Function_int Function %31
+       %x_42 = OpVariable %_ptr_Function_int Function %31
+       %x_54 = OpVariable %_ptr_Function_int Function %31
+   %x_60_phi = OpVariable %_ptr_Function_int Function %31
+       %x_83 = OpVariable %_ptr_Function_bool Function %77
+       %x_84 = OpVariable %_ptr_Function_bool Function %77
+       %x_61 = OpVariable %_ptr_Function_int Function %31
+   %x_85_phi = OpVariable %_ptr_Function_bool Function %77
+               OpStore %x_41_phi %int_0
+               OpBranch %34
+         %34 = OpLabel
+               OpLoopMerge %35 %36 None
+               OpBranch %37
+         %37 = OpLabel
+         %39 = OpLoad %int %x_41_phi
+         %41 = OpSLessThan %bool %39 %int_10
+               OpSelectionMerge %43 None
+               OpBranchConditional %41 %44 %45
+         %44 = OpLabel
+               OpBranch %43
+         %45 = OpLabel
+               OpBranch %35
+         %43 = OpLabel
+               OpBranch %36
+         %36 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_1
+         %50 = OpLoad %float %49
+         %52 = OpAccessChain %_ptr_Function_float %data %39
+         %54 = OpISub %int %int_10 %39
+         %53 = OpConvertSToF %float %54
+         %55 = OpFMul %float %53 %50
+               OpStore %52 %55
+         %57 = OpIAdd %int %39 %int_1
+               OpStore %x_42 %57
+         %58 = OpLoad %int %x_42
+               OpStore %x_41_phi %58
+               OpBranch %34
+         %35 = OpLabel
+               OpStore %x_53_phi %int_0
+               OpBranch %59
+         %59 = OpLabel
+               OpLoopMerge %60 %61 None
+               OpBranch %62
+         %62 = OpLabel
+         %65 = OpLoad %int %x_53_phi
+         %67 = OpSLessThan %bool %65 %int_9
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %70
+         %69 = OpLabel
+               OpBranch %68
+         %70 = OpLabel
+               OpBranch %60
+         %68 = OpLabel
+               OpStore %x_60_phi %int_0
+               OpBranch %71
+         %71 = OpLabel
+               OpLoopMerge %72 %73 None
+               OpBranch %74
+         %74 = OpLabel
+         %81 = OpLoad %int %x_60_phi
+         %82 = OpSLessThan %bool %81 %int_10
+               OpSelectionMerge %83 None
+               OpBranchConditional %82 %84 %85
+         %84 = OpLabel
+               OpBranch %83
+         %85 = OpLabel
+               OpBranch %72
+         %83 = OpLabel
+         %86 = OpIAdd %int %65 %int_1
+         %87 = OpSLessThan %bool %81 %86
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %88
+         %89 = OpLabel
+               OpBranch %73
+         %88 = OpLabel
+         %90 = OpAccessChain %_ptr_Function_float %data %65
+         %91 = OpLoad %float %90
+         %92 = OpAccessChain %_ptr_Function_float %data %81
+         %93 = OpLoad %float %92
+         %95 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %96 = OpLoad %float %95
+         %97 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %98 = OpLoad %float %97
+        %100 = OpFMul %float %98 %float_0_5
+        %101 = OpFOrdLessThan %bool %96 %100
+               OpSelectionMerge %102 None
+               OpBranchConditional %101 %103 %104
+        %103 = OpLabel
+        %105 = OpFOrdGreaterThan %bool %91 %93
+               OpStore %x_83 %105
+        %106 = OpLoad %bool %x_83
+               OpStore %x_85_phi %106
+               OpBranch %102
+        %104 = OpLabel
+        %107 = OpFOrdLessThan %bool %91 %93
+               OpStore %x_84 %107
+        %108 = OpLoad %bool %x_84
+               OpStore %x_85_phi %108
+               OpBranch %102
+        %102 = OpLabel
+        %109 = OpLoad %bool %x_85_phi
+               OpSelectionMerge %110 None
+               OpBranchConditional %109 %111 %110
+        %111 = OpLabel
+        %112 = OpAccessChain %_ptr_Function_float %data %65
+        %113 = OpLoad %float %112
+        %114 = OpAccessChain %_ptr_Function_float %data %81
+        %115 = OpLoad %float %114
+        %116 = OpAccessChain %_ptr_Function_float %data %65
+               OpStore %116 %115
+        %117 = OpAccessChain %_ptr_Function_float %data %81
+               OpStore %117 %113
+               OpBranch %110
+        %110 = OpLabel
+               OpBranch %73
+         %73 = OpLabel
+        %118 = OpIAdd %int %81 %int_1
+               OpStore %x_61 %118
+        %119 = OpLoad %int %x_61
+               OpStore %x_60_phi %119
+               OpBranch %71
+         %72 = OpLabel
+               OpBranch %61
+         %61 = OpLabel
+        %120 = OpIAdd %int %65 %int_1
+               OpStore %x_54 %120
+        %121 = OpLoad %int %x_54
+               OpStore %x_53_phi %121
+               OpBranch %59
+         %60 = OpLabel
+        %122 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+        %123 = OpLoad %float %122
+        %124 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+        %125 = OpLoad %float %124
+        %126 = OpFMul %float %125 %float_0_5
+        %127 = OpFOrdLessThan %bool %123 %126
+               OpSelectionMerge %128 None
+               OpBranchConditional %127 %129 %130
+        %129 = OpLabel
+        %131 = OpAccessChain %_ptr_Function_float %data %int_0
+        %132 = OpLoad %float %131
+        %134 = OpAccessChain %_ptr_Function_float %data %int_5
+        %135 = OpLoad %float %134
+        %136 = OpAccessChain %_ptr_Function_float %data %int_9
+        %137 = OpLoad %float %136
+        %139 = OpFMul %float %132 %float_0_100000001
+        %140 = OpFMul %float %135 %float_0_100000001
+        %141 = OpFMul %float %137 %float_0_100000001
+        %143 = OpCompositeConstruct %v4float %139 %140 %141 %float_1
+               OpStore %x_GLF_color %143
+               OpBranch %128
+        %130 = OpLabel
+        %144 = OpAccessChain %_ptr_Function_float %data %int_5
+        %145 = OpLoad %float %144
+        %146 = OpAccessChain %_ptr_Function_float %data %int_9
+        %147 = OpLoad %float %146
+        %148 = OpAccessChain %_ptr_Function_float %data %int_0
+        %149 = OpLoad %float %148
+        %150 = OpFMul %float %145 %float_0_100000001
+        %151 = OpFMul %float %147 %float_0_100000001
+        %152 = OpFMul %float %149 %float_0_100000001
+        %153 = OpCompositeConstruct %v4float %150 %151 %152 %float_1
+               OpStore %x_GLF_color %153
+               OpBranch %128
+        %128 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %154
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %158 = OpLabel
+        %159 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %159
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %18
+        %161 = OpLabel
+        %162 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %162
+        %163 = OpFunctionCall %void %main_1
+        %165 = OpLoad %v4float %x_GLF_color
+        %166 = OpCompositeConstruct %main_out %165
+        %164 = OpFunctionCall %void %tint_symbol_3 %166
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..aac8d57
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block2/1.wgsl.expected.wgsl
@@ -0,0 +1,120 @@
+[[block]]
+struct buf1 {
+  resolution : vec2<f32>;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var data : array<f32, 10>;
+  var x_41_phi : i32;
+  var x_53_phi : i32;
+  x_41_phi = 0;
+  loop {
+    var x_42 : i32;
+    let x_41 : i32 = x_41_phi;
+    if ((x_41 < 10)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_49 : f32 = x_9.injectionSwitch.y;
+      data[x_41] = (f32((10 - x_41)) * x_49);
+      x_42 = (x_41 + 1);
+      x_41_phi = x_42;
+    }
+  }
+  x_53_phi = 0;
+  loop {
+    var x_54 : i32;
+    var x_60_phi : i32;
+    let x_53 : i32 = x_53_phi;
+    if ((x_53 < 9)) {
+    } else {
+      break;
+    }
+    x_60_phi = 0;
+    loop {
+      var x_83 : bool;
+      var x_84 : bool;
+      var x_61 : i32;
+      var x_85_phi : bool;
+      let x_60 : i32 = x_60_phi;
+      if ((x_60 < 10)) {
+      } else {
+        break;
+      }
+      if ((x_60 < (x_53 + 1))) {
+        continue;
+      }
+      let x_70 : ptr<function, f32> = &(data[x_53]);
+      let x_71 : f32 = *(x_70);
+      let x_72 : ptr<function, f32> = &(data[x_60]);
+      let x_73 : f32 = *(x_72);
+      let x_75 : f32 = gl_FragCoord.y;
+      let x_77 : f32 = x_6.resolution.y;
+      if ((x_75 < (x_77 * 0.5))) {
+        x_83 = (x_71 > x_73);
+        x_85_phi = x_83;
+      } else {
+        x_84 = (x_71 < x_73);
+        x_85_phi = x_84;
+      }
+      let x_85 : bool = x_85_phi;
+      if (x_85) {
+        let x_88 : f32 = *(x_70);
+        let x_89 : f32 = *(x_72);
+        *(x_70) = x_89;
+        *(x_72) = x_88;
+      }
+
+      continuing {
+        x_61 = (x_60 + 1);
+        x_60_phi = x_61;
+      }
+    }
+
+    continuing {
+      x_54 = (x_53 + 1);
+      x_53_phi = x_54;
+    }
+  }
+  let x_91 : f32 = gl_FragCoord.x;
+  let x_93 : f32 = x_6.resolution.x;
+  if ((x_91 < (x_93 * 0.5))) {
+    let x_100 : f32 = data[0];
+    let x_103 : f32 = data[5];
+    let x_106 : f32 = data[9];
+    x_GLF_color = vec4<f32>((x_100 * 0.100000001), (x_103 * 0.100000001), (x_106 * 0.100000001), 1.0);
+  } else {
+    let x_110 : f32 = data[5];
+    let x_113 : f32 = data[9];
+    let x_116 : f32 = data[0];
+    x_GLF_color = vec4<f32>((x_110 * 0.100000001), (x_113 * 0.100000001), (x_116 * 0.100000001), 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block3/1.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block3/1.spvasm
new file mode 100644
index 0000000..6504342
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block3/1.spvasm
@@ -0,0 +1,570 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %merge_i1_i1_i1_ "merge(i1;i1;i1;"
+               OpName %from "from"
+               OpName %mid "mid"
+               OpName %to "to"
+               OpName %mergeSort_ "mergeSort("
+               OpName %k "k"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %data "data"
+               OpName %temp "temp"
+               OpName %i_0 "i"
+               OpName %low "low"
+               OpName %high "high"
+               OpName %m "m"
+               OpName %i_1 "i"
+               OpName %from_0 "from"
+               OpName %mid_0 "mid"
+               OpName %to_0 "to"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %param_1 "param"
+               OpName %i_2 "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %j_0 "j"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %grey "grey"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "resolution"
+               OpName %__0 ""
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+       %void = OpTypeVoid
+         %34 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %37 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int %_ptr_Function_int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Private__arr_int_uint_10 = OpTypePointer Private %_arr_int_uint_10
+       %data = OpVariable %_ptr_Private__arr_int_uint_10 Private
+%_ptr_Private_int = OpTypePointer Private %int
+       %temp = OpVariable %_ptr_Private__arr_int_uint_10 Private
+     %int_10 = OpConstant %int 10
+      %int_0 = OpConstant %int 0
+      %int_9 = OpConstant %int 9
+      %int_2 = OpConstant %int 2
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_4 = OpConstant %int 4
+      %int_3 = OpConstant %int 3
+     %int_n1 = OpConstant %int -1
+     %int_n2 = OpConstant %int -2
+     %int_n3 = OpConstant %int -3
+     %int_n4 = OpConstant %int -4
+     %int_n5 = OpConstant %int -5
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+     %int_30 = OpConstant %int 30
+%_ptr_Function_float = OpTypePointer Function %float
+  %float_0_5 = OpConstant %float 0.5
+   %float_10 = OpConstant %float 10
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %v3float = OpTypeVector %float 3
+    %float_1 = OpConstant %float 1
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+       %true = OpConstantTrue %bool
+  %float_256 = OpConstant %float 256
+       %main = OpFunction %void None %34
+         %87 = OpLabel
+        %i_2 = OpVariable %_ptr_Function_int Function
+        %j_0 = OpVariable %_ptr_Function_int Function
+       %grey = OpVariable %_ptr_Function_float Function
+         %88 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %89 = OpLoad %float %88
+         %90 = OpConvertFToS %int %89
+               OpStore %i_2 %90
+               OpBranch %91
+         %91 = OpLabel
+               OpLoopMerge %92 %93 None
+               OpBranch %94
+         %94 = OpLabel
+         %95 = OpLoad %int %i_2
+               OpSelectionMerge %96 None
+               OpSwitch %95 %96 0 %97 1 %98 2 %99 3 %100 4 %101 5 %102 6 %103 7 %104 8 %105 9 %106
+         %97 = OpLabel
+        %107 = OpLoad %int %i_2
+        %108 = OpAccessChain %_ptr_Private_int %data %107
+               OpStore %108 %int_4
+               OpBranch %96
+         %98 = OpLabel
+        %109 = OpLoad %int %i_2
+        %110 = OpAccessChain %_ptr_Private_int %data %109
+               OpStore %110 %int_3
+               OpBranch %96
+         %99 = OpLabel
+        %111 = OpLoad %int %i_2
+        %112 = OpAccessChain %_ptr_Private_int %data %111
+               OpStore %112 %int_2
+               OpBranch %96
+        %100 = OpLabel
+        %113 = OpLoad %int %i_2
+        %114 = OpAccessChain %_ptr_Private_int %data %113
+               OpStore %114 %int_1
+               OpBranch %96
+        %101 = OpLabel
+        %115 = OpLoad %int %i_2
+        %116 = OpAccessChain %_ptr_Private_int %data %115
+               OpStore %116 %int_0
+               OpBranch %96
+        %102 = OpLabel
+        %117 = OpLoad %int %i_2
+        %118 = OpAccessChain %_ptr_Private_int %data %117
+               OpStore %118 %int_n1
+               OpBranch %96
+        %103 = OpLabel
+        %119 = OpLoad %int %i_2
+        %120 = OpAccessChain %_ptr_Private_int %data %119
+               OpStore %120 %int_n2
+               OpBranch %96
+        %104 = OpLabel
+        %121 = OpLoad %int %i_2
+        %122 = OpAccessChain %_ptr_Private_int %data %121
+               OpStore %122 %int_n3
+               OpBranch %96
+        %105 = OpLabel
+        %123 = OpLoad %int %i_2
+        %124 = OpAccessChain %_ptr_Private_int %data %123
+               OpStore %124 %int_n4
+               OpBranch %96
+        %106 = OpLabel
+        %125 = OpLoad %int %i_2
+        %126 = OpAccessChain %_ptr_Private_int %data %125
+               OpStore %126 %int_n5
+               OpBranch %96
+         %96 = OpLabel
+        %127 = OpLoad %int %i_2
+        %128 = OpIAdd %int %127 %int_1
+               OpStore %i_2 %128
+               OpBranch %93
+         %93 = OpLabel
+        %129 = OpLoad %int %i_2
+        %130 = OpSLessThan %bool %129 %int_10
+               OpBranchConditional %130 %91 %92
+         %92 = OpLabel
+               OpStore %j_0 %int_0
+               OpBranch %131
+        %131 = OpLabel
+               OpLoopMerge %132 %133 None
+               OpBranch %134
+        %134 = OpLabel
+        %135 = OpLoad %int %j_0
+        %136 = OpSLessThan %bool %135 %int_10
+               OpBranchConditional %136 %137 %132
+        %137 = OpLabel
+        %138 = OpLoad %int %j_0
+        %139 = OpLoad %int %j_0
+        %140 = OpAccessChain %_ptr_Private_int %data %139
+        %141 = OpLoad %int %140
+        %142 = OpAccessChain %_ptr_Private_int %temp %138
+               OpStore %142 %141
+               OpBranch %133
+        %133 = OpLabel
+        %143 = OpLoad %int %j_0
+        %144 = OpIAdd %int %143 %int_1
+               OpStore %j_0 %144
+               OpBranch %131
+        %132 = OpLabel
+        %145 = OpFunctionCall %void %mergeSort_
+        %146 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %147 = OpLoad %float %146
+        %148 = OpConvertFToS %int %147
+        %149 = OpSLessThan %bool %148 %int_30
+               OpSelectionMerge %150 None
+               OpBranchConditional %149 %151 %152
+        %151 = OpLabel
+        %153 = OpAccessChain %_ptr_Private_int %data %int_0
+        %154 = OpLoad %int %153
+        %155 = OpConvertSToF %float %154
+        %156 = OpFDiv %float %155 %float_10
+        %157 = OpFAdd %float %float_0_5 %156
+               OpStore %grey %157
+               OpBranch %150
+        %152 = OpLabel
+        %158 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %159 = OpLoad %float %158
+        %160 = OpConvertFToS %int %159
+        %161 = OpSLessThan %bool %160 %int_60
+               OpSelectionMerge %162 None
+               OpBranchConditional %161 %163 %164
+        %163 = OpLabel
+        %165 = OpAccessChain %_ptr_Private_int %data %int_1
+        %166 = OpLoad %int %165
+        %167 = OpConvertSToF %float %166
+        %168 = OpFDiv %float %167 %float_10
+        %169 = OpFAdd %float %float_0_5 %168
+               OpStore %grey %169
+               OpBranch %162
+        %164 = OpLabel
+        %170 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %171 = OpLoad %float %170
+        %172 = OpConvertFToS %int %171
+        %173 = OpSLessThan %bool %172 %int_90
+               OpSelectionMerge %174 None
+               OpBranchConditional %173 %175 %176
+        %175 = OpLabel
+        %177 = OpAccessChain %_ptr_Private_int %data %int_2
+        %178 = OpLoad %int %177
+        %179 = OpConvertSToF %float %178
+        %180 = OpFDiv %float %179 %float_10
+        %181 = OpFAdd %float %float_0_5 %180
+               OpStore %grey %181
+               OpBranch %174
+        %176 = OpLabel
+        %182 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %183 = OpLoad %float %182
+        %184 = OpConvertFToS %int %183
+        %185 = OpSLessThan %bool %184 %int_120
+               OpSelectionMerge %186 None
+               OpBranchConditional %185 %187 %188
+        %187 = OpLabel
+        %189 = OpAccessChain %_ptr_Private_int %data %int_3
+        %190 = OpLoad %int %189
+        %191 = OpConvertSToF %float %190
+        %192 = OpFDiv %float %191 %float_10
+        %193 = OpFAdd %float %float_0_5 %192
+               OpStore %grey %193
+               OpBranch %186
+        %188 = OpLabel
+        %194 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %195 = OpLoad %float %194
+        %196 = OpConvertFToS %int %195
+        %197 = OpSLessThan %bool %196 %int_150
+               OpSelectionMerge %198 None
+               OpBranchConditional %197 %199 %200
+        %199 = OpLabel
+               OpKill
+        %200 = OpLabel
+        %201 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %202 = OpLoad %float %201
+        %203 = OpConvertFToS %int %202
+        %204 = OpSLessThan %bool %203 %int_180
+               OpSelectionMerge %205 None
+               OpBranchConditional %204 %206 %207
+        %206 = OpLabel
+        %208 = OpAccessChain %_ptr_Private_int %data %int_5
+        %209 = OpLoad %int %208
+        %210 = OpConvertSToF %float %209
+        %211 = OpFDiv %float %210 %float_10
+        %212 = OpFAdd %float %float_0_5 %211
+               OpStore %grey %212
+               OpBranch %205
+        %207 = OpLabel
+        %213 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %214 = OpLoad %float %213
+        %215 = OpConvertFToS %int %214
+        %216 = OpSLessThan %bool %215 %int_210
+               OpSelectionMerge %217 None
+               OpBranchConditional %216 %218 %219
+        %218 = OpLabel
+        %220 = OpAccessChain %_ptr_Private_int %data %int_6
+        %221 = OpLoad %int %220
+        %222 = OpConvertSToF %float %221
+        %223 = OpFDiv %float %222 %float_10
+        %224 = OpFAdd %float %float_0_5 %223
+               OpStore %grey %224
+               OpBranch %217
+        %219 = OpLabel
+        %225 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %226 = OpLoad %float %225
+        %227 = OpConvertFToS %int %226
+        %228 = OpSLessThan %bool %227 %int_240
+               OpSelectionMerge %229 None
+               OpBranchConditional %228 %230 %231
+        %230 = OpLabel
+        %232 = OpAccessChain %_ptr_Private_int %data %int_7
+        %233 = OpLoad %int %232
+        %234 = OpConvertSToF %float %233
+        %235 = OpFDiv %float %234 %float_10
+        %236 = OpFAdd %float %float_0_5 %235
+               OpStore %grey %236
+               OpBranch %229
+        %231 = OpLabel
+        %237 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %238 = OpLoad %float %237
+        %239 = OpConvertFToS %int %238
+        %240 = OpSLessThan %bool %239 %int_270
+               OpSelectionMerge %241 None
+               OpBranchConditional %240 %242 %243
+        %242 = OpLabel
+        %244 = OpAccessChain %_ptr_Private_int %data %int_8
+        %245 = OpLoad %int %244
+        %246 = OpConvertSToF %float %245
+        %247 = OpFDiv %float %246 %float_10
+        %248 = OpFAdd %float %float_0_5 %247
+               OpStore %grey %248
+               OpBranch %241
+        %243 = OpLabel
+               OpKill
+        %241 = OpLabel
+               OpBranch %229
+        %229 = OpLabel
+               OpBranch %217
+        %217 = OpLabel
+               OpBranch %205
+        %205 = OpLabel
+               OpBranch %198
+        %198 = OpLabel
+               OpBranch %186
+        %186 = OpLabel
+               OpBranch %174
+        %174 = OpLabel
+               OpBranch %162
+        %162 = OpLabel
+               OpBranch %150
+        %150 = OpLabel
+        %249 = OpLoad %float %grey
+        %250 = OpCompositeConstruct %v3float %249 %249 %249
+        %251 = OpCompositeExtract %float %250 0
+        %252 = OpCompositeExtract %float %250 1
+        %253 = OpCompositeExtract %float %250 2
+        %254 = OpCompositeConstruct %v4float %251 %252 %253 %float_1
+               OpStore %_GLF_color %254
+               OpReturn
+               OpFunctionEnd
+%merge_i1_i1_i1_ = OpFunction %void None %37
+       %from = OpFunctionParameter %_ptr_Function_int
+        %mid = OpFunctionParameter %_ptr_Function_int
+         %to = OpFunctionParameter %_ptr_Function_int
+        %255 = OpLabel
+          %k = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+          %j = OpVariable %_ptr_Function_int Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+        %256 = OpLoad %int %from
+               OpStore %k %256
+        %257 = OpLoad %int %from
+               OpStore %i %257
+        %258 = OpLoad %int %mid
+        %259 = OpIAdd %int %258 %int_1
+               OpStore %j %259
+               OpBranch %260
+        %260 = OpLabel
+               OpLoopMerge %261 %262 None
+               OpBranch %263
+        %263 = OpLabel
+        %264 = OpLoad %int %i
+        %265 = OpLoad %int %mid
+        %266 = OpSLessThanEqual %bool %264 %265
+        %267 = OpLoad %int %j
+        %268 = OpLoad %int %to
+        %269 = OpSLessThanEqual %bool %267 %268
+        %270 = OpLogicalAnd %bool %266 %269
+               OpBranchConditional %270 %271 %261
+        %271 = OpLabel
+        %272 = OpLoad %int %i
+        %273 = OpAccessChain %_ptr_Private_int %data %272
+        %274 = OpLoad %int %273
+        %275 = OpLoad %int %j
+        %276 = OpAccessChain %_ptr_Private_int %data %275
+        %277 = OpLoad %int %276
+        %278 = OpSLessThan %bool %274 %277
+               OpSelectionMerge %279 None
+               OpBranchConditional %278 %280 %281
+        %280 = OpLabel
+        %282 = OpLoad %int %k
+        %283 = OpIAdd %int %282 %int_1
+               OpStore %k %283
+        %284 = OpLoad %int %i
+        %285 = OpIAdd %int %284 %int_1
+               OpStore %i %285
+        %286 = OpAccessChain %_ptr_Private_int %data %284
+        %287 = OpLoad %int %286
+        %288 = OpAccessChain %_ptr_Private_int %temp %282
+               OpStore %288 %287
+               OpBranch %279
+        %281 = OpLabel
+        %289 = OpLoad %int %k
+        %290 = OpIAdd %int %289 %int_1
+               OpStore %k %290
+        %291 = OpLoad %int %j
+        %292 = OpIAdd %int %291 %int_1
+               OpStore %j %292
+        %293 = OpAccessChain %_ptr_Private_int %data %291
+        %294 = OpLoad %int %293
+        %295 = OpAccessChain %_ptr_Private_int %temp %289
+               OpStore %295 %294
+               OpBranch %279
+        %279 = OpLabel
+               OpBranch %262
+        %262 = OpLabel
+               OpBranch %260
+        %261 = OpLabel
+               OpBranch %296
+        %296 = OpLabel
+        %297 = OpFUnordGreaterThanEqual %bool %float_256 %float_1
+               OpLoopMerge %298 %299 None
+               OpBranchConditional %297 %300 %299
+        %300 = OpLabel
+        %301 = OpLoad %int %i
+        %302 = OpSLessThan %bool %301 %int_10
+        %303 = OpLoad %int %i
+        %304 = OpLoad %int %mid
+        %305 = OpSLessThanEqual %bool %303 %304
+        %306 = OpLogicalAnd %bool %302 %305
+               OpBranchConditional %306 %307 %298
+        %307 = OpLabel
+               OpBranch %308
+        %308 = OpLabel
+        %309 = OpLoad %int %k
+        %310 = OpIAdd %int %309 %int_1
+               OpStore %k %310
+        %311 = OpLoad %int %i
+        %312 = OpIAdd %int %311 %int_1
+               OpStore %i %312
+        %313 = OpAccessChain %_ptr_Private_int %data %311
+        %314 = OpLoad %int %313
+        %315 = OpAccessChain %_ptr_Private_int %temp %309
+               OpStore %315 %314
+               OpBranchConditional %true %299 %299
+        %299 = OpLabel
+               OpBranch %296
+        %298 = OpLabel
+        %316 = OpLoad %int %from
+               OpStore %i_0 %316
+               OpBranch %317
+        %317 = OpLabel
+               OpLoopMerge %318 %319 None
+               OpBranch %320
+        %320 = OpLabel
+        %321 = OpLoad %int %i_0
+        %322 = OpLoad %int %to
+        %323 = OpSLessThanEqual %bool %321 %322
+               OpBranchConditional %323 %324 %318
+        %324 = OpLabel
+        %325 = OpLoad %int %i_0
+        %326 = OpLoad %int %i_0
+        %327 = OpAccessChain %_ptr_Private_int %temp %326
+        %328 = OpLoad %int %327
+        %329 = OpAccessChain %_ptr_Private_int %data %325
+               OpStore %329 %328
+               OpBranch %319
+        %319 = OpLabel
+        %330 = OpLoad %int %i_0
+        %331 = OpIAdd %int %330 %int_1
+               OpStore %i_0 %331
+               OpBranch %317
+        %318 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %mergeSort_ = OpFunction %void None %34
+        %332 = OpLabel
+        %low = OpVariable %_ptr_Function_int Function
+       %high = OpVariable %_ptr_Function_int Function
+          %m = OpVariable %_ptr_Function_int Function
+        %i_1 = OpVariable %_ptr_Function_int Function
+     %from_0 = OpVariable %_ptr_Function_int Function
+      %mid_0 = OpVariable %_ptr_Function_int Function
+       %to_0 = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_int Function
+    %param_0 = OpVariable %_ptr_Function_int Function
+    %param_1 = OpVariable %_ptr_Function_int Function
+               OpStore %low %int_0
+               OpStore %high %int_9
+               OpStore %m %int_1
+               OpBranch %333
+        %333 = OpLabel
+               OpLoopMerge %334 %335 None
+               OpBranch %336
+        %336 = OpLabel
+        %337 = OpLoad %int %m
+        %338 = OpLoad %int %high
+        %339 = OpSLessThanEqual %bool %337 %338
+               OpBranchConditional %339 %340 %334
+        %340 = OpLabel
+        %341 = OpLoad %int %low
+               OpStore %i_1 %341
+               OpBranch %342
+        %342 = OpLabel
+               OpLoopMerge %343 %344 None
+               OpBranch %345
+        %345 = OpLabel
+        %346 = OpLoad %int %i_1
+        %347 = OpLoad %int %high
+        %348 = OpSLessThan %bool %346 %347
+               OpBranchConditional %348 %349 %343
+        %349 = OpLabel
+        %350 = OpLoad %int %i_1
+               OpStore %from_0 %350
+        %351 = OpLoad %int %i_1
+        %352 = OpLoad %int %m
+        %353 = OpIAdd %int %351 %352
+        %354 = OpISub %int %353 %int_1
+               OpStore %mid_0 %354
+        %355 = OpLoad %int %i_1
+        %356 = OpLoad %int %m
+        %357 = OpIMul %int %int_2 %356
+        %358 = OpIAdd %int %355 %357
+        %359 = OpISub %int %358 %int_1
+        %360 = OpLoad %int %high
+        %361 = OpExtInst %int %1 SMin %359 %360
+               OpStore %to_0 %361
+        %362 = OpLoad %int %from_0
+               OpStore %param %362
+        %363 = OpLoad %int %mid_0
+               OpStore %param_0 %363
+        %364 = OpLoad %int %to_0
+               OpStore %param_1 %364
+        %365 = OpFunctionCall %void %merge_i1_i1_i1_ %param %param_0 %param_1
+               OpBranch %344
+        %344 = OpLabel
+        %366 = OpLoad %int %m
+        %367 = OpIMul %int %int_2 %366
+        %368 = OpLoad %int %i_1
+        %369 = OpIAdd %int %368 %367
+               OpStore %i_1 %369
+               OpBranch %342
+        %343 = OpLabel
+               OpBranch %335
+        %335 = OpLabel
+        %370 = OpLoad %int %m
+        %371 = OpIMul %int %int_2 %370
+               OpStore %m %371
+               OpBranch %333
+        %334 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block3/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block3/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..61539cb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block3/1.spvasm.expected.hlsl
@@ -0,0 +1,275 @@
+static int data[10] = (int[10])0;
+static int temp[10] = (int[10])0;
+cbuffer cbuffer_x_28 : register(b0, space0) {
+  uint4 x_28[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_32 : register(b1, space0) {
+  uint4 x_32[1];
+};
+
+void merge_i1_i1_i1_(inout int from, inout int mid, inout int to) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  const int x_256 = from;
+  k = x_256;
+  const int x_257 = from;
+  i = x_257;
+  const int x_258 = mid;
+  j = (x_258 + 1);
+  while (true) {
+    const int x_264 = i;
+    const int x_265 = mid;
+    const int x_267 = j;
+    const int x_268 = to;
+    bool tint_tmp = (x_264 <= x_265);
+    if (tint_tmp) {
+      tint_tmp = (x_267 <= x_268);
+    }
+    if ((tint_tmp)) {
+    } else {
+      break;
+    }
+    const int x_274 = data[i];
+    const int x_277 = data[j];
+    if ((x_274 < x_277)) {
+      const int x_282 = k;
+      k = (x_282 + 1);
+      const int x_284 = i;
+      i = (x_284 + 1);
+      const int x_287 = data[x_284];
+      temp[x_282] = x_287;
+    } else {
+      const int x_289 = k;
+      k = (x_289 + 1);
+      const int x_291 = j;
+      j = (x_291 + 1);
+      const int x_294 = data[x_291];
+      temp[x_289] = x_294;
+    }
+  }
+  while (true) {
+    if (!((256.0f < 1.0f))) {
+    } else {
+      continue;
+    }
+    const int x_301 = i;
+    const int x_303 = i;
+    const int x_304 = mid;
+    bool tint_tmp_1 = (x_301 < 10);
+    if (tint_tmp_1) {
+      tint_tmp_1 = (x_303 <= x_304);
+    }
+    if ((tint_tmp_1)) {
+    } else {
+      break;
+    }
+    const int x_309 = k;
+    k = (x_309 + 1);
+    const int x_311 = i;
+    i = (x_311 + 1);
+    const int x_314 = data[x_311];
+    temp[x_309] = x_314;
+  }
+  const int x_316 = from;
+  i_1 = x_316;
+  while (true) {
+    const int x_321 = i_1;
+    const int x_322 = to;
+    if ((x_321 <= x_322)) {
+    } else {
+      break;
+    }
+    const int x_325 = i_1;
+    const int x_328 = temp[i_1];
+    data[x_325] = x_328;
+    {
+      i_1 = (i_1 + 1);
+    }
+  }
+  return;
+}
+
+void mergeSort_() {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  {
+    for(; (m <= high); m = (2 * m)) {
+      i_2 = low;
+      {
+        for(; (i_2 < high); i_2 = (i_2 + (2 * m))) {
+          from_1 = i_2;
+          mid_1 = ((i_2 + m) - 1);
+          to_1 = min(((i_2 + (2 * m)) - 1), high);
+          param = from_1;
+          param_1 = mid_1;
+          param_2 = to_1;
+          merge_i1_i1_i1_(param, param_1, param_2);
+        }
+      }
+    }
+  }
+  return;
+}
+
+void main_1() {
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  const float x_89 = asfloat(x_28[0].x);
+  i_3 = int(x_89);
+  while (true) {
+    switch(i_3) {
+      case 9: {
+        data[i_3] = -5;
+        break;
+      }
+      case 8: {
+        data[i_3] = -4;
+        break;
+      }
+      case 7: {
+        data[i_3] = -3;
+        break;
+      }
+      case 6: {
+        data[i_3] = -2;
+        break;
+      }
+      case 5: {
+        data[i_3] = -1;
+        break;
+      }
+      case 4: {
+        data[i_3] = 0;
+        break;
+      }
+      case 3: {
+        data[i_3] = 1;
+        break;
+      }
+      case 2: {
+        data[i_3] = 2;
+        break;
+      }
+      case 1: {
+        data[i_3] = 3;
+        break;
+      }
+      case 0: {
+        data[i_3] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    i_3 = (i_3 + 1);
+    {
+      if ((i_3 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  {
+    for(; (j_1 < 10); j_1 = (j_1 + 1)) {
+      const int x_138 = j_1;
+      const int x_141 = data[j_1];
+      temp[x_138] = x_141;
+    }
+  }
+  mergeSort_();
+  const float x_147 = gl_FragCoord.y;
+  if ((int(x_147) < 30)) {
+    const int x_154 = data[0];
+    grey = (0.5f + (float(x_154) / 10.0f));
+  } else {
+    const float x_159 = gl_FragCoord.y;
+    if ((int(x_159) < 60)) {
+      const int x_166 = data[1];
+      grey = (0.5f + (float(x_166) / 10.0f));
+    } else {
+      const float x_171 = gl_FragCoord.y;
+      if ((int(x_171) < 90)) {
+        const int x_178 = data[2];
+        grey = (0.5f + (float(x_178) / 10.0f));
+      } else {
+        const float x_183 = gl_FragCoord.y;
+        if ((int(x_183) < 120)) {
+          const int x_190 = data[3];
+          grey = (0.5f + (float(x_190) / 10.0f));
+        } else {
+          const float x_195 = gl_FragCoord.y;
+          if ((int(x_195) < 150)) {
+            discard;
+          } else {
+            const float x_202 = gl_FragCoord.y;
+            if ((int(x_202) < 180)) {
+              const int x_209 = data[5];
+              grey = (0.5f + (float(x_209) / 10.0f));
+            } else {
+              const float x_214 = gl_FragCoord.y;
+              if ((int(x_214) < 210)) {
+                const int x_221 = data[6];
+                grey = (0.5f + (float(x_221) / 10.0f));
+              } else {
+                const float x_226 = gl_FragCoord.y;
+                if ((int(x_226) < 240)) {
+                  const int x_233 = data[7];
+                  grey = (0.5f + (float(x_233) / 10.0f));
+                } else {
+                  const float x_238 = gl_FragCoord.y;
+                  if ((int(x_238) < 270)) {
+                    const int x_245 = data[8];
+                    grey = (0.5f + (float(x_245) / 10.0f));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  const float x_249 = grey;
+  const float3 x_250 = float3(x_249, x_249, x_249);
+  x_GLF_color = float4(x_250.x, x_250.y, x_250.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block3/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block3/1.spvasm.expected.msl
new file mode 100644
index 0000000..e2f2448
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block3/1.spvasm.expected.msl
@@ -0,0 +1,321 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct buf1 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void merge_i1_i1_i1_(thread int* const from, thread int* const mid, thread int* const to, thread tint_array_wrapper* const tint_symbol_5, thread tint_array_wrapper* const tint_symbol_6) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  int const x_256 = *(from);
+  k = x_256;
+  int const x_257 = *(from);
+  i = x_257;
+  int const x_258 = *(mid);
+  j = (x_258 + 1);
+  while (true) {
+    int const x_264 = i;
+    int const x_265 = *(mid);
+    int const x_267 = j;
+    int const x_268 = *(to);
+    if (((x_264 <= x_265) && (x_267 <= x_268))) {
+    } else {
+      break;
+    }
+    int const x_272 = i;
+    int const x_274 = (*(tint_symbol_5)).arr[x_272];
+    int const x_275 = j;
+    int const x_277 = (*(tint_symbol_5)).arr[x_275];
+    if ((x_274 < x_277)) {
+      int const x_282 = k;
+      k = (x_282 + 1);
+      int const x_284 = i;
+      i = (x_284 + 1);
+      int const x_287 = (*(tint_symbol_5)).arr[x_284];
+      (*(tint_symbol_6)).arr[x_282] = x_287;
+    } else {
+      int const x_289 = k;
+      k = (x_289 + 1);
+      int const x_291 = j;
+      j = (x_291 + 1);
+      int const x_294 = (*(tint_symbol_5)).arr[x_291];
+      (*(tint_symbol_6)).arr[x_289] = x_294;
+    }
+  }
+  while (true) {
+    if (!((256.0f < 1.0f))) {
+    } else {
+      continue;
+    }
+    int const x_301 = i;
+    int const x_303 = i;
+    int const x_304 = *(mid);
+    if (((x_301 < 10) && (x_303 <= x_304))) {
+    } else {
+      break;
+    }
+    int const x_309 = k;
+    k = (x_309 + 1);
+    int const x_311 = i;
+    i = (x_311 + 1);
+    int const x_314 = (*(tint_symbol_5)).arr[x_311];
+    (*(tint_symbol_6)).arr[x_309] = x_314;
+  }
+  int const x_316 = *(from);
+  i_1 = x_316;
+  while (true) {
+    int const x_321 = i_1;
+    int const x_322 = *(to);
+    if ((x_321 <= x_322)) {
+    } else {
+      break;
+    }
+    int const x_325 = i_1;
+    int const x_326 = i_1;
+    int const x_328 = (*(tint_symbol_6)).arr[x_326];
+    (*(tint_symbol_5)).arr[x_325] = x_328;
+    {
+      int const x_330 = i_1;
+      i_1 = (x_330 + 1);
+    }
+  }
+  return;
+}
+
+void mergeSort_(thread tint_array_wrapper* const tint_symbol_7, thread tint_array_wrapper* const tint_symbol_8) {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  while (true) {
+    int const x_337 = m;
+    int const x_338 = high;
+    if ((x_337 <= x_338)) {
+    } else {
+      break;
+    }
+    int const x_341 = low;
+    i_2 = x_341;
+    while (true) {
+      int const x_346 = i_2;
+      int const x_347 = high;
+      if ((x_346 < x_347)) {
+      } else {
+        break;
+      }
+      int const x_350 = i_2;
+      from_1 = x_350;
+      int const x_351 = i_2;
+      int const x_352 = m;
+      mid_1 = ((x_351 + x_352) - 1);
+      int const x_355 = i_2;
+      int const x_356 = m;
+      int const x_360 = high;
+      to_1 = min(((x_355 + (2 * x_356)) - 1), x_360);
+      int const x_362 = from_1;
+      param = x_362;
+      int const x_363 = mid_1;
+      param_1 = x_363;
+      int const x_364 = to_1;
+      param_2 = x_364;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2), tint_symbol_7, tint_symbol_8);
+      {
+        int const x_366 = m;
+        int const x_368 = i_2;
+        i_2 = (x_368 + (2 * x_366));
+      }
+    }
+    {
+      int const x_370 = m;
+      m = (2 * x_370);
+    }
+  }
+  return;
+}
+
+void main_1(constant buf0& x_28, thread tint_array_wrapper* const tint_symbol_9, thread tint_array_wrapper* const tint_symbol_10, thread float4* const tint_symbol_11, thread float4* const tint_symbol_12) {
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  float const x_89 = x_28.injectionSwitch.x;
+  i_3 = int(x_89);
+  while (true) {
+    int const x_95 = i_3;
+    switch(x_95) {
+      case 9: {
+        int const x_125 = i_3;
+        (*(tint_symbol_9)).arr[x_125] = -5;
+        break;
+      }
+      case 8: {
+        int const x_123 = i_3;
+        (*(tint_symbol_9)).arr[x_123] = -4;
+        break;
+      }
+      case 7: {
+        int const x_121 = i_3;
+        (*(tint_symbol_9)).arr[x_121] = -3;
+        break;
+      }
+      case 6: {
+        int const x_119 = i_3;
+        (*(tint_symbol_9)).arr[x_119] = -2;
+        break;
+      }
+      case 5: {
+        int const x_117 = i_3;
+        (*(tint_symbol_9)).arr[x_117] = -1;
+        break;
+      }
+      case 4: {
+        int const x_115 = i_3;
+        (*(tint_symbol_9)).arr[x_115] = 0;
+        break;
+      }
+      case 3: {
+        int const x_113 = i_3;
+        (*(tint_symbol_9)).arr[x_113] = 1;
+        break;
+      }
+      case 2: {
+        int const x_111 = i_3;
+        (*(tint_symbol_9)).arr[x_111] = 2;
+        break;
+      }
+      case 1: {
+        int const x_109 = i_3;
+        (*(tint_symbol_9)).arr[x_109] = 3;
+        break;
+      }
+      case 0: {
+        int const x_107 = i_3;
+        (*(tint_symbol_9)).arr[x_107] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    int const x_127 = i_3;
+    i_3 = (x_127 + 1);
+    {
+      int const x_129 = i_3;
+      if ((x_129 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  while (true) {
+    int const x_135 = j_1;
+    if ((x_135 < 10)) {
+    } else {
+      break;
+    }
+    int const x_138 = j_1;
+    int const x_139 = j_1;
+    int const x_141 = (*(tint_symbol_9)).arr[x_139];
+    (*(tint_symbol_10)).arr[x_138] = x_141;
+    {
+      int const x_143 = j_1;
+      j_1 = (x_143 + 1);
+    }
+  }
+  mergeSort_(tint_symbol_9, tint_symbol_10);
+  float const x_147 = (*(tint_symbol_11)).y;
+  if ((int(x_147) < 30)) {
+    int const x_154 = (*(tint_symbol_9)).arr[0];
+    grey = (0.5f + (float(x_154) / 10.0f));
+  } else {
+    float const x_159 = (*(tint_symbol_11)).y;
+    if ((int(x_159) < 60)) {
+      int const x_166 = (*(tint_symbol_9)).arr[1];
+      grey = (0.5f + (float(x_166) / 10.0f));
+    } else {
+      float const x_171 = (*(tint_symbol_11)).y;
+      if ((int(x_171) < 90)) {
+        int const x_178 = (*(tint_symbol_9)).arr[2];
+        grey = (0.5f + (float(x_178) / 10.0f));
+      } else {
+        float const x_183 = (*(tint_symbol_11)).y;
+        if ((int(x_183) < 120)) {
+          int const x_190 = (*(tint_symbol_9)).arr[3];
+          grey = (0.5f + (float(x_190) / 10.0f));
+        } else {
+          float const x_195 = (*(tint_symbol_11)).y;
+          if ((int(x_195) < 150)) {
+            discard_fragment();
+          } else {
+            float const x_202 = (*(tint_symbol_11)).y;
+            if ((int(x_202) < 180)) {
+              int const x_209 = (*(tint_symbol_9)).arr[5];
+              grey = (0.5f + (float(x_209) / 10.0f));
+            } else {
+              float const x_214 = (*(tint_symbol_11)).y;
+              if ((int(x_214) < 210)) {
+                int const x_221 = (*(tint_symbol_9)).arr[6];
+                grey = (0.5f + (float(x_221) / 10.0f));
+              } else {
+                float const x_226 = (*(tint_symbol_11)).y;
+                if ((int(x_226) < 240)) {
+                  int const x_233 = (*(tint_symbol_9)).arr[7];
+                  grey = (0.5f + (float(x_233) / 10.0f));
+                } else {
+                  float const x_238 = (*(tint_symbol_11)).y;
+                  if ((int(x_238) < 270)) {
+                    int const x_245 = (*(tint_symbol_9)).arr[8];
+                    grey = (0.5f + (float(x_245) / 10.0f));
+                  } else {
+                    discard_fragment();
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  float const x_249 = grey;
+  float3 const x_250 = float3(x_249, x_249, x_249);
+  *(tint_symbol_12) = float4(x_250.x, x_250.y, x_250.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_28 [[buffer(0)]]) {
+  thread float4 tint_symbol_13 = 0.0f;
+  thread tint_array_wrapper tint_symbol_14 = {};
+  thread tint_array_wrapper tint_symbol_15 = {};
+  thread float4 tint_symbol_16 = 0.0f;
+  tint_symbol_13 = gl_FragCoord_param;
+  main_1(x_28, &(tint_symbol_14), &(tint_symbol_15), &(tint_symbol_13), &(tint_symbol_16));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_16};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block3/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block3/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..f632619
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block3/1.spvasm.expected.spvasm
@@ -0,0 +1,670 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 425
+; Schema: 0
+               OpCapability Shader
+        %187 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %data "data"
+               OpName %temp "temp"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_28 "x_28"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "resolution"
+               OpName %x_32 "x_32"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %merge_i1_i1_i1_ "merge_i1_i1_i1_"
+               OpName %from "from"
+               OpName %mid "mid"
+               OpName %to "to"
+               OpName %k "k"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %i_1 "i_1"
+               OpName %mergeSort_ "mergeSort_"
+               OpName %low "low"
+               OpName %high "high"
+               OpName %m "m"
+               OpName %i_2 "i_2"
+               OpName %from_1 "from_1"
+               OpName %mid_1 "mid_1"
+               OpName %to_1 "to_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %main_1 "main_1"
+               OpName %i_3 "i_3"
+               OpName %j_1 "j_1"
+               OpName %grey "grey"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_28 NonWritable
+               OpDecorate %x_28 DescriptorSet 0
+               OpDecorate %x_28 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_32 NonWritable
+               OpDecorate %x_32 DescriptorSet 0
+               OpDecorate %x_32 Binding 1
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Private__arr_int_uint_10 = OpTypePointer Private %_arr_int_uint_10
+          %7 = OpConstantNull %_arr_int_uint_10
+       %data = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+       %temp = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_28 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %17
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_32 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+         %26 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int %_ptr_Function_int
+         %35 = OpConstantNull %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+%_ptr_Private_int = OpTypePointer Private %int
+  %float_256 = OpConstant %float 256
+    %float_1 = OpConstant %float 1
+     %int_10 = OpConstant %int 10
+        %142 = OpTypeFunction %void
+      %int_0 = OpConstant %int 0
+      %int_9 = OpConstant %int 9
+      %int_2 = OpConstant %int 2
+%_ptr_Function_float = OpTypePointer Function %float
+        %211 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %int_n5 = OpConstant %int -5
+     %int_n4 = OpConstant %int -4
+     %int_n3 = OpConstant %int -3
+     %int_n2 = OpConstant %int -2
+     %int_n1 = OpConstant %int -1
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %int_30 = OpConstant %int 30
+  %float_0_5 = OpConstant %float 0.5
+   %float_10 = OpConstant %float 10
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+    %v3float = OpTypeVector %float 3
+   %main_out = OpTypeStruct %v4float
+        %412 = OpTypeFunction %void %main_out
+%merge_i1_i1_i1_ = OpFunction %void None %26
+       %from = OpFunctionParameter %_ptr_Function_int
+        %mid = OpFunctionParameter %_ptr_Function_int
+         %to = OpFunctionParameter %_ptr_Function_int
+         %33 = OpLabel
+          %k = OpVariable %_ptr_Function_int Function %35
+          %i = OpVariable %_ptr_Function_int Function %35
+          %j = OpVariable %_ptr_Function_int Function %35
+        %i_1 = OpVariable %_ptr_Function_int Function %35
+         %40 = OpLoad %int %from
+               OpStore %k %40
+         %42 = OpLoad %int %from
+               OpStore %i %42
+         %44 = OpLoad %int %mid
+         %46 = OpIAdd %int %44 %int_1
+               OpStore %j %46
+               OpBranch %47
+         %47 = OpLabel
+               OpLoopMerge %48 %49 None
+               OpBranch %50
+         %50 = OpLabel
+         %51 = OpLoad %int %i
+         %53 = OpLoad %int %mid
+         %54 = OpLoad %int %j
+         %56 = OpLoad %int %to
+         %57 = OpSLessThanEqual %bool %51 %53
+               OpSelectionMerge %59 None
+               OpBranchConditional %57 %60 %59
+         %60 = OpLabel
+         %61 = OpSLessThanEqual %bool %54 %56
+               OpBranch %59
+         %59 = OpLabel
+         %62 = OpPhi %bool %57 %50 %61 %60
+               OpSelectionMerge %63 None
+               OpBranchConditional %62 %64 %65
+         %64 = OpLabel
+               OpBranch %63
+         %65 = OpLabel
+               OpBranch %48
+         %63 = OpLabel
+         %66 = OpLoad %int %i
+         %68 = OpAccessChain %_ptr_Private_int %data %66
+         %69 = OpLoad %int %68
+         %70 = OpLoad %int %j
+         %71 = OpAccessChain %_ptr_Private_int %data %70
+         %72 = OpLoad %int %71
+         %73 = OpSLessThan %bool %69 %72
+               OpSelectionMerge %74 None
+               OpBranchConditional %73 %75 %76
+         %75 = OpLabel
+         %77 = OpLoad %int %k
+         %78 = OpIAdd %int %77 %int_1
+               OpStore %k %78
+         %79 = OpLoad %int %i
+         %80 = OpIAdd %int %79 %int_1
+               OpStore %i %80
+         %81 = OpAccessChain %_ptr_Private_int %data %79
+         %82 = OpLoad %int %81
+         %83 = OpAccessChain %_ptr_Private_int %temp %77
+               OpStore %83 %82
+               OpBranch %74
+         %76 = OpLabel
+         %84 = OpLoad %int %k
+         %85 = OpIAdd %int %84 %int_1
+               OpStore %k %85
+         %86 = OpLoad %int %j
+         %87 = OpIAdd %int %86 %int_1
+               OpStore %j %87
+         %88 = OpAccessChain %_ptr_Private_int %data %86
+         %89 = OpLoad %int %88
+         %90 = OpAccessChain %_ptr_Private_int %temp %84
+               OpStore %90 %89
+               OpBranch %74
+         %74 = OpLabel
+               OpBranch %49
+         %49 = OpLabel
+               OpBranch %47
+         %48 = OpLabel
+               OpBranch %91
+         %91 = OpLabel
+               OpLoopMerge %92 %93 None
+               OpBranch %94
+         %94 = OpLabel
+         %98 = OpFOrdLessThan %bool %float_256 %float_1
+         %95 = OpLogicalNot %bool %98
+               OpSelectionMerge %99 None
+               OpBranchConditional %95 %100 %101
+        %100 = OpLabel
+               OpBranch %99
+        %101 = OpLabel
+               OpBranch %93
+         %99 = OpLabel
+        %102 = OpLoad %int %i
+        %103 = OpLoad %int %i
+        %105 = OpLoad %int %mid
+        %107 = OpSLessThan %bool %102 %int_10
+               OpSelectionMerge %108 None
+               OpBranchConditional %107 %109 %108
+        %109 = OpLabel
+        %110 = OpSLessThanEqual %bool %103 %105
+               OpBranch %108
+        %108 = OpLabel
+        %111 = OpPhi %bool %107 %99 %110 %109
+               OpSelectionMerge %112 None
+               OpBranchConditional %111 %113 %114
+        %113 = OpLabel
+               OpBranch %112
+        %114 = OpLabel
+               OpBranch %92
+        %112 = OpLabel
+        %115 = OpLoad %int %k
+        %116 = OpIAdd %int %115 %int_1
+               OpStore %k %116
+        %117 = OpLoad %int %i
+        %118 = OpIAdd %int %117 %int_1
+               OpStore %i %118
+        %119 = OpAccessChain %_ptr_Private_int %data %117
+        %120 = OpLoad %int %119
+        %121 = OpAccessChain %_ptr_Private_int %temp %115
+               OpStore %121 %120
+               OpBranch %93
+         %93 = OpLabel
+               OpBranch %91
+         %92 = OpLabel
+        %123 = OpLoad %int %from
+               OpStore %i_1 %123
+               OpBranch %124
+        %124 = OpLabel
+               OpLoopMerge %125 %126 None
+               OpBranch %127
+        %127 = OpLabel
+        %128 = OpLoad %int %i_1
+        %130 = OpLoad %int %to
+        %131 = OpSLessThanEqual %bool %128 %130
+               OpSelectionMerge %132 None
+               OpBranchConditional %131 %133 %134
+        %133 = OpLabel
+               OpBranch %132
+        %134 = OpLabel
+               OpBranch %125
+        %132 = OpLabel
+        %135 = OpLoad %int %i_1
+        %136 = OpLoad %int %i_1
+        %137 = OpAccessChain %_ptr_Private_int %temp %136
+        %138 = OpLoad %int %137
+        %139 = OpAccessChain %_ptr_Private_int %data %135
+               OpStore %139 %138
+               OpBranch %126
+        %126 = OpLabel
+        %140 = OpLoad %int %i_1
+        %141 = OpIAdd %int %140 %int_1
+               OpStore %i_1 %141
+               OpBranch %124
+        %125 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %mergeSort_ = OpFunction %void None %142
+        %144 = OpLabel
+        %low = OpVariable %_ptr_Function_int Function %35
+       %high = OpVariable %_ptr_Function_int Function %35
+          %m = OpVariable %_ptr_Function_int Function %35
+        %i_2 = OpVariable %_ptr_Function_int Function %35
+     %from_1 = OpVariable %_ptr_Function_int Function %35
+      %mid_1 = OpVariable %_ptr_Function_int Function %35
+       %to_1 = OpVariable %_ptr_Function_int Function %35
+      %param = OpVariable %_ptr_Function_int Function %35
+    %param_1 = OpVariable %_ptr_Function_int Function %35
+    %param_2 = OpVariable %_ptr_Function_int Function %35
+               OpStore %low %int_0
+               OpStore %high %int_9
+               OpStore %m %int_1
+               OpBranch %157
+        %157 = OpLabel
+               OpLoopMerge %158 %159 None
+               OpBranch %160
+        %160 = OpLabel
+        %161 = OpLoad %int %m
+        %162 = OpLoad %int %high
+        %163 = OpSLessThanEqual %bool %161 %162
+               OpSelectionMerge %164 None
+               OpBranchConditional %163 %165 %166
+        %165 = OpLabel
+               OpBranch %164
+        %166 = OpLabel
+               OpBranch %158
+        %164 = OpLabel
+        %167 = OpLoad %int %low
+               OpStore %i_2 %167
+               OpBranch %168
+        %168 = OpLabel
+               OpLoopMerge %169 %170 None
+               OpBranch %171
+        %171 = OpLabel
+        %172 = OpLoad %int %i_2
+        %173 = OpLoad %int %high
+        %174 = OpSLessThan %bool %172 %173
+               OpSelectionMerge %175 None
+               OpBranchConditional %174 %176 %177
+        %176 = OpLabel
+               OpBranch %175
+        %177 = OpLabel
+               OpBranch %169
+        %175 = OpLabel
+        %178 = OpLoad %int %i_2
+               OpStore %from_1 %178
+        %179 = OpLoad %int %i_2
+        %180 = OpLoad %int %m
+        %181 = OpIAdd %int %179 %180
+        %182 = OpISub %int %181 %int_1
+               OpStore %mid_1 %182
+        %183 = OpLoad %int %i_2
+        %184 = OpLoad %int %m
+        %185 = OpLoad %int %high
+        %189 = OpIMul %int %int_2 %184
+        %190 = OpIAdd %int %183 %189
+        %191 = OpISub %int %190 %int_1
+        %186 = OpExtInst %int %187 SMin %191 %185
+               OpStore %to_1 %186
+        %192 = OpLoad %int %from_1
+               OpStore %param %192
+        %193 = OpLoad %int %mid_1
+               OpStore %param_1 %193
+        %194 = OpLoad %int %to_1
+               OpStore %param_2 %194
+        %195 = OpFunctionCall %void %merge_i1_i1_i1_ %param %param_1 %param_2
+               OpBranch %170
+        %170 = OpLabel
+        %199 = OpLoad %int %m
+        %200 = OpLoad %int %i_2
+        %201 = OpIMul %int %int_2 %199
+        %202 = OpIAdd %int %200 %201
+               OpStore %i_2 %202
+               OpBranch %168
+        %169 = OpLabel
+               OpBranch %159
+        %159 = OpLabel
+        %203 = OpLoad %int %m
+        %204 = OpIMul %int %int_2 %203
+               OpStore %m %204
+               OpBranch %157
+        %158 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %142
+        %206 = OpLabel
+        %i_3 = OpVariable %_ptr_Function_int Function %35
+        %j_1 = OpVariable %_ptr_Function_int Function %35
+       %grey = OpVariable %_ptr_Function_float Function %211
+        %214 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_0
+        %215 = OpLoad %float %214
+        %216 = OpConvertFToS %int %215
+               OpStore %i_3 %216
+               OpBranch %217
+        %217 = OpLabel
+               OpLoopMerge %218 %219 None
+               OpBranch %220
+        %220 = OpLabel
+        %221 = OpLoad %int %i_3
+               OpSelectionMerge %222 None
+               OpSwitch %221 %223 9 %224 8 %225 7 %226 6 %227 5 %228 4 %229 3 %230 2 %231 1 %232 0 %233
+        %224 = OpLabel
+        %234 = OpLoad %int %i_3
+        %235 = OpAccessChain %_ptr_Private_int %data %234
+               OpStore %235 %int_n5
+               OpBranch %222
+        %225 = OpLabel
+        %237 = OpLoad %int %i_3
+        %238 = OpAccessChain %_ptr_Private_int %data %237
+               OpStore %238 %int_n4
+               OpBranch %222
+        %226 = OpLabel
+        %240 = OpLoad %int %i_3
+        %241 = OpAccessChain %_ptr_Private_int %data %240
+               OpStore %241 %int_n3
+               OpBranch %222
+        %227 = OpLabel
+        %243 = OpLoad %int %i_3
+        %244 = OpAccessChain %_ptr_Private_int %data %243
+               OpStore %244 %int_n2
+               OpBranch %222
+        %228 = OpLabel
+        %246 = OpLoad %int %i_3
+        %247 = OpAccessChain %_ptr_Private_int %data %246
+               OpStore %247 %int_n1
+               OpBranch %222
+        %229 = OpLabel
+        %249 = OpLoad %int %i_3
+        %250 = OpAccessChain %_ptr_Private_int %data %249
+               OpStore %250 %int_0
+               OpBranch %222
+        %230 = OpLabel
+        %251 = OpLoad %int %i_3
+        %252 = OpAccessChain %_ptr_Private_int %data %251
+               OpStore %252 %int_1
+               OpBranch %222
+        %231 = OpLabel
+        %253 = OpLoad %int %i_3
+        %254 = OpAccessChain %_ptr_Private_int %data %253
+               OpStore %254 %int_2
+               OpBranch %222
+        %232 = OpLabel
+        %255 = OpLoad %int %i_3
+        %256 = OpAccessChain %_ptr_Private_int %data %255
+               OpStore %256 %int_3
+               OpBranch %222
+        %233 = OpLabel
+        %258 = OpLoad %int %i_3
+        %259 = OpAccessChain %_ptr_Private_int %data %258
+               OpStore %259 %int_4
+               OpBranch %222
+        %223 = OpLabel
+               OpBranch %222
+        %222 = OpLabel
+        %261 = OpLoad %int %i_3
+        %262 = OpIAdd %int %261 %int_1
+               OpStore %i_3 %262
+               OpBranch %219
+        %219 = OpLabel
+        %263 = OpLoad %int %i_3
+        %264 = OpSLessThan %bool %263 %int_10
+               OpSelectionMerge %265 None
+               OpBranchConditional %264 %266 %267
+        %266 = OpLabel
+               OpBranch %265
+        %267 = OpLabel
+               OpBranch %218
+        %265 = OpLabel
+               OpBranch %217
+        %218 = OpLabel
+               OpStore %j_1 %int_0
+               OpBranch %268
+        %268 = OpLabel
+               OpLoopMerge %269 %270 None
+               OpBranch %271
+        %271 = OpLabel
+        %272 = OpLoad %int %j_1
+        %273 = OpSLessThan %bool %272 %int_10
+               OpSelectionMerge %274 None
+               OpBranchConditional %273 %275 %276
+        %275 = OpLabel
+               OpBranch %274
+        %276 = OpLabel
+               OpBranch %269
+        %274 = OpLabel
+        %277 = OpLoad %int %j_1
+        %278 = OpLoad %int %j_1
+        %279 = OpAccessChain %_ptr_Private_int %data %278
+        %280 = OpLoad %int %279
+        %281 = OpAccessChain %_ptr_Private_int %temp %277
+               OpStore %281 %280
+               OpBranch %270
+        %270 = OpLabel
+        %282 = OpLoad %int %j_1
+        %283 = OpIAdd %int %282 %int_1
+               OpStore %j_1 %283
+               OpBranch %268
+        %269 = OpLabel
+        %284 = OpFunctionCall %void %mergeSort_
+        %287 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %288 = OpLoad %float %287
+        %289 = OpConvertFToS %int %288
+        %291 = OpSLessThan %bool %289 %int_30
+               OpSelectionMerge %292 None
+               OpBranchConditional %291 %293 %294
+        %293 = OpLabel
+        %295 = OpAccessChain %_ptr_Private_int %data %int_0
+        %296 = OpLoad %int %295
+        %298 = OpConvertSToF %float %296
+        %300 = OpFDiv %float %298 %float_10
+        %301 = OpFAdd %float %float_0_5 %300
+               OpStore %grey %301
+               OpBranch %292
+        %294 = OpLabel
+        %302 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %303 = OpLoad %float %302
+        %304 = OpConvertFToS %int %303
+        %306 = OpSLessThan %bool %304 %int_60
+               OpSelectionMerge %307 None
+               OpBranchConditional %306 %308 %309
+        %308 = OpLabel
+        %310 = OpAccessChain %_ptr_Private_int %data %int_1
+        %311 = OpLoad %int %310
+        %312 = OpConvertSToF %float %311
+        %313 = OpFDiv %float %312 %float_10
+        %314 = OpFAdd %float %float_0_5 %313
+               OpStore %grey %314
+               OpBranch %307
+        %309 = OpLabel
+        %315 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %316 = OpLoad %float %315
+        %317 = OpConvertFToS %int %316
+        %319 = OpSLessThan %bool %317 %int_90
+               OpSelectionMerge %320 None
+               OpBranchConditional %319 %321 %322
+        %321 = OpLabel
+        %323 = OpAccessChain %_ptr_Private_int %data %int_2
+        %324 = OpLoad %int %323
+        %325 = OpConvertSToF %float %324
+        %326 = OpFDiv %float %325 %float_10
+        %327 = OpFAdd %float %float_0_5 %326
+               OpStore %grey %327
+               OpBranch %320
+        %322 = OpLabel
+        %328 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %329 = OpLoad %float %328
+        %330 = OpConvertFToS %int %329
+        %332 = OpSLessThan %bool %330 %int_120
+               OpSelectionMerge %333 None
+               OpBranchConditional %332 %334 %335
+        %334 = OpLabel
+        %336 = OpAccessChain %_ptr_Private_int %data %int_3
+        %337 = OpLoad %int %336
+        %338 = OpConvertSToF %float %337
+        %339 = OpFDiv %float %338 %float_10
+        %340 = OpFAdd %float %float_0_5 %339
+               OpStore %grey %340
+               OpBranch %333
+        %335 = OpLabel
+        %341 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %342 = OpLoad %float %341
+        %343 = OpConvertFToS %int %342
+        %345 = OpSLessThan %bool %343 %int_150
+               OpSelectionMerge %346 None
+               OpBranchConditional %345 %347 %348
+        %347 = OpLabel
+               OpKill
+        %348 = OpLabel
+        %349 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %350 = OpLoad %float %349
+        %351 = OpConvertFToS %int %350
+        %353 = OpSLessThan %bool %351 %int_180
+               OpSelectionMerge %354 None
+               OpBranchConditional %353 %355 %356
+        %355 = OpLabel
+        %358 = OpAccessChain %_ptr_Private_int %data %int_5
+        %359 = OpLoad %int %358
+        %360 = OpConvertSToF %float %359
+        %361 = OpFDiv %float %360 %float_10
+        %362 = OpFAdd %float %float_0_5 %361
+               OpStore %grey %362
+               OpBranch %354
+        %356 = OpLabel
+        %363 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %364 = OpLoad %float %363
+        %365 = OpConvertFToS %int %364
+        %367 = OpSLessThan %bool %365 %int_210
+               OpSelectionMerge %368 None
+               OpBranchConditional %367 %369 %370
+        %369 = OpLabel
+        %372 = OpAccessChain %_ptr_Private_int %data %int_6
+        %373 = OpLoad %int %372
+        %374 = OpConvertSToF %float %373
+        %375 = OpFDiv %float %374 %float_10
+        %376 = OpFAdd %float %float_0_5 %375
+               OpStore %grey %376
+               OpBranch %368
+        %370 = OpLabel
+        %377 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %378 = OpLoad %float %377
+        %379 = OpConvertFToS %int %378
+        %381 = OpSLessThan %bool %379 %int_240
+               OpSelectionMerge %382 None
+               OpBranchConditional %381 %383 %384
+        %383 = OpLabel
+        %386 = OpAccessChain %_ptr_Private_int %data %int_7
+        %387 = OpLoad %int %386
+        %388 = OpConvertSToF %float %387
+        %389 = OpFDiv %float %388 %float_10
+        %390 = OpFAdd %float %float_0_5 %389
+               OpStore %grey %390
+               OpBranch %382
+        %384 = OpLabel
+        %391 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %392 = OpLoad %float %391
+        %393 = OpConvertFToS %int %392
+        %395 = OpSLessThan %bool %393 %int_270
+               OpSelectionMerge %396 None
+               OpBranchConditional %395 %397 %398
+        %397 = OpLabel
+        %400 = OpAccessChain %_ptr_Private_int %data %int_8
+        %401 = OpLoad %int %400
+        %402 = OpConvertSToF %float %401
+        %403 = OpFDiv %float %402 %float_10
+        %404 = OpFAdd %float %float_0_5 %403
+               OpStore %grey %404
+               OpBranch %396
+        %398 = OpLabel
+               OpKill
+        %396 = OpLabel
+               OpBranch %382
+        %382 = OpLabel
+               OpBranch %368
+        %368 = OpLabel
+               OpBranch %354
+        %354 = OpLabel
+               OpBranch %346
+        %346 = OpLabel
+               OpBranch %333
+        %333 = OpLabel
+               OpBranch %320
+        %320 = OpLabel
+               OpBranch %307
+        %307 = OpLabel
+               OpBranch %292
+        %292 = OpLabel
+        %405 = OpLoad %float %grey
+        %407 = OpCompositeConstruct %v3float %405 %405 %405
+        %408 = OpCompositeExtract %float %407 0
+        %409 = OpCompositeExtract %float %407 1
+        %410 = OpCompositeExtract %float %407 2
+        %411 = OpCompositeConstruct %v4float %408 %409 %410 %float_1
+               OpStore %x_GLF_color %411
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %412
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %416 = OpLabel
+        %417 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %417
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %142
+        %419 = OpLabel
+        %420 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %420
+        %421 = OpFunctionCall %void %main_1
+        %423 = OpLoad %v4float %x_GLF_color
+        %424 = OpCompositeConstruct %main_out %423
+        %422 = OpFunctionCall %void %tint_symbol_3 %424
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 219[%219] is not post dominated by the back-edge block 265[%265]
+  %265 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block3/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block3/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..b26ac12
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block3/1.spvasm.expected.wgsl
@@ -0,0 +1,317 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[block]]
+struct buf1 {
+  resolution : vec2<f32>;
+};
+
+var<private> data : array<i32, 10>;
+
+var<private> temp : array<i32, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_32 : buf1;
+
+fn merge_i1_i1_i1_(from : ptr<function, i32>, mid : ptr<function, i32>, to : ptr<function, i32>) {
+  var k : i32;
+  var i : i32;
+  var j : i32;
+  var i_1 : i32;
+  let x_256 : i32 = *(from);
+  k = x_256;
+  let x_257 : i32 = *(from);
+  i = x_257;
+  let x_258 : i32 = *(mid);
+  j = (x_258 + 1);
+  loop {
+    let x_264 : i32 = i;
+    let x_265 : i32 = *(mid);
+    let x_267 : i32 = j;
+    let x_268 : i32 = *(to);
+    if (((x_264 <= x_265) && (x_267 <= x_268))) {
+    } else {
+      break;
+    }
+    let x_272 : i32 = i;
+    let x_274 : i32 = data[x_272];
+    let x_275 : i32 = j;
+    let x_277 : i32 = data[x_275];
+    if ((x_274 < x_277)) {
+      let x_282 : i32 = k;
+      k = (x_282 + 1);
+      let x_284 : i32 = i;
+      i = (x_284 + 1);
+      let x_287 : i32 = data[x_284];
+      temp[x_282] = x_287;
+    } else {
+      let x_289 : i32 = k;
+      k = (x_289 + 1);
+      let x_291 : i32 = j;
+      j = (x_291 + 1);
+      let x_294 : i32 = data[x_291];
+      temp[x_289] = x_294;
+    }
+  }
+  loop {
+    if (!((256.0 < 1.0))) {
+    } else {
+      continue;
+    }
+    let x_301 : i32 = i;
+    let x_303 : i32 = i;
+    let x_304 : i32 = *(mid);
+    if (((x_301 < 10) && (x_303 <= x_304))) {
+    } else {
+      break;
+    }
+    let x_309 : i32 = k;
+    k = (x_309 + 1);
+    let x_311 : i32 = i;
+    i = (x_311 + 1);
+    let x_314 : i32 = data[x_311];
+    temp[x_309] = x_314;
+  }
+  let x_316 : i32 = *(from);
+  i_1 = x_316;
+  loop {
+    let x_321 : i32 = i_1;
+    let x_322 : i32 = *(to);
+    if ((x_321 <= x_322)) {
+    } else {
+      break;
+    }
+    let x_325 : i32 = i_1;
+    let x_326 : i32 = i_1;
+    let x_328 : i32 = temp[x_326];
+    data[x_325] = x_328;
+
+    continuing {
+      let x_330 : i32 = i_1;
+      i_1 = (x_330 + 1);
+    }
+  }
+  return;
+}
+
+fn mergeSort_() {
+  var low : i32;
+  var high : i32;
+  var m : i32;
+  var i_2 : i32;
+  var from_1 : i32;
+  var mid_1 : i32;
+  var to_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  low = 0;
+  high = 9;
+  m = 1;
+  loop {
+    let x_337 : i32 = m;
+    let x_338 : i32 = high;
+    if ((x_337 <= x_338)) {
+    } else {
+      break;
+    }
+    let x_341 : i32 = low;
+    i_2 = x_341;
+    loop {
+      let x_346 : i32 = i_2;
+      let x_347 : i32 = high;
+      if ((x_346 < x_347)) {
+      } else {
+        break;
+      }
+      let x_350 : i32 = i_2;
+      from_1 = x_350;
+      let x_351 : i32 = i_2;
+      let x_352 : i32 = m;
+      mid_1 = ((x_351 + x_352) - 1);
+      let x_355 : i32 = i_2;
+      let x_356 : i32 = m;
+      let x_360 : i32 = high;
+      to_1 = min(((x_355 + (2 * x_356)) - 1), x_360);
+      let x_362 : i32 = from_1;
+      param = x_362;
+      let x_363 : i32 = mid_1;
+      param_1 = x_363;
+      let x_364 : i32 = to_1;
+      param_2 = x_364;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2));
+
+      continuing {
+        let x_366 : i32 = m;
+        let x_368 : i32 = i_2;
+        i_2 = (x_368 + (2 * x_366));
+      }
+    }
+
+    continuing {
+      let x_370 : i32 = m;
+      m = (2 * x_370);
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_3 : i32;
+  var j_1 : i32;
+  var grey : f32;
+  let x_89 : f32 = x_28.injectionSwitch.x;
+  i_3 = i32(x_89);
+  loop {
+    let x_95 : i32 = i_3;
+    switch(x_95) {
+      case 9: {
+        let x_125 : i32 = i_3;
+        data[x_125] = -5;
+      }
+      case 8: {
+        let x_123 : i32 = i_3;
+        data[x_123] = -4;
+      }
+      case 7: {
+        let x_121 : i32 = i_3;
+        data[x_121] = -3;
+      }
+      case 6: {
+        let x_119 : i32 = i_3;
+        data[x_119] = -2;
+      }
+      case 5: {
+        let x_117 : i32 = i_3;
+        data[x_117] = -1;
+      }
+      case 4: {
+        let x_115 : i32 = i_3;
+        data[x_115] = 0;
+      }
+      case 3: {
+        let x_113 : i32 = i_3;
+        data[x_113] = 1;
+      }
+      case 2: {
+        let x_111 : i32 = i_3;
+        data[x_111] = 2;
+      }
+      case 1: {
+        let x_109 : i32 = i_3;
+        data[x_109] = 3;
+      }
+      case 0: {
+        let x_107 : i32 = i_3;
+        data[x_107] = 4;
+      }
+      default: {
+      }
+    }
+    let x_127 : i32 = i_3;
+    i_3 = (x_127 + 1);
+
+    continuing {
+      let x_129 : i32 = i_3;
+      if ((x_129 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  loop {
+    let x_135 : i32 = j_1;
+    if ((x_135 < 10)) {
+    } else {
+      break;
+    }
+    let x_138 : i32 = j_1;
+    let x_139 : i32 = j_1;
+    let x_141 : i32 = data[x_139];
+    temp[x_138] = x_141;
+
+    continuing {
+      let x_143 : i32 = j_1;
+      j_1 = (x_143 + 1);
+    }
+  }
+  mergeSort_();
+  let x_147 : f32 = gl_FragCoord.y;
+  if ((i32(x_147) < 30)) {
+    let x_154 : i32 = data[0];
+    grey = (0.5 + (f32(x_154) / 10.0));
+  } else {
+    let x_159 : f32 = gl_FragCoord.y;
+    if ((i32(x_159) < 60)) {
+      let x_166 : i32 = data[1];
+      grey = (0.5 + (f32(x_166) / 10.0));
+    } else {
+      let x_171 : f32 = gl_FragCoord.y;
+      if ((i32(x_171) < 90)) {
+        let x_178 : i32 = data[2];
+        grey = (0.5 + (f32(x_178) / 10.0));
+      } else {
+        let x_183 : f32 = gl_FragCoord.y;
+        if ((i32(x_183) < 120)) {
+          let x_190 : i32 = data[3];
+          grey = (0.5 + (f32(x_190) / 10.0));
+        } else {
+          let x_195 : f32 = gl_FragCoord.y;
+          if ((i32(x_195) < 150)) {
+            discard;
+          } else {
+            let x_202 : f32 = gl_FragCoord.y;
+            if ((i32(x_202) < 180)) {
+              let x_209 : i32 = data[5];
+              grey = (0.5 + (f32(x_209) / 10.0));
+            } else {
+              let x_214 : f32 = gl_FragCoord.y;
+              if ((i32(x_214) < 210)) {
+                let x_221 : i32 = data[6];
+                grey = (0.5 + (f32(x_221) / 10.0));
+              } else {
+                let x_226 : f32 = gl_FragCoord.y;
+                if ((i32(x_226) < 240)) {
+                  let x_233 : i32 = data[7];
+                  grey = (0.5 + (f32(x_233) / 10.0));
+                } else {
+                  let x_238 : f32 = gl_FragCoord.y;
+                  if ((i32(x_238) < 270)) {
+                    let x_245 : i32 = data[8];
+                    grey = (0.5 + (f32(x_245) / 10.0));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  let x_249 : f32 = grey;
+  let x_250 : vec3<f32> = vec3<f32>(x_249, x_249, x_249);
+  x_GLF_color = vec4<f32>(x_250.x, x_250.y, x_250.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block3/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block3/1.wgsl
new file mode 100644
index 0000000..b26ac12
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block3/1.wgsl
@@ -0,0 +1,317 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[block]]
+struct buf1 {
+  resolution : vec2<f32>;
+};
+
+var<private> data : array<i32, 10>;
+
+var<private> temp : array<i32, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_32 : buf1;
+
+fn merge_i1_i1_i1_(from : ptr<function, i32>, mid : ptr<function, i32>, to : ptr<function, i32>) {
+  var k : i32;
+  var i : i32;
+  var j : i32;
+  var i_1 : i32;
+  let x_256 : i32 = *(from);
+  k = x_256;
+  let x_257 : i32 = *(from);
+  i = x_257;
+  let x_258 : i32 = *(mid);
+  j = (x_258 + 1);
+  loop {
+    let x_264 : i32 = i;
+    let x_265 : i32 = *(mid);
+    let x_267 : i32 = j;
+    let x_268 : i32 = *(to);
+    if (((x_264 <= x_265) && (x_267 <= x_268))) {
+    } else {
+      break;
+    }
+    let x_272 : i32 = i;
+    let x_274 : i32 = data[x_272];
+    let x_275 : i32 = j;
+    let x_277 : i32 = data[x_275];
+    if ((x_274 < x_277)) {
+      let x_282 : i32 = k;
+      k = (x_282 + 1);
+      let x_284 : i32 = i;
+      i = (x_284 + 1);
+      let x_287 : i32 = data[x_284];
+      temp[x_282] = x_287;
+    } else {
+      let x_289 : i32 = k;
+      k = (x_289 + 1);
+      let x_291 : i32 = j;
+      j = (x_291 + 1);
+      let x_294 : i32 = data[x_291];
+      temp[x_289] = x_294;
+    }
+  }
+  loop {
+    if (!((256.0 < 1.0))) {
+    } else {
+      continue;
+    }
+    let x_301 : i32 = i;
+    let x_303 : i32 = i;
+    let x_304 : i32 = *(mid);
+    if (((x_301 < 10) && (x_303 <= x_304))) {
+    } else {
+      break;
+    }
+    let x_309 : i32 = k;
+    k = (x_309 + 1);
+    let x_311 : i32 = i;
+    i = (x_311 + 1);
+    let x_314 : i32 = data[x_311];
+    temp[x_309] = x_314;
+  }
+  let x_316 : i32 = *(from);
+  i_1 = x_316;
+  loop {
+    let x_321 : i32 = i_1;
+    let x_322 : i32 = *(to);
+    if ((x_321 <= x_322)) {
+    } else {
+      break;
+    }
+    let x_325 : i32 = i_1;
+    let x_326 : i32 = i_1;
+    let x_328 : i32 = temp[x_326];
+    data[x_325] = x_328;
+
+    continuing {
+      let x_330 : i32 = i_1;
+      i_1 = (x_330 + 1);
+    }
+  }
+  return;
+}
+
+fn mergeSort_() {
+  var low : i32;
+  var high : i32;
+  var m : i32;
+  var i_2 : i32;
+  var from_1 : i32;
+  var mid_1 : i32;
+  var to_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  low = 0;
+  high = 9;
+  m = 1;
+  loop {
+    let x_337 : i32 = m;
+    let x_338 : i32 = high;
+    if ((x_337 <= x_338)) {
+    } else {
+      break;
+    }
+    let x_341 : i32 = low;
+    i_2 = x_341;
+    loop {
+      let x_346 : i32 = i_2;
+      let x_347 : i32 = high;
+      if ((x_346 < x_347)) {
+      } else {
+        break;
+      }
+      let x_350 : i32 = i_2;
+      from_1 = x_350;
+      let x_351 : i32 = i_2;
+      let x_352 : i32 = m;
+      mid_1 = ((x_351 + x_352) - 1);
+      let x_355 : i32 = i_2;
+      let x_356 : i32 = m;
+      let x_360 : i32 = high;
+      to_1 = min(((x_355 + (2 * x_356)) - 1), x_360);
+      let x_362 : i32 = from_1;
+      param = x_362;
+      let x_363 : i32 = mid_1;
+      param_1 = x_363;
+      let x_364 : i32 = to_1;
+      param_2 = x_364;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2));
+
+      continuing {
+        let x_366 : i32 = m;
+        let x_368 : i32 = i_2;
+        i_2 = (x_368 + (2 * x_366));
+      }
+    }
+
+    continuing {
+      let x_370 : i32 = m;
+      m = (2 * x_370);
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_3 : i32;
+  var j_1 : i32;
+  var grey : f32;
+  let x_89 : f32 = x_28.injectionSwitch.x;
+  i_3 = i32(x_89);
+  loop {
+    let x_95 : i32 = i_3;
+    switch(x_95) {
+      case 9: {
+        let x_125 : i32 = i_3;
+        data[x_125] = -5;
+      }
+      case 8: {
+        let x_123 : i32 = i_3;
+        data[x_123] = -4;
+      }
+      case 7: {
+        let x_121 : i32 = i_3;
+        data[x_121] = -3;
+      }
+      case 6: {
+        let x_119 : i32 = i_3;
+        data[x_119] = -2;
+      }
+      case 5: {
+        let x_117 : i32 = i_3;
+        data[x_117] = -1;
+      }
+      case 4: {
+        let x_115 : i32 = i_3;
+        data[x_115] = 0;
+      }
+      case 3: {
+        let x_113 : i32 = i_3;
+        data[x_113] = 1;
+      }
+      case 2: {
+        let x_111 : i32 = i_3;
+        data[x_111] = 2;
+      }
+      case 1: {
+        let x_109 : i32 = i_3;
+        data[x_109] = 3;
+      }
+      case 0: {
+        let x_107 : i32 = i_3;
+        data[x_107] = 4;
+      }
+      default: {
+      }
+    }
+    let x_127 : i32 = i_3;
+    i_3 = (x_127 + 1);
+
+    continuing {
+      let x_129 : i32 = i_3;
+      if ((x_129 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  loop {
+    let x_135 : i32 = j_1;
+    if ((x_135 < 10)) {
+    } else {
+      break;
+    }
+    let x_138 : i32 = j_1;
+    let x_139 : i32 = j_1;
+    let x_141 : i32 = data[x_139];
+    temp[x_138] = x_141;
+
+    continuing {
+      let x_143 : i32 = j_1;
+      j_1 = (x_143 + 1);
+    }
+  }
+  mergeSort_();
+  let x_147 : f32 = gl_FragCoord.y;
+  if ((i32(x_147) < 30)) {
+    let x_154 : i32 = data[0];
+    grey = (0.5 + (f32(x_154) / 10.0));
+  } else {
+    let x_159 : f32 = gl_FragCoord.y;
+    if ((i32(x_159) < 60)) {
+      let x_166 : i32 = data[1];
+      grey = (0.5 + (f32(x_166) / 10.0));
+    } else {
+      let x_171 : f32 = gl_FragCoord.y;
+      if ((i32(x_171) < 90)) {
+        let x_178 : i32 = data[2];
+        grey = (0.5 + (f32(x_178) / 10.0));
+      } else {
+        let x_183 : f32 = gl_FragCoord.y;
+        if ((i32(x_183) < 120)) {
+          let x_190 : i32 = data[3];
+          grey = (0.5 + (f32(x_190) / 10.0));
+        } else {
+          let x_195 : f32 = gl_FragCoord.y;
+          if ((i32(x_195) < 150)) {
+            discard;
+          } else {
+            let x_202 : f32 = gl_FragCoord.y;
+            if ((i32(x_202) < 180)) {
+              let x_209 : i32 = data[5];
+              grey = (0.5 + (f32(x_209) / 10.0));
+            } else {
+              let x_214 : f32 = gl_FragCoord.y;
+              if ((i32(x_214) < 210)) {
+                let x_221 : i32 = data[6];
+                grey = (0.5 + (f32(x_221) / 10.0));
+              } else {
+                let x_226 : f32 = gl_FragCoord.y;
+                if ((i32(x_226) < 240)) {
+                  let x_233 : i32 = data[7];
+                  grey = (0.5 + (f32(x_233) / 10.0));
+                } else {
+                  let x_238 : f32 = gl_FragCoord.y;
+                  if ((i32(x_238) < 270)) {
+                    let x_245 : i32 = data[8];
+                    grey = (0.5 + (f32(x_245) / 10.0));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  let x_249 : f32 = grey;
+  let x_250 : vec3<f32> = vec3<f32>(x_249, x_249, x_249);
+  x_GLF_color = vec4<f32>(x_250.x, x_250.y, x_250.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block3/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block3/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..61539cb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block3/1.wgsl.expected.hlsl
@@ -0,0 +1,275 @@
+static int data[10] = (int[10])0;
+static int temp[10] = (int[10])0;
+cbuffer cbuffer_x_28 : register(b0, space0) {
+  uint4 x_28[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_32 : register(b1, space0) {
+  uint4 x_32[1];
+};
+
+void merge_i1_i1_i1_(inout int from, inout int mid, inout int to) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  const int x_256 = from;
+  k = x_256;
+  const int x_257 = from;
+  i = x_257;
+  const int x_258 = mid;
+  j = (x_258 + 1);
+  while (true) {
+    const int x_264 = i;
+    const int x_265 = mid;
+    const int x_267 = j;
+    const int x_268 = to;
+    bool tint_tmp = (x_264 <= x_265);
+    if (tint_tmp) {
+      tint_tmp = (x_267 <= x_268);
+    }
+    if ((tint_tmp)) {
+    } else {
+      break;
+    }
+    const int x_274 = data[i];
+    const int x_277 = data[j];
+    if ((x_274 < x_277)) {
+      const int x_282 = k;
+      k = (x_282 + 1);
+      const int x_284 = i;
+      i = (x_284 + 1);
+      const int x_287 = data[x_284];
+      temp[x_282] = x_287;
+    } else {
+      const int x_289 = k;
+      k = (x_289 + 1);
+      const int x_291 = j;
+      j = (x_291 + 1);
+      const int x_294 = data[x_291];
+      temp[x_289] = x_294;
+    }
+  }
+  while (true) {
+    if (!((256.0f < 1.0f))) {
+    } else {
+      continue;
+    }
+    const int x_301 = i;
+    const int x_303 = i;
+    const int x_304 = mid;
+    bool tint_tmp_1 = (x_301 < 10);
+    if (tint_tmp_1) {
+      tint_tmp_1 = (x_303 <= x_304);
+    }
+    if ((tint_tmp_1)) {
+    } else {
+      break;
+    }
+    const int x_309 = k;
+    k = (x_309 + 1);
+    const int x_311 = i;
+    i = (x_311 + 1);
+    const int x_314 = data[x_311];
+    temp[x_309] = x_314;
+  }
+  const int x_316 = from;
+  i_1 = x_316;
+  while (true) {
+    const int x_321 = i_1;
+    const int x_322 = to;
+    if ((x_321 <= x_322)) {
+    } else {
+      break;
+    }
+    const int x_325 = i_1;
+    const int x_328 = temp[i_1];
+    data[x_325] = x_328;
+    {
+      i_1 = (i_1 + 1);
+    }
+  }
+  return;
+}
+
+void mergeSort_() {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  {
+    for(; (m <= high); m = (2 * m)) {
+      i_2 = low;
+      {
+        for(; (i_2 < high); i_2 = (i_2 + (2 * m))) {
+          from_1 = i_2;
+          mid_1 = ((i_2 + m) - 1);
+          to_1 = min(((i_2 + (2 * m)) - 1), high);
+          param = from_1;
+          param_1 = mid_1;
+          param_2 = to_1;
+          merge_i1_i1_i1_(param, param_1, param_2);
+        }
+      }
+    }
+  }
+  return;
+}
+
+void main_1() {
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  const float x_89 = asfloat(x_28[0].x);
+  i_3 = int(x_89);
+  while (true) {
+    switch(i_3) {
+      case 9: {
+        data[i_3] = -5;
+        break;
+      }
+      case 8: {
+        data[i_3] = -4;
+        break;
+      }
+      case 7: {
+        data[i_3] = -3;
+        break;
+      }
+      case 6: {
+        data[i_3] = -2;
+        break;
+      }
+      case 5: {
+        data[i_3] = -1;
+        break;
+      }
+      case 4: {
+        data[i_3] = 0;
+        break;
+      }
+      case 3: {
+        data[i_3] = 1;
+        break;
+      }
+      case 2: {
+        data[i_3] = 2;
+        break;
+      }
+      case 1: {
+        data[i_3] = 3;
+        break;
+      }
+      case 0: {
+        data[i_3] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    i_3 = (i_3 + 1);
+    {
+      if ((i_3 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  {
+    for(; (j_1 < 10); j_1 = (j_1 + 1)) {
+      const int x_138 = j_1;
+      const int x_141 = data[j_1];
+      temp[x_138] = x_141;
+    }
+  }
+  mergeSort_();
+  const float x_147 = gl_FragCoord.y;
+  if ((int(x_147) < 30)) {
+    const int x_154 = data[0];
+    grey = (0.5f + (float(x_154) / 10.0f));
+  } else {
+    const float x_159 = gl_FragCoord.y;
+    if ((int(x_159) < 60)) {
+      const int x_166 = data[1];
+      grey = (0.5f + (float(x_166) / 10.0f));
+    } else {
+      const float x_171 = gl_FragCoord.y;
+      if ((int(x_171) < 90)) {
+        const int x_178 = data[2];
+        grey = (0.5f + (float(x_178) / 10.0f));
+      } else {
+        const float x_183 = gl_FragCoord.y;
+        if ((int(x_183) < 120)) {
+          const int x_190 = data[3];
+          grey = (0.5f + (float(x_190) / 10.0f));
+        } else {
+          const float x_195 = gl_FragCoord.y;
+          if ((int(x_195) < 150)) {
+            discard;
+          } else {
+            const float x_202 = gl_FragCoord.y;
+            if ((int(x_202) < 180)) {
+              const int x_209 = data[5];
+              grey = (0.5f + (float(x_209) / 10.0f));
+            } else {
+              const float x_214 = gl_FragCoord.y;
+              if ((int(x_214) < 210)) {
+                const int x_221 = data[6];
+                grey = (0.5f + (float(x_221) / 10.0f));
+              } else {
+                const float x_226 = gl_FragCoord.y;
+                if ((int(x_226) < 240)) {
+                  const int x_233 = data[7];
+                  grey = (0.5f + (float(x_233) / 10.0f));
+                } else {
+                  const float x_238 = gl_FragCoord.y;
+                  if ((int(x_238) < 270)) {
+                    const int x_245 = data[8];
+                    grey = (0.5f + (float(x_245) / 10.0f));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  const float x_249 = grey;
+  const float3 x_250 = float3(x_249, x_249, x_249);
+  x_GLF_color = float4(x_250.x, x_250.y, x_250.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block3/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block3/1.wgsl.expected.msl
new file mode 100644
index 0000000..e2f2448
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block3/1.wgsl.expected.msl
@@ -0,0 +1,321 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct buf1 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void merge_i1_i1_i1_(thread int* const from, thread int* const mid, thread int* const to, thread tint_array_wrapper* const tint_symbol_5, thread tint_array_wrapper* const tint_symbol_6) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  int const x_256 = *(from);
+  k = x_256;
+  int const x_257 = *(from);
+  i = x_257;
+  int const x_258 = *(mid);
+  j = (x_258 + 1);
+  while (true) {
+    int const x_264 = i;
+    int const x_265 = *(mid);
+    int const x_267 = j;
+    int const x_268 = *(to);
+    if (((x_264 <= x_265) && (x_267 <= x_268))) {
+    } else {
+      break;
+    }
+    int const x_272 = i;
+    int const x_274 = (*(tint_symbol_5)).arr[x_272];
+    int const x_275 = j;
+    int const x_277 = (*(tint_symbol_5)).arr[x_275];
+    if ((x_274 < x_277)) {
+      int const x_282 = k;
+      k = (x_282 + 1);
+      int const x_284 = i;
+      i = (x_284 + 1);
+      int const x_287 = (*(tint_symbol_5)).arr[x_284];
+      (*(tint_symbol_6)).arr[x_282] = x_287;
+    } else {
+      int const x_289 = k;
+      k = (x_289 + 1);
+      int const x_291 = j;
+      j = (x_291 + 1);
+      int const x_294 = (*(tint_symbol_5)).arr[x_291];
+      (*(tint_symbol_6)).arr[x_289] = x_294;
+    }
+  }
+  while (true) {
+    if (!((256.0f < 1.0f))) {
+    } else {
+      continue;
+    }
+    int const x_301 = i;
+    int const x_303 = i;
+    int const x_304 = *(mid);
+    if (((x_301 < 10) && (x_303 <= x_304))) {
+    } else {
+      break;
+    }
+    int const x_309 = k;
+    k = (x_309 + 1);
+    int const x_311 = i;
+    i = (x_311 + 1);
+    int const x_314 = (*(tint_symbol_5)).arr[x_311];
+    (*(tint_symbol_6)).arr[x_309] = x_314;
+  }
+  int const x_316 = *(from);
+  i_1 = x_316;
+  while (true) {
+    int const x_321 = i_1;
+    int const x_322 = *(to);
+    if ((x_321 <= x_322)) {
+    } else {
+      break;
+    }
+    int const x_325 = i_1;
+    int const x_326 = i_1;
+    int const x_328 = (*(tint_symbol_6)).arr[x_326];
+    (*(tint_symbol_5)).arr[x_325] = x_328;
+    {
+      int const x_330 = i_1;
+      i_1 = (x_330 + 1);
+    }
+  }
+  return;
+}
+
+void mergeSort_(thread tint_array_wrapper* const tint_symbol_7, thread tint_array_wrapper* const tint_symbol_8) {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  while (true) {
+    int const x_337 = m;
+    int const x_338 = high;
+    if ((x_337 <= x_338)) {
+    } else {
+      break;
+    }
+    int const x_341 = low;
+    i_2 = x_341;
+    while (true) {
+      int const x_346 = i_2;
+      int const x_347 = high;
+      if ((x_346 < x_347)) {
+      } else {
+        break;
+      }
+      int const x_350 = i_2;
+      from_1 = x_350;
+      int const x_351 = i_2;
+      int const x_352 = m;
+      mid_1 = ((x_351 + x_352) - 1);
+      int const x_355 = i_2;
+      int const x_356 = m;
+      int const x_360 = high;
+      to_1 = min(((x_355 + (2 * x_356)) - 1), x_360);
+      int const x_362 = from_1;
+      param = x_362;
+      int const x_363 = mid_1;
+      param_1 = x_363;
+      int const x_364 = to_1;
+      param_2 = x_364;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2), tint_symbol_7, tint_symbol_8);
+      {
+        int const x_366 = m;
+        int const x_368 = i_2;
+        i_2 = (x_368 + (2 * x_366));
+      }
+    }
+    {
+      int const x_370 = m;
+      m = (2 * x_370);
+    }
+  }
+  return;
+}
+
+void main_1(constant buf0& x_28, thread tint_array_wrapper* const tint_symbol_9, thread tint_array_wrapper* const tint_symbol_10, thread float4* const tint_symbol_11, thread float4* const tint_symbol_12) {
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  float const x_89 = x_28.injectionSwitch.x;
+  i_3 = int(x_89);
+  while (true) {
+    int const x_95 = i_3;
+    switch(x_95) {
+      case 9: {
+        int const x_125 = i_3;
+        (*(tint_symbol_9)).arr[x_125] = -5;
+        break;
+      }
+      case 8: {
+        int const x_123 = i_3;
+        (*(tint_symbol_9)).arr[x_123] = -4;
+        break;
+      }
+      case 7: {
+        int const x_121 = i_3;
+        (*(tint_symbol_9)).arr[x_121] = -3;
+        break;
+      }
+      case 6: {
+        int const x_119 = i_3;
+        (*(tint_symbol_9)).arr[x_119] = -2;
+        break;
+      }
+      case 5: {
+        int const x_117 = i_3;
+        (*(tint_symbol_9)).arr[x_117] = -1;
+        break;
+      }
+      case 4: {
+        int const x_115 = i_3;
+        (*(tint_symbol_9)).arr[x_115] = 0;
+        break;
+      }
+      case 3: {
+        int const x_113 = i_3;
+        (*(tint_symbol_9)).arr[x_113] = 1;
+        break;
+      }
+      case 2: {
+        int const x_111 = i_3;
+        (*(tint_symbol_9)).arr[x_111] = 2;
+        break;
+      }
+      case 1: {
+        int const x_109 = i_3;
+        (*(tint_symbol_9)).arr[x_109] = 3;
+        break;
+      }
+      case 0: {
+        int const x_107 = i_3;
+        (*(tint_symbol_9)).arr[x_107] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    int const x_127 = i_3;
+    i_3 = (x_127 + 1);
+    {
+      int const x_129 = i_3;
+      if ((x_129 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  while (true) {
+    int const x_135 = j_1;
+    if ((x_135 < 10)) {
+    } else {
+      break;
+    }
+    int const x_138 = j_1;
+    int const x_139 = j_1;
+    int const x_141 = (*(tint_symbol_9)).arr[x_139];
+    (*(tint_symbol_10)).arr[x_138] = x_141;
+    {
+      int const x_143 = j_1;
+      j_1 = (x_143 + 1);
+    }
+  }
+  mergeSort_(tint_symbol_9, tint_symbol_10);
+  float const x_147 = (*(tint_symbol_11)).y;
+  if ((int(x_147) < 30)) {
+    int const x_154 = (*(tint_symbol_9)).arr[0];
+    grey = (0.5f + (float(x_154) / 10.0f));
+  } else {
+    float const x_159 = (*(tint_symbol_11)).y;
+    if ((int(x_159) < 60)) {
+      int const x_166 = (*(tint_symbol_9)).arr[1];
+      grey = (0.5f + (float(x_166) / 10.0f));
+    } else {
+      float const x_171 = (*(tint_symbol_11)).y;
+      if ((int(x_171) < 90)) {
+        int const x_178 = (*(tint_symbol_9)).arr[2];
+        grey = (0.5f + (float(x_178) / 10.0f));
+      } else {
+        float const x_183 = (*(tint_symbol_11)).y;
+        if ((int(x_183) < 120)) {
+          int const x_190 = (*(tint_symbol_9)).arr[3];
+          grey = (0.5f + (float(x_190) / 10.0f));
+        } else {
+          float const x_195 = (*(tint_symbol_11)).y;
+          if ((int(x_195) < 150)) {
+            discard_fragment();
+          } else {
+            float const x_202 = (*(tint_symbol_11)).y;
+            if ((int(x_202) < 180)) {
+              int const x_209 = (*(tint_symbol_9)).arr[5];
+              grey = (0.5f + (float(x_209) / 10.0f));
+            } else {
+              float const x_214 = (*(tint_symbol_11)).y;
+              if ((int(x_214) < 210)) {
+                int const x_221 = (*(tint_symbol_9)).arr[6];
+                grey = (0.5f + (float(x_221) / 10.0f));
+              } else {
+                float const x_226 = (*(tint_symbol_11)).y;
+                if ((int(x_226) < 240)) {
+                  int const x_233 = (*(tint_symbol_9)).arr[7];
+                  grey = (0.5f + (float(x_233) / 10.0f));
+                } else {
+                  float const x_238 = (*(tint_symbol_11)).y;
+                  if ((int(x_238) < 270)) {
+                    int const x_245 = (*(tint_symbol_9)).arr[8];
+                    grey = (0.5f + (float(x_245) / 10.0f));
+                  } else {
+                    discard_fragment();
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  float const x_249 = grey;
+  float3 const x_250 = float3(x_249, x_249, x_249);
+  *(tint_symbol_12) = float4(x_250.x, x_250.y, x_250.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_28 [[buffer(0)]]) {
+  thread float4 tint_symbol_13 = 0.0f;
+  thread tint_array_wrapper tint_symbol_14 = {};
+  thread tint_array_wrapper tint_symbol_15 = {};
+  thread float4 tint_symbol_16 = 0.0f;
+  tint_symbol_13 = gl_FragCoord_param;
+  main_1(x_28, &(tint_symbol_14), &(tint_symbol_15), &(tint_symbol_13), &(tint_symbol_16));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_16};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block3/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block3/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..f632619
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block3/1.wgsl.expected.spvasm
@@ -0,0 +1,670 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 425
+; Schema: 0
+               OpCapability Shader
+        %187 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %data "data"
+               OpName %temp "temp"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_28 "x_28"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "resolution"
+               OpName %x_32 "x_32"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %merge_i1_i1_i1_ "merge_i1_i1_i1_"
+               OpName %from "from"
+               OpName %mid "mid"
+               OpName %to "to"
+               OpName %k "k"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %i_1 "i_1"
+               OpName %mergeSort_ "mergeSort_"
+               OpName %low "low"
+               OpName %high "high"
+               OpName %m "m"
+               OpName %i_2 "i_2"
+               OpName %from_1 "from_1"
+               OpName %mid_1 "mid_1"
+               OpName %to_1 "to_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %main_1 "main_1"
+               OpName %i_3 "i_3"
+               OpName %j_1 "j_1"
+               OpName %grey "grey"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_28 NonWritable
+               OpDecorate %x_28 DescriptorSet 0
+               OpDecorate %x_28 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_32 NonWritable
+               OpDecorate %x_32 DescriptorSet 0
+               OpDecorate %x_32 Binding 1
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Private__arr_int_uint_10 = OpTypePointer Private %_arr_int_uint_10
+          %7 = OpConstantNull %_arr_int_uint_10
+       %data = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+       %temp = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_28 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %17
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_32 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+         %26 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int %_ptr_Function_int
+         %35 = OpConstantNull %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+%_ptr_Private_int = OpTypePointer Private %int
+  %float_256 = OpConstant %float 256
+    %float_1 = OpConstant %float 1
+     %int_10 = OpConstant %int 10
+        %142 = OpTypeFunction %void
+      %int_0 = OpConstant %int 0
+      %int_9 = OpConstant %int 9
+      %int_2 = OpConstant %int 2
+%_ptr_Function_float = OpTypePointer Function %float
+        %211 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %int_n5 = OpConstant %int -5
+     %int_n4 = OpConstant %int -4
+     %int_n3 = OpConstant %int -3
+     %int_n2 = OpConstant %int -2
+     %int_n1 = OpConstant %int -1
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %int_30 = OpConstant %int 30
+  %float_0_5 = OpConstant %float 0.5
+   %float_10 = OpConstant %float 10
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+    %v3float = OpTypeVector %float 3
+   %main_out = OpTypeStruct %v4float
+        %412 = OpTypeFunction %void %main_out
+%merge_i1_i1_i1_ = OpFunction %void None %26
+       %from = OpFunctionParameter %_ptr_Function_int
+        %mid = OpFunctionParameter %_ptr_Function_int
+         %to = OpFunctionParameter %_ptr_Function_int
+         %33 = OpLabel
+          %k = OpVariable %_ptr_Function_int Function %35
+          %i = OpVariable %_ptr_Function_int Function %35
+          %j = OpVariable %_ptr_Function_int Function %35
+        %i_1 = OpVariable %_ptr_Function_int Function %35
+         %40 = OpLoad %int %from
+               OpStore %k %40
+         %42 = OpLoad %int %from
+               OpStore %i %42
+         %44 = OpLoad %int %mid
+         %46 = OpIAdd %int %44 %int_1
+               OpStore %j %46
+               OpBranch %47
+         %47 = OpLabel
+               OpLoopMerge %48 %49 None
+               OpBranch %50
+         %50 = OpLabel
+         %51 = OpLoad %int %i
+         %53 = OpLoad %int %mid
+         %54 = OpLoad %int %j
+         %56 = OpLoad %int %to
+         %57 = OpSLessThanEqual %bool %51 %53
+               OpSelectionMerge %59 None
+               OpBranchConditional %57 %60 %59
+         %60 = OpLabel
+         %61 = OpSLessThanEqual %bool %54 %56
+               OpBranch %59
+         %59 = OpLabel
+         %62 = OpPhi %bool %57 %50 %61 %60
+               OpSelectionMerge %63 None
+               OpBranchConditional %62 %64 %65
+         %64 = OpLabel
+               OpBranch %63
+         %65 = OpLabel
+               OpBranch %48
+         %63 = OpLabel
+         %66 = OpLoad %int %i
+         %68 = OpAccessChain %_ptr_Private_int %data %66
+         %69 = OpLoad %int %68
+         %70 = OpLoad %int %j
+         %71 = OpAccessChain %_ptr_Private_int %data %70
+         %72 = OpLoad %int %71
+         %73 = OpSLessThan %bool %69 %72
+               OpSelectionMerge %74 None
+               OpBranchConditional %73 %75 %76
+         %75 = OpLabel
+         %77 = OpLoad %int %k
+         %78 = OpIAdd %int %77 %int_1
+               OpStore %k %78
+         %79 = OpLoad %int %i
+         %80 = OpIAdd %int %79 %int_1
+               OpStore %i %80
+         %81 = OpAccessChain %_ptr_Private_int %data %79
+         %82 = OpLoad %int %81
+         %83 = OpAccessChain %_ptr_Private_int %temp %77
+               OpStore %83 %82
+               OpBranch %74
+         %76 = OpLabel
+         %84 = OpLoad %int %k
+         %85 = OpIAdd %int %84 %int_1
+               OpStore %k %85
+         %86 = OpLoad %int %j
+         %87 = OpIAdd %int %86 %int_1
+               OpStore %j %87
+         %88 = OpAccessChain %_ptr_Private_int %data %86
+         %89 = OpLoad %int %88
+         %90 = OpAccessChain %_ptr_Private_int %temp %84
+               OpStore %90 %89
+               OpBranch %74
+         %74 = OpLabel
+               OpBranch %49
+         %49 = OpLabel
+               OpBranch %47
+         %48 = OpLabel
+               OpBranch %91
+         %91 = OpLabel
+               OpLoopMerge %92 %93 None
+               OpBranch %94
+         %94 = OpLabel
+         %98 = OpFOrdLessThan %bool %float_256 %float_1
+         %95 = OpLogicalNot %bool %98
+               OpSelectionMerge %99 None
+               OpBranchConditional %95 %100 %101
+        %100 = OpLabel
+               OpBranch %99
+        %101 = OpLabel
+               OpBranch %93
+         %99 = OpLabel
+        %102 = OpLoad %int %i
+        %103 = OpLoad %int %i
+        %105 = OpLoad %int %mid
+        %107 = OpSLessThan %bool %102 %int_10
+               OpSelectionMerge %108 None
+               OpBranchConditional %107 %109 %108
+        %109 = OpLabel
+        %110 = OpSLessThanEqual %bool %103 %105
+               OpBranch %108
+        %108 = OpLabel
+        %111 = OpPhi %bool %107 %99 %110 %109
+               OpSelectionMerge %112 None
+               OpBranchConditional %111 %113 %114
+        %113 = OpLabel
+               OpBranch %112
+        %114 = OpLabel
+               OpBranch %92
+        %112 = OpLabel
+        %115 = OpLoad %int %k
+        %116 = OpIAdd %int %115 %int_1
+               OpStore %k %116
+        %117 = OpLoad %int %i
+        %118 = OpIAdd %int %117 %int_1
+               OpStore %i %118
+        %119 = OpAccessChain %_ptr_Private_int %data %117
+        %120 = OpLoad %int %119
+        %121 = OpAccessChain %_ptr_Private_int %temp %115
+               OpStore %121 %120
+               OpBranch %93
+         %93 = OpLabel
+               OpBranch %91
+         %92 = OpLabel
+        %123 = OpLoad %int %from
+               OpStore %i_1 %123
+               OpBranch %124
+        %124 = OpLabel
+               OpLoopMerge %125 %126 None
+               OpBranch %127
+        %127 = OpLabel
+        %128 = OpLoad %int %i_1
+        %130 = OpLoad %int %to
+        %131 = OpSLessThanEqual %bool %128 %130
+               OpSelectionMerge %132 None
+               OpBranchConditional %131 %133 %134
+        %133 = OpLabel
+               OpBranch %132
+        %134 = OpLabel
+               OpBranch %125
+        %132 = OpLabel
+        %135 = OpLoad %int %i_1
+        %136 = OpLoad %int %i_1
+        %137 = OpAccessChain %_ptr_Private_int %temp %136
+        %138 = OpLoad %int %137
+        %139 = OpAccessChain %_ptr_Private_int %data %135
+               OpStore %139 %138
+               OpBranch %126
+        %126 = OpLabel
+        %140 = OpLoad %int %i_1
+        %141 = OpIAdd %int %140 %int_1
+               OpStore %i_1 %141
+               OpBranch %124
+        %125 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %mergeSort_ = OpFunction %void None %142
+        %144 = OpLabel
+        %low = OpVariable %_ptr_Function_int Function %35
+       %high = OpVariable %_ptr_Function_int Function %35
+          %m = OpVariable %_ptr_Function_int Function %35
+        %i_2 = OpVariable %_ptr_Function_int Function %35
+     %from_1 = OpVariable %_ptr_Function_int Function %35
+      %mid_1 = OpVariable %_ptr_Function_int Function %35
+       %to_1 = OpVariable %_ptr_Function_int Function %35
+      %param = OpVariable %_ptr_Function_int Function %35
+    %param_1 = OpVariable %_ptr_Function_int Function %35
+    %param_2 = OpVariable %_ptr_Function_int Function %35
+               OpStore %low %int_0
+               OpStore %high %int_9
+               OpStore %m %int_1
+               OpBranch %157
+        %157 = OpLabel
+               OpLoopMerge %158 %159 None
+               OpBranch %160
+        %160 = OpLabel
+        %161 = OpLoad %int %m
+        %162 = OpLoad %int %high
+        %163 = OpSLessThanEqual %bool %161 %162
+               OpSelectionMerge %164 None
+               OpBranchConditional %163 %165 %166
+        %165 = OpLabel
+               OpBranch %164
+        %166 = OpLabel
+               OpBranch %158
+        %164 = OpLabel
+        %167 = OpLoad %int %low
+               OpStore %i_2 %167
+               OpBranch %168
+        %168 = OpLabel
+               OpLoopMerge %169 %170 None
+               OpBranch %171
+        %171 = OpLabel
+        %172 = OpLoad %int %i_2
+        %173 = OpLoad %int %high
+        %174 = OpSLessThan %bool %172 %173
+               OpSelectionMerge %175 None
+               OpBranchConditional %174 %176 %177
+        %176 = OpLabel
+               OpBranch %175
+        %177 = OpLabel
+               OpBranch %169
+        %175 = OpLabel
+        %178 = OpLoad %int %i_2
+               OpStore %from_1 %178
+        %179 = OpLoad %int %i_2
+        %180 = OpLoad %int %m
+        %181 = OpIAdd %int %179 %180
+        %182 = OpISub %int %181 %int_1
+               OpStore %mid_1 %182
+        %183 = OpLoad %int %i_2
+        %184 = OpLoad %int %m
+        %185 = OpLoad %int %high
+        %189 = OpIMul %int %int_2 %184
+        %190 = OpIAdd %int %183 %189
+        %191 = OpISub %int %190 %int_1
+        %186 = OpExtInst %int %187 SMin %191 %185
+               OpStore %to_1 %186
+        %192 = OpLoad %int %from_1
+               OpStore %param %192
+        %193 = OpLoad %int %mid_1
+               OpStore %param_1 %193
+        %194 = OpLoad %int %to_1
+               OpStore %param_2 %194
+        %195 = OpFunctionCall %void %merge_i1_i1_i1_ %param %param_1 %param_2
+               OpBranch %170
+        %170 = OpLabel
+        %199 = OpLoad %int %m
+        %200 = OpLoad %int %i_2
+        %201 = OpIMul %int %int_2 %199
+        %202 = OpIAdd %int %200 %201
+               OpStore %i_2 %202
+               OpBranch %168
+        %169 = OpLabel
+               OpBranch %159
+        %159 = OpLabel
+        %203 = OpLoad %int %m
+        %204 = OpIMul %int %int_2 %203
+               OpStore %m %204
+               OpBranch %157
+        %158 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %142
+        %206 = OpLabel
+        %i_3 = OpVariable %_ptr_Function_int Function %35
+        %j_1 = OpVariable %_ptr_Function_int Function %35
+       %grey = OpVariable %_ptr_Function_float Function %211
+        %214 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_0
+        %215 = OpLoad %float %214
+        %216 = OpConvertFToS %int %215
+               OpStore %i_3 %216
+               OpBranch %217
+        %217 = OpLabel
+               OpLoopMerge %218 %219 None
+               OpBranch %220
+        %220 = OpLabel
+        %221 = OpLoad %int %i_3
+               OpSelectionMerge %222 None
+               OpSwitch %221 %223 9 %224 8 %225 7 %226 6 %227 5 %228 4 %229 3 %230 2 %231 1 %232 0 %233
+        %224 = OpLabel
+        %234 = OpLoad %int %i_3
+        %235 = OpAccessChain %_ptr_Private_int %data %234
+               OpStore %235 %int_n5
+               OpBranch %222
+        %225 = OpLabel
+        %237 = OpLoad %int %i_3
+        %238 = OpAccessChain %_ptr_Private_int %data %237
+               OpStore %238 %int_n4
+               OpBranch %222
+        %226 = OpLabel
+        %240 = OpLoad %int %i_3
+        %241 = OpAccessChain %_ptr_Private_int %data %240
+               OpStore %241 %int_n3
+               OpBranch %222
+        %227 = OpLabel
+        %243 = OpLoad %int %i_3
+        %244 = OpAccessChain %_ptr_Private_int %data %243
+               OpStore %244 %int_n2
+               OpBranch %222
+        %228 = OpLabel
+        %246 = OpLoad %int %i_3
+        %247 = OpAccessChain %_ptr_Private_int %data %246
+               OpStore %247 %int_n1
+               OpBranch %222
+        %229 = OpLabel
+        %249 = OpLoad %int %i_3
+        %250 = OpAccessChain %_ptr_Private_int %data %249
+               OpStore %250 %int_0
+               OpBranch %222
+        %230 = OpLabel
+        %251 = OpLoad %int %i_3
+        %252 = OpAccessChain %_ptr_Private_int %data %251
+               OpStore %252 %int_1
+               OpBranch %222
+        %231 = OpLabel
+        %253 = OpLoad %int %i_3
+        %254 = OpAccessChain %_ptr_Private_int %data %253
+               OpStore %254 %int_2
+               OpBranch %222
+        %232 = OpLabel
+        %255 = OpLoad %int %i_3
+        %256 = OpAccessChain %_ptr_Private_int %data %255
+               OpStore %256 %int_3
+               OpBranch %222
+        %233 = OpLabel
+        %258 = OpLoad %int %i_3
+        %259 = OpAccessChain %_ptr_Private_int %data %258
+               OpStore %259 %int_4
+               OpBranch %222
+        %223 = OpLabel
+               OpBranch %222
+        %222 = OpLabel
+        %261 = OpLoad %int %i_3
+        %262 = OpIAdd %int %261 %int_1
+               OpStore %i_3 %262
+               OpBranch %219
+        %219 = OpLabel
+        %263 = OpLoad %int %i_3
+        %264 = OpSLessThan %bool %263 %int_10
+               OpSelectionMerge %265 None
+               OpBranchConditional %264 %266 %267
+        %266 = OpLabel
+               OpBranch %265
+        %267 = OpLabel
+               OpBranch %218
+        %265 = OpLabel
+               OpBranch %217
+        %218 = OpLabel
+               OpStore %j_1 %int_0
+               OpBranch %268
+        %268 = OpLabel
+               OpLoopMerge %269 %270 None
+               OpBranch %271
+        %271 = OpLabel
+        %272 = OpLoad %int %j_1
+        %273 = OpSLessThan %bool %272 %int_10
+               OpSelectionMerge %274 None
+               OpBranchConditional %273 %275 %276
+        %275 = OpLabel
+               OpBranch %274
+        %276 = OpLabel
+               OpBranch %269
+        %274 = OpLabel
+        %277 = OpLoad %int %j_1
+        %278 = OpLoad %int %j_1
+        %279 = OpAccessChain %_ptr_Private_int %data %278
+        %280 = OpLoad %int %279
+        %281 = OpAccessChain %_ptr_Private_int %temp %277
+               OpStore %281 %280
+               OpBranch %270
+        %270 = OpLabel
+        %282 = OpLoad %int %j_1
+        %283 = OpIAdd %int %282 %int_1
+               OpStore %j_1 %283
+               OpBranch %268
+        %269 = OpLabel
+        %284 = OpFunctionCall %void %mergeSort_
+        %287 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %288 = OpLoad %float %287
+        %289 = OpConvertFToS %int %288
+        %291 = OpSLessThan %bool %289 %int_30
+               OpSelectionMerge %292 None
+               OpBranchConditional %291 %293 %294
+        %293 = OpLabel
+        %295 = OpAccessChain %_ptr_Private_int %data %int_0
+        %296 = OpLoad %int %295
+        %298 = OpConvertSToF %float %296
+        %300 = OpFDiv %float %298 %float_10
+        %301 = OpFAdd %float %float_0_5 %300
+               OpStore %grey %301
+               OpBranch %292
+        %294 = OpLabel
+        %302 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %303 = OpLoad %float %302
+        %304 = OpConvertFToS %int %303
+        %306 = OpSLessThan %bool %304 %int_60
+               OpSelectionMerge %307 None
+               OpBranchConditional %306 %308 %309
+        %308 = OpLabel
+        %310 = OpAccessChain %_ptr_Private_int %data %int_1
+        %311 = OpLoad %int %310
+        %312 = OpConvertSToF %float %311
+        %313 = OpFDiv %float %312 %float_10
+        %314 = OpFAdd %float %float_0_5 %313
+               OpStore %grey %314
+               OpBranch %307
+        %309 = OpLabel
+        %315 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %316 = OpLoad %float %315
+        %317 = OpConvertFToS %int %316
+        %319 = OpSLessThan %bool %317 %int_90
+               OpSelectionMerge %320 None
+               OpBranchConditional %319 %321 %322
+        %321 = OpLabel
+        %323 = OpAccessChain %_ptr_Private_int %data %int_2
+        %324 = OpLoad %int %323
+        %325 = OpConvertSToF %float %324
+        %326 = OpFDiv %float %325 %float_10
+        %327 = OpFAdd %float %float_0_5 %326
+               OpStore %grey %327
+               OpBranch %320
+        %322 = OpLabel
+        %328 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %329 = OpLoad %float %328
+        %330 = OpConvertFToS %int %329
+        %332 = OpSLessThan %bool %330 %int_120
+               OpSelectionMerge %333 None
+               OpBranchConditional %332 %334 %335
+        %334 = OpLabel
+        %336 = OpAccessChain %_ptr_Private_int %data %int_3
+        %337 = OpLoad %int %336
+        %338 = OpConvertSToF %float %337
+        %339 = OpFDiv %float %338 %float_10
+        %340 = OpFAdd %float %float_0_5 %339
+               OpStore %grey %340
+               OpBranch %333
+        %335 = OpLabel
+        %341 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %342 = OpLoad %float %341
+        %343 = OpConvertFToS %int %342
+        %345 = OpSLessThan %bool %343 %int_150
+               OpSelectionMerge %346 None
+               OpBranchConditional %345 %347 %348
+        %347 = OpLabel
+               OpKill
+        %348 = OpLabel
+        %349 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %350 = OpLoad %float %349
+        %351 = OpConvertFToS %int %350
+        %353 = OpSLessThan %bool %351 %int_180
+               OpSelectionMerge %354 None
+               OpBranchConditional %353 %355 %356
+        %355 = OpLabel
+        %358 = OpAccessChain %_ptr_Private_int %data %int_5
+        %359 = OpLoad %int %358
+        %360 = OpConvertSToF %float %359
+        %361 = OpFDiv %float %360 %float_10
+        %362 = OpFAdd %float %float_0_5 %361
+               OpStore %grey %362
+               OpBranch %354
+        %356 = OpLabel
+        %363 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %364 = OpLoad %float %363
+        %365 = OpConvertFToS %int %364
+        %367 = OpSLessThan %bool %365 %int_210
+               OpSelectionMerge %368 None
+               OpBranchConditional %367 %369 %370
+        %369 = OpLabel
+        %372 = OpAccessChain %_ptr_Private_int %data %int_6
+        %373 = OpLoad %int %372
+        %374 = OpConvertSToF %float %373
+        %375 = OpFDiv %float %374 %float_10
+        %376 = OpFAdd %float %float_0_5 %375
+               OpStore %grey %376
+               OpBranch %368
+        %370 = OpLabel
+        %377 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %378 = OpLoad %float %377
+        %379 = OpConvertFToS %int %378
+        %381 = OpSLessThan %bool %379 %int_240
+               OpSelectionMerge %382 None
+               OpBranchConditional %381 %383 %384
+        %383 = OpLabel
+        %386 = OpAccessChain %_ptr_Private_int %data %int_7
+        %387 = OpLoad %int %386
+        %388 = OpConvertSToF %float %387
+        %389 = OpFDiv %float %388 %float_10
+        %390 = OpFAdd %float %float_0_5 %389
+               OpStore %grey %390
+               OpBranch %382
+        %384 = OpLabel
+        %391 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %392 = OpLoad %float %391
+        %393 = OpConvertFToS %int %392
+        %395 = OpSLessThan %bool %393 %int_270
+               OpSelectionMerge %396 None
+               OpBranchConditional %395 %397 %398
+        %397 = OpLabel
+        %400 = OpAccessChain %_ptr_Private_int %data %int_8
+        %401 = OpLoad %int %400
+        %402 = OpConvertSToF %float %401
+        %403 = OpFDiv %float %402 %float_10
+        %404 = OpFAdd %float %float_0_5 %403
+               OpStore %grey %404
+               OpBranch %396
+        %398 = OpLabel
+               OpKill
+        %396 = OpLabel
+               OpBranch %382
+        %382 = OpLabel
+               OpBranch %368
+        %368 = OpLabel
+               OpBranch %354
+        %354 = OpLabel
+               OpBranch %346
+        %346 = OpLabel
+               OpBranch %333
+        %333 = OpLabel
+               OpBranch %320
+        %320 = OpLabel
+               OpBranch %307
+        %307 = OpLabel
+               OpBranch %292
+        %292 = OpLabel
+        %405 = OpLoad %float %grey
+        %407 = OpCompositeConstruct %v3float %405 %405 %405
+        %408 = OpCompositeExtract %float %407 0
+        %409 = OpCompositeExtract %float %407 1
+        %410 = OpCompositeExtract %float %407 2
+        %411 = OpCompositeConstruct %v4float %408 %409 %410 %float_1
+               OpStore %x_GLF_color %411
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %412
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %416 = OpLabel
+        %417 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %417
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %142
+        %419 = OpLabel
+        %420 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %420
+        %421 = OpFunctionCall %void %main_1
+        %423 = OpLoad %v4float %x_GLF_color
+        %424 = OpCompositeConstruct %main_out %423
+        %422 = OpFunctionCall %void %tint_symbol_3 %424
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 219[%219] is not post dominated by the back-edge block 265[%265]
+  %265 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block3/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block3/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..b26ac12
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block3/1.wgsl.expected.wgsl
@@ -0,0 +1,317 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[block]]
+struct buf1 {
+  resolution : vec2<f32>;
+};
+
+var<private> data : array<i32, 10>;
+
+var<private> temp : array<i32, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_32 : buf1;
+
+fn merge_i1_i1_i1_(from : ptr<function, i32>, mid : ptr<function, i32>, to : ptr<function, i32>) {
+  var k : i32;
+  var i : i32;
+  var j : i32;
+  var i_1 : i32;
+  let x_256 : i32 = *(from);
+  k = x_256;
+  let x_257 : i32 = *(from);
+  i = x_257;
+  let x_258 : i32 = *(mid);
+  j = (x_258 + 1);
+  loop {
+    let x_264 : i32 = i;
+    let x_265 : i32 = *(mid);
+    let x_267 : i32 = j;
+    let x_268 : i32 = *(to);
+    if (((x_264 <= x_265) && (x_267 <= x_268))) {
+    } else {
+      break;
+    }
+    let x_272 : i32 = i;
+    let x_274 : i32 = data[x_272];
+    let x_275 : i32 = j;
+    let x_277 : i32 = data[x_275];
+    if ((x_274 < x_277)) {
+      let x_282 : i32 = k;
+      k = (x_282 + 1);
+      let x_284 : i32 = i;
+      i = (x_284 + 1);
+      let x_287 : i32 = data[x_284];
+      temp[x_282] = x_287;
+    } else {
+      let x_289 : i32 = k;
+      k = (x_289 + 1);
+      let x_291 : i32 = j;
+      j = (x_291 + 1);
+      let x_294 : i32 = data[x_291];
+      temp[x_289] = x_294;
+    }
+  }
+  loop {
+    if (!((256.0 < 1.0))) {
+    } else {
+      continue;
+    }
+    let x_301 : i32 = i;
+    let x_303 : i32 = i;
+    let x_304 : i32 = *(mid);
+    if (((x_301 < 10) && (x_303 <= x_304))) {
+    } else {
+      break;
+    }
+    let x_309 : i32 = k;
+    k = (x_309 + 1);
+    let x_311 : i32 = i;
+    i = (x_311 + 1);
+    let x_314 : i32 = data[x_311];
+    temp[x_309] = x_314;
+  }
+  let x_316 : i32 = *(from);
+  i_1 = x_316;
+  loop {
+    let x_321 : i32 = i_1;
+    let x_322 : i32 = *(to);
+    if ((x_321 <= x_322)) {
+    } else {
+      break;
+    }
+    let x_325 : i32 = i_1;
+    let x_326 : i32 = i_1;
+    let x_328 : i32 = temp[x_326];
+    data[x_325] = x_328;
+
+    continuing {
+      let x_330 : i32 = i_1;
+      i_1 = (x_330 + 1);
+    }
+  }
+  return;
+}
+
+fn mergeSort_() {
+  var low : i32;
+  var high : i32;
+  var m : i32;
+  var i_2 : i32;
+  var from_1 : i32;
+  var mid_1 : i32;
+  var to_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  low = 0;
+  high = 9;
+  m = 1;
+  loop {
+    let x_337 : i32 = m;
+    let x_338 : i32 = high;
+    if ((x_337 <= x_338)) {
+    } else {
+      break;
+    }
+    let x_341 : i32 = low;
+    i_2 = x_341;
+    loop {
+      let x_346 : i32 = i_2;
+      let x_347 : i32 = high;
+      if ((x_346 < x_347)) {
+      } else {
+        break;
+      }
+      let x_350 : i32 = i_2;
+      from_1 = x_350;
+      let x_351 : i32 = i_2;
+      let x_352 : i32 = m;
+      mid_1 = ((x_351 + x_352) - 1);
+      let x_355 : i32 = i_2;
+      let x_356 : i32 = m;
+      let x_360 : i32 = high;
+      to_1 = min(((x_355 + (2 * x_356)) - 1), x_360);
+      let x_362 : i32 = from_1;
+      param = x_362;
+      let x_363 : i32 = mid_1;
+      param_1 = x_363;
+      let x_364 : i32 = to_1;
+      param_2 = x_364;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2));
+
+      continuing {
+        let x_366 : i32 = m;
+        let x_368 : i32 = i_2;
+        i_2 = (x_368 + (2 * x_366));
+      }
+    }
+
+    continuing {
+      let x_370 : i32 = m;
+      m = (2 * x_370);
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_3 : i32;
+  var j_1 : i32;
+  var grey : f32;
+  let x_89 : f32 = x_28.injectionSwitch.x;
+  i_3 = i32(x_89);
+  loop {
+    let x_95 : i32 = i_3;
+    switch(x_95) {
+      case 9: {
+        let x_125 : i32 = i_3;
+        data[x_125] = -5;
+      }
+      case 8: {
+        let x_123 : i32 = i_3;
+        data[x_123] = -4;
+      }
+      case 7: {
+        let x_121 : i32 = i_3;
+        data[x_121] = -3;
+      }
+      case 6: {
+        let x_119 : i32 = i_3;
+        data[x_119] = -2;
+      }
+      case 5: {
+        let x_117 : i32 = i_3;
+        data[x_117] = -1;
+      }
+      case 4: {
+        let x_115 : i32 = i_3;
+        data[x_115] = 0;
+      }
+      case 3: {
+        let x_113 : i32 = i_3;
+        data[x_113] = 1;
+      }
+      case 2: {
+        let x_111 : i32 = i_3;
+        data[x_111] = 2;
+      }
+      case 1: {
+        let x_109 : i32 = i_3;
+        data[x_109] = 3;
+      }
+      case 0: {
+        let x_107 : i32 = i_3;
+        data[x_107] = 4;
+      }
+      default: {
+      }
+    }
+    let x_127 : i32 = i_3;
+    i_3 = (x_127 + 1);
+
+    continuing {
+      let x_129 : i32 = i_3;
+      if ((x_129 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  loop {
+    let x_135 : i32 = j_1;
+    if ((x_135 < 10)) {
+    } else {
+      break;
+    }
+    let x_138 : i32 = j_1;
+    let x_139 : i32 = j_1;
+    let x_141 : i32 = data[x_139];
+    temp[x_138] = x_141;
+
+    continuing {
+      let x_143 : i32 = j_1;
+      j_1 = (x_143 + 1);
+    }
+  }
+  mergeSort_();
+  let x_147 : f32 = gl_FragCoord.y;
+  if ((i32(x_147) < 30)) {
+    let x_154 : i32 = data[0];
+    grey = (0.5 + (f32(x_154) / 10.0));
+  } else {
+    let x_159 : f32 = gl_FragCoord.y;
+    if ((i32(x_159) < 60)) {
+      let x_166 : i32 = data[1];
+      grey = (0.5 + (f32(x_166) / 10.0));
+    } else {
+      let x_171 : f32 = gl_FragCoord.y;
+      if ((i32(x_171) < 90)) {
+        let x_178 : i32 = data[2];
+        grey = (0.5 + (f32(x_178) / 10.0));
+      } else {
+        let x_183 : f32 = gl_FragCoord.y;
+        if ((i32(x_183) < 120)) {
+          let x_190 : i32 = data[3];
+          grey = (0.5 + (f32(x_190) / 10.0));
+        } else {
+          let x_195 : f32 = gl_FragCoord.y;
+          if ((i32(x_195) < 150)) {
+            discard;
+          } else {
+            let x_202 : f32 = gl_FragCoord.y;
+            if ((i32(x_202) < 180)) {
+              let x_209 : i32 = data[5];
+              grey = (0.5 + (f32(x_209) / 10.0));
+            } else {
+              let x_214 : f32 = gl_FragCoord.y;
+              if ((i32(x_214) < 210)) {
+                let x_221 : i32 = data[6];
+                grey = (0.5 + (f32(x_221) / 10.0));
+              } else {
+                let x_226 : f32 = gl_FragCoord.y;
+                if ((i32(x_226) < 240)) {
+                  let x_233 : i32 = data[7];
+                  grey = (0.5 + (f32(x_233) / 10.0));
+                } else {
+                  let x_238 : f32 = gl_FragCoord.y;
+                  if ((i32(x_238) < 270)) {
+                    let x_245 : i32 = data[8];
+                    grey = (0.5 + (f32(x_245) / 10.0));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  let x_249 : f32 = grey;
+  let x_250 : vec3<f32> = vec3<f32>(x_249, x_249, x_249);
+  x_GLF_color = vec4<f32>(x_250.x, x_250.y, x_250.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-load-from-frag-color/1.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-load-from-frag-color/1.spvasm
new file mode 100644
index 0000000..682080c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-load-from-frag-color/1.spvasm
@@ -0,0 +1,695 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %BST "BST"
+               OpMemberName %BST 0 "data"
+               OpMemberName %BST 1 "leftIndex"
+               OpMemberName %BST 2 "rightIndex"
+               OpName %tree "tree"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+        %BST = OpTypeStruct %int %int %int
+%_ptr_Function_BST = OpTypePointer Function %BST
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+     %int_n1 = OpConstant %int -1
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_BST_uint_10 = OpTypeArray %BST %uint_10
+      %int_9 = OpConstant %int 9
+      %int_5 = OpConstant %int 5
+     %int_12 = OpConstant %int 12
+     %int_15 = OpConstant %int 15
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+      %int_6 = OpConstant %int 6
+     %int_17 = OpConstant %int 17
+     %int_13 = OpConstant %int 13
+     %int_20 = OpConstant %int 20
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %34 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %35 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+     %uint_0 = OpConstant %uint 0
+      %false = OpConstantFalse %bool
+       %true = OpConstantTrue %bool
+%_ptr_Function__arr_BST_uint_10 = OpTypePointer Function %_arr_BST_uint_10
+         %40 = OpUndef %int
+         %41 = OpConstantComposite %BST %int_9 %int_n1 %int_n1
+         %42 = OpConstantComposite %BST %int_5 %int_n1 %int_n1
+         %43 = OpConstantComposite %BST %int_12 %int_n1 %int_n1
+      %int_3 = OpConstant %int 3
+         %45 = OpConstantComposite %BST %int_15 %int_n1 %int_n1
+      %int_4 = OpConstant %int 4
+         %47 = OpConstantComposite %BST %int_7 %int_n1 %int_n1
+         %48 = OpConstantComposite %BST %int_8 %int_n1 %int_n1
+         %49 = OpConstantComposite %BST %int_2 %int_n1 %int_n1
+         %50 = OpConstantComposite %BST %int_6 %int_n1 %int_n1
+         %51 = OpConstantComposite %BST %int_17 %int_n1 %int_n1
+         %52 = OpConstantComposite %BST %int_13 %int_n1 %int_n1
+   %int_15_0 = OpConstant %int 15
+    %int_6_0 = OpConstant %int 6
+     %uint_3 = OpConstant %uint 3
+%_ptr_Output_float = OpTypePointer Output %float
+       %main = OpFunction %void None %7
+         %57 = OpLabel
+       %tree = OpVariable %_ptr_Function__arr_BST_uint_10 Function
+         %58 = OpAccessChain %_ptr_Function_BST %tree %int_0
+               OpStore %58 %41
+               OpSelectionMerge %59 None
+               OpSwitch %uint_0 %60
+         %60 = OpLabel
+               OpBranch %61
+         %61 = OpLabel
+         %62 = OpPhi %int %int_0 %60 %63 %64
+         %65 = OpSLessThanEqual %bool %62 %int_1
+               OpLoopMerge %66 %64 None
+               OpBranchConditional %65 %67 %66
+         %67 = OpLabel
+         %68 = OpAccessChain %_ptr_Function_int %tree %62 %int_0
+         %69 = OpLoad %int %68
+         %70 = OpSLessThanEqual %bool %int_5 %69
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %73
+         %73 = OpLabel
+         %74 = OpAccessChain %_ptr_Function_int %tree %62 %int_2
+         %75 = OpLoad %int %74
+         %76 = OpIEqual %bool %75 %int_n1
+               OpSelectionMerge %77 None
+               OpBranchConditional %76 %78 %79
+         %79 = OpLabel
+         %80 = OpLoad %int %74
+               OpBranch %64
+         %78 = OpLabel
+               OpStore %74 %int_1
+         %81 = OpAccessChain %_ptr_Function_BST %tree %int_1
+               OpStore %81 %42
+               OpBranch %66
+         %77 = OpLabel
+               OpUnreachable
+         %72 = OpLabel
+         %82 = OpAccessChain %_ptr_Function_int %tree %62 %int_1
+         %83 = OpLoad %int %82
+         %84 = OpIEqual %bool %83 %int_n1
+               OpSelectionMerge %85 None
+               OpBranchConditional %84 %86 %87
+         %87 = OpLabel
+         %88 = OpLoad %int %82
+               OpBranch %64
+         %86 = OpLabel
+               OpStore %82 %int_1
+         %89 = OpAccessChain %_ptr_Function_BST %tree %int_1
+               OpStore %89 %42
+               OpBranch %66
+         %85 = OpLabel
+               OpUnreachable
+         %71 = OpLabel
+               OpUnreachable
+         %64 = OpLabel
+         %63 = OpPhi %int %80 %79 %88 %87
+               OpBranch %61
+         %66 = OpLabel
+         %90 = OpPhi %bool %false %61 %true %78 %true %86
+               OpSelectionMerge %91 None
+               OpBranchConditional %90 %59 %91
+         %91 = OpLabel
+               OpBranch %59
+         %59 = OpLabel
+               OpSelectionMerge %92 None
+               OpSwitch %uint_0 %93
+         %93 = OpLabel
+               OpBranch %94
+         %94 = OpLabel
+         %95 = OpPhi %int %int_0 %93 %96 %97
+         %98 = OpSLessThanEqual %bool %95 %int_2
+               OpLoopMerge %99 %97 None
+               OpBranchConditional %98 %100 %99
+        %100 = OpLabel
+        %101 = OpAccessChain %_ptr_Function_int %tree %95 %int_0
+        %102 = OpLoad %int %101
+        %103 = OpSLessThanEqual %bool %int_12 %102
+               OpSelectionMerge %104 None
+               OpBranchConditional %103 %105 %106
+        %106 = OpLabel
+        %107 = OpAccessChain %_ptr_Function_int %tree %95 %int_2
+        %108 = OpLoad %int %107
+        %109 = OpIEqual %bool %108 %int_n1
+               OpSelectionMerge %110 None
+               OpBranchConditional %109 %111 %112
+        %112 = OpLabel
+        %113 = OpLoad %int %107
+               OpBranch %97
+        %111 = OpLabel
+               OpStore %107 %int_2
+        %114 = OpAccessChain %_ptr_Function_BST %tree %int_2
+               OpStore %114 %43
+               OpBranch %99
+        %110 = OpLabel
+               OpUnreachable
+        %105 = OpLabel
+        %115 = OpAccessChain %_ptr_Function_int %tree %95 %int_1
+        %116 = OpLoad %int %115
+        %117 = OpIEqual %bool %116 %int_n1
+               OpSelectionMerge %118 None
+               OpBranchConditional %117 %119 %120
+        %120 = OpLabel
+        %121 = OpLoad %int %115
+               OpBranch %97
+        %119 = OpLabel
+               OpStore %115 %int_2
+        %122 = OpAccessChain %_ptr_Function_BST %tree %int_2
+               OpStore %122 %43
+               OpBranch %99
+        %118 = OpLabel
+               OpUnreachable
+        %104 = OpLabel
+               OpUnreachable
+         %97 = OpLabel
+         %96 = OpPhi %int %113 %112 %121 %120
+               OpBranch %94
+         %99 = OpLabel
+        %123 = OpPhi %bool %false %94 %true %111 %true %119
+               OpSelectionMerge %124 None
+               OpBranchConditional %123 %92 %124
+        %124 = OpLabel
+               OpBranch %92
+         %92 = OpLabel
+               OpSelectionMerge %125 None
+               OpSwitch %uint_0 %126
+        %126 = OpLabel
+               OpBranch %127
+        %127 = OpLabel
+        %128 = OpPhi %int %int_0 %126 %129 %130
+        %131 = OpSLessThanEqual %bool %128 %int_3
+               OpLoopMerge %132 %130 None
+               OpBranchConditional %131 %133 %132
+        %133 = OpLabel
+        %134 = OpAccessChain %_ptr_Function_int %tree %128 %int_0
+        %135 = OpLoad %int %134
+        %136 = OpSLessThanEqual %bool %int_15 %135
+               OpSelectionMerge %137 None
+               OpBranchConditional %136 %138 %139
+        %139 = OpLabel
+        %140 = OpAccessChain %_ptr_Function_int %tree %128 %int_2
+        %141 = OpLoad %int %140
+        %142 = OpIEqual %bool %141 %int_n1
+               OpSelectionMerge %143 None
+               OpBranchConditional %142 %144 %145
+        %145 = OpLabel
+        %146 = OpLoad %int %140
+               OpBranch %130
+        %144 = OpLabel
+               OpStore %140 %int_3
+        %147 = OpAccessChain %_ptr_Function_BST %tree %int_3
+               OpStore %147 %45
+               OpBranch %132
+        %143 = OpLabel
+               OpUnreachable
+        %138 = OpLabel
+        %148 = OpAccessChain %_ptr_Function_int %tree %128 %int_1
+        %149 = OpLoad %int %148
+        %150 = OpIEqual %bool %149 %int_n1
+               OpSelectionMerge %151 None
+               OpBranchConditional %150 %152 %153
+        %153 = OpLabel
+        %154 = OpLoad %int %148
+               OpBranch %130
+        %152 = OpLabel
+               OpStore %148 %int_3
+        %155 = OpAccessChain %_ptr_Function_BST %tree %int_3
+               OpStore %155 %45
+               OpBranch %132
+        %151 = OpLabel
+               OpUnreachable
+        %137 = OpLabel
+               OpUnreachable
+        %130 = OpLabel
+        %129 = OpPhi %int %146 %145 %154 %153
+               OpBranch %127
+        %132 = OpLabel
+        %156 = OpPhi %bool %false %127 %true %144 %true %152
+               OpSelectionMerge %157 None
+               OpBranchConditional %156 %125 %157
+        %157 = OpLabel
+               OpBranch %125
+        %125 = OpLabel
+               OpSelectionMerge %158 None
+               OpSwitch %uint_0 %159
+        %159 = OpLabel
+               OpBranch %160
+        %160 = OpLabel
+        %161 = OpPhi %int %int_0 %159 %162 %163
+        %164 = OpSLessThanEqual %bool %161 %int_4
+               OpLoopMerge %165 %163 None
+               OpBranchConditional %164 %166 %165
+        %166 = OpLabel
+        %167 = OpAccessChain %_ptr_Function_int %tree %161 %int_0
+        %168 = OpLoad %int %167
+        %169 = OpSLessThanEqual %bool %int_7 %168
+               OpSelectionMerge %170 None
+               OpBranchConditional %169 %171 %172
+        %172 = OpLabel
+        %173 = OpAccessChain %_ptr_Function_int %tree %161 %int_2
+        %174 = OpLoad %int %173
+        %175 = OpIEqual %bool %174 %int_n1
+               OpSelectionMerge %176 None
+               OpBranchConditional %175 %177 %178
+        %178 = OpLabel
+        %179 = OpLoad %int %173
+               OpBranch %163
+        %177 = OpLabel
+               OpStore %173 %int_4
+        %180 = OpAccessChain %_ptr_Function_BST %tree %int_4
+               OpStore %180 %47
+               OpBranch %165
+        %176 = OpLabel
+               OpUnreachable
+        %171 = OpLabel
+        %181 = OpAccessChain %_ptr_Function_int %tree %161 %int_1
+        %182 = OpLoad %int %181
+        %183 = OpIEqual %bool %182 %int_n1
+               OpSelectionMerge %184 None
+               OpBranchConditional %183 %185 %186
+        %186 = OpLabel
+        %187 = OpLoad %int %181
+               OpBranch %163
+        %185 = OpLabel
+               OpStore %181 %int_4
+        %188 = OpAccessChain %_ptr_Function_BST %tree %int_4
+               OpStore %188 %47
+               OpBranch %165
+        %184 = OpLabel
+               OpUnreachable
+        %170 = OpLabel
+               OpUnreachable
+        %163 = OpLabel
+        %162 = OpPhi %int %179 %178 %187 %186
+               OpBranch %160
+        %165 = OpLabel
+        %189 = OpPhi %bool %false %160 %true %177 %true %185
+               OpSelectionMerge %190 None
+               OpBranchConditional %189 %158 %190
+        %190 = OpLabel
+               OpBranch %158
+        %158 = OpLabel
+               OpSelectionMerge %191 None
+               OpSwitch %uint_0 %192
+        %192 = OpLabel
+               OpBranch %193
+        %193 = OpLabel
+        %194 = OpPhi %int %int_0 %192 %195 %196
+        %197 = OpSLessThanEqual %bool %194 %int_5
+               OpLoopMerge %198 %196 None
+               OpBranchConditional %197 %199 %198
+        %199 = OpLabel
+        %200 = OpAccessChain %_ptr_Function_int %tree %194 %int_0
+        %201 = OpLoad %int %200
+        %202 = OpSLessThanEqual %bool %int_8 %201
+               OpSelectionMerge %203 None
+               OpBranchConditional %202 %204 %205
+        %205 = OpLabel
+        %206 = OpAccessChain %_ptr_Function_int %tree %194 %int_2
+        %207 = OpLoad %int %206
+        %208 = OpIEqual %bool %207 %int_n1
+               OpSelectionMerge %209 None
+               OpBranchConditional %208 %210 %211
+        %211 = OpLabel
+        %212 = OpLoad %int %206
+               OpBranch %196
+        %210 = OpLabel
+               OpStore %206 %int_5
+        %213 = OpAccessChain %_ptr_Function_BST %tree %int_5
+               OpStore %213 %48
+               OpBranch %198
+        %209 = OpLabel
+               OpUnreachable
+        %204 = OpLabel
+        %214 = OpAccessChain %_ptr_Function_int %tree %194 %int_1
+        %215 = OpLoad %int %214
+        %216 = OpIEqual %bool %215 %int_n1
+               OpSelectionMerge %217 None
+               OpBranchConditional %216 %218 %219
+        %219 = OpLabel
+        %220 = OpLoad %int %214
+               OpBranch %196
+        %218 = OpLabel
+               OpStore %214 %int_5
+        %221 = OpAccessChain %_ptr_Function_BST %tree %int_5
+               OpStore %221 %48
+               OpBranch %198
+        %217 = OpLabel
+               OpUnreachable
+        %203 = OpLabel
+               OpUnreachable
+        %196 = OpLabel
+        %195 = OpPhi %int %212 %211 %220 %219
+               OpBranch %193
+        %198 = OpLabel
+        %222 = OpPhi %bool %false %193 %true %210 %true %218
+               OpSelectionMerge %223 None
+               OpBranchConditional %222 %191 %223
+        %223 = OpLabel
+               OpBranch %191
+        %191 = OpLabel
+               OpSelectionMerge %224 None
+               OpSwitch %uint_0 %225
+        %225 = OpLabel
+               OpBranch %226
+        %226 = OpLabel
+        %227 = OpPhi %int %int_0 %225 %228 %229
+        %230 = OpSLessThanEqual %bool %227 %int_6
+               OpLoopMerge %231 %229 None
+               OpBranchConditional %230 %232 %231
+        %232 = OpLabel
+        %233 = OpAccessChain %_ptr_Function_int %tree %227 %int_0
+        %234 = OpLoad %int %233
+        %235 = OpSLessThanEqual %bool %int_2 %234
+               OpSelectionMerge %236 None
+               OpBranchConditional %235 %237 %238
+        %238 = OpLabel
+        %239 = OpAccessChain %_ptr_Function_int %tree %227 %int_2
+        %240 = OpLoad %int %239
+        %241 = OpIEqual %bool %240 %int_n1
+               OpSelectionMerge %242 None
+               OpBranchConditional %241 %243 %244
+        %244 = OpLabel
+        %245 = OpLoad %int %239
+               OpBranch %229
+        %243 = OpLabel
+               OpStore %239 %int_6
+        %246 = OpAccessChain %_ptr_Function_BST %tree %int_6
+               OpStore %246 %49
+               OpBranch %231
+        %242 = OpLabel
+               OpUnreachable
+        %237 = OpLabel
+        %247 = OpAccessChain %_ptr_Function_int %tree %227 %int_1
+        %248 = OpLoad %int %247
+        %249 = OpIEqual %bool %248 %int_n1
+               OpSelectionMerge %250 None
+               OpBranchConditional %249 %251 %252
+        %252 = OpLabel
+        %253 = OpLoad %int %247
+               OpBranch %229
+        %251 = OpLabel
+               OpStore %247 %int_6
+        %254 = OpAccessChain %_ptr_Function_BST %tree %int_6
+               OpStore %254 %49
+               OpBranch %231
+        %250 = OpLabel
+               OpUnreachable
+        %236 = OpLabel
+               OpUnreachable
+        %229 = OpLabel
+        %228 = OpPhi %int %245 %244 %253 %252
+               OpBranch %226
+        %231 = OpLabel
+        %255 = OpPhi %bool %false %226 %true %243 %true %251
+               OpSelectionMerge %256 None
+               OpBranchConditional %255 %224 %256
+        %256 = OpLabel
+               OpBranch %224
+        %224 = OpLabel
+               OpSelectionMerge %257 None
+               OpSwitch %uint_0 %258
+        %258 = OpLabel
+               OpBranch %259
+        %259 = OpLabel
+        %260 = OpPhi %int %int_0 %258 %261 %262
+        %263 = OpSLessThanEqual %bool %260 %int_7
+               OpLoopMerge %264 %262 None
+               OpBranchConditional %263 %265 %264
+        %265 = OpLabel
+        %266 = OpAccessChain %_ptr_Function_int %tree %260 %int_0
+        %267 = OpLoad %int %266
+        %268 = OpSLessThanEqual %bool %int_6 %267
+               OpSelectionMerge %269 None
+               OpBranchConditional %268 %270 %271
+        %271 = OpLabel
+        %272 = OpAccessChain %_ptr_Function_int %tree %260 %int_2
+        %273 = OpLoad %int %272
+        %274 = OpIEqual %bool %273 %int_n1
+               OpSelectionMerge %275 None
+               OpBranchConditional %274 %276 %277
+        %277 = OpLabel
+        %278 = OpLoad %int %272
+               OpBranch %262
+        %276 = OpLabel
+               OpStore %272 %int_7
+        %279 = OpAccessChain %_ptr_Function_BST %tree %int_7
+               OpStore %279 %50
+               OpBranch %264
+        %275 = OpLabel
+               OpUnreachable
+        %270 = OpLabel
+        %280 = OpAccessChain %_ptr_Function_int %tree %260 %int_1
+        %281 = OpLoad %int %280
+        %282 = OpIEqual %bool %281 %int_n1
+               OpSelectionMerge %283 None
+               OpBranchConditional %282 %284 %285
+        %285 = OpLabel
+        %286 = OpLoad %int %280
+               OpBranch %262
+        %284 = OpLabel
+               OpStore %280 %int_7
+        %287 = OpAccessChain %_ptr_Function_BST %tree %int_7
+               OpStore %287 %50
+               OpBranch %264
+        %283 = OpLabel
+               OpUnreachable
+        %269 = OpLabel
+               OpUnreachable
+        %262 = OpLabel
+        %261 = OpPhi %int %278 %277 %286 %285
+               OpBranch %259
+        %264 = OpLabel
+        %288 = OpPhi %bool %false %259 %true %276 %true %284
+               OpSelectionMerge %289 None
+               OpBranchConditional %288 %257 %289
+        %289 = OpLabel
+               OpBranch %257
+        %257 = OpLabel
+               OpSelectionMerge %290 None
+               OpSwitch %uint_0 %291
+        %291 = OpLabel
+               OpBranch %292
+        %292 = OpLabel
+        %293 = OpPhi %int %int_0 %291 %294 %295
+        %296 = OpSLessThanEqual %bool %293 %int_8
+               OpLoopMerge %297 %295 None
+               OpBranchConditional %296 %298 %297
+        %298 = OpLabel
+        %299 = OpAccessChain %_ptr_Function_int %tree %293 %int_0
+        %300 = OpLoad %int %299
+        %301 = OpSLessThanEqual %bool %int_17 %300
+               OpSelectionMerge %302 None
+               OpBranchConditional %301 %303 %304
+        %304 = OpLabel
+        %305 = OpAccessChain %_ptr_Function_int %tree %293 %int_2
+        %306 = OpLoad %int %305
+        %307 = OpIEqual %bool %306 %int_n1
+               OpSelectionMerge %308 None
+               OpBranchConditional %307 %309 %310
+        %310 = OpLabel
+        %311 = OpLoad %int %305
+               OpBranch %295
+        %309 = OpLabel
+               OpStore %305 %int_8
+        %312 = OpAccessChain %_ptr_Function_BST %tree %int_8
+               OpStore %312 %51
+               OpBranch %297
+        %308 = OpLabel
+               OpUnreachable
+        %303 = OpLabel
+        %313 = OpAccessChain %_ptr_Function_int %tree %293 %int_1
+        %314 = OpLoad %int %313
+        %315 = OpIEqual %bool %314 %int_n1
+               OpSelectionMerge %316 None
+               OpBranchConditional %315 %317 %318
+        %318 = OpLabel
+        %319 = OpLoad %int %313
+               OpBranch %295
+        %317 = OpLabel
+               OpStore %313 %int_8
+        %320 = OpAccessChain %_ptr_Function_BST %tree %int_8
+               OpStore %320 %51
+               OpBranch %297
+        %316 = OpLabel
+               OpUnreachable
+        %302 = OpLabel
+               OpUnreachable
+        %295 = OpLabel
+        %294 = OpPhi %int %311 %310 %319 %318
+               OpBranch %292
+        %297 = OpLabel
+        %321 = OpPhi %bool %false %292 %true %309 %true %317
+               OpSelectionMerge %322 None
+               OpBranchConditional %321 %290 %322
+        %322 = OpLabel
+               OpBranch %290
+        %290 = OpLabel
+               OpSelectionMerge %323 None
+               OpSwitch %uint_0 %324
+        %324 = OpLabel
+               OpBranch %325
+        %325 = OpLabel
+        %326 = OpPhi %int %int_0 %324 %327 %328
+        %329 = OpSLessThanEqual %bool %326 %int_9
+               OpLoopMerge %330 %328 None
+               OpBranchConditional %329 %331 %330
+        %331 = OpLabel
+        %332 = OpAccessChain %_ptr_Function_int %tree %326 %int_0
+        %333 = OpLoad %int %332
+        %334 = OpSLessThanEqual %bool %int_13 %333
+               OpSelectionMerge %335 None
+               OpBranchConditional %334 %336 %337
+        %337 = OpLabel
+        %338 = OpAccessChain %_ptr_Function_int %tree %326 %int_2
+        %339 = OpLoad %int %338
+        %340 = OpIEqual %bool %339 %int_n1
+               OpSelectionMerge %341 None
+               OpBranchConditional %340 %342 %343
+        %343 = OpLabel
+        %344 = OpLoad %int %338
+               OpBranch %328
+        %342 = OpLabel
+               OpStore %338 %int_9
+        %345 = OpAccessChain %_ptr_Function_BST %tree %int_9
+               OpStore %345 %52
+               OpBranch %330
+        %341 = OpLabel
+               OpUnreachable
+        %336 = OpLabel
+        %346 = OpAccessChain %_ptr_Function_int %tree %326 %int_1
+        %347 = OpLoad %int %346
+        %348 = OpIEqual %bool %347 %int_n1
+               OpSelectionMerge %349 None
+               OpBranchConditional %348 %350 %351
+        %351 = OpLabel
+        %352 = OpLoad %int %346
+               OpBranch %328
+        %350 = OpLabel
+               OpStore %346 %int_9
+        %353 = OpAccessChain %_ptr_Function_BST %tree %int_9
+               OpStore %353 %52
+               OpBranch %330
+        %349 = OpLabel
+               OpUnreachable
+        %335 = OpLabel
+               OpUnreachable
+        %328 = OpLabel
+        %327 = OpPhi %int %344 %343 %352 %351
+               OpBranch %325
+        %330 = OpLabel
+        %354 = OpPhi %bool %false %325 %true %342 %true %350
+               OpSelectionMerge %355 None
+               OpBranchConditional %354 %323 %355
+        %355 = OpLabel
+               OpBranch %323
+        %323 = OpLabel
+               OpBranch %356
+        %356 = OpLabel
+        %357 = OpPhi %int %40 %323 %358 %359
+        %360 = OpPhi %int %int_0 %323 %361 %359
+        %362 = OpPhi %int %int_0 %323 %363 %359
+        %364 = OpSLessThan %bool %362 %int_20
+        %365 = OpISub %int %int_6_0 %int_15_0
+        %366 = OpULessThanEqual %bool %uint_3 %uint_3
+        %367 = OpSelect %uint %366 %uint_3 %uint_3
+        %368 = OpAccessChain %_ptr_Output_float %_GLF_color %367
+               OpLoopMerge %369 %359 None
+               OpBranchConditional %364 %370 %369
+        %370 = OpLabel
+               OpSelectionMerge %371 None
+               OpSwitch %uint_0 %372
+        %372 = OpLabel
+               OpBranch %373
+        %373 = OpLabel
+        %374 = OpPhi %int %int_0 %372 %375 %376
+        %377 = OpINotEqual %bool %374 %int_n1
+               OpLoopMerge %378 %376 None
+               OpBranchConditional %377 %379 %378
+        %379 = OpLabel
+        %380 = OpAccessChain %_ptr_Function_BST %tree %374
+        %381 = OpLoad %BST %380
+        %382 = OpCompositeExtract %int %381 0
+        %383 = OpCompositeExtract %int %381 1
+        %384 = OpInBoundsAccessChain %_ptr_Output_float %368
+        %385 = OpCompositeExtract %int %381 2
+        %386 = OpIEqual %bool %382 %362
+               OpSelectionMerge %387 None
+               OpBranchConditional %386 %388 %387
+        %388 = OpLabel
+               OpBranch %378
+        %387 = OpLabel
+        %389 = OpLoad %float %384
+        %390 = OpSLessThanEqual %bool %362 %382
+        %391 = OpLogicalNot %bool %390
+        %375 = OpSelect %int %391 %385 %383
+               OpBranch %376
+        %376 = OpLabel
+               OpBranch %373
+        %378 = OpLabel
+        %392 = OpPhi %int %357 %373 %362 %388
+        %393 = OpPhi %bool %false %373 %true %388
+               OpSelectionMerge %394 None
+               OpBranchConditional %393 %371 %394
+        %394 = OpLabel
+               OpBranch %371
+        %371 = OpLabel
+        %358 = OpPhi %int %392 %378 %int_n1 %394
+               OpSelectionMerge %395 None
+               OpSwitch %362 %396 9 %397 5 %397 12 %397 15 %397 7 %397 8 %397 2 %397 6 %397 17 %397 13 %397
+        %397 = OpLabel
+        %398 = OpIEqual %bool %358 %362
+               OpSelectionMerge %399 None
+               OpBranchConditional %398 %400 %399
+        %400 = OpLabel
+        %401 = OpIAdd %int %360 %int_1
+               OpBranch %399
+        %399 = OpLabel
+        %402 = OpPhi %int %360 %397 %401 %400
+               OpBranch %395
+        %396 = OpLabel
+        %403 = OpIEqual %bool %358 %int_n1
+               OpSelectionMerge %404 None
+               OpBranchConditional %403 %405 %404
+        %405 = OpLabel
+        %406 = OpIAdd %int %360 %int_1
+               OpBranch %404
+        %404 = OpLabel
+        %407 = OpPhi %int %360 %396 %406 %405
+               OpBranch %395
+        %395 = OpLabel
+        %361 = OpPhi %int %402 %399 %407 %404
+               OpBranch %359
+        %359 = OpLabel
+        %363 = OpIAdd %int %362 %int_1
+               OpBranch %356
+        %369 = OpLabel
+        %408 = OpIEqual %bool %360 %int_20
+               OpSelectionMerge %409 None
+               OpBranchConditional %408 %410 %411
+        %411 = OpLabel
+               OpStore %_GLF_color %35
+               OpBranch %409
+        %410 = OpLabel
+               OpStore %_GLF_color %34
+               OpBranch %409
+        %409 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-load-from-frag-color/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-load-from-frag-color/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..6b3b61f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-load-from-frag-color/1.spvasm.expected.hlsl
@@ -0,0 +1,750 @@
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  BST tree[10] = (BST[10])0;
+  int x_360 = 0;
+  int x_62_phi = 0;
+  bool x_90_phi = false;
+  int x_357_phi = 0;
+  int x_360_phi = 0;
+  int x_362_phi = 0;
+  const BST tint_symbol_2 = {9, -1, -1};
+  tree[0] = tint_symbol_2;
+  switch(0u) {
+    default: {
+      x_62_phi = 0;
+      while (true) {
+        int x_88 = 0;
+        int x_80 = 0;
+        int x_63 = 0;
+        int x_63_phi = 0;
+        const int x_62 = x_62_phi;
+        x_90_phi = false;
+        if ((x_62 <= 1)) {
+        } else {
+          break;
+        }
+        const int x_69 = tree[x_62].data;
+        if ((5 <= x_69)) {
+          const int x_82_save = x_62;
+          const int x_83 = tree[x_82_save].leftIndex;
+          if ((x_83 == -1)) {
+            tree[x_82_save].leftIndex = 1;
+            const BST tint_symbol_3 = {5, -1, -1};
+            tree[1] = tint_symbol_3;
+            x_90_phi = true;
+            break;
+          } else {
+            x_88 = tree[x_82_save].leftIndex;
+            x_63_phi = x_88;
+            {
+              x_63 = x_63_phi;
+              x_62_phi = x_63;
+            }
+            continue;
+          }
+          return;
+        } else {
+          const int x_74_save = x_62;
+          const int x_75 = tree[x_74_save].rightIndex;
+          if ((x_75 == -1)) {
+            tree[x_74_save].rightIndex = 1;
+            const BST tint_symbol_4 = {5, -1, -1};
+            tree[1] = tint_symbol_4;
+            x_90_phi = true;
+            break;
+          } else {
+            x_80 = tree[x_74_save].rightIndex;
+            x_63_phi = x_80;
+            {
+              x_63 = x_63_phi;
+              x_62_phi = x_63;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_63 = x_63_phi;
+          x_62_phi = x_63;
+        }
+      }
+      if (x_90_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_95_phi = 0;
+  bool x_123_phi = false;
+  switch(0u) {
+    default: {
+      x_95_phi = 0;
+      while (true) {
+        int x_121 = 0;
+        int x_113 = 0;
+        int x_96 = 0;
+        int x_96_phi = 0;
+        const int x_95 = x_95_phi;
+        x_123_phi = false;
+        if ((x_95 <= 2)) {
+        } else {
+          break;
+        }
+        const int x_102 = tree[x_95].data;
+        if ((12 <= x_102)) {
+          const int x_115_save = x_95;
+          const int x_116 = tree[x_115_save].leftIndex;
+          if ((x_116 == -1)) {
+            tree[x_115_save].leftIndex = 2;
+            const BST tint_symbol_5 = {12, -1, -1};
+            tree[2] = tint_symbol_5;
+            x_123_phi = true;
+            break;
+          } else {
+            x_121 = tree[x_115_save].leftIndex;
+            x_96_phi = x_121;
+            {
+              x_96 = x_96_phi;
+              x_95_phi = x_96;
+            }
+            continue;
+          }
+          return;
+        } else {
+          const int x_107_save = x_95;
+          const int x_108 = tree[x_107_save].rightIndex;
+          if ((x_108 == -1)) {
+            tree[x_107_save].rightIndex = 2;
+            const BST tint_symbol_6 = {12, -1, -1};
+            tree[2] = tint_symbol_6;
+            x_123_phi = true;
+            break;
+          } else {
+            x_113 = tree[x_107_save].rightIndex;
+            x_96_phi = x_113;
+            {
+              x_96 = x_96_phi;
+              x_95_phi = x_96;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_96 = x_96_phi;
+          x_95_phi = x_96;
+        }
+      }
+      if (x_123_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_128_phi = 0;
+  bool x_156_phi = false;
+  switch(0u) {
+    default: {
+      x_128_phi = 0;
+      while (true) {
+        int x_154 = 0;
+        int x_146 = 0;
+        int x_129 = 0;
+        int x_129_phi = 0;
+        const int x_128 = x_128_phi;
+        x_156_phi = false;
+        if ((x_128 <= 3)) {
+        } else {
+          break;
+        }
+        const int x_135 = tree[x_128].data;
+        if ((15 <= x_135)) {
+          const int x_148_save = x_128;
+          const int x_149 = tree[x_148_save].leftIndex;
+          if ((x_149 == -1)) {
+            tree[x_148_save].leftIndex = 3;
+            const BST tint_symbol_7 = {15, -1, -1};
+            tree[3] = tint_symbol_7;
+            x_156_phi = true;
+            break;
+          } else {
+            x_154 = tree[x_148_save].leftIndex;
+            x_129_phi = x_154;
+            {
+              x_129 = x_129_phi;
+              x_128_phi = x_129;
+            }
+            continue;
+          }
+          return;
+        } else {
+          const int x_140_save = x_128;
+          const int x_141 = tree[x_140_save].rightIndex;
+          if ((x_141 == -1)) {
+            tree[x_140_save].rightIndex = 3;
+            const BST tint_symbol_8 = {15, -1, -1};
+            tree[3] = tint_symbol_8;
+            x_156_phi = true;
+            break;
+          } else {
+            x_146 = tree[x_140_save].rightIndex;
+            x_129_phi = x_146;
+            {
+              x_129 = x_129_phi;
+              x_128_phi = x_129;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_129 = x_129_phi;
+          x_128_phi = x_129;
+        }
+      }
+      if (x_156_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_161_phi = 0;
+  bool x_189_phi = false;
+  switch(0u) {
+    default: {
+      x_161_phi = 0;
+      while (true) {
+        int x_187 = 0;
+        int x_179 = 0;
+        int x_162 = 0;
+        int x_162_phi = 0;
+        const int x_161 = x_161_phi;
+        x_189_phi = false;
+        if ((x_161 <= 4)) {
+        } else {
+          break;
+        }
+        const int x_168 = tree[x_161].data;
+        if ((7 <= x_168)) {
+          const int x_181_save = x_161;
+          const int x_182 = tree[x_181_save].leftIndex;
+          if ((x_182 == -1)) {
+            tree[x_181_save].leftIndex = 4;
+            const BST tint_symbol_9 = {7, -1, -1};
+            tree[4] = tint_symbol_9;
+            x_189_phi = true;
+            break;
+          } else {
+            x_187 = tree[x_181_save].leftIndex;
+            x_162_phi = x_187;
+            {
+              x_162 = x_162_phi;
+              x_161_phi = x_162;
+            }
+            continue;
+          }
+          return;
+        } else {
+          const int x_173_save = x_161;
+          const int x_174 = tree[x_173_save].rightIndex;
+          if ((x_174 == -1)) {
+            tree[x_173_save].rightIndex = 4;
+            const BST tint_symbol_10 = {7, -1, -1};
+            tree[4] = tint_symbol_10;
+            x_189_phi = true;
+            break;
+          } else {
+            x_179 = tree[x_173_save].rightIndex;
+            x_162_phi = x_179;
+            {
+              x_162 = x_162_phi;
+              x_161_phi = x_162;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_162 = x_162_phi;
+          x_161_phi = x_162;
+        }
+      }
+      if (x_189_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_194_phi = 0;
+  bool x_222_phi = false;
+  switch(0u) {
+    default: {
+      x_194_phi = 0;
+      while (true) {
+        int x_220 = 0;
+        int x_212 = 0;
+        int x_195 = 0;
+        int x_195_phi = 0;
+        const int x_194 = x_194_phi;
+        x_222_phi = false;
+        if ((x_194 <= 5)) {
+        } else {
+          break;
+        }
+        const int x_201 = tree[x_194].data;
+        if ((8 <= x_201)) {
+          const int x_214_save = x_194;
+          const int x_215 = tree[x_214_save].leftIndex;
+          if ((x_215 == -1)) {
+            tree[x_214_save].leftIndex = 5;
+            const BST tint_symbol_11 = {8, -1, -1};
+            tree[5] = tint_symbol_11;
+            x_222_phi = true;
+            break;
+          } else {
+            x_220 = tree[x_214_save].leftIndex;
+            x_195_phi = x_220;
+            {
+              x_195 = x_195_phi;
+              x_194_phi = x_195;
+            }
+            continue;
+          }
+          return;
+        } else {
+          const int x_206_save = x_194;
+          const int x_207 = tree[x_206_save].rightIndex;
+          if ((x_207 == -1)) {
+            tree[x_206_save].rightIndex = 5;
+            const BST tint_symbol_12 = {8, -1, -1};
+            tree[5] = tint_symbol_12;
+            x_222_phi = true;
+            break;
+          } else {
+            x_212 = tree[x_206_save].rightIndex;
+            x_195_phi = x_212;
+            {
+              x_195 = x_195_phi;
+              x_194_phi = x_195;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_195 = x_195_phi;
+          x_194_phi = x_195;
+        }
+      }
+      if (x_222_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_227_phi = 0;
+  bool x_255_phi = false;
+  switch(0u) {
+    default: {
+      x_227_phi = 0;
+      while (true) {
+        int x_253 = 0;
+        int x_245 = 0;
+        int x_228 = 0;
+        int x_228_phi = 0;
+        const int x_227 = x_227_phi;
+        x_255_phi = false;
+        if ((x_227 <= 6)) {
+        } else {
+          break;
+        }
+        const int x_234 = tree[x_227].data;
+        if ((2 <= x_234)) {
+          const int x_247_save = x_227;
+          const int x_248 = tree[x_247_save].leftIndex;
+          if ((x_248 == -1)) {
+            tree[x_247_save].leftIndex = 6;
+            const BST tint_symbol_13 = {2, -1, -1};
+            tree[6] = tint_symbol_13;
+            x_255_phi = true;
+            break;
+          } else {
+            x_253 = tree[x_247_save].leftIndex;
+            x_228_phi = x_253;
+            {
+              x_228 = x_228_phi;
+              x_227_phi = x_228;
+            }
+            continue;
+          }
+          return;
+        } else {
+          const int x_239_save = x_227;
+          const int x_240 = tree[x_239_save].rightIndex;
+          if ((x_240 == -1)) {
+            tree[x_239_save].rightIndex = 6;
+            const BST tint_symbol_14 = {2, -1, -1};
+            tree[6] = tint_symbol_14;
+            x_255_phi = true;
+            break;
+          } else {
+            x_245 = tree[x_239_save].rightIndex;
+            x_228_phi = x_245;
+            {
+              x_228 = x_228_phi;
+              x_227_phi = x_228;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_228 = x_228_phi;
+          x_227_phi = x_228;
+        }
+      }
+      if (x_255_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_260_phi = 0;
+  bool x_288_phi = false;
+  switch(0u) {
+    default: {
+      x_260_phi = 0;
+      while (true) {
+        int x_286 = 0;
+        int x_278 = 0;
+        int x_261 = 0;
+        int x_261_phi = 0;
+        const int x_260 = x_260_phi;
+        x_288_phi = false;
+        if ((x_260 <= 7)) {
+        } else {
+          break;
+        }
+        const int x_267 = tree[x_260].data;
+        if ((6 <= x_267)) {
+          const int x_280_save = x_260;
+          const int x_281 = tree[x_280_save].leftIndex;
+          if ((x_281 == -1)) {
+            tree[x_280_save].leftIndex = 7;
+            const BST tint_symbol_15 = {6, -1, -1};
+            tree[7] = tint_symbol_15;
+            x_288_phi = true;
+            break;
+          } else {
+            x_286 = tree[x_280_save].leftIndex;
+            x_261_phi = x_286;
+            {
+              x_261 = x_261_phi;
+              x_260_phi = x_261;
+            }
+            continue;
+          }
+          return;
+        } else {
+          const int x_272_save = x_260;
+          const int x_273 = tree[x_272_save].rightIndex;
+          if ((x_273 == -1)) {
+            tree[x_272_save].rightIndex = 7;
+            const BST tint_symbol_16 = {6, -1, -1};
+            tree[7] = tint_symbol_16;
+            x_288_phi = true;
+            break;
+          } else {
+            x_278 = tree[x_272_save].rightIndex;
+            x_261_phi = x_278;
+            {
+              x_261 = x_261_phi;
+              x_260_phi = x_261;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_261 = x_261_phi;
+          x_260_phi = x_261;
+        }
+      }
+      if (x_288_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_293_phi = 0;
+  bool x_321_phi = false;
+  switch(0u) {
+    default: {
+      x_293_phi = 0;
+      while (true) {
+        int x_319 = 0;
+        int x_311 = 0;
+        int x_294 = 0;
+        int x_294_phi = 0;
+        const int x_293 = x_293_phi;
+        x_321_phi = false;
+        if ((x_293 <= 8)) {
+        } else {
+          break;
+        }
+        const int x_300 = tree[x_293].data;
+        if ((17 <= x_300)) {
+          const int x_313_save = x_293;
+          const int x_314 = tree[x_313_save].leftIndex;
+          if ((x_314 == -1)) {
+            tree[x_313_save].leftIndex = 8;
+            const BST tint_symbol_17 = {17, -1, -1};
+            tree[8] = tint_symbol_17;
+            x_321_phi = true;
+            break;
+          } else {
+            x_319 = tree[x_313_save].leftIndex;
+            x_294_phi = x_319;
+            {
+              x_294 = x_294_phi;
+              x_293_phi = x_294;
+            }
+            continue;
+          }
+          return;
+        } else {
+          const int x_305_save = x_293;
+          const int x_306 = tree[x_305_save].rightIndex;
+          if ((x_306 == -1)) {
+            tree[x_305_save].rightIndex = 8;
+            const BST tint_symbol_18 = {17, -1, -1};
+            tree[8] = tint_symbol_18;
+            x_321_phi = true;
+            break;
+          } else {
+            x_311 = tree[x_305_save].rightIndex;
+            x_294_phi = x_311;
+            {
+              x_294 = x_294_phi;
+              x_293_phi = x_294;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_294 = x_294_phi;
+          x_293_phi = x_294;
+        }
+      }
+      if (x_321_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_326_phi = 0;
+  bool x_354_phi = false;
+  switch(0u) {
+    default: {
+      x_326_phi = 0;
+      while (true) {
+        int x_352 = 0;
+        int x_344 = 0;
+        int x_327 = 0;
+        int x_327_phi = 0;
+        const int x_326 = x_326_phi;
+        x_354_phi = false;
+        if ((x_326 <= 9)) {
+        } else {
+          break;
+        }
+        const int x_333 = tree[x_326].data;
+        if ((13 <= x_333)) {
+          const int x_346_save = x_326;
+          const int x_347 = tree[x_346_save].leftIndex;
+          if ((x_347 == -1)) {
+            tree[x_346_save].leftIndex = 9;
+            const BST tint_symbol_19 = {13, -1, -1};
+            tree[9] = tint_symbol_19;
+            x_354_phi = true;
+            break;
+          } else {
+            x_352 = tree[x_346_save].leftIndex;
+            x_327_phi = x_352;
+            {
+              x_327 = x_327_phi;
+              x_326_phi = x_327;
+            }
+            continue;
+          }
+          return;
+        } else {
+          const int x_338_save = x_326;
+          const int x_339 = tree[x_338_save].rightIndex;
+          if ((x_339 == -1)) {
+            tree[x_338_save].rightIndex = 9;
+            const BST tint_symbol_20 = {13, -1, -1};
+            tree[9] = tint_symbol_20;
+            x_354_phi = true;
+            break;
+          } else {
+            x_344 = tree[x_338_save].rightIndex;
+            x_327_phi = x_344;
+            {
+              x_327 = x_327_phi;
+              x_326_phi = x_327;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_327 = x_327_phi;
+          x_326_phi = x_327;
+        }
+      }
+      if (x_354_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  x_357_phi = 0;
+  x_360_phi = 0;
+  x_362_phi = 0;
+  while (true) {
+    int x_392 = 0;
+    int x_402 = 0;
+    int x_407 = 0;
+    int x_363 = 0;
+    int x_358_phi = 0;
+    int x_361_phi = 0;
+    const int x_357 = x_357_phi;
+    x_360 = x_360_phi;
+    const int x_362 = x_362_phi;
+    const int x_365 = (6 - 15);
+    if ((x_362 < 20)) {
+    } else {
+      break;
+    }
+    int x_374_phi = 0;
+    int x_392_phi = 0;
+    bool x_393_phi = false;
+    switch(0u) {
+      default: {
+        x_374_phi = 0;
+        while (true) {
+          const int x_374 = x_374_phi;
+          x_392_phi = x_357;
+          x_393_phi = false;
+          if ((x_374 != -1)) {
+          } else {
+            break;
+          }
+          const BST x_381 = tree[x_374];
+          const int x_382 = x_381.data;
+          const int x_383 = x_381.leftIndex;
+          const int x_385 = x_381.rightIndex;
+          if ((x_382 == x_362)) {
+            x_392_phi = x_362;
+            x_393_phi = true;
+            break;
+          }
+          const float x_389 = x_GLF_color[((3u <= 3u) ? 3u : 3u)];
+          {
+            x_374_phi = (!((x_362 <= x_382)) ? x_385 : x_383);
+          }
+        }
+        x_392 = x_392_phi;
+        const bool x_393 = x_393_phi;
+        x_358_phi = x_392;
+        if (x_393) {
+          break;
+        }
+        x_358_phi = -1;
+        break;
+      }
+    }
+    int x_358 = 0;
+    int x_401 = 0;
+    int x_406 = 0;
+    int x_402_phi = 0;
+    int x_407_phi = 0;
+    x_358 = x_358_phi;
+    switch(x_362) {
+      case 2:
+      case 5:
+      case 6:
+      case 7:
+      case 8:
+      case 9:
+      case 12:
+      case 13:
+      case 15:
+      case 17: {
+        x_402_phi = x_360;
+        if ((x_358 == asint(x_362))) {
+          x_401 = asint((x_360 + asint(1)));
+          x_402_phi = x_401;
+        }
+        x_402 = x_402_phi;
+        x_361_phi = x_402;
+        break;
+      }
+      default: {
+        x_407_phi = x_360;
+        if ((x_358 == asint(-1))) {
+          x_406 = asint((x_360 + asint(1)));
+          x_407_phi = x_406;
+        }
+        x_407 = x_407_phi;
+        x_361_phi = x_407;
+        break;
+      }
+    }
+    const int x_361 = x_361_phi;
+    {
+      x_363 = (x_362 + 1);
+      x_357_phi = x_358;
+      x_360_phi = x_361;
+      x_362_phi = x_363;
+    }
+  }
+  if ((x_360 == asint(20))) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_21 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_21;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-load-from-frag-color/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-load-from-frag-color/1.spvasm.expected.msl
new file mode 100644
index 0000000..94bc881
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-load-from-frag-color/1.spvasm.expected.msl
@@ -0,0 +1,764 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+struct tint_array_wrapper {
+  BST arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_23) {
+  tint_array_wrapper tree = {};
+  int x_360 = 0;
+  int x_62_phi = 0;
+  bool x_90_phi = false;
+  int x_357_phi = 0;
+  int x_360_phi = 0;
+  int x_362_phi = 0;
+  BST const tint_symbol_3 = {.data=9, .leftIndex=-1, .rightIndex=-1};
+  tree.arr[0] = tint_symbol_3;
+  switch(0u) {
+    default: {
+      x_62_phi = 0;
+      while (true) {
+        int x_88 = 0;
+        int x_80 = 0;
+        int x_63 = 0;
+        int x_63_phi = 0;
+        int const x_62 = x_62_phi;
+        x_90_phi = false;
+        if ((x_62 <= 1)) {
+        } else {
+          break;
+        }
+        int const x_69 = tree.arr[x_62].data;
+        if ((5 <= x_69)) {
+          int const x_82_save = x_62;
+          int const x_83 = tree.arr[x_82_save].leftIndex;
+          if ((x_83 == -1)) {
+            tree.arr[x_82_save].leftIndex = 1;
+            BST const tint_symbol_4 = {.data=5, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[1] = tint_symbol_4;
+            x_90_phi = true;
+            break;
+          } else {
+            x_88 = tree.arr[x_82_save].leftIndex;
+            x_63_phi = x_88;
+            {
+              x_63 = x_63_phi;
+              x_62_phi = x_63;
+            }
+            continue;
+          }
+          return;
+        } else {
+          int const x_74_save = x_62;
+          int const x_75 = tree.arr[x_74_save].rightIndex;
+          if ((x_75 == -1)) {
+            tree.arr[x_74_save].rightIndex = 1;
+            BST const tint_symbol_5 = {.data=5, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[1] = tint_symbol_5;
+            x_90_phi = true;
+            break;
+          } else {
+            x_80 = tree.arr[x_74_save].rightIndex;
+            x_63_phi = x_80;
+            {
+              x_63 = x_63_phi;
+              x_62_phi = x_63;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_63 = x_63_phi;
+          x_62_phi = x_63;
+        }
+      }
+      bool const x_90 = x_90_phi;
+      if (x_90) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_95_phi = 0;
+  bool x_123_phi = false;
+  switch(0u) {
+    default: {
+      x_95_phi = 0;
+      while (true) {
+        int x_121 = 0;
+        int x_113 = 0;
+        int x_96 = 0;
+        int x_96_phi = 0;
+        int const x_95 = x_95_phi;
+        x_123_phi = false;
+        if ((x_95 <= 2)) {
+        } else {
+          break;
+        }
+        int const x_102 = tree.arr[x_95].data;
+        if ((12 <= x_102)) {
+          int const x_115_save = x_95;
+          int const x_116 = tree.arr[x_115_save].leftIndex;
+          if ((x_116 == -1)) {
+            tree.arr[x_115_save].leftIndex = 2;
+            BST const tint_symbol_6 = {.data=12, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[2] = tint_symbol_6;
+            x_123_phi = true;
+            break;
+          } else {
+            x_121 = tree.arr[x_115_save].leftIndex;
+            x_96_phi = x_121;
+            {
+              x_96 = x_96_phi;
+              x_95_phi = x_96;
+            }
+            continue;
+          }
+          return;
+        } else {
+          int const x_107_save = x_95;
+          int const x_108 = tree.arr[x_107_save].rightIndex;
+          if ((x_108 == -1)) {
+            tree.arr[x_107_save].rightIndex = 2;
+            BST const tint_symbol_7 = {.data=12, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[2] = tint_symbol_7;
+            x_123_phi = true;
+            break;
+          } else {
+            x_113 = tree.arr[x_107_save].rightIndex;
+            x_96_phi = x_113;
+            {
+              x_96 = x_96_phi;
+              x_95_phi = x_96;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_96 = x_96_phi;
+          x_95_phi = x_96;
+        }
+      }
+      bool const x_123 = x_123_phi;
+      if (x_123) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_128_phi = 0;
+  bool x_156_phi = false;
+  switch(0u) {
+    default: {
+      x_128_phi = 0;
+      while (true) {
+        int x_154 = 0;
+        int x_146 = 0;
+        int x_129 = 0;
+        int x_129_phi = 0;
+        int const x_128 = x_128_phi;
+        x_156_phi = false;
+        if ((x_128 <= 3)) {
+        } else {
+          break;
+        }
+        int const x_135 = tree.arr[x_128].data;
+        if ((15 <= x_135)) {
+          int const x_148_save = x_128;
+          int const x_149 = tree.arr[x_148_save].leftIndex;
+          if ((x_149 == -1)) {
+            tree.arr[x_148_save].leftIndex = 3;
+            BST const tint_symbol_8 = {.data=15, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[3] = tint_symbol_8;
+            x_156_phi = true;
+            break;
+          } else {
+            x_154 = tree.arr[x_148_save].leftIndex;
+            x_129_phi = x_154;
+            {
+              x_129 = x_129_phi;
+              x_128_phi = x_129;
+            }
+            continue;
+          }
+          return;
+        } else {
+          int const x_140_save = x_128;
+          int const x_141 = tree.arr[x_140_save].rightIndex;
+          if ((x_141 == -1)) {
+            tree.arr[x_140_save].rightIndex = 3;
+            BST const tint_symbol_9 = {.data=15, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[3] = tint_symbol_9;
+            x_156_phi = true;
+            break;
+          } else {
+            x_146 = tree.arr[x_140_save].rightIndex;
+            x_129_phi = x_146;
+            {
+              x_129 = x_129_phi;
+              x_128_phi = x_129;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_129 = x_129_phi;
+          x_128_phi = x_129;
+        }
+      }
+      bool const x_156 = x_156_phi;
+      if (x_156) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_161_phi = 0;
+  bool x_189_phi = false;
+  switch(0u) {
+    default: {
+      x_161_phi = 0;
+      while (true) {
+        int x_187 = 0;
+        int x_179 = 0;
+        int x_162 = 0;
+        int x_162_phi = 0;
+        int const x_161 = x_161_phi;
+        x_189_phi = false;
+        if ((x_161 <= 4)) {
+        } else {
+          break;
+        }
+        int const x_168 = tree.arr[x_161].data;
+        if ((7 <= x_168)) {
+          int const x_181_save = x_161;
+          int const x_182 = tree.arr[x_181_save].leftIndex;
+          if ((x_182 == -1)) {
+            tree.arr[x_181_save].leftIndex = 4;
+            BST const tint_symbol_10 = {.data=7, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[4] = tint_symbol_10;
+            x_189_phi = true;
+            break;
+          } else {
+            x_187 = tree.arr[x_181_save].leftIndex;
+            x_162_phi = x_187;
+            {
+              x_162 = x_162_phi;
+              x_161_phi = x_162;
+            }
+            continue;
+          }
+          return;
+        } else {
+          int const x_173_save = x_161;
+          int const x_174 = tree.arr[x_173_save].rightIndex;
+          if ((x_174 == -1)) {
+            tree.arr[x_173_save].rightIndex = 4;
+            BST const tint_symbol_11 = {.data=7, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[4] = tint_symbol_11;
+            x_189_phi = true;
+            break;
+          } else {
+            x_179 = tree.arr[x_173_save].rightIndex;
+            x_162_phi = x_179;
+            {
+              x_162 = x_162_phi;
+              x_161_phi = x_162;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_162 = x_162_phi;
+          x_161_phi = x_162;
+        }
+      }
+      bool const x_189 = x_189_phi;
+      if (x_189) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_194_phi = 0;
+  bool x_222_phi = false;
+  switch(0u) {
+    default: {
+      x_194_phi = 0;
+      while (true) {
+        int x_220 = 0;
+        int x_212 = 0;
+        int x_195 = 0;
+        int x_195_phi = 0;
+        int const x_194 = x_194_phi;
+        x_222_phi = false;
+        if ((x_194 <= 5)) {
+        } else {
+          break;
+        }
+        int const x_201 = tree.arr[x_194].data;
+        if ((8 <= x_201)) {
+          int const x_214_save = x_194;
+          int const x_215 = tree.arr[x_214_save].leftIndex;
+          if ((x_215 == -1)) {
+            tree.arr[x_214_save].leftIndex = 5;
+            BST const tint_symbol_12 = {.data=8, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[5] = tint_symbol_12;
+            x_222_phi = true;
+            break;
+          } else {
+            x_220 = tree.arr[x_214_save].leftIndex;
+            x_195_phi = x_220;
+            {
+              x_195 = x_195_phi;
+              x_194_phi = x_195;
+            }
+            continue;
+          }
+          return;
+        } else {
+          int const x_206_save = x_194;
+          int const x_207 = tree.arr[x_206_save].rightIndex;
+          if ((x_207 == -1)) {
+            tree.arr[x_206_save].rightIndex = 5;
+            BST const tint_symbol_13 = {.data=8, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[5] = tint_symbol_13;
+            x_222_phi = true;
+            break;
+          } else {
+            x_212 = tree.arr[x_206_save].rightIndex;
+            x_195_phi = x_212;
+            {
+              x_195 = x_195_phi;
+              x_194_phi = x_195;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_195 = x_195_phi;
+          x_194_phi = x_195;
+        }
+      }
+      bool const x_222 = x_222_phi;
+      if (x_222) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_227_phi = 0;
+  bool x_255_phi = false;
+  switch(0u) {
+    default: {
+      x_227_phi = 0;
+      while (true) {
+        int x_253 = 0;
+        int x_245 = 0;
+        int x_228 = 0;
+        int x_228_phi = 0;
+        int const x_227 = x_227_phi;
+        x_255_phi = false;
+        if ((x_227 <= 6)) {
+        } else {
+          break;
+        }
+        int const x_234 = tree.arr[x_227].data;
+        if ((2 <= x_234)) {
+          int const x_247_save = x_227;
+          int const x_248 = tree.arr[x_247_save].leftIndex;
+          if ((x_248 == -1)) {
+            tree.arr[x_247_save].leftIndex = 6;
+            BST const tint_symbol_14 = {.data=2, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[6] = tint_symbol_14;
+            x_255_phi = true;
+            break;
+          } else {
+            x_253 = tree.arr[x_247_save].leftIndex;
+            x_228_phi = x_253;
+            {
+              x_228 = x_228_phi;
+              x_227_phi = x_228;
+            }
+            continue;
+          }
+          return;
+        } else {
+          int const x_239_save = x_227;
+          int const x_240 = tree.arr[x_239_save].rightIndex;
+          if ((x_240 == -1)) {
+            tree.arr[x_239_save].rightIndex = 6;
+            BST const tint_symbol_15 = {.data=2, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[6] = tint_symbol_15;
+            x_255_phi = true;
+            break;
+          } else {
+            x_245 = tree.arr[x_239_save].rightIndex;
+            x_228_phi = x_245;
+            {
+              x_228 = x_228_phi;
+              x_227_phi = x_228;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_228 = x_228_phi;
+          x_227_phi = x_228;
+        }
+      }
+      bool const x_255 = x_255_phi;
+      if (x_255) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_260_phi = 0;
+  bool x_288_phi = false;
+  switch(0u) {
+    default: {
+      x_260_phi = 0;
+      while (true) {
+        int x_286 = 0;
+        int x_278 = 0;
+        int x_261 = 0;
+        int x_261_phi = 0;
+        int const x_260 = x_260_phi;
+        x_288_phi = false;
+        if ((x_260 <= 7)) {
+        } else {
+          break;
+        }
+        int const x_267 = tree.arr[x_260].data;
+        if ((6 <= x_267)) {
+          int const x_280_save = x_260;
+          int const x_281 = tree.arr[x_280_save].leftIndex;
+          if ((x_281 == -1)) {
+            tree.arr[x_280_save].leftIndex = 7;
+            BST const tint_symbol_16 = {.data=6, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[7] = tint_symbol_16;
+            x_288_phi = true;
+            break;
+          } else {
+            x_286 = tree.arr[x_280_save].leftIndex;
+            x_261_phi = x_286;
+            {
+              x_261 = x_261_phi;
+              x_260_phi = x_261;
+            }
+            continue;
+          }
+          return;
+        } else {
+          int const x_272_save = x_260;
+          int const x_273 = tree.arr[x_272_save].rightIndex;
+          if ((x_273 == -1)) {
+            tree.arr[x_272_save].rightIndex = 7;
+            BST const tint_symbol_17 = {.data=6, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[7] = tint_symbol_17;
+            x_288_phi = true;
+            break;
+          } else {
+            x_278 = tree.arr[x_272_save].rightIndex;
+            x_261_phi = x_278;
+            {
+              x_261 = x_261_phi;
+              x_260_phi = x_261;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_261 = x_261_phi;
+          x_260_phi = x_261;
+        }
+      }
+      bool const x_288 = x_288_phi;
+      if (x_288) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_293_phi = 0;
+  bool x_321_phi = false;
+  switch(0u) {
+    default: {
+      x_293_phi = 0;
+      while (true) {
+        int x_319 = 0;
+        int x_311 = 0;
+        int x_294 = 0;
+        int x_294_phi = 0;
+        int const x_293 = x_293_phi;
+        x_321_phi = false;
+        if ((x_293 <= 8)) {
+        } else {
+          break;
+        }
+        int const x_300 = tree.arr[x_293].data;
+        if ((17 <= x_300)) {
+          int const x_313_save = x_293;
+          int const x_314 = tree.arr[x_313_save].leftIndex;
+          if ((x_314 == -1)) {
+            tree.arr[x_313_save].leftIndex = 8;
+            BST const tint_symbol_18 = {.data=17, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[8] = tint_symbol_18;
+            x_321_phi = true;
+            break;
+          } else {
+            x_319 = tree.arr[x_313_save].leftIndex;
+            x_294_phi = x_319;
+            {
+              x_294 = x_294_phi;
+              x_293_phi = x_294;
+            }
+            continue;
+          }
+          return;
+        } else {
+          int const x_305_save = x_293;
+          int const x_306 = tree.arr[x_305_save].rightIndex;
+          if ((x_306 == -1)) {
+            tree.arr[x_305_save].rightIndex = 8;
+            BST const tint_symbol_19 = {.data=17, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[8] = tint_symbol_19;
+            x_321_phi = true;
+            break;
+          } else {
+            x_311 = tree.arr[x_305_save].rightIndex;
+            x_294_phi = x_311;
+            {
+              x_294 = x_294_phi;
+              x_293_phi = x_294;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_294 = x_294_phi;
+          x_293_phi = x_294;
+        }
+      }
+      bool const x_321 = x_321_phi;
+      if (x_321) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_326_phi = 0;
+  bool x_354_phi = false;
+  switch(0u) {
+    default: {
+      x_326_phi = 0;
+      while (true) {
+        int x_352 = 0;
+        int x_344 = 0;
+        int x_327 = 0;
+        int x_327_phi = 0;
+        int const x_326 = x_326_phi;
+        x_354_phi = false;
+        if ((x_326 <= 9)) {
+        } else {
+          break;
+        }
+        int const x_333 = tree.arr[x_326].data;
+        if ((13 <= x_333)) {
+          int const x_346_save = x_326;
+          int const x_347 = tree.arr[x_346_save].leftIndex;
+          if ((x_347 == -1)) {
+            tree.arr[x_346_save].leftIndex = 9;
+            BST const tint_symbol_20 = {.data=13, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[9] = tint_symbol_20;
+            x_354_phi = true;
+            break;
+          } else {
+            x_352 = tree.arr[x_346_save].leftIndex;
+            x_327_phi = x_352;
+            {
+              x_327 = x_327_phi;
+              x_326_phi = x_327;
+            }
+            continue;
+          }
+          return;
+        } else {
+          int const x_338_save = x_326;
+          int const x_339 = tree.arr[x_338_save].rightIndex;
+          if ((x_339 == -1)) {
+            tree.arr[x_338_save].rightIndex = 9;
+            BST const tint_symbol_21 = {.data=13, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[9] = tint_symbol_21;
+            x_354_phi = true;
+            break;
+          } else {
+            x_344 = tree.arr[x_338_save].rightIndex;
+            x_327_phi = x_344;
+            {
+              x_327 = x_327_phi;
+              x_326_phi = x_327;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_327 = x_327_phi;
+          x_326_phi = x_327;
+        }
+      }
+      bool const x_354 = x_354_phi;
+      if (x_354) {
+        break;
+      }
+      break;
+    }
+  }
+  x_357_phi = 0;
+  x_360_phi = 0;
+  x_362_phi = 0;
+  while (true) {
+    int x_392 = 0;
+    int x_402 = 0;
+    int x_407 = 0;
+    int x_363 = 0;
+    int x_358_phi = 0;
+    int x_361_phi = 0;
+    int const x_357 = x_357_phi;
+    x_360 = x_360_phi;
+    int const x_362 = x_362_phi;
+    int const x_365 = (6 - 15);
+    if ((x_362 < 20)) {
+    } else {
+      break;
+    }
+    int x_374_phi = 0;
+    int x_392_phi = 0;
+    bool x_393_phi = false;
+    switch(0u) {
+      default: {
+        x_374_phi = 0;
+        while (true) {
+          int const x_374 = x_374_phi;
+          x_392_phi = x_357;
+          x_393_phi = false;
+          if ((x_374 != -1)) {
+          } else {
+            break;
+          }
+          BST const x_381 = tree.arr[x_374];
+          int const x_382 = x_381.data;
+          int const x_383 = x_381.leftIndex;
+          int const x_385 = x_381.rightIndex;
+          if ((x_382 == x_362)) {
+            x_392_phi = x_362;
+            x_393_phi = true;
+            break;
+          }
+          float const x_389 = (*(tint_symbol_23))[select(3u, 3u, (3u <= 3u))];
+          {
+            x_374_phi = select(x_383, x_385, !((x_362 <= x_382)));
+          }
+        }
+        x_392 = x_392_phi;
+        bool const x_393 = x_393_phi;
+        x_358_phi = x_392;
+        if (x_393) {
+          break;
+        }
+        x_358_phi = -1;
+        break;
+      }
+    }
+    int x_358 = 0;
+    int x_401 = 0;
+    int x_406 = 0;
+    int x_402_phi = 0;
+    int x_407_phi = 0;
+    x_358 = x_358_phi;
+    switch(x_362) {
+      case 2:
+      case 5:
+      case 6:
+      case 7:
+      case 8:
+      case 9:
+      case 12:
+      case 13:
+      case 15:
+      case 17: {
+        x_402_phi = x_360;
+        if ((x_358 == as_type<int>(x_362))) {
+          x_401 = as_type<int>((x_360 + as_type<int>(1)));
+          x_402_phi = x_401;
+        }
+        x_402 = x_402_phi;
+        x_361_phi = x_402;
+        break;
+      }
+      default: {
+        x_407_phi = x_360;
+        if ((x_358 == as_type<int>(-1))) {
+          x_406 = as_type<int>((x_360 + as_type<int>(1)));
+          x_407_phi = x_406;
+        }
+        x_407 = x_407_phi;
+        x_361_phi = x_407;
+        break;
+      }
+    }
+    int const x_361 = x_361_phi;
+    {
+      x_363 = (x_362 + 1);
+      x_357_phi = x_358;
+      x_360_phi = x_361;
+      x_362_phi = x_363;
+    }
+  }
+  if ((x_360 == as_type<int>(20))) {
+    *(tint_symbol_23) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_23) = float4(0.0f, 0.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_24 = 0.0f;
+  main_1(&(tint_symbol_24));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_24};
+  tint_symbol_1 const tint_symbol_22 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_22;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-load-from-frag-color/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-load-from-frag-color/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..9057c70
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-load-from-frag-color/1.spvasm.expected.spvasm
@@ -0,0 +1,1174 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 627
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %BST "BST"
+               OpMemberName %BST 0 "data"
+               OpMemberName %BST 1 "leftIndex"
+               OpMemberName %BST 2 "rightIndex"
+               OpName %tree "tree"
+               OpName %x_360 "x_360"
+               OpName %x_62_phi "x_62_phi"
+               OpName %x_90_phi "x_90_phi"
+               OpName %x_357_phi "x_357_phi"
+               OpName %x_360_phi "x_360_phi"
+               OpName %x_362_phi "x_362_phi"
+               OpName %x_88 "x_88"
+               OpName %x_80 "x_80"
+               OpName %x_63 "x_63"
+               OpName %x_63_phi "x_63_phi"
+               OpName %x_95_phi "x_95_phi"
+               OpName %x_123_phi "x_123_phi"
+               OpName %x_121 "x_121"
+               OpName %x_113 "x_113"
+               OpName %x_96 "x_96"
+               OpName %x_96_phi "x_96_phi"
+               OpName %x_128_phi "x_128_phi"
+               OpName %x_156_phi "x_156_phi"
+               OpName %x_154 "x_154"
+               OpName %x_146 "x_146"
+               OpName %x_129 "x_129"
+               OpName %x_129_phi "x_129_phi"
+               OpName %x_161_phi "x_161_phi"
+               OpName %x_189_phi "x_189_phi"
+               OpName %x_187 "x_187"
+               OpName %x_179 "x_179"
+               OpName %x_162 "x_162"
+               OpName %x_162_phi "x_162_phi"
+               OpName %x_194_phi "x_194_phi"
+               OpName %x_222_phi "x_222_phi"
+               OpName %x_220 "x_220"
+               OpName %x_212 "x_212"
+               OpName %x_195 "x_195"
+               OpName %x_195_phi "x_195_phi"
+               OpName %x_227_phi "x_227_phi"
+               OpName %x_255_phi "x_255_phi"
+               OpName %x_253 "x_253"
+               OpName %x_245 "x_245"
+               OpName %x_228 "x_228"
+               OpName %x_228_phi "x_228_phi"
+               OpName %x_260_phi "x_260_phi"
+               OpName %x_288_phi "x_288_phi"
+               OpName %x_286 "x_286"
+               OpName %x_278 "x_278"
+               OpName %x_261 "x_261"
+               OpName %x_261_phi "x_261_phi"
+               OpName %x_293_phi "x_293_phi"
+               OpName %x_321_phi "x_321_phi"
+               OpName %x_319 "x_319"
+               OpName %x_311 "x_311"
+               OpName %x_294 "x_294"
+               OpName %x_294_phi "x_294_phi"
+               OpName %x_326_phi "x_326_phi"
+               OpName %x_354_phi "x_354_phi"
+               OpName %x_352 "x_352"
+               OpName %x_344 "x_344"
+               OpName %x_327 "x_327"
+               OpName %x_327_phi "x_327_phi"
+               OpName %x_392 "x_392"
+               OpName %x_402 "x_402"
+               OpName %x_407 "x_407"
+               OpName %x_363 "x_363"
+               OpName %x_358_phi "x_358_phi"
+               OpName %x_361_phi "x_361_phi"
+               OpName %x_374_phi "x_374_phi"
+               OpName %x_392_phi "x_392_phi"
+               OpName %x_393_phi "x_393_phi"
+               OpName %x_358 "x_358"
+               OpName %x_401 "x_401"
+               OpName %x_406 "x_406"
+               OpName %x_402_phi "x_402_phi"
+               OpName %x_407_phi "x_407_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %BST 0 Offset 0
+               OpMemberDecorate %BST 1 Offset 4
+               OpMemberDecorate %BST 2 Offset 8
+               OpDecorate %_arr_BST_uint_10 ArrayStride 12
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+        %BST = OpTypeStruct %int %int %int
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_BST_uint_10 = OpTypeArray %BST %uint_10
+%_ptr_Function__arr_BST_uint_10 = OpTypePointer Function %_arr_BST_uint_10
+         %19 = OpConstantNull %_arr_BST_uint_10
+%_ptr_Function_int = OpTypePointer Function %int
+         %22 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %27 = OpConstantNull %bool
+      %int_0 = OpConstant %int 0
+%_ptr_Function_BST = OpTypePointer Function %BST
+      %int_9 = OpConstant %int 9
+     %int_n1 = OpConstant %int -1
+         %36 = OpConstantComposite %BST %int_9 %int_n1 %int_n1
+     %uint_0 = OpConstant %uint 0
+      %false = OpConstantFalse %bool
+      %int_1 = OpConstant %int 1
+      %int_5 = OpConstant %int 5
+     %uint_1 = OpConstant %uint 1
+         %71 = OpConstantComposite %BST %int_5 %int_n1 %int_n1
+       %true = OpConstantTrue %bool
+     %uint_2 = OpConstant %uint 2
+      %int_2 = OpConstant %int 2
+     %int_12 = OpConstant %int 12
+        %126 = OpConstantComposite %BST %int_12 %int_n1 %int_n1
+      %int_3 = OpConstant %int 3
+     %int_15 = OpConstant %int 15
+        %179 = OpConstantComposite %BST %int_15 %int_n1 %int_n1
+      %int_4 = OpConstant %int 4
+      %int_7 = OpConstant %int 7
+        %232 = OpConstantComposite %BST %int_7 %int_n1 %int_n1
+      %int_8 = OpConstant %int 8
+        %284 = OpConstantComposite %BST %int_8 %int_n1 %int_n1
+      %int_6 = OpConstant %int 6
+        %336 = OpConstantComposite %BST %int_2 %int_n1 %int_n1
+        %387 = OpConstantComposite %BST %int_6 %int_n1 %int_n1
+     %int_17 = OpConstant %int 17
+        %439 = OpConstantComposite %BST %int_17 %int_n1 %int_n1
+     %int_13 = OpConstant %int 13
+        %491 = OpConstantComposite %BST %int_13 %int_n1 %int_n1
+     %int_20 = OpConstant %int 20
+     %uint_3 = OpConstant %uint 3
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+        %613 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %614 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+        %615 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+       %tree = OpVariable %_ptr_Function__arr_BST_uint_10 Function %19
+      %x_360 = OpVariable %_ptr_Function_int Function %22
+   %x_62_phi = OpVariable %_ptr_Function_int Function %22
+   %x_90_phi = OpVariable %_ptr_Function_bool Function %27
+  %x_357_phi = OpVariable %_ptr_Function_int Function %22
+  %x_360_phi = OpVariable %_ptr_Function_int Function %22
+  %x_362_phi = OpVariable %_ptr_Function_int Function %22
+       %x_88 = OpVariable %_ptr_Function_int Function %22
+       %x_80 = OpVariable %_ptr_Function_int Function %22
+       %x_63 = OpVariable %_ptr_Function_int Function %22
+   %x_63_phi = OpVariable %_ptr_Function_int Function %22
+   %x_95_phi = OpVariable %_ptr_Function_int Function %22
+  %x_123_phi = OpVariable %_ptr_Function_bool Function %27
+      %x_121 = OpVariable %_ptr_Function_int Function %22
+      %x_113 = OpVariable %_ptr_Function_int Function %22
+       %x_96 = OpVariable %_ptr_Function_int Function %22
+   %x_96_phi = OpVariable %_ptr_Function_int Function %22
+  %x_128_phi = OpVariable %_ptr_Function_int Function %22
+  %x_156_phi = OpVariable %_ptr_Function_bool Function %27
+      %x_154 = OpVariable %_ptr_Function_int Function %22
+      %x_146 = OpVariable %_ptr_Function_int Function %22
+      %x_129 = OpVariable %_ptr_Function_int Function %22
+  %x_129_phi = OpVariable %_ptr_Function_int Function %22
+  %x_161_phi = OpVariable %_ptr_Function_int Function %22
+  %x_189_phi = OpVariable %_ptr_Function_bool Function %27
+      %x_187 = OpVariable %_ptr_Function_int Function %22
+      %x_179 = OpVariable %_ptr_Function_int Function %22
+      %x_162 = OpVariable %_ptr_Function_int Function %22
+  %x_162_phi = OpVariable %_ptr_Function_int Function %22
+  %x_194_phi = OpVariable %_ptr_Function_int Function %22
+  %x_222_phi = OpVariable %_ptr_Function_bool Function %27
+      %x_220 = OpVariable %_ptr_Function_int Function %22
+      %x_212 = OpVariable %_ptr_Function_int Function %22
+      %x_195 = OpVariable %_ptr_Function_int Function %22
+  %x_195_phi = OpVariable %_ptr_Function_int Function %22
+  %x_227_phi = OpVariable %_ptr_Function_int Function %22
+  %x_255_phi = OpVariable %_ptr_Function_bool Function %27
+      %x_253 = OpVariable %_ptr_Function_int Function %22
+      %x_245 = OpVariable %_ptr_Function_int Function %22
+      %x_228 = OpVariable %_ptr_Function_int Function %22
+  %x_228_phi = OpVariable %_ptr_Function_int Function %22
+  %x_260_phi = OpVariable %_ptr_Function_int Function %22
+  %x_288_phi = OpVariable %_ptr_Function_bool Function %27
+      %x_286 = OpVariable %_ptr_Function_int Function %22
+      %x_278 = OpVariable %_ptr_Function_int Function %22
+      %x_261 = OpVariable %_ptr_Function_int Function %22
+  %x_261_phi = OpVariable %_ptr_Function_int Function %22
+  %x_293_phi = OpVariable %_ptr_Function_int Function %22
+  %x_321_phi = OpVariable %_ptr_Function_bool Function %27
+      %x_319 = OpVariable %_ptr_Function_int Function %22
+      %x_311 = OpVariable %_ptr_Function_int Function %22
+      %x_294 = OpVariable %_ptr_Function_int Function %22
+  %x_294_phi = OpVariable %_ptr_Function_int Function %22
+  %x_326_phi = OpVariable %_ptr_Function_int Function %22
+  %x_354_phi = OpVariable %_ptr_Function_bool Function %27
+      %x_352 = OpVariable %_ptr_Function_int Function %22
+      %x_344 = OpVariable %_ptr_Function_int Function %22
+      %x_327 = OpVariable %_ptr_Function_int Function %22
+  %x_327_phi = OpVariable %_ptr_Function_int Function %22
+      %x_392 = OpVariable %_ptr_Function_int Function %22
+      %x_402 = OpVariable %_ptr_Function_int Function %22
+      %x_407 = OpVariable %_ptr_Function_int Function %22
+      %x_363 = OpVariable %_ptr_Function_int Function %22
+  %x_358_phi = OpVariable %_ptr_Function_int Function %22
+  %x_361_phi = OpVariable %_ptr_Function_int Function %22
+  %x_374_phi = OpVariable %_ptr_Function_int Function %22
+  %x_392_phi = OpVariable %_ptr_Function_int Function %22
+  %x_393_phi = OpVariable %_ptr_Function_bool Function %27
+      %x_358 = OpVariable %_ptr_Function_int Function %22
+      %x_401 = OpVariable %_ptr_Function_int Function %22
+      %x_406 = OpVariable %_ptr_Function_int Function %22
+  %x_402_phi = OpVariable %_ptr_Function_int Function %22
+  %x_407_phi = OpVariable %_ptr_Function_int Function %22
+         %33 = OpAccessChain %_ptr_Function_BST %tree %int_0
+               OpStore %33 %36
+               OpSelectionMerge %37 None
+               OpSwitch %uint_0 %39
+         %39 = OpLabel
+               OpStore %x_62_phi %int_0
+               OpBranch %40
+         %40 = OpLabel
+               OpLoopMerge %41 %42 None
+               OpBranch %43
+         %43 = OpLabel
+         %48 = OpLoad %int %x_62_phi
+               OpStore %x_90_phi %false
+         %51 = OpSLessThanEqual %bool %48 %int_1
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %54
+         %53 = OpLabel
+               OpBranch %52
+         %54 = OpLabel
+               OpBranch %41
+         %52 = OpLabel
+         %55 = OpAccessChain %_ptr_Function_int %tree %48 %uint_0
+         %56 = OpLoad %int %55
+         %58 = OpSLessThanEqual %bool %int_5 %56
+               OpSelectionMerge %59 None
+               OpBranchConditional %58 %60 %61
+         %60 = OpLabel
+         %63 = OpAccessChain %_ptr_Function_int %tree %48 %uint_1
+         %64 = OpLoad %int %63
+         %65 = OpIEqual %bool %64 %int_n1
+               OpSelectionMerge %66 None
+               OpBranchConditional %65 %67 %68
+         %67 = OpLabel
+         %69 = OpAccessChain %_ptr_Function_int %tree %48 %uint_1
+               OpStore %69 %int_1
+         %70 = OpAccessChain %_ptr_Function_BST %tree %int_1
+               OpStore %70 %71
+               OpStore %x_90_phi %true
+               OpBranch %41
+         %68 = OpLabel
+         %73 = OpAccessChain %_ptr_Function_int %tree %48 %uint_1
+         %74 = OpLoad %int %73
+               OpStore %x_88 %74
+         %75 = OpLoad %int %x_88
+               OpStore %x_63_phi %75
+               OpBranch %42
+         %66 = OpLabel
+               OpReturn
+         %61 = OpLabel
+         %77 = OpAccessChain %_ptr_Function_int %tree %48 %uint_2
+         %78 = OpLoad %int %77
+         %79 = OpIEqual %bool %78 %int_n1
+               OpSelectionMerge %80 None
+               OpBranchConditional %79 %81 %82
+         %81 = OpLabel
+         %83 = OpAccessChain %_ptr_Function_int %tree %48 %uint_2
+               OpStore %83 %int_1
+         %84 = OpAccessChain %_ptr_Function_BST %tree %int_1
+               OpStore %84 %71
+               OpStore %x_90_phi %true
+               OpBranch %41
+         %82 = OpLabel
+         %85 = OpAccessChain %_ptr_Function_int %tree %48 %uint_2
+         %86 = OpLoad %int %85
+               OpStore %x_80 %86
+         %87 = OpLoad %int %x_80
+               OpStore %x_63_phi %87
+               OpBranch %42
+         %80 = OpLabel
+               OpReturn
+         %59 = OpLabel
+               OpReturn
+         %42 = OpLabel
+         %88 = OpLoad %int %x_63_phi
+               OpStore %x_63 %88
+         %89 = OpLoad %int %x_63
+               OpStore %x_62_phi %89
+               OpBranch %40
+         %41 = OpLabel
+         %90 = OpLoad %bool %x_90_phi
+               OpSelectionMerge %91 None
+               OpBranchConditional %90 %92 %91
+         %92 = OpLabel
+               OpBranch %37
+         %91 = OpLabel
+               OpBranch %37
+         %37 = OpLabel
+               OpSelectionMerge %95 None
+               OpSwitch %uint_0 %96
+         %96 = OpLabel
+               OpStore %x_95_phi %int_0
+               OpBranch %97
+         %97 = OpLabel
+               OpLoopMerge %98 %99 None
+               OpBranch %100
+        %100 = OpLabel
+        %105 = OpLoad %int %x_95_phi
+               OpStore %x_123_phi %false
+        %107 = OpSLessThanEqual %bool %105 %int_2
+               OpSelectionMerge %108 None
+               OpBranchConditional %107 %109 %110
+        %109 = OpLabel
+               OpBranch %108
+        %110 = OpLabel
+               OpBranch %98
+        %108 = OpLabel
+        %111 = OpAccessChain %_ptr_Function_int %tree %105 %uint_0
+        %112 = OpLoad %int %111
+        %114 = OpSLessThanEqual %bool %int_12 %112
+               OpSelectionMerge %115 None
+               OpBranchConditional %114 %116 %117
+        %116 = OpLabel
+        %118 = OpAccessChain %_ptr_Function_int %tree %105 %uint_1
+        %119 = OpLoad %int %118
+        %120 = OpIEqual %bool %119 %int_n1
+               OpSelectionMerge %121 None
+               OpBranchConditional %120 %122 %123
+        %122 = OpLabel
+        %124 = OpAccessChain %_ptr_Function_int %tree %105 %uint_1
+               OpStore %124 %int_2
+        %125 = OpAccessChain %_ptr_Function_BST %tree %int_2
+               OpStore %125 %126
+               OpStore %x_123_phi %true
+               OpBranch %98
+        %123 = OpLabel
+        %127 = OpAccessChain %_ptr_Function_int %tree %105 %uint_1
+        %128 = OpLoad %int %127
+               OpStore %x_121 %128
+        %129 = OpLoad %int %x_121
+               OpStore %x_96_phi %129
+               OpBranch %99
+        %121 = OpLabel
+               OpReturn
+        %117 = OpLabel
+        %130 = OpAccessChain %_ptr_Function_int %tree %105 %uint_2
+        %131 = OpLoad %int %130
+        %132 = OpIEqual %bool %131 %int_n1
+               OpSelectionMerge %133 None
+               OpBranchConditional %132 %134 %135
+        %134 = OpLabel
+        %136 = OpAccessChain %_ptr_Function_int %tree %105 %uint_2
+               OpStore %136 %int_2
+        %137 = OpAccessChain %_ptr_Function_BST %tree %int_2
+               OpStore %137 %126
+               OpStore %x_123_phi %true
+               OpBranch %98
+        %135 = OpLabel
+        %138 = OpAccessChain %_ptr_Function_int %tree %105 %uint_2
+        %139 = OpLoad %int %138
+               OpStore %x_113 %139
+        %140 = OpLoad %int %x_113
+               OpStore %x_96_phi %140
+               OpBranch %99
+        %133 = OpLabel
+               OpReturn
+        %115 = OpLabel
+               OpReturn
+         %99 = OpLabel
+        %141 = OpLoad %int %x_96_phi
+               OpStore %x_96 %141
+        %142 = OpLoad %int %x_96
+               OpStore %x_95_phi %142
+               OpBranch %97
+         %98 = OpLabel
+        %143 = OpLoad %bool %x_123_phi
+               OpSelectionMerge %144 None
+               OpBranchConditional %143 %145 %144
+        %145 = OpLabel
+               OpBranch %95
+        %144 = OpLabel
+               OpBranch %95
+         %95 = OpLabel
+               OpSelectionMerge %148 None
+               OpSwitch %uint_0 %149
+        %149 = OpLabel
+               OpStore %x_128_phi %int_0
+               OpBranch %150
+        %150 = OpLabel
+               OpLoopMerge %151 %152 None
+               OpBranch %153
+        %153 = OpLabel
+        %158 = OpLoad %int %x_128_phi
+               OpStore %x_156_phi %false
+        %160 = OpSLessThanEqual %bool %158 %int_3
+               OpSelectionMerge %161 None
+               OpBranchConditional %160 %162 %163
+        %162 = OpLabel
+               OpBranch %161
+        %163 = OpLabel
+               OpBranch %151
+        %161 = OpLabel
+        %164 = OpAccessChain %_ptr_Function_int %tree %158 %uint_0
+        %165 = OpLoad %int %164
+        %167 = OpSLessThanEqual %bool %int_15 %165
+               OpSelectionMerge %168 None
+               OpBranchConditional %167 %169 %170
+        %169 = OpLabel
+        %171 = OpAccessChain %_ptr_Function_int %tree %158 %uint_1
+        %172 = OpLoad %int %171
+        %173 = OpIEqual %bool %172 %int_n1
+               OpSelectionMerge %174 None
+               OpBranchConditional %173 %175 %176
+        %175 = OpLabel
+        %177 = OpAccessChain %_ptr_Function_int %tree %158 %uint_1
+               OpStore %177 %int_3
+        %178 = OpAccessChain %_ptr_Function_BST %tree %int_3
+               OpStore %178 %179
+               OpStore %x_156_phi %true
+               OpBranch %151
+        %176 = OpLabel
+        %180 = OpAccessChain %_ptr_Function_int %tree %158 %uint_1
+        %181 = OpLoad %int %180
+               OpStore %x_154 %181
+        %182 = OpLoad %int %x_154
+               OpStore %x_129_phi %182
+               OpBranch %152
+        %174 = OpLabel
+               OpReturn
+        %170 = OpLabel
+        %183 = OpAccessChain %_ptr_Function_int %tree %158 %uint_2
+        %184 = OpLoad %int %183
+        %185 = OpIEqual %bool %184 %int_n1
+               OpSelectionMerge %186 None
+               OpBranchConditional %185 %187 %188
+        %187 = OpLabel
+        %189 = OpAccessChain %_ptr_Function_int %tree %158 %uint_2
+               OpStore %189 %int_3
+        %190 = OpAccessChain %_ptr_Function_BST %tree %int_3
+               OpStore %190 %179
+               OpStore %x_156_phi %true
+               OpBranch %151
+        %188 = OpLabel
+        %191 = OpAccessChain %_ptr_Function_int %tree %158 %uint_2
+        %192 = OpLoad %int %191
+               OpStore %x_146 %192
+        %193 = OpLoad %int %x_146
+               OpStore %x_129_phi %193
+               OpBranch %152
+        %186 = OpLabel
+               OpReturn
+        %168 = OpLabel
+               OpReturn
+        %152 = OpLabel
+        %194 = OpLoad %int %x_129_phi
+               OpStore %x_129 %194
+        %195 = OpLoad %int %x_129
+               OpStore %x_128_phi %195
+               OpBranch %150
+        %151 = OpLabel
+        %196 = OpLoad %bool %x_156_phi
+               OpSelectionMerge %197 None
+               OpBranchConditional %196 %198 %197
+        %198 = OpLabel
+               OpBranch %148
+        %197 = OpLabel
+               OpBranch %148
+        %148 = OpLabel
+               OpSelectionMerge %201 None
+               OpSwitch %uint_0 %202
+        %202 = OpLabel
+               OpStore %x_161_phi %int_0
+               OpBranch %203
+        %203 = OpLabel
+               OpLoopMerge %204 %205 None
+               OpBranch %206
+        %206 = OpLabel
+        %211 = OpLoad %int %x_161_phi
+               OpStore %x_189_phi %false
+        %213 = OpSLessThanEqual %bool %211 %int_4
+               OpSelectionMerge %214 None
+               OpBranchConditional %213 %215 %216
+        %215 = OpLabel
+               OpBranch %214
+        %216 = OpLabel
+               OpBranch %204
+        %214 = OpLabel
+        %217 = OpAccessChain %_ptr_Function_int %tree %211 %uint_0
+        %218 = OpLoad %int %217
+        %220 = OpSLessThanEqual %bool %int_7 %218
+               OpSelectionMerge %221 None
+               OpBranchConditional %220 %222 %223
+        %222 = OpLabel
+        %224 = OpAccessChain %_ptr_Function_int %tree %211 %uint_1
+        %225 = OpLoad %int %224
+        %226 = OpIEqual %bool %225 %int_n1
+               OpSelectionMerge %227 None
+               OpBranchConditional %226 %228 %229
+        %228 = OpLabel
+        %230 = OpAccessChain %_ptr_Function_int %tree %211 %uint_1
+               OpStore %230 %int_4
+        %231 = OpAccessChain %_ptr_Function_BST %tree %int_4
+               OpStore %231 %232
+               OpStore %x_189_phi %true
+               OpBranch %204
+        %229 = OpLabel
+        %233 = OpAccessChain %_ptr_Function_int %tree %211 %uint_1
+        %234 = OpLoad %int %233
+               OpStore %x_187 %234
+        %235 = OpLoad %int %x_187
+               OpStore %x_162_phi %235
+               OpBranch %205
+        %227 = OpLabel
+               OpReturn
+        %223 = OpLabel
+        %236 = OpAccessChain %_ptr_Function_int %tree %211 %uint_2
+        %237 = OpLoad %int %236
+        %238 = OpIEqual %bool %237 %int_n1
+               OpSelectionMerge %239 None
+               OpBranchConditional %238 %240 %241
+        %240 = OpLabel
+        %242 = OpAccessChain %_ptr_Function_int %tree %211 %uint_2
+               OpStore %242 %int_4
+        %243 = OpAccessChain %_ptr_Function_BST %tree %int_4
+               OpStore %243 %232
+               OpStore %x_189_phi %true
+               OpBranch %204
+        %241 = OpLabel
+        %244 = OpAccessChain %_ptr_Function_int %tree %211 %uint_2
+        %245 = OpLoad %int %244
+               OpStore %x_179 %245
+        %246 = OpLoad %int %x_179
+               OpStore %x_162_phi %246
+               OpBranch %205
+        %239 = OpLabel
+               OpReturn
+        %221 = OpLabel
+               OpReturn
+        %205 = OpLabel
+        %247 = OpLoad %int %x_162_phi
+               OpStore %x_162 %247
+        %248 = OpLoad %int %x_162
+               OpStore %x_161_phi %248
+               OpBranch %203
+        %204 = OpLabel
+        %249 = OpLoad %bool %x_189_phi
+               OpSelectionMerge %250 None
+               OpBranchConditional %249 %251 %250
+        %251 = OpLabel
+               OpBranch %201
+        %250 = OpLabel
+               OpBranch %201
+        %201 = OpLabel
+               OpSelectionMerge %254 None
+               OpSwitch %uint_0 %255
+        %255 = OpLabel
+               OpStore %x_194_phi %int_0
+               OpBranch %256
+        %256 = OpLabel
+               OpLoopMerge %257 %258 None
+               OpBranch %259
+        %259 = OpLabel
+        %264 = OpLoad %int %x_194_phi
+               OpStore %x_222_phi %false
+        %265 = OpSLessThanEqual %bool %264 %int_5
+               OpSelectionMerge %266 None
+               OpBranchConditional %265 %267 %268
+        %267 = OpLabel
+               OpBranch %266
+        %268 = OpLabel
+               OpBranch %257
+        %266 = OpLabel
+        %269 = OpAccessChain %_ptr_Function_int %tree %264 %uint_0
+        %270 = OpLoad %int %269
+        %272 = OpSLessThanEqual %bool %int_8 %270
+               OpSelectionMerge %273 None
+               OpBranchConditional %272 %274 %275
+        %274 = OpLabel
+        %276 = OpAccessChain %_ptr_Function_int %tree %264 %uint_1
+        %277 = OpLoad %int %276
+        %278 = OpIEqual %bool %277 %int_n1
+               OpSelectionMerge %279 None
+               OpBranchConditional %278 %280 %281
+        %280 = OpLabel
+        %282 = OpAccessChain %_ptr_Function_int %tree %264 %uint_1
+               OpStore %282 %int_5
+        %283 = OpAccessChain %_ptr_Function_BST %tree %int_5
+               OpStore %283 %284
+               OpStore %x_222_phi %true
+               OpBranch %257
+        %281 = OpLabel
+        %285 = OpAccessChain %_ptr_Function_int %tree %264 %uint_1
+        %286 = OpLoad %int %285
+               OpStore %x_220 %286
+        %287 = OpLoad %int %x_220
+               OpStore %x_195_phi %287
+               OpBranch %258
+        %279 = OpLabel
+               OpReturn
+        %275 = OpLabel
+        %288 = OpAccessChain %_ptr_Function_int %tree %264 %uint_2
+        %289 = OpLoad %int %288
+        %290 = OpIEqual %bool %289 %int_n1
+               OpSelectionMerge %291 None
+               OpBranchConditional %290 %292 %293
+        %292 = OpLabel
+        %294 = OpAccessChain %_ptr_Function_int %tree %264 %uint_2
+               OpStore %294 %int_5
+        %295 = OpAccessChain %_ptr_Function_BST %tree %int_5
+               OpStore %295 %284
+               OpStore %x_222_phi %true
+               OpBranch %257
+        %293 = OpLabel
+        %296 = OpAccessChain %_ptr_Function_int %tree %264 %uint_2
+        %297 = OpLoad %int %296
+               OpStore %x_212 %297
+        %298 = OpLoad %int %x_212
+               OpStore %x_195_phi %298
+               OpBranch %258
+        %291 = OpLabel
+               OpReturn
+        %273 = OpLabel
+               OpReturn
+        %258 = OpLabel
+        %299 = OpLoad %int %x_195_phi
+               OpStore %x_195 %299
+        %300 = OpLoad %int %x_195
+               OpStore %x_194_phi %300
+               OpBranch %256
+        %257 = OpLabel
+        %301 = OpLoad %bool %x_222_phi
+               OpSelectionMerge %302 None
+               OpBranchConditional %301 %303 %302
+        %303 = OpLabel
+               OpBranch %254
+        %302 = OpLabel
+               OpBranch %254
+        %254 = OpLabel
+               OpSelectionMerge %306 None
+               OpSwitch %uint_0 %307
+        %307 = OpLabel
+               OpStore %x_227_phi %int_0
+               OpBranch %308
+        %308 = OpLabel
+               OpLoopMerge %309 %310 None
+               OpBranch %311
+        %311 = OpLabel
+        %316 = OpLoad %int %x_227_phi
+               OpStore %x_255_phi %false
+        %318 = OpSLessThanEqual %bool %316 %int_6
+               OpSelectionMerge %319 None
+               OpBranchConditional %318 %320 %321
+        %320 = OpLabel
+               OpBranch %319
+        %321 = OpLabel
+               OpBranch %309
+        %319 = OpLabel
+        %322 = OpAccessChain %_ptr_Function_int %tree %316 %uint_0
+        %323 = OpLoad %int %322
+        %324 = OpSLessThanEqual %bool %int_2 %323
+               OpSelectionMerge %325 None
+               OpBranchConditional %324 %326 %327
+        %326 = OpLabel
+        %328 = OpAccessChain %_ptr_Function_int %tree %316 %uint_1
+        %329 = OpLoad %int %328
+        %330 = OpIEqual %bool %329 %int_n1
+               OpSelectionMerge %331 None
+               OpBranchConditional %330 %332 %333
+        %332 = OpLabel
+        %334 = OpAccessChain %_ptr_Function_int %tree %316 %uint_1
+               OpStore %334 %int_6
+        %335 = OpAccessChain %_ptr_Function_BST %tree %int_6
+               OpStore %335 %336
+               OpStore %x_255_phi %true
+               OpBranch %309
+        %333 = OpLabel
+        %337 = OpAccessChain %_ptr_Function_int %tree %316 %uint_1
+        %338 = OpLoad %int %337
+               OpStore %x_253 %338
+        %339 = OpLoad %int %x_253
+               OpStore %x_228_phi %339
+               OpBranch %310
+        %331 = OpLabel
+               OpReturn
+        %327 = OpLabel
+        %340 = OpAccessChain %_ptr_Function_int %tree %316 %uint_2
+        %341 = OpLoad %int %340
+        %342 = OpIEqual %bool %341 %int_n1
+               OpSelectionMerge %343 None
+               OpBranchConditional %342 %344 %345
+        %344 = OpLabel
+        %346 = OpAccessChain %_ptr_Function_int %tree %316 %uint_2
+               OpStore %346 %int_6
+        %347 = OpAccessChain %_ptr_Function_BST %tree %int_6
+               OpStore %347 %336
+               OpStore %x_255_phi %true
+               OpBranch %309
+        %345 = OpLabel
+        %348 = OpAccessChain %_ptr_Function_int %tree %316 %uint_2
+        %349 = OpLoad %int %348
+               OpStore %x_245 %349
+        %350 = OpLoad %int %x_245
+               OpStore %x_228_phi %350
+               OpBranch %310
+        %343 = OpLabel
+               OpReturn
+        %325 = OpLabel
+               OpReturn
+        %310 = OpLabel
+        %351 = OpLoad %int %x_228_phi
+               OpStore %x_228 %351
+        %352 = OpLoad %int %x_228
+               OpStore %x_227_phi %352
+               OpBranch %308
+        %309 = OpLabel
+        %353 = OpLoad %bool %x_255_phi
+               OpSelectionMerge %354 None
+               OpBranchConditional %353 %355 %354
+        %355 = OpLabel
+               OpBranch %306
+        %354 = OpLabel
+               OpBranch %306
+        %306 = OpLabel
+               OpSelectionMerge %358 None
+               OpSwitch %uint_0 %359
+        %359 = OpLabel
+               OpStore %x_260_phi %int_0
+               OpBranch %360
+        %360 = OpLabel
+               OpLoopMerge %361 %362 None
+               OpBranch %363
+        %363 = OpLabel
+        %368 = OpLoad %int %x_260_phi
+               OpStore %x_288_phi %false
+        %369 = OpSLessThanEqual %bool %368 %int_7
+               OpSelectionMerge %370 None
+               OpBranchConditional %369 %371 %372
+        %371 = OpLabel
+               OpBranch %370
+        %372 = OpLabel
+               OpBranch %361
+        %370 = OpLabel
+        %373 = OpAccessChain %_ptr_Function_int %tree %368 %uint_0
+        %374 = OpLoad %int %373
+        %375 = OpSLessThanEqual %bool %int_6 %374
+               OpSelectionMerge %376 None
+               OpBranchConditional %375 %377 %378
+        %377 = OpLabel
+        %379 = OpAccessChain %_ptr_Function_int %tree %368 %uint_1
+        %380 = OpLoad %int %379
+        %381 = OpIEqual %bool %380 %int_n1
+               OpSelectionMerge %382 None
+               OpBranchConditional %381 %383 %384
+        %383 = OpLabel
+        %385 = OpAccessChain %_ptr_Function_int %tree %368 %uint_1
+               OpStore %385 %int_7
+        %386 = OpAccessChain %_ptr_Function_BST %tree %int_7
+               OpStore %386 %387
+               OpStore %x_288_phi %true
+               OpBranch %361
+        %384 = OpLabel
+        %388 = OpAccessChain %_ptr_Function_int %tree %368 %uint_1
+        %389 = OpLoad %int %388
+               OpStore %x_286 %389
+        %390 = OpLoad %int %x_286
+               OpStore %x_261_phi %390
+               OpBranch %362
+        %382 = OpLabel
+               OpReturn
+        %378 = OpLabel
+        %391 = OpAccessChain %_ptr_Function_int %tree %368 %uint_2
+        %392 = OpLoad %int %391
+        %393 = OpIEqual %bool %392 %int_n1
+               OpSelectionMerge %394 None
+               OpBranchConditional %393 %395 %396
+        %395 = OpLabel
+        %397 = OpAccessChain %_ptr_Function_int %tree %368 %uint_2
+               OpStore %397 %int_7
+        %398 = OpAccessChain %_ptr_Function_BST %tree %int_7
+               OpStore %398 %387
+               OpStore %x_288_phi %true
+               OpBranch %361
+        %396 = OpLabel
+        %399 = OpAccessChain %_ptr_Function_int %tree %368 %uint_2
+        %400 = OpLoad %int %399
+               OpStore %x_278 %400
+        %401 = OpLoad %int %x_278
+               OpStore %x_261_phi %401
+               OpBranch %362
+        %394 = OpLabel
+               OpReturn
+        %376 = OpLabel
+               OpReturn
+        %362 = OpLabel
+        %402 = OpLoad %int %x_261_phi
+               OpStore %x_261 %402
+        %403 = OpLoad %int %x_261
+               OpStore %x_260_phi %403
+               OpBranch %360
+        %361 = OpLabel
+        %404 = OpLoad %bool %x_288_phi
+               OpSelectionMerge %405 None
+               OpBranchConditional %404 %406 %405
+        %406 = OpLabel
+               OpBranch %358
+        %405 = OpLabel
+               OpBranch %358
+        %358 = OpLabel
+               OpSelectionMerge %409 None
+               OpSwitch %uint_0 %410
+        %410 = OpLabel
+               OpStore %x_293_phi %int_0
+               OpBranch %411
+        %411 = OpLabel
+               OpLoopMerge %412 %413 None
+               OpBranch %414
+        %414 = OpLabel
+        %419 = OpLoad %int %x_293_phi
+               OpStore %x_321_phi %false
+        %420 = OpSLessThanEqual %bool %419 %int_8
+               OpSelectionMerge %421 None
+               OpBranchConditional %420 %422 %423
+        %422 = OpLabel
+               OpBranch %421
+        %423 = OpLabel
+               OpBranch %412
+        %421 = OpLabel
+        %424 = OpAccessChain %_ptr_Function_int %tree %419 %uint_0
+        %425 = OpLoad %int %424
+        %427 = OpSLessThanEqual %bool %int_17 %425
+               OpSelectionMerge %428 None
+               OpBranchConditional %427 %429 %430
+        %429 = OpLabel
+        %431 = OpAccessChain %_ptr_Function_int %tree %419 %uint_1
+        %432 = OpLoad %int %431
+        %433 = OpIEqual %bool %432 %int_n1
+               OpSelectionMerge %434 None
+               OpBranchConditional %433 %435 %436
+        %435 = OpLabel
+        %437 = OpAccessChain %_ptr_Function_int %tree %419 %uint_1
+               OpStore %437 %int_8
+        %438 = OpAccessChain %_ptr_Function_BST %tree %int_8
+               OpStore %438 %439
+               OpStore %x_321_phi %true
+               OpBranch %412
+        %436 = OpLabel
+        %440 = OpAccessChain %_ptr_Function_int %tree %419 %uint_1
+        %441 = OpLoad %int %440
+               OpStore %x_319 %441
+        %442 = OpLoad %int %x_319
+               OpStore %x_294_phi %442
+               OpBranch %413
+        %434 = OpLabel
+               OpReturn
+        %430 = OpLabel
+        %443 = OpAccessChain %_ptr_Function_int %tree %419 %uint_2
+        %444 = OpLoad %int %443
+        %445 = OpIEqual %bool %444 %int_n1
+               OpSelectionMerge %446 None
+               OpBranchConditional %445 %447 %448
+        %447 = OpLabel
+        %449 = OpAccessChain %_ptr_Function_int %tree %419 %uint_2
+               OpStore %449 %int_8
+        %450 = OpAccessChain %_ptr_Function_BST %tree %int_8
+               OpStore %450 %439
+               OpStore %x_321_phi %true
+               OpBranch %412
+        %448 = OpLabel
+        %451 = OpAccessChain %_ptr_Function_int %tree %419 %uint_2
+        %452 = OpLoad %int %451
+               OpStore %x_311 %452
+        %453 = OpLoad %int %x_311
+               OpStore %x_294_phi %453
+               OpBranch %413
+        %446 = OpLabel
+               OpReturn
+        %428 = OpLabel
+               OpReturn
+        %413 = OpLabel
+        %454 = OpLoad %int %x_294_phi
+               OpStore %x_294 %454
+        %455 = OpLoad %int %x_294
+               OpStore %x_293_phi %455
+               OpBranch %411
+        %412 = OpLabel
+        %456 = OpLoad %bool %x_321_phi
+               OpSelectionMerge %457 None
+               OpBranchConditional %456 %458 %457
+        %458 = OpLabel
+               OpBranch %409
+        %457 = OpLabel
+               OpBranch %409
+        %409 = OpLabel
+               OpSelectionMerge %461 None
+               OpSwitch %uint_0 %462
+        %462 = OpLabel
+               OpStore %x_326_phi %int_0
+               OpBranch %463
+        %463 = OpLabel
+               OpLoopMerge %464 %465 None
+               OpBranch %466
+        %466 = OpLabel
+        %471 = OpLoad %int %x_326_phi
+               OpStore %x_354_phi %false
+        %472 = OpSLessThanEqual %bool %471 %int_9
+               OpSelectionMerge %473 None
+               OpBranchConditional %472 %474 %475
+        %474 = OpLabel
+               OpBranch %473
+        %475 = OpLabel
+               OpBranch %464
+        %473 = OpLabel
+        %476 = OpAccessChain %_ptr_Function_int %tree %471 %uint_0
+        %477 = OpLoad %int %476
+        %479 = OpSLessThanEqual %bool %int_13 %477
+               OpSelectionMerge %480 None
+               OpBranchConditional %479 %481 %482
+        %481 = OpLabel
+        %483 = OpAccessChain %_ptr_Function_int %tree %471 %uint_1
+        %484 = OpLoad %int %483
+        %485 = OpIEqual %bool %484 %int_n1
+               OpSelectionMerge %486 None
+               OpBranchConditional %485 %487 %488
+        %487 = OpLabel
+        %489 = OpAccessChain %_ptr_Function_int %tree %471 %uint_1
+               OpStore %489 %int_9
+        %490 = OpAccessChain %_ptr_Function_BST %tree %int_9
+               OpStore %490 %491
+               OpStore %x_354_phi %true
+               OpBranch %464
+        %488 = OpLabel
+        %492 = OpAccessChain %_ptr_Function_int %tree %471 %uint_1
+        %493 = OpLoad %int %492
+               OpStore %x_352 %493
+        %494 = OpLoad %int %x_352
+               OpStore %x_327_phi %494
+               OpBranch %465
+        %486 = OpLabel
+               OpReturn
+        %482 = OpLabel
+        %495 = OpAccessChain %_ptr_Function_int %tree %471 %uint_2
+        %496 = OpLoad %int %495
+        %497 = OpIEqual %bool %496 %int_n1
+               OpSelectionMerge %498 None
+               OpBranchConditional %497 %499 %500
+        %499 = OpLabel
+        %501 = OpAccessChain %_ptr_Function_int %tree %471 %uint_2
+               OpStore %501 %int_9
+        %502 = OpAccessChain %_ptr_Function_BST %tree %int_9
+               OpStore %502 %491
+               OpStore %x_354_phi %true
+               OpBranch %464
+        %500 = OpLabel
+        %503 = OpAccessChain %_ptr_Function_int %tree %471 %uint_2
+        %504 = OpLoad %int %503
+               OpStore %x_344 %504
+        %505 = OpLoad %int %x_344
+               OpStore %x_327_phi %505
+               OpBranch %465
+        %498 = OpLabel
+               OpReturn
+        %480 = OpLabel
+               OpReturn
+        %465 = OpLabel
+        %506 = OpLoad %int %x_327_phi
+               OpStore %x_327 %506
+        %507 = OpLoad %int %x_327
+               OpStore %x_326_phi %507
+               OpBranch %463
+        %464 = OpLabel
+        %508 = OpLoad %bool %x_354_phi
+               OpSelectionMerge %509 None
+               OpBranchConditional %508 %510 %509
+        %510 = OpLabel
+               OpBranch %461
+        %509 = OpLabel
+               OpBranch %461
+        %461 = OpLabel
+               OpStore %x_357_phi %int_0
+               OpStore %x_360_phi %int_0
+               OpStore %x_362_phi %int_0
+               OpBranch %511
+        %511 = OpLabel
+               OpLoopMerge %512 %513 None
+               OpBranch %514
+        %514 = OpLabel
+        %521 = OpLoad %int %x_357_phi
+        %522 = OpLoad %int %x_360_phi
+               OpStore %x_360 %522
+        %523 = OpLoad %int %x_362_phi
+        %524 = OpISub %int %int_6 %int_15
+        %526 = OpSLessThan %bool %523 %int_20
+               OpSelectionMerge %527 None
+               OpBranchConditional %526 %528 %529
+        %528 = OpLabel
+               OpBranch %527
+        %529 = OpLabel
+               OpBranch %512
+        %527 = OpLabel
+               OpSelectionMerge %533 None
+               OpSwitch %uint_0 %534
+        %534 = OpLabel
+               OpStore %x_374_phi %int_0
+               OpBranch %535
+        %535 = OpLabel
+               OpLoopMerge %536 %537 None
+               OpBranch %538
+        %538 = OpLabel
+        %539 = OpLoad %int %x_374_phi
+               OpStore %x_392_phi %521
+               OpStore %x_393_phi %false
+        %540 = OpINotEqual %bool %539 %int_n1
+               OpSelectionMerge %541 None
+               OpBranchConditional %540 %542 %543
+        %542 = OpLabel
+               OpBranch %541
+        %543 = OpLabel
+               OpBranch %536
+        %541 = OpLabel
+        %544 = OpAccessChain %_ptr_Function_BST %tree %539
+        %545 = OpLoad %BST %544
+        %546 = OpCompositeExtract %int %545 0
+        %547 = OpCompositeExtract %int %545 1
+        %548 = OpCompositeExtract %int %545 2
+        %549 = OpIEqual %bool %546 %523
+               OpSelectionMerge %550 None
+               OpBranchConditional %549 %551 %550
+        %551 = OpLabel
+               OpStore %x_392_phi %523
+               OpStore %x_393_phi %true
+               OpBranch %536
+        %550 = OpLabel
+        %554 = OpULessThanEqual %bool %uint_3 %uint_3
+        %552 = OpSelect %uint %554 %uint_3 %uint_3
+        %556 = OpAccessChain %_ptr_Private_float %x_GLF_color %552
+        %557 = OpLoad %float %556
+               OpBranch %537
+        %537 = OpLabel
+        %560 = OpSLessThanEqual %bool %523 %546
+        %559 = OpLogicalNot %bool %560
+        %558 = OpSelect %int %559 %548 %547
+               OpStore %x_374_phi %558
+               OpBranch %535
+        %536 = OpLabel
+        %561 = OpLoad %int %x_392_phi
+               OpStore %x_392 %561
+        %562 = OpLoad %bool %x_393_phi
+        %563 = OpLoad %int %x_392
+               OpStore %x_358_phi %563
+               OpSelectionMerge %564 None
+               OpBranchConditional %562 %565 %564
+        %565 = OpLabel
+               OpBranch %533
+        %564 = OpLabel
+               OpStore %x_358_phi %int_n1
+               OpBranch %533
+        %533 = OpLabel
+        %571 = OpLoad %int %x_358_phi
+               OpStore %x_358 %571
+               OpSelectionMerge %572 None
+               OpSwitch %523 %573 2 %574 5 %574 6 %574 7 %574 8 %574 9 %574 12 %574 13 %574 15 %574 17 %574
+        %574 = OpLabel
+        %575 = OpLoad %int %x_360
+               OpStore %x_402_phi %575
+        %576 = OpLoad %int %x_358
+        %577 = OpCopyObject %int %523
+        %578 = OpIEqual %bool %576 %577
+               OpSelectionMerge %579 None
+               OpBranchConditional %578 %580 %579
+        %580 = OpLabel
+        %582 = OpLoad %int %x_360
+        %583 = OpCopyObject %int %int_1
+        %584 = OpIAdd %int %582 %583
+        %581 = OpCopyObject %int %584
+               OpStore %x_401 %581
+        %585 = OpLoad %int %x_401
+               OpStore %x_402_phi %585
+               OpBranch %579
+        %579 = OpLabel
+        %586 = OpLoad %int %x_402_phi
+               OpStore %x_402 %586
+        %587 = OpLoad %int %x_402
+               OpStore %x_361_phi %587
+               OpBranch %572
+        %573 = OpLabel
+        %588 = OpLoad %int %x_360
+               OpStore %x_407_phi %588
+        %589 = OpLoad %int %x_358
+        %590 = OpCopyObject %int %int_n1
+        %591 = OpIEqual %bool %589 %590
+               OpSelectionMerge %592 None
+               OpBranchConditional %591 %593 %592
+        %593 = OpLabel
+        %595 = OpLoad %int %x_360
+        %596 = OpCopyObject %int %int_1
+        %597 = OpIAdd %int %595 %596
+        %594 = OpCopyObject %int %597
+               OpStore %x_406 %594
+        %598 = OpLoad %int %x_406
+               OpStore %x_407_phi %598
+               OpBranch %592
+        %592 = OpLabel
+        %599 = OpLoad %int %x_407_phi
+               OpStore %x_407 %599
+        %600 = OpLoad %int %x_407
+               OpStore %x_361_phi %600
+               OpBranch %572
+        %572 = OpLabel
+        %601 = OpLoad %int %x_361_phi
+               OpBranch %513
+        %513 = OpLabel
+        %602 = OpIAdd %int %523 %int_1
+               OpStore %x_363 %602
+        %603 = OpLoad %int %x_358
+               OpStore %x_357_phi %603
+               OpStore %x_360_phi %601
+        %604 = OpLoad %int %x_363
+               OpStore %x_362_phi %604
+               OpBranch %511
+        %512 = OpLabel
+        %605 = OpLoad %int %x_360
+        %606 = OpCopyObject %int %int_20
+        %607 = OpIEqual %bool %605 %606
+               OpSelectionMerge %608 None
+               OpBranchConditional %607 %609 %610
+        %609 = OpLabel
+               OpStore %x_GLF_color %613
+               OpBranch %608
+        %610 = OpLabel
+               OpStore %x_GLF_color %614
+               OpBranch %608
+        %608 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %615
+%tint_symbol = OpFunctionParameter %main_out
+        %619 = OpLabel
+        %620 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %620
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+        %622 = OpLabel
+        %623 = OpFunctionCall %void %main_1
+        %625 = OpLoad %v4float %x_GLF_color
+        %626 = OpCompositeConstruct %main_out %625
+        %624 = OpFunctionCall %void %tint_symbol_2 %626
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-load-from-frag-color/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-load-from-frag-color/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..0c19b19
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-load-from-frag-color/1.spvasm.expected.wgsl
@@ -0,0 +1,655 @@
+struct BST {
+  data : i32;
+  leftIndex : i32;
+  rightIndex : i32;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var tree : array<BST, 10>;
+  var x_360 : i32;
+  var x_62_phi : i32;
+  var x_90_phi : bool;
+  var x_357_phi : i32;
+  var x_360_phi : i32;
+  var x_362_phi : i32;
+  tree[0] = BST(9, -1, -1);
+  switch(0u) {
+    default: {
+      x_62_phi = 0;
+      loop {
+        var x_88 : i32;
+        var x_80 : i32;
+        var x_63 : i32;
+        var x_63_phi : i32;
+        let x_62 : i32 = x_62_phi;
+        x_90_phi = false;
+        if ((x_62 <= 1)) {
+        } else {
+          break;
+        }
+        let x_69 : i32 = tree[x_62].data;
+        if ((5 <= x_69)) {
+          let x_82 : ptr<function, i32> = &(tree[x_62].leftIndex);
+          let x_83 : i32 = *(x_82);
+          if ((x_83 == -1)) {
+            *(x_82) = 1;
+            tree[1] = BST(5, -1, -1);
+            x_90_phi = true;
+            break;
+          } else {
+            x_88 = *(x_82);
+            x_63_phi = x_88;
+            continue;
+          }
+          return;
+        } else {
+          let x_74 : ptr<function, i32> = &(tree[x_62].rightIndex);
+          let x_75 : i32 = *(x_74);
+          if ((x_75 == -1)) {
+            *(x_74) = 1;
+            tree[1] = BST(5, -1, -1);
+            x_90_phi = true;
+            break;
+          } else {
+            x_80 = *(x_74);
+            x_63_phi = x_80;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_63 = x_63_phi;
+          x_62_phi = x_63;
+        }
+      }
+      let x_90 : bool = x_90_phi;
+      if (x_90) {
+        break;
+      }
+    }
+  }
+  var x_95_phi : i32;
+  var x_123_phi : bool;
+  switch(0u) {
+    default: {
+      x_95_phi = 0;
+      loop {
+        var x_121 : i32;
+        var x_113 : i32;
+        var x_96 : i32;
+        var x_96_phi : i32;
+        let x_95 : i32 = x_95_phi;
+        x_123_phi = false;
+        if ((x_95 <= 2)) {
+        } else {
+          break;
+        }
+        let x_102 : i32 = tree[x_95].data;
+        if ((12 <= x_102)) {
+          let x_115 : ptr<function, i32> = &(tree[x_95].leftIndex);
+          let x_116 : i32 = *(x_115);
+          if ((x_116 == -1)) {
+            *(x_115) = 2;
+            tree[2] = BST(12, -1, -1);
+            x_123_phi = true;
+            break;
+          } else {
+            x_121 = *(x_115);
+            x_96_phi = x_121;
+            continue;
+          }
+          return;
+        } else {
+          let x_107 : ptr<function, i32> = &(tree[x_95].rightIndex);
+          let x_108 : i32 = *(x_107);
+          if ((x_108 == -1)) {
+            *(x_107) = 2;
+            tree[2] = BST(12, -1, -1);
+            x_123_phi = true;
+            break;
+          } else {
+            x_113 = *(x_107);
+            x_96_phi = x_113;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_96 = x_96_phi;
+          x_95_phi = x_96;
+        }
+      }
+      let x_123 : bool = x_123_phi;
+      if (x_123) {
+        break;
+      }
+    }
+  }
+  var x_128_phi : i32;
+  var x_156_phi : bool;
+  switch(0u) {
+    default: {
+      x_128_phi = 0;
+      loop {
+        var x_154 : i32;
+        var x_146 : i32;
+        var x_129 : i32;
+        var x_129_phi : i32;
+        let x_128 : i32 = x_128_phi;
+        x_156_phi = false;
+        if ((x_128 <= 3)) {
+        } else {
+          break;
+        }
+        let x_135 : i32 = tree[x_128].data;
+        if ((15 <= x_135)) {
+          let x_148 : ptr<function, i32> = &(tree[x_128].leftIndex);
+          let x_149 : i32 = *(x_148);
+          if ((x_149 == -1)) {
+            *(x_148) = 3;
+            tree[3] = BST(15, -1, -1);
+            x_156_phi = true;
+            break;
+          } else {
+            x_154 = *(x_148);
+            x_129_phi = x_154;
+            continue;
+          }
+          return;
+        } else {
+          let x_140 : ptr<function, i32> = &(tree[x_128].rightIndex);
+          let x_141 : i32 = *(x_140);
+          if ((x_141 == -1)) {
+            *(x_140) = 3;
+            tree[3] = BST(15, -1, -1);
+            x_156_phi = true;
+            break;
+          } else {
+            x_146 = *(x_140);
+            x_129_phi = x_146;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_129 = x_129_phi;
+          x_128_phi = x_129;
+        }
+      }
+      let x_156 : bool = x_156_phi;
+      if (x_156) {
+        break;
+      }
+    }
+  }
+  var x_161_phi : i32;
+  var x_189_phi : bool;
+  switch(0u) {
+    default: {
+      x_161_phi = 0;
+      loop {
+        var x_187 : i32;
+        var x_179 : i32;
+        var x_162 : i32;
+        var x_162_phi : i32;
+        let x_161 : i32 = x_161_phi;
+        x_189_phi = false;
+        if ((x_161 <= 4)) {
+        } else {
+          break;
+        }
+        let x_168 : i32 = tree[x_161].data;
+        if ((7 <= x_168)) {
+          let x_181 : ptr<function, i32> = &(tree[x_161].leftIndex);
+          let x_182 : i32 = *(x_181);
+          if ((x_182 == -1)) {
+            *(x_181) = 4;
+            tree[4] = BST(7, -1, -1);
+            x_189_phi = true;
+            break;
+          } else {
+            x_187 = *(x_181);
+            x_162_phi = x_187;
+            continue;
+          }
+          return;
+        } else {
+          let x_173 : ptr<function, i32> = &(tree[x_161].rightIndex);
+          let x_174 : i32 = *(x_173);
+          if ((x_174 == -1)) {
+            *(x_173) = 4;
+            tree[4] = BST(7, -1, -1);
+            x_189_phi = true;
+            break;
+          } else {
+            x_179 = *(x_173);
+            x_162_phi = x_179;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_162 = x_162_phi;
+          x_161_phi = x_162;
+        }
+      }
+      let x_189 : bool = x_189_phi;
+      if (x_189) {
+        break;
+      }
+    }
+  }
+  var x_194_phi : i32;
+  var x_222_phi : bool;
+  switch(0u) {
+    default: {
+      x_194_phi = 0;
+      loop {
+        var x_220 : i32;
+        var x_212 : i32;
+        var x_195 : i32;
+        var x_195_phi : i32;
+        let x_194 : i32 = x_194_phi;
+        x_222_phi = false;
+        if ((x_194 <= 5)) {
+        } else {
+          break;
+        }
+        let x_201 : i32 = tree[x_194].data;
+        if ((8 <= x_201)) {
+          let x_214 : ptr<function, i32> = &(tree[x_194].leftIndex);
+          let x_215 : i32 = *(x_214);
+          if ((x_215 == -1)) {
+            *(x_214) = 5;
+            tree[5] = BST(8, -1, -1);
+            x_222_phi = true;
+            break;
+          } else {
+            x_220 = *(x_214);
+            x_195_phi = x_220;
+            continue;
+          }
+          return;
+        } else {
+          let x_206 : ptr<function, i32> = &(tree[x_194].rightIndex);
+          let x_207 : i32 = *(x_206);
+          if ((x_207 == -1)) {
+            *(x_206) = 5;
+            tree[5] = BST(8, -1, -1);
+            x_222_phi = true;
+            break;
+          } else {
+            x_212 = *(x_206);
+            x_195_phi = x_212;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_195 = x_195_phi;
+          x_194_phi = x_195;
+        }
+      }
+      let x_222 : bool = x_222_phi;
+      if (x_222) {
+        break;
+      }
+    }
+  }
+  var x_227_phi : i32;
+  var x_255_phi : bool;
+  switch(0u) {
+    default: {
+      x_227_phi = 0;
+      loop {
+        var x_253 : i32;
+        var x_245 : i32;
+        var x_228 : i32;
+        var x_228_phi : i32;
+        let x_227 : i32 = x_227_phi;
+        x_255_phi = false;
+        if ((x_227 <= 6)) {
+        } else {
+          break;
+        }
+        let x_234 : i32 = tree[x_227].data;
+        if ((2 <= x_234)) {
+          let x_247 : ptr<function, i32> = &(tree[x_227].leftIndex);
+          let x_248 : i32 = *(x_247);
+          if ((x_248 == -1)) {
+            *(x_247) = 6;
+            tree[6] = BST(2, -1, -1);
+            x_255_phi = true;
+            break;
+          } else {
+            x_253 = *(x_247);
+            x_228_phi = x_253;
+            continue;
+          }
+          return;
+        } else {
+          let x_239 : ptr<function, i32> = &(tree[x_227].rightIndex);
+          let x_240 : i32 = *(x_239);
+          if ((x_240 == -1)) {
+            *(x_239) = 6;
+            tree[6] = BST(2, -1, -1);
+            x_255_phi = true;
+            break;
+          } else {
+            x_245 = *(x_239);
+            x_228_phi = x_245;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_228 = x_228_phi;
+          x_227_phi = x_228;
+        }
+      }
+      let x_255 : bool = x_255_phi;
+      if (x_255) {
+        break;
+      }
+    }
+  }
+  var x_260_phi : i32;
+  var x_288_phi : bool;
+  switch(0u) {
+    default: {
+      x_260_phi = 0;
+      loop {
+        var x_286 : i32;
+        var x_278 : i32;
+        var x_261 : i32;
+        var x_261_phi : i32;
+        let x_260 : i32 = x_260_phi;
+        x_288_phi = false;
+        if ((x_260 <= 7)) {
+        } else {
+          break;
+        }
+        let x_267 : i32 = tree[x_260].data;
+        if ((6 <= x_267)) {
+          let x_280 : ptr<function, i32> = &(tree[x_260].leftIndex);
+          let x_281 : i32 = *(x_280);
+          if ((x_281 == -1)) {
+            *(x_280) = 7;
+            tree[7] = BST(6, -1, -1);
+            x_288_phi = true;
+            break;
+          } else {
+            x_286 = *(x_280);
+            x_261_phi = x_286;
+            continue;
+          }
+          return;
+        } else {
+          let x_272 : ptr<function, i32> = &(tree[x_260].rightIndex);
+          let x_273 : i32 = *(x_272);
+          if ((x_273 == -1)) {
+            *(x_272) = 7;
+            tree[7] = BST(6, -1, -1);
+            x_288_phi = true;
+            break;
+          } else {
+            x_278 = *(x_272);
+            x_261_phi = x_278;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_261 = x_261_phi;
+          x_260_phi = x_261;
+        }
+      }
+      let x_288 : bool = x_288_phi;
+      if (x_288) {
+        break;
+      }
+    }
+  }
+  var x_293_phi : i32;
+  var x_321_phi : bool;
+  switch(0u) {
+    default: {
+      x_293_phi = 0;
+      loop {
+        var x_319 : i32;
+        var x_311 : i32;
+        var x_294 : i32;
+        var x_294_phi : i32;
+        let x_293 : i32 = x_293_phi;
+        x_321_phi = false;
+        if ((x_293 <= 8)) {
+        } else {
+          break;
+        }
+        let x_300 : i32 = tree[x_293].data;
+        if ((17 <= x_300)) {
+          let x_313 : ptr<function, i32> = &(tree[x_293].leftIndex);
+          let x_314 : i32 = *(x_313);
+          if ((x_314 == -1)) {
+            *(x_313) = 8;
+            tree[8] = BST(17, -1, -1);
+            x_321_phi = true;
+            break;
+          } else {
+            x_319 = *(x_313);
+            x_294_phi = x_319;
+            continue;
+          }
+          return;
+        } else {
+          let x_305 : ptr<function, i32> = &(tree[x_293].rightIndex);
+          let x_306 : i32 = *(x_305);
+          if ((x_306 == -1)) {
+            *(x_305) = 8;
+            tree[8] = BST(17, -1, -1);
+            x_321_phi = true;
+            break;
+          } else {
+            x_311 = *(x_305);
+            x_294_phi = x_311;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_294 = x_294_phi;
+          x_293_phi = x_294;
+        }
+      }
+      let x_321 : bool = x_321_phi;
+      if (x_321) {
+        break;
+      }
+    }
+  }
+  var x_326_phi : i32;
+  var x_354_phi : bool;
+  switch(0u) {
+    default: {
+      x_326_phi = 0;
+      loop {
+        var x_352 : i32;
+        var x_344 : i32;
+        var x_327 : i32;
+        var x_327_phi : i32;
+        let x_326 : i32 = x_326_phi;
+        x_354_phi = false;
+        if ((x_326 <= 9)) {
+        } else {
+          break;
+        }
+        let x_333 : i32 = tree[x_326].data;
+        if ((13 <= x_333)) {
+          let x_346 : ptr<function, i32> = &(tree[x_326].leftIndex);
+          let x_347 : i32 = *(x_346);
+          if ((x_347 == -1)) {
+            *(x_346) = 9;
+            tree[9] = BST(13, -1, -1);
+            x_354_phi = true;
+            break;
+          } else {
+            x_352 = *(x_346);
+            x_327_phi = x_352;
+            continue;
+          }
+          return;
+        } else {
+          let x_338 : ptr<function, i32> = &(tree[x_326].rightIndex);
+          let x_339 : i32 = *(x_338);
+          if ((x_339 == -1)) {
+            *(x_338) = 9;
+            tree[9] = BST(13, -1, -1);
+            x_354_phi = true;
+            break;
+          } else {
+            x_344 = *(x_338);
+            x_327_phi = x_344;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_327 = x_327_phi;
+          x_326_phi = x_327;
+        }
+      }
+      let x_354 : bool = x_354_phi;
+      if (x_354) {
+        break;
+      }
+    }
+  }
+  x_357_phi = 0;
+  x_360_phi = 0;
+  x_362_phi = 0;
+  loop {
+    var x_392 : i32;
+    var x_402 : i32;
+    var x_407 : i32;
+    var x_363 : i32;
+    var x_358_phi : i32;
+    var x_361_phi : i32;
+    let x_357 : i32 = x_357_phi;
+    x_360 = x_360_phi;
+    let x_362 : i32 = x_362_phi;
+    let x_365 : i32 = (6 - 15);
+    if ((x_362 < 20)) {
+    } else {
+      break;
+    }
+    var x_374_phi : i32;
+    var x_392_phi : i32;
+    var x_393_phi : bool;
+    switch(0u) {
+      default: {
+        x_374_phi = 0;
+        loop {
+          let x_374 : i32 = x_374_phi;
+          x_392_phi = x_357;
+          x_393_phi = false;
+          if ((x_374 != -1)) {
+          } else {
+            break;
+          }
+          let x_381 : BST = tree[x_374];
+          let x_382 : i32 = x_381.data;
+          let x_383 : i32 = x_381.leftIndex;
+          let x_385 : i32 = x_381.rightIndex;
+          if ((x_382 == x_362)) {
+            x_392_phi = x_362;
+            x_393_phi = true;
+            break;
+          }
+          let x_389 : f32 = x_GLF_color[select(3u, 3u, (3u <= 3u))];
+
+          continuing {
+            x_374_phi = select(x_383, x_385, !((x_362 <= x_382)));
+          }
+        }
+        x_392 = x_392_phi;
+        let x_393 : bool = x_393_phi;
+        x_358_phi = x_392;
+        if (x_393) {
+          break;
+        }
+        x_358_phi = -1;
+      }
+    }
+    var x_358 : i32;
+    var x_401 : i32;
+    var x_406 : i32;
+    var x_402_phi : i32;
+    var x_407_phi : i32;
+    x_358 = x_358_phi;
+    switch(x_362) {
+      case 2, 5, 6, 7, 8, 9, 12, 13, 15, 17: {
+        x_402_phi = x_360;
+        if ((x_358 == bitcast<i32>(x_362))) {
+          x_401 = bitcast<i32>((x_360 + bitcast<i32>(1)));
+          x_402_phi = x_401;
+        }
+        x_402 = x_402_phi;
+        x_361_phi = x_402;
+      }
+      default: {
+        x_407_phi = x_360;
+        if ((x_358 == bitcast<i32>(-1))) {
+          x_406 = bitcast<i32>((x_360 + bitcast<i32>(1)));
+          x_407_phi = x_406;
+        }
+        x_407 = x_407_phi;
+        x_361_phi = x_407;
+      }
+    }
+    let x_361 : i32 = x_361_phi;
+
+    continuing {
+      x_363 = (x_362 + 1);
+      x_357_phi = x_358;
+      x_360_phi = x_361;
+      x_362_phi = x_363;
+    }
+  }
+  if ((x_360 == bitcast<i32>(20))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-load-from-frag-color/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-load-from-frag-color/1.wgsl
new file mode 100644
index 0000000..0c19b19
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-load-from-frag-color/1.wgsl
@@ -0,0 +1,655 @@
+struct BST {
+  data : i32;
+  leftIndex : i32;
+  rightIndex : i32;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var tree : array<BST, 10>;
+  var x_360 : i32;
+  var x_62_phi : i32;
+  var x_90_phi : bool;
+  var x_357_phi : i32;
+  var x_360_phi : i32;
+  var x_362_phi : i32;
+  tree[0] = BST(9, -1, -1);
+  switch(0u) {
+    default: {
+      x_62_phi = 0;
+      loop {
+        var x_88 : i32;
+        var x_80 : i32;
+        var x_63 : i32;
+        var x_63_phi : i32;
+        let x_62 : i32 = x_62_phi;
+        x_90_phi = false;
+        if ((x_62 <= 1)) {
+        } else {
+          break;
+        }
+        let x_69 : i32 = tree[x_62].data;
+        if ((5 <= x_69)) {
+          let x_82 : ptr<function, i32> = &(tree[x_62].leftIndex);
+          let x_83 : i32 = *(x_82);
+          if ((x_83 == -1)) {
+            *(x_82) = 1;
+            tree[1] = BST(5, -1, -1);
+            x_90_phi = true;
+            break;
+          } else {
+            x_88 = *(x_82);
+            x_63_phi = x_88;
+            continue;
+          }
+          return;
+        } else {
+          let x_74 : ptr<function, i32> = &(tree[x_62].rightIndex);
+          let x_75 : i32 = *(x_74);
+          if ((x_75 == -1)) {
+            *(x_74) = 1;
+            tree[1] = BST(5, -1, -1);
+            x_90_phi = true;
+            break;
+          } else {
+            x_80 = *(x_74);
+            x_63_phi = x_80;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_63 = x_63_phi;
+          x_62_phi = x_63;
+        }
+      }
+      let x_90 : bool = x_90_phi;
+      if (x_90) {
+        break;
+      }
+    }
+  }
+  var x_95_phi : i32;
+  var x_123_phi : bool;
+  switch(0u) {
+    default: {
+      x_95_phi = 0;
+      loop {
+        var x_121 : i32;
+        var x_113 : i32;
+        var x_96 : i32;
+        var x_96_phi : i32;
+        let x_95 : i32 = x_95_phi;
+        x_123_phi = false;
+        if ((x_95 <= 2)) {
+        } else {
+          break;
+        }
+        let x_102 : i32 = tree[x_95].data;
+        if ((12 <= x_102)) {
+          let x_115 : ptr<function, i32> = &(tree[x_95].leftIndex);
+          let x_116 : i32 = *(x_115);
+          if ((x_116 == -1)) {
+            *(x_115) = 2;
+            tree[2] = BST(12, -1, -1);
+            x_123_phi = true;
+            break;
+          } else {
+            x_121 = *(x_115);
+            x_96_phi = x_121;
+            continue;
+          }
+          return;
+        } else {
+          let x_107 : ptr<function, i32> = &(tree[x_95].rightIndex);
+          let x_108 : i32 = *(x_107);
+          if ((x_108 == -1)) {
+            *(x_107) = 2;
+            tree[2] = BST(12, -1, -1);
+            x_123_phi = true;
+            break;
+          } else {
+            x_113 = *(x_107);
+            x_96_phi = x_113;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_96 = x_96_phi;
+          x_95_phi = x_96;
+        }
+      }
+      let x_123 : bool = x_123_phi;
+      if (x_123) {
+        break;
+      }
+    }
+  }
+  var x_128_phi : i32;
+  var x_156_phi : bool;
+  switch(0u) {
+    default: {
+      x_128_phi = 0;
+      loop {
+        var x_154 : i32;
+        var x_146 : i32;
+        var x_129 : i32;
+        var x_129_phi : i32;
+        let x_128 : i32 = x_128_phi;
+        x_156_phi = false;
+        if ((x_128 <= 3)) {
+        } else {
+          break;
+        }
+        let x_135 : i32 = tree[x_128].data;
+        if ((15 <= x_135)) {
+          let x_148 : ptr<function, i32> = &(tree[x_128].leftIndex);
+          let x_149 : i32 = *(x_148);
+          if ((x_149 == -1)) {
+            *(x_148) = 3;
+            tree[3] = BST(15, -1, -1);
+            x_156_phi = true;
+            break;
+          } else {
+            x_154 = *(x_148);
+            x_129_phi = x_154;
+            continue;
+          }
+          return;
+        } else {
+          let x_140 : ptr<function, i32> = &(tree[x_128].rightIndex);
+          let x_141 : i32 = *(x_140);
+          if ((x_141 == -1)) {
+            *(x_140) = 3;
+            tree[3] = BST(15, -1, -1);
+            x_156_phi = true;
+            break;
+          } else {
+            x_146 = *(x_140);
+            x_129_phi = x_146;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_129 = x_129_phi;
+          x_128_phi = x_129;
+        }
+      }
+      let x_156 : bool = x_156_phi;
+      if (x_156) {
+        break;
+      }
+    }
+  }
+  var x_161_phi : i32;
+  var x_189_phi : bool;
+  switch(0u) {
+    default: {
+      x_161_phi = 0;
+      loop {
+        var x_187 : i32;
+        var x_179 : i32;
+        var x_162 : i32;
+        var x_162_phi : i32;
+        let x_161 : i32 = x_161_phi;
+        x_189_phi = false;
+        if ((x_161 <= 4)) {
+        } else {
+          break;
+        }
+        let x_168 : i32 = tree[x_161].data;
+        if ((7 <= x_168)) {
+          let x_181 : ptr<function, i32> = &(tree[x_161].leftIndex);
+          let x_182 : i32 = *(x_181);
+          if ((x_182 == -1)) {
+            *(x_181) = 4;
+            tree[4] = BST(7, -1, -1);
+            x_189_phi = true;
+            break;
+          } else {
+            x_187 = *(x_181);
+            x_162_phi = x_187;
+            continue;
+          }
+          return;
+        } else {
+          let x_173 : ptr<function, i32> = &(tree[x_161].rightIndex);
+          let x_174 : i32 = *(x_173);
+          if ((x_174 == -1)) {
+            *(x_173) = 4;
+            tree[4] = BST(7, -1, -1);
+            x_189_phi = true;
+            break;
+          } else {
+            x_179 = *(x_173);
+            x_162_phi = x_179;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_162 = x_162_phi;
+          x_161_phi = x_162;
+        }
+      }
+      let x_189 : bool = x_189_phi;
+      if (x_189) {
+        break;
+      }
+    }
+  }
+  var x_194_phi : i32;
+  var x_222_phi : bool;
+  switch(0u) {
+    default: {
+      x_194_phi = 0;
+      loop {
+        var x_220 : i32;
+        var x_212 : i32;
+        var x_195 : i32;
+        var x_195_phi : i32;
+        let x_194 : i32 = x_194_phi;
+        x_222_phi = false;
+        if ((x_194 <= 5)) {
+        } else {
+          break;
+        }
+        let x_201 : i32 = tree[x_194].data;
+        if ((8 <= x_201)) {
+          let x_214 : ptr<function, i32> = &(tree[x_194].leftIndex);
+          let x_215 : i32 = *(x_214);
+          if ((x_215 == -1)) {
+            *(x_214) = 5;
+            tree[5] = BST(8, -1, -1);
+            x_222_phi = true;
+            break;
+          } else {
+            x_220 = *(x_214);
+            x_195_phi = x_220;
+            continue;
+          }
+          return;
+        } else {
+          let x_206 : ptr<function, i32> = &(tree[x_194].rightIndex);
+          let x_207 : i32 = *(x_206);
+          if ((x_207 == -1)) {
+            *(x_206) = 5;
+            tree[5] = BST(8, -1, -1);
+            x_222_phi = true;
+            break;
+          } else {
+            x_212 = *(x_206);
+            x_195_phi = x_212;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_195 = x_195_phi;
+          x_194_phi = x_195;
+        }
+      }
+      let x_222 : bool = x_222_phi;
+      if (x_222) {
+        break;
+      }
+    }
+  }
+  var x_227_phi : i32;
+  var x_255_phi : bool;
+  switch(0u) {
+    default: {
+      x_227_phi = 0;
+      loop {
+        var x_253 : i32;
+        var x_245 : i32;
+        var x_228 : i32;
+        var x_228_phi : i32;
+        let x_227 : i32 = x_227_phi;
+        x_255_phi = false;
+        if ((x_227 <= 6)) {
+        } else {
+          break;
+        }
+        let x_234 : i32 = tree[x_227].data;
+        if ((2 <= x_234)) {
+          let x_247 : ptr<function, i32> = &(tree[x_227].leftIndex);
+          let x_248 : i32 = *(x_247);
+          if ((x_248 == -1)) {
+            *(x_247) = 6;
+            tree[6] = BST(2, -1, -1);
+            x_255_phi = true;
+            break;
+          } else {
+            x_253 = *(x_247);
+            x_228_phi = x_253;
+            continue;
+          }
+          return;
+        } else {
+          let x_239 : ptr<function, i32> = &(tree[x_227].rightIndex);
+          let x_240 : i32 = *(x_239);
+          if ((x_240 == -1)) {
+            *(x_239) = 6;
+            tree[6] = BST(2, -1, -1);
+            x_255_phi = true;
+            break;
+          } else {
+            x_245 = *(x_239);
+            x_228_phi = x_245;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_228 = x_228_phi;
+          x_227_phi = x_228;
+        }
+      }
+      let x_255 : bool = x_255_phi;
+      if (x_255) {
+        break;
+      }
+    }
+  }
+  var x_260_phi : i32;
+  var x_288_phi : bool;
+  switch(0u) {
+    default: {
+      x_260_phi = 0;
+      loop {
+        var x_286 : i32;
+        var x_278 : i32;
+        var x_261 : i32;
+        var x_261_phi : i32;
+        let x_260 : i32 = x_260_phi;
+        x_288_phi = false;
+        if ((x_260 <= 7)) {
+        } else {
+          break;
+        }
+        let x_267 : i32 = tree[x_260].data;
+        if ((6 <= x_267)) {
+          let x_280 : ptr<function, i32> = &(tree[x_260].leftIndex);
+          let x_281 : i32 = *(x_280);
+          if ((x_281 == -1)) {
+            *(x_280) = 7;
+            tree[7] = BST(6, -1, -1);
+            x_288_phi = true;
+            break;
+          } else {
+            x_286 = *(x_280);
+            x_261_phi = x_286;
+            continue;
+          }
+          return;
+        } else {
+          let x_272 : ptr<function, i32> = &(tree[x_260].rightIndex);
+          let x_273 : i32 = *(x_272);
+          if ((x_273 == -1)) {
+            *(x_272) = 7;
+            tree[7] = BST(6, -1, -1);
+            x_288_phi = true;
+            break;
+          } else {
+            x_278 = *(x_272);
+            x_261_phi = x_278;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_261 = x_261_phi;
+          x_260_phi = x_261;
+        }
+      }
+      let x_288 : bool = x_288_phi;
+      if (x_288) {
+        break;
+      }
+    }
+  }
+  var x_293_phi : i32;
+  var x_321_phi : bool;
+  switch(0u) {
+    default: {
+      x_293_phi = 0;
+      loop {
+        var x_319 : i32;
+        var x_311 : i32;
+        var x_294 : i32;
+        var x_294_phi : i32;
+        let x_293 : i32 = x_293_phi;
+        x_321_phi = false;
+        if ((x_293 <= 8)) {
+        } else {
+          break;
+        }
+        let x_300 : i32 = tree[x_293].data;
+        if ((17 <= x_300)) {
+          let x_313 : ptr<function, i32> = &(tree[x_293].leftIndex);
+          let x_314 : i32 = *(x_313);
+          if ((x_314 == -1)) {
+            *(x_313) = 8;
+            tree[8] = BST(17, -1, -1);
+            x_321_phi = true;
+            break;
+          } else {
+            x_319 = *(x_313);
+            x_294_phi = x_319;
+            continue;
+          }
+          return;
+        } else {
+          let x_305 : ptr<function, i32> = &(tree[x_293].rightIndex);
+          let x_306 : i32 = *(x_305);
+          if ((x_306 == -1)) {
+            *(x_305) = 8;
+            tree[8] = BST(17, -1, -1);
+            x_321_phi = true;
+            break;
+          } else {
+            x_311 = *(x_305);
+            x_294_phi = x_311;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_294 = x_294_phi;
+          x_293_phi = x_294;
+        }
+      }
+      let x_321 : bool = x_321_phi;
+      if (x_321) {
+        break;
+      }
+    }
+  }
+  var x_326_phi : i32;
+  var x_354_phi : bool;
+  switch(0u) {
+    default: {
+      x_326_phi = 0;
+      loop {
+        var x_352 : i32;
+        var x_344 : i32;
+        var x_327 : i32;
+        var x_327_phi : i32;
+        let x_326 : i32 = x_326_phi;
+        x_354_phi = false;
+        if ((x_326 <= 9)) {
+        } else {
+          break;
+        }
+        let x_333 : i32 = tree[x_326].data;
+        if ((13 <= x_333)) {
+          let x_346 : ptr<function, i32> = &(tree[x_326].leftIndex);
+          let x_347 : i32 = *(x_346);
+          if ((x_347 == -1)) {
+            *(x_346) = 9;
+            tree[9] = BST(13, -1, -1);
+            x_354_phi = true;
+            break;
+          } else {
+            x_352 = *(x_346);
+            x_327_phi = x_352;
+            continue;
+          }
+          return;
+        } else {
+          let x_338 : ptr<function, i32> = &(tree[x_326].rightIndex);
+          let x_339 : i32 = *(x_338);
+          if ((x_339 == -1)) {
+            *(x_338) = 9;
+            tree[9] = BST(13, -1, -1);
+            x_354_phi = true;
+            break;
+          } else {
+            x_344 = *(x_338);
+            x_327_phi = x_344;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_327 = x_327_phi;
+          x_326_phi = x_327;
+        }
+      }
+      let x_354 : bool = x_354_phi;
+      if (x_354) {
+        break;
+      }
+    }
+  }
+  x_357_phi = 0;
+  x_360_phi = 0;
+  x_362_phi = 0;
+  loop {
+    var x_392 : i32;
+    var x_402 : i32;
+    var x_407 : i32;
+    var x_363 : i32;
+    var x_358_phi : i32;
+    var x_361_phi : i32;
+    let x_357 : i32 = x_357_phi;
+    x_360 = x_360_phi;
+    let x_362 : i32 = x_362_phi;
+    let x_365 : i32 = (6 - 15);
+    if ((x_362 < 20)) {
+    } else {
+      break;
+    }
+    var x_374_phi : i32;
+    var x_392_phi : i32;
+    var x_393_phi : bool;
+    switch(0u) {
+      default: {
+        x_374_phi = 0;
+        loop {
+          let x_374 : i32 = x_374_phi;
+          x_392_phi = x_357;
+          x_393_phi = false;
+          if ((x_374 != -1)) {
+          } else {
+            break;
+          }
+          let x_381 : BST = tree[x_374];
+          let x_382 : i32 = x_381.data;
+          let x_383 : i32 = x_381.leftIndex;
+          let x_385 : i32 = x_381.rightIndex;
+          if ((x_382 == x_362)) {
+            x_392_phi = x_362;
+            x_393_phi = true;
+            break;
+          }
+          let x_389 : f32 = x_GLF_color[select(3u, 3u, (3u <= 3u))];
+
+          continuing {
+            x_374_phi = select(x_383, x_385, !((x_362 <= x_382)));
+          }
+        }
+        x_392 = x_392_phi;
+        let x_393 : bool = x_393_phi;
+        x_358_phi = x_392;
+        if (x_393) {
+          break;
+        }
+        x_358_phi = -1;
+      }
+    }
+    var x_358 : i32;
+    var x_401 : i32;
+    var x_406 : i32;
+    var x_402_phi : i32;
+    var x_407_phi : i32;
+    x_358 = x_358_phi;
+    switch(x_362) {
+      case 2, 5, 6, 7, 8, 9, 12, 13, 15, 17: {
+        x_402_phi = x_360;
+        if ((x_358 == bitcast<i32>(x_362))) {
+          x_401 = bitcast<i32>((x_360 + bitcast<i32>(1)));
+          x_402_phi = x_401;
+        }
+        x_402 = x_402_phi;
+        x_361_phi = x_402;
+      }
+      default: {
+        x_407_phi = x_360;
+        if ((x_358 == bitcast<i32>(-1))) {
+          x_406 = bitcast<i32>((x_360 + bitcast<i32>(1)));
+          x_407_phi = x_406;
+        }
+        x_407 = x_407_phi;
+        x_361_phi = x_407;
+      }
+    }
+    let x_361 : i32 = x_361_phi;
+
+    continuing {
+      x_363 = (x_362 + 1);
+      x_357_phi = x_358;
+      x_360_phi = x_361;
+      x_362_phi = x_363;
+    }
+  }
+  if ((x_360 == bitcast<i32>(20))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-load-from-frag-color/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-load-from-frag-color/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..6b3b61f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-load-from-frag-color/1.wgsl.expected.hlsl
@@ -0,0 +1,750 @@
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  BST tree[10] = (BST[10])0;
+  int x_360 = 0;
+  int x_62_phi = 0;
+  bool x_90_phi = false;
+  int x_357_phi = 0;
+  int x_360_phi = 0;
+  int x_362_phi = 0;
+  const BST tint_symbol_2 = {9, -1, -1};
+  tree[0] = tint_symbol_2;
+  switch(0u) {
+    default: {
+      x_62_phi = 0;
+      while (true) {
+        int x_88 = 0;
+        int x_80 = 0;
+        int x_63 = 0;
+        int x_63_phi = 0;
+        const int x_62 = x_62_phi;
+        x_90_phi = false;
+        if ((x_62 <= 1)) {
+        } else {
+          break;
+        }
+        const int x_69 = tree[x_62].data;
+        if ((5 <= x_69)) {
+          const int x_82_save = x_62;
+          const int x_83 = tree[x_82_save].leftIndex;
+          if ((x_83 == -1)) {
+            tree[x_82_save].leftIndex = 1;
+            const BST tint_symbol_3 = {5, -1, -1};
+            tree[1] = tint_symbol_3;
+            x_90_phi = true;
+            break;
+          } else {
+            x_88 = tree[x_82_save].leftIndex;
+            x_63_phi = x_88;
+            {
+              x_63 = x_63_phi;
+              x_62_phi = x_63;
+            }
+            continue;
+          }
+          return;
+        } else {
+          const int x_74_save = x_62;
+          const int x_75 = tree[x_74_save].rightIndex;
+          if ((x_75 == -1)) {
+            tree[x_74_save].rightIndex = 1;
+            const BST tint_symbol_4 = {5, -1, -1};
+            tree[1] = tint_symbol_4;
+            x_90_phi = true;
+            break;
+          } else {
+            x_80 = tree[x_74_save].rightIndex;
+            x_63_phi = x_80;
+            {
+              x_63 = x_63_phi;
+              x_62_phi = x_63;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_63 = x_63_phi;
+          x_62_phi = x_63;
+        }
+      }
+      if (x_90_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_95_phi = 0;
+  bool x_123_phi = false;
+  switch(0u) {
+    default: {
+      x_95_phi = 0;
+      while (true) {
+        int x_121 = 0;
+        int x_113 = 0;
+        int x_96 = 0;
+        int x_96_phi = 0;
+        const int x_95 = x_95_phi;
+        x_123_phi = false;
+        if ((x_95 <= 2)) {
+        } else {
+          break;
+        }
+        const int x_102 = tree[x_95].data;
+        if ((12 <= x_102)) {
+          const int x_115_save = x_95;
+          const int x_116 = tree[x_115_save].leftIndex;
+          if ((x_116 == -1)) {
+            tree[x_115_save].leftIndex = 2;
+            const BST tint_symbol_5 = {12, -1, -1};
+            tree[2] = tint_symbol_5;
+            x_123_phi = true;
+            break;
+          } else {
+            x_121 = tree[x_115_save].leftIndex;
+            x_96_phi = x_121;
+            {
+              x_96 = x_96_phi;
+              x_95_phi = x_96;
+            }
+            continue;
+          }
+          return;
+        } else {
+          const int x_107_save = x_95;
+          const int x_108 = tree[x_107_save].rightIndex;
+          if ((x_108 == -1)) {
+            tree[x_107_save].rightIndex = 2;
+            const BST tint_symbol_6 = {12, -1, -1};
+            tree[2] = tint_symbol_6;
+            x_123_phi = true;
+            break;
+          } else {
+            x_113 = tree[x_107_save].rightIndex;
+            x_96_phi = x_113;
+            {
+              x_96 = x_96_phi;
+              x_95_phi = x_96;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_96 = x_96_phi;
+          x_95_phi = x_96;
+        }
+      }
+      if (x_123_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_128_phi = 0;
+  bool x_156_phi = false;
+  switch(0u) {
+    default: {
+      x_128_phi = 0;
+      while (true) {
+        int x_154 = 0;
+        int x_146 = 0;
+        int x_129 = 0;
+        int x_129_phi = 0;
+        const int x_128 = x_128_phi;
+        x_156_phi = false;
+        if ((x_128 <= 3)) {
+        } else {
+          break;
+        }
+        const int x_135 = tree[x_128].data;
+        if ((15 <= x_135)) {
+          const int x_148_save = x_128;
+          const int x_149 = tree[x_148_save].leftIndex;
+          if ((x_149 == -1)) {
+            tree[x_148_save].leftIndex = 3;
+            const BST tint_symbol_7 = {15, -1, -1};
+            tree[3] = tint_symbol_7;
+            x_156_phi = true;
+            break;
+          } else {
+            x_154 = tree[x_148_save].leftIndex;
+            x_129_phi = x_154;
+            {
+              x_129 = x_129_phi;
+              x_128_phi = x_129;
+            }
+            continue;
+          }
+          return;
+        } else {
+          const int x_140_save = x_128;
+          const int x_141 = tree[x_140_save].rightIndex;
+          if ((x_141 == -1)) {
+            tree[x_140_save].rightIndex = 3;
+            const BST tint_symbol_8 = {15, -1, -1};
+            tree[3] = tint_symbol_8;
+            x_156_phi = true;
+            break;
+          } else {
+            x_146 = tree[x_140_save].rightIndex;
+            x_129_phi = x_146;
+            {
+              x_129 = x_129_phi;
+              x_128_phi = x_129;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_129 = x_129_phi;
+          x_128_phi = x_129;
+        }
+      }
+      if (x_156_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_161_phi = 0;
+  bool x_189_phi = false;
+  switch(0u) {
+    default: {
+      x_161_phi = 0;
+      while (true) {
+        int x_187 = 0;
+        int x_179 = 0;
+        int x_162 = 0;
+        int x_162_phi = 0;
+        const int x_161 = x_161_phi;
+        x_189_phi = false;
+        if ((x_161 <= 4)) {
+        } else {
+          break;
+        }
+        const int x_168 = tree[x_161].data;
+        if ((7 <= x_168)) {
+          const int x_181_save = x_161;
+          const int x_182 = tree[x_181_save].leftIndex;
+          if ((x_182 == -1)) {
+            tree[x_181_save].leftIndex = 4;
+            const BST tint_symbol_9 = {7, -1, -1};
+            tree[4] = tint_symbol_9;
+            x_189_phi = true;
+            break;
+          } else {
+            x_187 = tree[x_181_save].leftIndex;
+            x_162_phi = x_187;
+            {
+              x_162 = x_162_phi;
+              x_161_phi = x_162;
+            }
+            continue;
+          }
+          return;
+        } else {
+          const int x_173_save = x_161;
+          const int x_174 = tree[x_173_save].rightIndex;
+          if ((x_174 == -1)) {
+            tree[x_173_save].rightIndex = 4;
+            const BST tint_symbol_10 = {7, -1, -1};
+            tree[4] = tint_symbol_10;
+            x_189_phi = true;
+            break;
+          } else {
+            x_179 = tree[x_173_save].rightIndex;
+            x_162_phi = x_179;
+            {
+              x_162 = x_162_phi;
+              x_161_phi = x_162;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_162 = x_162_phi;
+          x_161_phi = x_162;
+        }
+      }
+      if (x_189_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_194_phi = 0;
+  bool x_222_phi = false;
+  switch(0u) {
+    default: {
+      x_194_phi = 0;
+      while (true) {
+        int x_220 = 0;
+        int x_212 = 0;
+        int x_195 = 0;
+        int x_195_phi = 0;
+        const int x_194 = x_194_phi;
+        x_222_phi = false;
+        if ((x_194 <= 5)) {
+        } else {
+          break;
+        }
+        const int x_201 = tree[x_194].data;
+        if ((8 <= x_201)) {
+          const int x_214_save = x_194;
+          const int x_215 = tree[x_214_save].leftIndex;
+          if ((x_215 == -1)) {
+            tree[x_214_save].leftIndex = 5;
+            const BST tint_symbol_11 = {8, -1, -1};
+            tree[5] = tint_symbol_11;
+            x_222_phi = true;
+            break;
+          } else {
+            x_220 = tree[x_214_save].leftIndex;
+            x_195_phi = x_220;
+            {
+              x_195 = x_195_phi;
+              x_194_phi = x_195;
+            }
+            continue;
+          }
+          return;
+        } else {
+          const int x_206_save = x_194;
+          const int x_207 = tree[x_206_save].rightIndex;
+          if ((x_207 == -1)) {
+            tree[x_206_save].rightIndex = 5;
+            const BST tint_symbol_12 = {8, -1, -1};
+            tree[5] = tint_symbol_12;
+            x_222_phi = true;
+            break;
+          } else {
+            x_212 = tree[x_206_save].rightIndex;
+            x_195_phi = x_212;
+            {
+              x_195 = x_195_phi;
+              x_194_phi = x_195;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_195 = x_195_phi;
+          x_194_phi = x_195;
+        }
+      }
+      if (x_222_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_227_phi = 0;
+  bool x_255_phi = false;
+  switch(0u) {
+    default: {
+      x_227_phi = 0;
+      while (true) {
+        int x_253 = 0;
+        int x_245 = 0;
+        int x_228 = 0;
+        int x_228_phi = 0;
+        const int x_227 = x_227_phi;
+        x_255_phi = false;
+        if ((x_227 <= 6)) {
+        } else {
+          break;
+        }
+        const int x_234 = tree[x_227].data;
+        if ((2 <= x_234)) {
+          const int x_247_save = x_227;
+          const int x_248 = tree[x_247_save].leftIndex;
+          if ((x_248 == -1)) {
+            tree[x_247_save].leftIndex = 6;
+            const BST tint_symbol_13 = {2, -1, -1};
+            tree[6] = tint_symbol_13;
+            x_255_phi = true;
+            break;
+          } else {
+            x_253 = tree[x_247_save].leftIndex;
+            x_228_phi = x_253;
+            {
+              x_228 = x_228_phi;
+              x_227_phi = x_228;
+            }
+            continue;
+          }
+          return;
+        } else {
+          const int x_239_save = x_227;
+          const int x_240 = tree[x_239_save].rightIndex;
+          if ((x_240 == -1)) {
+            tree[x_239_save].rightIndex = 6;
+            const BST tint_symbol_14 = {2, -1, -1};
+            tree[6] = tint_symbol_14;
+            x_255_phi = true;
+            break;
+          } else {
+            x_245 = tree[x_239_save].rightIndex;
+            x_228_phi = x_245;
+            {
+              x_228 = x_228_phi;
+              x_227_phi = x_228;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_228 = x_228_phi;
+          x_227_phi = x_228;
+        }
+      }
+      if (x_255_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_260_phi = 0;
+  bool x_288_phi = false;
+  switch(0u) {
+    default: {
+      x_260_phi = 0;
+      while (true) {
+        int x_286 = 0;
+        int x_278 = 0;
+        int x_261 = 0;
+        int x_261_phi = 0;
+        const int x_260 = x_260_phi;
+        x_288_phi = false;
+        if ((x_260 <= 7)) {
+        } else {
+          break;
+        }
+        const int x_267 = tree[x_260].data;
+        if ((6 <= x_267)) {
+          const int x_280_save = x_260;
+          const int x_281 = tree[x_280_save].leftIndex;
+          if ((x_281 == -1)) {
+            tree[x_280_save].leftIndex = 7;
+            const BST tint_symbol_15 = {6, -1, -1};
+            tree[7] = tint_symbol_15;
+            x_288_phi = true;
+            break;
+          } else {
+            x_286 = tree[x_280_save].leftIndex;
+            x_261_phi = x_286;
+            {
+              x_261 = x_261_phi;
+              x_260_phi = x_261;
+            }
+            continue;
+          }
+          return;
+        } else {
+          const int x_272_save = x_260;
+          const int x_273 = tree[x_272_save].rightIndex;
+          if ((x_273 == -1)) {
+            tree[x_272_save].rightIndex = 7;
+            const BST tint_symbol_16 = {6, -1, -1};
+            tree[7] = tint_symbol_16;
+            x_288_phi = true;
+            break;
+          } else {
+            x_278 = tree[x_272_save].rightIndex;
+            x_261_phi = x_278;
+            {
+              x_261 = x_261_phi;
+              x_260_phi = x_261;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_261 = x_261_phi;
+          x_260_phi = x_261;
+        }
+      }
+      if (x_288_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_293_phi = 0;
+  bool x_321_phi = false;
+  switch(0u) {
+    default: {
+      x_293_phi = 0;
+      while (true) {
+        int x_319 = 0;
+        int x_311 = 0;
+        int x_294 = 0;
+        int x_294_phi = 0;
+        const int x_293 = x_293_phi;
+        x_321_phi = false;
+        if ((x_293 <= 8)) {
+        } else {
+          break;
+        }
+        const int x_300 = tree[x_293].data;
+        if ((17 <= x_300)) {
+          const int x_313_save = x_293;
+          const int x_314 = tree[x_313_save].leftIndex;
+          if ((x_314 == -1)) {
+            tree[x_313_save].leftIndex = 8;
+            const BST tint_symbol_17 = {17, -1, -1};
+            tree[8] = tint_symbol_17;
+            x_321_phi = true;
+            break;
+          } else {
+            x_319 = tree[x_313_save].leftIndex;
+            x_294_phi = x_319;
+            {
+              x_294 = x_294_phi;
+              x_293_phi = x_294;
+            }
+            continue;
+          }
+          return;
+        } else {
+          const int x_305_save = x_293;
+          const int x_306 = tree[x_305_save].rightIndex;
+          if ((x_306 == -1)) {
+            tree[x_305_save].rightIndex = 8;
+            const BST tint_symbol_18 = {17, -1, -1};
+            tree[8] = tint_symbol_18;
+            x_321_phi = true;
+            break;
+          } else {
+            x_311 = tree[x_305_save].rightIndex;
+            x_294_phi = x_311;
+            {
+              x_294 = x_294_phi;
+              x_293_phi = x_294;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_294 = x_294_phi;
+          x_293_phi = x_294;
+        }
+      }
+      if (x_321_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_326_phi = 0;
+  bool x_354_phi = false;
+  switch(0u) {
+    default: {
+      x_326_phi = 0;
+      while (true) {
+        int x_352 = 0;
+        int x_344 = 0;
+        int x_327 = 0;
+        int x_327_phi = 0;
+        const int x_326 = x_326_phi;
+        x_354_phi = false;
+        if ((x_326 <= 9)) {
+        } else {
+          break;
+        }
+        const int x_333 = tree[x_326].data;
+        if ((13 <= x_333)) {
+          const int x_346_save = x_326;
+          const int x_347 = tree[x_346_save].leftIndex;
+          if ((x_347 == -1)) {
+            tree[x_346_save].leftIndex = 9;
+            const BST tint_symbol_19 = {13, -1, -1};
+            tree[9] = tint_symbol_19;
+            x_354_phi = true;
+            break;
+          } else {
+            x_352 = tree[x_346_save].leftIndex;
+            x_327_phi = x_352;
+            {
+              x_327 = x_327_phi;
+              x_326_phi = x_327;
+            }
+            continue;
+          }
+          return;
+        } else {
+          const int x_338_save = x_326;
+          const int x_339 = tree[x_338_save].rightIndex;
+          if ((x_339 == -1)) {
+            tree[x_338_save].rightIndex = 9;
+            const BST tint_symbol_20 = {13, -1, -1};
+            tree[9] = tint_symbol_20;
+            x_354_phi = true;
+            break;
+          } else {
+            x_344 = tree[x_338_save].rightIndex;
+            x_327_phi = x_344;
+            {
+              x_327 = x_327_phi;
+              x_326_phi = x_327;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_327 = x_327_phi;
+          x_326_phi = x_327;
+        }
+      }
+      if (x_354_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  x_357_phi = 0;
+  x_360_phi = 0;
+  x_362_phi = 0;
+  while (true) {
+    int x_392 = 0;
+    int x_402 = 0;
+    int x_407 = 0;
+    int x_363 = 0;
+    int x_358_phi = 0;
+    int x_361_phi = 0;
+    const int x_357 = x_357_phi;
+    x_360 = x_360_phi;
+    const int x_362 = x_362_phi;
+    const int x_365 = (6 - 15);
+    if ((x_362 < 20)) {
+    } else {
+      break;
+    }
+    int x_374_phi = 0;
+    int x_392_phi = 0;
+    bool x_393_phi = false;
+    switch(0u) {
+      default: {
+        x_374_phi = 0;
+        while (true) {
+          const int x_374 = x_374_phi;
+          x_392_phi = x_357;
+          x_393_phi = false;
+          if ((x_374 != -1)) {
+          } else {
+            break;
+          }
+          const BST x_381 = tree[x_374];
+          const int x_382 = x_381.data;
+          const int x_383 = x_381.leftIndex;
+          const int x_385 = x_381.rightIndex;
+          if ((x_382 == x_362)) {
+            x_392_phi = x_362;
+            x_393_phi = true;
+            break;
+          }
+          const float x_389 = x_GLF_color[((3u <= 3u) ? 3u : 3u)];
+          {
+            x_374_phi = (!((x_362 <= x_382)) ? x_385 : x_383);
+          }
+        }
+        x_392 = x_392_phi;
+        const bool x_393 = x_393_phi;
+        x_358_phi = x_392;
+        if (x_393) {
+          break;
+        }
+        x_358_phi = -1;
+        break;
+      }
+    }
+    int x_358 = 0;
+    int x_401 = 0;
+    int x_406 = 0;
+    int x_402_phi = 0;
+    int x_407_phi = 0;
+    x_358 = x_358_phi;
+    switch(x_362) {
+      case 2:
+      case 5:
+      case 6:
+      case 7:
+      case 8:
+      case 9:
+      case 12:
+      case 13:
+      case 15:
+      case 17: {
+        x_402_phi = x_360;
+        if ((x_358 == asint(x_362))) {
+          x_401 = asint((x_360 + asint(1)));
+          x_402_phi = x_401;
+        }
+        x_402 = x_402_phi;
+        x_361_phi = x_402;
+        break;
+      }
+      default: {
+        x_407_phi = x_360;
+        if ((x_358 == asint(-1))) {
+          x_406 = asint((x_360 + asint(1)));
+          x_407_phi = x_406;
+        }
+        x_407 = x_407_phi;
+        x_361_phi = x_407;
+        break;
+      }
+    }
+    const int x_361 = x_361_phi;
+    {
+      x_363 = (x_362 + 1);
+      x_357_phi = x_358;
+      x_360_phi = x_361;
+      x_362_phi = x_363;
+    }
+  }
+  if ((x_360 == asint(20))) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_21 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_21;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-load-from-frag-color/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-load-from-frag-color/1.wgsl.expected.msl
new file mode 100644
index 0000000..94bc881
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-load-from-frag-color/1.wgsl.expected.msl
@@ -0,0 +1,764 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+struct tint_array_wrapper {
+  BST arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_23) {
+  tint_array_wrapper tree = {};
+  int x_360 = 0;
+  int x_62_phi = 0;
+  bool x_90_phi = false;
+  int x_357_phi = 0;
+  int x_360_phi = 0;
+  int x_362_phi = 0;
+  BST const tint_symbol_3 = {.data=9, .leftIndex=-1, .rightIndex=-1};
+  tree.arr[0] = tint_symbol_3;
+  switch(0u) {
+    default: {
+      x_62_phi = 0;
+      while (true) {
+        int x_88 = 0;
+        int x_80 = 0;
+        int x_63 = 0;
+        int x_63_phi = 0;
+        int const x_62 = x_62_phi;
+        x_90_phi = false;
+        if ((x_62 <= 1)) {
+        } else {
+          break;
+        }
+        int const x_69 = tree.arr[x_62].data;
+        if ((5 <= x_69)) {
+          int const x_82_save = x_62;
+          int const x_83 = tree.arr[x_82_save].leftIndex;
+          if ((x_83 == -1)) {
+            tree.arr[x_82_save].leftIndex = 1;
+            BST const tint_symbol_4 = {.data=5, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[1] = tint_symbol_4;
+            x_90_phi = true;
+            break;
+          } else {
+            x_88 = tree.arr[x_82_save].leftIndex;
+            x_63_phi = x_88;
+            {
+              x_63 = x_63_phi;
+              x_62_phi = x_63;
+            }
+            continue;
+          }
+          return;
+        } else {
+          int const x_74_save = x_62;
+          int const x_75 = tree.arr[x_74_save].rightIndex;
+          if ((x_75 == -1)) {
+            tree.arr[x_74_save].rightIndex = 1;
+            BST const tint_symbol_5 = {.data=5, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[1] = tint_symbol_5;
+            x_90_phi = true;
+            break;
+          } else {
+            x_80 = tree.arr[x_74_save].rightIndex;
+            x_63_phi = x_80;
+            {
+              x_63 = x_63_phi;
+              x_62_phi = x_63;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_63 = x_63_phi;
+          x_62_phi = x_63;
+        }
+      }
+      bool const x_90 = x_90_phi;
+      if (x_90) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_95_phi = 0;
+  bool x_123_phi = false;
+  switch(0u) {
+    default: {
+      x_95_phi = 0;
+      while (true) {
+        int x_121 = 0;
+        int x_113 = 0;
+        int x_96 = 0;
+        int x_96_phi = 0;
+        int const x_95 = x_95_phi;
+        x_123_phi = false;
+        if ((x_95 <= 2)) {
+        } else {
+          break;
+        }
+        int const x_102 = tree.arr[x_95].data;
+        if ((12 <= x_102)) {
+          int const x_115_save = x_95;
+          int const x_116 = tree.arr[x_115_save].leftIndex;
+          if ((x_116 == -1)) {
+            tree.arr[x_115_save].leftIndex = 2;
+            BST const tint_symbol_6 = {.data=12, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[2] = tint_symbol_6;
+            x_123_phi = true;
+            break;
+          } else {
+            x_121 = tree.arr[x_115_save].leftIndex;
+            x_96_phi = x_121;
+            {
+              x_96 = x_96_phi;
+              x_95_phi = x_96;
+            }
+            continue;
+          }
+          return;
+        } else {
+          int const x_107_save = x_95;
+          int const x_108 = tree.arr[x_107_save].rightIndex;
+          if ((x_108 == -1)) {
+            tree.arr[x_107_save].rightIndex = 2;
+            BST const tint_symbol_7 = {.data=12, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[2] = tint_symbol_7;
+            x_123_phi = true;
+            break;
+          } else {
+            x_113 = tree.arr[x_107_save].rightIndex;
+            x_96_phi = x_113;
+            {
+              x_96 = x_96_phi;
+              x_95_phi = x_96;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_96 = x_96_phi;
+          x_95_phi = x_96;
+        }
+      }
+      bool const x_123 = x_123_phi;
+      if (x_123) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_128_phi = 0;
+  bool x_156_phi = false;
+  switch(0u) {
+    default: {
+      x_128_phi = 0;
+      while (true) {
+        int x_154 = 0;
+        int x_146 = 0;
+        int x_129 = 0;
+        int x_129_phi = 0;
+        int const x_128 = x_128_phi;
+        x_156_phi = false;
+        if ((x_128 <= 3)) {
+        } else {
+          break;
+        }
+        int const x_135 = tree.arr[x_128].data;
+        if ((15 <= x_135)) {
+          int const x_148_save = x_128;
+          int const x_149 = tree.arr[x_148_save].leftIndex;
+          if ((x_149 == -1)) {
+            tree.arr[x_148_save].leftIndex = 3;
+            BST const tint_symbol_8 = {.data=15, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[3] = tint_symbol_8;
+            x_156_phi = true;
+            break;
+          } else {
+            x_154 = tree.arr[x_148_save].leftIndex;
+            x_129_phi = x_154;
+            {
+              x_129 = x_129_phi;
+              x_128_phi = x_129;
+            }
+            continue;
+          }
+          return;
+        } else {
+          int const x_140_save = x_128;
+          int const x_141 = tree.arr[x_140_save].rightIndex;
+          if ((x_141 == -1)) {
+            tree.arr[x_140_save].rightIndex = 3;
+            BST const tint_symbol_9 = {.data=15, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[3] = tint_symbol_9;
+            x_156_phi = true;
+            break;
+          } else {
+            x_146 = tree.arr[x_140_save].rightIndex;
+            x_129_phi = x_146;
+            {
+              x_129 = x_129_phi;
+              x_128_phi = x_129;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_129 = x_129_phi;
+          x_128_phi = x_129;
+        }
+      }
+      bool const x_156 = x_156_phi;
+      if (x_156) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_161_phi = 0;
+  bool x_189_phi = false;
+  switch(0u) {
+    default: {
+      x_161_phi = 0;
+      while (true) {
+        int x_187 = 0;
+        int x_179 = 0;
+        int x_162 = 0;
+        int x_162_phi = 0;
+        int const x_161 = x_161_phi;
+        x_189_phi = false;
+        if ((x_161 <= 4)) {
+        } else {
+          break;
+        }
+        int const x_168 = tree.arr[x_161].data;
+        if ((7 <= x_168)) {
+          int const x_181_save = x_161;
+          int const x_182 = tree.arr[x_181_save].leftIndex;
+          if ((x_182 == -1)) {
+            tree.arr[x_181_save].leftIndex = 4;
+            BST const tint_symbol_10 = {.data=7, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[4] = tint_symbol_10;
+            x_189_phi = true;
+            break;
+          } else {
+            x_187 = tree.arr[x_181_save].leftIndex;
+            x_162_phi = x_187;
+            {
+              x_162 = x_162_phi;
+              x_161_phi = x_162;
+            }
+            continue;
+          }
+          return;
+        } else {
+          int const x_173_save = x_161;
+          int const x_174 = tree.arr[x_173_save].rightIndex;
+          if ((x_174 == -1)) {
+            tree.arr[x_173_save].rightIndex = 4;
+            BST const tint_symbol_11 = {.data=7, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[4] = tint_symbol_11;
+            x_189_phi = true;
+            break;
+          } else {
+            x_179 = tree.arr[x_173_save].rightIndex;
+            x_162_phi = x_179;
+            {
+              x_162 = x_162_phi;
+              x_161_phi = x_162;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_162 = x_162_phi;
+          x_161_phi = x_162;
+        }
+      }
+      bool const x_189 = x_189_phi;
+      if (x_189) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_194_phi = 0;
+  bool x_222_phi = false;
+  switch(0u) {
+    default: {
+      x_194_phi = 0;
+      while (true) {
+        int x_220 = 0;
+        int x_212 = 0;
+        int x_195 = 0;
+        int x_195_phi = 0;
+        int const x_194 = x_194_phi;
+        x_222_phi = false;
+        if ((x_194 <= 5)) {
+        } else {
+          break;
+        }
+        int const x_201 = tree.arr[x_194].data;
+        if ((8 <= x_201)) {
+          int const x_214_save = x_194;
+          int const x_215 = tree.arr[x_214_save].leftIndex;
+          if ((x_215 == -1)) {
+            tree.arr[x_214_save].leftIndex = 5;
+            BST const tint_symbol_12 = {.data=8, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[5] = tint_symbol_12;
+            x_222_phi = true;
+            break;
+          } else {
+            x_220 = tree.arr[x_214_save].leftIndex;
+            x_195_phi = x_220;
+            {
+              x_195 = x_195_phi;
+              x_194_phi = x_195;
+            }
+            continue;
+          }
+          return;
+        } else {
+          int const x_206_save = x_194;
+          int const x_207 = tree.arr[x_206_save].rightIndex;
+          if ((x_207 == -1)) {
+            tree.arr[x_206_save].rightIndex = 5;
+            BST const tint_symbol_13 = {.data=8, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[5] = tint_symbol_13;
+            x_222_phi = true;
+            break;
+          } else {
+            x_212 = tree.arr[x_206_save].rightIndex;
+            x_195_phi = x_212;
+            {
+              x_195 = x_195_phi;
+              x_194_phi = x_195;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_195 = x_195_phi;
+          x_194_phi = x_195;
+        }
+      }
+      bool const x_222 = x_222_phi;
+      if (x_222) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_227_phi = 0;
+  bool x_255_phi = false;
+  switch(0u) {
+    default: {
+      x_227_phi = 0;
+      while (true) {
+        int x_253 = 0;
+        int x_245 = 0;
+        int x_228 = 0;
+        int x_228_phi = 0;
+        int const x_227 = x_227_phi;
+        x_255_phi = false;
+        if ((x_227 <= 6)) {
+        } else {
+          break;
+        }
+        int const x_234 = tree.arr[x_227].data;
+        if ((2 <= x_234)) {
+          int const x_247_save = x_227;
+          int const x_248 = tree.arr[x_247_save].leftIndex;
+          if ((x_248 == -1)) {
+            tree.arr[x_247_save].leftIndex = 6;
+            BST const tint_symbol_14 = {.data=2, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[6] = tint_symbol_14;
+            x_255_phi = true;
+            break;
+          } else {
+            x_253 = tree.arr[x_247_save].leftIndex;
+            x_228_phi = x_253;
+            {
+              x_228 = x_228_phi;
+              x_227_phi = x_228;
+            }
+            continue;
+          }
+          return;
+        } else {
+          int const x_239_save = x_227;
+          int const x_240 = tree.arr[x_239_save].rightIndex;
+          if ((x_240 == -1)) {
+            tree.arr[x_239_save].rightIndex = 6;
+            BST const tint_symbol_15 = {.data=2, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[6] = tint_symbol_15;
+            x_255_phi = true;
+            break;
+          } else {
+            x_245 = tree.arr[x_239_save].rightIndex;
+            x_228_phi = x_245;
+            {
+              x_228 = x_228_phi;
+              x_227_phi = x_228;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_228 = x_228_phi;
+          x_227_phi = x_228;
+        }
+      }
+      bool const x_255 = x_255_phi;
+      if (x_255) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_260_phi = 0;
+  bool x_288_phi = false;
+  switch(0u) {
+    default: {
+      x_260_phi = 0;
+      while (true) {
+        int x_286 = 0;
+        int x_278 = 0;
+        int x_261 = 0;
+        int x_261_phi = 0;
+        int const x_260 = x_260_phi;
+        x_288_phi = false;
+        if ((x_260 <= 7)) {
+        } else {
+          break;
+        }
+        int const x_267 = tree.arr[x_260].data;
+        if ((6 <= x_267)) {
+          int const x_280_save = x_260;
+          int const x_281 = tree.arr[x_280_save].leftIndex;
+          if ((x_281 == -1)) {
+            tree.arr[x_280_save].leftIndex = 7;
+            BST const tint_symbol_16 = {.data=6, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[7] = tint_symbol_16;
+            x_288_phi = true;
+            break;
+          } else {
+            x_286 = tree.arr[x_280_save].leftIndex;
+            x_261_phi = x_286;
+            {
+              x_261 = x_261_phi;
+              x_260_phi = x_261;
+            }
+            continue;
+          }
+          return;
+        } else {
+          int const x_272_save = x_260;
+          int const x_273 = tree.arr[x_272_save].rightIndex;
+          if ((x_273 == -1)) {
+            tree.arr[x_272_save].rightIndex = 7;
+            BST const tint_symbol_17 = {.data=6, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[7] = tint_symbol_17;
+            x_288_phi = true;
+            break;
+          } else {
+            x_278 = tree.arr[x_272_save].rightIndex;
+            x_261_phi = x_278;
+            {
+              x_261 = x_261_phi;
+              x_260_phi = x_261;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_261 = x_261_phi;
+          x_260_phi = x_261;
+        }
+      }
+      bool const x_288 = x_288_phi;
+      if (x_288) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_293_phi = 0;
+  bool x_321_phi = false;
+  switch(0u) {
+    default: {
+      x_293_phi = 0;
+      while (true) {
+        int x_319 = 0;
+        int x_311 = 0;
+        int x_294 = 0;
+        int x_294_phi = 0;
+        int const x_293 = x_293_phi;
+        x_321_phi = false;
+        if ((x_293 <= 8)) {
+        } else {
+          break;
+        }
+        int const x_300 = tree.arr[x_293].data;
+        if ((17 <= x_300)) {
+          int const x_313_save = x_293;
+          int const x_314 = tree.arr[x_313_save].leftIndex;
+          if ((x_314 == -1)) {
+            tree.arr[x_313_save].leftIndex = 8;
+            BST const tint_symbol_18 = {.data=17, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[8] = tint_symbol_18;
+            x_321_phi = true;
+            break;
+          } else {
+            x_319 = tree.arr[x_313_save].leftIndex;
+            x_294_phi = x_319;
+            {
+              x_294 = x_294_phi;
+              x_293_phi = x_294;
+            }
+            continue;
+          }
+          return;
+        } else {
+          int const x_305_save = x_293;
+          int const x_306 = tree.arr[x_305_save].rightIndex;
+          if ((x_306 == -1)) {
+            tree.arr[x_305_save].rightIndex = 8;
+            BST const tint_symbol_19 = {.data=17, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[8] = tint_symbol_19;
+            x_321_phi = true;
+            break;
+          } else {
+            x_311 = tree.arr[x_305_save].rightIndex;
+            x_294_phi = x_311;
+            {
+              x_294 = x_294_phi;
+              x_293_phi = x_294;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_294 = x_294_phi;
+          x_293_phi = x_294;
+        }
+      }
+      bool const x_321 = x_321_phi;
+      if (x_321) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_326_phi = 0;
+  bool x_354_phi = false;
+  switch(0u) {
+    default: {
+      x_326_phi = 0;
+      while (true) {
+        int x_352 = 0;
+        int x_344 = 0;
+        int x_327 = 0;
+        int x_327_phi = 0;
+        int const x_326 = x_326_phi;
+        x_354_phi = false;
+        if ((x_326 <= 9)) {
+        } else {
+          break;
+        }
+        int const x_333 = tree.arr[x_326].data;
+        if ((13 <= x_333)) {
+          int const x_346_save = x_326;
+          int const x_347 = tree.arr[x_346_save].leftIndex;
+          if ((x_347 == -1)) {
+            tree.arr[x_346_save].leftIndex = 9;
+            BST const tint_symbol_20 = {.data=13, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[9] = tint_symbol_20;
+            x_354_phi = true;
+            break;
+          } else {
+            x_352 = tree.arr[x_346_save].leftIndex;
+            x_327_phi = x_352;
+            {
+              x_327 = x_327_phi;
+              x_326_phi = x_327;
+            }
+            continue;
+          }
+          return;
+        } else {
+          int const x_338_save = x_326;
+          int const x_339 = tree.arr[x_338_save].rightIndex;
+          if ((x_339 == -1)) {
+            tree.arr[x_338_save].rightIndex = 9;
+            BST const tint_symbol_21 = {.data=13, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[9] = tint_symbol_21;
+            x_354_phi = true;
+            break;
+          } else {
+            x_344 = tree.arr[x_338_save].rightIndex;
+            x_327_phi = x_344;
+            {
+              x_327 = x_327_phi;
+              x_326_phi = x_327;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_327 = x_327_phi;
+          x_326_phi = x_327;
+        }
+      }
+      bool const x_354 = x_354_phi;
+      if (x_354) {
+        break;
+      }
+      break;
+    }
+  }
+  x_357_phi = 0;
+  x_360_phi = 0;
+  x_362_phi = 0;
+  while (true) {
+    int x_392 = 0;
+    int x_402 = 0;
+    int x_407 = 0;
+    int x_363 = 0;
+    int x_358_phi = 0;
+    int x_361_phi = 0;
+    int const x_357 = x_357_phi;
+    x_360 = x_360_phi;
+    int const x_362 = x_362_phi;
+    int const x_365 = (6 - 15);
+    if ((x_362 < 20)) {
+    } else {
+      break;
+    }
+    int x_374_phi = 0;
+    int x_392_phi = 0;
+    bool x_393_phi = false;
+    switch(0u) {
+      default: {
+        x_374_phi = 0;
+        while (true) {
+          int const x_374 = x_374_phi;
+          x_392_phi = x_357;
+          x_393_phi = false;
+          if ((x_374 != -1)) {
+          } else {
+            break;
+          }
+          BST const x_381 = tree.arr[x_374];
+          int const x_382 = x_381.data;
+          int const x_383 = x_381.leftIndex;
+          int const x_385 = x_381.rightIndex;
+          if ((x_382 == x_362)) {
+            x_392_phi = x_362;
+            x_393_phi = true;
+            break;
+          }
+          float const x_389 = (*(tint_symbol_23))[select(3u, 3u, (3u <= 3u))];
+          {
+            x_374_phi = select(x_383, x_385, !((x_362 <= x_382)));
+          }
+        }
+        x_392 = x_392_phi;
+        bool const x_393 = x_393_phi;
+        x_358_phi = x_392;
+        if (x_393) {
+          break;
+        }
+        x_358_phi = -1;
+        break;
+      }
+    }
+    int x_358 = 0;
+    int x_401 = 0;
+    int x_406 = 0;
+    int x_402_phi = 0;
+    int x_407_phi = 0;
+    x_358 = x_358_phi;
+    switch(x_362) {
+      case 2:
+      case 5:
+      case 6:
+      case 7:
+      case 8:
+      case 9:
+      case 12:
+      case 13:
+      case 15:
+      case 17: {
+        x_402_phi = x_360;
+        if ((x_358 == as_type<int>(x_362))) {
+          x_401 = as_type<int>((x_360 + as_type<int>(1)));
+          x_402_phi = x_401;
+        }
+        x_402 = x_402_phi;
+        x_361_phi = x_402;
+        break;
+      }
+      default: {
+        x_407_phi = x_360;
+        if ((x_358 == as_type<int>(-1))) {
+          x_406 = as_type<int>((x_360 + as_type<int>(1)));
+          x_407_phi = x_406;
+        }
+        x_407 = x_407_phi;
+        x_361_phi = x_407;
+        break;
+      }
+    }
+    int const x_361 = x_361_phi;
+    {
+      x_363 = (x_362 + 1);
+      x_357_phi = x_358;
+      x_360_phi = x_361;
+      x_362_phi = x_363;
+    }
+  }
+  if ((x_360 == as_type<int>(20))) {
+    *(tint_symbol_23) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_23) = float4(0.0f, 0.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_24 = 0.0f;
+  main_1(&(tint_symbol_24));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_24};
+  tint_symbol_1 const tint_symbol_22 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_22;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-load-from-frag-color/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-load-from-frag-color/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..9057c70
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-load-from-frag-color/1.wgsl.expected.spvasm
@@ -0,0 +1,1174 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 627
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %BST "BST"
+               OpMemberName %BST 0 "data"
+               OpMemberName %BST 1 "leftIndex"
+               OpMemberName %BST 2 "rightIndex"
+               OpName %tree "tree"
+               OpName %x_360 "x_360"
+               OpName %x_62_phi "x_62_phi"
+               OpName %x_90_phi "x_90_phi"
+               OpName %x_357_phi "x_357_phi"
+               OpName %x_360_phi "x_360_phi"
+               OpName %x_362_phi "x_362_phi"
+               OpName %x_88 "x_88"
+               OpName %x_80 "x_80"
+               OpName %x_63 "x_63"
+               OpName %x_63_phi "x_63_phi"
+               OpName %x_95_phi "x_95_phi"
+               OpName %x_123_phi "x_123_phi"
+               OpName %x_121 "x_121"
+               OpName %x_113 "x_113"
+               OpName %x_96 "x_96"
+               OpName %x_96_phi "x_96_phi"
+               OpName %x_128_phi "x_128_phi"
+               OpName %x_156_phi "x_156_phi"
+               OpName %x_154 "x_154"
+               OpName %x_146 "x_146"
+               OpName %x_129 "x_129"
+               OpName %x_129_phi "x_129_phi"
+               OpName %x_161_phi "x_161_phi"
+               OpName %x_189_phi "x_189_phi"
+               OpName %x_187 "x_187"
+               OpName %x_179 "x_179"
+               OpName %x_162 "x_162"
+               OpName %x_162_phi "x_162_phi"
+               OpName %x_194_phi "x_194_phi"
+               OpName %x_222_phi "x_222_phi"
+               OpName %x_220 "x_220"
+               OpName %x_212 "x_212"
+               OpName %x_195 "x_195"
+               OpName %x_195_phi "x_195_phi"
+               OpName %x_227_phi "x_227_phi"
+               OpName %x_255_phi "x_255_phi"
+               OpName %x_253 "x_253"
+               OpName %x_245 "x_245"
+               OpName %x_228 "x_228"
+               OpName %x_228_phi "x_228_phi"
+               OpName %x_260_phi "x_260_phi"
+               OpName %x_288_phi "x_288_phi"
+               OpName %x_286 "x_286"
+               OpName %x_278 "x_278"
+               OpName %x_261 "x_261"
+               OpName %x_261_phi "x_261_phi"
+               OpName %x_293_phi "x_293_phi"
+               OpName %x_321_phi "x_321_phi"
+               OpName %x_319 "x_319"
+               OpName %x_311 "x_311"
+               OpName %x_294 "x_294"
+               OpName %x_294_phi "x_294_phi"
+               OpName %x_326_phi "x_326_phi"
+               OpName %x_354_phi "x_354_phi"
+               OpName %x_352 "x_352"
+               OpName %x_344 "x_344"
+               OpName %x_327 "x_327"
+               OpName %x_327_phi "x_327_phi"
+               OpName %x_392 "x_392"
+               OpName %x_402 "x_402"
+               OpName %x_407 "x_407"
+               OpName %x_363 "x_363"
+               OpName %x_358_phi "x_358_phi"
+               OpName %x_361_phi "x_361_phi"
+               OpName %x_374_phi "x_374_phi"
+               OpName %x_392_phi "x_392_phi"
+               OpName %x_393_phi "x_393_phi"
+               OpName %x_358 "x_358"
+               OpName %x_401 "x_401"
+               OpName %x_406 "x_406"
+               OpName %x_402_phi "x_402_phi"
+               OpName %x_407_phi "x_407_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %BST 0 Offset 0
+               OpMemberDecorate %BST 1 Offset 4
+               OpMemberDecorate %BST 2 Offset 8
+               OpDecorate %_arr_BST_uint_10 ArrayStride 12
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+        %BST = OpTypeStruct %int %int %int
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_BST_uint_10 = OpTypeArray %BST %uint_10
+%_ptr_Function__arr_BST_uint_10 = OpTypePointer Function %_arr_BST_uint_10
+         %19 = OpConstantNull %_arr_BST_uint_10
+%_ptr_Function_int = OpTypePointer Function %int
+         %22 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %27 = OpConstantNull %bool
+      %int_0 = OpConstant %int 0
+%_ptr_Function_BST = OpTypePointer Function %BST
+      %int_9 = OpConstant %int 9
+     %int_n1 = OpConstant %int -1
+         %36 = OpConstantComposite %BST %int_9 %int_n1 %int_n1
+     %uint_0 = OpConstant %uint 0
+      %false = OpConstantFalse %bool
+      %int_1 = OpConstant %int 1
+      %int_5 = OpConstant %int 5
+     %uint_1 = OpConstant %uint 1
+         %71 = OpConstantComposite %BST %int_5 %int_n1 %int_n1
+       %true = OpConstantTrue %bool
+     %uint_2 = OpConstant %uint 2
+      %int_2 = OpConstant %int 2
+     %int_12 = OpConstant %int 12
+        %126 = OpConstantComposite %BST %int_12 %int_n1 %int_n1
+      %int_3 = OpConstant %int 3
+     %int_15 = OpConstant %int 15
+        %179 = OpConstantComposite %BST %int_15 %int_n1 %int_n1
+      %int_4 = OpConstant %int 4
+      %int_7 = OpConstant %int 7
+        %232 = OpConstantComposite %BST %int_7 %int_n1 %int_n1
+      %int_8 = OpConstant %int 8
+        %284 = OpConstantComposite %BST %int_8 %int_n1 %int_n1
+      %int_6 = OpConstant %int 6
+        %336 = OpConstantComposite %BST %int_2 %int_n1 %int_n1
+        %387 = OpConstantComposite %BST %int_6 %int_n1 %int_n1
+     %int_17 = OpConstant %int 17
+        %439 = OpConstantComposite %BST %int_17 %int_n1 %int_n1
+     %int_13 = OpConstant %int 13
+        %491 = OpConstantComposite %BST %int_13 %int_n1 %int_n1
+     %int_20 = OpConstant %int 20
+     %uint_3 = OpConstant %uint 3
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+        %613 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %614 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+        %615 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+       %tree = OpVariable %_ptr_Function__arr_BST_uint_10 Function %19
+      %x_360 = OpVariable %_ptr_Function_int Function %22
+   %x_62_phi = OpVariable %_ptr_Function_int Function %22
+   %x_90_phi = OpVariable %_ptr_Function_bool Function %27
+  %x_357_phi = OpVariable %_ptr_Function_int Function %22
+  %x_360_phi = OpVariable %_ptr_Function_int Function %22
+  %x_362_phi = OpVariable %_ptr_Function_int Function %22
+       %x_88 = OpVariable %_ptr_Function_int Function %22
+       %x_80 = OpVariable %_ptr_Function_int Function %22
+       %x_63 = OpVariable %_ptr_Function_int Function %22
+   %x_63_phi = OpVariable %_ptr_Function_int Function %22
+   %x_95_phi = OpVariable %_ptr_Function_int Function %22
+  %x_123_phi = OpVariable %_ptr_Function_bool Function %27
+      %x_121 = OpVariable %_ptr_Function_int Function %22
+      %x_113 = OpVariable %_ptr_Function_int Function %22
+       %x_96 = OpVariable %_ptr_Function_int Function %22
+   %x_96_phi = OpVariable %_ptr_Function_int Function %22
+  %x_128_phi = OpVariable %_ptr_Function_int Function %22
+  %x_156_phi = OpVariable %_ptr_Function_bool Function %27
+      %x_154 = OpVariable %_ptr_Function_int Function %22
+      %x_146 = OpVariable %_ptr_Function_int Function %22
+      %x_129 = OpVariable %_ptr_Function_int Function %22
+  %x_129_phi = OpVariable %_ptr_Function_int Function %22
+  %x_161_phi = OpVariable %_ptr_Function_int Function %22
+  %x_189_phi = OpVariable %_ptr_Function_bool Function %27
+      %x_187 = OpVariable %_ptr_Function_int Function %22
+      %x_179 = OpVariable %_ptr_Function_int Function %22
+      %x_162 = OpVariable %_ptr_Function_int Function %22
+  %x_162_phi = OpVariable %_ptr_Function_int Function %22
+  %x_194_phi = OpVariable %_ptr_Function_int Function %22
+  %x_222_phi = OpVariable %_ptr_Function_bool Function %27
+      %x_220 = OpVariable %_ptr_Function_int Function %22
+      %x_212 = OpVariable %_ptr_Function_int Function %22
+      %x_195 = OpVariable %_ptr_Function_int Function %22
+  %x_195_phi = OpVariable %_ptr_Function_int Function %22
+  %x_227_phi = OpVariable %_ptr_Function_int Function %22
+  %x_255_phi = OpVariable %_ptr_Function_bool Function %27
+      %x_253 = OpVariable %_ptr_Function_int Function %22
+      %x_245 = OpVariable %_ptr_Function_int Function %22
+      %x_228 = OpVariable %_ptr_Function_int Function %22
+  %x_228_phi = OpVariable %_ptr_Function_int Function %22
+  %x_260_phi = OpVariable %_ptr_Function_int Function %22
+  %x_288_phi = OpVariable %_ptr_Function_bool Function %27
+      %x_286 = OpVariable %_ptr_Function_int Function %22
+      %x_278 = OpVariable %_ptr_Function_int Function %22
+      %x_261 = OpVariable %_ptr_Function_int Function %22
+  %x_261_phi = OpVariable %_ptr_Function_int Function %22
+  %x_293_phi = OpVariable %_ptr_Function_int Function %22
+  %x_321_phi = OpVariable %_ptr_Function_bool Function %27
+      %x_319 = OpVariable %_ptr_Function_int Function %22
+      %x_311 = OpVariable %_ptr_Function_int Function %22
+      %x_294 = OpVariable %_ptr_Function_int Function %22
+  %x_294_phi = OpVariable %_ptr_Function_int Function %22
+  %x_326_phi = OpVariable %_ptr_Function_int Function %22
+  %x_354_phi = OpVariable %_ptr_Function_bool Function %27
+      %x_352 = OpVariable %_ptr_Function_int Function %22
+      %x_344 = OpVariable %_ptr_Function_int Function %22
+      %x_327 = OpVariable %_ptr_Function_int Function %22
+  %x_327_phi = OpVariable %_ptr_Function_int Function %22
+      %x_392 = OpVariable %_ptr_Function_int Function %22
+      %x_402 = OpVariable %_ptr_Function_int Function %22
+      %x_407 = OpVariable %_ptr_Function_int Function %22
+      %x_363 = OpVariable %_ptr_Function_int Function %22
+  %x_358_phi = OpVariable %_ptr_Function_int Function %22
+  %x_361_phi = OpVariable %_ptr_Function_int Function %22
+  %x_374_phi = OpVariable %_ptr_Function_int Function %22
+  %x_392_phi = OpVariable %_ptr_Function_int Function %22
+  %x_393_phi = OpVariable %_ptr_Function_bool Function %27
+      %x_358 = OpVariable %_ptr_Function_int Function %22
+      %x_401 = OpVariable %_ptr_Function_int Function %22
+      %x_406 = OpVariable %_ptr_Function_int Function %22
+  %x_402_phi = OpVariable %_ptr_Function_int Function %22
+  %x_407_phi = OpVariable %_ptr_Function_int Function %22
+         %33 = OpAccessChain %_ptr_Function_BST %tree %int_0
+               OpStore %33 %36
+               OpSelectionMerge %37 None
+               OpSwitch %uint_0 %39
+         %39 = OpLabel
+               OpStore %x_62_phi %int_0
+               OpBranch %40
+         %40 = OpLabel
+               OpLoopMerge %41 %42 None
+               OpBranch %43
+         %43 = OpLabel
+         %48 = OpLoad %int %x_62_phi
+               OpStore %x_90_phi %false
+         %51 = OpSLessThanEqual %bool %48 %int_1
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %54
+         %53 = OpLabel
+               OpBranch %52
+         %54 = OpLabel
+               OpBranch %41
+         %52 = OpLabel
+         %55 = OpAccessChain %_ptr_Function_int %tree %48 %uint_0
+         %56 = OpLoad %int %55
+         %58 = OpSLessThanEqual %bool %int_5 %56
+               OpSelectionMerge %59 None
+               OpBranchConditional %58 %60 %61
+         %60 = OpLabel
+         %63 = OpAccessChain %_ptr_Function_int %tree %48 %uint_1
+         %64 = OpLoad %int %63
+         %65 = OpIEqual %bool %64 %int_n1
+               OpSelectionMerge %66 None
+               OpBranchConditional %65 %67 %68
+         %67 = OpLabel
+         %69 = OpAccessChain %_ptr_Function_int %tree %48 %uint_1
+               OpStore %69 %int_1
+         %70 = OpAccessChain %_ptr_Function_BST %tree %int_1
+               OpStore %70 %71
+               OpStore %x_90_phi %true
+               OpBranch %41
+         %68 = OpLabel
+         %73 = OpAccessChain %_ptr_Function_int %tree %48 %uint_1
+         %74 = OpLoad %int %73
+               OpStore %x_88 %74
+         %75 = OpLoad %int %x_88
+               OpStore %x_63_phi %75
+               OpBranch %42
+         %66 = OpLabel
+               OpReturn
+         %61 = OpLabel
+         %77 = OpAccessChain %_ptr_Function_int %tree %48 %uint_2
+         %78 = OpLoad %int %77
+         %79 = OpIEqual %bool %78 %int_n1
+               OpSelectionMerge %80 None
+               OpBranchConditional %79 %81 %82
+         %81 = OpLabel
+         %83 = OpAccessChain %_ptr_Function_int %tree %48 %uint_2
+               OpStore %83 %int_1
+         %84 = OpAccessChain %_ptr_Function_BST %tree %int_1
+               OpStore %84 %71
+               OpStore %x_90_phi %true
+               OpBranch %41
+         %82 = OpLabel
+         %85 = OpAccessChain %_ptr_Function_int %tree %48 %uint_2
+         %86 = OpLoad %int %85
+               OpStore %x_80 %86
+         %87 = OpLoad %int %x_80
+               OpStore %x_63_phi %87
+               OpBranch %42
+         %80 = OpLabel
+               OpReturn
+         %59 = OpLabel
+               OpReturn
+         %42 = OpLabel
+         %88 = OpLoad %int %x_63_phi
+               OpStore %x_63 %88
+         %89 = OpLoad %int %x_63
+               OpStore %x_62_phi %89
+               OpBranch %40
+         %41 = OpLabel
+         %90 = OpLoad %bool %x_90_phi
+               OpSelectionMerge %91 None
+               OpBranchConditional %90 %92 %91
+         %92 = OpLabel
+               OpBranch %37
+         %91 = OpLabel
+               OpBranch %37
+         %37 = OpLabel
+               OpSelectionMerge %95 None
+               OpSwitch %uint_0 %96
+         %96 = OpLabel
+               OpStore %x_95_phi %int_0
+               OpBranch %97
+         %97 = OpLabel
+               OpLoopMerge %98 %99 None
+               OpBranch %100
+        %100 = OpLabel
+        %105 = OpLoad %int %x_95_phi
+               OpStore %x_123_phi %false
+        %107 = OpSLessThanEqual %bool %105 %int_2
+               OpSelectionMerge %108 None
+               OpBranchConditional %107 %109 %110
+        %109 = OpLabel
+               OpBranch %108
+        %110 = OpLabel
+               OpBranch %98
+        %108 = OpLabel
+        %111 = OpAccessChain %_ptr_Function_int %tree %105 %uint_0
+        %112 = OpLoad %int %111
+        %114 = OpSLessThanEqual %bool %int_12 %112
+               OpSelectionMerge %115 None
+               OpBranchConditional %114 %116 %117
+        %116 = OpLabel
+        %118 = OpAccessChain %_ptr_Function_int %tree %105 %uint_1
+        %119 = OpLoad %int %118
+        %120 = OpIEqual %bool %119 %int_n1
+               OpSelectionMerge %121 None
+               OpBranchConditional %120 %122 %123
+        %122 = OpLabel
+        %124 = OpAccessChain %_ptr_Function_int %tree %105 %uint_1
+               OpStore %124 %int_2
+        %125 = OpAccessChain %_ptr_Function_BST %tree %int_2
+               OpStore %125 %126
+               OpStore %x_123_phi %true
+               OpBranch %98
+        %123 = OpLabel
+        %127 = OpAccessChain %_ptr_Function_int %tree %105 %uint_1
+        %128 = OpLoad %int %127
+               OpStore %x_121 %128
+        %129 = OpLoad %int %x_121
+               OpStore %x_96_phi %129
+               OpBranch %99
+        %121 = OpLabel
+               OpReturn
+        %117 = OpLabel
+        %130 = OpAccessChain %_ptr_Function_int %tree %105 %uint_2
+        %131 = OpLoad %int %130
+        %132 = OpIEqual %bool %131 %int_n1
+               OpSelectionMerge %133 None
+               OpBranchConditional %132 %134 %135
+        %134 = OpLabel
+        %136 = OpAccessChain %_ptr_Function_int %tree %105 %uint_2
+               OpStore %136 %int_2
+        %137 = OpAccessChain %_ptr_Function_BST %tree %int_2
+               OpStore %137 %126
+               OpStore %x_123_phi %true
+               OpBranch %98
+        %135 = OpLabel
+        %138 = OpAccessChain %_ptr_Function_int %tree %105 %uint_2
+        %139 = OpLoad %int %138
+               OpStore %x_113 %139
+        %140 = OpLoad %int %x_113
+               OpStore %x_96_phi %140
+               OpBranch %99
+        %133 = OpLabel
+               OpReturn
+        %115 = OpLabel
+               OpReturn
+         %99 = OpLabel
+        %141 = OpLoad %int %x_96_phi
+               OpStore %x_96 %141
+        %142 = OpLoad %int %x_96
+               OpStore %x_95_phi %142
+               OpBranch %97
+         %98 = OpLabel
+        %143 = OpLoad %bool %x_123_phi
+               OpSelectionMerge %144 None
+               OpBranchConditional %143 %145 %144
+        %145 = OpLabel
+               OpBranch %95
+        %144 = OpLabel
+               OpBranch %95
+         %95 = OpLabel
+               OpSelectionMerge %148 None
+               OpSwitch %uint_0 %149
+        %149 = OpLabel
+               OpStore %x_128_phi %int_0
+               OpBranch %150
+        %150 = OpLabel
+               OpLoopMerge %151 %152 None
+               OpBranch %153
+        %153 = OpLabel
+        %158 = OpLoad %int %x_128_phi
+               OpStore %x_156_phi %false
+        %160 = OpSLessThanEqual %bool %158 %int_3
+               OpSelectionMerge %161 None
+               OpBranchConditional %160 %162 %163
+        %162 = OpLabel
+               OpBranch %161
+        %163 = OpLabel
+               OpBranch %151
+        %161 = OpLabel
+        %164 = OpAccessChain %_ptr_Function_int %tree %158 %uint_0
+        %165 = OpLoad %int %164
+        %167 = OpSLessThanEqual %bool %int_15 %165
+               OpSelectionMerge %168 None
+               OpBranchConditional %167 %169 %170
+        %169 = OpLabel
+        %171 = OpAccessChain %_ptr_Function_int %tree %158 %uint_1
+        %172 = OpLoad %int %171
+        %173 = OpIEqual %bool %172 %int_n1
+               OpSelectionMerge %174 None
+               OpBranchConditional %173 %175 %176
+        %175 = OpLabel
+        %177 = OpAccessChain %_ptr_Function_int %tree %158 %uint_1
+               OpStore %177 %int_3
+        %178 = OpAccessChain %_ptr_Function_BST %tree %int_3
+               OpStore %178 %179
+               OpStore %x_156_phi %true
+               OpBranch %151
+        %176 = OpLabel
+        %180 = OpAccessChain %_ptr_Function_int %tree %158 %uint_1
+        %181 = OpLoad %int %180
+               OpStore %x_154 %181
+        %182 = OpLoad %int %x_154
+               OpStore %x_129_phi %182
+               OpBranch %152
+        %174 = OpLabel
+               OpReturn
+        %170 = OpLabel
+        %183 = OpAccessChain %_ptr_Function_int %tree %158 %uint_2
+        %184 = OpLoad %int %183
+        %185 = OpIEqual %bool %184 %int_n1
+               OpSelectionMerge %186 None
+               OpBranchConditional %185 %187 %188
+        %187 = OpLabel
+        %189 = OpAccessChain %_ptr_Function_int %tree %158 %uint_2
+               OpStore %189 %int_3
+        %190 = OpAccessChain %_ptr_Function_BST %tree %int_3
+               OpStore %190 %179
+               OpStore %x_156_phi %true
+               OpBranch %151
+        %188 = OpLabel
+        %191 = OpAccessChain %_ptr_Function_int %tree %158 %uint_2
+        %192 = OpLoad %int %191
+               OpStore %x_146 %192
+        %193 = OpLoad %int %x_146
+               OpStore %x_129_phi %193
+               OpBranch %152
+        %186 = OpLabel
+               OpReturn
+        %168 = OpLabel
+               OpReturn
+        %152 = OpLabel
+        %194 = OpLoad %int %x_129_phi
+               OpStore %x_129 %194
+        %195 = OpLoad %int %x_129
+               OpStore %x_128_phi %195
+               OpBranch %150
+        %151 = OpLabel
+        %196 = OpLoad %bool %x_156_phi
+               OpSelectionMerge %197 None
+               OpBranchConditional %196 %198 %197
+        %198 = OpLabel
+               OpBranch %148
+        %197 = OpLabel
+               OpBranch %148
+        %148 = OpLabel
+               OpSelectionMerge %201 None
+               OpSwitch %uint_0 %202
+        %202 = OpLabel
+               OpStore %x_161_phi %int_0
+               OpBranch %203
+        %203 = OpLabel
+               OpLoopMerge %204 %205 None
+               OpBranch %206
+        %206 = OpLabel
+        %211 = OpLoad %int %x_161_phi
+               OpStore %x_189_phi %false
+        %213 = OpSLessThanEqual %bool %211 %int_4
+               OpSelectionMerge %214 None
+               OpBranchConditional %213 %215 %216
+        %215 = OpLabel
+               OpBranch %214
+        %216 = OpLabel
+               OpBranch %204
+        %214 = OpLabel
+        %217 = OpAccessChain %_ptr_Function_int %tree %211 %uint_0
+        %218 = OpLoad %int %217
+        %220 = OpSLessThanEqual %bool %int_7 %218
+               OpSelectionMerge %221 None
+               OpBranchConditional %220 %222 %223
+        %222 = OpLabel
+        %224 = OpAccessChain %_ptr_Function_int %tree %211 %uint_1
+        %225 = OpLoad %int %224
+        %226 = OpIEqual %bool %225 %int_n1
+               OpSelectionMerge %227 None
+               OpBranchConditional %226 %228 %229
+        %228 = OpLabel
+        %230 = OpAccessChain %_ptr_Function_int %tree %211 %uint_1
+               OpStore %230 %int_4
+        %231 = OpAccessChain %_ptr_Function_BST %tree %int_4
+               OpStore %231 %232
+               OpStore %x_189_phi %true
+               OpBranch %204
+        %229 = OpLabel
+        %233 = OpAccessChain %_ptr_Function_int %tree %211 %uint_1
+        %234 = OpLoad %int %233
+               OpStore %x_187 %234
+        %235 = OpLoad %int %x_187
+               OpStore %x_162_phi %235
+               OpBranch %205
+        %227 = OpLabel
+               OpReturn
+        %223 = OpLabel
+        %236 = OpAccessChain %_ptr_Function_int %tree %211 %uint_2
+        %237 = OpLoad %int %236
+        %238 = OpIEqual %bool %237 %int_n1
+               OpSelectionMerge %239 None
+               OpBranchConditional %238 %240 %241
+        %240 = OpLabel
+        %242 = OpAccessChain %_ptr_Function_int %tree %211 %uint_2
+               OpStore %242 %int_4
+        %243 = OpAccessChain %_ptr_Function_BST %tree %int_4
+               OpStore %243 %232
+               OpStore %x_189_phi %true
+               OpBranch %204
+        %241 = OpLabel
+        %244 = OpAccessChain %_ptr_Function_int %tree %211 %uint_2
+        %245 = OpLoad %int %244
+               OpStore %x_179 %245
+        %246 = OpLoad %int %x_179
+               OpStore %x_162_phi %246
+               OpBranch %205
+        %239 = OpLabel
+               OpReturn
+        %221 = OpLabel
+               OpReturn
+        %205 = OpLabel
+        %247 = OpLoad %int %x_162_phi
+               OpStore %x_162 %247
+        %248 = OpLoad %int %x_162
+               OpStore %x_161_phi %248
+               OpBranch %203
+        %204 = OpLabel
+        %249 = OpLoad %bool %x_189_phi
+               OpSelectionMerge %250 None
+               OpBranchConditional %249 %251 %250
+        %251 = OpLabel
+               OpBranch %201
+        %250 = OpLabel
+               OpBranch %201
+        %201 = OpLabel
+               OpSelectionMerge %254 None
+               OpSwitch %uint_0 %255
+        %255 = OpLabel
+               OpStore %x_194_phi %int_0
+               OpBranch %256
+        %256 = OpLabel
+               OpLoopMerge %257 %258 None
+               OpBranch %259
+        %259 = OpLabel
+        %264 = OpLoad %int %x_194_phi
+               OpStore %x_222_phi %false
+        %265 = OpSLessThanEqual %bool %264 %int_5
+               OpSelectionMerge %266 None
+               OpBranchConditional %265 %267 %268
+        %267 = OpLabel
+               OpBranch %266
+        %268 = OpLabel
+               OpBranch %257
+        %266 = OpLabel
+        %269 = OpAccessChain %_ptr_Function_int %tree %264 %uint_0
+        %270 = OpLoad %int %269
+        %272 = OpSLessThanEqual %bool %int_8 %270
+               OpSelectionMerge %273 None
+               OpBranchConditional %272 %274 %275
+        %274 = OpLabel
+        %276 = OpAccessChain %_ptr_Function_int %tree %264 %uint_1
+        %277 = OpLoad %int %276
+        %278 = OpIEqual %bool %277 %int_n1
+               OpSelectionMerge %279 None
+               OpBranchConditional %278 %280 %281
+        %280 = OpLabel
+        %282 = OpAccessChain %_ptr_Function_int %tree %264 %uint_1
+               OpStore %282 %int_5
+        %283 = OpAccessChain %_ptr_Function_BST %tree %int_5
+               OpStore %283 %284
+               OpStore %x_222_phi %true
+               OpBranch %257
+        %281 = OpLabel
+        %285 = OpAccessChain %_ptr_Function_int %tree %264 %uint_1
+        %286 = OpLoad %int %285
+               OpStore %x_220 %286
+        %287 = OpLoad %int %x_220
+               OpStore %x_195_phi %287
+               OpBranch %258
+        %279 = OpLabel
+               OpReturn
+        %275 = OpLabel
+        %288 = OpAccessChain %_ptr_Function_int %tree %264 %uint_2
+        %289 = OpLoad %int %288
+        %290 = OpIEqual %bool %289 %int_n1
+               OpSelectionMerge %291 None
+               OpBranchConditional %290 %292 %293
+        %292 = OpLabel
+        %294 = OpAccessChain %_ptr_Function_int %tree %264 %uint_2
+               OpStore %294 %int_5
+        %295 = OpAccessChain %_ptr_Function_BST %tree %int_5
+               OpStore %295 %284
+               OpStore %x_222_phi %true
+               OpBranch %257
+        %293 = OpLabel
+        %296 = OpAccessChain %_ptr_Function_int %tree %264 %uint_2
+        %297 = OpLoad %int %296
+               OpStore %x_212 %297
+        %298 = OpLoad %int %x_212
+               OpStore %x_195_phi %298
+               OpBranch %258
+        %291 = OpLabel
+               OpReturn
+        %273 = OpLabel
+               OpReturn
+        %258 = OpLabel
+        %299 = OpLoad %int %x_195_phi
+               OpStore %x_195 %299
+        %300 = OpLoad %int %x_195
+               OpStore %x_194_phi %300
+               OpBranch %256
+        %257 = OpLabel
+        %301 = OpLoad %bool %x_222_phi
+               OpSelectionMerge %302 None
+               OpBranchConditional %301 %303 %302
+        %303 = OpLabel
+               OpBranch %254
+        %302 = OpLabel
+               OpBranch %254
+        %254 = OpLabel
+               OpSelectionMerge %306 None
+               OpSwitch %uint_0 %307
+        %307 = OpLabel
+               OpStore %x_227_phi %int_0
+               OpBranch %308
+        %308 = OpLabel
+               OpLoopMerge %309 %310 None
+               OpBranch %311
+        %311 = OpLabel
+        %316 = OpLoad %int %x_227_phi
+               OpStore %x_255_phi %false
+        %318 = OpSLessThanEqual %bool %316 %int_6
+               OpSelectionMerge %319 None
+               OpBranchConditional %318 %320 %321
+        %320 = OpLabel
+               OpBranch %319
+        %321 = OpLabel
+               OpBranch %309
+        %319 = OpLabel
+        %322 = OpAccessChain %_ptr_Function_int %tree %316 %uint_0
+        %323 = OpLoad %int %322
+        %324 = OpSLessThanEqual %bool %int_2 %323
+               OpSelectionMerge %325 None
+               OpBranchConditional %324 %326 %327
+        %326 = OpLabel
+        %328 = OpAccessChain %_ptr_Function_int %tree %316 %uint_1
+        %329 = OpLoad %int %328
+        %330 = OpIEqual %bool %329 %int_n1
+               OpSelectionMerge %331 None
+               OpBranchConditional %330 %332 %333
+        %332 = OpLabel
+        %334 = OpAccessChain %_ptr_Function_int %tree %316 %uint_1
+               OpStore %334 %int_6
+        %335 = OpAccessChain %_ptr_Function_BST %tree %int_6
+               OpStore %335 %336
+               OpStore %x_255_phi %true
+               OpBranch %309
+        %333 = OpLabel
+        %337 = OpAccessChain %_ptr_Function_int %tree %316 %uint_1
+        %338 = OpLoad %int %337
+               OpStore %x_253 %338
+        %339 = OpLoad %int %x_253
+               OpStore %x_228_phi %339
+               OpBranch %310
+        %331 = OpLabel
+               OpReturn
+        %327 = OpLabel
+        %340 = OpAccessChain %_ptr_Function_int %tree %316 %uint_2
+        %341 = OpLoad %int %340
+        %342 = OpIEqual %bool %341 %int_n1
+               OpSelectionMerge %343 None
+               OpBranchConditional %342 %344 %345
+        %344 = OpLabel
+        %346 = OpAccessChain %_ptr_Function_int %tree %316 %uint_2
+               OpStore %346 %int_6
+        %347 = OpAccessChain %_ptr_Function_BST %tree %int_6
+               OpStore %347 %336
+               OpStore %x_255_phi %true
+               OpBranch %309
+        %345 = OpLabel
+        %348 = OpAccessChain %_ptr_Function_int %tree %316 %uint_2
+        %349 = OpLoad %int %348
+               OpStore %x_245 %349
+        %350 = OpLoad %int %x_245
+               OpStore %x_228_phi %350
+               OpBranch %310
+        %343 = OpLabel
+               OpReturn
+        %325 = OpLabel
+               OpReturn
+        %310 = OpLabel
+        %351 = OpLoad %int %x_228_phi
+               OpStore %x_228 %351
+        %352 = OpLoad %int %x_228
+               OpStore %x_227_phi %352
+               OpBranch %308
+        %309 = OpLabel
+        %353 = OpLoad %bool %x_255_phi
+               OpSelectionMerge %354 None
+               OpBranchConditional %353 %355 %354
+        %355 = OpLabel
+               OpBranch %306
+        %354 = OpLabel
+               OpBranch %306
+        %306 = OpLabel
+               OpSelectionMerge %358 None
+               OpSwitch %uint_0 %359
+        %359 = OpLabel
+               OpStore %x_260_phi %int_0
+               OpBranch %360
+        %360 = OpLabel
+               OpLoopMerge %361 %362 None
+               OpBranch %363
+        %363 = OpLabel
+        %368 = OpLoad %int %x_260_phi
+               OpStore %x_288_phi %false
+        %369 = OpSLessThanEqual %bool %368 %int_7
+               OpSelectionMerge %370 None
+               OpBranchConditional %369 %371 %372
+        %371 = OpLabel
+               OpBranch %370
+        %372 = OpLabel
+               OpBranch %361
+        %370 = OpLabel
+        %373 = OpAccessChain %_ptr_Function_int %tree %368 %uint_0
+        %374 = OpLoad %int %373
+        %375 = OpSLessThanEqual %bool %int_6 %374
+               OpSelectionMerge %376 None
+               OpBranchConditional %375 %377 %378
+        %377 = OpLabel
+        %379 = OpAccessChain %_ptr_Function_int %tree %368 %uint_1
+        %380 = OpLoad %int %379
+        %381 = OpIEqual %bool %380 %int_n1
+               OpSelectionMerge %382 None
+               OpBranchConditional %381 %383 %384
+        %383 = OpLabel
+        %385 = OpAccessChain %_ptr_Function_int %tree %368 %uint_1
+               OpStore %385 %int_7
+        %386 = OpAccessChain %_ptr_Function_BST %tree %int_7
+               OpStore %386 %387
+               OpStore %x_288_phi %true
+               OpBranch %361
+        %384 = OpLabel
+        %388 = OpAccessChain %_ptr_Function_int %tree %368 %uint_1
+        %389 = OpLoad %int %388
+               OpStore %x_286 %389
+        %390 = OpLoad %int %x_286
+               OpStore %x_261_phi %390
+               OpBranch %362
+        %382 = OpLabel
+               OpReturn
+        %378 = OpLabel
+        %391 = OpAccessChain %_ptr_Function_int %tree %368 %uint_2
+        %392 = OpLoad %int %391
+        %393 = OpIEqual %bool %392 %int_n1
+               OpSelectionMerge %394 None
+               OpBranchConditional %393 %395 %396
+        %395 = OpLabel
+        %397 = OpAccessChain %_ptr_Function_int %tree %368 %uint_2
+               OpStore %397 %int_7
+        %398 = OpAccessChain %_ptr_Function_BST %tree %int_7
+               OpStore %398 %387
+               OpStore %x_288_phi %true
+               OpBranch %361
+        %396 = OpLabel
+        %399 = OpAccessChain %_ptr_Function_int %tree %368 %uint_2
+        %400 = OpLoad %int %399
+               OpStore %x_278 %400
+        %401 = OpLoad %int %x_278
+               OpStore %x_261_phi %401
+               OpBranch %362
+        %394 = OpLabel
+               OpReturn
+        %376 = OpLabel
+               OpReturn
+        %362 = OpLabel
+        %402 = OpLoad %int %x_261_phi
+               OpStore %x_261 %402
+        %403 = OpLoad %int %x_261
+               OpStore %x_260_phi %403
+               OpBranch %360
+        %361 = OpLabel
+        %404 = OpLoad %bool %x_288_phi
+               OpSelectionMerge %405 None
+               OpBranchConditional %404 %406 %405
+        %406 = OpLabel
+               OpBranch %358
+        %405 = OpLabel
+               OpBranch %358
+        %358 = OpLabel
+               OpSelectionMerge %409 None
+               OpSwitch %uint_0 %410
+        %410 = OpLabel
+               OpStore %x_293_phi %int_0
+               OpBranch %411
+        %411 = OpLabel
+               OpLoopMerge %412 %413 None
+               OpBranch %414
+        %414 = OpLabel
+        %419 = OpLoad %int %x_293_phi
+               OpStore %x_321_phi %false
+        %420 = OpSLessThanEqual %bool %419 %int_8
+               OpSelectionMerge %421 None
+               OpBranchConditional %420 %422 %423
+        %422 = OpLabel
+               OpBranch %421
+        %423 = OpLabel
+               OpBranch %412
+        %421 = OpLabel
+        %424 = OpAccessChain %_ptr_Function_int %tree %419 %uint_0
+        %425 = OpLoad %int %424
+        %427 = OpSLessThanEqual %bool %int_17 %425
+               OpSelectionMerge %428 None
+               OpBranchConditional %427 %429 %430
+        %429 = OpLabel
+        %431 = OpAccessChain %_ptr_Function_int %tree %419 %uint_1
+        %432 = OpLoad %int %431
+        %433 = OpIEqual %bool %432 %int_n1
+               OpSelectionMerge %434 None
+               OpBranchConditional %433 %435 %436
+        %435 = OpLabel
+        %437 = OpAccessChain %_ptr_Function_int %tree %419 %uint_1
+               OpStore %437 %int_8
+        %438 = OpAccessChain %_ptr_Function_BST %tree %int_8
+               OpStore %438 %439
+               OpStore %x_321_phi %true
+               OpBranch %412
+        %436 = OpLabel
+        %440 = OpAccessChain %_ptr_Function_int %tree %419 %uint_1
+        %441 = OpLoad %int %440
+               OpStore %x_319 %441
+        %442 = OpLoad %int %x_319
+               OpStore %x_294_phi %442
+               OpBranch %413
+        %434 = OpLabel
+               OpReturn
+        %430 = OpLabel
+        %443 = OpAccessChain %_ptr_Function_int %tree %419 %uint_2
+        %444 = OpLoad %int %443
+        %445 = OpIEqual %bool %444 %int_n1
+               OpSelectionMerge %446 None
+               OpBranchConditional %445 %447 %448
+        %447 = OpLabel
+        %449 = OpAccessChain %_ptr_Function_int %tree %419 %uint_2
+               OpStore %449 %int_8
+        %450 = OpAccessChain %_ptr_Function_BST %tree %int_8
+               OpStore %450 %439
+               OpStore %x_321_phi %true
+               OpBranch %412
+        %448 = OpLabel
+        %451 = OpAccessChain %_ptr_Function_int %tree %419 %uint_2
+        %452 = OpLoad %int %451
+               OpStore %x_311 %452
+        %453 = OpLoad %int %x_311
+               OpStore %x_294_phi %453
+               OpBranch %413
+        %446 = OpLabel
+               OpReturn
+        %428 = OpLabel
+               OpReturn
+        %413 = OpLabel
+        %454 = OpLoad %int %x_294_phi
+               OpStore %x_294 %454
+        %455 = OpLoad %int %x_294
+               OpStore %x_293_phi %455
+               OpBranch %411
+        %412 = OpLabel
+        %456 = OpLoad %bool %x_321_phi
+               OpSelectionMerge %457 None
+               OpBranchConditional %456 %458 %457
+        %458 = OpLabel
+               OpBranch %409
+        %457 = OpLabel
+               OpBranch %409
+        %409 = OpLabel
+               OpSelectionMerge %461 None
+               OpSwitch %uint_0 %462
+        %462 = OpLabel
+               OpStore %x_326_phi %int_0
+               OpBranch %463
+        %463 = OpLabel
+               OpLoopMerge %464 %465 None
+               OpBranch %466
+        %466 = OpLabel
+        %471 = OpLoad %int %x_326_phi
+               OpStore %x_354_phi %false
+        %472 = OpSLessThanEqual %bool %471 %int_9
+               OpSelectionMerge %473 None
+               OpBranchConditional %472 %474 %475
+        %474 = OpLabel
+               OpBranch %473
+        %475 = OpLabel
+               OpBranch %464
+        %473 = OpLabel
+        %476 = OpAccessChain %_ptr_Function_int %tree %471 %uint_0
+        %477 = OpLoad %int %476
+        %479 = OpSLessThanEqual %bool %int_13 %477
+               OpSelectionMerge %480 None
+               OpBranchConditional %479 %481 %482
+        %481 = OpLabel
+        %483 = OpAccessChain %_ptr_Function_int %tree %471 %uint_1
+        %484 = OpLoad %int %483
+        %485 = OpIEqual %bool %484 %int_n1
+               OpSelectionMerge %486 None
+               OpBranchConditional %485 %487 %488
+        %487 = OpLabel
+        %489 = OpAccessChain %_ptr_Function_int %tree %471 %uint_1
+               OpStore %489 %int_9
+        %490 = OpAccessChain %_ptr_Function_BST %tree %int_9
+               OpStore %490 %491
+               OpStore %x_354_phi %true
+               OpBranch %464
+        %488 = OpLabel
+        %492 = OpAccessChain %_ptr_Function_int %tree %471 %uint_1
+        %493 = OpLoad %int %492
+               OpStore %x_352 %493
+        %494 = OpLoad %int %x_352
+               OpStore %x_327_phi %494
+               OpBranch %465
+        %486 = OpLabel
+               OpReturn
+        %482 = OpLabel
+        %495 = OpAccessChain %_ptr_Function_int %tree %471 %uint_2
+        %496 = OpLoad %int %495
+        %497 = OpIEqual %bool %496 %int_n1
+               OpSelectionMerge %498 None
+               OpBranchConditional %497 %499 %500
+        %499 = OpLabel
+        %501 = OpAccessChain %_ptr_Function_int %tree %471 %uint_2
+               OpStore %501 %int_9
+        %502 = OpAccessChain %_ptr_Function_BST %tree %int_9
+               OpStore %502 %491
+               OpStore %x_354_phi %true
+               OpBranch %464
+        %500 = OpLabel
+        %503 = OpAccessChain %_ptr_Function_int %tree %471 %uint_2
+        %504 = OpLoad %int %503
+               OpStore %x_344 %504
+        %505 = OpLoad %int %x_344
+               OpStore %x_327_phi %505
+               OpBranch %465
+        %498 = OpLabel
+               OpReturn
+        %480 = OpLabel
+               OpReturn
+        %465 = OpLabel
+        %506 = OpLoad %int %x_327_phi
+               OpStore %x_327 %506
+        %507 = OpLoad %int %x_327
+               OpStore %x_326_phi %507
+               OpBranch %463
+        %464 = OpLabel
+        %508 = OpLoad %bool %x_354_phi
+               OpSelectionMerge %509 None
+               OpBranchConditional %508 %510 %509
+        %510 = OpLabel
+               OpBranch %461
+        %509 = OpLabel
+               OpBranch %461
+        %461 = OpLabel
+               OpStore %x_357_phi %int_0
+               OpStore %x_360_phi %int_0
+               OpStore %x_362_phi %int_0
+               OpBranch %511
+        %511 = OpLabel
+               OpLoopMerge %512 %513 None
+               OpBranch %514
+        %514 = OpLabel
+        %521 = OpLoad %int %x_357_phi
+        %522 = OpLoad %int %x_360_phi
+               OpStore %x_360 %522
+        %523 = OpLoad %int %x_362_phi
+        %524 = OpISub %int %int_6 %int_15
+        %526 = OpSLessThan %bool %523 %int_20
+               OpSelectionMerge %527 None
+               OpBranchConditional %526 %528 %529
+        %528 = OpLabel
+               OpBranch %527
+        %529 = OpLabel
+               OpBranch %512
+        %527 = OpLabel
+               OpSelectionMerge %533 None
+               OpSwitch %uint_0 %534
+        %534 = OpLabel
+               OpStore %x_374_phi %int_0
+               OpBranch %535
+        %535 = OpLabel
+               OpLoopMerge %536 %537 None
+               OpBranch %538
+        %538 = OpLabel
+        %539 = OpLoad %int %x_374_phi
+               OpStore %x_392_phi %521
+               OpStore %x_393_phi %false
+        %540 = OpINotEqual %bool %539 %int_n1
+               OpSelectionMerge %541 None
+               OpBranchConditional %540 %542 %543
+        %542 = OpLabel
+               OpBranch %541
+        %543 = OpLabel
+               OpBranch %536
+        %541 = OpLabel
+        %544 = OpAccessChain %_ptr_Function_BST %tree %539
+        %545 = OpLoad %BST %544
+        %546 = OpCompositeExtract %int %545 0
+        %547 = OpCompositeExtract %int %545 1
+        %548 = OpCompositeExtract %int %545 2
+        %549 = OpIEqual %bool %546 %523
+               OpSelectionMerge %550 None
+               OpBranchConditional %549 %551 %550
+        %551 = OpLabel
+               OpStore %x_392_phi %523
+               OpStore %x_393_phi %true
+               OpBranch %536
+        %550 = OpLabel
+        %554 = OpULessThanEqual %bool %uint_3 %uint_3
+        %552 = OpSelect %uint %554 %uint_3 %uint_3
+        %556 = OpAccessChain %_ptr_Private_float %x_GLF_color %552
+        %557 = OpLoad %float %556
+               OpBranch %537
+        %537 = OpLabel
+        %560 = OpSLessThanEqual %bool %523 %546
+        %559 = OpLogicalNot %bool %560
+        %558 = OpSelect %int %559 %548 %547
+               OpStore %x_374_phi %558
+               OpBranch %535
+        %536 = OpLabel
+        %561 = OpLoad %int %x_392_phi
+               OpStore %x_392 %561
+        %562 = OpLoad %bool %x_393_phi
+        %563 = OpLoad %int %x_392
+               OpStore %x_358_phi %563
+               OpSelectionMerge %564 None
+               OpBranchConditional %562 %565 %564
+        %565 = OpLabel
+               OpBranch %533
+        %564 = OpLabel
+               OpStore %x_358_phi %int_n1
+               OpBranch %533
+        %533 = OpLabel
+        %571 = OpLoad %int %x_358_phi
+               OpStore %x_358 %571
+               OpSelectionMerge %572 None
+               OpSwitch %523 %573 2 %574 5 %574 6 %574 7 %574 8 %574 9 %574 12 %574 13 %574 15 %574 17 %574
+        %574 = OpLabel
+        %575 = OpLoad %int %x_360
+               OpStore %x_402_phi %575
+        %576 = OpLoad %int %x_358
+        %577 = OpCopyObject %int %523
+        %578 = OpIEqual %bool %576 %577
+               OpSelectionMerge %579 None
+               OpBranchConditional %578 %580 %579
+        %580 = OpLabel
+        %582 = OpLoad %int %x_360
+        %583 = OpCopyObject %int %int_1
+        %584 = OpIAdd %int %582 %583
+        %581 = OpCopyObject %int %584
+               OpStore %x_401 %581
+        %585 = OpLoad %int %x_401
+               OpStore %x_402_phi %585
+               OpBranch %579
+        %579 = OpLabel
+        %586 = OpLoad %int %x_402_phi
+               OpStore %x_402 %586
+        %587 = OpLoad %int %x_402
+               OpStore %x_361_phi %587
+               OpBranch %572
+        %573 = OpLabel
+        %588 = OpLoad %int %x_360
+               OpStore %x_407_phi %588
+        %589 = OpLoad %int %x_358
+        %590 = OpCopyObject %int %int_n1
+        %591 = OpIEqual %bool %589 %590
+               OpSelectionMerge %592 None
+               OpBranchConditional %591 %593 %592
+        %593 = OpLabel
+        %595 = OpLoad %int %x_360
+        %596 = OpCopyObject %int %int_1
+        %597 = OpIAdd %int %595 %596
+        %594 = OpCopyObject %int %597
+               OpStore %x_406 %594
+        %598 = OpLoad %int %x_406
+               OpStore %x_407_phi %598
+               OpBranch %592
+        %592 = OpLabel
+        %599 = OpLoad %int %x_407_phi
+               OpStore %x_407 %599
+        %600 = OpLoad %int %x_407
+               OpStore %x_361_phi %600
+               OpBranch %572
+        %572 = OpLabel
+        %601 = OpLoad %int %x_361_phi
+               OpBranch %513
+        %513 = OpLabel
+        %602 = OpIAdd %int %523 %int_1
+               OpStore %x_363 %602
+        %603 = OpLoad %int %x_358
+               OpStore %x_357_phi %603
+               OpStore %x_360_phi %601
+        %604 = OpLoad %int %x_363
+               OpStore %x_362_phi %604
+               OpBranch %511
+        %512 = OpLabel
+        %605 = OpLoad %int %x_360
+        %606 = OpCopyObject %int %int_20
+        %607 = OpIEqual %bool %605 %606
+               OpSelectionMerge %608 None
+               OpBranchConditional %607 %609 %610
+        %609 = OpLabel
+               OpStore %x_GLF_color %613
+               OpBranch %608
+        %610 = OpLabel
+               OpStore %x_GLF_color %614
+               OpBranch %608
+        %608 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %615
+%tint_symbol = OpFunctionParameter %main_out
+        %619 = OpLabel
+        %620 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %620
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+        %622 = OpLabel
+        %623 = OpFunctionCall %void %main_1
+        %625 = OpLoad %v4float %x_GLF_color
+        %626 = OpCompositeConstruct %main_out %625
+        %624 = OpFunctionCall %void %tint_symbol_2 %626
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-load-from-frag-color/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-load-from-frag-color/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..0c19b19
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-load-from-frag-color/1.wgsl.expected.wgsl
@@ -0,0 +1,655 @@
+struct BST {
+  data : i32;
+  leftIndex : i32;
+  rightIndex : i32;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var tree : array<BST, 10>;
+  var x_360 : i32;
+  var x_62_phi : i32;
+  var x_90_phi : bool;
+  var x_357_phi : i32;
+  var x_360_phi : i32;
+  var x_362_phi : i32;
+  tree[0] = BST(9, -1, -1);
+  switch(0u) {
+    default: {
+      x_62_phi = 0;
+      loop {
+        var x_88 : i32;
+        var x_80 : i32;
+        var x_63 : i32;
+        var x_63_phi : i32;
+        let x_62 : i32 = x_62_phi;
+        x_90_phi = false;
+        if ((x_62 <= 1)) {
+        } else {
+          break;
+        }
+        let x_69 : i32 = tree[x_62].data;
+        if ((5 <= x_69)) {
+          let x_82 : ptr<function, i32> = &(tree[x_62].leftIndex);
+          let x_83 : i32 = *(x_82);
+          if ((x_83 == -1)) {
+            *(x_82) = 1;
+            tree[1] = BST(5, -1, -1);
+            x_90_phi = true;
+            break;
+          } else {
+            x_88 = *(x_82);
+            x_63_phi = x_88;
+            continue;
+          }
+          return;
+        } else {
+          let x_74 : ptr<function, i32> = &(tree[x_62].rightIndex);
+          let x_75 : i32 = *(x_74);
+          if ((x_75 == -1)) {
+            *(x_74) = 1;
+            tree[1] = BST(5, -1, -1);
+            x_90_phi = true;
+            break;
+          } else {
+            x_80 = *(x_74);
+            x_63_phi = x_80;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_63 = x_63_phi;
+          x_62_phi = x_63;
+        }
+      }
+      let x_90 : bool = x_90_phi;
+      if (x_90) {
+        break;
+      }
+    }
+  }
+  var x_95_phi : i32;
+  var x_123_phi : bool;
+  switch(0u) {
+    default: {
+      x_95_phi = 0;
+      loop {
+        var x_121 : i32;
+        var x_113 : i32;
+        var x_96 : i32;
+        var x_96_phi : i32;
+        let x_95 : i32 = x_95_phi;
+        x_123_phi = false;
+        if ((x_95 <= 2)) {
+        } else {
+          break;
+        }
+        let x_102 : i32 = tree[x_95].data;
+        if ((12 <= x_102)) {
+          let x_115 : ptr<function, i32> = &(tree[x_95].leftIndex);
+          let x_116 : i32 = *(x_115);
+          if ((x_116 == -1)) {
+            *(x_115) = 2;
+            tree[2] = BST(12, -1, -1);
+            x_123_phi = true;
+            break;
+          } else {
+            x_121 = *(x_115);
+            x_96_phi = x_121;
+            continue;
+          }
+          return;
+        } else {
+          let x_107 : ptr<function, i32> = &(tree[x_95].rightIndex);
+          let x_108 : i32 = *(x_107);
+          if ((x_108 == -1)) {
+            *(x_107) = 2;
+            tree[2] = BST(12, -1, -1);
+            x_123_phi = true;
+            break;
+          } else {
+            x_113 = *(x_107);
+            x_96_phi = x_113;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_96 = x_96_phi;
+          x_95_phi = x_96;
+        }
+      }
+      let x_123 : bool = x_123_phi;
+      if (x_123) {
+        break;
+      }
+    }
+  }
+  var x_128_phi : i32;
+  var x_156_phi : bool;
+  switch(0u) {
+    default: {
+      x_128_phi = 0;
+      loop {
+        var x_154 : i32;
+        var x_146 : i32;
+        var x_129 : i32;
+        var x_129_phi : i32;
+        let x_128 : i32 = x_128_phi;
+        x_156_phi = false;
+        if ((x_128 <= 3)) {
+        } else {
+          break;
+        }
+        let x_135 : i32 = tree[x_128].data;
+        if ((15 <= x_135)) {
+          let x_148 : ptr<function, i32> = &(tree[x_128].leftIndex);
+          let x_149 : i32 = *(x_148);
+          if ((x_149 == -1)) {
+            *(x_148) = 3;
+            tree[3] = BST(15, -1, -1);
+            x_156_phi = true;
+            break;
+          } else {
+            x_154 = *(x_148);
+            x_129_phi = x_154;
+            continue;
+          }
+          return;
+        } else {
+          let x_140 : ptr<function, i32> = &(tree[x_128].rightIndex);
+          let x_141 : i32 = *(x_140);
+          if ((x_141 == -1)) {
+            *(x_140) = 3;
+            tree[3] = BST(15, -1, -1);
+            x_156_phi = true;
+            break;
+          } else {
+            x_146 = *(x_140);
+            x_129_phi = x_146;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_129 = x_129_phi;
+          x_128_phi = x_129;
+        }
+      }
+      let x_156 : bool = x_156_phi;
+      if (x_156) {
+        break;
+      }
+    }
+  }
+  var x_161_phi : i32;
+  var x_189_phi : bool;
+  switch(0u) {
+    default: {
+      x_161_phi = 0;
+      loop {
+        var x_187 : i32;
+        var x_179 : i32;
+        var x_162 : i32;
+        var x_162_phi : i32;
+        let x_161 : i32 = x_161_phi;
+        x_189_phi = false;
+        if ((x_161 <= 4)) {
+        } else {
+          break;
+        }
+        let x_168 : i32 = tree[x_161].data;
+        if ((7 <= x_168)) {
+          let x_181 : ptr<function, i32> = &(tree[x_161].leftIndex);
+          let x_182 : i32 = *(x_181);
+          if ((x_182 == -1)) {
+            *(x_181) = 4;
+            tree[4] = BST(7, -1, -1);
+            x_189_phi = true;
+            break;
+          } else {
+            x_187 = *(x_181);
+            x_162_phi = x_187;
+            continue;
+          }
+          return;
+        } else {
+          let x_173 : ptr<function, i32> = &(tree[x_161].rightIndex);
+          let x_174 : i32 = *(x_173);
+          if ((x_174 == -1)) {
+            *(x_173) = 4;
+            tree[4] = BST(7, -1, -1);
+            x_189_phi = true;
+            break;
+          } else {
+            x_179 = *(x_173);
+            x_162_phi = x_179;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_162 = x_162_phi;
+          x_161_phi = x_162;
+        }
+      }
+      let x_189 : bool = x_189_phi;
+      if (x_189) {
+        break;
+      }
+    }
+  }
+  var x_194_phi : i32;
+  var x_222_phi : bool;
+  switch(0u) {
+    default: {
+      x_194_phi = 0;
+      loop {
+        var x_220 : i32;
+        var x_212 : i32;
+        var x_195 : i32;
+        var x_195_phi : i32;
+        let x_194 : i32 = x_194_phi;
+        x_222_phi = false;
+        if ((x_194 <= 5)) {
+        } else {
+          break;
+        }
+        let x_201 : i32 = tree[x_194].data;
+        if ((8 <= x_201)) {
+          let x_214 : ptr<function, i32> = &(tree[x_194].leftIndex);
+          let x_215 : i32 = *(x_214);
+          if ((x_215 == -1)) {
+            *(x_214) = 5;
+            tree[5] = BST(8, -1, -1);
+            x_222_phi = true;
+            break;
+          } else {
+            x_220 = *(x_214);
+            x_195_phi = x_220;
+            continue;
+          }
+          return;
+        } else {
+          let x_206 : ptr<function, i32> = &(tree[x_194].rightIndex);
+          let x_207 : i32 = *(x_206);
+          if ((x_207 == -1)) {
+            *(x_206) = 5;
+            tree[5] = BST(8, -1, -1);
+            x_222_phi = true;
+            break;
+          } else {
+            x_212 = *(x_206);
+            x_195_phi = x_212;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_195 = x_195_phi;
+          x_194_phi = x_195;
+        }
+      }
+      let x_222 : bool = x_222_phi;
+      if (x_222) {
+        break;
+      }
+    }
+  }
+  var x_227_phi : i32;
+  var x_255_phi : bool;
+  switch(0u) {
+    default: {
+      x_227_phi = 0;
+      loop {
+        var x_253 : i32;
+        var x_245 : i32;
+        var x_228 : i32;
+        var x_228_phi : i32;
+        let x_227 : i32 = x_227_phi;
+        x_255_phi = false;
+        if ((x_227 <= 6)) {
+        } else {
+          break;
+        }
+        let x_234 : i32 = tree[x_227].data;
+        if ((2 <= x_234)) {
+          let x_247 : ptr<function, i32> = &(tree[x_227].leftIndex);
+          let x_248 : i32 = *(x_247);
+          if ((x_248 == -1)) {
+            *(x_247) = 6;
+            tree[6] = BST(2, -1, -1);
+            x_255_phi = true;
+            break;
+          } else {
+            x_253 = *(x_247);
+            x_228_phi = x_253;
+            continue;
+          }
+          return;
+        } else {
+          let x_239 : ptr<function, i32> = &(tree[x_227].rightIndex);
+          let x_240 : i32 = *(x_239);
+          if ((x_240 == -1)) {
+            *(x_239) = 6;
+            tree[6] = BST(2, -1, -1);
+            x_255_phi = true;
+            break;
+          } else {
+            x_245 = *(x_239);
+            x_228_phi = x_245;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_228 = x_228_phi;
+          x_227_phi = x_228;
+        }
+      }
+      let x_255 : bool = x_255_phi;
+      if (x_255) {
+        break;
+      }
+    }
+  }
+  var x_260_phi : i32;
+  var x_288_phi : bool;
+  switch(0u) {
+    default: {
+      x_260_phi = 0;
+      loop {
+        var x_286 : i32;
+        var x_278 : i32;
+        var x_261 : i32;
+        var x_261_phi : i32;
+        let x_260 : i32 = x_260_phi;
+        x_288_phi = false;
+        if ((x_260 <= 7)) {
+        } else {
+          break;
+        }
+        let x_267 : i32 = tree[x_260].data;
+        if ((6 <= x_267)) {
+          let x_280 : ptr<function, i32> = &(tree[x_260].leftIndex);
+          let x_281 : i32 = *(x_280);
+          if ((x_281 == -1)) {
+            *(x_280) = 7;
+            tree[7] = BST(6, -1, -1);
+            x_288_phi = true;
+            break;
+          } else {
+            x_286 = *(x_280);
+            x_261_phi = x_286;
+            continue;
+          }
+          return;
+        } else {
+          let x_272 : ptr<function, i32> = &(tree[x_260].rightIndex);
+          let x_273 : i32 = *(x_272);
+          if ((x_273 == -1)) {
+            *(x_272) = 7;
+            tree[7] = BST(6, -1, -1);
+            x_288_phi = true;
+            break;
+          } else {
+            x_278 = *(x_272);
+            x_261_phi = x_278;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_261 = x_261_phi;
+          x_260_phi = x_261;
+        }
+      }
+      let x_288 : bool = x_288_phi;
+      if (x_288) {
+        break;
+      }
+    }
+  }
+  var x_293_phi : i32;
+  var x_321_phi : bool;
+  switch(0u) {
+    default: {
+      x_293_phi = 0;
+      loop {
+        var x_319 : i32;
+        var x_311 : i32;
+        var x_294 : i32;
+        var x_294_phi : i32;
+        let x_293 : i32 = x_293_phi;
+        x_321_phi = false;
+        if ((x_293 <= 8)) {
+        } else {
+          break;
+        }
+        let x_300 : i32 = tree[x_293].data;
+        if ((17 <= x_300)) {
+          let x_313 : ptr<function, i32> = &(tree[x_293].leftIndex);
+          let x_314 : i32 = *(x_313);
+          if ((x_314 == -1)) {
+            *(x_313) = 8;
+            tree[8] = BST(17, -1, -1);
+            x_321_phi = true;
+            break;
+          } else {
+            x_319 = *(x_313);
+            x_294_phi = x_319;
+            continue;
+          }
+          return;
+        } else {
+          let x_305 : ptr<function, i32> = &(tree[x_293].rightIndex);
+          let x_306 : i32 = *(x_305);
+          if ((x_306 == -1)) {
+            *(x_305) = 8;
+            tree[8] = BST(17, -1, -1);
+            x_321_phi = true;
+            break;
+          } else {
+            x_311 = *(x_305);
+            x_294_phi = x_311;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_294 = x_294_phi;
+          x_293_phi = x_294;
+        }
+      }
+      let x_321 : bool = x_321_phi;
+      if (x_321) {
+        break;
+      }
+    }
+  }
+  var x_326_phi : i32;
+  var x_354_phi : bool;
+  switch(0u) {
+    default: {
+      x_326_phi = 0;
+      loop {
+        var x_352 : i32;
+        var x_344 : i32;
+        var x_327 : i32;
+        var x_327_phi : i32;
+        let x_326 : i32 = x_326_phi;
+        x_354_phi = false;
+        if ((x_326 <= 9)) {
+        } else {
+          break;
+        }
+        let x_333 : i32 = tree[x_326].data;
+        if ((13 <= x_333)) {
+          let x_346 : ptr<function, i32> = &(tree[x_326].leftIndex);
+          let x_347 : i32 = *(x_346);
+          if ((x_347 == -1)) {
+            *(x_346) = 9;
+            tree[9] = BST(13, -1, -1);
+            x_354_phi = true;
+            break;
+          } else {
+            x_352 = *(x_346);
+            x_327_phi = x_352;
+            continue;
+          }
+          return;
+        } else {
+          let x_338 : ptr<function, i32> = &(tree[x_326].rightIndex);
+          let x_339 : i32 = *(x_338);
+          if ((x_339 == -1)) {
+            *(x_338) = 9;
+            tree[9] = BST(13, -1, -1);
+            x_354_phi = true;
+            break;
+          } else {
+            x_344 = *(x_338);
+            x_327_phi = x_344;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_327 = x_327_phi;
+          x_326_phi = x_327;
+        }
+      }
+      let x_354 : bool = x_354_phi;
+      if (x_354) {
+        break;
+      }
+    }
+  }
+  x_357_phi = 0;
+  x_360_phi = 0;
+  x_362_phi = 0;
+  loop {
+    var x_392 : i32;
+    var x_402 : i32;
+    var x_407 : i32;
+    var x_363 : i32;
+    var x_358_phi : i32;
+    var x_361_phi : i32;
+    let x_357 : i32 = x_357_phi;
+    x_360 = x_360_phi;
+    let x_362 : i32 = x_362_phi;
+    let x_365 : i32 = (6 - 15);
+    if ((x_362 < 20)) {
+    } else {
+      break;
+    }
+    var x_374_phi : i32;
+    var x_392_phi : i32;
+    var x_393_phi : bool;
+    switch(0u) {
+      default: {
+        x_374_phi = 0;
+        loop {
+          let x_374 : i32 = x_374_phi;
+          x_392_phi = x_357;
+          x_393_phi = false;
+          if ((x_374 != -1)) {
+          } else {
+            break;
+          }
+          let x_381 : BST = tree[x_374];
+          let x_382 : i32 = x_381.data;
+          let x_383 : i32 = x_381.leftIndex;
+          let x_385 : i32 = x_381.rightIndex;
+          if ((x_382 == x_362)) {
+            x_392_phi = x_362;
+            x_393_phi = true;
+            break;
+          }
+          let x_389 : f32 = x_GLF_color[select(3u, 3u, (3u <= 3u))];
+
+          continuing {
+            x_374_phi = select(x_383, x_385, !((x_362 <= x_382)));
+          }
+        }
+        x_392 = x_392_phi;
+        let x_393 : bool = x_393_phi;
+        x_358_phi = x_392;
+        if (x_393) {
+          break;
+        }
+        x_358_phi = -1;
+      }
+    }
+    var x_358 : i32;
+    var x_401 : i32;
+    var x_406 : i32;
+    var x_402_phi : i32;
+    var x_407_phi : i32;
+    x_358 = x_358_phi;
+    switch(x_362) {
+      case 2, 5, 6, 7, 8, 9, 12, 13, 15, 17: {
+        x_402_phi = x_360;
+        if ((x_358 == bitcast<i32>(x_362))) {
+          x_401 = bitcast<i32>((x_360 + bitcast<i32>(1)));
+          x_402_phi = x_401;
+        }
+        x_402 = x_402_phi;
+        x_361_phi = x_402;
+      }
+      default: {
+        x_407_phi = x_360;
+        if ((x_358 == bitcast<i32>(-1))) {
+          x_406 = bitcast<i32>((x_360 + bitcast<i32>(1)));
+          x_407_phi = x_406;
+        }
+        x_407 = x_407_phi;
+        x_361_phi = x_407;
+      }
+    }
+    let x_361 : i32 = x_361_phi;
+
+    continuing {
+      x_363 = (x_362 + 1);
+      x_357_phi = x_358;
+      x_360_phi = x_361;
+      x_362_phi = x_363;
+    }
+  }
+  if ((x_360 == bitcast<i32>(20))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-null-in-phi-and-unroll/1.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-null-in-phi-and-unroll/1.spvasm
new file mode 100644
index 0000000..c48df75
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-null-in-phi-and-unroll/1.spvasm
@@ -0,0 +1,183 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+      %false = OpConstantFalse %bool
+     %uint_1 = OpConstant %uint 1
+       %true = OpConstantTrue %bool
+  %float_0_5 = OpConstant %float 0.5
+    %float_1 = OpConstant %float 1
+         %22 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_1 %float_1
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_8 = OpConstant %int 8
+     %uint_8 = OpConstant %uint 8
+%_arr_v4float_uint_8 = OpTypeArray %v4float %uint_8
+    %float_4 = OpConstant %float 4
+   %float_20 = OpConstant %float 20
+         %30 = OpConstantComposite %v4float %float_4 %float_4 %float_20 %float_4
+         %31 = OpConstantComposite %v4float %float_4 %float_4 %float_4 %float_20
+         %32 = OpConstantComposite %v4float %float_4 %float_20 %float_20 %float_4
+    %float_8 = OpConstant %float 8
+         %34 = OpConstantComposite %v4float %float_20 %float_4 %float_4 %float_8
+    %float_6 = OpConstant %float 6
+    %float_2 = OpConstant %float 2
+         %37 = OpConstantComposite %v4float %float_8 %float_6 %float_4 %float_2
+   %float_12 = OpConstant %float 12
+         %39 = OpConstantComposite %v4float %float_2 %float_12 %float_2 %float_4
+   %float_16 = OpConstant %float 16
+         %41 = OpConstantComposite %v4float %float_16 %float_2 %float_4 %float_4
+   %float_22 = OpConstant %float 22
+         %43 = OpConstantComposite %v4float %float_12 %float_22 %float_4 %float_4
+         %44 = OpConstantComposite %_arr_v4float_uint_8 %30 %31 %32 %34 %37 %39 %41 %43
+%_ptr_Function__arr_v4float_uint_8 = OpTypePointer Function %_arr_v4float_uint_8
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+    %float_0 = OpConstant %float 0
+         %49 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+         %50 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+         %51 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+         %52 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+         %53 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+         %54 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+         %55 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+         %56 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+         %57 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %58 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+         %59 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+         %60 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+         %61 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+         %62 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+         %63 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+         %64 = OpConstantComposite %_arr_v4float_uint_16 %49 %50 %51 %52 %53 %54 %55 %56 %49 %57 %58 %59 %60 %61 %62 %63
+      %int_9 = OpConstant %int 9
+     %int_11 = OpConstant %int 11
+     %int_16 = OpConstant %int 16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+      %int_1 = OpConstant %int 1
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+   %float_32 = OpConstant %float 32
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %75 = OpConstantNull %int
+       %main = OpFunction %void None %8
+         %76 = OpLabel
+         %77 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function
+         %78 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function
+         %79 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function
+         %80 = OpVariable %_ptr_Function__arr_v4float_uint_16 Function
+         %81 = OpLoad %v4float %gl_FragCoord
+         %82 = OpVectorShuffle %v2float %81 %81 0 1
+         %83 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+         %84 = OpLoad %v2float %83
+         %85 = OpFDiv %v2float %82 %84
+         %86 = OpVectorTimesScalar %v2float %85 %float_32
+         %87 = OpExtInst %v2float %1 Floor %86
+               OpBranch %88
+         %88 = OpLabel
+         %89 = OpPhi %v4float %22 %76 %90 %91
+         %92 = OpPhi %int %75 %76 %93 %91
+         %94 = OpSLessThan %bool %92 %int_8
+               OpLoopMerge %95 %91 Unroll
+               OpBranchConditional %94 %96 %95
+         %96 = OpLabel
+               OpStore %77 %44
+         %97 = OpAccessChain %_ptr_Function_v4float %77 %92
+         %98 = OpLoad %v4float %97
+               OpSelectionMerge %99 None
+               OpSwitch %uint_0 %100
+        %100 = OpLabel
+        %101 = OpCompositeExtract %float %87 0
+        %102 = OpCompositeExtract %float %98 0
+        %103 = OpFOrdLessThan %bool %101 %102
+               OpSelectionMerge %104 None
+               OpBranchConditional %103 %105 %104
+        %105 = OpLabel
+               OpBranch %99
+        %104 = OpLabel
+        %106 = OpCompositeExtract %float %87 1
+        %107 = OpCompositeExtract %float %98 1
+        %108 = OpFOrdLessThan %bool %106 %107
+               OpSelectionMerge %109 None
+               OpBranchConditional %108 %110 %109
+        %110 = OpLabel
+               OpBranch %99
+        %109 = OpLabel
+        %111 = OpCompositeExtract %float %98 2
+        %112 = OpFAdd %float %102 %111
+        %113 = OpFOrdGreaterThan %bool %101 %112
+               OpSelectionMerge %114 None
+               OpBranchConditional %113 %115 %114
+        %115 = OpLabel
+               OpBranch %99
+        %114 = OpLabel
+        %116 = OpCompositeExtract %float %98 3
+        %117 = OpFAdd %float %107 %116
+        %118 = OpFOrdGreaterThan %bool %106 %117
+               OpSelectionMerge %119 None
+               OpBranchConditional %118 %120 %119
+        %120 = OpLabel
+               OpBranch %99
+        %119 = OpLabel
+               OpBranch %99
+         %99 = OpLabel
+        %121 = OpPhi %bool %false %105 %false %110 %false %115 %false %120 %true %119
+               OpSelectionMerge %122 None
+               OpBranchConditional %121 %123 %122
+        %123 = OpLabel
+               OpStore %78 %44
+        %124 = OpAccessChain %_ptr_Function_float %78 %92 %uint_0
+        %125 = OpLoad %float %124
+        %126 = OpConvertFToS %int %125
+               OpStore %79 %44
+        %127 = OpAccessChain %_ptr_Function_float %79 %92 %uint_1
+        %128 = OpLoad %float %127
+        %129 = OpConvertFToS %int %128
+        %130 = OpIMul %int %126 %129
+        %131 = OpIMul %int %92 %int_9
+        %132 = OpIAdd %int %130 %131
+        %133 = OpIAdd %int %132 %int_11
+        %134 = OpSMod %int %133 %int_16
+               OpStore %80 %64
+        %135 = OpAccessChain %_ptr_Function_v4float %80 %134
+        %136 = OpLoad %v4float %135
+               OpBranch %122
+        %122 = OpLabel
+         %90 = OpPhi %v4float %89 %99 %136 %123
+               OpBranch %91
+         %91 = OpLabel
+         %93 = OpIAdd %int %92 %int_1
+               OpBranch %88
+         %95 = OpLabel
+               OpStore %_GLF_color %89
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-null-in-phi-and-unroll/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-null-in-phi-and-unroll/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..0326a9c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-null-in-phi-and-unroll/1.spvasm.expected.hlsl
@@ -0,0 +1,103 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 x_77[8] = (float4[8])0;
+  float4 x_78[8] = (float4[8])0;
+  float4 x_79[8] = (float4[8])0;
+  float4 x_80[16] = (float4[16])0;
+  float4 x_89 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 x_89_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int x_92_phi = 0;
+  const float4 x_81 = gl_FragCoord;
+  const float2 x_84 = asfloat(x_6[0].xy);
+  const float2 x_87 = floor(((float2(x_81.x, x_81.y) / x_84) * 32.0f));
+  x_89_phi = float4(0.5f, 0.5f, 1.0f, 1.0f);
+  x_92_phi = 0;
+  while (true) {
+    float4 x_136 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    int x_93 = 0;
+    bool x_121_phi = false;
+    float4 x_90_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    x_89 = x_89_phi;
+    const int x_92 = x_92_phi;
+    if ((x_92 < 8)) {
+    } else {
+      break;
+    }
+    float4 x_98 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    const float4 tint_symbol_5[8] = {float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)};
+    x_77 = tint_symbol_5;
+    x_98 = x_77[x_92];
+    switch(0u) {
+      default: {
+        const float x_101 = x_87.x;
+        const float x_102 = x_98.x;
+        if ((x_101 < x_102)) {
+          x_121_phi = false;
+          break;
+        }
+        const float x_106 = x_87.y;
+        const float x_107 = x_98.y;
+        if ((x_106 < x_107)) {
+          x_121_phi = false;
+          break;
+        }
+        if ((x_101 > (x_102 + x_98.z))) {
+          x_121_phi = false;
+          break;
+        }
+        if ((x_106 > (x_107 + x_98.w))) {
+          x_121_phi = false;
+          break;
+        }
+        x_121_phi = true;
+        break;
+      }
+    }
+    const bool x_121 = x_121_phi;
+    x_90_phi = x_89;
+    if (x_121) {
+      const float4 tint_symbol_6[8] = {float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)};
+      x_78 = tint_symbol_6;
+      const float x_125 = x_78[x_92].x;
+      const float4 tint_symbol_7[8] = {float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)};
+      x_79 = tint_symbol_7;
+      const float x_128 = x_79[x_92].y;
+      const float4 tint_symbol_8[16] = {float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)};
+      x_80 = tint_symbol_8;
+      x_136 = x_80[((((int(x_125) * int(x_128)) + (x_92 * 9)) + 11) % 16)];
+      x_90_phi = x_136;
+    }
+    const float4 x_90 = x_90_phi;
+    {
+      x_93 = (x_92 + 1);
+      x_89_phi = x_90;
+      x_92_phi = x_93;
+    }
+  }
+  x_GLF_color = x_89;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_9 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_9;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-null-in-phi-and-unroll/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-null-in-phi-and-unroll/1.spvasm.expected.msl
new file mode 100644
index 0000000..ecbf92f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-null-in-phi-and-unroll/1.spvasm.expected.msl
@@ -0,0 +1,108 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  float4 arr[8];
+};
+struct tint_array_wrapper_1 {
+  float4 arr[16];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10) {
+  tint_array_wrapper x_77 = {};
+  tint_array_wrapper x_78 = {};
+  tint_array_wrapper x_79 = {};
+  tint_array_wrapper_1 x_80 = {};
+  float4 x_89 = 0.0f;
+  float4 x_89_phi = 0.0f;
+  int x_92_phi = 0;
+  float4 const x_81 = *(tint_symbol_9);
+  float2 const x_84 = x_6.resolution;
+  float2 const x_87 = floor(((float2(x_81.x, x_81.y) / x_84) * 32.0f));
+  x_89_phi = float4(0.5f, 0.5f, 1.0f, 1.0f);
+  x_92_phi = 0;
+  while (true) {
+    float4 x_136 = 0.0f;
+    int x_93 = 0;
+    bool x_121_phi = false;
+    float4 x_90_phi = 0.0f;
+    x_89 = x_89_phi;
+    int const x_92 = x_92_phi;
+    if ((x_92 < 8)) {
+    } else {
+      break;
+    }
+    float4 x_98 = 0.0f;
+    tint_array_wrapper const tint_symbol_4 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
+    x_77 = tint_symbol_4;
+    x_98 = x_77.arr[x_92];
+    switch(0u) {
+      default: {
+        float const x_101 = x_87.x;
+        float const x_102 = x_98.x;
+        if ((x_101 < x_102)) {
+          x_121_phi = false;
+          break;
+        }
+        float const x_106 = x_87.y;
+        float const x_107 = x_98.y;
+        if ((x_106 < x_107)) {
+          x_121_phi = false;
+          break;
+        }
+        if ((x_101 > (x_102 + x_98.z))) {
+          x_121_phi = false;
+          break;
+        }
+        if ((x_106 > (x_107 + x_98.w))) {
+          x_121_phi = false;
+          break;
+        }
+        x_121_phi = true;
+        break;
+      }
+    }
+    bool const x_121 = x_121_phi;
+    x_90_phi = x_89;
+    if (x_121) {
+      tint_array_wrapper const tint_symbol_5 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
+      x_78 = tint_symbol_5;
+      float const x_125 = x_78.arr[x_92].x;
+      tint_array_wrapper const tint_symbol_6 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
+      x_79 = tint_symbol_6;
+      float const x_128 = x_79.arr[x_92].y;
+      tint_array_wrapper_1 const tint_symbol_7 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
+      x_80 = tint_symbol_7;
+      x_136 = x_80.arr[((((int(x_125) * int(x_128)) + (x_92 * 9)) + 11) % 16)];
+      x_90_phi = x_136;
+    }
+    float4 const x_90 = x_90_phi;
+    {
+      x_93 = (x_92 + 1);
+      x_89_phi = x_90;
+      x_92_phi = x_93;
+    }
+  }
+  *(tint_symbol_10) = x_89;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_11 = 0.0f;
+  thread float4 tint_symbol_12 = 0.0f;
+  tint_symbol_11 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_11), &(tint_symbol_12));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_12};
+  tint_symbol_2 const tint_symbol_8 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_8;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-null-in-phi-and-unroll/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-null-in-phi-and-unroll/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..770f48a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-null-in-phi-and-unroll/1.spvasm.expected.spvasm
@@ -0,0 +1,280 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 182
+; Schema: 0
+               OpCapability Shader
+         %45 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %x_77 "x_77"
+               OpName %x_78 "x_78"
+               OpName %x_79 "x_79"
+               OpName %x_80 "x_80"
+               OpName %x_89 "x_89"
+               OpName %x_89_phi "x_89_phi"
+               OpName %x_92_phi "x_92_phi"
+               OpName %x_136 "x_136"
+               OpName %x_93 "x_93"
+               OpName %x_121_phi "x_121_phi"
+               OpName %x_90_phi "x_90_phi"
+               OpName %x_98 "x_98"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v4float_uint_8 ArrayStride 16
+               OpDecorate %_arr_v4float_uint_16 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_8 = OpConstant %uint 8
+%_arr_v4float_uint_8 = OpTypeArray %v4float %uint_8
+%_ptr_Function__arr_v4float_uint_8 = OpTypePointer Function %_arr_v4float_uint_8
+         %24 = OpConstantNull %_arr_v4float_uint_8
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+         %31 = OpConstantNull %_arr_v4float_uint_16
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %38 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+   %float_32 = OpConstant %float 32
+  %float_0_5 = OpConstant %float 0.5
+    %float_1 = OpConstant %float 1
+         %54 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_1 %float_1
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %65 = OpConstantNull %bool
+      %int_8 = OpConstant %int 8
+    %float_4 = OpConstant %float 4
+   %float_20 = OpConstant %float 20
+         %77 = OpConstantComposite %v4float %float_4 %float_4 %float_20 %float_4
+         %78 = OpConstantComposite %v4float %float_4 %float_4 %float_4 %float_20
+         %79 = OpConstantComposite %v4float %float_4 %float_20 %float_20 %float_4
+    %float_8 = OpConstant %float 8
+         %81 = OpConstantComposite %v4float %float_20 %float_4 %float_4 %float_8
+    %float_6 = OpConstant %float 6
+    %float_2 = OpConstant %float 2
+         %84 = OpConstantComposite %v4float %float_8 %float_6 %float_4 %float_2
+   %float_12 = OpConstant %float 12
+         %86 = OpConstantComposite %v4float %float_2 %float_12 %float_2 %float_4
+   %float_16 = OpConstant %float 16
+         %88 = OpConstantComposite %v4float %float_16 %float_2 %float_4 %float_4
+   %float_22 = OpConstant %float 22
+         %90 = OpConstantComposite %v4float %float_12 %float_22 %float_4 %float_4
+         %91 = OpConstantComposite %_arr_v4float_uint_8 %77 %78 %79 %81 %84 %86 %88 %90
+%_ptr_Function_float = OpTypePointer Function %float
+      %false = OpConstantFalse %bool
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+     %uint_3 = OpConstant %uint 3
+       %true = OpConstantTrue %bool
+    %float_0 = OpConstant %float 0
+        %135 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+        %136 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+        %137 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+        %138 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+        %139 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+        %140 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+        %141 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+        %142 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+        %143 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %144 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+        %145 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+        %146 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+        %147 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+        %148 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+        %149 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+        %150 = OpConstantComposite %_arr_v4float_uint_16 %135 %136 %137 %138 %139 %140 %141 %142 %135 %143 %144 %145 %146 %147 %148 %149
+      %int_9 = OpConstant %int 9
+     %int_11 = OpConstant %int 11
+     %int_16 = OpConstant %int 16
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+        %169 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+       %x_77 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %24
+       %x_78 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %24
+       %x_79 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %24
+       %x_80 = OpVariable %_ptr_Function__arr_v4float_uint_16 Function %31
+       %x_89 = OpVariable %_ptr_Function_v4float Function %5
+   %x_89_phi = OpVariable %_ptr_Function_v4float Function %5
+   %x_92_phi = OpVariable %_ptr_Function_int Function %38
+      %x_136 = OpVariable %_ptr_Function_v4float Function %5
+       %x_93 = OpVariable %_ptr_Function_int Function %38
+  %x_121_phi = OpVariable %_ptr_Function_bool Function %65
+   %x_90_phi = OpVariable %_ptr_Function_v4float Function %5
+       %x_98 = OpVariable %_ptr_Function_v4float Function %5
+         %39 = OpLoad %v4float %gl_FragCoord
+         %42 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %43 = OpLoad %v2float %42
+         %46 = OpCompositeExtract %float %39 0
+         %47 = OpCompositeExtract %float %39 1
+         %48 = OpCompositeConstruct %v2float %46 %47
+         %49 = OpFDiv %v2float %48 %43
+         %51 = OpVectorTimesScalar %v2float %49 %float_32
+         %44 = OpExtInst %v2float %45 Floor %51
+               OpStore %x_89_phi %54
+               OpStore %x_92_phi %int_0
+               OpBranch %56
+         %56 = OpLabel
+               OpLoopMerge %57 %58 None
+               OpBranch %59
+         %59 = OpLabel
+         %67 = OpLoad %v4float %x_89_phi
+               OpStore %x_89 %67
+         %68 = OpLoad %int %x_92_phi
+         %70 = OpSLessThan %bool %68 %int_8
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %73
+         %72 = OpLabel
+               OpBranch %71
+         %73 = OpLabel
+               OpBranch %57
+         %71 = OpLabel
+               OpStore %x_77 %91
+         %92 = OpAccessChain %_ptr_Function_v4float %x_77 %68
+         %93 = OpLoad %v4float %92
+               OpStore %x_98 %93
+               OpSelectionMerge %94 None
+               OpSwitch %uint_0 %95
+         %95 = OpLabel
+         %96 = OpCompositeExtract %float %44 0
+         %98 = OpAccessChain %_ptr_Function_float %x_98 %uint_0
+         %99 = OpLoad %float %98
+        %100 = OpFOrdLessThan %bool %96 %99
+               OpSelectionMerge %101 None
+               OpBranchConditional %100 %102 %101
+        %102 = OpLabel
+               OpStore %x_121_phi %false
+               OpBranch %94
+        %101 = OpLabel
+        %104 = OpCompositeExtract %float %44 1
+        %106 = OpAccessChain %_ptr_Function_float %x_98 %uint_1
+        %107 = OpLoad %float %106
+        %108 = OpFOrdLessThan %bool %104 %107
+               OpSelectionMerge %109 None
+               OpBranchConditional %108 %110 %109
+        %110 = OpLabel
+               OpStore %x_121_phi %false
+               OpBranch %94
+        %109 = OpLabel
+        %112 = OpAccessChain %_ptr_Function_float %x_98 %uint_2
+        %113 = OpLoad %float %112
+        %114 = OpFAdd %float %99 %113
+        %115 = OpFOrdGreaterThan %bool %96 %114
+               OpSelectionMerge %116 None
+               OpBranchConditional %115 %117 %116
+        %117 = OpLabel
+               OpStore %x_121_phi %false
+               OpBranch %94
+        %116 = OpLabel
+        %119 = OpAccessChain %_ptr_Function_float %x_98 %uint_3
+        %120 = OpLoad %float %119
+        %121 = OpFAdd %float %107 %120
+        %122 = OpFOrdGreaterThan %bool %104 %121
+               OpSelectionMerge %123 None
+               OpBranchConditional %122 %124 %123
+        %124 = OpLabel
+               OpStore %x_121_phi %false
+               OpBranch %94
+        %123 = OpLabel
+               OpStore %x_121_phi %true
+               OpBranch %94
+         %94 = OpLabel
+        %126 = OpLoad %bool %x_121_phi
+        %127 = OpLoad %v4float %x_89
+               OpStore %x_90_phi %127
+               OpSelectionMerge %128 None
+               OpBranchConditional %126 %129 %128
+        %129 = OpLabel
+               OpStore %x_78 %91
+        %130 = OpAccessChain %_ptr_Function_float %x_78 %68 %uint_0
+        %131 = OpLoad %float %130
+               OpStore %x_79 %91
+        %132 = OpAccessChain %_ptr_Function_float %x_79 %68 %uint_1
+        %133 = OpLoad %float %132
+               OpStore %x_80 %150
+        %151 = OpConvertFToS %int %131
+        %152 = OpConvertFToS %int %133
+        %153 = OpIMul %int %151 %152
+        %155 = OpIMul %int %68 %int_9
+        %156 = OpIAdd %int %153 %155
+        %158 = OpIAdd %int %156 %int_11
+        %160 = OpSMod %int %158 %int_16
+        %161 = OpAccessChain %_ptr_Function_v4float %x_80 %160
+        %162 = OpLoad %v4float %161
+               OpStore %x_136 %162
+        %163 = OpLoad %v4float %x_136
+               OpStore %x_90_phi %163
+               OpBranch %128
+        %128 = OpLabel
+        %164 = OpLoad %v4float %x_90_phi
+               OpBranch %58
+         %58 = OpLabel
+        %166 = OpIAdd %int %68 %int_1
+               OpStore %x_93 %166
+               OpStore %x_89_phi %164
+        %167 = OpLoad %int %x_93
+               OpStore %x_92_phi %167
+               OpBranch %56
+         %57 = OpLabel
+        %168 = OpLoad %v4float %x_89
+               OpStore %x_GLF_color %168
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %169
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %173 = OpLabel
+        %174 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %174
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %176 = OpLabel
+        %177 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %177
+        %178 = OpFunctionCall %void %main_1
+        %180 = OpLoad %v4float %x_GLF_color
+        %181 = OpCompositeConstruct %main_out %180
+        %179 = OpFunctionCall %void %tint_symbol_3 %181
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-null-in-phi-and-unroll/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-null-in-phi-and-unroll/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..1742de0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-null-in-phi-and-unroll/1.spvasm.expected.wgsl
@@ -0,0 +1,97 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_77 : array<vec4<f32>, 8>;
+  var x_78 : array<vec4<f32>, 8>;
+  var x_79 : array<vec4<f32>, 8>;
+  var x_80 : array<vec4<f32>, 16>;
+  var x_89 : vec4<f32>;
+  var x_89_phi : vec4<f32>;
+  var x_92_phi : i32;
+  let x_81 : vec4<f32> = gl_FragCoord;
+  let x_84 : vec2<f32> = x_6.resolution;
+  let x_87 : vec2<f32> = floor(((vec2<f32>(x_81.x, x_81.y) / x_84) * 32.0));
+  x_89_phi = vec4<f32>(0.5, 0.5, 1.0, 1.0);
+  x_92_phi = 0;
+  loop {
+    var x_136 : vec4<f32>;
+    var x_93 : i32;
+    var x_121_phi : bool;
+    var x_90_phi : vec4<f32>;
+    x_89 = x_89_phi;
+    let x_92 : i32 = x_92_phi;
+    if ((x_92 < 8)) {
+    } else {
+      break;
+    }
+    var x_98 : vec4<f32>;
+    x_77 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+    x_98 = x_77[x_92];
+    switch(0u) {
+      default: {
+        let x_101 : f32 = x_87.x;
+        let x_102 : f32 = x_98.x;
+        if ((x_101 < x_102)) {
+          x_121_phi = false;
+          break;
+        }
+        let x_106 : f32 = x_87.y;
+        let x_107 : f32 = x_98.y;
+        if ((x_106 < x_107)) {
+          x_121_phi = false;
+          break;
+        }
+        if ((x_101 > (x_102 + x_98.z))) {
+          x_121_phi = false;
+          break;
+        }
+        if ((x_106 > (x_107 + x_98.w))) {
+          x_121_phi = false;
+          break;
+        }
+        x_121_phi = true;
+      }
+    }
+    let x_121 : bool = x_121_phi;
+    x_90_phi = x_89;
+    if (x_121) {
+      x_78 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+      let x_125 : f32 = x_78[x_92].x;
+      x_79 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+      let x_128 : f32 = x_79[x_92].y;
+      x_80 = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+      x_136 = x_80[((((i32(x_125) * i32(x_128)) + (x_92 * 9)) + 11) % 16)];
+      x_90_phi = x_136;
+    }
+    let x_90 : vec4<f32> = x_90_phi;
+
+    continuing {
+      x_93 = (x_92 + 1);
+      x_89_phi = x_90;
+      x_92_phi = x_93;
+    }
+  }
+  x_GLF_color = x_89;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-null-in-phi-and-unroll/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-null-in-phi-and-unroll/1.wgsl
new file mode 100644
index 0000000..1742de0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-null-in-phi-and-unroll/1.wgsl
@@ -0,0 +1,97 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_77 : array<vec4<f32>, 8>;
+  var x_78 : array<vec4<f32>, 8>;
+  var x_79 : array<vec4<f32>, 8>;
+  var x_80 : array<vec4<f32>, 16>;
+  var x_89 : vec4<f32>;
+  var x_89_phi : vec4<f32>;
+  var x_92_phi : i32;
+  let x_81 : vec4<f32> = gl_FragCoord;
+  let x_84 : vec2<f32> = x_6.resolution;
+  let x_87 : vec2<f32> = floor(((vec2<f32>(x_81.x, x_81.y) / x_84) * 32.0));
+  x_89_phi = vec4<f32>(0.5, 0.5, 1.0, 1.0);
+  x_92_phi = 0;
+  loop {
+    var x_136 : vec4<f32>;
+    var x_93 : i32;
+    var x_121_phi : bool;
+    var x_90_phi : vec4<f32>;
+    x_89 = x_89_phi;
+    let x_92 : i32 = x_92_phi;
+    if ((x_92 < 8)) {
+    } else {
+      break;
+    }
+    var x_98 : vec4<f32>;
+    x_77 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+    x_98 = x_77[x_92];
+    switch(0u) {
+      default: {
+        let x_101 : f32 = x_87.x;
+        let x_102 : f32 = x_98.x;
+        if ((x_101 < x_102)) {
+          x_121_phi = false;
+          break;
+        }
+        let x_106 : f32 = x_87.y;
+        let x_107 : f32 = x_98.y;
+        if ((x_106 < x_107)) {
+          x_121_phi = false;
+          break;
+        }
+        if ((x_101 > (x_102 + x_98.z))) {
+          x_121_phi = false;
+          break;
+        }
+        if ((x_106 > (x_107 + x_98.w))) {
+          x_121_phi = false;
+          break;
+        }
+        x_121_phi = true;
+      }
+    }
+    let x_121 : bool = x_121_phi;
+    x_90_phi = x_89;
+    if (x_121) {
+      x_78 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+      let x_125 : f32 = x_78[x_92].x;
+      x_79 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+      let x_128 : f32 = x_79[x_92].y;
+      x_80 = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+      x_136 = x_80[((((i32(x_125) * i32(x_128)) + (x_92 * 9)) + 11) % 16)];
+      x_90_phi = x_136;
+    }
+    let x_90 : vec4<f32> = x_90_phi;
+
+    continuing {
+      x_93 = (x_92 + 1);
+      x_89_phi = x_90;
+      x_92_phi = x_93;
+    }
+  }
+  x_GLF_color = x_89;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-null-in-phi-and-unroll/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-null-in-phi-and-unroll/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..0326a9c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-null-in-phi-and-unroll/1.wgsl.expected.hlsl
@@ -0,0 +1,103 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 x_77[8] = (float4[8])0;
+  float4 x_78[8] = (float4[8])0;
+  float4 x_79[8] = (float4[8])0;
+  float4 x_80[16] = (float4[16])0;
+  float4 x_89 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 x_89_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int x_92_phi = 0;
+  const float4 x_81 = gl_FragCoord;
+  const float2 x_84 = asfloat(x_6[0].xy);
+  const float2 x_87 = floor(((float2(x_81.x, x_81.y) / x_84) * 32.0f));
+  x_89_phi = float4(0.5f, 0.5f, 1.0f, 1.0f);
+  x_92_phi = 0;
+  while (true) {
+    float4 x_136 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    int x_93 = 0;
+    bool x_121_phi = false;
+    float4 x_90_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    x_89 = x_89_phi;
+    const int x_92 = x_92_phi;
+    if ((x_92 < 8)) {
+    } else {
+      break;
+    }
+    float4 x_98 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    const float4 tint_symbol_5[8] = {float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)};
+    x_77 = tint_symbol_5;
+    x_98 = x_77[x_92];
+    switch(0u) {
+      default: {
+        const float x_101 = x_87.x;
+        const float x_102 = x_98.x;
+        if ((x_101 < x_102)) {
+          x_121_phi = false;
+          break;
+        }
+        const float x_106 = x_87.y;
+        const float x_107 = x_98.y;
+        if ((x_106 < x_107)) {
+          x_121_phi = false;
+          break;
+        }
+        if ((x_101 > (x_102 + x_98.z))) {
+          x_121_phi = false;
+          break;
+        }
+        if ((x_106 > (x_107 + x_98.w))) {
+          x_121_phi = false;
+          break;
+        }
+        x_121_phi = true;
+        break;
+      }
+    }
+    const bool x_121 = x_121_phi;
+    x_90_phi = x_89;
+    if (x_121) {
+      const float4 tint_symbol_6[8] = {float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)};
+      x_78 = tint_symbol_6;
+      const float x_125 = x_78[x_92].x;
+      const float4 tint_symbol_7[8] = {float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)};
+      x_79 = tint_symbol_7;
+      const float x_128 = x_79[x_92].y;
+      const float4 tint_symbol_8[16] = {float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)};
+      x_80 = tint_symbol_8;
+      x_136 = x_80[((((int(x_125) * int(x_128)) + (x_92 * 9)) + 11) % 16)];
+      x_90_phi = x_136;
+    }
+    const float4 x_90 = x_90_phi;
+    {
+      x_93 = (x_92 + 1);
+      x_89_phi = x_90;
+      x_92_phi = x_93;
+    }
+  }
+  x_GLF_color = x_89;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_9 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_9;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-null-in-phi-and-unroll/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-null-in-phi-and-unroll/1.wgsl.expected.msl
new file mode 100644
index 0000000..ecbf92f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-null-in-phi-and-unroll/1.wgsl.expected.msl
@@ -0,0 +1,108 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  float4 arr[8];
+};
+struct tint_array_wrapper_1 {
+  float4 arr[16];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10) {
+  tint_array_wrapper x_77 = {};
+  tint_array_wrapper x_78 = {};
+  tint_array_wrapper x_79 = {};
+  tint_array_wrapper_1 x_80 = {};
+  float4 x_89 = 0.0f;
+  float4 x_89_phi = 0.0f;
+  int x_92_phi = 0;
+  float4 const x_81 = *(tint_symbol_9);
+  float2 const x_84 = x_6.resolution;
+  float2 const x_87 = floor(((float2(x_81.x, x_81.y) / x_84) * 32.0f));
+  x_89_phi = float4(0.5f, 0.5f, 1.0f, 1.0f);
+  x_92_phi = 0;
+  while (true) {
+    float4 x_136 = 0.0f;
+    int x_93 = 0;
+    bool x_121_phi = false;
+    float4 x_90_phi = 0.0f;
+    x_89 = x_89_phi;
+    int const x_92 = x_92_phi;
+    if ((x_92 < 8)) {
+    } else {
+      break;
+    }
+    float4 x_98 = 0.0f;
+    tint_array_wrapper const tint_symbol_4 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
+    x_77 = tint_symbol_4;
+    x_98 = x_77.arr[x_92];
+    switch(0u) {
+      default: {
+        float const x_101 = x_87.x;
+        float const x_102 = x_98.x;
+        if ((x_101 < x_102)) {
+          x_121_phi = false;
+          break;
+        }
+        float const x_106 = x_87.y;
+        float const x_107 = x_98.y;
+        if ((x_106 < x_107)) {
+          x_121_phi = false;
+          break;
+        }
+        if ((x_101 > (x_102 + x_98.z))) {
+          x_121_phi = false;
+          break;
+        }
+        if ((x_106 > (x_107 + x_98.w))) {
+          x_121_phi = false;
+          break;
+        }
+        x_121_phi = true;
+        break;
+      }
+    }
+    bool const x_121 = x_121_phi;
+    x_90_phi = x_89;
+    if (x_121) {
+      tint_array_wrapper const tint_symbol_5 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
+      x_78 = tint_symbol_5;
+      float const x_125 = x_78.arr[x_92].x;
+      tint_array_wrapper const tint_symbol_6 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
+      x_79 = tint_symbol_6;
+      float const x_128 = x_79.arr[x_92].y;
+      tint_array_wrapper_1 const tint_symbol_7 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
+      x_80 = tint_symbol_7;
+      x_136 = x_80.arr[((((int(x_125) * int(x_128)) + (x_92 * 9)) + 11) % 16)];
+      x_90_phi = x_136;
+    }
+    float4 const x_90 = x_90_phi;
+    {
+      x_93 = (x_92 + 1);
+      x_89_phi = x_90;
+      x_92_phi = x_93;
+    }
+  }
+  *(tint_symbol_10) = x_89;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_11 = 0.0f;
+  thread float4 tint_symbol_12 = 0.0f;
+  tint_symbol_11 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_11), &(tint_symbol_12));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_12};
+  tint_symbol_2 const tint_symbol_8 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_8;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-null-in-phi-and-unroll/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-null-in-phi-and-unroll/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..770f48a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-null-in-phi-and-unroll/1.wgsl.expected.spvasm
@@ -0,0 +1,280 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 182
+; Schema: 0
+               OpCapability Shader
+         %45 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %x_77 "x_77"
+               OpName %x_78 "x_78"
+               OpName %x_79 "x_79"
+               OpName %x_80 "x_80"
+               OpName %x_89 "x_89"
+               OpName %x_89_phi "x_89_phi"
+               OpName %x_92_phi "x_92_phi"
+               OpName %x_136 "x_136"
+               OpName %x_93 "x_93"
+               OpName %x_121_phi "x_121_phi"
+               OpName %x_90_phi "x_90_phi"
+               OpName %x_98 "x_98"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v4float_uint_8 ArrayStride 16
+               OpDecorate %_arr_v4float_uint_16 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_8 = OpConstant %uint 8
+%_arr_v4float_uint_8 = OpTypeArray %v4float %uint_8
+%_ptr_Function__arr_v4float_uint_8 = OpTypePointer Function %_arr_v4float_uint_8
+         %24 = OpConstantNull %_arr_v4float_uint_8
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+         %31 = OpConstantNull %_arr_v4float_uint_16
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %38 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+   %float_32 = OpConstant %float 32
+  %float_0_5 = OpConstant %float 0.5
+    %float_1 = OpConstant %float 1
+         %54 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_1 %float_1
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %65 = OpConstantNull %bool
+      %int_8 = OpConstant %int 8
+    %float_4 = OpConstant %float 4
+   %float_20 = OpConstant %float 20
+         %77 = OpConstantComposite %v4float %float_4 %float_4 %float_20 %float_4
+         %78 = OpConstantComposite %v4float %float_4 %float_4 %float_4 %float_20
+         %79 = OpConstantComposite %v4float %float_4 %float_20 %float_20 %float_4
+    %float_8 = OpConstant %float 8
+         %81 = OpConstantComposite %v4float %float_20 %float_4 %float_4 %float_8
+    %float_6 = OpConstant %float 6
+    %float_2 = OpConstant %float 2
+         %84 = OpConstantComposite %v4float %float_8 %float_6 %float_4 %float_2
+   %float_12 = OpConstant %float 12
+         %86 = OpConstantComposite %v4float %float_2 %float_12 %float_2 %float_4
+   %float_16 = OpConstant %float 16
+         %88 = OpConstantComposite %v4float %float_16 %float_2 %float_4 %float_4
+   %float_22 = OpConstant %float 22
+         %90 = OpConstantComposite %v4float %float_12 %float_22 %float_4 %float_4
+         %91 = OpConstantComposite %_arr_v4float_uint_8 %77 %78 %79 %81 %84 %86 %88 %90
+%_ptr_Function_float = OpTypePointer Function %float
+      %false = OpConstantFalse %bool
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+     %uint_3 = OpConstant %uint 3
+       %true = OpConstantTrue %bool
+    %float_0 = OpConstant %float 0
+        %135 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+        %136 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+        %137 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+        %138 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+        %139 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+        %140 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+        %141 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+        %142 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+        %143 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %144 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+        %145 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+        %146 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+        %147 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+        %148 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+        %149 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+        %150 = OpConstantComposite %_arr_v4float_uint_16 %135 %136 %137 %138 %139 %140 %141 %142 %135 %143 %144 %145 %146 %147 %148 %149
+      %int_9 = OpConstant %int 9
+     %int_11 = OpConstant %int 11
+     %int_16 = OpConstant %int 16
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+        %169 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+       %x_77 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %24
+       %x_78 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %24
+       %x_79 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %24
+       %x_80 = OpVariable %_ptr_Function__arr_v4float_uint_16 Function %31
+       %x_89 = OpVariable %_ptr_Function_v4float Function %5
+   %x_89_phi = OpVariable %_ptr_Function_v4float Function %5
+   %x_92_phi = OpVariable %_ptr_Function_int Function %38
+      %x_136 = OpVariable %_ptr_Function_v4float Function %5
+       %x_93 = OpVariable %_ptr_Function_int Function %38
+  %x_121_phi = OpVariable %_ptr_Function_bool Function %65
+   %x_90_phi = OpVariable %_ptr_Function_v4float Function %5
+       %x_98 = OpVariable %_ptr_Function_v4float Function %5
+         %39 = OpLoad %v4float %gl_FragCoord
+         %42 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %43 = OpLoad %v2float %42
+         %46 = OpCompositeExtract %float %39 0
+         %47 = OpCompositeExtract %float %39 1
+         %48 = OpCompositeConstruct %v2float %46 %47
+         %49 = OpFDiv %v2float %48 %43
+         %51 = OpVectorTimesScalar %v2float %49 %float_32
+         %44 = OpExtInst %v2float %45 Floor %51
+               OpStore %x_89_phi %54
+               OpStore %x_92_phi %int_0
+               OpBranch %56
+         %56 = OpLabel
+               OpLoopMerge %57 %58 None
+               OpBranch %59
+         %59 = OpLabel
+         %67 = OpLoad %v4float %x_89_phi
+               OpStore %x_89 %67
+         %68 = OpLoad %int %x_92_phi
+         %70 = OpSLessThan %bool %68 %int_8
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %73
+         %72 = OpLabel
+               OpBranch %71
+         %73 = OpLabel
+               OpBranch %57
+         %71 = OpLabel
+               OpStore %x_77 %91
+         %92 = OpAccessChain %_ptr_Function_v4float %x_77 %68
+         %93 = OpLoad %v4float %92
+               OpStore %x_98 %93
+               OpSelectionMerge %94 None
+               OpSwitch %uint_0 %95
+         %95 = OpLabel
+         %96 = OpCompositeExtract %float %44 0
+         %98 = OpAccessChain %_ptr_Function_float %x_98 %uint_0
+         %99 = OpLoad %float %98
+        %100 = OpFOrdLessThan %bool %96 %99
+               OpSelectionMerge %101 None
+               OpBranchConditional %100 %102 %101
+        %102 = OpLabel
+               OpStore %x_121_phi %false
+               OpBranch %94
+        %101 = OpLabel
+        %104 = OpCompositeExtract %float %44 1
+        %106 = OpAccessChain %_ptr_Function_float %x_98 %uint_1
+        %107 = OpLoad %float %106
+        %108 = OpFOrdLessThan %bool %104 %107
+               OpSelectionMerge %109 None
+               OpBranchConditional %108 %110 %109
+        %110 = OpLabel
+               OpStore %x_121_phi %false
+               OpBranch %94
+        %109 = OpLabel
+        %112 = OpAccessChain %_ptr_Function_float %x_98 %uint_2
+        %113 = OpLoad %float %112
+        %114 = OpFAdd %float %99 %113
+        %115 = OpFOrdGreaterThan %bool %96 %114
+               OpSelectionMerge %116 None
+               OpBranchConditional %115 %117 %116
+        %117 = OpLabel
+               OpStore %x_121_phi %false
+               OpBranch %94
+        %116 = OpLabel
+        %119 = OpAccessChain %_ptr_Function_float %x_98 %uint_3
+        %120 = OpLoad %float %119
+        %121 = OpFAdd %float %107 %120
+        %122 = OpFOrdGreaterThan %bool %104 %121
+               OpSelectionMerge %123 None
+               OpBranchConditional %122 %124 %123
+        %124 = OpLabel
+               OpStore %x_121_phi %false
+               OpBranch %94
+        %123 = OpLabel
+               OpStore %x_121_phi %true
+               OpBranch %94
+         %94 = OpLabel
+        %126 = OpLoad %bool %x_121_phi
+        %127 = OpLoad %v4float %x_89
+               OpStore %x_90_phi %127
+               OpSelectionMerge %128 None
+               OpBranchConditional %126 %129 %128
+        %129 = OpLabel
+               OpStore %x_78 %91
+        %130 = OpAccessChain %_ptr_Function_float %x_78 %68 %uint_0
+        %131 = OpLoad %float %130
+               OpStore %x_79 %91
+        %132 = OpAccessChain %_ptr_Function_float %x_79 %68 %uint_1
+        %133 = OpLoad %float %132
+               OpStore %x_80 %150
+        %151 = OpConvertFToS %int %131
+        %152 = OpConvertFToS %int %133
+        %153 = OpIMul %int %151 %152
+        %155 = OpIMul %int %68 %int_9
+        %156 = OpIAdd %int %153 %155
+        %158 = OpIAdd %int %156 %int_11
+        %160 = OpSMod %int %158 %int_16
+        %161 = OpAccessChain %_ptr_Function_v4float %x_80 %160
+        %162 = OpLoad %v4float %161
+               OpStore %x_136 %162
+        %163 = OpLoad %v4float %x_136
+               OpStore %x_90_phi %163
+               OpBranch %128
+        %128 = OpLabel
+        %164 = OpLoad %v4float %x_90_phi
+               OpBranch %58
+         %58 = OpLabel
+        %166 = OpIAdd %int %68 %int_1
+               OpStore %x_93 %166
+               OpStore %x_89_phi %164
+        %167 = OpLoad %int %x_93
+               OpStore %x_92_phi %167
+               OpBranch %56
+         %57 = OpLabel
+        %168 = OpLoad %v4float %x_89
+               OpStore %x_GLF_color %168
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %169
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %173 = OpLabel
+        %174 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %174
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %176 = OpLabel
+        %177 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %177
+        %178 = OpFunctionCall %void %main_1
+        %180 = OpLoad %v4float %x_GLF_color
+        %181 = OpCompositeConstruct %main_out %180
+        %179 = OpFunctionCall %void %tint_symbol_3 %181
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-null-in-phi-and-unroll/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-null-in-phi-and-unroll/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..1742de0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-null-in-phi-and-unroll/1.wgsl.expected.wgsl
@@ -0,0 +1,97 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_77 : array<vec4<f32>, 8>;
+  var x_78 : array<vec4<f32>, 8>;
+  var x_79 : array<vec4<f32>, 8>;
+  var x_80 : array<vec4<f32>, 16>;
+  var x_89 : vec4<f32>;
+  var x_89_phi : vec4<f32>;
+  var x_92_phi : i32;
+  let x_81 : vec4<f32> = gl_FragCoord;
+  let x_84 : vec2<f32> = x_6.resolution;
+  let x_87 : vec2<f32> = floor(((vec2<f32>(x_81.x, x_81.y) / x_84) * 32.0));
+  x_89_phi = vec4<f32>(0.5, 0.5, 1.0, 1.0);
+  x_92_phi = 0;
+  loop {
+    var x_136 : vec4<f32>;
+    var x_93 : i32;
+    var x_121_phi : bool;
+    var x_90_phi : vec4<f32>;
+    x_89 = x_89_phi;
+    let x_92 : i32 = x_92_phi;
+    if ((x_92 < 8)) {
+    } else {
+      break;
+    }
+    var x_98 : vec4<f32>;
+    x_77 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+    x_98 = x_77[x_92];
+    switch(0u) {
+      default: {
+        let x_101 : f32 = x_87.x;
+        let x_102 : f32 = x_98.x;
+        if ((x_101 < x_102)) {
+          x_121_phi = false;
+          break;
+        }
+        let x_106 : f32 = x_87.y;
+        let x_107 : f32 = x_98.y;
+        if ((x_106 < x_107)) {
+          x_121_phi = false;
+          break;
+        }
+        if ((x_101 > (x_102 + x_98.z))) {
+          x_121_phi = false;
+          break;
+        }
+        if ((x_106 > (x_107 + x_98.w))) {
+          x_121_phi = false;
+          break;
+        }
+        x_121_phi = true;
+      }
+    }
+    let x_121 : bool = x_121_phi;
+    x_90_phi = x_89;
+    if (x_121) {
+      x_78 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+      let x_125 : f32 = x_78[x_92].x;
+      x_79 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+      let x_128 : f32 = x_79[x_92].y;
+      x_80 = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+      x_136 = x_80[((((i32(x_125) * i32(x_128)) + (x_92 * 9)) + 11) % 16)];
+      x_90_phi = x_136;
+    }
+    let x_90 : vec4<f32> = x_90_phi;
+
+    continuing {
+      x_93 = (x_92 + 1);
+      x_89_phi = x_90;
+      x_92_phi = x_93;
+    }
+  }
+  x_GLF_color = x_89;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/1.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/1.spvasm
new file mode 100644
index 0000000..84be19f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/1.spvasm
@@ -0,0 +1,111 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpName %indexable "indexable"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+       %uint = OpTypeInt 32 0
+   %float_10 = OpConstant %float 10
+     %int_10 = OpConstant %int 10
+    %int_100 = OpConstant %int 100
+       %bool = OpTypeBool
+      %int_4 = OpConstant %int 4
+   %int_1000 = OpConstant %int 1000
+      %int_1 = OpConstant %int 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %31 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+  %float_0_5 = OpConstant %float 0.5
+         %33 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+         %34 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+         %35 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+         %36 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+         %37 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+         %38 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+         %39 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+         %40 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %41 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+         %42 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+         %43 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+         %44 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+         %45 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+         %46 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+         %47 = OpConstantComposite %_arr_v4float_uint_16 %31 %33 %34 %35 %36 %37 %38 %39 %31 %40 %41 %42 %43 %44 %45 %46
+     %int_16 = OpConstant %int 16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+  %float_0_0 = OpConstant %float 0
+         %52 = OpConstantComposite %v4float %float_0_0 %float_0_0 %float_0_0 %float_0_0
+         %53 = OpConstantComposite %_arr_v4float_uint_16 %52 %52 %52 %52 %52 %52 %52 %52 %52 %52 %52 %52 %52 %52 %52 %52
+       %main = OpFunction %void None %9
+         %54 = OpLabel
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_16 Function
+         %55 = OpLoad %v4float %gl_FragCoord
+         %56 = OpVectorShuffle %v2float %55 %55 0 1
+         %57 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+         %58 = OpLoad %v2float %57
+         %59 = OpFDiv %v2float %56 %58
+         %60 = OpCompositeExtract %float %59 0
+         %61 = OpFMul %float %60 %float_10
+         %62 = OpConvertFToS %int %61
+         %63 = OpCompositeExtract %float %59 1
+         %64 = OpFMul %float %63 %float_10
+         %65 = OpConvertFToS %int %64
+         %66 = OpIMul %int %65 %int_10
+         %67 = OpIAdd %int %62 %66
+               OpBranch %68
+         %68 = OpLabel
+         %69 = OpPhi %int %int_100 %54 %70 %71
+         %72 = OpPhi %int %int_0 %54 %73 %71
+         %74 = OpSLessThan %bool %72 %67
+               OpLoopMerge %75 %71 None
+               OpBranchConditional %74 %71 %75
+         %71 = OpLabel
+         %76 = OpIMul %int %int_4 %69
+         %77 = OpISub %int %int_1000 %69
+         %78 = OpIMul %int %76 %77
+         %70 = OpSDiv %int %78 %int_1000
+         %73 = OpIAdd %int %72 %int_1
+               OpBranch %68
+         %75 = OpLabel
+         %79 = OpSMod %int %69 %int_16
+               OpStore %indexable %47
+         %80 = OpLoad %_arr_v4float_uint_16 %indexable
+               OpStore %indexable %53
+               OpStore %indexable %80
+         %81 = OpVectorShuffle %v2float %41 %37 1 4
+         %82 = OpAccessChain %_ptr_Function_v4float %indexable %79
+         %83 = OpLoad %v4float %82
+               OpStore %_GLF_color %83
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..9998415
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/1.spvasm.expected.hlsl
@@ -0,0 +1,63 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 indexable[16] = (float4[16])0;
+  int x_69 = 0;
+  int x_69_phi = 0;
+  int x_72_phi = 0;
+  const float4 x_55 = gl_FragCoord;
+  const float2 x_58 = asfloat(x_6[0].xy);
+  const float2 x_59 = (float2(x_55.x, x_55.y) / x_58);
+  const int x_67 = (int((x_59.x * 10.0f)) + (int((x_59.y * 10.0f)) * 10));
+  x_69_phi = 100;
+  x_72_phi = 0;
+  while (true) {
+    int x_70 = 0;
+    int x_73 = 0;
+    x_69 = x_69_phi;
+    const int x_72 = x_72_phi;
+    if ((x_72 < x_67)) {
+    } else {
+      break;
+    }
+    {
+      x_70 = (((4 * asint(x_69)) * (1000 - asint(x_69))) / 1000);
+      x_73 = (x_72 + 1);
+      x_69_phi = x_70;
+      x_72_phi = x_73;
+    }
+  }
+  const float4 tint_symbol_5[16] = {float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)};
+  indexable = tint_symbol_5;
+  const float4 x_80[16] = indexable;
+  const float4 tint_symbol_6[16] = {float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)};
+  indexable = tint_symbol_6;
+  indexable = x_80;
+  const float2 x_81 = float2(float4(0.0f, 1.0f, 0.0f, 1.0f).y, float4(0.5f, 0.0f, 0.5f, 1.0f).x);
+  const float4 x_83 = indexable[asint((x_69 % 16))];
+  x_GLF_color = x_83;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_7 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_7;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/1.spvasm.expected.msl
new file mode 100644
index 0000000..d75eca0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/1.spvasm.expected.msl
@@ -0,0 +1,65 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  float4 arr[16];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_7, thread float4* const tint_symbol_8) {
+  tint_array_wrapper indexable = {};
+  int x_69 = 0;
+  int x_69_phi = 0;
+  int x_72_phi = 0;
+  float4 const x_55 = *(tint_symbol_7);
+  float2 const x_58 = x_6.resolution;
+  float2 const x_59 = (float2(x_55.x, x_55.y) / x_58);
+  int const x_67 = (int((x_59.x * 10.0f)) + (int((x_59.y * 10.0f)) * 10));
+  x_69_phi = 100;
+  x_72_phi = 0;
+  while (true) {
+    int x_70 = 0;
+    int x_73 = 0;
+    x_69 = x_69_phi;
+    int const x_72 = x_72_phi;
+    if ((x_72 < x_67)) {
+    } else {
+      break;
+    }
+    {
+      x_70 = (((4 * as_type<int>(x_69)) * (1000 - as_type<int>(x_69))) / 1000);
+      x_73 = (x_72 + 1);
+      x_69_phi = x_70;
+      x_72_phi = x_73;
+    }
+  }
+  tint_array_wrapper const tint_symbol_4 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
+  indexable = tint_symbol_4;
+  tint_array_wrapper const x_80 = indexable;
+  tint_array_wrapper const tint_symbol_5 = {.arr={float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)}};
+  indexable = tint_symbol_5;
+  indexable = x_80;
+  float2 const x_81 = float2(float4(0.0f, 1.0f, 0.0f, 1.0f).y, float4(0.5f, 0.0f, 0.5f, 1.0f).x);
+  float4 const x_83 = indexable.arr[as_type<int>((x_69 % 16))];
+  *(tint_symbol_8) = x_83;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_9 = 0.0f;
+  thread float4 tint_symbol_10 = 0.0f;
+  tint_symbol_9 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_9), &(tint_symbol_10));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_10};
+  tint_symbol_2 const tint_symbol_6 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..7dfa9c8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/1.spvasm.expected.spvasm
@@ -0,0 +1,188 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 124
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %indexable "indexable"
+               OpName %x_69 "x_69"
+               OpName %x_69_phi "x_69_phi"
+               OpName %x_72_phi "x_72_phi"
+               OpName %x_70 "x_70"
+               OpName %x_73 "x_73"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v4float_uint_16 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+         %24 = OpConstantNull %_arr_v4float_uint_16
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %28 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+   %float_10 = OpConstant %float 10
+     %int_10 = OpConstant %int 10
+    %int_100 = OpConstant %int 100
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_4 = OpConstant %int 4
+   %int_1000 = OpConstant %int 1000
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %81 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+  %float_0_5 = OpConstant %float 0.5
+         %83 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+         %84 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+         %85 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+         %86 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+         %87 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+         %88 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+         %89 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+         %90 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %91 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+         %92 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+         %93 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+         %94 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+         %95 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+         %96 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+         %97 = OpConstantComposite %_arr_v4float_uint_16 %81 %83 %84 %85 %86 %87 %88 %89 %81 %90 %91 %92 %93 %94 %95 %96
+         %99 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+        %100 = OpConstantComposite %_arr_v4float_uint_16 %99 %99 %99 %99 %99 %99 %99 %99 %99 %99 %99 %99 %99 %99 %99 %99
+     %int_16 = OpConstant %int 16
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+   %main_out = OpTypeStruct %v4float
+        %111 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_16 Function %24
+       %x_69 = OpVariable %_ptr_Function_int Function %28
+   %x_69_phi = OpVariable %_ptr_Function_int Function %28
+   %x_72_phi = OpVariable %_ptr_Function_int Function %28
+       %x_70 = OpVariable %_ptr_Function_int Function %28
+       %x_73 = OpVariable %_ptr_Function_int Function %28
+         %31 = OpLoad %v4float %gl_FragCoord
+         %34 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %35 = OpLoad %v2float %34
+         %36 = OpCompositeExtract %float %31 0
+         %37 = OpCompositeExtract %float %31 1
+         %38 = OpCompositeConstruct %v2float %36 %37
+         %39 = OpFDiv %v2float %38 %35
+         %41 = OpCompositeExtract %float %39 0
+         %43 = OpFMul %float %41 %float_10
+         %40 = OpConvertFToS %int %43
+         %45 = OpCompositeExtract %float %39 1
+         %46 = OpFMul %float %45 %float_10
+         %44 = OpConvertFToS %int %46
+         %48 = OpIMul %int %44 %int_10
+         %49 = OpIAdd %int %40 %48
+               OpStore %x_69_phi %int_100
+               OpStore %x_72_phi %int_0
+               OpBranch %52
+         %52 = OpLabel
+               OpLoopMerge %53 %54 None
+               OpBranch %55
+         %55 = OpLabel
+         %58 = OpLoad %int %x_69_phi
+               OpStore %x_69 %58
+         %59 = OpLoad %int %x_72_phi
+         %60 = OpSLessThan %bool %59 %49
+               OpSelectionMerge %62 None
+               OpBranchConditional %60 %63 %64
+         %63 = OpLabel
+               OpBranch %62
+         %64 = OpLabel
+               OpBranch %53
+         %62 = OpLabel
+               OpBranch %54
+         %54 = OpLabel
+         %67 = OpLoad %int %x_69
+         %66 = OpCopyObject %int %67
+         %68 = OpIMul %int %int_4 %66
+         %71 = OpLoad %int %x_69
+         %70 = OpCopyObject %int %71
+         %72 = OpISub %int %int_1000 %70
+         %73 = OpIMul %int %68 %72
+         %74 = OpSDiv %int %73 %int_1000
+               OpStore %x_70 %74
+         %76 = OpIAdd %int %59 %int_1
+               OpStore %x_73 %76
+         %77 = OpLoad %int %x_70
+               OpStore %x_69_phi %77
+         %78 = OpLoad %int %x_73
+               OpStore %x_72_phi %78
+               OpBranch %52
+         %53 = OpLabel
+               OpStore %indexable %97
+         %98 = OpLoad %_arr_v4float_uint_16 %indexable
+               OpStore %indexable %100
+               OpStore %indexable %98
+        %101 = OpCompositeExtract %float %91 1
+        %102 = OpCompositeExtract %float %87 0
+        %103 = OpCompositeConstruct %v2float %101 %102
+        %105 = OpLoad %int %x_69
+        %107 = OpSMod %int %105 %int_16
+        %104 = OpCopyObject %int %107
+        %109 = OpAccessChain %_ptr_Function_v4float %indexable %104
+        %110 = OpLoad %v4float %109
+               OpStore %x_GLF_color %110
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %111
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %115 = OpLabel
+        %116 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %116
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %118 = OpLabel
+        %119 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %119
+        %120 = OpFunctionCall %void %main_1
+        %122 = OpLoad %v4float %x_GLF_color
+        %123 = OpCompositeConstruct %main_out %122
+        %121 = OpFunctionCall %void %tint_symbol_3 %123
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..e7aeb6d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/1.spvasm.expected.wgsl
@@ -0,0 +1,60 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var indexable : array<vec4<f32>, 16>;
+  var x_69 : i32;
+  var x_69_phi : i32;
+  var x_72_phi : i32;
+  let x_55 : vec4<f32> = gl_FragCoord;
+  let x_58 : vec2<f32> = x_6.resolution;
+  let x_59 : vec2<f32> = (vec2<f32>(x_55.x, x_55.y) / x_58);
+  let x_67 : i32 = (i32((x_59.x * 10.0)) + (i32((x_59.y * 10.0)) * 10));
+  x_69_phi = 100;
+  x_72_phi = 0;
+  loop {
+    var x_70 : i32;
+    var x_73 : i32;
+    x_69 = x_69_phi;
+    let x_72 : i32 = x_72_phi;
+    if ((x_72 < x_67)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_70 = (((4 * bitcast<i32>(x_69)) * (1000 - bitcast<i32>(x_69))) / 1000);
+      x_73 = (x_72 + 1);
+      x_69_phi = x_70;
+      x_72_phi = x_73;
+    }
+  }
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+  let x_80 : array<vec4<f32>, 16> = indexable;
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
+  indexable = x_80;
+  let x_81 : vec2<f32> = vec2<f32>(vec4<f32>(0.0, 1.0, 0.0, 1.0).y, vec4<f32>(0.5, 0.0, 0.5, 1.0).x);
+  let x_83 : vec4<f32> = indexable[bitcast<i32>((x_69 % 16))];
+  x_GLF_color = x_83;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/1.wgsl
new file mode 100644
index 0000000..e7aeb6d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/1.wgsl
@@ -0,0 +1,60 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var indexable : array<vec4<f32>, 16>;
+  var x_69 : i32;
+  var x_69_phi : i32;
+  var x_72_phi : i32;
+  let x_55 : vec4<f32> = gl_FragCoord;
+  let x_58 : vec2<f32> = x_6.resolution;
+  let x_59 : vec2<f32> = (vec2<f32>(x_55.x, x_55.y) / x_58);
+  let x_67 : i32 = (i32((x_59.x * 10.0)) + (i32((x_59.y * 10.0)) * 10));
+  x_69_phi = 100;
+  x_72_phi = 0;
+  loop {
+    var x_70 : i32;
+    var x_73 : i32;
+    x_69 = x_69_phi;
+    let x_72 : i32 = x_72_phi;
+    if ((x_72 < x_67)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_70 = (((4 * bitcast<i32>(x_69)) * (1000 - bitcast<i32>(x_69))) / 1000);
+      x_73 = (x_72 + 1);
+      x_69_phi = x_70;
+      x_72_phi = x_73;
+    }
+  }
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+  let x_80 : array<vec4<f32>, 16> = indexable;
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
+  indexable = x_80;
+  let x_81 : vec2<f32> = vec2<f32>(vec4<f32>(0.0, 1.0, 0.0, 1.0).y, vec4<f32>(0.5, 0.0, 0.5, 1.0).x);
+  let x_83 : vec4<f32> = indexable[bitcast<i32>((x_69 % 16))];
+  x_GLF_color = x_83;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..9998415
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/1.wgsl.expected.hlsl
@@ -0,0 +1,63 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 indexable[16] = (float4[16])0;
+  int x_69 = 0;
+  int x_69_phi = 0;
+  int x_72_phi = 0;
+  const float4 x_55 = gl_FragCoord;
+  const float2 x_58 = asfloat(x_6[0].xy);
+  const float2 x_59 = (float2(x_55.x, x_55.y) / x_58);
+  const int x_67 = (int((x_59.x * 10.0f)) + (int((x_59.y * 10.0f)) * 10));
+  x_69_phi = 100;
+  x_72_phi = 0;
+  while (true) {
+    int x_70 = 0;
+    int x_73 = 0;
+    x_69 = x_69_phi;
+    const int x_72 = x_72_phi;
+    if ((x_72 < x_67)) {
+    } else {
+      break;
+    }
+    {
+      x_70 = (((4 * asint(x_69)) * (1000 - asint(x_69))) / 1000);
+      x_73 = (x_72 + 1);
+      x_69_phi = x_70;
+      x_72_phi = x_73;
+    }
+  }
+  const float4 tint_symbol_5[16] = {float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)};
+  indexable = tint_symbol_5;
+  const float4 x_80[16] = indexable;
+  const float4 tint_symbol_6[16] = {float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)};
+  indexable = tint_symbol_6;
+  indexable = x_80;
+  const float2 x_81 = float2(float4(0.0f, 1.0f, 0.0f, 1.0f).y, float4(0.5f, 0.0f, 0.5f, 1.0f).x);
+  const float4 x_83 = indexable[asint((x_69 % 16))];
+  x_GLF_color = x_83;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_7 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_7;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/1.wgsl.expected.msl
new file mode 100644
index 0000000..d75eca0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/1.wgsl.expected.msl
@@ -0,0 +1,65 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  float4 arr[16];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_7, thread float4* const tint_symbol_8) {
+  tint_array_wrapper indexable = {};
+  int x_69 = 0;
+  int x_69_phi = 0;
+  int x_72_phi = 0;
+  float4 const x_55 = *(tint_symbol_7);
+  float2 const x_58 = x_6.resolution;
+  float2 const x_59 = (float2(x_55.x, x_55.y) / x_58);
+  int const x_67 = (int((x_59.x * 10.0f)) + (int((x_59.y * 10.0f)) * 10));
+  x_69_phi = 100;
+  x_72_phi = 0;
+  while (true) {
+    int x_70 = 0;
+    int x_73 = 0;
+    x_69 = x_69_phi;
+    int const x_72 = x_72_phi;
+    if ((x_72 < x_67)) {
+    } else {
+      break;
+    }
+    {
+      x_70 = (((4 * as_type<int>(x_69)) * (1000 - as_type<int>(x_69))) / 1000);
+      x_73 = (x_72 + 1);
+      x_69_phi = x_70;
+      x_72_phi = x_73;
+    }
+  }
+  tint_array_wrapper const tint_symbol_4 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
+  indexable = tint_symbol_4;
+  tint_array_wrapper const x_80 = indexable;
+  tint_array_wrapper const tint_symbol_5 = {.arr={float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)}};
+  indexable = tint_symbol_5;
+  indexable = x_80;
+  float2 const x_81 = float2(float4(0.0f, 1.0f, 0.0f, 1.0f).y, float4(0.5f, 0.0f, 0.5f, 1.0f).x);
+  float4 const x_83 = indexable.arr[as_type<int>((x_69 % 16))];
+  *(tint_symbol_8) = x_83;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_9 = 0.0f;
+  thread float4 tint_symbol_10 = 0.0f;
+  tint_symbol_9 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_9), &(tint_symbol_10));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_10};
+  tint_symbol_2 const tint_symbol_6 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..7dfa9c8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/1.wgsl.expected.spvasm
@@ -0,0 +1,188 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 124
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %indexable "indexable"
+               OpName %x_69 "x_69"
+               OpName %x_69_phi "x_69_phi"
+               OpName %x_72_phi "x_72_phi"
+               OpName %x_70 "x_70"
+               OpName %x_73 "x_73"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v4float_uint_16 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+         %24 = OpConstantNull %_arr_v4float_uint_16
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %28 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+   %float_10 = OpConstant %float 10
+     %int_10 = OpConstant %int 10
+    %int_100 = OpConstant %int 100
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_4 = OpConstant %int 4
+   %int_1000 = OpConstant %int 1000
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %81 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+  %float_0_5 = OpConstant %float 0.5
+         %83 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+         %84 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+         %85 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+         %86 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+         %87 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+         %88 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+         %89 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+         %90 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %91 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+         %92 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+         %93 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+         %94 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+         %95 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+         %96 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+         %97 = OpConstantComposite %_arr_v4float_uint_16 %81 %83 %84 %85 %86 %87 %88 %89 %81 %90 %91 %92 %93 %94 %95 %96
+         %99 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+        %100 = OpConstantComposite %_arr_v4float_uint_16 %99 %99 %99 %99 %99 %99 %99 %99 %99 %99 %99 %99 %99 %99 %99 %99
+     %int_16 = OpConstant %int 16
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+   %main_out = OpTypeStruct %v4float
+        %111 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_16 Function %24
+       %x_69 = OpVariable %_ptr_Function_int Function %28
+   %x_69_phi = OpVariable %_ptr_Function_int Function %28
+   %x_72_phi = OpVariable %_ptr_Function_int Function %28
+       %x_70 = OpVariable %_ptr_Function_int Function %28
+       %x_73 = OpVariable %_ptr_Function_int Function %28
+         %31 = OpLoad %v4float %gl_FragCoord
+         %34 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %35 = OpLoad %v2float %34
+         %36 = OpCompositeExtract %float %31 0
+         %37 = OpCompositeExtract %float %31 1
+         %38 = OpCompositeConstruct %v2float %36 %37
+         %39 = OpFDiv %v2float %38 %35
+         %41 = OpCompositeExtract %float %39 0
+         %43 = OpFMul %float %41 %float_10
+         %40 = OpConvertFToS %int %43
+         %45 = OpCompositeExtract %float %39 1
+         %46 = OpFMul %float %45 %float_10
+         %44 = OpConvertFToS %int %46
+         %48 = OpIMul %int %44 %int_10
+         %49 = OpIAdd %int %40 %48
+               OpStore %x_69_phi %int_100
+               OpStore %x_72_phi %int_0
+               OpBranch %52
+         %52 = OpLabel
+               OpLoopMerge %53 %54 None
+               OpBranch %55
+         %55 = OpLabel
+         %58 = OpLoad %int %x_69_phi
+               OpStore %x_69 %58
+         %59 = OpLoad %int %x_72_phi
+         %60 = OpSLessThan %bool %59 %49
+               OpSelectionMerge %62 None
+               OpBranchConditional %60 %63 %64
+         %63 = OpLabel
+               OpBranch %62
+         %64 = OpLabel
+               OpBranch %53
+         %62 = OpLabel
+               OpBranch %54
+         %54 = OpLabel
+         %67 = OpLoad %int %x_69
+         %66 = OpCopyObject %int %67
+         %68 = OpIMul %int %int_4 %66
+         %71 = OpLoad %int %x_69
+         %70 = OpCopyObject %int %71
+         %72 = OpISub %int %int_1000 %70
+         %73 = OpIMul %int %68 %72
+         %74 = OpSDiv %int %73 %int_1000
+               OpStore %x_70 %74
+         %76 = OpIAdd %int %59 %int_1
+               OpStore %x_73 %76
+         %77 = OpLoad %int %x_70
+               OpStore %x_69_phi %77
+         %78 = OpLoad %int %x_73
+               OpStore %x_72_phi %78
+               OpBranch %52
+         %53 = OpLabel
+               OpStore %indexable %97
+         %98 = OpLoad %_arr_v4float_uint_16 %indexable
+               OpStore %indexable %100
+               OpStore %indexable %98
+        %101 = OpCompositeExtract %float %91 1
+        %102 = OpCompositeExtract %float %87 0
+        %103 = OpCompositeConstruct %v2float %101 %102
+        %105 = OpLoad %int %x_69
+        %107 = OpSMod %int %105 %int_16
+        %104 = OpCopyObject %int %107
+        %109 = OpAccessChain %_ptr_Function_v4float %indexable %104
+        %110 = OpLoad %v4float %109
+               OpStore %x_GLF_color %110
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %111
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %115 = OpLabel
+        %116 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %116
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %118 = OpLabel
+        %119 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %119
+        %120 = OpFunctionCall %void %main_1
+        %122 = OpLoad %v4float %x_GLF_color
+        %123 = OpCompositeConstruct %main_out %122
+        %121 = OpFunctionCall %void %tint_symbol_3 %123
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..e7aeb6d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/1.wgsl.expected.wgsl
@@ -0,0 +1,60 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var indexable : array<vec4<f32>, 16>;
+  var x_69 : i32;
+  var x_69_phi : i32;
+  var x_72_phi : i32;
+  let x_55 : vec4<f32> = gl_FragCoord;
+  let x_58 : vec2<f32> = x_6.resolution;
+  let x_59 : vec2<f32> = (vec2<f32>(x_55.x, x_55.y) / x_58);
+  let x_67 : i32 = (i32((x_59.x * 10.0)) + (i32((x_59.y * 10.0)) * 10));
+  x_69_phi = 100;
+  x_72_phi = 0;
+  loop {
+    var x_70 : i32;
+    var x_73 : i32;
+    x_69 = x_69_phi;
+    let x_72 : i32 = x_72_phi;
+    if ((x_72 < x_67)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_70 = (((4 * bitcast<i32>(x_69)) * (1000 - bitcast<i32>(x_69))) / 1000);
+      x_73 = (x_72 + 1);
+      x_69_phi = x_70;
+      x_72_phi = x_73;
+    }
+  }
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+  let x_80 : array<vec4<f32>, 16> = indexable;
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
+  indexable = x_80;
+  let x_81 : vec2<f32> = vec2<f32>(vec4<f32>(0.0, 1.0, 0.0, 1.0).y, vec4<f32>(0.5, 0.0, 0.5, 1.0).x);
+  let x_83 : vec4<f32> = indexable[bitcast<i32>((x_69 % 16))];
+  x_GLF_color = x_83;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/2.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/2.spvasm
new file mode 100644
index 0000000..ee9d964
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/2.spvasm
@@ -0,0 +1,108 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpName %indexable "indexable"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+       %uint = OpTypeInt 32 0
+   %float_10 = OpConstant %float 10
+     %int_10 = OpConstant %int 10
+    %int_100 = OpConstant %int 100
+       %bool = OpTypeBool
+      %int_4 = OpConstant %int 4
+   %int_1000 = OpConstant %int 1000
+      %int_1 = OpConstant %int 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %31 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+  %float_0_5 = OpConstant %float 0.5
+         %33 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+         %34 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+         %35 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+         %36 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+         %37 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+         %38 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+         %39 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+         %40 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %41 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+         %42 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+         %43 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+         %44 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+         %45 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+         %46 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+         %47 = OpConstantComposite %_arr_v4float_uint_16 %31 %33 %34 %35 %36 %37 %38 %39 %31 %40 %41 %42 %43 %44 %45 %46
+     %int_16 = OpConstant %int 16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+  %float_0_0 = OpConstant %float 0
+         %52 = OpConstantComposite %v4float %float_0_0 %float_0_0 %float_0_0 %float_0_0
+         %53 = OpConstantComposite %_arr_v4float_uint_16 %52 %52 %52 %52 %52 %52 %52 %52 %52 %52 %52 %52 %52 %52 %52 %52
+       %main = OpFunction %void None %9
+         %54 = OpLabel
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_16 Function
+         %55 = OpLoad %v4float %gl_FragCoord
+         %56 = OpVectorShuffle %v2float %55 %55 0 1
+         %57 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+         %58 = OpLoad %v2float %57
+         %59 = OpFDiv %v2float %56 %58
+         %60 = OpCompositeExtract %float %59 0
+         %61 = OpFMul %float %60 %float_10
+         %62 = OpConvertFToS %int %61
+         %63 = OpCompositeExtract %float %59 1
+         %64 = OpFMul %float %63 %float_10
+         %65 = OpConvertFToS %int %64
+         %66 = OpIMul %int %65 %int_10
+         %67 = OpIAdd %int %62 %66
+               OpBranch %68
+         %68 = OpLabel
+         %69 = OpPhi %int %int_100 %54 %70 %71
+         %72 = OpPhi %int %int_0 %54 %73 %71
+         %74 = OpSLessThan %bool %72 %67
+               OpLoopMerge %75 %71 None
+               OpBranchConditional %74 %71 %75
+         %71 = OpLabel
+         %76 = OpIMul %int %int_4 %69
+         %77 = OpISub %int %int_1000 %69
+         %78 = OpIMul %int %76 %77
+         %70 = OpSDiv %int %78 %int_1000
+         %73 = OpIAdd %int %72 %int_1
+               OpBranch %68
+         %75 = OpLabel
+         %79 = OpSMod %int %69 %int_16
+               OpStore %indexable %47
+         %80 = OpVectorShuffle %v2float %41 %37 1 4
+         %81 = OpAccessChain %_ptr_Function_v4float %indexable %79
+         %82 = OpLoad %v4float %81
+               OpStore %_GLF_color %82
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/2.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/2.spvasm.expected.hlsl
new file mode 100644
index 0000000..ac6e8e0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/2.spvasm.expected.hlsl
@@ -0,0 +1,59 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 indexable[16] = (float4[16])0;
+  int x_69 = 0;
+  int x_69_phi = 0;
+  int x_72_phi = 0;
+  const float4 x_55 = gl_FragCoord;
+  const float2 x_58 = asfloat(x_6[0].xy);
+  const float2 x_59 = (float2(x_55.x, x_55.y) / x_58);
+  const int x_67 = (int((x_59.x * 10.0f)) + (int((x_59.y * 10.0f)) * 10));
+  x_69_phi = 100;
+  x_72_phi = 0;
+  while (true) {
+    int x_70 = 0;
+    int x_73 = 0;
+    x_69 = x_69_phi;
+    const int x_72 = x_72_phi;
+    if ((x_72 < x_67)) {
+    } else {
+      break;
+    }
+    {
+      x_70 = (((4 * asint(x_69)) * (1000 - asint(x_69))) / 1000);
+      x_73 = (x_72 + 1);
+      x_69_phi = x_70;
+      x_72_phi = x_73;
+    }
+  }
+  const float4 tint_symbol_5[16] = {float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)};
+  indexable = tint_symbol_5;
+  const float2 x_80 = float2(float4(0.0f, 1.0f, 0.0f, 1.0f).y, float4(0.5f, 0.0f, 0.5f, 1.0f).x);
+  const float4 x_82 = indexable[asint((x_69 % 16))];
+  x_GLF_color = x_82;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/2.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/2.spvasm.expected.msl
new file mode 100644
index 0000000..f126328
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/2.spvasm.expected.msl
@@ -0,0 +1,61 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  float4 arr[16];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  tint_array_wrapper indexable = {};
+  int x_69 = 0;
+  int x_69_phi = 0;
+  int x_72_phi = 0;
+  float4 const x_55 = *(tint_symbol_6);
+  float2 const x_58 = x_6.resolution;
+  float2 const x_59 = (float2(x_55.x, x_55.y) / x_58);
+  int const x_67 = (int((x_59.x * 10.0f)) + (int((x_59.y * 10.0f)) * 10));
+  x_69_phi = 100;
+  x_72_phi = 0;
+  while (true) {
+    int x_70 = 0;
+    int x_73 = 0;
+    x_69 = x_69_phi;
+    int const x_72 = x_72_phi;
+    if ((x_72 < x_67)) {
+    } else {
+      break;
+    }
+    {
+      x_70 = (((4 * as_type<int>(x_69)) * (1000 - as_type<int>(x_69))) / 1000);
+      x_73 = (x_72 + 1);
+      x_69_phi = x_70;
+      x_72_phi = x_73;
+    }
+  }
+  tint_array_wrapper const tint_symbol_4 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
+  indexable = tint_symbol_4;
+  float2 const x_80 = float2(float4(0.0f, 1.0f, 0.0f, 1.0f).y, float4(0.5f, 0.0f, 0.5f, 1.0f).x);
+  float4 const x_82 = indexable.arr[as_type<int>((x_69 % 16))];
+  *(tint_symbol_7) = x_82;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/2.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/2.spvasm.expected.spvasm
new file mode 100644
index 0000000..6899c03
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/2.spvasm.expected.spvasm
@@ -0,0 +1,183 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 121
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %indexable "indexable"
+               OpName %x_69 "x_69"
+               OpName %x_69_phi "x_69_phi"
+               OpName %x_72_phi "x_72_phi"
+               OpName %x_70 "x_70"
+               OpName %x_73 "x_73"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v4float_uint_16 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+         %24 = OpConstantNull %_arr_v4float_uint_16
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %28 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+   %float_10 = OpConstant %float 10
+     %int_10 = OpConstant %int 10
+    %int_100 = OpConstant %int 100
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_4 = OpConstant %int 4
+   %int_1000 = OpConstant %int 1000
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %81 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+  %float_0_5 = OpConstant %float 0.5
+         %83 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+         %84 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+         %85 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+         %86 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+         %87 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+         %88 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+         %89 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+         %90 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %91 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+         %92 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+         %93 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+         %94 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+         %95 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+         %96 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+         %97 = OpConstantComposite %_arr_v4float_uint_16 %81 %83 %84 %85 %86 %87 %88 %89 %81 %90 %91 %92 %93 %94 %95 %96
+     %int_16 = OpConstant %int 16
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+   %main_out = OpTypeStruct %v4float
+        %108 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_16 Function %24
+       %x_69 = OpVariable %_ptr_Function_int Function %28
+   %x_69_phi = OpVariable %_ptr_Function_int Function %28
+   %x_72_phi = OpVariable %_ptr_Function_int Function %28
+       %x_70 = OpVariable %_ptr_Function_int Function %28
+       %x_73 = OpVariable %_ptr_Function_int Function %28
+         %31 = OpLoad %v4float %gl_FragCoord
+         %34 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %35 = OpLoad %v2float %34
+         %36 = OpCompositeExtract %float %31 0
+         %37 = OpCompositeExtract %float %31 1
+         %38 = OpCompositeConstruct %v2float %36 %37
+         %39 = OpFDiv %v2float %38 %35
+         %41 = OpCompositeExtract %float %39 0
+         %43 = OpFMul %float %41 %float_10
+         %40 = OpConvertFToS %int %43
+         %45 = OpCompositeExtract %float %39 1
+         %46 = OpFMul %float %45 %float_10
+         %44 = OpConvertFToS %int %46
+         %48 = OpIMul %int %44 %int_10
+         %49 = OpIAdd %int %40 %48
+               OpStore %x_69_phi %int_100
+               OpStore %x_72_phi %int_0
+               OpBranch %52
+         %52 = OpLabel
+               OpLoopMerge %53 %54 None
+               OpBranch %55
+         %55 = OpLabel
+         %58 = OpLoad %int %x_69_phi
+               OpStore %x_69 %58
+         %59 = OpLoad %int %x_72_phi
+         %60 = OpSLessThan %bool %59 %49
+               OpSelectionMerge %62 None
+               OpBranchConditional %60 %63 %64
+         %63 = OpLabel
+               OpBranch %62
+         %64 = OpLabel
+               OpBranch %53
+         %62 = OpLabel
+               OpBranch %54
+         %54 = OpLabel
+         %67 = OpLoad %int %x_69
+         %66 = OpCopyObject %int %67
+         %68 = OpIMul %int %int_4 %66
+         %71 = OpLoad %int %x_69
+         %70 = OpCopyObject %int %71
+         %72 = OpISub %int %int_1000 %70
+         %73 = OpIMul %int %68 %72
+         %74 = OpSDiv %int %73 %int_1000
+               OpStore %x_70 %74
+         %76 = OpIAdd %int %59 %int_1
+               OpStore %x_73 %76
+         %77 = OpLoad %int %x_70
+               OpStore %x_69_phi %77
+         %78 = OpLoad %int %x_73
+               OpStore %x_72_phi %78
+               OpBranch %52
+         %53 = OpLabel
+               OpStore %indexable %97
+         %98 = OpCompositeExtract %float %91 1
+         %99 = OpCompositeExtract %float %87 0
+        %100 = OpCompositeConstruct %v2float %98 %99
+        %102 = OpLoad %int %x_69
+        %104 = OpSMod %int %102 %int_16
+        %101 = OpCopyObject %int %104
+        %106 = OpAccessChain %_ptr_Function_v4float %indexable %101
+        %107 = OpLoad %v4float %106
+               OpStore %x_GLF_color %107
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %108
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %112 = OpLabel
+        %113 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %113
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %115 = OpLabel
+        %116 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %116
+        %117 = OpFunctionCall %void %main_1
+        %119 = OpLoad %v4float %x_GLF_color
+        %120 = OpCompositeConstruct %main_out %119
+        %118 = OpFunctionCall %void %tint_symbol_3 %120
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/2.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/2.spvasm.expected.wgsl
new file mode 100644
index 0000000..088e3cd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/2.spvasm.expected.wgsl
@@ -0,0 +1,57 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var indexable : array<vec4<f32>, 16>;
+  var x_69 : i32;
+  var x_69_phi : i32;
+  var x_72_phi : i32;
+  let x_55 : vec4<f32> = gl_FragCoord;
+  let x_58 : vec2<f32> = x_6.resolution;
+  let x_59 : vec2<f32> = (vec2<f32>(x_55.x, x_55.y) / x_58);
+  let x_67 : i32 = (i32((x_59.x * 10.0)) + (i32((x_59.y * 10.0)) * 10));
+  x_69_phi = 100;
+  x_72_phi = 0;
+  loop {
+    var x_70 : i32;
+    var x_73 : i32;
+    x_69 = x_69_phi;
+    let x_72 : i32 = x_72_phi;
+    if ((x_72 < x_67)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_70 = (((4 * bitcast<i32>(x_69)) * (1000 - bitcast<i32>(x_69))) / 1000);
+      x_73 = (x_72 + 1);
+      x_69_phi = x_70;
+      x_72_phi = x_73;
+    }
+  }
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+  let x_80 : vec2<f32> = vec2<f32>(vec4<f32>(0.0, 1.0, 0.0, 1.0).y, vec4<f32>(0.5, 0.0, 0.5, 1.0).x);
+  let x_82 : vec4<f32> = indexable[bitcast<i32>((x_69 % 16))];
+  x_GLF_color = x_82;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/2.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/2.wgsl
new file mode 100644
index 0000000..088e3cd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/2.wgsl
@@ -0,0 +1,57 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var indexable : array<vec4<f32>, 16>;
+  var x_69 : i32;
+  var x_69_phi : i32;
+  var x_72_phi : i32;
+  let x_55 : vec4<f32> = gl_FragCoord;
+  let x_58 : vec2<f32> = x_6.resolution;
+  let x_59 : vec2<f32> = (vec2<f32>(x_55.x, x_55.y) / x_58);
+  let x_67 : i32 = (i32((x_59.x * 10.0)) + (i32((x_59.y * 10.0)) * 10));
+  x_69_phi = 100;
+  x_72_phi = 0;
+  loop {
+    var x_70 : i32;
+    var x_73 : i32;
+    x_69 = x_69_phi;
+    let x_72 : i32 = x_72_phi;
+    if ((x_72 < x_67)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_70 = (((4 * bitcast<i32>(x_69)) * (1000 - bitcast<i32>(x_69))) / 1000);
+      x_73 = (x_72 + 1);
+      x_69_phi = x_70;
+      x_72_phi = x_73;
+    }
+  }
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+  let x_80 : vec2<f32> = vec2<f32>(vec4<f32>(0.0, 1.0, 0.0, 1.0).y, vec4<f32>(0.5, 0.0, 0.5, 1.0).x);
+  let x_82 : vec4<f32> = indexable[bitcast<i32>((x_69 % 16))];
+  x_GLF_color = x_82;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/2.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/2.wgsl.expected.hlsl
new file mode 100644
index 0000000..ac6e8e0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/2.wgsl.expected.hlsl
@@ -0,0 +1,59 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 indexable[16] = (float4[16])0;
+  int x_69 = 0;
+  int x_69_phi = 0;
+  int x_72_phi = 0;
+  const float4 x_55 = gl_FragCoord;
+  const float2 x_58 = asfloat(x_6[0].xy);
+  const float2 x_59 = (float2(x_55.x, x_55.y) / x_58);
+  const int x_67 = (int((x_59.x * 10.0f)) + (int((x_59.y * 10.0f)) * 10));
+  x_69_phi = 100;
+  x_72_phi = 0;
+  while (true) {
+    int x_70 = 0;
+    int x_73 = 0;
+    x_69 = x_69_phi;
+    const int x_72 = x_72_phi;
+    if ((x_72 < x_67)) {
+    } else {
+      break;
+    }
+    {
+      x_70 = (((4 * asint(x_69)) * (1000 - asint(x_69))) / 1000);
+      x_73 = (x_72 + 1);
+      x_69_phi = x_70;
+      x_72_phi = x_73;
+    }
+  }
+  const float4 tint_symbol_5[16] = {float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)};
+  indexable = tint_symbol_5;
+  const float2 x_80 = float2(float4(0.0f, 1.0f, 0.0f, 1.0f).y, float4(0.5f, 0.0f, 0.5f, 1.0f).x);
+  const float4 x_82 = indexable[asint((x_69 % 16))];
+  x_GLF_color = x_82;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/2.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/2.wgsl.expected.msl
new file mode 100644
index 0000000..f126328
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/2.wgsl.expected.msl
@@ -0,0 +1,61 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  float4 arr[16];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  tint_array_wrapper indexable = {};
+  int x_69 = 0;
+  int x_69_phi = 0;
+  int x_72_phi = 0;
+  float4 const x_55 = *(tint_symbol_6);
+  float2 const x_58 = x_6.resolution;
+  float2 const x_59 = (float2(x_55.x, x_55.y) / x_58);
+  int const x_67 = (int((x_59.x * 10.0f)) + (int((x_59.y * 10.0f)) * 10));
+  x_69_phi = 100;
+  x_72_phi = 0;
+  while (true) {
+    int x_70 = 0;
+    int x_73 = 0;
+    x_69 = x_69_phi;
+    int const x_72 = x_72_phi;
+    if ((x_72 < x_67)) {
+    } else {
+      break;
+    }
+    {
+      x_70 = (((4 * as_type<int>(x_69)) * (1000 - as_type<int>(x_69))) / 1000);
+      x_73 = (x_72 + 1);
+      x_69_phi = x_70;
+      x_72_phi = x_73;
+    }
+  }
+  tint_array_wrapper const tint_symbol_4 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
+  indexable = tint_symbol_4;
+  float2 const x_80 = float2(float4(0.0f, 1.0f, 0.0f, 1.0f).y, float4(0.5f, 0.0f, 0.5f, 1.0f).x);
+  float4 const x_82 = indexable.arr[as_type<int>((x_69 % 16))];
+  *(tint_symbol_7) = x_82;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/2.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/2.wgsl.expected.spvasm
new file mode 100644
index 0000000..6899c03
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/2.wgsl.expected.spvasm
@@ -0,0 +1,183 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 121
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %indexable "indexable"
+               OpName %x_69 "x_69"
+               OpName %x_69_phi "x_69_phi"
+               OpName %x_72_phi "x_72_phi"
+               OpName %x_70 "x_70"
+               OpName %x_73 "x_73"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v4float_uint_16 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+         %24 = OpConstantNull %_arr_v4float_uint_16
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %28 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+   %float_10 = OpConstant %float 10
+     %int_10 = OpConstant %int 10
+    %int_100 = OpConstant %int 100
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_4 = OpConstant %int 4
+   %int_1000 = OpConstant %int 1000
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %81 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+  %float_0_5 = OpConstant %float 0.5
+         %83 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+         %84 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+         %85 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+         %86 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+         %87 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+         %88 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+         %89 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+         %90 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %91 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+         %92 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+         %93 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+         %94 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+         %95 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+         %96 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+         %97 = OpConstantComposite %_arr_v4float_uint_16 %81 %83 %84 %85 %86 %87 %88 %89 %81 %90 %91 %92 %93 %94 %95 %96
+     %int_16 = OpConstant %int 16
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+   %main_out = OpTypeStruct %v4float
+        %108 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_16 Function %24
+       %x_69 = OpVariable %_ptr_Function_int Function %28
+   %x_69_phi = OpVariable %_ptr_Function_int Function %28
+   %x_72_phi = OpVariable %_ptr_Function_int Function %28
+       %x_70 = OpVariable %_ptr_Function_int Function %28
+       %x_73 = OpVariable %_ptr_Function_int Function %28
+         %31 = OpLoad %v4float %gl_FragCoord
+         %34 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %35 = OpLoad %v2float %34
+         %36 = OpCompositeExtract %float %31 0
+         %37 = OpCompositeExtract %float %31 1
+         %38 = OpCompositeConstruct %v2float %36 %37
+         %39 = OpFDiv %v2float %38 %35
+         %41 = OpCompositeExtract %float %39 0
+         %43 = OpFMul %float %41 %float_10
+         %40 = OpConvertFToS %int %43
+         %45 = OpCompositeExtract %float %39 1
+         %46 = OpFMul %float %45 %float_10
+         %44 = OpConvertFToS %int %46
+         %48 = OpIMul %int %44 %int_10
+         %49 = OpIAdd %int %40 %48
+               OpStore %x_69_phi %int_100
+               OpStore %x_72_phi %int_0
+               OpBranch %52
+         %52 = OpLabel
+               OpLoopMerge %53 %54 None
+               OpBranch %55
+         %55 = OpLabel
+         %58 = OpLoad %int %x_69_phi
+               OpStore %x_69 %58
+         %59 = OpLoad %int %x_72_phi
+         %60 = OpSLessThan %bool %59 %49
+               OpSelectionMerge %62 None
+               OpBranchConditional %60 %63 %64
+         %63 = OpLabel
+               OpBranch %62
+         %64 = OpLabel
+               OpBranch %53
+         %62 = OpLabel
+               OpBranch %54
+         %54 = OpLabel
+         %67 = OpLoad %int %x_69
+         %66 = OpCopyObject %int %67
+         %68 = OpIMul %int %int_4 %66
+         %71 = OpLoad %int %x_69
+         %70 = OpCopyObject %int %71
+         %72 = OpISub %int %int_1000 %70
+         %73 = OpIMul %int %68 %72
+         %74 = OpSDiv %int %73 %int_1000
+               OpStore %x_70 %74
+         %76 = OpIAdd %int %59 %int_1
+               OpStore %x_73 %76
+         %77 = OpLoad %int %x_70
+               OpStore %x_69_phi %77
+         %78 = OpLoad %int %x_73
+               OpStore %x_72_phi %78
+               OpBranch %52
+         %53 = OpLabel
+               OpStore %indexable %97
+         %98 = OpCompositeExtract %float %91 1
+         %99 = OpCompositeExtract %float %87 0
+        %100 = OpCompositeConstruct %v2float %98 %99
+        %102 = OpLoad %int %x_69
+        %104 = OpSMod %int %102 %int_16
+        %101 = OpCopyObject %int %104
+        %106 = OpAccessChain %_ptr_Function_v4float %indexable %101
+        %107 = OpLoad %v4float %106
+               OpStore %x_GLF_color %107
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %108
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %112 = OpLabel
+        %113 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %113
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %115 = OpLabel
+        %116 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %116
+        %117 = OpFunctionCall %void %main_1
+        %119 = OpLoad %v4float %x_GLF_color
+        %120 = OpCompositeConstruct %main_out %119
+        %118 = OpFunctionCall %void %tint_symbol_3 %120
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/2.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/2.wgsl.expected.wgsl
new file mode 100644
index 0000000..088e3cd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bifurcation-Os-mutate-var-vector-shuffle/2.wgsl.expected.wgsl
@@ -0,0 +1,57 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var indexable : array<vec4<f32>, 16>;
+  var x_69 : i32;
+  var x_69_phi : i32;
+  var x_72_phi : i32;
+  let x_55 : vec4<f32> = gl_FragCoord;
+  let x_58 : vec2<f32> = x_6.resolution;
+  let x_59 : vec2<f32> = (vec2<f32>(x_55.x, x_55.y) / x_58);
+  let x_67 : i32 = (i32((x_59.x * 10.0)) + (i32((x_59.y * 10.0)) * 10));
+  x_69_phi = 100;
+  x_72_phi = 0;
+  loop {
+    var x_70 : i32;
+    var x_73 : i32;
+    x_69 = x_69_phi;
+    let x_72 : i32 = x_72_phi;
+    if ((x_72 < x_67)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_70 = (((4 * bitcast<i32>(x_69)) * (1000 - bitcast<i32>(x_69))) / 1000);
+      x_73 = (x_72 + 1);
+      x_69_phi = x_70;
+      x_72_phi = x_73;
+    }
+  }
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+  let x_80 : vec2<f32> = vec2<f32>(vec4<f32>(0.0, 1.0, 0.0, 1.0).y, vec4<f32>(0.5, 0.0, 0.5, 1.0).x);
+  let x_82 : vec4<f32> = indexable[bitcast<i32>((x_69 % 16))];
+  x_GLF_color = x_82;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/0.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/0.spvasm
new file mode 100644
index 0000000..ca63a27
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/0.spvasm
@@ -0,0 +1,248 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %checkSwap_f1_f1_ "checkSwap(f1;f1;"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "resolution"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %data "data"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %__0 ""
+               OpName %i_0 "i"
+               OpName %j "j"
+               OpName %doSwap "doSwap"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %temp "temp"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+       %bool = OpTypeBool
+         %25 = OpTypeFunction %bool %_ptr_Function_float %_ptr_Function_float
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_2 = OpConstant %float 2
+%_ptr_Function_bool = OpTypePointer Function %bool
+%_ptr_Function_int = OpTypePointer Function %int
+     %int_10 = OpConstant %int 10
+    %uint_10 = OpConstant %uint 10
+%_arr_float_uint_10 = OpTypeArray %float %uint_10
+%_ptr_Function__arr_float_uint_10 = OpTypePointer Function %_arr_float_uint_10
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_1 = OpConstant %int 1
+      %int_9 = OpConstant %int 9
+     %uint_0 = OpConstant %uint 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+   %float_10 = OpConstant %float 10
+      %int_5 = OpConstant %int 5
+    %float_1 = OpConstant %float 1
+       %main = OpFunction %void None %21
+         %51 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+       %data = OpVariable %_ptr_Function__arr_float_uint_10 Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+          %j = OpVariable %_ptr_Function_int Function
+     %doSwap = OpVariable %_ptr_Function_bool Function
+      %param = OpVariable %_ptr_Function_float Function
+    %param_0 = OpVariable %_ptr_Function_float Function
+       %temp = OpVariable %_ptr_Function_float Function
+               OpStore %i %int_0
+               OpBranch %52
+         %52 = OpLabel
+               OpLoopMerge %53 %54 None
+               OpBranch %55
+         %55 = OpLabel
+         %56 = OpLoad %int %i
+         %57 = OpSLessThan %bool %56 %int_10
+               OpBranchConditional %57 %58 %53
+         %58 = OpLabel
+         %59 = OpLoad %int %i
+         %60 = OpLoad %int %i
+         %61 = OpISub %int %int_10 %60
+         %62 = OpConvertSToF %float %61
+         %63 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %uint_1
+         %64 = OpLoad %float %63
+         %65 = OpFMul %float %62 %64
+         %66 = OpAccessChain %_ptr_Function_float %data %59
+               OpStore %66 %65
+               OpBranch %54
+         %54 = OpLabel
+         %67 = OpLoad %int %i
+         %68 = OpIAdd %int %67 %int_1
+               OpStore %i %68
+               OpBranch %52
+         %53 = OpLabel
+               OpStore %i_0 %int_0
+               OpBranch %69
+         %69 = OpLabel
+               OpLoopMerge %70 %71 None
+               OpBranch %72
+         %72 = OpLabel
+         %73 = OpLoad %int %i_0
+         %74 = OpSLessThan %bool %73 %int_9
+               OpBranchConditional %74 %75 %70
+         %75 = OpLabel
+               OpStore %j %int_0
+               OpBranch %76
+         %76 = OpLabel
+               OpLoopMerge %77 %78 None
+               OpBranch %79
+         %79 = OpLabel
+         %80 = OpLoad %int %j
+         %81 = OpSLessThan %bool %80 %int_10
+               OpBranchConditional %81 %82 %77
+         %82 = OpLabel
+         %83 = OpLoad %int %j
+         %84 = OpLoad %int %i_0
+         %85 = OpIAdd %int %84 %int_1
+         %86 = OpSLessThan %bool %83 %85
+               OpSelectionMerge %87 None
+               OpBranchConditional %86 %88 %87
+         %88 = OpLabel
+               OpBranch %78
+         %87 = OpLabel
+         %89 = OpLoad %int %i_0
+         %90 = OpLoad %int %j
+         %91 = OpAccessChain %_ptr_Function_float %data %89
+         %92 = OpLoad %float %91
+               OpStore %param %92
+         %93 = OpAccessChain %_ptr_Function_float %data %90
+         %94 = OpLoad %float %93
+               OpStore %param_0 %94
+         %95 = OpFunctionCall %bool %checkSwap_f1_f1_ %param %param_0
+               OpStore %doSwap %95
+         %96 = OpLoad %bool %doSwap
+               OpSelectionMerge %97 None
+               OpBranchConditional %96 %98 %97
+         %98 = OpLabel
+         %99 = OpLoad %int %i_0
+        %100 = OpAccessChain %_ptr_Function_float %data %99
+        %101 = OpLoad %float %100
+               OpStore %temp %101
+        %102 = OpLoad %int %i_0
+        %103 = OpLoad %int %j
+        %104 = OpAccessChain %_ptr_Function_float %data %103
+        %105 = OpLoad %float %104
+        %106 = OpAccessChain %_ptr_Function_float %data %102
+               OpStore %106 %105
+        %107 = OpLoad %int %j
+        %108 = OpLoad %float %temp
+        %109 = OpAccessChain %_ptr_Function_float %data %107
+               OpStore %109 %108
+               OpBranch %97
+         %97 = OpLabel
+               OpBranch %78
+         %78 = OpLabel
+        %110 = OpLoad %int %j
+        %111 = OpIAdd %int %110 %int_1
+               OpStore %j %111
+               OpBranch %76
+         %77 = OpLabel
+               OpBranch %71
+         %71 = OpLabel
+        %112 = OpLoad %int %i_0
+        %113 = OpIAdd %int %112 %int_1
+               OpStore %i_0 %113
+               OpBranch %69
+         %70 = OpLabel
+        %114 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+        %115 = OpLoad %float %114
+        %116 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+        %117 = OpLoad %float %116
+        %118 = OpFDiv %float %117 %float_2
+        %119 = OpFOrdLessThan %bool %115 %118
+               OpSelectionMerge %120 None
+               OpBranchConditional %119 %121 %122
+        %121 = OpLabel
+        %123 = OpAccessChain %_ptr_Function_float %data %int_0
+        %124 = OpLoad %float %123
+        %125 = OpFDiv %float %124 %float_10
+        %126 = OpAccessChain %_ptr_Function_float %data %int_5
+        %127 = OpLoad %float %126
+        %128 = OpFDiv %float %127 %float_10
+        %129 = OpAccessChain %_ptr_Function_float %data %int_9
+        %130 = OpLoad %float %129
+        %131 = OpFDiv %float %130 %float_10
+        %132 = OpCompositeConstruct %v4float %125 %128 %131 %float_1
+               OpStore %_GLF_color %132
+               OpBranch %120
+        %122 = OpLabel
+        %133 = OpAccessChain %_ptr_Function_float %data %int_5
+        %134 = OpLoad %float %133
+        %135 = OpFDiv %float %134 %float_10
+        %136 = OpAccessChain %_ptr_Function_float %data %int_9
+        %137 = OpLoad %float %136
+        %138 = OpFDiv %float %137 %float_10
+        %139 = OpAccessChain %_ptr_Function_float %data %int_0
+        %140 = OpLoad %float %139
+        %141 = OpFDiv %float %140 %float_10
+        %142 = OpCompositeConstruct %v4float %135 %138 %141 %float_1
+               OpStore %_GLF_color %142
+               OpBranch %120
+        %120 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%checkSwap_f1_f1_ = OpFunction %bool None %25
+          %a = OpFunctionParameter %_ptr_Function_float
+          %b = OpFunctionParameter %_ptr_Function_float
+        %143 = OpLabel
+        %144 = OpVariable %_ptr_Function_bool Function
+        %145 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %146 = OpLoad %float %145
+        %147 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+        %148 = OpLoad %float %147
+        %149 = OpFDiv %float %148 %float_2
+        %150 = OpFOrdLessThan %bool %146 %149
+               OpSelectionMerge %151 None
+               OpBranchConditional %150 %152 %153
+        %152 = OpLabel
+        %154 = OpLoad %float %a
+        %155 = OpLoad %float %b
+        %156 = OpFOrdGreaterThan %bool %154 %155
+               OpStore %144 %156
+               OpBranch %151
+        %153 = OpLabel
+        %157 = OpLoad %float %a
+        %158 = OpLoad %float %b
+        %159 = OpFOrdLessThan %bool %157 %158
+               OpStore %144 %159
+               OpBranch %151
+        %151 = OpLabel
+        %160 = OpLoad %bool %144
+               OpReturnValue %160
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..5ff3989
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/0.spvasm.expected.hlsl
@@ -0,0 +1,105 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_9 : register(b1, space0) {
+  uint4 x_9[1];
+};
+cbuffer cbuffer_x_13 : register(b0, space0) {
+  uint4 x_13[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+bool checkSwap_f1_f1_(inout float a, inout float b) {
+  bool x_144 = false;
+  const float x_146 = gl_FragCoord.y;
+  const float x_148 = asfloat(x_9[0].y);
+  if ((x_146 < (x_148 / 2.0f))) {
+    const float x_154 = a;
+    const float x_155 = b;
+    x_144 = (x_154 > x_155);
+  } else {
+    const float x_157 = a;
+    const float x_158 = b;
+    x_144 = (x_157 < x_158);
+  }
+  return x_144;
+}
+
+void main_1() {
+  int i = 0;
+  float data[10] = (float[10])0;
+  int i_1 = 0;
+  int j = 0;
+  bool doSwap = false;
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  float temp = 0.0f;
+  i = 0;
+  {
+    for(; (i < 10); i = (i + 1)) {
+      const int x_59 = i;
+      const int x_60 = i;
+      const float x_64 = asfloat(x_13[0].y);
+      data[x_59] = (float((10 - x_60)) * x_64);
+    }
+  }
+  i_1 = 0;
+  {
+    for(; (i_1 < 9); i_1 = (i_1 + 1)) {
+      j = 0;
+      {
+        for(; (j < 10); j = (j + 1)) {
+          if ((j < (i_1 + 1))) {
+            continue;
+          }
+          const int x_90 = j;
+          const float x_92 = data[i_1];
+          param = x_92;
+          const float x_94 = data[x_90];
+          param_1 = x_94;
+          const bool x_95 = checkSwap_f1_f1_(param, param_1);
+          doSwap = x_95;
+          if (doSwap) {
+            const float x_101 = data[i_1];
+            temp = x_101;
+            const int x_102 = i_1;
+            const float x_105 = data[j];
+            data[x_102] = x_105;
+            data[j] = temp;
+          }
+        }
+      }
+    }
+  }
+  const float x_115 = gl_FragCoord.x;
+  const float x_117 = asfloat(x_9[0].x);
+  if ((x_115 < (x_117 / 2.0f))) {
+    const float x_124 = data[0];
+    const float x_127 = data[5];
+    const float x_130 = data[9];
+    x_GLF_color = float4((x_124 / 10.0f), (x_127 / 10.0f), (x_130 / 10.0f), 1.0f);
+  } else {
+    const float x_134 = data[5];
+    const float x_137 = data[9];
+    const float x_140 = data[0];
+    x_GLF_color = float4((x_134 / 10.0f), (x_137 / 10.0f), (x_140 / 10.0f), 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/0.spvasm.expected.msl
new file mode 100644
index 0000000..08dcf56
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/0.spvasm.expected.msl
@@ -0,0 +1,141 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf1 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  float arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+bool checkSwap_f1_f1_(constant buf1& x_9, thread float* const a, thread float* const b, thread float4* const tint_symbol_5) {
+  bool x_144 = false;
+  float const x_146 = (*(tint_symbol_5)).y;
+  float const x_148 = x_9.resolution.y;
+  if ((x_146 < (x_148 / 2.0f))) {
+    float const x_154 = *(a);
+    float const x_155 = *(b);
+    x_144 = (x_154 > x_155);
+  } else {
+    float const x_157 = *(a);
+    float const x_158 = *(b);
+    x_144 = (x_157 < x_158);
+  }
+  bool const x_160 = x_144;
+  return x_160;
+}
+
+void main_1(constant buf0& x_13, constant buf1& x_9, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  int i = 0;
+  tint_array_wrapper data = {};
+  int i_1 = 0;
+  int j = 0;
+  bool doSwap = false;
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  float temp = 0.0f;
+  i = 0;
+  while (true) {
+    int const x_56 = i;
+    if ((x_56 < 10)) {
+    } else {
+      break;
+    }
+    int const x_59 = i;
+    int const x_60 = i;
+    float const x_64 = x_13.injectionSwitch.y;
+    data.arr[x_59] = (float((10 - x_60)) * x_64);
+    {
+      int const x_67 = i;
+      i = (x_67 + 1);
+    }
+  }
+  i_1 = 0;
+  while (true) {
+    int const x_73 = i_1;
+    if ((x_73 < 9)) {
+    } else {
+      break;
+    }
+    j = 0;
+    while (true) {
+      int const x_80 = j;
+      if ((x_80 < 10)) {
+      } else {
+        break;
+      }
+      int const x_83 = j;
+      int const x_84 = i_1;
+      if ((x_83 < (x_84 + 1))) {
+        {
+          int const x_110 = j;
+          j = (x_110 + 1);
+        }
+        continue;
+      }
+      int const x_89 = i_1;
+      int const x_90 = j;
+      float const x_92 = data.arr[x_89];
+      param = x_92;
+      float const x_94 = data.arr[x_90];
+      param_1 = x_94;
+      bool const x_95 = checkSwap_f1_f1_(x_9, &(param), &(param_1), tint_symbol_6);
+      doSwap = x_95;
+      bool const x_96 = doSwap;
+      if (x_96) {
+        int const x_99 = i_1;
+        float const x_101 = data.arr[x_99];
+        temp = x_101;
+        int const x_102 = i_1;
+        int const x_103 = j;
+        float const x_105 = data.arr[x_103];
+        data.arr[x_102] = x_105;
+        int const x_107 = j;
+        float const x_108 = temp;
+        data.arr[x_107] = x_108;
+      }
+      {
+        int const x_110 = j;
+        j = (x_110 + 1);
+      }
+    }
+    {
+      int const x_112 = i_1;
+      i_1 = (x_112 + 1);
+    }
+  }
+  float const x_115 = (*(tint_symbol_6)).x;
+  float const x_117 = x_9.resolution.x;
+  if ((x_115 < (x_117 / 2.0f))) {
+    float const x_124 = data.arr[0];
+    float const x_127 = data.arr[5];
+    float const x_130 = data.arr[9];
+    *(tint_symbol_7) = float4((x_124 / 10.0f), (x_127 / 10.0f), (x_130 / 10.0f), 1.0f);
+  } else {
+    float const x_134 = data.arr[5];
+    float const x_137 = data.arr[9];
+    float const x_140 = data.arr[0];
+    *(tint_symbol_7) = float4((x_134 / 10.0f), (x_137 / 10.0f), (x_140 / 10.0f), 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_13 [[buffer(0)]], constant buf1& x_9 [[buffer(1)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_13, x_9, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..d4767b3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/0.spvasm.expected.spvasm
@@ -0,0 +1,305 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 193
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "resolution"
+               OpName %x_9 "x_9"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_13 "x_13"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %checkSwap_f1_f1_ "checkSwap_f1_f1_"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %x_144 "x_144"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %data "data"
+               OpName %i_1 "i_1"
+               OpName %j "j"
+               OpName %doSwap "doSwap"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %temp "temp"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_13 NonWritable
+               OpDecorate %x_13 DescriptorSet 0
+               OpDecorate %x_13 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_float_uint_10 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_9 = OpVariable %_ptr_Uniform_buf1 Uniform
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_13 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %bool = OpTypeBool
+%_ptr_Function_float = OpTypePointer Function %float
+         %18 = OpTypeFunction %bool %_ptr_Function_float %_ptr_Function_float
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %27 = OpConstantNull %bool
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_2 = OpConstant %float 2
+       %void = OpTypeVoid
+         %54 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %61 = OpConstantNull %int
+    %uint_10 = OpConstant %uint 10
+%_arr_float_uint_10 = OpTypeArray %float %uint_10
+%_ptr_Function__arr_float_uint_10 = OpTypePointer Function %_arr_float_uint_10
+         %66 = OpConstantNull %_arr_float_uint_10
+         %71 = OpConstantNull %float
+      %int_0 = OpConstant %int 0
+     %int_10 = OpConstant %int 10
+      %int_1 = OpConstant %int 1
+      %int_9 = OpConstant %int 9
+      %int_5 = OpConstant %int 5
+   %float_10 = OpConstant %float 10
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %180 = OpTypeFunction %void %main_out
+%checkSwap_f1_f1_ = OpFunction %bool None %18
+          %a = OpFunctionParameter %_ptr_Function_float
+          %b = OpFunctionParameter %_ptr_Function_float
+         %24 = OpLabel
+      %x_144 = OpVariable %_ptr_Function_bool Function %27
+         %31 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %32 = OpLoad %float %31
+         %35 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_1
+         %36 = OpLoad %float %35
+         %38 = OpFDiv %float %36 %float_2
+         %39 = OpFOrdLessThan %bool %32 %38
+               OpSelectionMerge %40 None
+               OpBranchConditional %39 %41 %42
+         %41 = OpLabel
+         %44 = OpLoad %float %a
+         %46 = OpLoad %float %b
+         %47 = OpFOrdGreaterThan %bool %44 %46
+               OpStore %x_144 %47
+               OpBranch %40
+         %42 = OpLabel
+         %49 = OpLoad %float %a
+         %51 = OpLoad %float %b
+         %52 = OpFOrdLessThan %bool %49 %51
+               OpStore %x_144 %52
+               OpBranch %40
+         %40 = OpLabel
+         %53 = OpLoad %bool %x_144
+               OpReturnValue %53
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %54
+         %57 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %61
+       %data = OpVariable %_ptr_Function__arr_float_uint_10 Function %66
+        %i_1 = OpVariable %_ptr_Function_int Function %61
+          %j = OpVariable %_ptr_Function_int Function %61
+     %doSwap = OpVariable %_ptr_Function_bool Function %27
+      %param = OpVariable %_ptr_Function_float Function %71
+    %param_1 = OpVariable %_ptr_Function_float Function %71
+       %temp = OpVariable %_ptr_Function_float Function %71
+               OpStore %i %int_0
+               OpBranch %75
+         %75 = OpLabel
+               OpLoopMerge %76 %77 None
+               OpBranch %78
+         %78 = OpLabel
+         %79 = OpLoad %int %i
+         %81 = OpSLessThan %bool %79 %int_10
+               OpSelectionMerge %82 None
+               OpBranchConditional %81 %83 %84
+         %83 = OpLabel
+               OpBranch %82
+         %84 = OpLabel
+               OpBranch %76
+         %82 = OpLabel
+         %85 = OpLoad %int %i
+         %86 = OpLoad %int %i
+         %87 = OpAccessChain %_ptr_Uniform_float %x_13 %uint_0 %uint_1
+         %88 = OpLoad %float %87
+         %89 = OpAccessChain %_ptr_Function_float %data %85
+         %91 = OpISub %int %int_10 %86
+         %90 = OpConvertSToF %float %91
+         %92 = OpFMul %float %90 %88
+               OpStore %89 %92
+               OpBranch %77
+         %77 = OpLabel
+         %93 = OpLoad %int %i
+         %95 = OpIAdd %int %93 %int_1
+               OpStore %i %95
+               OpBranch %75
+         %76 = OpLabel
+               OpStore %i_1 %int_0
+               OpBranch %96
+         %96 = OpLabel
+               OpLoopMerge %97 %98 None
+               OpBranch %99
+         %99 = OpLabel
+        %100 = OpLoad %int %i_1
+        %102 = OpSLessThan %bool %100 %int_9
+               OpSelectionMerge %103 None
+               OpBranchConditional %102 %104 %105
+        %104 = OpLabel
+               OpBranch %103
+        %105 = OpLabel
+               OpBranch %97
+        %103 = OpLabel
+               OpStore %j %int_0
+               OpBranch %106
+        %106 = OpLabel
+               OpLoopMerge %107 %108 None
+               OpBranch %109
+        %109 = OpLabel
+        %110 = OpLoad %int %j
+        %111 = OpSLessThan %bool %110 %int_10
+               OpSelectionMerge %112 None
+               OpBranchConditional %111 %113 %114
+        %113 = OpLabel
+               OpBranch %112
+        %114 = OpLabel
+               OpBranch %107
+        %112 = OpLabel
+        %115 = OpLoad %int %j
+        %116 = OpLoad %int %i_1
+        %117 = OpIAdd %int %116 %int_1
+        %118 = OpSLessThan %bool %115 %117
+               OpSelectionMerge %119 None
+               OpBranchConditional %118 %120 %119
+        %120 = OpLabel
+               OpBranch %108
+        %119 = OpLabel
+        %121 = OpLoad %int %i_1
+        %122 = OpLoad %int %j
+        %123 = OpAccessChain %_ptr_Function_float %data %121
+        %124 = OpLoad %float %123
+               OpStore %param %124
+        %125 = OpAccessChain %_ptr_Function_float %data %122
+        %126 = OpLoad %float %125
+               OpStore %param_1 %126
+        %127 = OpFunctionCall %bool %checkSwap_f1_f1_ %param %param_1
+               OpStore %doSwap %127
+        %130 = OpLoad %bool %doSwap
+               OpSelectionMerge %131 None
+               OpBranchConditional %130 %132 %131
+        %132 = OpLabel
+        %133 = OpLoad %int %i_1
+        %134 = OpAccessChain %_ptr_Function_float %data %133
+        %135 = OpLoad %float %134
+               OpStore %temp %135
+        %136 = OpLoad %int %i_1
+        %137 = OpLoad %int %j
+        %138 = OpAccessChain %_ptr_Function_float %data %137
+        %139 = OpLoad %float %138
+        %140 = OpAccessChain %_ptr_Function_float %data %136
+               OpStore %140 %139
+        %141 = OpLoad %int %j
+        %142 = OpLoad %float %temp
+        %143 = OpAccessChain %_ptr_Function_float %data %141
+               OpStore %143 %142
+               OpBranch %131
+        %131 = OpLabel
+               OpBranch %108
+        %108 = OpLabel
+        %144 = OpLoad %int %j
+        %145 = OpIAdd %int %144 %int_1
+               OpStore %j %145
+               OpBranch %106
+        %107 = OpLabel
+               OpBranch %98
+         %98 = OpLabel
+        %146 = OpLoad %int %i_1
+        %147 = OpIAdd %int %146 %int_1
+               OpStore %i_1 %147
+               OpBranch %96
+         %97 = OpLabel
+        %148 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+        %149 = OpLoad %float %148
+        %150 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_0
+        %151 = OpLoad %float %150
+        %152 = OpFDiv %float %151 %float_2
+        %153 = OpFOrdLessThan %bool %149 %152
+               OpSelectionMerge %154 None
+               OpBranchConditional %153 %155 %156
+        %155 = OpLabel
+        %157 = OpAccessChain %_ptr_Function_float %data %int_0
+        %158 = OpLoad %float %157
+        %160 = OpAccessChain %_ptr_Function_float %data %int_5
+        %161 = OpLoad %float %160
+        %162 = OpAccessChain %_ptr_Function_float %data %int_9
+        %163 = OpLoad %float %162
+        %165 = OpFDiv %float %158 %float_10
+        %166 = OpFDiv %float %161 %float_10
+        %167 = OpFDiv %float %163 %float_10
+        %169 = OpCompositeConstruct %v4float %165 %166 %167 %float_1
+               OpStore %x_GLF_color %169
+               OpBranch %154
+        %156 = OpLabel
+        %170 = OpAccessChain %_ptr_Function_float %data %int_5
+        %171 = OpLoad %float %170
+        %172 = OpAccessChain %_ptr_Function_float %data %int_9
+        %173 = OpLoad %float %172
+        %174 = OpAccessChain %_ptr_Function_float %data %int_0
+        %175 = OpLoad %float %174
+        %176 = OpFDiv %float %171 %float_10
+        %177 = OpFDiv %float %173 %float_10
+        %178 = OpFDiv %float %175 %float_10
+        %179 = OpCompositeConstruct %v4float %176 %177 %178 %float_1
+               OpStore %x_GLF_color %179
+               OpBranch %154
+        %154 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %180
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %184 = OpLabel
+        %185 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %185
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %54
+        %187 = OpLabel
+        %188 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %188
+        %189 = OpFunctionCall %void %main_1
+        %191 = OpLoad %v4float %x_GLF_color
+        %192 = OpCompositeConstruct %main_out %191
+        %190 = OpFunctionCall %void %tint_symbol_3 %192
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..9074163
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/0.spvasm.expected.wgsl
@@ -0,0 +1,140 @@
+[[block]]
+struct buf1 {
+  resolution : vec2<f32>;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_13 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn checkSwap_f1_f1_(a : ptr<function, f32>, b : ptr<function, f32>) -> bool {
+  var x_144 : bool;
+  let x_146 : f32 = gl_FragCoord.y;
+  let x_148 : f32 = x_9.resolution.y;
+  if ((x_146 < (x_148 / 2.0))) {
+    let x_154 : f32 = *(a);
+    let x_155 : f32 = *(b);
+    x_144 = (x_154 > x_155);
+  } else {
+    let x_157 : f32 = *(a);
+    let x_158 : f32 = *(b);
+    x_144 = (x_157 < x_158);
+  }
+  let x_160 : bool = x_144;
+  return x_160;
+}
+
+fn main_1() {
+  var i : i32;
+  var data : array<f32, 10>;
+  var i_1 : i32;
+  var j : i32;
+  var doSwap : bool;
+  var param : f32;
+  var param_1 : f32;
+  var temp : f32;
+  i = 0;
+  loop {
+    let x_56 : i32 = i;
+    if ((x_56 < 10)) {
+    } else {
+      break;
+    }
+    let x_59 : i32 = i;
+    let x_60 : i32 = i;
+    let x_64 : f32 = x_13.injectionSwitch.y;
+    data[x_59] = (f32((10 - x_60)) * x_64);
+
+    continuing {
+      let x_67 : i32 = i;
+      i = (x_67 + 1);
+    }
+  }
+  i_1 = 0;
+  loop {
+    let x_73 : i32 = i_1;
+    if ((x_73 < 9)) {
+    } else {
+      break;
+    }
+    j = 0;
+    loop {
+      let x_80 : i32 = j;
+      if ((x_80 < 10)) {
+      } else {
+        break;
+      }
+      let x_83 : i32 = j;
+      let x_84 : i32 = i_1;
+      if ((x_83 < (x_84 + 1))) {
+        continue;
+      }
+      let x_89 : i32 = i_1;
+      let x_90 : i32 = j;
+      let x_92 : f32 = data[x_89];
+      param = x_92;
+      let x_94 : f32 = data[x_90];
+      param_1 = x_94;
+      let x_95 : bool = checkSwap_f1_f1_(&(param), &(param_1));
+      doSwap = x_95;
+      let x_96 : bool = doSwap;
+      if (x_96) {
+        let x_99 : i32 = i_1;
+        let x_101 : f32 = data[x_99];
+        temp = x_101;
+        let x_102 : i32 = i_1;
+        let x_103 : i32 = j;
+        let x_105 : f32 = data[x_103];
+        data[x_102] = x_105;
+        let x_107 : i32 = j;
+        let x_108 : f32 = temp;
+        data[x_107] = x_108;
+      }
+
+      continuing {
+        let x_110 : i32 = j;
+        j = (x_110 + 1);
+      }
+    }
+
+    continuing {
+      let x_112 : i32 = i_1;
+      i_1 = (x_112 + 1);
+    }
+  }
+  let x_115 : f32 = gl_FragCoord.x;
+  let x_117 : f32 = x_9.resolution.x;
+  if ((x_115 < (x_117 / 2.0))) {
+    let x_124 : f32 = data[0];
+    let x_127 : f32 = data[5];
+    let x_130 : f32 = data[9];
+    x_GLF_color = vec4<f32>((x_124 / 10.0), (x_127 / 10.0), (x_130 / 10.0), 1.0);
+  } else {
+    let x_134 : f32 = data[5];
+    let x_137 : f32 = data[9];
+    let x_140 : f32 = data[0];
+    x_GLF_color = vec4<f32>((x_134 / 10.0), (x_137 / 10.0), (x_140 / 10.0), 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/0.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/0.wgsl
new file mode 100644
index 0000000..9074163
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/0.wgsl
@@ -0,0 +1,140 @@
+[[block]]
+struct buf1 {
+  resolution : vec2<f32>;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_13 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn checkSwap_f1_f1_(a : ptr<function, f32>, b : ptr<function, f32>) -> bool {
+  var x_144 : bool;
+  let x_146 : f32 = gl_FragCoord.y;
+  let x_148 : f32 = x_9.resolution.y;
+  if ((x_146 < (x_148 / 2.0))) {
+    let x_154 : f32 = *(a);
+    let x_155 : f32 = *(b);
+    x_144 = (x_154 > x_155);
+  } else {
+    let x_157 : f32 = *(a);
+    let x_158 : f32 = *(b);
+    x_144 = (x_157 < x_158);
+  }
+  let x_160 : bool = x_144;
+  return x_160;
+}
+
+fn main_1() {
+  var i : i32;
+  var data : array<f32, 10>;
+  var i_1 : i32;
+  var j : i32;
+  var doSwap : bool;
+  var param : f32;
+  var param_1 : f32;
+  var temp : f32;
+  i = 0;
+  loop {
+    let x_56 : i32 = i;
+    if ((x_56 < 10)) {
+    } else {
+      break;
+    }
+    let x_59 : i32 = i;
+    let x_60 : i32 = i;
+    let x_64 : f32 = x_13.injectionSwitch.y;
+    data[x_59] = (f32((10 - x_60)) * x_64);
+
+    continuing {
+      let x_67 : i32 = i;
+      i = (x_67 + 1);
+    }
+  }
+  i_1 = 0;
+  loop {
+    let x_73 : i32 = i_1;
+    if ((x_73 < 9)) {
+    } else {
+      break;
+    }
+    j = 0;
+    loop {
+      let x_80 : i32 = j;
+      if ((x_80 < 10)) {
+      } else {
+        break;
+      }
+      let x_83 : i32 = j;
+      let x_84 : i32 = i_1;
+      if ((x_83 < (x_84 + 1))) {
+        continue;
+      }
+      let x_89 : i32 = i_1;
+      let x_90 : i32 = j;
+      let x_92 : f32 = data[x_89];
+      param = x_92;
+      let x_94 : f32 = data[x_90];
+      param_1 = x_94;
+      let x_95 : bool = checkSwap_f1_f1_(&(param), &(param_1));
+      doSwap = x_95;
+      let x_96 : bool = doSwap;
+      if (x_96) {
+        let x_99 : i32 = i_1;
+        let x_101 : f32 = data[x_99];
+        temp = x_101;
+        let x_102 : i32 = i_1;
+        let x_103 : i32 = j;
+        let x_105 : f32 = data[x_103];
+        data[x_102] = x_105;
+        let x_107 : i32 = j;
+        let x_108 : f32 = temp;
+        data[x_107] = x_108;
+      }
+
+      continuing {
+        let x_110 : i32 = j;
+        j = (x_110 + 1);
+      }
+    }
+
+    continuing {
+      let x_112 : i32 = i_1;
+      i_1 = (x_112 + 1);
+    }
+  }
+  let x_115 : f32 = gl_FragCoord.x;
+  let x_117 : f32 = x_9.resolution.x;
+  if ((x_115 < (x_117 / 2.0))) {
+    let x_124 : f32 = data[0];
+    let x_127 : f32 = data[5];
+    let x_130 : f32 = data[9];
+    x_GLF_color = vec4<f32>((x_124 / 10.0), (x_127 / 10.0), (x_130 / 10.0), 1.0);
+  } else {
+    let x_134 : f32 = data[5];
+    let x_137 : f32 = data[9];
+    let x_140 : f32 = data[0];
+    x_GLF_color = vec4<f32>((x_134 / 10.0), (x_137 / 10.0), (x_140 / 10.0), 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..5ff3989
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/0.wgsl.expected.hlsl
@@ -0,0 +1,105 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_9 : register(b1, space0) {
+  uint4 x_9[1];
+};
+cbuffer cbuffer_x_13 : register(b0, space0) {
+  uint4 x_13[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+bool checkSwap_f1_f1_(inout float a, inout float b) {
+  bool x_144 = false;
+  const float x_146 = gl_FragCoord.y;
+  const float x_148 = asfloat(x_9[0].y);
+  if ((x_146 < (x_148 / 2.0f))) {
+    const float x_154 = a;
+    const float x_155 = b;
+    x_144 = (x_154 > x_155);
+  } else {
+    const float x_157 = a;
+    const float x_158 = b;
+    x_144 = (x_157 < x_158);
+  }
+  return x_144;
+}
+
+void main_1() {
+  int i = 0;
+  float data[10] = (float[10])0;
+  int i_1 = 0;
+  int j = 0;
+  bool doSwap = false;
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  float temp = 0.0f;
+  i = 0;
+  {
+    for(; (i < 10); i = (i + 1)) {
+      const int x_59 = i;
+      const int x_60 = i;
+      const float x_64 = asfloat(x_13[0].y);
+      data[x_59] = (float((10 - x_60)) * x_64);
+    }
+  }
+  i_1 = 0;
+  {
+    for(; (i_1 < 9); i_1 = (i_1 + 1)) {
+      j = 0;
+      {
+        for(; (j < 10); j = (j + 1)) {
+          if ((j < (i_1 + 1))) {
+            continue;
+          }
+          const int x_90 = j;
+          const float x_92 = data[i_1];
+          param = x_92;
+          const float x_94 = data[x_90];
+          param_1 = x_94;
+          const bool x_95 = checkSwap_f1_f1_(param, param_1);
+          doSwap = x_95;
+          if (doSwap) {
+            const float x_101 = data[i_1];
+            temp = x_101;
+            const int x_102 = i_1;
+            const float x_105 = data[j];
+            data[x_102] = x_105;
+            data[j] = temp;
+          }
+        }
+      }
+    }
+  }
+  const float x_115 = gl_FragCoord.x;
+  const float x_117 = asfloat(x_9[0].x);
+  if ((x_115 < (x_117 / 2.0f))) {
+    const float x_124 = data[0];
+    const float x_127 = data[5];
+    const float x_130 = data[9];
+    x_GLF_color = float4((x_124 / 10.0f), (x_127 / 10.0f), (x_130 / 10.0f), 1.0f);
+  } else {
+    const float x_134 = data[5];
+    const float x_137 = data[9];
+    const float x_140 = data[0];
+    x_GLF_color = float4((x_134 / 10.0f), (x_137 / 10.0f), (x_140 / 10.0f), 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/0.wgsl.expected.msl
new file mode 100644
index 0000000..08dcf56
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/0.wgsl.expected.msl
@@ -0,0 +1,141 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf1 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  float arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+bool checkSwap_f1_f1_(constant buf1& x_9, thread float* const a, thread float* const b, thread float4* const tint_symbol_5) {
+  bool x_144 = false;
+  float const x_146 = (*(tint_symbol_5)).y;
+  float const x_148 = x_9.resolution.y;
+  if ((x_146 < (x_148 / 2.0f))) {
+    float const x_154 = *(a);
+    float const x_155 = *(b);
+    x_144 = (x_154 > x_155);
+  } else {
+    float const x_157 = *(a);
+    float const x_158 = *(b);
+    x_144 = (x_157 < x_158);
+  }
+  bool const x_160 = x_144;
+  return x_160;
+}
+
+void main_1(constant buf0& x_13, constant buf1& x_9, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  int i = 0;
+  tint_array_wrapper data = {};
+  int i_1 = 0;
+  int j = 0;
+  bool doSwap = false;
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  float temp = 0.0f;
+  i = 0;
+  while (true) {
+    int const x_56 = i;
+    if ((x_56 < 10)) {
+    } else {
+      break;
+    }
+    int const x_59 = i;
+    int const x_60 = i;
+    float const x_64 = x_13.injectionSwitch.y;
+    data.arr[x_59] = (float((10 - x_60)) * x_64);
+    {
+      int const x_67 = i;
+      i = (x_67 + 1);
+    }
+  }
+  i_1 = 0;
+  while (true) {
+    int const x_73 = i_1;
+    if ((x_73 < 9)) {
+    } else {
+      break;
+    }
+    j = 0;
+    while (true) {
+      int const x_80 = j;
+      if ((x_80 < 10)) {
+      } else {
+        break;
+      }
+      int const x_83 = j;
+      int const x_84 = i_1;
+      if ((x_83 < (x_84 + 1))) {
+        {
+          int const x_110 = j;
+          j = (x_110 + 1);
+        }
+        continue;
+      }
+      int const x_89 = i_1;
+      int const x_90 = j;
+      float const x_92 = data.arr[x_89];
+      param = x_92;
+      float const x_94 = data.arr[x_90];
+      param_1 = x_94;
+      bool const x_95 = checkSwap_f1_f1_(x_9, &(param), &(param_1), tint_symbol_6);
+      doSwap = x_95;
+      bool const x_96 = doSwap;
+      if (x_96) {
+        int const x_99 = i_1;
+        float const x_101 = data.arr[x_99];
+        temp = x_101;
+        int const x_102 = i_1;
+        int const x_103 = j;
+        float const x_105 = data.arr[x_103];
+        data.arr[x_102] = x_105;
+        int const x_107 = j;
+        float const x_108 = temp;
+        data.arr[x_107] = x_108;
+      }
+      {
+        int const x_110 = j;
+        j = (x_110 + 1);
+      }
+    }
+    {
+      int const x_112 = i_1;
+      i_1 = (x_112 + 1);
+    }
+  }
+  float const x_115 = (*(tint_symbol_6)).x;
+  float const x_117 = x_9.resolution.x;
+  if ((x_115 < (x_117 / 2.0f))) {
+    float const x_124 = data.arr[0];
+    float const x_127 = data.arr[5];
+    float const x_130 = data.arr[9];
+    *(tint_symbol_7) = float4((x_124 / 10.0f), (x_127 / 10.0f), (x_130 / 10.0f), 1.0f);
+  } else {
+    float const x_134 = data.arr[5];
+    float const x_137 = data.arr[9];
+    float const x_140 = data.arr[0];
+    *(tint_symbol_7) = float4((x_134 / 10.0f), (x_137 / 10.0f), (x_140 / 10.0f), 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_13 [[buffer(0)]], constant buf1& x_9 [[buffer(1)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_13, x_9, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..d4767b3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/0.wgsl.expected.spvasm
@@ -0,0 +1,305 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 193
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "resolution"
+               OpName %x_9 "x_9"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_13 "x_13"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %checkSwap_f1_f1_ "checkSwap_f1_f1_"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %x_144 "x_144"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %data "data"
+               OpName %i_1 "i_1"
+               OpName %j "j"
+               OpName %doSwap "doSwap"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %temp "temp"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_13 NonWritable
+               OpDecorate %x_13 DescriptorSet 0
+               OpDecorate %x_13 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_float_uint_10 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_9 = OpVariable %_ptr_Uniform_buf1 Uniform
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_13 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %bool = OpTypeBool
+%_ptr_Function_float = OpTypePointer Function %float
+         %18 = OpTypeFunction %bool %_ptr_Function_float %_ptr_Function_float
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %27 = OpConstantNull %bool
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_2 = OpConstant %float 2
+       %void = OpTypeVoid
+         %54 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %61 = OpConstantNull %int
+    %uint_10 = OpConstant %uint 10
+%_arr_float_uint_10 = OpTypeArray %float %uint_10
+%_ptr_Function__arr_float_uint_10 = OpTypePointer Function %_arr_float_uint_10
+         %66 = OpConstantNull %_arr_float_uint_10
+         %71 = OpConstantNull %float
+      %int_0 = OpConstant %int 0
+     %int_10 = OpConstant %int 10
+      %int_1 = OpConstant %int 1
+      %int_9 = OpConstant %int 9
+      %int_5 = OpConstant %int 5
+   %float_10 = OpConstant %float 10
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %180 = OpTypeFunction %void %main_out
+%checkSwap_f1_f1_ = OpFunction %bool None %18
+          %a = OpFunctionParameter %_ptr_Function_float
+          %b = OpFunctionParameter %_ptr_Function_float
+         %24 = OpLabel
+      %x_144 = OpVariable %_ptr_Function_bool Function %27
+         %31 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %32 = OpLoad %float %31
+         %35 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_1
+         %36 = OpLoad %float %35
+         %38 = OpFDiv %float %36 %float_2
+         %39 = OpFOrdLessThan %bool %32 %38
+               OpSelectionMerge %40 None
+               OpBranchConditional %39 %41 %42
+         %41 = OpLabel
+         %44 = OpLoad %float %a
+         %46 = OpLoad %float %b
+         %47 = OpFOrdGreaterThan %bool %44 %46
+               OpStore %x_144 %47
+               OpBranch %40
+         %42 = OpLabel
+         %49 = OpLoad %float %a
+         %51 = OpLoad %float %b
+         %52 = OpFOrdLessThan %bool %49 %51
+               OpStore %x_144 %52
+               OpBranch %40
+         %40 = OpLabel
+         %53 = OpLoad %bool %x_144
+               OpReturnValue %53
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %54
+         %57 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %61
+       %data = OpVariable %_ptr_Function__arr_float_uint_10 Function %66
+        %i_1 = OpVariable %_ptr_Function_int Function %61
+          %j = OpVariable %_ptr_Function_int Function %61
+     %doSwap = OpVariable %_ptr_Function_bool Function %27
+      %param = OpVariable %_ptr_Function_float Function %71
+    %param_1 = OpVariable %_ptr_Function_float Function %71
+       %temp = OpVariable %_ptr_Function_float Function %71
+               OpStore %i %int_0
+               OpBranch %75
+         %75 = OpLabel
+               OpLoopMerge %76 %77 None
+               OpBranch %78
+         %78 = OpLabel
+         %79 = OpLoad %int %i
+         %81 = OpSLessThan %bool %79 %int_10
+               OpSelectionMerge %82 None
+               OpBranchConditional %81 %83 %84
+         %83 = OpLabel
+               OpBranch %82
+         %84 = OpLabel
+               OpBranch %76
+         %82 = OpLabel
+         %85 = OpLoad %int %i
+         %86 = OpLoad %int %i
+         %87 = OpAccessChain %_ptr_Uniform_float %x_13 %uint_0 %uint_1
+         %88 = OpLoad %float %87
+         %89 = OpAccessChain %_ptr_Function_float %data %85
+         %91 = OpISub %int %int_10 %86
+         %90 = OpConvertSToF %float %91
+         %92 = OpFMul %float %90 %88
+               OpStore %89 %92
+               OpBranch %77
+         %77 = OpLabel
+         %93 = OpLoad %int %i
+         %95 = OpIAdd %int %93 %int_1
+               OpStore %i %95
+               OpBranch %75
+         %76 = OpLabel
+               OpStore %i_1 %int_0
+               OpBranch %96
+         %96 = OpLabel
+               OpLoopMerge %97 %98 None
+               OpBranch %99
+         %99 = OpLabel
+        %100 = OpLoad %int %i_1
+        %102 = OpSLessThan %bool %100 %int_9
+               OpSelectionMerge %103 None
+               OpBranchConditional %102 %104 %105
+        %104 = OpLabel
+               OpBranch %103
+        %105 = OpLabel
+               OpBranch %97
+        %103 = OpLabel
+               OpStore %j %int_0
+               OpBranch %106
+        %106 = OpLabel
+               OpLoopMerge %107 %108 None
+               OpBranch %109
+        %109 = OpLabel
+        %110 = OpLoad %int %j
+        %111 = OpSLessThan %bool %110 %int_10
+               OpSelectionMerge %112 None
+               OpBranchConditional %111 %113 %114
+        %113 = OpLabel
+               OpBranch %112
+        %114 = OpLabel
+               OpBranch %107
+        %112 = OpLabel
+        %115 = OpLoad %int %j
+        %116 = OpLoad %int %i_1
+        %117 = OpIAdd %int %116 %int_1
+        %118 = OpSLessThan %bool %115 %117
+               OpSelectionMerge %119 None
+               OpBranchConditional %118 %120 %119
+        %120 = OpLabel
+               OpBranch %108
+        %119 = OpLabel
+        %121 = OpLoad %int %i_1
+        %122 = OpLoad %int %j
+        %123 = OpAccessChain %_ptr_Function_float %data %121
+        %124 = OpLoad %float %123
+               OpStore %param %124
+        %125 = OpAccessChain %_ptr_Function_float %data %122
+        %126 = OpLoad %float %125
+               OpStore %param_1 %126
+        %127 = OpFunctionCall %bool %checkSwap_f1_f1_ %param %param_1
+               OpStore %doSwap %127
+        %130 = OpLoad %bool %doSwap
+               OpSelectionMerge %131 None
+               OpBranchConditional %130 %132 %131
+        %132 = OpLabel
+        %133 = OpLoad %int %i_1
+        %134 = OpAccessChain %_ptr_Function_float %data %133
+        %135 = OpLoad %float %134
+               OpStore %temp %135
+        %136 = OpLoad %int %i_1
+        %137 = OpLoad %int %j
+        %138 = OpAccessChain %_ptr_Function_float %data %137
+        %139 = OpLoad %float %138
+        %140 = OpAccessChain %_ptr_Function_float %data %136
+               OpStore %140 %139
+        %141 = OpLoad %int %j
+        %142 = OpLoad %float %temp
+        %143 = OpAccessChain %_ptr_Function_float %data %141
+               OpStore %143 %142
+               OpBranch %131
+        %131 = OpLabel
+               OpBranch %108
+        %108 = OpLabel
+        %144 = OpLoad %int %j
+        %145 = OpIAdd %int %144 %int_1
+               OpStore %j %145
+               OpBranch %106
+        %107 = OpLabel
+               OpBranch %98
+         %98 = OpLabel
+        %146 = OpLoad %int %i_1
+        %147 = OpIAdd %int %146 %int_1
+               OpStore %i_1 %147
+               OpBranch %96
+         %97 = OpLabel
+        %148 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+        %149 = OpLoad %float %148
+        %150 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_0
+        %151 = OpLoad %float %150
+        %152 = OpFDiv %float %151 %float_2
+        %153 = OpFOrdLessThan %bool %149 %152
+               OpSelectionMerge %154 None
+               OpBranchConditional %153 %155 %156
+        %155 = OpLabel
+        %157 = OpAccessChain %_ptr_Function_float %data %int_0
+        %158 = OpLoad %float %157
+        %160 = OpAccessChain %_ptr_Function_float %data %int_5
+        %161 = OpLoad %float %160
+        %162 = OpAccessChain %_ptr_Function_float %data %int_9
+        %163 = OpLoad %float %162
+        %165 = OpFDiv %float %158 %float_10
+        %166 = OpFDiv %float %161 %float_10
+        %167 = OpFDiv %float %163 %float_10
+        %169 = OpCompositeConstruct %v4float %165 %166 %167 %float_1
+               OpStore %x_GLF_color %169
+               OpBranch %154
+        %156 = OpLabel
+        %170 = OpAccessChain %_ptr_Function_float %data %int_5
+        %171 = OpLoad %float %170
+        %172 = OpAccessChain %_ptr_Function_float %data %int_9
+        %173 = OpLoad %float %172
+        %174 = OpAccessChain %_ptr_Function_float %data %int_0
+        %175 = OpLoad %float %174
+        %176 = OpFDiv %float %171 %float_10
+        %177 = OpFDiv %float %173 %float_10
+        %178 = OpFDiv %float %175 %float_10
+        %179 = OpCompositeConstruct %v4float %176 %177 %178 %float_1
+               OpStore %x_GLF_color %179
+               OpBranch %154
+        %154 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %180
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %184 = OpLabel
+        %185 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %185
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %54
+        %187 = OpLabel
+        %188 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %188
+        %189 = OpFunctionCall %void %main_1
+        %191 = OpLoad %v4float %x_GLF_color
+        %192 = OpCompositeConstruct %main_out %191
+        %190 = OpFunctionCall %void %tint_symbol_3 %192
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..9074163
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/0.wgsl.expected.wgsl
@@ -0,0 +1,140 @@
+[[block]]
+struct buf1 {
+  resolution : vec2<f32>;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_13 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn checkSwap_f1_f1_(a : ptr<function, f32>, b : ptr<function, f32>) -> bool {
+  var x_144 : bool;
+  let x_146 : f32 = gl_FragCoord.y;
+  let x_148 : f32 = x_9.resolution.y;
+  if ((x_146 < (x_148 / 2.0))) {
+    let x_154 : f32 = *(a);
+    let x_155 : f32 = *(b);
+    x_144 = (x_154 > x_155);
+  } else {
+    let x_157 : f32 = *(a);
+    let x_158 : f32 = *(b);
+    x_144 = (x_157 < x_158);
+  }
+  let x_160 : bool = x_144;
+  return x_160;
+}
+
+fn main_1() {
+  var i : i32;
+  var data : array<f32, 10>;
+  var i_1 : i32;
+  var j : i32;
+  var doSwap : bool;
+  var param : f32;
+  var param_1 : f32;
+  var temp : f32;
+  i = 0;
+  loop {
+    let x_56 : i32 = i;
+    if ((x_56 < 10)) {
+    } else {
+      break;
+    }
+    let x_59 : i32 = i;
+    let x_60 : i32 = i;
+    let x_64 : f32 = x_13.injectionSwitch.y;
+    data[x_59] = (f32((10 - x_60)) * x_64);
+
+    continuing {
+      let x_67 : i32 = i;
+      i = (x_67 + 1);
+    }
+  }
+  i_1 = 0;
+  loop {
+    let x_73 : i32 = i_1;
+    if ((x_73 < 9)) {
+    } else {
+      break;
+    }
+    j = 0;
+    loop {
+      let x_80 : i32 = j;
+      if ((x_80 < 10)) {
+      } else {
+        break;
+      }
+      let x_83 : i32 = j;
+      let x_84 : i32 = i_1;
+      if ((x_83 < (x_84 + 1))) {
+        continue;
+      }
+      let x_89 : i32 = i_1;
+      let x_90 : i32 = j;
+      let x_92 : f32 = data[x_89];
+      param = x_92;
+      let x_94 : f32 = data[x_90];
+      param_1 = x_94;
+      let x_95 : bool = checkSwap_f1_f1_(&(param), &(param_1));
+      doSwap = x_95;
+      let x_96 : bool = doSwap;
+      if (x_96) {
+        let x_99 : i32 = i_1;
+        let x_101 : f32 = data[x_99];
+        temp = x_101;
+        let x_102 : i32 = i_1;
+        let x_103 : i32 = j;
+        let x_105 : f32 = data[x_103];
+        data[x_102] = x_105;
+        let x_107 : i32 = j;
+        let x_108 : f32 = temp;
+        data[x_107] = x_108;
+      }
+
+      continuing {
+        let x_110 : i32 = j;
+        j = (x_110 + 1);
+      }
+    }
+
+    continuing {
+      let x_112 : i32 = i_1;
+      i_1 = (x_112 + 1);
+    }
+  }
+  let x_115 : f32 = gl_FragCoord.x;
+  let x_117 : f32 = x_9.resolution.x;
+  if ((x_115 < (x_117 / 2.0))) {
+    let x_124 : f32 = data[0];
+    let x_127 : f32 = data[5];
+    let x_130 : f32 = data[9];
+    x_GLF_color = vec4<f32>((x_124 / 10.0), (x_127 / 10.0), (x_130 / 10.0), 1.0);
+  } else {
+    let x_134 : f32 = data[5];
+    let x_137 : f32 = data[9];
+    let x_140 : f32 = data[0];
+    x_GLF_color = vec4<f32>((x_134 / 10.0), (x_137 / 10.0), (x_140 / 10.0), 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/1.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/1.spvasm
new file mode 100644
index 0000000..5b6120e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/1.spvasm
@@ -0,0 +1,305 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %checkSwap_f1_f1_ "checkSwap(f1;f1;"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "resolution"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %data "data"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %__0 ""
+               OpName %i_0 "i"
+               OpName %j "j"
+               OpName %doSwap "doSwap"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %temp "temp"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+       %bool = OpTypeBool
+         %25 = OpTypeFunction %bool %_ptr_Function_float %_ptr_Function_float
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_2 = OpConstant %float 2
+%_ptr_Function_bool = OpTypePointer Function %bool
+%_ptr_Function_int = OpTypePointer Function %int
+     %int_10 = OpConstant %int 10
+    %uint_10 = OpConstant %uint 10
+%_arr_float_uint_10 = OpTypeArray %float %uint_10
+%_ptr_Function__arr_float_uint_10 = OpTypePointer Function %_arr_float_uint_10
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_1 = OpConstant %int 1
+      %int_9 = OpConstant %int 9
+     %uint_0 = OpConstant %uint 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+   %float_10 = OpConstant %float 10
+      %int_5 = OpConstant %int 5
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+      %false = OpConstantFalse %bool
+       %true = OpConstantTrue %bool
+       %main = OpFunction %void None %21
+         %54 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+       %data = OpVariable %_ptr_Function__arr_float_uint_10 Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+          %j = OpVariable %_ptr_Function_int Function
+     %doSwap = OpVariable %_ptr_Function_bool Function
+      %param = OpVariable %_ptr_Function_float Function
+    %param_0 = OpVariable %_ptr_Function_float Function
+       %temp = OpVariable %_ptr_Function_float Function
+               OpStore %i %int_0
+               OpBranch %55
+         %55 = OpLabel
+               OpLoopMerge %56 %57 None
+               OpBranch %58
+         %58 = OpLabel
+         %59 = OpLoad %int %i
+         %60 = OpSLessThan %bool %59 %int_10
+               OpBranchConditional %60 %61 %56
+         %61 = OpLabel
+         %62 = OpLoad %int %i
+         %63 = OpLoad %int %i
+         %64 = OpISub %int %int_10 %63
+         %65 = OpConvertSToF %float %64
+         %66 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %uint_1
+         %67 = OpLoad %float %66
+         %68 = OpFMul %float %65 %67
+         %69 = OpAccessChain %_ptr_Function_float %data %62
+               OpStore %69 %68
+               OpBranch %57
+         %57 = OpLabel
+         %70 = OpLoad %int %i
+         %71 = OpIAdd %int %70 %int_1
+               OpStore %i %71
+               OpBranch %55
+         %56 = OpLabel
+               OpStore %i_0 %int_0
+               OpBranch %72
+         %72 = OpLabel
+               OpLoopMerge %73 %74 None
+               OpBranch %75
+         %75 = OpLabel
+         %76 = OpLoad %int %i_0
+         %77 = OpSLessThan %bool %76 %int_9
+               OpBranchConditional %77 %78 %73
+         %78 = OpLabel
+               OpStore %j %int_0
+               OpBranch %79
+         %79 = OpLabel
+               OpLoopMerge %80 %81 None
+               OpBranch %82
+         %82 = OpLabel
+         %83 = OpLoad %int %j
+         %84 = OpSLessThan %bool %83 %int_10
+               OpBranchConditional %84 %85 %80
+         %85 = OpLabel
+         %86 = OpLoad %int %j
+         %87 = OpLoad %int %i_0
+         %88 = OpIAdd %int %87 %int_1
+         %89 = OpSLessThan %bool %86 %88
+               OpSelectionMerge %90 None
+               OpBranchConditional %89 %91 %90
+         %91 = OpLabel
+               OpBranch %81
+         %90 = OpLabel
+         %92 = OpLoad %int %i_0
+         %93 = OpLoad %int %j
+         %94 = OpAccessChain %_ptr_Function_float %data %92
+         %95 = OpLoad %float %94
+               OpStore %param %95
+         %96 = OpAccessChain %_ptr_Function_float %data %93
+         %97 = OpLoad %float %96
+               OpStore %param_0 %97
+         %98 = OpFunctionCall %bool %checkSwap_f1_f1_ %param %param_0
+               OpStore %doSwap %98
+         %99 = OpLoad %bool %doSwap
+               OpSelectionMerge %100 None
+               OpBranchConditional %99 %101 %100
+        %101 = OpLabel
+        %102 = OpLoad %int %i_0
+        %103 = OpAccessChain %_ptr_Function_float %data %102
+        %104 = OpLoad %float %103
+               OpStore %temp %104
+        %105 = OpLoad %int %i_0
+        %106 = OpLoad %int %j
+        %107 = OpAccessChain %_ptr_Function_float %data %106
+        %108 = OpLoad %float %107
+        %109 = OpAccessChain %_ptr_Function_float %data %105
+               OpStore %109 %108
+        %110 = OpLoad %int %j
+        %111 = OpLoad %float %temp
+        %112 = OpAccessChain %_ptr_Function_float %data %110
+               OpStore %112 %111
+               OpBranch %100
+        %100 = OpLabel
+               OpBranch %81
+         %81 = OpLabel
+        %113 = OpLoad %int %j
+        %114 = OpIAdd %int %113 %int_1
+               OpStore %j %114
+               OpBranch %79
+         %80 = OpLabel
+               OpBranch %74
+         %74 = OpLabel
+        %115 = OpLoad %int %i_0
+        %116 = OpIAdd %int %115 %int_1
+               OpStore %i_0 %116
+               OpBranch %72
+         %73 = OpLabel
+        %117 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+        %118 = OpLoad %float %117
+        %119 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+        %120 = OpLoad %float %119
+        %121 = OpFDiv %float %120 %float_2
+        %122 = OpFOrdLessThan %bool %118 %121
+               OpSelectionMerge %123 None
+               OpBranchConditional %122 %124 %125
+        %124 = OpLabel
+        %126 = OpAccessChain %_ptr_Function_float %data %int_0
+        %127 = OpLoad %float %126
+        %128 = OpFDiv %float %127 %float_10
+        %129 = OpAccessChain %_ptr_Function_float %data %int_5
+        %130 = OpLoad %float %129
+        %131 = OpFDiv %float %130 %float_10
+        %132 = OpAccessChain %_ptr_Function_float %data %int_9
+        %133 = OpLoad %float %132
+        %134 = OpFDiv %float %133 %float_10
+        %135 = OpCompositeConstruct %v4float %128 %131 %134 %float_1
+               OpStore %_GLF_color %135
+               OpBranch %123
+        %125 = OpLabel
+        %136 = OpAccessChain %_ptr_Function_float %data %int_5
+        %137 = OpLoad %float %136
+        %138 = OpFDiv %float %137 %float_10
+        %139 = OpAccessChain %_ptr_Function_float %data %int_9
+        %140 = OpLoad %float %139
+        %141 = OpFDiv %float %140 %float_10
+        %142 = OpAccessChain %_ptr_Function_float %data %int_0
+        %143 = OpLoad %float %142
+        %144 = OpFDiv %float %143 %float_10
+        %145 = OpCompositeConstruct %v4float %138 %141 %144 %float_1
+               OpStore %_GLF_color %145
+               OpBranch %123
+        %123 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%checkSwap_f1_f1_ = OpFunction %bool None %25
+          %a = OpFunctionParameter %_ptr_Function_float
+          %b = OpFunctionParameter %_ptr_Function_float
+        %146 = OpLabel
+        %147 = OpVariable %_ptr_Function_bool Function
+        %148 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %149 = OpLoad %float %148
+        %150 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+        %151 = OpLoad %float %150
+        %152 = OpFDiv %float %151 %float_2
+        %153 = OpFOrdLessThan %bool %149 %152
+               OpBranch %154
+        %154 = OpLabel
+               OpSelectionMerge %155 None
+               OpBranchConditional %153 %156 %157
+        %156 = OpLabel
+        %158 = OpLoad %float %a
+               OpBranch %155
+        %157 = OpLabel
+        %159 = OpCopyObject %float %float_0
+               OpBranch %155
+        %155 = OpLabel
+        %160 = OpPhi %float %158 %156 %159 %157
+               OpSelectionMerge %161 None
+               OpBranchConditional %false %162 %162
+        %162 = OpLabel
+               OpSelectionMerge %163 None
+               OpBranchConditional %153 %164 %165
+        %164 = OpLabel
+        %166 = OpLoad %float %b
+               OpBranch %163
+        %165 = OpLabel
+        %167 = OpCopyObject %float %float_0
+               OpBranch %163
+        %163 = OpLabel
+        %168 = OpPhi %float %166 %164 %167 %165
+        %169 = OpFOrdGreaterThan %bool %160 %168
+               OpBranch %170
+        %170 = OpLabel
+               OpSelectionMerge %171 None
+               OpBranchConditional %153 %172 %171
+        %172 = OpLabel
+               OpStore %147 %169
+               OpBranch %171
+        %171 = OpLabel
+               OpBranchConditional %true %173 %161
+        %173 = OpLabel
+               OpBranch %161
+        %161 = OpLabel
+               OpBranch %174
+        %174 = OpLabel
+               OpSelectionMerge %175 None
+               OpBranchConditional %153 %176 %177
+        %177 = OpLabel
+        %178 = OpLoad %float %a
+               OpBranch %175
+        %176 = OpLabel
+        %179 = OpCopyObject %float %float_0
+               OpBranch %175
+        %175 = OpLabel
+        %180 = OpPhi %float %178 %177 %179 %176
+               OpSelectionMerge %181 None
+               OpBranchConditional %153 %182 %183
+        %183 = OpLabel
+        %184 = OpLoad %float %b
+               OpBranch %181
+        %182 = OpLabel
+        %185 = OpCopyObject %float %float_0
+               OpBranch %181
+        %181 = OpLabel
+        %186 = OpPhi %float %184 %183 %185 %182
+        %187 = OpFOrdLessThan %bool %180 %186
+               OpSelectionMerge %188 None
+               OpBranchConditional %153 %188 %189
+        %189 = OpLabel
+               OpStore %147 %187
+               OpBranch %188
+        %188 = OpLabel
+               OpBranch %190
+        %190 = OpLabel
+        %191 = OpLoad %bool %147
+               OpReturnValue %191
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..8afa23d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/1.spvasm.expected.hlsl
@@ -0,0 +1,161 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_9 : register(b1, space0) {
+  uint4 x_9[1];
+};
+cbuffer cbuffer_x_13 : register(b0, space0) {
+  uint4 x_13[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+bool checkSwap_f1_f1_(inout float a, inout float b) {
+  bool x_147 = false;
+  float x_158 = 0.0f;
+  float x_159 = 0.0f;
+  float x_179 = 0.0f;
+  float x_178 = 0.0f;
+  float x_185 = 0.0f;
+  float x_184 = 0.0f;
+  float x_160_phi = 0.0f;
+  float x_180_phi = 0.0f;
+  float x_186_phi = 0.0f;
+  const float x_149 = gl_FragCoord.y;
+  const float x_151 = asfloat(x_9[0].y);
+  const bool x_153 = (x_149 < (x_151 / 2.0f));
+  if (x_153) {
+    x_158 = a;
+    x_160_phi = x_158;
+  } else {
+    x_159 = 0.0f;
+    x_160_phi = x_159;
+  }
+  float x_166 = 0.0f;
+  float x_167 = 0.0f;
+  float x_168_phi = 0.0f;
+  const float x_160 = x_160_phi;
+  bool guard155 = true;
+  if (false) {
+  } else {
+    if (guard155) {
+      if (x_153) {
+        x_166 = b;
+        x_168_phi = x_166;
+      } else {
+        x_167 = 0.0f;
+        x_168_phi = x_167;
+      }
+      const bool x_169 = (x_160 > x_168_phi);
+      if (x_153) {
+        x_147 = x_169;
+      }
+      if (true) {
+      } else {
+        guard155 = false;
+      }
+      if (guard155) {
+        guard155 = false;
+      }
+    }
+  }
+  if (x_153) {
+    x_179 = 0.0f;
+    x_180_phi = x_179;
+  } else {
+    x_178 = a;
+    x_180_phi = x_178;
+  }
+  const float x_180 = x_180_phi;
+  if (x_153) {
+    x_185 = 0.0f;
+    x_186_phi = x_185;
+  } else {
+    x_184 = b;
+    x_186_phi = x_184;
+  }
+  const float x_186 = x_186_phi;
+  if (x_153) {
+  } else {
+    x_147 = (x_180 < x_186);
+  }
+  return x_147;
+}
+
+void main_1() {
+  int i = 0;
+  float data[10] = (float[10])0;
+  int i_1 = 0;
+  int j = 0;
+  bool doSwap = false;
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  float temp = 0.0f;
+  i = 0;
+  {
+    for(; (i < 10); i = (i + 1)) {
+      const int x_62 = i;
+      const int x_63 = i;
+      const float x_67 = asfloat(x_13[0].y);
+      data[x_62] = (float((10 - x_63)) * x_67);
+    }
+  }
+  i_1 = 0;
+  {
+    for(; (i_1 < 9); i_1 = (i_1 + 1)) {
+      j = 0;
+      {
+        for(; (j < 10); j = (j + 1)) {
+          if ((j < (i_1 + 1))) {
+            continue;
+          }
+          const int x_93 = j;
+          const float x_95 = data[i_1];
+          param = x_95;
+          const float x_97 = data[x_93];
+          param_1 = x_97;
+          const bool x_98 = checkSwap_f1_f1_(param, param_1);
+          doSwap = x_98;
+          if (doSwap) {
+            const float x_104 = data[i_1];
+            temp = x_104;
+            const int x_105 = i_1;
+            const float x_108 = data[j];
+            data[x_105] = x_108;
+            data[j] = temp;
+          }
+        }
+      }
+    }
+  }
+  const float x_118 = gl_FragCoord.x;
+  const float x_120 = asfloat(x_9[0].x);
+  if ((x_118 < (x_120 / 2.0f))) {
+    const float x_127 = data[0];
+    const float x_130 = data[5];
+    const float x_133 = data[9];
+    x_GLF_color = float4((x_127 / 10.0f), (x_130 / 10.0f), (x_133 / 10.0f), 1.0f);
+  } else {
+    const float x_137 = data[5];
+    const float x_140 = data[9];
+    const float x_143 = data[0];
+    x_GLF_color = float4((x_137 / 10.0f), (x_140 / 10.0f), (x_143 / 10.0f), 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/1.spvasm.expected.msl
new file mode 100644
index 0000000..3475e45
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/1.spvasm.expected.msl
@@ -0,0 +1,198 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf1 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  float arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+bool checkSwap_f1_f1_(constant buf1& x_9, thread float* const a, thread float* const b, thread float4* const tint_symbol_5) {
+  bool x_147 = false;
+  float x_158 = 0.0f;
+  float x_159 = 0.0f;
+  float x_179 = 0.0f;
+  float x_178 = 0.0f;
+  float x_185 = 0.0f;
+  float x_184 = 0.0f;
+  float x_160_phi = 0.0f;
+  float x_180_phi = 0.0f;
+  float x_186_phi = 0.0f;
+  float const x_149 = (*(tint_symbol_5)).y;
+  float const x_151 = x_9.resolution.y;
+  bool const x_153 = (x_149 < (x_151 / 2.0f));
+  if (x_153) {
+    x_158 = *(a);
+    x_160_phi = x_158;
+  } else {
+    x_159 = 0.0f;
+    x_160_phi = x_159;
+  }
+  float x_166 = 0.0f;
+  float x_167 = 0.0f;
+  float x_168_phi = 0.0f;
+  float const x_160 = x_160_phi;
+  bool guard155 = true;
+  if (false) {
+  } else {
+    if (guard155) {
+      if (x_153) {
+        x_166 = *(b);
+        x_168_phi = x_166;
+      } else {
+        x_167 = 0.0f;
+        x_168_phi = x_167;
+      }
+      float const x_168 = x_168_phi;
+      bool const x_169 = (x_160 > x_168);
+      if (x_153) {
+        x_147 = x_169;
+      }
+      if (true) {
+      } else {
+        guard155 = false;
+      }
+      if (guard155) {
+        guard155 = false;
+      }
+    }
+  }
+  if (x_153) {
+    x_179 = 0.0f;
+    x_180_phi = x_179;
+  } else {
+    x_178 = *(a);
+    x_180_phi = x_178;
+  }
+  float const x_180 = x_180_phi;
+  if (x_153) {
+    x_185 = 0.0f;
+    x_186_phi = x_185;
+  } else {
+    x_184 = *(b);
+    x_186_phi = x_184;
+  }
+  float const x_186 = x_186_phi;
+  if (x_153) {
+  } else {
+    x_147 = (x_180 < x_186);
+  }
+  bool const x_191 = x_147;
+  return x_191;
+}
+
+void main_1(constant buf0& x_13, constant buf1& x_9, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  int i = 0;
+  tint_array_wrapper data = {};
+  int i_1 = 0;
+  int j = 0;
+  bool doSwap = false;
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  float temp = 0.0f;
+  i = 0;
+  while (true) {
+    int const x_59 = i;
+    if ((x_59 < 10)) {
+    } else {
+      break;
+    }
+    int const x_62 = i;
+    int const x_63 = i;
+    float const x_67 = x_13.injectionSwitch.y;
+    data.arr[x_62] = (float((10 - x_63)) * x_67);
+    {
+      int const x_70 = i;
+      i = (x_70 + 1);
+    }
+  }
+  i_1 = 0;
+  while (true) {
+    int const x_76 = i_1;
+    if ((x_76 < 9)) {
+    } else {
+      break;
+    }
+    j = 0;
+    while (true) {
+      int const x_83 = j;
+      if ((x_83 < 10)) {
+      } else {
+        break;
+      }
+      int const x_86 = j;
+      int const x_87 = i_1;
+      if ((x_86 < (x_87 + 1))) {
+        {
+          int const x_113 = j;
+          j = (x_113 + 1);
+        }
+        continue;
+      }
+      int const x_92 = i_1;
+      int const x_93 = j;
+      float const x_95 = data.arr[x_92];
+      param = x_95;
+      float const x_97 = data.arr[x_93];
+      param_1 = x_97;
+      bool const x_98 = checkSwap_f1_f1_(x_9, &(param), &(param_1), tint_symbol_6);
+      doSwap = x_98;
+      bool const x_99 = doSwap;
+      if (x_99) {
+        int const x_102 = i_1;
+        float const x_104 = data.arr[x_102];
+        temp = x_104;
+        int const x_105 = i_1;
+        int const x_106 = j;
+        float const x_108 = data.arr[x_106];
+        data.arr[x_105] = x_108;
+        int const x_110 = j;
+        float const x_111 = temp;
+        data.arr[x_110] = x_111;
+      }
+      {
+        int const x_113 = j;
+        j = (x_113 + 1);
+      }
+    }
+    {
+      int const x_115 = i_1;
+      i_1 = (x_115 + 1);
+    }
+  }
+  float const x_118 = (*(tint_symbol_6)).x;
+  float const x_120 = x_9.resolution.x;
+  if ((x_118 < (x_120 / 2.0f))) {
+    float const x_127 = data.arr[0];
+    float const x_130 = data.arr[5];
+    float const x_133 = data.arr[9];
+    *(tint_symbol_7) = float4((x_127 / 10.0f), (x_130 / 10.0f), (x_133 / 10.0f), 1.0f);
+  } else {
+    float const x_137 = data.arr[5];
+    float const x_140 = data.arr[9];
+    float const x_143 = data.arr[0];
+    *(tint_symbol_7) = float4((x_137 / 10.0f), (x_140 / 10.0f), (x_143 / 10.0f), 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_13 [[buffer(0)]], constant buf1& x_9 [[buffer(1)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_13, x_9, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..75d9c10
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/1.spvasm.expected.spvasm
@@ -0,0 +1,424 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 247
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "resolution"
+               OpName %x_9 "x_9"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_13 "x_13"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %checkSwap_f1_f1_ "checkSwap_f1_f1_"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %x_147 "x_147"
+               OpName %x_158 "x_158"
+               OpName %x_159 "x_159"
+               OpName %x_179 "x_179"
+               OpName %x_178 "x_178"
+               OpName %x_185 "x_185"
+               OpName %x_184 "x_184"
+               OpName %x_160_phi "x_160_phi"
+               OpName %x_180_phi "x_180_phi"
+               OpName %x_186_phi "x_186_phi"
+               OpName %x_166 "x_166"
+               OpName %x_167 "x_167"
+               OpName %x_168_phi "x_168_phi"
+               OpName %guard155 "guard155"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %data "data"
+               OpName %i_1 "i_1"
+               OpName %j "j"
+               OpName %doSwap "doSwap"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %temp "temp"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_13 NonWritable
+               OpDecorate %x_13 DescriptorSet 0
+               OpDecorate %x_13 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_float_uint_10 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_9 = OpVariable %_ptr_Uniform_buf1 Uniform
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_13 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %bool = OpTypeBool
+%_ptr_Function_float = OpTypePointer Function %float
+         %18 = OpTypeFunction %bool %_ptr_Function_float %_ptr_Function_float
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %27 = OpConstantNull %bool
+         %29 = OpConstantNull %float
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_2 = OpConstant %float 2
+    %float_0 = OpConstant %float 0
+       %true = OpConstantTrue %bool
+      %false = OpConstantFalse %bool
+       %void = OpTypeVoid
+        %109 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+        %116 = OpConstantNull %int
+    %uint_10 = OpConstant %uint 10
+%_arr_float_uint_10 = OpTypeArray %float %uint_10
+%_ptr_Function__arr_float_uint_10 = OpTypePointer Function %_arr_float_uint_10
+        %121 = OpConstantNull %_arr_float_uint_10
+      %int_0 = OpConstant %int 0
+     %int_10 = OpConstant %int 10
+      %int_1 = OpConstant %int 1
+      %int_9 = OpConstant %int 9
+      %int_5 = OpConstant %int 5
+   %float_10 = OpConstant %float 10
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %234 = OpTypeFunction %void %main_out
+%checkSwap_f1_f1_ = OpFunction %bool None %18
+          %a = OpFunctionParameter %_ptr_Function_float
+          %b = OpFunctionParameter %_ptr_Function_float
+         %24 = OpLabel
+      %x_147 = OpVariable %_ptr_Function_bool Function %27
+      %x_158 = OpVariable %_ptr_Function_float Function %29
+      %x_159 = OpVariable %_ptr_Function_float Function %29
+      %x_179 = OpVariable %_ptr_Function_float Function %29
+      %x_178 = OpVariable %_ptr_Function_float Function %29
+      %x_185 = OpVariable %_ptr_Function_float Function %29
+      %x_184 = OpVariable %_ptr_Function_float Function %29
+  %x_160_phi = OpVariable %_ptr_Function_float Function %29
+  %x_180_phi = OpVariable %_ptr_Function_float Function %29
+  %x_186_phi = OpVariable %_ptr_Function_float Function %29
+      %x_166 = OpVariable %_ptr_Function_float Function %29
+      %x_167 = OpVariable %_ptr_Function_float Function %29
+  %x_168_phi = OpVariable %_ptr_Function_float Function %29
+   %guard155 = OpVariable %_ptr_Function_bool Function %27
+         %41 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %42 = OpLoad %float %41
+         %45 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_1
+         %46 = OpLoad %float %45
+         %48 = OpFDiv %float %46 %float_2
+         %49 = OpFOrdLessThan %bool %42 %48
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %52
+         %51 = OpLabel
+         %54 = OpLoad %float %a
+               OpStore %x_158 %54
+         %55 = OpLoad %float %x_158
+               OpStore %x_160_phi %55
+               OpBranch %50
+         %52 = OpLabel
+               OpStore %x_159 %float_0
+         %57 = OpLoad %float %x_159
+               OpStore %x_160_phi %57
+               OpBranch %50
+         %50 = OpLabel
+         %61 = OpLoad %float %x_160_phi
+               OpStore %guard155 %true
+               OpSelectionMerge %65 None
+               OpBranchConditional %false %66 %67
+         %66 = OpLabel
+               OpBranch %65
+         %67 = OpLabel
+         %68 = OpLoad %bool %guard155
+               OpSelectionMerge %69 None
+               OpBranchConditional %68 %70 %69
+         %70 = OpLabel
+               OpSelectionMerge %71 None
+               OpBranchConditional %49 %72 %73
+         %72 = OpLabel
+         %75 = OpLoad %float %b
+               OpStore %x_166 %75
+         %76 = OpLoad %float %x_166
+               OpStore %x_168_phi %76
+               OpBranch %71
+         %73 = OpLabel
+               OpStore %x_167 %float_0
+         %77 = OpLoad %float %x_167
+               OpStore %x_168_phi %77
+               OpBranch %71
+         %71 = OpLabel
+         %78 = OpLoad %float %x_168_phi
+         %79 = OpFOrdGreaterThan %bool %61 %78
+               OpSelectionMerge %80 None
+               OpBranchConditional %49 %81 %80
+         %81 = OpLabel
+               OpStore %x_147 %79
+               OpBranch %80
+         %80 = OpLabel
+               OpSelectionMerge %82 None
+               OpBranchConditional %true %83 %84
+         %83 = OpLabel
+               OpBranch %82
+         %84 = OpLabel
+               OpStore %guard155 %false
+               OpBranch %82
+         %82 = OpLabel
+         %85 = OpLoad %bool %guard155
+               OpSelectionMerge %86 None
+               OpBranchConditional %85 %87 %86
+         %87 = OpLabel
+               OpStore %guard155 %false
+               OpBranch %86
+         %86 = OpLabel
+               OpBranch %69
+         %69 = OpLabel
+               OpBranch %65
+         %65 = OpLabel
+               OpSelectionMerge %88 None
+               OpBranchConditional %49 %89 %90
+         %89 = OpLabel
+               OpStore %x_179 %float_0
+         %91 = OpLoad %float %x_179
+               OpStore %x_180_phi %91
+               OpBranch %88
+         %90 = OpLabel
+         %93 = OpLoad %float %a
+               OpStore %x_178 %93
+         %94 = OpLoad %float %x_178
+               OpStore %x_180_phi %94
+               OpBranch %88
+         %88 = OpLabel
+         %95 = OpLoad %float %x_180_phi
+               OpSelectionMerge %96 None
+               OpBranchConditional %49 %97 %98
+         %97 = OpLabel
+               OpStore %x_185 %float_0
+         %99 = OpLoad %float %x_185
+               OpStore %x_186_phi %99
+               OpBranch %96
+         %98 = OpLabel
+        %101 = OpLoad %float %b
+               OpStore %x_184 %101
+        %102 = OpLoad %float %x_184
+               OpStore %x_186_phi %102
+               OpBranch %96
+         %96 = OpLabel
+        %103 = OpLoad %float %x_186_phi
+               OpSelectionMerge %104 None
+               OpBranchConditional %49 %105 %106
+        %105 = OpLabel
+               OpBranch %104
+        %106 = OpLabel
+        %107 = OpFOrdLessThan %bool %95 %103
+               OpStore %x_147 %107
+               OpBranch %104
+        %104 = OpLabel
+        %108 = OpLoad %bool %x_147
+               OpReturnValue %108
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %109
+        %112 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %116
+       %data = OpVariable %_ptr_Function__arr_float_uint_10 Function %121
+        %i_1 = OpVariable %_ptr_Function_int Function %116
+          %j = OpVariable %_ptr_Function_int Function %116
+     %doSwap = OpVariable %_ptr_Function_bool Function %27
+      %param = OpVariable %_ptr_Function_float Function %29
+    %param_1 = OpVariable %_ptr_Function_float Function %29
+       %temp = OpVariable %_ptr_Function_float Function %29
+               OpStore %i %int_0
+               OpBranch %129
+        %129 = OpLabel
+               OpLoopMerge %130 %131 None
+               OpBranch %132
+        %132 = OpLabel
+        %133 = OpLoad %int %i
+        %135 = OpSLessThan %bool %133 %int_10
+               OpSelectionMerge %136 None
+               OpBranchConditional %135 %137 %138
+        %137 = OpLabel
+               OpBranch %136
+        %138 = OpLabel
+               OpBranch %130
+        %136 = OpLabel
+        %139 = OpLoad %int %i
+        %140 = OpLoad %int %i
+        %141 = OpAccessChain %_ptr_Uniform_float %x_13 %uint_0 %uint_1
+        %142 = OpLoad %float %141
+        %143 = OpAccessChain %_ptr_Function_float %data %139
+        %145 = OpISub %int %int_10 %140
+        %144 = OpConvertSToF %float %145
+        %146 = OpFMul %float %144 %142
+               OpStore %143 %146
+               OpBranch %131
+        %131 = OpLabel
+        %147 = OpLoad %int %i
+        %149 = OpIAdd %int %147 %int_1
+               OpStore %i %149
+               OpBranch %129
+        %130 = OpLabel
+               OpStore %i_1 %int_0
+               OpBranch %150
+        %150 = OpLabel
+               OpLoopMerge %151 %152 None
+               OpBranch %153
+        %153 = OpLabel
+        %154 = OpLoad %int %i_1
+        %156 = OpSLessThan %bool %154 %int_9
+               OpSelectionMerge %157 None
+               OpBranchConditional %156 %158 %159
+        %158 = OpLabel
+               OpBranch %157
+        %159 = OpLabel
+               OpBranch %151
+        %157 = OpLabel
+               OpStore %j %int_0
+               OpBranch %160
+        %160 = OpLabel
+               OpLoopMerge %161 %162 None
+               OpBranch %163
+        %163 = OpLabel
+        %164 = OpLoad %int %j
+        %165 = OpSLessThan %bool %164 %int_10
+               OpSelectionMerge %166 None
+               OpBranchConditional %165 %167 %168
+        %167 = OpLabel
+               OpBranch %166
+        %168 = OpLabel
+               OpBranch %161
+        %166 = OpLabel
+        %169 = OpLoad %int %j
+        %170 = OpLoad %int %i_1
+        %171 = OpIAdd %int %170 %int_1
+        %172 = OpSLessThan %bool %169 %171
+               OpSelectionMerge %173 None
+               OpBranchConditional %172 %174 %173
+        %174 = OpLabel
+               OpBranch %162
+        %173 = OpLabel
+        %175 = OpLoad %int %i_1
+        %176 = OpLoad %int %j
+        %177 = OpAccessChain %_ptr_Function_float %data %175
+        %178 = OpLoad %float %177
+               OpStore %param %178
+        %179 = OpAccessChain %_ptr_Function_float %data %176
+        %180 = OpLoad %float %179
+               OpStore %param_1 %180
+        %181 = OpFunctionCall %bool %checkSwap_f1_f1_ %param %param_1
+               OpStore %doSwap %181
+        %184 = OpLoad %bool %doSwap
+               OpSelectionMerge %185 None
+               OpBranchConditional %184 %186 %185
+        %186 = OpLabel
+        %187 = OpLoad %int %i_1
+        %188 = OpAccessChain %_ptr_Function_float %data %187
+        %189 = OpLoad %float %188
+               OpStore %temp %189
+        %190 = OpLoad %int %i_1
+        %191 = OpLoad %int %j
+        %192 = OpAccessChain %_ptr_Function_float %data %191
+        %193 = OpLoad %float %192
+        %194 = OpAccessChain %_ptr_Function_float %data %190
+               OpStore %194 %193
+        %195 = OpLoad %int %j
+        %196 = OpLoad %float %temp
+        %197 = OpAccessChain %_ptr_Function_float %data %195
+               OpStore %197 %196
+               OpBranch %185
+        %185 = OpLabel
+               OpBranch %162
+        %162 = OpLabel
+        %198 = OpLoad %int %j
+        %199 = OpIAdd %int %198 %int_1
+               OpStore %j %199
+               OpBranch %160
+        %161 = OpLabel
+               OpBranch %152
+        %152 = OpLabel
+        %200 = OpLoad %int %i_1
+        %201 = OpIAdd %int %200 %int_1
+               OpStore %i_1 %201
+               OpBranch %150
+        %151 = OpLabel
+        %202 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+        %203 = OpLoad %float %202
+        %204 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_0
+        %205 = OpLoad %float %204
+        %206 = OpFDiv %float %205 %float_2
+        %207 = OpFOrdLessThan %bool %203 %206
+               OpSelectionMerge %208 None
+               OpBranchConditional %207 %209 %210
+        %209 = OpLabel
+        %211 = OpAccessChain %_ptr_Function_float %data %int_0
+        %212 = OpLoad %float %211
+        %214 = OpAccessChain %_ptr_Function_float %data %int_5
+        %215 = OpLoad %float %214
+        %216 = OpAccessChain %_ptr_Function_float %data %int_9
+        %217 = OpLoad %float %216
+        %219 = OpFDiv %float %212 %float_10
+        %220 = OpFDiv %float %215 %float_10
+        %221 = OpFDiv %float %217 %float_10
+        %223 = OpCompositeConstruct %v4float %219 %220 %221 %float_1
+               OpStore %x_GLF_color %223
+               OpBranch %208
+        %210 = OpLabel
+        %224 = OpAccessChain %_ptr_Function_float %data %int_5
+        %225 = OpLoad %float %224
+        %226 = OpAccessChain %_ptr_Function_float %data %int_9
+        %227 = OpLoad %float %226
+        %228 = OpAccessChain %_ptr_Function_float %data %int_0
+        %229 = OpLoad %float %228
+        %230 = OpFDiv %float %225 %float_10
+        %231 = OpFDiv %float %227 %float_10
+        %232 = OpFDiv %float %229 %float_10
+        %233 = OpCompositeConstruct %v4float %230 %231 %232 %float_1
+               OpStore %x_GLF_color %233
+               OpBranch %208
+        %208 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %234
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %238 = OpLabel
+        %239 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %239
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %109
+        %241 = OpLabel
+        %242 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %242
+        %243 = OpFunctionCall %void %main_1
+        %245 = OpLoad %v4float %x_GLF_color
+        %246 = OpCompositeConstruct %main_out %245
+        %244 = OpFunctionCall %void %tint_symbol_3 %246
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..6e36ff7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/1.spvasm.expected.wgsl
@@ -0,0 +1,197 @@
+[[block]]
+struct buf1 {
+  resolution : vec2<f32>;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_13 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn checkSwap_f1_f1_(a : ptr<function, f32>, b : ptr<function, f32>) -> bool {
+  var x_147 : bool;
+  var x_158 : f32;
+  var x_159 : f32;
+  var x_179 : f32;
+  var x_178 : f32;
+  var x_185 : f32;
+  var x_184 : f32;
+  var x_160_phi : f32;
+  var x_180_phi : f32;
+  var x_186_phi : f32;
+  let x_149 : f32 = gl_FragCoord.y;
+  let x_151 : f32 = x_9.resolution.y;
+  let x_153 : bool = (x_149 < (x_151 / 2.0));
+  if (x_153) {
+    x_158 = *(a);
+    x_160_phi = x_158;
+  } else {
+    x_159 = 0.0;
+    x_160_phi = x_159;
+  }
+  var x_166 : f32;
+  var x_167 : f32;
+  var x_168_phi : f32;
+  let x_160 : f32 = x_160_phi;
+  var guard155 : bool = true;
+  if (false) {
+  } else {
+    if (guard155) {
+      if (x_153) {
+        x_166 = *(b);
+        x_168_phi = x_166;
+      } else {
+        x_167 = 0.0;
+        x_168_phi = x_167;
+      }
+      let x_168 : f32 = x_168_phi;
+      let x_169 : bool = (x_160 > x_168);
+      if (x_153) {
+        x_147 = x_169;
+      }
+      if (true) {
+      } else {
+        guard155 = false;
+      }
+      if (guard155) {
+        guard155 = false;
+      }
+    }
+  }
+  if (x_153) {
+    x_179 = 0.0;
+    x_180_phi = x_179;
+  } else {
+    x_178 = *(a);
+    x_180_phi = x_178;
+  }
+  let x_180 : f32 = x_180_phi;
+  if (x_153) {
+    x_185 = 0.0;
+    x_186_phi = x_185;
+  } else {
+    x_184 = *(b);
+    x_186_phi = x_184;
+  }
+  let x_186 : f32 = x_186_phi;
+  if (x_153) {
+  } else {
+    x_147 = (x_180 < x_186);
+  }
+  let x_191 : bool = x_147;
+  return x_191;
+}
+
+fn main_1() {
+  var i : i32;
+  var data : array<f32, 10>;
+  var i_1 : i32;
+  var j : i32;
+  var doSwap : bool;
+  var param : f32;
+  var param_1 : f32;
+  var temp : f32;
+  i = 0;
+  loop {
+    let x_59 : i32 = i;
+    if ((x_59 < 10)) {
+    } else {
+      break;
+    }
+    let x_62 : i32 = i;
+    let x_63 : i32 = i;
+    let x_67 : f32 = x_13.injectionSwitch.y;
+    data[x_62] = (f32((10 - x_63)) * x_67);
+
+    continuing {
+      let x_70 : i32 = i;
+      i = (x_70 + 1);
+    }
+  }
+  i_1 = 0;
+  loop {
+    let x_76 : i32 = i_1;
+    if ((x_76 < 9)) {
+    } else {
+      break;
+    }
+    j = 0;
+    loop {
+      let x_83 : i32 = j;
+      if ((x_83 < 10)) {
+      } else {
+        break;
+      }
+      let x_86 : i32 = j;
+      let x_87 : i32 = i_1;
+      if ((x_86 < (x_87 + 1))) {
+        continue;
+      }
+      let x_92 : i32 = i_1;
+      let x_93 : i32 = j;
+      let x_95 : f32 = data[x_92];
+      param = x_95;
+      let x_97 : f32 = data[x_93];
+      param_1 = x_97;
+      let x_98 : bool = checkSwap_f1_f1_(&(param), &(param_1));
+      doSwap = x_98;
+      let x_99 : bool = doSwap;
+      if (x_99) {
+        let x_102 : i32 = i_1;
+        let x_104 : f32 = data[x_102];
+        temp = x_104;
+        let x_105 : i32 = i_1;
+        let x_106 : i32 = j;
+        let x_108 : f32 = data[x_106];
+        data[x_105] = x_108;
+        let x_110 : i32 = j;
+        let x_111 : f32 = temp;
+        data[x_110] = x_111;
+      }
+
+      continuing {
+        let x_113 : i32 = j;
+        j = (x_113 + 1);
+      }
+    }
+
+    continuing {
+      let x_115 : i32 = i_1;
+      i_1 = (x_115 + 1);
+    }
+  }
+  let x_118 : f32 = gl_FragCoord.x;
+  let x_120 : f32 = x_9.resolution.x;
+  if ((x_118 < (x_120 / 2.0))) {
+    let x_127 : f32 = data[0];
+    let x_130 : f32 = data[5];
+    let x_133 : f32 = data[9];
+    x_GLF_color = vec4<f32>((x_127 / 10.0), (x_130 / 10.0), (x_133 / 10.0), 1.0);
+  } else {
+    let x_137 : f32 = data[5];
+    let x_140 : f32 = data[9];
+    let x_143 : f32 = data[0];
+    x_GLF_color = vec4<f32>((x_137 / 10.0), (x_140 / 10.0), (x_143 / 10.0), 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/1.wgsl
new file mode 100644
index 0000000..6e36ff7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/1.wgsl
@@ -0,0 +1,197 @@
+[[block]]
+struct buf1 {
+  resolution : vec2<f32>;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_13 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn checkSwap_f1_f1_(a : ptr<function, f32>, b : ptr<function, f32>) -> bool {
+  var x_147 : bool;
+  var x_158 : f32;
+  var x_159 : f32;
+  var x_179 : f32;
+  var x_178 : f32;
+  var x_185 : f32;
+  var x_184 : f32;
+  var x_160_phi : f32;
+  var x_180_phi : f32;
+  var x_186_phi : f32;
+  let x_149 : f32 = gl_FragCoord.y;
+  let x_151 : f32 = x_9.resolution.y;
+  let x_153 : bool = (x_149 < (x_151 / 2.0));
+  if (x_153) {
+    x_158 = *(a);
+    x_160_phi = x_158;
+  } else {
+    x_159 = 0.0;
+    x_160_phi = x_159;
+  }
+  var x_166 : f32;
+  var x_167 : f32;
+  var x_168_phi : f32;
+  let x_160 : f32 = x_160_phi;
+  var guard155 : bool = true;
+  if (false) {
+  } else {
+    if (guard155) {
+      if (x_153) {
+        x_166 = *(b);
+        x_168_phi = x_166;
+      } else {
+        x_167 = 0.0;
+        x_168_phi = x_167;
+      }
+      let x_168 : f32 = x_168_phi;
+      let x_169 : bool = (x_160 > x_168);
+      if (x_153) {
+        x_147 = x_169;
+      }
+      if (true) {
+      } else {
+        guard155 = false;
+      }
+      if (guard155) {
+        guard155 = false;
+      }
+    }
+  }
+  if (x_153) {
+    x_179 = 0.0;
+    x_180_phi = x_179;
+  } else {
+    x_178 = *(a);
+    x_180_phi = x_178;
+  }
+  let x_180 : f32 = x_180_phi;
+  if (x_153) {
+    x_185 = 0.0;
+    x_186_phi = x_185;
+  } else {
+    x_184 = *(b);
+    x_186_phi = x_184;
+  }
+  let x_186 : f32 = x_186_phi;
+  if (x_153) {
+  } else {
+    x_147 = (x_180 < x_186);
+  }
+  let x_191 : bool = x_147;
+  return x_191;
+}
+
+fn main_1() {
+  var i : i32;
+  var data : array<f32, 10>;
+  var i_1 : i32;
+  var j : i32;
+  var doSwap : bool;
+  var param : f32;
+  var param_1 : f32;
+  var temp : f32;
+  i = 0;
+  loop {
+    let x_59 : i32 = i;
+    if ((x_59 < 10)) {
+    } else {
+      break;
+    }
+    let x_62 : i32 = i;
+    let x_63 : i32 = i;
+    let x_67 : f32 = x_13.injectionSwitch.y;
+    data[x_62] = (f32((10 - x_63)) * x_67);
+
+    continuing {
+      let x_70 : i32 = i;
+      i = (x_70 + 1);
+    }
+  }
+  i_1 = 0;
+  loop {
+    let x_76 : i32 = i_1;
+    if ((x_76 < 9)) {
+    } else {
+      break;
+    }
+    j = 0;
+    loop {
+      let x_83 : i32 = j;
+      if ((x_83 < 10)) {
+      } else {
+        break;
+      }
+      let x_86 : i32 = j;
+      let x_87 : i32 = i_1;
+      if ((x_86 < (x_87 + 1))) {
+        continue;
+      }
+      let x_92 : i32 = i_1;
+      let x_93 : i32 = j;
+      let x_95 : f32 = data[x_92];
+      param = x_95;
+      let x_97 : f32 = data[x_93];
+      param_1 = x_97;
+      let x_98 : bool = checkSwap_f1_f1_(&(param), &(param_1));
+      doSwap = x_98;
+      let x_99 : bool = doSwap;
+      if (x_99) {
+        let x_102 : i32 = i_1;
+        let x_104 : f32 = data[x_102];
+        temp = x_104;
+        let x_105 : i32 = i_1;
+        let x_106 : i32 = j;
+        let x_108 : f32 = data[x_106];
+        data[x_105] = x_108;
+        let x_110 : i32 = j;
+        let x_111 : f32 = temp;
+        data[x_110] = x_111;
+      }
+
+      continuing {
+        let x_113 : i32 = j;
+        j = (x_113 + 1);
+      }
+    }
+
+    continuing {
+      let x_115 : i32 = i_1;
+      i_1 = (x_115 + 1);
+    }
+  }
+  let x_118 : f32 = gl_FragCoord.x;
+  let x_120 : f32 = x_9.resolution.x;
+  if ((x_118 < (x_120 / 2.0))) {
+    let x_127 : f32 = data[0];
+    let x_130 : f32 = data[5];
+    let x_133 : f32 = data[9];
+    x_GLF_color = vec4<f32>((x_127 / 10.0), (x_130 / 10.0), (x_133 / 10.0), 1.0);
+  } else {
+    let x_137 : f32 = data[5];
+    let x_140 : f32 = data[9];
+    let x_143 : f32 = data[0];
+    x_GLF_color = vec4<f32>((x_137 / 10.0), (x_140 / 10.0), (x_143 / 10.0), 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..8afa23d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/1.wgsl.expected.hlsl
@@ -0,0 +1,161 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_9 : register(b1, space0) {
+  uint4 x_9[1];
+};
+cbuffer cbuffer_x_13 : register(b0, space0) {
+  uint4 x_13[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+bool checkSwap_f1_f1_(inout float a, inout float b) {
+  bool x_147 = false;
+  float x_158 = 0.0f;
+  float x_159 = 0.0f;
+  float x_179 = 0.0f;
+  float x_178 = 0.0f;
+  float x_185 = 0.0f;
+  float x_184 = 0.0f;
+  float x_160_phi = 0.0f;
+  float x_180_phi = 0.0f;
+  float x_186_phi = 0.0f;
+  const float x_149 = gl_FragCoord.y;
+  const float x_151 = asfloat(x_9[0].y);
+  const bool x_153 = (x_149 < (x_151 / 2.0f));
+  if (x_153) {
+    x_158 = a;
+    x_160_phi = x_158;
+  } else {
+    x_159 = 0.0f;
+    x_160_phi = x_159;
+  }
+  float x_166 = 0.0f;
+  float x_167 = 0.0f;
+  float x_168_phi = 0.0f;
+  const float x_160 = x_160_phi;
+  bool guard155 = true;
+  if (false) {
+  } else {
+    if (guard155) {
+      if (x_153) {
+        x_166 = b;
+        x_168_phi = x_166;
+      } else {
+        x_167 = 0.0f;
+        x_168_phi = x_167;
+      }
+      const bool x_169 = (x_160 > x_168_phi);
+      if (x_153) {
+        x_147 = x_169;
+      }
+      if (true) {
+      } else {
+        guard155 = false;
+      }
+      if (guard155) {
+        guard155 = false;
+      }
+    }
+  }
+  if (x_153) {
+    x_179 = 0.0f;
+    x_180_phi = x_179;
+  } else {
+    x_178 = a;
+    x_180_phi = x_178;
+  }
+  const float x_180 = x_180_phi;
+  if (x_153) {
+    x_185 = 0.0f;
+    x_186_phi = x_185;
+  } else {
+    x_184 = b;
+    x_186_phi = x_184;
+  }
+  const float x_186 = x_186_phi;
+  if (x_153) {
+  } else {
+    x_147 = (x_180 < x_186);
+  }
+  return x_147;
+}
+
+void main_1() {
+  int i = 0;
+  float data[10] = (float[10])0;
+  int i_1 = 0;
+  int j = 0;
+  bool doSwap = false;
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  float temp = 0.0f;
+  i = 0;
+  {
+    for(; (i < 10); i = (i + 1)) {
+      const int x_62 = i;
+      const int x_63 = i;
+      const float x_67 = asfloat(x_13[0].y);
+      data[x_62] = (float((10 - x_63)) * x_67);
+    }
+  }
+  i_1 = 0;
+  {
+    for(; (i_1 < 9); i_1 = (i_1 + 1)) {
+      j = 0;
+      {
+        for(; (j < 10); j = (j + 1)) {
+          if ((j < (i_1 + 1))) {
+            continue;
+          }
+          const int x_93 = j;
+          const float x_95 = data[i_1];
+          param = x_95;
+          const float x_97 = data[x_93];
+          param_1 = x_97;
+          const bool x_98 = checkSwap_f1_f1_(param, param_1);
+          doSwap = x_98;
+          if (doSwap) {
+            const float x_104 = data[i_1];
+            temp = x_104;
+            const int x_105 = i_1;
+            const float x_108 = data[j];
+            data[x_105] = x_108;
+            data[j] = temp;
+          }
+        }
+      }
+    }
+  }
+  const float x_118 = gl_FragCoord.x;
+  const float x_120 = asfloat(x_9[0].x);
+  if ((x_118 < (x_120 / 2.0f))) {
+    const float x_127 = data[0];
+    const float x_130 = data[5];
+    const float x_133 = data[9];
+    x_GLF_color = float4((x_127 / 10.0f), (x_130 / 10.0f), (x_133 / 10.0f), 1.0f);
+  } else {
+    const float x_137 = data[5];
+    const float x_140 = data[9];
+    const float x_143 = data[0];
+    x_GLF_color = float4((x_137 / 10.0f), (x_140 / 10.0f), (x_143 / 10.0f), 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/1.wgsl.expected.msl
new file mode 100644
index 0000000..3475e45
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/1.wgsl.expected.msl
@@ -0,0 +1,198 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf1 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  float arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+bool checkSwap_f1_f1_(constant buf1& x_9, thread float* const a, thread float* const b, thread float4* const tint_symbol_5) {
+  bool x_147 = false;
+  float x_158 = 0.0f;
+  float x_159 = 0.0f;
+  float x_179 = 0.0f;
+  float x_178 = 0.0f;
+  float x_185 = 0.0f;
+  float x_184 = 0.0f;
+  float x_160_phi = 0.0f;
+  float x_180_phi = 0.0f;
+  float x_186_phi = 0.0f;
+  float const x_149 = (*(tint_symbol_5)).y;
+  float const x_151 = x_9.resolution.y;
+  bool const x_153 = (x_149 < (x_151 / 2.0f));
+  if (x_153) {
+    x_158 = *(a);
+    x_160_phi = x_158;
+  } else {
+    x_159 = 0.0f;
+    x_160_phi = x_159;
+  }
+  float x_166 = 0.0f;
+  float x_167 = 0.0f;
+  float x_168_phi = 0.0f;
+  float const x_160 = x_160_phi;
+  bool guard155 = true;
+  if (false) {
+  } else {
+    if (guard155) {
+      if (x_153) {
+        x_166 = *(b);
+        x_168_phi = x_166;
+      } else {
+        x_167 = 0.0f;
+        x_168_phi = x_167;
+      }
+      float const x_168 = x_168_phi;
+      bool const x_169 = (x_160 > x_168);
+      if (x_153) {
+        x_147 = x_169;
+      }
+      if (true) {
+      } else {
+        guard155 = false;
+      }
+      if (guard155) {
+        guard155 = false;
+      }
+    }
+  }
+  if (x_153) {
+    x_179 = 0.0f;
+    x_180_phi = x_179;
+  } else {
+    x_178 = *(a);
+    x_180_phi = x_178;
+  }
+  float const x_180 = x_180_phi;
+  if (x_153) {
+    x_185 = 0.0f;
+    x_186_phi = x_185;
+  } else {
+    x_184 = *(b);
+    x_186_phi = x_184;
+  }
+  float const x_186 = x_186_phi;
+  if (x_153) {
+  } else {
+    x_147 = (x_180 < x_186);
+  }
+  bool const x_191 = x_147;
+  return x_191;
+}
+
+void main_1(constant buf0& x_13, constant buf1& x_9, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  int i = 0;
+  tint_array_wrapper data = {};
+  int i_1 = 0;
+  int j = 0;
+  bool doSwap = false;
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  float temp = 0.0f;
+  i = 0;
+  while (true) {
+    int const x_59 = i;
+    if ((x_59 < 10)) {
+    } else {
+      break;
+    }
+    int const x_62 = i;
+    int const x_63 = i;
+    float const x_67 = x_13.injectionSwitch.y;
+    data.arr[x_62] = (float((10 - x_63)) * x_67);
+    {
+      int const x_70 = i;
+      i = (x_70 + 1);
+    }
+  }
+  i_1 = 0;
+  while (true) {
+    int const x_76 = i_1;
+    if ((x_76 < 9)) {
+    } else {
+      break;
+    }
+    j = 0;
+    while (true) {
+      int const x_83 = j;
+      if ((x_83 < 10)) {
+      } else {
+        break;
+      }
+      int const x_86 = j;
+      int const x_87 = i_1;
+      if ((x_86 < (x_87 + 1))) {
+        {
+          int const x_113 = j;
+          j = (x_113 + 1);
+        }
+        continue;
+      }
+      int const x_92 = i_1;
+      int const x_93 = j;
+      float const x_95 = data.arr[x_92];
+      param = x_95;
+      float const x_97 = data.arr[x_93];
+      param_1 = x_97;
+      bool const x_98 = checkSwap_f1_f1_(x_9, &(param), &(param_1), tint_symbol_6);
+      doSwap = x_98;
+      bool const x_99 = doSwap;
+      if (x_99) {
+        int const x_102 = i_1;
+        float const x_104 = data.arr[x_102];
+        temp = x_104;
+        int const x_105 = i_1;
+        int const x_106 = j;
+        float const x_108 = data.arr[x_106];
+        data.arr[x_105] = x_108;
+        int const x_110 = j;
+        float const x_111 = temp;
+        data.arr[x_110] = x_111;
+      }
+      {
+        int const x_113 = j;
+        j = (x_113 + 1);
+      }
+    }
+    {
+      int const x_115 = i_1;
+      i_1 = (x_115 + 1);
+    }
+  }
+  float const x_118 = (*(tint_symbol_6)).x;
+  float const x_120 = x_9.resolution.x;
+  if ((x_118 < (x_120 / 2.0f))) {
+    float const x_127 = data.arr[0];
+    float const x_130 = data.arr[5];
+    float const x_133 = data.arr[9];
+    *(tint_symbol_7) = float4((x_127 / 10.0f), (x_130 / 10.0f), (x_133 / 10.0f), 1.0f);
+  } else {
+    float const x_137 = data.arr[5];
+    float const x_140 = data.arr[9];
+    float const x_143 = data.arr[0];
+    *(tint_symbol_7) = float4((x_137 / 10.0f), (x_140 / 10.0f), (x_143 / 10.0f), 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_13 [[buffer(0)]], constant buf1& x_9 [[buffer(1)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_13, x_9, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..75d9c10
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/1.wgsl.expected.spvasm
@@ -0,0 +1,424 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 247
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "resolution"
+               OpName %x_9 "x_9"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_13 "x_13"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %checkSwap_f1_f1_ "checkSwap_f1_f1_"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %x_147 "x_147"
+               OpName %x_158 "x_158"
+               OpName %x_159 "x_159"
+               OpName %x_179 "x_179"
+               OpName %x_178 "x_178"
+               OpName %x_185 "x_185"
+               OpName %x_184 "x_184"
+               OpName %x_160_phi "x_160_phi"
+               OpName %x_180_phi "x_180_phi"
+               OpName %x_186_phi "x_186_phi"
+               OpName %x_166 "x_166"
+               OpName %x_167 "x_167"
+               OpName %x_168_phi "x_168_phi"
+               OpName %guard155 "guard155"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %data "data"
+               OpName %i_1 "i_1"
+               OpName %j "j"
+               OpName %doSwap "doSwap"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %temp "temp"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_13 NonWritable
+               OpDecorate %x_13 DescriptorSet 0
+               OpDecorate %x_13 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_float_uint_10 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_9 = OpVariable %_ptr_Uniform_buf1 Uniform
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_13 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %bool = OpTypeBool
+%_ptr_Function_float = OpTypePointer Function %float
+         %18 = OpTypeFunction %bool %_ptr_Function_float %_ptr_Function_float
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %27 = OpConstantNull %bool
+         %29 = OpConstantNull %float
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_2 = OpConstant %float 2
+    %float_0 = OpConstant %float 0
+       %true = OpConstantTrue %bool
+      %false = OpConstantFalse %bool
+       %void = OpTypeVoid
+        %109 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+        %116 = OpConstantNull %int
+    %uint_10 = OpConstant %uint 10
+%_arr_float_uint_10 = OpTypeArray %float %uint_10
+%_ptr_Function__arr_float_uint_10 = OpTypePointer Function %_arr_float_uint_10
+        %121 = OpConstantNull %_arr_float_uint_10
+      %int_0 = OpConstant %int 0
+     %int_10 = OpConstant %int 10
+      %int_1 = OpConstant %int 1
+      %int_9 = OpConstant %int 9
+      %int_5 = OpConstant %int 5
+   %float_10 = OpConstant %float 10
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %234 = OpTypeFunction %void %main_out
+%checkSwap_f1_f1_ = OpFunction %bool None %18
+          %a = OpFunctionParameter %_ptr_Function_float
+          %b = OpFunctionParameter %_ptr_Function_float
+         %24 = OpLabel
+      %x_147 = OpVariable %_ptr_Function_bool Function %27
+      %x_158 = OpVariable %_ptr_Function_float Function %29
+      %x_159 = OpVariable %_ptr_Function_float Function %29
+      %x_179 = OpVariable %_ptr_Function_float Function %29
+      %x_178 = OpVariable %_ptr_Function_float Function %29
+      %x_185 = OpVariable %_ptr_Function_float Function %29
+      %x_184 = OpVariable %_ptr_Function_float Function %29
+  %x_160_phi = OpVariable %_ptr_Function_float Function %29
+  %x_180_phi = OpVariable %_ptr_Function_float Function %29
+  %x_186_phi = OpVariable %_ptr_Function_float Function %29
+      %x_166 = OpVariable %_ptr_Function_float Function %29
+      %x_167 = OpVariable %_ptr_Function_float Function %29
+  %x_168_phi = OpVariable %_ptr_Function_float Function %29
+   %guard155 = OpVariable %_ptr_Function_bool Function %27
+         %41 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %42 = OpLoad %float %41
+         %45 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_1
+         %46 = OpLoad %float %45
+         %48 = OpFDiv %float %46 %float_2
+         %49 = OpFOrdLessThan %bool %42 %48
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %52
+         %51 = OpLabel
+         %54 = OpLoad %float %a
+               OpStore %x_158 %54
+         %55 = OpLoad %float %x_158
+               OpStore %x_160_phi %55
+               OpBranch %50
+         %52 = OpLabel
+               OpStore %x_159 %float_0
+         %57 = OpLoad %float %x_159
+               OpStore %x_160_phi %57
+               OpBranch %50
+         %50 = OpLabel
+         %61 = OpLoad %float %x_160_phi
+               OpStore %guard155 %true
+               OpSelectionMerge %65 None
+               OpBranchConditional %false %66 %67
+         %66 = OpLabel
+               OpBranch %65
+         %67 = OpLabel
+         %68 = OpLoad %bool %guard155
+               OpSelectionMerge %69 None
+               OpBranchConditional %68 %70 %69
+         %70 = OpLabel
+               OpSelectionMerge %71 None
+               OpBranchConditional %49 %72 %73
+         %72 = OpLabel
+         %75 = OpLoad %float %b
+               OpStore %x_166 %75
+         %76 = OpLoad %float %x_166
+               OpStore %x_168_phi %76
+               OpBranch %71
+         %73 = OpLabel
+               OpStore %x_167 %float_0
+         %77 = OpLoad %float %x_167
+               OpStore %x_168_phi %77
+               OpBranch %71
+         %71 = OpLabel
+         %78 = OpLoad %float %x_168_phi
+         %79 = OpFOrdGreaterThan %bool %61 %78
+               OpSelectionMerge %80 None
+               OpBranchConditional %49 %81 %80
+         %81 = OpLabel
+               OpStore %x_147 %79
+               OpBranch %80
+         %80 = OpLabel
+               OpSelectionMerge %82 None
+               OpBranchConditional %true %83 %84
+         %83 = OpLabel
+               OpBranch %82
+         %84 = OpLabel
+               OpStore %guard155 %false
+               OpBranch %82
+         %82 = OpLabel
+         %85 = OpLoad %bool %guard155
+               OpSelectionMerge %86 None
+               OpBranchConditional %85 %87 %86
+         %87 = OpLabel
+               OpStore %guard155 %false
+               OpBranch %86
+         %86 = OpLabel
+               OpBranch %69
+         %69 = OpLabel
+               OpBranch %65
+         %65 = OpLabel
+               OpSelectionMerge %88 None
+               OpBranchConditional %49 %89 %90
+         %89 = OpLabel
+               OpStore %x_179 %float_0
+         %91 = OpLoad %float %x_179
+               OpStore %x_180_phi %91
+               OpBranch %88
+         %90 = OpLabel
+         %93 = OpLoad %float %a
+               OpStore %x_178 %93
+         %94 = OpLoad %float %x_178
+               OpStore %x_180_phi %94
+               OpBranch %88
+         %88 = OpLabel
+         %95 = OpLoad %float %x_180_phi
+               OpSelectionMerge %96 None
+               OpBranchConditional %49 %97 %98
+         %97 = OpLabel
+               OpStore %x_185 %float_0
+         %99 = OpLoad %float %x_185
+               OpStore %x_186_phi %99
+               OpBranch %96
+         %98 = OpLabel
+        %101 = OpLoad %float %b
+               OpStore %x_184 %101
+        %102 = OpLoad %float %x_184
+               OpStore %x_186_phi %102
+               OpBranch %96
+         %96 = OpLabel
+        %103 = OpLoad %float %x_186_phi
+               OpSelectionMerge %104 None
+               OpBranchConditional %49 %105 %106
+        %105 = OpLabel
+               OpBranch %104
+        %106 = OpLabel
+        %107 = OpFOrdLessThan %bool %95 %103
+               OpStore %x_147 %107
+               OpBranch %104
+        %104 = OpLabel
+        %108 = OpLoad %bool %x_147
+               OpReturnValue %108
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %109
+        %112 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %116
+       %data = OpVariable %_ptr_Function__arr_float_uint_10 Function %121
+        %i_1 = OpVariable %_ptr_Function_int Function %116
+          %j = OpVariable %_ptr_Function_int Function %116
+     %doSwap = OpVariable %_ptr_Function_bool Function %27
+      %param = OpVariable %_ptr_Function_float Function %29
+    %param_1 = OpVariable %_ptr_Function_float Function %29
+       %temp = OpVariable %_ptr_Function_float Function %29
+               OpStore %i %int_0
+               OpBranch %129
+        %129 = OpLabel
+               OpLoopMerge %130 %131 None
+               OpBranch %132
+        %132 = OpLabel
+        %133 = OpLoad %int %i
+        %135 = OpSLessThan %bool %133 %int_10
+               OpSelectionMerge %136 None
+               OpBranchConditional %135 %137 %138
+        %137 = OpLabel
+               OpBranch %136
+        %138 = OpLabel
+               OpBranch %130
+        %136 = OpLabel
+        %139 = OpLoad %int %i
+        %140 = OpLoad %int %i
+        %141 = OpAccessChain %_ptr_Uniform_float %x_13 %uint_0 %uint_1
+        %142 = OpLoad %float %141
+        %143 = OpAccessChain %_ptr_Function_float %data %139
+        %145 = OpISub %int %int_10 %140
+        %144 = OpConvertSToF %float %145
+        %146 = OpFMul %float %144 %142
+               OpStore %143 %146
+               OpBranch %131
+        %131 = OpLabel
+        %147 = OpLoad %int %i
+        %149 = OpIAdd %int %147 %int_1
+               OpStore %i %149
+               OpBranch %129
+        %130 = OpLabel
+               OpStore %i_1 %int_0
+               OpBranch %150
+        %150 = OpLabel
+               OpLoopMerge %151 %152 None
+               OpBranch %153
+        %153 = OpLabel
+        %154 = OpLoad %int %i_1
+        %156 = OpSLessThan %bool %154 %int_9
+               OpSelectionMerge %157 None
+               OpBranchConditional %156 %158 %159
+        %158 = OpLabel
+               OpBranch %157
+        %159 = OpLabel
+               OpBranch %151
+        %157 = OpLabel
+               OpStore %j %int_0
+               OpBranch %160
+        %160 = OpLabel
+               OpLoopMerge %161 %162 None
+               OpBranch %163
+        %163 = OpLabel
+        %164 = OpLoad %int %j
+        %165 = OpSLessThan %bool %164 %int_10
+               OpSelectionMerge %166 None
+               OpBranchConditional %165 %167 %168
+        %167 = OpLabel
+               OpBranch %166
+        %168 = OpLabel
+               OpBranch %161
+        %166 = OpLabel
+        %169 = OpLoad %int %j
+        %170 = OpLoad %int %i_1
+        %171 = OpIAdd %int %170 %int_1
+        %172 = OpSLessThan %bool %169 %171
+               OpSelectionMerge %173 None
+               OpBranchConditional %172 %174 %173
+        %174 = OpLabel
+               OpBranch %162
+        %173 = OpLabel
+        %175 = OpLoad %int %i_1
+        %176 = OpLoad %int %j
+        %177 = OpAccessChain %_ptr_Function_float %data %175
+        %178 = OpLoad %float %177
+               OpStore %param %178
+        %179 = OpAccessChain %_ptr_Function_float %data %176
+        %180 = OpLoad %float %179
+               OpStore %param_1 %180
+        %181 = OpFunctionCall %bool %checkSwap_f1_f1_ %param %param_1
+               OpStore %doSwap %181
+        %184 = OpLoad %bool %doSwap
+               OpSelectionMerge %185 None
+               OpBranchConditional %184 %186 %185
+        %186 = OpLabel
+        %187 = OpLoad %int %i_1
+        %188 = OpAccessChain %_ptr_Function_float %data %187
+        %189 = OpLoad %float %188
+               OpStore %temp %189
+        %190 = OpLoad %int %i_1
+        %191 = OpLoad %int %j
+        %192 = OpAccessChain %_ptr_Function_float %data %191
+        %193 = OpLoad %float %192
+        %194 = OpAccessChain %_ptr_Function_float %data %190
+               OpStore %194 %193
+        %195 = OpLoad %int %j
+        %196 = OpLoad %float %temp
+        %197 = OpAccessChain %_ptr_Function_float %data %195
+               OpStore %197 %196
+               OpBranch %185
+        %185 = OpLabel
+               OpBranch %162
+        %162 = OpLabel
+        %198 = OpLoad %int %j
+        %199 = OpIAdd %int %198 %int_1
+               OpStore %j %199
+               OpBranch %160
+        %161 = OpLabel
+               OpBranch %152
+        %152 = OpLabel
+        %200 = OpLoad %int %i_1
+        %201 = OpIAdd %int %200 %int_1
+               OpStore %i_1 %201
+               OpBranch %150
+        %151 = OpLabel
+        %202 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+        %203 = OpLoad %float %202
+        %204 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_0
+        %205 = OpLoad %float %204
+        %206 = OpFDiv %float %205 %float_2
+        %207 = OpFOrdLessThan %bool %203 %206
+               OpSelectionMerge %208 None
+               OpBranchConditional %207 %209 %210
+        %209 = OpLabel
+        %211 = OpAccessChain %_ptr_Function_float %data %int_0
+        %212 = OpLoad %float %211
+        %214 = OpAccessChain %_ptr_Function_float %data %int_5
+        %215 = OpLoad %float %214
+        %216 = OpAccessChain %_ptr_Function_float %data %int_9
+        %217 = OpLoad %float %216
+        %219 = OpFDiv %float %212 %float_10
+        %220 = OpFDiv %float %215 %float_10
+        %221 = OpFDiv %float %217 %float_10
+        %223 = OpCompositeConstruct %v4float %219 %220 %221 %float_1
+               OpStore %x_GLF_color %223
+               OpBranch %208
+        %210 = OpLabel
+        %224 = OpAccessChain %_ptr_Function_float %data %int_5
+        %225 = OpLoad %float %224
+        %226 = OpAccessChain %_ptr_Function_float %data %int_9
+        %227 = OpLoad %float %226
+        %228 = OpAccessChain %_ptr_Function_float %data %int_0
+        %229 = OpLoad %float %228
+        %230 = OpFDiv %float %225 %float_10
+        %231 = OpFDiv %float %227 %float_10
+        %232 = OpFDiv %float %229 %float_10
+        %233 = OpCompositeConstruct %v4float %230 %231 %232 %float_1
+               OpStore %x_GLF_color %233
+               OpBranch %208
+        %208 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %234
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %238 = OpLabel
+        %239 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %239
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %109
+        %241 = OpLabel
+        %242 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %242
+        %243 = OpFunctionCall %void %main_1
+        %245 = OpLoad %v4float %x_GLF_color
+        %246 = OpCompositeConstruct %main_out %245
+        %244 = OpFunctionCall %void %tint_symbol_3 %246
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..6e36ff7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-bubblesort-flag-complex-conditionals/1.wgsl.expected.wgsl
@@ -0,0 +1,197 @@
+[[block]]
+struct buf1 {
+  resolution : vec2<f32>;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_13 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn checkSwap_f1_f1_(a : ptr<function, f32>, b : ptr<function, f32>) -> bool {
+  var x_147 : bool;
+  var x_158 : f32;
+  var x_159 : f32;
+  var x_179 : f32;
+  var x_178 : f32;
+  var x_185 : f32;
+  var x_184 : f32;
+  var x_160_phi : f32;
+  var x_180_phi : f32;
+  var x_186_phi : f32;
+  let x_149 : f32 = gl_FragCoord.y;
+  let x_151 : f32 = x_9.resolution.y;
+  let x_153 : bool = (x_149 < (x_151 / 2.0));
+  if (x_153) {
+    x_158 = *(a);
+    x_160_phi = x_158;
+  } else {
+    x_159 = 0.0;
+    x_160_phi = x_159;
+  }
+  var x_166 : f32;
+  var x_167 : f32;
+  var x_168_phi : f32;
+  let x_160 : f32 = x_160_phi;
+  var guard155 : bool = true;
+  if (false) {
+  } else {
+    if (guard155) {
+      if (x_153) {
+        x_166 = *(b);
+        x_168_phi = x_166;
+      } else {
+        x_167 = 0.0;
+        x_168_phi = x_167;
+      }
+      let x_168 : f32 = x_168_phi;
+      let x_169 : bool = (x_160 > x_168);
+      if (x_153) {
+        x_147 = x_169;
+      }
+      if (true) {
+      } else {
+        guard155 = false;
+      }
+      if (guard155) {
+        guard155 = false;
+      }
+    }
+  }
+  if (x_153) {
+    x_179 = 0.0;
+    x_180_phi = x_179;
+  } else {
+    x_178 = *(a);
+    x_180_phi = x_178;
+  }
+  let x_180 : f32 = x_180_phi;
+  if (x_153) {
+    x_185 = 0.0;
+    x_186_phi = x_185;
+  } else {
+    x_184 = *(b);
+    x_186_phi = x_184;
+  }
+  let x_186 : f32 = x_186_phi;
+  if (x_153) {
+  } else {
+    x_147 = (x_180 < x_186);
+  }
+  let x_191 : bool = x_147;
+  return x_191;
+}
+
+fn main_1() {
+  var i : i32;
+  var data : array<f32, 10>;
+  var i_1 : i32;
+  var j : i32;
+  var doSwap : bool;
+  var param : f32;
+  var param_1 : f32;
+  var temp : f32;
+  i = 0;
+  loop {
+    let x_59 : i32 = i;
+    if ((x_59 < 10)) {
+    } else {
+      break;
+    }
+    let x_62 : i32 = i;
+    let x_63 : i32 = i;
+    let x_67 : f32 = x_13.injectionSwitch.y;
+    data[x_62] = (f32((10 - x_63)) * x_67);
+
+    continuing {
+      let x_70 : i32 = i;
+      i = (x_70 + 1);
+    }
+  }
+  i_1 = 0;
+  loop {
+    let x_76 : i32 = i_1;
+    if ((x_76 < 9)) {
+    } else {
+      break;
+    }
+    j = 0;
+    loop {
+      let x_83 : i32 = j;
+      if ((x_83 < 10)) {
+      } else {
+        break;
+      }
+      let x_86 : i32 = j;
+      let x_87 : i32 = i_1;
+      if ((x_86 < (x_87 + 1))) {
+        continue;
+      }
+      let x_92 : i32 = i_1;
+      let x_93 : i32 = j;
+      let x_95 : f32 = data[x_92];
+      param = x_95;
+      let x_97 : f32 = data[x_93];
+      param_1 = x_97;
+      let x_98 : bool = checkSwap_f1_f1_(&(param), &(param_1));
+      doSwap = x_98;
+      let x_99 : bool = doSwap;
+      if (x_99) {
+        let x_102 : i32 = i_1;
+        let x_104 : f32 = data[x_102];
+        temp = x_104;
+        let x_105 : i32 = i_1;
+        let x_106 : i32 = j;
+        let x_108 : f32 = data[x_106];
+        data[x_105] = x_108;
+        let x_110 : i32 = j;
+        let x_111 : f32 = temp;
+        data[x_110] = x_111;
+      }
+
+      continuing {
+        let x_113 : i32 = j;
+        j = (x_113 + 1);
+      }
+    }
+
+    continuing {
+      let x_115 : i32 = i_1;
+      i_1 = (x_115 + 1);
+    }
+  }
+  let x_118 : f32 = gl_FragCoord.x;
+  let x_120 : f32 = x_9.resolution.x;
+  if ((x_118 < (x_120 / 2.0))) {
+    let x_127 : f32 = data[0];
+    let x_130 : f32 = data[5];
+    let x_133 : f32 = data[9];
+    x_GLF_color = vec4<f32>((x_127 / 10.0), (x_130 / 10.0), (x_133 / 10.0), 1.0);
+  } else {
+    let x_137 : f32 = data[5];
+    let x_140 : f32 = data[9];
+    let x_143 : f32 = data[0];
+    x_GLF_color = vec4<f32>((x_137 / 10.0), (x_140 / 10.0), (x_143 / 10.0), 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/0.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/0.spvasm
new file mode 100644
index 0000000..9fa3f85
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/0.spvasm
@@ -0,0 +1,114 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpName %indexable "indexable"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+      %int_2 = OpConstant %int 2
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_8 = OpConstant %float 8
+       %uint = OpTypeInt 32 0
+      %int_8 = OpConstant %int 8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %30 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+  %float_0_5 = OpConstant %float 0.5
+         %32 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+         %33 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+         %34 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+         %35 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+         %36 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+         %37 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+         %38 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+         %39 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %40 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+         %41 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+         %42 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+         %43 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+         %44 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+         %45 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+         %46 = OpConstantComposite %_arr_v4float_uint_16 %30 %32 %33 %34 %35 %36 %37 %38 %30 %39 %40 %41 %42 %43 %44 %45
+     %int_16 = OpConstant %int 16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %main = OpFunction %void None %9
+         %50 = OpLabel
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_16 Function
+         %51 = OpLoad %v4float %gl_FragCoord
+         %52 = OpVectorShuffle %v2float %51 %51 0 1
+         %53 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+         %54 = OpLoad %v2float %53
+         %55 = OpFDiv %v2float %52 %54
+         %56 = OpVectorTimesScalar %v2float %55 %float_8
+         %57 = OpExtInst %v2float %1 Floor %56
+         %58 = OpCompositeExtract %float %57 0
+         %59 = OpConvertFToS %int %58
+         %60 = OpIMul %int %59 %int_8
+         %61 = OpCompositeExtract %float %57 1
+         %62 = OpConvertFToS %int %61
+         %63 = OpIAdd %int %60 %62
+               OpBranch %64
+         %64 = OpLabel
+         %65 = OpPhi %int %int_0 %50 %66 %67
+         %68 = OpPhi %int %63 %50 %69 %67
+         %70 = OpSGreaterThan %bool %68 %int_1
+               OpLoopMerge %71 %67 None
+               OpBranchConditional %70 %72 %71
+         %72 = OpLabel
+         %73 = OpBitwiseAnd %int %68 %int_1
+         %74 = OpIEqual %bool %73 %int_1
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %77
+         %76 = OpLabel
+         %78 = OpIMul %int %int_3 %68
+         %79 = OpIAdd %int %78 %int_1
+               OpBranch %75
+         %77 = OpLabel
+         %80 = OpSDiv %int %68 %int_2
+               OpBranch %75
+         %75 = OpLabel
+         %69 = OpPhi %int %79 %76 %80 %77
+         %66 = OpIAdd %int %65 %int_1
+               OpBranch %67
+         %67 = OpLabel
+               OpBranch %64
+         %71 = OpLabel
+         %81 = OpSMod %int %65 %int_16
+               OpStore %indexable %46
+         %82 = OpAccessChain %_ptr_Function_v4float %indexable %81
+         %83 = OpLoad %v4float %82
+               OpStore %_GLF_color %83
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..74ac34a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/0.spvasm.expected.hlsl
@@ -0,0 +1,65 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 indexable[16] = (float4[16])0;
+  int x_65 = 0;
+  int x_65_phi = 0;
+  int x_68_phi = 0;
+  const float4 x_51 = gl_FragCoord;
+  const float2 x_54 = asfloat(x_6[0].xy);
+  const float2 x_57 = floor(((float2(x_51.x, x_51.y) / x_54) * 8.0f));
+  const int x_63 = ((int(x_57.x) * 8) + int(x_57.y));
+  x_65_phi = 0;
+  x_68_phi = x_63;
+  while (true) {
+    int x_79 = 0;
+    int x_80 = 0;
+    int x_69_phi = 0;
+    x_65 = x_65_phi;
+    const int x_68 = x_68_phi;
+    if ((x_68 > 1)) {
+    } else {
+      break;
+    }
+    if (((x_68 & 1) == 1)) {
+      x_79 = ((3 * x_68) + 1);
+      x_69_phi = x_79;
+    } else {
+      x_80 = (x_68 / 2);
+      x_69_phi = x_80;
+    }
+    const int x_69 = x_69_phi;
+    {
+      x_65_phi = asint((x_65 + asint(1)));
+      x_68_phi = x_69;
+    }
+  }
+  const float4 tint_symbol_5[16] = {float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)};
+  indexable = tint_symbol_5;
+  const float4 x_83 = indexable[asint((x_65 % 16))];
+  x_GLF_color = x_83;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/0.spvasm.expected.msl
new file mode 100644
index 0000000..c9c314f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/0.spvasm.expected.msl
@@ -0,0 +1,67 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  float4 arr[16];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  tint_array_wrapper indexable = {};
+  int x_65 = 0;
+  int x_65_phi = 0;
+  int x_68_phi = 0;
+  float4 const x_51 = *(tint_symbol_6);
+  float2 const x_54 = x_6.resolution;
+  float2 const x_57 = floor(((float2(x_51.x, x_51.y) / x_54) * 8.0f));
+  int const x_63 = ((int(x_57.x) * 8) + int(x_57.y));
+  x_65_phi = 0;
+  x_68_phi = x_63;
+  while (true) {
+    int x_79 = 0;
+    int x_80 = 0;
+    int x_69_phi = 0;
+    x_65 = x_65_phi;
+    int const x_68 = x_68_phi;
+    if ((x_68 > 1)) {
+    } else {
+      break;
+    }
+    if (((x_68 & 1) == 1)) {
+      x_79 = ((3 * x_68) + 1);
+      x_69_phi = x_79;
+    } else {
+      x_80 = (x_68 / 2);
+      x_69_phi = x_80;
+    }
+    int const x_69 = x_69_phi;
+    {
+      x_65_phi = as_type<int>((x_65 + as_type<int>(1)));
+      x_68_phi = x_69;
+    }
+  }
+  tint_array_wrapper const tint_symbol_4 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
+  indexable = tint_symbol_4;
+  float4 const x_83 = indexable.arr[as_type<int>((x_65 % 16))];
+  *(tint_symbol_7) = x_83;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..5b40919
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/0.spvasm.expected.spvasm
@@ -0,0 +1,192 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 123
+; Schema: 0
+               OpCapability Shader
+         %37 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %indexable "indexable"
+               OpName %x_65 "x_65"
+               OpName %x_65_phi "x_65_phi"
+               OpName %x_68_phi "x_68_phi"
+               OpName %x_79 "x_79"
+               OpName %x_80 "x_80"
+               OpName %x_69_phi "x_69_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v4float_uint_16 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+         %24 = OpConstantNull %_arr_v4float_uint_16
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %28 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_8 = OpConstant %float 8
+      %int_8 = OpConstant %int 8
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+      %int_2 = OpConstant %int 2
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %86 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+  %float_0_5 = OpConstant %float 0.5
+         %88 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+         %89 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+         %90 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+         %91 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+         %92 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+         %93 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+         %94 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+         %95 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %96 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+         %97 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+         %98 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+         %99 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+        %100 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+        %101 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+        %102 = OpConstantComposite %_arr_v4float_uint_16 %86 %88 %89 %90 %91 %92 %93 %94 %86 %95 %96 %97 %98 %99 %100 %101
+     %int_16 = OpConstant %int 16
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+   %main_out = OpTypeStruct %v4float
+        %110 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_16 Function %24
+       %x_65 = OpVariable %_ptr_Function_int Function %28
+   %x_65_phi = OpVariable %_ptr_Function_int Function %28
+   %x_68_phi = OpVariable %_ptr_Function_int Function %28
+       %x_79 = OpVariable %_ptr_Function_int Function %28
+       %x_80 = OpVariable %_ptr_Function_int Function %28
+   %x_69_phi = OpVariable %_ptr_Function_int Function %28
+         %31 = OpLoad %v4float %gl_FragCoord
+         %34 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %35 = OpLoad %v2float %34
+         %38 = OpCompositeExtract %float %31 0
+         %39 = OpCompositeExtract %float %31 1
+         %40 = OpCompositeConstruct %v2float %38 %39
+         %41 = OpFDiv %v2float %40 %35
+         %43 = OpVectorTimesScalar %v2float %41 %float_8
+         %36 = OpExtInst %v2float %37 Floor %43
+         %45 = OpCompositeExtract %float %36 0
+         %44 = OpConvertFToS %int %45
+         %47 = OpIMul %int %44 %int_8
+         %49 = OpCompositeExtract %float %36 1
+         %48 = OpConvertFToS %int %49
+         %50 = OpIAdd %int %47 %48
+               OpStore %x_65_phi %int_0
+               OpStore %x_68_phi %50
+               OpBranch %52
+         %52 = OpLabel
+               OpLoopMerge %53 %54 None
+               OpBranch %55
+         %55 = OpLabel
+         %59 = OpLoad %int %x_65_phi
+               OpStore %x_65 %59
+         %60 = OpLoad %int %x_68_phi
+         %62 = OpSGreaterThan %bool %60 %int_1
+               OpSelectionMerge %64 None
+               OpBranchConditional %62 %65 %66
+         %65 = OpLabel
+               OpBranch %64
+         %66 = OpLabel
+               OpBranch %53
+         %64 = OpLabel
+         %67 = OpBitwiseAnd %int %60 %int_1
+         %68 = OpIEqual %bool %67 %int_1
+               OpSelectionMerge %69 None
+               OpBranchConditional %68 %70 %71
+         %70 = OpLabel
+         %73 = OpIMul %int %int_3 %60
+         %74 = OpIAdd %int %73 %int_1
+               OpStore %x_79 %74
+         %75 = OpLoad %int %x_79
+               OpStore %x_69_phi %75
+               OpBranch %69
+         %71 = OpLabel
+         %77 = OpSDiv %int %60 %int_2
+               OpStore %x_80 %77
+         %78 = OpLoad %int %x_80
+               OpStore %x_69_phi %78
+               OpBranch %69
+         %69 = OpLabel
+         %79 = OpLoad %int %x_69_phi
+               OpBranch %54
+         %54 = OpLabel
+         %81 = OpLoad %int %x_65
+         %82 = OpCopyObject %int %int_1
+         %83 = OpIAdd %int %81 %82
+         %80 = OpCopyObject %int %83
+               OpStore %x_65_phi %80
+               OpStore %x_68_phi %79
+               OpBranch %52
+         %53 = OpLabel
+               OpStore %indexable %102
+        %104 = OpLoad %int %x_65
+        %106 = OpSMod %int %104 %int_16
+        %103 = OpCopyObject %int %106
+        %108 = OpAccessChain %_ptr_Function_v4float %indexable %103
+        %109 = OpLoad %v4float %108
+               OpStore %x_GLF_color %109
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %110
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %114 = OpLabel
+        %115 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %115
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %117 = OpLabel
+        %118 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %118
+        %119 = OpFunctionCall %void %main_1
+        %121 = OpLoad %v4float %x_GLF_color
+        %122 = OpCompositeConstruct %main_out %121
+        %120 = OpFunctionCall %void %tint_symbol_3 %122
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..919b5ea
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/0.spvasm.expected.wgsl
@@ -0,0 +1,63 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var indexable : array<vec4<f32>, 16>;
+  var x_65 : i32;
+  var x_65_phi : i32;
+  var x_68_phi : i32;
+  let x_51 : vec4<f32> = gl_FragCoord;
+  let x_54 : vec2<f32> = x_6.resolution;
+  let x_57 : vec2<f32> = floor(((vec2<f32>(x_51.x, x_51.y) / x_54) * 8.0));
+  let x_63 : i32 = ((i32(x_57.x) * 8) + i32(x_57.y));
+  x_65_phi = 0;
+  x_68_phi = x_63;
+  loop {
+    var x_79 : i32;
+    var x_80 : i32;
+    var x_69_phi : i32;
+    x_65 = x_65_phi;
+    let x_68 : i32 = x_68_phi;
+    if ((x_68 > 1)) {
+    } else {
+      break;
+    }
+    if (((x_68 & 1) == 1)) {
+      x_79 = ((3 * x_68) + 1);
+      x_69_phi = x_79;
+    } else {
+      x_80 = (x_68 / 2);
+      x_69_phi = x_80;
+    }
+    let x_69 : i32 = x_69_phi;
+
+    continuing {
+      x_65_phi = bitcast<i32>((x_65 + bitcast<i32>(1)));
+      x_68_phi = x_69;
+    }
+  }
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+  let x_83 : vec4<f32> = indexable[bitcast<i32>((x_65 % 16))];
+  x_GLF_color = x_83;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/0.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/0.wgsl
new file mode 100644
index 0000000..919b5ea
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/0.wgsl
@@ -0,0 +1,63 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var indexable : array<vec4<f32>, 16>;
+  var x_65 : i32;
+  var x_65_phi : i32;
+  var x_68_phi : i32;
+  let x_51 : vec4<f32> = gl_FragCoord;
+  let x_54 : vec2<f32> = x_6.resolution;
+  let x_57 : vec2<f32> = floor(((vec2<f32>(x_51.x, x_51.y) / x_54) * 8.0));
+  let x_63 : i32 = ((i32(x_57.x) * 8) + i32(x_57.y));
+  x_65_phi = 0;
+  x_68_phi = x_63;
+  loop {
+    var x_79 : i32;
+    var x_80 : i32;
+    var x_69_phi : i32;
+    x_65 = x_65_phi;
+    let x_68 : i32 = x_68_phi;
+    if ((x_68 > 1)) {
+    } else {
+      break;
+    }
+    if (((x_68 & 1) == 1)) {
+      x_79 = ((3 * x_68) + 1);
+      x_69_phi = x_79;
+    } else {
+      x_80 = (x_68 / 2);
+      x_69_phi = x_80;
+    }
+    let x_69 : i32 = x_69_phi;
+
+    continuing {
+      x_65_phi = bitcast<i32>((x_65 + bitcast<i32>(1)));
+      x_68_phi = x_69;
+    }
+  }
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+  let x_83 : vec4<f32> = indexable[bitcast<i32>((x_65 % 16))];
+  x_GLF_color = x_83;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..74ac34a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/0.wgsl.expected.hlsl
@@ -0,0 +1,65 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 indexable[16] = (float4[16])0;
+  int x_65 = 0;
+  int x_65_phi = 0;
+  int x_68_phi = 0;
+  const float4 x_51 = gl_FragCoord;
+  const float2 x_54 = asfloat(x_6[0].xy);
+  const float2 x_57 = floor(((float2(x_51.x, x_51.y) / x_54) * 8.0f));
+  const int x_63 = ((int(x_57.x) * 8) + int(x_57.y));
+  x_65_phi = 0;
+  x_68_phi = x_63;
+  while (true) {
+    int x_79 = 0;
+    int x_80 = 0;
+    int x_69_phi = 0;
+    x_65 = x_65_phi;
+    const int x_68 = x_68_phi;
+    if ((x_68 > 1)) {
+    } else {
+      break;
+    }
+    if (((x_68 & 1) == 1)) {
+      x_79 = ((3 * x_68) + 1);
+      x_69_phi = x_79;
+    } else {
+      x_80 = (x_68 / 2);
+      x_69_phi = x_80;
+    }
+    const int x_69 = x_69_phi;
+    {
+      x_65_phi = asint((x_65 + asint(1)));
+      x_68_phi = x_69;
+    }
+  }
+  const float4 tint_symbol_5[16] = {float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)};
+  indexable = tint_symbol_5;
+  const float4 x_83 = indexable[asint((x_65 % 16))];
+  x_GLF_color = x_83;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/0.wgsl.expected.msl
new file mode 100644
index 0000000..c9c314f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/0.wgsl.expected.msl
@@ -0,0 +1,67 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  float4 arr[16];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  tint_array_wrapper indexable = {};
+  int x_65 = 0;
+  int x_65_phi = 0;
+  int x_68_phi = 0;
+  float4 const x_51 = *(tint_symbol_6);
+  float2 const x_54 = x_6.resolution;
+  float2 const x_57 = floor(((float2(x_51.x, x_51.y) / x_54) * 8.0f));
+  int const x_63 = ((int(x_57.x) * 8) + int(x_57.y));
+  x_65_phi = 0;
+  x_68_phi = x_63;
+  while (true) {
+    int x_79 = 0;
+    int x_80 = 0;
+    int x_69_phi = 0;
+    x_65 = x_65_phi;
+    int const x_68 = x_68_phi;
+    if ((x_68 > 1)) {
+    } else {
+      break;
+    }
+    if (((x_68 & 1) == 1)) {
+      x_79 = ((3 * x_68) + 1);
+      x_69_phi = x_79;
+    } else {
+      x_80 = (x_68 / 2);
+      x_69_phi = x_80;
+    }
+    int const x_69 = x_69_phi;
+    {
+      x_65_phi = as_type<int>((x_65 + as_type<int>(1)));
+      x_68_phi = x_69;
+    }
+  }
+  tint_array_wrapper const tint_symbol_4 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
+  indexable = tint_symbol_4;
+  float4 const x_83 = indexable.arr[as_type<int>((x_65 % 16))];
+  *(tint_symbol_7) = x_83;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..5b40919
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/0.wgsl.expected.spvasm
@@ -0,0 +1,192 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 123
+; Schema: 0
+               OpCapability Shader
+         %37 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %indexable "indexable"
+               OpName %x_65 "x_65"
+               OpName %x_65_phi "x_65_phi"
+               OpName %x_68_phi "x_68_phi"
+               OpName %x_79 "x_79"
+               OpName %x_80 "x_80"
+               OpName %x_69_phi "x_69_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v4float_uint_16 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+         %24 = OpConstantNull %_arr_v4float_uint_16
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %28 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_8 = OpConstant %float 8
+      %int_8 = OpConstant %int 8
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+      %int_2 = OpConstant %int 2
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %86 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+  %float_0_5 = OpConstant %float 0.5
+         %88 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+         %89 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+         %90 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+         %91 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+         %92 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+         %93 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+         %94 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+         %95 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %96 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+         %97 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+         %98 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+         %99 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+        %100 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+        %101 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+        %102 = OpConstantComposite %_arr_v4float_uint_16 %86 %88 %89 %90 %91 %92 %93 %94 %86 %95 %96 %97 %98 %99 %100 %101
+     %int_16 = OpConstant %int 16
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+   %main_out = OpTypeStruct %v4float
+        %110 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_16 Function %24
+       %x_65 = OpVariable %_ptr_Function_int Function %28
+   %x_65_phi = OpVariable %_ptr_Function_int Function %28
+   %x_68_phi = OpVariable %_ptr_Function_int Function %28
+       %x_79 = OpVariable %_ptr_Function_int Function %28
+       %x_80 = OpVariable %_ptr_Function_int Function %28
+   %x_69_phi = OpVariable %_ptr_Function_int Function %28
+         %31 = OpLoad %v4float %gl_FragCoord
+         %34 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %35 = OpLoad %v2float %34
+         %38 = OpCompositeExtract %float %31 0
+         %39 = OpCompositeExtract %float %31 1
+         %40 = OpCompositeConstruct %v2float %38 %39
+         %41 = OpFDiv %v2float %40 %35
+         %43 = OpVectorTimesScalar %v2float %41 %float_8
+         %36 = OpExtInst %v2float %37 Floor %43
+         %45 = OpCompositeExtract %float %36 0
+         %44 = OpConvertFToS %int %45
+         %47 = OpIMul %int %44 %int_8
+         %49 = OpCompositeExtract %float %36 1
+         %48 = OpConvertFToS %int %49
+         %50 = OpIAdd %int %47 %48
+               OpStore %x_65_phi %int_0
+               OpStore %x_68_phi %50
+               OpBranch %52
+         %52 = OpLabel
+               OpLoopMerge %53 %54 None
+               OpBranch %55
+         %55 = OpLabel
+         %59 = OpLoad %int %x_65_phi
+               OpStore %x_65 %59
+         %60 = OpLoad %int %x_68_phi
+         %62 = OpSGreaterThan %bool %60 %int_1
+               OpSelectionMerge %64 None
+               OpBranchConditional %62 %65 %66
+         %65 = OpLabel
+               OpBranch %64
+         %66 = OpLabel
+               OpBranch %53
+         %64 = OpLabel
+         %67 = OpBitwiseAnd %int %60 %int_1
+         %68 = OpIEqual %bool %67 %int_1
+               OpSelectionMerge %69 None
+               OpBranchConditional %68 %70 %71
+         %70 = OpLabel
+         %73 = OpIMul %int %int_3 %60
+         %74 = OpIAdd %int %73 %int_1
+               OpStore %x_79 %74
+         %75 = OpLoad %int %x_79
+               OpStore %x_69_phi %75
+               OpBranch %69
+         %71 = OpLabel
+         %77 = OpSDiv %int %60 %int_2
+               OpStore %x_80 %77
+         %78 = OpLoad %int %x_80
+               OpStore %x_69_phi %78
+               OpBranch %69
+         %69 = OpLabel
+         %79 = OpLoad %int %x_69_phi
+               OpBranch %54
+         %54 = OpLabel
+         %81 = OpLoad %int %x_65
+         %82 = OpCopyObject %int %int_1
+         %83 = OpIAdd %int %81 %82
+         %80 = OpCopyObject %int %83
+               OpStore %x_65_phi %80
+               OpStore %x_68_phi %79
+               OpBranch %52
+         %53 = OpLabel
+               OpStore %indexable %102
+        %104 = OpLoad %int %x_65
+        %106 = OpSMod %int %104 %int_16
+        %103 = OpCopyObject %int %106
+        %108 = OpAccessChain %_ptr_Function_v4float %indexable %103
+        %109 = OpLoad %v4float %108
+               OpStore %x_GLF_color %109
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %110
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %114 = OpLabel
+        %115 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %115
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %117 = OpLabel
+        %118 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %118
+        %119 = OpFunctionCall %void %main_1
+        %121 = OpLoad %v4float %x_GLF_color
+        %122 = OpCompositeConstruct %main_out %121
+        %120 = OpFunctionCall %void %tint_symbol_3 %122
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..919b5ea
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/0.wgsl.expected.wgsl
@@ -0,0 +1,63 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var indexable : array<vec4<f32>, 16>;
+  var x_65 : i32;
+  var x_65_phi : i32;
+  var x_68_phi : i32;
+  let x_51 : vec4<f32> = gl_FragCoord;
+  let x_54 : vec2<f32> = x_6.resolution;
+  let x_57 : vec2<f32> = floor(((vec2<f32>(x_51.x, x_51.y) / x_54) * 8.0));
+  let x_63 : i32 = ((i32(x_57.x) * 8) + i32(x_57.y));
+  x_65_phi = 0;
+  x_68_phi = x_63;
+  loop {
+    var x_79 : i32;
+    var x_80 : i32;
+    var x_69_phi : i32;
+    x_65 = x_65_phi;
+    let x_68 : i32 = x_68_phi;
+    if ((x_68 > 1)) {
+    } else {
+      break;
+    }
+    if (((x_68 & 1) == 1)) {
+      x_79 = ((3 * x_68) + 1);
+      x_69_phi = x_79;
+    } else {
+      x_80 = (x_68 / 2);
+      x_69_phi = x_80;
+    }
+    let x_69 : i32 = x_69_phi;
+
+    continuing {
+      x_65_phi = bitcast<i32>((x_65 + bitcast<i32>(1)));
+      x_68_phi = x_69;
+    }
+  }
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+  let x_83 : vec4<f32> = indexable[bitcast<i32>((x_65 % 16))];
+  x_GLF_color = x_83;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/1.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/1.spvasm
new file mode 100644
index 0000000..fe85990
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/1.spvasm
@@ -0,0 +1,125 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpName %indexable "indexable"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+      %int_2 = OpConstant %int 2
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_8 = OpConstant %float 8
+       %uint = OpTypeInt 32 0
+      %int_8 = OpConstant %int 8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %30 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+  %float_0_5 = OpConstant %float 0.5
+         %32 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+         %33 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+         %34 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+         %35 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+         %36 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+         %37 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+         %38 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+         %39 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %40 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+         %41 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+         %42 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+         %43 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+         %44 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+         %45 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+         %46 = OpConstantComposite %_arr_v4float_uint_16 %30 %32 %33 %34 %35 %36 %37 %38 %30 %39 %40 %41 %42 %43 %44 %45
+     %int_16 = OpConstant %int 16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+  %float_0_0 = OpConstant %float 0
+         %51 = OpConstantComposite %v4float %float_0_0 %float_0_0 %float_0_0 %float_0_0
+         %52 = OpConstantComposite %_arr_v4float_uint_16 %51 %51 %51 %51 %51 %51 %51 %51 %51 %51 %51 %51 %51 %51 %51 %51
+       %main = OpFunction %void None %9
+         %53 = OpLabel
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_16 Function
+         %54 = OpLoad %v4float %gl_FragCoord
+         %55 = OpVectorShuffle %v2float %54 %54 0 1
+         %56 = OpCompositeConstruct %v4float %float_0 %float_8 %55
+         %57 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+         %58 = OpLoad %v2float %57
+         %59 = OpCompositeConstruct %_arr_v4float_uint_16 %35 %43 %37 %44 %45 %37 %37 %36 %41 %54 %35 %34 %33 %32 %40 %39
+         %60 = OpFDiv %v2float %55 %58
+         %61 = OpVectorTimesScalar %v2float %60 %float_8
+         %62 = OpExtInst %v2float %1 Floor %61
+         %63 = OpCompositeConstruct %v4float %61 %float_0_5 %float_1
+         %64 = OpCompositeExtract %float %62 0
+         %65 = OpConvertFToS %int %64
+         %66 = OpIMul %int %65 %int_8
+         %67 = OpCompositeExtract %float %62 1
+         %68 = OpConvertFToS %int %67
+         %69 = OpIAdd %int %66 %68
+               OpBranch %70
+         %70 = OpLabel
+         %71 = OpPhi %int %int_0 %53 %72 %73
+         %74 = OpPhi %int %69 %53 %75 %73
+         %76 = OpSGreaterThan %bool %74 %int_1
+               OpLoopMerge %77 %73 None
+               OpBranchConditional %76 %78 %77
+         %78 = OpLabel
+         %79 = OpBitwiseAnd %int %74 %int_1
+         %80 = OpIEqual %bool %79 %int_1
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %83
+         %82 = OpLabel
+         %84 = OpIMul %int %int_3 %74
+         %85 = OpIAdd %int %84 %int_1
+               OpBranch %81
+         %83 = OpLabel
+         %86 = OpSDiv %int %74 %int_2
+               OpBranch %81
+         %81 = OpLabel
+         %75 = OpPhi %int %85 %82 %86 %83
+         %72 = OpIAdd %int %71 %int_1
+               OpBranch %73
+         %73 = OpLabel
+               OpBranch %70
+         %77 = OpLabel
+         %87 = OpSMod %int %71 %int_16
+               OpStore %indexable %46
+         %88 = OpLoad %_arr_v4float_uint_16 %indexable
+               OpStore %indexable %52
+               OpStore %indexable %88
+         %89 = OpCompositeExtract %v4float %59 1
+         %90 = OpCompositeConstruct %_arr_v4float_uint_16 %36 %36 %40 %30 %36 %38 %43 %30 %40 %56 %35 %37 %36 %41 %43 %63
+         %91 = OpAccessChain %_ptr_Function_v4float %indexable %87
+         %92 = OpLoad %v4float %91
+               OpStore %_GLF_color %92
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..5df85e4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/1.spvasm.expected.hlsl
@@ -0,0 +1,74 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 indexable[16] = (float4[16])0;
+  int x_71 = 0;
+  int x_71_phi = 0;
+  int x_74_phi = 0;
+  const float4 x_54 = gl_FragCoord;
+  const float2 x_55 = float2(x_54.x, x_54.y);
+  const float2 x_58 = asfloat(x_6[0].xy);
+  const float2 x_61 = ((x_55 / x_58) * 8.0f);
+  const float2 x_62 = floor(x_61);
+  const int x_69 = ((int(x_62.x) * 8) + int(x_62.y));
+  x_71_phi = 0;
+  x_74_phi = x_69;
+  while (true) {
+    int x_85 = 0;
+    int x_86 = 0;
+    int x_75_phi = 0;
+    x_71 = x_71_phi;
+    const int x_74 = x_74_phi;
+    if ((x_74 > 1)) {
+    } else {
+      break;
+    }
+    if (((x_74 & 1) == 1)) {
+      x_85 = ((3 * x_74) + 1);
+      x_75_phi = x_85;
+    } else {
+      x_86 = (x_74 / 2);
+      x_75_phi = x_86;
+    }
+    const int x_75 = x_75_phi;
+    {
+      x_71_phi = asint((x_71 + asint(1)));
+      x_74_phi = x_75;
+    }
+  }
+  const float4 tint_symbol_5[16] = {float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)};
+  indexable = tint_symbol_5;
+  const float4 x_88[16] = indexable;
+  const float4 tint_symbol_6[16] = {float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)};
+  indexable = tint_symbol_6;
+  indexable = x_88;
+  const float4 tint_symbol_7[16] = {float4(0.0f, 0.0f, 0.5f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), x_54, float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f)};
+  const float4 x_89 = tint_symbol_7[1u];
+  const float4 x_90[16] = {float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 8.0f, x_55), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(x_61, 0.5f, 1.0f)};
+  const float4 x_92 = indexable[asint((x_71 % 16))];
+  x_GLF_color = x_92;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_8 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_8;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/1.spvasm.expected.msl
new file mode 100644
index 0000000..b1f84a6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/1.spvasm.expected.msl
@@ -0,0 +1,76 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  float4 arr[16];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_8, thread float4* const tint_symbol_9) {
+  tint_array_wrapper indexable = {};
+  int x_71 = 0;
+  int x_71_phi = 0;
+  int x_74_phi = 0;
+  float4 const x_54 = *(tint_symbol_8);
+  float2 const x_55 = float2(x_54.x, x_54.y);
+  float2 const x_58 = x_6.resolution;
+  float2 const x_61 = ((x_55 / x_58) * 8.0f);
+  float2 const x_62 = floor(x_61);
+  int const x_69 = ((int(x_62.x) * 8) + int(x_62.y));
+  x_71_phi = 0;
+  x_74_phi = x_69;
+  while (true) {
+    int x_85 = 0;
+    int x_86 = 0;
+    int x_75_phi = 0;
+    x_71 = x_71_phi;
+    int const x_74 = x_74_phi;
+    if ((x_74 > 1)) {
+    } else {
+      break;
+    }
+    if (((x_74 & 1) == 1)) {
+      x_85 = ((3 * x_74) + 1);
+      x_75_phi = x_85;
+    } else {
+      x_86 = (x_74 / 2);
+      x_75_phi = x_86;
+    }
+    int const x_75 = x_75_phi;
+    {
+      x_71_phi = as_type<int>((x_71 + as_type<int>(1)));
+      x_74_phi = x_75;
+    }
+  }
+  tint_array_wrapper const tint_symbol_4 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
+  indexable = tint_symbol_4;
+  tint_array_wrapper const x_88 = indexable;
+  tint_array_wrapper const tint_symbol_5 = {.arr={float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)}};
+  indexable = tint_symbol_5;
+  indexable = x_88;
+  tint_array_wrapper const tint_symbol_6 = {.arr={float4(0.0f, 0.0f, 0.5f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), x_54, float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f)}};
+  float4 const x_89 = tint_symbol_6.arr[1u];
+  tint_array_wrapper const x_90 = {.arr={float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 8.0f, x_55), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(x_61, 0.5f, 1.0f)}};
+  float4 const x_92 = indexable.arr[as_type<int>((x_71 % 16))];
+  *(tint_symbol_9) = x_92;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_10 = 0.0f;
+  thread float4 tint_symbol_11 = 0.0f;
+  tint_symbol_10 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_10), &(tint_symbol_11));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_11};
+  tint_symbol_2 const tint_symbol_7 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_7;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..9edd5c3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/1.spvasm.expected.spvasm
@@ -0,0 +1,207 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 136
+; Schema: 0
+               OpCapability Shader
+         %43 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %indexable "indexable"
+               OpName %x_71 "x_71"
+               OpName %x_71_phi "x_71_phi"
+               OpName %x_74_phi "x_74_phi"
+               OpName %x_85 "x_85"
+               OpName %x_86 "x_86"
+               OpName %x_75_phi "x_75_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v4float_uint_16 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+         %24 = OpConstantNull %_arr_v4float_uint_16
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %28 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_8 = OpConstant %float 8
+      %int_8 = OpConstant %int 8
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+      %int_2 = OpConstant %int 2
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %86 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+  %float_0_5 = OpConstant %float 0.5
+         %88 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+         %89 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+         %90 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+         %91 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+         %92 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+         %93 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+         %94 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+         %95 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %96 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+         %97 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+         %98 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+         %99 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+        %100 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+        %101 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+        %102 = OpConstantComposite %_arr_v4float_uint_16 %86 %88 %89 %90 %91 %92 %93 %94 %86 %95 %96 %97 %98 %99 %100 %101
+        %104 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+        %105 = OpConstantComposite %_arr_v4float_uint_16 %104 %104 %104 %104 %104 %104 %104 %104 %104 %104 %104 %104 %104 %104 %104 %104
+     %uint_1 = OpConstant %uint 1
+     %int_16 = OpConstant %int 16
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+   %main_out = OpTypeStruct %v4float
+        %123 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_16 Function %24
+       %x_71 = OpVariable %_ptr_Function_int Function %28
+   %x_71_phi = OpVariable %_ptr_Function_int Function %28
+   %x_74_phi = OpVariable %_ptr_Function_int Function %28
+       %x_85 = OpVariable %_ptr_Function_int Function %28
+       %x_86 = OpVariable %_ptr_Function_int Function %28
+   %x_75_phi = OpVariable %_ptr_Function_int Function %28
+         %31 = OpLoad %v4float %gl_FragCoord
+         %32 = OpCompositeExtract %float %31 0
+         %33 = OpCompositeExtract %float %31 1
+         %34 = OpCompositeConstruct %v2float %32 %33
+         %37 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %38 = OpLoad %v2float %37
+         %39 = OpFDiv %v2float %34 %38
+         %41 = OpVectorTimesScalar %v2float %39 %float_8
+         %42 = OpExtInst %v2float %43 Floor %41
+         %45 = OpCompositeExtract %float %42 0
+         %44 = OpConvertFToS %int %45
+         %47 = OpIMul %int %44 %int_8
+         %49 = OpCompositeExtract %float %42 1
+         %48 = OpConvertFToS %int %49
+         %50 = OpIAdd %int %47 %48
+               OpStore %x_71_phi %int_0
+               OpStore %x_74_phi %50
+               OpBranch %52
+         %52 = OpLabel
+               OpLoopMerge %53 %54 None
+               OpBranch %55
+         %55 = OpLabel
+         %59 = OpLoad %int %x_71_phi
+               OpStore %x_71 %59
+         %60 = OpLoad %int %x_74_phi
+         %62 = OpSGreaterThan %bool %60 %int_1
+               OpSelectionMerge %64 None
+               OpBranchConditional %62 %65 %66
+         %65 = OpLabel
+               OpBranch %64
+         %66 = OpLabel
+               OpBranch %53
+         %64 = OpLabel
+         %67 = OpBitwiseAnd %int %60 %int_1
+         %68 = OpIEqual %bool %67 %int_1
+               OpSelectionMerge %69 None
+               OpBranchConditional %68 %70 %71
+         %70 = OpLabel
+         %73 = OpIMul %int %int_3 %60
+         %74 = OpIAdd %int %73 %int_1
+               OpStore %x_85 %74
+         %75 = OpLoad %int %x_85
+               OpStore %x_75_phi %75
+               OpBranch %69
+         %71 = OpLabel
+         %77 = OpSDiv %int %60 %int_2
+               OpStore %x_86 %77
+         %78 = OpLoad %int %x_86
+               OpStore %x_75_phi %78
+               OpBranch %69
+         %69 = OpLabel
+         %79 = OpLoad %int %x_75_phi
+               OpBranch %54
+         %54 = OpLabel
+         %81 = OpLoad %int %x_71
+         %82 = OpCopyObject %int %int_1
+         %83 = OpIAdd %int %81 %82
+         %80 = OpCopyObject %int %83
+               OpStore %x_71_phi %80
+               OpStore %x_74_phi %79
+               OpBranch %52
+         %53 = OpLabel
+               OpStore %indexable %102
+        %103 = OpLoad %_arr_v4float_uint_16 %indexable
+               OpStore %indexable %105
+               OpStore %indexable %103
+        %106 = OpCompositeConstruct %_arr_v4float_uint_16 %91 %99 %93 %100 %101 %93 %93 %92 %97 %31 %91 %90 %89 %88 %96 %95
+        %108 = OpCompositeExtract %v4float %106 1
+        %109 = OpCompositeExtract %float %34 0
+        %110 = OpCompositeExtract %float %34 1
+        %111 = OpCompositeConstruct %v4float %float_0 %float_8 %109 %110
+        %112 = OpCompositeExtract %float %41 0
+        %113 = OpCompositeExtract %float %41 1
+        %114 = OpCompositeConstruct %v4float %112 %113 %float_0_5 %float_1
+        %115 = OpCompositeConstruct %_arr_v4float_uint_16 %92 %92 %96 %86 %92 %94 %99 %86 %96 %111 %91 %93 %92 %97 %99 %114
+        %117 = OpLoad %int %x_71
+        %119 = OpSMod %int %117 %int_16
+        %116 = OpCopyObject %int %119
+        %121 = OpAccessChain %_ptr_Function_v4float %indexable %116
+        %122 = OpLoad %v4float %121
+               OpStore %x_GLF_color %122
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %123
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %127 = OpLabel
+        %128 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %128
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %130 = OpLabel
+        %131 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %131
+        %132 = OpFunctionCall %void %main_1
+        %134 = OpLoad %v4float %x_GLF_color
+        %135 = OpCompositeConstruct %main_out %134
+        %133 = OpFunctionCall %void %tint_symbol_3 %135
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..872479c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/1.spvasm.expected.wgsl
@@ -0,0 +1,70 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var indexable : array<vec4<f32>, 16>;
+  var x_71 : i32;
+  var x_71_phi : i32;
+  var x_74_phi : i32;
+  let x_54 : vec4<f32> = gl_FragCoord;
+  let x_55 : vec2<f32> = vec2<f32>(x_54.x, x_54.y);
+  let x_58 : vec2<f32> = x_6.resolution;
+  let x_61 : vec2<f32> = ((x_55 / x_58) * 8.0);
+  let x_62 : vec2<f32> = floor(x_61);
+  let x_69 : i32 = ((i32(x_62.x) * 8) + i32(x_62.y));
+  x_71_phi = 0;
+  x_74_phi = x_69;
+  loop {
+    var x_85 : i32;
+    var x_86 : i32;
+    var x_75_phi : i32;
+    x_71 = x_71_phi;
+    let x_74 : i32 = x_74_phi;
+    if ((x_74 > 1)) {
+    } else {
+      break;
+    }
+    if (((x_74 & 1) == 1)) {
+      x_85 = ((3 * x_74) + 1);
+      x_75_phi = x_85;
+    } else {
+      x_86 = (x_74 / 2);
+      x_75_phi = x_86;
+    }
+    let x_75 : i32 = x_75_phi;
+
+    continuing {
+      x_71_phi = bitcast<i32>((x_71 + bitcast<i32>(1)));
+      x_74_phi = x_75;
+    }
+  }
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+  let x_88 : array<vec4<f32>, 16> = indexable;
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
+  indexable = x_88;
+  let x_89 : vec4<f32> = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), x_54, vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0))[1u];
+  let x_90 : array<vec4<f32>, 16> = array<vec4<f32>, 16>(vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 8.0, x_55), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(x_61, 0.5, 1.0));
+  let x_92 : vec4<f32> = indexable[bitcast<i32>((x_71 % 16))];
+  x_GLF_color = x_92;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/1.wgsl
new file mode 100644
index 0000000..872479c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/1.wgsl
@@ -0,0 +1,70 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var indexable : array<vec4<f32>, 16>;
+  var x_71 : i32;
+  var x_71_phi : i32;
+  var x_74_phi : i32;
+  let x_54 : vec4<f32> = gl_FragCoord;
+  let x_55 : vec2<f32> = vec2<f32>(x_54.x, x_54.y);
+  let x_58 : vec2<f32> = x_6.resolution;
+  let x_61 : vec2<f32> = ((x_55 / x_58) * 8.0);
+  let x_62 : vec2<f32> = floor(x_61);
+  let x_69 : i32 = ((i32(x_62.x) * 8) + i32(x_62.y));
+  x_71_phi = 0;
+  x_74_phi = x_69;
+  loop {
+    var x_85 : i32;
+    var x_86 : i32;
+    var x_75_phi : i32;
+    x_71 = x_71_phi;
+    let x_74 : i32 = x_74_phi;
+    if ((x_74 > 1)) {
+    } else {
+      break;
+    }
+    if (((x_74 & 1) == 1)) {
+      x_85 = ((3 * x_74) + 1);
+      x_75_phi = x_85;
+    } else {
+      x_86 = (x_74 / 2);
+      x_75_phi = x_86;
+    }
+    let x_75 : i32 = x_75_phi;
+
+    continuing {
+      x_71_phi = bitcast<i32>((x_71 + bitcast<i32>(1)));
+      x_74_phi = x_75;
+    }
+  }
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+  let x_88 : array<vec4<f32>, 16> = indexable;
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
+  indexable = x_88;
+  let x_89 : vec4<f32> = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), x_54, vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0))[1u];
+  let x_90 : array<vec4<f32>, 16> = array<vec4<f32>, 16>(vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 8.0, x_55), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(x_61, 0.5, 1.0));
+  let x_92 : vec4<f32> = indexable[bitcast<i32>((x_71 % 16))];
+  x_GLF_color = x_92;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..5df85e4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/1.wgsl.expected.hlsl
@@ -0,0 +1,74 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 indexable[16] = (float4[16])0;
+  int x_71 = 0;
+  int x_71_phi = 0;
+  int x_74_phi = 0;
+  const float4 x_54 = gl_FragCoord;
+  const float2 x_55 = float2(x_54.x, x_54.y);
+  const float2 x_58 = asfloat(x_6[0].xy);
+  const float2 x_61 = ((x_55 / x_58) * 8.0f);
+  const float2 x_62 = floor(x_61);
+  const int x_69 = ((int(x_62.x) * 8) + int(x_62.y));
+  x_71_phi = 0;
+  x_74_phi = x_69;
+  while (true) {
+    int x_85 = 0;
+    int x_86 = 0;
+    int x_75_phi = 0;
+    x_71 = x_71_phi;
+    const int x_74 = x_74_phi;
+    if ((x_74 > 1)) {
+    } else {
+      break;
+    }
+    if (((x_74 & 1) == 1)) {
+      x_85 = ((3 * x_74) + 1);
+      x_75_phi = x_85;
+    } else {
+      x_86 = (x_74 / 2);
+      x_75_phi = x_86;
+    }
+    const int x_75 = x_75_phi;
+    {
+      x_71_phi = asint((x_71 + asint(1)));
+      x_74_phi = x_75;
+    }
+  }
+  const float4 tint_symbol_5[16] = {float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)};
+  indexable = tint_symbol_5;
+  const float4 x_88[16] = indexable;
+  const float4 tint_symbol_6[16] = {float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)};
+  indexable = tint_symbol_6;
+  indexable = x_88;
+  const float4 tint_symbol_7[16] = {float4(0.0f, 0.0f, 0.5f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), x_54, float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f)};
+  const float4 x_89 = tint_symbol_7[1u];
+  const float4 x_90[16] = {float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 8.0f, x_55), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(x_61, 0.5f, 1.0f)};
+  const float4 x_92 = indexable[asint((x_71 % 16))];
+  x_GLF_color = x_92;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_8 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_8;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/1.wgsl.expected.msl
new file mode 100644
index 0000000..b1f84a6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/1.wgsl.expected.msl
@@ -0,0 +1,76 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  float4 arr[16];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_8, thread float4* const tint_symbol_9) {
+  tint_array_wrapper indexable = {};
+  int x_71 = 0;
+  int x_71_phi = 0;
+  int x_74_phi = 0;
+  float4 const x_54 = *(tint_symbol_8);
+  float2 const x_55 = float2(x_54.x, x_54.y);
+  float2 const x_58 = x_6.resolution;
+  float2 const x_61 = ((x_55 / x_58) * 8.0f);
+  float2 const x_62 = floor(x_61);
+  int const x_69 = ((int(x_62.x) * 8) + int(x_62.y));
+  x_71_phi = 0;
+  x_74_phi = x_69;
+  while (true) {
+    int x_85 = 0;
+    int x_86 = 0;
+    int x_75_phi = 0;
+    x_71 = x_71_phi;
+    int const x_74 = x_74_phi;
+    if ((x_74 > 1)) {
+    } else {
+      break;
+    }
+    if (((x_74 & 1) == 1)) {
+      x_85 = ((3 * x_74) + 1);
+      x_75_phi = x_85;
+    } else {
+      x_86 = (x_74 / 2);
+      x_75_phi = x_86;
+    }
+    int const x_75 = x_75_phi;
+    {
+      x_71_phi = as_type<int>((x_71 + as_type<int>(1)));
+      x_74_phi = x_75;
+    }
+  }
+  tint_array_wrapper const tint_symbol_4 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
+  indexable = tint_symbol_4;
+  tint_array_wrapper const x_88 = indexable;
+  tint_array_wrapper const tint_symbol_5 = {.arr={float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)}};
+  indexable = tint_symbol_5;
+  indexable = x_88;
+  tint_array_wrapper const tint_symbol_6 = {.arr={float4(0.0f, 0.0f, 0.5f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), x_54, float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f)}};
+  float4 const x_89 = tint_symbol_6.arr[1u];
+  tint_array_wrapper const x_90 = {.arr={float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 8.0f, x_55), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(x_61, 0.5f, 1.0f)}};
+  float4 const x_92 = indexable.arr[as_type<int>((x_71 % 16))];
+  *(tint_symbol_9) = x_92;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_10 = 0.0f;
+  thread float4 tint_symbol_11 = 0.0f;
+  tint_symbol_10 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_10), &(tint_symbol_11));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_11};
+  tint_symbol_2 const tint_symbol_7 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_7;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..9edd5c3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/1.wgsl.expected.spvasm
@@ -0,0 +1,207 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 136
+; Schema: 0
+               OpCapability Shader
+         %43 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %indexable "indexable"
+               OpName %x_71 "x_71"
+               OpName %x_71_phi "x_71_phi"
+               OpName %x_74_phi "x_74_phi"
+               OpName %x_85 "x_85"
+               OpName %x_86 "x_86"
+               OpName %x_75_phi "x_75_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v4float_uint_16 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+         %24 = OpConstantNull %_arr_v4float_uint_16
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %28 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_8 = OpConstant %float 8
+      %int_8 = OpConstant %int 8
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+      %int_2 = OpConstant %int 2
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %86 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+  %float_0_5 = OpConstant %float 0.5
+         %88 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+         %89 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+         %90 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+         %91 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+         %92 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+         %93 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+         %94 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+         %95 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %96 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+         %97 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+         %98 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+         %99 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+        %100 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+        %101 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+        %102 = OpConstantComposite %_arr_v4float_uint_16 %86 %88 %89 %90 %91 %92 %93 %94 %86 %95 %96 %97 %98 %99 %100 %101
+        %104 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+        %105 = OpConstantComposite %_arr_v4float_uint_16 %104 %104 %104 %104 %104 %104 %104 %104 %104 %104 %104 %104 %104 %104 %104 %104
+     %uint_1 = OpConstant %uint 1
+     %int_16 = OpConstant %int 16
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+   %main_out = OpTypeStruct %v4float
+        %123 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_16 Function %24
+       %x_71 = OpVariable %_ptr_Function_int Function %28
+   %x_71_phi = OpVariable %_ptr_Function_int Function %28
+   %x_74_phi = OpVariable %_ptr_Function_int Function %28
+       %x_85 = OpVariable %_ptr_Function_int Function %28
+       %x_86 = OpVariable %_ptr_Function_int Function %28
+   %x_75_phi = OpVariable %_ptr_Function_int Function %28
+         %31 = OpLoad %v4float %gl_FragCoord
+         %32 = OpCompositeExtract %float %31 0
+         %33 = OpCompositeExtract %float %31 1
+         %34 = OpCompositeConstruct %v2float %32 %33
+         %37 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %38 = OpLoad %v2float %37
+         %39 = OpFDiv %v2float %34 %38
+         %41 = OpVectorTimesScalar %v2float %39 %float_8
+         %42 = OpExtInst %v2float %43 Floor %41
+         %45 = OpCompositeExtract %float %42 0
+         %44 = OpConvertFToS %int %45
+         %47 = OpIMul %int %44 %int_8
+         %49 = OpCompositeExtract %float %42 1
+         %48 = OpConvertFToS %int %49
+         %50 = OpIAdd %int %47 %48
+               OpStore %x_71_phi %int_0
+               OpStore %x_74_phi %50
+               OpBranch %52
+         %52 = OpLabel
+               OpLoopMerge %53 %54 None
+               OpBranch %55
+         %55 = OpLabel
+         %59 = OpLoad %int %x_71_phi
+               OpStore %x_71 %59
+         %60 = OpLoad %int %x_74_phi
+         %62 = OpSGreaterThan %bool %60 %int_1
+               OpSelectionMerge %64 None
+               OpBranchConditional %62 %65 %66
+         %65 = OpLabel
+               OpBranch %64
+         %66 = OpLabel
+               OpBranch %53
+         %64 = OpLabel
+         %67 = OpBitwiseAnd %int %60 %int_1
+         %68 = OpIEqual %bool %67 %int_1
+               OpSelectionMerge %69 None
+               OpBranchConditional %68 %70 %71
+         %70 = OpLabel
+         %73 = OpIMul %int %int_3 %60
+         %74 = OpIAdd %int %73 %int_1
+               OpStore %x_85 %74
+         %75 = OpLoad %int %x_85
+               OpStore %x_75_phi %75
+               OpBranch %69
+         %71 = OpLabel
+         %77 = OpSDiv %int %60 %int_2
+               OpStore %x_86 %77
+         %78 = OpLoad %int %x_86
+               OpStore %x_75_phi %78
+               OpBranch %69
+         %69 = OpLabel
+         %79 = OpLoad %int %x_75_phi
+               OpBranch %54
+         %54 = OpLabel
+         %81 = OpLoad %int %x_71
+         %82 = OpCopyObject %int %int_1
+         %83 = OpIAdd %int %81 %82
+         %80 = OpCopyObject %int %83
+               OpStore %x_71_phi %80
+               OpStore %x_74_phi %79
+               OpBranch %52
+         %53 = OpLabel
+               OpStore %indexable %102
+        %103 = OpLoad %_arr_v4float_uint_16 %indexable
+               OpStore %indexable %105
+               OpStore %indexable %103
+        %106 = OpCompositeConstruct %_arr_v4float_uint_16 %91 %99 %93 %100 %101 %93 %93 %92 %97 %31 %91 %90 %89 %88 %96 %95
+        %108 = OpCompositeExtract %v4float %106 1
+        %109 = OpCompositeExtract %float %34 0
+        %110 = OpCompositeExtract %float %34 1
+        %111 = OpCompositeConstruct %v4float %float_0 %float_8 %109 %110
+        %112 = OpCompositeExtract %float %41 0
+        %113 = OpCompositeExtract %float %41 1
+        %114 = OpCompositeConstruct %v4float %112 %113 %float_0_5 %float_1
+        %115 = OpCompositeConstruct %_arr_v4float_uint_16 %92 %92 %96 %86 %92 %94 %99 %86 %96 %111 %91 %93 %92 %97 %99 %114
+        %117 = OpLoad %int %x_71
+        %119 = OpSMod %int %117 %int_16
+        %116 = OpCopyObject %int %119
+        %121 = OpAccessChain %_ptr_Function_v4float %indexable %116
+        %122 = OpLoad %v4float %121
+               OpStore %x_GLF_color %122
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %123
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %127 = OpLabel
+        %128 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %128
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %130 = OpLabel
+        %131 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %131
+        %132 = OpFunctionCall %void %main_1
+        %134 = OpLoad %v4float %x_GLF_color
+        %135 = OpCompositeConstruct %main_out %134
+        %133 = OpFunctionCall %void %tint_symbol_3 %135
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..872479c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-collatz-O-mutate-composite-construct-extract/1.wgsl.expected.wgsl
@@ -0,0 +1,70 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var indexable : array<vec4<f32>, 16>;
+  var x_71 : i32;
+  var x_71_phi : i32;
+  var x_74_phi : i32;
+  let x_54 : vec4<f32> = gl_FragCoord;
+  let x_55 : vec2<f32> = vec2<f32>(x_54.x, x_54.y);
+  let x_58 : vec2<f32> = x_6.resolution;
+  let x_61 : vec2<f32> = ((x_55 / x_58) * 8.0);
+  let x_62 : vec2<f32> = floor(x_61);
+  let x_69 : i32 = ((i32(x_62.x) * 8) + i32(x_62.y));
+  x_71_phi = 0;
+  x_74_phi = x_69;
+  loop {
+    var x_85 : i32;
+    var x_86 : i32;
+    var x_75_phi : i32;
+    x_71 = x_71_phi;
+    let x_74 : i32 = x_74_phi;
+    if ((x_74 > 1)) {
+    } else {
+      break;
+    }
+    if (((x_74 & 1) == 1)) {
+      x_85 = ((3 * x_74) + 1);
+      x_75_phi = x_85;
+    } else {
+      x_86 = (x_74 / 2);
+      x_75_phi = x_86;
+    }
+    let x_75 : i32 = x_75_phi;
+
+    continuing {
+      x_71_phi = bitcast<i32>((x_71 + bitcast<i32>(1)));
+      x_74_phi = x_75;
+    }
+  }
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+  let x_88 : array<vec4<f32>, 16> = indexable;
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
+  indexable = x_88;
+  let x_89 : vec4<f32> = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), x_54, vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0))[1u];
+  let x_90 : array<vec4<f32>, 16> = array<vec4<f32>, 16>(vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 8.0, x_55), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(x_61, 0.5, 1.0));
+  let x_92 : vec4<f32> = indexable[bitcast<i32>((x_71 % 16))];
+  x_GLF_color = x_92;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-colorgrid-modulo-O-move-block-down/1.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-colorgrid-modulo-O-move-block-down/1.spvasm
new file mode 100644
index 0000000..c006009
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-colorgrid-modulo-O-move-block-down/1.spvasm
@@ -0,0 +1,223 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %c "c"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+ %float_n0_5 = OpConstant %float -0.5
+        %int = OpTypeInt 32 1
+      %int_1 = OpConstant %int 1
+    %int_800 = OpConstant %int 800
+       %bool = OpTypeBool
+     %int_32 = OpConstant %int 32
+      %int_0 = OpConstant %int 0
+%float_0_400000006 = OpConstant %float 0.400000006
+%float_0_00999999978 = OpConstant %float 0.00999999978
+  %float_100 = OpConstant %float 100
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+    %float_7 = OpConstant %float 7
+    %float_8 = OpConstant %float 8
+    %float_9 = OpConstant %float 9
+         %27 = OpConstantComposite %v3float %float_7 %float_8 %float_9
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+%_ptr_Input_float = OpTypePointer Input %float
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+      %int_3 = OpConstant %int 3
+    %float_1 = OpConstant %float 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+      %false = OpConstantFalse %bool
+       %true = OpConstantTrue %bool
+         %43 = OpUndef %float
+%float_0_125 = OpConstant %float 0.125
+       %main = OpFunction %void None %9
+         %45 = OpLabel
+          %c = OpVariable %_ptr_Function_v3float Function
+               OpStore %c %27
+         %46 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %47 = OpLoad %float %46
+         %48 = OpFMul %float %47 %float_0_125
+         %49 = OpExtInst %float %1 Round %48
+         %50 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %51 = OpLoad %float %50
+               OpSelectionMerge %52 None
+               OpSwitch %uint_0 %53
+         %53 = OpLabel
+               OpBranch %54
+         %54 = OpLabel
+         %55 = OpPhi %float %float_n0_5 %53 %56 %57
+         %58 = OpPhi %int %int_1 %53 %59 %57
+         %60 = OpSLessThan %bool %58 %int_800
+               OpLoopMerge %61 %57 None
+               OpBranchConditional %60 %62 %61
+         %62 = OpLabel
+         %63 = OpSMod %int %58 %int_32
+         %64 = OpIEqual %bool %63 %int_0
+               OpSelectionMerge %65 None
+               OpBranchConditional %64 %66 %67
+         %66 = OpLabel
+         %68 = OpFAdd %float %55 %float_0_400000006
+               OpBranch %65
+         %67 = OpLabel
+         %69 = OpConvertSToF %float %58
+         %70 = OpExtInst %float %1 Round %49
+         %71 = OpFMod %float %69 %70
+         %72 = OpFOrdLessThanEqual %bool %71 %float_0_00999999978
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %74 %73
+         %74 = OpLabel
+         %75 = OpFAdd %float %55 %float_100
+               OpBranch %73
+         %73 = OpLabel
+         %76 = OpPhi %float %55 %67 %75 %74
+               OpBranch %65
+         %65 = OpLabel
+         %56 = OpPhi %float %68 %66 %76 %73
+         %77 = OpConvertSToF %float %58
+         %78 = OpFOrdGreaterThanEqual %bool %77 %51
+               OpSelectionMerge %79 None
+               OpBranchConditional %78 %80 %79
+         %80 = OpLabel
+               OpBranch %61
+         %79 = OpLabel
+               OpBranch %57
+         %57 = OpLabel
+         %59 = OpIAdd %int %58 %int_1
+               OpBranch %54
+         %61 = OpLabel
+         %81 = OpPhi %float %43 %54 %56 %80
+         %82 = OpPhi %float %55 %54 %56 %80
+         %83 = OpPhi %bool %false %54 %true %80
+               OpSelectionMerge %84 None
+               OpBranchConditional %83 %52 %84
+         %84 = OpLabel
+               OpBranch %52
+         %52 = OpLabel
+         %85 = OpPhi %float %81 %61 %82 %84
+         %86 = OpAccessChain %_ptr_Function_float %c %uint_0
+               OpStore %86 %85
+         %87 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %88 = OpLoad %float %87
+               OpSelectionMerge %89 None
+               OpSwitch %uint_0 %90
+         %90 = OpLabel
+               OpBranch %91
+         %91 = OpLabel
+         %92 = OpPhi %float %float_n0_5 %90 %93 %94
+         %95 = OpPhi %int %int_1 %90 %96 %94
+         %97 = OpSLessThan %bool %95 %int_800
+               OpLoopMerge %98 %94 None
+               OpBranchConditional %97 %99 %98
+         %99 = OpLabel
+        %100 = OpSMod %int %95 %int_32
+        %101 = OpIEqual %bool %100 %int_0
+               OpSelectionMerge %102 None
+               OpBranchConditional %101 %103 %104
+        %104 = OpLabel
+        %105 = OpConvertSToF %float %95
+        %106 = OpExtInst %float %1 Round %49
+        %107 = OpFMod %float %105 %106
+        %108 = OpFOrdLessThanEqual %bool %107 %float_0_00999999978
+               OpSelectionMerge %109 None
+               OpBranchConditional %108 %110 %109
+        %110 = OpLabel
+        %111 = OpFAdd %float %92 %float_100
+               OpBranch %109
+        %109 = OpLabel
+        %112 = OpPhi %float %92 %104 %111 %110
+               OpBranch %102
+        %102 = OpLabel
+         %93 = OpPhi %float %113 %103 %112 %109
+        %114 = OpConvertSToF %float %95
+        %115 = OpFOrdGreaterThanEqual %bool %114 %88
+               OpSelectionMerge %116 None
+               OpBranchConditional %115 %117 %116
+        %117 = OpLabel
+               OpBranch %98
+         %98 = OpLabel
+        %118 = OpPhi %float %43 %91 %93 %117
+        %119 = OpPhi %float %92 %91 %93 %117
+        %120 = OpPhi %bool %false %91 %true %117
+               OpSelectionMerge %121 None
+               OpBranchConditional %120 %89 %121
+        %103 = OpLabel
+        %113 = OpFAdd %float %92 %float_0_400000006
+               OpBranch %102
+        %116 = OpLabel
+               OpBranch %94
+         %94 = OpLabel
+         %96 = OpIAdd %int %95 %int_1
+               OpBranch %91
+        %121 = OpLabel
+               OpBranch %89
+         %89 = OpLabel
+        %122 = OpPhi %float %118 %98 %119 %121
+        %123 = OpAccessChain %_ptr_Function_float %c %uint_1
+               OpStore %123 %122
+        %124 = OpLoad %float %86
+        %125 = OpLoad %float %123
+        %126 = OpFAdd %float %124 %125
+        %127 = OpAccessChain %_ptr_Function_float %c %uint_2
+               OpStore %127 %126
+               OpBranch %128
+        %128 = OpLabel
+        %129 = OpPhi %int %int_0 %89 %130 %131
+        %132 = OpSLessThan %bool %129 %int_3
+               OpLoopMerge %133 %131 None
+               OpBranchConditional %132 %134 %133
+        %134 = OpLabel
+        %135 = OpAccessChain %_ptr_Function_float %c %129
+        %136 = OpLoad %float %135
+        %137 = OpFOrdGreaterThanEqual %bool %136 %float_1
+               OpSelectionMerge %138 None
+               OpBranchConditional %137 %139 %138
+        %139 = OpLabel
+        %140 = OpLoad %float %135
+        %141 = OpLoad %float %135
+        %142 = OpFMul %float %140 %141
+               OpStore %135 %142
+               OpBranch %138
+        %138 = OpLabel
+               OpBranch %131
+        %131 = OpLabel
+        %130 = OpIAdd %int %129 %int_1
+               OpBranch %128
+        %133 = OpLabel
+        %143 = OpLoad %v3float %c
+        %144 = OpExtInst %v3float %1 FAbs %143
+        %145 = OpExtInst %v3float %1 Normalize %144
+        %146 = OpCompositeExtract %float %145 0
+        %147 = OpCompositeExtract %float %145 1
+        %148 = OpCompositeExtract %float %145 2
+        %149 = OpCompositeConstruct %v4float %146 %147 %148 %float_1
+               OpStore %_GLF_color %149
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-colorgrid-modulo-O-move-block-down/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-colorgrid-modulo-O-move-block-down/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..3102fad
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-colorgrid-modulo-O-move-block-down/1.spvasm.expected.hlsl
@@ -0,0 +1,202 @@
+void set_float3(inout float3 vec, int idx, float val) {
+  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
+}
+
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float3 c = float3(0.0f, 0.0f, 0.0f);
+  float x_51 = 0.0f;
+  float x_55 = 0.0f;
+  float x_56 = 0.0f;
+  float x_81 = 0.0f;
+  float x_82 = 0.0f;
+  float x_118 = 0.0f;
+  float x_119 = 0.0f;
+  float x_55_phi = 0.0f;
+  int x_58_phi = 0;
+  float x_81_phi = 0.0f;
+  float x_82_phi = 0.0f;
+  bool x_83_phi = false;
+  float x_85_phi = 0.0f;
+  float x_122_phi = 0.0f;
+  int x_129_phi = 0;
+  c = float3(7.0f, 8.0f, 9.0f);
+  const float x_47 = asfloat(x_7[0].x);
+  const float x_49 = round((x_47 * 0.125f));
+  x_51 = gl_FragCoord.x;
+  switch(0u) {
+    default: {
+      x_55_phi = -0.5f;
+      x_58_phi = 1;
+      while (true) {
+        float x_68 = 0.0f;
+        float x_76 = 0.0f;
+        int x_59 = 0;
+        float x_56_phi = 0.0f;
+        x_55 = x_55_phi;
+        const int x_58 = x_58_phi;
+        x_81_phi = 0.0f;
+        x_82_phi = x_55;
+        x_83_phi = false;
+        if ((x_58 < 800)) {
+        } else {
+          break;
+        }
+        float x_75 = 0.0f;
+        float x_76_phi = 0.0f;
+        if (((x_58 % 32) == 0)) {
+          x_68 = (x_55 + 0.400000006f);
+          x_56_phi = x_68;
+        } else {
+          x_76_phi = x_55;
+          if (((float(x_58) % round(x_49)) <= 0.01f)) {
+            x_75 = (x_55 + 100.0f);
+            x_76_phi = x_75;
+          }
+          x_76 = x_76_phi;
+          x_56_phi = x_76;
+        }
+        x_56 = x_56_phi;
+        if ((float(x_58) >= x_51)) {
+          x_81_phi = x_56;
+          x_82_phi = x_56;
+          x_83_phi = true;
+          break;
+        }
+        {
+          x_59 = (x_58 + 1);
+          x_55_phi = x_56;
+          x_58_phi = x_59;
+        }
+      }
+      x_81 = x_81_phi;
+      x_82 = x_82_phi;
+      const bool x_83 = x_83_phi;
+      x_85_phi = x_81;
+      if (x_83) {
+        break;
+      }
+      x_85_phi = x_82;
+      break;
+    }
+  }
+  float x_88 = 0.0f;
+  float x_92 = 0.0f;
+  float x_93 = 0.0f;
+  float x_92_phi = 0.0f;
+  int x_95_phi = 0;
+  float x_118_phi = 0.0f;
+  float x_119_phi = 0.0f;
+  bool x_120_phi = false;
+  const float x_85 = x_85_phi;
+  c.x = x_85;
+  x_88 = gl_FragCoord.y;
+  switch(0u) {
+    default: {
+      x_92_phi = -0.5f;
+      x_95_phi = 1;
+      while (true) {
+        float x_113 = 0.0f;
+        float x_112 = 0.0f;
+        int x_96 = 0;
+        float x_93_phi = 0.0f;
+        x_92 = x_92_phi;
+        const int x_95 = x_95_phi;
+        x_118_phi = 0.0f;
+        x_119_phi = x_92;
+        x_120_phi = false;
+        if ((x_95 < 800)) {
+        } else {
+          break;
+        }
+        float x_111 = 0.0f;
+        float x_112_phi = 0.0f;
+        if (((x_95 % 32) == 0)) {
+          x_113 = (x_92 + 0.400000006f);
+          x_93_phi = x_113;
+        } else {
+          x_112_phi = x_92;
+          if (((float(x_95) % round(x_49)) <= 0.01f)) {
+            x_111 = (x_92 + 100.0f);
+            x_112_phi = x_111;
+          }
+          x_112 = x_112_phi;
+          x_93_phi = x_112;
+        }
+        x_93 = x_93_phi;
+        if ((float(x_95) >= x_88)) {
+          x_118_phi = x_93;
+          x_119_phi = x_93;
+          x_120_phi = true;
+          break;
+        }
+        {
+          x_96 = (x_95 + 1);
+          x_92_phi = x_93;
+          x_95_phi = x_96;
+        }
+      }
+      x_118 = x_118_phi;
+      x_119 = x_119_phi;
+      const bool x_120 = x_120_phi;
+      x_122_phi = x_118;
+      if (x_120) {
+        break;
+      }
+      x_122_phi = x_119;
+      break;
+    }
+  }
+  const float x_122 = x_122_phi;
+  c.y = x_122;
+  const float x_124 = c.x;
+  const float x_125 = c.y;
+  c.z = (x_124 + x_125);
+  x_129_phi = 0;
+  while (true) {
+    int x_130 = 0;
+    const int x_129 = x_129_phi;
+    if ((x_129 < 3)) {
+    } else {
+      break;
+    }
+    const int x_135_save = x_129;
+    const float x_136 = c[x_135_save];
+    if ((x_136 >= 1.0f)) {
+      const float x_140 = c[x_135_save];
+      const float x_141 = c[x_135_save];
+      set_float3(c, x_135_save, (x_140 * x_141));
+    }
+    {
+      x_130 = (x_129 + 1);
+      x_129_phi = x_130;
+    }
+  }
+  const float3 x_145 = normalize(abs(c));
+  x_GLF_color = float4(x_145.x, x_145.y, x_145.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-colorgrid-modulo-O-move-block-down/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-colorgrid-modulo-O-move-block-down/1.spvasm.expected.msl
new file mode 100755
index 0000000..ccf66a6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-colorgrid-modulo-O-move-block-down/1.spvasm.expected.msl
@@ -0,0 +1,208 @@
+SKIP: FAILED
+
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float3 c = 0.0f;
+  float x_51 = 0.0f;
+  float x_55 = 0.0f;
+  float x_56 = 0.0f;
+  float x_81 = 0.0f;
+  float x_82 = 0.0f;
+  float x_118 = 0.0f;
+  float x_119 = 0.0f;
+  float x_55_phi = 0.0f;
+  int x_58_phi = 0;
+  float x_81_phi = 0.0f;
+  float x_82_phi = 0.0f;
+  bool x_83_phi = false;
+  float x_85_phi = 0.0f;
+  float x_122_phi = 0.0f;
+  int x_129_phi = 0;
+  c = float3(7.0f, 8.0f, 9.0f);
+  float const x_47 = x_7.resolution.x;
+  float const x_49 = rint((x_47 * 0.125f));
+  x_51 = (*(tint_symbol_5)).x;
+  switch(0u) {
+    default: {
+      x_55_phi = -0.5f;
+      x_58_phi = 1;
+      while (true) {
+        float x_68 = 0.0f;
+        float x_76 = 0.0f;
+        int x_59 = 0;
+        float x_56_phi = 0.0f;
+        x_55 = x_55_phi;
+        int const x_58 = x_58_phi;
+        x_81_phi = 0.0f;
+        x_82_phi = x_55;
+        x_83_phi = false;
+        if ((x_58 < 800)) {
+        } else {
+          break;
+        }
+        float x_75 = 0.0f;
+        float x_76_phi = 0.0f;
+        if (((x_58 % 32) == 0)) {
+          x_68 = (x_55 + 0.400000006f);
+          x_56_phi = x_68;
+        } else {
+          x_76_phi = x_55;
+          if (((float(x_58) % rint(x_49)) <= 0.01f)) {
+            x_75 = (x_55 + 100.0f);
+            x_76_phi = x_75;
+          }
+          x_76 = x_76_phi;
+          x_56_phi = x_76;
+        }
+        x_56 = x_56_phi;
+        if ((float(x_58) >= x_51)) {
+          x_81_phi = x_56;
+          x_82_phi = x_56;
+          x_83_phi = true;
+          break;
+        }
+        {
+          x_59 = (x_58 + 1);
+          x_55_phi = x_56;
+          x_58_phi = x_59;
+        }
+      }
+      x_81 = x_81_phi;
+      x_82 = x_82_phi;
+      bool const x_83 = x_83_phi;
+      x_85_phi = x_81;
+      if (x_83) {
+        break;
+      }
+      x_85_phi = x_82;
+      break;
+    }
+  }
+  float x_88 = 0.0f;
+  float x_92 = 0.0f;
+  float x_93 = 0.0f;
+  float x_92_phi = 0.0f;
+  int x_95_phi = 0;
+  float x_118_phi = 0.0f;
+  float x_119_phi = 0.0f;
+  bool x_120_phi = false;
+  float const x_85 = x_85_phi;
+  c.x = x_85;
+  x_88 = (*(tint_symbol_5)).y;
+  switch(0u) {
+    default: {
+      x_92_phi = -0.5f;
+      x_95_phi = 1;
+      while (true) {
+        float x_113 = 0.0f;
+        float x_112 = 0.0f;
+        int x_96 = 0;
+        float x_93_phi = 0.0f;
+        x_92 = x_92_phi;
+        int const x_95 = x_95_phi;
+        x_118_phi = 0.0f;
+        x_119_phi = x_92;
+        x_120_phi = false;
+        if ((x_95 < 800)) {
+        } else {
+          break;
+        }
+        float x_111 = 0.0f;
+        float x_112_phi = 0.0f;
+        if (((x_95 % 32) == 0)) {
+          x_113 = (x_92 + 0.400000006f);
+          x_93_phi = x_113;
+        } else {
+          x_112_phi = x_92;
+          if (((float(x_95) % rint(x_49)) <= 0.01f)) {
+            x_111 = (x_92 + 100.0f);
+            x_112_phi = x_111;
+          }
+          x_112 = x_112_phi;
+          x_93_phi = x_112;
+        }
+        x_93 = x_93_phi;
+        if ((float(x_95) >= x_88)) {
+          x_118_phi = x_93;
+          x_119_phi = x_93;
+          x_120_phi = true;
+          break;
+        }
+        {
+          x_96 = (x_95 + 1);
+          x_92_phi = x_93;
+          x_95_phi = x_96;
+        }
+      }
+      x_118 = x_118_phi;
+      x_119 = x_119_phi;
+      bool const x_120 = x_120_phi;
+      x_122_phi = x_118;
+      if (x_120) {
+        break;
+      }
+      x_122_phi = x_119;
+      break;
+    }
+  }
+  float const x_122 = x_122_phi;
+  c.y = x_122;
+  float const x_124 = c.x;
+  float const x_125 = c.y;
+  c.z = (x_124 + x_125);
+  x_129_phi = 0;
+  while (true) {
+    int x_130 = 0;
+    int const x_129 = x_129_phi;
+    if ((x_129 < 3)) {
+    } else {
+      break;
+    }
+    int const x_135_save = x_129;
+    float const x_136 = c[x_135_save];
+    if ((x_136 >= 1.0f)) {
+      float const x_140 = c[x_135_save];
+      float const x_141 = c[x_135_save];
+      c[x_135_save] = (x_140 * x_141);
+    }
+    {
+      x_130 = (x_129 + 1);
+      x_129_phi = x_130;
+    }
+  }
+  float3 const x_143 = c;
+  float3 const x_145 = normalize(fabs(x_143));
+  *(tint_symbol_6) = float4(x_145.x, x_145.y, x_145.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_7, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
+T:\tmp\u3lk.0.metal:60:29: error: invalid operands to binary expression ('float' and 'float')
+          if (((float(x_58) % rint(x_49)) <= 0.01f)) {
+                ~~~~~~~~~~~ ^ ~~~~~~~~~~
+T:\tmp\u3lk.0.metal:127:29: error: invalid operands to binary expression ('float' and 'float')
+          if (((float(x_95) % rint(x_49)) <= 0.01f)) {
+                ~~~~~~~~~~~ ^ ~~~~~~~~~~
+2 errors generated.
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-colorgrid-modulo-O-move-block-down/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-colorgrid-modulo-O-move-block-down/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..d596d85
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-colorgrid-modulo-O-move-block-down/1.spvasm.expected.spvasm
@@ -0,0 +1,449 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 254
+; Schema: 0
+               OpCapability Shader
+         %56 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_7 "x_7"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %c "c"
+               OpName %x_51 "x_51"
+               OpName %x_55 "x_55"
+               OpName %x_56 "x_56"
+               OpName %x_81 "x_81"
+               OpName %x_82 "x_82"
+               OpName %x_118 "x_118"
+               OpName %x_119 "x_119"
+               OpName %x_55_phi "x_55_phi"
+               OpName %x_58_phi "x_58_phi"
+               OpName %x_81_phi "x_81_phi"
+               OpName %x_82_phi "x_82_phi"
+               OpName %x_83_phi "x_83_phi"
+               OpName %x_85_phi "x_85_phi"
+               OpName %x_122_phi "x_122_phi"
+               OpName %x_129_phi "x_129_phi"
+               OpName %x_68 "x_68"
+               OpName %x_76 "x_76"
+               OpName %x_59 "x_59"
+               OpName %x_56_phi "x_56_phi"
+               OpName %x_75 "x_75"
+               OpName %x_76_phi "x_76_phi"
+               OpName %x_88 "x_88"
+               OpName %x_92 "x_92"
+               OpName %x_93 "x_93"
+               OpName %x_92_phi "x_92_phi"
+               OpName %x_95_phi "x_95_phi"
+               OpName %x_118_phi "x_118_phi"
+               OpName %x_119_phi "x_119_phi"
+               OpName %x_120_phi "x_120_phi"
+               OpName %x_113 "x_113"
+               OpName %x_112 "x_112"
+               OpName %x_96 "x_96"
+               OpName %x_93_phi "x_93_phi"
+               OpName %x_111 "x_111"
+               OpName %x_112_phi "x_112_phi"
+               OpName %x_130 "x_130"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %22 = OpConstantNull %v3float
+%_ptr_Function_float = OpTypePointer Function %float
+         %25 = OpConstantNull %float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %36 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %42 = OpConstantNull %bool
+    %float_7 = OpConstant %float 7
+    %float_8 = OpConstant %float 8
+    %float_9 = OpConstant %float 9
+         %49 = OpConstantComposite %v3float %float_7 %float_8 %float_9
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%float_0_125 = OpConstant %float 0.125
+%_ptr_Private_float = OpTypePointer Private %float
+ %float_n0_5 = OpConstant %float -0.5
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+      %false = OpConstantFalse %bool
+    %int_800 = OpConstant %int 800
+     %int_32 = OpConstant %int 32
+      %int_0 = OpConstant %int 0
+%float_0_400000006 = OpConstant %float 0.400000006
+%float_0_00999999978 = OpConstant %float 0.00999999978
+  %float_100 = OpConstant %float 100
+       %true = OpConstantTrue %bool
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+      %int_3 = OpConstant %int 3
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %241 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %c = OpVariable %_ptr_Function_v3float Function %22
+       %x_51 = OpVariable %_ptr_Function_float Function %25
+       %x_55 = OpVariable %_ptr_Function_float Function %25
+       %x_56 = OpVariable %_ptr_Function_float Function %25
+       %x_81 = OpVariable %_ptr_Function_float Function %25
+       %x_82 = OpVariable %_ptr_Function_float Function %25
+      %x_118 = OpVariable %_ptr_Function_float Function %25
+      %x_119 = OpVariable %_ptr_Function_float Function %25
+   %x_55_phi = OpVariable %_ptr_Function_float Function %25
+   %x_58_phi = OpVariable %_ptr_Function_int Function %36
+   %x_81_phi = OpVariable %_ptr_Function_float Function %25
+   %x_82_phi = OpVariable %_ptr_Function_float Function %25
+   %x_83_phi = OpVariable %_ptr_Function_bool Function %42
+   %x_85_phi = OpVariable %_ptr_Function_float Function %25
+  %x_122_phi = OpVariable %_ptr_Function_float Function %25
+  %x_129_phi = OpVariable %_ptr_Function_int Function %36
+       %x_68 = OpVariable %_ptr_Function_float Function %25
+       %x_76 = OpVariable %_ptr_Function_float Function %25
+       %x_59 = OpVariable %_ptr_Function_int Function %36
+   %x_56_phi = OpVariable %_ptr_Function_float Function %25
+       %x_75 = OpVariable %_ptr_Function_float Function %25
+   %x_76_phi = OpVariable %_ptr_Function_float Function %25
+       %x_88 = OpVariable %_ptr_Function_float Function %25
+       %x_92 = OpVariable %_ptr_Function_float Function %25
+       %x_93 = OpVariable %_ptr_Function_float Function %25
+   %x_92_phi = OpVariable %_ptr_Function_float Function %25
+   %x_95_phi = OpVariable %_ptr_Function_int Function %36
+  %x_118_phi = OpVariable %_ptr_Function_float Function %25
+  %x_119_phi = OpVariable %_ptr_Function_float Function %25
+  %x_120_phi = OpVariable %_ptr_Function_bool Function %42
+      %x_113 = OpVariable %_ptr_Function_float Function %25
+      %x_112 = OpVariable %_ptr_Function_float Function %25
+       %x_96 = OpVariable %_ptr_Function_int Function %36
+   %x_93_phi = OpVariable %_ptr_Function_float Function %25
+      %x_111 = OpVariable %_ptr_Function_float Function %25
+  %x_112_phi = OpVariable %_ptr_Function_float Function %25
+      %x_130 = OpVariable %_ptr_Function_int Function %36
+               OpStore %c %49
+         %53 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_0
+         %54 = OpLoad %float %53
+         %58 = OpFMul %float %54 %float_0_125
+         %55 = OpExtInst %float %56 RoundEven %58
+         %60 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %61 = OpLoad %float %60
+               OpStore %x_51 %61
+               OpSelectionMerge %62 None
+               OpSwitch %uint_0 %63
+         %63 = OpLabel
+               OpStore %x_55_phi %float_n0_5
+               OpStore %x_58_phi %int_1
+               OpBranch %66
+         %66 = OpLabel
+               OpLoopMerge %67 %68 None
+               OpBranch %69
+         %69 = OpLabel
+         %74 = OpLoad %float %x_55_phi
+               OpStore %x_55 %74
+         %75 = OpLoad %int %x_58_phi
+               OpStore %x_81_phi %float_0
+         %77 = OpLoad %float %x_55
+               OpStore %x_82_phi %77
+               OpStore %x_83_phi %false
+         %80 = OpSLessThan %bool %75 %int_800
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %83
+         %82 = OpLabel
+               OpBranch %81
+         %83 = OpLabel
+               OpBranch %67
+         %81 = OpLabel
+         %87 = OpSMod %int %75 %int_32
+         %89 = OpIEqual %bool %87 %int_0
+               OpSelectionMerge %90 None
+               OpBranchConditional %89 %91 %92
+         %91 = OpLabel
+         %93 = OpLoad %float %x_55
+         %95 = OpFAdd %float %93 %float_0_400000006
+               OpStore %x_68 %95
+         %96 = OpLoad %float %x_68
+               OpStore %x_56_phi %96
+               OpBranch %90
+         %92 = OpLabel
+         %97 = OpLoad %float %x_55
+               OpStore %x_76_phi %97
+         %98 = OpConvertSToF %float %75
+         %99 = OpExtInst %float %56 RoundEven %55
+        %100 = OpFMod %float %98 %99
+        %102 = OpFOrdLessThanEqual %bool %100 %float_0_00999999978
+               OpSelectionMerge %103 None
+               OpBranchConditional %102 %104 %103
+        %104 = OpLabel
+        %105 = OpLoad %float %x_55
+        %107 = OpFAdd %float %105 %float_100
+               OpStore %x_75 %107
+        %108 = OpLoad %float %x_75
+               OpStore %x_76_phi %108
+               OpBranch %103
+        %103 = OpLabel
+        %109 = OpLoad %float %x_76_phi
+               OpStore %x_76 %109
+        %110 = OpLoad %float %x_76
+               OpStore %x_56_phi %110
+               OpBranch %90
+         %90 = OpLabel
+        %111 = OpLoad %float %x_56_phi
+               OpStore %x_56 %111
+        %112 = OpConvertSToF %float %75
+        %113 = OpLoad %float %x_51
+        %114 = OpFOrdGreaterThanEqual %bool %112 %113
+               OpSelectionMerge %115 None
+               OpBranchConditional %114 %116 %115
+        %116 = OpLabel
+        %117 = OpLoad %float %x_56
+               OpStore %x_81_phi %117
+        %118 = OpLoad %float %x_56
+               OpStore %x_82_phi %118
+               OpStore %x_83_phi %true
+               OpBranch %67
+        %115 = OpLabel
+               OpBranch %68
+         %68 = OpLabel
+        %120 = OpIAdd %int %75 %int_1
+               OpStore %x_59 %120
+        %121 = OpLoad %float %x_56
+               OpStore %x_55_phi %121
+        %122 = OpLoad %int %x_59
+               OpStore %x_58_phi %122
+               OpBranch %66
+         %67 = OpLabel
+        %123 = OpLoad %float %x_81_phi
+               OpStore %x_81 %123
+        %124 = OpLoad %float %x_82_phi
+               OpStore %x_82 %124
+        %125 = OpLoad %bool %x_83_phi
+        %126 = OpLoad %float %x_81
+               OpStore %x_85_phi %126
+               OpSelectionMerge %127 None
+               OpBranchConditional %125 %128 %127
+        %128 = OpLabel
+               OpBranch %62
+        %127 = OpLabel
+        %129 = OpLoad %float %x_82
+               OpStore %x_85_phi %129
+               OpBranch %62
+         %62 = OpLabel
+        %138 = OpLoad %float %x_85_phi
+        %139 = OpAccessChain %_ptr_Function_float %c %uint_0
+               OpStore %139 %138
+        %141 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %142 = OpLoad %float %141
+               OpStore %x_88 %142
+               OpSelectionMerge %143 None
+               OpSwitch %uint_0 %144
+        %144 = OpLabel
+               OpStore %x_92_phi %float_n0_5
+               OpStore %x_95_phi %int_1
+               OpBranch %145
+        %145 = OpLabel
+               OpLoopMerge %146 %147 None
+               OpBranch %148
+        %148 = OpLabel
+        %153 = OpLoad %float %x_92_phi
+               OpStore %x_92 %153
+        %154 = OpLoad %int %x_95_phi
+               OpStore %x_118_phi %float_0
+        %155 = OpLoad %float %x_92
+               OpStore %x_119_phi %155
+               OpStore %x_120_phi %false
+        %156 = OpSLessThan %bool %154 %int_800
+               OpSelectionMerge %157 None
+               OpBranchConditional %156 %158 %159
+        %158 = OpLabel
+               OpBranch %157
+        %159 = OpLabel
+               OpBranch %146
+        %157 = OpLabel
+        %162 = OpSMod %int %154 %int_32
+        %163 = OpIEqual %bool %162 %int_0
+               OpSelectionMerge %164 None
+               OpBranchConditional %163 %165 %166
+        %165 = OpLabel
+        %167 = OpLoad %float %x_92
+        %168 = OpFAdd %float %167 %float_0_400000006
+               OpStore %x_113 %168
+        %169 = OpLoad %float %x_113
+               OpStore %x_93_phi %169
+               OpBranch %164
+        %166 = OpLabel
+        %170 = OpLoad %float %x_92
+               OpStore %x_112_phi %170
+        %171 = OpConvertSToF %float %154
+        %172 = OpExtInst %float %56 RoundEven %55
+        %173 = OpFMod %float %171 %172
+        %174 = OpFOrdLessThanEqual %bool %173 %float_0_00999999978
+               OpSelectionMerge %175 None
+               OpBranchConditional %174 %176 %175
+        %176 = OpLabel
+        %177 = OpLoad %float %x_92
+        %178 = OpFAdd %float %177 %float_100
+               OpStore %x_111 %178
+        %179 = OpLoad %float %x_111
+               OpStore %x_112_phi %179
+               OpBranch %175
+        %175 = OpLabel
+        %180 = OpLoad %float %x_112_phi
+               OpStore %x_112 %180
+        %181 = OpLoad %float %x_112
+               OpStore %x_93_phi %181
+               OpBranch %164
+        %164 = OpLabel
+        %182 = OpLoad %float %x_93_phi
+               OpStore %x_93 %182
+        %183 = OpConvertSToF %float %154
+        %184 = OpLoad %float %x_88
+        %185 = OpFOrdGreaterThanEqual %bool %183 %184
+               OpSelectionMerge %186 None
+               OpBranchConditional %185 %187 %186
+        %187 = OpLabel
+        %188 = OpLoad %float %x_93
+               OpStore %x_118_phi %188
+        %189 = OpLoad %float %x_93
+               OpStore %x_119_phi %189
+               OpStore %x_120_phi %true
+               OpBranch %146
+        %186 = OpLabel
+               OpBranch %147
+        %147 = OpLabel
+        %190 = OpIAdd %int %154 %int_1
+               OpStore %x_96 %190
+        %191 = OpLoad %float %x_93
+               OpStore %x_92_phi %191
+        %192 = OpLoad %int %x_96
+               OpStore %x_95_phi %192
+               OpBranch %145
+        %146 = OpLabel
+        %193 = OpLoad %float %x_118_phi
+               OpStore %x_118 %193
+        %194 = OpLoad %float %x_119_phi
+               OpStore %x_119 %194
+        %195 = OpLoad %bool %x_120_phi
+        %196 = OpLoad %float %x_118
+               OpStore %x_122_phi %196
+               OpSelectionMerge %197 None
+               OpBranchConditional %195 %198 %197
+        %198 = OpLabel
+               OpBranch %143
+        %197 = OpLabel
+        %199 = OpLoad %float %x_119
+               OpStore %x_122_phi %199
+               OpBranch %143
+        %143 = OpLabel
+        %200 = OpLoad %float %x_122_phi
+        %201 = OpAccessChain %_ptr_Function_float %c %uint_1
+               OpStore %201 %200
+        %202 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %203 = OpLoad %float %202
+        %204 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %205 = OpLoad %float %204
+        %207 = OpAccessChain %_ptr_Function_float %c %uint_2
+        %208 = OpFAdd %float %203 %205
+               OpStore %207 %208
+               OpStore %x_129_phi %int_0
+               OpBranch %209
+        %209 = OpLabel
+               OpLoopMerge %210 %211 None
+               OpBranch %212
+        %212 = OpLabel
+        %214 = OpLoad %int %x_129_phi
+        %216 = OpSLessThan %bool %214 %int_3
+               OpSelectionMerge %217 None
+               OpBranchConditional %216 %218 %219
+        %218 = OpLabel
+               OpBranch %217
+        %219 = OpLabel
+               OpBranch %210
+        %217 = OpLabel
+        %220 = OpAccessChain %_ptr_Function_float %c %214
+        %221 = OpLoad %float %220
+        %223 = OpFOrdGreaterThanEqual %bool %221 %float_1
+               OpSelectionMerge %224 None
+               OpBranchConditional %223 %225 %224
+        %225 = OpLabel
+        %226 = OpAccessChain %_ptr_Function_float %c %214
+        %227 = OpLoad %float %226
+        %228 = OpAccessChain %_ptr_Function_float %c %214
+        %229 = OpLoad %float %228
+        %230 = OpAccessChain %_ptr_Function_float %c %214
+        %231 = OpFMul %float %227 %229
+               OpStore %230 %231
+               OpBranch %224
+        %224 = OpLabel
+               OpBranch %211
+        %211 = OpLabel
+        %232 = OpIAdd %int %214 %int_1
+               OpStore %x_130 %232
+        %233 = OpLoad %int %x_130
+               OpStore %x_129_phi %233
+               OpBranch %209
+        %210 = OpLabel
+        %234 = OpLoad %v3float %c
+        %236 = OpExtInst %v3float %56 FAbs %234
+        %235 = OpExtInst %v3float %56 Normalize %236
+        %237 = OpCompositeExtract %float %235 0
+        %238 = OpCompositeExtract %float %235 1
+        %239 = OpCompositeExtract %float %235 2
+        %240 = OpCompositeConstruct %v4float %237 %238 %239 %float_1
+               OpStore %x_GLF_color %240
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %241
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %245 = OpLabel
+        %246 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %246
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %248 = OpLabel
+        %249 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %249
+        %250 = OpFunctionCall %void %main_1
+        %252 = OpLoad %v4float %x_GLF_color
+        %253 = OpCompositeConstruct %main_out %252
+        %251 = OpFunctionCall %void %tint_symbol_3 %253
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-colorgrid-modulo-O-move-block-down/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-colorgrid-modulo-O-move-block-down/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..20e6da9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-colorgrid-modulo-O-move-block-down/1.spvasm.expected.wgsl
@@ -0,0 +1,200 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var c : vec3<f32>;
+  var x_51 : f32;
+  var x_55 : f32;
+  var x_56 : f32;
+  var x_81 : f32;
+  var x_82 : f32;
+  var x_118 : f32;
+  var x_119 : f32;
+  var x_55_phi : f32;
+  var x_58_phi : i32;
+  var x_81_phi : f32;
+  var x_82_phi : f32;
+  var x_83_phi : bool;
+  var x_85_phi : f32;
+  var x_122_phi : f32;
+  var x_129_phi : i32;
+  c = vec3<f32>(7.0, 8.0, 9.0);
+  let x_47 : f32 = x_7.resolution.x;
+  let x_49 : f32 = round((x_47 * 0.125));
+  x_51 = gl_FragCoord.x;
+  switch(0u) {
+    default: {
+      x_55_phi = -0.5;
+      x_58_phi = 1;
+      loop {
+        var x_68 : f32;
+        var x_76 : f32;
+        var x_59 : i32;
+        var x_56_phi : f32;
+        x_55 = x_55_phi;
+        let x_58 : i32 = x_58_phi;
+        x_81_phi = 0.0;
+        x_82_phi = x_55;
+        x_83_phi = false;
+        if ((x_58 < 800)) {
+        } else {
+          break;
+        }
+        var x_75 : f32;
+        var x_76_phi : f32;
+        if (((x_58 % 32) == 0)) {
+          x_68 = (x_55 + 0.400000006);
+          x_56_phi = x_68;
+        } else {
+          x_76_phi = x_55;
+          if (((f32(x_58) % round(x_49)) <= 0.01)) {
+            x_75 = (x_55 + 100.0);
+            x_76_phi = x_75;
+          }
+          x_76 = x_76_phi;
+          x_56_phi = x_76;
+        }
+        x_56 = x_56_phi;
+        if ((f32(x_58) >= x_51)) {
+          x_81_phi = x_56;
+          x_82_phi = x_56;
+          x_83_phi = true;
+          break;
+        }
+
+        continuing {
+          x_59 = (x_58 + 1);
+          x_55_phi = x_56;
+          x_58_phi = x_59;
+        }
+      }
+      x_81 = x_81_phi;
+      x_82 = x_82_phi;
+      let x_83 : bool = x_83_phi;
+      x_85_phi = x_81;
+      if (x_83) {
+        break;
+      }
+      x_85_phi = x_82;
+    }
+  }
+  var x_88 : f32;
+  var x_92 : f32;
+  var x_93 : f32;
+  var x_92_phi : f32;
+  var x_95_phi : i32;
+  var x_118_phi : f32;
+  var x_119_phi : f32;
+  var x_120_phi : bool;
+  let x_85 : f32 = x_85_phi;
+  let x_86 : ptr<function, f32> = &(c.x);
+  *(x_86) = x_85;
+  x_88 = gl_FragCoord.y;
+  switch(0u) {
+    default: {
+      x_92_phi = -0.5;
+      x_95_phi = 1;
+      loop {
+        var x_113 : f32;
+        var x_112 : f32;
+        var x_96 : i32;
+        var x_93_phi : f32;
+        x_92 = x_92_phi;
+        let x_95 : i32 = x_95_phi;
+        x_118_phi = 0.0;
+        x_119_phi = x_92;
+        x_120_phi = false;
+        if ((x_95 < 800)) {
+        } else {
+          break;
+        }
+        var x_111 : f32;
+        var x_112_phi : f32;
+        if (((x_95 % 32) == 0)) {
+          x_113 = (x_92 + 0.400000006);
+          x_93_phi = x_113;
+        } else {
+          x_112_phi = x_92;
+          if (((f32(x_95) % round(x_49)) <= 0.01)) {
+            x_111 = (x_92 + 100.0);
+            x_112_phi = x_111;
+          }
+          x_112 = x_112_phi;
+          x_93_phi = x_112;
+        }
+        x_93 = x_93_phi;
+        if ((f32(x_95) >= x_88)) {
+          x_118_phi = x_93;
+          x_119_phi = x_93;
+          x_120_phi = true;
+          break;
+        }
+
+        continuing {
+          x_96 = (x_95 + 1);
+          x_92_phi = x_93;
+          x_95_phi = x_96;
+        }
+      }
+      x_118 = x_118_phi;
+      x_119 = x_119_phi;
+      let x_120 : bool = x_120_phi;
+      x_122_phi = x_118;
+      if (x_120) {
+        break;
+      }
+      x_122_phi = x_119;
+    }
+  }
+  let x_122 : f32 = x_122_phi;
+  let x_123 : ptr<function, f32> = &(c.y);
+  *(x_123) = x_122;
+  let x_124 : f32 = *(x_86);
+  let x_125 : f32 = *(x_123);
+  c.z = (x_124 + x_125);
+  x_129_phi = 0;
+  loop {
+    var x_130 : i32;
+    let x_129 : i32 = x_129_phi;
+    if ((x_129 < 3)) {
+    } else {
+      break;
+    }
+    let x_135 : ptr<function, f32> = &(c[x_129]);
+    let x_136 : f32 = *(x_135);
+    if ((x_136 >= 1.0)) {
+      let x_140 : f32 = *(x_135);
+      let x_141 : f32 = *(x_135);
+      *(x_135) = (x_140 * x_141);
+    }
+
+    continuing {
+      x_130 = (x_129 + 1);
+      x_129_phi = x_130;
+    }
+  }
+  let x_143 : vec3<f32> = c;
+  let x_145 : vec3<f32> = normalize(abs(x_143));
+  x_GLF_color = vec4<f32>(x_145.x, x_145.y, x_145.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-colorgrid-modulo-O-move-block-down/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-colorgrid-modulo-O-move-block-down/1.wgsl
new file mode 100644
index 0000000..20e6da9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-colorgrid-modulo-O-move-block-down/1.wgsl
@@ -0,0 +1,200 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var c : vec3<f32>;
+  var x_51 : f32;
+  var x_55 : f32;
+  var x_56 : f32;
+  var x_81 : f32;
+  var x_82 : f32;
+  var x_118 : f32;
+  var x_119 : f32;
+  var x_55_phi : f32;
+  var x_58_phi : i32;
+  var x_81_phi : f32;
+  var x_82_phi : f32;
+  var x_83_phi : bool;
+  var x_85_phi : f32;
+  var x_122_phi : f32;
+  var x_129_phi : i32;
+  c = vec3<f32>(7.0, 8.0, 9.0);
+  let x_47 : f32 = x_7.resolution.x;
+  let x_49 : f32 = round((x_47 * 0.125));
+  x_51 = gl_FragCoord.x;
+  switch(0u) {
+    default: {
+      x_55_phi = -0.5;
+      x_58_phi = 1;
+      loop {
+        var x_68 : f32;
+        var x_76 : f32;
+        var x_59 : i32;
+        var x_56_phi : f32;
+        x_55 = x_55_phi;
+        let x_58 : i32 = x_58_phi;
+        x_81_phi = 0.0;
+        x_82_phi = x_55;
+        x_83_phi = false;
+        if ((x_58 < 800)) {
+        } else {
+          break;
+        }
+        var x_75 : f32;
+        var x_76_phi : f32;
+        if (((x_58 % 32) == 0)) {
+          x_68 = (x_55 + 0.400000006);
+          x_56_phi = x_68;
+        } else {
+          x_76_phi = x_55;
+          if (((f32(x_58) % round(x_49)) <= 0.01)) {
+            x_75 = (x_55 + 100.0);
+            x_76_phi = x_75;
+          }
+          x_76 = x_76_phi;
+          x_56_phi = x_76;
+        }
+        x_56 = x_56_phi;
+        if ((f32(x_58) >= x_51)) {
+          x_81_phi = x_56;
+          x_82_phi = x_56;
+          x_83_phi = true;
+          break;
+        }
+
+        continuing {
+          x_59 = (x_58 + 1);
+          x_55_phi = x_56;
+          x_58_phi = x_59;
+        }
+      }
+      x_81 = x_81_phi;
+      x_82 = x_82_phi;
+      let x_83 : bool = x_83_phi;
+      x_85_phi = x_81;
+      if (x_83) {
+        break;
+      }
+      x_85_phi = x_82;
+    }
+  }
+  var x_88 : f32;
+  var x_92 : f32;
+  var x_93 : f32;
+  var x_92_phi : f32;
+  var x_95_phi : i32;
+  var x_118_phi : f32;
+  var x_119_phi : f32;
+  var x_120_phi : bool;
+  let x_85 : f32 = x_85_phi;
+  let x_86 : ptr<function, f32> = &(c.x);
+  *(x_86) = x_85;
+  x_88 = gl_FragCoord.y;
+  switch(0u) {
+    default: {
+      x_92_phi = -0.5;
+      x_95_phi = 1;
+      loop {
+        var x_113 : f32;
+        var x_112 : f32;
+        var x_96 : i32;
+        var x_93_phi : f32;
+        x_92 = x_92_phi;
+        let x_95 : i32 = x_95_phi;
+        x_118_phi = 0.0;
+        x_119_phi = x_92;
+        x_120_phi = false;
+        if ((x_95 < 800)) {
+        } else {
+          break;
+        }
+        var x_111 : f32;
+        var x_112_phi : f32;
+        if (((x_95 % 32) == 0)) {
+          x_113 = (x_92 + 0.400000006);
+          x_93_phi = x_113;
+        } else {
+          x_112_phi = x_92;
+          if (((f32(x_95) % round(x_49)) <= 0.01)) {
+            x_111 = (x_92 + 100.0);
+            x_112_phi = x_111;
+          }
+          x_112 = x_112_phi;
+          x_93_phi = x_112;
+        }
+        x_93 = x_93_phi;
+        if ((f32(x_95) >= x_88)) {
+          x_118_phi = x_93;
+          x_119_phi = x_93;
+          x_120_phi = true;
+          break;
+        }
+
+        continuing {
+          x_96 = (x_95 + 1);
+          x_92_phi = x_93;
+          x_95_phi = x_96;
+        }
+      }
+      x_118 = x_118_phi;
+      x_119 = x_119_phi;
+      let x_120 : bool = x_120_phi;
+      x_122_phi = x_118;
+      if (x_120) {
+        break;
+      }
+      x_122_phi = x_119;
+    }
+  }
+  let x_122 : f32 = x_122_phi;
+  let x_123 : ptr<function, f32> = &(c.y);
+  *(x_123) = x_122;
+  let x_124 : f32 = *(x_86);
+  let x_125 : f32 = *(x_123);
+  c.z = (x_124 + x_125);
+  x_129_phi = 0;
+  loop {
+    var x_130 : i32;
+    let x_129 : i32 = x_129_phi;
+    if ((x_129 < 3)) {
+    } else {
+      break;
+    }
+    let x_135 : ptr<function, f32> = &(c[x_129]);
+    let x_136 : f32 = *(x_135);
+    if ((x_136 >= 1.0)) {
+      let x_140 : f32 = *(x_135);
+      let x_141 : f32 = *(x_135);
+      *(x_135) = (x_140 * x_141);
+    }
+
+    continuing {
+      x_130 = (x_129 + 1);
+      x_129_phi = x_130;
+    }
+  }
+  let x_143 : vec3<f32> = c;
+  let x_145 : vec3<f32> = normalize(abs(x_143));
+  x_GLF_color = vec4<f32>(x_145.x, x_145.y, x_145.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-colorgrid-modulo-O-move-block-down/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-colorgrid-modulo-O-move-block-down/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..3102fad
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-colorgrid-modulo-O-move-block-down/1.wgsl.expected.hlsl
@@ -0,0 +1,202 @@
+void set_float3(inout float3 vec, int idx, float val) {
+  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
+}
+
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float3 c = float3(0.0f, 0.0f, 0.0f);
+  float x_51 = 0.0f;
+  float x_55 = 0.0f;
+  float x_56 = 0.0f;
+  float x_81 = 0.0f;
+  float x_82 = 0.0f;
+  float x_118 = 0.0f;
+  float x_119 = 0.0f;
+  float x_55_phi = 0.0f;
+  int x_58_phi = 0;
+  float x_81_phi = 0.0f;
+  float x_82_phi = 0.0f;
+  bool x_83_phi = false;
+  float x_85_phi = 0.0f;
+  float x_122_phi = 0.0f;
+  int x_129_phi = 0;
+  c = float3(7.0f, 8.0f, 9.0f);
+  const float x_47 = asfloat(x_7[0].x);
+  const float x_49 = round((x_47 * 0.125f));
+  x_51 = gl_FragCoord.x;
+  switch(0u) {
+    default: {
+      x_55_phi = -0.5f;
+      x_58_phi = 1;
+      while (true) {
+        float x_68 = 0.0f;
+        float x_76 = 0.0f;
+        int x_59 = 0;
+        float x_56_phi = 0.0f;
+        x_55 = x_55_phi;
+        const int x_58 = x_58_phi;
+        x_81_phi = 0.0f;
+        x_82_phi = x_55;
+        x_83_phi = false;
+        if ((x_58 < 800)) {
+        } else {
+          break;
+        }
+        float x_75 = 0.0f;
+        float x_76_phi = 0.0f;
+        if (((x_58 % 32) == 0)) {
+          x_68 = (x_55 + 0.400000006f);
+          x_56_phi = x_68;
+        } else {
+          x_76_phi = x_55;
+          if (((float(x_58) % round(x_49)) <= 0.01f)) {
+            x_75 = (x_55 + 100.0f);
+            x_76_phi = x_75;
+          }
+          x_76 = x_76_phi;
+          x_56_phi = x_76;
+        }
+        x_56 = x_56_phi;
+        if ((float(x_58) >= x_51)) {
+          x_81_phi = x_56;
+          x_82_phi = x_56;
+          x_83_phi = true;
+          break;
+        }
+        {
+          x_59 = (x_58 + 1);
+          x_55_phi = x_56;
+          x_58_phi = x_59;
+        }
+      }
+      x_81 = x_81_phi;
+      x_82 = x_82_phi;
+      const bool x_83 = x_83_phi;
+      x_85_phi = x_81;
+      if (x_83) {
+        break;
+      }
+      x_85_phi = x_82;
+      break;
+    }
+  }
+  float x_88 = 0.0f;
+  float x_92 = 0.0f;
+  float x_93 = 0.0f;
+  float x_92_phi = 0.0f;
+  int x_95_phi = 0;
+  float x_118_phi = 0.0f;
+  float x_119_phi = 0.0f;
+  bool x_120_phi = false;
+  const float x_85 = x_85_phi;
+  c.x = x_85;
+  x_88 = gl_FragCoord.y;
+  switch(0u) {
+    default: {
+      x_92_phi = -0.5f;
+      x_95_phi = 1;
+      while (true) {
+        float x_113 = 0.0f;
+        float x_112 = 0.0f;
+        int x_96 = 0;
+        float x_93_phi = 0.0f;
+        x_92 = x_92_phi;
+        const int x_95 = x_95_phi;
+        x_118_phi = 0.0f;
+        x_119_phi = x_92;
+        x_120_phi = false;
+        if ((x_95 < 800)) {
+        } else {
+          break;
+        }
+        float x_111 = 0.0f;
+        float x_112_phi = 0.0f;
+        if (((x_95 % 32) == 0)) {
+          x_113 = (x_92 + 0.400000006f);
+          x_93_phi = x_113;
+        } else {
+          x_112_phi = x_92;
+          if (((float(x_95) % round(x_49)) <= 0.01f)) {
+            x_111 = (x_92 + 100.0f);
+            x_112_phi = x_111;
+          }
+          x_112 = x_112_phi;
+          x_93_phi = x_112;
+        }
+        x_93 = x_93_phi;
+        if ((float(x_95) >= x_88)) {
+          x_118_phi = x_93;
+          x_119_phi = x_93;
+          x_120_phi = true;
+          break;
+        }
+        {
+          x_96 = (x_95 + 1);
+          x_92_phi = x_93;
+          x_95_phi = x_96;
+        }
+      }
+      x_118 = x_118_phi;
+      x_119 = x_119_phi;
+      const bool x_120 = x_120_phi;
+      x_122_phi = x_118;
+      if (x_120) {
+        break;
+      }
+      x_122_phi = x_119;
+      break;
+    }
+  }
+  const float x_122 = x_122_phi;
+  c.y = x_122;
+  const float x_124 = c.x;
+  const float x_125 = c.y;
+  c.z = (x_124 + x_125);
+  x_129_phi = 0;
+  while (true) {
+    int x_130 = 0;
+    const int x_129 = x_129_phi;
+    if ((x_129 < 3)) {
+    } else {
+      break;
+    }
+    const int x_135_save = x_129;
+    const float x_136 = c[x_135_save];
+    if ((x_136 >= 1.0f)) {
+      const float x_140 = c[x_135_save];
+      const float x_141 = c[x_135_save];
+      set_float3(c, x_135_save, (x_140 * x_141));
+    }
+    {
+      x_130 = (x_129 + 1);
+      x_129_phi = x_130;
+    }
+  }
+  const float3 x_145 = normalize(abs(c));
+  x_GLF_color = float4(x_145.x, x_145.y, x_145.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-colorgrid-modulo-O-move-block-down/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-colorgrid-modulo-O-move-block-down/1.wgsl.expected.msl
new file mode 100755
index 0000000..f28bdc8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-colorgrid-modulo-O-move-block-down/1.wgsl.expected.msl
@@ -0,0 +1,208 @@
+SKIP: FAILED
+
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float3 c = 0.0f;
+  float x_51 = 0.0f;
+  float x_55 = 0.0f;
+  float x_56 = 0.0f;
+  float x_81 = 0.0f;
+  float x_82 = 0.0f;
+  float x_118 = 0.0f;
+  float x_119 = 0.0f;
+  float x_55_phi = 0.0f;
+  int x_58_phi = 0;
+  float x_81_phi = 0.0f;
+  float x_82_phi = 0.0f;
+  bool x_83_phi = false;
+  float x_85_phi = 0.0f;
+  float x_122_phi = 0.0f;
+  int x_129_phi = 0;
+  c = float3(7.0f, 8.0f, 9.0f);
+  float const x_47 = x_7.resolution.x;
+  float const x_49 = rint((x_47 * 0.125f));
+  x_51 = (*(tint_symbol_5)).x;
+  switch(0u) {
+    default: {
+      x_55_phi = -0.5f;
+      x_58_phi = 1;
+      while (true) {
+        float x_68 = 0.0f;
+        float x_76 = 0.0f;
+        int x_59 = 0;
+        float x_56_phi = 0.0f;
+        x_55 = x_55_phi;
+        int const x_58 = x_58_phi;
+        x_81_phi = 0.0f;
+        x_82_phi = x_55;
+        x_83_phi = false;
+        if ((x_58 < 800)) {
+        } else {
+          break;
+        }
+        float x_75 = 0.0f;
+        float x_76_phi = 0.0f;
+        if (((x_58 % 32) == 0)) {
+          x_68 = (x_55 + 0.400000006f);
+          x_56_phi = x_68;
+        } else {
+          x_76_phi = x_55;
+          if (((float(x_58) % rint(x_49)) <= 0.01f)) {
+            x_75 = (x_55 + 100.0f);
+            x_76_phi = x_75;
+          }
+          x_76 = x_76_phi;
+          x_56_phi = x_76;
+        }
+        x_56 = x_56_phi;
+        if ((float(x_58) >= x_51)) {
+          x_81_phi = x_56;
+          x_82_phi = x_56;
+          x_83_phi = true;
+          break;
+        }
+        {
+          x_59 = (x_58 + 1);
+          x_55_phi = x_56;
+          x_58_phi = x_59;
+        }
+      }
+      x_81 = x_81_phi;
+      x_82 = x_82_phi;
+      bool const x_83 = x_83_phi;
+      x_85_phi = x_81;
+      if (x_83) {
+        break;
+      }
+      x_85_phi = x_82;
+      break;
+    }
+  }
+  float x_88 = 0.0f;
+  float x_92 = 0.0f;
+  float x_93 = 0.0f;
+  float x_92_phi = 0.0f;
+  int x_95_phi = 0;
+  float x_118_phi = 0.0f;
+  float x_119_phi = 0.0f;
+  bool x_120_phi = false;
+  float const x_85 = x_85_phi;
+  c.x = x_85;
+  x_88 = (*(tint_symbol_5)).y;
+  switch(0u) {
+    default: {
+      x_92_phi = -0.5f;
+      x_95_phi = 1;
+      while (true) {
+        float x_113 = 0.0f;
+        float x_112 = 0.0f;
+        int x_96 = 0;
+        float x_93_phi = 0.0f;
+        x_92 = x_92_phi;
+        int const x_95 = x_95_phi;
+        x_118_phi = 0.0f;
+        x_119_phi = x_92;
+        x_120_phi = false;
+        if ((x_95 < 800)) {
+        } else {
+          break;
+        }
+        float x_111 = 0.0f;
+        float x_112_phi = 0.0f;
+        if (((x_95 % 32) == 0)) {
+          x_113 = (x_92 + 0.400000006f);
+          x_93_phi = x_113;
+        } else {
+          x_112_phi = x_92;
+          if (((float(x_95) % rint(x_49)) <= 0.01f)) {
+            x_111 = (x_92 + 100.0f);
+            x_112_phi = x_111;
+          }
+          x_112 = x_112_phi;
+          x_93_phi = x_112;
+        }
+        x_93 = x_93_phi;
+        if ((float(x_95) >= x_88)) {
+          x_118_phi = x_93;
+          x_119_phi = x_93;
+          x_120_phi = true;
+          break;
+        }
+        {
+          x_96 = (x_95 + 1);
+          x_92_phi = x_93;
+          x_95_phi = x_96;
+        }
+      }
+      x_118 = x_118_phi;
+      x_119 = x_119_phi;
+      bool const x_120 = x_120_phi;
+      x_122_phi = x_118;
+      if (x_120) {
+        break;
+      }
+      x_122_phi = x_119;
+      break;
+    }
+  }
+  float const x_122 = x_122_phi;
+  c.y = x_122;
+  float const x_124 = c.x;
+  float const x_125 = c.y;
+  c.z = (x_124 + x_125);
+  x_129_phi = 0;
+  while (true) {
+    int x_130 = 0;
+    int const x_129 = x_129_phi;
+    if ((x_129 < 3)) {
+    } else {
+      break;
+    }
+    int const x_135_save = x_129;
+    float const x_136 = c[x_135_save];
+    if ((x_136 >= 1.0f)) {
+      float const x_140 = c[x_135_save];
+      float const x_141 = c[x_135_save];
+      c[x_135_save] = (x_140 * x_141);
+    }
+    {
+      x_130 = (x_129 + 1);
+      x_129_phi = x_130;
+    }
+  }
+  float3 const x_143 = c;
+  float3 const x_145 = normalize(fabs(x_143));
+  *(tint_symbol_6) = float4(x_145.x, x_145.y, x_145.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_7, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
+T:\tmp\udmw.0.metal:60:29: error: invalid operands to binary expression ('float' and 'float')
+          if (((float(x_58) % rint(x_49)) <= 0.01f)) {
+                ~~~~~~~~~~~ ^ ~~~~~~~~~~
+T:\tmp\udmw.0.metal:127:29: error: invalid operands to binary expression ('float' and 'float')
+          if (((float(x_95) % rint(x_49)) <= 0.01f)) {
+                ~~~~~~~~~~~ ^ ~~~~~~~~~~
+2 errors generated.
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-colorgrid-modulo-O-move-block-down/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-colorgrid-modulo-O-move-block-down/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..d596d85
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-colorgrid-modulo-O-move-block-down/1.wgsl.expected.spvasm
@@ -0,0 +1,449 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 254
+; Schema: 0
+               OpCapability Shader
+         %56 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_7 "x_7"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %c "c"
+               OpName %x_51 "x_51"
+               OpName %x_55 "x_55"
+               OpName %x_56 "x_56"
+               OpName %x_81 "x_81"
+               OpName %x_82 "x_82"
+               OpName %x_118 "x_118"
+               OpName %x_119 "x_119"
+               OpName %x_55_phi "x_55_phi"
+               OpName %x_58_phi "x_58_phi"
+               OpName %x_81_phi "x_81_phi"
+               OpName %x_82_phi "x_82_phi"
+               OpName %x_83_phi "x_83_phi"
+               OpName %x_85_phi "x_85_phi"
+               OpName %x_122_phi "x_122_phi"
+               OpName %x_129_phi "x_129_phi"
+               OpName %x_68 "x_68"
+               OpName %x_76 "x_76"
+               OpName %x_59 "x_59"
+               OpName %x_56_phi "x_56_phi"
+               OpName %x_75 "x_75"
+               OpName %x_76_phi "x_76_phi"
+               OpName %x_88 "x_88"
+               OpName %x_92 "x_92"
+               OpName %x_93 "x_93"
+               OpName %x_92_phi "x_92_phi"
+               OpName %x_95_phi "x_95_phi"
+               OpName %x_118_phi "x_118_phi"
+               OpName %x_119_phi "x_119_phi"
+               OpName %x_120_phi "x_120_phi"
+               OpName %x_113 "x_113"
+               OpName %x_112 "x_112"
+               OpName %x_96 "x_96"
+               OpName %x_93_phi "x_93_phi"
+               OpName %x_111 "x_111"
+               OpName %x_112_phi "x_112_phi"
+               OpName %x_130 "x_130"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %22 = OpConstantNull %v3float
+%_ptr_Function_float = OpTypePointer Function %float
+         %25 = OpConstantNull %float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %36 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %42 = OpConstantNull %bool
+    %float_7 = OpConstant %float 7
+    %float_8 = OpConstant %float 8
+    %float_9 = OpConstant %float 9
+         %49 = OpConstantComposite %v3float %float_7 %float_8 %float_9
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%float_0_125 = OpConstant %float 0.125
+%_ptr_Private_float = OpTypePointer Private %float
+ %float_n0_5 = OpConstant %float -0.5
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+      %false = OpConstantFalse %bool
+    %int_800 = OpConstant %int 800
+     %int_32 = OpConstant %int 32
+      %int_0 = OpConstant %int 0
+%float_0_400000006 = OpConstant %float 0.400000006
+%float_0_00999999978 = OpConstant %float 0.00999999978
+  %float_100 = OpConstant %float 100
+       %true = OpConstantTrue %bool
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+      %int_3 = OpConstant %int 3
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %241 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %c = OpVariable %_ptr_Function_v3float Function %22
+       %x_51 = OpVariable %_ptr_Function_float Function %25
+       %x_55 = OpVariable %_ptr_Function_float Function %25
+       %x_56 = OpVariable %_ptr_Function_float Function %25
+       %x_81 = OpVariable %_ptr_Function_float Function %25
+       %x_82 = OpVariable %_ptr_Function_float Function %25
+      %x_118 = OpVariable %_ptr_Function_float Function %25
+      %x_119 = OpVariable %_ptr_Function_float Function %25
+   %x_55_phi = OpVariable %_ptr_Function_float Function %25
+   %x_58_phi = OpVariable %_ptr_Function_int Function %36
+   %x_81_phi = OpVariable %_ptr_Function_float Function %25
+   %x_82_phi = OpVariable %_ptr_Function_float Function %25
+   %x_83_phi = OpVariable %_ptr_Function_bool Function %42
+   %x_85_phi = OpVariable %_ptr_Function_float Function %25
+  %x_122_phi = OpVariable %_ptr_Function_float Function %25
+  %x_129_phi = OpVariable %_ptr_Function_int Function %36
+       %x_68 = OpVariable %_ptr_Function_float Function %25
+       %x_76 = OpVariable %_ptr_Function_float Function %25
+       %x_59 = OpVariable %_ptr_Function_int Function %36
+   %x_56_phi = OpVariable %_ptr_Function_float Function %25
+       %x_75 = OpVariable %_ptr_Function_float Function %25
+   %x_76_phi = OpVariable %_ptr_Function_float Function %25
+       %x_88 = OpVariable %_ptr_Function_float Function %25
+       %x_92 = OpVariable %_ptr_Function_float Function %25
+       %x_93 = OpVariable %_ptr_Function_float Function %25
+   %x_92_phi = OpVariable %_ptr_Function_float Function %25
+   %x_95_phi = OpVariable %_ptr_Function_int Function %36
+  %x_118_phi = OpVariable %_ptr_Function_float Function %25
+  %x_119_phi = OpVariable %_ptr_Function_float Function %25
+  %x_120_phi = OpVariable %_ptr_Function_bool Function %42
+      %x_113 = OpVariable %_ptr_Function_float Function %25
+      %x_112 = OpVariable %_ptr_Function_float Function %25
+       %x_96 = OpVariable %_ptr_Function_int Function %36
+   %x_93_phi = OpVariable %_ptr_Function_float Function %25
+      %x_111 = OpVariable %_ptr_Function_float Function %25
+  %x_112_phi = OpVariable %_ptr_Function_float Function %25
+      %x_130 = OpVariable %_ptr_Function_int Function %36
+               OpStore %c %49
+         %53 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_0
+         %54 = OpLoad %float %53
+         %58 = OpFMul %float %54 %float_0_125
+         %55 = OpExtInst %float %56 RoundEven %58
+         %60 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %61 = OpLoad %float %60
+               OpStore %x_51 %61
+               OpSelectionMerge %62 None
+               OpSwitch %uint_0 %63
+         %63 = OpLabel
+               OpStore %x_55_phi %float_n0_5
+               OpStore %x_58_phi %int_1
+               OpBranch %66
+         %66 = OpLabel
+               OpLoopMerge %67 %68 None
+               OpBranch %69
+         %69 = OpLabel
+         %74 = OpLoad %float %x_55_phi
+               OpStore %x_55 %74
+         %75 = OpLoad %int %x_58_phi
+               OpStore %x_81_phi %float_0
+         %77 = OpLoad %float %x_55
+               OpStore %x_82_phi %77
+               OpStore %x_83_phi %false
+         %80 = OpSLessThan %bool %75 %int_800
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %83
+         %82 = OpLabel
+               OpBranch %81
+         %83 = OpLabel
+               OpBranch %67
+         %81 = OpLabel
+         %87 = OpSMod %int %75 %int_32
+         %89 = OpIEqual %bool %87 %int_0
+               OpSelectionMerge %90 None
+               OpBranchConditional %89 %91 %92
+         %91 = OpLabel
+         %93 = OpLoad %float %x_55
+         %95 = OpFAdd %float %93 %float_0_400000006
+               OpStore %x_68 %95
+         %96 = OpLoad %float %x_68
+               OpStore %x_56_phi %96
+               OpBranch %90
+         %92 = OpLabel
+         %97 = OpLoad %float %x_55
+               OpStore %x_76_phi %97
+         %98 = OpConvertSToF %float %75
+         %99 = OpExtInst %float %56 RoundEven %55
+        %100 = OpFMod %float %98 %99
+        %102 = OpFOrdLessThanEqual %bool %100 %float_0_00999999978
+               OpSelectionMerge %103 None
+               OpBranchConditional %102 %104 %103
+        %104 = OpLabel
+        %105 = OpLoad %float %x_55
+        %107 = OpFAdd %float %105 %float_100
+               OpStore %x_75 %107
+        %108 = OpLoad %float %x_75
+               OpStore %x_76_phi %108
+               OpBranch %103
+        %103 = OpLabel
+        %109 = OpLoad %float %x_76_phi
+               OpStore %x_76 %109
+        %110 = OpLoad %float %x_76
+               OpStore %x_56_phi %110
+               OpBranch %90
+         %90 = OpLabel
+        %111 = OpLoad %float %x_56_phi
+               OpStore %x_56 %111
+        %112 = OpConvertSToF %float %75
+        %113 = OpLoad %float %x_51
+        %114 = OpFOrdGreaterThanEqual %bool %112 %113
+               OpSelectionMerge %115 None
+               OpBranchConditional %114 %116 %115
+        %116 = OpLabel
+        %117 = OpLoad %float %x_56
+               OpStore %x_81_phi %117
+        %118 = OpLoad %float %x_56
+               OpStore %x_82_phi %118
+               OpStore %x_83_phi %true
+               OpBranch %67
+        %115 = OpLabel
+               OpBranch %68
+         %68 = OpLabel
+        %120 = OpIAdd %int %75 %int_1
+               OpStore %x_59 %120
+        %121 = OpLoad %float %x_56
+               OpStore %x_55_phi %121
+        %122 = OpLoad %int %x_59
+               OpStore %x_58_phi %122
+               OpBranch %66
+         %67 = OpLabel
+        %123 = OpLoad %float %x_81_phi
+               OpStore %x_81 %123
+        %124 = OpLoad %float %x_82_phi
+               OpStore %x_82 %124
+        %125 = OpLoad %bool %x_83_phi
+        %126 = OpLoad %float %x_81
+               OpStore %x_85_phi %126
+               OpSelectionMerge %127 None
+               OpBranchConditional %125 %128 %127
+        %128 = OpLabel
+               OpBranch %62
+        %127 = OpLabel
+        %129 = OpLoad %float %x_82
+               OpStore %x_85_phi %129
+               OpBranch %62
+         %62 = OpLabel
+        %138 = OpLoad %float %x_85_phi
+        %139 = OpAccessChain %_ptr_Function_float %c %uint_0
+               OpStore %139 %138
+        %141 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %142 = OpLoad %float %141
+               OpStore %x_88 %142
+               OpSelectionMerge %143 None
+               OpSwitch %uint_0 %144
+        %144 = OpLabel
+               OpStore %x_92_phi %float_n0_5
+               OpStore %x_95_phi %int_1
+               OpBranch %145
+        %145 = OpLabel
+               OpLoopMerge %146 %147 None
+               OpBranch %148
+        %148 = OpLabel
+        %153 = OpLoad %float %x_92_phi
+               OpStore %x_92 %153
+        %154 = OpLoad %int %x_95_phi
+               OpStore %x_118_phi %float_0
+        %155 = OpLoad %float %x_92
+               OpStore %x_119_phi %155
+               OpStore %x_120_phi %false
+        %156 = OpSLessThan %bool %154 %int_800
+               OpSelectionMerge %157 None
+               OpBranchConditional %156 %158 %159
+        %158 = OpLabel
+               OpBranch %157
+        %159 = OpLabel
+               OpBranch %146
+        %157 = OpLabel
+        %162 = OpSMod %int %154 %int_32
+        %163 = OpIEqual %bool %162 %int_0
+               OpSelectionMerge %164 None
+               OpBranchConditional %163 %165 %166
+        %165 = OpLabel
+        %167 = OpLoad %float %x_92
+        %168 = OpFAdd %float %167 %float_0_400000006
+               OpStore %x_113 %168
+        %169 = OpLoad %float %x_113
+               OpStore %x_93_phi %169
+               OpBranch %164
+        %166 = OpLabel
+        %170 = OpLoad %float %x_92
+               OpStore %x_112_phi %170
+        %171 = OpConvertSToF %float %154
+        %172 = OpExtInst %float %56 RoundEven %55
+        %173 = OpFMod %float %171 %172
+        %174 = OpFOrdLessThanEqual %bool %173 %float_0_00999999978
+               OpSelectionMerge %175 None
+               OpBranchConditional %174 %176 %175
+        %176 = OpLabel
+        %177 = OpLoad %float %x_92
+        %178 = OpFAdd %float %177 %float_100
+               OpStore %x_111 %178
+        %179 = OpLoad %float %x_111
+               OpStore %x_112_phi %179
+               OpBranch %175
+        %175 = OpLabel
+        %180 = OpLoad %float %x_112_phi
+               OpStore %x_112 %180
+        %181 = OpLoad %float %x_112
+               OpStore %x_93_phi %181
+               OpBranch %164
+        %164 = OpLabel
+        %182 = OpLoad %float %x_93_phi
+               OpStore %x_93 %182
+        %183 = OpConvertSToF %float %154
+        %184 = OpLoad %float %x_88
+        %185 = OpFOrdGreaterThanEqual %bool %183 %184
+               OpSelectionMerge %186 None
+               OpBranchConditional %185 %187 %186
+        %187 = OpLabel
+        %188 = OpLoad %float %x_93
+               OpStore %x_118_phi %188
+        %189 = OpLoad %float %x_93
+               OpStore %x_119_phi %189
+               OpStore %x_120_phi %true
+               OpBranch %146
+        %186 = OpLabel
+               OpBranch %147
+        %147 = OpLabel
+        %190 = OpIAdd %int %154 %int_1
+               OpStore %x_96 %190
+        %191 = OpLoad %float %x_93
+               OpStore %x_92_phi %191
+        %192 = OpLoad %int %x_96
+               OpStore %x_95_phi %192
+               OpBranch %145
+        %146 = OpLabel
+        %193 = OpLoad %float %x_118_phi
+               OpStore %x_118 %193
+        %194 = OpLoad %float %x_119_phi
+               OpStore %x_119 %194
+        %195 = OpLoad %bool %x_120_phi
+        %196 = OpLoad %float %x_118
+               OpStore %x_122_phi %196
+               OpSelectionMerge %197 None
+               OpBranchConditional %195 %198 %197
+        %198 = OpLabel
+               OpBranch %143
+        %197 = OpLabel
+        %199 = OpLoad %float %x_119
+               OpStore %x_122_phi %199
+               OpBranch %143
+        %143 = OpLabel
+        %200 = OpLoad %float %x_122_phi
+        %201 = OpAccessChain %_ptr_Function_float %c %uint_1
+               OpStore %201 %200
+        %202 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %203 = OpLoad %float %202
+        %204 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %205 = OpLoad %float %204
+        %207 = OpAccessChain %_ptr_Function_float %c %uint_2
+        %208 = OpFAdd %float %203 %205
+               OpStore %207 %208
+               OpStore %x_129_phi %int_0
+               OpBranch %209
+        %209 = OpLabel
+               OpLoopMerge %210 %211 None
+               OpBranch %212
+        %212 = OpLabel
+        %214 = OpLoad %int %x_129_phi
+        %216 = OpSLessThan %bool %214 %int_3
+               OpSelectionMerge %217 None
+               OpBranchConditional %216 %218 %219
+        %218 = OpLabel
+               OpBranch %217
+        %219 = OpLabel
+               OpBranch %210
+        %217 = OpLabel
+        %220 = OpAccessChain %_ptr_Function_float %c %214
+        %221 = OpLoad %float %220
+        %223 = OpFOrdGreaterThanEqual %bool %221 %float_1
+               OpSelectionMerge %224 None
+               OpBranchConditional %223 %225 %224
+        %225 = OpLabel
+        %226 = OpAccessChain %_ptr_Function_float %c %214
+        %227 = OpLoad %float %226
+        %228 = OpAccessChain %_ptr_Function_float %c %214
+        %229 = OpLoad %float %228
+        %230 = OpAccessChain %_ptr_Function_float %c %214
+        %231 = OpFMul %float %227 %229
+               OpStore %230 %231
+               OpBranch %224
+        %224 = OpLabel
+               OpBranch %211
+        %211 = OpLabel
+        %232 = OpIAdd %int %214 %int_1
+               OpStore %x_130 %232
+        %233 = OpLoad %int %x_130
+               OpStore %x_129_phi %233
+               OpBranch %209
+        %210 = OpLabel
+        %234 = OpLoad %v3float %c
+        %236 = OpExtInst %v3float %56 FAbs %234
+        %235 = OpExtInst %v3float %56 Normalize %236
+        %237 = OpCompositeExtract %float %235 0
+        %238 = OpCompositeExtract %float %235 1
+        %239 = OpCompositeExtract %float %235 2
+        %240 = OpCompositeConstruct %v4float %237 %238 %239 %float_1
+               OpStore %x_GLF_color %240
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %241
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %245 = OpLabel
+        %246 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %246
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %248 = OpLabel
+        %249 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %249
+        %250 = OpFunctionCall %void %main_1
+        %252 = OpLoad %v4float %x_GLF_color
+        %253 = OpCompositeConstruct %main_out %252
+        %251 = OpFunctionCall %void %tint_symbol_3 %253
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-colorgrid-modulo-O-move-block-down/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-colorgrid-modulo-O-move-block-down/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..20e6da9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-colorgrid-modulo-O-move-block-down/1.wgsl.expected.wgsl
@@ -0,0 +1,200 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var c : vec3<f32>;
+  var x_51 : f32;
+  var x_55 : f32;
+  var x_56 : f32;
+  var x_81 : f32;
+  var x_82 : f32;
+  var x_118 : f32;
+  var x_119 : f32;
+  var x_55_phi : f32;
+  var x_58_phi : i32;
+  var x_81_phi : f32;
+  var x_82_phi : f32;
+  var x_83_phi : bool;
+  var x_85_phi : f32;
+  var x_122_phi : f32;
+  var x_129_phi : i32;
+  c = vec3<f32>(7.0, 8.0, 9.0);
+  let x_47 : f32 = x_7.resolution.x;
+  let x_49 : f32 = round((x_47 * 0.125));
+  x_51 = gl_FragCoord.x;
+  switch(0u) {
+    default: {
+      x_55_phi = -0.5;
+      x_58_phi = 1;
+      loop {
+        var x_68 : f32;
+        var x_76 : f32;
+        var x_59 : i32;
+        var x_56_phi : f32;
+        x_55 = x_55_phi;
+        let x_58 : i32 = x_58_phi;
+        x_81_phi = 0.0;
+        x_82_phi = x_55;
+        x_83_phi = false;
+        if ((x_58 < 800)) {
+        } else {
+          break;
+        }
+        var x_75 : f32;
+        var x_76_phi : f32;
+        if (((x_58 % 32) == 0)) {
+          x_68 = (x_55 + 0.400000006);
+          x_56_phi = x_68;
+        } else {
+          x_76_phi = x_55;
+          if (((f32(x_58) % round(x_49)) <= 0.01)) {
+            x_75 = (x_55 + 100.0);
+            x_76_phi = x_75;
+          }
+          x_76 = x_76_phi;
+          x_56_phi = x_76;
+        }
+        x_56 = x_56_phi;
+        if ((f32(x_58) >= x_51)) {
+          x_81_phi = x_56;
+          x_82_phi = x_56;
+          x_83_phi = true;
+          break;
+        }
+
+        continuing {
+          x_59 = (x_58 + 1);
+          x_55_phi = x_56;
+          x_58_phi = x_59;
+        }
+      }
+      x_81 = x_81_phi;
+      x_82 = x_82_phi;
+      let x_83 : bool = x_83_phi;
+      x_85_phi = x_81;
+      if (x_83) {
+        break;
+      }
+      x_85_phi = x_82;
+    }
+  }
+  var x_88 : f32;
+  var x_92 : f32;
+  var x_93 : f32;
+  var x_92_phi : f32;
+  var x_95_phi : i32;
+  var x_118_phi : f32;
+  var x_119_phi : f32;
+  var x_120_phi : bool;
+  let x_85 : f32 = x_85_phi;
+  let x_86 : ptr<function, f32> = &(c.x);
+  *(x_86) = x_85;
+  x_88 = gl_FragCoord.y;
+  switch(0u) {
+    default: {
+      x_92_phi = -0.5;
+      x_95_phi = 1;
+      loop {
+        var x_113 : f32;
+        var x_112 : f32;
+        var x_96 : i32;
+        var x_93_phi : f32;
+        x_92 = x_92_phi;
+        let x_95 : i32 = x_95_phi;
+        x_118_phi = 0.0;
+        x_119_phi = x_92;
+        x_120_phi = false;
+        if ((x_95 < 800)) {
+        } else {
+          break;
+        }
+        var x_111 : f32;
+        var x_112_phi : f32;
+        if (((x_95 % 32) == 0)) {
+          x_113 = (x_92 + 0.400000006);
+          x_93_phi = x_113;
+        } else {
+          x_112_phi = x_92;
+          if (((f32(x_95) % round(x_49)) <= 0.01)) {
+            x_111 = (x_92 + 100.0);
+            x_112_phi = x_111;
+          }
+          x_112 = x_112_phi;
+          x_93_phi = x_112;
+        }
+        x_93 = x_93_phi;
+        if ((f32(x_95) >= x_88)) {
+          x_118_phi = x_93;
+          x_119_phi = x_93;
+          x_120_phi = true;
+          break;
+        }
+
+        continuing {
+          x_96 = (x_95 + 1);
+          x_92_phi = x_93;
+          x_95_phi = x_96;
+        }
+      }
+      x_118 = x_118_phi;
+      x_119 = x_119_phi;
+      let x_120 : bool = x_120_phi;
+      x_122_phi = x_118;
+      if (x_120) {
+        break;
+      }
+      x_122_phi = x_119;
+    }
+  }
+  let x_122 : f32 = x_122_phi;
+  let x_123 : ptr<function, f32> = &(c.y);
+  *(x_123) = x_122;
+  let x_124 : f32 = *(x_86);
+  let x_125 : f32 = *(x_123);
+  c.z = (x_124 + x_125);
+  x_129_phi = 0;
+  loop {
+    var x_130 : i32;
+    let x_129 : i32 = x_129_phi;
+    if ((x_129 < 3)) {
+    } else {
+      break;
+    }
+    let x_135 : ptr<function, f32> = &(c[x_129]);
+    let x_136 : f32 = *(x_135);
+    if ((x_136 >= 1.0)) {
+      let x_140 : f32 = *(x_135);
+      let x_141 : f32 = *(x_135);
+      *(x_135) = (x_140 * x_141);
+    }
+
+    continuing {
+      x_130 = (x_129 + 1);
+      x_129_phi = x_130;
+    }
+  }
+  let x_143 : vec3<f32> = c;
+  let x_145 : vec3<f32> = normalize(abs(x_143));
+  x_GLF_color = vec4<f32>(x_145.x, x_145.y, x_145.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/1.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/1.spvasm
new file mode 100644
index 0000000..cc80c9a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/1.spvasm
@@ -0,0 +1,662 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %pos "pos"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %ipos "ipos"
+               OpName %i "i"
+               OpName %map "map"
+               OpName %p "p"
+               OpName %canwalk "canwalk"
+               OpName %v "v"
+               OpName %directions "directions"
+               OpName %j "j"
+               OpName %d "d"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+   %float_16 = OpConstant %float 16
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_int = OpTypePointer Function %int
+    %int_256 = OpConstant %int 256
+       %bool = OpTypeBool
+   %uint_256 = OpConstant %uint 256
+%_arr_int_uint_256 = OpTypeArray %int %uint_256
+%_ptr_Private__arr_int_uint_256 = OpTypePointer Private %_arr_int_uint_256
+        %map = OpVariable %_ptr_Private__arr_int_uint_256 Private
+%_ptr_Private_int = OpTypePointer Private %int
+      %int_1 = OpConstant %int 1
+         %43 = OpConstantComposite %v2int %int_0 %int_0
+%_ptr_Function_bool = OpTypePointer Function %bool
+       %true = OpConstantTrue %bool
+      %int_2 = OpConstant %int 2
+     %int_16 = OpConstant %int 16
+     %int_14 = OpConstant %int 14
+      %false = OpConstantFalse %bool
+      %int_8 = OpConstant %int 8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+         %53 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+    %float_0 = OpConstant %float 0
+         %55 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+    %int_0_0 = OpConstant %int 0
+         %57 = OpConstantComposite %_arr_int_uint_256 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0
+       %main = OpFunction %void None %18
+         %58 = OpLabel
+        %pos = OpVariable %_ptr_Function_v2float Function
+       %ipos = OpVariable %_ptr_Function_v2int Function
+          %i = OpVariable %_ptr_Function_int Function
+          %p = OpVariable %_ptr_Function_v2int Function
+    %canwalk = OpVariable %_ptr_Function_bool Function
+          %v = OpVariable %_ptr_Function_int Function
+ %directions = OpVariable %_ptr_Function_int Function
+          %j = OpVariable %_ptr_Function_int Function
+          %d = OpVariable %_ptr_Function_int Function
+         %59 = OpLoad %v4float %gl_FragCoord
+         %60 = OpVectorShuffle %v2float %59 %59 0 1
+         %61 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+         %62 = OpLoad %v2float %61
+         %63 = OpFDiv %v2float %60 %62
+               OpStore %pos %63
+         %64 = OpAccessChain %_ptr_Function_float %pos %uint_0
+         %65 = OpLoad %float %64
+         %66 = OpFMul %float %65 %float_16
+         %67 = OpConvertFToS %int %66
+         %68 = OpAccessChain %_ptr_Function_float %pos %uint_1
+         %69 = OpLoad %float %68
+         %70 = OpFMul %float %69 %float_16
+         %71 = OpConvertFToS %int %70
+         %72 = OpCompositeConstruct %v2int %67 %71
+               OpStore %ipos %72
+               OpStore %i %int_0
+               OpBranch %73
+         %73 = OpLabel
+               OpLoopMerge %74 %75 None
+               OpBranch %76
+         %76 = OpLabel
+         %77 = OpLoad %int %i
+         %78 = OpSLessThan %bool %77 %int_256
+               OpBranchConditional %78 %79 %74
+         %79 = OpLabel
+         %80 = OpLoad %int %i
+         %81 = OpAccessChain %_ptr_Private_int %map %80
+               OpStore %81 %int_0
+               OpBranch %75
+         %75 = OpLabel
+         %82 = OpLoad %int %i
+         %83 = OpIAdd %int %82 %int_1
+               OpStore %i %83
+               OpBranch %73
+         %74 = OpLabel
+               OpStore %p %43
+               OpStore %canwalk %true
+               OpStore %v %int_0
+               OpBranch %84
+         %84 = OpLabel
+               OpLoopMerge %85 %86 None
+               OpBranch %87
+         %87 = OpLabel
+         %88 = OpLoad %int %v
+         %89 = OpIAdd %int %88 %int_1
+               OpStore %v %89
+               OpStore %directions %int_0
+         %90 = OpAccessChain %_ptr_Function_int %p %uint_0
+         %91 = OpLoad %int %90
+         %92 = OpSGreaterThan %bool %91 %int_0
+               OpSelectionMerge %93 None
+               OpBranchConditional %92 %94 %93
+         %94 = OpLabel
+         %95 = OpAccessChain %_ptr_Function_int %p %uint_0
+         %96 = OpLoad %int %95
+         %97 = OpISub %int %96 %int_2
+         %98 = OpAccessChain %_ptr_Function_int %p %uint_1
+         %99 = OpLoad %int %98
+        %100 = OpIMul %int %99 %int_16
+        %101 = OpIAdd %int %97 %100
+        %102 = OpAccessChain %_ptr_Private_int %map %101
+        %103 = OpLoad %int %102
+        %104 = OpIEqual %bool %103 %int_0
+               OpBranch %93
+         %93 = OpLabel
+        %105 = OpPhi %bool %92 %87 %104 %94
+               OpSelectionMerge %106 None
+               OpBranchConditional %105 %107 %106
+        %107 = OpLabel
+        %108 = OpLoad %int %directions
+        %109 = OpIAdd %int %108 %int_1
+               OpStore %directions %109
+               OpBranch %106
+        %106 = OpLabel
+        %110 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %111 = OpLoad %int %110
+        %112 = OpSGreaterThan %bool %111 %int_0
+               OpSelectionMerge %113 None
+               OpBranchConditional %112 %114 %113
+        %114 = OpLabel
+        %115 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %116 = OpLoad %int %115
+        %117 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %118 = OpLoad %int %117
+        %119 = OpISub %int %118 %int_2
+        %120 = OpIMul %int %119 %int_16
+        %121 = OpIAdd %int %116 %120
+        %122 = OpAccessChain %_ptr_Private_int %map %121
+        %123 = OpLoad %int %122
+        %124 = OpIEqual %bool %123 %int_0
+               OpBranch %113
+        %113 = OpLabel
+        %125 = OpPhi %bool %112 %106 %124 %114
+               OpSelectionMerge %126 None
+               OpBranchConditional %125 %127 %126
+        %127 = OpLabel
+        %128 = OpLoad %int %directions
+        %129 = OpIAdd %int %128 %int_1
+               OpStore %directions %129
+               OpBranch %126
+        %126 = OpLabel
+        %130 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %131 = OpLoad %int %130
+        %132 = OpSLessThan %bool %131 %int_14
+               OpSelectionMerge %133 None
+               OpBranchConditional %132 %134 %133
+        %134 = OpLabel
+        %135 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %136 = OpLoad %int %135
+        %137 = OpIAdd %int %136 %int_2
+        %138 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %139 = OpLoad %int %138
+        %140 = OpIMul %int %139 %int_16
+        %141 = OpIAdd %int %137 %140
+        %142 = OpAccessChain %_ptr_Private_int %map %141
+        %143 = OpLoad %int %142
+        %144 = OpIEqual %bool %143 %int_0
+               OpBranch %133
+        %133 = OpLabel
+        %145 = OpPhi %bool %132 %126 %144 %134
+               OpSelectionMerge %146 None
+               OpBranchConditional %145 %147 %146
+        %147 = OpLabel
+        %148 = OpLoad %int %directions
+        %149 = OpIAdd %int %148 %int_1
+               OpStore %directions %149
+               OpBranch %146
+        %146 = OpLabel
+        %150 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %151 = OpLoad %int %150
+        %152 = OpSLessThan %bool %151 %int_14
+               OpSelectionMerge %153 None
+               OpBranchConditional %152 %154 %153
+        %154 = OpLabel
+        %155 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %156 = OpLoad %int %155
+        %157 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %158 = OpLoad %int %157
+        %159 = OpIAdd %int %158 %int_2
+        %160 = OpIMul %int %159 %int_16
+        %161 = OpIAdd %int %156 %160
+        %162 = OpAccessChain %_ptr_Private_int %map %161
+        %163 = OpLoad %int %162
+        %164 = OpIEqual %bool %163 %int_0
+               OpBranch %153
+        %153 = OpLabel
+        %165 = OpPhi %bool %152 %146 %164 %154
+               OpSelectionMerge %166 None
+               OpBranchConditional %165 %167 %166
+        %167 = OpLabel
+        %168 = OpLoad %int %directions
+        %169 = OpIAdd %int %168 %int_1
+               OpStore %directions %169
+               OpBranch %166
+        %166 = OpLabel
+        %170 = OpLoad %int %directions
+        %171 = OpIEqual %bool %170 %int_0
+               OpSelectionMerge %172 None
+               OpBranchConditional %171 %173 %174
+        %173 = OpLabel
+               OpStore %canwalk %false
+               OpStore %i %int_0
+               OpBranch %175
+        %175 = OpLabel
+               OpLoopMerge %176 %177 None
+               OpBranch %178
+        %178 = OpLabel
+        %179 = OpLoad %int %i
+        %180 = OpSLessThan %bool %179 %int_8
+               OpBranchConditional %180 %181 %176
+        %181 = OpLabel
+               OpStore %j %int_0
+               OpBranch %182
+        %182 = OpLabel
+               OpLoopMerge %183 %184 None
+               OpBranch %185
+        %185 = OpLabel
+        %186 = OpLoad %int %j
+        %187 = OpSLessThan %bool %186 %int_8
+               OpBranchConditional %187 %188 %183
+        %188 = OpLabel
+        %189 = OpLoad %int %j
+        %190 = OpIMul %int %189 %int_2
+        %191 = OpLoad %int %i
+        %192 = OpIMul %int %191 %int_2
+        %193 = OpIMul %int %192 %int_16
+        %194 = OpIAdd %int %190 %193
+        %195 = OpAccessChain %_ptr_Private_int %map %194
+        %196 = OpLoad %int %195
+        %197 = OpIEqual %bool %196 %int_0
+               OpSelectionMerge %198 None
+               OpBranchConditional %197 %199 %198
+        %199 = OpLabel
+        %200 = OpLoad %int %j
+        %201 = OpIMul %int %200 %int_2
+        %202 = OpAccessChain %_ptr_Function_int %p %uint_0
+               OpStore %202 %201
+        %203 = OpLoad %int %i
+        %204 = OpIMul %int %203 %int_2
+        %205 = OpAccessChain %_ptr_Function_int %p %uint_1
+               OpStore %205 %204
+               OpStore %canwalk %true
+               OpBranch %198
+        %198 = OpLabel
+               OpBranch %184
+        %184 = OpLabel
+        %206 = OpLoad %int %j
+        %207 = OpIAdd %int %206 %int_1
+               OpStore %j %207
+               OpBranch %182
+        %183 = OpLabel
+               OpBranch %177
+        %177 = OpLabel
+        %208 = OpLoad %int %i
+        %209 = OpIAdd %int %208 %int_1
+               OpStore %i %209
+               OpBranch %175
+        %176 = OpLabel
+        %210 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %211 = OpLoad %int %210
+        %212 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %213 = OpLoad %int %212
+        %214 = OpIMul %int %213 %int_16
+        %215 = OpIAdd %int %211 %214
+        %216 = OpAccessChain %_ptr_Private_int %map %215
+               OpStore %216 %int_1
+               OpBranch %172
+        %174 = OpLabel
+        %217 = OpLoad %int %v
+        %218 = OpLoad %int %directions
+        %219 = OpSMod %int %217 %218
+               OpStore %d %219
+        %220 = OpLoad %int %directions
+        %221 = OpLoad %int %v
+        %222 = OpIAdd %int %221 %220
+               OpStore %v %222
+        %223 = OpLoad %int %d
+        %224 = OpSGreaterThanEqual %bool %223 %int_0
+               OpSelectionMerge %225 None
+               OpBranchConditional %224 %226 %225
+        %226 = OpLabel
+        %227 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %228 = OpLoad %int %227
+        %229 = OpSGreaterThan %bool %228 %int_0
+               OpBranch %225
+        %225 = OpLabel
+        %230 = OpPhi %bool %224 %174 %229 %226
+               OpSelectionMerge %231 None
+               OpBranchConditional %230 %232 %231
+        %232 = OpLabel
+        %233 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %234 = OpLoad %int %233
+        %235 = OpISub %int %234 %int_2
+        %236 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %237 = OpLoad %int %236
+        %238 = OpIMul %int %237 %int_16
+        %239 = OpIAdd %int %235 %238
+        %240 = OpAccessChain %_ptr_Private_int %map %239
+        %241 = OpLoad %int %240
+        %242 = OpIEqual %bool %241 %int_0
+               OpBranch %231
+        %231 = OpLabel
+        %243 = OpPhi %bool %230 %225 %242 %232
+               OpSelectionMerge %244 None
+               OpBranchConditional %243 %245 %244
+        %245 = OpLabel
+        %246 = OpLoad %int %d
+        %247 = OpISub %int %246 %int_1
+               OpStore %d %247
+        %248 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %249 = OpLoad %int %248
+        %250 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %251 = OpLoad %int %250
+        %252 = OpIMul %int %251 %int_16
+        %253 = OpIAdd %int %249 %252
+        %254 = OpAccessChain %_ptr_Private_int %map %253
+               OpStore %254 %int_1
+        %255 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %256 = OpLoad %int %255
+        %257 = OpISub %int %256 %int_1
+        %258 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %259 = OpLoad %int %258
+        %260 = OpIMul %int %259 %int_16
+        %261 = OpIAdd %int %257 %260
+        %262 = OpAccessChain %_ptr_Private_int %map %261
+               OpStore %262 %int_1
+        %263 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %264 = OpLoad %int %263
+        %265 = OpISub %int %264 %int_2
+        %266 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %267 = OpLoad %int %266
+        %268 = OpIMul %int %267 %int_16
+        %269 = OpIAdd %int %265 %268
+        %270 = OpAccessChain %_ptr_Private_int %map %269
+               OpStore %270 %int_1
+        %271 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %272 = OpLoad %int %271
+        %273 = OpISub %int %272 %int_2
+        %274 = OpAccessChain %_ptr_Function_int %p %uint_0
+               OpStore %274 %273
+               OpBranch %244
+        %244 = OpLabel
+        %275 = OpLoad %int %d
+        %276 = OpSGreaterThanEqual %bool %275 %int_0
+               OpSelectionMerge %277 None
+               OpBranchConditional %276 %278 %277
+        %278 = OpLabel
+        %279 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %280 = OpLoad %int %279
+        %281 = OpSGreaterThan %bool %280 %int_0
+               OpBranch %277
+        %277 = OpLabel
+        %282 = OpPhi %bool %276 %244 %281 %278
+               OpBranch %283
+        %283 = OpLabel
+        %284 = OpAccessChain %_ptr_Function_int %p %uint_0
+               OpSelectionMerge %285 None
+               OpBranchConditional %282 %286 %287
+        %286 = OpLabel
+        %288 = OpLoad %int %284
+               OpBranch %285
+        %287 = OpLabel
+        %289 = OpCopyObject %int %int_0_0
+               OpBranch %285
+        %285 = OpLabel
+        %290 = OpPhi %int %288 %286 %289 %287
+        %291 = OpAccessChain %_ptr_Function_int %p %uint_1
+               OpSelectionMerge %292 None
+               OpBranchConditional %282 %293 %294
+        %293 = OpLabel
+        %295 = OpLoad %int %291
+               OpBranch %292
+        %294 = OpLabel
+        %296 = OpCopyObject %int %int_0_0
+               OpBranch %292
+        %292 = OpLabel
+        %297 = OpPhi %int %295 %293 %296 %294
+        %298 = OpISub %int %297 %int_2
+        %299 = OpIMul %int %298 %int_16
+               OpSelectionMerge %300 None
+               OpBranchConditional %282 %301 %302
+        %301 = OpLabel
+        %303 = OpLoad %_arr_int_uint_256 %map
+               OpBranch %300
+        %302 = OpLabel
+        %304 = OpCopyObject %_arr_int_uint_256 %57
+               OpBranch %300
+        %300 = OpLabel
+        %305 = OpPhi %_arr_int_uint_256 %303 %301 %304 %302
+               OpSelectionMerge %306 None
+               OpBranchConditional %282 %307 %306
+        %307 = OpLabel
+               OpStore %map %57
+               OpBranch %306
+        %306 = OpLabel
+               OpSelectionMerge %308 None
+               OpBranchConditional %282 %309 %308
+        %309 = OpLabel
+               OpStore %map %305
+               OpBranch %308
+        %308 = OpLabel
+        %310 = OpIAdd %int %290 %299
+        %311 = OpAccessChain %_ptr_Private_int %map %310
+               OpSelectionMerge %312 None
+               OpBranchConditional %282 %313 %314
+        %313 = OpLabel
+        %315 = OpLoad %int %311
+               OpBranch %312
+        %314 = OpLabel
+        %316 = OpCopyObject %int %int_0_0
+               OpBranch %312
+        %312 = OpLabel
+        %317 = OpPhi %int %315 %313 %316 %314
+        %318 = OpIEqual %bool %317 %int_0
+               OpBranch %319
+        %319 = OpLabel
+        %320 = OpSelect %bool %282 %318 %282
+               OpSelectionMerge %321 None
+               OpBranchConditional %320 %322 %321
+        %322 = OpLabel
+        %323 = OpLoad %int %d
+        %324 = OpISub %int %323 %int_1
+               OpStore %d %324
+        %325 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %326 = OpLoad %int %325
+        %327 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %328 = OpLoad %int %327
+        %329 = OpIMul %int %328 %int_16
+        %330 = OpIAdd %int %326 %329
+        %331 = OpAccessChain %_ptr_Private_int %map %330
+               OpStore %331 %int_1
+        %332 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %333 = OpLoad %int %332
+        %334 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %335 = OpLoad %int %334
+        %336 = OpISub %int %335 %int_1
+        %337 = OpIMul %int %336 %int_16
+        %338 = OpIAdd %int %333 %337
+        %339 = OpAccessChain %_ptr_Private_int %map %338
+               OpStore %339 %int_1
+        %340 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %341 = OpLoad %int %340
+        %342 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %343 = OpLoad %int %342
+        %344 = OpISub %int %343 %int_2
+        %345 = OpLoad %_arr_int_uint_256 %map
+               OpStore %map %57
+               OpStore %map %345
+        %346 = OpIMul %int %344 %int_16
+        %347 = OpIAdd %int %341 %346
+        %348 = OpAccessChain %_ptr_Private_int %map %347
+               OpStore %348 %int_1
+        %349 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %350 = OpLoad %int %349
+        %351 = OpISub %int %350 %int_2
+        %352 = OpAccessChain %_ptr_Function_int %p %uint_1
+               OpStore %352 %351
+               OpBranch %321
+        %321 = OpLabel
+        %353 = OpLoad %int %d
+        %354 = OpSGreaterThanEqual %bool %353 %int_0
+               OpSelectionMerge %355 None
+               OpBranchConditional %354 %356 %355
+        %356 = OpLabel
+        %357 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %358 = OpLoad %int %357
+        %359 = OpSLessThan %bool %358 %int_14
+               OpBranch %355
+        %355 = OpLabel
+        %360 = OpPhi %bool %354 %321 %359 %356
+               OpSelectionMerge %361 None
+               OpBranchConditional %360 %362 %361
+        %362 = OpLabel
+        %363 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %364 = OpLoad %int %363
+        %365 = OpIAdd %int %364 %int_2
+        %366 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %367 = OpLoad %int %366
+        %368 = OpIMul %int %367 %int_16
+        %369 = OpIAdd %int %365 %368
+        %370 = OpAccessChain %_ptr_Private_int %map %369
+        %371 = OpLoad %int %370
+        %372 = OpIEqual %bool %371 %int_0
+               OpBranch %361
+        %361 = OpLabel
+        %373 = OpPhi %bool %360 %355 %372 %362
+               OpSelectionMerge %374 None
+               OpBranchConditional %373 %375 %374
+        %375 = OpLabel
+        %376 = OpLoad %int %d
+        %377 = OpISub %int %376 %int_1
+               OpStore %d %377
+        %378 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %379 = OpLoad %int %378
+        %380 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %381 = OpLoad %int %380
+        %382 = OpIMul %int %381 %int_16
+        %383 = OpIAdd %int %379 %382
+        %384 = OpAccessChain %_ptr_Private_int %map %383
+               OpStore %384 %int_1
+        %385 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %386 = OpLoad %int %385
+        %387 = OpIAdd %int %386 %int_1
+        %388 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %389 = OpLoad %int %388
+        %390 = OpIMul %int %389 %int_16
+        %391 = OpIAdd %int %387 %390
+        %392 = OpAccessChain %_ptr_Private_int %map %391
+               OpStore %392 %int_1
+        %393 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %394 = OpLoad %int %393
+        %395 = OpIAdd %int %394 %int_2
+        %396 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %397 = OpLoad %int %396
+        %398 = OpIMul %int %397 %int_16
+        %399 = OpIAdd %int %395 %398
+        %400 = OpAccessChain %_ptr_Private_int %map %399
+               OpStore %400 %int_1
+        %401 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %402 = OpLoad %int %401
+        %403 = OpIAdd %int %402 %int_2
+        %404 = OpAccessChain %_ptr_Function_int %p %uint_0
+               OpStore %404 %403
+               OpBranch %374
+        %374 = OpLabel
+        %405 = OpLoad %int %d
+        %406 = OpSGreaterThanEqual %bool %405 %int_0
+               OpSelectionMerge %407 None
+               OpBranchConditional %406 %408 %407
+        %408 = OpLabel
+        %409 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %410 = OpLoad %int %409
+        %411 = OpSLessThan %bool %410 %int_14
+               OpBranch %407
+        %407 = OpLabel
+        %412 = OpPhi %bool %406 %374 %411 %408
+               OpSelectionMerge %413 None
+               OpBranchConditional %412 %414 %413
+        %414 = OpLabel
+        %415 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %416 = OpLoad %int %415
+        %417 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %418 = OpLoad %int %417
+        %419 = OpIAdd %int %418 %int_2
+        %420 = OpIMul %int %419 %int_16
+        %421 = OpIAdd %int %416 %420
+        %422 = OpAccessChain %_ptr_Private_int %map %421
+        %423 = OpLoad %int %422
+        %424 = OpIEqual %bool %423 %int_0
+               OpBranch %413
+        %413 = OpLabel
+        %425 = OpPhi %bool %412 %407 %424 %414
+               OpSelectionMerge %426 None
+               OpBranchConditional %425 %427 %426
+        %427 = OpLabel
+        %428 = OpLoad %int %d
+        %429 = OpISub %int %428 %int_1
+               OpStore %d %429
+        %430 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %431 = OpLoad %int %430
+        %432 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %433 = OpLoad %int %432
+        %434 = OpIMul %int %433 %int_16
+        %435 = OpIAdd %int %431 %434
+        %436 = OpAccessChain %_ptr_Private_int %map %435
+               OpStore %436 %int_1
+        %437 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %438 = OpLoad %int %437
+        %439 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %440 = OpLoad %int %439
+        %441 = OpIAdd %int %440 %int_1
+        %442 = OpIMul %int %441 %int_16
+        %443 = OpIAdd %int %438 %442
+        %444 = OpAccessChain %_ptr_Private_int %map %443
+               OpStore %444 %int_1
+        %445 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %446 = OpLoad %int %445
+        %447 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %448 = OpLoad %int %447
+        %449 = OpIAdd %int %448 %int_2
+        %450 = OpIMul %int %449 %int_16
+        %451 = OpIAdd %int %446 %450
+        %452 = OpAccessChain %_ptr_Private_int %map %451
+               OpStore %452 %int_1
+        %453 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %454 = OpLoad %int %453
+        %455 = OpIAdd %int %454 %int_2
+        %456 = OpAccessChain %_ptr_Function_int %p %uint_1
+               OpStore %456 %455
+               OpBranch %426
+        %426 = OpLabel
+               OpBranch %172
+        %172 = OpLabel
+        %457 = OpAccessChain %_ptr_Function_int %ipos %uint_1
+        %458 = OpLoad %int %457
+        %459 = OpIMul %int %458 %int_16
+        %460 = OpAccessChain %_ptr_Function_int %ipos %uint_0
+        %461 = OpLoad %int %460
+        %462 = OpIAdd %int %459 %461
+        %463 = OpAccessChain %_ptr_Private_int %map %462
+        %464 = OpLoad %int %463
+        %465 = OpIEqual %bool %464 %int_1
+               OpSelectionMerge %466 None
+               OpBranchConditional %465 %467 %466
+        %467 = OpLabel
+               OpStore %_GLF_color %53
+               OpReturn
+        %466 = OpLabel
+               OpBranch %86
+         %86 = OpLabel
+        %468 = OpLoad %bool %canwalk
+               OpBranchConditional %468 %84 %85
+         %85 = OpLabel
+               OpStore %_GLF_color %55
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..0505c28
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/1.spvasm.expected.hlsl
@@ -0,0 +1,338 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[1];
+};
+static int map[256] = (int[256])0;
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2 pos = float2(0.0f, 0.0f);
+  int2 ipos = int2(0, 0);
+  int i = 0;
+  int2 p = int2(0, 0);
+  bool canwalk = false;
+  int v = 0;
+  int directions = 0;
+  int j = 0;
+  int d = 0;
+  const float4 x_59 = gl_FragCoord;
+  const float2 x_62 = asfloat(x_7[0].xy);
+  pos = (float2(x_59.x, x_59.y) / x_62);
+  const float x_65 = pos.x;
+  const float x_69 = pos.y;
+  ipos = int2(int((x_65 * 16.0f)), int((x_69 * 16.0f)));
+  i = 0;
+  {
+    for(; (i < 256); i = (i + 1)) {
+      map[i] = 0;
+    }
+  }
+  p = int2(0, 0);
+  canwalk = true;
+  v = 0;
+  while (true) {
+    bool x_104 = false;
+    bool x_124 = false;
+    bool x_144 = false;
+    bool x_164 = false;
+    bool x_105_phi = false;
+    bool x_125_phi = false;
+    bool x_145_phi = false;
+    bool x_165_phi = false;
+    v = (v + 1);
+    directions = 0;
+    const int x_91 = p.x;
+    const bool x_92 = (x_91 > 0);
+    x_105_phi = x_92;
+    if (x_92) {
+      const int x_96 = p.x;
+      const int x_99 = p.y;
+      const int x_103 = map[((x_96 - 2) + (x_99 * 16))];
+      x_104 = (x_103 == 0);
+      x_105_phi = x_104;
+    }
+    if (x_105_phi) {
+      directions = (directions + 1);
+    }
+    const int x_111 = p.y;
+    const bool x_112 = (x_111 > 0);
+    x_125_phi = x_112;
+    if (x_112) {
+      const int x_116 = p.x;
+      const int x_118 = p.y;
+      const int x_123 = map[(x_116 + ((x_118 - 2) * 16))];
+      x_124 = (x_123 == 0);
+      x_125_phi = x_124;
+    }
+    if (x_125_phi) {
+      directions = (directions + 1);
+    }
+    const int x_131 = p.x;
+    const bool x_132 = (x_131 < 14);
+    x_145_phi = x_132;
+    if (x_132) {
+      const int x_136 = p.x;
+      const int x_139 = p.y;
+      const int x_143 = map[((x_136 + 2) + (x_139 * 16))];
+      x_144 = (x_143 == 0);
+      x_145_phi = x_144;
+    }
+    if (x_145_phi) {
+      directions = (directions + 1);
+    }
+    const int x_151 = p.y;
+    const bool x_152 = (x_151 < 14);
+    x_165_phi = x_152;
+    if (x_152) {
+      const int x_156 = p.x;
+      const int x_158 = p.y;
+      const int x_163 = map[(x_156 + ((x_158 + 2) * 16))];
+      x_164 = (x_163 == 0);
+      x_165_phi = x_164;
+    }
+    if (x_165_phi) {
+      directions = (directions + 1);
+    }
+    bool x_229 = false;
+    bool x_242 = false;
+    bool x_281 = false;
+    int x_288 = 0;
+    int x_289 = 0;
+    int x_295 = 0;
+    int x_296 = 0;
+    int x_303[256] = (int[256])0;
+    int x_304[256] = (int[256])0;
+    int x_315 = 0;
+    int x_316 = 0;
+    bool x_359 = false;
+    bool x_372 = false;
+    bool x_411 = false;
+    bool x_424 = false;
+    bool x_230_phi = false;
+    bool x_243_phi = false;
+    bool x_282_phi = false;
+    int x_290_phi = 0;
+    int x_297_phi = 0;
+    int x_305_phi[256] = (int[256])0;
+    int x_317_phi = 0;
+    bool x_360_phi = false;
+    bool x_373_phi = false;
+    bool x_412_phi = false;
+    bool x_425_phi = false;
+    if ((directions == 0)) {
+      canwalk = false;
+      i = 0;
+      {
+        for(; (i < 8); i = (i + 1)) {
+          j = 0;
+          {
+            for(; (j < 8); j = (j + 1)) {
+              const int x_196 = map[((j * 2) + ((i * 2) * 16))];
+              if ((x_196 == 0)) {
+                p.x = (j * 2);
+                p.y = (i * 2);
+                canwalk = true;
+              }
+            }
+          }
+        }
+      }
+      const int x_211 = p.x;
+      const int x_213 = p.y;
+      map[(x_211 + (x_213 * 16))] = 1;
+    } else {
+      d = (v % directions);
+      v = (v + directions);
+      const bool x_224 = (d >= 0);
+      x_230_phi = x_224;
+      if (x_224) {
+        const int x_228 = p.x;
+        x_229 = (x_228 > 0);
+        x_230_phi = x_229;
+      }
+      const bool x_230 = x_230_phi;
+      x_243_phi = x_230;
+      if (x_230) {
+        const int x_234 = p.x;
+        const int x_237 = p.y;
+        const int x_241 = map[((x_234 - 2) + (x_237 * 16))];
+        x_242 = (x_241 == 0);
+        x_243_phi = x_242;
+      }
+      if (x_243_phi) {
+        d = (d - 1);
+        const int x_249 = p.x;
+        const int x_251 = p.y;
+        map[(x_249 + (x_251 * 16))] = 1;
+        const int x_256 = p.x;
+        const int x_259 = p.y;
+        map[((x_256 - 1) + (x_259 * 16))] = 1;
+        const int x_264 = p.x;
+        const int x_267 = p.y;
+        map[((x_264 - 2) + (x_267 * 16))] = 1;
+        const int x_272 = p.x;
+        p.x = (x_272 - 2);
+      }
+      const bool x_276 = (d >= 0);
+      x_282_phi = x_276;
+      if (x_276) {
+        const int x_280 = p.y;
+        x_281 = (x_280 > 0);
+        x_282_phi = x_281;
+      }
+      const bool x_282 = x_282_phi;
+      if (x_282) {
+        x_288 = p.x;
+        x_290_phi = x_288;
+      } else {
+        x_289 = 0;
+        x_290_phi = x_289;
+      }
+      const int x_290 = x_290_phi;
+      if (x_282) {
+        x_295 = p.y;
+        x_297_phi = x_295;
+      } else {
+        x_296 = 0;
+        x_297_phi = x_296;
+      }
+      const int x_299 = ((x_297_phi - 2) * 16);
+      if (x_282) {
+        x_303 = map;
+        x_305_phi = x_303;
+      } else {
+        const int tint_symbol_5[256] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+        x_304 = tint_symbol_5;
+        x_305_phi = x_304;
+      }
+      const int x_305[256] = x_305_phi;
+      if (x_282) {
+        const int tint_symbol_6[256] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+        map = tint_symbol_6;
+      }
+      if (x_282) {
+        map = x_305;
+      }
+      if (x_282) {
+        x_315 = map[(x_290 + x_299)];
+        x_317_phi = x_315;
+      } else {
+        x_316 = 0;
+        x_317_phi = x_316;
+      }
+      const bool x_318 = (x_317_phi == 0);
+      if ((x_282 ? x_318 : x_282)) {
+        d = (d - 1);
+        const int x_326 = p.x;
+        const int x_328 = p.y;
+        map[(x_326 + (x_328 * 16))] = 1;
+        const int x_333 = p.x;
+        const int x_335 = p.y;
+        map[(x_333 + ((x_335 - 1) * 16))] = 1;
+        const int x_341 = p.x;
+        const int x_343 = p.y;
+        const int x_345[256] = map;
+        const int tint_symbol_7[256] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+        map = tint_symbol_7;
+        map = x_345;
+        map[(x_341 + ((x_343 - 2) * 16))] = 1;
+        const int x_350 = p.y;
+        p.y = (x_350 - 2);
+      }
+      const bool x_354 = (d >= 0);
+      x_360_phi = x_354;
+      if (x_354) {
+        const int x_358 = p.x;
+        x_359 = (x_358 < 14);
+        x_360_phi = x_359;
+      }
+      const bool x_360 = x_360_phi;
+      x_373_phi = x_360;
+      if (x_360) {
+        const int x_364 = p.x;
+        const int x_367 = p.y;
+        const int x_371 = map[((x_364 + 2) + (x_367 * 16))];
+        x_372 = (x_371 == 0);
+        x_373_phi = x_372;
+      }
+      if (x_373_phi) {
+        d = (d - 1);
+        const int x_379 = p.x;
+        const int x_381 = p.y;
+        map[(x_379 + (x_381 * 16))] = 1;
+        const int x_386 = p.x;
+        const int x_389 = p.y;
+        map[((x_386 + 1) + (x_389 * 16))] = 1;
+        const int x_394 = p.x;
+        const int x_397 = p.y;
+        map[((x_394 + 2) + (x_397 * 16))] = 1;
+        const int x_402 = p.x;
+        p.x = (x_402 + 2);
+      }
+      const bool x_406 = (d >= 0);
+      x_412_phi = x_406;
+      if (x_406) {
+        const int x_410 = p.y;
+        x_411 = (x_410 < 14);
+        x_412_phi = x_411;
+      }
+      const bool x_412 = x_412_phi;
+      x_425_phi = x_412;
+      if (x_412) {
+        const int x_416 = p.x;
+        const int x_418 = p.y;
+        const int x_423 = map[(x_416 + ((x_418 + 2) * 16))];
+        x_424 = (x_423 == 0);
+        x_425_phi = x_424;
+      }
+      if (x_425_phi) {
+        d = (d - 1);
+        const int x_431 = p.x;
+        const int x_433 = p.y;
+        map[(x_431 + (x_433 * 16))] = 1;
+        const int x_438 = p.x;
+        const int x_440 = p.y;
+        map[(x_438 + ((x_440 + 1) * 16))] = 1;
+        const int x_446 = p.x;
+        const int x_448 = p.y;
+        map[(x_446 + ((x_448 + 2) * 16))] = 1;
+        const int x_454 = p.y;
+        p.y = (x_454 + 2);
+      }
+    }
+    const int x_458 = ipos.y;
+    const int x_461 = ipos.x;
+    const int x_464 = map[((x_458 * 16) + x_461)];
+    if ((x_464 == 1)) {
+      x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+      return;
+    }
+    {
+      if (canwalk) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_GLF_color = float4(0.0f, 0.0f, 0.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_8 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_8;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/1.spvasm.expected.msl
new file mode 100644
index 0000000..794863a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/1.spvasm.expected.msl
@@ -0,0 +1,394 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  int arr[256];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_8, thread tint_array_wrapper* const tint_symbol_9, thread float4* const tint_symbol_10) {
+  float2 pos = 0.0f;
+  int2 ipos = 0;
+  int i = 0;
+  int2 p = 0;
+  bool canwalk = false;
+  int v = 0;
+  int directions = 0;
+  int j = 0;
+  int d = 0;
+  float4 const x_59 = *(tint_symbol_8);
+  float2 const x_62 = x_7.resolution;
+  pos = (float2(x_59.x, x_59.y) / x_62);
+  float const x_65 = pos.x;
+  float const x_69 = pos.y;
+  ipos = int2(int((x_65 * 16.0f)), int((x_69 * 16.0f)));
+  i = 0;
+  while (true) {
+    int const x_77 = i;
+    if ((x_77 < 256)) {
+    } else {
+      break;
+    }
+    int const x_80 = i;
+    (*(tint_symbol_9)).arr[x_80] = 0;
+    {
+      int const x_82 = i;
+      i = (x_82 + 1);
+    }
+  }
+  p = int2(0, 0);
+  canwalk = true;
+  v = 0;
+  while (true) {
+    bool x_104 = false;
+    bool x_124 = false;
+    bool x_144 = false;
+    bool x_164 = false;
+    bool x_105_phi = false;
+    bool x_125_phi = false;
+    bool x_145_phi = false;
+    bool x_165_phi = false;
+    int const x_88 = v;
+    v = (x_88 + 1);
+    directions = 0;
+    int const x_91 = p.x;
+    bool const x_92 = (x_91 > 0);
+    x_105_phi = x_92;
+    if (x_92) {
+      int const x_96 = p.x;
+      int const x_99 = p.y;
+      int const x_103 = (*(tint_symbol_9)).arr[((x_96 - 2) + (x_99 * 16))];
+      x_104 = (x_103 == 0);
+      x_105_phi = x_104;
+    }
+    bool const x_105 = x_105_phi;
+    if (x_105) {
+      int const x_108 = directions;
+      directions = (x_108 + 1);
+    }
+    int const x_111 = p.y;
+    bool const x_112 = (x_111 > 0);
+    x_125_phi = x_112;
+    if (x_112) {
+      int const x_116 = p.x;
+      int const x_118 = p.y;
+      int const x_123 = (*(tint_symbol_9)).arr[(x_116 + ((x_118 - 2) * 16))];
+      x_124 = (x_123 == 0);
+      x_125_phi = x_124;
+    }
+    bool const x_125 = x_125_phi;
+    if (x_125) {
+      int const x_128 = directions;
+      directions = (x_128 + 1);
+    }
+    int const x_131 = p.x;
+    bool const x_132 = (x_131 < 14);
+    x_145_phi = x_132;
+    if (x_132) {
+      int const x_136 = p.x;
+      int const x_139 = p.y;
+      int const x_143 = (*(tint_symbol_9)).arr[((x_136 + 2) + (x_139 * 16))];
+      x_144 = (x_143 == 0);
+      x_145_phi = x_144;
+    }
+    bool const x_145 = x_145_phi;
+    if (x_145) {
+      int const x_148 = directions;
+      directions = (x_148 + 1);
+    }
+    int const x_151 = p.y;
+    bool const x_152 = (x_151 < 14);
+    x_165_phi = x_152;
+    if (x_152) {
+      int const x_156 = p.x;
+      int const x_158 = p.y;
+      int const x_163 = (*(tint_symbol_9)).arr[(x_156 + ((x_158 + 2) * 16))];
+      x_164 = (x_163 == 0);
+      x_165_phi = x_164;
+    }
+    bool const x_165 = x_165_phi;
+    if (x_165) {
+      int const x_168 = directions;
+      directions = (x_168 + 1);
+    }
+    bool x_229 = false;
+    bool x_242 = false;
+    bool x_281 = false;
+    int x_288 = 0;
+    int x_289 = 0;
+    int x_295 = 0;
+    int x_296 = 0;
+    tint_array_wrapper x_303 = {};
+    tint_array_wrapper x_304 = {};
+    int x_315 = 0;
+    int x_316 = 0;
+    bool x_359 = false;
+    bool x_372 = false;
+    bool x_411 = false;
+    bool x_424 = false;
+    bool x_230_phi = false;
+    bool x_243_phi = false;
+    bool x_282_phi = false;
+    int x_290_phi = 0;
+    int x_297_phi = 0;
+    tint_array_wrapper x_305_phi = {};
+    int x_317_phi = 0;
+    bool x_360_phi = false;
+    bool x_373_phi = false;
+    bool x_412_phi = false;
+    bool x_425_phi = false;
+    int const x_170 = directions;
+    if ((x_170 == 0)) {
+      canwalk = false;
+      i = 0;
+      while (true) {
+        int const x_179 = i;
+        if ((x_179 < 8)) {
+        } else {
+          break;
+        }
+        j = 0;
+        while (true) {
+          int const x_186 = j;
+          if ((x_186 < 8)) {
+          } else {
+            break;
+          }
+          int const x_189 = j;
+          int const x_191 = i;
+          int const x_196 = (*(tint_symbol_9)).arr[((x_189 * 2) + ((x_191 * 2) * 16))];
+          if ((x_196 == 0)) {
+            int const x_200 = j;
+            p.x = (x_200 * 2);
+            int const x_203 = i;
+            p.y = (x_203 * 2);
+            canwalk = true;
+          }
+          {
+            int const x_206 = j;
+            j = (x_206 + 1);
+          }
+        }
+        {
+          int const x_208 = i;
+          i = (x_208 + 1);
+        }
+      }
+      int const x_211 = p.x;
+      int const x_213 = p.y;
+      (*(tint_symbol_9)).arr[(x_211 + (x_213 * 16))] = 1;
+    } else {
+      int const x_217 = v;
+      int const x_218 = directions;
+      d = (x_217 % x_218);
+      int const x_220 = directions;
+      int const x_221 = v;
+      v = (x_221 + x_220);
+      int const x_223 = d;
+      bool const x_224 = (x_223 >= 0);
+      x_230_phi = x_224;
+      if (x_224) {
+        int const x_228 = p.x;
+        x_229 = (x_228 > 0);
+        x_230_phi = x_229;
+      }
+      bool const x_230 = x_230_phi;
+      x_243_phi = x_230;
+      if (x_230) {
+        int const x_234 = p.x;
+        int const x_237 = p.y;
+        int const x_241 = (*(tint_symbol_9)).arr[((x_234 - 2) + (x_237 * 16))];
+        x_242 = (x_241 == 0);
+        x_243_phi = x_242;
+      }
+      bool const x_243 = x_243_phi;
+      if (x_243) {
+        int const x_246 = d;
+        d = (x_246 - 1);
+        int const x_249 = p.x;
+        int const x_251 = p.y;
+        (*(tint_symbol_9)).arr[(x_249 + (x_251 * 16))] = 1;
+        int const x_256 = p.x;
+        int const x_259 = p.y;
+        (*(tint_symbol_9)).arr[((x_256 - 1) + (x_259 * 16))] = 1;
+        int const x_264 = p.x;
+        int const x_267 = p.y;
+        (*(tint_symbol_9)).arr[((x_264 - 2) + (x_267 * 16))] = 1;
+        int const x_272 = p.x;
+        p.x = (x_272 - 2);
+      }
+      int const x_275 = d;
+      bool const x_276 = (x_275 >= 0);
+      x_282_phi = x_276;
+      if (x_276) {
+        int const x_280 = p.y;
+        x_281 = (x_280 > 0);
+        x_282_phi = x_281;
+      }
+      bool const x_282 = x_282_phi;
+      if (x_282) {
+        x_288 = p.x;
+        x_290_phi = x_288;
+      } else {
+        x_289 = 0;
+        x_290_phi = x_289;
+      }
+      int const x_290 = x_290_phi;
+      if (x_282) {
+        x_295 = p.y;
+        x_297_phi = x_295;
+      } else {
+        x_296 = 0;
+        x_297_phi = x_296;
+      }
+      int const x_297 = x_297_phi;
+      int const x_299 = ((x_297 - 2) * 16);
+      if (x_282) {
+        x_303 = *(tint_symbol_9);
+        x_305_phi = x_303;
+      } else {
+        tint_array_wrapper const tint_symbol_4 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+        x_304 = tint_symbol_4;
+        x_305_phi = x_304;
+      }
+      tint_array_wrapper const x_305 = x_305_phi;
+      if (x_282) {
+        tint_array_wrapper const tint_symbol_5 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+        *(tint_symbol_9) = tint_symbol_5;
+      }
+      if (x_282) {
+        *(tint_symbol_9) = x_305;
+      }
+      if (x_282) {
+        x_315 = (*(tint_symbol_9)).arr[(x_290 + x_299)];
+        x_317_phi = x_315;
+      } else {
+        x_316 = 0;
+        x_317_phi = x_316;
+      }
+      int const x_317 = x_317_phi;
+      bool const x_318 = (x_317 == 0);
+      if (select(x_282, x_318, x_282)) {
+        int const x_323 = d;
+        d = (x_323 - 1);
+        int const x_326 = p.x;
+        int const x_328 = p.y;
+        (*(tint_symbol_9)).arr[(x_326 + (x_328 * 16))] = 1;
+        int const x_333 = p.x;
+        int const x_335 = p.y;
+        (*(tint_symbol_9)).arr[(x_333 + ((x_335 - 1) * 16))] = 1;
+        int const x_341 = p.x;
+        int const x_343 = p.y;
+        tint_array_wrapper const x_345 = *(tint_symbol_9);
+        tint_array_wrapper const tint_symbol_6 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+        *(tint_symbol_9) = tint_symbol_6;
+        *(tint_symbol_9) = x_345;
+        (*(tint_symbol_9)).arr[(x_341 + ((x_343 - 2) * 16))] = 1;
+        int const x_350 = p.y;
+        p.y = (x_350 - 2);
+      }
+      int const x_353 = d;
+      bool const x_354 = (x_353 >= 0);
+      x_360_phi = x_354;
+      if (x_354) {
+        int const x_358 = p.x;
+        x_359 = (x_358 < 14);
+        x_360_phi = x_359;
+      }
+      bool const x_360 = x_360_phi;
+      x_373_phi = x_360;
+      if (x_360) {
+        int const x_364 = p.x;
+        int const x_367 = p.y;
+        int const x_371 = (*(tint_symbol_9)).arr[((x_364 + 2) + (x_367 * 16))];
+        x_372 = (x_371 == 0);
+        x_373_phi = x_372;
+      }
+      bool const x_373 = x_373_phi;
+      if (x_373) {
+        int const x_376 = d;
+        d = (x_376 - 1);
+        int const x_379 = p.x;
+        int const x_381 = p.y;
+        (*(tint_symbol_9)).arr[(x_379 + (x_381 * 16))] = 1;
+        int const x_386 = p.x;
+        int const x_389 = p.y;
+        (*(tint_symbol_9)).arr[((x_386 + 1) + (x_389 * 16))] = 1;
+        int const x_394 = p.x;
+        int const x_397 = p.y;
+        (*(tint_symbol_9)).arr[((x_394 + 2) + (x_397 * 16))] = 1;
+        int const x_402 = p.x;
+        p.x = (x_402 + 2);
+      }
+      int const x_405 = d;
+      bool const x_406 = (x_405 >= 0);
+      x_412_phi = x_406;
+      if (x_406) {
+        int const x_410 = p.y;
+        x_411 = (x_410 < 14);
+        x_412_phi = x_411;
+      }
+      bool const x_412 = x_412_phi;
+      x_425_phi = x_412;
+      if (x_412) {
+        int const x_416 = p.x;
+        int const x_418 = p.y;
+        int const x_423 = (*(tint_symbol_9)).arr[(x_416 + ((x_418 + 2) * 16))];
+        x_424 = (x_423 == 0);
+        x_425_phi = x_424;
+      }
+      bool const x_425 = x_425_phi;
+      if (x_425) {
+        int const x_428 = d;
+        d = (x_428 - 1);
+        int const x_431 = p.x;
+        int const x_433 = p.y;
+        (*(tint_symbol_9)).arr[(x_431 + (x_433 * 16))] = 1;
+        int const x_438 = p.x;
+        int const x_440 = p.y;
+        (*(tint_symbol_9)).arr[(x_438 + ((x_440 + 1) * 16))] = 1;
+        int const x_446 = p.x;
+        int const x_448 = p.y;
+        (*(tint_symbol_9)).arr[(x_446 + ((x_448 + 2) * 16))] = 1;
+        int const x_454 = p.y;
+        p.y = (x_454 + 2);
+      }
+    }
+    int const x_458 = ipos.y;
+    int const x_461 = ipos.x;
+    int const x_464 = (*(tint_symbol_9)).arr[((x_458 * 16) + x_461)];
+    if ((x_464 == 1)) {
+      *(tint_symbol_10) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+      return;
+    }
+    {
+      bool const x_468 = canwalk;
+      if (x_468) {
+      } else {
+        break;
+      }
+    }
+  }
+  *(tint_symbol_10) = float4(0.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_11 = 0.0f;
+  thread tint_array_wrapper tint_symbol_12 = {};
+  thread float4 tint_symbol_13 = 0.0f;
+  tint_symbol_11 = gl_FragCoord_param;
+  main_1(x_7, &(tint_symbol_11), &(tint_symbol_12), &(tint_symbol_13));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_13};
+  tint_symbol_2 const tint_symbol_7 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_7;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..bde11c8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/1.spvasm.expected.spvasm
@@ -0,0 +1,860 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 548
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_7 "x_7"
+               OpName %map "map"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %pos "pos"
+               OpName %ipos "ipos"
+               OpName %i "i"
+               OpName %p "p"
+               OpName %canwalk "canwalk"
+               OpName %v "v"
+               OpName %directions "directions"
+               OpName %j "j"
+               OpName %d "d"
+               OpName %x_104 "x_104"
+               OpName %x_124 "x_124"
+               OpName %x_144 "x_144"
+               OpName %x_164 "x_164"
+               OpName %x_105_phi "x_105_phi"
+               OpName %x_125_phi "x_125_phi"
+               OpName %x_145_phi "x_145_phi"
+               OpName %x_165_phi "x_165_phi"
+               OpName %x_229 "x_229"
+               OpName %x_242 "x_242"
+               OpName %x_281 "x_281"
+               OpName %x_288 "x_288"
+               OpName %x_289 "x_289"
+               OpName %x_295 "x_295"
+               OpName %x_296 "x_296"
+               OpName %x_303 "x_303"
+               OpName %x_304 "x_304"
+               OpName %x_315 "x_315"
+               OpName %x_316 "x_316"
+               OpName %x_359 "x_359"
+               OpName %x_372 "x_372"
+               OpName %x_411 "x_411"
+               OpName %x_424 "x_424"
+               OpName %x_230_phi "x_230_phi"
+               OpName %x_243_phi "x_243_phi"
+               OpName %x_282_phi "x_282_phi"
+               OpName %x_290_phi "x_290_phi"
+               OpName %x_297_phi "x_297_phi"
+               OpName %x_305_phi "x_305_phi"
+               OpName %x_317_phi "x_317_phi"
+               OpName %x_360_phi "x_360_phi"
+               OpName %x_373_phi "x_373_phi"
+               OpName %x_412_phi "x_412_phi"
+               OpName %x_425_phi "x_425_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %_arr_int_uint_256 ArrayStride 4
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+   %uint_256 = OpConstant %uint 256
+%_arr_int_uint_256 = OpTypeArray %int %uint_256
+%_ptr_Private__arr_int_uint_256 = OpTypePointer Private %_arr_int_uint_256
+         %16 = OpConstantNull %_arr_int_uint_256
+        %map = OpVariable %_ptr_Private__arr_int_uint_256 Private %16
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %22 = OpTypeFunction %void
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %28 = OpConstantNull %v2float
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %32 = OpConstantNull %v2int
+%_ptr_Function_int = OpTypePointer Function %int
+         %35 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %40 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+   %float_16 = OpConstant %float 16
+      %int_0 = OpConstant %int 0
+    %int_256 = OpConstant %int 256
+%_ptr_Private_int = OpTypePointer Private %int
+      %int_1 = OpConstant %int 1
+         %83 = OpConstantComposite %v2int %int_0 %int_0
+       %true = OpConstantTrue %bool
+      %int_2 = OpConstant %int 2
+     %int_16 = OpConstant %int 16
+     %int_14 = OpConstant %int 14
+%_ptr_Function__arr_int_uint_256 = OpTypePointer Function %_arr_int_uint_256
+      %false = OpConstantFalse %bool
+      %int_8 = OpConstant %int 8
+        %358 = OpConstantComposite %_arr_int_uint_256 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0
+    %float_1 = OpConstant %float 1
+        %528 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+    %float_0 = OpConstant %float 0
+        %534 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %535 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %22
+         %25 = OpLabel
+        %pos = OpVariable %_ptr_Function_v2float Function %28
+       %ipos = OpVariable %_ptr_Function_v2int Function %32
+          %i = OpVariable %_ptr_Function_int Function %35
+          %p = OpVariable %_ptr_Function_v2int Function %32
+    %canwalk = OpVariable %_ptr_Function_bool Function %40
+          %v = OpVariable %_ptr_Function_int Function %35
+ %directions = OpVariable %_ptr_Function_int Function %35
+          %j = OpVariable %_ptr_Function_int Function %35
+          %d = OpVariable %_ptr_Function_int Function %35
+      %x_104 = OpVariable %_ptr_Function_bool Function %40
+      %x_124 = OpVariable %_ptr_Function_bool Function %40
+      %x_144 = OpVariable %_ptr_Function_bool Function %40
+      %x_164 = OpVariable %_ptr_Function_bool Function %40
+  %x_105_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_125_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_145_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_165_phi = OpVariable %_ptr_Function_bool Function %40
+      %x_229 = OpVariable %_ptr_Function_bool Function %40
+      %x_242 = OpVariable %_ptr_Function_bool Function %40
+      %x_281 = OpVariable %_ptr_Function_bool Function %40
+      %x_288 = OpVariable %_ptr_Function_int Function %35
+      %x_289 = OpVariable %_ptr_Function_int Function %35
+      %x_295 = OpVariable %_ptr_Function_int Function %35
+      %x_296 = OpVariable %_ptr_Function_int Function %35
+      %x_303 = OpVariable %_ptr_Function__arr_int_uint_256 Function %16
+      %x_304 = OpVariable %_ptr_Function__arr_int_uint_256 Function %16
+      %x_315 = OpVariable %_ptr_Function_int Function %35
+      %x_316 = OpVariable %_ptr_Function_int Function %35
+      %x_359 = OpVariable %_ptr_Function_bool Function %40
+      %x_372 = OpVariable %_ptr_Function_bool Function %40
+      %x_411 = OpVariable %_ptr_Function_bool Function %40
+      %x_424 = OpVariable %_ptr_Function_bool Function %40
+  %x_230_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_243_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_282_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_290_phi = OpVariable %_ptr_Function_int Function %35
+  %x_297_phi = OpVariable %_ptr_Function_int Function %35
+  %x_305_phi = OpVariable %_ptr_Function__arr_int_uint_256 Function %16
+  %x_317_phi = OpVariable %_ptr_Function_int Function %35
+  %x_360_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_373_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_412_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_425_phi = OpVariable %_ptr_Function_bool Function %40
+         %45 = OpLoad %v4float %gl_FragCoord
+         %48 = OpAccessChain %_ptr_Uniform_v2float %x_7 %uint_0
+         %49 = OpLoad %v2float %48
+         %50 = OpCompositeExtract %float %45 0
+         %51 = OpCompositeExtract %float %45 1
+         %52 = OpCompositeConstruct %v2float %50 %51
+         %53 = OpFDiv %v2float %52 %49
+               OpStore %pos %53
+         %55 = OpAccessChain %_ptr_Function_float %pos %uint_0
+         %56 = OpLoad %float %55
+         %58 = OpAccessChain %_ptr_Function_float %pos %uint_1
+         %59 = OpLoad %float %58
+         %62 = OpFMul %float %56 %float_16
+         %60 = OpConvertFToS %int %62
+         %64 = OpFMul %float %59 %float_16
+         %63 = OpConvertFToS %int %64
+         %65 = OpCompositeConstruct %v2int %60 %63
+               OpStore %ipos %65
+               OpStore %i %int_0
+               OpBranch %67
+         %67 = OpLabel
+               OpLoopMerge %68 %69 None
+               OpBranch %70
+         %70 = OpLabel
+         %71 = OpLoad %int %i
+         %73 = OpSLessThan %bool %71 %int_256
+               OpSelectionMerge %74 None
+               OpBranchConditional %73 %75 %76
+         %75 = OpLabel
+               OpBranch %74
+         %76 = OpLabel
+               OpBranch %68
+         %74 = OpLabel
+         %77 = OpLoad %int %i
+         %79 = OpAccessChain %_ptr_Private_int %map %77
+               OpStore %79 %int_0
+               OpBranch %69
+         %69 = OpLabel
+         %80 = OpLoad %int %i
+         %82 = OpIAdd %int %80 %int_1
+               OpStore %i %82
+               OpBranch %67
+         %68 = OpLabel
+               OpStore %p %83
+               OpStore %canwalk %true
+               OpStore %v %int_0
+               OpBranch %85
+         %85 = OpLabel
+               OpLoopMerge %86 %87 None
+               OpBranch %88
+         %88 = OpLabel
+         %97 = OpLoad %int %v
+         %98 = OpIAdd %int %97 %int_1
+               OpStore %v %98
+               OpStore %directions %int_0
+         %99 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %100 = OpLoad %int %99
+        %101 = OpSGreaterThan %bool %100 %int_0
+               OpStore %x_105_phi %101
+               OpSelectionMerge %102 None
+               OpBranchConditional %101 %103 %102
+        %103 = OpLabel
+        %104 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %105 = OpLoad %int %104
+        %106 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %107 = OpLoad %int %106
+        %109 = OpISub %int %105 %int_2
+        %111 = OpIMul %int %107 %int_16
+        %112 = OpIAdd %int %109 %111
+        %113 = OpAccessChain %_ptr_Private_int %map %112
+        %114 = OpLoad %int %113
+        %115 = OpIEqual %bool %114 %int_0
+               OpStore %x_104 %115
+        %116 = OpLoad %bool %x_104
+               OpStore %x_105_phi %116
+               OpBranch %102
+        %102 = OpLabel
+        %117 = OpLoad %bool %x_105_phi
+               OpSelectionMerge %118 None
+               OpBranchConditional %117 %119 %118
+        %119 = OpLabel
+        %120 = OpLoad %int %directions
+        %121 = OpIAdd %int %120 %int_1
+               OpStore %directions %121
+               OpBranch %118
+        %118 = OpLabel
+        %122 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %123 = OpLoad %int %122
+        %124 = OpSGreaterThan %bool %123 %int_0
+               OpStore %x_125_phi %124
+               OpSelectionMerge %125 None
+               OpBranchConditional %124 %126 %125
+        %126 = OpLabel
+        %127 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %128 = OpLoad %int %127
+        %129 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %130 = OpLoad %int %129
+        %131 = OpISub %int %130 %int_2
+        %132 = OpIMul %int %131 %int_16
+        %133 = OpIAdd %int %128 %132
+        %134 = OpAccessChain %_ptr_Private_int %map %133
+        %135 = OpLoad %int %134
+        %136 = OpIEqual %bool %135 %int_0
+               OpStore %x_124 %136
+        %137 = OpLoad %bool %x_124
+               OpStore %x_125_phi %137
+               OpBranch %125
+        %125 = OpLabel
+        %138 = OpLoad %bool %x_125_phi
+               OpSelectionMerge %139 None
+               OpBranchConditional %138 %140 %139
+        %140 = OpLabel
+        %141 = OpLoad %int %directions
+        %142 = OpIAdd %int %141 %int_1
+               OpStore %directions %142
+               OpBranch %139
+        %139 = OpLabel
+        %143 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %144 = OpLoad %int %143
+        %146 = OpSLessThan %bool %144 %int_14
+               OpStore %x_145_phi %146
+               OpSelectionMerge %147 None
+               OpBranchConditional %146 %148 %147
+        %148 = OpLabel
+        %149 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %150 = OpLoad %int %149
+        %151 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %152 = OpLoad %int %151
+        %153 = OpIAdd %int %150 %int_2
+        %154 = OpIMul %int %152 %int_16
+        %155 = OpIAdd %int %153 %154
+        %156 = OpAccessChain %_ptr_Private_int %map %155
+        %157 = OpLoad %int %156
+        %158 = OpIEqual %bool %157 %int_0
+               OpStore %x_144 %158
+        %159 = OpLoad %bool %x_144
+               OpStore %x_145_phi %159
+               OpBranch %147
+        %147 = OpLabel
+        %160 = OpLoad %bool %x_145_phi
+               OpSelectionMerge %161 None
+               OpBranchConditional %160 %162 %161
+        %162 = OpLabel
+        %163 = OpLoad %int %directions
+        %164 = OpIAdd %int %163 %int_1
+               OpStore %directions %164
+               OpBranch %161
+        %161 = OpLabel
+        %165 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %166 = OpLoad %int %165
+        %167 = OpSLessThan %bool %166 %int_14
+               OpStore %x_165_phi %167
+               OpSelectionMerge %168 None
+               OpBranchConditional %167 %169 %168
+        %169 = OpLabel
+        %170 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %171 = OpLoad %int %170
+        %172 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %173 = OpLoad %int %172
+        %174 = OpIAdd %int %173 %int_2
+        %175 = OpIMul %int %174 %int_16
+        %176 = OpIAdd %int %171 %175
+        %177 = OpAccessChain %_ptr_Private_int %map %176
+        %178 = OpLoad %int %177
+        %179 = OpIEqual %bool %178 %int_0
+               OpStore %x_164 %179
+        %180 = OpLoad %bool %x_164
+               OpStore %x_165_phi %180
+               OpBranch %168
+        %168 = OpLabel
+        %181 = OpLoad %bool %x_165_phi
+               OpSelectionMerge %182 None
+               OpBranchConditional %181 %183 %182
+        %183 = OpLabel
+        %184 = OpLoad %int %directions
+        %185 = OpIAdd %int %184 %int_1
+               OpStore %directions %185
+               OpBranch %182
+        %182 = OpLabel
+        %213 = OpLoad %int %directions
+        %214 = OpIEqual %bool %213 %int_0
+               OpSelectionMerge %215 None
+               OpBranchConditional %214 %216 %217
+        %216 = OpLabel
+               OpStore %canwalk %false
+               OpStore %i %int_0
+               OpBranch %219
+        %219 = OpLabel
+               OpLoopMerge %220 %221 None
+               OpBranch %222
+        %222 = OpLabel
+        %223 = OpLoad %int %i
+        %225 = OpSLessThan %bool %223 %int_8
+               OpSelectionMerge %226 None
+               OpBranchConditional %225 %227 %228
+        %227 = OpLabel
+               OpBranch %226
+        %228 = OpLabel
+               OpBranch %220
+        %226 = OpLabel
+               OpStore %j %int_0
+               OpBranch %229
+        %229 = OpLabel
+               OpLoopMerge %230 %231 None
+               OpBranch %232
+        %232 = OpLabel
+        %233 = OpLoad %int %j
+        %234 = OpSLessThan %bool %233 %int_8
+               OpSelectionMerge %235 None
+               OpBranchConditional %234 %236 %237
+        %236 = OpLabel
+               OpBranch %235
+        %237 = OpLabel
+               OpBranch %230
+        %235 = OpLabel
+        %238 = OpLoad %int %j
+        %239 = OpLoad %int %i
+        %240 = OpIMul %int %238 %int_2
+        %241 = OpIMul %int %239 %int_2
+        %242 = OpIMul %int %241 %int_16
+        %243 = OpIAdd %int %240 %242
+        %244 = OpAccessChain %_ptr_Private_int %map %243
+        %245 = OpLoad %int %244
+        %246 = OpIEqual %bool %245 %int_0
+               OpSelectionMerge %247 None
+               OpBranchConditional %246 %248 %247
+        %248 = OpLabel
+        %249 = OpLoad %int %j
+        %250 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %251 = OpIMul %int %249 %int_2
+               OpStore %250 %251
+        %252 = OpLoad %int %i
+        %253 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %254 = OpIMul %int %252 %int_2
+               OpStore %253 %254
+               OpStore %canwalk %true
+               OpBranch %247
+        %247 = OpLabel
+               OpBranch %231
+        %231 = OpLabel
+        %255 = OpLoad %int %j
+        %256 = OpIAdd %int %255 %int_1
+               OpStore %j %256
+               OpBranch %229
+        %230 = OpLabel
+               OpBranch %221
+        %221 = OpLabel
+        %257 = OpLoad %int %i
+        %258 = OpIAdd %int %257 %int_1
+               OpStore %i %258
+               OpBranch %219
+        %220 = OpLabel
+        %259 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %260 = OpLoad %int %259
+        %261 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %262 = OpLoad %int %261
+        %263 = OpIMul %int %262 %int_16
+        %264 = OpIAdd %int %260 %263
+        %265 = OpAccessChain %_ptr_Private_int %map %264
+               OpStore %265 %int_1
+               OpBranch %215
+        %217 = OpLabel
+        %266 = OpLoad %int %v
+        %267 = OpLoad %int %directions
+        %268 = OpSMod %int %266 %267
+               OpStore %d %268
+        %269 = OpLoad %int %directions
+        %270 = OpLoad %int %v
+        %271 = OpIAdd %int %270 %269
+               OpStore %v %271
+        %272 = OpLoad %int %d
+        %273 = OpSGreaterThanEqual %bool %272 %int_0
+               OpStore %x_230_phi %273
+               OpSelectionMerge %274 None
+               OpBranchConditional %273 %275 %274
+        %275 = OpLabel
+        %276 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %277 = OpLoad %int %276
+        %278 = OpSGreaterThan %bool %277 %int_0
+               OpStore %x_229 %278
+        %279 = OpLoad %bool %x_229
+               OpStore %x_230_phi %279
+               OpBranch %274
+        %274 = OpLabel
+        %280 = OpLoad %bool %x_230_phi
+               OpStore %x_243_phi %280
+               OpSelectionMerge %281 None
+               OpBranchConditional %280 %282 %281
+        %282 = OpLabel
+        %283 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %284 = OpLoad %int %283
+        %285 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %286 = OpLoad %int %285
+        %287 = OpISub %int %284 %int_2
+        %288 = OpIMul %int %286 %int_16
+        %289 = OpIAdd %int %287 %288
+        %290 = OpAccessChain %_ptr_Private_int %map %289
+        %291 = OpLoad %int %290
+        %292 = OpIEqual %bool %291 %int_0
+               OpStore %x_242 %292
+        %293 = OpLoad %bool %x_242
+               OpStore %x_243_phi %293
+               OpBranch %281
+        %281 = OpLabel
+        %294 = OpLoad %bool %x_243_phi
+               OpSelectionMerge %295 None
+               OpBranchConditional %294 %296 %295
+        %296 = OpLabel
+        %297 = OpLoad %int %d
+        %298 = OpISub %int %297 %int_1
+               OpStore %d %298
+        %299 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %300 = OpLoad %int %299
+        %301 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %302 = OpLoad %int %301
+        %303 = OpIMul %int %302 %int_16
+        %304 = OpIAdd %int %300 %303
+        %305 = OpAccessChain %_ptr_Private_int %map %304
+               OpStore %305 %int_1
+        %306 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %307 = OpLoad %int %306
+        %308 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %309 = OpLoad %int %308
+        %310 = OpISub %int %307 %int_1
+        %311 = OpIMul %int %309 %int_16
+        %312 = OpIAdd %int %310 %311
+        %313 = OpAccessChain %_ptr_Private_int %map %312
+               OpStore %313 %int_1
+        %314 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %315 = OpLoad %int %314
+        %316 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %317 = OpLoad %int %316
+        %318 = OpISub %int %315 %int_2
+        %319 = OpIMul %int %317 %int_16
+        %320 = OpIAdd %int %318 %319
+        %321 = OpAccessChain %_ptr_Private_int %map %320
+               OpStore %321 %int_1
+        %322 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %323 = OpLoad %int %322
+        %324 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %325 = OpISub %int %323 %int_2
+               OpStore %324 %325
+               OpBranch %295
+        %295 = OpLabel
+        %326 = OpLoad %int %d
+        %327 = OpSGreaterThanEqual %bool %326 %int_0
+               OpStore %x_282_phi %327
+               OpSelectionMerge %328 None
+               OpBranchConditional %327 %329 %328
+        %329 = OpLabel
+        %330 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %331 = OpLoad %int %330
+        %332 = OpSGreaterThan %bool %331 %int_0
+               OpStore %x_281 %332
+        %333 = OpLoad %bool %x_281
+               OpStore %x_282_phi %333
+               OpBranch %328
+        %328 = OpLabel
+        %334 = OpLoad %bool %x_282_phi
+               OpSelectionMerge %335 None
+               OpBranchConditional %334 %336 %337
+        %336 = OpLabel
+        %338 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %339 = OpLoad %int %338
+               OpStore %x_288 %339
+        %340 = OpLoad %int %x_288
+               OpStore %x_290_phi %340
+               OpBranch %335
+        %337 = OpLabel
+               OpStore %x_289 %int_0
+        %341 = OpLoad %int %x_289
+               OpStore %x_290_phi %341
+               OpBranch %335
+        %335 = OpLabel
+        %342 = OpLoad %int %x_290_phi
+               OpSelectionMerge %343 None
+               OpBranchConditional %334 %344 %345
+        %344 = OpLabel
+        %346 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %347 = OpLoad %int %346
+               OpStore %x_295 %347
+        %348 = OpLoad %int %x_295
+               OpStore %x_297_phi %348
+               OpBranch %343
+        %345 = OpLabel
+               OpStore %x_296 %int_0
+        %349 = OpLoad %int %x_296
+               OpStore %x_297_phi %349
+               OpBranch %343
+        %343 = OpLabel
+        %350 = OpLoad %int %x_297_phi
+        %351 = OpISub %int %350 %int_2
+        %352 = OpIMul %int %351 %int_16
+               OpSelectionMerge %353 None
+               OpBranchConditional %334 %354 %355
+        %354 = OpLabel
+        %356 = OpLoad %_arr_int_uint_256 %map
+               OpStore %x_303 %356
+        %357 = OpLoad %_arr_int_uint_256 %x_303
+               OpStore %x_305_phi %357
+               OpBranch %353
+        %355 = OpLabel
+               OpStore %x_304 %358
+        %359 = OpLoad %_arr_int_uint_256 %x_304
+               OpStore %x_305_phi %359
+               OpBranch %353
+        %353 = OpLabel
+        %360 = OpLoad %_arr_int_uint_256 %x_305_phi
+               OpSelectionMerge %361 None
+               OpBranchConditional %334 %362 %361
+        %362 = OpLabel
+               OpStore %map %358
+               OpBranch %361
+        %361 = OpLabel
+               OpSelectionMerge %363 None
+               OpBranchConditional %334 %364 %363
+        %364 = OpLabel
+               OpStore %map %360
+               OpBranch %363
+        %363 = OpLabel
+               OpSelectionMerge %365 None
+               OpBranchConditional %334 %366 %367
+        %366 = OpLabel
+        %368 = OpIAdd %int %342 %352
+        %369 = OpAccessChain %_ptr_Private_int %map %368
+        %370 = OpLoad %int %369
+               OpStore %x_315 %370
+        %371 = OpLoad %int %x_315
+               OpStore %x_317_phi %371
+               OpBranch %365
+        %367 = OpLabel
+               OpStore %x_316 %int_0
+        %372 = OpLoad %int %x_316
+               OpStore %x_317_phi %372
+               OpBranch %365
+        %365 = OpLabel
+        %373 = OpLoad %int %x_317_phi
+        %374 = OpIEqual %bool %373 %int_0
+        %375 = OpSelect %bool %334 %374 %334
+               OpSelectionMerge %376 None
+               OpBranchConditional %375 %377 %376
+        %377 = OpLabel
+        %378 = OpLoad %int %d
+        %379 = OpISub %int %378 %int_1
+               OpStore %d %379
+        %380 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %381 = OpLoad %int %380
+        %382 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %383 = OpLoad %int %382
+        %384 = OpIMul %int %383 %int_16
+        %385 = OpIAdd %int %381 %384
+        %386 = OpAccessChain %_ptr_Private_int %map %385
+               OpStore %386 %int_1
+        %387 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %388 = OpLoad %int %387
+        %389 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %390 = OpLoad %int %389
+        %391 = OpISub %int %390 %int_1
+        %392 = OpIMul %int %391 %int_16
+        %393 = OpIAdd %int %388 %392
+        %394 = OpAccessChain %_ptr_Private_int %map %393
+               OpStore %394 %int_1
+        %395 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %396 = OpLoad %int %395
+        %397 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %398 = OpLoad %int %397
+        %399 = OpLoad %_arr_int_uint_256 %map
+               OpStore %map %358
+               OpStore %map %399
+        %400 = OpISub %int %398 %int_2
+        %401 = OpIMul %int %400 %int_16
+        %402 = OpIAdd %int %396 %401
+        %403 = OpAccessChain %_ptr_Private_int %map %402
+               OpStore %403 %int_1
+        %404 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %405 = OpLoad %int %404
+        %406 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %407 = OpISub %int %405 %int_2
+               OpStore %406 %407
+               OpBranch %376
+        %376 = OpLabel
+        %408 = OpLoad %int %d
+        %409 = OpSGreaterThanEqual %bool %408 %int_0
+               OpStore %x_360_phi %409
+               OpSelectionMerge %410 None
+               OpBranchConditional %409 %411 %410
+        %411 = OpLabel
+        %412 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %413 = OpLoad %int %412
+        %414 = OpSLessThan %bool %413 %int_14
+               OpStore %x_359 %414
+        %415 = OpLoad %bool %x_359
+               OpStore %x_360_phi %415
+               OpBranch %410
+        %410 = OpLabel
+        %416 = OpLoad %bool %x_360_phi
+               OpStore %x_373_phi %416
+               OpSelectionMerge %417 None
+               OpBranchConditional %416 %418 %417
+        %418 = OpLabel
+        %419 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %420 = OpLoad %int %419
+        %421 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %422 = OpLoad %int %421
+        %423 = OpIAdd %int %420 %int_2
+        %424 = OpIMul %int %422 %int_16
+        %425 = OpIAdd %int %423 %424
+        %426 = OpAccessChain %_ptr_Private_int %map %425
+        %427 = OpLoad %int %426
+        %428 = OpIEqual %bool %427 %int_0
+               OpStore %x_372 %428
+        %429 = OpLoad %bool %x_372
+               OpStore %x_373_phi %429
+               OpBranch %417
+        %417 = OpLabel
+        %430 = OpLoad %bool %x_373_phi
+               OpSelectionMerge %431 None
+               OpBranchConditional %430 %432 %431
+        %432 = OpLabel
+        %433 = OpLoad %int %d
+        %434 = OpISub %int %433 %int_1
+               OpStore %d %434
+        %435 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %436 = OpLoad %int %435
+        %437 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %438 = OpLoad %int %437
+        %439 = OpIMul %int %438 %int_16
+        %440 = OpIAdd %int %436 %439
+        %441 = OpAccessChain %_ptr_Private_int %map %440
+               OpStore %441 %int_1
+        %442 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %443 = OpLoad %int %442
+        %444 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %445 = OpLoad %int %444
+        %446 = OpIAdd %int %443 %int_1
+        %447 = OpIMul %int %445 %int_16
+        %448 = OpIAdd %int %446 %447
+        %449 = OpAccessChain %_ptr_Private_int %map %448
+               OpStore %449 %int_1
+        %450 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %451 = OpLoad %int %450
+        %452 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %453 = OpLoad %int %452
+        %454 = OpIAdd %int %451 %int_2
+        %455 = OpIMul %int %453 %int_16
+        %456 = OpIAdd %int %454 %455
+        %457 = OpAccessChain %_ptr_Private_int %map %456
+               OpStore %457 %int_1
+        %458 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %459 = OpLoad %int %458
+        %460 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %461 = OpIAdd %int %459 %int_2
+               OpStore %460 %461
+               OpBranch %431
+        %431 = OpLabel
+        %462 = OpLoad %int %d
+        %463 = OpSGreaterThanEqual %bool %462 %int_0
+               OpStore %x_412_phi %463
+               OpSelectionMerge %464 None
+               OpBranchConditional %463 %465 %464
+        %465 = OpLabel
+        %466 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %467 = OpLoad %int %466
+        %468 = OpSLessThan %bool %467 %int_14
+               OpStore %x_411 %468
+        %469 = OpLoad %bool %x_411
+               OpStore %x_412_phi %469
+               OpBranch %464
+        %464 = OpLabel
+        %470 = OpLoad %bool %x_412_phi
+               OpStore %x_425_phi %470
+               OpSelectionMerge %471 None
+               OpBranchConditional %470 %472 %471
+        %472 = OpLabel
+        %473 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %474 = OpLoad %int %473
+        %475 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %476 = OpLoad %int %475
+        %477 = OpIAdd %int %476 %int_2
+        %478 = OpIMul %int %477 %int_16
+        %479 = OpIAdd %int %474 %478
+        %480 = OpAccessChain %_ptr_Private_int %map %479
+        %481 = OpLoad %int %480
+        %482 = OpIEqual %bool %481 %int_0
+               OpStore %x_424 %482
+        %483 = OpLoad %bool %x_424
+               OpStore %x_425_phi %483
+               OpBranch %471
+        %471 = OpLabel
+        %484 = OpLoad %bool %x_425_phi
+               OpSelectionMerge %485 None
+               OpBranchConditional %484 %486 %485
+        %486 = OpLabel
+        %487 = OpLoad %int %d
+        %488 = OpISub %int %487 %int_1
+               OpStore %d %488
+        %489 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %490 = OpLoad %int %489
+        %491 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %492 = OpLoad %int %491
+        %493 = OpIMul %int %492 %int_16
+        %494 = OpIAdd %int %490 %493
+        %495 = OpAccessChain %_ptr_Private_int %map %494
+               OpStore %495 %int_1
+        %496 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %497 = OpLoad %int %496
+        %498 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %499 = OpLoad %int %498
+        %500 = OpIAdd %int %499 %int_1
+        %501 = OpIMul %int %500 %int_16
+        %502 = OpIAdd %int %497 %501
+        %503 = OpAccessChain %_ptr_Private_int %map %502
+               OpStore %503 %int_1
+        %504 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %505 = OpLoad %int %504
+        %506 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %507 = OpLoad %int %506
+        %508 = OpIAdd %int %507 %int_2
+        %509 = OpIMul %int %508 %int_16
+        %510 = OpIAdd %int %505 %509
+        %511 = OpAccessChain %_ptr_Private_int %map %510
+               OpStore %511 %int_1
+        %512 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %513 = OpLoad %int %512
+        %514 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %515 = OpIAdd %int %513 %int_2
+               OpStore %514 %515
+               OpBranch %485
+        %485 = OpLabel
+               OpBranch %215
+        %215 = OpLabel
+        %516 = OpAccessChain %_ptr_Function_int %ipos %uint_1
+        %517 = OpLoad %int %516
+        %518 = OpAccessChain %_ptr_Function_int %ipos %uint_0
+        %519 = OpLoad %int %518
+        %520 = OpIMul %int %517 %int_16
+        %521 = OpIAdd %int %520 %519
+        %522 = OpAccessChain %_ptr_Private_int %map %521
+        %523 = OpLoad %int %522
+        %524 = OpIEqual %bool %523 %int_1
+               OpSelectionMerge %525 None
+               OpBranchConditional %524 %526 %525
+        %526 = OpLabel
+               OpStore %x_GLF_color %528
+               OpReturn
+        %525 = OpLabel
+               OpBranch %87
+         %87 = OpLabel
+        %529 = OpLoad %bool %canwalk
+               OpSelectionMerge %530 None
+               OpBranchConditional %529 %531 %532
+        %531 = OpLabel
+               OpBranch %530
+        %532 = OpLabel
+               OpBranch %86
+        %530 = OpLabel
+               OpBranch %85
+         %86 = OpLabel
+               OpStore %x_GLF_color %534
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %535
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %539 = OpLabel
+        %540 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %540
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %22
+        %542 = OpLabel
+        %543 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %543
+        %544 = OpFunctionCall %void %main_1
+        %546 = OpLoad %v4float %x_GLF_color
+        %547 = OpCompositeConstruct %main_out %546
+        %545 = OpFunctionCall %void %tint_symbol_3 %547
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 87[%87] is not post dominated by the back-edge block 530[%530]
+  %530 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..7636426
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/1.spvasm.expected.wgsl
@@ -0,0 +1,392 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> map : array<i32, 256>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var pos : vec2<f32>;
+  var ipos : vec2<i32>;
+  var i : i32;
+  var p : vec2<i32>;
+  var canwalk : bool;
+  var v : i32;
+  var directions : i32;
+  var j : i32;
+  var d : i32;
+  let x_59 : vec4<f32> = gl_FragCoord;
+  let x_62 : vec2<f32> = x_7.resolution;
+  pos = (vec2<f32>(x_59.x, x_59.y) / x_62);
+  let x_65 : f32 = pos.x;
+  let x_69 : f32 = pos.y;
+  ipos = vec2<i32>(i32((x_65 * 16.0)), i32((x_69 * 16.0)));
+  i = 0;
+  loop {
+    let x_77 : i32 = i;
+    if ((x_77 < 256)) {
+    } else {
+      break;
+    }
+    let x_80 : i32 = i;
+    map[x_80] = 0;
+
+    continuing {
+      let x_82 : i32 = i;
+      i = (x_82 + 1);
+    }
+  }
+  p = vec2<i32>(0, 0);
+  canwalk = true;
+  v = 0;
+  loop {
+    var x_104 : bool;
+    var x_124 : bool;
+    var x_144 : bool;
+    var x_164 : bool;
+    var x_105_phi : bool;
+    var x_125_phi : bool;
+    var x_145_phi : bool;
+    var x_165_phi : bool;
+    let x_88 : i32 = v;
+    v = (x_88 + 1);
+    directions = 0;
+    let x_91 : i32 = p.x;
+    let x_92 : bool = (x_91 > 0);
+    x_105_phi = x_92;
+    if (x_92) {
+      let x_96 : i32 = p.x;
+      let x_99 : i32 = p.y;
+      let x_103 : i32 = map[((x_96 - 2) + (x_99 * 16))];
+      x_104 = (x_103 == 0);
+      x_105_phi = x_104;
+    }
+    let x_105 : bool = x_105_phi;
+    if (x_105) {
+      let x_108 : i32 = directions;
+      directions = (x_108 + 1);
+    }
+    let x_111 : i32 = p.y;
+    let x_112 : bool = (x_111 > 0);
+    x_125_phi = x_112;
+    if (x_112) {
+      let x_116 : i32 = p.x;
+      let x_118 : i32 = p.y;
+      let x_123 : i32 = map[(x_116 + ((x_118 - 2) * 16))];
+      x_124 = (x_123 == 0);
+      x_125_phi = x_124;
+    }
+    let x_125 : bool = x_125_phi;
+    if (x_125) {
+      let x_128 : i32 = directions;
+      directions = (x_128 + 1);
+    }
+    let x_131 : i32 = p.x;
+    let x_132 : bool = (x_131 < 14);
+    x_145_phi = x_132;
+    if (x_132) {
+      let x_136 : i32 = p.x;
+      let x_139 : i32 = p.y;
+      let x_143 : i32 = map[((x_136 + 2) + (x_139 * 16))];
+      x_144 = (x_143 == 0);
+      x_145_phi = x_144;
+    }
+    let x_145 : bool = x_145_phi;
+    if (x_145) {
+      let x_148 : i32 = directions;
+      directions = (x_148 + 1);
+    }
+    let x_151 : i32 = p.y;
+    let x_152 : bool = (x_151 < 14);
+    x_165_phi = x_152;
+    if (x_152) {
+      let x_156 : i32 = p.x;
+      let x_158 : i32 = p.y;
+      let x_163 : i32 = map[(x_156 + ((x_158 + 2) * 16))];
+      x_164 = (x_163 == 0);
+      x_165_phi = x_164;
+    }
+    let x_165 : bool = x_165_phi;
+    if (x_165) {
+      let x_168 : i32 = directions;
+      directions = (x_168 + 1);
+    }
+    var x_229 : bool;
+    var x_242 : bool;
+    var x_281 : bool;
+    var x_288 : i32;
+    var x_289 : i32;
+    var x_295 : i32;
+    var x_296 : i32;
+    var x_303 : array<i32, 256>;
+    var x_304 : array<i32, 256>;
+    var x_315 : i32;
+    var x_316 : i32;
+    var x_359 : bool;
+    var x_372 : bool;
+    var x_411 : bool;
+    var x_424 : bool;
+    var x_230_phi : bool;
+    var x_243_phi : bool;
+    var x_282_phi : bool;
+    var x_290_phi : i32;
+    var x_297_phi : i32;
+    var x_305_phi : array<i32, 256>;
+    var x_317_phi : i32;
+    var x_360_phi : bool;
+    var x_373_phi : bool;
+    var x_412_phi : bool;
+    var x_425_phi : bool;
+    let x_170 : i32 = directions;
+    if ((x_170 == 0)) {
+      canwalk = false;
+      i = 0;
+      loop {
+        let x_179 : i32 = i;
+        if ((x_179 < 8)) {
+        } else {
+          break;
+        }
+        j = 0;
+        loop {
+          let x_186 : i32 = j;
+          if ((x_186 < 8)) {
+          } else {
+            break;
+          }
+          let x_189 : i32 = j;
+          let x_191 : i32 = i;
+          let x_196 : i32 = map[((x_189 * 2) + ((x_191 * 2) * 16))];
+          if ((x_196 == 0)) {
+            let x_200 : i32 = j;
+            p.x = (x_200 * 2);
+            let x_203 : i32 = i;
+            p.y = (x_203 * 2);
+            canwalk = true;
+          }
+
+          continuing {
+            let x_206 : i32 = j;
+            j = (x_206 + 1);
+          }
+        }
+
+        continuing {
+          let x_208 : i32 = i;
+          i = (x_208 + 1);
+        }
+      }
+      let x_211 : i32 = p.x;
+      let x_213 : i32 = p.y;
+      map[(x_211 + (x_213 * 16))] = 1;
+    } else {
+      let x_217 : i32 = v;
+      let x_218 : i32 = directions;
+      d = (x_217 % x_218);
+      let x_220 : i32 = directions;
+      let x_221 : i32 = v;
+      v = (x_221 + x_220);
+      let x_223 : i32 = d;
+      let x_224 : bool = (x_223 >= 0);
+      x_230_phi = x_224;
+      if (x_224) {
+        let x_228 : i32 = p.x;
+        x_229 = (x_228 > 0);
+        x_230_phi = x_229;
+      }
+      let x_230 : bool = x_230_phi;
+      x_243_phi = x_230;
+      if (x_230) {
+        let x_234 : i32 = p.x;
+        let x_237 : i32 = p.y;
+        let x_241 : i32 = map[((x_234 - 2) + (x_237 * 16))];
+        x_242 = (x_241 == 0);
+        x_243_phi = x_242;
+      }
+      let x_243 : bool = x_243_phi;
+      if (x_243) {
+        let x_246 : i32 = d;
+        d = (x_246 - 1);
+        let x_249 : i32 = p.x;
+        let x_251 : i32 = p.y;
+        map[(x_249 + (x_251 * 16))] = 1;
+        let x_256 : i32 = p.x;
+        let x_259 : i32 = p.y;
+        map[((x_256 - 1) + (x_259 * 16))] = 1;
+        let x_264 : i32 = p.x;
+        let x_267 : i32 = p.y;
+        map[((x_264 - 2) + (x_267 * 16))] = 1;
+        let x_272 : i32 = p.x;
+        p.x = (x_272 - 2);
+      }
+      let x_275 : i32 = d;
+      let x_276 : bool = (x_275 >= 0);
+      x_282_phi = x_276;
+      if (x_276) {
+        let x_280 : i32 = p.y;
+        x_281 = (x_280 > 0);
+        x_282_phi = x_281;
+      }
+      let x_282 : bool = x_282_phi;
+      if (x_282) {
+        x_288 = p.x;
+        x_290_phi = x_288;
+      } else {
+        x_289 = 0;
+        x_290_phi = x_289;
+      }
+      let x_290 : i32 = x_290_phi;
+      if (x_282) {
+        x_295 = p.y;
+        x_297_phi = x_295;
+      } else {
+        x_296 = 0;
+        x_297_phi = x_296;
+      }
+      let x_297 : i32 = x_297_phi;
+      let x_299 : i32 = ((x_297 - 2) * 16);
+      if (x_282) {
+        x_303 = map;
+        x_305_phi = x_303;
+      } else {
+        x_304 = array<i32, 256>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+        x_305_phi = x_304;
+      }
+      let x_305 : array<i32, 256> = x_305_phi;
+      if (x_282) {
+        map = array<i32, 256>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+      }
+      if (x_282) {
+        map = x_305;
+      }
+      if (x_282) {
+        x_315 = map[(x_290 + x_299)];
+        x_317_phi = x_315;
+      } else {
+        x_316 = 0;
+        x_317_phi = x_316;
+      }
+      let x_317 : i32 = x_317_phi;
+      let x_318 : bool = (x_317 == 0);
+      if (select(x_282, x_318, x_282)) {
+        let x_323 : i32 = d;
+        d = (x_323 - 1);
+        let x_326 : i32 = p.x;
+        let x_328 : i32 = p.y;
+        map[(x_326 + (x_328 * 16))] = 1;
+        let x_333 : i32 = p.x;
+        let x_335 : i32 = p.y;
+        map[(x_333 + ((x_335 - 1) * 16))] = 1;
+        let x_341 : i32 = p.x;
+        let x_343 : i32 = p.y;
+        let x_345 : array<i32, 256> = map;
+        map = array<i32, 256>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+        map = x_345;
+        map[(x_341 + ((x_343 - 2) * 16))] = 1;
+        let x_350 : i32 = p.y;
+        p.y = (x_350 - 2);
+      }
+      let x_353 : i32 = d;
+      let x_354 : bool = (x_353 >= 0);
+      x_360_phi = x_354;
+      if (x_354) {
+        let x_358 : i32 = p.x;
+        x_359 = (x_358 < 14);
+        x_360_phi = x_359;
+      }
+      let x_360 : bool = x_360_phi;
+      x_373_phi = x_360;
+      if (x_360) {
+        let x_364 : i32 = p.x;
+        let x_367 : i32 = p.y;
+        let x_371 : i32 = map[((x_364 + 2) + (x_367 * 16))];
+        x_372 = (x_371 == 0);
+        x_373_phi = x_372;
+      }
+      let x_373 : bool = x_373_phi;
+      if (x_373) {
+        let x_376 : i32 = d;
+        d = (x_376 - 1);
+        let x_379 : i32 = p.x;
+        let x_381 : i32 = p.y;
+        map[(x_379 + (x_381 * 16))] = 1;
+        let x_386 : i32 = p.x;
+        let x_389 : i32 = p.y;
+        map[((x_386 + 1) + (x_389 * 16))] = 1;
+        let x_394 : i32 = p.x;
+        let x_397 : i32 = p.y;
+        map[((x_394 + 2) + (x_397 * 16))] = 1;
+        let x_402 : i32 = p.x;
+        p.x = (x_402 + 2);
+      }
+      let x_405 : i32 = d;
+      let x_406 : bool = (x_405 >= 0);
+      x_412_phi = x_406;
+      if (x_406) {
+        let x_410 : i32 = p.y;
+        x_411 = (x_410 < 14);
+        x_412_phi = x_411;
+      }
+      let x_412 : bool = x_412_phi;
+      x_425_phi = x_412;
+      if (x_412) {
+        let x_416 : i32 = p.x;
+        let x_418 : i32 = p.y;
+        let x_423 : i32 = map[(x_416 + ((x_418 + 2) * 16))];
+        x_424 = (x_423 == 0);
+        x_425_phi = x_424;
+      }
+      let x_425 : bool = x_425_phi;
+      if (x_425) {
+        let x_428 : i32 = d;
+        d = (x_428 - 1);
+        let x_431 : i32 = p.x;
+        let x_433 : i32 = p.y;
+        map[(x_431 + (x_433 * 16))] = 1;
+        let x_438 : i32 = p.x;
+        let x_440 : i32 = p.y;
+        map[(x_438 + ((x_440 + 1) * 16))] = 1;
+        let x_446 : i32 = p.x;
+        let x_448 : i32 = p.y;
+        map[(x_446 + ((x_448 + 2) * 16))] = 1;
+        let x_454 : i32 = p.y;
+        p.y = (x_454 + 2);
+      }
+    }
+    let x_458 : i32 = ipos.y;
+    let x_461 : i32 = ipos.x;
+    let x_464 : i32 = map[((x_458 * 16) + x_461)];
+    if ((x_464 == 1)) {
+      x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+      return;
+    }
+
+    continuing {
+      let x_468 : bool = canwalk;
+      if (x_468) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/1.wgsl
new file mode 100644
index 0000000..7636426
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/1.wgsl
@@ -0,0 +1,392 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> map : array<i32, 256>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var pos : vec2<f32>;
+  var ipos : vec2<i32>;
+  var i : i32;
+  var p : vec2<i32>;
+  var canwalk : bool;
+  var v : i32;
+  var directions : i32;
+  var j : i32;
+  var d : i32;
+  let x_59 : vec4<f32> = gl_FragCoord;
+  let x_62 : vec2<f32> = x_7.resolution;
+  pos = (vec2<f32>(x_59.x, x_59.y) / x_62);
+  let x_65 : f32 = pos.x;
+  let x_69 : f32 = pos.y;
+  ipos = vec2<i32>(i32((x_65 * 16.0)), i32((x_69 * 16.0)));
+  i = 0;
+  loop {
+    let x_77 : i32 = i;
+    if ((x_77 < 256)) {
+    } else {
+      break;
+    }
+    let x_80 : i32 = i;
+    map[x_80] = 0;
+
+    continuing {
+      let x_82 : i32 = i;
+      i = (x_82 + 1);
+    }
+  }
+  p = vec2<i32>(0, 0);
+  canwalk = true;
+  v = 0;
+  loop {
+    var x_104 : bool;
+    var x_124 : bool;
+    var x_144 : bool;
+    var x_164 : bool;
+    var x_105_phi : bool;
+    var x_125_phi : bool;
+    var x_145_phi : bool;
+    var x_165_phi : bool;
+    let x_88 : i32 = v;
+    v = (x_88 + 1);
+    directions = 0;
+    let x_91 : i32 = p.x;
+    let x_92 : bool = (x_91 > 0);
+    x_105_phi = x_92;
+    if (x_92) {
+      let x_96 : i32 = p.x;
+      let x_99 : i32 = p.y;
+      let x_103 : i32 = map[((x_96 - 2) + (x_99 * 16))];
+      x_104 = (x_103 == 0);
+      x_105_phi = x_104;
+    }
+    let x_105 : bool = x_105_phi;
+    if (x_105) {
+      let x_108 : i32 = directions;
+      directions = (x_108 + 1);
+    }
+    let x_111 : i32 = p.y;
+    let x_112 : bool = (x_111 > 0);
+    x_125_phi = x_112;
+    if (x_112) {
+      let x_116 : i32 = p.x;
+      let x_118 : i32 = p.y;
+      let x_123 : i32 = map[(x_116 + ((x_118 - 2) * 16))];
+      x_124 = (x_123 == 0);
+      x_125_phi = x_124;
+    }
+    let x_125 : bool = x_125_phi;
+    if (x_125) {
+      let x_128 : i32 = directions;
+      directions = (x_128 + 1);
+    }
+    let x_131 : i32 = p.x;
+    let x_132 : bool = (x_131 < 14);
+    x_145_phi = x_132;
+    if (x_132) {
+      let x_136 : i32 = p.x;
+      let x_139 : i32 = p.y;
+      let x_143 : i32 = map[((x_136 + 2) + (x_139 * 16))];
+      x_144 = (x_143 == 0);
+      x_145_phi = x_144;
+    }
+    let x_145 : bool = x_145_phi;
+    if (x_145) {
+      let x_148 : i32 = directions;
+      directions = (x_148 + 1);
+    }
+    let x_151 : i32 = p.y;
+    let x_152 : bool = (x_151 < 14);
+    x_165_phi = x_152;
+    if (x_152) {
+      let x_156 : i32 = p.x;
+      let x_158 : i32 = p.y;
+      let x_163 : i32 = map[(x_156 + ((x_158 + 2) * 16))];
+      x_164 = (x_163 == 0);
+      x_165_phi = x_164;
+    }
+    let x_165 : bool = x_165_phi;
+    if (x_165) {
+      let x_168 : i32 = directions;
+      directions = (x_168 + 1);
+    }
+    var x_229 : bool;
+    var x_242 : bool;
+    var x_281 : bool;
+    var x_288 : i32;
+    var x_289 : i32;
+    var x_295 : i32;
+    var x_296 : i32;
+    var x_303 : array<i32, 256>;
+    var x_304 : array<i32, 256>;
+    var x_315 : i32;
+    var x_316 : i32;
+    var x_359 : bool;
+    var x_372 : bool;
+    var x_411 : bool;
+    var x_424 : bool;
+    var x_230_phi : bool;
+    var x_243_phi : bool;
+    var x_282_phi : bool;
+    var x_290_phi : i32;
+    var x_297_phi : i32;
+    var x_305_phi : array<i32, 256>;
+    var x_317_phi : i32;
+    var x_360_phi : bool;
+    var x_373_phi : bool;
+    var x_412_phi : bool;
+    var x_425_phi : bool;
+    let x_170 : i32 = directions;
+    if ((x_170 == 0)) {
+      canwalk = false;
+      i = 0;
+      loop {
+        let x_179 : i32 = i;
+        if ((x_179 < 8)) {
+        } else {
+          break;
+        }
+        j = 0;
+        loop {
+          let x_186 : i32 = j;
+          if ((x_186 < 8)) {
+          } else {
+            break;
+          }
+          let x_189 : i32 = j;
+          let x_191 : i32 = i;
+          let x_196 : i32 = map[((x_189 * 2) + ((x_191 * 2) * 16))];
+          if ((x_196 == 0)) {
+            let x_200 : i32 = j;
+            p.x = (x_200 * 2);
+            let x_203 : i32 = i;
+            p.y = (x_203 * 2);
+            canwalk = true;
+          }
+
+          continuing {
+            let x_206 : i32 = j;
+            j = (x_206 + 1);
+          }
+        }
+
+        continuing {
+          let x_208 : i32 = i;
+          i = (x_208 + 1);
+        }
+      }
+      let x_211 : i32 = p.x;
+      let x_213 : i32 = p.y;
+      map[(x_211 + (x_213 * 16))] = 1;
+    } else {
+      let x_217 : i32 = v;
+      let x_218 : i32 = directions;
+      d = (x_217 % x_218);
+      let x_220 : i32 = directions;
+      let x_221 : i32 = v;
+      v = (x_221 + x_220);
+      let x_223 : i32 = d;
+      let x_224 : bool = (x_223 >= 0);
+      x_230_phi = x_224;
+      if (x_224) {
+        let x_228 : i32 = p.x;
+        x_229 = (x_228 > 0);
+        x_230_phi = x_229;
+      }
+      let x_230 : bool = x_230_phi;
+      x_243_phi = x_230;
+      if (x_230) {
+        let x_234 : i32 = p.x;
+        let x_237 : i32 = p.y;
+        let x_241 : i32 = map[((x_234 - 2) + (x_237 * 16))];
+        x_242 = (x_241 == 0);
+        x_243_phi = x_242;
+      }
+      let x_243 : bool = x_243_phi;
+      if (x_243) {
+        let x_246 : i32 = d;
+        d = (x_246 - 1);
+        let x_249 : i32 = p.x;
+        let x_251 : i32 = p.y;
+        map[(x_249 + (x_251 * 16))] = 1;
+        let x_256 : i32 = p.x;
+        let x_259 : i32 = p.y;
+        map[((x_256 - 1) + (x_259 * 16))] = 1;
+        let x_264 : i32 = p.x;
+        let x_267 : i32 = p.y;
+        map[((x_264 - 2) + (x_267 * 16))] = 1;
+        let x_272 : i32 = p.x;
+        p.x = (x_272 - 2);
+      }
+      let x_275 : i32 = d;
+      let x_276 : bool = (x_275 >= 0);
+      x_282_phi = x_276;
+      if (x_276) {
+        let x_280 : i32 = p.y;
+        x_281 = (x_280 > 0);
+        x_282_phi = x_281;
+      }
+      let x_282 : bool = x_282_phi;
+      if (x_282) {
+        x_288 = p.x;
+        x_290_phi = x_288;
+      } else {
+        x_289 = 0;
+        x_290_phi = x_289;
+      }
+      let x_290 : i32 = x_290_phi;
+      if (x_282) {
+        x_295 = p.y;
+        x_297_phi = x_295;
+      } else {
+        x_296 = 0;
+        x_297_phi = x_296;
+      }
+      let x_297 : i32 = x_297_phi;
+      let x_299 : i32 = ((x_297 - 2) * 16);
+      if (x_282) {
+        x_303 = map;
+        x_305_phi = x_303;
+      } else {
+        x_304 = array<i32, 256>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+        x_305_phi = x_304;
+      }
+      let x_305 : array<i32, 256> = x_305_phi;
+      if (x_282) {
+        map = array<i32, 256>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+      }
+      if (x_282) {
+        map = x_305;
+      }
+      if (x_282) {
+        x_315 = map[(x_290 + x_299)];
+        x_317_phi = x_315;
+      } else {
+        x_316 = 0;
+        x_317_phi = x_316;
+      }
+      let x_317 : i32 = x_317_phi;
+      let x_318 : bool = (x_317 == 0);
+      if (select(x_282, x_318, x_282)) {
+        let x_323 : i32 = d;
+        d = (x_323 - 1);
+        let x_326 : i32 = p.x;
+        let x_328 : i32 = p.y;
+        map[(x_326 + (x_328 * 16))] = 1;
+        let x_333 : i32 = p.x;
+        let x_335 : i32 = p.y;
+        map[(x_333 + ((x_335 - 1) * 16))] = 1;
+        let x_341 : i32 = p.x;
+        let x_343 : i32 = p.y;
+        let x_345 : array<i32, 256> = map;
+        map = array<i32, 256>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+        map = x_345;
+        map[(x_341 + ((x_343 - 2) * 16))] = 1;
+        let x_350 : i32 = p.y;
+        p.y = (x_350 - 2);
+      }
+      let x_353 : i32 = d;
+      let x_354 : bool = (x_353 >= 0);
+      x_360_phi = x_354;
+      if (x_354) {
+        let x_358 : i32 = p.x;
+        x_359 = (x_358 < 14);
+        x_360_phi = x_359;
+      }
+      let x_360 : bool = x_360_phi;
+      x_373_phi = x_360;
+      if (x_360) {
+        let x_364 : i32 = p.x;
+        let x_367 : i32 = p.y;
+        let x_371 : i32 = map[((x_364 + 2) + (x_367 * 16))];
+        x_372 = (x_371 == 0);
+        x_373_phi = x_372;
+      }
+      let x_373 : bool = x_373_phi;
+      if (x_373) {
+        let x_376 : i32 = d;
+        d = (x_376 - 1);
+        let x_379 : i32 = p.x;
+        let x_381 : i32 = p.y;
+        map[(x_379 + (x_381 * 16))] = 1;
+        let x_386 : i32 = p.x;
+        let x_389 : i32 = p.y;
+        map[((x_386 + 1) + (x_389 * 16))] = 1;
+        let x_394 : i32 = p.x;
+        let x_397 : i32 = p.y;
+        map[((x_394 + 2) + (x_397 * 16))] = 1;
+        let x_402 : i32 = p.x;
+        p.x = (x_402 + 2);
+      }
+      let x_405 : i32 = d;
+      let x_406 : bool = (x_405 >= 0);
+      x_412_phi = x_406;
+      if (x_406) {
+        let x_410 : i32 = p.y;
+        x_411 = (x_410 < 14);
+        x_412_phi = x_411;
+      }
+      let x_412 : bool = x_412_phi;
+      x_425_phi = x_412;
+      if (x_412) {
+        let x_416 : i32 = p.x;
+        let x_418 : i32 = p.y;
+        let x_423 : i32 = map[(x_416 + ((x_418 + 2) * 16))];
+        x_424 = (x_423 == 0);
+        x_425_phi = x_424;
+      }
+      let x_425 : bool = x_425_phi;
+      if (x_425) {
+        let x_428 : i32 = d;
+        d = (x_428 - 1);
+        let x_431 : i32 = p.x;
+        let x_433 : i32 = p.y;
+        map[(x_431 + (x_433 * 16))] = 1;
+        let x_438 : i32 = p.x;
+        let x_440 : i32 = p.y;
+        map[(x_438 + ((x_440 + 1) * 16))] = 1;
+        let x_446 : i32 = p.x;
+        let x_448 : i32 = p.y;
+        map[(x_446 + ((x_448 + 2) * 16))] = 1;
+        let x_454 : i32 = p.y;
+        p.y = (x_454 + 2);
+      }
+    }
+    let x_458 : i32 = ipos.y;
+    let x_461 : i32 = ipos.x;
+    let x_464 : i32 = map[((x_458 * 16) + x_461)];
+    if ((x_464 == 1)) {
+      x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+      return;
+    }
+
+    continuing {
+      let x_468 : bool = canwalk;
+      if (x_468) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..0505c28
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/1.wgsl.expected.hlsl
@@ -0,0 +1,338 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[1];
+};
+static int map[256] = (int[256])0;
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2 pos = float2(0.0f, 0.0f);
+  int2 ipos = int2(0, 0);
+  int i = 0;
+  int2 p = int2(0, 0);
+  bool canwalk = false;
+  int v = 0;
+  int directions = 0;
+  int j = 0;
+  int d = 0;
+  const float4 x_59 = gl_FragCoord;
+  const float2 x_62 = asfloat(x_7[0].xy);
+  pos = (float2(x_59.x, x_59.y) / x_62);
+  const float x_65 = pos.x;
+  const float x_69 = pos.y;
+  ipos = int2(int((x_65 * 16.0f)), int((x_69 * 16.0f)));
+  i = 0;
+  {
+    for(; (i < 256); i = (i + 1)) {
+      map[i] = 0;
+    }
+  }
+  p = int2(0, 0);
+  canwalk = true;
+  v = 0;
+  while (true) {
+    bool x_104 = false;
+    bool x_124 = false;
+    bool x_144 = false;
+    bool x_164 = false;
+    bool x_105_phi = false;
+    bool x_125_phi = false;
+    bool x_145_phi = false;
+    bool x_165_phi = false;
+    v = (v + 1);
+    directions = 0;
+    const int x_91 = p.x;
+    const bool x_92 = (x_91 > 0);
+    x_105_phi = x_92;
+    if (x_92) {
+      const int x_96 = p.x;
+      const int x_99 = p.y;
+      const int x_103 = map[((x_96 - 2) + (x_99 * 16))];
+      x_104 = (x_103 == 0);
+      x_105_phi = x_104;
+    }
+    if (x_105_phi) {
+      directions = (directions + 1);
+    }
+    const int x_111 = p.y;
+    const bool x_112 = (x_111 > 0);
+    x_125_phi = x_112;
+    if (x_112) {
+      const int x_116 = p.x;
+      const int x_118 = p.y;
+      const int x_123 = map[(x_116 + ((x_118 - 2) * 16))];
+      x_124 = (x_123 == 0);
+      x_125_phi = x_124;
+    }
+    if (x_125_phi) {
+      directions = (directions + 1);
+    }
+    const int x_131 = p.x;
+    const bool x_132 = (x_131 < 14);
+    x_145_phi = x_132;
+    if (x_132) {
+      const int x_136 = p.x;
+      const int x_139 = p.y;
+      const int x_143 = map[((x_136 + 2) + (x_139 * 16))];
+      x_144 = (x_143 == 0);
+      x_145_phi = x_144;
+    }
+    if (x_145_phi) {
+      directions = (directions + 1);
+    }
+    const int x_151 = p.y;
+    const bool x_152 = (x_151 < 14);
+    x_165_phi = x_152;
+    if (x_152) {
+      const int x_156 = p.x;
+      const int x_158 = p.y;
+      const int x_163 = map[(x_156 + ((x_158 + 2) * 16))];
+      x_164 = (x_163 == 0);
+      x_165_phi = x_164;
+    }
+    if (x_165_phi) {
+      directions = (directions + 1);
+    }
+    bool x_229 = false;
+    bool x_242 = false;
+    bool x_281 = false;
+    int x_288 = 0;
+    int x_289 = 0;
+    int x_295 = 0;
+    int x_296 = 0;
+    int x_303[256] = (int[256])0;
+    int x_304[256] = (int[256])0;
+    int x_315 = 0;
+    int x_316 = 0;
+    bool x_359 = false;
+    bool x_372 = false;
+    bool x_411 = false;
+    bool x_424 = false;
+    bool x_230_phi = false;
+    bool x_243_phi = false;
+    bool x_282_phi = false;
+    int x_290_phi = 0;
+    int x_297_phi = 0;
+    int x_305_phi[256] = (int[256])0;
+    int x_317_phi = 0;
+    bool x_360_phi = false;
+    bool x_373_phi = false;
+    bool x_412_phi = false;
+    bool x_425_phi = false;
+    if ((directions == 0)) {
+      canwalk = false;
+      i = 0;
+      {
+        for(; (i < 8); i = (i + 1)) {
+          j = 0;
+          {
+            for(; (j < 8); j = (j + 1)) {
+              const int x_196 = map[((j * 2) + ((i * 2) * 16))];
+              if ((x_196 == 0)) {
+                p.x = (j * 2);
+                p.y = (i * 2);
+                canwalk = true;
+              }
+            }
+          }
+        }
+      }
+      const int x_211 = p.x;
+      const int x_213 = p.y;
+      map[(x_211 + (x_213 * 16))] = 1;
+    } else {
+      d = (v % directions);
+      v = (v + directions);
+      const bool x_224 = (d >= 0);
+      x_230_phi = x_224;
+      if (x_224) {
+        const int x_228 = p.x;
+        x_229 = (x_228 > 0);
+        x_230_phi = x_229;
+      }
+      const bool x_230 = x_230_phi;
+      x_243_phi = x_230;
+      if (x_230) {
+        const int x_234 = p.x;
+        const int x_237 = p.y;
+        const int x_241 = map[((x_234 - 2) + (x_237 * 16))];
+        x_242 = (x_241 == 0);
+        x_243_phi = x_242;
+      }
+      if (x_243_phi) {
+        d = (d - 1);
+        const int x_249 = p.x;
+        const int x_251 = p.y;
+        map[(x_249 + (x_251 * 16))] = 1;
+        const int x_256 = p.x;
+        const int x_259 = p.y;
+        map[((x_256 - 1) + (x_259 * 16))] = 1;
+        const int x_264 = p.x;
+        const int x_267 = p.y;
+        map[((x_264 - 2) + (x_267 * 16))] = 1;
+        const int x_272 = p.x;
+        p.x = (x_272 - 2);
+      }
+      const bool x_276 = (d >= 0);
+      x_282_phi = x_276;
+      if (x_276) {
+        const int x_280 = p.y;
+        x_281 = (x_280 > 0);
+        x_282_phi = x_281;
+      }
+      const bool x_282 = x_282_phi;
+      if (x_282) {
+        x_288 = p.x;
+        x_290_phi = x_288;
+      } else {
+        x_289 = 0;
+        x_290_phi = x_289;
+      }
+      const int x_290 = x_290_phi;
+      if (x_282) {
+        x_295 = p.y;
+        x_297_phi = x_295;
+      } else {
+        x_296 = 0;
+        x_297_phi = x_296;
+      }
+      const int x_299 = ((x_297_phi - 2) * 16);
+      if (x_282) {
+        x_303 = map;
+        x_305_phi = x_303;
+      } else {
+        const int tint_symbol_5[256] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+        x_304 = tint_symbol_5;
+        x_305_phi = x_304;
+      }
+      const int x_305[256] = x_305_phi;
+      if (x_282) {
+        const int tint_symbol_6[256] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+        map = tint_symbol_6;
+      }
+      if (x_282) {
+        map = x_305;
+      }
+      if (x_282) {
+        x_315 = map[(x_290 + x_299)];
+        x_317_phi = x_315;
+      } else {
+        x_316 = 0;
+        x_317_phi = x_316;
+      }
+      const bool x_318 = (x_317_phi == 0);
+      if ((x_282 ? x_318 : x_282)) {
+        d = (d - 1);
+        const int x_326 = p.x;
+        const int x_328 = p.y;
+        map[(x_326 + (x_328 * 16))] = 1;
+        const int x_333 = p.x;
+        const int x_335 = p.y;
+        map[(x_333 + ((x_335 - 1) * 16))] = 1;
+        const int x_341 = p.x;
+        const int x_343 = p.y;
+        const int x_345[256] = map;
+        const int tint_symbol_7[256] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+        map = tint_symbol_7;
+        map = x_345;
+        map[(x_341 + ((x_343 - 2) * 16))] = 1;
+        const int x_350 = p.y;
+        p.y = (x_350 - 2);
+      }
+      const bool x_354 = (d >= 0);
+      x_360_phi = x_354;
+      if (x_354) {
+        const int x_358 = p.x;
+        x_359 = (x_358 < 14);
+        x_360_phi = x_359;
+      }
+      const bool x_360 = x_360_phi;
+      x_373_phi = x_360;
+      if (x_360) {
+        const int x_364 = p.x;
+        const int x_367 = p.y;
+        const int x_371 = map[((x_364 + 2) + (x_367 * 16))];
+        x_372 = (x_371 == 0);
+        x_373_phi = x_372;
+      }
+      if (x_373_phi) {
+        d = (d - 1);
+        const int x_379 = p.x;
+        const int x_381 = p.y;
+        map[(x_379 + (x_381 * 16))] = 1;
+        const int x_386 = p.x;
+        const int x_389 = p.y;
+        map[((x_386 + 1) + (x_389 * 16))] = 1;
+        const int x_394 = p.x;
+        const int x_397 = p.y;
+        map[((x_394 + 2) + (x_397 * 16))] = 1;
+        const int x_402 = p.x;
+        p.x = (x_402 + 2);
+      }
+      const bool x_406 = (d >= 0);
+      x_412_phi = x_406;
+      if (x_406) {
+        const int x_410 = p.y;
+        x_411 = (x_410 < 14);
+        x_412_phi = x_411;
+      }
+      const bool x_412 = x_412_phi;
+      x_425_phi = x_412;
+      if (x_412) {
+        const int x_416 = p.x;
+        const int x_418 = p.y;
+        const int x_423 = map[(x_416 + ((x_418 + 2) * 16))];
+        x_424 = (x_423 == 0);
+        x_425_phi = x_424;
+      }
+      if (x_425_phi) {
+        d = (d - 1);
+        const int x_431 = p.x;
+        const int x_433 = p.y;
+        map[(x_431 + (x_433 * 16))] = 1;
+        const int x_438 = p.x;
+        const int x_440 = p.y;
+        map[(x_438 + ((x_440 + 1) * 16))] = 1;
+        const int x_446 = p.x;
+        const int x_448 = p.y;
+        map[(x_446 + ((x_448 + 2) * 16))] = 1;
+        const int x_454 = p.y;
+        p.y = (x_454 + 2);
+      }
+    }
+    const int x_458 = ipos.y;
+    const int x_461 = ipos.x;
+    const int x_464 = map[((x_458 * 16) + x_461)];
+    if ((x_464 == 1)) {
+      x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+      return;
+    }
+    {
+      if (canwalk) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_GLF_color = float4(0.0f, 0.0f, 0.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_8 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_8;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/1.wgsl.expected.msl
new file mode 100644
index 0000000..794863a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/1.wgsl.expected.msl
@@ -0,0 +1,394 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  int arr[256];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_8, thread tint_array_wrapper* const tint_symbol_9, thread float4* const tint_symbol_10) {
+  float2 pos = 0.0f;
+  int2 ipos = 0;
+  int i = 0;
+  int2 p = 0;
+  bool canwalk = false;
+  int v = 0;
+  int directions = 0;
+  int j = 0;
+  int d = 0;
+  float4 const x_59 = *(tint_symbol_8);
+  float2 const x_62 = x_7.resolution;
+  pos = (float2(x_59.x, x_59.y) / x_62);
+  float const x_65 = pos.x;
+  float const x_69 = pos.y;
+  ipos = int2(int((x_65 * 16.0f)), int((x_69 * 16.0f)));
+  i = 0;
+  while (true) {
+    int const x_77 = i;
+    if ((x_77 < 256)) {
+    } else {
+      break;
+    }
+    int const x_80 = i;
+    (*(tint_symbol_9)).arr[x_80] = 0;
+    {
+      int const x_82 = i;
+      i = (x_82 + 1);
+    }
+  }
+  p = int2(0, 0);
+  canwalk = true;
+  v = 0;
+  while (true) {
+    bool x_104 = false;
+    bool x_124 = false;
+    bool x_144 = false;
+    bool x_164 = false;
+    bool x_105_phi = false;
+    bool x_125_phi = false;
+    bool x_145_phi = false;
+    bool x_165_phi = false;
+    int const x_88 = v;
+    v = (x_88 + 1);
+    directions = 0;
+    int const x_91 = p.x;
+    bool const x_92 = (x_91 > 0);
+    x_105_phi = x_92;
+    if (x_92) {
+      int const x_96 = p.x;
+      int const x_99 = p.y;
+      int const x_103 = (*(tint_symbol_9)).arr[((x_96 - 2) + (x_99 * 16))];
+      x_104 = (x_103 == 0);
+      x_105_phi = x_104;
+    }
+    bool const x_105 = x_105_phi;
+    if (x_105) {
+      int const x_108 = directions;
+      directions = (x_108 + 1);
+    }
+    int const x_111 = p.y;
+    bool const x_112 = (x_111 > 0);
+    x_125_phi = x_112;
+    if (x_112) {
+      int const x_116 = p.x;
+      int const x_118 = p.y;
+      int const x_123 = (*(tint_symbol_9)).arr[(x_116 + ((x_118 - 2) * 16))];
+      x_124 = (x_123 == 0);
+      x_125_phi = x_124;
+    }
+    bool const x_125 = x_125_phi;
+    if (x_125) {
+      int const x_128 = directions;
+      directions = (x_128 + 1);
+    }
+    int const x_131 = p.x;
+    bool const x_132 = (x_131 < 14);
+    x_145_phi = x_132;
+    if (x_132) {
+      int const x_136 = p.x;
+      int const x_139 = p.y;
+      int const x_143 = (*(tint_symbol_9)).arr[((x_136 + 2) + (x_139 * 16))];
+      x_144 = (x_143 == 0);
+      x_145_phi = x_144;
+    }
+    bool const x_145 = x_145_phi;
+    if (x_145) {
+      int const x_148 = directions;
+      directions = (x_148 + 1);
+    }
+    int const x_151 = p.y;
+    bool const x_152 = (x_151 < 14);
+    x_165_phi = x_152;
+    if (x_152) {
+      int const x_156 = p.x;
+      int const x_158 = p.y;
+      int const x_163 = (*(tint_symbol_9)).arr[(x_156 + ((x_158 + 2) * 16))];
+      x_164 = (x_163 == 0);
+      x_165_phi = x_164;
+    }
+    bool const x_165 = x_165_phi;
+    if (x_165) {
+      int const x_168 = directions;
+      directions = (x_168 + 1);
+    }
+    bool x_229 = false;
+    bool x_242 = false;
+    bool x_281 = false;
+    int x_288 = 0;
+    int x_289 = 0;
+    int x_295 = 0;
+    int x_296 = 0;
+    tint_array_wrapper x_303 = {};
+    tint_array_wrapper x_304 = {};
+    int x_315 = 0;
+    int x_316 = 0;
+    bool x_359 = false;
+    bool x_372 = false;
+    bool x_411 = false;
+    bool x_424 = false;
+    bool x_230_phi = false;
+    bool x_243_phi = false;
+    bool x_282_phi = false;
+    int x_290_phi = 0;
+    int x_297_phi = 0;
+    tint_array_wrapper x_305_phi = {};
+    int x_317_phi = 0;
+    bool x_360_phi = false;
+    bool x_373_phi = false;
+    bool x_412_phi = false;
+    bool x_425_phi = false;
+    int const x_170 = directions;
+    if ((x_170 == 0)) {
+      canwalk = false;
+      i = 0;
+      while (true) {
+        int const x_179 = i;
+        if ((x_179 < 8)) {
+        } else {
+          break;
+        }
+        j = 0;
+        while (true) {
+          int const x_186 = j;
+          if ((x_186 < 8)) {
+          } else {
+            break;
+          }
+          int const x_189 = j;
+          int const x_191 = i;
+          int const x_196 = (*(tint_symbol_9)).arr[((x_189 * 2) + ((x_191 * 2) * 16))];
+          if ((x_196 == 0)) {
+            int const x_200 = j;
+            p.x = (x_200 * 2);
+            int const x_203 = i;
+            p.y = (x_203 * 2);
+            canwalk = true;
+          }
+          {
+            int const x_206 = j;
+            j = (x_206 + 1);
+          }
+        }
+        {
+          int const x_208 = i;
+          i = (x_208 + 1);
+        }
+      }
+      int const x_211 = p.x;
+      int const x_213 = p.y;
+      (*(tint_symbol_9)).arr[(x_211 + (x_213 * 16))] = 1;
+    } else {
+      int const x_217 = v;
+      int const x_218 = directions;
+      d = (x_217 % x_218);
+      int const x_220 = directions;
+      int const x_221 = v;
+      v = (x_221 + x_220);
+      int const x_223 = d;
+      bool const x_224 = (x_223 >= 0);
+      x_230_phi = x_224;
+      if (x_224) {
+        int const x_228 = p.x;
+        x_229 = (x_228 > 0);
+        x_230_phi = x_229;
+      }
+      bool const x_230 = x_230_phi;
+      x_243_phi = x_230;
+      if (x_230) {
+        int const x_234 = p.x;
+        int const x_237 = p.y;
+        int const x_241 = (*(tint_symbol_9)).arr[((x_234 - 2) + (x_237 * 16))];
+        x_242 = (x_241 == 0);
+        x_243_phi = x_242;
+      }
+      bool const x_243 = x_243_phi;
+      if (x_243) {
+        int const x_246 = d;
+        d = (x_246 - 1);
+        int const x_249 = p.x;
+        int const x_251 = p.y;
+        (*(tint_symbol_9)).arr[(x_249 + (x_251 * 16))] = 1;
+        int const x_256 = p.x;
+        int const x_259 = p.y;
+        (*(tint_symbol_9)).arr[((x_256 - 1) + (x_259 * 16))] = 1;
+        int const x_264 = p.x;
+        int const x_267 = p.y;
+        (*(tint_symbol_9)).arr[((x_264 - 2) + (x_267 * 16))] = 1;
+        int const x_272 = p.x;
+        p.x = (x_272 - 2);
+      }
+      int const x_275 = d;
+      bool const x_276 = (x_275 >= 0);
+      x_282_phi = x_276;
+      if (x_276) {
+        int const x_280 = p.y;
+        x_281 = (x_280 > 0);
+        x_282_phi = x_281;
+      }
+      bool const x_282 = x_282_phi;
+      if (x_282) {
+        x_288 = p.x;
+        x_290_phi = x_288;
+      } else {
+        x_289 = 0;
+        x_290_phi = x_289;
+      }
+      int const x_290 = x_290_phi;
+      if (x_282) {
+        x_295 = p.y;
+        x_297_phi = x_295;
+      } else {
+        x_296 = 0;
+        x_297_phi = x_296;
+      }
+      int const x_297 = x_297_phi;
+      int const x_299 = ((x_297 - 2) * 16);
+      if (x_282) {
+        x_303 = *(tint_symbol_9);
+        x_305_phi = x_303;
+      } else {
+        tint_array_wrapper const tint_symbol_4 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+        x_304 = tint_symbol_4;
+        x_305_phi = x_304;
+      }
+      tint_array_wrapper const x_305 = x_305_phi;
+      if (x_282) {
+        tint_array_wrapper const tint_symbol_5 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+        *(tint_symbol_9) = tint_symbol_5;
+      }
+      if (x_282) {
+        *(tint_symbol_9) = x_305;
+      }
+      if (x_282) {
+        x_315 = (*(tint_symbol_9)).arr[(x_290 + x_299)];
+        x_317_phi = x_315;
+      } else {
+        x_316 = 0;
+        x_317_phi = x_316;
+      }
+      int const x_317 = x_317_phi;
+      bool const x_318 = (x_317 == 0);
+      if (select(x_282, x_318, x_282)) {
+        int const x_323 = d;
+        d = (x_323 - 1);
+        int const x_326 = p.x;
+        int const x_328 = p.y;
+        (*(tint_symbol_9)).arr[(x_326 + (x_328 * 16))] = 1;
+        int const x_333 = p.x;
+        int const x_335 = p.y;
+        (*(tint_symbol_9)).arr[(x_333 + ((x_335 - 1) * 16))] = 1;
+        int const x_341 = p.x;
+        int const x_343 = p.y;
+        tint_array_wrapper const x_345 = *(tint_symbol_9);
+        tint_array_wrapper const tint_symbol_6 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+        *(tint_symbol_9) = tint_symbol_6;
+        *(tint_symbol_9) = x_345;
+        (*(tint_symbol_9)).arr[(x_341 + ((x_343 - 2) * 16))] = 1;
+        int const x_350 = p.y;
+        p.y = (x_350 - 2);
+      }
+      int const x_353 = d;
+      bool const x_354 = (x_353 >= 0);
+      x_360_phi = x_354;
+      if (x_354) {
+        int const x_358 = p.x;
+        x_359 = (x_358 < 14);
+        x_360_phi = x_359;
+      }
+      bool const x_360 = x_360_phi;
+      x_373_phi = x_360;
+      if (x_360) {
+        int const x_364 = p.x;
+        int const x_367 = p.y;
+        int const x_371 = (*(tint_symbol_9)).arr[((x_364 + 2) + (x_367 * 16))];
+        x_372 = (x_371 == 0);
+        x_373_phi = x_372;
+      }
+      bool const x_373 = x_373_phi;
+      if (x_373) {
+        int const x_376 = d;
+        d = (x_376 - 1);
+        int const x_379 = p.x;
+        int const x_381 = p.y;
+        (*(tint_symbol_9)).arr[(x_379 + (x_381 * 16))] = 1;
+        int const x_386 = p.x;
+        int const x_389 = p.y;
+        (*(tint_symbol_9)).arr[((x_386 + 1) + (x_389 * 16))] = 1;
+        int const x_394 = p.x;
+        int const x_397 = p.y;
+        (*(tint_symbol_9)).arr[((x_394 + 2) + (x_397 * 16))] = 1;
+        int const x_402 = p.x;
+        p.x = (x_402 + 2);
+      }
+      int const x_405 = d;
+      bool const x_406 = (x_405 >= 0);
+      x_412_phi = x_406;
+      if (x_406) {
+        int const x_410 = p.y;
+        x_411 = (x_410 < 14);
+        x_412_phi = x_411;
+      }
+      bool const x_412 = x_412_phi;
+      x_425_phi = x_412;
+      if (x_412) {
+        int const x_416 = p.x;
+        int const x_418 = p.y;
+        int const x_423 = (*(tint_symbol_9)).arr[(x_416 + ((x_418 + 2) * 16))];
+        x_424 = (x_423 == 0);
+        x_425_phi = x_424;
+      }
+      bool const x_425 = x_425_phi;
+      if (x_425) {
+        int const x_428 = d;
+        d = (x_428 - 1);
+        int const x_431 = p.x;
+        int const x_433 = p.y;
+        (*(tint_symbol_9)).arr[(x_431 + (x_433 * 16))] = 1;
+        int const x_438 = p.x;
+        int const x_440 = p.y;
+        (*(tint_symbol_9)).arr[(x_438 + ((x_440 + 1) * 16))] = 1;
+        int const x_446 = p.x;
+        int const x_448 = p.y;
+        (*(tint_symbol_9)).arr[(x_446 + ((x_448 + 2) * 16))] = 1;
+        int const x_454 = p.y;
+        p.y = (x_454 + 2);
+      }
+    }
+    int const x_458 = ipos.y;
+    int const x_461 = ipos.x;
+    int const x_464 = (*(tint_symbol_9)).arr[((x_458 * 16) + x_461)];
+    if ((x_464 == 1)) {
+      *(tint_symbol_10) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+      return;
+    }
+    {
+      bool const x_468 = canwalk;
+      if (x_468) {
+      } else {
+        break;
+      }
+    }
+  }
+  *(tint_symbol_10) = float4(0.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_11 = 0.0f;
+  thread tint_array_wrapper tint_symbol_12 = {};
+  thread float4 tint_symbol_13 = 0.0f;
+  tint_symbol_11 = gl_FragCoord_param;
+  main_1(x_7, &(tint_symbol_11), &(tint_symbol_12), &(tint_symbol_13));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_13};
+  tint_symbol_2 const tint_symbol_7 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_7;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..bde11c8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/1.wgsl.expected.spvasm
@@ -0,0 +1,860 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 548
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_7 "x_7"
+               OpName %map "map"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %pos "pos"
+               OpName %ipos "ipos"
+               OpName %i "i"
+               OpName %p "p"
+               OpName %canwalk "canwalk"
+               OpName %v "v"
+               OpName %directions "directions"
+               OpName %j "j"
+               OpName %d "d"
+               OpName %x_104 "x_104"
+               OpName %x_124 "x_124"
+               OpName %x_144 "x_144"
+               OpName %x_164 "x_164"
+               OpName %x_105_phi "x_105_phi"
+               OpName %x_125_phi "x_125_phi"
+               OpName %x_145_phi "x_145_phi"
+               OpName %x_165_phi "x_165_phi"
+               OpName %x_229 "x_229"
+               OpName %x_242 "x_242"
+               OpName %x_281 "x_281"
+               OpName %x_288 "x_288"
+               OpName %x_289 "x_289"
+               OpName %x_295 "x_295"
+               OpName %x_296 "x_296"
+               OpName %x_303 "x_303"
+               OpName %x_304 "x_304"
+               OpName %x_315 "x_315"
+               OpName %x_316 "x_316"
+               OpName %x_359 "x_359"
+               OpName %x_372 "x_372"
+               OpName %x_411 "x_411"
+               OpName %x_424 "x_424"
+               OpName %x_230_phi "x_230_phi"
+               OpName %x_243_phi "x_243_phi"
+               OpName %x_282_phi "x_282_phi"
+               OpName %x_290_phi "x_290_phi"
+               OpName %x_297_phi "x_297_phi"
+               OpName %x_305_phi "x_305_phi"
+               OpName %x_317_phi "x_317_phi"
+               OpName %x_360_phi "x_360_phi"
+               OpName %x_373_phi "x_373_phi"
+               OpName %x_412_phi "x_412_phi"
+               OpName %x_425_phi "x_425_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %_arr_int_uint_256 ArrayStride 4
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+   %uint_256 = OpConstant %uint 256
+%_arr_int_uint_256 = OpTypeArray %int %uint_256
+%_ptr_Private__arr_int_uint_256 = OpTypePointer Private %_arr_int_uint_256
+         %16 = OpConstantNull %_arr_int_uint_256
+        %map = OpVariable %_ptr_Private__arr_int_uint_256 Private %16
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %22 = OpTypeFunction %void
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %28 = OpConstantNull %v2float
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %32 = OpConstantNull %v2int
+%_ptr_Function_int = OpTypePointer Function %int
+         %35 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %40 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+   %float_16 = OpConstant %float 16
+      %int_0 = OpConstant %int 0
+    %int_256 = OpConstant %int 256
+%_ptr_Private_int = OpTypePointer Private %int
+      %int_1 = OpConstant %int 1
+         %83 = OpConstantComposite %v2int %int_0 %int_0
+       %true = OpConstantTrue %bool
+      %int_2 = OpConstant %int 2
+     %int_16 = OpConstant %int 16
+     %int_14 = OpConstant %int 14
+%_ptr_Function__arr_int_uint_256 = OpTypePointer Function %_arr_int_uint_256
+      %false = OpConstantFalse %bool
+      %int_8 = OpConstant %int 8
+        %358 = OpConstantComposite %_arr_int_uint_256 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0
+    %float_1 = OpConstant %float 1
+        %528 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+    %float_0 = OpConstant %float 0
+        %534 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %535 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %22
+         %25 = OpLabel
+        %pos = OpVariable %_ptr_Function_v2float Function %28
+       %ipos = OpVariable %_ptr_Function_v2int Function %32
+          %i = OpVariable %_ptr_Function_int Function %35
+          %p = OpVariable %_ptr_Function_v2int Function %32
+    %canwalk = OpVariable %_ptr_Function_bool Function %40
+          %v = OpVariable %_ptr_Function_int Function %35
+ %directions = OpVariable %_ptr_Function_int Function %35
+          %j = OpVariable %_ptr_Function_int Function %35
+          %d = OpVariable %_ptr_Function_int Function %35
+      %x_104 = OpVariable %_ptr_Function_bool Function %40
+      %x_124 = OpVariable %_ptr_Function_bool Function %40
+      %x_144 = OpVariable %_ptr_Function_bool Function %40
+      %x_164 = OpVariable %_ptr_Function_bool Function %40
+  %x_105_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_125_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_145_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_165_phi = OpVariable %_ptr_Function_bool Function %40
+      %x_229 = OpVariable %_ptr_Function_bool Function %40
+      %x_242 = OpVariable %_ptr_Function_bool Function %40
+      %x_281 = OpVariable %_ptr_Function_bool Function %40
+      %x_288 = OpVariable %_ptr_Function_int Function %35
+      %x_289 = OpVariable %_ptr_Function_int Function %35
+      %x_295 = OpVariable %_ptr_Function_int Function %35
+      %x_296 = OpVariable %_ptr_Function_int Function %35
+      %x_303 = OpVariable %_ptr_Function__arr_int_uint_256 Function %16
+      %x_304 = OpVariable %_ptr_Function__arr_int_uint_256 Function %16
+      %x_315 = OpVariable %_ptr_Function_int Function %35
+      %x_316 = OpVariable %_ptr_Function_int Function %35
+      %x_359 = OpVariable %_ptr_Function_bool Function %40
+      %x_372 = OpVariable %_ptr_Function_bool Function %40
+      %x_411 = OpVariable %_ptr_Function_bool Function %40
+      %x_424 = OpVariable %_ptr_Function_bool Function %40
+  %x_230_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_243_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_282_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_290_phi = OpVariable %_ptr_Function_int Function %35
+  %x_297_phi = OpVariable %_ptr_Function_int Function %35
+  %x_305_phi = OpVariable %_ptr_Function__arr_int_uint_256 Function %16
+  %x_317_phi = OpVariable %_ptr_Function_int Function %35
+  %x_360_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_373_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_412_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_425_phi = OpVariable %_ptr_Function_bool Function %40
+         %45 = OpLoad %v4float %gl_FragCoord
+         %48 = OpAccessChain %_ptr_Uniform_v2float %x_7 %uint_0
+         %49 = OpLoad %v2float %48
+         %50 = OpCompositeExtract %float %45 0
+         %51 = OpCompositeExtract %float %45 1
+         %52 = OpCompositeConstruct %v2float %50 %51
+         %53 = OpFDiv %v2float %52 %49
+               OpStore %pos %53
+         %55 = OpAccessChain %_ptr_Function_float %pos %uint_0
+         %56 = OpLoad %float %55
+         %58 = OpAccessChain %_ptr_Function_float %pos %uint_1
+         %59 = OpLoad %float %58
+         %62 = OpFMul %float %56 %float_16
+         %60 = OpConvertFToS %int %62
+         %64 = OpFMul %float %59 %float_16
+         %63 = OpConvertFToS %int %64
+         %65 = OpCompositeConstruct %v2int %60 %63
+               OpStore %ipos %65
+               OpStore %i %int_0
+               OpBranch %67
+         %67 = OpLabel
+               OpLoopMerge %68 %69 None
+               OpBranch %70
+         %70 = OpLabel
+         %71 = OpLoad %int %i
+         %73 = OpSLessThan %bool %71 %int_256
+               OpSelectionMerge %74 None
+               OpBranchConditional %73 %75 %76
+         %75 = OpLabel
+               OpBranch %74
+         %76 = OpLabel
+               OpBranch %68
+         %74 = OpLabel
+         %77 = OpLoad %int %i
+         %79 = OpAccessChain %_ptr_Private_int %map %77
+               OpStore %79 %int_0
+               OpBranch %69
+         %69 = OpLabel
+         %80 = OpLoad %int %i
+         %82 = OpIAdd %int %80 %int_1
+               OpStore %i %82
+               OpBranch %67
+         %68 = OpLabel
+               OpStore %p %83
+               OpStore %canwalk %true
+               OpStore %v %int_0
+               OpBranch %85
+         %85 = OpLabel
+               OpLoopMerge %86 %87 None
+               OpBranch %88
+         %88 = OpLabel
+         %97 = OpLoad %int %v
+         %98 = OpIAdd %int %97 %int_1
+               OpStore %v %98
+               OpStore %directions %int_0
+         %99 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %100 = OpLoad %int %99
+        %101 = OpSGreaterThan %bool %100 %int_0
+               OpStore %x_105_phi %101
+               OpSelectionMerge %102 None
+               OpBranchConditional %101 %103 %102
+        %103 = OpLabel
+        %104 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %105 = OpLoad %int %104
+        %106 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %107 = OpLoad %int %106
+        %109 = OpISub %int %105 %int_2
+        %111 = OpIMul %int %107 %int_16
+        %112 = OpIAdd %int %109 %111
+        %113 = OpAccessChain %_ptr_Private_int %map %112
+        %114 = OpLoad %int %113
+        %115 = OpIEqual %bool %114 %int_0
+               OpStore %x_104 %115
+        %116 = OpLoad %bool %x_104
+               OpStore %x_105_phi %116
+               OpBranch %102
+        %102 = OpLabel
+        %117 = OpLoad %bool %x_105_phi
+               OpSelectionMerge %118 None
+               OpBranchConditional %117 %119 %118
+        %119 = OpLabel
+        %120 = OpLoad %int %directions
+        %121 = OpIAdd %int %120 %int_1
+               OpStore %directions %121
+               OpBranch %118
+        %118 = OpLabel
+        %122 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %123 = OpLoad %int %122
+        %124 = OpSGreaterThan %bool %123 %int_0
+               OpStore %x_125_phi %124
+               OpSelectionMerge %125 None
+               OpBranchConditional %124 %126 %125
+        %126 = OpLabel
+        %127 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %128 = OpLoad %int %127
+        %129 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %130 = OpLoad %int %129
+        %131 = OpISub %int %130 %int_2
+        %132 = OpIMul %int %131 %int_16
+        %133 = OpIAdd %int %128 %132
+        %134 = OpAccessChain %_ptr_Private_int %map %133
+        %135 = OpLoad %int %134
+        %136 = OpIEqual %bool %135 %int_0
+               OpStore %x_124 %136
+        %137 = OpLoad %bool %x_124
+               OpStore %x_125_phi %137
+               OpBranch %125
+        %125 = OpLabel
+        %138 = OpLoad %bool %x_125_phi
+               OpSelectionMerge %139 None
+               OpBranchConditional %138 %140 %139
+        %140 = OpLabel
+        %141 = OpLoad %int %directions
+        %142 = OpIAdd %int %141 %int_1
+               OpStore %directions %142
+               OpBranch %139
+        %139 = OpLabel
+        %143 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %144 = OpLoad %int %143
+        %146 = OpSLessThan %bool %144 %int_14
+               OpStore %x_145_phi %146
+               OpSelectionMerge %147 None
+               OpBranchConditional %146 %148 %147
+        %148 = OpLabel
+        %149 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %150 = OpLoad %int %149
+        %151 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %152 = OpLoad %int %151
+        %153 = OpIAdd %int %150 %int_2
+        %154 = OpIMul %int %152 %int_16
+        %155 = OpIAdd %int %153 %154
+        %156 = OpAccessChain %_ptr_Private_int %map %155
+        %157 = OpLoad %int %156
+        %158 = OpIEqual %bool %157 %int_0
+               OpStore %x_144 %158
+        %159 = OpLoad %bool %x_144
+               OpStore %x_145_phi %159
+               OpBranch %147
+        %147 = OpLabel
+        %160 = OpLoad %bool %x_145_phi
+               OpSelectionMerge %161 None
+               OpBranchConditional %160 %162 %161
+        %162 = OpLabel
+        %163 = OpLoad %int %directions
+        %164 = OpIAdd %int %163 %int_1
+               OpStore %directions %164
+               OpBranch %161
+        %161 = OpLabel
+        %165 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %166 = OpLoad %int %165
+        %167 = OpSLessThan %bool %166 %int_14
+               OpStore %x_165_phi %167
+               OpSelectionMerge %168 None
+               OpBranchConditional %167 %169 %168
+        %169 = OpLabel
+        %170 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %171 = OpLoad %int %170
+        %172 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %173 = OpLoad %int %172
+        %174 = OpIAdd %int %173 %int_2
+        %175 = OpIMul %int %174 %int_16
+        %176 = OpIAdd %int %171 %175
+        %177 = OpAccessChain %_ptr_Private_int %map %176
+        %178 = OpLoad %int %177
+        %179 = OpIEqual %bool %178 %int_0
+               OpStore %x_164 %179
+        %180 = OpLoad %bool %x_164
+               OpStore %x_165_phi %180
+               OpBranch %168
+        %168 = OpLabel
+        %181 = OpLoad %bool %x_165_phi
+               OpSelectionMerge %182 None
+               OpBranchConditional %181 %183 %182
+        %183 = OpLabel
+        %184 = OpLoad %int %directions
+        %185 = OpIAdd %int %184 %int_1
+               OpStore %directions %185
+               OpBranch %182
+        %182 = OpLabel
+        %213 = OpLoad %int %directions
+        %214 = OpIEqual %bool %213 %int_0
+               OpSelectionMerge %215 None
+               OpBranchConditional %214 %216 %217
+        %216 = OpLabel
+               OpStore %canwalk %false
+               OpStore %i %int_0
+               OpBranch %219
+        %219 = OpLabel
+               OpLoopMerge %220 %221 None
+               OpBranch %222
+        %222 = OpLabel
+        %223 = OpLoad %int %i
+        %225 = OpSLessThan %bool %223 %int_8
+               OpSelectionMerge %226 None
+               OpBranchConditional %225 %227 %228
+        %227 = OpLabel
+               OpBranch %226
+        %228 = OpLabel
+               OpBranch %220
+        %226 = OpLabel
+               OpStore %j %int_0
+               OpBranch %229
+        %229 = OpLabel
+               OpLoopMerge %230 %231 None
+               OpBranch %232
+        %232 = OpLabel
+        %233 = OpLoad %int %j
+        %234 = OpSLessThan %bool %233 %int_8
+               OpSelectionMerge %235 None
+               OpBranchConditional %234 %236 %237
+        %236 = OpLabel
+               OpBranch %235
+        %237 = OpLabel
+               OpBranch %230
+        %235 = OpLabel
+        %238 = OpLoad %int %j
+        %239 = OpLoad %int %i
+        %240 = OpIMul %int %238 %int_2
+        %241 = OpIMul %int %239 %int_2
+        %242 = OpIMul %int %241 %int_16
+        %243 = OpIAdd %int %240 %242
+        %244 = OpAccessChain %_ptr_Private_int %map %243
+        %245 = OpLoad %int %244
+        %246 = OpIEqual %bool %245 %int_0
+               OpSelectionMerge %247 None
+               OpBranchConditional %246 %248 %247
+        %248 = OpLabel
+        %249 = OpLoad %int %j
+        %250 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %251 = OpIMul %int %249 %int_2
+               OpStore %250 %251
+        %252 = OpLoad %int %i
+        %253 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %254 = OpIMul %int %252 %int_2
+               OpStore %253 %254
+               OpStore %canwalk %true
+               OpBranch %247
+        %247 = OpLabel
+               OpBranch %231
+        %231 = OpLabel
+        %255 = OpLoad %int %j
+        %256 = OpIAdd %int %255 %int_1
+               OpStore %j %256
+               OpBranch %229
+        %230 = OpLabel
+               OpBranch %221
+        %221 = OpLabel
+        %257 = OpLoad %int %i
+        %258 = OpIAdd %int %257 %int_1
+               OpStore %i %258
+               OpBranch %219
+        %220 = OpLabel
+        %259 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %260 = OpLoad %int %259
+        %261 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %262 = OpLoad %int %261
+        %263 = OpIMul %int %262 %int_16
+        %264 = OpIAdd %int %260 %263
+        %265 = OpAccessChain %_ptr_Private_int %map %264
+               OpStore %265 %int_1
+               OpBranch %215
+        %217 = OpLabel
+        %266 = OpLoad %int %v
+        %267 = OpLoad %int %directions
+        %268 = OpSMod %int %266 %267
+               OpStore %d %268
+        %269 = OpLoad %int %directions
+        %270 = OpLoad %int %v
+        %271 = OpIAdd %int %270 %269
+               OpStore %v %271
+        %272 = OpLoad %int %d
+        %273 = OpSGreaterThanEqual %bool %272 %int_0
+               OpStore %x_230_phi %273
+               OpSelectionMerge %274 None
+               OpBranchConditional %273 %275 %274
+        %275 = OpLabel
+        %276 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %277 = OpLoad %int %276
+        %278 = OpSGreaterThan %bool %277 %int_0
+               OpStore %x_229 %278
+        %279 = OpLoad %bool %x_229
+               OpStore %x_230_phi %279
+               OpBranch %274
+        %274 = OpLabel
+        %280 = OpLoad %bool %x_230_phi
+               OpStore %x_243_phi %280
+               OpSelectionMerge %281 None
+               OpBranchConditional %280 %282 %281
+        %282 = OpLabel
+        %283 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %284 = OpLoad %int %283
+        %285 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %286 = OpLoad %int %285
+        %287 = OpISub %int %284 %int_2
+        %288 = OpIMul %int %286 %int_16
+        %289 = OpIAdd %int %287 %288
+        %290 = OpAccessChain %_ptr_Private_int %map %289
+        %291 = OpLoad %int %290
+        %292 = OpIEqual %bool %291 %int_0
+               OpStore %x_242 %292
+        %293 = OpLoad %bool %x_242
+               OpStore %x_243_phi %293
+               OpBranch %281
+        %281 = OpLabel
+        %294 = OpLoad %bool %x_243_phi
+               OpSelectionMerge %295 None
+               OpBranchConditional %294 %296 %295
+        %296 = OpLabel
+        %297 = OpLoad %int %d
+        %298 = OpISub %int %297 %int_1
+               OpStore %d %298
+        %299 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %300 = OpLoad %int %299
+        %301 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %302 = OpLoad %int %301
+        %303 = OpIMul %int %302 %int_16
+        %304 = OpIAdd %int %300 %303
+        %305 = OpAccessChain %_ptr_Private_int %map %304
+               OpStore %305 %int_1
+        %306 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %307 = OpLoad %int %306
+        %308 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %309 = OpLoad %int %308
+        %310 = OpISub %int %307 %int_1
+        %311 = OpIMul %int %309 %int_16
+        %312 = OpIAdd %int %310 %311
+        %313 = OpAccessChain %_ptr_Private_int %map %312
+               OpStore %313 %int_1
+        %314 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %315 = OpLoad %int %314
+        %316 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %317 = OpLoad %int %316
+        %318 = OpISub %int %315 %int_2
+        %319 = OpIMul %int %317 %int_16
+        %320 = OpIAdd %int %318 %319
+        %321 = OpAccessChain %_ptr_Private_int %map %320
+               OpStore %321 %int_1
+        %322 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %323 = OpLoad %int %322
+        %324 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %325 = OpISub %int %323 %int_2
+               OpStore %324 %325
+               OpBranch %295
+        %295 = OpLabel
+        %326 = OpLoad %int %d
+        %327 = OpSGreaterThanEqual %bool %326 %int_0
+               OpStore %x_282_phi %327
+               OpSelectionMerge %328 None
+               OpBranchConditional %327 %329 %328
+        %329 = OpLabel
+        %330 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %331 = OpLoad %int %330
+        %332 = OpSGreaterThan %bool %331 %int_0
+               OpStore %x_281 %332
+        %333 = OpLoad %bool %x_281
+               OpStore %x_282_phi %333
+               OpBranch %328
+        %328 = OpLabel
+        %334 = OpLoad %bool %x_282_phi
+               OpSelectionMerge %335 None
+               OpBranchConditional %334 %336 %337
+        %336 = OpLabel
+        %338 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %339 = OpLoad %int %338
+               OpStore %x_288 %339
+        %340 = OpLoad %int %x_288
+               OpStore %x_290_phi %340
+               OpBranch %335
+        %337 = OpLabel
+               OpStore %x_289 %int_0
+        %341 = OpLoad %int %x_289
+               OpStore %x_290_phi %341
+               OpBranch %335
+        %335 = OpLabel
+        %342 = OpLoad %int %x_290_phi
+               OpSelectionMerge %343 None
+               OpBranchConditional %334 %344 %345
+        %344 = OpLabel
+        %346 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %347 = OpLoad %int %346
+               OpStore %x_295 %347
+        %348 = OpLoad %int %x_295
+               OpStore %x_297_phi %348
+               OpBranch %343
+        %345 = OpLabel
+               OpStore %x_296 %int_0
+        %349 = OpLoad %int %x_296
+               OpStore %x_297_phi %349
+               OpBranch %343
+        %343 = OpLabel
+        %350 = OpLoad %int %x_297_phi
+        %351 = OpISub %int %350 %int_2
+        %352 = OpIMul %int %351 %int_16
+               OpSelectionMerge %353 None
+               OpBranchConditional %334 %354 %355
+        %354 = OpLabel
+        %356 = OpLoad %_arr_int_uint_256 %map
+               OpStore %x_303 %356
+        %357 = OpLoad %_arr_int_uint_256 %x_303
+               OpStore %x_305_phi %357
+               OpBranch %353
+        %355 = OpLabel
+               OpStore %x_304 %358
+        %359 = OpLoad %_arr_int_uint_256 %x_304
+               OpStore %x_305_phi %359
+               OpBranch %353
+        %353 = OpLabel
+        %360 = OpLoad %_arr_int_uint_256 %x_305_phi
+               OpSelectionMerge %361 None
+               OpBranchConditional %334 %362 %361
+        %362 = OpLabel
+               OpStore %map %358
+               OpBranch %361
+        %361 = OpLabel
+               OpSelectionMerge %363 None
+               OpBranchConditional %334 %364 %363
+        %364 = OpLabel
+               OpStore %map %360
+               OpBranch %363
+        %363 = OpLabel
+               OpSelectionMerge %365 None
+               OpBranchConditional %334 %366 %367
+        %366 = OpLabel
+        %368 = OpIAdd %int %342 %352
+        %369 = OpAccessChain %_ptr_Private_int %map %368
+        %370 = OpLoad %int %369
+               OpStore %x_315 %370
+        %371 = OpLoad %int %x_315
+               OpStore %x_317_phi %371
+               OpBranch %365
+        %367 = OpLabel
+               OpStore %x_316 %int_0
+        %372 = OpLoad %int %x_316
+               OpStore %x_317_phi %372
+               OpBranch %365
+        %365 = OpLabel
+        %373 = OpLoad %int %x_317_phi
+        %374 = OpIEqual %bool %373 %int_0
+        %375 = OpSelect %bool %334 %374 %334
+               OpSelectionMerge %376 None
+               OpBranchConditional %375 %377 %376
+        %377 = OpLabel
+        %378 = OpLoad %int %d
+        %379 = OpISub %int %378 %int_1
+               OpStore %d %379
+        %380 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %381 = OpLoad %int %380
+        %382 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %383 = OpLoad %int %382
+        %384 = OpIMul %int %383 %int_16
+        %385 = OpIAdd %int %381 %384
+        %386 = OpAccessChain %_ptr_Private_int %map %385
+               OpStore %386 %int_1
+        %387 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %388 = OpLoad %int %387
+        %389 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %390 = OpLoad %int %389
+        %391 = OpISub %int %390 %int_1
+        %392 = OpIMul %int %391 %int_16
+        %393 = OpIAdd %int %388 %392
+        %394 = OpAccessChain %_ptr_Private_int %map %393
+               OpStore %394 %int_1
+        %395 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %396 = OpLoad %int %395
+        %397 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %398 = OpLoad %int %397
+        %399 = OpLoad %_arr_int_uint_256 %map
+               OpStore %map %358
+               OpStore %map %399
+        %400 = OpISub %int %398 %int_2
+        %401 = OpIMul %int %400 %int_16
+        %402 = OpIAdd %int %396 %401
+        %403 = OpAccessChain %_ptr_Private_int %map %402
+               OpStore %403 %int_1
+        %404 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %405 = OpLoad %int %404
+        %406 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %407 = OpISub %int %405 %int_2
+               OpStore %406 %407
+               OpBranch %376
+        %376 = OpLabel
+        %408 = OpLoad %int %d
+        %409 = OpSGreaterThanEqual %bool %408 %int_0
+               OpStore %x_360_phi %409
+               OpSelectionMerge %410 None
+               OpBranchConditional %409 %411 %410
+        %411 = OpLabel
+        %412 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %413 = OpLoad %int %412
+        %414 = OpSLessThan %bool %413 %int_14
+               OpStore %x_359 %414
+        %415 = OpLoad %bool %x_359
+               OpStore %x_360_phi %415
+               OpBranch %410
+        %410 = OpLabel
+        %416 = OpLoad %bool %x_360_phi
+               OpStore %x_373_phi %416
+               OpSelectionMerge %417 None
+               OpBranchConditional %416 %418 %417
+        %418 = OpLabel
+        %419 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %420 = OpLoad %int %419
+        %421 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %422 = OpLoad %int %421
+        %423 = OpIAdd %int %420 %int_2
+        %424 = OpIMul %int %422 %int_16
+        %425 = OpIAdd %int %423 %424
+        %426 = OpAccessChain %_ptr_Private_int %map %425
+        %427 = OpLoad %int %426
+        %428 = OpIEqual %bool %427 %int_0
+               OpStore %x_372 %428
+        %429 = OpLoad %bool %x_372
+               OpStore %x_373_phi %429
+               OpBranch %417
+        %417 = OpLabel
+        %430 = OpLoad %bool %x_373_phi
+               OpSelectionMerge %431 None
+               OpBranchConditional %430 %432 %431
+        %432 = OpLabel
+        %433 = OpLoad %int %d
+        %434 = OpISub %int %433 %int_1
+               OpStore %d %434
+        %435 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %436 = OpLoad %int %435
+        %437 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %438 = OpLoad %int %437
+        %439 = OpIMul %int %438 %int_16
+        %440 = OpIAdd %int %436 %439
+        %441 = OpAccessChain %_ptr_Private_int %map %440
+               OpStore %441 %int_1
+        %442 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %443 = OpLoad %int %442
+        %444 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %445 = OpLoad %int %444
+        %446 = OpIAdd %int %443 %int_1
+        %447 = OpIMul %int %445 %int_16
+        %448 = OpIAdd %int %446 %447
+        %449 = OpAccessChain %_ptr_Private_int %map %448
+               OpStore %449 %int_1
+        %450 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %451 = OpLoad %int %450
+        %452 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %453 = OpLoad %int %452
+        %454 = OpIAdd %int %451 %int_2
+        %455 = OpIMul %int %453 %int_16
+        %456 = OpIAdd %int %454 %455
+        %457 = OpAccessChain %_ptr_Private_int %map %456
+               OpStore %457 %int_1
+        %458 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %459 = OpLoad %int %458
+        %460 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %461 = OpIAdd %int %459 %int_2
+               OpStore %460 %461
+               OpBranch %431
+        %431 = OpLabel
+        %462 = OpLoad %int %d
+        %463 = OpSGreaterThanEqual %bool %462 %int_0
+               OpStore %x_412_phi %463
+               OpSelectionMerge %464 None
+               OpBranchConditional %463 %465 %464
+        %465 = OpLabel
+        %466 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %467 = OpLoad %int %466
+        %468 = OpSLessThan %bool %467 %int_14
+               OpStore %x_411 %468
+        %469 = OpLoad %bool %x_411
+               OpStore %x_412_phi %469
+               OpBranch %464
+        %464 = OpLabel
+        %470 = OpLoad %bool %x_412_phi
+               OpStore %x_425_phi %470
+               OpSelectionMerge %471 None
+               OpBranchConditional %470 %472 %471
+        %472 = OpLabel
+        %473 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %474 = OpLoad %int %473
+        %475 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %476 = OpLoad %int %475
+        %477 = OpIAdd %int %476 %int_2
+        %478 = OpIMul %int %477 %int_16
+        %479 = OpIAdd %int %474 %478
+        %480 = OpAccessChain %_ptr_Private_int %map %479
+        %481 = OpLoad %int %480
+        %482 = OpIEqual %bool %481 %int_0
+               OpStore %x_424 %482
+        %483 = OpLoad %bool %x_424
+               OpStore %x_425_phi %483
+               OpBranch %471
+        %471 = OpLabel
+        %484 = OpLoad %bool %x_425_phi
+               OpSelectionMerge %485 None
+               OpBranchConditional %484 %486 %485
+        %486 = OpLabel
+        %487 = OpLoad %int %d
+        %488 = OpISub %int %487 %int_1
+               OpStore %d %488
+        %489 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %490 = OpLoad %int %489
+        %491 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %492 = OpLoad %int %491
+        %493 = OpIMul %int %492 %int_16
+        %494 = OpIAdd %int %490 %493
+        %495 = OpAccessChain %_ptr_Private_int %map %494
+               OpStore %495 %int_1
+        %496 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %497 = OpLoad %int %496
+        %498 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %499 = OpLoad %int %498
+        %500 = OpIAdd %int %499 %int_1
+        %501 = OpIMul %int %500 %int_16
+        %502 = OpIAdd %int %497 %501
+        %503 = OpAccessChain %_ptr_Private_int %map %502
+               OpStore %503 %int_1
+        %504 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %505 = OpLoad %int %504
+        %506 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %507 = OpLoad %int %506
+        %508 = OpIAdd %int %507 %int_2
+        %509 = OpIMul %int %508 %int_16
+        %510 = OpIAdd %int %505 %509
+        %511 = OpAccessChain %_ptr_Private_int %map %510
+               OpStore %511 %int_1
+        %512 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %513 = OpLoad %int %512
+        %514 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %515 = OpIAdd %int %513 %int_2
+               OpStore %514 %515
+               OpBranch %485
+        %485 = OpLabel
+               OpBranch %215
+        %215 = OpLabel
+        %516 = OpAccessChain %_ptr_Function_int %ipos %uint_1
+        %517 = OpLoad %int %516
+        %518 = OpAccessChain %_ptr_Function_int %ipos %uint_0
+        %519 = OpLoad %int %518
+        %520 = OpIMul %int %517 %int_16
+        %521 = OpIAdd %int %520 %519
+        %522 = OpAccessChain %_ptr_Private_int %map %521
+        %523 = OpLoad %int %522
+        %524 = OpIEqual %bool %523 %int_1
+               OpSelectionMerge %525 None
+               OpBranchConditional %524 %526 %525
+        %526 = OpLabel
+               OpStore %x_GLF_color %528
+               OpReturn
+        %525 = OpLabel
+               OpBranch %87
+         %87 = OpLabel
+        %529 = OpLoad %bool %canwalk
+               OpSelectionMerge %530 None
+               OpBranchConditional %529 %531 %532
+        %531 = OpLabel
+               OpBranch %530
+        %532 = OpLabel
+               OpBranch %86
+        %530 = OpLabel
+               OpBranch %85
+         %86 = OpLabel
+               OpStore %x_GLF_color %534
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %535
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %539 = OpLabel
+        %540 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %540
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %22
+        %542 = OpLabel
+        %543 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %543
+        %544 = OpFunctionCall %void %main_1
+        %546 = OpLoad %v4float %x_GLF_color
+        %547 = OpCompositeConstruct %main_out %546
+        %545 = OpFunctionCall %void %tint_symbol_3 %547
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 87[%87] is not post dominated by the back-edge block 530[%530]
+  %530 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..7636426
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/1.wgsl.expected.wgsl
@@ -0,0 +1,392 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> map : array<i32, 256>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var pos : vec2<f32>;
+  var ipos : vec2<i32>;
+  var i : i32;
+  var p : vec2<i32>;
+  var canwalk : bool;
+  var v : i32;
+  var directions : i32;
+  var j : i32;
+  var d : i32;
+  let x_59 : vec4<f32> = gl_FragCoord;
+  let x_62 : vec2<f32> = x_7.resolution;
+  pos = (vec2<f32>(x_59.x, x_59.y) / x_62);
+  let x_65 : f32 = pos.x;
+  let x_69 : f32 = pos.y;
+  ipos = vec2<i32>(i32((x_65 * 16.0)), i32((x_69 * 16.0)));
+  i = 0;
+  loop {
+    let x_77 : i32 = i;
+    if ((x_77 < 256)) {
+    } else {
+      break;
+    }
+    let x_80 : i32 = i;
+    map[x_80] = 0;
+
+    continuing {
+      let x_82 : i32 = i;
+      i = (x_82 + 1);
+    }
+  }
+  p = vec2<i32>(0, 0);
+  canwalk = true;
+  v = 0;
+  loop {
+    var x_104 : bool;
+    var x_124 : bool;
+    var x_144 : bool;
+    var x_164 : bool;
+    var x_105_phi : bool;
+    var x_125_phi : bool;
+    var x_145_phi : bool;
+    var x_165_phi : bool;
+    let x_88 : i32 = v;
+    v = (x_88 + 1);
+    directions = 0;
+    let x_91 : i32 = p.x;
+    let x_92 : bool = (x_91 > 0);
+    x_105_phi = x_92;
+    if (x_92) {
+      let x_96 : i32 = p.x;
+      let x_99 : i32 = p.y;
+      let x_103 : i32 = map[((x_96 - 2) + (x_99 * 16))];
+      x_104 = (x_103 == 0);
+      x_105_phi = x_104;
+    }
+    let x_105 : bool = x_105_phi;
+    if (x_105) {
+      let x_108 : i32 = directions;
+      directions = (x_108 + 1);
+    }
+    let x_111 : i32 = p.y;
+    let x_112 : bool = (x_111 > 0);
+    x_125_phi = x_112;
+    if (x_112) {
+      let x_116 : i32 = p.x;
+      let x_118 : i32 = p.y;
+      let x_123 : i32 = map[(x_116 + ((x_118 - 2) * 16))];
+      x_124 = (x_123 == 0);
+      x_125_phi = x_124;
+    }
+    let x_125 : bool = x_125_phi;
+    if (x_125) {
+      let x_128 : i32 = directions;
+      directions = (x_128 + 1);
+    }
+    let x_131 : i32 = p.x;
+    let x_132 : bool = (x_131 < 14);
+    x_145_phi = x_132;
+    if (x_132) {
+      let x_136 : i32 = p.x;
+      let x_139 : i32 = p.y;
+      let x_143 : i32 = map[((x_136 + 2) + (x_139 * 16))];
+      x_144 = (x_143 == 0);
+      x_145_phi = x_144;
+    }
+    let x_145 : bool = x_145_phi;
+    if (x_145) {
+      let x_148 : i32 = directions;
+      directions = (x_148 + 1);
+    }
+    let x_151 : i32 = p.y;
+    let x_152 : bool = (x_151 < 14);
+    x_165_phi = x_152;
+    if (x_152) {
+      let x_156 : i32 = p.x;
+      let x_158 : i32 = p.y;
+      let x_163 : i32 = map[(x_156 + ((x_158 + 2) * 16))];
+      x_164 = (x_163 == 0);
+      x_165_phi = x_164;
+    }
+    let x_165 : bool = x_165_phi;
+    if (x_165) {
+      let x_168 : i32 = directions;
+      directions = (x_168 + 1);
+    }
+    var x_229 : bool;
+    var x_242 : bool;
+    var x_281 : bool;
+    var x_288 : i32;
+    var x_289 : i32;
+    var x_295 : i32;
+    var x_296 : i32;
+    var x_303 : array<i32, 256>;
+    var x_304 : array<i32, 256>;
+    var x_315 : i32;
+    var x_316 : i32;
+    var x_359 : bool;
+    var x_372 : bool;
+    var x_411 : bool;
+    var x_424 : bool;
+    var x_230_phi : bool;
+    var x_243_phi : bool;
+    var x_282_phi : bool;
+    var x_290_phi : i32;
+    var x_297_phi : i32;
+    var x_305_phi : array<i32, 256>;
+    var x_317_phi : i32;
+    var x_360_phi : bool;
+    var x_373_phi : bool;
+    var x_412_phi : bool;
+    var x_425_phi : bool;
+    let x_170 : i32 = directions;
+    if ((x_170 == 0)) {
+      canwalk = false;
+      i = 0;
+      loop {
+        let x_179 : i32 = i;
+        if ((x_179 < 8)) {
+        } else {
+          break;
+        }
+        j = 0;
+        loop {
+          let x_186 : i32 = j;
+          if ((x_186 < 8)) {
+          } else {
+            break;
+          }
+          let x_189 : i32 = j;
+          let x_191 : i32 = i;
+          let x_196 : i32 = map[((x_189 * 2) + ((x_191 * 2) * 16))];
+          if ((x_196 == 0)) {
+            let x_200 : i32 = j;
+            p.x = (x_200 * 2);
+            let x_203 : i32 = i;
+            p.y = (x_203 * 2);
+            canwalk = true;
+          }
+
+          continuing {
+            let x_206 : i32 = j;
+            j = (x_206 + 1);
+          }
+        }
+
+        continuing {
+          let x_208 : i32 = i;
+          i = (x_208 + 1);
+        }
+      }
+      let x_211 : i32 = p.x;
+      let x_213 : i32 = p.y;
+      map[(x_211 + (x_213 * 16))] = 1;
+    } else {
+      let x_217 : i32 = v;
+      let x_218 : i32 = directions;
+      d = (x_217 % x_218);
+      let x_220 : i32 = directions;
+      let x_221 : i32 = v;
+      v = (x_221 + x_220);
+      let x_223 : i32 = d;
+      let x_224 : bool = (x_223 >= 0);
+      x_230_phi = x_224;
+      if (x_224) {
+        let x_228 : i32 = p.x;
+        x_229 = (x_228 > 0);
+        x_230_phi = x_229;
+      }
+      let x_230 : bool = x_230_phi;
+      x_243_phi = x_230;
+      if (x_230) {
+        let x_234 : i32 = p.x;
+        let x_237 : i32 = p.y;
+        let x_241 : i32 = map[((x_234 - 2) + (x_237 * 16))];
+        x_242 = (x_241 == 0);
+        x_243_phi = x_242;
+      }
+      let x_243 : bool = x_243_phi;
+      if (x_243) {
+        let x_246 : i32 = d;
+        d = (x_246 - 1);
+        let x_249 : i32 = p.x;
+        let x_251 : i32 = p.y;
+        map[(x_249 + (x_251 * 16))] = 1;
+        let x_256 : i32 = p.x;
+        let x_259 : i32 = p.y;
+        map[((x_256 - 1) + (x_259 * 16))] = 1;
+        let x_264 : i32 = p.x;
+        let x_267 : i32 = p.y;
+        map[((x_264 - 2) + (x_267 * 16))] = 1;
+        let x_272 : i32 = p.x;
+        p.x = (x_272 - 2);
+      }
+      let x_275 : i32 = d;
+      let x_276 : bool = (x_275 >= 0);
+      x_282_phi = x_276;
+      if (x_276) {
+        let x_280 : i32 = p.y;
+        x_281 = (x_280 > 0);
+        x_282_phi = x_281;
+      }
+      let x_282 : bool = x_282_phi;
+      if (x_282) {
+        x_288 = p.x;
+        x_290_phi = x_288;
+      } else {
+        x_289 = 0;
+        x_290_phi = x_289;
+      }
+      let x_290 : i32 = x_290_phi;
+      if (x_282) {
+        x_295 = p.y;
+        x_297_phi = x_295;
+      } else {
+        x_296 = 0;
+        x_297_phi = x_296;
+      }
+      let x_297 : i32 = x_297_phi;
+      let x_299 : i32 = ((x_297 - 2) * 16);
+      if (x_282) {
+        x_303 = map;
+        x_305_phi = x_303;
+      } else {
+        x_304 = array<i32, 256>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+        x_305_phi = x_304;
+      }
+      let x_305 : array<i32, 256> = x_305_phi;
+      if (x_282) {
+        map = array<i32, 256>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+      }
+      if (x_282) {
+        map = x_305;
+      }
+      if (x_282) {
+        x_315 = map[(x_290 + x_299)];
+        x_317_phi = x_315;
+      } else {
+        x_316 = 0;
+        x_317_phi = x_316;
+      }
+      let x_317 : i32 = x_317_phi;
+      let x_318 : bool = (x_317 == 0);
+      if (select(x_282, x_318, x_282)) {
+        let x_323 : i32 = d;
+        d = (x_323 - 1);
+        let x_326 : i32 = p.x;
+        let x_328 : i32 = p.y;
+        map[(x_326 + (x_328 * 16))] = 1;
+        let x_333 : i32 = p.x;
+        let x_335 : i32 = p.y;
+        map[(x_333 + ((x_335 - 1) * 16))] = 1;
+        let x_341 : i32 = p.x;
+        let x_343 : i32 = p.y;
+        let x_345 : array<i32, 256> = map;
+        map = array<i32, 256>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+        map = x_345;
+        map[(x_341 + ((x_343 - 2) * 16))] = 1;
+        let x_350 : i32 = p.y;
+        p.y = (x_350 - 2);
+      }
+      let x_353 : i32 = d;
+      let x_354 : bool = (x_353 >= 0);
+      x_360_phi = x_354;
+      if (x_354) {
+        let x_358 : i32 = p.x;
+        x_359 = (x_358 < 14);
+        x_360_phi = x_359;
+      }
+      let x_360 : bool = x_360_phi;
+      x_373_phi = x_360;
+      if (x_360) {
+        let x_364 : i32 = p.x;
+        let x_367 : i32 = p.y;
+        let x_371 : i32 = map[((x_364 + 2) + (x_367 * 16))];
+        x_372 = (x_371 == 0);
+        x_373_phi = x_372;
+      }
+      let x_373 : bool = x_373_phi;
+      if (x_373) {
+        let x_376 : i32 = d;
+        d = (x_376 - 1);
+        let x_379 : i32 = p.x;
+        let x_381 : i32 = p.y;
+        map[(x_379 + (x_381 * 16))] = 1;
+        let x_386 : i32 = p.x;
+        let x_389 : i32 = p.y;
+        map[((x_386 + 1) + (x_389 * 16))] = 1;
+        let x_394 : i32 = p.x;
+        let x_397 : i32 = p.y;
+        map[((x_394 + 2) + (x_397 * 16))] = 1;
+        let x_402 : i32 = p.x;
+        p.x = (x_402 + 2);
+      }
+      let x_405 : i32 = d;
+      let x_406 : bool = (x_405 >= 0);
+      x_412_phi = x_406;
+      if (x_406) {
+        let x_410 : i32 = p.y;
+        x_411 = (x_410 < 14);
+        x_412_phi = x_411;
+      }
+      let x_412 : bool = x_412_phi;
+      x_425_phi = x_412;
+      if (x_412) {
+        let x_416 : i32 = p.x;
+        let x_418 : i32 = p.y;
+        let x_423 : i32 = map[(x_416 + ((x_418 + 2) * 16))];
+        x_424 = (x_423 == 0);
+        x_425_phi = x_424;
+      }
+      let x_425 : bool = x_425_phi;
+      if (x_425) {
+        let x_428 : i32 = d;
+        d = (x_428 - 1);
+        let x_431 : i32 = p.x;
+        let x_433 : i32 = p.y;
+        map[(x_431 + (x_433 * 16))] = 1;
+        let x_438 : i32 = p.x;
+        let x_440 : i32 = p.y;
+        map[(x_438 + ((x_440 + 1) * 16))] = 1;
+        let x_446 : i32 = p.x;
+        let x_448 : i32 = p.y;
+        map[(x_446 + ((x_448 + 2) * 16))] = 1;
+        let x_454 : i32 = p.y;
+        p.y = (x_454 + 2);
+      }
+    }
+    let x_458 : i32 = ipos.y;
+    let x_461 : i32 = ipos.x;
+    let x_464 : i32 = map[((x_458 * 16) + x_461)];
+    if ((x_464 == 1)) {
+      x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+      return;
+    }
+
+    continuing {
+      let x_468 : bool = canwalk;
+      if (x_468) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/2.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/2.spvasm
new file mode 100644
index 0000000..189e3fb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/2.spvasm
@@ -0,0 +1,617 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %pos "pos"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %ipos "ipos"
+               OpName %i "i"
+               OpName %map "map"
+               OpName %p "p"
+               OpName %canwalk "canwalk"
+               OpName %v "v"
+               OpName %directions "directions"
+               OpName %j "j"
+               OpName %d "d"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+   %float_16 = OpConstant %float 16
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_int = OpTypePointer Function %int
+    %int_256 = OpConstant %int 256
+       %bool = OpTypeBool
+   %uint_256 = OpConstant %uint 256
+%_arr_int_uint_256 = OpTypeArray %int %uint_256
+%_ptr_Private__arr_int_uint_256 = OpTypePointer Private %_arr_int_uint_256
+        %map = OpVariable %_ptr_Private__arr_int_uint_256 Private
+%_ptr_Private_int = OpTypePointer Private %int
+      %int_1 = OpConstant %int 1
+         %43 = OpConstantComposite %v2int %int_0 %int_0
+%_ptr_Function_bool = OpTypePointer Function %bool
+       %true = OpConstantTrue %bool
+      %int_2 = OpConstant %int 2
+     %int_16 = OpConstant %int 16
+     %int_14 = OpConstant %int 14
+      %false = OpConstantFalse %bool
+      %int_8 = OpConstant %int 8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+         %53 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+    %float_0 = OpConstant %float 0
+         %55 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+    %int_0_0 = OpConstant %int 0
+         %57 = OpConstantComposite %_arr_int_uint_256 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0
+       %main = OpFunction %void None %18
+         %58 = OpLabel
+        %pos = OpVariable %_ptr_Function_v2float Function
+       %ipos = OpVariable %_ptr_Function_v2int Function
+          %i = OpVariable %_ptr_Function_int Function
+          %p = OpVariable %_ptr_Function_v2int Function
+    %canwalk = OpVariable %_ptr_Function_bool Function
+          %v = OpVariable %_ptr_Function_int Function
+ %directions = OpVariable %_ptr_Function_int Function
+          %j = OpVariable %_ptr_Function_int Function
+          %d = OpVariable %_ptr_Function_int Function
+         %59 = OpLoad %v4float %gl_FragCoord
+         %60 = OpVectorShuffle %v2float %59 %59 0 1
+         %61 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+         %62 = OpLoad %v2float %61
+         %63 = OpFDiv %v2float %60 %62
+               OpStore %pos %63
+         %64 = OpAccessChain %_ptr_Function_float %pos %uint_0
+         %65 = OpLoad %float %64
+         %66 = OpFMul %float %65 %float_16
+         %67 = OpConvertFToS %int %66
+         %68 = OpAccessChain %_ptr_Function_float %pos %uint_1
+         %69 = OpLoad %float %68
+         %70 = OpFMul %float %69 %float_16
+         %71 = OpConvertFToS %int %70
+         %72 = OpCompositeConstruct %v2int %67 %71
+               OpStore %ipos %72
+               OpStore %i %int_0
+               OpBranch %73
+         %73 = OpLabel
+               OpLoopMerge %74 %75 None
+               OpBranch %76
+         %76 = OpLabel
+         %77 = OpLoad %int %i
+         %78 = OpSLessThan %bool %77 %int_256
+               OpBranchConditional %78 %79 %74
+         %79 = OpLabel
+         %80 = OpLoad %int %i
+         %81 = OpAccessChain %_ptr_Private_int %map %80
+               OpStore %81 %int_0
+               OpBranch %75
+         %75 = OpLabel
+         %82 = OpLoad %int %i
+         %83 = OpIAdd %int %82 %int_1
+               OpStore %i %83
+               OpBranch %73
+         %74 = OpLabel
+               OpStore %p %43
+               OpStore %canwalk %true
+               OpStore %v %int_0
+               OpBranch %84
+         %84 = OpLabel
+               OpLoopMerge %85 %86 None
+               OpBranch %87
+         %87 = OpLabel
+         %88 = OpLoad %int %v
+         %89 = OpIAdd %int %88 %int_1
+               OpStore %v %89
+               OpStore %directions %int_0
+         %90 = OpAccessChain %_ptr_Function_int %p %uint_0
+         %91 = OpLoad %int %90
+         %92 = OpSGreaterThan %bool %91 %int_0
+               OpSelectionMerge %93 None
+               OpBranchConditional %92 %94 %93
+         %94 = OpLabel
+         %95 = OpAccessChain %_ptr_Function_int %p %uint_0
+         %96 = OpLoad %int %95
+         %97 = OpISub %int %96 %int_2
+         %98 = OpAccessChain %_ptr_Function_int %p %uint_1
+         %99 = OpLoad %int %98
+        %100 = OpIMul %int %99 %int_16
+        %101 = OpIAdd %int %97 %100
+        %102 = OpAccessChain %_ptr_Private_int %map %101
+        %103 = OpLoad %int %102
+        %104 = OpIEqual %bool %103 %int_0
+               OpBranch %93
+         %93 = OpLabel
+        %105 = OpPhi %bool %92 %87 %104 %94
+               OpSelectionMerge %106 None
+               OpBranchConditional %105 %107 %106
+        %107 = OpLabel
+        %108 = OpLoad %int %directions
+        %109 = OpIAdd %int %108 %int_1
+               OpStore %directions %109
+               OpBranch %106
+        %106 = OpLabel
+        %110 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %111 = OpLoad %int %110
+        %112 = OpSGreaterThan %bool %111 %int_0
+               OpSelectionMerge %113 None
+               OpBranchConditional %112 %114 %113
+        %114 = OpLabel
+        %115 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %116 = OpLoad %int %115
+        %117 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %118 = OpLoad %int %117
+        %119 = OpISub %int %118 %int_2
+        %120 = OpIMul %int %119 %int_16
+        %121 = OpIAdd %int %116 %120
+        %122 = OpAccessChain %_ptr_Private_int %map %121
+        %123 = OpLoad %int %122
+        %124 = OpIEqual %bool %123 %int_0
+               OpBranch %113
+        %113 = OpLabel
+        %125 = OpPhi %bool %112 %106 %124 %114
+               OpSelectionMerge %126 None
+               OpBranchConditional %125 %127 %126
+        %127 = OpLabel
+        %128 = OpLoad %int %directions
+        %129 = OpIAdd %int %128 %int_1
+               OpStore %directions %129
+               OpBranch %126
+        %126 = OpLabel
+        %130 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %131 = OpLoad %int %130
+        %132 = OpSLessThan %bool %131 %int_14
+               OpSelectionMerge %133 None
+               OpBranchConditional %132 %134 %133
+        %134 = OpLabel
+        %135 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %136 = OpLoad %int %135
+        %137 = OpIAdd %int %136 %int_2
+        %138 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %139 = OpLoad %int %138
+        %140 = OpIMul %int %139 %int_16
+        %141 = OpIAdd %int %137 %140
+        %142 = OpAccessChain %_ptr_Private_int %map %141
+        %143 = OpLoad %int %142
+        %144 = OpIEqual %bool %143 %int_0
+               OpBranch %133
+        %133 = OpLabel
+        %145 = OpPhi %bool %132 %126 %144 %134
+               OpSelectionMerge %146 None
+               OpBranchConditional %145 %147 %146
+        %147 = OpLabel
+        %148 = OpLoad %int %directions
+        %149 = OpIAdd %int %148 %int_1
+               OpStore %directions %149
+               OpBranch %146
+        %146 = OpLabel
+        %150 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %151 = OpLoad %int %150
+        %152 = OpSLessThan %bool %151 %int_14
+               OpSelectionMerge %153 None
+               OpBranchConditional %152 %154 %153
+        %154 = OpLabel
+        %155 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %156 = OpLoad %int %155
+        %157 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %158 = OpLoad %int %157
+        %159 = OpIAdd %int %158 %int_2
+        %160 = OpIMul %int %159 %int_16
+        %161 = OpIAdd %int %156 %160
+        %162 = OpAccessChain %_ptr_Private_int %map %161
+        %163 = OpLoad %int %162
+        %164 = OpIEqual %bool %163 %int_0
+               OpBranch %153
+        %153 = OpLabel
+        %165 = OpPhi %bool %152 %146 %164 %154
+               OpSelectionMerge %166 None
+               OpBranchConditional %165 %167 %166
+        %167 = OpLabel
+        %168 = OpLoad %int %directions
+        %169 = OpIAdd %int %168 %int_1
+               OpStore %directions %169
+               OpBranch %166
+        %166 = OpLabel
+        %170 = OpLoad %int %directions
+        %171 = OpIEqual %bool %170 %int_0
+               OpSelectionMerge %172 None
+               OpBranchConditional %171 %173 %174
+        %173 = OpLabel
+               OpStore %canwalk %false
+               OpStore %i %int_0
+               OpBranch %175
+        %175 = OpLabel
+               OpLoopMerge %176 %177 None
+               OpBranch %178
+        %178 = OpLabel
+        %179 = OpLoad %int %i
+        %180 = OpSLessThan %bool %179 %int_8
+               OpBranchConditional %180 %181 %176
+        %181 = OpLabel
+               OpStore %j %int_0
+               OpBranch %182
+        %182 = OpLabel
+               OpLoopMerge %183 %184 None
+               OpBranch %185
+        %185 = OpLabel
+        %186 = OpLoad %int %j
+        %187 = OpSLessThan %bool %186 %int_8
+               OpBranchConditional %187 %188 %183
+        %188 = OpLabel
+        %189 = OpLoad %int %j
+        %190 = OpIMul %int %189 %int_2
+        %191 = OpLoad %int %i
+        %192 = OpIMul %int %191 %int_2
+        %193 = OpIMul %int %192 %int_16
+        %194 = OpIAdd %int %190 %193
+        %195 = OpAccessChain %_ptr_Private_int %map %194
+        %196 = OpLoad %int %195
+        %197 = OpIEqual %bool %196 %int_0
+               OpSelectionMerge %198 None
+               OpBranchConditional %197 %199 %198
+        %199 = OpLabel
+        %200 = OpLoad %int %j
+        %201 = OpIMul %int %200 %int_2
+        %202 = OpAccessChain %_ptr_Function_int %p %uint_0
+               OpStore %202 %201
+        %203 = OpLoad %int %i
+        %204 = OpIMul %int %203 %int_2
+        %205 = OpAccessChain %_ptr_Function_int %p %uint_1
+               OpStore %205 %204
+               OpStore %canwalk %true
+               OpBranch %198
+        %198 = OpLabel
+               OpBranch %184
+        %184 = OpLabel
+        %206 = OpLoad %int %j
+        %207 = OpIAdd %int %206 %int_1
+               OpStore %j %207
+               OpBranch %182
+        %183 = OpLabel
+               OpBranch %177
+        %177 = OpLabel
+        %208 = OpLoad %int %i
+        %209 = OpIAdd %int %208 %int_1
+               OpStore %i %209
+               OpBranch %175
+        %176 = OpLabel
+        %210 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %211 = OpLoad %int %210
+        %212 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %213 = OpLoad %int %212
+        %214 = OpIMul %int %213 %int_16
+        %215 = OpIAdd %int %211 %214
+        %216 = OpAccessChain %_ptr_Private_int %map %215
+               OpStore %216 %int_1
+               OpBranch %172
+        %174 = OpLabel
+        %217 = OpLoad %int %v
+        %218 = OpLoad %int %directions
+        %219 = OpSMod %int %217 %218
+               OpStore %d %219
+        %220 = OpLoad %int %directions
+        %221 = OpLoad %int %v
+        %222 = OpIAdd %int %221 %220
+               OpStore %v %222
+        %223 = OpLoad %int %d
+        %224 = OpSGreaterThanEqual %bool %223 %int_0
+               OpSelectionMerge %225 None
+               OpBranchConditional %224 %226 %225
+        %226 = OpLabel
+        %227 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %228 = OpLoad %int %227
+        %229 = OpSGreaterThan %bool %228 %int_0
+               OpBranch %225
+        %225 = OpLabel
+        %230 = OpPhi %bool %224 %174 %229 %226
+               OpSelectionMerge %231 None
+               OpBranchConditional %230 %232 %231
+        %232 = OpLabel
+        %233 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %234 = OpLoad %int %233
+        %235 = OpISub %int %234 %int_2
+        %236 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %237 = OpLoad %int %236
+        %238 = OpIMul %int %237 %int_16
+        %239 = OpIAdd %int %235 %238
+        %240 = OpAccessChain %_ptr_Private_int %map %239
+        %241 = OpLoad %int %240
+        %242 = OpIEqual %bool %241 %int_0
+               OpBranch %231
+        %231 = OpLabel
+        %243 = OpPhi %bool %230 %225 %242 %232
+               OpSelectionMerge %244 None
+               OpBranchConditional %243 %245 %244
+        %245 = OpLabel
+        %246 = OpLoad %int %d
+        %247 = OpISub %int %246 %int_1
+               OpStore %d %247
+        %248 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %249 = OpLoad %int %248
+        %250 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %251 = OpLoad %int %250
+        %252 = OpIMul %int %251 %int_16
+        %253 = OpIAdd %int %249 %252
+        %254 = OpAccessChain %_ptr_Private_int %map %253
+               OpStore %254 %int_1
+        %255 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %256 = OpLoad %int %255
+        %257 = OpISub %int %256 %int_1
+        %258 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %259 = OpLoad %int %258
+        %260 = OpIMul %int %259 %int_16
+        %261 = OpIAdd %int %257 %260
+        %262 = OpAccessChain %_ptr_Private_int %map %261
+               OpStore %262 %int_1
+        %263 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %264 = OpLoad %int %263
+        %265 = OpISub %int %264 %int_2
+        %266 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %267 = OpLoad %int %266
+        %268 = OpIMul %int %267 %int_16
+        %269 = OpIAdd %int %265 %268
+        %270 = OpAccessChain %_ptr_Private_int %map %269
+               OpStore %270 %int_1
+        %271 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %272 = OpLoad %int %271
+        %273 = OpISub %int %272 %int_2
+        %274 = OpAccessChain %_ptr_Function_int %p %uint_0
+               OpStore %274 %273
+               OpBranch %244
+        %244 = OpLabel
+        %275 = OpLoad %int %d
+        %276 = OpSGreaterThanEqual %bool %275 %int_0
+               OpSelectionMerge %277 None
+               OpBranchConditional %276 %278 %277
+        %278 = OpLabel
+        %279 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %280 = OpLoad %int %279
+        %281 = OpSGreaterThan %bool %280 %int_0
+               OpBranch %277
+        %277 = OpLabel
+        %282 = OpPhi %bool %276 %244 %281 %278
+               OpSelectionMerge %283 None
+               OpBranchConditional %282 %284 %283
+        %284 = OpLabel
+        %285 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %286 = OpLoad %int %285
+        %287 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %288 = OpLoad %int %287
+        %289 = OpISub %int %288 %int_2
+        %290 = OpIMul %int %289 %int_16
+        %291 = OpLoad %_arr_int_uint_256 %map
+               OpStore %map %57
+               OpStore %map %291
+        %292 = OpIAdd %int %286 %290
+        %293 = OpAccessChain %_ptr_Private_int %map %292
+        %294 = OpLoad %int %293
+        %295 = OpIEqual %bool %294 %int_0
+               OpBranch %283
+        %283 = OpLabel
+        %296 = OpPhi %bool %282 %277 %295 %284
+               OpSelectionMerge %297 None
+               OpBranchConditional %296 %298 %297
+        %298 = OpLabel
+        %299 = OpLoad %int %d
+        %300 = OpISub %int %299 %int_1
+               OpStore %d %300
+        %301 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %302 = OpLoad %int %301
+        %303 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %304 = OpLoad %int %303
+        %305 = OpIMul %int %304 %int_16
+        %306 = OpIAdd %int %302 %305
+        %307 = OpAccessChain %_ptr_Private_int %map %306
+               OpStore %307 %int_1
+        %308 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %309 = OpLoad %int %308
+        %310 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %311 = OpLoad %int %310
+        %312 = OpISub %int %311 %int_1
+        %313 = OpIMul %int %312 %int_16
+        %314 = OpIAdd %int %309 %313
+        %315 = OpAccessChain %_ptr_Private_int %map %314
+               OpStore %315 %int_1
+        %316 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %317 = OpLoad %int %316
+        %318 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %319 = OpLoad %int %318
+        %320 = OpISub %int %319 %int_2
+        %321 = OpLoad %_arr_int_uint_256 %map
+               OpStore %map %57
+               OpStore %map %321
+        %322 = OpIMul %int %320 %int_16
+        %323 = OpIAdd %int %317 %322
+        %324 = OpAccessChain %_ptr_Private_int %map %323
+               OpStore %324 %int_1
+        %325 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %326 = OpLoad %int %325
+        %327 = OpISub %int %326 %int_2
+        %328 = OpAccessChain %_ptr_Function_int %p %uint_1
+               OpStore %328 %327
+               OpBranch %297
+        %297 = OpLabel
+        %329 = OpLoad %int %d
+        %330 = OpSGreaterThanEqual %bool %329 %int_0
+               OpSelectionMerge %331 None
+               OpBranchConditional %330 %332 %331
+        %332 = OpLabel
+        %333 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %334 = OpLoad %int %333
+        %335 = OpSLessThan %bool %334 %int_14
+               OpBranch %331
+        %331 = OpLabel
+        %336 = OpPhi %bool %330 %297 %335 %332
+               OpSelectionMerge %337 None
+               OpBranchConditional %336 %338 %337
+        %338 = OpLabel
+        %339 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %340 = OpLoad %int %339
+        %341 = OpIAdd %int %340 %int_2
+        %342 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %343 = OpLoad %int %342
+        %344 = OpIMul %int %343 %int_16
+        %345 = OpIAdd %int %341 %344
+        %346 = OpAccessChain %_ptr_Private_int %map %345
+        %347 = OpLoad %int %346
+        %348 = OpIEqual %bool %347 %int_0
+               OpBranch %337
+        %337 = OpLabel
+        %349 = OpPhi %bool %336 %331 %348 %338
+               OpSelectionMerge %350 None
+               OpBranchConditional %349 %351 %350
+        %351 = OpLabel
+        %352 = OpLoad %int %d
+        %353 = OpISub %int %352 %int_1
+               OpStore %d %353
+        %354 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %355 = OpLoad %int %354
+        %356 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %357 = OpLoad %int %356
+        %358 = OpIMul %int %357 %int_16
+        %359 = OpIAdd %int %355 %358
+        %360 = OpAccessChain %_ptr_Private_int %map %359
+               OpStore %360 %int_1
+        %361 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %362 = OpLoad %int %361
+        %363 = OpIAdd %int %362 %int_1
+        %364 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %365 = OpLoad %int %364
+        %366 = OpIMul %int %365 %int_16
+        %367 = OpIAdd %int %363 %366
+        %368 = OpAccessChain %_ptr_Private_int %map %367
+               OpStore %368 %int_1
+        %369 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %370 = OpLoad %int %369
+        %371 = OpIAdd %int %370 %int_2
+        %372 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %373 = OpLoad %int %372
+        %374 = OpIMul %int %373 %int_16
+        %375 = OpIAdd %int %371 %374
+        %376 = OpAccessChain %_ptr_Private_int %map %375
+               OpStore %376 %int_1
+        %377 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %378 = OpLoad %int %377
+        %379 = OpIAdd %int %378 %int_2
+        %380 = OpAccessChain %_ptr_Function_int %p %uint_0
+               OpStore %380 %379
+               OpBranch %350
+        %350 = OpLabel
+        %381 = OpLoad %int %d
+        %382 = OpSGreaterThanEqual %bool %381 %int_0
+               OpSelectionMerge %383 None
+               OpBranchConditional %382 %384 %383
+        %384 = OpLabel
+        %385 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %386 = OpLoad %int %385
+        %387 = OpSLessThan %bool %386 %int_14
+               OpBranch %383
+        %383 = OpLabel
+        %388 = OpPhi %bool %382 %350 %387 %384
+               OpSelectionMerge %389 None
+               OpBranchConditional %388 %390 %389
+        %390 = OpLabel
+        %391 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %392 = OpLoad %int %391
+        %393 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %394 = OpLoad %int %393
+        %395 = OpIAdd %int %394 %int_2
+        %396 = OpIMul %int %395 %int_16
+        %397 = OpIAdd %int %392 %396
+        %398 = OpAccessChain %_ptr_Private_int %map %397
+        %399 = OpLoad %int %398
+        %400 = OpIEqual %bool %399 %int_0
+               OpBranch %389
+        %389 = OpLabel
+        %401 = OpPhi %bool %388 %383 %400 %390
+               OpSelectionMerge %402 None
+               OpBranchConditional %401 %403 %402
+        %403 = OpLabel
+        %404 = OpLoad %int %d
+        %405 = OpISub %int %404 %int_1
+               OpStore %d %405
+        %406 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %407 = OpLoad %int %406
+        %408 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %409 = OpLoad %int %408
+        %410 = OpIMul %int %409 %int_16
+        %411 = OpIAdd %int %407 %410
+        %412 = OpAccessChain %_ptr_Private_int %map %411
+               OpStore %412 %int_1
+        %413 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %414 = OpLoad %int %413
+        %415 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %416 = OpLoad %int %415
+        %417 = OpIAdd %int %416 %int_1
+        %418 = OpIMul %int %417 %int_16
+        %419 = OpIAdd %int %414 %418
+        %420 = OpAccessChain %_ptr_Private_int %map %419
+               OpStore %420 %int_1
+        %421 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %422 = OpLoad %int %421
+        %423 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %424 = OpLoad %int %423
+        %425 = OpIAdd %int %424 %int_2
+        %426 = OpIMul %int %425 %int_16
+        %427 = OpIAdd %int %422 %426
+        %428 = OpAccessChain %_ptr_Private_int %map %427
+               OpStore %428 %int_1
+        %429 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %430 = OpLoad %int %429
+        %431 = OpIAdd %int %430 %int_2
+        %432 = OpAccessChain %_ptr_Function_int %p %uint_1
+               OpStore %432 %431
+               OpBranch %402
+        %402 = OpLabel
+               OpBranch %172
+        %172 = OpLabel
+        %433 = OpAccessChain %_ptr_Function_int %ipos %uint_1
+        %434 = OpLoad %int %433
+        %435 = OpIMul %int %434 %int_16
+        %436 = OpAccessChain %_ptr_Function_int %ipos %uint_0
+        %437 = OpLoad %int %436
+        %438 = OpIAdd %int %435 %437
+        %439 = OpAccessChain %_ptr_Private_int %map %438
+        %440 = OpLoad %int %439
+        %441 = OpIEqual %bool %440 %int_1
+               OpSelectionMerge %442 None
+               OpBranchConditional %441 %443 %442
+        %443 = OpLabel
+               OpStore %_GLF_color %53
+               OpReturn
+        %442 = OpLabel
+               OpBranch %86
+         %86 = OpLabel
+        %444 = OpLoad %bool %canwalk
+               OpBranchConditional %444 %84 %85
+         %85 = OpLabel
+               OpStore %_GLF_color %55
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/2.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/2.spvasm.expected.hlsl
new file mode 100644
index 0000000..cfe3abd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/2.spvasm.expected.hlsl
@@ -0,0 +1,300 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[1];
+};
+static int map[256] = (int[256])0;
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2 pos = float2(0.0f, 0.0f);
+  int2 ipos = int2(0, 0);
+  int i = 0;
+  int2 p = int2(0, 0);
+  bool canwalk = false;
+  int v = 0;
+  int directions = 0;
+  int j = 0;
+  int d = 0;
+  const float4 x_59 = gl_FragCoord;
+  const float2 x_62 = asfloat(x_7[0].xy);
+  pos = (float2(x_59.x, x_59.y) / x_62);
+  const float x_65 = pos.x;
+  const float x_69 = pos.y;
+  ipos = int2(int((x_65 * 16.0f)), int((x_69 * 16.0f)));
+  i = 0;
+  {
+    for(; (i < 256); i = (i + 1)) {
+      map[i] = 0;
+    }
+  }
+  p = int2(0, 0);
+  canwalk = true;
+  v = 0;
+  while (true) {
+    bool x_104 = false;
+    bool x_124 = false;
+    bool x_144 = false;
+    bool x_164 = false;
+    bool x_105_phi = false;
+    bool x_125_phi = false;
+    bool x_145_phi = false;
+    bool x_165_phi = false;
+    v = (v + 1);
+    directions = 0;
+    const int x_91 = p.x;
+    const bool x_92 = (x_91 > 0);
+    x_105_phi = x_92;
+    if (x_92) {
+      const int x_96 = p.x;
+      const int x_99 = p.y;
+      const int x_103 = map[((x_96 - 2) + (x_99 * 16))];
+      x_104 = (x_103 == 0);
+      x_105_phi = x_104;
+    }
+    if (x_105_phi) {
+      directions = (directions + 1);
+    }
+    const int x_111 = p.y;
+    const bool x_112 = (x_111 > 0);
+    x_125_phi = x_112;
+    if (x_112) {
+      const int x_116 = p.x;
+      const int x_118 = p.y;
+      const int x_123 = map[(x_116 + ((x_118 - 2) * 16))];
+      x_124 = (x_123 == 0);
+      x_125_phi = x_124;
+    }
+    if (x_125_phi) {
+      directions = (directions + 1);
+    }
+    const int x_131 = p.x;
+    const bool x_132 = (x_131 < 14);
+    x_145_phi = x_132;
+    if (x_132) {
+      const int x_136 = p.x;
+      const int x_139 = p.y;
+      const int x_143 = map[((x_136 + 2) + (x_139 * 16))];
+      x_144 = (x_143 == 0);
+      x_145_phi = x_144;
+    }
+    if (x_145_phi) {
+      directions = (directions + 1);
+    }
+    const int x_151 = p.y;
+    const bool x_152 = (x_151 < 14);
+    x_165_phi = x_152;
+    if (x_152) {
+      const int x_156 = p.x;
+      const int x_158 = p.y;
+      const int x_163 = map[(x_156 + ((x_158 + 2) * 16))];
+      x_164 = (x_163 == 0);
+      x_165_phi = x_164;
+    }
+    if (x_165_phi) {
+      directions = (directions + 1);
+    }
+    bool x_229 = false;
+    bool x_242 = false;
+    bool x_281 = false;
+    bool x_295 = false;
+    bool x_335 = false;
+    bool x_348 = false;
+    bool x_387 = false;
+    bool x_400 = false;
+    bool x_230_phi = false;
+    bool x_243_phi = false;
+    bool x_282_phi = false;
+    bool x_296_phi = false;
+    bool x_336_phi = false;
+    bool x_349_phi = false;
+    bool x_388_phi = false;
+    bool x_401_phi = false;
+    if ((directions == 0)) {
+      canwalk = false;
+      i = 0;
+      {
+        for(; (i < 8); i = (i + 1)) {
+          j = 0;
+          {
+            for(; (j < 8); j = (j + 1)) {
+              const int x_196 = map[((j * 2) + ((i * 2) * 16))];
+              if ((x_196 == 0)) {
+                p.x = (j * 2);
+                p.y = (i * 2);
+                canwalk = true;
+              }
+            }
+          }
+        }
+      }
+      const int x_211 = p.x;
+      const int x_213 = p.y;
+      map[(x_211 + (x_213 * 16))] = 1;
+    } else {
+      d = (v % directions);
+      v = (v + directions);
+      const bool x_224 = (d >= 0);
+      x_230_phi = x_224;
+      if (x_224) {
+        const int x_228 = p.x;
+        x_229 = (x_228 > 0);
+        x_230_phi = x_229;
+      }
+      const bool x_230 = x_230_phi;
+      x_243_phi = x_230;
+      if (x_230) {
+        const int x_234 = p.x;
+        const int x_237 = p.y;
+        const int x_241 = map[((x_234 - 2) + (x_237 * 16))];
+        x_242 = (x_241 == 0);
+        x_243_phi = x_242;
+      }
+      if (x_243_phi) {
+        d = (d - 1);
+        const int x_249 = p.x;
+        const int x_251 = p.y;
+        map[(x_249 + (x_251 * 16))] = 1;
+        const int x_256 = p.x;
+        const int x_259 = p.y;
+        map[((x_256 - 1) + (x_259 * 16))] = 1;
+        const int x_264 = p.x;
+        const int x_267 = p.y;
+        map[((x_264 - 2) + (x_267 * 16))] = 1;
+        const int x_272 = p.x;
+        p.x = (x_272 - 2);
+      }
+      const bool x_276 = (d >= 0);
+      x_282_phi = x_276;
+      if (x_276) {
+        const int x_280 = p.y;
+        x_281 = (x_280 > 0);
+        x_282_phi = x_281;
+      }
+      const bool x_282 = x_282_phi;
+      x_296_phi = x_282;
+      if (x_282) {
+        const int x_286 = p.x;
+        const int x_288 = p.y;
+        const int x_291[256] = map;
+        const int tint_symbol_5[256] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+        map = tint_symbol_5;
+        map = x_291;
+        const int x_294 = map[(x_286 + ((x_288 - 2) * 16))];
+        x_295 = (x_294 == 0);
+        x_296_phi = x_295;
+      }
+      if (x_296_phi) {
+        d = (d - 1);
+        const int x_302 = p.x;
+        const int x_304 = p.y;
+        map[(x_302 + (x_304 * 16))] = 1;
+        const int x_309 = p.x;
+        const int x_311 = p.y;
+        map[(x_309 + ((x_311 - 1) * 16))] = 1;
+        const int x_317 = p.x;
+        const int x_319 = p.y;
+        const int x_321[256] = map;
+        const int tint_symbol_6[256] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+        map = tint_symbol_6;
+        map = x_321;
+        map[(x_317 + ((x_319 - 2) * 16))] = 1;
+        const int x_326 = p.y;
+        p.y = (x_326 - 2);
+      }
+      const bool x_330 = (d >= 0);
+      x_336_phi = x_330;
+      if (x_330) {
+        const int x_334 = p.x;
+        x_335 = (x_334 < 14);
+        x_336_phi = x_335;
+      }
+      const bool x_336 = x_336_phi;
+      x_349_phi = x_336;
+      if (x_336) {
+        const int x_340 = p.x;
+        const int x_343 = p.y;
+        const int x_347 = map[((x_340 + 2) + (x_343 * 16))];
+        x_348 = (x_347 == 0);
+        x_349_phi = x_348;
+      }
+      if (x_349_phi) {
+        d = (d - 1);
+        const int x_355 = p.x;
+        const int x_357 = p.y;
+        map[(x_355 + (x_357 * 16))] = 1;
+        const int x_362 = p.x;
+        const int x_365 = p.y;
+        map[((x_362 + 1) + (x_365 * 16))] = 1;
+        const int x_370 = p.x;
+        const int x_373 = p.y;
+        map[((x_370 + 2) + (x_373 * 16))] = 1;
+        const int x_378 = p.x;
+        p.x = (x_378 + 2);
+      }
+      const bool x_382 = (d >= 0);
+      x_388_phi = x_382;
+      if (x_382) {
+        const int x_386 = p.y;
+        x_387 = (x_386 < 14);
+        x_388_phi = x_387;
+      }
+      const bool x_388 = x_388_phi;
+      x_401_phi = x_388;
+      if (x_388) {
+        const int x_392 = p.x;
+        const int x_394 = p.y;
+        const int x_399 = map[(x_392 + ((x_394 + 2) * 16))];
+        x_400 = (x_399 == 0);
+        x_401_phi = x_400;
+      }
+      if (x_401_phi) {
+        d = (d - 1);
+        const int x_407 = p.x;
+        const int x_409 = p.y;
+        map[(x_407 + (x_409 * 16))] = 1;
+        const int x_414 = p.x;
+        const int x_416 = p.y;
+        map[(x_414 + ((x_416 + 1) * 16))] = 1;
+        const int x_422 = p.x;
+        const int x_424 = p.y;
+        map[(x_422 + ((x_424 + 2) * 16))] = 1;
+        const int x_430 = p.y;
+        p.y = (x_430 + 2);
+      }
+    }
+    const int x_434 = ipos.y;
+    const int x_437 = ipos.x;
+    const int x_440 = map[((x_434 * 16) + x_437)];
+    if ((x_440 == 1)) {
+      x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+      return;
+    }
+    {
+      if (canwalk) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_GLF_color = float4(0.0f, 0.0f, 0.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_7 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_7;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/2.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/2.spvasm.expected.msl
new file mode 100644
index 0000000..b60fe95
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/2.spvasm.expected.msl
@@ -0,0 +1,355 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  int arr[256];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_7, thread tint_array_wrapper* const tint_symbol_8, thread float4* const tint_symbol_9) {
+  float2 pos = 0.0f;
+  int2 ipos = 0;
+  int i = 0;
+  int2 p = 0;
+  bool canwalk = false;
+  int v = 0;
+  int directions = 0;
+  int j = 0;
+  int d = 0;
+  float4 const x_59 = *(tint_symbol_7);
+  float2 const x_62 = x_7.resolution;
+  pos = (float2(x_59.x, x_59.y) / x_62);
+  float const x_65 = pos.x;
+  float const x_69 = pos.y;
+  ipos = int2(int((x_65 * 16.0f)), int((x_69 * 16.0f)));
+  i = 0;
+  while (true) {
+    int const x_77 = i;
+    if ((x_77 < 256)) {
+    } else {
+      break;
+    }
+    int const x_80 = i;
+    (*(tint_symbol_8)).arr[x_80] = 0;
+    {
+      int const x_82 = i;
+      i = (x_82 + 1);
+    }
+  }
+  p = int2(0, 0);
+  canwalk = true;
+  v = 0;
+  while (true) {
+    bool x_104 = false;
+    bool x_124 = false;
+    bool x_144 = false;
+    bool x_164 = false;
+    bool x_105_phi = false;
+    bool x_125_phi = false;
+    bool x_145_phi = false;
+    bool x_165_phi = false;
+    int const x_88 = v;
+    v = (x_88 + 1);
+    directions = 0;
+    int const x_91 = p.x;
+    bool const x_92 = (x_91 > 0);
+    x_105_phi = x_92;
+    if (x_92) {
+      int const x_96 = p.x;
+      int const x_99 = p.y;
+      int const x_103 = (*(tint_symbol_8)).arr[((x_96 - 2) + (x_99 * 16))];
+      x_104 = (x_103 == 0);
+      x_105_phi = x_104;
+    }
+    bool const x_105 = x_105_phi;
+    if (x_105) {
+      int const x_108 = directions;
+      directions = (x_108 + 1);
+    }
+    int const x_111 = p.y;
+    bool const x_112 = (x_111 > 0);
+    x_125_phi = x_112;
+    if (x_112) {
+      int const x_116 = p.x;
+      int const x_118 = p.y;
+      int const x_123 = (*(tint_symbol_8)).arr[(x_116 + ((x_118 - 2) * 16))];
+      x_124 = (x_123 == 0);
+      x_125_phi = x_124;
+    }
+    bool const x_125 = x_125_phi;
+    if (x_125) {
+      int const x_128 = directions;
+      directions = (x_128 + 1);
+    }
+    int const x_131 = p.x;
+    bool const x_132 = (x_131 < 14);
+    x_145_phi = x_132;
+    if (x_132) {
+      int const x_136 = p.x;
+      int const x_139 = p.y;
+      int const x_143 = (*(tint_symbol_8)).arr[((x_136 + 2) + (x_139 * 16))];
+      x_144 = (x_143 == 0);
+      x_145_phi = x_144;
+    }
+    bool const x_145 = x_145_phi;
+    if (x_145) {
+      int const x_148 = directions;
+      directions = (x_148 + 1);
+    }
+    int const x_151 = p.y;
+    bool const x_152 = (x_151 < 14);
+    x_165_phi = x_152;
+    if (x_152) {
+      int const x_156 = p.x;
+      int const x_158 = p.y;
+      int const x_163 = (*(tint_symbol_8)).arr[(x_156 + ((x_158 + 2) * 16))];
+      x_164 = (x_163 == 0);
+      x_165_phi = x_164;
+    }
+    bool const x_165 = x_165_phi;
+    if (x_165) {
+      int const x_168 = directions;
+      directions = (x_168 + 1);
+    }
+    bool x_229 = false;
+    bool x_242 = false;
+    bool x_281 = false;
+    bool x_295 = false;
+    bool x_335 = false;
+    bool x_348 = false;
+    bool x_387 = false;
+    bool x_400 = false;
+    bool x_230_phi = false;
+    bool x_243_phi = false;
+    bool x_282_phi = false;
+    bool x_296_phi = false;
+    bool x_336_phi = false;
+    bool x_349_phi = false;
+    bool x_388_phi = false;
+    bool x_401_phi = false;
+    int const x_170 = directions;
+    if ((x_170 == 0)) {
+      canwalk = false;
+      i = 0;
+      while (true) {
+        int const x_179 = i;
+        if ((x_179 < 8)) {
+        } else {
+          break;
+        }
+        j = 0;
+        while (true) {
+          int const x_186 = j;
+          if ((x_186 < 8)) {
+          } else {
+            break;
+          }
+          int const x_189 = j;
+          int const x_191 = i;
+          int const x_196 = (*(tint_symbol_8)).arr[((x_189 * 2) + ((x_191 * 2) * 16))];
+          if ((x_196 == 0)) {
+            int const x_200 = j;
+            p.x = (x_200 * 2);
+            int const x_203 = i;
+            p.y = (x_203 * 2);
+            canwalk = true;
+          }
+          {
+            int const x_206 = j;
+            j = (x_206 + 1);
+          }
+        }
+        {
+          int const x_208 = i;
+          i = (x_208 + 1);
+        }
+      }
+      int const x_211 = p.x;
+      int const x_213 = p.y;
+      (*(tint_symbol_8)).arr[(x_211 + (x_213 * 16))] = 1;
+    } else {
+      int const x_217 = v;
+      int const x_218 = directions;
+      d = (x_217 % x_218);
+      int const x_220 = directions;
+      int const x_221 = v;
+      v = (x_221 + x_220);
+      int const x_223 = d;
+      bool const x_224 = (x_223 >= 0);
+      x_230_phi = x_224;
+      if (x_224) {
+        int const x_228 = p.x;
+        x_229 = (x_228 > 0);
+        x_230_phi = x_229;
+      }
+      bool const x_230 = x_230_phi;
+      x_243_phi = x_230;
+      if (x_230) {
+        int const x_234 = p.x;
+        int const x_237 = p.y;
+        int const x_241 = (*(tint_symbol_8)).arr[((x_234 - 2) + (x_237 * 16))];
+        x_242 = (x_241 == 0);
+        x_243_phi = x_242;
+      }
+      bool const x_243 = x_243_phi;
+      if (x_243) {
+        int const x_246 = d;
+        d = (x_246 - 1);
+        int const x_249 = p.x;
+        int const x_251 = p.y;
+        (*(tint_symbol_8)).arr[(x_249 + (x_251 * 16))] = 1;
+        int const x_256 = p.x;
+        int const x_259 = p.y;
+        (*(tint_symbol_8)).arr[((x_256 - 1) + (x_259 * 16))] = 1;
+        int const x_264 = p.x;
+        int const x_267 = p.y;
+        (*(tint_symbol_8)).arr[((x_264 - 2) + (x_267 * 16))] = 1;
+        int const x_272 = p.x;
+        p.x = (x_272 - 2);
+      }
+      int const x_275 = d;
+      bool const x_276 = (x_275 >= 0);
+      x_282_phi = x_276;
+      if (x_276) {
+        int const x_280 = p.y;
+        x_281 = (x_280 > 0);
+        x_282_phi = x_281;
+      }
+      bool const x_282 = x_282_phi;
+      x_296_phi = x_282;
+      if (x_282) {
+        int const x_286 = p.x;
+        int const x_288 = p.y;
+        tint_array_wrapper const x_291 = *(tint_symbol_8);
+        tint_array_wrapper const tint_symbol_4 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+        *(tint_symbol_8) = tint_symbol_4;
+        *(tint_symbol_8) = x_291;
+        int const x_294 = (*(tint_symbol_8)).arr[(x_286 + ((x_288 - 2) * 16))];
+        x_295 = (x_294 == 0);
+        x_296_phi = x_295;
+      }
+      bool const x_296 = x_296_phi;
+      if (x_296) {
+        int const x_299 = d;
+        d = (x_299 - 1);
+        int const x_302 = p.x;
+        int const x_304 = p.y;
+        (*(tint_symbol_8)).arr[(x_302 + (x_304 * 16))] = 1;
+        int const x_309 = p.x;
+        int const x_311 = p.y;
+        (*(tint_symbol_8)).arr[(x_309 + ((x_311 - 1) * 16))] = 1;
+        int const x_317 = p.x;
+        int const x_319 = p.y;
+        tint_array_wrapper const x_321 = *(tint_symbol_8);
+        tint_array_wrapper const tint_symbol_5 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+        *(tint_symbol_8) = tint_symbol_5;
+        *(tint_symbol_8) = x_321;
+        (*(tint_symbol_8)).arr[(x_317 + ((x_319 - 2) * 16))] = 1;
+        int const x_326 = p.y;
+        p.y = (x_326 - 2);
+      }
+      int const x_329 = d;
+      bool const x_330 = (x_329 >= 0);
+      x_336_phi = x_330;
+      if (x_330) {
+        int const x_334 = p.x;
+        x_335 = (x_334 < 14);
+        x_336_phi = x_335;
+      }
+      bool const x_336 = x_336_phi;
+      x_349_phi = x_336;
+      if (x_336) {
+        int const x_340 = p.x;
+        int const x_343 = p.y;
+        int const x_347 = (*(tint_symbol_8)).arr[((x_340 + 2) + (x_343 * 16))];
+        x_348 = (x_347 == 0);
+        x_349_phi = x_348;
+      }
+      bool const x_349 = x_349_phi;
+      if (x_349) {
+        int const x_352 = d;
+        d = (x_352 - 1);
+        int const x_355 = p.x;
+        int const x_357 = p.y;
+        (*(tint_symbol_8)).arr[(x_355 + (x_357 * 16))] = 1;
+        int const x_362 = p.x;
+        int const x_365 = p.y;
+        (*(tint_symbol_8)).arr[((x_362 + 1) + (x_365 * 16))] = 1;
+        int const x_370 = p.x;
+        int const x_373 = p.y;
+        (*(tint_symbol_8)).arr[((x_370 + 2) + (x_373 * 16))] = 1;
+        int const x_378 = p.x;
+        p.x = (x_378 + 2);
+      }
+      int const x_381 = d;
+      bool const x_382 = (x_381 >= 0);
+      x_388_phi = x_382;
+      if (x_382) {
+        int const x_386 = p.y;
+        x_387 = (x_386 < 14);
+        x_388_phi = x_387;
+      }
+      bool const x_388 = x_388_phi;
+      x_401_phi = x_388;
+      if (x_388) {
+        int const x_392 = p.x;
+        int const x_394 = p.y;
+        int const x_399 = (*(tint_symbol_8)).arr[(x_392 + ((x_394 + 2) * 16))];
+        x_400 = (x_399 == 0);
+        x_401_phi = x_400;
+      }
+      bool const x_401 = x_401_phi;
+      if (x_401) {
+        int const x_404 = d;
+        d = (x_404 - 1);
+        int const x_407 = p.x;
+        int const x_409 = p.y;
+        (*(tint_symbol_8)).arr[(x_407 + (x_409 * 16))] = 1;
+        int const x_414 = p.x;
+        int const x_416 = p.y;
+        (*(tint_symbol_8)).arr[(x_414 + ((x_416 + 1) * 16))] = 1;
+        int const x_422 = p.x;
+        int const x_424 = p.y;
+        (*(tint_symbol_8)).arr[(x_422 + ((x_424 + 2) * 16))] = 1;
+        int const x_430 = p.y;
+        p.y = (x_430 + 2);
+      }
+    }
+    int const x_434 = ipos.y;
+    int const x_437 = ipos.x;
+    int const x_440 = (*(tint_symbol_8)).arr[((x_434 * 16) + x_437)];
+    if ((x_440 == 1)) {
+      *(tint_symbol_9) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+      return;
+    }
+    {
+      bool const x_444 = canwalk;
+      if (x_444) {
+      } else {
+        break;
+      }
+    }
+  }
+  *(tint_symbol_9) = float4(0.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_10 = 0.0f;
+  thread tint_array_wrapper tint_symbol_11 = {};
+  thread float4 tint_symbol_12 = 0.0f;
+  tint_symbol_10 = gl_FragCoord_param;
+  main_1(x_7, &(tint_symbol_10), &(tint_symbol_11), &(tint_symbol_12));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_12};
+  tint_symbol_2 const tint_symbol_6 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/2.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/2.spvasm.expected.spvasm
new file mode 100644
index 0000000..577b0fa
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/2.spvasm.expected.spvasm
@@ -0,0 +1,782 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 512
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_7 "x_7"
+               OpName %map "map"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %pos "pos"
+               OpName %ipos "ipos"
+               OpName %i "i"
+               OpName %p "p"
+               OpName %canwalk "canwalk"
+               OpName %v "v"
+               OpName %directions "directions"
+               OpName %j "j"
+               OpName %d "d"
+               OpName %x_104 "x_104"
+               OpName %x_124 "x_124"
+               OpName %x_144 "x_144"
+               OpName %x_164 "x_164"
+               OpName %x_105_phi "x_105_phi"
+               OpName %x_125_phi "x_125_phi"
+               OpName %x_145_phi "x_145_phi"
+               OpName %x_165_phi "x_165_phi"
+               OpName %x_229 "x_229"
+               OpName %x_242 "x_242"
+               OpName %x_281 "x_281"
+               OpName %x_295 "x_295"
+               OpName %x_335 "x_335"
+               OpName %x_348 "x_348"
+               OpName %x_387 "x_387"
+               OpName %x_400 "x_400"
+               OpName %x_230_phi "x_230_phi"
+               OpName %x_243_phi "x_243_phi"
+               OpName %x_282_phi "x_282_phi"
+               OpName %x_296_phi "x_296_phi"
+               OpName %x_336_phi "x_336_phi"
+               OpName %x_349_phi "x_349_phi"
+               OpName %x_388_phi "x_388_phi"
+               OpName %x_401_phi "x_401_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %_arr_int_uint_256 ArrayStride 4
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+   %uint_256 = OpConstant %uint 256
+%_arr_int_uint_256 = OpTypeArray %int %uint_256
+%_ptr_Private__arr_int_uint_256 = OpTypePointer Private %_arr_int_uint_256
+         %16 = OpConstantNull %_arr_int_uint_256
+        %map = OpVariable %_ptr_Private__arr_int_uint_256 Private %16
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %22 = OpTypeFunction %void
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %28 = OpConstantNull %v2float
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %32 = OpConstantNull %v2int
+%_ptr_Function_int = OpTypePointer Function %int
+         %35 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %40 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+   %float_16 = OpConstant %float 16
+      %int_0 = OpConstant %int 0
+    %int_256 = OpConstant %int 256
+%_ptr_Private_int = OpTypePointer Private %int
+      %int_1 = OpConstant %int 1
+         %83 = OpConstantComposite %v2int %int_0 %int_0
+       %true = OpConstantTrue %bool
+      %int_2 = OpConstant %int 2
+     %int_16 = OpConstant %int 16
+     %int_14 = OpConstant %int 14
+      %false = OpConstantFalse %bool
+      %int_8 = OpConstant %int 8
+        %331 = OpConstantComposite %_arr_int_uint_256 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0
+    %float_1 = OpConstant %float 1
+        %492 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+    %float_0 = OpConstant %float 0
+        %498 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %499 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %22
+         %25 = OpLabel
+        %pos = OpVariable %_ptr_Function_v2float Function %28
+       %ipos = OpVariable %_ptr_Function_v2int Function %32
+          %i = OpVariable %_ptr_Function_int Function %35
+          %p = OpVariable %_ptr_Function_v2int Function %32
+    %canwalk = OpVariable %_ptr_Function_bool Function %40
+          %v = OpVariable %_ptr_Function_int Function %35
+ %directions = OpVariable %_ptr_Function_int Function %35
+          %j = OpVariable %_ptr_Function_int Function %35
+          %d = OpVariable %_ptr_Function_int Function %35
+      %x_104 = OpVariable %_ptr_Function_bool Function %40
+      %x_124 = OpVariable %_ptr_Function_bool Function %40
+      %x_144 = OpVariable %_ptr_Function_bool Function %40
+      %x_164 = OpVariable %_ptr_Function_bool Function %40
+  %x_105_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_125_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_145_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_165_phi = OpVariable %_ptr_Function_bool Function %40
+      %x_229 = OpVariable %_ptr_Function_bool Function %40
+      %x_242 = OpVariable %_ptr_Function_bool Function %40
+      %x_281 = OpVariable %_ptr_Function_bool Function %40
+      %x_295 = OpVariable %_ptr_Function_bool Function %40
+      %x_335 = OpVariable %_ptr_Function_bool Function %40
+      %x_348 = OpVariable %_ptr_Function_bool Function %40
+      %x_387 = OpVariable %_ptr_Function_bool Function %40
+      %x_400 = OpVariable %_ptr_Function_bool Function %40
+  %x_230_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_243_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_282_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_296_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_336_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_349_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_388_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_401_phi = OpVariable %_ptr_Function_bool Function %40
+         %45 = OpLoad %v4float %gl_FragCoord
+         %48 = OpAccessChain %_ptr_Uniform_v2float %x_7 %uint_0
+         %49 = OpLoad %v2float %48
+         %50 = OpCompositeExtract %float %45 0
+         %51 = OpCompositeExtract %float %45 1
+         %52 = OpCompositeConstruct %v2float %50 %51
+         %53 = OpFDiv %v2float %52 %49
+               OpStore %pos %53
+         %55 = OpAccessChain %_ptr_Function_float %pos %uint_0
+         %56 = OpLoad %float %55
+         %58 = OpAccessChain %_ptr_Function_float %pos %uint_1
+         %59 = OpLoad %float %58
+         %62 = OpFMul %float %56 %float_16
+         %60 = OpConvertFToS %int %62
+         %64 = OpFMul %float %59 %float_16
+         %63 = OpConvertFToS %int %64
+         %65 = OpCompositeConstruct %v2int %60 %63
+               OpStore %ipos %65
+               OpStore %i %int_0
+               OpBranch %67
+         %67 = OpLabel
+               OpLoopMerge %68 %69 None
+               OpBranch %70
+         %70 = OpLabel
+         %71 = OpLoad %int %i
+         %73 = OpSLessThan %bool %71 %int_256
+               OpSelectionMerge %74 None
+               OpBranchConditional %73 %75 %76
+         %75 = OpLabel
+               OpBranch %74
+         %76 = OpLabel
+               OpBranch %68
+         %74 = OpLabel
+         %77 = OpLoad %int %i
+         %79 = OpAccessChain %_ptr_Private_int %map %77
+               OpStore %79 %int_0
+               OpBranch %69
+         %69 = OpLabel
+         %80 = OpLoad %int %i
+         %82 = OpIAdd %int %80 %int_1
+               OpStore %i %82
+               OpBranch %67
+         %68 = OpLabel
+               OpStore %p %83
+               OpStore %canwalk %true
+               OpStore %v %int_0
+               OpBranch %85
+         %85 = OpLabel
+               OpLoopMerge %86 %87 None
+               OpBranch %88
+         %88 = OpLabel
+         %97 = OpLoad %int %v
+         %98 = OpIAdd %int %97 %int_1
+               OpStore %v %98
+               OpStore %directions %int_0
+         %99 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %100 = OpLoad %int %99
+        %101 = OpSGreaterThan %bool %100 %int_0
+               OpStore %x_105_phi %101
+               OpSelectionMerge %102 None
+               OpBranchConditional %101 %103 %102
+        %103 = OpLabel
+        %104 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %105 = OpLoad %int %104
+        %106 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %107 = OpLoad %int %106
+        %109 = OpISub %int %105 %int_2
+        %111 = OpIMul %int %107 %int_16
+        %112 = OpIAdd %int %109 %111
+        %113 = OpAccessChain %_ptr_Private_int %map %112
+        %114 = OpLoad %int %113
+        %115 = OpIEqual %bool %114 %int_0
+               OpStore %x_104 %115
+        %116 = OpLoad %bool %x_104
+               OpStore %x_105_phi %116
+               OpBranch %102
+        %102 = OpLabel
+        %117 = OpLoad %bool %x_105_phi
+               OpSelectionMerge %118 None
+               OpBranchConditional %117 %119 %118
+        %119 = OpLabel
+        %120 = OpLoad %int %directions
+        %121 = OpIAdd %int %120 %int_1
+               OpStore %directions %121
+               OpBranch %118
+        %118 = OpLabel
+        %122 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %123 = OpLoad %int %122
+        %124 = OpSGreaterThan %bool %123 %int_0
+               OpStore %x_125_phi %124
+               OpSelectionMerge %125 None
+               OpBranchConditional %124 %126 %125
+        %126 = OpLabel
+        %127 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %128 = OpLoad %int %127
+        %129 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %130 = OpLoad %int %129
+        %131 = OpISub %int %130 %int_2
+        %132 = OpIMul %int %131 %int_16
+        %133 = OpIAdd %int %128 %132
+        %134 = OpAccessChain %_ptr_Private_int %map %133
+        %135 = OpLoad %int %134
+        %136 = OpIEqual %bool %135 %int_0
+               OpStore %x_124 %136
+        %137 = OpLoad %bool %x_124
+               OpStore %x_125_phi %137
+               OpBranch %125
+        %125 = OpLabel
+        %138 = OpLoad %bool %x_125_phi
+               OpSelectionMerge %139 None
+               OpBranchConditional %138 %140 %139
+        %140 = OpLabel
+        %141 = OpLoad %int %directions
+        %142 = OpIAdd %int %141 %int_1
+               OpStore %directions %142
+               OpBranch %139
+        %139 = OpLabel
+        %143 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %144 = OpLoad %int %143
+        %146 = OpSLessThan %bool %144 %int_14
+               OpStore %x_145_phi %146
+               OpSelectionMerge %147 None
+               OpBranchConditional %146 %148 %147
+        %148 = OpLabel
+        %149 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %150 = OpLoad %int %149
+        %151 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %152 = OpLoad %int %151
+        %153 = OpIAdd %int %150 %int_2
+        %154 = OpIMul %int %152 %int_16
+        %155 = OpIAdd %int %153 %154
+        %156 = OpAccessChain %_ptr_Private_int %map %155
+        %157 = OpLoad %int %156
+        %158 = OpIEqual %bool %157 %int_0
+               OpStore %x_144 %158
+        %159 = OpLoad %bool %x_144
+               OpStore %x_145_phi %159
+               OpBranch %147
+        %147 = OpLabel
+        %160 = OpLoad %bool %x_145_phi
+               OpSelectionMerge %161 None
+               OpBranchConditional %160 %162 %161
+        %162 = OpLabel
+        %163 = OpLoad %int %directions
+        %164 = OpIAdd %int %163 %int_1
+               OpStore %directions %164
+               OpBranch %161
+        %161 = OpLabel
+        %165 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %166 = OpLoad %int %165
+        %167 = OpSLessThan %bool %166 %int_14
+               OpStore %x_165_phi %167
+               OpSelectionMerge %168 None
+               OpBranchConditional %167 %169 %168
+        %169 = OpLabel
+        %170 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %171 = OpLoad %int %170
+        %172 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %173 = OpLoad %int %172
+        %174 = OpIAdd %int %173 %int_2
+        %175 = OpIMul %int %174 %int_16
+        %176 = OpIAdd %int %171 %175
+        %177 = OpAccessChain %_ptr_Private_int %map %176
+        %178 = OpLoad %int %177
+        %179 = OpIEqual %bool %178 %int_0
+               OpStore %x_164 %179
+        %180 = OpLoad %bool %x_164
+               OpStore %x_165_phi %180
+               OpBranch %168
+        %168 = OpLabel
+        %181 = OpLoad %bool %x_165_phi
+               OpSelectionMerge %182 None
+               OpBranchConditional %181 %183 %182
+        %183 = OpLabel
+        %184 = OpLoad %int %directions
+        %185 = OpIAdd %int %184 %int_1
+               OpStore %directions %185
+               OpBranch %182
+        %182 = OpLabel
+        %202 = OpLoad %int %directions
+        %203 = OpIEqual %bool %202 %int_0
+               OpSelectionMerge %204 None
+               OpBranchConditional %203 %205 %206
+        %205 = OpLabel
+               OpStore %canwalk %false
+               OpStore %i %int_0
+               OpBranch %208
+        %208 = OpLabel
+               OpLoopMerge %209 %210 None
+               OpBranch %211
+        %211 = OpLabel
+        %212 = OpLoad %int %i
+        %214 = OpSLessThan %bool %212 %int_8
+               OpSelectionMerge %215 None
+               OpBranchConditional %214 %216 %217
+        %216 = OpLabel
+               OpBranch %215
+        %217 = OpLabel
+               OpBranch %209
+        %215 = OpLabel
+               OpStore %j %int_0
+               OpBranch %218
+        %218 = OpLabel
+               OpLoopMerge %219 %220 None
+               OpBranch %221
+        %221 = OpLabel
+        %222 = OpLoad %int %j
+        %223 = OpSLessThan %bool %222 %int_8
+               OpSelectionMerge %224 None
+               OpBranchConditional %223 %225 %226
+        %225 = OpLabel
+               OpBranch %224
+        %226 = OpLabel
+               OpBranch %219
+        %224 = OpLabel
+        %227 = OpLoad %int %j
+        %228 = OpLoad %int %i
+        %229 = OpIMul %int %227 %int_2
+        %230 = OpIMul %int %228 %int_2
+        %231 = OpIMul %int %230 %int_16
+        %232 = OpIAdd %int %229 %231
+        %233 = OpAccessChain %_ptr_Private_int %map %232
+        %234 = OpLoad %int %233
+        %235 = OpIEqual %bool %234 %int_0
+               OpSelectionMerge %236 None
+               OpBranchConditional %235 %237 %236
+        %237 = OpLabel
+        %238 = OpLoad %int %j
+        %239 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %240 = OpIMul %int %238 %int_2
+               OpStore %239 %240
+        %241 = OpLoad %int %i
+        %242 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %243 = OpIMul %int %241 %int_2
+               OpStore %242 %243
+               OpStore %canwalk %true
+               OpBranch %236
+        %236 = OpLabel
+               OpBranch %220
+        %220 = OpLabel
+        %244 = OpLoad %int %j
+        %245 = OpIAdd %int %244 %int_1
+               OpStore %j %245
+               OpBranch %218
+        %219 = OpLabel
+               OpBranch %210
+        %210 = OpLabel
+        %246 = OpLoad %int %i
+        %247 = OpIAdd %int %246 %int_1
+               OpStore %i %247
+               OpBranch %208
+        %209 = OpLabel
+        %248 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %249 = OpLoad %int %248
+        %250 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %251 = OpLoad %int %250
+        %252 = OpIMul %int %251 %int_16
+        %253 = OpIAdd %int %249 %252
+        %254 = OpAccessChain %_ptr_Private_int %map %253
+               OpStore %254 %int_1
+               OpBranch %204
+        %206 = OpLabel
+        %255 = OpLoad %int %v
+        %256 = OpLoad %int %directions
+        %257 = OpSMod %int %255 %256
+               OpStore %d %257
+        %258 = OpLoad %int %directions
+        %259 = OpLoad %int %v
+        %260 = OpIAdd %int %259 %258
+               OpStore %v %260
+        %261 = OpLoad %int %d
+        %262 = OpSGreaterThanEqual %bool %261 %int_0
+               OpStore %x_230_phi %262
+               OpSelectionMerge %263 None
+               OpBranchConditional %262 %264 %263
+        %264 = OpLabel
+        %265 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %266 = OpLoad %int %265
+        %267 = OpSGreaterThan %bool %266 %int_0
+               OpStore %x_229 %267
+        %268 = OpLoad %bool %x_229
+               OpStore %x_230_phi %268
+               OpBranch %263
+        %263 = OpLabel
+        %269 = OpLoad %bool %x_230_phi
+               OpStore %x_243_phi %269
+               OpSelectionMerge %270 None
+               OpBranchConditional %269 %271 %270
+        %271 = OpLabel
+        %272 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %273 = OpLoad %int %272
+        %274 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %275 = OpLoad %int %274
+        %276 = OpISub %int %273 %int_2
+        %277 = OpIMul %int %275 %int_16
+        %278 = OpIAdd %int %276 %277
+        %279 = OpAccessChain %_ptr_Private_int %map %278
+        %280 = OpLoad %int %279
+        %281 = OpIEqual %bool %280 %int_0
+               OpStore %x_242 %281
+        %282 = OpLoad %bool %x_242
+               OpStore %x_243_phi %282
+               OpBranch %270
+        %270 = OpLabel
+        %283 = OpLoad %bool %x_243_phi
+               OpSelectionMerge %284 None
+               OpBranchConditional %283 %285 %284
+        %285 = OpLabel
+        %286 = OpLoad %int %d
+        %287 = OpISub %int %286 %int_1
+               OpStore %d %287
+        %288 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %289 = OpLoad %int %288
+        %290 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %291 = OpLoad %int %290
+        %292 = OpIMul %int %291 %int_16
+        %293 = OpIAdd %int %289 %292
+        %294 = OpAccessChain %_ptr_Private_int %map %293
+               OpStore %294 %int_1
+        %295 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %296 = OpLoad %int %295
+        %297 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %298 = OpLoad %int %297
+        %299 = OpISub %int %296 %int_1
+        %300 = OpIMul %int %298 %int_16
+        %301 = OpIAdd %int %299 %300
+        %302 = OpAccessChain %_ptr_Private_int %map %301
+               OpStore %302 %int_1
+        %303 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %304 = OpLoad %int %303
+        %305 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %306 = OpLoad %int %305
+        %307 = OpISub %int %304 %int_2
+        %308 = OpIMul %int %306 %int_16
+        %309 = OpIAdd %int %307 %308
+        %310 = OpAccessChain %_ptr_Private_int %map %309
+               OpStore %310 %int_1
+        %311 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %312 = OpLoad %int %311
+        %313 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %314 = OpISub %int %312 %int_2
+               OpStore %313 %314
+               OpBranch %284
+        %284 = OpLabel
+        %315 = OpLoad %int %d
+        %316 = OpSGreaterThanEqual %bool %315 %int_0
+               OpStore %x_282_phi %316
+               OpSelectionMerge %317 None
+               OpBranchConditional %316 %318 %317
+        %318 = OpLabel
+        %319 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %320 = OpLoad %int %319
+        %321 = OpSGreaterThan %bool %320 %int_0
+               OpStore %x_281 %321
+        %322 = OpLoad %bool %x_281
+               OpStore %x_282_phi %322
+               OpBranch %317
+        %317 = OpLabel
+        %323 = OpLoad %bool %x_282_phi
+               OpStore %x_296_phi %323
+               OpSelectionMerge %324 None
+               OpBranchConditional %323 %325 %324
+        %325 = OpLabel
+        %326 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %327 = OpLoad %int %326
+        %328 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %329 = OpLoad %int %328
+        %330 = OpLoad %_arr_int_uint_256 %map
+               OpStore %map %331
+               OpStore %map %330
+        %332 = OpISub %int %329 %int_2
+        %333 = OpIMul %int %332 %int_16
+        %334 = OpIAdd %int %327 %333
+        %335 = OpAccessChain %_ptr_Private_int %map %334
+        %336 = OpLoad %int %335
+        %337 = OpIEqual %bool %336 %int_0
+               OpStore %x_295 %337
+        %338 = OpLoad %bool %x_295
+               OpStore %x_296_phi %338
+               OpBranch %324
+        %324 = OpLabel
+        %339 = OpLoad %bool %x_296_phi
+               OpSelectionMerge %340 None
+               OpBranchConditional %339 %341 %340
+        %341 = OpLabel
+        %342 = OpLoad %int %d
+        %343 = OpISub %int %342 %int_1
+               OpStore %d %343
+        %344 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %345 = OpLoad %int %344
+        %346 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %347 = OpLoad %int %346
+        %348 = OpIMul %int %347 %int_16
+        %349 = OpIAdd %int %345 %348
+        %350 = OpAccessChain %_ptr_Private_int %map %349
+               OpStore %350 %int_1
+        %351 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %352 = OpLoad %int %351
+        %353 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %354 = OpLoad %int %353
+        %355 = OpISub %int %354 %int_1
+        %356 = OpIMul %int %355 %int_16
+        %357 = OpIAdd %int %352 %356
+        %358 = OpAccessChain %_ptr_Private_int %map %357
+               OpStore %358 %int_1
+        %359 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %360 = OpLoad %int %359
+        %361 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %362 = OpLoad %int %361
+        %363 = OpLoad %_arr_int_uint_256 %map
+               OpStore %map %331
+               OpStore %map %363
+        %364 = OpISub %int %362 %int_2
+        %365 = OpIMul %int %364 %int_16
+        %366 = OpIAdd %int %360 %365
+        %367 = OpAccessChain %_ptr_Private_int %map %366
+               OpStore %367 %int_1
+        %368 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %369 = OpLoad %int %368
+        %370 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %371 = OpISub %int %369 %int_2
+               OpStore %370 %371
+               OpBranch %340
+        %340 = OpLabel
+        %372 = OpLoad %int %d
+        %373 = OpSGreaterThanEqual %bool %372 %int_0
+               OpStore %x_336_phi %373
+               OpSelectionMerge %374 None
+               OpBranchConditional %373 %375 %374
+        %375 = OpLabel
+        %376 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %377 = OpLoad %int %376
+        %378 = OpSLessThan %bool %377 %int_14
+               OpStore %x_335 %378
+        %379 = OpLoad %bool %x_335
+               OpStore %x_336_phi %379
+               OpBranch %374
+        %374 = OpLabel
+        %380 = OpLoad %bool %x_336_phi
+               OpStore %x_349_phi %380
+               OpSelectionMerge %381 None
+               OpBranchConditional %380 %382 %381
+        %382 = OpLabel
+        %383 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %384 = OpLoad %int %383
+        %385 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %386 = OpLoad %int %385
+        %387 = OpIAdd %int %384 %int_2
+        %388 = OpIMul %int %386 %int_16
+        %389 = OpIAdd %int %387 %388
+        %390 = OpAccessChain %_ptr_Private_int %map %389
+        %391 = OpLoad %int %390
+        %392 = OpIEqual %bool %391 %int_0
+               OpStore %x_348 %392
+        %393 = OpLoad %bool %x_348
+               OpStore %x_349_phi %393
+               OpBranch %381
+        %381 = OpLabel
+        %394 = OpLoad %bool %x_349_phi
+               OpSelectionMerge %395 None
+               OpBranchConditional %394 %396 %395
+        %396 = OpLabel
+        %397 = OpLoad %int %d
+        %398 = OpISub %int %397 %int_1
+               OpStore %d %398
+        %399 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %400 = OpLoad %int %399
+        %401 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %402 = OpLoad %int %401
+        %403 = OpIMul %int %402 %int_16
+        %404 = OpIAdd %int %400 %403
+        %405 = OpAccessChain %_ptr_Private_int %map %404
+               OpStore %405 %int_1
+        %406 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %407 = OpLoad %int %406
+        %408 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %409 = OpLoad %int %408
+        %410 = OpIAdd %int %407 %int_1
+        %411 = OpIMul %int %409 %int_16
+        %412 = OpIAdd %int %410 %411
+        %413 = OpAccessChain %_ptr_Private_int %map %412
+               OpStore %413 %int_1
+        %414 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %415 = OpLoad %int %414
+        %416 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %417 = OpLoad %int %416
+        %418 = OpIAdd %int %415 %int_2
+        %419 = OpIMul %int %417 %int_16
+        %420 = OpIAdd %int %418 %419
+        %421 = OpAccessChain %_ptr_Private_int %map %420
+               OpStore %421 %int_1
+        %422 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %423 = OpLoad %int %422
+        %424 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %425 = OpIAdd %int %423 %int_2
+               OpStore %424 %425
+               OpBranch %395
+        %395 = OpLabel
+        %426 = OpLoad %int %d
+        %427 = OpSGreaterThanEqual %bool %426 %int_0
+               OpStore %x_388_phi %427
+               OpSelectionMerge %428 None
+               OpBranchConditional %427 %429 %428
+        %429 = OpLabel
+        %430 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %431 = OpLoad %int %430
+        %432 = OpSLessThan %bool %431 %int_14
+               OpStore %x_387 %432
+        %433 = OpLoad %bool %x_387
+               OpStore %x_388_phi %433
+               OpBranch %428
+        %428 = OpLabel
+        %434 = OpLoad %bool %x_388_phi
+               OpStore %x_401_phi %434
+               OpSelectionMerge %435 None
+               OpBranchConditional %434 %436 %435
+        %436 = OpLabel
+        %437 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %438 = OpLoad %int %437
+        %439 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %440 = OpLoad %int %439
+        %441 = OpIAdd %int %440 %int_2
+        %442 = OpIMul %int %441 %int_16
+        %443 = OpIAdd %int %438 %442
+        %444 = OpAccessChain %_ptr_Private_int %map %443
+        %445 = OpLoad %int %444
+        %446 = OpIEqual %bool %445 %int_0
+               OpStore %x_400 %446
+        %447 = OpLoad %bool %x_400
+               OpStore %x_401_phi %447
+               OpBranch %435
+        %435 = OpLabel
+        %448 = OpLoad %bool %x_401_phi
+               OpSelectionMerge %449 None
+               OpBranchConditional %448 %450 %449
+        %450 = OpLabel
+        %451 = OpLoad %int %d
+        %452 = OpISub %int %451 %int_1
+               OpStore %d %452
+        %453 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %454 = OpLoad %int %453
+        %455 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %456 = OpLoad %int %455
+        %457 = OpIMul %int %456 %int_16
+        %458 = OpIAdd %int %454 %457
+        %459 = OpAccessChain %_ptr_Private_int %map %458
+               OpStore %459 %int_1
+        %460 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %461 = OpLoad %int %460
+        %462 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %463 = OpLoad %int %462
+        %464 = OpIAdd %int %463 %int_1
+        %465 = OpIMul %int %464 %int_16
+        %466 = OpIAdd %int %461 %465
+        %467 = OpAccessChain %_ptr_Private_int %map %466
+               OpStore %467 %int_1
+        %468 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %469 = OpLoad %int %468
+        %470 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %471 = OpLoad %int %470
+        %472 = OpIAdd %int %471 %int_2
+        %473 = OpIMul %int %472 %int_16
+        %474 = OpIAdd %int %469 %473
+        %475 = OpAccessChain %_ptr_Private_int %map %474
+               OpStore %475 %int_1
+        %476 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %477 = OpLoad %int %476
+        %478 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %479 = OpIAdd %int %477 %int_2
+               OpStore %478 %479
+               OpBranch %449
+        %449 = OpLabel
+               OpBranch %204
+        %204 = OpLabel
+        %480 = OpAccessChain %_ptr_Function_int %ipos %uint_1
+        %481 = OpLoad %int %480
+        %482 = OpAccessChain %_ptr_Function_int %ipos %uint_0
+        %483 = OpLoad %int %482
+        %484 = OpIMul %int %481 %int_16
+        %485 = OpIAdd %int %484 %483
+        %486 = OpAccessChain %_ptr_Private_int %map %485
+        %487 = OpLoad %int %486
+        %488 = OpIEqual %bool %487 %int_1
+               OpSelectionMerge %489 None
+               OpBranchConditional %488 %490 %489
+        %490 = OpLabel
+               OpStore %x_GLF_color %492
+               OpReturn
+        %489 = OpLabel
+               OpBranch %87
+         %87 = OpLabel
+        %493 = OpLoad %bool %canwalk
+               OpSelectionMerge %494 None
+               OpBranchConditional %493 %495 %496
+        %495 = OpLabel
+               OpBranch %494
+        %496 = OpLabel
+               OpBranch %86
+        %494 = OpLabel
+               OpBranch %85
+         %86 = OpLabel
+               OpStore %x_GLF_color %498
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %499
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %503 = OpLabel
+        %504 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %504
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %22
+        %506 = OpLabel
+        %507 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %507
+        %508 = OpFunctionCall %void %main_1
+        %510 = OpLoad %v4float %x_GLF_color
+        %511 = OpCompositeConstruct %main_out %510
+        %509 = OpFunctionCall %void %tint_symbol_3 %511
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 87[%87] is not post dominated by the back-edge block 494[%494]
+  %494 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/2.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/2.spvasm.expected.wgsl
new file mode 100644
index 0000000..774e546
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/2.spvasm.expected.wgsl
@@ -0,0 +1,354 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> map : array<i32, 256>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var pos : vec2<f32>;
+  var ipos : vec2<i32>;
+  var i : i32;
+  var p : vec2<i32>;
+  var canwalk : bool;
+  var v : i32;
+  var directions : i32;
+  var j : i32;
+  var d : i32;
+  let x_59 : vec4<f32> = gl_FragCoord;
+  let x_62 : vec2<f32> = x_7.resolution;
+  pos = (vec2<f32>(x_59.x, x_59.y) / x_62);
+  let x_65 : f32 = pos.x;
+  let x_69 : f32 = pos.y;
+  ipos = vec2<i32>(i32((x_65 * 16.0)), i32((x_69 * 16.0)));
+  i = 0;
+  loop {
+    let x_77 : i32 = i;
+    if ((x_77 < 256)) {
+    } else {
+      break;
+    }
+    let x_80 : i32 = i;
+    map[x_80] = 0;
+
+    continuing {
+      let x_82 : i32 = i;
+      i = (x_82 + 1);
+    }
+  }
+  p = vec2<i32>(0, 0);
+  canwalk = true;
+  v = 0;
+  loop {
+    var x_104 : bool;
+    var x_124 : bool;
+    var x_144 : bool;
+    var x_164 : bool;
+    var x_105_phi : bool;
+    var x_125_phi : bool;
+    var x_145_phi : bool;
+    var x_165_phi : bool;
+    let x_88 : i32 = v;
+    v = (x_88 + 1);
+    directions = 0;
+    let x_91 : i32 = p.x;
+    let x_92 : bool = (x_91 > 0);
+    x_105_phi = x_92;
+    if (x_92) {
+      let x_96 : i32 = p.x;
+      let x_99 : i32 = p.y;
+      let x_103 : i32 = map[((x_96 - 2) + (x_99 * 16))];
+      x_104 = (x_103 == 0);
+      x_105_phi = x_104;
+    }
+    let x_105 : bool = x_105_phi;
+    if (x_105) {
+      let x_108 : i32 = directions;
+      directions = (x_108 + 1);
+    }
+    let x_111 : i32 = p.y;
+    let x_112 : bool = (x_111 > 0);
+    x_125_phi = x_112;
+    if (x_112) {
+      let x_116 : i32 = p.x;
+      let x_118 : i32 = p.y;
+      let x_123 : i32 = map[(x_116 + ((x_118 - 2) * 16))];
+      x_124 = (x_123 == 0);
+      x_125_phi = x_124;
+    }
+    let x_125 : bool = x_125_phi;
+    if (x_125) {
+      let x_128 : i32 = directions;
+      directions = (x_128 + 1);
+    }
+    let x_131 : i32 = p.x;
+    let x_132 : bool = (x_131 < 14);
+    x_145_phi = x_132;
+    if (x_132) {
+      let x_136 : i32 = p.x;
+      let x_139 : i32 = p.y;
+      let x_143 : i32 = map[((x_136 + 2) + (x_139 * 16))];
+      x_144 = (x_143 == 0);
+      x_145_phi = x_144;
+    }
+    let x_145 : bool = x_145_phi;
+    if (x_145) {
+      let x_148 : i32 = directions;
+      directions = (x_148 + 1);
+    }
+    let x_151 : i32 = p.y;
+    let x_152 : bool = (x_151 < 14);
+    x_165_phi = x_152;
+    if (x_152) {
+      let x_156 : i32 = p.x;
+      let x_158 : i32 = p.y;
+      let x_163 : i32 = map[(x_156 + ((x_158 + 2) * 16))];
+      x_164 = (x_163 == 0);
+      x_165_phi = x_164;
+    }
+    let x_165 : bool = x_165_phi;
+    if (x_165) {
+      let x_168 : i32 = directions;
+      directions = (x_168 + 1);
+    }
+    var x_229 : bool;
+    var x_242 : bool;
+    var x_281 : bool;
+    var x_295 : bool;
+    var x_335 : bool;
+    var x_348 : bool;
+    var x_387 : bool;
+    var x_400 : bool;
+    var x_230_phi : bool;
+    var x_243_phi : bool;
+    var x_282_phi : bool;
+    var x_296_phi : bool;
+    var x_336_phi : bool;
+    var x_349_phi : bool;
+    var x_388_phi : bool;
+    var x_401_phi : bool;
+    let x_170 : i32 = directions;
+    if ((x_170 == 0)) {
+      canwalk = false;
+      i = 0;
+      loop {
+        let x_179 : i32 = i;
+        if ((x_179 < 8)) {
+        } else {
+          break;
+        }
+        j = 0;
+        loop {
+          let x_186 : i32 = j;
+          if ((x_186 < 8)) {
+          } else {
+            break;
+          }
+          let x_189 : i32 = j;
+          let x_191 : i32 = i;
+          let x_196 : i32 = map[((x_189 * 2) + ((x_191 * 2) * 16))];
+          if ((x_196 == 0)) {
+            let x_200 : i32 = j;
+            p.x = (x_200 * 2);
+            let x_203 : i32 = i;
+            p.y = (x_203 * 2);
+            canwalk = true;
+          }
+
+          continuing {
+            let x_206 : i32 = j;
+            j = (x_206 + 1);
+          }
+        }
+
+        continuing {
+          let x_208 : i32 = i;
+          i = (x_208 + 1);
+        }
+      }
+      let x_211 : i32 = p.x;
+      let x_213 : i32 = p.y;
+      map[(x_211 + (x_213 * 16))] = 1;
+    } else {
+      let x_217 : i32 = v;
+      let x_218 : i32 = directions;
+      d = (x_217 % x_218);
+      let x_220 : i32 = directions;
+      let x_221 : i32 = v;
+      v = (x_221 + x_220);
+      let x_223 : i32 = d;
+      let x_224 : bool = (x_223 >= 0);
+      x_230_phi = x_224;
+      if (x_224) {
+        let x_228 : i32 = p.x;
+        x_229 = (x_228 > 0);
+        x_230_phi = x_229;
+      }
+      let x_230 : bool = x_230_phi;
+      x_243_phi = x_230;
+      if (x_230) {
+        let x_234 : i32 = p.x;
+        let x_237 : i32 = p.y;
+        let x_241 : i32 = map[((x_234 - 2) + (x_237 * 16))];
+        x_242 = (x_241 == 0);
+        x_243_phi = x_242;
+      }
+      let x_243 : bool = x_243_phi;
+      if (x_243) {
+        let x_246 : i32 = d;
+        d = (x_246 - 1);
+        let x_249 : i32 = p.x;
+        let x_251 : i32 = p.y;
+        map[(x_249 + (x_251 * 16))] = 1;
+        let x_256 : i32 = p.x;
+        let x_259 : i32 = p.y;
+        map[((x_256 - 1) + (x_259 * 16))] = 1;
+        let x_264 : i32 = p.x;
+        let x_267 : i32 = p.y;
+        map[((x_264 - 2) + (x_267 * 16))] = 1;
+        let x_272 : i32 = p.x;
+        p.x = (x_272 - 2);
+      }
+      let x_275 : i32 = d;
+      let x_276 : bool = (x_275 >= 0);
+      x_282_phi = x_276;
+      if (x_276) {
+        let x_280 : i32 = p.y;
+        x_281 = (x_280 > 0);
+        x_282_phi = x_281;
+      }
+      let x_282 : bool = x_282_phi;
+      x_296_phi = x_282;
+      if (x_282) {
+        let x_286 : i32 = p.x;
+        let x_288 : i32 = p.y;
+        let x_291 : array<i32, 256> = map;
+        map = array<i32, 256>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+        map = x_291;
+        let x_294 : i32 = map[(x_286 + ((x_288 - 2) * 16))];
+        x_295 = (x_294 == 0);
+        x_296_phi = x_295;
+      }
+      let x_296 : bool = x_296_phi;
+      if (x_296) {
+        let x_299 : i32 = d;
+        d = (x_299 - 1);
+        let x_302 : i32 = p.x;
+        let x_304 : i32 = p.y;
+        map[(x_302 + (x_304 * 16))] = 1;
+        let x_309 : i32 = p.x;
+        let x_311 : i32 = p.y;
+        map[(x_309 + ((x_311 - 1) * 16))] = 1;
+        let x_317 : i32 = p.x;
+        let x_319 : i32 = p.y;
+        let x_321 : array<i32, 256> = map;
+        map = array<i32, 256>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+        map = x_321;
+        map[(x_317 + ((x_319 - 2) * 16))] = 1;
+        let x_326 : i32 = p.y;
+        p.y = (x_326 - 2);
+      }
+      let x_329 : i32 = d;
+      let x_330 : bool = (x_329 >= 0);
+      x_336_phi = x_330;
+      if (x_330) {
+        let x_334 : i32 = p.x;
+        x_335 = (x_334 < 14);
+        x_336_phi = x_335;
+      }
+      let x_336 : bool = x_336_phi;
+      x_349_phi = x_336;
+      if (x_336) {
+        let x_340 : i32 = p.x;
+        let x_343 : i32 = p.y;
+        let x_347 : i32 = map[((x_340 + 2) + (x_343 * 16))];
+        x_348 = (x_347 == 0);
+        x_349_phi = x_348;
+      }
+      let x_349 : bool = x_349_phi;
+      if (x_349) {
+        let x_352 : i32 = d;
+        d = (x_352 - 1);
+        let x_355 : i32 = p.x;
+        let x_357 : i32 = p.y;
+        map[(x_355 + (x_357 * 16))] = 1;
+        let x_362 : i32 = p.x;
+        let x_365 : i32 = p.y;
+        map[((x_362 + 1) + (x_365 * 16))] = 1;
+        let x_370 : i32 = p.x;
+        let x_373 : i32 = p.y;
+        map[((x_370 + 2) + (x_373 * 16))] = 1;
+        let x_378 : i32 = p.x;
+        p.x = (x_378 + 2);
+      }
+      let x_381 : i32 = d;
+      let x_382 : bool = (x_381 >= 0);
+      x_388_phi = x_382;
+      if (x_382) {
+        let x_386 : i32 = p.y;
+        x_387 = (x_386 < 14);
+        x_388_phi = x_387;
+      }
+      let x_388 : bool = x_388_phi;
+      x_401_phi = x_388;
+      if (x_388) {
+        let x_392 : i32 = p.x;
+        let x_394 : i32 = p.y;
+        let x_399 : i32 = map[(x_392 + ((x_394 + 2) * 16))];
+        x_400 = (x_399 == 0);
+        x_401_phi = x_400;
+      }
+      let x_401 : bool = x_401_phi;
+      if (x_401) {
+        let x_404 : i32 = d;
+        d = (x_404 - 1);
+        let x_407 : i32 = p.x;
+        let x_409 : i32 = p.y;
+        map[(x_407 + (x_409 * 16))] = 1;
+        let x_414 : i32 = p.x;
+        let x_416 : i32 = p.y;
+        map[(x_414 + ((x_416 + 1) * 16))] = 1;
+        let x_422 : i32 = p.x;
+        let x_424 : i32 = p.y;
+        map[(x_422 + ((x_424 + 2) * 16))] = 1;
+        let x_430 : i32 = p.y;
+        p.y = (x_430 + 2);
+      }
+    }
+    let x_434 : i32 = ipos.y;
+    let x_437 : i32 = ipos.x;
+    let x_440 : i32 = map[((x_434 * 16) + x_437)];
+    if ((x_440 == 1)) {
+      x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+      return;
+    }
+
+    continuing {
+      let x_444 : bool = canwalk;
+      if (x_444) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/2.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/2.wgsl
new file mode 100644
index 0000000..774e546
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/2.wgsl
@@ -0,0 +1,354 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> map : array<i32, 256>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var pos : vec2<f32>;
+  var ipos : vec2<i32>;
+  var i : i32;
+  var p : vec2<i32>;
+  var canwalk : bool;
+  var v : i32;
+  var directions : i32;
+  var j : i32;
+  var d : i32;
+  let x_59 : vec4<f32> = gl_FragCoord;
+  let x_62 : vec2<f32> = x_7.resolution;
+  pos = (vec2<f32>(x_59.x, x_59.y) / x_62);
+  let x_65 : f32 = pos.x;
+  let x_69 : f32 = pos.y;
+  ipos = vec2<i32>(i32((x_65 * 16.0)), i32((x_69 * 16.0)));
+  i = 0;
+  loop {
+    let x_77 : i32 = i;
+    if ((x_77 < 256)) {
+    } else {
+      break;
+    }
+    let x_80 : i32 = i;
+    map[x_80] = 0;
+
+    continuing {
+      let x_82 : i32 = i;
+      i = (x_82 + 1);
+    }
+  }
+  p = vec2<i32>(0, 0);
+  canwalk = true;
+  v = 0;
+  loop {
+    var x_104 : bool;
+    var x_124 : bool;
+    var x_144 : bool;
+    var x_164 : bool;
+    var x_105_phi : bool;
+    var x_125_phi : bool;
+    var x_145_phi : bool;
+    var x_165_phi : bool;
+    let x_88 : i32 = v;
+    v = (x_88 + 1);
+    directions = 0;
+    let x_91 : i32 = p.x;
+    let x_92 : bool = (x_91 > 0);
+    x_105_phi = x_92;
+    if (x_92) {
+      let x_96 : i32 = p.x;
+      let x_99 : i32 = p.y;
+      let x_103 : i32 = map[((x_96 - 2) + (x_99 * 16))];
+      x_104 = (x_103 == 0);
+      x_105_phi = x_104;
+    }
+    let x_105 : bool = x_105_phi;
+    if (x_105) {
+      let x_108 : i32 = directions;
+      directions = (x_108 + 1);
+    }
+    let x_111 : i32 = p.y;
+    let x_112 : bool = (x_111 > 0);
+    x_125_phi = x_112;
+    if (x_112) {
+      let x_116 : i32 = p.x;
+      let x_118 : i32 = p.y;
+      let x_123 : i32 = map[(x_116 + ((x_118 - 2) * 16))];
+      x_124 = (x_123 == 0);
+      x_125_phi = x_124;
+    }
+    let x_125 : bool = x_125_phi;
+    if (x_125) {
+      let x_128 : i32 = directions;
+      directions = (x_128 + 1);
+    }
+    let x_131 : i32 = p.x;
+    let x_132 : bool = (x_131 < 14);
+    x_145_phi = x_132;
+    if (x_132) {
+      let x_136 : i32 = p.x;
+      let x_139 : i32 = p.y;
+      let x_143 : i32 = map[((x_136 + 2) + (x_139 * 16))];
+      x_144 = (x_143 == 0);
+      x_145_phi = x_144;
+    }
+    let x_145 : bool = x_145_phi;
+    if (x_145) {
+      let x_148 : i32 = directions;
+      directions = (x_148 + 1);
+    }
+    let x_151 : i32 = p.y;
+    let x_152 : bool = (x_151 < 14);
+    x_165_phi = x_152;
+    if (x_152) {
+      let x_156 : i32 = p.x;
+      let x_158 : i32 = p.y;
+      let x_163 : i32 = map[(x_156 + ((x_158 + 2) * 16))];
+      x_164 = (x_163 == 0);
+      x_165_phi = x_164;
+    }
+    let x_165 : bool = x_165_phi;
+    if (x_165) {
+      let x_168 : i32 = directions;
+      directions = (x_168 + 1);
+    }
+    var x_229 : bool;
+    var x_242 : bool;
+    var x_281 : bool;
+    var x_295 : bool;
+    var x_335 : bool;
+    var x_348 : bool;
+    var x_387 : bool;
+    var x_400 : bool;
+    var x_230_phi : bool;
+    var x_243_phi : bool;
+    var x_282_phi : bool;
+    var x_296_phi : bool;
+    var x_336_phi : bool;
+    var x_349_phi : bool;
+    var x_388_phi : bool;
+    var x_401_phi : bool;
+    let x_170 : i32 = directions;
+    if ((x_170 == 0)) {
+      canwalk = false;
+      i = 0;
+      loop {
+        let x_179 : i32 = i;
+        if ((x_179 < 8)) {
+        } else {
+          break;
+        }
+        j = 0;
+        loop {
+          let x_186 : i32 = j;
+          if ((x_186 < 8)) {
+          } else {
+            break;
+          }
+          let x_189 : i32 = j;
+          let x_191 : i32 = i;
+          let x_196 : i32 = map[((x_189 * 2) + ((x_191 * 2) * 16))];
+          if ((x_196 == 0)) {
+            let x_200 : i32 = j;
+            p.x = (x_200 * 2);
+            let x_203 : i32 = i;
+            p.y = (x_203 * 2);
+            canwalk = true;
+          }
+
+          continuing {
+            let x_206 : i32 = j;
+            j = (x_206 + 1);
+          }
+        }
+
+        continuing {
+          let x_208 : i32 = i;
+          i = (x_208 + 1);
+        }
+      }
+      let x_211 : i32 = p.x;
+      let x_213 : i32 = p.y;
+      map[(x_211 + (x_213 * 16))] = 1;
+    } else {
+      let x_217 : i32 = v;
+      let x_218 : i32 = directions;
+      d = (x_217 % x_218);
+      let x_220 : i32 = directions;
+      let x_221 : i32 = v;
+      v = (x_221 + x_220);
+      let x_223 : i32 = d;
+      let x_224 : bool = (x_223 >= 0);
+      x_230_phi = x_224;
+      if (x_224) {
+        let x_228 : i32 = p.x;
+        x_229 = (x_228 > 0);
+        x_230_phi = x_229;
+      }
+      let x_230 : bool = x_230_phi;
+      x_243_phi = x_230;
+      if (x_230) {
+        let x_234 : i32 = p.x;
+        let x_237 : i32 = p.y;
+        let x_241 : i32 = map[((x_234 - 2) + (x_237 * 16))];
+        x_242 = (x_241 == 0);
+        x_243_phi = x_242;
+      }
+      let x_243 : bool = x_243_phi;
+      if (x_243) {
+        let x_246 : i32 = d;
+        d = (x_246 - 1);
+        let x_249 : i32 = p.x;
+        let x_251 : i32 = p.y;
+        map[(x_249 + (x_251 * 16))] = 1;
+        let x_256 : i32 = p.x;
+        let x_259 : i32 = p.y;
+        map[((x_256 - 1) + (x_259 * 16))] = 1;
+        let x_264 : i32 = p.x;
+        let x_267 : i32 = p.y;
+        map[((x_264 - 2) + (x_267 * 16))] = 1;
+        let x_272 : i32 = p.x;
+        p.x = (x_272 - 2);
+      }
+      let x_275 : i32 = d;
+      let x_276 : bool = (x_275 >= 0);
+      x_282_phi = x_276;
+      if (x_276) {
+        let x_280 : i32 = p.y;
+        x_281 = (x_280 > 0);
+        x_282_phi = x_281;
+      }
+      let x_282 : bool = x_282_phi;
+      x_296_phi = x_282;
+      if (x_282) {
+        let x_286 : i32 = p.x;
+        let x_288 : i32 = p.y;
+        let x_291 : array<i32, 256> = map;
+        map = array<i32, 256>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+        map = x_291;
+        let x_294 : i32 = map[(x_286 + ((x_288 - 2) * 16))];
+        x_295 = (x_294 == 0);
+        x_296_phi = x_295;
+      }
+      let x_296 : bool = x_296_phi;
+      if (x_296) {
+        let x_299 : i32 = d;
+        d = (x_299 - 1);
+        let x_302 : i32 = p.x;
+        let x_304 : i32 = p.y;
+        map[(x_302 + (x_304 * 16))] = 1;
+        let x_309 : i32 = p.x;
+        let x_311 : i32 = p.y;
+        map[(x_309 + ((x_311 - 1) * 16))] = 1;
+        let x_317 : i32 = p.x;
+        let x_319 : i32 = p.y;
+        let x_321 : array<i32, 256> = map;
+        map = array<i32, 256>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+        map = x_321;
+        map[(x_317 + ((x_319 - 2) * 16))] = 1;
+        let x_326 : i32 = p.y;
+        p.y = (x_326 - 2);
+      }
+      let x_329 : i32 = d;
+      let x_330 : bool = (x_329 >= 0);
+      x_336_phi = x_330;
+      if (x_330) {
+        let x_334 : i32 = p.x;
+        x_335 = (x_334 < 14);
+        x_336_phi = x_335;
+      }
+      let x_336 : bool = x_336_phi;
+      x_349_phi = x_336;
+      if (x_336) {
+        let x_340 : i32 = p.x;
+        let x_343 : i32 = p.y;
+        let x_347 : i32 = map[((x_340 + 2) + (x_343 * 16))];
+        x_348 = (x_347 == 0);
+        x_349_phi = x_348;
+      }
+      let x_349 : bool = x_349_phi;
+      if (x_349) {
+        let x_352 : i32 = d;
+        d = (x_352 - 1);
+        let x_355 : i32 = p.x;
+        let x_357 : i32 = p.y;
+        map[(x_355 + (x_357 * 16))] = 1;
+        let x_362 : i32 = p.x;
+        let x_365 : i32 = p.y;
+        map[((x_362 + 1) + (x_365 * 16))] = 1;
+        let x_370 : i32 = p.x;
+        let x_373 : i32 = p.y;
+        map[((x_370 + 2) + (x_373 * 16))] = 1;
+        let x_378 : i32 = p.x;
+        p.x = (x_378 + 2);
+      }
+      let x_381 : i32 = d;
+      let x_382 : bool = (x_381 >= 0);
+      x_388_phi = x_382;
+      if (x_382) {
+        let x_386 : i32 = p.y;
+        x_387 = (x_386 < 14);
+        x_388_phi = x_387;
+      }
+      let x_388 : bool = x_388_phi;
+      x_401_phi = x_388;
+      if (x_388) {
+        let x_392 : i32 = p.x;
+        let x_394 : i32 = p.y;
+        let x_399 : i32 = map[(x_392 + ((x_394 + 2) * 16))];
+        x_400 = (x_399 == 0);
+        x_401_phi = x_400;
+      }
+      let x_401 : bool = x_401_phi;
+      if (x_401) {
+        let x_404 : i32 = d;
+        d = (x_404 - 1);
+        let x_407 : i32 = p.x;
+        let x_409 : i32 = p.y;
+        map[(x_407 + (x_409 * 16))] = 1;
+        let x_414 : i32 = p.x;
+        let x_416 : i32 = p.y;
+        map[(x_414 + ((x_416 + 1) * 16))] = 1;
+        let x_422 : i32 = p.x;
+        let x_424 : i32 = p.y;
+        map[(x_422 + ((x_424 + 2) * 16))] = 1;
+        let x_430 : i32 = p.y;
+        p.y = (x_430 + 2);
+      }
+    }
+    let x_434 : i32 = ipos.y;
+    let x_437 : i32 = ipos.x;
+    let x_440 : i32 = map[((x_434 * 16) + x_437)];
+    if ((x_440 == 1)) {
+      x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+      return;
+    }
+
+    continuing {
+      let x_444 : bool = canwalk;
+      if (x_444) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/2.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/2.wgsl.expected.hlsl
new file mode 100644
index 0000000..cfe3abd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/2.wgsl.expected.hlsl
@@ -0,0 +1,300 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[1];
+};
+static int map[256] = (int[256])0;
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float2 pos = float2(0.0f, 0.0f);
+  int2 ipos = int2(0, 0);
+  int i = 0;
+  int2 p = int2(0, 0);
+  bool canwalk = false;
+  int v = 0;
+  int directions = 0;
+  int j = 0;
+  int d = 0;
+  const float4 x_59 = gl_FragCoord;
+  const float2 x_62 = asfloat(x_7[0].xy);
+  pos = (float2(x_59.x, x_59.y) / x_62);
+  const float x_65 = pos.x;
+  const float x_69 = pos.y;
+  ipos = int2(int((x_65 * 16.0f)), int((x_69 * 16.0f)));
+  i = 0;
+  {
+    for(; (i < 256); i = (i + 1)) {
+      map[i] = 0;
+    }
+  }
+  p = int2(0, 0);
+  canwalk = true;
+  v = 0;
+  while (true) {
+    bool x_104 = false;
+    bool x_124 = false;
+    bool x_144 = false;
+    bool x_164 = false;
+    bool x_105_phi = false;
+    bool x_125_phi = false;
+    bool x_145_phi = false;
+    bool x_165_phi = false;
+    v = (v + 1);
+    directions = 0;
+    const int x_91 = p.x;
+    const bool x_92 = (x_91 > 0);
+    x_105_phi = x_92;
+    if (x_92) {
+      const int x_96 = p.x;
+      const int x_99 = p.y;
+      const int x_103 = map[((x_96 - 2) + (x_99 * 16))];
+      x_104 = (x_103 == 0);
+      x_105_phi = x_104;
+    }
+    if (x_105_phi) {
+      directions = (directions + 1);
+    }
+    const int x_111 = p.y;
+    const bool x_112 = (x_111 > 0);
+    x_125_phi = x_112;
+    if (x_112) {
+      const int x_116 = p.x;
+      const int x_118 = p.y;
+      const int x_123 = map[(x_116 + ((x_118 - 2) * 16))];
+      x_124 = (x_123 == 0);
+      x_125_phi = x_124;
+    }
+    if (x_125_phi) {
+      directions = (directions + 1);
+    }
+    const int x_131 = p.x;
+    const bool x_132 = (x_131 < 14);
+    x_145_phi = x_132;
+    if (x_132) {
+      const int x_136 = p.x;
+      const int x_139 = p.y;
+      const int x_143 = map[((x_136 + 2) + (x_139 * 16))];
+      x_144 = (x_143 == 0);
+      x_145_phi = x_144;
+    }
+    if (x_145_phi) {
+      directions = (directions + 1);
+    }
+    const int x_151 = p.y;
+    const bool x_152 = (x_151 < 14);
+    x_165_phi = x_152;
+    if (x_152) {
+      const int x_156 = p.x;
+      const int x_158 = p.y;
+      const int x_163 = map[(x_156 + ((x_158 + 2) * 16))];
+      x_164 = (x_163 == 0);
+      x_165_phi = x_164;
+    }
+    if (x_165_phi) {
+      directions = (directions + 1);
+    }
+    bool x_229 = false;
+    bool x_242 = false;
+    bool x_281 = false;
+    bool x_295 = false;
+    bool x_335 = false;
+    bool x_348 = false;
+    bool x_387 = false;
+    bool x_400 = false;
+    bool x_230_phi = false;
+    bool x_243_phi = false;
+    bool x_282_phi = false;
+    bool x_296_phi = false;
+    bool x_336_phi = false;
+    bool x_349_phi = false;
+    bool x_388_phi = false;
+    bool x_401_phi = false;
+    if ((directions == 0)) {
+      canwalk = false;
+      i = 0;
+      {
+        for(; (i < 8); i = (i + 1)) {
+          j = 0;
+          {
+            for(; (j < 8); j = (j + 1)) {
+              const int x_196 = map[((j * 2) + ((i * 2) * 16))];
+              if ((x_196 == 0)) {
+                p.x = (j * 2);
+                p.y = (i * 2);
+                canwalk = true;
+              }
+            }
+          }
+        }
+      }
+      const int x_211 = p.x;
+      const int x_213 = p.y;
+      map[(x_211 + (x_213 * 16))] = 1;
+    } else {
+      d = (v % directions);
+      v = (v + directions);
+      const bool x_224 = (d >= 0);
+      x_230_phi = x_224;
+      if (x_224) {
+        const int x_228 = p.x;
+        x_229 = (x_228 > 0);
+        x_230_phi = x_229;
+      }
+      const bool x_230 = x_230_phi;
+      x_243_phi = x_230;
+      if (x_230) {
+        const int x_234 = p.x;
+        const int x_237 = p.y;
+        const int x_241 = map[((x_234 - 2) + (x_237 * 16))];
+        x_242 = (x_241 == 0);
+        x_243_phi = x_242;
+      }
+      if (x_243_phi) {
+        d = (d - 1);
+        const int x_249 = p.x;
+        const int x_251 = p.y;
+        map[(x_249 + (x_251 * 16))] = 1;
+        const int x_256 = p.x;
+        const int x_259 = p.y;
+        map[((x_256 - 1) + (x_259 * 16))] = 1;
+        const int x_264 = p.x;
+        const int x_267 = p.y;
+        map[((x_264 - 2) + (x_267 * 16))] = 1;
+        const int x_272 = p.x;
+        p.x = (x_272 - 2);
+      }
+      const bool x_276 = (d >= 0);
+      x_282_phi = x_276;
+      if (x_276) {
+        const int x_280 = p.y;
+        x_281 = (x_280 > 0);
+        x_282_phi = x_281;
+      }
+      const bool x_282 = x_282_phi;
+      x_296_phi = x_282;
+      if (x_282) {
+        const int x_286 = p.x;
+        const int x_288 = p.y;
+        const int x_291[256] = map;
+        const int tint_symbol_5[256] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+        map = tint_symbol_5;
+        map = x_291;
+        const int x_294 = map[(x_286 + ((x_288 - 2) * 16))];
+        x_295 = (x_294 == 0);
+        x_296_phi = x_295;
+      }
+      if (x_296_phi) {
+        d = (d - 1);
+        const int x_302 = p.x;
+        const int x_304 = p.y;
+        map[(x_302 + (x_304 * 16))] = 1;
+        const int x_309 = p.x;
+        const int x_311 = p.y;
+        map[(x_309 + ((x_311 - 1) * 16))] = 1;
+        const int x_317 = p.x;
+        const int x_319 = p.y;
+        const int x_321[256] = map;
+        const int tint_symbol_6[256] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+        map = tint_symbol_6;
+        map = x_321;
+        map[(x_317 + ((x_319 - 2) * 16))] = 1;
+        const int x_326 = p.y;
+        p.y = (x_326 - 2);
+      }
+      const bool x_330 = (d >= 0);
+      x_336_phi = x_330;
+      if (x_330) {
+        const int x_334 = p.x;
+        x_335 = (x_334 < 14);
+        x_336_phi = x_335;
+      }
+      const bool x_336 = x_336_phi;
+      x_349_phi = x_336;
+      if (x_336) {
+        const int x_340 = p.x;
+        const int x_343 = p.y;
+        const int x_347 = map[((x_340 + 2) + (x_343 * 16))];
+        x_348 = (x_347 == 0);
+        x_349_phi = x_348;
+      }
+      if (x_349_phi) {
+        d = (d - 1);
+        const int x_355 = p.x;
+        const int x_357 = p.y;
+        map[(x_355 + (x_357 * 16))] = 1;
+        const int x_362 = p.x;
+        const int x_365 = p.y;
+        map[((x_362 + 1) + (x_365 * 16))] = 1;
+        const int x_370 = p.x;
+        const int x_373 = p.y;
+        map[((x_370 + 2) + (x_373 * 16))] = 1;
+        const int x_378 = p.x;
+        p.x = (x_378 + 2);
+      }
+      const bool x_382 = (d >= 0);
+      x_388_phi = x_382;
+      if (x_382) {
+        const int x_386 = p.y;
+        x_387 = (x_386 < 14);
+        x_388_phi = x_387;
+      }
+      const bool x_388 = x_388_phi;
+      x_401_phi = x_388;
+      if (x_388) {
+        const int x_392 = p.x;
+        const int x_394 = p.y;
+        const int x_399 = map[(x_392 + ((x_394 + 2) * 16))];
+        x_400 = (x_399 == 0);
+        x_401_phi = x_400;
+      }
+      if (x_401_phi) {
+        d = (d - 1);
+        const int x_407 = p.x;
+        const int x_409 = p.y;
+        map[(x_407 + (x_409 * 16))] = 1;
+        const int x_414 = p.x;
+        const int x_416 = p.y;
+        map[(x_414 + ((x_416 + 1) * 16))] = 1;
+        const int x_422 = p.x;
+        const int x_424 = p.y;
+        map[(x_422 + ((x_424 + 2) * 16))] = 1;
+        const int x_430 = p.y;
+        p.y = (x_430 + 2);
+      }
+    }
+    const int x_434 = ipos.y;
+    const int x_437 = ipos.x;
+    const int x_440 = map[((x_434 * 16) + x_437)];
+    if ((x_440 == 1)) {
+      x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+      return;
+    }
+    {
+      if (canwalk) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_GLF_color = float4(0.0f, 0.0f, 0.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_7 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_7;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/2.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/2.wgsl.expected.msl
new file mode 100644
index 0000000..b60fe95
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/2.wgsl.expected.msl
@@ -0,0 +1,355 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  int arr[256];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_7, thread tint_array_wrapper* const tint_symbol_8, thread float4* const tint_symbol_9) {
+  float2 pos = 0.0f;
+  int2 ipos = 0;
+  int i = 0;
+  int2 p = 0;
+  bool canwalk = false;
+  int v = 0;
+  int directions = 0;
+  int j = 0;
+  int d = 0;
+  float4 const x_59 = *(tint_symbol_7);
+  float2 const x_62 = x_7.resolution;
+  pos = (float2(x_59.x, x_59.y) / x_62);
+  float const x_65 = pos.x;
+  float const x_69 = pos.y;
+  ipos = int2(int((x_65 * 16.0f)), int((x_69 * 16.0f)));
+  i = 0;
+  while (true) {
+    int const x_77 = i;
+    if ((x_77 < 256)) {
+    } else {
+      break;
+    }
+    int const x_80 = i;
+    (*(tint_symbol_8)).arr[x_80] = 0;
+    {
+      int const x_82 = i;
+      i = (x_82 + 1);
+    }
+  }
+  p = int2(0, 0);
+  canwalk = true;
+  v = 0;
+  while (true) {
+    bool x_104 = false;
+    bool x_124 = false;
+    bool x_144 = false;
+    bool x_164 = false;
+    bool x_105_phi = false;
+    bool x_125_phi = false;
+    bool x_145_phi = false;
+    bool x_165_phi = false;
+    int const x_88 = v;
+    v = (x_88 + 1);
+    directions = 0;
+    int const x_91 = p.x;
+    bool const x_92 = (x_91 > 0);
+    x_105_phi = x_92;
+    if (x_92) {
+      int const x_96 = p.x;
+      int const x_99 = p.y;
+      int const x_103 = (*(tint_symbol_8)).arr[((x_96 - 2) + (x_99 * 16))];
+      x_104 = (x_103 == 0);
+      x_105_phi = x_104;
+    }
+    bool const x_105 = x_105_phi;
+    if (x_105) {
+      int const x_108 = directions;
+      directions = (x_108 + 1);
+    }
+    int const x_111 = p.y;
+    bool const x_112 = (x_111 > 0);
+    x_125_phi = x_112;
+    if (x_112) {
+      int const x_116 = p.x;
+      int const x_118 = p.y;
+      int const x_123 = (*(tint_symbol_8)).arr[(x_116 + ((x_118 - 2) * 16))];
+      x_124 = (x_123 == 0);
+      x_125_phi = x_124;
+    }
+    bool const x_125 = x_125_phi;
+    if (x_125) {
+      int const x_128 = directions;
+      directions = (x_128 + 1);
+    }
+    int const x_131 = p.x;
+    bool const x_132 = (x_131 < 14);
+    x_145_phi = x_132;
+    if (x_132) {
+      int const x_136 = p.x;
+      int const x_139 = p.y;
+      int const x_143 = (*(tint_symbol_8)).arr[((x_136 + 2) + (x_139 * 16))];
+      x_144 = (x_143 == 0);
+      x_145_phi = x_144;
+    }
+    bool const x_145 = x_145_phi;
+    if (x_145) {
+      int const x_148 = directions;
+      directions = (x_148 + 1);
+    }
+    int const x_151 = p.y;
+    bool const x_152 = (x_151 < 14);
+    x_165_phi = x_152;
+    if (x_152) {
+      int const x_156 = p.x;
+      int const x_158 = p.y;
+      int const x_163 = (*(tint_symbol_8)).arr[(x_156 + ((x_158 + 2) * 16))];
+      x_164 = (x_163 == 0);
+      x_165_phi = x_164;
+    }
+    bool const x_165 = x_165_phi;
+    if (x_165) {
+      int const x_168 = directions;
+      directions = (x_168 + 1);
+    }
+    bool x_229 = false;
+    bool x_242 = false;
+    bool x_281 = false;
+    bool x_295 = false;
+    bool x_335 = false;
+    bool x_348 = false;
+    bool x_387 = false;
+    bool x_400 = false;
+    bool x_230_phi = false;
+    bool x_243_phi = false;
+    bool x_282_phi = false;
+    bool x_296_phi = false;
+    bool x_336_phi = false;
+    bool x_349_phi = false;
+    bool x_388_phi = false;
+    bool x_401_phi = false;
+    int const x_170 = directions;
+    if ((x_170 == 0)) {
+      canwalk = false;
+      i = 0;
+      while (true) {
+        int const x_179 = i;
+        if ((x_179 < 8)) {
+        } else {
+          break;
+        }
+        j = 0;
+        while (true) {
+          int const x_186 = j;
+          if ((x_186 < 8)) {
+          } else {
+            break;
+          }
+          int const x_189 = j;
+          int const x_191 = i;
+          int const x_196 = (*(tint_symbol_8)).arr[((x_189 * 2) + ((x_191 * 2) * 16))];
+          if ((x_196 == 0)) {
+            int const x_200 = j;
+            p.x = (x_200 * 2);
+            int const x_203 = i;
+            p.y = (x_203 * 2);
+            canwalk = true;
+          }
+          {
+            int const x_206 = j;
+            j = (x_206 + 1);
+          }
+        }
+        {
+          int const x_208 = i;
+          i = (x_208 + 1);
+        }
+      }
+      int const x_211 = p.x;
+      int const x_213 = p.y;
+      (*(tint_symbol_8)).arr[(x_211 + (x_213 * 16))] = 1;
+    } else {
+      int const x_217 = v;
+      int const x_218 = directions;
+      d = (x_217 % x_218);
+      int const x_220 = directions;
+      int const x_221 = v;
+      v = (x_221 + x_220);
+      int const x_223 = d;
+      bool const x_224 = (x_223 >= 0);
+      x_230_phi = x_224;
+      if (x_224) {
+        int const x_228 = p.x;
+        x_229 = (x_228 > 0);
+        x_230_phi = x_229;
+      }
+      bool const x_230 = x_230_phi;
+      x_243_phi = x_230;
+      if (x_230) {
+        int const x_234 = p.x;
+        int const x_237 = p.y;
+        int const x_241 = (*(tint_symbol_8)).arr[((x_234 - 2) + (x_237 * 16))];
+        x_242 = (x_241 == 0);
+        x_243_phi = x_242;
+      }
+      bool const x_243 = x_243_phi;
+      if (x_243) {
+        int const x_246 = d;
+        d = (x_246 - 1);
+        int const x_249 = p.x;
+        int const x_251 = p.y;
+        (*(tint_symbol_8)).arr[(x_249 + (x_251 * 16))] = 1;
+        int const x_256 = p.x;
+        int const x_259 = p.y;
+        (*(tint_symbol_8)).arr[((x_256 - 1) + (x_259 * 16))] = 1;
+        int const x_264 = p.x;
+        int const x_267 = p.y;
+        (*(tint_symbol_8)).arr[((x_264 - 2) + (x_267 * 16))] = 1;
+        int const x_272 = p.x;
+        p.x = (x_272 - 2);
+      }
+      int const x_275 = d;
+      bool const x_276 = (x_275 >= 0);
+      x_282_phi = x_276;
+      if (x_276) {
+        int const x_280 = p.y;
+        x_281 = (x_280 > 0);
+        x_282_phi = x_281;
+      }
+      bool const x_282 = x_282_phi;
+      x_296_phi = x_282;
+      if (x_282) {
+        int const x_286 = p.x;
+        int const x_288 = p.y;
+        tint_array_wrapper const x_291 = *(tint_symbol_8);
+        tint_array_wrapper const tint_symbol_4 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+        *(tint_symbol_8) = tint_symbol_4;
+        *(tint_symbol_8) = x_291;
+        int const x_294 = (*(tint_symbol_8)).arr[(x_286 + ((x_288 - 2) * 16))];
+        x_295 = (x_294 == 0);
+        x_296_phi = x_295;
+      }
+      bool const x_296 = x_296_phi;
+      if (x_296) {
+        int const x_299 = d;
+        d = (x_299 - 1);
+        int const x_302 = p.x;
+        int const x_304 = p.y;
+        (*(tint_symbol_8)).arr[(x_302 + (x_304 * 16))] = 1;
+        int const x_309 = p.x;
+        int const x_311 = p.y;
+        (*(tint_symbol_8)).arr[(x_309 + ((x_311 - 1) * 16))] = 1;
+        int const x_317 = p.x;
+        int const x_319 = p.y;
+        tint_array_wrapper const x_321 = *(tint_symbol_8);
+        tint_array_wrapper const tint_symbol_5 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+        *(tint_symbol_8) = tint_symbol_5;
+        *(tint_symbol_8) = x_321;
+        (*(tint_symbol_8)).arr[(x_317 + ((x_319 - 2) * 16))] = 1;
+        int const x_326 = p.y;
+        p.y = (x_326 - 2);
+      }
+      int const x_329 = d;
+      bool const x_330 = (x_329 >= 0);
+      x_336_phi = x_330;
+      if (x_330) {
+        int const x_334 = p.x;
+        x_335 = (x_334 < 14);
+        x_336_phi = x_335;
+      }
+      bool const x_336 = x_336_phi;
+      x_349_phi = x_336;
+      if (x_336) {
+        int const x_340 = p.x;
+        int const x_343 = p.y;
+        int const x_347 = (*(tint_symbol_8)).arr[((x_340 + 2) + (x_343 * 16))];
+        x_348 = (x_347 == 0);
+        x_349_phi = x_348;
+      }
+      bool const x_349 = x_349_phi;
+      if (x_349) {
+        int const x_352 = d;
+        d = (x_352 - 1);
+        int const x_355 = p.x;
+        int const x_357 = p.y;
+        (*(tint_symbol_8)).arr[(x_355 + (x_357 * 16))] = 1;
+        int const x_362 = p.x;
+        int const x_365 = p.y;
+        (*(tint_symbol_8)).arr[((x_362 + 1) + (x_365 * 16))] = 1;
+        int const x_370 = p.x;
+        int const x_373 = p.y;
+        (*(tint_symbol_8)).arr[((x_370 + 2) + (x_373 * 16))] = 1;
+        int const x_378 = p.x;
+        p.x = (x_378 + 2);
+      }
+      int const x_381 = d;
+      bool const x_382 = (x_381 >= 0);
+      x_388_phi = x_382;
+      if (x_382) {
+        int const x_386 = p.y;
+        x_387 = (x_386 < 14);
+        x_388_phi = x_387;
+      }
+      bool const x_388 = x_388_phi;
+      x_401_phi = x_388;
+      if (x_388) {
+        int const x_392 = p.x;
+        int const x_394 = p.y;
+        int const x_399 = (*(tint_symbol_8)).arr[(x_392 + ((x_394 + 2) * 16))];
+        x_400 = (x_399 == 0);
+        x_401_phi = x_400;
+      }
+      bool const x_401 = x_401_phi;
+      if (x_401) {
+        int const x_404 = d;
+        d = (x_404 - 1);
+        int const x_407 = p.x;
+        int const x_409 = p.y;
+        (*(tint_symbol_8)).arr[(x_407 + (x_409 * 16))] = 1;
+        int const x_414 = p.x;
+        int const x_416 = p.y;
+        (*(tint_symbol_8)).arr[(x_414 + ((x_416 + 1) * 16))] = 1;
+        int const x_422 = p.x;
+        int const x_424 = p.y;
+        (*(tint_symbol_8)).arr[(x_422 + ((x_424 + 2) * 16))] = 1;
+        int const x_430 = p.y;
+        p.y = (x_430 + 2);
+      }
+    }
+    int const x_434 = ipos.y;
+    int const x_437 = ipos.x;
+    int const x_440 = (*(tint_symbol_8)).arr[((x_434 * 16) + x_437)];
+    if ((x_440 == 1)) {
+      *(tint_symbol_9) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+      return;
+    }
+    {
+      bool const x_444 = canwalk;
+      if (x_444) {
+      } else {
+        break;
+      }
+    }
+  }
+  *(tint_symbol_9) = float4(0.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_10 = 0.0f;
+  thread tint_array_wrapper tint_symbol_11 = {};
+  thread float4 tint_symbol_12 = 0.0f;
+  tint_symbol_10 = gl_FragCoord_param;
+  main_1(x_7, &(tint_symbol_10), &(tint_symbol_11), &(tint_symbol_12));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_12};
+  tint_symbol_2 const tint_symbol_6 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/2.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/2.wgsl.expected.spvasm
new file mode 100644
index 0000000..577b0fa
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/2.wgsl.expected.spvasm
@@ -0,0 +1,782 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 512
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_7 "x_7"
+               OpName %map "map"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %pos "pos"
+               OpName %ipos "ipos"
+               OpName %i "i"
+               OpName %p "p"
+               OpName %canwalk "canwalk"
+               OpName %v "v"
+               OpName %directions "directions"
+               OpName %j "j"
+               OpName %d "d"
+               OpName %x_104 "x_104"
+               OpName %x_124 "x_124"
+               OpName %x_144 "x_144"
+               OpName %x_164 "x_164"
+               OpName %x_105_phi "x_105_phi"
+               OpName %x_125_phi "x_125_phi"
+               OpName %x_145_phi "x_145_phi"
+               OpName %x_165_phi "x_165_phi"
+               OpName %x_229 "x_229"
+               OpName %x_242 "x_242"
+               OpName %x_281 "x_281"
+               OpName %x_295 "x_295"
+               OpName %x_335 "x_335"
+               OpName %x_348 "x_348"
+               OpName %x_387 "x_387"
+               OpName %x_400 "x_400"
+               OpName %x_230_phi "x_230_phi"
+               OpName %x_243_phi "x_243_phi"
+               OpName %x_282_phi "x_282_phi"
+               OpName %x_296_phi "x_296_phi"
+               OpName %x_336_phi "x_336_phi"
+               OpName %x_349_phi "x_349_phi"
+               OpName %x_388_phi "x_388_phi"
+               OpName %x_401_phi "x_401_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %_arr_int_uint_256 ArrayStride 4
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+   %uint_256 = OpConstant %uint 256
+%_arr_int_uint_256 = OpTypeArray %int %uint_256
+%_ptr_Private__arr_int_uint_256 = OpTypePointer Private %_arr_int_uint_256
+         %16 = OpConstantNull %_arr_int_uint_256
+        %map = OpVariable %_ptr_Private__arr_int_uint_256 Private %16
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %22 = OpTypeFunction %void
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %28 = OpConstantNull %v2float
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %32 = OpConstantNull %v2int
+%_ptr_Function_int = OpTypePointer Function %int
+         %35 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %40 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+   %float_16 = OpConstant %float 16
+      %int_0 = OpConstant %int 0
+    %int_256 = OpConstant %int 256
+%_ptr_Private_int = OpTypePointer Private %int
+      %int_1 = OpConstant %int 1
+         %83 = OpConstantComposite %v2int %int_0 %int_0
+       %true = OpConstantTrue %bool
+      %int_2 = OpConstant %int 2
+     %int_16 = OpConstant %int 16
+     %int_14 = OpConstant %int 14
+      %false = OpConstantFalse %bool
+      %int_8 = OpConstant %int 8
+        %331 = OpConstantComposite %_arr_int_uint_256 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0
+    %float_1 = OpConstant %float 1
+        %492 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+    %float_0 = OpConstant %float 0
+        %498 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %499 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %22
+         %25 = OpLabel
+        %pos = OpVariable %_ptr_Function_v2float Function %28
+       %ipos = OpVariable %_ptr_Function_v2int Function %32
+          %i = OpVariable %_ptr_Function_int Function %35
+          %p = OpVariable %_ptr_Function_v2int Function %32
+    %canwalk = OpVariable %_ptr_Function_bool Function %40
+          %v = OpVariable %_ptr_Function_int Function %35
+ %directions = OpVariable %_ptr_Function_int Function %35
+          %j = OpVariable %_ptr_Function_int Function %35
+          %d = OpVariable %_ptr_Function_int Function %35
+      %x_104 = OpVariable %_ptr_Function_bool Function %40
+      %x_124 = OpVariable %_ptr_Function_bool Function %40
+      %x_144 = OpVariable %_ptr_Function_bool Function %40
+      %x_164 = OpVariable %_ptr_Function_bool Function %40
+  %x_105_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_125_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_145_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_165_phi = OpVariable %_ptr_Function_bool Function %40
+      %x_229 = OpVariable %_ptr_Function_bool Function %40
+      %x_242 = OpVariable %_ptr_Function_bool Function %40
+      %x_281 = OpVariable %_ptr_Function_bool Function %40
+      %x_295 = OpVariable %_ptr_Function_bool Function %40
+      %x_335 = OpVariable %_ptr_Function_bool Function %40
+      %x_348 = OpVariable %_ptr_Function_bool Function %40
+      %x_387 = OpVariable %_ptr_Function_bool Function %40
+      %x_400 = OpVariable %_ptr_Function_bool Function %40
+  %x_230_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_243_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_282_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_296_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_336_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_349_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_388_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_401_phi = OpVariable %_ptr_Function_bool Function %40
+         %45 = OpLoad %v4float %gl_FragCoord
+         %48 = OpAccessChain %_ptr_Uniform_v2float %x_7 %uint_0
+         %49 = OpLoad %v2float %48
+         %50 = OpCompositeExtract %float %45 0
+         %51 = OpCompositeExtract %float %45 1
+         %52 = OpCompositeConstruct %v2float %50 %51
+         %53 = OpFDiv %v2float %52 %49
+               OpStore %pos %53
+         %55 = OpAccessChain %_ptr_Function_float %pos %uint_0
+         %56 = OpLoad %float %55
+         %58 = OpAccessChain %_ptr_Function_float %pos %uint_1
+         %59 = OpLoad %float %58
+         %62 = OpFMul %float %56 %float_16
+         %60 = OpConvertFToS %int %62
+         %64 = OpFMul %float %59 %float_16
+         %63 = OpConvertFToS %int %64
+         %65 = OpCompositeConstruct %v2int %60 %63
+               OpStore %ipos %65
+               OpStore %i %int_0
+               OpBranch %67
+         %67 = OpLabel
+               OpLoopMerge %68 %69 None
+               OpBranch %70
+         %70 = OpLabel
+         %71 = OpLoad %int %i
+         %73 = OpSLessThan %bool %71 %int_256
+               OpSelectionMerge %74 None
+               OpBranchConditional %73 %75 %76
+         %75 = OpLabel
+               OpBranch %74
+         %76 = OpLabel
+               OpBranch %68
+         %74 = OpLabel
+         %77 = OpLoad %int %i
+         %79 = OpAccessChain %_ptr_Private_int %map %77
+               OpStore %79 %int_0
+               OpBranch %69
+         %69 = OpLabel
+         %80 = OpLoad %int %i
+         %82 = OpIAdd %int %80 %int_1
+               OpStore %i %82
+               OpBranch %67
+         %68 = OpLabel
+               OpStore %p %83
+               OpStore %canwalk %true
+               OpStore %v %int_0
+               OpBranch %85
+         %85 = OpLabel
+               OpLoopMerge %86 %87 None
+               OpBranch %88
+         %88 = OpLabel
+         %97 = OpLoad %int %v
+         %98 = OpIAdd %int %97 %int_1
+               OpStore %v %98
+               OpStore %directions %int_0
+         %99 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %100 = OpLoad %int %99
+        %101 = OpSGreaterThan %bool %100 %int_0
+               OpStore %x_105_phi %101
+               OpSelectionMerge %102 None
+               OpBranchConditional %101 %103 %102
+        %103 = OpLabel
+        %104 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %105 = OpLoad %int %104
+        %106 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %107 = OpLoad %int %106
+        %109 = OpISub %int %105 %int_2
+        %111 = OpIMul %int %107 %int_16
+        %112 = OpIAdd %int %109 %111
+        %113 = OpAccessChain %_ptr_Private_int %map %112
+        %114 = OpLoad %int %113
+        %115 = OpIEqual %bool %114 %int_0
+               OpStore %x_104 %115
+        %116 = OpLoad %bool %x_104
+               OpStore %x_105_phi %116
+               OpBranch %102
+        %102 = OpLabel
+        %117 = OpLoad %bool %x_105_phi
+               OpSelectionMerge %118 None
+               OpBranchConditional %117 %119 %118
+        %119 = OpLabel
+        %120 = OpLoad %int %directions
+        %121 = OpIAdd %int %120 %int_1
+               OpStore %directions %121
+               OpBranch %118
+        %118 = OpLabel
+        %122 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %123 = OpLoad %int %122
+        %124 = OpSGreaterThan %bool %123 %int_0
+               OpStore %x_125_phi %124
+               OpSelectionMerge %125 None
+               OpBranchConditional %124 %126 %125
+        %126 = OpLabel
+        %127 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %128 = OpLoad %int %127
+        %129 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %130 = OpLoad %int %129
+        %131 = OpISub %int %130 %int_2
+        %132 = OpIMul %int %131 %int_16
+        %133 = OpIAdd %int %128 %132
+        %134 = OpAccessChain %_ptr_Private_int %map %133
+        %135 = OpLoad %int %134
+        %136 = OpIEqual %bool %135 %int_0
+               OpStore %x_124 %136
+        %137 = OpLoad %bool %x_124
+               OpStore %x_125_phi %137
+               OpBranch %125
+        %125 = OpLabel
+        %138 = OpLoad %bool %x_125_phi
+               OpSelectionMerge %139 None
+               OpBranchConditional %138 %140 %139
+        %140 = OpLabel
+        %141 = OpLoad %int %directions
+        %142 = OpIAdd %int %141 %int_1
+               OpStore %directions %142
+               OpBranch %139
+        %139 = OpLabel
+        %143 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %144 = OpLoad %int %143
+        %146 = OpSLessThan %bool %144 %int_14
+               OpStore %x_145_phi %146
+               OpSelectionMerge %147 None
+               OpBranchConditional %146 %148 %147
+        %148 = OpLabel
+        %149 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %150 = OpLoad %int %149
+        %151 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %152 = OpLoad %int %151
+        %153 = OpIAdd %int %150 %int_2
+        %154 = OpIMul %int %152 %int_16
+        %155 = OpIAdd %int %153 %154
+        %156 = OpAccessChain %_ptr_Private_int %map %155
+        %157 = OpLoad %int %156
+        %158 = OpIEqual %bool %157 %int_0
+               OpStore %x_144 %158
+        %159 = OpLoad %bool %x_144
+               OpStore %x_145_phi %159
+               OpBranch %147
+        %147 = OpLabel
+        %160 = OpLoad %bool %x_145_phi
+               OpSelectionMerge %161 None
+               OpBranchConditional %160 %162 %161
+        %162 = OpLabel
+        %163 = OpLoad %int %directions
+        %164 = OpIAdd %int %163 %int_1
+               OpStore %directions %164
+               OpBranch %161
+        %161 = OpLabel
+        %165 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %166 = OpLoad %int %165
+        %167 = OpSLessThan %bool %166 %int_14
+               OpStore %x_165_phi %167
+               OpSelectionMerge %168 None
+               OpBranchConditional %167 %169 %168
+        %169 = OpLabel
+        %170 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %171 = OpLoad %int %170
+        %172 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %173 = OpLoad %int %172
+        %174 = OpIAdd %int %173 %int_2
+        %175 = OpIMul %int %174 %int_16
+        %176 = OpIAdd %int %171 %175
+        %177 = OpAccessChain %_ptr_Private_int %map %176
+        %178 = OpLoad %int %177
+        %179 = OpIEqual %bool %178 %int_0
+               OpStore %x_164 %179
+        %180 = OpLoad %bool %x_164
+               OpStore %x_165_phi %180
+               OpBranch %168
+        %168 = OpLabel
+        %181 = OpLoad %bool %x_165_phi
+               OpSelectionMerge %182 None
+               OpBranchConditional %181 %183 %182
+        %183 = OpLabel
+        %184 = OpLoad %int %directions
+        %185 = OpIAdd %int %184 %int_1
+               OpStore %directions %185
+               OpBranch %182
+        %182 = OpLabel
+        %202 = OpLoad %int %directions
+        %203 = OpIEqual %bool %202 %int_0
+               OpSelectionMerge %204 None
+               OpBranchConditional %203 %205 %206
+        %205 = OpLabel
+               OpStore %canwalk %false
+               OpStore %i %int_0
+               OpBranch %208
+        %208 = OpLabel
+               OpLoopMerge %209 %210 None
+               OpBranch %211
+        %211 = OpLabel
+        %212 = OpLoad %int %i
+        %214 = OpSLessThan %bool %212 %int_8
+               OpSelectionMerge %215 None
+               OpBranchConditional %214 %216 %217
+        %216 = OpLabel
+               OpBranch %215
+        %217 = OpLabel
+               OpBranch %209
+        %215 = OpLabel
+               OpStore %j %int_0
+               OpBranch %218
+        %218 = OpLabel
+               OpLoopMerge %219 %220 None
+               OpBranch %221
+        %221 = OpLabel
+        %222 = OpLoad %int %j
+        %223 = OpSLessThan %bool %222 %int_8
+               OpSelectionMerge %224 None
+               OpBranchConditional %223 %225 %226
+        %225 = OpLabel
+               OpBranch %224
+        %226 = OpLabel
+               OpBranch %219
+        %224 = OpLabel
+        %227 = OpLoad %int %j
+        %228 = OpLoad %int %i
+        %229 = OpIMul %int %227 %int_2
+        %230 = OpIMul %int %228 %int_2
+        %231 = OpIMul %int %230 %int_16
+        %232 = OpIAdd %int %229 %231
+        %233 = OpAccessChain %_ptr_Private_int %map %232
+        %234 = OpLoad %int %233
+        %235 = OpIEqual %bool %234 %int_0
+               OpSelectionMerge %236 None
+               OpBranchConditional %235 %237 %236
+        %237 = OpLabel
+        %238 = OpLoad %int %j
+        %239 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %240 = OpIMul %int %238 %int_2
+               OpStore %239 %240
+        %241 = OpLoad %int %i
+        %242 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %243 = OpIMul %int %241 %int_2
+               OpStore %242 %243
+               OpStore %canwalk %true
+               OpBranch %236
+        %236 = OpLabel
+               OpBranch %220
+        %220 = OpLabel
+        %244 = OpLoad %int %j
+        %245 = OpIAdd %int %244 %int_1
+               OpStore %j %245
+               OpBranch %218
+        %219 = OpLabel
+               OpBranch %210
+        %210 = OpLabel
+        %246 = OpLoad %int %i
+        %247 = OpIAdd %int %246 %int_1
+               OpStore %i %247
+               OpBranch %208
+        %209 = OpLabel
+        %248 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %249 = OpLoad %int %248
+        %250 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %251 = OpLoad %int %250
+        %252 = OpIMul %int %251 %int_16
+        %253 = OpIAdd %int %249 %252
+        %254 = OpAccessChain %_ptr_Private_int %map %253
+               OpStore %254 %int_1
+               OpBranch %204
+        %206 = OpLabel
+        %255 = OpLoad %int %v
+        %256 = OpLoad %int %directions
+        %257 = OpSMod %int %255 %256
+               OpStore %d %257
+        %258 = OpLoad %int %directions
+        %259 = OpLoad %int %v
+        %260 = OpIAdd %int %259 %258
+               OpStore %v %260
+        %261 = OpLoad %int %d
+        %262 = OpSGreaterThanEqual %bool %261 %int_0
+               OpStore %x_230_phi %262
+               OpSelectionMerge %263 None
+               OpBranchConditional %262 %264 %263
+        %264 = OpLabel
+        %265 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %266 = OpLoad %int %265
+        %267 = OpSGreaterThan %bool %266 %int_0
+               OpStore %x_229 %267
+        %268 = OpLoad %bool %x_229
+               OpStore %x_230_phi %268
+               OpBranch %263
+        %263 = OpLabel
+        %269 = OpLoad %bool %x_230_phi
+               OpStore %x_243_phi %269
+               OpSelectionMerge %270 None
+               OpBranchConditional %269 %271 %270
+        %271 = OpLabel
+        %272 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %273 = OpLoad %int %272
+        %274 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %275 = OpLoad %int %274
+        %276 = OpISub %int %273 %int_2
+        %277 = OpIMul %int %275 %int_16
+        %278 = OpIAdd %int %276 %277
+        %279 = OpAccessChain %_ptr_Private_int %map %278
+        %280 = OpLoad %int %279
+        %281 = OpIEqual %bool %280 %int_0
+               OpStore %x_242 %281
+        %282 = OpLoad %bool %x_242
+               OpStore %x_243_phi %282
+               OpBranch %270
+        %270 = OpLabel
+        %283 = OpLoad %bool %x_243_phi
+               OpSelectionMerge %284 None
+               OpBranchConditional %283 %285 %284
+        %285 = OpLabel
+        %286 = OpLoad %int %d
+        %287 = OpISub %int %286 %int_1
+               OpStore %d %287
+        %288 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %289 = OpLoad %int %288
+        %290 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %291 = OpLoad %int %290
+        %292 = OpIMul %int %291 %int_16
+        %293 = OpIAdd %int %289 %292
+        %294 = OpAccessChain %_ptr_Private_int %map %293
+               OpStore %294 %int_1
+        %295 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %296 = OpLoad %int %295
+        %297 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %298 = OpLoad %int %297
+        %299 = OpISub %int %296 %int_1
+        %300 = OpIMul %int %298 %int_16
+        %301 = OpIAdd %int %299 %300
+        %302 = OpAccessChain %_ptr_Private_int %map %301
+               OpStore %302 %int_1
+        %303 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %304 = OpLoad %int %303
+        %305 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %306 = OpLoad %int %305
+        %307 = OpISub %int %304 %int_2
+        %308 = OpIMul %int %306 %int_16
+        %309 = OpIAdd %int %307 %308
+        %310 = OpAccessChain %_ptr_Private_int %map %309
+               OpStore %310 %int_1
+        %311 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %312 = OpLoad %int %311
+        %313 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %314 = OpISub %int %312 %int_2
+               OpStore %313 %314
+               OpBranch %284
+        %284 = OpLabel
+        %315 = OpLoad %int %d
+        %316 = OpSGreaterThanEqual %bool %315 %int_0
+               OpStore %x_282_phi %316
+               OpSelectionMerge %317 None
+               OpBranchConditional %316 %318 %317
+        %318 = OpLabel
+        %319 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %320 = OpLoad %int %319
+        %321 = OpSGreaterThan %bool %320 %int_0
+               OpStore %x_281 %321
+        %322 = OpLoad %bool %x_281
+               OpStore %x_282_phi %322
+               OpBranch %317
+        %317 = OpLabel
+        %323 = OpLoad %bool %x_282_phi
+               OpStore %x_296_phi %323
+               OpSelectionMerge %324 None
+               OpBranchConditional %323 %325 %324
+        %325 = OpLabel
+        %326 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %327 = OpLoad %int %326
+        %328 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %329 = OpLoad %int %328
+        %330 = OpLoad %_arr_int_uint_256 %map
+               OpStore %map %331
+               OpStore %map %330
+        %332 = OpISub %int %329 %int_2
+        %333 = OpIMul %int %332 %int_16
+        %334 = OpIAdd %int %327 %333
+        %335 = OpAccessChain %_ptr_Private_int %map %334
+        %336 = OpLoad %int %335
+        %337 = OpIEqual %bool %336 %int_0
+               OpStore %x_295 %337
+        %338 = OpLoad %bool %x_295
+               OpStore %x_296_phi %338
+               OpBranch %324
+        %324 = OpLabel
+        %339 = OpLoad %bool %x_296_phi
+               OpSelectionMerge %340 None
+               OpBranchConditional %339 %341 %340
+        %341 = OpLabel
+        %342 = OpLoad %int %d
+        %343 = OpISub %int %342 %int_1
+               OpStore %d %343
+        %344 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %345 = OpLoad %int %344
+        %346 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %347 = OpLoad %int %346
+        %348 = OpIMul %int %347 %int_16
+        %349 = OpIAdd %int %345 %348
+        %350 = OpAccessChain %_ptr_Private_int %map %349
+               OpStore %350 %int_1
+        %351 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %352 = OpLoad %int %351
+        %353 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %354 = OpLoad %int %353
+        %355 = OpISub %int %354 %int_1
+        %356 = OpIMul %int %355 %int_16
+        %357 = OpIAdd %int %352 %356
+        %358 = OpAccessChain %_ptr_Private_int %map %357
+               OpStore %358 %int_1
+        %359 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %360 = OpLoad %int %359
+        %361 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %362 = OpLoad %int %361
+        %363 = OpLoad %_arr_int_uint_256 %map
+               OpStore %map %331
+               OpStore %map %363
+        %364 = OpISub %int %362 %int_2
+        %365 = OpIMul %int %364 %int_16
+        %366 = OpIAdd %int %360 %365
+        %367 = OpAccessChain %_ptr_Private_int %map %366
+               OpStore %367 %int_1
+        %368 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %369 = OpLoad %int %368
+        %370 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %371 = OpISub %int %369 %int_2
+               OpStore %370 %371
+               OpBranch %340
+        %340 = OpLabel
+        %372 = OpLoad %int %d
+        %373 = OpSGreaterThanEqual %bool %372 %int_0
+               OpStore %x_336_phi %373
+               OpSelectionMerge %374 None
+               OpBranchConditional %373 %375 %374
+        %375 = OpLabel
+        %376 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %377 = OpLoad %int %376
+        %378 = OpSLessThan %bool %377 %int_14
+               OpStore %x_335 %378
+        %379 = OpLoad %bool %x_335
+               OpStore %x_336_phi %379
+               OpBranch %374
+        %374 = OpLabel
+        %380 = OpLoad %bool %x_336_phi
+               OpStore %x_349_phi %380
+               OpSelectionMerge %381 None
+               OpBranchConditional %380 %382 %381
+        %382 = OpLabel
+        %383 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %384 = OpLoad %int %383
+        %385 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %386 = OpLoad %int %385
+        %387 = OpIAdd %int %384 %int_2
+        %388 = OpIMul %int %386 %int_16
+        %389 = OpIAdd %int %387 %388
+        %390 = OpAccessChain %_ptr_Private_int %map %389
+        %391 = OpLoad %int %390
+        %392 = OpIEqual %bool %391 %int_0
+               OpStore %x_348 %392
+        %393 = OpLoad %bool %x_348
+               OpStore %x_349_phi %393
+               OpBranch %381
+        %381 = OpLabel
+        %394 = OpLoad %bool %x_349_phi
+               OpSelectionMerge %395 None
+               OpBranchConditional %394 %396 %395
+        %396 = OpLabel
+        %397 = OpLoad %int %d
+        %398 = OpISub %int %397 %int_1
+               OpStore %d %398
+        %399 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %400 = OpLoad %int %399
+        %401 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %402 = OpLoad %int %401
+        %403 = OpIMul %int %402 %int_16
+        %404 = OpIAdd %int %400 %403
+        %405 = OpAccessChain %_ptr_Private_int %map %404
+               OpStore %405 %int_1
+        %406 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %407 = OpLoad %int %406
+        %408 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %409 = OpLoad %int %408
+        %410 = OpIAdd %int %407 %int_1
+        %411 = OpIMul %int %409 %int_16
+        %412 = OpIAdd %int %410 %411
+        %413 = OpAccessChain %_ptr_Private_int %map %412
+               OpStore %413 %int_1
+        %414 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %415 = OpLoad %int %414
+        %416 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %417 = OpLoad %int %416
+        %418 = OpIAdd %int %415 %int_2
+        %419 = OpIMul %int %417 %int_16
+        %420 = OpIAdd %int %418 %419
+        %421 = OpAccessChain %_ptr_Private_int %map %420
+               OpStore %421 %int_1
+        %422 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %423 = OpLoad %int %422
+        %424 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %425 = OpIAdd %int %423 %int_2
+               OpStore %424 %425
+               OpBranch %395
+        %395 = OpLabel
+        %426 = OpLoad %int %d
+        %427 = OpSGreaterThanEqual %bool %426 %int_0
+               OpStore %x_388_phi %427
+               OpSelectionMerge %428 None
+               OpBranchConditional %427 %429 %428
+        %429 = OpLabel
+        %430 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %431 = OpLoad %int %430
+        %432 = OpSLessThan %bool %431 %int_14
+               OpStore %x_387 %432
+        %433 = OpLoad %bool %x_387
+               OpStore %x_388_phi %433
+               OpBranch %428
+        %428 = OpLabel
+        %434 = OpLoad %bool %x_388_phi
+               OpStore %x_401_phi %434
+               OpSelectionMerge %435 None
+               OpBranchConditional %434 %436 %435
+        %436 = OpLabel
+        %437 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %438 = OpLoad %int %437
+        %439 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %440 = OpLoad %int %439
+        %441 = OpIAdd %int %440 %int_2
+        %442 = OpIMul %int %441 %int_16
+        %443 = OpIAdd %int %438 %442
+        %444 = OpAccessChain %_ptr_Private_int %map %443
+        %445 = OpLoad %int %444
+        %446 = OpIEqual %bool %445 %int_0
+               OpStore %x_400 %446
+        %447 = OpLoad %bool %x_400
+               OpStore %x_401_phi %447
+               OpBranch %435
+        %435 = OpLabel
+        %448 = OpLoad %bool %x_401_phi
+               OpSelectionMerge %449 None
+               OpBranchConditional %448 %450 %449
+        %450 = OpLabel
+        %451 = OpLoad %int %d
+        %452 = OpISub %int %451 %int_1
+               OpStore %d %452
+        %453 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %454 = OpLoad %int %453
+        %455 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %456 = OpLoad %int %455
+        %457 = OpIMul %int %456 %int_16
+        %458 = OpIAdd %int %454 %457
+        %459 = OpAccessChain %_ptr_Private_int %map %458
+               OpStore %459 %int_1
+        %460 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %461 = OpLoad %int %460
+        %462 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %463 = OpLoad %int %462
+        %464 = OpIAdd %int %463 %int_1
+        %465 = OpIMul %int %464 %int_16
+        %466 = OpIAdd %int %461 %465
+        %467 = OpAccessChain %_ptr_Private_int %map %466
+               OpStore %467 %int_1
+        %468 = OpAccessChain %_ptr_Function_int %p %uint_0
+        %469 = OpLoad %int %468
+        %470 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %471 = OpLoad %int %470
+        %472 = OpIAdd %int %471 %int_2
+        %473 = OpIMul %int %472 %int_16
+        %474 = OpIAdd %int %469 %473
+        %475 = OpAccessChain %_ptr_Private_int %map %474
+               OpStore %475 %int_1
+        %476 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %477 = OpLoad %int %476
+        %478 = OpAccessChain %_ptr_Function_int %p %uint_1
+        %479 = OpIAdd %int %477 %int_2
+               OpStore %478 %479
+               OpBranch %449
+        %449 = OpLabel
+               OpBranch %204
+        %204 = OpLabel
+        %480 = OpAccessChain %_ptr_Function_int %ipos %uint_1
+        %481 = OpLoad %int %480
+        %482 = OpAccessChain %_ptr_Function_int %ipos %uint_0
+        %483 = OpLoad %int %482
+        %484 = OpIMul %int %481 %int_16
+        %485 = OpIAdd %int %484 %483
+        %486 = OpAccessChain %_ptr_Private_int %map %485
+        %487 = OpLoad %int %486
+        %488 = OpIEqual %bool %487 %int_1
+               OpSelectionMerge %489 None
+               OpBranchConditional %488 %490 %489
+        %490 = OpLabel
+               OpStore %x_GLF_color %492
+               OpReturn
+        %489 = OpLabel
+               OpBranch %87
+         %87 = OpLabel
+        %493 = OpLoad %bool %canwalk
+               OpSelectionMerge %494 None
+               OpBranchConditional %493 %495 %496
+        %495 = OpLabel
+               OpBranch %494
+        %496 = OpLabel
+               OpBranch %86
+        %494 = OpLabel
+               OpBranch %85
+         %86 = OpLabel
+               OpStore %x_GLF_color %498
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %499
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %503 = OpLabel
+        %504 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %504
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %22
+        %506 = OpLabel
+        %507 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %507
+        %508 = OpFunctionCall %void %main_1
+        %510 = OpLoad %v4float %x_GLF_color
+        %511 = OpCompositeConstruct %main_out %510
+        %509 = OpFunctionCall %void %tint_symbol_3 %511
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 87[%87] is not post dominated by the back-edge block 494[%494]
+  %494 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/2.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/2.wgsl.expected.wgsl
new file mode 100644
index 0000000..774e546
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-maze-flatten-copy-composite/2.wgsl.expected.wgsl
@@ -0,0 +1,354 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> map : array<i32, 256>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var pos : vec2<f32>;
+  var ipos : vec2<i32>;
+  var i : i32;
+  var p : vec2<i32>;
+  var canwalk : bool;
+  var v : i32;
+  var directions : i32;
+  var j : i32;
+  var d : i32;
+  let x_59 : vec4<f32> = gl_FragCoord;
+  let x_62 : vec2<f32> = x_7.resolution;
+  pos = (vec2<f32>(x_59.x, x_59.y) / x_62);
+  let x_65 : f32 = pos.x;
+  let x_69 : f32 = pos.y;
+  ipos = vec2<i32>(i32((x_65 * 16.0)), i32((x_69 * 16.0)));
+  i = 0;
+  loop {
+    let x_77 : i32 = i;
+    if ((x_77 < 256)) {
+    } else {
+      break;
+    }
+    let x_80 : i32 = i;
+    map[x_80] = 0;
+
+    continuing {
+      let x_82 : i32 = i;
+      i = (x_82 + 1);
+    }
+  }
+  p = vec2<i32>(0, 0);
+  canwalk = true;
+  v = 0;
+  loop {
+    var x_104 : bool;
+    var x_124 : bool;
+    var x_144 : bool;
+    var x_164 : bool;
+    var x_105_phi : bool;
+    var x_125_phi : bool;
+    var x_145_phi : bool;
+    var x_165_phi : bool;
+    let x_88 : i32 = v;
+    v = (x_88 + 1);
+    directions = 0;
+    let x_91 : i32 = p.x;
+    let x_92 : bool = (x_91 > 0);
+    x_105_phi = x_92;
+    if (x_92) {
+      let x_96 : i32 = p.x;
+      let x_99 : i32 = p.y;
+      let x_103 : i32 = map[((x_96 - 2) + (x_99 * 16))];
+      x_104 = (x_103 == 0);
+      x_105_phi = x_104;
+    }
+    let x_105 : bool = x_105_phi;
+    if (x_105) {
+      let x_108 : i32 = directions;
+      directions = (x_108 + 1);
+    }
+    let x_111 : i32 = p.y;
+    let x_112 : bool = (x_111 > 0);
+    x_125_phi = x_112;
+    if (x_112) {
+      let x_116 : i32 = p.x;
+      let x_118 : i32 = p.y;
+      let x_123 : i32 = map[(x_116 + ((x_118 - 2) * 16))];
+      x_124 = (x_123 == 0);
+      x_125_phi = x_124;
+    }
+    let x_125 : bool = x_125_phi;
+    if (x_125) {
+      let x_128 : i32 = directions;
+      directions = (x_128 + 1);
+    }
+    let x_131 : i32 = p.x;
+    let x_132 : bool = (x_131 < 14);
+    x_145_phi = x_132;
+    if (x_132) {
+      let x_136 : i32 = p.x;
+      let x_139 : i32 = p.y;
+      let x_143 : i32 = map[((x_136 + 2) + (x_139 * 16))];
+      x_144 = (x_143 == 0);
+      x_145_phi = x_144;
+    }
+    let x_145 : bool = x_145_phi;
+    if (x_145) {
+      let x_148 : i32 = directions;
+      directions = (x_148 + 1);
+    }
+    let x_151 : i32 = p.y;
+    let x_152 : bool = (x_151 < 14);
+    x_165_phi = x_152;
+    if (x_152) {
+      let x_156 : i32 = p.x;
+      let x_158 : i32 = p.y;
+      let x_163 : i32 = map[(x_156 + ((x_158 + 2) * 16))];
+      x_164 = (x_163 == 0);
+      x_165_phi = x_164;
+    }
+    let x_165 : bool = x_165_phi;
+    if (x_165) {
+      let x_168 : i32 = directions;
+      directions = (x_168 + 1);
+    }
+    var x_229 : bool;
+    var x_242 : bool;
+    var x_281 : bool;
+    var x_295 : bool;
+    var x_335 : bool;
+    var x_348 : bool;
+    var x_387 : bool;
+    var x_400 : bool;
+    var x_230_phi : bool;
+    var x_243_phi : bool;
+    var x_282_phi : bool;
+    var x_296_phi : bool;
+    var x_336_phi : bool;
+    var x_349_phi : bool;
+    var x_388_phi : bool;
+    var x_401_phi : bool;
+    let x_170 : i32 = directions;
+    if ((x_170 == 0)) {
+      canwalk = false;
+      i = 0;
+      loop {
+        let x_179 : i32 = i;
+        if ((x_179 < 8)) {
+        } else {
+          break;
+        }
+        j = 0;
+        loop {
+          let x_186 : i32 = j;
+          if ((x_186 < 8)) {
+          } else {
+            break;
+          }
+          let x_189 : i32 = j;
+          let x_191 : i32 = i;
+          let x_196 : i32 = map[((x_189 * 2) + ((x_191 * 2) * 16))];
+          if ((x_196 == 0)) {
+            let x_200 : i32 = j;
+            p.x = (x_200 * 2);
+            let x_203 : i32 = i;
+            p.y = (x_203 * 2);
+            canwalk = true;
+          }
+
+          continuing {
+            let x_206 : i32 = j;
+            j = (x_206 + 1);
+          }
+        }
+
+        continuing {
+          let x_208 : i32 = i;
+          i = (x_208 + 1);
+        }
+      }
+      let x_211 : i32 = p.x;
+      let x_213 : i32 = p.y;
+      map[(x_211 + (x_213 * 16))] = 1;
+    } else {
+      let x_217 : i32 = v;
+      let x_218 : i32 = directions;
+      d = (x_217 % x_218);
+      let x_220 : i32 = directions;
+      let x_221 : i32 = v;
+      v = (x_221 + x_220);
+      let x_223 : i32 = d;
+      let x_224 : bool = (x_223 >= 0);
+      x_230_phi = x_224;
+      if (x_224) {
+        let x_228 : i32 = p.x;
+        x_229 = (x_228 > 0);
+        x_230_phi = x_229;
+      }
+      let x_230 : bool = x_230_phi;
+      x_243_phi = x_230;
+      if (x_230) {
+        let x_234 : i32 = p.x;
+        let x_237 : i32 = p.y;
+        let x_241 : i32 = map[((x_234 - 2) + (x_237 * 16))];
+        x_242 = (x_241 == 0);
+        x_243_phi = x_242;
+      }
+      let x_243 : bool = x_243_phi;
+      if (x_243) {
+        let x_246 : i32 = d;
+        d = (x_246 - 1);
+        let x_249 : i32 = p.x;
+        let x_251 : i32 = p.y;
+        map[(x_249 + (x_251 * 16))] = 1;
+        let x_256 : i32 = p.x;
+        let x_259 : i32 = p.y;
+        map[((x_256 - 1) + (x_259 * 16))] = 1;
+        let x_264 : i32 = p.x;
+        let x_267 : i32 = p.y;
+        map[((x_264 - 2) + (x_267 * 16))] = 1;
+        let x_272 : i32 = p.x;
+        p.x = (x_272 - 2);
+      }
+      let x_275 : i32 = d;
+      let x_276 : bool = (x_275 >= 0);
+      x_282_phi = x_276;
+      if (x_276) {
+        let x_280 : i32 = p.y;
+        x_281 = (x_280 > 0);
+        x_282_phi = x_281;
+      }
+      let x_282 : bool = x_282_phi;
+      x_296_phi = x_282;
+      if (x_282) {
+        let x_286 : i32 = p.x;
+        let x_288 : i32 = p.y;
+        let x_291 : array<i32, 256> = map;
+        map = array<i32, 256>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+        map = x_291;
+        let x_294 : i32 = map[(x_286 + ((x_288 - 2) * 16))];
+        x_295 = (x_294 == 0);
+        x_296_phi = x_295;
+      }
+      let x_296 : bool = x_296_phi;
+      if (x_296) {
+        let x_299 : i32 = d;
+        d = (x_299 - 1);
+        let x_302 : i32 = p.x;
+        let x_304 : i32 = p.y;
+        map[(x_302 + (x_304 * 16))] = 1;
+        let x_309 : i32 = p.x;
+        let x_311 : i32 = p.y;
+        map[(x_309 + ((x_311 - 1) * 16))] = 1;
+        let x_317 : i32 = p.x;
+        let x_319 : i32 = p.y;
+        let x_321 : array<i32, 256> = map;
+        map = array<i32, 256>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+        map = x_321;
+        map[(x_317 + ((x_319 - 2) * 16))] = 1;
+        let x_326 : i32 = p.y;
+        p.y = (x_326 - 2);
+      }
+      let x_329 : i32 = d;
+      let x_330 : bool = (x_329 >= 0);
+      x_336_phi = x_330;
+      if (x_330) {
+        let x_334 : i32 = p.x;
+        x_335 = (x_334 < 14);
+        x_336_phi = x_335;
+      }
+      let x_336 : bool = x_336_phi;
+      x_349_phi = x_336;
+      if (x_336) {
+        let x_340 : i32 = p.x;
+        let x_343 : i32 = p.y;
+        let x_347 : i32 = map[((x_340 + 2) + (x_343 * 16))];
+        x_348 = (x_347 == 0);
+        x_349_phi = x_348;
+      }
+      let x_349 : bool = x_349_phi;
+      if (x_349) {
+        let x_352 : i32 = d;
+        d = (x_352 - 1);
+        let x_355 : i32 = p.x;
+        let x_357 : i32 = p.y;
+        map[(x_355 + (x_357 * 16))] = 1;
+        let x_362 : i32 = p.x;
+        let x_365 : i32 = p.y;
+        map[((x_362 + 1) + (x_365 * 16))] = 1;
+        let x_370 : i32 = p.x;
+        let x_373 : i32 = p.y;
+        map[((x_370 + 2) + (x_373 * 16))] = 1;
+        let x_378 : i32 = p.x;
+        p.x = (x_378 + 2);
+      }
+      let x_381 : i32 = d;
+      let x_382 : bool = (x_381 >= 0);
+      x_388_phi = x_382;
+      if (x_382) {
+        let x_386 : i32 = p.y;
+        x_387 = (x_386 < 14);
+        x_388_phi = x_387;
+      }
+      let x_388 : bool = x_388_phi;
+      x_401_phi = x_388;
+      if (x_388) {
+        let x_392 : i32 = p.x;
+        let x_394 : i32 = p.y;
+        let x_399 : i32 = map[(x_392 + ((x_394 + 2) * 16))];
+        x_400 = (x_399 == 0);
+        x_401_phi = x_400;
+      }
+      let x_401 : bool = x_401_phi;
+      if (x_401) {
+        let x_404 : i32 = d;
+        d = (x_404 - 1);
+        let x_407 : i32 = p.x;
+        let x_409 : i32 = p.y;
+        map[(x_407 + (x_409 * 16))] = 1;
+        let x_414 : i32 = p.x;
+        let x_416 : i32 = p.y;
+        map[(x_414 + ((x_416 + 1) * 16))] = 1;
+        let x_422 : i32 = p.x;
+        let x_424 : i32 = p.y;
+        map[(x_422 + ((x_424 + 2) * 16))] = 1;
+        let x_430 : i32 = p.y;
+        p.y = (x_430 + 2);
+      }
+    }
+    let x_434 : i32 = ipos.y;
+    let x_437 : i32 = ipos.x;
+    let x_440 : i32 = map[((x_434 * 16) + x_437)];
+    if ((x_440 == 1)) {
+      x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+      return;
+    }
+
+    continuing {
+      let x_444 : bool = canwalk;
+      if (x_444) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/1.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/1.spvasm
new file mode 100644
index 0000000..3e57abd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/1.spvasm
@@ -0,0 +1,386 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %data "data"
+               OpName %temp "temp"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+     %int_10 = OpConstant %int 10
+      %int_0 = OpConstant %int 0
+      %int_9 = OpConstant %int 9
+      %int_2 = OpConstant %int 2
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_4 = OpConstant %int 4
+      %int_3 = OpConstant %int 3
+     %int_n1 = OpConstant %int -1
+     %int_n2 = OpConstant %int -2
+     %int_n3 = OpConstant %int -3
+     %int_n4 = OpConstant %int -4
+     %int_n5 = OpConstant %int -5
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+     %int_30 = OpConstant %int 30
+  %float_0_5 = OpConstant %float 0.5
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+%float_0_100000001 = OpConstant %float 0.100000001
+    %int_0_0 = OpConstant %int 0
+         %57 = OpConstantComposite %_arr_int_uint_10 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0
+       %main = OpFunction %void None %10
+         %58 = OpLabel
+       %temp = OpVariable %_ptr_Function__arr_int_uint_10 Function
+       %data = OpVariable %_ptr_Function__arr_int_uint_10 Function
+         %59 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %60 = OpLoad %float %59
+         %61 = OpConvertFToS %int %60
+               OpBranch %62
+         %62 = OpLabel
+         %63 = OpPhi %int %61 %58 %64 %65
+               OpLoopMerge %66 %65 None
+               OpBranch %67
+         %67 = OpLabel
+         %68 = OpLoad %_arr_int_uint_10 %data
+               OpStore %data %57
+               OpStore %data %68
+         %69 = OpIAdd %int %63 %int_1
+               OpSelectionMerge %70 None
+               OpSwitch %63 %70 0 %71 1 %72 2 %73 3 %74 4 %75 5 %76 6 %77 7 %78 8 %79 9 %80
+         %71 = OpLabel
+         %81 = OpAccessChain %_ptr_Function_int %data %63
+               OpStore %81 %int_4
+         %82 = OpIAdd %int %63 %int_1
+               OpBranch %70
+         %72 = OpLabel
+         %83 = OpAccessChain %_ptr_Function_int %data %63
+               OpStore %83 %int_3
+         %84 = OpIAdd %int %63 %int_1
+               OpBranch %70
+         %73 = OpLabel
+         %85 = OpAccessChain %_ptr_Function_int %data %63
+               OpStore %85 %int_2
+         %86 = OpIAdd %int %63 %int_1
+               OpBranch %70
+         %74 = OpLabel
+         %87 = OpAccessChain %_ptr_Function_int %data %63
+               OpStore %87 %int_1
+         %88 = OpIAdd %int %63 %int_1
+               OpBranch %70
+         %75 = OpLabel
+         %89 = OpAccessChain %_ptr_Function_int %data %63
+               OpStore %89 %int_0
+         %90 = OpIAdd %int %63 %int_1
+               OpBranch %70
+         %76 = OpLabel
+         %91 = OpAccessChain %_ptr_Function_int %data %63
+               OpStore %91 %int_n1
+         %92 = OpIAdd %int %63 %int_1
+               OpBranch %70
+         %77 = OpLabel
+         %93 = OpAccessChain %_ptr_Function_int %data %63
+               OpStore %93 %int_n2
+         %94 = OpIAdd %int %63 %int_1
+               OpBranch %70
+         %78 = OpLabel
+         %95 = OpAccessChain %_ptr_Function_int %data %63
+               OpStore %95 %int_n3
+         %96 = OpIAdd %int %63 %int_1
+               OpBranch %70
+         %79 = OpLabel
+         %97 = OpAccessChain %_ptr_Function_int %data %63
+               OpStore %97 %int_n4
+         %98 = OpIAdd %int %63 %int_1
+               OpBranch %70
+         %80 = OpLabel
+         %99 = OpAccessChain %_ptr_Function_int %data %63
+               OpStore %99 %int_n5
+        %100 = OpIAdd %int %63 %int_1
+               OpBranch %70
+         %70 = OpLabel
+         %64 = OpPhi %int %69 %67 %82 %71 %84 %72 %86 %73 %88 %74 %90 %75 %92 %76 %94 %77 %96 %78 %98 %79 %100 %80
+               OpBranch %65
+         %65 = OpLabel
+        %101 = OpSLessThan %bool %64 %int_10
+               OpBranchConditional %101 %62 %66
+         %66 = OpLabel
+               OpBranch %102
+        %102 = OpLabel
+        %103 = OpPhi %int %int_0 %66 %104 %105
+        %106 = OpSLessThan %bool %103 %int_10
+               OpLoopMerge %107 %105 None
+               OpBranchConditional %106 %105 %107
+        %105 = OpLabel
+        %108 = OpAccessChain %_ptr_Function_int %data %103
+        %109 = OpLoad %int %108
+        %110 = OpAccessChain %_ptr_Function_int %temp %103
+               OpStore %110 %109
+        %104 = OpIAdd %int %103 %int_1
+               OpBranch %102
+        %107 = OpLabel
+               OpBranch %111
+        %111 = OpLabel
+        %112 = OpPhi %int %int_1 %107 %113 %114
+        %115 = OpSLessThanEqual %bool %112 %int_9
+               OpLoopMerge %116 %114 None
+               OpBranchConditional %115 %117 %116
+        %117 = OpLabel
+               OpBranch %118
+        %118 = OpLabel
+        %119 = OpPhi %int %int_0 %117 %120 %121
+        %122 = OpSLessThan %bool %119 %int_9
+               OpLoopMerge %123 %121 None
+               OpBranchConditional %122 %124 %123
+        %124 = OpLabel
+        %125 = OpIAdd %int %119 %112
+        %126 = OpISub %int %125 %int_1
+        %127 = OpIMul %int %int_2 %112
+        %120 = OpIAdd %int %119 %127
+        %128 = OpISub %int %120 %int_1
+        %129 = OpExtInst %int %1 SMin %128 %int_9
+               OpBranch %130
+        %130 = OpLabel
+        %131 = OpPhi %int %119 %124 %132 %133
+        %134 = OpPhi %int %125 %124 %135 %133
+        %136 = OpPhi %int %119 %124 %137 %133
+        %138 = OpSLessThanEqual %bool %136 %126
+        %139 = OpSLessThanEqual %bool %134 %129
+        %140 = OpLogicalAnd %bool %138 %139
+               OpLoopMerge %141 %133 None
+               OpBranchConditional %140 %142 %141
+        %142 = OpLabel
+        %143 = OpAccessChain %_ptr_Function_int %data %136
+        %144 = OpLoad %int %143
+        %145 = OpAccessChain %_ptr_Function_int %data %134
+        %146 = OpLoad %int %145
+        %147 = OpSLessThan %bool %144 %146
+        %132 = OpIAdd %int %131 %int_1
+               OpSelectionMerge %148 None
+               OpBranchConditional %147 %149 %150
+        %149 = OpLabel
+        %151 = OpIAdd %int %136 %int_1
+        %152 = OpLoad %int %143
+        %153 = OpAccessChain %_ptr_Function_int %temp %131
+               OpStore %153 %152
+               OpBranch %148
+        %150 = OpLabel
+        %154 = OpIAdd %int %134 %int_1
+        %155 = OpLoad %int %145
+        %156 = OpAccessChain %_ptr_Function_int %temp %131
+               OpStore %156 %155
+               OpBranch %148
+        %148 = OpLabel
+        %135 = OpPhi %int %134 %149 %154 %150
+        %137 = OpPhi %int %151 %149 %136 %150
+               OpBranch %133
+        %133 = OpLabel
+               OpBranch %130
+        %141 = OpLabel
+               OpBranch %157
+        %157 = OpLabel
+        %158 = OpPhi %int %131 %141 %159 %160
+        %161 = OpPhi %int %136 %141 %162 %160
+        %163 = OpSLessThan %bool %161 %int_10
+        %164 = OpSLessThanEqual %bool %161 %126
+        %165 = OpLogicalAnd %bool %163 %164
+               OpLoopMerge %166 %160 None
+               OpBranchConditional %165 %160 %166
+        %160 = OpLabel
+        %159 = OpIAdd %int %158 %int_1
+        %162 = OpIAdd %int %161 %int_1
+        %167 = OpAccessChain %_ptr_Function_int %data %161
+        %168 = OpLoad %int %167
+        %169 = OpAccessChain %_ptr_Function_int %temp %158
+               OpStore %169 %168
+               OpBranch %157
+        %166 = OpLabel
+               OpBranch %170
+        %170 = OpLabel
+        %171 = OpPhi %int %119 %166 %172 %173
+        %174 = OpSLessThanEqual %bool %171 %129
+               OpLoopMerge %175 %173 None
+               OpBranchConditional %174 %173 %175
+        %173 = OpLabel
+        %176 = OpAccessChain %_ptr_Function_int %temp %171
+        %177 = OpLoad %int %176
+        %178 = OpAccessChain %_ptr_Function_int %data %171
+               OpStore %178 %177
+        %172 = OpIAdd %int %171 %int_1
+               OpBranch %170
+        %175 = OpLabel
+               OpBranch %121
+        %121 = OpLabel
+               OpBranch %118
+        %123 = OpLabel
+               OpBranch %114
+        %114 = OpLabel
+        %113 = OpIMul %int %int_2 %112
+               OpBranch %111
+        %116 = OpLabel
+        %179 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %180 = OpLoad %float %179
+        %181 = OpConvertFToS %int %180
+        %182 = OpSLessThan %bool %181 %int_30
+               OpSelectionMerge %183 None
+               OpBranchConditional %182 %184 %185
+        %184 = OpLabel
+        %186 = OpAccessChain %_ptr_Function_int %data %int_0
+        %187 = OpLoad %int %186
+        %188 = OpConvertSToF %float %187
+        %189 = OpFMul %float %188 %float_0_100000001
+        %190 = OpFAdd %float %float_0_5 %189
+               OpBranch %183
+        %185 = OpLabel
+        %191 = OpSLessThan %bool %181 %int_60
+               OpSelectionMerge %192 None
+               OpBranchConditional %191 %193 %194
+        %193 = OpLabel
+        %195 = OpAccessChain %_ptr_Function_int %data %int_1
+        %196 = OpLoad %int %195
+        %197 = OpConvertSToF %float %196
+        %198 = OpFMul %float %197 %float_0_100000001
+        %199 = OpFAdd %float %float_0_5 %198
+               OpBranch %192
+        %194 = OpLabel
+        %200 = OpSLessThan %bool %181 %int_90
+               OpSelectionMerge %201 None
+               OpBranchConditional %200 %202 %203
+        %202 = OpLabel
+        %204 = OpAccessChain %_ptr_Function_int %data %int_2
+        %205 = OpLoad %int %204
+        %206 = OpConvertSToF %float %205
+        %207 = OpFMul %float %206 %float_0_100000001
+        %208 = OpFAdd %float %float_0_5 %207
+               OpBranch %201
+        %203 = OpLabel
+        %209 = OpSLessThan %bool %181 %int_120
+               OpSelectionMerge %210 None
+               OpBranchConditional %209 %211 %212
+        %211 = OpLabel
+        %213 = OpAccessChain %_ptr_Function_int %data %int_3
+        %214 = OpLoad %int %213
+        %215 = OpConvertSToF %float %214
+        %216 = OpFMul %float %215 %float_0_100000001
+        %217 = OpFAdd %float %float_0_5 %216
+               OpBranch %210
+        %212 = OpLabel
+        %218 = OpSLessThan %bool %181 %int_150
+               OpSelectionMerge %219 None
+               OpBranchConditional %218 %220 %221
+        %220 = OpLabel
+               OpKill
+        %221 = OpLabel
+        %222 = OpSLessThan %bool %181 %int_180
+               OpSelectionMerge %223 None
+               OpBranchConditional %222 %224 %225
+        %224 = OpLabel
+        %226 = OpAccessChain %_ptr_Function_int %data %int_5
+        %227 = OpLoad %int %226
+        %228 = OpConvertSToF %float %227
+        %229 = OpFMul %float %228 %float_0_100000001
+        %230 = OpFAdd %float %float_0_5 %229
+               OpBranch %223
+        %225 = OpLabel
+        %231 = OpSLessThan %bool %181 %int_210
+               OpSelectionMerge %232 None
+               OpBranchConditional %231 %233 %234
+        %233 = OpLabel
+        %235 = OpAccessChain %_ptr_Function_int %data %int_6
+        %236 = OpLoad %int %235
+        %237 = OpConvertSToF %float %236
+        %238 = OpFMul %float %237 %float_0_100000001
+        %239 = OpFAdd %float %float_0_5 %238
+               OpBranch %232
+        %234 = OpLabel
+        %240 = OpSLessThan %bool %181 %int_240
+               OpSelectionMerge %241 None
+               OpBranchConditional %240 %242 %243
+        %242 = OpLabel
+        %244 = OpAccessChain %_ptr_Function_int %data %int_7
+        %245 = OpLoad %int %244
+        %246 = OpConvertSToF %float %245
+        %247 = OpFMul %float %246 %float_0_100000001
+        %248 = OpFAdd %float %float_0_5 %247
+               OpBranch %241
+        %243 = OpLabel
+        %249 = OpSLessThan %bool %181 %int_270
+               OpSelectionMerge %250 None
+               OpBranchConditional %249 %250 %251
+        %250 = OpLabel
+        %252 = OpAccessChain %_ptr_Function_int %data %int_8
+        %253 = OpLoad %int %252
+        %254 = OpConvertSToF %float %253
+        %255 = OpFMul %float %254 %float_0_100000001
+        %256 = OpFAdd %float %float_0_5 %255
+               OpBranch %241
+        %251 = OpLabel
+               OpKill
+        %241 = OpLabel
+        %257 = OpPhi %float %248 %242 %256 %250
+               OpBranch %232
+        %232 = OpLabel
+        %258 = OpPhi %float %239 %233 %257 %241
+               OpBranch %223
+        %223 = OpLabel
+        %259 = OpPhi %float %230 %224 %258 %232
+               OpBranch %219
+        %219 = OpLabel
+               OpBranch %210
+        %210 = OpLabel
+        %260 = OpPhi %float %217 %211 %259 %219
+               OpBranch %201
+        %201 = OpLabel
+        %261 = OpPhi %float %208 %202 %260 %210
+               OpBranch %192
+        %192 = OpLabel
+        %262 = OpPhi %float %199 %193 %261 %201
+               OpBranch %183
+        %183 = OpLabel
+        %263 = OpPhi %float %190 %184 %262 %192
+        %264 = OpCompositeConstruct %v4float %263 %263 %263 %float_1
+               OpStore %_GLF_color %264
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..975a0e5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/1.spvasm.expected.hlsl
@@ -0,0 +1,356 @@
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int temp[10] = (int[10])0;
+  int data[10] = (int[10])0;
+  float x_190 = 0.0f;
+  float x_262 = 0.0f;
+  int x_63_phi = 0;
+  int x_103_phi = 0;
+  int x_112_phi = 0;
+  float x_263_phi = 0.0f;
+  const float x_60 = asfloat(x_8[0].x);
+  const int x_61 = int(x_60);
+  x_63_phi = x_61;
+  while (true) {
+    int x_100 = 0;
+    int x_98 = 0;
+    int x_96 = 0;
+    int x_94 = 0;
+    int x_92 = 0;
+    int x_90 = 0;
+    int x_88 = 0;
+    int x_86 = 0;
+    int x_84 = 0;
+    int x_82 = 0;
+    int x_64_phi = 0;
+    const int x_63 = x_63_phi;
+    const int x_68[10] = data;
+    const int tint_symbol_5[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+    data = tint_symbol_5;
+    data = x_68;
+    const int x_69 = (x_63 + 1);
+    x_64_phi = x_69;
+    switch(x_63) {
+      case 9: {
+        data[x_63] = -5;
+        x_100 = (x_63 + 1);
+        x_64_phi = x_100;
+        break;
+      }
+      case 8: {
+        data[x_63] = -4;
+        x_98 = (x_63 + 1);
+        x_64_phi = x_98;
+        break;
+      }
+      case 7: {
+        data[x_63] = -3;
+        x_96 = (x_63 + 1);
+        x_64_phi = x_96;
+        break;
+      }
+      case 6: {
+        data[x_63] = -2;
+        x_94 = (x_63 + 1);
+        x_64_phi = x_94;
+        break;
+      }
+      case 5: {
+        data[x_63] = -1;
+        x_92 = (x_63 + 1);
+        x_64_phi = x_92;
+        break;
+      }
+      case 4: {
+        data[x_63] = 0;
+        x_90 = (x_63 + 1);
+        x_64_phi = x_90;
+        break;
+      }
+      case 3: {
+        data[x_63] = 1;
+        x_88 = (x_63 + 1);
+        x_64_phi = x_88;
+        break;
+      }
+      case 2: {
+        data[x_63] = 2;
+        x_86 = (x_63 + 1);
+        x_64_phi = x_86;
+        break;
+      }
+      case 1: {
+        data[x_63] = 3;
+        x_84 = (x_63 + 1);
+        x_64_phi = x_84;
+        break;
+      }
+      case 0: {
+        data[x_63] = 4;
+        x_82 = (x_63 + 1);
+        x_64_phi = x_82;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    const int x_64 = x_64_phi;
+    {
+      x_63_phi = x_64;
+      if ((x_64 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_103_phi = 0;
+  while (true) {
+    int x_104 = 0;
+    const int x_103 = x_103_phi;
+    if ((x_103 < 10)) {
+    } else {
+      break;
+    }
+    {
+      const int x_109 = data[x_103];
+      temp[x_103] = x_109;
+      x_104 = (x_103 + 1);
+      x_103_phi = x_104;
+    }
+  }
+  x_112_phi = 1;
+  while (true) {
+    int x_113 = 0;
+    int x_119_phi = 0;
+    const int x_112 = x_112_phi;
+    if ((x_112 <= 9)) {
+    } else {
+      break;
+    }
+    x_119_phi = 0;
+    while (true) {
+      int x_131 = 0;
+      int x_136 = 0;
+      int x_131_phi = 0;
+      int x_134_phi = 0;
+      int x_136_phi = 0;
+      int x_158_phi = 0;
+      int x_161_phi = 0;
+      int x_171_phi = 0;
+      const int x_119 = x_119_phi;
+      if ((x_119 < 9)) {
+      } else {
+        break;
+      }
+      const int x_125 = (x_119 + x_112);
+      const int x_126 = (x_125 - 1);
+      const int x_120 = (x_119 + (2 * x_112));
+      const int x_129 = min((x_120 - 1), 9);
+      x_131_phi = x_119;
+      x_134_phi = x_125;
+      x_136_phi = x_119;
+      while (true) {
+        int x_151 = 0;
+        int x_154 = 0;
+        int x_135_phi = 0;
+        int x_137_phi = 0;
+        x_131 = x_131_phi;
+        const int x_134 = x_134_phi;
+        x_136 = x_136_phi;
+        bool tint_tmp = (x_136 <= x_126);
+        if (tint_tmp) {
+          tint_tmp = (x_134 <= x_129);
+        }
+        if ((tint_tmp)) {
+        } else {
+          break;
+        }
+        const int x_143_save = x_136;
+        const int x_144 = data[x_143_save];
+        const int x_145_save = x_134;
+        const int x_146 = data[x_145_save];
+        const int x_132 = asint((x_131 + asint(1)));
+        if ((x_144 < x_146)) {
+          x_151 = asint((x_136 + asint(1)));
+          const int x_152 = data[x_143_save];
+          temp[x_131] = x_152;
+          x_135_phi = x_134;
+          x_137_phi = x_151;
+        } else {
+          x_154 = (x_134 + 1);
+          const int x_155 = data[x_145_save];
+          temp[x_131] = x_155;
+          x_135_phi = x_154;
+          x_137_phi = x_136;
+        }
+        const int x_135 = x_135_phi;
+        const int x_137 = x_137_phi;
+        {
+          x_131_phi = x_132;
+          x_134_phi = x_135;
+          x_136_phi = x_137;
+        }
+      }
+      x_158_phi = x_131;
+      x_161_phi = x_136;
+      while (true) {
+        int x_159 = 0;
+        int x_162 = 0;
+        const int x_158 = x_158_phi;
+        const int x_161 = x_161_phi;
+        bool tint_tmp_1 = (x_161 < 10);
+        if (tint_tmp_1) {
+          tint_tmp_1 = (x_161 <= x_126);
+        }
+        if ((tint_tmp_1)) {
+        } else {
+          break;
+        }
+        {
+          x_159 = (x_158 + 1);
+          x_162 = (x_161 + 1);
+          const int x_168 = data[x_161];
+          temp[x_158] = x_168;
+          x_158_phi = x_159;
+          x_161_phi = x_162;
+        }
+      }
+      x_171_phi = x_119;
+      while (true) {
+        int x_172 = 0;
+        const int x_171 = x_171_phi;
+        if ((x_171 <= x_129)) {
+        } else {
+          break;
+        }
+        {
+          const int x_177 = temp[x_171];
+          data[x_171] = x_177;
+          x_172 = (x_171 + 1);
+          x_171_phi = x_172;
+        }
+      }
+      {
+        x_119_phi = x_120;
+      }
+    }
+    {
+      x_113 = (2 * x_112);
+      x_112_phi = x_113;
+    }
+  }
+  int x_181 = 0;
+  float x_199 = 0.0f;
+  float x_261 = 0.0f;
+  float x_262_phi = 0.0f;
+  const float x_180 = gl_FragCoord.y;
+  x_181 = int(x_180);
+  if ((x_181 < 30)) {
+    const int x_187 = data[0];
+    x_190 = (0.5f + (float(x_187) * 0.100000001f));
+    x_263_phi = x_190;
+  } else {
+    float x_208 = 0.0f;
+    float x_260 = 0.0f;
+    float x_261_phi = 0.0f;
+    if ((x_181 < 60)) {
+      const int x_196 = data[1];
+      x_199 = (0.5f + (float(x_196) * 0.100000001f));
+      x_262_phi = x_199;
+    } else {
+      float x_217 = 0.0f;
+      float x_259 = 0.0f;
+      float x_260_phi = 0.0f;
+      if ((x_181 < 90)) {
+        const int x_205 = data[2];
+        x_208 = (0.5f + (float(x_205) * 0.100000001f));
+        x_261_phi = x_208;
+      } else {
+        if ((x_181 < 120)) {
+          const int x_214 = data[3];
+          x_217 = (0.5f + (float(x_214) * 0.100000001f));
+          x_260_phi = x_217;
+        } else {
+          float x_230 = 0.0f;
+          float x_258 = 0.0f;
+          float x_259_phi = 0.0f;
+          if ((x_181 < 150)) {
+            discard;
+          } else {
+            float x_239 = 0.0f;
+            float x_257 = 0.0f;
+            float x_258_phi = 0.0f;
+            if ((x_181 < 180)) {
+              const int x_227 = data[5];
+              x_230 = (0.5f + (float(x_227) * 0.100000001f));
+              x_259_phi = x_230;
+            } else {
+              float x_248 = 0.0f;
+              float x_256 = 0.0f;
+              float x_257_phi = 0.0f;
+              if ((x_181 < 210)) {
+                const int x_236 = data[6];
+                x_239 = (0.5f + (float(x_236) * 0.100000001f));
+                x_258_phi = x_239;
+              } else {
+                if ((x_181 < 240)) {
+                  const int x_245 = data[7];
+                  x_248 = (0.5f + (float(x_245) * 0.100000001f));
+                  x_257_phi = x_248;
+                } else {
+                  if ((x_181 < 270)) {
+                  } else {
+                    discard;
+                  }
+                  const int x_253 = data[8];
+                  x_256 = (0.5f + (float(x_253) * 0.100000001f));
+                  x_257_phi = x_256;
+                }
+                x_257 = x_257_phi;
+                x_258_phi = x_257;
+              }
+              x_258 = x_258_phi;
+              x_259_phi = x_258;
+            }
+            x_259 = x_259_phi;
+          }
+          x_260_phi = x_259;
+        }
+        x_260 = x_260_phi;
+        x_261_phi = x_260;
+      }
+      x_261 = x_261_phi;
+      x_262_phi = x_261;
+    }
+    x_262 = x_262_phi;
+    x_263_phi = x_262;
+  }
+  const float x_263 = x_263_phi;
+  x_GLF_color = float4(x_263, x_263, x_263, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/1.spvasm.expected.msl
new file mode 100644
index 0000000..e8a7ca8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/1.spvasm.expected.msl
@@ -0,0 +1,350 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  tint_array_wrapper temp = {};
+  tint_array_wrapper data = {};
+  float x_190 = 0.0f;
+  float x_262 = 0.0f;
+  int x_63_phi = 0;
+  int x_103_phi = 0;
+  int x_112_phi = 0;
+  float x_263_phi = 0.0f;
+  float const x_60 = x_8.injectionSwitch.x;
+  int const x_61 = int(x_60);
+  x_63_phi = x_61;
+  while (true) {
+    int x_100 = 0;
+    int x_98 = 0;
+    int x_96 = 0;
+    int x_94 = 0;
+    int x_92 = 0;
+    int x_90 = 0;
+    int x_88 = 0;
+    int x_86 = 0;
+    int x_84 = 0;
+    int x_82 = 0;
+    int x_64_phi = 0;
+    int const x_63 = x_63_phi;
+    tint_array_wrapper const x_68 = data;
+    tint_array_wrapper const tint_symbol_4 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+    data = tint_symbol_4;
+    data = x_68;
+    int const x_69 = (x_63 + 1);
+    x_64_phi = x_69;
+    switch(x_63) {
+      case 9: {
+        data.arr[x_63] = -5;
+        x_100 = (x_63 + 1);
+        x_64_phi = x_100;
+        break;
+      }
+      case 8: {
+        data.arr[x_63] = -4;
+        x_98 = (x_63 + 1);
+        x_64_phi = x_98;
+        break;
+      }
+      case 7: {
+        data.arr[x_63] = -3;
+        x_96 = (x_63 + 1);
+        x_64_phi = x_96;
+        break;
+      }
+      case 6: {
+        data.arr[x_63] = -2;
+        x_94 = (x_63 + 1);
+        x_64_phi = x_94;
+        break;
+      }
+      case 5: {
+        data.arr[x_63] = -1;
+        x_92 = (x_63 + 1);
+        x_64_phi = x_92;
+        break;
+      }
+      case 4: {
+        data.arr[x_63] = 0;
+        x_90 = (x_63 + 1);
+        x_64_phi = x_90;
+        break;
+      }
+      case 3: {
+        data.arr[x_63] = 1;
+        x_88 = (x_63 + 1);
+        x_64_phi = x_88;
+        break;
+      }
+      case 2: {
+        data.arr[x_63] = 2;
+        x_86 = (x_63 + 1);
+        x_64_phi = x_86;
+        break;
+      }
+      case 1: {
+        data.arr[x_63] = 3;
+        x_84 = (x_63 + 1);
+        x_64_phi = x_84;
+        break;
+      }
+      case 0: {
+        data.arr[x_63] = 4;
+        x_82 = (x_63 + 1);
+        x_64_phi = x_82;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    int const x_64 = x_64_phi;
+    {
+      x_63_phi = x_64;
+      if ((x_64 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_103_phi = 0;
+  while (true) {
+    int x_104 = 0;
+    int const x_103 = x_103_phi;
+    if ((x_103 < 10)) {
+    } else {
+      break;
+    }
+    {
+      int const x_109 = data.arr[x_103];
+      temp.arr[x_103] = x_109;
+      x_104 = (x_103 + 1);
+      x_103_phi = x_104;
+    }
+  }
+  x_112_phi = 1;
+  while (true) {
+    int x_113 = 0;
+    int x_119_phi = 0;
+    int const x_112 = x_112_phi;
+    if ((x_112 <= 9)) {
+    } else {
+      break;
+    }
+    x_119_phi = 0;
+    while (true) {
+      int x_131 = 0;
+      int x_136 = 0;
+      int x_131_phi = 0;
+      int x_134_phi = 0;
+      int x_136_phi = 0;
+      int x_158_phi = 0;
+      int x_161_phi = 0;
+      int x_171_phi = 0;
+      int const x_119 = x_119_phi;
+      if ((x_119 < 9)) {
+      } else {
+        break;
+      }
+      int const x_125 = (x_119 + x_112);
+      int const x_126 = (x_125 - 1);
+      int const x_120 = (x_119 + (2 * x_112));
+      int const x_129 = min((x_120 - 1), 9);
+      x_131_phi = x_119;
+      x_134_phi = x_125;
+      x_136_phi = x_119;
+      while (true) {
+        int x_151 = 0;
+        int x_154 = 0;
+        int x_135_phi = 0;
+        int x_137_phi = 0;
+        x_131 = x_131_phi;
+        int const x_134 = x_134_phi;
+        x_136 = x_136_phi;
+        if (((x_136 <= x_126) && (x_134 <= x_129))) {
+        } else {
+          break;
+        }
+        int const x_143_save = x_136;
+        int const x_144 = data.arr[x_143_save];
+        int const x_145_save = x_134;
+        int const x_146 = data.arr[x_145_save];
+        int const x_132 = as_type<int>((x_131 + as_type<int>(1)));
+        if ((x_144 < x_146)) {
+          x_151 = as_type<int>((x_136 + as_type<int>(1)));
+          int const x_152 = data.arr[x_143_save];
+          temp.arr[x_131] = x_152;
+          x_135_phi = x_134;
+          x_137_phi = x_151;
+        } else {
+          x_154 = (x_134 + 1);
+          int const x_155 = data.arr[x_145_save];
+          temp.arr[x_131] = x_155;
+          x_135_phi = x_154;
+          x_137_phi = x_136;
+        }
+        int const x_135 = x_135_phi;
+        int const x_137 = x_137_phi;
+        {
+          x_131_phi = x_132;
+          x_134_phi = x_135;
+          x_136_phi = x_137;
+        }
+      }
+      x_158_phi = x_131;
+      x_161_phi = x_136;
+      while (true) {
+        int x_159 = 0;
+        int x_162 = 0;
+        int const x_158 = x_158_phi;
+        int const x_161 = x_161_phi;
+        if (((x_161 < 10) && (x_161 <= x_126))) {
+        } else {
+          break;
+        }
+        {
+          x_159 = (x_158 + 1);
+          x_162 = (x_161 + 1);
+          int const x_168 = data.arr[x_161];
+          temp.arr[x_158] = x_168;
+          x_158_phi = x_159;
+          x_161_phi = x_162;
+        }
+      }
+      x_171_phi = x_119;
+      while (true) {
+        int x_172 = 0;
+        int const x_171 = x_171_phi;
+        if ((x_171 <= x_129)) {
+        } else {
+          break;
+        }
+        {
+          int const x_177 = temp.arr[x_171];
+          data.arr[x_171] = x_177;
+          x_172 = (x_171 + 1);
+          x_171_phi = x_172;
+        }
+      }
+      {
+        x_119_phi = x_120;
+      }
+    }
+    {
+      x_113 = (2 * x_112);
+      x_112_phi = x_113;
+    }
+  }
+  int x_181 = 0;
+  float x_199 = 0.0f;
+  float x_261 = 0.0f;
+  float x_262_phi = 0.0f;
+  float const x_180 = (*(tint_symbol_6)).y;
+  x_181 = int(x_180);
+  if ((x_181 < 30)) {
+    int const x_187 = data.arr[0];
+    x_190 = (0.5f + (float(x_187) * 0.100000001f));
+    x_263_phi = x_190;
+  } else {
+    float x_208 = 0.0f;
+    float x_260 = 0.0f;
+    float x_261_phi = 0.0f;
+    if ((x_181 < 60)) {
+      int const x_196 = data.arr[1];
+      x_199 = (0.5f + (float(x_196) * 0.100000001f));
+      x_262_phi = x_199;
+    } else {
+      float x_217 = 0.0f;
+      float x_259 = 0.0f;
+      float x_260_phi = 0.0f;
+      if ((x_181 < 90)) {
+        int const x_205 = data.arr[2];
+        x_208 = (0.5f + (float(x_205) * 0.100000001f));
+        x_261_phi = x_208;
+      } else {
+        if ((x_181 < 120)) {
+          int const x_214 = data.arr[3];
+          x_217 = (0.5f + (float(x_214) * 0.100000001f));
+          x_260_phi = x_217;
+        } else {
+          float x_230 = 0.0f;
+          float x_258 = 0.0f;
+          float x_259_phi = 0.0f;
+          if ((x_181 < 150)) {
+            discard_fragment();
+          } else {
+            float x_239 = 0.0f;
+            float x_257 = 0.0f;
+            float x_258_phi = 0.0f;
+            if ((x_181 < 180)) {
+              int const x_227 = data.arr[5];
+              x_230 = (0.5f + (float(x_227) * 0.100000001f));
+              x_259_phi = x_230;
+            } else {
+              float x_248 = 0.0f;
+              float x_256 = 0.0f;
+              float x_257_phi = 0.0f;
+              if ((x_181 < 210)) {
+                int const x_236 = data.arr[6];
+                x_239 = (0.5f + (float(x_236) * 0.100000001f));
+                x_258_phi = x_239;
+              } else {
+                if ((x_181 < 240)) {
+                  int const x_245 = data.arr[7];
+                  x_248 = (0.5f + (float(x_245) * 0.100000001f));
+                  x_257_phi = x_248;
+                } else {
+                  if ((x_181 < 270)) {
+                  } else {
+                    discard_fragment();
+                  }
+                  int const x_253 = data.arr[8];
+                  x_256 = (0.5f + (float(x_253) * 0.100000001f));
+                  x_257_phi = x_256;
+                }
+                x_257 = x_257_phi;
+                x_258_phi = x_257;
+              }
+              x_258 = x_258_phi;
+              x_259_phi = x_258;
+            }
+            x_259 = x_259_phi;
+          }
+          x_260_phi = x_259;
+        }
+        x_260 = x_260_phi;
+        x_261_phi = x_260;
+      }
+      x_261 = x_261_phi;
+      x_262_phi = x_261;
+    }
+    x_262 = x_262_phi;
+    x_263_phi = x_262;
+  }
+  float const x_263 = x_263_phi;
+  *(tint_symbol_7) = float4(x_263, x_263, x_263, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_8, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..63a761d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/1.spvasm.expected.spvasm
@@ -0,0 +1,746 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 424
+; Schema: 0
+               OpCapability Shader
+        %169 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_8 "x_8"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %temp "temp"
+               OpName %data "data"
+               OpName %x_190 "x_190"
+               OpName %x_262 "x_262"
+               OpName %x_63_phi "x_63_phi"
+               OpName %x_103_phi "x_103_phi"
+               OpName %x_112_phi "x_112_phi"
+               OpName %x_263_phi "x_263_phi"
+               OpName %x_100 "x_100"
+               OpName %x_98 "x_98"
+               OpName %x_96 "x_96"
+               OpName %x_94 "x_94"
+               OpName %x_92 "x_92"
+               OpName %x_90 "x_90"
+               OpName %x_88 "x_88"
+               OpName %x_86 "x_86"
+               OpName %x_84 "x_84"
+               OpName %x_82 "x_82"
+               OpName %x_64_phi "x_64_phi"
+               OpName %x_104 "x_104"
+               OpName %x_113 "x_113"
+               OpName %x_119_phi "x_119_phi"
+               OpName %x_131 "x_131"
+               OpName %x_136 "x_136"
+               OpName %x_131_phi "x_131_phi"
+               OpName %x_134_phi "x_134_phi"
+               OpName %x_136_phi "x_136_phi"
+               OpName %x_158_phi "x_158_phi"
+               OpName %x_161_phi "x_161_phi"
+               OpName %x_171_phi "x_171_phi"
+               OpName %x_151 "x_151"
+               OpName %x_154 "x_154"
+               OpName %x_135_phi "x_135_phi"
+               OpName %x_137_phi "x_137_phi"
+               OpName %x_159 "x_159"
+               OpName %x_162 "x_162"
+               OpName %x_172 "x_172"
+               OpName %x_181 "x_181"
+               OpName %x_199 "x_199"
+               OpName %x_261 "x_261"
+               OpName %x_262_phi "x_262_phi"
+               OpName %x_208 "x_208"
+               OpName %x_260 "x_260"
+               OpName %x_261_phi "x_261_phi"
+               OpName %x_217 "x_217"
+               OpName %x_259 "x_259"
+               OpName %x_260_phi "x_260_phi"
+               OpName %x_230 "x_230"
+               OpName %x_258 "x_258"
+               OpName %x_259_phi "x_259_phi"
+               OpName %x_239 "x_239"
+               OpName %x_257 "x_257"
+               OpName %x_258_phi "x_258_phi"
+               OpName %x_248 "x_248"
+               OpName %x_256 "x_256"
+               OpName %x_257_phi "x_257_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+         %25 = OpConstantNull %_arr_int_uint_10
+%_ptr_Function_float = OpTypePointer Function %float
+         %29 = OpConstantNull %float
+%_ptr_Function_int = OpTypePointer Function %int
+         %33 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_0 = OpConstant %int 0
+         %60 = OpConstantComposite %_arr_int_uint_10 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0
+      %int_1 = OpConstant %int 1
+     %int_n5 = OpConstant %int -5
+     %int_n4 = OpConstant %int -4
+     %int_n3 = OpConstant %int -3
+     %int_n2 = OpConstant %int -2
+     %int_n1 = OpConstant %int -1
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+     %int_10 = OpConstant %int 10
+       %bool = OpTypeBool
+      %int_9 = OpConstant %int 9
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %int_30 = OpConstant %int 30
+  %float_0_5 = OpConstant %float 0.5
+%float_0_100000001 = OpConstant %float 0.100000001
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %411 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+       %temp = OpVariable %_ptr_Function__arr_int_uint_10 Function %25
+       %data = OpVariable %_ptr_Function__arr_int_uint_10 Function %25
+      %x_190 = OpVariable %_ptr_Function_float Function %29
+      %x_262 = OpVariable %_ptr_Function_float Function %29
+   %x_63_phi = OpVariable %_ptr_Function_int Function %33
+  %x_103_phi = OpVariable %_ptr_Function_int Function %33
+  %x_112_phi = OpVariable %_ptr_Function_int Function %33
+  %x_263_phi = OpVariable %_ptr_Function_float Function %29
+      %x_100 = OpVariable %_ptr_Function_int Function %33
+       %x_98 = OpVariable %_ptr_Function_int Function %33
+       %x_96 = OpVariable %_ptr_Function_int Function %33
+       %x_94 = OpVariable %_ptr_Function_int Function %33
+       %x_92 = OpVariable %_ptr_Function_int Function %33
+       %x_90 = OpVariable %_ptr_Function_int Function %33
+       %x_88 = OpVariable %_ptr_Function_int Function %33
+       %x_86 = OpVariable %_ptr_Function_int Function %33
+       %x_84 = OpVariable %_ptr_Function_int Function %33
+       %x_82 = OpVariable %_ptr_Function_int Function %33
+   %x_64_phi = OpVariable %_ptr_Function_int Function %33
+      %x_104 = OpVariable %_ptr_Function_int Function %33
+      %x_113 = OpVariable %_ptr_Function_int Function %33
+  %x_119_phi = OpVariable %_ptr_Function_int Function %33
+      %x_131 = OpVariable %_ptr_Function_int Function %33
+      %x_136 = OpVariable %_ptr_Function_int Function %33
+  %x_131_phi = OpVariable %_ptr_Function_int Function %33
+  %x_134_phi = OpVariable %_ptr_Function_int Function %33
+  %x_136_phi = OpVariable %_ptr_Function_int Function %33
+  %x_158_phi = OpVariable %_ptr_Function_int Function %33
+  %x_161_phi = OpVariable %_ptr_Function_int Function %33
+  %x_171_phi = OpVariable %_ptr_Function_int Function %33
+      %x_151 = OpVariable %_ptr_Function_int Function %33
+      %x_154 = OpVariable %_ptr_Function_int Function %33
+  %x_135_phi = OpVariable %_ptr_Function_int Function %33
+  %x_137_phi = OpVariable %_ptr_Function_int Function %33
+      %x_159 = OpVariable %_ptr_Function_int Function %33
+      %x_162 = OpVariable %_ptr_Function_int Function %33
+      %x_172 = OpVariable %_ptr_Function_int Function %33
+      %x_181 = OpVariable %_ptr_Function_int Function %33
+      %x_199 = OpVariable %_ptr_Function_float Function %29
+      %x_261 = OpVariable %_ptr_Function_float Function %29
+  %x_262_phi = OpVariable %_ptr_Function_float Function %29
+      %x_208 = OpVariable %_ptr_Function_float Function %29
+      %x_260 = OpVariable %_ptr_Function_float Function %29
+  %x_261_phi = OpVariable %_ptr_Function_float Function %29
+      %x_217 = OpVariable %_ptr_Function_float Function %29
+      %x_259 = OpVariable %_ptr_Function_float Function %29
+  %x_260_phi = OpVariable %_ptr_Function_float Function %29
+      %x_230 = OpVariable %_ptr_Function_float Function %29
+      %x_258 = OpVariable %_ptr_Function_float Function %29
+  %x_259_phi = OpVariable %_ptr_Function_float Function %29
+      %x_239 = OpVariable %_ptr_Function_float Function %29
+      %x_257 = OpVariable %_ptr_Function_float Function %29
+  %x_258_phi = OpVariable %_ptr_Function_float Function %29
+      %x_248 = OpVariable %_ptr_Function_float Function %29
+      %x_256 = OpVariable %_ptr_Function_float Function %29
+  %x_257_phi = OpVariable %_ptr_Function_float Function %29
+         %39 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+         %40 = OpLoad %float %39
+         %41 = OpConvertFToS %int %40
+               OpStore %x_63_phi %41
+               OpBranch %42
+         %42 = OpLabel
+               OpLoopMerge %43 %44 None
+               OpBranch %45
+         %45 = OpLabel
+         %57 = OpLoad %int %x_63_phi
+         %58 = OpLoad %_arr_int_uint_10 %data
+               OpStore %data %60
+               OpStore %data %58
+         %62 = OpIAdd %int %57 %int_1
+               OpStore %x_64_phi %62
+               OpSelectionMerge %63 None
+               OpSwitch %57 %64 9 %65 8 %66 7 %67 6 %68 5 %69 4 %70 3 %71 2 %72 1 %73 0 %74
+         %65 = OpLabel
+         %75 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %75 %int_n5
+         %77 = OpIAdd %int %57 %int_1
+               OpStore %x_100 %77
+         %78 = OpLoad %int %x_100
+               OpStore %x_64_phi %78
+               OpBranch %63
+         %66 = OpLabel
+         %79 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %79 %int_n4
+         %81 = OpIAdd %int %57 %int_1
+               OpStore %x_98 %81
+         %82 = OpLoad %int %x_98
+               OpStore %x_64_phi %82
+               OpBranch %63
+         %67 = OpLabel
+         %83 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %83 %int_n3
+         %85 = OpIAdd %int %57 %int_1
+               OpStore %x_96 %85
+         %86 = OpLoad %int %x_96
+               OpStore %x_64_phi %86
+               OpBranch %63
+         %68 = OpLabel
+         %87 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %87 %int_n2
+         %89 = OpIAdd %int %57 %int_1
+               OpStore %x_94 %89
+         %90 = OpLoad %int %x_94
+               OpStore %x_64_phi %90
+               OpBranch %63
+         %69 = OpLabel
+         %91 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %91 %int_n1
+         %93 = OpIAdd %int %57 %int_1
+               OpStore %x_92 %93
+         %94 = OpLoad %int %x_92
+               OpStore %x_64_phi %94
+               OpBranch %63
+         %70 = OpLabel
+         %95 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %95 %int_0
+         %96 = OpIAdd %int %57 %int_1
+               OpStore %x_90 %96
+         %97 = OpLoad %int %x_90
+               OpStore %x_64_phi %97
+               OpBranch %63
+         %71 = OpLabel
+         %98 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %98 %int_1
+         %99 = OpIAdd %int %57 %int_1
+               OpStore %x_88 %99
+        %100 = OpLoad %int %x_88
+               OpStore %x_64_phi %100
+               OpBranch %63
+         %72 = OpLabel
+        %101 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %101 %int_2
+        %103 = OpIAdd %int %57 %int_1
+               OpStore %x_86 %103
+        %104 = OpLoad %int %x_86
+               OpStore %x_64_phi %104
+               OpBranch %63
+         %73 = OpLabel
+        %105 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %105 %int_3
+        %107 = OpIAdd %int %57 %int_1
+               OpStore %x_84 %107
+        %108 = OpLoad %int %x_84
+               OpStore %x_64_phi %108
+               OpBranch %63
+         %74 = OpLabel
+        %109 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %109 %int_4
+        %111 = OpIAdd %int %57 %int_1
+               OpStore %x_82 %111
+        %112 = OpLoad %int %x_82
+               OpStore %x_64_phi %112
+               OpBranch %63
+         %64 = OpLabel
+               OpBranch %63
+         %63 = OpLabel
+        %113 = OpLoad %int %x_64_phi
+               OpBranch %44
+         %44 = OpLabel
+               OpStore %x_63_phi %113
+        %115 = OpSLessThan %bool %113 %int_10
+               OpSelectionMerge %117 None
+               OpBranchConditional %115 %118 %119
+        %118 = OpLabel
+               OpBranch %117
+        %119 = OpLabel
+               OpBranch %43
+        %117 = OpLabel
+               OpBranch %42
+         %43 = OpLabel
+               OpStore %x_103_phi %int_0
+               OpBranch %120
+        %120 = OpLabel
+               OpLoopMerge %121 %122 None
+               OpBranch %123
+        %123 = OpLabel
+        %125 = OpLoad %int %x_103_phi
+        %126 = OpSLessThan %bool %125 %int_10
+               OpSelectionMerge %127 None
+               OpBranchConditional %126 %128 %129
+        %128 = OpLabel
+               OpBranch %127
+        %129 = OpLabel
+               OpBranch %121
+        %127 = OpLabel
+               OpBranch %122
+        %122 = OpLabel
+        %130 = OpAccessChain %_ptr_Function_int %data %125
+        %131 = OpLoad %int %130
+        %132 = OpAccessChain %_ptr_Function_int %temp %125
+               OpStore %132 %131
+        %133 = OpIAdd %int %125 %int_1
+               OpStore %x_104 %133
+        %134 = OpLoad %int %x_104
+               OpStore %x_103_phi %134
+               OpBranch %120
+        %121 = OpLabel
+               OpStore %x_112_phi %int_1
+               OpBranch %135
+        %135 = OpLabel
+               OpLoopMerge %136 %137 None
+               OpBranch %138
+        %138 = OpLabel
+        %141 = OpLoad %int %x_112_phi
+        %143 = OpSLessThanEqual %bool %141 %int_9
+               OpSelectionMerge %144 None
+               OpBranchConditional %143 %145 %146
+        %145 = OpLabel
+               OpBranch %144
+        %146 = OpLabel
+               OpBranch %136
+        %144 = OpLabel
+               OpStore %x_119_phi %int_0
+               OpBranch %147
+        %147 = OpLabel
+               OpLoopMerge %148 %149 None
+               OpBranch %150
+        %150 = OpLabel
+        %159 = OpLoad %int %x_119_phi
+        %160 = OpSLessThan %bool %159 %int_9
+               OpSelectionMerge %161 None
+               OpBranchConditional %160 %162 %163
+        %162 = OpLabel
+               OpBranch %161
+        %163 = OpLabel
+               OpBranch %148
+        %161 = OpLabel
+        %164 = OpIAdd %int %159 %141
+        %165 = OpISub %int %164 %int_1
+        %166 = OpIMul %int %int_2 %141
+        %167 = OpIAdd %int %159 %166
+        %170 = OpISub %int %167 %int_1
+        %168 = OpExtInst %int %169 SMin %170 %int_9
+               OpStore %x_131_phi %159
+               OpStore %x_134_phi %164
+               OpStore %x_136_phi %159
+               OpBranch %171
+        %171 = OpLabel
+               OpLoopMerge %172 %173 None
+               OpBranch %174
+        %174 = OpLabel
+        %179 = OpLoad %int %x_131_phi
+               OpStore %x_131 %179
+        %180 = OpLoad %int %x_134_phi
+        %181 = OpLoad %int %x_136_phi
+               OpStore %x_136 %181
+        %182 = OpLoad %int %x_136
+        %183 = OpSLessThanEqual %bool %182 %165
+               OpSelectionMerge %184 None
+               OpBranchConditional %183 %185 %184
+        %185 = OpLabel
+        %186 = OpSLessThanEqual %bool %180 %168
+               OpBranch %184
+        %184 = OpLabel
+        %187 = OpPhi %bool %183 %174 %186 %185
+               OpSelectionMerge %188 None
+               OpBranchConditional %187 %189 %190
+        %189 = OpLabel
+               OpBranch %188
+        %190 = OpLabel
+               OpBranch %172
+        %188 = OpLabel
+        %191 = OpLoad %int %x_136
+        %192 = OpAccessChain %_ptr_Function_int %data %191
+        %193 = OpLoad %int %192
+        %194 = OpAccessChain %_ptr_Function_int %data %180
+        %195 = OpLoad %int %194
+        %197 = OpLoad %int %x_131
+        %198 = OpCopyObject %int %int_1
+        %199 = OpIAdd %int %197 %198
+        %196 = OpCopyObject %int %199
+        %200 = OpSLessThan %bool %193 %195
+               OpSelectionMerge %201 None
+               OpBranchConditional %200 %202 %203
+        %202 = OpLabel
+        %205 = OpLoad %int %x_136
+        %206 = OpCopyObject %int %int_1
+        %207 = OpIAdd %int %205 %206
+        %204 = OpCopyObject %int %207
+               OpStore %x_151 %204
+        %208 = OpAccessChain %_ptr_Function_int %data %191
+        %209 = OpLoad %int %208
+        %210 = OpLoad %int %x_131
+        %211 = OpAccessChain %_ptr_Function_int %temp %210
+               OpStore %211 %209
+               OpStore %x_135_phi %180
+        %212 = OpLoad %int %x_151
+               OpStore %x_137_phi %212
+               OpBranch %201
+        %203 = OpLabel
+        %213 = OpIAdd %int %180 %int_1
+               OpStore %x_154 %213
+        %214 = OpAccessChain %_ptr_Function_int %data %180
+        %215 = OpLoad %int %214
+        %216 = OpLoad %int %x_131
+        %217 = OpAccessChain %_ptr_Function_int %temp %216
+               OpStore %217 %215
+        %218 = OpLoad %int %x_154
+               OpStore %x_135_phi %218
+        %219 = OpLoad %int %x_136
+               OpStore %x_137_phi %219
+               OpBranch %201
+        %201 = OpLabel
+        %220 = OpLoad %int %x_135_phi
+        %221 = OpLoad %int %x_137_phi
+               OpBranch %173
+        %173 = OpLabel
+               OpStore %x_131_phi %196
+               OpStore %x_134_phi %220
+               OpStore %x_136_phi %221
+               OpBranch %171
+        %172 = OpLabel
+        %222 = OpLoad %int %x_131
+               OpStore %x_158_phi %222
+        %223 = OpLoad %int %x_136
+               OpStore %x_161_phi %223
+               OpBranch %224
+        %224 = OpLabel
+               OpLoopMerge %225 %226 None
+               OpBranch %227
+        %227 = OpLabel
+        %230 = OpLoad %int %x_158_phi
+        %231 = OpLoad %int %x_161_phi
+        %232 = OpSLessThan %bool %231 %int_10
+               OpSelectionMerge %233 None
+               OpBranchConditional %232 %234 %233
+        %234 = OpLabel
+        %235 = OpSLessThanEqual %bool %231 %165
+               OpBranch %233
+        %233 = OpLabel
+        %236 = OpPhi %bool %232 %227 %235 %234
+               OpSelectionMerge %237 None
+               OpBranchConditional %236 %238 %239
+        %238 = OpLabel
+               OpBranch %237
+        %239 = OpLabel
+               OpBranch %225
+        %237 = OpLabel
+               OpBranch %226
+        %226 = OpLabel
+        %240 = OpIAdd %int %230 %int_1
+               OpStore %x_159 %240
+        %241 = OpIAdd %int %231 %int_1
+               OpStore %x_162 %241
+        %242 = OpAccessChain %_ptr_Function_int %data %231
+        %243 = OpLoad %int %242
+        %244 = OpAccessChain %_ptr_Function_int %temp %230
+               OpStore %244 %243
+        %245 = OpLoad %int %x_159
+               OpStore %x_158_phi %245
+        %246 = OpLoad %int %x_162
+               OpStore %x_161_phi %246
+               OpBranch %224
+        %225 = OpLabel
+               OpStore %x_171_phi %159
+               OpBranch %247
+        %247 = OpLabel
+               OpLoopMerge %248 %249 None
+               OpBranch %250
+        %250 = OpLabel
+        %252 = OpLoad %int %x_171_phi
+        %253 = OpSLessThanEqual %bool %252 %168
+               OpSelectionMerge %254 None
+               OpBranchConditional %253 %255 %256
+        %255 = OpLabel
+               OpBranch %254
+        %256 = OpLabel
+               OpBranch %248
+        %254 = OpLabel
+               OpBranch %249
+        %249 = OpLabel
+        %257 = OpAccessChain %_ptr_Function_int %temp %252
+        %258 = OpLoad %int %257
+        %259 = OpAccessChain %_ptr_Function_int %data %252
+               OpStore %259 %258
+        %260 = OpIAdd %int %252 %int_1
+               OpStore %x_172 %260
+        %261 = OpLoad %int %x_172
+               OpStore %x_171_phi %261
+               OpBranch %247
+        %248 = OpLabel
+               OpBranch %149
+        %149 = OpLabel
+               OpStore %x_119_phi %167
+               OpBranch %147
+        %148 = OpLabel
+               OpBranch %137
+        %137 = OpLabel
+        %262 = OpIMul %int %int_2 %141
+               OpStore %x_113 %262
+        %263 = OpLoad %int %x_113
+               OpStore %x_112_phi %263
+               OpBranch %135
+        %136 = OpLabel
+        %270 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %271 = OpLoad %float %270
+        %272 = OpConvertFToS %int %271
+               OpStore %x_181 %272
+        %273 = OpLoad %int %x_181
+        %275 = OpSLessThan %bool %273 %int_30
+               OpSelectionMerge %276 None
+               OpBranchConditional %275 %277 %278
+        %277 = OpLabel
+        %279 = OpAccessChain %_ptr_Function_int %data %int_0
+        %280 = OpLoad %int %279
+        %282 = OpConvertSToF %float %280
+        %284 = OpFMul %float %282 %float_0_100000001
+        %285 = OpFAdd %float %float_0_5 %284
+               OpStore %x_190 %285
+        %286 = OpLoad %float %x_190
+               OpStore %x_263_phi %286
+               OpBranch %276
+        %278 = OpLabel
+        %290 = OpLoad %int %x_181
+        %292 = OpSLessThan %bool %290 %int_60
+               OpSelectionMerge %293 None
+               OpBranchConditional %292 %294 %295
+        %294 = OpLabel
+        %296 = OpAccessChain %_ptr_Function_int %data %int_1
+        %297 = OpLoad %int %296
+        %298 = OpConvertSToF %float %297
+        %299 = OpFMul %float %298 %float_0_100000001
+        %300 = OpFAdd %float %float_0_5 %299
+               OpStore %x_199 %300
+        %301 = OpLoad %float %x_199
+               OpStore %x_262_phi %301
+               OpBranch %293
+        %295 = OpLabel
+        %305 = OpLoad %int %x_181
+        %307 = OpSLessThan %bool %305 %int_90
+               OpSelectionMerge %308 None
+               OpBranchConditional %307 %309 %310
+        %309 = OpLabel
+        %311 = OpAccessChain %_ptr_Function_int %data %int_2
+        %312 = OpLoad %int %311
+        %313 = OpConvertSToF %float %312
+        %314 = OpFMul %float %313 %float_0_100000001
+        %315 = OpFAdd %float %float_0_5 %314
+               OpStore %x_208 %315
+        %316 = OpLoad %float %x_208
+               OpStore %x_261_phi %316
+               OpBranch %308
+        %310 = OpLabel
+        %317 = OpLoad %int %x_181
+        %319 = OpSLessThan %bool %317 %int_120
+               OpSelectionMerge %320 None
+               OpBranchConditional %319 %321 %322
+        %321 = OpLabel
+        %323 = OpAccessChain %_ptr_Function_int %data %int_3
+        %324 = OpLoad %int %323
+        %325 = OpConvertSToF %float %324
+        %326 = OpFMul %float %325 %float_0_100000001
+        %327 = OpFAdd %float %float_0_5 %326
+               OpStore %x_217 %327
+        %328 = OpLoad %float %x_217
+               OpStore %x_260_phi %328
+               OpBranch %320
+        %322 = OpLabel
+        %332 = OpLoad %int %x_181
+        %334 = OpSLessThan %bool %332 %int_150
+               OpSelectionMerge %335 None
+               OpBranchConditional %334 %336 %337
+        %336 = OpLabel
+               OpKill
+        %337 = OpLabel
+        %341 = OpLoad %int %x_181
+        %343 = OpSLessThan %bool %341 %int_180
+               OpSelectionMerge %344 None
+               OpBranchConditional %343 %345 %346
+        %345 = OpLabel
+        %348 = OpAccessChain %_ptr_Function_int %data %int_5
+        %349 = OpLoad %int %348
+        %350 = OpConvertSToF %float %349
+        %351 = OpFMul %float %350 %float_0_100000001
+        %352 = OpFAdd %float %float_0_5 %351
+               OpStore %x_230 %352
+        %353 = OpLoad %float %x_230
+               OpStore %x_259_phi %353
+               OpBranch %344
+        %346 = OpLabel
+        %357 = OpLoad %int %x_181
+        %359 = OpSLessThan %bool %357 %int_210
+               OpSelectionMerge %360 None
+               OpBranchConditional %359 %361 %362
+        %361 = OpLabel
+        %364 = OpAccessChain %_ptr_Function_int %data %int_6
+        %365 = OpLoad %int %364
+        %366 = OpConvertSToF %float %365
+        %367 = OpFMul %float %366 %float_0_100000001
+        %368 = OpFAdd %float %float_0_5 %367
+               OpStore %x_239 %368
+        %369 = OpLoad %float %x_239
+               OpStore %x_258_phi %369
+               OpBranch %360
+        %362 = OpLabel
+        %370 = OpLoad %int %x_181
+        %372 = OpSLessThan %bool %370 %int_240
+               OpSelectionMerge %373 None
+               OpBranchConditional %372 %374 %375
+        %374 = OpLabel
+        %377 = OpAccessChain %_ptr_Function_int %data %int_7
+        %378 = OpLoad %int %377
+        %379 = OpConvertSToF %float %378
+        %380 = OpFMul %float %379 %float_0_100000001
+        %381 = OpFAdd %float %float_0_5 %380
+               OpStore %x_248 %381
+        %382 = OpLoad %float %x_248
+               OpStore %x_257_phi %382
+               OpBranch %373
+        %375 = OpLabel
+        %383 = OpLoad %int %x_181
+        %385 = OpSLessThan %bool %383 %int_270
+               OpSelectionMerge %386 None
+               OpBranchConditional %385 %387 %388
+        %387 = OpLabel
+               OpBranch %386
+        %388 = OpLabel
+               OpKill
+        %386 = OpLabel
+        %390 = OpAccessChain %_ptr_Function_int %data %int_8
+        %391 = OpLoad %int %390
+        %392 = OpConvertSToF %float %391
+        %393 = OpFMul %float %392 %float_0_100000001
+        %394 = OpFAdd %float %float_0_5 %393
+               OpStore %x_256 %394
+        %395 = OpLoad %float %x_256
+               OpStore %x_257_phi %395
+               OpBranch %373
+        %373 = OpLabel
+        %396 = OpLoad %float %x_257_phi
+               OpStore %x_257 %396
+        %397 = OpLoad %float %x_257
+               OpStore %x_258_phi %397
+               OpBranch %360
+        %360 = OpLabel
+        %398 = OpLoad %float %x_258_phi
+               OpStore %x_258 %398
+        %399 = OpLoad %float %x_258
+               OpStore %x_259_phi %399
+               OpBranch %344
+        %344 = OpLabel
+        %400 = OpLoad %float %x_259_phi
+               OpStore %x_259 %400
+               OpBranch %335
+        %335 = OpLabel
+        %401 = OpLoad %float %x_259
+               OpStore %x_260_phi %401
+               OpBranch %320
+        %320 = OpLabel
+        %402 = OpLoad %float %x_260_phi
+               OpStore %x_260 %402
+        %403 = OpLoad %float %x_260
+               OpStore %x_261_phi %403
+               OpBranch %308
+        %308 = OpLabel
+        %404 = OpLoad %float %x_261_phi
+               OpStore %x_261 %404
+        %405 = OpLoad %float %x_261
+               OpStore %x_262_phi %405
+               OpBranch %293
+        %293 = OpLabel
+        %406 = OpLoad %float %x_262_phi
+               OpStore %x_262 %406
+        %407 = OpLoad %float %x_262
+               OpStore %x_263_phi %407
+               OpBranch %276
+        %276 = OpLabel
+        %408 = OpLoad %float %x_263_phi
+        %410 = OpCompositeConstruct %v4float %408 %408 %408 %float_1
+               OpStore %x_GLF_color %410
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %411
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %415 = OpLabel
+        %416 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %416
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %418 = OpLabel
+        %419 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %419
+        %420 = OpFunctionCall %void %main_1
+        %422 = OpLoad %v4float %x_GLF_color
+        %423 = OpCompositeConstruct %main_out %422
+        %421 = OpFunctionCall %void %tint_symbol_3 %423
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 44[%44] is not post dominated by the back-edge block 117[%117]
+  %117 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..fc4bfa1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/1.spvasm.expected.wgsl
@@ -0,0 +1,341 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var temp : array<i32, 10>;
+  var data : array<i32, 10>;
+  var x_190 : f32;
+  var x_262 : f32;
+  var x_63_phi : i32;
+  var x_103_phi : i32;
+  var x_112_phi : i32;
+  var x_263_phi : f32;
+  let x_60 : f32 = x_8.injectionSwitch.x;
+  let x_61 : i32 = i32(x_60);
+  x_63_phi = x_61;
+  loop {
+    var x_100 : i32;
+    var x_98 : i32;
+    var x_96 : i32;
+    var x_94 : i32;
+    var x_92 : i32;
+    var x_90 : i32;
+    var x_88 : i32;
+    var x_86 : i32;
+    var x_84 : i32;
+    var x_82 : i32;
+    var x_64_phi : i32;
+    let x_63 : i32 = x_63_phi;
+    let x_68 : array<i32, 10> = data;
+    data = array<i32, 10>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+    data = x_68;
+    let x_69 : i32 = (x_63 + 1);
+    x_64_phi = x_69;
+    switch(x_63) {
+      case 9: {
+        data[x_63] = -5;
+        x_100 = (x_63 + 1);
+        x_64_phi = x_100;
+      }
+      case 8: {
+        data[x_63] = -4;
+        x_98 = (x_63 + 1);
+        x_64_phi = x_98;
+      }
+      case 7: {
+        data[x_63] = -3;
+        x_96 = (x_63 + 1);
+        x_64_phi = x_96;
+      }
+      case 6: {
+        data[x_63] = -2;
+        x_94 = (x_63 + 1);
+        x_64_phi = x_94;
+      }
+      case 5: {
+        data[x_63] = -1;
+        x_92 = (x_63 + 1);
+        x_64_phi = x_92;
+      }
+      case 4: {
+        data[x_63] = 0;
+        x_90 = (x_63 + 1);
+        x_64_phi = x_90;
+      }
+      case 3: {
+        data[x_63] = 1;
+        x_88 = (x_63 + 1);
+        x_64_phi = x_88;
+      }
+      case 2: {
+        data[x_63] = 2;
+        x_86 = (x_63 + 1);
+        x_64_phi = x_86;
+      }
+      case 1: {
+        data[x_63] = 3;
+        x_84 = (x_63 + 1);
+        x_64_phi = x_84;
+      }
+      case 0: {
+        data[x_63] = 4;
+        x_82 = (x_63 + 1);
+        x_64_phi = x_82;
+      }
+      default: {
+      }
+    }
+    let x_64 : i32 = x_64_phi;
+
+    continuing {
+      x_63_phi = x_64;
+      if ((x_64 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_103_phi = 0;
+  loop {
+    var x_104 : i32;
+    let x_103 : i32 = x_103_phi;
+    if ((x_103 < 10)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_109 : i32 = data[x_103];
+      temp[x_103] = x_109;
+      x_104 = (x_103 + 1);
+      x_103_phi = x_104;
+    }
+  }
+  x_112_phi = 1;
+  loop {
+    var x_113 : i32;
+    var x_119_phi : i32;
+    let x_112 : i32 = x_112_phi;
+    if ((x_112 <= 9)) {
+    } else {
+      break;
+    }
+    x_119_phi = 0;
+    loop {
+      var x_131 : i32;
+      var x_136 : i32;
+      var x_131_phi : i32;
+      var x_134_phi : i32;
+      var x_136_phi : i32;
+      var x_158_phi : i32;
+      var x_161_phi : i32;
+      var x_171_phi : i32;
+      let x_119 : i32 = x_119_phi;
+      if ((x_119 < 9)) {
+      } else {
+        break;
+      }
+      let x_125 : i32 = (x_119 + x_112);
+      let x_126 : i32 = (x_125 - 1);
+      let x_120 : i32 = (x_119 + (2 * x_112));
+      let x_129 : i32 = min((x_120 - 1), 9);
+      x_131_phi = x_119;
+      x_134_phi = x_125;
+      x_136_phi = x_119;
+      loop {
+        var x_151 : i32;
+        var x_154 : i32;
+        var x_135_phi : i32;
+        var x_137_phi : i32;
+        x_131 = x_131_phi;
+        let x_134 : i32 = x_134_phi;
+        x_136 = x_136_phi;
+        if (((x_136 <= x_126) && (x_134 <= x_129))) {
+        } else {
+          break;
+        }
+        let x_143 : ptr<function, i32> = &(data[x_136]);
+        let x_144 : i32 = *(x_143);
+        let x_145 : ptr<function, i32> = &(data[x_134]);
+        let x_146 : i32 = *(x_145);
+        let x_132 : i32 = bitcast<i32>((x_131 + bitcast<i32>(1)));
+        if ((x_144 < x_146)) {
+          x_151 = bitcast<i32>((x_136 + bitcast<i32>(1)));
+          let x_152 : i32 = *(x_143);
+          temp[x_131] = x_152;
+          x_135_phi = x_134;
+          x_137_phi = x_151;
+        } else {
+          x_154 = (x_134 + 1);
+          let x_155 : i32 = *(x_145);
+          temp[x_131] = x_155;
+          x_135_phi = x_154;
+          x_137_phi = x_136;
+        }
+        let x_135 : i32 = x_135_phi;
+        let x_137 : i32 = x_137_phi;
+
+        continuing {
+          x_131_phi = x_132;
+          x_134_phi = x_135;
+          x_136_phi = x_137;
+        }
+      }
+      x_158_phi = x_131;
+      x_161_phi = x_136;
+      loop {
+        var x_159 : i32;
+        var x_162 : i32;
+        let x_158 : i32 = x_158_phi;
+        let x_161 : i32 = x_161_phi;
+        if (((x_161 < 10) && (x_161 <= x_126))) {
+        } else {
+          break;
+        }
+
+        continuing {
+          x_159 = (x_158 + 1);
+          x_162 = (x_161 + 1);
+          let x_168 : i32 = data[x_161];
+          temp[x_158] = x_168;
+          x_158_phi = x_159;
+          x_161_phi = x_162;
+        }
+      }
+      x_171_phi = x_119;
+      loop {
+        var x_172 : i32;
+        let x_171 : i32 = x_171_phi;
+        if ((x_171 <= x_129)) {
+        } else {
+          break;
+        }
+
+        continuing {
+          let x_177 : i32 = temp[x_171];
+          data[x_171] = x_177;
+          x_172 = (x_171 + 1);
+          x_171_phi = x_172;
+        }
+      }
+
+      continuing {
+        x_119_phi = x_120;
+      }
+    }
+
+    continuing {
+      x_113 = (2 * x_112);
+      x_112_phi = x_113;
+    }
+  }
+  var x_181 : i32;
+  var x_199 : f32;
+  var x_261 : f32;
+  var x_262_phi : f32;
+  let x_180 : f32 = gl_FragCoord.y;
+  x_181 = i32(x_180);
+  if ((x_181 < 30)) {
+    let x_187 : i32 = data[0];
+    x_190 = (0.5 + (f32(x_187) * 0.100000001));
+    x_263_phi = x_190;
+  } else {
+    var x_208 : f32;
+    var x_260 : f32;
+    var x_261_phi : f32;
+    if ((x_181 < 60)) {
+      let x_196 : i32 = data[1];
+      x_199 = (0.5 + (f32(x_196) * 0.100000001));
+      x_262_phi = x_199;
+    } else {
+      var x_217 : f32;
+      var x_259 : f32;
+      var x_260_phi : f32;
+      if ((x_181 < 90)) {
+        let x_205 : i32 = data[2];
+        x_208 = (0.5 + (f32(x_205) * 0.100000001));
+        x_261_phi = x_208;
+      } else {
+        if ((x_181 < 120)) {
+          let x_214 : i32 = data[3];
+          x_217 = (0.5 + (f32(x_214) * 0.100000001));
+          x_260_phi = x_217;
+        } else {
+          var x_230 : f32;
+          var x_258 : f32;
+          var x_259_phi : f32;
+          if ((x_181 < 150)) {
+            discard;
+          } else {
+            var x_239 : f32;
+            var x_257 : f32;
+            var x_258_phi : f32;
+            if ((x_181 < 180)) {
+              let x_227 : i32 = data[5];
+              x_230 = (0.5 + (f32(x_227) * 0.100000001));
+              x_259_phi = x_230;
+            } else {
+              var x_248 : f32;
+              var x_256 : f32;
+              var x_257_phi : f32;
+              if ((x_181 < 210)) {
+                let x_236 : i32 = data[6];
+                x_239 = (0.5 + (f32(x_236) * 0.100000001));
+                x_258_phi = x_239;
+              } else {
+                if ((x_181 < 240)) {
+                  let x_245 : i32 = data[7];
+                  x_248 = (0.5 + (f32(x_245) * 0.100000001));
+                  x_257_phi = x_248;
+                } else {
+                  if ((x_181 < 270)) {
+                  } else {
+                    discard;
+                  }
+                  let x_253 : i32 = data[8];
+                  x_256 = (0.5 + (f32(x_253) * 0.100000001));
+                  x_257_phi = x_256;
+                }
+                x_257 = x_257_phi;
+                x_258_phi = x_257;
+              }
+              x_258 = x_258_phi;
+              x_259_phi = x_258;
+            }
+            x_259 = x_259_phi;
+          }
+          x_260_phi = x_259;
+        }
+        x_260 = x_260_phi;
+        x_261_phi = x_260;
+      }
+      x_261 = x_261_phi;
+      x_262_phi = x_261;
+    }
+    x_262 = x_262_phi;
+    x_263_phi = x_262;
+  }
+  let x_263 : f32 = x_263_phi;
+  x_GLF_color = vec4<f32>(x_263, x_263, x_263, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/1.wgsl
new file mode 100644
index 0000000..fc4bfa1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/1.wgsl
@@ -0,0 +1,341 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var temp : array<i32, 10>;
+  var data : array<i32, 10>;
+  var x_190 : f32;
+  var x_262 : f32;
+  var x_63_phi : i32;
+  var x_103_phi : i32;
+  var x_112_phi : i32;
+  var x_263_phi : f32;
+  let x_60 : f32 = x_8.injectionSwitch.x;
+  let x_61 : i32 = i32(x_60);
+  x_63_phi = x_61;
+  loop {
+    var x_100 : i32;
+    var x_98 : i32;
+    var x_96 : i32;
+    var x_94 : i32;
+    var x_92 : i32;
+    var x_90 : i32;
+    var x_88 : i32;
+    var x_86 : i32;
+    var x_84 : i32;
+    var x_82 : i32;
+    var x_64_phi : i32;
+    let x_63 : i32 = x_63_phi;
+    let x_68 : array<i32, 10> = data;
+    data = array<i32, 10>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+    data = x_68;
+    let x_69 : i32 = (x_63 + 1);
+    x_64_phi = x_69;
+    switch(x_63) {
+      case 9: {
+        data[x_63] = -5;
+        x_100 = (x_63 + 1);
+        x_64_phi = x_100;
+      }
+      case 8: {
+        data[x_63] = -4;
+        x_98 = (x_63 + 1);
+        x_64_phi = x_98;
+      }
+      case 7: {
+        data[x_63] = -3;
+        x_96 = (x_63 + 1);
+        x_64_phi = x_96;
+      }
+      case 6: {
+        data[x_63] = -2;
+        x_94 = (x_63 + 1);
+        x_64_phi = x_94;
+      }
+      case 5: {
+        data[x_63] = -1;
+        x_92 = (x_63 + 1);
+        x_64_phi = x_92;
+      }
+      case 4: {
+        data[x_63] = 0;
+        x_90 = (x_63 + 1);
+        x_64_phi = x_90;
+      }
+      case 3: {
+        data[x_63] = 1;
+        x_88 = (x_63 + 1);
+        x_64_phi = x_88;
+      }
+      case 2: {
+        data[x_63] = 2;
+        x_86 = (x_63 + 1);
+        x_64_phi = x_86;
+      }
+      case 1: {
+        data[x_63] = 3;
+        x_84 = (x_63 + 1);
+        x_64_phi = x_84;
+      }
+      case 0: {
+        data[x_63] = 4;
+        x_82 = (x_63 + 1);
+        x_64_phi = x_82;
+      }
+      default: {
+      }
+    }
+    let x_64 : i32 = x_64_phi;
+
+    continuing {
+      x_63_phi = x_64;
+      if ((x_64 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_103_phi = 0;
+  loop {
+    var x_104 : i32;
+    let x_103 : i32 = x_103_phi;
+    if ((x_103 < 10)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_109 : i32 = data[x_103];
+      temp[x_103] = x_109;
+      x_104 = (x_103 + 1);
+      x_103_phi = x_104;
+    }
+  }
+  x_112_phi = 1;
+  loop {
+    var x_113 : i32;
+    var x_119_phi : i32;
+    let x_112 : i32 = x_112_phi;
+    if ((x_112 <= 9)) {
+    } else {
+      break;
+    }
+    x_119_phi = 0;
+    loop {
+      var x_131 : i32;
+      var x_136 : i32;
+      var x_131_phi : i32;
+      var x_134_phi : i32;
+      var x_136_phi : i32;
+      var x_158_phi : i32;
+      var x_161_phi : i32;
+      var x_171_phi : i32;
+      let x_119 : i32 = x_119_phi;
+      if ((x_119 < 9)) {
+      } else {
+        break;
+      }
+      let x_125 : i32 = (x_119 + x_112);
+      let x_126 : i32 = (x_125 - 1);
+      let x_120 : i32 = (x_119 + (2 * x_112));
+      let x_129 : i32 = min((x_120 - 1), 9);
+      x_131_phi = x_119;
+      x_134_phi = x_125;
+      x_136_phi = x_119;
+      loop {
+        var x_151 : i32;
+        var x_154 : i32;
+        var x_135_phi : i32;
+        var x_137_phi : i32;
+        x_131 = x_131_phi;
+        let x_134 : i32 = x_134_phi;
+        x_136 = x_136_phi;
+        if (((x_136 <= x_126) && (x_134 <= x_129))) {
+        } else {
+          break;
+        }
+        let x_143 : ptr<function, i32> = &(data[x_136]);
+        let x_144 : i32 = *(x_143);
+        let x_145 : ptr<function, i32> = &(data[x_134]);
+        let x_146 : i32 = *(x_145);
+        let x_132 : i32 = bitcast<i32>((x_131 + bitcast<i32>(1)));
+        if ((x_144 < x_146)) {
+          x_151 = bitcast<i32>((x_136 + bitcast<i32>(1)));
+          let x_152 : i32 = *(x_143);
+          temp[x_131] = x_152;
+          x_135_phi = x_134;
+          x_137_phi = x_151;
+        } else {
+          x_154 = (x_134 + 1);
+          let x_155 : i32 = *(x_145);
+          temp[x_131] = x_155;
+          x_135_phi = x_154;
+          x_137_phi = x_136;
+        }
+        let x_135 : i32 = x_135_phi;
+        let x_137 : i32 = x_137_phi;
+
+        continuing {
+          x_131_phi = x_132;
+          x_134_phi = x_135;
+          x_136_phi = x_137;
+        }
+      }
+      x_158_phi = x_131;
+      x_161_phi = x_136;
+      loop {
+        var x_159 : i32;
+        var x_162 : i32;
+        let x_158 : i32 = x_158_phi;
+        let x_161 : i32 = x_161_phi;
+        if (((x_161 < 10) && (x_161 <= x_126))) {
+        } else {
+          break;
+        }
+
+        continuing {
+          x_159 = (x_158 + 1);
+          x_162 = (x_161 + 1);
+          let x_168 : i32 = data[x_161];
+          temp[x_158] = x_168;
+          x_158_phi = x_159;
+          x_161_phi = x_162;
+        }
+      }
+      x_171_phi = x_119;
+      loop {
+        var x_172 : i32;
+        let x_171 : i32 = x_171_phi;
+        if ((x_171 <= x_129)) {
+        } else {
+          break;
+        }
+
+        continuing {
+          let x_177 : i32 = temp[x_171];
+          data[x_171] = x_177;
+          x_172 = (x_171 + 1);
+          x_171_phi = x_172;
+        }
+      }
+
+      continuing {
+        x_119_phi = x_120;
+      }
+    }
+
+    continuing {
+      x_113 = (2 * x_112);
+      x_112_phi = x_113;
+    }
+  }
+  var x_181 : i32;
+  var x_199 : f32;
+  var x_261 : f32;
+  var x_262_phi : f32;
+  let x_180 : f32 = gl_FragCoord.y;
+  x_181 = i32(x_180);
+  if ((x_181 < 30)) {
+    let x_187 : i32 = data[0];
+    x_190 = (0.5 + (f32(x_187) * 0.100000001));
+    x_263_phi = x_190;
+  } else {
+    var x_208 : f32;
+    var x_260 : f32;
+    var x_261_phi : f32;
+    if ((x_181 < 60)) {
+      let x_196 : i32 = data[1];
+      x_199 = (0.5 + (f32(x_196) * 0.100000001));
+      x_262_phi = x_199;
+    } else {
+      var x_217 : f32;
+      var x_259 : f32;
+      var x_260_phi : f32;
+      if ((x_181 < 90)) {
+        let x_205 : i32 = data[2];
+        x_208 = (0.5 + (f32(x_205) * 0.100000001));
+        x_261_phi = x_208;
+      } else {
+        if ((x_181 < 120)) {
+          let x_214 : i32 = data[3];
+          x_217 = (0.5 + (f32(x_214) * 0.100000001));
+          x_260_phi = x_217;
+        } else {
+          var x_230 : f32;
+          var x_258 : f32;
+          var x_259_phi : f32;
+          if ((x_181 < 150)) {
+            discard;
+          } else {
+            var x_239 : f32;
+            var x_257 : f32;
+            var x_258_phi : f32;
+            if ((x_181 < 180)) {
+              let x_227 : i32 = data[5];
+              x_230 = (0.5 + (f32(x_227) * 0.100000001));
+              x_259_phi = x_230;
+            } else {
+              var x_248 : f32;
+              var x_256 : f32;
+              var x_257_phi : f32;
+              if ((x_181 < 210)) {
+                let x_236 : i32 = data[6];
+                x_239 = (0.5 + (f32(x_236) * 0.100000001));
+                x_258_phi = x_239;
+              } else {
+                if ((x_181 < 240)) {
+                  let x_245 : i32 = data[7];
+                  x_248 = (0.5 + (f32(x_245) * 0.100000001));
+                  x_257_phi = x_248;
+                } else {
+                  if ((x_181 < 270)) {
+                  } else {
+                    discard;
+                  }
+                  let x_253 : i32 = data[8];
+                  x_256 = (0.5 + (f32(x_253) * 0.100000001));
+                  x_257_phi = x_256;
+                }
+                x_257 = x_257_phi;
+                x_258_phi = x_257;
+              }
+              x_258 = x_258_phi;
+              x_259_phi = x_258;
+            }
+            x_259 = x_259_phi;
+          }
+          x_260_phi = x_259;
+        }
+        x_260 = x_260_phi;
+        x_261_phi = x_260;
+      }
+      x_261 = x_261_phi;
+      x_262_phi = x_261;
+    }
+    x_262 = x_262_phi;
+    x_263_phi = x_262;
+  }
+  let x_263 : f32 = x_263_phi;
+  x_GLF_color = vec4<f32>(x_263, x_263, x_263, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..975a0e5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/1.wgsl.expected.hlsl
@@ -0,0 +1,356 @@
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int temp[10] = (int[10])0;
+  int data[10] = (int[10])0;
+  float x_190 = 0.0f;
+  float x_262 = 0.0f;
+  int x_63_phi = 0;
+  int x_103_phi = 0;
+  int x_112_phi = 0;
+  float x_263_phi = 0.0f;
+  const float x_60 = asfloat(x_8[0].x);
+  const int x_61 = int(x_60);
+  x_63_phi = x_61;
+  while (true) {
+    int x_100 = 0;
+    int x_98 = 0;
+    int x_96 = 0;
+    int x_94 = 0;
+    int x_92 = 0;
+    int x_90 = 0;
+    int x_88 = 0;
+    int x_86 = 0;
+    int x_84 = 0;
+    int x_82 = 0;
+    int x_64_phi = 0;
+    const int x_63 = x_63_phi;
+    const int x_68[10] = data;
+    const int tint_symbol_5[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+    data = tint_symbol_5;
+    data = x_68;
+    const int x_69 = (x_63 + 1);
+    x_64_phi = x_69;
+    switch(x_63) {
+      case 9: {
+        data[x_63] = -5;
+        x_100 = (x_63 + 1);
+        x_64_phi = x_100;
+        break;
+      }
+      case 8: {
+        data[x_63] = -4;
+        x_98 = (x_63 + 1);
+        x_64_phi = x_98;
+        break;
+      }
+      case 7: {
+        data[x_63] = -3;
+        x_96 = (x_63 + 1);
+        x_64_phi = x_96;
+        break;
+      }
+      case 6: {
+        data[x_63] = -2;
+        x_94 = (x_63 + 1);
+        x_64_phi = x_94;
+        break;
+      }
+      case 5: {
+        data[x_63] = -1;
+        x_92 = (x_63 + 1);
+        x_64_phi = x_92;
+        break;
+      }
+      case 4: {
+        data[x_63] = 0;
+        x_90 = (x_63 + 1);
+        x_64_phi = x_90;
+        break;
+      }
+      case 3: {
+        data[x_63] = 1;
+        x_88 = (x_63 + 1);
+        x_64_phi = x_88;
+        break;
+      }
+      case 2: {
+        data[x_63] = 2;
+        x_86 = (x_63 + 1);
+        x_64_phi = x_86;
+        break;
+      }
+      case 1: {
+        data[x_63] = 3;
+        x_84 = (x_63 + 1);
+        x_64_phi = x_84;
+        break;
+      }
+      case 0: {
+        data[x_63] = 4;
+        x_82 = (x_63 + 1);
+        x_64_phi = x_82;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    const int x_64 = x_64_phi;
+    {
+      x_63_phi = x_64;
+      if ((x_64 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_103_phi = 0;
+  while (true) {
+    int x_104 = 0;
+    const int x_103 = x_103_phi;
+    if ((x_103 < 10)) {
+    } else {
+      break;
+    }
+    {
+      const int x_109 = data[x_103];
+      temp[x_103] = x_109;
+      x_104 = (x_103 + 1);
+      x_103_phi = x_104;
+    }
+  }
+  x_112_phi = 1;
+  while (true) {
+    int x_113 = 0;
+    int x_119_phi = 0;
+    const int x_112 = x_112_phi;
+    if ((x_112 <= 9)) {
+    } else {
+      break;
+    }
+    x_119_phi = 0;
+    while (true) {
+      int x_131 = 0;
+      int x_136 = 0;
+      int x_131_phi = 0;
+      int x_134_phi = 0;
+      int x_136_phi = 0;
+      int x_158_phi = 0;
+      int x_161_phi = 0;
+      int x_171_phi = 0;
+      const int x_119 = x_119_phi;
+      if ((x_119 < 9)) {
+      } else {
+        break;
+      }
+      const int x_125 = (x_119 + x_112);
+      const int x_126 = (x_125 - 1);
+      const int x_120 = (x_119 + (2 * x_112));
+      const int x_129 = min((x_120 - 1), 9);
+      x_131_phi = x_119;
+      x_134_phi = x_125;
+      x_136_phi = x_119;
+      while (true) {
+        int x_151 = 0;
+        int x_154 = 0;
+        int x_135_phi = 0;
+        int x_137_phi = 0;
+        x_131 = x_131_phi;
+        const int x_134 = x_134_phi;
+        x_136 = x_136_phi;
+        bool tint_tmp = (x_136 <= x_126);
+        if (tint_tmp) {
+          tint_tmp = (x_134 <= x_129);
+        }
+        if ((tint_tmp)) {
+        } else {
+          break;
+        }
+        const int x_143_save = x_136;
+        const int x_144 = data[x_143_save];
+        const int x_145_save = x_134;
+        const int x_146 = data[x_145_save];
+        const int x_132 = asint((x_131 + asint(1)));
+        if ((x_144 < x_146)) {
+          x_151 = asint((x_136 + asint(1)));
+          const int x_152 = data[x_143_save];
+          temp[x_131] = x_152;
+          x_135_phi = x_134;
+          x_137_phi = x_151;
+        } else {
+          x_154 = (x_134 + 1);
+          const int x_155 = data[x_145_save];
+          temp[x_131] = x_155;
+          x_135_phi = x_154;
+          x_137_phi = x_136;
+        }
+        const int x_135 = x_135_phi;
+        const int x_137 = x_137_phi;
+        {
+          x_131_phi = x_132;
+          x_134_phi = x_135;
+          x_136_phi = x_137;
+        }
+      }
+      x_158_phi = x_131;
+      x_161_phi = x_136;
+      while (true) {
+        int x_159 = 0;
+        int x_162 = 0;
+        const int x_158 = x_158_phi;
+        const int x_161 = x_161_phi;
+        bool tint_tmp_1 = (x_161 < 10);
+        if (tint_tmp_1) {
+          tint_tmp_1 = (x_161 <= x_126);
+        }
+        if ((tint_tmp_1)) {
+        } else {
+          break;
+        }
+        {
+          x_159 = (x_158 + 1);
+          x_162 = (x_161 + 1);
+          const int x_168 = data[x_161];
+          temp[x_158] = x_168;
+          x_158_phi = x_159;
+          x_161_phi = x_162;
+        }
+      }
+      x_171_phi = x_119;
+      while (true) {
+        int x_172 = 0;
+        const int x_171 = x_171_phi;
+        if ((x_171 <= x_129)) {
+        } else {
+          break;
+        }
+        {
+          const int x_177 = temp[x_171];
+          data[x_171] = x_177;
+          x_172 = (x_171 + 1);
+          x_171_phi = x_172;
+        }
+      }
+      {
+        x_119_phi = x_120;
+      }
+    }
+    {
+      x_113 = (2 * x_112);
+      x_112_phi = x_113;
+    }
+  }
+  int x_181 = 0;
+  float x_199 = 0.0f;
+  float x_261 = 0.0f;
+  float x_262_phi = 0.0f;
+  const float x_180 = gl_FragCoord.y;
+  x_181 = int(x_180);
+  if ((x_181 < 30)) {
+    const int x_187 = data[0];
+    x_190 = (0.5f + (float(x_187) * 0.100000001f));
+    x_263_phi = x_190;
+  } else {
+    float x_208 = 0.0f;
+    float x_260 = 0.0f;
+    float x_261_phi = 0.0f;
+    if ((x_181 < 60)) {
+      const int x_196 = data[1];
+      x_199 = (0.5f + (float(x_196) * 0.100000001f));
+      x_262_phi = x_199;
+    } else {
+      float x_217 = 0.0f;
+      float x_259 = 0.0f;
+      float x_260_phi = 0.0f;
+      if ((x_181 < 90)) {
+        const int x_205 = data[2];
+        x_208 = (0.5f + (float(x_205) * 0.100000001f));
+        x_261_phi = x_208;
+      } else {
+        if ((x_181 < 120)) {
+          const int x_214 = data[3];
+          x_217 = (0.5f + (float(x_214) * 0.100000001f));
+          x_260_phi = x_217;
+        } else {
+          float x_230 = 0.0f;
+          float x_258 = 0.0f;
+          float x_259_phi = 0.0f;
+          if ((x_181 < 150)) {
+            discard;
+          } else {
+            float x_239 = 0.0f;
+            float x_257 = 0.0f;
+            float x_258_phi = 0.0f;
+            if ((x_181 < 180)) {
+              const int x_227 = data[5];
+              x_230 = (0.5f + (float(x_227) * 0.100000001f));
+              x_259_phi = x_230;
+            } else {
+              float x_248 = 0.0f;
+              float x_256 = 0.0f;
+              float x_257_phi = 0.0f;
+              if ((x_181 < 210)) {
+                const int x_236 = data[6];
+                x_239 = (0.5f + (float(x_236) * 0.100000001f));
+                x_258_phi = x_239;
+              } else {
+                if ((x_181 < 240)) {
+                  const int x_245 = data[7];
+                  x_248 = (0.5f + (float(x_245) * 0.100000001f));
+                  x_257_phi = x_248;
+                } else {
+                  if ((x_181 < 270)) {
+                  } else {
+                    discard;
+                  }
+                  const int x_253 = data[8];
+                  x_256 = (0.5f + (float(x_253) * 0.100000001f));
+                  x_257_phi = x_256;
+                }
+                x_257 = x_257_phi;
+                x_258_phi = x_257;
+              }
+              x_258 = x_258_phi;
+              x_259_phi = x_258;
+            }
+            x_259 = x_259_phi;
+          }
+          x_260_phi = x_259;
+        }
+        x_260 = x_260_phi;
+        x_261_phi = x_260;
+      }
+      x_261 = x_261_phi;
+      x_262_phi = x_261;
+    }
+    x_262 = x_262_phi;
+    x_263_phi = x_262;
+  }
+  const float x_263 = x_263_phi;
+  x_GLF_color = float4(x_263, x_263, x_263, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/1.wgsl.expected.msl
new file mode 100644
index 0000000..e8a7ca8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/1.wgsl.expected.msl
@@ -0,0 +1,350 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  tint_array_wrapper temp = {};
+  tint_array_wrapper data = {};
+  float x_190 = 0.0f;
+  float x_262 = 0.0f;
+  int x_63_phi = 0;
+  int x_103_phi = 0;
+  int x_112_phi = 0;
+  float x_263_phi = 0.0f;
+  float const x_60 = x_8.injectionSwitch.x;
+  int const x_61 = int(x_60);
+  x_63_phi = x_61;
+  while (true) {
+    int x_100 = 0;
+    int x_98 = 0;
+    int x_96 = 0;
+    int x_94 = 0;
+    int x_92 = 0;
+    int x_90 = 0;
+    int x_88 = 0;
+    int x_86 = 0;
+    int x_84 = 0;
+    int x_82 = 0;
+    int x_64_phi = 0;
+    int const x_63 = x_63_phi;
+    tint_array_wrapper const x_68 = data;
+    tint_array_wrapper const tint_symbol_4 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+    data = tint_symbol_4;
+    data = x_68;
+    int const x_69 = (x_63 + 1);
+    x_64_phi = x_69;
+    switch(x_63) {
+      case 9: {
+        data.arr[x_63] = -5;
+        x_100 = (x_63 + 1);
+        x_64_phi = x_100;
+        break;
+      }
+      case 8: {
+        data.arr[x_63] = -4;
+        x_98 = (x_63 + 1);
+        x_64_phi = x_98;
+        break;
+      }
+      case 7: {
+        data.arr[x_63] = -3;
+        x_96 = (x_63 + 1);
+        x_64_phi = x_96;
+        break;
+      }
+      case 6: {
+        data.arr[x_63] = -2;
+        x_94 = (x_63 + 1);
+        x_64_phi = x_94;
+        break;
+      }
+      case 5: {
+        data.arr[x_63] = -1;
+        x_92 = (x_63 + 1);
+        x_64_phi = x_92;
+        break;
+      }
+      case 4: {
+        data.arr[x_63] = 0;
+        x_90 = (x_63 + 1);
+        x_64_phi = x_90;
+        break;
+      }
+      case 3: {
+        data.arr[x_63] = 1;
+        x_88 = (x_63 + 1);
+        x_64_phi = x_88;
+        break;
+      }
+      case 2: {
+        data.arr[x_63] = 2;
+        x_86 = (x_63 + 1);
+        x_64_phi = x_86;
+        break;
+      }
+      case 1: {
+        data.arr[x_63] = 3;
+        x_84 = (x_63 + 1);
+        x_64_phi = x_84;
+        break;
+      }
+      case 0: {
+        data.arr[x_63] = 4;
+        x_82 = (x_63 + 1);
+        x_64_phi = x_82;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    int const x_64 = x_64_phi;
+    {
+      x_63_phi = x_64;
+      if ((x_64 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_103_phi = 0;
+  while (true) {
+    int x_104 = 0;
+    int const x_103 = x_103_phi;
+    if ((x_103 < 10)) {
+    } else {
+      break;
+    }
+    {
+      int const x_109 = data.arr[x_103];
+      temp.arr[x_103] = x_109;
+      x_104 = (x_103 + 1);
+      x_103_phi = x_104;
+    }
+  }
+  x_112_phi = 1;
+  while (true) {
+    int x_113 = 0;
+    int x_119_phi = 0;
+    int const x_112 = x_112_phi;
+    if ((x_112 <= 9)) {
+    } else {
+      break;
+    }
+    x_119_phi = 0;
+    while (true) {
+      int x_131 = 0;
+      int x_136 = 0;
+      int x_131_phi = 0;
+      int x_134_phi = 0;
+      int x_136_phi = 0;
+      int x_158_phi = 0;
+      int x_161_phi = 0;
+      int x_171_phi = 0;
+      int const x_119 = x_119_phi;
+      if ((x_119 < 9)) {
+      } else {
+        break;
+      }
+      int const x_125 = (x_119 + x_112);
+      int const x_126 = (x_125 - 1);
+      int const x_120 = (x_119 + (2 * x_112));
+      int const x_129 = min((x_120 - 1), 9);
+      x_131_phi = x_119;
+      x_134_phi = x_125;
+      x_136_phi = x_119;
+      while (true) {
+        int x_151 = 0;
+        int x_154 = 0;
+        int x_135_phi = 0;
+        int x_137_phi = 0;
+        x_131 = x_131_phi;
+        int const x_134 = x_134_phi;
+        x_136 = x_136_phi;
+        if (((x_136 <= x_126) && (x_134 <= x_129))) {
+        } else {
+          break;
+        }
+        int const x_143_save = x_136;
+        int const x_144 = data.arr[x_143_save];
+        int const x_145_save = x_134;
+        int const x_146 = data.arr[x_145_save];
+        int const x_132 = as_type<int>((x_131 + as_type<int>(1)));
+        if ((x_144 < x_146)) {
+          x_151 = as_type<int>((x_136 + as_type<int>(1)));
+          int const x_152 = data.arr[x_143_save];
+          temp.arr[x_131] = x_152;
+          x_135_phi = x_134;
+          x_137_phi = x_151;
+        } else {
+          x_154 = (x_134 + 1);
+          int const x_155 = data.arr[x_145_save];
+          temp.arr[x_131] = x_155;
+          x_135_phi = x_154;
+          x_137_phi = x_136;
+        }
+        int const x_135 = x_135_phi;
+        int const x_137 = x_137_phi;
+        {
+          x_131_phi = x_132;
+          x_134_phi = x_135;
+          x_136_phi = x_137;
+        }
+      }
+      x_158_phi = x_131;
+      x_161_phi = x_136;
+      while (true) {
+        int x_159 = 0;
+        int x_162 = 0;
+        int const x_158 = x_158_phi;
+        int const x_161 = x_161_phi;
+        if (((x_161 < 10) && (x_161 <= x_126))) {
+        } else {
+          break;
+        }
+        {
+          x_159 = (x_158 + 1);
+          x_162 = (x_161 + 1);
+          int const x_168 = data.arr[x_161];
+          temp.arr[x_158] = x_168;
+          x_158_phi = x_159;
+          x_161_phi = x_162;
+        }
+      }
+      x_171_phi = x_119;
+      while (true) {
+        int x_172 = 0;
+        int const x_171 = x_171_phi;
+        if ((x_171 <= x_129)) {
+        } else {
+          break;
+        }
+        {
+          int const x_177 = temp.arr[x_171];
+          data.arr[x_171] = x_177;
+          x_172 = (x_171 + 1);
+          x_171_phi = x_172;
+        }
+      }
+      {
+        x_119_phi = x_120;
+      }
+    }
+    {
+      x_113 = (2 * x_112);
+      x_112_phi = x_113;
+    }
+  }
+  int x_181 = 0;
+  float x_199 = 0.0f;
+  float x_261 = 0.0f;
+  float x_262_phi = 0.0f;
+  float const x_180 = (*(tint_symbol_6)).y;
+  x_181 = int(x_180);
+  if ((x_181 < 30)) {
+    int const x_187 = data.arr[0];
+    x_190 = (0.5f + (float(x_187) * 0.100000001f));
+    x_263_phi = x_190;
+  } else {
+    float x_208 = 0.0f;
+    float x_260 = 0.0f;
+    float x_261_phi = 0.0f;
+    if ((x_181 < 60)) {
+      int const x_196 = data.arr[1];
+      x_199 = (0.5f + (float(x_196) * 0.100000001f));
+      x_262_phi = x_199;
+    } else {
+      float x_217 = 0.0f;
+      float x_259 = 0.0f;
+      float x_260_phi = 0.0f;
+      if ((x_181 < 90)) {
+        int const x_205 = data.arr[2];
+        x_208 = (0.5f + (float(x_205) * 0.100000001f));
+        x_261_phi = x_208;
+      } else {
+        if ((x_181 < 120)) {
+          int const x_214 = data.arr[3];
+          x_217 = (0.5f + (float(x_214) * 0.100000001f));
+          x_260_phi = x_217;
+        } else {
+          float x_230 = 0.0f;
+          float x_258 = 0.0f;
+          float x_259_phi = 0.0f;
+          if ((x_181 < 150)) {
+            discard_fragment();
+          } else {
+            float x_239 = 0.0f;
+            float x_257 = 0.0f;
+            float x_258_phi = 0.0f;
+            if ((x_181 < 180)) {
+              int const x_227 = data.arr[5];
+              x_230 = (0.5f + (float(x_227) * 0.100000001f));
+              x_259_phi = x_230;
+            } else {
+              float x_248 = 0.0f;
+              float x_256 = 0.0f;
+              float x_257_phi = 0.0f;
+              if ((x_181 < 210)) {
+                int const x_236 = data.arr[6];
+                x_239 = (0.5f + (float(x_236) * 0.100000001f));
+                x_258_phi = x_239;
+              } else {
+                if ((x_181 < 240)) {
+                  int const x_245 = data.arr[7];
+                  x_248 = (0.5f + (float(x_245) * 0.100000001f));
+                  x_257_phi = x_248;
+                } else {
+                  if ((x_181 < 270)) {
+                  } else {
+                    discard_fragment();
+                  }
+                  int const x_253 = data.arr[8];
+                  x_256 = (0.5f + (float(x_253) * 0.100000001f));
+                  x_257_phi = x_256;
+                }
+                x_257 = x_257_phi;
+                x_258_phi = x_257;
+              }
+              x_258 = x_258_phi;
+              x_259_phi = x_258;
+            }
+            x_259 = x_259_phi;
+          }
+          x_260_phi = x_259;
+        }
+        x_260 = x_260_phi;
+        x_261_phi = x_260;
+      }
+      x_261 = x_261_phi;
+      x_262_phi = x_261;
+    }
+    x_262 = x_262_phi;
+    x_263_phi = x_262;
+  }
+  float const x_263 = x_263_phi;
+  *(tint_symbol_7) = float4(x_263, x_263, x_263, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_8, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..63a761d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/1.wgsl.expected.spvasm
@@ -0,0 +1,746 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 424
+; Schema: 0
+               OpCapability Shader
+        %169 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_8 "x_8"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %temp "temp"
+               OpName %data "data"
+               OpName %x_190 "x_190"
+               OpName %x_262 "x_262"
+               OpName %x_63_phi "x_63_phi"
+               OpName %x_103_phi "x_103_phi"
+               OpName %x_112_phi "x_112_phi"
+               OpName %x_263_phi "x_263_phi"
+               OpName %x_100 "x_100"
+               OpName %x_98 "x_98"
+               OpName %x_96 "x_96"
+               OpName %x_94 "x_94"
+               OpName %x_92 "x_92"
+               OpName %x_90 "x_90"
+               OpName %x_88 "x_88"
+               OpName %x_86 "x_86"
+               OpName %x_84 "x_84"
+               OpName %x_82 "x_82"
+               OpName %x_64_phi "x_64_phi"
+               OpName %x_104 "x_104"
+               OpName %x_113 "x_113"
+               OpName %x_119_phi "x_119_phi"
+               OpName %x_131 "x_131"
+               OpName %x_136 "x_136"
+               OpName %x_131_phi "x_131_phi"
+               OpName %x_134_phi "x_134_phi"
+               OpName %x_136_phi "x_136_phi"
+               OpName %x_158_phi "x_158_phi"
+               OpName %x_161_phi "x_161_phi"
+               OpName %x_171_phi "x_171_phi"
+               OpName %x_151 "x_151"
+               OpName %x_154 "x_154"
+               OpName %x_135_phi "x_135_phi"
+               OpName %x_137_phi "x_137_phi"
+               OpName %x_159 "x_159"
+               OpName %x_162 "x_162"
+               OpName %x_172 "x_172"
+               OpName %x_181 "x_181"
+               OpName %x_199 "x_199"
+               OpName %x_261 "x_261"
+               OpName %x_262_phi "x_262_phi"
+               OpName %x_208 "x_208"
+               OpName %x_260 "x_260"
+               OpName %x_261_phi "x_261_phi"
+               OpName %x_217 "x_217"
+               OpName %x_259 "x_259"
+               OpName %x_260_phi "x_260_phi"
+               OpName %x_230 "x_230"
+               OpName %x_258 "x_258"
+               OpName %x_259_phi "x_259_phi"
+               OpName %x_239 "x_239"
+               OpName %x_257 "x_257"
+               OpName %x_258_phi "x_258_phi"
+               OpName %x_248 "x_248"
+               OpName %x_256 "x_256"
+               OpName %x_257_phi "x_257_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+         %25 = OpConstantNull %_arr_int_uint_10
+%_ptr_Function_float = OpTypePointer Function %float
+         %29 = OpConstantNull %float
+%_ptr_Function_int = OpTypePointer Function %int
+         %33 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_0 = OpConstant %int 0
+         %60 = OpConstantComposite %_arr_int_uint_10 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0
+      %int_1 = OpConstant %int 1
+     %int_n5 = OpConstant %int -5
+     %int_n4 = OpConstant %int -4
+     %int_n3 = OpConstant %int -3
+     %int_n2 = OpConstant %int -2
+     %int_n1 = OpConstant %int -1
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+     %int_10 = OpConstant %int 10
+       %bool = OpTypeBool
+      %int_9 = OpConstant %int 9
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %int_30 = OpConstant %int 30
+  %float_0_5 = OpConstant %float 0.5
+%float_0_100000001 = OpConstant %float 0.100000001
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %411 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+       %temp = OpVariable %_ptr_Function__arr_int_uint_10 Function %25
+       %data = OpVariable %_ptr_Function__arr_int_uint_10 Function %25
+      %x_190 = OpVariable %_ptr_Function_float Function %29
+      %x_262 = OpVariable %_ptr_Function_float Function %29
+   %x_63_phi = OpVariable %_ptr_Function_int Function %33
+  %x_103_phi = OpVariable %_ptr_Function_int Function %33
+  %x_112_phi = OpVariable %_ptr_Function_int Function %33
+  %x_263_phi = OpVariable %_ptr_Function_float Function %29
+      %x_100 = OpVariable %_ptr_Function_int Function %33
+       %x_98 = OpVariable %_ptr_Function_int Function %33
+       %x_96 = OpVariable %_ptr_Function_int Function %33
+       %x_94 = OpVariable %_ptr_Function_int Function %33
+       %x_92 = OpVariable %_ptr_Function_int Function %33
+       %x_90 = OpVariable %_ptr_Function_int Function %33
+       %x_88 = OpVariable %_ptr_Function_int Function %33
+       %x_86 = OpVariable %_ptr_Function_int Function %33
+       %x_84 = OpVariable %_ptr_Function_int Function %33
+       %x_82 = OpVariable %_ptr_Function_int Function %33
+   %x_64_phi = OpVariable %_ptr_Function_int Function %33
+      %x_104 = OpVariable %_ptr_Function_int Function %33
+      %x_113 = OpVariable %_ptr_Function_int Function %33
+  %x_119_phi = OpVariable %_ptr_Function_int Function %33
+      %x_131 = OpVariable %_ptr_Function_int Function %33
+      %x_136 = OpVariable %_ptr_Function_int Function %33
+  %x_131_phi = OpVariable %_ptr_Function_int Function %33
+  %x_134_phi = OpVariable %_ptr_Function_int Function %33
+  %x_136_phi = OpVariable %_ptr_Function_int Function %33
+  %x_158_phi = OpVariable %_ptr_Function_int Function %33
+  %x_161_phi = OpVariable %_ptr_Function_int Function %33
+  %x_171_phi = OpVariable %_ptr_Function_int Function %33
+      %x_151 = OpVariable %_ptr_Function_int Function %33
+      %x_154 = OpVariable %_ptr_Function_int Function %33
+  %x_135_phi = OpVariable %_ptr_Function_int Function %33
+  %x_137_phi = OpVariable %_ptr_Function_int Function %33
+      %x_159 = OpVariable %_ptr_Function_int Function %33
+      %x_162 = OpVariable %_ptr_Function_int Function %33
+      %x_172 = OpVariable %_ptr_Function_int Function %33
+      %x_181 = OpVariable %_ptr_Function_int Function %33
+      %x_199 = OpVariable %_ptr_Function_float Function %29
+      %x_261 = OpVariable %_ptr_Function_float Function %29
+  %x_262_phi = OpVariable %_ptr_Function_float Function %29
+      %x_208 = OpVariable %_ptr_Function_float Function %29
+      %x_260 = OpVariable %_ptr_Function_float Function %29
+  %x_261_phi = OpVariable %_ptr_Function_float Function %29
+      %x_217 = OpVariable %_ptr_Function_float Function %29
+      %x_259 = OpVariable %_ptr_Function_float Function %29
+  %x_260_phi = OpVariable %_ptr_Function_float Function %29
+      %x_230 = OpVariable %_ptr_Function_float Function %29
+      %x_258 = OpVariable %_ptr_Function_float Function %29
+  %x_259_phi = OpVariable %_ptr_Function_float Function %29
+      %x_239 = OpVariable %_ptr_Function_float Function %29
+      %x_257 = OpVariable %_ptr_Function_float Function %29
+  %x_258_phi = OpVariable %_ptr_Function_float Function %29
+      %x_248 = OpVariable %_ptr_Function_float Function %29
+      %x_256 = OpVariable %_ptr_Function_float Function %29
+  %x_257_phi = OpVariable %_ptr_Function_float Function %29
+         %39 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+         %40 = OpLoad %float %39
+         %41 = OpConvertFToS %int %40
+               OpStore %x_63_phi %41
+               OpBranch %42
+         %42 = OpLabel
+               OpLoopMerge %43 %44 None
+               OpBranch %45
+         %45 = OpLabel
+         %57 = OpLoad %int %x_63_phi
+         %58 = OpLoad %_arr_int_uint_10 %data
+               OpStore %data %60
+               OpStore %data %58
+         %62 = OpIAdd %int %57 %int_1
+               OpStore %x_64_phi %62
+               OpSelectionMerge %63 None
+               OpSwitch %57 %64 9 %65 8 %66 7 %67 6 %68 5 %69 4 %70 3 %71 2 %72 1 %73 0 %74
+         %65 = OpLabel
+         %75 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %75 %int_n5
+         %77 = OpIAdd %int %57 %int_1
+               OpStore %x_100 %77
+         %78 = OpLoad %int %x_100
+               OpStore %x_64_phi %78
+               OpBranch %63
+         %66 = OpLabel
+         %79 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %79 %int_n4
+         %81 = OpIAdd %int %57 %int_1
+               OpStore %x_98 %81
+         %82 = OpLoad %int %x_98
+               OpStore %x_64_phi %82
+               OpBranch %63
+         %67 = OpLabel
+         %83 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %83 %int_n3
+         %85 = OpIAdd %int %57 %int_1
+               OpStore %x_96 %85
+         %86 = OpLoad %int %x_96
+               OpStore %x_64_phi %86
+               OpBranch %63
+         %68 = OpLabel
+         %87 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %87 %int_n2
+         %89 = OpIAdd %int %57 %int_1
+               OpStore %x_94 %89
+         %90 = OpLoad %int %x_94
+               OpStore %x_64_phi %90
+               OpBranch %63
+         %69 = OpLabel
+         %91 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %91 %int_n1
+         %93 = OpIAdd %int %57 %int_1
+               OpStore %x_92 %93
+         %94 = OpLoad %int %x_92
+               OpStore %x_64_phi %94
+               OpBranch %63
+         %70 = OpLabel
+         %95 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %95 %int_0
+         %96 = OpIAdd %int %57 %int_1
+               OpStore %x_90 %96
+         %97 = OpLoad %int %x_90
+               OpStore %x_64_phi %97
+               OpBranch %63
+         %71 = OpLabel
+         %98 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %98 %int_1
+         %99 = OpIAdd %int %57 %int_1
+               OpStore %x_88 %99
+        %100 = OpLoad %int %x_88
+               OpStore %x_64_phi %100
+               OpBranch %63
+         %72 = OpLabel
+        %101 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %101 %int_2
+        %103 = OpIAdd %int %57 %int_1
+               OpStore %x_86 %103
+        %104 = OpLoad %int %x_86
+               OpStore %x_64_phi %104
+               OpBranch %63
+         %73 = OpLabel
+        %105 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %105 %int_3
+        %107 = OpIAdd %int %57 %int_1
+               OpStore %x_84 %107
+        %108 = OpLoad %int %x_84
+               OpStore %x_64_phi %108
+               OpBranch %63
+         %74 = OpLabel
+        %109 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %109 %int_4
+        %111 = OpIAdd %int %57 %int_1
+               OpStore %x_82 %111
+        %112 = OpLoad %int %x_82
+               OpStore %x_64_phi %112
+               OpBranch %63
+         %64 = OpLabel
+               OpBranch %63
+         %63 = OpLabel
+        %113 = OpLoad %int %x_64_phi
+               OpBranch %44
+         %44 = OpLabel
+               OpStore %x_63_phi %113
+        %115 = OpSLessThan %bool %113 %int_10
+               OpSelectionMerge %117 None
+               OpBranchConditional %115 %118 %119
+        %118 = OpLabel
+               OpBranch %117
+        %119 = OpLabel
+               OpBranch %43
+        %117 = OpLabel
+               OpBranch %42
+         %43 = OpLabel
+               OpStore %x_103_phi %int_0
+               OpBranch %120
+        %120 = OpLabel
+               OpLoopMerge %121 %122 None
+               OpBranch %123
+        %123 = OpLabel
+        %125 = OpLoad %int %x_103_phi
+        %126 = OpSLessThan %bool %125 %int_10
+               OpSelectionMerge %127 None
+               OpBranchConditional %126 %128 %129
+        %128 = OpLabel
+               OpBranch %127
+        %129 = OpLabel
+               OpBranch %121
+        %127 = OpLabel
+               OpBranch %122
+        %122 = OpLabel
+        %130 = OpAccessChain %_ptr_Function_int %data %125
+        %131 = OpLoad %int %130
+        %132 = OpAccessChain %_ptr_Function_int %temp %125
+               OpStore %132 %131
+        %133 = OpIAdd %int %125 %int_1
+               OpStore %x_104 %133
+        %134 = OpLoad %int %x_104
+               OpStore %x_103_phi %134
+               OpBranch %120
+        %121 = OpLabel
+               OpStore %x_112_phi %int_1
+               OpBranch %135
+        %135 = OpLabel
+               OpLoopMerge %136 %137 None
+               OpBranch %138
+        %138 = OpLabel
+        %141 = OpLoad %int %x_112_phi
+        %143 = OpSLessThanEqual %bool %141 %int_9
+               OpSelectionMerge %144 None
+               OpBranchConditional %143 %145 %146
+        %145 = OpLabel
+               OpBranch %144
+        %146 = OpLabel
+               OpBranch %136
+        %144 = OpLabel
+               OpStore %x_119_phi %int_0
+               OpBranch %147
+        %147 = OpLabel
+               OpLoopMerge %148 %149 None
+               OpBranch %150
+        %150 = OpLabel
+        %159 = OpLoad %int %x_119_phi
+        %160 = OpSLessThan %bool %159 %int_9
+               OpSelectionMerge %161 None
+               OpBranchConditional %160 %162 %163
+        %162 = OpLabel
+               OpBranch %161
+        %163 = OpLabel
+               OpBranch %148
+        %161 = OpLabel
+        %164 = OpIAdd %int %159 %141
+        %165 = OpISub %int %164 %int_1
+        %166 = OpIMul %int %int_2 %141
+        %167 = OpIAdd %int %159 %166
+        %170 = OpISub %int %167 %int_1
+        %168 = OpExtInst %int %169 SMin %170 %int_9
+               OpStore %x_131_phi %159
+               OpStore %x_134_phi %164
+               OpStore %x_136_phi %159
+               OpBranch %171
+        %171 = OpLabel
+               OpLoopMerge %172 %173 None
+               OpBranch %174
+        %174 = OpLabel
+        %179 = OpLoad %int %x_131_phi
+               OpStore %x_131 %179
+        %180 = OpLoad %int %x_134_phi
+        %181 = OpLoad %int %x_136_phi
+               OpStore %x_136 %181
+        %182 = OpLoad %int %x_136
+        %183 = OpSLessThanEqual %bool %182 %165
+               OpSelectionMerge %184 None
+               OpBranchConditional %183 %185 %184
+        %185 = OpLabel
+        %186 = OpSLessThanEqual %bool %180 %168
+               OpBranch %184
+        %184 = OpLabel
+        %187 = OpPhi %bool %183 %174 %186 %185
+               OpSelectionMerge %188 None
+               OpBranchConditional %187 %189 %190
+        %189 = OpLabel
+               OpBranch %188
+        %190 = OpLabel
+               OpBranch %172
+        %188 = OpLabel
+        %191 = OpLoad %int %x_136
+        %192 = OpAccessChain %_ptr_Function_int %data %191
+        %193 = OpLoad %int %192
+        %194 = OpAccessChain %_ptr_Function_int %data %180
+        %195 = OpLoad %int %194
+        %197 = OpLoad %int %x_131
+        %198 = OpCopyObject %int %int_1
+        %199 = OpIAdd %int %197 %198
+        %196 = OpCopyObject %int %199
+        %200 = OpSLessThan %bool %193 %195
+               OpSelectionMerge %201 None
+               OpBranchConditional %200 %202 %203
+        %202 = OpLabel
+        %205 = OpLoad %int %x_136
+        %206 = OpCopyObject %int %int_1
+        %207 = OpIAdd %int %205 %206
+        %204 = OpCopyObject %int %207
+               OpStore %x_151 %204
+        %208 = OpAccessChain %_ptr_Function_int %data %191
+        %209 = OpLoad %int %208
+        %210 = OpLoad %int %x_131
+        %211 = OpAccessChain %_ptr_Function_int %temp %210
+               OpStore %211 %209
+               OpStore %x_135_phi %180
+        %212 = OpLoad %int %x_151
+               OpStore %x_137_phi %212
+               OpBranch %201
+        %203 = OpLabel
+        %213 = OpIAdd %int %180 %int_1
+               OpStore %x_154 %213
+        %214 = OpAccessChain %_ptr_Function_int %data %180
+        %215 = OpLoad %int %214
+        %216 = OpLoad %int %x_131
+        %217 = OpAccessChain %_ptr_Function_int %temp %216
+               OpStore %217 %215
+        %218 = OpLoad %int %x_154
+               OpStore %x_135_phi %218
+        %219 = OpLoad %int %x_136
+               OpStore %x_137_phi %219
+               OpBranch %201
+        %201 = OpLabel
+        %220 = OpLoad %int %x_135_phi
+        %221 = OpLoad %int %x_137_phi
+               OpBranch %173
+        %173 = OpLabel
+               OpStore %x_131_phi %196
+               OpStore %x_134_phi %220
+               OpStore %x_136_phi %221
+               OpBranch %171
+        %172 = OpLabel
+        %222 = OpLoad %int %x_131
+               OpStore %x_158_phi %222
+        %223 = OpLoad %int %x_136
+               OpStore %x_161_phi %223
+               OpBranch %224
+        %224 = OpLabel
+               OpLoopMerge %225 %226 None
+               OpBranch %227
+        %227 = OpLabel
+        %230 = OpLoad %int %x_158_phi
+        %231 = OpLoad %int %x_161_phi
+        %232 = OpSLessThan %bool %231 %int_10
+               OpSelectionMerge %233 None
+               OpBranchConditional %232 %234 %233
+        %234 = OpLabel
+        %235 = OpSLessThanEqual %bool %231 %165
+               OpBranch %233
+        %233 = OpLabel
+        %236 = OpPhi %bool %232 %227 %235 %234
+               OpSelectionMerge %237 None
+               OpBranchConditional %236 %238 %239
+        %238 = OpLabel
+               OpBranch %237
+        %239 = OpLabel
+               OpBranch %225
+        %237 = OpLabel
+               OpBranch %226
+        %226 = OpLabel
+        %240 = OpIAdd %int %230 %int_1
+               OpStore %x_159 %240
+        %241 = OpIAdd %int %231 %int_1
+               OpStore %x_162 %241
+        %242 = OpAccessChain %_ptr_Function_int %data %231
+        %243 = OpLoad %int %242
+        %244 = OpAccessChain %_ptr_Function_int %temp %230
+               OpStore %244 %243
+        %245 = OpLoad %int %x_159
+               OpStore %x_158_phi %245
+        %246 = OpLoad %int %x_162
+               OpStore %x_161_phi %246
+               OpBranch %224
+        %225 = OpLabel
+               OpStore %x_171_phi %159
+               OpBranch %247
+        %247 = OpLabel
+               OpLoopMerge %248 %249 None
+               OpBranch %250
+        %250 = OpLabel
+        %252 = OpLoad %int %x_171_phi
+        %253 = OpSLessThanEqual %bool %252 %168
+               OpSelectionMerge %254 None
+               OpBranchConditional %253 %255 %256
+        %255 = OpLabel
+               OpBranch %254
+        %256 = OpLabel
+               OpBranch %248
+        %254 = OpLabel
+               OpBranch %249
+        %249 = OpLabel
+        %257 = OpAccessChain %_ptr_Function_int %temp %252
+        %258 = OpLoad %int %257
+        %259 = OpAccessChain %_ptr_Function_int %data %252
+               OpStore %259 %258
+        %260 = OpIAdd %int %252 %int_1
+               OpStore %x_172 %260
+        %261 = OpLoad %int %x_172
+               OpStore %x_171_phi %261
+               OpBranch %247
+        %248 = OpLabel
+               OpBranch %149
+        %149 = OpLabel
+               OpStore %x_119_phi %167
+               OpBranch %147
+        %148 = OpLabel
+               OpBranch %137
+        %137 = OpLabel
+        %262 = OpIMul %int %int_2 %141
+               OpStore %x_113 %262
+        %263 = OpLoad %int %x_113
+               OpStore %x_112_phi %263
+               OpBranch %135
+        %136 = OpLabel
+        %270 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %271 = OpLoad %float %270
+        %272 = OpConvertFToS %int %271
+               OpStore %x_181 %272
+        %273 = OpLoad %int %x_181
+        %275 = OpSLessThan %bool %273 %int_30
+               OpSelectionMerge %276 None
+               OpBranchConditional %275 %277 %278
+        %277 = OpLabel
+        %279 = OpAccessChain %_ptr_Function_int %data %int_0
+        %280 = OpLoad %int %279
+        %282 = OpConvertSToF %float %280
+        %284 = OpFMul %float %282 %float_0_100000001
+        %285 = OpFAdd %float %float_0_5 %284
+               OpStore %x_190 %285
+        %286 = OpLoad %float %x_190
+               OpStore %x_263_phi %286
+               OpBranch %276
+        %278 = OpLabel
+        %290 = OpLoad %int %x_181
+        %292 = OpSLessThan %bool %290 %int_60
+               OpSelectionMerge %293 None
+               OpBranchConditional %292 %294 %295
+        %294 = OpLabel
+        %296 = OpAccessChain %_ptr_Function_int %data %int_1
+        %297 = OpLoad %int %296
+        %298 = OpConvertSToF %float %297
+        %299 = OpFMul %float %298 %float_0_100000001
+        %300 = OpFAdd %float %float_0_5 %299
+               OpStore %x_199 %300
+        %301 = OpLoad %float %x_199
+               OpStore %x_262_phi %301
+               OpBranch %293
+        %295 = OpLabel
+        %305 = OpLoad %int %x_181
+        %307 = OpSLessThan %bool %305 %int_90
+               OpSelectionMerge %308 None
+               OpBranchConditional %307 %309 %310
+        %309 = OpLabel
+        %311 = OpAccessChain %_ptr_Function_int %data %int_2
+        %312 = OpLoad %int %311
+        %313 = OpConvertSToF %float %312
+        %314 = OpFMul %float %313 %float_0_100000001
+        %315 = OpFAdd %float %float_0_5 %314
+               OpStore %x_208 %315
+        %316 = OpLoad %float %x_208
+               OpStore %x_261_phi %316
+               OpBranch %308
+        %310 = OpLabel
+        %317 = OpLoad %int %x_181
+        %319 = OpSLessThan %bool %317 %int_120
+               OpSelectionMerge %320 None
+               OpBranchConditional %319 %321 %322
+        %321 = OpLabel
+        %323 = OpAccessChain %_ptr_Function_int %data %int_3
+        %324 = OpLoad %int %323
+        %325 = OpConvertSToF %float %324
+        %326 = OpFMul %float %325 %float_0_100000001
+        %327 = OpFAdd %float %float_0_5 %326
+               OpStore %x_217 %327
+        %328 = OpLoad %float %x_217
+               OpStore %x_260_phi %328
+               OpBranch %320
+        %322 = OpLabel
+        %332 = OpLoad %int %x_181
+        %334 = OpSLessThan %bool %332 %int_150
+               OpSelectionMerge %335 None
+               OpBranchConditional %334 %336 %337
+        %336 = OpLabel
+               OpKill
+        %337 = OpLabel
+        %341 = OpLoad %int %x_181
+        %343 = OpSLessThan %bool %341 %int_180
+               OpSelectionMerge %344 None
+               OpBranchConditional %343 %345 %346
+        %345 = OpLabel
+        %348 = OpAccessChain %_ptr_Function_int %data %int_5
+        %349 = OpLoad %int %348
+        %350 = OpConvertSToF %float %349
+        %351 = OpFMul %float %350 %float_0_100000001
+        %352 = OpFAdd %float %float_0_5 %351
+               OpStore %x_230 %352
+        %353 = OpLoad %float %x_230
+               OpStore %x_259_phi %353
+               OpBranch %344
+        %346 = OpLabel
+        %357 = OpLoad %int %x_181
+        %359 = OpSLessThan %bool %357 %int_210
+               OpSelectionMerge %360 None
+               OpBranchConditional %359 %361 %362
+        %361 = OpLabel
+        %364 = OpAccessChain %_ptr_Function_int %data %int_6
+        %365 = OpLoad %int %364
+        %366 = OpConvertSToF %float %365
+        %367 = OpFMul %float %366 %float_0_100000001
+        %368 = OpFAdd %float %float_0_5 %367
+               OpStore %x_239 %368
+        %369 = OpLoad %float %x_239
+               OpStore %x_258_phi %369
+               OpBranch %360
+        %362 = OpLabel
+        %370 = OpLoad %int %x_181
+        %372 = OpSLessThan %bool %370 %int_240
+               OpSelectionMerge %373 None
+               OpBranchConditional %372 %374 %375
+        %374 = OpLabel
+        %377 = OpAccessChain %_ptr_Function_int %data %int_7
+        %378 = OpLoad %int %377
+        %379 = OpConvertSToF %float %378
+        %380 = OpFMul %float %379 %float_0_100000001
+        %381 = OpFAdd %float %float_0_5 %380
+               OpStore %x_248 %381
+        %382 = OpLoad %float %x_248
+               OpStore %x_257_phi %382
+               OpBranch %373
+        %375 = OpLabel
+        %383 = OpLoad %int %x_181
+        %385 = OpSLessThan %bool %383 %int_270
+               OpSelectionMerge %386 None
+               OpBranchConditional %385 %387 %388
+        %387 = OpLabel
+               OpBranch %386
+        %388 = OpLabel
+               OpKill
+        %386 = OpLabel
+        %390 = OpAccessChain %_ptr_Function_int %data %int_8
+        %391 = OpLoad %int %390
+        %392 = OpConvertSToF %float %391
+        %393 = OpFMul %float %392 %float_0_100000001
+        %394 = OpFAdd %float %float_0_5 %393
+               OpStore %x_256 %394
+        %395 = OpLoad %float %x_256
+               OpStore %x_257_phi %395
+               OpBranch %373
+        %373 = OpLabel
+        %396 = OpLoad %float %x_257_phi
+               OpStore %x_257 %396
+        %397 = OpLoad %float %x_257
+               OpStore %x_258_phi %397
+               OpBranch %360
+        %360 = OpLabel
+        %398 = OpLoad %float %x_258_phi
+               OpStore %x_258 %398
+        %399 = OpLoad %float %x_258
+               OpStore %x_259_phi %399
+               OpBranch %344
+        %344 = OpLabel
+        %400 = OpLoad %float %x_259_phi
+               OpStore %x_259 %400
+               OpBranch %335
+        %335 = OpLabel
+        %401 = OpLoad %float %x_259
+               OpStore %x_260_phi %401
+               OpBranch %320
+        %320 = OpLabel
+        %402 = OpLoad %float %x_260_phi
+               OpStore %x_260 %402
+        %403 = OpLoad %float %x_260
+               OpStore %x_261_phi %403
+               OpBranch %308
+        %308 = OpLabel
+        %404 = OpLoad %float %x_261_phi
+               OpStore %x_261 %404
+        %405 = OpLoad %float %x_261
+               OpStore %x_262_phi %405
+               OpBranch %293
+        %293 = OpLabel
+        %406 = OpLoad %float %x_262_phi
+               OpStore %x_262 %406
+        %407 = OpLoad %float %x_262
+               OpStore %x_263_phi %407
+               OpBranch %276
+        %276 = OpLabel
+        %408 = OpLoad %float %x_263_phi
+        %410 = OpCompositeConstruct %v4float %408 %408 %408 %float_1
+               OpStore %x_GLF_color %410
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %411
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %415 = OpLabel
+        %416 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %416
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %418 = OpLabel
+        %419 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %419
+        %420 = OpFunctionCall %void %main_1
+        %422 = OpLoad %v4float %x_GLF_color
+        %423 = OpCompositeConstruct %main_out %422
+        %421 = OpFunctionCall %void %tint_symbol_3 %423
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 44[%44] is not post dominated by the back-edge block 117[%117]
+  %117 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..fc4bfa1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/1.wgsl.expected.wgsl
@@ -0,0 +1,341 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var temp : array<i32, 10>;
+  var data : array<i32, 10>;
+  var x_190 : f32;
+  var x_262 : f32;
+  var x_63_phi : i32;
+  var x_103_phi : i32;
+  var x_112_phi : i32;
+  var x_263_phi : f32;
+  let x_60 : f32 = x_8.injectionSwitch.x;
+  let x_61 : i32 = i32(x_60);
+  x_63_phi = x_61;
+  loop {
+    var x_100 : i32;
+    var x_98 : i32;
+    var x_96 : i32;
+    var x_94 : i32;
+    var x_92 : i32;
+    var x_90 : i32;
+    var x_88 : i32;
+    var x_86 : i32;
+    var x_84 : i32;
+    var x_82 : i32;
+    var x_64_phi : i32;
+    let x_63 : i32 = x_63_phi;
+    let x_68 : array<i32, 10> = data;
+    data = array<i32, 10>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+    data = x_68;
+    let x_69 : i32 = (x_63 + 1);
+    x_64_phi = x_69;
+    switch(x_63) {
+      case 9: {
+        data[x_63] = -5;
+        x_100 = (x_63 + 1);
+        x_64_phi = x_100;
+      }
+      case 8: {
+        data[x_63] = -4;
+        x_98 = (x_63 + 1);
+        x_64_phi = x_98;
+      }
+      case 7: {
+        data[x_63] = -3;
+        x_96 = (x_63 + 1);
+        x_64_phi = x_96;
+      }
+      case 6: {
+        data[x_63] = -2;
+        x_94 = (x_63 + 1);
+        x_64_phi = x_94;
+      }
+      case 5: {
+        data[x_63] = -1;
+        x_92 = (x_63 + 1);
+        x_64_phi = x_92;
+      }
+      case 4: {
+        data[x_63] = 0;
+        x_90 = (x_63 + 1);
+        x_64_phi = x_90;
+      }
+      case 3: {
+        data[x_63] = 1;
+        x_88 = (x_63 + 1);
+        x_64_phi = x_88;
+      }
+      case 2: {
+        data[x_63] = 2;
+        x_86 = (x_63 + 1);
+        x_64_phi = x_86;
+      }
+      case 1: {
+        data[x_63] = 3;
+        x_84 = (x_63 + 1);
+        x_64_phi = x_84;
+      }
+      case 0: {
+        data[x_63] = 4;
+        x_82 = (x_63 + 1);
+        x_64_phi = x_82;
+      }
+      default: {
+      }
+    }
+    let x_64 : i32 = x_64_phi;
+
+    continuing {
+      x_63_phi = x_64;
+      if ((x_64 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_103_phi = 0;
+  loop {
+    var x_104 : i32;
+    let x_103 : i32 = x_103_phi;
+    if ((x_103 < 10)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_109 : i32 = data[x_103];
+      temp[x_103] = x_109;
+      x_104 = (x_103 + 1);
+      x_103_phi = x_104;
+    }
+  }
+  x_112_phi = 1;
+  loop {
+    var x_113 : i32;
+    var x_119_phi : i32;
+    let x_112 : i32 = x_112_phi;
+    if ((x_112 <= 9)) {
+    } else {
+      break;
+    }
+    x_119_phi = 0;
+    loop {
+      var x_131 : i32;
+      var x_136 : i32;
+      var x_131_phi : i32;
+      var x_134_phi : i32;
+      var x_136_phi : i32;
+      var x_158_phi : i32;
+      var x_161_phi : i32;
+      var x_171_phi : i32;
+      let x_119 : i32 = x_119_phi;
+      if ((x_119 < 9)) {
+      } else {
+        break;
+      }
+      let x_125 : i32 = (x_119 + x_112);
+      let x_126 : i32 = (x_125 - 1);
+      let x_120 : i32 = (x_119 + (2 * x_112));
+      let x_129 : i32 = min((x_120 - 1), 9);
+      x_131_phi = x_119;
+      x_134_phi = x_125;
+      x_136_phi = x_119;
+      loop {
+        var x_151 : i32;
+        var x_154 : i32;
+        var x_135_phi : i32;
+        var x_137_phi : i32;
+        x_131 = x_131_phi;
+        let x_134 : i32 = x_134_phi;
+        x_136 = x_136_phi;
+        if (((x_136 <= x_126) && (x_134 <= x_129))) {
+        } else {
+          break;
+        }
+        let x_143 : ptr<function, i32> = &(data[x_136]);
+        let x_144 : i32 = *(x_143);
+        let x_145 : ptr<function, i32> = &(data[x_134]);
+        let x_146 : i32 = *(x_145);
+        let x_132 : i32 = bitcast<i32>((x_131 + bitcast<i32>(1)));
+        if ((x_144 < x_146)) {
+          x_151 = bitcast<i32>((x_136 + bitcast<i32>(1)));
+          let x_152 : i32 = *(x_143);
+          temp[x_131] = x_152;
+          x_135_phi = x_134;
+          x_137_phi = x_151;
+        } else {
+          x_154 = (x_134 + 1);
+          let x_155 : i32 = *(x_145);
+          temp[x_131] = x_155;
+          x_135_phi = x_154;
+          x_137_phi = x_136;
+        }
+        let x_135 : i32 = x_135_phi;
+        let x_137 : i32 = x_137_phi;
+
+        continuing {
+          x_131_phi = x_132;
+          x_134_phi = x_135;
+          x_136_phi = x_137;
+        }
+      }
+      x_158_phi = x_131;
+      x_161_phi = x_136;
+      loop {
+        var x_159 : i32;
+        var x_162 : i32;
+        let x_158 : i32 = x_158_phi;
+        let x_161 : i32 = x_161_phi;
+        if (((x_161 < 10) && (x_161 <= x_126))) {
+        } else {
+          break;
+        }
+
+        continuing {
+          x_159 = (x_158 + 1);
+          x_162 = (x_161 + 1);
+          let x_168 : i32 = data[x_161];
+          temp[x_158] = x_168;
+          x_158_phi = x_159;
+          x_161_phi = x_162;
+        }
+      }
+      x_171_phi = x_119;
+      loop {
+        var x_172 : i32;
+        let x_171 : i32 = x_171_phi;
+        if ((x_171 <= x_129)) {
+        } else {
+          break;
+        }
+
+        continuing {
+          let x_177 : i32 = temp[x_171];
+          data[x_171] = x_177;
+          x_172 = (x_171 + 1);
+          x_171_phi = x_172;
+        }
+      }
+
+      continuing {
+        x_119_phi = x_120;
+      }
+    }
+
+    continuing {
+      x_113 = (2 * x_112);
+      x_112_phi = x_113;
+    }
+  }
+  var x_181 : i32;
+  var x_199 : f32;
+  var x_261 : f32;
+  var x_262_phi : f32;
+  let x_180 : f32 = gl_FragCoord.y;
+  x_181 = i32(x_180);
+  if ((x_181 < 30)) {
+    let x_187 : i32 = data[0];
+    x_190 = (0.5 + (f32(x_187) * 0.100000001));
+    x_263_phi = x_190;
+  } else {
+    var x_208 : f32;
+    var x_260 : f32;
+    var x_261_phi : f32;
+    if ((x_181 < 60)) {
+      let x_196 : i32 = data[1];
+      x_199 = (0.5 + (f32(x_196) * 0.100000001));
+      x_262_phi = x_199;
+    } else {
+      var x_217 : f32;
+      var x_259 : f32;
+      var x_260_phi : f32;
+      if ((x_181 < 90)) {
+        let x_205 : i32 = data[2];
+        x_208 = (0.5 + (f32(x_205) * 0.100000001));
+        x_261_phi = x_208;
+      } else {
+        if ((x_181 < 120)) {
+          let x_214 : i32 = data[3];
+          x_217 = (0.5 + (f32(x_214) * 0.100000001));
+          x_260_phi = x_217;
+        } else {
+          var x_230 : f32;
+          var x_258 : f32;
+          var x_259_phi : f32;
+          if ((x_181 < 150)) {
+            discard;
+          } else {
+            var x_239 : f32;
+            var x_257 : f32;
+            var x_258_phi : f32;
+            if ((x_181 < 180)) {
+              let x_227 : i32 = data[5];
+              x_230 = (0.5 + (f32(x_227) * 0.100000001));
+              x_259_phi = x_230;
+            } else {
+              var x_248 : f32;
+              var x_256 : f32;
+              var x_257_phi : f32;
+              if ((x_181 < 210)) {
+                let x_236 : i32 = data[6];
+                x_239 = (0.5 + (f32(x_236) * 0.100000001));
+                x_258_phi = x_239;
+              } else {
+                if ((x_181 < 240)) {
+                  let x_245 : i32 = data[7];
+                  x_248 = (0.5 + (f32(x_245) * 0.100000001));
+                  x_257_phi = x_248;
+                } else {
+                  if ((x_181 < 270)) {
+                  } else {
+                    discard;
+                  }
+                  let x_253 : i32 = data[8];
+                  x_256 = (0.5 + (f32(x_253) * 0.100000001));
+                  x_257_phi = x_256;
+                }
+                x_257 = x_257_phi;
+                x_258_phi = x_257;
+              }
+              x_258 = x_258_phi;
+              x_259_phi = x_258;
+            }
+            x_259 = x_259_phi;
+          }
+          x_260_phi = x_259;
+        }
+        x_260 = x_260_phi;
+        x_261_phi = x_260;
+      }
+      x_261 = x_261_phi;
+      x_262_phi = x_261;
+    }
+    x_262 = x_262_phi;
+    x_263_phi = x_262;
+  }
+  let x_263 : f32 = x_263_phi;
+  x_GLF_color = vec4<f32>(x_263, x_263, x_263, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/2.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/2.spvasm
new file mode 100644
index 0000000..ed7d367
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/2.spvasm
@@ -0,0 +1,383 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %data "data"
+               OpName %temp "temp"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+     %int_10 = OpConstant %int 10
+      %int_0 = OpConstant %int 0
+      %int_9 = OpConstant %int 9
+      %int_2 = OpConstant %int 2
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_4 = OpConstant %int 4
+      %int_3 = OpConstant %int 3
+     %int_n1 = OpConstant %int -1
+     %int_n2 = OpConstant %int -2
+     %int_n3 = OpConstant %int -3
+     %int_n4 = OpConstant %int -4
+     %int_n5 = OpConstant %int -5
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+     %int_30 = OpConstant %int 30
+  %float_0_5 = OpConstant %float 0.5
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+%float_0_100000001 = OpConstant %float 0.100000001
+    %int_0_0 = OpConstant %int 0
+         %57 = OpConstantComposite %_arr_int_uint_10 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0
+       %main = OpFunction %void None %10
+         %58 = OpLabel
+       %temp = OpVariable %_ptr_Function__arr_int_uint_10 Function
+       %data = OpVariable %_ptr_Function__arr_int_uint_10 Function
+         %59 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %60 = OpLoad %float %59
+         %61 = OpConvertFToS %int %60
+               OpBranch %62
+         %62 = OpLabel
+         %63 = OpPhi %int %61 %58 %64 %65
+               OpLoopMerge %66 %65 None
+               OpBranch %67
+         %67 = OpLabel
+         %68 = OpIAdd %int %63 %int_1
+               OpSelectionMerge %69 None
+               OpSwitch %63 %69 0 %70 1 %71 2 %72 3 %73 4 %74 5 %75 6 %76 7 %77 8 %78 9 %79
+         %70 = OpLabel
+         %80 = OpAccessChain %_ptr_Function_int %data %63
+               OpStore %80 %int_4
+         %81 = OpIAdd %int %63 %int_1
+               OpBranch %69
+         %71 = OpLabel
+         %82 = OpAccessChain %_ptr_Function_int %data %63
+               OpStore %82 %int_3
+         %83 = OpIAdd %int %63 %int_1
+               OpBranch %69
+         %72 = OpLabel
+         %84 = OpAccessChain %_ptr_Function_int %data %63
+               OpStore %84 %int_2
+         %85 = OpIAdd %int %63 %int_1
+               OpBranch %69
+         %73 = OpLabel
+         %86 = OpAccessChain %_ptr_Function_int %data %63
+               OpStore %86 %int_1
+         %87 = OpIAdd %int %63 %int_1
+               OpBranch %69
+         %74 = OpLabel
+         %88 = OpAccessChain %_ptr_Function_int %data %63
+               OpStore %88 %int_0
+         %89 = OpIAdd %int %63 %int_1
+               OpBranch %69
+         %75 = OpLabel
+         %90 = OpAccessChain %_ptr_Function_int %data %63
+               OpStore %90 %int_n1
+         %91 = OpIAdd %int %63 %int_1
+               OpBranch %69
+         %76 = OpLabel
+         %92 = OpAccessChain %_ptr_Function_int %data %63
+               OpStore %92 %int_n2
+         %93 = OpIAdd %int %63 %int_1
+               OpBranch %69
+         %77 = OpLabel
+         %94 = OpAccessChain %_ptr_Function_int %data %63
+               OpStore %94 %int_n3
+         %95 = OpIAdd %int %63 %int_1
+               OpBranch %69
+         %78 = OpLabel
+         %96 = OpAccessChain %_ptr_Function_int %data %63
+               OpStore %96 %int_n4
+         %97 = OpIAdd %int %63 %int_1
+               OpBranch %69
+         %79 = OpLabel
+         %98 = OpAccessChain %_ptr_Function_int %data %63
+               OpStore %98 %int_n5
+         %99 = OpIAdd %int %63 %int_1
+               OpBranch %69
+         %69 = OpLabel
+         %64 = OpPhi %int %68 %67 %81 %70 %83 %71 %85 %72 %87 %73 %89 %74 %91 %75 %93 %76 %95 %77 %97 %78 %99 %79
+               OpBranch %65
+         %65 = OpLabel
+        %100 = OpSLessThan %bool %64 %int_10
+               OpBranchConditional %100 %62 %66
+         %66 = OpLabel
+               OpBranch %101
+        %101 = OpLabel
+        %102 = OpPhi %int %int_0 %66 %103 %104
+        %105 = OpSLessThan %bool %102 %int_10
+               OpLoopMerge %106 %104 None
+               OpBranchConditional %105 %104 %106
+        %104 = OpLabel
+        %107 = OpAccessChain %_ptr_Function_int %data %102
+        %108 = OpLoad %int %107
+        %109 = OpAccessChain %_ptr_Function_int %temp %102
+               OpStore %109 %108
+        %103 = OpIAdd %int %102 %int_1
+               OpBranch %101
+        %106 = OpLabel
+               OpBranch %110
+        %110 = OpLabel
+        %111 = OpPhi %int %int_1 %106 %112 %113
+        %114 = OpSLessThanEqual %bool %111 %int_9
+               OpLoopMerge %115 %113 None
+               OpBranchConditional %114 %116 %115
+        %116 = OpLabel
+               OpBranch %117
+        %117 = OpLabel
+        %118 = OpPhi %int %int_0 %116 %119 %120
+        %121 = OpSLessThan %bool %118 %int_9
+               OpLoopMerge %122 %120 None
+               OpBranchConditional %121 %123 %122
+        %123 = OpLabel
+        %124 = OpIAdd %int %118 %111
+        %125 = OpISub %int %124 %int_1
+        %126 = OpIMul %int %int_2 %111
+        %119 = OpIAdd %int %118 %126
+        %127 = OpISub %int %119 %int_1
+        %128 = OpExtInst %int %1 SMin %127 %int_9
+               OpBranch %129
+        %129 = OpLabel
+        %130 = OpPhi %int %118 %123 %131 %132
+        %133 = OpPhi %int %124 %123 %134 %132
+        %135 = OpPhi %int %118 %123 %136 %132
+        %137 = OpSLessThanEqual %bool %135 %125
+        %138 = OpSLessThanEqual %bool %133 %128
+        %139 = OpLogicalAnd %bool %137 %138
+               OpLoopMerge %140 %132 None
+               OpBranchConditional %139 %141 %140
+        %141 = OpLabel
+        %142 = OpAccessChain %_ptr_Function_int %data %135
+        %143 = OpLoad %int %142
+        %144 = OpAccessChain %_ptr_Function_int %data %133
+        %145 = OpLoad %int %144
+        %146 = OpSLessThan %bool %143 %145
+        %131 = OpIAdd %int %130 %int_1
+               OpSelectionMerge %147 None
+               OpBranchConditional %146 %148 %149
+        %148 = OpLabel
+        %150 = OpIAdd %int %135 %int_1
+        %151 = OpLoad %int %142
+        %152 = OpAccessChain %_ptr_Function_int %temp %130
+               OpStore %152 %151
+               OpBranch %147
+        %149 = OpLabel
+        %153 = OpIAdd %int %133 %int_1
+        %154 = OpLoad %int %144
+        %155 = OpAccessChain %_ptr_Function_int %temp %130
+               OpStore %155 %154
+               OpBranch %147
+        %147 = OpLabel
+        %134 = OpPhi %int %133 %148 %153 %149
+        %136 = OpPhi %int %150 %148 %135 %149
+               OpBranch %132
+        %132 = OpLabel
+               OpBranch %129
+        %140 = OpLabel
+               OpBranch %156
+        %156 = OpLabel
+        %157 = OpPhi %int %130 %140 %158 %159
+        %160 = OpPhi %int %135 %140 %161 %159
+        %162 = OpSLessThan %bool %160 %int_10
+        %163 = OpSLessThanEqual %bool %160 %125
+        %164 = OpLogicalAnd %bool %162 %163
+               OpLoopMerge %165 %159 None
+               OpBranchConditional %164 %159 %165
+        %159 = OpLabel
+        %158 = OpIAdd %int %157 %int_1
+        %161 = OpIAdd %int %160 %int_1
+        %166 = OpAccessChain %_ptr_Function_int %data %160
+        %167 = OpLoad %int %166
+        %168 = OpAccessChain %_ptr_Function_int %temp %157
+               OpStore %168 %167
+               OpBranch %156
+        %165 = OpLabel
+               OpBranch %169
+        %169 = OpLabel
+        %170 = OpPhi %int %118 %165 %171 %172
+        %173 = OpSLessThanEqual %bool %170 %128
+               OpLoopMerge %174 %172 None
+               OpBranchConditional %173 %172 %174
+        %172 = OpLabel
+        %175 = OpAccessChain %_ptr_Function_int %temp %170
+        %176 = OpLoad %int %175
+        %177 = OpAccessChain %_ptr_Function_int %data %170
+               OpStore %177 %176
+        %171 = OpIAdd %int %170 %int_1
+               OpBranch %169
+        %174 = OpLabel
+               OpBranch %120
+        %120 = OpLabel
+               OpBranch %117
+        %122 = OpLabel
+               OpBranch %113
+        %113 = OpLabel
+        %112 = OpIMul %int %int_2 %111
+               OpBranch %110
+        %115 = OpLabel
+        %178 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %179 = OpLoad %float %178
+        %180 = OpConvertFToS %int %179
+        %181 = OpSLessThan %bool %180 %int_30
+               OpSelectionMerge %182 None
+               OpBranchConditional %181 %183 %184
+        %183 = OpLabel
+        %185 = OpAccessChain %_ptr_Function_int %data %int_0
+        %186 = OpLoad %int %185
+        %187 = OpConvertSToF %float %186
+        %188 = OpFMul %float %187 %float_0_100000001
+        %189 = OpFAdd %float %float_0_5 %188
+               OpBranch %182
+        %184 = OpLabel
+        %190 = OpSLessThan %bool %180 %int_60
+               OpSelectionMerge %191 None
+               OpBranchConditional %190 %192 %193
+        %192 = OpLabel
+        %194 = OpAccessChain %_ptr_Function_int %data %int_1
+        %195 = OpLoad %int %194
+        %196 = OpConvertSToF %float %195
+        %197 = OpFMul %float %196 %float_0_100000001
+        %198 = OpFAdd %float %float_0_5 %197
+               OpBranch %191
+        %193 = OpLabel
+        %199 = OpSLessThan %bool %180 %int_90
+               OpSelectionMerge %200 None
+               OpBranchConditional %199 %201 %202
+        %201 = OpLabel
+        %203 = OpAccessChain %_ptr_Function_int %data %int_2
+        %204 = OpLoad %int %203
+        %205 = OpConvertSToF %float %204
+        %206 = OpFMul %float %205 %float_0_100000001
+        %207 = OpFAdd %float %float_0_5 %206
+               OpBranch %200
+        %202 = OpLabel
+        %208 = OpSLessThan %bool %180 %int_120
+               OpSelectionMerge %209 None
+               OpBranchConditional %208 %210 %211
+        %210 = OpLabel
+        %212 = OpAccessChain %_ptr_Function_int %data %int_3
+        %213 = OpLoad %int %212
+        %214 = OpConvertSToF %float %213
+        %215 = OpFMul %float %214 %float_0_100000001
+        %216 = OpFAdd %float %float_0_5 %215
+               OpBranch %209
+        %211 = OpLabel
+        %217 = OpSLessThan %bool %180 %int_150
+               OpSelectionMerge %218 None
+               OpBranchConditional %217 %219 %220
+        %219 = OpLabel
+               OpKill
+        %220 = OpLabel
+        %221 = OpSLessThan %bool %180 %int_180
+               OpSelectionMerge %222 None
+               OpBranchConditional %221 %223 %224
+        %223 = OpLabel
+        %225 = OpAccessChain %_ptr_Function_int %data %int_5
+        %226 = OpLoad %int %225
+        %227 = OpConvertSToF %float %226
+        %228 = OpFMul %float %227 %float_0_100000001
+        %229 = OpFAdd %float %float_0_5 %228
+               OpBranch %222
+        %224 = OpLabel
+        %230 = OpSLessThan %bool %180 %int_210
+               OpSelectionMerge %231 None
+               OpBranchConditional %230 %232 %233
+        %232 = OpLabel
+        %234 = OpAccessChain %_ptr_Function_int %data %int_6
+        %235 = OpLoad %int %234
+        %236 = OpConvertSToF %float %235
+        %237 = OpFMul %float %236 %float_0_100000001
+        %238 = OpFAdd %float %float_0_5 %237
+               OpBranch %231
+        %233 = OpLabel
+        %239 = OpSLessThan %bool %180 %int_240
+               OpSelectionMerge %240 None
+               OpBranchConditional %239 %241 %242
+        %241 = OpLabel
+        %243 = OpAccessChain %_ptr_Function_int %data %int_7
+        %244 = OpLoad %int %243
+        %245 = OpConvertSToF %float %244
+        %246 = OpFMul %float %245 %float_0_100000001
+        %247 = OpFAdd %float %float_0_5 %246
+               OpBranch %240
+        %242 = OpLabel
+        %248 = OpSLessThan %bool %180 %int_270
+               OpSelectionMerge %249 None
+               OpBranchConditional %248 %249 %250
+        %249 = OpLabel
+        %251 = OpAccessChain %_ptr_Function_int %data %int_8
+        %252 = OpLoad %int %251
+        %253 = OpConvertSToF %float %252
+        %254 = OpFMul %float %253 %float_0_100000001
+        %255 = OpFAdd %float %float_0_5 %254
+               OpBranch %240
+        %250 = OpLabel
+               OpKill
+        %240 = OpLabel
+        %256 = OpPhi %float %247 %241 %255 %249
+               OpBranch %231
+        %231 = OpLabel
+        %257 = OpPhi %float %238 %232 %256 %240
+               OpBranch %222
+        %222 = OpLabel
+        %258 = OpPhi %float %229 %223 %257 %231
+               OpBranch %218
+        %218 = OpLabel
+               OpBranch %209
+        %209 = OpLabel
+        %259 = OpPhi %float %216 %210 %258 %218
+               OpBranch %200
+        %200 = OpLabel
+        %260 = OpPhi %float %207 %201 %259 %209
+               OpBranch %191
+        %191 = OpLabel
+        %261 = OpPhi %float %198 %192 %260 %200
+               OpBranch %182
+        %182 = OpLabel
+        %262 = OpPhi %float %189 %183 %261 %191
+        %263 = OpCompositeConstruct %v4float %262 %262 %262 %float_1
+               OpStore %_GLF_color %263
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/2.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/2.spvasm.expected.hlsl
new file mode 100644
index 0000000..3b86173
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/2.spvasm.expected.hlsl
@@ -0,0 +1,352 @@
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int temp[10] = (int[10])0;
+  int data[10] = (int[10])0;
+  float x_189 = 0.0f;
+  float x_261 = 0.0f;
+  int x_63_phi = 0;
+  int x_102_phi = 0;
+  int x_111_phi = 0;
+  float x_262_phi = 0.0f;
+  const float x_60 = asfloat(x_8[0].x);
+  const int x_61 = int(x_60);
+  x_63_phi = x_61;
+  while (true) {
+    int x_99 = 0;
+    int x_97 = 0;
+    int x_95 = 0;
+    int x_93 = 0;
+    int x_91 = 0;
+    int x_89 = 0;
+    int x_87 = 0;
+    int x_85 = 0;
+    int x_83 = 0;
+    int x_81 = 0;
+    int x_64_phi = 0;
+    const int x_63 = x_63_phi;
+    const int x_68 = (x_63 + 1);
+    x_64_phi = x_68;
+    switch(x_63) {
+      case 9: {
+        data[x_63] = -5;
+        x_99 = (x_63 + 1);
+        x_64_phi = x_99;
+        break;
+      }
+      case 8: {
+        data[x_63] = -4;
+        x_97 = (x_63 + 1);
+        x_64_phi = x_97;
+        break;
+      }
+      case 7: {
+        data[x_63] = -3;
+        x_95 = (x_63 + 1);
+        x_64_phi = x_95;
+        break;
+      }
+      case 6: {
+        data[x_63] = -2;
+        x_93 = (x_63 + 1);
+        x_64_phi = x_93;
+        break;
+      }
+      case 5: {
+        data[x_63] = -1;
+        x_91 = (x_63 + 1);
+        x_64_phi = x_91;
+        break;
+      }
+      case 4: {
+        data[x_63] = 0;
+        x_89 = (x_63 + 1);
+        x_64_phi = x_89;
+        break;
+      }
+      case 3: {
+        data[x_63] = 1;
+        x_87 = (x_63 + 1);
+        x_64_phi = x_87;
+        break;
+      }
+      case 2: {
+        data[x_63] = 2;
+        x_85 = (x_63 + 1);
+        x_64_phi = x_85;
+        break;
+      }
+      case 1: {
+        data[x_63] = 3;
+        x_83 = (x_63 + 1);
+        x_64_phi = x_83;
+        break;
+      }
+      case 0: {
+        data[x_63] = 4;
+        x_81 = (x_63 + 1);
+        x_64_phi = x_81;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    const int x_64 = x_64_phi;
+    {
+      x_63_phi = x_64;
+      if ((x_64 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_102_phi = 0;
+  while (true) {
+    int x_103 = 0;
+    const int x_102 = x_102_phi;
+    if ((x_102 < 10)) {
+    } else {
+      break;
+    }
+    {
+      const int x_108 = data[x_102];
+      temp[x_102] = x_108;
+      x_103 = (x_102 + 1);
+      x_102_phi = x_103;
+    }
+  }
+  x_111_phi = 1;
+  while (true) {
+    int x_112 = 0;
+    int x_118_phi = 0;
+    const int x_111 = x_111_phi;
+    if ((x_111 <= 9)) {
+    } else {
+      break;
+    }
+    x_118_phi = 0;
+    while (true) {
+      int x_130 = 0;
+      int x_135 = 0;
+      int x_130_phi = 0;
+      int x_133_phi = 0;
+      int x_135_phi = 0;
+      int x_157_phi = 0;
+      int x_160_phi = 0;
+      int x_170_phi = 0;
+      const int x_118 = x_118_phi;
+      if ((x_118 < 9)) {
+      } else {
+        break;
+      }
+      const int x_124 = (x_118 + x_111);
+      const int x_125 = (x_124 - 1);
+      const int x_119 = (x_118 + (2 * x_111));
+      const int x_128 = min((x_119 - 1), 9);
+      x_130_phi = x_118;
+      x_133_phi = x_124;
+      x_135_phi = x_118;
+      while (true) {
+        int x_150 = 0;
+        int x_153 = 0;
+        int x_134_phi = 0;
+        int x_136_phi = 0;
+        x_130 = x_130_phi;
+        const int x_133 = x_133_phi;
+        x_135 = x_135_phi;
+        bool tint_tmp = (x_135 <= x_125);
+        if (tint_tmp) {
+          tint_tmp = (x_133 <= x_128);
+        }
+        if ((tint_tmp)) {
+        } else {
+          break;
+        }
+        const int x_142_save = x_135;
+        const int x_143 = data[x_142_save];
+        const int x_144_save = x_133;
+        const int x_145 = data[x_144_save];
+        const int x_131 = asint((x_130 + asint(1)));
+        if ((x_143 < x_145)) {
+          x_150 = asint((x_135 + asint(1)));
+          const int x_151 = data[x_142_save];
+          temp[x_130] = x_151;
+          x_134_phi = x_133;
+          x_136_phi = x_150;
+        } else {
+          x_153 = (x_133 + 1);
+          const int x_154 = data[x_144_save];
+          temp[x_130] = x_154;
+          x_134_phi = x_153;
+          x_136_phi = x_135;
+        }
+        const int x_134 = x_134_phi;
+        const int x_136 = x_136_phi;
+        {
+          x_130_phi = x_131;
+          x_133_phi = x_134;
+          x_135_phi = x_136;
+        }
+      }
+      x_157_phi = x_130;
+      x_160_phi = x_135;
+      while (true) {
+        int x_158 = 0;
+        int x_161 = 0;
+        const int x_157 = x_157_phi;
+        const int x_160 = x_160_phi;
+        bool tint_tmp_1 = (x_160 < 10);
+        if (tint_tmp_1) {
+          tint_tmp_1 = (x_160 <= x_125);
+        }
+        if ((tint_tmp_1)) {
+        } else {
+          break;
+        }
+        {
+          x_158 = (x_157 + 1);
+          x_161 = (x_160 + 1);
+          const int x_167 = data[x_160];
+          temp[x_157] = x_167;
+          x_157_phi = x_158;
+          x_160_phi = x_161;
+        }
+      }
+      x_170_phi = x_118;
+      while (true) {
+        int x_171 = 0;
+        const int x_170 = x_170_phi;
+        if ((x_170 <= x_128)) {
+        } else {
+          break;
+        }
+        {
+          const int x_176 = temp[x_170];
+          data[x_170] = x_176;
+          x_171 = (x_170 + 1);
+          x_170_phi = x_171;
+        }
+      }
+      {
+        x_118_phi = x_119;
+      }
+    }
+    {
+      x_112 = (2 * x_111);
+      x_111_phi = x_112;
+    }
+  }
+  int x_180 = 0;
+  float x_198 = 0.0f;
+  float x_260 = 0.0f;
+  float x_261_phi = 0.0f;
+  const float x_179 = gl_FragCoord.y;
+  x_180 = int(x_179);
+  if ((x_180 < 30)) {
+    const int x_186 = data[0];
+    x_189 = (0.5f + (float(x_186) * 0.100000001f));
+    x_262_phi = x_189;
+  } else {
+    float x_207 = 0.0f;
+    float x_259 = 0.0f;
+    float x_260_phi = 0.0f;
+    if ((x_180 < 60)) {
+      const int x_195 = data[1];
+      x_198 = (0.5f + (float(x_195) * 0.100000001f));
+      x_261_phi = x_198;
+    } else {
+      float x_216 = 0.0f;
+      float x_258 = 0.0f;
+      float x_259_phi = 0.0f;
+      if ((x_180 < 90)) {
+        const int x_204 = data[2];
+        x_207 = (0.5f + (float(x_204) * 0.100000001f));
+        x_260_phi = x_207;
+      } else {
+        if ((x_180 < 120)) {
+          const int x_213 = data[3];
+          x_216 = (0.5f + (float(x_213) * 0.100000001f));
+          x_259_phi = x_216;
+        } else {
+          float x_229 = 0.0f;
+          float x_257 = 0.0f;
+          float x_258_phi = 0.0f;
+          if ((x_180 < 150)) {
+            discard;
+          } else {
+            float x_238 = 0.0f;
+            float x_256 = 0.0f;
+            float x_257_phi = 0.0f;
+            if ((x_180 < 180)) {
+              const int x_226 = data[5];
+              x_229 = (0.5f + (float(x_226) * 0.100000001f));
+              x_258_phi = x_229;
+            } else {
+              float x_247 = 0.0f;
+              float x_255 = 0.0f;
+              float x_256_phi = 0.0f;
+              if ((x_180 < 210)) {
+                const int x_235 = data[6];
+                x_238 = (0.5f + (float(x_235) * 0.100000001f));
+                x_257_phi = x_238;
+              } else {
+                if ((x_180 < 240)) {
+                  const int x_244 = data[7];
+                  x_247 = (0.5f + (float(x_244) * 0.100000001f));
+                  x_256_phi = x_247;
+                } else {
+                  if ((x_180 < 270)) {
+                  } else {
+                    discard;
+                  }
+                  const int x_252 = data[8];
+                  x_255 = (0.5f + (float(x_252) * 0.100000001f));
+                  x_256_phi = x_255;
+                }
+                x_256 = x_256_phi;
+                x_257_phi = x_256;
+              }
+              x_257 = x_257_phi;
+              x_258_phi = x_257;
+            }
+            x_258 = x_258_phi;
+          }
+          x_259_phi = x_258;
+        }
+        x_259 = x_259_phi;
+        x_260_phi = x_259;
+      }
+      x_260 = x_260_phi;
+      x_261_phi = x_260;
+    }
+    x_261 = x_261_phi;
+    x_262_phi = x_261;
+  }
+  const float x_262 = x_262_phi;
+  x_GLF_color = float4(x_262, x_262, x_262, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/2.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/2.spvasm.expected.msl
new file mode 100644
index 0000000..64e598b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/2.spvasm.expected.msl
@@ -0,0 +1,346 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  tint_array_wrapper temp = {};
+  tint_array_wrapper data = {};
+  float x_189 = 0.0f;
+  float x_261 = 0.0f;
+  int x_63_phi = 0;
+  int x_102_phi = 0;
+  int x_111_phi = 0;
+  float x_262_phi = 0.0f;
+  float const x_60 = x_8.injectionSwitch.x;
+  int const x_61 = int(x_60);
+  x_63_phi = x_61;
+  while (true) {
+    int x_99 = 0;
+    int x_97 = 0;
+    int x_95 = 0;
+    int x_93 = 0;
+    int x_91 = 0;
+    int x_89 = 0;
+    int x_87 = 0;
+    int x_85 = 0;
+    int x_83 = 0;
+    int x_81 = 0;
+    int x_64_phi = 0;
+    int const x_63 = x_63_phi;
+    int const x_68 = (x_63 + 1);
+    x_64_phi = x_68;
+    switch(x_63) {
+      case 9: {
+        data.arr[x_63] = -5;
+        x_99 = (x_63 + 1);
+        x_64_phi = x_99;
+        break;
+      }
+      case 8: {
+        data.arr[x_63] = -4;
+        x_97 = (x_63 + 1);
+        x_64_phi = x_97;
+        break;
+      }
+      case 7: {
+        data.arr[x_63] = -3;
+        x_95 = (x_63 + 1);
+        x_64_phi = x_95;
+        break;
+      }
+      case 6: {
+        data.arr[x_63] = -2;
+        x_93 = (x_63 + 1);
+        x_64_phi = x_93;
+        break;
+      }
+      case 5: {
+        data.arr[x_63] = -1;
+        x_91 = (x_63 + 1);
+        x_64_phi = x_91;
+        break;
+      }
+      case 4: {
+        data.arr[x_63] = 0;
+        x_89 = (x_63 + 1);
+        x_64_phi = x_89;
+        break;
+      }
+      case 3: {
+        data.arr[x_63] = 1;
+        x_87 = (x_63 + 1);
+        x_64_phi = x_87;
+        break;
+      }
+      case 2: {
+        data.arr[x_63] = 2;
+        x_85 = (x_63 + 1);
+        x_64_phi = x_85;
+        break;
+      }
+      case 1: {
+        data.arr[x_63] = 3;
+        x_83 = (x_63 + 1);
+        x_64_phi = x_83;
+        break;
+      }
+      case 0: {
+        data.arr[x_63] = 4;
+        x_81 = (x_63 + 1);
+        x_64_phi = x_81;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    int const x_64 = x_64_phi;
+    {
+      x_63_phi = x_64;
+      if ((x_64 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_102_phi = 0;
+  while (true) {
+    int x_103 = 0;
+    int const x_102 = x_102_phi;
+    if ((x_102 < 10)) {
+    } else {
+      break;
+    }
+    {
+      int const x_108 = data.arr[x_102];
+      temp.arr[x_102] = x_108;
+      x_103 = (x_102 + 1);
+      x_102_phi = x_103;
+    }
+  }
+  x_111_phi = 1;
+  while (true) {
+    int x_112 = 0;
+    int x_118_phi = 0;
+    int const x_111 = x_111_phi;
+    if ((x_111 <= 9)) {
+    } else {
+      break;
+    }
+    x_118_phi = 0;
+    while (true) {
+      int x_130 = 0;
+      int x_135 = 0;
+      int x_130_phi = 0;
+      int x_133_phi = 0;
+      int x_135_phi = 0;
+      int x_157_phi = 0;
+      int x_160_phi = 0;
+      int x_170_phi = 0;
+      int const x_118 = x_118_phi;
+      if ((x_118 < 9)) {
+      } else {
+        break;
+      }
+      int const x_124 = (x_118 + x_111);
+      int const x_125 = (x_124 - 1);
+      int const x_119 = (x_118 + (2 * x_111));
+      int const x_128 = min((x_119 - 1), 9);
+      x_130_phi = x_118;
+      x_133_phi = x_124;
+      x_135_phi = x_118;
+      while (true) {
+        int x_150 = 0;
+        int x_153 = 0;
+        int x_134_phi = 0;
+        int x_136_phi = 0;
+        x_130 = x_130_phi;
+        int const x_133 = x_133_phi;
+        x_135 = x_135_phi;
+        if (((x_135 <= x_125) && (x_133 <= x_128))) {
+        } else {
+          break;
+        }
+        int const x_142_save = x_135;
+        int const x_143 = data.arr[x_142_save];
+        int const x_144_save = x_133;
+        int const x_145 = data.arr[x_144_save];
+        int const x_131 = as_type<int>((x_130 + as_type<int>(1)));
+        if ((x_143 < x_145)) {
+          x_150 = as_type<int>((x_135 + as_type<int>(1)));
+          int const x_151 = data.arr[x_142_save];
+          temp.arr[x_130] = x_151;
+          x_134_phi = x_133;
+          x_136_phi = x_150;
+        } else {
+          x_153 = (x_133 + 1);
+          int const x_154 = data.arr[x_144_save];
+          temp.arr[x_130] = x_154;
+          x_134_phi = x_153;
+          x_136_phi = x_135;
+        }
+        int const x_134 = x_134_phi;
+        int const x_136 = x_136_phi;
+        {
+          x_130_phi = x_131;
+          x_133_phi = x_134;
+          x_135_phi = x_136;
+        }
+      }
+      x_157_phi = x_130;
+      x_160_phi = x_135;
+      while (true) {
+        int x_158 = 0;
+        int x_161 = 0;
+        int const x_157 = x_157_phi;
+        int const x_160 = x_160_phi;
+        if (((x_160 < 10) && (x_160 <= x_125))) {
+        } else {
+          break;
+        }
+        {
+          x_158 = (x_157 + 1);
+          x_161 = (x_160 + 1);
+          int const x_167 = data.arr[x_160];
+          temp.arr[x_157] = x_167;
+          x_157_phi = x_158;
+          x_160_phi = x_161;
+        }
+      }
+      x_170_phi = x_118;
+      while (true) {
+        int x_171 = 0;
+        int const x_170 = x_170_phi;
+        if ((x_170 <= x_128)) {
+        } else {
+          break;
+        }
+        {
+          int const x_176 = temp.arr[x_170];
+          data.arr[x_170] = x_176;
+          x_171 = (x_170 + 1);
+          x_170_phi = x_171;
+        }
+      }
+      {
+        x_118_phi = x_119;
+      }
+    }
+    {
+      x_112 = (2 * x_111);
+      x_111_phi = x_112;
+    }
+  }
+  int x_180 = 0;
+  float x_198 = 0.0f;
+  float x_260 = 0.0f;
+  float x_261_phi = 0.0f;
+  float const x_179 = (*(tint_symbol_5)).y;
+  x_180 = int(x_179);
+  if ((x_180 < 30)) {
+    int const x_186 = data.arr[0];
+    x_189 = (0.5f + (float(x_186) * 0.100000001f));
+    x_262_phi = x_189;
+  } else {
+    float x_207 = 0.0f;
+    float x_259 = 0.0f;
+    float x_260_phi = 0.0f;
+    if ((x_180 < 60)) {
+      int const x_195 = data.arr[1];
+      x_198 = (0.5f + (float(x_195) * 0.100000001f));
+      x_261_phi = x_198;
+    } else {
+      float x_216 = 0.0f;
+      float x_258 = 0.0f;
+      float x_259_phi = 0.0f;
+      if ((x_180 < 90)) {
+        int const x_204 = data.arr[2];
+        x_207 = (0.5f + (float(x_204) * 0.100000001f));
+        x_260_phi = x_207;
+      } else {
+        if ((x_180 < 120)) {
+          int const x_213 = data.arr[3];
+          x_216 = (0.5f + (float(x_213) * 0.100000001f));
+          x_259_phi = x_216;
+        } else {
+          float x_229 = 0.0f;
+          float x_257 = 0.0f;
+          float x_258_phi = 0.0f;
+          if ((x_180 < 150)) {
+            discard_fragment();
+          } else {
+            float x_238 = 0.0f;
+            float x_256 = 0.0f;
+            float x_257_phi = 0.0f;
+            if ((x_180 < 180)) {
+              int const x_226 = data.arr[5];
+              x_229 = (0.5f + (float(x_226) * 0.100000001f));
+              x_258_phi = x_229;
+            } else {
+              float x_247 = 0.0f;
+              float x_255 = 0.0f;
+              float x_256_phi = 0.0f;
+              if ((x_180 < 210)) {
+                int const x_235 = data.arr[6];
+                x_238 = (0.5f + (float(x_235) * 0.100000001f));
+                x_257_phi = x_238;
+              } else {
+                if ((x_180 < 240)) {
+                  int const x_244 = data.arr[7];
+                  x_247 = (0.5f + (float(x_244) * 0.100000001f));
+                  x_256_phi = x_247;
+                } else {
+                  if ((x_180 < 270)) {
+                  } else {
+                    discard_fragment();
+                  }
+                  int const x_252 = data.arr[8];
+                  x_255 = (0.5f + (float(x_252) * 0.100000001f));
+                  x_256_phi = x_255;
+                }
+                x_256 = x_256_phi;
+                x_257_phi = x_256;
+              }
+              x_257 = x_257_phi;
+              x_258_phi = x_257;
+            }
+            x_258 = x_258_phi;
+          }
+          x_259_phi = x_258;
+        }
+        x_259 = x_259_phi;
+        x_260_phi = x_259;
+      }
+      x_260 = x_260_phi;
+      x_261_phi = x_260;
+    }
+    x_261 = x_261_phi;
+    x_262_phi = x_261;
+  }
+  float const x_262 = x_262_phi;
+  *(tint_symbol_6) = float4(x_262, x_262, x_262, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_8, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/2.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/2.spvasm.expected.spvasm
new file mode 100644
index 0000000..105bea0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/2.spvasm.expected.spvasm
@@ -0,0 +1,742 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 422
+; Schema: 0
+               OpCapability Shader
+        %167 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_8 "x_8"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %temp "temp"
+               OpName %data "data"
+               OpName %x_189 "x_189"
+               OpName %x_261 "x_261"
+               OpName %x_63_phi "x_63_phi"
+               OpName %x_102_phi "x_102_phi"
+               OpName %x_111_phi "x_111_phi"
+               OpName %x_262_phi "x_262_phi"
+               OpName %x_99 "x_99"
+               OpName %x_97 "x_97"
+               OpName %x_95 "x_95"
+               OpName %x_93 "x_93"
+               OpName %x_91 "x_91"
+               OpName %x_89 "x_89"
+               OpName %x_87 "x_87"
+               OpName %x_85 "x_85"
+               OpName %x_83 "x_83"
+               OpName %x_81 "x_81"
+               OpName %x_64_phi "x_64_phi"
+               OpName %x_103 "x_103"
+               OpName %x_112 "x_112"
+               OpName %x_118_phi "x_118_phi"
+               OpName %x_130 "x_130"
+               OpName %x_135 "x_135"
+               OpName %x_130_phi "x_130_phi"
+               OpName %x_133_phi "x_133_phi"
+               OpName %x_135_phi "x_135_phi"
+               OpName %x_157_phi "x_157_phi"
+               OpName %x_160_phi "x_160_phi"
+               OpName %x_170_phi "x_170_phi"
+               OpName %x_150 "x_150"
+               OpName %x_153 "x_153"
+               OpName %x_134_phi "x_134_phi"
+               OpName %x_136_phi "x_136_phi"
+               OpName %x_158 "x_158"
+               OpName %x_161 "x_161"
+               OpName %x_171 "x_171"
+               OpName %x_180 "x_180"
+               OpName %x_198 "x_198"
+               OpName %x_260 "x_260"
+               OpName %x_261_phi "x_261_phi"
+               OpName %x_207 "x_207"
+               OpName %x_259 "x_259"
+               OpName %x_260_phi "x_260_phi"
+               OpName %x_216 "x_216"
+               OpName %x_258 "x_258"
+               OpName %x_259_phi "x_259_phi"
+               OpName %x_229 "x_229"
+               OpName %x_257 "x_257"
+               OpName %x_258_phi "x_258_phi"
+               OpName %x_238 "x_238"
+               OpName %x_256 "x_256"
+               OpName %x_257_phi "x_257_phi"
+               OpName %x_247 "x_247"
+               OpName %x_255 "x_255"
+               OpName %x_256_phi "x_256_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+         %25 = OpConstantNull %_arr_int_uint_10
+%_ptr_Function_float = OpTypePointer Function %float
+         %29 = OpConstantNull %float
+%_ptr_Function_int = OpTypePointer Function %int
+         %33 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+     %int_n5 = OpConstant %int -5
+     %int_n4 = OpConstant %int -4
+     %int_n3 = OpConstant %int -3
+     %int_n2 = OpConstant %int -2
+     %int_n1 = OpConstant %int -1
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+     %int_10 = OpConstant %int 10
+       %bool = OpTypeBool
+      %int_9 = OpConstant %int 9
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %int_30 = OpConstant %int 30
+  %float_0_5 = OpConstant %float 0.5
+%float_0_100000001 = OpConstant %float 0.100000001
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %409 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+       %temp = OpVariable %_ptr_Function__arr_int_uint_10 Function %25
+       %data = OpVariable %_ptr_Function__arr_int_uint_10 Function %25
+      %x_189 = OpVariable %_ptr_Function_float Function %29
+      %x_261 = OpVariable %_ptr_Function_float Function %29
+   %x_63_phi = OpVariable %_ptr_Function_int Function %33
+  %x_102_phi = OpVariable %_ptr_Function_int Function %33
+  %x_111_phi = OpVariable %_ptr_Function_int Function %33
+  %x_262_phi = OpVariable %_ptr_Function_float Function %29
+       %x_99 = OpVariable %_ptr_Function_int Function %33
+       %x_97 = OpVariable %_ptr_Function_int Function %33
+       %x_95 = OpVariable %_ptr_Function_int Function %33
+       %x_93 = OpVariable %_ptr_Function_int Function %33
+       %x_91 = OpVariable %_ptr_Function_int Function %33
+       %x_89 = OpVariable %_ptr_Function_int Function %33
+       %x_87 = OpVariable %_ptr_Function_int Function %33
+       %x_85 = OpVariable %_ptr_Function_int Function %33
+       %x_83 = OpVariable %_ptr_Function_int Function %33
+       %x_81 = OpVariable %_ptr_Function_int Function %33
+   %x_64_phi = OpVariable %_ptr_Function_int Function %33
+      %x_103 = OpVariable %_ptr_Function_int Function %33
+      %x_112 = OpVariable %_ptr_Function_int Function %33
+  %x_118_phi = OpVariable %_ptr_Function_int Function %33
+      %x_130 = OpVariable %_ptr_Function_int Function %33
+      %x_135 = OpVariable %_ptr_Function_int Function %33
+  %x_130_phi = OpVariable %_ptr_Function_int Function %33
+  %x_133_phi = OpVariable %_ptr_Function_int Function %33
+  %x_135_phi = OpVariable %_ptr_Function_int Function %33
+  %x_157_phi = OpVariable %_ptr_Function_int Function %33
+  %x_160_phi = OpVariable %_ptr_Function_int Function %33
+  %x_170_phi = OpVariable %_ptr_Function_int Function %33
+      %x_150 = OpVariable %_ptr_Function_int Function %33
+      %x_153 = OpVariable %_ptr_Function_int Function %33
+  %x_134_phi = OpVariable %_ptr_Function_int Function %33
+  %x_136_phi = OpVariable %_ptr_Function_int Function %33
+      %x_158 = OpVariable %_ptr_Function_int Function %33
+      %x_161 = OpVariable %_ptr_Function_int Function %33
+      %x_171 = OpVariable %_ptr_Function_int Function %33
+      %x_180 = OpVariable %_ptr_Function_int Function %33
+      %x_198 = OpVariable %_ptr_Function_float Function %29
+      %x_260 = OpVariable %_ptr_Function_float Function %29
+  %x_261_phi = OpVariable %_ptr_Function_float Function %29
+      %x_207 = OpVariable %_ptr_Function_float Function %29
+      %x_259 = OpVariable %_ptr_Function_float Function %29
+  %x_260_phi = OpVariable %_ptr_Function_float Function %29
+      %x_216 = OpVariable %_ptr_Function_float Function %29
+      %x_258 = OpVariable %_ptr_Function_float Function %29
+  %x_259_phi = OpVariable %_ptr_Function_float Function %29
+      %x_229 = OpVariable %_ptr_Function_float Function %29
+      %x_257 = OpVariable %_ptr_Function_float Function %29
+  %x_258_phi = OpVariable %_ptr_Function_float Function %29
+      %x_238 = OpVariable %_ptr_Function_float Function %29
+      %x_256 = OpVariable %_ptr_Function_float Function %29
+  %x_257_phi = OpVariable %_ptr_Function_float Function %29
+      %x_247 = OpVariable %_ptr_Function_float Function %29
+      %x_255 = OpVariable %_ptr_Function_float Function %29
+  %x_256_phi = OpVariable %_ptr_Function_float Function %29
+         %39 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+         %40 = OpLoad %float %39
+         %41 = OpConvertFToS %int %40
+               OpStore %x_63_phi %41
+               OpBranch %42
+         %42 = OpLabel
+               OpLoopMerge %43 %44 None
+               OpBranch %45
+         %45 = OpLabel
+         %57 = OpLoad %int %x_63_phi
+         %59 = OpIAdd %int %57 %int_1
+               OpStore %x_64_phi %59
+               OpSelectionMerge %60 None
+               OpSwitch %57 %61 9 %62 8 %63 7 %64 6 %65 5 %66 4 %67 3 %68 2 %69 1 %70 0 %71
+         %62 = OpLabel
+         %72 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %72 %int_n5
+         %74 = OpIAdd %int %57 %int_1
+               OpStore %x_99 %74
+         %75 = OpLoad %int %x_99
+               OpStore %x_64_phi %75
+               OpBranch %60
+         %63 = OpLabel
+         %76 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %76 %int_n4
+         %78 = OpIAdd %int %57 %int_1
+               OpStore %x_97 %78
+         %79 = OpLoad %int %x_97
+               OpStore %x_64_phi %79
+               OpBranch %60
+         %64 = OpLabel
+         %80 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %80 %int_n3
+         %82 = OpIAdd %int %57 %int_1
+               OpStore %x_95 %82
+         %83 = OpLoad %int %x_95
+               OpStore %x_64_phi %83
+               OpBranch %60
+         %65 = OpLabel
+         %84 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %84 %int_n2
+         %86 = OpIAdd %int %57 %int_1
+               OpStore %x_93 %86
+         %87 = OpLoad %int %x_93
+               OpStore %x_64_phi %87
+               OpBranch %60
+         %66 = OpLabel
+         %88 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %88 %int_n1
+         %90 = OpIAdd %int %57 %int_1
+               OpStore %x_91 %90
+         %91 = OpLoad %int %x_91
+               OpStore %x_64_phi %91
+               OpBranch %60
+         %67 = OpLabel
+         %92 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %92 %int_0
+         %94 = OpIAdd %int %57 %int_1
+               OpStore %x_89 %94
+         %95 = OpLoad %int %x_89
+               OpStore %x_64_phi %95
+               OpBranch %60
+         %68 = OpLabel
+         %96 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %96 %int_1
+         %97 = OpIAdd %int %57 %int_1
+               OpStore %x_87 %97
+         %98 = OpLoad %int %x_87
+               OpStore %x_64_phi %98
+               OpBranch %60
+         %69 = OpLabel
+         %99 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %99 %int_2
+        %101 = OpIAdd %int %57 %int_1
+               OpStore %x_85 %101
+        %102 = OpLoad %int %x_85
+               OpStore %x_64_phi %102
+               OpBranch %60
+         %70 = OpLabel
+        %103 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %103 %int_3
+        %105 = OpIAdd %int %57 %int_1
+               OpStore %x_83 %105
+        %106 = OpLoad %int %x_83
+               OpStore %x_64_phi %106
+               OpBranch %60
+         %71 = OpLabel
+        %107 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %107 %int_4
+        %109 = OpIAdd %int %57 %int_1
+               OpStore %x_81 %109
+        %110 = OpLoad %int %x_81
+               OpStore %x_64_phi %110
+               OpBranch %60
+         %61 = OpLabel
+               OpBranch %60
+         %60 = OpLabel
+        %111 = OpLoad %int %x_64_phi
+               OpBranch %44
+         %44 = OpLabel
+               OpStore %x_63_phi %111
+        %113 = OpSLessThan %bool %111 %int_10
+               OpSelectionMerge %115 None
+               OpBranchConditional %113 %116 %117
+        %116 = OpLabel
+               OpBranch %115
+        %117 = OpLabel
+               OpBranch %43
+        %115 = OpLabel
+               OpBranch %42
+         %43 = OpLabel
+               OpStore %x_102_phi %int_0
+               OpBranch %118
+        %118 = OpLabel
+               OpLoopMerge %119 %120 None
+               OpBranch %121
+        %121 = OpLabel
+        %123 = OpLoad %int %x_102_phi
+        %124 = OpSLessThan %bool %123 %int_10
+               OpSelectionMerge %125 None
+               OpBranchConditional %124 %126 %127
+        %126 = OpLabel
+               OpBranch %125
+        %127 = OpLabel
+               OpBranch %119
+        %125 = OpLabel
+               OpBranch %120
+        %120 = OpLabel
+        %128 = OpAccessChain %_ptr_Function_int %data %123
+        %129 = OpLoad %int %128
+        %130 = OpAccessChain %_ptr_Function_int %temp %123
+               OpStore %130 %129
+        %131 = OpIAdd %int %123 %int_1
+               OpStore %x_103 %131
+        %132 = OpLoad %int %x_103
+               OpStore %x_102_phi %132
+               OpBranch %118
+        %119 = OpLabel
+               OpStore %x_111_phi %int_1
+               OpBranch %133
+        %133 = OpLabel
+               OpLoopMerge %134 %135 None
+               OpBranch %136
+        %136 = OpLabel
+        %139 = OpLoad %int %x_111_phi
+        %141 = OpSLessThanEqual %bool %139 %int_9
+               OpSelectionMerge %142 None
+               OpBranchConditional %141 %143 %144
+        %143 = OpLabel
+               OpBranch %142
+        %144 = OpLabel
+               OpBranch %134
+        %142 = OpLabel
+               OpStore %x_118_phi %int_0
+               OpBranch %145
+        %145 = OpLabel
+               OpLoopMerge %146 %147 None
+               OpBranch %148
+        %148 = OpLabel
+        %157 = OpLoad %int %x_118_phi
+        %158 = OpSLessThan %bool %157 %int_9
+               OpSelectionMerge %159 None
+               OpBranchConditional %158 %160 %161
+        %160 = OpLabel
+               OpBranch %159
+        %161 = OpLabel
+               OpBranch %146
+        %159 = OpLabel
+        %162 = OpIAdd %int %157 %139
+        %163 = OpISub %int %162 %int_1
+        %164 = OpIMul %int %int_2 %139
+        %165 = OpIAdd %int %157 %164
+        %168 = OpISub %int %165 %int_1
+        %166 = OpExtInst %int %167 SMin %168 %int_9
+               OpStore %x_130_phi %157
+               OpStore %x_133_phi %162
+               OpStore %x_135_phi %157
+               OpBranch %169
+        %169 = OpLabel
+               OpLoopMerge %170 %171 None
+               OpBranch %172
+        %172 = OpLabel
+        %177 = OpLoad %int %x_130_phi
+               OpStore %x_130 %177
+        %178 = OpLoad %int %x_133_phi
+        %179 = OpLoad %int %x_135_phi
+               OpStore %x_135 %179
+        %180 = OpLoad %int %x_135
+        %181 = OpSLessThanEqual %bool %180 %163
+               OpSelectionMerge %182 None
+               OpBranchConditional %181 %183 %182
+        %183 = OpLabel
+        %184 = OpSLessThanEqual %bool %178 %166
+               OpBranch %182
+        %182 = OpLabel
+        %185 = OpPhi %bool %181 %172 %184 %183
+               OpSelectionMerge %186 None
+               OpBranchConditional %185 %187 %188
+        %187 = OpLabel
+               OpBranch %186
+        %188 = OpLabel
+               OpBranch %170
+        %186 = OpLabel
+        %189 = OpLoad %int %x_135
+        %190 = OpAccessChain %_ptr_Function_int %data %189
+        %191 = OpLoad %int %190
+        %192 = OpAccessChain %_ptr_Function_int %data %178
+        %193 = OpLoad %int %192
+        %195 = OpLoad %int %x_130
+        %196 = OpCopyObject %int %int_1
+        %197 = OpIAdd %int %195 %196
+        %194 = OpCopyObject %int %197
+        %198 = OpSLessThan %bool %191 %193
+               OpSelectionMerge %199 None
+               OpBranchConditional %198 %200 %201
+        %200 = OpLabel
+        %203 = OpLoad %int %x_135
+        %204 = OpCopyObject %int %int_1
+        %205 = OpIAdd %int %203 %204
+        %202 = OpCopyObject %int %205
+               OpStore %x_150 %202
+        %206 = OpAccessChain %_ptr_Function_int %data %189
+        %207 = OpLoad %int %206
+        %208 = OpLoad %int %x_130
+        %209 = OpAccessChain %_ptr_Function_int %temp %208
+               OpStore %209 %207
+               OpStore %x_134_phi %178
+        %210 = OpLoad %int %x_150
+               OpStore %x_136_phi %210
+               OpBranch %199
+        %201 = OpLabel
+        %211 = OpIAdd %int %178 %int_1
+               OpStore %x_153 %211
+        %212 = OpAccessChain %_ptr_Function_int %data %178
+        %213 = OpLoad %int %212
+        %214 = OpLoad %int %x_130
+        %215 = OpAccessChain %_ptr_Function_int %temp %214
+               OpStore %215 %213
+        %216 = OpLoad %int %x_153
+               OpStore %x_134_phi %216
+        %217 = OpLoad %int %x_135
+               OpStore %x_136_phi %217
+               OpBranch %199
+        %199 = OpLabel
+        %218 = OpLoad %int %x_134_phi
+        %219 = OpLoad %int %x_136_phi
+               OpBranch %171
+        %171 = OpLabel
+               OpStore %x_130_phi %194
+               OpStore %x_133_phi %218
+               OpStore %x_135_phi %219
+               OpBranch %169
+        %170 = OpLabel
+        %220 = OpLoad %int %x_130
+               OpStore %x_157_phi %220
+        %221 = OpLoad %int %x_135
+               OpStore %x_160_phi %221
+               OpBranch %222
+        %222 = OpLabel
+               OpLoopMerge %223 %224 None
+               OpBranch %225
+        %225 = OpLabel
+        %228 = OpLoad %int %x_157_phi
+        %229 = OpLoad %int %x_160_phi
+        %230 = OpSLessThan %bool %229 %int_10
+               OpSelectionMerge %231 None
+               OpBranchConditional %230 %232 %231
+        %232 = OpLabel
+        %233 = OpSLessThanEqual %bool %229 %163
+               OpBranch %231
+        %231 = OpLabel
+        %234 = OpPhi %bool %230 %225 %233 %232
+               OpSelectionMerge %235 None
+               OpBranchConditional %234 %236 %237
+        %236 = OpLabel
+               OpBranch %235
+        %237 = OpLabel
+               OpBranch %223
+        %235 = OpLabel
+               OpBranch %224
+        %224 = OpLabel
+        %238 = OpIAdd %int %228 %int_1
+               OpStore %x_158 %238
+        %239 = OpIAdd %int %229 %int_1
+               OpStore %x_161 %239
+        %240 = OpAccessChain %_ptr_Function_int %data %229
+        %241 = OpLoad %int %240
+        %242 = OpAccessChain %_ptr_Function_int %temp %228
+               OpStore %242 %241
+        %243 = OpLoad %int %x_158
+               OpStore %x_157_phi %243
+        %244 = OpLoad %int %x_161
+               OpStore %x_160_phi %244
+               OpBranch %222
+        %223 = OpLabel
+               OpStore %x_170_phi %157
+               OpBranch %245
+        %245 = OpLabel
+               OpLoopMerge %246 %247 None
+               OpBranch %248
+        %248 = OpLabel
+        %250 = OpLoad %int %x_170_phi
+        %251 = OpSLessThanEqual %bool %250 %166
+               OpSelectionMerge %252 None
+               OpBranchConditional %251 %253 %254
+        %253 = OpLabel
+               OpBranch %252
+        %254 = OpLabel
+               OpBranch %246
+        %252 = OpLabel
+               OpBranch %247
+        %247 = OpLabel
+        %255 = OpAccessChain %_ptr_Function_int %temp %250
+        %256 = OpLoad %int %255
+        %257 = OpAccessChain %_ptr_Function_int %data %250
+               OpStore %257 %256
+        %258 = OpIAdd %int %250 %int_1
+               OpStore %x_171 %258
+        %259 = OpLoad %int %x_171
+               OpStore %x_170_phi %259
+               OpBranch %245
+        %246 = OpLabel
+               OpBranch %147
+        %147 = OpLabel
+               OpStore %x_118_phi %165
+               OpBranch %145
+        %146 = OpLabel
+               OpBranch %135
+        %135 = OpLabel
+        %260 = OpIMul %int %int_2 %139
+               OpStore %x_112 %260
+        %261 = OpLoad %int %x_112
+               OpStore %x_111_phi %261
+               OpBranch %133
+        %134 = OpLabel
+        %268 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %269 = OpLoad %float %268
+        %270 = OpConvertFToS %int %269
+               OpStore %x_180 %270
+        %271 = OpLoad %int %x_180
+        %273 = OpSLessThan %bool %271 %int_30
+               OpSelectionMerge %274 None
+               OpBranchConditional %273 %275 %276
+        %275 = OpLabel
+        %277 = OpAccessChain %_ptr_Function_int %data %int_0
+        %278 = OpLoad %int %277
+        %280 = OpConvertSToF %float %278
+        %282 = OpFMul %float %280 %float_0_100000001
+        %283 = OpFAdd %float %float_0_5 %282
+               OpStore %x_189 %283
+        %284 = OpLoad %float %x_189
+               OpStore %x_262_phi %284
+               OpBranch %274
+        %276 = OpLabel
+        %288 = OpLoad %int %x_180
+        %290 = OpSLessThan %bool %288 %int_60
+               OpSelectionMerge %291 None
+               OpBranchConditional %290 %292 %293
+        %292 = OpLabel
+        %294 = OpAccessChain %_ptr_Function_int %data %int_1
+        %295 = OpLoad %int %294
+        %296 = OpConvertSToF %float %295
+        %297 = OpFMul %float %296 %float_0_100000001
+        %298 = OpFAdd %float %float_0_5 %297
+               OpStore %x_198 %298
+        %299 = OpLoad %float %x_198
+               OpStore %x_261_phi %299
+               OpBranch %291
+        %293 = OpLabel
+        %303 = OpLoad %int %x_180
+        %305 = OpSLessThan %bool %303 %int_90
+               OpSelectionMerge %306 None
+               OpBranchConditional %305 %307 %308
+        %307 = OpLabel
+        %309 = OpAccessChain %_ptr_Function_int %data %int_2
+        %310 = OpLoad %int %309
+        %311 = OpConvertSToF %float %310
+        %312 = OpFMul %float %311 %float_0_100000001
+        %313 = OpFAdd %float %float_0_5 %312
+               OpStore %x_207 %313
+        %314 = OpLoad %float %x_207
+               OpStore %x_260_phi %314
+               OpBranch %306
+        %308 = OpLabel
+        %315 = OpLoad %int %x_180
+        %317 = OpSLessThan %bool %315 %int_120
+               OpSelectionMerge %318 None
+               OpBranchConditional %317 %319 %320
+        %319 = OpLabel
+        %321 = OpAccessChain %_ptr_Function_int %data %int_3
+        %322 = OpLoad %int %321
+        %323 = OpConvertSToF %float %322
+        %324 = OpFMul %float %323 %float_0_100000001
+        %325 = OpFAdd %float %float_0_5 %324
+               OpStore %x_216 %325
+        %326 = OpLoad %float %x_216
+               OpStore %x_259_phi %326
+               OpBranch %318
+        %320 = OpLabel
+        %330 = OpLoad %int %x_180
+        %332 = OpSLessThan %bool %330 %int_150
+               OpSelectionMerge %333 None
+               OpBranchConditional %332 %334 %335
+        %334 = OpLabel
+               OpKill
+        %335 = OpLabel
+        %339 = OpLoad %int %x_180
+        %341 = OpSLessThan %bool %339 %int_180
+               OpSelectionMerge %342 None
+               OpBranchConditional %341 %343 %344
+        %343 = OpLabel
+        %346 = OpAccessChain %_ptr_Function_int %data %int_5
+        %347 = OpLoad %int %346
+        %348 = OpConvertSToF %float %347
+        %349 = OpFMul %float %348 %float_0_100000001
+        %350 = OpFAdd %float %float_0_5 %349
+               OpStore %x_229 %350
+        %351 = OpLoad %float %x_229
+               OpStore %x_258_phi %351
+               OpBranch %342
+        %344 = OpLabel
+        %355 = OpLoad %int %x_180
+        %357 = OpSLessThan %bool %355 %int_210
+               OpSelectionMerge %358 None
+               OpBranchConditional %357 %359 %360
+        %359 = OpLabel
+        %362 = OpAccessChain %_ptr_Function_int %data %int_6
+        %363 = OpLoad %int %362
+        %364 = OpConvertSToF %float %363
+        %365 = OpFMul %float %364 %float_0_100000001
+        %366 = OpFAdd %float %float_0_5 %365
+               OpStore %x_238 %366
+        %367 = OpLoad %float %x_238
+               OpStore %x_257_phi %367
+               OpBranch %358
+        %360 = OpLabel
+        %368 = OpLoad %int %x_180
+        %370 = OpSLessThan %bool %368 %int_240
+               OpSelectionMerge %371 None
+               OpBranchConditional %370 %372 %373
+        %372 = OpLabel
+        %375 = OpAccessChain %_ptr_Function_int %data %int_7
+        %376 = OpLoad %int %375
+        %377 = OpConvertSToF %float %376
+        %378 = OpFMul %float %377 %float_0_100000001
+        %379 = OpFAdd %float %float_0_5 %378
+               OpStore %x_247 %379
+        %380 = OpLoad %float %x_247
+               OpStore %x_256_phi %380
+               OpBranch %371
+        %373 = OpLabel
+        %381 = OpLoad %int %x_180
+        %383 = OpSLessThan %bool %381 %int_270
+               OpSelectionMerge %384 None
+               OpBranchConditional %383 %385 %386
+        %385 = OpLabel
+               OpBranch %384
+        %386 = OpLabel
+               OpKill
+        %384 = OpLabel
+        %388 = OpAccessChain %_ptr_Function_int %data %int_8
+        %389 = OpLoad %int %388
+        %390 = OpConvertSToF %float %389
+        %391 = OpFMul %float %390 %float_0_100000001
+        %392 = OpFAdd %float %float_0_5 %391
+               OpStore %x_255 %392
+        %393 = OpLoad %float %x_255
+               OpStore %x_256_phi %393
+               OpBranch %371
+        %371 = OpLabel
+        %394 = OpLoad %float %x_256_phi
+               OpStore %x_256 %394
+        %395 = OpLoad %float %x_256
+               OpStore %x_257_phi %395
+               OpBranch %358
+        %358 = OpLabel
+        %396 = OpLoad %float %x_257_phi
+               OpStore %x_257 %396
+        %397 = OpLoad %float %x_257
+               OpStore %x_258_phi %397
+               OpBranch %342
+        %342 = OpLabel
+        %398 = OpLoad %float %x_258_phi
+               OpStore %x_258 %398
+               OpBranch %333
+        %333 = OpLabel
+        %399 = OpLoad %float %x_258
+               OpStore %x_259_phi %399
+               OpBranch %318
+        %318 = OpLabel
+        %400 = OpLoad %float %x_259_phi
+               OpStore %x_259 %400
+        %401 = OpLoad %float %x_259
+               OpStore %x_260_phi %401
+               OpBranch %306
+        %306 = OpLabel
+        %402 = OpLoad %float %x_260_phi
+               OpStore %x_260 %402
+        %403 = OpLoad %float %x_260
+               OpStore %x_261_phi %403
+               OpBranch %291
+        %291 = OpLabel
+        %404 = OpLoad %float %x_261_phi
+               OpStore %x_261 %404
+        %405 = OpLoad %float %x_261
+               OpStore %x_262_phi %405
+               OpBranch %274
+        %274 = OpLabel
+        %406 = OpLoad %float %x_262_phi
+        %408 = OpCompositeConstruct %v4float %406 %406 %406 %float_1
+               OpStore %x_GLF_color %408
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %409
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %413 = OpLabel
+        %414 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %414
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %416 = OpLabel
+        %417 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %417
+        %418 = OpFunctionCall %void %main_1
+        %420 = OpLoad %v4float %x_GLF_color
+        %421 = OpCompositeConstruct %main_out %420
+        %419 = OpFunctionCall %void %tint_symbol_3 %421
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 44[%44] is not post dominated by the back-edge block 115[%115]
+  %115 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/2.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/2.spvasm.expected.wgsl
new file mode 100644
index 0000000..0d0b64b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/2.spvasm.expected.wgsl
@@ -0,0 +1,338 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var temp : array<i32, 10>;
+  var data : array<i32, 10>;
+  var x_189 : f32;
+  var x_261 : f32;
+  var x_63_phi : i32;
+  var x_102_phi : i32;
+  var x_111_phi : i32;
+  var x_262_phi : f32;
+  let x_60 : f32 = x_8.injectionSwitch.x;
+  let x_61 : i32 = i32(x_60);
+  x_63_phi = x_61;
+  loop {
+    var x_99 : i32;
+    var x_97 : i32;
+    var x_95 : i32;
+    var x_93 : i32;
+    var x_91 : i32;
+    var x_89 : i32;
+    var x_87 : i32;
+    var x_85 : i32;
+    var x_83 : i32;
+    var x_81 : i32;
+    var x_64_phi : i32;
+    let x_63 : i32 = x_63_phi;
+    let x_68 : i32 = (x_63 + 1);
+    x_64_phi = x_68;
+    switch(x_63) {
+      case 9: {
+        data[x_63] = -5;
+        x_99 = (x_63 + 1);
+        x_64_phi = x_99;
+      }
+      case 8: {
+        data[x_63] = -4;
+        x_97 = (x_63 + 1);
+        x_64_phi = x_97;
+      }
+      case 7: {
+        data[x_63] = -3;
+        x_95 = (x_63 + 1);
+        x_64_phi = x_95;
+      }
+      case 6: {
+        data[x_63] = -2;
+        x_93 = (x_63 + 1);
+        x_64_phi = x_93;
+      }
+      case 5: {
+        data[x_63] = -1;
+        x_91 = (x_63 + 1);
+        x_64_phi = x_91;
+      }
+      case 4: {
+        data[x_63] = 0;
+        x_89 = (x_63 + 1);
+        x_64_phi = x_89;
+      }
+      case 3: {
+        data[x_63] = 1;
+        x_87 = (x_63 + 1);
+        x_64_phi = x_87;
+      }
+      case 2: {
+        data[x_63] = 2;
+        x_85 = (x_63 + 1);
+        x_64_phi = x_85;
+      }
+      case 1: {
+        data[x_63] = 3;
+        x_83 = (x_63 + 1);
+        x_64_phi = x_83;
+      }
+      case 0: {
+        data[x_63] = 4;
+        x_81 = (x_63 + 1);
+        x_64_phi = x_81;
+      }
+      default: {
+      }
+    }
+    let x_64 : i32 = x_64_phi;
+
+    continuing {
+      x_63_phi = x_64;
+      if ((x_64 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_102_phi = 0;
+  loop {
+    var x_103 : i32;
+    let x_102 : i32 = x_102_phi;
+    if ((x_102 < 10)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_108 : i32 = data[x_102];
+      temp[x_102] = x_108;
+      x_103 = (x_102 + 1);
+      x_102_phi = x_103;
+    }
+  }
+  x_111_phi = 1;
+  loop {
+    var x_112 : i32;
+    var x_118_phi : i32;
+    let x_111 : i32 = x_111_phi;
+    if ((x_111 <= 9)) {
+    } else {
+      break;
+    }
+    x_118_phi = 0;
+    loop {
+      var x_130 : i32;
+      var x_135 : i32;
+      var x_130_phi : i32;
+      var x_133_phi : i32;
+      var x_135_phi : i32;
+      var x_157_phi : i32;
+      var x_160_phi : i32;
+      var x_170_phi : i32;
+      let x_118 : i32 = x_118_phi;
+      if ((x_118 < 9)) {
+      } else {
+        break;
+      }
+      let x_124 : i32 = (x_118 + x_111);
+      let x_125 : i32 = (x_124 - 1);
+      let x_119 : i32 = (x_118 + (2 * x_111));
+      let x_128 : i32 = min((x_119 - 1), 9);
+      x_130_phi = x_118;
+      x_133_phi = x_124;
+      x_135_phi = x_118;
+      loop {
+        var x_150 : i32;
+        var x_153 : i32;
+        var x_134_phi : i32;
+        var x_136_phi : i32;
+        x_130 = x_130_phi;
+        let x_133 : i32 = x_133_phi;
+        x_135 = x_135_phi;
+        if (((x_135 <= x_125) && (x_133 <= x_128))) {
+        } else {
+          break;
+        }
+        let x_142 : ptr<function, i32> = &(data[x_135]);
+        let x_143 : i32 = *(x_142);
+        let x_144 : ptr<function, i32> = &(data[x_133]);
+        let x_145 : i32 = *(x_144);
+        let x_131 : i32 = bitcast<i32>((x_130 + bitcast<i32>(1)));
+        if ((x_143 < x_145)) {
+          x_150 = bitcast<i32>((x_135 + bitcast<i32>(1)));
+          let x_151 : i32 = *(x_142);
+          temp[x_130] = x_151;
+          x_134_phi = x_133;
+          x_136_phi = x_150;
+        } else {
+          x_153 = (x_133 + 1);
+          let x_154 : i32 = *(x_144);
+          temp[x_130] = x_154;
+          x_134_phi = x_153;
+          x_136_phi = x_135;
+        }
+        let x_134 : i32 = x_134_phi;
+        let x_136 : i32 = x_136_phi;
+
+        continuing {
+          x_130_phi = x_131;
+          x_133_phi = x_134;
+          x_135_phi = x_136;
+        }
+      }
+      x_157_phi = x_130;
+      x_160_phi = x_135;
+      loop {
+        var x_158 : i32;
+        var x_161 : i32;
+        let x_157 : i32 = x_157_phi;
+        let x_160 : i32 = x_160_phi;
+        if (((x_160 < 10) && (x_160 <= x_125))) {
+        } else {
+          break;
+        }
+
+        continuing {
+          x_158 = (x_157 + 1);
+          x_161 = (x_160 + 1);
+          let x_167 : i32 = data[x_160];
+          temp[x_157] = x_167;
+          x_157_phi = x_158;
+          x_160_phi = x_161;
+        }
+      }
+      x_170_phi = x_118;
+      loop {
+        var x_171 : i32;
+        let x_170 : i32 = x_170_phi;
+        if ((x_170 <= x_128)) {
+        } else {
+          break;
+        }
+
+        continuing {
+          let x_176 : i32 = temp[x_170];
+          data[x_170] = x_176;
+          x_171 = (x_170 + 1);
+          x_170_phi = x_171;
+        }
+      }
+
+      continuing {
+        x_118_phi = x_119;
+      }
+    }
+
+    continuing {
+      x_112 = (2 * x_111);
+      x_111_phi = x_112;
+    }
+  }
+  var x_180 : i32;
+  var x_198 : f32;
+  var x_260 : f32;
+  var x_261_phi : f32;
+  let x_179 : f32 = gl_FragCoord.y;
+  x_180 = i32(x_179);
+  if ((x_180 < 30)) {
+    let x_186 : i32 = data[0];
+    x_189 = (0.5 + (f32(x_186) * 0.100000001));
+    x_262_phi = x_189;
+  } else {
+    var x_207 : f32;
+    var x_259 : f32;
+    var x_260_phi : f32;
+    if ((x_180 < 60)) {
+      let x_195 : i32 = data[1];
+      x_198 = (0.5 + (f32(x_195) * 0.100000001));
+      x_261_phi = x_198;
+    } else {
+      var x_216 : f32;
+      var x_258 : f32;
+      var x_259_phi : f32;
+      if ((x_180 < 90)) {
+        let x_204 : i32 = data[2];
+        x_207 = (0.5 + (f32(x_204) * 0.100000001));
+        x_260_phi = x_207;
+      } else {
+        if ((x_180 < 120)) {
+          let x_213 : i32 = data[3];
+          x_216 = (0.5 + (f32(x_213) * 0.100000001));
+          x_259_phi = x_216;
+        } else {
+          var x_229 : f32;
+          var x_257 : f32;
+          var x_258_phi : f32;
+          if ((x_180 < 150)) {
+            discard;
+          } else {
+            var x_238 : f32;
+            var x_256 : f32;
+            var x_257_phi : f32;
+            if ((x_180 < 180)) {
+              let x_226 : i32 = data[5];
+              x_229 = (0.5 + (f32(x_226) * 0.100000001));
+              x_258_phi = x_229;
+            } else {
+              var x_247 : f32;
+              var x_255 : f32;
+              var x_256_phi : f32;
+              if ((x_180 < 210)) {
+                let x_235 : i32 = data[6];
+                x_238 = (0.5 + (f32(x_235) * 0.100000001));
+                x_257_phi = x_238;
+              } else {
+                if ((x_180 < 240)) {
+                  let x_244 : i32 = data[7];
+                  x_247 = (0.5 + (f32(x_244) * 0.100000001));
+                  x_256_phi = x_247;
+                } else {
+                  if ((x_180 < 270)) {
+                  } else {
+                    discard;
+                  }
+                  let x_252 : i32 = data[8];
+                  x_255 = (0.5 + (f32(x_252) * 0.100000001));
+                  x_256_phi = x_255;
+                }
+                x_256 = x_256_phi;
+                x_257_phi = x_256;
+              }
+              x_257 = x_257_phi;
+              x_258_phi = x_257;
+            }
+            x_258 = x_258_phi;
+          }
+          x_259_phi = x_258;
+        }
+        x_259 = x_259_phi;
+        x_260_phi = x_259;
+      }
+      x_260 = x_260_phi;
+      x_261_phi = x_260;
+    }
+    x_261 = x_261_phi;
+    x_262_phi = x_261;
+  }
+  let x_262 : f32 = x_262_phi;
+  x_GLF_color = vec4<f32>(x_262, x_262, x_262, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/2.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/2.wgsl
new file mode 100644
index 0000000..0d0b64b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/2.wgsl
@@ -0,0 +1,338 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var temp : array<i32, 10>;
+  var data : array<i32, 10>;
+  var x_189 : f32;
+  var x_261 : f32;
+  var x_63_phi : i32;
+  var x_102_phi : i32;
+  var x_111_phi : i32;
+  var x_262_phi : f32;
+  let x_60 : f32 = x_8.injectionSwitch.x;
+  let x_61 : i32 = i32(x_60);
+  x_63_phi = x_61;
+  loop {
+    var x_99 : i32;
+    var x_97 : i32;
+    var x_95 : i32;
+    var x_93 : i32;
+    var x_91 : i32;
+    var x_89 : i32;
+    var x_87 : i32;
+    var x_85 : i32;
+    var x_83 : i32;
+    var x_81 : i32;
+    var x_64_phi : i32;
+    let x_63 : i32 = x_63_phi;
+    let x_68 : i32 = (x_63 + 1);
+    x_64_phi = x_68;
+    switch(x_63) {
+      case 9: {
+        data[x_63] = -5;
+        x_99 = (x_63 + 1);
+        x_64_phi = x_99;
+      }
+      case 8: {
+        data[x_63] = -4;
+        x_97 = (x_63 + 1);
+        x_64_phi = x_97;
+      }
+      case 7: {
+        data[x_63] = -3;
+        x_95 = (x_63 + 1);
+        x_64_phi = x_95;
+      }
+      case 6: {
+        data[x_63] = -2;
+        x_93 = (x_63 + 1);
+        x_64_phi = x_93;
+      }
+      case 5: {
+        data[x_63] = -1;
+        x_91 = (x_63 + 1);
+        x_64_phi = x_91;
+      }
+      case 4: {
+        data[x_63] = 0;
+        x_89 = (x_63 + 1);
+        x_64_phi = x_89;
+      }
+      case 3: {
+        data[x_63] = 1;
+        x_87 = (x_63 + 1);
+        x_64_phi = x_87;
+      }
+      case 2: {
+        data[x_63] = 2;
+        x_85 = (x_63 + 1);
+        x_64_phi = x_85;
+      }
+      case 1: {
+        data[x_63] = 3;
+        x_83 = (x_63 + 1);
+        x_64_phi = x_83;
+      }
+      case 0: {
+        data[x_63] = 4;
+        x_81 = (x_63 + 1);
+        x_64_phi = x_81;
+      }
+      default: {
+      }
+    }
+    let x_64 : i32 = x_64_phi;
+
+    continuing {
+      x_63_phi = x_64;
+      if ((x_64 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_102_phi = 0;
+  loop {
+    var x_103 : i32;
+    let x_102 : i32 = x_102_phi;
+    if ((x_102 < 10)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_108 : i32 = data[x_102];
+      temp[x_102] = x_108;
+      x_103 = (x_102 + 1);
+      x_102_phi = x_103;
+    }
+  }
+  x_111_phi = 1;
+  loop {
+    var x_112 : i32;
+    var x_118_phi : i32;
+    let x_111 : i32 = x_111_phi;
+    if ((x_111 <= 9)) {
+    } else {
+      break;
+    }
+    x_118_phi = 0;
+    loop {
+      var x_130 : i32;
+      var x_135 : i32;
+      var x_130_phi : i32;
+      var x_133_phi : i32;
+      var x_135_phi : i32;
+      var x_157_phi : i32;
+      var x_160_phi : i32;
+      var x_170_phi : i32;
+      let x_118 : i32 = x_118_phi;
+      if ((x_118 < 9)) {
+      } else {
+        break;
+      }
+      let x_124 : i32 = (x_118 + x_111);
+      let x_125 : i32 = (x_124 - 1);
+      let x_119 : i32 = (x_118 + (2 * x_111));
+      let x_128 : i32 = min((x_119 - 1), 9);
+      x_130_phi = x_118;
+      x_133_phi = x_124;
+      x_135_phi = x_118;
+      loop {
+        var x_150 : i32;
+        var x_153 : i32;
+        var x_134_phi : i32;
+        var x_136_phi : i32;
+        x_130 = x_130_phi;
+        let x_133 : i32 = x_133_phi;
+        x_135 = x_135_phi;
+        if (((x_135 <= x_125) && (x_133 <= x_128))) {
+        } else {
+          break;
+        }
+        let x_142 : ptr<function, i32> = &(data[x_135]);
+        let x_143 : i32 = *(x_142);
+        let x_144 : ptr<function, i32> = &(data[x_133]);
+        let x_145 : i32 = *(x_144);
+        let x_131 : i32 = bitcast<i32>((x_130 + bitcast<i32>(1)));
+        if ((x_143 < x_145)) {
+          x_150 = bitcast<i32>((x_135 + bitcast<i32>(1)));
+          let x_151 : i32 = *(x_142);
+          temp[x_130] = x_151;
+          x_134_phi = x_133;
+          x_136_phi = x_150;
+        } else {
+          x_153 = (x_133 + 1);
+          let x_154 : i32 = *(x_144);
+          temp[x_130] = x_154;
+          x_134_phi = x_153;
+          x_136_phi = x_135;
+        }
+        let x_134 : i32 = x_134_phi;
+        let x_136 : i32 = x_136_phi;
+
+        continuing {
+          x_130_phi = x_131;
+          x_133_phi = x_134;
+          x_135_phi = x_136;
+        }
+      }
+      x_157_phi = x_130;
+      x_160_phi = x_135;
+      loop {
+        var x_158 : i32;
+        var x_161 : i32;
+        let x_157 : i32 = x_157_phi;
+        let x_160 : i32 = x_160_phi;
+        if (((x_160 < 10) && (x_160 <= x_125))) {
+        } else {
+          break;
+        }
+
+        continuing {
+          x_158 = (x_157 + 1);
+          x_161 = (x_160 + 1);
+          let x_167 : i32 = data[x_160];
+          temp[x_157] = x_167;
+          x_157_phi = x_158;
+          x_160_phi = x_161;
+        }
+      }
+      x_170_phi = x_118;
+      loop {
+        var x_171 : i32;
+        let x_170 : i32 = x_170_phi;
+        if ((x_170 <= x_128)) {
+        } else {
+          break;
+        }
+
+        continuing {
+          let x_176 : i32 = temp[x_170];
+          data[x_170] = x_176;
+          x_171 = (x_170 + 1);
+          x_170_phi = x_171;
+        }
+      }
+
+      continuing {
+        x_118_phi = x_119;
+      }
+    }
+
+    continuing {
+      x_112 = (2 * x_111);
+      x_111_phi = x_112;
+    }
+  }
+  var x_180 : i32;
+  var x_198 : f32;
+  var x_260 : f32;
+  var x_261_phi : f32;
+  let x_179 : f32 = gl_FragCoord.y;
+  x_180 = i32(x_179);
+  if ((x_180 < 30)) {
+    let x_186 : i32 = data[0];
+    x_189 = (0.5 + (f32(x_186) * 0.100000001));
+    x_262_phi = x_189;
+  } else {
+    var x_207 : f32;
+    var x_259 : f32;
+    var x_260_phi : f32;
+    if ((x_180 < 60)) {
+      let x_195 : i32 = data[1];
+      x_198 = (0.5 + (f32(x_195) * 0.100000001));
+      x_261_phi = x_198;
+    } else {
+      var x_216 : f32;
+      var x_258 : f32;
+      var x_259_phi : f32;
+      if ((x_180 < 90)) {
+        let x_204 : i32 = data[2];
+        x_207 = (0.5 + (f32(x_204) * 0.100000001));
+        x_260_phi = x_207;
+      } else {
+        if ((x_180 < 120)) {
+          let x_213 : i32 = data[3];
+          x_216 = (0.5 + (f32(x_213) * 0.100000001));
+          x_259_phi = x_216;
+        } else {
+          var x_229 : f32;
+          var x_257 : f32;
+          var x_258_phi : f32;
+          if ((x_180 < 150)) {
+            discard;
+          } else {
+            var x_238 : f32;
+            var x_256 : f32;
+            var x_257_phi : f32;
+            if ((x_180 < 180)) {
+              let x_226 : i32 = data[5];
+              x_229 = (0.5 + (f32(x_226) * 0.100000001));
+              x_258_phi = x_229;
+            } else {
+              var x_247 : f32;
+              var x_255 : f32;
+              var x_256_phi : f32;
+              if ((x_180 < 210)) {
+                let x_235 : i32 = data[6];
+                x_238 = (0.5 + (f32(x_235) * 0.100000001));
+                x_257_phi = x_238;
+              } else {
+                if ((x_180 < 240)) {
+                  let x_244 : i32 = data[7];
+                  x_247 = (0.5 + (f32(x_244) * 0.100000001));
+                  x_256_phi = x_247;
+                } else {
+                  if ((x_180 < 270)) {
+                  } else {
+                    discard;
+                  }
+                  let x_252 : i32 = data[8];
+                  x_255 = (0.5 + (f32(x_252) * 0.100000001));
+                  x_256_phi = x_255;
+                }
+                x_256 = x_256_phi;
+                x_257_phi = x_256;
+              }
+              x_257 = x_257_phi;
+              x_258_phi = x_257;
+            }
+            x_258 = x_258_phi;
+          }
+          x_259_phi = x_258;
+        }
+        x_259 = x_259_phi;
+        x_260_phi = x_259;
+      }
+      x_260 = x_260_phi;
+      x_261_phi = x_260;
+    }
+    x_261 = x_261_phi;
+    x_262_phi = x_261;
+  }
+  let x_262 : f32 = x_262_phi;
+  x_GLF_color = vec4<f32>(x_262, x_262, x_262, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/2.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/2.wgsl.expected.hlsl
new file mode 100644
index 0000000..3b86173
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/2.wgsl.expected.hlsl
@@ -0,0 +1,352 @@
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int temp[10] = (int[10])0;
+  int data[10] = (int[10])0;
+  float x_189 = 0.0f;
+  float x_261 = 0.0f;
+  int x_63_phi = 0;
+  int x_102_phi = 0;
+  int x_111_phi = 0;
+  float x_262_phi = 0.0f;
+  const float x_60 = asfloat(x_8[0].x);
+  const int x_61 = int(x_60);
+  x_63_phi = x_61;
+  while (true) {
+    int x_99 = 0;
+    int x_97 = 0;
+    int x_95 = 0;
+    int x_93 = 0;
+    int x_91 = 0;
+    int x_89 = 0;
+    int x_87 = 0;
+    int x_85 = 0;
+    int x_83 = 0;
+    int x_81 = 0;
+    int x_64_phi = 0;
+    const int x_63 = x_63_phi;
+    const int x_68 = (x_63 + 1);
+    x_64_phi = x_68;
+    switch(x_63) {
+      case 9: {
+        data[x_63] = -5;
+        x_99 = (x_63 + 1);
+        x_64_phi = x_99;
+        break;
+      }
+      case 8: {
+        data[x_63] = -4;
+        x_97 = (x_63 + 1);
+        x_64_phi = x_97;
+        break;
+      }
+      case 7: {
+        data[x_63] = -3;
+        x_95 = (x_63 + 1);
+        x_64_phi = x_95;
+        break;
+      }
+      case 6: {
+        data[x_63] = -2;
+        x_93 = (x_63 + 1);
+        x_64_phi = x_93;
+        break;
+      }
+      case 5: {
+        data[x_63] = -1;
+        x_91 = (x_63 + 1);
+        x_64_phi = x_91;
+        break;
+      }
+      case 4: {
+        data[x_63] = 0;
+        x_89 = (x_63 + 1);
+        x_64_phi = x_89;
+        break;
+      }
+      case 3: {
+        data[x_63] = 1;
+        x_87 = (x_63 + 1);
+        x_64_phi = x_87;
+        break;
+      }
+      case 2: {
+        data[x_63] = 2;
+        x_85 = (x_63 + 1);
+        x_64_phi = x_85;
+        break;
+      }
+      case 1: {
+        data[x_63] = 3;
+        x_83 = (x_63 + 1);
+        x_64_phi = x_83;
+        break;
+      }
+      case 0: {
+        data[x_63] = 4;
+        x_81 = (x_63 + 1);
+        x_64_phi = x_81;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    const int x_64 = x_64_phi;
+    {
+      x_63_phi = x_64;
+      if ((x_64 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_102_phi = 0;
+  while (true) {
+    int x_103 = 0;
+    const int x_102 = x_102_phi;
+    if ((x_102 < 10)) {
+    } else {
+      break;
+    }
+    {
+      const int x_108 = data[x_102];
+      temp[x_102] = x_108;
+      x_103 = (x_102 + 1);
+      x_102_phi = x_103;
+    }
+  }
+  x_111_phi = 1;
+  while (true) {
+    int x_112 = 0;
+    int x_118_phi = 0;
+    const int x_111 = x_111_phi;
+    if ((x_111 <= 9)) {
+    } else {
+      break;
+    }
+    x_118_phi = 0;
+    while (true) {
+      int x_130 = 0;
+      int x_135 = 0;
+      int x_130_phi = 0;
+      int x_133_phi = 0;
+      int x_135_phi = 0;
+      int x_157_phi = 0;
+      int x_160_phi = 0;
+      int x_170_phi = 0;
+      const int x_118 = x_118_phi;
+      if ((x_118 < 9)) {
+      } else {
+        break;
+      }
+      const int x_124 = (x_118 + x_111);
+      const int x_125 = (x_124 - 1);
+      const int x_119 = (x_118 + (2 * x_111));
+      const int x_128 = min((x_119 - 1), 9);
+      x_130_phi = x_118;
+      x_133_phi = x_124;
+      x_135_phi = x_118;
+      while (true) {
+        int x_150 = 0;
+        int x_153 = 0;
+        int x_134_phi = 0;
+        int x_136_phi = 0;
+        x_130 = x_130_phi;
+        const int x_133 = x_133_phi;
+        x_135 = x_135_phi;
+        bool tint_tmp = (x_135 <= x_125);
+        if (tint_tmp) {
+          tint_tmp = (x_133 <= x_128);
+        }
+        if ((tint_tmp)) {
+        } else {
+          break;
+        }
+        const int x_142_save = x_135;
+        const int x_143 = data[x_142_save];
+        const int x_144_save = x_133;
+        const int x_145 = data[x_144_save];
+        const int x_131 = asint((x_130 + asint(1)));
+        if ((x_143 < x_145)) {
+          x_150 = asint((x_135 + asint(1)));
+          const int x_151 = data[x_142_save];
+          temp[x_130] = x_151;
+          x_134_phi = x_133;
+          x_136_phi = x_150;
+        } else {
+          x_153 = (x_133 + 1);
+          const int x_154 = data[x_144_save];
+          temp[x_130] = x_154;
+          x_134_phi = x_153;
+          x_136_phi = x_135;
+        }
+        const int x_134 = x_134_phi;
+        const int x_136 = x_136_phi;
+        {
+          x_130_phi = x_131;
+          x_133_phi = x_134;
+          x_135_phi = x_136;
+        }
+      }
+      x_157_phi = x_130;
+      x_160_phi = x_135;
+      while (true) {
+        int x_158 = 0;
+        int x_161 = 0;
+        const int x_157 = x_157_phi;
+        const int x_160 = x_160_phi;
+        bool tint_tmp_1 = (x_160 < 10);
+        if (tint_tmp_1) {
+          tint_tmp_1 = (x_160 <= x_125);
+        }
+        if ((tint_tmp_1)) {
+        } else {
+          break;
+        }
+        {
+          x_158 = (x_157 + 1);
+          x_161 = (x_160 + 1);
+          const int x_167 = data[x_160];
+          temp[x_157] = x_167;
+          x_157_phi = x_158;
+          x_160_phi = x_161;
+        }
+      }
+      x_170_phi = x_118;
+      while (true) {
+        int x_171 = 0;
+        const int x_170 = x_170_phi;
+        if ((x_170 <= x_128)) {
+        } else {
+          break;
+        }
+        {
+          const int x_176 = temp[x_170];
+          data[x_170] = x_176;
+          x_171 = (x_170 + 1);
+          x_170_phi = x_171;
+        }
+      }
+      {
+        x_118_phi = x_119;
+      }
+    }
+    {
+      x_112 = (2 * x_111);
+      x_111_phi = x_112;
+    }
+  }
+  int x_180 = 0;
+  float x_198 = 0.0f;
+  float x_260 = 0.0f;
+  float x_261_phi = 0.0f;
+  const float x_179 = gl_FragCoord.y;
+  x_180 = int(x_179);
+  if ((x_180 < 30)) {
+    const int x_186 = data[0];
+    x_189 = (0.5f + (float(x_186) * 0.100000001f));
+    x_262_phi = x_189;
+  } else {
+    float x_207 = 0.0f;
+    float x_259 = 0.0f;
+    float x_260_phi = 0.0f;
+    if ((x_180 < 60)) {
+      const int x_195 = data[1];
+      x_198 = (0.5f + (float(x_195) * 0.100000001f));
+      x_261_phi = x_198;
+    } else {
+      float x_216 = 0.0f;
+      float x_258 = 0.0f;
+      float x_259_phi = 0.0f;
+      if ((x_180 < 90)) {
+        const int x_204 = data[2];
+        x_207 = (0.5f + (float(x_204) * 0.100000001f));
+        x_260_phi = x_207;
+      } else {
+        if ((x_180 < 120)) {
+          const int x_213 = data[3];
+          x_216 = (0.5f + (float(x_213) * 0.100000001f));
+          x_259_phi = x_216;
+        } else {
+          float x_229 = 0.0f;
+          float x_257 = 0.0f;
+          float x_258_phi = 0.0f;
+          if ((x_180 < 150)) {
+            discard;
+          } else {
+            float x_238 = 0.0f;
+            float x_256 = 0.0f;
+            float x_257_phi = 0.0f;
+            if ((x_180 < 180)) {
+              const int x_226 = data[5];
+              x_229 = (0.5f + (float(x_226) * 0.100000001f));
+              x_258_phi = x_229;
+            } else {
+              float x_247 = 0.0f;
+              float x_255 = 0.0f;
+              float x_256_phi = 0.0f;
+              if ((x_180 < 210)) {
+                const int x_235 = data[6];
+                x_238 = (0.5f + (float(x_235) * 0.100000001f));
+                x_257_phi = x_238;
+              } else {
+                if ((x_180 < 240)) {
+                  const int x_244 = data[7];
+                  x_247 = (0.5f + (float(x_244) * 0.100000001f));
+                  x_256_phi = x_247;
+                } else {
+                  if ((x_180 < 270)) {
+                  } else {
+                    discard;
+                  }
+                  const int x_252 = data[8];
+                  x_255 = (0.5f + (float(x_252) * 0.100000001f));
+                  x_256_phi = x_255;
+                }
+                x_256 = x_256_phi;
+                x_257_phi = x_256;
+              }
+              x_257 = x_257_phi;
+              x_258_phi = x_257;
+            }
+            x_258 = x_258_phi;
+          }
+          x_259_phi = x_258;
+        }
+        x_259 = x_259_phi;
+        x_260_phi = x_259;
+      }
+      x_260 = x_260_phi;
+      x_261_phi = x_260;
+    }
+    x_261 = x_261_phi;
+    x_262_phi = x_261;
+  }
+  const float x_262 = x_262_phi;
+  x_GLF_color = float4(x_262, x_262, x_262, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/2.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/2.wgsl.expected.msl
new file mode 100644
index 0000000..64e598b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/2.wgsl.expected.msl
@@ -0,0 +1,346 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  tint_array_wrapper temp = {};
+  tint_array_wrapper data = {};
+  float x_189 = 0.0f;
+  float x_261 = 0.0f;
+  int x_63_phi = 0;
+  int x_102_phi = 0;
+  int x_111_phi = 0;
+  float x_262_phi = 0.0f;
+  float const x_60 = x_8.injectionSwitch.x;
+  int const x_61 = int(x_60);
+  x_63_phi = x_61;
+  while (true) {
+    int x_99 = 0;
+    int x_97 = 0;
+    int x_95 = 0;
+    int x_93 = 0;
+    int x_91 = 0;
+    int x_89 = 0;
+    int x_87 = 0;
+    int x_85 = 0;
+    int x_83 = 0;
+    int x_81 = 0;
+    int x_64_phi = 0;
+    int const x_63 = x_63_phi;
+    int const x_68 = (x_63 + 1);
+    x_64_phi = x_68;
+    switch(x_63) {
+      case 9: {
+        data.arr[x_63] = -5;
+        x_99 = (x_63 + 1);
+        x_64_phi = x_99;
+        break;
+      }
+      case 8: {
+        data.arr[x_63] = -4;
+        x_97 = (x_63 + 1);
+        x_64_phi = x_97;
+        break;
+      }
+      case 7: {
+        data.arr[x_63] = -3;
+        x_95 = (x_63 + 1);
+        x_64_phi = x_95;
+        break;
+      }
+      case 6: {
+        data.arr[x_63] = -2;
+        x_93 = (x_63 + 1);
+        x_64_phi = x_93;
+        break;
+      }
+      case 5: {
+        data.arr[x_63] = -1;
+        x_91 = (x_63 + 1);
+        x_64_phi = x_91;
+        break;
+      }
+      case 4: {
+        data.arr[x_63] = 0;
+        x_89 = (x_63 + 1);
+        x_64_phi = x_89;
+        break;
+      }
+      case 3: {
+        data.arr[x_63] = 1;
+        x_87 = (x_63 + 1);
+        x_64_phi = x_87;
+        break;
+      }
+      case 2: {
+        data.arr[x_63] = 2;
+        x_85 = (x_63 + 1);
+        x_64_phi = x_85;
+        break;
+      }
+      case 1: {
+        data.arr[x_63] = 3;
+        x_83 = (x_63 + 1);
+        x_64_phi = x_83;
+        break;
+      }
+      case 0: {
+        data.arr[x_63] = 4;
+        x_81 = (x_63 + 1);
+        x_64_phi = x_81;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    int const x_64 = x_64_phi;
+    {
+      x_63_phi = x_64;
+      if ((x_64 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_102_phi = 0;
+  while (true) {
+    int x_103 = 0;
+    int const x_102 = x_102_phi;
+    if ((x_102 < 10)) {
+    } else {
+      break;
+    }
+    {
+      int const x_108 = data.arr[x_102];
+      temp.arr[x_102] = x_108;
+      x_103 = (x_102 + 1);
+      x_102_phi = x_103;
+    }
+  }
+  x_111_phi = 1;
+  while (true) {
+    int x_112 = 0;
+    int x_118_phi = 0;
+    int const x_111 = x_111_phi;
+    if ((x_111 <= 9)) {
+    } else {
+      break;
+    }
+    x_118_phi = 0;
+    while (true) {
+      int x_130 = 0;
+      int x_135 = 0;
+      int x_130_phi = 0;
+      int x_133_phi = 0;
+      int x_135_phi = 0;
+      int x_157_phi = 0;
+      int x_160_phi = 0;
+      int x_170_phi = 0;
+      int const x_118 = x_118_phi;
+      if ((x_118 < 9)) {
+      } else {
+        break;
+      }
+      int const x_124 = (x_118 + x_111);
+      int const x_125 = (x_124 - 1);
+      int const x_119 = (x_118 + (2 * x_111));
+      int const x_128 = min((x_119 - 1), 9);
+      x_130_phi = x_118;
+      x_133_phi = x_124;
+      x_135_phi = x_118;
+      while (true) {
+        int x_150 = 0;
+        int x_153 = 0;
+        int x_134_phi = 0;
+        int x_136_phi = 0;
+        x_130 = x_130_phi;
+        int const x_133 = x_133_phi;
+        x_135 = x_135_phi;
+        if (((x_135 <= x_125) && (x_133 <= x_128))) {
+        } else {
+          break;
+        }
+        int const x_142_save = x_135;
+        int const x_143 = data.arr[x_142_save];
+        int const x_144_save = x_133;
+        int const x_145 = data.arr[x_144_save];
+        int const x_131 = as_type<int>((x_130 + as_type<int>(1)));
+        if ((x_143 < x_145)) {
+          x_150 = as_type<int>((x_135 + as_type<int>(1)));
+          int const x_151 = data.arr[x_142_save];
+          temp.arr[x_130] = x_151;
+          x_134_phi = x_133;
+          x_136_phi = x_150;
+        } else {
+          x_153 = (x_133 + 1);
+          int const x_154 = data.arr[x_144_save];
+          temp.arr[x_130] = x_154;
+          x_134_phi = x_153;
+          x_136_phi = x_135;
+        }
+        int const x_134 = x_134_phi;
+        int const x_136 = x_136_phi;
+        {
+          x_130_phi = x_131;
+          x_133_phi = x_134;
+          x_135_phi = x_136;
+        }
+      }
+      x_157_phi = x_130;
+      x_160_phi = x_135;
+      while (true) {
+        int x_158 = 0;
+        int x_161 = 0;
+        int const x_157 = x_157_phi;
+        int const x_160 = x_160_phi;
+        if (((x_160 < 10) && (x_160 <= x_125))) {
+        } else {
+          break;
+        }
+        {
+          x_158 = (x_157 + 1);
+          x_161 = (x_160 + 1);
+          int const x_167 = data.arr[x_160];
+          temp.arr[x_157] = x_167;
+          x_157_phi = x_158;
+          x_160_phi = x_161;
+        }
+      }
+      x_170_phi = x_118;
+      while (true) {
+        int x_171 = 0;
+        int const x_170 = x_170_phi;
+        if ((x_170 <= x_128)) {
+        } else {
+          break;
+        }
+        {
+          int const x_176 = temp.arr[x_170];
+          data.arr[x_170] = x_176;
+          x_171 = (x_170 + 1);
+          x_170_phi = x_171;
+        }
+      }
+      {
+        x_118_phi = x_119;
+      }
+    }
+    {
+      x_112 = (2 * x_111);
+      x_111_phi = x_112;
+    }
+  }
+  int x_180 = 0;
+  float x_198 = 0.0f;
+  float x_260 = 0.0f;
+  float x_261_phi = 0.0f;
+  float const x_179 = (*(tint_symbol_5)).y;
+  x_180 = int(x_179);
+  if ((x_180 < 30)) {
+    int const x_186 = data.arr[0];
+    x_189 = (0.5f + (float(x_186) * 0.100000001f));
+    x_262_phi = x_189;
+  } else {
+    float x_207 = 0.0f;
+    float x_259 = 0.0f;
+    float x_260_phi = 0.0f;
+    if ((x_180 < 60)) {
+      int const x_195 = data.arr[1];
+      x_198 = (0.5f + (float(x_195) * 0.100000001f));
+      x_261_phi = x_198;
+    } else {
+      float x_216 = 0.0f;
+      float x_258 = 0.0f;
+      float x_259_phi = 0.0f;
+      if ((x_180 < 90)) {
+        int const x_204 = data.arr[2];
+        x_207 = (0.5f + (float(x_204) * 0.100000001f));
+        x_260_phi = x_207;
+      } else {
+        if ((x_180 < 120)) {
+          int const x_213 = data.arr[3];
+          x_216 = (0.5f + (float(x_213) * 0.100000001f));
+          x_259_phi = x_216;
+        } else {
+          float x_229 = 0.0f;
+          float x_257 = 0.0f;
+          float x_258_phi = 0.0f;
+          if ((x_180 < 150)) {
+            discard_fragment();
+          } else {
+            float x_238 = 0.0f;
+            float x_256 = 0.0f;
+            float x_257_phi = 0.0f;
+            if ((x_180 < 180)) {
+              int const x_226 = data.arr[5];
+              x_229 = (0.5f + (float(x_226) * 0.100000001f));
+              x_258_phi = x_229;
+            } else {
+              float x_247 = 0.0f;
+              float x_255 = 0.0f;
+              float x_256_phi = 0.0f;
+              if ((x_180 < 210)) {
+                int const x_235 = data.arr[6];
+                x_238 = (0.5f + (float(x_235) * 0.100000001f));
+                x_257_phi = x_238;
+              } else {
+                if ((x_180 < 240)) {
+                  int const x_244 = data.arr[7];
+                  x_247 = (0.5f + (float(x_244) * 0.100000001f));
+                  x_256_phi = x_247;
+                } else {
+                  if ((x_180 < 270)) {
+                  } else {
+                    discard_fragment();
+                  }
+                  int const x_252 = data.arr[8];
+                  x_255 = (0.5f + (float(x_252) * 0.100000001f));
+                  x_256_phi = x_255;
+                }
+                x_256 = x_256_phi;
+                x_257_phi = x_256;
+              }
+              x_257 = x_257_phi;
+              x_258_phi = x_257;
+            }
+            x_258 = x_258_phi;
+          }
+          x_259_phi = x_258;
+        }
+        x_259 = x_259_phi;
+        x_260_phi = x_259;
+      }
+      x_260 = x_260_phi;
+      x_261_phi = x_260;
+    }
+    x_261 = x_261_phi;
+    x_262_phi = x_261;
+  }
+  float const x_262 = x_262_phi;
+  *(tint_symbol_6) = float4(x_262, x_262, x_262, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_8, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/2.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/2.wgsl.expected.spvasm
new file mode 100644
index 0000000..105bea0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/2.wgsl.expected.spvasm
@@ -0,0 +1,742 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 422
+; Schema: 0
+               OpCapability Shader
+        %167 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_8 "x_8"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %temp "temp"
+               OpName %data "data"
+               OpName %x_189 "x_189"
+               OpName %x_261 "x_261"
+               OpName %x_63_phi "x_63_phi"
+               OpName %x_102_phi "x_102_phi"
+               OpName %x_111_phi "x_111_phi"
+               OpName %x_262_phi "x_262_phi"
+               OpName %x_99 "x_99"
+               OpName %x_97 "x_97"
+               OpName %x_95 "x_95"
+               OpName %x_93 "x_93"
+               OpName %x_91 "x_91"
+               OpName %x_89 "x_89"
+               OpName %x_87 "x_87"
+               OpName %x_85 "x_85"
+               OpName %x_83 "x_83"
+               OpName %x_81 "x_81"
+               OpName %x_64_phi "x_64_phi"
+               OpName %x_103 "x_103"
+               OpName %x_112 "x_112"
+               OpName %x_118_phi "x_118_phi"
+               OpName %x_130 "x_130"
+               OpName %x_135 "x_135"
+               OpName %x_130_phi "x_130_phi"
+               OpName %x_133_phi "x_133_phi"
+               OpName %x_135_phi "x_135_phi"
+               OpName %x_157_phi "x_157_phi"
+               OpName %x_160_phi "x_160_phi"
+               OpName %x_170_phi "x_170_phi"
+               OpName %x_150 "x_150"
+               OpName %x_153 "x_153"
+               OpName %x_134_phi "x_134_phi"
+               OpName %x_136_phi "x_136_phi"
+               OpName %x_158 "x_158"
+               OpName %x_161 "x_161"
+               OpName %x_171 "x_171"
+               OpName %x_180 "x_180"
+               OpName %x_198 "x_198"
+               OpName %x_260 "x_260"
+               OpName %x_261_phi "x_261_phi"
+               OpName %x_207 "x_207"
+               OpName %x_259 "x_259"
+               OpName %x_260_phi "x_260_phi"
+               OpName %x_216 "x_216"
+               OpName %x_258 "x_258"
+               OpName %x_259_phi "x_259_phi"
+               OpName %x_229 "x_229"
+               OpName %x_257 "x_257"
+               OpName %x_258_phi "x_258_phi"
+               OpName %x_238 "x_238"
+               OpName %x_256 "x_256"
+               OpName %x_257_phi "x_257_phi"
+               OpName %x_247 "x_247"
+               OpName %x_255 "x_255"
+               OpName %x_256_phi "x_256_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+         %25 = OpConstantNull %_arr_int_uint_10
+%_ptr_Function_float = OpTypePointer Function %float
+         %29 = OpConstantNull %float
+%_ptr_Function_int = OpTypePointer Function %int
+         %33 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+     %int_n5 = OpConstant %int -5
+     %int_n4 = OpConstant %int -4
+     %int_n3 = OpConstant %int -3
+     %int_n2 = OpConstant %int -2
+     %int_n1 = OpConstant %int -1
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+     %int_10 = OpConstant %int 10
+       %bool = OpTypeBool
+      %int_9 = OpConstant %int 9
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %int_30 = OpConstant %int 30
+  %float_0_5 = OpConstant %float 0.5
+%float_0_100000001 = OpConstant %float 0.100000001
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %409 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+       %temp = OpVariable %_ptr_Function__arr_int_uint_10 Function %25
+       %data = OpVariable %_ptr_Function__arr_int_uint_10 Function %25
+      %x_189 = OpVariable %_ptr_Function_float Function %29
+      %x_261 = OpVariable %_ptr_Function_float Function %29
+   %x_63_phi = OpVariable %_ptr_Function_int Function %33
+  %x_102_phi = OpVariable %_ptr_Function_int Function %33
+  %x_111_phi = OpVariable %_ptr_Function_int Function %33
+  %x_262_phi = OpVariable %_ptr_Function_float Function %29
+       %x_99 = OpVariable %_ptr_Function_int Function %33
+       %x_97 = OpVariable %_ptr_Function_int Function %33
+       %x_95 = OpVariable %_ptr_Function_int Function %33
+       %x_93 = OpVariable %_ptr_Function_int Function %33
+       %x_91 = OpVariable %_ptr_Function_int Function %33
+       %x_89 = OpVariable %_ptr_Function_int Function %33
+       %x_87 = OpVariable %_ptr_Function_int Function %33
+       %x_85 = OpVariable %_ptr_Function_int Function %33
+       %x_83 = OpVariable %_ptr_Function_int Function %33
+       %x_81 = OpVariable %_ptr_Function_int Function %33
+   %x_64_phi = OpVariable %_ptr_Function_int Function %33
+      %x_103 = OpVariable %_ptr_Function_int Function %33
+      %x_112 = OpVariable %_ptr_Function_int Function %33
+  %x_118_phi = OpVariable %_ptr_Function_int Function %33
+      %x_130 = OpVariable %_ptr_Function_int Function %33
+      %x_135 = OpVariable %_ptr_Function_int Function %33
+  %x_130_phi = OpVariable %_ptr_Function_int Function %33
+  %x_133_phi = OpVariable %_ptr_Function_int Function %33
+  %x_135_phi = OpVariable %_ptr_Function_int Function %33
+  %x_157_phi = OpVariable %_ptr_Function_int Function %33
+  %x_160_phi = OpVariable %_ptr_Function_int Function %33
+  %x_170_phi = OpVariable %_ptr_Function_int Function %33
+      %x_150 = OpVariable %_ptr_Function_int Function %33
+      %x_153 = OpVariable %_ptr_Function_int Function %33
+  %x_134_phi = OpVariable %_ptr_Function_int Function %33
+  %x_136_phi = OpVariable %_ptr_Function_int Function %33
+      %x_158 = OpVariable %_ptr_Function_int Function %33
+      %x_161 = OpVariable %_ptr_Function_int Function %33
+      %x_171 = OpVariable %_ptr_Function_int Function %33
+      %x_180 = OpVariable %_ptr_Function_int Function %33
+      %x_198 = OpVariable %_ptr_Function_float Function %29
+      %x_260 = OpVariable %_ptr_Function_float Function %29
+  %x_261_phi = OpVariable %_ptr_Function_float Function %29
+      %x_207 = OpVariable %_ptr_Function_float Function %29
+      %x_259 = OpVariable %_ptr_Function_float Function %29
+  %x_260_phi = OpVariable %_ptr_Function_float Function %29
+      %x_216 = OpVariable %_ptr_Function_float Function %29
+      %x_258 = OpVariable %_ptr_Function_float Function %29
+  %x_259_phi = OpVariable %_ptr_Function_float Function %29
+      %x_229 = OpVariable %_ptr_Function_float Function %29
+      %x_257 = OpVariable %_ptr_Function_float Function %29
+  %x_258_phi = OpVariable %_ptr_Function_float Function %29
+      %x_238 = OpVariable %_ptr_Function_float Function %29
+      %x_256 = OpVariable %_ptr_Function_float Function %29
+  %x_257_phi = OpVariable %_ptr_Function_float Function %29
+      %x_247 = OpVariable %_ptr_Function_float Function %29
+      %x_255 = OpVariable %_ptr_Function_float Function %29
+  %x_256_phi = OpVariable %_ptr_Function_float Function %29
+         %39 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+         %40 = OpLoad %float %39
+         %41 = OpConvertFToS %int %40
+               OpStore %x_63_phi %41
+               OpBranch %42
+         %42 = OpLabel
+               OpLoopMerge %43 %44 None
+               OpBranch %45
+         %45 = OpLabel
+         %57 = OpLoad %int %x_63_phi
+         %59 = OpIAdd %int %57 %int_1
+               OpStore %x_64_phi %59
+               OpSelectionMerge %60 None
+               OpSwitch %57 %61 9 %62 8 %63 7 %64 6 %65 5 %66 4 %67 3 %68 2 %69 1 %70 0 %71
+         %62 = OpLabel
+         %72 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %72 %int_n5
+         %74 = OpIAdd %int %57 %int_1
+               OpStore %x_99 %74
+         %75 = OpLoad %int %x_99
+               OpStore %x_64_phi %75
+               OpBranch %60
+         %63 = OpLabel
+         %76 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %76 %int_n4
+         %78 = OpIAdd %int %57 %int_1
+               OpStore %x_97 %78
+         %79 = OpLoad %int %x_97
+               OpStore %x_64_phi %79
+               OpBranch %60
+         %64 = OpLabel
+         %80 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %80 %int_n3
+         %82 = OpIAdd %int %57 %int_1
+               OpStore %x_95 %82
+         %83 = OpLoad %int %x_95
+               OpStore %x_64_phi %83
+               OpBranch %60
+         %65 = OpLabel
+         %84 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %84 %int_n2
+         %86 = OpIAdd %int %57 %int_1
+               OpStore %x_93 %86
+         %87 = OpLoad %int %x_93
+               OpStore %x_64_phi %87
+               OpBranch %60
+         %66 = OpLabel
+         %88 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %88 %int_n1
+         %90 = OpIAdd %int %57 %int_1
+               OpStore %x_91 %90
+         %91 = OpLoad %int %x_91
+               OpStore %x_64_phi %91
+               OpBranch %60
+         %67 = OpLabel
+         %92 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %92 %int_0
+         %94 = OpIAdd %int %57 %int_1
+               OpStore %x_89 %94
+         %95 = OpLoad %int %x_89
+               OpStore %x_64_phi %95
+               OpBranch %60
+         %68 = OpLabel
+         %96 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %96 %int_1
+         %97 = OpIAdd %int %57 %int_1
+               OpStore %x_87 %97
+         %98 = OpLoad %int %x_87
+               OpStore %x_64_phi %98
+               OpBranch %60
+         %69 = OpLabel
+         %99 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %99 %int_2
+        %101 = OpIAdd %int %57 %int_1
+               OpStore %x_85 %101
+        %102 = OpLoad %int %x_85
+               OpStore %x_64_phi %102
+               OpBranch %60
+         %70 = OpLabel
+        %103 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %103 %int_3
+        %105 = OpIAdd %int %57 %int_1
+               OpStore %x_83 %105
+        %106 = OpLoad %int %x_83
+               OpStore %x_64_phi %106
+               OpBranch %60
+         %71 = OpLabel
+        %107 = OpAccessChain %_ptr_Function_int %data %57
+               OpStore %107 %int_4
+        %109 = OpIAdd %int %57 %int_1
+               OpStore %x_81 %109
+        %110 = OpLoad %int %x_81
+               OpStore %x_64_phi %110
+               OpBranch %60
+         %61 = OpLabel
+               OpBranch %60
+         %60 = OpLabel
+        %111 = OpLoad %int %x_64_phi
+               OpBranch %44
+         %44 = OpLabel
+               OpStore %x_63_phi %111
+        %113 = OpSLessThan %bool %111 %int_10
+               OpSelectionMerge %115 None
+               OpBranchConditional %113 %116 %117
+        %116 = OpLabel
+               OpBranch %115
+        %117 = OpLabel
+               OpBranch %43
+        %115 = OpLabel
+               OpBranch %42
+         %43 = OpLabel
+               OpStore %x_102_phi %int_0
+               OpBranch %118
+        %118 = OpLabel
+               OpLoopMerge %119 %120 None
+               OpBranch %121
+        %121 = OpLabel
+        %123 = OpLoad %int %x_102_phi
+        %124 = OpSLessThan %bool %123 %int_10
+               OpSelectionMerge %125 None
+               OpBranchConditional %124 %126 %127
+        %126 = OpLabel
+               OpBranch %125
+        %127 = OpLabel
+               OpBranch %119
+        %125 = OpLabel
+               OpBranch %120
+        %120 = OpLabel
+        %128 = OpAccessChain %_ptr_Function_int %data %123
+        %129 = OpLoad %int %128
+        %130 = OpAccessChain %_ptr_Function_int %temp %123
+               OpStore %130 %129
+        %131 = OpIAdd %int %123 %int_1
+               OpStore %x_103 %131
+        %132 = OpLoad %int %x_103
+               OpStore %x_102_phi %132
+               OpBranch %118
+        %119 = OpLabel
+               OpStore %x_111_phi %int_1
+               OpBranch %133
+        %133 = OpLabel
+               OpLoopMerge %134 %135 None
+               OpBranch %136
+        %136 = OpLabel
+        %139 = OpLoad %int %x_111_phi
+        %141 = OpSLessThanEqual %bool %139 %int_9
+               OpSelectionMerge %142 None
+               OpBranchConditional %141 %143 %144
+        %143 = OpLabel
+               OpBranch %142
+        %144 = OpLabel
+               OpBranch %134
+        %142 = OpLabel
+               OpStore %x_118_phi %int_0
+               OpBranch %145
+        %145 = OpLabel
+               OpLoopMerge %146 %147 None
+               OpBranch %148
+        %148 = OpLabel
+        %157 = OpLoad %int %x_118_phi
+        %158 = OpSLessThan %bool %157 %int_9
+               OpSelectionMerge %159 None
+               OpBranchConditional %158 %160 %161
+        %160 = OpLabel
+               OpBranch %159
+        %161 = OpLabel
+               OpBranch %146
+        %159 = OpLabel
+        %162 = OpIAdd %int %157 %139
+        %163 = OpISub %int %162 %int_1
+        %164 = OpIMul %int %int_2 %139
+        %165 = OpIAdd %int %157 %164
+        %168 = OpISub %int %165 %int_1
+        %166 = OpExtInst %int %167 SMin %168 %int_9
+               OpStore %x_130_phi %157
+               OpStore %x_133_phi %162
+               OpStore %x_135_phi %157
+               OpBranch %169
+        %169 = OpLabel
+               OpLoopMerge %170 %171 None
+               OpBranch %172
+        %172 = OpLabel
+        %177 = OpLoad %int %x_130_phi
+               OpStore %x_130 %177
+        %178 = OpLoad %int %x_133_phi
+        %179 = OpLoad %int %x_135_phi
+               OpStore %x_135 %179
+        %180 = OpLoad %int %x_135
+        %181 = OpSLessThanEqual %bool %180 %163
+               OpSelectionMerge %182 None
+               OpBranchConditional %181 %183 %182
+        %183 = OpLabel
+        %184 = OpSLessThanEqual %bool %178 %166
+               OpBranch %182
+        %182 = OpLabel
+        %185 = OpPhi %bool %181 %172 %184 %183
+               OpSelectionMerge %186 None
+               OpBranchConditional %185 %187 %188
+        %187 = OpLabel
+               OpBranch %186
+        %188 = OpLabel
+               OpBranch %170
+        %186 = OpLabel
+        %189 = OpLoad %int %x_135
+        %190 = OpAccessChain %_ptr_Function_int %data %189
+        %191 = OpLoad %int %190
+        %192 = OpAccessChain %_ptr_Function_int %data %178
+        %193 = OpLoad %int %192
+        %195 = OpLoad %int %x_130
+        %196 = OpCopyObject %int %int_1
+        %197 = OpIAdd %int %195 %196
+        %194 = OpCopyObject %int %197
+        %198 = OpSLessThan %bool %191 %193
+               OpSelectionMerge %199 None
+               OpBranchConditional %198 %200 %201
+        %200 = OpLabel
+        %203 = OpLoad %int %x_135
+        %204 = OpCopyObject %int %int_1
+        %205 = OpIAdd %int %203 %204
+        %202 = OpCopyObject %int %205
+               OpStore %x_150 %202
+        %206 = OpAccessChain %_ptr_Function_int %data %189
+        %207 = OpLoad %int %206
+        %208 = OpLoad %int %x_130
+        %209 = OpAccessChain %_ptr_Function_int %temp %208
+               OpStore %209 %207
+               OpStore %x_134_phi %178
+        %210 = OpLoad %int %x_150
+               OpStore %x_136_phi %210
+               OpBranch %199
+        %201 = OpLabel
+        %211 = OpIAdd %int %178 %int_1
+               OpStore %x_153 %211
+        %212 = OpAccessChain %_ptr_Function_int %data %178
+        %213 = OpLoad %int %212
+        %214 = OpLoad %int %x_130
+        %215 = OpAccessChain %_ptr_Function_int %temp %214
+               OpStore %215 %213
+        %216 = OpLoad %int %x_153
+               OpStore %x_134_phi %216
+        %217 = OpLoad %int %x_135
+               OpStore %x_136_phi %217
+               OpBranch %199
+        %199 = OpLabel
+        %218 = OpLoad %int %x_134_phi
+        %219 = OpLoad %int %x_136_phi
+               OpBranch %171
+        %171 = OpLabel
+               OpStore %x_130_phi %194
+               OpStore %x_133_phi %218
+               OpStore %x_135_phi %219
+               OpBranch %169
+        %170 = OpLabel
+        %220 = OpLoad %int %x_130
+               OpStore %x_157_phi %220
+        %221 = OpLoad %int %x_135
+               OpStore %x_160_phi %221
+               OpBranch %222
+        %222 = OpLabel
+               OpLoopMerge %223 %224 None
+               OpBranch %225
+        %225 = OpLabel
+        %228 = OpLoad %int %x_157_phi
+        %229 = OpLoad %int %x_160_phi
+        %230 = OpSLessThan %bool %229 %int_10
+               OpSelectionMerge %231 None
+               OpBranchConditional %230 %232 %231
+        %232 = OpLabel
+        %233 = OpSLessThanEqual %bool %229 %163
+               OpBranch %231
+        %231 = OpLabel
+        %234 = OpPhi %bool %230 %225 %233 %232
+               OpSelectionMerge %235 None
+               OpBranchConditional %234 %236 %237
+        %236 = OpLabel
+               OpBranch %235
+        %237 = OpLabel
+               OpBranch %223
+        %235 = OpLabel
+               OpBranch %224
+        %224 = OpLabel
+        %238 = OpIAdd %int %228 %int_1
+               OpStore %x_158 %238
+        %239 = OpIAdd %int %229 %int_1
+               OpStore %x_161 %239
+        %240 = OpAccessChain %_ptr_Function_int %data %229
+        %241 = OpLoad %int %240
+        %242 = OpAccessChain %_ptr_Function_int %temp %228
+               OpStore %242 %241
+        %243 = OpLoad %int %x_158
+               OpStore %x_157_phi %243
+        %244 = OpLoad %int %x_161
+               OpStore %x_160_phi %244
+               OpBranch %222
+        %223 = OpLabel
+               OpStore %x_170_phi %157
+               OpBranch %245
+        %245 = OpLabel
+               OpLoopMerge %246 %247 None
+               OpBranch %248
+        %248 = OpLabel
+        %250 = OpLoad %int %x_170_phi
+        %251 = OpSLessThanEqual %bool %250 %166
+               OpSelectionMerge %252 None
+               OpBranchConditional %251 %253 %254
+        %253 = OpLabel
+               OpBranch %252
+        %254 = OpLabel
+               OpBranch %246
+        %252 = OpLabel
+               OpBranch %247
+        %247 = OpLabel
+        %255 = OpAccessChain %_ptr_Function_int %temp %250
+        %256 = OpLoad %int %255
+        %257 = OpAccessChain %_ptr_Function_int %data %250
+               OpStore %257 %256
+        %258 = OpIAdd %int %250 %int_1
+               OpStore %x_171 %258
+        %259 = OpLoad %int %x_171
+               OpStore %x_170_phi %259
+               OpBranch %245
+        %246 = OpLabel
+               OpBranch %147
+        %147 = OpLabel
+               OpStore %x_118_phi %165
+               OpBranch %145
+        %146 = OpLabel
+               OpBranch %135
+        %135 = OpLabel
+        %260 = OpIMul %int %int_2 %139
+               OpStore %x_112 %260
+        %261 = OpLoad %int %x_112
+               OpStore %x_111_phi %261
+               OpBranch %133
+        %134 = OpLabel
+        %268 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %269 = OpLoad %float %268
+        %270 = OpConvertFToS %int %269
+               OpStore %x_180 %270
+        %271 = OpLoad %int %x_180
+        %273 = OpSLessThan %bool %271 %int_30
+               OpSelectionMerge %274 None
+               OpBranchConditional %273 %275 %276
+        %275 = OpLabel
+        %277 = OpAccessChain %_ptr_Function_int %data %int_0
+        %278 = OpLoad %int %277
+        %280 = OpConvertSToF %float %278
+        %282 = OpFMul %float %280 %float_0_100000001
+        %283 = OpFAdd %float %float_0_5 %282
+               OpStore %x_189 %283
+        %284 = OpLoad %float %x_189
+               OpStore %x_262_phi %284
+               OpBranch %274
+        %276 = OpLabel
+        %288 = OpLoad %int %x_180
+        %290 = OpSLessThan %bool %288 %int_60
+               OpSelectionMerge %291 None
+               OpBranchConditional %290 %292 %293
+        %292 = OpLabel
+        %294 = OpAccessChain %_ptr_Function_int %data %int_1
+        %295 = OpLoad %int %294
+        %296 = OpConvertSToF %float %295
+        %297 = OpFMul %float %296 %float_0_100000001
+        %298 = OpFAdd %float %float_0_5 %297
+               OpStore %x_198 %298
+        %299 = OpLoad %float %x_198
+               OpStore %x_261_phi %299
+               OpBranch %291
+        %293 = OpLabel
+        %303 = OpLoad %int %x_180
+        %305 = OpSLessThan %bool %303 %int_90
+               OpSelectionMerge %306 None
+               OpBranchConditional %305 %307 %308
+        %307 = OpLabel
+        %309 = OpAccessChain %_ptr_Function_int %data %int_2
+        %310 = OpLoad %int %309
+        %311 = OpConvertSToF %float %310
+        %312 = OpFMul %float %311 %float_0_100000001
+        %313 = OpFAdd %float %float_0_5 %312
+               OpStore %x_207 %313
+        %314 = OpLoad %float %x_207
+               OpStore %x_260_phi %314
+               OpBranch %306
+        %308 = OpLabel
+        %315 = OpLoad %int %x_180
+        %317 = OpSLessThan %bool %315 %int_120
+               OpSelectionMerge %318 None
+               OpBranchConditional %317 %319 %320
+        %319 = OpLabel
+        %321 = OpAccessChain %_ptr_Function_int %data %int_3
+        %322 = OpLoad %int %321
+        %323 = OpConvertSToF %float %322
+        %324 = OpFMul %float %323 %float_0_100000001
+        %325 = OpFAdd %float %float_0_5 %324
+               OpStore %x_216 %325
+        %326 = OpLoad %float %x_216
+               OpStore %x_259_phi %326
+               OpBranch %318
+        %320 = OpLabel
+        %330 = OpLoad %int %x_180
+        %332 = OpSLessThan %bool %330 %int_150
+               OpSelectionMerge %333 None
+               OpBranchConditional %332 %334 %335
+        %334 = OpLabel
+               OpKill
+        %335 = OpLabel
+        %339 = OpLoad %int %x_180
+        %341 = OpSLessThan %bool %339 %int_180
+               OpSelectionMerge %342 None
+               OpBranchConditional %341 %343 %344
+        %343 = OpLabel
+        %346 = OpAccessChain %_ptr_Function_int %data %int_5
+        %347 = OpLoad %int %346
+        %348 = OpConvertSToF %float %347
+        %349 = OpFMul %float %348 %float_0_100000001
+        %350 = OpFAdd %float %float_0_5 %349
+               OpStore %x_229 %350
+        %351 = OpLoad %float %x_229
+               OpStore %x_258_phi %351
+               OpBranch %342
+        %344 = OpLabel
+        %355 = OpLoad %int %x_180
+        %357 = OpSLessThan %bool %355 %int_210
+               OpSelectionMerge %358 None
+               OpBranchConditional %357 %359 %360
+        %359 = OpLabel
+        %362 = OpAccessChain %_ptr_Function_int %data %int_6
+        %363 = OpLoad %int %362
+        %364 = OpConvertSToF %float %363
+        %365 = OpFMul %float %364 %float_0_100000001
+        %366 = OpFAdd %float %float_0_5 %365
+               OpStore %x_238 %366
+        %367 = OpLoad %float %x_238
+               OpStore %x_257_phi %367
+               OpBranch %358
+        %360 = OpLabel
+        %368 = OpLoad %int %x_180
+        %370 = OpSLessThan %bool %368 %int_240
+               OpSelectionMerge %371 None
+               OpBranchConditional %370 %372 %373
+        %372 = OpLabel
+        %375 = OpAccessChain %_ptr_Function_int %data %int_7
+        %376 = OpLoad %int %375
+        %377 = OpConvertSToF %float %376
+        %378 = OpFMul %float %377 %float_0_100000001
+        %379 = OpFAdd %float %float_0_5 %378
+               OpStore %x_247 %379
+        %380 = OpLoad %float %x_247
+               OpStore %x_256_phi %380
+               OpBranch %371
+        %373 = OpLabel
+        %381 = OpLoad %int %x_180
+        %383 = OpSLessThan %bool %381 %int_270
+               OpSelectionMerge %384 None
+               OpBranchConditional %383 %385 %386
+        %385 = OpLabel
+               OpBranch %384
+        %386 = OpLabel
+               OpKill
+        %384 = OpLabel
+        %388 = OpAccessChain %_ptr_Function_int %data %int_8
+        %389 = OpLoad %int %388
+        %390 = OpConvertSToF %float %389
+        %391 = OpFMul %float %390 %float_0_100000001
+        %392 = OpFAdd %float %float_0_5 %391
+               OpStore %x_255 %392
+        %393 = OpLoad %float %x_255
+               OpStore %x_256_phi %393
+               OpBranch %371
+        %371 = OpLabel
+        %394 = OpLoad %float %x_256_phi
+               OpStore %x_256 %394
+        %395 = OpLoad %float %x_256
+               OpStore %x_257_phi %395
+               OpBranch %358
+        %358 = OpLabel
+        %396 = OpLoad %float %x_257_phi
+               OpStore %x_257 %396
+        %397 = OpLoad %float %x_257
+               OpStore %x_258_phi %397
+               OpBranch %342
+        %342 = OpLabel
+        %398 = OpLoad %float %x_258_phi
+               OpStore %x_258 %398
+               OpBranch %333
+        %333 = OpLabel
+        %399 = OpLoad %float %x_258
+               OpStore %x_259_phi %399
+               OpBranch %318
+        %318 = OpLabel
+        %400 = OpLoad %float %x_259_phi
+               OpStore %x_259 %400
+        %401 = OpLoad %float %x_259
+               OpStore %x_260_phi %401
+               OpBranch %306
+        %306 = OpLabel
+        %402 = OpLoad %float %x_260_phi
+               OpStore %x_260 %402
+        %403 = OpLoad %float %x_260
+               OpStore %x_261_phi %403
+               OpBranch %291
+        %291 = OpLabel
+        %404 = OpLoad %float %x_261_phi
+               OpStore %x_261 %404
+        %405 = OpLoad %float %x_261
+               OpStore %x_262_phi %405
+               OpBranch %274
+        %274 = OpLabel
+        %406 = OpLoad %float %x_262_phi
+        %408 = OpCompositeConstruct %v4float %406 %406 %406 %float_1
+               OpStore %x_GLF_color %408
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %409
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %413 = OpLabel
+        %414 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %414
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %416 = OpLabel
+        %417 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %417
+        %418 = OpFunctionCall %void %main_1
+        %420 = OpLoad %v4float %x_GLF_color
+        %421 = OpCompositeConstruct %main_out %420
+        %419 = OpFunctionCall %void %tint_symbol_3 %421
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 44[%44] is not post dominated by the back-edge block 115[%115]
+  %115 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/2.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/2.wgsl.expected.wgsl
new file mode 100644
index 0000000..0d0b64b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/2.wgsl.expected.wgsl
@@ -0,0 +1,338 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var temp : array<i32, 10>;
+  var data : array<i32, 10>;
+  var x_189 : f32;
+  var x_261 : f32;
+  var x_63_phi : i32;
+  var x_102_phi : i32;
+  var x_111_phi : i32;
+  var x_262_phi : f32;
+  let x_60 : f32 = x_8.injectionSwitch.x;
+  let x_61 : i32 = i32(x_60);
+  x_63_phi = x_61;
+  loop {
+    var x_99 : i32;
+    var x_97 : i32;
+    var x_95 : i32;
+    var x_93 : i32;
+    var x_91 : i32;
+    var x_89 : i32;
+    var x_87 : i32;
+    var x_85 : i32;
+    var x_83 : i32;
+    var x_81 : i32;
+    var x_64_phi : i32;
+    let x_63 : i32 = x_63_phi;
+    let x_68 : i32 = (x_63 + 1);
+    x_64_phi = x_68;
+    switch(x_63) {
+      case 9: {
+        data[x_63] = -5;
+        x_99 = (x_63 + 1);
+        x_64_phi = x_99;
+      }
+      case 8: {
+        data[x_63] = -4;
+        x_97 = (x_63 + 1);
+        x_64_phi = x_97;
+      }
+      case 7: {
+        data[x_63] = -3;
+        x_95 = (x_63 + 1);
+        x_64_phi = x_95;
+      }
+      case 6: {
+        data[x_63] = -2;
+        x_93 = (x_63 + 1);
+        x_64_phi = x_93;
+      }
+      case 5: {
+        data[x_63] = -1;
+        x_91 = (x_63 + 1);
+        x_64_phi = x_91;
+      }
+      case 4: {
+        data[x_63] = 0;
+        x_89 = (x_63 + 1);
+        x_64_phi = x_89;
+      }
+      case 3: {
+        data[x_63] = 1;
+        x_87 = (x_63 + 1);
+        x_64_phi = x_87;
+      }
+      case 2: {
+        data[x_63] = 2;
+        x_85 = (x_63 + 1);
+        x_64_phi = x_85;
+      }
+      case 1: {
+        data[x_63] = 3;
+        x_83 = (x_63 + 1);
+        x_64_phi = x_83;
+      }
+      case 0: {
+        data[x_63] = 4;
+        x_81 = (x_63 + 1);
+        x_64_phi = x_81;
+      }
+      default: {
+      }
+    }
+    let x_64 : i32 = x_64_phi;
+
+    continuing {
+      x_63_phi = x_64;
+      if ((x_64 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_102_phi = 0;
+  loop {
+    var x_103 : i32;
+    let x_102 : i32 = x_102_phi;
+    if ((x_102 < 10)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_108 : i32 = data[x_102];
+      temp[x_102] = x_108;
+      x_103 = (x_102 + 1);
+      x_102_phi = x_103;
+    }
+  }
+  x_111_phi = 1;
+  loop {
+    var x_112 : i32;
+    var x_118_phi : i32;
+    let x_111 : i32 = x_111_phi;
+    if ((x_111 <= 9)) {
+    } else {
+      break;
+    }
+    x_118_phi = 0;
+    loop {
+      var x_130 : i32;
+      var x_135 : i32;
+      var x_130_phi : i32;
+      var x_133_phi : i32;
+      var x_135_phi : i32;
+      var x_157_phi : i32;
+      var x_160_phi : i32;
+      var x_170_phi : i32;
+      let x_118 : i32 = x_118_phi;
+      if ((x_118 < 9)) {
+      } else {
+        break;
+      }
+      let x_124 : i32 = (x_118 + x_111);
+      let x_125 : i32 = (x_124 - 1);
+      let x_119 : i32 = (x_118 + (2 * x_111));
+      let x_128 : i32 = min((x_119 - 1), 9);
+      x_130_phi = x_118;
+      x_133_phi = x_124;
+      x_135_phi = x_118;
+      loop {
+        var x_150 : i32;
+        var x_153 : i32;
+        var x_134_phi : i32;
+        var x_136_phi : i32;
+        x_130 = x_130_phi;
+        let x_133 : i32 = x_133_phi;
+        x_135 = x_135_phi;
+        if (((x_135 <= x_125) && (x_133 <= x_128))) {
+        } else {
+          break;
+        }
+        let x_142 : ptr<function, i32> = &(data[x_135]);
+        let x_143 : i32 = *(x_142);
+        let x_144 : ptr<function, i32> = &(data[x_133]);
+        let x_145 : i32 = *(x_144);
+        let x_131 : i32 = bitcast<i32>((x_130 + bitcast<i32>(1)));
+        if ((x_143 < x_145)) {
+          x_150 = bitcast<i32>((x_135 + bitcast<i32>(1)));
+          let x_151 : i32 = *(x_142);
+          temp[x_130] = x_151;
+          x_134_phi = x_133;
+          x_136_phi = x_150;
+        } else {
+          x_153 = (x_133 + 1);
+          let x_154 : i32 = *(x_144);
+          temp[x_130] = x_154;
+          x_134_phi = x_153;
+          x_136_phi = x_135;
+        }
+        let x_134 : i32 = x_134_phi;
+        let x_136 : i32 = x_136_phi;
+
+        continuing {
+          x_130_phi = x_131;
+          x_133_phi = x_134;
+          x_135_phi = x_136;
+        }
+      }
+      x_157_phi = x_130;
+      x_160_phi = x_135;
+      loop {
+        var x_158 : i32;
+        var x_161 : i32;
+        let x_157 : i32 = x_157_phi;
+        let x_160 : i32 = x_160_phi;
+        if (((x_160 < 10) && (x_160 <= x_125))) {
+        } else {
+          break;
+        }
+
+        continuing {
+          x_158 = (x_157 + 1);
+          x_161 = (x_160 + 1);
+          let x_167 : i32 = data[x_160];
+          temp[x_157] = x_167;
+          x_157_phi = x_158;
+          x_160_phi = x_161;
+        }
+      }
+      x_170_phi = x_118;
+      loop {
+        var x_171 : i32;
+        let x_170 : i32 = x_170_phi;
+        if ((x_170 <= x_128)) {
+        } else {
+          break;
+        }
+
+        continuing {
+          let x_176 : i32 = temp[x_170];
+          data[x_170] = x_176;
+          x_171 = (x_170 + 1);
+          x_170_phi = x_171;
+        }
+      }
+
+      continuing {
+        x_118_phi = x_119;
+      }
+    }
+
+    continuing {
+      x_112 = (2 * x_111);
+      x_111_phi = x_112;
+    }
+  }
+  var x_180 : i32;
+  var x_198 : f32;
+  var x_260 : f32;
+  var x_261_phi : f32;
+  let x_179 : f32 = gl_FragCoord.y;
+  x_180 = i32(x_179);
+  if ((x_180 < 30)) {
+    let x_186 : i32 = data[0];
+    x_189 = (0.5 + (f32(x_186) * 0.100000001));
+    x_262_phi = x_189;
+  } else {
+    var x_207 : f32;
+    var x_259 : f32;
+    var x_260_phi : f32;
+    if ((x_180 < 60)) {
+      let x_195 : i32 = data[1];
+      x_198 = (0.5 + (f32(x_195) * 0.100000001));
+      x_261_phi = x_198;
+    } else {
+      var x_216 : f32;
+      var x_258 : f32;
+      var x_259_phi : f32;
+      if ((x_180 < 90)) {
+        let x_204 : i32 = data[2];
+        x_207 = (0.5 + (f32(x_204) * 0.100000001));
+        x_260_phi = x_207;
+      } else {
+        if ((x_180 < 120)) {
+          let x_213 : i32 = data[3];
+          x_216 = (0.5 + (f32(x_213) * 0.100000001));
+          x_259_phi = x_216;
+        } else {
+          var x_229 : f32;
+          var x_257 : f32;
+          var x_258_phi : f32;
+          if ((x_180 < 150)) {
+            discard;
+          } else {
+            var x_238 : f32;
+            var x_256 : f32;
+            var x_257_phi : f32;
+            if ((x_180 < 180)) {
+              let x_226 : i32 = data[5];
+              x_229 = (0.5 + (f32(x_226) * 0.100000001));
+              x_258_phi = x_229;
+            } else {
+              var x_247 : f32;
+              var x_255 : f32;
+              var x_256_phi : f32;
+              if ((x_180 < 210)) {
+                let x_235 : i32 = data[6];
+                x_238 = (0.5 + (f32(x_235) * 0.100000001));
+                x_257_phi = x_238;
+              } else {
+                if ((x_180 < 240)) {
+                  let x_244 : i32 = data[7];
+                  x_247 = (0.5 + (f32(x_244) * 0.100000001));
+                  x_256_phi = x_247;
+                } else {
+                  if ((x_180 < 270)) {
+                  } else {
+                    discard;
+                  }
+                  let x_252 : i32 = data[8];
+                  x_255 = (0.5 + (f32(x_252) * 0.100000001));
+                  x_256_phi = x_255;
+                }
+                x_256 = x_256_phi;
+                x_257_phi = x_256;
+              }
+              x_257 = x_257_phi;
+              x_258_phi = x_257;
+            }
+            x_258 = x_258_phi;
+          }
+          x_259_phi = x_258;
+        }
+        x_259 = x_259_phi;
+        x_260_phi = x_259;
+      }
+      x_260 = x_260_phi;
+      x_261_phi = x_260;
+    }
+    x_261 = x_261_phi;
+    x_262_phi = x_261;
+  }
+  let x_262 : f32 = x_262_phi;
+  x_GLF_color = vec4<f32>(x_262, x_262, x_262, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/0.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/0.spvasm
new file mode 100644
index 0000000..7e89166
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/0.spvasm
@@ -0,0 +1,555 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %merge_i1_i1_i1_ "merge(i1;i1;i1;"
+               OpName %from "from"
+               OpName %mid "mid"
+               OpName %to "to"
+               OpName %mergeSort_ "mergeSort("
+               OpName %k "k"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %data "data"
+               OpName %temp "temp"
+               OpName %i_0 "i"
+               OpName %low "low"
+               OpName %high "high"
+               OpName %m "m"
+               OpName %i_1 "i"
+               OpName %from_0 "from"
+               OpName %mid_0 "mid"
+               OpName %to_0 "to"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %param_1 "param"
+               OpName %i_2 "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %j_0 "j"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %grey "grey"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %32 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %35 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int %_ptr_Function_int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Private__arr_int_uint_10 = OpTypePointer Private %_arr_int_uint_10
+       %data = OpVariable %_ptr_Private__arr_int_uint_10 Private
+%_ptr_Private_int = OpTypePointer Private %int
+       %temp = OpVariable %_ptr_Private__arr_int_uint_10 Private
+     %int_10 = OpConstant %int 10
+      %int_0 = OpConstant %int 0
+      %int_9 = OpConstant %int 9
+      %int_2 = OpConstant %int 2
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_4 = OpConstant %int 4
+      %int_3 = OpConstant %int 3
+     %int_n1 = OpConstant %int -1
+     %int_n2 = OpConstant %int -2
+     %int_n3 = OpConstant %int -3
+     %int_n4 = OpConstant %int -4
+     %int_n5 = OpConstant %int -5
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+     %int_30 = OpConstant %int 30
+%_ptr_Function_float = OpTypePointer Function %float
+  %float_0_5 = OpConstant %float 0.5
+   %float_10 = OpConstant %float 10
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %v3float = OpTypeVector %float 3
+    %float_1 = OpConstant %float 1
+       %main = OpFunction %void None %32
+         %82 = OpLabel
+        %i_2 = OpVariable %_ptr_Function_int Function
+        %j_0 = OpVariable %_ptr_Function_int Function
+       %grey = OpVariable %_ptr_Function_float Function
+         %83 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %84 = OpLoad %float %83
+         %85 = OpConvertFToS %int %84
+               OpStore %i_2 %85
+               OpBranch %86
+         %86 = OpLabel
+               OpLoopMerge %87 %88 None
+               OpBranch %89
+         %89 = OpLabel
+         %90 = OpLoad %int %i_2
+               OpSelectionMerge %91 None
+               OpSwitch %90 %91 0 %92 1 %93 2 %94 3 %95 4 %96 5 %97 6 %98 7 %99 8 %100 9 %101
+         %92 = OpLabel
+        %102 = OpLoad %int %i_2
+        %103 = OpAccessChain %_ptr_Private_int %data %102
+               OpStore %103 %int_4
+               OpBranch %91
+         %93 = OpLabel
+        %104 = OpLoad %int %i_2
+        %105 = OpAccessChain %_ptr_Private_int %data %104
+               OpStore %105 %int_3
+               OpBranch %91
+         %94 = OpLabel
+        %106 = OpLoad %int %i_2
+        %107 = OpAccessChain %_ptr_Private_int %data %106
+               OpStore %107 %int_2
+               OpBranch %91
+         %95 = OpLabel
+        %108 = OpLoad %int %i_2
+        %109 = OpAccessChain %_ptr_Private_int %data %108
+               OpStore %109 %int_1
+               OpBranch %91
+         %96 = OpLabel
+        %110 = OpLoad %int %i_2
+        %111 = OpAccessChain %_ptr_Private_int %data %110
+               OpStore %111 %int_0
+               OpBranch %91
+         %97 = OpLabel
+        %112 = OpLoad %int %i_2
+        %113 = OpAccessChain %_ptr_Private_int %data %112
+               OpStore %113 %int_n1
+               OpBranch %91
+         %98 = OpLabel
+        %114 = OpLoad %int %i_2
+        %115 = OpAccessChain %_ptr_Private_int %data %114
+               OpStore %115 %int_n2
+               OpBranch %91
+         %99 = OpLabel
+        %116 = OpLoad %int %i_2
+        %117 = OpAccessChain %_ptr_Private_int %data %116
+               OpStore %117 %int_n3
+               OpBranch %91
+        %100 = OpLabel
+        %118 = OpLoad %int %i_2
+        %119 = OpAccessChain %_ptr_Private_int %data %118
+               OpStore %119 %int_n4
+               OpBranch %91
+        %101 = OpLabel
+        %120 = OpLoad %int %i_2
+        %121 = OpAccessChain %_ptr_Private_int %data %120
+               OpStore %121 %int_n5
+               OpBranch %91
+         %91 = OpLabel
+        %122 = OpLoad %int %i_2
+        %123 = OpIAdd %int %122 %int_1
+               OpStore %i_2 %123
+               OpBranch %88
+         %88 = OpLabel
+        %124 = OpLoad %int %i_2
+        %125 = OpSLessThan %bool %124 %int_10
+               OpBranchConditional %125 %86 %87
+         %87 = OpLabel
+               OpStore %j_0 %int_0
+               OpBranch %126
+        %126 = OpLabel
+               OpLoopMerge %127 %128 None
+               OpBranch %129
+        %129 = OpLabel
+        %130 = OpLoad %int %j_0
+        %131 = OpSLessThan %bool %130 %int_10
+               OpBranchConditional %131 %132 %127
+        %132 = OpLabel
+        %133 = OpLoad %int %j_0
+        %134 = OpLoad %int %j_0
+        %135 = OpAccessChain %_ptr_Private_int %data %134
+        %136 = OpLoad %int %135
+        %137 = OpAccessChain %_ptr_Private_int %temp %133
+               OpStore %137 %136
+               OpBranch %128
+        %128 = OpLabel
+        %138 = OpLoad %int %j_0
+        %139 = OpIAdd %int %138 %int_1
+               OpStore %j_0 %139
+               OpBranch %126
+        %127 = OpLabel
+        %140 = OpFunctionCall %void %mergeSort_
+        %141 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %142 = OpLoad %float %141
+        %143 = OpConvertFToS %int %142
+        %144 = OpSLessThan %bool %143 %int_30
+               OpSelectionMerge %145 None
+               OpBranchConditional %144 %146 %147
+        %146 = OpLabel
+        %148 = OpAccessChain %_ptr_Private_int %data %int_0
+        %149 = OpLoad %int %148
+        %150 = OpConvertSToF %float %149
+        %151 = OpFDiv %float %150 %float_10
+        %152 = OpFAdd %float %float_0_5 %151
+               OpStore %grey %152
+               OpBranch %145
+        %147 = OpLabel
+        %153 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %154 = OpLoad %float %153
+        %155 = OpConvertFToS %int %154
+        %156 = OpSLessThan %bool %155 %int_60
+               OpSelectionMerge %157 None
+               OpBranchConditional %156 %158 %159
+        %158 = OpLabel
+        %160 = OpAccessChain %_ptr_Private_int %data %int_1
+        %161 = OpLoad %int %160
+        %162 = OpConvertSToF %float %161
+        %163 = OpFDiv %float %162 %float_10
+        %164 = OpFAdd %float %float_0_5 %163
+               OpStore %grey %164
+               OpBranch %157
+        %159 = OpLabel
+        %165 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %166 = OpLoad %float %165
+        %167 = OpConvertFToS %int %166
+        %168 = OpSLessThan %bool %167 %int_90
+               OpSelectionMerge %169 None
+               OpBranchConditional %168 %170 %171
+        %170 = OpLabel
+        %172 = OpAccessChain %_ptr_Private_int %data %int_2
+        %173 = OpLoad %int %172
+        %174 = OpConvertSToF %float %173
+        %175 = OpFDiv %float %174 %float_10
+        %176 = OpFAdd %float %float_0_5 %175
+               OpStore %grey %176
+               OpBranch %169
+        %171 = OpLabel
+        %177 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %178 = OpLoad %float %177
+        %179 = OpConvertFToS %int %178
+        %180 = OpSLessThan %bool %179 %int_120
+               OpSelectionMerge %181 None
+               OpBranchConditional %180 %182 %183
+        %182 = OpLabel
+        %184 = OpAccessChain %_ptr_Private_int %data %int_3
+        %185 = OpLoad %int %184
+        %186 = OpConvertSToF %float %185
+        %187 = OpFDiv %float %186 %float_10
+        %188 = OpFAdd %float %float_0_5 %187
+               OpStore %grey %188
+               OpBranch %181
+        %183 = OpLabel
+        %189 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %190 = OpLoad %float %189
+        %191 = OpConvertFToS %int %190
+        %192 = OpSLessThan %bool %191 %int_150
+               OpSelectionMerge %193 None
+               OpBranchConditional %192 %194 %195
+        %194 = OpLabel
+               OpKill
+        %195 = OpLabel
+        %196 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %197 = OpLoad %float %196
+        %198 = OpConvertFToS %int %197
+        %199 = OpSLessThan %bool %198 %int_180
+               OpSelectionMerge %200 None
+               OpBranchConditional %199 %201 %202
+        %201 = OpLabel
+        %203 = OpAccessChain %_ptr_Private_int %data %int_5
+        %204 = OpLoad %int %203
+        %205 = OpConvertSToF %float %204
+        %206 = OpFDiv %float %205 %float_10
+        %207 = OpFAdd %float %float_0_5 %206
+               OpStore %grey %207
+               OpBranch %200
+        %202 = OpLabel
+        %208 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %209 = OpLoad %float %208
+        %210 = OpConvertFToS %int %209
+        %211 = OpSLessThan %bool %210 %int_210
+               OpSelectionMerge %212 None
+               OpBranchConditional %211 %213 %214
+        %213 = OpLabel
+        %215 = OpAccessChain %_ptr_Private_int %data %int_6
+        %216 = OpLoad %int %215
+        %217 = OpConvertSToF %float %216
+        %218 = OpFDiv %float %217 %float_10
+        %219 = OpFAdd %float %float_0_5 %218
+               OpStore %grey %219
+               OpBranch %212
+        %214 = OpLabel
+        %220 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %221 = OpLoad %float %220
+        %222 = OpConvertFToS %int %221
+        %223 = OpSLessThan %bool %222 %int_240
+               OpSelectionMerge %224 None
+               OpBranchConditional %223 %225 %226
+        %225 = OpLabel
+        %227 = OpAccessChain %_ptr_Private_int %data %int_7
+        %228 = OpLoad %int %227
+        %229 = OpConvertSToF %float %228
+        %230 = OpFDiv %float %229 %float_10
+        %231 = OpFAdd %float %float_0_5 %230
+               OpStore %grey %231
+               OpBranch %224
+        %226 = OpLabel
+        %232 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %233 = OpLoad %float %232
+        %234 = OpConvertFToS %int %233
+        %235 = OpSLessThan %bool %234 %int_270
+               OpSelectionMerge %236 None
+               OpBranchConditional %235 %237 %238
+        %237 = OpLabel
+        %239 = OpAccessChain %_ptr_Private_int %data %int_8
+        %240 = OpLoad %int %239
+        %241 = OpConvertSToF %float %240
+        %242 = OpFDiv %float %241 %float_10
+        %243 = OpFAdd %float %float_0_5 %242
+               OpStore %grey %243
+               OpBranch %236
+        %238 = OpLabel
+               OpKill
+        %236 = OpLabel
+               OpBranch %224
+        %224 = OpLabel
+               OpBranch %212
+        %212 = OpLabel
+               OpBranch %200
+        %200 = OpLabel
+               OpBranch %193
+        %193 = OpLabel
+               OpBranch %181
+        %181 = OpLabel
+               OpBranch %169
+        %169 = OpLabel
+               OpBranch %157
+        %157 = OpLabel
+               OpBranch %145
+        %145 = OpLabel
+        %244 = OpLoad %float %grey
+        %245 = OpCompositeConstruct %v3float %244 %244 %244
+        %246 = OpCompositeExtract %float %245 0
+        %247 = OpCompositeExtract %float %245 1
+        %248 = OpCompositeExtract %float %245 2
+        %249 = OpCompositeConstruct %v4float %246 %247 %248 %float_1
+               OpStore %_GLF_color %249
+               OpReturn
+               OpFunctionEnd
+%merge_i1_i1_i1_ = OpFunction %void None %35
+       %from = OpFunctionParameter %_ptr_Function_int
+        %mid = OpFunctionParameter %_ptr_Function_int
+         %to = OpFunctionParameter %_ptr_Function_int
+        %250 = OpLabel
+          %k = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+          %j = OpVariable %_ptr_Function_int Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+        %251 = OpLoad %int %from
+               OpStore %k %251
+        %252 = OpLoad %int %from
+               OpStore %i %252
+        %253 = OpLoad %int %mid
+        %254 = OpIAdd %int %253 %int_1
+               OpStore %j %254
+               OpBranch %255
+        %255 = OpLabel
+               OpLoopMerge %256 %257 None
+               OpBranch %258
+        %258 = OpLabel
+        %259 = OpLoad %int %i
+        %260 = OpLoad %int %mid
+        %261 = OpSLessThanEqual %bool %259 %260
+        %262 = OpLoad %int %j
+        %263 = OpLoad %int %to
+        %264 = OpSLessThanEqual %bool %262 %263
+        %265 = OpLogicalAnd %bool %261 %264
+               OpBranchConditional %265 %266 %256
+        %266 = OpLabel
+        %267 = OpLoad %int %i
+        %268 = OpAccessChain %_ptr_Private_int %data %267
+        %269 = OpLoad %int %268
+        %270 = OpLoad %int %j
+        %271 = OpAccessChain %_ptr_Private_int %data %270
+        %272 = OpLoad %int %271
+        %273 = OpSLessThan %bool %269 %272
+               OpSelectionMerge %274 None
+               OpBranchConditional %273 %275 %276
+        %275 = OpLabel
+        %277 = OpLoad %int %k
+        %278 = OpIAdd %int %277 %int_1
+               OpStore %k %278
+        %279 = OpLoad %int %i
+        %280 = OpIAdd %int %279 %int_1
+               OpStore %i %280
+        %281 = OpAccessChain %_ptr_Private_int %data %279
+        %282 = OpLoad %int %281
+        %283 = OpAccessChain %_ptr_Private_int %temp %277
+               OpStore %283 %282
+               OpBranch %274
+        %276 = OpLabel
+        %284 = OpLoad %int %k
+        %285 = OpIAdd %int %284 %int_1
+               OpStore %k %285
+        %286 = OpLoad %int %j
+        %287 = OpIAdd %int %286 %int_1
+               OpStore %j %287
+        %288 = OpAccessChain %_ptr_Private_int %data %286
+        %289 = OpLoad %int %288
+        %290 = OpAccessChain %_ptr_Private_int %temp %284
+               OpStore %290 %289
+               OpBranch %274
+        %274 = OpLabel
+               OpBranch %257
+        %257 = OpLabel
+               OpBranch %255
+        %256 = OpLabel
+               OpBranch %291
+        %291 = OpLabel
+               OpLoopMerge %292 %293 None
+               OpBranch %294
+        %294 = OpLabel
+        %295 = OpLoad %int %i
+        %296 = OpSLessThan %bool %295 %int_10
+        %297 = OpLoad %int %i
+        %298 = OpLoad %int %mid
+        %299 = OpSLessThanEqual %bool %297 %298
+        %300 = OpLogicalAnd %bool %296 %299
+               OpBranchConditional %300 %301 %292
+        %301 = OpLabel
+        %302 = OpLoad %int %k
+        %303 = OpIAdd %int %302 %int_1
+               OpStore %k %303
+        %304 = OpLoad %int %i
+        %305 = OpIAdd %int %304 %int_1
+               OpStore %i %305
+        %306 = OpAccessChain %_ptr_Private_int %data %304
+        %307 = OpLoad %int %306
+        %308 = OpAccessChain %_ptr_Private_int %temp %302
+               OpStore %308 %307
+               OpBranch %293
+        %293 = OpLabel
+               OpBranch %291
+        %292 = OpLabel
+        %309 = OpLoad %int %from
+               OpStore %i_0 %309
+               OpBranch %310
+        %310 = OpLabel
+               OpLoopMerge %311 %312 None
+               OpBranch %313
+        %313 = OpLabel
+        %314 = OpLoad %int %i_0
+        %315 = OpLoad %int %to
+        %316 = OpSLessThanEqual %bool %314 %315
+               OpBranchConditional %316 %317 %311
+        %317 = OpLabel
+        %318 = OpLoad %int %i_0
+        %319 = OpLoad %int %i_0
+        %320 = OpAccessChain %_ptr_Private_int %temp %319
+        %321 = OpLoad %int %320
+        %322 = OpAccessChain %_ptr_Private_int %data %318
+               OpStore %322 %321
+               OpBranch %312
+        %312 = OpLabel
+        %323 = OpLoad %int %i_0
+        %324 = OpIAdd %int %323 %int_1
+               OpStore %i_0 %324
+               OpBranch %310
+        %311 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %mergeSort_ = OpFunction %void None %32
+        %325 = OpLabel
+        %low = OpVariable %_ptr_Function_int Function
+       %high = OpVariable %_ptr_Function_int Function
+          %m = OpVariable %_ptr_Function_int Function
+        %i_1 = OpVariable %_ptr_Function_int Function
+     %from_0 = OpVariable %_ptr_Function_int Function
+      %mid_0 = OpVariable %_ptr_Function_int Function
+       %to_0 = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_int Function
+    %param_0 = OpVariable %_ptr_Function_int Function
+    %param_1 = OpVariable %_ptr_Function_int Function
+               OpStore %low %int_0
+               OpStore %high %int_9
+               OpStore %m %int_1
+               OpBranch %326
+        %326 = OpLabel
+               OpLoopMerge %327 %328 None
+               OpBranch %329
+        %329 = OpLabel
+        %330 = OpLoad %int %m
+        %331 = OpLoad %int %high
+        %332 = OpSLessThanEqual %bool %330 %331
+               OpBranchConditional %332 %333 %327
+        %333 = OpLabel
+        %334 = OpLoad %int %low
+               OpStore %i_1 %334
+               OpBranch %335
+        %335 = OpLabel
+               OpLoopMerge %336 %337 None
+               OpBranch %338
+        %338 = OpLabel
+        %339 = OpLoad %int %i_1
+        %340 = OpLoad %int %high
+        %341 = OpSLessThan %bool %339 %340
+               OpBranchConditional %341 %342 %336
+        %342 = OpLabel
+        %343 = OpLoad %int %i_1
+               OpStore %from_0 %343
+        %344 = OpLoad %int %i_1
+        %345 = OpLoad %int %m
+        %346 = OpIAdd %int %344 %345
+        %347 = OpISub %int %346 %int_1
+               OpStore %mid_0 %347
+        %348 = OpLoad %int %i_1
+        %349 = OpLoad %int %m
+        %350 = OpIMul %int %int_2 %349
+        %351 = OpIAdd %int %348 %350
+        %352 = OpISub %int %351 %int_1
+        %353 = OpLoad %int %high
+        %354 = OpExtInst %int %1 SMin %352 %353
+               OpStore %to_0 %354
+        %355 = OpLoad %int %from_0
+               OpStore %param %355
+        %356 = OpLoad %int %mid_0
+               OpStore %param_0 %356
+        %357 = OpLoad %int %to_0
+               OpStore %param_1 %357
+        %358 = OpFunctionCall %void %merge_i1_i1_i1_ %param %param_0 %param_1
+               OpBranch %337
+        %337 = OpLabel
+        %359 = OpLoad %int %m
+        %360 = OpIMul %int %int_2 %359
+        %361 = OpLoad %int %i_1
+        %362 = OpIAdd %int %361 %360
+               OpStore %i_1 %362
+               OpBranch %335
+        %336 = OpLabel
+               OpBranch %328
+        %328 = OpLabel
+        %363 = OpLoad %int %m
+        %364 = OpIMul %int %int_2 %363
+               OpStore %m %364
+               OpBranch %326
+        %327 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..6a30ba4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/0.spvasm.expected.hlsl
@@ -0,0 +1,268 @@
+static int data[10] = (int[10])0;
+static int temp[10] = (int[10])0;
+cbuffer cbuffer_x_28 : register(b0, space0) {
+  uint4 x_28[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void merge_i1_i1_i1_(inout int from, inout int mid, inout int to) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  const int x_251 = from;
+  k = x_251;
+  const int x_252 = from;
+  i = x_252;
+  const int x_253 = mid;
+  j = (x_253 + 1);
+  while (true) {
+    const int x_259 = i;
+    const int x_260 = mid;
+    const int x_262 = j;
+    const int x_263 = to;
+    bool tint_tmp = (x_259 <= x_260);
+    if (tint_tmp) {
+      tint_tmp = (x_262 <= x_263);
+    }
+    if ((tint_tmp)) {
+    } else {
+      break;
+    }
+    const int x_269 = data[i];
+    const int x_272 = data[j];
+    if ((x_269 < x_272)) {
+      const int x_277 = k;
+      k = (x_277 + 1);
+      const int x_279 = i;
+      i = (x_279 + 1);
+      const int x_282 = data[x_279];
+      temp[x_277] = x_282;
+    } else {
+      const int x_284 = k;
+      k = (x_284 + 1);
+      const int x_286 = j;
+      j = (x_286 + 1);
+      const int x_289 = data[x_286];
+      temp[x_284] = x_289;
+    }
+  }
+  while (true) {
+    const int x_295 = i;
+    const int x_297 = i;
+    const int x_298 = mid;
+    bool tint_tmp_1 = (x_295 < 10);
+    if (tint_tmp_1) {
+      tint_tmp_1 = (x_297 <= x_298);
+    }
+    if ((tint_tmp_1)) {
+    } else {
+      break;
+    }
+    const int x_302 = k;
+    k = (x_302 + 1);
+    const int x_304 = i;
+    i = (x_304 + 1);
+    const int x_307 = data[x_304];
+    temp[x_302] = x_307;
+  }
+  const int x_309 = from;
+  i_1 = x_309;
+  while (true) {
+    const int x_314 = i_1;
+    const int x_315 = to;
+    if ((x_314 <= x_315)) {
+    } else {
+      break;
+    }
+    const int x_318 = i_1;
+    const int x_321 = temp[i_1];
+    data[x_318] = x_321;
+    {
+      i_1 = (i_1 + 1);
+    }
+  }
+  return;
+}
+
+void mergeSort_() {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  {
+    for(; (m <= high); m = (2 * m)) {
+      i_2 = low;
+      {
+        for(; (i_2 < high); i_2 = (i_2 + (2 * m))) {
+          from_1 = i_2;
+          mid_1 = ((i_2 + m) - 1);
+          to_1 = min(((i_2 + (2 * m)) - 1), high);
+          param = from_1;
+          param_1 = mid_1;
+          param_2 = to_1;
+          merge_i1_i1_i1_(param, param_1, param_2);
+        }
+      }
+    }
+  }
+  return;
+}
+
+void main_1() {
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  const float x_84 = asfloat(x_28[0].x);
+  i_3 = int(x_84);
+  while (true) {
+    switch(i_3) {
+      case 9: {
+        data[i_3] = -5;
+        break;
+      }
+      case 8: {
+        data[i_3] = -4;
+        break;
+      }
+      case 7: {
+        data[i_3] = -3;
+        break;
+      }
+      case 6: {
+        data[i_3] = -2;
+        break;
+      }
+      case 5: {
+        data[i_3] = -1;
+        break;
+      }
+      case 4: {
+        data[i_3] = 0;
+        break;
+      }
+      case 3: {
+        data[i_3] = 1;
+        break;
+      }
+      case 2: {
+        data[i_3] = 2;
+        break;
+      }
+      case 1: {
+        data[i_3] = 3;
+        break;
+      }
+      case 0: {
+        data[i_3] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    i_3 = (i_3 + 1);
+    {
+      if ((i_3 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  {
+    for(; (j_1 < 10); j_1 = (j_1 + 1)) {
+      const int x_133 = j_1;
+      const int x_136 = data[j_1];
+      temp[x_133] = x_136;
+    }
+  }
+  mergeSort_();
+  const float x_142 = gl_FragCoord.y;
+  if ((int(x_142) < 30)) {
+    const int x_149 = data[0];
+    grey = (0.5f + (float(x_149) / 10.0f));
+  } else {
+    const float x_154 = gl_FragCoord.y;
+    if ((int(x_154) < 60)) {
+      const int x_161 = data[1];
+      grey = (0.5f + (float(x_161) / 10.0f));
+    } else {
+      const float x_166 = gl_FragCoord.y;
+      if ((int(x_166) < 90)) {
+        const int x_173 = data[2];
+        grey = (0.5f + (float(x_173) / 10.0f));
+      } else {
+        const float x_178 = gl_FragCoord.y;
+        if ((int(x_178) < 120)) {
+          const int x_185 = data[3];
+          grey = (0.5f + (float(x_185) / 10.0f));
+        } else {
+          const float x_190 = gl_FragCoord.y;
+          if ((int(x_190) < 150)) {
+            discard;
+          } else {
+            const float x_197 = gl_FragCoord.y;
+            if ((int(x_197) < 180)) {
+              const int x_204 = data[5];
+              grey = (0.5f + (float(x_204) / 10.0f));
+            } else {
+              const float x_209 = gl_FragCoord.y;
+              if ((int(x_209) < 210)) {
+                const int x_216 = data[6];
+                grey = (0.5f + (float(x_216) / 10.0f));
+              } else {
+                const float x_221 = gl_FragCoord.y;
+                if ((int(x_221) < 240)) {
+                  const int x_228 = data[7];
+                  grey = (0.5f + (float(x_228) / 10.0f));
+                } else {
+                  const float x_233 = gl_FragCoord.y;
+                  if ((int(x_233) < 270)) {
+                    const int x_240 = data[8];
+                    grey = (0.5f + (float(x_240) / 10.0f));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  const float x_244 = grey;
+  const float3 x_245 = float3(x_244, x_244, x_244);
+  x_GLF_color = float4(x_245.x, x_245.y, x_245.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/0.spvasm.expected.msl
new file mode 100644
index 0000000..6340b47
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/0.spvasm.expected.msl
@@ -0,0 +1,314 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void merge_i1_i1_i1_(thread int* const from, thread int* const mid, thread int* const to, thread tint_array_wrapper* const tint_symbol_5, thread tint_array_wrapper* const tint_symbol_6) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  int const x_251 = *(from);
+  k = x_251;
+  int const x_252 = *(from);
+  i = x_252;
+  int const x_253 = *(mid);
+  j = (x_253 + 1);
+  while (true) {
+    int const x_259 = i;
+    int const x_260 = *(mid);
+    int const x_262 = j;
+    int const x_263 = *(to);
+    if (((x_259 <= x_260) && (x_262 <= x_263))) {
+    } else {
+      break;
+    }
+    int const x_267 = i;
+    int const x_269 = (*(tint_symbol_5)).arr[x_267];
+    int const x_270 = j;
+    int const x_272 = (*(tint_symbol_5)).arr[x_270];
+    if ((x_269 < x_272)) {
+      int const x_277 = k;
+      k = (x_277 + 1);
+      int const x_279 = i;
+      i = (x_279 + 1);
+      int const x_282 = (*(tint_symbol_5)).arr[x_279];
+      (*(tint_symbol_6)).arr[x_277] = x_282;
+    } else {
+      int const x_284 = k;
+      k = (x_284 + 1);
+      int const x_286 = j;
+      j = (x_286 + 1);
+      int const x_289 = (*(tint_symbol_5)).arr[x_286];
+      (*(tint_symbol_6)).arr[x_284] = x_289;
+    }
+  }
+  while (true) {
+    int const x_295 = i;
+    int const x_297 = i;
+    int const x_298 = *(mid);
+    if (((x_295 < 10) && (x_297 <= x_298))) {
+    } else {
+      break;
+    }
+    int const x_302 = k;
+    k = (x_302 + 1);
+    int const x_304 = i;
+    i = (x_304 + 1);
+    int const x_307 = (*(tint_symbol_5)).arr[x_304];
+    (*(tint_symbol_6)).arr[x_302] = x_307;
+  }
+  int const x_309 = *(from);
+  i_1 = x_309;
+  while (true) {
+    int const x_314 = i_1;
+    int const x_315 = *(to);
+    if ((x_314 <= x_315)) {
+    } else {
+      break;
+    }
+    int const x_318 = i_1;
+    int const x_319 = i_1;
+    int const x_321 = (*(tint_symbol_6)).arr[x_319];
+    (*(tint_symbol_5)).arr[x_318] = x_321;
+    {
+      int const x_323 = i_1;
+      i_1 = (x_323 + 1);
+    }
+  }
+  return;
+}
+
+void mergeSort_(thread tint_array_wrapper* const tint_symbol_7, thread tint_array_wrapper* const tint_symbol_8) {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  while (true) {
+    int const x_330 = m;
+    int const x_331 = high;
+    if ((x_330 <= x_331)) {
+    } else {
+      break;
+    }
+    int const x_334 = low;
+    i_2 = x_334;
+    while (true) {
+      int const x_339 = i_2;
+      int const x_340 = high;
+      if ((x_339 < x_340)) {
+      } else {
+        break;
+      }
+      int const x_343 = i_2;
+      from_1 = x_343;
+      int const x_344 = i_2;
+      int const x_345 = m;
+      mid_1 = ((x_344 + x_345) - 1);
+      int const x_348 = i_2;
+      int const x_349 = m;
+      int const x_353 = high;
+      to_1 = min(((x_348 + (2 * x_349)) - 1), x_353);
+      int const x_355 = from_1;
+      param = x_355;
+      int const x_356 = mid_1;
+      param_1 = x_356;
+      int const x_357 = to_1;
+      param_2 = x_357;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2), tint_symbol_7, tint_symbol_8);
+      {
+        int const x_359 = m;
+        int const x_361 = i_2;
+        i_2 = (x_361 + (2 * x_359));
+      }
+    }
+    {
+      int const x_363 = m;
+      m = (2 * x_363);
+    }
+  }
+  return;
+}
+
+void main_1(constant buf0& x_28, thread tint_array_wrapper* const tint_symbol_9, thread tint_array_wrapper* const tint_symbol_10, thread float4* const tint_symbol_11, thread float4* const tint_symbol_12) {
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  float const x_84 = x_28.injectionSwitch.x;
+  i_3 = int(x_84);
+  while (true) {
+    int const x_90 = i_3;
+    switch(x_90) {
+      case 9: {
+        int const x_120 = i_3;
+        (*(tint_symbol_9)).arr[x_120] = -5;
+        break;
+      }
+      case 8: {
+        int const x_118 = i_3;
+        (*(tint_symbol_9)).arr[x_118] = -4;
+        break;
+      }
+      case 7: {
+        int const x_116 = i_3;
+        (*(tint_symbol_9)).arr[x_116] = -3;
+        break;
+      }
+      case 6: {
+        int const x_114 = i_3;
+        (*(tint_symbol_9)).arr[x_114] = -2;
+        break;
+      }
+      case 5: {
+        int const x_112 = i_3;
+        (*(tint_symbol_9)).arr[x_112] = -1;
+        break;
+      }
+      case 4: {
+        int const x_110 = i_3;
+        (*(tint_symbol_9)).arr[x_110] = 0;
+        break;
+      }
+      case 3: {
+        int const x_108 = i_3;
+        (*(tint_symbol_9)).arr[x_108] = 1;
+        break;
+      }
+      case 2: {
+        int const x_106 = i_3;
+        (*(tint_symbol_9)).arr[x_106] = 2;
+        break;
+      }
+      case 1: {
+        int const x_104 = i_3;
+        (*(tint_symbol_9)).arr[x_104] = 3;
+        break;
+      }
+      case 0: {
+        int const x_102 = i_3;
+        (*(tint_symbol_9)).arr[x_102] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    int const x_122 = i_3;
+    i_3 = (x_122 + 1);
+    {
+      int const x_124 = i_3;
+      if ((x_124 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  while (true) {
+    int const x_130 = j_1;
+    if ((x_130 < 10)) {
+    } else {
+      break;
+    }
+    int const x_133 = j_1;
+    int const x_134 = j_1;
+    int const x_136 = (*(tint_symbol_9)).arr[x_134];
+    (*(tint_symbol_10)).arr[x_133] = x_136;
+    {
+      int const x_138 = j_1;
+      j_1 = (x_138 + 1);
+    }
+  }
+  mergeSort_(tint_symbol_9, tint_symbol_10);
+  float const x_142 = (*(tint_symbol_11)).y;
+  if ((int(x_142) < 30)) {
+    int const x_149 = (*(tint_symbol_9)).arr[0];
+    grey = (0.5f + (float(x_149) / 10.0f));
+  } else {
+    float const x_154 = (*(tint_symbol_11)).y;
+    if ((int(x_154) < 60)) {
+      int const x_161 = (*(tint_symbol_9)).arr[1];
+      grey = (0.5f + (float(x_161) / 10.0f));
+    } else {
+      float const x_166 = (*(tint_symbol_11)).y;
+      if ((int(x_166) < 90)) {
+        int const x_173 = (*(tint_symbol_9)).arr[2];
+        grey = (0.5f + (float(x_173) / 10.0f));
+      } else {
+        float const x_178 = (*(tint_symbol_11)).y;
+        if ((int(x_178) < 120)) {
+          int const x_185 = (*(tint_symbol_9)).arr[3];
+          grey = (0.5f + (float(x_185) / 10.0f));
+        } else {
+          float const x_190 = (*(tint_symbol_11)).y;
+          if ((int(x_190) < 150)) {
+            discard_fragment();
+          } else {
+            float const x_197 = (*(tint_symbol_11)).y;
+            if ((int(x_197) < 180)) {
+              int const x_204 = (*(tint_symbol_9)).arr[5];
+              grey = (0.5f + (float(x_204) / 10.0f));
+            } else {
+              float const x_209 = (*(tint_symbol_11)).y;
+              if ((int(x_209) < 210)) {
+                int const x_216 = (*(tint_symbol_9)).arr[6];
+                grey = (0.5f + (float(x_216) / 10.0f));
+              } else {
+                float const x_221 = (*(tint_symbol_11)).y;
+                if ((int(x_221) < 240)) {
+                  int const x_228 = (*(tint_symbol_9)).arr[7];
+                  grey = (0.5f + (float(x_228) / 10.0f));
+                } else {
+                  float const x_233 = (*(tint_symbol_11)).y;
+                  if ((int(x_233) < 270)) {
+                    int const x_240 = (*(tint_symbol_9)).arr[8];
+                    grey = (0.5f + (float(x_240) / 10.0f));
+                  } else {
+                    discard_fragment();
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  float const x_244 = grey;
+  float3 const x_245 = float3(x_244, x_244, x_244);
+  *(tint_symbol_12) = float4(x_245.x, x_245.y, x_245.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_28 [[buffer(0)]]) {
+  thread float4 tint_symbol_13 = 0.0f;
+  thread tint_array_wrapper tint_symbol_14 = {};
+  thread tint_array_wrapper tint_symbol_15 = {};
+  thread float4 tint_symbol_16 = 0.0f;
+  tint_symbol_13 = gl_FragCoord_param;
+  main_1(x_28, &(tint_symbol_14), &(tint_symbol_15), &(tint_symbol_13), &(tint_symbol_16));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_16};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..4df39a6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/0.spvasm.expected.spvasm
@@ -0,0 +1,649 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 416
+; Schema: 0
+               OpCapability Shader
+        %177 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %data "data"
+               OpName %temp "temp"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_28 "x_28"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %merge_i1_i1_i1_ "merge_i1_i1_i1_"
+               OpName %from "from"
+               OpName %mid "mid"
+               OpName %to "to"
+               OpName %k "k"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %i_1 "i_1"
+               OpName %mergeSort_ "mergeSort_"
+               OpName %low "low"
+               OpName %high "high"
+               OpName %m "m"
+               OpName %i_2 "i_2"
+               OpName %from_1 "from_1"
+               OpName %mid_1 "mid_1"
+               OpName %to_1 "to_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %main_1 "main_1"
+               OpName %i_3 "i_3"
+               OpName %j_1 "j_1"
+               OpName %grey "grey"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_28 NonWritable
+               OpDecorate %x_28 DescriptorSet 0
+               OpDecorate %x_28 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Private__arr_int_uint_10 = OpTypePointer Private %_arr_int_uint_10
+          %7 = OpConstantNull %_arr_int_uint_10
+       %data = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+       %temp = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_28 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %17
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int %_ptr_Function_int
+         %32 = OpConstantNull %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+%_ptr_Private_int = OpTypePointer Private %int
+     %int_10 = OpConstant %int 10
+        %132 = OpTypeFunction %void
+      %int_0 = OpConstant %int 0
+      %int_9 = OpConstant %int 9
+      %int_2 = OpConstant %int 2
+%_ptr_Function_float = OpTypePointer Function %float
+        %201 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %int_n5 = OpConstant %int -5
+     %int_n4 = OpConstant %int -4
+     %int_n3 = OpConstant %int -3
+     %int_n2 = OpConstant %int -2
+     %int_n1 = OpConstant %int -1
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %int_30 = OpConstant %int 30
+  %float_0_5 = OpConstant %float 0.5
+   %float_10 = OpConstant %float 10
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+    %v3float = OpTypeVector %float 3
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %403 = OpTypeFunction %void %main_out
+%merge_i1_i1_i1_ = OpFunction %void None %23
+       %from = OpFunctionParameter %_ptr_Function_int
+        %mid = OpFunctionParameter %_ptr_Function_int
+         %to = OpFunctionParameter %_ptr_Function_int
+         %30 = OpLabel
+          %k = OpVariable %_ptr_Function_int Function %32
+          %i = OpVariable %_ptr_Function_int Function %32
+          %j = OpVariable %_ptr_Function_int Function %32
+        %i_1 = OpVariable %_ptr_Function_int Function %32
+         %37 = OpLoad %int %from
+               OpStore %k %37
+         %39 = OpLoad %int %from
+               OpStore %i %39
+         %41 = OpLoad %int %mid
+         %43 = OpIAdd %int %41 %int_1
+               OpStore %j %43
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %48 = OpLoad %int %i
+         %50 = OpLoad %int %mid
+         %51 = OpLoad %int %j
+         %53 = OpLoad %int %to
+         %54 = OpSLessThanEqual %bool %48 %50
+               OpSelectionMerge %56 None
+               OpBranchConditional %54 %57 %56
+         %57 = OpLabel
+         %58 = OpSLessThanEqual %bool %51 %53
+               OpBranch %56
+         %56 = OpLabel
+         %59 = OpPhi %bool %54 %47 %58 %57
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %62
+         %61 = OpLabel
+               OpBranch %60
+         %62 = OpLabel
+               OpBranch %45
+         %60 = OpLabel
+         %63 = OpLoad %int %i
+         %65 = OpAccessChain %_ptr_Private_int %data %63
+         %66 = OpLoad %int %65
+         %67 = OpLoad %int %j
+         %68 = OpAccessChain %_ptr_Private_int %data %67
+         %69 = OpLoad %int %68
+         %70 = OpSLessThan %bool %66 %69
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %73
+         %72 = OpLabel
+         %74 = OpLoad %int %k
+         %75 = OpIAdd %int %74 %int_1
+               OpStore %k %75
+         %76 = OpLoad %int %i
+         %77 = OpIAdd %int %76 %int_1
+               OpStore %i %77
+         %78 = OpAccessChain %_ptr_Private_int %data %76
+         %79 = OpLoad %int %78
+         %80 = OpAccessChain %_ptr_Private_int %temp %74
+               OpStore %80 %79
+               OpBranch %71
+         %73 = OpLabel
+         %81 = OpLoad %int %k
+         %82 = OpIAdd %int %81 %int_1
+               OpStore %k %82
+         %83 = OpLoad %int %j
+         %84 = OpIAdd %int %83 %int_1
+               OpStore %j %84
+         %85 = OpAccessChain %_ptr_Private_int %data %83
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_Private_int %temp %81
+               OpStore %87 %86
+               OpBranch %71
+         %71 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+               OpBranch %44
+         %45 = OpLabel
+               OpBranch %88
+         %88 = OpLabel
+               OpLoopMerge %89 %90 None
+               OpBranch %91
+         %91 = OpLabel
+         %92 = OpLoad %int %i
+         %93 = OpLoad %int %i
+         %95 = OpLoad %int %mid
+         %97 = OpSLessThan %bool %92 %int_10
+               OpSelectionMerge %98 None
+               OpBranchConditional %97 %99 %98
+         %99 = OpLabel
+        %100 = OpSLessThanEqual %bool %93 %95
+               OpBranch %98
+         %98 = OpLabel
+        %101 = OpPhi %bool %97 %91 %100 %99
+               OpSelectionMerge %102 None
+               OpBranchConditional %101 %103 %104
+        %103 = OpLabel
+               OpBranch %102
+        %104 = OpLabel
+               OpBranch %89
+        %102 = OpLabel
+        %105 = OpLoad %int %k
+        %106 = OpIAdd %int %105 %int_1
+               OpStore %k %106
+        %107 = OpLoad %int %i
+        %108 = OpIAdd %int %107 %int_1
+               OpStore %i %108
+        %109 = OpAccessChain %_ptr_Private_int %data %107
+        %110 = OpLoad %int %109
+        %111 = OpAccessChain %_ptr_Private_int %temp %105
+               OpStore %111 %110
+               OpBranch %90
+         %90 = OpLabel
+               OpBranch %88
+         %89 = OpLabel
+        %113 = OpLoad %int %from
+               OpStore %i_1 %113
+               OpBranch %114
+        %114 = OpLabel
+               OpLoopMerge %115 %116 None
+               OpBranch %117
+        %117 = OpLabel
+        %118 = OpLoad %int %i_1
+        %120 = OpLoad %int %to
+        %121 = OpSLessThanEqual %bool %118 %120
+               OpSelectionMerge %122 None
+               OpBranchConditional %121 %123 %124
+        %123 = OpLabel
+               OpBranch %122
+        %124 = OpLabel
+               OpBranch %115
+        %122 = OpLabel
+        %125 = OpLoad %int %i_1
+        %126 = OpLoad %int %i_1
+        %127 = OpAccessChain %_ptr_Private_int %temp %126
+        %128 = OpLoad %int %127
+        %129 = OpAccessChain %_ptr_Private_int %data %125
+               OpStore %129 %128
+               OpBranch %116
+        %116 = OpLabel
+        %130 = OpLoad %int %i_1
+        %131 = OpIAdd %int %130 %int_1
+               OpStore %i_1 %131
+               OpBranch %114
+        %115 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %mergeSort_ = OpFunction %void None %132
+        %134 = OpLabel
+        %low = OpVariable %_ptr_Function_int Function %32
+       %high = OpVariable %_ptr_Function_int Function %32
+          %m = OpVariable %_ptr_Function_int Function %32
+        %i_2 = OpVariable %_ptr_Function_int Function %32
+     %from_1 = OpVariable %_ptr_Function_int Function %32
+      %mid_1 = OpVariable %_ptr_Function_int Function %32
+       %to_1 = OpVariable %_ptr_Function_int Function %32
+      %param = OpVariable %_ptr_Function_int Function %32
+    %param_1 = OpVariable %_ptr_Function_int Function %32
+    %param_2 = OpVariable %_ptr_Function_int Function %32
+               OpStore %low %int_0
+               OpStore %high %int_9
+               OpStore %m %int_1
+               OpBranch %147
+        %147 = OpLabel
+               OpLoopMerge %148 %149 None
+               OpBranch %150
+        %150 = OpLabel
+        %151 = OpLoad %int %m
+        %152 = OpLoad %int %high
+        %153 = OpSLessThanEqual %bool %151 %152
+               OpSelectionMerge %154 None
+               OpBranchConditional %153 %155 %156
+        %155 = OpLabel
+               OpBranch %154
+        %156 = OpLabel
+               OpBranch %148
+        %154 = OpLabel
+        %157 = OpLoad %int %low
+               OpStore %i_2 %157
+               OpBranch %158
+        %158 = OpLabel
+               OpLoopMerge %159 %160 None
+               OpBranch %161
+        %161 = OpLabel
+        %162 = OpLoad %int %i_2
+        %163 = OpLoad %int %high
+        %164 = OpSLessThan %bool %162 %163
+               OpSelectionMerge %165 None
+               OpBranchConditional %164 %166 %167
+        %166 = OpLabel
+               OpBranch %165
+        %167 = OpLabel
+               OpBranch %159
+        %165 = OpLabel
+        %168 = OpLoad %int %i_2
+               OpStore %from_1 %168
+        %169 = OpLoad %int %i_2
+        %170 = OpLoad %int %m
+        %171 = OpIAdd %int %169 %170
+        %172 = OpISub %int %171 %int_1
+               OpStore %mid_1 %172
+        %173 = OpLoad %int %i_2
+        %174 = OpLoad %int %m
+        %175 = OpLoad %int %high
+        %179 = OpIMul %int %int_2 %174
+        %180 = OpIAdd %int %173 %179
+        %181 = OpISub %int %180 %int_1
+        %176 = OpExtInst %int %177 SMin %181 %175
+               OpStore %to_1 %176
+        %182 = OpLoad %int %from_1
+               OpStore %param %182
+        %183 = OpLoad %int %mid_1
+               OpStore %param_1 %183
+        %184 = OpLoad %int %to_1
+               OpStore %param_2 %184
+        %185 = OpFunctionCall %void %merge_i1_i1_i1_ %param %param_1 %param_2
+               OpBranch %160
+        %160 = OpLabel
+        %189 = OpLoad %int %m
+        %190 = OpLoad %int %i_2
+        %191 = OpIMul %int %int_2 %189
+        %192 = OpIAdd %int %190 %191
+               OpStore %i_2 %192
+               OpBranch %158
+        %159 = OpLabel
+               OpBranch %149
+        %149 = OpLabel
+        %193 = OpLoad %int %m
+        %194 = OpIMul %int %int_2 %193
+               OpStore %m %194
+               OpBranch %147
+        %148 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %132
+        %196 = OpLabel
+        %i_3 = OpVariable %_ptr_Function_int Function %32
+        %j_1 = OpVariable %_ptr_Function_int Function %32
+       %grey = OpVariable %_ptr_Function_float Function %201
+        %204 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_0
+        %205 = OpLoad %float %204
+        %206 = OpConvertFToS %int %205
+               OpStore %i_3 %206
+               OpBranch %207
+        %207 = OpLabel
+               OpLoopMerge %208 %209 None
+               OpBranch %210
+        %210 = OpLabel
+        %211 = OpLoad %int %i_3
+               OpSelectionMerge %212 None
+               OpSwitch %211 %213 9 %214 8 %215 7 %216 6 %217 5 %218 4 %219 3 %220 2 %221 1 %222 0 %223
+        %214 = OpLabel
+        %224 = OpLoad %int %i_3
+        %225 = OpAccessChain %_ptr_Private_int %data %224
+               OpStore %225 %int_n5
+               OpBranch %212
+        %215 = OpLabel
+        %227 = OpLoad %int %i_3
+        %228 = OpAccessChain %_ptr_Private_int %data %227
+               OpStore %228 %int_n4
+               OpBranch %212
+        %216 = OpLabel
+        %230 = OpLoad %int %i_3
+        %231 = OpAccessChain %_ptr_Private_int %data %230
+               OpStore %231 %int_n3
+               OpBranch %212
+        %217 = OpLabel
+        %233 = OpLoad %int %i_3
+        %234 = OpAccessChain %_ptr_Private_int %data %233
+               OpStore %234 %int_n2
+               OpBranch %212
+        %218 = OpLabel
+        %236 = OpLoad %int %i_3
+        %237 = OpAccessChain %_ptr_Private_int %data %236
+               OpStore %237 %int_n1
+               OpBranch %212
+        %219 = OpLabel
+        %239 = OpLoad %int %i_3
+        %240 = OpAccessChain %_ptr_Private_int %data %239
+               OpStore %240 %int_0
+               OpBranch %212
+        %220 = OpLabel
+        %241 = OpLoad %int %i_3
+        %242 = OpAccessChain %_ptr_Private_int %data %241
+               OpStore %242 %int_1
+               OpBranch %212
+        %221 = OpLabel
+        %243 = OpLoad %int %i_3
+        %244 = OpAccessChain %_ptr_Private_int %data %243
+               OpStore %244 %int_2
+               OpBranch %212
+        %222 = OpLabel
+        %245 = OpLoad %int %i_3
+        %246 = OpAccessChain %_ptr_Private_int %data %245
+               OpStore %246 %int_3
+               OpBranch %212
+        %223 = OpLabel
+        %248 = OpLoad %int %i_3
+        %249 = OpAccessChain %_ptr_Private_int %data %248
+               OpStore %249 %int_4
+               OpBranch %212
+        %213 = OpLabel
+               OpBranch %212
+        %212 = OpLabel
+        %251 = OpLoad %int %i_3
+        %252 = OpIAdd %int %251 %int_1
+               OpStore %i_3 %252
+               OpBranch %209
+        %209 = OpLabel
+        %253 = OpLoad %int %i_3
+        %254 = OpSLessThan %bool %253 %int_10
+               OpSelectionMerge %255 None
+               OpBranchConditional %254 %256 %257
+        %256 = OpLabel
+               OpBranch %255
+        %257 = OpLabel
+               OpBranch %208
+        %255 = OpLabel
+               OpBranch %207
+        %208 = OpLabel
+               OpStore %j_1 %int_0
+               OpBranch %258
+        %258 = OpLabel
+               OpLoopMerge %259 %260 None
+               OpBranch %261
+        %261 = OpLabel
+        %262 = OpLoad %int %j_1
+        %263 = OpSLessThan %bool %262 %int_10
+               OpSelectionMerge %264 None
+               OpBranchConditional %263 %265 %266
+        %265 = OpLabel
+               OpBranch %264
+        %266 = OpLabel
+               OpBranch %259
+        %264 = OpLabel
+        %267 = OpLoad %int %j_1
+        %268 = OpLoad %int %j_1
+        %269 = OpAccessChain %_ptr_Private_int %data %268
+        %270 = OpLoad %int %269
+        %271 = OpAccessChain %_ptr_Private_int %temp %267
+               OpStore %271 %270
+               OpBranch %260
+        %260 = OpLabel
+        %272 = OpLoad %int %j_1
+        %273 = OpIAdd %int %272 %int_1
+               OpStore %j_1 %273
+               OpBranch %258
+        %259 = OpLabel
+        %274 = OpFunctionCall %void %mergeSort_
+        %277 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %278 = OpLoad %float %277
+        %279 = OpConvertFToS %int %278
+        %281 = OpSLessThan %bool %279 %int_30
+               OpSelectionMerge %282 None
+               OpBranchConditional %281 %283 %284
+        %283 = OpLabel
+        %285 = OpAccessChain %_ptr_Private_int %data %int_0
+        %286 = OpLoad %int %285
+        %288 = OpConvertSToF %float %286
+        %290 = OpFDiv %float %288 %float_10
+        %291 = OpFAdd %float %float_0_5 %290
+               OpStore %grey %291
+               OpBranch %282
+        %284 = OpLabel
+        %292 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %293 = OpLoad %float %292
+        %294 = OpConvertFToS %int %293
+        %296 = OpSLessThan %bool %294 %int_60
+               OpSelectionMerge %297 None
+               OpBranchConditional %296 %298 %299
+        %298 = OpLabel
+        %300 = OpAccessChain %_ptr_Private_int %data %int_1
+        %301 = OpLoad %int %300
+        %302 = OpConvertSToF %float %301
+        %303 = OpFDiv %float %302 %float_10
+        %304 = OpFAdd %float %float_0_5 %303
+               OpStore %grey %304
+               OpBranch %297
+        %299 = OpLabel
+        %305 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %306 = OpLoad %float %305
+        %307 = OpConvertFToS %int %306
+        %309 = OpSLessThan %bool %307 %int_90
+               OpSelectionMerge %310 None
+               OpBranchConditional %309 %311 %312
+        %311 = OpLabel
+        %313 = OpAccessChain %_ptr_Private_int %data %int_2
+        %314 = OpLoad %int %313
+        %315 = OpConvertSToF %float %314
+        %316 = OpFDiv %float %315 %float_10
+        %317 = OpFAdd %float %float_0_5 %316
+               OpStore %grey %317
+               OpBranch %310
+        %312 = OpLabel
+        %318 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %319 = OpLoad %float %318
+        %320 = OpConvertFToS %int %319
+        %322 = OpSLessThan %bool %320 %int_120
+               OpSelectionMerge %323 None
+               OpBranchConditional %322 %324 %325
+        %324 = OpLabel
+        %326 = OpAccessChain %_ptr_Private_int %data %int_3
+        %327 = OpLoad %int %326
+        %328 = OpConvertSToF %float %327
+        %329 = OpFDiv %float %328 %float_10
+        %330 = OpFAdd %float %float_0_5 %329
+               OpStore %grey %330
+               OpBranch %323
+        %325 = OpLabel
+        %331 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %332 = OpLoad %float %331
+        %333 = OpConvertFToS %int %332
+        %335 = OpSLessThan %bool %333 %int_150
+               OpSelectionMerge %336 None
+               OpBranchConditional %335 %337 %338
+        %337 = OpLabel
+               OpKill
+        %338 = OpLabel
+        %339 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %340 = OpLoad %float %339
+        %341 = OpConvertFToS %int %340
+        %343 = OpSLessThan %bool %341 %int_180
+               OpSelectionMerge %344 None
+               OpBranchConditional %343 %345 %346
+        %345 = OpLabel
+        %348 = OpAccessChain %_ptr_Private_int %data %int_5
+        %349 = OpLoad %int %348
+        %350 = OpConvertSToF %float %349
+        %351 = OpFDiv %float %350 %float_10
+        %352 = OpFAdd %float %float_0_5 %351
+               OpStore %grey %352
+               OpBranch %344
+        %346 = OpLabel
+        %353 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %354 = OpLoad %float %353
+        %355 = OpConvertFToS %int %354
+        %357 = OpSLessThan %bool %355 %int_210
+               OpSelectionMerge %358 None
+               OpBranchConditional %357 %359 %360
+        %359 = OpLabel
+        %362 = OpAccessChain %_ptr_Private_int %data %int_6
+        %363 = OpLoad %int %362
+        %364 = OpConvertSToF %float %363
+        %365 = OpFDiv %float %364 %float_10
+        %366 = OpFAdd %float %float_0_5 %365
+               OpStore %grey %366
+               OpBranch %358
+        %360 = OpLabel
+        %367 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %368 = OpLoad %float %367
+        %369 = OpConvertFToS %int %368
+        %371 = OpSLessThan %bool %369 %int_240
+               OpSelectionMerge %372 None
+               OpBranchConditional %371 %373 %374
+        %373 = OpLabel
+        %376 = OpAccessChain %_ptr_Private_int %data %int_7
+        %377 = OpLoad %int %376
+        %378 = OpConvertSToF %float %377
+        %379 = OpFDiv %float %378 %float_10
+        %380 = OpFAdd %float %float_0_5 %379
+               OpStore %grey %380
+               OpBranch %372
+        %374 = OpLabel
+        %381 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %382 = OpLoad %float %381
+        %383 = OpConvertFToS %int %382
+        %385 = OpSLessThan %bool %383 %int_270
+               OpSelectionMerge %386 None
+               OpBranchConditional %385 %387 %388
+        %387 = OpLabel
+        %390 = OpAccessChain %_ptr_Private_int %data %int_8
+        %391 = OpLoad %int %390
+        %392 = OpConvertSToF %float %391
+        %393 = OpFDiv %float %392 %float_10
+        %394 = OpFAdd %float %float_0_5 %393
+               OpStore %grey %394
+               OpBranch %386
+        %388 = OpLabel
+               OpKill
+        %386 = OpLabel
+               OpBranch %372
+        %372 = OpLabel
+               OpBranch %358
+        %358 = OpLabel
+               OpBranch %344
+        %344 = OpLabel
+               OpBranch %336
+        %336 = OpLabel
+               OpBranch %323
+        %323 = OpLabel
+               OpBranch %310
+        %310 = OpLabel
+               OpBranch %297
+        %297 = OpLabel
+               OpBranch %282
+        %282 = OpLabel
+        %395 = OpLoad %float %grey
+        %397 = OpCompositeConstruct %v3float %395 %395 %395
+        %398 = OpCompositeExtract %float %397 0
+        %399 = OpCompositeExtract %float %397 1
+        %400 = OpCompositeExtract %float %397 2
+        %402 = OpCompositeConstruct %v4float %398 %399 %400 %float_1
+               OpStore %x_GLF_color %402
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %403
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %407 = OpLabel
+        %408 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %408
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %132
+        %410 = OpLabel
+        %411 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %411
+        %412 = OpFunctionCall %void %main_1
+        %414 = OpLoad %v4float %x_GLF_color
+        %415 = OpCompositeConstruct %main_out %414
+        %413 = OpFunctionCall %void %tint_symbol_3 %415
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 209[%209] is not post dominated by the back-edge block 255[%255]
+  %255 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..c8f464e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/0.spvasm.expected.wgsl
@@ -0,0 +1,306 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> data : array<i32, 10>;
+
+var<private> temp : array<i32, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn merge_i1_i1_i1_(from : ptr<function, i32>, mid : ptr<function, i32>, to : ptr<function, i32>) {
+  var k : i32;
+  var i : i32;
+  var j : i32;
+  var i_1 : i32;
+  let x_251 : i32 = *(from);
+  k = x_251;
+  let x_252 : i32 = *(from);
+  i = x_252;
+  let x_253 : i32 = *(mid);
+  j = (x_253 + 1);
+  loop {
+    let x_259 : i32 = i;
+    let x_260 : i32 = *(mid);
+    let x_262 : i32 = j;
+    let x_263 : i32 = *(to);
+    if (((x_259 <= x_260) && (x_262 <= x_263))) {
+    } else {
+      break;
+    }
+    let x_267 : i32 = i;
+    let x_269 : i32 = data[x_267];
+    let x_270 : i32 = j;
+    let x_272 : i32 = data[x_270];
+    if ((x_269 < x_272)) {
+      let x_277 : i32 = k;
+      k = (x_277 + 1);
+      let x_279 : i32 = i;
+      i = (x_279 + 1);
+      let x_282 : i32 = data[x_279];
+      temp[x_277] = x_282;
+    } else {
+      let x_284 : i32 = k;
+      k = (x_284 + 1);
+      let x_286 : i32 = j;
+      j = (x_286 + 1);
+      let x_289 : i32 = data[x_286];
+      temp[x_284] = x_289;
+    }
+  }
+  loop {
+    let x_295 : i32 = i;
+    let x_297 : i32 = i;
+    let x_298 : i32 = *(mid);
+    if (((x_295 < 10) && (x_297 <= x_298))) {
+    } else {
+      break;
+    }
+    let x_302 : i32 = k;
+    k = (x_302 + 1);
+    let x_304 : i32 = i;
+    i = (x_304 + 1);
+    let x_307 : i32 = data[x_304];
+    temp[x_302] = x_307;
+  }
+  let x_309 : i32 = *(from);
+  i_1 = x_309;
+  loop {
+    let x_314 : i32 = i_1;
+    let x_315 : i32 = *(to);
+    if ((x_314 <= x_315)) {
+    } else {
+      break;
+    }
+    let x_318 : i32 = i_1;
+    let x_319 : i32 = i_1;
+    let x_321 : i32 = temp[x_319];
+    data[x_318] = x_321;
+
+    continuing {
+      let x_323 : i32 = i_1;
+      i_1 = (x_323 + 1);
+    }
+  }
+  return;
+}
+
+fn mergeSort_() {
+  var low : i32;
+  var high : i32;
+  var m : i32;
+  var i_2 : i32;
+  var from_1 : i32;
+  var mid_1 : i32;
+  var to_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  low = 0;
+  high = 9;
+  m = 1;
+  loop {
+    let x_330 : i32 = m;
+    let x_331 : i32 = high;
+    if ((x_330 <= x_331)) {
+    } else {
+      break;
+    }
+    let x_334 : i32 = low;
+    i_2 = x_334;
+    loop {
+      let x_339 : i32 = i_2;
+      let x_340 : i32 = high;
+      if ((x_339 < x_340)) {
+      } else {
+        break;
+      }
+      let x_343 : i32 = i_2;
+      from_1 = x_343;
+      let x_344 : i32 = i_2;
+      let x_345 : i32 = m;
+      mid_1 = ((x_344 + x_345) - 1);
+      let x_348 : i32 = i_2;
+      let x_349 : i32 = m;
+      let x_353 : i32 = high;
+      to_1 = min(((x_348 + (2 * x_349)) - 1), x_353);
+      let x_355 : i32 = from_1;
+      param = x_355;
+      let x_356 : i32 = mid_1;
+      param_1 = x_356;
+      let x_357 : i32 = to_1;
+      param_2 = x_357;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2));
+
+      continuing {
+        let x_359 : i32 = m;
+        let x_361 : i32 = i_2;
+        i_2 = (x_361 + (2 * x_359));
+      }
+    }
+
+    continuing {
+      let x_363 : i32 = m;
+      m = (2 * x_363);
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_3 : i32;
+  var j_1 : i32;
+  var grey : f32;
+  let x_84 : f32 = x_28.injectionSwitch.x;
+  i_3 = i32(x_84);
+  loop {
+    let x_90 : i32 = i_3;
+    switch(x_90) {
+      case 9: {
+        let x_120 : i32 = i_3;
+        data[x_120] = -5;
+      }
+      case 8: {
+        let x_118 : i32 = i_3;
+        data[x_118] = -4;
+      }
+      case 7: {
+        let x_116 : i32 = i_3;
+        data[x_116] = -3;
+      }
+      case 6: {
+        let x_114 : i32 = i_3;
+        data[x_114] = -2;
+      }
+      case 5: {
+        let x_112 : i32 = i_3;
+        data[x_112] = -1;
+      }
+      case 4: {
+        let x_110 : i32 = i_3;
+        data[x_110] = 0;
+      }
+      case 3: {
+        let x_108 : i32 = i_3;
+        data[x_108] = 1;
+      }
+      case 2: {
+        let x_106 : i32 = i_3;
+        data[x_106] = 2;
+      }
+      case 1: {
+        let x_104 : i32 = i_3;
+        data[x_104] = 3;
+      }
+      case 0: {
+        let x_102 : i32 = i_3;
+        data[x_102] = 4;
+      }
+      default: {
+      }
+    }
+    let x_122 : i32 = i_3;
+    i_3 = (x_122 + 1);
+
+    continuing {
+      let x_124 : i32 = i_3;
+      if ((x_124 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  loop {
+    let x_130 : i32 = j_1;
+    if ((x_130 < 10)) {
+    } else {
+      break;
+    }
+    let x_133 : i32 = j_1;
+    let x_134 : i32 = j_1;
+    let x_136 : i32 = data[x_134];
+    temp[x_133] = x_136;
+
+    continuing {
+      let x_138 : i32 = j_1;
+      j_1 = (x_138 + 1);
+    }
+  }
+  mergeSort_();
+  let x_142 : f32 = gl_FragCoord.y;
+  if ((i32(x_142) < 30)) {
+    let x_149 : i32 = data[0];
+    grey = (0.5 + (f32(x_149) / 10.0));
+  } else {
+    let x_154 : f32 = gl_FragCoord.y;
+    if ((i32(x_154) < 60)) {
+      let x_161 : i32 = data[1];
+      grey = (0.5 + (f32(x_161) / 10.0));
+    } else {
+      let x_166 : f32 = gl_FragCoord.y;
+      if ((i32(x_166) < 90)) {
+        let x_173 : i32 = data[2];
+        grey = (0.5 + (f32(x_173) / 10.0));
+      } else {
+        let x_178 : f32 = gl_FragCoord.y;
+        if ((i32(x_178) < 120)) {
+          let x_185 : i32 = data[3];
+          grey = (0.5 + (f32(x_185) / 10.0));
+        } else {
+          let x_190 : f32 = gl_FragCoord.y;
+          if ((i32(x_190) < 150)) {
+            discard;
+          } else {
+            let x_197 : f32 = gl_FragCoord.y;
+            if ((i32(x_197) < 180)) {
+              let x_204 : i32 = data[5];
+              grey = (0.5 + (f32(x_204) / 10.0));
+            } else {
+              let x_209 : f32 = gl_FragCoord.y;
+              if ((i32(x_209) < 210)) {
+                let x_216 : i32 = data[6];
+                grey = (0.5 + (f32(x_216) / 10.0));
+              } else {
+                let x_221 : f32 = gl_FragCoord.y;
+                if ((i32(x_221) < 240)) {
+                  let x_228 : i32 = data[7];
+                  grey = (0.5 + (f32(x_228) / 10.0));
+                } else {
+                  let x_233 : f32 = gl_FragCoord.y;
+                  if ((i32(x_233) < 270)) {
+                    let x_240 : i32 = data[8];
+                    grey = (0.5 + (f32(x_240) / 10.0));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  let x_244 : f32 = grey;
+  let x_245 : vec3<f32> = vec3<f32>(x_244, x_244, x_244);
+  x_GLF_color = vec4<f32>(x_245.x, x_245.y, x_245.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/0.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/0.wgsl
new file mode 100644
index 0000000..c8f464e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/0.wgsl
@@ -0,0 +1,306 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> data : array<i32, 10>;
+
+var<private> temp : array<i32, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn merge_i1_i1_i1_(from : ptr<function, i32>, mid : ptr<function, i32>, to : ptr<function, i32>) {
+  var k : i32;
+  var i : i32;
+  var j : i32;
+  var i_1 : i32;
+  let x_251 : i32 = *(from);
+  k = x_251;
+  let x_252 : i32 = *(from);
+  i = x_252;
+  let x_253 : i32 = *(mid);
+  j = (x_253 + 1);
+  loop {
+    let x_259 : i32 = i;
+    let x_260 : i32 = *(mid);
+    let x_262 : i32 = j;
+    let x_263 : i32 = *(to);
+    if (((x_259 <= x_260) && (x_262 <= x_263))) {
+    } else {
+      break;
+    }
+    let x_267 : i32 = i;
+    let x_269 : i32 = data[x_267];
+    let x_270 : i32 = j;
+    let x_272 : i32 = data[x_270];
+    if ((x_269 < x_272)) {
+      let x_277 : i32 = k;
+      k = (x_277 + 1);
+      let x_279 : i32 = i;
+      i = (x_279 + 1);
+      let x_282 : i32 = data[x_279];
+      temp[x_277] = x_282;
+    } else {
+      let x_284 : i32 = k;
+      k = (x_284 + 1);
+      let x_286 : i32 = j;
+      j = (x_286 + 1);
+      let x_289 : i32 = data[x_286];
+      temp[x_284] = x_289;
+    }
+  }
+  loop {
+    let x_295 : i32 = i;
+    let x_297 : i32 = i;
+    let x_298 : i32 = *(mid);
+    if (((x_295 < 10) && (x_297 <= x_298))) {
+    } else {
+      break;
+    }
+    let x_302 : i32 = k;
+    k = (x_302 + 1);
+    let x_304 : i32 = i;
+    i = (x_304 + 1);
+    let x_307 : i32 = data[x_304];
+    temp[x_302] = x_307;
+  }
+  let x_309 : i32 = *(from);
+  i_1 = x_309;
+  loop {
+    let x_314 : i32 = i_1;
+    let x_315 : i32 = *(to);
+    if ((x_314 <= x_315)) {
+    } else {
+      break;
+    }
+    let x_318 : i32 = i_1;
+    let x_319 : i32 = i_1;
+    let x_321 : i32 = temp[x_319];
+    data[x_318] = x_321;
+
+    continuing {
+      let x_323 : i32 = i_1;
+      i_1 = (x_323 + 1);
+    }
+  }
+  return;
+}
+
+fn mergeSort_() {
+  var low : i32;
+  var high : i32;
+  var m : i32;
+  var i_2 : i32;
+  var from_1 : i32;
+  var mid_1 : i32;
+  var to_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  low = 0;
+  high = 9;
+  m = 1;
+  loop {
+    let x_330 : i32 = m;
+    let x_331 : i32 = high;
+    if ((x_330 <= x_331)) {
+    } else {
+      break;
+    }
+    let x_334 : i32 = low;
+    i_2 = x_334;
+    loop {
+      let x_339 : i32 = i_2;
+      let x_340 : i32 = high;
+      if ((x_339 < x_340)) {
+      } else {
+        break;
+      }
+      let x_343 : i32 = i_2;
+      from_1 = x_343;
+      let x_344 : i32 = i_2;
+      let x_345 : i32 = m;
+      mid_1 = ((x_344 + x_345) - 1);
+      let x_348 : i32 = i_2;
+      let x_349 : i32 = m;
+      let x_353 : i32 = high;
+      to_1 = min(((x_348 + (2 * x_349)) - 1), x_353);
+      let x_355 : i32 = from_1;
+      param = x_355;
+      let x_356 : i32 = mid_1;
+      param_1 = x_356;
+      let x_357 : i32 = to_1;
+      param_2 = x_357;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2));
+
+      continuing {
+        let x_359 : i32 = m;
+        let x_361 : i32 = i_2;
+        i_2 = (x_361 + (2 * x_359));
+      }
+    }
+
+    continuing {
+      let x_363 : i32 = m;
+      m = (2 * x_363);
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_3 : i32;
+  var j_1 : i32;
+  var grey : f32;
+  let x_84 : f32 = x_28.injectionSwitch.x;
+  i_3 = i32(x_84);
+  loop {
+    let x_90 : i32 = i_3;
+    switch(x_90) {
+      case 9: {
+        let x_120 : i32 = i_3;
+        data[x_120] = -5;
+      }
+      case 8: {
+        let x_118 : i32 = i_3;
+        data[x_118] = -4;
+      }
+      case 7: {
+        let x_116 : i32 = i_3;
+        data[x_116] = -3;
+      }
+      case 6: {
+        let x_114 : i32 = i_3;
+        data[x_114] = -2;
+      }
+      case 5: {
+        let x_112 : i32 = i_3;
+        data[x_112] = -1;
+      }
+      case 4: {
+        let x_110 : i32 = i_3;
+        data[x_110] = 0;
+      }
+      case 3: {
+        let x_108 : i32 = i_3;
+        data[x_108] = 1;
+      }
+      case 2: {
+        let x_106 : i32 = i_3;
+        data[x_106] = 2;
+      }
+      case 1: {
+        let x_104 : i32 = i_3;
+        data[x_104] = 3;
+      }
+      case 0: {
+        let x_102 : i32 = i_3;
+        data[x_102] = 4;
+      }
+      default: {
+      }
+    }
+    let x_122 : i32 = i_3;
+    i_3 = (x_122 + 1);
+
+    continuing {
+      let x_124 : i32 = i_3;
+      if ((x_124 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  loop {
+    let x_130 : i32 = j_1;
+    if ((x_130 < 10)) {
+    } else {
+      break;
+    }
+    let x_133 : i32 = j_1;
+    let x_134 : i32 = j_1;
+    let x_136 : i32 = data[x_134];
+    temp[x_133] = x_136;
+
+    continuing {
+      let x_138 : i32 = j_1;
+      j_1 = (x_138 + 1);
+    }
+  }
+  mergeSort_();
+  let x_142 : f32 = gl_FragCoord.y;
+  if ((i32(x_142) < 30)) {
+    let x_149 : i32 = data[0];
+    grey = (0.5 + (f32(x_149) / 10.0));
+  } else {
+    let x_154 : f32 = gl_FragCoord.y;
+    if ((i32(x_154) < 60)) {
+      let x_161 : i32 = data[1];
+      grey = (0.5 + (f32(x_161) / 10.0));
+    } else {
+      let x_166 : f32 = gl_FragCoord.y;
+      if ((i32(x_166) < 90)) {
+        let x_173 : i32 = data[2];
+        grey = (0.5 + (f32(x_173) / 10.0));
+      } else {
+        let x_178 : f32 = gl_FragCoord.y;
+        if ((i32(x_178) < 120)) {
+          let x_185 : i32 = data[3];
+          grey = (0.5 + (f32(x_185) / 10.0));
+        } else {
+          let x_190 : f32 = gl_FragCoord.y;
+          if ((i32(x_190) < 150)) {
+            discard;
+          } else {
+            let x_197 : f32 = gl_FragCoord.y;
+            if ((i32(x_197) < 180)) {
+              let x_204 : i32 = data[5];
+              grey = (0.5 + (f32(x_204) / 10.0));
+            } else {
+              let x_209 : f32 = gl_FragCoord.y;
+              if ((i32(x_209) < 210)) {
+                let x_216 : i32 = data[6];
+                grey = (0.5 + (f32(x_216) / 10.0));
+              } else {
+                let x_221 : f32 = gl_FragCoord.y;
+                if ((i32(x_221) < 240)) {
+                  let x_228 : i32 = data[7];
+                  grey = (0.5 + (f32(x_228) / 10.0));
+                } else {
+                  let x_233 : f32 = gl_FragCoord.y;
+                  if ((i32(x_233) < 270)) {
+                    let x_240 : i32 = data[8];
+                    grey = (0.5 + (f32(x_240) / 10.0));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  let x_244 : f32 = grey;
+  let x_245 : vec3<f32> = vec3<f32>(x_244, x_244, x_244);
+  x_GLF_color = vec4<f32>(x_245.x, x_245.y, x_245.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..6a30ba4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/0.wgsl.expected.hlsl
@@ -0,0 +1,268 @@
+static int data[10] = (int[10])0;
+static int temp[10] = (int[10])0;
+cbuffer cbuffer_x_28 : register(b0, space0) {
+  uint4 x_28[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void merge_i1_i1_i1_(inout int from, inout int mid, inout int to) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  const int x_251 = from;
+  k = x_251;
+  const int x_252 = from;
+  i = x_252;
+  const int x_253 = mid;
+  j = (x_253 + 1);
+  while (true) {
+    const int x_259 = i;
+    const int x_260 = mid;
+    const int x_262 = j;
+    const int x_263 = to;
+    bool tint_tmp = (x_259 <= x_260);
+    if (tint_tmp) {
+      tint_tmp = (x_262 <= x_263);
+    }
+    if ((tint_tmp)) {
+    } else {
+      break;
+    }
+    const int x_269 = data[i];
+    const int x_272 = data[j];
+    if ((x_269 < x_272)) {
+      const int x_277 = k;
+      k = (x_277 + 1);
+      const int x_279 = i;
+      i = (x_279 + 1);
+      const int x_282 = data[x_279];
+      temp[x_277] = x_282;
+    } else {
+      const int x_284 = k;
+      k = (x_284 + 1);
+      const int x_286 = j;
+      j = (x_286 + 1);
+      const int x_289 = data[x_286];
+      temp[x_284] = x_289;
+    }
+  }
+  while (true) {
+    const int x_295 = i;
+    const int x_297 = i;
+    const int x_298 = mid;
+    bool tint_tmp_1 = (x_295 < 10);
+    if (tint_tmp_1) {
+      tint_tmp_1 = (x_297 <= x_298);
+    }
+    if ((tint_tmp_1)) {
+    } else {
+      break;
+    }
+    const int x_302 = k;
+    k = (x_302 + 1);
+    const int x_304 = i;
+    i = (x_304 + 1);
+    const int x_307 = data[x_304];
+    temp[x_302] = x_307;
+  }
+  const int x_309 = from;
+  i_1 = x_309;
+  while (true) {
+    const int x_314 = i_1;
+    const int x_315 = to;
+    if ((x_314 <= x_315)) {
+    } else {
+      break;
+    }
+    const int x_318 = i_1;
+    const int x_321 = temp[i_1];
+    data[x_318] = x_321;
+    {
+      i_1 = (i_1 + 1);
+    }
+  }
+  return;
+}
+
+void mergeSort_() {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  {
+    for(; (m <= high); m = (2 * m)) {
+      i_2 = low;
+      {
+        for(; (i_2 < high); i_2 = (i_2 + (2 * m))) {
+          from_1 = i_2;
+          mid_1 = ((i_2 + m) - 1);
+          to_1 = min(((i_2 + (2 * m)) - 1), high);
+          param = from_1;
+          param_1 = mid_1;
+          param_2 = to_1;
+          merge_i1_i1_i1_(param, param_1, param_2);
+        }
+      }
+    }
+  }
+  return;
+}
+
+void main_1() {
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  const float x_84 = asfloat(x_28[0].x);
+  i_3 = int(x_84);
+  while (true) {
+    switch(i_3) {
+      case 9: {
+        data[i_3] = -5;
+        break;
+      }
+      case 8: {
+        data[i_3] = -4;
+        break;
+      }
+      case 7: {
+        data[i_3] = -3;
+        break;
+      }
+      case 6: {
+        data[i_3] = -2;
+        break;
+      }
+      case 5: {
+        data[i_3] = -1;
+        break;
+      }
+      case 4: {
+        data[i_3] = 0;
+        break;
+      }
+      case 3: {
+        data[i_3] = 1;
+        break;
+      }
+      case 2: {
+        data[i_3] = 2;
+        break;
+      }
+      case 1: {
+        data[i_3] = 3;
+        break;
+      }
+      case 0: {
+        data[i_3] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    i_3 = (i_3 + 1);
+    {
+      if ((i_3 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  {
+    for(; (j_1 < 10); j_1 = (j_1 + 1)) {
+      const int x_133 = j_1;
+      const int x_136 = data[j_1];
+      temp[x_133] = x_136;
+    }
+  }
+  mergeSort_();
+  const float x_142 = gl_FragCoord.y;
+  if ((int(x_142) < 30)) {
+    const int x_149 = data[0];
+    grey = (0.5f + (float(x_149) / 10.0f));
+  } else {
+    const float x_154 = gl_FragCoord.y;
+    if ((int(x_154) < 60)) {
+      const int x_161 = data[1];
+      grey = (0.5f + (float(x_161) / 10.0f));
+    } else {
+      const float x_166 = gl_FragCoord.y;
+      if ((int(x_166) < 90)) {
+        const int x_173 = data[2];
+        grey = (0.5f + (float(x_173) / 10.0f));
+      } else {
+        const float x_178 = gl_FragCoord.y;
+        if ((int(x_178) < 120)) {
+          const int x_185 = data[3];
+          grey = (0.5f + (float(x_185) / 10.0f));
+        } else {
+          const float x_190 = gl_FragCoord.y;
+          if ((int(x_190) < 150)) {
+            discard;
+          } else {
+            const float x_197 = gl_FragCoord.y;
+            if ((int(x_197) < 180)) {
+              const int x_204 = data[5];
+              grey = (0.5f + (float(x_204) / 10.0f));
+            } else {
+              const float x_209 = gl_FragCoord.y;
+              if ((int(x_209) < 210)) {
+                const int x_216 = data[6];
+                grey = (0.5f + (float(x_216) / 10.0f));
+              } else {
+                const float x_221 = gl_FragCoord.y;
+                if ((int(x_221) < 240)) {
+                  const int x_228 = data[7];
+                  grey = (0.5f + (float(x_228) / 10.0f));
+                } else {
+                  const float x_233 = gl_FragCoord.y;
+                  if ((int(x_233) < 270)) {
+                    const int x_240 = data[8];
+                    grey = (0.5f + (float(x_240) / 10.0f));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  const float x_244 = grey;
+  const float3 x_245 = float3(x_244, x_244, x_244);
+  x_GLF_color = float4(x_245.x, x_245.y, x_245.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/0.wgsl.expected.msl
new file mode 100644
index 0000000..6340b47
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/0.wgsl.expected.msl
@@ -0,0 +1,314 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void merge_i1_i1_i1_(thread int* const from, thread int* const mid, thread int* const to, thread tint_array_wrapper* const tint_symbol_5, thread tint_array_wrapper* const tint_symbol_6) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  int const x_251 = *(from);
+  k = x_251;
+  int const x_252 = *(from);
+  i = x_252;
+  int const x_253 = *(mid);
+  j = (x_253 + 1);
+  while (true) {
+    int const x_259 = i;
+    int const x_260 = *(mid);
+    int const x_262 = j;
+    int const x_263 = *(to);
+    if (((x_259 <= x_260) && (x_262 <= x_263))) {
+    } else {
+      break;
+    }
+    int const x_267 = i;
+    int const x_269 = (*(tint_symbol_5)).arr[x_267];
+    int const x_270 = j;
+    int const x_272 = (*(tint_symbol_5)).arr[x_270];
+    if ((x_269 < x_272)) {
+      int const x_277 = k;
+      k = (x_277 + 1);
+      int const x_279 = i;
+      i = (x_279 + 1);
+      int const x_282 = (*(tint_symbol_5)).arr[x_279];
+      (*(tint_symbol_6)).arr[x_277] = x_282;
+    } else {
+      int const x_284 = k;
+      k = (x_284 + 1);
+      int const x_286 = j;
+      j = (x_286 + 1);
+      int const x_289 = (*(tint_symbol_5)).arr[x_286];
+      (*(tint_symbol_6)).arr[x_284] = x_289;
+    }
+  }
+  while (true) {
+    int const x_295 = i;
+    int const x_297 = i;
+    int const x_298 = *(mid);
+    if (((x_295 < 10) && (x_297 <= x_298))) {
+    } else {
+      break;
+    }
+    int const x_302 = k;
+    k = (x_302 + 1);
+    int const x_304 = i;
+    i = (x_304 + 1);
+    int const x_307 = (*(tint_symbol_5)).arr[x_304];
+    (*(tint_symbol_6)).arr[x_302] = x_307;
+  }
+  int const x_309 = *(from);
+  i_1 = x_309;
+  while (true) {
+    int const x_314 = i_1;
+    int const x_315 = *(to);
+    if ((x_314 <= x_315)) {
+    } else {
+      break;
+    }
+    int const x_318 = i_1;
+    int const x_319 = i_1;
+    int const x_321 = (*(tint_symbol_6)).arr[x_319];
+    (*(tint_symbol_5)).arr[x_318] = x_321;
+    {
+      int const x_323 = i_1;
+      i_1 = (x_323 + 1);
+    }
+  }
+  return;
+}
+
+void mergeSort_(thread tint_array_wrapper* const tint_symbol_7, thread tint_array_wrapper* const tint_symbol_8) {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  while (true) {
+    int const x_330 = m;
+    int const x_331 = high;
+    if ((x_330 <= x_331)) {
+    } else {
+      break;
+    }
+    int const x_334 = low;
+    i_2 = x_334;
+    while (true) {
+      int const x_339 = i_2;
+      int const x_340 = high;
+      if ((x_339 < x_340)) {
+      } else {
+        break;
+      }
+      int const x_343 = i_2;
+      from_1 = x_343;
+      int const x_344 = i_2;
+      int const x_345 = m;
+      mid_1 = ((x_344 + x_345) - 1);
+      int const x_348 = i_2;
+      int const x_349 = m;
+      int const x_353 = high;
+      to_1 = min(((x_348 + (2 * x_349)) - 1), x_353);
+      int const x_355 = from_1;
+      param = x_355;
+      int const x_356 = mid_1;
+      param_1 = x_356;
+      int const x_357 = to_1;
+      param_2 = x_357;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2), tint_symbol_7, tint_symbol_8);
+      {
+        int const x_359 = m;
+        int const x_361 = i_2;
+        i_2 = (x_361 + (2 * x_359));
+      }
+    }
+    {
+      int const x_363 = m;
+      m = (2 * x_363);
+    }
+  }
+  return;
+}
+
+void main_1(constant buf0& x_28, thread tint_array_wrapper* const tint_symbol_9, thread tint_array_wrapper* const tint_symbol_10, thread float4* const tint_symbol_11, thread float4* const tint_symbol_12) {
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  float const x_84 = x_28.injectionSwitch.x;
+  i_3 = int(x_84);
+  while (true) {
+    int const x_90 = i_3;
+    switch(x_90) {
+      case 9: {
+        int const x_120 = i_3;
+        (*(tint_symbol_9)).arr[x_120] = -5;
+        break;
+      }
+      case 8: {
+        int const x_118 = i_3;
+        (*(tint_symbol_9)).arr[x_118] = -4;
+        break;
+      }
+      case 7: {
+        int const x_116 = i_3;
+        (*(tint_symbol_9)).arr[x_116] = -3;
+        break;
+      }
+      case 6: {
+        int const x_114 = i_3;
+        (*(tint_symbol_9)).arr[x_114] = -2;
+        break;
+      }
+      case 5: {
+        int const x_112 = i_3;
+        (*(tint_symbol_9)).arr[x_112] = -1;
+        break;
+      }
+      case 4: {
+        int const x_110 = i_3;
+        (*(tint_symbol_9)).arr[x_110] = 0;
+        break;
+      }
+      case 3: {
+        int const x_108 = i_3;
+        (*(tint_symbol_9)).arr[x_108] = 1;
+        break;
+      }
+      case 2: {
+        int const x_106 = i_3;
+        (*(tint_symbol_9)).arr[x_106] = 2;
+        break;
+      }
+      case 1: {
+        int const x_104 = i_3;
+        (*(tint_symbol_9)).arr[x_104] = 3;
+        break;
+      }
+      case 0: {
+        int const x_102 = i_3;
+        (*(tint_symbol_9)).arr[x_102] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    int const x_122 = i_3;
+    i_3 = (x_122 + 1);
+    {
+      int const x_124 = i_3;
+      if ((x_124 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  while (true) {
+    int const x_130 = j_1;
+    if ((x_130 < 10)) {
+    } else {
+      break;
+    }
+    int const x_133 = j_1;
+    int const x_134 = j_1;
+    int const x_136 = (*(tint_symbol_9)).arr[x_134];
+    (*(tint_symbol_10)).arr[x_133] = x_136;
+    {
+      int const x_138 = j_1;
+      j_1 = (x_138 + 1);
+    }
+  }
+  mergeSort_(tint_symbol_9, tint_symbol_10);
+  float const x_142 = (*(tint_symbol_11)).y;
+  if ((int(x_142) < 30)) {
+    int const x_149 = (*(tint_symbol_9)).arr[0];
+    grey = (0.5f + (float(x_149) / 10.0f));
+  } else {
+    float const x_154 = (*(tint_symbol_11)).y;
+    if ((int(x_154) < 60)) {
+      int const x_161 = (*(tint_symbol_9)).arr[1];
+      grey = (0.5f + (float(x_161) / 10.0f));
+    } else {
+      float const x_166 = (*(tint_symbol_11)).y;
+      if ((int(x_166) < 90)) {
+        int const x_173 = (*(tint_symbol_9)).arr[2];
+        grey = (0.5f + (float(x_173) / 10.0f));
+      } else {
+        float const x_178 = (*(tint_symbol_11)).y;
+        if ((int(x_178) < 120)) {
+          int const x_185 = (*(tint_symbol_9)).arr[3];
+          grey = (0.5f + (float(x_185) / 10.0f));
+        } else {
+          float const x_190 = (*(tint_symbol_11)).y;
+          if ((int(x_190) < 150)) {
+            discard_fragment();
+          } else {
+            float const x_197 = (*(tint_symbol_11)).y;
+            if ((int(x_197) < 180)) {
+              int const x_204 = (*(tint_symbol_9)).arr[5];
+              grey = (0.5f + (float(x_204) / 10.0f));
+            } else {
+              float const x_209 = (*(tint_symbol_11)).y;
+              if ((int(x_209) < 210)) {
+                int const x_216 = (*(tint_symbol_9)).arr[6];
+                grey = (0.5f + (float(x_216) / 10.0f));
+              } else {
+                float const x_221 = (*(tint_symbol_11)).y;
+                if ((int(x_221) < 240)) {
+                  int const x_228 = (*(tint_symbol_9)).arr[7];
+                  grey = (0.5f + (float(x_228) / 10.0f));
+                } else {
+                  float const x_233 = (*(tint_symbol_11)).y;
+                  if ((int(x_233) < 270)) {
+                    int const x_240 = (*(tint_symbol_9)).arr[8];
+                    grey = (0.5f + (float(x_240) / 10.0f));
+                  } else {
+                    discard_fragment();
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  float const x_244 = grey;
+  float3 const x_245 = float3(x_244, x_244, x_244);
+  *(tint_symbol_12) = float4(x_245.x, x_245.y, x_245.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_28 [[buffer(0)]]) {
+  thread float4 tint_symbol_13 = 0.0f;
+  thread tint_array_wrapper tint_symbol_14 = {};
+  thread tint_array_wrapper tint_symbol_15 = {};
+  thread float4 tint_symbol_16 = 0.0f;
+  tint_symbol_13 = gl_FragCoord_param;
+  main_1(x_28, &(tint_symbol_14), &(tint_symbol_15), &(tint_symbol_13), &(tint_symbol_16));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_16};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..4df39a6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/0.wgsl.expected.spvasm
@@ -0,0 +1,649 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 416
+; Schema: 0
+               OpCapability Shader
+        %177 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %data "data"
+               OpName %temp "temp"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_28 "x_28"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %merge_i1_i1_i1_ "merge_i1_i1_i1_"
+               OpName %from "from"
+               OpName %mid "mid"
+               OpName %to "to"
+               OpName %k "k"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %i_1 "i_1"
+               OpName %mergeSort_ "mergeSort_"
+               OpName %low "low"
+               OpName %high "high"
+               OpName %m "m"
+               OpName %i_2 "i_2"
+               OpName %from_1 "from_1"
+               OpName %mid_1 "mid_1"
+               OpName %to_1 "to_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %main_1 "main_1"
+               OpName %i_3 "i_3"
+               OpName %j_1 "j_1"
+               OpName %grey "grey"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_28 NonWritable
+               OpDecorate %x_28 DescriptorSet 0
+               OpDecorate %x_28 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Private__arr_int_uint_10 = OpTypePointer Private %_arr_int_uint_10
+          %7 = OpConstantNull %_arr_int_uint_10
+       %data = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+       %temp = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_28 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %17
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int %_ptr_Function_int
+         %32 = OpConstantNull %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+%_ptr_Private_int = OpTypePointer Private %int
+     %int_10 = OpConstant %int 10
+        %132 = OpTypeFunction %void
+      %int_0 = OpConstant %int 0
+      %int_9 = OpConstant %int 9
+      %int_2 = OpConstant %int 2
+%_ptr_Function_float = OpTypePointer Function %float
+        %201 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %int_n5 = OpConstant %int -5
+     %int_n4 = OpConstant %int -4
+     %int_n3 = OpConstant %int -3
+     %int_n2 = OpConstant %int -2
+     %int_n1 = OpConstant %int -1
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %int_30 = OpConstant %int 30
+  %float_0_5 = OpConstant %float 0.5
+   %float_10 = OpConstant %float 10
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+    %v3float = OpTypeVector %float 3
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %403 = OpTypeFunction %void %main_out
+%merge_i1_i1_i1_ = OpFunction %void None %23
+       %from = OpFunctionParameter %_ptr_Function_int
+        %mid = OpFunctionParameter %_ptr_Function_int
+         %to = OpFunctionParameter %_ptr_Function_int
+         %30 = OpLabel
+          %k = OpVariable %_ptr_Function_int Function %32
+          %i = OpVariable %_ptr_Function_int Function %32
+          %j = OpVariable %_ptr_Function_int Function %32
+        %i_1 = OpVariable %_ptr_Function_int Function %32
+         %37 = OpLoad %int %from
+               OpStore %k %37
+         %39 = OpLoad %int %from
+               OpStore %i %39
+         %41 = OpLoad %int %mid
+         %43 = OpIAdd %int %41 %int_1
+               OpStore %j %43
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %48 = OpLoad %int %i
+         %50 = OpLoad %int %mid
+         %51 = OpLoad %int %j
+         %53 = OpLoad %int %to
+         %54 = OpSLessThanEqual %bool %48 %50
+               OpSelectionMerge %56 None
+               OpBranchConditional %54 %57 %56
+         %57 = OpLabel
+         %58 = OpSLessThanEqual %bool %51 %53
+               OpBranch %56
+         %56 = OpLabel
+         %59 = OpPhi %bool %54 %47 %58 %57
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %62
+         %61 = OpLabel
+               OpBranch %60
+         %62 = OpLabel
+               OpBranch %45
+         %60 = OpLabel
+         %63 = OpLoad %int %i
+         %65 = OpAccessChain %_ptr_Private_int %data %63
+         %66 = OpLoad %int %65
+         %67 = OpLoad %int %j
+         %68 = OpAccessChain %_ptr_Private_int %data %67
+         %69 = OpLoad %int %68
+         %70 = OpSLessThan %bool %66 %69
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %73
+         %72 = OpLabel
+         %74 = OpLoad %int %k
+         %75 = OpIAdd %int %74 %int_1
+               OpStore %k %75
+         %76 = OpLoad %int %i
+         %77 = OpIAdd %int %76 %int_1
+               OpStore %i %77
+         %78 = OpAccessChain %_ptr_Private_int %data %76
+         %79 = OpLoad %int %78
+         %80 = OpAccessChain %_ptr_Private_int %temp %74
+               OpStore %80 %79
+               OpBranch %71
+         %73 = OpLabel
+         %81 = OpLoad %int %k
+         %82 = OpIAdd %int %81 %int_1
+               OpStore %k %82
+         %83 = OpLoad %int %j
+         %84 = OpIAdd %int %83 %int_1
+               OpStore %j %84
+         %85 = OpAccessChain %_ptr_Private_int %data %83
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_Private_int %temp %81
+               OpStore %87 %86
+               OpBranch %71
+         %71 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+               OpBranch %44
+         %45 = OpLabel
+               OpBranch %88
+         %88 = OpLabel
+               OpLoopMerge %89 %90 None
+               OpBranch %91
+         %91 = OpLabel
+         %92 = OpLoad %int %i
+         %93 = OpLoad %int %i
+         %95 = OpLoad %int %mid
+         %97 = OpSLessThan %bool %92 %int_10
+               OpSelectionMerge %98 None
+               OpBranchConditional %97 %99 %98
+         %99 = OpLabel
+        %100 = OpSLessThanEqual %bool %93 %95
+               OpBranch %98
+         %98 = OpLabel
+        %101 = OpPhi %bool %97 %91 %100 %99
+               OpSelectionMerge %102 None
+               OpBranchConditional %101 %103 %104
+        %103 = OpLabel
+               OpBranch %102
+        %104 = OpLabel
+               OpBranch %89
+        %102 = OpLabel
+        %105 = OpLoad %int %k
+        %106 = OpIAdd %int %105 %int_1
+               OpStore %k %106
+        %107 = OpLoad %int %i
+        %108 = OpIAdd %int %107 %int_1
+               OpStore %i %108
+        %109 = OpAccessChain %_ptr_Private_int %data %107
+        %110 = OpLoad %int %109
+        %111 = OpAccessChain %_ptr_Private_int %temp %105
+               OpStore %111 %110
+               OpBranch %90
+         %90 = OpLabel
+               OpBranch %88
+         %89 = OpLabel
+        %113 = OpLoad %int %from
+               OpStore %i_1 %113
+               OpBranch %114
+        %114 = OpLabel
+               OpLoopMerge %115 %116 None
+               OpBranch %117
+        %117 = OpLabel
+        %118 = OpLoad %int %i_1
+        %120 = OpLoad %int %to
+        %121 = OpSLessThanEqual %bool %118 %120
+               OpSelectionMerge %122 None
+               OpBranchConditional %121 %123 %124
+        %123 = OpLabel
+               OpBranch %122
+        %124 = OpLabel
+               OpBranch %115
+        %122 = OpLabel
+        %125 = OpLoad %int %i_1
+        %126 = OpLoad %int %i_1
+        %127 = OpAccessChain %_ptr_Private_int %temp %126
+        %128 = OpLoad %int %127
+        %129 = OpAccessChain %_ptr_Private_int %data %125
+               OpStore %129 %128
+               OpBranch %116
+        %116 = OpLabel
+        %130 = OpLoad %int %i_1
+        %131 = OpIAdd %int %130 %int_1
+               OpStore %i_1 %131
+               OpBranch %114
+        %115 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %mergeSort_ = OpFunction %void None %132
+        %134 = OpLabel
+        %low = OpVariable %_ptr_Function_int Function %32
+       %high = OpVariable %_ptr_Function_int Function %32
+          %m = OpVariable %_ptr_Function_int Function %32
+        %i_2 = OpVariable %_ptr_Function_int Function %32
+     %from_1 = OpVariable %_ptr_Function_int Function %32
+      %mid_1 = OpVariable %_ptr_Function_int Function %32
+       %to_1 = OpVariable %_ptr_Function_int Function %32
+      %param = OpVariable %_ptr_Function_int Function %32
+    %param_1 = OpVariable %_ptr_Function_int Function %32
+    %param_2 = OpVariable %_ptr_Function_int Function %32
+               OpStore %low %int_0
+               OpStore %high %int_9
+               OpStore %m %int_1
+               OpBranch %147
+        %147 = OpLabel
+               OpLoopMerge %148 %149 None
+               OpBranch %150
+        %150 = OpLabel
+        %151 = OpLoad %int %m
+        %152 = OpLoad %int %high
+        %153 = OpSLessThanEqual %bool %151 %152
+               OpSelectionMerge %154 None
+               OpBranchConditional %153 %155 %156
+        %155 = OpLabel
+               OpBranch %154
+        %156 = OpLabel
+               OpBranch %148
+        %154 = OpLabel
+        %157 = OpLoad %int %low
+               OpStore %i_2 %157
+               OpBranch %158
+        %158 = OpLabel
+               OpLoopMerge %159 %160 None
+               OpBranch %161
+        %161 = OpLabel
+        %162 = OpLoad %int %i_2
+        %163 = OpLoad %int %high
+        %164 = OpSLessThan %bool %162 %163
+               OpSelectionMerge %165 None
+               OpBranchConditional %164 %166 %167
+        %166 = OpLabel
+               OpBranch %165
+        %167 = OpLabel
+               OpBranch %159
+        %165 = OpLabel
+        %168 = OpLoad %int %i_2
+               OpStore %from_1 %168
+        %169 = OpLoad %int %i_2
+        %170 = OpLoad %int %m
+        %171 = OpIAdd %int %169 %170
+        %172 = OpISub %int %171 %int_1
+               OpStore %mid_1 %172
+        %173 = OpLoad %int %i_2
+        %174 = OpLoad %int %m
+        %175 = OpLoad %int %high
+        %179 = OpIMul %int %int_2 %174
+        %180 = OpIAdd %int %173 %179
+        %181 = OpISub %int %180 %int_1
+        %176 = OpExtInst %int %177 SMin %181 %175
+               OpStore %to_1 %176
+        %182 = OpLoad %int %from_1
+               OpStore %param %182
+        %183 = OpLoad %int %mid_1
+               OpStore %param_1 %183
+        %184 = OpLoad %int %to_1
+               OpStore %param_2 %184
+        %185 = OpFunctionCall %void %merge_i1_i1_i1_ %param %param_1 %param_2
+               OpBranch %160
+        %160 = OpLabel
+        %189 = OpLoad %int %m
+        %190 = OpLoad %int %i_2
+        %191 = OpIMul %int %int_2 %189
+        %192 = OpIAdd %int %190 %191
+               OpStore %i_2 %192
+               OpBranch %158
+        %159 = OpLabel
+               OpBranch %149
+        %149 = OpLabel
+        %193 = OpLoad %int %m
+        %194 = OpIMul %int %int_2 %193
+               OpStore %m %194
+               OpBranch %147
+        %148 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %132
+        %196 = OpLabel
+        %i_3 = OpVariable %_ptr_Function_int Function %32
+        %j_1 = OpVariable %_ptr_Function_int Function %32
+       %grey = OpVariable %_ptr_Function_float Function %201
+        %204 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_0
+        %205 = OpLoad %float %204
+        %206 = OpConvertFToS %int %205
+               OpStore %i_3 %206
+               OpBranch %207
+        %207 = OpLabel
+               OpLoopMerge %208 %209 None
+               OpBranch %210
+        %210 = OpLabel
+        %211 = OpLoad %int %i_3
+               OpSelectionMerge %212 None
+               OpSwitch %211 %213 9 %214 8 %215 7 %216 6 %217 5 %218 4 %219 3 %220 2 %221 1 %222 0 %223
+        %214 = OpLabel
+        %224 = OpLoad %int %i_3
+        %225 = OpAccessChain %_ptr_Private_int %data %224
+               OpStore %225 %int_n5
+               OpBranch %212
+        %215 = OpLabel
+        %227 = OpLoad %int %i_3
+        %228 = OpAccessChain %_ptr_Private_int %data %227
+               OpStore %228 %int_n4
+               OpBranch %212
+        %216 = OpLabel
+        %230 = OpLoad %int %i_3
+        %231 = OpAccessChain %_ptr_Private_int %data %230
+               OpStore %231 %int_n3
+               OpBranch %212
+        %217 = OpLabel
+        %233 = OpLoad %int %i_3
+        %234 = OpAccessChain %_ptr_Private_int %data %233
+               OpStore %234 %int_n2
+               OpBranch %212
+        %218 = OpLabel
+        %236 = OpLoad %int %i_3
+        %237 = OpAccessChain %_ptr_Private_int %data %236
+               OpStore %237 %int_n1
+               OpBranch %212
+        %219 = OpLabel
+        %239 = OpLoad %int %i_3
+        %240 = OpAccessChain %_ptr_Private_int %data %239
+               OpStore %240 %int_0
+               OpBranch %212
+        %220 = OpLabel
+        %241 = OpLoad %int %i_3
+        %242 = OpAccessChain %_ptr_Private_int %data %241
+               OpStore %242 %int_1
+               OpBranch %212
+        %221 = OpLabel
+        %243 = OpLoad %int %i_3
+        %244 = OpAccessChain %_ptr_Private_int %data %243
+               OpStore %244 %int_2
+               OpBranch %212
+        %222 = OpLabel
+        %245 = OpLoad %int %i_3
+        %246 = OpAccessChain %_ptr_Private_int %data %245
+               OpStore %246 %int_3
+               OpBranch %212
+        %223 = OpLabel
+        %248 = OpLoad %int %i_3
+        %249 = OpAccessChain %_ptr_Private_int %data %248
+               OpStore %249 %int_4
+               OpBranch %212
+        %213 = OpLabel
+               OpBranch %212
+        %212 = OpLabel
+        %251 = OpLoad %int %i_3
+        %252 = OpIAdd %int %251 %int_1
+               OpStore %i_3 %252
+               OpBranch %209
+        %209 = OpLabel
+        %253 = OpLoad %int %i_3
+        %254 = OpSLessThan %bool %253 %int_10
+               OpSelectionMerge %255 None
+               OpBranchConditional %254 %256 %257
+        %256 = OpLabel
+               OpBranch %255
+        %257 = OpLabel
+               OpBranch %208
+        %255 = OpLabel
+               OpBranch %207
+        %208 = OpLabel
+               OpStore %j_1 %int_0
+               OpBranch %258
+        %258 = OpLabel
+               OpLoopMerge %259 %260 None
+               OpBranch %261
+        %261 = OpLabel
+        %262 = OpLoad %int %j_1
+        %263 = OpSLessThan %bool %262 %int_10
+               OpSelectionMerge %264 None
+               OpBranchConditional %263 %265 %266
+        %265 = OpLabel
+               OpBranch %264
+        %266 = OpLabel
+               OpBranch %259
+        %264 = OpLabel
+        %267 = OpLoad %int %j_1
+        %268 = OpLoad %int %j_1
+        %269 = OpAccessChain %_ptr_Private_int %data %268
+        %270 = OpLoad %int %269
+        %271 = OpAccessChain %_ptr_Private_int %temp %267
+               OpStore %271 %270
+               OpBranch %260
+        %260 = OpLabel
+        %272 = OpLoad %int %j_1
+        %273 = OpIAdd %int %272 %int_1
+               OpStore %j_1 %273
+               OpBranch %258
+        %259 = OpLabel
+        %274 = OpFunctionCall %void %mergeSort_
+        %277 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %278 = OpLoad %float %277
+        %279 = OpConvertFToS %int %278
+        %281 = OpSLessThan %bool %279 %int_30
+               OpSelectionMerge %282 None
+               OpBranchConditional %281 %283 %284
+        %283 = OpLabel
+        %285 = OpAccessChain %_ptr_Private_int %data %int_0
+        %286 = OpLoad %int %285
+        %288 = OpConvertSToF %float %286
+        %290 = OpFDiv %float %288 %float_10
+        %291 = OpFAdd %float %float_0_5 %290
+               OpStore %grey %291
+               OpBranch %282
+        %284 = OpLabel
+        %292 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %293 = OpLoad %float %292
+        %294 = OpConvertFToS %int %293
+        %296 = OpSLessThan %bool %294 %int_60
+               OpSelectionMerge %297 None
+               OpBranchConditional %296 %298 %299
+        %298 = OpLabel
+        %300 = OpAccessChain %_ptr_Private_int %data %int_1
+        %301 = OpLoad %int %300
+        %302 = OpConvertSToF %float %301
+        %303 = OpFDiv %float %302 %float_10
+        %304 = OpFAdd %float %float_0_5 %303
+               OpStore %grey %304
+               OpBranch %297
+        %299 = OpLabel
+        %305 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %306 = OpLoad %float %305
+        %307 = OpConvertFToS %int %306
+        %309 = OpSLessThan %bool %307 %int_90
+               OpSelectionMerge %310 None
+               OpBranchConditional %309 %311 %312
+        %311 = OpLabel
+        %313 = OpAccessChain %_ptr_Private_int %data %int_2
+        %314 = OpLoad %int %313
+        %315 = OpConvertSToF %float %314
+        %316 = OpFDiv %float %315 %float_10
+        %317 = OpFAdd %float %float_0_5 %316
+               OpStore %grey %317
+               OpBranch %310
+        %312 = OpLabel
+        %318 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %319 = OpLoad %float %318
+        %320 = OpConvertFToS %int %319
+        %322 = OpSLessThan %bool %320 %int_120
+               OpSelectionMerge %323 None
+               OpBranchConditional %322 %324 %325
+        %324 = OpLabel
+        %326 = OpAccessChain %_ptr_Private_int %data %int_3
+        %327 = OpLoad %int %326
+        %328 = OpConvertSToF %float %327
+        %329 = OpFDiv %float %328 %float_10
+        %330 = OpFAdd %float %float_0_5 %329
+               OpStore %grey %330
+               OpBranch %323
+        %325 = OpLabel
+        %331 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %332 = OpLoad %float %331
+        %333 = OpConvertFToS %int %332
+        %335 = OpSLessThan %bool %333 %int_150
+               OpSelectionMerge %336 None
+               OpBranchConditional %335 %337 %338
+        %337 = OpLabel
+               OpKill
+        %338 = OpLabel
+        %339 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %340 = OpLoad %float %339
+        %341 = OpConvertFToS %int %340
+        %343 = OpSLessThan %bool %341 %int_180
+               OpSelectionMerge %344 None
+               OpBranchConditional %343 %345 %346
+        %345 = OpLabel
+        %348 = OpAccessChain %_ptr_Private_int %data %int_5
+        %349 = OpLoad %int %348
+        %350 = OpConvertSToF %float %349
+        %351 = OpFDiv %float %350 %float_10
+        %352 = OpFAdd %float %float_0_5 %351
+               OpStore %grey %352
+               OpBranch %344
+        %346 = OpLabel
+        %353 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %354 = OpLoad %float %353
+        %355 = OpConvertFToS %int %354
+        %357 = OpSLessThan %bool %355 %int_210
+               OpSelectionMerge %358 None
+               OpBranchConditional %357 %359 %360
+        %359 = OpLabel
+        %362 = OpAccessChain %_ptr_Private_int %data %int_6
+        %363 = OpLoad %int %362
+        %364 = OpConvertSToF %float %363
+        %365 = OpFDiv %float %364 %float_10
+        %366 = OpFAdd %float %float_0_5 %365
+               OpStore %grey %366
+               OpBranch %358
+        %360 = OpLabel
+        %367 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %368 = OpLoad %float %367
+        %369 = OpConvertFToS %int %368
+        %371 = OpSLessThan %bool %369 %int_240
+               OpSelectionMerge %372 None
+               OpBranchConditional %371 %373 %374
+        %373 = OpLabel
+        %376 = OpAccessChain %_ptr_Private_int %data %int_7
+        %377 = OpLoad %int %376
+        %378 = OpConvertSToF %float %377
+        %379 = OpFDiv %float %378 %float_10
+        %380 = OpFAdd %float %float_0_5 %379
+               OpStore %grey %380
+               OpBranch %372
+        %374 = OpLabel
+        %381 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %382 = OpLoad %float %381
+        %383 = OpConvertFToS %int %382
+        %385 = OpSLessThan %bool %383 %int_270
+               OpSelectionMerge %386 None
+               OpBranchConditional %385 %387 %388
+        %387 = OpLabel
+        %390 = OpAccessChain %_ptr_Private_int %data %int_8
+        %391 = OpLoad %int %390
+        %392 = OpConvertSToF %float %391
+        %393 = OpFDiv %float %392 %float_10
+        %394 = OpFAdd %float %float_0_5 %393
+               OpStore %grey %394
+               OpBranch %386
+        %388 = OpLabel
+               OpKill
+        %386 = OpLabel
+               OpBranch %372
+        %372 = OpLabel
+               OpBranch %358
+        %358 = OpLabel
+               OpBranch %344
+        %344 = OpLabel
+               OpBranch %336
+        %336 = OpLabel
+               OpBranch %323
+        %323 = OpLabel
+               OpBranch %310
+        %310 = OpLabel
+               OpBranch %297
+        %297 = OpLabel
+               OpBranch %282
+        %282 = OpLabel
+        %395 = OpLoad %float %grey
+        %397 = OpCompositeConstruct %v3float %395 %395 %395
+        %398 = OpCompositeExtract %float %397 0
+        %399 = OpCompositeExtract %float %397 1
+        %400 = OpCompositeExtract %float %397 2
+        %402 = OpCompositeConstruct %v4float %398 %399 %400 %float_1
+               OpStore %x_GLF_color %402
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %403
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %407 = OpLabel
+        %408 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %408
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %132
+        %410 = OpLabel
+        %411 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %411
+        %412 = OpFunctionCall %void %main_1
+        %414 = OpLoad %v4float %x_GLF_color
+        %415 = OpCompositeConstruct %main_out %414
+        %413 = OpFunctionCall %void %tint_symbol_3 %415
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 209[%209] is not post dominated by the back-edge block 255[%255]
+  %255 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..c8f464e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/0.wgsl.expected.wgsl
@@ -0,0 +1,306 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> data : array<i32, 10>;
+
+var<private> temp : array<i32, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn merge_i1_i1_i1_(from : ptr<function, i32>, mid : ptr<function, i32>, to : ptr<function, i32>) {
+  var k : i32;
+  var i : i32;
+  var j : i32;
+  var i_1 : i32;
+  let x_251 : i32 = *(from);
+  k = x_251;
+  let x_252 : i32 = *(from);
+  i = x_252;
+  let x_253 : i32 = *(mid);
+  j = (x_253 + 1);
+  loop {
+    let x_259 : i32 = i;
+    let x_260 : i32 = *(mid);
+    let x_262 : i32 = j;
+    let x_263 : i32 = *(to);
+    if (((x_259 <= x_260) && (x_262 <= x_263))) {
+    } else {
+      break;
+    }
+    let x_267 : i32 = i;
+    let x_269 : i32 = data[x_267];
+    let x_270 : i32 = j;
+    let x_272 : i32 = data[x_270];
+    if ((x_269 < x_272)) {
+      let x_277 : i32 = k;
+      k = (x_277 + 1);
+      let x_279 : i32 = i;
+      i = (x_279 + 1);
+      let x_282 : i32 = data[x_279];
+      temp[x_277] = x_282;
+    } else {
+      let x_284 : i32 = k;
+      k = (x_284 + 1);
+      let x_286 : i32 = j;
+      j = (x_286 + 1);
+      let x_289 : i32 = data[x_286];
+      temp[x_284] = x_289;
+    }
+  }
+  loop {
+    let x_295 : i32 = i;
+    let x_297 : i32 = i;
+    let x_298 : i32 = *(mid);
+    if (((x_295 < 10) && (x_297 <= x_298))) {
+    } else {
+      break;
+    }
+    let x_302 : i32 = k;
+    k = (x_302 + 1);
+    let x_304 : i32 = i;
+    i = (x_304 + 1);
+    let x_307 : i32 = data[x_304];
+    temp[x_302] = x_307;
+  }
+  let x_309 : i32 = *(from);
+  i_1 = x_309;
+  loop {
+    let x_314 : i32 = i_1;
+    let x_315 : i32 = *(to);
+    if ((x_314 <= x_315)) {
+    } else {
+      break;
+    }
+    let x_318 : i32 = i_1;
+    let x_319 : i32 = i_1;
+    let x_321 : i32 = temp[x_319];
+    data[x_318] = x_321;
+
+    continuing {
+      let x_323 : i32 = i_1;
+      i_1 = (x_323 + 1);
+    }
+  }
+  return;
+}
+
+fn mergeSort_() {
+  var low : i32;
+  var high : i32;
+  var m : i32;
+  var i_2 : i32;
+  var from_1 : i32;
+  var mid_1 : i32;
+  var to_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  low = 0;
+  high = 9;
+  m = 1;
+  loop {
+    let x_330 : i32 = m;
+    let x_331 : i32 = high;
+    if ((x_330 <= x_331)) {
+    } else {
+      break;
+    }
+    let x_334 : i32 = low;
+    i_2 = x_334;
+    loop {
+      let x_339 : i32 = i_2;
+      let x_340 : i32 = high;
+      if ((x_339 < x_340)) {
+      } else {
+        break;
+      }
+      let x_343 : i32 = i_2;
+      from_1 = x_343;
+      let x_344 : i32 = i_2;
+      let x_345 : i32 = m;
+      mid_1 = ((x_344 + x_345) - 1);
+      let x_348 : i32 = i_2;
+      let x_349 : i32 = m;
+      let x_353 : i32 = high;
+      to_1 = min(((x_348 + (2 * x_349)) - 1), x_353);
+      let x_355 : i32 = from_1;
+      param = x_355;
+      let x_356 : i32 = mid_1;
+      param_1 = x_356;
+      let x_357 : i32 = to_1;
+      param_2 = x_357;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2));
+
+      continuing {
+        let x_359 : i32 = m;
+        let x_361 : i32 = i_2;
+        i_2 = (x_361 + (2 * x_359));
+      }
+    }
+
+    continuing {
+      let x_363 : i32 = m;
+      m = (2 * x_363);
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_3 : i32;
+  var j_1 : i32;
+  var grey : f32;
+  let x_84 : f32 = x_28.injectionSwitch.x;
+  i_3 = i32(x_84);
+  loop {
+    let x_90 : i32 = i_3;
+    switch(x_90) {
+      case 9: {
+        let x_120 : i32 = i_3;
+        data[x_120] = -5;
+      }
+      case 8: {
+        let x_118 : i32 = i_3;
+        data[x_118] = -4;
+      }
+      case 7: {
+        let x_116 : i32 = i_3;
+        data[x_116] = -3;
+      }
+      case 6: {
+        let x_114 : i32 = i_3;
+        data[x_114] = -2;
+      }
+      case 5: {
+        let x_112 : i32 = i_3;
+        data[x_112] = -1;
+      }
+      case 4: {
+        let x_110 : i32 = i_3;
+        data[x_110] = 0;
+      }
+      case 3: {
+        let x_108 : i32 = i_3;
+        data[x_108] = 1;
+      }
+      case 2: {
+        let x_106 : i32 = i_3;
+        data[x_106] = 2;
+      }
+      case 1: {
+        let x_104 : i32 = i_3;
+        data[x_104] = 3;
+      }
+      case 0: {
+        let x_102 : i32 = i_3;
+        data[x_102] = 4;
+      }
+      default: {
+      }
+    }
+    let x_122 : i32 = i_3;
+    i_3 = (x_122 + 1);
+
+    continuing {
+      let x_124 : i32 = i_3;
+      if ((x_124 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  loop {
+    let x_130 : i32 = j_1;
+    if ((x_130 < 10)) {
+    } else {
+      break;
+    }
+    let x_133 : i32 = j_1;
+    let x_134 : i32 = j_1;
+    let x_136 : i32 = data[x_134];
+    temp[x_133] = x_136;
+
+    continuing {
+      let x_138 : i32 = j_1;
+      j_1 = (x_138 + 1);
+    }
+  }
+  mergeSort_();
+  let x_142 : f32 = gl_FragCoord.y;
+  if ((i32(x_142) < 30)) {
+    let x_149 : i32 = data[0];
+    grey = (0.5 + (f32(x_149) / 10.0));
+  } else {
+    let x_154 : f32 = gl_FragCoord.y;
+    if ((i32(x_154) < 60)) {
+      let x_161 : i32 = data[1];
+      grey = (0.5 + (f32(x_161) / 10.0));
+    } else {
+      let x_166 : f32 = gl_FragCoord.y;
+      if ((i32(x_166) < 90)) {
+        let x_173 : i32 = data[2];
+        grey = (0.5 + (f32(x_173) / 10.0));
+      } else {
+        let x_178 : f32 = gl_FragCoord.y;
+        if ((i32(x_178) < 120)) {
+          let x_185 : i32 = data[3];
+          grey = (0.5 + (f32(x_185) / 10.0));
+        } else {
+          let x_190 : f32 = gl_FragCoord.y;
+          if ((i32(x_190) < 150)) {
+            discard;
+          } else {
+            let x_197 : f32 = gl_FragCoord.y;
+            if ((i32(x_197) < 180)) {
+              let x_204 : i32 = data[5];
+              grey = (0.5 + (f32(x_204) / 10.0));
+            } else {
+              let x_209 : f32 = gl_FragCoord.y;
+              if ((i32(x_209) < 210)) {
+                let x_216 : i32 = data[6];
+                grey = (0.5 + (f32(x_216) / 10.0));
+              } else {
+                let x_221 : f32 = gl_FragCoord.y;
+                if ((i32(x_221) < 240)) {
+                  let x_228 : i32 = data[7];
+                  grey = (0.5 + (f32(x_228) / 10.0));
+                } else {
+                  let x_233 : f32 = gl_FragCoord.y;
+                  if ((i32(x_233) < 270)) {
+                    let x_240 : i32 = data[8];
+                    grey = (0.5 + (f32(x_240) / 10.0));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  let x_244 : f32 = grey;
+  let x_245 : vec3<f32> = vec3<f32>(x_244, x_244, x_244);
+  x_GLF_color = vec4<f32>(x_245.x, x_245.y, x_245.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/1.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/1.spvasm
new file mode 100644
index 0000000..bfbb984
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/1.spvasm
@@ -0,0 +1,571 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %merge_i1_i1_i1_ "merge(i1;i1;i1;"
+               OpName %from "from"
+               OpName %mid "mid"
+               OpName %to "to"
+               OpName %mergeSort_ "mergeSort("
+               OpName %k "k"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %data "data"
+               OpName %temp "temp"
+               OpName %i_0 "i"
+               OpName %low "low"
+               OpName %high "high"
+               OpName %m "m"
+               OpName %i_1 "i"
+               OpName %from_0 "from"
+               OpName %mid_0 "mid"
+               OpName %to_0 "to"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %param_1 "param"
+               OpName %i_2 "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %j_0 "j"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %grey "grey"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %32 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %35 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int %_ptr_Function_int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Private__arr_int_uint_10 = OpTypePointer Private %_arr_int_uint_10
+       %data = OpVariable %_ptr_Private__arr_int_uint_10 Private
+%_ptr_Private_int = OpTypePointer Private %int
+       %temp = OpVariable %_ptr_Private__arr_int_uint_10 Private
+     %int_10 = OpConstant %int 10
+      %int_0 = OpConstant %int 0
+      %int_9 = OpConstant %int 9
+      %int_2 = OpConstant %int 2
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_4 = OpConstant %int 4
+      %int_3 = OpConstant %int 3
+     %int_n1 = OpConstant %int -1
+     %int_n2 = OpConstant %int -2
+     %int_n3 = OpConstant %int -3
+     %int_n4 = OpConstant %int -4
+     %int_n5 = OpConstant %int -5
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+     %int_30 = OpConstant %int 30
+%_ptr_Function_float = OpTypePointer Function %float
+  %float_0_5 = OpConstant %float 0.5
+   %float_10 = OpConstant %float 10
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %v3float = OpTypeVector %float 3
+    %float_1 = OpConstant %float 1
+      %false = OpConstantFalse %bool
+    %float_0 = OpConstant %float 0
+       %main = OpFunction %void None %32
+         %84 = OpLabel
+        %i_2 = OpVariable %_ptr_Function_int Function
+        %j_0 = OpVariable %_ptr_Function_int Function
+       %grey = OpVariable %_ptr_Function_float Function
+         %85 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %86 = OpLoad %float %85
+         %87 = OpConvertFToS %int %86
+               OpStore %i_2 %87
+               OpBranch %88
+         %88 = OpLabel
+               OpLoopMerge %89 %90 None
+               OpBranch %91
+         %91 = OpLabel
+         %92 = OpLoad %int %i_2
+               OpSelectionMerge %93 None
+               OpSwitch %92 %93 0 %94 1 %95 2 %96 3 %97 4 %98 5 %99 6 %100 7 %101 8 %102 9 %103
+         %94 = OpLabel
+        %104 = OpLoad %int %i_2
+        %105 = OpAccessChain %_ptr_Private_int %data %104
+               OpStore %105 %int_4
+               OpBranch %93
+         %95 = OpLabel
+        %106 = OpLoad %int %i_2
+        %107 = OpAccessChain %_ptr_Private_int %data %106
+               OpStore %107 %int_3
+               OpBranch %93
+         %96 = OpLabel
+        %108 = OpLoad %int %i_2
+        %109 = OpAccessChain %_ptr_Private_int %data %108
+               OpStore %109 %int_2
+               OpBranch %93
+         %97 = OpLabel
+        %110 = OpLoad %int %i_2
+        %111 = OpAccessChain %_ptr_Private_int %data %110
+               OpStore %111 %int_1
+               OpBranch %93
+         %98 = OpLabel
+        %112 = OpLoad %int %i_2
+        %113 = OpAccessChain %_ptr_Private_int %data %112
+               OpStore %113 %int_0
+               OpBranch %93
+         %99 = OpLabel
+        %114 = OpLoad %int %i_2
+        %115 = OpAccessChain %_ptr_Private_int %data %114
+               OpStore %115 %int_n1
+               OpBranch %93
+        %100 = OpLabel
+        %116 = OpLoad %int %i_2
+        %117 = OpAccessChain %_ptr_Private_int %data %116
+               OpStore %117 %int_n2
+               OpBranch %93
+        %101 = OpLabel
+        %118 = OpLoad %int %i_2
+        %119 = OpAccessChain %_ptr_Private_int %data %118
+               OpStore %119 %int_n3
+               OpBranch %93
+        %102 = OpLabel
+        %120 = OpLoad %int %i_2
+        %121 = OpAccessChain %_ptr_Private_int %data %120
+               OpStore %121 %int_n4
+               OpBranch %93
+        %103 = OpLabel
+        %122 = OpLoad %int %i_2
+        %123 = OpAccessChain %_ptr_Private_int %data %122
+               OpStore %123 %int_n5
+               OpBranch %93
+         %93 = OpLabel
+        %124 = OpLoad %int %i_2
+        %125 = OpIAdd %int %124 %int_1
+               OpStore %i_2 %125
+               OpBranch %90
+         %90 = OpLabel
+        %126 = OpLoad %int %i_2
+        %127 = OpSLessThan %bool %126 %int_10
+               OpBranchConditional %127 %88 %89
+         %89 = OpLabel
+               OpStore %j_0 %int_0
+               OpBranch %128
+        %128 = OpLabel
+               OpLoopMerge %129 %130 None
+               OpBranch %131
+        %131 = OpLabel
+        %132 = OpLoad %int %j_0
+        %133 = OpSLessThan %bool %132 %int_10
+        %134 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+        %135 = OpLoad %float %134
+        %136 = OpFUnordGreaterThan %bool %135 %float_1
+               OpSelectionMerge %137 None
+               OpBranchConditional %136 %138 %137
+        %138 = OpLabel
+               OpStore %grey %float_1
+               OpBranchConditional %false %137 %137
+        %137 = OpLabel
+               OpBranchConditional %133 %139 %129
+        %139 = OpLabel
+        %140 = OpLoad %int %j_0
+        %141 = OpLoad %int %j_0
+        %142 = OpAccessChain %_ptr_Private_int %data %141
+        %143 = OpLoad %int %142
+        %144 = OpAccessChain %_ptr_Private_int %temp %140
+               OpStore %144 %143
+               OpBranch %130
+        %130 = OpLabel
+        %145 = OpLoad %int %j_0
+        %146 = OpIAdd %int %145 %int_1
+               OpStore %j_0 %146
+               OpBranch %128
+        %129 = OpLabel
+        %147 = OpFunctionCall %void %mergeSort_
+        %148 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %149 = OpLoad %float %148
+        %150 = OpConvertFToS %int %149
+        %151 = OpSLessThan %bool %150 %int_30
+               OpSelectionMerge %152 None
+               OpBranchConditional %151 %153 %154
+        %153 = OpLabel
+        %155 = OpAccessChain %_ptr_Private_int %data %int_0
+        %156 = OpLoad %int %155
+        %157 = OpConvertSToF %float %156
+        %158 = OpFDiv %float %157 %float_10
+        %159 = OpFAdd %float %float_0_5 %158
+               OpStore %grey %159
+               OpBranch %152
+        %154 = OpLabel
+        %160 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %161 = OpLoad %float %160
+        %162 = OpConvertFToS %int %161
+        %163 = OpSLessThan %bool %162 %int_60
+               OpSelectionMerge %164 None
+               OpBranchConditional %163 %165 %166
+        %165 = OpLabel
+        %167 = OpAccessChain %_ptr_Private_int %data %int_1
+        %168 = OpLoad %int %167
+        %169 = OpConvertSToF %float %168
+        %170 = OpFDiv %float %169 %float_10
+        %171 = OpFAdd %float %float_0_5 %170
+               OpStore %grey %171
+               OpBranch %164
+        %166 = OpLabel
+        %172 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %173 = OpLoad %float %172
+        %174 = OpConvertFToS %int %173
+        %175 = OpSLessThan %bool %174 %int_90
+               OpSelectionMerge %176 None
+               OpBranchConditional %175 %177 %178
+        %177 = OpLabel
+        %179 = OpAccessChain %_ptr_Private_int %data %int_2
+        %180 = OpLoad %int %179
+        %181 = OpConvertSToF %float %180
+        %182 = OpFDiv %float %181 %float_10
+        %183 = OpFAdd %float %float_0_5 %182
+               OpStore %grey %183
+               OpBranch %176
+        %178 = OpLabel
+        %184 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %185 = OpLoad %float %184
+        %186 = OpConvertFToS %int %185
+        %187 = OpSLessThan %bool %186 %int_120
+               OpSelectionMerge %188 None
+               OpBranchConditional %187 %189 %190
+        %189 = OpLabel
+        %191 = OpAccessChain %_ptr_Private_int %data %int_3
+        %192 = OpLoad %int %191
+        %193 = OpConvertSToF %float %192
+        %194 = OpFDiv %float %193 %float_10
+        %195 = OpFAdd %float %float_0_5 %194
+               OpStore %grey %195
+               OpBranch %188
+        %190 = OpLabel
+        %196 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %197 = OpLoad %float %196
+        %198 = OpConvertFToS %int %197
+        %199 = OpSLessThan %bool %198 %int_150
+               OpSelectionMerge %200 None
+               OpBranchConditional %199 %201 %202
+        %201 = OpLabel
+               OpKill
+        %202 = OpLabel
+        %203 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %204 = OpLoad %float %203
+        %205 = OpConvertFToS %int %204
+        %206 = OpSLessThan %bool %205 %int_180
+               OpSelectionMerge %207 None
+               OpBranchConditional %206 %208 %209
+        %208 = OpLabel
+        %210 = OpAccessChain %_ptr_Private_int %data %int_5
+        %211 = OpLoad %int %210
+        %212 = OpConvertSToF %float %211
+        %213 = OpFDiv %float %212 %float_10
+        %214 = OpFAdd %float %float_0_5 %213
+               OpStore %grey %214
+               OpBranch %207
+        %209 = OpLabel
+        %215 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %216 = OpLoad %float %215
+        %217 = OpConvertFToS %int %216
+        %218 = OpSLessThan %bool %217 %int_210
+               OpSelectionMerge %219 None
+               OpBranchConditional %218 %220 %221
+        %220 = OpLabel
+        %222 = OpAccessChain %_ptr_Private_int %data %int_6
+        %223 = OpLoad %int %222
+        %224 = OpConvertSToF %float %223
+        %225 = OpFDiv %float %224 %float_10
+        %226 = OpFAdd %float %float_0_5 %225
+               OpStore %grey %226
+               OpBranch %219
+        %221 = OpLabel
+        %227 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %228 = OpLoad %float %227
+        %229 = OpConvertFToS %int %228
+        %230 = OpSLessThan %bool %229 %int_240
+               OpSelectionMerge %231 None
+               OpBranchConditional %230 %232 %233
+        %232 = OpLabel
+        %234 = OpAccessChain %_ptr_Private_int %data %int_7
+        %235 = OpLoad %int %234
+        %236 = OpConvertSToF %float %235
+        %237 = OpFDiv %float %236 %float_10
+        %238 = OpFAdd %float %float_0_5 %237
+               OpStore %grey %238
+               OpBranch %231
+        %233 = OpLabel
+        %239 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %240 = OpLoad %float %239
+        %241 = OpConvertFToS %int %240
+        %242 = OpSLessThan %bool %241 %int_270
+               OpSelectionMerge %243 None
+               OpBranchConditional %242 %244 %245
+        %244 = OpLabel
+        %246 = OpAccessChain %_ptr_Private_int %data %int_8
+        %247 = OpLoad %int %246
+        %248 = OpConvertSToF %float %247
+        %249 = OpFDiv %float %248 %float_10
+        %250 = OpFAdd %float %float_0_5 %249
+               OpStore %grey %250
+               OpBranch %243
+        %245 = OpLabel
+        %251 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+        %252 = OpLoad %float %251
+        %253 = OpFUnordGreaterThanEqual %bool %float_0 %252
+               OpBranchConditional %253 %243 %254
+        %254 = OpLabel
+               OpKill
+        %243 = OpLabel
+               OpBranch %231
+        %231 = OpLabel
+               OpBranch %219
+        %219 = OpLabel
+               OpBranch %207
+        %207 = OpLabel
+               OpBranch %200
+        %200 = OpLabel
+               OpBranch %188
+        %188 = OpLabel
+               OpBranch %176
+        %176 = OpLabel
+               OpBranch %164
+        %164 = OpLabel
+               OpBranch %152
+        %152 = OpLabel
+        %255 = OpLoad %float %grey
+        %256 = OpCompositeConstruct %v3float %255 %255 %255
+        %257 = OpCompositeExtract %float %256 0
+        %258 = OpCompositeExtract %float %256 1
+        %259 = OpCompositeExtract %float %256 2
+        %260 = OpCompositeConstruct %v4float %257 %258 %259 %float_1
+               OpStore %_GLF_color %260
+               OpReturn
+               OpFunctionEnd
+%merge_i1_i1_i1_ = OpFunction %void None %35
+       %from = OpFunctionParameter %_ptr_Function_int
+        %mid = OpFunctionParameter %_ptr_Function_int
+         %to = OpFunctionParameter %_ptr_Function_int
+        %261 = OpLabel
+          %k = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+          %j = OpVariable %_ptr_Function_int Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+        %262 = OpLoad %int %from
+               OpStore %k %262
+        %263 = OpLoad %int %from
+               OpStore %i %263
+        %264 = OpLoad %int %mid
+        %265 = OpIAdd %int %264 %int_1
+               OpStore %j %265
+               OpBranch %266
+        %266 = OpLabel
+               OpLoopMerge %267 %268 None
+               OpBranch %269
+        %269 = OpLabel
+        %270 = OpLoad %int %i
+        %271 = OpLoad %int %mid
+        %272 = OpSLessThanEqual %bool %270 %271
+        %273 = OpLoad %int %j
+        %274 = OpLoad %int %to
+        %275 = OpSLessThanEqual %bool %273 %274
+        %276 = OpLogicalAnd %bool %272 %275
+               OpBranchConditional %276 %277 %267
+        %277 = OpLabel
+        %278 = OpLoad %int %i
+        %279 = OpAccessChain %_ptr_Private_int %data %278
+        %280 = OpLoad %int %279
+        %281 = OpLoad %int %j
+        %282 = OpAccessChain %_ptr_Private_int %data %281
+        %283 = OpLoad %int %282
+        %284 = OpSLessThan %bool %280 %283
+               OpSelectionMerge %285 None
+               OpBranchConditional %284 %286 %287
+        %286 = OpLabel
+        %288 = OpLoad %int %k
+        %289 = OpIAdd %int %288 %int_1
+               OpStore %k %289
+        %290 = OpLoad %int %i
+        %291 = OpIAdd %int %290 %int_1
+               OpStore %i %291
+        %292 = OpAccessChain %_ptr_Private_int %data %290
+        %293 = OpLoad %int %292
+        %294 = OpAccessChain %_ptr_Private_int %temp %288
+               OpStore %294 %293
+               OpBranch %285
+        %287 = OpLabel
+        %295 = OpLoad %int %k
+        %296 = OpIAdd %int %295 %int_1
+               OpStore %k %296
+        %297 = OpLoad %int %j
+        %298 = OpIAdd %int %297 %int_1
+               OpStore %j %298
+        %299 = OpAccessChain %_ptr_Private_int %data %297
+        %300 = OpLoad %int %299
+        %301 = OpAccessChain %_ptr_Private_int %temp %295
+               OpStore %301 %300
+               OpBranch %285
+        %285 = OpLabel
+               OpBranch %268
+        %268 = OpLabel
+               OpBranch %266
+        %267 = OpLabel
+               OpBranch %302
+        %302 = OpLabel
+               OpLoopMerge %303 %304 None
+               OpBranch %305
+        %305 = OpLabel
+        %306 = OpLoad %int %i
+        %307 = OpSLessThan %bool %306 %int_10
+        %308 = OpLoad %int %i
+        %309 = OpLoad %int %mid
+        %310 = OpSLessThanEqual %bool %308 %309
+        %311 = OpLogicalAnd %bool %307 %310
+               OpBranchConditional %311 %312 %303
+        %312 = OpLabel
+        %313 = OpLoad %int %k
+        %314 = OpIAdd %int %313 %int_1
+               OpStore %k %314
+        %315 = OpLoad %int %i
+        %316 = OpIAdd %int %315 %int_1
+               OpStore %i %316
+        %317 = OpAccessChain %_ptr_Private_int %data %315
+        %318 = OpLoad %int %317
+        %319 = OpAccessChain %_ptr_Private_int %temp %313
+               OpStore %319 %318
+               OpBranch %304
+        %304 = OpLabel
+               OpBranch %302
+        %303 = OpLabel
+        %320 = OpLoad %int %from
+               OpStore %i_0 %320
+               OpBranch %321
+        %321 = OpLabel
+               OpLoopMerge %322 %323 None
+               OpBranch %324
+        %324 = OpLabel
+        %325 = OpLoad %int %i_0
+        %326 = OpLoad %int %to
+        %327 = OpSLessThanEqual %bool %325 %326
+               OpBranchConditional %327 %328 %322
+        %328 = OpLabel
+        %329 = OpLoad %int %i_0
+        %330 = OpLoad %int %i_0
+        %331 = OpAccessChain %_ptr_Private_int %temp %330
+        %332 = OpLoad %int %331
+        %333 = OpAccessChain %_ptr_Private_int %data %329
+               OpStore %333 %332
+               OpBranch %323
+        %323 = OpLabel
+        %334 = OpLoad %int %i_0
+        %335 = OpIAdd %int %334 %int_1
+               OpStore %i_0 %335
+               OpBranch %321
+        %322 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %mergeSort_ = OpFunction %void None %32
+        %336 = OpLabel
+        %low = OpVariable %_ptr_Function_int Function
+       %high = OpVariable %_ptr_Function_int Function
+          %m = OpVariable %_ptr_Function_int Function
+        %i_1 = OpVariable %_ptr_Function_int Function
+     %from_0 = OpVariable %_ptr_Function_int Function
+      %mid_0 = OpVariable %_ptr_Function_int Function
+       %to_0 = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_int Function
+    %param_0 = OpVariable %_ptr_Function_int Function
+    %param_1 = OpVariable %_ptr_Function_int Function
+               OpStore %low %int_0
+               OpStore %high %int_9
+               OpStore %m %int_1
+               OpBranch %337
+        %337 = OpLabel
+               OpLoopMerge %338 %339 None
+               OpBranch %340
+        %340 = OpLabel
+        %341 = OpLoad %int %m
+        %342 = OpLoad %int %high
+        %343 = OpSLessThanEqual %bool %341 %342
+               OpBranchConditional %343 %344 %338
+        %344 = OpLabel
+        %345 = OpLoad %int %low
+               OpStore %i_1 %345
+               OpBranch %346
+        %346 = OpLabel
+               OpLoopMerge %347 %348 None
+               OpBranch %349
+        %349 = OpLabel
+        %350 = OpLoad %int %i_1
+        %351 = OpLoad %int %high
+        %352 = OpSLessThan %bool %350 %351
+               OpBranchConditional %352 %353 %347
+        %353 = OpLabel
+        %354 = OpLoad %int %i_1
+               OpStore %from_0 %354
+        %355 = OpLoad %int %i_1
+        %356 = OpLoad %int %m
+        %357 = OpIAdd %int %355 %356
+        %358 = OpISub %int %357 %int_1
+               OpStore %mid_0 %358
+        %359 = OpLoad %int %i_1
+        %360 = OpLoad %int %m
+        %361 = OpIMul %int %int_2 %360
+        %362 = OpIAdd %int %359 %361
+        %363 = OpISub %int %362 %int_1
+        %364 = OpLoad %int %high
+        %365 = OpExtInst %int %1 SMin %363 %364
+               OpStore %to_0 %365
+        %366 = OpLoad %int %from_0
+               OpStore %param %366
+        %367 = OpLoad %int %mid_0
+               OpStore %param_0 %367
+        %368 = OpLoad %int %to_0
+               OpStore %param_1 %368
+        %369 = OpFunctionCall %void %merge_i1_i1_i1_ %param %param_0 %param_1
+               OpBranch %348
+        %348 = OpLabel
+        %370 = OpLoad %int %m
+        %371 = OpIMul %int %int_2 %370
+        %372 = OpLoad %int %i_1
+        %373 = OpIAdd %int %372 %371
+               OpStore %i_1 %373
+               OpBranch %346
+        %347 = OpLabel
+               OpBranch %339
+        %339 = OpLabel
+        %374 = OpLoad %int %m
+        %375 = OpIMul %int %int_2 %374
+               OpStore %m %375
+               OpBranch %337
+        %338 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..b21b248
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/1.spvasm.expected.hlsl
@@ -0,0 +1,288 @@
+static int data[10] = (int[10])0;
+static int temp[10] = (int[10])0;
+cbuffer cbuffer_x_28 : register(b0, space0) {
+  uint4 x_28[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void merge_i1_i1_i1_(inout int from, inout int mid, inout int to) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  const int x_262 = from;
+  k = x_262;
+  const int x_263 = from;
+  i = x_263;
+  const int x_264 = mid;
+  j = (x_264 + 1);
+  while (true) {
+    const int x_270 = i;
+    const int x_271 = mid;
+    const int x_273 = j;
+    const int x_274 = to;
+    bool tint_tmp = (x_270 <= x_271);
+    if (tint_tmp) {
+      tint_tmp = (x_273 <= x_274);
+    }
+    if ((tint_tmp)) {
+    } else {
+      break;
+    }
+    const int x_280 = data[i];
+    const int x_283 = data[j];
+    if ((x_280 < x_283)) {
+      const int x_288 = k;
+      k = (x_288 + 1);
+      const int x_290 = i;
+      i = (x_290 + 1);
+      const int x_293 = data[x_290];
+      temp[x_288] = x_293;
+    } else {
+      const int x_295 = k;
+      k = (x_295 + 1);
+      const int x_297 = j;
+      j = (x_297 + 1);
+      const int x_300 = data[x_297];
+      temp[x_295] = x_300;
+    }
+  }
+  while (true) {
+    const int x_306 = i;
+    const int x_308 = i;
+    const int x_309 = mid;
+    bool tint_tmp_1 = (x_306 < 10);
+    if (tint_tmp_1) {
+      tint_tmp_1 = (x_308 <= x_309);
+    }
+    if ((tint_tmp_1)) {
+    } else {
+      break;
+    }
+    const int x_313 = k;
+    k = (x_313 + 1);
+    const int x_315 = i;
+    i = (x_315 + 1);
+    const int x_318 = data[x_315];
+    temp[x_313] = x_318;
+  }
+  const int x_320 = from;
+  i_1 = x_320;
+  while (true) {
+    const int x_325 = i_1;
+    const int x_326 = to;
+    if ((x_325 <= x_326)) {
+    } else {
+      break;
+    }
+    const int x_329 = i_1;
+    const int x_332 = temp[i_1];
+    data[x_329] = x_332;
+    {
+      i_1 = (i_1 + 1);
+    }
+  }
+  return;
+}
+
+void mergeSort_() {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  {
+    for(; (m <= high); m = (2 * m)) {
+      i_2 = low;
+      {
+        for(; (i_2 < high); i_2 = (i_2 + (2 * m))) {
+          from_1 = i_2;
+          mid_1 = ((i_2 + m) - 1);
+          to_1 = min(((i_2 + (2 * m)) - 1), high);
+          param = from_1;
+          param_1 = mid_1;
+          param_2 = to_1;
+          merge_i1_i1_i1_(param, param_1, param_2);
+        }
+      }
+    }
+  }
+  return;
+}
+
+void main_1() {
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  const float x_86 = asfloat(x_28[0].x);
+  i_3 = int(x_86);
+  while (true) {
+    switch(i_3) {
+      case 9: {
+        data[i_3] = -5;
+        break;
+      }
+      case 8: {
+        data[i_3] = -4;
+        break;
+      }
+      case 7: {
+        data[i_3] = -3;
+        break;
+      }
+      case 6: {
+        data[i_3] = -2;
+        break;
+      }
+      case 5: {
+        data[i_3] = -1;
+        break;
+      }
+      case 4: {
+        data[i_3] = 0;
+        break;
+      }
+      case 3: {
+        data[i_3] = 1;
+        break;
+      }
+      case 2: {
+        data[i_3] = 2;
+        break;
+      }
+      case 1: {
+        data[i_3] = 3;
+        break;
+      }
+      case 0: {
+        data[i_3] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    i_3 = (i_3 + 1);
+    {
+      if ((i_3 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  while (true) {
+    const bool x_133 = (j_1 < 10);
+    const float x_135 = asfloat(x_28[0].x);
+    if (!((x_135 <= 1.0f))) {
+      grey = 1.0f;
+    }
+    if (x_133) {
+    } else {
+      break;
+    }
+    const int x_140 = j_1;
+    const int x_143 = data[j_1];
+    temp[x_140] = x_143;
+    {
+      j_1 = (j_1 + 1);
+    }
+  }
+  mergeSort_();
+  const float x_149 = gl_FragCoord.y;
+  if ((int(x_149) < 30)) {
+    const int x_156 = data[0];
+    grey = (0.5f + (float(x_156) / 10.0f));
+  } else {
+    const float x_161 = gl_FragCoord.y;
+    if ((int(x_161) < 60)) {
+      const int x_168 = data[1];
+      grey = (0.5f + (float(x_168) / 10.0f));
+    } else {
+      const float x_173 = gl_FragCoord.y;
+      if ((int(x_173) < 90)) {
+        const int x_180 = data[2];
+        grey = (0.5f + (float(x_180) / 10.0f));
+      } else {
+        const float x_185 = gl_FragCoord.y;
+        if ((int(x_185) < 120)) {
+          const int x_192 = data[3];
+          grey = (0.5f + (float(x_192) / 10.0f));
+        } else {
+          const float x_197 = gl_FragCoord.y;
+          if ((int(x_197) < 150)) {
+            discard;
+          } else {
+            const float x_204 = gl_FragCoord.y;
+            if ((int(x_204) < 180)) {
+              const int x_211 = data[5];
+              grey = (0.5f + (float(x_211) / 10.0f));
+            } else {
+              const float x_216 = gl_FragCoord.y;
+              if ((int(x_216) < 210)) {
+                const int x_223 = data[6];
+                grey = (0.5f + (float(x_223) / 10.0f));
+              } else {
+                const float x_228 = gl_FragCoord.y;
+                if ((int(x_228) < 240)) {
+                  const int x_235 = data[7];
+                  grey = (0.5f + (float(x_235) / 10.0f));
+                } else {
+                  const float x_240 = gl_FragCoord.y;
+                  bool guard233 = true;
+                  if ((int(x_240) < 270)) {
+                    const int x_247 = data[8];
+                    grey = (0.5f + (float(x_247) / 10.0f));
+                    guard233 = false;
+                  } else {
+                    if (guard233) {
+                      const float x_252 = asfloat(x_28[0].y);
+                      if (!((0.0f < x_252))) {
+                        guard233 = false;
+                      }
+                      if (guard233) {
+                        discard;
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  const float x_255 = grey;
+  const float3 x_256 = float3(x_255, x_255, x_255);
+  x_GLF_color = float4(x_256.x, x_256.y, x_256.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/1.spvasm.expected.msl
new file mode 100644
index 0000000..941121e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/1.spvasm.expected.msl
@@ -0,0 +1,329 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void merge_i1_i1_i1_(thread int* const from, thread int* const mid, thread int* const to, thread tint_array_wrapper* const tint_symbol_5, thread tint_array_wrapper* const tint_symbol_6) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  int const x_262 = *(from);
+  k = x_262;
+  int const x_263 = *(from);
+  i = x_263;
+  int const x_264 = *(mid);
+  j = (x_264 + 1);
+  while (true) {
+    int const x_270 = i;
+    int const x_271 = *(mid);
+    int const x_273 = j;
+    int const x_274 = *(to);
+    if (((x_270 <= x_271) && (x_273 <= x_274))) {
+    } else {
+      break;
+    }
+    int const x_278 = i;
+    int const x_280 = (*(tint_symbol_5)).arr[x_278];
+    int const x_281 = j;
+    int const x_283 = (*(tint_symbol_5)).arr[x_281];
+    if ((x_280 < x_283)) {
+      int const x_288 = k;
+      k = (x_288 + 1);
+      int const x_290 = i;
+      i = (x_290 + 1);
+      int const x_293 = (*(tint_symbol_5)).arr[x_290];
+      (*(tint_symbol_6)).arr[x_288] = x_293;
+    } else {
+      int const x_295 = k;
+      k = (x_295 + 1);
+      int const x_297 = j;
+      j = (x_297 + 1);
+      int const x_300 = (*(tint_symbol_5)).arr[x_297];
+      (*(tint_symbol_6)).arr[x_295] = x_300;
+    }
+  }
+  while (true) {
+    int const x_306 = i;
+    int const x_308 = i;
+    int const x_309 = *(mid);
+    if (((x_306 < 10) && (x_308 <= x_309))) {
+    } else {
+      break;
+    }
+    int const x_313 = k;
+    k = (x_313 + 1);
+    int const x_315 = i;
+    i = (x_315 + 1);
+    int const x_318 = (*(tint_symbol_5)).arr[x_315];
+    (*(tint_symbol_6)).arr[x_313] = x_318;
+  }
+  int const x_320 = *(from);
+  i_1 = x_320;
+  while (true) {
+    int const x_325 = i_1;
+    int const x_326 = *(to);
+    if ((x_325 <= x_326)) {
+    } else {
+      break;
+    }
+    int const x_329 = i_1;
+    int const x_330 = i_1;
+    int const x_332 = (*(tint_symbol_6)).arr[x_330];
+    (*(tint_symbol_5)).arr[x_329] = x_332;
+    {
+      int const x_334 = i_1;
+      i_1 = (x_334 + 1);
+    }
+  }
+  return;
+}
+
+void mergeSort_(thread tint_array_wrapper* const tint_symbol_7, thread tint_array_wrapper* const tint_symbol_8) {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  while (true) {
+    int const x_341 = m;
+    int const x_342 = high;
+    if ((x_341 <= x_342)) {
+    } else {
+      break;
+    }
+    int const x_345 = low;
+    i_2 = x_345;
+    while (true) {
+      int const x_350 = i_2;
+      int const x_351 = high;
+      if ((x_350 < x_351)) {
+      } else {
+        break;
+      }
+      int const x_354 = i_2;
+      from_1 = x_354;
+      int const x_355 = i_2;
+      int const x_356 = m;
+      mid_1 = ((x_355 + x_356) - 1);
+      int const x_359 = i_2;
+      int const x_360 = m;
+      int const x_364 = high;
+      to_1 = min(((x_359 + (2 * x_360)) - 1), x_364);
+      int const x_366 = from_1;
+      param = x_366;
+      int const x_367 = mid_1;
+      param_1 = x_367;
+      int const x_368 = to_1;
+      param_2 = x_368;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2), tint_symbol_7, tint_symbol_8);
+      {
+        int const x_370 = m;
+        int const x_372 = i_2;
+        i_2 = (x_372 + (2 * x_370));
+      }
+    }
+    {
+      int const x_374 = m;
+      m = (2 * x_374);
+    }
+  }
+  return;
+}
+
+void main_1(constant buf0& x_28, thread tint_array_wrapper* const tint_symbol_9, thread tint_array_wrapper* const tint_symbol_10, thread float4* const tint_symbol_11, thread float4* const tint_symbol_12) {
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  float const x_86 = x_28.injectionSwitch.x;
+  i_3 = int(x_86);
+  while (true) {
+    int const x_92 = i_3;
+    switch(x_92) {
+      case 9: {
+        int const x_122 = i_3;
+        (*(tint_symbol_9)).arr[x_122] = -5;
+        break;
+      }
+      case 8: {
+        int const x_120 = i_3;
+        (*(tint_symbol_9)).arr[x_120] = -4;
+        break;
+      }
+      case 7: {
+        int const x_118 = i_3;
+        (*(tint_symbol_9)).arr[x_118] = -3;
+        break;
+      }
+      case 6: {
+        int const x_116 = i_3;
+        (*(tint_symbol_9)).arr[x_116] = -2;
+        break;
+      }
+      case 5: {
+        int const x_114 = i_3;
+        (*(tint_symbol_9)).arr[x_114] = -1;
+        break;
+      }
+      case 4: {
+        int const x_112 = i_3;
+        (*(tint_symbol_9)).arr[x_112] = 0;
+        break;
+      }
+      case 3: {
+        int const x_110 = i_3;
+        (*(tint_symbol_9)).arr[x_110] = 1;
+        break;
+      }
+      case 2: {
+        int const x_108 = i_3;
+        (*(tint_symbol_9)).arr[x_108] = 2;
+        break;
+      }
+      case 1: {
+        int const x_106 = i_3;
+        (*(tint_symbol_9)).arr[x_106] = 3;
+        break;
+      }
+      case 0: {
+        int const x_104 = i_3;
+        (*(tint_symbol_9)).arr[x_104] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    int const x_124 = i_3;
+    i_3 = (x_124 + 1);
+    {
+      int const x_126 = i_3;
+      if ((x_126 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  while (true) {
+    int const x_132 = j_1;
+    bool const x_133 = (x_132 < 10);
+    float const x_135 = x_28.injectionSwitch.x;
+    if (!((x_135 <= 1.0f))) {
+      grey = 1.0f;
+    }
+    if (x_133) {
+    } else {
+      break;
+    }
+    int const x_140 = j_1;
+    int const x_141 = j_1;
+    int const x_143 = (*(tint_symbol_9)).arr[x_141];
+    (*(tint_symbol_10)).arr[x_140] = x_143;
+    {
+      int const x_145 = j_1;
+      j_1 = (x_145 + 1);
+    }
+  }
+  mergeSort_(tint_symbol_9, tint_symbol_10);
+  float const x_149 = (*(tint_symbol_11)).y;
+  if ((int(x_149) < 30)) {
+    int const x_156 = (*(tint_symbol_9)).arr[0];
+    grey = (0.5f + (float(x_156) / 10.0f));
+  } else {
+    float const x_161 = (*(tint_symbol_11)).y;
+    if ((int(x_161) < 60)) {
+      int const x_168 = (*(tint_symbol_9)).arr[1];
+      grey = (0.5f + (float(x_168) / 10.0f));
+    } else {
+      float const x_173 = (*(tint_symbol_11)).y;
+      if ((int(x_173) < 90)) {
+        int const x_180 = (*(tint_symbol_9)).arr[2];
+        grey = (0.5f + (float(x_180) / 10.0f));
+      } else {
+        float const x_185 = (*(tint_symbol_11)).y;
+        if ((int(x_185) < 120)) {
+          int const x_192 = (*(tint_symbol_9)).arr[3];
+          grey = (0.5f + (float(x_192) / 10.0f));
+        } else {
+          float const x_197 = (*(tint_symbol_11)).y;
+          if ((int(x_197) < 150)) {
+            discard_fragment();
+          } else {
+            float const x_204 = (*(tint_symbol_11)).y;
+            if ((int(x_204) < 180)) {
+              int const x_211 = (*(tint_symbol_9)).arr[5];
+              grey = (0.5f + (float(x_211) / 10.0f));
+            } else {
+              float const x_216 = (*(tint_symbol_11)).y;
+              if ((int(x_216) < 210)) {
+                int const x_223 = (*(tint_symbol_9)).arr[6];
+                grey = (0.5f + (float(x_223) / 10.0f));
+              } else {
+                float const x_228 = (*(tint_symbol_11)).y;
+                if ((int(x_228) < 240)) {
+                  int const x_235 = (*(tint_symbol_9)).arr[7];
+                  grey = (0.5f + (float(x_235) / 10.0f));
+                } else {
+                  float const x_240 = (*(tint_symbol_11)).y;
+                  bool guard233 = true;
+                  if ((int(x_240) < 270)) {
+                    int const x_247 = (*(tint_symbol_9)).arr[8];
+                    grey = (0.5f + (float(x_247) / 10.0f));
+                    guard233 = false;
+                  } else {
+                    if (guard233) {
+                      float const x_252 = x_28.injectionSwitch.y;
+                      if (!((0.0f < x_252))) {
+                        guard233 = false;
+                      }
+                      if (guard233) {
+                        discard_fragment();
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  float const x_255 = grey;
+  float3 const x_256 = float3(x_255, x_255, x_255);
+  *(tint_symbol_12) = float4(x_256.x, x_256.y, x_256.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_28 [[buffer(0)]]) {
+  thread float4 tint_symbol_13 = 0.0f;
+  thread tint_array_wrapper tint_symbol_14 = {};
+  thread tint_array_wrapper tint_symbol_15 = {};
+  thread float4 tint_symbol_16 = 0.0f;
+  tint_symbol_13 = gl_FragCoord_param;
+  main_1(x_28, &(tint_symbol_14), &(tint_symbol_15), &(tint_symbol_13), &(tint_symbol_16));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_16};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..e2ae2d9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/1.spvasm.expected.spvasm
@@ -0,0 +1,690 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 440
+; Schema: 0
+               OpCapability Shader
+        %177 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %data "data"
+               OpName %temp "temp"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_28 "x_28"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %merge_i1_i1_i1_ "merge_i1_i1_i1_"
+               OpName %from "from"
+               OpName %mid "mid"
+               OpName %to "to"
+               OpName %k "k"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %i_1 "i_1"
+               OpName %mergeSort_ "mergeSort_"
+               OpName %low "low"
+               OpName %high "high"
+               OpName %m "m"
+               OpName %i_2 "i_2"
+               OpName %from_1 "from_1"
+               OpName %mid_1 "mid_1"
+               OpName %to_1 "to_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %main_1 "main_1"
+               OpName %i_3 "i_3"
+               OpName %j_1 "j_1"
+               OpName %grey "grey"
+               OpName %guard233 "guard233"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_28 NonWritable
+               OpDecorate %x_28 DescriptorSet 0
+               OpDecorate %x_28 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Private__arr_int_uint_10 = OpTypePointer Private %_arr_int_uint_10
+          %7 = OpConstantNull %_arr_int_uint_10
+       %data = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+       %temp = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_28 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %17
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int %_ptr_Function_int
+         %32 = OpConstantNull %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+%_ptr_Private_int = OpTypePointer Private %int
+     %int_10 = OpConstant %int 10
+        %132 = OpTypeFunction %void
+      %int_0 = OpConstant %int 0
+      %int_9 = OpConstant %int 9
+      %int_2 = OpConstant %int 2
+%_ptr_Function_float = OpTypePointer Function %float
+        %201 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %int_n5 = OpConstant %int -5
+     %int_n4 = OpConstant %int -4
+     %int_n3 = OpConstant %int -3
+     %int_n2 = OpConstant %int -2
+     %int_n1 = OpConstant %int -1
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+    %float_1 = OpConstant %float 1
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %int_30 = OpConstant %int 30
+  %float_0_5 = OpConstant %float 0.5
+   %float_10 = OpConstant %float 10
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+       %true = OpConstantTrue %bool
+%_ptr_Function_bool = OpTypePointer Function %bool
+        %393 = OpConstantNull %bool
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+      %false = OpConstantFalse %bool
+    %float_0 = OpConstant %float 0
+    %v3float = OpTypeVector %float 3
+   %main_out = OpTypeStruct %v4float
+        %427 = OpTypeFunction %void %main_out
+%merge_i1_i1_i1_ = OpFunction %void None %23
+       %from = OpFunctionParameter %_ptr_Function_int
+        %mid = OpFunctionParameter %_ptr_Function_int
+         %to = OpFunctionParameter %_ptr_Function_int
+         %30 = OpLabel
+          %k = OpVariable %_ptr_Function_int Function %32
+          %i = OpVariable %_ptr_Function_int Function %32
+          %j = OpVariable %_ptr_Function_int Function %32
+        %i_1 = OpVariable %_ptr_Function_int Function %32
+         %37 = OpLoad %int %from
+               OpStore %k %37
+         %39 = OpLoad %int %from
+               OpStore %i %39
+         %41 = OpLoad %int %mid
+         %43 = OpIAdd %int %41 %int_1
+               OpStore %j %43
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %48 = OpLoad %int %i
+         %50 = OpLoad %int %mid
+         %51 = OpLoad %int %j
+         %53 = OpLoad %int %to
+         %54 = OpSLessThanEqual %bool %48 %50
+               OpSelectionMerge %56 None
+               OpBranchConditional %54 %57 %56
+         %57 = OpLabel
+         %58 = OpSLessThanEqual %bool %51 %53
+               OpBranch %56
+         %56 = OpLabel
+         %59 = OpPhi %bool %54 %47 %58 %57
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %62
+         %61 = OpLabel
+               OpBranch %60
+         %62 = OpLabel
+               OpBranch %45
+         %60 = OpLabel
+         %63 = OpLoad %int %i
+         %65 = OpAccessChain %_ptr_Private_int %data %63
+         %66 = OpLoad %int %65
+         %67 = OpLoad %int %j
+         %68 = OpAccessChain %_ptr_Private_int %data %67
+         %69 = OpLoad %int %68
+         %70 = OpSLessThan %bool %66 %69
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %73
+         %72 = OpLabel
+         %74 = OpLoad %int %k
+         %75 = OpIAdd %int %74 %int_1
+               OpStore %k %75
+         %76 = OpLoad %int %i
+         %77 = OpIAdd %int %76 %int_1
+               OpStore %i %77
+         %78 = OpAccessChain %_ptr_Private_int %data %76
+         %79 = OpLoad %int %78
+         %80 = OpAccessChain %_ptr_Private_int %temp %74
+               OpStore %80 %79
+               OpBranch %71
+         %73 = OpLabel
+         %81 = OpLoad %int %k
+         %82 = OpIAdd %int %81 %int_1
+               OpStore %k %82
+         %83 = OpLoad %int %j
+         %84 = OpIAdd %int %83 %int_1
+               OpStore %j %84
+         %85 = OpAccessChain %_ptr_Private_int %data %83
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_Private_int %temp %81
+               OpStore %87 %86
+               OpBranch %71
+         %71 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+               OpBranch %44
+         %45 = OpLabel
+               OpBranch %88
+         %88 = OpLabel
+               OpLoopMerge %89 %90 None
+               OpBranch %91
+         %91 = OpLabel
+         %92 = OpLoad %int %i
+         %93 = OpLoad %int %i
+         %95 = OpLoad %int %mid
+         %97 = OpSLessThan %bool %92 %int_10
+               OpSelectionMerge %98 None
+               OpBranchConditional %97 %99 %98
+         %99 = OpLabel
+        %100 = OpSLessThanEqual %bool %93 %95
+               OpBranch %98
+         %98 = OpLabel
+        %101 = OpPhi %bool %97 %91 %100 %99
+               OpSelectionMerge %102 None
+               OpBranchConditional %101 %103 %104
+        %103 = OpLabel
+               OpBranch %102
+        %104 = OpLabel
+               OpBranch %89
+        %102 = OpLabel
+        %105 = OpLoad %int %k
+        %106 = OpIAdd %int %105 %int_1
+               OpStore %k %106
+        %107 = OpLoad %int %i
+        %108 = OpIAdd %int %107 %int_1
+               OpStore %i %108
+        %109 = OpAccessChain %_ptr_Private_int %data %107
+        %110 = OpLoad %int %109
+        %111 = OpAccessChain %_ptr_Private_int %temp %105
+               OpStore %111 %110
+               OpBranch %90
+         %90 = OpLabel
+               OpBranch %88
+         %89 = OpLabel
+        %113 = OpLoad %int %from
+               OpStore %i_1 %113
+               OpBranch %114
+        %114 = OpLabel
+               OpLoopMerge %115 %116 None
+               OpBranch %117
+        %117 = OpLabel
+        %118 = OpLoad %int %i_1
+        %120 = OpLoad %int %to
+        %121 = OpSLessThanEqual %bool %118 %120
+               OpSelectionMerge %122 None
+               OpBranchConditional %121 %123 %124
+        %123 = OpLabel
+               OpBranch %122
+        %124 = OpLabel
+               OpBranch %115
+        %122 = OpLabel
+        %125 = OpLoad %int %i_1
+        %126 = OpLoad %int %i_1
+        %127 = OpAccessChain %_ptr_Private_int %temp %126
+        %128 = OpLoad %int %127
+        %129 = OpAccessChain %_ptr_Private_int %data %125
+               OpStore %129 %128
+               OpBranch %116
+        %116 = OpLabel
+        %130 = OpLoad %int %i_1
+        %131 = OpIAdd %int %130 %int_1
+               OpStore %i_1 %131
+               OpBranch %114
+        %115 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %mergeSort_ = OpFunction %void None %132
+        %134 = OpLabel
+        %low = OpVariable %_ptr_Function_int Function %32
+       %high = OpVariable %_ptr_Function_int Function %32
+          %m = OpVariable %_ptr_Function_int Function %32
+        %i_2 = OpVariable %_ptr_Function_int Function %32
+     %from_1 = OpVariable %_ptr_Function_int Function %32
+      %mid_1 = OpVariable %_ptr_Function_int Function %32
+       %to_1 = OpVariable %_ptr_Function_int Function %32
+      %param = OpVariable %_ptr_Function_int Function %32
+    %param_1 = OpVariable %_ptr_Function_int Function %32
+    %param_2 = OpVariable %_ptr_Function_int Function %32
+               OpStore %low %int_0
+               OpStore %high %int_9
+               OpStore %m %int_1
+               OpBranch %147
+        %147 = OpLabel
+               OpLoopMerge %148 %149 None
+               OpBranch %150
+        %150 = OpLabel
+        %151 = OpLoad %int %m
+        %152 = OpLoad %int %high
+        %153 = OpSLessThanEqual %bool %151 %152
+               OpSelectionMerge %154 None
+               OpBranchConditional %153 %155 %156
+        %155 = OpLabel
+               OpBranch %154
+        %156 = OpLabel
+               OpBranch %148
+        %154 = OpLabel
+        %157 = OpLoad %int %low
+               OpStore %i_2 %157
+               OpBranch %158
+        %158 = OpLabel
+               OpLoopMerge %159 %160 None
+               OpBranch %161
+        %161 = OpLabel
+        %162 = OpLoad %int %i_2
+        %163 = OpLoad %int %high
+        %164 = OpSLessThan %bool %162 %163
+               OpSelectionMerge %165 None
+               OpBranchConditional %164 %166 %167
+        %166 = OpLabel
+               OpBranch %165
+        %167 = OpLabel
+               OpBranch %159
+        %165 = OpLabel
+        %168 = OpLoad %int %i_2
+               OpStore %from_1 %168
+        %169 = OpLoad %int %i_2
+        %170 = OpLoad %int %m
+        %171 = OpIAdd %int %169 %170
+        %172 = OpISub %int %171 %int_1
+               OpStore %mid_1 %172
+        %173 = OpLoad %int %i_2
+        %174 = OpLoad %int %m
+        %175 = OpLoad %int %high
+        %179 = OpIMul %int %int_2 %174
+        %180 = OpIAdd %int %173 %179
+        %181 = OpISub %int %180 %int_1
+        %176 = OpExtInst %int %177 SMin %181 %175
+               OpStore %to_1 %176
+        %182 = OpLoad %int %from_1
+               OpStore %param %182
+        %183 = OpLoad %int %mid_1
+               OpStore %param_1 %183
+        %184 = OpLoad %int %to_1
+               OpStore %param_2 %184
+        %185 = OpFunctionCall %void %merge_i1_i1_i1_ %param %param_1 %param_2
+               OpBranch %160
+        %160 = OpLabel
+        %189 = OpLoad %int %m
+        %190 = OpLoad %int %i_2
+        %191 = OpIMul %int %int_2 %189
+        %192 = OpIAdd %int %190 %191
+               OpStore %i_2 %192
+               OpBranch %158
+        %159 = OpLabel
+               OpBranch %149
+        %149 = OpLabel
+        %193 = OpLoad %int %m
+        %194 = OpIMul %int %int_2 %193
+               OpStore %m %194
+               OpBranch %147
+        %148 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %132
+        %196 = OpLabel
+        %i_3 = OpVariable %_ptr_Function_int Function %32
+        %j_1 = OpVariable %_ptr_Function_int Function %32
+       %grey = OpVariable %_ptr_Function_float Function %201
+   %guard233 = OpVariable %_ptr_Function_bool Function %393
+        %204 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_0
+        %205 = OpLoad %float %204
+        %206 = OpConvertFToS %int %205
+               OpStore %i_3 %206
+               OpBranch %207
+        %207 = OpLabel
+               OpLoopMerge %208 %209 None
+               OpBranch %210
+        %210 = OpLabel
+        %211 = OpLoad %int %i_3
+               OpSelectionMerge %212 None
+               OpSwitch %211 %213 9 %214 8 %215 7 %216 6 %217 5 %218 4 %219 3 %220 2 %221 1 %222 0 %223
+        %214 = OpLabel
+        %224 = OpLoad %int %i_3
+        %225 = OpAccessChain %_ptr_Private_int %data %224
+               OpStore %225 %int_n5
+               OpBranch %212
+        %215 = OpLabel
+        %227 = OpLoad %int %i_3
+        %228 = OpAccessChain %_ptr_Private_int %data %227
+               OpStore %228 %int_n4
+               OpBranch %212
+        %216 = OpLabel
+        %230 = OpLoad %int %i_3
+        %231 = OpAccessChain %_ptr_Private_int %data %230
+               OpStore %231 %int_n3
+               OpBranch %212
+        %217 = OpLabel
+        %233 = OpLoad %int %i_3
+        %234 = OpAccessChain %_ptr_Private_int %data %233
+               OpStore %234 %int_n2
+               OpBranch %212
+        %218 = OpLabel
+        %236 = OpLoad %int %i_3
+        %237 = OpAccessChain %_ptr_Private_int %data %236
+               OpStore %237 %int_n1
+               OpBranch %212
+        %219 = OpLabel
+        %239 = OpLoad %int %i_3
+        %240 = OpAccessChain %_ptr_Private_int %data %239
+               OpStore %240 %int_0
+               OpBranch %212
+        %220 = OpLabel
+        %241 = OpLoad %int %i_3
+        %242 = OpAccessChain %_ptr_Private_int %data %241
+               OpStore %242 %int_1
+               OpBranch %212
+        %221 = OpLabel
+        %243 = OpLoad %int %i_3
+        %244 = OpAccessChain %_ptr_Private_int %data %243
+               OpStore %244 %int_2
+               OpBranch %212
+        %222 = OpLabel
+        %245 = OpLoad %int %i_3
+        %246 = OpAccessChain %_ptr_Private_int %data %245
+               OpStore %246 %int_3
+               OpBranch %212
+        %223 = OpLabel
+        %248 = OpLoad %int %i_3
+        %249 = OpAccessChain %_ptr_Private_int %data %248
+               OpStore %249 %int_4
+               OpBranch %212
+        %213 = OpLabel
+               OpBranch %212
+        %212 = OpLabel
+        %251 = OpLoad %int %i_3
+        %252 = OpIAdd %int %251 %int_1
+               OpStore %i_3 %252
+               OpBranch %209
+        %209 = OpLabel
+        %253 = OpLoad %int %i_3
+        %254 = OpSLessThan %bool %253 %int_10
+               OpSelectionMerge %255 None
+               OpBranchConditional %254 %256 %257
+        %256 = OpLabel
+               OpBranch %255
+        %257 = OpLabel
+               OpBranch %208
+        %255 = OpLabel
+               OpBranch %207
+        %208 = OpLabel
+               OpStore %j_1 %int_0
+               OpBranch %258
+        %258 = OpLabel
+               OpLoopMerge %259 %260 None
+               OpBranch %261
+        %261 = OpLabel
+        %262 = OpLoad %int %j_1
+        %263 = OpSLessThan %bool %262 %int_10
+        %264 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_0
+        %265 = OpLoad %float %264
+        %268 = OpFOrdLessThanEqual %bool %265 %float_1
+        %266 = OpLogicalNot %bool %268
+               OpSelectionMerge %269 None
+               OpBranchConditional %266 %270 %269
+        %270 = OpLabel
+               OpStore %grey %float_1
+               OpBranch %269
+        %269 = OpLabel
+               OpSelectionMerge %271 None
+               OpBranchConditional %263 %272 %273
+        %272 = OpLabel
+               OpBranch %271
+        %273 = OpLabel
+               OpBranch %259
+        %271 = OpLabel
+        %274 = OpLoad %int %j_1
+        %275 = OpLoad %int %j_1
+        %276 = OpAccessChain %_ptr_Private_int %data %275
+        %277 = OpLoad %int %276
+        %278 = OpAccessChain %_ptr_Private_int %temp %274
+               OpStore %278 %277
+               OpBranch %260
+        %260 = OpLabel
+        %279 = OpLoad %int %j_1
+        %280 = OpIAdd %int %279 %int_1
+               OpStore %j_1 %280
+               OpBranch %258
+        %259 = OpLabel
+        %281 = OpFunctionCall %void %mergeSort_
+        %284 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %285 = OpLoad %float %284
+        %286 = OpConvertFToS %int %285
+        %288 = OpSLessThan %bool %286 %int_30
+               OpSelectionMerge %289 None
+               OpBranchConditional %288 %290 %291
+        %290 = OpLabel
+        %292 = OpAccessChain %_ptr_Private_int %data %int_0
+        %293 = OpLoad %int %292
+        %295 = OpConvertSToF %float %293
+        %297 = OpFDiv %float %295 %float_10
+        %298 = OpFAdd %float %float_0_5 %297
+               OpStore %grey %298
+               OpBranch %289
+        %291 = OpLabel
+        %299 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %300 = OpLoad %float %299
+        %301 = OpConvertFToS %int %300
+        %303 = OpSLessThan %bool %301 %int_60
+               OpSelectionMerge %304 None
+               OpBranchConditional %303 %305 %306
+        %305 = OpLabel
+        %307 = OpAccessChain %_ptr_Private_int %data %int_1
+        %308 = OpLoad %int %307
+        %309 = OpConvertSToF %float %308
+        %310 = OpFDiv %float %309 %float_10
+        %311 = OpFAdd %float %float_0_5 %310
+               OpStore %grey %311
+               OpBranch %304
+        %306 = OpLabel
+        %312 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %313 = OpLoad %float %312
+        %314 = OpConvertFToS %int %313
+        %316 = OpSLessThan %bool %314 %int_90
+               OpSelectionMerge %317 None
+               OpBranchConditional %316 %318 %319
+        %318 = OpLabel
+        %320 = OpAccessChain %_ptr_Private_int %data %int_2
+        %321 = OpLoad %int %320
+        %322 = OpConvertSToF %float %321
+        %323 = OpFDiv %float %322 %float_10
+        %324 = OpFAdd %float %float_0_5 %323
+               OpStore %grey %324
+               OpBranch %317
+        %319 = OpLabel
+        %325 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %326 = OpLoad %float %325
+        %327 = OpConvertFToS %int %326
+        %329 = OpSLessThan %bool %327 %int_120
+               OpSelectionMerge %330 None
+               OpBranchConditional %329 %331 %332
+        %331 = OpLabel
+        %333 = OpAccessChain %_ptr_Private_int %data %int_3
+        %334 = OpLoad %int %333
+        %335 = OpConvertSToF %float %334
+        %336 = OpFDiv %float %335 %float_10
+        %337 = OpFAdd %float %float_0_5 %336
+               OpStore %grey %337
+               OpBranch %330
+        %332 = OpLabel
+        %338 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %339 = OpLoad %float %338
+        %340 = OpConvertFToS %int %339
+        %342 = OpSLessThan %bool %340 %int_150
+               OpSelectionMerge %343 None
+               OpBranchConditional %342 %344 %345
+        %344 = OpLabel
+               OpKill
+        %345 = OpLabel
+        %346 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %347 = OpLoad %float %346
+        %348 = OpConvertFToS %int %347
+        %350 = OpSLessThan %bool %348 %int_180
+               OpSelectionMerge %351 None
+               OpBranchConditional %350 %352 %353
+        %352 = OpLabel
+        %355 = OpAccessChain %_ptr_Private_int %data %int_5
+        %356 = OpLoad %int %355
+        %357 = OpConvertSToF %float %356
+        %358 = OpFDiv %float %357 %float_10
+        %359 = OpFAdd %float %float_0_5 %358
+               OpStore %grey %359
+               OpBranch %351
+        %353 = OpLabel
+        %360 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %361 = OpLoad %float %360
+        %362 = OpConvertFToS %int %361
+        %364 = OpSLessThan %bool %362 %int_210
+               OpSelectionMerge %365 None
+               OpBranchConditional %364 %366 %367
+        %366 = OpLabel
+        %369 = OpAccessChain %_ptr_Private_int %data %int_6
+        %370 = OpLoad %int %369
+        %371 = OpConvertSToF %float %370
+        %372 = OpFDiv %float %371 %float_10
+        %373 = OpFAdd %float %float_0_5 %372
+               OpStore %grey %373
+               OpBranch %365
+        %367 = OpLabel
+        %374 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %375 = OpLoad %float %374
+        %376 = OpConvertFToS %int %375
+        %378 = OpSLessThan %bool %376 %int_240
+               OpSelectionMerge %379 None
+               OpBranchConditional %378 %380 %381
+        %380 = OpLabel
+        %383 = OpAccessChain %_ptr_Private_int %data %int_7
+        %384 = OpLoad %int %383
+        %385 = OpConvertSToF %float %384
+        %386 = OpFDiv %float %385 %float_10
+        %387 = OpFAdd %float %float_0_5 %386
+               OpStore %grey %387
+               OpBranch %379
+        %381 = OpLabel
+        %388 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %389 = OpLoad %float %388
+               OpStore %guard233 %true
+        %394 = OpConvertFToS %int %389
+        %396 = OpSLessThan %bool %394 %int_270
+               OpSelectionMerge %397 None
+               OpBranchConditional %396 %398 %399
+        %398 = OpLabel
+        %401 = OpAccessChain %_ptr_Private_int %data %int_8
+        %402 = OpLoad %int %401
+        %403 = OpConvertSToF %float %402
+        %404 = OpFDiv %float %403 %float_10
+        %405 = OpFAdd %float %float_0_5 %404
+               OpStore %grey %405
+               OpStore %guard233 %false
+               OpBranch %397
+        %399 = OpLabel
+        %407 = OpLoad %bool %guard233
+               OpSelectionMerge %408 None
+               OpBranchConditional %407 %409 %408
+        %409 = OpLabel
+        %410 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_1
+        %411 = OpLoad %float %410
+        %414 = OpFOrdLessThan %bool %float_0 %411
+        %412 = OpLogicalNot %bool %414
+               OpSelectionMerge %415 None
+               OpBranchConditional %412 %416 %415
+        %416 = OpLabel
+               OpStore %guard233 %false
+               OpBranch %415
+        %415 = OpLabel
+        %417 = OpLoad %bool %guard233
+               OpSelectionMerge %418 None
+               OpBranchConditional %417 %419 %418
+        %419 = OpLabel
+               OpKill
+        %418 = OpLabel
+               OpBranch %408
+        %408 = OpLabel
+               OpBranch %397
+        %397 = OpLabel
+               OpBranch %379
+        %379 = OpLabel
+               OpBranch %365
+        %365 = OpLabel
+               OpBranch %351
+        %351 = OpLabel
+               OpBranch %343
+        %343 = OpLabel
+               OpBranch %330
+        %330 = OpLabel
+               OpBranch %317
+        %317 = OpLabel
+               OpBranch %304
+        %304 = OpLabel
+               OpBranch %289
+        %289 = OpLabel
+        %420 = OpLoad %float %grey
+        %422 = OpCompositeConstruct %v3float %420 %420 %420
+        %423 = OpCompositeExtract %float %422 0
+        %424 = OpCompositeExtract %float %422 1
+        %425 = OpCompositeExtract %float %422 2
+        %426 = OpCompositeConstruct %v4float %423 %424 %425 %float_1
+               OpStore %x_GLF_color %426
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %427
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %431 = OpLabel
+        %432 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %432
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %132
+        %434 = OpLabel
+        %435 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %435
+        %436 = OpFunctionCall %void %main_1
+        %438 = OpLoad %v4float %x_GLF_color
+        %439 = OpCompositeConstruct %main_out %438
+        %437 = OpFunctionCall %void %tint_symbol_3 %439
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 209[%209] is not post dominated by the back-edge block 255[%255]
+  %255 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..4e442a3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/1.spvasm.expected.wgsl
@@ -0,0 +1,321 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> data : array<i32, 10>;
+
+var<private> temp : array<i32, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn merge_i1_i1_i1_(from : ptr<function, i32>, mid : ptr<function, i32>, to : ptr<function, i32>) {
+  var k : i32;
+  var i : i32;
+  var j : i32;
+  var i_1 : i32;
+  let x_262 : i32 = *(from);
+  k = x_262;
+  let x_263 : i32 = *(from);
+  i = x_263;
+  let x_264 : i32 = *(mid);
+  j = (x_264 + 1);
+  loop {
+    let x_270 : i32 = i;
+    let x_271 : i32 = *(mid);
+    let x_273 : i32 = j;
+    let x_274 : i32 = *(to);
+    if (((x_270 <= x_271) && (x_273 <= x_274))) {
+    } else {
+      break;
+    }
+    let x_278 : i32 = i;
+    let x_280 : i32 = data[x_278];
+    let x_281 : i32 = j;
+    let x_283 : i32 = data[x_281];
+    if ((x_280 < x_283)) {
+      let x_288 : i32 = k;
+      k = (x_288 + 1);
+      let x_290 : i32 = i;
+      i = (x_290 + 1);
+      let x_293 : i32 = data[x_290];
+      temp[x_288] = x_293;
+    } else {
+      let x_295 : i32 = k;
+      k = (x_295 + 1);
+      let x_297 : i32 = j;
+      j = (x_297 + 1);
+      let x_300 : i32 = data[x_297];
+      temp[x_295] = x_300;
+    }
+  }
+  loop {
+    let x_306 : i32 = i;
+    let x_308 : i32 = i;
+    let x_309 : i32 = *(mid);
+    if (((x_306 < 10) && (x_308 <= x_309))) {
+    } else {
+      break;
+    }
+    let x_313 : i32 = k;
+    k = (x_313 + 1);
+    let x_315 : i32 = i;
+    i = (x_315 + 1);
+    let x_318 : i32 = data[x_315];
+    temp[x_313] = x_318;
+  }
+  let x_320 : i32 = *(from);
+  i_1 = x_320;
+  loop {
+    let x_325 : i32 = i_1;
+    let x_326 : i32 = *(to);
+    if ((x_325 <= x_326)) {
+    } else {
+      break;
+    }
+    let x_329 : i32 = i_1;
+    let x_330 : i32 = i_1;
+    let x_332 : i32 = temp[x_330];
+    data[x_329] = x_332;
+
+    continuing {
+      let x_334 : i32 = i_1;
+      i_1 = (x_334 + 1);
+    }
+  }
+  return;
+}
+
+fn mergeSort_() {
+  var low : i32;
+  var high : i32;
+  var m : i32;
+  var i_2 : i32;
+  var from_1 : i32;
+  var mid_1 : i32;
+  var to_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  low = 0;
+  high = 9;
+  m = 1;
+  loop {
+    let x_341 : i32 = m;
+    let x_342 : i32 = high;
+    if ((x_341 <= x_342)) {
+    } else {
+      break;
+    }
+    let x_345 : i32 = low;
+    i_2 = x_345;
+    loop {
+      let x_350 : i32 = i_2;
+      let x_351 : i32 = high;
+      if ((x_350 < x_351)) {
+      } else {
+        break;
+      }
+      let x_354 : i32 = i_2;
+      from_1 = x_354;
+      let x_355 : i32 = i_2;
+      let x_356 : i32 = m;
+      mid_1 = ((x_355 + x_356) - 1);
+      let x_359 : i32 = i_2;
+      let x_360 : i32 = m;
+      let x_364 : i32 = high;
+      to_1 = min(((x_359 + (2 * x_360)) - 1), x_364);
+      let x_366 : i32 = from_1;
+      param = x_366;
+      let x_367 : i32 = mid_1;
+      param_1 = x_367;
+      let x_368 : i32 = to_1;
+      param_2 = x_368;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2));
+
+      continuing {
+        let x_370 : i32 = m;
+        let x_372 : i32 = i_2;
+        i_2 = (x_372 + (2 * x_370));
+      }
+    }
+
+    continuing {
+      let x_374 : i32 = m;
+      m = (2 * x_374);
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_3 : i32;
+  var j_1 : i32;
+  var grey : f32;
+  let x_86 : f32 = x_28.injectionSwitch.x;
+  i_3 = i32(x_86);
+  loop {
+    let x_92 : i32 = i_3;
+    switch(x_92) {
+      case 9: {
+        let x_122 : i32 = i_3;
+        data[x_122] = -5;
+      }
+      case 8: {
+        let x_120 : i32 = i_3;
+        data[x_120] = -4;
+      }
+      case 7: {
+        let x_118 : i32 = i_3;
+        data[x_118] = -3;
+      }
+      case 6: {
+        let x_116 : i32 = i_3;
+        data[x_116] = -2;
+      }
+      case 5: {
+        let x_114 : i32 = i_3;
+        data[x_114] = -1;
+      }
+      case 4: {
+        let x_112 : i32 = i_3;
+        data[x_112] = 0;
+      }
+      case 3: {
+        let x_110 : i32 = i_3;
+        data[x_110] = 1;
+      }
+      case 2: {
+        let x_108 : i32 = i_3;
+        data[x_108] = 2;
+      }
+      case 1: {
+        let x_106 : i32 = i_3;
+        data[x_106] = 3;
+      }
+      case 0: {
+        let x_104 : i32 = i_3;
+        data[x_104] = 4;
+      }
+      default: {
+      }
+    }
+    let x_124 : i32 = i_3;
+    i_3 = (x_124 + 1);
+
+    continuing {
+      let x_126 : i32 = i_3;
+      if ((x_126 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  loop {
+    let x_132 : i32 = j_1;
+    let x_133 : bool = (x_132 < 10);
+    let x_135 : f32 = x_28.injectionSwitch.x;
+    if (!((x_135 <= 1.0))) {
+      grey = 1.0;
+    }
+    if (x_133) {
+    } else {
+      break;
+    }
+    let x_140 : i32 = j_1;
+    let x_141 : i32 = j_1;
+    let x_143 : i32 = data[x_141];
+    temp[x_140] = x_143;
+
+    continuing {
+      let x_145 : i32 = j_1;
+      j_1 = (x_145 + 1);
+    }
+  }
+  mergeSort_();
+  let x_149 : f32 = gl_FragCoord.y;
+  if ((i32(x_149) < 30)) {
+    let x_156 : i32 = data[0];
+    grey = (0.5 + (f32(x_156) / 10.0));
+  } else {
+    let x_161 : f32 = gl_FragCoord.y;
+    if ((i32(x_161) < 60)) {
+      let x_168 : i32 = data[1];
+      grey = (0.5 + (f32(x_168) / 10.0));
+    } else {
+      let x_173 : f32 = gl_FragCoord.y;
+      if ((i32(x_173) < 90)) {
+        let x_180 : i32 = data[2];
+        grey = (0.5 + (f32(x_180) / 10.0));
+      } else {
+        let x_185 : f32 = gl_FragCoord.y;
+        if ((i32(x_185) < 120)) {
+          let x_192 : i32 = data[3];
+          grey = (0.5 + (f32(x_192) / 10.0));
+        } else {
+          let x_197 : f32 = gl_FragCoord.y;
+          if ((i32(x_197) < 150)) {
+            discard;
+          } else {
+            let x_204 : f32 = gl_FragCoord.y;
+            if ((i32(x_204) < 180)) {
+              let x_211 : i32 = data[5];
+              grey = (0.5 + (f32(x_211) / 10.0));
+            } else {
+              let x_216 : f32 = gl_FragCoord.y;
+              if ((i32(x_216) < 210)) {
+                let x_223 : i32 = data[6];
+                grey = (0.5 + (f32(x_223) / 10.0));
+              } else {
+                let x_228 : f32 = gl_FragCoord.y;
+                if ((i32(x_228) < 240)) {
+                  let x_235 : i32 = data[7];
+                  grey = (0.5 + (f32(x_235) / 10.0));
+                } else {
+                  let x_240 : f32 = gl_FragCoord.y;
+                  var guard233 : bool = true;
+                  if ((i32(x_240) < 270)) {
+                    let x_247 : i32 = data[8];
+                    grey = (0.5 + (f32(x_247) / 10.0));
+                    guard233 = false;
+                  } else {
+                    if (guard233) {
+                      let x_252 : f32 = x_28.injectionSwitch.y;
+                      if (!((0.0 < x_252))) {
+                        guard233 = false;
+                      }
+                      if (guard233) {
+                        discard;
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  let x_255 : f32 = grey;
+  let x_256 : vec3<f32> = vec3<f32>(x_255, x_255, x_255);
+  x_GLF_color = vec4<f32>(x_256.x, x_256.y, x_256.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/1.wgsl
new file mode 100644
index 0000000..4e442a3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/1.wgsl
@@ -0,0 +1,321 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> data : array<i32, 10>;
+
+var<private> temp : array<i32, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn merge_i1_i1_i1_(from : ptr<function, i32>, mid : ptr<function, i32>, to : ptr<function, i32>) {
+  var k : i32;
+  var i : i32;
+  var j : i32;
+  var i_1 : i32;
+  let x_262 : i32 = *(from);
+  k = x_262;
+  let x_263 : i32 = *(from);
+  i = x_263;
+  let x_264 : i32 = *(mid);
+  j = (x_264 + 1);
+  loop {
+    let x_270 : i32 = i;
+    let x_271 : i32 = *(mid);
+    let x_273 : i32 = j;
+    let x_274 : i32 = *(to);
+    if (((x_270 <= x_271) && (x_273 <= x_274))) {
+    } else {
+      break;
+    }
+    let x_278 : i32 = i;
+    let x_280 : i32 = data[x_278];
+    let x_281 : i32 = j;
+    let x_283 : i32 = data[x_281];
+    if ((x_280 < x_283)) {
+      let x_288 : i32 = k;
+      k = (x_288 + 1);
+      let x_290 : i32 = i;
+      i = (x_290 + 1);
+      let x_293 : i32 = data[x_290];
+      temp[x_288] = x_293;
+    } else {
+      let x_295 : i32 = k;
+      k = (x_295 + 1);
+      let x_297 : i32 = j;
+      j = (x_297 + 1);
+      let x_300 : i32 = data[x_297];
+      temp[x_295] = x_300;
+    }
+  }
+  loop {
+    let x_306 : i32 = i;
+    let x_308 : i32 = i;
+    let x_309 : i32 = *(mid);
+    if (((x_306 < 10) && (x_308 <= x_309))) {
+    } else {
+      break;
+    }
+    let x_313 : i32 = k;
+    k = (x_313 + 1);
+    let x_315 : i32 = i;
+    i = (x_315 + 1);
+    let x_318 : i32 = data[x_315];
+    temp[x_313] = x_318;
+  }
+  let x_320 : i32 = *(from);
+  i_1 = x_320;
+  loop {
+    let x_325 : i32 = i_1;
+    let x_326 : i32 = *(to);
+    if ((x_325 <= x_326)) {
+    } else {
+      break;
+    }
+    let x_329 : i32 = i_1;
+    let x_330 : i32 = i_1;
+    let x_332 : i32 = temp[x_330];
+    data[x_329] = x_332;
+
+    continuing {
+      let x_334 : i32 = i_1;
+      i_1 = (x_334 + 1);
+    }
+  }
+  return;
+}
+
+fn mergeSort_() {
+  var low : i32;
+  var high : i32;
+  var m : i32;
+  var i_2 : i32;
+  var from_1 : i32;
+  var mid_1 : i32;
+  var to_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  low = 0;
+  high = 9;
+  m = 1;
+  loop {
+    let x_341 : i32 = m;
+    let x_342 : i32 = high;
+    if ((x_341 <= x_342)) {
+    } else {
+      break;
+    }
+    let x_345 : i32 = low;
+    i_2 = x_345;
+    loop {
+      let x_350 : i32 = i_2;
+      let x_351 : i32 = high;
+      if ((x_350 < x_351)) {
+      } else {
+        break;
+      }
+      let x_354 : i32 = i_2;
+      from_1 = x_354;
+      let x_355 : i32 = i_2;
+      let x_356 : i32 = m;
+      mid_1 = ((x_355 + x_356) - 1);
+      let x_359 : i32 = i_2;
+      let x_360 : i32 = m;
+      let x_364 : i32 = high;
+      to_1 = min(((x_359 + (2 * x_360)) - 1), x_364);
+      let x_366 : i32 = from_1;
+      param = x_366;
+      let x_367 : i32 = mid_1;
+      param_1 = x_367;
+      let x_368 : i32 = to_1;
+      param_2 = x_368;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2));
+
+      continuing {
+        let x_370 : i32 = m;
+        let x_372 : i32 = i_2;
+        i_2 = (x_372 + (2 * x_370));
+      }
+    }
+
+    continuing {
+      let x_374 : i32 = m;
+      m = (2 * x_374);
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_3 : i32;
+  var j_1 : i32;
+  var grey : f32;
+  let x_86 : f32 = x_28.injectionSwitch.x;
+  i_3 = i32(x_86);
+  loop {
+    let x_92 : i32 = i_3;
+    switch(x_92) {
+      case 9: {
+        let x_122 : i32 = i_3;
+        data[x_122] = -5;
+      }
+      case 8: {
+        let x_120 : i32 = i_3;
+        data[x_120] = -4;
+      }
+      case 7: {
+        let x_118 : i32 = i_3;
+        data[x_118] = -3;
+      }
+      case 6: {
+        let x_116 : i32 = i_3;
+        data[x_116] = -2;
+      }
+      case 5: {
+        let x_114 : i32 = i_3;
+        data[x_114] = -1;
+      }
+      case 4: {
+        let x_112 : i32 = i_3;
+        data[x_112] = 0;
+      }
+      case 3: {
+        let x_110 : i32 = i_3;
+        data[x_110] = 1;
+      }
+      case 2: {
+        let x_108 : i32 = i_3;
+        data[x_108] = 2;
+      }
+      case 1: {
+        let x_106 : i32 = i_3;
+        data[x_106] = 3;
+      }
+      case 0: {
+        let x_104 : i32 = i_3;
+        data[x_104] = 4;
+      }
+      default: {
+      }
+    }
+    let x_124 : i32 = i_3;
+    i_3 = (x_124 + 1);
+
+    continuing {
+      let x_126 : i32 = i_3;
+      if ((x_126 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  loop {
+    let x_132 : i32 = j_1;
+    let x_133 : bool = (x_132 < 10);
+    let x_135 : f32 = x_28.injectionSwitch.x;
+    if (!((x_135 <= 1.0))) {
+      grey = 1.0;
+    }
+    if (x_133) {
+    } else {
+      break;
+    }
+    let x_140 : i32 = j_1;
+    let x_141 : i32 = j_1;
+    let x_143 : i32 = data[x_141];
+    temp[x_140] = x_143;
+
+    continuing {
+      let x_145 : i32 = j_1;
+      j_1 = (x_145 + 1);
+    }
+  }
+  mergeSort_();
+  let x_149 : f32 = gl_FragCoord.y;
+  if ((i32(x_149) < 30)) {
+    let x_156 : i32 = data[0];
+    grey = (0.5 + (f32(x_156) / 10.0));
+  } else {
+    let x_161 : f32 = gl_FragCoord.y;
+    if ((i32(x_161) < 60)) {
+      let x_168 : i32 = data[1];
+      grey = (0.5 + (f32(x_168) / 10.0));
+    } else {
+      let x_173 : f32 = gl_FragCoord.y;
+      if ((i32(x_173) < 90)) {
+        let x_180 : i32 = data[2];
+        grey = (0.5 + (f32(x_180) / 10.0));
+      } else {
+        let x_185 : f32 = gl_FragCoord.y;
+        if ((i32(x_185) < 120)) {
+          let x_192 : i32 = data[3];
+          grey = (0.5 + (f32(x_192) / 10.0));
+        } else {
+          let x_197 : f32 = gl_FragCoord.y;
+          if ((i32(x_197) < 150)) {
+            discard;
+          } else {
+            let x_204 : f32 = gl_FragCoord.y;
+            if ((i32(x_204) < 180)) {
+              let x_211 : i32 = data[5];
+              grey = (0.5 + (f32(x_211) / 10.0));
+            } else {
+              let x_216 : f32 = gl_FragCoord.y;
+              if ((i32(x_216) < 210)) {
+                let x_223 : i32 = data[6];
+                grey = (0.5 + (f32(x_223) / 10.0));
+              } else {
+                let x_228 : f32 = gl_FragCoord.y;
+                if ((i32(x_228) < 240)) {
+                  let x_235 : i32 = data[7];
+                  grey = (0.5 + (f32(x_235) / 10.0));
+                } else {
+                  let x_240 : f32 = gl_FragCoord.y;
+                  var guard233 : bool = true;
+                  if ((i32(x_240) < 270)) {
+                    let x_247 : i32 = data[8];
+                    grey = (0.5 + (f32(x_247) / 10.0));
+                    guard233 = false;
+                  } else {
+                    if (guard233) {
+                      let x_252 : f32 = x_28.injectionSwitch.y;
+                      if (!((0.0 < x_252))) {
+                        guard233 = false;
+                      }
+                      if (guard233) {
+                        discard;
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  let x_255 : f32 = grey;
+  let x_256 : vec3<f32> = vec3<f32>(x_255, x_255, x_255);
+  x_GLF_color = vec4<f32>(x_256.x, x_256.y, x_256.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..b21b248
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/1.wgsl.expected.hlsl
@@ -0,0 +1,288 @@
+static int data[10] = (int[10])0;
+static int temp[10] = (int[10])0;
+cbuffer cbuffer_x_28 : register(b0, space0) {
+  uint4 x_28[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void merge_i1_i1_i1_(inout int from, inout int mid, inout int to) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  const int x_262 = from;
+  k = x_262;
+  const int x_263 = from;
+  i = x_263;
+  const int x_264 = mid;
+  j = (x_264 + 1);
+  while (true) {
+    const int x_270 = i;
+    const int x_271 = mid;
+    const int x_273 = j;
+    const int x_274 = to;
+    bool tint_tmp = (x_270 <= x_271);
+    if (tint_tmp) {
+      tint_tmp = (x_273 <= x_274);
+    }
+    if ((tint_tmp)) {
+    } else {
+      break;
+    }
+    const int x_280 = data[i];
+    const int x_283 = data[j];
+    if ((x_280 < x_283)) {
+      const int x_288 = k;
+      k = (x_288 + 1);
+      const int x_290 = i;
+      i = (x_290 + 1);
+      const int x_293 = data[x_290];
+      temp[x_288] = x_293;
+    } else {
+      const int x_295 = k;
+      k = (x_295 + 1);
+      const int x_297 = j;
+      j = (x_297 + 1);
+      const int x_300 = data[x_297];
+      temp[x_295] = x_300;
+    }
+  }
+  while (true) {
+    const int x_306 = i;
+    const int x_308 = i;
+    const int x_309 = mid;
+    bool tint_tmp_1 = (x_306 < 10);
+    if (tint_tmp_1) {
+      tint_tmp_1 = (x_308 <= x_309);
+    }
+    if ((tint_tmp_1)) {
+    } else {
+      break;
+    }
+    const int x_313 = k;
+    k = (x_313 + 1);
+    const int x_315 = i;
+    i = (x_315 + 1);
+    const int x_318 = data[x_315];
+    temp[x_313] = x_318;
+  }
+  const int x_320 = from;
+  i_1 = x_320;
+  while (true) {
+    const int x_325 = i_1;
+    const int x_326 = to;
+    if ((x_325 <= x_326)) {
+    } else {
+      break;
+    }
+    const int x_329 = i_1;
+    const int x_332 = temp[i_1];
+    data[x_329] = x_332;
+    {
+      i_1 = (i_1 + 1);
+    }
+  }
+  return;
+}
+
+void mergeSort_() {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  {
+    for(; (m <= high); m = (2 * m)) {
+      i_2 = low;
+      {
+        for(; (i_2 < high); i_2 = (i_2 + (2 * m))) {
+          from_1 = i_2;
+          mid_1 = ((i_2 + m) - 1);
+          to_1 = min(((i_2 + (2 * m)) - 1), high);
+          param = from_1;
+          param_1 = mid_1;
+          param_2 = to_1;
+          merge_i1_i1_i1_(param, param_1, param_2);
+        }
+      }
+    }
+  }
+  return;
+}
+
+void main_1() {
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  const float x_86 = asfloat(x_28[0].x);
+  i_3 = int(x_86);
+  while (true) {
+    switch(i_3) {
+      case 9: {
+        data[i_3] = -5;
+        break;
+      }
+      case 8: {
+        data[i_3] = -4;
+        break;
+      }
+      case 7: {
+        data[i_3] = -3;
+        break;
+      }
+      case 6: {
+        data[i_3] = -2;
+        break;
+      }
+      case 5: {
+        data[i_3] = -1;
+        break;
+      }
+      case 4: {
+        data[i_3] = 0;
+        break;
+      }
+      case 3: {
+        data[i_3] = 1;
+        break;
+      }
+      case 2: {
+        data[i_3] = 2;
+        break;
+      }
+      case 1: {
+        data[i_3] = 3;
+        break;
+      }
+      case 0: {
+        data[i_3] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    i_3 = (i_3 + 1);
+    {
+      if ((i_3 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  while (true) {
+    const bool x_133 = (j_1 < 10);
+    const float x_135 = asfloat(x_28[0].x);
+    if (!((x_135 <= 1.0f))) {
+      grey = 1.0f;
+    }
+    if (x_133) {
+    } else {
+      break;
+    }
+    const int x_140 = j_1;
+    const int x_143 = data[j_1];
+    temp[x_140] = x_143;
+    {
+      j_1 = (j_1 + 1);
+    }
+  }
+  mergeSort_();
+  const float x_149 = gl_FragCoord.y;
+  if ((int(x_149) < 30)) {
+    const int x_156 = data[0];
+    grey = (0.5f + (float(x_156) / 10.0f));
+  } else {
+    const float x_161 = gl_FragCoord.y;
+    if ((int(x_161) < 60)) {
+      const int x_168 = data[1];
+      grey = (0.5f + (float(x_168) / 10.0f));
+    } else {
+      const float x_173 = gl_FragCoord.y;
+      if ((int(x_173) < 90)) {
+        const int x_180 = data[2];
+        grey = (0.5f + (float(x_180) / 10.0f));
+      } else {
+        const float x_185 = gl_FragCoord.y;
+        if ((int(x_185) < 120)) {
+          const int x_192 = data[3];
+          grey = (0.5f + (float(x_192) / 10.0f));
+        } else {
+          const float x_197 = gl_FragCoord.y;
+          if ((int(x_197) < 150)) {
+            discard;
+          } else {
+            const float x_204 = gl_FragCoord.y;
+            if ((int(x_204) < 180)) {
+              const int x_211 = data[5];
+              grey = (0.5f + (float(x_211) / 10.0f));
+            } else {
+              const float x_216 = gl_FragCoord.y;
+              if ((int(x_216) < 210)) {
+                const int x_223 = data[6];
+                grey = (0.5f + (float(x_223) / 10.0f));
+              } else {
+                const float x_228 = gl_FragCoord.y;
+                if ((int(x_228) < 240)) {
+                  const int x_235 = data[7];
+                  grey = (0.5f + (float(x_235) / 10.0f));
+                } else {
+                  const float x_240 = gl_FragCoord.y;
+                  bool guard233 = true;
+                  if ((int(x_240) < 270)) {
+                    const int x_247 = data[8];
+                    grey = (0.5f + (float(x_247) / 10.0f));
+                    guard233 = false;
+                  } else {
+                    if (guard233) {
+                      const float x_252 = asfloat(x_28[0].y);
+                      if (!((0.0f < x_252))) {
+                        guard233 = false;
+                      }
+                      if (guard233) {
+                        discard;
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  const float x_255 = grey;
+  const float3 x_256 = float3(x_255, x_255, x_255);
+  x_GLF_color = float4(x_256.x, x_256.y, x_256.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/1.wgsl.expected.msl
new file mode 100644
index 0000000..941121e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/1.wgsl.expected.msl
@@ -0,0 +1,329 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void merge_i1_i1_i1_(thread int* const from, thread int* const mid, thread int* const to, thread tint_array_wrapper* const tint_symbol_5, thread tint_array_wrapper* const tint_symbol_6) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  int const x_262 = *(from);
+  k = x_262;
+  int const x_263 = *(from);
+  i = x_263;
+  int const x_264 = *(mid);
+  j = (x_264 + 1);
+  while (true) {
+    int const x_270 = i;
+    int const x_271 = *(mid);
+    int const x_273 = j;
+    int const x_274 = *(to);
+    if (((x_270 <= x_271) && (x_273 <= x_274))) {
+    } else {
+      break;
+    }
+    int const x_278 = i;
+    int const x_280 = (*(tint_symbol_5)).arr[x_278];
+    int const x_281 = j;
+    int const x_283 = (*(tint_symbol_5)).arr[x_281];
+    if ((x_280 < x_283)) {
+      int const x_288 = k;
+      k = (x_288 + 1);
+      int const x_290 = i;
+      i = (x_290 + 1);
+      int const x_293 = (*(tint_symbol_5)).arr[x_290];
+      (*(tint_symbol_6)).arr[x_288] = x_293;
+    } else {
+      int const x_295 = k;
+      k = (x_295 + 1);
+      int const x_297 = j;
+      j = (x_297 + 1);
+      int const x_300 = (*(tint_symbol_5)).arr[x_297];
+      (*(tint_symbol_6)).arr[x_295] = x_300;
+    }
+  }
+  while (true) {
+    int const x_306 = i;
+    int const x_308 = i;
+    int const x_309 = *(mid);
+    if (((x_306 < 10) && (x_308 <= x_309))) {
+    } else {
+      break;
+    }
+    int const x_313 = k;
+    k = (x_313 + 1);
+    int const x_315 = i;
+    i = (x_315 + 1);
+    int const x_318 = (*(tint_symbol_5)).arr[x_315];
+    (*(tint_symbol_6)).arr[x_313] = x_318;
+  }
+  int const x_320 = *(from);
+  i_1 = x_320;
+  while (true) {
+    int const x_325 = i_1;
+    int const x_326 = *(to);
+    if ((x_325 <= x_326)) {
+    } else {
+      break;
+    }
+    int const x_329 = i_1;
+    int const x_330 = i_1;
+    int const x_332 = (*(tint_symbol_6)).arr[x_330];
+    (*(tint_symbol_5)).arr[x_329] = x_332;
+    {
+      int const x_334 = i_1;
+      i_1 = (x_334 + 1);
+    }
+  }
+  return;
+}
+
+void mergeSort_(thread tint_array_wrapper* const tint_symbol_7, thread tint_array_wrapper* const tint_symbol_8) {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  while (true) {
+    int const x_341 = m;
+    int const x_342 = high;
+    if ((x_341 <= x_342)) {
+    } else {
+      break;
+    }
+    int const x_345 = low;
+    i_2 = x_345;
+    while (true) {
+      int const x_350 = i_2;
+      int const x_351 = high;
+      if ((x_350 < x_351)) {
+      } else {
+        break;
+      }
+      int const x_354 = i_2;
+      from_1 = x_354;
+      int const x_355 = i_2;
+      int const x_356 = m;
+      mid_1 = ((x_355 + x_356) - 1);
+      int const x_359 = i_2;
+      int const x_360 = m;
+      int const x_364 = high;
+      to_1 = min(((x_359 + (2 * x_360)) - 1), x_364);
+      int const x_366 = from_1;
+      param = x_366;
+      int const x_367 = mid_1;
+      param_1 = x_367;
+      int const x_368 = to_1;
+      param_2 = x_368;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2), tint_symbol_7, tint_symbol_8);
+      {
+        int const x_370 = m;
+        int const x_372 = i_2;
+        i_2 = (x_372 + (2 * x_370));
+      }
+    }
+    {
+      int const x_374 = m;
+      m = (2 * x_374);
+    }
+  }
+  return;
+}
+
+void main_1(constant buf0& x_28, thread tint_array_wrapper* const tint_symbol_9, thread tint_array_wrapper* const tint_symbol_10, thread float4* const tint_symbol_11, thread float4* const tint_symbol_12) {
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  float const x_86 = x_28.injectionSwitch.x;
+  i_3 = int(x_86);
+  while (true) {
+    int const x_92 = i_3;
+    switch(x_92) {
+      case 9: {
+        int const x_122 = i_3;
+        (*(tint_symbol_9)).arr[x_122] = -5;
+        break;
+      }
+      case 8: {
+        int const x_120 = i_3;
+        (*(tint_symbol_9)).arr[x_120] = -4;
+        break;
+      }
+      case 7: {
+        int const x_118 = i_3;
+        (*(tint_symbol_9)).arr[x_118] = -3;
+        break;
+      }
+      case 6: {
+        int const x_116 = i_3;
+        (*(tint_symbol_9)).arr[x_116] = -2;
+        break;
+      }
+      case 5: {
+        int const x_114 = i_3;
+        (*(tint_symbol_9)).arr[x_114] = -1;
+        break;
+      }
+      case 4: {
+        int const x_112 = i_3;
+        (*(tint_symbol_9)).arr[x_112] = 0;
+        break;
+      }
+      case 3: {
+        int const x_110 = i_3;
+        (*(tint_symbol_9)).arr[x_110] = 1;
+        break;
+      }
+      case 2: {
+        int const x_108 = i_3;
+        (*(tint_symbol_9)).arr[x_108] = 2;
+        break;
+      }
+      case 1: {
+        int const x_106 = i_3;
+        (*(tint_symbol_9)).arr[x_106] = 3;
+        break;
+      }
+      case 0: {
+        int const x_104 = i_3;
+        (*(tint_symbol_9)).arr[x_104] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    int const x_124 = i_3;
+    i_3 = (x_124 + 1);
+    {
+      int const x_126 = i_3;
+      if ((x_126 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  while (true) {
+    int const x_132 = j_1;
+    bool const x_133 = (x_132 < 10);
+    float const x_135 = x_28.injectionSwitch.x;
+    if (!((x_135 <= 1.0f))) {
+      grey = 1.0f;
+    }
+    if (x_133) {
+    } else {
+      break;
+    }
+    int const x_140 = j_1;
+    int const x_141 = j_1;
+    int const x_143 = (*(tint_symbol_9)).arr[x_141];
+    (*(tint_symbol_10)).arr[x_140] = x_143;
+    {
+      int const x_145 = j_1;
+      j_1 = (x_145 + 1);
+    }
+  }
+  mergeSort_(tint_symbol_9, tint_symbol_10);
+  float const x_149 = (*(tint_symbol_11)).y;
+  if ((int(x_149) < 30)) {
+    int const x_156 = (*(tint_symbol_9)).arr[0];
+    grey = (0.5f + (float(x_156) / 10.0f));
+  } else {
+    float const x_161 = (*(tint_symbol_11)).y;
+    if ((int(x_161) < 60)) {
+      int const x_168 = (*(tint_symbol_9)).arr[1];
+      grey = (0.5f + (float(x_168) / 10.0f));
+    } else {
+      float const x_173 = (*(tint_symbol_11)).y;
+      if ((int(x_173) < 90)) {
+        int const x_180 = (*(tint_symbol_9)).arr[2];
+        grey = (0.5f + (float(x_180) / 10.0f));
+      } else {
+        float const x_185 = (*(tint_symbol_11)).y;
+        if ((int(x_185) < 120)) {
+          int const x_192 = (*(tint_symbol_9)).arr[3];
+          grey = (0.5f + (float(x_192) / 10.0f));
+        } else {
+          float const x_197 = (*(tint_symbol_11)).y;
+          if ((int(x_197) < 150)) {
+            discard_fragment();
+          } else {
+            float const x_204 = (*(tint_symbol_11)).y;
+            if ((int(x_204) < 180)) {
+              int const x_211 = (*(tint_symbol_9)).arr[5];
+              grey = (0.5f + (float(x_211) / 10.0f));
+            } else {
+              float const x_216 = (*(tint_symbol_11)).y;
+              if ((int(x_216) < 210)) {
+                int const x_223 = (*(tint_symbol_9)).arr[6];
+                grey = (0.5f + (float(x_223) / 10.0f));
+              } else {
+                float const x_228 = (*(tint_symbol_11)).y;
+                if ((int(x_228) < 240)) {
+                  int const x_235 = (*(tint_symbol_9)).arr[7];
+                  grey = (0.5f + (float(x_235) / 10.0f));
+                } else {
+                  float const x_240 = (*(tint_symbol_11)).y;
+                  bool guard233 = true;
+                  if ((int(x_240) < 270)) {
+                    int const x_247 = (*(tint_symbol_9)).arr[8];
+                    grey = (0.5f + (float(x_247) / 10.0f));
+                    guard233 = false;
+                  } else {
+                    if (guard233) {
+                      float const x_252 = x_28.injectionSwitch.y;
+                      if (!((0.0f < x_252))) {
+                        guard233 = false;
+                      }
+                      if (guard233) {
+                        discard_fragment();
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  float const x_255 = grey;
+  float3 const x_256 = float3(x_255, x_255, x_255);
+  *(tint_symbol_12) = float4(x_256.x, x_256.y, x_256.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_28 [[buffer(0)]]) {
+  thread float4 tint_symbol_13 = 0.0f;
+  thread tint_array_wrapper tint_symbol_14 = {};
+  thread tint_array_wrapper tint_symbol_15 = {};
+  thread float4 tint_symbol_16 = 0.0f;
+  tint_symbol_13 = gl_FragCoord_param;
+  main_1(x_28, &(tint_symbol_14), &(tint_symbol_15), &(tint_symbol_13), &(tint_symbol_16));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_16};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..e2ae2d9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/1.wgsl.expected.spvasm
@@ -0,0 +1,690 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 440
+; Schema: 0
+               OpCapability Shader
+        %177 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %data "data"
+               OpName %temp "temp"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_28 "x_28"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %merge_i1_i1_i1_ "merge_i1_i1_i1_"
+               OpName %from "from"
+               OpName %mid "mid"
+               OpName %to "to"
+               OpName %k "k"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %i_1 "i_1"
+               OpName %mergeSort_ "mergeSort_"
+               OpName %low "low"
+               OpName %high "high"
+               OpName %m "m"
+               OpName %i_2 "i_2"
+               OpName %from_1 "from_1"
+               OpName %mid_1 "mid_1"
+               OpName %to_1 "to_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %main_1 "main_1"
+               OpName %i_3 "i_3"
+               OpName %j_1 "j_1"
+               OpName %grey "grey"
+               OpName %guard233 "guard233"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_28 NonWritable
+               OpDecorate %x_28 DescriptorSet 0
+               OpDecorate %x_28 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Private__arr_int_uint_10 = OpTypePointer Private %_arr_int_uint_10
+          %7 = OpConstantNull %_arr_int_uint_10
+       %data = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+       %temp = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_28 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %17
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int %_ptr_Function_int
+         %32 = OpConstantNull %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+%_ptr_Private_int = OpTypePointer Private %int
+     %int_10 = OpConstant %int 10
+        %132 = OpTypeFunction %void
+      %int_0 = OpConstant %int 0
+      %int_9 = OpConstant %int 9
+      %int_2 = OpConstant %int 2
+%_ptr_Function_float = OpTypePointer Function %float
+        %201 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %int_n5 = OpConstant %int -5
+     %int_n4 = OpConstant %int -4
+     %int_n3 = OpConstant %int -3
+     %int_n2 = OpConstant %int -2
+     %int_n1 = OpConstant %int -1
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+    %float_1 = OpConstant %float 1
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %int_30 = OpConstant %int 30
+  %float_0_5 = OpConstant %float 0.5
+   %float_10 = OpConstant %float 10
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+       %true = OpConstantTrue %bool
+%_ptr_Function_bool = OpTypePointer Function %bool
+        %393 = OpConstantNull %bool
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+      %false = OpConstantFalse %bool
+    %float_0 = OpConstant %float 0
+    %v3float = OpTypeVector %float 3
+   %main_out = OpTypeStruct %v4float
+        %427 = OpTypeFunction %void %main_out
+%merge_i1_i1_i1_ = OpFunction %void None %23
+       %from = OpFunctionParameter %_ptr_Function_int
+        %mid = OpFunctionParameter %_ptr_Function_int
+         %to = OpFunctionParameter %_ptr_Function_int
+         %30 = OpLabel
+          %k = OpVariable %_ptr_Function_int Function %32
+          %i = OpVariable %_ptr_Function_int Function %32
+          %j = OpVariable %_ptr_Function_int Function %32
+        %i_1 = OpVariable %_ptr_Function_int Function %32
+         %37 = OpLoad %int %from
+               OpStore %k %37
+         %39 = OpLoad %int %from
+               OpStore %i %39
+         %41 = OpLoad %int %mid
+         %43 = OpIAdd %int %41 %int_1
+               OpStore %j %43
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %48 = OpLoad %int %i
+         %50 = OpLoad %int %mid
+         %51 = OpLoad %int %j
+         %53 = OpLoad %int %to
+         %54 = OpSLessThanEqual %bool %48 %50
+               OpSelectionMerge %56 None
+               OpBranchConditional %54 %57 %56
+         %57 = OpLabel
+         %58 = OpSLessThanEqual %bool %51 %53
+               OpBranch %56
+         %56 = OpLabel
+         %59 = OpPhi %bool %54 %47 %58 %57
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %62
+         %61 = OpLabel
+               OpBranch %60
+         %62 = OpLabel
+               OpBranch %45
+         %60 = OpLabel
+         %63 = OpLoad %int %i
+         %65 = OpAccessChain %_ptr_Private_int %data %63
+         %66 = OpLoad %int %65
+         %67 = OpLoad %int %j
+         %68 = OpAccessChain %_ptr_Private_int %data %67
+         %69 = OpLoad %int %68
+         %70 = OpSLessThan %bool %66 %69
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %73
+         %72 = OpLabel
+         %74 = OpLoad %int %k
+         %75 = OpIAdd %int %74 %int_1
+               OpStore %k %75
+         %76 = OpLoad %int %i
+         %77 = OpIAdd %int %76 %int_1
+               OpStore %i %77
+         %78 = OpAccessChain %_ptr_Private_int %data %76
+         %79 = OpLoad %int %78
+         %80 = OpAccessChain %_ptr_Private_int %temp %74
+               OpStore %80 %79
+               OpBranch %71
+         %73 = OpLabel
+         %81 = OpLoad %int %k
+         %82 = OpIAdd %int %81 %int_1
+               OpStore %k %82
+         %83 = OpLoad %int %j
+         %84 = OpIAdd %int %83 %int_1
+               OpStore %j %84
+         %85 = OpAccessChain %_ptr_Private_int %data %83
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_Private_int %temp %81
+               OpStore %87 %86
+               OpBranch %71
+         %71 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+               OpBranch %44
+         %45 = OpLabel
+               OpBranch %88
+         %88 = OpLabel
+               OpLoopMerge %89 %90 None
+               OpBranch %91
+         %91 = OpLabel
+         %92 = OpLoad %int %i
+         %93 = OpLoad %int %i
+         %95 = OpLoad %int %mid
+         %97 = OpSLessThan %bool %92 %int_10
+               OpSelectionMerge %98 None
+               OpBranchConditional %97 %99 %98
+         %99 = OpLabel
+        %100 = OpSLessThanEqual %bool %93 %95
+               OpBranch %98
+         %98 = OpLabel
+        %101 = OpPhi %bool %97 %91 %100 %99
+               OpSelectionMerge %102 None
+               OpBranchConditional %101 %103 %104
+        %103 = OpLabel
+               OpBranch %102
+        %104 = OpLabel
+               OpBranch %89
+        %102 = OpLabel
+        %105 = OpLoad %int %k
+        %106 = OpIAdd %int %105 %int_1
+               OpStore %k %106
+        %107 = OpLoad %int %i
+        %108 = OpIAdd %int %107 %int_1
+               OpStore %i %108
+        %109 = OpAccessChain %_ptr_Private_int %data %107
+        %110 = OpLoad %int %109
+        %111 = OpAccessChain %_ptr_Private_int %temp %105
+               OpStore %111 %110
+               OpBranch %90
+         %90 = OpLabel
+               OpBranch %88
+         %89 = OpLabel
+        %113 = OpLoad %int %from
+               OpStore %i_1 %113
+               OpBranch %114
+        %114 = OpLabel
+               OpLoopMerge %115 %116 None
+               OpBranch %117
+        %117 = OpLabel
+        %118 = OpLoad %int %i_1
+        %120 = OpLoad %int %to
+        %121 = OpSLessThanEqual %bool %118 %120
+               OpSelectionMerge %122 None
+               OpBranchConditional %121 %123 %124
+        %123 = OpLabel
+               OpBranch %122
+        %124 = OpLabel
+               OpBranch %115
+        %122 = OpLabel
+        %125 = OpLoad %int %i_1
+        %126 = OpLoad %int %i_1
+        %127 = OpAccessChain %_ptr_Private_int %temp %126
+        %128 = OpLoad %int %127
+        %129 = OpAccessChain %_ptr_Private_int %data %125
+               OpStore %129 %128
+               OpBranch %116
+        %116 = OpLabel
+        %130 = OpLoad %int %i_1
+        %131 = OpIAdd %int %130 %int_1
+               OpStore %i_1 %131
+               OpBranch %114
+        %115 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %mergeSort_ = OpFunction %void None %132
+        %134 = OpLabel
+        %low = OpVariable %_ptr_Function_int Function %32
+       %high = OpVariable %_ptr_Function_int Function %32
+          %m = OpVariable %_ptr_Function_int Function %32
+        %i_2 = OpVariable %_ptr_Function_int Function %32
+     %from_1 = OpVariable %_ptr_Function_int Function %32
+      %mid_1 = OpVariable %_ptr_Function_int Function %32
+       %to_1 = OpVariable %_ptr_Function_int Function %32
+      %param = OpVariable %_ptr_Function_int Function %32
+    %param_1 = OpVariable %_ptr_Function_int Function %32
+    %param_2 = OpVariable %_ptr_Function_int Function %32
+               OpStore %low %int_0
+               OpStore %high %int_9
+               OpStore %m %int_1
+               OpBranch %147
+        %147 = OpLabel
+               OpLoopMerge %148 %149 None
+               OpBranch %150
+        %150 = OpLabel
+        %151 = OpLoad %int %m
+        %152 = OpLoad %int %high
+        %153 = OpSLessThanEqual %bool %151 %152
+               OpSelectionMerge %154 None
+               OpBranchConditional %153 %155 %156
+        %155 = OpLabel
+               OpBranch %154
+        %156 = OpLabel
+               OpBranch %148
+        %154 = OpLabel
+        %157 = OpLoad %int %low
+               OpStore %i_2 %157
+               OpBranch %158
+        %158 = OpLabel
+               OpLoopMerge %159 %160 None
+               OpBranch %161
+        %161 = OpLabel
+        %162 = OpLoad %int %i_2
+        %163 = OpLoad %int %high
+        %164 = OpSLessThan %bool %162 %163
+               OpSelectionMerge %165 None
+               OpBranchConditional %164 %166 %167
+        %166 = OpLabel
+               OpBranch %165
+        %167 = OpLabel
+               OpBranch %159
+        %165 = OpLabel
+        %168 = OpLoad %int %i_2
+               OpStore %from_1 %168
+        %169 = OpLoad %int %i_2
+        %170 = OpLoad %int %m
+        %171 = OpIAdd %int %169 %170
+        %172 = OpISub %int %171 %int_1
+               OpStore %mid_1 %172
+        %173 = OpLoad %int %i_2
+        %174 = OpLoad %int %m
+        %175 = OpLoad %int %high
+        %179 = OpIMul %int %int_2 %174
+        %180 = OpIAdd %int %173 %179
+        %181 = OpISub %int %180 %int_1
+        %176 = OpExtInst %int %177 SMin %181 %175
+               OpStore %to_1 %176
+        %182 = OpLoad %int %from_1
+               OpStore %param %182
+        %183 = OpLoad %int %mid_1
+               OpStore %param_1 %183
+        %184 = OpLoad %int %to_1
+               OpStore %param_2 %184
+        %185 = OpFunctionCall %void %merge_i1_i1_i1_ %param %param_1 %param_2
+               OpBranch %160
+        %160 = OpLabel
+        %189 = OpLoad %int %m
+        %190 = OpLoad %int %i_2
+        %191 = OpIMul %int %int_2 %189
+        %192 = OpIAdd %int %190 %191
+               OpStore %i_2 %192
+               OpBranch %158
+        %159 = OpLabel
+               OpBranch %149
+        %149 = OpLabel
+        %193 = OpLoad %int %m
+        %194 = OpIMul %int %int_2 %193
+               OpStore %m %194
+               OpBranch %147
+        %148 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %132
+        %196 = OpLabel
+        %i_3 = OpVariable %_ptr_Function_int Function %32
+        %j_1 = OpVariable %_ptr_Function_int Function %32
+       %grey = OpVariable %_ptr_Function_float Function %201
+   %guard233 = OpVariable %_ptr_Function_bool Function %393
+        %204 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_0
+        %205 = OpLoad %float %204
+        %206 = OpConvertFToS %int %205
+               OpStore %i_3 %206
+               OpBranch %207
+        %207 = OpLabel
+               OpLoopMerge %208 %209 None
+               OpBranch %210
+        %210 = OpLabel
+        %211 = OpLoad %int %i_3
+               OpSelectionMerge %212 None
+               OpSwitch %211 %213 9 %214 8 %215 7 %216 6 %217 5 %218 4 %219 3 %220 2 %221 1 %222 0 %223
+        %214 = OpLabel
+        %224 = OpLoad %int %i_3
+        %225 = OpAccessChain %_ptr_Private_int %data %224
+               OpStore %225 %int_n5
+               OpBranch %212
+        %215 = OpLabel
+        %227 = OpLoad %int %i_3
+        %228 = OpAccessChain %_ptr_Private_int %data %227
+               OpStore %228 %int_n4
+               OpBranch %212
+        %216 = OpLabel
+        %230 = OpLoad %int %i_3
+        %231 = OpAccessChain %_ptr_Private_int %data %230
+               OpStore %231 %int_n3
+               OpBranch %212
+        %217 = OpLabel
+        %233 = OpLoad %int %i_3
+        %234 = OpAccessChain %_ptr_Private_int %data %233
+               OpStore %234 %int_n2
+               OpBranch %212
+        %218 = OpLabel
+        %236 = OpLoad %int %i_3
+        %237 = OpAccessChain %_ptr_Private_int %data %236
+               OpStore %237 %int_n1
+               OpBranch %212
+        %219 = OpLabel
+        %239 = OpLoad %int %i_3
+        %240 = OpAccessChain %_ptr_Private_int %data %239
+               OpStore %240 %int_0
+               OpBranch %212
+        %220 = OpLabel
+        %241 = OpLoad %int %i_3
+        %242 = OpAccessChain %_ptr_Private_int %data %241
+               OpStore %242 %int_1
+               OpBranch %212
+        %221 = OpLabel
+        %243 = OpLoad %int %i_3
+        %244 = OpAccessChain %_ptr_Private_int %data %243
+               OpStore %244 %int_2
+               OpBranch %212
+        %222 = OpLabel
+        %245 = OpLoad %int %i_3
+        %246 = OpAccessChain %_ptr_Private_int %data %245
+               OpStore %246 %int_3
+               OpBranch %212
+        %223 = OpLabel
+        %248 = OpLoad %int %i_3
+        %249 = OpAccessChain %_ptr_Private_int %data %248
+               OpStore %249 %int_4
+               OpBranch %212
+        %213 = OpLabel
+               OpBranch %212
+        %212 = OpLabel
+        %251 = OpLoad %int %i_3
+        %252 = OpIAdd %int %251 %int_1
+               OpStore %i_3 %252
+               OpBranch %209
+        %209 = OpLabel
+        %253 = OpLoad %int %i_3
+        %254 = OpSLessThan %bool %253 %int_10
+               OpSelectionMerge %255 None
+               OpBranchConditional %254 %256 %257
+        %256 = OpLabel
+               OpBranch %255
+        %257 = OpLabel
+               OpBranch %208
+        %255 = OpLabel
+               OpBranch %207
+        %208 = OpLabel
+               OpStore %j_1 %int_0
+               OpBranch %258
+        %258 = OpLabel
+               OpLoopMerge %259 %260 None
+               OpBranch %261
+        %261 = OpLabel
+        %262 = OpLoad %int %j_1
+        %263 = OpSLessThan %bool %262 %int_10
+        %264 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_0
+        %265 = OpLoad %float %264
+        %268 = OpFOrdLessThanEqual %bool %265 %float_1
+        %266 = OpLogicalNot %bool %268
+               OpSelectionMerge %269 None
+               OpBranchConditional %266 %270 %269
+        %270 = OpLabel
+               OpStore %grey %float_1
+               OpBranch %269
+        %269 = OpLabel
+               OpSelectionMerge %271 None
+               OpBranchConditional %263 %272 %273
+        %272 = OpLabel
+               OpBranch %271
+        %273 = OpLabel
+               OpBranch %259
+        %271 = OpLabel
+        %274 = OpLoad %int %j_1
+        %275 = OpLoad %int %j_1
+        %276 = OpAccessChain %_ptr_Private_int %data %275
+        %277 = OpLoad %int %276
+        %278 = OpAccessChain %_ptr_Private_int %temp %274
+               OpStore %278 %277
+               OpBranch %260
+        %260 = OpLabel
+        %279 = OpLoad %int %j_1
+        %280 = OpIAdd %int %279 %int_1
+               OpStore %j_1 %280
+               OpBranch %258
+        %259 = OpLabel
+        %281 = OpFunctionCall %void %mergeSort_
+        %284 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %285 = OpLoad %float %284
+        %286 = OpConvertFToS %int %285
+        %288 = OpSLessThan %bool %286 %int_30
+               OpSelectionMerge %289 None
+               OpBranchConditional %288 %290 %291
+        %290 = OpLabel
+        %292 = OpAccessChain %_ptr_Private_int %data %int_0
+        %293 = OpLoad %int %292
+        %295 = OpConvertSToF %float %293
+        %297 = OpFDiv %float %295 %float_10
+        %298 = OpFAdd %float %float_0_5 %297
+               OpStore %grey %298
+               OpBranch %289
+        %291 = OpLabel
+        %299 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %300 = OpLoad %float %299
+        %301 = OpConvertFToS %int %300
+        %303 = OpSLessThan %bool %301 %int_60
+               OpSelectionMerge %304 None
+               OpBranchConditional %303 %305 %306
+        %305 = OpLabel
+        %307 = OpAccessChain %_ptr_Private_int %data %int_1
+        %308 = OpLoad %int %307
+        %309 = OpConvertSToF %float %308
+        %310 = OpFDiv %float %309 %float_10
+        %311 = OpFAdd %float %float_0_5 %310
+               OpStore %grey %311
+               OpBranch %304
+        %306 = OpLabel
+        %312 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %313 = OpLoad %float %312
+        %314 = OpConvertFToS %int %313
+        %316 = OpSLessThan %bool %314 %int_90
+               OpSelectionMerge %317 None
+               OpBranchConditional %316 %318 %319
+        %318 = OpLabel
+        %320 = OpAccessChain %_ptr_Private_int %data %int_2
+        %321 = OpLoad %int %320
+        %322 = OpConvertSToF %float %321
+        %323 = OpFDiv %float %322 %float_10
+        %324 = OpFAdd %float %float_0_5 %323
+               OpStore %grey %324
+               OpBranch %317
+        %319 = OpLabel
+        %325 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %326 = OpLoad %float %325
+        %327 = OpConvertFToS %int %326
+        %329 = OpSLessThan %bool %327 %int_120
+               OpSelectionMerge %330 None
+               OpBranchConditional %329 %331 %332
+        %331 = OpLabel
+        %333 = OpAccessChain %_ptr_Private_int %data %int_3
+        %334 = OpLoad %int %333
+        %335 = OpConvertSToF %float %334
+        %336 = OpFDiv %float %335 %float_10
+        %337 = OpFAdd %float %float_0_5 %336
+               OpStore %grey %337
+               OpBranch %330
+        %332 = OpLabel
+        %338 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %339 = OpLoad %float %338
+        %340 = OpConvertFToS %int %339
+        %342 = OpSLessThan %bool %340 %int_150
+               OpSelectionMerge %343 None
+               OpBranchConditional %342 %344 %345
+        %344 = OpLabel
+               OpKill
+        %345 = OpLabel
+        %346 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %347 = OpLoad %float %346
+        %348 = OpConvertFToS %int %347
+        %350 = OpSLessThan %bool %348 %int_180
+               OpSelectionMerge %351 None
+               OpBranchConditional %350 %352 %353
+        %352 = OpLabel
+        %355 = OpAccessChain %_ptr_Private_int %data %int_5
+        %356 = OpLoad %int %355
+        %357 = OpConvertSToF %float %356
+        %358 = OpFDiv %float %357 %float_10
+        %359 = OpFAdd %float %float_0_5 %358
+               OpStore %grey %359
+               OpBranch %351
+        %353 = OpLabel
+        %360 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %361 = OpLoad %float %360
+        %362 = OpConvertFToS %int %361
+        %364 = OpSLessThan %bool %362 %int_210
+               OpSelectionMerge %365 None
+               OpBranchConditional %364 %366 %367
+        %366 = OpLabel
+        %369 = OpAccessChain %_ptr_Private_int %data %int_6
+        %370 = OpLoad %int %369
+        %371 = OpConvertSToF %float %370
+        %372 = OpFDiv %float %371 %float_10
+        %373 = OpFAdd %float %float_0_5 %372
+               OpStore %grey %373
+               OpBranch %365
+        %367 = OpLabel
+        %374 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %375 = OpLoad %float %374
+        %376 = OpConvertFToS %int %375
+        %378 = OpSLessThan %bool %376 %int_240
+               OpSelectionMerge %379 None
+               OpBranchConditional %378 %380 %381
+        %380 = OpLabel
+        %383 = OpAccessChain %_ptr_Private_int %data %int_7
+        %384 = OpLoad %int %383
+        %385 = OpConvertSToF %float %384
+        %386 = OpFDiv %float %385 %float_10
+        %387 = OpFAdd %float %float_0_5 %386
+               OpStore %grey %387
+               OpBranch %379
+        %381 = OpLabel
+        %388 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %389 = OpLoad %float %388
+               OpStore %guard233 %true
+        %394 = OpConvertFToS %int %389
+        %396 = OpSLessThan %bool %394 %int_270
+               OpSelectionMerge %397 None
+               OpBranchConditional %396 %398 %399
+        %398 = OpLabel
+        %401 = OpAccessChain %_ptr_Private_int %data %int_8
+        %402 = OpLoad %int %401
+        %403 = OpConvertSToF %float %402
+        %404 = OpFDiv %float %403 %float_10
+        %405 = OpFAdd %float %float_0_5 %404
+               OpStore %grey %405
+               OpStore %guard233 %false
+               OpBranch %397
+        %399 = OpLabel
+        %407 = OpLoad %bool %guard233
+               OpSelectionMerge %408 None
+               OpBranchConditional %407 %409 %408
+        %409 = OpLabel
+        %410 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_1
+        %411 = OpLoad %float %410
+        %414 = OpFOrdLessThan %bool %float_0 %411
+        %412 = OpLogicalNot %bool %414
+               OpSelectionMerge %415 None
+               OpBranchConditional %412 %416 %415
+        %416 = OpLabel
+               OpStore %guard233 %false
+               OpBranch %415
+        %415 = OpLabel
+        %417 = OpLoad %bool %guard233
+               OpSelectionMerge %418 None
+               OpBranchConditional %417 %419 %418
+        %419 = OpLabel
+               OpKill
+        %418 = OpLabel
+               OpBranch %408
+        %408 = OpLabel
+               OpBranch %397
+        %397 = OpLabel
+               OpBranch %379
+        %379 = OpLabel
+               OpBranch %365
+        %365 = OpLabel
+               OpBranch %351
+        %351 = OpLabel
+               OpBranch %343
+        %343 = OpLabel
+               OpBranch %330
+        %330 = OpLabel
+               OpBranch %317
+        %317 = OpLabel
+               OpBranch %304
+        %304 = OpLabel
+               OpBranch %289
+        %289 = OpLabel
+        %420 = OpLoad %float %grey
+        %422 = OpCompositeConstruct %v3float %420 %420 %420
+        %423 = OpCompositeExtract %float %422 0
+        %424 = OpCompositeExtract %float %422 1
+        %425 = OpCompositeExtract %float %422 2
+        %426 = OpCompositeConstruct %v4float %423 %424 %425 %float_1
+               OpStore %x_GLF_color %426
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %427
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %431 = OpLabel
+        %432 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %432
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %132
+        %434 = OpLabel
+        %435 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %435
+        %436 = OpFunctionCall %void %main_1
+        %438 = OpLoad %v4float %x_GLF_color
+        %439 = OpCompositeConstruct %main_out %438
+        %437 = OpFunctionCall %void %tint_symbol_3 %439
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 209[%209] is not post dominated by the back-edge block 255[%255]
+  %255 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..4e442a3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/1.wgsl.expected.wgsl
@@ -0,0 +1,321 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> data : array<i32, 10>;
+
+var<private> temp : array<i32, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn merge_i1_i1_i1_(from : ptr<function, i32>, mid : ptr<function, i32>, to : ptr<function, i32>) {
+  var k : i32;
+  var i : i32;
+  var j : i32;
+  var i_1 : i32;
+  let x_262 : i32 = *(from);
+  k = x_262;
+  let x_263 : i32 = *(from);
+  i = x_263;
+  let x_264 : i32 = *(mid);
+  j = (x_264 + 1);
+  loop {
+    let x_270 : i32 = i;
+    let x_271 : i32 = *(mid);
+    let x_273 : i32 = j;
+    let x_274 : i32 = *(to);
+    if (((x_270 <= x_271) && (x_273 <= x_274))) {
+    } else {
+      break;
+    }
+    let x_278 : i32 = i;
+    let x_280 : i32 = data[x_278];
+    let x_281 : i32 = j;
+    let x_283 : i32 = data[x_281];
+    if ((x_280 < x_283)) {
+      let x_288 : i32 = k;
+      k = (x_288 + 1);
+      let x_290 : i32 = i;
+      i = (x_290 + 1);
+      let x_293 : i32 = data[x_290];
+      temp[x_288] = x_293;
+    } else {
+      let x_295 : i32 = k;
+      k = (x_295 + 1);
+      let x_297 : i32 = j;
+      j = (x_297 + 1);
+      let x_300 : i32 = data[x_297];
+      temp[x_295] = x_300;
+    }
+  }
+  loop {
+    let x_306 : i32 = i;
+    let x_308 : i32 = i;
+    let x_309 : i32 = *(mid);
+    if (((x_306 < 10) && (x_308 <= x_309))) {
+    } else {
+      break;
+    }
+    let x_313 : i32 = k;
+    k = (x_313 + 1);
+    let x_315 : i32 = i;
+    i = (x_315 + 1);
+    let x_318 : i32 = data[x_315];
+    temp[x_313] = x_318;
+  }
+  let x_320 : i32 = *(from);
+  i_1 = x_320;
+  loop {
+    let x_325 : i32 = i_1;
+    let x_326 : i32 = *(to);
+    if ((x_325 <= x_326)) {
+    } else {
+      break;
+    }
+    let x_329 : i32 = i_1;
+    let x_330 : i32 = i_1;
+    let x_332 : i32 = temp[x_330];
+    data[x_329] = x_332;
+
+    continuing {
+      let x_334 : i32 = i_1;
+      i_1 = (x_334 + 1);
+    }
+  }
+  return;
+}
+
+fn mergeSort_() {
+  var low : i32;
+  var high : i32;
+  var m : i32;
+  var i_2 : i32;
+  var from_1 : i32;
+  var mid_1 : i32;
+  var to_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  low = 0;
+  high = 9;
+  m = 1;
+  loop {
+    let x_341 : i32 = m;
+    let x_342 : i32 = high;
+    if ((x_341 <= x_342)) {
+    } else {
+      break;
+    }
+    let x_345 : i32 = low;
+    i_2 = x_345;
+    loop {
+      let x_350 : i32 = i_2;
+      let x_351 : i32 = high;
+      if ((x_350 < x_351)) {
+      } else {
+        break;
+      }
+      let x_354 : i32 = i_2;
+      from_1 = x_354;
+      let x_355 : i32 = i_2;
+      let x_356 : i32 = m;
+      mid_1 = ((x_355 + x_356) - 1);
+      let x_359 : i32 = i_2;
+      let x_360 : i32 = m;
+      let x_364 : i32 = high;
+      to_1 = min(((x_359 + (2 * x_360)) - 1), x_364);
+      let x_366 : i32 = from_1;
+      param = x_366;
+      let x_367 : i32 = mid_1;
+      param_1 = x_367;
+      let x_368 : i32 = to_1;
+      param_2 = x_368;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2));
+
+      continuing {
+        let x_370 : i32 = m;
+        let x_372 : i32 = i_2;
+        i_2 = (x_372 + (2 * x_370));
+      }
+    }
+
+    continuing {
+      let x_374 : i32 = m;
+      m = (2 * x_374);
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_3 : i32;
+  var j_1 : i32;
+  var grey : f32;
+  let x_86 : f32 = x_28.injectionSwitch.x;
+  i_3 = i32(x_86);
+  loop {
+    let x_92 : i32 = i_3;
+    switch(x_92) {
+      case 9: {
+        let x_122 : i32 = i_3;
+        data[x_122] = -5;
+      }
+      case 8: {
+        let x_120 : i32 = i_3;
+        data[x_120] = -4;
+      }
+      case 7: {
+        let x_118 : i32 = i_3;
+        data[x_118] = -3;
+      }
+      case 6: {
+        let x_116 : i32 = i_3;
+        data[x_116] = -2;
+      }
+      case 5: {
+        let x_114 : i32 = i_3;
+        data[x_114] = -1;
+      }
+      case 4: {
+        let x_112 : i32 = i_3;
+        data[x_112] = 0;
+      }
+      case 3: {
+        let x_110 : i32 = i_3;
+        data[x_110] = 1;
+      }
+      case 2: {
+        let x_108 : i32 = i_3;
+        data[x_108] = 2;
+      }
+      case 1: {
+        let x_106 : i32 = i_3;
+        data[x_106] = 3;
+      }
+      case 0: {
+        let x_104 : i32 = i_3;
+        data[x_104] = 4;
+      }
+      default: {
+      }
+    }
+    let x_124 : i32 = i_3;
+    i_3 = (x_124 + 1);
+
+    continuing {
+      let x_126 : i32 = i_3;
+      if ((x_126 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  loop {
+    let x_132 : i32 = j_1;
+    let x_133 : bool = (x_132 < 10);
+    let x_135 : f32 = x_28.injectionSwitch.x;
+    if (!((x_135 <= 1.0))) {
+      grey = 1.0;
+    }
+    if (x_133) {
+    } else {
+      break;
+    }
+    let x_140 : i32 = j_1;
+    let x_141 : i32 = j_1;
+    let x_143 : i32 = data[x_141];
+    temp[x_140] = x_143;
+
+    continuing {
+      let x_145 : i32 = j_1;
+      j_1 = (x_145 + 1);
+    }
+  }
+  mergeSort_();
+  let x_149 : f32 = gl_FragCoord.y;
+  if ((i32(x_149) < 30)) {
+    let x_156 : i32 = data[0];
+    grey = (0.5 + (f32(x_156) / 10.0));
+  } else {
+    let x_161 : f32 = gl_FragCoord.y;
+    if ((i32(x_161) < 60)) {
+      let x_168 : i32 = data[1];
+      grey = (0.5 + (f32(x_168) / 10.0));
+    } else {
+      let x_173 : f32 = gl_FragCoord.y;
+      if ((i32(x_173) < 90)) {
+        let x_180 : i32 = data[2];
+        grey = (0.5 + (f32(x_180) / 10.0));
+      } else {
+        let x_185 : f32 = gl_FragCoord.y;
+        if ((i32(x_185) < 120)) {
+          let x_192 : i32 = data[3];
+          grey = (0.5 + (f32(x_192) / 10.0));
+        } else {
+          let x_197 : f32 = gl_FragCoord.y;
+          if ((i32(x_197) < 150)) {
+            discard;
+          } else {
+            let x_204 : f32 = gl_FragCoord.y;
+            if ((i32(x_204) < 180)) {
+              let x_211 : i32 = data[5];
+              grey = (0.5 + (f32(x_211) / 10.0));
+            } else {
+              let x_216 : f32 = gl_FragCoord.y;
+              if ((i32(x_216) < 210)) {
+                let x_223 : i32 = data[6];
+                grey = (0.5 + (f32(x_223) / 10.0));
+              } else {
+                let x_228 : f32 = gl_FragCoord.y;
+                if ((i32(x_228) < 240)) {
+                  let x_235 : i32 = data[7];
+                  grey = (0.5 + (f32(x_235) / 10.0));
+                } else {
+                  let x_240 : f32 = gl_FragCoord.y;
+                  var guard233 : bool = true;
+                  if ((i32(x_240) < 270)) {
+                    let x_247 : i32 = data[8];
+                    grey = (0.5 + (f32(x_247) / 10.0));
+                    guard233 = false;
+                  } else {
+                    if (guard233) {
+                      let x_252 : f32 = x_28.injectionSwitch.y;
+                      if (!((0.0 < x_252))) {
+                        guard233 = false;
+                      }
+                      if (guard233) {
+                        discard;
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  let x_255 : f32 = grey;
+  let x_256 : vec3<f32> = vec3<f32>(x_255, x_255, x_255);
+  x_GLF_color = vec4<f32>(x_256.x, x_256.y, x_256.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/1.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/1.spvasm
new file mode 100644
index 0000000..2f1327c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/1.spvasm
@@ -0,0 +1,688 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %merge_i1_i1_i1_ "merge(i1;i1;i1;"
+               OpName %from "from"
+               OpName %mid "mid"
+               OpName %to "to"
+               OpName %mergeSort_ "mergeSort("
+               OpName %k "k"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %data "data"
+               OpName %temp "temp"
+               OpName %i_0 "i"
+               OpName %low "low"
+               OpName %high "high"
+               OpName %m "m"
+               OpName %i_1 "i"
+               OpName %from_0 "from"
+               OpName %mid_0 "mid"
+               OpName %to_0 "to"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %param_1 "param"
+               OpName %i_2 "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %j_0 "j"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %grey "grey"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %32 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %35 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int %_ptr_Function_int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Private__arr_int_uint_10 = OpTypePointer Private %_arr_int_uint_10
+       %data = OpVariable %_ptr_Private__arr_int_uint_10 Private
+%_ptr_Private_int = OpTypePointer Private %int
+       %temp = OpVariable %_ptr_Private__arr_int_uint_10 Private
+     %int_10 = OpConstant %int 10
+      %int_0 = OpConstant %int 0
+      %int_9 = OpConstant %int 9
+      %int_2 = OpConstant %int 2
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_4 = OpConstant %int 4
+      %int_3 = OpConstant %int 3
+     %int_n1 = OpConstant %int -1
+     %int_n2 = OpConstant %int -2
+     %int_n3 = OpConstant %int -3
+     %int_n4 = OpConstant %int -4
+     %int_n5 = OpConstant %int -5
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+     %int_30 = OpConstant %int 30
+%_ptr_Function_float = OpTypePointer Function %float
+  %float_0_5 = OpConstant %float 0.5
+   %float_10 = OpConstant %float 10
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %v3float = OpTypeVector %float 3
+    %float_1 = OpConstant %float 1
+    %int_0_0 = OpConstant %int 0
+       %true = OpConstantTrue %bool
+      %false = OpConstantFalse %bool
+    %float_0 = OpConstant %float 0
+       %main = OpFunction %void None %32
+         %86 = OpLabel
+        %i_2 = OpVariable %_ptr_Function_int Function
+        %j_0 = OpVariable %_ptr_Function_int Function
+       %grey = OpVariable %_ptr_Function_float Function
+         %87 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %88 = OpLoad %float %87
+         %89 = OpConvertFToS %int %88
+               OpStore %i_2 %89
+               OpBranch %90
+         %90 = OpLabel
+               OpLoopMerge %91 %92 None
+               OpBranch %93
+         %93 = OpLabel
+         %94 = OpLoad %int %i_2
+               OpSelectionMerge %95 None
+               OpSwitch %94 %95 0 %96 1 %97 2 %98 3 %99 4 %100 5 %101 6 %102 7 %103 8 %104 9 %105
+         %96 = OpLabel
+        %106 = OpLoad %int %i_2
+        %107 = OpAccessChain %_ptr_Private_int %data %106
+               OpStore %107 %int_4
+               OpBranch %95
+         %97 = OpLabel
+        %108 = OpLoad %int %i_2
+        %109 = OpAccessChain %_ptr_Private_int %data %108
+               OpStore %109 %int_3
+               OpBranch %95
+         %98 = OpLabel
+        %110 = OpLoad %int %i_2
+        %111 = OpAccessChain %_ptr_Private_int %data %110
+               OpStore %111 %int_2
+               OpBranch %95
+         %99 = OpLabel
+        %112 = OpLoad %int %i_2
+        %113 = OpAccessChain %_ptr_Private_int %data %112
+               OpStore %113 %int_1
+               OpBranch %95
+        %100 = OpLabel
+        %114 = OpLoad %int %i_2
+        %115 = OpAccessChain %_ptr_Private_int %data %114
+               OpStore %115 %int_0
+               OpBranch %95
+        %101 = OpLabel
+        %116 = OpLoad %int %i_2
+        %117 = OpAccessChain %_ptr_Private_int %data %116
+               OpStore %117 %int_n1
+               OpBranch %95
+        %102 = OpLabel
+        %118 = OpLoad %int %i_2
+        %119 = OpAccessChain %_ptr_Private_int %data %118
+               OpStore %119 %int_n2
+               OpBranch %95
+        %103 = OpLabel
+        %120 = OpLoad %int %i_2
+        %121 = OpAccessChain %_ptr_Private_int %data %120
+               OpStore %121 %int_n3
+               OpBranch %95
+        %104 = OpLabel
+        %122 = OpLoad %int %i_2
+        %123 = OpAccessChain %_ptr_Private_int %data %122
+               OpStore %123 %int_n4
+               OpBranch %95
+        %105 = OpLabel
+        %124 = OpLoad %int %i_2
+        %125 = OpAccessChain %_ptr_Private_int %data %124
+               OpStore %125 %int_n5
+               OpBranch %95
+         %95 = OpLabel
+        %126 = OpLoad %int %i_2
+        %127 = OpIAdd %int %126 %int_1
+               OpStore %i_2 %127
+               OpBranch %92
+         %92 = OpLabel
+        %128 = OpLoad %int %i_2
+        %129 = OpSLessThan %bool %128 %int_10
+               OpBranchConditional %129 %90 %91
+         %91 = OpLabel
+               OpStore %j_0 %int_0
+               OpBranch %130
+        %130 = OpLabel
+               OpLoopMerge %131 %132 None
+               OpBranch %133
+        %133 = OpLabel
+        %134 = OpLoad %int %j_0
+        %135 = OpSLessThan %bool %134 %int_10
+               OpBranchConditional %135 %136 %131
+        %136 = OpLabel
+        %137 = OpLoad %int %j_0
+        %138 = OpLoad %int %j_0
+        %139 = OpAccessChain %_ptr_Private_int %data %138
+        %140 = OpLoad %int %139
+        %141 = OpAccessChain %_ptr_Private_int %temp %137
+               OpStore %141 %140
+               OpBranch %132
+        %132 = OpLabel
+        %142 = OpLoad %int %j_0
+        %143 = OpIAdd %int %142 %int_1
+               OpStore %j_0 %143
+               OpBranch %130
+        %131 = OpLabel
+        %144 = OpFunctionCall %void %mergeSort_
+        %145 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %146 = OpLoad %float %145
+        %147 = OpConvertFToS %int %146
+        %148 = OpSLessThan %bool %147 %int_30
+               OpSelectionMerge %149 None
+               OpBranchConditional %148 %150 %151
+        %150 = OpLabel
+        %152 = OpAccessChain %_ptr_Private_int %data %int_0
+        %153 = OpLoad %int %152
+        %154 = OpConvertSToF %float %153
+        %155 = OpFDiv %float %154 %float_10
+        %156 = OpFAdd %float %float_0_5 %155
+               OpStore %grey %156
+               OpBranch %149
+        %151 = OpLabel
+        %157 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %158 = OpLoad %float %157
+        %159 = OpConvertFToS %int %158
+        %160 = OpSLessThan %bool %159 %int_60
+               OpSelectionMerge %161 None
+               OpBranchConditional %160 %162 %163
+        %162 = OpLabel
+        %164 = OpAccessChain %_ptr_Private_int %data %int_1
+        %165 = OpLoad %int %164
+        %166 = OpConvertSToF %float %165
+        %167 = OpFDiv %float %166 %float_10
+        %168 = OpFAdd %float %float_0_5 %167
+               OpStore %grey %168
+               OpBranch %161
+        %163 = OpLabel
+        %169 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %170 = OpLoad %float %169
+        %171 = OpConvertFToS %int %170
+        %172 = OpSLessThan %bool %171 %int_90
+               OpSelectionMerge %173 None
+               OpBranchConditional %172 %174 %175
+        %174 = OpLabel
+        %176 = OpAccessChain %_ptr_Private_int %data %int_2
+        %177 = OpLoad %int %176
+        %178 = OpConvertSToF %float %177
+        %179 = OpFDiv %float %178 %float_10
+        %180 = OpFAdd %float %float_0_5 %179
+               OpStore %grey %180
+               OpBranch %173
+        %175 = OpLabel
+        %181 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %182 = OpLoad %float %181
+        %183 = OpConvertFToS %int %182
+        %184 = OpSLessThan %bool %183 %int_120
+               OpSelectionMerge %185 None
+               OpBranchConditional %184 %186 %187
+        %186 = OpLabel
+        %188 = OpAccessChain %_ptr_Private_int %data %int_3
+        %189 = OpLoad %int %188
+        %190 = OpConvertSToF %float %189
+        %191 = OpFDiv %float %190 %float_10
+        %192 = OpFAdd %float %float_0_5 %191
+               OpStore %grey %192
+               OpBranch %185
+        %187 = OpLabel
+        %193 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %194 = OpLoad %float %193
+        %195 = OpConvertFToS %int %194
+        %196 = OpSLessThan %bool %195 %int_150
+               OpSelectionMerge %197 None
+               OpBranchConditional %196 %198 %199
+        %198 = OpLabel
+               OpKill
+        %199 = OpLabel
+        %200 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %201 = OpLoad %float %200
+        %202 = OpConvertFToS %int %201
+        %203 = OpSLessThan %bool %202 %int_180
+               OpSelectionMerge %204 None
+               OpBranchConditional %203 %205 %206
+        %205 = OpLabel
+        %207 = OpAccessChain %_ptr_Private_int %data %int_5
+        %208 = OpLoad %int %207
+        %209 = OpConvertSToF %float %208
+        %210 = OpFDiv %float %209 %float_10
+        %211 = OpFAdd %float %float_0_5 %210
+               OpStore %grey %211
+               OpBranch %204
+        %206 = OpLabel
+        %212 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %213 = OpLoad %float %212
+        %214 = OpConvertFToS %int %213
+        %215 = OpSLessThan %bool %214 %int_210
+               OpSelectionMerge %216 None
+               OpBranchConditional %215 %217 %218
+        %217 = OpLabel
+        %219 = OpAccessChain %_ptr_Private_int %data %int_6
+        %220 = OpLoad %int %219
+        %221 = OpConvertSToF %float %220
+        %222 = OpFDiv %float %221 %float_10
+        %223 = OpFAdd %float %float_0_5 %222
+               OpStore %grey %223
+               OpBranch %216
+        %218 = OpLabel
+        %224 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %225 = OpLoad %float %224
+        %226 = OpConvertFToS %int %225
+        %227 = OpSLessThan %bool %226 %int_240
+               OpSelectionMerge %228 None
+               OpBranchConditional %227 %229 %230
+        %229 = OpLabel
+        %231 = OpAccessChain %_ptr_Private_int %data %int_7
+        %232 = OpLoad %int %231
+        %233 = OpConvertSToF %float %232
+        %234 = OpFDiv %float %233 %float_10
+        %235 = OpFAdd %float %float_0_5 %234
+               OpStore %grey %235
+               OpBranch %228
+        %230 = OpLabel
+        %236 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %237 = OpLoad %float %236
+        %238 = OpConvertFToS %int %237
+        %239 = OpSLessThan %bool %238 %int_270
+               OpSelectionMerge %240 None
+               OpBranchConditional %239 %241 %242
+        %241 = OpLabel
+        %243 = OpAccessChain %_ptr_Private_int %data %int_8
+        %244 = OpLoad %int %243
+        %245 = OpConvertSToF %float %244
+        %246 = OpFDiv %float %245 %float_10
+        %247 = OpFAdd %float %float_0_5 %246
+               OpStore %grey %247
+               OpBranch %240
+        %242 = OpLabel
+               OpKill
+        %240 = OpLabel
+               OpBranch %228
+        %228 = OpLabel
+               OpBranch %216
+        %216 = OpLabel
+               OpBranch %204
+        %204 = OpLabel
+               OpBranch %197
+        %197 = OpLabel
+               OpBranch %185
+        %185 = OpLabel
+               OpBranch %173
+        %173 = OpLabel
+               OpBranch %161
+        %161 = OpLabel
+               OpBranch %149
+        %149 = OpLabel
+        %248 = OpLoad %float %grey
+        %249 = OpCompositeConstruct %v3float %248 %248 %248
+        %250 = OpCompositeExtract %float %249 0
+        %251 = OpCompositeExtract %float %249 1
+        %252 = OpCompositeExtract %float %249 2
+        %253 = OpCompositeConstruct %v4float %250 %251 %252 %float_1
+               OpStore %_GLF_color %253
+               OpReturn
+               OpFunctionEnd
+%merge_i1_i1_i1_ = OpFunction %void None %35
+       %from = OpFunctionParameter %_ptr_Function_int
+        %mid = OpFunctionParameter %_ptr_Function_int
+         %to = OpFunctionParameter %_ptr_Function_int
+        %254 = OpLabel
+          %k = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+          %j = OpVariable %_ptr_Function_int Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+        %255 = OpLoad %int %from
+               OpStore %k %255
+        %256 = OpLoad %int %from
+               OpStore %i %256
+        %257 = OpLoad %int %mid
+        %258 = OpIAdd %int %257 %int_1
+               OpStore %j %258
+               OpBranch %259
+        %259 = OpLabel
+        %260 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+        %261 = OpLoad %float %260
+        %262 = OpFOrdGreaterThanEqual %bool %float_1 %261
+               OpLoopMerge %263 %264 None
+               OpBranchConditional %262 %265 %264
+        %265 = OpLabel
+        %266 = OpLoad %int %i
+        %267 = OpLoad %int %mid
+        %268 = OpSLessThanEqual %bool %266 %267
+        %269 = OpLoad %int %j
+        %270 = OpLoad %int %to
+        %271 = OpSLessThanEqual %bool %269 %270
+        %272 = OpLogicalAnd %bool %268 %271
+               OpBranchConditional %272 %273 %263
+        %273 = OpLabel
+        %274 = OpLoad %int %i
+        %275 = OpAccessChain %_ptr_Private_int %data %274
+        %276 = OpLoad %int %275
+        %277 = OpLoad %int %j
+        %278 = OpAccessChain %_ptr_Private_int %data %277
+        %279 = OpLoad %int %278
+        %280 = OpSLessThan %bool %276 %279
+               OpBranch %281
+        %281 = OpLabel
+               OpSelectionMerge %282 None
+               OpBranchConditional %280 %283 %284
+        %283 = OpLabel
+        %285 = OpLoad %int %k
+               OpBranch %282
+        %284 = OpLabel
+        %286 = OpCopyObject %int %int_0_0
+               OpBranch %282
+        %282 = OpLabel
+        %287 = OpPhi %int %285 %283 %286 %284
+        %288 = OpIAdd %int %287 %int_1
+               OpBranch %289
+        %289 = OpLabel
+               OpSelectionMerge %290 None
+               OpBranchConditional %280 %291 %290
+        %291 = OpLabel
+               OpStore %k %288
+        %292 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+        %293 = OpLoad %float %292
+        %294 = OpFUnordGreaterThan %bool %float_1 %293
+               OpBranchConditional %294 %290 %264
+        %290 = OpLabel
+               OpBranch %295
+        %295 = OpLabel
+        %296 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+        %297 = OpLoad %float %296
+        %298 = OpFOrdGreaterThanEqual %bool %297 %float_0
+               OpBranchConditional %298 %299 %264
+        %299 = OpLabel
+        %300 = OpCopyObject %int %int_0_0
+               OpBranch %301
+        %301 = OpLabel
+               OpSelectionMerge %302 None
+               OpBranchConditional %280 %303 %304
+        %303 = OpLabel
+        %305 = OpLoad %int %i
+               OpBranch %302
+        %304 = OpLabel
+        %306 = OpCopyObject %int %int_0_0
+               OpBranch %302
+        %302 = OpLabel
+        %307 = OpPhi %int %305 %303 %306 %304
+               OpBranch %308
+        %308 = OpLabel
+        %309 = OpSelect %int %280 %307 %300
+        %310 = OpIAdd %int %309 %int_1
+               OpSelectionMerge %311 None
+               OpBranchConditional %280 %312 %311
+        %312 = OpLabel
+               OpStore %i %310
+               OpBranch %311
+        %311 = OpLabel
+        %313 = OpAccessChain %_ptr_Private_int %data %309
+               OpBranch %314
+        %314 = OpLabel
+        %315 = OpCopyObject %int %int_0_0
+               OpBranch %316
+        %316 = OpLabel
+               OpSelectionMerge %317 None
+               OpBranchConditional %280 %318 %319
+        %318 = OpLabel
+        %320 = OpLoad %int %313
+        %321 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+        %322 = OpLoad %float %321
+        %323 = OpFUnordGreaterThan %bool %float_0 %322
+               OpBranchConditional %323 %264 %317
+        %319 = OpLabel
+        %324 = OpCopyObject %int %int_0_0
+        %325 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+        %326 = OpLoad %float %325
+        %327 = OpFUnordGreaterThanEqual %bool %326 %float_0
+               OpBranchConditional %327 %317 %264
+        %317 = OpLabel
+        %328 = OpPhi %int %320 %318 %324 %319
+               OpBranch %329
+        %329 = OpLabel
+        %330 = OpSelect %int %280 %328 %315
+        %331 = OpAccessChain %_ptr_Private_int %temp %287
+               OpSelectionMerge %332 None
+               OpBranchConditional %280 %333 %332
+        %333 = OpLabel
+               OpStore %331 %330
+               OpBranch %332
+        %332 = OpLabel
+               OpBranch %334
+        %334 = OpLabel
+               OpSelectionMerge %335 None
+               OpBranchConditional %280 %336 %337
+        %337 = OpLabel
+        %338 = OpLoad %int %k
+               OpBranch %335
+        %336 = OpLabel
+        %339 = OpCopyObject %int %int_0_0
+               OpBranch %335
+        %335 = OpLabel
+        %340 = OpPhi %int %338 %337 %339 %336
+        %341 = OpIAdd %int %340 %int_1
+               OpSelectionMerge %342 None
+               OpBranchConditional %280 %342 %343
+        %343 = OpLabel
+               OpStore %k %341
+               OpBranch %342
+        %342 = OpLabel
+        %344 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+        %345 = OpLoad %float %344
+        %346 = OpFUnordGreaterThan %bool %float_1 %345
+               OpBranchConditional %346 %347 %264
+        %347 = OpLabel
+               OpSelectionMerge %348 None
+               OpBranchConditional %280 %349 %350
+        %350 = OpLabel
+        %351 = OpLoad %int %j
+               OpBranch %348
+        %349 = OpLabel
+        %352 = OpCopyObject %int %int_0_0
+               OpBranch %348
+        %348 = OpLabel
+        %353 = OpPhi %int %351 %350 %352 %349
+               OpBranch %354
+        %354 = OpLabel
+        %355 = OpCopyObject %int %int_0_0
+               OpBranch %356
+        %356 = OpLabel
+        %357 = OpSelect %int %280 %355 %353
+        %358 = OpIAdd %int %357 %int_1
+               OpSelectionMerge %359 None
+               OpBranchConditional %280 %359 %360
+        %360 = OpLabel
+               OpStore %j %358
+               OpBranch %359
+        %359 = OpLabel
+        %361 = OpAccessChain %_ptr_Private_int %data %357
+               OpSelectionMerge %362 None
+               OpBranchConditional %280 %363 %364
+        %364 = OpLabel
+        %365 = OpLoad %int %361
+               OpBranch %362
+        %363 = OpLabel
+        %366 = OpCopyObject %int %int_0_0
+               OpBranch %362
+        %362 = OpLabel
+        %367 = OpPhi %int %365 %364 %366 %363
+        %368 = OpAccessChain %_ptr_Private_int %temp %340
+               OpSelectionMerge %369 None
+               OpBranchConditional %280 %369 %370
+        %370 = OpLabel
+               OpStore %368 %367
+               OpBranch %369
+        %369 = OpLabel
+               OpBranch %371
+        %371 = OpLabel
+               OpBranch %264
+        %264 = OpLabel
+               OpBranch %259
+        %263 = OpLabel
+               OpBranch %372
+        %372 = OpLabel
+               OpLoopMerge %373 %374 None
+               OpBranch %375
+        %375 = OpLabel
+        %376 = OpLoad %int %i
+        %377 = OpSLessThan %bool %376 %int_10
+        %378 = OpLoad %int %i
+        %379 = OpLoad %int %mid
+        %380 = OpSLessThanEqual %bool %378 %379
+        %381 = OpLogicalAnd %bool %377 %380
+               OpBranchConditional %381 %382 %373
+        %382 = OpLabel
+        %383 = OpLoad %int %k
+        %384 = OpIAdd %int %383 %int_1
+               OpStore %k %384
+        %385 = OpLoad %int %i
+        %386 = OpIAdd %int %385 %int_1
+               OpStore %i %386
+        %387 = OpAccessChain %_ptr_Private_int %data %385
+        %388 = OpLoad %int %387
+        %389 = OpAccessChain %_ptr_Private_int %temp %383
+               OpStore %389 %388
+               OpBranch %374
+        %374 = OpLabel
+               OpBranch %372
+        %373 = OpLabel
+        %390 = OpLoad %int %from
+               OpStore %i_0 %390
+               OpBranch %391
+        %391 = OpLabel
+               OpLoopMerge %392 %393 None
+               OpBranch %394
+        %394 = OpLabel
+        %395 = OpLoad %int %i_0
+        %396 = OpLoad %int %to
+        %397 = OpSLessThanEqual %bool %395 %396
+               OpBranchConditional %397 %398 %392
+        %398 = OpLabel
+        %399 = OpLoad %int %i_0
+        %400 = OpLoad %int %i_0
+        %401 = OpAccessChain %_ptr_Private_int %temp %400
+        %402 = OpLoad %int %401
+        %403 = OpAccessChain %_ptr_Private_int %data %399
+               OpStore %403 %402
+               OpBranch %393
+        %393 = OpLabel
+        %404 = OpLoad %int %i_0
+        %405 = OpIAdd %int %404 %int_1
+               OpStore %i_0 %405
+               OpBranch %391
+        %392 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %mergeSort_ = OpFunction %void None %32
+        %406 = OpLabel
+        %low = OpVariable %_ptr_Function_int Function
+       %high = OpVariable %_ptr_Function_int Function
+          %m = OpVariable %_ptr_Function_int Function
+        %i_1 = OpVariable %_ptr_Function_int Function
+     %from_0 = OpVariable %_ptr_Function_int Function
+      %mid_0 = OpVariable %_ptr_Function_int Function
+       %to_0 = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_int Function
+    %param_0 = OpVariable %_ptr_Function_int Function
+    %param_1 = OpVariable %_ptr_Function_int Function
+               OpStore %low %int_0
+               OpStore %high %int_9
+               OpStore %m %int_1
+               OpBranch %407
+        %407 = OpLabel
+               OpLoopMerge %408 %409 None
+               OpBranch %410
+        %410 = OpLabel
+        %411 = OpLoad %int %m
+        %412 = OpLoad %int %high
+        %413 = OpSLessThanEqual %bool %411 %412
+               OpBranchConditional %413 %414 %408
+        %414 = OpLabel
+        %415 = OpLoad %int %low
+               OpStore %i_1 %415
+               OpBranch %416
+        %416 = OpLabel
+               OpLoopMerge %417 %418 None
+               OpBranch %419
+        %419 = OpLabel
+        %420 = OpLoad %int %i_1
+        %421 = OpLoad %int %high
+        %422 = OpSLessThan %bool %420 %421
+               OpBranchConditional %422 %423 %417
+        %423 = OpLabel
+        %424 = OpLoad %int %i_1
+               OpStore %from_0 %424
+        %425 = OpLoad %int %i_1
+        %426 = OpLoad %int %m
+        %427 = OpIAdd %int %425 %426
+        %428 = OpISub %int %427 %int_1
+               OpStore %mid_0 %428
+        %429 = OpLoad %int %i_1
+        %430 = OpLoad %int %m
+        %431 = OpIMul %int %int_2 %430
+        %432 = OpIAdd %int %429 %431
+        %433 = OpISub %int %432 %int_1
+        %434 = OpLoad %int %high
+        %435 = OpExtInst %int %1 SMin %433 %434
+               OpStore %to_0 %435
+        %436 = OpLoad %int %from_0
+               OpStore %param %436
+        %437 = OpLoad %int %mid_0
+               OpStore %param_0 %437
+        %438 = OpLoad %int %to_0
+               OpStore %param_1 %438
+        %439 = OpFunctionCall %void %merge_i1_i1_i1_ %param %param_0 %param_1
+               OpBranch %418
+        %418 = OpLabel
+        %440 = OpLoad %int %m
+        %441 = OpIMul %int %int_2 %440
+        %442 = OpLoad %int %i_1
+        %443 = OpIAdd %int %442 %441
+               OpStore %i_1 %443
+               OpBranch %416
+        %417 = OpLabel
+               OpBranch %409
+        %409 = OpLabel
+        %444 = OpLoad %int %m
+        %445 = OpIMul %int %int_2 %444
+               OpStore %m %445
+               OpBranch %407
+        %408 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..5cccfe9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/1.spvasm.expected.hlsl
@@ -0,0 +1,373 @@
+static int data[10] = (int[10])0;
+static int temp[10] = (int[10])0;
+cbuffer cbuffer_x_28 : register(b0, space0) {
+  uint4 x_28[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void merge_i1_i1_i1_(inout int from, inout int mid, inout int to) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  const int x_255 = from;
+  k = x_255;
+  const int x_256 = from;
+  i = x_256;
+  const int x_257 = mid;
+  j = (x_257 + 1);
+  while (true) {
+    int x_285 = 0;
+    int x_286 = 0;
+    int x_305 = 0;
+    int x_306 = 0;
+    int x_320 = 0;
+    int x_324 = 0;
+    int x_339 = 0;
+    int x_338 = 0;
+    int x_352 = 0;
+    int x_351 = 0;
+    int x_366 = 0;
+    int x_365 = 0;
+    int x_287_phi = 0;
+    int x_307_phi = 0;
+    int x_328_phi = 0;
+    int x_340_phi = 0;
+    int x_353_phi = 0;
+    int x_367_phi = 0;
+    const float x_261 = asfloat(x_28[0].x);
+    if ((1.0f >= x_261)) {
+    } else {
+      continue;
+    }
+    const int x_266 = i;
+    const int x_267 = mid;
+    const int x_269 = j;
+    const int x_270 = to;
+    bool tint_tmp = (x_266 <= x_267);
+    if (tint_tmp) {
+      tint_tmp = (x_269 <= x_270);
+    }
+    if ((tint_tmp)) {
+    } else {
+      break;
+    }
+    const int x_276 = data[i];
+    const int x_279 = data[j];
+    const bool x_280 = (x_276 < x_279);
+    if (x_280) {
+      x_285 = k;
+      x_287_phi = x_285;
+    } else {
+      x_286 = 0;
+      x_287_phi = x_286;
+    }
+    const int x_287 = x_287_phi;
+    const int x_288 = (x_287 + 1);
+    if (x_280) {
+      k = x_288;
+      const float x_293 = asfloat(x_28[0].x);
+      if (!((1.0f <= x_293))) {
+      } else {
+        continue;
+      }
+    }
+    const float x_297 = asfloat(x_28[0].y);
+    if ((x_297 >= 0.0f)) {
+    } else {
+      continue;
+    }
+    const int x_300 = 0;
+    if (x_280) {
+      x_305 = i;
+      x_307_phi = x_305;
+    } else {
+      x_306 = 0;
+      x_307_phi = x_306;
+    }
+    const int x_309 = (x_280 ? x_307_phi : x_300);
+    if (x_280) {
+      i = (x_309 + 1);
+    }
+    const int x_315 = 0;
+    if (x_280) {
+      x_320 = data[x_309];
+      const float x_322 = asfloat(x_28[0].y);
+      x_328_phi = x_320;
+      if (!((0.0f <= x_322))) {
+        continue;
+      }
+    } else {
+      x_324 = 0;
+      const float x_326 = asfloat(x_28[0].y);
+      x_328_phi = x_324;
+      if (!((x_326 < 0.0f))) {
+      } else {
+        continue;
+      }
+    }
+    const int x_328 = x_328_phi;
+    if (x_280) {
+      temp[x_287] = (x_280 ? x_328 : x_315);
+    }
+    if (x_280) {
+      x_339 = 0;
+      x_340_phi = x_339;
+    } else {
+      x_338 = k;
+      x_340_phi = x_338;
+    }
+    const int x_340 = x_340_phi;
+    if (x_280) {
+    } else {
+      k = (x_340 + 1);
+    }
+    const float x_345 = asfloat(x_28[0].x);
+    if (!((1.0f <= x_345))) {
+    } else {
+      continue;
+    }
+    if (x_280) {
+      x_352 = 0;
+      x_353_phi = x_352;
+    } else {
+      x_351 = j;
+      x_353_phi = x_351;
+    }
+    const int x_357 = (x_280 ? 0 : x_353_phi);
+    if (x_280) {
+    } else {
+      j = (x_357 + 1);
+    }
+    if (x_280) {
+      x_366 = 0;
+      x_367_phi = x_366;
+    } else {
+      x_365 = data[x_357];
+      x_367_phi = x_365;
+    }
+    const int x_367 = x_367_phi;
+    if (x_280) {
+    } else {
+      temp[x_340] = x_367;
+    }
+  }
+  while (true) {
+    const int x_376 = i;
+    const int x_378 = i;
+    const int x_379 = mid;
+    bool tint_tmp_1 = (x_376 < 10);
+    if (tint_tmp_1) {
+      tint_tmp_1 = (x_378 <= x_379);
+    }
+    if ((tint_tmp_1)) {
+    } else {
+      break;
+    }
+    const int x_383 = k;
+    k = (x_383 + 1);
+    const int x_385 = i;
+    i = (x_385 + 1);
+    const int x_388 = data[x_385];
+    temp[x_383] = x_388;
+  }
+  const int x_390 = from;
+  i_1 = x_390;
+  while (true) {
+    const int x_395 = i_1;
+    const int x_396 = to;
+    if ((x_395 <= x_396)) {
+    } else {
+      break;
+    }
+    const int x_399 = i_1;
+    const int x_402 = temp[i_1];
+    data[x_399] = x_402;
+    {
+      i_1 = (i_1 + 1);
+    }
+  }
+  return;
+}
+
+void mergeSort_() {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  {
+    for(; (m <= high); m = (2 * m)) {
+      i_2 = low;
+      {
+        for(; (i_2 < high); i_2 = (i_2 + (2 * m))) {
+          from_1 = i_2;
+          mid_1 = ((i_2 + m) - 1);
+          to_1 = min(((i_2 + (2 * m)) - 1), high);
+          param = from_1;
+          param_1 = mid_1;
+          param_2 = to_1;
+          merge_i1_i1_i1_(param, param_1, param_2);
+        }
+      }
+    }
+  }
+  return;
+}
+
+void main_1() {
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  const float x_88 = asfloat(x_28[0].x);
+  i_3 = int(x_88);
+  while (true) {
+    switch(i_3) {
+      case 9: {
+        data[i_3] = -5;
+        break;
+      }
+      case 8: {
+        data[i_3] = -4;
+        break;
+      }
+      case 7: {
+        data[i_3] = -3;
+        break;
+      }
+      case 6: {
+        data[i_3] = -2;
+        break;
+      }
+      case 5: {
+        data[i_3] = -1;
+        break;
+      }
+      case 4: {
+        data[i_3] = 0;
+        break;
+      }
+      case 3: {
+        data[i_3] = 1;
+        break;
+      }
+      case 2: {
+        data[i_3] = 2;
+        break;
+      }
+      case 1: {
+        data[i_3] = 3;
+        break;
+      }
+      case 0: {
+        data[i_3] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    i_3 = (i_3 + 1);
+    {
+      if ((i_3 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  {
+    for(; (j_1 < 10); j_1 = (j_1 + 1)) {
+      const int x_137 = j_1;
+      const int x_140 = data[j_1];
+      temp[x_137] = x_140;
+    }
+  }
+  mergeSort_();
+  const float x_146 = gl_FragCoord.y;
+  if ((int(x_146) < 30)) {
+    const int x_153 = data[0];
+    grey = (0.5f + (float(x_153) / 10.0f));
+  } else {
+    const float x_158 = gl_FragCoord.y;
+    if ((int(x_158) < 60)) {
+      const int x_165 = data[1];
+      grey = (0.5f + (float(x_165) / 10.0f));
+    } else {
+      const float x_170 = gl_FragCoord.y;
+      if ((int(x_170) < 90)) {
+        const int x_177 = data[2];
+        grey = (0.5f + (float(x_177) / 10.0f));
+      } else {
+        const float x_182 = gl_FragCoord.y;
+        if ((int(x_182) < 120)) {
+          const int x_189 = data[3];
+          grey = (0.5f + (float(x_189) / 10.0f));
+        } else {
+          const float x_194 = gl_FragCoord.y;
+          if ((int(x_194) < 150)) {
+            discard;
+          } else {
+            const float x_201 = gl_FragCoord.y;
+            if ((int(x_201) < 180)) {
+              const int x_208 = data[5];
+              grey = (0.5f + (float(x_208) / 10.0f));
+            } else {
+              const float x_213 = gl_FragCoord.y;
+              if ((int(x_213) < 210)) {
+                const int x_220 = data[6];
+                grey = (0.5f + (float(x_220) / 10.0f));
+              } else {
+                const float x_225 = gl_FragCoord.y;
+                if ((int(x_225) < 240)) {
+                  const int x_232 = data[7];
+                  grey = (0.5f + (float(x_232) / 10.0f));
+                } else {
+                  const float x_237 = gl_FragCoord.y;
+                  if ((int(x_237) < 270)) {
+                    const int x_244 = data[8];
+                    grey = (0.5f + (float(x_244) / 10.0f));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  const float x_248 = grey;
+  const float3 x_249 = float3(x_248, x_248, x_248);
+  x_GLF_color = float4(x_249.x, x_249.y, x_249.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/1.spvasm.expected.msl
new file mode 100644
index 0000000..a023050
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/1.spvasm.expected.msl
@@ -0,0 +1,422 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void merge_i1_i1_i1_(constant buf0& x_28, thread int* const from, thread int* const mid, thread int* const to, thread tint_array_wrapper* const tint_symbol_5, thread tint_array_wrapper* const tint_symbol_6) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  int const x_255 = *(from);
+  k = x_255;
+  int const x_256 = *(from);
+  i = x_256;
+  int const x_257 = *(mid);
+  j = (x_257 + 1);
+  while (true) {
+    int x_285 = 0;
+    int x_286 = 0;
+    int x_305 = 0;
+    int x_306 = 0;
+    int x_320 = 0;
+    int x_324 = 0;
+    int x_339 = 0;
+    int x_338 = 0;
+    int x_352 = 0;
+    int x_351 = 0;
+    int x_366 = 0;
+    int x_365 = 0;
+    int x_287_phi = 0;
+    int x_307_phi = 0;
+    int x_328_phi = 0;
+    int x_340_phi = 0;
+    int x_353_phi = 0;
+    int x_367_phi = 0;
+    float const x_261 = x_28.injectionSwitch.x;
+    if ((1.0f >= x_261)) {
+    } else {
+      continue;
+    }
+    int const x_266 = i;
+    int const x_267 = *(mid);
+    int const x_269 = j;
+    int const x_270 = *(to);
+    if (((x_266 <= x_267) && (x_269 <= x_270))) {
+    } else {
+      break;
+    }
+    int const x_274 = i;
+    int const x_276 = (*(tint_symbol_5)).arr[x_274];
+    int const x_277 = j;
+    int const x_279 = (*(tint_symbol_5)).arr[x_277];
+    bool const x_280 = (x_276 < x_279);
+    if (x_280) {
+      x_285 = k;
+      x_287_phi = x_285;
+    } else {
+      x_286 = 0;
+      x_287_phi = x_286;
+    }
+    int const x_287 = x_287_phi;
+    int const x_288 = (x_287 + 1);
+    if (x_280) {
+      k = x_288;
+      float const x_293 = x_28.injectionSwitch.x;
+      if (!((1.0f <= x_293))) {
+      } else {
+        continue;
+      }
+    }
+    float const x_297 = x_28.injectionSwitch.y;
+    if ((x_297 >= 0.0f)) {
+    } else {
+      continue;
+    }
+    int const x_300 = 0;
+    if (x_280) {
+      x_305 = i;
+      x_307_phi = x_305;
+    } else {
+      x_306 = 0;
+      x_307_phi = x_306;
+    }
+    int const x_307 = x_307_phi;
+    int const x_309 = select(x_300, x_307, x_280);
+    if (x_280) {
+      i = (x_309 + 1);
+    }
+    int const x_315 = 0;
+    if (x_280) {
+      x_320 = (*(tint_symbol_5)).arr[x_309];
+      float const x_322 = x_28.injectionSwitch.y;
+      x_328_phi = x_320;
+      if (!((0.0f <= x_322))) {
+        continue;
+      }
+    } else {
+      x_324 = 0;
+      float const x_326 = x_28.injectionSwitch.y;
+      x_328_phi = x_324;
+      if (!((x_326 < 0.0f))) {
+      } else {
+        continue;
+      }
+    }
+    int const x_328 = x_328_phi;
+    if (x_280) {
+      (*(tint_symbol_6)).arr[x_287] = select(x_315, x_328, x_280);
+    }
+    if (x_280) {
+      x_339 = 0;
+      x_340_phi = x_339;
+    } else {
+      x_338 = k;
+      x_340_phi = x_338;
+    }
+    int const x_340 = x_340_phi;
+    if (x_280) {
+    } else {
+      k = (x_340 + 1);
+    }
+    float const x_345 = x_28.injectionSwitch.x;
+    if (!((1.0f <= x_345))) {
+    } else {
+      continue;
+    }
+    if (x_280) {
+      x_352 = 0;
+      x_353_phi = x_352;
+    } else {
+      x_351 = j;
+      x_353_phi = x_351;
+    }
+    int const x_353 = x_353_phi;
+    int const x_355 = 0;
+    int const x_357 = select(x_353, x_355, x_280);
+    if (x_280) {
+    } else {
+      j = (x_357 + 1);
+    }
+    if (x_280) {
+      x_366 = 0;
+      x_367_phi = x_366;
+    } else {
+      x_365 = (*(tint_symbol_5)).arr[x_357];
+      x_367_phi = x_365;
+    }
+    int const x_367 = x_367_phi;
+    if (x_280) {
+    } else {
+      (*(tint_symbol_6)).arr[x_340] = x_367;
+    }
+  }
+  while (true) {
+    int const x_376 = i;
+    int const x_378 = i;
+    int const x_379 = *(mid);
+    if (((x_376 < 10) && (x_378 <= x_379))) {
+    } else {
+      break;
+    }
+    int const x_383 = k;
+    k = (x_383 + 1);
+    int const x_385 = i;
+    i = (x_385 + 1);
+    int const x_388 = (*(tint_symbol_5)).arr[x_385];
+    (*(tint_symbol_6)).arr[x_383] = x_388;
+  }
+  int const x_390 = *(from);
+  i_1 = x_390;
+  while (true) {
+    int const x_395 = i_1;
+    int const x_396 = *(to);
+    if ((x_395 <= x_396)) {
+    } else {
+      break;
+    }
+    int const x_399 = i_1;
+    int const x_400 = i_1;
+    int const x_402 = (*(tint_symbol_6)).arr[x_400];
+    (*(tint_symbol_5)).arr[x_399] = x_402;
+    {
+      int const x_404 = i_1;
+      i_1 = (x_404 + 1);
+    }
+  }
+  return;
+}
+
+void mergeSort_(constant buf0& x_28, thread tint_array_wrapper* const tint_symbol_7, thread tint_array_wrapper* const tint_symbol_8) {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  while (true) {
+    int const x_411 = m;
+    int const x_412 = high;
+    if ((x_411 <= x_412)) {
+    } else {
+      break;
+    }
+    int const x_415 = low;
+    i_2 = x_415;
+    while (true) {
+      int const x_420 = i_2;
+      int const x_421 = high;
+      if ((x_420 < x_421)) {
+      } else {
+        break;
+      }
+      int const x_424 = i_2;
+      from_1 = x_424;
+      int const x_425 = i_2;
+      int const x_426 = m;
+      mid_1 = ((x_425 + x_426) - 1);
+      int const x_429 = i_2;
+      int const x_430 = m;
+      int const x_434 = high;
+      to_1 = min(((x_429 + (2 * x_430)) - 1), x_434);
+      int const x_436 = from_1;
+      param = x_436;
+      int const x_437 = mid_1;
+      param_1 = x_437;
+      int const x_438 = to_1;
+      param_2 = x_438;
+      merge_i1_i1_i1_(x_28, &(param), &(param_1), &(param_2), tint_symbol_7, tint_symbol_8);
+      {
+        int const x_440 = m;
+        int const x_442 = i_2;
+        i_2 = (x_442 + (2 * x_440));
+      }
+    }
+    {
+      int const x_444 = m;
+      m = (2 * x_444);
+    }
+  }
+  return;
+}
+
+void main_1(constant buf0& x_28, thread tint_array_wrapper* const tint_symbol_9, thread tint_array_wrapper* const tint_symbol_10, thread float4* const tint_symbol_11, thread float4* const tint_symbol_12) {
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  float const x_88 = x_28.injectionSwitch.x;
+  i_3 = int(x_88);
+  while (true) {
+    int const x_94 = i_3;
+    switch(x_94) {
+      case 9: {
+        int const x_124 = i_3;
+        (*(tint_symbol_9)).arr[x_124] = -5;
+        break;
+      }
+      case 8: {
+        int const x_122 = i_3;
+        (*(tint_symbol_9)).arr[x_122] = -4;
+        break;
+      }
+      case 7: {
+        int const x_120 = i_3;
+        (*(tint_symbol_9)).arr[x_120] = -3;
+        break;
+      }
+      case 6: {
+        int const x_118 = i_3;
+        (*(tint_symbol_9)).arr[x_118] = -2;
+        break;
+      }
+      case 5: {
+        int const x_116 = i_3;
+        (*(tint_symbol_9)).arr[x_116] = -1;
+        break;
+      }
+      case 4: {
+        int const x_114 = i_3;
+        (*(tint_symbol_9)).arr[x_114] = 0;
+        break;
+      }
+      case 3: {
+        int const x_112 = i_3;
+        (*(tint_symbol_9)).arr[x_112] = 1;
+        break;
+      }
+      case 2: {
+        int const x_110 = i_3;
+        (*(tint_symbol_9)).arr[x_110] = 2;
+        break;
+      }
+      case 1: {
+        int const x_108 = i_3;
+        (*(tint_symbol_9)).arr[x_108] = 3;
+        break;
+      }
+      case 0: {
+        int const x_106 = i_3;
+        (*(tint_symbol_9)).arr[x_106] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    int const x_126 = i_3;
+    i_3 = (x_126 + 1);
+    {
+      int const x_128 = i_3;
+      if ((x_128 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  while (true) {
+    int const x_134 = j_1;
+    if ((x_134 < 10)) {
+    } else {
+      break;
+    }
+    int const x_137 = j_1;
+    int const x_138 = j_1;
+    int const x_140 = (*(tint_symbol_9)).arr[x_138];
+    (*(tint_symbol_10)).arr[x_137] = x_140;
+    {
+      int const x_142 = j_1;
+      j_1 = (x_142 + 1);
+    }
+  }
+  mergeSort_(x_28, tint_symbol_9, tint_symbol_10);
+  float const x_146 = (*(tint_symbol_11)).y;
+  if ((int(x_146) < 30)) {
+    int const x_153 = (*(tint_symbol_9)).arr[0];
+    grey = (0.5f + (float(x_153) / 10.0f));
+  } else {
+    float const x_158 = (*(tint_symbol_11)).y;
+    if ((int(x_158) < 60)) {
+      int const x_165 = (*(tint_symbol_9)).arr[1];
+      grey = (0.5f + (float(x_165) / 10.0f));
+    } else {
+      float const x_170 = (*(tint_symbol_11)).y;
+      if ((int(x_170) < 90)) {
+        int const x_177 = (*(tint_symbol_9)).arr[2];
+        grey = (0.5f + (float(x_177) / 10.0f));
+      } else {
+        float const x_182 = (*(tint_symbol_11)).y;
+        if ((int(x_182) < 120)) {
+          int const x_189 = (*(tint_symbol_9)).arr[3];
+          grey = (0.5f + (float(x_189) / 10.0f));
+        } else {
+          float const x_194 = (*(tint_symbol_11)).y;
+          if ((int(x_194) < 150)) {
+            discard_fragment();
+          } else {
+            float const x_201 = (*(tint_symbol_11)).y;
+            if ((int(x_201) < 180)) {
+              int const x_208 = (*(tint_symbol_9)).arr[5];
+              grey = (0.5f + (float(x_208) / 10.0f));
+            } else {
+              float const x_213 = (*(tint_symbol_11)).y;
+              if ((int(x_213) < 210)) {
+                int const x_220 = (*(tint_symbol_9)).arr[6];
+                grey = (0.5f + (float(x_220) / 10.0f));
+              } else {
+                float const x_225 = (*(tint_symbol_11)).y;
+                if ((int(x_225) < 240)) {
+                  int const x_232 = (*(tint_symbol_9)).arr[7];
+                  grey = (0.5f + (float(x_232) / 10.0f));
+                } else {
+                  float const x_237 = (*(tint_symbol_11)).y;
+                  if ((int(x_237) < 270)) {
+                    int const x_244 = (*(tint_symbol_9)).arr[8];
+                    grey = (0.5f + (float(x_244) / 10.0f));
+                  } else {
+                    discard_fragment();
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  float const x_248 = grey;
+  float3 const x_249 = float3(x_248, x_248, x_248);
+  *(tint_symbol_12) = float4(x_249.x, x_249.y, x_249.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_28 [[buffer(0)]]) {
+  thread float4 tint_symbol_13 = 0.0f;
+  thread tint_array_wrapper tint_symbol_14 = {};
+  thread tint_array_wrapper tint_symbol_15 = {};
+  thread float4 tint_symbol_16 = 0.0f;
+  tint_symbol_13 = gl_FragCoord_param;
+  main_1(x_28, &(tint_symbol_14), &(tint_symbol_15), &(tint_symbol_13), &(tint_symbol_16));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_16};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..aa67796
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/1.spvasm.expected.spvasm
@@ -0,0 +1,864 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 525
+; Schema: 0
+               OpCapability Shader
+        %290 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %data "data"
+               OpName %temp "temp"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_28 "x_28"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %merge_i1_i1_i1_ "merge_i1_i1_i1_"
+               OpName %from "from"
+               OpName %mid "mid"
+               OpName %to "to"
+               OpName %k "k"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %i_1 "i_1"
+               OpName %x_285 "x_285"
+               OpName %x_286 "x_286"
+               OpName %x_305 "x_305"
+               OpName %x_306 "x_306"
+               OpName %x_320 "x_320"
+               OpName %x_324 "x_324"
+               OpName %x_339 "x_339"
+               OpName %x_338 "x_338"
+               OpName %x_352 "x_352"
+               OpName %x_351 "x_351"
+               OpName %x_366 "x_366"
+               OpName %x_365 "x_365"
+               OpName %x_287_phi "x_287_phi"
+               OpName %x_307_phi "x_307_phi"
+               OpName %x_328_phi "x_328_phi"
+               OpName %x_340_phi "x_340_phi"
+               OpName %x_353_phi "x_353_phi"
+               OpName %x_367_phi "x_367_phi"
+               OpName %mergeSort_ "mergeSort_"
+               OpName %low "low"
+               OpName %high "high"
+               OpName %m "m"
+               OpName %i_2 "i_2"
+               OpName %from_1 "from_1"
+               OpName %mid_1 "mid_1"
+               OpName %to_1 "to_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %main_1 "main_1"
+               OpName %i_3 "i_3"
+               OpName %j_1 "j_1"
+               OpName %grey "grey"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_28 NonWritable
+               OpDecorate %x_28 DescriptorSet 0
+               OpDecorate %x_28 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Private__arr_int_uint_10 = OpTypePointer Private %_arr_int_uint_10
+          %7 = OpConstantNull %_arr_int_uint_10
+       %data = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+       %temp = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_28 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %17
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int %_ptr_Function_int
+         %32 = OpConstantNull %int
+      %int_1 = OpConstant %int 1
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+       %bool = OpTypeBool
+%_ptr_Private_int = OpTypePointer Private %int
+      %int_0 = OpConstant %int 0
+     %uint_1 = OpConstant %uint 1
+    %float_0 = OpConstant %float 0
+     %int_10 = OpConstant %int 10
+        %246 = OpTypeFunction %void
+      %int_9 = OpConstant %int 9
+      %int_2 = OpConstant %int 2
+%_ptr_Function_float = OpTypePointer Function %float
+        %314 = OpConstantNull %float
+     %int_n5 = OpConstant %int -5
+     %int_n4 = OpConstant %int -4
+     %int_n3 = OpConstant %int -3
+     %int_n2 = OpConstant %int -2
+     %int_n1 = OpConstant %int -1
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+%_ptr_Private_float = OpTypePointer Private %float
+     %int_30 = OpConstant %int 30
+  %float_0_5 = OpConstant %float 0.5
+   %float_10 = OpConstant %float 10
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+    %v3float = OpTypeVector %float 3
+   %main_out = OpTypeStruct %v4float
+        %512 = OpTypeFunction %void %main_out
+%merge_i1_i1_i1_ = OpFunction %void None %23
+       %from = OpFunctionParameter %_ptr_Function_int
+        %mid = OpFunctionParameter %_ptr_Function_int
+         %to = OpFunctionParameter %_ptr_Function_int
+         %30 = OpLabel
+          %k = OpVariable %_ptr_Function_int Function %32
+          %i = OpVariable %_ptr_Function_int Function %32
+          %j = OpVariable %_ptr_Function_int Function %32
+        %i_1 = OpVariable %_ptr_Function_int Function %32
+      %x_285 = OpVariable %_ptr_Function_int Function %32
+      %x_286 = OpVariable %_ptr_Function_int Function %32
+      %x_305 = OpVariable %_ptr_Function_int Function %32
+      %x_306 = OpVariable %_ptr_Function_int Function %32
+      %x_320 = OpVariable %_ptr_Function_int Function %32
+      %x_324 = OpVariable %_ptr_Function_int Function %32
+      %x_339 = OpVariable %_ptr_Function_int Function %32
+      %x_338 = OpVariable %_ptr_Function_int Function %32
+      %x_352 = OpVariable %_ptr_Function_int Function %32
+      %x_351 = OpVariable %_ptr_Function_int Function %32
+      %x_366 = OpVariable %_ptr_Function_int Function %32
+      %x_365 = OpVariable %_ptr_Function_int Function %32
+  %x_287_phi = OpVariable %_ptr_Function_int Function %32
+  %x_307_phi = OpVariable %_ptr_Function_int Function %32
+  %x_328_phi = OpVariable %_ptr_Function_int Function %32
+  %x_340_phi = OpVariable %_ptr_Function_int Function %32
+  %x_353_phi = OpVariable %_ptr_Function_int Function %32
+  %x_367_phi = OpVariable %_ptr_Function_int Function %32
+         %37 = OpLoad %int %from
+               OpStore %k %37
+         %39 = OpLoad %int %from
+               OpStore %i %39
+         %41 = OpLoad %int %mid
+         %43 = OpIAdd %int %41 %int_1
+               OpStore %j %43
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %68 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_0
+         %69 = OpLoad %float %68
+         %71 = OpFOrdGreaterThanEqual %bool %float_1 %69
+               OpSelectionMerge %73 None
+               OpBranchConditional %71 %74 %75
+         %74 = OpLabel
+               OpBranch %73
+         %75 = OpLabel
+               OpBranch %46
+         %73 = OpLabel
+         %76 = OpLoad %int %i
+         %78 = OpLoad %int %mid
+         %79 = OpLoad %int %j
+         %81 = OpLoad %int %to
+         %82 = OpSLessThanEqual %bool %76 %78
+               OpSelectionMerge %83 None
+               OpBranchConditional %82 %84 %83
+         %84 = OpLabel
+         %85 = OpSLessThanEqual %bool %79 %81
+               OpBranch %83
+         %83 = OpLabel
+         %86 = OpPhi %bool %82 %73 %85 %84
+               OpSelectionMerge %87 None
+               OpBranchConditional %86 %88 %89
+         %88 = OpLabel
+               OpBranch %87
+         %89 = OpLabel
+               OpBranch %45
+         %87 = OpLabel
+         %90 = OpLoad %int %i
+         %92 = OpAccessChain %_ptr_Private_int %data %90
+         %93 = OpLoad %int %92
+         %94 = OpLoad %int %j
+         %95 = OpAccessChain %_ptr_Private_int %data %94
+         %96 = OpLoad %int %95
+         %97 = OpSLessThan %bool %93 %96
+               OpSelectionMerge %98 None
+               OpBranchConditional %97 %99 %100
+         %99 = OpLabel
+        %101 = OpLoad %int %k
+               OpStore %x_285 %101
+        %102 = OpLoad %int %x_285
+               OpStore %x_287_phi %102
+               OpBranch %98
+        %100 = OpLabel
+               OpStore %x_286 %int_0
+        %104 = OpLoad %int %x_286
+               OpStore %x_287_phi %104
+               OpBranch %98
+         %98 = OpLabel
+        %105 = OpLoad %int %x_287_phi
+        %106 = OpIAdd %int %105 %int_1
+               OpSelectionMerge %107 None
+               OpBranchConditional %97 %108 %107
+        %108 = OpLabel
+               OpStore %k %106
+        %109 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_0
+        %110 = OpLoad %float %109
+        %112 = OpFOrdLessThanEqual %bool %float_1 %110
+        %111 = OpLogicalNot %bool %112
+               OpSelectionMerge %113 None
+               OpBranchConditional %111 %114 %115
+        %114 = OpLabel
+               OpBranch %113
+        %115 = OpLabel
+               OpBranch %46
+        %113 = OpLabel
+               OpBranch %107
+        %107 = OpLabel
+        %117 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_1
+        %118 = OpLoad %float %117
+        %120 = OpFOrdGreaterThanEqual %bool %118 %float_0
+               OpSelectionMerge %121 None
+               OpBranchConditional %120 %122 %123
+        %122 = OpLabel
+               OpBranch %121
+        %123 = OpLabel
+               OpBranch %46
+        %121 = OpLabel
+               OpSelectionMerge %124 None
+               OpBranchConditional %97 %125 %126
+        %125 = OpLabel
+        %127 = OpLoad %int %i
+               OpStore %x_305 %127
+        %128 = OpLoad %int %x_305
+               OpStore %x_307_phi %128
+               OpBranch %124
+        %126 = OpLabel
+               OpStore %x_306 %int_0
+        %129 = OpLoad %int %x_306
+               OpStore %x_307_phi %129
+               OpBranch %124
+        %124 = OpLabel
+        %130 = OpLoad %int %x_307_phi
+        %131 = OpSelect %int %97 %130 %int_0
+               OpSelectionMerge %132 None
+               OpBranchConditional %97 %133 %132
+        %133 = OpLabel
+        %134 = OpIAdd %int %131 %int_1
+               OpStore %i %134
+               OpBranch %132
+        %132 = OpLabel
+               OpSelectionMerge %135 None
+               OpBranchConditional %97 %136 %137
+        %136 = OpLabel
+        %138 = OpAccessChain %_ptr_Private_int %data %131
+        %139 = OpLoad %int %138
+               OpStore %x_320 %139
+        %140 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_1
+        %141 = OpLoad %float %140
+        %142 = OpLoad %int %x_320
+               OpStore %x_328_phi %142
+        %144 = OpFOrdLessThanEqual %bool %float_0 %141
+        %143 = OpLogicalNot %bool %144
+               OpSelectionMerge %145 None
+               OpBranchConditional %143 %146 %145
+        %146 = OpLabel
+               OpBranch %46
+        %145 = OpLabel
+               OpBranch %135
+        %137 = OpLabel
+               OpStore %x_324 %int_0
+        %147 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_1
+        %148 = OpLoad %float %147
+        %149 = OpLoad %int %x_324
+               OpStore %x_328_phi %149
+        %151 = OpFOrdLessThan %bool %148 %float_0
+        %150 = OpLogicalNot %bool %151
+               OpSelectionMerge %152 None
+               OpBranchConditional %150 %153 %154
+        %153 = OpLabel
+               OpBranch %152
+        %154 = OpLabel
+               OpBranch %46
+        %152 = OpLabel
+               OpBranch %135
+        %135 = OpLabel
+        %155 = OpLoad %int %x_328_phi
+               OpSelectionMerge %156 None
+               OpBranchConditional %97 %157 %156
+        %157 = OpLabel
+        %158 = OpAccessChain %_ptr_Private_int %temp %105
+        %159 = OpSelect %int %97 %155 %int_0
+               OpStore %158 %159
+               OpBranch %156
+        %156 = OpLabel
+               OpSelectionMerge %160 None
+               OpBranchConditional %97 %161 %162
+        %161 = OpLabel
+               OpStore %x_339 %int_0
+        %163 = OpLoad %int %x_339
+               OpStore %x_340_phi %163
+               OpBranch %160
+        %162 = OpLabel
+        %164 = OpLoad %int %k
+               OpStore %x_338 %164
+        %165 = OpLoad %int %x_338
+               OpStore %x_340_phi %165
+               OpBranch %160
+        %160 = OpLabel
+        %166 = OpLoad %int %x_340_phi
+               OpSelectionMerge %167 None
+               OpBranchConditional %97 %168 %169
+        %168 = OpLabel
+               OpBranch %167
+        %169 = OpLabel
+        %170 = OpIAdd %int %166 %int_1
+               OpStore %k %170
+               OpBranch %167
+        %167 = OpLabel
+        %171 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_0
+        %172 = OpLoad %float %171
+        %174 = OpFOrdLessThanEqual %bool %float_1 %172
+        %173 = OpLogicalNot %bool %174
+               OpSelectionMerge %175 None
+               OpBranchConditional %173 %176 %177
+        %176 = OpLabel
+               OpBranch %175
+        %177 = OpLabel
+               OpBranch %46
+        %175 = OpLabel
+               OpSelectionMerge %178 None
+               OpBranchConditional %97 %179 %180
+        %179 = OpLabel
+               OpStore %x_352 %int_0
+        %181 = OpLoad %int %x_352
+               OpStore %x_353_phi %181
+               OpBranch %178
+        %180 = OpLabel
+        %182 = OpLoad %int %j
+               OpStore %x_351 %182
+        %183 = OpLoad %int %x_351
+               OpStore %x_353_phi %183
+               OpBranch %178
+        %178 = OpLabel
+        %184 = OpLoad %int %x_353_phi
+        %185 = OpSelect %int %97 %int_0 %184
+               OpSelectionMerge %186 None
+               OpBranchConditional %97 %187 %188
+        %187 = OpLabel
+               OpBranch %186
+        %188 = OpLabel
+        %189 = OpIAdd %int %185 %int_1
+               OpStore %j %189
+               OpBranch %186
+        %186 = OpLabel
+               OpSelectionMerge %190 None
+               OpBranchConditional %97 %191 %192
+        %191 = OpLabel
+               OpStore %x_366 %int_0
+        %193 = OpLoad %int %x_366
+               OpStore %x_367_phi %193
+               OpBranch %190
+        %192 = OpLabel
+        %194 = OpAccessChain %_ptr_Private_int %data %185
+        %195 = OpLoad %int %194
+               OpStore %x_365 %195
+        %196 = OpLoad %int %x_365
+               OpStore %x_367_phi %196
+               OpBranch %190
+        %190 = OpLabel
+        %197 = OpLoad %int %x_367_phi
+               OpSelectionMerge %198 None
+               OpBranchConditional %97 %199 %200
+        %199 = OpLabel
+               OpBranch %198
+        %200 = OpLabel
+        %201 = OpAccessChain %_ptr_Private_int %temp %166
+               OpStore %201 %197
+               OpBranch %198
+        %198 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+               OpBranch %44
+         %45 = OpLabel
+               OpBranch %202
+        %202 = OpLabel
+               OpLoopMerge %203 %204 None
+               OpBranch %205
+        %205 = OpLabel
+        %206 = OpLoad %int %i
+        %207 = OpLoad %int %i
+        %209 = OpLoad %int %mid
+        %211 = OpSLessThan %bool %206 %int_10
+               OpSelectionMerge %212 None
+               OpBranchConditional %211 %213 %212
+        %213 = OpLabel
+        %214 = OpSLessThanEqual %bool %207 %209
+               OpBranch %212
+        %212 = OpLabel
+        %215 = OpPhi %bool %211 %205 %214 %213
+               OpSelectionMerge %216 None
+               OpBranchConditional %215 %217 %218
+        %217 = OpLabel
+               OpBranch %216
+        %218 = OpLabel
+               OpBranch %203
+        %216 = OpLabel
+        %219 = OpLoad %int %k
+        %220 = OpIAdd %int %219 %int_1
+               OpStore %k %220
+        %221 = OpLoad %int %i
+        %222 = OpIAdd %int %221 %int_1
+               OpStore %i %222
+        %223 = OpAccessChain %_ptr_Private_int %data %221
+        %224 = OpLoad %int %223
+        %225 = OpAccessChain %_ptr_Private_int %temp %219
+               OpStore %225 %224
+               OpBranch %204
+        %204 = OpLabel
+               OpBranch %202
+        %203 = OpLabel
+        %227 = OpLoad %int %from
+               OpStore %i_1 %227
+               OpBranch %228
+        %228 = OpLabel
+               OpLoopMerge %229 %230 None
+               OpBranch %231
+        %231 = OpLabel
+        %232 = OpLoad %int %i_1
+        %234 = OpLoad %int %to
+        %235 = OpSLessThanEqual %bool %232 %234
+               OpSelectionMerge %236 None
+               OpBranchConditional %235 %237 %238
+        %237 = OpLabel
+               OpBranch %236
+        %238 = OpLabel
+               OpBranch %229
+        %236 = OpLabel
+        %239 = OpLoad %int %i_1
+        %240 = OpLoad %int %i_1
+        %241 = OpAccessChain %_ptr_Private_int %temp %240
+        %242 = OpLoad %int %241
+        %243 = OpAccessChain %_ptr_Private_int %data %239
+               OpStore %243 %242
+               OpBranch %230
+        %230 = OpLabel
+        %244 = OpLoad %int %i_1
+        %245 = OpIAdd %int %244 %int_1
+               OpStore %i_1 %245
+               OpBranch %228
+        %229 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %mergeSort_ = OpFunction %void None %246
+        %248 = OpLabel
+        %low = OpVariable %_ptr_Function_int Function %32
+       %high = OpVariable %_ptr_Function_int Function %32
+          %m = OpVariable %_ptr_Function_int Function %32
+        %i_2 = OpVariable %_ptr_Function_int Function %32
+     %from_1 = OpVariable %_ptr_Function_int Function %32
+      %mid_1 = OpVariable %_ptr_Function_int Function %32
+       %to_1 = OpVariable %_ptr_Function_int Function %32
+      %param = OpVariable %_ptr_Function_int Function %32
+    %param_1 = OpVariable %_ptr_Function_int Function %32
+    %param_2 = OpVariable %_ptr_Function_int Function %32
+               OpStore %low %int_0
+               OpStore %high %int_9
+               OpStore %m %int_1
+               OpBranch %260
+        %260 = OpLabel
+               OpLoopMerge %261 %262 None
+               OpBranch %263
+        %263 = OpLabel
+        %264 = OpLoad %int %m
+        %265 = OpLoad %int %high
+        %266 = OpSLessThanEqual %bool %264 %265
+               OpSelectionMerge %267 None
+               OpBranchConditional %266 %268 %269
+        %268 = OpLabel
+               OpBranch %267
+        %269 = OpLabel
+               OpBranch %261
+        %267 = OpLabel
+        %270 = OpLoad %int %low
+               OpStore %i_2 %270
+               OpBranch %271
+        %271 = OpLabel
+               OpLoopMerge %272 %273 None
+               OpBranch %274
+        %274 = OpLabel
+        %275 = OpLoad %int %i_2
+        %276 = OpLoad %int %high
+        %277 = OpSLessThan %bool %275 %276
+               OpSelectionMerge %278 None
+               OpBranchConditional %277 %279 %280
+        %279 = OpLabel
+               OpBranch %278
+        %280 = OpLabel
+               OpBranch %272
+        %278 = OpLabel
+        %281 = OpLoad %int %i_2
+               OpStore %from_1 %281
+        %282 = OpLoad %int %i_2
+        %283 = OpLoad %int %m
+        %284 = OpIAdd %int %282 %283
+        %285 = OpISub %int %284 %int_1
+               OpStore %mid_1 %285
+        %286 = OpLoad %int %i_2
+        %287 = OpLoad %int %m
+        %288 = OpLoad %int %high
+        %292 = OpIMul %int %int_2 %287
+        %293 = OpIAdd %int %286 %292
+        %294 = OpISub %int %293 %int_1
+        %289 = OpExtInst %int %290 SMin %294 %288
+               OpStore %to_1 %289
+        %295 = OpLoad %int %from_1
+               OpStore %param %295
+        %296 = OpLoad %int %mid_1
+               OpStore %param_1 %296
+        %297 = OpLoad %int %to_1
+               OpStore %param_2 %297
+        %298 = OpFunctionCall %void %merge_i1_i1_i1_ %param %param_1 %param_2
+               OpBranch %273
+        %273 = OpLabel
+        %302 = OpLoad %int %m
+        %303 = OpLoad %int %i_2
+        %304 = OpIMul %int %int_2 %302
+        %305 = OpIAdd %int %303 %304
+               OpStore %i_2 %305
+               OpBranch %271
+        %272 = OpLabel
+               OpBranch %262
+        %262 = OpLabel
+        %306 = OpLoad %int %m
+        %307 = OpIMul %int %int_2 %306
+               OpStore %m %307
+               OpBranch %260
+        %261 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %246
+        %309 = OpLabel
+        %i_3 = OpVariable %_ptr_Function_int Function %32
+        %j_1 = OpVariable %_ptr_Function_int Function %32
+       %grey = OpVariable %_ptr_Function_float Function %314
+        %315 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_0
+        %316 = OpLoad %float %315
+        %317 = OpConvertFToS %int %316
+               OpStore %i_3 %317
+               OpBranch %318
+        %318 = OpLabel
+               OpLoopMerge %319 %320 None
+               OpBranch %321
+        %321 = OpLabel
+        %322 = OpLoad %int %i_3
+               OpSelectionMerge %323 None
+               OpSwitch %322 %324 9 %325 8 %326 7 %327 6 %328 5 %329 4 %330 3 %331 2 %332 1 %333 0 %334
+        %325 = OpLabel
+        %335 = OpLoad %int %i_3
+        %336 = OpAccessChain %_ptr_Private_int %data %335
+               OpStore %336 %int_n5
+               OpBranch %323
+        %326 = OpLabel
+        %338 = OpLoad %int %i_3
+        %339 = OpAccessChain %_ptr_Private_int %data %338
+               OpStore %339 %int_n4
+               OpBranch %323
+        %327 = OpLabel
+        %341 = OpLoad %int %i_3
+        %342 = OpAccessChain %_ptr_Private_int %data %341
+               OpStore %342 %int_n3
+               OpBranch %323
+        %328 = OpLabel
+        %344 = OpLoad %int %i_3
+        %345 = OpAccessChain %_ptr_Private_int %data %344
+               OpStore %345 %int_n2
+               OpBranch %323
+        %329 = OpLabel
+        %347 = OpLoad %int %i_3
+        %348 = OpAccessChain %_ptr_Private_int %data %347
+               OpStore %348 %int_n1
+               OpBranch %323
+        %330 = OpLabel
+        %350 = OpLoad %int %i_3
+        %351 = OpAccessChain %_ptr_Private_int %data %350
+               OpStore %351 %int_0
+               OpBranch %323
+        %331 = OpLabel
+        %352 = OpLoad %int %i_3
+        %353 = OpAccessChain %_ptr_Private_int %data %352
+               OpStore %353 %int_1
+               OpBranch %323
+        %332 = OpLabel
+        %354 = OpLoad %int %i_3
+        %355 = OpAccessChain %_ptr_Private_int %data %354
+               OpStore %355 %int_2
+               OpBranch %323
+        %333 = OpLabel
+        %356 = OpLoad %int %i_3
+        %357 = OpAccessChain %_ptr_Private_int %data %356
+               OpStore %357 %int_3
+               OpBranch %323
+        %334 = OpLabel
+        %359 = OpLoad %int %i_3
+        %360 = OpAccessChain %_ptr_Private_int %data %359
+               OpStore %360 %int_4
+               OpBranch %323
+        %324 = OpLabel
+               OpBranch %323
+        %323 = OpLabel
+        %362 = OpLoad %int %i_3
+        %363 = OpIAdd %int %362 %int_1
+               OpStore %i_3 %363
+               OpBranch %320
+        %320 = OpLabel
+        %364 = OpLoad %int %i_3
+        %365 = OpSLessThan %bool %364 %int_10
+               OpSelectionMerge %366 None
+               OpBranchConditional %365 %367 %368
+        %367 = OpLabel
+               OpBranch %366
+        %368 = OpLabel
+               OpBranch %319
+        %366 = OpLabel
+               OpBranch %318
+        %319 = OpLabel
+               OpStore %j_1 %int_0
+               OpBranch %369
+        %369 = OpLabel
+               OpLoopMerge %370 %371 None
+               OpBranch %372
+        %372 = OpLabel
+        %373 = OpLoad %int %j_1
+        %374 = OpSLessThan %bool %373 %int_10
+               OpSelectionMerge %375 None
+               OpBranchConditional %374 %376 %377
+        %376 = OpLabel
+               OpBranch %375
+        %377 = OpLabel
+               OpBranch %370
+        %375 = OpLabel
+        %378 = OpLoad %int %j_1
+        %379 = OpLoad %int %j_1
+        %380 = OpAccessChain %_ptr_Private_int %data %379
+        %381 = OpLoad %int %380
+        %382 = OpAccessChain %_ptr_Private_int %temp %378
+               OpStore %382 %381
+               OpBranch %371
+        %371 = OpLabel
+        %383 = OpLoad %int %j_1
+        %384 = OpIAdd %int %383 %int_1
+               OpStore %j_1 %384
+               OpBranch %369
+        %370 = OpLabel
+        %385 = OpFunctionCall %void %mergeSort_
+        %387 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %388 = OpLoad %float %387
+        %389 = OpConvertFToS %int %388
+        %391 = OpSLessThan %bool %389 %int_30
+               OpSelectionMerge %392 None
+               OpBranchConditional %391 %393 %394
+        %393 = OpLabel
+        %395 = OpAccessChain %_ptr_Private_int %data %int_0
+        %396 = OpLoad %int %395
+        %398 = OpConvertSToF %float %396
+        %400 = OpFDiv %float %398 %float_10
+        %401 = OpFAdd %float %float_0_5 %400
+               OpStore %grey %401
+               OpBranch %392
+        %394 = OpLabel
+        %402 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %403 = OpLoad %float %402
+        %404 = OpConvertFToS %int %403
+        %406 = OpSLessThan %bool %404 %int_60
+               OpSelectionMerge %407 None
+               OpBranchConditional %406 %408 %409
+        %408 = OpLabel
+        %410 = OpAccessChain %_ptr_Private_int %data %int_1
+        %411 = OpLoad %int %410
+        %412 = OpConvertSToF %float %411
+        %413 = OpFDiv %float %412 %float_10
+        %414 = OpFAdd %float %float_0_5 %413
+               OpStore %grey %414
+               OpBranch %407
+        %409 = OpLabel
+        %415 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %416 = OpLoad %float %415
+        %417 = OpConvertFToS %int %416
+        %419 = OpSLessThan %bool %417 %int_90
+               OpSelectionMerge %420 None
+               OpBranchConditional %419 %421 %422
+        %421 = OpLabel
+        %423 = OpAccessChain %_ptr_Private_int %data %int_2
+        %424 = OpLoad %int %423
+        %425 = OpConvertSToF %float %424
+        %426 = OpFDiv %float %425 %float_10
+        %427 = OpFAdd %float %float_0_5 %426
+               OpStore %grey %427
+               OpBranch %420
+        %422 = OpLabel
+        %428 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %429 = OpLoad %float %428
+        %430 = OpConvertFToS %int %429
+        %432 = OpSLessThan %bool %430 %int_120
+               OpSelectionMerge %433 None
+               OpBranchConditional %432 %434 %435
+        %434 = OpLabel
+        %436 = OpAccessChain %_ptr_Private_int %data %int_3
+        %437 = OpLoad %int %436
+        %438 = OpConvertSToF %float %437
+        %439 = OpFDiv %float %438 %float_10
+        %440 = OpFAdd %float %float_0_5 %439
+               OpStore %grey %440
+               OpBranch %433
+        %435 = OpLabel
+        %441 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %442 = OpLoad %float %441
+        %443 = OpConvertFToS %int %442
+        %445 = OpSLessThan %bool %443 %int_150
+               OpSelectionMerge %446 None
+               OpBranchConditional %445 %447 %448
+        %447 = OpLabel
+               OpKill
+        %448 = OpLabel
+        %449 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %450 = OpLoad %float %449
+        %451 = OpConvertFToS %int %450
+        %453 = OpSLessThan %bool %451 %int_180
+               OpSelectionMerge %454 None
+               OpBranchConditional %453 %455 %456
+        %455 = OpLabel
+        %458 = OpAccessChain %_ptr_Private_int %data %int_5
+        %459 = OpLoad %int %458
+        %460 = OpConvertSToF %float %459
+        %461 = OpFDiv %float %460 %float_10
+        %462 = OpFAdd %float %float_0_5 %461
+               OpStore %grey %462
+               OpBranch %454
+        %456 = OpLabel
+        %463 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %464 = OpLoad %float %463
+        %465 = OpConvertFToS %int %464
+        %467 = OpSLessThan %bool %465 %int_210
+               OpSelectionMerge %468 None
+               OpBranchConditional %467 %469 %470
+        %469 = OpLabel
+        %472 = OpAccessChain %_ptr_Private_int %data %int_6
+        %473 = OpLoad %int %472
+        %474 = OpConvertSToF %float %473
+        %475 = OpFDiv %float %474 %float_10
+        %476 = OpFAdd %float %float_0_5 %475
+               OpStore %grey %476
+               OpBranch %468
+        %470 = OpLabel
+        %477 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %478 = OpLoad %float %477
+        %479 = OpConvertFToS %int %478
+        %481 = OpSLessThan %bool %479 %int_240
+               OpSelectionMerge %482 None
+               OpBranchConditional %481 %483 %484
+        %483 = OpLabel
+        %486 = OpAccessChain %_ptr_Private_int %data %int_7
+        %487 = OpLoad %int %486
+        %488 = OpConvertSToF %float %487
+        %489 = OpFDiv %float %488 %float_10
+        %490 = OpFAdd %float %float_0_5 %489
+               OpStore %grey %490
+               OpBranch %482
+        %484 = OpLabel
+        %491 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %492 = OpLoad %float %491
+        %493 = OpConvertFToS %int %492
+        %495 = OpSLessThan %bool %493 %int_270
+               OpSelectionMerge %496 None
+               OpBranchConditional %495 %497 %498
+        %497 = OpLabel
+        %500 = OpAccessChain %_ptr_Private_int %data %int_8
+        %501 = OpLoad %int %500
+        %502 = OpConvertSToF %float %501
+        %503 = OpFDiv %float %502 %float_10
+        %504 = OpFAdd %float %float_0_5 %503
+               OpStore %grey %504
+               OpBranch %496
+        %498 = OpLabel
+               OpKill
+        %496 = OpLabel
+               OpBranch %482
+        %482 = OpLabel
+               OpBranch %468
+        %468 = OpLabel
+               OpBranch %454
+        %454 = OpLabel
+               OpBranch %446
+        %446 = OpLabel
+               OpBranch %433
+        %433 = OpLabel
+               OpBranch %420
+        %420 = OpLabel
+               OpBranch %407
+        %407 = OpLabel
+               OpBranch %392
+        %392 = OpLabel
+        %505 = OpLoad %float %grey
+        %507 = OpCompositeConstruct %v3float %505 %505 %505
+        %508 = OpCompositeExtract %float %507 0
+        %509 = OpCompositeExtract %float %507 1
+        %510 = OpCompositeExtract %float %507 2
+        %511 = OpCompositeConstruct %v4float %508 %509 %510 %float_1
+               OpStore %x_GLF_color %511
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %512
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %516 = OpLabel
+        %517 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %517
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %246
+        %519 = OpLabel
+        %520 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %520
+        %521 = OpFunctionCall %void %main_1
+        %523 = OpLoad %v4float %x_GLF_color
+        %524 = OpCompositeConstruct %main_out %523
+        %522 = OpFunctionCall %void %tint_symbol_3 %524
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 320[%320] is not post dominated by the back-edge block 366[%366]
+  %366 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..5fac853
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/1.spvasm.expected.wgsl
@@ -0,0 +1,414 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> data : array<i32, 10>;
+
+var<private> temp : array<i32, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn merge_i1_i1_i1_(from : ptr<function, i32>, mid : ptr<function, i32>, to : ptr<function, i32>) {
+  var k : i32;
+  var i : i32;
+  var j : i32;
+  var i_1 : i32;
+  let x_255 : i32 = *(from);
+  k = x_255;
+  let x_256 : i32 = *(from);
+  i = x_256;
+  let x_257 : i32 = *(mid);
+  j = (x_257 + 1);
+  loop {
+    var x_285 : i32;
+    var x_286 : i32;
+    var x_305 : i32;
+    var x_306 : i32;
+    var x_320 : i32;
+    var x_324 : i32;
+    var x_339 : i32;
+    var x_338 : i32;
+    var x_352 : i32;
+    var x_351 : i32;
+    var x_366 : i32;
+    var x_365 : i32;
+    var x_287_phi : i32;
+    var x_307_phi : i32;
+    var x_328_phi : i32;
+    var x_340_phi : i32;
+    var x_353_phi : i32;
+    var x_367_phi : i32;
+    let x_261 : f32 = x_28.injectionSwitch.x;
+    if ((1.0 >= x_261)) {
+    } else {
+      continue;
+    }
+    let x_266 : i32 = i;
+    let x_267 : i32 = *(mid);
+    let x_269 : i32 = j;
+    let x_270 : i32 = *(to);
+    if (((x_266 <= x_267) && (x_269 <= x_270))) {
+    } else {
+      break;
+    }
+    let x_274 : i32 = i;
+    let x_276 : i32 = data[x_274];
+    let x_277 : i32 = j;
+    let x_279 : i32 = data[x_277];
+    let x_280 : bool = (x_276 < x_279);
+    if (x_280) {
+      x_285 = k;
+      x_287_phi = x_285;
+    } else {
+      x_286 = 0;
+      x_287_phi = x_286;
+    }
+    let x_287 : i32 = x_287_phi;
+    let x_288 : i32 = (x_287 + 1);
+    if (x_280) {
+      k = x_288;
+      let x_293 : f32 = x_28.injectionSwitch.x;
+      if (!((1.0 <= x_293))) {
+      } else {
+        continue;
+      }
+    }
+    let x_297 : f32 = x_28.injectionSwitch.y;
+    if ((x_297 >= 0.0)) {
+    } else {
+      continue;
+    }
+    let x_300 : i32 = 0;
+    if (x_280) {
+      x_305 = i;
+      x_307_phi = x_305;
+    } else {
+      x_306 = 0;
+      x_307_phi = x_306;
+    }
+    let x_307 : i32 = x_307_phi;
+    let x_309 : i32 = select(x_300, x_307, x_280);
+    if (x_280) {
+      i = (x_309 + 1);
+    }
+    let x_315 : i32 = 0;
+    if (x_280) {
+      x_320 = data[x_309];
+      let x_322 : f32 = x_28.injectionSwitch.y;
+      x_328_phi = x_320;
+      if (!((0.0 <= x_322))) {
+        continue;
+      }
+    } else {
+      x_324 = 0;
+      let x_326 : f32 = x_28.injectionSwitch.y;
+      x_328_phi = x_324;
+      if (!((x_326 < 0.0))) {
+      } else {
+        continue;
+      }
+    }
+    let x_328 : i32 = x_328_phi;
+    if (x_280) {
+      temp[x_287] = select(x_315, x_328, x_280);
+    }
+    if (x_280) {
+      x_339 = 0;
+      x_340_phi = x_339;
+    } else {
+      x_338 = k;
+      x_340_phi = x_338;
+    }
+    let x_340 : i32 = x_340_phi;
+    if (x_280) {
+    } else {
+      k = (x_340 + 1);
+    }
+    let x_345 : f32 = x_28.injectionSwitch.x;
+    if (!((1.0 <= x_345))) {
+    } else {
+      continue;
+    }
+    if (x_280) {
+      x_352 = 0;
+      x_353_phi = x_352;
+    } else {
+      x_351 = j;
+      x_353_phi = x_351;
+    }
+    let x_353 : i32 = x_353_phi;
+    let x_355 : i32 = 0;
+    let x_357 : i32 = select(x_353, x_355, x_280);
+    if (x_280) {
+    } else {
+      j = (x_357 + 1);
+    }
+    if (x_280) {
+      x_366 = 0;
+      x_367_phi = x_366;
+    } else {
+      x_365 = data[x_357];
+      x_367_phi = x_365;
+    }
+    let x_367 : i32 = x_367_phi;
+    if (x_280) {
+    } else {
+      temp[x_340] = x_367;
+    }
+  }
+  loop {
+    let x_376 : i32 = i;
+    let x_378 : i32 = i;
+    let x_379 : i32 = *(mid);
+    if (((x_376 < 10) && (x_378 <= x_379))) {
+    } else {
+      break;
+    }
+    let x_383 : i32 = k;
+    k = (x_383 + 1);
+    let x_385 : i32 = i;
+    i = (x_385 + 1);
+    let x_388 : i32 = data[x_385];
+    temp[x_383] = x_388;
+  }
+  let x_390 : i32 = *(from);
+  i_1 = x_390;
+  loop {
+    let x_395 : i32 = i_1;
+    let x_396 : i32 = *(to);
+    if ((x_395 <= x_396)) {
+    } else {
+      break;
+    }
+    let x_399 : i32 = i_1;
+    let x_400 : i32 = i_1;
+    let x_402 : i32 = temp[x_400];
+    data[x_399] = x_402;
+
+    continuing {
+      let x_404 : i32 = i_1;
+      i_1 = (x_404 + 1);
+    }
+  }
+  return;
+}
+
+fn mergeSort_() {
+  var low : i32;
+  var high : i32;
+  var m : i32;
+  var i_2 : i32;
+  var from_1 : i32;
+  var mid_1 : i32;
+  var to_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  low = 0;
+  high = 9;
+  m = 1;
+  loop {
+    let x_411 : i32 = m;
+    let x_412 : i32 = high;
+    if ((x_411 <= x_412)) {
+    } else {
+      break;
+    }
+    let x_415 : i32 = low;
+    i_2 = x_415;
+    loop {
+      let x_420 : i32 = i_2;
+      let x_421 : i32 = high;
+      if ((x_420 < x_421)) {
+      } else {
+        break;
+      }
+      let x_424 : i32 = i_2;
+      from_1 = x_424;
+      let x_425 : i32 = i_2;
+      let x_426 : i32 = m;
+      mid_1 = ((x_425 + x_426) - 1);
+      let x_429 : i32 = i_2;
+      let x_430 : i32 = m;
+      let x_434 : i32 = high;
+      to_1 = min(((x_429 + (2 * x_430)) - 1), x_434);
+      let x_436 : i32 = from_1;
+      param = x_436;
+      let x_437 : i32 = mid_1;
+      param_1 = x_437;
+      let x_438 : i32 = to_1;
+      param_2 = x_438;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2));
+
+      continuing {
+        let x_440 : i32 = m;
+        let x_442 : i32 = i_2;
+        i_2 = (x_442 + (2 * x_440));
+      }
+    }
+
+    continuing {
+      let x_444 : i32 = m;
+      m = (2 * x_444);
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_3 : i32;
+  var j_1 : i32;
+  var grey : f32;
+  let x_88 : f32 = x_28.injectionSwitch.x;
+  i_3 = i32(x_88);
+  loop {
+    let x_94 : i32 = i_3;
+    switch(x_94) {
+      case 9: {
+        let x_124 : i32 = i_3;
+        data[x_124] = -5;
+      }
+      case 8: {
+        let x_122 : i32 = i_3;
+        data[x_122] = -4;
+      }
+      case 7: {
+        let x_120 : i32 = i_3;
+        data[x_120] = -3;
+      }
+      case 6: {
+        let x_118 : i32 = i_3;
+        data[x_118] = -2;
+      }
+      case 5: {
+        let x_116 : i32 = i_3;
+        data[x_116] = -1;
+      }
+      case 4: {
+        let x_114 : i32 = i_3;
+        data[x_114] = 0;
+      }
+      case 3: {
+        let x_112 : i32 = i_3;
+        data[x_112] = 1;
+      }
+      case 2: {
+        let x_110 : i32 = i_3;
+        data[x_110] = 2;
+      }
+      case 1: {
+        let x_108 : i32 = i_3;
+        data[x_108] = 3;
+      }
+      case 0: {
+        let x_106 : i32 = i_3;
+        data[x_106] = 4;
+      }
+      default: {
+      }
+    }
+    let x_126 : i32 = i_3;
+    i_3 = (x_126 + 1);
+
+    continuing {
+      let x_128 : i32 = i_3;
+      if ((x_128 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  loop {
+    let x_134 : i32 = j_1;
+    if ((x_134 < 10)) {
+    } else {
+      break;
+    }
+    let x_137 : i32 = j_1;
+    let x_138 : i32 = j_1;
+    let x_140 : i32 = data[x_138];
+    temp[x_137] = x_140;
+
+    continuing {
+      let x_142 : i32 = j_1;
+      j_1 = (x_142 + 1);
+    }
+  }
+  mergeSort_();
+  let x_146 : f32 = gl_FragCoord.y;
+  if ((i32(x_146) < 30)) {
+    let x_153 : i32 = data[0];
+    grey = (0.5 + (f32(x_153) / 10.0));
+  } else {
+    let x_158 : f32 = gl_FragCoord.y;
+    if ((i32(x_158) < 60)) {
+      let x_165 : i32 = data[1];
+      grey = (0.5 + (f32(x_165) / 10.0));
+    } else {
+      let x_170 : f32 = gl_FragCoord.y;
+      if ((i32(x_170) < 90)) {
+        let x_177 : i32 = data[2];
+        grey = (0.5 + (f32(x_177) / 10.0));
+      } else {
+        let x_182 : f32 = gl_FragCoord.y;
+        if ((i32(x_182) < 120)) {
+          let x_189 : i32 = data[3];
+          grey = (0.5 + (f32(x_189) / 10.0));
+        } else {
+          let x_194 : f32 = gl_FragCoord.y;
+          if ((i32(x_194) < 150)) {
+            discard;
+          } else {
+            let x_201 : f32 = gl_FragCoord.y;
+            if ((i32(x_201) < 180)) {
+              let x_208 : i32 = data[5];
+              grey = (0.5 + (f32(x_208) / 10.0));
+            } else {
+              let x_213 : f32 = gl_FragCoord.y;
+              if ((i32(x_213) < 210)) {
+                let x_220 : i32 = data[6];
+                grey = (0.5 + (f32(x_220) / 10.0));
+              } else {
+                let x_225 : f32 = gl_FragCoord.y;
+                if ((i32(x_225) < 240)) {
+                  let x_232 : i32 = data[7];
+                  grey = (0.5 + (f32(x_232) / 10.0));
+                } else {
+                  let x_237 : f32 = gl_FragCoord.y;
+                  if ((i32(x_237) < 270)) {
+                    let x_244 : i32 = data[8];
+                    grey = (0.5 + (f32(x_244) / 10.0));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  let x_248 : f32 = grey;
+  let x_249 : vec3<f32> = vec3<f32>(x_248, x_248, x_248);
+  x_GLF_color = vec4<f32>(x_249.x, x_249.y, x_249.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/1.wgsl
new file mode 100644
index 0000000..5fac853
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/1.wgsl
@@ -0,0 +1,414 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> data : array<i32, 10>;
+
+var<private> temp : array<i32, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn merge_i1_i1_i1_(from : ptr<function, i32>, mid : ptr<function, i32>, to : ptr<function, i32>) {
+  var k : i32;
+  var i : i32;
+  var j : i32;
+  var i_1 : i32;
+  let x_255 : i32 = *(from);
+  k = x_255;
+  let x_256 : i32 = *(from);
+  i = x_256;
+  let x_257 : i32 = *(mid);
+  j = (x_257 + 1);
+  loop {
+    var x_285 : i32;
+    var x_286 : i32;
+    var x_305 : i32;
+    var x_306 : i32;
+    var x_320 : i32;
+    var x_324 : i32;
+    var x_339 : i32;
+    var x_338 : i32;
+    var x_352 : i32;
+    var x_351 : i32;
+    var x_366 : i32;
+    var x_365 : i32;
+    var x_287_phi : i32;
+    var x_307_phi : i32;
+    var x_328_phi : i32;
+    var x_340_phi : i32;
+    var x_353_phi : i32;
+    var x_367_phi : i32;
+    let x_261 : f32 = x_28.injectionSwitch.x;
+    if ((1.0 >= x_261)) {
+    } else {
+      continue;
+    }
+    let x_266 : i32 = i;
+    let x_267 : i32 = *(mid);
+    let x_269 : i32 = j;
+    let x_270 : i32 = *(to);
+    if (((x_266 <= x_267) && (x_269 <= x_270))) {
+    } else {
+      break;
+    }
+    let x_274 : i32 = i;
+    let x_276 : i32 = data[x_274];
+    let x_277 : i32 = j;
+    let x_279 : i32 = data[x_277];
+    let x_280 : bool = (x_276 < x_279);
+    if (x_280) {
+      x_285 = k;
+      x_287_phi = x_285;
+    } else {
+      x_286 = 0;
+      x_287_phi = x_286;
+    }
+    let x_287 : i32 = x_287_phi;
+    let x_288 : i32 = (x_287 + 1);
+    if (x_280) {
+      k = x_288;
+      let x_293 : f32 = x_28.injectionSwitch.x;
+      if (!((1.0 <= x_293))) {
+      } else {
+        continue;
+      }
+    }
+    let x_297 : f32 = x_28.injectionSwitch.y;
+    if ((x_297 >= 0.0)) {
+    } else {
+      continue;
+    }
+    let x_300 : i32 = 0;
+    if (x_280) {
+      x_305 = i;
+      x_307_phi = x_305;
+    } else {
+      x_306 = 0;
+      x_307_phi = x_306;
+    }
+    let x_307 : i32 = x_307_phi;
+    let x_309 : i32 = select(x_300, x_307, x_280);
+    if (x_280) {
+      i = (x_309 + 1);
+    }
+    let x_315 : i32 = 0;
+    if (x_280) {
+      x_320 = data[x_309];
+      let x_322 : f32 = x_28.injectionSwitch.y;
+      x_328_phi = x_320;
+      if (!((0.0 <= x_322))) {
+        continue;
+      }
+    } else {
+      x_324 = 0;
+      let x_326 : f32 = x_28.injectionSwitch.y;
+      x_328_phi = x_324;
+      if (!((x_326 < 0.0))) {
+      } else {
+        continue;
+      }
+    }
+    let x_328 : i32 = x_328_phi;
+    if (x_280) {
+      temp[x_287] = select(x_315, x_328, x_280);
+    }
+    if (x_280) {
+      x_339 = 0;
+      x_340_phi = x_339;
+    } else {
+      x_338 = k;
+      x_340_phi = x_338;
+    }
+    let x_340 : i32 = x_340_phi;
+    if (x_280) {
+    } else {
+      k = (x_340 + 1);
+    }
+    let x_345 : f32 = x_28.injectionSwitch.x;
+    if (!((1.0 <= x_345))) {
+    } else {
+      continue;
+    }
+    if (x_280) {
+      x_352 = 0;
+      x_353_phi = x_352;
+    } else {
+      x_351 = j;
+      x_353_phi = x_351;
+    }
+    let x_353 : i32 = x_353_phi;
+    let x_355 : i32 = 0;
+    let x_357 : i32 = select(x_353, x_355, x_280);
+    if (x_280) {
+    } else {
+      j = (x_357 + 1);
+    }
+    if (x_280) {
+      x_366 = 0;
+      x_367_phi = x_366;
+    } else {
+      x_365 = data[x_357];
+      x_367_phi = x_365;
+    }
+    let x_367 : i32 = x_367_phi;
+    if (x_280) {
+    } else {
+      temp[x_340] = x_367;
+    }
+  }
+  loop {
+    let x_376 : i32 = i;
+    let x_378 : i32 = i;
+    let x_379 : i32 = *(mid);
+    if (((x_376 < 10) && (x_378 <= x_379))) {
+    } else {
+      break;
+    }
+    let x_383 : i32 = k;
+    k = (x_383 + 1);
+    let x_385 : i32 = i;
+    i = (x_385 + 1);
+    let x_388 : i32 = data[x_385];
+    temp[x_383] = x_388;
+  }
+  let x_390 : i32 = *(from);
+  i_1 = x_390;
+  loop {
+    let x_395 : i32 = i_1;
+    let x_396 : i32 = *(to);
+    if ((x_395 <= x_396)) {
+    } else {
+      break;
+    }
+    let x_399 : i32 = i_1;
+    let x_400 : i32 = i_1;
+    let x_402 : i32 = temp[x_400];
+    data[x_399] = x_402;
+
+    continuing {
+      let x_404 : i32 = i_1;
+      i_1 = (x_404 + 1);
+    }
+  }
+  return;
+}
+
+fn mergeSort_() {
+  var low : i32;
+  var high : i32;
+  var m : i32;
+  var i_2 : i32;
+  var from_1 : i32;
+  var mid_1 : i32;
+  var to_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  low = 0;
+  high = 9;
+  m = 1;
+  loop {
+    let x_411 : i32 = m;
+    let x_412 : i32 = high;
+    if ((x_411 <= x_412)) {
+    } else {
+      break;
+    }
+    let x_415 : i32 = low;
+    i_2 = x_415;
+    loop {
+      let x_420 : i32 = i_2;
+      let x_421 : i32 = high;
+      if ((x_420 < x_421)) {
+      } else {
+        break;
+      }
+      let x_424 : i32 = i_2;
+      from_1 = x_424;
+      let x_425 : i32 = i_2;
+      let x_426 : i32 = m;
+      mid_1 = ((x_425 + x_426) - 1);
+      let x_429 : i32 = i_2;
+      let x_430 : i32 = m;
+      let x_434 : i32 = high;
+      to_1 = min(((x_429 + (2 * x_430)) - 1), x_434);
+      let x_436 : i32 = from_1;
+      param = x_436;
+      let x_437 : i32 = mid_1;
+      param_1 = x_437;
+      let x_438 : i32 = to_1;
+      param_2 = x_438;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2));
+
+      continuing {
+        let x_440 : i32 = m;
+        let x_442 : i32 = i_2;
+        i_2 = (x_442 + (2 * x_440));
+      }
+    }
+
+    continuing {
+      let x_444 : i32 = m;
+      m = (2 * x_444);
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_3 : i32;
+  var j_1 : i32;
+  var grey : f32;
+  let x_88 : f32 = x_28.injectionSwitch.x;
+  i_3 = i32(x_88);
+  loop {
+    let x_94 : i32 = i_3;
+    switch(x_94) {
+      case 9: {
+        let x_124 : i32 = i_3;
+        data[x_124] = -5;
+      }
+      case 8: {
+        let x_122 : i32 = i_3;
+        data[x_122] = -4;
+      }
+      case 7: {
+        let x_120 : i32 = i_3;
+        data[x_120] = -3;
+      }
+      case 6: {
+        let x_118 : i32 = i_3;
+        data[x_118] = -2;
+      }
+      case 5: {
+        let x_116 : i32 = i_3;
+        data[x_116] = -1;
+      }
+      case 4: {
+        let x_114 : i32 = i_3;
+        data[x_114] = 0;
+      }
+      case 3: {
+        let x_112 : i32 = i_3;
+        data[x_112] = 1;
+      }
+      case 2: {
+        let x_110 : i32 = i_3;
+        data[x_110] = 2;
+      }
+      case 1: {
+        let x_108 : i32 = i_3;
+        data[x_108] = 3;
+      }
+      case 0: {
+        let x_106 : i32 = i_3;
+        data[x_106] = 4;
+      }
+      default: {
+      }
+    }
+    let x_126 : i32 = i_3;
+    i_3 = (x_126 + 1);
+
+    continuing {
+      let x_128 : i32 = i_3;
+      if ((x_128 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  loop {
+    let x_134 : i32 = j_1;
+    if ((x_134 < 10)) {
+    } else {
+      break;
+    }
+    let x_137 : i32 = j_1;
+    let x_138 : i32 = j_1;
+    let x_140 : i32 = data[x_138];
+    temp[x_137] = x_140;
+
+    continuing {
+      let x_142 : i32 = j_1;
+      j_1 = (x_142 + 1);
+    }
+  }
+  mergeSort_();
+  let x_146 : f32 = gl_FragCoord.y;
+  if ((i32(x_146) < 30)) {
+    let x_153 : i32 = data[0];
+    grey = (0.5 + (f32(x_153) / 10.0));
+  } else {
+    let x_158 : f32 = gl_FragCoord.y;
+    if ((i32(x_158) < 60)) {
+      let x_165 : i32 = data[1];
+      grey = (0.5 + (f32(x_165) / 10.0));
+    } else {
+      let x_170 : f32 = gl_FragCoord.y;
+      if ((i32(x_170) < 90)) {
+        let x_177 : i32 = data[2];
+        grey = (0.5 + (f32(x_177) / 10.0));
+      } else {
+        let x_182 : f32 = gl_FragCoord.y;
+        if ((i32(x_182) < 120)) {
+          let x_189 : i32 = data[3];
+          grey = (0.5 + (f32(x_189) / 10.0));
+        } else {
+          let x_194 : f32 = gl_FragCoord.y;
+          if ((i32(x_194) < 150)) {
+            discard;
+          } else {
+            let x_201 : f32 = gl_FragCoord.y;
+            if ((i32(x_201) < 180)) {
+              let x_208 : i32 = data[5];
+              grey = (0.5 + (f32(x_208) / 10.0));
+            } else {
+              let x_213 : f32 = gl_FragCoord.y;
+              if ((i32(x_213) < 210)) {
+                let x_220 : i32 = data[6];
+                grey = (0.5 + (f32(x_220) / 10.0));
+              } else {
+                let x_225 : f32 = gl_FragCoord.y;
+                if ((i32(x_225) < 240)) {
+                  let x_232 : i32 = data[7];
+                  grey = (0.5 + (f32(x_232) / 10.0));
+                } else {
+                  let x_237 : f32 = gl_FragCoord.y;
+                  if ((i32(x_237) < 270)) {
+                    let x_244 : i32 = data[8];
+                    grey = (0.5 + (f32(x_244) / 10.0));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  let x_248 : f32 = grey;
+  let x_249 : vec3<f32> = vec3<f32>(x_248, x_248, x_248);
+  x_GLF_color = vec4<f32>(x_249.x, x_249.y, x_249.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..5cccfe9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/1.wgsl.expected.hlsl
@@ -0,0 +1,373 @@
+static int data[10] = (int[10])0;
+static int temp[10] = (int[10])0;
+cbuffer cbuffer_x_28 : register(b0, space0) {
+  uint4 x_28[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void merge_i1_i1_i1_(inout int from, inout int mid, inout int to) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  const int x_255 = from;
+  k = x_255;
+  const int x_256 = from;
+  i = x_256;
+  const int x_257 = mid;
+  j = (x_257 + 1);
+  while (true) {
+    int x_285 = 0;
+    int x_286 = 0;
+    int x_305 = 0;
+    int x_306 = 0;
+    int x_320 = 0;
+    int x_324 = 0;
+    int x_339 = 0;
+    int x_338 = 0;
+    int x_352 = 0;
+    int x_351 = 0;
+    int x_366 = 0;
+    int x_365 = 0;
+    int x_287_phi = 0;
+    int x_307_phi = 0;
+    int x_328_phi = 0;
+    int x_340_phi = 0;
+    int x_353_phi = 0;
+    int x_367_phi = 0;
+    const float x_261 = asfloat(x_28[0].x);
+    if ((1.0f >= x_261)) {
+    } else {
+      continue;
+    }
+    const int x_266 = i;
+    const int x_267 = mid;
+    const int x_269 = j;
+    const int x_270 = to;
+    bool tint_tmp = (x_266 <= x_267);
+    if (tint_tmp) {
+      tint_tmp = (x_269 <= x_270);
+    }
+    if ((tint_tmp)) {
+    } else {
+      break;
+    }
+    const int x_276 = data[i];
+    const int x_279 = data[j];
+    const bool x_280 = (x_276 < x_279);
+    if (x_280) {
+      x_285 = k;
+      x_287_phi = x_285;
+    } else {
+      x_286 = 0;
+      x_287_phi = x_286;
+    }
+    const int x_287 = x_287_phi;
+    const int x_288 = (x_287 + 1);
+    if (x_280) {
+      k = x_288;
+      const float x_293 = asfloat(x_28[0].x);
+      if (!((1.0f <= x_293))) {
+      } else {
+        continue;
+      }
+    }
+    const float x_297 = asfloat(x_28[0].y);
+    if ((x_297 >= 0.0f)) {
+    } else {
+      continue;
+    }
+    const int x_300 = 0;
+    if (x_280) {
+      x_305 = i;
+      x_307_phi = x_305;
+    } else {
+      x_306 = 0;
+      x_307_phi = x_306;
+    }
+    const int x_309 = (x_280 ? x_307_phi : x_300);
+    if (x_280) {
+      i = (x_309 + 1);
+    }
+    const int x_315 = 0;
+    if (x_280) {
+      x_320 = data[x_309];
+      const float x_322 = asfloat(x_28[0].y);
+      x_328_phi = x_320;
+      if (!((0.0f <= x_322))) {
+        continue;
+      }
+    } else {
+      x_324 = 0;
+      const float x_326 = asfloat(x_28[0].y);
+      x_328_phi = x_324;
+      if (!((x_326 < 0.0f))) {
+      } else {
+        continue;
+      }
+    }
+    const int x_328 = x_328_phi;
+    if (x_280) {
+      temp[x_287] = (x_280 ? x_328 : x_315);
+    }
+    if (x_280) {
+      x_339 = 0;
+      x_340_phi = x_339;
+    } else {
+      x_338 = k;
+      x_340_phi = x_338;
+    }
+    const int x_340 = x_340_phi;
+    if (x_280) {
+    } else {
+      k = (x_340 + 1);
+    }
+    const float x_345 = asfloat(x_28[0].x);
+    if (!((1.0f <= x_345))) {
+    } else {
+      continue;
+    }
+    if (x_280) {
+      x_352 = 0;
+      x_353_phi = x_352;
+    } else {
+      x_351 = j;
+      x_353_phi = x_351;
+    }
+    const int x_357 = (x_280 ? 0 : x_353_phi);
+    if (x_280) {
+    } else {
+      j = (x_357 + 1);
+    }
+    if (x_280) {
+      x_366 = 0;
+      x_367_phi = x_366;
+    } else {
+      x_365 = data[x_357];
+      x_367_phi = x_365;
+    }
+    const int x_367 = x_367_phi;
+    if (x_280) {
+    } else {
+      temp[x_340] = x_367;
+    }
+  }
+  while (true) {
+    const int x_376 = i;
+    const int x_378 = i;
+    const int x_379 = mid;
+    bool tint_tmp_1 = (x_376 < 10);
+    if (tint_tmp_1) {
+      tint_tmp_1 = (x_378 <= x_379);
+    }
+    if ((tint_tmp_1)) {
+    } else {
+      break;
+    }
+    const int x_383 = k;
+    k = (x_383 + 1);
+    const int x_385 = i;
+    i = (x_385 + 1);
+    const int x_388 = data[x_385];
+    temp[x_383] = x_388;
+  }
+  const int x_390 = from;
+  i_1 = x_390;
+  while (true) {
+    const int x_395 = i_1;
+    const int x_396 = to;
+    if ((x_395 <= x_396)) {
+    } else {
+      break;
+    }
+    const int x_399 = i_1;
+    const int x_402 = temp[i_1];
+    data[x_399] = x_402;
+    {
+      i_1 = (i_1 + 1);
+    }
+  }
+  return;
+}
+
+void mergeSort_() {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  {
+    for(; (m <= high); m = (2 * m)) {
+      i_2 = low;
+      {
+        for(; (i_2 < high); i_2 = (i_2 + (2 * m))) {
+          from_1 = i_2;
+          mid_1 = ((i_2 + m) - 1);
+          to_1 = min(((i_2 + (2 * m)) - 1), high);
+          param = from_1;
+          param_1 = mid_1;
+          param_2 = to_1;
+          merge_i1_i1_i1_(param, param_1, param_2);
+        }
+      }
+    }
+  }
+  return;
+}
+
+void main_1() {
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  const float x_88 = asfloat(x_28[0].x);
+  i_3 = int(x_88);
+  while (true) {
+    switch(i_3) {
+      case 9: {
+        data[i_3] = -5;
+        break;
+      }
+      case 8: {
+        data[i_3] = -4;
+        break;
+      }
+      case 7: {
+        data[i_3] = -3;
+        break;
+      }
+      case 6: {
+        data[i_3] = -2;
+        break;
+      }
+      case 5: {
+        data[i_3] = -1;
+        break;
+      }
+      case 4: {
+        data[i_3] = 0;
+        break;
+      }
+      case 3: {
+        data[i_3] = 1;
+        break;
+      }
+      case 2: {
+        data[i_3] = 2;
+        break;
+      }
+      case 1: {
+        data[i_3] = 3;
+        break;
+      }
+      case 0: {
+        data[i_3] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    i_3 = (i_3 + 1);
+    {
+      if ((i_3 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  {
+    for(; (j_1 < 10); j_1 = (j_1 + 1)) {
+      const int x_137 = j_1;
+      const int x_140 = data[j_1];
+      temp[x_137] = x_140;
+    }
+  }
+  mergeSort_();
+  const float x_146 = gl_FragCoord.y;
+  if ((int(x_146) < 30)) {
+    const int x_153 = data[0];
+    grey = (0.5f + (float(x_153) / 10.0f));
+  } else {
+    const float x_158 = gl_FragCoord.y;
+    if ((int(x_158) < 60)) {
+      const int x_165 = data[1];
+      grey = (0.5f + (float(x_165) / 10.0f));
+    } else {
+      const float x_170 = gl_FragCoord.y;
+      if ((int(x_170) < 90)) {
+        const int x_177 = data[2];
+        grey = (0.5f + (float(x_177) / 10.0f));
+      } else {
+        const float x_182 = gl_FragCoord.y;
+        if ((int(x_182) < 120)) {
+          const int x_189 = data[3];
+          grey = (0.5f + (float(x_189) / 10.0f));
+        } else {
+          const float x_194 = gl_FragCoord.y;
+          if ((int(x_194) < 150)) {
+            discard;
+          } else {
+            const float x_201 = gl_FragCoord.y;
+            if ((int(x_201) < 180)) {
+              const int x_208 = data[5];
+              grey = (0.5f + (float(x_208) / 10.0f));
+            } else {
+              const float x_213 = gl_FragCoord.y;
+              if ((int(x_213) < 210)) {
+                const int x_220 = data[6];
+                grey = (0.5f + (float(x_220) / 10.0f));
+              } else {
+                const float x_225 = gl_FragCoord.y;
+                if ((int(x_225) < 240)) {
+                  const int x_232 = data[7];
+                  grey = (0.5f + (float(x_232) / 10.0f));
+                } else {
+                  const float x_237 = gl_FragCoord.y;
+                  if ((int(x_237) < 270)) {
+                    const int x_244 = data[8];
+                    grey = (0.5f + (float(x_244) / 10.0f));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  const float x_248 = grey;
+  const float3 x_249 = float3(x_248, x_248, x_248);
+  x_GLF_color = float4(x_249.x, x_249.y, x_249.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/1.wgsl.expected.msl
new file mode 100644
index 0000000..a023050
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/1.wgsl.expected.msl
@@ -0,0 +1,422 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void merge_i1_i1_i1_(constant buf0& x_28, thread int* const from, thread int* const mid, thread int* const to, thread tint_array_wrapper* const tint_symbol_5, thread tint_array_wrapper* const tint_symbol_6) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  int const x_255 = *(from);
+  k = x_255;
+  int const x_256 = *(from);
+  i = x_256;
+  int const x_257 = *(mid);
+  j = (x_257 + 1);
+  while (true) {
+    int x_285 = 0;
+    int x_286 = 0;
+    int x_305 = 0;
+    int x_306 = 0;
+    int x_320 = 0;
+    int x_324 = 0;
+    int x_339 = 0;
+    int x_338 = 0;
+    int x_352 = 0;
+    int x_351 = 0;
+    int x_366 = 0;
+    int x_365 = 0;
+    int x_287_phi = 0;
+    int x_307_phi = 0;
+    int x_328_phi = 0;
+    int x_340_phi = 0;
+    int x_353_phi = 0;
+    int x_367_phi = 0;
+    float const x_261 = x_28.injectionSwitch.x;
+    if ((1.0f >= x_261)) {
+    } else {
+      continue;
+    }
+    int const x_266 = i;
+    int const x_267 = *(mid);
+    int const x_269 = j;
+    int const x_270 = *(to);
+    if (((x_266 <= x_267) && (x_269 <= x_270))) {
+    } else {
+      break;
+    }
+    int const x_274 = i;
+    int const x_276 = (*(tint_symbol_5)).arr[x_274];
+    int const x_277 = j;
+    int const x_279 = (*(tint_symbol_5)).arr[x_277];
+    bool const x_280 = (x_276 < x_279);
+    if (x_280) {
+      x_285 = k;
+      x_287_phi = x_285;
+    } else {
+      x_286 = 0;
+      x_287_phi = x_286;
+    }
+    int const x_287 = x_287_phi;
+    int const x_288 = (x_287 + 1);
+    if (x_280) {
+      k = x_288;
+      float const x_293 = x_28.injectionSwitch.x;
+      if (!((1.0f <= x_293))) {
+      } else {
+        continue;
+      }
+    }
+    float const x_297 = x_28.injectionSwitch.y;
+    if ((x_297 >= 0.0f)) {
+    } else {
+      continue;
+    }
+    int const x_300 = 0;
+    if (x_280) {
+      x_305 = i;
+      x_307_phi = x_305;
+    } else {
+      x_306 = 0;
+      x_307_phi = x_306;
+    }
+    int const x_307 = x_307_phi;
+    int const x_309 = select(x_300, x_307, x_280);
+    if (x_280) {
+      i = (x_309 + 1);
+    }
+    int const x_315 = 0;
+    if (x_280) {
+      x_320 = (*(tint_symbol_5)).arr[x_309];
+      float const x_322 = x_28.injectionSwitch.y;
+      x_328_phi = x_320;
+      if (!((0.0f <= x_322))) {
+        continue;
+      }
+    } else {
+      x_324 = 0;
+      float const x_326 = x_28.injectionSwitch.y;
+      x_328_phi = x_324;
+      if (!((x_326 < 0.0f))) {
+      } else {
+        continue;
+      }
+    }
+    int const x_328 = x_328_phi;
+    if (x_280) {
+      (*(tint_symbol_6)).arr[x_287] = select(x_315, x_328, x_280);
+    }
+    if (x_280) {
+      x_339 = 0;
+      x_340_phi = x_339;
+    } else {
+      x_338 = k;
+      x_340_phi = x_338;
+    }
+    int const x_340 = x_340_phi;
+    if (x_280) {
+    } else {
+      k = (x_340 + 1);
+    }
+    float const x_345 = x_28.injectionSwitch.x;
+    if (!((1.0f <= x_345))) {
+    } else {
+      continue;
+    }
+    if (x_280) {
+      x_352 = 0;
+      x_353_phi = x_352;
+    } else {
+      x_351 = j;
+      x_353_phi = x_351;
+    }
+    int const x_353 = x_353_phi;
+    int const x_355 = 0;
+    int const x_357 = select(x_353, x_355, x_280);
+    if (x_280) {
+    } else {
+      j = (x_357 + 1);
+    }
+    if (x_280) {
+      x_366 = 0;
+      x_367_phi = x_366;
+    } else {
+      x_365 = (*(tint_symbol_5)).arr[x_357];
+      x_367_phi = x_365;
+    }
+    int const x_367 = x_367_phi;
+    if (x_280) {
+    } else {
+      (*(tint_symbol_6)).arr[x_340] = x_367;
+    }
+  }
+  while (true) {
+    int const x_376 = i;
+    int const x_378 = i;
+    int const x_379 = *(mid);
+    if (((x_376 < 10) && (x_378 <= x_379))) {
+    } else {
+      break;
+    }
+    int const x_383 = k;
+    k = (x_383 + 1);
+    int const x_385 = i;
+    i = (x_385 + 1);
+    int const x_388 = (*(tint_symbol_5)).arr[x_385];
+    (*(tint_symbol_6)).arr[x_383] = x_388;
+  }
+  int const x_390 = *(from);
+  i_1 = x_390;
+  while (true) {
+    int const x_395 = i_1;
+    int const x_396 = *(to);
+    if ((x_395 <= x_396)) {
+    } else {
+      break;
+    }
+    int const x_399 = i_1;
+    int const x_400 = i_1;
+    int const x_402 = (*(tint_symbol_6)).arr[x_400];
+    (*(tint_symbol_5)).arr[x_399] = x_402;
+    {
+      int const x_404 = i_1;
+      i_1 = (x_404 + 1);
+    }
+  }
+  return;
+}
+
+void mergeSort_(constant buf0& x_28, thread tint_array_wrapper* const tint_symbol_7, thread tint_array_wrapper* const tint_symbol_8) {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  while (true) {
+    int const x_411 = m;
+    int const x_412 = high;
+    if ((x_411 <= x_412)) {
+    } else {
+      break;
+    }
+    int const x_415 = low;
+    i_2 = x_415;
+    while (true) {
+      int const x_420 = i_2;
+      int const x_421 = high;
+      if ((x_420 < x_421)) {
+      } else {
+        break;
+      }
+      int const x_424 = i_2;
+      from_1 = x_424;
+      int const x_425 = i_2;
+      int const x_426 = m;
+      mid_1 = ((x_425 + x_426) - 1);
+      int const x_429 = i_2;
+      int const x_430 = m;
+      int const x_434 = high;
+      to_1 = min(((x_429 + (2 * x_430)) - 1), x_434);
+      int const x_436 = from_1;
+      param = x_436;
+      int const x_437 = mid_1;
+      param_1 = x_437;
+      int const x_438 = to_1;
+      param_2 = x_438;
+      merge_i1_i1_i1_(x_28, &(param), &(param_1), &(param_2), tint_symbol_7, tint_symbol_8);
+      {
+        int const x_440 = m;
+        int const x_442 = i_2;
+        i_2 = (x_442 + (2 * x_440));
+      }
+    }
+    {
+      int const x_444 = m;
+      m = (2 * x_444);
+    }
+  }
+  return;
+}
+
+void main_1(constant buf0& x_28, thread tint_array_wrapper* const tint_symbol_9, thread tint_array_wrapper* const tint_symbol_10, thread float4* const tint_symbol_11, thread float4* const tint_symbol_12) {
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  float const x_88 = x_28.injectionSwitch.x;
+  i_3 = int(x_88);
+  while (true) {
+    int const x_94 = i_3;
+    switch(x_94) {
+      case 9: {
+        int const x_124 = i_3;
+        (*(tint_symbol_9)).arr[x_124] = -5;
+        break;
+      }
+      case 8: {
+        int const x_122 = i_3;
+        (*(tint_symbol_9)).arr[x_122] = -4;
+        break;
+      }
+      case 7: {
+        int const x_120 = i_3;
+        (*(tint_symbol_9)).arr[x_120] = -3;
+        break;
+      }
+      case 6: {
+        int const x_118 = i_3;
+        (*(tint_symbol_9)).arr[x_118] = -2;
+        break;
+      }
+      case 5: {
+        int const x_116 = i_3;
+        (*(tint_symbol_9)).arr[x_116] = -1;
+        break;
+      }
+      case 4: {
+        int const x_114 = i_3;
+        (*(tint_symbol_9)).arr[x_114] = 0;
+        break;
+      }
+      case 3: {
+        int const x_112 = i_3;
+        (*(tint_symbol_9)).arr[x_112] = 1;
+        break;
+      }
+      case 2: {
+        int const x_110 = i_3;
+        (*(tint_symbol_9)).arr[x_110] = 2;
+        break;
+      }
+      case 1: {
+        int const x_108 = i_3;
+        (*(tint_symbol_9)).arr[x_108] = 3;
+        break;
+      }
+      case 0: {
+        int const x_106 = i_3;
+        (*(tint_symbol_9)).arr[x_106] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    int const x_126 = i_3;
+    i_3 = (x_126 + 1);
+    {
+      int const x_128 = i_3;
+      if ((x_128 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  while (true) {
+    int const x_134 = j_1;
+    if ((x_134 < 10)) {
+    } else {
+      break;
+    }
+    int const x_137 = j_1;
+    int const x_138 = j_1;
+    int const x_140 = (*(tint_symbol_9)).arr[x_138];
+    (*(tint_symbol_10)).arr[x_137] = x_140;
+    {
+      int const x_142 = j_1;
+      j_1 = (x_142 + 1);
+    }
+  }
+  mergeSort_(x_28, tint_symbol_9, tint_symbol_10);
+  float const x_146 = (*(tint_symbol_11)).y;
+  if ((int(x_146) < 30)) {
+    int const x_153 = (*(tint_symbol_9)).arr[0];
+    grey = (0.5f + (float(x_153) / 10.0f));
+  } else {
+    float const x_158 = (*(tint_symbol_11)).y;
+    if ((int(x_158) < 60)) {
+      int const x_165 = (*(tint_symbol_9)).arr[1];
+      grey = (0.5f + (float(x_165) / 10.0f));
+    } else {
+      float const x_170 = (*(tint_symbol_11)).y;
+      if ((int(x_170) < 90)) {
+        int const x_177 = (*(tint_symbol_9)).arr[2];
+        grey = (0.5f + (float(x_177) / 10.0f));
+      } else {
+        float const x_182 = (*(tint_symbol_11)).y;
+        if ((int(x_182) < 120)) {
+          int const x_189 = (*(tint_symbol_9)).arr[3];
+          grey = (0.5f + (float(x_189) / 10.0f));
+        } else {
+          float const x_194 = (*(tint_symbol_11)).y;
+          if ((int(x_194) < 150)) {
+            discard_fragment();
+          } else {
+            float const x_201 = (*(tint_symbol_11)).y;
+            if ((int(x_201) < 180)) {
+              int const x_208 = (*(tint_symbol_9)).arr[5];
+              grey = (0.5f + (float(x_208) / 10.0f));
+            } else {
+              float const x_213 = (*(tint_symbol_11)).y;
+              if ((int(x_213) < 210)) {
+                int const x_220 = (*(tint_symbol_9)).arr[6];
+                grey = (0.5f + (float(x_220) / 10.0f));
+              } else {
+                float const x_225 = (*(tint_symbol_11)).y;
+                if ((int(x_225) < 240)) {
+                  int const x_232 = (*(tint_symbol_9)).arr[7];
+                  grey = (0.5f + (float(x_232) / 10.0f));
+                } else {
+                  float const x_237 = (*(tint_symbol_11)).y;
+                  if ((int(x_237) < 270)) {
+                    int const x_244 = (*(tint_symbol_9)).arr[8];
+                    grey = (0.5f + (float(x_244) / 10.0f));
+                  } else {
+                    discard_fragment();
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  float const x_248 = grey;
+  float3 const x_249 = float3(x_248, x_248, x_248);
+  *(tint_symbol_12) = float4(x_249.x, x_249.y, x_249.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_28 [[buffer(0)]]) {
+  thread float4 tint_symbol_13 = 0.0f;
+  thread tint_array_wrapper tint_symbol_14 = {};
+  thread tint_array_wrapper tint_symbol_15 = {};
+  thread float4 tint_symbol_16 = 0.0f;
+  tint_symbol_13 = gl_FragCoord_param;
+  main_1(x_28, &(tint_symbol_14), &(tint_symbol_15), &(tint_symbol_13), &(tint_symbol_16));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_16};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..aa67796
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/1.wgsl.expected.spvasm
@@ -0,0 +1,864 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 525
+; Schema: 0
+               OpCapability Shader
+        %290 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %data "data"
+               OpName %temp "temp"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_28 "x_28"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %merge_i1_i1_i1_ "merge_i1_i1_i1_"
+               OpName %from "from"
+               OpName %mid "mid"
+               OpName %to "to"
+               OpName %k "k"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %i_1 "i_1"
+               OpName %x_285 "x_285"
+               OpName %x_286 "x_286"
+               OpName %x_305 "x_305"
+               OpName %x_306 "x_306"
+               OpName %x_320 "x_320"
+               OpName %x_324 "x_324"
+               OpName %x_339 "x_339"
+               OpName %x_338 "x_338"
+               OpName %x_352 "x_352"
+               OpName %x_351 "x_351"
+               OpName %x_366 "x_366"
+               OpName %x_365 "x_365"
+               OpName %x_287_phi "x_287_phi"
+               OpName %x_307_phi "x_307_phi"
+               OpName %x_328_phi "x_328_phi"
+               OpName %x_340_phi "x_340_phi"
+               OpName %x_353_phi "x_353_phi"
+               OpName %x_367_phi "x_367_phi"
+               OpName %mergeSort_ "mergeSort_"
+               OpName %low "low"
+               OpName %high "high"
+               OpName %m "m"
+               OpName %i_2 "i_2"
+               OpName %from_1 "from_1"
+               OpName %mid_1 "mid_1"
+               OpName %to_1 "to_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %main_1 "main_1"
+               OpName %i_3 "i_3"
+               OpName %j_1 "j_1"
+               OpName %grey "grey"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_28 NonWritable
+               OpDecorate %x_28 DescriptorSet 0
+               OpDecorate %x_28 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Private__arr_int_uint_10 = OpTypePointer Private %_arr_int_uint_10
+          %7 = OpConstantNull %_arr_int_uint_10
+       %data = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+       %temp = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_28 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %17
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int %_ptr_Function_int
+         %32 = OpConstantNull %int
+      %int_1 = OpConstant %int 1
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+       %bool = OpTypeBool
+%_ptr_Private_int = OpTypePointer Private %int
+      %int_0 = OpConstant %int 0
+     %uint_1 = OpConstant %uint 1
+    %float_0 = OpConstant %float 0
+     %int_10 = OpConstant %int 10
+        %246 = OpTypeFunction %void
+      %int_9 = OpConstant %int 9
+      %int_2 = OpConstant %int 2
+%_ptr_Function_float = OpTypePointer Function %float
+        %314 = OpConstantNull %float
+     %int_n5 = OpConstant %int -5
+     %int_n4 = OpConstant %int -4
+     %int_n3 = OpConstant %int -3
+     %int_n2 = OpConstant %int -2
+     %int_n1 = OpConstant %int -1
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+%_ptr_Private_float = OpTypePointer Private %float
+     %int_30 = OpConstant %int 30
+  %float_0_5 = OpConstant %float 0.5
+   %float_10 = OpConstant %float 10
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+    %v3float = OpTypeVector %float 3
+   %main_out = OpTypeStruct %v4float
+        %512 = OpTypeFunction %void %main_out
+%merge_i1_i1_i1_ = OpFunction %void None %23
+       %from = OpFunctionParameter %_ptr_Function_int
+        %mid = OpFunctionParameter %_ptr_Function_int
+         %to = OpFunctionParameter %_ptr_Function_int
+         %30 = OpLabel
+          %k = OpVariable %_ptr_Function_int Function %32
+          %i = OpVariable %_ptr_Function_int Function %32
+          %j = OpVariable %_ptr_Function_int Function %32
+        %i_1 = OpVariable %_ptr_Function_int Function %32
+      %x_285 = OpVariable %_ptr_Function_int Function %32
+      %x_286 = OpVariable %_ptr_Function_int Function %32
+      %x_305 = OpVariable %_ptr_Function_int Function %32
+      %x_306 = OpVariable %_ptr_Function_int Function %32
+      %x_320 = OpVariable %_ptr_Function_int Function %32
+      %x_324 = OpVariable %_ptr_Function_int Function %32
+      %x_339 = OpVariable %_ptr_Function_int Function %32
+      %x_338 = OpVariable %_ptr_Function_int Function %32
+      %x_352 = OpVariable %_ptr_Function_int Function %32
+      %x_351 = OpVariable %_ptr_Function_int Function %32
+      %x_366 = OpVariable %_ptr_Function_int Function %32
+      %x_365 = OpVariable %_ptr_Function_int Function %32
+  %x_287_phi = OpVariable %_ptr_Function_int Function %32
+  %x_307_phi = OpVariable %_ptr_Function_int Function %32
+  %x_328_phi = OpVariable %_ptr_Function_int Function %32
+  %x_340_phi = OpVariable %_ptr_Function_int Function %32
+  %x_353_phi = OpVariable %_ptr_Function_int Function %32
+  %x_367_phi = OpVariable %_ptr_Function_int Function %32
+         %37 = OpLoad %int %from
+               OpStore %k %37
+         %39 = OpLoad %int %from
+               OpStore %i %39
+         %41 = OpLoad %int %mid
+         %43 = OpIAdd %int %41 %int_1
+               OpStore %j %43
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %68 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_0
+         %69 = OpLoad %float %68
+         %71 = OpFOrdGreaterThanEqual %bool %float_1 %69
+               OpSelectionMerge %73 None
+               OpBranchConditional %71 %74 %75
+         %74 = OpLabel
+               OpBranch %73
+         %75 = OpLabel
+               OpBranch %46
+         %73 = OpLabel
+         %76 = OpLoad %int %i
+         %78 = OpLoad %int %mid
+         %79 = OpLoad %int %j
+         %81 = OpLoad %int %to
+         %82 = OpSLessThanEqual %bool %76 %78
+               OpSelectionMerge %83 None
+               OpBranchConditional %82 %84 %83
+         %84 = OpLabel
+         %85 = OpSLessThanEqual %bool %79 %81
+               OpBranch %83
+         %83 = OpLabel
+         %86 = OpPhi %bool %82 %73 %85 %84
+               OpSelectionMerge %87 None
+               OpBranchConditional %86 %88 %89
+         %88 = OpLabel
+               OpBranch %87
+         %89 = OpLabel
+               OpBranch %45
+         %87 = OpLabel
+         %90 = OpLoad %int %i
+         %92 = OpAccessChain %_ptr_Private_int %data %90
+         %93 = OpLoad %int %92
+         %94 = OpLoad %int %j
+         %95 = OpAccessChain %_ptr_Private_int %data %94
+         %96 = OpLoad %int %95
+         %97 = OpSLessThan %bool %93 %96
+               OpSelectionMerge %98 None
+               OpBranchConditional %97 %99 %100
+         %99 = OpLabel
+        %101 = OpLoad %int %k
+               OpStore %x_285 %101
+        %102 = OpLoad %int %x_285
+               OpStore %x_287_phi %102
+               OpBranch %98
+        %100 = OpLabel
+               OpStore %x_286 %int_0
+        %104 = OpLoad %int %x_286
+               OpStore %x_287_phi %104
+               OpBranch %98
+         %98 = OpLabel
+        %105 = OpLoad %int %x_287_phi
+        %106 = OpIAdd %int %105 %int_1
+               OpSelectionMerge %107 None
+               OpBranchConditional %97 %108 %107
+        %108 = OpLabel
+               OpStore %k %106
+        %109 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_0
+        %110 = OpLoad %float %109
+        %112 = OpFOrdLessThanEqual %bool %float_1 %110
+        %111 = OpLogicalNot %bool %112
+               OpSelectionMerge %113 None
+               OpBranchConditional %111 %114 %115
+        %114 = OpLabel
+               OpBranch %113
+        %115 = OpLabel
+               OpBranch %46
+        %113 = OpLabel
+               OpBranch %107
+        %107 = OpLabel
+        %117 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_1
+        %118 = OpLoad %float %117
+        %120 = OpFOrdGreaterThanEqual %bool %118 %float_0
+               OpSelectionMerge %121 None
+               OpBranchConditional %120 %122 %123
+        %122 = OpLabel
+               OpBranch %121
+        %123 = OpLabel
+               OpBranch %46
+        %121 = OpLabel
+               OpSelectionMerge %124 None
+               OpBranchConditional %97 %125 %126
+        %125 = OpLabel
+        %127 = OpLoad %int %i
+               OpStore %x_305 %127
+        %128 = OpLoad %int %x_305
+               OpStore %x_307_phi %128
+               OpBranch %124
+        %126 = OpLabel
+               OpStore %x_306 %int_0
+        %129 = OpLoad %int %x_306
+               OpStore %x_307_phi %129
+               OpBranch %124
+        %124 = OpLabel
+        %130 = OpLoad %int %x_307_phi
+        %131 = OpSelect %int %97 %130 %int_0
+               OpSelectionMerge %132 None
+               OpBranchConditional %97 %133 %132
+        %133 = OpLabel
+        %134 = OpIAdd %int %131 %int_1
+               OpStore %i %134
+               OpBranch %132
+        %132 = OpLabel
+               OpSelectionMerge %135 None
+               OpBranchConditional %97 %136 %137
+        %136 = OpLabel
+        %138 = OpAccessChain %_ptr_Private_int %data %131
+        %139 = OpLoad %int %138
+               OpStore %x_320 %139
+        %140 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_1
+        %141 = OpLoad %float %140
+        %142 = OpLoad %int %x_320
+               OpStore %x_328_phi %142
+        %144 = OpFOrdLessThanEqual %bool %float_0 %141
+        %143 = OpLogicalNot %bool %144
+               OpSelectionMerge %145 None
+               OpBranchConditional %143 %146 %145
+        %146 = OpLabel
+               OpBranch %46
+        %145 = OpLabel
+               OpBranch %135
+        %137 = OpLabel
+               OpStore %x_324 %int_0
+        %147 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_1
+        %148 = OpLoad %float %147
+        %149 = OpLoad %int %x_324
+               OpStore %x_328_phi %149
+        %151 = OpFOrdLessThan %bool %148 %float_0
+        %150 = OpLogicalNot %bool %151
+               OpSelectionMerge %152 None
+               OpBranchConditional %150 %153 %154
+        %153 = OpLabel
+               OpBranch %152
+        %154 = OpLabel
+               OpBranch %46
+        %152 = OpLabel
+               OpBranch %135
+        %135 = OpLabel
+        %155 = OpLoad %int %x_328_phi
+               OpSelectionMerge %156 None
+               OpBranchConditional %97 %157 %156
+        %157 = OpLabel
+        %158 = OpAccessChain %_ptr_Private_int %temp %105
+        %159 = OpSelect %int %97 %155 %int_0
+               OpStore %158 %159
+               OpBranch %156
+        %156 = OpLabel
+               OpSelectionMerge %160 None
+               OpBranchConditional %97 %161 %162
+        %161 = OpLabel
+               OpStore %x_339 %int_0
+        %163 = OpLoad %int %x_339
+               OpStore %x_340_phi %163
+               OpBranch %160
+        %162 = OpLabel
+        %164 = OpLoad %int %k
+               OpStore %x_338 %164
+        %165 = OpLoad %int %x_338
+               OpStore %x_340_phi %165
+               OpBranch %160
+        %160 = OpLabel
+        %166 = OpLoad %int %x_340_phi
+               OpSelectionMerge %167 None
+               OpBranchConditional %97 %168 %169
+        %168 = OpLabel
+               OpBranch %167
+        %169 = OpLabel
+        %170 = OpIAdd %int %166 %int_1
+               OpStore %k %170
+               OpBranch %167
+        %167 = OpLabel
+        %171 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_0
+        %172 = OpLoad %float %171
+        %174 = OpFOrdLessThanEqual %bool %float_1 %172
+        %173 = OpLogicalNot %bool %174
+               OpSelectionMerge %175 None
+               OpBranchConditional %173 %176 %177
+        %176 = OpLabel
+               OpBranch %175
+        %177 = OpLabel
+               OpBranch %46
+        %175 = OpLabel
+               OpSelectionMerge %178 None
+               OpBranchConditional %97 %179 %180
+        %179 = OpLabel
+               OpStore %x_352 %int_0
+        %181 = OpLoad %int %x_352
+               OpStore %x_353_phi %181
+               OpBranch %178
+        %180 = OpLabel
+        %182 = OpLoad %int %j
+               OpStore %x_351 %182
+        %183 = OpLoad %int %x_351
+               OpStore %x_353_phi %183
+               OpBranch %178
+        %178 = OpLabel
+        %184 = OpLoad %int %x_353_phi
+        %185 = OpSelect %int %97 %int_0 %184
+               OpSelectionMerge %186 None
+               OpBranchConditional %97 %187 %188
+        %187 = OpLabel
+               OpBranch %186
+        %188 = OpLabel
+        %189 = OpIAdd %int %185 %int_1
+               OpStore %j %189
+               OpBranch %186
+        %186 = OpLabel
+               OpSelectionMerge %190 None
+               OpBranchConditional %97 %191 %192
+        %191 = OpLabel
+               OpStore %x_366 %int_0
+        %193 = OpLoad %int %x_366
+               OpStore %x_367_phi %193
+               OpBranch %190
+        %192 = OpLabel
+        %194 = OpAccessChain %_ptr_Private_int %data %185
+        %195 = OpLoad %int %194
+               OpStore %x_365 %195
+        %196 = OpLoad %int %x_365
+               OpStore %x_367_phi %196
+               OpBranch %190
+        %190 = OpLabel
+        %197 = OpLoad %int %x_367_phi
+               OpSelectionMerge %198 None
+               OpBranchConditional %97 %199 %200
+        %199 = OpLabel
+               OpBranch %198
+        %200 = OpLabel
+        %201 = OpAccessChain %_ptr_Private_int %temp %166
+               OpStore %201 %197
+               OpBranch %198
+        %198 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+               OpBranch %44
+         %45 = OpLabel
+               OpBranch %202
+        %202 = OpLabel
+               OpLoopMerge %203 %204 None
+               OpBranch %205
+        %205 = OpLabel
+        %206 = OpLoad %int %i
+        %207 = OpLoad %int %i
+        %209 = OpLoad %int %mid
+        %211 = OpSLessThan %bool %206 %int_10
+               OpSelectionMerge %212 None
+               OpBranchConditional %211 %213 %212
+        %213 = OpLabel
+        %214 = OpSLessThanEqual %bool %207 %209
+               OpBranch %212
+        %212 = OpLabel
+        %215 = OpPhi %bool %211 %205 %214 %213
+               OpSelectionMerge %216 None
+               OpBranchConditional %215 %217 %218
+        %217 = OpLabel
+               OpBranch %216
+        %218 = OpLabel
+               OpBranch %203
+        %216 = OpLabel
+        %219 = OpLoad %int %k
+        %220 = OpIAdd %int %219 %int_1
+               OpStore %k %220
+        %221 = OpLoad %int %i
+        %222 = OpIAdd %int %221 %int_1
+               OpStore %i %222
+        %223 = OpAccessChain %_ptr_Private_int %data %221
+        %224 = OpLoad %int %223
+        %225 = OpAccessChain %_ptr_Private_int %temp %219
+               OpStore %225 %224
+               OpBranch %204
+        %204 = OpLabel
+               OpBranch %202
+        %203 = OpLabel
+        %227 = OpLoad %int %from
+               OpStore %i_1 %227
+               OpBranch %228
+        %228 = OpLabel
+               OpLoopMerge %229 %230 None
+               OpBranch %231
+        %231 = OpLabel
+        %232 = OpLoad %int %i_1
+        %234 = OpLoad %int %to
+        %235 = OpSLessThanEqual %bool %232 %234
+               OpSelectionMerge %236 None
+               OpBranchConditional %235 %237 %238
+        %237 = OpLabel
+               OpBranch %236
+        %238 = OpLabel
+               OpBranch %229
+        %236 = OpLabel
+        %239 = OpLoad %int %i_1
+        %240 = OpLoad %int %i_1
+        %241 = OpAccessChain %_ptr_Private_int %temp %240
+        %242 = OpLoad %int %241
+        %243 = OpAccessChain %_ptr_Private_int %data %239
+               OpStore %243 %242
+               OpBranch %230
+        %230 = OpLabel
+        %244 = OpLoad %int %i_1
+        %245 = OpIAdd %int %244 %int_1
+               OpStore %i_1 %245
+               OpBranch %228
+        %229 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %mergeSort_ = OpFunction %void None %246
+        %248 = OpLabel
+        %low = OpVariable %_ptr_Function_int Function %32
+       %high = OpVariable %_ptr_Function_int Function %32
+          %m = OpVariable %_ptr_Function_int Function %32
+        %i_2 = OpVariable %_ptr_Function_int Function %32
+     %from_1 = OpVariable %_ptr_Function_int Function %32
+      %mid_1 = OpVariable %_ptr_Function_int Function %32
+       %to_1 = OpVariable %_ptr_Function_int Function %32
+      %param = OpVariable %_ptr_Function_int Function %32
+    %param_1 = OpVariable %_ptr_Function_int Function %32
+    %param_2 = OpVariable %_ptr_Function_int Function %32
+               OpStore %low %int_0
+               OpStore %high %int_9
+               OpStore %m %int_1
+               OpBranch %260
+        %260 = OpLabel
+               OpLoopMerge %261 %262 None
+               OpBranch %263
+        %263 = OpLabel
+        %264 = OpLoad %int %m
+        %265 = OpLoad %int %high
+        %266 = OpSLessThanEqual %bool %264 %265
+               OpSelectionMerge %267 None
+               OpBranchConditional %266 %268 %269
+        %268 = OpLabel
+               OpBranch %267
+        %269 = OpLabel
+               OpBranch %261
+        %267 = OpLabel
+        %270 = OpLoad %int %low
+               OpStore %i_2 %270
+               OpBranch %271
+        %271 = OpLabel
+               OpLoopMerge %272 %273 None
+               OpBranch %274
+        %274 = OpLabel
+        %275 = OpLoad %int %i_2
+        %276 = OpLoad %int %high
+        %277 = OpSLessThan %bool %275 %276
+               OpSelectionMerge %278 None
+               OpBranchConditional %277 %279 %280
+        %279 = OpLabel
+               OpBranch %278
+        %280 = OpLabel
+               OpBranch %272
+        %278 = OpLabel
+        %281 = OpLoad %int %i_2
+               OpStore %from_1 %281
+        %282 = OpLoad %int %i_2
+        %283 = OpLoad %int %m
+        %284 = OpIAdd %int %282 %283
+        %285 = OpISub %int %284 %int_1
+               OpStore %mid_1 %285
+        %286 = OpLoad %int %i_2
+        %287 = OpLoad %int %m
+        %288 = OpLoad %int %high
+        %292 = OpIMul %int %int_2 %287
+        %293 = OpIAdd %int %286 %292
+        %294 = OpISub %int %293 %int_1
+        %289 = OpExtInst %int %290 SMin %294 %288
+               OpStore %to_1 %289
+        %295 = OpLoad %int %from_1
+               OpStore %param %295
+        %296 = OpLoad %int %mid_1
+               OpStore %param_1 %296
+        %297 = OpLoad %int %to_1
+               OpStore %param_2 %297
+        %298 = OpFunctionCall %void %merge_i1_i1_i1_ %param %param_1 %param_2
+               OpBranch %273
+        %273 = OpLabel
+        %302 = OpLoad %int %m
+        %303 = OpLoad %int %i_2
+        %304 = OpIMul %int %int_2 %302
+        %305 = OpIAdd %int %303 %304
+               OpStore %i_2 %305
+               OpBranch %271
+        %272 = OpLabel
+               OpBranch %262
+        %262 = OpLabel
+        %306 = OpLoad %int %m
+        %307 = OpIMul %int %int_2 %306
+               OpStore %m %307
+               OpBranch %260
+        %261 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %246
+        %309 = OpLabel
+        %i_3 = OpVariable %_ptr_Function_int Function %32
+        %j_1 = OpVariable %_ptr_Function_int Function %32
+       %grey = OpVariable %_ptr_Function_float Function %314
+        %315 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_0
+        %316 = OpLoad %float %315
+        %317 = OpConvertFToS %int %316
+               OpStore %i_3 %317
+               OpBranch %318
+        %318 = OpLabel
+               OpLoopMerge %319 %320 None
+               OpBranch %321
+        %321 = OpLabel
+        %322 = OpLoad %int %i_3
+               OpSelectionMerge %323 None
+               OpSwitch %322 %324 9 %325 8 %326 7 %327 6 %328 5 %329 4 %330 3 %331 2 %332 1 %333 0 %334
+        %325 = OpLabel
+        %335 = OpLoad %int %i_3
+        %336 = OpAccessChain %_ptr_Private_int %data %335
+               OpStore %336 %int_n5
+               OpBranch %323
+        %326 = OpLabel
+        %338 = OpLoad %int %i_3
+        %339 = OpAccessChain %_ptr_Private_int %data %338
+               OpStore %339 %int_n4
+               OpBranch %323
+        %327 = OpLabel
+        %341 = OpLoad %int %i_3
+        %342 = OpAccessChain %_ptr_Private_int %data %341
+               OpStore %342 %int_n3
+               OpBranch %323
+        %328 = OpLabel
+        %344 = OpLoad %int %i_3
+        %345 = OpAccessChain %_ptr_Private_int %data %344
+               OpStore %345 %int_n2
+               OpBranch %323
+        %329 = OpLabel
+        %347 = OpLoad %int %i_3
+        %348 = OpAccessChain %_ptr_Private_int %data %347
+               OpStore %348 %int_n1
+               OpBranch %323
+        %330 = OpLabel
+        %350 = OpLoad %int %i_3
+        %351 = OpAccessChain %_ptr_Private_int %data %350
+               OpStore %351 %int_0
+               OpBranch %323
+        %331 = OpLabel
+        %352 = OpLoad %int %i_3
+        %353 = OpAccessChain %_ptr_Private_int %data %352
+               OpStore %353 %int_1
+               OpBranch %323
+        %332 = OpLabel
+        %354 = OpLoad %int %i_3
+        %355 = OpAccessChain %_ptr_Private_int %data %354
+               OpStore %355 %int_2
+               OpBranch %323
+        %333 = OpLabel
+        %356 = OpLoad %int %i_3
+        %357 = OpAccessChain %_ptr_Private_int %data %356
+               OpStore %357 %int_3
+               OpBranch %323
+        %334 = OpLabel
+        %359 = OpLoad %int %i_3
+        %360 = OpAccessChain %_ptr_Private_int %data %359
+               OpStore %360 %int_4
+               OpBranch %323
+        %324 = OpLabel
+               OpBranch %323
+        %323 = OpLabel
+        %362 = OpLoad %int %i_3
+        %363 = OpIAdd %int %362 %int_1
+               OpStore %i_3 %363
+               OpBranch %320
+        %320 = OpLabel
+        %364 = OpLoad %int %i_3
+        %365 = OpSLessThan %bool %364 %int_10
+               OpSelectionMerge %366 None
+               OpBranchConditional %365 %367 %368
+        %367 = OpLabel
+               OpBranch %366
+        %368 = OpLabel
+               OpBranch %319
+        %366 = OpLabel
+               OpBranch %318
+        %319 = OpLabel
+               OpStore %j_1 %int_0
+               OpBranch %369
+        %369 = OpLabel
+               OpLoopMerge %370 %371 None
+               OpBranch %372
+        %372 = OpLabel
+        %373 = OpLoad %int %j_1
+        %374 = OpSLessThan %bool %373 %int_10
+               OpSelectionMerge %375 None
+               OpBranchConditional %374 %376 %377
+        %376 = OpLabel
+               OpBranch %375
+        %377 = OpLabel
+               OpBranch %370
+        %375 = OpLabel
+        %378 = OpLoad %int %j_1
+        %379 = OpLoad %int %j_1
+        %380 = OpAccessChain %_ptr_Private_int %data %379
+        %381 = OpLoad %int %380
+        %382 = OpAccessChain %_ptr_Private_int %temp %378
+               OpStore %382 %381
+               OpBranch %371
+        %371 = OpLabel
+        %383 = OpLoad %int %j_1
+        %384 = OpIAdd %int %383 %int_1
+               OpStore %j_1 %384
+               OpBranch %369
+        %370 = OpLabel
+        %385 = OpFunctionCall %void %mergeSort_
+        %387 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %388 = OpLoad %float %387
+        %389 = OpConvertFToS %int %388
+        %391 = OpSLessThan %bool %389 %int_30
+               OpSelectionMerge %392 None
+               OpBranchConditional %391 %393 %394
+        %393 = OpLabel
+        %395 = OpAccessChain %_ptr_Private_int %data %int_0
+        %396 = OpLoad %int %395
+        %398 = OpConvertSToF %float %396
+        %400 = OpFDiv %float %398 %float_10
+        %401 = OpFAdd %float %float_0_5 %400
+               OpStore %grey %401
+               OpBranch %392
+        %394 = OpLabel
+        %402 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %403 = OpLoad %float %402
+        %404 = OpConvertFToS %int %403
+        %406 = OpSLessThan %bool %404 %int_60
+               OpSelectionMerge %407 None
+               OpBranchConditional %406 %408 %409
+        %408 = OpLabel
+        %410 = OpAccessChain %_ptr_Private_int %data %int_1
+        %411 = OpLoad %int %410
+        %412 = OpConvertSToF %float %411
+        %413 = OpFDiv %float %412 %float_10
+        %414 = OpFAdd %float %float_0_5 %413
+               OpStore %grey %414
+               OpBranch %407
+        %409 = OpLabel
+        %415 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %416 = OpLoad %float %415
+        %417 = OpConvertFToS %int %416
+        %419 = OpSLessThan %bool %417 %int_90
+               OpSelectionMerge %420 None
+               OpBranchConditional %419 %421 %422
+        %421 = OpLabel
+        %423 = OpAccessChain %_ptr_Private_int %data %int_2
+        %424 = OpLoad %int %423
+        %425 = OpConvertSToF %float %424
+        %426 = OpFDiv %float %425 %float_10
+        %427 = OpFAdd %float %float_0_5 %426
+               OpStore %grey %427
+               OpBranch %420
+        %422 = OpLabel
+        %428 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %429 = OpLoad %float %428
+        %430 = OpConvertFToS %int %429
+        %432 = OpSLessThan %bool %430 %int_120
+               OpSelectionMerge %433 None
+               OpBranchConditional %432 %434 %435
+        %434 = OpLabel
+        %436 = OpAccessChain %_ptr_Private_int %data %int_3
+        %437 = OpLoad %int %436
+        %438 = OpConvertSToF %float %437
+        %439 = OpFDiv %float %438 %float_10
+        %440 = OpFAdd %float %float_0_5 %439
+               OpStore %grey %440
+               OpBranch %433
+        %435 = OpLabel
+        %441 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %442 = OpLoad %float %441
+        %443 = OpConvertFToS %int %442
+        %445 = OpSLessThan %bool %443 %int_150
+               OpSelectionMerge %446 None
+               OpBranchConditional %445 %447 %448
+        %447 = OpLabel
+               OpKill
+        %448 = OpLabel
+        %449 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %450 = OpLoad %float %449
+        %451 = OpConvertFToS %int %450
+        %453 = OpSLessThan %bool %451 %int_180
+               OpSelectionMerge %454 None
+               OpBranchConditional %453 %455 %456
+        %455 = OpLabel
+        %458 = OpAccessChain %_ptr_Private_int %data %int_5
+        %459 = OpLoad %int %458
+        %460 = OpConvertSToF %float %459
+        %461 = OpFDiv %float %460 %float_10
+        %462 = OpFAdd %float %float_0_5 %461
+               OpStore %grey %462
+               OpBranch %454
+        %456 = OpLabel
+        %463 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %464 = OpLoad %float %463
+        %465 = OpConvertFToS %int %464
+        %467 = OpSLessThan %bool %465 %int_210
+               OpSelectionMerge %468 None
+               OpBranchConditional %467 %469 %470
+        %469 = OpLabel
+        %472 = OpAccessChain %_ptr_Private_int %data %int_6
+        %473 = OpLoad %int %472
+        %474 = OpConvertSToF %float %473
+        %475 = OpFDiv %float %474 %float_10
+        %476 = OpFAdd %float %float_0_5 %475
+               OpStore %grey %476
+               OpBranch %468
+        %470 = OpLabel
+        %477 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %478 = OpLoad %float %477
+        %479 = OpConvertFToS %int %478
+        %481 = OpSLessThan %bool %479 %int_240
+               OpSelectionMerge %482 None
+               OpBranchConditional %481 %483 %484
+        %483 = OpLabel
+        %486 = OpAccessChain %_ptr_Private_int %data %int_7
+        %487 = OpLoad %int %486
+        %488 = OpConvertSToF %float %487
+        %489 = OpFDiv %float %488 %float_10
+        %490 = OpFAdd %float %float_0_5 %489
+               OpStore %grey %490
+               OpBranch %482
+        %484 = OpLabel
+        %491 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %492 = OpLoad %float %491
+        %493 = OpConvertFToS %int %492
+        %495 = OpSLessThan %bool %493 %int_270
+               OpSelectionMerge %496 None
+               OpBranchConditional %495 %497 %498
+        %497 = OpLabel
+        %500 = OpAccessChain %_ptr_Private_int %data %int_8
+        %501 = OpLoad %int %500
+        %502 = OpConvertSToF %float %501
+        %503 = OpFDiv %float %502 %float_10
+        %504 = OpFAdd %float %float_0_5 %503
+               OpStore %grey %504
+               OpBranch %496
+        %498 = OpLabel
+               OpKill
+        %496 = OpLabel
+               OpBranch %482
+        %482 = OpLabel
+               OpBranch %468
+        %468 = OpLabel
+               OpBranch %454
+        %454 = OpLabel
+               OpBranch %446
+        %446 = OpLabel
+               OpBranch %433
+        %433 = OpLabel
+               OpBranch %420
+        %420 = OpLabel
+               OpBranch %407
+        %407 = OpLabel
+               OpBranch %392
+        %392 = OpLabel
+        %505 = OpLoad %float %grey
+        %507 = OpCompositeConstruct %v3float %505 %505 %505
+        %508 = OpCompositeExtract %float %507 0
+        %509 = OpCompositeExtract %float %507 1
+        %510 = OpCompositeExtract %float %507 2
+        %511 = OpCompositeConstruct %v4float %508 %509 %510 %float_1
+               OpStore %x_GLF_color %511
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %512
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %516 = OpLabel
+        %517 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %517
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %246
+        %519 = OpLabel
+        %520 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %520
+        %521 = OpFunctionCall %void %main_1
+        %523 = OpLoad %v4float %x_GLF_color
+        %524 = OpCompositeConstruct %main_out %523
+        %522 = OpFunctionCall %void %tint_symbol_3 %524
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 320[%320] is not post dominated by the back-edge block 366[%366]
+  %366 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..5fac853
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/1.wgsl.expected.wgsl
@@ -0,0 +1,414 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> data : array<i32, 10>;
+
+var<private> temp : array<i32, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn merge_i1_i1_i1_(from : ptr<function, i32>, mid : ptr<function, i32>, to : ptr<function, i32>) {
+  var k : i32;
+  var i : i32;
+  var j : i32;
+  var i_1 : i32;
+  let x_255 : i32 = *(from);
+  k = x_255;
+  let x_256 : i32 = *(from);
+  i = x_256;
+  let x_257 : i32 = *(mid);
+  j = (x_257 + 1);
+  loop {
+    var x_285 : i32;
+    var x_286 : i32;
+    var x_305 : i32;
+    var x_306 : i32;
+    var x_320 : i32;
+    var x_324 : i32;
+    var x_339 : i32;
+    var x_338 : i32;
+    var x_352 : i32;
+    var x_351 : i32;
+    var x_366 : i32;
+    var x_365 : i32;
+    var x_287_phi : i32;
+    var x_307_phi : i32;
+    var x_328_phi : i32;
+    var x_340_phi : i32;
+    var x_353_phi : i32;
+    var x_367_phi : i32;
+    let x_261 : f32 = x_28.injectionSwitch.x;
+    if ((1.0 >= x_261)) {
+    } else {
+      continue;
+    }
+    let x_266 : i32 = i;
+    let x_267 : i32 = *(mid);
+    let x_269 : i32 = j;
+    let x_270 : i32 = *(to);
+    if (((x_266 <= x_267) && (x_269 <= x_270))) {
+    } else {
+      break;
+    }
+    let x_274 : i32 = i;
+    let x_276 : i32 = data[x_274];
+    let x_277 : i32 = j;
+    let x_279 : i32 = data[x_277];
+    let x_280 : bool = (x_276 < x_279);
+    if (x_280) {
+      x_285 = k;
+      x_287_phi = x_285;
+    } else {
+      x_286 = 0;
+      x_287_phi = x_286;
+    }
+    let x_287 : i32 = x_287_phi;
+    let x_288 : i32 = (x_287 + 1);
+    if (x_280) {
+      k = x_288;
+      let x_293 : f32 = x_28.injectionSwitch.x;
+      if (!((1.0 <= x_293))) {
+      } else {
+        continue;
+      }
+    }
+    let x_297 : f32 = x_28.injectionSwitch.y;
+    if ((x_297 >= 0.0)) {
+    } else {
+      continue;
+    }
+    let x_300 : i32 = 0;
+    if (x_280) {
+      x_305 = i;
+      x_307_phi = x_305;
+    } else {
+      x_306 = 0;
+      x_307_phi = x_306;
+    }
+    let x_307 : i32 = x_307_phi;
+    let x_309 : i32 = select(x_300, x_307, x_280);
+    if (x_280) {
+      i = (x_309 + 1);
+    }
+    let x_315 : i32 = 0;
+    if (x_280) {
+      x_320 = data[x_309];
+      let x_322 : f32 = x_28.injectionSwitch.y;
+      x_328_phi = x_320;
+      if (!((0.0 <= x_322))) {
+        continue;
+      }
+    } else {
+      x_324 = 0;
+      let x_326 : f32 = x_28.injectionSwitch.y;
+      x_328_phi = x_324;
+      if (!((x_326 < 0.0))) {
+      } else {
+        continue;
+      }
+    }
+    let x_328 : i32 = x_328_phi;
+    if (x_280) {
+      temp[x_287] = select(x_315, x_328, x_280);
+    }
+    if (x_280) {
+      x_339 = 0;
+      x_340_phi = x_339;
+    } else {
+      x_338 = k;
+      x_340_phi = x_338;
+    }
+    let x_340 : i32 = x_340_phi;
+    if (x_280) {
+    } else {
+      k = (x_340 + 1);
+    }
+    let x_345 : f32 = x_28.injectionSwitch.x;
+    if (!((1.0 <= x_345))) {
+    } else {
+      continue;
+    }
+    if (x_280) {
+      x_352 = 0;
+      x_353_phi = x_352;
+    } else {
+      x_351 = j;
+      x_353_phi = x_351;
+    }
+    let x_353 : i32 = x_353_phi;
+    let x_355 : i32 = 0;
+    let x_357 : i32 = select(x_353, x_355, x_280);
+    if (x_280) {
+    } else {
+      j = (x_357 + 1);
+    }
+    if (x_280) {
+      x_366 = 0;
+      x_367_phi = x_366;
+    } else {
+      x_365 = data[x_357];
+      x_367_phi = x_365;
+    }
+    let x_367 : i32 = x_367_phi;
+    if (x_280) {
+    } else {
+      temp[x_340] = x_367;
+    }
+  }
+  loop {
+    let x_376 : i32 = i;
+    let x_378 : i32 = i;
+    let x_379 : i32 = *(mid);
+    if (((x_376 < 10) && (x_378 <= x_379))) {
+    } else {
+      break;
+    }
+    let x_383 : i32 = k;
+    k = (x_383 + 1);
+    let x_385 : i32 = i;
+    i = (x_385 + 1);
+    let x_388 : i32 = data[x_385];
+    temp[x_383] = x_388;
+  }
+  let x_390 : i32 = *(from);
+  i_1 = x_390;
+  loop {
+    let x_395 : i32 = i_1;
+    let x_396 : i32 = *(to);
+    if ((x_395 <= x_396)) {
+    } else {
+      break;
+    }
+    let x_399 : i32 = i_1;
+    let x_400 : i32 = i_1;
+    let x_402 : i32 = temp[x_400];
+    data[x_399] = x_402;
+
+    continuing {
+      let x_404 : i32 = i_1;
+      i_1 = (x_404 + 1);
+    }
+  }
+  return;
+}
+
+fn mergeSort_() {
+  var low : i32;
+  var high : i32;
+  var m : i32;
+  var i_2 : i32;
+  var from_1 : i32;
+  var mid_1 : i32;
+  var to_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  low = 0;
+  high = 9;
+  m = 1;
+  loop {
+    let x_411 : i32 = m;
+    let x_412 : i32 = high;
+    if ((x_411 <= x_412)) {
+    } else {
+      break;
+    }
+    let x_415 : i32 = low;
+    i_2 = x_415;
+    loop {
+      let x_420 : i32 = i_2;
+      let x_421 : i32 = high;
+      if ((x_420 < x_421)) {
+      } else {
+        break;
+      }
+      let x_424 : i32 = i_2;
+      from_1 = x_424;
+      let x_425 : i32 = i_2;
+      let x_426 : i32 = m;
+      mid_1 = ((x_425 + x_426) - 1);
+      let x_429 : i32 = i_2;
+      let x_430 : i32 = m;
+      let x_434 : i32 = high;
+      to_1 = min(((x_429 + (2 * x_430)) - 1), x_434);
+      let x_436 : i32 = from_1;
+      param = x_436;
+      let x_437 : i32 = mid_1;
+      param_1 = x_437;
+      let x_438 : i32 = to_1;
+      param_2 = x_438;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2));
+
+      continuing {
+        let x_440 : i32 = m;
+        let x_442 : i32 = i_2;
+        i_2 = (x_442 + (2 * x_440));
+      }
+    }
+
+    continuing {
+      let x_444 : i32 = m;
+      m = (2 * x_444);
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_3 : i32;
+  var j_1 : i32;
+  var grey : f32;
+  let x_88 : f32 = x_28.injectionSwitch.x;
+  i_3 = i32(x_88);
+  loop {
+    let x_94 : i32 = i_3;
+    switch(x_94) {
+      case 9: {
+        let x_124 : i32 = i_3;
+        data[x_124] = -5;
+      }
+      case 8: {
+        let x_122 : i32 = i_3;
+        data[x_122] = -4;
+      }
+      case 7: {
+        let x_120 : i32 = i_3;
+        data[x_120] = -3;
+      }
+      case 6: {
+        let x_118 : i32 = i_3;
+        data[x_118] = -2;
+      }
+      case 5: {
+        let x_116 : i32 = i_3;
+        data[x_116] = -1;
+      }
+      case 4: {
+        let x_114 : i32 = i_3;
+        data[x_114] = 0;
+      }
+      case 3: {
+        let x_112 : i32 = i_3;
+        data[x_112] = 1;
+      }
+      case 2: {
+        let x_110 : i32 = i_3;
+        data[x_110] = 2;
+      }
+      case 1: {
+        let x_108 : i32 = i_3;
+        data[x_108] = 3;
+      }
+      case 0: {
+        let x_106 : i32 = i_3;
+        data[x_106] = 4;
+      }
+      default: {
+      }
+    }
+    let x_126 : i32 = i_3;
+    i_3 = (x_126 + 1);
+
+    continuing {
+      let x_128 : i32 = i_3;
+      if ((x_128 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  loop {
+    let x_134 : i32 = j_1;
+    if ((x_134 < 10)) {
+    } else {
+      break;
+    }
+    let x_137 : i32 = j_1;
+    let x_138 : i32 = j_1;
+    let x_140 : i32 = data[x_138];
+    temp[x_137] = x_140;
+
+    continuing {
+      let x_142 : i32 = j_1;
+      j_1 = (x_142 + 1);
+    }
+  }
+  mergeSort_();
+  let x_146 : f32 = gl_FragCoord.y;
+  if ((i32(x_146) < 30)) {
+    let x_153 : i32 = data[0];
+    grey = (0.5 + (f32(x_153) / 10.0));
+  } else {
+    let x_158 : f32 = gl_FragCoord.y;
+    if ((i32(x_158) < 60)) {
+      let x_165 : i32 = data[1];
+      grey = (0.5 + (f32(x_165) / 10.0));
+    } else {
+      let x_170 : f32 = gl_FragCoord.y;
+      if ((i32(x_170) < 90)) {
+        let x_177 : i32 = data[2];
+        grey = (0.5 + (f32(x_177) / 10.0));
+      } else {
+        let x_182 : f32 = gl_FragCoord.y;
+        if ((i32(x_182) < 120)) {
+          let x_189 : i32 = data[3];
+          grey = (0.5 + (f32(x_189) / 10.0));
+        } else {
+          let x_194 : f32 = gl_FragCoord.y;
+          if ((i32(x_194) < 150)) {
+            discard;
+          } else {
+            let x_201 : f32 = gl_FragCoord.y;
+            if ((i32(x_201) < 180)) {
+              let x_208 : i32 = data[5];
+              grey = (0.5 + (f32(x_208) / 10.0));
+            } else {
+              let x_213 : f32 = gl_FragCoord.y;
+              if ((i32(x_213) < 210)) {
+                let x_220 : i32 = data[6];
+                grey = (0.5 + (f32(x_220) / 10.0));
+              } else {
+                let x_225 : f32 = gl_FragCoord.y;
+                if ((i32(x_225) < 240)) {
+                  let x_232 : i32 = data[7];
+                  grey = (0.5 + (f32(x_232) / 10.0));
+                } else {
+                  let x_237 : f32 = gl_FragCoord.y;
+                  if ((i32(x_237) < 270)) {
+                    let x_244 : i32 = data[8];
+                    grey = (0.5 + (f32(x_244) / 10.0));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  let x_248 : f32 = grey;
+  let x_249 : vec3<f32> = vec3<f32>(x_248, x_248, x_248);
+  x_GLF_color = vec4<f32>(x_249.x, x_249.y, x_249.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/2-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/2-opt.spvasm
new file mode 100644
index 0000000..5ddec35
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/2-opt.spvasm
@@ -0,0 +1,686 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %merge_i1_i1_i1_ "merge(i1;i1;i1;"
+               OpName %from "from"
+               OpName %mid "mid"
+               OpName %to "to"
+               OpName %mergeSort_ "mergeSort("
+               OpName %k "k"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %data "data"
+               OpName %temp "temp"
+               OpName %i_0 "i"
+               OpName %low "low"
+               OpName %high "high"
+               OpName %m "m"
+               OpName %i_1 "i"
+               OpName %from_0 "from"
+               OpName %mid_0 "mid"
+               OpName %to_0 "to"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %param_1 "param"
+               OpName %i_2 "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %j_0 "j"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %grey "grey"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %32 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %35 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int %_ptr_Function_int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Private__arr_int_uint_10 = OpTypePointer Private %_arr_int_uint_10
+       %data = OpVariable %_ptr_Private__arr_int_uint_10 Private
+%_ptr_Private_int = OpTypePointer Private %int
+       %temp = OpVariable %_ptr_Private__arr_int_uint_10 Private
+     %int_10 = OpConstant %int 10
+      %int_0 = OpConstant %int 0
+      %int_9 = OpConstant %int 9
+      %int_2 = OpConstant %int 2
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_4 = OpConstant %int 4
+      %int_3 = OpConstant %int 3
+     %int_n1 = OpConstant %int -1
+     %int_n2 = OpConstant %int -2
+     %int_n3 = OpConstant %int -3
+     %int_n4 = OpConstant %int -4
+     %int_n5 = OpConstant %int -5
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+     %int_30 = OpConstant %int 30
+%_ptr_Function_float = OpTypePointer Function %float
+  %float_0_5 = OpConstant %float 0.5
+   %float_10 = OpConstant %float 10
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %v3float = OpTypeVector %float 3
+    %float_1 = OpConstant %float 1
+    %int_0_0 = OpConstant %int 0
+       %true = OpConstantTrue %bool
+      %false = OpConstantFalse %bool
+    %float_0 = OpConstant %float 0
+       %main = OpFunction %void None %32
+         %86 = OpLabel
+        %i_2 = OpVariable %_ptr_Function_int Function
+        %j_0 = OpVariable %_ptr_Function_int Function
+       %grey = OpVariable %_ptr_Function_float Function
+         %87 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %88 = OpLoad %float %87
+         %89 = OpConvertFToS %int %88
+               OpStore %i_2 %89
+               OpBranch %90
+         %90 = OpLabel
+               OpLoopMerge %91 %92 None
+               OpBranch %93
+         %93 = OpLabel
+         %94 = OpLoad %int %i_2
+               OpSelectionMerge %95 None
+               OpSwitch %94 %95 0 %96 1 %97 2 %98 3 %99 4 %100 5 %101 6 %102 7 %103 8 %104 9 %105
+         %96 = OpLabel
+        %106 = OpLoad %int %i_2
+        %107 = OpAccessChain %_ptr_Private_int %data %106
+               OpStore %107 %int_4
+               OpBranch %95
+         %97 = OpLabel
+        %108 = OpLoad %int %i_2
+        %109 = OpAccessChain %_ptr_Private_int %data %108
+               OpStore %109 %int_3
+               OpBranch %95
+         %98 = OpLabel
+        %110 = OpLoad %int %i_2
+        %111 = OpAccessChain %_ptr_Private_int %data %110
+               OpStore %111 %int_2
+               OpBranch %95
+         %99 = OpLabel
+        %112 = OpLoad %int %i_2
+        %113 = OpAccessChain %_ptr_Private_int %data %112
+               OpStore %113 %int_1
+               OpBranch %95
+        %100 = OpLabel
+        %114 = OpLoad %int %i_2
+        %115 = OpAccessChain %_ptr_Private_int %data %114
+               OpStore %115 %int_0
+               OpBranch %95
+        %101 = OpLabel
+        %116 = OpLoad %int %i_2
+        %117 = OpAccessChain %_ptr_Private_int %data %116
+               OpStore %117 %int_n1
+               OpBranch %95
+        %102 = OpLabel
+        %118 = OpLoad %int %i_2
+        %119 = OpAccessChain %_ptr_Private_int %data %118
+               OpStore %119 %int_n2
+               OpBranch %95
+        %103 = OpLabel
+        %120 = OpLoad %int %i_2
+        %121 = OpAccessChain %_ptr_Private_int %data %120
+               OpStore %121 %int_n3
+               OpBranch %95
+        %104 = OpLabel
+        %122 = OpLoad %int %i_2
+        %123 = OpAccessChain %_ptr_Private_int %data %122
+               OpStore %123 %int_n4
+               OpBranch %95
+        %105 = OpLabel
+        %124 = OpLoad %int %i_2
+        %125 = OpAccessChain %_ptr_Private_int %data %124
+               OpStore %125 %int_n5
+               OpBranch %95
+         %95 = OpLabel
+        %126 = OpLoad %int %i_2
+        %127 = OpIAdd %int %126 %int_1
+               OpStore %i_2 %127
+               OpBranch %92
+         %92 = OpLabel
+        %128 = OpLoad %int %i_2
+        %129 = OpSLessThan %bool %128 %int_10
+               OpBranchConditional %129 %90 %91
+         %91 = OpLabel
+               OpStore %j_0 %int_0
+               OpBranch %130
+        %130 = OpLabel
+               OpLoopMerge %131 %132 None
+               OpBranch %133
+        %133 = OpLabel
+        %134 = OpLoad %int %j_0
+        %135 = OpSLessThan %bool %134 %int_10
+               OpBranchConditional %135 %136 %131
+        %136 = OpLabel
+        %137 = OpLoad %int %j_0
+        %138 = OpLoad %int %j_0
+        %139 = OpAccessChain %_ptr_Private_int %data %138
+        %140 = OpLoad %int %139
+        %141 = OpAccessChain %_ptr_Private_int %temp %137
+               OpStore %141 %140
+               OpBranch %132
+        %132 = OpLabel
+        %142 = OpLoad %int %j_0
+        %143 = OpIAdd %int %142 %int_1
+               OpStore %j_0 %143
+               OpBranch %130
+        %131 = OpLabel
+        %144 = OpFunctionCall %void %mergeSort_
+        %145 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %146 = OpLoad %float %145
+        %147 = OpConvertFToS %int %146
+        %148 = OpSLessThan %bool %147 %int_30
+               OpSelectionMerge %149 None
+               OpBranchConditional %148 %150 %151
+        %150 = OpLabel
+        %152 = OpAccessChain %_ptr_Private_int %data %int_0
+        %153 = OpLoad %int %152
+        %154 = OpConvertSToF %float %153
+        %155 = OpFDiv %float %154 %float_10
+        %156 = OpFAdd %float %float_0_5 %155
+               OpStore %grey %156
+               OpBranch %149
+        %151 = OpLabel
+        %157 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %158 = OpLoad %float %157
+        %159 = OpConvertFToS %int %158
+        %160 = OpSLessThan %bool %159 %int_60
+               OpSelectionMerge %161 None
+               OpBranchConditional %160 %162 %163
+        %162 = OpLabel
+        %164 = OpAccessChain %_ptr_Private_int %data %int_1
+        %165 = OpLoad %int %164
+        %166 = OpConvertSToF %float %165
+        %167 = OpFDiv %float %166 %float_10
+        %168 = OpFAdd %float %float_0_5 %167
+               OpStore %grey %168
+               OpBranch %161
+        %163 = OpLabel
+        %169 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %170 = OpLoad %float %169
+        %171 = OpConvertFToS %int %170
+        %172 = OpSLessThan %bool %171 %int_90
+               OpSelectionMerge %173 None
+               OpBranchConditional %172 %174 %175
+        %174 = OpLabel
+        %176 = OpAccessChain %_ptr_Private_int %data %int_2
+        %177 = OpLoad %int %176
+        %178 = OpConvertSToF %float %177
+        %179 = OpFDiv %float %178 %float_10
+        %180 = OpFAdd %float %float_0_5 %179
+               OpStore %grey %180
+               OpBranch %173
+        %175 = OpLabel
+        %181 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %182 = OpLoad %float %181
+        %183 = OpConvertFToS %int %182
+        %184 = OpSLessThan %bool %183 %int_120
+               OpSelectionMerge %185 None
+               OpBranchConditional %184 %186 %187
+        %186 = OpLabel
+        %188 = OpAccessChain %_ptr_Private_int %data %int_3
+        %189 = OpLoad %int %188
+        %190 = OpConvertSToF %float %189
+        %191 = OpFDiv %float %190 %float_10
+        %192 = OpFAdd %float %float_0_5 %191
+               OpStore %grey %192
+               OpBranch %185
+        %187 = OpLabel
+        %193 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %194 = OpLoad %float %193
+        %195 = OpConvertFToS %int %194
+        %196 = OpSLessThan %bool %195 %int_150
+               OpSelectionMerge %197 None
+               OpBranchConditional %196 %198 %199
+        %198 = OpLabel
+               OpKill
+        %199 = OpLabel
+        %200 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %201 = OpLoad %float %200
+        %202 = OpConvertFToS %int %201
+        %203 = OpSLessThan %bool %202 %int_180
+               OpSelectionMerge %204 None
+               OpBranchConditional %203 %205 %206
+        %205 = OpLabel
+        %207 = OpAccessChain %_ptr_Private_int %data %int_5
+        %208 = OpLoad %int %207
+        %209 = OpConvertSToF %float %208
+        %210 = OpFDiv %float %209 %float_10
+        %211 = OpFAdd %float %float_0_5 %210
+               OpStore %grey %211
+               OpBranch %204
+        %206 = OpLabel
+        %212 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %213 = OpLoad %float %212
+        %214 = OpConvertFToS %int %213
+        %215 = OpSLessThan %bool %214 %int_210
+               OpSelectionMerge %216 None
+               OpBranchConditional %215 %217 %218
+        %217 = OpLabel
+        %219 = OpAccessChain %_ptr_Private_int %data %int_6
+        %220 = OpLoad %int %219
+        %221 = OpConvertSToF %float %220
+        %222 = OpFDiv %float %221 %float_10
+        %223 = OpFAdd %float %float_0_5 %222
+               OpStore %grey %223
+               OpBranch %216
+        %218 = OpLabel
+        %224 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %225 = OpLoad %float %224
+        %226 = OpConvertFToS %int %225
+        %227 = OpSLessThan %bool %226 %int_240
+               OpSelectionMerge %228 None
+               OpBranchConditional %227 %229 %230
+        %229 = OpLabel
+        %231 = OpAccessChain %_ptr_Private_int %data %int_7
+        %232 = OpLoad %int %231
+        %233 = OpConvertSToF %float %232
+        %234 = OpFDiv %float %233 %float_10
+        %235 = OpFAdd %float %float_0_5 %234
+               OpStore %grey %235
+               OpBranch %228
+        %230 = OpLabel
+        %236 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %237 = OpLoad %float %236
+        %238 = OpConvertFToS %int %237
+        %239 = OpSLessThan %bool %238 %int_270
+               OpSelectionMerge %240 None
+               OpBranchConditional %239 %241 %242
+        %241 = OpLabel
+        %243 = OpAccessChain %_ptr_Private_int %data %int_8
+        %244 = OpLoad %int %243
+        %245 = OpConvertSToF %float %244
+        %246 = OpFDiv %float %245 %float_10
+        %247 = OpFAdd %float %float_0_5 %246
+               OpStore %grey %247
+               OpBranch %240
+        %242 = OpLabel
+               OpKill
+        %240 = OpLabel
+               OpBranch %228
+        %228 = OpLabel
+               OpBranch %216
+        %216 = OpLabel
+               OpBranch %204
+        %204 = OpLabel
+               OpBranch %197
+        %197 = OpLabel
+               OpBranch %185
+        %185 = OpLabel
+               OpBranch %173
+        %173 = OpLabel
+               OpBranch %161
+        %161 = OpLabel
+               OpBranch %149
+        %149 = OpLabel
+        %248 = OpLoad %float %grey
+        %249 = OpCompositeConstruct %v3float %248 %248 %248
+        %250 = OpCompositeExtract %float %249 0
+        %251 = OpCompositeExtract %float %249 1
+        %252 = OpCompositeExtract %float %249 2
+        %253 = OpCompositeConstruct %v4float %250 %251 %252 %float_1
+               OpStore %_GLF_color %253
+               OpReturn
+               OpFunctionEnd
+%merge_i1_i1_i1_ = OpFunction %void None %35
+       %from = OpFunctionParameter %_ptr_Function_int
+        %mid = OpFunctionParameter %_ptr_Function_int
+         %to = OpFunctionParameter %_ptr_Function_int
+        %254 = OpLabel
+          %k = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+          %j = OpVariable %_ptr_Function_int Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+        %255 = OpLoad %int %from
+               OpStore %k %255
+        %256 = OpLoad %int %from
+               OpStore %i %256
+        %257 = OpLoad %int %mid
+        %258 = OpIAdd %int %257 %int_1
+               OpStore %j %258
+               OpBranch %259
+        %259 = OpLabel
+        %260 = OpFOrdGreaterThanEqual %bool %float_1 %float_0
+               OpLoopMerge %261 %262 None
+               OpBranchConditional %260 %263 %262
+        %263 = OpLabel
+        %264 = OpLoad %int %i
+        %265 = OpLoad %int %mid
+        %266 = OpSLessThanEqual %bool %264 %265
+        %267 = OpLoad %int %j
+        %268 = OpLoad %int %to
+        %269 = OpSLessThanEqual %bool %267 %268
+        %270 = OpLogicalAnd %bool %266 %269
+               OpBranchConditional %270 %271 %261
+        %271 = OpLabel
+        %272 = OpLoad %int %i
+        %273 = OpAccessChain %_ptr_Private_int %data %272
+        %274 = OpLoad %int %273
+        %275 = OpLoad %int %j
+        %276 = OpAccessChain %_ptr_Private_int %data %275
+        %277 = OpLoad %int %276
+        %278 = OpSLessThan %bool %274 %277
+               OpBranch %279
+        %279 = OpLabel
+               OpSelectionMerge %280 None
+               OpBranchConditional %278 %281 %282
+        %281 = OpLabel
+        %283 = OpLoad %int %k
+               OpBranch %280
+        %282 = OpLabel
+        %284 = OpCopyObject %int %int_0_0
+               OpBranch %280
+        %280 = OpLabel
+        %285 = OpPhi %int %283 %281 %284 %282
+        %286 = OpIAdd %int %285 %int_1
+               OpBranch %287
+        %287 = OpLabel
+               OpSelectionMerge %288 None
+               OpBranchConditional %278 %289 %288
+        %289 = OpLabel
+               OpStore %k %286
+        %290 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+        %291 = OpLoad %float %290
+        %292 = OpFUnordGreaterThan %bool %float_1 %291
+               OpBranchConditional %292 %288 %262
+        %288 = OpLabel
+               OpBranch %293
+        %293 = OpLabel
+        %294 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+        %295 = OpLoad %float %294
+        %296 = OpFOrdGreaterThanEqual %bool %295 %float_0
+               OpBranchConditional %296 %297 %262
+        %297 = OpLabel
+        %298 = OpCopyObject %int %int_0_0
+               OpBranch %299
+        %299 = OpLabel
+               OpSelectionMerge %300 None
+               OpBranchConditional %278 %301 %302
+        %301 = OpLabel
+        %303 = OpLoad %int %i
+               OpBranch %300
+        %302 = OpLabel
+        %304 = OpCopyObject %int %int_0_0
+               OpBranch %300
+        %300 = OpLabel
+        %305 = OpPhi %int %303 %301 %304 %302
+               OpBranch %306
+        %306 = OpLabel
+        %307 = OpSelect %int %278 %305 %298
+        %308 = OpIAdd %int %307 %int_1
+               OpSelectionMerge %309 None
+               OpBranchConditional %278 %310 %309
+        %310 = OpLabel
+               OpStore %i %308
+               OpBranch %309
+        %309 = OpLabel
+        %311 = OpAccessChain %_ptr_Private_int %data %307
+               OpBranch %312
+        %312 = OpLabel
+        %313 = OpCopyObject %int %int_0_0
+               OpBranch %314
+        %314 = OpLabel
+               OpSelectionMerge %315 None
+               OpBranchConditional %278 %316 %317
+        %316 = OpLabel
+        %318 = OpLoad %int %311
+        %319 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+        %320 = OpLoad %float %319
+        %321 = OpFUnordGreaterThan %bool %float_0 %320
+               OpBranchConditional %321 %262 %315
+        %317 = OpLabel
+        %322 = OpCopyObject %int %int_0_0
+        %323 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_1
+        %324 = OpLoad %float %323
+        %325 = OpFUnordGreaterThanEqual %bool %324 %float_0
+               OpBranchConditional %325 %315 %262
+        %315 = OpLabel
+        %326 = OpPhi %int %318 %316 %322 %317
+               OpBranch %327
+        %327 = OpLabel
+        %328 = OpSelect %int %278 %326 %313
+        %329 = OpAccessChain %_ptr_Private_int %temp %285
+               OpSelectionMerge %330 None
+               OpBranchConditional %278 %331 %330
+        %331 = OpLabel
+               OpStore %329 %328
+               OpBranch %330
+        %330 = OpLabel
+               OpBranch %332
+        %332 = OpLabel
+               OpSelectionMerge %333 None
+               OpBranchConditional %278 %334 %335
+        %335 = OpLabel
+        %336 = OpLoad %int %k
+               OpBranch %333
+        %334 = OpLabel
+        %337 = OpCopyObject %int %int_0_0
+               OpBranch %333
+        %333 = OpLabel
+        %338 = OpPhi %int %336 %335 %337 %334
+        %339 = OpIAdd %int %338 %int_1
+               OpSelectionMerge %340 None
+               OpBranchConditional %278 %340 %341
+        %341 = OpLabel
+               OpStore %k %339
+               OpBranch %340
+        %340 = OpLabel
+        %342 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+        %343 = OpLoad %float %342
+        %344 = OpFUnordGreaterThan %bool %float_1 %343
+               OpBranchConditional %344 %345 %262
+        %345 = OpLabel
+               OpSelectionMerge %346 None
+               OpBranchConditional %278 %347 %348
+        %348 = OpLabel
+        %349 = OpLoad %int %j
+               OpBranch %346
+        %347 = OpLabel
+        %350 = OpCopyObject %int %int_0_0
+               OpBranch %346
+        %346 = OpLabel
+        %351 = OpPhi %int %349 %348 %350 %347
+               OpBranch %352
+        %352 = OpLabel
+        %353 = OpCopyObject %int %int_0_0
+               OpBranch %354
+        %354 = OpLabel
+        %355 = OpSelect %int %278 %353 %351
+        %356 = OpIAdd %int %355 %int_1
+               OpSelectionMerge %357 None
+               OpBranchConditional %278 %357 %358
+        %358 = OpLabel
+               OpStore %j %356
+               OpBranch %357
+        %357 = OpLabel
+        %359 = OpAccessChain %_ptr_Private_int %data %355
+               OpSelectionMerge %360 None
+               OpBranchConditional %278 %361 %362
+        %362 = OpLabel
+        %363 = OpLoad %int %359
+               OpBranch %360
+        %361 = OpLabel
+        %364 = OpCopyObject %int %int_0_0
+               OpBranch %360
+        %360 = OpLabel
+        %365 = OpPhi %int %363 %362 %364 %361
+        %366 = OpAccessChain %_ptr_Private_int %temp %338
+               OpSelectionMerge %367 None
+               OpBranchConditional %278 %367 %368
+        %368 = OpLabel
+               OpStore %366 %365
+               OpBranch %367
+        %367 = OpLabel
+               OpBranch %369
+        %369 = OpLabel
+               OpBranch %262
+        %262 = OpLabel
+               OpBranch %259
+        %261 = OpLabel
+               OpBranch %370
+        %370 = OpLabel
+               OpLoopMerge %371 %372 None
+               OpBranch %373
+        %373 = OpLabel
+        %374 = OpLoad %int %i
+        %375 = OpSLessThan %bool %374 %int_10
+        %376 = OpLoad %int %i
+        %377 = OpLoad %int %mid
+        %378 = OpSLessThanEqual %bool %376 %377
+        %379 = OpLogicalAnd %bool %375 %378
+               OpBranchConditional %379 %380 %371
+        %380 = OpLabel
+        %381 = OpLoad %int %k
+        %382 = OpIAdd %int %381 %int_1
+               OpStore %k %382
+        %383 = OpLoad %int %i
+        %384 = OpIAdd %int %383 %int_1
+               OpStore %i %384
+        %385 = OpAccessChain %_ptr_Private_int %data %383
+        %386 = OpLoad %int %385
+        %387 = OpAccessChain %_ptr_Private_int %temp %381
+               OpStore %387 %386
+               OpBranch %372
+        %372 = OpLabel
+               OpBranch %370
+        %371 = OpLabel
+        %388 = OpLoad %int %from
+               OpStore %i_0 %388
+               OpBranch %389
+        %389 = OpLabel
+               OpLoopMerge %390 %391 None
+               OpBranch %392
+        %392 = OpLabel
+        %393 = OpLoad %int %i_0
+        %394 = OpLoad %int %to
+        %395 = OpSLessThanEqual %bool %393 %394
+               OpBranchConditional %395 %396 %390
+        %396 = OpLabel
+        %397 = OpLoad %int %i_0
+        %398 = OpLoad %int %i_0
+        %399 = OpAccessChain %_ptr_Private_int %temp %398
+        %400 = OpLoad %int %399
+        %401 = OpAccessChain %_ptr_Private_int %data %397
+               OpStore %401 %400
+               OpBranch %391
+        %391 = OpLabel
+        %402 = OpLoad %int %i_0
+        %403 = OpIAdd %int %402 %int_1
+               OpStore %i_0 %403
+               OpBranch %389
+        %390 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %mergeSort_ = OpFunction %void None %32
+        %404 = OpLabel
+        %low = OpVariable %_ptr_Function_int Function
+       %high = OpVariable %_ptr_Function_int Function
+          %m = OpVariable %_ptr_Function_int Function
+        %i_1 = OpVariable %_ptr_Function_int Function
+     %from_0 = OpVariable %_ptr_Function_int Function
+      %mid_0 = OpVariable %_ptr_Function_int Function
+       %to_0 = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_int Function
+    %param_0 = OpVariable %_ptr_Function_int Function
+    %param_1 = OpVariable %_ptr_Function_int Function
+               OpStore %low %int_0
+               OpStore %high %int_9
+               OpStore %m %int_1
+               OpBranch %405
+        %405 = OpLabel
+               OpLoopMerge %406 %407 None
+               OpBranch %408
+        %408 = OpLabel
+        %409 = OpLoad %int %m
+        %410 = OpLoad %int %high
+        %411 = OpSLessThanEqual %bool %409 %410
+               OpBranchConditional %411 %412 %406
+        %412 = OpLabel
+        %413 = OpLoad %int %low
+               OpStore %i_1 %413
+               OpBranch %414
+        %414 = OpLabel
+               OpLoopMerge %415 %416 None
+               OpBranch %417
+        %417 = OpLabel
+        %418 = OpLoad %int %i_1
+        %419 = OpLoad %int %high
+        %420 = OpSLessThan %bool %418 %419
+               OpBranchConditional %420 %421 %415
+        %421 = OpLabel
+        %422 = OpLoad %int %i_1
+               OpStore %from_0 %422
+        %423 = OpLoad %int %i_1
+        %424 = OpLoad %int %m
+        %425 = OpIAdd %int %423 %424
+        %426 = OpISub %int %425 %int_1
+               OpStore %mid_0 %426
+        %427 = OpLoad %int %i_1
+        %428 = OpLoad %int %m
+        %429 = OpIMul %int %int_2 %428
+        %430 = OpIAdd %int %427 %429
+        %431 = OpISub %int %430 %int_1
+        %432 = OpLoad %int %high
+        %433 = OpExtInst %int %1 SMin %431 %432
+               OpStore %to_0 %433
+        %434 = OpLoad %int %from_0
+               OpStore %param %434
+        %435 = OpLoad %int %mid_0
+               OpStore %param_0 %435
+        %436 = OpLoad %int %to_0
+               OpStore %param_1 %436
+        %437 = OpFunctionCall %void %merge_i1_i1_i1_ %param %param_0 %param_1
+               OpBranch %416
+        %416 = OpLabel
+        %438 = OpLoad %int %m
+        %439 = OpIMul %int %int_2 %438
+        %440 = OpLoad %int %i_1
+        %441 = OpIAdd %int %440 %439
+               OpStore %i_1 %441
+               OpBranch %414
+        %415 = OpLabel
+               OpBranch %407
+        %407 = OpLabel
+        %442 = OpLoad %int %m
+        %443 = OpIMul %int %int_2 %442
+               OpStore %m %443
+               OpBranch %405
+        %406 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/2-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/2-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..9cf6e4b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/2-opt.spvasm.expected.hlsl
@@ -0,0 +1,372 @@
+static int data[10] = (int[10])0;
+static int temp[10] = (int[10])0;
+cbuffer cbuffer_x_28 : register(b0, space0) {
+  uint4 x_28[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void merge_i1_i1_i1_(inout int from, inout int mid, inout int to) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  const int x_255 = from;
+  k = x_255;
+  const int x_256 = from;
+  i = x_256;
+  const int x_257 = mid;
+  j = (x_257 + 1);
+  while (true) {
+    int x_283 = 0;
+    int x_284 = 0;
+    int x_303 = 0;
+    int x_304 = 0;
+    int x_318 = 0;
+    int x_322 = 0;
+    int x_337 = 0;
+    int x_336 = 0;
+    int x_350 = 0;
+    int x_349 = 0;
+    int x_364 = 0;
+    int x_363 = 0;
+    int x_285_phi = 0;
+    int x_305_phi = 0;
+    int x_326_phi = 0;
+    int x_338_phi = 0;
+    int x_351_phi = 0;
+    int x_365_phi = 0;
+    if ((1.0f >= 0.0f)) {
+    } else {
+      continue;
+    }
+    const int x_264 = i;
+    const int x_265 = mid;
+    const int x_267 = j;
+    const int x_268 = to;
+    bool tint_tmp = (x_264 <= x_265);
+    if (tint_tmp) {
+      tint_tmp = (x_267 <= x_268);
+    }
+    if ((tint_tmp)) {
+    } else {
+      break;
+    }
+    const int x_274 = data[i];
+    const int x_277 = data[j];
+    const bool x_278 = (x_274 < x_277);
+    if (x_278) {
+      x_283 = k;
+      x_285_phi = x_283;
+    } else {
+      x_284 = 0;
+      x_285_phi = x_284;
+    }
+    const int x_285 = x_285_phi;
+    const int x_286 = (x_285 + 1);
+    if (x_278) {
+      k = x_286;
+      const float x_291 = asfloat(x_28[0].x);
+      if (!((1.0f <= x_291))) {
+      } else {
+        continue;
+      }
+    }
+    const float x_295 = asfloat(x_28[0].y);
+    if ((x_295 >= 0.0f)) {
+    } else {
+      continue;
+    }
+    const int x_298 = 0;
+    if (x_278) {
+      x_303 = i;
+      x_305_phi = x_303;
+    } else {
+      x_304 = 0;
+      x_305_phi = x_304;
+    }
+    const int x_307 = (x_278 ? x_305_phi : x_298);
+    if (x_278) {
+      i = (x_307 + 1);
+    }
+    const int x_313 = 0;
+    if (x_278) {
+      x_318 = data[x_307];
+      const float x_320 = asfloat(x_28[0].y);
+      x_326_phi = x_318;
+      if (!((0.0f <= x_320))) {
+        continue;
+      }
+    } else {
+      x_322 = 0;
+      const float x_324 = asfloat(x_28[0].y);
+      x_326_phi = x_322;
+      if (!((x_324 < 0.0f))) {
+      } else {
+        continue;
+      }
+    }
+    const int x_326 = x_326_phi;
+    if (x_278) {
+      temp[x_285] = (x_278 ? x_326 : x_313);
+    }
+    if (x_278) {
+      x_337 = 0;
+      x_338_phi = x_337;
+    } else {
+      x_336 = k;
+      x_338_phi = x_336;
+    }
+    const int x_338 = x_338_phi;
+    if (x_278) {
+    } else {
+      k = (x_338 + 1);
+    }
+    const float x_343 = asfloat(x_28[0].x);
+    if (!((1.0f <= x_343))) {
+    } else {
+      continue;
+    }
+    if (x_278) {
+      x_350 = 0;
+      x_351_phi = x_350;
+    } else {
+      x_349 = j;
+      x_351_phi = x_349;
+    }
+    const int x_355 = (x_278 ? 0 : x_351_phi);
+    if (x_278) {
+    } else {
+      j = (x_355 + 1);
+    }
+    if (x_278) {
+      x_364 = 0;
+      x_365_phi = x_364;
+    } else {
+      x_363 = data[x_355];
+      x_365_phi = x_363;
+    }
+    const int x_365 = x_365_phi;
+    if (x_278) {
+    } else {
+      temp[x_338] = x_365;
+    }
+  }
+  while (true) {
+    const int x_374 = i;
+    const int x_376 = i;
+    const int x_377 = mid;
+    bool tint_tmp_1 = (x_374 < 10);
+    if (tint_tmp_1) {
+      tint_tmp_1 = (x_376 <= x_377);
+    }
+    if ((tint_tmp_1)) {
+    } else {
+      break;
+    }
+    const int x_381 = k;
+    k = (x_381 + 1);
+    const int x_383 = i;
+    i = (x_383 + 1);
+    const int x_386 = data[x_383];
+    temp[x_381] = x_386;
+  }
+  const int x_388 = from;
+  i_1 = x_388;
+  while (true) {
+    const int x_393 = i_1;
+    const int x_394 = to;
+    if ((x_393 <= x_394)) {
+    } else {
+      break;
+    }
+    const int x_397 = i_1;
+    const int x_400 = temp[i_1];
+    data[x_397] = x_400;
+    {
+      i_1 = (i_1 + 1);
+    }
+  }
+  return;
+}
+
+void mergeSort_() {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  {
+    for(; (m <= high); m = (2 * m)) {
+      i_2 = low;
+      {
+        for(; (i_2 < high); i_2 = (i_2 + (2 * m))) {
+          from_1 = i_2;
+          mid_1 = ((i_2 + m) - 1);
+          to_1 = min(((i_2 + (2 * m)) - 1), high);
+          param = from_1;
+          param_1 = mid_1;
+          param_2 = to_1;
+          merge_i1_i1_i1_(param, param_1, param_2);
+        }
+      }
+    }
+  }
+  return;
+}
+
+void main_1() {
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  const float x_88 = asfloat(x_28[0].x);
+  i_3 = int(x_88);
+  while (true) {
+    switch(i_3) {
+      case 9: {
+        data[i_3] = -5;
+        break;
+      }
+      case 8: {
+        data[i_3] = -4;
+        break;
+      }
+      case 7: {
+        data[i_3] = -3;
+        break;
+      }
+      case 6: {
+        data[i_3] = -2;
+        break;
+      }
+      case 5: {
+        data[i_3] = -1;
+        break;
+      }
+      case 4: {
+        data[i_3] = 0;
+        break;
+      }
+      case 3: {
+        data[i_3] = 1;
+        break;
+      }
+      case 2: {
+        data[i_3] = 2;
+        break;
+      }
+      case 1: {
+        data[i_3] = 3;
+        break;
+      }
+      case 0: {
+        data[i_3] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    i_3 = (i_3 + 1);
+    {
+      if ((i_3 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  {
+    for(; (j_1 < 10); j_1 = (j_1 + 1)) {
+      const int x_137 = j_1;
+      const int x_140 = data[j_1];
+      temp[x_137] = x_140;
+    }
+  }
+  mergeSort_();
+  const float x_146 = gl_FragCoord.y;
+  if ((int(x_146) < 30)) {
+    const int x_153 = data[0];
+    grey = (0.5f + (float(x_153) / 10.0f));
+  } else {
+    const float x_158 = gl_FragCoord.y;
+    if ((int(x_158) < 60)) {
+      const int x_165 = data[1];
+      grey = (0.5f + (float(x_165) / 10.0f));
+    } else {
+      const float x_170 = gl_FragCoord.y;
+      if ((int(x_170) < 90)) {
+        const int x_177 = data[2];
+        grey = (0.5f + (float(x_177) / 10.0f));
+      } else {
+        const float x_182 = gl_FragCoord.y;
+        if ((int(x_182) < 120)) {
+          const int x_189 = data[3];
+          grey = (0.5f + (float(x_189) / 10.0f));
+        } else {
+          const float x_194 = gl_FragCoord.y;
+          if ((int(x_194) < 150)) {
+            discard;
+          } else {
+            const float x_201 = gl_FragCoord.y;
+            if ((int(x_201) < 180)) {
+              const int x_208 = data[5];
+              grey = (0.5f + (float(x_208) / 10.0f));
+            } else {
+              const float x_213 = gl_FragCoord.y;
+              if ((int(x_213) < 210)) {
+                const int x_220 = data[6];
+                grey = (0.5f + (float(x_220) / 10.0f));
+              } else {
+                const float x_225 = gl_FragCoord.y;
+                if ((int(x_225) < 240)) {
+                  const int x_232 = data[7];
+                  grey = (0.5f + (float(x_232) / 10.0f));
+                } else {
+                  const float x_237 = gl_FragCoord.y;
+                  if ((int(x_237) < 270)) {
+                    const int x_244 = data[8];
+                    grey = (0.5f + (float(x_244) / 10.0f));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  const float x_248 = grey;
+  const float3 x_249 = float3(x_248, x_248, x_248);
+  x_GLF_color = float4(x_249.x, x_249.y, x_249.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/2-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/2-opt.spvasm.expected.msl
new file mode 100644
index 0000000..c3a165b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/2-opt.spvasm.expected.msl
@@ -0,0 +1,421 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void merge_i1_i1_i1_(constant buf0& x_28, thread int* const from, thread int* const mid, thread int* const to, thread tint_array_wrapper* const tint_symbol_5, thread tint_array_wrapper* const tint_symbol_6) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  int const x_255 = *(from);
+  k = x_255;
+  int const x_256 = *(from);
+  i = x_256;
+  int const x_257 = *(mid);
+  j = (x_257 + 1);
+  while (true) {
+    int x_283 = 0;
+    int x_284 = 0;
+    int x_303 = 0;
+    int x_304 = 0;
+    int x_318 = 0;
+    int x_322 = 0;
+    int x_337 = 0;
+    int x_336 = 0;
+    int x_350 = 0;
+    int x_349 = 0;
+    int x_364 = 0;
+    int x_363 = 0;
+    int x_285_phi = 0;
+    int x_305_phi = 0;
+    int x_326_phi = 0;
+    int x_338_phi = 0;
+    int x_351_phi = 0;
+    int x_365_phi = 0;
+    if ((1.0f >= 0.0f)) {
+    } else {
+      continue;
+    }
+    int const x_264 = i;
+    int const x_265 = *(mid);
+    int const x_267 = j;
+    int const x_268 = *(to);
+    if (((x_264 <= x_265) && (x_267 <= x_268))) {
+    } else {
+      break;
+    }
+    int const x_272 = i;
+    int const x_274 = (*(tint_symbol_5)).arr[x_272];
+    int const x_275 = j;
+    int const x_277 = (*(tint_symbol_5)).arr[x_275];
+    bool const x_278 = (x_274 < x_277);
+    if (x_278) {
+      x_283 = k;
+      x_285_phi = x_283;
+    } else {
+      x_284 = 0;
+      x_285_phi = x_284;
+    }
+    int const x_285 = x_285_phi;
+    int const x_286 = (x_285 + 1);
+    if (x_278) {
+      k = x_286;
+      float const x_291 = x_28.injectionSwitch.x;
+      if (!((1.0f <= x_291))) {
+      } else {
+        continue;
+      }
+    }
+    float const x_295 = x_28.injectionSwitch.y;
+    if ((x_295 >= 0.0f)) {
+    } else {
+      continue;
+    }
+    int const x_298 = 0;
+    if (x_278) {
+      x_303 = i;
+      x_305_phi = x_303;
+    } else {
+      x_304 = 0;
+      x_305_phi = x_304;
+    }
+    int const x_305 = x_305_phi;
+    int const x_307 = select(x_298, x_305, x_278);
+    if (x_278) {
+      i = (x_307 + 1);
+    }
+    int const x_313 = 0;
+    if (x_278) {
+      x_318 = (*(tint_symbol_5)).arr[x_307];
+      float const x_320 = x_28.injectionSwitch.y;
+      x_326_phi = x_318;
+      if (!((0.0f <= x_320))) {
+        continue;
+      }
+    } else {
+      x_322 = 0;
+      float const x_324 = x_28.injectionSwitch.y;
+      x_326_phi = x_322;
+      if (!((x_324 < 0.0f))) {
+      } else {
+        continue;
+      }
+    }
+    int const x_326 = x_326_phi;
+    if (x_278) {
+      (*(tint_symbol_6)).arr[x_285] = select(x_313, x_326, x_278);
+    }
+    if (x_278) {
+      x_337 = 0;
+      x_338_phi = x_337;
+    } else {
+      x_336 = k;
+      x_338_phi = x_336;
+    }
+    int const x_338 = x_338_phi;
+    if (x_278) {
+    } else {
+      k = (x_338 + 1);
+    }
+    float const x_343 = x_28.injectionSwitch.x;
+    if (!((1.0f <= x_343))) {
+    } else {
+      continue;
+    }
+    if (x_278) {
+      x_350 = 0;
+      x_351_phi = x_350;
+    } else {
+      x_349 = j;
+      x_351_phi = x_349;
+    }
+    int const x_351 = x_351_phi;
+    int const x_353 = 0;
+    int const x_355 = select(x_351, x_353, x_278);
+    if (x_278) {
+    } else {
+      j = (x_355 + 1);
+    }
+    if (x_278) {
+      x_364 = 0;
+      x_365_phi = x_364;
+    } else {
+      x_363 = (*(tint_symbol_5)).arr[x_355];
+      x_365_phi = x_363;
+    }
+    int const x_365 = x_365_phi;
+    if (x_278) {
+    } else {
+      (*(tint_symbol_6)).arr[x_338] = x_365;
+    }
+  }
+  while (true) {
+    int const x_374 = i;
+    int const x_376 = i;
+    int const x_377 = *(mid);
+    if (((x_374 < 10) && (x_376 <= x_377))) {
+    } else {
+      break;
+    }
+    int const x_381 = k;
+    k = (x_381 + 1);
+    int const x_383 = i;
+    i = (x_383 + 1);
+    int const x_386 = (*(tint_symbol_5)).arr[x_383];
+    (*(tint_symbol_6)).arr[x_381] = x_386;
+  }
+  int const x_388 = *(from);
+  i_1 = x_388;
+  while (true) {
+    int const x_393 = i_1;
+    int const x_394 = *(to);
+    if ((x_393 <= x_394)) {
+    } else {
+      break;
+    }
+    int const x_397 = i_1;
+    int const x_398 = i_1;
+    int const x_400 = (*(tint_symbol_6)).arr[x_398];
+    (*(tint_symbol_5)).arr[x_397] = x_400;
+    {
+      int const x_402 = i_1;
+      i_1 = (x_402 + 1);
+    }
+  }
+  return;
+}
+
+void mergeSort_(constant buf0& x_28, thread tint_array_wrapper* const tint_symbol_7, thread tint_array_wrapper* const tint_symbol_8) {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  while (true) {
+    int const x_409 = m;
+    int const x_410 = high;
+    if ((x_409 <= x_410)) {
+    } else {
+      break;
+    }
+    int const x_413 = low;
+    i_2 = x_413;
+    while (true) {
+      int const x_418 = i_2;
+      int const x_419 = high;
+      if ((x_418 < x_419)) {
+      } else {
+        break;
+      }
+      int const x_422 = i_2;
+      from_1 = x_422;
+      int const x_423 = i_2;
+      int const x_424 = m;
+      mid_1 = ((x_423 + x_424) - 1);
+      int const x_427 = i_2;
+      int const x_428 = m;
+      int const x_432 = high;
+      to_1 = min(((x_427 + (2 * x_428)) - 1), x_432);
+      int const x_434 = from_1;
+      param = x_434;
+      int const x_435 = mid_1;
+      param_1 = x_435;
+      int const x_436 = to_1;
+      param_2 = x_436;
+      merge_i1_i1_i1_(x_28, &(param), &(param_1), &(param_2), tint_symbol_7, tint_symbol_8);
+      {
+        int const x_438 = m;
+        int const x_440 = i_2;
+        i_2 = (x_440 + (2 * x_438));
+      }
+    }
+    {
+      int const x_442 = m;
+      m = (2 * x_442);
+    }
+  }
+  return;
+}
+
+void main_1(constant buf0& x_28, thread tint_array_wrapper* const tint_symbol_9, thread tint_array_wrapper* const tint_symbol_10, thread float4* const tint_symbol_11, thread float4* const tint_symbol_12) {
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  float const x_88 = x_28.injectionSwitch.x;
+  i_3 = int(x_88);
+  while (true) {
+    int const x_94 = i_3;
+    switch(x_94) {
+      case 9: {
+        int const x_124 = i_3;
+        (*(tint_symbol_9)).arr[x_124] = -5;
+        break;
+      }
+      case 8: {
+        int const x_122 = i_3;
+        (*(tint_symbol_9)).arr[x_122] = -4;
+        break;
+      }
+      case 7: {
+        int const x_120 = i_3;
+        (*(tint_symbol_9)).arr[x_120] = -3;
+        break;
+      }
+      case 6: {
+        int const x_118 = i_3;
+        (*(tint_symbol_9)).arr[x_118] = -2;
+        break;
+      }
+      case 5: {
+        int const x_116 = i_3;
+        (*(tint_symbol_9)).arr[x_116] = -1;
+        break;
+      }
+      case 4: {
+        int const x_114 = i_3;
+        (*(tint_symbol_9)).arr[x_114] = 0;
+        break;
+      }
+      case 3: {
+        int const x_112 = i_3;
+        (*(tint_symbol_9)).arr[x_112] = 1;
+        break;
+      }
+      case 2: {
+        int const x_110 = i_3;
+        (*(tint_symbol_9)).arr[x_110] = 2;
+        break;
+      }
+      case 1: {
+        int const x_108 = i_3;
+        (*(tint_symbol_9)).arr[x_108] = 3;
+        break;
+      }
+      case 0: {
+        int const x_106 = i_3;
+        (*(tint_symbol_9)).arr[x_106] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    int const x_126 = i_3;
+    i_3 = (x_126 + 1);
+    {
+      int const x_128 = i_3;
+      if ((x_128 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  while (true) {
+    int const x_134 = j_1;
+    if ((x_134 < 10)) {
+    } else {
+      break;
+    }
+    int const x_137 = j_1;
+    int const x_138 = j_1;
+    int const x_140 = (*(tint_symbol_9)).arr[x_138];
+    (*(tint_symbol_10)).arr[x_137] = x_140;
+    {
+      int const x_142 = j_1;
+      j_1 = (x_142 + 1);
+    }
+  }
+  mergeSort_(x_28, tint_symbol_9, tint_symbol_10);
+  float const x_146 = (*(tint_symbol_11)).y;
+  if ((int(x_146) < 30)) {
+    int const x_153 = (*(tint_symbol_9)).arr[0];
+    grey = (0.5f + (float(x_153) / 10.0f));
+  } else {
+    float const x_158 = (*(tint_symbol_11)).y;
+    if ((int(x_158) < 60)) {
+      int const x_165 = (*(tint_symbol_9)).arr[1];
+      grey = (0.5f + (float(x_165) / 10.0f));
+    } else {
+      float const x_170 = (*(tint_symbol_11)).y;
+      if ((int(x_170) < 90)) {
+        int const x_177 = (*(tint_symbol_9)).arr[2];
+        grey = (0.5f + (float(x_177) / 10.0f));
+      } else {
+        float const x_182 = (*(tint_symbol_11)).y;
+        if ((int(x_182) < 120)) {
+          int const x_189 = (*(tint_symbol_9)).arr[3];
+          grey = (0.5f + (float(x_189) / 10.0f));
+        } else {
+          float const x_194 = (*(tint_symbol_11)).y;
+          if ((int(x_194) < 150)) {
+            discard_fragment();
+          } else {
+            float const x_201 = (*(tint_symbol_11)).y;
+            if ((int(x_201) < 180)) {
+              int const x_208 = (*(tint_symbol_9)).arr[5];
+              grey = (0.5f + (float(x_208) / 10.0f));
+            } else {
+              float const x_213 = (*(tint_symbol_11)).y;
+              if ((int(x_213) < 210)) {
+                int const x_220 = (*(tint_symbol_9)).arr[6];
+                grey = (0.5f + (float(x_220) / 10.0f));
+              } else {
+                float const x_225 = (*(tint_symbol_11)).y;
+                if ((int(x_225) < 240)) {
+                  int const x_232 = (*(tint_symbol_9)).arr[7];
+                  grey = (0.5f + (float(x_232) / 10.0f));
+                } else {
+                  float const x_237 = (*(tint_symbol_11)).y;
+                  if ((int(x_237) < 270)) {
+                    int const x_244 = (*(tint_symbol_9)).arr[8];
+                    grey = (0.5f + (float(x_244) / 10.0f));
+                  } else {
+                    discard_fragment();
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  float const x_248 = grey;
+  float3 const x_249 = float3(x_248, x_248, x_248);
+  *(tint_symbol_12) = float4(x_249.x, x_249.y, x_249.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_28 [[buffer(0)]]) {
+  thread float4 tint_symbol_13 = 0.0f;
+  thread tint_array_wrapper tint_symbol_14 = {};
+  thread tint_array_wrapper tint_symbol_15 = {};
+  thread float4 tint_symbol_16 = 0.0f;
+  tint_symbol_13 = gl_FragCoord_param;
+  main_1(x_28, &(tint_symbol_14), &(tint_symbol_15), &(tint_symbol_13), &(tint_symbol_16));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_16};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/2-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/2-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..338bca8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/2-opt.spvasm.expected.spvasm
@@ -0,0 +1,862 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 523
+; Schema: 0
+               OpCapability Shader
+        %288 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %data "data"
+               OpName %temp "temp"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_28 "x_28"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %merge_i1_i1_i1_ "merge_i1_i1_i1_"
+               OpName %from "from"
+               OpName %mid "mid"
+               OpName %to "to"
+               OpName %k "k"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %i_1 "i_1"
+               OpName %x_283 "x_283"
+               OpName %x_284 "x_284"
+               OpName %x_303 "x_303"
+               OpName %x_304 "x_304"
+               OpName %x_318 "x_318"
+               OpName %x_322 "x_322"
+               OpName %x_337 "x_337"
+               OpName %x_336 "x_336"
+               OpName %x_350 "x_350"
+               OpName %x_349 "x_349"
+               OpName %x_364 "x_364"
+               OpName %x_363 "x_363"
+               OpName %x_285_phi "x_285_phi"
+               OpName %x_305_phi "x_305_phi"
+               OpName %x_326_phi "x_326_phi"
+               OpName %x_338_phi "x_338_phi"
+               OpName %x_351_phi "x_351_phi"
+               OpName %x_365_phi "x_365_phi"
+               OpName %mergeSort_ "mergeSort_"
+               OpName %low "low"
+               OpName %high "high"
+               OpName %m "m"
+               OpName %i_2 "i_2"
+               OpName %from_1 "from_1"
+               OpName %mid_1 "mid_1"
+               OpName %to_1 "to_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %main_1 "main_1"
+               OpName %i_3 "i_3"
+               OpName %j_1 "j_1"
+               OpName %grey "grey"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_28 NonWritable
+               OpDecorate %x_28 DescriptorSet 0
+               OpDecorate %x_28 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Private__arr_int_uint_10 = OpTypePointer Private %_arr_int_uint_10
+          %7 = OpConstantNull %_arr_int_uint_10
+       %data = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+       %temp = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_28 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %17
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int %_ptr_Function_int
+         %32 = OpConstantNull %int
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+%_ptr_Private_int = OpTypePointer Private %int
+      %int_0 = OpConstant %int 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+     %int_10 = OpConstant %int 10
+        %244 = OpTypeFunction %void
+      %int_9 = OpConstant %int 9
+      %int_2 = OpConstant %int 2
+%_ptr_Function_float = OpTypePointer Function %float
+        %312 = OpConstantNull %float
+     %int_n5 = OpConstant %int -5
+     %int_n4 = OpConstant %int -4
+     %int_n3 = OpConstant %int -3
+     %int_n2 = OpConstant %int -2
+     %int_n1 = OpConstant %int -1
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+%_ptr_Private_float = OpTypePointer Private %float
+     %int_30 = OpConstant %int 30
+  %float_0_5 = OpConstant %float 0.5
+   %float_10 = OpConstant %float 10
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+    %v3float = OpTypeVector %float 3
+   %main_out = OpTypeStruct %v4float
+        %510 = OpTypeFunction %void %main_out
+%merge_i1_i1_i1_ = OpFunction %void None %23
+       %from = OpFunctionParameter %_ptr_Function_int
+        %mid = OpFunctionParameter %_ptr_Function_int
+         %to = OpFunctionParameter %_ptr_Function_int
+         %30 = OpLabel
+          %k = OpVariable %_ptr_Function_int Function %32
+          %i = OpVariable %_ptr_Function_int Function %32
+          %j = OpVariable %_ptr_Function_int Function %32
+        %i_1 = OpVariable %_ptr_Function_int Function %32
+      %x_283 = OpVariable %_ptr_Function_int Function %32
+      %x_284 = OpVariable %_ptr_Function_int Function %32
+      %x_303 = OpVariable %_ptr_Function_int Function %32
+      %x_304 = OpVariable %_ptr_Function_int Function %32
+      %x_318 = OpVariable %_ptr_Function_int Function %32
+      %x_322 = OpVariable %_ptr_Function_int Function %32
+      %x_337 = OpVariable %_ptr_Function_int Function %32
+      %x_336 = OpVariable %_ptr_Function_int Function %32
+      %x_350 = OpVariable %_ptr_Function_int Function %32
+      %x_349 = OpVariable %_ptr_Function_int Function %32
+      %x_364 = OpVariable %_ptr_Function_int Function %32
+      %x_363 = OpVariable %_ptr_Function_int Function %32
+  %x_285_phi = OpVariable %_ptr_Function_int Function %32
+  %x_305_phi = OpVariable %_ptr_Function_int Function %32
+  %x_326_phi = OpVariable %_ptr_Function_int Function %32
+  %x_338_phi = OpVariable %_ptr_Function_int Function %32
+  %x_351_phi = OpVariable %_ptr_Function_int Function %32
+  %x_365_phi = OpVariable %_ptr_Function_int Function %32
+         %37 = OpLoad %int %from
+               OpStore %k %37
+         %39 = OpLoad %int %from
+               OpStore %i %39
+         %41 = OpLoad %int %mid
+         %43 = OpIAdd %int %41 %int_1
+               OpStore %j %43
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %68 = OpFOrdGreaterThanEqual %bool %float_1 %float_0
+               OpSelectionMerge %70 None
+               OpBranchConditional %68 %71 %72
+         %71 = OpLabel
+               OpBranch %70
+         %72 = OpLabel
+               OpBranch %46
+         %70 = OpLabel
+         %73 = OpLoad %int %i
+         %75 = OpLoad %int %mid
+         %76 = OpLoad %int %j
+         %78 = OpLoad %int %to
+         %79 = OpSLessThanEqual %bool %73 %75
+               OpSelectionMerge %80 None
+               OpBranchConditional %79 %81 %80
+         %81 = OpLabel
+         %82 = OpSLessThanEqual %bool %76 %78
+               OpBranch %80
+         %80 = OpLabel
+         %83 = OpPhi %bool %79 %70 %82 %81
+               OpSelectionMerge %84 None
+               OpBranchConditional %83 %85 %86
+         %85 = OpLabel
+               OpBranch %84
+         %86 = OpLabel
+               OpBranch %45
+         %84 = OpLabel
+         %87 = OpLoad %int %i
+         %89 = OpAccessChain %_ptr_Private_int %data %87
+         %90 = OpLoad %int %89
+         %91 = OpLoad %int %j
+         %92 = OpAccessChain %_ptr_Private_int %data %91
+         %93 = OpLoad %int %92
+         %94 = OpSLessThan %bool %90 %93
+               OpSelectionMerge %95 None
+               OpBranchConditional %94 %96 %97
+         %96 = OpLabel
+         %98 = OpLoad %int %k
+               OpStore %x_283 %98
+         %99 = OpLoad %int %x_283
+               OpStore %x_285_phi %99
+               OpBranch %95
+         %97 = OpLabel
+               OpStore %x_284 %int_0
+        %101 = OpLoad %int %x_284
+               OpStore %x_285_phi %101
+               OpBranch %95
+         %95 = OpLabel
+        %102 = OpLoad %int %x_285_phi
+        %103 = OpIAdd %int %102 %int_1
+               OpSelectionMerge %104 None
+               OpBranchConditional %94 %105 %104
+        %105 = OpLabel
+               OpStore %k %103
+        %108 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_0
+        %109 = OpLoad %float %108
+        %111 = OpFOrdLessThanEqual %bool %float_1 %109
+        %110 = OpLogicalNot %bool %111
+               OpSelectionMerge %112 None
+               OpBranchConditional %110 %113 %114
+        %113 = OpLabel
+               OpBranch %112
+        %114 = OpLabel
+               OpBranch %46
+        %112 = OpLabel
+               OpBranch %104
+        %104 = OpLabel
+        %116 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_1
+        %117 = OpLoad %float %116
+        %118 = OpFOrdGreaterThanEqual %bool %117 %float_0
+               OpSelectionMerge %119 None
+               OpBranchConditional %118 %120 %121
+        %120 = OpLabel
+               OpBranch %119
+        %121 = OpLabel
+               OpBranch %46
+        %119 = OpLabel
+               OpSelectionMerge %122 None
+               OpBranchConditional %94 %123 %124
+        %123 = OpLabel
+        %125 = OpLoad %int %i
+               OpStore %x_303 %125
+        %126 = OpLoad %int %x_303
+               OpStore %x_305_phi %126
+               OpBranch %122
+        %124 = OpLabel
+               OpStore %x_304 %int_0
+        %127 = OpLoad %int %x_304
+               OpStore %x_305_phi %127
+               OpBranch %122
+        %122 = OpLabel
+        %128 = OpLoad %int %x_305_phi
+        %129 = OpSelect %int %94 %128 %int_0
+               OpSelectionMerge %130 None
+               OpBranchConditional %94 %131 %130
+        %131 = OpLabel
+        %132 = OpIAdd %int %129 %int_1
+               OpStore %i %132
+               OpBranch %130
+        %130 = OpLabel
+               OpSelectionMerge %133 None
+               OpBranchConditional %94 %134 %135
+        %134 = OpLabel
+        %136 = OpAccessChain %_ptr_Private_int %data %129
+        %137 = OpLoad %int %136
+               OpStore %x_318 %137
+        %138 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_1
+        %139 = OpLoad %float %138
+        %140 = OpLoad %int %x_318
+               OpStore %x_326_phi %140
+        %142 = OpFOrdLessThanEqual %bool %float_0 %139
+        %141 = OpLogicalNot %bool %142
+               OpSelectionMerge %143 None
+               OpBranchConditional %141 %144 %143
+        %144 = OpLabel
+               OpBranch %46
+        %143 = OpLabel
+               OpBranch %133
+        %135 = OpLabel
+               OpStore %x_322 %int_0
+        %145 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_1
+        %146 = OpLoad %float %145
+        %147 = OpLoad %int %x_322
+               OpStore %x_326_phi %147
+        %149 = OpFOrdLessThan %bool %146 %float_0
+        %148 = OpLogicalNot %bool %149
+               OpSelectionMerge %150 None
+               OpBranchConditional %148 %151 %152
+        %151 = OpLabel
+               OpBranch %150
+        %152 = OpLabel
+               OpBranch %46
+        %150 = OpLabel
+               OpBranch %133
+        %133 = OpLabel
+        %153 = OpLoad %int %x_326_phi
+               OpSelectionMerge %154 None
+               OpBranchConditional %94 %155 %154
+        %155 = OpLabel
+        %156 = OpAccessChain %_ptr_Private_int %temp %102
+        %157 = OpSelect %int %94 %153 %int_0
+               OpStore %156 %157
+               OpBranch %154
+        %154 = OpLabel
+               OpSelectionMerge %158 None
+               OpBranchConditional %94 %159 %160
+        %159 = OpLabel
+               OpStore %x_337 %int_0
+        %161 = OpLoad %int %x_337
+               OpStore %x_338_phi %161
+               OpBranch %158
+        %160 = OpLabel
+        %162 = OpLoad %int %k
+               OpStore %x_336 %162
+        %163 = OpLoad %int %x_336
+               OpStore %x_338_phi %163
+               OpBranch %158
+        %158 = OpLabel
+        %164 = OpLoad %int %x_338_phi
+               OpSelectionMerge %165 None
+               OpBranchConditional %94 %166 %167
+        %166 = OpLabel
+               OpBranch %165
+        %167 = OpLabel
+        %168 = OpIAdd %int %164 %int_1
+               OpStore %k %168
+               OpBranch %165
+        %165 = OpLabel
+        %169 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_0
+        %170 = OpLoad %float %169
+        %172 = OpFOrdLessThanEqual %bool %float_1 %170
+        %171 = OpLogicalNot %bool %172
+               OpSelectionMerge %173 None
+               OpBranchConditional %171 %174 %175
+        %174 = OpLabel
+               OpBranch %173
+        %175 = OpLabel
+               OpBranch %46
+        %173 = OpLabel
+               OpSelectionMerge %176 None
+               OpBranchConditional %94 %177 %178
+        %177 = OpLabel
+               OpStore %x_350 %int_0
+        %179 = OpLoad %int %x_350
+               OpStore %x_351_phi %179
+               OpBranch %176
+        %178 = OpLabel
+        %180 = OpLoad %int %j
+               OpStore %x_349 %180
+        %181 = OpLoad %int %x_349
+               OpStore %x_351_phi %181
+               OpBranch %176
+        %176 = OpLabel
+        %182 = OpLoad %int %x_351_phi
+        %183 = OpSelect %int %94 %int_0 %182
+               OpSelectionMerge %184 None
+               OpBranchConditional %94 %185 %186
+        %185 = OpLabel
+               OpBranch %184
+        %186 = OpLabel
+        %187 = OpIAdd %int %183 %int_1
+               OpStore %j %187
+               OpBranch %184
+        %184 = OpLabel
+               OpSelectionMerge %188 None
+               OpBranchConditional %94 %189 %190
+        %189 = OpLabel
+               OpStore %x_364 %int_0
+        %191 = OpLoad %int %x_364
+               OpStore %x_365_phi %191
+               OpBranch %188
+        %190 = OpLabel
+        %192 = OpAccessChain %_ptr_Private_int %data %183
+        %193 = OpLoad %int %192
+               OpStore %x_363 %193
+        %194 = OpLoad %int %x_363
+               OpStore %x_365_phi %194
+               OpBranch %188
+        %188 = OpLabel
+        %195 = OpLoad %int %x_365_phi
+               OpSelectionMerge %196 None
+               OpBranchConditional %94 %197 %198
+        %197 = OpLabel
+               OpBranch %196
+        %198 = OpLabel
+        %199 = OpAccessChain %_ptr_Private_int %temp %164
+               OpStore %199 %195
+               OpBranch %196
+        %196 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+               OpBranch %44
+         %45 = OpLabel
+               OpBranch %200
+        %200 = OpLabel
+               OpLoopMerge %201 %202 None
+               OpBranch %203
+        %203 = OpLabel
+        %204 = OpLoad %int %i
+        %205 = OpLoad %int %i
+        %207 = OpLoad %int %mid
+        %209 = OpSLessThan %bool %204 %int_10
+               OpSelectionMerge %210 None
+               OpBranchConditional %209 %211 %210
+        %211 = OpLabel
+        %212 = OpSLessThanEqual %bool %205 %207
+               OpBranch %210
+        %210 = OpLabel
+        %213 = OpPhi %bool %209 %203 %212 %211
+               OpSelectionMerge %214 None
+               OpBranchConditional %213 %215 %216
+        %215 = OpLabel
+               OpBranch %214
+        %216 = OpLabel
+               OpBranch %201
+        %214 = OpLabel
+        %217 = OpLoad %int %k
+        %218 = OpIAdd %int %217 %int_1
+               OpStore %k %218
+        %219 = OpLoad %int %i
+        %220 = OpIAdd %int %219 %int_1
+               OpStore %i %220
+        %221 = OpAccessChain %_ptr_Private_int %data %219
+        %222 = OpLoad %int %221
+        %223 = OpAccessChain %_ptr_Private_int %temp %217
+               OpStore %223 %222
+               OpBranch %202
+        %202 = OpLabel
+               OpBranch %200
+        %201 = OpLabel
+        %225 = OpLoad %int %from
+               OpStore %i_1 %225
+               OpBranch %226
+        %226 = OpLabel
+               OpLoopMerge %227 %228 None
+               OpBranch %229
+        %229 = OpLabel
+        %230 = OpLoad %int %i_1
+        %232 = OpLoad %int %to
+        %233 = OpSLessThanEqual %bool %230 %232
+               OpSelectionMerge %234 None
+               OpBranchConditional %233 %235 %236
+        %235 = OpLabel
+               OpBranch %234
+        %236 = OpLabel
+               OpBranch %227
+        %234 = OpLabel
+        %237 = OpLoad %int %i_1
+        %238 = OpLoad %int %i_1
+        %239 = OpAccessChain %_ptr_Private_int %temp %238
+        %240 = OpLoad %int %239
+        %241 = OpAccessChain %_ptr_Private_int %data %237
+               OpStore %241 %240
+               OpBranch %228
+        %228 = OpLabel
+        %242 = OpLoad %int %i_1
+        %243 = OpIAdd %int %242 %int_1
+               OpStore %i_1 %243
+               OpBranch %226
+        %227 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %mergeSort_ = OpFunction %void None %244
+        %246 = OpLabel
+        %low = OpVariable %_ptr_Function_int Function %32
+       %high = OpVariable %_ptr_Function_int Function %32
+          %m = OpVariable %_ptr_Function_int Function %32
+        %i_2 = OpVariable %_ptr_Function_int Function %32
+     %from_1 = OpVariable %_ptr_Function_int Function %32
+      %mid_1 = OpVariable %_ptr_Function_int Function %32
+       %to_1 = OpVariable %_ptr_Function_int Function %32
+      %param = OpVariable %_ptr_Function_int Function %32
+    %param_1 = OpVariable %_ptr_Function_int Function %32
+    %param_2 = OpVariable %_ptr_Function_int Function %32
+               OpStore %low %int_0
+               OpStore %high %int_9
+               OpStore %m %int_1
+               OpBranch %258
+        %258 = OpLabel
+               OpLoopMerge %259 %260 None
+               OpBranch %261
+        %261 = OpLabel
+        %262 = OpLoad %int %m
+        %263 = OpLoad %int %high
+        %264 = OpSLessThanEqual %bool %262 %263
+               OpSelectionMerge %265 None
+               OpBranchConditional %264 %266 %267
+        %266 = OpLabel
+               OpBranch %265
+        %267 = OpLabel
+               OpBranch %259
+        %265 = OpLabel
+        %268 = OpLoad %int %low
+               OpStore %i_2 %268
+               OpBranch %269
+        %269 = OpLabel
+               OpLoopMerge %270 %271 None
+               OpBranch %272
+        %272 = OpLabel
+        %273 = OpLoad %int %i_2
+        %274 = OpLoad %int %high
+        %275 = OpSLessThan %bool %273 %274
+               OpSelectionMerge %276 None
+               OpBranchConditional %275 %277 %278
+        %277 = OpLabel
+               OpBranch %276
+        %278 = OpLabel
+               OpBranch %270
+        %276 = OpLabel
+        %279 = OpLoad %int %i_2
+               OpStore %from_1 %279
+        %280 = OpLoad %int %i_2
+        %281 = OpLoad %int %m
+        %282 = OpIAdd %int %280 %281
+        %283 = OpISub %int %282 %int_1
+               OpStore %mid_1 %283
+        %284 = OpLoad %int %i_2
+        %285 = OpLoad %int %m
+        %286 = OpLoad %int %high
+        %290 = OpIMul %int %int_2 %285
+        %291 = OpIAdd %int %284 %290
+        %292 = OpISub %int %291 %int_1
+        %287 = OpExtInst %int %288 SMin %292 %286
+               OpStore %to_1 %287
+        %293 = OpLoad %int %from_1
+               OpStore %param %293
+        %294 = OpLoad %int %mid_1
+               OpStore %param_1 %294
+        %295 = OpLoad %int %to_1
+               OpStore %param_2 %295
+        %296 = OpFunctionCall %void %merge_i1_i1_i1_ %param %param_1 %param_2
+               OpBranch %271
+        %271 = OpLabel
+        %300 = OpLoad %int %m
+        %301 = OpLoad %int %i_2
+        %302 = OpIMul %int %int_2 %300
+        %303 = OpIAdd %int %301 %302
+               OpStore %i_2 %303
+               OpBranch %269
+        %270 = OpLabel
+               OpBranch %260
+        %260 = OpLabel
+        %304 = OpLoad %int %m
+        %305 = OpIMul %int %int_2 %304
+               OpStore %m %305
+               OpBranch %258
+        %259 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %244
+        %307 = OpLabel
+        %i_3 = OpVariable %_ptr_Function_int Function %32
+        %j_1 = OpVariable %_ptr_Function_int Function %32
+       %grey = OpVariable %_ptr_Function_float Function %312
+        %313 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_0
+        %314 = OpLoad %float %313
+        %315 = OpConvertFToS %int %314
+               OpStore %i_3 %315
+               OpBranch %316
+        %316 = OpLabel
+               OpLoopMerge %317 %318 None
+               OpBranch %319
+        %319 = OpLabel
+        %320 = OpLoad %int %i_3
+               OpSelectionMerge %321 None
+               OpSwitch %320 %322 9 %323 8 %324 7 %325 6 %326 5 %327 4 %328 3 %329 2 %330 1 %331 0 %332
+        %323 = OpLabel
+        %333 = OpLoad %int %i_3
+        %334 = OpAccessChain %_ptr_Private_int %data %333
+               OpStore %334 %int_n5
+               OpBranch %321
+        %324 = OpLabel
+        %336 = OpLoad %int %i_3
+        %337 = OpAccessChain %_ptr_Private_int %data %336
+               OpStore %337 %int_n4
+               OpBranch %321
+        %325 = OpLabel
+        %339 = OpLoad %int %i_3
+        %340 = OpAccessChain %_ptr_Private_int %data %339
+               OpStore %340 %int_n3
+               OpBranch %321
+        %326 = OpLabel
+        %342 = OpLoad %int %i_3
+        %343 = OpAccessChain %_ptr_Private_int %data %342
+               OpStore %343 %int_n2
+               OpBranch %321
+        %327 = OpLabel
+        %345 = OpLoad %int %i_3
+        %346 = OpAccessChain %_ptr_Private_int %data %345
+               OpStore %346 %int_n1
+               OpBranch %321
+        %328 = OpLabel
+        %348 = OpLoad %int %i_3
+        %349 = OpAccessChain %_ptr_Private_int %data %348
+               OpStore %349 %int_0
+               OpBranch %321
+        %329 = OpLabel
+        %350 = OpLoad %int %i_3
+        %351 = OpAccessChain %_ptr_Private_int %data %350
+               OpStore %351 %int_1
+               OpBranch %321
+        %330 = OpLabel
+        %352 = OpLoad %int %i_3
+        %353 = OpAccessChain %_ptr_Private_int %data %352
+               OpStore %353 %int_2
+               OpBranch %321
+        %331 = OpLabel
+        %354 = OpLoad %int %i_3
+        %355 = OpAccessChain %_ptr_Private_int %data %354
+               OpStore %355 %int_3
+               OpBranch %321
+        %332 = OpLabel
+        %357 = OpLoad %int %i_3
+        %358 = OpAccessChain %_ptr_Private_int %data %357
+               OpStore %358 %int_4
+               OpBranch %321
+        %322 = OpLabel
+               OpBranch %321
+        %321 = OpLabel
+        %360 = OpLoad %int %i_3
+        %361 = OpIAdd %int %360 %int_1
+               OpStore %i_3 %361
+               OpBranch %318
+        %318 = OpLabel
+        %362 = OpLoad %int %i_3
+        %363 = OpSLessThan %bool %362 %int_10
+               OpSelectionMerge %364 None
+               OpBranchConditional %363 %365 %366
+        %365 = OpLabel
+               OpBranch %364
+        %366 = OpLabel
+               OpBranch %317
+        %364 = OpLabel
+               OpBranch %316
+        %317 = OpLabel
+               OpStore %j_1 %int_0
+               OpBranch %367
+        %367 = OpLabel
+               OpLoopMerge %368 %369 None
+               OpBranch %370
+        %370 = OpLabel
+        %371 = OpLoad %int %j_1
+        %372 = OpSLessThan %bool %371 %int_10
+               OpSelectionMerge %373 None
+               OpBranchConditional %372 %374 %375
+        %374 = OpLabel
+               OpBranch %373
+        %375 = OpLabel
+               OpBranch %368
+        %373 = OpLabel
+        %376 = OpLoad %int %j_1
+        %377 = OpLoad %int %j_1
+        %378 = OpAccessChain %_ptr_Private_int %data %377
+        %379 = OpLoad %int %378
+        %380 = OpAccessChain %_ptr_Private_int %temp %376
+               OpStore %380 %379
+               OpBranch %369
+        %369 = OpLabel
+        %381 = OpLoad %int %j_1
+        %382 = OpIAdd %int %381 %int_1
+               OpStore %j_1 %382
+               OpBranch %367
+        %368 = OpLabel
+        %383 = OpFunctionCall %void %mergeSort_
+        %385 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %386 = OpLoad %float %385
+        %387 = OpConvertFToS %int %386
+        %389 = OpSLessThan %bool %387 %int_30
+               OpSelectionMerge %390 None
+               OpBranchConditional %389 %391 %392
+        %391 = OpLabel
+        %393 = OpAccessChain %_ptr_Private_int %data %int_0
+        %394 = OpLoad %int %393
+        %396 = OpConvertSToF %float %394
+        %398 = OpFDiv %float %396 %float_10
+        %399 = OpFAdd %float %float_0_5 %398
+               OpStore %grey %399
+               OpBranch %390
+        %392 = OpLabel
+        %400 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %401 = OpLoad %float %400
+        %402 = OpConvertFToS %int %401
+        %404 = OpSLessThan %bool %402 %int_60
+               OpSelectionMerge %405 None
+               OpBranchConditional %404 %406 %407
+        %406 = OpLabel
+        %408 = OpAccessChain %_ptr_Private_int %data %int_1
+        %409 = OpLoad %int %408
+        %410 = OpConvertSToF %float %409
+        %411 = OpFDiv %float %410 %float_10
+        %412 = OpFAdd %float %float_0_5 %411
+               OpStore %grey %412
+               OpBranch %405
+        %407 = OpLabel
+        %413 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %414 = OpLoad %float %413
+        %415 = OpConvertFToS %int %414
+        %417 = OpSLessThan %bool %415 %int_90
+               OpSelectionMerge %418 None
+               OpBranchConditional %417 %419 %420
+        %419 = OpLabel
+        %421 = OpAccessChain %_ptr_Private_int %data %int_2
+        %422 = OpLoad %int %421
+        %423 = OpConvertSToF %float %422
+        %424 = OpFDiv %float %423 %float_10
+        %425 = OpFAdd %float %float_0_5 %424
+               OpStore %grey %425
+               OpBranch %418
+        %420 = OpLabel
+        %426 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %427 = OpLoad %float %426
+        %428 = OpConvertFToS %int %427
+        %430 = OpSLessThan %bool %428 %int_120
+               OpSelectionMerge %431 None
+               OpBranchConditional %430 %432 %433
+        %432 = OpLabel
+        %434 = OpAccessChain %_ptr_Private_int %data %int_3
+        %435 = OpLoad %int %434
+        %436 = OpConvertSToF %float %435
+        %437 = OpFDiv %float %436 %float_10
+        %438 = OpFAdd %float %float_0_5 %437
+               OpStore %grey %438
+               OpBranch %431
+        %433 = OpLabel
+        %439 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %440 = OpLoad %float %439
+        %441 = OpConvertFToS %int %440
+        %443 = OpSLessThan %bool %441 %int_150
+               OpSelectionMerge %444 None
+               OpBranchConditional %443 %445 %446
+        %445 = OpLabel
+               OpKill
+        %446 = OpLabel
+        %447 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %448 = OpLoad %float %447
+        %449 = OpConvertFToS %int %448
+        %451 = OpSLessThan %bool %449 %int_180
+               OpSelectionMerge %452 None
+               OpBranchConditional %451 %453 %454
+        %453 = OpLabel
+        %456 = OpAccessChain %_ptr_Private_int %data %int_5
+        %457 = OpLoad %int %456
+        %458 = OpConvertSToF %float %457
+        %459 = OpFDiv %float %458 %float_10
+        %460 = OpFAdd %float %float_0_5 %459
+               OpStore %grey %460
+               OpBranch %452
+        %454 = OpLabel
+        %461 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %462 = OpLoad %float %461
+        %463 = OpConvertFToS %int %462
+        %465 = OpSLessThan %bool %463 %int_210
+               OpSelectionMerge %466 None
+               OpBranchConditional %465 %467 %468
+        %467 = OpLabel
+        %470 = OpAccessChain %_ptr_Private_int %data %int_6
+        %471 = OpLoad %int %470
+        %472 = OpConvertSToF %float %471
+        %473 = OpFDiv %float %472 %float_10
+        %474 = OpFAdd %float %float_0_5 %473
+               OpStore %grey %474
+               OpBranch %466
+        %468 = OpLabel
+        %475 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %476 = OpLoad %float %475
+        %477 = OpConvertFToS %int %476
+        %479 = OpSLessThan %bool %477 %int_240
+               OpSelectionMerge %480 None
+               OpBranchConditional %479 %481 %482
+        %481 = OpLabel
+        %484 = OpAccessChain %_ptr_Private_int %data %int_7
+        %485 = OpLoad %int %484
+        %486 = OpConvertSToF %float %485
+        %487 = OpFDiv %float %486 %float_10
+        %488 = OpFAdd %float %float_0_5 %487
+               OpStore %grey %488
+               OpBranch %480
+        %482 = OpLabel
+        %489 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %490 = OpLoad %float %489
+        %491 = OpConvertFToS %int %490
+        %493 = OpSLessThan %bool %491 %int_270
+               OpSelectionMerge %494 None
+               OpBranchConditional %493 %495 %496
+        %495 = OpLabel
+        %498 = OpAccessChain %_ptr_Private_int %data %int_8
+        %499 = OpLoad %int %498
+        %500 = OpConvertSToF %float %499
+        %501 = OpFDiv %float %500 %float_10
+        %502 = OpFAdd %float %float_0_5 %501
+               OpStore %grey %502
+               OpBranch %494
+        %496 = OpLabel
+               OpKill
+        %494 = OpLabel
+               OpBranch %480
+        %480 = OpLabel
+               OpBranch %466
+        %466 = OpLabel
+               OpBranch %452
+        %452 = OpLabel
+               OpBranch %444
+        %444 = OpLabel
+               OpBranch %431
+        %431 = OpLabel
+               OpBranch %418
+        %418 = OpLabel
+               OpBranch %405
+        %405 = OpLabel
+               OpBranch %390
+        %390 = OpLabel
+        %503 = OpLoad %float %grey
+        %505 = OpCompositeConstruct %v3float %503 %503 %503
+        %506 = OpCompositeExtract %float %505 0
+        %507 = OpCompositeExtract %float %505 1
+        %508 = OpCompositeExtract %float %505 2
+        %509 = OpCompositeConstruct %v4float %506 %507 %508 %float_1
+               OpStore %x_GLF_color %509
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %510
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %514 = OpLabel
+        %515 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %515
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %244
+        %517 = OpLabel
+        %518 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %518
+        %519 = OpFunctionCall %void %main_1
+        %521 = OpLoad %v4float %x_GLF_color
+        %522 = OpCompositeConstruct %main_out %521
+        %520 = OpFunctionCall %void %tint_symbol_3 %522
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 318[%318] is not post dominated by the back-edge block 364[%364]
+  %364 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/2-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/2-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..e349c0c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/2-opt.spvasm.expected.wgsl
@@ -0,0 +1,413 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> data : array<i32, 10>;
+
+var<private> temp : array<i32, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn merge_i1_i1_i1_(from : ptr<function, i32>, mid : ptr<function, i32>, to : ptr<function, i32>) {
+  var k : i32;
+  var i : i32;
+  var j : i32;
+  var i_1 : i32;
+  let x_255 : i32 = *(from);
+  k = x_255;
+  let x_256 : i32 = *(from);
+  i = x_256;
+  let x_257 : i32 = *(mid);
+  j = (x_257 + 1);
+  loop {
+    var x_283 : i32;
+    var x_284 : i32;
+    var x_303 : i32;
+    var x_304 : i32;
+    var x_318 : i32;
+    var x_322 : i32;
+    var x_337 : i32;
+    var x_336 : i32;
+    var x_350 : i32;
+    var x_349 : i32;
+    var x_364 : i32;
+    var x_363 : i32;
+    var x_285_phi : i32;
+    var x_305_phi : i32;
+    var x_326_phi : i32;
+    var x_338_phi : i32;
+    var x_351_phi : i32;
+    var x_365_phi : i32;
+    if ((1.0 >= 0.0)) {
+    } else {
+      continue;
+    }
+    let x_264 : i32 = i;
+    let x_265 : i32 = *(mid);
+    let x_267 : i32 = j;
+    let x_268 : i32 = *(to);
+    if (((x_264 <= x_265) && (x_267 <= x_268))) {
+    } else {
+      break;
+    }
+    let x_272 : i32 = i;
+    let x_274 : i32 = data[x_272];
+    let x_275 : i32 = j;
+    let x_277 : i32 = data[x_275];
+    let x_278 : bool = (x_274 < x_277);
+    if (x_278) {
+      x_283 = k;
+      x_285_phi = x_283;
+    } else {
+      x_284 = 0;
+      x_285_phi = x_284;
+    }
+    let x_285 : i32 = x_285_phi;
+    let x_286 : i32 = (x_285 + 1);
+    if (x_278) {
+      k = x_286;
+      let x_291 : f32 = x_28.injectionSwitch.x;
+      if (!((1.0 <= x_291))) {
+      } else {
+        continue;
+      }
+    }
+    let x_295 : f32 = x_28.injectionSwitch.y;
+    if ((x_295 >= 0.0)) {
+    } else {
+      continue;
+    }
+    let x_298 : i32 = 0;
+    if (x_278) {
+      x_303 = i;
+      x_305_phi = x_303;
+    } else {
+      x_304 = 0;
+      x_305_phi = x_304;
+    }
+    let x_305 : i32 = x_305_phi;
+    let x_307 : i32 = select(x_298, x_305, x_278);
+    if (x_278) {
+      i = (x_307 + 1);
+    }
+    let x_313 : i32 = 0;
+    if (x_278) {
+      x_318 = data[x_307];
+      let x_320 : f32 = x_28.injectionSwitch.y;
+      x_326_phi = x_318;
+      if (!((0.0 <= x_320))) {
+        continue;
+      }
+    } else {
+      x_322 = 0;
+      let x_324 : f32 = x_28.injectionSwitch.y;
+      x_326_phi = x_322;
+      if (!((x_324 < 0.0))) {
+      } else {
+        continue;
+      }
+    }
+    let x_326 : i32 = x_326_phi;
+    if (x_278) {
+      temp[x_285] = select(x_313, x_326, x_278);
+    }
+    if (x_278) {
+      x_337 = 0;
+      x_338_phi = x_337;
+    } else {
+      x_336 = k;
+      x_338_phi = x_336;
+    }
+    let x_338 : i32 = x_338_phi;
+    if (x_278) {
+    } else {
+      k = (x_338 + 1);
+    }
+    let x_343 : f32 = x_28.injectionSwitch.x;
+    if (!((1.0 <= x_343))) {
+    } else {
+      continue;
+    }
+    if (x_278) {
+      x_350 = 0;
+      x_351_phi = x_350;
+    } else {
+      x_349 = j;
+      x_351_phi = x_349;
+    }
+    let x_351 : i32 = x_351_phi;
+    let x_353 : i32 = 0;
+    let x_355 : i32 = select(x_351, x_353, x_278);
+    if (x_278) {
+    } else {
+      j = (x_355 + 1);
+    }
+    if (x_278) {
+      x_364 = 0;
+      x_365_phi = x_364;
+    } else {
+      x_363 = data[x_355];
+      x_365_phi = x_363;
+    }
+    let x_365 : i32 = x_365_phi;
+    if (x_278) {
+    } else {
+      temp[x_338] = x_365;
+    }
+  }
+  loop {
+    let x_374 : i32 = i;
+    let x_376 : i32 = i;
+    let x_377 : i32 = *(mid);
+    if (((x_374 < 10) && (x_376 <= x_377))) {
+    } else {
+      break;
+    }
+    let x_381 : i32 = k;
+    k = (x_381 + 1);
+    let x_383 : i32 = i;
+    i = (x_383 + 1);
+    let x_386 : i32 = data[x_383];
+    temp[x_381] = x_386;
+  }
+  let x_388 : i32 = *(from);
+  i_1 = x_388;
+  loop {
+    let x_393 : i32 = i_1;
+    let x_394 : i32 = *(to);
+    if ((x_393 <= x_394)) {
+    } else {
+      break;
+    }
+    let x_397 : i32 = i_1;
+    let x_398 : i32 = i_1;
+    let x_400 : i32 = temp[x_398];
+    data[x_397] = x_400;
+
+    continuing {
+      let x_402 : i32 = i_1;
+      i_1 = (x_402 + 1);
+    }
+  }
+  return;
+}
+
+fn mergeSort_() {
+  var low : i32;
+  var high : i32;
+  var m : i32;
+  var i_2 : i32;
+  var from_1 : i32;
+  var mid_1 : i32;
+  var to_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  low = 0;
+  high = 9;
+  m = 1;
+  loop {
+    let x_409 : i32 = m;
+    let x_410 : i32 = high;
+    if ((x_409 <= x_410)) {
+    } else {
+      break;
+    }
+    let x_413 : i32 = low;
+    i_2 = x_413;
+    loop {
+      let x_418 : i32 = i_2;
+      let x_419 : i32 = high;
+      if ((x_418 < x_419)) {
+      } else {
+        break;
+      }
+      let x_422 : i32 = i_2;
+      from_1 = x_422;
+      let x_423 : i32 = i_2;
+      let x_424 : i32 = m;
+      mid_1 = ((x_423 + x_424) - 1);
+      let x_427 : i32 = i_2;
+      let x_428 : i32 = m;
+      let x_432 : i32 = high;
+      to_1 = min(((x_427 + (2 * x_428)) - 1), x_432);
+      let x_434 : i32 = from_1;
+      param = x_434;
+      let x_435 : i32 = mid_1;
+      param_1 = x_435;
+      let x_436 : i32 = to_1;
+      param_2 = x_436;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2));
+
+      continuing {
+        let x_438 : i32 = m;
+        let x_440 : i32 = i_2;
+        i_2 = (x_440 + (2 * x_438));
+      }
+    }
+
+    continuing {
+      let x_442 : i32 = m;
+      m = (2 * x_442);
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_3 : i32;
+  var j_1 : i32;
+  var grey : f32;
+  let x_88 : f32 = x_28.injectionSwitch.x;
+  i_3 = i32(x_88);
+  loop {
+    let x_94 : i32 = i_3;
+    switch(x_94) {
+      case 9: {
+        let x_124 : i32 = i_3;
+        data[x_124] = -5;
+      }
+      case 8: {
+        let x_122 : i32 = i_3;
+        data[x_122] = -4;
+      }
+      case 7: {
+        let x_120 : i32 = i_3;
+        data[x_120] = -3;
+      }
+      case 6: {
+        let x_118 : i32 = i_3;
+        data[x_118] = -2;
+      }
+      case 5: {
+        let x_116 : i32 = i_3;
+        data[x_116] = -1;
+      }
+      case 4: {
+        let x_114 : i32 = i_3;
+        data[x_114] = 0;
+      }
+      case 3: {
+        let x_112 : i32 = i_3;
+        data[x_112] = 1;
+      }
+      case 2: {
+        let x_110 : i32 = i_3;
+        data[x_110] = 2;
+      }
+      case 1: {
+        let x_108 : i32 = i_3;
+        data[x_108] = 3;
+      }
+      case 0: {
+        let x_106 : i32 = i_3;
+        data[x_106] = 4;
+      }
+      default: {
+      }
+    }
+    let x_126 : i32 = i_3;
+    i_3 = (x_126 + 1);
+
+    continuing {
+      let x_128 : i32 = i_3;
+      if ((x_128 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  loop {
+    let x_134 : i32 = j_1;
+    if ((x_134 < 10)) {
+    } else {
+      break;
+    }
+    let x_137 : i32 = j_1;
+    let x_138 : i32 = j_1;
+    let x_140 : i32 = data[x_138];
+    temp[x_137] = x_140;
+
+    continuing {
+      let x_142 : i32 = j_1;
+      j_1 = (x_142 + 1);
+    }
+  }
+  mergeSort_();
+  let x_146 : f32 = gl_FragCoord.y;
+  if ((i32(x_146) < 30)) {
+    let x_153 : i32 = data[0];
+    grey = (0.5 + (f32(x_153) / 10.0));
+  } else {
+    let x_158 : f32 = gl_FragCoord.y;
+    if ((i32(x_158) < 60)) {
+      let x_165 : i32 = data[1];
+      grey = (0.5 + (f32(x_165) / 10.0));
+    } else {
+      let x_170 : f32 = gl_FragCoord.y;
+      if ((i32(x_170) < 90)) {
+        let x_177 : i32 = data[2];
+        grey = (0.5 + (f32(x_177) / 10.0));
+      } else {
+        let x_182 : f32 = gl_FragCoord.y;
+        if ((i32(x_182) < 120)) {
+          let x_189 : i32 = data[3];
+          grey = (0.5 + (f32(x_189) / 10.0));
+        } else {
+          let x_194 : f32 = gl_FragCoord.y;
+          if ((i32(x_194) < 150)) {
+            discard;
+          } else {
+            let x_201 : f32 = gl_FragCoord.y;
+            if ((i32(x_201) < 180)) {
+              let x_208 : i32 = data[5];
+              grey = (0.5 + (f32(x_208) / 10.0));
+            } else {
+              let x_213 : f32 = gl_FragCoord.y;
+              if ((i32(x_213) < 210)) {
+                let x_220 : i32 = data[6];
+                grey = (0.5 + (f32(x_220) / 10.0));
+              } else {
+                let x_225 : f32 = gl_FragCoord.y;
+                if ((i32(x_225) < 240)) {
+                  let x_232 : i32 = data[7];
+                  grey = (0.5 + (f32(x_232) / 10.0));
+                } else {
+                  let x_237 : f32 = gl_FragCoord.y;
+                  if ((i32(x_237) < 270)) {
+                    let x_244 : i32 = data[8];
+                    grey = (0.5 + (f32(x_244) / 10.0));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  let x_248 : f32 = grey;
+  let x_249 : vec3<f32> = vec3<f32>(x_248, x_248, x_248);
+  x_GLF_color = vec4<f32>(x_249.x, x_249.y, x_249.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/2-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/2-opt.wgsl
new file mode 100644
index 0000000..e349c0c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/2-opt.wgsl
@@ -0,0 +1,413 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> data : array<i32, 10>;
+
+var<private> temp : array<i32, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn merge_i1_i1_i1_(from : ptr<function, i32>, mid : ptr<function, i32>, to : ptr<function, i32>) {
+  var k : i32;
+  var i : i32;
+  var j : i32;
+  var i_1 : i32;
+  let x_255 : i32 = *(from);
+  k = x_255;
+  let x_256 : i32 = *(from);
+  i = x_256;
+  let x_257 : i32 = *(mid);
+  j = (x_257 + 1);
+  loop {
+    var x_283 : i32;
+    var x_284 : i32;
+    var x_303 : i32;
+    var x_304 : i32;
+    var x_318 : i32;
+    var x_322 : i32;
+    var x_337 : i32;
+    var x_336 : i32;
+    var x_350 : i32;
+    var x_349 : i32;
+    var x_364 : i32;
+    var x_363 : i32;
+    var x_285_phi : i32;
+    var x_305_phi : i32;
+    var x_326_phi : i32;
+    var x_338_phi : i32;
+    var x_351_phi : i32;
+    var x_365_phi : i32;
+    if ((1.0 >= 0.0)) {
+    } else {
+      continue;
+    }
+    let x_264 : i32 = i;
+    let x_265 : i32 = *(mid);
+    let x_267 : i32 = j;
+    let x_268 : i32 = *(to);
+    if (((x_264 <= x_265) && (x_267 <= x_268))) {
+    } else {
+      break;
+    }
+    let x_272 : i32 = i;
+    let x_274 : i32 = data[x_272];
+    let x_275 : i32 = j;
+    let x_277 : i32 = data[x_275];
+    let x_278 : bool = (x_274 < x_277);
+    if (x_278) {
+      x_283 = k;
+      x_285_phi = x_283;
+    } else {
+      x_284 = 0;
+      x_285_phi = x_284;
+    }
+    let x_285 : i32 = x_285_phi;
+    let x_286 : i32 = (x_285 + 1);
+    if (x_278) {
+      k = x_286;
+      let x_291 : f32 = x_28.injectionSwitch.x;
+      if (!((1.0 <= x_291))) {
+      } else {
+        continue;
+      }
+    }
+    let x_295 : f32 = x_28.injectionSwitch.y;
+    if ((x_295 >= 0.0)) {
+    } else {
+      continue;
+    }
+    let x_298 : i32 = 0;
+    if (x_278) {
+      x_303 = i;
+      x_305_phi = x_303;
+    } else {
+      x_304 = 0;
+      x_305_phi = x_304;
+    }
+    let x_305 : i32 = x_305_phi;
+    let x_307 : i32 = select(x_298, x_305, x_278);
+    if (x_278) {
+      i = (x_307 + 1);
+    }
+    let x_313 : i32 = 0;
+    if (x_278) {
+      x_318 = data[x_307];
+      let x_320 : f32 = x_28.injectionSwitch.y;
+      x_326_phi = x_318;
+      if (!((0.0 <= x_320))) {
+        continue;
+      }
+    } else {
+      x_322 = 0;
+      let x_324 : f32 = x_28.injectionSwitch.y;
+      x_326_phi = x_322;
+      if (!((x_324 < 0.0))) {
+      } else {
+        continue;
+      }
+    }
+    let x_326 : i32 = x_326_phi;
+    if (x_278) {
+      temp[x_285] = select(x_313, x_326, x_278);
+    }
+    if (x_278) {
+      x_337 = 0;
+      x_338_phi = x_337;
+    } else {
+      x_336 = k;
+      x_338_phi = x_336;
+    }
+    let x_338 : i32 = x_338_phi;
+    if (x_278) {
+    } else {
+      k = (x_338 + 1);
+    }
+    let x_343 : f32 = x_28.injectionSwitch.x;
+    if (!((1.0 <= x_343))) {
+    } else {
+      continue;
+    }
+    if (x_278) {
+      x_350 = 0;
+      x_351_phi = x_350;
+    } else {
+      x_349 = j;
+      x_351_phi = x_349;
+    }
+    let x_351 : i32 = x_351_phi;
+    let x_353 : i32 = 0;
+    let x_355 : i32 = select(x_351, x_353, x_278);
+    if (x_278) {
+    } else {
+      j = (x_355 + 1);
+    }
+    if (x_278) {
+      x_364 = 0;
+      x_365_phi = x_364;
+    } else {
+      x_363 = data[x_355];
+      x_365_phi = x_363;
+    }
+    let x_365 : i32 = x_365_phi;
+    if (x_278) {
+    } else {
+      temp[x_338] = x_365;
+    }
+  }
+  loop {
+    let x_374 : i32 = i;
+    let x_376 : i32 = i;
+    let x_377 : i32 = *(mid);
+    if (((x_374 < 10) && (x_376 <= x_377))) {
+    } else {
+      break;
+    }
+    let x_381 : i32 = k;
+    k = (x_381 + 1);
+    let x_383 : i32 = i;
+    i = (x_383 + 1);
+    let x_386 : i32 = data[x_383];
+    temp[x_381] = x_386;
+  }
+  let x_388 : i32 = *(from);
+  i_1 = x_388;
+  loop {
+    let x_393 : i32 = i_1;
+    let x_394 : i32 = *(to);
+    if ((x_393 <= x_394)) {
+    } else {
+      break;
+    }
+    let x_397 : i32 = i_1;
+    let x_398 : i32 = i_1;
+    let x_400 : i32 = temp[x_398];
+    data[x_397] = x_400;
+
+    continuing {
+      let x_402 : i32 = i_1;
+      i_1 = (x_402 + 1);
+    }
+  }
+  return;
+}
+
+fn mergeSort_() {
+  var low : i32;
+  var high : i32;
+  var m : i32;
+  var i_2 : i32;
+  var from_1 : i32;
+  var mid_1 : i32;
+  var to_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  low = 0;
+  high = 9;
+  m = 1;
+  loop {
+    let x_409 : i32 = m;
+    let x_410 : i32 = high;
+    if ((x_409 <= x_410)) {
+    } else {
+      break;
+    }
+    let x_413 : i32 = low;
+    i_2 = x_413;
+    loop {
+      let x_418 : i32 = i_2;
+      let x_419 : i32 = high;
+      if ((x_418 < x_419)) {
+      } else {
+        break;
+      }
+      let x_422 : i32 = i_2;
+      from_1 = x_422;
+      let x_423 : i32 = i_2;
+      let x_424 : i32 = m;
+      mid_1 = ((x_423 + x_424) - 1);
+      let x_427 : i32 = i_2;
+      let x_428 : i32 = m;
+      let x_432 : i32 = high;
+      to_1 = min(((x_427 + (2 * x_428)) - 1), x_432);
+      let x_434 : i32 = from_1;
+      param = x_434;
+      let x_435 : i32 = mid_1;
+      param_1 = x_435;
+      let x_436 : i32 = to_1;
+      param_2 = x_436;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2));
+
+      continuing {
+        let x_438 : i32 = m;
+        let x_440 : i32 = i_2;
+        i_2 = (x_440 + (2 * x_438));
+      }
+    }
+
+    continuing {
+      let x_442 : i32 = m;
+      m = (2 * x_442);
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_3 : i32;
+  var j_1 : i32;
+  var grey : f32;
+  let x_88 : f32 = x_28.injectionSwitch.x;
+  i_3 = i32(x_88);
+  loop {
+    let x_94 : i32 = i_3;
+    switch(x_94) {
+      case 9: {
+        let x_124 : i32 = i_3;
+        data[x_124] = -5;
+      }
+      case 8: {
+        let x_122 : i32 = i_3;
+        data[x_122] = -4;
+      }
+      case 7: {
+        let x_120 : i32 = i_3;
+        data[x_120] = -3;
+      }
+      case 6: {
+        let x_118 : i32 = i_3;
+        data[x_118] = -2;
+      }
+      case 5: {
+        let x_116 : i32 = i_3;
+        data[x_116] = -1;
+      }
+      case 4: {
+        let x_114 : i32 = i_3;
+        data[x_114] = 0;
+      }
+      case 3: {
+        let x_112 : i32 = i_3;
+        data[x_112] = 1;
+      }
+      case 2: {
+        let x_110 : i32 = i_3;
+        data[x_110] = 2;
+      }
+      case 1: {
+        let x_108 : i32 = i_3;
+        data[x_108] = 3;
+      }
+      case 0: {
+        let x_106 : i32 = i_3;
+        data[x_106] = 4;
+      }
+      default: {
+      }
+    }
+    let x_126 : i32 = i_3;
+    i_3 = (x_126 + 1);
+
+    continuing {
+      let x_128 : i32 = i_3;
+      if ((x_128 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  loop {
+    let x_134 : i32 = j_1;
+    if ((x_134 < 10)) {
+    } else {
+      break;
+    }
+    let x_137 : i32 = j_1;
+    let x_138 : i32 = j_1;
+    let x_140 : i32 = data[x_138];
+    temp[x_137] = x_140;
+
+    continuing {
+      let x_142 : i32 = j_1;
+      j_1 = (x_142 + 1);
+    }
+  }
+  mergeSort_();
+  let x_146 : f32 = gl_FragCoord.y;
+  if ((i32(x_146) < 30)) {
+    let x_153 : i32 = data[0];
+    grey = (0.5 + (f32(x_153) / 10.0));
+  } else {
+    let x_158 : f32 = gl_FragCoord.y;
+    if ((i32(x_158) < 60)) {
+      let x_165 : i32 = data[1];
+      grey = (0.5 + (f32(x_165) / 10.0));
+    } else {
+      let x_170 : f32 = gl_FragCoord.y;
+      if ((i32(x_170) < 90)) {
+        let x_177 : i32 = data[2];
+        grey = (0.5 + (f32(x_177) / 10.0));
+      } else {
+        let x_182 : f32 = gl_FragCoord.y;
+        if ((i32(x_182) < 120)) {
+          let x_189 : i32 = data[3];
+          grey = (0.5 + (f32(x_189) / 10.0));
+        } else {
+          let x_194 : f32 = gl_FragCoord.y;
+          if ((i32(x_194) < 150)) {
+            discard;
+          } else {
+            let x_201 : f32 = gl_FragCoord.y;
+            if ((i32(x_201) < 180)) {
+              let x_208 : i32 = data[5];
+              grey = (0.5 + (f32(x_208) / 10.0));
+            } else {
+              let x_213 : f32 = gl_FragCoord.y;
+              if ((i32(x_213) < 210)) {
+                let x_220 : i32 = data[6];
+                grey = (0.5 + (f32(x_220) / 10.0));
+              } else {
+                let x_225 : f32 = gl_FragCoord.y;
+                if ((i32(x_225) < 240)) {
+                  let x_232 : i32 = data[7];
+                  grey = (0.5 + (f32(x_232) / 10.0));
+                } else {
+                  let x_237 : f32 = gl_FragCoord.y;
+                  if ((i32(x_237) < 270)) {
+                    let x_244 : i32 = data[8];
+                    grey = (0.5 + (f32(x_244) / 10.0));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  let x_248 : f32 = grey;
+  let x_249 : vec3<f32> = vec3<f32>(x_248, x_248, x_248);
+  x_GLF_color = vec4<f32>(x_249.x, x_249.y, x_249.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/2-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/2-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..9cf6e4b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/2-opt.wgsl.expected.hlsl
@@ -0,0 +1,372 @@
+static int data[10] = (int[10])0;
+static int temp[10] = (int[10])0;
+cbuffer cbuffer_x_28 : register(b0, space0) {
+  uint4 x_28[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void merge_i1_i1_i1_(inout int from, inout int mid, inout int to) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  const int x_255 = from;
+  k = x_255;
+  const int x_256 = from;
+  i = x_256;
+  const int x_257 = mid;
+  j = (x_257 + 1);
+  while (true) {
+    int x_283 = 0;
+    int x_284 = 0;
+    int x_303 = 0;
+    int x_304 = 0;
+    int x_318 = 0;
+    int x_322 = 0;
+    int x_337 = 0;
+    int x_336 = 0;
+    int x_350 = 0;
+    int x_349 = 0;
+    int x_364 = 0;
+    int x_363 = 0;
+    int x_285_phi = 0;
+    int x_305_phi = 0;
+    int x_326_phi = 0;
+    int x_338_phi = 0;
+    int x_351_phi = 0;
+    int x_365_phi = 0;
+    if ((1.0f >= 0.0f)) {
+    } else {
+      continue;
+    }
+    const int x_264 = i;
+    const int x_265 = mid;
+    const int x_267 = j;
+    const int x_268 = to;
+    bool tint_tmp = (x_264 <= x_265);
+    if (tint_tmp) {
+      tint_tmp = (x_267 <= x_268);
+    }
+    if ((tint_tmp)) {
+    } else {
+      break;
+    }
+    const int x_274 = data[i];
+    const int x_277 = data[j];
+    const bool x_278 = (x_274 < x_277);
+    if (x_278) {
+      x_283 = k;
+      x_285_phi = x_283;
+    } else {
+      x_284 = 0;
+      x_285_phi = x_284;
+    }
+    const int x_285 = x_285_phi;
+    const int x_286 = (x_285 + 1);
+    if (x_278) {
+      k = x_286;
+      const float x_291 = asfloat(x_28[0].x);
+      if (!((1.0f <= x_291))) {
+      } else {
+        continue;
+      }
+    }
+    const float x_295 = asfloat(x_28[0].y);
+    if ((x_295 >= 0.0f)) {
+    } else {
+      continue;
+    }
+    const int x_298 = 0;
+    if (x_278) {
+      x_303 = i;
+      x_305_phi = x_303;
+    } else {
+      x_304 = 0;
+      x_305_phi = x_304;
+    }
+    const int x_307 = (x_278 ? x_305_phi : x_298);
+    if (x_278) {
+      i = (x_307 + 1);
+    }
+    const int x_313 = 0;
+    if (x_278) {
+      x_318 = data[x_307];
+      const float x_320 = asfloat(x_28[0].y);
+      x_326_phi = x_318;
+      if (!((0.0f <= x_320))) {
+        continue;
+      }
+    } else {
+      x_322 = 0;
+      const float x_324 = asfloat(x_28[0].y);
+      x_326_phi = x_322;
+      if (!((x_324 < 0.0f))) {
+      } else {
+        continue;
+      }
+    }
+    const int x_326 = x_326_phi;
+    if (x_278) {
+      temp[x_285] = (x_278 ? x_326 : x_313);
+    }
+    if (x_278) {
+      x_337 = 0;
+      x_338_phi = x_337;
+    } else {
+      x_336 = k;
+      x_338_phi = x_336;
+    }
+    const int x_338 = x_338_phi;
+    if (x_278) {
+    } else {
+      k = (x_338 + 1);
+    }
+    const float x_343 = asfloat(x_28[0].x);
+    if (!((1.0f <= x_343))) {
+    } else {
+      continue;
+    }
+    if (x_278) {
+      x_350 = 0;
+      x_351_phi = x_350;
+    } else {
+      x_349 = j;
+      x_351_phi = x_349;
+    }
+    const int x_355 = (x_278 ? 0 : x_351_phi);
+    if (x_278) {
+    } else {
+      j = (x_355 + 1);
+    }
+    if (x_278) {
+      x_364 = 0;
+      x_365_phi = x_364;
+    } else {
+      x_363 = data[x_355];
+      x_365_phi = x_363;
+    }
+    const int x_365 = x_365_phi;
+    if (x_278) {
+    } else {
+      temp[x_338] = x_365;
+    }
+  }
+  while (true) {
+    const int x_374 = i;
+    const int x_376 = i;
+    const int x_377 = mid;
+    bool tint_tmp_1 = (x_374 < 10);
+    if (tint_tmp_1) {
+      tint_tmp_1 = (x_376 <= x_377);
+    }
+    if ((tint_tmp_1)) {
+    } else {
+      break;
+    }
+    const int x_381 = k;
+    k = (x_381 + 1);
+    const int x_383 = i;
+    i = (x_383 + 1);
+    const int x_386 = data[x_383];
+    temp[x_381] = x_386;
+  }
+  const int x_388 = from;
+  i_1 = x_388;
+  while (true) {
+    const int x_393 = i_1;
+    const int x_394 = to;
+    if ((x_393 <= x_394)) {
+    } else {
+      break;
+    }
+    const int x_397 = i_1;
+    const int x_400 = temp[i_1];
+    data[x_397] = x_400;
+    {
+      i_1 = (i_1 + 1);
+    }
+  }
+  return;
+}
+
+void mergeSort_() {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  {
+    for(; (m <= high); m = (2 * m)) {
+      i_2 = low;
+      {
+        for(; (i_2 < high); i_2 = (i_2 + (2 * m))) {
+          from_1 = i_2;
+          mid_1 = ((i_2 + m) - 1);
+          to_1 = min(((i_2 + (2 * m)) - 1), high);
+          param = from_1;
+          param_1 = mid_1;
+          param_2 = to_1;
+          merge_i1_i1_i1_(param, param_1, param_2);
+        }
+      }
+    }
+  }
+  return;
+}
+
+void main_1() {
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  const float x_88 = asfloat(x_28[0].x);
+  i_3 = int(x_88);
+  while (true) {
+    switch(i_3) {
+      case 9: {
+        data[i_3] = -5;
+        break;
+      }
+      case 8: {
+        data[i_3] = -4;
+        break;
+      }
+      case 7: {
+        data[i_3] = -3;
+        break;
+      }
+      case 6: {
+        data[i_3] = -2;
+        break;
+      }
+      case 5: {
+        data[i_3] = -1;
+        break;
+      }
+      case 4: {
+        data[i_3] = 0;
+        break;
+      }
+      case 3: {
+        data[i_3] = 1;
+        break;
+      }
+      case 2: {
+        data[i_3] = 2;
+        break;
+      }
+      case 1: {
+        data[i_3] = 3;
+        break;
+      }
+      case 0: {
+        data[i_3] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    i_3 = (i_3 + 1);
+    {
+      if ((i_3 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  {
+    for(; (j_1 < 10); j_1 = (j_1 + 1)) {
+      const int x_137 = j_1;
+      const int x_140 = data[j_1];
+      temp[x_137] = x_140;
+    }
+  }
+  mergeSort_();
+  const float x_146 = gl_FragCoord.y;
+  if ((int(x_146) < 30)) {
+    const int x_153 = data[0];
+    grey = (0.5f + (float(x_153) / 10.0f));
+  } else {
+    const float x_158 = gl_FragCoord.y;
+    if ((int(x_158) < 60)) {
+      const int x_165 = data[1];
+      grey = (0.5f + (float(x_165) / 10.0f));
+    } else {
+      const float x_170 = gl_FragCoord.y;
+      if ((int(x_170) < 90)) {
+        const int x_177 = data[2];
+        grey = (0.5f + (float(x_177) / 10.0f));
+      } else {
+        const float x_182 = gl_FragCoord.y;
+        if ((int(x_182) < 120)) {
+          const int x_189 = data[3];
+          grey = (0.5f + (float(x_189) / 10.0f));
+        } else {
+          const float x_194 = gl_FragCoord.y;
+          if ((int(x_194) < 150)) {
+            discard;
+          } else {
+            const float x_201 = gl_FragCoord.y;
+            if ((int(x_201) < 180)) {
+              const int x_208 = data[5];
+              grey = (0.5f + (float(x_208) / 10.0f));
+            } else {
+              const float x_213 = gl_FragCoord.y;
+              if ((int(x_213) < 210)) {
+                const int x_220 = data[6];
+                grey = (0.5f + (float(x_220) / 10.0f));
+              } else {
+                const float x_225 = gl_FragCoord.y;
+                if ((int(x_225) < 240)) {
+                  const int x_232 = data[7];
+                  grey = (0.5f + (float(x_232) / 10.0f));
+                } else {
+                  const float x_237 = gl_FragCoord.y;
+                  if ((int(x_237) < 270)) {
+                    const int x_244 = data[8];
+                    grey = (0.5f + (float(x_244) / 10.0f));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  const float x_248 = grey;
+  const float3 x_249 = float3(x_248, x_248, x_248);
+  x_GLF_color = float4(x_249.x, x_249.y, x_249.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/2-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/2-opt.wgsl.expected.msl
new file mode 100644
index 0000000..c3a165b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/2-opt.wgsl.expected.msl
@@ -0,0 +1,421 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void merge_i1_i1_i1_(constant buf0& x_28, thread int* const from, thread int* const mid, thread int* const to, thread tint_array_wrapper* const tint_symbol_5, thread tint_array_wrapper* const tint_symbol_6) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  int const x_255 = *(from);
+  k = x_255;
+  int const x_256 = *(from);
+  i = x_256;
+  int const x_257 = *(mid);
+  j = (x_257 + 1);
+  while (true) {
+    int x_283 = 0;
+    int x_284 = 0;
+    int x_303 = 0;
+    int x_304 = 0;
+    int x_318 = 0;
+    int x_322 = 0;
+    int x_337 = 0;
+    int x_336 = 0;
+    int x_350 = 0;
+    int x_349 = 0;
+    int x_364 = 0;
+    int x_363 = 0;
+    int x_285_phi = 0;
+    int x_305_phi = 0;
+    int x_326_phi = 0;
+    int x_338_phi = 0;
+    int x_351_phi = 0;
+    int x_365_phi = 0;
+    if ((1.0f >= 0.0f)) {
+    } else {
+      continue;
+    }
+    int const x_264 = i;
+    int const x_265 = *(mid);
+    int const x_267 = j;
+    int const x_268 = *(to);
+    if (((x_264 <= x_265) && (x_267 <= x_268))) {
+    } else {
+      break;
+    }
+    int const x_272 = i;
+    int const x_274 = (*(tint_symbol_5)).arr[x_272];
+    int const x_275 = j;
+    int const x_277 = (*(tint_symbol_5)).arr[x_275];
+    bool const x_278 = (x_274 < x_277);
+    if (x_278) {
+      x_283 = k;
+      x_285_phi = x_283;
+    } else {
+      x_284 = 0;
+      x_285_phi = x_284;
+    }
+    int const x_285 = x_285_phi;
+    int const x_286 = (x_285 + 1);
+    if (x_278) {
+      k = x_286;
+      float const x_291 = x_28.injectionSwitch.x;
+      if (!((1.0f <= x_291))) {
+      } else {
+        continue;
+      }
+    }
+    float const x_295 = x_28.injectionSwitch.y;
+    if ((x_295 >= 0.0f)) {
+    } else {
+      continue;
+    }
+    int const x_298 = 0;
+    if (x_278) {
+      x_303 = i;
+      x_305_phi = x_303;
+    } else {
+      x_304 = 0;
+      x_305_phi = x_304;
+    }
+    int const x_305 = x_305_phi;
+    int const x_307 = select(x_298, x_305, x_278);
+    if (x_278) {
+      i = (x_307 + 1);
+    }
+    int const x_313 = 0;
+    if (x_278) {
+      x_318 = (*(tint_symbol_5)).arr[x_307];
+      float const x_320 = x_28.injectionSwitch.y;
+      x_326_phi = x_318;
+      if (!((0.0f <= x_320))) {
+        continue;
+      }
+    } else {
+      x_322 = 0;
+      float const x_324 = x_28.injectionSwitch.y;
+      x_326_phi = x_322;
+      if (!((x_324 < 0.0f))) {
+      } else {
+        continue;
+      }
+    }
+    int const x_326 = x_326_phi;
+    if (x_278) {
+      (*(tint_symbol_6)).arr[x_285] = select(x_313, x_326, x_278);
+    }
+    if (x_278) {
+      x_337 = 0;
+      x_338_phi = x_337;
+    } else {
+      x_336 = k;
+      x_338_phi = x_336;
+    }
+    int const x_338 = x_338_phi;
+    if (x_278) {
+    } else {
+      k = (x_338 + 1);
+    }
+    float const x_343 = x_28.injectionSwitch.x;
+    if (!((1.0f <= x_343))) {
+    } else {
+      continue;
+    }
+    if (x_278) {
+      x_350 = 0;
+      x_351_phi = x_350;
+    } else {
+      x_349 = j;
+      x_351_phi = x_349;
+    }
+    int const x_351 = x_351_phi;
+    int const x_353 = 0;
+    int const x_355 = select(x_351, x_353, x_278);
+    if (x_278) {
+    } else {
+      j = (x_355 + 1);
+    }
+    if (x_278) {
+      x_364 = 0;
+      x_365_phi = x_364;
+    } else {
+      x_363 = (*(tint_symbol_5)).arr[x_355];
+      x_365_phi = x_363;
+    }
+    int const x_365 = x_365_phi;
+    if (x_278) {
+    } else {
+      (*(tint_symbol_6)).arr[x_338] = x_365;
+    }
+  }
+  while (true) {
+    int const x_374 = i;
+    int const x_376 = i;
+    int const x_377 = *(mid);
+    if (((x_374 < 10) && (x_376 <= x_377))) {
+    } else {
+      break;
+    }
+    int const x_381 = k;
+    k = (x_381 + 1);
+    int const x_383 = i;
+    i = (x_383 + 1);
+    int const x_386 = (*(tint_symbol_5)).arr[x_383];
+    (*(tint_symbol_6)).arr[x_381] = x_386;
+  }
+  int const x_388 = *(from);
+  i_1 = x_388;
+  while (true) {
+    int const x_393 = i_1;
+    int const x_394 = *(to);
+    if ((x_393 <= x_394)) {
+    } else {
+      break;
+    }
+    int const x_397 = i_1;
+    int const x_398 = i_1;
+    int const x_400 = (*(tint_symbol_6)).arr[x_398];
+    (*(tint_symbol_5)).arr[x_397] = x_400;
+    {
+      int const x_402 = i_1;
+      i_1 = (x_402 + 1);
+    }
+  }
+  return;
+}
+
+void mergeSort_(constant buf0& x_28, thread tint_array_wrapper* const tint_symbol_7, thread tint_array_wrapper* const tint_symbol_8) {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  while (true) {
+    int const x_409 = m;
+    int const x_410 = high;
+    if ((x_409 <= x_410)) {
+    } else {
+      break;
+    }
+    int const x_413 = low;
+    i_2 = x_413;
+    while (true) {
+      int const x_418 = i_2;
+      int const x_419 = high;
+      if ((x_418 < x_419)) {
+      } else {
+        break;
+      }
+      int const x_422 = i_2;
+      from_1 = x_422;
+      int const x_423 = i_2;
+      int const x_424 = m;
+      mid_1 = ((x_423 + x_424) - 1);
+      int const x_427 = i_2;
+      int const x_428 = m;
+      int const x_432 = high;
+      to_1 = min(((x_427 + (2 * x_428)) - 1), x_432);
+      int const x_434 = from_1;
+      param = x_434;
+      int const x_435 = mid_1;
+      param_1 = x_435;
+      int const x_436 = to_1;
+      param_2 = x_436;
+      merge_i1_i1_i1_(x_28, &(param), &(param_1), &(param_2), tint_symbol_7, tint_symbol_8);
+      {
+        int const x_438 = m;
+        int const x_440 = i_2;
+        i_2 = (x_440 + (2 * x_438));
+      }
+    }
+    {
+      int const x_442 = m;
+      m = (2 * x_442);
+    }
+  }
+  return;
+}
+
+void main_1(constant buf0& x_28, thread tint_array_wrapper* const tint_symbol_9, thread tint_array_wrapper* const tint_symbol_10, thread float4* const tint_symbol_11, thread float4* const tint_symbol_12) {
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  float const x_88 = x_28.injectionSwitch.x;
+  i_3 = int(x_88);
+  while (true) {
+    int const x_94 = i_3;
+    switch(x_94) {
+      case 9: {
+        int const x_124 = i_3;
+        (*(tint_symbol_9)).arr[x_124] = -5;
+        break;
+      }
+      case 8: {
+        int const x_122 = i_3;
+        (*(tint_symbol_9)).arr[x_122] = -4;
+        break;
+      }
+      case 7: {
+        int const x_120 = i_3;
+        (*(tint_symbol_9)).arr[x_120] = -3;
+        break;
+      }
+      case 6: {
+        int const x_118 = i_3;
+        (*(tint_symbol_9)).arr[x_118] = -2;
+        break;
+      }
+      case 5: {
+        int const x_116 = i_3;
+        (*(tint_symbol_9)).arr[x_116] = -1;
+        break;
+      }
+      case 4: {
+        int const x_114 = i_3;
+        (*(tint_symbol_9)).arr[x_114] = 0;
+        break;
+      }
+      case 3: {
+        int const x_112 = i_3;
+        (*(tint_symbol_9)).arr[x_112] = 1;
+        break;
+      }
+      case 2: {
+        int const x_110 = i_3;
+        (*(tint_symbol_9)).arr[x_110] = 2;
+        break;
+      }
+      case 1: {
+        int const x_108 = i_3;
+        (*(tint_symbol_9)).arr[x_108] = 3;
+        break;
+      }
+      case 0: {
+        int const x_106 = i_3;
+        (*(tint_symbol_9)).arr[x_106] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    int const x_126 = i_3;
+    i_3 = (x_126 + 1);
+    {
+      int const x_128 = i_3;
+      if ((x_128 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  while (true) {
+    int const x_134 = j_1;
+    if ((x_134 < 10)) {
+    } else {
+      break;
+    }
+    int const x_137 = j_1;
+    int const x_138 = j_1;
+    int const x_140 = (*(tint_symbol_9)).arr[x_138];
+    (*(tint_symbol_10)).arr[x_137] = x_140;
+    {
+      int const x_142 = j_1;
+      j_1 = (x_142 + 1);
+    }
+  }
+  mergeSort_(x_28, tint_symbol_9, tint_symbol_10);
+  float const x_146 = (*(tint_symbol_11)).y;
+  if ((int(x_146) < 30)) {
+    int const x_153 = (*(tint_symbol_9)).arr[0];
+    grey = (0.5f + (float(x_153) / 10.0f));
+  } else {
+    float const x_158 = (*(tint_symbol_11)).y;
+    if ((int(x_158) < 60)) {
+      int const x_165 = (*(tint_symbol_9)).arr[1];
+      grey = (0.5f + (float(x_165) / 10.0f));
+    } else {
+      float const x_170 = (*(tint_symbol_11)).y;
+      if ((int(x_170) < 90)) {
+        int const x_177 = (*(tint_symbol_9)).arr[2];
+        grey = (0.5f + (float(x_177) / 10.0f));
+      } else {
+        float const x_182 = (*(tint_symbol_11)).y;
+        if ((int(x_182) < 120)) {
+          int const x_189 = (*(tint_symbol_9)).arr[3];
+          grey = (0.5f + (float(x_189) / 10.0f));
+        } else {
+          float const x_194 = (*(tint_symbol_11)).y;
+          if ((int(x_194) < 150)) {
+            discard_fragment();
+          } else {
+            float const x_201 = (*(tint_symbol_11)).y;
+            if ((int(x_201) < 180)) {
+              int const x_208 = (*(tint_symbol_9)).arr[5];
+              grey = (0.5f + (float(x_208) / 10.0f));
+            } else {
+              float const x_213 = (*(tint_symbol_11)).y;
+              if ((int(x_213) < 210)) {
+                int const x_220 = (*(tint_symbol_9)).arr[6];
+                grey = (0.5f + (float(x_220) / 10.0f));
+              } else {
+                float const x_225 = (*(tint_symbol_11)).y;
+                if ((int(x_225) < 240)) {
+                  int const x_232 = (*(tint_symbol_9)).arr[7];
+                  grey = (0.5f + (float(x_232) / 10.0f));
+                } else {
+                  float const x_237 = (*(tint_symbol_11)).y;
+                  if ((int(x_237) < 270)) {
+                    int const x_244 = (*(tint_symbol_9)).arr[8];
+                    grey = (0.5f + (float(x_244) / 10.0f));
+                  } else {
+                    discard_fragment();
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  float const x_248 = grey;
+  float3 const x_249 = float3(x_248, x_248, x_248);
+  *(tint_symbol_12) = float4(x_249.x, x_249.y, x_249.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_28 [[buffer(0)]]) {
+  thread float4 tint_symbol_13 = 0.0f;
+  thread tint_array_wrapper tint_symbol_14 = {};
+  thread tint_array_wrapper tint_symbol_15 = {};
+  thread float4 tint_symbol_16 = 0.0f;
+  tint_symbol_13 = gl_FragCoord_param;
+  main_1(x_28, &(tint_symbol_14), &(tint_symbol_15), &(tint_symbol_13), &(tint_symbol_16));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_16};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/2-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/2-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..338bca8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/2-opt.wgsl.expected.spvasm
@@ -0,0 +1,862 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 523
+; Schema: 0
+               OpCapability Shader
+        %288 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %data "data"
+               OpName %temp "temp"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_28 "x_28"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %merge_i1_i1_i1_ "merge_i1_i1_i1_"
+               OpName %from "from"
+               OpName %mid "mid"
+               OpName %to "to"
+               OpName %k "k"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %i_1 "i_1"
+               OpName %x_283 "x_283"
+               OpName %x_284 "x_284"
+               OpName %x_303 "x_303"
+               OpName %x_304 "x_304"
+               OpName %x_318 "x_318"
+               OpName %x_322 "x_322"
+               OpName %x_337 "x_337"
+               OpName %x_336 "x_336"
+               OpName %x_350 "x_350"
+               OpName %x_349 "x_349"
+               OpName %x_364 "x_364"
+               OpName %x_363 "x_363"
+               OpName %x_285_phi "x_285_phi"
+               OpName %x_305_phi "x_305_phi"
+               OpName %x_326_phi "x_326_phi"
+               OpName %x_338_phi "x_338_phi"
+               OpName %x_351_phi "x_351_phi"
+               OpName %x_365_phi "x_365_phi"
+               OpName %mergeSort_ "mergeSort_"
+               OpName %low "low"
+               OpName %high "high"
+               OpName %m "m"
+               OpName %i_2 "i_2"
+               OpName %from_1 "from_1"
+               OpName %mid_1 "mid_1"
+               OpName %to_1 "to_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %main_1 "main_1"
+               OpName %i_3 "i_3"
+               OpName %j_1 "j_1"
+               OpName %grey "grey"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_28 NonWritable
+               OpDecorate %x_28 DescriptorSet 0
+               OpDecorate %x_28 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Private__arr_int_uint_10 = OpTypePointer Private %_arr_int_uint_10
+          %7 = OpConstantNull %_arr_int_uint_10
+       %data = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+       %temp = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_28 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %17
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int %_ptr_Function_int
+         %32 = OpConstantNull %int
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+%_ptr_Private_int = OpTypePointer Private %int
+      %int_0 = OpConstant %int 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+     %int_10 = OpConstant %int 10
+        %244 = OpTypeFunction %void
+      %int_9 = OpConstant %int 9
+      %int_2 = OpConstant %int 2
+%_ptr_Function_float = OpTypePointer Function %float
+        %312 = OpConstantNull %float
+     %int_n5 = OpConstant %int -5
+     %int_n4 = OpConstant %int -4
+     %int_n3 = OpConstant %int -3
+     %int_n2 = OpConstant %int -2
+     %int_n1 = OpConstant %int -1
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+%_ptr_Private_float = OpTypePointer Private %float
+     %int_30 = OpConstant %int 30
+  %float_0_5 = OpConstant %float 0.5
+   %float_10 = OpConstant %float 10
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+    %v3float = OpTypeVector %float 3
+   %main_out = OpTypeStruct %v4float
+        %510 = OpTypeFunction %void %main_out
+%merge_i1_i1_i1_ = OpFunction %void None %23
+       %from = OpFunctionParameter %_ptr_Function_int
+        %mid = OpFunctionParameter %_ptr_Function_int
+         %to = OpFunctionParameter %_ptr_Function_int
+         %30 = OpLabel
+          %k = OpVariable %_ptr_Function_int Function %32
+          %i = OpVariable %_ptr_Function_int Function %32
+          %j = OpVariable %_ptr_Function_int Function %32
+        %i_1 = OpVariable %_ptr_Function_int Function %32
+      %x_283 = OpVariable %_ptr_Function_int Function %32
+      %x_284 = OpVariable %_ptr_Function_int Function %32
+      %x_303 = OpVariable %_ptr_Function_int Function %32
+      %x_304 = OpVariable %_ptr_Function_int Function %32
+      %x_318 = OpVariable %_ptr_Function_int Function %32
+      %x_322 = OpVariable %_ptr_Function_int Function %32
+      %x_337 = OpVariable %_ptr_Function_int Function %32
+      %x_336 = OpVariable %_ptr_Function_int Function %32
+      %x_350 = OpVariable %_ptr_Function_int Function %32
+      %x_349 = OpVariable %_ptr_Function_int Function %32
+      %x_364 = OpVariable %_ptr_Function_int Function %32
+      %x_363 = OpVariable %_ptr_Function_int Function %32
+  %x_285_phi = OpVariable %_ptr_Function_int Function %32
+  %x_305_phi = OpVariable %_ptr_Function_int Function %32
+  %x_326_phi = OpVariable %_ptr_Function_int Function %32
+  %x_338_phi = OpVariable %_ptr_Function_int Function %32
+  %x_351_phi = OpVariable %_ptr_Function_int Function %32
+  %x_365_phi = OpVariable %_ptr_Function_int Function %32
+         %37 = OpLoad %int %from
+               OpStore %k %37
+         %39 = OpLoad %int %from
+               OpStore %i %39
+         %41 = OpLoad %int %mid
+         %43 = OpIAdd %int %41 %int_1
+               OpStore %j %43
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %68 = OpFOrdGreaterThanEqual %bool %float_1 %float_0
+               OpSelectionMerge %70 None
+               OpBranchConditional %68 %71 %72
+         %71 = OpLabel
+               OpBranch %70
+         %72 = OpLabel
+               OpBranch %46
+         %70 = OpLabel
+         %73 = OpLoad %int %i
+         %75 = OpLoad %int %mid
+         %76 = OpLoad %int %j
+         %78 = OpLoad %int %to
+         %79 = OpSLessThanEqual %bool %73 %75
+               OpSelectionMerge %80 None
+               OpBranchConditional %79 %81 %80
+         %81 = OpLabel
+         %82 = OpSLessThanEqual %bool %76 %78
+               OpBranch %80
+         %80 = OpLabel
+         %83 = OpPhi %bool %79 %70 %82 %81
+               OpSelectionMerge %84 None
+               OpBranchConditional %83 %85 %86
+         %85 = OpLabel
+               OpBranch %84
+         %86 = OpLabel
+               OpBranch %45
+         %84 = OpLabel
+         %87 = OpLoad %int %i
+         %89 = OpAccessChain %_ptr_Private_int %data %87
+         %90 = OpLoad %int %89
+         %91 = OpLoad %int %j
+         %92 = OpAccessChain %_ptr_Private_int %data %91
+         %93 = OpLoad %int %92
+         %94 = OpSLessThan %bool %90 %93
+               OpSelectionMerge %95 None
+               OpBranchConditional %94 %96 %97
+         %96 = OpLabel
+         %98 = OpLoad %int %k
+               OpStore %x_283 %98
+         %99 = OpLoad %int %x_283
+               OpStore %x_285_phi %99
+               OpBranch %95
+         %97 = OpLabel
+               OpStore %x_284 %int_0
+        %101 = OpLoad %int %x_284
+               OpStore %x_285_phi %101
+               OpBranch %95
+         %95 = OpLabel
+        %102 = OpLoad %int %x_285_phi
+        %103 = OpIAdd %int %102 %int_1
+               OpSelectionMerge %104 None
+               OpBranchConditional %94 %105 %104
+        %105 = OpLabel
+               OpStore %k %103
+        %108 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_0
+        %109 = OpLoad %float %108
+        %111 = OpFOrdLessThanEqual %bool %float_1 %109
+        %110 = OpLogicalNot %bool %111
+               OpSelectionMerge %112 None
+               OpBranchConditional %110 %113 %114
+        %113 = OpLabel
+               OpBranch %112
+        %114 = OpLabel
+               OpBranch %46
+        %112 = OpLabel
+               OpBranch %104
+        %104 = OpLabel
+        %116 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_1
+        %117 = OpLoad %float %116
+        %118 = OpFOrdGreaterThanEqual %bool %117 %float_0
+               OpSelectionMerge %119 None
+               OpBranchConditional %118 %120 %121
+        %120 = OpLabel
+               OpBranch %119
+        %121 = OpLabel
+               OpBranch %46
+        %119 = OpLabel
+               OpSelectionMerge %122 None
+               OpBranchConditional %94 %123 %124
+        %123 = OpLabel
+        %125 = OpLoad %int %i
+               OpStore %x_303 %125
+        %126 = OpLoad %int %x_303
+               OpStore %x_305_phi %126
+               OpBranch %122
+        %124 = OpLabel
+               OpStore %x_304 %int_0
+        %127 = OpLoad %int %x_304
+               OpStore %x_305_phi %127
+               OpBranch %122
+        %122 = OpLabel
+        %128 = OpLoad %int %x_305_phi
+        %129 = OpSelect %int %94 %128 %int_0
+               OpSelectionMerge %130 None
+               OpBranchConditional %94 %131 %130
+        %131 = OpLabel
+        %132 = OpIAdd %int %129 %int_1
+               OpStore %i %132
+               OpBranch %130
+        %130 = OpLabel
+               OpSelectionMerge %133 None
+               OpBranchConditional %94 %134 %135
+        %134 = OpLabel
+        %136 = OpAccessChain %_ptr_Private_int %data %129
+        %137 = OpLoad %int %136
+               OpStore %x_318 %137
+        %138 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_1
+        %139 = OpLoad %float %138
+        %140 = OpLoad %int %x_318
+               OpStore %x_326_phi %140
+        %142 = OpFOrdLessThanEqual %bool %float_0 %139
+        %141 = OpLogicalNot %bool %142
+               OpSelectionMerge %143 None
+               OpBranchConditional %141 %144 %143
+        %144 = OpLabel
+               OpBranch %46
+        %143 = OpLabel
+               OpBranch %133
+        %135 = OpLabel
+               OpStore %x_322 %int_0
+        %145 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_1
+        %146 = OpLoad %float %145
+        %147 = OpLoad %int %x_322
+               OpStore %x_326_phi %147
+        %149 = OpFOrdLessThan %bool %146 %float_0
+        %148 = OpLogicalNot %bool %149
+               OpSelectionMerge %150 None
+               OpBranchConditional %148 %151 %152
+        %151 = OpLabel
+               OpBranch %150
+        %152 = OpLabel
+               OpBranch %46
+        %150 = OpLabel
+               OpBranch %133
+        %133 = OpLabel
+        %153 = OpLoad %int %x_326_phi
+               OpSelectionMerge %154 None
+               OpBranchConditional %94 %155 %154
+        %155 = OpLabel
+        %156 = OpAccessChain %_ptr_Private_int %temp %102
+        %157 = OpSelect %int %94 %153 %int_0
+               OpStore %156 %157
+               OpBranch %154
+        %154 = OpLabel
+               OpSelectionMerge %158 None
+               OpBranchConditional %94 %159 %160
+        %159 = OpLabel
+               OpStore %x_337 %int_0
+        %161 = OpLoad %int %x_337
+               OpStore %x_338_phi %161
+               OpBranch %158
+        %160 = OpLabel
+        %162 = OpLoad %int %k
+               OpStore %x_336 %162
+        %163 = OpLoad %int %x_336
+               OpStore %x_338_phi %163
+               OpBranch %158
+        %158 = OpLabel
+        %164 = OpLoad %int %x_338_phi
+               OpSelectionMerge %165 None
+               OpBranchConditional %94 %166 %167
+        %166 = OpLabel
+               OpBranch %165
+        %167 = OpLabel
+        %168 = OpIAdd %int %164 %int_1
+               OpStore %k %168
+               OpBranch %165
+        %165 = OpLabel
+        %169 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_0
+        %170 = OpLoad %float %169
+        %172 = OpFOrdLessThanEqual %bool %float_1 %170
+        %171 = OpLogicalNot %bool %172
+               OpSelectionMerge %173 None
+               OpBranchConditional %171 %174 %175
+        %174 = OpLabel
+               OpBranch %173
+        %175 = OpLabel
+               OpBranch %46
+        %173 = OpLabel
+               OpSelectionMerge %176 None
+               OpBranchConditional %94 %177 %178
+        %177 = OpLabel
+               OpStore %x_350 %int_0
+        %179 = OpLoad %int %x_350
+               OpStore %x_351_phi %179
+               OpBranch %176
+        %178 = OpLabel
+        %180 = OpLoad %int %j
+               OpStore %x_349 %180
+        %181 = OpLoad %int %x_349
+               OpStore %x_351_phi %181
+               OpBranch %176
+        %176 = OpLabel
+        %182 = OpLoad %int %x_351_phi
+        %183 = OpSelect %int %94 %int_0 %182
+               OpSelectionMerge %184 None
+               OpBranchConditional %94 %185 %186
+        %185 = OpLabel
+               OpBranch %184
+        %186 = OpLabel
+        %187 = OpIAdd %int %183 %int_1
+               OpStore %j %187
+               OpBranch %184
+        %184 = OpLabel
+               OpSelectionMerge %188 None
+               OpBranchConditional %94 %189 %190
+        %189 = OpLabel
+               OpStore %x_364 %int_0
+        %191 = OpLoad %int %x_364
+               OpStore %x_365_phi %191
+               OpBranch %188
+        %190 = OpLabel
+        %192 = OpAccessChain %_ptr_Private_int %data %183
+        %193 = OpLoad %int %192
+               OpStore %x_363 %193
+        %194 = OpLoad %int %x_363
+               OpStore %x_365_phi %194
+               OpBranch %188
+        %188 = OpLabel
+        %195 = OpLoad %int %x_365_phi
+               OpSelectionMerge %196 None
+               OpBranchConditional %94 %197 %198
+        %197 = OpLabel
+               OpBranch %196
+        %198 = OpLabel
+        %199 = OpAccessChain %_ptr_Private_int %temp %164
+               OpStore %199 %195
+               OpBranch %196
+        %196 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+               OpBranch %44
+         %45 = OpLabel
+               OpBranch %200
+        %200 = OpLabel
+               OpLoopMerge %201 %202 None
+               OpBranch %203
+        %203 = OpLabel
+        %204 = OpLoad %int %i
+        %205 = OpLoad %int %i
+        %207 = OpLoad %int %mid
+        %209 = OpSLessThan %bool %204 %int_10
+               OpSelectionMerge %210 None
+               OpBranchConditional %209 %211 %210
+        %211 = OpLabel
+        %212 = OpSLessThanEqual %bool %205 %207
+               OpBranch %210
+        %210 = OpLabel
+        %213 = OpPhi %bool %209 %203 %212 %211
+               OpSelectionMerge %214 None
+               OpBranchConditional %213 %215 %216
+        %215 = OpLabel
+               OpBranch %214
+        %216 = OpLabel
+               OpBranch %201
+        %214 = OpLabel
+        %217 = OpLoad %int %k
+        %218 = OpIAdd %int %217 %int_1
+               OpStore %k %218
+        %219 = OpLoad %int %i
+        %220 = OpIAdd %int %219 %int_1
+               OpStore %i %220
+        %221 = OpAccessChain %_ptr_Private_int %data %219
+        %222 = OpLoad %int %221
+        %223 = OpAccessChain %_ptr_Private_int %temp %217
+               OpStore %223 %222
+               OpBranch %202
+        %202 = OpLabel
+               OpBranch %200
+        %201 = OpLabel
+        %225 = OpLoad %int %from
+               OpStore %i_1 %225
+               OpBranch %226
+        %226 = OpLabel
+               OpLoopMerge %227 %228 None
+               OpBranch %229
+        %229 = OpLabel
+        %230 = OpLoad %int %i_1
+        %232 = OpLoad %int %to
+        %233 = OpSLessThanEqual %bool %230 %232
+               OpSelectionMerge %234 None
+               OpBranchConditional %233 %235 %236
+        %235 = OpLabel
+               OpBranch %234
+        %236 = OpLabel
+               OpBranch %227
+        %234 = OpLabel
+        %237 = OpLoad %int %i_1
+        %238 = OpLoad %int %i_1
+        %239 = OpAccessChain %_ptr_Private_int %temp %238
+        %240 = OpLoad %int %239
+        %241 = OpAccessChain %_ptr_Private_int %data %237
+               OpStore %241 %240
+               OpBranch %228
+        %228 = OpLabel
+        %242 = OpLoad %int %i_1
+        %243 = OpIAdd %int %242 %int_1
+               OpStore %i_1 %243
+               OpBranch %226
+        %227 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %mergeSort_ = OpFunction %void None %244
+        %246 = OpLabel
+        %low = OpVariable %_ptr_Function_int Function %32
+       %high = OpVariable %_ptr_Function_int Function %32
+          %m = OpVariable %_ptr_Function_int Function %32
+        %i_2 = OpVariable %_ptr_Function_int Function %32
+     %from_1 = OpVariable %_ptr_Function_int Function %32
+      %mid_1 = OpVariable %_ptr_Function_int Function %32
+       %to_1 = OpVariable %_ptr_Function_int Function %32
+      %param = OpVariable %_ptr_Function_int Function %32
+    %param_1 = OpVariable %_ptr_Function_int Function %32
+    %param_2 = OpVariable %_ptr_Function_int Function %32
+               OpStore %low %int_0
+               OpStore %high %int_9
+               OpStore %m %int_1
+               OpBranch %258
+        %258 = OpLabel
+               OpLoopMerge %259 %260 None
+               OpBranch %261
+        %261 = OpLabel
+        %262 = OpLoad %int %m
+        %263 = OpLoad %int %high
+        %264 = OpSLessThanEqual %bool %262 %263
+               OpSelectionMerge %265 None
+               OpBranchConditional %264 %266 %267
+        %266 = OpLabel
+               OpBranch %265
+        %267 = OpLabel
+               OpBranch %259
+        %265 = OpLabel
+        %268 = OpLoad %int %low
+               OpStore %i_2 %268
+               OpBranch %269
+        %269 = OpLabel
+               OpLoopMerge %270 %271 None
+               OpBranch %272
+        %272 = OpLabel
+        %273 = OpLoad %int %i_2
+        %274 = OpLoad %int %high
+        %275 = OpSLessThan %bool %273 %274
+               OpSelectionMerge %276 None
+               OpBranchConditional %275 %277 %278
+        %277 = OpLabel
+               OpBranch %276
+        %278 = OpLabel
+               OpBranch %270
+        %276 = OpLabel
+        %279 = OpLoad %int %i_2
+               OpStore %from_1 %279
+        %280 = OpLoad %int %i_2
+        %281 = OpLoad %int %m
+        %282 = OpIAdd %int %280 %281
+        %283 = OpISub %int %282 %int_1
+               OpStore %mid_1 %283
+        %284 = OpLoad %int %i_2
+        %285 = OpLoad %int %m
+        %286 = OpLoad %int %high
+        %290 = OpIMul %int %int_2 %285
+        %291 = OpIAdd %int %284 %290
+        %292 = OpISub %int %291 %int_1
+        %287 = OpExtInst %int %288 SMin %292 %286
+               OpStore %to_1 %287
+        %293 = OpLoad %int %from_1
+               OpStore %param %293
+        %294 = OpLoad %int %mid_1
+               OpStore %param_1 %294
+        %295 = OpLoad %int %to_1
+               OpStore %param_2 %295
+        %296 = OpFunctionCall %void %merge_i1_i1_i1_ %param %param_1 %param_2
+               OpBranch %271
+        %271 = OpLabel
+        %300 = OpLoad %int %m
+        %301 = OpLoad %int %i_2
+        %302 = OpIMul %int %int_2 %300
+        %303 = OpIAdd %int %301 %302
+               OpStore %i_2 %303
+               OpBranch %269
+        %270 = OpLabel
+               OpBranch %260
+        %260 = OpLabel
+        %304 = OpLoad %int %m
+        %305 = OpIMul %int %int_2 %304
+               OpStore %m %305
+               OpBranch %258
+        %259 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %244
+        %307 = OpLabel
+        %i_3 = OpVariable %_ptr_Function_int Function %32
+        %j_1 = OpVariable %_ptr_Function_int Function %32
+       %grey = OpVariable %_ptr_Function_float Function %312
+        %313 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_0
+        %314 = OpLoad %float %313
+        %315 = OpConvertFToS %int %314
+               OpStore %i_3 %315
+               OpBranch %316
+        %316 = OpLabel
+               OpLoopMerge %317 %318 None
+               OpBranch %319
+        %319 = OpLabel
+        %320 = OpLoad %int %i_3
+               OpSelectionMerge %321 None
+               OpSwitch %320 %322 9 %323 8 %324 7 %325 6 %326 5 %327 4 %328 3 %329 2 %330 1 %331 0 %332
+        %323 = OpLabel
+        %333 = OpLoad %int %i_3
+        %334 = OpAccessChain %_ptr_Private_int %data %333
+               OpStore %334 %int_n5
+               OpBranch %321
+        %324 = OpLabel
+        %336 = OpLoad %int %i_3
+        %337 = OpAccessChain %_ptr_Private_int %data %336
+               OpStore %337 %int_n4
+               OpBranch %321
+        %325 = OpLabel
+        %339 = OpLoad %int %i_3
+        %340 = OpAccessChain %_ptr_Private_int %data %339
+               OpStore %340 %int_n3
+               OpBranch %321
+        %326 = OpLabel
+        %342 = OpLoad %int %i_3
+        %343 = OpAccessChain %_ptr_Private_int %data %342
+               OpStore %343 %int_n2
+               OpBranch %321
+        %327 = OpLabel
+        %345 = OpLoad %int %i_3
+        %346 = OpAccessChain %_ptr_Private_int %data %345
+               OpStore %346 %int_n1
+               OpBranch %321
+        %328 = OpLabel
+        %348 = OpLoad %int %i_3
+        %349 = OpAccessChain %_ptr_Private_int %data %348
+               OpStore %349 %int_0
+               OpBranch %321
+        %329 = OpLabel
+        %350 = OpLoad %int %i_3
+        %351 = OpAccessChain %_ptr_Private_int %data %350
+               OpStore %351 %int_1
+               OpBranch %321
+        %330 = OpLabel
+        %352 = OpLoad %int %i_3
+        %353 = OpAccessChain %_ptr_Private_int %data %352
+               OpStore %353 %int_2
+               OpBranch %321
+        %331 = OpLabel
+        %354 = OpLoad %int %i_3
+        %355 = OpAccessChain %_ptr_Private_int %data %354
+               OpStore %355 %int_3
+               OpBranch %321
+        %332 = OpLabel
+        %357 = OpLoad %int %i_3
+        %358 = OpAccessChain %_ptr_Private_int %data %357
+               OpStore %358 %int_4
+               OpBranch %321
+        %322 = OpLabel
+               OpBranch %321
+        %321 = OpLabel
+        %360 = OpLoad %int %i_3
+        %361 = OpIAdd %int %360 %int_1
+               OpStore %i_3 %361
+               OpBranch %318
+        %318 = OpLabel
+        %362 = OpLoad %int %i_3
+        %363 = OpSLessThan %bool %362 %int_10
+               OpSelectionMerge %364 None
+               OpBranchConditional %363 %365 %366
+        %365 = OpLabel
+               OpBranch %364
+        %366 = OpLabel
+               OpBranch %317
+        %364 = OpLabel
+               OpBranch %316
+        %317 = OpLabel
+               OpStore %j_1 %int_0
+               OpBranch %367
+        %367 = OpLabel
+               OpLoopMerge %368 %369 None
+               OpBranch %370
+        %370 = OpLabel
+        %371 = OpLoad %int %j_1
+        %372 = OpSLessThan %bool %371 %int_10
+               OpSelectionMerge %373 None
+               OpBranchConditional %372 %374 %375
+        %374 = OpLabel
+               OpBranch %373
+        %375 = OpLabel
+               OpBranch %368
+        %373 = OpLabel
+        %376 = OpLoad %int %j_1
+        %377 = OpLoad %int %j_1
+        %378 = OpAccessChain %_ptr_Private_int %data %377
+        %379 = OpLoad %int %378
+        %380 = OpAccessChain %_ptr_Private_int %temp %376
+               OpStore %380 %379
+               OpBranch %369
+        %369 = OpLabel
+        %381 = OpLoad %int %j_1
+        %382 = OpIAdd %int %381 %int_1
+               OpStore %j_1 %382
+               OpBranch %367
+        %368 = OpLabel
+        %383 = OpFunctionCall %void %mergeSort_
+        %385 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %386 = OpLoad %float %385
+        %387 = OpConvertFToS %int %386
+        %389 = OpSLessThan %bool %387 %int_30
+               OpSelectionMerge %390 None
+               OpBranchConditional %389 %391 %392
+        %391 = OpLabel
+        %393 = OpAccessChain %_ptr_Private_int %data %int_0
+        %394 = OpLoad %int %393
+        %396 = OpConvertSToF %float %394
+        %398 = OpFDiv %float %396 %float_10
+        %399 = OpFAdd %float %float_0_5 %398
+               OpStore %grey %399
+               OpBranch %390
+        %392 = OpLabel
+        %400 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %401 = OpLoad %float %400
+        %402 = OpConvertFToS %int %401
+        %404 = OpSLessThan %bool %402 %int_60
+               OpSelectionMerge %405 None
+               OpBranchConditional %404 %406 %407
+        %406 = OpLabel
+        %408 = OpAccessChain %_ptr_Private_int %data %int_1
+        %409 = OpLoad %int %408
+        %410 = OpConvertSToF %float %409
+        %411 = OpFDiv %float %410 %float_10
+        %412 = OpFAdd %float %float_0_5 %411
+               OpStore %grey %412
+               OpBranch %405
+        %407 = OpLabel
+        %413 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %414 = OpLoad %float %413
+        %415 = OpConvertFToS %int %414
+        %417 = OpSLessThan %bool %415 %int_90
+               OpSelectionMerge %418 None
+               OpBranchConditional %417 %419 %420
+        %419 = OpLabel
+        %421 = OpAccessChain %_ptr_Private_int %data %int_2
+        %422 = OpLoad %int %421
+        %423 = OpConvertSToF %float %422
+        %424 = OpFDiv %float %423 %float_10
+        %425 = OpFAdd %float %float_0_5 %424
+               OpStore %grey %425
+               OpBranch %418
+        %420 = OpLabel
+        %426 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %427 = OpLoad %float %426
+        %428 = OpConvertFToS %int %427
+        %430 = OpSLessThan %bool %428 %int_120
+               OpSelectionMerge %431 None
+               OpBranchConditional %430 %432 %433
+        %432 = OpLabel
+        %434 = OpAccessChain %_ptr_Private_int %data %int_3
+        %435 = OpLoad %int %434
+        %436 = OpConvertSToF %float %435
+        %437 = OpFDiv %float %436 %float_10
+        %438 = OpFAdd %float %float_0_5 %437
+               OpStore %grey %438
+               OpBranch %431
+        %433 = OpLabel
+        %439 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %440 = OpLoad %float %439
+        %441 = OpConvertFToS %int %440
+        %443 = OpSLessThan %bool %441 %int_150
+               OpSelectionMerge %444 None
+               OpBranchConditional %443 %445 %446
+        %445 = OpLabel
+               OpKill
+        %446 = OpLabel
+        %447 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %448 = OpLoad %float %447
+        %449 = OpConvertFToS %int %448
+        %451 = OpSLessThan %bool %449 %int_180
+               OpSelectionMerge %452 None
+               OpBranchConditional %451 %453 %454
+        %453 = OpLabel
+        %456 = OpAccessChain %_ptr_Private_int %data %int_5
+        %457 = OpLoad %int %456
+        %458 = OpConvertSToF %float %457
+        %459 = OpFDiv %float %458 %float_10
+        %460 = OpFAdd %float %float_0_5 %459
+               OpStore %grey %460
+               OpBranch %452
+        %454 = OpLabel
+        %461 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %462 = OpLoad %float %461
+        %463 = OpConvertFToS %int %462
+        %465 = OpSLessThan %bool %463 %int_210
+               OpSelectionMerge %466 None
+               OpBranchConditional %465 %467 %468
+        %467 = OpLabel
+        %470 = OpAccessChain %_ptr_Private_int %data %int_6
+        %471 = OpLoad %int %470
+        %472 = OpConvertSToF %float %471
+        %473 = OpFDiv %float %472 %float_10
+        %474 = OpFAdd %float %float_0_5 %473
+               OpStore %grey %474
+               OpBranch %466
+        %468 = OpLabel
+        %475 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %476 = OpLoad %float %475
+        %477 = OpConvertFToS %int %476
+        %479 = OpSLessThan %bool %477 %int_240
+               OpSelectionMerge %480 None
+               OpBranchConditional %479 %481 %482
+        %481 = OpLabel
+        %484 = OpAccessChain %_ptr_Private_int %data %int_7
+        %485 = OpLoad %int %484
+        %486 = OpConvertSToF %float %485
+        %487 = OpFDiv %float %486 %float_10
+        %488 = OpFAdd %float %float_0_5 %487
+               OpStore %grey %488
+               OpBranch %480
+        %482 = OpLabel
+        %489 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %490 = OpLoad %float %489
+        %491 = OpConvertFToS %int %490
+        %493 = OpSLessThan %bool %491 %int_270
+               OpSelectionMerge %494 None
+               OpBranchConditional %493 %495 %496
+        %495 = OpLabel
+        %498 = OpAccessChain %_ptr_Private_int %data %int_8
+        %499 = OpLoad %int %498
+        %500 = OpConvertSToF %float %499
+        %501 = OpFDiv %float %500 %float_10
+        %502 = OpFAdd %float %float_0_5 %501
+               OpStore %grey %502
+               OpBranch %494
+        %496 = OpLabel
+               OpKill
+        %494 = OpLabel
+               OpBranch %480
+        %480 = OpLabel
+               OpBranch %466
+        %466 = OpLabel
+               OpBranch %452
+        %452 = OpLabel
+               OpBranch %444
+        %444 = OpLabel
+               OpBranch %431
+        %431 = OpLabel
+               OpBranch %418
+        %418 = OpLabel
+               OpBranch %405
+        %405 = OpLabel
+               OpBranch %390
+        %390 = OpLabel
+        %503 = OpLoad %float %grey
+        %505 = OpCompositeConstruct %v3float %503 %503 %503
+        %506 = OpCompositeExtract %float %505 0
+        %507 = OpCompositeExtract %float %505 1
+        %508 = OpCompositeExtract %float %505 2
+        %509 = OpCompositeConstruct %v4float %506 %507 %508 %float_1
+               OpStore %x_GLF_color %509
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %510
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %514 = OpLabel
+        %515 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %515
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %244
+        %517 = OpLabel
+        %518 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %518
+        %519 = OpFunctionCall %void %main_1
+        %521 = OpLoad %v4float %x_GLF_color
+        %522 = OpCompositeConstruct %main_out %521
+        %520 = OpFunctionCall %void %tint_symbol_3 %522
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 318[%318] is not post dominated by the back-edge block 364[%364]
+  %364 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/2-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/2-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..e349c0c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/2-opt.wgsl.expected.wgsl
@@ -0,0 +1,413 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> data : array<i32, 10>;
+
+var<private> temp : array<i32, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn merge_i1_i1_i1_(from : ptr<function, i32>, mid : ptr<function, i32>, to : ptr<function, i32>) {
+  var k : i32;
+  var i : i32;
+  var j : i32;
+  var i_1 : i32;
+  let x_255 : i32 = *(from);
+  k = x_255;
+  let x_256 : i32 = *(from);
+  i = x_256;
+  let x_257 : i32 = *(mid);
+  j = (x_257 + 1);
+  loop {
+    var x_283 : i32;
+    var x_284 : i32;
+    var x_303 : i32;
+    var x_304 : i32;
+    var x_318 : i32;
+    var x_322 : i32;
+    var x_337 : i32;
+    var x_336 : i32;
+    var x_350 : i32;
+    var x_349 : i32;
+    var x_364 : i32;
+    var x_363 : i32;
+    var x_285_phi : i32;
+    var x_305_phi : i32;
+    var x_326_phi : i32;
+    var x_338_phi : i32;
+    var x_351_phi : i32;
+    var x_365_phi : i32;
+    if ((1.0 >= 0.0)) {
+    } else {
+      continue;
+    }
+    let x_264 : i32 = i;
+    let x_265 : i32 = *(mid);
+    let x_267 : i32 = j;
+    let x_268 : i32 = *(to);
+    if (((x_264 <= x_265) && (x_267 <= x_268))) {
+    } else {
+      break;
+    }
+    let x_272 : i32 = i;
+    let x_274 : i32 = data[x_272];
+    let x_275 : i32 = j;
+    let x_277 : i32 = data[x_275];
+    let x_278 : bool = (x_274 < x_277);
+    if (x_278) {
+      x_283 = k;
+      x_285_phi = x_283;
+    } else {
+      x_284 = 0;
+      x_285_phi = x_284;
+    }
+    let x_285 : i32 = x_285_phi;
+    let x_286 : i32 = (x_285 + 1);
+    if (x_278) {
+      k = x_286;
+      let x_291 : f32 = x_28.injectionSwitch.x;
+      if (!((1.0 <= x_291))) {
+      } else {
+        continue;
+      }
+    }
+    let x_295 : f32 = x_28.injectionSwitch.y;
+    if ((x_295 >= 0.0)) {
+    } else {
+      continue;
+    }
+    let x_298 : i32 = 0;
+    if (x_278) {
+      x_303 = i;
+      x_305_phi = x_303;
+    } else {
+      x_304 = 0;
+      x_305_phi = x_304;
+    }
+    let x_305 : i32 = x_305_phi;
+    let x_307 : i32 = select(x_298, x_305, x_278);
+    if (x_278) {
+      i = (x_307 + 1);
+    }
+    let x_313 : i32 = 0;
+    if (x_278) {
+      x_318 = data[x_307];
+      let x_320 : f32 = x_28.injectionSwitch.y;
+      x_326_phi = x_318;
+      if (!((0.0 <= x_320))) {
+        continue;
+      }
+    } else {
+      x_322 = 0;
+      let x_324 : f32 = x_28.injectionSwitch.y;
+      x_326_phi = x_322;
+      if (!((x_324 < 0.0))) {
+      } else {
+        continue;
+      }
+    }
+    let x_326 : i32 = x_326_phi;
+    if (x_278) {
+      temp[x_285] = select(x_313, x_326, x_278);
+    }
+    if (x_278) {
+      x_337 = 0;
+      x_338_phi = x_337;
+    } else {
+      x_336 = k;
+      x_338_phi = x_336;
+    }
+    let x_338 : i32 = x_338_phi;
+    if (x_278) {
+    } else {
+      k = (x_338 + 1);
+    }
+    let x_343 : f32 = x_28.injectionSwitch.x;
+    if (!((1.0 <= x_343))) {
+    } else {
+      continue;
+    }
+    if (x_278) {
+      x_350 = 0;
+      x_351_phi = x_350;
+    } else {
+      x_349 = j;
+      x_351_phi = x_349;
+    }
+    let x_351 : i32 = x_351_phi;
+    let x_353 : i32 = 0;
+    let x_355 : i32 = select(x_351, x_353, x_278);
+    if (x_278) {
+    } else {
+      j = (x_355 + 1);
+    }
+    if (x_278) {
+      x_364 = 0;
+      x_365_phi = x_364;
+    } else {
+      x_363 = data[x_355];
+      x_365_phi = x_363;
+    }
+    let x_365 : i32 = x_365_phi;
+    if (x_278) {
+    } else {
+      temp[x_338] = x_365;
+    }
+  }
+  loop {
+    let x_374 : i32 = i;
+    let x_376 : i32 = i;
+    let x_377 : i32 = *(mid);
+    if (((x_374 < 10) && (x_376 <= x_377))) {
+    } else {
+      break;
+    }
+    let x_381 : i32 = k;
+    k = (x_381 + 1);
+    let x_383 : i32 = i;
+    i = (x_383 + 1);
+    let x_386 : i32 = data[x_383];
+    temp[x_381] = x_386;
+  }
+  let x_388 : i32 = *(from);
+  i_1 = x_388;
+  loop {
+    let x_393 : i32 = i_1;
+    let x_394 : i32 = *(to);
+    if ((x_393 <= x_394)) {
+    } else {
+      break;
+    }
+    let x_397 : i32 = i_1;
+    let x_398 : i32 = i_1;
+    let x_400 : i32 = temp[x_398];
+    data[x_397] = x_400;
+
+    continuing {
+      let x_402 : i32 = i_1;
+      i_1 = (x_402 + 1);
+    }
+  }
+  return;
+}
+
+fn mergeSort_() {
+  var low : i32;
+  var high : i32;
+  var m : i32;
+  var i_2 : i32;
+  var from_1 : i32;
+  var mid_1 : i32;
+  var to_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  low = 0;
+  high = 9;
+  m = 1;
+  loop {
+    let x_409 : i32 = m;
+    let x_410 : i32 = high;
+    if ((x_409 <= x_410)) {
+    } else {
+      break;
+    }
+    let x_413 : i32 = low;
+    i_2 = x_413;
+    loop {
+      let x_418 : i32 = i_2;
+      let x_419 : i32 = high;
+      if ((x_418 < x_419)) {
+      } else {
+        break;
+      }
+      let x_422 : i32 = i_2;
+      from_1 = x_422;
+      let x_423 : i32 = i_2;
+      let x_424 : i32 = m;
+      mid_1 = ((x_423 + x_424) - 1);
+      let x_427 : i32 = i_2;
+      let x_428 : i32 = m;
+      let x_432 : i32 = high;
+      to_1 = min(((x_427 + (2 * x_428)) - 1), x_432);
+      let x_434 : i32 = from_1;
+      param = x_434;
+      let x_435 : i32 = mid_1;
+      param_1 = x_435;
+      let x_436 : i32 = to_1;
+      param_2 = x_436;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2));
+
+      continuing {
+        let x_438 : i32 = m;
+        let x_440 : i32 = i_2;
+        i_2 = (x_440 + (2 * x_438));
+      }
+    }
+
+    continuing {
+      let x_442 : i32 = m;
+      m = (2 * x_442);
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_3 : i32;
+  var j_1 : i32;
+  var grey : f32;
+  let x_88 : f32 = x_28.injectionSwitch.x;
+  i_3 = i32(x_88);
+  loop {
+    let x_94 : i32 = i_3;
+    switch(x_94) {
+      case 9: {
+        let x_124 : i32 = i_3;
+        data[x_124] = -5;
+      }
+      case 8: {
+        let x_122 : i32 = i_3;
+        data[x_122] = -4;
+      }
+      case 7: {
+        let x_120 : i32 = i_3;
+        data[x_120] = -3;
+      }
+      case 6: {
+        let x_118 : i32 = i_3;
+        data[x_118] = -2;
+      }
+      case 5: {
+        let x_116 : i32 = i_3;
+        data[x_116] = -1;
+      }
+      case 4: {
+        let x_114 : i32 = i_3;
+        data[x_114] = 0;
+      }
+      case 3: {
+        let x_112 : i32 = i_3;
+        data[x_112] = 1;
+      }
+      case 2: {
+        let x_110 : i32 = i_3;
+        data[x_110] = 2;
+      }
+      case 1: {
+        let x_108 : i32 = i_3;
+        data[x_108] = 3;
+      }
+      case 0: {
+        let x_106 : i32 = i_3;
+        data[x_106] = 4;
+      }
+      default: {
+      }
+    }
+    let x_126 : i32 = i_3;
+    i_3 = (x_126 + 1);
+
+    continuing {
+      let x_128 : i32 = i_3;
+      if ((x_128 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  loop {
+    let x_134 : i32 = j_1;
+    if ((x_134 < 10)) {
+    } else {
+      break;
+    }
+    let x_137 : i32 = j_1;
+    let x_138 : i32 = j_1;
+    let x_140 : i32 = data[x_138];
+    temp[x_137] = x_140;
+
+    continuing {
+      let x_142 : i32 = j_1;
+      j_1 = (x_142 + 1);
+    }
+  }
+  mergeSort_();
+  let x_146 : f32 = gl_FragCoord.y;
+  if ((i32(x_146) < 30)) {
+    let x_153 : i32 = data[0];
+    grey = (0.5 + (f32(x_153) / 10.0));
+  } else {
+    let x_158 : f32 = gl_FragCoord.y;
+    if ((i32(x_158) < 60)) {
+      let x_165 : i32 = data[1];
+      grey = (0.5 + (f32(x_165) / 10.0));
+    } else {
+      let x_170 : f32 = gl_FragCoord.y;
+      if ((i32(x_170) < 90)) {
+        let x_177 : i32 = data[2];
+        grey = (0.5 + (f32(x_177) / 10.0));
+      } else {
+        let x_182 : f32 = gl_FragCoord.y;
+        if ((i32(x_182) < 120)) {
+          let x_189 : i32 = data[3];
+          grey = (0.5 + (f32(x_189) / 10.0));
+        } else {
+          let x_194 : f32 = gl_FragCoord.y;
+          if ((i32(x_194) < 150)) {
+            discard;
+          } else {
+            let x_201 : f32 = gl_FragCoord.y;
+            if ((i32(x_201) < 180)) {
+              let x_208 : i32 = data[5];
+              grey = (0.5 + (f32(x_208) / 10.0));
+            } else {
+              let x_213 : f32 = gl_FragCoord.y;
+              if ((i32(x_213) < 210)) {
+                let x_220 : i32 = data[6];
+                grey = (0.5 + (f32(x_220) / 10.0));
+              } else {
+                let x_225 : f32 = gl_FragCoord.y;
+                if ((i32(x_225) < 240)) {
+                  let x_232 : i32 = data[7];
+                  grey = (0.5 + (f32(x_232) / 10.0));
+                } else {
+                  let x_237 : f32 = gl_FragCoord.y;
+                  if ((i32(x_237) < 270)) {
+                    let x_244 : i32 = data[8];
+                    grey = (0.5 + (f32(x_244) / 10.0));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  let x_248 : f32 = grey;
+  let x_249 : vec3<f32> = vec3<f32>(x_248, x_248, x_248);
+  x_GLF_color = vec4<f32>(x_249.x, x_249.y, x_249.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/1.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/1.spvasm
new file mode 100644
index 0000000..f35b7eb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/1.spvasm
@@ -0,0 +1,634 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %merge_i1_i1_i1_ "merge(i1;i1;i1;"
+               OpName %from "from"
+               OpName %mid "mid"
+               OpName %to "to"
+               OpName %mergeSort_ "mergeSort("
+               OpName %k "k"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %data "data"
+               OpName %temp "temp"
+               OpName %i_0 "i"
+               OpName %low "low"
+               OpName %high "high"
+               OpName %m "m"
+               OpName %i_1 "i"
+               OpName %from_0 "from"
+               OpName %mid_0 "mid"
+               OpName %to_0 "to"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %param_1 "param"
+               OpName %i_2 "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %j_0 "j"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %grey "grey"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %32 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %35 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int %_ptr_Function_int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Private__arr_int_uint_10 = OpTypePointer Private %_arr_int_uint_10
+       %data = OpVariable %_ptr_Private__arr_int_uint_10 Private
+%_ptr_Private_int = OpTypePointer Private %int
+       %temp = OpVariable %_ptr_Private__arr_int_uint_10 Private
+     %int_10 = OpConstant %int 10
+      %int_0 = OpConstant %int 0
+      %int_9 = OpConstant %int 9
+      %int_2 = OpConstant %int 2
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_4 = OpConstant %int 4
+      %int_3 = OpConstant %int 3
+     %int_n1 = OpConstant %int -1
+     %int_n2 = OpConstant %int -2
+     %int_n3 = OpConstant %int -3
+     %int_n4 = OpConstant %int -4
+     %int_n5 = OpConstant %int -5
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+     %int_30 = OpConstant %int 30
+%_ptr_Function_float = OpTypePointer Function %float
+  %float_0_5 = OpConstant %float 0.5
+   %float_10 = OpConstant %float 10
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %v3float = OpTypeVector %float 3
+    %float_1 = OpConstant %float 1
+    %int_0_0 = OpConstant %int 0
+         %83 = OpConstantComposite %_arr_int_uint_10 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0
+       %main = OpFunction %void None %32
+         %84 = OpLabel
+         %85 = OpVariable %_ptr_Function_int Function
+         %86 = OpVariable %_ptr_Function_int Function
+         %87 = OpVariable %_ptr_Function_int Function
+         %88 = OpVariable %_ptr_Function_int Function
+         %89 = OpVariable %_ptr_Function_int Function
+         %90 = OpVariable %_ptr_Function_int Function
+         %91 = OpVariable %_ptr_Function_int Function
+         %92 = OpVariable %_ptr_Function_int Function
+         %93 = OpVariable %_ptr_Function_int Function
+         %94 = OpVariable %_ptr_Function_int Function
+        %i_2 = OpVariable %_ptr_Function_int Function
+        %j_0 = OpVariable %_ptr_Function_int Function
+       %grey = OpVariable %_ptr_Function_float Function
+         %95 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %96 = OpLoad %float %95
+         %97 = OpConvertFToS %int %96
+               OpStore %i_2 %97
+               OpBranch %98
+         %98 = OpLabel
+               OpLoopMerge %99 %100 None
+               OpBranch %101
+        %101 = OpLabel
+        %102 = OpLoad %int %i_2
+               OpSelectionMerge %103 None
+               OpSwitch %102 %103 0 %104 1 %105 2 %106 3 %107 4 %108 5 %109 6 %110 7 %111 8 %112 9 %113
+        %104 = OpLabel
+        %114 = OpLoad %int %i_2
+        %115 = OpAccessChain %_ptr_Private_int %data %114
+               OpStore %115 %int_4
+               OpBranch %103
+        %105 = OpLabel
+        %116 = OpLoad %int %i_2
+        %117 = OpAccessChain %_ptr_Private_int %data %116
+               OpStore %117 %int_3
+               OpBranch %103
+        %106 = OpLabel
+        %118 = OpLoad %int %i_2
+        %119 = OpAccessChain %_ptr_Private_int %data %118
+               OpStore %119 %int_2
+               OpBranch %103
+        %107 = OpLabel
+        %120 = OpLoad %int %i_2
+        %121 = OpAccessChain %_ptr_Private_int %data %120
+               OpStore %121 %int_1
+               OpBranch %103
+        %108 = OpLabel
+        %122 = OpLoad %int %i_2
+        %123 = OpAccessChain %_ptr_Private_int %data %122
+               OpStore %123 %int_0
+               OpBranch %103
+        %109 = OpLabel
+        %124 = OpLoad %int %i_2
+        %125 = OpAccessChain %_ptr_Private_int %data %124
+               OpStore %125 %int_n1
+               OpBranch %103
+        %110 = OpLabel
+        %126 = OpLoad %int %i_2
+        %127 = OpAccessChain %_ptr_Private_int %data %126
+               OpStore %127 %int_n2
+               OpBranch %103
+        %111 = OpLabel
+        %128 = OpLoad %int %i_2
+        %129 = OpAccessChain %_ptr_Private_int %data %128
+               OpStore %129 %int_n3
+               OpBranch %103
+        %112 = OpLabel
+        %130 = OpLoad %int %i_2
+        %131 = OpAccessChain %_ptr_Private_int %data %130
+               OpStore %131 %int_n4
+               OpBranch %103
+        %113 = OpLabel
+        %132 = OpLoad %int %i_2
+        %133 = OpAccessChain %_ptr_Private_int %data %132
+               OpStore %133 %int_n5
+               OpBranch %103
+        %103 = OpLabel
+        %134 = OpLoad %int %i_2
+        %135 = OpIAdd %int %134 %int_1
+               OpStore %i_2 %135
+               OpBranch %100
+        %100 = OpLabel
+        %136 = OpLoad %int %i_2
+        %137 = OpSLessThan %bool %136 %int_10
+               OpBranchConditional %137 %98 %99
+         %99 = OpLabel
+               OpStore %j_0 %int_0
+               OpBranch %138
+        %138 = OpLabel
+               OpLoopMerge %139 %140 None
+               OpBranch %141
+        %141 = OpLabel
+        %142 = OpLoad %int %j_0
+        %143 = OpSLessThan %bool %142 %int_10
+               OpBranchConditional %143 %144 %139
+        %144 = OpLabel
+        %145 = OpLoad %int %j_0
+        %146 = OpLoad %int %j_0
+        %147 = OpAccessChain %_ptr_Private_int %data %146
+        %148 = OpLoad %int %147
+        %149 = OpAccessChain %_ptr_Private_int %temp %145
+               OpStore %149 %148
+               OpBranch %140
+        %140 = OpLabel
+        %150 = OpLoad %int %j_0
+        %151 = OpIAdd %int %150 %int_1
+               OpStore %j_0 %151
+               OpBranch %138
+        %139 = OpLabel
+               OpStore %94 %int_0
+               OpStore %93 %int_9
+               OpStore %92 %int_1
+               OpBranch %152
+        %152 = OpLabel
+               OpLoopMerge %153 %154 None
+               OpBranch %155
+        %155 = OpLabel
+        %156 = OpLoad %int %92
+        %157 = OpLoad %int %93
+        %158 = OpSLessThanEqual %bool %156 %157
+               OpBranchConditional %158 %159 %153
+        %159 = OpLabel
+        %160 = OpLoad %int %94
+               OpStore %91 %160
+               OpBranch %161
+        %161 = OpLabel
+               OpLoopMerge %162 %163 None
+               OpBranch %164
+        %164 = OpLabel
+        %165 = OpLoad %int %91
+        %166 = OpLoad %int %93
+        %167 = OpSLessThan %bool %165 %166
+               OpBranchConditional %167 %168 %162
+        %168 = OpLabel
+        %169 = OpLoad %int %91
+               OpStore %90 %169
+        %170 = OpLoad %int %91
+        %171 = OpLoad %int %92
+        %172 = OpIAdd %int %170 %171
+        %173 = OpLoad %_arr_int_uint_10 %data
+               OpStore %data %83
+               OpStore %data %173
+        %174 = OpISub %int %172 %int_1
+               OpStore %89 %174
+        %175 = OpLoad %int %91
+        %176 = OpLoad %int %92
+        %177 = OpIMul %int %int_2 %176
+        %178 = OpIAdd %int %175 %177
+        %179 = OpISub %int %178 %int_1
+        %180 = OpLoad %int %93
+        %181 = OpExtInst %int %1 SMin %179 %180
+               OpStore %88 %181
+        %182 = OpLoad %int %90
+               OpStore %87 %182
+        %183 = OpLoad %int %89
+               OpStore %86 %183
+        %184 = OpLoad %int %88
+               OpStore %85 %184
+        %185 = OpFunctionCall %void %merge_i1_i1_i1_ %87 %86 %85
+               OpBranch %163
+        %163 = OpLabel
+        %186 = OpLoad %int %92
+        %187 = OpIMul %int %int_2 %186
+        %188 = OpLoad %int %91
+        %189 = OpIAdd %int %188 %187
+               OpStore %91 %189
+               OpBranch %161
+        %162 = OpLabel
+               OpBranch %154
+        %154 = OpLabel
+        %190 = OpLoad %int %92
+        %191 = OpIMul %int %int_2 %190
+               OpStore %92 %191
+               OpBranch %152
+        %153 = OpLabel
+               OpBranch %192
+        %192 = OpLabel
+        %193 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %194 = OpLoad %float %193
+        %195 = OpConvertFToS %int %194
+        %196 = OpSLessThan %bool %195 %int_30
+               OpSelectionMerge %197 None
+               OpBranchConditional %196 %198 %199
+        %198 = OpLabel
+        %200 = OpAccessChain %_ptr_Private_int %data %int_0
+        %201 = OpLoad %int %200
+        %202 = OpConvertSToF %float %201
+        %203 = OpFDiv %float %202 %float_10
+        %204 = OpFAdd %float %float_0_5 %203
+               OpStore %grey %204
+               OpBranch %197
+        %199 = OpLabel
+        %205 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %206 = OpLoad %float %205
+        %207 = OpConvertFToS %int %206
+        %208 = OpSLessThan %bool %207 %int_60
+               OpSelectionMerge %209 None
+               OpBranchConditional %208 %210 %211
+        %210 = OpLabel
+        %212 = OpAccessChain %_ptr_Private_int %data %int_1
+        %213 = OpLoad %int %212
+        %214 = OpConvertSToF %float %213
+        %215 = OpFDiv %float %214 %float_10
+        %216 = OpFAdd %float %float_0_5 %215
+               OpStore %grey %216
+               OpBranch %209
+        %211 = OpLabel
+        %217 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %218 = OpLoad %float %217
+        %219 = OpConvertFToS %int %218
+        %220 = OpSLessThan %bool %219 %int_90
+               OpSelectionMerge %221 None
+               OpBranchConditional %220 %222 %223
+        %222 = OpLabel
+        %224 = OpAccessChain %_ptr_Private_int %data %int_2
+        %225 = OpLoad %int %224
+        %226 = OpConvertSToF %float %225
+        %227 = OpFDiv %float %226 %float_10
+        %228 = OpFAdd %float %float_0_5 %227
+               OpStore %grey %228
+               OpBranch %221
+        %223 = OpLabel
+        %229 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %230 = OpLoad %float %229
+        %231 = OpConvertFToS %int %230
+        %232 = OpSLessThan %bool %231 %int_120
+               OpSelectionMerge %233 None
+               OpBranchConditional %232 %234 %235
+        %234 = OpLabel
+        %236 = OpAccessChain %_ptr_Private_int %data %int_3
+        %237 = OpLoad %int %236
+        %238 = OpConvertSToF %float %237
+        %239 = OpFDiv %float %238 %float_10
+        %240 = OpFAdd %float %float_0_5 %239
+               OpStore %grey %240
+               OpBranch %233
+        %235 = OpLabel
+        %241 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %242 = OpLoad %float %241
+        %243 = OpConvertFToS %int %242
+        %244 = OpSLessThan %bool %243 %int_150
+               OpSelectionMerge %245 None
+               OpBranchConditional %244 %246 %247
+        %246 = OpLabel
+               OpKill
+        %247 = OpLabel
+        %248 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %249 = OpLoad %float %248
+        %250 = OpConvertFToS %int %249
+        %251 = OpSLessThan %bool %250 %int_180
+               OpSelectionMerge %252 None
+               OpBranchConditional %251 %253 %254
+        %253 = OpLabel
+        %255 = OpAccessChain %_ptr_Private_int %data %int_5
+        %256 = OpLoad %int %255
+        %257 = OpConvertSToF %float %256
+        %258 = OpFDiv %float %257 %float_10
+        %259 = OpFAdd %float %float_0_5 %258
+               OpStore %grey %259
+               OpBranch %252
+        %254 = OpLabel
+        %260 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %261 = OpLoad %float %260
+        %262 = OpConvertFToS %int %261
+        %263 = OpSLessThan %bool %262 %int_210
+               OpSelectionMerge %264 None
+               OpBranchConditional %263 %265 %266
+        %265 = OpLabel
+        %267 = OpAccessChain %_ptr_Private_int %data %int_6
+        %268 = OpLoad %int %267
+        %269 = OpConvertSToF %float %268
+        %270 = OpFDiv %float %269 %float_10
+        %271 = OpFAdd %float %float_0_5 %270
+               OpStore %grey %271
+               OpBranch %264
+        %266 = OpLabel
+        %272 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %273 = OpLoad %float %272
+        %274 = OpConvertFToS %int %273
+        %275 = OpSLessThan %bool %274 %int_240
+               OpSelectionMerge %276 None
+               OpBranchConditional %275 %277 %278
+        %277 = OpLabel
+        %279 = OpAccessChain %_ptr_Private_int %data %int_7
+        %280 = OpLoad %int %279
+        %281 = OpConvertSToF %float %280
+        %282 = OpFDiv %float %281 %float_10
+        %283 = OpFAdd %float %float_0_5 %282
+               OpStore %grey %283
+               OpBranch %276
+        %278 = OpLabel
+        %284 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %285 = OpLoad %float %284
+        %286 = OpConvertFToS %int %285
+        %287 = OpSLessThan %bool %286 %int_270
+               OpSelectionMerge %288 None
+               OpBranchConditional %287 %289 %290
+        %289 = OpLabel
+        %291 = OpAccessChain %_ptr_Private_int %data %int_8
+        %292 = OpLoad %int %291
+        %293 = OpConvertSToF %float %292
+        %294 = OpFDiv %float %293 %float_10
+        %295 = OpFAdd %float %float_0_5 %294
+               OpStore %grey %295
+               OpBranch %288
+        %290 = OpLabel
+               OpKill
+        %288 = OpLabel
+               OpBranch %276
+        %276 = OpLabel
+               OpBranch %264
+        %264 = OpLabel
+               OpBranch %252
+        %252 = OpLabel
+               OpBranch %245
+        %245 = OpLabel
+               OpBranch %233
+        %233 = OpLabel
+               OpBranch %221
+        %221 = OpLabel
+               OpBranch %209
+        %209 = OpLabel
+               OpBranch %197
+        %197 = OpLabel
+        %296 = OpLoad %float %grey
+        %297 = OpCompositeConstruct %v3float %296 %296 %296
+        %298 = OpCompositeExtract %float %297 0
+        %299 = OpCompositeExtract %float %297 1
+        %300 = OpCompositeExtract %float %297 2
+        %301 = OpCompositeConstruct %v4float %298 %299 %300 %float_1
+               OpStore %_GLF_color %301
+               OpReturn
+               OpFunctionEnd
+%merge_i1_i1_i1_ = OpFunction %void None %35
+       %from = OpFunctionParameter %_ptr_Function_int
+        %mid = OpFunctionParameter %_ptr_Function_int
+         %to = OpFunctionParameter %_ptr_Function_int
+        %302 = OpLabel
+          %k = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+          %j = OpVariable %_ptr_Function_int Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+        %303 = OpLoad %int %from
+               OpStore %k %303
+        %304 = OpLoad %int %from
+               OpStore %i %304
+        %305 = OpLoad %int %mid
+        %306 = OpIAdd %int %305 %int_1
+               OpStore %j %306
+               OpBranch %307
+        %307 = OpLabel
+               OpLoopMerge %308 %309 None
+               OpBranch %310
+        %310 = OpLabel
+        %311 = OpLoad %int %i
+        %312 = OpLoad %int %mid
+        %313 = OpSLessThanEqual %bool %311 %312
+        %314 = OpLoad %int %j
+        %315 = OpLoad %int %to
+        %316 = OpSLessThanEqual %bool %314 %315
+        %317 = OpLogicalAnd %bool %313 %316
+               OpBranchConditional %317 %318 %308
+        %318 = OpLabel
+        %319 = OpLoad %int %i
+        %320 = OpAccessChain %_ptr_Private_int %data %319
+        %321 = OpLoad %int %320
+        %322 = OpLoad %int %j
+        %323 = OpAccessChain %_ptr_Private_int %data %322
+        %324 = OpLoad %int %323
+        %325 = OpSLessThan %bool %321 %324
+               OpSelectionMerge %326 None
+               OpBranchConditional %325 %327 %328
+        %327 = OpLabel
+        %329 = OpLoad %int %k
+        %330 = OpIAdd %int %329 %int_1
+               OpStore %k %330
+        %331 = OpLoad %int %i
+        %332 = OpIAdd %int %331 %int_1
+               OpStore %i %332
+        %333 = OpAccessChain %_ptr_Private_int %data %331
+        %334 = OpLoad %int %333
+        %335 = OpAccessChain %_ptr_Private_int %temp %329
+               OpStore %335 %334
+               OpBranch %326
+        %328 = OpLabel
+        %336 = OpLoad %int %k
+        %337 = OpIAdd %int %336 %int_1
+               OpStore %k %337
+        %338 = OpLoad %int %j
+        %339 = OpIAdd %int %338 %int_1
+               OpStore %j %339
+        %340 = OpAccessChain %_ptr_Private_int %data %338
+        %341 = OpLoad %int %340
+        %342 = OpAccessChain %_ptr_Private_int %temp %336
+               OpStore %342 %341
+               OpBranch %326
+        %326 = OpLabel
+               OpBranch %309
+        %309 = OpLabel
+               OpBranch %307
+        %308 = OpLabel
+               OpBranch %343
+        %343 = OpLabel
+               OpLoopMerge %344 %345 None
+               OpBranch %346
+        %346 = OpLabel
+        %347 = OpLoad %int %i
+        %348 = OpSLessThan %bool %347 %int_10
+        %349 = OpLoad %int %i
+        %350 = OpLoad %int %mid
+        %351 = OpSLessThanEqual %bool %349 %350
+        %352 = OpLogicalAnd %bool %348 %351
+               OpBranchConditional %352 %353 %344
+        %353 = OpLabel
+        %354 = OpLoad %int %k
+        %355 = OpIAdd %int %354 %int_1
+               OpStore %k %355
+        %356 = OpLoad %int %i
+        %357 = OpIAdd %int %356 %int_1
+               OpStore %i %357
+        %358 = OpAccessChain %_ptr_Private_int %data %356
+        %359 = OpLoad %int %358
+        %360 = OpAccessChain %_ptr_Private_int %temp %354
+               OpStore %360 %359
+               OpBranch %345
+        %345 = OpLabel
+               OpBranch %343
+        %344 = OpLabel
+        %361 = OpLoad %int %from
+               OpStore %i_0 %361
+               OpBranch %362
+        %362 = OpLabel
+               OpLoopMerge %363 %364 None
+               OpBranch %365
+        %365 = OpLabel
+        %366 = OpLoad %int %i_0
+        %367 = OpLoad %int %to
+        %368 = OpSLessThanEqual %bool %366 %367
+               OpBranchConditional %368 %369 %363
+        %369 = OpLabel
+        %370 = OpLoad %int %i_0
+        %371 = OpLoad %int %i_0
+        %372 = OpAccessChain %_ptr_Private_int %temp %371
+        %373 = OpLoad %int %372
+        %374 = OpAccessChain %_ptr_Private_int %data %370
+               OpStore %374 %373
+               OpBranch %364
+        %364 = OpLabel
+        %375 = OpLoad %int %i_0
+        %376 = OpIAdd %int %375 %int_1
+               OpStore %i_0 %376
+               OpBranch %362
+        %363 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %mergeSort_ = OpFunction %void None %32
+        %377 = OpLabel
+        %low = OpVariable %_ptr_Function_int Function
+       %high = OpVariable %_ptr_Function_int Function
+          %m = OpVariable %_ptr_Function_int Function
+        %i_1 = OpVariable %_ptr_Function_int Function
+     %from_0 = OpVariable %_ptr_Function_int Function
+      %mid_0 = OpVariable %_ptr_Function_int Function
+       %to_0 = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_int Function
+    %param_0 = OpVariable %_ptr_Function_int Function
+    %param_1 = OpVariable %_ptr_Function_int Function
+               OpStore %low %int_0
+               OpStore %high %int_9
+               OpStore %m %int_1
+               OpBranch %378
+        %378 = OpLabel
+               OpLoopMerge %379 %380 None
+               OpBranch %381
+        %381 = OpLabel
+        %382 = OpLoad %int %m
+        %383 = OpLoad %int %high
+        %384 = OpSLessThanEqual %bool %382 %383
+               OpBranchConditional %384 %385 %379
+        %385 = OpLabel
+        %386 = OpLoad %int %low
+               OpStore %i_1 %386
+               OpBranch %387
+        %387 = OpLabel
+               OpLoopMerge %388 %389 None
+               OpBranch %390
+        %390 = OpLabel
+        %391 = OpLoad %int %i_1
+        %392 = OpLoad %int %high
+        %393 = OpSLessThan %bool %391 %392
+               OpBranchConditional %393 %394 %388
+        %394 = OpLabel
+        %395 = OpLoad %int %i_1
+               OpStore %from_0 %395
+        %396 = OpLoad %int %i_1
+        %397 = OpLoad %int %m
+        %398 = OpIAdd %int %396 %397
+        %399 = OpISub %int %398 %int_1
+               OpStore %mid_0 %399
+        %400 = OpLoad %int %i_1
+        %401 = OpLoad %int %m
+        %402 = OpIMul %int %int_2 %401
+        %403 = OpIAdd %int %400 %402
+        %404 = OpISub %int %403 %int_1
+        %405 = OpLoad %int %high
+        %406 = OpExtInst %int %1 SMin %404 %405
+               OpStore %to_0 %406
+        %407 = OpLoad %int %from_0
+               OpStore %param %407
+        %408 = OpLoad %int %mid_0
+               OpStore %param_0 %408
+        %409 = OpLoad %int %to_0
+               OpStore %param_1 %409
+        %410 = OpFunctionCall %void %merge_i1_i1_i1_ %param %param_0 %param_1
+               OpBranch %389
+        %389 = OpLabel
+        %411 = OpLoad %int %m
+        %412 = OpIMul %int %int_2 %411
+        %413 = OpLoad %int %i_1
+        %414 = OpIAdd %int %413 %412
+               OpStore %i_1 %414
+               OpBranch %387
+        %388 = OpLabel
+               OpBranch %380
+        %380 = OpLabel
+        %415 = OpLoad %int %m
+        %416 = OpIMul %int %int_2 %415
+               OpStore %m %416
+               OpBranch %378
+        %379 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..03b86e8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/1.spvasm.expected.hlsl
@@ -0,0 +1,302 @@
+static int data[10] = (int[10])0;
+static int temp[10] = (int[10])0;
+cbuffer cbuffer_x_28 : register(b0, space0) {
+  uint4 x_28[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void merge_i1_i1_i1_(inout int from, inout int mid, inout int to) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  const int x_303 = from;
+  k = x_303;
+  const int x_304 = from;
+  i = x_304;
+  const int x_305 = mid;
+  j = (x_305 + 1);
+  while (true) {
+    const int x_311 = i;
+    const int x_312 = mid;
+    const int x_314 = j;
+    const int x_315 = to;
+    bool tint_tmp = (x_311 <= x_312);
+    if (tint_tmp) {
+      tint_tmp = (x_314 <= x_315);
+    }
+    if ((tint_tmp)) {
+    } else {
+      break;
+    }
+    const int x_321 = data[i];
+    const int x_324 = data[j];
+    if ((x_321 < x_324)) {
+      const int x_329 = k;
+      k = (x_329 + 1);
+      const int x_331 = i;
+      i = (x_331 + 1);
+      const int x_334 = data[x_331];
+      temp[x_329] = x_334;
+    } else {
+      const int x_336 = k;
+      k = (x_336 + 1);
+      const int x_338 = j;
+      j = (x_338 + 1);
+      const int x_341 = data[x_338];
+      temp[x_336] = x_341;
+    }
+  }
+  while (true) {
+    const int x_347 = i;
+    const int x_349 = i;
+    const int x_350 = mid;
+    bool tint_tmp_1 = (x_347 < 10);
+    if (tint_tmp_1) {
+      tint_tmp_1 = (x_349 <= x_350);
+    }
+    if ((tint_tmp_1)) {
+    } else {
+      break;
+    }
+    const int x_354 = k;
+    k = (x_354 + 1);
+    const int x_356 = i;
+    i = (x_356 + 1);
+    const int x_359 = data[x_356];
+    temp[x_354] = x_359;
+  }
+  const int x_361 = from;
+  i_1 = x_361;
+  while (true) {
+    const int x_366 = i_1;
+    const int x_367 = to;
+    if ((x_366 <= x_367)) {
+    } else {
+      break;
+    }
+    const int x_370 = i_1;
+    const int x_373 = temp[i_1];
+    data[x_370] = x_373;
+    {
+      i_1 = (i_1 + 1);
+    }
+  }
+  return;
+}
+
+void main_1() {
+  int x_85 = 0;
+  int x_86 = 0;
+  int x_87 = 0;
+  int x_88 = 0;
+  int x_89 = 0;
+  int x_90 = 0;
+  int x_91 = 0;
+  int x_92 = 0;
+  int x_93 = 0;
+  int x_94 = 0;
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  const float x_96 = asfloat(x_28[0].x);
+  i_3 = int(x_96);
+  while (true) {
+    switch(i_3) {
+      case 9: {
+        data[i_3] = -5;
+        break;
+      }
+      case 8: {
+        data[i_3] = -4;
+        break;
+      }
+      case 7: {
+        data[i_3] = -3;
+        break;
+      }
+      case 6: {
+        data[i_3] = -2;
+        break;
+      }
+      case 5: {
+        data[i_3] = -1;
+        break;
+      }
+      case 4: {
+        data[i_3] = 0;
+        break;
+      }
+      case 3: {
+        data[i_3] = 1;
+        break;
+      }
+      case 2: {
+        data[i_3] = 2;
+        break;
+      }
+      case 1: {
+        data[i_3] = 3;
+        break;
+      }
+      case 0: {
+        data[i_3] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    i_3 = (i_3 + 1);
+    {
+      if ((i_3 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  {
+    for(; (j_1 < 10); j_1 = (j_1 + 1)) {
+      const int x_145 = j_1;
+      const int x_148 = data[j_1];
+      temp[x_145] = x_148;
+    }
+  }
+  x_94 = 0;
+  x_93 = 9;
+  x_92 = 1;
+  {
+    for(; (x_92 <= x_93); x_92 = (2 * x_92)) {
+      x_91 = x_94;
+      {
+        for(; (x_91 < x_93); x_91 = (x_91 + (2 * x_92))) {
+          x_90 = x_91;
+          const int x_170 = x_91;
+          const int x_171 = x_92;
+          const int x_173[10] = data;
+          const int tint_symbol_5[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+          data = tint_symbol_5;
+          data = x_173;
+          x_89 = ((x_170 + x_171) - 1);
+          x_88 = min(((x_91 + (2 * x_92)) - 1), x_93);
+          x_87 = x_90;
+          x_86 = x_89;
+          x_85 = x_88;
+          merge_i1_i1_i1_(x_87, x_86, x_85);
+        }
+      }
+    }
+  }
+  const float x_194 = gl_FragCoord.y;
+  if ((int(x_194) < 30)) {
+    const int x_201 = data[0];
+    grey = (0.5f + (float(x_201) / 10.0f));
+  } else {
+    const float x_206 = gl_FragCoord.y;
+    if ((int(x_206) < 60)) {
+      const int x_213 = data[1];
+      grey = (0.5f + (float(x_213) / 10.0f));
+    } else {
+      const float x_218 = gl_FragCoord.y;
+      if ((int(x_218) < 90)) {
+        const int x_225 = data[2];
+        grey = (0.5f + (float(x_225) / 10.0f));
+      } else {
+        const float x_230 = gl_FragCoord.y;
+        if ((int(x_230) < 120)) {
+          const int x_237 = data[3];
+          grey = (0.5f + (float(x_237) / 10.0f));
+        } else {
+          const float x_242 = gl_FragCoord.y;
+          if ((int(x_242) < 150)) {
+            discard;
+          } else {
+            const float x_249 = gl_FragCoord.y;
+            if ((int(x_249) < 180)) {
+              const int x_256 = data[5];
+              grey = (0.5f + (float(x_256) / 10.0f));
+            } else {
+              const float x_261 = gl_FragCoord.y;
+              if ((int(x_261) < 210)) {
+                const int x_268 = data[6];
+                grey = (0.5f + (float(x_268) / 10.0f));
+              } else {
+                const float x_273 = gl_FragCoord.y;
+                if ((int(x_273) < 240)) {
+                  const int x_280 = data[7];
+                  grey = (0.5f + (float(x_280) / 10.0f));
+                } else {
+                  const float x_285 = gl_FragCoord.y;
+                  if ((int(x_285) < 270)) {
+                    const int x_292 = data[8];
+                    grey = (0.5f + (float(x_292) / 10.0f));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  const float x_296 = grey;
+  const float3 x_297 = float3(x_296, x_296, x_296);
+  x_GLF_color = float4(x_297.x, x_297.y, x_297.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
+
+void mergeSort_() {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  {
+    for(; (m <= high); m = (2 * m)) {
+      i_2 = low;
+      {
+        for(; (i_2 < high); i_2 = (i_2 + (2 * m))) {
+          from_1 = i_2;
+          mid_1 = ((i_2 + m) - 1);
+          to_1 = min(((i_2 + (2 * m)) - 1), high);
+          param = from_1;
+          param_1 = mid_1;
+          param_2 = to_1;
+          merge_i1_i1_i1_(param, param_1, param_2);
+        }
+      }
+    }
+  }
+  return;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/1.spvasm.expected.msl
new file mode 100644
index 0000000..6506890
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/1.spvasm.expected.msl
@@ -0,0 +1,373 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void merge_i1_i1_i1_(thread int* const from, thread int* const mid, thread int* const to, thread tint_array_wrapper* const tint_symbol_6, thread tint_array_wrapper* const tint_symbol_7) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  int const x_303 = *(from);
+  k = x_303;
+  int const x_304 = *(from);
+  i = x_304;
+  int const x_305 = *(mid);
+  j = (x_305 + 1);
+  while (true) {
+    int const x_311 = i;
+    int const x_312 = *(mid);
+    int const x_314 = j;
+    int const x_315 = *(to);
+    if (((x_311 <= x_312) && (x_314 <= x_315))) {
+    } else {
+      break;
+    }
+    int const x_319 = i;
+    int const x_321 = (*(tint_symbol_6)).arr[x_319];
+    int const x_322 = j;
+    int const x_324 = (*(tint_symbol_6)).arr[x_322];
+    if ((x_321 < x_324)) {
+      int const x_329 = k;
+      k = (x_329 + 1);
+      int const x_331 = i;
+      i = (x_331 + 1);
+      int const x_334 = (*(tint_symbol_6)).arr[x_331];
+      (*(tint_symbol_7)).arr[x_329] = x_334;
+    } else {
+      int const x_336 = k;
+      k = (x_336 + 1);
+      int const x_338 = j;
+      j = (x_338 + 1);
+      int const x_341 = (*(tint_symbol_6)).arr[x_338];
+      (*(tint_symbol_7)).arr[x_336] = x_341;
+    }
+  }
+  while (true) {
+    int const x_347 = i;
+    int const x_349 = i;
+    int const x_350 = *(mid);
+    if (((x_347 < 10) && (x_349 <= x_350))) {
+    } else {
+      break;
+    }
+    int const x_354 = k;
+    k = (x_354 + 1);
+    int const x_356 = i;
+    i = (x_356 + 1);
+    int const x_359 = (*(tint_symbol_6)).arr[x_356];
+    (*(tint_symbol_7)).arr[x_354] = x_359;
+  }
+  int const x_361 = *(from);
+  i_1 = x_361;
+  while (true) {
+    int const x_366 = i_1;
+    int const x_367 = *(to);
+    if ((x_366 <= x_367)) {
+    } else {
+      break;
+    }
+    int const x_370 = i_1;
+    int const x_371 = i_1;
+    int const x_373 = (*(tint_symbol_7)).arr[x_371];
+    (*(tint_symbol_6)).arr[x_370] = x_373;
+    {
+      int const x_375 = i_1;
+      i_1 = (x_375 + 1);
+    }
+  }
+  return;
+}
+
+void main_1(constant buf0& x_28, thread tint_array_wrapper* const tint_symbol_8, thread tint_array_wrapper* const tint_symbol_9, thread float4* const tint_symbol_10, thread float4* const tint_symbol_11) {
+  int x_85 = 0;
+  int x_86 = 0;
+  int x_87 = 0;
+  int x_88 = 0;
+  int x_89 = 0;
+  int x_90 = 0;
+  int x_91 = 0;
+  int x_92 = 0;
+  int x_93 = 0;
+  int x_94 = 0;
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  float const x_96 = x_28.injectionSwitch.x;
+  i_3 = int(x_96);
+  while (true) {
+    int const x_102 = i_3;
+    switch(x_102) {
+      case 9: {
+        int const x_132 = i_3;
+        (*(tint_symbol_8)).arr[x_132] = -5;
+        break;
+      }
+      case 8: {
+        int const x_130 = i_3;
+        (*(tint_symbol_8)).arr[x_130] = -4;
+        break;
+      }
+      case 7: {
+        int const x_128 = i_3;
+        (*(tint_symbol_8)).arr[x_128] = -3;
+        break;
+      }
+      case 6: {
+        int const x_126 = i_3;
+        (*(tint_symbol_8)).arr[x_126] = -2;
+        break;
+      }
+      case 5: {
+        int const x_124 = i_3;
+        (*(tint_symbol_8)).arr[x_124] = -1;
+        break;
+      }
+      case 4: {
+        int const x_122 = i_3;
+        (*(tint_symbol_8)).arr[x_122] = 0;
+        break;
+      }
+      case 3: {
+        int const x_120 = i_3;
+        (*(tint_symbol_8)).arr[x_120] = 1;
+        break;
+      }
+      case 2: {
+        int const x_118 = i_3;
+        (*(tint_symbol_8)).arr[x_118] = 2;
+        break;
+      }
+      case 1: {
+        int const x_116 = i_3;
+        (*(tint_symbol_8)).arr[x_116] = 3;
+        break;
+      }
+      case 0: {
+        int const x_114 = i_3;
+        (*(tint_symbol_8)).arr[x_114] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    int const x_134 = i_3;
+    i_3 = (x_134 + 1);
+    {
+      int const x_136 = i_3;
+      if ((x_136 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  while (true) {
+    int const x_142 = j_1;
+    if ((x_142 < 10)) {
+    } else {
+      break;
+    }
+    int const x_145 = j_1;
+    int const x_146 = j_1;
+    int const x_148 = (*(tint_symbol_8)).arr[x_146];
+    (*(tint_symbol_9)).arr[x_145] = x_148;
+    {
+      int const x_150 = j_1;
+      j_1 = (x_150 + 1);
+    }
+  }
+  x_94 = 0;
+  x_93 = 9;
+  x_92 = 1;
+  while (true) {
+    int const x_156 = x_92;
+    int const x_157 = x_93;
+    if ((x_156 <= x_157)) {
+    } else {
+      break;
+    }
+    int const x_160 = x_94;
+    x_91 = x_160;
+    while (true) {
+      int const x_165 = x_91;
+      int const x_166 = x_93;
+      if ((x_165 < x_166)) {
+      } else {
+        break;
+      }
+      int const x_169 = x_91;
+      x_90 = x_169;
+      int const x_170 = x_91;
+      int const x_171 = x_92;
+      tint_array_wrapper const x_173 = *(tint_symbol_8);
+      tint_array_wrapper const tint_symbol_4 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+      *(tint_symbol_8) = tint_symbol_4;
+      *(tint_symbol_8) = x_173;
+      x_89 = ((x_170 + x_171) - 1);
+      int const x_175 = x_91;
+      int const x_176 = x_92;
+      int const x_180 = x_93;
+      x_88 = min(((x_175 + (2 * x_176)) - 1), x_180);
+      int const x_182 = x_90;
+      x_87 = x_182;
+      int const x_183 = x_89;
+      x_86 = x_183;
+      int const x_184 = x_88;
+      x_85 = x_184;
+      merge_i1_i1_i1_(&(x_87), &(x_86), &(x_85), tint_symbol_8, tint_symbol_9);
+      {
+        int const x_186 = x_92;
+        int const x_188 = x_91;
+        x_91 = (x_188 + (2 * x_186));
+      }
+    }
+    {
+      int const x_190 = x_92;
+      x_92 = (2 * x_190);
+    }
+  }
+  float const x_194 = (*(tint_symbol_10)).y;
+  if ((int(x_194) < 30)) {
+    int const x_201 = (*(tint_symbol_8)).arr[0];
+    grey = (0.5f + (float(x_201) / 10.0f));
+  } else {
+    float const x_206 = (*(tint_symbol_10)).y;
+    if ((int(x_206) < 60)) {
+      int const x_213 = (*(tint_symbol_8)).arr[1];
+      grey = (0.5f + (float(x_213) / 10.0f));
+    } else {
+      float const x_218 = (*(tint_symbol_10)).y;
+      if ((int(x_218) < 90)) {
+        int const x_225 = (*(tint_symbol_8)).arr[2];
+        grey = (0.5f + (float(x_225) / 10.0f));
+      } else {
+        float const x_230 = (*(tint_symbol_10)).y;
+        if ((int(x_230) < 120)) {
+          int const x_237 = (*(tint_symbol_8)).arr[3];
+          grey = (0.5f + (float(x_237) / 10.0f));
+        } else {
+          float const x_242 = (*(tint_symbol_10)).y;
+          if ((int(x_242) < 150)) {
+            discard_fragment();
+          } else {
+            float const x_249 = (*(tint_symbol_10)).y;
+            if ((int(x_249) < 180)) {
+              int const x_256 = (*(tint_symbol_8)).arr[5];
+              grey = (0.5f + (float(x_256) / 10.0f));
+            } else {
+              float const x_261 = (*(tint_symbol_10)).y;
+              if ((int(x_261) < 210)) {
+                int const x_268 = (*(tint_symbol_8)).arr[6];
+                grey = (0.5f + (float(x_268) / 10.0f));
+              } else {
+                float const x_273 = (*(tint_symbol_10)).y;
+                if ((int(x_273) < 240)) {
+                  int const x_280 = (*(tint_symbol_8)).arr[7];
+                  grey = (0.5f + (float(x_280) / 10.0f));
+                } else {
+                  float const x_285 = (*(tint_symbol_10)).y;
+                  if ((int(x_285) < 270)) {
+                    int const x_292 = (*(tint_symbol_8)).arr[8];
+                    grey = (0.5f + (float(x_292) / 10.0f));
+                  } else {
+                    discard_fragment();
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  float const x_296 = grey;
+  float3 const x_297 = float3(x_296, x_296, x_296);
+  *(tint_symbol_11) = float4(x_297.x, x_297.y, x_297.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_28 [[buffer(0)]]) {
+  thread float4 tint_symbol_12 = 0.0f;
+  thread tint_array_wrapper tint_symbol_13 = {};
+  thread tint_array_wrapper tint_symbol_14 = {};
+  thread float4 tint_symbol_15 = 0.0f;
+  tint_symbol_12 = gl_FragCoord_param;
+  main_1(x_28, &(tint_symbol_13), &(tint_symbol_14), &(tint_symbol_12), &(tint_symbol_15));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_15};
+  tint_symbol_2 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
+void mergeSort_(thread tint_array_wrapper* const tint_symbol_16, thread tint_array_wrapper* const tint_symbol_17) {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  while (true) {
+    int const x_382 = m;
+    int const x_383 = high;
+    if ((x_382 <= x_383)) {
+    } else {
+      break;
+    }
+    int const x_386 = low;
+    i_2 = x_386;
+    while (true) {
+      int const x_391 = i_2;
+      int const x_392 = high;
+      if ((x_391 < x_392)) {
+      } else {
+        break;
+      }
+      int const x_395 = i_2;
+      from_1 = x_395;
+      int const x_396 = i_2;
+      int const x_397 = m;
+      mid_1 = ((x_396 + x_397) - 1);
+      int const x_400 = i_2;
+      int const x_401 = m;
+      int const x_405 = high;
+      to_1 = min(((x_400 + (2 * x_401)) - 1), x_405);
+      int const x_407 = from_1;
+      param = x_407;
+      int const x_408 = mid_1;
+      param_1 = x_408;
+      int const x_409 = to_1;
+      param_2 = x_409;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2), tint_symbol_16, tint_symbol_17);
+      {
+        int const x_411 = m;
+        int const x_413 = i_2;
+        i_2 = (x_413 + (2 * x_411));
+      }
+    }
+    {
+      int const x_415 = m;
+      m = (2 * x_415);
+    }
+  }
+  return;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..451e627
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/1.spvasm.expected.spvasm
@@ -0,0 +1,745 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 473
+; Schema: 0
+               OpCapability Shader
+        %257 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %data "data"
+               OpName %temp "temp"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_28 "x_28"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %merge_i1_i1_i1_ "merge_i1_i1_i1_"
+               OpName %from "from"
+               OpName %mid "mid"
+               OpName %to "to"
+               OpName %k "k"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %i_1 "i_1"
+               OpName %main_1 "main_1"
+               OpName %x_85 "x_85"
+               OpName %x_86 "x_86"
+               OpName %x_87 "x_87"
+               OpName %x_88 "x_88"
+               OpName %x_89 "x_89"
+               OpName %x_90 "x_90"
+               OpName %x_91 "x_91"
+               OpName %x_92 "x_92"
+               OpName %x_93 "x_93"
+               OpName %x_94 "x_94"
+               OpName %i_3 "i_3"
+               OpName %j_1 "j_1"
+               OpName %grey "grey"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpName %mergeSort_ "mergeSort_"
+               OpName %low "low"
+               OpName %high "high"
+               OpName %m "m"
+               OpName %i_2 "i_2"
+               OpName %from_1 "from_1"
+               OpName %mid_1 "mid_1"
+               OpName %to_1 "to_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_28 NonWritable
+               OpDecorate %x_28 DescriptorSet 0
+               OpDecorate %x_28 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Private__arr_int_uint_10 = OpTypePointer Private %_arr_int_uint_10
+          %7 = OpConstantNull %_arr_int_uint_10
+       %data = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+       %temp = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_28 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %17
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int %_ptr_Function_int
+         %32 = OpConstantNull %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+%_ptr_Private_int = OpTypePointer Private %int
+     %int_10 = OpConstant %int 10
+        %132 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+        %149 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %int_n5 = OpConstant %int -5
+     %int_n4 = OpConstant %int -4
+     %int_n3 = OpConstant %int -3
+     %int_n2 = OpConstant %int -2
+     %int_n1 = OpConstant %int -1
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+      %int_9 = OpConstant %int 9
+        %250 = OpConstantComposite %_arr_int_uint_10 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %int_30 = OpConstant %int 30
+  %float_0_5 = OpConstant %float 0.5
+   %float_10 = OpConstant %float 10
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+    %v3float = OpTypeVector %float 3
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %402 = OpTypeFunction %void %main_out
+%merge_i1_i1_i1_ = OpFunction %void None %23
+       %from = OpFunctionParameter %_ptr_Function_int
+        %mid = OpFunctionParameter %_ptr_Function_int
+         %to = OpFunctionParameter %_ptr_Function_int
+         %30 = OpLabel
+          %k = OpVariable %_ptr_Function_int Function %32
+          %i = OpVariable %_ptr_Function_int Function %32
+          %j = OpVariable %_ptr_Function_int Function %32
+        %i_1 = OpVariable %_ptr_Function_int Function %32
+         %37 = OpLoad %int %from
+               OpStore %k %37
+         %39 = OpLoad %int %from
+               OpStore %i %39
+         %41 = OpLoad %int %mid
+         %43 = OpIAdd %int %41 %int_1
+               OpStore %j %43
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %48 = OpLoad %int %i
+         %50 = OpLoad %int %mid
+         %51 = OpLoad %int %j
+         %53 = OpLoad %int %to
+         %54 = OpSLessThanEqual %bool %48 %50
+               OpSelectionMerge %56 None
+               OpBranchConditional %54 %57 %56
+         %57 = OpLabel
+         %58 = OpSLessThanEqual %bool %51 %53
+               OpBranch %56
+         %56 = OpLabel
+         %59 = OpPhi %bool %54 %47 %58 %57
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %62
+         %61 = OpLabel
+               OpBranch %60
+         %62 = OpLabel
+               OpBranch %45
+         %60 = OpLabel
+         %63 = OpLoad %int %i
+         %65 = OpAccessChain %_ptr_Private_int %data %63
+         %66 = OpLoad %int %65
+         %67 = OpLoad %int %j
+         %68 = OpAccessChain %_ptr_Private_int %data %67
+         %69 = OpLoad %int %68
+         %70 = OpSLessThan %bool %66 %69
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %73
+         %72 = OpLabel
+         %74 = OpLoad %int %k
+         %75 = OpIAdd %int %74 %int_1
+               OpStore %k %75
+         %76 = OpLoad %int %i
+         %77 = OpIAdd %int %76 %int_1
+               OpStore %i %77
+         %78 = OpAccessChain %_ptr_Private_int %data %76
+         %79 = OpLoad %int %78
+         %80 = OpAccessChain %_ptr_Private_int %temp %74
+               OpStore %80 %79
+               OpBranch %71
+         %73 = OpLabel
+         %81 = OpLoad %int %k
+         %82 = OpIAdd %int %81 %int_1
+               OpStore %k %82
+         %83 = OpLoad %int %j
+         %84 = OpIAdd %int %83 %int_1
+               OpStore %j %84
+         %85 = OpAccessChain %_ptr_Private_int %data %83
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_Private_int %temp %81
+               OpStore %87 %86
+               OpBranch %71
+         %71 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+               OpBranch %44
+         %45 = OpLabel
+               OpBranch %88
+         %88 = OpLabel
+               OpLoopMerge %89 %90 None
+               OpBranch %91
+         %91 = OpLabel
+         %92 = OpLoad %int %i
+         %93 = OpLoad %int %i
+         %95 = OpLoad %int %mid
+         %97 = OpSLessThan %bool %92 %int_10
+               OpSelectionMerge %98 None
+               OpBranchConditional %97 %99 %98
+         %99 = OpLabel
+        %100 = OpSLessThanEqual %bool %93 %95
+               OpBranch %98
+         %98 = OpLabel
+        %101 = OpPhi %bool %97 %91 %100 %99
+               OpSelectionMerge %102 None
+               OpBranchConditional %101 %103 %104
+        %103 = OpLabel
+               OpBranch %102
+        %104 = OpLabel
+               OpBranch %89
+        %102 = OpLabel
+        %105 = OpLoad %int %k
+        %106 = OpIAdd %int %105 %int_1
+               OpStore %k %106
+        %107 = OpLoad %int %i
+        %108 = OpIAdd %int %107 %int_1
+               OpStore %i %108
+        %109 = OpAccessChain %_ptr_Private_int %data %107
+        %110 = OpLoad %int %109
+        %111 = OpAccessChain %_ptr_Private_int %temp %105
+               OpStore %111 %110
+               OpBranch %90
+         %90 = OpLabel
+               OpBranch %88
+         %89 = OpLabel
+        %113 = OpLoad %int %from
+               OpStore %i_1 %113
+               OpBranch %114
+        %114 = OpLabel
+               OpLoopMerge %115 %116 None
+               OpBranch %117
+        %117 = OpLabel
+        %118 = OpLoad %int %i_1
+        %120 = OpLoad %int %to
+        %121 = OpSLessThanEqual %bool %118 %120
+               OpSelectionMerge %122 None
+               OpBranchConditional %121 %123 %124
+        %123 = OpLabel
+               OpBranch %122
+        %124 = OpLabel
+               OpBranch %115
+        %122 = OpLabel
+        %125 = OpLoad %int %i_1
+        %126 = OpLoad %int %i_1
+        %127 = OpAccessChain %_ptr_Private_int %temp %126
+        %128 = OpLoad %int %127
+        %129 = OpAccessChain %_ptr_Private_int %data %125
+               OpStore %129 %128
+               OpBranch %116
+        %116 = OpLabel
+        %130 = OpLoad %int %i_1
+        %131 = OpIAdd %int %130 %int_1
+               OpStore %i_1 %131
+               OpBranch %114
+        %115 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %132
+        %134 = OpLabel
+       %x_85 = OpVariable %_ptr_Function_int Function %32
+       %x_86 = OpVariable %_ptr_Function_int Function %32
+       %x_87 = OpVariable %_ptr_Function_int Function %32
+       %x_88 = OpVariable %_ptr_Function_int Function %32
+       %x_89 = OpVariable %_ptr_Function_int Function %32
+       %x_90 = OpVariable %_ptr_Function_int Function %32
+       %x_91 = OpVariable %_ptr_Function_int Function %32
+       %x_92 = OpVariable %_ptr_Function_int Function %32
+       %x_93 = OpVariable %_ptr_Function_int Function %32
+       %x_94 = OpVariable %_ptr_Function_int Function %32
+        %i_3 = OpVariable %_ptr_Function_int Function %32
+        %j_1 = OpVariable %_ptr_Function_int Function %32
+       %grey = OpVariable %_ptr_Function_float Function %149
+        %152 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_0
+        %153 = OpLoad %float %152
+        %154 = OpConvertFToS %int %153
+               OpStore %i_3 %154
+               OpBranch %155
+        %155 = OpLabel
+               OpLoopMerge %156 %157 None
+               OpBranch %158
+        %158 = OpLabel
+        %159 = OpLoad %int %i_3
+               OpSelectionMerge %160 None
+               OpSwitch %159 %161 9 %162 8 %163 7 %164 6 %165 5 %166 4 %167 3 %168 2 %169 1 %170 0 %171
+        %162 = OpLabel
+        %172 = OpLoad %int %i_3
+        %173 = OpAccessChain %_ptr_Private_int %data %172
+               OpStore %173 %int_n5
+               OpBranch %160
+        %163 = OpLabel
+        %175 = OpLoad %int %i_3
+        %176 = OpAccessChain %_ptr_Private_int %data %175
+               OpStore %176 %int_n4
+               OpBranch %160
+        %164 = OpLabel
+        %178 = OpLoad %int %i_3
+        %179 = OpAccessChain %_ptr_Private_int %data %178
+               OpStore %179 %int_n3
+               OpBranch %160
+        %165 = OpLabel
+        %181 = OpLoad %int %i_3
+        %182 = OpAccessChain %_ptr_Private_int %data %181
+               OpStore %182 %int_n2
+               OpBranch %160
+        %166 = OpLabel
+        %184 = OpLoad %int %i_3
+        %185 = OpAccessChain %_ptr_Private_int %data %184
+               OpStore %185 %int_n1
+               OpBranch %160
+        %167 = OpLabel
+        %187 = OpLoad %int %i_3
+        %188 = OpAccessChain %_ptr_Private_int %data %187
+               OpStore %188 %int_0
+               OpBranch %160
+        %168 = OpLabel
+        %190 = OpLoad %int %i_3
+        %191 = OpAccessChain %_ptr_Private_int %data %190
+               OpStore %191 %int_1
+               OpBranch %160
+        %169 = OpLabel
+        %192 = OpLoad %int %i_3
+        %193 = OpAccessChain %_ptr_Private_int %data %192
+               OpStore %193 %int_2
+               OpBranch %160
+        %170 = OpLabel
+        %195 = OpLoad %int %i_3
+        %196 = OpAccessChain %_ptr_Private_int %data %195
+               OpStore %196 %int_3
+               OpBranch %160
+        %171 = OpLabel
+        %198 = OpLoad %int %i_3
+        %199 = OpAccessChain %_ptr_Private_int %data %198
+               OpStore %199 %int_4
+               OpBranch %160
+        %161 = OpLabel
+               OpBranch %160
+        %160 = OpLabel
+        %201 = OpLoad %int %i_3
+        %202 = OpIAdd %int %201 %int_1
+               OpStore %i_3 %202
+               OpBranch %157
+        %157 = OpLabel
+        %203 = OpLoad %int %i_3
+        %204 = OpSLessThan %bool %203 %int_10
+               OpSelectionMerge %205 None
+               OpBranchConditional %204 %206 %207
+        %206 = OpLabel
+               OpBranch %205
+        %207 = OpLabel
+               OpBranch %156
+        %205 = OpLabel
+               OpBranch %155
+        %156 = OpLabel
+               OpStore %j_1 %int_0
+               OpBranch %208
+        %208 = OpLabel
+               OpLoopMerge %209 %210 None
+               OpBranch %211
+        %211 = OpLabel
+        %212 = OpLoad %int %j_1
+        %213 = OpSLessThan %bool %212 %int_10
+               OpSelectionMerge %214 None
+               OpBranchConditional %213 %215 %216
+        %215 = OpLabel
+               OpBranch %214
+        %216 = OpLabel
+               OpBranch %209
+        %214 = OpLabel
+        %217 = OpLoad %int %j_1
+        %218 = OpLoad %int %j_1
+        %219 = OpAccessChain %_ptr_Private_int %data %218
+        %220 = OpLoad %int %219
+        %221 = OpAccessChain %_ptr_Private_int %temp %217
+               OpStore %221 %220
+               OpBranch %210
+        %210 = OpLabel
+        %222 = OpLoad %int %j_1
+        %223 = OpIAdd %int %222 %int_1
+               OpStore %j_1 %223
+               OpBranch %208
+        %209 = OpLabel
+               OpStore %x_94 %int_0
+               OpStore %x_93 %int_9
+               OpStore %x_92 %int_1
+               OpBranch %225
+        %225 = OpLabel
+               OpLoopMerge %226 %227 None
+               OpBranch %228
+        %228 = OpLabel
+        %229 = OpLoad %int %x_92
+        %230 = OpLoad %int %x_93
+        %231 = OpSLessThanEqual %bool %229 %230
+               OpSelectionMerge %232 None
+               OpBranchConditional %231 %233 %234
+        %233 = OpLabel
+               OpBranch %232
+        %234 = OpLabel
+               OpBranch %226
+        %232 = OpLabel
+        %235 = OpLoad %int %x_94
+               OpStore %x_91 %235
+               OpBranch %236
+        %236 = OpLabel
+               OpLoopMerge %237 %238 None
+               OpBranch %239
+        %239 = OpLabel
+        %240 = OpLoad %int %x_91
+        %241 = OpLoad %int %x_93
+        %242 = OpSLessThan %bool %240 %241
+               OpSelectionMerge %243 None
+               OpBranchConditional %242 %244 %245
+        %244 = OpLabel
+               OpBranch %243
+        %245 = OpLabel
+               OpBranch %237
+        %243 = OpLabel
+        %246 = OpLoad %int %x_91
+               OpStore %x_90 %246
+        %247 = OpLoad %int %x_91
+        %248 = OpLoad %int %x_92
+        %249 = OpLoad %_arr_int_uint_10 %data
+               OpStore %data %250
+               OpStore %data %249
+        %251 = OpIAdd %int %247 %248
+        %252 = OpISub %int %251 %int_1
+               OpStore %x_89 %252
+        %253 = OpLoad %int %x_91
+        %254 = OpLoad %int %x_92
+        %255 = OpLoad %int %x_93
+        %258 = OpIMul %int %int_2 %254
+        %259 = OpIAdd %int %253 %258
+        %260 = OpISub %int %259 %int_1
+        %256 = OpExtInst %int %257 SMin %260 %255
+               OpStore %x_88 %256
+        %261 = OpLoad %int %x_90
+               OpStore %x_87 %261
+        %262 = OpLoad %int %x_89
+               OpStore %x_86 %262
+        %263 = OpLoad %int %x_88
+               OpStore %x_85 %263
+        %264 = OpFunctionCall %void %merge_i1_i1_i1_ %x_87 %x_86 %x_85
+               OpBranch %238
+        %238 = OpLabel
+        %268 = OpLoad %int %x_92
+        %269 = OpLoad %int %x_91
+        %270 = OpIMul %int %int_2 %268
+        %271 = OpIAdd %int %269 %270
+               OpStore %x_91 %271
+               OpBranch %236
+        %237 = OpLabel
+               OpBranch %227
+        %227 = OpLabel
+        %272 = OpLoad %int %x_92
+        %273 = OpIMul %int %int_2 %272
+               OpStore %x_92 %273
+               OpBranch %225
+        %226 = OpLabel
+        %276 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %277 = OpLoad %float %276
+        %278 = OpConvertFToS %int %277
+        %280 = OpSLessThan %bool %278 %int_30
+               OpSelectionMerge %281 None
+               OpBranchConditional %280 %282 %283
+        %282 = OpLabel
+        %284 = OpAccessChain %_ptr_Private_int %data %int_0
+        %285 = OpLoad %int %284
+        %287 = OpConvertSToF %float %285
+        %289 = OpFDiv %float %287 %float_10
+        %290 = OpFAdd %float %float_0_5 %289
+               OpStore %grey %290
+               OpBranch %281
+        %283 = OpLabel
+        %291 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %292 = OpLoad %float %291
+        %293 = OpConvertFToS %int %292
+        %295 = OpSLessThan %bool %293 %int_60
+               OpSelectionMerge %296 None
+               OpBranchConditional %295 %297 %298
+        %297 = OpLabel
+        %299 = OpAccessChain %_ptr_Private_int %data %int_1
+        %300 = OpLoad %int %299
+        %301 = OpConvertSToF %float %300
+        %302 = OpFDiv %float %301 %float_10
+        %303 = OpFAdd %float %float_0_5 %302
+               OpStore %grey %303
+               OpBranch %296
+        %298 = OpLabel
+        %304 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %305 = OpLoad %float %304
+        %306 = OpConvertFToS %int %305
+        %308 = OpSLessThan %bool %306 %int_90
+               OpSelectionMerge %309 None
+               OpBranchConditional %308 %310 %311
+        %310 = OpLabel
+        %312 = OpAccessChain %_ptr_Private_int %data %int_2
+        %313 = OpLoad %int %312
+        %314 = OpConvertSToF %float %313
+        %315 = OpFDiv %float %314 %float_10
+        %316 = OpFAdd %float %float_0_5 %315
+               OpStore %grey %316
+               OpBranch %309
+        %311 = OpLabel
+        %317 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %318 = OpLoad %float %317
+        %319 = OpConvertFToS %int %318
+        %321 = OpSLessThan %bool %319 %int_120
+               OpSelectionMerge %322 None
+               OpBranchConditional %321 %323 %324
+        %323 = OpLabel
+        %325 = OpAccessChain %_ptr_Private_int %data %int_3
+        %326 = OpLoad %int %325
+        %327 = OpConvertSToF %float %326
+        %328 = OpFDiv %float %327 %float_10
+        %329 = OpFAdd %float %float_0_5 %328
+               OpStore %grey %329
+               OpBranch %322
+        %324 = OpLabel
+        %330 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %331 = OpLoad %float %330
+        %332 = OpConvertFToS %int %331
+        %334 = OpSLessThan %bool %332 %int_150
+               OpSelectionMerge %335 None
+               OpBranchConditional %334 %336 %337
+        %336 = OpLabel
+               OpKill
+        %337 = OpLabel
+        %338 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %339 = OpLoad %float %338
+        %340 = OpConvertFToS %int %339
+        %342 = OpSLessThan %bool %340 %int_180
+               OpSelectionMerge %343 None
+               OpBranchConditional %342 %344 %345
+        %344 = OpLabel
+        %347 = OpAccessChain %_ptr_Private_int %data %int_5
+        %348 = OpLoad %int %347
+        %349 = OpConvertSToF %float %348
+        %350 = OpFDiv %float %349 %float_10
+        %351 = OpFAdd %float %float_0_5 %350
+               OpStore %grey %351
+               OpBranch %343
+        %345 = OpLabel
+        %352 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %353 = OpLoad %float %352
+        %354 = OpConvertFToS %int %353
+        %356 = OpSLessThan %bool %354 %int_210
+               OpSelectionMerge %357 None
+               OpBranchConditional %356 %358 %359
+        %358 = OpLabel
+        %361 = OpAccessChain %_ptr_Private_int %data %int_6
+        %362 = OpLoad %int %361
+        %363 = OpConvertSToF %float %362
+        %364 = OpFDiv %float %363 %float_10
+        %365 = OpFAdd %float %float_0_5 %364
+               OpStore %grey %365
+               OpBranch %357
+        %359 = OpLabel
+        %366 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %367 = OpLoad %float %366
+        %368 = OpConvertFToS %int %367
+        %370 = OpSLessThan %bool %368 %int_240
+               OpSelectionMerge %371 None
+               OpBranchConditional %370 %372 %373
+        %372 = OpLabel
+        %375 = OpAccessChain %_ptr_Private_int %data %int_7
+        %376 = OpLoad %int %375
+        %377 = OpConvertSToF %float %376
+        %378 = OpFDiv %float %377 %float_10
+        %379 = OpFAdd %float %float_0_5 %378
+               OpStore %grey %379
+               OpBranch %371
+        %373 = OpLabel
+        %380 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %381 = OpLoad %float %380
+        %382 = OpConvertFToS %int %381
+        %384 = OpSLessThan %bool %382 %int_270
+               OpSelectionMerge %385 None
+               OpBranchConditional %384 %386 %387
+        %386 = OpLabel
+        %389 = OpAccessChain %_ptr_Private_int %data %int_8
+        %390 = OpLoad %int %389
+        %391 = OpConvertSToF %float %390
+        %392 = OpFDiv %float %391 %float_10
+        %393 = OpFAdd %float %float_0_5 %392
+               OpStore %grey %393
+               OpBranch %385
+        %387 = OpLabel
+               OpKill
+        %385 = OpLabel
+               OpBranch %371
+        %371 = OpLabel
+               OpBranch %357
+        %357 = OpLabel
+               OpBranch %343
+        %343 = OpLabel
+               OpBranch %335
+        %335 = OpLabel
+               OpBranch %322
+        %322 = OpLabel
+               OpBranch %309
+        %309 = OpLabel
+               OpBranch %296
+        %296 = OpLabel
+               OpBranch %281
+        %281 = OpLabel
+        %394 = OpLoad %float %grey
+        %396 = OpCompositeConstruct %v3float %394 %394 %394
+        %397 = OpCompositeExtract %float %396 0
+        %398 = OpCompositeExtract %float %396 1
+        %399 = OpCompositeExtract %float %396 2
+        %401 = OpCompositeConstruct %v4float %397 %398 %399 %float_1
+               OpStore %x_GLF_color %401
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %402
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %406 = OpLabel
+        %407 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %407
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %132
+        %409 = OpLabel
+        %410 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %410
+        %411 = OpFunctionCall %void %main_1
+        %413 = OpLoad %v4float %x_GLF_color
+        %414 = OpCompositeConstruct %main_out %413
+        %412 = OpFunctionCall %void %tint_symbol_3 %414
+               OpReturn
+               OpFunctionEnd
+ %mergeSort_ = OpFunction %void None %132
+        %416 = OpLabel
+        %low = OpVariable %_ptr_Function_int Function %32
+       %high = OpVariable %_ptr_Function_int Function %32
+          %m = OpVariable %_ptr_Function_int Function %32
+        %i_2 = OpVariable %_ptr_Function_int Function %32
+     %from_1 = OpVariable %_ptr_Function_int Function %32
+      %mid_1 = OpVariable %_ptr_Function_int Function %32
+       %to_1 = OpVariable %_ptr_Function_int Function %32
+      %param = OpVariable %_ptr_Function_int Function %32
+    %param_1 = OpVariable %_ptr_Function_int Function %32
+    %param_2 = OpVariable %_ptr_Function_int Function %32
+               OpStore %low %int_0
+               OpStore %high %int_9
+               OpStore %m %int_1
+               OpBranch %427
+        %427 = OpLabel
+               OpLoopMerge %428 %429 None
+               OpBranch %430
+        %430 = OpLabel
+        %431 = OpLoad %int %m
+        %432 = OpLoad %int %high
+        %433 = OpSLessThanEqual %bool %431 %432
+               OpSelectionMerge %434 None
+               OpBranchConditional %433 %435 %436
+        %435 = OpLabel
+               OpBranch %434
+        %436 = OpLabel
+               OpBranch %428
+        %434 = OpLabel
+        %437 = OpLoad %int %low
+               OpStore %i_2 %437
+               OpBranch %438
+        %438 = OpLabel
+               OpLoopMerge %439 %440 None
+               OpBranch %441
+        %441 = OpLabel
+        %442 = OpLoad %int %i_2
+        %443 = OpLoad %int %high
+        %444 = OpSLessThan %bool %442 %443
+               OpSelectionMerge %445 None
+               OpBranchConditional %444 %446 %447
+        %446 = OpLabel
+               OpBranch %445
+        %447 = OpLabel
+               OpBranch %439
+        %445 = OpLabel
+        %448 = OpLoad %int %i_2
+               OpStore %from_1 %448
+        %449 = OpLoad %int %i_2
+        %450 = OpLoad %int %m
+        %451 = OpIAdd %int %449 %450
+        %452 = OpISub %int %451 %int_1
+               OpStore %mid_1 %452
+        %453 = OpLoad %int %i_2
+        %454 = OpLoad %int %m
+        %455 = OpLoad %int %high
+        %457 = OpIMul %int %int_2 %454
+        %458 = OpIAdd %int %453 %457
+        %459 = OpISub %int %458 %int_1
+        %456 = OpExtInst %int %257 SMin %459 %455
+               OpStore %to_1 %456
+        %460 = OpLoad %int %from_1
+               OpStore %param %460
+        %461 = OpLoad %int %mid_1
+               OpStore %param_1 %461
+        %462 = OpLoad %int %to_1
+               OpStore %param_2 %462
+        %463 = OpFunctionCall %void %merge_i1_i1_i1_ %param %param_1 %param_2
+               OpBranch %440
+        %440 = OpLabel
+        %467 = OpLoad %int %m
+        %468 = OpLoad %int %i_2
+        %469 = OpIMul %int %int_2 %467
+        %470 = OpIAdd %int %468 %469
+               OpStore %i_2 %470
+               OpBranch %438
+        %439 = OpLabel
+               OpBranch %429
+        %429 = OpLabel
+        %471 = OpLoad %int %m
+        %472 = OpIMul %int %int_2 %471
+               OpStore %m %472
+               OpBranch %427
+        %428 = OpLabel
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 157[%157] is not post dominated by the back-edge block 205[%205]
+  %205 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..bf16229
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/1.spvasm.expected.wgsl
@@ -0,0 +1,366 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> data : array<i32, 10>;
+
+var<private> temp : array<i32, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn merge_i1_i1_i1_(from : ptr<function, i32>, mid : ptr<function, i32>, to : ptr<function, i32>) {
+  var k : i32;
+  var i : i32;
+  var j : i32;
+  var i_1 : i32;
+  let x_303 : i32 = *(from);
+  k = x_303;
+  let x_304 : i32 = *(from);
+  i = x_304;
+  let x_305 : i32 = *(mid);
+  j = (x_305 + 1);
+  loop {
+    let x_311 : i32 = i;
+    let x_312 : i32 = *(mid);
+    let x_314 : i32 = j;
+    let x_315 : i32 = *(to);
+    if (((x_311 <= x_312) && (x_314 <= x_315))) {
+    } else {
+      break;
+    }
+    let x_319 : i32 = i;
+    let x_321 : i32 = data[x_319];
+    let x_322 : i32 = j;
+    let x_324 : i32 = data[x_322];
+    if ((x_321 < x_324)) {
+      let x_329 : i32 = k;
+      k = (x_329 + 1);
+      let x_331 : i32 = i;
+      i = (x_331 + 1);
+      let x_334 : i32 = data[x_331];
+      temp[x_329] = x_334;
+    } else {
+      let x_336 : i32 = k;
+      k = (x_336 + 1);
+      let x_338 : i32 = j;
+      j = (x_338 + 1);
+      let x_341 : i32 = data[x_338];
+      temp[x_336] = x_341;
+    }
+  }
+  loop {
+    let x_347 : i32 = i;
+    let x_349 : i32 = i;
+    let x_350 : i32 = *(mid);
+    if (((x_347 < 10) && (x_349 <= x_350))) {
+    } else {
+      break;
+    }
+    let x_354 : i32 = k;
+    k = (x_354 + 1);
+    let x_356 : i32 = i;
+    i = (x_356 + 1);
+    let x_359 : i32 = data[x_356];
+    temp[x_354] = x_359;
+  }
+  let x_361 : i32 = *(from);
+  i_1 = x_361;
+  loop {
+    let x_366 : i32 = i_1;
+    let x_367 : i32 = *(to);
+    if ((x_366 <= x_367)) {
+    } else {
+      break;
+    }
+    let x_370 : i32 = i_1;
+    let x_371 : i32 = i_1;
+    let x_373 : i32 = temp[x_371];
+    data[x_370] = x_373;
+
+    continuing {
+      let x_375 : i32 = i_1;
+      i_1 = (x_375 + 1);
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var x_85 : i32;
+  var x_86 : i32;
+  var x_87 : i32;
+  var x_88 : i32;
+  var x_89 : i32;
+  var x_90 : i32;
+  var x_91 : i32;
+  var x_92 : i32;
+  var x_93 : i32;
+  var x_94 : i32;
+  var i_3 : i32;
+  var j_1 : i32;
+  var grey : f32;
+  let x_96 : f32 = x_28.injectionSwitch.x;
+  i_3 = i32(x_96);
+  loop {
+    let x_102 : i32 = i_3;
+    switch(x_102) {
+      case 9: {
+        let x_132 : i32 = i_3;
+        data[x_132] = -5;
+      }
+      case 8: {
+        let x_130 : i32 = i_3;
+        data[x_130] = -4;
+      }
+      case 7: {
+        let x_128 : i32 = i_3;
+        data[x_128] = -3;
+      }
+      case 6: {
+        let x_126 : i32 = i_3;
+        data[x_126] = -2;
+      }
+      case 5: {
+        let x_124 : i32 = i_3;
+        data[x_124] = -1;
+      }
+      case 4: {
+        let x_122 : i32 = i_3;
+        data[x_122] = 0;
+      }
+      case 3: {
+        let x_120 : i32 = i_3;
+        data[x_120] = 1;
+      }
+      case 2: {
+        let x_118 : i32 = i_3;
+        data[x_118] = 2;
+      }
+      case 1: {
+        let x_116 : i32 = i_3;
+        data[x_116] = 3;
+      }
+      case 0: {
+        let x_114 : i32 = i_3;
+        data[x_114] = 4;
+      }
+      default: {
+      }
+    }
+    let x_134 : i32 = i_3;
+    i_3 = (x_134 + 1);
+
+    continuing {
+      let x_136 : i32 = i_3;
+      if ((x_136 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  loop {
+    let x_142 : i32 = j_1;
+    if ((x_142 < 10)) {
+    } else {
+      break;
+    }
+    let x_145 : i32 = j_1;
+    let x_146 : i32 = j_1;
+    let x_148 : i32 = data[x_146];
+    temp[x_145] = x_148;
+
+    continuing {
+      let x_150 : i32 = j_1;
+      j_1 = (x_150 + 1);
+    }
+  }
+  x_94 = 0;
+  x_93 = 9;
+  x_92 = 1;
+  loop {
+    let x_156 : i32 = x_92;
+    let x_157 : i32 = x_93;
+    if ((x_156 <= x_157)) {
+    } else {
+      break;
+    }
+    let x_160 : i32 = x_94;
+    x_91 = x_160;
+    loop {
+      let x_165 : i32 = x_91;
+      let x_166 : i32 = x_93;
+      if ((x_165 < x_166)) {
+      } else {
+        break;
+      }
+      let x_169 : i32 = x_91;
+      x_90 = x_169;
+      let x_170 : i32 = x_91;
+      let x_171 : i32 = x_92;
+      let x_173 : array<i32, 10> = data;
+      data = array<i32, 10>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+      data = x_173;
+      x_89 = ((x_170 + x_171) - 1);
+      let x_175 : i32 = x_91;
+      let x_176 : i32 = x_92;
+      let x_180 : i32 = x_93;
+      x_88 = min(((x_175 + (2 * x_176)) - 1), x_180);
+      let x_182 : i32 = x_90;
+      x_87 = x_182;
+      let x_183 : i32 = x_89;
+      x_86 = x_183;
+      let x_184 : i32 = x_88;
+      x_85 = x_184;
+      merge_i1_i1_i1_(&(x_87), &(x_86), &(x_85));
+
+      continuing {
+        let x_186 : i32 = x_92;
+        let x_188 : i32 = x_91;
+        x_91 = (x_188 + (2 * x_186));
+      }
+    }
+
+    continuing {
+      let x_190 : i32 = x_92;
+      x_92 = (2 * x_190);
+    }
+  }
+  let x_194 : f32 = gl_FragCoord.y;
+  if ((i32(x_194) < 30)) {
+    let x_201 : i32 = data[0];
+    grey = (0.5 + (f32(x_201) / 10.0));
+  } else {
+    let x_206 : f32 = gl_FragCoord.y;
+    if ((i32(x_206) < 60)) {
+      let x_213 : i32 = data[1];
+      grey = (0.5 + (f32(x_213) / 10.0));
+    } else {
+      let x_218 : f32 = gl_FragCoord.y;
+      if ((i32(x_218) < 90)) {
+        let x_225 : i32 = data[2];
+        grey = (0.5 + (f32(x_225) / 10.0));
+      } else {
+        let x_230 : f32 = gl_FragCoord.y;
+        if ((i32(x_230) < 120)) {
+          let x_237 : i32 = data[3];
+          grey = (0.5 + (f32(x_237) / 10.0));
+        } else {
+          let x_242 : f32 = gl_FragCoord.y;
+          if ((i32(x_242) < 150)) {
+            discard;
+          } else {
+            let x_249 : f32 = gl_FragCoord.y;
+            if ((i32(x_249) < 180)) {
+              let x_256 : i32 = data[5];
+              grey = (0.5 + (f32(x_256) / 10.0));
+            } else {
+              let x_261 : f32 = gl_FragCoord.y;
+              if ((i32(x_261) < 210)) {
+                let x_268 : i32 = data[6];
+                grey = (0.5 + (f32(x_268) / 10.0));
+              } else {
+                let x_273 : f32 = gl_FragCoord.y;
+                if ((i32(x_273) < 240)) {
+                  let x_280 : i32 = data[7];
+                  grey = (0.5 + (f32(x_280) / 10.0));
+                } else {
+                  let x_285 : f32 = gl_FragCoord.y;
+                  if ((i32(x_285) < 270)) {
+                    let x_292 : i32 = data[8];
+                    grey = (0.5 + (f32(x_292) / 10.0));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  let x_296 : f32 = grey;
+  let x_297 : vec3<f32> = vec3<f32>(x_296, x_296, x_296);
+  x_GLF_color = vec4<f32>(x_297.x, x_297.y, x_297.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+fn mergeSort_() {
+  var low : i32;
+  var high : i32;
+  var m : i32;
+  var i_2 : i32;
+  var from_1 : i32;
+  var mid_1 : i32;
+  var to_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  low = 0;
+  high = 9;
+  m = 1;
+  loop {
+    let x_382 : i32 = m;
+    let x_383 : i32 = high;
+    if ((x_382 <= x_383)) {
+    } else {
+      break;
+    }
+    let x_386 : i32 = low;
+    i_2 = x_386;
+    loop {
+      let x_391 : i32 = i_2;
+      let x_392 : i32 = high;
+      if ((x_391 < x_392)) {
+      } else {
+        break;
+      }
+      let x_395 : i32 = i_2;
+      from_1 = x_395;
+      let x_396 : i32 = i_2;
+      let x_397 : i32 = m;
+      mid_1 = ((x_396 + x_397) - 1);
+      let x_400 : i32 = i_2;
+      let x_401 : i32 = m;
+      let x_405 : i32 = high;
+      to_1 = min(((x_400 + (2 * x_401)) - 1), x_405);
+      let x_407 : i32 = from_1;
+      param = x_407;
+      let x_408 : i32 = mid_1;
+      param_1 = x_408;
+      let x_409 : i32 = to_1;
+      param_2 = x_409;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2));
+
+      continuing {
+        let x_411 : i32 = m;
+        let x_413 : i32 = i_2;
+        i_2 = (x_413 + (2 * x_411));
+      }
+    }
+
+    continuing {
+      let x_415 : i32 = m;
+      m = (2 * x_415);
+    }
+  }
+  return;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/1.wgsl
new file mode 100644
index 0000000..bf16229
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/1.wgsl
@@ -0,0 +1,366 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> data : array<i32, 10>;
+
+var<private> temp : array<i32, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn merge_i1_i1_i1_(from : ptr<function, i32>, mid : ptr<function, i32>, to : ptr<function, i32>) {
+  var k : i32;
+  var i : i32;
+  var j : i32;
+  var i_1 : i32;
+  let x_303 : i32 = *(from);
+  k = x_303;
+  let x_304 : i32 = *(from);
+  i = x_304;
+  let x_305 : i32 = *(mid);
+  j = (x_305 + 1);
+  loop {
+    let x_311 : i32 = i;
+    let x_312 : i32 = *(mid);
+    let x_314 : i32 = j;
+    let x_315 : i32 = *(to);
+    if (((x_311 <= x_312) && (x_314 <= x_315))) {
+    } else {
+      break;
+    }
+    let x_319 : i32 = i;
+    let x_321 : i32 = data[x_319];
+    let x_322 : i32 = j;
+    let x_324 : i32 = data[x_322];
+    if ((x_321 < x_324)) {
+      let x_329 : i32 = k;
+      k = (x_329 + 1);
+      let x_331 : i32 = i;
+      i = (x_331 + 1);
+      let x_334 : i32 = data[x_331];
+      temp[x_329] = x_334;
+    } else {
+      let x_336 : i32 = k;
+      k = (x_336 + 1);
+      let x_338 : i32 = j;
+      j = (x_338 + 1);
+      let x_341 : i32 = data[x_338];
+      temp[x_336] = x_341;
+    }
+  }
+  loop {
+    let x_347 : i32 = i;
+    let x_349 : i32 = i;
+    let x_350 : i32 = *(mid);
+    if (((x_347 < 10) && (x_349 <= x_350))) {
+    } else {
+      break;
+    }
+    let x_354 : i32 = k;
+    k = (x_354 + 1);
+    let x_356 : i32 = i;
+    i = (x_356 + 1);
+    let x_359 : i32 = data[x_356];
+    temp[x_354] = x_359;
+  }
+  let x_361 : i32 = *(from);
+  i_1 = x_361;
+  loop {
+    let x_366 : i32 = i_1;
+    let x_367 : i32 = *(to);
+    if ((x_366 <= x_367)) {
+    } else {
+      break;
+    }
+    let x_370 : i32 = i_1;
+    let x_371 : i32 = i_1;
+    let x_373 : i32 = temp[x_371];
+    data[x_370] = x_373;
+
+    continuing {
+      let x_375 : i32 = i_1;
+      i_1 = (x_375 + 1);
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var x_85 : i32;
+  var x_86 : i32;
+  var x_87 : i32;
+  var x_88 : i32;
+  var x_89 : i32;
+  var x_90 : i32;
+  var x_91 : i32;
+  var x_92 : i32;
+  var x_93 : i32;
+  var x_94 : i32;
+  var i_3 : i32;
+  var j_1 : i32;
+  var grey : f32;
+  let x_96 : f32 = x_28.injectionSwitch.x;
+  i_3 = i32(x_96);
+  loop {
+    let x_102 : i32 = i_3;
+    switch(x_102) {
+      case 9: {
+        let x_132 : i32 = i_3;
+        data[x_132] = -5;
+      }
+      case 8: {
+        let x_130 : i32 = i_3;
+        data[x_130] = -4;
+      }
+      case 7: {
+        let x_128 : i32 = i_3;
+        data[x_128] = -3;
+      }
+      case 6: {
+        let x_126 : i32 = i_3;
+        data[x_126] = -2;
+      }
+      case 5: {
+        let x_124 : i32 = i_3;
+        data[x_124] = -1;
+      }
+      case 4: {
+        let x_122 : i32 = i_3;
+        data[x_122] = 0;
+      }
+      case 3: {
+        let x_120 : i32 = i_3;
+        data[x_120] = 1;
+      }
+      case 2: {
+        let x_118 : i32 = i_3;
+        data[x_118] = 2;
+      }
+      case 1: {
+        let x_116 : i32 = i_3;
+        data[x_116] = 3;
+      }
+      case 0: {
+        let x_114 : i32 = i_3;
+        data[x_114] = 4;
+      }
+      default: {
+      }
+    }
+    let x_134 : i32 = i_3;
+    i_3 = (x_134 + 1);
+
+    continuing {
+      let x_136 : i32 = i_3;
+      if ((x_136 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  loop {
+    let x_142 : i32 = j_1;
+    if ((x_142 < 10)) {
+    } else {
+      break;
+    }
+    let x_145 : i32 = j_1;
+    let x_146 : i32 = j_1;
+    let x_148 : i32 = data[x_146];
+    temp[x_145] = x_148;
+
+    continuing {
+      let x_150 : i32 = j_1;
+      j_1 = (x_150 + 1);
+    }
+  }
+  x_94 = 0;
+  x_93 = 9;
+  x_92 = 1;
+  loop {
+    let x_156 : i32 = x_92;
+    let x_157 : i32 = x_93;
+    if ((x_156 <= x_157)) {
+    } else {
+      break;
+    }
+    let x_160 : i32 = x_94;
+    x_91 = x_160;
+    loop {
+      let x_165 : i32 = x_91;
+      let x_166 : i32 = x_93;
+      if ((x_165 < x_166)) {
+      } else {
+        break;
+      }
+      let x_169 : i32 = x_91;
+      x_90 = x_169;
+      let x_170 : i32 = x_91;
+      let x_171 : i32 = x_92;
+      let x_173 : array<i32, 10> = data;
+      data = array<i32, 10>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+      data = x_173;
+      x_89 = ((x_170 + x_171) - 1);
+      let x_175 : i32 = x_91;
+      let x_176 : i32 = x_92;
+      let x_180 : i32 = x_93;
+      x_88 = min(((x_175 + (2 * x_176)) - 1), x_180);
+      let x_182 : i32 = x_90;
+      x_87 = x_182;
+      let x_183 : i32 = x_89;
+      x_86 = x_183;
+      let x_184 : i32 = x_88;
+      x_85 = x_184;
+      merge_i1_i1_i1_(&(x_87), &(x_86), &(x_85));
+
+      continuing {
+        let x_186 : i32 = x_92;
+        let x_188 : i32 = x_91;
+        x_91 = (x_188 + (2 * x_186));
+      }
+    }
+
+    continuing {
+      let x_190 : i32 = x_92;
+      x_92 = (2 * x_190);
+    }
+  }
+  let x_194 : f32 = gl_FragCoord.y;
+  if ((i32(x_194) < 30)) {
+    let x_201 : i32 = data[0];
+    grey = (0.5 + (f32(x_201) / 10.0));
+  } else {
+    let x_206 : f32 = gl_FragCoord.y;
+    if ((i32(x_206) < 60)) {
+      let x_213 : i32 = data[1];
+      grey = (0.5 + (f32(x_213) / 10.0));
+    } else {
+      let x_218 : f32 = gl_FragCoord.y;
+      if ((i32(x_218) < 90)) {
+        let x_225 : i32 = data[2];
+        grey = (0.5 + (f32(x_225) / 10.0));
+      } else {
+        let x_230 : f32 = gl_FragCoord.y;
+        if ((i32(x_230) < 120)) {
+          let x_237 : i32 = data[3];
+          grey = (0.5 + (f32(x_237) / 10.0));
+        } else {
+          let x_242 : f32 = gl_FragCoord.y;
+          if ((i32(x_242) < 150)) {
+            discard;
+          } else {
+            let x_249 : f32 = gl_FragCoord.y;
+            if ((i32(x_249) < 180)) {
+              let x_256 : i32 = data[5];
+              grey = (0.5 + (f32(x_256) / 10.0));
+            } else {
+              let x_261 : f32 = gl_FragCoord.y;
+              if ((i32(x_261) < 210)) {
+                let x_268 : i32 = data[6];
+                grey = (0.5 + (f32(x_268) / 10.0));
+              } else {
+                let x_273 : f32 = gl_FragCoord.y;
+                if ((i32(x_273) < 240)) {
+                  let x_280 : i32 = data[7];
+                  grey = (0.5 + (f32(x_280) / 10.0));
+                } else {
+                  let x_285 : f32 = gl_FragCoord.y;
+                  if ((i32(x_285) < 270)) {
+                    let x_292 : i32 = data[8];
+                    grey = (0.5 + (f32(x_292) / 10.0));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  let x_296 : f32 = grey;
+  let x_297 : vec3<f32> = vec3<f32>(x_296, x_296, x_296);
+  x_GLF_color = vec4<f32>(x_297.x, x_297.y, x_297.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+fn mergeSort_() {
+  var low : i32;
+  var high : i32;
+  var m : i32;
+  var i_2 : i32;
+  var from_1 : i32;
+  var mid_1 : i32;
+  var to_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  low = 0;
+  high = 9;
+  m = 1;
+  loop {
+    let x_382 : i32 = m;
+    let x_383 : i32 = high;
+    if ((x_382 <= x_383)) {
+    } else {
+      break;
+    }
+    let x_386 : i32 = low;
+    i_2 = x_386;
+    loop {
+      let x_391 : i32 = i_2;
+      let x_392 : i32 = high;
+      if ((x_391 < x_392)) {
+      } else {
+        break;
+      }
+      let x_395 : i32 = i_2;
+      from_1 = x_395;
+      let x_396 : i32 = i_2;
+      let x_397 : i32 = m;
+      mid_1 = ((x_396 + x_397) - 1);
+      let x_400 : i32 = i_2;
+      let x_401 : i32 = m;
+      let x_405 : i32 = high;
+      to_1 = min(((x_400 + (2 * x_401)) - 1), x_405);
+      let x_407 : i32 = from_1;
+      param = x_407;
+      let x_408 : i32 = mid_1;
+      param_1 = x_408;
+      let x_409 : i32 = to_1;
+      param_2 = x_409;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2));
+
+      continuing {
+        let x_411 : i32 = m;
+        let x_413 : i32 = i_2;
+        i_2 = (x_413 + (2 * x_411));
+      }
+    }
+
+    continuing {
+      let x_415 : i32 = m;
+      m = (2 * x_415);
+    }
+  }
+  return;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..03b86e8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/1.wgsl.expected.hlsl
@@ -0,0 +1,302 @@
+static int data[10] = (int[10])0;
+static int temp[10] = (int[10])0;
+cbuffer cbuffer_x_28 : register(b0, space0) {
+  uint4 x_28[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void merge_i1_i1_i1_(inout int from, inout int mid, inout int to) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  const int x_303 = from;
+  k = x_303;
+  const int x_304 = from;
+  i = x_304;
+  const int x_305 = mid;
+  j = (x_305 + 1);
+  while (true) {
+    const int x_311 = i;
+    const int x_312 = mid;
+    const int x_314 = j;
+    const int x_315 = to;
+    bool tint_tmp = (x_311 <= x_312);
+    if (tint_tmp) {
+      tint_tmp = (x_314 <= x_315);
+    }
+    if ((tint_tmp)) {
+    } else {
+      break;
+    }
+    const int x_321 = data[i];
+    const int x_324 = data[j];
+    if ((x_321 < x_324)) {
+      const int x_329 = k;
+      k = (x_329 + 1);
+      const int x_331 = i;
+      i = (x_331 + 1);
+      const int x_334 = data[x_331];
+      temp[x_329] = x_334;
+    } else {
+      const int x_336 = k;
+      k = (x_336 + 1);
+      const int x_338 = j;
+      j = (x_338 + 1);
+      const int x_341 = data[x_338];
+      temp[x_336] = x_341;
+    }
+  }
+  while (true) {
+    const int x_347 = i;
+    const int x_349 = i;
+    const int x_350 = mid;
+    bool tint_tmp_1 = (x_347 < 10);
+    if (tint_tmp_1) {
+      tint_tmp_1 = (x_349 <= x_350);
+    }
+    if ((tint_tmp_1)) {
+    } else {
+      break;
+    }
+    const int x_354 = k;
+    k = (x_354 + 1);
+    const int x_356 = i;
+    i = (x_356 + 1);
+    const int x_359 = data[x_356];
+    temp[x_354] = x_359;
+  }
+  const int x_361 = from;
+  i_1 = x_361;
+  while (true) {
+    const int x_366 = i_1;
+    const int x_367 = to;
+    if ((x_366 <= x_367)) {
+    } else {
+      break;
+    }
+    const int x_370 = i_1;
+    const int x_373 = temp[i_1];
+    data[x_370] = x_373;
+    {
+      i_1 = (i_1 + 1);
+    }
+  }
+  return;
+}
+
+void main_1() {
+  int x_85 = 0;
+  int x_86 = 0;
+  int x_87 = 0;
+  int x_88 = 0;
+  int x_89 = 0;
+  int x_90 = 0;
+  int x_91 = 0;
+  int x_92 = 0;
+  int x_93 = 0;
+  int x_94 = 0;
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  const float x_96 = asfloat(x_28[0].x);
+  i_3 = int(x_96);
+  while (true) {
+    switch(i_3) {
+      case 9: {
+        data[i_3] = -5;
+        break;
+      }
+      case 8: {
+        data[i_3] = -4;
+        break;
+      }
+      case 7: {
+        data[i_3] = -3;
+        break;
+      }
+      case 6: {
+        data[i_3] = -2;
+        break;
+      }
+      case 5: {
+        data[i_3] = -1;
+        break;
+      }
+      case 4: {
+        data[i_3] = 0;
+        break;
+      }
+      case 3: {
+        data[i_3] = 1;
+        break;
+      }
+      case 2: {
+        data[i_3] = 2;
+        break;
+      }
+      case 1: {
+        data[i_3] = 3;
+        break;
+      }
+      case 0: {
+        data[i_3] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    i_3 = (i_3 + 1);
+    {
+      if ((i_3 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  {
+    for(; (j_1 < 10); j_1 = (j_1 + 1)) {
+      const int x_145 = j_1;
+      const int x_148 = data[j_1];
+      temp[x_145] = x_148;
+    }
+  }
+  x_94 = 0;
+  x_93 = 9;
+  x_92 = 1;
+  {
+    for(; (x_92 <= x_93); x_92 = (2 * x_92)) {
+      x_91 = x_94;
+      {
+        for(; (x_91 < x_93); x_91 = (x_91 + (2 * x_92))) {
+          x_90 = x_91;
+          const int x_170 = x_91;
+          const int x_171 = x_92;
+          const int x_173[10] = data;
+          const int tint_symbol_5[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+          data = tint_symbol_5;
+          data = x_173;
+          x_89 = ((x_170 + x_171) - 1);
+          x_88 = min(((x_91 + (2 * x_92)) - 1), x_93);
+          x_87 = x_90;
+          x_86 = x_89;
+          x_85 = x_88;
+          merge_i1_i1_i1_(x_87, x_86, x_85);
+        }
+      }
+    }
+  }
+  const float x_194 = gl_FragCoord.y;
+  if ((int(x_194) < 30)) {
+    const int x_201 = data[0];
+    grey = (0.5f + (float(x_201) / 10.0f));
+  } else {
+    const float x_206 = gl_FragCoord.y;
+    if ((int(x_206) < 60)) {
+      const int x_213 = data[1];
+      grey = (0.5f + (float(x_213) / 10.0f));
+    } else {
+      const float x_218 = gl_FragCoord.y;
+      if ((int(x_218) < 90)) {
+        const int x_225 = data[2];
+        grey = (0.5f + (float(x_225) / 10.0f));
+      } else {
+        const float x_230 = gl_FragCoord.y;
+        if ((int(x_230) < 120)) {
+          const int x_237 = data[3];
+          grey = (0.5f + (float(x_237) / 10.0f));
+        } else {
+          const float x_242 = gl_FragCoord.y;
+          if ((int(x_242) < 150)) {
+            discard;
+          } else {
+            const float x_249 = gl_FragCoord.y;
+            if ((int(x_249) < 180)) {
+              const int x_256 = data[5];
+              grey = (0.5f + (float(x_256) / 10.0f));
+            } else {
+              const float x_261 = gl_FragCoord.y;
+              if ((int(x_261) < 210)) {
+                const int x_268 = data[6];
+                grey = (0.5f + (float(x_268) / 10.0f));
+              } else {
+                const float x_273 = gl_FragCoord.y;
+                if ((int(x_273) < 240)) {
+                  const int x_280 = data[7];
+                  grey = (0.5f + (float(x_280) / 10.0f));
+                } else {
+                  const float x_285 = gl_FragCoord.y;
+                  if ((int(x_285) < 270)) {
+                    const int x_292 = data[8];
+                    grey = (0.5f + (float(x_292) / 10.0f));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  const float x_296 = grey;
+  const float3 x_297 = float3(x_296, x_296, x_296);
+  x_GLF_color = float4(x_297.x, x_297.y, x_297.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
+
+void mergeSort_() {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  {
+    for(; (m <= high); m = (2 * m)) {
+      i_2 = low;
+      {
+        for(; (i_2 < high); i_2 = (i_2 + (2 * m))) {
+          from_1 = i_2;
+          mid_1 = ((i_2 + m) - 1);
+          to_1 = min(((i_2 + (2 * m)) - 1), high);
+          param = from_1;
+          param_1 = mid_1;
+          param_2 = to_1;
+          merge_i1_i1_i1_(param, param_1, param_2);
+        }
+      }
+    }
+  }
+  return;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/1.wgsl.expected.msl
new file mode 100644
index 0000000..6506890
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/1.wgsl.expected.msl
@@ -0,0 +1,373 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void merge_i1_i1_i1_(thread int* const from, thread int* const mid, thread int* const to, thread tint_array_wrapper* const tint_symbol_6, thread tint_array_wrapper* const tint_symbol_7) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  int const x_303 = *(from);
+  k = x_303;
+  int const x_304 = *(from);
+  i = x_304;
+  int const x_305 = *(mid);
+  j = (x_305 + 1);
+  while (true) {
+    int const x_311 = i;
+    int const x_312 = *(mid);
+    int const x_314 = j;
+    int const x_315 = *(to);
+    if (((x_311 <= x_312) && (x_314 <= x_315))) {
+    } else {
+      break;
+    }
+    int const x_319 = i;
+    int const x_321 = (*(tint_symbol_6)).arr[x_319];
+    int const x_322 = j;
+    int const x_324 = (*(tint_symbol_6)).arr[x_322];
+    if ((x_321 < x_324)) {
+      int const x_329 = k;
+      k = (x_329 + 1);
+      int const x_331 = i;
+      i = (x_331 + 1);
+      int const x_334 = (*(tint_symbol_6)).arr[x_331];
+      (*(tint_symbol_7)).arr[x_329] = x_334;
+    } else {
+      int const x_336 = k;
+      k = (x_336 + 1);
+      int const x_338 = j;
+      j = (x_338 + 1);
+      int const x_341 = (*(tint_symbol_6)).arr[x_338];
+      (*(tint_symbol_7)).arr[x_336] = x_341;
+    }
+  }
+  while (true) {
+    int const x_347 = i;
+    int const x_349 = i;
+    int const x_350 = *(mid);
+    if (((x_347 < 10) && (x_349 <= x_350))) {
+    } else {
+      break;
+    }
+    int const x_354 = k;
+    k = (x_354 + 1);
+    int const x_356 = i;
+    i = (x_356 + 1);
+    int const x_359 = (*(tint_symbol_6)).arr[x_356];
+    (*(tint_symbol_7)).arr[x_354] = x_359;
+  }
+  int const x_361 = *(from);
+  i_1 = x_361;
+  while (true) {
+    int const x_366 = i_1;
+    int const x_367 = *(to);
+    if ((x_366 <= x_367)) {
+    } else {
+      break;
+    }
+    int const x_370 = i_1;
+    int const x_371 = i_1;
+    int const x_373 = (*(tint_symbol_7)).arr[x_371];
+    (*(tint_symbol_6)).arr[x_370] = x_373;
+    {
+      int const x_375 = i_1;
+      i_1 = (x_375 + 1);
+    }
+  }
+  return;
+}
+
+void main_1(constant buf0& x_28, thread tint_array_wrapper* const tint_symbol_8, thread tint_array_wrapper* const tint_symbol_9, thread float4* const tint_symbol_10, thread float4* const tint_symbol_11) {
+  int x_85 = 0;
+  int x_86 = 0;
+  int x_87 = 0;
+  int x_88 = 0;
+  int x_89 = 0;
+  int x_90 = 0;
+  int x_91 = 0;
+  int x_92 = 0;
+  int x_93 = 0;
+  int x_94 = 0;
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  float const x_96 = x_28.injectionSwitch.x;
+  i_3 = int(x_96);
+  while (true) {
+    int const x_102 = i_3;
+    switch(x_102) {
+      case 9: {
+        int const x_132 = i_3;
+        (*(tint_symbol_8)).arr[x_132] = -5;
+        break;
+      }
+      case 8: {
+        int const x_130 = i_3;
+        (*(tint_symbol_8)).arr[x_130] = -4;
+        break;
+      }
+      case 7: {
+        int const x_128 = i_3;
+        (*(tint_symbol_8)).arr[x_128] = -3;
+        break;
+      }
+      case 6: {
+        int const x_126 = i_3;
+        (*(tint_symbol_8)).arr[x_126] = -2;
+        break;
+      }
+      case 5: {
+        int const x_124 = i_3;
+        (*(tint_symbol_8)).arr[x_124] = -1;
+        break;
+      }
+      case 4: {
+        int const x_122 = i_3;
+        (*(tint_symbol_8)).arr[x_122] = 0;
+        break;
+      }
+      case 3: {
+        int const x_120 = i_3;
+        (*(tint_symbol_8)).arr[x_120] = 1;
+        break;
+      }
+      case 2: {
+        int const x_118 = i_3;
+        (*(tint_symbol_8)).arr[x_118] = 2;
+        break;
+      }
+      case 1: {
+        int const x_116 = i_3;
+        (*(tint_symbol_8)).arr[x_116] = 3;
+        break;
+      }
+      case 0: {
+        int const x_114 = i_3;
+        (*(tint_symbol_8)).arr[x_114] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    int const x_134 = i_3;
+    i_3 = (x_134 + 1);
+    {
+      int const x_136 = i_3;
+      if ((x_136 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  while (true) {
+    int const x_142 = j_1;
+    if ((x_142 < 10)) {
+    } else {
+      break;
+    }
+    int const x_145 = j_1;
+    int const x_146 = j_1;
+    int const x_148 = (*(tint_symbol_8)).arr[x_146];
+    (*(tint_symbol_9)).arr[x_145] = x_148;
+    {
+      int const x_150 = j_1;
+      j_1 = (x_150 + 1);
+    }
+  }
+  x_94 = 0;
+  x_93 = 9;
+  x_92 = 1;
+  while (true) {
+    int const x_156 = x_92;
+    int const x_157 = x_93;
+    if ((x_156 <= x_157)) {
+    } else {
+      break;
+    }
+    int const x_160 = x_94;
+    x_91 = x_160;
+    while (true) {
+      int const x_165 = x_91;
+      int const x_166 = x_93;
+      if ((x_165 < x_166)) {
+      } else {
+        break;
+      }
+      int const x_169 = x_91;
+      x_90 = x_169;
+      int const x_170 = x_91;
+      int const x_171 = x_92;
+      tint_array_wrapper const x_173 = *(tint_symbol_8);
+      tint_array_wrapper const tint_symbol_4 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+      *(tint_symbol_8) = tint_symbol_4;
+      *(tint_symbol_8) = x_173;
+      x_89 = ((x_170 + x_171) - 1);
+      int const x_175 = x_91;
+      int const x_176 = x_92;
+      int const x_180 = x_93;
+      x_88 = min(((x_175 + (2 * x_176)) - 1), x_180);
+      int const x_182 = x_90;
+      x_87 = x_182;
+      int const x_183 = x_89;
+      x_86 = x_183;
+      int const x_184 = x_88;
+      x_85 = x_184;
+      merge_i1_i1_i1_(&(x_87), &(x_86), &(x_85), tint_symbol_8, tint_symbol_9);
+      {
+        int const x_186 = x_92;
+        int const x_188 = x_91;
+        x_91 = (x_188 + (2 * x_186));
+      }
+    }
+    {
+      int const x_190 = x_92;
+      x_92 = (2 * x_190);
+    }
+  }
+  float const x_194 = (*(tint_symbol_10)).y;
+  if ((int(x_194) < 30)) {
+    int const x_201 = (*(tint_symbol_8)).arr[0];
+    grey = (0.5f + (float(x_201) / 10.0f));
+  } else {
+    float const x_206 = (*(tint_symbol_10)).y;
+    if ((int(x_206) < 60)) {
+      int const x_213 = (*(tint_symbol_8)).arr[1];
+      grey = (0.5f + (float(x_213) / 10.0f));
+    } else {
+      float const x_218 = (*(tint_symbol_10)).y;
+      if ((int(x_218) < 90)) {
+        int const x_225 = (*(tint_symbol_8)).arr[2];
+        grey = (0.5f + (float(x_225) / 10.0f));
+      } else {
+        float const x_230 = (*(tint_symbol_10)).y;
+        if ((int(x_230) < 120)) {
+          int const x_237 = (*(tint_symbol_8)).arr[3];
+          grey = (0.5f + (float(x_237) / 10.0f));
+        } else {
+          float const x_242 = (*(tint_symbol_10)).y;
+          if ((int(x_242) < 150)) {
+            discard_fragment();
+          } else {
+            float const x_249 = (*(tint_symbol_10)).y;
+            if ((int(x_249) < 180)) {
+              int const x_256 = (*(tint_symbol_8)).arr[5];
+              grey = (0.5f + (float(x_256) / 10.0f));
+            } else {
+              float const x_261 = (*(tint_symbol_10)).y;
+              if ((int(x_261) < 210)) {
+                int const x_268 = (*(tint_symbol_8)).arr[6];
+                grey = (0.5f + (float(x_268) / 10.0f));
+              } else {
+                float const x_273 = (*(tint_symbol_10)).y;
+                if ((int(x_273) < 240)) {
+                  int const x_280 = (*(tint_symbol_8)).arr[7];
+                  grey = (0.5f + (float(x_280) / 10.0f));
+                } else {
+                  float const x_285 = (*(tint_symbol_10)).y;
+                  if ((int(x_285) < 270)) {
+                    int const x_292 = (*(tint_symbol_8)).arr[8];
+                    grey = (0.5f + (float(x_292) / 10.0f));
+                  } else {
+                    discard_fragment();
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  float const x_296 = grey;
+  float3 const x_297 = float3(x_296, x_296, x_296);
+  *(tint_symbol_11) = float4(x_297.x, x_297.y, x_297.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_28 [[buffer(0)]]) {
+  thread float4 tint_symbol_12 = 0.0f;
+  thread tint_array_wrapper tint_symbol_13 = {};
+  thread tint_array_wrapper tint_symbol_14 = {};
+  thread float4 tint_symbol_15 = 0.0f;
+  tint_symbol_12 = gl_FragCoord_param;
+  main_1(x_28, &(tint_symbol_13), &(tint_symbol_14), &(tint_symbol_12), &(tint_symbol_15));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_15};
+  tint_symbol_2 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
+void mergeSort_(thread tint_array_wrapper* const tint_symbol_16, thread tint_array_wrapper* const tint_symbol_17) {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  while (true) {
+    int const x_382 = m;
+    int const x_383 = high;
+    if ((x_382 <= x_383)) {
+    } else {
+      break;
+    }
+    int const x_386 = low;
+    i_2 = x_386;
+    while (true) {
+      int const x_391 = i_2;
+      int const x_392 = high;
+      if ((x_391 < x_392)) {
+      } else {
+        break;
+      }
+      int const x_395 = i_2;
+      from_1 = x_395;
+      int const x_396 = i_2;
+      int const x_397 = m;
+      mid_1 = ((x_396 + x_397) - 1);
+      int const x_400 = i_2;
+      int const x_401 = m;
+      int const x_405 = high;
+      to_1 = min(((x_400 + (2 * x_401)) - 1), x_405);
+      int const x_407 = from_1;
+      param = x_407;
+      int const x_408 = mid_1;
+      param_1 = x_408;
+      int const x_409 = to_1;
+      param_2 = x_409;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2), tint_symbol_16, tint_symbol_17);
+      {
+        int const x_411 = m;
+        int const x_413 = i_2;
+        i_2 = (x_413 + (2 * x_411));
+      }
+    }
+    {
+      int const x_415 = m;
+      m = (2 * x_415);
+    }
+  }
+  return;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..451e627
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/1.wgsl.expected.spvasm
@@ -0,0 +1,745 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 473
+; Schema: 0
+               OpCapability Shader
+        %257 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %data "data"
+               OpName %temp "temp"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_28 "x_28"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %merge_i1_i1_i1_ "merge_i1_i1_i1_"
+               OpName %from "from"
+               OpName %mid "mid"
+               OpName %to "to"
+               OpName %k "k"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %i_1 "i_1"
+               OpName %main_1 "main_1"
+               OpName %x_85 "x_85"
+               OpName %x_86 "x_86"
+               OpName %x_87 "x_87"
+               OpName %x_88 "x_88"
+               OpName %x_89 "x_89"
+               OpName %x_90 "x_90"
+               OpName %x_91 "x_91"
+               OpName %x_92 "x_92"
+               OpName %x_93 "x_93"
+               OpName %x_94 "x_94"
+               OpName %i_3 "i_3"
+               OpName %j_1 "j_1"
+               OpName %grey "grey"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpName %mergeSort_ "mergeSort_"
+               OpName %low "low"
+               OpName %high "high"
+               OpName %m "m"
+               OpName %i_2 "i_2"
+               OpName %from_1 "from_1"
+               OpName %mid_1 "mid_1"
+               OpName %to_1 "to_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_28 NonWritable
+               OpDecorate %x_28 DescriptorSet 0
+               OpDecorate %x_28 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Private__arr_int_uint_10 = OpTypePointer Private %_arr_int_uint_10
+          %7 = OpConstantNull %_arr_int_uint_10
+       %data = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+       %temp = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_28 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %17
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int %_ptr_Function_int
+         %32 = OpConstantNull %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+%_ptr_Private_int = OpTypePointer Private %int
+     %int_10 = OpConstant %int 10
+        %132 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+        %149 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %int_n5 = OpConstant %int -5
+     %int_n4 = OpConstant %int -4
+     %int_n3 = OpConstant %int -3
+     %int_n2 = OpConstant %int -2
+     %int_n1 = OpConstant %int -1
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+      %int_9 = OpConstant %int 9
+        %250 = OpConstantComposite %_arr_int_uint_10 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %int_30 = OpConstant %int 30
+  %float_0_5 = OpConstant %float 0.5
+   %float_10 = OpConstant %float 10
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+    %v3float = OpTypeVector %float 3
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %402 = OpTypeFunction %void %main_out
+%merge_i1_i1_i1_ = OpFunction %void None %23
+       %from = OpFunctionParameter %_ptr_Function_int
+        %mid = OpFunctionParameter %_ptr_Function_int
+         %to = OpFunctionParameter %_ptr_Function_int
+         %30 = OpLabel
+          %k = OpVariable %_ptr_Function_int Function %32
+          %i = OpVariable %_ptr_Function_int Function %32
+          %j = OpVariable %_ptr_Function_int Function %32
+        %i_1 = OpVariable %_ptr_Function_int Function %32
+         %37 = OpLoad %int %from
+               OpStore %k %37
+         %39 = OpLoad %int %from
+               OpStore %i %39
+         %41 = OpLoad %int %mid
+         %43 = OpIAdd %int %41 %int_1
+               OpStore %j %43
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %48 = OpLoad %int %i
+         %50 = OpLoad %int %mid
+         %51 = OpLoad %int %j
+         %53 = OpLoad %int %to
+         %54 = OpSLessThanEqual %bool %48 %50
+               OpSelectionMerge %56 None
+               OpBranchConditional %54 %57 %56
+         %57 = OpLabel
+         %58 = OpSLessThanEqual %bool %51 %53
+               OpBranch %56
+         %56 = OpLabel
+         %59 = OpPhi %bool %54 %47 %58 %57
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %62
+         %61 = OpLabel
+               OpBranch %60
+         %62 = OpLabel
+               OpBranch %45
+         %60 = OpLabel
+         %63 = OpLoad %int %i
+         %65 = OpAccessChain %_ptr_Private_int %data %63
+         %66 = OpLoad %int %65
+         %67 = OpLoad %int %j
+         %68 = OpAccessChain %_ptr_Private_int %data %67
+         %69 = OpLoad %int %68
+         %70 = OpSLessThan %bool %66 %69
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %73
+         %72 = OpLabel
+         %74 = OpLoad %int %k
+         %75 = OpIAdd %int %74 %int_1
+               OpStore %k %75
+         %76 = OpLoad %int %i
+         %77 = OpIAdd %int %76 %int_1
+               OpStore %i %77
+         %78 = OpAccessChain %_ptr_Private_int %data %76
+         %79 = OpLoad %int %78
+         %80 = OpAccessChain %_ptr_Private_int %temp %74
+               OpStore %80 %79
+               OpBranch %71
+         %73 = OpLabel
+         %81 = OpLoad %int %k
+         %82 = OpIAdd %int %81 %int_1
+               OpStore %k %82
+         %83 = OpLoad %int %j
+         %84 = OpIAdd %int %83 %int_1
+               OpStore %j %84
+         %85 = OpAccessChain %_ptr_Private_int %data %83
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_Private_int %temp %81
+               OpStore %87 %86
+               OpBranch %71
+         %71 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+               OpBranch %44
+         %45 = OpLabel
+               OpBranch %88
+         %88 = OpLabel
+               OpLoopMerge %89 %90 None
+               OpBranch %91
+         %91 = OpLabel
+         %92 = OpLoad %int %i
+         %93 = OpLoad %int %i
+         %95 = OpLoad %int %mid
+         %97 = OpSLessThan %bool %92 %int_10
+               OpSelectionMerge %98 None
+               OpBranchConditional %97 %99 %98
+         %99 = OpLabel
+        %100 = OpSLessThanEqual %bool %93 %95
+               OpBranch %98
+         %98 = OpLabel
+        %101 = OpPhi %bool %97 %91 %100 %99
+               OpSelectionMerge %102 None
+               OpBranchConditional %101 %103 %104
+        %103 = OpLabel
+               OpBranch %102
+        %104 = OpLabel
+               OpBranch %89
+        %102 = OpLabel
+        %105 = OpLoad %int %k
+        %106 = OpIAdd %int %105 %int_1
+               OpStore %k %106
+        %107 = OpLoad %int %i
+        %108 = OpIAdd %int %107 %int_1
+               OpStore %i %108
+        %109 = OpAccessChain %_ptr_Private_int %data %107
+        %110 = OpLoad %int %109
+        %111 = OpAccessChain %_ptr_Private_int %temp %105
+               OpStore %111 %110
+               OpBranch %90
+         %90 = OpLabel
+               OpBranch %88
+         %89 = OpLabel
+        %113 = OpLoad %int %from
+               OpStore %i_1 %113
+               OpBranch %114
+        %114 = OpLabel
+               OpLoopMerge %115 %116 None
+               OpBranch %117
+        %117 = OpLabel
+        %118 = OpLoad %int %i_1
+        %120 = OpLoad %int %to
+        %121 = OpSLessThanEqual %bool %118 %120
+               OpSelectionMerge %122 None
+               OpBranchConditional %121 %123 %124
+        %123 = OpLabel
+               OpBranch %122
+        %124 = OpLabel
+               OpBranch %115
+        %122 = OpLabel
+        %125 = OpLoad %int %i_1
+        %126 = OpLoad %int %i_1
+        %127 = OpAccessChain %_ptr_Private_int %temp %126
+        %128 = OpLoad %int %127
+        %129 = OpAccessChain %_ptr_Private_int %data %125
+               OpStore %129 %128
+               OpBranch %116
+        %116 = OpLabel
+        %130 = OpLoad %int %i_1
+        %131 = OpIAdd %int %130 %int_1
+               OpStore %i_1 %131
+               OpBranch %114
+        %115 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %132
+        %134 = OpLabel
+       %x_85 = OpVariable %_ptr_Function_int Function %32
+       %x_86 = OpVariable %_ptr_Function_int Function %32
+       %x_87 = OpVariable %_ptr_Function_int Function %32
+       %x_88 = OpVariable %_ptr_Function_int Function %32
+       %x_89 = OpVariable %_ptr_Function_int Function %32
+       %x_90 = OpVariable %_ptr_Function_int Function %32
+       %x_91 = OpVariable %_ptr_Function_int Function %32
+       %x_92 = OpVariable %_ptr_Function_int Function %32
+       %x_93 = OpVariable %_ptr_Function_int Function %32
+       %x_94 = OpVariable %_ptr_Function_int Function %32
+        %i_3 = OpVariable %_ptr_Function_int Function %32
+        %j_1 = OpVariable %_ptr_Function_int Function %32
+       %grey = OpVariable %_ptr_Function_float Function %149
+        %152 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_0
+        %153 = OpLoad %float %152
+        %154 = OpConvertFToS %int %153
+               OpStore %i_3 %154
+               OpBranch %155
+        %155 = OpLabel
+               OpLoopMerge %156 %157 None
+               OpBranch %158
+        %158 = OpLabel
+        %159 = OpLoad %int %i_3
+               OpSelectionMerge %160 None
+               OpSwitch %159 %161 9 %162 8 %163 7 %164 6 %165 5 %166 4 %167 3 %168 2 %169 1 %170 0 %171
+        %162 = OpLabel
+        %172 = OpLoad %int %i_3
+        %173 = OpAccessChain %_ptr_Private_int %data %172
+               OpStore %173 %int_n5
+               OpBranch %160
+        %163 = OpLabel
+        %175 = OpLoad %int %i_3
+        %176 = OpAccessChain %_ptr_Private_int %data %175
+               OpStore %176 %int_n4
+               OpBranch %160
+        %164 = OpLabel
+        %178 = OpLoad %int %i_3
+        %179 = OpAccessChain %_ptr_Private_int %data %178
+               OpStore %179 %int_n3
+               OpBranch %160
+        %165 = OpLabel
+        %181 = OpLoad %int %i_3
+        %182 = OpAccessChain %_ptr_Private_int %data %181
+               OpStore %182 %int_n2
+               OpBranch %160
+        %166 = OpLabel
+        %184 = OpLoad %int %i_3
+        %185 = OpAccessChain %_ptr_Private_int %data %184
+               OpStore %185 %int_n1
+               OpBranch %160
+        %167 = OpLabel
+        %187 = OpLoad %int %i_3
+        %188 = OpAccessChain %_ptr_Private_int %data %187
+               OpStore %188 %int_0
+               OpBranch %160
+        %168 = OpLabel
+        %190 = OpLoad %int %i_3
+        %191 = OpAccessChain %_ptr_Private_int %data %190
+               OpStore %191 %int_1
+               OpBranch %160
+        %169 = OpLabel
+        %192 = OpLoad %int %i_3
+        %193 = OpAccessChain %_ptr_Private_int %data %192
+               OpStore %193 %int_2
+               OpBranch %160
+        %170 = OpLabel
+        %195 = OpLoad %int %i_3
+        %196 = OpAccessChain %_ptr_Private_int %data %195
+               OpStore %196 %int_3
+               OpBranch %160
+        %171 = OpLabel
+        %198 = OpLoad %int %i_3
+        %199 = OpAccessChain %_ptr_Private_int %data %198
+               OpStore %199 %int_4
+               OpBranch %160
+        %161 = OpLabel
+               OpBranch %160
+        %160 = OpLabel
+        %201 = OpLoad %int %i_3
+        %202 = OpIAdd %int %201 %int_1
+               OpStore %i_3 %202
+               OpBranch %157
+        %157 = OpLabel
+        %203 = OpLoad %int %i_3
+        %204 = OpSLessThan %bool %203 %int_10
+               OpSelectionMerge %205 None
+               OpBranchConditional %204 %206 %207
+        %206 = OpLabel
+               OpBranch %205
+        %207 = OpLabel
+               OpBranch %156
+        %205 = OpLabel
+               OpBranch %155
+        %156 = OpLabel
+               OpStore %j_1 %int_0
+               OpBranch %208
+        %208 = OpLabel
+               OpLoopMerge %209 %210 None
+               OpBranch %211
+        %211 = OpLabel
+        %212 = OpLoad %int %j_1
+        %213 = OpSLessThan %bool %212 %int_10
+               OpSelectionMerge %214 None
+               OpBranchConditional %213 %215 %216
+        %215 = OpLabel
+               OpBranch %214
+        %216 = OpLabel
+               OpBranch %209
+        %214 = OpLabel
+        %217 = OpLoad %int %j_1
+        %218 = OpLoad %int %j_1
+        %219 = OpAccessChain %_ptr_Private_int %data %218
+        %220 = OpLoad %int %219
+        %221 = OpAccessChain %_ptr_Private_int %temp %217
+               OpStore %221 %220
+               OpBranch %210
+        %210 = OpLabel
+        %222 = OpLoad %int %j_1
+        %223 = OpIAdd %int %222 %int_1
+               OpStore %j_1 %223
+               OpBranch %208
+        %209 = OpLabel
+               OpStore %x_94 %int_0
+               OpStore %x_93 %int_9
+               OpStore %x_92 %int_1
+               OpBranch %225
+        %225 = OpLabel
+               OpLoopMerge %226 %227 None
+               OpBranch %228
+        %228 = OpLabel
+        %229 = OpLoad %int %x_92
+        %230 = OpLoad %int %x_93
+        %231 = OpSLessThanEqual %bool %229 %230
+               OpSelectionMerge %232 None
+               OpBranchConditional %231 %233 %234
+        %233 = OpLabel
+               OpBranch %232
+        %234 = OpLabel
+               OpBranch %226
+        %232 = OpLabel
+        %235 = OpLoad %int %x_94
+               OpStore %x_91 %235
+               OpBranch %236
+        %236 = OpLabel
+               OpLoopMerge %237 %238 None
+               OpBranch %239
+        %239 = OpLabel
+        %240 = OpLoad %int %x_91
+        %241 = OpLoad %int %x_93
+        %242 = OpSLessThan %bool %240 %241
+               OpSelectionMerge %243 None
+               OpBranchConditional %242 %244 %245
+        %244 = OpLabel
+               OpBranch %243
+        %245 = OpLabel
+               OpBranch %237
+        %243 = OpLabel
+        %246 = OpLoad %int %x_91
+               OpStore %x_90 %246
+        %247 = OpLoad %int %x_91
+        %248 = OpLoad %int %x_92
+        %249 = OpLoad %_arr_int_uint_10 %data
+               OpStore %data %250
+               OpStore %data %249
+        %251 = OpIAdd %int %247 %248
+        %252 = OpISub %int %251 %int_1
+               OpStore %x_89 %252
+        %253 = OpLoad %int %x_91
+        %254 = OpLoad %int %x_92
+        %255 = OpLoad %int %x_93
+        %258 = OpIMul %int %int_2 %254
+        %259 = OpIAdd %int %253 %258
+        %260 = OpISub %int %259 %int_1
+        %256 = OpExtInst %int %257 SMin %260 %255
+               OpStore %x_88 %256
+        %261 = OpLoad %int %x_90
+               OpStore %x_87 %261
+        %262 = OpLoad %int %x_89
+               OpStore %x_86 %262
+        %263 = OpLoad %int %x_88
+               OpStore %x_85 %263
+        %264 = OpFunctionCall %void %merge_i1_i1_i1_ %x_87 %x_86 %x_85
+               OpBranch %238
+        %238 = OpLabel
+        %268 = OpLoad %int %x_92
+        %269 = OpLoad %int %x_91
+        %270 = OpIMul %int %int_2 %268
+        %271 = OpIAdd %int %269 %270
+               OpStore %x_91 %271
+               OpBranch %236
+        %237 = OpLabel
+               OpBranch %227
+        %227 = OpLabel
+        %272 = OpLoad %int %x_92
+        %273 = OpIMul %int %int_2 %272
+               OpStore %x_92 %273
+               OpBranch %225
+        %226 = OpLabel
+        %276 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %277 = OpLoad %float %276
+        %278 = OpConvertFToS %int %277
+        %280 = OpSLessThan %bool %278 %int_30
+               OpSelectionMerge %281 None
+               OpBranchConditional %280 %282 %283
+        %282 = OpLabel
+        %284 = OpAccessChain %_ptr_Private_int %data %int_0
+        %285 = OpLoad %int %284
+        %287 = OpConvertSToF %float %285
+        %289 = OpFDiv %float %287 %float_10
+        %290 = OpFAdd %float %float_0_5 %289
+               OpStore %grey %290
+               OpBranch %281
+        %283 = OpLabel
+        %291 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %292 = OpLoad %float %291
+        %293 = OpConvertFToS %int %292
+        %295 = OpSLessThan %bool %293 %int_60
+               OpSelectionMerge %296 None
+               OpBranchConditional %295 %297 %298
+        %297 = OpLabel
+        %299 = OpAccessChain %_ptr_Private_int %data %int_1
+        %300 = OpLoad %int %299
+        %301 = OpConvertSToF %float %300
+        %302 = OpFDiv %float %301 %float_10
+        %303 = OpFAdd %float %float_0_5 %302
+               OpStore %grey %303
+               OpBranch %296
+        %298 = OpLabel
+        %304 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %305 = OpLoad %float %304
+        %306 = OpConvertFToS %int %305
+        %308 = OpSLessThan %bool %306 %int_90
+               OpSelectionMerge %309 None
+               OpBranchConditional %308 %310 %311
+        %310 = OpLabel
+        %312 = OpAccessChain %_ptr_Private_int %data %int_2
+        %313 = OpLoad %int %312
+        %314 = OpConvertSToF %float %313
+        %315 = OpFDiv %float %314 %float_10
+        %316 = OpFAdd %float %float_0_5 %315
+               OpStore %grey %316
+               OpBranch %309
+        %311 = OpLabel
+        %317 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %318 = OpLoad %float %317
+        %319 = OpConvertFToS %int %318
+        %321 = OpSLessThan %bool %319 %int_120
+               OpSelectionMerge %322 None
+               OpBranchConditional %321 %323 %324
+        %323 = OpLabel
+        %325 = OpAccessChain %_ptr_Private_int %data %int_3
+        %326 = OpLoad %int %325
+        %327 = OpConvertSToF %float %326
+        %328 = OpFDiv %float %327 %float_10
+        %329 = OpFAdd %float %float_0_5 %328
+               OpStore %grey %329
+               OpBranch %322
+        %324 = OpLabel
+        %330 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %331 = OpLoad %float %330
+        %332 = OpConvertFToS %int %331
+        %334 = OpSLessThan %bool %332 %int_150
+               OpSelectionMerge %335 None
+               OpBranchConditional %334 %336 %337
+        %336 = OpLabel
+               OpKill
+        %337 = OpLabel
+        %338 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %339 = OpLoad %float %338
+        %340 = OpConvertFToS %int %339
+        %342 = OpSLessThan %bool %340 %int_180
+               OpSelectionMerge %343 None
+               OpBranchConditional %342 %344 %345
+        %344 = OpLabel
+        %347 = OpAccessChain %_ptr_Private_int %data %int_5
+        %348 = OpLoad %int %347
+        %349 = OpConvertSToF %float %348
+        %350 = OpFDiv %float %349 %float_10
+        %351 = OpFAdd %float %float_0_5 %350
+               OpStore %grey %351
+               OpBranch %343
+        %345 = OpLabel
+        %352 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %353 = OpLoad %float %352
+        %354 = OpConvertFToS %int %353
+        %356 = OpSLessThan %bool %354 %int_210
+               OpSelectionMerge %357 None
+               OpBranchConditional %356 %358 %359
+        %358 = OpLabel
+        %361 = OpAccessChain %_ptr_Private_int %data %int_6
+        %362 = OpLoad %int %361
+        %363 = OpConvertSToF %float %362
+        %364 = OpFDiv %float %363 %float_10
+        %365 = OpFAdd %float %float_0_5 %364
+               OpStore %grey %365
+               OpBranch %357
+        %359 = OpLabel
+        %366 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %367 = OpLoad %float %366
+        %368 = OpConvertFToS %int %367
+        %370 = OpSLessThan %bool %368 %int_240
+               OpSelectionMerge %371 None
+               OpBranchConditional %370 %372 %373
+        %372 = OpLabel
+        %375 = OpAccessChain %_ptr_Private_int %data %int_7
+        %376 = OpLoad %int %375
+        %377 = OpConvertSToF %float %376
+        %378 = OpFDiv %float %377 %float_10
+        %379 = OpFAdd %float %float_0_5 %378
+               OpStore %grey %379
+               OpBranch %371
+        %373 = OpLabel
+        %380 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %381 = OpLoad %float %380
+        %382 = OpConvertFToS %int %381
+        %384 = OpSLessThan %bool %382 %int_270
+               OpSelectionMerge %385 None
+               OpBranchConditional %384 %386 %387
+        %386 = OpLabel
+        %389 = OpAccessChain %_ptr_Private_int %data %int_8
+        %390 = OpLoad %int %389
+        %391 = OpConvertSToF %float %390
+        %392 = OpFDiv %float %391 %float_10
+        %393 = OpFAdd %float %float_0_5 %392
+               OpStore %grey %393
+               OpBranch %385
+        %387 = OpLabel
+               OpKill
+        %385 = OpLabel
+               OpBranch %371
+        %371 = OpLabel
+               OpBranch %357
+        %357 = OpLabel
+               OpBranch %343
+        %343 = OpLabel
+               OpBranch %335
+        %335 = OpLabel
+               OpBranch %322
+        %322 = OpLabel
+               OpBranch %309
+        %309 = OpLabel
+               OpBranch %296
+        %296 = OpLabel
+               OpBranch %281
+        %281 = OpLabel
+        %394 = OpLoad %float %grey
+        %396 = OpCompositeConstruct %v3float %394 %394 %394
+        %397 = OpCompositeExtract %float %396 0
+        %398 = OpCompositeExtract %float %396 1
+        %399 = OpCompositeExtract %float %396 2
+        %401 = OpCompositeConstruct %v4float %397 %398 %399 %float_1
+               OpStore %x_GLF_color %401
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %402
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %406 = OpLabel
+        %407 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %407
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %132
+        %409 = OpLabel
+        %410 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %410
+        %411 = OpFunctionCall %void %main_1
+        %413 = OpLoad %v4float %x_GLF_color
+        %414 = OpCompositeConstruct %main_out %413
+        %412 = OpFunctionCall %void %tint_symbol_3 %414
+               OpReturn
+               OpFunctionEnd
+ %mergeSort_ = OpFunction %void None %132
+        %416 = OpLabel
+        %low = OpVariable %_ptr_Function_int Function %32
+       %high = OpVariable %_ptr_Function_int Function %32
+          %m = OpVariable %_ptr_Function_int Function %32
+        %i_2 = OpVariable %_ptr_Function_int Function %32
+     %from_1 = OpVariable %_ptr_Function_int Function %32
+      %mid_1 = OpVariable %_ptr_Function_int Function %32
+       %to_1 = OpVariable %_ptr_Function_int Function %32
+      %param = OpVariable %_ptr_Function_int Function %32
+    %param_1 = OpVariable %_ptr_Function_int Function %32
+    %param_2 = OpVariable %_ptr_Function_int Function %32
+               OpStore %low %int_0
+               OpStore %high %int_9
+               OpStore %m %int_1
+               OpBranch %427
+        %427 = OpLabel
+               OpLoopMerge %428 %429 None
+               OpBranch %430
+        %430 = OpLabel
+        %431 = OpLoad %int %m
+        %432 = OpLoad %int %high
+        %433 = OpSLessThanEqual %bool %431 %432
+               OpSelectionMerge %434 None
+               OpBranchConditional %433 %435 %436
+        %435 = OpLabel
+               OpBranch %434
+        %436 = OpLabel
+               OpBranch %428
+        %434 = OpLabel
+        %437 = OpLoad %int %low
+               OpStore %i_2 %437
+               OpBranch %438
+        %438 = OpLabel
+               OpLoopMerge %439 %440 None
+               OpBranch %441
+        %441 = OpLabel
+        %442 = OpLoad %int %i_2
+        %443 = OpLoad %int %high
+        %444 = OpSLessThan %bool %442 %443
+               OpSelectionMerge %445 None
+               OpBranchConditional %444 %446 %447
+        %446 = OpLabel
+               OpBranch %445
+        %447 = OpLabel
+               OpBranch %439
+        %445 = OpLabel
+        %448 = OpLoad %int %i_2
+               OpStore %from_1 %448
+        %449 = OpLoad %int %i_2
+        %450 = OpLoad %int %m
+        %451 = OpIAdd %int %449 %450
+        %452 = OpISub %int %451 %int_1
+               OpStore %mid_1 %452
+        %453 = OpLoad %int %i_2
+        %454 = OpLoad %int %m
+        %455 = OpLoad %int %high
+        %457 = OpIMul %int %int_2 %454
+        %458 = OpIAdd %int %453 %457
+        %459 = OpISub %int %458 %int_1
+        %456 = OpExtInst %int %257 SMin %459 %455
+               OpStore %to_1 %456
+        %460 = OpLoad %int %from_1
+               OpStore %param %460
+        %461 = OpLoad %int %mid_1
+               OpStore %param_1 %461
+        %462 = OpLoad %int %to_1
+               OpStore %param_2 %462
+        %463 = OpFunctionCall %void %merge_i1_i1_i1_ %param %param_1 %param_2
+               OpBranch %440
+        %440 = OpLabel
+        %467 = OpLoad %int %m
+        %468 = OpLoad %int %i_2
+        %469 = OpIMul %int %int_2 %467
+        %470 = OpIAdd %int %468 %469
+               OpStore %i_2 %470
+               OpBranch %438
+        %439 = OpLabel
+               OpBranch %429
+        %429 = OpLabel
+        %471 = OpLoad %int %m
+        %472 = OpIMul %int %int_2 %471
+               OpStore %m %472
+               OpBranch %427
+        %428 = OpLabel
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 157[%157] is not post dominated by the back-edge block 205[%205]
+  %205 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..bf16229
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/1.wgsl.expected.wgsl
@@ -0,0 +1,366 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> data : array<i32, 10>;
+
+var<private> temp : array<i32, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn merge_i1_i1_i1_(from : ptr<function, i32>, mid : ptr<function, i32>, to : ptr<function, i32>) {
+  var k : i32;
+  var i : i32;
+  var j : i32;
+  var i_1 : i32;
+  let x_303 : i32 = *(from);
+  k = x_303;
+  let x_304 : i32 = *(from);
+  i = x_304;
+  let x_305 : i32 = *(mid);
+  j = (x_305 + 1);
+  loop {
+    let x_311 : i32 = i;
+    let x_312 : i32 = *(mid);
+    let x_314 : i32 = j;
+    let x_315 : i32 = *(to);
+    if (((x_311 <= x_312) && (x_314 <= x_315))) {
+    } else {
+      break;
+    }
+    let x_319 : i32 = i;
+    let x_321 : i32 = data[x_319];
+    let x_322 : i32 = j;
+    let x_324 : i32 = data[x_322];
+    if ((x_321 < x_324)) {
+      let x_329 : i32 = k;
+      k = (x_329 + 1);
+      let x_331 : i32 = i;
+      i = (x_331 + 1);
+      let x_334 : i32 = data[x_331];
+      temp[x_329] = x_334;
+    } else {
+      let x_336 : i32 = k;
+      k = (x_336 + 1);
+      let x_338 : i32 = j;
+      j = (x_338 + 1);
+      let x_341 : i32 = data[x_338];
+      temp[x_336] = x_341;
+    }
+  }
+  loop {
+    let x_347 : i32 = i;
+    let x_349 : i32 = i;
+    let x_350 : i32 = *(mid);
+    if (((x_347 < 10) && (x_349 <= x_350))) {
+    } else {
+      break;
+    }
+    let x_354 : i32 = k;
+    k = (x_354 + 1);
+    let x_356 : i32 = i;
+    i = (x_356 + 1);
+    let x_359 : i32 = data[x_356];
+    temp[x_354] = x_359;
+  }
+  let x_361 : i32 = *(from);
+  i_1 = x_361;
+  loop {
+    let x_366 : i32 = i_1;
+    let x_367 : i32 = *(to);
+    if ((x_366 <= x_367)) {
+    } else {
+      break;
+    }
+    let x_370 : i32 = i_1;
+    let x_371 : i32 = i_1;
+    let x_373 : i32 = temp[x_371];
+    data[x_370] = x_373;
+
+    continuing {
+      let x_375 : i32 = i_1;
+      i_1 = (x_375 + 1);
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var x_85 : i32;
+  var x_86 : i32;
+  var x_87 : i32;
+  var x_88 : i32;
+  var x_89 : i32;
+  var x_90 : i32;
+  var x_91 : i32;
+  var x_92 : i32;
+  var x_93 : i32;
+  var x_94 : i32;
+  var i_3 : i32;
+  var j_1 : i32;
+  var grey : f32;
+  let x_96 : f32 = x_28.injectionSwitch.x;
+  i_3 = i32(x_96);
+  loop {
+    let x_102 : i32 = i_3;
+    switch(x_102) {
+      case 9: {
+        let x_132 : i32 = i_3;
+        data[x_132] = -5;
+      }
+      case 8: {
+        let x_130 : i32 = i_3;
+        data[x_130] = -4;
+      }
+      case 7: {
+        let x_128 : i32 = i_3;
+        data[x_128] = -3;
+      }
+      case 6: {
+        let x_126 : i32 = i_3;
+        data[x_126] = -2;
+      }
+      case 5: {
+        let x_124 : i32 = i_3;
+        data[x_124] = -1;
+      }
+      case 4: {
+        let x_122 : i32 = i_3;
+        data[x_122] = 0;
+      }
+      case 3: {
+        let x_120 : i32 = i_3;
+        data[x_120] = 1;
+      }
+      case 2: {
+        let x_118 : i32 = i_3;
+        data[x_118] = 2;
+      }
+      case 1: {
+        let x_116 : i32 = i_3;
+        data[x_116] = 3;
+      }
+      case 0: {
+        let x_114 : i32 = i_3;
+        data[x_114] = 4;
+      }
+      default: {
+      }
+    }
+    let x_134 : i32 = i_3;
+    i_3 = (x_134 + 1);
+
+    continuing {
+      let x_136 : i32 = i_3;
+      if ((x_136 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  loop {
+    let x_142 : i32 = j_1;
+    if ((x_142 < 10)) {
+    } else {
+      break;
+    }
+    let x_145 : i32 = j_1;
+    let x_146 : i32 = j_1;
+    let x_148 : i32 = data[x_146];
+    temp[x_145] = x_148;
+
+    continuing {
+      let x_150 : i32 = j_1;
+      j_1 = (x_150 + 1);
+    }
+  }
+  x_94 = 0;
+  x_93 = 9;
+  x_92 = 1;
+  loop {
+    let x_156 : i32 = x_92;
+    let x_157 : i32 = x_93;
+    if ((x_156 <= x_157)) {
+    } else {
+      break;
+    }
+    let x_160 : i32 = x_94;
+    x_91 = x_160;
+    loop {
+      let x_165 : i32 = x_91;
+      let x_166 : i32 = x_93;
+      if ((x_165 < x_166)) {
+      } else {
+        break;
+      }
+      let x_169 : i32 = x_91;
+      x_90 = x_169;
+      let x_170 : i32 = x_91;
+      let x_171 : i32 = x_92;
+      let x_173 : array<i32, 10> = data;
+      data = array<i32, 10>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+      data = x_173;
+      x_89 = ((x_170 + x_171) - 1);
+      let x_175 : i32 = x_91;
+      let x_176 : i32 = x_92;
+      let x_180 : i32 = x_93;
+      x_88 = min(((x_175 + (2 * x_176)) - 1), x_180);
+      let x_182 : i32 = x_90;
+      x_87 = x_182;
+      let x_183 : i32 = x_89;
+      x_86 = x_183;
+      let x_184 : i32 = x_88;
+      x_85 = x_184;
+      merge_i1_i1_i1_(&(x_87), &(x_86), &(x_85));
+
+      continuing {
+        let x_186 : i32 = x_92;
+        let x_188 : i32 = x_91;
+        x_91 = (x_188 + (2 * x_186));
+      }
+    }
+
+    continuing {
+      let x_190 : i32 = x_92;
+      x_92 = (2 * x_190);
+    }
+  }
+  let x_194 : f32 = gl_FragCoord.y;
+  if ((i32(x_194) < 30)) {
+    let x_201 : i32 = data[0];
+    grey = (0.5 + (f32(x_201) / 10.0));
+  } else {
+    let x_206 : f32 = gl_FragCoord.y;
+    if ((i32(x_206) < 60)) {
+      let x_213 : i32 = data[1];
+      grey = (0.5 + (f32(x_213) / 10.0));
+    } else {
+      let x_218 : f32 = gl_FragCoord.y;
+      if ((i32(x_218) < 90)) {
+        let x_225 : i32 = data[2];
+        grey = (0.5 + (f32(x_225) / 10.0));
+      } else {
+        let x_230 : f32 = gl_FragCoord.y;
+        if ((i32(x_230) < 120)) {
+          let x_237 : i32 = data[3];
+          grey = (0.5 + (f32(x_237) / 10.0));
+        } else {
+          let x_242 : f32 = gl_FragCoord.y;
+          if ((i32(x_242) < 150)) {
+            discard;
+          } else {
+            let x_249 : f32 = gl_FragCoord.y;
+            if ((i32(x_249) < 180)) {
+              let x_256 : i32 = data[5];
+              grey = (0.5 + (f32(x_256) / 10.0));
+            } else {
+              let x_261 : f32 = gl_FragCoord.y;
+              if ((i32(x_261) < 210)) {
+                let x_268 : i32 = data[6];
+                grey = (0.5 + (f32(x_268) / 10.0));
+              } else {
+                let x_273 : f32 = gl_FragCoord.y;
+                if ((i32(x_273) < 240)) {
+                  let x_280 : i32 = data[7];
+                  grey = (0.5 + (f32(x_280) / 10.0));
+                } else {
+                  let x_285 : f32 = gl_FragCoord.y;
+                  if ((i32(x_285) < 270)) {
+                    let x_292 : i32 = data[8];
+                    grey = (0.5 + (f32(x_292) / 10.0));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  let x_296 : f32 = grey;
+  let x_297 : vec3<f32> = vec3<f32>(x_296, x_296, x_296);
+  x_GLF_color = vec4<f32>(x_297.x, x_297.y, x_297.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+fn mergeSort_() {
+  var low : i32;
+  var high : i32;
+  var m : i32;
+  var i_2 : i32;
+  var from_1 : i32;
+  var mid_1 : i32;
+  var to_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  low = 0;
+  high = 9;
+  m = 1;
+  loop {
+    let x_382 : i32 = m;
+    let x_383 : i32 = high;
+    if ((x_382 <= x_383)) {
+    } else {
+      break;
+    }
+    let x_386 : i32 = low;
+    i_2 = x_386;
+    loop {
+      let x_391 : i32 = i_2;
+      let x_392 : i32 = high;
+      if ((x_391 < x_392)) {
+      } else {
+        break;
+      }
+      let x_395 : i32 = i_2;
+      from_1 = x_395;
+      let x_396 : i32 = i_2;
+      let x_397 : i32 = m;
+      mid_1 = ((x_396 + x_397) - 1);
+      let x_400 : i32 = i_2;
+      let x_401 : i32 = m;
+      let x_405 : i32 = high;
+      to_1 = min(((x_400 + (2 * x_401)) - 1), x_405);
+      let x_407 : i32 = from_1;
+      param = x_407;
+      let x_408 : i32 = mid_1;
+      param_1 = x_408;
+      let x_409 : i32 = to_1;
+      param_2 = x_409;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2));
+
+      continuing {
+        let x_411 : i32 = m;
+        let x_413 : i32 = i_2;
+        i_2 = (x_413 + (2 * x_411));
+      }
+    }
+
+    continuing {
+      let x_415 : i32 = m;
+      m = (2 * x_415);
+    }
+  }
+  return;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/2.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/2.spvasm
new file mode 100644
index 0000000..c45e451
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/2.spvasm
@@ -0,0 +1,631 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %merge_i1_i1_i1_ "merge(i1;i1;i1;"
+               OpName %from "from"
+               OpName %mid "mid"
+               OpName %to "to"
+               OpName %mergeSort_ "mergeSort("
+               OpName %k "k"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %data "data"
+               OpName %temp "temp"
+               OpName %i_0 "i"
+               OpName %low "low"
+               OpName %high "high"
+               OpName %m "m"
+               OpName %i_1 "i"
+               OpName %from_0 "from"
+               OpName %mid_0 "mid"
+               OpName %to_0 "to"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %param_1 "param"
+               OpName %i_2 "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %j_0 "j"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %grey "grey"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %32 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %35 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int %_ptr_Function_int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Private__arr_int_uint_10 = OpTypePointer Private %_arr_int_uint_10
+       %data = OpVariable %_ptr_Private__arr_int_uint_10 Private
+%_ptr_Private_int = OpTypePointer Private %int
+       %temp = OpVariable %_ptr_Private__arr_int_uint_10 Private
+     %int_10 = OpConstant %int 10
+      %int_0 = OpConstant %int 0
+      %int_9 = OpConstant %int 9
+      %int_2 = OpConstant %int 2
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_4 = OpConstant %int 4
+      %int_3 = OpConstant %int 3
+     %int_n1 = OpConstant %int -1
+     %int_n2 = OpConstant %int -2
+     %int_n3 = OpConstant %int -3
+     %int_n4 = OpConstant %int -4
+     %int_n5 = OpConstant %int -5
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+     %int_30 = OpConstant %int 30
+%_ptr_Function_float = OpTypePointer Function %float
+  %float_0_5 = OpConstant %float 0.5
+   %float_10 = OpConstant %float 10
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %v3float = OpTypeVector %float 3
+    %float_1 = OpConstant %float 1
+    %int_0_0 = OpConstant %int 0
+         %83 = OpConstantComposite %_arr_int_uint_10 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0
+       %main = OpFunction %void None %32
+         %84 = OpLabel
+         %85 = OpVariable %_ptr_Function_int Function
+         %86 = OpVariable %_ptr_Function_int Function
+         %87 = OpVariable %_ptr_Function_int Function
+         %88 = OpVariable %_ptr_Function_int Function
+         %89 = OpVariable %_ptr_Function_int Function
+         %90 = OpVariable %_ptr_Function_int Function
+         %91 = OpVariable %_ptr_Function_int Function
+         %92 = OpVariable %_ptr_Function_int Function
+         %93 = OpVariable %_ptr_Function_int Function
+         %94 = OpVariable %_ptr_Function_int Function
+        %i_2 = OpVariable %_ptr_Function_int Function
+        %j_0 = OpVariable %_ptr_Function_int Function
+       %grey = OpVariable %_ptr_Function_float Function
+         %95 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %96 = OpLoad %float %95
+         %97 = OpConvertFToS %int %96
+               OpStore %i_2 %97
+               OpBranch %98
+         %98 = OpLabel
+               OpLoopMerge %99 %100 None
+               OpBranch %101
+        %101 = OpLabel
+        %102 = OpLoad %int %i_2
+               OpSelectionMerge %103 None
+               OpSwitch %102 %103 0 %104 1 %105 2 %106 3 %107 4 %108 5 %109 6 %110 7 %111 8 %112 9 %113
+        %104 = OpLabel
+        %114 = OpLoad %int %i_2
+        %115 = OpAccessChain %_ptr_Private_int %data %114
+               OpStore %115 %int_4
+               OpBranch %103
+        %105 = OpLabel
+        %116 = OpLoad %int %i_2
+        %117 = OpAccessChain %_ptr_Private_int %data %116
+               OpStore %117 %int_3
+               OpBranch %103
+        %106 = OpLabel
+        %118 = OpLoad %int %i_2
+        %119 = OpAccessChain %_ptr_Private_int %data %118
+               OpStore %119 %int_2
+               OpBranch %103
+        %107 = OpLabel
+        %120 = OpLoad %int %i_2
+        %121 = OpAccessChain %_ptr_Private_int %data %120
+               OpStore %121 %int_1
+               OpBranch %103
+        %108 = OpLabel
+        %122 = OpLoad %int %i_2
+        %123 = OpAccessChain %_ptr_Private_int %data %122
+               OpStore %123 %int_0
+               OpBranch %103
+        %109 = OpLabel
+        %124 = OpLoad %int %i_2
+        %125 = OpAccessChain %_ptr_Private_int %data %124
+               OpStore %125 %int_n1
+               OpBranch %103
+        %110 = OpLabel
+        %126 = OpLoad %int %i_2
+        %127 = OpAccessChain %_ptr_Private_int %data %126
+               OpStore %127 %int_n2
+               OpBranch %103
+        %111 = OpLabel
+        %128 = OpLoad %int %i_2
+        %129 = OpAccessChain %_ptr_Private_int %data %128
+               OpStore %129 %int_n3
+               OpBranch %103
+        %112 = OpLabel
+        %130 = OpLoad %int %i_2
+        %131 = OpAccessChain %_ptr_Private_int %data %130
+               OpStore %131 %int_n4
+               OpBranch %103
+        %113 = OpLabel
+        %132 = OpLoad %int %i_2
+        %133 = OpAccessChain %_ptr_Private_int %data %132
+               OpStore %133 %int_n5
+               OpBranch %103
+        %103 = OpLabel
+        %134 = OpLoad %int %i_2
+        %135 = OpIAdd %int %134 %int_1
+               OpStore %i_2 %135
+               OpBranch %100
+        %100 = OpLabel
+        %136 = OpLoad %int %i_2
+        %137 = OpSLessThan %bool %136 %int_10
+               OpBranchConditional %137 %98 %99
+         %99 = OpLabel
+               OpStore %j_0 %int_0
+               OpBranch %138
+        %138 = OpLabel
+               OpLoopMerge %139 %140 None
+               OpBranch %141
+        %141 = OpLabel
+        %142 = OpLoad %int %j_0
+        %143 = OpSLessThan %bool %142 %int_10
+               OpBranchConditional %143 %144 %139
+        %144 = OpLabel
+        %145 = OpLoad %int %j_0
+        %146 = OpLoad %int %j_0
+        %147 = OpAccessChain %_ptr_Private_int %data %146
+        %148 = OpLoad %int %147
+        %149 = OpAccessChain %_ptr_Private_int %temp %145
+               OpStore %149 %148
+               OpBranch %140
+        %140 = OpLabel
+        %150 = OpLoad %int %j_0
+        %151 = OpIAdd %int %150 %int_1
+               OpStore %j_0 %151
+               OpBranch %138
+        %139 = OpLabel
+               OpStore %94 %int_0
+               OpStore %93 %int_9
+               OpStore %92 %int_1
+               OpBranch %152
+        %152 = OpLabel
+               OpLoopMerge %153 %154 None
+               OpBranch %155
+        %155 = OpLabel
+        %156 = OpLoad %int %92
+        %157 = OpLoad %int %93
+        %158 = OpSLessThanEqual %bool %156 %157
+               OpBranchConditional %158 %159 %153
+        %159 = OpLabel
+        %160 = OpLoad %int %94
+               OpStore %91 %160
+               OpBranch %161
+        %161 = OpLabel
+               OpLoopMerge %162 %163 None
+               OpBranch %164
+        %164 = OpLabel
+        %165 = OpLoad %int %91
+        %166 = OpLoad %int %93
+        %167 = OpSLessThan %bool %165 %166
+               OpBranchConditional %167 %168 %162
+        %168 = OpLabel
+        %169 = OpLoad %int %91
+               OpStore %90 %169
+        %170 = OpLoad %int %91
+        %171 = OpLoad %int %92
+        %172 = OpIAdd %int %170 %171
+        %173 = OpISub %int %172 %int_1
+               OpStore %89 %173
+        %174 = OpLoad %int %91
+        %175 = OpLoad %int %92
+        %176 = OpIMul %int %int_2 %175
+        %177 = OpIAdd %int %174 %176
+        %178 = OpISub %int %177 %int_1
+        %179 = OpLoad %int %93
+        %180 = OpExtInst %int %1 SMin %178 %179
+               OpStore %88 %180
+        %181 = OpLoad %int %90
+               OpStore %87 %181
+        %182 = OpLoad %int %89
+               OpStore %86 %182
+        %183 = OpLoad %int %88
+               OpStore %85 %183
+        %184 = OpFunctionCall %void %merge_i1_i1_i1_ %87 %86 %85
+               OpBranch %163
+        %163 = OpLabel
+        %185 = OpLoad %int %92
+        %186 = OpIMul %int %int_2 %185
+        %187 = OpLoad %int %91
+        %188 = OpIAdd %int %187 %186
+               OpStore %91 %188
+               OpBranch %161
+        %162 = OpLabel
+               OpBranch %154
+        %154 = OpLabel
+        %189 = OpLoad %int %92
+        %190 = OpIMul %int %int_2 %189
+               OpStore %92 %190
+               OpBranch %152
+        %153 = OpLabel
+               OpBranch %191
+        %191 = OpLabel
+        %192 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %193 = OpLoad %float %192
+        %194 = OpConvertFToS %int %193
+        %195 = OpSLessThan %bool %194 %int_30
+               OpSelectionMerge %196 None
+               OpBranchConditional %195 %197 %198
+        %197 = OpLabel
+        %199 = OpAccessChain %_ptr_Private_int %data %int_0
+        %200 = OpLoad %int %199
+        %201 = OpConvertSToF %float %200
+        %202 = OpFDiv %float %201 %float_10
+        %203 = OpFAdd %float %float_0_5 %202
+               OpStore %grey %203
+               OpBranch %196
+        %198 = OpLabel
+        %204 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %205 = OpLoad %float %204
+        %206 = OpConvertFToS %int %205
+        %207 = OpSLessThan %bool %206 %int_60
+               OpSelectionMerge %208 None
+               OpBranchConditional %207 %209 %210
+        %209 = OpLabel
+        %211 = OpAccessChain %_ptr_Private_int %data %int_1
+        %212 = OpLoad %int %211
+        %213 = OpConvertSToF %float %212
+        %214 = OpFDiv %float %213 %float_10
+        %215 = OpFAdd %float %float_0_5 %214
+               OpStore %grey %215
+               OpBranch %208
+        %210 = OpLabel
+        %216 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %217 = OpLoad %float %216
+        %218 = OpConvertFToS %int %217
+        %219 = OpSLessThan %bool %218 %int_90
+               OpSelectionMerge %220 None
+               OpBranchConditional %219 %221 %222
+        %221 = OpLabel
+        %223 = OpAccessChain %_ptr_Private_int %data %int_2
+        %224 = OpLoad %int %223
+        %225 = OpConvertSToF %float %224
+        %226 = OpFDiv %float %225 %float_10
+        %227 = OpFAdd %float %float_0_5 %226
+               OpStore %grey %227
+               OpBranch %220
+        %222 = OpLabel
+        %228 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %229 = OpLoad %float %228
+        %230 = OpConvertFToS %int %229
+        %231 = OpSLessThan %bool %230 %int_120
+               OpSelectionMerge %232 None
+               OpBranchConditional %231 %233 %234
+        %233 = OpLabel
+        %235 = OpAccessChain %_ptr_Private_int %data %int_3
+        %236 = OpLoad %int %235
+        %237 = OpConvertSToF %float %236
+        %238 = OpFDiv %float %237 %float_10
+        %239 = OpFAdd %float %float_0_5 %238
+               OpStore %grey %239
+               OpBranch %232
+        %234 = OpLabel
+        %240 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %241 = OpLoad %float %240
+        %242 = OpConvertFToS %int %241
+        %243 = OpSLessThan %bool %242 %int_150
+               OpSelectionMerge %244 None
+               OpBranchConditional %243 %245 %246
+        %245 = OpLabel
+               OpKill
+        %246 = OpLabel
+        %247 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %248 = OpLoad %float %247
+        %249 = OpConvertFToS %int %248
+        %250 = OpSLessThan %bool %249 %int_180
+               OpSelectionMerge %251 None
+               OpBranchConditional %250 %252 %253
+        %252 = OpLabel
+        %254 = OpAccessChain %_ptr_Private_int %data %int_5
+        %255 = OpLoad %int %254
+        %256 = OpConvertSToF %float %255
+        %257 = OpFDiv %float %256 %float_10
+        %258 = OpFAdd %float %float_0_5 %257
+               OpStore %grey %258
+               OpBranch %251
+        %253 = OpLabel
+        %259 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %260 = OpLoad %float %259
+        %261 = OpConvertFToS %int %260
+        %262 = OpSLessThan %bool %261 %int_210
+               OpSelectionMerge %263 None
+               OpBranchConditional %262 %264 %265
+        %264 = OpLabel
+        %266 = OpAccessChain %_ptr_Private_int %data %int_6
+        %267 = OpLoad %int %266
+        %268 = OpConvertSToF %float %267
+        %269 = OpFDiv %float %268 %float_10
+        %270 = OpFAdd %float %float_0_5 %269
+               OpStore %grey %270
+               OpBranch %263
+        %265 = OpLabel
+        %271 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %272 = OpLoad %float %271
+        %273 = OpConvertFToS %int %272
+        %274 = OpSLessThan %bool %273 %int_240
+               OpSelectionMerge %275 None
+               OpBranchConditional %274 %276 %277
+        %276 = OpLabel
+        %278 = OpAccessChain %_ptr_Private_int %data %int_7
+        %279 = OpLoad %int %278
+        %280 = OpConvertSToF %float %279
+        %281 = OpFDiv %float %280 %float_10
+        %282 = OpFAdd %float %float_0_5 %281
+               OpStore %grey %282
+               OpBranch %275
+        %277 = OpLabel
+        %283 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %284 = OpLoad %float %283
+        %285 = OpConvertFToS %int %284
+        %286 = OpSLessThan %bool %285 %int_270
+               OpSelectionMerge %287 None
+               OpBranchConditional %286 %288 %289
+        %288 = OpLabel
+        %290 = OpAccessChain %_ptr_Private_int %data %int_8
+        %291 = OpLoad %int %290
+        %292 = OpConvertSToF %float %291
+        %293 = OpFDiv %float %292 %float_10
+        %294 = OpFAdd %float %float_0_5 %293
+               OpStore %grey %294
+               OpBranch %287
+        %289 = OpLabel
+               OpKill
+        %287 = OpLabel
+               OpBranch %275
+        %275 = OpLabel
+               OpBranch %263
+        %263 = OpLabel
+               OpBranch %251
+        %251 = OpLabel
+               OpBranch %244
+        %244 = OpLabel
+               OpBranch %232
+        %232 = OpLabel
+               OpBranch %220
+        %220 = OpLabel
+               OpBranch %208
+        %208 = OpLabel
+               OpBranch %196
+        %196 = OpLabel
+        %295 = OpLoad %float %grey
+        %296 = OpCompositeConstruct %v3float %295 %295 %295
+        %297 = OpCompositeExtract %float %296 0
+        %298 = OpCompositeExtract %float %296 1
+        %299 = OpCompositeExtract %float %296 2
+        %300 = OpCompositeConstruct %v4float %297 %298 %299 %float_1
+               OpStore %_GLF_color %300
+               OpReturn
+               OpFunctionEnd
+%merge_i1_i1_i1_ = OpFunction %void None %35
+       %from = OpFunctionParameter %_ptr_Function_int
+        %mid = OpFunctionParameter %_ptr_Function_int
+         %to = OpFunctionParameter %_ptr_Function_int
+        %301 = OpLabel
+          %k = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+          %j = OpVariable %_ptr_Function_int Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+        %302 = OpLoad %int %from
+               OpStore %k %302
+        %303 = OpLoad %int %from
+               OpStore %i %303
+        %304 = OpLoad %int %mid
+        %305 = OpIAdd %int %304 %int_1
+               OpStore %j %305
+               OpBranch %306
+        %306 = OpLabel
+               OpLoopMerge %307 %308 None
+               OpBranch %309
+        %309 = OpLabel
+        %310 = OpLoad %int %i
+        %311 = OpLoad %int %mid
+        %312 = OpSLessThanEqual %bool %310 %311
+        %313 = OpLoad %int %j
+        %314 = OpLoad %int %to
+        %315 = OpSLessThanEqual %bool %313 %314
+        %316 = OpLogicalAnd %bool %312 %315
+               OpBranchConditional %316 %317 %307
+        %317 = OpLabel
+        %318 = OpLoad %int %i
+        %319 = OpAccessChain %_ptr_Private_int %data %318
+        %320 = OpLoad %int %319
+        %321 = OpLoad %int %j
+        %322 = OpAccessChain %_ptr_Private_int %data %321
+        %323 = OpLoad %int %322
+        %324 = OpSLessThan %bool %320 %323
+               OpSelectionMerge %325 None
+               OpBranchConditional %324 %326 %327
+        %326 = OpLabel
+        %328 = OpLoad %int %k
+        %329 = OpIAdd %int %328 %int_1
+               OpStore %k %329
+        %330 = OpLoad %int %i
+        %331 = OpIAdd %int %330 %int_1
+               OpStore %i %331
+        %332 = OpAccessChain %_ptr_Private_int %data %330
+        %333 = OpLoad %int %332
+        %334 = OpAccessChain %_ptr_Private_int %temp %328
+               OpStore %334 %333
+               OpBranch %325
+        %327 = OpLabel
+        %335 = OpLoad %int %k
+        %336 = OpIAdd %int %335 %int_1
+               OpStore %k %336
+        %337 = OpLoad %int %j
+        %338 = OpIAdd %int %337 %int_1
+               OpStore %j %338
+        %339 = OpAccessChain %_ptr_Private_int %data %337
+        %340 = OpLoad %int %339
+        %341 = OpAccessChain %_ptr_Private_int %temp %335
+               OpStore %341 %340
+               OpBranch %325
+        %325 = OpLabel
+               OpBranch %308
+        %308 = OpLabel
+               OpBranch %306
+        %307 = OpLabel
+               OpBranch %342
+        %342 = OpLabel
+               OpLoopMerge %343 %344 None
+               OpBranch %345
+        %345 = OpLabel
+        %346 = OpLoad %int %i
+        %347 = OpSLessThan %bool %346 %int_10
+        %348 = OpLoad %int %i
+        %349 = OpLoad %int %mid
+        %350 = OpSLessThanEqual %bool %348 %349
+        %351 = OpLogicalAnd %bool %347 %350
+               OpBranchConditional %351 %352 %343
+        %352 = OpLabel
+        %353 = OpLoad %int %k
+        %354 = OpIAdd %int %353 %int_1
+               OpStore %k %354
+        %355 = OpLoad %int %i
+        %356 = OpIAdd %int %355 %int_1
+               OpStore %i %356
+        %357 = OpAccessChain %_ptr_Private_int %data %355
+        %358 = OpLoad %int %357
+        %359 = OpAccessChain %_ptr_Private_int %temp %353
+               OpStore %359 %358
+               OpBranch %344
+        %344 = OpLabel
+               OpBranch %342
+        %343 = OpLabel
+        %360 = OpLoad %int %from
+               OpStore %i_0 %360
+               OpBranch %361
+        %361 = OpLabel
+               OpLoopMerge %362 %363 None
+               OpBranch %364
+        %364 = OpLabel
+        %365 = OpLoad %int %i_0
+        %366 = OpLoad %int %to
+        %367 = OpSLessThanEqual %bool %365 %366
+               OpBranchConditional %367 %368 %362
+        %368 = OpLabel
+        %369 = OpLoad %int %i_0
+        %370 = OpLoad %int %i_0
+        %371 = OpAccessChain %_ptr_Private_int %temp %370
+        %372 = OpLoad %int %371
+        %373 = OpAccessChain %_ptr_Private_int %data %369
+               OpStore %373 %372
+               OpBranch %363
+        %363 = OpLabel
+        %374 = OpLoad %int %i_0
+        %375 = OpIAdd %int %374 %int_1
+               OpStore %i_0 %375
+               OpBranch %361
+        %362 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %mergeSort_ = OpFunction %void None %32
+        %376 = OpLabel
+        %low = OpVariable %_ptr_Function_int Function
+       %high = OpVariable %_ptr_Function_int Function
+          %m = OpVariable %_ptr_Function_int Function
+        %i_1 = OpVariable %_ptr_Function_int Function
+     %from_0 = OpVariable %_ptr_Function_int Function
+      %mid_0 = OpVariable %_ptr_Function_int Function
+       %to_0 = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_int Function
+    %param_0 = OpVariable %_ptr_Function_int Function
+    %param_1 = OpVariable %_ptr_Function_int Function
+               OpStore %low %int_0
+               OpStore %high %int_9
+               OpStore %m %int_1
+               OpBranch %377
+        %377 = OpLabel
+               OpLoopMerge %378 %379 None
+               OpBranch %380
+        %380 = OpLabel
+        %381 = OpLoad %int %m
+        %382 = OpLoad %int %high
+        %383 = OpSLessThanEqual %bool %381 %382
+               OpBranchConditional %383 %384 %378
+        %384 = OpLabel
+        %385 = OpLoad %int %low
+               OpStore %i_1 %385
+               OpBranch %386
+        %386 = OpLabel
+               OpLoopMerge %387 %388 None
+               OpBranch %389
+        %389 = OpLabel
+        %390 = OpLoad %int %i_1
+        %391 = OpLoad %int %high
+        %392 = OpSLessThan %bool %390 %391
+               OpBranchConditional %392 %393 %387
+        %393 = OpLabel
+        %394 = OpLoad %int %i_1
+               OpStore %from_0 %394
+        %395 = OpLoad %int %i_1
+        %396 = OpLoad %int %m
+        %397 = OpIAdd %int %395 %396
+        %398 = OpISub %int %397 %int_1
+               OpStore %mid_0 %398
+        %399 = OpLoad %int %i_1
+        %400 = OpLoad %int %m
+        %401 = OpIMul %int %int_2 %400
+        %402 = OpIAdd %int %399 %401
+        %403 = OpISub %int %402 %int_1
+        %404 = OpLoad %int %high
+        %405 = OpExtInst %int %1 SMin %403 %404
+               OpStore %to_0 %405
+        %406 = OpLoad %int %from_0
+               OpStore %param %406
+        %407 = OpLoad %int %mid_0
+               OpStore %param_0 %407
+        %408 = OpLoad %int %to_0
+               OpStore %param_1 %408
+        %409 = OpFunctionCall %void %merge_i1_i1_i1_ %param %param_0 %param_1
+               OpBranch %388
+        %388 = OpLabel
+        %410 = OpLoad %int %m
+        %411 = OpIMul %int %int_2 %410
+        %412 = OpLoad %int %i_1
+        %413 = OpIAdd %int %412 %411
+               OpStore %i_1 %413
+               OpBranch %386
+        %387 = OpLabel
+               OpBranch %379
+        %379 = OpLabel
+        %414 = OpLoad %int %m
+        %415 = OpIMul %int %int_2 %414
+               OpStore %m %415
+               OpBranch %377
+        %378 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/2.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/2.spvasm.expected.hlsl
new file mode 100644
index 0000000..30e945e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/2.spvasm.expected.hlsl
@@ -0,0 +1,296 @@
+static int data[10] = (int[10])0;
+static int temp[10] = (int[10])0;
+cbuffer cbuffer_x_28 : register(b0, space0) {
+  uint4 x_28[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void merge_i1_i1_i1_(inout int from, inout int mid, inout int to) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  const int x_302 = from;
+  k = x_302;
+  const int x_303 = from;
+  i = x_303;
+  const int x_304 = mid;
+  j = (x_304 + 1);
+  while (true) {
+    const int x_310 = i;
+    const int x_311 = mid;
+    const int x_313 = j;
+    const int x_314 = to;
+    bool tint_tmp = (x_310 <= x_311);
+    if (tint_tmp) {
+      tint_tmp = (x_313 <= x_314);
+    }
+    if ((tint_tmp)) {
+    } else {
+      break;
+    }
+    const int x_320 = data[i];
+    const int x_323 = data[j];
+    if ((x_320 < x_323)) {
+      const int x_328 = k;
+      k = (x_328 + 1);
+      const int x_330 = i;
+      i = (x_330 + 1);
+      const int x_333 = data[x_330];
+      temp[x_328] = x_333;
+    } else {
+      const int x_335 = k;
+      k = (x_335 + 1);
+      const int x_337 = j;
+      j = (x_337 + 1);
+      const int x_340 = data[x_337];
+      temp[x_335] = x_340;
+    }
+  }
+  while (true) {
+    const int x_346 = i;
+    const int x_348 = i;
+    const int x_349 = mid;
+    bool tint_tmp_1 = (x_346 < 10);
+    if (tint_tmp_1) {
+      tint_tmp_1 = (x_348 <= x_349);
+    }
+    if ((tint_tmp_1)) {
+    } else {
+      break;
+    }
+    const int x_353 = k;
+    k = (x_353 + 1);
+    const int x_355 = i;
+    i = (x_355 + 1);
+    const int x_358 = data[x_355];
+    temp[x_353] = x_358;
+  }
+  const int x_360 = from;
+  i_1 = x_360;
+  while (true) {
+    const int x_365 = i_1;
+    const int x_366 = to;
+    if ((x_365 <= x_366)) {
+    } else {
+      break;
+    }
+    const int x_369 = i_1;
+    const int x_372 = temp[i_1];
+    data[x_369] = x_372;
+    {
+      i_1 = (i_1 + 1);
+    }
+  }
+  return;
+}
+
+void main_1() {
+  int x_85 = 0;
+  int x_86 = 0;
+  int x_87 = 0;
+  int x_88 = 0;
+  int x_89 = 0;
+  int x_90 = 0;
+  int x_91 = 0;
+  int x_92 = 0;
+  int x_93 = 0;
+  int x_94 = 0;
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  const float x_96 = asfloat(x_28[0].x);
+  i_3 = int(x_96);
+  while (true) {
+    switch(i_3) {
+      case 9: {
+        data[i_3] = -5;
+        break;
+      }
+      case 8: {
+        data[i_3] = -4;
+        break;
+      }
+      case 7: {
+        data[i_3] = -3;
+        break;
+      }
+      case 6: {
+        data[i_3] = -2;
+        break;
+      }
+      case 5: {
+        data[i_3] = -1;
+        break;
+      }
+      case 4: {
+        data[i_3] = 0;
+        break;
+      }
+      case 3: {
+        data[i_3] = 1;
+        break;
+      }
+      case 2: {
+        data[i_3] = 2;
+        break;
+      }
+      case 1: {
+        data[i_3] = 3;
+        break;
+      }
+      case 0: {
+        data[i_3] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    i_3 = (i_3 + 1);
+    {
+      if ((i_3 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  {
+    for(; (j_1 < 10); j_1 = (j_1 + 1)) {
+      const int x_145 = j_1;
+      const int x_148 = data[j_1];
+      temp[x_145] = x_148;
+    }
+  }
+  x_94 = 0;
+  x_93 = 9;
+  x_92 = 1;
+  {
+    for(; (x_92 <= x_93); x_92 = (2 * x_92)) {
+      x_91 = x_94;
+      {
+        for(; (x_91 < x_93); x_91 = (x_91 + (2 * x_92))) {
+          x_90 = x_91;
+          x_89 = ((x_91 + x_92) - 1);
+          x_88 = min(((x_91 + (2 * x_92)) - 1), x_93);
+          x_87 = x_90;
+          x_86 = x_89;
+          x_85 = x_88;
+          merge_i1_i1_i1_(x_87, x_86, x_85);
+        }
+      }
+    }
+  }
+  const float x_193 = gl_FragCoord.y;
+  if ((int(x_193) < 30)) {
+    const int x_200 = data[0];
+    grey = (0.5f + (float(x_200) / 10.0f));
+  } else {
+    const float x_205 = gl_FragCoord.y;
+    if ((int(x_205) < 60)) {
+      const int x_212 = data[1];
+      grey = (0.5f + (float(x_212) / 10.0f));
+    } else {
+      const float x_217 = gl_FragCoord.y;
+      if ((int(x_217) < 90)) {
+        const int x_224 = data[2];
+        grey = (0.5f + (float(x_224) / 10.0f));
+      } else {
+        const float x_229 = gl_FragCoord.y;
+        if ((int(x_229) < 120)) {
+          const int x_236 = data[3];
+          grey = (0.5f + (float(x_236) / 10.0f));
+        } else {
+          const float x_241 = gl_FragCoord.y;
+          if ((int(x_241) < 150)) {
+            discard;
+          } else {
+            const float x_248 = gl_FragCoord.y;
+            if ((int(x_248) < 180)) {
+              const int x_255 = data[5];
+              grey = (0.5f + (float(x_255) / 10.0f));
+            } else {
+              const float x_260 = gl_FragCoord.y;
+              if ((int(x_260) < 210)) {
+                const int x_267 = data[6];
+                grey = (0.5f + (float(x_267) / 10.0f));
+              } else {
+                const float x_272 = gl_FragCoord.y;
+                if ((int(x_272) < 240)) {
+                  const int x_279 = data[7];
+                  grey = (0.5f + (float(x_279) / 10.0f));
+                } else {
+                  const float x_284 = gl_FragCoord.y;
+                  if ((int(x_284) < 270)) {
+                    const int x_291 = data[8];
+                    grey = (0.5f + (float(x_291) / 10.0f));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  const float x_295 = grey;
+  const float3 x_296 = float3(x_295, x_295, x_295);
+  x_GLF_color = float4(x_296.x, x_296.y, x_296.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
+void mergeSort_() {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  {
+    for(; (m <= high); m = (2 * m)) {
+      i_2 = low;
+      {
+        for(; (i_2 < high); i_2 = (i_2 + (2 * m))) {
+          from_1 = i_2;
+          mid_1 = ((i_2 + m) - 1);
+          to_1 = min(((i_2 + (2 * m)) - 1), high);
+          param = from_1;
+          param_1 = mid_1;
+          param_2 = to_1;
+          merge_i1_i1_i1_(param, param_1, param_2);
+        }
+      }
+    }
+  }
+  return;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/2.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/2.spvasm.expected.msl
new file mode 100644
index 0000000..a550d0f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/2.spvasm.expected.msl
@@ -0,0 +1,369 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void merge_i1_i1_i1_(thread int* const from, thread int* const mid, thread int* const to, thread tint_array_wrapper* const tint_symbol_5, thread tint_array_wrapper* const tint_symbol_6) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  int const x_302 = *(from);
+  k = x_302;
+  int const x_303 = *(from);
+  i = x_303;
+  int const x_304 = *(mid);
+  j = (x_304 + 1);
+  while (true) {
+    int const x_310 = i;
+    int const x_311 = *(mid);
+    int const x_313 = j;
+    int const x_314 = *(to);
+    if (((x_310 <= x_311) && (x_313 <= x_314))) {
+    } else {
+      break;
+    }
+    int const x_318 = i;
+    int const x_320 = (*(tint_symbol_5)).arr[x_318];
+    int const x_321 = j;
+    int const x_323 = (*(tint_symbol_5)).arr[x_321];
+    if ((x_320 < x_323)) {
+      int const x_328 = k;
+      k = (x_328 + 1);
+      int const x_330 = i;
+      i = (x_330 + 1);
+      int const x_333 = (*(tint_symbol_5)).arr[x_330];
+      (*(tint_symbol_6)).arr[x_328] = x_333;
+    } else {
+      int const x_335 = k;
+      k = (x_335 + 1);
+      int const x_337 = j;
+      j = (x_337 + 1);
+      int const x_340 = (*(tint_symbol_5)).arr[x_337];
+      (*(tint_symbol_6)).arr[x_335] = x_340;
+    }
+  }
+  while (true) {
+    int const x_346 = i;
+    int const x_348 = i;
+    int const x_349 = *(mid);
+    if (((x_346 < 10) && (x_348 <= x_349))) {
+    } else {
+      break;
+    }
+    int const x_353 = k;
+    k = (x_353 + 1);
+    int const x_355 = i;
+    i = (x_355 + 1);
+    int const x_358 = (*(tint_symbol_5)).arr[x_355];
+    (*(tint_symbol_6)).arr[x_353] = x_358;
+  }
+  int const x_360 = *(from);
+  i_1 = x_360;
+  while (true) {
+    int const x_365 = i_1;
+    int const x_366 = *(to);
+    if ((x_365 <= x_366)) {
+    } else {
+      break;
+    }
+    int const x_369 = i_1;
+    int const x_370 = i_1;
+    int const x_372 = (*(tint_symbol_6)).arr[x_370];
+    (*(tint_symbol_5)).arr[x_369] = x_372;
+    {
+      int const x_374 = i_1;
+      i_1 = (x_374 + 1);
+    }
+  }
+  return;
+}
+
+void main_1(constant buf0& x_28, thread tint_array_wrapper* const tint_symbol_7, thread tint_array_wrapper* const tint_symbol_8, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10) {
+  int x_85 = 0;
+  int x_86 = 0;
+  int x_87 = 0;
+  int x_88 = 0;
+  int x_89 = 0;
+  int x_90 = 0;
+  int x_91 = 0;
+  int x_92 = 0;
+  int x_93 = 0;
+  int x_94 = 0;
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  float const x_96 = x_28.injectionSwitch.x;
+  i_3 = int(x_96);
+  while (true) {
+    int const x_102 = i_3;
+    switch(x_102) {
+      case 9: {
+        int const x_132 = i_3;
+        (*(tint_symbol_7)).arr[x_132] = -5;
+        break;
+      }
+      case 8: {
+        int const x_130 = i_3;
+        (*(tint_symbol_7)).arr[x_130] = -4;
+        break;
+      }
+      case 7: {
+        int const x_128 = i_3;
+        (*(tint_symbol_7)).arr[x_128] = -3;
+        break;
+      }
+      case 6: {
+        int const x_126 = i_3;
+        (*(tint_symbol_7)).arr[x_126] = -2;
+        break;
+      }
+      case 5: {
+        int const x_124 = i_3;
+        (*(tint_symbol_7)).arr[x_124] = -1;
+        break;
+      }
+      case 4: {
+        int const x_122 = i_3;
+        (*(tint_symbol_7)).arr[x_122] = 0;
+        break;
+      }
+      case 3: {
+        int const x_120 = i_3;
+        (*(tint_symbol_7)).arr[x_120] = 1;
+        break;
+      }
+      case 2: {
+        int const x_118 = i_3;
+        (*(tint_symbol_7)).arr[x_118] = 2;
+        break;
+      }
+      case 1: {
+        int const x_116 = i_3;
+        (*(tint_symbol_7)).arr[x_116] = 3;
+        break;
+      }
+      case 0: {
+        int const x_114 = i_3;
+        (*(tint_symbol_7)).arr[x_114] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    int const x_134 = i_3;
+    i_3 = (x_134 + 1);
+    {
+      int const x_136 = i_3;
+      if ((x_136 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  while (true) {
+    int const x_142 = j_1;
+    if ((x_142 < 10)) {
+    } else {
+      break;
+    }
+    int const x_145 = j_1;
+    int const x_146 = j_1;
+    int const x_148 = (*(tint_symbol_7)).arr[x_146];
+    (*(tint_symbol_8)).arr[x_145] = x_148;
+    {
+      int const x_150 = j_1;
+      j_1 = (x_150 + 1);
+    }
+  }
+  x_94 = 0;
+  x_93 = 9;
+  x_92 = 1;
+  while (true) {
+    int const x_156 = x_92;
+    int const x_157 = x_93;
+    if ((x_156 <= x_157)) {
+    } else {
+      break;
+    }
+    int const x_160 = x_94;
+    x_91 = x_160;
+    while (true) {
+      int const x_165 = x_91;
+      int const x_166 = x_93;
+      if ((x_165 < x_166)) {
+      } else {
+        break;
+      }
+      int const x_169 = x_91;
+      x_90 = x_169;
+      int const x_170 = x_91;
+      int const x_171 = x_92;
+      x_89 = ((x_170 + x_171) - 1);
+      int const x_174 = x_91;
+      int const x_175 = x_92;
+      int const x_179 = x_93;
+      x_88 = min(((x_174 + (2 * x_175)) - 1), x_179);
+      int const x_181 = x_90;
+      x_87 = x_181;
+      int const x_182 = x_89;
+      x_86 = x_182;
+      int const x_183 = x_88;
+      x_85 = x_183;
+      merge_i1_i1_i1_(&(x_87), &(x_86), &(x_85), tint_symbol_7, tint_symbol_8);
+      {
+        int const x_185 = x_92;
+        int const x_187 = x_91;
+        x_91 = (x_187 + (2 * x_185));
+      }
+    }
+    {
+      int const x_189 = x_92;
+      x_92 = (2 * x_189);
+    }
+  }
+  float const x_193 = (*(tint_symbol_9)).y;
+  if ((int(x_193) < 30)) {
+    int const x_200 = (*(tint_symbol_7)).arr[0];
+    grey = (0.5f + (float(x_200) / 10.0f));
+  } else {
+    float const x_205 = (*(tint_symbol_9)).y;
+    if ((int(x_205) < 60)) {
+      int const x_212 = (*(tint_symbol_7)).arr[1];
+      grey = (0.5f + (float(x_212) / 10.0f));
+    } else {
+      float const x_217 = (*(tint_symbol_9)).y;
+      if ((int(x_217) < 90)) {
+        int const x_224 = (*(tint_symbol_7)).arr[2];
+        grey = (0.5f + (float(x_224) / 10.0f));
+      } else {
+        float const x_229 = (*(tint_symbol_9)).y;
+        if ((int(x_229) < 120)) {
+          int const x_236 = (*(tint_symbol_7)).arr[3];
+          grey = (0.5f + (float(x_236) / 10.0f));
+        } else {
+          float const x_241 = (*(tint_symbol_9)).y;
+          if ((int(x_241) < 150)) {
+            discard_fragment();
+          } else {
+            float const x_248 = (*(tint_symbol_9)).y;
+            if ((int(x_248) < 180)) {
+              int const x_255 = (*(tint_symbol_7)).arr[5];
+              grey = (0.5f + (float(x_255) / 10.0f));
+            } else {
+              float const x_260 = (*(tint_symbol_9)).y;
+              if ((int(x_260) < 210)) {
+                int const x_267 = (*(tint_symbol_7)).arr[6];
+                grey = (0.5f + (float(x_267) / 10.0f));
+              } else {
+                float const x_272 = (*(tint_symbol_9)).y;
+                if ((int(x_272) < 240)) {
+                  int const x_279 = (*(tint_symbol_7)).arr[7];
+                  grey = (0.5f + (float(x_279) / 10.0f));
+                } else {
+                  float const x_284 = (*(tint_symbol_9)).y;
+                  if ((int(x_284) < 270)) {
+                    int const x_291 = (*(tint_symbol_7)).arr[8];
+                    grey = (0.5f + (float(x_291) / 10.0f));
+                  } else {
+                    discard_fragment();
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  float const x_295 = grey;
+  float3 const x_296 = float3(x_295, x_295, x_295);
+  *(tint_symbol_10) = float4(x_296.x, x_296.y, x_296.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_28 [[buffer(0)]]) {
+  thread float4 tint_symbol_11 = 0.0f;
+  thread tint_array_wrapper tint_symbol_12 = {};
+  thread tint_array_wrapper tint_symbol_13 = {};
+  thread float4 tint_symbol_14 = 0.0f;
+  tint_symbol_11 = gl_FragCoord_param;
+  main_1(x_28, &(tint_symbol_12), &(tint_symbol_13), &(tint_symbol_11), &(tint_symbol_14));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_14};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
+void mergeSort_(thread tint_array_wrapper* const tint_symbol_15, thread tint_array_wrapper* const tint_symbol_16) {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  while (true) {
+    int const x_381 = m;
+    int const x_382 = high;
+    if ((x_381 <= x_382)) {
+    } else {
+      break;
+    }
+    int const x_385 = low;
+    i_2 = x_385;
+    while (true) {
+      int const x_390 = i_2;
+      int const x_391 = high;
+      if ((x_390 < x_391)) {
+      } else {
+        break;
+      }
+      int const x_394 = i_2;
+      from_1 = x_394;
+      int const x_395 = i_2;
+      int const x_396 = m;
+      mid_1 = ((x_395 + x_396) - 1);
+      int const x_399 = i_2;
+      int const x_400 = m;
+      int const x_404 = high;
+      to_1 = min(((x_399 + (2 * x_400)) - 1), x_404);
+      int const x_406 = from_1;
+      param = x_406;
+      int const x_407 = mid_1;
+      param_1 = x_407;
+      int const x_408 = to_1;
+      param_2 = x_408;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2), tint_symbol_15, tint_symbol_16);
+      {
+        int const x_410 = m;
+        int const x_412 = i_2;
+        i_2 = (x_412 + (2 * x_410));
+      }
+    }
+    {
+      int const x_414 = m;
+      m = (2 * x_414);
+    }
+  }
+  return;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/2.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/2.spvasm.expected.spvasm
new file mode 100644
index 0000000..5cce2a6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/2.spvasm.expected.spvasm
@@ -0,0 +1,741 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 471
+; Schema: 0
+               OpCapability Shader
+        %255 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %data "data"
+               OpName %temp "temp"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_28 "x_28"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %merge_i1_i1_i1_ "merge_i1_i1_i1_"
+               OpName %from "from"
+               OpName %mid "mid"
+               OpName %to "to"
+               OpName %k "k"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %i_1 "i_1"
+               OpName %main_1 "main_1"
+               OpName %x_85 "x_85"
+               OpName %x_86 "x_86"
+               OpName %x_87 "x_87"
+               OpName %x_88 "x_88"
+               OpName %x_89 "x_89"
+               OpName %x_90 "x_90"
+               OpName %x_91 "x_91"
+               OpName %x_92 "x_92"
+               OpName %x_93 "x_93"
+               OpName %x_94 "x_94"
+               OpName %i_3 "i_3"
+               OpName %j_1 "j_1"
+               OpName %grey "grey"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpName %mergeSort_ "mergeSort_"
+               OpName %low "low"
+               OpName %high "high"
+               OpName %m "m"
+               OpName %i_2 "i_2"
+               OpName %from_1 "from_1"
+               OpName %mid_1 "mid_1"
+               OpName %to_1 "to_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_28 NonWritable
+               OpDecorate %x_28 DescriptorSet 0
+               OpDecorate %x_28 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Private__arr_int_uint_10 = OpTypePointer Private %_arr_int_uint_10
+          %7 = OpConstantNull %_arr_int_uint_10
+       %data = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+       %temp = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_28 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %17
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int %_ptr_Function_int
+         %32 = OpConstantNull %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+%_ptr_Private_int = OpTypePointer Private %int
+     %int_10 = OpConstant %int 10
+        %132 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+        %149 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %int_n5 = OpConstant %int -5
+     %int_n4 = OpConstant %int -4
+     %int_n3 = OpConstant %int -3
+     %int_n2 = OpConstant %int -2
+     %int_n1 = OpConstant %int -1
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+      %int_9 = OpConstant %int 9
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %int_30 = OpConstant %int 30
+  %float_0_5 = OpConstant %float 0.5
+   %float_10 = OpConstant %float 10
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+    %v3float = OpTypeVector %float 3
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %400 = OpTypeFunction %void %main_out
+%merge_i1_i1_i1_ = OpFunction %void None %23
+       %from = OpFunctionParameter %_ptr_Function_int
+        %mid = OpFunctionParameter %_ptr_Function_int
+         %to = OpFunctionParameter %_ptr_Function_int
+         %30 = OpLabel
+          %k = OpVariable %_ptr_Function_int Function %32
+          %i = OpVariable %_ptr_Function_int Function %32
+          %j = OpVariable %_ptr_Function_int Function %32
+        %i_1 = OpVariable %_ptr_Function_int Function %32
+         %37 = OpLoad %int %from
+               OpStore %k %37
+         %39 = OpLoad %int %from
+               OpStore %i %39
+         %41 = OpLoad %int %mid
+         %43 = OpIAdd %int %41 %int_1
+               OpStore %j %43
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %48 = OpLoad %int %i
+         %50 = OpLoad %int %mid
+         %51 = OpLoad %int %j
+         %53 = OpLoad %int %to
+         %54 = OpSLessThanEqual %bool %48 %50
+               OpSelectionMerge %56 None
+               OpBranchConditional %54 %57 %56
+         %57 = OpLabel
+         %58 = OpSLessThanEqual %bool %51 %53
+               OpBranch %56
+         %56 = OpLabel
+         %59 = OpPhi %bool %54 %47 %58 %57
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %62
+         %61 = OpLabel
+               OpBranch %60
+         %62 = OpLabel
+               OpBranch %45
+         %60 = OpLabel
+         %63 = OpLoad %int %i
+         %65 = OpAccessChain %_ptr_Private_int %data %63
+         %66 = OpLoad %int %65
+         %67 = OpLoad %int %j
+         %68 = OpAccessChain %_ptr_Private_int %data %67
+         %69 = OpLoad %int %68
+         %70 = OpSLessThan %bool %66 %69
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %73
+         %72 = OpLabel
+         %74 = OpLoad %int %k
+         %75 = OpIAdd %int %74 %int_1
+               OpStore %k %75
+         %76 = OpLoad %int %i
+         %77 = OpIAdd %int %76 %int_1
+               OpStore %i %77
+         %78 = OpAccessChain %_ptr_Private_int %data %76
+         %79 = OpLoad %int %78
+         %80 = OpAccessChain %_ptr_Private_int %temp %74
+               OpStore %80 %79
+               OpBranch %71
+         %73 = OpLabel
+         %81 = OpLoad %int %k
+         %82 = OpIAdd %int %81 %int_1
+               OpStore %k %82
+         %83 = OpLoad %int %j
+         %84 = OpIAdd %int %83 %int_1
+               OpStore %j %84
+         %85 = OpAccessChain %_ptr_Private_int %data %83
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_Private_int %temp %81
+               OpStore %87 %86
+               OpBranch %71
+         %71 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+               OpBranch %44
+         %45 = OpLabel
+               OpBranch %88
+         %88 = OpLabel
+               OpLoopMerge %89 %90 None
+               OpBranch %91
+         %91 = OpLabel
+         %92 = OpLoad %int %i
+         %93 = OpLoad %int %i
+         %95 = OpLoad %int %mid
+         %97 = OpSLessThan %bool %92 %int_10
+               OpSelectionMerge %98 None
+               OpBranchConditional %97 %99 %98
+         %99 = OpLabel
+        %100 = OpSLessThanEqual %bool %93 %95
+               OpBranch %98
+         %98 = OpLabel
+        %101 = OpPhi %bool %97 %91 %100 %99
+               OpSelectionMerge %102 None
+               OpBranchConditional %101 %103 %104
+        %103 = OpLabel
+               OpBranch %102
+        %104 = OpLabel
+               OpBranch %89
+        %102 = OpLabel
+        %105 = OpLoad %int %k
+        %106 = OpIAdd %int %105 %int_1
+               OpStore %k %106
+        %107 = OpLoad %int %i
+        %108 = OpIAdd %int %107 %int_1
+               OpStore %i %108
+        %109 = OpAccessChain %_ptr_Private_int %data %107
+        %110 = OpLoad %int %109
+        %111 = OpAccessChain %_ptr_Private_int %temp %105
+               OpStore %111 %110
+               OpBranch %90
+         %90 = OpLabel
+               OpBranch %88
+         %89 = OpLabel
+        %113 = OpLoad %int %from
+               OpStore %i_1 %113
+               OpBranch %114
+        %114 = OpLabel
+               OpLoopMerge %115 %116 None
+               OpBranch %117
+        %117 = OpLabel
+        %118 = OpLoad %int %i_1
+        %120 = OpLoad %int %to
+        %121 = OpSLessThanEqual %bool %118 %120
+               OpSelectionMerge %122 None
+               OpBranchConditional %121 %123 %124
+        %123 = OpLabel
+               OpBranch %122
+        %124 = OpLabel
+               OpBranch %115
+        %122 = OpLabel
+        %125 = OpLoad %int %i_1
+        %126 = OpLoad %int %i_1
+        %127 = OpAccessChain %_ptr_Private_int %temp %126
+        %128 = OpLoad %int %127
+        %129 = OpAccessChain %_ptr_Private_int %data %125
+               OpStore %129 %128
+               OpBranch %116
+        %116 = OpLabel
+        %130 = OpLoad %int %i_1
+        %131 = OpIAdd %int %130 %int_1
+               OpStore %i_1 %131
+               OpBranch %114
+        %115 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %132
+        %134 = OpLabel
+       %x_85 = OpVariable %_ptr_Function_int Function %32
+       %x_86 = OpVariable %_ptr_Function_int Function %32
+       %x_87 = OpVariable %_ptr_Function_int Function %32
+       %x_88 = OpVariable %_ptr_Function_int Function %32
+       %x_89 = OpVariable %_ptr_Function_int Function %32
+       %x_90 = OpVariable %_ptr_Function_int Function %32
+       %x_91 = OpVariable %_ptr_Function_int Function %32
+       %x_92 = OpVariable %_ptr_Function_int Function %32
+       %x_93 = OpVariable %_ptr_Function_int Function %32
+       %x_94 = OpVariable %_ptr_Function_int Function %32
+        %i_3 = OpVariable %_ptr_Function_int Function %32
+        %j_1 = OpVariable %_ptr_Function_int Function %32
+       %grey = OpVariable %_ptr_Function_float Function %149
+        %152 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_0
+        %153 = OpLoad %float %152
+        %154 = OpConvertFToS %int %153
+               OpStore %i_3 %154
+               OpBranch %155
+        %155 = OpLabel
+               OpLoopMerge %156 %157 None
+               OpBranch %158
+        %158 = OpLabel
+        %159 = OpLoad %int %i_3
+               OpSelectionMerge %160 None
+               OpSwitch %159 %161 9 %162 8 %163 7 %164 6 %165 5 %166 4 %167 3 %168 2 %169 1 %170 0 %171
+        %162 = OpLabel
+        %172 = OpLoad %int %i_3
+        %173 = OpAccessChain %_ptr_Private_int %data %172
+               OpStore %173 %int_n5
+               OpBranch %160
+        %163 = OpLabel
+        %175 = OpLoad %int %i_3
+        %176 = OpAccessChain %_ptr_Private_int %data %175
+               OpStore %176 %int_n4
+               OpBranch %160
+        %164 = OpLabel
+        %178 = OpLoad %int %i_3
+        %179 = OpAccessChain %_ptr_Private_int %data %178
+               OpStore %179 %int_n3
+               OpBranch %160
+        %165 = OpLabel
+        %181 = OpLoad %int %i_3
+        %182 = OpAccessChain %_ptr_Private_int %data %181
+               OpStore %182 %int_n2
+               OpBranch %160
+        %166 = OpLabel
+        %184 = OpLoad %int %i_3
+        %185 = OpAccessChain %_ptr_Private_int %data %184
+               OpStore %185 %int_n1
+               OpBranch %160
+        %167 = OpLabel
+        %187 = OpLoad %int %i_3
+        %188 = OpAccessChain %_ptr_Private_int %data %187
+               OpStore %188 %int_0
+               OpBranch %160
+        %168 = OpLabel
+        %190 = OpLoad %int %i_3
+        %191 = OpAccessChain %_ptr_Private_int %data %190
+               OpStore %191 %int_1
+               OpBranch %160
+        %169 = OpLabel
+        %192 = OpLoad %int %i_3
+        %193 = OpAccessChain %_ptr_Private_int %data %192
+               OpStore %193 %int_2
+               OpBranch %160
+        %170 = OpLabel
+        %195 = OpLoad %int %i_3
+        %196 = OpAccessChain %_ptr_Private_int %data %195
+               OpStore %196 %int_3
+               OpBranch %160
+        %171 = OpLabel
+        %198 = OpLoad %int %i_3
+        %199 = OpAccessChain %_ptr_Private_int %data %198
+               OpStore %199 %int_4
+               OpBranch %160
+        %161 = OpLabel
+               OpBranch %160
+        %160 = OpLabel
+        %201 = OpLoad %int %i_3
+        %202 = OpIAdd %int %201 %int_1
+               OpStore %i_3 %202
+               OpBranch %157
+        %157 = OpLabel
+        %203 = OpLoad %int %i_3
+        %204 = OpSLessThan %bool %203 %int_10
+               OpSelectionMerge %205 None
+               OpBranchConditional %204 %206 %207
+        %206 = OpLabel
+               OpBranch %205
+        %207 = OpLabel
+               OpBranch %156
+        %205 = OpLabel
+               OpBranch %155
+        %156 = OpLabel
+               OpStore %j_1 %int_0
+               OpBranch %208
+        %208 = OpLabel
+               OpLoopMerge %209 %210 None
+               OpBranch %211
+        %211 = OpLabel
+        %212 = OpLoad %int %j_1
+        %213 = OpSLessThan %bool %212 %int_10
+               OpSelectionMerge %214 None
+               OpBranchConditional %213 %215 %216
+        %215 = OpLabel
+               OpBranch %214
+        %216 = OpLabel
+               OpBranch %209
+        %214 = OpLabel
+        %217 = OpLoad %int %j_1
+        %218 = OpLoad %int %j_1
+        %219 = OpAccessChain %_ptr_Private_int %data %218
+        %220 = OpLoad %int %219
+        %221 = OpAccessChain %_ptr_Private_int %temp %217
+               OpStore %221 %220
+               OpBranch %210
+        %210 = OpLabel
+        %222 = OpLoad %int %j_1
+        %223 = OpIAdd %int %222 %int_1
+               OpStore %j_1 %223
+               OpBranch %208
+        %209 = OpLabel
+               OpStore %x_94 %int_0
+               OpStore %x_93 %int_9
+               OpStore %x_92 %int_1
+               OpBranch %225
+        %225 = OpLabel
+               OpLoopMerge %226 %227 None
+               OpBranch %228
+        %228 = OpLabel
+        %229 = OpLoad %int %x_92
+        %230 = OpLoad %int %x_93
+        %231 = OpSLessThanEqual %bool %229 %230
+               OpSelectionMerge %232 None
+               OpBranchConditional %231 %233 %234
+        %233 = OpLabel
+               OpBranch %232
+        %234 = OpLabel
+               OpBranch %226
+        %232 = OpLabel
+        %235 = OpLoad %int %x_94
+               OpStore %x_91 %235
+               OpBranch %236
+        %236 = OpLabel
+               OpLoopMerge %237 %238 None
+               OpBranch %239
+        %239 = OpLabel
+        %240 = OpLoad %int %x_91
+        %241 = OpLoad %int %x_93
+        %242 = OpSLessThan %bool %240 %241
+               OpSelectionMerge %243 None
+               OpBranchConditional %242 %244 %245
+        %244 = OpLabel
+               OpBranch %243
+        %245 = OpLabel
+               OpBranch %237
+        %243 = OpLabel
+        %246 = OpLoad %int %x_91
+               OpStore %x_90 %246
+        %247 = OpLoad %int %x_91
+        %248 = OpLoad %int %x_92
+        %249 = OpIAdd %int %247 %248
+        %250 = OpISub %int %249 %int_1
+               OpStore %x_89 %250
+        %251 = OpLoad %int %x_91
+        %252 = OpLoad %int %x_92
+        %253 = OpLoad %int %x_93
+        %256 = OpIMul %int %int_2 %252
+        %257 = OpIAdd %int %251 %256
+        %258 = OpISub %int %257 %int_1
+        %254 = OpExtInst %int %255 SMin %258 %253
+               OpStore %x_88 %254
+        %259 = OpLoad %int %x_90
+               OpStore %x_87 %259
+        %260 = OpLoad %int %x_89
+               OpStore %x_86 %260
+        %261 = OpLoad %int %x_88
+               OpStore %x_85 %261
+        %262 = OpFunctionCall %void %merge_i1_i1_i1_ %x_87 %x_86 %x_85
+               OpBranch %238
+        %238 = OpLabel
+        %266 = OpLoad %int %x_92
+        %267 = OpLoad %int %x_91
+        %268 = OpIMul %int %int_2 %266
+        %269 = OpIAdd %int %267 %268
+               OpStore %x_91 %269
+               OpBranch %236
+        %237 = OpLabel
+               OpBranch %227
+        %227 = OpLabel
+        %270 = OpLoad %int %x_92
+        %271 = OpIMul %int %int_2 %270
+               OpStore %x_92 %271
+               OpBranch %225
+        %226 = OpLabel
+        %274 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %275 = OpLoad %float %274
+        %276 = OpConvertFToS %int %275
+        %278 = OpSLessThan %bool %276 %int_30
+               OpSelectionMerge %279 None
+               OpBranchConditional %278 %280 %281
+        %280 = OpLabel
+        %282 = OpAccessChain %_ptr_Private_int %data %int_0
+        %283 = OpLoad %int %282
+        %285 = OpConvertSToF %float %283
+        %287 = OpFDiv %float %285 %float_10
+        %288 = OpFAdd %float %float_0_5 %287
+               OpStore %grey %288
+               OpBranch %279
+        %281 = OpLabel
+        %289 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %290 = OpLoad %float %289
+        %291 = OpConvertFToS %int %290
+        %293 = OpSLessThan %bool %291 %int_60
+               OpSelectionMerge %294 None
+               OpBranchConditional %293 %295 %296
+        %295 = OpLabel
+        %297 = OpAccessChain %_ptr_Private_int %data %int_1
+        %298 = OpLoad %int %297
+        %299 = OpConvertSToF %float %298
+        %300 = OpFDiv %float %299 %float_10
+        %301 = OpFAdd %float %float_0_5 %300
+               OpStore %grey %301
+               OpBranch %294
+        %296 = OpLabel
+        %302 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %303 = OpLoad %float %302
+        %304 = OpConvertFToS %int %303
+        %306 = OpSLessThan %bool %304 %int_90
+               OpSelectionMerge %307 None
+               OpBranchConditional %306 %308 %309
+        %308 = OpLabel
+        %310 = OpAccessChain %_ptr_Private_int %data %int_2
+        %311 = OpLoad %int %310
+        %312 = OpConvertSToF %float %311
+        %313 = OpFDiv %float %312 %float_10
+        %314 = OpFAdd %float %float_0_5 %313
+               OpStore %grey %314
+               OpBranch %307
+        %309 = OpLabel
+        %315 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %316 = OpLoad %float %315
+        %317 = OpConvertFToS %int %316
+        %319 = OpSLessThan %bool %317 %int_120
+               OpSelectionMerge %320 None
+               OpBranchConditional %319 %321 %322
+        %321 = OpLabel
+        %323 = OpAccessChain %_ptr_Private_int %data %int_3
+        %324 = OpLoad %int %323
+        %325 = OpConvertSToF %float %324
+        %326 = OpFDiv %float %325 %float_10
+        %327 = OpFAdd %float %float_0_5 %326
+               OpStore %grey %327
+               OpBranch %320
+        %322 = OpLabel
+        %328 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %329 = OpLoad %float %328
+        %330 = OpConvertFToS %int %329
+        %332 = OpSLessThan %bool %330 %int_150
+               OpSelectionMerge %333 None
+               OpBranchConditional %332 %334 %335
+        %334 = OpLabel
+               OpKill
+        %335 = OpLabel
+        %336 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %337 = OpLoad %float %336
+        %338 = OpConvertFToS %int %337
+        %340 = OpSLessThan %bool %338 %int_180
+               OpSelectionMerge %341 None
+               OpBranchConditional %340 %342 %343
+        %342 = OpLabel
+        %345 = OpAccessChain %_ptr_Private_int %data %int_5
+        %346 = OpLoad %int %345
+        %347 = OpConvertSToF %float %346
+        %348 = OpFDiv %float %347 %float_10
+        %349 = OpFAdd %float %float_0_5 %348
+               OpStore %grey %349
+               OpBranch %341
+        %343 = OpLabel
+        %350 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %351 = OpLoad %float %350
+        %352 = OpConvertFToS %int %351
+        %354 = OpSLessThan %bool %352 %int_210
+               OpSelectionMerge %355 None
+               OpBranchConditional %354 %356 %357
+        %356 = OpLabel
+        %359 = OpAccessChain %_ptr_Private_int %data %int_6
+        %360 = OpLoad %int %359
+        %361 = OpConvertSToF %float %360
+        %362 = OpFDiv %float %361 %float_10
+        %363 = OpFAdd %float %float_0_5 %362
+               OpStore %grey %363
+               OpBranch %355
+        %357 = OpLabel
+        %364 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %365 = OpLoad %float %364
+        %366 = OpConvertFToS %int %365
+        %368 = OpSLessThan %bool %366 %int_240
+               OpSelectionMerge %369 None
+               OpBranchConditional %368 %370 %371
+        %370 = OpLabel
+        %373 = OpAccessChain %_ptr_Private_int %data %int_7
+        %374 = OpLoad %int %373
+        %375 = OpConvertSToF %float %374
+        %376 = OpFDiv %float %375 %float_10
+        %377 = OpFAdd %float %float_0_5 %376
+               OpStore %grey %377
+               OpBranch %369
+        %371 = OpLabel
+        %378 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %379 = OpLoad %float %378
+        %380 = OpConvertFToS %int %379
+        %382 = OpSLessThan %bool %380 %int_270
+               OpSelectionMerge %383 None
+               OpBranchConditional %382 %384 %385
+        %384 = OpLabel
+        %387 = OpAccessChain %_ptr_Private_int %data %int_8
+        %388 = OpLoad %int %387
+        %389 = OpConvertSToF %float %388
+        %390 = OpFDiv %float %389 %float_10
+        %391 = OpFAdd %float %float_0_5 %390
+               OpStore %grey %391
+               OpBranch %383
+        %385 = OpLabel
+               OpKill
+        %383 = OpLabel
+               OpBranch %369
+        %369 = OpLabel
+               OpBranch %355
+        %355 = OpLabel
+               OpBranch %341
+        %341 = OpLabel
+               OpBranch %333
+        %333 = OpLabel
+               OpBranch %320
+        %320 = OpLabel
+               OpBranch %307
+        %307 = OpLabel
+               OpBranch %294
+        %294 = OpLabel
+               OpBranch %279
+        %279 = OpLabel
+        %392 = OpLoad %float %grey
+        %394 = OpCompositeConstruct %v3float %392 %392 %392
+        %395 = OpCompositeExtract %float %394 0
+        %396 = OpCompositeExtract %float %394 1
+        %397 = OpCompositeExtract %float %394 2
+        %399 = OpCompositeConstruct %v4float %395 %396 %397 %float_1
+               OpStore %x_GLF_color %399
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %400
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %404 = OpLabel
+        %405 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %405
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %132
+        %407 = OpLabel
+        %408 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %408
+        %409 = OpFunctionCall %void %main_1
+        %411 = OpLoad %v4float %x_GLF_color
+        %412 = OpCompositeConstruct %main_out %411
+        %410 = OpFunctionCall %void %tint_symbol_3 %412
+               OpReturn
+               OpFunctionEnd
+ %mergeSort_ = OpFunction %void None %132
+        %414 = OpLabel
+        %low = OpVariable %_ptr_Function_int Function %32
+       %high = OpVariable %_ptr_Function_int Function %32
+          %m = OpVariable %_ptr_Function_int Function %32
+        %i_2 = OpVariable %_ptr_Function_int Function %32
+     %from_1 = OpVariable %_ptr_Function_int Function %32
+      %mid_1 = OpVariable %_ptr_Function_int Function %32
+       %to_1 = OpVariable %_ptr_Function_int Function %32
+      %param = OpVariable %_ptr_Function_int Function %32
+    %param_1 = OpVariable %_ptr_Function_int Function %32
+    %param_2 = OpVariable %_ptr_Function_int Function %32
+               OpStore %low %int_0
+               OpStore %high %int_9
+               OpStore %m %int_1
+               OpBranch %425
+        %425 = OpLabel
+               OpLoopMerge %426 %427 None
+               OpBranch %428
+        %428 = OpLabel
+        %429 = OpLoad %int %m
+        %430 = OpLoad %int %high
+        %431 = OpSLessThanEqual %bool %429 %430
+               OpSelectionMerge %432 None
+               OpBranchConditional %431 %433 %434
+        %433 = OpLabel
+               OpBranch %432
+        %434 = OpLabel
+               OpBranch %426
+        %432 = OpLabel
+        %435 = OpLoad %int %low
+               OpStore %i_2 %435
+               OpBranch %436
+        %436 = OpLabel
+               OpLoopMerge %437 %438 None
+               OpBranch %439
+        %439 = OpLabel
+        %440 = OpLoad %int %i_2
+        %441 = OpLoad %int %high
+        %442 = OpSLessThan %bool %440 %441
+               OpSelectionMerge %443 None
+               OpBranchConditional %442 %444 %445
+        %444 = OpLabel
+               OpBranch %443
+        %445 = OpLabel
+               OpBranch %437
+        %443 = OpLabel
+        %446 = OpLoad %int %i_2
+               OpStore %from_1 %446
+        %447 = OpLoad %int %i_2
+        %448 = OpLoad %int %m
+        %449 = OpIAdd %int %447 %448
+        %450 = OpISub %int %449 %int_1
+               OpStore %mid_1 %450
+        %451 = OpLoad %int %i_2
+        %452 = OpLoad %int %m
+        %453 = OpLoad %int %high
+        %455 = OpIMul %int %int_2 %452
+        %456 = OpIAdd %int %451 %455
+        %457 = OpISub %int %456 %int_1
+        %454 = OpExtInst %int %255 SMin %457 %453
+               OpStore %to_1 %454
+        %458 = OpLoad %int %from_1
+               OpStore %param %458
+        %459 = OpLoad %int %mid_1
+               OpStore %param_1 %459
+        %460 = OpLoad %int %to_1
+               OpStore %param_2 %460
+        %461 = OpFunctionCall %void %merge_i1_i1_i1_ %param %param_1 %param_2
+               OpBranch %438
+        %438 = OpLabel
+        %465 = OpLoad %int %m
+        %466 = OpLoad %int %i_2
+        %467 = OpIMul %int %int_2 %465
+        %468 = OpIAdd %int %466 %467
+               OpStore %i_2 %468
+               OpBranch %436
+        %437 = OpLabel
+               OpBranch %427
+        %427 = OpLabel
+        %469 = OpLoad %int %m
+        %470 = OpIMul %int %int_2 %469
+               OpStore %m %470
+               OpBranch %425
+        %426 = OpLabel
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 157[%157] is not post dominated by the back-edge block 205[%205]
+  %205 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/2.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/2.spvasm.expected.wgsl
new file mode 100644
index 0000000..57c9c29
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/2.spvasm.expected.wgsl
@@ -0,0 +1,363 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> data : array<i32, 10>;
+
+var<private> temp : array<i32, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn merge_i1_i1_i1_(from : ptr<function, i32>, mid : ptr<function, i32>, to : ptr<function, i32>) {
+  var k : i32;
+  var i : i32;
+  var j : i32;
+  var i_1 : i32;
+  let x_302 : i32 = *(from);
+  k = x_302;
+  let x_303 : i32 = *(from);
+  i = x_303;
+  let x_304 : i32 = *(mid);
+  j = (x_304 + 1);
+  loop {
+    let x_310 : i32 = i;
+    let x_311 : i32 = *(mid);
+    let x_313 : i32 = j;
+    let x_314 : i32 = *(to);
+    if (((x_310 <= x_311) && (x_313 <= x_314))) {
+    } else {
+      break;
+    }
+    let x_318 : i32 = i;
+    let x_320 : i32 = data[x_318];
+    let x_321 : i32 = j;
+    let x_323 : i32 = data[x_321];
+    if ((x_320 < x_323)) {
+      let x_328 : i32 = k;
+      k = (x_328 + 1);
+      let x_330 : i32 = i;
+      i = (x_330 + 1);
+      let x_333 : i32 = data[x_330];
+      temp[x_328] = x_333;
+    } else {
+      let x_335 : i32 = k;
+      k = (x_335 + 1);
+      let x_337 : i32 = j;
+      j = (x_337 + 1);
+      let x_340 : i32 = data[x_337];
+      temp[x_335] = x_340;
+    }
+  }
+  loop {
+    let x_346 : i32 = i;
+    let x_348 : i32 = i;
+    let x_349 : i32 = *(mid);
+    if (((x_346 < 10) && (x_348 <= x_349))) {
+    } else {
+      break;
+    }
+    let x_353 : i32 = k;
+    k = (x_353 + 1);
+    let x_355 : i32 = i;
+    i = (x_355 + 1);
+    let x_358 : i32 = data[x_355];
+    temp[x_353] = x_358;
+  }
+  let x_360 : i32 = *(from);
+  i_1 = x_360;
+  loop {
+    let x_365 : i32 = i_1;
+    let x_366 : i32 = *(to);
+    if ((x_365 <= x_366)) {
+    } else {
+      break;
+    }
+    let x_369 : i32 = i_1;
+    let x_370 : i32 = i_1;
+    let x_372 : i32 = temp[x_370];
+    data[x_369] = x_372;
+
+    continuing {
+      let x_374 : i32 = i_1;
+      i_1 = (x_374 + 1);
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var x_85 : i32;
+  var x_86 : i32;
+  var x_87 : i32;
+  var x_88 : i32;
+  var x_89 : i32;
+  var x_90 : i32;
+  var x_91 : i32;
+  var x_92 : i32;
+  var x_93 : i32;
+  var x_94 : i32;
+  var i_3 : i32;
+  var j_1 : i32;
+  var grey : f32;
+  let x_96 : f32 = x_28.injectionSwitch.x;
+  i_3 = i32(x_96);
+  loop {
+    let x_102 : i32 = i_3;
+    switch(x_102) {
+      case 9: {
+        let x_132 : i32 = i_3;
+        data[x_132] = -5;
+      }
+      case 8: {
+        let x_130 : i32 = i_3;
+        data[x_130] = -4;
+      }
+      case 7: {
+        let x_128 : i32 = i_3;
+        data[x_128] = -3;
+      }
+      case 6: {
+        let x_126 : i32 = i_3;
+        data[x_126] = -2;
+      }
+      case 5: {
+        let x_124 : i32 = i_3;
+        data[x_124] = -1;
+      }
+      case 4: {
+        let x_122 : i32 = i_3;
+        data[x_122] = 0;
+      }
+      case 3: {
+        let x_120 : i32 = i_3;
+        data[x_120] = 1;
+      }
+      case 2: {
+        let x_118 : i32 = i_3;
+        data[x_118] = 2;
+      }
+      case 1: {
+        let x_116 : i32 = i_3;
+        data[x_116] = 3;
+      }
+      case 0: {
+        let x_114 : i32 = i_3;
+        data[x_114] = 4;
+      }
+      default: {
+      }
+    }
+    let x_134 : i32 = i_3;
+    i_3 = (x_134 + 1);
+
+    continuing {
+      let x_136 : i32 = i_3;
+      if ((x_136 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  loop {
+    let x_142 : i32 = j_1;
+    if ((x_142 < 10)) {
+    } else {
+      break;
+    }
+    let x_145 : i32 = j_1;
+    let x_146 : i32 = j_1;
+    let x_148 : i32 = data[x_146];
+    temp[x_145] = x_148;
+
+    continuing {
+      let x_150 : i32 = j_1;
+      j_1 = (x_150 + 1);
+    }
+  }
+  x_94 = 0;
+  x_93 = 9;
+  x_92 = 1;
+  loop {
+    let x_156 : i32 = x_92;
+    let x_157 : i32 = x_93;
+    if ((x_156 <= x_157)) {
+    } else {
+      break;
+    }
+    let x_160 : i32 = x_94;
+    x_91 = x_160;
+    loop {
+      let x_165 : i32 = x_91;
+      let x_166 : i32 = x_93;
+      if ((x_165 < x_166)) {
+      } else {
+        break;
+      }
+      let x_169 : i32 = x_91;
+      x_90 = x_169;
+      let x_170 : i32 = x_91;
+      let x_171 : i32 = x_92;
+      x_89 = ((x_170 + x_171) - 1);
+      let x_174 : i32 = x_91;
+      let x_175 : i32 = x_92;
+      let x_179 : i32 = x_93;
+      x_88 = min(((x_174 + (2 * x_175)) - 1), x_179);
+      let x_181 : i32 = x_90;
+      x_87 = x_181;
+      let x_182 : i32 = x_89;
+      x_86 = x_182;
+      let x_183 : i32 = x_88;
+      x_85 = x_183;
+      merge_i1_i1_i1_(&(x_87), &(x_86), &(x_85));
+
+      continuing {
+        let x_185 : i32 = x_92;
+        let x_187 : i32 = x_91;
+        x_91 = (x_187 + (2 * x_185));
+      }
+    }
+
+    continuing {
+      let x_189 : i32 = x_92;
+      x_92 = (2 * x_189);
+    }
+  }
+  let x_193 : f32 = gl_FragCoord.y;
+  if ((i32(x_193) < 30)) {
+    let x_200 : i32 = data[0];
+    grey = (0.5 + (f32(x_200) / 10.0));
+  } else {
+    let x_205 : f32 = gl_FragCoord.y;
+    if ((i32(x_205) < 60)) {
+      let x_212 : i32 = data[1];
+      grey = (0.5 + (f32(x_212) / 10.0));
+    } else {
+      let x_217 : f32 = gl_FragCoord.y;
+      if ((i32(x_217) < 90)) {
+        let x_224 : i32 = data[2];
+        grey = (0.5 + (f32(x_224) / 10.0));
+      } else {
+        let x_229 : f32 = gl_FragCoord.y;
+        if ((i32(x_229) < 120)) {
+          let x_236 : i32 = data[3];
+          grey = (0.5 + (f32(x_236) / 10.0));
+        } else {
+          let x_241 : f32 = gl_FragCoord.y;
+          if ((i32(x_241) < 150)) {
+            discard;
+          } else {
+            let x_248 : f32 = gl_FragCoord.y;
+            if ((i32(x_248) < 180)) {
+              let x_255 : i32 = data[5];
+              grey = (0.5 + (f32(x_255) / 10.0));
+            } else {
+              let x_260 : f32 = gl_FragCoord.y;
+              if ((i32(x_260) < 210)) {
+                let x_267 : i32 = data[6];
+                grey = (0.5 + (f32(x_267) / 10.0));
+              } else {
+                let x_272 : f32 = gl_FragCoord.y;
+                if ((i32(x_272) < 240)) {
+                  let x_279 : i32 = data[7];
+                  grey = (0.5 + (f32(x_279) / 10.0));
+                } else {
+                  let x_284 : f32 = gl_FragCoord.y;
+                  if ((i32(x_284) < 270)) {
+                    let x_291 : i32 = data[8];
+                    grey = (0.5 + (f32(x_291) / 10.0));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  let x_295 : f32 = grey;
+  let x_296 : vec3<f32> = vec3<f32>(x_295, x_295, x_295);
+  x_GLF_color = vec4<f32>(x_296.x, x_296.y, x_296.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+fn mergeSort_() {
+  var low : i32;
+  var high : i32;
+  var m : i32;
+  var i_2 : i32;
+  var from_1 : i32;
+  var mid_1 : i32;
+  var to_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  low = 0;
+  high = 9;
+  m = 1;
+  loop {
+    let x_381 : i32 = m;
+    let x_382 : i32 = high;
+    if ((x_381 <= x_382)) {
+    } else {
+      break;
+    }
+    let x_385 : i32 = low;
+    i_2 = x_385;
+    loop {
+      let x_390 : i32 = i_2;
+      let x_391 : i32 = high;
+      if ((x_390 < x_391)) {
+      } else {
+        break;
+      }
+      let x_394 : i32 = i_2;
+      from_1 = x_394;
+      let x_395 : i32 = i_2;
+      let x_396 : i32 = m;
+      mid_1 = ((x_395 + x_396) - 1);
+      let x_399 : i32 = i_2;
+      let x_400 : i32 = m;
+      let x_404 : i32 = high;
+      to_1 = min(((x_399 + (2 * x_400)) - 1), x_404);
+      let x_406 : i32 = from_1;
+      param = x_406;
+      let x_407 : i32 = mid_1;
+      param_1 = x_407;
+      let x_408 : i32 = to_1;
+      param_2 = x_408;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2));
+
+      continuing {
+        let x_410 : i32 = m;
+        let x_412 : i32 = i_2;
+        i_2 = (x_412 + (2 * x_410));
+      }
+    }
+
+    continuing {
+      let x_414 : i32 = m;
+      m = (2 * x_414);
+    }
+  }
+  return;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/2.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/2.wgsl
new file mode 100644
index 0000000..57c9c29
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/2.wgsl
@@ -0,0 +1,363 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> data : array<i32, 10>;
+
+var<private> temp : array<i32, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn merge_i1_i1_i1_(from : ptr<function, i32>, mid : ptr<function, i32>, to : ptr<function, i32>) {
+  var k : i32;
+  var i : i32;
+  var j : i32;
+  var i_1 : i32;
+  let x_302 : i32 = *(from);
+  k = x_302;
+  let x_303 : i32 = *(from);
+  i = x_303;
+  let x_304 : i32 = *(mid);
+  j = (x_304 + 1);
+  loop {
+    let x_310 : i32 = i;
+    let x_311 : i32 = *(mid);
+    let x_313 : i32 = j;
+    let x_314 : i32 = *(to);
+    if (((x_310 <= x_311) && (x_313 <= x_314))) {
+    } else {
+      break;
+    }
+    let x_318 : i32 = i;
+    let x_320 : i32 = data[x_318];
+    let x_321 : i32 = j;
+    let x_323 : i32 = data[x_321];
+    if ((x_320 < x_323)) {
+      let x_328 : i32 = k;
+      k = (x_328 + 1);
+      let x_330 : i32 = i;
+      i = (x_330 + 1);
+      let x_333 : i32 = data[x_330];
+      temp[x_328] = x_333;
+    } else {
+      let x_335 : i32 = k;
+      k = (x_335 + 1);
+      let x_337 : i32 = j;
+      j = (x_337 + 1);
+      let x_340 : i32 = data[x_337];
+      temp[x_335] = x_340;
+    }
+  }
+  loop {
+    let x_346 : i32 = i;
+    let x_348 : i32 = i;
+    let x_349 : i32 = *(mid);
+    if (((x_346 < 10) && (x_348 <= x_349))) {
+    } else {
+      break;
+    }
+    let x_353 : i32 = k;
+    k = (x_353 + 1);
+    let x_355 : i32 = i;
+    i = (x_355 + 1);
+    let x_358 : i32 = data[x_355];
+    temp[x_353] = x_358;
+  }
+  let x_360 : i32 = *(from);
+  i_1 = x_360;
+  loop {
+    let x_365 : i32 = i_1;
+    let x_366 : i32 = *(to);
+    if ((x_365 <= x_366)) {
+    } else {
+      break;
+    }
+    let x_369 : i32 = i_1;
+    let x_370 : i32 = i_1;
+    let x_372 : i32 = temp[x_370];
+    data[x_369] = x_372;
+
+    continuing {
+      let x_374 : i32 = i_1;
+      i_1 = (x_374 + 1);
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var x_85 : i32;
+  var x_86 : i32;
+  var x_87 : i32;
+  var x_88 : i32;
+  var x_89 : i32;
+  var x_90 : i32;
+  var x_91 : i32;
+  var x_92 : i32;
+  var x_93 : i32;
+  var x_94 : i32;
+  var i_3 : i32;
+  var j_1 : i32;
+  var grey : f32;
+  let x_96 : f32 = x_28.injectionSwitch.x;
+  i_3 = i32(x_96);
+  loop {
+    let x_102 : i32 = i_3;
+    switch(x_102) {
+      case 9: {
+        let x_132 : i32 = i_3;
+        data[x_132] = -5;
+      }
+      case 8: {
+        let x_130 : i32 = i_3;
+        data[x_130] = -4;
+      }
+      case 7: {
+        let x_128 : i32 = i_3;
+        data[x_128] = -3;
+      }
+      case 6: {
+        let x_126 : i32 = i_3;
+        data[x_126] = -2;
+      }
+      case 5: {
+        let x_124 : i32 = i_3;
+        data[x_124] = -1;
+      }
+      case 4: {
+        let x_122 : i32 = i_3;
+        data[x_122] = 0;
+      }
+      case 3: {
+        let x_120 : i32 = i_3;
+        data[x_120] = 1;
+      }
+      case 2: {
+        let x_118 : i32 = i_3;
+        data[x_118] = 2;
+      }
+      case 1: {
+        let x_116 : i32 = i_3;
+        data[x_116] = 3;
+      }
+      case 0: {
+        let x_114 : i32 = i_3;
+        data[x_114] = 4;
+      }
+      default: {
+      }
+    }
+    let x_134 : i32 = i_3;
+    i_3 = (x_134 + 1);
+
+    continuing {
+      let x_136 : i32 = i_3;
+      if ((x_136 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  loop {
+    let x_142 : i32 = j_1;
+    if ((x_142 < 10)) {
+    } else {
+      break;
+    }
+    let x_145 : i32 = j_1;
+    let x_146 : i32 = j_1;
+    let x_148 : i32 = data[x_146];
+    temp[x_145] = x_148;
+
+    continuing {
+      let x_150 : i32 = j_1;
+      j_1 = (x_150 + 1);
+    }
+  }
+  x_94 = 0;
+  x_93 = 9;
+  x_92 = 1;
+  loop {
+    let x_156 : i32 = x_92;
+    let x_157 : i32 = x_93;
+    if ((x_156 <= x_157)) {
+    } else {
+      break;
+    }
+    let x_160 : i32 = x_94;
+    x_91 = x_160;
+    loop {
+      let x_165 : i32 = x_91;
+      let x_166 : i32 = x_93;
+      if ((x_165 < x_166)) {
+      } else {
+        break;
+      }
+      let x_169 : i32 = x_91;
+      x_90 = x_169;
+      let x_170 : i32 = x_91;
+      let x_171 : i32 = x_92;
+      x_89 = ((x_170 + x_171) - 1);
+      let x_174 : i32 = x_91;
+      let x_175 : i32 = x_92;
+      let x_179 : i32 = x_93;
+      x_88 = min(((x_174 + (2 * x_175)) - 1), x_179);
+      let x_181 : i32 = x_90;
+      x_87 = x_181;
+      let x_182 : i32 = x_89;
+      x_86 = x_182;
+      let x_183 : i32 = x_88;
+      x_85 = x_183;
+      merge_i1_i1_i1_(&(x_87), &(x_86), &(x_85));
+
+      continuing {
+        let x_185 : i32 = x_92;
+        let x_187 : i32 = x_91;
+        x_91 = (x_187 + (2 * x_185));
+      }
+    }
+
+    continuing {
+      let x_189 : i32 = x_92;
+      x_92 = (2 * x_189);
+    }
+  }
+  let x_193 : f32 = gl_FragCoord.y;
+  if ((i32(x_193) < 30)) {
+    let x_200 : i32 = data[0];
+    grey = (0.5 + (f32(x_200) / 10.0));
+  } else {
+    let x_205 : f32 = gl_FragCoord.y;
+    if ((i32(x_205) < 60)) {
+      let x_212 : i32 = data[1];
+      grey = (0.5 + (f32(x_212) / 10.0));
+    } else {
+      let x_217 : f32 = gl_FragCoord.y;
+      if ((i32(x_217) < 90)) {
+        let x_224 : i32 = data[2];
+        grey = (0.5 + (f32(x_224) / 10.0));
+      } else {
+        let x_229 : f32 = gl_FragCoord.y;
+        if ((i32(x_229) < 120)) {
+          let x_236 : i32 = data[3];
+          grey = (0.5 + (f32(x_236) / 10.0));
+        } else {
+          let x_241 : f32 = gl_FragCoord.y;
+          if ((i32(x_241) < 150)) {
+            discard;
+          } else {
+            let x_248 : f32 = gl_FragCoord.y;
+            if ((i32(x_248) < 180)) {
+              let x_255 : i32 = data[5];
+              grey = (0.5 + (f32(x_255) / 10.0));
+            } else {
+              let x_260 : f32 = gl_FragCoord.y;
+              if ((i32(x_260) < 210)) {
+                let x_267 : i32 = data[6];
+                grey = (0.5 + (f32(x_267) / 10.0));
+              } else {
+                let x_272 : f32 = gl_FragCoord.y;
+                if ((i32(x_272) < 240)) {
+                  let x_279 : i32 = data[7];
+                  grey = (0.5 + (f32(x_279) / 10.0));
+                } else {
+                  let x_284 : f32 = gl_FragCoord.y;
+                  if ((i32(x_284) < 270)) {
+                    let x_291 : i32 = data[8];
+                    grey = (0.5 + (f32(x_291) / 10.0));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  let x_295 : f32 = grey;
+  let x_296 : vec3<f32> = vec3<f32>(x_295, x_295, x_295);
+  x_GLF_color = vec4<f32>(x_296.x, x_296.y, x_296.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+fn mergeSort_() {
+  var low : i32;
+  var high : i32;
+  var m : i32;
+  var i_2 : i32;
+  var from_1 : i32;
+  var mid_1 : i32;
+  var to_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  low = 0;
+  high = 9;
+  m = 1;
+  loop {
+    let x_381 : i32 = m;
+    let x_382 : i32 = high;
+    if ((x_381 <= x_382)) {
+    } else {
+      break;
+    }
+    let x_385 : i32 = low;
+    i_2 = x_385;
+    loop {
+      let x_390 : i32 = i_2;
+      let x_391 : i32 = high;
+      if ((x_390 < x_391)) {
+      } else {
+        break;
+      }
+      let x_394 : i32 = i_2;
+      from_1 = x_394;
+      let x_395 : i32 = i_2;
+      let x_396 : i32 = m;
+      mid_1 = ((x_395 + x_396) - 1);
+      let x_399 : i32 = i_2;
+      let x_400 : i32 = m;
+      let x_404 : i32 = high;
+      to_1 = min(((x_399 + (2 * x_400)) - 1), x_404);
+      let x_406 : i32 = from_1;
+      param = x_406;
+      let x_407 : i32 = mid_1;
+      param_1 = x_407;
+      let x_408 : i32 = to_1;
+      param_2 = x_408;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2));
+
+      continuing {
+        let x_410 : i32 = m;
+        let x_412 : i32 = i_2;
+        i_2 = (x_412 + (2 * x_410));
+      }
+    }
+
+    continuing {
+      let x_414 : i32 = m;
+      m = (2 * x_414);
+    }
+  }
+  return;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/2.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/2.wgsl.expected.hlsl
new file mode 100644
index 0000000..30e945e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/2.wgsl.expected.hlsl
@@ -0,0 +1,296 @@
+static int data[10] = (int[10])0;
+static int temp[10] = (int[10])0;
+cbuffer cbuffer_x_28 : register(b0, space0) {
+  uint4 x_28[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void merge_i1_i1_i1_(inout int from, inout int mid, inout int to) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  const int x_302 = from;
+  k = x_302;
+  const int x_303 = from;
+  i = x_303;
+  const int x_304 = mid;
+  j = (x_304 + 1);
+  while (true) {
+    const int x_310 = i;
+    const int x_311 = mid;
+    const int x_313 = j;
+    const int x_314 = to;
+    bool tint_tmp = (x_310 <= x_311);
+    if (tint_tmp) {
+      tint_tmp = (x_313 <= x_314);
+    }
+    if ((tint_tmp)) {
+    } else {
+      break;
+    }
+    const int x_320 = data[i];
+    const int x_323 = data[j];
+    if ((x_320 < x_323)) {
+      const int x_328 = k;
+      k = (x_328 + 1);
+      const int x_330 = i;
+      i = (x_330 + 1);
+      const int x_333 = data[x_330];
+      temp[x_328] = x_333;
+    } else {
+      const int x_335 = k;
+      k = (x_335 + 1);
+      const int x_337 = j;
+      j = (x_337 + 1);
+      const int x_340 = data[x_337];
+      temp[x_335] = x_340;
+    }
+  }
+  while (true) {
+    const int x_346 = i;
+    const int x_348 = i;
+    const int x_349 = mid;
+    bool tint_tmp_1 = (x_346 < 10);
+    if (tint_tmp_1) {
+      tint_tmp_1 = (x_348 <= x_349);
+    }
+    if ((tint_tmp_1)) {
+    } else {
+      break;
+    }
+    const int x_353 = k;
+    k = (x_353 + 1);
+    const int x_355 = i;
+    i = (x_355 + 1);
+    const int x_358 = data[x_355];
+    temp[x_353] = x_358;
+  }
+  const int x_360 = from;
+  i_1 = x_360;
+  while (true) {
+    const int x_365 = i_1;
+    const int x_366 = to;
+    if ((x_365 <= x_366)) {
+    } else {
+      break;
+    }
+    const int x_369 = i_1;
+    const int x_372 = temp[i_1];
+    data[x_369] = x_372;
+    {
+      i_1 = (i_1 + 1);
+    }
+  }
+  return;
+}
+
+void main_1() {
+  int x_85 = 0;
+  int x_86 = 0;
+  int x_87 = 0;
+  int x_88 = 0;
+  int x_89 = 0;
+  int x_90 = 0;
+  int x_91 = 0;
+  int x_92 = 0;
+  int x_93 = 0;
+  int x_94 = 0;
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  const float x_96 = asfloat(x_28[0].x);
+  i_3 = int(x_96);
+  while (true) {
+    switch(i_3) {
+      case 9: {
+        data[i_3] = -5;
+        break;
+      }
+      case 8: {
+        data[i_3] = -4;
+        break;
+      }
+      case 7: {
+        data[i_3] = -3;
+        break;
+      }
+      case 6: {
+        data[i_3] = -2;
+        break;
+      }
+      case 5: {
+        data[i_3] = -1;
+        break;
+      }
+      case 4: {
+        data[i_3] = 0;
+        break;
+      }
+      case 3: {
+        data[i_3] = 1;
+        break;
+      }
+      case 2: {
+        data[i_3] = 2;
+        break;
+      }
+      case 1: {
+        data[i_3] = 3;
+        break;
+      }
+      case 0: {
+        data[i_3] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    i_3 = (i_3 + 1);
+    {
+      if ((i_3 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  {
+    for(; (j_1 < 10); j_1 = (j_1 + 1)) {
+      const int x_145 = j_1;
+      const int x_148 = data[j_1];
+      temp[x_145] = x_148;
+    }
+  }
+  x_94 = 0;
+  x_93 = 9;
+  x_92 = 1;
+  {
+    for(; (x_92 <= x_93); x_92 = (2 * x_92)) {
+      x_91 = x_94;
+      {
+        for(; (x_91 < x_93); x_91 = (x_91 + (2 * x_92))) {
+          x_90 = x_91;
+          x_89 = ((x_91 + x_92) - 1);
+          x_88 = min(((x_91 + (2 * x_92)) - 1), x_93);
+          x_87 = x_90;
+          x_86 = x_89;
+          x_85 = x_88;
+          merge_i1_i1_i1_(x_87, x_86, x_85);
+        }
+      }
+    }
+  }
+  const float x_193 = gl_FragCoord.y;
+  if ((int(x_193) < 30)) {
+    const int x_200 = data[0];
+    grey = (0.5f + (float(x_200) / 10.0f));
+  } else {
+    const float x_205 = gl_FragCoord.y;
+    if ((int(x_205) < 60)) {
+      const int x_212 = data[1];
+      grey = (0.5f + (float(x_212) / 10.0f));
+    } else {
+      const float x_217 = gl_FragCoord.y;
+      if ((int(x_217) < 90)) {
+        const int x_224 = data[2];
+        grey = (0.5f + (float(x_224) / 10.0f));
+      } else {
+        const float x_229 = gl_FragCoord.y;
+        if ((int(x_229) < 120)) {
+          const int x_236 = data[3];
+          grey = (0.5f + (float(x_236) / 10.0f));
+        } else {
+          const float x_241 = gl_FragCoord.y;
+          if ((int(x_241) < 150)) {
+            discard;
+          } else {
+            const float x_248 = gl_FragCoord.y;
+            if ((int(x_248) < 180)) {
+              const int x_255 = data[5];
+              grey = (0.5f + (float(x_255) / 10.0f));
+            } else {
+              const float x_260 = gl_FragCoord.y;
+              if ((int(x_260) < 210)) {
+                const int x_267 = data[6];
+                grey = (0.5f + (float(x_267) / 10.0f));
+              } else {
+                const float x_272 = gl_FragCoord.y;
+                if ((int(x_272) < 240)) {
+                  const int x_279 = data[7];
+                  grey = (0.5f + (float(x_279) / 10.0f));
+                } else {
+                  const float x_284 = gl_FragCoord.y;
+                  if ((int(x_284) < 270)) {
+                    const int x_291 = data[8];
+                    grey = (0.5f + (float(x_291) / 10.0f));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  const float x_295 = grey;
+  const float3 x_296 = float3(x_295, x_295, x_295);
+  x_GLF_color = float4(x_296.x, x_296.y, x_296.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
+void mergeSort_() {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  {
+    for(; (m <= high); m = (2 * m)) {
+      i_2 = low;
+      {
+        for(; (i_2 < high); i_2 = (i_2 + (2 * m))) {
+          from_1 = i_2;
+          mid_1 = ((i_2 + m) - 1);
+          to_1 = min(((i_2 + (2 * m)) - 1), high);
+          param = from_1;
+          param_1 = mid_1;
+          param_2 = to_1;
+          merge_i1_i1_i1_(param, param_1, param_2);
+        }
+      }
+    }
+  }
+  return;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/2.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/2.wgsl.expected.msl
new file mode 100644
index 0000000..a550d0f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/2.wgsl.expected.msl
@@ -0,0 +1,369 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void merge_i1_i1_i1_(thread int* const from, thread int* const mid, thread int* const to, thread tint_array_wrapper* const tint_symbol_5, thread tint_array_wrapper* const tint_symbol_6) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  int const x_302 = *(from);
+  k = x_302;
+  int const x_303 = *(from);
+  i = x_303;
+  int const x_304 = *(mid);
+  j = (x_304 + 1);
+  while (true) {
+    int const x_310 = i;
+    int const x_311 = *(mid);
+    int const x_313 = j;
+    int const x_314 = *(to);
+    if (((x_310 <= x_311) && (x_313 <= x_314))) {
+    } else {
+      break;
+    }
+    int const x_318 = i;
+    int const x_320 = (*(tint_symbol_5)).arr[x_318];
+    int const x_321 = j;
+    int const x_323 = (*(tint_symbol_5)).arr[x_321];
+    if ((x_320 < x_323)) {
+      int const x_328 = k;
+      k = (x_328 + 1);
+      int const x_330 = i;
+      i = (x_330 + 1);
+      int const x_333 = (*(tint_symbol_5)).arr[x_330];
+      (*(tint_symbol_6)).arr[x_328] = x_333;
+    } else {
+      int const x_335 = k;
+      k = (x_335 + 1);
+      int const x_337 = j;
+      j = (x_337 + 1);
+      int const x_340 = (*(tint_symbol_5)).arr[x_337];
+      (*(tint_symbol_6)).arr[x_335] = x_340;
+    }
+  }
+  while (true) {
+    int const x_346 = i;
+    int const x_348 = i;
+    int const x_349 = *(mid);
+    if (((x_346 < 10) && (x_348 <= x_349))) {
+    } else {
+      break;
+    }
+    int const x_353 = k;
+    k = (x_353 + 1);
+    int const x_355 = i;
+    i = (x_355 + 1);
+    int const x_358 = (*(tint_symbol_5)).arr[x_355];
+    (*(tint_symbol_6)).arr[x_353] = x_358;
+  }
+  int const x_360 = *(from);
+  i_1 = x_360;
+  while (true) {
+    int const x_365 = i_1;
+    int const x_366 = *(to);
+    if ((x_365 <= x_366)) {
+    } else {
+      break;
+    }
+    int const x_369 = i_1;
+    int const x_370 = i_1;
+    int const x_372 = (*(tint_symbol_6)).arr[x_370];
+    (*(tint_symbol_5)).arr[x_369] = x_372;
+    {
+      int const x_374 = i_1;
+      i_1 = (x_374 + 1);
+    }
+  }
+  return;
+}
+
+void main_1(constant buf0& x_28, thread tint_array_wrapper* const tint_symbol_7, thread tint_array_wrapper* const tint_symbol_8, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10) {
+  int x_85 = 0;
+  int x_86 = 0;
+  int x_87 = 0;
+  int x_88 = 0;
+  int x_89 = 0;
+  int x_90 = 0;
+  int x_91 = 0;
+  int x_92 = 0;
+  int x_93 = 0;
+  int x_94 = 0;
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  float const x_96 = x_28.injectionSwitch.x;
+  i_3 = int(x_96);
+  while (true) {
+    int const x_102 = i_3;
+    switch(x_102) {
+      case 9: {
+        int const x_132 = i_3;
+        (*(tint_symbol_7)).arr[x_132] = -5;
+        break;
+      }
+      case 8: {
+        int const x_130 = i_3;
+        (*(tint_symbol_7)).arr[x_130] = -4;
+        break;
+      }
+      case 7: {
+        int const x_128 = i_3;
+        (*(tint_symbol_7)).arr[x_128] = -3;
+        break;
+      }
+      case 6: {
+        int const x_126 = i_3;
+        (*(tint_symbol_7)).arr[x_126] = -2;
+        break;
+      }
+      case 5: {
+        int const x_124 = i_3;
+        (*(tint_symbol_7)).arr[x_124] = -1;
+        break;
+      }
+      case 4: {
+        int const x_122 = i_3;
+        (*(tint_symbol_7)).arr[x_122] = 0;
+        break;
+      }
+      case 3: {
+        int const x_120 = i_3;
+        (*(tint_symbol_7)).arr[x_120] = 1;
+        break;
+      }
+      case 2: {
+        int const x_118 = i_3;
+        (*(tint_symbol_7)).arr[x_118] = 2;
+        break;
+      }
+      case 1: {
+        int const x_116 = i_3;
+        (*(tint_symbol_7)).arr[x_116] = 3;
+        break;
+      }
+      case 0: {
+        int const x_114 = i_3;
+        (*(tint_symbol_7)).arr[x_114] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    int const x_134 = i_3;
+    i_3 = (x_134 + 1);
+    {
+      int const x_136 = i_3;
+      if ((x_136 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  while (true) {
+    int const x_142 = j_1;
+    if ((x_142 < 10)) {
+    } else {
+      break;
+    }
+    int const x_145 = j_1;
+    int const x_146 = j_1;
+    int const x_148 = (*(tint_symbol_7)).arr[x_146];
+    (*(tint_symbol_8)).arr[x_145] = x_148;
+    {
+      int const x_150 = j_1;
+      j_1 = (x_150 + 1);
+    }
+  }
+  x_94 = 0;
+  x_93 = 9;
+  x_92 = 1;
+  while (true) {
+    int const x_156 = x_92;
+    int const x_157 = x_93;
+    if ((x_156 <= x_157)) {
+    } else {
+      break;
+    }
+    int const x_160 = x_94;
+    x_91 = x_160;
+    while (true) {
+      int const x_165 = x_91;
+      int const x_166 = x_93;
+      if ((x_165 < x_166)) {
+      } else {
+        break;
+      }
+      int const x_169 = x_91;
+      x_90 = x_169;
+      int const x_170 = x_91;
+      int const x_171 = x_92;
+      x_89 = ((x_170 + x_171) - 1);
+      int const x_174 = x_91;
+      int const x_175 = x_92;
+      int const x_179 = x_93;
+      x_88 = min(((x_174 + (2 * x_175)) - 1), x_179);
+      int const x_181 = x_90;
+      x_87 = x_181;
+      int const x_182 = x_89;
+      x_86 = x_182;
+      int const x_183 = x_88;
+      x_85 = x_183;
+      merge_i1_i1_i1_(&(x_87), &(x_86), &(x_85), tint_symbol_7, tint_symbol_8);
+      {
+        int const x_185 = x_92;
+        int const x_187 = x_91;
+        x_91 = (x_187 + (2 * x_185));
+      }
+    }
+    {
+      int const x_189 = x_92;
+      x_92 = (2 * x_189);
+    }
+  }
+  float const x_193 = (*(tint_symbol_9)).y;
+  if ((int(x_193) < 30)) {
+    int const x_200 = (*(tint_symbol_7)).arr[0];
+    grey = (0.5f + (float(x_200) / 10.0f));
+  } else {
+    float const x_205 = (*(tint_symbol_9)).y;
+    if ((int(x_205) < 60)) {
+      int const x_212 = (*(tint_symbol_7)).arr[1];
+      grey = (0.5f + (float(x_212) / 10.0f));
+    } else {
+      float const x_217 = (*(tint_symbol_9)).y;
+      if ((int(x_217) < 90)) {
+        int const x_224 = (*(tint_symbol_7)).arr[2];
+        grey = (0.5f + (float(x_224) / 10.0f));
+      } else {
+        float const x_229 = (*(tint_symbol_9)).y;
+        if ((int(x_229) < 120)) {
+          int const x_236 = (*(tint_symbol_7)).arr[3];
+          grey = (0.5f + (float(x_236) / 10.0f));
+        } else {
+          float const x_241 = (*(tint_symbol_9)).y;
+          if ((int(x_241) < 150)) {
+            discard_fragment();
+          } else {
+            float const x_248 = (*(tint_symbol_9)).y;
+            if ((int(x_248) < 180)) {
+              int const x_255 = (*(tint_symbol_7)).arr[5];
+              grey = (0.5f + (float(x_255) / 10.0f));
+            } else {
+              float const x_260 = (*(tint_symbol_9)).y;
+              if ((int(x_260) < 210)) {
+                int const x_267 = (*(tint_symbol_7)).arr[6];
+                grey = (0.5f + (float(x_267) / 10.0f));
+              } else {
+                float const x_272 = (*(tint_symbol_9)).y;
+                if ((int(x_272) < 240)) {
+                  int const x_279 = (*(tint_symbol_7)).arr[7];
+                  grey = (0.5f + (float(x_279) / 10.0f));
+                } else {
+                  float const x_284 = (*(tint_symbol_9)).y;
+                  if ((int(x_284) < 270)) {
+                    int const x_291 = (*(tint_symbol_7)).arr[8];
+                    grey = (0.5f + (float(x_291) / 10.0f));
+                  } else {
+                    discard_fragment();
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  float const x_295 = grey;
+  float3 const x_296 = float3(x_295, x_295, x_295);
+  *(tint_symbol_10) = float4(x_296.x, x_296.y, x_296.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_28 [[buffer(0)]]) {
+  thread float4 tint_symbol_11 = 0.0f;
+  thread tint_array_wrapper tint_symbol_12 = {};
+  thread tint_array_wrapper tint_symbol_13 = {};
+  thread float4 tint_symbol_14 = 0.0f;
+  tint_symbol_11 = gl_FragCoord_param;
+  main_1(x_28, &(tint_symbol_12), &(tint_symbol_13), &(tint_symbol_11), &(tint_symbol_14));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_14};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
+void mergeSort_(thread tint_array_wrapper* const tint_symbol_15, thread tint_array_wrapper* const tint_symbol_16) {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  while (true) {
+    int const x_381 = m;
+    int const x_382 = high;
+    if ((x_381 <= x_382)) {
+    } else {
+      break;
+    }
+    int const x_385 = low;
+    i_2 = x_385;
+    while (true) {
+      int const x_390 = i_2;
+      int const x_391 = high;
+      if ((x_390 < x_391)) {
+      } else {
+        break;
+      }
+      int const x_394 = i_2;
+      from_1 = x_394;
+      int const x_395 = i_2;
+      int const x_396 = m;
+      mid_1 = ((x_395 + x_396) - 1);
+      int const x_399 = i_2;
+      int const x_400 = m;
+      int const x_404 = high;
+      to_1 = min(((x_399 + (2 * x_400)) - 1), x_404);
+      int const x_406 = from_1;
+      param = x_406;
+      int const x_407 = mid_1;
+      param_1 = x_407;
+      int const x_408 = to_1;
+      param_2 = x_408;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2), tint_symbol_15, tint_symbol_16);
+      {
+        int const x_410 = m;
+        int const x_412 = i_2;
+        i_2 = (x_412 + (2 * x_410));
+      }
+    }
+    {
+      int const x_414 = m;
+      m = (2 * x_414);
+    }
+  }
+  return;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/2.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/2.wgsl.expected.spvasm
new file mode 100644
index 0000000..5cce2a6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/2.wgsl.expected.spvasm
@@ -0,0 +1,741 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 471
+; Schema: 0
+               OpCapability Shader
+        %255 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %data "data"
+               OpName %temp "temp"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_28 "x_28"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %merge_i1_i1_i1_ "merge_i1_i1_i1_"
+               OpName %from "from"
+               OpName %mid "mid"
+               OpName %to "to"
+               OpName %k "k"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %i_1 "i_1"
+               OpName %main_1 "main_1"
+               OpName %x_85 "x_85"
+               OpName %x_86 "x_86"
+               OpName %x_87 "x_87"
+               OpName %x_88 "x_88"
+               OpName %x_89 "x_89"
+               OpName %x_90 "x_90"
+               OpName %x_91 "x_91"
+               OpName %x_92 "x_92"
+               OpName %x_93 "x_93"
+               OpName %x_94 "x_94"
+               OpName %i_3 "i_3"
+               OpName %j_1 "j_1"
+               OpName %grey "grey"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpName %mergeSort_ "mergeSort_"
+               OpName %low "low"
+               OpName %high "high"
+               OpName %m "m"
+               OpName %i_2 "i_2"
+               OpName %from_1 "from_1"
+               OpName %mid_1 "mid_1"
+               OpName %to_1 "to_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_28 NonWritable
+               OpDecorate %x_28 DescriptorSet 0
+               OpDecorate %x_28 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Private__arr_int_uint_10 = OpTypePointer Private %_arr_int_uint_10
+          %7 = OpConstantNull %_arr_int_uint_10
+       %data = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+       %temp = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_28 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %17
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int %_ptr_Function_int
+         %32 = OpConstantNull %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+%_ptr_Private_int = OpTypePointer Private %int
+     %int_10 = OpConstant %int 10
+        %132 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+        %149 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %int_n5 = OpConstant %int -5
+     %int_n4 = OpConstant %int -4
+     %int_n3 = OpConstant %int -3
+     %int_n2 = OpConstant %int -2
+     %int_n1 = OpConstant %int -1
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+      %int_9 = OpConstant %int 9
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %int_30 = OpConstant %int 30
+  %float_0_5 = OpConstant %float 0.5
+   %float_10 = OpConstant %float 10
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+    %v3float = OpTypeVector %float 3
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %400 = OpTypeFunction %void %main_out
+%merge_i1_i1_i1_ = OpFunction %void None %23
+       %from = OpFunctionParameter %_ptr_Function_int
+        %mid = OpFunctionParameter %_ptr_Function_int
+         %to = OpFunctionParameter %_ptr_Function_int
+         %30 = OpLabel
+          %k = OpVariable %_ptr_Function_int Function %32
+          %i = OpVariable %_ptr_Function_int Function %32
+          %j = OpVariable %_ptr_Function_int Function %32
+        %i_1 = OpVariable %_ptr_Function_int Function %32
+         %37 = OpLoad %int %from
+               OpStore %k %37
+         %39 = OpLoad %int %from
+               OpStore %i %39
+         %41 = OpLoad %int %mid
+         %43 = OpIAdd %int %41 %int_1
+               OpStore %j %43
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %48 = OpLoad %int %i
+         %50 = OpLoad %int %mid
+         %51 = OpLoad %int %j
+         %53 = OpLoad %int %to
+         %54 = OpSLessThanEqual %bool %48 %50
+               OpSelectionMerge %56 None
+               OpBranchConditional %54 %57 %56
+         %57 = OpLabel
+         %58 = OpSLessThanEqual %bool %51 %53
+               OpBranch %56
+         %56 = OpLabel
+         %59 = OpPhi %bool %54 %47 %58 %57
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %62
+         %61 = OpLabel
+               OpBranch %60
+         %62 = OpLabel
+               OpBranch %45
+         %60 = OpLabel
+         %63 = OpLoad %int %i
+         %65 = OpAccessChain %_ptr_Private_int %data %63
+         %66 = OpLoad %int %65
+         %67 = OpLoad %int %j
+         %68 = OpAccessChain %_ptr_Private_int %data %67
+         %69 = OpLoad %int %68
+         %70 = OpSLessThan %bool %66 %69
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %73
+         %72 = OpLabel
+         %74 = OpLoad %int %k
+         %75 = OpIAdd %int %74 %int_1
+               OpStore %k %75
+         %76 = OpLoad %int %i
+         %77 = OpIAdd %int %76 %int_1
+               OpStore %i %77
+         %78 = OpAccessChain %_ptr_Private_int %data %76
+         %79 = OpLoad %int %78
+         %80 = OpAccessChain %_ptr_Private_int %temp %74
+               OpStore %80 %79
+               OpBranch %71
+         %73 = OpLabel
+         %81 = OpLoad %int %k
+         %82 = OpIAdd %int %81 %int_1
+               OpStore %k %82
+         %83 = OpLoad %int %j
+         %84 = OpIAdd %int %83 %int_1
+               OpStore %j %84
+         %85 = OpAccessChain %_ptr_Private_int %data %83
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_Private_int %temp %81
+               OpStore %87 %86
+               OpBranch %71
+         %71 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+               OpBranch %44
+         %45 = OpLabel
+               OpBranch %88
+         %88 = OpLabel
+               OpLoopMerge %89 %90 None
+               OpBranch %91
+         %91 = OpLabel
+         %92 = OpLoad %int %i
+         %93 = OpLoad %int %i
+         %95 = OpLoad %int %mid
+         %97 = OpSLessThan %bool %92 %int_10
+               OpSelectionMerge %98 None
+               OpBranchConditional %97 %99 %98
+         %99 = OpLabel
+        %100 = OpSLessThanEqual %bool %93 %95
+               OpBranch %98
+         %98 = OpLabel
+        %101 = OpPhi %bool %97 %91 %100 %99
+               OpSelectionMerge %102 None
+               OpBranchConditional %101 %103 %104
+        %103 = OpLabel
+               OpBranch %102
+        %104 = OpLabel
+               OpBranch %89
+        %102 = OpLabel
+        %105 = OpLoad %int %k
+        %106 = OpIAdd %int %105 %int_1
+               OpStore %k %106
+        %107 = OpLoad %int %i
+        %108 = OpIAdd %int %107 %int_1
+               OpStore %i %108
+        %109 = OpAccessChain %_ptr_Private_int %data %107
+        %110 = OpLoad %int %109
+        %111 = OpAccessChain %_ptr_Private_int %temp %105
+               OpStore %111 %110
+               OpBranch %90
+         %90 = OpLabel
+               OpBranch %88
+         %89 = OpLabel
+        %113 = OpLoad %int %from
+               OpStore %i_1 %113
+               OpBranch %114
+        %114 = OpLabel
+               OpLoopMerge %115 %116 None
+               OpBranch %117
+        %117 = OpLabel
+        %118 = OpLoad %int %i_1
+        %120 = OpLoad %int %to
+        %121 = OpSLessThanEqual %bool %118 %120
+               OpSelectionMerge %122 None
+               OpBranchConditional %121 %123 %124
+        %123 = OpLabel
+               OpBranch %122
+        %124 = OpLabel
+               OpBranch %115
+        %122 = OpLabel
+        %125 = OpLoad %int %i_1
+        %126 = OpLoad %int %i_1
+        %127 = OpAccessChain %_ptr_Private_int %temp %126
+        %128 = OpLoad %int %127
+        %129 = OpAccessChain %_ptr_Private_int %data %125
+               OpStore %129 %128
+               OpBranch %116
+        %116 = OpLabel
+        %130 = OpLoad %int %i_1
+        %131 = OpIAdd %int %130 %int_1
+               OpStore %i_1 %131
+               OpBranch %114
+        %115 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %132
+        %134 = OpLabel
+       %x_85 = OpVariable %_ptr_Function_int Function %32
+       %x_86 = OpVariable %_ptr_Function_int Function %32
+       %x_87 = OpVariable %_ptr_Function_int Function %32
+       %x_88 = OpVariable %_ptr_Function_int Function %32
+       %x_89 = OpVariable %_ptr_Function_int Function %32
+       %x_90 = OpVariable %_ptr_Function_int Function %32
+       %x_91 = OpVariable %_ptr_Function_int Function %32
+       %x_92 = OpVariable %_ptr_Function_int Function %32
+       %x_93 = OpVariable %_ptr_Function_int Function %32
+       %x_94 = OpVariable %_ptr_Function_int Function %32
+        %i_3 = OpVariable %_ptr_Function_int Function %32
+        %j_1 = OpVariable %_ptr_Function_int Function %32
+       %grey = OpVariable %_ptr_Function_float Function %149
+        %152 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_0
+        %153 = OpLoad %float %152
+        %154 = OpConvertFToS %int %153
+               OpStore %i_3 %154
+               OpBranch %155
+        %155 = OpLabel
+               OpLoopMerge %156 %157 None
+               OpBranch %158
+        %158 = OpLabel
+        %159 = OpLoad %int %i_3
+               OpSelectionMerge %160 None
+               OpSwitch %159 %161 9 %162 8 %163 7 %164 6 %165 5 %166 4 %167 3 %168 2 %169 1 %170 0 %171
+        %162 = OpLabel
+        %172 = OpLoad %int %i_3
+        %173 = OpAccessChain %_ptr_Private_int %data %172
+               OpStore %173 %int_n5
+               OpBranch %160
+        %163 = OpLabel
+        %175 = OpLoad %int %i_3
+        %176 = OpAccessChain %_ptr_Private_int %data %175
+               OpStore %176 %int_n4
+               OpBranch %160
+        %164 = OpLabel
+        %178 = OpLoad %int %i_3
+        %179 = OpAccessChain %_ptr_Private_int %data %178
+               OpStore %179 %int_n3
+               OpBranch %160
+        %165 = OpLabel
+        %181 = OpLoad %int %i_3
+        %182 = OpAccessChain %_ptr_Private_int %data %181
+               OpStore %182 %int_n2
+               OpBranch %160
+        %166 = OpLabel
+        %184 = OpLoad %int %i_3
+        %185 = OpAccessChain %_ptr_Private_int %data %184
+               OpStore %185 %int_n1
+               OpBranch %160
+        %167 = OpLabel
+        %187 = OpLoad %int %i_3
+        %188 = OpAccessChain %_ptr_Private_int %data %187
+               OpStore %188 %int_0
+               OpBranch %160
+        %168 = OpLabel
+        %190 = OpLoad %int %i_3
+        %191 = OpAccessChain %_ptr_Private_int %data %190
+               OpStore %191 %int_1
+               OpBranch %160
+        %169 = OpLabel
+        %192 = OpLoad %int %i_3
+        %193 = OpAccessChain %_ptr_Private_int %data %192
+               OpStore %193 %int_2
+               OpBranch %160
+        %170 = OpLabel
+        %195 = OpLoad %int %i_3
+        %196 = OpAccessChain %_ptr_Private_int %data %195
+               OpStore %196 %int_3
+               OpBranch %160
+        %171 = OpLabel
+        %198 = OpLoad %int %i_3
+        %199 = OpAccessChain %_ptr_Private_int %data %198
+               OpStore %199 %int_4
+               OpBranch %160
+        %161 = OpLabel
+               OpBranch %160
+        %160 = OpLabel
+        %201 = OpLoad %int %i_3
+        %202 = OpIAdd %int %201 %int_1
+               OpStore %i_3 %202
+               OpBranch %157
+        %157 = OpLabel
+        %203 = OpLoad %int %i_3
+        %204 = OpSLessThan %bool %203 %int_10
+               OpSelectionMerge %205 None
+               OpBranchConditional %204 %206 %207
+        %206 = OpLabel
+               OpBranch %205
+        %207 = OpLabel
+               OpBranch %156
+        %205 = OpLabel
+               OpBranch %155
+        %156 = OpLabel
+               OpStore %j_1 %int_0
+               OpBranch %208
+        %208 = OpLabel
+               OpLoopMerge %209 %210 None
+               OpBranch %211
+        %211 = OpLabel
+        %212 = OpLoad %int %j_1
+        %213 = OpSLessThan %bool %212 %int_10
+               OpSelectionMerge %214 None
+               OpBranchConditional %213 %215 %216
+        %215 = OpLabel
+               OpBranch %214
+        %216 = OpLabel
+               OpBranch %209
+        %214 = OpLabel
+        %217 = OpLoad %int %j_1
+        %218 = OpLoad %int %j_1
+        %219 = OpAccessChain %_ptr_Private_int %data %218
+        %220 = OpLoad %int %219
+        %221 = OpAccessChain %_ptr_Private_int %temp %217
+               OpStore %221 %220
+               OpBranch %210
+        %210 = OpLabel
+        %222 = OpLoad %int %j_1
+        %223 = OpIAdd %int %222 %int_1
+               OpStore %j_1 %223
+               OpBranch %208
+        %209 = OpLabel
+               OpStore %x_94 %int_0
+               OpStore %x_93 %int_9
+               OpStore %x_92 %int_1
+               OpBranch %225
+        %225 = OpLabel
+               OpLoopMerge %226 %227 None
+               OpBranch %228
+        %228 = OpLabel
+        %229 = OpLoad %int %x_92
+        %230 = OpLoad %int %x_93
+        %231 = OpSLessThanEqual %bool %229 %230
+               OpSelectionMerge %232 None
+               OpBranchConditional %231 %233 %234
+        %233 = OpLabel
+               OpBranch %232
+        %234 = OpLabel
+               OpBranch %226
+        %232 = OpLabel
+        %235 = OpLoad %int %x_94
+               OpStore %x_91 %235
+               OpBranch %236
+        %236 = OpLabel
+               OpLoopMerge %237 %238 None
+               OpBranch %239
+        %239 = OpLabel
+        %240 = OpLoad %int %x_91
+        %241 = OpLoad %int %x_93
+        %242 = OpSLessThan %bool %240 %241
+               OpSelectionMerge %243 None
+               OpBranchConditional %242 %244 %245
+        %244 = OpLabel
+               OpBranch %243
+        %245 = OpLabel
+               OpBranch %237
+        %243 = OpLabel
+        %246 = OpLoad %int %x_91
+               OpStore %x_90 %246
+        %247 = OpLoad %int %x_91
+        %248 = OpLoad %int %x_92
+        %249 = OpIAdd %int %247 %248
+        %250 = OpISub %int %249 %int_1
+               OpStore %x_89 %250
+        %251 = OpLoad %int %x_91
+        %252 = OpLoad %int %x_92
+        %253 = OpLoad %int %x_93
+        %256 = OpIMul %int %int_2 %252
+        %257 = OpIAdd %int %251 %256
+        %258 = OpISub %int %257 %int_1
+        %254 = OpExtInst %int %255 SMin %258 %253
+               OpStore %x_88 %254
+        %259 = OpLoad %int %x_90
+               OpStore %x_87 %259
+        %260 = OpLoad %int %x_89
+               OpStore %x_86 %260
+        %261 = OpLoad %int %x_88
+               OpStore %x_85 %261
+        %262 = OpFunctionCall %void %merge_i1_i1_i1_ %x_87 %x_86 %x_85
+               OpBranch %238
+        %238 = OpLabel
+        %266 = OpLoad %int %x_92
+        %267 = OpLoad %int %x_91
+        %268 = OpIMul %int %int_2 %266
+        %269 = OpIAdd %int %267 %268
+               OpStore %x_91 %269
+               OpBranch %236
+        %237 = OpLabel
+               OpBranch %227
+        %227 = OpLabel
+        %270 = OpLoad %int %x_92
+        %271 = OpIMul %int %int_2 %270
+               OpStore %x_92 %271
+               OpBranch %225
+        %226 = OpLabel
+        %274 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %275 = OpLoad %float %274
+        %276 = OpConvertFToS %int %275
+        %278 = OpSLessThan %bool %276 %int_30
+               OpSelectionMerge %279 None
+               OpBranchConditional %278 %280 %281
+        %280 = OpLabel
+        %282 = OpAccessChain %_ptr_Private_int %data %int_0
+        %283 = OpLoad %int %282
+        %285 = OpConvertSToF %float %283
+        %287 = OpFDiv %float %285 %float_10
+        %288 = OpFAdd %float %float_0_5 %287
+               OpStore %grey %288
+               OpBranch %279
+        %281 = OpLabel
+        %289 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %290 = OpLoad %float %289
+        %291 = OpConvertFToS %int %290
+        %293 = OpSLessThan %bool %291 %int_60
+               OpSelectionMerge %294 None
+               OpBranchConditional %293 %295 %296
+        %295 = OpLabel
+        %297 = OpAccessChain %_ptr_Private_int %data %int_1
+        %298 = OpLoad %int %297
+        %299 = OpConvertSToF %float %298
+        %300 = OpFDiv %float %299 %float_10
+        %301 = OpFAdd %float %float_0_5 %300
+               OpStore %grey %301
+               OpBranch %294
+        %296 = OpLabel
+        %302 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %303 = OpLoad %float %302
+        %304 = OpConvertFToS %int %303
+        %306 = OpSLessThan %bool %304 %int_90
+               OpSelectionMerge %307 None
+               OpBranchConditional %306 %308 %309
+        %308 = OpLabel
+        %310 = OpAccessChain %_ptr_Private_int %data %int_2
+        %311 = OpLoad %int %310
+        %312 = OpConvertSToF %float %311
+        %313 = OpFDiv %float %312 %float_10
+        %314 = OpFAdd %float %float_0_5 %313
+               OpStore %grey %314
+               OpBranch %307
+        %309 = OpLabel
+        %315 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %316 = OpLoad %float %315
+        %317 = OpConvertFToS %int %316
+        %319 = OpSLessThan %bool %317 %int_120
+               OpSelectionMerge %320 None
+               OpBranchConditional %319 %321 %322
+        %321 = OpLabel
+        %323 = OpAccessChain %_ptr_Private_int %data %int_3
+        %324 = OpLoad %int %323
+        %325 = OpConvertSToF %float %324
+        %326 = OpFDiv %float %325 %float_10
+        %327 = OpFAdd %float %float_0_5 %326
+               OpStore %grey %327
+               OpBranch %320
+        %322 = OpLabel
+        %328 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %329 = OpLoad %float %328
+        %330 = OpConvertFToS %int %329
+        %332 = OpSLessThan %bool %330 %int_150
+               OpSelectionMerge %333 None
+               OpBranchConditional %332 %334 %335
+        %334 = OpLabel
+               OpKill
+        %335 = OpLabel
+        %336 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %337 = OpLoad %float %336
+        %338 = OpConvertFToS %int %337
+        %340 = OpSLessThan %bool %338 %int_180
+               OpSelectionMerge %341 None
+               OpBranchConditional %340 %342 %343
+        %342 = OpLabel
+        %345 = OpAccessChain %_ptr_Private_int %data %int_5
+        %346 = OpLoad %int %345
+        %347 = OpConvertSToF %float %346
+        %348 = OpFDiv %float %347 %float_10
+        %349 = OpFAdd %float %float_0_5 %348
+               OpStore %grey %349
+               OpBranch %341
+        %343 = OpLabel
+        %350 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %351 = OpLoad %float %350
+        %352 = OpConvertFToS %int %351
+        %354 = OpSLessThan %bool %352 %int_210
+               OpSelectionMerge %355 None
+               OpBranchConditional %354 %356 %357
+        %356 = OpLabel
+        %359 = OpAccessChain %_ptr_Private_int %data %int_6
+        %360 = OpLoad %int %359
+        %361 = OpConvertSToF %float %360
+        %362 = OpFDiv %float %361 %float_10
+        %363 = OpFAdd %float %float_0_5 %362
+               OpStore %grey %363
+               OpBranch %355
+        %357 = OpLabel
+        %364 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %365 = OpLoad %float %364
+        %366 = OpConvertFToS %int %365
+        %368 = OpSLessThan %bool %366 %int_240
+               OpSelectionMerge %369 None
+               OpBranchConditional %368 %370 %371
+        %370 = OpLabel
+        %373 = OpAccessChain %_ptr_Private_int %data %int_7
+        %374 = OpLoad %int %373
+        %375 = OpConvertSToF %float %374
+        %376 = OpFDiv %float %375 %float_10
+        %377 = OpFAdd %float %float_0_5 %376
+               OpStore %grey %377
+               OpBranch %369
+        %371 = OpLabel
+        %378 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %379 = OpLoad %float %378
+        %380 = OpConvertFToS %int %379
+        %382 = OpSLessThan %bool %380 %int_270
+               OpSelectionMerge %383 None
+               OpBranchConditional %382 %384 %385
+        %384 = OpLabel
+        %387 = OpAccessChain %_ptr_Private_int %data %int_8
+        %388 = OpLoad %int %387
+        %389 = OpConvertSToF %float %388
+        %390 = OpFDiv %float %389 %float_10
+        %391 = OpFAdd %float %float_0_5 %390
+               OpStore %grey %391
+               OpBranch %383
+        %385 = OpLabel
+               OpKill
+        %383 = OpLabel
+               OpBranch %369
+        %369 = OpLabel
+               OpBranch %355
+        %355 = OpLabel
+               OpBranch %341
+        %341 = OpLabel
+               OpBranch %333
+        %333 = OpLabel
+               OpBranch %320
+        %320 = OpLabel
+               OpBranch %307
+        %307 = OpLabel
+               OpBranch %294
+        %294 = OpLabel
+               OpBranch %279
+        %279 = OpLabel
+        %392 = OpLoad %float %grey
+        %394 = OpCompositeConstruct %v3float %392 %392 %392
+        %395 = OpCompositeExtract %float %394 0
+        %396 = OpCompositeExtract %float %394 1
+        %397 = OpCompositeExtract %float %394 2
+        %399 = OpCompositeConstruct %v4float %395 %396 %397 %float_1
+               OpStore %x_GLF_color %399
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %400
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %404 = OpLabel
+        %405 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %405
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %132
+        %407 = OpLabel
+        %408 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %408
+        %409 = OpFunctionCall %void %main_1
+        %411 = OpLoad %v4float %x_GLF_color
+        %412 = OpCompositeConstruct %main_out %411
+        %410 = OpFunctionCall %void %tint_symbol_3 %412
+               OpReturn
+               OpFunctionEnd
+ %mergeSort_ = OpFunction %void None %132
+        %414 = OpLabel
+        %low = OpVariable %_ptr_Function_int Function %32
+       %high = OpVariable %_ptr_Function_int Function %32
+          %m = OpVariable %_ptr_Function_int Function %32
+        %i_2 = OpVariable %_ptr_Function_int Function %32
+     %from_1 = OpVariable %_ptr_Function_int Function %32
+      %mid_1 = OpVariable %_ptr_Function_int Function %32
+       %to_1 = OpVariable %_ptr_Function_int Function %32
+      %param = OpVariable %_ptr_Function_int Function %32
+    %param_1 = OpVariable %_ptr_Function_int Function %32
+    %param_2 = OpVariable %_ptr_Function_int Function %32
+               OpStore %low %int_0
+               OpStore %high %int_9
+               OpStore %m %int_1
+               OpBranch %425
+        %425 = OpLabel
+               OpLoopMerge %426 %427 None
+               OpBranch %428
+        %428 = OpLabel
+        %429 = OpLoad %int %m
+        %430 = OpLoad %int %high
+        %431 = OpSLessThanEqual %bool %429 %430
+               OpSelectionMerge %432 None
+               OpBranchConditional %431 %433 %434
+        %433 = OpLabel
+               OpBranch %432
+        %434 = OpLabel
+               OpBranch %426
+        %432 = OpLabel
+        %435 = OpLoad %int %low
+               OpStore %i_2 %435
+               OpBranch %436
+        %436 = OpLabel
+               OpLoopMerge %437 %438 None
+               OpBranch %439
+        %439 = OpLabel
+        %440 = OpLoad %int %i_2
+        %441 = OpLoad %int %high
+        %442 = OpSLessThan %bool %440 %441
+               OpSelectionMerge %443 None
+               OpBranchConditional %442 %444 %445
+        %444 = OpLabel
+               OpBranch %443
+        %445 = OpLabel
+               OpBranch %437
+        %443 = OpLabel
+        %446 = OpLoad %int %i_2
+               OpStore %from_1 %446
+        %447 = OpLoad %int %i_2
+        %448 = OpLoad %int %m
+        %449 = OpIAdd %int %447 %448
+        %450 = OpISub %int %449 %int_1
+               OpStore %mid_1 %450
+        %451 = OpLoad %int %i_2
+        %452 = OpLoad %int %m
+        %453 = OpLoad %int %high
+        %455 = OpIMul %int %int_2 %452
+        %456 = OpIAdd %int %451 %455
+        %457 = OpISub %int %456 %int_1
+        %454 = OpExtInst %int %255 SMin %457 %453
+               OpStore %to_1 %454
+        %458 = OpLoad %int %from_1
+               OpStore %param %458
+        %459 = OpLoad %int %mid_1
+               OpStore %param_1 %459
+        %460 = OpLoad %int %to_1
+               OpStore %param_2 %460
+        %461 = OpFunctionCall %void %merge_i1_i1_i1_ %param %param_1 %param_2
+               OpBranch %438
+        %438 = OpLabel
+        %465 = OpLoad %int %m
+        %466 = OpLoad %int %i_2
+        %467 = OpIMul %int %int_2 %465
+        %468 = OpIAdd %int %466 %467
+               OpStore %i_2 %468
+               OpBranch %436
+        %437 = OpLabel
+               OpBranch %427
+        %427 = OpLabel
+        %469 = OpLoad %int %m
+        %470 = OpIMul %int %int_2 %469
+               OpStore %m %470
+               OpBranch %425
+        %426 = OpLabel
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 157[%157] is not post dominated by the back-edge block 205[%205]
+  %205 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/2.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/2.wgsl.expected.wgsl
new file mode 100644
index 0000000..57c9c29
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/2.wgsl.expected.wgsl
@@ -0,0 +1,363 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> data : array<i32, 10>;
+
+var<private> temp : array<i32, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn merge_i1_i1_i1_(from : ptr<function, i32>, mid : ptr<function, i32>, to : ptr<function, i32>) {
+  var k : i32;
+  var i : i32;
+  var j : i32;
+  var i_1 : i32;
+  let x_302 : i32 = *(from);
+  k = x_302;
+  let x_303 : i32 = *(from);
+  i = x_303;
+  let x_304 : i32 = *(mid);
+  j = (x_304 + 1);
+  loop {
+    let x_310 : i32 = i;
+    let x_311 : i32 = *(mid);
+    let x_313 : i32 = j;
+    let x_314 : i32 = *(to);
+    if (((x_310 <= x_311) && (x_313 <= x_314))) {
+    } else {
+      break;
+    }
+    let x_318 : i32 = i;
+    let x_320 : i32 = data[x_318];
+    let x_321 : i32 = j;
+    let x_323 : i32 = data[x_321];
+    if ((x_320 < x_323)) {
+      let x_328 : i32 = k;
+      k = (x_328 + 1);
+      let x_330 : i32 = i;
+      i = (x_330 + 1);
+      let x_333 : i32 = data[x_330];
+      temp[x_328] = x_333;
+    } else {
+      let x_335 : i32 = k;
+      k = (x_335 + 1);
+      let x_337 : i32 = j;
+      j = (x_337 + 1);
+      let x_340 : i32 = data[x_337];
+      temp[x_335] = x_340;
+    }
+  }
+  loop {
+    let x_346 : i32 = i;
+    let x_348 : i32 = i;
+    let x_349 : i32 = *(mid);
+    if (((x_346 < 10) && (x_348 <= x_349))) {
+    } else {
+      break;
+    }
+    let x_353 : i32 = k;
+    k = (x_353 + 1);
+    let x_355 : i32 = i;
+    i = (x_355 + 1);
+    let x_358 : i32 = data[x_355];
+    temp[x_353] = x_358;
+  }
+  let x_360 : i32 = *(from);
+  i_1 = x_360;
+  loop {
+    let x_365 : i32 = i_1;
+    let x_366 : i32 = *(to);
+    if ((x_365 <= x_366)) {
+    } else {
+      break;
+    }
+    let x_369 : i32 = i_1;
+    let x_370 : i32 = i_1;
+    let x_372 : i32 = temp[x_370];
+    data[x_369] = x_372;
+
+    continuing {
+      let x_374 : i32 = i_1;
+      i_1 = (x_374 + 1);
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var x_85 : i32;
+  var x_86 : i32;
+  var x_87 : i32;
+  var x_88 : i32;
+  var x_89 : i32;
+  var x_90 : i32;
+  var x_91 : i32;
+  var x_92 : i32;
+  var x_93 : i32;
+  var x_94 : i32;
+  var i_3 : i32;
+  var j_1 : i32;
+  var grey : f32;
+  let x_96 : f32 = x_28.injectionSwitch.x;
+  i_3 = i32(x_96);
+  loop {
+    let x_102 : i32 = i_3;
+    switch(x_102) {
+      case 9: {
+        let x_132 : i32 = i_3;
+        data[x_132] = -5;
+      }
+      case 8: {
+        let x_130 : i32 = i_3;
+        data[x_130] = -4;
+      }
+      case 7: {
+        let x_128 : i32 = i_3;
+        data[x_128] = -3;
+      }
+      case 6: {
+        let x_126 : i32 = i_3;
+        data[x_126] = -2;
+      }
+      case 5: {
+        let x_124 : i32 = i_3;
+        data[x_124] = -1;
+      }
+      case 4: {
+        let x_122 : i32 = i_3;
+        data[x_122] = 0;
+      }
+      case 3: {
+        let x_120 : i32 = i_3;
+        data[x_120] = 1;
+      }
+      case 2: {
+        let x_118 : i32 = i_3;
+        data[x_118] = 2;
+      }
+      case 1: {
+        let x_116 : i32 = i_3;
+        data[x_116] = 3;
+      }
+      case 0: {
+        let x_114 : i32 = i_3;
+        data[x_114] = 4;
+      }
+      default: {
+      }
+    }
+    let x_134 : i32 = i_3;
+    i_3 = (x_134 + 1);
+
+    continuing {
+      let x_136 : i32 = i_3;
+      if ((x_136 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  loop {
+    let x_142 : i32 = j_1;
+    if ((x_142 < 10)) {
+    } else {
+      break;
+    }
+    let x_145 : i32 = j_1;
+    let x_146 : i32 = j_1;
+    let x_148 : i32 = data[x_146];
+    temp[x_145] = x_148;
+
+    continuing {
+      let x_150 : i32 = j_1;
+      j_1 = (x_150 + 1);
+    }
+  }
+  x_94 = 0;
+  x_93 = 9;
+  x_92 = 1;
+  loop {
+    let x_156 : i32 = x_92;
+    let x_157 : i32 = x_93;
+    if ((x_156 <= x_157)) {
+    } else {
+      break;
+    }
+    let x_160 : i32 = x_94;
+    x_91 = x_160;
+    loop {
+      let x_165 : i32 = x_91;
+      let x_166 : i32 = x_93;
+      if ((x_165 < x_166)) {
+      } else {
+        break;
+      }
+      let x_169 : i32 = x_91;
+      x_90 = x_169;
+      let x_170 : i32 = x_91;
+      let x_171 : i32 = x_92;
+      x_89 = ((x_170 + x_171) - 1);
+      let x_174 : i32 = x_91;
+      let x_175 : i32 = x_92;
+      let x_179 : i32 = x_93;
+      x_88 = min(((x_174 + (2 * x_175)) - 1), x_179);
+      let x_181 : i32 = x_90;
+      x_87 = x_181;
+      let x_182 : i32 = x_89;
+      x_86 = x_182;
+      let x_183 : i32 = x_88;
+      x_85 = x_183;
+      merge_i1_i1_i1_(&(x_87), &(x_86), &(x_85));
+
+      continuing {
+        let x_185 : i32 = x_92;
+        let x_187 : i32 = x_91;
+        x_91 = (x_187 + (2 * x_185));
+      }
+    }
+
+    continuing {
+      let x_189 : i32 = x_92;
+      x_92 = (2 * x_189);
+    }
+  }
+  let x_193 : f32 = gl_FragCoord.y;
+  if ((i32(x_193) < 30)) {
+    let x_200 : i32 = data[0];
+    grey = (0.5 + (f32(x_200) / 10.0));
+  } else {
+    let x_205 : f32 = gl_FragCoord.y;
+    if ((i32(x_205) < 60)) {
+      let x_212 : i32 = data[1];
+      grey = (0.5 + (f32(x_212) / 10.0));
+    } else {
+      let x_217 : f32 = gl_FragCoord.y;
+      if ((i32(x_217) < 90)) {
+        let x_224 : i32 = data[2];
+        grey = (0.5 + (f32(x_224) / 10.0));
+      } else {
+        let x_229 : f32 = gl_FragCoord.y;
+        if ((i32(x_229) < 120)) {
+          let x_236 : i32 = data[3];
+          grey = (0.5 + (f32(x_236) / 10.0));
+        } else {
+          let x_241 : f32 = gl_FragCoord.y;
+          if ((i32(x_241) < 150)) {
+            discard;
+          } else {
+            let x_248 : f32 = gl_FragCoord.y;
+            if ((i32(x_248) < 180)) {
+              let x_255 : i32 = data[5];
+              grey = (0.5 + (f32(x_255) / 10.0));
+            } else {
+              let x_260 : f32 = gl_FragCoord.y;
+              if ((i32(x_260) < 210)) {
+                let x_267 : i32 = data[6];
+                grey = (0.5 + (f32(x_267) / 10.0));
+              } else {
+                let x_272 : f32 = gl_FragCoord.y;
+                if ((i32(x_272) < 240)) {
+                  let x_279 : i32 = data[7];
+                  grey = (0.5 + (f32(x_279) / 10.0));
+                } else {
+                  let x_284 : f32 = gl_FragCoord.y;
+                  if ((i32(x_284) < 270)) {
+                    let x_291 : i32 = data[8];
+                    grey = (0.5 + (f32(x_291) / 10.0));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  let x_295 : f32 = grey;
+  let x_296 : vec3<f32> = vec3<f32>(x_295, x_295, x_295);
+  x_GLF_color = vec4<f32>(x_296.x, x_296.y, x_296.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+fn mergeSort_() {
+  var low : i32;
+  var high : i32;
+  var m : i32;
+  var i_2 : i32;
+  var from_1 : i32;
+  var mid_1 : i32;
+  var to_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  low = 0;
+  high = 9;
+  m = 1;
+  loop {
+    let x_381 : i32 = m;
+    let x_382 : i32 = high;
+    if ((x_381 <= x_382)) {
+    } else {
+      break;
+    }
+    let x_385 : i32 = low;
+    i_2 = x_385;
+    loop {
+      let x_390 : i32 = i_2;
+      let x_391 : i32 = high;
+      if ((x_390 < x_391)) {
+      } else {
+        break;
+      }
+      let x_394 : i32 = i_2;
+      from_1 = x_394;
+      let x_395 : i32 = i_2;
+      let x_396 : i32 = m;
+      mid_1 = ((x_395 + x_396) - 1);
+      let x_399 : i32 = i_2;
+      let x_400 : i32 = m;
+      let x_404 : i32 = high;
+      to_1 = min(((x_399 + (2 * x_400)) - 1), x_404);
+      let x_406 : i32 = from_1;
+      param = x_406;
+      let x_407 : i32 = mid_1;
+      param_1 = x_407;
+      let x_408 : i32 = to_1;
+      param_2 = x_408;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2));
+
+      continuing {
+        let x_410 : i32 = m;
+        let x_412 : i32 = i_2;
+        i_2 = (x_412 + (2 * x_410));
+      }
+    }
+
+    continuing {
+      let x_414 : i32 = m;
+      m = (2 * x_414);
+    }
+  }
+  return;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/0.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/0.spvasm
new file mode 100644
index 0000000..a003313
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/0.spvasm
@@ -0,0 +1,161 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpName %indexable "indexable"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+       %uint = OpTypeInt 32 0
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_8 = OpConstant %float 8
+      %int_5 = OpConstant %int 5
+     %int_10 = OpConstant %int 10
+      %int_8 = OpConstant %int 8
+    %int_100 = OpConstant %int 100
+     %int_15 = OpConstant %int 15
+     %int_16 = OpConstant %int 16
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %35 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+  %float_0_5 = OpConstant %float 0.5
+         %37 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+         %38 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+         %39 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+         %40 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+         %41 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+         %42 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+         %43 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+         %44 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %45 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+         %46 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+         %47 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+         %48 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+         %49 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+         %50 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+         %51 = OpConstantComposite %_arr_v4float_uint_16 %35 %37 %38 %39 %40 %41 %42 %43 %35 %44 %45 %46 %47 %48 %49 %50
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+         %54 = OpUndef %v2int
+       %main = OpFunction %void None %9
+         %55 = OpLabel
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_16 Function
+         %56 = OpLoad %v4float %gl_FragCoord
+         %57 = OpVectorShuffle %v2float %56 %56 0 1
+         %58 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+         %59 = OpLoad %v2float %58
+         %60 = OpFDiv %v2float %57 %59
+         %61 = OpCompositeExtract %float %60 0
+         %62 = OpFMul %float %61 %float_8
+         %63 = OpConvertFToS %int %62
+         %64 = OpCompositeExtract %float %60 1
+         %65 = OpFMul %float %64 %float_8
+         %66 = OpConvertFToS %int %65
+         %67 = OpBitwiseAnd %int %63 %int_5
+         %68 = OpBitwiseAnd %int %66 %int_10
+         %69 = OpBitwiseOr %int %67 %68
+         %70 = OpBitwiseAnd %int %66 %int_5
+         %71 = OpBitwiseAnd %int %63 %int_10
+         %72 = OpBitwiseOr %int %70 %71
+         %73 = OpIMul %int %69 %int_8
+         %74 = OpIAdd %int %73 %72
+         %75 = OpCompositeConstruct %v2int %74 %int_0
+               OpBranch %76
+         %76 = OpLabel
+         %77 = OpPhi %v2int %75 %55 %78 %79
+         %80 = OpPhi %int %int_0 %55 %81 %79
+         %82 = OpSLessThan %bool %80 %int_100
+               OpLoopMerge %83 %79 None
+               OpBranchConditional %82 %84 %83
+         %84 = OpLabel
+         %85 = OpCompositeExtract %int %77 0
+         %86 = OpSGreaterThan %bool %85 %int_0
+               OpSelectionMerge %87 None
+               OpBranchConditional %86 %88 %87
+         %88 = OpLabel
+         %89 = OpCompositeExtract %int %77 1
+         %90 = OpISub %int %89 %int_1
+         %91 = OpCompositeInsert %v2int %90 %77 1
+               OpBranch %87
+         %87 = OpLabel
+         %92 = OpPhi %v2int %77 %84 %91 %88
+         %93 = OpCompositeExtract %int %92 0
+         %94 = OpSLessThan %bool %93 %int_0
+               OpSelectionMerge %95 None
+               OpBranchConditional %94 %96 %95
+         %96 = OpLabel
+         %97 = OpCompositeExtract %int %92 1
+         %98 = OpIAdd %int %97 %int_1
+         %99 = OpCompositeInsert %v2int %98 %92 1
+               OpBranch %95
+         %95 = OpLabel
+        %100 = OpPhi %v2int %92 %87 %99 %96
+        %101 = OpCompositeExtract %int %100 1
+        %102 = OpSDiv %int %101 %int_2
+        %103 = OpCompositeExtract %int %100 0
+        %104 = OpIAdd %int %103 %102
+         %78 = OpCompositeInsert %v2int %104 %100 0
+               OpBranch %79
+         %79 = OpLabel
+         %81 = OpIAdd %int %80 %int_1
+               OpBranch %76
+         %83 = OpLabel
+        %105 = OpCompositeExtract %int %77 0
+        %106 = OpSLessThan %bool %105 %int_0
+               OpSelectionMerge %107 None
+               OpBranchConditional %106 %108 %107
+        %108 = OpLabel
+        %109 = OpSNegate %int %105
+        %110 = OpCompositeInsert %v2int %109 %54 0
+               OpBranch %107
+        %107 = OpLabel
+        %111 = OpPhi %v2int %77 %83 %110 %108
+               OpBranch %112
+        %112 = OpLabel
+        %113 = OpPhi %v2int %111 %107 %114 %115
+        %116 = OpCompositeExtract %int %113 0
+        %117 = OpSGreaterThan %bool %116 %int_15
+               OpLoopMerge %118 %115 None
+               OpBranchConditional %117 %115 %118
+        %115 = OpLabel
+        %119 = OpISub %int %116 %int_16
+        %114 = OpCompositeInsert %v2int %119 %54 0
+               OpBranch %112
+        %118 = OpLabel
+               OpStore %indexable %51
+        %120 = OpAccessChain %_ptr_Function_v4float %indexable %116
+        %121 = OpLoad %v4float %120
+               OpStore %_GLF_color %121
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..5a6f9c4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/0.spvasm.expected.hlsl
@@ -0,0 +1,104 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 indexable[16] = (float4[16])0;
+  int2 x_77 = int2(0, 0);
+  int2 x_110 = int2(0, 0);
+  int x_116 = 0;
+  int2 x_77_phi = int2(0, 0);
+  int x_80_phi = 0;
+  int2 x_111_phi = int2(0, 0);
+  int2 x_113_phi = int2(0, 0);
+  const float4 x_56 = gl_FragCoord;
+  const float2 x_59 = asfloat(x_6[0].xy);
+  const float2 x_60 = (float2(x_56.x, x_56.y) / x_59);
+  const int x_63 = int((x_60.x * 8.0f));
+  const int x_66 = int((x_60.y * 8.0f));
+  const int2 x_75 = int2(((((x_63 & 5) | (x_66 & 10)) * 8) + ((x_66 & 5) | (x_63 & 10))), 0);
+  x_77_phi = x_75;
+  x_80_phi = 0;
+  while (true) {
+    int2 x_91 = int2(0, 0);
+    int2 x_99 = int2(0, 0);
+    int x_81 = 0;
+    int2 x_92_phi = int2(0, 0);
+    int2 x_100_phi = int2(0, 0);
+    x_77 = x_77_phi;
+    const int x_80 = x_80_phi;
+    if ((x_80 < 100)) {
+    } else {
+      break;
+    }
+    x_92_phi = x_77;
+    if ((x_77.x > 0)) {
+      x_91 = x_77;
+      x_91.y = (x_77.y - 1);
+      x_92_phi = x_91;
+    }
+    const int2 x_92 = x_92_phi;
+    x_100_phi = x_92;
+    if ((x_92.x < 0)) {
+      x_99 = x_92;
+      x_99.y = (x_92.y + 1);
+      x_100_phi = x_99;
+    }
+    const int2 x_100 = x_100_phi;
+    int2 x_78_1 = x_100;
+    x_78_1.x = (x_100.x + (x_100.y / 2));
+    const int2 x_78 = x_78_1;
+    {
+      x_81 = (x_80 + 1);
+      x_77_phi = x_78;
+      x_80_phi = x_81;
+    }
+  }
+  const int x_105 = x_77.x;
+  x_111_phi = x_77;
+  if ((x_105 < 0)) {
+    x_110 = int2(0, 0);
+    x_110.x = -(x_105);
+    x_111_phi = x_110;
+  }
+  x_113_phi = x_111_phi;
+  while (true) {
+    int2 x_114 = int2(0, 0);
+    x_116 = x_113_phi.x;
+    if ((x_116 > 15)) {
+    } else {
+      break;
+    }
+    {
+      x_114 = int2(0, 0);
+      x_114.x = asint((x_116 - asint(16)));
+      x_113_phi = x_114;
+    }
+  }
+  const float4 tint_symbol_5[16] = {float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)};
+  indexable = tint_symbol_5;
+  const float4 x_121 = indexable[x_116];
+  x_GLF_color = x_121;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/0.spvasm.expected.msl
new file mode 100644
index 0000000..4266776
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/0.spvasm.expected.msl
@@ -0,0 +1,108 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  float4 arr[16];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  tint_array_wrapper indexable = {};
+  int2 x_77 = 0;
+  int2 x_110 = 0;
+  int x_116 = 0;
+  int2 x_77_phi = 0;
+  int x_80_phi = 0;
+  int2 x_111_phi = 0;
+  int2 x_113_phi = 0;
+  float4 const x_56 = *(tint_symbol_6);
+  float2 const x_59 = x_6.resolution;
+  float2 const x_60 = (float2(x_56.x, x_56.y) / x_59);
+  int const x_63 = int((x_60.x * 8.0f));
+  int const x_66 = int((x_60.y * 8.0f));
+  int2 const x_75 = int2(((((x_63 & 5) | (x_66 & 10)) * 8) + ((x_66 & 5) | (x_63 & 10))), 0);
+  x_77_phi = x_75;
+  x_80_phi = 0;
+  while (true) {
+    int2 x_91 = 0;
+    int2 x_99 = 0;
+    int x_81 = 0;
+    int2 x_92_phi = 0;
+    int2 x_100_phi = 0;
+    x_77 = x_77_phi;
+    int const x_80 = x_80_phi;
+    if ((x_80 < 100)) {
+    } else {
+      break;
+    }
+    x_92_phi = x_77;
+    if ((x_77.x > 0)) {
+      x_91 = x_77;
+      x_91.y = (x_77.y - 1);
+      x_92_phi = x_91;
+    }
+    int2 const x_92 = x_92_phi;
+    x_100_phi = x_92;
+    if ((x_92.x < 0)) {
+      x_99 = x_92;
+      x_99.y = (x_92.y + 1);
+      x_100_phi = x_99;
+    }
+    int2 const x_100 = x_100_phi;
+    int2 x_78_1 = x_100;
+    x_78_1.x = (x_100.x + (x_100.y / 2));
+    int2 const x_78 = x_78_1;
+    {
+      x_81 = (x_80 + 1);
+      x_77_phi = x_78;
+      x_80_phi = x_81;
+    }
+  }
+  int const x_105 = x_77.x;
+  x_111_phi = x_77;
+  if ((x_105 < 0)) {
+    x_110 = int2(0, 0);
+    x_110.x = -(x_105);
+    x_111_phi = x_110;
+  }
+  int2 const x_111 = x_111_phi;
+  x_113_phi = x_111;
+  while (true) {
+    int2 x_114 = 0;
+    int2 const x_113 = x_113_phi;
+    x_116 = x_113.x;
+    if ((x_116 > 15)) {
+    } else {
+      break;
+    }
+    {
+      x_114 = int2(0, 0);
+      x_114.x = as_type<int>((x_116 - as_type<int>(16)));
+      x_113_phi = x_114;
+    }
+  }
+  tint_array_wrapper const tint_symbol_4 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
+  indexable = tint_symbol_4;
+  float4 const x_121 = indexable.arr[x_116];
+  *(tint_symbol_7) = x_121;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..d89e65c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/0.spvasm.expected.spvasm
@@ -0,0 +1,292 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 185
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %indexable "indexable"
+               OpName %x_77 "x_77"
+               OpName %x_110 "x_110"
+               OpName %x_116 "x_116"
+               OpName %x_77_phi "x_77_phi"
+               OpName %x_80_phi "x_80_phi"
+               OpName %x_111_phi "x_111_phi"
+               OpName %x_113_phi "x_113_phi"
+               OpName %x_91 "x_91"
+               OpName %x_99 "x_99"
+               OpName %x_81 "x_81"
+               OpName %x_92_phi "x_92_phi"
+               OpName %x_100_phi "x_100_phi"
+               OpName %x_78_1 "x_78_1"
+               OpName %x_114 "x_114"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v4float_uint_16 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+         %24 = OpConstantNull %_arr_v4float_uint_16
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %29 = OpConstantNull %v2int
+%_ptr_Function_int = OpTypePointer Function %int
+         %33 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_8 = OpConstant %float 8
+      %int_5 = OpConstant %int 5
+     %int_10 = OpConstant %int 10
+      %int_8 = OpConstant %int 8
+      %int_0 = OpConstant %int 0
+    %int_100 = OpConstant %int 100
+       %bool = OpTypeBool
+     %uint_1 = OpConstant %uint 1
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+        %124 = OpConstantComposite %v2int %int_0 %int_0
+     %int_15 = OpConstant %int 15
+     %int_16 = OpConstant %int 16
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+        %151 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+  %float_0_5 = OpConstant %float 0.5
+        %153 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+        %154 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+        %155 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+        %156 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+        %157 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+        %158 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+        %159 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+        %160 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %161 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+        %162 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+        %163 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+        %164 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+        %165 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+        %166 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+        %167 = OpConstantComposite %_arr_v4float_uint_16 %151 %153 %154 %155 %156 %157 %158 %159 %151 %160 %161 %162 %163 %164 %165 %166
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+   %main_out = OpTypeStruct %v4float
+        %172 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_16 Function %24
+       %x_77 = OpVariable %_ptr_Function_v2int Function %29
+      %x_110 = OpVariable %_ptr_Function_v2int Function %29
+      %x_116 = OpVariable %_ptr_Function_int Function %33
+   %x_77_phi = OpVariable %_ptr_Function_v2int Function %29
+   %x_80_phi = OpVariable %_ptr_Function_int Function %33
+  %x_111_phi = OpVariable %_ptr_Function_v2int Function %29
+  %x_113_phi = OpVariable %_ptr_Function_v2int Function %29
+       %x_91 = OpVariable %_ptr_Function_v2int Function %29
+       %x_99 = OpVariable %_ptr_Function_v2int Function %29
+       %x_81 = OpVariable %_ptr_Function_int Function %33
+   %x_92_phi = OpVariable %_ptr_Function_v2int Function %29
+  %x_100_phi = OpVariable %_ptr_Function_v2int Function %29
+     %x_78_1 = OpVariable %_ptr_Function_v2int Function %29
+      %x_114 = OpVariable %_ptr_Function_v2int Function %29
+         %38 = OpLoad %v4float %gl_FragCoord
+         %41 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %42 = OpLoad %v2float %41
+         %43 = OpCompositeExtract %float %38 0
+         %44 = OpCompositeExtract %float %38 1
+         %45 = OpCompositeConstruct %v2float %43 %44
+         %46 = OpFDiv %v2float %45 %42
+         %48 = OpCompositeExtract %float %46 0
+         %50 = OpFMul %float %48 %float_8
+         %47 = OpConvertFToS %int %50
+         %52 = OpCompositeExtract %float %46 1
+         %53 = OpFMul %float %52 %float_8
+         %51 = OpConvertFToS %int %53
+         %55 = OpBitwiseAnd %int %47 %int_5
+         %57 = OpBitwiseAnd %int %51 %int_10
+         %58 = OpBitwiseOr %int %55 %57
+         %60 = OpIMul %int %58 %int_8
+         %61 = OpBitwiseAnd %int %51 %int_5
+         %62 = OpBitwiseAnd %int %47 %int_10
+         %63 = OpBitwiseOr %int %61 %62
+         %64 = OpIAdd %int %60 %63
+         %66 = OpCompositeConstruct %v2int %64 %int_0
+               OpStore %x_77_phi %66
+               OpStore %x_80_phi %int_0
+               OpBranch %67
+         %67 = OpLabel
+               OpLoopMerge %68 %69 None
+               OpBranch %70
+         %70 = OpLabel
+         %76 = OpLoad %v2int %x_77_phi
+               OpStore %x_77 %76
+         %77 = OpLoad %int %x_80_phi
+         %79 = OpSLessThan %bool %77 %int_100
+               OpSelectionMerge %81 None
+               OpBranchConditional %79 %82 %83
+         %82 = OpLabel
+               OpBranch %81
+         %83 = OpLabel
+               OpBranch %68
+         %81 = OpLabel
+         %84 = OpLoad %v2int %x_77
+               OpStore %x_92_phi %84
+         %85 = OpAccessChain %_ptr_Function_int %x_77 %uint_0
+         %86 = OpLoad %int %85
+         %87 = OpSGreaterThan %bool %86 %int_0
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %88
+         %89 = OpLabel
+         %90 = OpLoad %v2int %x_77
+               OpStore %x_91 %90
+         %92 = OpAccessChain %_ptr_Function_int %x_91 %uint_1
+         %93 = OpAccessChain %_ptr_Function_int %x_77 %uint_1
+         %94 = OpLoad %int %93
+         %96 = OpISub %int %94 %int_1
+               OpStore %92 %96
+         %97 = OpLoad %v2int %x_91
+               OpStore %x_92_phi %97
+               OpBranch %88
+         %88 = OpLabel
+         %98 = OpLoad %v2int %x_92_phi
+               OpStore %x_100_phi %98
+         %99 = OpCompositeExtract %int %98 0
+        %100 = OpSLessThan %bool %99 %int_0
+               OpSelectionMerge %101 None
+               OpBranchConditional %100 %102 %101
+        %102 = OpLabel
+               OpStore %x_99 %98
+        %103 = OpAccessChain %_ptr_Function_int %x_99 %uint_1
+        %104 = OpCompositeExtract %int %98 1
+        %105 = OpIAdd %int %104 %int_1
+               OpStore %103 %105
+        %106 = OpLoad %v2int %x_99
+               OpStore %x_100_phi %106
+               OpBranch %101
+        %101 = OpLabel
+        %107 = OpLoad %v2int %x_100_phi
+               OpStore %x_78_1 %107
+        %109 = OpAccessChain %_ptr_Function_int %x_78_1 %uint_0
+        %110 = OpCompositeExtract %int %107 0
+        %111 = OpCompositeExtract %int %107 1
+        %113 = OpSDiv %int %111 %int_2
+        %114 = OpIAdd %int %110 %113
+               OpStore %109 %114
+        %115 = OpLoad %v2int %x_78_1
+               OpBranch %69
+         %69 = OpLabel
+        %116 = OpIAdd %int %77 %int_1
+               OpStore %x_81 %116
+               OpStore %x_77_phi %115
+        %117 = OpLoad %int %x_81
+               OpStore %x_80_phi %117
+               OpBranch %67
+         %68 = OpLabel
+        %118 = OpAccessChain %_ptr_Function_int %x_77 %uint_0
+        %119 = OpLoad %int %118
+        %120 = OpLoad %v2int %x_77
+               OpStore %x_111_phi %120
+        %121 = OpSLessThan %bool %119 %int_0
+               OpSelectionMerge %122 None
+               OpBranchConditional %121 %123 %122
+        %123 = OpLabel
+               OpStore %x_110 %124
+        %125 = OpAccessChain %_ptr_Function_int %x_110 %uint_0
+        %126 = OpSNegate %int %119
+               OpStore %125 %126
+        %127 = OpLoad %v2int %x_110
+               OpStore %x_111_phi %127
+               OpBranch %122
+        %122 = OpLabel
+        %128 = OpLoad %v2int %x_111_phi
+               OpStore %x_113_phi %128
+               OpBranch %129
+        %129 = OpLabel
+               OpLoopMerge %130 %131 None
+               OpBranch %132
+        %132 = OpLabel
+        %134 = OpLoad %v2int %x_113_phi
+        %135 = OpCompositeExtract %int %134 0
+               OpStore %x_116 %135
+        %136 = OpLoad %int %x_116
+        %138 = OpSGreaterThan %bool %136 %int_15
+               OpSelectionMerge %139 None
+               OpBranchConditional %138 %140 %141
+        %140 = OpLabel
+               OpBranch %139
+        %141 = OpLabel
+               OpBranch %130
+        %139 = OpLabel
+               OpBranch %131
+        %131 = OpLabel
+               OpStore %x_114 %124
+        %142 = OpAccessChain %_ptr_Function_int %x_114 %uint_0
+        %144 = OpLoad %int %x_116
+        %145 = OpCopyObject %int %int_16
+        %147 = OpISub %int %144 %145
+        %143 = OpCopyObject %int %147
+               OpStore %142 %143
+        %148 = OpLoad %v2int %x_114
+               OpStore %x_113_phi %148
+               OpBranch %129
+        %130 = OpLabel
+               OpStore %indexable %167
+        %168 = OpLoad %int %x_116
+        %170 = OpAccessChain %_ptr_Function_v4float %indexable %168
+        %171 = OpLoad %v4float %170
+               OpStore %x_GLF_color %171
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %172
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %176 = OpLabel
+        %177 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %177
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %179 = OpLabel
+        %180 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %180
+        %181 = OpFunctionCall %void %main_1
+        %183 = OpLoad %v4float %x_GLF_color
+        %184 = OpCompositeConstruct %main_out %183
+        %182 = OpFunctionCall %void %tint_symbol_3 %184
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..be331aa
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/0.spvasm.expected.wgsl
@@ -0,0 +1,105 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var indexable : array<vec4<f32>, 16>;
+  var x_77 : vec2<i32>;
+  var x_110 : vec2<i32>;
+  var x_116 : i32;
+  var x_77_phi : vec2<i32>;
+  var x_80_phi : i32;
+  var x_111_phi : vec2<i32>;
+  var x_113_phi : vec2<i32>;
+  let x_56 : vec4<f32> = gl_FragCoord;
+  let x_59 : vec2<f32> = x_6.resolution;
+  let x_60 : vec2<f32> = (vec2<f32>(x_56.x, x_56.y) / x_59);
+  let x_63 : i32 = i32((x_60.x * 8.0));
+  let x_66 : i32 = i32((x_60.y * 8.0));
+  let x_75 : vec2<i32> = vec2<i32>(((((x_63 & 5) | (x_66 & 10)) * 8) + ((x_66 & 5) | (x_63 & 10))), 0);
+  x_77_phi = x_75;
+  x_80_phi = 0;
+  loop {
+    var x_91 : vec2<i32>;
+    var x_99 : vec2<i32>;
+    var x_81 : i32;
+    var x_92_phi : vec2<i32>;
+    var x_100_phi : vec2<i32>;
+    x_77 = x_77_phi;
+    let x_80 : i32 = x_80_phi;
+    if ((x_80 < 100)) {
+    } else {
+      break;
+    }
+    x_92_phi = x_77;
+    if ((x_77.x > 0)) {
+      x_91 = x_77;
+      x_91.y = (x_77.y - 1);
+      x_92_phi = x_91;
+    }
+    let x_92 : vec2<i32> = x_92_phi;
+    x_100_phi = x_92;
+    if ((x_92.x < 0)) {
+      x_99 = x_92;
+      x_99.y = (x_92.y + 1);
+      x_100_phi = x_99;
+    }
+    let x_100 : vec2<i32> = x_100_phi;
+    var x_78_1 : vec2<i32> = x_100;
+    x_78_1.x = (x_100.x + (x_100.y / 2));
+    let x_78 : vec2<i32> = x_78_1;
+
+    continuing {
+      x_81 = (x_80 + 1);
+      x_77_phi = x_78;
+      x_80_phi = x_81;
+    }
+  }
+  let x_105 : i32 = x_77.x;
+  x_111_phi = x_77;
+  if ((x_105 < 0)) {
+    x_110 = vec2<i32>(0, 0);
+    x_110.x = -(x_105);
+    x_111_phi = x_110;
+  }
+  let x_111 : vec2<i32> = x_111_phi;
+  x_113_phi = x_111;
+  loop {
+    var x_114 : vec2<i32>;
+    let x_113 : vec2<i32> = x_113_phi;
+    x_116 = x_113.x;
+    if ((x_116 > 15)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_114 = vec2<i32>(0, 0);
+      x_114.x = bitcast<i32>((x_116 - bitcast<i32>(16)));
+      x_113_phi = x_114;
+    }
+  }
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+  let x_121 : vec4<f32> = indexable[x_116];
+  x_GLF_color = x_121;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/0.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/0.wgsl
new file mode 100644
index 0000000..be331aa
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/0.wgsl
@@ -0,0 +1,105 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var indexable : array<vec4<f32>, 16>;
+  var x_77 : vec2<i32>;
+  var x_110 : vec2<i32>;
+  var x_116 : i32;
+  var x_77_phi : vec2<i32>;
+  var x_80_phi : i32;
+  var x_111_phi : vec2<i32>;
+  var x_113_phi : vec2<i32>;
+  let x_56 : vec4<f32> = gl_FragCoord;
+  let x_59 : vec2<f32> = x_6.resolution;
+  let x_60 : vec2<f32> = (vec2<f32>(x_56.x, x_56.y) / x_59);
+  let x_63 : i32 = i32((x_60.x * 8.0));
+  let x_66 : i32 = i32((x_60.y * 8.0));
+  let x_75 : vec2<i32> = vec2<i32>(((((x_63 & 5) | (x_66 & 10)) * 8) + ((x_66 & 5) | (x_63 & 10))), 0);
+  x_77_phi = x_75;
+  x_80_phi = 0;
+  loop {
+    var x_91 : vec2<i32>;
+    var x_99 : vec2<i32>;
+    var x_81 : i32;
+    var x_92_phi : vec2<i32>;
+    var x_100_phi : vec2<i32>;
+    x_77 = x_77_phi;
+    let x_80 : i32 = x_80_phi;
+    if ((x_80 < 100)) {
+    } else {
+      break;
+    }
+    x_92_phi = x_77;
+    if ((x_77.x > 0)) {
+      x_91 = x_77;
+      x_91.y = (x_77.y - 1);
+      x_92_phi = x_91;
+    }
+    let x_92 : vec2<i32> = x_92_phi;
+    x_100_phi = x_92;
+    if ((x_92.x < 0)) {
+      x_99 = x_92;
+      x_99.y = (x_92.y + 1);
+      x_100_phi = x_99;
+    }
+    let x_100 : vec2<i32> = x_100_phi;
+    var x_78_1 : vec2<i32> = x_100;
+    x_78_1.x = (x_100.x + (x_100.y / 2));
+    let x_78 : vec2<i32> = x_78_1;
+
+    continuing {
+      x_81 = (x_80 + 1);
+      x_77_phi = x_78;
+      x_80_phi = x_81;
+    }
+  }
+  let x_105 : i32 = x_77.x;
+  x_111_phi = x_77;
+  if ((x_105 < 0)) {
+    x_110 = vec2<i32>(0, 0);
+    x_110.x = -(x_105);
+    x_111_phi = x_110;
+  }
+  let x_111 : vec2<i32> = x_111_phi;
+  x_113_phi = x_111;
+  loop {
+    var x_114 : vec2<i32>;
+    let x_113 : vec2<i32> = x_113_phi;
+    x_116 = x_113.x;
+    if ((x_116 > 15)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_114 = vec2<i32>(0, 0);
+      x_114.x = bitcast<i32>((x_116 - bitcast<i32>(16)));
+      x_113_phi = x_114;
+    }
+  }
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+  let x_121 : vec4<f32> = indexable[x_116];
+  x_GLF_color = x_121;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..5a6f9c4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/0.wgsl.expected.hlsl
@@ -0,0 +1,104 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 indexable[16] = (float4[16])0;
+  int2 x_77 = int2(0, 0);
+  int2 x_110 = int2(0, 0);
+  int x_116 = 0;
+  int2 x_77_phi = int2(0, 0);
+  int x_80_phi = 0;
+  int2 x_111_phi = int2(0, 0);
+  int2 x_113_phi = int2(0, 0);
+  const float4 x_56 = gl_FragCoord;
+  const float2 x_59 = asfloat(x_6[0].xy);
+  const float2 x_60 = (float2(x_56.x, x_56.y) / x_59);
+  const int x_63 = int((x_60.x * 8.0f));
+  const int x_66 = int((x_60.y * 8.0f));
+  const int2 x_75 = int2(((((x_63 & 5) | (x_66 & 10)) * 8) + ((x_66 & 5) | (x_63 & 10))), 0);
+  x_77_phi = x_75;
+  x_80_phi = 0;
+  while (true) {
+    int2 x_91 = int2(0, 0);
+    int2 x_99 = int2(0, 0);
+    int x_81 = 0;
+    int2 x_92_phi = int2(0, 0);
+    int2 x_100_phi = int2(0, 0);
+    x_77 = x_77_phi;
+    const int x_80 = x_80_phi;
+    if ((x_80 < 100)) {
+    } else {
+      break;
+    }
+    x_92_phi = x_77;
+    if ((x_77.x > 0)) {
+      x_91 = x_77;
+      x_91.y = (x_77.y - 1);
+      x_92_phi = x_91;
+    }
+    const int2 x_92 = x_92_phi;
+    x_100_phi = x_92;
+    if ((x_92.x < 0)) {
+      x_99 = x_92;
+      x_99.y = (x_92.y + 1);
+      x_100_phi = x_99;
+    }
+    const int2 x_100 = x_100_phi;
+    int2 x_78_1 = x_100;
+    x_78_1.x = (x_100.x + (x_100.y / 2));
+    const int2 x_78 = x_78_1;
+    {
+      x_81 = (x_80 + 1);
+      x_77_phi = x_78;
+      x_80_phi = x_81;
+    }
+  }
+  const int x_105 = x_77.x;
+  x_111_phi = x_77;
+  if ((x_105 < 0)) {
+    x_110 = int2(0, 0);
+    x_110.x = -(x_105);
+    x_111_phi = x_110;
+  }
+  x_113_phi = x_111_phi;
+  while (true) {
+    int2 x_114 = int2(0, 0);
+    x_116 = x_113_phi.x;
+    if ((x_116 > 15)) {
+    } else {
+      break;
+    }
+    {
+      x_114 = int2(0, 0);
+      x_114.x = asint((x_116 - asint(16)));
+      x_113_phi = x_114;
+    }
+  }
+  const float4 tint_symbol_5[16] = {float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)};
+  indexable = tint_symbol_5;
+  const float4 x_121 = indexable[x_116];
+  x_GLF_color = x_121;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/0.wgsl.expected.msl
new file mode 100644
index 0000000..4266776
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/0.wgsl.expected.msl
@@ -0,0 +1,108 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  float4 arr[16];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  tint_array_wrapper indexable = {};
+  int2 x_77 = 0;
+  int2 x_110 = 0;
+  int x_116 = 0;
+  int2 x_77_phi = 0;
+  int x_80_phi = 0;
+  int2 x_111_phi = 0;
+  int2 x_113_phi = 0;
+  float4 const x_56 = *(tint_symbol_6);
+  float2 const x_59 = x_6.resolution;
+  float2 const x_60 = (float2(x_56.x, x_56.y) / x_59);
+  int const x_63 = int((x_60.x * 8.0f));
+  int const x_66 = int((x_60.y * 8.0f));
+  int2 const x_75 = int2(((((x_63 & 5) | (x_66 & 10)) * 8) + ((x_66 & 5) | (x_63 & 10))), 0);
+  x_77_phi = x_75;
+  x_80_phi = 0;
+  while (true) {
+    int2 x_91 = 0;
+    int2 x_99 = 0;
+    int x_81 = 0;
+    int2 x_92_phi = 0;
+    int2 x_100_phi = 0;
+    x_77 = x_77_phi;
+    int const x_80 = x_80_phi;
+    if ((x_80 < 100)) {
+    } else {
+      break;
+    }
+    x_92_phi = x_77;
+    if ((x_77.x > 0)) {
+      x_91 = x_77;
+      x_91.y = (x_77.y - 1);
+      x_92_phi = x_91;
+    }
+    int2 const x_92 = x_92_phi;
+    x_100_phi = x_92;
+    if ((x_92.x < 0)) {
+      x_99 = x_92;
+      x_99.y = (x_92.y + 1);
+      x_100_phi = x_99;
+    }
+    int2 const x_100 = x_100_phi;
+    int2 x_78_1 = x_100;
+    x_78_1.x = (x_100.x + (x_100.y / 2));
+    int2 const x_78 = x_78_1;
+    {
+      x_81 = (x_80 + 1);
+      x_77_phi = x_78;
+      x_80_phi = x_81;
+    }
+  }
+  int const x_105 = x_77.x;
+  x_111_phi = x_77;
+  if ((x_105 < 0)) {
+    x_110 = int2(0, 0);
+    x_110.x = -(x_105);
+    x_111_phi = x_110;
+  }
+  int2 const x_111 = x_111_phi;
+  x_113_phi = x_111;
+  while (true) {
+    int2 x_114 = 0;
+    int2 const x_113 = x_113_phi;
+    x_116 = x_113.x;
+    if ((x_116 > 15)) {
+    } else {
+      break;
+    }
+    {
+      x_114 = int2(0, 0);
+      x_114.x = as_type<int>((x_116 - as_type<int>(16)));
+      x_113_phi = x_114;
+    }
+  }
+  tint_array_wrapper const tint_symbol_4 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
+  indexable = tint_symbol_4;
+  float4 const x_121 = indexable.arr[x_116];
+  *(tint_symbol_7) = x_121;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..d89e65c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/0.wgsl.expected.spvasm
@@ -0,0 +1,292 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 185
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %indexable "indexable"
+               OpName %x_77 "x_77"
+               OpName %x_110 "x_110"
+               OpName %x_116 "x_116"
+               OpName %x_77_phi "x_77_phi"
+               OpName %x_80_phi "x_80_phi"
+               OpName %x_111_phi "x_111_phi"
+               OpName %x_113_phi "x_113_phi"
+               OpName %x_91 "x_91"
+               OpName %x_99 "x_99"
+               OpName %x_81 "x_81"
+               OpName %x_92_phi "x_92_phi"
+               OpName %x_100_phi "x_100_phi"
+               OpName %x_78_1 "x_78_1"
+               OpName %x_114 "x_114"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v4float_uint_16 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+         %24 = OpConstantNull %_arr_v4float_uint_16
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %29 = OpConstantNull %v2int
+%_ptr_Function_int = OpTypePointer Function %int
+         %33 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_8 = OpConstant %float 8
+      %int_5 = OpConstant %int 5
+     %int_10 = OpConstant %int 10
+      %int_8 = OpConstant %int 8
+      %int_0 = OpConstant %int 0
+    %int_100 = OpConstant %int 100
+       %bool = OpTypeBool
+     %uint_1 = OpConstant %uint 1
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+        %124 = OpConstantComposite %v2int %int_0 %int_0
+     %int_15 = OpConstant %int 15
+     %int_16 = OpConstant %int 16
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+        %151 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+  %float_0_5 = OpConstant %float 0.5
+        %153 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+        %154 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+        %155 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+        %156 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+        %157 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+        %158 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+        %159 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+        %160 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %161 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+        %162 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+        %163 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+        %164 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+        %165 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+        %166 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+        %167 = OpConstantComposite %_arr_v4float_uint_16 %151 %153 %154 %155 %156 %157 %158 %159 %151 %160 %161 %162 %163 %164 %165 %166
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+   %main_out = OpTypeStruct %v4float
+        %172 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_16 Function %24
+       %x_77 = OpVariable %_ptr_Function_v2int Function %29
+      %x_110 = OpVariable %_ptr_Function_v2int Function %29
+      %x_116 = OpVariable %_ptr_Function_int Function %33
+   %x_77_phi = OpVariable %_ptr_Function_v2int Function %29
+   %x_80_phi = OpVariable %_ptr_Function_int Function %33
+  %x_111_phi = OpVariable %_ptr_Function_v2int Function %29
+  %x_113_phi = OpVariable %_ptr_Function_v2int Function %29
+       %x_91 = OpVariable %_ptr_Function_v2int Function %29
+       %x_99 = OpVariable %_ptr_Function_v2int Function %29
+       %x_81 = OpVariable %_ptr_Function_int Function %33
+   %x_92_phi = OpVariable %_ptr_Function_v2int Function %29
+  %x_100_phi = OpVariable %_ptr_Function_v2int Function %29
+     %x_78_1 = OpVariable %_ptr_Function_v2int Function %29
+      %x_114 = OpVariable %_ptr_Function_v2int Function %29
+         %38 = OpLoad %v4float %gl_FragCoord
+         %41 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %42 = OpLoad %v2float %41
+         %43 = OpCompositeExtract %float %38 0
+         %44 = OpCompositeExtract %float %38 1
+         %45 = OpCompositeConstruct %v2float %43 %44
+         %46 = OpFDiv %v2float %45 %42
+         %48 = OpCompositeExtract %float %46 0
+         %50 = OpFMul %float %48 %float_8
+         %47 = OpConvertFToS %int %50
+         %52 = OpCompositeExtract %float %46 1
+         %53 = OpFMul %float %52 %float_8
+         %51 = OpConvertFToS %int %53
+         %55 = OpBitwiseAnd %int %47 %int_5
+         %57 = OpBitwiseAnd %int %51 %int_10
+         %58 = OpBitwiseOr %int %55 %57
+         %60 = OpIMul %int %58 %int_8
+         %61 = OpBitwiseAnd %int %51 %int_5
+         %62 = OpBitwiseAnd %int %47 %int_10
+         %63 = OpBitwiseOr %int %61 %62
+         %64 = OpIAdd %int %60 %63
+         %66 = OpCompositeConstruct %v2int %64 %int_0
+               OpStore %x_77_phi %66
+               OpStore %x_80_phi %int_0
+               OpBranch %67
+         %67 = OpLabel
+               OpLoopMerge %68 %69 None
+               OpBranch %70
+         %70 = OpLabel
+         %76 = OpLoad %v2int %x_77_phi
+               OpStore %x_77 %76
+         %77 = OpLoad %int %x_80_phi
+         %79 = OpSLessThan %bool %77 %int_100
+               OpSelectionMerge %81 None
+               OpBranchConditional %79 %82 %83
+         %82 = OpLabel
+               OpBranch %81
+         %83 = OpLabel
+               OpBranch %68
+         %81 = OpLabel
+         %84 = OpLoad %v2int %x_77
+               OpStore %x_92_phi %84
+         %85 = OpAccessChain %_ptr_Function_int %x_77 %uint_0
+         %86 = OpLoad %int %85
+         %87 = OpSGreaterThan %bool %86 %int_0
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %88
+         %89 = OpLabel
+         %90 = OpLoad %v2int %x_77
+               OpStore %x_91 %90
+         %92 = OpAccessChain %_ptr_Function_int %x_91 %uint_1
+         %93 = OpAccessChain %_ptr_Function_int %x_77 %uint_1
+         %94 = OpLoad %int %93
+         %96 = OpISub %int %94 %int_1
+               OpStore %92 %96
+         %97 = OpLoad %v2int %x_91
+               OpStore %x_92_phi %97
+               OpBranch %88
+         %88 = OpLabel
+         %98 = OpLoad %v2int %x_92_phi
+               OpStore %x_100_phi %98
+         %99 = OpCompositeExtract %int %98 0
+        %100 = OpSLessThan %bool %99 %int_0
+               OpSelectionMerge %101 None
+               OpBranchConditional %100 %102 %101
+        %102 = OpLabel
+               OpStore %x_99 %98
+        %103 = OpAccessChain %_ptr_Function_int %x_99 %uint_1
+        %104 = OpCompositeExtract %int %98 1
+        %105 = OpIAdd %int %104 %int_1
+               OpStore %103 %105
+        %106 = OpLoad %v2int %x_99
+               OpStore %x_100_phi %106
+               OpBranch %101
+        %101 = OpLabel
+        %107 = OpLoad %v2int %x_100_phi
+               OpStore %x_78_1 %107
+        %109 = OpAccessChain %_ptr_Function_int %x_78_1 %uint_0
+        %110 = OpCompositeExtract %int %107 0
+        %111 = OpCompositeExtract %int %107 1
+        %113 = OpSDiv %int %111 %int_2
+        %114 = OpIAdd %int %110 %113
+               OpStore %109 %114
+        %115 = OpLoad %v2int %x_78_1
+               OpBranch %69
+         %69 = OpLabel
+        %116 = OpIAdd %int %77 %int_1
+               OpStore %x_81 %116
+               OpStore %x_77_phi %115
+        %117 = OpLoad %int %x_81
+               OpStore %x_80_phi %117
+               OpBranch %67
+         %68 = OpLabel
+        %118 = OpAccessChain %_ptr_Function_int %x_77 %uint_0
+        %119 = OpLoad %int %118
+        %120 = OpLoad %v2int %x_77
+               OpStore %x_111_phi %120
+        %121 = OpSLessThan %bool %119 %int_0
+               OpSelectionMerge %122 None
+               OpBranchConditional %121 %123 %122
+        %123 = OpLabel
+               OpStore %x_110 %124
+        %125 = OpAccessChain %_ptr_Function_int %x_110 %uint_0
+        %126 = OpSNegate %int %119
+               OpStore %125 %126
+        %127 = OpLoad %v2int %x_110
+               OpStore %x_111_phi %127
+               OpBranch %122
+        %122 = OpLabel
+        %128 = OpLoad %v2int %x_111_phi
+               OpStore %x_113_phi %128
+               OpBranch %129
+        %129 = OpLabel
+               OpLoopMerge %130 %131 None
+               OpBranch %132
+        %132 = OpLabel
+        %134 = OpLoad %v2int %x_113_phi
+        %135 = OpCompositeExtract %int %134 0
+               OpStore %x_116 %135
+        %136 = OpLoad %int %x_116
+        %138 = OpSGreaterThan %bool %136 %int_15
+               OpSelectionMerge %139 None
+               OpBranchConditional %138 %140 %141
+        %140 = OpLabel
+               OpBranch %139
+        %141 = OpLabel
+               OpBranch %130
+        %139 = OpLabel
+               OpBranch %131
+        %131 = OpLabel
+               OpStore %x_114 %124
+        %142 = OpAccessChain %_ptr_Function_int %x_114 %uint_0
+        %144 = OpLoad %int %x_116
+        %145 = OpCopyObject %int %int_16
+        %147 = OpISub %int %144 %145
+        %143 = OpCopyObject %int %147
+               OpStore %142 %143
+        %148 = OpLoad %v2int %x_114
+               OpStore %x_113_phi %148
+               OpBranch %129
+        %130 = OpLabel
+               OpStore %indexable %167
+        %168 = OpLoad %int %x_116
+        %170 = OpAccessChain %_ptr_Function_v4float %indexable %168
+        %171 = OpLoad %v4float %170
+               OpStore %x_GLF_color %171
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %172
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %176 = OpLabel
+        %177 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %177
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %179 = OpLabel
+        %180 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %180
+        %181 = OpFunctionCall %void %main_1
+        %183 = OpLoad %v4float %x_GLF_color
+        %184 = OpCompositeConstruct %main_out %183
+        %182 = OpFunctionCall %void %tint_symbol_3 %184
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..be331aa
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/0.wgsl.expected.wgsl
@@ -0,0 +1,105 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var indexable : array<vec4<f32>, 16>;
+  var x_77 : vec2<i32>;
+  var x_110 : vec2<i32>;
+  var x_116 : i32;
+  var x_77_phi : vec2<i32>;
+  var x_80_phi : i32;
+  var x_111_phi : vec2<i32>;
+  var x_113_phi : vec2<i32>;
+  let x_56 : vec4<f32> = gl_FragCoord;
+  let x_59 : vec2<f32> = x_6.resolution;
+  let x_60 : vec2<f32> = (vec2<f32>(x_56.x, x_56.y) / x_59);
+  let x_63 : i32 = i32((x_60.x * 8.0));
+  let x_66 : i32 = i32((x_60.y * 8.0));
+  let x_75 : vec2<i32> = vec2<i32>(((((x_63 & 5) | (x_66 & 10)) * 8) + ((x_66 & 5) | (x_63 & 10))), 0);
+  x_77_phi = x_75;
+  x_80_phi = 0;
+  loop {
+    var x_91 : vec2<i32>;
+    var x_99 : vec2<i32>;
+    var x_81 : i32;
+    var x_92_phi : vec2<i32>;
+    var x_100_phi : vec2<i32>;
+    x_77 = x_77_phi;
+    let x_80 : i32 = x_80_phi;
+    if ((x_80 < 100)) {
+    } else {
+      break;
+    }
+    x_92_phi = x_77;
+    if ((x_77.x > 0)) {
+      x_91 = x_77;
+      x_91.y = (x_77.y - 1);
+      x_92_phi = x_91;
+    }
+    let x_92 : vec2<i32> = x_92_phi;
+    x_100_phi = x_92;
+    if ((x_92.x < 0)) {
+      x_99 = x_92;
+      x_99.y = (x_92.y + 1);
+      x_100_phi = x_99;
+    }
+    let x_100 : vec2<i32> = x_100_phi;
+    var x_78_1 : vec2<i32> = x_100;
+    x_78_1.x = (x_100.x + (x_100.y / 2));
+    let x_78 : vec2<i32> = x_78_1;
+
+    continuing {
+      x_81 = (x_80 + 1);
+      x_77_phi = x_78;
+      x_80_phi = x_81;
+    }
+  }
+  let x_105 : i32 = x_77.x;
+  x_111_phi = x_77;
+  if ((x_105 < 0)) {
+    x_110 = vec2<i32>(0, 0);
+    x_110.x = -(x_105);
+    x_111_phi = x_110;
+  }
+  let x_111 : vec2<i32> = x_111_phi;
+  x_113_phi = x_111;
+  loop {
+    var x_114 : vec2<i32>;
+    let x_113 : vec2<i32> = x_113_phi;
+    x_116 = x_113.x;
+    if ((x_116 > 15)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_114 = vec2<i32>(0, 0);
+      x_114.x = bitcast<i32>((x_116 - bitcast<i32>(16)));
+      x_113_phi = x_114;
+    }
+  }
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+  let x_121 : vec4<f32> = indexable[x_116];
+  x_GLF_color = x_121;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/1.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/1.spvasm
new file mode 100644
index 0000000..d7ff45c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/1.spvasm
@@ -0,0 +1,167 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpName %indexable "indexable"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+       %uint = OpTypeInt 32 0
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_8 = OpConstant %float 8
+      %int_5 = OpConstant %int 5
+     %int_10 = OpConstant %int 10
+      %int_8 = OpConstant %int 8
+    %int_100 = OpConstant %int 100
+     %int_15 = OpConstant %int 15
+     %int_16 = OpConstant %int 16
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %35 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+  %float_0_5 = OpConstant %float 0.5
+         %37 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+         %38 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+         %39 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+         %40 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+         %41 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+         %42 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+         %43 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+         %44 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %45 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+         %46 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+         %47 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+         %48 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+         %49 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+         %50 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+         %51 = OpConstantComposite %_arr_v4float_uint_16 %35 %37 %38 %39 %40 %41 %42 %43 %35 %44 %45 %46 %47 %48 %49 %50
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+         %54 = OpUndef %v2int
+  %float_0_0 = OpConstant %float 0
+         %56 = OpConstantComposite %v4float %float_0_0 %float_0_0 %float_0_0 %float_0_0
+         %57 = OpConstantComposite %_arr_v4float_uint_16 %56 %56 %56 %56 %56 %56 %56 %56 %56 %56 %56 %56 %56 %56 %56 %56
+       %main = OpFunction %void None %9
+         %58 = OpLabel
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_16 Function
+         %59 = OpLoad %v4float %gl_FragCoord
+         %60 = OpVectorShuffle %v2float %59 %59 0 1
+         %61 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+         %62 = OpLoad %v2float %61
+         %63 = OpFDiv %v2float %60 %62
+         %64 = OpCompositeExtract %float %63 0
+         %65 = OpFMul %float %64 %float_8
+         %66 = OpConvertFToS %int %65
+         %67 = OpCompositeExtract %float %63 1
+         %68 = OpFMul %float %67 %float_8
+         %69 = OpConvertFToS %int %68
+         %70 = OpBitwiseAnd %int %66 %int_5
+         %71 = OpBitwiseAnd %int %69 %int_10
+         %72 = OpBitwiseOr %int %70 %71
+         %73 = OpBitwiseAnd %int %69 %int_5
+         %74 = OpBitwiseAnd %int %66 %int_10
+         %75 = OpBitwiseOr %int %73 %74
+         %76 = OpIMul %int %72 %int_8
+         %77 = OpIAdd %int %76 %75
+         %78 = OpCompositeConstruct %v2int %77 %int_0
+               OpBranch %79
+         %79 = OpLabel
+         %80 = OpPhi %v2int %78 %58 %81 %82
+         %83 = OpPhi %int %int_0 %58 %84 %82
+         %85 = OpSLessThan %bool %83 %int_100
+               OpLoopMerge %86 %82 None
+               OpBranchConditional %85 %87 %86
+         %87 = OpLabel
+         %88 = OpCompositeExtract %int %80 0
+         %89 = OpSGreaterThan %bool %88 %int_0
+               OpSelectionMerge %90 None
+               OpBranchConditional %89 %91 %90
+         %91 = OpLabel
+         %92 = OpCompositeExtract %int %80 1
+         %93 = OpISub %int %92 %int_1
+         %94 = OpCompositeInsert %v2int %93 %80 1
+               OpBranch %90
+         %90 = OpLabel
+         %95 = OpPhi %v2int %80 %87 %94 %91
+         %96 = OpCompositeExtract %int %95 0
+         %97 = OpSLessThan %bool %96 %int_0
+               OpSelectionMerge %98 None
+               OpBranchConditional %97 %99 %98
+         %99 = OpLabel
+        %100 = OpCompositeExtract %int %95 1
+        %101 = OpIAdd %int %100 %int_1
+        %102 = OpCompositeInsert %v2int %101 %95 1
+               OpBranch %98
+         %98 = OpLabel
+        %103 = OpPhi %v2int %95 %90 %102 %99
+        %104 = OpCompositeExtract %int %103 1
+        %105 = OpSDiv %int %104 %int_2
+        %106 = OpCompositeExtract %int %103 0
+        %107 = OpIAdd %int %106 %105
+         %81 = OpCompositeInsert %v2int %107 %103 0
+               OpBranch %82
+         %82 = OpLabel
+         %84 = OpIAdd %int %83 %int_1
+               OpBranch %79
+         %86 = OpLabel
+        %108 = OpCompositeExtract %int %80 0
+        %109 = OpSLessThan %bool %108 %int_0
+               OpSelectionMerge %110 None
+               OpBranchConditional %109 %111 %110
+        %111 = OpLabel
+        %112 = OpSNegate %int %108
+        %113 = OpCompositeInsert %v2int %112 %54 0
+               OpBranch %110
+        %110 = OpLabel
+        %114 = OpPhi %v2int %80 %86 %113 %111
+               OpBranch %115
+        %115 = OpLabel
+        %116 = OpPhi %v2int %114 %110 %117 %118
+        %119 = OpCompositeExtract %int %116 0
+        %120 = OpSGreaterThan %bool %119 %int_15
+               OpLoopMerge %121 %118 None
+               OpBranchConditional %120 %118 %121
+        %118 = OpLabel
+        %122 = OpISub %int %119 %int_16
+        %117 = OpCompositeInsert %v2int %122 %54 0
+               OpBranch %115
+        %121 = OpLabel
+               OpStore %indexable %51
+        %123 = OpLoad %_arr_v4float_uint_16 %indexable
+               OpStore %indexable %57
+               OpStore %indexable %123
+        %124 = OpAccessChain %_ptr_Function_v4float %indexable %119
+        %125 = OpLoad %v4float %124
+               OpStore %_GLF_color %125
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..9baedc8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/1.spvasm.expected.hlsl
@@ -0,0 +1,108 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 indexable[16] = (float4[16])0;
+  int2 x_80 = int2(0, 0);
+  int2 x_113 = int2(0, 0);
+  int x_119 = 0;
+  int2 x_80_phi = int2(0, 0);
+  int x_83_phi = 0;
+  int2 x_114_phi = int2(0, 0);
+  int2 x_116_phi = int2(0, 0);
+  const float4 x_59 = gl_FragCoord;
+  const float2 x_62 = asfloat(x_6[0].xy);
+  const float2 x_63 = (float2(x_59.x, x_59.y) / x_62);
+  const int x_66 = int((x_63.x * 8.0f));
+  const int x_69 = int((x_63.y * 8.0f));
+  const int2 x_78 = int2(((((x_66 & 5) | (x_69 & 10)) * 8) + ((x_69 & 5) | (x_66 & 10))), 0);
+  x_80_phi = x_78;
+  x_83_phi = 0;
+  while (true) {
+    int2 x_94 = int2(0, 0);
+    int2 x_102 = int2(0, 0);
+    int x_84 = 0;
+    int2 x_95_phi = int2(0, 0);
+    int2 x_103_phi = int2(0, 0);
+    x_80 = x_80_phi;
+    const int x_83 = x_83_phi;
+    if ((x_83 < 100)) {
+    } else {
+      break;
+    }
+    x_95_phi = x_80;
+    if ((x_80.x > 0)) {
+      x_94 = x_80;
+      x_94.y = (x_80.y - 1);
+      x_95_phi = x_94;
+    }
+    const int2 x_95 = x_95_phi;
+    x_103_phi = x_95;
+    if ((x_95.x < 0)) {
+      x_102 = x_95;
+      x_102.y = (x_95.y + 1);
+      x_103_phi = x_102;
+    }
+    const int2 x_103 = x_103_phi;
+    int2 x_81_1 = x_103;
+    x_81_1.x = (x_103.x + (x_103.y / 2));
+    const int2 x_81 = x_81_1;
+    {
+      x_84 = (x_83 + 1);
+      x_80_phi = x_81;
+      x_83_phi = x_84;
+    }
+  }
+  const int x_108 = x_80.x;
+  x_114_phi = x_80;
+  if ((x_108 < 0)) {
+    x_113 = int2(0, 0);
+    x_113.x = -(x_108);
+    x_114_phi = x_113;
+  }
+  x_116_phi = x_114_phi;
+  while (true) {
+    int2 x_117 = int2(0, 0);
+    x_119 = x_116_phi.x;
+    if ((x_119 > 15)) {
+    } else {
+      break;
+    }
+    {
+      x_117 = int2(0, 0);
+      x_117.x = asint((x_119 - asint(16)));
+      x_116_phi = x_117;
+    }
+  }
+  const float4 tint_symbol_5[16] = {float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)};
+  indexable = tint_symbol_5;
+  const float4 x_123[16] = indexable;
+  const float4 tint_symbol_6[16] = {float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)};
+  indexable = tint_symbol_6;
+  indexable = x_123;
+  const float4 x_125 = indexable[x_119];
+  x_GLF_color = x_125;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_7 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_7;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/1.spvasm.expected.msl
new file mode 100644
index 0000000..0e7d864
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/1.spvasm.expected.msl
@@ -0,0 +1,112 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  float4 arr[16];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_7, thread float4* const tint_symbol_8) {
+  tint_array_wrapper indexable = {};
+  int2 x_80 = 0;
+  int2 x_113 = 0;
+  int x_119 = 0;
+  int2 x_80_phi = 0;
+  int x_83_phi = 0;
+  int2 x_114_phi = 0;
+  int2 x_116_phi = 0;
+  float4 const x_59 = *(tint_symbol_7);
+  float2 const x_62 = x_6.resolution;
+  float2 const x_63 = (float2(x_59.x, x_59.y) / x_62);
+  int const x_66 = int((x_63.x * 8.0f));
+  int const x_69 = int((x_63.y * 8.0f));
+  int2 const x_78 = int2(((((x_66 & 5) | (x_69 & 10)) * 8) + ((x_69 & 5) | (x_66 & 10))), 0);
+  x_80_phi = x_78;
+  x_83_phi = 0;
+  while (true) {
+    int2 x_94 = 0;
+    int2 x_102 = 0;
+    int x_84 = 0;
+    int2 x_95_phi = 0;
+    int2 x_103_phi = 0;
+    x_80 = x_80_phi;
+    int const x_83 = x_83_phi;
+    if ((x_83 < 100)) {
+    } else {
+      break;
+    }
+    x_95_phi = x_80;
+    if ((x_80.x > 0)) {
+      x_94 = x_80;
+      x_94.y = (x_80.y - 1);
+      x_95_phi = x_94;
+    }
+    int2 const x_95 = x_95_phi;
+    x_103_phi = x_95;
+    if ((x_95.x < 0)) {
+      x_102 = x_95;
+      x_102.y = (x_95.y + 1);
+      x_103_phi = x_102;
+    }
+    int2 const x_103 = x_103_phi;
+    int2 x_81_1 = x_103;
+    x_81_1.x = (x_103.x + (x_103.y / 2));
+    int2 const x_81 = x_81_1;
+    {
+      x_84 = (x_83 + 1);
+      x_80_phi = x_81;
+      x_83_phi = x_84;
+    }
+  }
+  int const x_108 = x_80.x;
+  x_114_phi = x_80;
+  if ((x_108 < 0)) {
+    x_113 = int2(0, 0);
+    x_113.x = -(x_108);
+    x_114_phi = x_113;
+  }
+  int2 const x_114 = x_114_phi;
+  x_116_phi = x_114;
+  while (true) {
+    int2 x_117 = 0;
+    int2 const x_116 = x_116_phi;
+    x_119 = x_116.x;
+    if ((x_119 > 15)) {
+    } else {
+      break;
+    }
+    {
+      x_117 = int2(0, 0);
+      x_117.x = as_type<int>((x_119 - as_type<int>(16)));
+      x_116_phi = x_117;
+    }
+  }
+  tint_array_wrapper const tint_symbol_4 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
+  indexable = tint_symbol_4;
+  tint_array_wrapper const x_123 = indexable;
+  tint_array_wrapper const tint_symbol_5 = {.arr={float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)}};
+  indexable = tint_symbol_5;
+  indexable = x_123;
+  float4 const x_125 = indexable.arr[x_119];
+  *(tint_symbol_8) = x_125;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_9 = 0.0f;
+  thread float4 tint_symbol_10 = 0.0f;
+  tint_symbol_9 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_9), &(tint_symbol_10));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_10};
+  tint_symbol_2 const tint_symbol_6 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..0b49352
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/1.spvasm.expected.spvasm
@@ -0,0 +1,297 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 188
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %indexable "indexable"
+               OpName %x_80 "x_80"
+               OpName %x_113 "x_113"
+               OpName %x_119 "x_119"
+               OpName %x_80_phi "x_80_phi"
+               OpName %x_83_phi "x_83_phi"
+               OpName %x_114_phi "x_114_phi"
+               OpName %x_116_phi "x_116_phi"
+               OpName %x_94 "x_94"
+               OpName %x_102 "x_102"
+               OpName %x_84 "x_84"
+               OpName %x_95_phi "x_95_phi"
+               OpName %x_103_phi "x_103_phi"
+               OpName %x_81_1 "x_81_1"
+               OpName %x_117 "x_117"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v4float_uint_16 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+         %24 = OpConstantNull %_arr_v4float_uint_16
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %29 = OpConstantNull %v2int
+%_ptr_Function_int = OpTypePointer Function %int
+         %33 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_8 = OpConstant %float 8
+      %int_5 = OpConstant %int 5
+     %int_10 = OpConstant %int 10
+      %int_8 = OpConstant %int 8
+      %int_0 = OpConstant %int 0
+    %int_100 = OpConstant %int 100
+       %bool = OpTypeBool
+     %uint_1 = OpConstant %uint 1
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+        %124 = OpConstantComposite %v2int %int_0 %int_0
+     %int_15 = OpConstant %int 15
+     %int_16 = OpConstant %int 16
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+        %151 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+  %float_0_5 = OpConstant %float 0.5
+        %153 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+        %154 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+        %155 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+        %156 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+        %157 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+        %158 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+        %159 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+        %160 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %161 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+        %162 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+        %163 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+        %164 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+        %165 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+        %166 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+        %167 = OpConstantComposite %_arr_v4float_uint_16 %151 %153 %154 %155 %156 %157 %158 %159 %151 %160 %161 %162 %163 %164 %165 %166
+        %169 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+        %170 = OpConstantComposite %_arr_v4float_uint_16 %169 %169 %169 %169 %169 %169 %169 %169 %169 %169 %169 %169 %169 %169 %169 %169
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+   %main_out = OpTypeStruct %v4float
+        %175 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_16 Function %24
+       %x_80 = OpVariable %_ptr_Function_v2int Function %29
+      %x_113 = OpVariable %_ptr_Function_v2int Function %29
+      %x_119 = OpVariable %_ptr_Function_int Function %33
+   %x_80_phi = OpVariable %_ptr_Function_v2int Function %29
+   %x_83_phi = OpVariable %_ptr_Function_int Function %33
+  %x_114_phi = OpVariable %_ptr_Function_v2int Function %29
+  %x_116_phi = OpVariable %_ptr_Function_v2int Function %29
+       %x_94 = OpVariable %_ptr_Function_v2int Function %29
+      %x_102 = OpVariable %_ptr_Function_v2int Function %29
+       %x_84 = OpVariable %_ptr_Function_int Function %33
+   %x_95_phi = OpVariable %_ptr_Function_v2int Function %29
+  %x_103_phi = OpVariable %_ptr_Function_v2int Function %29
+     %x_81_1 = OpVariable %_ptr_Function_v2int Function %29
+      %x_117 = OpVariable %_ptr_Function_v2int Function %29
+         %38 = OpLoad %v4float %gl_FragCoord
+         %41 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %42 = OpLoad %v2float %41
+         %43 = OpCompositeExtract %float %38 0
+         %44 = OpCompositeExtract %float %38 1
+         %45 = OpCompositeConstruct %v2float %43 %44
+         %46 = OpFDiv %v2float %45 %42
+         %48 = OpCompositeExtract %float %46 0
+         %50 = OpFMul %float %48 %float_8
+         %47 = OpConvertFToS %int %50
+         %52 = OpCompositeExtract %float %46 1
+         %53 = OpFMul %float %52 %float_8
+         %51 = OpConvertFToS %int %53
+         %55 = OpBitwiseAnd %int %47 %int_5
+         %57 = OpBitwiseAnd %int %51 %int_10
+         %58 = OpBitwiseOr %int %55 %57
+         %60 = OpIMul %int %58 %int_8
+         %61 = OpBitwiseAnd %int %51 %int_5
+         %62 = OpBitwiseAnd %int %47 %int_10
+         %63 = OpBitwiseOr %int %61 %62
+         %64 = OpIAdd %int %60 %63
+         %66 = OpCompositeConstruct %v2int %64 %int_0
+               OpStore %x_80_phi %66
+               OpStore %x_83_phi %int_0
+               OpBranch %67
+         %67 = OpLabel
+               OpLoopMerge %68 %69 None
+               OpBranch %70
+         %70 = OpLabel
+         %76 = OpLoad %v2int %x_80_phi
+               OpStore %x_80 %76
+         %77 = OpLoad %int %x_83_phi
+         %79 = OpSLessThan %bool %77 %int_100
+               OpSelectionMerge %81 None
+               OpBranchConditional %79 %82 %83
+         %82 = OpLabel
+               OpBranch %81
+         %83 = OpLabel
+               OpBranch %68
+         %81 = OpLabel
+         %84 = OpLoad %v2int %x_80
+               OpStore %x_95_phi %84
+         %85 = OpAccessChain %_ptr_Function_int %x_80 %uint_0
+         %86 = OpLoad %int %85
+         %87 = OpSGreaterThan %bool %86 %int_0
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %88
+         %89 = OpLabel
+         %90 = OpLoad %v2int %x_80
+               OpStore %x_94 %90
+         %92 = OpAccessChain %_ptr_Function_int %x_94 %uint_1
+         %93 = OpAccessChain %_ptr_Function_int %x_80 %uint_1
+         %94 = OpLoad %int %93
+         %96 = OpISub %int %94 %int_1
+               OpStore %92 %96
+         %97 = OpLoad %v2int %x_94
+               OpStore %x_95_phi %97
+               OpBranch %88
+         %88 = OpLabel
+         %98 = OpLoad %v2int %x_95_phi
+               OpStore %x_103_phi %98
+         %99 = OpCompositeExtract %int %98 0
+        %100 = OpSLessThan %bool %99 %int_0
+               OpSelectionMerge %101 None
+               OpBranchConditional %100 %102 %101
+        %102 = OpLabel
+               OpStore %x_102 %98
+        %103 = OpAccessChain %_ptr_Function_int %x_102 %uint_1
+        %104 = OpCompositeExtract %int %98 1
+        %105 = OpIAdd %int %104 %int_1
+               OpStore %103 %105
+        %106 = OpLoad %v2int %x_102
+               OpStore %x_103_phi %106
+               OpBranch %101
+        %101 = OpLabel
+        %107 = OpLoad %v2int %x_103_phi
+               OpStore %x_81_1 %107
+        %109 = OpAccessChain %_ptr_Function_int %x_81_1 %uint_0
+        %110 = OpCompositeExtract %int %107 0
+        %111 = OpCompositeExtract %int %107 1
+        %113 = OpSDiv %int %111 %int_2
+        %114 = OpIAdd %int %110 %113
+               OpStore %109 %114
+        %115 = OpLoad %v2int %x_81_1
+               OpBranch %69
+         %69 = OpLabel
+        %116 = OpIAdd %int %77 %int_1
+               OpStore %x_84 %116
+               OpStore %x_80_phi %115
+        %117 = OpLoad %int %x_84
+               OpStore %x_83_phi %117
+               OpBranch %67
+         %68 = OpLabel
+        %118 = OpAccessChain %_ptr_Function_int %x_80 %uint_0
+        %119 = OpLoad %int %118
+        %120 = OpLoad %v2int %x_80
+               OpStore %x_114_phi %120
+        %121 = OpSLessThan %bool %119 %int_0
+               OpSelectionMerge %122 None
+               OpBranchConditional %121 %123 %122
+        %123 = OpLabel
+               OpStore %x_113 %124
+        %125 = OpAccessChain %_ptr_Function_int %x_113 %uint_0
+        %126 = OpSNegate %int %119
+               OpStore %125 %126
+        %127 = OpLoad %v2int %x_113
+               OpStore %x_114_phi %127
+               OpBranch %122
+        %122 = OpLabel
+        %128 = OpLoad %v2int %x_114_phi
+               OpStore %x_116_phi %128
+               OpBranch %129
+        %129 = OpLabel
+               OpLoopMerge %130 %131 None
+               OpBranch %132
+        %132 = OpLabel
+        %134 = OpLoad %v2int %x_116_phi
+        %135 = OpCompositeExtract %int %134 0
+               OpStore %x_119 %135
+        %136 = OpLoad %int %x_119
+        %138 = OpSGreaterThan %bool %136 %int_15
+               OpSelectionMerge %139 None
+               OpBranchConditional %138 %140 %141
+        %140 = OpLabel
+               OpBranch %139
+        %141 = OpLabel
+               OpBranch %130
+        %139 = OpLabel
+               OpBranch %131
+        %131 = OpLabel
+               OpStore %x_117 %124
+        %142 = OpAccessChain %_ptr_Function_int %x_117 %uint_0
+        %144 = OpLoad %int %x_119
+        %145 = OpCopyObject %int %int_16
+        %147 = OpISub %int %144 %145
+        %143 = OpCopyObject %int %147
+               OpStore %142 %143
+        %148 = OpLoad %v2int %x_117
+               OpStore %x_116_phi %148
+               OpBranch %129
+        %130 = OpLabel
+               OpStore %indexable %167
+        %168 = OpLoad %_arr_v4float_uint_16 %indexable
+               OpStore %indexable %170
+               OpStore %indexable %168
+        %171 = OpLoad %int %x_119
+        %173 = OpAccessChain %_ptr_Function_v4float %indexable %171
+        %174 = OpLoad %v4float %173
+               OpStore %x_GLF_color %174
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %175
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %179 = OpLabel
+        %180 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %180
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %182 = OpLabel
+        %183 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %183
+        %184 = OpFunctionCall %void %main_1
+        %186 = OpLoad %v4float %x_GLF_color
+        %187 = OpCompositeConstruct %main_out %186
+        %185 = OpFunctionCall %void %tint_symbol_3 %187
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..0424d49
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/1.spvasm.expected.wgsl
@@ -0,0 +1,108 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var indexable : array<vec4<f32>, 16>;
+  var x_80 : vec2<i32>;
+  var x_113 : vec2<i32>;
+  var x_119 : i32;
+  var x_80_phi : vec2<i32>;
+  var x_83_phi : i32;
+  var x_114_phi : vec2<i32>;
+  var x_116_phi : vec2<i32>;
+  let x_59 : vec4<f32> = gl_FragCoord;
+  let x_62 : vec2<f32> = x_6.resolution;
+  let x_63 : vec2<f32> = (vec2<f32>(x_59.x, x_59.y) / x_62);
+  let x_66 : i32 = i32((x_63.x * 8.0));
+  let x_69 : i32 = i32((x_63.y * 8.0));
+  let x_78 : vec2<i32> = vec2<i32>(((((x_66 & 5) | (x_69 & 10)) * 8) + ((x_69 & 5) | (x_66 & 10))), 0);
+  x_80_phi = x_78;
+  x_83_phi = 0;
+  loop {
+    var x_94 : vec2<i32>;
+    var x_102 : vec2<i32>;
+    var x_84 : i32;
+    var x_95_phi : vec2<i32>;
+    var x_103_phi : vec2<i32>;
+    x_80 = x_80_phi;
+    let x_83 : i32 = x_83_phi;
+    if ((x_83 < 100)) {
+    } else {
+      break;
+    }
+    x_95_phi = x_80;
+    if ((x_80.x > 0)) {
+      x_94 = x_80;
+      x_94.y = (x_80.y - 1);
+      x_95_phi = x_94;
+    }
+    let x_95 : vec2<i32> = x_95_phi;
+    x_103_phi = x_95;
+    if ((x_95.x < 0)) {
+      x_102 = x_95;
+      x_102.y = (x_95.y + 1);
+      x_103_phi = x_102;
+    }
+    let x_103 : vec2<i32> = x_103_phi;
+    var x_81_1 : vec2<i32> = x_103;
+    x_81_1.x = (x_103.x + (x_103.y / 2));
+    let x_81 : vec2<i32> = x_81_1;
+
+    continuing {
+      x_84 = (x_83 + 1);
+      x_80_phi = x_81;
+      x_83_phi = x_84;
+    }
+  }
+  let x_108 : i32 = x_80.x;
+  x_114_phi = x_80;
+  if ((x_108 < 0)) {
+    x_113 = vec2<i32>(0, 0);
+    x_113.x = -(x_108);
+    x_114_phi = x_113;
+  }
+  let x_114 : vec2<i32> = x_114_phi;
+  x_116_phi = x_114;
+  loop {
+    var x_117 : vec2<i32>;
+    let x_116 : vec2<i32> = x_116_phi;
+    x_119 = x_116.x;
+    if ((x_119 > 15)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_117 = vec2<i32>(0, 0);
+      x_117.x = bitcast<i32>((x_119 - bitcast<i32>(16)));
+      x_116_phi = x_117;
+    }
+  }
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+  let x_123 : array<vec4<f32>, 16> = indexable;
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
+  indexable = x_123;
+  let x_125 : vec4<f32> = indexable[x_119];
+  x_GLF_color = x_125;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/1.wgsl
new file mode 100644
index 0000000..0424d49
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/1.wgsl
@@ -0,0 +1,108 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var indexable : array<vec4<f32>, 16>;
+  var x_80 : vec2<i32>;
+  var x_113 : vec2<i32>;
+  var x_119 : i32;
+  var x_80_phi : vec2<i32>;
+  var x_83_phi : i32;
+  var x_114_phi : vec2<i32>;
+  var x_116_phi : vec2<i32>;
+  let x_59 : vec4<f32> = gl_FragCoord;
+  let x_62 : vec2<f32> = x_6.resolution;
+  let x_63 : vec2<f32> = (vec2<f32>(x_59.x, x_59.y) / x_62);
+  let x_66 : i32 = i32((x_63.x * 8.0));
+  let x_69 : i32 = i32((x_63.y * 8.0));
+  let x_78 : vec2<i32> = vec2<i32>(((((x_66 & 5) | (x_69 & 10)) * 8) + ((x_69 & 5) | (x_66 & 10))), 0);
+  x_80_phi = x_78;
+  x_83_phi = 0;
+  loop {
+    var x_94 : vec2<i32>;
+    var x_102 : vec2<i32>;
+    var x_84 : i32;
+    var x_95_phi : vec2<i32>;
+    var x_103_phi : vec2<i32>;
+    x_80 = x_80_phi;
+    let x_83 : i32 = x_83_phi;
+    if ((x_83 < 100)) {
+    } else {
+      break;
+    }
+    x_95_phi = x_80;
+    if ((x_80.x > 0)) {
+      x_94 = x_80;
+      x_94.y = (x_80.y - 1);
+      x_95_phi = x_94;
+    }
+    let x_95 : vec2<i32> = x_95_phi;
+    x_103_phi = x_95;
+    if ((x_95.x < 0)) {
+      x_102 = x_95;
+      x_102.y = (x_95.y + 1);
+      x_103_phi = x_102;
+    }
+    let x_103 : vec2<i32> = x_103_phi;
+    var x_81_1 : vec2<i32> = x_103;
+    x_81_1.x = (x_103.x + (x_103.y / 2));
+    let x_81 : vec2<i32> = x_81_1;
+
+    continuing {
+      x_84 = (x_83 + 1);
+      x_80_phi = x_81;
+      x_83_phi = x_84;
+    }
+  }
+  let x_108 : i32 = x_80.x;
+  x_114_phi = x_80;
+  if ((x_108 < 0)) {
+    x_113 = vec2<i32>(0, 0);
+    x_113.x = -(x_108);
+    x_114_phi = x_113;
+  }
+  let x_114 : vec2<i32> = x_114_phi;
+  x_116_phi = x_114;
+  loop {
+    var x_117 : vec2<i32>;
+    let x_116 : vec2<i32> = x_116_phi;
+    x_119 = x_116.x;
+    if ((x_119 > 15)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_117 = vec2<i32>(0, 0);
+      x_117.x = bitcast<i32>((x_119 - bitcast<i32>(16)));
+      x_116_phi = x_117;
+    }
+  }
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+  let x_123 : array<vec4<f32>, 16> = indexable;
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
+  indexable = x_123;
+  let x_125 : vec4<f32> = indexable[x_119];
+  x_GLF_color = x_125;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..9baedc8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/1.wgsl.expected.hlsl
@@ -0,0 +1,108 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 indexable[16] = (float4[16])0;
+  int2 x_80 = int2(0, 0);
+  int2 x_113 = int2(0, 0);
+  int x_119 = 0;
+  int2 x_80_phi = int2(0, 0);
+  int x_83_phi = 0;
+  int2 x_114_phi = int2(0, 0);
+  int2 x_116_phi = int2(0, 0);
+  const float4 x_59 = gl_FragCoord;
+  const float2 x_62 = asfloat(x_6[0].xy);
+  const float2 x_63 = (float2(x_59.x, x_59.y) / x_62);
+  const int x_66 = int((x_63.x * 8.0f));
+  const int x_69 = int((x_63.y * 8.0f));
+  const int2 x_78 = int2(((((x_66 & 5) | (x_69 & 10)) * 8) + ((x_69 & 5) | (x_66 & 10))), 0);
+  x_80_phi = x_78;
+  x_83_phi = 0;
+  while (true) {
+    int2 x_94 = int2(0, 0);
+    int2 x_102 = int2(0, 0);
+    int x_84 = 0;
+    int2 x_95_phi = int2(0, 0);
+    int2 x_103_phi = int2(0, 0);
+    x_80 = x_80_phi;
+    const int x_83 = x_83_phi;
+    if ((x_83 < 100)) {
+    } else {
+      break;
+    }
+    x_95_phi = x_80;
+    if ((x_80.x > 0)) {
+      x_94 = x_80;
+      x_94.y = (x_80.y - 1);
+      x_95_phi = x_94;
+    }
+    const int2 x_95 = x_95_phi;
+    x_103_phi = x_95;
+    if ((x_95.x < 0)) {
+      x_102 = x_95;
+      x_102.y = (x_95.y + 1);
+      x_103_phi = x_102;
+    }
+    const int2 x_103 = x_103_phi;
+    int2 x_81_1 = x_103;
+    x_81_1.x = (x_103.x + (x_103.y / 2));
+    const int2 x_81 = x_81_1;
+    {
+      x_84 = (x_83 + 1);
+      x_80_phi = x_81;
+      x_83_phi = x_84;
+    }
+  }
+  const int x_108 = x_80.x;
+  x_114_phi = x_80;
+  if ((x_108 < 0)) {
+    x_113 = int2(0, 0);
+    x_113.x = -(x_108);
+    x_114_phi = x_113;
+  }
+  x_116_phi = x_114_phi;
+  while (true) {
+    int2 x_117 = int2(0, 0);
+    x_119 = x_116_phi.x;
+    if ((x_119 > 15)) {
+    } else {
+      break;
+    }
+    {
+      x_117 = int2(0, 0);
+      x_117.x = asint((x_119 - asint(16)));
+      x_116_phi = x_117;
+    }
+  }
+  const float4 tint_symbol_5[16] = {float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)};
+  indexable = tint_symbol_5;
+  const float4 x_123[16] = indexable;
+  const float4 tint_symbol_6[16] = {float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)};
+  indexable = tint_symbol_6;
+  indexable = x_123;
+  const float4 x_125 = indexable[x_119];
+  x_GLF_color = x_125;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_7 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_7;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/1.wgsl.expected.msl
new file mode 100644
index 0000000..0e7d864
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/1.wgsl.expected.msl
@@ -0,0 +1,112 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  float4 arr[16];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_7, thread float4* const tint_symbol_8) {
+  tint_array_wrapper indexable = {};
+  int2 x_80 = 0;
+  int2 x_113 = 0;
+  int x_119 = 0;
+  int2 x_80_phi = 0;
+  int x_83_phi = 0;
+  int2 x_114_phi = 0;
+  int2 x_116_phi = 0;
+  float4 const x_59 = *(tint_symbol_7);
+  float2 const x_62 = x_6.resolution;
+  float2 const x_63 = (float2(x_59.x, x_59.y) / x_62);
+  int const x_66 = int((x_63.x * 8.0f));
+  int const x_69 = int((x_63.y * 8.0f));
+  int2 const x_78 = int2(((((x_66 & 5) | (x_69 & 10)) * 8) + ((x_69 & 5) | (x_66 & 10))), 0);
+  x_80_phi = x_78;
+  x_83_phi = 0;
+  while (true) {
+    int2 x_94 = 0;
+    int2 x_102 = 0;
+    int x_84 = 0;
+    int2 x_95_phi = 0;
+    int2 x_103_phi = 0;
+    x_80 = x_80_phi;
+    int const x_83 = x_83_phi;
+    if ((x_83 < 100)) {
+    } else {
+      break;
+    }
+    x_95_phi = x_80;
+    if ((x_80.x > 0)) {
+      x_94 = x_80;
+      x_94.y = (x_80.y - 1);
+      x_95_phi = x_94;
+    }
+    int2 const x_95 = x_95_phi;
+    x_103_phi = x_95;
+    if ((x_95.x < 0)) {
+      x_102 = x_95;
+      x_102.y = (x_95.y + 1);
+      x_103_phi = x_102;
+    }
+    int2 const x_103 = x_103_phi;
+    int2 x_81_1 = x_103;
+    x_81_1.x = (x_103.x + (x_103.y / 2));
+    int2 const x_81 = x_81_1;
+    {
+      x_84 = (x_83 + 1);
+      x_80_phi = x_81;
+      x_83_phi = x_84;
+    }
+  }
+  int const x_108 = x_80.x;
+  x_114_phi = x_80;
+  if ((x_108 < 0)) {
+    x_113 = int2(0, 0);
+    x_113.x = -(x_108);
+    x_114_phi = x_113;
+  }
+  int2 const x_114 = x_114_phi;
+  x_116_phi = x_114;
+  while (true) {
+    int2 x_117 = 0;
+    int2 const x_116 = x_116_phi;
+    x_119 = x_116.x;
+    if ((x_119 > 15)) {
+    } else {
+      break;
+    }
+    {
+      x_117 = int2(0, 0);
+      x_117.x = as_type<int>((x_119 - as_type<int>(16)));
+      x_116_phi = x_117;
+    }
+  }
+  tint_array_wrapper const tint_symbol_4 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
+  indexable = tint_symbol_4;
+  tint_array_wrapper const x_123 = indexable;
+  tint_array_wrapper const tint_symbol_5 = {.arr={float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)}};
+  indexable = tint_symbol_5;
+  indexable = x_123;
+  float4 const x_125 = indexable.arr[x_119];
+  *(tint_symbol_8) = x_125;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_9 = 0.0f;
+  thread float4 tint_symbol_10 = 0.0f;
+  tint_symbol_9 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_9), &(tint_symbol_10));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_10};
+  tint_symbol_2 const tint_symbol_6 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..0b49352
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/1.wgsl.expected.spvasm
@@ -0,0 +1,297 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 188
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %indexable "indexable"
+               OpName %x_80 "x_80"
+               OpName %x_113 "x_113"
+               OpName %x_119 "x_119"
+               OpName %x_80_phi "x_80_phi"
+               OpName %x_83_phi "x_83_phi"
+               OpName %x_114_phi "x_114_phi"
+               OpName %x_116_phi "x_116_phi"
+               OpName %x_94 "x_94"
+               OpName %x_102 "x_102"
+               OpName %x_84 "x_84"
+               OpName %x_95_phi "x_95_phi"
+               OpName %x_103_phi "x_103_phi"
+               OpName %x_81_1 "x_81_1"
+               OpName %x_117 "x_117"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v4float_uint_16 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+         %24 = OpConstantNull %_arr_v4float_uint_16
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %29 = OpConstantNull %v2int
+%_ptr_Function_int = OpTypePointer Function %int
+         %33 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_8 = OpConstant %float 8
+      %int_5 = OpConstant %int 5
+     %int_10 = OpConstant %int 10
+      %int_8 = OpConstant %int 8
+      %int_0 = OpConstant %int 0
+    %int_100 = OpConstant %int 100
+       %bool = OpTypeBool
+     %uint_1 = OpConstant %uint 1
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+        %124 = OpConstantComposite %v2int %int_0 %int_0
+     %int_15 = OpConstant %int 15
+     %int_16 = OpConstant %int 16
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+        %151 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+  %float_0_5 = OpConstant %float 0.5
+        %153 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+        %154 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+        %155 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+        %156 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+        %157 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+        %158 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+        %159 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+        %160 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %161 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+        %162 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+        %163 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+        %164 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+        %165 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+        %166 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+        %167 = OpConstantComposite %_arr_v4float_uint_16 %151 %153 %154 %155 %156 %157 %158 %159 %151 %160 %161 %162 %163 %164 %165 %166
+        %169 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+        %170 = OpConstantComposite %_arr_v4float_uint_16 %169 %169 %169 %169 %169 %169 %169 %169 %169 %169 %169 %169 %169 %169 %169 %169
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+   %main_out = OpTypeStruct %v4float
+        %175 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_16 Function %24
+       %x_80 = OpVariable %_ptr_Function_v2int Function %29
+      %x_113 = OpVariable %_ptr_Function_v2int Function %29
+      %x_119 = OpVariable %_ptr_Function_int Function %33
+   %x_80_phi = OpVariable %_ptr_Function_v2int Function %29
+   %x_83_phi = OpVariable %_ptr_Function_int Function %33
+  %x_114_phi = OpVariable %_ptr_Function_v2int Function %29
+  %x_116_phi = OpVariable %_ptr_Function_v2int Function %29
+       %x_94 = OpVariable %_ptr_Function_v2int Function %29
+      %x_102 = OpVariable %_ptr_Function_v2int Function %29
+       %x_84 = OpVariable %_ptr_Function_int Function %33
+   %x_95_phi = OpVariable %_ptr_Function_v2int Function %29
+  %x_103_phi = OpVariable %_ptr_Function_v2int Function %29
+     %x_81_1 = OpVariable %_ptr_Function_v2int Function %29
+      %x_117 = OpVariable %_ptr_Function_v2int Function %29
+         %38 = OpLoad %v4float %gl_FragCoord
+         %41 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %42 = OpLoad %v2float %41
+         %43 = OpCompositeExtract %float %38 0
+         %44 = OpCompositeExtract %float %38 1
+         %45 = OpCompositeConstruct %v2float %43 %44
+         %46 = OpFDiv %v2float %45 %42
+         %48 = OpCompositeExtract %float %46 0
+         %50 = OpFMul %float %48 %float_8
+         %47 = OpConvertFToS %int %50
+         %52 = OpCompositeExtract %float %46 1
+         %53 = OpFMul %float %52 %float_8
+         %51 = OpConvertFToS %int %53
+         %55 = OpBitwiseAnd %int %47 %int_5
+         %57 = OpBitwiseAnd %int %51 %int_10
+         %58 = OpBitwiseOr %int %55 %57
+         %60 = OpIMul %int %58 %int_8
+         %61 = OpBitwiseAnd %int %51 %int_5
+         %62 = OpBitwiseAnd %int %47 %int_10
+         %63 = OpBitwiseOr %int %61 %62
+         %64 = OpIAdd %int %60 %63
+         %66 = OpCompositeConstruct %v2int %64 %int_0
+               OpStore %x_80_phi %66
+               OpStore %x_83_phi %int_0
+               OpBranch %67
+         %67 = OpLabel
+               OpLoopMerge %68 %69 None
+               OpBranch %70
+         %70 = OpLabel
+         %76 = OpLoad %v2int %x_80_phi
+               OpStore %x_80 %76
+         %77 = OpLoad %int %x_83_phi
+         %79 = OpSLessThan %bool %77 %int_100
+               OpSelectionMerge %81 None
+               OpBranchConditional %79 %82 %83
+         %82 = OpLabel
+               OpBranch %81
+         %83 = OpLabel
+               OpBranch %68
+         %81 = OpLabel
+         %84 = OpLoad %v2int %x_80
+               OpStore %x_95_phi %84
+         %85 = OpAccessChain %_ptr_Function_int %x_80 %uint_0
+         %86 = OpLoad %int %85
+         %87 = OpSGreaterThan %bool %86 %int_0
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %88
+         %89 = OpLabel
+         %90 = OpLoad %v2int %x_80
+               OpStore %x_94 %90
+         %92 = OpAccessChain %_ptr_Function_int %x_94 %uint_1
+         %93 = OpAccessChain %_ptr_Function_int %x_80 %uint_1
+         %94 = OpLoad %int %93
+         %96 = OpISub %int %94 %int_1
+               OpStore %92 %96
+         %97 = OpLoad %v2int %x_94
+               OpStore %x_95_phi %97
+               OpBranch %88
+         %88 = OpLabel
+         %98 = OpLoad %v2int %x_95_phi
+               OpStore %x_103_phi %98
+         %99 = OpCompositeExtract %int %98 0
+        %100 = OpSLessThan %bool %99 %int_0
+               OpSelectionMerge %101 None
+               OpBranchConditional %100 %102 %101
+        %102 = OpLabel
+               OpStore %x_102 %98
+        %103 = OpAccessChain %_ptr_Function_int %x_102 %uint_1
+        %104 = OpCompositeExtract %int %98 1
+        %105 = OpIAdd %int %104 %int_1
+               OpStore %103 %105
+        %106 = OpLoad %v2int %x_102
+               OpStore %x_103_phi %106
+               OpBranch %101
+        %101 = OpLabel
+        %107 = OpLoad %v2int %x_103_phi
+               OpStore %x_81_1 %107
+        %109 = OpAccessChain %_ptr_Function_int %x_81_1 %uint_0
+        %110 = OpCompositeExtract %int %107 0
+        %111 = OpCompositeExtract %int %107 1
+        %113 = OpSDiv %int %111 %int_2
+        %114 = OpIAdd %int %110 %113
+               OpStore %109 %114
+        %115 = OpLoad %v2int %x_81_1
+               OpBranch %69
+         %69 = OpLabel
+        %116 = OpIAdd %int %77 %int_1
+               OpStore %x_84 %116
+               OpStore %x_80_phi %115
+        %117 = OpLoad %int %x_84
+               OpStore %x_83_phi %117
+               OpBranch %67
+         %68 = OpLabel
+        %118 = OpAccessChain %_ptr_Function_int %x_80 %uint_0
+        %119 = OpLoad %int %118
+        %120 = OpLoad %v2int %x_80
+               OpStore %x_114_phi %120
+        %121 = OpSLessThan %bool %119 %int_0
+               OpSelectionMerge %122 None
+               OpBranchConditional %121 %123 %122
+        %123 = OpLabel
+               OpStore %x_113 %124
+        %125 = OpAccessChain %_ptr_Function_int %x_113 %uint_0
+        %126 = OpSNegate %int %119
+               OpStore %125 %126
+        %127 = OpLoad %v2int %x_113
+               OpStore %x_114_phi %127
+               OpBranch %122
+        %122 = OpLabel
+        %128 = OpLoad %v2int %x_114_phi
+               OpStore %x_116_phi %128
+               OpBranch %129
+        %129 = OpLabel
+               OpLoopMerge %130 %131 None
+               OpBranch %132
+        %132 = OpLabel
+        %134 = OpLoad %v2int %x_116_phi
+        %135 = OpCompositeExtract %int %134 0
+               OpStore %x_119 %135
+        %136 = OpLoad %int %x_119
+        %138 = OpSGreaterThan %bool %136 %int_15
+               OpSelectionMerge %139 None
+               OpBranchConditional %138 %140 %141
+        %140 = OpLabel
+               OpBranch %139
+        %141 = OpLabel
+               OpBranch %130
+        %139 = OpLabel
+               OpBranch %131
+        %131 = OpLabel
+               OpStore %x_117 %124
+        %142 = OpAccessChain %_ptr_Function_int %x_117 %uint_0
+        %144 = OpLoad %int %x_119
+        %145 = OpCopyObject %int %int_16
+        %147 = OpISub %int %144 %145
+        %143 = OpCopyObject %int %147
+               OpStore %142 %143
+        %148 = OpLoad %v2int %x_117
+               OpStore %x_116_phi %148
+               OpBranch %129
+        %130 = OpLabel
+               OpStore %indexable %167
+        %168 = OpLoad %_arr_v4float_uint_16 %indexable
+               OpStore %indexable %170
+               OpStore %indexable %168
+        %171 = OpLoad %int %x_119
+        %173 = OpAccessChain %_ptr_Function_v4float %indexable %171
+        %174 = OpLoad %v4float %173
+               OpStore %x_GLF_color %174
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %175
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %179 = OpLabel
+        %180 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %180
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %182 = OpLabel
+        %183 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %183
+        %184 = OpFunctionCall %void %main_1
+        %186 = OpLoad %v4float %x_GLF_color
+        %187 = OpCompositeConstruct %main_out %186
+        %185 = OpFunctionCall %void %tint_symbol_3 %187
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..0424d49
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-O-mutate-variable/1.wgsl.expected.wgsl
@@ -0,0 +1,108 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var indexable : array<vec4<f32>, 16>;
+  var x_80 : vec2<i32>;
+  var x_113 : vec2<i32>;
+  var x_119 : i32;
+  var x_80_phi : vec2<i32>;
+  var x_83_phi : i32;
+  var x_114_phi : vec2<i32>;
+  var x_116_phi : vec2<i32>;
+  let x_59 : vec4<f32> = gl_FragCoord;
+  let x_62 : vec2<f32> = x_6.resolution;
+  let x_63 : vec2<f32> = (vec2<f32>(x_59.x, x_59.y) / x_62);
+  let x_66 : i32 = i32((x_63.x * 8.0));
+  let x_69 : i32 = i32((x_63.y * 8.0));
+  let x_78 : vec2<i32> = vec2<i32>(((((x_66 & 5) | (x_69 & 10)) * 8) + ((x_69 & 5) | (x_66 & 10))), 0);
+  x_80_phi = x_78;
+  x_83_phi = 0;
+  loop {
+    var x_94 : vec2<i32>;
+    var x_102 : vec2<i32>;
+    var x_84 : i32;
+    var x_95_phi : vec2<i32>;
+    var x_103_phi : vec2<i32>;
+    x_80 = x_80_phi;
+    let x_83 : i32 = x_83_phi;
+    if ((x_83 < 100)) {
+    } else {
+      break;
+    }
+    x_95_phi = x_80;
+    if ((x_80.x > 0)) {
+      x_94 = x_80;
+      x_94.y = (x_80.y - 1);
+      x_95_phi = x_94;
+    }
+    let x_95 : vec2<i32> = x_95_phi;
+    x_103_phi = x_95;
+    if ((x_95.x < 0)) {
+      x_102 = x_95;
+      x_102.y = (x_95.y + 1);
+      x_103_phi = x_102;
+    }
+    let x_103 : vec2<i32> = x_103_phi;
+    var x_81_1 : vec2<i32> = x_103;
+    x_81_1.x = (x_103.x + (x_103.y / 2));
+    let x_81 : vec2<i32> = x_81_1;
+
+    continuing {
+      x_84 = (x_83 + 1);
+      x_80_phi = x_81;
+      x_83_phi = x_84;
+    }
+  }
+  let x_108 : i32 = x_80.x;
+  x_114_phi = x_80;
+  if ((x_108 < 0)) {
+    x_113 = vec2<i32>(0, 0);
+    x_113.x = -(x_108);
+    x_114_phi = x_113;
+  }
+  let x_114 : vec2<i32> = x_114_phi;
+  x_116_phi = x_114;
+  loop {
+    var x_117 : vec2<i32>;
+    let x_116 : vec2<i32> = x_116_phi;
+    x_119 = x_116.x;
+    if ((x_119 > 15)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_117 = vec2<i32>(0, 0);
+      x_117.x = bitcast<i32>((x_119 - bitcast<i32>(16)));
+      x_116_phi = x_117;
+    }
+  }
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+  let x_123 : array<vec4<f32>, 16> = indexable;
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
+  indexable = x_123;
+  let x_125 : vec4<f32> = indexable[x_119];
+  x_GLF_color = x_125;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/0.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/0.spvasm
new file mode 100644
index 0000000..e5750e1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/0.spvasm
@@ -0,0 +1,160 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpName %indexable "indexable"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+       %uint = OpTypeInt 32 0
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_8 = OpConstant %float 8
+      %int_5 = OpConstant %int 5
+     %int_10 = OpConstant %int 10
+      %int_8 = OpConstant %int 8
+    %int_100 = OpConstant %int 100
+     %int_15 = OpConstant %int 15
+     %int_16 = OpConstant %int 16
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %35 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+  %float_0_5 = OpConstant %float 0.5
+         %37 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+         %38 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+         %39 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+         %40 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+         %41 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+         %42 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+         %43 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+         %44 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %45 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+         %46 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+         %47 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+         %48 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+         %49 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+         %50 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+         %51 = OpConstantComposite %_arr_v4float_uint_16 %35 %37 %38 %39 %40 %41 %42 %43 %35 %44 %45 %46 %47 %48 %49 %50
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %main = OpFunction %void None %9
+         %54 = OpLabel
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_16 Function
+         %55 = OpLoad %v4float %gl_FragCoord
+         %56 = OpVectorShuffle %v2float %55 %55 0 1
+         %57 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+         %58 = OpLoad %v2float %57
+         %59 = OpFDiv %v2float %56 %58
+         %60 = OpCompositeExtract %float %59 0
+         %61 = OpFMul %float %60 %float_8
+         %62 = OpConvertFToS %int %61
+         %63 = OpCompositeExtract %float %59 1
+         %64 = OpFMul %float %63 %float_8
+         %65 = OpConvertFToS %int %64
+         %66 = OpBitwiseAnd %int %62 %int_5
+         %67 = OpBitwiseAnd %int %65 %int_10
+         %68 = OpBitwiseOr %int %66 %67
+         %69 = OpBitwiseAnd %int %65 %int_5
+         %70 = OpBitwiseAnd %int %62 %int_10
+         %71 = OpBitwiseOr %int %69 %70
+         %72 = OpIMul %int %68 %int_8
+         %73 = OpIAdd %int %72 %71
+         %74 = OpCompositeConstruct %v2int %73 %int_0
+               OpBranch %75
+         %75 = OpLabel
+         %76 = OpPhi %v2int %74 %54 %77 %78
+         %79 = OpPhi %int %int_0 %54 %80 %78
+         %81 = OpSLessThan %bool %79 %int_100
+               OpLoopMerge %82 %78 None
+               OpBranchConditional %81 %83 %82
+         %83 = OpLabel
+         %84 = OpCompositeExtract %int %76 0
+         %85 = OpSGreaterThan %bool %84 %int_0
+               OpSelectionMerge %86 None
+               OpBranchConditional %85 %87 %86
+         %87 = OpLabel
+         %88 = OpCompositeExtract %int %76 1
+         %89 = OpISub %int %88 %int_1
+         %90 = OpCompositeInsert %v2int %89 %76 1
+               OpBranch %86
+         %86 = OpLabel
+         %91 = OpPhi %v2int %76 %83 %90 %87
+         %92 = OpCompositeExtract %int %91 0
+         %93 = OpSLessThan %bool %92 %int_0
+               OpSelectionMerge %94 None
+               OpBranchConditional %93 %95 %94
+         %95 = OpLabel
+         %96 = OpCompositeExtract %int %91 1
+         %97 = OpIAdd %int %96 %int_1
+         %98 = OpCompositeInsert %v2int %97 %91 1
+               OpBranch %94
+         %94 = OpLabel
+         %99 = OpPhi %v2int %91 %86 %98 %95
+        %100 = OpCompositeExtract %int %99 1
+        %101 = OpSDiv %int %100 %int_2
+        %102 = OpCompositeExtract %int %99 0
+        %103 = OpIAdd %int %102 %101
+         %77 = OpCompositeInsert %v2int %103 %99 0
+               OpBranch %78
+         %78 = OpLabel
+         %80 = OpIAdd %int %79 %int_1
+               OpBranch %75
+         %82 = OpLabel
+        %104 = OpCompositeExtract %int %76 0
+        %105 = OpSLessThan %bool %104 %int_0
+               OpSelectionMerge %106 None
+               OpBranchConditional %105 %107 %106
+        %107 = OpLabel
+        %108 = OpSNegate %int %104
+        %109 = OpCompositeInsert %v2int %108 %76 0
+               OpBranch %106
+        %106 = OpLabel
+        %110 = OpPhi %v2int %76 %82 %109 %107
+               OpBranch %111
+        %111 = OpLabel
+        %112 = OpPhi %v2int %110 %106 %113 %114
+        %115 = OpCompositeExtract %int %112 0
+        %116 = OpSGreaterThan %bool %115 %int_15
+               OpLoopMerge %117 %114 None
+               OpBranchConditional %116 %114 %117
+        %114 = OpLabel
+        %118 = OpISub %int %115 %int_16
+        %113 = OpCompositeInsert %v2int %118 %112 0
+               OpBranch %111
+        %117 = OpLabel
+               OpStore %indexable %51
+        %119 = OpAccessChain %_ptr_Function_v4float %indexable %115
+        %120 = OpLoad %v4float %119
+               OpStore %_GLF_color %120
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..d58e8dc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/0.spvasm.expected.hlsl
@@ -0,0 +1,105 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 indexable[16] = (float4[16])0;
+  int2 x_76 = int2(0, 0);
+  int2 x_109 = int2(0, 0);
+  int x_115 = 0;
+  int2 x_76_phi = int2(0, 0);
+  int x_79_phi = 0;
+  int2 x_110_phi = int2(0, 0);
+  int2 x_112_phi = int2(0, 0);
+  const float4 x_55 = gl_FragCoord;
+  const float2 x_58 = asfloat(x_6[0].xy);
+  const float2 x_59 = (float2(x_55.x, x_55.y) / x_58);
+  const int x_62 = int((x_59.x * 8.0f));
+  const int x_65 = int((x_59.y * 8.0f));
+  const int2 x_74 = int2(((((x_62 & 5) | (x_65 & 10)) * 8) + ((x_65 & 5) | (x_62 & 10))), 0);
+  x_76_phi = x_74;
+  x_79_phi = 0;
+  while (true) {
+    int2 x_90 = int2(0, 0);
+    int2 x_98 = int2(0, 0);
+    int x_80 = 0;
+    int2 x_91_phi = int2(0, 0);
+    int2 x_99_phi = int2(0, 0);
+    x_76 = x_76_phi;
+    const int x_79 = x_79_phi;
+    if ((x_79 < 100)) {
+    } else {
+      break;
+    }
+    x_91_phi = x_76;
+    if ((x_76.x > 0)) {
+      x_90 = x_76;
+      x_90.y = (x_76.y - 1);
+      x_91_phi = x_90;
+    }
+    const int2 x_91 = x_91_phi;
+    x_99_phi = x_91;
+    if ((x_91.x < 0)) {
+      x_98 = x_91;
+      x_98.y = (x_91.y + 1);
+      x_99_phi = x_98;
+    }
+    const int2 x_99 = x_99_phi;
+    int2 x_77_1 = x_99;
+    x_77_1.x = (x_99.x + (x_99.y / 2));
+    const int2 x_77 = x_77_1;
+    {
+      x_80 = (x_79 + 1);
+      x_76_phi = x_77;
+      x_79_phi = x_80;
+    }
+  }
+  const int x_104 = x_76.x;
+  x_110_phi = x_76;
+  if ((x_104 < 0)) {
+    x_109 = x_76;
+    x_109.x = -(x_104);
+    x_110_phi = x_109;
+  }
+  x_112_phi = x_110_phi;
+  while (true) {
+    int2 x_113 = int2(0, 0);
+    const int2 x_112 = x_112_phi;
+    x_115 = x_112.x;
+    if ((x_115 > 15)) {
+    } else {
+      break;
+    }
+    {
+      x_113 = x_112;
+      x_113.x = asint((x_115 - asint(16)));
+      x_112_phi = x_113;
+    }
+  }
+  const float4 tint_symbol_5[16] = {float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)};
+  indexable = tint_symbol_5;
+  const float4 x_120 = indexable[x_115];
+  x_GLF_color = x_120;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/0.spvasm.expected.msl
new file mode 100644
index 0000000..e35ddd7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/0.spvasm.expected.msl
@@ -0,0 +1,108 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  float4 arr[16];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  tint_array_wrapper indexable = {};
+  int2 x_76 = 0;
+  int2 x_109 = 0;
+  int x_115 = 0;
+  int2 x_76_phi = 0;
+  int x_79_phi = 0;
+  int2 x_110_phi = 0;
+  int2 x_112_phi = 0;
+  float4 const x_55 = *(tint_symbol_6);
+  float2 const x_58 = x_6.resolution;
+  float2 const x_59 = (float2(x_55.x, x_55.y) / x_58);
+  int const x_62 = int((x_59.x * 8.0f));
+  int const x_65 = int((x_59.y * 8.0f));
+  int2 const x_74 = int2(((((x_62 & 5) | (x_65 & 10)) * 8) + ((x_65 & 5) | (x_62 & 10))), 0);
+  x_76_phi = x_74;
+  x_79_phi = 0;
+  while (true) {
+    int2 x_90 = 0;
+    int2 x_98 = 0;
+    int x_80 = 0;
+    int2 x_91_phi = 0;
+    int2 x_99_phi = 0;
+    x_76 = x_76_phi;
+    int const x_79 = x_79_phi;
+    if ((x_79 < 100)) {
+    } else {
+      break;
+    }
+    x_91_phi = x_76;
+    if ((x_76.x > 0)) {
+      x_90 = x_76;
+      x_90.y = (x_76.y - 1);
+      x_91_phi = x_90;
+    }
+    int2 const x_91 = x_91_phi;
+    x_99_phi = x_91;
+    if ((x_91.x < 0)) {
+      x_98 = x_91;
+      x_98.y = (x_91.y + 1);
+      x_99_phi = x_98;
+    }
+    int2 const x_99 = x_99_phi;
+    int2 x_77_1 = x_99;
+    x_77_1.x = (x_99.x + (x_99.y / 2));
+    int2 const x_77 = x_77_1;
+    {
+      x_80 = (x_79 + 1);
+      x_76_phi = x_77;
+      x_79_phi = x_80;
+    }
+  }
+  int const x_104 = x_76.x;
+  x_110_phi = x_76;
+  if ((x_104 < 0)) {
+    x_109 = x_76;
+    x_109.x = -(x_104);
+    x_110_phi = x_109;
+  }
+  int2 const x_110 = x_110_phi;
+  x_112_phi = x_110;
+  while (true) {
+    int2 x_113 = 0;
+    int2 const x_112 = x_112_phi;
+    x_115 = x_112.x;
+    if ((x_115 > 15)) {
+    } else {
+      break;
+    }
+    {
+      x_113 = x_112;
+      x_113.x = as_type<int>((x_115 - as_type<int>(16)));
+      x_112_phi = x_113;
+    }
+  }
+  tint_array_wrapper const tint_symbol_4 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
+  indexable = tint_symbol_4;
+  float4 const x_120 = indexable.arr[x_115];
+  *(tint_symbol_7) = x_120;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..2951010
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/0.spvasm.expected.spvasm
@@ -0,0 +1,292 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 185
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %indexable "indexable"
+               OpName %x_76 "x_76"
+               OpName %x_109 "x_109"
+               OpName %x_115 "x_115"
+               OpName %x_76_phi "x_76_phi"
+               OpName %x_79_phi "x_79_phi"
+               OpName %x_110_phi "x_110_phi"
+               OpName %x_112_phi "x_112_phi"
+               OpName %x_90 "x_90"
+               OpName %x_98 "x_98"
+               OpName %x_80 "x_80"
+               OpName %x_91_phi "x_91_phi"
+               OpName %x_99_phi "x_99_phi"
+               OpName %x_77_1 "x_77_1"
+               OpName %x_113 "x_113"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v4float_uint_16 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+         %24 = OpConstantNull %_arr_v4float_uint_16
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %29 = OpConstantNull %v2int
+%_ptr_Function_int = OpTypePointer Function %int
+         %33 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_8 = OpConstant %float 8
+      %int_5 = OpConstant %int 5
+     %int_10 = OpConstant %int 10
+      %int_8 = OpConstant %int 8
+      %int_0 = OpConstant %int 0
+    %int_100 = OpConstant %int 100
+       %bool = OpTypeBool
+     %uint_1 = OpConstant %uint 1
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+     %int_15 = OpConstant %int 15
+     %int_16 = OpConstant %int 16
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+        %151 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+  %float_0_5 = OpConstant %float 0.5
+        %153 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+        %154 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+        %155 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+        %156 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+        %157 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+        %158 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+        %159 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+        %160 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %161 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+        %162 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+        %163 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+        %164 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+        %165 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+        %166 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+        %167 = OpConstantComposite %_arr_v4float_uint_16 %151 %153 %154 %155 %156 %157 %158 %159 %151 %160 %161 %162 %163 %164 %165 %166
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+   %main_out = OpTypeStruct %v4float
+        %172 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_16 Function %24
+       %x_76 = OpVariable %_ptr_Function_v2int Function %29
+      %x_109 = OpVariable %_ptr_Function_v2int Function %29
+      %x_115 = OpVariable %_ptr_Function_int Function %33
+   %x_76_phi = OpVariable %_ptr_Function_v2int Function %29
+   %x_79_phi = OpVariable %_ptr_Function_int Function %33
+  %x_110_phi = OpVariable %_ptr_Function_v2int Function %29
+  %x_112_phi = OpVariable %_ptr_Function_v2int Function %29
+       %x_90 = OpVariable %_ptr_Function_v2int Function %29
+       %x_98 = OpVariable %_ptr_Function_v2int Function %29
+       %x_80 = OpVariable %_ptr_Function_int Function %33
+   %x_91_phi = OpVariable %_ptr_Function_v2int Function %29
+   %x_99_phi = OpVariable %_ptr_Function_v2int Function %29
+     %x_77_1 = OpVariable %_ptr_Function_v2int Function %29
+      %x_113 = OpVariable %_ptr_Function_v2int Function %29
+         %38 = OpLoad %v4float %gl_FragCoord
+         %41 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %42 = OpLoad %v2float %41
+         %43 = OpCompositeExtract %float %38 0
+         %44 = OpCompositeExtract %float %38 1
+         %45 = OpCompositeConstruct %v2float %43 %44
+         %46 = OpFDiv %v2float %45 %42
+         %48 = OpCompositeExtract %float %46 0
+         %50 = OpFMul %float %48 %float_8
+         %47 = OpConvertFToS %int %50
+         %52 = OpCompositeExtract %float %46 1
+         %53 = OpFMul %float %52 %float_8
+         %51 = OpConvertFToS %int %53
+         %55 = OpBitwiseAnd %int %47 %int_5
+         %57 = OpBitwiseAnd %int %51 %int_10
+         %58 = OpBitwiseOr %int %55 %57
+         %60 = OpIMul %int %58 %int_8
+         %61 = OpBitwiseAnd %int %51 %int_5
+         %62 = OpBitwiseAnd %int %47 %int_10
+         %63 = OpBitwiseOr %int %61 %62
+         %64 = OpIAdd %int %60 %63
+         %66 = OpCompositeConstruct %v2int %64 %int_0
+               OpStore %x_76_phi %66
+               OpStore %x_79_phi %int_0
+               OpBranch %67
+         %67 = OpLabel
+               OpLoopMerge %68 %69 None
+               OpBranch %70
+         %70 = OpLabel
+         %76 = OpLoad %v2int %x_76_phi
+               OpStore %x_76 %76
+         %77 = OpLoad %int %x_79_phi
+         %79 = OpSLessThan %bool %77 %int_100
+               OpSelectionMerge %81 None
+               OpBranchConditional %79 %82 %83
+         %82 = OpLabel
+               OpBranch %81
+         %83 = OpLabel
+               OpBranch %68
+         %81 = OpLabel
+         %84 = OpLoad %v2int %x_76
+               OpStore %x_91_phi %84
+         %85 = OpAccessChain %_ptr_Function_int %x_76 %uint_0
+         %86 = OpLoad %int %85
+         %87 = OpSGreaterThan %bool %86 %int_0
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %88
+         %89 = OpLabel
+         %90 = OpLoad %v2int %x_76
+               OpStore %x_90 %90
+         %92 = OpAccessChain %_ptr_Function_int %x_90 %uint_1
+         %93 = OpAccessChain %_ptr_Function_int %x_76 %uint_1
+         %94 = OpLoad %int %93
+         %96 = OpISub %int %94 %int_1
+               OpStore %92 %96
+         %97 = OpLoad %v2int %x_90
+               OpStore %x_91_phi %97
+               OpBranch %88
+         %88 = OpLabel
+         %98 = OpLoad %v2int %x_91_phi
+               OpStore %x_99_phi %98
+         %99 = OpCompositeExtract %int %98 0
+        %100 = OpSLessThan %bool %99 %int_0
+               OpSelectionMerge %101 None
+               OpBranchConditional %100 %102 %101
+        %102 = OpLabel
+               OpStore %x_98 %98
+        %103 = OpAccessChain %_ptr_Function_int %x_98 %uint_1
+        %104 = OpCompositeExtract %int %98 1
+        %105 = OpIAdd %int %104 %int_1
+               OpStore %103 %105
+        %106 = OpLoad %v2int %x_98
+               OpStore %x_99_phi %106
+               OpBranch %101
+        %101 = OpLabel
+        %107 = OpLoad %v2int %x_99_phi
+               OpStore %x_77_1 %107
+        %109 = OpAccessChain %_ptr_Function_int %x_77_1 %uint_0
+        %110 = OpCompositeExtract %int %107 0
+        %111 = OpCompositeExtract %int %107 1
+        %113 = OpSDiv %int %111 %int_2
+        %114 = OpIAdd %int %110 %113
+               OpStore %109 %114
+        %115 = OpLoad %v2int %x_77_1
+               OpBranch %69
+         %69 = OpLabel
+        %116 = OpIAdd %int %77 %int_1
+               OpStore %x_80 %116
+               OpStore %x_76_phi %115
+        %117 = OpLoad %int %x_80
+               OpStore %x_79_phi %117
+               OpBranch %67
+         %68 = OpLabel
+        %118 = OpAccessChain %_ptr_Function_int %x_76 %uint_0
+        %119 = OpLoad %int %118
+        %120 = OpLoad %v2int %x_76
+               OpStore %x_110_phi %120
+        %121 = OpSLessThan %bool %119 %int_0
+               OpSelectionMerge %122 None
+               OpBranchConditional %121 %123 %122
+        %123 = OpLabel
+        %124 = OpLoad %v2int %x_76
+               OpStore %x_109 %124
+        %125 = OpAccessChain %_ptr_Function_int %x_109 %uint_0
+        %126 = OpSNegate %int %119
+               OpStore %125 %126
+        %127 = OpLoad %v2int %x_109
+               OpStore %x_110_phi %127
+               OpBranch %122
+        %122 = OpLabel
+        %128 = OpLoad %v2int %x_110_phi
+               OpStore %x_112_phi %128
+               OpBranch %129
+        %129 = OpLabel
+               OpLoopMerge %130 %131 None
+               OpBranch %132
+        %132 = OpLabel
+        %134 = OpLoad %v2int %x_112_phi
+        %135 = OpCompositeExtract %int %134 0
+               OpStore %x_115 %135
+        %136 = OpLoad %int %x_115
+        %138 = OpSGreaterThan %bool %136 %int_15
+               OpSelectionMerge %139 None
+               OpBranchConditional %138 %140 %141
+        %140 = OpLabel
+               OpBranch %139
+        %141 = OpLabel
+               OpBranch %130
+        %139 = OpLabel
+               OpBranch %131
+        %131 = OpLabel
+               OpStore %x_113 %134
+        %142 = OpAccessChain %_ptr_Function_int %x_113 %uint_0
+        %144 = OpLoad %int %x_115
+        %145 = OpCopyObject %int %int_16
+        %147 = OpISub %int %144 %145
+        %143 = OpCopyObject %int %147
+               OpStore %142 %143
+        %148 = OpLoad %v2int %x_113
+               OpStore %x_112_phi %148
+               OpBranch %129
+        %130 = OpLabel
+               OpStore %indexable %167
+        %168 = OpLoad %int %x_115
+        %170 = OpAccessChain %_ptr_Function_v4float %indexable %168
+        %171 = OpLoad %v4float %170
+               OpStore %x_GLF_color %171
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %172
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %176 = OpLabel
+        %177 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %177
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %179 = OpLabel
+        %180 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %180
+        %181 = OpFunctionCall %void %main_1
+        %183 = OpLoad %v4float %x_GLF_color
+        %184 = OpCompositeConstruct %main_out %183
+        %182 = OpFunctionCall %void %tint_symbol_3 %184
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..8fe4ab4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/0.spvasm.expected.wgsl
@@ -0,0 +1,105 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var indexable : array<vec4<f32>, 16>;
+  var x_76 : vec2<i32>;
+  var x_109 : vec2<i32>;
+  var x_115 : i32;
+  var x_76_phi : vec2<i32>;
+  var x_79_phi : i32;
+  var x_110_phi : vec2<i32>;
+  var x_112_phi : vec2<i32>;
+  let x_55 : vec4<f32> = gl_FragCoord;
+  let x_58 : vec2<f32> = x_6.resolution;
+  let x_59 : vec2<f32> = (vec2<f32>(x_55.x, x_55.y) / x_58);
+  let x_62 : i32 = i32((x_59.x * 8.0));
+  let x_65 : i32 = i32((x_59.y * 8.0));
+  let x_74 : vec2<i32> = vec2<i32>(((((x_62 & 5) | (x_65 & 10)) * 8) + ((x_65 & 5) | (x_62 & 10))), 0);
+  x_76_phi = x_74;
+  x_79_phi = 0;
+  loop {
+    var x_90 : vec2<i32>;
+    var x_98 : vec2<i32>;
+    var x_80 : i32;
+    var x_91_phi : vec2<i32>;
+    var x_99_phi : vec2<i32>;
+    x_76 = x_76_phi;
+    let x_79 : i32 = x_79_phi;
+    if ((x_79 < 100)) {
+    } else {
+      break;
+    }
+    x_91_phi = x_76;
+    if ((x_76.x > 0)) {
+      x_90 = x_76;
+      x_90.y = (x_76.y - 1);
+      x_91_phi = x_90;
+    }
+    let x_91 : vec2<i32> = x_91_phi;
+    x_99_phi = x_91;
+    if ((x_91.x < 0)) {
+      x_98 = x_91;
+      x_98.y = (x_91.y + 1);
+      x_99_phi = x_98;
+    }
+    let x_99 : vec2<i32> = x_99_phi;
+    var x_77_1 : vec2<i32> = x_99;
+    x_77_1.x = (x_99.x + (x_99.y / 2));
+    let x_77 : vec2<i32> = x_77_1;
+
+    continuing {
+      x_80 = (x_79 + 1);
+      x_76_phi = x_77;
+      x_79_phi = x_80;
+    }
+  }
+  let x_104 : i32 = x_76.x;
+  x_110_phi = x_76;
+  if ((x_104 < 0)) {
+    x_109 = x_76;
+    x_109.x = -(x_104);
+    x_110_phi = x_109;
+  }
+  let x_110 : vec2<i32> = x_110_phi;
+  x_112_phi = x_110;
+  loop {
+    var x_113 : vec2<i32>;
+    let x_112 : vec2<i32> = x_112_phi;
+    x_115 = x_112.x;
+    if ((x_115 > 15)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_113 = x_112;
+      x_113.x = bitcast<i32>((x_115 - bitcast<i32>(16)));
+      x_112_phi = x_113;
+    }
+  }
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+  let x_120 : vec4<f32> = indexable[x_115];
+  x_GLF_color = x_120;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/0.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/0.wgsl
new file mode 100644
index 0000000..8fe4ab4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/0.wgsl
@@ -0,0 +1,105 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var indexable : array<vec4<f32>, 16>;
+  var x_76 : vec2<i32>;
+  var x_109 : vec2<i32>;
+  var x_115 : i32;
+  var x_76_phi : vec2<i32>;
+  var x_79_phi : i32;
+  var x_110_phi : vec2<i32>;
+  var x_112_phi : vec2<i32>;
+  let x_55 : vec4<f32> = gl_FragCoord;
+  let x_58 : vec2<f32> = x_6.resolution;
+  let x_59 : vec2<f32> = (vec2<f32>(x_55.x, x_55.y) / x_58);
+  let x_62 : i32 = i32((x_59.x * 8.0));
+  let x_65 : i32 = i32((x_59.y * 8.0));
+  let x_74 : vec2<i32> = vec2<i32>(((((x_62 & 5) | (x_65 & 10)) * 8) + ((x_65 & 5) | (x_62 & 10))), 0);
+  x_76_phi = x_74;
+  x_79_phi = 0;
+  loop {
+    var x_90 : vec2<i32>;
+    var x_98 : vec2<i32>;
+    var x_80 : i32;
+    var x_91_phi : vec2<i32>;
+    var x_99_phi : vec2<i32>;
+    x_76 = x_76_phi;
+    let x_79 : i32 = x_79_phi;
+    if ((x_79 < 100)) {
+    } else {
+      break;
+    }
+    x_91_phi = x_76;
+    if ((x_76.x > 0)) {
+      x_90 = x_76;
+      x_90.y = (x_76.y - 1);
+      x_91_phi = x_90;
+    }
+    let x_91 : vec2<i32> = x_91_phi;
+    x_99_phi = x_91;
+    if ((x_91.x < 0)) {
+      x_98 = x_91;
+      x_98.y = (x_91.y + 1);
+      x_99_phi = x_98;
+    }
+    let x_99 : vec2<i32> = x_99_phi;
+    var x_77_1 : vec2<i32> = x_99;
+    x_77_1.x = (x_99.x + (x_99.y / 2));
+    let x_77 : vec2<i32> = x_77_1;
+
+    continuing {
+      x_80 = (x_79 + 1);
+      x_76_phi = x_77;
+      x_79_phi = x_80;
+    }
+  }
+  let x_104 : i32 = x_76.x;
+  x_110_phi = x_76;
+  if ((x_104 < 0)) {
+    x_109 = x_76;
+    x_109.x = -(x_104);
+    x_110_phi = x_109;
+  }
+  let x_110 : vec2<i32> = x_110_phi;
+  x_112_phi = x_110;
+  loop {
+    var x_113 : vec2<i32>;
+    let x_112 : vec2<i32> = x_112_phi;
+    x_115 = x_112.x;
+    if ((x_115 > 15)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_113 = x_112;
+      x_113.x = bitcast<i32>((x_115 - bitcast<i32>(16)));
+      x_112_phi = x_113;
+    }
+  }
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+  let x_120 : vec4<f32> = indexable[x_115];
+  x_GLF_color = x_120;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..d58e8dc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/0.wgsl.expected.hlsl
@@ -0,0 +1,105 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 indexable[16] = (float4[16])0;
+  int2 x_76 = int2(0, 0);
+  int2 x_109 = int2(0, 0);
+  int x_115 = 0;
+  int2 x_76_phi = int2(0, 0);
+  int x_79_phi = 0;
+  int2 x_110_phi = int2(0, 0);
+  int2 x_112_phi = int2(0, 0);
+  const float4 x_55 = gl_FragCoord;
+  const float2 x_58 = asfloat(x_6[0].xy);
+  const float2 x_59 = (float2(x_55.x, x_55.y) / x_58);
+  const int x_62 = int((x_59.x * 8.0f));
+  const int x_65 = int((x_59.y * 8.0f));
+  const int2 x_74 = int2(((((x_62 & 5) | (x_65 & 10)) * 8) + ((x_65 & 5) | (x_62 & 10))), 0);
+  x_76_phi = x_74;
+  x_79_phi = 0;
+  while (true) {
+    int2 x_90 = int2(0, 0);
+    int2 x_98 = int2(0, 0);
+    int x_80 = 0;
+    int2 x_91_phi = int2(0, 0);
+    int2 x_99_phi = int2(0, 0);
+    x_76 = x_76_phi;
+    const int x_79 = x_79_phi;
+    if ((x_79 < 100)) {
+    } else {
+      break;
+    }
+    x_91_phi = x_76;
+    if ((x_76.x > 0)) {
+      x_90 = x_76;
+      x_90.y = (x_76.y - 1);
+      x_91_phi = x_90;
+    }
+    const int2 x_91 = x_91_phi;
+    x_99_phi = x_91;
+    if ((x_91.x < 0)) {
+      x_98 = x_91;
+      x_98.y = (x_91.y + 1);
+      x_99_phi = x_98;
+    }
+    const int2 x_99 = x_99_phi;
+    int2 x_77_1 = x_99;
+    x_77_1.x = (x_99.x + (x_99.y / 2));
+    const int2 x_77 = x_77_1;
+    {
+      x_80 = (x_79 + 1);
+      x_76_phi = x_77;
+      x_79_phi = x_80;
+    }
+  }
+  const int x_104 = x_76.x;
+  x_110_phi = x_76;
+  if ((x_104 < 0)) {
+    x_109 = x_76;
+    x_109.x = -(x_104);
+    x_110_phi = x_109;
+  }
+  x_112_phi = x_110_phi;
+  while (true) {
+    int2 x_113 = int2(0, 0);
+    const int2 x_112 = x_112_phi;
+    x_115 = x_112.x;
+    if ((x_115 > 15)) {
+    } else {
+      break;
+    }
+    {
+      x_113 = x_112;
+      x_113.x = asint((x_115 - asint(16)));
+      x_112_phi = x_113;
+    }
+  }
+  const float4 tint_symbol_5[16] = {float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)};
+  indexable = tint_symbol_5;
+  const float4 x_120 = indexable[x_115];
+  x_GLF_color = x_120;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/0.wgsl.expected.msl
new file mode 100644
index 0000000..e35ddd7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/0.wgsl.expected.msl
@@ -0,0 +1,108 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  float4 arr[16];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  tint_array_wrapper indexable = {};
+  int2 x_76 = 0;
+  int2 x_109 = 0;
+  int x_115 = 0;
+  int2 x_76_phi = 0;
+  int x_79_phi = 0;
+  int2 x_110_phi = 0;
+  int2 x_112_phi = 0;
+  float4 const x_55 = *(tint_symbol_6);
+  float2 const x_58 = x_6.resolution;
+  float2 const x_59 = (float2(x_55.x, x_55.y) / x_58);
+  int const x_62 = int((x_59.x * 8.0f));
+  int const x_65 = int((x_59.y * 8.0f));
+  int2 const x_74 = int2(((((x_62 & 5) | (x_65 & 10)) * 8) + ((x_65 & 5) | (x_62 & 10))), 0);
+  x_76_phi = x_74;
+  x_79_phi = 0;
+  while (true) {
+    int2 x_90 = 0;
+    int2 x_98 = 0;
+    int x_80 = 0;
+    int2 x_91_phi = 0;
+    int2 x_99_phi = 0;
+    x_76 = x_76_phi;
+    int const x_79 = x_79_phi;
+    if ((x_79 < 100)) {
+    } else {
+      break;
+    }
+    x_91_phi = x_76;
+    if ((x_76.x > 0)) {
+      x_90 = x_76;
+      x_90.y = (x_76.y - 1);
+      x_91_phi = x_90;
+    }
+    int2 const x_91 = x_91_phi;
+    x_99_phi = x_91;
+    if ((x_91.x < 0)) {
+      x_98 = x_91;
+      x_98.y = (x_91.y + 1);
+      x_99_phi = x_98;
+    }
+    int2 const x_99 = x_99_phi;
+    int2 x_77_1 = x_99;
+    x_77_1.x = (x_99.x + (x_99.y / 2));
+    int2 const x_77 = x_77_1;
+    {
+      x_80 = (x_79 + 1);
+      x_76_phi = x_77;
+      x_79_phi = x_80;
+    }
+  }
+  int const x_104 = x_76.x;
+  x_110_phi = x_76;
+  if ((x_104 < 0)) {
+    x_109 = x_76;
+    x_109.x = -(x_104);
+    x_110_phi = x_109;
+  }
+  int2 const x_110 = x_110_phi;
+  x_112_phi = x_110;
+  while (true) {
+    int2 x_113 = 0;
+    int2 const x_112 = x_112_phi;
+    x_115 = x_112.x;
+    if ((x_115 > 15)) {
+    } else {
+      break;
+    }
+    {
+      x_113 = x_112;
+      x_113.x = as_type<int>((x_115 - as_type<int>(16)));
+      x_112_phi = x_113;
+    }
+  }
+  tint_array_wrapper const tint_symbol_4 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
+  indexable = tint_symbol_4;
+  float4 const x_120 = indexable.arr[x_115];
+  *(tint_symbol_7) = x_120;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..2951010
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/0.wgsl.expected.spvasm
@@ -0,0 +1,292 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 185
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %indexable "indexable"
+               OpName %x_76 "x_76"
+               OpName %x_109 "x_109"
+               OpName %x_115 "x_115"
+               OpName %x_76_phi "x_76_phi"
+               OpName %x_79_phi "x_79_phi"
+               OpName %x_110_phi "x_110_phi"
+               OpName %x_112_phi "x_112_phi"
+               OpName %x_90 "x_90"
+               OpName %x_98 "x_98"
+               OpName %x_80 "x_80"
+               OpName %x_91_phi "x_91_phi"
+               OpName %x_99_phi "x_99_phi"
+               OpName %x_77_1 "x_77_1"
+               OpName %x_113 "x_113"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v4float_uint_16 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+         %24 = OpConstantNull %_arr_v4float_uint_16
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %29 = OpConstantNull %v2int
+%_ptr_Function_int = OpTypePointer Function %int
+         %33 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_8 = OpConstant %float 8
+      %int_5 = OpConstant %int 5
+     %int_10 = OpConstant %int 10
+      %int_8 = OpConstant %int 8
+      %int_0 = OpConstant %int 0
+    %int_100 = OpConstant %int 100
+       %bool = OpTypeBool
+     %uint_1 = OpConstant %uint 1
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+     %int_15 = OpConstant %int 15
+     %int_16 = OpConstant %int 16
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+        %151 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+  %float_0_5 = OpConstant %float 0.5
+        %153 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+        %154 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+        %155 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+        %156 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+        %157 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+        %158 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+        %159 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+        %160 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %161 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+        %162 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+        %163 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+        %164 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+        %165 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+        %166 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+        %167 = OpConstantComposite %_arr_v4float_uint_16 %151 %153 %154 %155 %156 %157 %158 %159 %151 %160 %161 %162 %163 %164 %165 %166
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+   %main_out = OpTypeStruct %v4float
+        %172 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_16 Function %24
+       %x_76 = OpVariable %_ptr_Function_v2int Function %29
+      %x_109 = OpVariable %_ptr_Function_v2int Function %29
+      %x_115 = OpVariable %_ptr_Function_int Function %33
+   %x_76_phi = OpVariable %_ptr_Function_v2int Function %29
+   %x_79_phi = OpVariable %_ptr_Function_int Function %33
+  %x_110_phi = OpVariable %_ptr_Function_v2int Function %29
+  %x_112_phi = OpVariable %_ptr_Function_v2int Function %29
+       %x_90 = OpVariable %_ptr_Function_v2int Function %29
+       %x_98 = OpVariable %_ptr_Function_v2int Function %29
+       %x_80 = OpVariable %_ptr_Function_int Function %33
+   %x_91_phi = OpVariable %_ptr_Function_v2int Function %29
+   %x_99_phi = OpVariable %_ptr_Function_v2int Function %29
+     %x_77_1 = OpVariable %_ptr_Function_v2int Function %29
+      %x_113 = OpVariable %_ptr_Function_v2int Function %29
+         %38 = OpLoad %v4float %gl_FragCoord
+         %41 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %42 = OpLoad %v2float %41
+         %43 = OpCompositeExtract %float %38 0
+         %44 = OpCompositeExtract %float %38 1
+         %45 = OpCompositeConstruct %v2float %43 %44
+         %46 = OpFDiv %v2float %45 %42
+         %48 = OpCompositeExtract %float %46 0
+         %50 = OpFMul %float %48 %float_8
+         %47 = OpConvertFToS %int %50
+         %52 = OpCompositeExtract %float %46 1
+         %53 = OpFMul %float %52 %float_8
+         %51 = OpConvertFToS %int %53
+         %55 = OpBitwiseAnd %int %47 %int_5
+         %57 = OpBitwiseAnd %int %51 %int_10
+         %58 = OpBitwiseOr %int %55 %57
+         %60 = OpIMul %int %58 %int_8
+         %61 = OpBitwiseAnd %int %51 %int_5
+         %62 = OpBitwiseAnd %int %47 %int_10
+         %63 = OpBitwiseOr %int %61 %62
+         %64 = OpIAdd %int %60 %63
+         %66 = OpCompositeConstruct %v2int %64 %int_0
+               OpStore %x_76_phi %66
+               OpStore %x_79_phi %int_0
+               OpBranch %67
+         %67 = OpLabel
+               OpLoopMerge %68 %69 None
+               OpBranch %70
+         %70 = OpLabel
+         %76 = OpLoad %v2int %x_76_phi
+               OpStore %x_76 %76
+         %77 = OpLoad %int %x_79_phi
+         %79 = OpSLessThan %bool %77 %int_100
+               OpSelectionMerge %81 None
+               OpBranchConditional %79 %82 %83
+         %82 = OpLabel
+               OpBranch %81
+         %83 = OpLabel
+               OpBranch %68
+         %81 = OpLabel
+         %84 = OpLoad %v2int %x_76
+               OpStore %x_91_phi %84
+         %85 = OpAccessChain %_ptr_Function_int %x_76 %uint_0
+         %86 = OpLoad %int %85
+         %87 = OpSGreaterThan %bool %86 %int_0
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %88
+         %89 = OpLabel
+         %90 = OpLoad %v2int %x_76
+               OpStore %x_90 %90
+         %92 = OpAccessChain %_ptr_Function_int %x_90 %uint_1
+         %93 = OpAccessChain %_ptr_Function_int %x_76 %uint_1
+         %94 = OpLoad %int %93
+         %96 = OpISub %int %94 %int_1
+               OpStore %92 %96
+         %97 = OpLoad %v2int %x_90
+               OpStore %x_91_phi %97
+               OpBranch %88
+         %88 = OpLabel
+         %98 = OpLoad %v2int %x_91_phi
+               OpStore %x_99_phi %98
+         %99 = OpCompositeExtract %int %98 0
+        %100 = OpSLessThan %bool %99 %int_0
+               OpSelectionMerge %101 None
+               OpBranchConditional %100 %102 %101
+        %102 = OpLabel
+               OpStore %x_98 %98
+        %103 = OpAccessChain %_ptr_Function_int %x_98 %uint_1
+        %104 = OpCompositeExtract %int %98 1
+        %105 = OpIAdd %int %104 %int_1
+               OpStore %103 %105
+        %106 = OpLoad %v2int %x_98
+               OpStore %x_99_phi %106
+               OpBranch %101
+        %101 = OpLabel
+        %107 = OpLoad %v2int %x_99_phi
+               OpStore %x_77_1 %107
+        %109 = OpAccessChain %_ptr_Function_int %x_77_1 %uint_0
+        %110 = OpCompositeExtract %int %107 0
+        %111 = OpCompositeExtract %int %107 1
+        %113 = OpSDiv %int %111 %int_2
+        %114 = OpIAdd %int %110 %113
+               OpStore %109 %114
+        %115 = OpLoad %v2int %x_77_1
+               OpBranch %69
+         %69 = OpLabel
+        %116 = OpIAdd %int %77 %int_1
+               OpStore %x_80 %116
+               OpStore %x_76_phi %115
+        %117 = OpLoad %int %x_80
+               OpStore %x_79_phi %117
+               OpBranch %67
+         %68 = OpLabel
+        %118 = OpAccessChain %_ptr_Function_int %x_76 %uint_0
+        %119 = OpLoad %int %118
+        %120 = OpLoad %v2int %x_76
+               OpStore %x_110_phi %120
+        %121 = OpSLessThan %bool %119 %int_0
+               OpSelectionMerge %122 None
+               OpBranchConditional %121 %123 %122
+        %123 = OpLabel
+        %124 = OpLoad %v2int %x_76
+               OpStore %x_109 %124
+        %125 = OpAccessChain %_ptr_Function_int %x_109 %uint_0
+        %126 = OpSNegate %int %119
+               OpStore %125 %126
+        %127 = OpLoad %v2int %x_109
+               OpStore %x_110_phi %127
+               OpBranch %122
+        %122 = OpLabel
+        %128 = OpLoad %v2int %x_110_phi
+               OpStore %x_112_phi %128
+               OpBranch %129
+        %129 = OpLabel
+               OpLoopMerge %130 %131 None
+               OpBranch %132
+        %132 = OpLabel
+        %134 = OpLoad %v2int %x_112_phi
+        %135 = OpCompositeExtract %int %134 0
+               OpStore %x_115 %135
+        %136 = OpLoad %int %x_115
+        %138 = OpSGreaterThan %bool %136 %int_15
+               OpSelectionMerge %139 None
+               OpBranchConditional %138 %140 %141
+        %140 = OpLabel
+               OpBranch %139
+        %141 = OpLabel
+               OpBranch %130
+        %139 = OpLabel
+               OpBranch %131
+        %131 = OpLabel
+               OpStore %x_113 %134
+        %142 = OpAccessChain %_ptr_Function_int %x_113 %uint_0
+        %144 = OpLoad %int %x_115
+        %145 = OpCopyObject %int %int_16
+        %147 = OpISub %int %144 %145
+        %143 = OpCopyObject %int %147
+               OpStore %142 %143
+        %148 = OpLoad %v2int %x_113
+               OpStore %x_112_phi %148
+               OpBranch %129
+        %130 = OpLabel
+               OpStore %indexable %167
+        %168 = OpLoad %int %x_115
+        %170 = OpAccessChain %_ptr_Function_v4float %indexable %168
+        %171 = OpLoad %v4float %170
+               OpStore %x_GLF_color %171
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %172
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %176 = OpLabel
+        %177 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %177
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %179 = OpLabel
+        %180 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %180
+        %181 = OpFunctionCall %void %main_1
+        %183 = OpLoad %v4float %x_GLF_color
+        %184 = OpCompositeConstruct %main_out %183
+        %182 = OpFunctionCall %void %tint_symbol_3 %184
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..8fe4ab4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/0.wgsl.expected.wgsl
@@ -0,0 +1,105 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var indexable : array<vec4<f32>, 16>;
+  var x_76 : vec2<i32>;
+  var x_109 : vec2<i32>;
+  var x_115 : i32;
+  var x_76_phi : vec2<i32>;
+  var x_79_phi : i32;
+  var x_110_phi : vec2<i32>;
+  var x_112_phi : vec2<i32>;
+  let x_55 : vec4<f32> = gl_FragCoord;
+  let x_58 : vec2<f32> = x_6.resolution;
+  let x_59 : vec2<f32> = (vec2<f32>(x_55.x, x_55.y) / x_58);
+  let x_62 : i32 = i32((x_59.x * 8.0));
+  let x_65 : i32 = i32((x_59.y * 8.0));
+  let x_74 : vec2<i32> = vec2<i32>(((((x_62 & 5) | (x_65 & 10)) * 8) + ((x_65 & 5) | (x_62 & 10))), 0);
+  x_76_phi = x_74;
+  x_79_phi = 0;
+  loop {
+    var x_90 : vec2<i32>;
+    var x_98 : vec2<i32>;
+    var x_80 : i32;
+    var x_91_phi : vec2<i32>;
+    var x_99_phi : vec2<i32>;
+    x_76 = x_76_phi;
+    let x_79 : i32 = x_79_phi;
+    if ((x_79 < 100)) {
+    } else {
+      break;
+    }
+    x_91_phi = x_76;
+    if ((x_76.x > 0)) {
+      x_90 = x_76;
+      x_90.y = (x_76.y - 1);
+      x_91_phi = x_90;
+    }
+    let x_91 : vec2<i32> = x_91_phi;
+    x_99_phi = x_91;
+    if ((x_91.x < 0)) {
+      x_98 = x_91;
+      x_98.y = (x_91.y + 1);
+      x_99_phi = x_98;
+    }
+    let x_99 : vec2<i32> = x_99_phi;
+    var x_77_1 : vec2<i32> = x_99;
+    x_77_1.x = (x_99.x + (x_99.y / 2));
+    let x_77 : vec2<i32> = x_77_1;
+
+    continuing {
+      x_80 = (x_79 + 1);
+      x_76_phi = x_77;
+      x_79_phi = x_80;
+    }
+  }
+  let x_104 : i32 = x_76.x;
+  x_110_phi = x_76;
+  if ((x_104 < 0)) {
+    x_109 = x_76;
+    x_109.x = -(x_104);
+    x_110_phi = x_109;
+  }
+  let x_110 : vec2<i32> = x_110_phi;
+  x_112_phi = x_110;
+  loop {
+    var x_113 : vec2<i32>;
+    let x_112 : vec2<i32> = x_112_phi;
+    x_115 = x_112.x;
+    if ((x_115 > 15)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_113 = x_112;
+      x_113.x = bitcast<i32>((x_115 - bitcast<i32>(16)));
+      x_112_phi = x_113;
+    }
+  }
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+  let x_120 : vec4<f32> = indexable[x_115];
+  x_GLF_color = x_120;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/1.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/1.spvasm
new file mode 100644
index 0000000..bccf1c6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/1.spvasm
@@ -0,0 +1,167 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpName %indexable "indexable"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+       %uint = OpTypeInt 32 0
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_8 = OpConstant %float 8
+      %int_5 = OpConstant %int 5
+     %int_10 = OpConstant %int 10
+      %int_8 = OpConstant %int 8
+    %int_100 = OpConstant %int 100
+     %int_15 = OpConstant %int 15
+     %int_16 = OpConstant %int 16
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %35 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+  %float_0_5 = OpConstant %float 0.5
+         %37 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+         %38 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+         %39 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+         %40 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+         %41 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+         %42 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+         %43 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+         %44 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %45 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+         %46 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+         %47 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+         %48 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+         %49 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+         %50 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+         %51 = OpConstantComposite %_arr_v4float_uint_16 %35 %37 %38 %39 %40 %41 %42 %43 %35 %44 %45 %46 %47 %48 %49 %50
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+  %float_0_0 = OpConstant %float 0
+         %55 = OpConstantComposite %v4float %float_0_0 %float_0_0 %float_0_0 %float_0_0
+         %56 = OpConstantComposite %_arr_v4float_uint_16 %55 %55 %55 %55 %55 %55 %55 %55 %55 %55 %55 %55 %55 %55 %55 %55
+       %main = OpFunction %void None %9
+         %57 = OpLabel
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_16 Function
+         %58 = OpLoad %v4float %gl_FragCoord
+         %59 = OpVectorShuffle %v2float %58 %58 0 1
+         %60 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+         %61 = OpLoad %v2float %60
+         %62 = OpFDiv %v2float %59 %61
+         %63 = OpCompositeExtract %float %62 0
+         %64 = OpFMul %float %63 %float_8
+         %65 = OpConvertFToS %int %64
+         %66 = OpAccessChain %_ptr_Function__arr_v4float_uint_16 %indexable
+         %67 = OpCompositeExtract %float %62 1
+         %68 = OpFMul %float %67 %float_8
+         %69 = OpConvertFToS %int %68
+         %70 = OpBitwiseAnd %int %65 %int_5
+         %71 = OpBitwiseAnd %int %69 %int_10
+         %72 = OpBitwiseOr %int %70 %71
+         %73 = OpBitwiseAnd %int %69 %int_5
+         %74 = OpBitwiseAnd %int %65 %int_10
+         %75 = OpBitwiseOr %int %73 %74
+         %76 = OpIMul %int %72 %int_8
+         %77 = OpIAdd %int %76 %75
+         %78 = OpCompositeConstruct %v2int %77 %int_0
+               OpBranch %79
+         %79 = OpLabel
+         %80 = OpPhi %v2int %78 %57 %81 %82
+         %83 = OpPhi %int %int_0 %57 %84 %82
+         %85 = OpSLessThan %bool %83 %int_100
+               OpLoopMerge %86 %82 None
+               OpBranchConditional %85 %87 %86
+         %87 = OpLabel
+         %88 = OpCompositeExtract %int %80 0
+         %89 = OpSGreaterThan %bool %88 %int_0
+               OpSelectionMerge %90 None
+               OpBranchConditional %89 %91 %90
+         %91 = OpLabel
+         %92 = OpCompositeExtract %int %80 1
+         %93 = OpISub %int %92 %int_1
+         %94 = OpCompositeInsert %v2int %93 %80 1
+               OpBranch %90
+         %90 = OpLabel
+         %95 = OpPhi %v2int %80 %87 %94 %91
+         %96 = OpCompositeExtract %int %95 0
+         %97 = OpSLessThan %bool %96 %int_0
+               OpSelectionMerge %98 None
+               OpBranchConditional %97 %99 %98
+         %99 = OpLabel
+        %100 = OpCompositeExtract %int %95 1
+        %101 = OpIAdd %int %100 %int_1
+        %102 = OpCompositeInsert %v2int %101 %95 1
+               OpBranch %98
+         %98 = OpLabel
+        %103 = OpPhi %v2int %95 %90 %102 %99
+        %104 = OpCompositeExtract %int %103 1
+        %105 = OpSDiv %int %104 %int_2
+        %106 = OpCompositeExtract %int %103 0
+        %107 = OpIAdd %int %106 %105
+         %81 = OpCompositeInsert %v2int %107 %103 0
+               OpBranch %82
+         %82 = OpLabel
+         %84 = OpIAdd %int %83 %int_1
+               OpBranch %79
+         %86 = OpLabel
+        %108 = OpCompositeExtract %int %80 0
+        %109 = OpSLessThan %bool %108 %int_0
+               OpSelectionMerge %110 None
+               OpBranchConditional %109 %111 %110
+        %111 = OpLabel
+        %112 = OpSNegate %int %108
+        %113 = OpCompositeInsert %v2int %112 %80 0
+               OpBranch %110
+        %110 = OpLabel
+        %114 = OpPhi %v2int %80 %86 %113 %111
+               OpBranch %115
+        %115 = OpLabel
+        %116 = OpPhi %v2int %114 %110 %117 %118
+        %119 = OpCompositeExtract %int %116 0
+        %120 = OpSGreaterThan %bool %119 %int_15
+               OpLoopMerge %121 %118 None
+               OpBranchConditional %120 %118 %121
+        %118 = OpLabel
+        %122 = OpISub %int %119 %int_16
+        %117 = OpCompositeInsert %v2int %122 %116 0
+               OpBranch %115
+        %121 = OpLabel
+               OpStore %indexable %51
+        %123 = OpAccessChain %_ptr_Function_v4float %indexable %119
+        %124 = OpLoad %_arr_v4float_uint_16 %66
+               OpStore %66 %56
+               OpStore %66 %124
+        %125 = OpLoad %v4float %123
+               OpStore %_GLF_color %125
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..64c4e84
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/1.spvasm.expected.hlsl
@@ -0,0 +1,109 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 indexable[16] = (float4[16])0;
+  int2 x_80 = int2(0, 0);
+  int2 x_113 = int2(0, 0);
+  int x_119 = 0;
+  int2 x_80_phi = int2(0, 0);
+  int x_83_phi = 0;
+  int2 x_114_phi = int2(0, 0);
+  int2 x_116_phi = int2(0, 0);
+  const float4 x_58 = gl_FragCoord;
+  const float2 x_61 = asfloat(x_6[0].xy);
+  const float2 x_62 = (float2(x_58.x, x_58.y) / x_61);
+  const int x_65 = int((x_62.x * 8.0f));
+  const int x_69 = int((x_62.y * 8.0f));
+  const int2 x_78 = int2(((((x_65 & 5) | (x_69 & 10)) * 8) + ((x_69 & 5) | (x_65 & 10))), 0);
+  x_80_phi = x_78;
+  x_83_phi = 0;
+  while (true) {
+    int2 x_94 = int2(0, 0);
+    int2 x_102 = int2(0, 0);
+    int x_84 = 0;
+    int2 x_95_phi = int2(0, 0);
+    int2 x_103_phi = int2(0, 0);
+    x_80 = x_80_phi;
+    const int x_83 = x_83_phi;
+    if ((x_83 < 100)) {
+    } else {
+      break;
+    }
+    x_95_phi = x_80;
+    if ((x_80.x > 0)) {
+      x_94 = x_80;
+      x_94.y = (x_80.y - 1);
+      x_95_phi = x_94;
+    }
+    const int2 x_95 = x_95_phi;
+    x_103_phi = x_95;
+    if ((x_95.x < 0)) {
+      x_102 = x_95;
+      x_102.y = (x_95.y + 1);
+      x_103_phi = x_102;
+    }
+    const int2 x_103 = x_103_phi;
+    int2 x_81_1 = x_103;
+    x_81_1.x = (x_103.x + (x_103.y / 2));
+    const int2 x_81 = x_81_1;
+    {
+      x_84 = (x_83 + 1);
+      x_80_phi = x_81;
+      x_83_phi = x_84;
+    }
+  }
+  const int x_108 = x_80.x;
+  x_114_phi = x_80;
+  if ((x_108 < 0)) {
+    x_113 = x_80;
+    x_113.x = -(x_108);
+    x_114_phi = x_113;
+  }
+  x_116_phi = x_114_phi;
+  while (true) {
+    int2 x_117 = int2(0, 0);
+    const int2 x_116 = x_116_phi;
+    x_119 = x_116.x;
+    if ((x_119 > 15)) {
+    } else {
+      break;
+    }
+    {
+      x_117 = x_116;
+      x_117.x = asint((x_119 - asint(16)));
+      x_116_phi = x_117;
+    }
+  }
+  const float4 tint_symbol_5[16] = {float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)};
+  indexable = tint_symbol_5;
+  const float4 x_124[16] = indexable;
+  const float4 tint_symbol_6[16] = {float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)};
+  indexable = tint_symbol_6;
+  indexable = x_124;
+  const float4 x_125 = indexable[x_119];
+  x_GLF_color = x_125;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_7 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_7;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/1.spvasm.expected.msl
new file mode 100644
index 0000000..6b28e63
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/1.spvasm.expected.msl
@@ -0,0 +1,112 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  float4 arr[16];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_7, thread float4* const tint_symbol_8) {
+  tint_array_wrapper indexable = {};
+  int2 x_80 = 0;
+  int2 x_113 = 0;
+  int x_119 = 0;
+  int2 x_80_phi = 0;
+  int x_83_phi = 0;
+  int2 x_114_phi = 0;
+  int2 x_116_phi = 0;
+  float4 const x_58 = *(tint_symbol_7);
+  float2 const x_61 = x_6.resolution;
+  float2 const x_62 = (float2(x_58.x, x_58.y) / x_61);
+  int const x_65 = int((x_62.x * 8.0f));
+  int const x_69 = int((x_62.y * 8.0f));
+  int2 const x_78 = int2(((((x_65 & 5) | (x_69 & 10)) * 8) + ((x_69 & 5) | (x_65 & 10))), 0);
+  x_80_phi = x_78;
+  x_83_phi = 0;
+  while (true) {
+    int2 x_94 = 0;
+    int2 x_102 = 0;
+    int x_84 = 0;
+    int2 x_95_phi = 0;
+    int2 x_103_phi = 0;
+    x_80 = x_80_phi;
+    int const x_83 = x_83_phi;
+    if ((x_83 < 100)) {
+    } else {
+      break;
+    }
+    x_95_phi = x_80;
+    if ((x_80.x > 0)) {
+      x_94 = x_80;
+      x_94.y = (x_80.y - 1);
+      x_95_phi = x_94;
+    }
+    int2 const x_95 = x_95_phi;
+    x_103_phi = x_95;
+    if ((x_95.x < 0)) {
+      x_102 = x_95;
+      x_102.y = (x_95.y + 1);
+      x_103_phi = x_102;
+    }
+    int2 const x_103 = x_103_phi;
+    int2 x_81_1 = x_103;
+    x_81_1.x = (x_103.x + (x_103.y / 2));
+    int2 const x_81 = x_81_1;
+    {
+      x_84 = (x_83 + 1);
+      x_80_phi = x_81;
+      x_83_phi = x_84;
+    }
+  }
+  int const x_108 = x_80.x;
+  x_114_phi = x_80;
+  if ((x_108 < 0)) {
+    x_113 = x_80;
+    x_113.x = -(x_108);
+    x_114_phi = x_113;
+  }
+  int2 const x_114 = x_114_phi;
+  x_116_phi = x_114;
+  while (true) {
+    int2 x_117 = 0;
+    int2 const x_116 = x_116_phi;
+    x_119 = x_116.x;
+    if ((x_119 > 15)) {
+    } else {
+      break;
+    }
+    {
+      x_117 = x_116;
+      x_117.x = as_type<int>((x_119 - as_type<int>(16)));
+      x_116_phi = x_117;
+    }
+  }
+  tint_array_wrapper const tint_symbol_4 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
+  indexable = tint_symbol_4;
+  tint_array_wrapper const x_124 = indexable;
+  tint_array_wrapper const tint_symbol_5 = {.arr={float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)}};
+  indexable = tint_symbol_5;
+  indexable = x_124;
+  float4 const x_125 = indexable.arr[x_119];
+  *(tint_symbol_8) = x_125;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_9 = 0.0f;
+  thread float4 tint_symbol_10 = 0.0f;
+  tint_symbol_9 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_9), &(tint_symbol_10));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_10};
+  tint_symbol_2 const tint_symbol_6 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..af0b70a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/1.spvasm.expected.spvasm
@@ -0,0 +1,297 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 188
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %indexable "indexable"
+               OpName %x_80 "x_80"
+               OpName %x_113 "x_113"
+               OpName %x_119 "x_119"
+               OpName %x_80_phi "x_80_phi"
+               OpName %x_83_phi "x_83_phi"
+               OpName %x_114_phi "x_114_phi"
+               OpName %x_116_phi "x_116_phi"
+               OpName %x_94 "x_94"
+               OpName %x_102 "x_102"
+               OpName %x_84 "x_84"
+               OpName %x_95_phi "x_95_phi"
+               OpName %x_103_phi "x_103_phi"
+               OpName %x_81_1 "x_81_1"
+               OpName %x_117 "x_117"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v4float_uint_16 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+         %24 = OpConstantNull %_arr_v4float_uint_16
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %29 = OpConstantNull %v2int
+%_ptr_Function_int = OpTypePointer Function %int
+         %33 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_8 = OpConstant %float 8
+      %int_5 = OpConstant %int 5
+     %int_10 = OpConstant %int 10
+      %int_8 = OpConstant %int 8
+      %int_0 = OpConstant %int 0
+    %int_100 = OpConstant %int 100
+       %bool = OpTypeBool
+     %uint_1 = OpConstant %uint 1
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+     %int_15 = OpConstant %int 15
+     %int_16 = OpConstant %int 16
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+        %151 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+  %float_0_5 = OpConstant %float 0.5
+        %153 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+        %154 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+        %155 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+        %156 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+        %157 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+        %158 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+        %159 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+        %160 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %161 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+        %162 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+        %163 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+        %164 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+        %165 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+        %166 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+        %167 = OpConstantComposite %_arr_v4float_uint_16 %151 %153 %154 %155 %156 %157 %158 %159 %151 %160 %161 %162 %163 %164 %165 %166
+        %169 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+        %170 = OpConstantComposite %_arr_v4float_uint_16 %169 %169 %169 %169 %169 %169 %169 %169 %169 %169 %169 %169 %169 %169 %169 %169
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+   %main_out = OpTypeStruct %v4float
+        %175 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_16 Function %24
+       %x_80 = OpVariable %_ptr_Function_v2int Function %29
+      %x_113 = OpVariable %_ptr_Function_v2int Function %29
+      %x_119 = OpVariable %_ptr_Function_int Function %33
+   %x_80_phi = OpVariable %_ptr_Function_v2int Function %29
+   %x_83_phi = OpVariable %_ptr_Function_int Function %33
+  %x_114_phi = OpVariable %_ptr_Function_v2int Function %29
+  %x_116_phi = OpVariable %_ptr_Function_v2int Function %29
+       %x_94 = OpVariable %_ptr_Function_v2int Function %29
+      %x_102 = OpVariable %_ptr_Function_v2int Function %29
+       %x_84 = OpVariable %_ptr_Function_int Function %33
+   %x_95_phi = OpVariable %_ptr_Function_v2int Function %29
+  %x_103_phi = OpVariable %_ptr_Function_v2int Function %29
+     %x_81_1 = OpVariable %_ptr_Function_v2int Function %29
+      %x_117 = OpVariable %_ptr_Function_v2int Function %29
+         %38 = OpLoad %v4float %gl_FragCoord
+         %41 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %42 = OpLoad %v2float %41
+         %43 = OpCompositeExtract %float %38 0
+         %44 = OpCompositeExtract %float %38 1
+         %45 = OpCompositeConstruct %v2float %43 %44
+         %46 = OpFDiv %v2float %45 %42
+         %48 = OpCompositeExtract %float %46 0
+         %50 = OpFMul %float %48 %float_8
+         %47 = OpConvertFToS %int %50
+         %52 = OpCompositeExtract %float %46 1
+         %53 = OpFMul %float %52 %float_8
+         %51 = OpConvertFToS %int %53
+         %55 = OpBitwiseAnd %int %47 %int_5
+         %57 = OpBitwiseAnd %int %51 %int_10
+         %58 = OpBitwiseOr %int %55 %57
+         %60 = OpIMul %int %58 %int_8
+         %61 = OpBitwiseAnd %int %51 %int_5
+         %62 = OpBitwiseAnd %int %47 %int_10
+         %63 = OpBitwiseOr %int %61 %62
+         %64 = OpIAdd %int %60 %63
+         %66 = OpCompositeConstruct %v2int %64 %int_0
+               OpStore %x_80_phi %66
+               OpStore %x_83_phi %int_0
+               OpBranch %67
+         %67 = OpLabel
+               OpLoopMerge %68 %69 None
+               OpBranch %70
+         %70 = OpLabel
+         %76 = OpLoad %v2int %x_80_phi
+               OpStore %x_80 %76
+         %77 = OpLoad %int %x_83_phi
+         %79 = OpSLessThan %bool %77 %int_100
+               OpSelectionMerge %81 None
+               OpBranchConditional %79 %82 %83
+         %82 = OpLabel
+               OpBranch %81
+         %83 = OpLabel
+               OpBranch %68
+         %81 = OpLabel
+         %84 = OpLoad %v2int %x_80
+               OpStore %x_95_phi %84
+         %85 = OpAccessChain %_ptr_Function_int %x_80 %uint_0
+         %86 = OpLoad %int %85
+         %87 = OpSGreaterThan %bool %86 %int_0
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %88
+         %89 = OpLabel
+         %90 = OpLoad %v2int %x_80
+               OpStore %x_94 %90
+         %92 = OpAccessChain %_ptr_Function_int %x_94 %uint_1
+         %93 = OpAccessChain %_ptr_Function_int %x_80 %uint_1
+         %94 = OpLoad %int %93
+         %96 = OpISub %int %94 %int_1
+               OpStore %92 %96
+         %97 = OpLoad %v2int %x_94
+               OpStore %x_95_phi %97
+               OpBranch %88
+         %88 = OpLabel
+         %98 = OpLoad %v2int %x_95_phi
+               OpStore %x_103_phi %98
+         %99 = OpCompositeExtract %int %98 0
+        %100 = OpSLessThan %bool %99 %int_0
+               OpSelectionMerge %101 None
+               OpBranchConditional %100 %102 %101
+        %102 = OpLabel
+               OpStore %x_102 %98
+        %103 = OpAccessChain %_ptr_Function_int %x_102 %uint_1
+        %104 = OpCompositeExtract %int %98 1
+        %105 = OpIAdd %int %104 %int_1
+               OpStore %103 %105
+        %106 = OpLoad %v2int %x_102
+               OpStore %x_103_phi %106
+               OpBranch %101
+        %101 = OpLabel
+        %107 = OpLoad %v2int %x_103_phi
+               OpStore %x_81_1 %107
+        %109 = OpAccessChain %_ptr_Function_int %x_81_1 %uint_0
+        %110 = OpCompositeExtract %int %107 0
+        %111 = OpCompositeExtract %int %107 1
+        %113 = OpSDiv %int %111 %int_2
+        %114 = OpIAdd %int %110 %113
+               OpStore %109 %114
+        %115 = OpLoad %v2int %x_81_1
+               OpBranch %69
+         %69 = OpLabel
+        %116 = OpIAdd %int %77 %int_1
+               OpStore %x_84 %116
+               OpStore %x_80_phi %115
+        %117 = OpLoad %int %x_84
+               OpStore %x_83_phi %117
+               OpBranch %67
+         %68 = OpLabel
+        %118 = OpAccessChain %_ptr_Function_int %x_80 %uint_0
+        %119 = OpLoad %int %118
+        %120 = OpLoad %v2int %x_80
+               OpStore %x_114_phi %120
+        %121 = OpSLessThan %bool %119 %int_0
+               OpSelectionMerge %122 None
+               OpBranchConditional %121 %123 %122
+        %123 = OpLabel
+        %124 = OpLoad %v2int %x_80
+               OpStore %x_113 %124
+        %125 = OpAccessChain %_ptr_Function_int %x_113 %uint_0
+        %126 = OpSNegate %int %119
+               OpStore %125 %126
+        %127 = OpLoad %v2int %x_113
+               OpStore %x_114_phi %127
+               OpBranch %122
+        %122 = OpLabel
+        %128 = OpLoad %v2int %x_114_phi
+               OpStore %x_116_phi %128
+               OpBranch %129
+        %129 = OpLabel
+               OpLoopMerge %130 %131 None
+               OpBranch %132
+        %132 = OpLabel
+        %134 = OpLoad %v2int %x_116_phi
+        %135 = OpCompositeExtract %int %134 0
+               OpStore %x_119 %135
+        %136 = OpLoad %int %x_119
+        %138 = OpSGreaterThan %bool %136 %int_15
+               OpSelectionMerge %139 None
+               OpBranchConditional %138 %140 %141
+        %140 = OpLabel
+               OpBranch %139
+        %141 = OpLabel
+               OpBranch %130
+        %139 = OpLabel
+               OpBranch %131
+        %131 = OpLabel
+               OpStore %x_117 %134
+        %142 = OpAccessChain %_ptr_Function_int %x_117 %uint_0
+        %144 = OpLoad %int %x_119
+        %145 = OpCopyObject %int %int_16
+        %147 = OpISub %int %144 %145
+        %143 = OpCopyObject %int %147
+               OpStore %142 %143
+        %148 = OpLoad %v2int %x_117
+               OpStore %x_116_phi %148
+               OpBranch %129
+        %130 = OpLabel
+               OpStore %indexable %167
+        %168 = OpLoad %_arr_v4float_uint_16 %indexable
+               OpStore %indexable %170
+               OpStore %indexable %168
+        %171 = OpLoad %int %x_119
+        %173 = OpAccessChain %_ptr_Function_v4float %indexable %171
+        %174 = OpLoad %v4float %173
+               OpStore %x_GLF_color %174
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %175
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %179 = OpLabel
+        %180 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %180
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %182 = OpLabel
+        %183 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %183
+        %184 = OpFunctionCall %void %main_1
+        %186 = OpLoad %v4float %x_GLF_color
+        %187 = OpCompositeConstruct %main_out %186
+        %185 = OpFunctionCall %void %tint_symbol_3 %187
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..f0b6447
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/1.spvasm.expected.wgsl
@@ -0,0 +1,109 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var indexable : array<vec4<f32>, 16>;
+  var x_80 : vec2<i32>;
+  var x_113 : vec2<i32>;
+  var x_119 : i32;
+  var x_80_phi : vec2<i32>;
+  var x_83_phi : i32;
+  var x_114_phi : vec2<i32>;
+  var x_116_phi : vec2<i32>;
+  let x_58 : vec4<f32> = gl_FragCoord;
+  let x_61 : vec2<f32> = x_6.resolution;
+  let x_62 : vec2<f32> = (vec2<f32>(x_58.x, x_58.y) / x_61);
+  let x_65 : i32 = i32((x_62.x * 8.0));
+  let x_66 : ptr<function, array<vec4<f32>, 16>> = &(indexable);
+  let x_69 : i32 = i32((x_62.y * 8.0));
+  let x_78 : vec2<i32> = vec2<i32>(((((x_65 & 5) | (x_69 & 10)) * 8) + ((x_69 & 5) | (x_65 & 10))), 0);
+  x_80_phi = x_78;
+  x_83_phi = 0;
+  loop {
+    var x_94 : vec2<i32>;
+    var x_102 : vec2<i32>;
+    var x_84 : i32;
+    var x_95_phi : vec2<i32>;
+    var x_103_phi : vec2<i32>;
+    x_80 = x_80_phi;
+    let x_83 : i32 = x_83_phi;
+    if ((x_83 < 100)) {
+    } else {
+      break;
+    }
+    x_95_phi = x_80;
+    if ((x_80.x > 0)) {
+      x_94 = x_80;
+      x_94.y = (x_80.y - 1);
+      x_95_phi = x_94;
+    }
+    let x_95 : vec2<i32> = x_95_phi;
+    x_103_phi = x_95;
+    if ((x_95.x < 0)) {
+      x_102 = x_95;
+      x_102.y = (x_95.y + 1);
+      x_103_phi = x_102;
+    }
+    let x_103 : vec2<i32> = x_103_phi;
+    var x_81_1 : vec2<i32> = x_103;
+    x_81_1.x = (x_103.x + (x_103.y / 2));
+    let x_81 : vec2<i32> = x_81_1;
+
+    continuing {
+      x_84 = (x_83 + 1);
+      x_80_phi = x_81;
+      x_83_phi = x_84;
+    }
+  }
+  let x_108 : i32 = x_80.x;
+  x_114_phi = x_80;
+  if ((x_108 < 0)) {
+    x_113 = x_80;
+    x_113.x = -(x_108);
+    x_114_phi = x_113;
+  }
+  let x_114 : vec2<i32> = x_114_phi;
+  x_116_phi = x_114;
+  loop {
+    var x_117 : vec2<i32>;
+    let x_116 : vec2<i32> = x_116_phi;
+    x_119 = x_116.x;
+    if ((x_119 > 15)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_117 = x_116;
+      x_117.x = bitcast<i32>((x_119 - bitcast<i32>(16)));
+      x_116_phi = x_117;
+    }
+  }
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+  let x_124 : array<vec4<f32>, 16> = *(x_66);
+  *(x_66) = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
+  *(x_66) = x_124;
+  let x_125 : vec4<f32> = indexable[x_119];
+  x_GLF_color = x_125;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/1.wgsl
new file mode 100644
index 0000000..f0b6447
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/1.wgsl
@@ -0,0 +1,109 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var indexable : array<vec4<f32>, 16>;
+  var x_80 : vec2<i32>;
+  var x_113 : vec2<i32>;
+  var x_119 : i32;
+  var x_80_phi : vec2<i32>;
+  var x_83_phi : i32;
+  var x_114_phi : vec2<i32>;
+  var x_116_phi : vec2<i32>;
+  let x_58 : vec4<f32> = gl_FragCoord;
+  let x_61 : vec2<f32> = x_6.resolution;
+  let x_62 : vec2<f32> = (vec2<f32>(x_58.x, x_58.y) / x_61);
+  let x_65 : i32 = i32((x_62.x * 8.0));
+  let x_66 : ptr<function, array<vec4<f32>, 16>> = &(indexable);
+  let x_69 : i32 = i32((x_62.y * 8.0));
+  let x_78 : vec2<i32> = vec2<i32>(((((x_65 & 5) | (x_69 & 10)) * 8) + ((x_69 & 5) | (x_65 & 10))), 0);
+  x_80_phi = x_78;
+  x_83_phi = 0;
+  loop {
+    var x_94 : vec2<i32>;
+    var x_102 : vec2<i32>;
+    var x_84 : i32;
+    var x_95_phi : vec2<i32>;
+    var x_103_phi : vec2<i32>;
+    x_80 = x_80_phi;
+    let x_83 : i32 = x_83_phi;
+    if ((x_83 < 100)) {
+    } else {
+      break;
+    }
+    x_95_phi = x_80;
+    if ((x_80.x > 0)) {
+      x_94 = x_80;
+      x_94.y = (x_80.y - 1);
+      x_95_phi = x_94;
+    }
+    let x_95 : vec2<i32> = x_95_phi;
+    x_103_phi = x_95;
+    if ((x_95.x < 0)) {
+      x_102 = x_95;
+      x_102.y = (x_95.y + 1);
+      x_103_phi = x_102;
+    }
+    let x_103 : vec2<i32> = x_103_phi;
+    var x_81_1 : vec2<i32> = x_103;
+    x_81_1.x = (x_103.x + (x_103.y / 2));
+    let x_81 : vec2<i32> = x_81_1;
+
+    continuing {
+      x_84 = (x_83 + 1);
+      x_80_phi = x_81;
+      x_83_phi = x_84;
+    }
+  }
+  let x_108 : i32 = x_80.x;
+  x_114_phi = x_80;
+  if ((x_108 < 0)) {
+    x_113 = x_80;
+    x_113.x = -(x_108);
+    x_114_phi = x_113;
+  }
+  let x_114 : vec2<i32> = x_114_phi;
+  x_116_phi = x_114;
+  loop {
+    var x_117 : vec2<i32>;
+    let x_116 : vec2<i32> = x_116_phi;
+    x_119 = x_116.x;
+    if ((x_119 > 15)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_117 = x_116;
+      x_117.x = bitcast<i32>((x_119 - bitcast<i32>(16)));
+      x_116_phi = x_117;
+    }
+  }
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+  let x_124 : array<vec4<f32>, 16> = *(x_66);
+  *(x_66) = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
+  *(x_66) = x_124;
+  let x_125 : vec4<f32> = indexable[x_119];
+  x_GLF_color = x_125;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..64c4e84
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/1.wgsl.expected.hlsl
@@ -0,0 +1,109 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 indexable[16] = (float4[16])0;
+  int2 x_80 = int2(0, 0);
+  int2 x_113 = int2(0, 0);
+  int x_119 = 0;
+  int2 x_80_phi = int2(0, 0);
+  int x_83_phi = 0;
+  int2 x_114_phi = int2(0, 0);
+  int2 x_116_phi = int2(0, 0);
+  const float4 x_58 = gl_FragCoord;
+  const float2 x_61 = asfloat(x_6[0].xy);
+  const float2 x_62 = (float2(x_58.x, x_58.y) / x_61);
+  const int x_65 = int((x_62.x * 8.0f));
+  const int x_69 = int((x_62.y * 8.0f));
+  const int2 x_78 = int2(((((x_65 & 5) | (x_69 & 10)) * 8) + ((x_69 & 5) | (x_65 & 10))), 0);
+  x_80_phi = x_78;
+  x_83_phi = 0;
+  while (true) {
+    int2 x_94 = int2(0, 0);
+    int2 x_102 = int2(0, 0);
+    int x_84 = 0;
+    int2 x_95_phi = int2(0, 0);
+    int2 x_103_phi = int2(0, 0);
+    x_80 = x_80_phi;
+    const int x_83 = x_83_phi;
+    if ((x_83 < 100)) {
+    } else {
+      break;
+    }
+    x_95_phi = x_80;
+    if ((x_80.x > 0)) {
+      x_94 = x_80;
+      x_94.y = (x_80.y - 1);
+      x_95_phi = x_94;
+    }
+    const int2 x_95 = x_95_phi;
+    x_103_phi = x_95;
+    if ((x_95.x < 0)) {
+      x_102 = x_95;
+      x_102.y = (x_95.y + 1);
+      x_103_phi = x_102;
+    }
+    const int2 x_103 = x_103_phi;
+    int2 x_81_1 = x_103;
+    x_81_1.x = (x_103.x + (x_103.y / 2));
+    const int2 x_81 = x_81_1;
+    {
+      x_84 = (x_83 + 1);
+      x_80_phi = x_81;
+      x_83_phi = x_84;
+    }
+  }
+  const int x_108 = x_80.x;
+  x_114_phi = x_80;
+  if ((x_108 < 0)) {
+    x_113 = x_80;
+    x_113.x = -(x_108);
+    x_114_phi = x_113;
+  }
+  x_116_phi = x_114_phi;
+  while (true) {
+    int2 x_117 = int2(0, 0);
+    const int2 x_116 = x_116_phi;
+    x_119 = x_116.x;
+    if ((x_119 > 15)) {
+    } else {
+      break;
+    }
+    {
+      x_117 = x_116;
+      x_117.x = asint((x_119 - asint(16)));
+      x_116_phi = x_117;
+    }
+  }
+  const float4 tint_symbol_5[16] = {float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)};
+  indexable = tint_symbol_5;
+  const float4 x_124[16] = indexable;
+  const float4 tint_symbol_6[16] = {float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)};
+  indexable = tint_symbol_6;
+  indexable = x_124;
+  const float4 x_125 = indexable[x_119];
+  x_GLF_color = x_125;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_7 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_7;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/1.wgsl.expected.msl
new file mode 100644
index 0000000..6b28e63
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/1.wgsl.expected.msl
@@ -0,0 +1,112 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  float4 arr[16];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_7, thread float4* const tint_symbol_8) {
+  tint_array_wrapper indexable = {};
+  int2 x_80 = 0;
+  int2 x_113 = 0;
+  int x_119 = 0;
+  int2 x_80_phi = 0;
+  int x_83_phi = 0;
+  int2 x_114_phi = 0;
+  int2 x_116_phi = 0;
+  float4 const x_58 = *(tint_symbol_7);
+  float2 const x_61 = x_6.resolution;
+  float2 const x_62 = (float2(x_58.x, x_58.y) / x_61);
+  int const x_65 = int((x_62.x * 8.0f));
+  int const x_69 = int((x_62.y * 8.0f));
+  int2 const x_78 = int2(((((x_65 & 5) | (x_69 & 10)) * 8) + ((x_69 & 5) | (x_65 & 10))), 0);
+  x_80_phi = x_78;
+  x_83_phi = 0;
+  while (true) {
+    int2 x_94 = 0;
+    int2 x_102 = 0;
+    int x_84 = 0;
+    int2 x_95_phi = 0;
+    int2 x_103_phi = 0;
+    x_80 = x_80_phi;
+    int const x_83 = x_83_phi;
+    if ((x_83 < 100)) {
+    } else {
+      break;
+    }
+    x_95_phi = x_80;
+    if ((x_80.x > 0)) {
+      x_94 = x_80;
+      x_94.y = (x_80.y - 1);
+      x_95_phi = x_94;
+    }
+    int2 const x_95 = x_95_phi;
+    x_103_phi = x_95;
+    if ((x_95.x < 0)) {
+      x_102 = x_95;
+      x_102.y = (x_95.y + 1);
+      x_103_phi = x_102;
+    }
+    int2 const x_103 = x_103_phi;
+    int2 x_81_1 = x_103;
+    x_81_1.x = (x_103.x + (x_103.y / 2));
+    int2 const x_81 = x_81_1;
+    {
+      x_84 = (x_83 + 1);
+      x_80_phi = x_81;
+      x_83_phi = x_84;
+    }
+  }
+  int const x_108 = x_80.x;
+  x_114_phi = x_80;
+  if ((x_108 < 0)) {
+    x_113 = x_80;
+    x_113.x = -(x_108);
+    x_114_phi = x_113;
+  }
+  int2 const x_114 = x_114_phi;
+  x_116_phi = x_114;
+  while (true) {
+    int2 x_117 = 0;
+    int2 const x_116 = x_116_phi;
+    x_119 = x_116.x;
+    if ((x_119 > 15)) {
+    } else {
+      break;
+    }
+    {
+      x_117 = x_116;
+      x_117.x = as_type<int>((x_119 - as_type<int>(16)));
+      x_116_phi = x_117;
+    }
+  }
+  tint_array_wrapper const tint_symbol_4 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
+  indexable = tint_symbol_4;
+  tint_array_wrapper const x_124 = indexable;
+  tint_array_wrapper const tint_symbol_5 = {.arr={float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)}};
+  indexable = tint_symbol_5;
+  indexable = x_124;
+  float4 const x_125 = indexable.arr[x_119];
+  *(tint_symbol_8) = x_125;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_9 = 0.0f;
+  thread float4 tint_symbol_10 = 0.0f;
+  tint_symbol_9 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_9), &(tint_symbol_10));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_10};
+  tint_symbol_2 const tint_symbol_6 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..af0b70a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/1.wgsl.expected.spvasm
@@ -0,0 +1,297 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 188
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %indexable "indexable"
+               OpName %x_80 "x_80"
+               OpName %x_113 "x_113"
+               OpName %x_119 "x_119"
+               OpName %x_80_phi "x_80_phi"
+               OpName %x_83_phi "x_83_phi"
+               OpName %x_114_phi "x_114_phi"
+               OpName %x_116_phi "x_116_phi"
+               OpName %x_94 "x_94"
+               OpName %x_102 "x_102"
+               OpName %x_84 "x_84"
+               OpName %x_95_phi "x_95_phi"
+               OpName %x_103_phi "x_103_phi"
+               OpName %x_81_1 "x_81_1"
+               OpName %x_117 "x_117"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v4float_uint_16 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+         %24 = OpConstantNull %_arr_v4float_uint_16
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %29 = OpConstantNull %v2int
+%_ptr_Function_int = OpTypePointer Function %int
+         %33 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_8 = OpConstant %float 8
+      %int_5 = OpConstant %int 5
+     %int_10 = OpConstant %int 10
+      %int_8 = OpConstant %int 8
+      %int_0 = OpConstant %int 0
+    %int_100 = OpConstant %int 100
+       %bool = OpTypeBool
+     %uint_1 = OpConstant %uint 1
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+     %int_15 = OpConstant %int 15
+     %int_16 = OpConstant %int 16
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+        %151 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+  %float_0_5 = OpConstant %float 0.5
+        %153 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+        %154 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+        %155 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+        %156 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+        %157 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+        %158 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+        %159 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+        %160 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %161 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+        %162 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+        %163 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+        %164 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+        %165 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+        %166 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+        %167 = OpConstantComposite %_arr_v4float_uint_16 %151 %153 %154 %155 %156 %157 %158 %159 %151 %160 %161 %162 %163 %164 %165 %166
+        %169 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+        %170 = OpConstantComposite %_arr_v4float_uint_16 %169 %169 %169 %169 %169 %169 %169 %169 %169 %169 %169 %169 %169 %169 %169 %169
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+   %main_out = OpTypeStruct %v4float
+        %175 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_16 Function %24
+       %x_80 = OpVariable %_ptr_Function_v2int Function %29
+      %x_113 = OpVariable %_ptr_Function_v2int Function %29
+      %x_119 = OpVariable %_ptr_Function_int Function %33
+   %x_80_phi = OpVariable %_ptr_Function_v2int Function %29
+   %x_83_phi = OpVariable %_ptr_Function_int Function %33
+  %x_114_phi = OpVariable %_ptr_Function_v2int Function %29
+  %x_116_phi = OpVariable %_ptr_Function_v2int Function %29
+       %x_94 = OpVariable %_ptr_Function_v2int Function %29
+      %x_102 = OpVariable %_ptr_Function_v2int Function %29
+       %x_84 = OpVariable %_ptr_Function_int Function %33
+   %x_95_phi = OpVariable %_ptr_Function_v2int Function %29
+  %x_103_phi = OpVariable %_ptr_Function_v2int Function %29
+     %x_81_1 = OpVariable %_ptr_Function_v2int Function %29
+      %x_117 = OpVariable %_ptr_Function_v2int Function %29
+         %38 = OpLoad %v4float %gl_FragCoord
+         %41 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %42 = OpLoad %v2float %41
+         %43 = OpCompositeExtract %float %38 0
+         %44 = OpCompositeExtract %float %38 1
+         %45 = OpCompositeConstruct %v2float %43 %44
+         %46 = OpFDiv %v2float %45 %42
+         %48 = OpCompositeExtract %float %46 0
+         %50 = OpFMul %float %48 %float_8
+         %47 = OpConvertFToS %int %50
+         %52 = OpCompositeExtract %float %46 1
+         %53 = OpFMul %float %52 %float_8
+         %51 = OpConvertFToS %int %53
+         %55 = OpBitwiseAnd %int %47 %int_5
+         %57 = OpBitwiseAnd %int %51 %int_10
+         %58 = OpBitwiseOr %int %55 %57
+         %60 = OpIMul %int %58 %int_8
+         %61 = OpBitwiseAnd %int %51 %int_5
+         %62 = OpBitwiseAnd %int %47 %int_10
+         %63 = OpBitwiseOr %int %61 %62
+         %64 = OpIAdd %int %60 %63
+         %66 = OpCompositeConstruct %v2int %64 %int_0
+               OpStore %x_80_phi %66
+               OpStore %x_83_phi %int_0
+               OpBranch %67
+         %67 = OpLabel
+               OpLoopMerge %68 %69 None
+               OpBranch %70
+         %70 = OpLabel
+         %76 = OpLoad %v2int %x_80_phi
+               OpStore %x_80 %76
+         %77 = OpLoad %int %x_83_phi
+         %79 = OpSLessThan %bool %77 %int_100
+               OpSelectionMerge %81 None
+               OpBranchConditional %79 %82 %83
+         %82 = OpLabel
+               OpBranch %81
+         %83 = OpLabel
+               OpBranch %68
+         %81 = OpLabel
+         %84 = OpLoad %v2int %x_80
+               OpStore %x_95_phi %84
+         %85 = OpAccessChain %_ptr_Function_int %x_80 %uint_0
+         %86 = OpLoad %int %85
+         %87 = OpSGreaterThan %bool %86 %int_0
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %88
+         %89 = OpLabel
+         %90 = OpLoad %v2int %x_80
+               OpStore %x_94 %90
+         %92 = OpAccessChain %_ptr_Function_int %x_94 %uint_1
+         %93 = OpAccessChain %_ptr_Function_int %x_80 %uint_1
+         %94 = OpLoad %int %93
+         %96 = OpISub %int %94 %int_1
+               OpStore %92 %96
+         %97 = OpLoad %v2int %x_94
+               OpStore %x_95_phi %97
+               OpBranch %88
+         %88 = OpLabel
+         %98 = OpLoad %v2int %x_95_phi
+               OpStore %x_103_phi %98
+         %99 = OpCompositeExtract %int %98 0
+        %100 = OpSLessThan %bool %99 %int_0
+               OpSelectionMerge %101 None
+               OpBranchConditional %100 %102 %101
+        %102 = OpLabel
+               OpStore %x_102 %98
+        %103 = OpAccessChain %_ptr_Function_int %x_102 %uint_1
+        %104 = OpCompositeExtract %int %98 1
+        %105 = OpIAdd %int %104 %int_1
+               OpStore %103 %105
+        %106 = OpLoad %v2int %x_102
+               OpStore %x_103_phi %106
+               OpBranch %101
+        %101 = OpLabel
+        %107 = OpLoad %v2int %x_103_phi
+               OpStore %x_81_1 %107
+        %109 = OpAccessChain %_ptr_Function_int %x_81_1 %uint_0
+        %110 = OpCompositeExtract %int %107 0
+        %111 = OpCompositeExtract %int %107 1
+        %113 = OpSDiv %int %111 %int_2
+        %114 = OpIAdd %int %110 %113
+               OpStore %109 %114
+        %115 = OpLoad %v2int %x_81_1
+               OpBranch %69
+         %69 = OpLabel
+        %116 = OpIAdd %int %77 %int_1
+               OpStore %x_84 %116
+               OpStore %x_80_phi %115
+        %117 = OpLoad %int %x_84
+               OpStore %x_83_phi %117
+               OpBranch %67
+         %68 = OpLabel
+        %118 = OpAccessChain %_ptr_Function_int %x_80 %uint_0
+        %119 = OpLoad %int %118
+        %120 = OpLoad %v2int %x_80
+               OpStore %x_114_phi %120
+        %121 = OpSLessThan %bool %119 %int_0
+               OpSelectionMerge %122 None
+               OpBranchConditional %121 %123 %122
+        %123 = OpLabel
+        %124 = OpLoad %v2int %x_80
+               OpStore %x_113 %124
+        %125 = OpAccessChain %_ptr_Function_int %x_113 %uint_0
+        %126 = OpSNegate %int %119
+               OpStore %125 %126
+        %127 = OpLoad %v2int %x_113
+               OpStore %x_114_phi %127
+               OpBranch %122
+        %122 = OpLabel
+        %128 = OpLoad %v2int %x_114_phi
+               OpStore %x_116_phi %128
+               OpBranch %129
+        %129 = OpLabel
+               OpLoopMerge %130 %131 None
+               OpBranch %132
+        %132 = OpLabel
+        %134 = OpLoad %v2int %x_116_phi
+        %135 = OpCompositeExtract %int %134 0
+               OpStore %x_119 %135
+        %136 = OpLoad %int %x_119
+        %138 = OpSGreaterThan %bool %136 %int_15
+               OpSelectionMerge %139 None
+               OpBranchConditional %138 %140 %141
+        %140 = OpLabel
+               OpBranch %139
+        %141 = OpLabel
+               OpBranch %130
+        %139 = OpLabel
+               OpBranch %131
+        %131 = OpLabel
+               OpStore %x_117 %134
+        %142 = OpAccessChain %_ptr_Function_int %x_117 %uint_0
+        %144 = OpLoad %int %x_119
+        %145 = OpCopyObject %int %int_16
+        %147 = OpISub %int %144 %145
+        %143 = OpCopyObject %int %147
+               OpStore %142 %143
+        %148 = OpLoad %v2int %x_117
+               OpStore %x_116_phi %148
+               OpBranch %129
+        %130 = OpLabel
+               OpStore %indexable %167
+        %168 = OpLoad %_arr_v4float_uint_16 %indexable
+               OpStore %indexable %170
+               OpStore %indexable %168
+        %171 = OpLoad %int %x_119
+        %173 = OpAccessChain %_ptr_Function_v4float %indexable %171
+        %174 = OpLoad %v4float %173
+               OpStore %x_GLF_color %174
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %175
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %179 = OpLabel
+        %180 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %180
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %182 = OpLabel
+        %183 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %183
+        %184 = OpFunctionCall %void %main_1
+        %186 = OpLoad %v4float %x_GLF_color
+        %187 = OpCompositeConstruct %main_out %186
+        %185 = OpFunctionCall %void %tint_symbol_3 %187
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..f0b6447
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/1.wgsl.expected.wgsl
@@ -0,0 +1,109 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var indexable : array<vec4<f32>, 16>;
+  var x_80 : vec2<i32>;
+  var x_113 : vec2<i32>;
+  var x_119 : i32;
+  var x_80_phi : vec2<i32>;
+  var x_83_phi : i32;
+  var x_114_phi : vec2<i32>;
+  var x_116_phi : vec2<i32>;
+  let x_58 : vec4<f32> = gl_FragCoord;
+  let x_61 : vec2<f32> = x_6.resolution;
+  let x_62 : vec2<f32> = (vec2<f32>(x_58.x, x_58.y) / x_61);
+  let x_65 : i32 = i32((x_62.x * 8.0));
+  let x_66 : ptr<function, array<vec4<f32>, 16>> = &(indexable);
+  let x_69 : i32 = i32((x_62.y * 8.0));
+  let x_78 : vec2<i32> = vec2<i32>(((((x_65 & 5) | (x_69 & 10)) * 8) + ((x_69 & 5) | (x_65 & 10))), 0);
+  x_80_phi = x_78;
+  x_83_phi = 0;
+  loop {
+    var x_94 : vec2<i32>;
+    var x_102 : vec2<i32>;
+    var x_84 : i32;
+    var x_95_phi : vec2<i32>;
+    var x_103_phi : vec2<i32>;
+    x_80 = x_80_phi;
+    let x_83 : i32 = x_83_phi;
+    if ((x_83 < 100)) {
+    } else {
+      break;
+    }
+    x_95_phi = x_80;
+    if ((x_80.x > 0)) {
+      x_94 = x_80;
+      x_94.y = (x_80.y - 1);
+      x_95_phi = x_94;
+    }
+    let x_95 : vec2<i32> = x_95_phi;
+    x_103_phi = x_95;
+    if ((x_95.x < 0)) {
+      x_102 = x_95;
+      x_102.y = (x_95.y + 1);
+      x_103_phi = x_102;
+    }
+    let x_103 : vec2<i32> = x_103_phi;
+    var x_81_1 : vec2<i32> = x_103;
+    x_81_1.x = (x_103.x + (x_103.y / 2));
+    let x_81 : vec2<i32> = x_81_1;
+
+    continuing {
+      x_84 = (x_83 + 1);
+      x_80_phi = x_81;
+      x_83_phi = x_84;
+    }
+  }
+  let x_108 : i32 = x_80.x;
+  x_114_phi = x_80;
+  if ((x_108 < 0)) {
+    x_113 = x_80;
+    x_113.x = -(x_108);
+    x_114_phi = x_113;
+  }
+  let x_114 : vec2<i32> = x_114_phi;
+  x_116_phi = x_114;
+  loop {
+    var x_117 : vec2<i32>;
+    let x_116 : vec2<i32> = x_116_phi;
+    x_119 = x_116.x;
+    if ((x_119 > 15)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_117 = x_116;
+      x_117.x = bitcast<i32>((x_119 - bitcast<i32>(16)));
+      x_116_phi = x_117;
+    }
+  }
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+  let x_124 : array<vec4<f32>, 16> = *(x_66);
+  *(x_66) = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
+  *(x_66) = x_124;
+  let x_125 : vec4<f32> = indexable[x_119];
+  x_GLF_color = x_125;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/2.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/2.spvasm
new file mode 100644
index 0000000..37d1093
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/2.spvasm
@@ -0,0 +1,164 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpName %indexable "indexable"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+       %uint = OpTypeInt 32 0
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_8 = OpConstant %float 8
+      %int_5 = OpConstant %int 5
+     %int_10 = OpConstant %int 10
+      %int_8 = OpConstant %int 8
+    %int_100 = OpConstant %int 100
+     %int_15 = OpConstant %int 15
+     %int_16 = OpConstant %int 16
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %35 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+  %float_0_5 = OpConstant %float 0.5
+         %37 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+         %38 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+         %39 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+         %40 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+         %41 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+         %42 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+         %43 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+         %44 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %45 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+         %46 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+         %47 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+         %48 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+         %49 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+         %50 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+         %51 = OpConstantComposite %_arr_v4float_uint_16 %35 %37 %38 %39 %40 %41 %42 %43 %35 %44 %45 %46 %47 %48 %49 %50
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+  %float_0_0 = OpConstant %float 0
+         %55 = OpConstantComposite %v4float %float_0_0 %float_0_0 %float_0_0 %float_0_0
+         %56 = OpConstantComposite %_arr_v4float_uint_16 %55 %55 %55 %55 %55 %55 %55 %55 %55 %55 %55 %55 %55 %55 %55 %55
+       %main = OpFunction %void None %9
+         %57 = OpLabel
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_16 Function
+         %58 = OpLoad %v4float %gl_FragCoord
+         %59 = OpVectorShuffle %v2float %58 %58 0 1
+         %60 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+         %61 = OpLoad %v2float %60
+         %62 = OpFDiv %v2float %59 %61
+         %63 = OpCompositeExtract %float %62 0
+         %64 = OpFMul %float %63 %float_8
+         %65 = OpConvertFToS %int %64
+         %66 = OpAccessChain %_ptr_Function__arr_v4float_uint_16 %indexable
+         %67 = OpCompositeExtract %float %62 1
+         %68 = OpFMul %float %67 %float_8
+         %69 = OpConvertFToS %int %68
+         %70 = OpBitwiseAnd %int %65 %int_5
+         %71 = OpBitwiseAnd %int %69 %int_10
+         %72 = OpBitwiseOr %int %70 %71
+         %73 = OpBitwiseAnd %int %69 %int_5
+         %74 = OpBitwiseAnd %int %65 %int_10
+         %75 = OpBitwiseOr %int %73 %74
+         %76 = OpIMul %int %72 %int_8
+         %77 = OpIAdd %int %76 %75
+         %78 = OpCompositeConstruct %v2int %77 %int_0
+               OpBranch %79
+         %79 = OpLabel
+         %80 = OpPhi %v2int %78 %57 %81 %82
+         %83 = OpPhi %int %int_0 %57 %84 %82
+         %85 = OpSLessThan %bool %83 %int_100
+               OpLoopMerge %86 %82 None
+               OpBranchConditional %85 %87 %86
+         %87 = OpLabel
+         %88 = OpCompositeExtract %int %80 0
+         %89 = OpSGreaterThan %bool %88 %int_0
+               OpSelectionMerge %90 None
+               OpBranchConditional %89 %91 %90
+         %91 = OpLabel
+         %92 = OpCompositeExtract %int %80 1
+         %93 = OpISub %int %92 %int_1
+         %94 = OpCompositeInsert %v2int %93 %80 1
+               OpBranch %90
+         %90 = OpLabel
+         %95 = OpPhi %v2int %80 %87 %94 %91
+         %96 = OpCompositeExtract %int %95 0
+         %97 = OpSLessThan %bool %96 %int_0
+               OpSelectionMerge %98 None
+               OpBranchConditional %97 %99 %98
+         %99 = OpLabel
+        %100 = OpCompositeExtract %int %95 1
+        %101 = OpIAdd %int %100 %int_1
+        %102 = OpCompositeInsert %v2int %101 %95 1
+               OpBranch %98
+         %98 = OpLabel
+        %103 = OpPhi %v2int %95 %90 %102 %99
+        %104 = OpCompositeExtract %int %103 1
+        %105 = OpSDiv %int %104 %int_2
+        %106 = OpCompositeExtract %int %103 0
+        %107 = OpIAdd %int %106 %105
+         %81 = OpCompositeInsert %v2int %107 %103 0
+               OpBranch %82
+         %82 = OpLabel
+         %84 = OpIAdd %int %83 %int_1
+               OpBranch %79
+         %86 = OpLabel
+        %108 = OpCompositeExtract %int %80 0
+        %109 = OpSLessThan %bool %108 %int_0
+               OpSelectionMerge %110 None
+               OpBranchConditional %109 %111 %110
+        %111 = OpLabel
+        %112 = OpSNegate %int %108
+        %113 = OpCompositeInsert %v2int %112 %80 0
+               OpBranch %110
+        %110 = OpLabel
+        %114 = OpPhi %v2int %80 %86 %113 %111
+               OpBranch %115
+        %115 = OpLabel
+        %116 = OpPhi %v2int %114 %110 %117 %118
+        %119 = OpCompositeExtract %int %116 0
+        %120 = OpSGreaterThan %bool %119 %int_15
+               OpLoopMerge %121 %118 None
+               OpBranchConditional %120 %118 %121
+        %118 = OpLabel
+        %122 = OpISub %int %119 %int_16
+        %117 = OpCompositeInsert %v2int %122 %116 0
+               OpBranch %115
+        %121 = OpLabel
+               OpStore %indexable %51
+        %123 = OpAccessChain %_ptr_Function_v4float %indexable %119
+        %124 = OpLoad %v4float %123
+               OpStore %_GLF_color %124
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/2.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/2.spvasm.expected.hlsl
new file mode 100644
index 0000000..d1b1da5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/2.spvasm.expected.hlsl
@@ -0,0 +1,105 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 indexable[16] = (float4[16])0;
+  int2 x_80 = int2(0, 0);
+  int2 x_113 = int2(0, 0);
+  int x_119 = 0;
+  int2 x_80_phi = int2(0, 0);
+  int x_83_phi = 0;
+  int2 x_114_phi = int2(0, 0);
+  int2 x_116_phi = int2(0, 0);
+  const float4 x_58 = gl_FragCoord;
+  const float2 x_61 = asfloat(x_6[0].xy);
+  const float2 x_62 = (float2(x_58.x, x_58.y) / x_61);
+  const int x_65 = int((x_62.x * 8.0f));
+  const int x_69 = int((x_62.y * 8.0f));
+  const int2 x_78 = int2(((((x_65 & 5) | (x_69 & 10)) * 8) + ((x_69 & 5) | (x_65 & 10))), 0);
+  x_80_phi = x_78;
+  x_83_phi = 0;
+  while (true) {
+    int2 x_94 = int2(0, 0);
+    int2 x_102 = int2(0, 0);
+    int x_84 = 0;
+    int2 x_95_phi = int2(0, 0);
+    int2 x_103_phi = int2(0, 0);
+    x_80 = x_80_phi;
+    const int x_83 = x_83_phi;
+    if ((x_83 < 100)) {
+    } else {
+      break;
+    }
+    x_95_phi = x_80;
+    if ((x_80.x > 0)) {
+      x_94 = x_80;
+      x_94.y = (x_80.y - 1);
+      x_95_phi = x_94;
+    }
+    const int2 x_95 = x_95_phi;
+    x_103_phi = x_95;
+    if ((x_95.x < 0)) {
+      x_102 = x_95;
+      x_102.y = (x_95.y + 1);
+      x_103_phi = x_102;
+    }
+    const int2 x_103 = x_103_phi;
+    int2 x_81_1 = x_103;
+    x_81_1.x = (x_103.x + (x_103.y / 2));
+    const int2 x_81 = x_81_1;
+    {
+      x_84 = (x_83 + 1);
+      x_80_phi = x_81;
+      x_83_phi = x_84;
+    }
+  }
+  const int x_108 = x_80.x;
+  x_114_phi = x_80;
+  if ((x_108 < 0)) {
+    x_113 = x_80;
+    x_113.x = -(x_108);
+    x_114_phi = x_113;
+  }
+  x_116_phi = x_114_phi;
+  while (true) {
+    int2 x_117 = int2(0, 0);
+    const int2 x_116 = x_116_phi;
+    x_119 = x_116.x;
+    if ((x_119 > 15)) {
+    } else {
+      break;
+    }
+    {
+      x_117 = x_116;
+      x_117.x = asint((x_119 - asint(16)));
+      x_116_phi = x_117;
+    }
+  }
+  const float4 tint_symbol_5[16] = {float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)};
+  indexable = tint_symbol_5;
+  const float4 x_124 = indexable[x_119];
+  x_GLF_color = x_124;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/2.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/2.spvasm.expected.msl
new file mode 100644
index 0000000..14e3c2f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/2.spvasm.expected.msl
@@ -0,0 +1,108 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  float4 arr[16];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  tint_array_wrapper indexable = {};
+  int2 x_80 = 0;
+  int2 x_113 = 0;
+  int x_119 = 0;
+  int2 x_80_phi = 0;
+  int x_83_phi = 0;
+  int2 x_114_phi = 0;
+  int2 x_116_phi = 0;
+  float4 const x_58 = *(tint_symbol_6);
+  float2 const x_61 = x_6.resolution;
+  float2 const x_62 = (float2(x_58.x, x_58.y) / x_61);
+  int const x_65 = int((x_62.x * 8.0f));
+  int const x_69 = int((x_62.y * 8.0f));
+  int2 const x_78 = int2(((((x_65 & 5) | (x_69 & 10)) * 8) + ((x_69 & 5) | (x_65 & 10))), 0);
+  x_80_phi = x_78;
+  x_83_phi = 0;
+  while (true) {
+    int2 x_94 = 0;
+    int2 x_102 = 0;
+    int x_84 = 0;
+    int2 x_95_phi = 0;
+    int2 x_103_phi = 0;
+    x_80 = x_80_phi;
+    int const x_83 = x_83_phi;
+    if ((x_83 < 100)) {
+    } else {
+      break;
+    }
+    x_95_phi = x_80;
+    if ((x_80.x > 0)) {
+      x_94 = x_80;
+      x_94.y = (x_80.y - 1);
+      x_95_phi = x_94;
+    }
+    int2 const x_95 = x_95_phi;
+    x_103_phi = x_95;
+    if ((x_95.x < 0)) {
+      x_102 = x_95;
+      x_102.y = (x_95.y + 1);
+      x_103_phi = x_102;
+    }
+    int2 const x_103 = x_103_phi;
+    int2 x_81_1 = x_103;
+    x_81_1.x = (x_103.x + (x_103.y / 2));
+    int2 const x_81 = x_81_1;
+    {
+      x_84 = (x_83 + 1);
+      x_80_phi = x_81;
+      x_83_phi = x_84;
+    }
+  }
+  int const x_108 = x_80.x;
+  x_114_phi = x_80;
+  if ((x_108 < 0)) {
+    x_113 = x_80;
+    x_113.x = -(x_108);
+    x_114_phi = x_113;
+  }
+  int2 const x_114 = x_114_phi;
+  x_116_phi = x_114;
+  while (true) {
+    int2 x_117 = 0;
+    int2 const x_116 = x_116_phi;
+    x_119 = x_116.x;
+    if ((x_119 > 15)) {
+    } else {
+      break;
+    }
+    {
+      x_117 = x_116;
+      x_117.x = as_type<int>((x_119 - as_type<int>(16)));
+      x_116_phi = x_117;
+    }
+  }
+  tint_array_wrapper const tint_symbol_4 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
+  indexable = tint_symbol_4;
+  float4 const x_124 = indexable.arr[x_119];
+  *(tint_symbol_7) = x_124;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/2.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/2.spvasm.expected.spvasm
new file mode 100644
index 0000000..657d9eb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/2.spvasm.expected.spvasm
@@ -0,0 +1,292 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 185
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %indexable "indexable"
+               OpName %x_80 "x_80"
+               OpName %x_113 "x_113"
+               OpName %x_119 "x_119"
+               OpName %x_80_phi "x_80_phi"
+               OpName %x_83_phi "x_83_phi"
+               OpName %x_114_phi "x_114_phi"
+               OpName %x_116_phi "x_116_phi"
+               OpName %x_94 "x_94"
+               OpName %x_102 "x_102"
+               OpName %x_84 "x_84"
+               OpName %x_95_phi "x_95_phi"
+               OpName %x_103_phi "x_103_phi"
+               OpName %x_81_1 "x_81_1"
+               OpName %x_117 "x_117"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v4float_uint_16 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+         %24 = OpConstantNull %_arr_v4float_uint_16
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %29 = OpConstantNull %v2int
+%_ptr_Function_int = OpTypePointer Function %int
+         %33 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_8 = OpConstant %float 8
+      %int_5 = OpConstant %int 5
+     %int_10 = OpConstant %int 10
+      %int_8 = OpConstant %int 8
+      %int_0 = OpConstant %int 0
+    %int_100 = OpConstant %int 100
+       %bool = OpTypeBool
+     %uint_1 = OpConstant %uint 1
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+     %int_15 = OpConstant %int 15
+     %int_16 = OpConstant %int 16
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+        %151 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+  %float_0_5 = OpConstant %float 0.5
+        %153 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+        %154 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+        %155 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+        %156 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+        %157 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+        %158 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+        %159 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+        %160 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %161 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+        %162 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+        %163 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+        %164 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+        %165 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+        %166 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+        %167 = OpConstantComposite %_arr_v4float_uint_16 %151 %153 %154 %155 %156 %157 %158 %159 %151 %160 %161 %162 %163 %164 %165 %166
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+   %main_out = OpTypeStruct %v4float
+        %172 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_16 Function %24
+       %x_80 = OpVariable %_ptr_Function_v2int Function %29
+      %x_113 = OpVariable %_ptr_Function_v2int Function %29
+      %x_119 = OpVariable %_ptr_Function_int Function %33
+   %x_80_phi = OpVariable %_ptr_Function_v2int Function %29
+   %x_83_phi = OpVariable %_ptr_Function_int Function %33
+  %x_114_phi = OpVariable %_ptr_Function_v2int Function %29
+  %x_116_phi = OpVariable %_ptr_Function_v2int Function %29
+       %x_94 = OpVariable %_ptr_Function_v2int Function %29
+      %x_102 = OpVariable %_ptr_Function_v2int Function %29
+       %x_84 = OpVariable %_ptr_Function_int Function %33
+   %x_95_phi = OpVariable %_ptr_Function_v2int Function %29
+  %x_103_phi = OpVariable %_ptr_Function_v2int Function %29
+     %x_81_1 = OpVariable %_ptr_Function_v2int Function %29
+      %x_117 = OpVariable %_ptr_Function_v2int Function %29
+         %38 = OpLoad %v4float %gl_FragCoord
+         %41 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %42 = OpLoad %v2float %41
+         %43 = OpCompositeExtract %float %38 0
+         %44 = OpCompositeExtract %float %38 1
+         %45 = OpCompositeConstruct %v2float %43 %44
+         %46 = OpFDiv %v2float %45 %42
+         %48 = OpCompositeExtract %float %46 0
+         %50 = OpFMul %float %48 %float_8
+         %47 = OpConvertFToS %int %50
+         %52 = OpCompositeExtract %float %46 1
+         %53 = OpFMul %float %52 %float_8
+         %51 = OpConvertFToS %int %53
+         %55 = OpBitwiseAnd %int %47 %int_5
+         %57 = OpBitwiseAnd %int %51 %int_10
+         %58 = OpBitwiseOr %int %55 %57
+         %60 = OpIMul %int %58 %int_8
+         %61 = OpBitwiseAnd %int %51 %int_5
+         %62 = OpBitwiseAnd %int %47 %int_10
+         %63 = OpBitwiseOr %int %61 %62
+         %64 = OpIAdd %int %60 %63
+         %66 = OpCompositeConstruct %v2int %64 %int_0
+               OpStore %x_80_phi %66
+               OpStore %x_83_phi %int_0
+               OpBranch %67
+         %67 = OpLabel
+               OpLoopMerge %68 %69 None
+               OpBranch %70
+         %70 = OpLabel
+         %76 = OpLoad %v2int %x_80_phi
+               OpStore %x_80 %76
+         %77 = OpLoad %int %x_83_phi
+         %79 = OpSLessThan %bool %77 %int_100
+               OpSelectionMerge %81 None
+               OpBranchConditional %79 %82 %83
+         %82 = OpLabel
+               OpBranch %81
+         %83 = OpLabel
+               OpBranch %68
+         %81 = OpLabel
+         %84 = OpLoad %v2int %x_80
+               OpStore %x_95_phi %84
+         %85 = OpAccessChain %_ptr_Function_int %x_80 %uint_0
+         %86 = OpLoad %int %85
+         %87 = OpSGreaterThan %bool %86 %int_0
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %88
+         %89 = OpLabel
+         %90 = OpLoad %v2int %x_80
+               OpStore %x_94 %90
+         %92 = OpAccessChain %_ptr_Function_int %x_94 %uint_1
+         %93 = OpAccessChain %_ptr_Function_int %x_80 %uint_1
+         %94 = OpLoad %int %93
+         %96 = OpISub %int %94 %int_1
+               OpStore %92 %96
+         %97 = OpLoad %v2int %x_94
+               OpStore %x_95_phi %97
+               OpBranch %88
+         %88 = OpLabel
+         %98 = OpLoad %v2int %x_95_phi
+               OpStore %x_103_phi %98
+         %99 = OpCompositeExtract %int %98 0
+        %100 = OpSLessThan %bool %99 %int_0
+               OpSelectionMerge %101 None
+               OpBranchConditional %100 %102 %101
+        %102 = OpLabel
+               OpStore %x_102 %98
+        %103 = OpAccessChain %_ptr_Function_int %x_102 %uint_1
+        %104 = OpCompositeExtract %int %98 1
+        %105 = OpIAdd %int %104 %int_1
+               OpStore %103 %105
+        %106 = OpLoad %v2int %x_102
+               OpStore %x_103_phi %106
+               OpBranch %101
+        %101 = OpLabel
+        %107 = OpLoad %v2int %x_103_phi
+               OpStore %x_81_1 %107
+        %109 = OpAccessChain %_ptr_Function_int %x_81_1 %uint_0
+        %110 = OpCompositeExtract %int %107 0
+        %111 = OpCompositeExtract %int %107 1
+        %113 = OpSDiv %int %111 %int_2
+        %114 = OpIAdd %int %110 %113
+               OpStore %109 %114
+        %115 = OpLoad %v2int %x_81_1
+               OpBranch %69
+         %69 = OpLabel
+        %116 = OpIAdd %int %77 %int_1
+               OpStore %x_84 %116
+               OpStore %x_80_phi %115
+        %117 = OpLoad %int %x_84
+               OpStore %x_83_phi %117
+               OpBranch %67
+         %68 = OpLabel
+        %118 = OpAccessChain %_ptr_Function_int %x_80 %uint_0
+        %119 = OpLoad %int %118
+        %120 = OpLoad %v2int %x_80
+               OpStore %x_114_phi %120
+        %121 = OpSLessThan %bool %119 %int_0
+               OpSelectionMerge %122 None
+               OpBranchConditional %121 %123 %122
+        %123 = OpLabel
+        %124 = OpLoad %v2int %x_80
+               OpStore %x_113 %124
+        %125 = OpAccessChain %_ptr_Function_int %x_113 %uint_0
+        %126 = OpSNegate %int %119
+               OpStore %125 %126
+        %127 = OpLoad %v2int %x_113
+               OpStore %x_114_phi %127
+               OpBranch %122
+        %122 = OpLabel
+        %128 = OpLoad %v2int %x_114_phi
+               OpStore %x_116_phi %128
+               OpBranch %129
+        %129 = OpLabel
+               OpLoopMerge %130 %131 None
+               OpBranch %132
+        %132 = OpLabel
+        %134 = OpLoad %v2int %x_116_phi
+        %135 = OpCompositeExtract %int %134 0
+               OpStore %x_119 %135
+        %136 = OpLoad %int %x_119
+        %138 = OpSGreaterThan %bool %136 %int_15
+               OpSelectionMerge %139 None
+               OpBranchConditional %138 %140 %141
+        %140 = OpLabel
+               OpBranch %139
+        %141 = OpLabel
+               OpBranch %130
+        %139 = OpLabel
+               OpBranch %131
+        %131 = OpLabel
+               OpStore %x_117 %134
+        %142 = OpAccessChain %_ptr_Function_int %x_117 %uint_0
+        %144 = OpLoad %int %x_119
+        %145 = OpCopyObject %int %int_16
+        %147 = OpISub %int %144 %145
+        %143 = OpCopyObject %int %147
+               OpStore %142 %143
+        %148 = OpLoad %v2int %x_117
+               OpStore %x_116_phi %148
+               OpBranch %129
+        %130 = OpLabel
+               OpStore %indexable %167
+        %168 = OpLoad %int %x_119
+        %170 = OpAccessChain %_ptr_Function_v4float %indexable %168
+        %171 = OpLoad %v4float %170
+               OpStore %x_GLF_color %171
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %172
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %176 = OpLabel
+        %177 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %177
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %179 = OpLabel
+        %180 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %180
+        %181 = OpFunctionCall %void %main_1
+        %183 = OpLoad %v4float %x_GLF_color
+        %184 = OpCompositeConstruct %main_out %183
+        %182 = OpFunctionCall %void %tint_symbol_3 %184
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/2.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/2.spvasm.expected.wgsl
new file mode 100644
index 0000000..55f9a36
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/2.spvasm.expected.wgsl
@@ -0,0 +1,106 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var indexable : array<vec4<f32>, 16>;
+  var x_80 : vec2<i32>;
+  var x_113 : vec2<i32>;
+  var x_119 : i32;
+  var x_80_phi : vec2<i32>;
+  var x_83_phi : i32;
+  var x_114_phi : vec2<i32>;
+  var x_116_phi : vec2<i32>;
+  let x_58 : vec4<f32> = gl_FragCoord;
+  let x_61 : vec2<f32> = x_6.resolution;
+  let x_62 : vec2<f32> = (vec2<f32>(x_58.x, x_58.y) / x_61);
+  let x_65 : i32 = i32((x_62.x * 8.0));
+  let x_66 : ptr<function, array<vec4<f32>, 16>> = &(indexable);
+  let x_69 : i32 = i32((x_62.y * 8.0));
+  let x_78 : vec2<i32> = vec2<i32>(((((x_65 & 5) | (x_69 & 10)) * 8) + ((x_69 & 5) | (x_65 & 10))), 0);
+  x_80_phi = x_78;
+  x_83_phi = 0;
+  loop {
+    var x_94 : vec2<i32>;
+    var x_102 : vec2<i32>;
+    var x_84 : i32;
+    var x_95_phi : vec2<i32>;
+    var x_103_phi : vec2<i32>;
+    x_80 = x_80_phi;
+    let x_83 : i32 = x_83_phi;
+    if ((x_83 < 100)) {
+    } else {
+      break;
+    }
+    x_95_phi = x_80;
+    if ((x_80.x > 0)) {
+      x_94 = x_80;
+      x_94.y = (x_80.y - 1);
+      x_95_phi = x_94;
+    }
+    let x_95 : vec2<i32> = x_95_phi;
+    x_103_phi = x_95;
+    if ((x_95.x < 0)) {
+      x_102 = x_95;
+      x_102.y = (x_95.y + 1);
+      x_103_phi = x_102;
+    }
+    let x_103 : vec2<i32> = x_103_phi;
+    var x_81_1 : vec2<i32> = x_103;
+    x_81_1.x = (x_103.x + (x_103.y / 2));
+    let x_81 : vec2<i32> = x_81_1;
+
+    continuing {
+      x_84 = (x_83 + 1);
+      x_80_phi = x_81;
+      x_83_phi = x_84;
+    }
+  }
+  let x_108 : i32 = x_80.x;
+  x_114_phi = x_80;
+  if ((x_108 < 0)) {
+    x_113 = x_80;
+    x_113.x = -(x_108);
+    x_114_phi = x_113;
+  }
+  let x_114 : vec2<i32> = x_114_phi;
+  x_116_phi = x_114;
+  loop {
+    var x_117 : vec2<i32>;
+    let x_116 : vec2<i32> = x_116_phi;
+    x_119 = x_116.x;
+    if ((x_119 > 15)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_117 = x_116;
+      x_117.x = bitcast<i32>((x_119 - bitcast<i32>(16)));
+      x_116_phi = x_117;
+    }
+  }
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+  let x_124 : vec4<f32> = indexable[x_119];
+  x_GLF_color = x_124;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/2.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/2.wgsl
new file mode 100644
index 0000000..55f9a36
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/2.wgsl
@@ -0,0 +1,106 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var indexable : array<vec4<f32>, 16>;
+  var x_80 : vec2<i32>;
+  var x_113 : vec2<i32>;
+  var x_119 : i32;
+  var x_80_phi : vec2<i32>;
+  var x_83_phi : i32;
+  var x_114_phi : vec2<i32>;
+  var x_116_phi : vec2<i32>;
+  let x_58 : vec4<f32> = gl_FragCoord;
+  let x_61 : vec2<f32> = x_6.resolution;
+  let x_62 : vec2<f32> = (vec2<f32>(x_58.x, x_58.y) / x_61);
+  let x_65 : i32 = i32((x_62.x * 8.0));
+  let x_66 : ptr<function, array<vec4<f32>, 16>> = &(indexable);
+  let x_69 : i32 = i32((x_62.y * 8.0));
+  let x_78 : vec2<i32> = vec2<i32>(((((x_65 & 5) | (x_69 & 10)) * 8) + ((x_69 & 5) | (x_65 & 10))), 0);
+  x_80_phi = x_78;
+  x_83_phi = 0;
+  loop {
+    var x_94 : vec2<i32>;
+    var x_102 : vec2<i32>;
+    var x_84 : i32;
+    var x_95_phi : vec2<i32>;
+    var x_103_phi : vec2<i32>;
+    x_80 = x_80_phi;
+    let x_83 : i32 = x_83_phi;
+    if ((x_83 < 100)) {
+    } else {
+      break;
+    }
+    x_95_phi = x_80;
+    if ((x_80.x > 0)) {
+      x_94 = x_80;
+      x_94.y = (x_80.y - 1);
+      x_95_phi = x_94;
+    }
+    let x_95 : vec2<i32> = x_95_phi;
+    x_103_phi = x_95;
+    if ((x_95.x < 0)) {
+      x_102 = x_95;
+      x_102.y = (x_95.y + 1);
+      x_103_phi = x_102;
+    }
+    let x_103 : vec2<i32> = x_103_phi;
+    var x_81_1 : vec2<i32> = x_103;
+    x_81_1.x = (x_103.x + (x_103.y / 2));
+    let x_81 : vec2<i32> = x_81_1;
+
+    continuing {
+      x_84 = (x_83 + 1);
+      x_80_phi = x_81;
+      x_83_phi = x_84;
+    }
+  }
+  let x_108 : i32 = x_80.x;
+  x_114_phi = x_80;
+  if ((x_108 < 0)) {
+    x_113 = x_80;
+    x_113.x = -(x_108);
+    x_114_phi = x_113;
+  }
+  let x_114 : vec2<i32> = x_114_phi;
+  x_116_phi = x_114;
+  loop {
+    var x_117 : vec2<i32>;
+    let x_116 : vec2<i32> = x_116_phi;
+    x_119 = x_116.x;
+    if ((x_119 > 15)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_117 = x_116;
+      x_117.x = bitcast<i32>((x_119 - bitcast<i32>(16)));
+      x_116_phi = x_117;
+    }
+  }
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+  let x_124 : vec4<f32> = indexable[x_119];
+  x_GLF_color = x_124;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/2.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/2.wgsl.expected.hlsl
new file mode 100644
index 0000000..d1b1da5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/2.wgsl.expected.hlsl
@@ -0,0 +1,105 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 indexable[16] = (float4[16])0;
+  int2 x_80 = int2(0, 0);
+  int2 x_113 = int2(0, 0);
+  int x_119 = 0;
+  int2 x_80_phi = int2(0, 0);
+  int x_83_phi = 0;
+  int2 x_114_phi = int2(0, 0);
+  int2 x_116_phi = int2(0, 0);
+  const float4 x_58 = gl_FragCoord;
+  const float2 x_61 = asfloat(x_6[0].xy);
+  const float2 x_62 = (float2(x_58.x, x_58.y) / x_61);
+  const int x_65 = int((x_62.x * 8.0f));
+  const int x_69 = int((x_62.y * 8.0f));
+  const int2 x_78 = int2(((((x_65 & 5) | (x_69 & 10)) * 8) + ((x_69 & 5) | (x_65 & 10))), 0);
+  x_80_phi = x_78;
+  x_83_phi = 0;
+  while (true) {
+    int2 x_94 = int2(0, 0);
+    int2 x_102 = int2(0, 0);
+    int x_84 = 0;
+    int2 x_95_phi = int2(0, 0);
+    int2 x_103_phi = int2(0, 0);
+    x_80 = x_80_phi;
+    const int x_83 = x_83_phi;
+    if ((x_83 < 100)) {
+    } else {
+      break;
+    }
+    x_95_phi = x_80;
+    if ((x_80.x > 0)) {
+      x_94 = x_80;
+      x_94.y = (x_80.y - 1);
+      x_95_phi = x_94;
+    }
+    const int2 x_95 = x_95_phi;
+    x_103_phi = x_95;
+    if ((x_95.x < 0)) {
+      x_102 = x_95;
+      x_102.y = (x_95.y + 1);
+      x_103_phi = x_102;
+    }
+    const int2 x_103 = x_103_phi;
+    int2 x_81_1 = x_103;
+    x_81_1.x = (x_103.x + (x_103.y / 2));
+    const int2 x_81 = x_81_1;
+    {
+      x_84 = (x_83 + 1);
+      x_80_phi = x_81;
+      x_83_phi = x_84;
+    }
+  }
+  const int x_108 = x_80.x;
+  x_114_phi = x_80;
+  if ((x_108 < 0)) {
+    x_113 = x_80;
+    x_113.x = -(x_108);
+    x_114_phi = x_113;
+  }
+  x_116_phi = x_114_phi;
+  while (true) {
+    int2 x_117 = int2(0, 0);
+    const int2 x_116 = x_116_phi;
+    x_119 = x_116.x;
+    if ((x_119 > 15)) {
+    } else {
+      break;
+    }
+    {
+      x_117 = x_116;
+      x_117.x = asint((x_119 - asint(16)));
+      x_116_phi = x_117;
+    }
+  }
+  const float4 tint_symbol_5[16] = {float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)};
+  indexable = tint_symbol_5;
+  const float4 x_124 = indexable[x_119];
+  x_GLF_color = x_124;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/2.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/2.wgsl.expected.msl
new file mode 100644
index 0000000..14e3c2f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/2.wgsl.expected.msl
@@ -0,0 +1,108 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  float4 arr[16];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  tint_array_wrapper indexable = {};
+  int2 x_80 = 0;
+  int2 x_113 = 0;
+  int x_119 = 0;
+  int2 x_80_phi = 0;
+  int x_83_phi = 0;
+  int2 x_114_phi = 0;
+  int2 x_116_phi = 0;
+  float4 const x_58 = *(tint_symbol_6);
+  float2 const x_61 = x_6.resolution;
+  float2 const x_62 = (float2(x_58.x, x_58.y) / x_61);
+  int const x_65 = int((x_62.x * 8.0f));
+  int const x_69 = int((x_62.y * 8.0f));
+  int2 const x_78 = int2(((((x_65 & 5) | (x_69 & 10)) * 8) + ((x_69 & 5) | (x_65 & 10))), 0);
+  x_80_phi = x_78;
+  x_83_phi = 0;
+  while (true) {
+    int2 x_94 = 0;
+    int2 x_102 = 0;
+    int x_84 = 0;
+    int2 x_95_phi = 0;
+    int2 x_103_phi = 0;
+    x_80 = x_80_phi;
+    int const x_83 = x_83_phi;
+    if ((x_83 < 100)) {
+    } else {
+      break;
+    }
+    x_95_phi = x_80;
+    if ((x_80.x > 0)) {
+      x_94 = x_80;
+      x_94.y = (x_80.y - 1);
+      x_95_phi = x_94;
+    }
+    int2 const x_95 = x_95_phi;
+    x_103_phi = x_95;
+    if ((x_95.x < 0)) {
+      x_102 = x_95;
+      x_102.y = (x_95.y + 1);
+      x_103_phi = x_102;
+    }
+    int2 const x_103 = x_103_phi;
+    int2 x_81_1 = x_103;
+    x_81_1.x = (x_103.x + (x_103.y / 2));
+    int2 const x_81 = x_81_1;
+    {
+      x_84 = (x_83 + 1);
+      x_80_phi = x_81;
+      x_83_phi = x_84;
+    }
+  }
+  int const x_108 = x_80.x;
+  x_114_phi = x_80;
+  if ((x_108 < 0)) {
+    x_113 = x_80;
+    x_113.x = -(x_108);
+    x_114_phi = x_113;
+  }
+  int2 const x_114 = x_114_phi;
+  x_116_phi = x_114;
+  while (true) {
+    int2 x_117 = 0;
+    int2 const x_116 = x_116_phi;
+    x_119 = x_116.x;
+    if ((x_119 > 15)) {
+    } else {
+      break;
+    }
+    {
+      x_117 = x_116;
+      x_117.x = as_type<int>((x_119 - as_type<int>(16)));
+      x_116_phi = x_117;
+    }
+  }
+  tint_array_wrapper const tint_symbol_4 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
+  indexable = tint_symbol_4;
+  float4 const x_124 = indexable.arr[x_119];
+  *(tint_symbol_7) = x_124;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/2.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/2.wgsl.expected.spvasm
new file mode 100644
index 0000000..657d9eb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/2.wgsl.expected.spvasm
@@ -0,0 +1,292 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 185
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %indexable "indexable"
+               OpName %x_80 "x_80"
+               OpName %x_113 "x_113"
+               OpName %x_119 "x_119"
+               OpName %x_80_phi "x_80_phi"
+               OpName %x_83_phi "x_83_phi"
+               OpName %x_114_phi "x_114_phi"
+               OpName %x_116_phi "x_116_phi"
+               OpName %x_94 "x_94"
+               OpName %x_102 "x_102"
+               OpName %x_84 "x_84"
+               OpName %x_95_phi "x_95_phi"
+               OpName %x_103_phi "x_103_phi"
+               OpName %x_81_1 "x_81_1"
+               OpName %x_117 "x_117"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v4float_uint_16 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+         %24 = OpConstantNull %_arr_v4float_uint_16
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %29 = OpConstantNull %v2int
+%_ptr_Function_int = OpTypePointer Function %int
+         %33 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_8 = OpConstant %float 8
+      %int_5 = OpConstant %int 5
+     %int_10 = OpConstant %int 10
+      %int_8 = OpConstant %int 8
+      %int_0 = OpConstant %int 0
+    %int_100 = OpConstant %int 100
+       %bool = OpTypeBool
+     %uint_1 = OpConstant %uint 1
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+     %int_15 = OpConstant %int 15
+     %int_16 = OpConstant %int 16
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+        %151 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+  %float_0_5 = OpConstant %float 0.5
+        %153 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+        %154 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+        %155 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+        %156 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+        %157 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+        %158 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+        %159 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+        %160 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %161 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+        %162 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+        %163 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+        %164 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+        %165 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+        %166 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+        %167 = OpConstantComposite %_arr_v4float_uint_16 %151 %153 %154 %155 %156 %157 %158 %159 %151 %160 %161 %162 %163 %164 %165 %166
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+   %main_out = OpTypeStruct %v4float
+        %172 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_16 Function %24
+       %x_80 = OpVariable %_ptr_Function_v2int Function %29
+      %x_113 = OpVariable %_ptr_Function_v2int Function %29
+      %x_119 = OpVariable %_ptr_Function_int Function %33
+   %x_80_phi = OpVariable %_ptr_Function_v2int Function %29
+   %x_83_phi = OpVariable %_ptr_Function_int Function %33
+  %x_114_phi = OpVariable %_ptr_Function_v2int Function %29
+  %x_116_phi = OpVariable %_ptr_Function_v2int Function %29
+       %x_94 = OpVariable %_ptr_Function_v2int Function %29
+      %x_102 = OpVariable %_ptr_Function_v2int Function %29
+       %x_84 = OpVariable %_ptr_Function_int Function %33
+   %x_95_phi = OpVariable %_ptr_Function_v2int Function %29
+  %x_103_phi = OpVariable %_ptr_Function_v2int Function %29
+     %x_81_1 = OpVariable %_ptr_Function_v2int Function %29
+      %x_117 = OpVariable %_ptr_Function_v2int Function %29
+         %38 = OpLoad %v4float %gl_FragCoord
+         %41 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %42 = OpLoad %v2float %41
+         %43 = OpCompositeExtract %float %38 0
+         %44 = OpCompositeExtract %float %38 1
+         %45 = OpCompositeConstruct %v2float %43 %44
+         %46 = OpFDiv %v2float %45 %42
+         %48 = OpCompositeExtract %float %46 0
+         %50 = OpFMul %float %48 %float_8
+         %47 = OpConvertFToS %int %50
+         %52 = OpCompositeExtract %float %46 1
+         %53 = OpFMul %float %52 %float_8
+         %51 = OpConvertFToS %int %53
+         %55 = OpBitwiseAnd %int %47 %int_5
+         %57 = OpBitwiseAnd %int %51 %int_10
+         %58 = OpBitwiseOr %int %55 %57
+         %60 = OpIMul %int %58 %int_8
+         %61 = OpBitwiseAnd %int %51 %int_5
+         %62 = OpBitwiseAnd %int %47 %int_10
+         %63 = OpBitwiseOr %int %61 %62
+         %64 = OpIAdd %int %60 %63
+         %66 = OpCompositeConstruct %v2int %64 %int_0
+               OpStore %x_80_phi %66
+               OpStore %x_83_phi %int_0
+               OpBranch %67
+         %67 = OpLabel
+               OpLoopMerge %68 %69 None
+               OpBranch %70
+         %70 = OpLabel
+         %76 = OpLoad %v2int %x_80_phi
+               OpStore %x_80 %76
+         %77 = OpLoad %int %x_83_phi
+         %79 = OpSLessThan %bool %77 %int_100
+               OpSelectionMerge %81 None
+               OpBranchConditional %79 %82 %83
+         %82 = OpLabel
+               OpBranch %81
+         %83 = OpLabel
+               OpBranch %68
+         %81 = OpLabel
+         %84 = OpLoad %v2int %x_80
+               OpStore %x_95_phi %84
+         %85 = OpAccessChain %_ptr_Function_int %x_80 %uint_0
+         %86 = OpLoad %int %85
+         %87 = OpSGreaterThan %bool %86 %int_0
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %88
+         %89 = OpLabel
+         %90 = OpLoad %v2int %x_80
+               OpStore %x_94 %90
+         %92 = OpAccessChain %_ptr_Function_int %x_94 %uint_1
+         %93 = OpAccessChain %_ptr_Function_int %x_80 %uint_1
+         %94 = OpLoad %int %93
+         %96 = OpISub %int %94 %int_1
+               OpStore %92 %96
+         %97 = OpLoad %v2int %x_94
+               OpStore %x_95_phi %97
+               OpBranch %88
+         %88 = OpLabel
+         %98 = OpLoad %v2int %x_95_phi
+               OpStore %x_103_phi %98
+         %99 = OpCompositeExtract %int %98 0
+        %100 = OpSLessThan %bool %99 %int_0
+               OpSelectionMerge %101 None
+               OpBranchConditional %100 %102 %101
+        %102 = OpLabel
+               OpStore %x_102 %98
+        %103 = OpAccessChain %_ptr_Function_int %x_102 %uint_1
+        %104 = OpCompositeExtract %int %98 1
+        %105 = OpIAdd %int %104 %int_1
+               OpStore %103 %105
+        %106 = OpLoad %v2int %x_102
+               OpStore %x_103_phi %106
+               OpBranch %101
+        %101 = OpLabel
+        %107 = OpLoad %v2int %x_103_phi
+               OpStore %x_81_1 %107
+        %109 = OpAccessChain %_ptr_Function_int %x_81_1 %uint_0
+        %110 = OpCompositeExtract %int %107 0
+        %111 = OpCompositeExtract %int %107 1
+        %113 = OpSDiv %int %111 %int_2
+        %114 = OpIAdd %int %110 %113
+               OpStore %109 %114
+        %115 = OpLoad %v2int %x_81_1
+               OpBranch %69
+         %69 = OpLabel
+        %116 = OpIAdd %int %77 %int_1
+               OpStore %x_84 %116
+               OpStore %x_80_phi %115
+        %117 = OpLoad %int %x_84
+               OpStore %x_83_phi %117
+               OpBranch %67
+         %68 = OpLabel
+        %118 = OpAccessChain %_ptr_Function_int %x_80 %uint_0
+        %119 = OpLoad %int %118
+        %120 = OpLoad %v2int %x_80
+               OpStore %x_114_phi %120
+        %121 = OpSLessThan %bool %119 %int_0
+               OpSelectionMerge %122 None
+               OpBranchConditional %121 %123 %122
+        %123 = OpLabel
+        %124 = OpLoad %v2int %x_80
+               OpStore %x_113 %124
+        %125 = OpAccessChain %_ptr_Function_int %x_113 %uint_0
+        %126 = OpSNegate %int %119
+               OpStore %125 %126
+        %127 = OpLoad %v2int %x_113
+               OpStore %x_114_phi %127
+               OpBranch %122
+        %122 = OpLabel
+        %128 = OpLoad %v2int %x_114_phi
+               OpStore %x_116_phi %128
+               OpBranch %129
+        %129 = OpLabel
+               OpLoopMerge %130 %131 None
+               OpBranch %132
+        %132 = OpLabel
+        %134 = OpLoad %v2int %x_116_phi
+        %135 = OpCompositeExtract %int %134 0
+               OpStore %x_119 %135
+        %136 = OpLoad %int %x_119
+        %138 = OpSGreaterThan %bool %136 %int_15
+               OpSelectionMerge %139 None
+               OpBranchConditional %138 %140 %141
+        %140 = OpLabel
+               OpBranch %139
+        %141 = OpLabel
+               OpBranch %130
+        %139 = OpLabel
+               OpBranch %131
+        %131 = OpLabel
+               OpStore %x_117 %134
+        %142 = OpAccessChain %_ptr_Function_int %x_117 %uint_0
+        %144 = OpLoad %int %x_119
+        %145 = OpCopyObject %int %int_16
+        %147 = OpISub %int %144 %145
+        %143 = OpCopyObject %int %147
+               OpStore %142 %143
+        %148 = OpLoad %v2int %x_117
+               OpStore %x_116_phi %148
+               OpBranch %129
+        %130 = OpLabel
+               OpStore %indexable %167
+        %168 = OpLoad %int %x_119
+        %170 = OpAccessChain %_ptr_Function_v4float %indexable %168
+        %171 = OpLoad %v4float %170
+               OpStore %x_GLF_color %171
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %172
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %176 = OpLabel
+        %177 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %177
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %179 = OpLabel
+        %180 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %180
+        %181 = OpFunctionCall %void %main_1
+        %183 = OpLoad %v4float %x_GLF_color
+        %184 = OpCompositeConstruct %main_out %183
+        %182 = OpFunctionCall %void %tint_symbol_3 %184
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/2.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/2.wgsl.expected.wgsl
new file mode 100644
index 0000000..55f9a36
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-orbit-Os-access-chain-mutate-pointer/2.wgsl.expected.wgsl
@@ -0,0 +1,106 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var indexable : array<vec4<f32>, 16>;
+  var x_80 : vec2<i32>;
+  var x_113 : vec2<i32>;
+  var x_119 : i32;
+  var x_80_phi : vec2<i32>;
+  var x_83_phi : i32;
+  var x_114_phi : vec2<i32>;
+  var x_116_phi : vec2<i32>;
+  let x_58 : vec4<f32> = gl_FragCoord;
+  let x_61 : vec2<f32> = x_6.resolution;
+  let x_62 : vec2<f32> = (vec2<f32>(x_58.x, x_58.y) / x_61);
+  let x_65 : i32 = i32((x_62.x * 8.0));
+  let x_66 : ptr<function, array<vec4<f32>, 16>> = &(indexable);
+  let x_69 : i32 = i32((x_62.y * 8.0));
+  let x_78 : vec2<i32> = vec2<i32>(((((x_65 & 5) | (x_69 & 10)) * 8) + ((x_69 & 5) | (x_65 & 10))), 0);
+  x_80_phi = x_78;
+  x_83_phi = 0;
+  loop {
+    var x_94 : vec2<i32>;
+    var x_102 : vec2<i32>;
+    var x_84 : i32;
+    var x_95_phi : vec2<i32>;
+    var x_103_phi : vec2<i32>;
+    x_80 = x_80_phi;
+    let x_83 : i32 = x_83_phi;
+    if ((x_83 < 100)) {
+    } else {
+      break;
+    }
+    x_95_phi = x_80;
+    if ((x_80.x > 0)) {
+      x_94 = x_80;
+      x_94.y = (x_80.y - 1);
+      x_95_phi = x_94;
+    }
+    let x_95 : vec2<i32> = x_95_phi;
+    x_103_phi = x_95;
+    if ((x_95.x < 0)) {
+      x_102 = x_95;
+      x_102.y = (x_95.y + 1);
+      x_103_phi = x_102;
+    }
+    let x_103 : vec2<i32> = x_103_phi;
+    var x_81_1 : vec2<i32> = x_103;
+    x_81_1.x = (x_103.x + (x_103.y / 2));
+    let x_81 : vec2<i32> = x_81_1;
+
+    continuing {
+      x_84 = (x_83 + 1);
+      x_80_phi = x_81;
+      x_83_phi = x_84;
+    }
+  }
+  let x_108 : i32 = x_80.x;
+  x_114_phi = x_80;
+  if ((x_108 < 0)) {
+    x_113 = x_80;
+    x_113.x = -(x_108);
+    x_114_phi = x_113;
+  }
+  let x_114 : vec2<i32> = x_114_phi;
+  x_116_phi = x_114;
+  loop {
+    var x_117 : vec2<i32>;
+    let x_116 : vec2<i32> = x_116_phi;
+    x_119 = x_116.x;
+    if ((x_119 > 15)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_117 = x_116;
+      x_117.x = bitcast<i32>((x_119 - bitcast<i32>(16)));
+      x_116_phi = x_117;
+    }
+  }
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+  let x_124 : vec4<f32> = indexable[x_119];
+  x_GLF_color = x_124;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/1.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/1.spvasm
new file mode 100644
index 0000000..97f6789
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/1.spvasm
@@ -0,0 +1,304 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+       %uint = OpTypeInt 32 0
+%_ptr_Function_int = OpTypePointer Function %int
+    %int_256 = OpConstant %int 256
+       %bool = OpTypeBool
+     %uint_0 = OpConstant %uint 0
+   %uint_256 = OpConstant %uint 256
+%_arr_int_uint_256 = OpTypeArray %int %uint_256
+    %int_115 = OpConstant %int 115
+    %int_133 = OpConstant %int 133
+    %int_150 = OpConstant %int 150
+    %int_164 = OpConstant %int 164
+    %int_176 = OpConstant %int 176
+    %int_184 = OpConstant %int 184
+    %int_190 = OpConstant %int 190
+    %int_192 = OpConstant %int 192
+    %int_191 = OpConstant %int 191
+    %int_187 = OpConstant %int 187
+    %int_181 = OpConstant %int 181
+    %int_172 = OpConstant %int 172
+    %int_163 = OpConstant %int 163
+    %int_153 = OpConstant %int 153
+    %int_143 = OpConstant %int 143
+    %int_134 = OpConstant %int 134
+    %int_126 = OpConstant %int 126
+    %int_120 = OpConstant %int 120
+    %int_116 = OpConstant %int 116
+    %int_114 = OpConstant %int 114
+    %int_117 = OpConstant %int 117
+    %int_121 = OpConstant %int 121
+    %int_127 = OpConstant %int 127
+    %int_141 = OpConstant %int 141
+    %int_148 = OpConstant %int 148
+    %int_154 = OpConstant %int 154
+    %int_159 = OpConstant %int 159
+    %int_162 = OpConstant %int 162
+    %int_161 = OpConstant %int 161
+    %int_157 = OpConstant %int 157
+    %int_151 = OpConstant %int 151
+    %int_124 = OpConstant %int 124
+    %int_113 = OpConstant %int 113
+    %int_103 = OpConstant %int 103
+     %int_94 = OpConstant %int 94
+     %int_87 = OpConstant %int 87
+     %int_82 = OpConstant %int 82
+     %int_79 = OpConstant %int 79
+     %int_80 = OpConstant %int 80
+     %int_84 = OpConstant %int 84
+     %int_91 = OpConstant %int 91
+    %int_101 = OpConstant %int 101
+    %int_130 = OpConstant %int 130
+    %int_146 = OpConstant %int 146
+    %int_182 = OpConstant %int 182
+    %int_199 = OpConstant %int 199
+    %int_215 = OpConstant %int 215
+    %int_229 = OpConstant %int 229
+    %int_240 = OpConstant %int 240
+    %int_249 = OpConstant %int 249
+    %int_254 = OpConstant %int 254
+    %int_250 = OpConstant %int 250
+    %int_243 = OpConstant %int 243
+    %int_233 = OpConstant %int 233
+    %int_223 = OpConstant %int 223
+    %int_212 = OpConstant %int 212
+    %int_200 = OpConstant %int 200
+    %int_180 = OpConstant %int 180
+    %int_166 = OpConstant %int 166
+    %int_169 = OpConstant %int 169
+    %int_174 = OpConstant %int 174
+    %int_179 = OpConstant %int 179
+    %int_185 = OpConstant %int 185
+    %int_193 = OpConstant %int 193
+    %int_195 = OpConstant %int 195
+    %int_188 = OpConstant %int 188
+    %int_171 = OpConstant %int 171
+    %int_149 = OpConstant %int 149
+    %int_137 = OpConstant %int 137
+    %int_125 = OpConstant %int 125
+    %int_105 = OpConstant %int 105
+     %int_97 = OpConstant %int 97
+     %int_93 = OpConstant %int 93
+     %int_98 = OpConstant %int 98
+    %int_106 = OpConstant %int 106
+    %int_145 = OpConstant %int 145
+    %int_177 = OpConstant %int 177
+    %int_208 = OpConstant %int 208
+    %int_221 = OpConstant %int 221
+    %int_231 = OpConstant %int 231
+    %int_239 = OpConstant %int 239
+    %int_244 = OpConstant %int 244
+    %int_242 = OpConstant %int 242
+    %int_236 = OpConstant %int 236
+    %int_228 = OpConstant %int 228
+    %int_218 = OpConstant %int 218
+    %int_207 = OpConstant %int 207
+    %int_194 = OpConstant %int 194
+    %int_158 = OpConstant %int 158
+    %int_135 = OpConstant %int 135
+    %int_132 = OpConstant %int 132
+    %int_131 = OpConstant %int 131
+    %int_138 = OpConstant %int 138
+    %int_147 = OpConstant %int 147
+    %int_155 = OpConstant %int 155
+    %int_152 = OpConstant %int 152
+    %int_139 = OpConstant %int 139
+    %int_129 = OpConstant %int 129
+    %int_118 = OpConstant %int 118
+     %int_68 = OpConstant %int 68
+     %int_58 = OpConstant %int 58
+     %int_49 = OpConstant %int 49
+     %int_43 = OpConstant %int 43
+     %int_40 = OpConstant %int 40
+     %int_41 = OpConstant %int 41
+     %int_44 = OpConstant %int 44
+     %int_51 = OpConstant %int 51
+     %int_61 = OpConstant %int 61
+     %int_73 = OpConstant %int 73
+    %int_119 = OpConstant %int 119
+    %int_173 = OpConstant %int 173
+    %int_186 = OpConstant %int 186
+    %int_128 = OpConstant %int 128
+    %int_104 = OpConstant %int 104
+     %int_86 = OpConstant %int 86
+     %int_81 = OpConstant %int 81
+     %int_77 = OpConstant %int 77
+     %int_76 = OpConstant %int 76
+     %int_89 = OpConstant %int 89
+    %int_102 = OpConstant %int 102
+     %int_92 = OpConstant %int 92
+     %int_83 = OpConstant %int 83
+     %int_62 = OpConstant %int 62
+     %int_50 = OpConstant %int 50
+     %int_38 = OpConstant %int 38
+     %int_26 = OpConstant %int 26
+     %int_16 = OpConstant %int 16
+      %int_8 = OpConstant %int 8
+      %int_2 = OpConstant %int 2
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+     %int_11 = OpConstant %int 11
+     %int_21 = OpConstant %int 21
+     %int_33 = OpConstant %int 33
+     %int_48 = OpConstant %int 48
+     %int_64 = OpConstant %int 64
+    %int_144 = OpConstant %int 144
+    %int_123 = OpConstant %int 123
+    %int_112 = OpConstant %int 112
+    %int_100 = OpConstant %int 100
+     %int_90 = OpConstant %int 90
+     %int_65 = OpConstant %int 65
+     %int_67 = OpConstant %int 67
+     %int_70 = OpConstant %int 70
+     %int_75 = OpConstant %int 75
+     %int_95 = OpConstant %int 95
+     %int_88 = OpConstant %int 88
+     %int_69 = OpConstant %int 69
+     %int_47 = OpConstant %int 47
+     %int_36 = OpConstant %int 36
+     %int_18 = OpConstant %int 18
+     %int_13 = OpConstant %int 13
+     %int_15 = OpConstant %int 15
+     %int_22 = OpConstant %int 22
+     %int_32 = OpConstant %int 32
+     %int_45 = OpConstant %int 45
+     %int_60 = OpConstant %int 60
+        %177 = OpConstantComposite %_arr_int_uint_256 %int_115 %int_133 %int_150 %int_164 %int_176 %int_184 %int_190 %int_192 %int_191 %int_187 %int_181 %int_172 %int_163 %int_153 %int_143 %int_134 %int_126 %int_120 %int_116 %int_114 %int_114 %int_117 %int_121 %int_127 %int_134 %int_141 %int_148 %int_154 %int_159 %int_162 %int_163 %int_161 %int_157 %int_151 %int_143 %int_134 %int_124 %int_113 %int_103 %int_94 %int_87 %int_82 %int_79 %int_80 %int_84 %int_91 %int_101 %int_114 %int_130 %int_146 %int_164 %int_182 %int_199 %int_215 %int_229 %int_240 %int_249 %int_254 %int_256 %int_254 %int_250 %int_243 %int_233 %int_223 %int_212 %int_200 %int_190 %int_180 %int_172 %int_166 %int_163 %int_161 %int_162 %int_164 %int_169 %int_174 %int_179 %int_185 %int_190 %int_193 %int_195 %int_195 %int_192 %int_188 %int_180 %int_171 %int_161 %int_149 %int_137 %int_125 %int_114 %int_105 %int_97 %int_93 %int_91 %int_93 %int_98 %int_106 %int_117 %int_130 %int_145 %int_161 %int_177 %int_193 %int_208 %int_221 %int_231 %int_239 %int_243 %int_244 %int_242 %int_236 %int_228 %int_218 %int_207 %int_194 %int_181 %int_169 %int_158 %int_148 %int_141 %int_135 %int_132 %int_131 %int_132 %int_135 %int_138 %int_143 %int_147 %int_151 %int_154 %int_155 %int_155 %int_152 %int_146 %int_139 %int_129 %int_118 %int_106 %int_93 %int_80 %int_68 %int_58 %int_49 %int_43 %int_40 %int_41 %int_44 %int_51 %int_61 %int_73 %int_87 %int_103 %int_119 %int_134 %int_149 %int_162 %int_173 %int_181 %int_186 %int_188 %int_186 %int_181 %int_174 %int_164 %int_153 %int_141 %int_128 %int_116 %int_104 %int_94 %int_86 %int_81 %int_77 %int_76 %int_77 %int_80 %int_84 %int_89 %int_94 %int_98 %int_102 %int_104 %int_104 %int_102 %int_98 %int_92 %int_83 %int_73 %int_62 %int_50 %int_38 %int_26 %int_16 %int_8 %int_2 %int_0 %int_0 %int_4 %int_11 %int_21 %int_33 %int_48 %int_64 %int_81 %int_98 %int_114 %int_129 %int_141 %int_151 %int_158 %int_161 %int_161 %int_158 %int_152 %int_144 %int_134 %int_123 %int_112 %int_100 %int_90 %int_81 %int_73 %int_68 %int_65 %int_65 %int_67 %int_70 %int_75 %int_81 %int_87 %int_92 %int_97 %int_101 %int_103 %int_102 %int_100 %int_95 %int_88 %int_79 %int_69 %int_58 %int_47 %int_36 %int_26 %int_18 %int_13 %int_11 %int_11 %int_15 %int_22 %int_32 %int_45 %int_60 %int_77 %int_94
+%_ptr_Function__arr_int_uint_256 = OpTypePointer Function %_arr_int_uint_256
+   %float_15 = OpConstant %float 15
+    %float_1 = OpConstant %float 1
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+        %183 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+    %v2float = OpTypeVector %float 2
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+  %float_256 = OpConstant %float 256
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+      %false = OpConstantFalse %bool
+       %true = OpConstantTrue %bool
+        %192 = OpUndef %v4float
+%float_0_0666666701 = OpConstant %float 0.0666666701
+    %int_0_0 = OpConstant %int 0
+       %main = OpFunction %void None %8
+        %195 = OpLabel
+        %196 = OpVariable %_ptr_Function__arr_int_uint_256 Function
+        %197 = OpVariable %_ptr_Function__arr_int_uint_256 Function
+        %198 = OpVariable %_ptr_Function__arr_int_uint_256 Function
+        %199 = OpLoad %v4float %gl_FragCoord
+        %200 = OpVectorShuffle %v2float %199 %199 0 1
+        %201 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+        %202 = OpLoad %v2float %201
+        %203 = OpFDiv %v2float %200 %202
+        %204 = OpCompositeExtract %float %203 0
+        %205 = OpFMul %float %204 %float_256
+        %206 = OpConvertFToS %int %205
+        %207 = OpCompositeExtract %float %203 1
+        %208 = OpFMul %float %207 %float_256
+        %209 = OpConvertFToS %int %208
+        %210 = OpCompositeConstruct %v2int %206 %209
+               OpSelectionMerge %211 None
+               OpSwitch %uint_0 %212
+        %212 = OpLabel
+               OpBranch %213
+        %213 = OpLabel
+        %214 = OpPhi %v2int %210 %212 %215 %216
+        %217 = OpCompositeExtract %int %214 1
+        %218 = OpINotEqual %bool %217 %int_256
+               OpLoopMerge %219 %216 None
+               OpBranchConditional %218 %220 %219
+        %220 = OpLabel
+        %221 = OpCompositeExtract %int %214 0
+               OpStore %196 %177
+        %222 = OpAccessChain %_ptr_Function_int %196 %217
+        %223 = OpLoad %int %222
+        %224 = OpIAdd %int %223 %int_15
+        %225 = OpSLessThan %bool %221 %224
+               OpBranch %226
+        %226 = OpLabel
+               OpSelectionMerge %227 None
+               OpBranchConditional %225 %228 %227
+        %228 = OpLabel
+               OpStore %197 %177
+               OpBranch %227
+        %227 = OpLabel
+        %229 = OpAccessChain %_ptr_Function_int %197 %217
+               OpSelectionMerge %230 None
+               OpBranchConditional %225 %231 %232
+        %231 = OpLabel
+        %233 = OpLoad %int %229
+               OpBranch %230
+        %232 = OpLabel
+        %234 = OpCopyObject %int %int_0_0
+               OpBranch %230
+        %230 = OpLabel
+        %235 = OpPhi %int %233 %231 %234 %232
+        %236 = OpISub %int %235 %int_15
+        %237 = OpSGreaterThan %bool %221 %236
+               OpSelectionMerge %238 None
+               OpBranchConditional %225 %239 %240
+        %239 = OpLabel
+               OpBranch %238
+        %240 = OpLabel
+               OpBranch %238
+        %238 = OpLabel
+        %241 = OpPhi %bool %237 %239 %225 %240
+               OpSelectionMerge %242 None
+               OpBranchConditional %241 %243 %242
+        %243 = OpLabel
+               OpStore %198 %177
+        %244 = OpAccessChain %_ptr_Function_int %198 %217
+        %245 = OpLoad %int %244
+        %246 = OpISub %int %221 %245
+        %247 = OpConvertSToF %float %246
+        %248 = OpExtInst %float %1 FAbs %247
+        %249 = OpFSub %float %float_15 %248
+        %250 = OpFMul %float %249 %float_0_0666666701
+        %251 = OpCompositeConstruct %v4float %250 %250 %250 %float_1
+               OpBranch %219
+        %242 = OpLabel
+        %252 = OpIAdd %int %217 %int_1
+        %215 = OpCompositeInsert %v2int %252 %214 1
+               OpBranch %216
+        %216 = OpLabel
+               OpBranch %213
+        %219 = OpLabel
+        %253 = OpPhi %v4float %192 %213 %251 %243
+        %254 = OpPhi %bool %false %213 %true %243
+               OpSelectionMerge %255 None
+               OpBranchConditional %254 %211 %255
+        %255 = OpLabel
+               OpBranch %211
+        %211 = OpLabel
+        %256 = OpPhi %v4float %253 %219 %183 %255
+               OpStore %_GLF_color %256
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..375d755
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/1.spvasm.expected.hlsl
@@ -0,0 +1,108 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int x_196[256] = (int[256])0;
+  int x_197[256] = (int[256])0;
+  int x_198[256] = (int[256])0;
+  int2 x_210 = int2(0, 0);
+  float4 x_251 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 x_253 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int2 x_214_phi = int2(0, 0);
+  float4 x_253_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  bool x_254_phi = false;
+  float4 x_256_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  const float4 x_199 = gl_FragCoord;
+  const float2 x_202 = asfloat(x_6[0].xy);
+  const float2 x_203 = (float2(x_199.x, x_199.y) / x_202);
+  x_210 = int2(int((x_203.x * 256.0f)), int((x_203.y * 256.0f)));
+  switch(0u) {
+    default: {
+      x_214_phi = x_210;
+      while (true) {
+        int x_233 = 0;
+        int x_234 = 0;
+        int x_235_phi = 0;
+        bool x_241_phi = false;
+        const int2 x_214 = x_214_phi;
+        const int x_217 = x_214.y;
+        x_253_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        x_254_phi = false;
+        if ((x_217 != 256)) {
+        } else {
+          break;
+        }
+        const int x_221 = x_214.x;
+        const int tint_symbol_5[256] = {115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94};
+        x_196 = tint_symbol_5;
+        const int x_223 = x_196[x_217];
+        const bool x_225 = (x_221 < (x_223 + 15));
+        if (x_225) {
+          const int tint_symbol_6[256] = {115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94};
+          x_197 = tint_symbol_6;
+        }
+        if (x_225) {
+          x_233 = x_197[x_217];
+          x_235_phi = x_233;
+        } else {
+          x_234 = 0;
+          x_235_phi = x_234;
+        }
+        const bool x_237 = (x_221 > (x_235_phi - 15));
+        if (x_225) {
+          x_241_phi = x_237;
+        } else {
+          x_241_phi = x_225;
+        }
+        if (x_241_phi) {
+          const int tint_symbol_7[256] = {115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94};
+          x_198 = tint_symbol_7;
+          const int x_245 = x_198[x_217];
+          const float x_250 = ((15.0f - abs(float((x_221 - x_245)))) * 0.06666667f);
+          x_251 = float4(x_250, x_250, x_250, 1.0f);
+          x_253_phi = x_251;
+          x_254_phi = true;
+          break;
+        }
+        int2 x_215_1 = x_214;
+        x_215_1.y = (x_217 + 1);
+        const int2 x_215 = x_215_1;
+        {
+          x_214_phi = x_215;
+        }
+      }
+      x_253 = x_253_phi;
+      const bool x_254 = x_254_phi;
+      x_256_phi = x_253;
+      if (x_254) {
+        break;
+      }
+      x_256_phi = float4(0.0f, 0.0f, 0.0f, 1.0f);
+      break;
+    }
+  }
+  x_GLF_color = x_256_phi;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_8 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_8;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/1.spvasm.expected.msl
new file mode 100644
index 0000000..72762dc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/1.spvasm.expected.msl
@@ -0,0 +1,113 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  int arr[256];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_8, thread float4* const tint_symbol_9) {
+  tint_array_wrapper x_196 = {};
+  tint_array_wrapper x_197 = {};
+  tint_array_wrapper x_198 = {};
+  int2 x_210 = 0;
+  float4 x_251 = 0.0f;
+  float4 x_253 = 0.0f;
+  int2 x_214_phi = 0;
+  float4 x_253_phi = 0.0f;
+  bool x_254_phi = false;
+  float4 x_256_phi = 0.0f;
+  float4 const x_199 = *(tint_symbol_8);
+  float2 const x_202 = x_6.resolution;
+  float2 const x_203 = (float2(x_199.x, x_199.y) / x_202);
+  x_210 = int2(int((x_203.x * 256.0f)), int((x_203.y * 256.0f)));
+  switch(0u) {
+    default: {
+      x_214_phi = x_210;
+      while (true) {
+        int x_233 = 0;
+        int x_234 = 0;
+        int x_235_phi = 0;
+        bool x_241_phi = false;
+        int2 const x_214 = x_214_phi;
+        int const x_217 = x_214.y;
+        x_253_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        x_254_phi = false;
+        if ((x_217 != 256)) {
+        } else {
+          break;
+        }
+        int const x_221 = x_214.x;
+        tint_array_wrapper const tint_symbol_4 = {.arr={115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94}};
+        x_196 = tint_symbol_4;
+        int const x_223 = x_196.arr[x_217];
+        bool const x_225 = (x_221 < (x_223 + 15));
+        if (x_225) {
+          tint_array_wrapper const tint_symbol_5 = {.arr={115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94}};
+          x_197 = tint_symbol_5;
+        }
+        if (x_225) {
+          x_233 = x_197.arr[x_217];
+          x_235_phi = x_233;
+        } else {
+          x_234 = 0;
+          x_235_phi = x_234;
+        }
+        int const x_235 = x_235_phi;
+        bool const x_237 = (x_221 > (x_235 - 15));
+        if (x_225) {
+          x_241_phi = x_237;
+        } else {
+          x_241_phi = x_225;
+        }
+        bool const x_241 = x_241_phi;
+        if (x_241) {
+          tint_array_wrapper const tint_symbol_6 = {.arr={115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94}};
+          x_198 = tint_symbol_6;
+          int const x_245 = x_198.arr[x_217];
+          float const x_250 = ((15.0f - fabs(float((x_221 - x_245)))) * 0.06666667f);
+          x_251 = float4(x_250, x_250, x_250, 1.0f);
+          x_253_phi = x_251;
+          x_254_phi = true;
+          break;
+        }
+        int2 x_215_1 = x_214;
+        x_215_1.y = (x_217 + 1);
+        int2 const x_215 = x_215_1;
+        {
+          x_214_phi = x_215;
+        }
+      }
+      x_253 = x_253_phi;
+      bool const x_254 = x_254_phi;
+      x_256_phi = x_253;
+      if (x_254) {
+        break;
+      }
+      x_256_phi = float4(0.0f, 0.0f, 0.0f, 1.0f);
+      break;
+    }
+  }
+  float4 const x_256 = x_256_phi;
+  *(tint_symbol_9) = x_256;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_10 = 0.0f;
+  thread float4 tint_symbol_11 = 0.0f;
+  tint_symbol_10 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_10), &(tint_symbol_11));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_11};
+  tint_symbol_2 const tint_symbol_7 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_7;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..cc6b7b1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/1.spvasm.expected.spvasm
@@ -0,0 +1,408 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 303
+; Schema: 0
+               OpCapability Shader
+        %267 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %x_196 "x_196"
+               OpName %x_197 "x_197"
+               OpName %x_198 "x_198"
+               OpName %x_210 "x_210"
+               OpName %x_251 "x_251"
+               OpName %x_253 "x_253"
+               OpName %x_214_phi "x_214_phi"
+               OpName %x_253_phi "x_253_phi"
+               OpName %x_254_phi "x_254_phi"
+               OpName %x_256_phi "x_256_phi"
+               OpName %x_233 "x_233"
+               OpName %x_234 "x_234"
+               OpName %x_235_phi "x_235_phi"
+               OpName %x_241_phi "x_241_phi"
+               OpName %x_215_1 "x_215_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_int_uint_256 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+   %uint_256 = OpConstant %uint 256
+%_arr_int_uint_256 = OpTypeArray %int %uint_256
+%_ptr_Function__arr_int_uint_256 = OpTypePointer Function %_arr_int_uint_256
+         %25 = OpConstantNull %_arr_int_uint_256
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %31 = OpConstantNull %v2int
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %40 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+  %float_256 = OpConstant %float 256
+%_ptr_Function_int = OpTypePointer Function %int
+         %68 = OpConstantNull %int
+    %float_0 = OpConstant %float 0
+         %75 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+      %false = OpConstantFalse %bool
+    %int_256 = OpConstant %int 256
+    %int_115 = OpConstant %int 115
+    %int_133 = OpConstant %int 133
+    %int_150 = OpConstant %int 150
+    %int_164 = OpConstant %int 164
+    %int_176 = OpConstant %int 176
+    %int_184 = OpConstant %int 184
+    %int_190 = OpConstant %int 190
+    %int_192 = OpConstant %int 192
+    %int_191 = OpConstant %int 191
+    %int_187 = OpConstant %int 187
+    %int_181 = OpConstant %int 181
+    %int_172 = OpConstant %int 172
+    %int_163 = OpConstant %int 163
+    %int_153 = OpConstant %int 153
+    %int_143 = OpConstant %int 143
+    %int_134 = OpConstant %int 134
+    %int_126 = OpConstant %int 126
+    %int_120 = OpConstant %int 120
+    %int_116 = OpConstant %int 116
+    %int_114 = OpConstant %int 114
+    %int_117 = OpConstant %int 117
+    %int_121 = OpConstant %int 121
+    %int_127 = OpConstant %int 127
+    %int_141 = OpConstant %int 141
+    %int_148 = OpConstant %int 148
+    %int_154 = OpConstant %int 154
+    %int_159 = OpConstant %int 159
+    %int_162 = OpConstant %int 162
+    %int_161 = OpConstant %int 161
+    %int_157 = OpConstant %int 157
+    %int_151 = OpConstant %int 151
+    %int_124 = OpConstant %int 124
+    %int_113 = OpConstant %int 113
+    %int_103 = OpConstant %int 103
+     %int_94 = OpConstant %int 94
+     %int_87 = OpConstant %int 87
+     %int_82 = OpConstant %int 82
+     %int_79 = OpConstant %int 79
+     %int_80 = OpConstant %int 80
+     %int_84 = OpConstant %int 84
+     %int_91 = OpConstant %int 91
+    %int_101 = OpConstant %int 101
+    %int_130 = OpConstant %int 130
+    %int_146 = OpConstant %int 146
+    %int_182 = OpConstant %int 182
+    %int_199 = OpConstant %int 199
+    %int_215 = OpConstant %int 215
+    %int_229 = OpConstant %int 229
+    %int_240 = OpConstant %int 240
+    %int_249 = OpConstant %int 249
+    %int_254 = OpConstant %int 254
+    %int_250 = OpConstant %int 250
+    %int_243 = OpConstant %int 243
+    %int_233 = OpConstant %int 233
+    %int_223 = OpConstant %int 223
+    %int_212 = OpConstant %int 212
+    %int_200 = OpConstant %int 200
+    %int_180 = OpConstant %int 180
+    %int_166 = OpConstant %int 166
+    %int_169 = OpConstant %int 169
+    %int_174 = OpConstant %int 174
+    %int_179 = OpConstant %int 179
+    %int_185 = OpConstant %int 185
+    %int_193 = OpConstant %int 193
+    %int_195 = OpConstant %int 195
+    %int_188 = OpConstant %int 188
+    %int_171 = OpConstant %int 171
+    %int_149 = OpConstant %int 149
+    %int_137 = OpConstant %int 137
+    %int_125 = OpConstant %int 125
+    %int_105 = OpConstant %int 105
+     %int_97 = OpConstant %int 97
+     %int_93 = OpConstant %int 93
+     %int_98 = OpConstant %int 98
+    %int_106 = OpConstant %int 106
+    %int_145 = OpConstant %int 145
+    %int_177 = OpConstant %int 177
+    %int_208 = OpConstant %int 208
+    %int_221 = OpConstant %int 221
+    %int_231 = OpConstant %int 231
+    %int_239 = OpConstant %int 239
+    %int_244 = OpConstant %int 244
+    %int_242 = OpConstant %int 242
+    %int_236 = OpConstant %int 236
+    %int_228 = OpConstant %int 228
+    %int_218 = OpConstant %int 218
+    %int_207 = OpConstant %int 207
+    %int_194 = OpConstant %int 194
+    %int_158 = OpConstant %int 158
+    %int_135 = OpConstant %int 135
+    %int_132 = OpConstant %int 132
+    %int_131 = OpConstant %int 131
+    %int_138 = OpConstant %int 138
+    %int_147 = OpConstant %int 147
+    %int_155 = OpConstant %int 155
+    %int_152 = OpConstant %int 152
+    %int_139 = OpConstant %int 139
+    %int_129 = OpConstant %int 129
+    %int_118 = OpConstant %int 118
+     %int_68 = OpConstant %int 68
+     %int_58 = OpConstant %int 58
+     %int_49 = OpConstant %int 49
+     %int_43 = OpConstant %int 43
+     %int_40 = OpConstant %int 40
+     %int_41 = OpConstant %int 41
+     %int_44 = OpConstant %int 44
+     %int_51 = OpConstant %int 51
+     %int_61 = OpConstant %int 61
+     %int_73 = OpConstant %int 73
+    %int_119 = OpConstant %int 119
+    %int_173 = OpConstant %int 173
+    %int_186 = OpConstant %int 186
+    %int_128 = OpConstant %int 128
+    %int_104 = OpConstant %int 104
+     %int_86 = OpConstant %int 86
+     %int_81 = OpConstant %int 81
+     %int_77 = OpConstant %int 77
+     %int_76 = OpConstant %int 76
+     %int_89 = OpConstant %int 89
+    %int_102 = OpConstant %int 102
+     %int_92 = OpConstant %int 92
+     %int_83 = OpConstant %int 83
+     %int_62 = OpConstant %int 62
+     %int_50 = OpConstant %int 50
+     %int_38 = OpConstant %int 38
+     %int_26 = OpConstant %int 26
+     %int_16 = OpConstant %int 16
+      %int_8 = OpConstant %int 8
+      %int_2 = OpConstant %int 2
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+     %int_11 = OpConstant %int 11
+     %int_21 = OpConstant %int 21
+     %int_33 = OpConstant %int 33
+     %int_48 = OpConstant %int 48
+     %int_64 = OpConstant %int 64
+    %int_144 = OpConstant %int 144
+    %int_123 = OpConstant %int 123
+    %int_112 = OpConstant %int 112
+    %int_100 = OpConstant %int 100
+     %int_90 = OpConstant %int 90
+     %int_65 = OpConstant %int 65
+     %int_67 = OpConstant %int 67
+     %int_70 = OpConstant %int 70
+     %int_75 = OpConstant %int 75
+     %int_95 = OpConstant %int 95
+     %int_88 = OpConstant %int 88
+     %int_69 = OpConstant %int 69
+     %int_47 = OpConstant %int 47
+     %int_36 = OpConstant %int 36
+     %int_18 = OpConstant %int 18
+     %int_13 = OpConstant %int 13
+     %int_15 = OpConstant %int 15
+     %int_22 = OpConstant %int 22
+     %int_32 = OpConstant %int 32
+     %int_45 = OpConstant %int 45
+     %int_60 = OpConstant %int 60
+        %240 = OpConstantComposite %_arr_int_uint_256 %int_115 %int_133 %int_150 %int_164 %int_176 %int_184 %int_190 %int_192 %int_191 %int_187 %int_181 %int_172 %int_163 %int_153 %int_143 %int_134 %int_126 %int_120 %int_116 %int_114 %int_114 %int_117 %int_121 %int_127 %int_134 %int_141 %int_148 %int_154 %int_159 %int_162 %int_163 %int_161 %int_157 %int_151 %int_143 %int_134 %int_124 %int_113 %int_103 %int_94 %int_87 %int_82 %int_79 %int_80 %int_84 %int_91 %int_101 %int_114 %int_130 %int_146 %int_164 %int_182 %int_199 %int_215 %int_229 %int_240 %int_249 %int_254 %int_256 %int_254 %int_250 %int_243 %int_233 %int_223 %int_212 %int_200 %int_190 %int_180 %int_172 %int_166 %int_163 %int_161 %int_162 %int_164 %int_169 %int_174 %int_179 %int_185 %int_190 %int_193 %int_195 %int_195 %int_192 %int_188 %int_180 %int_171 %int_161 %int_149 %int_137 %int_125 %int_114 %int_105 %int_97 %int_93 %int_91 %int_93 %int_98 %int_106 %int_117 %int_130 %int_145 %int_161 %int_177 %int_193 %int_208 %int_221 %int_231 %int_239 %int_243 %int_244 %int_242 %int_236 %int_228 %int_218 %int_207 %int_194 %int_181 %int_169 %int_158 %int_148 %int_141 %int_135 %int_132 %int_131 %int_132 %int_135 %int_138 %int_143 %int_147 %int_151 %int_154 %int_155 %int_155 %int_152 %int_146 %int_139 %int_129 %int_118 %int_106 %int_93 %int_80 %int_68 %int_58 %int_49 %int_43 %int_40 %int_41 %int_44 %int_51 %int_61 %int_73 %int_87 %int_103 %int_119 %int_134 %int_149 %int_162 %int_173 %int_181 %int_186 %int_188 %int_186 %int_181 %int_174 %int_164 %int_153 %int_141 %int_128 %int_116 %int_104 %int_94 %int_86 %int_81 %int_77 %int_76 %int_77 %int_80 %int_84 %int_89 %int_94 %int_98 %int_102 %int_104 %int_104 %int_102 %int_98 %int_92 %int_83 %int_73 %int_62 %int_50 %int_38 %int_26 %int_16 %int_8 %int_2 %int_0 %int_0 %int_4 %int_11 %int_21 %int_33 %int_48 %int_64 %int_81 %int_98 %int_114 %int_129 %int_141 %int_151 %int_158 %int_161 %int_161 %int_158 %int_152 %int_144 %int_134 %int_123 %int_112 %int_100 %int_90 %int_81 %int_73 %int_68 %int_65 %int_65 %int_67 %int_70 %int_75 %int_81 %int_87 %int_92 %int_97 %int_101 %int_103 %int_102 %int_100 %int_95 %int_88 %int_79 %int_69 %int_58 %int_47 %int_36 %int_26 %int_18 %int_13 %int_11 %int_11 %int_15 %int_22 %int_32 %int_45 %int_60 %int_77 %int_94
+   %float_15 = OpConstant %float 15
+%float_0_0666666701 = OpConstant %float 0.0666666701
+    %float_1 = OpConstant %float 1
+       %true = OpConstantTrue %bool
+     %uint_1 = OpConstant %uint 1
+      %int_1 = OpConstant %int 1
+        %288 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %290 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+      %x_196 = OpVariable %_ptr_Function__arr_int_uint_256 Function %25
+      %x_197 = OpVariable %_ptr_Function__arr_int_uint_256 Function %25
+      %x_198 = OpVariable %_ptr_Function__arr_int_uint_256 Function %25
+      %x_210 = OpVariable %_ptr_Function_v2int Function %31
+      %x_251 = OpVariable %_ptr_Function_v4float Function %5
+      %x_253 = OpVariable %_ptr_Function_v4float Function %5
+  %x_214_phi = OpVariable %_ptr_Function_v2int Function %31
+  %x_253_phi = OpVariable %_ptr_Function_v4float Function %5
+  %x_254_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_256_phi = OpVariable %_ptr_Function_v4float Function %5
+      %x_233 = OpVariable %_ptr_Function_int Function %68
+      %x_234 = OpVariable %_ptr_Function_int Function %68
+  %x_235_phi = OpVariable %_ptr_Function_int Function %68
+  %x_241_phi = OpVariable %_ptr_Function_bool Function %40
+    %x_215_1 = OpVariable %_ptr_Function_v2int Function %31
+         %42 = OpLoad %v4float %gl_FragCoord
+         %45 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %46 = OpLoad %v2float %45
+         %47 = OpCompositeExtract %float %42 0
+         %48 = OpCompositeExtract %float %42 1
+         %49 = OpCompositeConstruct %v2float %47 %48
+         %50 = OpFDiv %v2float %49 %46
+         %52 = OpCompositeExtract %float %50 0
+         %54 = OpFMul %float %52 %float_256
+         %51 = OpConvertFToS %int %54
+         %56 = OpCompositeExtract %float %50 1
+         %57 = OpFMul %float %56 %float_256
+         %55 = OpConvertFToS %int %57
+         %58 = OpCompositeConstruct %v2int %51 %55
+               OpStore %x_210 %58
+               OpSelectionMerge %59 None
+               OpSwitch %uint_0 %60
+         %60 = OpLabel
+         %61 = OpLoad %v2int %x_210
+               OpStore %x_214_phi %61
+               OpBranch %62
+         %62 = OpLabel
+               OpLoopMerge %63 %64 None
+               OpBranch %65
+         %65 = OpLabel
+         %72 = OpLoad %v2int %x_214_phi
+         %73 = OpCompositeExtract %int %72 1
+               OpStore %x_253_phi %75
+               OpStore %x_254_phi %false
+         %78 = OpINotEqual %bool %73 %int_256
+               OpSelectionMerge %79 None
+               OpBranchConditional %78 %80 %81
+         %80 = OpLabel
+               OpBranch %79
+         %81 = OpLabel
+               OpBranch %63
+         %79 = OpLabel
+         %82 = OpCompositeExtract %int %72 0
+               OpStore %x_196 %240
+        %241 = OpAccessChain %_ptr_Function_int %x_196 %73
+        %242 = OpLoad %int %241
+        %243 = OpIAdd %int %242 %int_15
+        %244 = OpSLessThan %bool %82 %243
+               OpSelectionMerge %245 None
+               OpBranchConditional %244 %246 %245
+        %246 = OpLabel
+               OpStore %x_197 %240
+               OpBranch %245
+        %245 = OpLabel
+               OpSelectionMerge %247 None
+               OpBranchConditional %244 %248 %249
+        %248 = OpLabel
+        %250 = OpAccessChain %_ptr_Function_int %x_197 %73
+        %251 = OpLoad %int %250
+               OpStore %x_233 %251
+        %252 = OpLoad %int %x_233
+               OpStore %x_235_phi %252
+               OpBranch %247
+        %249 = OpLabel
+               OpStore %x_234 %int_0
+        %253 = OpLoad %int %x_234
+               OpStore %x_235_phi %253
+               OpBranch %247
+        %247 = OpLabel
+        %254 = OpLoad %int %x_235_phi
+        %255 = OpISub %int %254 %int_15
+        %256 = OpSGreaterThan %bool %82 %255
+               OpSelectionMerge %257 None
+               OpBranchConditional %244 %258 %259
+        %258 = OpLabel
+               OpStore %x_241_phi %256
+               OpBranch %257
+        %259 = OpLabel
+               OpStore %x_241_phi %244
+               OpBranch %257
+        %257 = OpLabel
+        %260 = OpLoad %bool %x_241_phi
+               OpSelectionMerge %261 None
+               OpBranchConditional %260 %262 %261
+        %262 = OpLabel
+               OpStore %x_198 %240
+        %263 = OpAccessChain %_ptr_Function_int %x_198 %73
+        %264 = OpLoad %int %263
+        %269 = OpISub %int %82 %264
+        %268 = OpConvertSToF %float %269
+        %266 = OpExtInst %float %267 FAbs %268
+        %270 = OpFSub %float %float_15 %266
+        %272 = OpFMul %float %270 %float_0_0666666701
+        %274 = OpCompositeConstruct %v4float %272 %272 %272 %float_1
+               OpStore %x_251 %274
+        %275 = OpLoad %v4float %x_251
+               OpStore %x_253_phi %275
+               OpStore %x_254_phi %true
+               OpBranch %63
+        %261 = OpLabel
+               OpStore %x_215_1 %72
+        %279 = OpAccessChain %_ptr_Function_int %x_215_1 %uint_1
+        %281 = OpIAdd %int %73 %int_1
+               OpStore %279 %281
+        %282 = OpLoad %v2int %x_215_1
+               OpBranch %64
+         %64 = OpLabel
+               OpStore %x_214_phi %282
+               OpBranch %62
+         %63 = OpLabel
+        %283 = OpLoad %v4float %x_253_phi
+               OpStore %x_253 %283
+        %284 = OpLoad %bool %x_254_phi
+        %285 = OpLoad %v4float %x_253
+               OpStore %x_256_phi %285
+               OpSelectionMerge %286 None
+               OpBranchConditional %284 %287 %286
+        %287 = OpLabel
+               OpBranch %59
+        %286 = OpLabel
+               OpStore %x_256_phi %288
+               OpBranch %59
+         %59 = OpLabel
+        %289 = OpLoad %v4float %x_256_phi
+               OpStore %x_GLF_color %289
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %290
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %294 = OpLabel
+        %295 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %295
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %297 = OpLabel
+        %298 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %298
+        %299 = OpFunctionCall %void %main_1
+        %301 = OpLoad %v4float %x_GLF_color
+        %302 = OpCompositeConstruct %main_out %301
+        %300 = OpFunctionCall %void %tint_symbol_3 %302
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..43a6481
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/1.spvasm.expected.wgsl
@@ -0,0 +1,106 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_196 : array<i32, 256>;
+  var x_197 : array<i32, 256>;
+  var x_198 : array<i32, 256>;
+  var x_210 : vec2<i32>;
+  var x_251 : vec4<f32>;
+  var x_253 : vec4<f32>;
+  var x_214_phi : vec2<i32>;
+  var x_253_phi : vec4<f32>;
+  var x_254_phi : bool;
+  var x_256_phi : vec4<f32>;
+  let x_199 : vec4<f32> = gl_FragCoord;
+  let x_202 : vec2<f32> = x_6.resolution;
+  let x_203 : vec2<f32> = (vec2<f32>(x_199.x, x_199.y) / x_202);
+  x_210 = vec2<i32>(i32((x_203.x * 256.0)), i32((x_203.y * 256.0)));
+  switch(0u) {
+    default: {
+      x_214_phi = x_210;
+      loop {
+        var x_233 : i32;
+        var x_234 : i32;
+        var x_235_phi : i32;
+        var x_241_phi : bool;
+        let x_214 : vec2<i32> = x_214_phi;
+        let x_217 : i32 = x_214.y;
+        x_253_phi = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+        x_254_phi = false;
+        if ((x_217 != 256)) {
+        } else {
+          break;
+        }
+        let x_221 : i32 = x_214.x;
+        x_196 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+        let x_223 : i32 = x_196[x_217];
+        let x_225 : bool = (x_221 < (x_223 + 15));
+        if (x_225) {
+          x_197 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+        }
+        if (x_225) {
+          x_233 = x_197[x_217];
+          x_235_phi = x_233;
+        } else {
+          x_234 = 0;
+          x_235_phi = x_234;
+        }
+        let x_235 : i32 = x_235_phi;
+        let x_237 : bool = (x_221 > (x_235 - 15));
+        if (x_225) {
+          x_241_phi = x_237;
+        } else {
+          x_241_phi = x_225;
+        }
+        let x_241 : bool = x_241_phi;
+        if (x_241) {
+          x_198 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+          let x_245 : i32 = x_198[x_217];
+          let x_250 : f32 = ((15.0 - abs(f32((x_221 - x_245)))) * 0.06666667);
+          x_251 = vec4<f32>(x_250, x_250, x_250, 1.0);
+          x_253_phi = x_251;
+          x_254_phi = true;
+          break;
+        }
+        var x_215_1 : vec2<i32> = x_214;
+        x_215_1.y = (x_217 + 1);
+        let x_215 : vec2<i32> = x_215_1;
+
+        continuing {
+          x_214_phi = x_215;
+        }
+      }
+      x_253 = x_253_phi;
+      let x_254 : bool = x_254_phi;
+      x_256_phi = x_253;
+      if (x_254) {
+        break;
+      }
+      x_256_phi = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+    }
+  }
+  let x_256 : vec4<f32> = x_256_phi;
+  x_GLF_color = x_256;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/1.wgsl
new file mode 100644
index 0000000..43a6481
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/1.wgsl
@@ -0,0 +1,106 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_196 : array<i32, 256>;
+  var x_197 : array<i32, 256>;
+  var x_198 : array<i32, 256>;
+  var x_210 : vec2<i32>;
+  var x_251 : vec4<f32>;
+  var x_253 : vec4<f32>;
+  var x_214_phi : vec2<i32>;
+  var x_253_phi : vec4<f32>;
+  var x_254_phi : bool;
+  var x_256_phi : vec4<f32>;
+  let x_199 : vec4<f32> = gl_FragCoord;
+  let x_202 : vec2<f32> = x_6.resolution;
+  let x_203 : vec2<f32> = (vec2<f32>(x_199.x, x_199.y) / x_202);
+  x_210 = vec2<i32>(i32((x_203.x * 256.0)), i32((x_203.y * 256.0)));
+  switch(0u) {
+    default: {
+      x_214_phi = x_210;
+      loop {
+        var x_233 : i32;
+        var x_234 : i32;
+        var x_235_phi : i32;
+        var x_241_phi : bool;
+        let x_214 : vec2<i32> = x_214_phi;
+        let x_217 : i32 = x_214.y;
+        x_253_phi = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+        x_254_phi = false;
+        if ((x_217 != 256)) {
+        } else {
+          break;
+        }
+        let x_221 : i32 = x_214.x;
+        x_196 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+        let x_223 : i32 = x_196[x_217];
+        let x_225 : bool = (x_221 < (x_223 + 15));
+        if (x_225) {
+          x_197 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+        }
+        if (x_225) {
+          x_233 = x_197[x_217];
+          x_235_phi = x_233;
+        } else {
+          x_234 = 0;
+          x_235_phi = x_234;
+        }
+        let x_235 : i32 = x_235_phi;
+        let x_237 : bool = (x_221 > (x_235 - 15));
+        if (x_225) {
+          x_241_phi = x_237;
+        } else {
+          x_241_phi = x_225;
+        }
+        let x_241 : bool = x_241_phi;
+        if (x_241) {
+          x_198 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+          let x_245 : i32 = x_198[x_217];
+          let x_250 : f32 = ((15.0 - abs(f32((x_221 - x_245)))) * 0.06666667);
+          x_251 = vec4<f32>(x_250, x_250, x_250, 1.0);
+          x_253_phi = x_251;
+          x_254_phi = true;
+          break;
+        }
+        var x_215_1 : vec2<i32> = x_214;
+        x_215_1.y = (x_217 + 1);
+        let x_215 : vec2<i32> = x_215_1;
+
+        continuing {
+          x_214_phi = x_215;
+        }
+      }
+      x_253 = x_253_phi;
+      let x_254 : bool = x_254_phi;
+      x_256_phi = x_253;
+      if (x_254) {
+        break;
+      }
+      x_256_phi = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+    }
+  }
+  let x_256 : vec4<f32> = x_256_phi;
+  x_GLF_color = x_256;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..375d755
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/1.wgsl.expected.hlsl
@@ -0,0 +1,108 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int x_196[256] = (int[256])0;
+  int x_197[256] = (int[256])0;
+  int x_198[256] = (int[256])0;
+  int2 x_210 = int2(0, 0);
+  float4 x_251 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 x_253 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int2 x_214_phi = int2(0, 0);
+  float4 x_253_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  bool x_254_phi = false;
+  float4 x_256_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  const float4 x_199 = gl_FragCoord;
+  const float2 x_202 = asfloat(x_6[0].xy);
+  const float2 x_203 = (float2(x_199.x, x_199.y) / x_202);
+  x_210 = int2(int((x_203.x * 256.0f)), int((x_203.y * 256.0f)));
+  switch(0u) {
+    default: {
+      x_214_phi = x_210;
+      while (true) {
+        int x_233 = 0;
+        int x_234 = 0;
+        int x_235_phi = 0;
+        bool x_241_phi = false;
+        const int2 x_214 = x_214_phi;
+        const int x_217 = x_214.y;
+        x_253_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        x_254_phi = false;
+        if ((x_217 != 256)) {
+        } else {
+          break;
+        }
+        const int x_221 = x_214.x;
+        const int tint_symbol_5[256] = {115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94};
+        x_196 = tint_symbol_5;
+        const int x_223 = x_196[x_217];
+        const bool x_225 = (x_221 < (x_223 + 15));
+        if (x_225) {
+          const int tint_symbol_6[256] = {115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94};
+          x_197 = tint_symbol_6;
+        }
+        if (x_225) {
+          x_233 = x_197[x_217];
+          x_235_phi = x_233;
+        } else {
+          x_234 = 0;
+          x_235_phi = x_234;
+        }
+        const bool x_237 = (x_221 > (x_235_phi - 15));
+        if (x_225) {
+          x_241_phi = x_237;
+        } else {
+          x_241_phi = x_225;
+        }
+        if (x_241_phi) {
+          const int tint_symbol_7[256] = {115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94};
+          x_198 = tint_symbol_7;
+          const int x_245 = x_198[x_217];
+          const float x_250 = ((15.0f - abs(float((x_221 - x_245)))) * 0.06666667f);
+          x_251 = float4(x_250, x_250, x_250, 1.0f);
+          x_253_phi = x_251;
+          x_254_phi = true;
+          break;
+        }
+        int2 x_215_1 = x_214;
+        x_215_1.y = (x_217 + 1);
+        const int2 x_215 = x_215_1;
+        {
+          x_214_phi = x_215;
+        }
+      }
+      x_253 = x_253_phi;
+      const bool x_254 = x_254_phi;
+      x_256_phi = x_253;
+      if (x_254) {
+        break;
+      }
+      x_256_phi = float4(0.0f, 0.0f, 0.0f, 1.0f);
+      break;
+    }
+  }
+  x_GLF_color = x_256_phi;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_8 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_8;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/1.wgsl.expected.msl
new file mode 100644
index 0000000..72762dc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/1.wgsl.expected.msl
@@ -0,0 +1,113 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  int arr[256];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_8, thread float4* const tint_symbol_9) {
+  tint_array_wrapper x_196 = {};
+  tint_array_wrapper x_197 = {};
+  tint_array_wrapper x_198 = {};
+  int2 x_210 = 0;
+  float4 x_251 = 0.0f;
+  float4 x_253 = 0.0f;
+  int2 x_214_phi = 0;
+  float4 x_253_phi = 0.0f;
+  bool x_254_phi = false;
+  float4 x_256_phi = 0.0f;
+  float4 const x_199 = *(tint_symbol_8);
+  float2 const x_202 = x_6.resolution;
+  float2 const x_203 = (float2(x_199.x, x_199.y) / x_202);
+  x_210 = int2(int((x_203.x * 256.0f)), int((x_203.y * 256.0f)));
+  switch(0u) {
+    default: {
+      x_214_phi = x_210;
+      while (true) {
+        int x_233 = 0;
+        int x_234 = 0;
+        int x_235_phi = 0;
+        bool x_241_phi = false;
+        int2 const x_214 = x_214_phi;
+        int const x_217 = x_214.y;
+        x_253_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        x_254_phi = false;
+        if ((x_217 != 256)) {
+        } else {
+          break;
+        }
+        int const x_221 = x_214.x;
+        tint_array_wrapper const tint_symbol_4 = {.arr={115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94}};
+        x_196 = tint_symbol_4;
+        int const x_223 = x_196.arr[x_217];
+        bool const x_225 = (x_221 < (x_223 + 15));
+        if (x_225) {
+          tint_array_wrapper const tint_symbol_5 = {.arr={115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94}};
+          x_197 = tint_symbol_5;
+        }
+        if (x_225) {
+          x_233 = x_197.arr[x_217];
+          x_235_phi = x_233;
+        } else {
+          x_234 = 0;
+          x_235_phi = x_234;
+        }
+        int const x_235 = x_235_phi;
+        bool const x_237 = (x_221 > (x_235 - 15));
+        if (x_225) {
+          x_241_phi = x_237;
+        } else {
+          x_241_phi = x_225;
+        }
+        bool const x_241 = x_241_phi;
+        if (x_241) {
+          tint_array_wrapper const tint_symbol_6 = {.arr={115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94}};
+          x_198 = tint_symbol_6;
+          int const x_245 = x_198.arr[x_217];
+          float const x_250 = ((15.0f - fabs(float((x_221 - x_245)))) * 0.06666667f);
+          x_251 = float4(x_250, x_250, x_250, 1.0f);
+          x_253_phi = x_251;
+          x_254_phi = true;
+          break;
+        }
+        int2 x_215_1 = x_214;
+        x_215_1.y = (x_217 + 1);
+        int2 const x_215 = x_215_1;
+        {
+          x_214_phi = x_215;
+        }
+      }
+      x_253 = x_253_phi;
+      bool const x_254 = x_254_phi;
+      x_256_phi = x_253;
+      if (x_254) {
+        break;
+      }
+      x_256_phi = float4(0.0f, 0.0f, 0.0f, 1.0f);
+      break;
+    }
+  }
+  float4 const x_256 = x_256_phi;
+  *(tint_symbol_9) = x_256;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_10 = 0.0f;
+  thread float4 tint_symbol_11 = 0.0f;
+  tint_symbol_10 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_10), &(tint_symbol_11));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_11};
+  tint_symbol_2 const tint_symbol_7 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_7;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..cc6b7b1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/1.wgsl.expected.spvasm
@@ -0,0 +1,408 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 303
+; Schema: 0
+               OpCapability Shader
+        %267 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %x_196 "x_196"
+               OpName %x_197 "x_197"
+               OpName %x_198 "x_198"
+               OpName %x_210 "x_210"
+               OpName %x_251 "x_251"
+               OpName %x_253 "x_253"
+               OpName %x_214_phi "x_214_phi"
+               OpName %x_253_phi "x_253_phi"
+               OpName %x_254_phi "x_254_phi"
+               OpName %x_256_phi "x_256_phi"
+               OpName %x_233 "x_233"
+               OpName %x_234 "x_234"
+               OpName %x_235_phi "x_235_phi"
+               OpName %x_241_phi "x_241_phi"
+               OpName %x_215_1 "x_215_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_int_uint_256 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+   %uint_256 = OpConstant %uint 256
+%_arr_int_uint_256 = OpTypeArray %int %uint_256
+%_ptr_Function__arr_int_uint_256 = OpTypePointer Function %_arr_int_uint_256
+         %25 = OpConstantNull %_arr_int_uint_256
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %31 = OpConstantNull %v2int
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %40 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+  %float_256 = OpConstant %float 256
+%_ptr_Function_int = OpTypePointer Function %int
+         %68 = OpConstantNull %int
+    %float_0 = OpConstant %float 0
+         %75 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+      %false = OpConstantFalse %bool
+    %int_256 = OpConstant %int 256
+    %int_115 = OpConstant %int 115
+    %int_133 = OpConstant %int 133
+    %int_150 = OpConstant %int 150
+    %int_164 = OpConstant %int 164
+    %int_176 = OpConstant %int 176
+    %int_184 = OpConstant %int 184
+    %int_190 = OpConstant %int 190
+    %int_192 = OpConstant %int 192
+    %int_191 = OpConstant %int 191
+    %int_187 = OpConstant %int 187
+    %int_181 = OpConstant %int 181
+    %int_172 = OpConstant %int 172
+    %int_163 = OpConstant %int 163
+    %int_153 = OpConstant %int 153
+    %int_143 = OpConstant %int 143
+    %int_134 = OpConstant %int 134
+    %int_126 = OpConstant %int 126
+    %int_120 = OpConstant %int 120
+    %int_116 = OpConstant %int 116
+    %int_114 = OpConstant %int 114
+    %int_117 = OpConstant %int 117
+    %int_121 = OpConstant %int 121
+    %int_127 = OpConstant %int 127
+    %int_141 = OpConstant %int 141
+    %int_148 = OpConstant %int 148
+    %int_154 = OpConstant %int 154
+    %int_159 = OpConstant %int 159
+    %int_162 = OpConstant %int 162
+    %int_161 = OpConstant %int 161
+    %int_157 = OpConstant %int 157
+    %int_151 = OpConstant %int 151
+    %int_124 = OpConstant %int 124
+    %int_113 = OpConstant %int 113
+    %int_103 = OpConstant %int 103
+     %int_94 = OpConstant %int 94
+     %int_87 = OpConstant %int 87
+     %int_82 = OpConstant %int 82
+     %int_79 = OpConstant %int 79
+     %int_80 = OpConstant %int 80
+     %int_84 = OpConstant %int 84
+     %int_91 = OpConstant %int 91
+    %int_101 = OpConstant %int 101
+    %int_130 = OpConstant %int 130
+    %int_146 = OpConstant %int 146
+    %int_182 = OpConstant %int 182
+    %int_199 = OpConstant %int 199
+    %int_215 = OpConstant %int 215
+    %int_229 = OpConstant %int 229
+    %int_240 = OpConstant %int 240
+    %int_249 = OpConstant %int 249
+    %int_254 = OpConstant %int 254
+    %int_250 = OpConstant %int 250
+    %int_243 = OpConstant %int 243
+    %int_233 = OpConstant %int 233
+    %int_223 = OpConstant %int 223
+    %int_212 = OpConstant %int 212
+    %int_200 = OpConstant %int 200
+    %int_180 = OpConstant %int 180
+    %int_166 = OpConstant %int 166
+    %int_169 = OpConstant %int 169
+    %int_174 = OpConstant %int 174
+    %int_179 = OpConstant %int 179
+    %int_185 = OpConstant %int 185
+    %int_193 = OpConstant %int 193
+    %int_195 = OpConstant %int 195
+    %int_188 = OpConstant %int 188
+    %int_171 = OpConstant %int 171
+    %int_149 = OpConstant %int 149
+    %int_137 = OpConstant %int 137
+    %int_125 = OpConstant %int 125
+    %int_105 = OpConstant %int 105
+     %int_97 = OpConstant %int 97
+     %int_93 = OpConstant %int 93
+     %int_98 = OpConstant %int 98
+    %int_106 = OpConstant %int 106
+    %int_145 = OpConstant %int 145
+    %int_177 = OpConstant %int 177
+    %int_208 = OpConstant %int 208
+    %int_221 = OpConstant %int 221
+    %int_231 = OpConstant %int 231
+    %int_239 = OpConstant %int 239
+    %int_244 = OpConstant %int 244
+    %int_242 = OpConstant %int 242
+    %int_236 = OpConstant %int 236
+    %int_228 = OpConstant %int 228
+    %int_218 = OpConstant %int 218
+    %int_207 = OpConstant %int 207
+    %int_194 = OpConstant %int 194
+    %int_158 = OpConstant %int 158
+    %int_135 = OpConstant %int 135
+    %int_132 = OpConstant %int 132
+    %int_131 = OpConstant %int 131
+    %int_138 = OpConstant %int 138
+    %int_147 = OpConstant %int 147
+    %int_155 = OpConstant %int 155
+    %int_152 = OpConstant %int 152
+    %int_139 = OpConstant %int 139
+    %int_129 = OpConstant %int 129
+    %int_118 = OpConstant %int 118
+     %int_68 = OpConstant %int 68
+     %int_58 = OpConstant %int 58
+     %int_49 = OpConstant %int 49
+     %int_43 = OpConstant %int 43
+     %int_40 = OpConstant %int 40
+     %int_41 = OpConstant %int 41
+     %int_44 = OpConstant %int 44
+     %int_51 = OpConstant %int 51
+     %int_61 = OpConstant %int 61
+     %int_73 = OpConstant %int 73
+    %int_119 = OpConstant %int 119
+    %int_173 = OpConstant %int 173
+    %int_186 = OpConstant %int 186
+    %int_128 = OpConstant %int 128
+    %int_104 = OpConstant %int 104
+     %int_86 = OpConstant %int 86
+     %int_81 = OpConstant %int 81
+     %int_77 = OpConstant %int 77
+     %int_76 = OpConstant %int 76
+     %int_89 = OpConstant %int 89
+    %int_102 = OpConstant %int 102
+     %int_92 = OpConstant %int 92
+     %int_83 = OpConstant %int 83
+     %int_62 = OpConstant %int 62
+     %int_50 = OpConstant %int 50
+     %int_38 = OpConstant %int 38
+     %int_26 = OpConstant %int 26
+     %int_16 = OpConstant %int 16
+      %int_8 = OpConstant %int 8
+      %int_2 = OpConstant %int 2
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+     %int_11 = OpConstant %int 11
+     %int_21 = OpConstant %int 21
+     %int_33 = OpConstant %int 33
+     %int_48 = OpConstant %int 48
+     %int_64 = OpConstant %int 64
+    %int_144 = OpConstant %int 144
+    %int_123 = OpConstant %int 123
+    %int_112 = OpConstant %int 112
+    %int_100 = OpConstant %int 100
+     %int_90 = OpConstant %int 90
+     %int_65 = OpConstant %int 65
+     %int_67 = OpConstant %int 67
+     %int_70 = OpConstant %int 70
+     %int_75 = OpConstant %int 75
+     %int_95 = OpConstant %int 95
+     %int_88 = OpConstant %int 88
+     %int_69 = OpConstant %int 69
+     %int_47 = OpConstant %int 47
+     %int_36 = OpConstant %int 36
+     %int_18 = OpConstant %int 18
+     %int_13 = OpConstant %int 13
+     %int_15 = OpConstant %int 15
+     %int_22 = OpConstant %int 22
+     %int_32 = OpConstant %int 32
+     %int_45 = OpConstant %int 45
+     %int_60 = OpConstant %int 60
+        %240 = OpConstantComposite %_arr_int_uint_256 %int_115 %int_133 %int_150 %int_164 %int_176 %int_184 %int_190 %int_192 %int_191 %int_187 %int_181 %int_172 %int_163 %int_153 %int_143 %int_134 %int_126 %int_120 %int_116 %int_114 %int_114 %int_117 %int_121 %int_127 %int_134 %int_141 %int_148 %int_154 %int_159 %int_162 %int_163 %int_161 %int_157 %int_151 %int_143 %int_134 %int_124 %int_113 %int_103 %int_94 %int_87 %int_82 %int_79 %int_80 %int_84 %int_91 %int_101 %int_114 %int_130 %int_146 %int_164 %int_182 %int_199 %int_215 %int_229 %int_240 %int_249 %int_254 %int_256 %int_254 %int_250 %int_243 %int_233 %int_223 %int_212 %int_200 %int_190 %int_180 %int_172 %int_166 %int_163 %int_161 %int_162 %int_164 %int_169 %int_174 %int_179 %int_185 %int_190 %int_193 %int_195 %int_195 %int_192 %int_188 %int_180 %int_171 %int_161 %int_149 %int_137 %int_125 %int_114 %int_105 %int_97 %int_93 %int_91 %int_93 %int_98 %int_106 %int_117 %int_130 %int_145 %int_161 %int_177 %int_193 %int_208 %int_221 %int_231 %int_239 %int_243 %int_244 %int_242 %int_236 %int_228 %int_218 %int_207 %int_194 %int_181 %int_169 %int_158 %int_148 %int_141 %int_135 %int_132 %int_131 %int_132 %int_135 %int_138 %int_143 %int_147 %int_151 %int_154 %int_155 %int_155 %int_152 %int_146 %int_139 %int_129 %int_118 %int_106 %int_93 %int_80 %int_68 %int_58 %int_49 %int_43 %int_40 %int_41 %int_44 %int_51 %int_61 %int_73 %int_87 %int_103 %int_119 %int_134 %int_149 %int_162 %int_173 %int_181 %int_186 %int_188 %int_186 %int_181 %int_174 %int_164 %int_153 %int_141 %int_128 %int_116 %int_104 %int_94 %int_86 %int_81 %int_77 %int_76 %int_77 %int_80 %int_84 %int_89 %int_94 %int_98 %int_102 %int_104 %int_104 %int_102 %int_98 %int_92 %int_83 %int_73 %int_62 %int_50 %int_38 %int_26 %int_16 %int_8 %int_2 %int_0 %int_0 %int_4 %int_11 %int_21 %int_33 %int_48 %int_64 %int_81 %int_98 %int_114 %int_129 %int_141 %int_151 %int_158 %int_161 %int_161 %int_158 %int_152 %int_144 %int_134 %int_123 %int_112 %int_100 %int_90 %int_81 %int_73 %int_68 %int_65 %int_65 %int_67 %int_70 %int_75 %int_81 %int_87 %int_92 %int_97 %int_101 %int_103 %int_102 %int_100 %int_95 %int_88 %int_79 %int_69 %int_58 %int_47 %int_36 %int_26 %int_18 %int_13 %int_11 %int_11 %int_15 %int_22 %int_32 %int_45 %int_60 %int_77 %int_94
+   %float_15 = OpConstant %float 15
+%float_0_0666666701 = OpConstant %float 0.0666666701
+    %float_1 = OpConstant %float 1
+       %true = OpConstantTrue %bool
+     %uint_1 = OpConstant %uint 1
+      %int_1 = OpConstant %int 1
+        %288 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %290 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+      %x_196 = OpVariable %_ptr_Function__arr_int_uint_256 Function %25
+      %x_197 = OpVariable %_ptr_Function__arr_int_uint_256 Function %25
+      %x_198 = OpVariable %_ptr_Function__arr_int_uint_256 Function %25
+      %x_210 = OpVariable %_ptr_Function_v2int Function %31
+      %x_251 = OpVariable %_ptr_Function_v4float Function %5
+      %x_253 = OpVariable %_ptr_Function_v4float Function %5
+  %x_214_phi = OpVariable %_ptr_Function_v2int Function %31
+  %x_253_phi = OpVariable %_ptr_Function_v4float Function %5
+  %x_254_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_256_phi = OpVariable %_ptr_Function_v4float Function %5
+      %x_233 = OpVariable %_ptr_Function_int Function %68
+      %x_234 = OpVariable %_ptr_Function_int Function %68
+  %x_235_phi = OpVariable %_ptr_Function_int Function %68
+  %x_241_phi = OpVariable %_ptr_Function_bool Function %40
+    %x_215_1 = OpVariable %_ptr_Function_v2int Function %31
+         %42 = OpLoad %v4float %gl_FragCoord
+         %45 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %46 = OpLoad %v2float %45
+         %47 = OpCompositeExtract %float %42 0
+         %48 = OpCompositeExtract %float %42 1
+         %49 = OpCompositeConstruct %v2float %47 %48
+         %50 = OpFDiv %v2float %49 %46
+         %52 = OpCompositeExtract %float %50 0
+         %54 = OpFMul %float %52 %float_256
+         %51 = OpConvertFToS %int %54
+         %56 = OpCompositeExtract %float %50 1
+         %57 = OpFMul %float %56 %float_256
+         %55 = OpConvertFToS %int %57
+         %58 = OpCompositeConstruct %v2int %51 %55
+               OpStore %x_210 %58
+               OpSelectionMerge %59 None
+               OpSwitch %uint_0 %60
+         %60 = OpLabel
+         %61 = OpLoad %v2int %x_210
+               OpStore %x_214_phi %61
+               OpBranch %62
+         %62 = OpLabel
+               OpLoopMerge %63 %64 None
+               OpBranch %65
+         %65 = OpLabel
+         %72 = OpLoad %v2int %x_214_phi
+         %73 = OpCompositeExtract %int %72 1
+               OpStore %x_253_phi %75
+               OpStore %x_254_phi %false
+         %78 = OpINotEqual %bool %73 %int_256
+               OpSelectionMerge %79 None
+               OpBranchConditional %78 %80 %81
+         %80 = OpLabel
+               OpBranch %79
+         %81 = OpLabel
+               OpBranch %63
+         %79 = OpLabel
+         %82 = OpCompositeExtract %int %72 0
+               OpStore %x_196 %240
+        %241 = OpAccessChain %_ptr_Function_int %x_196 %73
+        %242 = OpLoad %int %241
+        %243 = OpIAdd %int %242 %int_15
+        %244 = OpSLessThan %bool %82 %243
+               OpSelectionMerge %245 None
+               OpBranchConditional %244 %246 %245
+        %246 = OpLabel
+               OpStore %x_197 %240
+               OpBranch %245
+        %245 = OpLabel
+               OpSelectionMerge %247 None
+               OpBranchConditional %244 %248 %249
+        %248 = OpLabel
+        %250 = OpAccessChain %_ptr_Function_int %x_197 %73
+        %251 = OpLoad %int %250
+               OpStore %x_233 %251
+        %252 = OpLoad %int %x_233
+               OpStore %x_235_phi %252
+               OpBranch %247
+        %249 = OpLabel
+               OpStore %x_234 %int_0
+        %253 = OpLoad %int %x_234
+               OpStore %x_235_phi %253
+               OpBranch %247
+        %247 = OpLabel
+        %254 = OpLoad %int %x_235_phi
+        %255 = OpISub %int %254 %int_15
+        %256 = OpSGreaterThan %bool %82 %255
+               OpSelectionMerge %257 None
+               OpBranchConditional %244 %258 %259
+        %258 = OpLabel
+               OpStore %x_241_phi %256
+               OpBranch %257
+        %259 = OpLabel
+               OpStore %x_241_phi %244
+               OpBranch %257
+        %257 = OpLabel
+        %260 = OpLoad %bool %x_241_phi
+               OpSelectionMerge %261 None
+               OpBranchConditional %260 %262 %261
+        %262 = OpLabel
+               OpStore %x_198 %240
+        %263 = OpAccessChain %_ptr_Function_int %x_198 %73
+        %264 = OpLoad %int %263
+        %269 = OpISub %int %82 %264
+        %268 = OpConvertSToF %float %269
+        %266 = OpExtInst %float %267 FAbs %268
+        %270 = OpFSub %float %float_15 %266
+        %272 = OpFMul %float %270 %float_0_0666666701
+        %274 = OpCompositeConstruct %v4float %272 %272 %272 %float_1
+               OpStore %x_251 %274
+        %275 = OpLoad %v4float %x_251
+               OpStore %x_253_phi %275
+               OpStore %x_254_phi %true
+               OpBranch %63
+        %261 = OpLabel
+               OpStore %x_215_1 %72
+        %279 = OpAccessChain %_ptr_Function_int %x_215_1 %uint_1
+        %281 = OpIAdd %int %73 %int_1
+               OpStore %279 %281
+        %282 = OpLoad %v2int %x_215_1
+               OpBranch %64
+         %64 = OpLabel
+               OpStore %x_214_phi %282
+               OpBranch %62
+         %63 = OpLabel
+        %283 = OpLoad %v4float %x_253_phi
+               OpStore %x_253 %283
+        %284 = OpLoad %bool %x_254_phi
+        %285 = OpLoad %v4float %x_253
+               OpStore %x_256_phi %285
+               OpSelectionMerge %286 None
+               OpBranchConditional %284 %287 %286
+        %287 = OpLabel
+               OpBranch %59
+        %286 = OpLabel
+               OpStore %x_256_phi %288
+               OpBranch %59
+         %59 = OpLabel
+        %289 = OpLoad %v4float %x_256_phi
+               OpStore %x_GLF_color %289
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %290
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %294 = OpLabel
+        %295 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %295
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %297 = OpLabel
+        %298 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %298
+        %299 = OpFunctionCall %void %main_1
+        %301 = OpLoad %v4float %x_GLF_color
+        %302 = OpCompositeConstruct %main_out %301
+        %300 = OpFunctionCall %void %tint_symbol_3 %302
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..43a6481
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/1.wgsl.expected.wgsl
@@ -0,0 +1,106 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_196 : array<i32, 256>;
+  var x_197 : array<i32, 256>;
+  var x_198 : array<i32, 256>;
+  var x_210 : vec2<i32>;
+  var x_251 : vec4<f32>;
+  var x_253 : vec4<f32>;
+  var x_214_phi : vec2<i32>;
+  var x_253_phi : vec4<f32>;
+  var x_254_phi : bool;
+  var x_256_phi : vec4<f32>;
+  let x_199 : vec4<f32> = gl_FragCoord;
+  let x_202 : vec2<f32> = x_6.resolution;
+  let x_203 : vec2<f32> = (vec2<f32>(x_199.x, x_199.y) / x_202);
+  x_210 = vec2<i32>(i32((x_203.x * 256.0)), i32((x_203.y * 256.0)));
+  switch(0u) {
+    default: {
+      x_214_phi = x_210;
+      loop {
+        var x_233 : i32;
+        var x_234 : i32;
+        var x_235_phi : i32;
+        var x_241_phi : bool;
+        let x_214 : vec2<i32> = x_214_phi;
+        let x_217 : i32 = x_214.y;
+        x_253_phi = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+        x_254_phi = false;
+        if ((x_217 != 256)) {
+        } else {
+          break;
+        }
+        let x_221 : i32 = x_214.x;
+        x_196 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+        let x_223 : i32 = x_196[x_217];
+        let x_225 : bool = (x_221 < (x_223 + 15));
+        if (x_225) {
+          x_197 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+        }
+        if (x_225) {
+          x_233 = x_197[x_217];
+          x_235_phi = x_233;
+        } else {
+          x_234 = 0;
+          x_235_phi = x_234;
+        }
+        let x_235 : i32 = x_235_phi;
+        let x_237 : bool = (x_221 > (x_235 - 15));
+        if (x_225) {
+          x_241_phi = x_237;
+        } else {
+          x_241_phi = x_225;
+        }
+        let x_241 : bool = x_241_phi;
+        if (x_241) {
+          x_198 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+          let x_245 : i32 = x_198[x_217];
+          let x_250 : f32 = ((15.0 - abs(f32((x_221 - x_245)))) * 0.06666667);
+          x_251 = vec4<f32>(x_250, x_250, x_250, 1.0);
+          x_253_phi = x_251;
+          x_254_phi = true;
+          break;
+        }
+        var x_215_1 : vec2<i32> = x_214;
+        x_215_1.y = (x_217 + 1);
+        let x_215 : vec2<i32> = x_215_1;
+
+        continuing {
+          x_214_phi = x_215;
+        }
+      }
+      x_253 = x_253_phi;
+      let x_254 : bool = x_254_phi;
+      x_256_phi = x_253;
+      if (x_254) {
+        break;
+      }
+      x_256_phi = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+    }
+  }
+  let x_256 : vec4<f32> = x_256_phi;
+  x_GLF_color = x_256;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/2.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/2.spvasm
new file mode 100644
index 0000000..0093895
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/2.spvasm
@@ -0,0 +1,299 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+       %uint = OpTypeInt 32 0
+%_ptr_Function_int = OpTypePointer Function %int
+    %int_256 = OpConstant %int 256
+       %bool = OpTypeBool
+     %uint_0 = OpConstant %uint 0
+   %uint_256 = OpConstant %uint 256
+%_arr_int_uint_256 = OpTypeArray %int %uint_256
+    %int_115 = OpConstant %int 115
+    %int_133 = OpConstant %int 133
+    %int_150 = OpConstant %int 150
+    %int_164 = OpConstant %int 164
+    %int_176 = OpConstant %int 176
+    %int_184 = OpConstant %int 184
+    %int_190 = OpConstant %int 190
+    %int_192 = OpConstant %int 192
+    %int_191 = OpConstant %int 191
+    %int_187 = OpConstant %int 187
+    %int_181 = OpConstant %int 181
+    %int_172 = OpConstant %int 172
+    %int_163 = OpConstant %int 163
+    %int_153 = OpConstant %int 153
+    %int_143 = OpConstant %int 143
+    %int_134 = OpConstant %int 134
+    %int_126 = OpConstant %int 126
+    %int_120 = OpConstant %int 120
+    %int_116 = OpConstant %int 116
+    %int_114 = OpConstant %int 114
+    %int_117 = OpConstant %int 117
+    %int_121 = OpConstant %int 121
+    %int_127 = OpConstant %int 127
+    %int_141 = OpConstant %int 141
+    %int_148 = OpConstant %int 148
+    %int_154 = OpConstant %int 154
+    %int_159 = OpConstant %int 159
+    %int_162 = OpConstant %int 162
+    %int_161 = OpConstant %int 161
+    %int_157 = OpConstant %int 157
+    %int_151 = OpConstant %int 151
+    %int_124 = OpConstant %int 124
+    %int_113 = OpConstant %int 113
+    %int_103 = OpConstant %int 103
+     %int_94 = OpConstant %int 94
+     %int_87 = OpConstant %int 87
+     %int_82 = OpConstant %int 82
+     %int_79 = OpConstant %int 79
+     %int_80 = OpConstant %int 80
+     %int_84 = OpConstant %int 84
+     %int_91 = OpConstant %int 91
+    %int_101 = OpConstant %int 101
+    %int_130 = OpConstant %int 130
+    %int_146 = OpConstant %int 146
+    %int_182 = OpConstant %int 182
+    %int_199 = OpConstant %int 199
+    %int_215 = OpConstant %int 215
+    %int_229 = OpConstant %int 229
+    %int_240 = OpConstant %int 240
+    %int_249 = OpConstant %int 249
+    %int_254 = OpConstant %int 254
+    %int_250 = OpConstant %int 250
+    %int_243 = OpConstant %int 243
+    %int_233 = OpConstant %int 233
+    %int_223 = OpConstant %int 223
+    %int_212 = OpConstant %int 212
+    %int_200 = OpConstant %int 200
+    %int_180 = OpConstant %int 180
+    %int_166 = OpConstant %int 166
+    %int_169 = OpConstant %int 169
+    %int_174 = OpConstant %int 174
+    %int_179 = OpConstant %int 179
+    %int_185 = OpConstant %int 185
+    %int_193 = OpConstant %int 193
+    %int_195 = OpConstant %int 195
+    %int_188 = OpConstant %int 188
+    %int_171 = OpConstant %int 171
+    %int_149 = OpConstant %int 149
+    %int_137 = OpConstant %int 137
+    %int_125 = OpConstant %int 125
+    %int_105 = OpConstant %int 105
+     %int_97 = OpConstant %int 97
+     %int_93 = OpConstant %int 93
+     %int_98 = OpConstant %int 98
+    %int_106 = OpConstant %int 106
+    %int_145 = OpConstant %int 145
+    %int_177 = OpConstant %int 177
+    %int_208 = OpConstant %int 208
+    %int_221 = OpConstant %int 221
+    %int_231 = OpConstant %int 231
+    %int_239 = OpConstant %int 239
+    %int_244 = OpConstant %int 244
+    %int_242 = OpConstant %int 242
+    %int_236 = OpConstant %int 236
+    %int_228 = OpConstant %int 228
+    %int_218 = OpConstant %int 218
+    %int_207 = OpConstant %int 207
+    %int_194 = OpConstant %int 194
+    %int_158 = OpConstant %int 158
+    %int_135 = OpConstant %int 135
+    %int_132 = OpConstant %int 132
+    %int_131 = OpConstant %int 131
+    %int_138 = OpConstant %int 138
+    %int_147 = OpConstant %int 147
+    %int_155 = OpConstant %int 155
+    %int_152 = OpConstant %int 152
+    %int_139 = OpConstant %int 139
+    %int_129 = OpConstant %int 129
+    %int_118 = OpConstant %int 118
+     %int_68 = OpConstant %int 68
+     %int_58 = OpConstant %int 58
+     %int_49 = OpConstant %int 49
+     %int_43 = OpConstant %int 43
+     %int_40 = OpConstant %int 40
+     %int_41 = OpConstant %int 41
+     %int_44 = OpConstant %int 44
+     %int_51 = OpConstant %int 51
+     %int_61 = OpConstant %int 61
+     %int_73 = OpConstant %int 73
+    %int_119 = OpConstant %int 119
+    %int_173 = OpConstant %int 173
+    %int_186 = OpConstant %int 186
+    %int_128 = OpConstant %int 128
+    %int_104 = OpConstant %int 104
+     %int_86 = OpConstant %int 86
+     %int_81 = OpConstant %int 81
+     %int_77 = OpConstant %int 77
+     %int_76 = OpConstant %int 76
+     %int_89 = OpConstant %int 89
+    %int_102 = OpConstant %int 102
+     %int_92 = OpConstant %int 92
+     %int_83 = OpConstant %int 83
+     %int_62 = OpConstant %int 62
+     %int_50 = OpConstant %int 50
+     %int_38 = OpConstant %int 38
+     %int_26 = OpConstant %int 26
+     %int_16 = OpConstant %int 16
+      %int_8 = OpConstant %int 8
+      %int_2 = OpConstant %int 2
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+     %int_11 = OpConstant %int 11
+     %int_21 = OpConstant %int 21
+     %int_33 = OpConstant %int 33
+     %int_48 = OpConstant %int 48
+     %int_64 = OpConstant %int 64
+    %int_144 = OpConstant %int 144
+    %int_123 = OpConstant %int 123
+    %int_112 = OpConstant %int 112
+    %int_100 = OpConstant %int 100
+     %int_90 = OpConstant %int 90
+     %int_65 = OpConstant %int 65
+     %int_67 = OpConstant %int 67
+     %int_70 = OpConstant %int 70
+     %int_75 = OpConstant %int 75
+     %int_95 = OpConstant %int 95
+     %int_88 = OpConstant %int 88
+     %int_69 = OpConstant %int 69
+     %int_47 = OpConstant %int 47
+     %int_36 = OpConstant %int 36
+     %int_18 = OpConstant %int 18
+     %int_13 = OpConstant %int 13
+     %int_15 = OpConstant %int 15
+     %int_22 = OpConstant %int 22
+     %int_32 = OpConstant %int 32
+     %int_45 = OpConstant %int 45
+     %int_60 = OpConstant %int 60
+        %177 = OpConstantComposite %_arr_int_uint_256 %int_115 %int_133 %int_150 %int_164 %int_176 %int_184 %int_190 %int_192 %int_191 %int_187 %int_181 %int_172 %int_163 %int_153 %int_143 %int_134 %int_126 %int_120 %int_116 %int_114 %int_114 %int_117 %int_121 %int_127 %int_134 %int_141 %int_148 %int_154 %int_159 %int_162 %int_163 %int_161 %int_157 %int_151 %int_143 %int_134 %int_124 %int_113 %int_103 %int_94 %int_87 %int_82 %int_79 %int_80 %int_84 %int_91 %int_101 %int_114 %int_130 %int_146 %int_164 %int_182 %int_199 %int_215 %int_229 %int_240 %int_249 %int_254 %int_256 %int_254 %int_250 %int_243 %int_233 %int_223 %int_212 %int_200 %int_190 %int_180 %int_172 %int_166 %int_163 %int_161 %int_162 %int_164 %int_169 %int_174 %int_179 %int_185 %int_190 %int_193 %int_195 %int_195 %int_192 %int_188 %int_180 %int_171 %int_161 %int_149 %int_137 %int_125 %int_114 %int_105 %int_97 %int_93 %int_91 %int_93 %int_98 %int_106 %int_117 %int_130 %int_145 %int_161 %int_177 %int_193 %int_208 %int_221 %int_231 %int_239 %int_243 %int_244 %int_242 %int_236 %int_228 %int_218 %int_207 %int_194 %int_181 %int_169 %int_158 %int_148 %int_141 %int_135 %int_132 %int_131 %int_132 %int_135 %int_138 %int_143 %int_147 %int_151 %int_154 %int_155 %int_155 %int_152 %int_146 %int_139 %int_129 %int_118 %int_106 %int_93 %int_80 %int_68 %int_58 %int_49 %int_43 %int_40 %int_41 %int_44 %int_51 %int_61 %int_73 %int_87 %int_103 %int_119 %int_134 %int_149 %int_162 %int_173 %int_181 %int_186 %int_188 %int_186 %int_181 %int_174 %int_164 %int_153 %int_141 %int_128 %int_116 %int_104 %int_94 %int_86 %int_81 %int_77 %int_76 %int_77 %int_80 %int_84 %int_89 %int_94 %int_98 %int_102 %int_104 %int_104 %int_102 %int_98 %int_92 %int_83 %int_73 %int_62 %int_50 %int_38 %int_26 %int_16 %int_8 %int_2 %int_0 %int_0 %int_4 %int_11 %int_21 %int_33 %int_48 %int_64 %int_81 %int_98 %int_114 %int_129 %int_141 %int_151 %int_158 %int_161 %int_161 %int_158 %int_152 %int_144 %int_134 %int_123 %int_112 %int_100 %int_90 %int_81 %int_73 %int_68 %int_65 %int_65 %int_67 %int_70 %int_75 %int_81 %int_87 %int_92 %int_97 %int_101 %int_103 %int_102 %int_100 %int_95 %int_88 %int_79 %int_69 %int_58 %int_47 %int_36 %int_26 %int_18 %int_13 %int_11 %int_11 %int_15 %int_22 %int_32 %int_45 %int_60 %int_77 %int_94
+%_ptr_Function__arr_int_uint_256 = OpTypePointer Function %_arr_int_uint_256
+   %float_15 = OpConstant %float 15
+    %float_1 = OpConstant %float 1
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+        %183 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+    %v2float = OpTypeVector %float 2
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+  %float_256 = OpConstant %float 256
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+      %false = OpConstantFalse %bool
+       %true = OpConstantTrue %bool
+        %192 = OpUndef %v4float
+%float_0_0666666701 = OpConstant %float 0.0666666701
+    %int_0_0 = OpConstant %int 0
+       %main = OpFunction %void None %8
+        %195 = OpLabel
+        %196 = OpVariable %_ptr_Function__arr_int_uint_256 Function
+        %197 = OpVariable %_ptr_Function__arr_int_uint_256 Function
+        %198 = OpVariable %_ptr_Function__arr_int_uint_256 Function
+        %199 = OpLoad %v4float %gl_FragCoord
+        %200 = OpVectorShuffle %v2float %199 %199 0 1
+        %201 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+        %202 = OpLoad %v2float %201
+        %203 = OpFDiv %v2float %200 %202
+        %204 = OpCompositeExtract %float %203 0
+        %205 = OpFMul %float %204 %float_256
+        %206 = OpConvertFToS %int %205
+        %207 = OpCompositeExtract %float %203 1
+        %208 = OpFMul %float %207 %float_256
+        %209 = OpConvertFToS %int %208
+        %210 = OpCompositeConstruct %v2int %206 %209
+               OpSelectionMerge %211 None
+               OpSwitch %uint_0 %212
+        %212 = OpLabel
+               OpBranch %213
+        %213 = OpLabel
+        %214 = OpPhi %v2int %210 %212 %215 %216
+        %217 = OpCompositeExtract %int %214 1
+        %218 = OpINotEqual %bool %217 %int_256
+               OpLoopMerge %219 %216 None
+               OpBranchConditional %218 %220 %219
+        %220 = OpLabel
+        %221 = OpCompositeExtract %int %214 0
+               OpStore %196 %177
+        %222 = OpAccessChain %_ptr_Function_int %196 %217
+        %223 = OpLoad %int %222
+        %224 = OpIAdd %int %223 %int_15
+        %225 = OpSLessThan %bool %221 %224
+               OpBranch %226
+        %226 = OpLabel
+               OpSelectionMerge %227 None
+               OpBranchConditional %225 %228 %227
+        %228 = OpLabel
+               OpStore %197 %177
+               OpBranch %227
+        %227 = OpLabel
+        %229 = OpAccessChain %_ptr_Function_int %197 %217
+               OpSelectionMerge %230 None
+               OpBranchConditional %225 %231 %232
+        %231 = OpLabel
+        %233 = OpLoad %int %229
+               OpBranch %230
+        %232 = OpLabel
+        %234 = OpCopyObject %int %int_0_0
+               OpBranch %230
+        %230 = OpLabel
+        %235 = OpPhi %int %233 %231 %234 %232
+        %236 = OpISub %int %235 %int_15
+        %237 = OpSGreaterThan %bool %221 %236
+               OpBranch %238
+        %238 = OpLabel
+        %239 = OpSelect %bool %225 %237 %225
+               OpSelectionMerge %240 None
+               OpBranchConditional %239 %241 %240
+        %241 = OpLabel
+               OpStore %198 %177
+        %242 = OpAccessChain %_ptr_Function_int %198 %217
+        %243 = OpLoad %int %242
+        %244 = OpISub %int %221 %243
+        %245 = OpConvertSToF %float %244
+        %246 = OpExtInst %float %1 FAbs %245
+        %247 = OpFSub %float %float_15 %246
+        %248 = OpFMul %float %247 %float_0_0666666701
+        %249 = OpCompositeConstruct %v4float %248 %248 %248 %float_1
+               OpBranch %219
+        %240 = OpLabel
+        %250 = OpIAdd %int %217 %int_1
+        %215 = OpCompositeInsert %v2int %250 %214 1
+               OpBranch %216
+        %216 = OpLabel
+               OpBranch %213
+        %219 = OpLabel
+        %251 = OpPhi %v4float %192 %213 %249 %241
+        %252 = OpPhi %bool %false %213 %true %241
+               OpSelectionMerge %253 None
+               OpBranchConditional %252 %211 %253
+        %253 = OpLabel
+               OpBranch %211
+        %211 = OpLabel
+        %254 = OpPhi %v4float %251 %219 %183 %253
+               OpStore %_GLF_color %254
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/2.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/2.spvasm.expected.hlsl
new file mode 100644
index 0000000..0614b0d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/2.spvasm.expected.hlsl
@@ -0,0 +1,102 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int x_196[256] = (int[256])0;
+  int x_197[256] = (int[256])0;
+  int x_198[256] = (int[256])0;
+  int2 x_210 = int2(0, 0);
+  float4 x_249 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 x_251 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int2 x_214_phi = int2(0, 0);
+  float4 x_251_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  bool x_252_phi = false;
+  float4 x_254_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  const float4 x_199 = gl_FragCoord;
+  const float2 x_202 = asfloat(x_6[0].xy);
+  const float2 x_203 = (float2(x_199.x, x_199.y) / x_202);
+  x_210 = int2(int((x_203.x * 256.0f)), int((x_203.y * 256.0f)));
+  switch(0u) {
+    default: {
+      x_214_phi = x_210;
+      while (true) {
+        int x_233 = 0;
+        int x_234 = 0;
+        int x_235_phi = 0;
+        const int2 x_214 = x_214_phi;
+        const int x_217 = x_214.y;
+        x_251_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        x_252_phi = false;
+        if ((x_217 != 256)) {
+        } else {
+          break;
+        }
+        const int x_221 = x_214.x;
+        const int tint_symbol_5[256] = {115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94};
+        x_196 = tint_symbol_5;
+        const int x_223 = x_196[x_217];
+        const bool x_225 = (x_221 < (x_223 + 15));
+        if (x_225) {
+          const int tint_symbol_6[256] = {115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94};
+          x_197 = tint_symbol_6;
+        }
+        if (x_225) {
+          x_233 = x_197[x_217];
+          x_235_phi = x_233;
+        } else {
+          x_234 = 0;
+          x_235_phi = x_234;
+        }
+        const bool x_237 = (x_221 > (x_235_phi - 15));
+        if ((x_225 ? x_237 : x_225)) {
+          const int tint_symbol_7[256] = {115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94};
+          x_198 = tint_symbol_7;
+          const int x_243 = x_198[x_217];
+          const float x_248 = ((15.0f - abs(float((x_221 - x_243)))) * 0.06666667f);
+          x_249 = float4(x_248, x_248, x_248, 1.0f);
+          x_251_phi = x_249;
+          x_252_phi = true;
+          break;
+        }
+        int2 x_215_1 = x_214;
+        x_215_1.y = (x_217 + 1);
+        const int2 x_215 = x_215_1;
+        {
+          x_214_phi = x_215;
+        }
+      }
+      x_251 = x_251_phi;
+      const bool x_252 = x_252_phi;
+      x_254_phi = x_251;
+      if (x_252) {
+        break;
+      }
+      x_254_phi = float4(0.0f, 0.0f, 0.0f, 1.0f);
+      break;
+    }
+  }
+  x_GLF_color = x_254_phi;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_8 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_8;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/2.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/2.spvasm.expected.msl
new file mode 100644
index 0000000..0b8a803
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/2.spvasm.expected.msl
@@ -0,0 +1,106 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  int arr[256];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_8, thread float4* const tint_symbol_9) {
+  tint_array_wrapper x_196 = {};
+  tint_array_wrapper x_197 = {};
+  tint_array_wrapper x_198 = {};
+  int2 x_210 = 0;
+  float4 x_249 = 0.0f;
+  float4 x_251 = 0.0f;
+  int2 x_214_phi = 0;
+  float4 x_251_phi = 0.0f;
+  bool x_252_phi = false;
+  float4 x_254_phi = 0.0f;
+  float4 const x_199 = *(tint_symbol_8);
+  float2 const x_202 = x_6.resolution;
+  float2 const x_203 = (float2(x_199.x, x_199.y) / x_202);
+  x_210 = int2(int((x_203.x * 256.0f)), int((x_203.y * 256.0f)));
+  switch(0u) {
+    default: {
+      x_214_phi = x_210;
+      while (true) {
+        int x_233 = 0;
+        int x_234 = 0;
+        int x_235_phi = 0;
+        int2 const x_214 = x_214_phi;
+        int const x_217 = x_214.y;
+        x_251_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        x_252_phi = false;
+        if ((x_217 != 256)) {
+        } else {
+          break;
+        }
+        int const x_221 = x_214.x;
+        tint_array_wrapper const tint_symbol_4 = {.arr={115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94}};
+        x_196 = tint_symbol_4;
+        int const x_223 = x_196.arr[x_217];
+        bool const x_225 = (x_221 < (x_223 + 15));
+        if (x_225) {
+          tint_array_wrapper const tint_symbol_5 = {.arr={115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94}};
+          x_197 = tint_symbol_5;
+        }
+        if (x_225) {
+          x_233 = x_197.arr[x_217];
+          x_235_phi = x_233;
+        } else {
+          x_234 = 0;
+          x_235_phi = x_234;
+        }
+        int const x_235 = x_235_phi;
+        bool const x_237 = (x_221 > (x_235 - 15));
+        if (select(x_225, x_237, x_225)) {
+          tint_array_wrapper const tint_symbol_6 = {.arr={115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94}};
+          x_198 = tint_symbol_6;
+          int const x_243 = x_198.arr[x_217];
+          float const x_248 = ((15.0f - fabs(float((x_221 - x_243)))) * 0.06666667f);
+          x_249 = float4(x_248, x_248, x_248, 1.0f);
+          x_251_phi = x_249;
+          x_252_phi = true;
+          break;
+        }
+        int2 x_215_1 = x_214;
+        x_215_1.y = (x_217 + 1);
+        int2 const x_215 = x_215_1;
+        {
+          x_214_phi = x_215;
+        }
+      }
+      x_251 = x_251_phi;
+      bool const x_252 = x_252_phi;
+      x_254_phi = x_251;
+      if (x_252) {
+        break;
+      }
+      x_254_phi = float4(0.0f, 0.0f, 0.0f, 1.0f);
+      break;
+    }
+  }
+  float4 const x_254 = x_254_phi;
+  *(tint_symbol_9) = x_254;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_10 = 0.0f;
+  thread float4 tint_symbol_11 = 0.0f;
+  tint_symbol_10 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_10), &(tint_symbol_11));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_11};
+  tint_symbol_2 const tint_symbol_7 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_7;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/2.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/2.spvasm.expected.spvasm
new file mode 100644
index 0000000..ace8cfb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/2.spvasm.expected.spvasm
@@ -0,0 +1,397 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 299
+; Schema: 0
+               OpCapability Shader
+        %263 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %x_196 "x_196"
+               OpName %x_197 "x_197"
+               OpName %x_198 "x_198"
+               OpName %x_210 "x_210"
+               OpName %x_249 "x_249"
+               OpName %x_251 "x_251"
+               OpName %x_214_phi "x_214_phi"
+               OpName %x_251_phi "x_251_phi"
+               OpName %x_252_phi "x_252_phi"
+               OpName %x_254_phi "x_254_phi"
+               OpName %x_233 "x_233"
+               OpName %x_234 "x_234"
+               OpName %x_235_phi "x_235_phi"
+               OpName %x_215_1 "x_215_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_int_uint_256 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+   %uint_256 = OpConstant %uint 256
+%_arr_int_uint_256 = OpTypeArray %int %uint_256
+%_ptr_Function__arr_int_uint_256 = OpTypePointer Function %_arr_int_uint_256
+         %25 = OpConstantNull %_arr_int_uint_256
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %31 = OpConstantNull %v2int
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %40 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+  %float_256 = OpConstant %float 256
+%_ptr_Function_int = OpTypePointer Function %int
+         %68 = OpConstantNull %int
+    %float_0 = OpConstant %float 0
+         %74 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+      %false = OpConstantFalse %bool
+    %int_256 = OpConstant %int 256
+    %int_115 = OpConstant %int 115
+    %int_133 = OpConstant %int 133
+    %int_150 = OpConstant %int 150
+    %int_164 = OpConstant %int 164
+    %int_176 = OpConstant %int 176
+    %int_184 = OpConstant %int 184
+    %int_190 = OpConstant %int 190
+    %int_192 = OpConstant %int 192
+    %int_191 = OpConstant %int 191
+    %int_187 = OpConstant %int 187
+    %int_181 = OpConstant %int 181
+    %int_172 = OpConstant %int 172
+    %int_163 = OpConstant %int 163
+    %int_153 = OpConstant %int 153
+    %int_143 = OpConstant %int 143
+    %int_134 = OpConstant %int 134
+    %int_126 = OpConstant %int 126
+    %int_120 = OpConstant %int 120
+    %int_116 = OpConstant %int 116
+    %int_114 = OpConstant %int 114
+    %int_117 = OpConstant %int 117
+    %int_121 = OpConstant %int 121
+    %int_127 = OpConstant %int 127
+    %int_141 = OpConstant %int 141
+    %int_148 = OpConstant %int 148
+    %int_154 = OpConstant %int 154
+    %int_159 = OpConstant %int 159
+    %int_162 = OpConstant %int 162
+    %int_161 = OpConstant %int 161
+    %int_157 = OpConstant %int 157
+    %int_151 = OpConstant %int 151
+    %int_124 = OpConstant %int 124
+    %int_113 = OpConstant %int 113
+    %int_103 = OpConstant %int 103
+     %int_94 = OpConstant %int 94
+     %int_87 = OpConstant %int 87
+     %int_82 = OpConstant %int 82
+     %int_79 = OpConstant %int 79
+     %int_80 = OpConstant %int 80
+     %int_84 = OpConstant %int 84
+     %int_91 = OpConstant %int 91
+    %int_101 = OpConstant %int 101
+    %int_130 = OpConstant %int 130
+    %int_146 = OpConstant %int 146
+    %int_182 = OpConstant %int 182
+    %int_199 = OpConstant %int 199
+    %int_215 = OpConstant %int 215
+    %int_229 = OpConstant %int 229
+    %int_240 = OpConstant %int 240
+    %int_249 = OpConstant %int 249
+    %int_254 = OpConstant %int 254
+    %int_250 = OpConstant %int 250
+    %int_243 = OpConstant %int 243
+    %int_233 = OpConstant %int 233
+    %int_223 = OpConstant %int 223
+    %int_212 = OpConstant %int 212
+    %int_200 = OpConstant %int 200
+    %int_180 = OpConstant %int 180
+    %int_166 = OpConstant %int 166
+    %int_169 = OpConstant %int 169
+    %int_174 = OpConstant %int 174
+    %int_179 = OpConstant %int 179
+    %int_185 = OpConstant %int 185
+    %int_193 = OpConstant %int 193
+    %int_195 = OpConstant %int 195
+    %int_188 = OpConstant %int 188
+    %int_171 = OpConstant %int 171
+    %int_149 = OpConstant %int 149
+    %int_137 = OpConstant %int 137
+    %int_125 = OpConstant %int 125
+    %int_105 = OpConstant %int 105
+     %int_97 = OpConstant %int 97
+     %int_93 = OpConstant %int 93
+     %int_98 = OpConstant %int 98
+    %int_106 = OpConstant %int 106
+    %int_145 = OpConstant %int 145
+    %int_177 = OpConstant %int 177
+    %int_208 = OpConstant %int 208
+    %int_221 = OpConstant %int 221
+    %int_231 = OpConstant %int 231
+    %int_239 = OpConstant %int 239
+    %int_244 = OpConstant %int 244
+    %int_242 = OpConstant %int 242
+    %int_236 = OpConstant %int 236
+    %int_228 = OpConstant %int 228
+    %int_218 = OpConstant %int 218
+    %int_207 = OpConstant %int 207
+    %int_194 = OpConstant %int 194
+    %int_158 = OpConstant %int 158
+    %int_135 = OpConstant %int 135
+    %int_132 = OpConstant %int 132
+    %int_131 = OpConstant %int 131
+    %int_138 = OpConstant %int 138
+    %int_147 = OpConstant %int 147
+    %int_155 = OpConstant %int 155
+    %int_152 = OpConstant %int 152
+    %int_139 = OpConstant %int 139
+    %int_129 = OpConstant %int 129
+    %int_118 = OpConstant %int 118
+     %int_68 = OpConstant %int 68
+     %int_58 = OpConstant %int 58
+     %int_49 = OpConstant %int 49
+     %int_43 = OpConstant %int 43
+     %int_40 = OpConstant %int 40
+     %int_41 = OpConstant %int 41
+     %int_44 = OpConstant %int 44
+     %int_51 = OpConstant %int 51
+     %int_61 = OpConstant %int 61
+     %int_73 = OpConstant %int 73
+    %int_119 = OpConstant %int 119
+    %int_173 = OpConstant %int 173
+    %int_186 = OpConstant %int 186
+    %int_128 = OpConstant %int 128
+    %int_104 = OpConstant %int 104
+     %int_86 = OpConstant %int 86
+     %int_81 = OpConstant %int 81
+     %int_77 = OpConstant %int 77
+     %int_76 = OpConstant %int 76
+     %int_89 = OpConstant %int 89
+    %int_102 = OpConstant %int 102
+     %int_92 = OpConstant %int 92
+     %int_83 = OpConstant %int 83
+     %int_62 = OpConstant %int 62
+     %int_50 = OpConstant %int 50
+     %int_38 = OpConstant %int 38
+     %int_26 = OpConstant %int 26
+     %int_16 = OpConstant %int 16
+      %int_8 = OpConstant %int 8
+      %int_2 = OpConstant %int 2
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+     %int_11 = OpConstant %int 11
+     %int_21 = OpConstant %int 21
+     %int_33 = OpConstant %int 33
+     %int_48 = OpConstant %int 48
+     %int_64 = OpConstant %int 64
+    %int_144 = OpConstant %int 144
+    %int_123 = OpConstant %int 123
+    %int_112 = OpConstant %int 112
+    %int_100 = OpConstant %int 100
+     %int_90 = OpConstant %int 90
+     %int_65 = OpConstant %int 65
+     %int_67 = OpConstant %int 67
+     %int_70 = OpConstant %int 70
+     %int_75 = OpConstant %int 75
+     %int_95 = OpConstant %int 95
+     %int_88 = OpConstant %int 88
+     %int_69 = OpConstant %int 69
+     %int_47 = OpConstant %int 47
+     %int_36 = OpConstant %int 36
+     %int_18 = OpConstant %int 18
+     %int_13 = OpConstant %int 13
+     %int_15 = OpConstant %int 15
+     %int_22 = OpConstant %int 22
+     %int_32 = OpConstant %int 32
+     %int_45 = OpConstant %int 45
+     %int_60 = OpConstant %int 60
+        %239 = OpConstantComposite %_arr_int_uint_256 %int_115 %int_133 %int_150 %int_164 %int_176 %int_184 %int_190 %int_192 %int_191 %int_187 %int_181 %int_172 %int_163 %int_153 %int_143 %int_134 %int_126 %int_120 %int_116 %int_114 %int_114 %int_117 %int_121 %int_127 %int_134 %int_141 %int_148 %int_154 %int_159 %int_162 %int_163 %int_161 %int_157 %int_151 %int_143 %int_134 %int_124 %int_113 %int_103 %int_94 %int_87 %int_82 %int_79 %int_80 %int_84 %int_91 %int_101 %int_114 %int_130 %int_146 %int_164 %int_182 %int_199 %int_215 %int_229 %int_240 %int_249 %int_254 %int_256 %int_254 %int_250 %int_243 %int_233 %int_223 %int_212 %int_200 %int_190 %int_180 %int_172 %int_166 %int_163 %int_161 %int_162 %int_164 %int_169 %int_174 %int_179 %int_185 %int_190 %int_193 %int_195 %int_195 %int_192 %int_188 %int_180 %int_171 %int_161 %int_149 %int_137 %int_125 %int_114 %int_105 %int_97 %int_93 %int_91 %int_93 %int_98 %int_106 %int_117 %int_130 %int_145 %int_161 %int_177 %int_193 %int_208 %int_221 %int_231 %int_239 %int_243 %int_244 %int_242 %int_236 %int_228 %int_218 %int_207 %int_194 %int_181 %int_169 %int_158 %int_148 %int_141 %int_135 %int_132 %int_131 %int_132 %int_135 %int_138 %int_143 %int_147 %int_151 %int_154 %int_155 %int_155 %int_152 %int_146 %int_139 %int_129 %int_118 %int_106 %int_93 %int_80 %int_68 %int_58 %int_49 %int_43 %int_40 %int_41 %int_44 %int_51 %int_61 %int_73 %int_87 %int_103 %int_119 %int_134 %int_149 %int_162 %int_173 %int_181 %int_186 %int_188 %int_186 %int_181 %int_174 %int_164 %int_153 %int_141 %int_128 %int_116 %int_104 %int_94 %int_86 %int_81 %int_77 %int_76 %int_77 %int_80 %int_84 %int_89 %int_94 %int_98 %int_102 %int_104 %int_104 %int_102 %int_98 %int_92 %int_83 %int_73 %int_62 %int_50 %int_38 %int_26 %int_16 %int_8 %int_2 %int_0 %int_0 %int_4 %int_11 %int_21 %int_33 %int_48 %int_64 %int_81 %int_98 %int_114 %int_129 %int_141 %int_151 %int_158 %int_161 %int_161 %int_158 %int_152 %int_144 %int_134 %int_123 %int_112 %int_100 %int_90 %int_81 %int_73 %int_68 %int_65 %int_65 %int_67 %int_70 %int_75 %int_81 %int_87 %int_92 %int_97 %int_101 %int_103 %int_102 %int_100 %int_95 %int_88 %int_79 %int_69 %int_58 %int_47 %int_36 %int_26 %int_18 %int_13 %int_11 %int_11 %int_15 %int_22 %int_32 %int_45 %int_60 %int_77 %int_94
+   %float_15 = OpConstant %float 15
+%float_0_0666666701 = OpConstant %float 0.0666666701
+    %float_1 = OpConstant %float 1
+       %true = OpConstantTrue %bool
+     %uint_1 = OpConstant %uint 1
+      %int_1 = OpConstant %int 1
+        %284 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %286 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+      %x_196 = OpVariable %_ptr_Function__arr_int_uint_256 Function %25
+      %x_197 = OpVariable %_ptr_Function__arr_int_uint_256 Function %25
+      %x_198 = OpVariable %_ptr_Function__arr_int_uint_256 Function %25
+      %x_210 = OpVariable %_ptr_Function_v2int Function %31
+      %x_249 = OpVariable %_ptr_Function_v4float Function %5
+      %x_251 = OpVariable %_ptr_Function_v4float Function %5
+  %x_214_phi = OpVariable %_ptr_Function_v2int Function %31
+  %x_251_phi = OpVariable %_ptr_Function_v4float Function %5
+  %x_252_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_254_phi = OpVariable %_ptr_Function_v4float Function %5
+      %x_233 = OpVariable %_ptr_Function_int Function %68
+      %x_234 = OpVariable %_ptr_Function_int Function %68
+  %x_235_phi = OpVariable %_ptr_Function_int Function %68
+    %x_215_1 = OpVariable %_ptr_Function_v2int Function %31
+         %42 = OpLoad %v4float %gl_FragCoord
+         %45 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %46 = OpLoad %v2float %45
+         %47 = OpCompositeExtract %float %42 0
+         %48 = OpCompositeExtract %float %42 1
+         %49 = OpCompositeConstruct %v2float %47 %48
+         %50 = OpFDiv %v2float %49 %46
+         %52 = OpCompositeExtract %float %50 0
+         %54 = OpFMul %float %52 %float_256
+         %51 = OpConvertFToS %int %54
+         %56 = OpCompositeExtract %float %50 1
+         %57 = OpFMul %float %56 %float_256
+         %55 = OpConvertFToS %int %57
+         %58 = OpCompositeConstruct %v2int %51 %55
+               OpStore %x_210 %58
+               OpSelectionMerge %59 None
+               OpSwitch %uint_0 %60
+         %60 = OpLabel
+         %61 = OpLoad %v2int %x_210
+               OpStore %x_214_phi %61
+               OpBranch %62
+         %62 = OpLabel
+               OpLoopMerge %63 %64 None
+               OpBranch %65
+         %65 = OpLabel
+         %71 = OpLoad %v2int %x_214_phi
+         %72 = OpCompositeExtract %int %71 1
+               OpStore %x_251_phi %74
+               OpStore %x_252_phi %false
+         %77 = OpINotEqual %bool %72 %int_256
+               OpSelectionMerge %78 None
+               OpBranchConditional %77 %79 %80
+         %79 = OpLabel
+               OpBranch %78
+         %80 = OpLabel
+               OpBranch %63
+         %78 = OpLabel
+         %81 = OpCompositeExtract %int %71 0
+               OpStore %x_196 %239
+        %240 = OpAccessChain %_ptr_Function_int %x_196 %72
+        %241 = OpLoad %int %240
+        %242 = OpIAdd %int %241 %int_15
+        %243 = OpSLessThan %bool %81 %242
+               OpSelectionMerge %244 None
+               OpBranchConditional %243 %245 %244
+        %245 = OpLabel
+               OpStore %x_197 %239
+               OpBranch %244
+        %244 = OpLabel
+               OpSelectionMerge %246 None
+               OpBranchConditional %243 %247 %248
+        %247 = OpLabel
+        %249 = OpAccessChain %_ptr_Function_int %x_197 %72
+        %250 = OpLoad %int %249
+               OpStore %x_233 %250
+        %251 = OpLoad %int %x_233
+               OpStore %x_235_phi %251
+               OpBranch %246
+        %248 = OpLabel
+               OpStore %x_234 %int_0
+        %252 = OpLoad %int %x_234
+               OpStore %x_235_phi %252
+               OpBranch %246
+        %246 = OpLabel
+        %253 = OpLoad %int %x_235_phi
+        %254 = OpISub %int %253 %int_15
+        %255 = OpSGreaterThan %bool %81 %254
+        %256 = OpSelect %bool %243 %255 %243
+               OpSelectionMerge %257 None
+               OpBranchConditional %256 %258 %257
+        %258 = OpLabel
+               OpStore %x_198 %239
+        %259 = OpAccessChain %_ptr_Function_int %x_198 %72
+        %260 = OpLoad %int %259
+        %265 = OpISub %int %81 %260
+        %264 = OpConvertSToF %float %265
+        %262 = OpExtInst %float %263 FAbs %264
+        %266 = OpFSub %float %float_15 %262
+        %268 = OpFMul %float %266 %float_0_0666666701
+        %270 = OpCompositeConstruct %v4float %268 %268 %268 %float_1
+               OpStore %x_249 %270
+        %271 = OpLoad %v4float %x_249
+               OpStore %x_251_phi %271
+               OpStore %x_252_phi %true
+               OpBranch %63
+        %257 = OpLabel
+               OpStore %x_215_1 %71
+        %275 = OpAccessChain %_ptr_Function_int %x_215_1 %uint_1
+        %277 = OpIAdd %int %72 %int_1
+               OpStore %275 %277
+        %278 = OpLoad %v2int %x_215_1
+               OpBranch %64
+         %64 = OpLabel
+               OpStore %x_214_phi %278
+               OpBranch %62
+         %63 = OpLabel
+        %279 = OpLoad %v4float %x_251_phi
+               OpStore %x_251 %279
+        %280 = OpLoad %bool %x_252_phi
+        %281 = OpLoad %v4float %x_251
+               OpStore %x_254_phi %281
+               OpSelectionMerge %282 None
+               OpBranchConditional %280 %283 %282
+        %283 = OpLabel
+               OpBranch %59
+        %282 = OpLabel
+               OpStore %x_254_phi %284
+               OpBranch %59
+         %59 = OpLabel
+        %285 = OpLoad %v4float %x_254_phi
+               OpStore %x_GLF_color %285
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %286
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %290 = OpLabel
+        %291 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %291
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %293 = OpLabel
+        %294 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %294
+        %295 = OpFunctionCall %void %main_1
+        %297 = OpLoad %v4float %x_GLF_color
+        %298 = OpCompositeConstruct %main_out %297
+        %296 = OpFunctionCall %void %tint_symbol_3 %298
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/2.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/2.spvasm.expected.wgsl
new file mode 100644
index 0000000..b52da64
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/2.spvasm.expected.wgsl
@@ -0,0 +1,99 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_196 : array<i32, 256>;
+  var x_197 : array<i32, 256>;
+  var x_198 : array<i32, 256>;
+  var x_210 : vec2<i32>;
+  var x_249 : vec4<f32>;
+  var x_251 : vec4<f32>;
+  var x_214_phi : vec2<i32>;
+  var x_251_phi : vec4<f32>;
+  var x_252_phi : bool;
+  var x_254_phi : vec4<f32>;
+  let x_199 : vec4<f32> = gl_FragCoord;
+  let x_202 : vec2<f32> = x_6.resolution;
+  let x_203 : vec2<f32> = (vec2<f32>(x_199.x, x_199.y) / x_202);
+  x_210 = vec2<i32>(i32((x_203.x * 256.0)), i32((x_203.y * 256.0)));
+  switch(0u) {
+    default: {
+      x_214_phi = x_210;
+      loop {
+        var x_233 : i32;
+        var x_234 : i32;
+        var x_235_phi : i32;
+        let x_214 : vec2<i32> = x_214_phi;
+        let x_217 : i32 = x_214.y;
+        x_251_phi = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+        x_252_phi = false;
+        if ((x_217 != 256)) {
+        } else {
+          break;
+        }
+        let x_221 : i32 = x_214.x;
+        x_196 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+        let x_223 : i32 = x_196[x_217];
+        let x_225 : bool = (x_221 < (x_223 + 15));
+        if (x_225) {
+          x_197 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+        }
+        if (x_225) {
+          x_233 = x_197[x_217];
+          x_235_phi = x_233;
+        } else {
+          x_234 = 0;
+          x_235_phi = x_234;
+        }
+        let x_235 : i32 = x_235_phi;
+        let x_237 : bool = (x_221 > (x_235 - 15));
+        if (select(x_225, x_237, x_225)) {
+          x_198 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+          let x_243 : i32 = x_198[x_217];
+          let x_248 : f32 = ((15.0 - abs(f32((x_221 - x_243)))) * 0.06666667);
+          x_249 = vec4<f32>(x_248, x_248, x_248, 1.0);
+          x_251_phi = x_249;
+          x_252_phi = true;
+          break;
+        }
+        var x_215_1 : vec2<i32> = x_214;
+        x_215_1.y = (x_217 + 1);
+        let x_215 : vec2<i32> = x_215_1;
+
+        continuing {
+          x_214_phi = x_215;
+        }
+      }
+      x_251 = x_251_phi;
+      let x_252 : bool = x_252_phi;
+      x_254_phi = x_251;
+      if (x_252) {
+        break;
+      }
+      x_254_phi = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+    }
+  }
+  let x_254 : vec4<f32> = x_254_phi;
+  x_GLF_color = x_254;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/2.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/2.wgsl
new file mode 100644
index 0000000..b52da64
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/2.wgsl
@@ -0,0 +1,99 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_196 : array<i32, 256>;
+  var x_197 : array<i32, 256>;
+  var x_198 : array<i32, 256>;
+  var x_210 : vec2<i32>;
+  var x_249 : vec4<f32>;
+  var x_251 : vec4<f32>;
+  var x_214_phi : vec2<i32>;
+  var x_251_phi : vec4<f32>;
+  var x_252_phi : bool;
+  var x_254_phi : vec4<f32>;
+  let x_199 : vec4<f32> = gl_FragCoord;
+  let x_202 : vec2<f32> = x_6.resolution;
+  let x_203 : vec2<f32> = (vec2<f32>(x_199.x, x_199.y) / x_202);
+  x_210 = vec2<i32>(i32((x_203.x * 256.0)), i32((x_203.y * 256.0)));
+  switch(0u) {
+    default: {
+      x_214_phi = x_210;
+      loop {
+        var x_233 : i32;
+        var x_234 : i32;
+        var x_235_phi : i32;
+        let x_214 : vec2<i32> = x_214_phi;
+        let x_217 : i32 = x_214.y;
+        x_251_phi = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+        x_252_phi = false;
+        if ((x_217 != 256)) {
+        } else {
+          break;
+        }
+        let x_221 : i32 = x_214.x;
+        x_196 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+        let x_223 : i32 = x_196[x_217];
+        let x_225 : bool = (x_221 < (x_223 + 15));
+        if (x_225) {
+          x_197 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+        }
+        if (x_225) {
+          x_233 = x_197[x_217];
+          x_235_phi = x_233;
+        } else {
+          x_234 = 0;
+          x_235_phi = x_234;
+        }
+        let x_235 : i32 = x_235_phi;
+        let x_237 : bool = (x_221 > (x_235 - 15));
+        if (select(x_225, x_237, x_225)) {
+          x_198 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+          let x_243 : i32 = x_198[x_217];
+          let x_248 : f32 = ((15.0 - abs(f32((x_221 - x_243)))) * 0.06666667);
+          x_249 = vec4<f32>(x_248, x_248, x_248, 1.0);
+          x_251_phi = x_249;
+          x_252_phi = true;
+          break;
+        }
+        var x_215_1 : vec2<i32> = x_214;
+        x_215_1.y = (x_217 + 1);
+        let x_215 : vec2<i32> = x_215_1;
+
+        continuing {
+          x_214_phi = x_215;
+        }
+      }
+      x_251 = x_251_phi;
+      let x_252 : bool = x_252_phi;
+      x_254_phi = x_251;
+      if (x_252) {
+        break;
+      }
+      x_254_phi = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+    }
+  }
+  let x_254 : vec4<f32> = x_254_phi;
+  x_GLF_color = x_254;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/2.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/2.wgsl.expected.hlsl
new file mode 100644
index 0000000..0614b0d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/2.wgsl.expected.hlsl
@@ -0,0 +1,102 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int x_196[256] = (int[256])0;
+  int x_197[256] = (int[256])0;
+  int x_198[256] = (int[256])0;
+  int2 x_210 = int2(0, 0);
+  float4 x_249 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 x_251 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int2 x_214_phi = int2(0, 0);
+  float4 x_251_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  bool x_252_phi = false;
+  float4 x_254_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  const float4 x_199 = gl_FragCoord;
+  const float2 x_202 = asfloat(x_6[0].xy);
+  const float2 x_203 = (float2(x_199.x, x_199.y) / x_202);
+  x_210 = int2(int((x_203.x * 256.0f)), int((x_203.y * 256.0f)));
+  switch(0u) {
+    default: {
+      x_214_phi = x_210;
+      while (true) {
+        int x_233 = 0;
+        int x_234 = 0;
+        int x_235_phi = 0;
+        const int2 x_214 = x_214_phi;
+        const int x_217 = x_214.y;
+        x_251_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        x_252_phi = false;
+        if ((x_217 != 256)) {
+        } else {
+          break;
+        }
+        const int x_221 = x_214.x;
+        const int tint_symbol_5[256] = {115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94};
+        x_196 = tint_symbol_5;
+        const int x_223 = x_196[x_217];
+        const bool x_225 = (x_221 < (x_223 + 15));
+        if (x_225) {
+          const int tint_symbol_6[256] = {115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94};
+          x_197 = tint_symbol_6;
+        }
+        if (x_225) {
+          x_233 = x_197[x_217];
+          x_235_phi = x_233;
+        } else {
+          x_234 = 0;
+          x_235_phi = x_234;
+        }
+        const bool x_237 = (x_221 > (x_235_phi - 15));
+        if ((x_225 ? x_237 : x_225)) {
+          const int tint_symbol_7[256] = {115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94};
+          x_198 = tint_symbol_7;
+          const int x_243 = x_198[x_217];
+          const float x_248 = ((15.0f - abs(float((x_221 - x_243)))) * 0.06666667f);
+          x_249 = float4(x_248, x_248, x_248, 1.0f);
+          x_251_phi = x_249;
+          x_252_phi = true;
+          break;
+        }
+        int2 x_215_1 = x_214;
+        x_215_1.y = (x_217 + 1);
+        const int2 x_215 = x_215_1;
+        {
+          x_214_phi = x_215;
+        }
+      }
+      x_251 = x_251_phi;
+      const bool x_252 = x_252_phi;
+      x_254_phi = x_251;
+      if (x_252) {
+        break;
+      }
+      x_254_phi = float4(0.0f, 0.0f, 0.0f, 1.0f);
+      break;
+    }
+  }
+  x_GLF_color = x_254_phi;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_8 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_8;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/2.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/2.wgsl.expected.msl
new file mode 100644
index 0000000..0b8a803
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/2.wgsl.expected.msl
@@ -0,0 +1,106 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  int arr[256];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_8, thread float4* const tint_symbol_9) {
+  tint_array_wrapper x_196 = {};
+  tint_array_wrapper x_197 = {};
+  tint_array_wrapper x_198 = {};
+  int2 x_210 = 0;
+  float4 x_249 = 0.0f;
+  float4 x_251 = 0.0f;
+  int2 x_214_phi = 0;
+  float4 x_251_phi = 0.0f;
+  bool x_252_phi = false;
+  float4 x_254_phi = 0.0f;
+  float4 const x_199 = *(tint_symbol_8);
+  float2 const x_202 = x_6.resolution;
+  float2 const x_203 = (float2(x_199.x, x_199.y) / x_202);
+  x_210 = int2(int((x_203.x * 256.0f)), int((x_203.y * 256.0f)));
+  switch(0u) {
+    default: {
+      x_214_phi = x_210;
+      while (true) {
+        int x_233 = 0;
+        int x_234 = 0;
+        int x_235_phi = 0;
+        int2 const x_214 = x_214_phi;
+        int const x_217 = x_214.y;
+        x_251_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+        x_252_phi = false;
+        if ((x_217 != 256)) {
+        } else {
+          break;
+        }
+        int const x_221 = x_214.x;
+        tint_array_wrapper const tint_symbol_4 = {.arr={115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94}};
+        x_196 = tint_symbol_4;
+        int const x_223 = x_196.arr[x_217];
+        bool const x_225 = (x_221 < (x_223 + 15));
+        if (x_225) {
+          tint_array_wrapper const tint_symbol_5 = {.arr={115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94}};
+          x_197 = tint_symbol_5;
+        }
+        if (x_225) {
+          x_233 = x_197.arr[x_217];
+          x_235_phi = x_233;
+        } else {
+          x_234 = 0;
+          x_235_phi = x_234;
+        }
+        int const x_235 = x_235_phi;
+        bool const x_237 = (x_221 > (x_235 - 15));
+        if (select(x_225, x_237, x_225)) {
+          tint_array_wrapper const tint_symbol_6 = {.arr={115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94}};
+          x_198 = tint_symbol_6;
+          int const x_243 = x_198.arr[x_217];
+          float const x_248 = ((15.0f - fabs(float((x_221 - x_243)))) * 0.06666667f);
+          x_249 = float4(x_248, x_248, x_248, 1.0f);
+          x_251_phi = x_249;
+          x_252_phi = true;
+          break;
+        }
+        int2 x_215_1 = x_214;
+        x_215_1.y = (x_217 + 1);
+        int2 const x_215 = x_215_1;
+        {
+          x_214_phi = x_215;
+        }
+      }
+      x_251 = x_251_phi;
+      bool const x_252 = x_252_phi;
+      x_254_phi = x_251;
+      if (x_252) {
+        break;
+      }
+      x_254_phi = float4(0.0f, 0.0f, 0.0f, 1.0f);
+      break;
+    }
+  }
+  float4 const x_254 = x_254_phi;
+  *(tint_symbol_9) = x_254;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_10 = 0.0f;
+  thread float4 tint_symbol_11 = 0.0f;
+  tint_symbol_10 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_10), &(tint_symbol_11));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_11};
+  tint_symbol_2 const tint_symbol_7 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_7;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/2.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/2.wgsl.expected.spvasm
new file mode 100644
index 0000000..ace8cfb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/2.wgsl.expected.spvasm
@@ -0,0 +1,397 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 299
+; Schema: 0
+               OpCapability Shader
+        %263 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %x_196 "x_196"
+               OpName %x_197 "x_197"
+               OpName %x_198 "x_198"
+               OpName %x_210 "x_210"
+               OpName %x_249 "x_249"
+               OpName %x_251 "x_251"
+               OpName %x_214_phi "x_214_phi"
+               OpName %x_251_phi "x_251_phi"
+               OpName %x_252_phi "x_252_phi"
+               OpName %x_254_phi "x_254_phi"
+               OpName %x_233 "x_233"
+               OpName %x_234 "x_234"
+               OpName %x_235_phi "x_235_phi"
+               OpName %x_215_1 "x_215_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_int_uint_256 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+   %uint_256 = OpConstant %uint 256
+%_arr_int_uint_256 = OpTypeArray %int %uint_256
+%_ptr_Function__arr_int_uint_256 = OpTypePointer Function %_arr_int_uint_256
+         %25 = OpConstantNull %_arr_int_uint_256
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %31 = OpConstantNull %v2int
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %40 = OpConstantNull %bool
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+  %float_256 = OpConstant %float 256
+%_ptr_Function_int = OpTypePointer Function %int
+         %68 = OpConstantNull %int
+    %float_0 = OpConstant %float 0
+         %74 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+      %false = OpConstantFalse %bool
+    %int_256 = OpConstant %int 256
+    %int_115 = OpConstant %int 115
+    %int_133 = OpConstant %int 133
+    %int_150 = OpConstant %int 150
+    %int_164 = OpConstant %int 164
+    %int_176 = OpConstant %int 176
+    %int_184 = OpConstant %int 184
+    %int_190 = OpConstant %int 190
+    %int_192 = OpConstant %int 192
+    %int_191 = OpConstant %int 191
+    %int_187 = OpConstant %int 187
+    %int_181 = OpConstant %int 181
+    %int_172 = OpConstant %int 172
+    %int_163 = OpConstant %int 163
+    %int_153 = OpConstant %int 153
+    %int_143 = OpConstant %int 143
+    %int_134 = OpConstant %int 134
+    %int_126 = OpConstant %int 126
+    %int_120 = OpConstant %int 120
+    %int_116 = OpConstant %int 116
+    %int_114 = OpConstant %int 114
+    %int_117 = OpConstant %int 117
+    %int_121 = OpConstant %int 121
+    %int_127 = OpConstant %int 127
+    %int_141 = OpConstant %int 141
+    %int_148 = OpConstant %int 148
+    %int_154 = OpConstant %int 154
+    %int_159 = OpConstant %int 159
+    %int_162 = OpConstant %int 162
+    %int_161 = OpConstant %int 161
+    %int_157 = OpConstant %int 157
+    %int_151 = OpConstant %int 151
+    %int_124 = OpConstant %int 124
+    %int_113 = OpConstant %int 113
+    %int_103 = OpConstant %int 103
+     %int_94 = OpConstant %int 94
+     %int_87 = OpConstant %int 87
+     %int_82 = OpConstant %int 82
+     %int_79 = OpConstant %int 79
+     %int_80 = OpConstant %int 80
+     %int_84 = OpConstant %int 84
+     %int_91 = OpConstant %int 91
+    %int_101 = OpConstant %int 101
+    %int_130 = OpConstant %int 130
+    %int_146 = OpConstant %int 146
+    %int_182 = OpConstant %int 182
+    %int_199 = OpConstant %int 199
+    %int_215 = OpConstant %int 215
+    %int_229 = OpConstant %int 229
+    %int_240 = OpConstant %int 240
+    %int_249 = OpConstant %int 249
+    %int_254 = OpConstant %int 254
+    %int_250 = OpConstant %int 250
+    %int_243 = OpConstant %int 243
+    %int_233 = OpConstant %int 233
+    %int_223 = OpConstant %int 223
+    %int_212 = OpConstant %int 212
+    %int_200 = OpConstant %int 200
+    %int_180 = OpConstant %int 180
+    %int_166 = OpConstant %int 166
+    %int_169 = OpConstant %int 169
+    %int_174 = OpConstant %int 174
+    %int_179 = OpConstant %int 179
+    %int_185 = OpConstant %int 185
+    %int_193 = OpConstant %int 193
+    %int_195 = OpConstant %int 195
+    %int_188 = OpConstant %int 188
+    %int_171 = OpConstant %int 171
+    %int_149 = OpConstant %int 149
+    %int_137 = OpConstant %int 137
+    %int_125 = OpConstant %int 125
+    %int_105 = OpConstant %int 105
+     %int_97 = OpConstant %int 97
+     %int_93 = OpConstant %int 93
+     %int_98 = OpConstant %int 98
+    %int_106 = OpConstant %int 106
+    %int_145 = OpConstant %int 145
+    %int_177 = OpConstant %int 177
+    %int_208 = OpConstant %int 208
+    %int_221 = OpConstant %int 221
+    %int_231 = OpConstant %int 231
+    %int_239 = OpConstant %int 239
+    %int_244 = OpConstant %int 244
+    %int_242 = OpConstant %int 242
+    %int_236 = OpConstant %int 236
+    %int_228 = OpConstant %int 228
+    %int_218 = OpConstant %int 218
+    %int_207 = OpConstant %int 207
+    %int_194 = OpConstant %int 194
+    %int_158 = OpConstant %int 158
+    %int_135 = OpConstant %int 135
+    %int_132 = OpConstant %int 132
+    %int_131 = OpConstant %int 131
+    %int_138 = OpConstant %int 138
+    %int_147 = OpConstant %int 147
+    %int_155 = OpConstant %int 155
+    %int_152 = OpConstant %int 152
+    %int_139 = OpConstant %int 139
+    %int_129 = OpConstant %int 129
+    %int_118 = OpConstant %int 118
+     %int_68 = OpConstant %int 68
+     %int_58 = OpConstant %int 58
+     %int_49 = OpConstant %int 49
+     %int_43 = OpConstant %int 43
+     %int_40 = OpConstant %int 40
+     %int_41 = OpConstant %int 41
+     %int_44 = OpConstant %int 44
+     %int_51 = OpConstant %int 51
+     %int_61 = OpConstant %int 61
+     %int_73 = OpConstant %int 73
+    %int_119 = OpConstant %int 119
+    %int_173 = OpConstant %int 173
+    %int_186 = OpConstant %int 186
+    %int_128 = OpConstant %int 128
+    %int_104 = OpConstant %int 104
+     %int_86 = OpConstant %int 86
+     %int_81 = OpConstant %int 81
+     %int_77 = OpConstant %int 77
+     %int_76 = OpConstant %int 76
+     %int_89 = OpConstant %int 89
+    %int_102 = OpConstant %int 102
+     %int_92 = OpConstant %int 92
+     %int_83 = OpConstant %int 83
+     %int_62 = OpConstant %int 62
+     %int_50 = OpConstant %int 50
+     %int_38 = OpConstant %int 38
+     %int_26 = OpConstant %int 26
+     %int_16 = OpConstant %int 16
+      %int_8 = OpConstant %int 8
+      %int_2 = OpConstant %int 2
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+     %int_11 = OpConstant %int 11
+     %int_21 = OpConstant %int 21
+     %int_33 = OpConstant %int 33
+     %int_48 = OpConstant %int 48
+     %int_64 = OpConstant %int 64
+    %int_144 = OpConstant %int 144
+    %int_123 = OpConstant %int 123
+    %int_112 = OpConstant %int 112
+    %int_100 = OpConstant %int 100
+     %int_90 = OpConstant %int 90
+     %int_65 = OpConstant %int 65
+     %int_67 = OpConstant %int 67
+     %int_70 = OpConstant %int 70
+     %int_75 = OpConstant %int 75
+     %int_95 = OpConstant %int 95
+     %int_88 = OpConstant %int 88
+     %int_69 = OpConstant %int 69
+     %int_47 = OpConstant %int 47
+     %int_36 = OpConstant %int 36
+     %int_18 = OpConstant %int 18
+     %int_13 = OpConstant %int 13
+     %int_15 = OpConstant %int 15
+     %int_22 = OpConstant %int 22
+     %int_32 = OpConstant %int 32
+     %int_45 = OpConstant %int 45
+     %int_60 = OpConstant %int 60
+        %239 = OpConstantComposite %_arr_int_uint_256 %int_115 %int_133 %int_150 %int_164 %int_176 %int_184 %int_190 %int_192 %int_191 %int_187 %int_181 %int_172 %int_163 %int_153 %int_143 %int_134 %int_126 %int_120 %int_116 %int_114 %int_114 %int_117 %int_121 %int_127 %int_134 %int_141 %int_148 %int_154 %int_159 %int_162 %int_163 %int_161 %int_157 %int_151 %int_143 %int_134 %int_124 %int_113 %int_103 %int_94 %int_87 %int_82 %int_79 %int_80 %int_84 %int_91 %int_101 %int_114 %int_130 %int_146 %int_164 %int_182 %int_199 %int_215 %int_229 %int_240 %int_249 %int_254 %int_256 %int_254 %int_250 %int_243 %int_233 %int_223 %int_212 %int_200 %int_190 %int_180 %int_172 %int_166 %int_163 %int_161 %int_162 %int_164 %int_169 %int_174 %int_179 %int_185 %int_190 %int_193 %int_195 %int_195 %int_192 %int_188 %int_180 %int_171 %int_161 %int_149 %int_137 %int_125 %int_114 %int_105 %int_97 %int_93 %int_91 %int_93 %int_98 %int_106 %int_117 %int_130 %int_145 %int_161 %int_177 %int_193 %int_208 %int_221 %int_231 %int_239 %int_243 %int_244 %int_242 %int_236 %int_228 %int_218 %int_207 %int_194 %int_181 %int_169 %int_158 %int_148 %int_141 %int_135 %int_132 %int_131 %int_132 %int_135 %int_138 %int_143 %int_147 %int_151 %int_154 %int_155 %int_155 %int_152 %int_146 %int_139 %int_129 %int_118 %int_106 %int_93 %int_80 %int_68 %int_58 %int_49 %int_43 %int_40 %int_41 %int_44 %int_51 %int_61 %int_73 %int_87 %int_103 %int_119 %int_134 %int_149 %int_162 %int_173 %int_181 %int_186 %int_188 %int_186 %int_181 %int_174 %int_164 %int_153 %int_141 %int_128 %int_116 %int_104 %int_94 %int_86 %int_81 %int_77 %int_76 %int_77 %int_80 %int_84 %int_89 %int_94 %int_98 %int_102 %int_104 %int_104 %int_102 %int_98 %int_92 %int_83 %int_73 %int_62 %int_50 %int_38 %int_26 %int_16 %int_8 %int_2 %int_0 %int_0 %int_4 %int_11 %int_21 %int_33 %int_48 %int_64 %int_81 %int_98 %int_114 %int_129 %int_141 %int_151 %int_158 %int_161 %int_161 %int_158 %int_152 %int_144 %int_134 %int_123 %int_112 %int_100 %int_90 %int_81 %int_73 %int_68 %int_65 %int_65 %int_67 %int_70 %int_75 %int_81 %int_87 %int_92 %int_97 %int_101 %int_103 %int_102 %int_100 %int_95 %int_88 %int_79 %int_69 %int_58 %int_47 %int_36 %int_26 %int_18 %int_13 %int_11 %int_11 %int_15 %int_22 %int_32 %int_45 %int_60 %int_77 %int_94
+   %float_15 = OpConstant %float 15
+%float_0_0666666701 = OpConstant %float 0.0666666701
+    %float_1 = OpConstant %float 1
+       %true = OpConstantTrue %bool
+     %uint_1 = OpConstant %uint 1
+      %int_1 = OpConstant %int 1
+        %284 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %286 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+      %x_196 = OpVariable %_ptr_Function__arr_int_uint_256 Function %25
+      %x_197 = OpVariable %_ptr_Function__arr_int_uint_256 Function %25
+      %x_198 = OpVariable %_ptr_Function__arr_int_uint_256 Function %25
+      %x_210 = OpVariable %_ptr_Function_v2int Function %31
+      %x_249 = OpVariable %_ptr_Function_v4float Function %5
+      %x_251 = OpVariable %_ptr_Function_v4float Function %5
+  %x_214_phi = OpVariable %_ptr_Function_v2int Function %31
+  %x_251_phi = OpVariable %_ptr_Function_v4float Function %5
+  %x_252_phi = OpVariable %_ptr_Function_bool Function %40
+  %x_254_phi = OpVariable %_ptr_Function_v4float Function %5
+      %x_233 = OpVariable %_ptr_Function_int Function %68
+      %x_234 = OpVariable %_ptr_Function_int Function %68
+  %x_235_phi = OpVariable %_ptr_Function_int Function %68
+    %x_215_1 = OpVariable %_ptr_Function_v2int Function %31
+         %42 = OpLoad %v4float %gl_FragCoord
+         %45 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %46 = OpLoad %v2float %45
+         %47 = OpCompositeExtract %float %42 0
+         %48 = OpCompositeExtract %float %42 1
+         %49 = OpCompositeConstruct %v2float %47 %48
+         %50 = OpFDiv %v2float %49 %46
+         %52 = OpCompositeExtract %float %50 0
+         %54 = OpFMul %float %52 %float_256
+         %51 = OpConvertFToS %int %54
+         %56 = OpCompositeExtract %float %50 1
+         %57 = OpFMul %float %56 %float_256
+         %55 = OpConvertFToS %int %57
+         %58 = OpCompositeConstruct %v2int %51 %55
+               OpStore %x_210 %58
+               OpSelectionMerge %59 None
+               OpSwitch %uint_0 %60
+         %60 = OpLabel
+         %61 = OpLoad %v2int %x_210
+               OpStore %x_214_phi %61
+               OpBranch %62
+         %62 = OpLabel
+               OpLoopMerge %63 %64 None
+               OpBranch %65
+         %65 = OpLabel
+         %71 = OpLoad %v2int %x_214_phi
+         %72 = OpCompositeExtract %int %71 1
+               OpStore %x_251_phi %74
+               OpStore %x_252_phi %false
+         %77 = OpINotEqual %bool %72 %int_256
+               OpSelectionMerge %78 None
+               OpBranchConditional %77 %79 %80
+         %79 = OpLabel
+               OpBranch %78
+         %80 = OpLabel
+               OpBranch %63
+         %78 = OpLabel
+         %81 = OpCompositeExtract %int %71 0
+               OpStore %x_196 %239
+        %240 = OpAccessChain %_ptr_Function_int %x_196 %72
+        %241 = OpLoad %int %240
+        %242 = OpIAdd %int %241 %int_15
+        %243 = OpSLessThan %bool %81 %242
+               OpSelectionMerge %244 None
+               OpBranchConditional %243 %245 %244
+        %245 = OpLabel
+               OpStore %x_197 %239
+               OpBranch %244
+        %244 = OpLabel
+               OpSelectionMerge %246 None
+               OpBranchConditional %243 %247 %248
+        %247 = OpLabel
+        %249 = OpAccessChain %_ptr_Function_int %x_197 %72
+        %250 = OpLoad %int %249
+               OpStore %x_233 %250
+        %251 = OpLoad %int %x_233
+               OpStore %x_235_phi %251
+               OpBranch %246
+        %248 = OpLabel
+               OpStore %x_234 %int_0
+        %252 = OpLoad %int %x_234
+               OpStore %x_235_phi %252
+               OpBranch %246
+        %246 = OpLabel
+        %253 = OpLoad %int %x_235_phi
+        %254 = OpISub %int %253 %int_15
+        %255 = OpSGreaterThan %bool %81 %254
+        %256 = OpSelect %bool %243 %255 %243
+               OpSelectionMerge %257 None
+               OpBranchConditional %256 %258 %257
+        %258 = OpLabel
+               OpStore %x_198 %239
+        %259 = OpAccessChain %_ptr_Function_int %x_198 %72
+        %260 = OpLoad %int %259
+        %265 = OpISub %int %81 %260
+        %264 = OpConvertSToF %float %265
+        %262 = OpExtInst %float %263 FAbs %264
+        %266 = OpFSub %float %float_15 %262
+        %268 = OpFMul %float %266 %float_0_0666666701
+        %270 = OpCompositeConstruct %v4float %268 %268 %268 %float_1
+               OpStore %x_249 %270
+        %271 = OpLoad %v4float %x_249
+               OpStore %x_251_phi %271
+               OpStore %x_252_phi %true
+               OpBranch %63
+        %257 = OpLabel
+               OpStore %x_215_1 %71
+        %275 = OpAccessChain %_ptr_Function_int %x_215_1 %uint_1
+        %277 = OpIAdd %int %72 %int_1
+               OpStore %275 %277
+        %278 = OpLoad %v2int %x_215_1
+               OpBranch %64
+         %64 = OpLabel
+               OpStore %x_214_phi %278
+               OpBranch %62
+         %63 = OpLabel
+        %279 = OpLoad %v4float %x_251_phi
+               OpStore %x_251 %279
+        %280 = OpLoad %bool %x_252_phi
+        %281 = OpLoad %v4float %x_251
+               OpStore %x_254_phi %281
+               OpSelectionMerge %282 None
+               OpBranchConditional %280 %283 %282
+        %283 = OpLabel
+               OpBranch %59
+        %282 = OpLabel
+               OpStore %x_254_phi %284
+               OpBranch %59
+         %59 = OpLabel
+        %285 = OpLoad %v4float %x_254_phi
+               OpStore %x_GLF_color %285
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %286
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %290 = OpLabel
+        %291 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %291
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %293 = OpLabel
+        %294 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %294
+        %295 = OpFunctionCall %void %main_1
+        %297 = OpLoad %v4float %x_GLF_color
+        %298 = OpCompositeConstruct %main_out %297
+        %296 = OpFunctionCall %void %tint_symbol_3 %298
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/2.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/2.wgsl.expected.wgsl
new file mode 100644
index 0000000..b52da64
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-O-op-select-to-op-phi/2.wgsl.expected.wgsl
@@ -0,0 +1,99 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_196 : array<i32, 256>;
+  var x_197 : array<i32, 256>;
+  var x_198 : array<i32, 256>;
+  var x_210 : vec2<i32>;
+  var x_249 : vec4<f32>;
+  var x_251 : vec4<f32>;
+  var x_214_phi : vec2<i32>;
+  var x_251_phi : vec4<f32>;
+  var x_252_phi : bool;
+  var x_254_phi : vec4<f32>;
+  let x_199 : vec4<f32> = gl_FragCoord;
+  let x_202 : vec2<f32> = x_6.resolution;
+  let x_203 : vec2<f32> = (vec2<f32>(x_199.x, x_199.y) / x_202);
+  x_210 = vec2<i32>(i32((x_203.x * 256.0)), i32((x_203.y * 256.0)));
+  switch(0u) {
+    default: {
+      x_214_phi = x_210;
+      loop {
+        var x_233 : i32;
+        var x_234 : i32;
+        var x_235_phi : i32;
+        let x_214 : vec2<i32> = x_214_phi;
+        let x_217 : i32 = x_214.y;
+        x_251_phi = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+        x_252_phi = false;
+        if ((x_217 != 256)) {
+        } else {
+          break;
+        }
+        let x_221 : i32 = x_214.x;
+        x_196 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+        let x_223 : i32 = x_196[x_217];
+        let x_225 : bool = (x_221 < (x_223 + 15));
+        if (x_225) {
+          x_197 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+        }
+        if (x_225) {
+          x_233 = x_197[x_217];
+          x_235_phi = x_233;
+        } else {
+          x_234 = 0;
+          x_235_phi = x_234;
+        }
+        let x_235 : i32 = x_235_phi;
+        let x_237 : bool = (x_221 > (x_235 - 15));
+        if (select(x_225, x_237, x_225)) {
+          x_198 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+          let x_243 : i32 = x_198[x_217];
+          let x_248 : f32 = ((15.0 - abs(f32((x_221 - x_243)))) * 0.06666667);
+          x_249 = vec4<f32>(x_248, x_248, x_248, 1.0);
+          x_251_phi = x_249;
+          x_252_phi = true;
+          break;
+        }
+        var x_215_1 : vec2<i32> = x_214;
+        x_215_1.y = (x_217 + 1);
+        let x_215 : vec2<i32> = x_215_1;
+
+        continuing {
+          x_214_phi = x_215;
+        }
+      }
+      x_251 = x_251_phi;
+      let x_252 : bool = x_252_phi;
+      x_254_phi = x_251;
+      if (x_252) {
+        break;
+      }
+      x_254_phi = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+    }
+  }
+  let x_254 : vec4<f32> = x_254_phi;
+  x_GLF_color = x_254;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/0.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/0.spvasm
new file mode 100644
index 0000000..315763e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/0.spvasm
@@ -0,0 +1,319 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %trace_vi2_ "trace(vi2;"
+               OpName %pos "pos"
+               OpName %indexable "indexable"
+               OpName %indexable_0 "indexable"
+               OpName %p "p"
+               OpName %indexable_1 "indexable"
+               OpName %pos_0 "pos"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %ipos "ipos"
+               OpName %_GLF_color "_GLF_color"
+               OpName %param "param"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %17 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+         %23 = OpTypeFunction %v4float %_ptr_Function_v2int
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_int = OpTypePointer Function %int
+    %int_256 = OpConstant %int 256
+       %bool = OpTypeBool
+     %uint_0 = OpConstant %uint 0
+   %uint_256 = OpConstant %uint 256
+%_arr_int_uint_256 = OpTypeArray %int %uint_256
+    %int_115 = OpConstant %int 115
+    %int_133 = OpConstant %int 133
+    %int_150 = OpConstant %int 150
+    %int_164 = OpConstant %int 164
+    %int_176 = OpConstant %int 176
+    %int_184 = OpConstant %int 184
+    %int_190 = OpConstant %int 190
+    %int_192 = OpConstant %int 192
+    %int_191 = OpConstant %int 191
+    %int_187 = OpConstant %int 187
+    %int_181 = OpConstant %int 181
+    %int_172 = OpConstant %int 172
+    %int_163 = OpConstant %int 163
+    %int_153 = OpConstant %int 153
+    %int_143 = OpConstant %int 143
+    %int_134 = OpConstant %int 134
+    %int_126 = OpConstant %int 126
+    %int_120 = OpConstant %int 120
+    %int_116 = OpConstant %int 116
+    %int_114 = OpConstant %int 114
+    %int_117 = OpConstant %int 117
+    %int_121 = OpConstant %int 121
+    %int_127 = OpConstant %int 127
+    %int_141 = OpConstant %int 141
+    %int_148 = OpConstant %int 148
+    %int_154 = OpConstant %int 154
+    %int_159 = OpConstant %int 159
+    %int_162 = OpConstant %int 162
+    %int_161 = OpConstant %int 161
+    %int_157 = OpConstant %int 157
+    %int_151 = OpConstant %int 151
+    %int_124 = OpConstant %int 124
+    %int_113 = OpConstant %int 113
+    %int_103 = OpConstant %int 103
+     %int_94 = OpConstant %int 94
+     %int_87 = OpConstant %int 87
+     %int_82 = OpConstant %int 82
+     %int_79 = OpConstant %int 79
+     %int_80 = OpConstant %int 80
+     %int_84 = OpConstant %int 84
+     %int_91 = OpConstant %int 91
+    %int_101 = OpConstant %int 101
+    %int_130 = OpConstant %int 130
+    %int_146 = OpConstant %int 146
+    %int_182 = OpConstant %int 182
+    %int_199 = OpConstant %int 199
+    %int_215 = OpConstant %int 215
+    %int_229 = OpConstant %int 229
+    %int_240 = OpConstant %int 240
+    %int_249 = OpConstant %int 249
+    %int_254 = OpConstant %int 254
+    %int_250 = OpConstant %int 250
+    %int_243 = OpConstant %int 243
+    %int_233 = OpConstant %int 233
+    %int_223 = OpConstant %int 223
+    %int_212 = OpConstant %int 212
+    %int_200 = OpConstant %int 200
+    %int_180 = OpConstant %int 180
+    %int_166 = OpConstant %int 166
+    %int_169 = OpConstant %int 169
+    %int_174 = OpConstant %int 174
+    %int_179 = OpConstant %int 179
+    %int_185 = OpConstant %int 185
+    %int_193 = OpConstant %int 193
+    %int_195 = OpConstant %int 195
+    %int_188 = OpConstant %int 188
+    %int_171 = OpConstant %int 171
+    %int_149 = OpConstant %int 149
+    %int_137 = OpConstant %int 137
+    %int_125 = OpConstant %int 125
+    %int_105 = OpConstant %int 105
+     %int_97 = OpConstant %int 97
+     %int_93 = OpConstant %int 93
+     %int_98 = OpConstant %int 98
+    %int_106 = OpConstant %int 106
+    %int_145 = OpConstant %int 145
+    %int_177 = OpConstant %int 177
+    %int_208 = OpConstant %int 208
+    %int_221 = OpConstant %int 221
+    %int_231 = OpConstant %int 231
+    %int_239 = OpConstant %int 239
+    %int_244 = OpConstant %int 244
+    %int_242 = OpConstant %int 242
+    %int_236 = OpConstant %int 236
+    %int_228 = OpConstant %int 228
+    %int_218 = OpConstant %int 218
+    %int_207 = OpConstant %int 207
+    %int_194 = OpConstant %int 194
+    %int_158 = OpConstant %int 158
+    %int_135 = OpConstant %int 135
+    %int_132 = OpConstant %int 132
+    %int_131 = OpConstant %int 131
+    %int_138 = OpConstant %int 138
+    %int_147 = OpConstant %int 147
+    %int_155 = OpConstant %int 155
+    %int_152 = OpConstant %int 152
+    %int_139 = OpConstant %int 139
+    %int_129 = OpConstant %int 129
+    %int_118 = OpConstant %int 118
+     %int_68 = OpConstant %int 68
+     %int_58 = OpConstant %int 58
+     %int_49 = OpConstant %int 49
+     %int_43 = OpConstant %int 43
+     %int_40 = OpConstant %int 40
+     %int_41 = OpConstant %int 41
+     %int_44 = OpConstant %int 44
+     %int_51 = OpConstant %int 51
+     %int_61 = OpConstant %int 61
+     %int_73 = OpConstant %int 73
+    %int_119 = OpConstant %int 119
+    %int_173 = OpConstant %int 173
+    %int_186 = OpConstant %int 186
+    %int_128 = OpConstant %int 128
+    %int_104 = OpConstant %int 104
+     %int_86 = OpConstant %int 86
+     %int_81 = OpConstant %int 81
+     %int_77 = OpConstant %int 77
+     %int_76 = OpConstant %int 76
+     %int_89 = OpConstant %int 89
+    %int_102 = OpConstant %int 102
+     %int_92 = OpConstant %int 92
+     %int_83 = OpConstant %int 83
+     %int_62 = OpConstant %int 62
+     %int_50 = OpConstant %int 50
+     %int_38 = OpConstant %int 38
+     %int_26 = OpConstant %int 26
+     %int_16 = OpConstant %int 16
+      %int_8 = OpConstant %int 8
+      %int_2 = OpConstant %int 2
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+     %int_11 = OpConstant %int 11
+     %int_21 = OpConstant %int 21
+     %int_33 = OpConstant %int 33
+     %int_48 = OpConstant %int 48
+     %int_64 = OpConstant %int 64
+    %int_144 = OpConstant %int 144
+    %int_123 = OpConstant %int 123
+    %int_112 = OpConstant %int 112
+    %int_100 = OpConstant %int 100
+     %int_90 = OpConstant %int 90
+     %int_65 = OpConstant %int 65
+     %int_67 = OpConstant %int 67
+     %int_70 = OpConstant %int 70
+     %int_75 = OpConstant %int 75
+     %int_95 = OpConstant %int 95
+     %int_88 = OpConstant %int 88
+     %int_69 = OpConstant %int 69
+     %int_47 = OpConstant %int 47
+     %int_36 = OpConstant %int 36
+     %int_18 = OpConstant %int 18
+     %int_13 = OpConstant %int 13
+     %int_15 = OpConstant %int 15
+     %int_22 = OpConstant %int 22
+     %int_32 = OpConstant %int 32
+     %int_45 = OpConstant %int 45
+     %int_60 = OpConstant %int 60
+        %189 = OpConstantComposite %_arr_int_uint_256 %int_115 %int_133 %int_150 %int_164 %int_176 %int_184 %int_190 %int_192 %int_191 %int_187 %int_181 %int_172 %int_163 %int_153 %int_143 %int_134 %int_126 %int_120 %int_116 %int_114 %int_114 %int_117 %int_121 %int_127 %int_134 %int_141 %int_148 %int_154 %int_159 %int_162 %int_163 %int_161 %int_157 %int_151 %int_143 %int_134 %int_124 %int_113 %int_103 %int_94 %int_87 %int_82 %int_79 %int_80 %int_84 %int_91 %int_101 %int_114 %int_130 %int_146 %int_164 %int_182 %int_199 %int_215 %int_229 %int_240 %int_249 %int_254 %int_256 %int_254 %int_250 %int_243 %int_233 %int_223 %int_212 %int_200 %int_190 %int_180 %int_172 %int_166 %int_163 %int_161 %int_162 %int_164 %int_169 %int_174 %int_179 %int_185 %int_190 %int_193 %int_195 %int_195 %int_192 %int_188 %int_180 %int_171 %int_161 %int_149 %int_137 %int_125 %int_114 %int_105 %int_97 %int_93 %int_91 %int_93 %int_98 %int_106 %int_117 %int_130 %int_145 %int_161 %int_177 %int_193 %int_208 %int_221 %int_231 %int_239 %int_243 %int_244 %int_242 %int_236 %int_228 %int_218 %int_207 %int_194 %int_181 %int_169 %int_158 %int_148 %int_141 %int_135 %int_132 %int_131 %int_132 %int_135 %int_138 %int_143 %int_147 %int_151 %int_154 %int_155 %int_155 %int_152 %int_146 %int_139 %int_129 %int_118 %int_106 %int_93 %int_80 %int_68 %int_58 %int_49 %int_43 %int_40 %int_41 %int_44 %int_51 %int_61 %int_73 %int_87 %int_103 %int_119 %int_134 %int_149 %int_162 %int_173 %int_181 %int_186 %int_188 %int_186 %int_181 %int_174 %int_164 %int_153 %int_141 %int_128 %int_116 %int_104 %int_94 %int_86 %int_81 %int_77 %int_76 %int_77 %int_80 %int_84 %int_89 %int_94 %int_98 %int_102 %int_104 %int_104 %int_102 %int_98 %int_92 %int_83 %int_73 %int_62 %int_50 %int_38 %int_26 %int_16 %int_8 %int_2 %int_0 %int_0 %int_4 %int_11 %int_21 %int_33 %int_48 %int_64 %int_81 %int_98 %int_114 %int_129 %int_141 %int_151 %int_158 %int_161 %int_161 %int_158 %int_152 %int_144 %int_134 %int_123 %int_112 %int_100 %int_90 %int_81 %int_73 %int_68 %int_65 %int_65 %int_67 %int_70 %int_75 %int_81 %int_87 %int_92 %int_97 %int_101 %int_103 %int_102 %int_100 %int_95 %int_88 %int_79 %int_69 %int_58 %int_47 %int_36 %int_26 %int_18 %int_13 %int_11 %int_11 %int_15 %int_22 %int_32 %int_45 %int_60 %int_77 %int_94
+%_ptr_Function__arr_int_uint_256 = OpTypePointer Function %_arr_int_uint_256
+%_ptr_Function_float = OpTypePointer Function %float
+   %float_15 = OpConstant %float 15
+    %float_1 = OpConstant %float 1
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+        %196 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+  %float_256 = OpConstant %float 256
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %17
+        %204 = OpLabel
+      %pos_0 = OpVariable %_ptr_Function_v2float Function
+       %ipos = OpVariable %_ptr_Function_v2int Function
+      %param = OpVariable %_ptr_Function_v2int Function
+        %205 = OpLoad %v4float %gl_FragCoord
+        %206 = OpVectorShuffle %v2float %205 %205 0 1
+        %207 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+        %208 = OpLoad %v2float %207
+        %209 = OpFDiv %v2float %206 %208
+               OpStore %pos_0 %209
+        %210 = OpAccessChain %_ptr_Function_float %pos_0 %uint_0
+        %211 = OpLoad %float %210
+        %212 = OpFMul %float %211 %float_256
+        %213 = OpConvertFToS %int %212
+        %214 = OpAccessChain %_ptr_Function_float %pos_0 %uint_1
+        %215 = OpLoad %float %214
+        %216 = OpFMul %float %215 %float_256
+        %217 = OpConvertFToS %int %216
+        %218 = OpCompositeConstruct %v2int %213 %217
+               OpStore %ipos %218
+        %219 = OpLoad %v2int %ipos
+               OpStore %param %219
+        %220 = OpFunctionCall %v4float %trace_vi2_ %param
+               OpStore %_GLF_color %220
+               OpReturn
+               OpFunctionEnd
+ %trace_vi2_ = OpFunction %v4float None %23
+        %pos = OpFunctionParameter %_ptr_Function_v2int
+        %221 = OpLabel
+  %indexable = OpVariable %_ptr_Function__arr_int_uint_256 Function
+%indexable_0 = OpVariable %_ptr_Function__arr_int_uint_256 Function
+          %p = OpVariable %_ptr_Function_float Function
+%indexable_1 = OpVariable %_ptr_Function__arr_int_uint_256 Function
+               OpBranch %222
+        %222 = OpLabel
+               OpLoopMerge %223 %224 None
+               OpBranch %225
+        %225 = OpLabel
+        %226 = OpAccessChain %_ptr_Function_int %pos %uint_1
+        %227 = OpLoad %int %226
+        %228 = OpINotEqual %bool %227 %int_256
+               OpBranchConditional %228 %229 %223
+        %229 = OpLabel
+        %230 = OpAccessChain %_ptr_Function_int %pos %uint_0
+        %231 = OpLoad %int %230
+        %232 = OpAccessChain %_ptr_Function_int %pos %uint_1
+        %233 = OpLoad %int %232
+               OpStore %indexable %189
+        %234 = OpAccessChain %_ptr_Function_int %indexable %233
+        %235 = OpLoad %int %234
+        %236 = OpIAdd %int %235 %int_15
+        %237 = OpSLessThan %bool %231 %236
+               OpSelectionMerge %238 None
+               OpBranchConditional %237 %239 %238
+        %239 = OpLabel
+        %240 = OpAccessChain %_ptr_Function_int %pos %uint_0
+        %241 = OpLoad %int %240
+        %242 = OpAccessChain %_ptr_Function_int %pos %uint_1
+        %243 = OpLoad %int %242
+               OpStore %indexable_0 %189
+        %244 = OpAccessChain %_ptr_Function_int %indexable_0 %243
+        %245 = OpLoad %int %244
+        %246 = OpISub %int %245 %int_15
+        %247 = OpSGreaterThan %bool %241 %246
+               OpBranch %238
+        %238 = OpLabel
+        %248 = OpPhi %bool %237 %229 %247 %239
+               OpSelectionMerge %249 None
+               OpBranchConditional %248 %250 %249
+        %250 = OpLabel
+        %251 = OpAccessChain %_ptr_Function_int %pos %uint_0
+        %252 = OpLoad %int %251
+        %253 = OpAccessChain %_ptr_Function_int %pos %uint_1
+        %254 = OpLoad %int %253
+               OpStore %indexable_1 %189
+        %255 = OpAccessChain %_ptr_Function_int %indexable_1 %254
+        %256 = OpLoad %int %255
+        %257 = OpISub %int %252 %256
+        %258 = OpConvertSToF %float %257
+        %259 = OpExtInst %float %1 FAbs %258
+        %260 = OpFSub %float %float_15 %259
+        %261 = OpFDiv %float %260 %float_15
+               OpStore %p %261
+        %262 = OpLoad %float %p
+        %263 = OpLoad %float %p
+        %264 = OpLoad %float %p
+        %265 = OpCompositeConstruct %v4float %262 %263 %264 %float_1
+               OpReturnValue %265
+        %249 = OpLabel
+        %266 = OpAccessChain %_ptr_Function_int %pos %uint_1
+        %267 = OpLoad %int %266
+        %268 = OpIAdd %int %267 %int_1
+               OpStore %266 %268
+               OpBranch %224
+        %224 = OpLabel
+               OpBranch %222
+        %223 = OpLabel
+               OpReturnValue %196
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..7b7c9a4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/0.spvasm.expected.hlsl
@@ -0,0 +1,84 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_13 : register(b0, space0) {
+  uint4 x_13[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float4 trace_vi2_(inout int2 pos) {
+  int indexable[256] = (int[256])0;
+  int indexable_1[256] = (int[256])0;
+  float p = 0.0f;
+  int indexable_2[256] = (int[256])0;
+  while (true) {
+    bool x_247 = false;
+    bool x_248_phi = false;
+    const int x_227 = pos.y;
+    if ((x_227 != 256)) {
+    } else {
+      break;
+    }
+    const int x_231 = pos.x;
+    const int x_233 = pos.y;
+    const int tint_symbol_5[256] = {115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94};
+    indexable = tint_symbol_5;
+    const int x_235 = indexable[x_233];
+    const bool x_237 = (x_231 < (x_235 + 15));
+    x_248_phi = x_237;
+    if (x_237) {
+      const int x_241 = pos.x;
+      const int x_243 = pos.y;
+      const int tint_symbol_6[256] = {115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94};
+      indexable_1 = tint_symbol_6;
+      const int x_245 = indexable_1[x_243];
+      x_247 = (x_241 > (x_245 - 15));
+      x_248_phi = x_247;
+    }
+    if (x_248_phi) {
+      const int x_252 = pos.x;
+      const int x_254 = pos.y;
+      const int tint_symbol_7[256] = {115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94};
+      indexable_2 = tint_symbol_7;
+      const int x_256 = indexable_2[x_254];
+      p = ((15.0f - abs(float((x_252 - x_256)))) / 15.0f);
+      return float4(p, p, p, 1.0f);
+    }
+    const int x_267 = pos.y;
+    pos.y = (x_267 + 1);
+  }
+  return float4(0.0f, 0.0f, 0.0f, 1.0f);
+}
+
+void main_1() {
+  float2 pos_1 = float2(0.0f, 0.0f);
+  int2 ipos = int2(0, 0);
+  int2 param = int2(0, 0);
+  const float4 x_205 = gl_FragCoord;
+  const float2 x_208 = asfloat(x_13[0].xy);
+  pos_1 = (float2(x_205.x, x_205.y) / x_208);
+  const float x_211 = pos_1.x;
+  const float x_215 = pos_1.y;
+  ipos = int2(int((x_211 * 256.0f)), int((x_215 * 256.0f)));
+  param = ipos;
+  const float4 x_220 = trace_vi2_(param);
+  x_GLF_color = x_220;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_8 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_8;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/0.spvasm.expected.msl
new file mode 100644
index 0000000..f95df19
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/0.spvasm.expected.msl
@@ -0,0 +1,91 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  int arr[256];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float4 trace_vi2_(thread int2* const pos) {
+  tint_array_wrapper indexable = {};
+  tint_array_wrapper indexable_1 = {};
+  float p = 0.0f;
+  tint_array_wrapper indexable_2 = {};
+  while (true) {
+    bool x_247 = false;
+    bool x_248_phi = false;
+    int const x_227 = (*(pos)).y;
+    if ((x_227 != 256)) {
+    } else {
+      break;
+    }
+    int const x_231 = (*(pos)).x;
+    int const x_233 = (*(pos)).y;
+    tint_array_wrapper const tint_symbol_4 = {.arr={115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94}};
+    indexable = tint_symbol_4;
+    int const x_235 = indexable.arr[x_233];
+    bool const x_237 = (x_231 < (x_235 + 15));
+    x_248_phi = x_237;
+    if (x_237) {
+      int const x_241 = (*(pos)).x;
+      int const x_243 = (*(pos)).y;
+      tint_array_wrapper const tint_symbol_5 = {.arr={115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94}};
+      indexable_1 = tint_symbol_5;
+      int const x_245 = indexable_1.arr[x_243];
+      x_247 = (x_241 > (x_245 - 15));
+      x_248_phi = x_247;
+    }
+    bool const x_248 = x_248_phi;
+    if (x_248) {
+      int const x_252 = (*(pos)).x;
+      int const x_254 = (*(pos)).y;
+      tint_array_wrapper const tint_symbol_6 = {.arr={115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94}};
+      indexable_2 = tint_symbol_6;
+      int const x_256 = indexable_2.arr[x_254];
+      p = ((15.0f - fabs(float((x_252 - x_256)))) / 15.0f);
+      float const x_262 = p;
+      float const x_263 = p;
+      float const x_264 = p;
+      return float4(x_262, x_263, x_264, 1.0f);
+    }
+    int const x_267 = (*(pos)).y;
+    (*(pos)).y = (x_267 + 1);
+  }
+  return float4(0.0f, 0.0f, 0.0f, 1.0f);
+}
+
+void main_1(constant buf0& x_13, thread float4* const tint_symbol_8, thread float4* const tint_symbol_9) {
+  float2 pos_1 = 0.0f;
+  int2 ipos = 0;
+  int2 param = 0;
+  float4 const x_205 = *(tint_symbol_8);
+  float2 const x_208 = x_13.resolution;
+  pos_1 = (float2(x_205.x, x_205.y) / x_208);
+  float const x_211 = pos_1.x;
+  float const x_215 = pos_1.y;
+  ipos = int2(int((x_211 * 256.0f)), int((x_215 * 256.0f)));
+  int2 const x_219 = ipos;
+  param = x_219;
+  float4 const x_220 = trace_vi2_(&(param));
+  *(tint_symbol_9) = x_220;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_13 [[buffer(0)]]) {
+  thread float4 tint_symbol_10 = 0.0f;
+  thread float4 tint_symbol_11 = 0.0f;
+  tint_symbol_10 = gl_FragCoord_param;
+  main_1(x_13, &(tint_symbol_10), &(tint_symbol_11));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_11};
+  tint_symbol_2 const tint_symbol_7 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_7;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..1bc7c3e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/0.spvasm.expected.spvasm
@@ -0,0 +1,378 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 310
+; Schema: 0
+               OpCapability Shader
+        %247 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_13 "x_13"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %trace_vi2_ "trace_vi2_"
+               OpName %pos "pos"
+               OpName %indexable "indexable"
+               OpName %indexable_1 "indexable_1"
+               OpName %p "p"
+               OpName %indexable_2 "indexable_2"
+               OpName %x_247 "x_247"
+               OpName %x_248_phi "x_248_phi"
+               OpName %main_1 "main_1"
+               OpName %pos_1 "pos_1"
+               OpName %ipos "ipos"
+               OpName %param "param"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_13 NonWritable
+               OpDecorate %x_13 DescriptorSet 0
+               OpDecorate %x_13 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_int_uint_256 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_13 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %15 = OpTypeFunction %v4float %_ptr_Function_v2int
+       %uint = OpTypeInt 32 0
+   %uint_256 = OpConstant %uint 256
+%_arr_int_uint_256 = OpTypeArray %int %uint_256
+%_ptr_Function__arr_int_uint_256 = OpTypePointer Function %_arr_int_uint_256
+         %27 = OpConstantNull %_arr_int_uint_256
+%_ptr_Function_float = OpTypePointer Function %float
+         %31 = OpConstantNull %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %40 = OpConstantNull %bool
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_int = OpTypePointer Function %int
+    %int_256 = OpConstant %int 256
+     %uint_0 = OpConstant %uint 0
+    %int_115 = OpConstant %int 115
+    %int_133 = OpConstant %int 133
+    %int_150 = OpConstant %int 150
+    %int_164 = OpConstant %int 164
+    %int_176 = OpConstant %int 176
+    %int_184 = OpConstant %int 184
+    %int_190 = OpConstant %int 190
+    %int_192 = OpConstant %int 192
+    %int_191 = OpConstant %int 191
+    %int_187 = OpConstant %int 187
+    %int_181 = OpConstant %int 181
+    %int_172 = OpConstant %int 172
+    %int_163 = OpConstant %int 163
+    %int_153 = OpConstant %int 153
+    %int_143 = OpConstant %int 143
+    %int_134 = OpConstant %int 134
+    %int_126 = OpConstant %int 126
+    %int_120 = OpConstant %int 120
+    %int_116 = OpConstant %int 116
+    %int_114 = OpConstant %int 114
+    %int_117 = OpConstant %int 117
+    %int_121 = OpConstant %int 121
+    %int_127 = OpConstant %int 127
+    %int_141 = OpConstant %int 141
+    %int_148 = OpConstant %int 148
+    %int_154 = OpConstant %int 154
+    %int_159 = OpConstant %int 159
+    %int_162 = OpConstant %int 162
+    %int_161 = OpConstant %int 161
+    %int_157 = OpConstant %int 157
+    %int_151 = OpConstant %int 151
+    %int_124 = OpConstant %int 124
+    %int_113 = OpConstant %int 113
+    %int_103 = OpConstant %int 103
+     %int_94 = OpConstant %int 94
+     %int_87 = OpConstant %int 87
+     %int_82 = OpConstant %int 82
+     %int_79 = OpConstant %int 79
+     %int_80 = OpConstant %int 80
+     %int_84 = OpConstant %int 84
+     %int_91 = OpConstant %int 91
+    %int_101 = OpConstant %int 101
+    %int_130 = OpConstant %int 130
+    %int_146 = OpConstant %int 146
+    %int_182 = OpConstant %int 182
+    %int_199 = OpConstant %int 199
+    %int_215 = OpConstant %int 215
+    %int_229 = OpConstant %int 229
+    %int_240 = OpConstant %int 240
+    %int_249 = OpConstant %int 249
+    %int_254 = OpConstant %int 254
+    %int_250 = OpConstant %int 250
+    %int_243 = OpConstant %int 243
+    %int_233 = OpConstant %int 233
+    %int_223 = OpConstant %int 223
+    %int_212 = OpConstant %int 212
+    %int_200 = OpConstant %int 200
+    %int_180 = OpConstant %int 180
+    %int_166 = OpConstant %int 166
+    %int_169 = OpConstant %int 169
+    %int_174 = OpConstant %int 174
+    %int_179 = OpConstant %int 179
+    %int_185 = OpConstant %int 185
+    %int_193 = OpConstant %int 193
+    %int_195 = OpConstant %int 195
+    %int_188 = OpConstant %int 188
+    %int_171 = OpConstant %int 171
+    %int_149 = OpConstant %int 149
+    %int_137 = OpConstant %int 137
+    %int_125 = OpConstant %int 125
+    %int_105 = OpConstant %int 105
+     %int_97 = OpConstant %int 97
+     %int_93 = OpConstant %int 93
+     %int_98 = OpConstant %int 98
+    %int_106 = OpConstant %int 106
+    %int_145 = OpConstant %int 145
+    %int_177 = OpConstant %int 177
+    %int_208 = OpConstant %int 208
+    %int_221 = OpConstant %int 221
+    %int_231 = OpConstant %int 231
+    %int_239 = OpConstant %int 239
+    %int_244 = OpConstant %int 244
+    %int_242 = OpConstant %int 242
+    %int_236 = OpConstant %int 236
+    %int_228 = OpConstant %int 228
+    %int_218 = OpConstant %int 218
+    %int_207 = OpConstant %int 207
+    %int_194 = OpConstant %int 194
+    %int_158 = OpConstant %int 158
+    %int_135 = OpConstant %int 135
+    %int_132 = OpConstant %int 132
+    %int_131 = OpConstant %int 131
+    %int_138 = OpConstant %int 138
+    %int_147 = OpConstant %int 147
+    %int_155 = OpConstant %int 155
+    %int_152 = OpConstant %int 152
+    %int_139 = OpConstant %int 139
+    %int_129 = OpConstant %int 129
+    %int_118 = OpConstant %int 118
+     %int_68 = OpConstant %int 68
+     %int_58 = OpConstant %int 58
+     %int_49 = OpConstant %int 49
+     %int_43 = OpConstant %int 43
+     %int_40 = OpConstant %int 40
+     %int_41 = OpConstant %int 41
+     %int_44 = OpConstant %int 44
+     %int_51 = OpConstant %int 51
+     %int_61 = OpConstant %int 61
+     %int_73 = OpConstant %int 73
+    %int_119 = OpConstant %int 119
+    %int_173 = OpConstant %int 173
+    %int_186 = OpConstant %int 186
+    %int_128 = OpConstant %int 128
+    %int_104 = OpConstant %int 104
+     %int_86 = OpConstant %int 86
+     %int_81 = OpConstant %int 81
+     %int_77 = OpConstant %int 77
+     %int_76 = OpConstant %int 76
+     %int_89 = OpConstant %int 89
+    %int_102 = OpConstant %int 102
+     %int_92 = OpConstant %int 92
+     %int_83 = OpConstant %int 83
+     %int_62 = OpConstant %int 62
+     %int_50 = OpConstant %int 50
+     %int_38 = OpConstant %int 38
+     %int_26 = OpConstant %int 26
+     %int_16 = OpConstant %int 16
+      %int_8 = OpConstant %int 8
+      %int_2 = OpConstant %int 2
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+     %int_11 = OpConstant %int 11
+     %int_21 = OpConstant %int 21
+     %int_33 = OpConstant %int 33
+     %int_48 = OpConstant %int 48
+     %int_64 = OpConstant %int 64
+    %int_144 = OpConstant %int 144
+    %int_123 = OpConstant %int 123
+    %int_112 = OpConstant %int 112
+    %int_100 = OpConstant %int 100
+     %int_90 = OpConstant %int 90
+     %int_65 = OpConstant %int 65
+     %int_67 = OpConstant %int 67
+     %int_70 = OpConstant %int 70
+     %int_75 = OpConstant %int 75
+     %int_95 = OpConstant %int 95
+     %int_88 = OpConstant %int 88
+     %int_69 = OpConstant %int 69
+     %int_47 = OpConstant %int 47
+     %int_36 = OpConstant %int 36
+     %int_18 = OpConstant %int 18
+     %int_13 = OpConstant %int 13
+     %int_15 = OpConstant %int 15
+     %int_22 = OpConstant %int 22
+     %int_32 = OpConstant %int 32
+     %int_45 = OpConstant %int 45
+     %int_60 = OpConstant %int 60
+        %216 = OpConstantComposite %_arr_int_uint_256 %int_115 %int_133 %int_150 %int_164 %int_176 %int_184 %int_190 %int_192 %int_191 %int_187 %int_181 %int_172 %int_163 %int_153 %int_143 %int_134 %int_126 %int_120 %int_116 %int_114 %int_114 %int_117 %int_121 %int_127 %int_134 %int_141 %int_148 %int_154 %int_159 %int_162 %int_163 %int_161 %int_157 %int_151 %int_143 %int_134 %int_124 %int_113 %int_103 %int_94 %int_87 %int_82 %int_79 %int_80 %int_84 %int_91 %int_101 %int_114 %int_130 %int_146 %int_164 %int_182 %int_199 %int_215 %int_229 %int_240 %int_249 %int_254 %int_256 %int_254 %int_250 %int_243 %int_233 %int_223 %int_212 %int_200 %int_190 %int_180 %int_172 %int_166 %int_163 %int_161 %int_162 %int_164 %int_169 %int_174 %int_179 %int_185 %int_190 %int_193 %int_195 %int_195 %int_192 %int_188 %int_180 %int_171 %int_161 %int_149 %int_137 %int_125 %int_114 %int_105 %int_97 %int_93 %int_91 %int_93 %int_98 %int_106 %int_117 %int_130 %int_145 %int_161 %int_177 %int_193 %int_208 %int_221 %int_231 %int_239 %int_243 %int_244 %int_242 %int_236 %int_228 %int_218 %int_207 %int_194 %int_181 %int_169 %int_158 %int_148 %int_141 %int_135 %int_132 %int_131 %int_132 %int_135 %int_138 %int_143 %int_147 %int_151 %int_154 %int_155 %int_155 %int_152 %int_146 %int_139 %int_129 %int_118 %int_106 %int_93 %int_80 %int_68 %int_58 %int_49 %int_43 %int_40 %int_41 %int_44 %int_51 %int_61 %int_73 %int_87 %int_103 %int_119 %int_134 %int_149 %int_162 %int_173 %int_181 %int_186 %int_188 %int_186 %int_181 %int_174 %int_164 %int_153 %int_141 %int_128 %int_116 %int_104 %int_94 %int_86 %int_81 %int_77 %int_76 %int_77 %int_80 %int_84 %int_89 %int_94 %int_98 %int_102 %int_104 %int_104 %int_102 %int_98 %int_92 %int_83 %int_73 %int_62 %int_50 %int_38 %int_26 %int_16 %int_8 %int_2 %int_0 %int_0 %int_4 %int_11 %int_21 %int_33 %int_48 %int_64 %int_81 %int_98 %int_114 %int_129 %int_141 %int_151 %int_158 %int_161 %int_161 %int_158 %int_152 %int_144 %int_134 %int_123 %int_112 %int_100 %int_90 %int_81 %int_73 %int_68 %int_65 %int_65 %int_67 %int_70 %int_75 %int_81 %int_87 %int_92 %int_97 %int_101 %int_103 %int_102 %int_100 %int_95 %int_88 %int_79 %int_69 %int_58 %int_47 %int_36 %int_26 %int_18 %int_13 %int_11 %int_11 %int_15 %int_22 %int_32 %int_45 %int_60 %int_77 %int_94
+   %float_15 = OpConstant %float 15
+    %float_1 = OpConstant %float 1
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+        %265 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+       %void = OpTypeVoid
+        %266 = OpTypeFunction %void
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+        %272 = OpConstantNull %v2float
+        %274 = OpConstantNull %v2int
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+  %float_256 = OpConstant %float 256
+   %main_out = OpTypeStruct %v4float
+        %297 = OpTypeFunction %void %main_out
+ %trace_vi2_ = OpFunction %v4float None %15
+        %pos = OpFunctionParameter %_ptr_Function_v2int
+         %21 = OpLabel
+  %indexable = OpVariable %_ptr_Function__arr_int_uint_256 Function %27
+%indexable_1 = OpVariable %_ptr_Function__arr_int_uint_256 Function %27
+          %p = OpVariable %_ptr_Function_float Function %31
+%indexable_2 = OpVariable %_ptr_Function__arr_int_uint_256 Function %27
+      %x_247 = OpVariable %_ptr_Function_bool Function %40
+  %x_248_phi = OpVariable %_ptr_Function_bool Function %40
+               OpBranch %33
+         %33 = OpLabel
+               OpLoopMerge %34 %35 None
+               OpBranch %36
+         %36 = OpLabel
+         %45 = OpAccessChain %_ptr_Function_int %pos %uint_1
+         %46 = OpLoad %int %45
+         %48 = OpINotEqual %bool %46 %int_256
+               OpSelectionMerge %49 None
+               OpBranchConditional %48 %50 %51
+         %50 = OpLabel
+               OpBranch %49
+         %51 = OpLabel
+               OpBranch %34
+         %49 = OpLabel
+         %54 = OpAccessChain %_ptr_Function_int %pos %uint_0
+         %55 = OpLoad %int %54
+         %57 = OpAccessChain %_ptr_Function_int %pos %uint_1
+         %58 = OpLoad %int %57
+               OpStore %indexable %216
+        %217 = OpAccessChain %_ptr_Function_int %indexable %58
+        %218 = OpLoad %int %217
+        %219 = OpIAdd %int %218 %int_15
+        %220 = OpSLessThan %bool %55 %219
+               OpStore %x_248_phi %220
+               OpSelectionMerge %221 None
+               OpBranchConditional %220 %222 %221
+        %222 = OpLabel
+        %224 = OpAccessChain %_ptr_Function_int %pos %uint_0
+        %225 = OpLoad %int %224
+        %227 = OpAccessChain %_ptr_Function_int %pos %uint_1
+        %228 = OpLoad %int %227
+               OpStore %indexable_1 %216
+        %229 = OpAccessChain %_ptr_Function_int %indexable_1 %228
+        %230 = OpLoad %int %229
+        %231 = OpISub %int %230 %int_15
+        %232 = OpSGreaterThan %bool %225 %231
+               OpStore %x_247 %232
+        %233 = OpLoad %bool %x_247
+               OpStore %x_248_phi %233
+               OpBranch %221
+        %221 = OpLabel
+        %234 = OpLoad %bool %x_248_phi
+               OpSelectionMerge %235 None
+               OpBranchConditional %234 %236 %235
+        %236 = OpLabel
+        %238 = OpAccessChain %_ptr_Function_int %pos %uint_0
+        %239 = OpLoad %int %238
+        %241 = OpAccessChain %_ptr_Function_int %pos %uint_1
+        %242 = OpLoad %int %241
+               OpStore %indexable_2 %216
+        %243 = OpAccessChain %_ptr_Function_int %indexable_2 %242
+        %244 = OpLoad %int %243
+        %249 = OpISub %int %239 %244
+        %248 = OpConvertSToF %float %249
+        %246 = OpExtInst %float %247 FAbs %248
+        %250 = OpFSub %float %float_15 %246
+        %251 = OpFDiv %float %250 %float_15
+               OpStore %p %251
+        %252 = OpLoad %float %p
+        %253 = OpLoad %float %p
+        %254 = OpLoad %float %p
+        %256 = OpCompositeConstruct %v4float %252 %253 %254 %float_1
+               OpReturnValue %256
+        %235 = OpLabel
+        %258 = OpAccessChain %_ptr_Function_int %pos %uint_1
+        %259 = OpLoad %int %258
+        %261 = OpAccessChain %_ptr_Function_int %pos %uint_1
+        %263 = OpIAdd %int %259 %int_1
+               OpStore %261 %263
+               OpBranch %35
+         %35 = OpLabel
+               OpBranch %33
+         %34 = OpLabel
+               OpReturnValue %265
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %266
+        %269 = OpLabel
+      %pos_1 = OpVariable %_ptr_Function_v2float Function %272
+       %ipos = OpVariable %_ptr_Function_v2int Function %274
+      %param = OpVariable %_ptr_Function_v2int Function %274
+        %276 = OpLoad %v4float %gl_FragCoord
+        %278 = OpAccessChain %_ptr_Uniform_v2float %x_13 %uint_0
+        %279 = OpLoad %v2float %278
+        %280 = OpCompositeExtract %float %276 0
+        %281 = OpCompositeExtract %float %276 1
+        %282 = OpCompositeConstruct %v2float %280 %281
+        %283 = OpFDiv %v2float %282 %279
+               OpStore %pos_1 %283
+        %284 = OpAccessChain %_ptr_Function_float %pos_1 %uint_0
+        %285 = OpLoad %float %284
+        %286 = OpAccessChain %_ptr_Function_float %pos_1 %uint_1
+        %287 = OpLoad %float %286
+        %290 = OpFMul %float %285 %float_256
+        %288 = OpConvertFToS %int %290
+        %292 = OpFMul %float %287 %float_256
+        %291 = OpConvertFToS %int %292
+        %293 = OpCompositeConstruct %v2int %288 %291
+               OpStore %ipos %293
+        %294 = OpLoad %v2int %ipos
+               OpStore %param %294
+        %295 = OpFunctionCall %v4float %trace_vi2_ %param
+               OpStore %x_GLF_color %295
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %297
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %301 = OpLabel
+        %302 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %302
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %266
+        %304 = OpLabel
+        %305 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %305
+        %306 = OpFunctionCall %void %main_1
+        %308 = OpLoad %v4float %x_GLF_color
+        %309 = OpCompositeConstruct %main_out %308
+        %307 = OpFunctionCall %void %tint_symbol_3 %309
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..5e10336
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/0.spvasm.expected.wgsl
@@ -0,0 +1,85 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_13 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn trace_vi2_(pos : ptr<function, vec2<i32>>) -> vec4<f32> {
+  var indexable : array<i32, 256>;
+  var indexable_1 : array<i32, 256>;
+  var p : f32;
+  var indexable_2 : array<i32, 256>;
+  loop {
+    var x_247 : bool;
+    var x_248_phi : bool;
+    let x_227 : i32 = (*(pos)).y;
+    if ((x_227 != 256)) {
+    } else {
+      break;
+    }
+    let x_231 : i32 = (*(pos)).x;
+    let x_233 : i32 = (*(pos)).y;
+    indexable = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+    let x_235 : i32 = indexable[x_233];
+    let x_237 : bool = (x_231 < (x_235 + 15));
+    x_248_phi = x_237;
+    if (x_237) {
+      let x_241 : i32 = (*(pos)).x;
+      let x_243 : i32 = (*(pos)).y;
+      indexable_1 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+      let x_245 : i32 = indexable_1[x_243];
+      x_247 = (x_241 > (x_245 - 15));
+      x_248_phi = x_247;
+    }
+    let x_248 : bool = x_248_phi;
+    if (x_248) {
+      let x_252 : i32 = (*(pos)).x;
+      let x_254 : i32 = (*(pos)).y;
+      indexable_2 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+      let x_256 : i32 = indexable_2[x_254];
+      p = ((15.0 - abs(f32((x_252 - x_256)))) / 15.0);
+      let x_262 : f32 = p;
+      let x_263 : f32 = p;
+      let x_264 : f32 = p;
+      return vec4<f32>(x_262, x_263, x_264, 1.0);
+    }
+    let x_266 : ptr<function, i32> = &((*(pos)).y);
+    let x_267 : i32 = *(x_266);
+    *(x_266) = (x_267 + 1);
+  }
+  return vec4<f32>(0.0, 0.0, 0.0, 1.0);
+}
+
+fn main_1() {
+  var pos_1 : vec2<f32>;
+  var ipos : vec2<i32>;
+  var param : vec2<i32>;
+  let x_205 : vec4<f32> = gl_FragCoord;
+  let x_208 : vec2<f32> = x_13.resolution;
+  pos_1 = (vec2<f32>(x_205.x, x_205.y) / x_208);
+  let x_211 : f32 = pos_1.x;
+  let x_215 : f32 = pos_1.y;
+  ipos = vec2<i32>(i32((x_211 * 256.0)), i32((x_215 * 256.0)));
+  let x_219 : vec2<i32> = ipos;
+  param = x_219;
+  let x_220 : vec4<f32> = trace_vi2_(&(param));
+  x_GLF_color = x_220;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/0.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/0.wgsl
new file mode 100644
index 0000000..5e10336
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/0.wgsl
@@ -0,0 +1,85 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_13 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn trace_vi2_(pos : ptr<function, vec2<i32>>) -> vec4<f32> {
+  var indexable : array<i32, 256>;
+  var indexable_1 : array<i32, 256>;
+  var p : f32;
+  var indexable_2 : array<i32, 256>;
+  loop {
+    var x_247 : bool;
+    var x_248_phi : bool;
+    let x_227 : i32 = (*(pos)).y;
+    if ((x_227 != 256)) {
+    } else {
+      break;
+    }
+    let x_231 : i32 = (*(pos)).x;
+    let x_233 : i32 = (*(pos)).y;
+    indexable = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+    let x_235 : i32 = indexable[x_233];
+    let x_237 : bool = (x_231 < (x_235 + 15));
+    x_248_phi = x_237;
+    if (x_237) {
+      let x_241 : i32 = (*(pos)).x;
+      let x_243 : i32 = (*(pos)).y;
+      indexable_1 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+      let x_245 : i32 = indexable_1[x_243];
+      x_247 = (x_241 > (x_245 - 15));
+      x_248_phi = x_247;
+    }
+    let x_248 : bool = x_248_phi;
+    if (x_248) {
+      let x_252 : i32 = (*(pos)).x;
+      let x_254 : i32 = (*(pos)).y;
+      indexable_2 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+      let x_256 : i32 = indexable_2[x_254];
+      p = ((15.0 - abs(f32((x_252 - x_256)))) / 15.0);
+      let x_262 : f32 = p;
+      let x_263 : f32 = p;
+      let x_264 : f32 = p;
+      return vec4<f32>(x_262, x_263, x_264, 1.0);
+    }
+    let x_266 : ptr<function, i32> = &((*(pos)).y);
+    let x_267 : i32 = *(x_266);
+    *(x_266) = (x_267 + 1);
+  }
+  return vec4<f32>(0.0, 0.0, 0.0, 1.0);
+}
+
+fn main_1() {
+  var pos_1 : vec2<f32>;
+  var ipos : vec2<i32>;
+  var param : vec2<i32>;
+  let x_205 : vec4<f32> = gl_FragCoord;
+  let x_208 : vec2<f32> = x_13.resolution;
+  pos_1 = (vec2<f32>(x_205.x, x_205.y) / x_208);
+  let x_211 : f32 = pos_1.x;
+  let x_215 : f32 = pos_1.y;
+  ipos = vec2<i32>(i32((x_211 * 256.0)), i32((x_215 * 256.0)));
+  let x_219 : vec2<i32> = ipos;
+  param = x_219;
+  let x_220 : vec4<f32> = trace_vi2_(&(param));
+  x_GLF_color = x_220;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..7b7c9a4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/0.wgsl.expected.hlsl
@@ -0,0 +1,84 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_13 : register(b0, space0) {
+  uint4 x_13[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float4 trace_vi2_(inout int2 pos) {
+  int indexable[256] = (int[256])0;
+  int indexable_1[256] = (int[256])0;
+  float p = 0.0f;
+  int indexable_2[256] = (int[256])0;
+  while (true) {
+    bool x_247 = false;
+    bool x_248_phi = false;
+    const int x_227 = pos.y;
+    if ((x_227 != 256)) {
+    } else {
+      break;
+    }
+    const int x_231 = pos.x;
+    const int x_233 = pos.y;
+    const int tint_symbol_5[256] = {115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94};
+    indexable = tint_symbol_5;
+    const int x_235 = indexable[x_233];
+    const bool x_237 = (x_231 < (x_235 + 15));
+    x_248_phi = x_237;
+    if (x_237) {
+      const int x_241 = pos.x;
+      const int x_243 = pos.y;
+      const int tint_symbol_6[256] = {115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94};
+      indexable_1 = tint_symbol_6;
+      const int x_245 = indexable_1[x_243];
+      x_247 = (x_241 > (x_245 - 15));
+      x_248_phi = x_247;
+    }
+    if (x_248_phi) {
+      const int x_252 = pos.x;
+      const int x_254 = pos.y;
+      const int tint_symbol_7[256] = {115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94};
+      indexable_2 = tint_symbol_7;
+      const int x_256 = indexable_2[x_254];
+      p = ((15.0f - abs(float((x_252 - x_256)))) / 15.0f);
+      return float4(p, p, p, 1.0f);
+    }
+    const int x_267 = pos.y;
+    pos.y = (x_267 + 1);
+  }
+  return float4(0.0f, 0.0f, 0.0f, 1.0f);
+}
+
+void main_1() {
+  float2 pos_1 = float2(0.0f, 0.0f);
+  int2 ipos = int2(0, 0);
+  int2 param = int2(0, 0);
+  const float4 x_205 = gl_FragCoord;
+  const float2 x_208 = asfloat(x_13[0].xy);
+  pos_1 = (float2(x_205.x, x_205.y) / x_208);
+  const float x_211 = pos_1.x;
+  const float x_215 = pos_1.y;
+  ipos = int2(int((x_211 * 256.0f)), int((x_215 * 256.0f)));
+  param = ipos;
+  const float4 x_220 = trace_vi2_(param);
+  x_GLF_color = x_220;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_8 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_8;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/0.wgsl.expected.msl
new file mode 100644
index 0000000..f95df19
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/0.wgsl.expected.msl
@@ -0,0 +1,91 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  int arr[256];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float4 trace_vi2_(thread int2* const pos) {
+  tint_array_wrapper indexable = {};
+  tint_array_wrapper indexable_1 = {};
+  float p = 0.0f;
+  tint_array_wrapper indexable_2 = {};
+  while (true) {
+    bool x_247 = false;
+    bool x_248_phi = false;
+    int const x_227 = (*(pos)).y;
+    if ((x_227 != 256)) {
+    } else {
+      break;
+    }
+    int const x_231 = (*(pos)).x;
+    int const x_233 = (*(pos)).y;
+    tint_array_wrapper const tint_symbol_4 = {.arr={115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94}};
+    indexable = tint_symbol_4;
+    int const x_235 = indexable.arr[x_233];
+    bool const x_237 = (x_231 < (x_235 + 15));
+    x_248_phi = x_237;
+    if (x_237) {
+      int const x_241 = (*(pos)).x;
+      int const x_243 = (*(pos)).y;
+      tint_array_wrapper const tint_symbol_5 = {.arr={115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94}};
+      indexable_1 = tint_symbol_5;
+      int const x_245 = indexable_1.arr[x_243];
+      x_247 = (x_241 > (x_245 - 15));
+      x_248_phi = x_247;
+    }
+    bool const x_248 = x_248_phi;
+    if (x_248) {
+      int const x_252 = (*(pos)).x;
+      int const x_254 = (*(pos)).y;
+      tint_array_wrapper const tint_symbol_6 = {.arr={115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94}};
+      indexable_2 = tint_symbol_6;
+      int const x_256 = indexable_2.arr[x_254];
+      p = ((15.0f - fabs(float((x_252 - x_256)))) / 15.0f);
+      float const x_262 = p;
+      float const x_263 = p;
+      float const x_264 = p;
+      return float4(x_262, x_263, x_264, 1.0f);
+    }
+    int const x_267 = (*(pos)).y;
+    (*(pos)).y = (x_267 + 1);
+  }
+  return float4(0.0f, 0.0f, 0.0f, 1.0f);
+}
+
+void main_1(constant buf0& x_13, thread float4* const tint_symbol_8, thread float4* const tint_symbol_9) {
+  float2 pos_1 = 0.0f;
+  int2 ipos = 0;
+  int2 param = 0;
+  float4 const x_205 = *(tint_symbol_8);
+  float2 const x_208 = x_13.resolution;
+  pos_1 = (float2(x_205.x, x_205.y) / x_208);
+  float const x_211 = pos_1.x;
+  float const x_215 = pos_1.y;
+  ipos = int2(int((x_211 * 256.0f)), int((x_215 * 256.0f)));
+  int2 const x_219 = ipos;
+  param = x_219;
+  float4 const x_220 = trace_vi2_(&(param));
+  *(tint_symbol_9) = x_220;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_13 [[buffer(0)]]) {
+  thread float4 tint_symbol_10 = 0.0f;
+  thread float4 tint_symbol_11 = 0.0f;
+  tint_symbol_10 = gl_FragCoord_param;
+  main_1(x_13, &(tint_symbol_10), &(tint_symbol_11));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_11};
+  tint_symbol_2 const tint_symbol_7 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_7;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..1bc7c3e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/0.wgsl.expected.spvasm
@@ -0,0 +1,378 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 310
+; Schema: 0
+               OpCapability Shader
+        %247 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_13 "x_13"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %trace_vi2_ "trace_vi2_"
+               OpName %pos "pos"
+               OpName %indexable "indexable"
+               OpName %indexable_1 "indexable_1"
+               OpName %p "p"
+               OpName %indexable_2 "indexable_2"
+               OpName %x_247 "x_247"
+               OpName %x_248_phi "x_248_phi"
+               OpName %main_1 "main_1"
+               OpName %pos_1 "pos_1"
+               OpName %ipos "ipos"
+               OpName %param "param"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_13 NonWritable
+               OpDecorate %x_13 DescriptorSet 0
+               OpDecorate %x_13 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_int_uint_256 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_13 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %15 = OpTypeFunction %v4float %_ptr_Function_v2int
+       %uint = OpTypeInt 32 0
+   %uint_256 = OpConstant %uint 256
+%_arr_int_uint_256 = OpTypeArray %int %uint_256
+%_ptr_Function__arr_int_uint_256 = OpTypePointer Function %_arr_int_uint_256
+         %27 = OpConstantNull %_arr_int_uint_256
+%_ptr_Function_float = OpTypePointer Function %float
+         %31 = OpConstantNull %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %40 = OpConstantNull %bool
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_int = OpTypePointer Function %int
+    %int_256 = OpConstant %int 256
+     %uint_0 = OpConstant %uint 0
+    %int_115 = OpConstant %int 115
+    %int_133 = OpConstant %int 133
+    %int_150 = OpConstant %int 150
+    %int_164 = OpConstant %int 164
+    %int_176 = OpConstant %int 176
+    %int_184 = OpConstant %int 184
+    %int_190 = OpConstant %int 190
+    %int_192 = OpConstant %int 192
+    %int_191 = OpConstant %int 191
+    %int_187 = OpConstant %int 187
+    %int_181 = OpConstant %int 181
+    %int_172 = OpConstant %int 172
+    %int_163 = OpConstant %int 163
+    %int_153 = OpConstant %int 153
+    %int_143 = OpConstant %int 143
+    %int_134 = OpConstant %int 134
+    %int_126 = OpConstant %int 126
+    %int_120 = OpConstant %int 120
+    %int_116 = OpConstant %int 116
+    %int_114 = OpConstant %int 114
+    %int_117 = OpConstant %int 117
+    %int_121 = OpConstant %int 121
+    %int_127 = OpConstant %int 127
+    %int_141 = OpConstant %int 141
+    %int_148 = OpConstant %int 148
+    %int_154 = OpConstant %int 154
+    %int_159 = OpConstant %int 159
+    %int_162 = OpConstant %int 162
+    %int_161 = OpConstant %int 161
+    %int_157 = OpConstant %int 157
+    %int_151 = OpConstant %int 151
+    %int_124 = OpConstant %int 124
+    %int_113 = OpConstant %int 113
+    %int_103 = OpConstant %int 103
+     %int_94 = OpConstant %int 94
+     %int_87 = OpConstant %int 87
+     %int_82 = OpConstant %int 82
+     %int_79 = OpConstant %int 79
+     %int_80 = OpConstant %int 80
+     %int_84 = OpConstant %int 84
+     %int_91 = OpConstant %int 91
+    %int_101 = OpConstant %int 101
+    %int_130 = OpConstant %int 130
+    %int_146 = OpConstant %int 146
+    %int_182 = OpConstant %int 182
+    %int_199 = OpConstant %int 199
+    %int_215 = OpConstant %int 215
+    %int_229 = OpConstant %int 229
+    %int_240 = OpConstant %int 240
+    %int_249 = OpConstant %int 249
+    %int_254 = OpConstant %int 254
+    %int_250 = OpConstant %int 250
+    %int_243 = OpConstant %int 243
+    %int_233 = OpConstant %int 233
+    %int_223 = OpConstant %int 223
+    %int_212 = OpConstant %int 212
+    %int_200 = OpConstant %int 200
+    %int_180 = OpConstant %int 180
+    %int_166 = OpConstant %int 166
+    %int_169 = OpConstant %int 169
+    %int_174 = OpConstant %int 174
+    %int_179 = OpConstant %int 179
+    %int_185 = OpConstant %int 185
+    %int_193 = OpConstant %int 193
+    %int_195 = OpConstant %int 195
+    %int_188 = OpConstant %int 188
+    %int_171 = OpConstant %int 171
+    %int_149 = OpConstant %int 149
+    %int_137 = OpConstant %int 137
+    %int_125 = OpConstant %int 125
+    %int_105 = OpConstant %int 105
+     %int_97 = OpConstant %int 97
+     %int_93 = OpConstant %int 93
+     %int_98 = OpConstant %int 98
+    %int_106 = OpConstant %int 106
+    %int_145 = OpConstant %int 145
+    %int_177 = OpConstant %int 177
+    %int_208 = OpConstant %int 208
+    %int_221 = OpConstant %int 221
+    %int_231 = OpConstant %int 231
+    %int_239 = OpConstant %int 239
+    %int_244 = OpConstant %int 244
+    %int_242 = OpConstant %int 242
+    %int_236 = OpConstant %int 236
+    %int_228 = OpConstant %int 228
+    %int_218 = OpConstant %int 218
+    %int_207 = OpConstant %int 207
+    %int_194 = OpConstant %int 194
+    %int_158 = OpConstant %int 158
+    %int_135 = OpConstant %int 135
+    %int_132 = OpConstant %int 132
+    %int_131 = OpConstant %int 131
+    %int_138 = OpConstant %int 138
+    %int_147 = OpConstant %int 147
+    %int_155 = OpConstant %int 155
+    %int_152 = OpConstant %int 152
+    %int_139 = OpConstant %int 139
+    %int_129 = OpConstant %int 129
+    %int_118 = OpConstant %int 118
+     %int_68 = OpConstant %int 68
+     %int_58 = OpConstant %int 58
+     %int_49 = OpConstant %int 49
+     %int_43 = OpConstant %int 43
+     %int_40 = OpConstant %int 40
+     %int_41 = OpConstant %int 41
+     %int_44 = OpConstant %int 44
+     %int_51 = OpConstant %int 51
+     %int_61 = OpConstant %int 61
+     %int_73 = OpConstant %int 73
+    %int_119 = OpConstant %int 119
+    %int_173 = OpConstant %int 173
+    %int_186 = OpConstant %int 186
+    %int_128 = OpConstant %int 128
+    %int_104 = OpConstant %int 104
+     %int_86 = OpConstant %int 86
+     %int_81 = OpConstant %int 81
+     %int_77 = OpConstant %int 77
+     %int_76 = OpConstant %int 76
+     %int_89 = OpConstant %int 89
+    %int_102 = OpConstant %int 102
+     %int_92 = OpConstant %int 92
+     %int_83 = OpConstant %int 83
+     %int_62 = OpConstant %int 62
+     %int_50 = OpConstant %int 50
+     %int_38 = OpConstant %int 38
+     %int_26 = OpConstant %int 26
+     %int_16 = OpConstant %int 16
+      %int_8 = OpConstant %int 8
+      %int_2 = OpConstant %int 2
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+     %int_11 = OpConstant %int 11
+     %int_21 = OpConstant %int 21
+     %int_33 = OpConstant %int 33
+     %int_48 = OpConstant %int 48
+     %int_64 = OpConstant %int 64
+    %int_144 = OpConstant %int 144
+    %int_123 = OpConstant %int 123
+    %int_112 = OpConstant %int 112
+    %int_100 = OpConstant %int 100
+     %int_90 = OpConstant %int 90
+     %int_65 = OpConstant %int 65
+     %int_67 = OpConstant %int 67
+     %int_70 = OpConstant %int 70
+     %int_75 = OpConstant %int 75
+     %int_95 = OpConstant %int 95
+     %int_88 = OpConstant %int 88
+     %int_69 = OpConstant %int 69
+     %int_47 = OpConstant %int 47
+     %int_36 = OpConstant %int 36
+     %int_18 = OpConstant %int 18
+     %int_13 = OpConstant %int 13
+     %int_15 = OpConstant %int 15
+     %int_22 = OpConstant %int 22
+     %int_32 = OpConstant %int 32
+     %int_45 = OpConstant %int 45
+     %int_60 = OpConstant %int 60
+        %216 = OpConstantComposite %_arr_int_uint_256 %int_115 %int_133 %int_150 %int_164 %int_176 %int_184 %int_190 %int_192 %int_191 %int_187 %int_181 %int_172 %int_163 %int_153 %int_143 %int_134 %int_126 %int_120 %int_116 %int_114 %int_114 %int_117 %int_121 %int_127 %int_134 %int_141 %int_148 %int_154 %int_159 %int_162 %int_163 %int_161 %int_157 %int_151 %int_143 %int_134 %int_124 %int_113 %int_103 %int_94 %int_87 %int_82 %int_79 %int_80 %int_84 %int_91 %int_101 %int_114 %int_130 %int_146 %int_164 %int_182 %int_199 %int_215 %int_229 %int_240 %int_249 %int_254 %int_256 %int_254 %int_250 %int_243 %int_233 %int_223 %int_212 %int_200 %int_190 %int_180 %int_172 %int_166 %int_163 %int_161 %int_162 %int_164 %int_169 %int_174 %int_179 %int_185 %int_190 %int_193 %int_195 %int_195 %int_192 %int_188 %int_180 %int_171 %int_161 %int_149 %int_137 %int_125 %int_114 %int_105 %int_97 %int_93 %int_91 %int_93 %int_98 %int_106 %int_117 %int_130 %int_145 %int_161 %int_177 %int_193 %int_208 %int_221 %int_231 %int_239 %int_243 %int_244 %int_242 %int_236 %int_228 %int_218 %int_207 %int_194 %int_181 %int_169 %int_158 %int_148 %int_141 %int_135 %int_132 %int_131 %int_132 %int_135 %int_138 %int_143 %int_147 %int_151 %int_154 %int_155 %int_155 %int_152 %int_146 %int_139 %int_129 %int_118 %int_106 %int_93 %int_80 %int_68 %int_58 %int_49 %int_43 %int_40 %int_41 %int_44 %int_51 %int_61 %int_73 %int_87 %int_103 %int_119 %int_134 %int_149 %int_162 %int_173 %int_181 %int_186 %int_188 %int_186 %int_181 %int_174 %int_164 %int_153 %int_141 %int_128 %int_116 %int_104 %int_94 %int_86 %int_81 %int_77 %int_76 %int_77 %int_80 %int_84 %int_89 %int_94 %int_98 %int_102 %int_104 %int_104 %int_102 %int_98 %int_92 %int_83 %int_73 %int_62 %int_50 %int_38 %int_26 %int_16 %int_8 %int_2 %int_0 %int_0 %int_4 %int_11 %int_21 %int_33 %int_48 %int_64 %int_81 %int_98 %int_114 %int_129 %int_141 %int_151 %int_158 %int_161 %int_161 %int_158 %int_152 %int_144 %int_134 %int_123 %int_112 %int_100 %int_90 %int_81 %int_73 %int_68 %int_65 %int_65 %int_67 %int_70 %int_75 %int_81 %int_87 %int_92 %int_97 %int_101 %int_103 %int_102 %int_100 %int_95 %int_88 %int_79 %int_69 %int_58 %int_47 %int_36 %int_26 %int_18 %int_13 %int_11 %int_11 %int_15 %int_22 %int_32 %int_45 %int_60 %int_77 %int_94
+   %float_15 = OpConstant %float 15
+    %float_1 = OpConstant %float 1
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+        %265 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+       %void = OpTypeVoid
+        %266 = OpTypeFunction %void
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+        %272 = OpConstantNull %v2float
+        %274 = OpConstantNull %v2int
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+  %float_256 = OpConstant %float 256
+   %main_out = OpTypeStruct %v4float
+        %297 = OpTypeFunction %void %main_out
+ %trace_vi2_ = OpFunction %v4float None %15
+        %pos = OpFunctionParameter %_ptr_Function_v2int
+         %21 = OpLabel
+  %indexable = OpVariable %_ptr_Function__arr_int_uint_256 Function %27
+%indexable_1 = OpVariable %_ptr_Function__arr_int_uint_256 Function %27
+          %p = OpVariable %_ptr_Function_float Function %31
+%indexable_2 = OpVariable %_ptr_Function__arr_int_uint_256 Function %27
+      %x_247 = OpVariable %_ptr_Function_bool Function %40
+  %x_248_phi = OpVariable %_ptr_Function_bool Function %40
+               OpBranch %33
+         %33 = OpLabel
+               OpLoopMerge %34 %35 None
+               OpBranch %36
+         %36 = OpLabel
+         %45 = OpAccessChain %_ptr_Function_int %pos %uint_1
+         %46 = OpLoad %int %45
+         %48 = OpINotEqual %bool %46 %int_256
+               OpSelectionMerge %49 None
+               OpBranchConditional %48 %50 %51
+         %50 = OpLabel
+               OpBranch %49
+         %51 = OpLabel
+               OpBranch %34
+         %49 = OpLabel
+         %54 = OpAccessChain %_ptr_Function_int %pos %uint_0
+         %55 = OpLoad %int %54
+         %57 = OpAccessChain %_ptr_Function_int %pos %uint_1
+         %58 = OpLoad %int %57
+               OpStore %indexable %216
+        %217 = OpAccessChain %_ptr_Function_int %indexable %58
+        %218 = OpLoad %int %217
+        %219 = OpIAdd %int %218 %int_15
+        %220 = OpSLessThan %bool %55 %219
+               OpStore %x_248_phi %220
+               OpSelectionMerge %221 None
+               OpBranchConditional %220 %222 %221
+        %222 = OpLabel
+        %224 = OpAccessChain %_ptr_Function_int %pos %uint_0
+        %225 = OpLoad %int %224
+        %227 = OpAccessChain %_ptr_Function_int %pos %uint_1
+        %228 = OpLoad %int %227
+               OpStore %indexable_1 %216
+        %229 = OpAccessChain %_ptr_Function_int %indexable_1 %228
+        %230 = OpLoad %int %229
+        %231 = OpISub %int %230 %int_15
+        %232 = OpSGreaterThan %bool %225 %231
+               OpStore %x_247 %232
+        %233 = OpLoad %bool %x_247
+               OpStore %x_248_phi %233
+               OpBranch %221
+        %221 = OpLabel
+        %234 = OpLoad %bool %x_248_phi
+               OpSelectionMerge %235 None
+               OpBranchConditional %234 %236 %235
+        %236 = OpLabel
+        %238 = OpAccessChain %_ptr_Function_int %pos %uint_0
+        %239 = OpLoad %int %238
+        %241 = OpAccessChain %_ptr_Function_int %pos %uint_1
+        %242 = OpLoad %int %241
+               OpStore %indexable_2 %216
+        %243 = OpAccessChain %_ptr_Function_int %indexable_2 %242
+        %244 = OpLoad %int %243
+        %249 = OpISub %int %239 %244
+        %248 = OpConvertSToF %float %249
+        %246 = OpExtInst %float %247 FAbs %248
+        %250 = OpFSub %float %float_15 %246
+        %251 = OpFDiv %float %250 %float_15
+               OpStore %p %251
+        %252 = OpLoad %float %p
+        %253 = OpLoad %float %p
+        %254 = OpLoad %float %p
+        %256 = OpCompositeConstruct %v4float %252 %253 %254 %float_1
+               OpReturnValue %256
+        %235 = OpLabel
+        %258 = OpAccessChain %_ptr_Function_int %pos %uint_1
+        %259 = OpLoad %int %258
+        %261 = OpAccessChain %_ptr_Function_int %pos %uint_1
+        %263 = OpIAdd %int %259 %int_1
+               OpStore %261 %263
+               OpBranch %35
+         %35 = OpLabel
+               OpBranch %33
+         %34 = OpLabel
+               OpReturnValue %265
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %266
+        %269 = OpLabel
+      %pos_1 = OpVariable %_ptr_Function_v2float Function %272
+       %ipos = OpVariable %_ptr_Function_v2int Function %274
+      %param = OpVariable %_ptr_Function_v2int Function %274
+        %276 = OpLoad %v4float %gl_FragCoord
+        %278 = OpAccessChain %_ptr_Uniform_v2float %x_13 %uint_0
+        %279 = OpLoad %v2float %278
+        %280 = OpCompositeExtract %float %276 0
+        %281 = OpCompositeExtract %float %276 1
+        %282 = OpCompositeConstruct %v2float %280 %281
+        %283 = OpFDiv %v2float %282 %279
+               OpStore %pos_1 %283
+        %284 = OpAccessChain %_ptr_Function_float %pos_1 %uint_0
+        %285 = OpLoad %float %284
+        %286 = OpAccessChain %_ptr_Function_float %pos_1 %uint_1
+        %287 = OpLoad %float %286
+        %290 = OpFMul %float %285 %float_256
+        %288 = OpConvertFToS %int %290
+        %292 = OpFMul %float %287 %float_256
+        %291 = OpConvertFToS %int %292
+        %293 = OpCompositeConstruct %v2int %288 %291
+               OpStore %ipos %293
+        %294 = OpLoad %v2int %ipos
+               OpStore %param %294
+        %295 = OpFunctionCall %v4float %trace_vi2_ %param
+               OpStore %x_GLF_color %295
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %297
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %301 = OpLabel
+        %302 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %302
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %266
+        %304 = OpLabel
+        %305 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %305
+        %306 = OpFunctionCall %void %main_1
+        %308 = OpLoad %v4float %x_GLF_color
+        %309 = OpCompositeConstruct %main_out %308
+        %307 = OpFunctionCall %void %tint_symbol_3 %309
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..5e10336
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/0.wgsl.expected.wgsl
@@ -0,0 +1,85 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_13 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn trace_vi2_(pos : ptr<function, vec2<i32>>) -> vec4<f32> {
+  var indexable : array<i32, 256>;
+  var indexable_1 : array<i32, 256>;
+  var p : f32;
+  var indexable_2 : array<i32, 256>;
+  loop {
+    var x_247 : bool;
+    var x_248_phi : bool;
+    let x_227 : i32 = (*(pos)).y;
+    if ((x_227 != 256)) {
+    } else {
+      break;
+    }
+    let x_231 : i32 = (*(pos)).x;
+    let x_233 : i32 = (*(pos)).y;
+    indexable = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+    let x_235 : i32 = indexable[x_233];
+    let x_237 : bool = (x_231 < (x_235 + 15));
+    x_248_phi = x_237;
+    if (x_237) {
+      let x_241 : i32 = (*(pos)).x;
+      let x_243 : i32 = (*(pos)).y;
+      indexable_1 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+      let x_245 : i32 = indexable_1[x_243];
+      x_247 = (x_241 > (x_245 - 15));
+      x_248_phi = x_247;
+    }
+    let x_248 : bool = x_248_phi;
+    if (x_248) {
+      let x_252 : i32 = (*(pos)).x;
+      let x_254 : i32 = (*(pos)).y;
+      indexable_2 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+      let x_256 : i32 = indexable_2[x_254];
+      p = ((15.0 - abs(f32((x_252 - x_256)))) / 15.0);
+      let x_262 : f32 = p;
+      let x_263 : f32 = p;
+      let x_264 : f32 = p;
+      return vec4<f32>(x_262, x_263, x_264, 1.0);
+    }
+    let x_266 : ptr<function, i32> = &((*(pos)).y);
+    let x_267 : i32 = *(x_266);
+    *(x_266) = (x_267 + 1);
+  }
+  return vec4<f32>(0.0, 0.0, 0.0, 1.0);
+}
+
+fn main_1() {
+  var pos_1 : vec2<f32>;
+  var ipos : vec2<i32>;
+  var param : vec2<i32>;
+  let x_205 : vec4<f32> = gl_FragCoord;
+  let x_208 : vec2<f32> = x_13.resolution;
+  pos_1 = (vec2<f32>(x_205.x, x_205.y) / x_208);
+  let x_211 : f32 = pos_1.x;
+  let x_215 : f32 = pos_1.y;
+  ipos = vec2<i32>(i32((x_211 * 256.0)), i32((x_215 * 256.0)));
+  let x_219 : vec2<i32> = ipos;
+  param = x_219;
+  let x_220 : vec4<f32> = trace_vi2_(&(param));
+  x_GLF_color = x_220;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/1.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/1.spvasm
new file mode 100644
index 0000000..6ef1627
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/1.spvasm
@@ -0,0 +1,327 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %trace_vi2_ "trace(vi2;"
+               OpName %pos "pos"
+               OpName %indexable "indexable"
+               OpName %indexable_0 "indexable"
+               OpName %p "p"
+               OpName %indexable_1 "indexable"
+               OpName %pos_0 "pos"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %ipos "ipos"
+               OpName %_GLF_color "_GLF_color"
+               OpName %param "param"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %17 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+         %23 = OpTypeFunction %v4float %_ptr_Function_v2int
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_int = OpTypePointer Function %int
+    %int_256 = OpConstant %int 256
+       %bool = OpTypeBool
+     %uint_0 = OpConstant %uint 0
+   %uint_256 = OpConstant %uint 256
+%_arr_int_uint_256 = OpTypeArray %int %uint_256
+    %int_115 = OpConstant %int 115
+    %int_133 = OpConstant %int 133
+    %int_150 = OpConstant %int 150
+    %int_164 = OpConstant %int 164
+    %int_176 = OpConstant %int 176
+    %int_184 = OpConstant %int 184
+    %int_190 = OpConstant %int 190
+    %int_192 = OpConstant %int 192
+    %int_191 = OpConstant %int 191
+    %int_187 = OpConstant %int 187
+    %int_181 = OpConstant %int 181
+    %int_172 = OpConstant %int 172
+    %int_163 = OpConstant %int 163
+    %int_153 = OpConstant %int 153
+    %int_143 = OpConstant %int 143
+    %int_134 = OpConstant %int 134
+    %int_126 = OpConstant %int 126
+    %int_120 = OpConstant %int 120
+    %int_116 = OpConstant %int 116
+    %int_114 = OpConstant %int 114
+    %int_117 = OpConstant %int 117
+    %int_121 = OpConstant %int 121
+    %int_127 = OpConstant %int 127
+    %int_141 = OpConstant %int 141
+    %int_148 = OpConstant %int 148
+    %int_154 = OpConstant %int 154
+    %int_159 = OpConstant %int 159
+    %int_162 = OpConstant %int 162
+    %int_161 = OpConstant %int 161
+    %int_157 = OpConstant %int 157
+    %int_151 = OpConstant %int 151
+    %int_124 = OpConstant %int 124
+    %int_113 = OpConstant %int 113
+    %int_103 = OpConstant %int 103
+     %int_94 = OpConstant %int 94
+     %int_87 = OpConstant %int 87
+     %int_82 = OpConstant %int 82
+     %int_79 = OpConstant %int 79
+     %int_80 = OpConstant %int 80
+     %int_84 = OpConstant %int 84
+     %int_91 = OpConstant %int 91
+    %int_101 = OpConstant %int 101
+    %int_130 = OpConstant %int 130
+    %int_146 = OpConstant %int 146
+    %int_182 = OpConstant %int 182
+    %int_199 = OpConstant %int 199
+    %int_215 = OpConstant %int 215
+    %int_229 = OpConstant %int 229
+    %int_240 = OpConstant %int 240
+    %int_249 = OpConstant %int 249
+    %int_254 = OpConstant %int 254
+    %int_250 = OpConstant %int 250
+    %int_243 = OpConstant %int 243
+    %int_233 = OpConstant %int 233
+    %int_223 = OpConstant %int 223
+    %int_212 = OpConstant %int 212
+    %int_200 = OpConstant %int 200
+    %int_180 = OpConstant %int 180
+    %int_166 = OpConstant %int 166
+    %int_169 = OpConstant %int 169
+    %int_174 = OpConstant %int 174
+    %int_179 = OpConstant %int 179
+    %int_185 = OpConstant %int 185
+    %int_193 = OpConstant %int 193
+    %int_195 = OpConstant %int 195
+    %int_188 = OpConstant %int 188
+    %int_171 = OpConstant %int 171
+    %int_149 = OpConstant %int 149
+    %int_137 = OpConstant %int 137
+    %int_125 = OpConstant %int 125
+    %int_105 = OpConstant %int 105
+     %int_97 = OpConstant %int 97
+     %int_93 = OpConstant %int 93
+     %int_98 = OpConstant %int 98
+    %int_106 = OpConstant %int 106
+    %int_145 = OpConstant %int 145
+    %int_177 = OpConstant %int 177
+    %int_208 = OpConstant %int 208
+    %int_221 = OpConstant %int 221
+    %int_231 = OpConstant %int 231
+    %int_239 = OpConstant %int 239
+    %int_244 = OpConstant %int 244
+    %int_242 = OpConstant %int 242
+    %int_236 = OpConstant %int 236
+    %int_228 = OpConstant %int 228
+    %int_218 = OpConstant %int 218
+    %int_207 = OpConstant %int 207
+    %int_194 = OpConstant %int 194
+    %int_158 = OpConstant %int 158
+    %int_135 = OpConstant %int 135
+    %int_132 = OpConstant %int 132
+    %int_131 = OpConstant %int 131
+    %int_138 = OpConstant %int 138
+    %int_147 = OpConstant %int 147
+    %int_155 = OpConstant %int 155
+    %int_152 = OpConstant %int 152
+    %int_139 = OpConstant %int 139
+    %int_129 = OpConstant %int 129
+    %int_118 = OpConstant %int 118
+     %int_68 = OpConstant %int 68
+     %int_58 = OpConstant %int 58
+     %int_49 = OpConstant %int 49
+     %int_43 = OpConstant %int 43
+     %int_40 = OpConstant %int 40
+     %int_41 = OpConstant %int 41
+     %int_44 = OpConstant %int 44
+     %int_51 = OpConstant %int 51
+     %int_61 = OpConstant %int 61
+     %int_73 = OpConstant %int 73
+    %int_119 = OpConstant %int 119
+    %int_173 = OpConstant %int 173
+    %int_186 = OpConstant %int 186
+    %int_128 = OpConstant %int 128
+    %int_104 = OpConstant %int 104
+     %int_86 = OpConstant %int 86
+     %int_81 = OpConstant %int 81
+     %int_77 = OpConstant %int 77
+     %int_76 = OpConstant %int 76
+     %int_89 = OpConstant %int 89
+    %int_102 = OpConstant %int 102
+     %int_92 = OpConstant %int 92
+     %int_83 = OpConstant %int 83
+     %int_62 = OpConstant %int 62
+     %int_50 = OpConstant %int 50
+     %int_38 = OpConstant %int 38
+     %int_26 = OpConstant %int 26
+     %int_16 = OpConstant %int 16
+      %int_8 = OpConstant %int 8
+      %int_2 = OpConstant %int 2
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+     %int_11 = OpConstant %int 11
+     %int_21 = OpConstant %int 21
+     %int_33 = OpConstant %int 33
+     %int_48 = OpConstant %int 48
+     %int_64 = OpConstant %int 64
+    %int_144 = OpConstant %int 144
+    %int_123 = OpConstant %int 123
+    %int_112 = OpConstant %int 112
+    %int_100 = OpConstant %int 100
+     %int_90 = OpConstant %int 90
+     %int_65 = OpConstant %int 65
+     %int_67 = OpConstant %int 67
+     %int_70 = OpConstant %int 70
+     %int_75 = OpConstant %int 75
+     %int_95 = OpConstant %int 95
+     %int_88 = OpConstant %int 88
+     %int_69 = OpConstant %int 69
+     %int_47 = OpConstant %int 47
+     %int_36 = OpConstant %int 36
+     %int_18 = OpConstant %int 18
+     %int_13 = OpConstant %int 13
+     %int_15 = OpConstant %int 15
+     %int_22 = OpConstant %int 22
+     %int_32 = OpConstant %int 32
+     %int_45 = OpConstant %int 45
+     %int_60 = OpConstant %int 60
+        %189 = OpConstantComposite %_arr_int_uint_256 %int_115 %int_133 %int_150 %int_164 %int_176 %int_184 %int_190 %int_192 %int_191 %int_187 %int_181 %int_172 %int_163 %int_153 %int_143 %int_134 %int_126 %int_120 %int_116 %int_114 %int_114 %int_117 %int_121 %int_127 %int_134 %int_141 %int_148 %int_154 %int_159 %int_162 %int_163 %int_161 %int_157 %int_151 %int_143 %int_134 %int_124 %int_113 %int_103 %int_94 %int_87 %int_82 %int_79 %int_80 %int_84 %int_91 %int_101 %int_114 %int_130 %int_146 %int_164 %int_182 %int_199 %int_215 %int_229 %int_240 %int_249 %int_254 %int_256 %int_254 %int_250 %int_243 %int_233 %int_223 %int_212 %int_200 %int_190 %int_180 %int_172 %int_166 %int_163 %int_161 %int_162 %int_164 %int_169 %int_174 %int_179 %int_185 %int_190 %int_193 %int_195 %int_195 %int_192 %int_188 %int_180 %int_171 %int_161 %int_149 %int_137 %int_125 %int_114 %int_105 %int_97 %int_93 %int_91 %int_93 %int_98 %int_106 %int_117 %int_130 %int_145 %int_161 %int_177 %int_193 %int_208 %int_221 %int_231 %int_239 %int_243 %int_244 %int_242 %int_236 %int_228 %int_218 %int_207 %int_194 %int_181 %int_169 %int_158 %int_148 %int_141 %int_135 %int_132 %int_131 %int_132 %int_135 %int_138 %int_143 %int_147 %int_151 %int_154 %int_155 %int_155 %int_152 %int_146 %int_139 %int_129 %int_118 %int_106 %int_93 %int_80 %int_68 %int_58 %int_49 %int_43 %int_40 %int_41 %int_44 %int_51 %int_61 %int_73 %int_87 %int_103 %int_119 %int_134 %int_149 %int_162 %int_173 %int_181 %int_186 %int_188 %int_186 %int_181 %int_174 %int_164 %int_153 %int_141 %int_128 %int_116 %int_104 %int_94 %int_86 %int_81 %int_77 %int_76 %int_77 %int_80 %int_84 %int_89 %int_94 %int_98 %int_102 %int_104 %int_104 %int_102 %int_98 %int_92 %int_83 %int_73 %int_62 %int_50 %int_38 %int_26 %int_16 %int_8 %int_2 %int_0 %int_0 %int_4 %int_11 %int_21 %int_33 %int_48 %int_64 %int_81 %int_98 %int_114 %int_129 %int_141 %int_151 %int_158 %int_161 %int_161 %int_158 %int_152 %int_144 %int_134 %int_123 %int_112 %int_100 %int_90 %int_81 %int_73 %int_68 %int_65 %int_65 %int_67 %int_70 %int_75 %int_81 %int_87 %int_92 %int_97 %int_101 %int_103 %int_102 %int_100 %int_95 %int_88 %int_79 %int_69 %int_58 %int_47 %int_36 %int_26 %int_18 %int_13 %int_11 %int_11 %int_15 %int_22 %int_32 %int_45 %int_60 %int_77 %int_94
+%_ptr_Function__arr_int_uint_256 = OpTypePointer Function %_arr_int_uint_256
+%_ptr_Function_float = OpTypePointer Function %float
+   %float_15 = OpConstant %float 15
+    %float_1 = OpConstant %float 1
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+        %196 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+  %float_256 = OpConstant %float 256
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %int_0_0 = OpConstant %int 0
+        %205 = OpConstantComposite %_arr_int_uint_256 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0 %int_0_0
+       %main = OpFunction %void None %17
+        %206 = OpLabel
+      %pos_0 = OpVariable %_ptr_Function_v2float Function
+       %ipos = OpVariable %_ptr_Function_v2int Function
+      %param = OpVariable %_ptr_Function_v2int Function
+        %207 = OpLoad %v4float %gl_FragCoord
+        %208 = OpVectorShuffle %v2float %207 %207 0 1
+        %209 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+        %210 = OpLoad %v2float %209
+        %211 = OpFDiv %v2float %208 %210
+               OpStore %pos_0 %211
+        %212 = OpAccessChain %_ptr_Function_float %pos_0 %uint_0
+        %213 = OpLoad %float %212
+        %214 = OpFMul %float %213 %float_256
+        %215 = OpConvertFToS %int %214
+        %216 = OpAccessChain %_ptr_Function_float %pos_0 %uint_1
+        %217 = OpLoad %float %216
+        %218 = OpFMul %float %217 %float_256
+        %219 = OpConvertFToS %int %218
+        %220 = OpCompositeConstruct %v2int %215 %219
+               OpStore %ipos %220
+        %221 = OpLoad %v2int %ipos
+               OpStore %param %221
+        %222 = OpFunctionCall %v4float %trace_vi2_ %param
+               OpStore %_GLF_color %222
+               OpReturn
+               OpFunctionEnd
+ %trace_vi2_ = OpFunction %v4float None %23
+        %pos = OpFunctionParameter %_ptr_Function_v2int
+        %223 = OpLabel
+  %indexable = OpVariable %_ptr_Function__arr_int_uint_256 Function
+%indexable_0 = OpVariable %_ptr_Function__arr_int_uint_256 Function
+          %p = OpVariable %_ptr_Function_float Function
+%indexable_1 = OpVariable %_ptr_Function__arr_int_uint_256 Function
+               OpBranch %224
+        %224 = OpLabel
+               OpLoopMerge %225 %226 None
+               OpBranch %227
+        %227 = OpLabel
+        %228 = OpAccessChain %_ptr_Function_int %pos %uint_1
+        %229 = OpLoad %int %228
+        %230 = OpINotEqual %bool %229 %int_256
+               OpBranchConditional %230 %231 %225
+        %231 = OpLabel
+        %232 = OpAccessChain %_ptr_Function_int %pos %uint_0
+        %233 = OpLoad %int %232
+        %234 = OpAccessChain %_ptr_Function_int %pos %uint_1
+        %235 = OpLoad %int %234
+               OpStore %indexable %189
+        %236 = OpAccessChain %_ptr_Function_int %indexable %235
+        %237 = OpLoad %int %236
+        %238 = OpLoad %_arr_int_uint_256 %indexable
+               OpStore %indexable %205
+        %239 = OpLoad %int %228
+               OpStore %228 %int_0_0
+               OpStore %228 %239
+               OpStore %indexable %238 Volatile|Nontemporal
+        %240 = OpIAdd %int %237 %int_15
+        %241 = OpSLessThan %bool %233 %240
+               OpSelectionMerge %242 None
+               OpBranchConditional %241 %243 %242
+        %243 = OpLabel
+        %244 = OpAccessChain %_ptr_Function_int %pos %uint_0
+        %245 = OpLoad %int %244
+        %246 = OpAccessChain %_ptr_Function_int %pos %uint_1
+        %247 = OpLoad %int %246
+               OpStore %indexable_0 %189
+        %248 = OpAccessChain %_ptr_Function_int %indexable_0 %247
+        %249 = OpLoad %int %248
+        %250 = OpISub %int %249 %int_15
+        %251 = OpSGreaterThan %bool %245 %250
+               OpBranch %242
+        %242 = OpLabel
+        %252 = OpPhi %bool %241 %231 %251 %243
+               OpSelectionMerge %253 None
+               OpBranchConditional %252 %254 %253
+        %254 = OpLabel
+        %255 = OpAccessChain %_ptr_Function_int %pos %uint_0
+        %256 = OpLoad %int %255
+        %257 = OpAccessChain %_ptr_Function_int %pos %uint_1
+        %258 = OpLoad %int %257
+               OpStore %indexable_1 %189
+        %259 = OpAccessChain %_ptr_Function_int %indexable_1 %258
+        %260 = OpLoad %int %259
+        %261 = OpISub %int %256 %260
+        %262 = OpConvertSToF %float %261
+        %263 = OpExtInst %float %1 FAbs %262
+        %264 = OpFSub %float %float_15 %263
+        %265 = OpFDiv %float %264 %float_15
+               OpStore %p %265
+        %266 = OpLoad %float %p
+        %267 = OpLoad %float %p
+        %268 = OpLoad %float %p
+        %269 = OpCompositeConstruct %v4float %266 %267 %268 %float_1
+               OpReturnValue %269
+        %253 = OpLabel
+        %270 = OpAccessChain %_ptr_Function_int %pos %uint_1
+        %271 = OpLoad %int %270
+        %272 = OpIAdd %int %271 %int_1
+               OpStore %270 %272
+               OpBranch %226
+        %226 = OpLabel
+               OpBranch %224
+        %225 = OpLabel
+               OpReturnValue %196
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..f284cbd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/1.spvasm.expected.hlsl
@@ -0,0 +1,91 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_13 : register(b0, space0) {
+  uint4 x_13[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float4 trace_vi2_(inout int2 pos) {
+  int indexable[256] = (int[256])0;
+  int indexable_1[256] = (int[256])0;
+  float p = 0.0f;
+  int indexable_2[256] = (int[256])0;
+  while (true) {
+    bool x_251 = false;
+    bool x_252_phi = false;
+    const int x_229 = pos.y;
+    if ((x_229 != 256)) {
+    } else {
+      break;
+    }
+    const int x_233 = pos.x;
+    const int x_235 = pos.y;
+    const int tint_symbol_5[256] = {115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94};
+    indexable = tint_symbol_5;
+    const int x_237 = indexable[x_235];
+    const int x_238[256] = indexable;
+    const int tint_symbol_6[256] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+    indexable = tint_symbol_6;
+    const int x_239 = pos.y;
+    pos.y = 0;
+    pos.y = x_239;
+    indexable = x_238;
+    const bool x_241 = (x_233 < (x_237 + 15));
+    x_252_phi = x_241;
+    if (x_241) {
+      const int x_245 = pos.x;
+      const int x_247 = pos.y;
+      const int tint_symbol_7[256] = {115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94};
+      indexable_1 = tint_symbol_7;
+      const int x_249 = indexable_1[x_247];
+      x_251 = (x_245 > (x_249 - 15));
+      x_252_phi = x_251;
+    }
+    if (x_252_phi) {
+      const int x_256 = pos.x;
+      const int x_258 = pos.y;
+      const int tint_symbol_8[256] = {115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94};
+      indexable_2 = tint_symbol_8;
+      const int x_260 = indexable_2[x_258];
+      p = ((15.0f - abs(float((x_256 - x_260)))) / 15.0f);
+      return float4(p, p, p, 1.0f);
+    }
+    const int x_271 = pos.y;
+    pos.y = (x_271 + 1);
+  }
+  return float4(0.0f, 0.0f, 0.0f, 1.0f);
+}
+
+void main_1() {
+  float2 pos_1 = float2(0.0f, 0.0f);
+  int2 ipos = int2(0, 0);
+  int2 param = int2(0, 0);
+  const float4 x_207 = gl_FragCoord;
+  const float2 x_210 = asfloat(x_13[0].xy);
+  pos_1 = (float2(x_207.x, x_207.y) / x_210);
+  const float x_213 = pos_1.x;
+  const float x_217 = pos_1.y;
+  ipos = int2(int((x_213 * 256.0f)), int((x_217 * 256.0f)));
+  param = ipos;
+  const float4 x_222 = trace_vi2_(param);
+  x_GLF_color = x_222;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_9 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_9;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/1.spvasm.expected.msl
new file mode 100644
index 0000000..aa07b66
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/1.spvasm.expected.msl
@@ -0,0 +1,98 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  int arr[256];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float4 trace_vi2_(thread int2* const pos) {
+  tint_array_wrapper indexable = {};
+  tint_array_wrapper indexable_1 = {};
+  float p = 0.0f;
+  tint_array_wrapper indexable_2 = {};
+  while (true) {
+    bool x_251 = false;
+    bool x_252_phi = false;
+    int const x_229 = (*(pos)).y;
+    if ((x_229 != 256)) {
+    } else {
+      break;
+    }
+    int const x_233 = (*(pos)).x;
+    int const x_235 = (*(pos)).y;
+    tint_array_wrapper const tint_symbol_4 = {.arr={115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94}};
+    indexable = tint_symbol_4;
+    int const x_237 = indexable.arr[x_235];
+    tint_array_wrapper const x_238 = indexable;
+    tint_array_wrapper const tint_symbol_5 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+    indexable = tint_symbol_5;
+    int const x_239 = (*(pos)).y;
+    (*(pos)).y = 0;
+    (*(pos)).y = x_239;
+    indexable = x_238;
+    bool const x_241 = (x_233 < (x_237 + 15));
+    x_252_phi = x_241;
+    if (x_241) {
+      int const x_245 = (*(pos)).x;
+      int const x_247 = (*(pos)).y;
+      tint_array_wrapper const tint_symbol_6 = {.arr={115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94}};
+      indexable_1 = tint_symbol_6;
+      int const x_249 = indexable_1.arr[x_247];
+      x_251 = (x_245 > (x_249 - 15));
+      x_252_phi = x_251;
+    }
+    bool const x_252 = x_252_phi;
+    if (x_252) {
+      int const x_256 = (*(pos)).x;
+      int const x_258 = (*(pos)).y;
+      tint_array_wrapper const tint_symbol_7 = {.arr={115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94}};
+      indexable_2 = tint_symbol_7;
+      int const x_260 = indexable_2.arr[x_258];
+      p = ((15.0f - fabs(float((x_256 - x_260)))) / 15.0f);
+      float const x_266 = p;
+      float const x_267 = p;
+      float const x_268 = p;
+      return float4(x_266, x_267, x_268, 1.0f);
+    }
+    int const x_271 = (*(pos)).y;
+    (*(pos)).y = (x_271 + 1);
+  }
+  return float4(0.0f, 0.0f, 0.0f, 1.0f);
+}
+
+void main_1(constant buf0& x_13, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10) {
+  float2 pos_1 = 0.0f;
+  int2 ipos = 0;
+  int2 param = 0;
+  float4 const x_207 = *(tint_symbol_9);
+  float2 const x_210 = x_13.resolution;
+  pos_1 = (float2(x_207.x, x_207.y) / x_210);
+  float const x_213 = pos_1.x;
+  float const x_217 = pos_1.y;
+  ipos = int2(int((x_213 * 256.0f)), int((x_217 * 256.0f)));
+  int2 const x_221 = ipos;
+  param = x_221;
+  float4 const x_222 = trace_vi2_(&(param));
+  *(tint_symbol_10) = x_222;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_13 [[buffer(0)]]) {
+  thread float4 tint_symbol_11 = 0.0f;
+  thread float4 tint_symbol_12 = 0.0f;
+  tint_symbol_11 = gl_FragCoord_param;
+  main_1(x_13, &(tint_symbol_11), &(tint_symbol_12));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_12};
+  tint_symbol_2 const tint_symbol_8 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_8;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..5d77d9b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/1.spvasm.expected.spvasm
@@ -0,0 +1,388 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 319
+; Schema: 0
+               OpCapability Shader
+        %256 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_13 "x_13"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %trace_vi2_ "trace_vi2_"
+               OpName %pos "pos"
+               OpName %indexable "indexable"
+               OpName %indexable_1 "indexable_1"
+               OpName %p "p"
+               OpName %indexable_2 "indexable_2"
+               OpName %x_251 "x_251"
+               OpName %x_252_phi "x_252_phi"
+               OpName %main_1 "main_1"
+               OpName %pos_1 "pos_1"
+               OpName %ipos "ipos"
+               OpName %param "param"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_13 NonWritable
+               OpDecorate %x_13 DescriptorSet 0
+               OpDecorate %x_13 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_int_uint_256 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_13 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %15 = OpTypeFunction %v4float %_ptr_Function_v2int
+       %uint = OpTypeInt 32 0
+   %uint_256 = OpConstant %uint 256
+%_arr_int_uint_256 = OpTypeArray %int %uint_256
+%_ptr_Function__arr_int_uint_256 = OpTypePointer Function %_arr_int_uint_256
+         %27 = OpConstantNull %_arr_int_uint_256
+%_ptr_Function_float = OpTypePointer Function %float
+         %31 = OpConstantNull %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %40 = OpConstantNull %bool
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_int = OpTypePointer Function %int
+    %int_256 = OpConstant %int 256
+     %uint_0 = OpConstant %uint 0
+    %int_115 = OpConstant %int 115
+    %int_133 = OpConstant %int 133
+    %int_150 = OpConstant %int 150
+    %int_164 = OpConstant %int 164
+    %int_176 = OpConstant %int 176
+    %int_184 = OpConstant %int 184
+    %int_190 = OpConstant %int 190
+    %int_192 = OpConstant %int 192
+    %int_191 = OpConstant %int 191
+    %int_187 = OpConstant %int 187
+    %int_181 = OpConstant %int 181
+    %int_172 = OpConstant %int 172
+    %int_163 = OpConstant %int 163
+    %int_153 = OpConstant %int 153
+    %int_143 = OpConstant %int 143
+    %int_134 = OpConstant %int 134
+    %int_126 = OpConstant %int 126
+    %int_120 = OpConstant %int 120
+    %int_116 = OpConstant %int 116
+    %int_114 = OpConstant %int 114
+    %int_117 = OpConstant %int 117
+    %int_121 = OpConstant %int 121
+    %int_127 = OpConstant %int 127
+    %int_141 = OpConstant %int 141
+    %int_148 = OpConstant %int 148
+    %int_154 = OpConstant %int 154
+    %int_159 = OpConstant %int 159
+    %int_162 = OpConstant %int 162
+    %int_161 = OpConstant %int 161
+    %int_157 = OpConstant %int 157
+    %int_151 = OpConstant %int 151
+    %int_124 = OpConstant %int 124
+    %int_113 = OpConstant %int 113
+    %int_103 = OpConstant %int 103
+     %int_94 = OpConstant %int 94
+     %int_87 = OpConstant %int 87
+     %int_82 = OpConstant %int 82
+     %int_79 = OpConstant %int 79
+     %int_80 = OpConstant %int 80
+     %int_84 = OpConstant %int 84
+     %int_91 = OpConstant %int 91
+    %int_101 = OpConstant %int 101
+    %int_130 = OpConstant %int 130
+    %int_146 = OpConstant %int 146
+    %int_182 = OpConstant %int 182
+    %int_199 = OpConstant %int 199
+    %int_215 = OpConstant %int 215
+    %int_229 = OpConstant %int 229
+    %int_240 = OpConstant %int 240
+    %int_249 = OpConstant %int 249
+    %int_254 = OpConstant %int 254
+    %int_250 = OpConstant %int 250
+    %int_243 = OpConstant %int 243
+    %int_233 = OpConstant %int 233
+    %int_223 = OpConstant %int 223
+    %int_212 = OpConstant %int 212
+    %int_200 = OpConstant %int 200
+    %int_180 = OpConstant %int 180
+    %int_166 = OpConstant %int 166
+    %int_169 = OpConstant %int 169
+    %int_174 = OpConstant %int 174
+    %int_179 = OpConstant %int 179
+    %int_185 = OpConstant %int 185
+    %int_193 = OpConstant %int 193
+    %int_195 = OpConstant %int 195
+    %int_188 = OpConstant %int 188
+    %int_171 = OpConstant %int 171
+    %int_149 = OpConstant %int 149
+    %int_137 = OpConstant %int 137
+    %int_125 = OpConstant %int 125
+    %int_105 = OpConstant %int 105
+     %int_97 = OpConstant %int 97
+     %int_93 = OpConstant %int 93
+     %int_98 = OpConstant %int 98
+    %int_106 = OpConstant %int 106
+    %int_145 = OpConstant %int 145
+    %int_177 = OpConstant %int 177
+    %int_208 = OpConstant %int 208
+    %int_221 = OpConstant %int 221
+    %int_231 = OpConstant %int 231
+    %int_239 = OpConstant %int 239
+    %int_244 = OpConstant %int 244
+    %int_242 = OpConstant %int 242
+    %int_236 = OpConstant %int 236
+    %int_228 = OpConstant %int 228
+    %int_218 = OpConstant %int 218
+    %int_207 = OpConstant %int 207
+    %int_194 = OpConstant %int 194
+    %int_158 = OpConstant %int 158
+    %int_135 = OpConstant %int 135
+    %int_132 = OpConstant %int 132
+    %int_131 = OpConstant %int 131
+    %int_138 = OpConstant %int 138
+    %int_147 = OpConstant %int 147
+    %int_155 = OpConstant %int 155
+    %int_152 = OpConstant %int 152
+    %int_139 = OpConstant %int 139
+    %int_129 = OpConstant %int 129
+    %int_118 = OpConstant %int 118
+     %int_68 = OpConstant %int 68
+     %int_58 = OpConstant %int 58
+     %int_49 = OpConstant %int 49
+     %int_43 = OpConstant %int 43
+     %int_40 = OpConstant %int 40
+     %int_41 = OpConstant %int 41
+     %int_44 = OpConstant %int 44
+     %int_51 = OpConstant %int 51
+     %int_61 = OpConstant %int 61
+     %int_73 = OpConstant %int 73
+    %int_119 = OpConstant %int 119
+    %int_173 = OpConstant %int 173
+    %int_186 = OpConstant %int 186
+    %int_128 = OpConstant %int 128
+    %int_104 = OpConstant %int 104
+     %int_86 = OpConstant %int 86
+     %int_81 = OpConstant %int 81
+     %int_77 = OpConstant %int 77
+     %int_76 = OpConstant %int 76
+     %int_89 = OpConstant %int 89
+    %int_102 = OpConstant %int 102
+     %int_92 = OpConstant %int 92
+     %int_83 = OpConstant %int 83
+     %int_62 = OpConstant %int 62
+     %int_50 = OpConstant %int 50
+     %int_38 = OpConstant %int 38
+     %int_26 = OpConstant %int 26
+     %int_16 = OpConstant %int 16
+      %int_8 = OpConstant %int 8
+      %int_2 = OpConstant %int 2
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+     %int_11 = OpConstant %int 11
+     %int_21 = OpConstant %int 21
+     %int_33 = OpConstant %int 33
+     %int_48 = OpConstant %int 48
+     %int_64 = OpConstant %int 64
+    %int_144 = OpConstant %int 144
+    %int_123 = OpConstant %int 123
+    %int_112 = OpConstant %int 112
+    %int_100 = OpConstant %int 100
+     %int_90 = OpConstant %int 90
+     %int_65 = OpConstant %int 65
+     %int_67 = OpConstant %int 67
+     %int_70 = OpConstant %int 70
+     %int_75 = OpConstant %int 75
+     %int_95 = OpConstant %int 95
+     %int_88 = OpConstant %int 88
+     %int_69 = OpConstant %int 69
+     %int_47 = OpConstant %int 47
+     %int_36 = OpConstant %int 36
+     %int_18 = OpConstant %int 18
+     %int_13 = OpConstant %int 13
+     %int_15 = OpConstant %int 15
+     %int_22 = OpConstant %int 22
+     %int_32 = OpConstant %int 32
+     %int_45 = OpConstant %int 45
+     %int_60 = OpConstant %int 60
+        %216 = OpConstantComposite %_arr_int_uint_256 %int_115 %int_133 %int_150 %int_164 %int_176 %int_184 %int_190 %int_192 %int_191 %int_187 %int_181 %int_172 %int_163 %int_153 %int_143 %int_134 %int_126 %int_120 %int_116 %int_114 %int_114 %int_117 %int_121 %int_127 %int_134 %int_141 %int_148 %int_154 %int_159 %int_162 %int_163 %int_161 %int_157 %int_151 %int_143 %int_134 %int_124 %int_113 %int_103 %int_94 %int_87 %int_82 %int_79 %int_80 %int_84 %int_91 %int_101 %int_114 %int_130 %int_146 %int_164 %int_182 %int_199 %int_215 %int_229 %int_240 %int_249 %int_254 %int_256 %int_254 %int_250 %int_243 %int_233 %int_223 %int_212 %int_200 %int_190 %int_180 %int_172 %int_166 %int_163 %int_161 %int_162 %int_164 %int_169 %int_174 %int_179 %int_185 %int_190 %int_193 %int_195 %int_195 %int_192 %int_188 %int_180 %int_171 %int_161 %int_149 %int_137 %int_125 %int_114 %int_105 %int_97 %int_93 %int_91 %int_93 %int_98 %int_106 %int_117 %int_130 %int_145 %int_161 %int_177 %int_193 %int_208 %int_221 %int_231 %int_239 %int_243 %int_244 %int_242 %int_236 %int_228 %int_218 %int_207 %int_194 %int_181 %int_169 %int_158 %int_148 %int_141 %int_135 %int_132 %int_131 %int_132 %int_135 %int_138 %int_143 %int_147 %int_151 %int_154 %int_155 %int_155 %int_152 %int_146 %int_139 %int_129 %int_118 %int_106 %int_93 %int_80 %int_68 %int_58 %int_49 %int_43 %int_40 %int_41 %int_44 %int_51 %int_61 %int_73 %int_87 %int_103 %int_119 %int_134 %int_149 %int_162 %int_173 %int_181 %int_186 %int_188 %int_186 %int_181 %int_174 %int_164 %int_153 %int_141 %int_128 %int_116 %int_104 %int_94 %int_86 %int_81 %int_77 %int_76 %int_77 %int_80 %int_84 %int_89 %int_94 %int_98 %int_102 %int_104 %int_104 %int_102 %int_98 %int_92 %int_83 %int_73 %int_62 %int_50 %int_38 %int_26 %int_16 %int_8 %int_2 %int_0 %int_0 %int_4 %int_11 %int_21 %int_33 %int_48 %int_64 %int_81 %int_98 %int_114 %int_129 %int_141 %int_151 %int_158 %int_161 %int_161 %int_158 %int_152 %int_144 %int_134 %int_123 %int_112 %int_100 %int_90 %int_81 %int_73 %int_68 %int_65 %int_65 %int_67 %int_70 %int_75 %int_81 %int_87 %int_92 %int_97 %int_101 %int_103 %int_102 %int_100 %int_95 %int_88 %int_79 %int_69 %int_58 %int_47 %int_36 %int_26 %int_18 %int_13 %int_11 %int_11 %int_15 %int_22 %int_32 %int_45 %int_60 %int_77 %int_94
+        %220 = OpConstantComposite %_arr_int_uint_256 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0
+   %float_15 = OpConstant %float 15
+    %float_1 = OpConstant %float 1
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+        %274 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+       %void = OpTypeVoid
+        %275 = OpTypeFunction %void
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+        %281 = OpConstantNull %v2float
+        %283 = OpConstantNull %v2int
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+  %float_256 = OpConstant %float 256
+   %main_out = OpTypeStruct %v4float
+        %306 = OpTypeFunction %void %main_out
+ %trace_vi2_ = OpFunction %v4float None %15
+        %pos = OpFunctionParameter %_ptr_Function_v2int
+         %21 = OpLabel
+  %indexable = OpVariable %_ptr_Function__arr_int_uint_256 Function %27
+%indexable_1 = OpVariable %_ptr_Function__arr_int_uint_256 Function %27
+          %p = OpVariable %_ptr_Function_float Function %31
+%indexable_2 = OpVariable %_ptr_Function__arr_int_uint_256 Function %27
+      %x_251 = OpVariable %_ptr_Function_bool Function %40
+  %x_252_phi = OpVariable %_ptr_Function_bool Function %40
+               OpBranch %33
+         %33 = OpLabel
+               OpLoopMerge %34 %35 None
+               OpBranch %36
+         %36 = OpLabel
+         %45 = OpAccessChain %_ptr_Function_int %pos %uint_1
+         %46 = OpLoad %int %45
+         %48 = OpINotEqual %bool %46 %int_256
+               OpSelectionMerge %49 None
+               OpBranchConditional %48 %50 %51
+         %50 = OpLabel
+               OpBranch %49
+         %51 = OpLabel
+               OpBranch %34
+         %49 = OpLabel
+         %54 = OpAccessChain %_ptr_Function_int %pos %uint_0
+         %55 = OpLoad %int %54
+         %57 = OpAccessChain %_ptr_Function_int %pos %uint_1
+         %58 = OpLoad %int %57
+               OpStore %indexable %216
+        %217 = OpAccessChain %_ptr_Function_int %indexable %58
+        %218 = OpLoad %int %217
+        %219 = OpLoad %_arr_int_uint_256 %indexable
+               OpStore %indexable %220
+        %222 = OpAccessChain %_ptr_Function_int %pos %uint_1
+        %223 = OpLoad %int %222
+        %225 = OpAccessChain %_ptr_Function_int %pos %uint_1
+               OpStore %225 %int_0
+        %227 = OpAccessChain %_ptr_Function_int %pos %uint_1
+               OpStore %227 %223
+               OpStore %indexable %219
+        %228 = OpIAdd %int %218 %int_15
+        %229 = OpSLessThan %bool %55 %228
+               OpStore %x_252_phi %229
+               OpSelectionMerge %230 None
+               OpBranchConditional %229 %231 %230
+        %231 = OpLabel
+        %233 = OpAccessChain %_ptr_Function_int %pos %uint_0
+        %234 = OpLoad %int %233
+        %236 = OpAccessChain %_ptr_Function_int %pos %uint_1
+        %237 = OpLoad %int %236
+               OpStore %indexable_1 %216
+        %238 = OpAccessChain %_ptr_Function_int %indexable_1 %237
+        %239 = OpLoad %int %238
+        %240 = OpISub %int %239 %int_15
+        %241 = OpSGreaterThan %bool %234 %240
+               OpStore %x_251 %241
+        %242 = OpLoad %bool %x_251
+               OpStore %x_252_phi %242
+               OpBranch %230
+        %230 = OpLabel
+        %243 = OpLoad %bool %x_252_phi
+               OpSelectionMerge %244 None
+               OpBranchConditional %243 %245 %244
+        %245 = OpLabel
+        %247 = OpAccessChain %_ptr_Function_int %pos %uint_0
+        %248 = OpLoad %int %247
+        %250 = OpAccessChain %_ptr_Function_int %pos %uint_1
+        %251 = OpLoad %int %250
+               OpStore %indexable_2 %216
+        %252 = OpAccessChain %_ptr_Function_int %indexable_2 %251
+        %253 = OpLoad %int %252
+        %258 = OpISub %int %248 %253
+        %257 = OpConvertSToF %float %258
+        %255 = OpExtInst %float %256 FAbs %257
+        %259 = OpFSub %float %float_15 %255
+        %260 = OpFDiv %float %259 %float_15
+               OpStore %p %260
+        %261 = OpLoad %float %p
+        %262 = OpLoad %float %p
+        %263 = OpLoad %float %p
+        %265 = OpCompositeConstruct %v4float %261 %262 %263 %float_1
+               OpReturnValue %265
+        %244 = OpLabel
+        %267 = OpAccessChain %_ptr_Function_int %pos %uint_1
+        %268 = OpLoad %int %267
+        %270 = OpAccessChain %_ptr_Function_int %pos %uint_1
+        %272 = OpIAdd %int %268 %int_1
+               OpStore %270 %272
+               OpBranch %35
+         %35 = OpLabel
+               OpBranch %33
+         %34 = OpLabel
+               OpReturnValue %274
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %275
+        %278 = OpLabel
+      %pos_1 = OpVariable %_ptr_Function_v2float Function %281
+       %ipos = OpVariable %_ptr_Function_v2int Function %283
+      %param = OpVariable %_ptr_Function_v2int Function %283
+        %285 = OpLoad %v4float %gl_FragCoord
+        %287 = OpAccessChain %_ptr_Uniform_v2float %x_13 %uint_0
+        %288 = OpLoad %v2float %287
+        %289 = OpCompositeExtract %float %285 0
+        %290 = OpCompositeExtract %float %285 1
+        %291 = OpCompositeConstruct %v2float %289 %290
+        %292 = OpFDiv %v2float %291 %288
+               OpStore %pos_1 %292
+        %293 = OpAccessChain %_ptr_Function_float %pos_1 %uint_0
+        %294 = OpLoad %float %293
+        %295 = OpAccessChain %_ptr_Function_float %pos_1 %uint_1
+        %296 = OpLoad %float %295
+        %299 = OpFMul %float %294 %float_256
+        %297 = OpConvertFToS %int %299
+        %301 = OpFMul %float %296 %float_256
+        %300 = OpConvertFToS %int %301
+        %302 = OpCompositeConstruct %v2int %297 %300
+               OpStore %ipos %302
+        %303 = OpLoad %v2int %ipos
+               OpStore %param %303
+        %304 = OpFunctionCall %v4float %trace_vi2_ %param
+               OpStore %x_GLF_color %304
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %306
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %310 = OpLabel
+        %311 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %311
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %275
+        %313 = OpLabel
+        %314 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %314
+        %315 = OpFunctionCall %void %main_1
+        %317 = OpLoad %v4float %x_GLF_color
+        %318 = OpCompositeConstruct %main_out %317
+        %316 = OpFunctionCall %void %tint_symbol_3 %318
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..3970047
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/1.spvasm.expected.wgsl
@@ -0,0 +1,92 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_13 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn trace_vi2_(pos : ptr<function, vec2<i32>>) -> vec4<f32> {
+  var indexable : array<i32, 256>;
+  var indexable_1 : array<i32, 256>;
+  var p : f32;
+  var indexable_2 : array<i32, 256>;
+  loop {
+    var x_251 : bool;
+    var x_252_phi : bool;
+    let x_228 : ptr<function, i32> = &((*(pos)).y);
+    let x_229 : i32 = *(x_228);
+    if ((x_229 != 256)) {
+    } else {
+      break;
+    }
+    let x_233 : i32 = (*(pos)).x;
+    let x_235 : i32 = (*(pos)).y;
+    indexable = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+    let x_237 : i32 = indexable[x_235];
+    let x_238 : array<i32, 256> = indexable;
+    indexable = array<i32, 256>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+    let x_239 : i32 = *(x_228);
+    *(x_228) = 0;
+    *(x_228) = x_239;
+    indexable = x_238;
+    let x_241 : bool = (x_233 < (x_237 + 15));
+    x_252_phi = x_241;
+    if (x_241) {
+      let x_245 : i32 = (*(pos)).x;
+      let x_247 : i32 = (*(pos)).y;
+      indexable_1 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+      let x_249 : i32 = indexable_1[x_247];
+      x_251 = (x_245 > (x_249 - 15));
+      x_252_phi = x_251;
+    }
+    let x_252 : bool = x_252_phi;
+    if (x_252) {
+      let x_256 : i32 = (*(pos)).x;
+      let x_258 : i32 = (*(pos)).y;
+      indexable_2 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+      let x_260 : i32 = indexable_2[x_258];
+      p = ((15.0 - abs(f32((x_256 - x_260)))) / 15.0);
+      let x_266 : f32 = p;
+      let x_267 : f32 = p;
+      let x_268 : f32 = p;
+      return vec4<f32>(x_266, x_267, x_268, 1.0);
+    }
+    let x_270 : ptr<function, i32> = &((*(pos)).y);
+    let x_271 : i32 = *(x_270);
+    *(x_270) = (x_271 + 1);
+  }
+  return vec4<f32>(0.0, 0.0, 0.0, 1.0);
+}
+
+fn main_1() {
+  var pos_1 : vec2<f32>;
+  var ipos : vec2<i32>;
+  var param : vec2<i32>;
+  let x_207 : vec4<f32> = gl_FragCoord;
+  let x_210 : vec2<f32> = x_13.resolution;
+  pos_1 = (vec2<f32>(x_207.x, x_207.y) / x_210);
+  let x_213 : f32 = pos_1.x;
+  let x_217 : f32 = pos_1.y;
+  ipos = vec2<i32>(i32((x_213 * 256.0)), i32((x_217 * 256.0)));
+  let x_221 : vec2<i32> = ipos;
+  param = x_221;
+  let x_222 : vec4<f32> = trace_vi2_(&(param));
+  x_GLF_color = x_222;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/1.wgsl
new file mode 100644
index 0000000..3970047
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/1.wgsl
@@ -0,0 +1,92 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_13 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn trace_vi2_(pos : ptr<function, vec2<i32>>) -> vec4<f32> {
+  var indexable : array<i32, 256>;
+  var indexable_1 : array<i32, 256>;
+  var p : f32;
+  var indexable_2 : array<i32, 256>;
+  loop {
+    var x_251 : bool;
+    var x_252_phi : bool;
+    let x_228 : ptr<function, i32> = &((*(pos)).y);
+    let x_229 : i32 = *(x_228);
+    if ((x_229 != 256)) {
+    } else {
+      break;
+    }
+    let x_233 : i32 = (*(pos)).x;
+    let x_235 : i32 = (*(pos)).y;
+    indexable = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+    let x_237 : i32 = indexable[x_235];
+    let x_238 : array<i32, 256> = indexable;
+    indexable = array<i32, 256>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+    let x_239 : i32 = *(x_228);
+    *(x_228) = 0;
+    *(x_228) = x_239;
+    indexable = x_238;
+    let x_241 : bool = (x_233 < (x_237 + 15));
+    x_252_phi = x_241;
+    if (x_241) {
+      let x_245 : i32 = (*(pos)).x;
+      let x_247 : i32 = (*(pos)).y;
+      indexable_1 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+      let x_249 : i32 = indexable_1[x_247];
+      x_251 = (x_245 > (x_249 - 15));
+      x_252_phi = x_251;
+    }
+    let x_252 : bool = x_252_phi;
+    if (x_252) {
+      let x_256 : i32 = (*(pos)).x;
+      let x_258 : i32 = (*(pos)).y;
+      indexable_2 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+      let x_260 : i32 = indexable_2[x_258];
+      p = ((15.0 - abs(f32((x_256 - x_260)))) / 15.0);
+      let x_266 : f32 = p;
+      let x_267 : f32 = p;
+      let x_268 : f32 = p;
+      return vec4<f32>(x_266, x_267, x_268, 1.0);
+    }
+    let x_270 : ptr<function, i32> = &((*(pos)).y);
+    let x_271 : i32 = *(x_270);
+    *(x_270) = (x_271 + 1);
+  }
+  return vec4<f32>(0.0, 0.0, 0.0, 1.0);
+}
+
+fn main_1() {
+  var pos_1 : vec2<f32>;
+  var ipos : vec2<i32>;
+  var param : vec2<i32>;
+  let x_207 : vec4<f32> = gl_FragCoord;
+  let x_210 : vec2<f32> = x_13.resolution;
+  pos_1 = (vec2<f32>(x_207.x, x_207.y) / x_210);
+  let x_213 : f32 = pos_1.x;
+  let x_217 : f32 = pos_1.y;
+  ipos = vec2<i32>(i32((x_213 * 256.0)), i32((x_217 * 256.0)));
+  let x_221 : vec2<i32> = ipos;
+  param = x_221;
+  let x_222 : vec4<f32> = trace_vi2_(&(param));
+  x_GLF_color = x_222;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..f284cbd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/1.wgsl.expected.hlsl
@@ -0,0 +1,91 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_13 : register(b0, space0) {
+  uint4 x_13[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float4 trace_vi2_(inout int2 pos) {
+  int indexable[256] = (int[256])0;
+  int indexable_1[256] = (int[256])0;
+  float p = 0.0f;
+  int indexable_2[256] = (int[256])0;
+  while (true) {
+    bool x_251 = false;
+    bool x_252_phi = false;
+    const int x_229 = pos.y;
+    if ((x_229 != 256)) {
+    } else {
+      break;
+    }
+    const int x_233 = pos.x;
+    const int x_235 = pos.y;
+    const int tint_symbol_5[256] = {115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94};
+    indexable = tint_symbol_5;
+    const int x_237 = indexable[x_235];
+    const int x_238[256] = indexable;
+    const int tint_symbol_6[256] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+    indexable = tint_symbol_6;
+    const int x_239 = pos.y;
+    pos.y = 0;
+    pos.y = x_239;
+    indexable = x_238;
+    const bool x_241 = (x_233 < (x_237 + 15));
+    x_252_phi = x_241;
+    if (x_241) {
+      const int x_245 = pos.x;
+      const int x_247 = pos.y;
+      const int tint_symbol_7[256] = {115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94};
+      indexable_1 = tint_symbol_7;
+      const int x_249 = indexable_1[x_247];
+      x_251 = (x_245 > (x_249 - 15));
+      x_252_phi = x_251;
+    }
+    if (x_252_phi) {
+      const int x_256 = pos.x;
+      const int x_258 = pos.y;
+      const int tint_symbol_8[256] = {115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94};
+      indexable_2 = tint_symbol_8;
+      const int x_260 = indexable_2[x_258];
+      p = ((15.0f - abs(float((x_256 - x_260)))) / 15.0f);
+      return float4(p, p, p, 1.0f);
+    }
+    const int x_271 = pos.y;
+    pos.y = (x_271 + 1);
+  }
+  return float4(0.0f, 0.0f, 0.0f, 1.0f);
+}
+
+void main_1() {
+  float2 pos_1 = float2(0.0f, 0.0f);
+  int2 ipos = int2(0, 0);
+  int2 param = int2(0, 0);
+  const float4 x_207 = gl_FragCoord;
+  const float2 x_210 = asfloat(x_13[0].xy);
+  pos_1 = (float2(x_207.x, x_207.y) / x_210);
+  const float x_213 = pos_1.x;
+  const float x_217 = pos_1.y;
+  ipos = int2(int((x_213 * 256.0f)), int((x_217 * 256.0f)));
+  param = ipos;
+  const float4 x_222 = trace_vi2_(param);
+  x_GLF_color = x_222;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_9 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_9;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/1.wgsl.expected.msl
new file mode 100644
index 0000000..aa07b66
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/1.wgsl.expected.msl
@@ -0,0 +1,98 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  int arr[256];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float4 trace_vi2_(thread int2* const pos) {
+  tint_array_wrapper indexable = {};
+  tint_array_wrapper indexable_1 = {};
+  float p = 0.0f;
+  tint_array_wrapper indexable_2 = {};
+  while (true) {
+    bool x_251 = false;
+    bool x_252_phi = false;
+    int const x_229 = (*(pos)).y;
+    if ((x_229 != 256)) {
+    } else {
+      break;
+    }
+    int const x_233 = (*(pos)).x;
+    int const x_235 = (*(pos)).y;
+    tint_array_wrapper const tint_symbol_4 = {.arr={115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94}};
+    indexable = tint_symbol_4;
+    int const x_237 = indexable.arr[x_235];
+    tint_array_wrapper const x_238 = indexable;
+    tint_array_wrapper const tint_symbol_5 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+    indexable = tint_symbol_5;
+    int const x_239 = (*(pos)).y;
+    (*(pos)).y = 0;
+    (*(pos)).y = x_239;
+    indexable = x_238;
+    bool const x_241 = (x_233 < (x_237 + 15));
+    x_252_phi = x_241;
+    if (x_241) {
+      int const x_245 = (*(pos)).x;
+      int const x_247 = (*(pos)).y;
+      tint_array_wrapper const tint_symbol_6 = {.arr={115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94}};
+      indexable_1 = tint_symbol_6;
+      int const x_249 = indexable_1.arr[x_247];
+      x_251 = (x_245 > (x_249 - 15));
+      x_252_phi = x_251;
+    }
+    bool const x_252 = x_252_phi;
+    if (x_252) {
+      int const x_256 = (*(pos)).x;
+      int const x_258 = (*(pos)).y;
+      tint_array_wrapper const tint_symbol_7 = {.arr={115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94}};
+      indexable_2 = tint_symbol_7;
+      int const x_260 = indexable_2.arr[x_258];
+      p = ((15.0f - fabs(float((x_256 - x_260)))) / 15.0f);
+      float const x_266 = p;
+      float const x_267 = p;
+      float const x_268 = p;
+      return float4(x_266, x_267, x_268, 1.0f);
+    }
+    int const x_271 = (*(pos)).y;
+    (*(pos)).y = (x_271 + 1);
+  }
+  return float4(0.0f, 0.0f, 0.0f, 1.0f);
+}
+
+void main_1(constant buf0& x_13, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10) {
+  float2 pos_1 = 0.0f;
+  int2 ipos = 0;
+  int2 param = 0;
+  float4 const x_207 = *(tint_symbol_9);
+  float2 const x_210 = x_13.resolution;
+  pos_1 = (float2(x_207.x, x_207.y) / x_210);
+  float const x_213 = pos_1.x;
+  float const x_217 = pos_1.y;
+  ipos = int2(int((x_213 * 256.0f)), int((x_217 * 256.0f)));
+  int2 const x_221 = ipos;
+  param = x_221;
+  float4 const x_222 = trace_vi2_(&(param));
+  *(tint_symbol_10) = x_222;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_13 [[buffer(0)]]) {
+  thread float4 tint_symbol_11 = 0.0f;
+  thread float4 tint_symbol_12 = 0.0f;
+  tint_symbol_11 = gl_FragCoord_param;
+  main_1(x_13, &(tint_symbol_11), &(tint_symbol_12));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_12};
+  tint_symbol_2 const tint_symbol_8 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_8;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..5d77d9b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/1.wgsl.expected.spvasm
@@ -0,0 +1,388 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 319
+; Schema: 0
+               OpCapability Shader
+        %256 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_13 "x_13"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %trace_vi2_ "trace_vi2_"
+               OpName %pos "pos"
+               OpName %indexable "indexable"
+               OpName %indexable_1 "indexable_1"
+               OpName %p "p"
+               OpName %indexable_2 "indexable_2"
+               OpName %x_251 "x_251"
+               OpName %x_252_phi "x_252_phi"
+               OpName %main_1 "main_1"
+               OpName %pos_1 "pos_1"
+               OpName %ipos "ipos"
+               OpName %param "param"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_13 NonWritable
+               OpDecorate %x_13 DescriptorSet 0
+               OpDecorate %x_13 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_int_uint_256 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_13 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %15 = OpTypeFunction %v4float %_ptr_Function_v2int
+       %uint = OpTypeInt 32 0
+   %uint_256 = OpConstant %uint 256
+%_arr_int_uint_256 = OpTypeArray %int %uint_256
+%_ptr_Function__arr_int_uint_256 = OpTypePointer Function %_arr_int_uint_256
+         %27 = OpConstantNull %_arr_int_uint_256
+%_ptr_Function_float = OpTypePointer Function %float
+         %31 = OpConstantNull %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %40 = OpConstantNull %bool
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_int = OpTypePointer Function %int
+    %int_256 = OpConstant %int 256
+     %uint_0 = OpConstant %uint 0
+    %int_115 = OpConstant %int 115
+    %int_133 = OpConstant %int 133
+    %int_150 = OpConstant %int 150
+    %int_164 = OpConstant %int 164
+    %int_176 = OpConstant %int 176
+    %int_184 = OpConstant %int 184
+    %int_190 = OpConstant %int 190
+    %int_192 = OpConstant %int 192
+    %int_191 = OpConstant %int 191
+    %int_187 = OpConstant %int 187
+    %int_181 = OpConstant %int 181
+    %int_172 = OpConstant %int 172
+    %int_163 = OpConstant %int 163
+    %int_153 = OpConstant %int 153
+    %int_143 = OpConstant %int 143
+    %int_134 = OpConstant %int 134
+    %int_126 = OpConstant %int 126
+    %int_120 = OpConstant %int 120
+    %int_116 = OpConstant %int 116
+    %int_114 = OpConstant %int 114
+    %int_117 = OpConstant %int 117
+    %int_121 = OpConstant %int 121
+    %int_127 = OpConstant %int 127
+    %int_141 = OpConstant %int 141
+    %int_148 = OpConstant %int 148
+    %int_154 = OpConstant %int 154
+    %int_159 = OpConstant %int 159
+    %int_162 = OpConstant %int 162
+    %int_161 = OpConstant %int 161
+    %int_157 = OpConstant %int 157
+    %int_151 = OpConstant %int 151
+    %int_124 = OpConstant %int 124
+    %int_113 = OpConstant %int 113
+    %int_103 = OpConstant %int 103
+     %int_94 = OpConstant %int 94
+     %int_87 = OpConstant %int 87
+     %int_82 = OpConstant %int 82
+     %int_79 = OpConstant %int 79
+     %int_80 = OpConstant %int 80
+     %int_84 = OpConstant %int 84
+     %int_91 = OpConstant %int 91
+    %int_101 = OpConstant %int 101
+    %int_130 = OpConstant %int 130
+    %int_146 = OpConstant %int 146
+    %int_182 = OpConstant %int 182
+    %int_199 = OpConstant %int 199
+    %int_215 = OpConstant %int 215
+    %int_229 = OpConstant %int 229
+    %int_240 = OpConstant %int 240
+    %int_249 = OpConstant %int 249
+    %int_254 = OpConstant %int 254
+    %int_250 = OpConstant %int 250
+    %int_243 = OpConstant %int 243
+    %int_233 = OpConstant %int 233
+    %int_223 = OpConstant %int 223
+    %int_212 = OpConstant %int 212
+    %int_200 = OpConstant %int 200
+    %int_180 = OpConstant %int 180
+    %int_166 = OpConstant %int 166
+    %int_169 = OpConstant %int 169
+    %int_174 = OpConstant %int 174
+    %int_179 = OpConstant %int 179
+    %int_185 = OpConstant %int 185
+    %int_193 = OpConstant %int 193
+    %int_195 = OpConstant %int 195
+    %int_188 = OpConstant %int 188
+    %int_171 = OpConstant %int 171
+    %int_149 = OpConstant %int 149
+    %int_137 = OpConstant %int 137
+    %int_125 = OpConstant %int 125
+    %int_105 = OpConstant %int 105
+     %int_97 = OpConstant %int 97
+     %int_93 = OpConstant %int 93
+     %int_98 = OpConstant %int 98
+    %int_106 = OpConstant %int 106
+    %int_145 = OpConstant %int 145
+    %int_177 = OpConstant %int 177
+    %int_208 = OpConstant %int 208
+    %int_221 = OpConstant %int 221
+    %int_231 = OpConstant %int 231
+    %int_239 = OpConstant %int 239
+    %int_244 = OpConstant %int 244
+    %int_242 = OpConstant %int 242
+    %int_236 = OpConstant %int 236
+    %int_228 = OpConstant %int 228
+    %int_218 = OpConstant %int 218
+    %int_207 = OpConstant %int 207
+    %int_194 = OpConstant %int 194
+    %int_158 = OpConstant %int 158
+    %int_135 = OpConstant %int 135
+    %int_132 = OpConstant %int 132
+    %int_131 = OpConstant %int 131
+    %int_138 = OpConstant %int 138
+    %int_147 = OpConstant %int 147
+    %int_155 = OpConstant %int 155
+    %int_152 = OpConstant %int 152
+    %int_139 = OpConstant %int 139
+    %int_129 = OpConstant %int 129
+    %int_118 = OpConstant %int 118
+     %int_68 = OpConstant %int 68
+     %int_58 = OpConstant %int 58
+     %int_49 = OpConstant %int 49
+     %int_43 = OpConstant %int 43
+     %int_40 = OpConstant %int 40
+     %int_41 = OpConstant %int 41
+     %int_44 = OpConstant %int 44
+     %int_51 = OpConstant %int 51
+     %int_61 = OpConstant %int 61
+     %int_73 = OpConstant %int 73
+    %int_119 = OpConstant %int 119
+    %int_173 = OpConstant %int 173
+    %int_186 = OpConstant %int 186
+    %int_128 = OpConstant %int 128
+    %int_104 = OpConstant %int 104
+     %int_86 = OpConstant %int 86
+     %int_81 = OpConstant %int 81
+     %int_77 = OpConstant %int 77
+     %int_76 = OpConstant %int 76
+     %int_89 = OpConstant %int 89
+    %int_102 = OpConstant %int 102
+     %int_92 = OpConstant %int 92
+     %int_83 = OpConstant %int 83
+     %int_62 = OpConstant %int 62
+     %int_50 = OpConstant %int 50
+     %int_38 = OpConstant %int 38
+     %int_26 = OpConstant %int 26
+     %int_16 = OpConstant %int 16
+      %int_8 = OpConstant %int 8
+      %int_2 = OpConstant %int 2
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+     %int_11 = OpConstant %int 11
+     %int_21 = OpConstant %int 21
+     %int_33 = OpConstant %int 33
+     %int_48 = OpConstant %int 48
+     %int_64 = OpConstant %int 64
+    %int_144 = OpConstant %int 144
+    %int_123 = OpConstant %int 123
+    %int_112 = OpConstant %int 112
+    %int_100 = OpConstant %int 100
+     %int_90 = OpConstant %int 90
+     %int_65 = OpConstant %int 65
+     %int_67 = OpConstant %int 67
+     %int_70 = OpConstant %int 70
+     %int_75 = OpConstant %int 75
+     %int_95 = OpConstant %int 95
+     %int_88 = OpConstant %int 88
+     %int_69 = OpConstant %int 69
+     %int_47 = OpConstant %int 47
+     %int_36 = OpConstant %int 36
+     %int_18 = OpConstant %int 18
+     %int_13 = OpConstant %int 13
+     %int_15 = OpConstant %int 15
+     %int_22 = OpConstant %int 22
+     %int_32 = OpConstant %int 32
+     %int_45 = OpConstant %int 45
+     %int_60 = OpConstant %int 60
+        %216 = OpConstantComposite %_arr_int_uint_256 %int_115 %int_133 %int_150 %int_164 %int_176 %int_184 %int_190 %int_192 %int_191 %int_187 %int_181 %int_172 %int_163 %int_153 %int_143 %int_134 %int_126 %int_120 %int_116 %int_114 %int_114 %int_117 %int_121 %int_127 %int_134 %int_141 %int_148 %int_154 %int_159 %int_162 %int_163 %int_161 %int_157 %int_151 %int_143 %int_134 %int_124 %int_113 %int_103 %int_94 %int_87 %int_82 %int_79 %int_80 %int_84 %int_91 %int_101 %int_114 %int_130 %int_146 %int_164 %int_182 %int_199 %int_215 %int_229 %int_240 %int_249 %int_254 %int_256 %int_254 %int_250 %int_243 %int_233 %int_223 %int_212 %int_200 %int_190 %int_180 %int_172 %int_166 %int_163 %int_161 %int_162 %int_164 %int_169 %int_174 %int_179 %int_185 %int_190 %int_193 %int_195 %int_195 %int_192 %int_188 %int_180 %int_171 %int_161 %int_149 %int_137 %int_125 %int_114 %int_105 %int_97 %int_93 %int_91 %int_93 %int_98 %int_106 %int_117 %int_130 %int_145 %int_161 %int_177 %int_193 %int_208 %int_221 %int_231 %int_239 %int_243 %int_244 %int_242 %int_236 %int_228 %int_218 %int_207 %int_194 %int_181 %int_169 %int_158 %int_148 %int_141 %int_135 %int_132 %int_131 %int_132 %int_135 %int_138 %int_143 %int_147 %int_151 %int_154 %int_155 %int_155 %int_152 %int_146 %int_139 %int_129 %int_118 %int_106 %int_93 %int_80 %int_68 %int_58 %int_49 %int_43 %int_40 %int_41 %int_44 %int_51 %int_61 %int_73 %int_87 %int_103 %int_119 %int_134 %int_149 %int_162 %int_173 %int_181 %int_186 %int_188 %int_186 %int_181 %int_174 %int_164 %int_153 %int_141 %int_128 %int_116 %int_104 %int_94 %int_86 %int_81 %int_77 %int_76 %int_77 %int_80 %int_84 %int_89 %int_94 %int_98 %int_102 %int_104 %int_104 %int_102 %int_98 %int_92 %int_83 %int_73 %int_62 %int_50 %int_38 %int_26 %int_16 %int_8 %int_2 %int_0 %int_0 %int_4 %int_11 %int_21 %int_33 %int_48 %int_64 %int_81 %int_98 %int_114 %int_129 %int_141 %int_151 %int_158 %int_161 %int_161 %int_158 %int_152 %int_144 %int_134 %int_123 %int_112 %int_100 %int_90 %int_81 %int_73 %int_68 %int_65 %int_65 %int_67 %int_70 %int_75 %int_81 %int_87 %int_92 %int_97 %int_101 %int_103 %int_102 %int_100 %int_95 %int_88 %int_79 %int_69 %int_58 %int_47 %int_36 %int_26 %int_18 %int_13 %int_11 %int_11 %int_15 %int_22 %int_32 %int_45 %int_60 %int_77 %int_94
+        %220 = OpConstantComposite %_arr_int_uint_256 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0 %int_0
+   %float_15 = OpConstant %float 15
+    %float_1 = OpConstant %float 1
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+        %274 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+       %void = OpTypeVoid
+        %275 = OpTypeFunction %void
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+        %281 = OpConstantNull %v2float
+        %283 = OpConstantNull %v2int
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+  %float_256 = OpConstant %float 256
+   %main_out = OpTypeStruct %v4float
+        %306 = OpTypeFunction %void %main_out
+ %trace_vi2_ = OpFunction %v4float None %15
+        %pos = OpFunctionParameter %_ptr_Function_v2int
+         %21 = OpLabel
+  %indexable = OpVariable %_ptr_Function__arr_int_uint_256 Function %27
+%indexable_1 = OpVariable %_ptr_Function__arr_int_uint_256 Function %27
+          %p = OpVariable %_ptr_Function_float Function %31
+%indexable_2 = OpVariable %_ptr_Function__arr_int_uint_256 Function %27
+      %x_251 = OpVariable %_ptr_Function_bool Function %40
+  %x_252_phi = OpVariable %_ptr_Function_bool Function %40
+               OpBranch %33
+         %33 = OpLabel
+               OpLoopMerge %34 %35 None
+               OpBranch %36
+         %36 = OpLabel
+         %45 = OpAccessChain %_ptr_Function_int %pos %uint_1
+         %46 = OpLoad %int %45
+         %48 = OpINotEqual %bool %46 %int_256
+               OpSelectionMerge %49 None
+               OpBranchConditional %48 %50 %51
+         %50 = OpLabel
+               OpBranch %49
+         %51 = OpLabel
+               OpBranch %34
+         %49 = OpLabel
+         %54 = OpAccessChain %_ptr_Function_int %pos %uint_0
+         %55 = OpLoad %int %54
+         %57 = OpAccessChain %_ptr_Function_int %pos %uint_1
+         %58 = OpLoad %int %57
+               OpStore %indexable %216
+        %217 = OpAccessChain %_ptr_Function_int %indexable %58
+        %218 = OpLoad %int %217
+        %219 = OpLoad %_arr_int_uint_256 %indexable
+               OpStore %indexable %220
+        %222 = OpAccessChain %_ptr_Function_int %pos %uint_1
+        %223 = OpLoad %int %222
+        %225 = OpAccessChain %_ptr_Function_int %pos %uint_1
+               OpStore %225 %int_0
+        %227 = OpAccessChain %_ptr_Function_int %pos %uint_1
+               OpStore %227 %223
+               OpStore %indexable %219
+        %228 = OpIAdd %int %218 %int_15
+        %229 = OpSLessThan %bool %55 %228
+               OpStore %x_252_phi %229
+               OpSelectionMerge %230 None
+               OpBranchConditional %229 %231 %230
+        %231 = OpLabel
+        %233 = OpAccessChain %_ptr_Function_int %pos %uint_0
+        %234 = OpLoad %int %233
+        %236 = OpAccessChain %_ptr_Function_int %pos %uint_1
+        %237 = OpLoad %int %236
+               OpStore %indexable_1 %216
+        %238 = OpAccessChain %_ptr_Function_int %indexable_1 %237
+        %239 = OpLoad %int %238
+        %240 = OpISub %int %239 %int_15
+        %241 = OpSGreaterThan %bool %234 %240
+               OpStore %x_251 %241
+        %242 = OpLoad %bool %x_251
+               OpStore %x_252_phi %242
+               OpBranch %230
+        %230 = OpLabel
+        %243 = OpLoad %bool %x_252_phi
+               OpSelectionMerge %244 None
+               OpBranchConditional %243 %245 %244
+        %245 = OpLabel
+        %247 = OpAccessChain %_ptr_Function_int %pos %uint_0
+        %248 = OpLoad %int %247
+        %250 = OpAccessChain %_ptr_Function_int %pos %uint_1
+        %251 = OpLoad %int %250
+               OpStore %indexable_2 %216
+        %252 = OpAccessChain %_ptr_Function_int %indexable_2 %251
+        %253 = OpLoad %int %252
+        %258 = OpISub %int %248 %253
+        %257 = OpConvertSToF %float %258
+        %255 = OpExtInst %float %256 FAbs %257
+        %259 = OpFSub %float %float_15 %255
+        %260 = OpFDiv %float %259 %float_15
+               OpStore %p %260
+        %261 = OpLoad %float %p
+        %262 = OpLoad %float %p
+        %263 = OpLoad %float %p
+        %265 = OpCompositeConstruct %v4float %261 %262 %263 %float_1
+               OpReturnValue %265
+        %244 = OpLabel
+        %267 = OpAccessChain %_ptr_Function_int %pos %uint_1
+        %268 = OpLoad %int %267
+        %270 = OpAccessChain %_ptr_Function_int %pos %uint_1
+        %272 = OpIAdd %int %268 %int_1
+               OpStore %270 %272
+               OpBranch %35
+         %35 = OpLabel
+               OpBranch %33
+         %34 = OpLabel
+               OpReturnValue %274
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %275
+        %278 = OpLabel
+      %pos_1 = OpVariable %_ptr_Function_v2float Function %281
+       %ipos = OpVariable %_ptr_Function_v2int Function %283
+      %param = OpVariable %_ptr_Function_v2int Function %283
+        %285 = OpLoad %v4float %gl_FragCoord
+        %287 = OpAccessChain %_ptr_Uniform_v2float %x_13 %uint_0
+        %288 = OpLoad %v2float %287
+        %289 = OpCompositeExtract %float %285 0
+        %290 = OpCompositeExtract %float %285 1
+        %291 = OpCompositeConstruct %v2float %289 %290
+        %292 = OpFDiv %v2float %291 %288
+               OpStore %pos_1 %292
+        %293 = OpAccessChain %_ptr_Function_float %pos_1 %uint_0
+        %294 = OpLoad %float %293
+        %295 = OpAccessChain %_ptr_Function_float %pos_1 %uint_1
+        %296 = OpLoad %float %295
+        %299 = OpFMul %float %294 %float_256
+        %297 = OpConvertFToS %int %299
+        %301 = OpFMul %float %296 %float_256
+        %300 = OpConvertFToS %int %301
+        %302 = OpCompositeConstruct %v2int %297 %300
+               OpStore %ipos %302
+        %303 = OpLoad %v2int %ipos
+               OpStore %param %303
+        %304 = OpFunctionCall %v4float %trace_vi2_ %param
+               OpStore %x_GLF_color %304
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %306
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %310 = OpLabel
+        %311 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %311
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %275
+        %313 = OpLabel
+        %314 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %314
+        %315 = OpFunctionCall %void %main_1
+        %317 = OpLoad %v4float %x_GLF_color
+        %318 = OpCompositeConstruct %main_out %317
+        %316 = OpFunctionCall %void %tint_symbol_3 %318
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..3970047
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-pillars-volatile-nontemporal-store/1.wgsl.expected.wgsl
@@ -0,0 +1,92 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_13 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn trace_vi2_(pos : ptr<function, vec2<i32>>) -> vec4<f32> {
+  var indexable : array<i32, 256>;
+  var indexable_1 : array<i32, 256>;
+  var p : f32;
+  var indexable_2 : array<i32, 256>;
+  loop {
+    var x_251 : bool;
+    var x_252_phi : bool;
+    let x_228 : ptr<function, i32> = &((*(pos)).y);
+    let x_229 : i32 = *(x_228);
+    if ((x_229 != 256)) {
+    } else {
+      break;
+    }
+    let x_233 : i32 = (*(pos)).x;
+    let x_235 : i32 = (*(pos)).y;
+    indexable = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+    let x_237 : i32 = indexable[x_235];
+    let x_238 : array<i32, 256> = indexable;
+    indexable = array<i32, 256>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+    let x_239 : i32 = *(x_228);
+    *(x_228) = 0;
+    *(x_228) = x_239;
+    indexable = x_238;
+    let x_241 : bool = (x_233 < (x_237 + 15));
+    x_252_phi = x_241;
+    if (x_241) {
+      let x_245 : i32 = (*(pos)).x;
+      let x_247 : i32 = (*(pos)).y;
+      indexable_1 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+      let x_249 : i32 = indexable_1[x_247];
+      x_251 = (x_245 > (x_249 - 15));
+      x_252_phi = x_251;
+    }
+    let x_252 : bool = x_252_phi;
+    if (x_252) {
+      let x_256 : i32 = (*(pos)).x;
+      let x_258 : i32 = (*(pos)).y;
+      indexable_2 = array<i32, 256>(115, 133, 150, 164, 176, 184, 190, 192, 191, 187, 181, 172, 163, 153, 143, 134, 126, 120, 116, 114, 114, 117, 121, 127, 134, 141, 148, 154, 159, 162, 163, 161, 157, 151, 143, 134, 124, 113, 103, 94, 87, 82, 79, 80, 84, 91, 101, 114, 130, 146, 164, 182, 199, 215, 229, 240, 249, 254, 256, 254, 250, 243, 233, 223, 212, 200, 190, 180, 172, 166, 163, 161, 162, 164, 169, 174, 179, 185, 190, 193, 195, 195, 192, 188, 180, 171, 161, 149, 137, 125, 114, 105, 97, 93, 91, 93, 98, 106, 117, 130, 145, 161, 177, 193, 208, 221, 231, 239, 243, 244, 242, 236, 228, 218, 207, 194, 181, 169, 158, 148, 141, 135, 132, 131, 132, 135, 138, 143, 147, 151, 154, 155, 155, 152, 146, 139, 129, 118, 106, 93, 80, 68, 58, 49, 43, 40, 41, 44, 51, 61, 73, 87, 103, 119, 134, 149, 162, 173, 181, 186, 188, 186, 181, 174, 164, 153, 141, 128, 116, 104, 94, 86, 81, 77, 76, 77, 80, 84, 89, 94, 98, 102, 104, 104, 102, 98, 92, 83, 73, 62, 50, 38, 26, 16, 8, 2, 0, 0, 4, 11, 21, 33, 48, 64, 81, 98, 114, 129, 141, 151, 158, 161, 161, 158, 152, 144, 134, 123, 112, 100, 90, 81, 73, 68, 65, 65, 67, 70, 75, 81, 87, 92, 97, 101, 103, 102, 100, 95, 88, 79, 69, 58, 47, 36, 26, 18, 13, 11, 11, 15, 22, 32, 45, 60, 77, 94);
+      let x_260 : i32 = indexable_2[x_258];
+      p = ((15.0 - abs(f32((x_256 - x_260)))) / 15.0);
+      let x_266 : f32 = p;
+      let x_267 : f32 = p;
+      let x_268 : f32 = p;
+      return vec4<f32>(x_266, x_267, x_268, 1.0);
+    }
+    let x_270 : ptr<function, i32> = &((*(pos)).y);
+    let x_271 : i32 = *(x_270);
+    *(x_270) = (x_271 + 1);
+  }
+  return vec4<f32>(0.0, 0.0, 0.0, 1.0);
+}
+
+fn main_1() {
+  var pos_1 : vec2<f32>;
+  var ipos : vec2<i32>;
+  var param : vec2<i32>;
+  let x_207 : vec4<f32> = gl_FragCoord;
+  let x_210 : vec2<f32> = x_13.resolution;
+  pos_1 = (vec2<f32>(x_207.x, x_207.y) / x_210);
+  let x_213 : f32 = pos_1.x;
+  let x_217 : f32 = pos_1.y;
+  ipos = vec2<i32>(i32((x_213 * 256.0)), i32((x_217 * 256.0)));
+  let x_221 : vec2<i32> = ipos;
+  param = x_221;
+  let x_222 : vec4<f32> = trace_vi2_(&(param));
+  x_GLF_color = x_222;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-dontinline/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-dontinline/0-opt.spvasm
new file mode 100644
index 0000000..449e485
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-dontinline/0-opt.spvasm
@@ -0,0 +1,481 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %swap_i1_i1_ "swap(i1;i1;"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %performPartition_i1_i1_ "performPartition(i1;i1;"
+               OpName %l "l"
+               OpName %h "h"
+               OpName %quicksort_ "quicksort("
+               OpName %temp "temp"
+               OpName %QuicksortObject "QuicksortObject"
+               OpMemberName %QuicksortObject 0 "numbers"
+               OpName %obj "obj"
+               OpName %pivot "pivot"
+               OpName %i_0 "i"
+               OpName %j_0 "j"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %param_1 "param"
+               OpName %param_2 "param"
+               OpName %l_0 "l"
+               OpName %h_0 "h"
+               OpName %top "top"
+               OpName %stack "stack"
+               OpName %p "p"
+               OpName %param_3 "param"
+               OpName %param_4 "param"
+               OpName %i_1 "i"
+               OpName %uv "uv"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %color "color"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %35 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %38 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+         %39 = OpTypeFunction %int %_ptr_Function_int %_ptr_Function_int
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%QuicksortObject = OpTypeStruct %_arr_int_uint_10
+%_ptr_Private_QuicksortObject = OpTypePointer Private %QuicksortObject
+        %obj = OpVariable %_ptr_Private_QuicksortObject Private
+      %int_0 = OpConstant %int 0
+%_ptr_Private_int = OpTypePointer Private %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %int_9 = OpConstant %int 9
+     %int_n1 = OpConstant %int -1
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+     %int_10 = OpConstant %int 10
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+         %64 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+ %float_0_25 = OpConstant %float 0.25
+  %float_0_5 = OpConstant %float 0.5
+      %int_2 = OpConstant %int 2
+     %uint_1 = OpConstant %uint 1
+ %float_0_75 = OpConstant %float 0.75
+      %int_3 = OpConstant %int 3
+     %uint_2 = OpConstant %uint 2
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %35
+         %80 = OpLabel
+        %i_1 = OpVariable %_ptr_Function_int Function
+         %uv = OpVariable %_ptr_Function_v2float Function
+      %color = OpVariable %_ptr_Function_v3float Function
+               OpStore %i_1 %int_0
+               OpBranch %81
+         %81 = OpLabel
+               OpLoopMerge %82 %83 None
+               OpBranch %84
+         %84 = OpLabel
+         %85 = OpLoad %int %i_1
+         %86 = OpSLessThan %bool %85 %int_10
+               OpBranchConditional %86 %87 %82
+         %87 = OpLabel
+         %88 = OpLoad %int %i_1
+         %89 = OpLoad %int %i_1
+         %90 = OpISub %int %int_10 %89
+         %91 = OpAccessChain %_ptr_Private_int %obj %int_0 %88
+               OpStore %91 %90
+         %92 = OpLoad %int %i_1
+         %93 = OpLoad %int %i_1
+         %94 = OpAccessChain %_ptr_Private_int %obj %int_0 %93
+         %95 = OpLoad %int %94
+         %96 = OpLoad %int %i_1
+         %97 = OpAccessChain %_ptr_Private_int %obj %int_0 %96
+         %98 = OpLoad %int %97
+         %99 = OpIMul %int %95 %98
+        %100 = OpAccessChain %_ptr_Private_int %obj %int_0 %92
+               OpStore %100 %99
+               OpBranch %83
+         %83 = OpLabel
+        %101 = OpLoad %int %i_1
+        %102 = OpIAdd %int %101 %int_1
+               OpStore %i_1 %102
+               OpBranch %81
+         %82 = OpLabel
+        %103 = OpFunctionCall %void %quicksort_
+        %104 = OpLoad %v4float %gl_FragCoord
+        %105 = OpVectorShuffle %v2float %104 %104 0 1
+        %106 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+        %107 = OpLoad %v2float %106
+        %108 = OpFDiv %v2float %105 %107
+               OpStore %uv %108
+               OpStore %color %64
+        %109 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_0
+        %110 = OpLoad %int %109
+        %111 = OpConvertSToF %float %110
+        %112 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %113 = OpLoad %float %112
+        %114 = OpFAdd %float %113 %111
+        %115 = OpAccessChain %_ptr_Function_float %color %uint_0
+               OpStore %115 %114
+        %116 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %117 = OpLoad %float %116
+        %118 = OpFOrdGreaterThan %bool %117 %float_0_25
+               OpSelectionMerge %119 None
+               OpBranchConditional %118 %120 %119
+        %120 = OpLabel
+        %121 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_1
+        %122 = OpLoad %int %121
+        %123 = OpConvertSToF %float %122
+        %124 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %125 = OpLoad %float %124
+        %126 = OpFAdd %float %125 %123
+        %127 = OpAccessChain %_ptr_Function_float %color %uint_0
+               OpStore %127 %126
+               OpBranch %119
+        %119 = OpLabel
+        %128 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %129 = OpLoad %float %128
+        %130 = OpFOrdGreaterThan %bool %129 %float_0_5
+               OpSelectionMerge %131 None
+               OpBranchConditional %130 %132 %131
+        %132 = OpLabel
+        %133 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_2
+        %134 = OpLoad %int %133
+        %135 = OpConvertSToF %float %134
+        %136 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %137 = OpLoad %float %136
+        %138 = OpFAdd %float %137 %135
+        %139 = OpAccessChain %_ptr_Function_float %color %uint_1
+               OpStore %139 %138
+               OpBranch %131
+        %131 = OpLabel
+        %140 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %141 = OpLoad %float %140
+        %142 = OpFOrdGreaterThan %bool %141 %float_0_75
+               OpSelectionMerge %143 None
+               OpBranchConditional %142 %144 %143
+        %144 = OpLabel
+        %145 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_3
+        %146 = OpLoad %int %145
+        %147 = OpConvertSToF %float %146
+        %148 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %149 = OpLoad %float %148
+        %150 = OpFAdd %float %149 %147
+        %151 = OpAccessChain %_ptr_Function_float %color %uint_2
+               OpStore %151 %150
+               OpBranch %143
+        %143 = OpLabel
+        %152 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_4
+        %153 = OpLoad %int %152
+        %154 = OpConvertSToF %float %153
+        %155 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %156 = OpLoad %float %155
+        %157 = OpFAdd %float %156 %154
+        %158 = OpAccessChain %_ptr_Function_float %color %uint_1
+               OpStore %158 %157
+        %159 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %160 = OpLoad %float %159
+        %161 = OpFOrdGreaterThan %bool %160 %float_0_25
+               OpSelectionMerge %162 None
+               OpBranchConditional %161 %163 %162
+        %163 = OpLabel
+        %164 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_5
+        %165 = OpLoad %int %164
+        %166 = OpConvertSToF %float %165
+        %167 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %168 = OpLoad %float %167
+        %169 = OpFAdd %float %168 %166
+        %170 = OpAccessChain %_ptr_Function_float %color %uint_0
+               OpStore %170 %169
+               OpBranch %162
+        %162 = OpLabel
+        %171 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %172 = OpLoad %float %171
+        %173 = OpFOrdGreaterThan %bool %172 %float_0_5
+               OpSelectionMerge %174 None
+               OpBranchConditional %173 %175 %174
+        %175 = OpLabel
+        %176 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_6
+        %177 = OpLoad %int %176
+        %178 = OpConvertSToF %float %177
+        %179 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %180 = OpLoad %float %179
+        %181 = OpFAdd %float %180 %178
+        %182 = OpAccessChain %_ptr_Function_float %color %uint_1
+               OpStore %182 %181
+               OpBranch %174
+        %174 = OpLabel
+        %183 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %184 = OpLoad %float %183
+        %185 = OpFOrdGreaterThan %bool %184 %float_0_75
+               OpSelectionMerge %186 None
+               OpBranchConditional %185 %187 %186
+        %187 = OpLabel
+        %188 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_7
+        %189 = OpLoad %int %188
+        %190 = OpConvertSToF %float %189
+        %191 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %192 = OpLoad %float %191
+        %193 = OpFAdd %float %192 %190
+        %194 = OpAccessChain %_ptr_Function_float %color %uint_2
+               OpStore %194 %193
+               OpBranch %186
+        %186 = OpLabel
+        %195 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_8
+        %196 = OpLoad %int %195
+        %197 = OpConvertSToF %float %196
+        %198 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %199 = OpLoad %float %198
+        %200 = OpFAdd %float %199 %197
+        %201 = OpAccessChain %_ptr_Function_float %color %uint_2
+               OpStore %201 %200
+        %202 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %203 = OpLoad %float %202
+        %204 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %205 = OpLoad %float %204
+        %206 = OpFSub %float %203 %205
+        %207 = OpExtInst %float %1 FAbs %206
+        %208 = OpFOrdLessThan %bool %207 %float_0_25
+               OpSelectionMerge %209 None
+               OpBranchConditional %208 %210 %209
+        %210 = OpLabel
+        %211 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_9
+        %212 = OpLoad %int %211
+        %213 = OpConvertSToF %float %212
+        %214 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %215 = OpLoad %float %214
+        %216 = OpFAdd %float %215 %213
+        %217 = OpAccessChain %_ptr_Function_float %color %uint_0
+               OpStore %217 %216
+               OpBranch %209
+        %209 = OpLabel
+        %218 = OpLoad %v3float %color
+        %219 = OpExtInst %v3float %1 Normalize %218
+        %220 = OpCompositeExtract %float %219 0
+        %221 = OpCompositeExtract %float %219 1
+        %222 = OpCompositeExtract %float %219 2
+        %223 = OpCompositeConstruct %v4float %220 %221 %222 %float_1
+               OpStore %_GLF_color %223
+               OpReturn
+               OpFunctionEnd
+%swap_i1_i1_ = OpFunction %void None %38
+          %i = OpFunctionParameter %_ptr_Function_int
+          %j = OpFunctionParameter %_ptr_Function_int
+        %224 = OpLabel
+       %temp = OpVariable %_ptr_Function_int Function
+        %225 = OpLoad %int %i
+        %226 = OpAccessChain %_ptr_Private_int %obj %int_0 %225
+        %227 = OpLoad %int %226
+               OpStore %temp %227
+        %228 = OpLoad %int %i
+        %229 = OpLoad %int %j
+        %230 = OpAccessChain %_ptr_Private_int %obj %int_0 %229
+        %231 = OpLoad %int %230
+        %232 = OpAccessChain %_ptr_Private_int %obj %int_0 %228
+               OpStore %232 %231
+        %233 = OpLoad %int %j
+        %234 = OpLoad %int %temp
+        %235 = OpAccessChain %_ptr_Private_int %obj %int_0 %233
+               OpStore %235 %234
+               OpReturn
+               OpFunctionEnd
+%performPartition_i1_i1_ = OpFunction %int None %39
+          %l = OpFunctionParameter %_ptr_Function_int
+          %h = OpFunctionParameter %_ptr_Function_int
+        %236 = OpLabel
+      %pivot = OpVariable %_ptr_Function_int Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+        %j_0 = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_int Function
+    %param_0 = OpVariable %_ptr_Function_int Function
+    %param_1 = OpVariable %_ptr_Function_int Function
+    %param_2 = OpVariable %_ptr_Function_int Function
+        %237 = OpLoad %int %h
+        %238 = OpAccessChain %_ptr_Private_int %obj %int_0 %237
+        %239 = OpLoad %int %238
+               OpStore %pivot %239
+        %240 = OpLoad %int %l
+        %241 = OpISub %int %240 %int_1
+               OpStore %i_0 %241
+        %242 = OpLoad %int %l
+               OpStore %j_0 %242
+               OpBranch %243
+        %243 = OpLabel
+               OpLoopMerge %244 %245 None
+               OpBranch %246
+        %246 = OpLabel
+        %247 = OpLoad %int %j_0
+        %248 = OpLoad %int %h
+        %249 = OpISub %int %248 %int_1
+        %250 = OpSLessThanEqual %bool %247 %249
+               OpBranchConditional %250 %251 %244
+        %251 = OpLabel
+        %252 = OpLoad %int %j_0
+        %253 = OpAccessChain %_ptr_Private_int %obj %int_0 %252
+        %254 = OpLoad %int %253
+        %255 = OpLoad %int %pivot
+        %256 = OpSLessThanEqual %bool %254 %255
+               OpSelectionMerge %257 None
+               OpBranchConditional %256 %258 %257
+        %258 = OpLabel
+        %259 = OpLoad %int %i_0
+        %260 = OpIAdd %int %259 %int_1
+               OpStore %i_0 %260
+        %261 = OpLoad %int %i_0
+               OpStore %param %261
+        %262 = OpLoad %int %j_0
+               OpStore %param_0 %262
+        %263 = OpFunctionCall %void %swap_i1_i1_ %param %param_0
+               OpBranch %257
+        %257 = OpLabel
+               OpBranch %245
+        %245 = OpLabel
+        %264 = OpLoad %int %j_0
+        %265 = OpIAdd %int %264 %int_1
+               OpStore %j_0 %265
+               OpBranch %243
+        %244 = OpLabel
+        %266 = OpLoad %int %i_0
+        %267 = OpIAdd %int %266 %int_1
+               OpStore %i_0 %267
+        %268 = OpLoad %int %i_0
+               OpStore %param_1 %268
+        %269 = OpLoad %int %h
+               OpStore %param_2 %269
+        %270 = OpFunctionCall %void %swap_i1_i1_ %param_1 %param_2
+        %271 = OpLoad %int %i_0
+               OpReturnValue %271
+               OpFunctionEnd
+ %quicksort_ = OpFunction %void None %35
+        %272 = OpLabel
+        %l_0 = OpVariable %_ptr_Function_int Function
+        %h_0 = OpVariable %_ptr_Function_int Function
+        %top = OpVariable %_ptr_Function_int Function
+      %stack = OpVariable %_ptr_Function__arr_int_uint_10 Function
+          %p = OpVariable %_ptr_Function_int Function
+    %param_3 = OpVariable %_ptr_Function_int Function
+    %param_4 = OpVariable %_ptr_Function_int Function
+               OpStore %l_0 %int_0
+               OpStore %h_0 %int_9
+               OpStore %top %int_n1
+        %273 = OpLoad %int %top
+        %274 = OpIAdd %int %273 %int_1
+               OpStore %top %274
+        %275 = OpLoad %int %l_0
+        %276 = OpAccessChain %_ptr_Function_int %stack %274
+               OpStore %276 %275
+        %277 = OpLoad %int %top
+        %278 = OpIAdd %int %277 %int_1
+               OpStore %top %278
+        %279 = OpLoad %int %h_0
+        %280 = OpAccessChain %_ptr_Function_int %stack %278
+               OpStore %280 %279
+               OpBranch %281
+        %281 = OpLabel
+               OpLoopMerge %282 %283 None
+               OpBranch %284
+        %284 = OpLabel
+        %285 = OpLoad %int %top
+        %286 = OpSGreaterThanEqual %bool %285 %int_0
+               OpBranchConditional %286 %287 %282
+        %287 = OpLabel
+        %288 = OpLoad %int %top
+        %289 = OpISub %int %288 %int_1
+               OpStore %top %289
+        %290 = OpAccessChain %_ptr_Function_int %stack %288
+        %291 = OpLoad %int %290
+               OpStore %h_0 %291
+        %292 = OpLoad %int %top
+        %293 = OpISub %int %292 %int_1
+               OpStore %top %293
+        %294 = OpAccessChain %_ptr_Function_int %stack %292
+        %295 = OpLoad %int %294
+               OpStore %l_0 %295
+        %296 = OpLoad %int %l_0
+               OpStore %param_3 %296
+        %297 = OpLoad %int %h_0
+               OpStore %param_4 %297
+        %298 = OpFunctionCall %int %performPartition_i1_i1_ %param_3 %param_4
+               OpStore %p %298
+        %299 = OpLoad %int %p
+        %300 = OpISub %int %299 %int_1
+        %301 = OpLoad %int %l_0
+        %302 = OpSGreaterThan %bool %300 %301
+               OpSelectionMerge %303 None
+               OpBranchConditional %302 %304 %303
+        %304 = OpLabel
+        %305 = OpLoad %int %top
+        %306 = OpIAdd %int %305 %int_1
+               OpStore %top %306
+        %307 = OpLoad %int %l_0
+        %308 = OpAccessChain %_ptr_Function_int %stack %306
+               OpStore %308 %307
+        %309 = OpLoad %int %top
+        %310 = OpIAdd %int %309 %int_1
+               OpStore %top %310
+        %311 = OpLoad %int %p
+        %312 = OpISub %int %311 %int_1
+        %313 = OpAccessChain %_ptr_Function_int %stack %310
+               OpStore %313 %312
+               OpBranch %303
+        %303 = OpLabel
+        %314 = OpLoad %int %p
+        %315 = OpIAdd %int %314 %int_1
+        %316 = OpLoad %int %h_0
+        %317 = OpSLessThan %bool %315 %316
+               OpSelectionMerge %318 None
+               OpBranchConditional %317 %319 %318
+        %319 = OpLabel
+        %320 = OpLoad %int %top
+        %321 = OpIAdd %int %320 %int_1
+               OpStore %top %321
+        %322 = OpLoad %int %p
+        %323 = OpIAdd %int %322 %int_1
+        %324 = OpAccessChain %_ptr_Function_int %stack %321
+               OpStore %324 %323
+        %325 = OpLoad %int %top
+        %326 = OpIAdd %int %325 %int_1
+               OpStore %top %326
+        %327 = OpLoad %int %h_0
+        %328 = OpAccessChain %_ptr_Function_int %stack %326
+               OpStore %328 %327
+               OpBranch %318
+        %318 = OpLabel
+               OpBranch %283
+        %283 = OpLabel
+               OpBranch %281
+        %282 = OpLabel
+               OpReturn
+               OpFunctionEnd
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
new file mode 100644
index 0000000..18cfa06
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-dontinline/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,214 @@
+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;
+  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;
+  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;
+  {
+    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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-dontinline/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-dontinline/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..7cd8892
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-dontinline/0-opt.spvasm.expected.msl
@@ -0,0 +1,256 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct QuicksortObject {
+  tint_array_wrapper numbers;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void swap_i1_i1_(thread int* const i, thread int* const j, thread QuicksortObject* const tint_symbol_5) {
+  int temp = 0;
+  int const x_225 = *(i);
+  int const x_227 = (*(tint_symbol_5)).numbers.arr[x_225];
+  temp = x_227;
+  int const x_228 = *(i);
+  int const x_229 = *(j);
+  int const x_231 = (*(tint_symbol_5)).numbers.arr[x_229];
+  (*(tint_symbol_5)).numbers.arr[x_228] = x_231;
+  int const x_233 = *(j);
+  int const x_234 = temp;
+  (*(tint_symbol_5)).numbers.arr[x_233] = x_234;
+  return;
+}
+
+int performPartition_i1_i1_(thread int* const l, thread int* const h, thread QuicksortObject* const tint_symbol_6) {
+  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;
+  int const x_237 = *(h);
+  int const x_239 = (*(tint_symbol_6)).numbers.arr[x_237];
+  pivot = x_239;
+  int const x_240 = *(l);
+  i_1 = (x_240 - 1);
+  int const x_242 = *(l);
+  j_1 = x_242;
+  while (true) {
+    int const x_247 = j_1;
+    int const x_248 = *(h);
+    if ((x_247 <= (x_248 - 1))) {
+    } else {
+      break;
+    }
+    int const x_252 = j_1;
+    int const x_254 = (*(tint_symbol_6)).numbers.arr[x_252];
+    int const x_255 = pivot;
+    if ((x_254 <= x_255)) {
+      int const x_259 = i_1;
+      i_1 = (x_259 + 1);
+      int const x_261 = i_1;
+      param = x_261;
+      int const x_262 = j_1;
+      param_1 = x_262;
+      swap_i1_i1_(&(param), &(param_1), tint_symbol_6);
+    }
+    {
+      int const x_264 = j_1;
+      j_1 = (x_264 + 1);
+    }
+  }
+  int const x_266 = i_1;
+  i_1 = (x_266 + 1);
+  int const x_268 = i_1;
+  param_2 = x_268;
+  int const x_269 = *(h);
+  param_3 = x_269;
+  swap_i1_i1_(&(param_2), &(param_3), tint_symbol_6);
+  int const x_271 = i_1;
+  return x_271;
+}
+
+void quicksort_(thread QuicksortObject* const tint_symbol_7) {
+  int l_1 = 0;
+  int h_1 = 0;
+  int top = 0;
+  tint_array_wrapper stack = {};
+  int p = 0;
+  int param_4 = 0;
+  int param_5 = 0;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  int const x_273 = top;
+  int const x_274 = (x_273 + 1);
+  top = x_274;
+  int const x_275 = l_1;
+  stack.arr[x_274] = x_275;
+  int const x_277 = top;
+  int const x_278 = (x_277 + 1);
+  top = x_278;
+  int const x_279 = h_1;
+  stack.arr[x_278] = x_279;
+  while (true) {
+    int const x_285 = top;
+    if ((x_285 >= 0)) {
+    } else {
+      break;
+    }
+    int const x_288 = top;
+    top = (x_288 - 1);
+    int const x_291 = stack.arr[x_288];
+    h_1 = x_291;
+    int const x_292 = top;
+    top = (x_292 - 1);
+    int const x_295 = stack.arr[x_292];
+    l_1 = x_295;
+    int const x_296 = l_1;
+    param_4 = x_296;
+    int const x_297 = h_1;
+    param_5 = x_297;
+    int const x_298 = performPartition_i1_i1_(&(param_4), &(param_5), tint_symbol_7);
+    p = x_298;
+    int const x_299 = p;
+    int const x_301 = l_1;
+    if (((x_299 - 1) > x_301)) {
+      int const x_305 = top;
+      int const x_306 = (x_305 + 1);
+      top = x_306;
+      int const x_307 = l_1;
+      stack.arr[x_306] = x_307;
+      int const x_309 = top;
+      int const x_310 = (x_309 + 1);
+      top = x_310;
+      int const x_311 = p;
+      stack.arr[x_310] = (x_311 - 1);
+    }
+    int const x_314 = p;
+    int const x_316 = h_1;
+    if (((x_314 + 1) < x_316)) {
+      int const x_320 = top;
+      int const x_321 = (x_320 + 1);
+      top = x_321;
+      int const x_322 = p;
+      stack.arr[x_321] = (x_322 + 1);
+      int const x_325 = top;
+      int const x_326 = (x_325 + 1);
+      top = x_326;
+      int const x_327 = h_1;
+      stack.arr[x_326] = x_327;
+    }
+  }
+  return;
+}
+
+void main_1(constant buf0& x_32, thread QuicksortObject* const tint_symbol_8, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10) {
+  int i_2 = 0;
+  float2 uv = 0.0f;
+  float3 color = 0.0f;
+  i_2 = 0;
+  while (true) {
+    int const x_85 = i_2;
+    if ((x_85 < 10)) {
+    } else {
+      break;
+    }
+    int const x_88 = i_2;
+    int const x_89 = i_2;
+    (*(tint_symbol_8)).numbers.arr[x_88] = (10 - x_89);
+    int const x_92 = i_2;
+    int const x_93 = i_2;
+    int const x_95 = (*(tint_symbol_8)).numbers.arr[x_93];
+    int const x_96 = i_2;
+    int const x_98 = (*(tint_symbol_8)).numbers.arr[x_96];
+    (*(tint_symbol_8)).numbers.arr[x_92] = (x_95 * x_98);
+    {
+      int const x_101 = i_2;
+      i_2 = (x_101 + 1);
+    }
+  }
+  quicksort_(tint_symbol_8);
+  float4 const x_104 = *(tint_symbol_9);
+  float2 const x_107 = x_32.resolution;
+  uv = (float2(x_104.x, x_104.y) / x_107);
+  color = float3(1.0f, 2.0f, 3.0f);
+  int const x_110 = (*(tint_symbol_8)).numbers.arr[0];
+  float const x_113 = color.x;
+  color.x = (x_113 + float(x_110));
+  float const x_117 = uv.x;
+  if ((x_117 > 0.25f)) {
+    int const x_122 = (*(tint_symbol_8)).numbers.arr[1];
+    float const x_125 = color.x;
+    color.x = (x_125 + float(x_122));
+  }
+  float const x_129 = uv.x;
+  if ((x_129 > 0.5f)) {
+    int const x_134 = (*(tint_symbol_8)).numbers.arr[2];
+    float const x_137 = color.y;
+    color.y = (x_137 + float(x_134));
+  }
+  float const x_141 = uv.x;
+  if ((x_141 > 0.75f)) {
+    int const x_146 = (*(tint_symbol_8)).numbers.arr[3];
+    float const x_149 = color.z;
+    color.z = (x_149 + float(x_146));
+  }
+  int const x_153 = (*(tint_symbol_8)).numbers.arr[4];
+  float const x_156 = color.y;
+  color.y = (x_156 + float(x_153));
+  float const x_160 = uv.y;
+  if ((x_160 > 0.25f)) {
+    int const x_165 = (*(tint_symbol_8)).numbers.arr[5];
+    float const x_168 = color.x;
+    color.x = (x_168 + float(x_165));
+  }
+  float const x_172 = uv.y;
+  if ((x_172 > 0.5f)) {
+    int const x_177 = (*(tint_symbol_8)).numbers.arr[6];
+    float const x_180 = color.y;
+    color.y = (x_180 + float(x_177));
+  }
+  float const x_184 = uv.y;
+  if ((x_184 > 0.75f)) {
+    int const x_189 = (*(tint_symbol_8)).numbers.arr[7];
+    float const x_192 = color.z;
+    color.z = (x_192 + float(x_189));
+  }
+  int const x_196 = (*(tint_symbol_8)).numbers.arr[8];
+  float const x_199 = color.z;
+  color.z = (x_199 + float(x_196));
+  float const x_203 = uv.x;
+  float const x_205 = uv.y;
+  if ((fabs((x_203 - x_205)) < 0.25f)) {
+    int const x_212 = (*(tint_symbol_8)).numbers.arr[9];
+    float const x_215 = color.x;
+    color.x = (x_215 + float(x_212));
+  }
+  float3 const x_218 = color;
+  float3 const x_219 = normalize(x_218);
+  *(tint_symbol_10) = float4(x_219.x, x_219.y, x_219.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_32 [[buffer(0)]]) {
+  thread float4 tint_symbol_11 = 0.0f;
+  thread QuicksortObject tint_symbol_12 = {};
+  thread float4 tint_symbol_13 = 0.0f;
+  tint_symbol_11 = gl_FragCoord_param;
+  main_1(x_32, &(tint_symbol_12), &(tint_symbol_11), &(tint_symbol_13));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_13};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-dontinline/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-dontinline/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..dfd34c5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-dontinline/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,541 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 374
+; Schema: 0
+               OpCapability Shader
+        %343 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %QuicksortObject "QuicksortObject"
+               OpMemberName %QuicksortObject 0 "numbers"
+               OpName %obj "obj"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_32 "x_32"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %swap_i1_i1_ "swap_i1_i1_"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %temp "temp"
+               OpName %performPartition_i1_i1_ "performPartition_i1_i1_"
+               OpName %l "l"
+               OpName %h "h"
+               OpName %pivot "pivot"
+               OpName %i_1 "i_1"
+               OpName %j_1 "j_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %quicksort_ "quicksort_"
+               OpName %l_1 "l_1"
+               OpName %h_1 "h_1"
+               OpName %top "top"
+               OpName %stack "stack"
+               OpName %p "p"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpName %main_1 "main_1"
+               OpName %i_2 "i_2"
+               OpName %uv "uv"
+               OpName %color "color"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpMemberDecorate %QuicksortObject 0 Offset 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_32 NonWritable
+               OpDecorate %x_32 DescriptorSet 0
+               OpDecorate %x_32 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%QuicksortObject = OpTypeStruct %_arr_int_uint_10
+%_ptr_Private_QuicksortObject = OpTypePointer Private %QuicksortObject
+          %8 = OpConstantNull %QuicksortObject
+        %obj = OpVariable %_ptr_Private_QuicksortObject Private %8
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %13 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %13
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_32 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %13
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %13
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+         %31 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_int = OpTypePointer Private %int
+         %49 = OpTypeFunction %int %_ptr_Function_int %_ptr_Function_int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+        %109 = OpTypeFunction %void
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+        %117 = OpConstantNull %_arr_int_uint_10
+      %int_0 = OpConstant %int 0
+      %int_9 = OpConstant %int 9
+     %int_n1 = OpConstant %int -1
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+        %189 = OpConstantNull %v2float
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+        %193 = OpConstantNull %v3float
+     %int_10 = OpConstant %int 10
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+        %231 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+%_ptr_Function_float = OpTypePointer Function %float
+ %float_0_25 = OpConstant %float 0.25
+  %float_0_5 = OpConstant %float 0.5
+      %int_2 = OpConstant %int 2
+     %uint_1 = OpConstant %uint 1
+ %float_0_75 = OpConstant %float 0.75
+      %int_3 = OpConstant %int 3
+     %uint_2 = OpConstant %uint 2
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+   %main_out = OpTypeStruct %v4float
+        %361 = OpTypeFunction %void %main_out
+%swap_i1_i1_ = OpFunction %void None %23
+          %i = OpFunctionParameter %_ptr_Function_int
+          %j = OpFunctionParameter %_ptr_Function_int
+         %29 = OpLabel
+       %temp = OpVariable %_ptr_Function_int Function %31
+         %33 = OpLoad %int %i
+         %36 = OpAccessChain %_ptr_Private_int %obj %uint_0 %33
+         %37 = OpLoad %int %36
+               OpStore %temp %37
+         %39 = OpLoad %int %i
+         %41 = OpLoad %int %j
+         %42 = OpAccessChain %_ptr_Private_int %obj %uint_0 %41
+         %43 = OpLoad %int %42
+         %44 = OpAccessChain %_ptr_Private_int %obj %uint_0 %39
+               OpStore %44 %43
+         %46 = OpLoad %int %j
+         %47 = OpLoad %int %temp
+         %48 = OpAccessChain %_ptr_Private_int %obj %uint_0 %46
+               OpStore %48 %47
+               OpReturn
+               OpFunctionEnd
+%performPartition_i1_i1_ = OpFunction %int None %49
+          %l = OpFunctionParameter %_ptr_Function_int
+          %h = OpFunctionParameter %_ptr_Function_int
+         %53 = OpLabel
+      %pivot = OpVariable %_ptr_Function_int Function %31
+        %i_1 = OpVariable %_ptr_Function_int Function %31
+        %j_1 = OpVariable %_ptr_Function_int Function %31
+      %param = OpVariable %_ptr_Function_int Function %31
+    %param_1 = OpVariable %_ptr_Function_int Function %31
+    %param_2 = OpVariable %_ptr_Function_int Function %31
+    %param_3 = OpVariable %_ptr_Function_int Function %31
+         %62 = OpLoad %int %h
+         %63 = OpAccessChain %_ptr_Private_int %obj %uint_0 %62
+         %64 = OpLoad %int %63
+               OpStore %pivot %64
+         %66 = OpLoad %int %l
+         %68 = OpISub %int %66 %int_1
+               OpStore %i_1 %68
+         %70 = OpLoad %int %l
+               OpStore %j_1 %70
+               OpBranch %71
+         %71 = OpLabel
+               OpLoopMerge %72 %73 None
+               OpBranch %74
+         %74 = OpLabel
+         %75 = OpLoad %int %j_1
+         %77 = OpLoad %int %h
+         %78 = OpISub %int %77 %int_1
+         %79 = OpSLessThanEqual %bool %75 %78
+               OpSelectionMerge %81 None
+               OpBranchConditional %79 %82 %83
+         %82 = OpLabel
+               OpBranch %81
+         %83 = OpLabel
+               OpBranch %72
+         %81 = OpLabel
+         %84 = OpLoad %int %j_1
+         %85 = OpAccessChain %_ptr_Private_int %obj %uint_0 %84
+         %86 = OpLoad %int %85
+         %87 = OpLoad %int %pivot
+         %88 = OpSLessThanEqual %bool %86 %87
+               OpSelectionMerge %89 None
+               OpBranchConditional %88 %90 %89
+         %90 = OpLabel
+         %91 = OpLoad %int %i_1
+         %92 = OpIAdd %int %91 %int_1
+               OpStore %i_1 %92
+         %93 = OpLoad %int %i_1
+               OpStore %param %93
+         %94 = OpLoad %int %j_1
+               OpStore %param_1 %94
+         %95 = OpFunctionCall %void %swap_i1_i1_ %param %param_1
+               OpBranch %89
+         %89 = OpLabel
+               OpBranch %73
+         %73 = OpLabel
+         %98 = OpLoad %int %j_1
+         %99 = OpIAdd %int %98 %int_1
+               OpStore %j_1 %99
+               OpBranch %71
+         %72 = OpLabel
+        %100 = OpLoad %int %i_1
+        %101 = OpIAdd %int %100 %int_1
+               OpStore %i_1 %101
+        %102 = OpLoad %int %i_1
+               OpStore %param_2 %102
+        %104 = OpLoad %int %h
+               OpStore %param_3 %104
+        %105 = OpFunctionCall %void %swap_i1_i1_ %param_2 %param_3
+        %108 = OpLoad %int %i_1
+               OpReturnValue %108
+               OpFunctionEnd
+ %quicksort_ = OpFunction %void None %109
+        %111 = OpLabel
+        %l_1 = OpVariable %_ptr_Function_int Function %31
+        %h_1 = OpVariable %_ptr_Function_int Function %31
+        %top = OpVariable %_ptr_Function_int Function %31
+      %stack = OpVariable %_ptr_Function__arr_int_uint_10 Function %117
+          %p = OpVariable %_ptr_Function_int Function %31
+    %param_4 = OpVariable %_ptr_Function_int Function %31
+    %param_5 = OpVariable %_ptr_Function_int Function %31
+               OpStore %l_1 %int_0
+               OpStore %h_1 %int_9
+               OpStore %top %int_n1
+        %124 = OpLoad %int %top
+        %125 = OpIAdd %int %124 %int_1
+               OpStore %top %125
+        %126 = OpLoad %int %l_1
+        %127 = OpAccessChain %_ptr_Function_int %stack %125
+               OpStore %127 %126
+        %128 = OpLoad %int %top
+        %129 = OpIAdd %int %128 %int_1
+               OpStore %top %129
+        %130 = OpLoad %int %h_1
+        %131 = OpAccessChain %_ptr_Function_int %stack %129
+               OpStore %131 %130
+               OpBranch %132
+        %132 = OpLabel
+               OpLoopMerge %133 %134 None
+               OpBranch %135
+        %135 = OpLabel
+        %136 = OpLoad %int %top
+        %137 = OpSGreaterThanEqual %bool %136 %int_0
+               OpSelectionMerge %138 None
+               OpBranchConditional %137 %139 %140
+        %139 = OpLabel
+               OpBranch %138
+        %140 = OpLabel
+               OpBranch %133
+        %138 = OpLabel
+        %141 = OpLoad %int %top
+        %142 = OpISub %int %141 %int_1
+               OpStore %top %142
+        %143 = OpAccessChain %_ptr_Function_int %stack %141
+        %144 = OpLoad %int %143
+               OpStore %h_1 %144
+        %145 = OpLoad %int %top
+        %146 = OpISub %int %145 %int_1
+               OpStore %top %146
+        %147 = OpAccessChain %_ptr_Function_int %stack %145
+        %148 = OpLoad %int %147
+               OpStore %l_1 %148
+        %149 = OpLoad %int %l_1
+               OpStore %param_4 %149
+        %150 = OpLoad %int %h_1
+               OpStore %param_5 %150
+        %151 = OpFunctionCall %int %performPartition_i1_i1_ %param_4 %param_5
+               OpStore %p %151
+        %154 = OpLoad %int %p
+        %155 = OpLoad %int %l_1
+        %156 = OpISub %int %154 %int_1
+        %157 = OpSGreaterThan %bool %156 %155
+               OpSelectionMerge %158 None
+               OpBranchConditional %157 %159 %158
+        %159 = OpLabel
+        %160 = OpLoad %int %top
+        %161 = OpIAdd %int %160 %int_1
+               OpStore %top %161
+        %162 = OpLoad %int %l_1
+        %163 = OpAccessChain %_ptr_Function_int %stack %161
+               OpStore %163 %162
+        %164 = OpLoad %int %top
+        %165 = OpIAdd %int %164 %int_1
+               OpStore %top %165
+        %166 = OpLoad %int %p
+        %167 = OpAccessChain %_ptr_Function_int %stack %165
+        %168 = OpISub %int %166 %int_1
+               OpStore %167 %168
+               OpBranch %158
+        %158 = OpLabel
+        %169 = OpLoad %int %p
+        %170 = OpLoad %int %h_1
+        %171 = OpIAdd %int %169 %int_1
+        %172 = OpSLessThan %bool %171 %170
+               OpSelectionMerge %173 None
+               OpBranchConditional %172 %174 %173
+        %174 = OpLabel
+        %175 = OpLoad %int %top
+        %176 = OpIAdd %int %175 %int_1
+               OpStore %top %176
+        %177 = OpLoad %int %p
+        %178 = OpAccessChain %_ptr_Function_int %stack %176
+        %179 = OpIAdd %int %177 %int_1
+               OpStore %178 %179
+        %180 = OpLoad %int %top
+        %181 = OpIAdd %int %180 %int_1
+               OpStore %top %181
+        %182 = OpLoad %int %h_1
+        %183 = OpAccessChain %_ptr_Function_int %stack %181
+               OpStore %183 %182
+               OpBranch %173
+        %173 = OpLabel
+               OpBranch %134
+        %134 = OpLabel
+               OpBranch %132
+        %133 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %109
+        %185 = OpLabel
+        %i_2 = OpVariable %_ptr_Function_int Function %31
+         %uv = OpVariable %_ptr_Function_v2float Function %189
+      %color = OpVariable %_ptr_Function_v3float Function %193
+               OpStore %i_2 %int_0
+               OpBranch %194
+        %194 = OpLabel
+               OpLoopMerge %195 %196 None
+               OpBranch %197
+        %197 = OpLabel
+        %198 = OpLoad %int %i_2
+        %200 = OpSLessThan %bool %198 %int_10
+               OpSelectionMerge %201 None
+               OpBranchConditional %200 %202 %203
+        %202 = OpLabel
+               OpBranch %201
+        %203 = OpLabel
+               OpBranch %195
+        %201 = OpLabel
+        %204 = OpLoad %int %i_2
+        %205 = OpLoad %int %i_2
+        %206 = OpAccessChain %_ptr_Private_int %obj %uint_0 %204
+        %207 = OpISub %int %int_10 %205
+               OpStore %206 %207
+        %208 = OpLoad %int %i_2
+        %209 = OpLoad %int %i_2
+        %210 = OpAccessChain %_ptr_Private_int %obj %uint_0 %209
+        %211 = OpLoad %int %210
+        %212 = OpLoad %int %i_2
+        %213 = OpAccessChain %_ptr_Private_int %obj %uint_0 %212
+        %214 = OpLoad %int %213
+        %215 = OpAccessChain %_ptr_Private_int %obj %uint_0 %208
+        %216 = OpIMul %int %211 %214
+               OpStore %215 %216
+               OpBranch %196
+        %196 = OpLabel
+        %217 = OpLoad %int %i_2
+        %218 = OpIAdd %int %217 %int_1
+               OpStore %i_2 %218
+               OpBranch %194
+        %195 = OpLabel
+        %219 = OpFunctionCall %void %quicksort_
+        %220 = OpLoad %v4float %gl_FragCoord
+        %222 = OpAccessChain %_ptr_Uniform_v2float %x_32 %uint_0
+        %223 = OpLoad %v2float %222
+        %224 = OpCompositeExtract %float %220 0
+        %225 = OpCompositeExtract %float %220 1
+        %226 = OpCompositeConstruct %v2float %224 %225
+        %227 = OpFDiv %v2float %226 %223
+               OpStore %uv %227
+               OpStore %color %231
+        %232 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_0
+        %233 = OpLoad %int %232
+        %235 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %236 = OpLoad %float %235
+        %237 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %238 = OpConvertSToF %float %233
+        %239 = OpFAdd %float %236 %238
+               OpStore %237 %239
+        %240 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %241 = OpLoad %float %240
+        %243 = OpFOrdGreaterThan %bool %241 %float_0_25
+               OpSelectionMerge %244 None
+               OpBranchConditional %243 %245 %244
+        %245 = OpLabel
+        %246 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_1
+        %247 = OpLoad %int %246
+        %248 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %249 = OpLoad %float %248
+        %250 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %251 = OpConvertSToF %float %247
+        %252 = OpFAdd %float %249 %251
+               OpStore %250 %252
+               OpBranch %244
+        %244 = OpLabel
+        %253 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %254 = OpLoad %float %253
+        %256 = OpFOrdGreaterThan %bool %254 %float_0_5
+               OpSelectionMerge %257 None
+               OpBranchConditional %256 %258 %257
+        %258 = OpLabel
+        %260 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_2
+        %261 = OpLoad %int %260
+        %263 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %264 = OpLoad %float %263
+        %265 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %266 = OpConvertSToF %float %261
+        %267 = OpFAdd %float %264 %266
+               OpStore %265 %267
+               OpBranch %257
+        %257 = OpLabel
+        %268 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %269 = OpLoad %float %268
+        %271 = OpFOrdGreaterThan %bool %269 %float_0_75
+               OpSelectionMerge %272 None
+               OpBranchConditional %271 %273 %272
+        %273 = OpLabel
+        %275 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_3
+        %276 = OpLoad %int %275
+        %278 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %279 = OpLoad %float %278
+        %280 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %281 = OpConvertSToF %float %276
+        %282 = OpFAdd %float %279 %281
+               OpStore %280 %282
+               OpBranch %272
+        %272 = OpLabel
+        %284 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_4
+        %285 = OpLoad %int %284
+        %286 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %287 = OpLoad %float %286
+        %288 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %289 = OpConvertSToF %float %285
+        %290 = OpFAdd %float %287 %289
+               OpStore %288 %290
+        %291 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %292 = OpLoad %float %291
+        %293 = OpFOrdGreaterThan %bool %292 %float_0_25
+               OpSelectionMerge %294 None
+               OpBranchConditional %293 %295 %294
+        %295 = OpLabel
+        %297 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_5
+        %298 = OpLoad %int %297
+        %299 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %300 = OpLoad %float %299
+        %301 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %302 = OpConvertSToF %float %298
+        %303 = OpFAdd %float %300 %302
+               OpStore %301 %303
+               OpBranch %294
+        %294 = OpLabel
+        %304 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %305 = OpLoad %float %304
+        %306 = OpFOrdGreaterThan %bool %305 %float_0_5
+               OpSelectionMerge %307 None
+               OpBranchConditional %306 %308 %307
+        %308 = OpLabel
+        %310 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_6
+        %311 = OpLoad %int %310
+        %312 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %313 = OpLoad %float %312
+        %314 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %315 = OpConvertSToF %float %311
+        %316 = OpFAdd %float %313 %315
+               OpStore %314 %316
+               OpBranch %307
+        %307 = OpLabel
+        %317 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %318 = OpLoad %float %317
+        %319 = OpFOrdGreaterThan %bool %318 %float_0_75
+               OpSelectionMerge %320 None
+               OpBranchConditional %319 %321 %320
+        %321 = OpLabel
+        %323 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_7
+        %324 = OpLoad %int %323
+        %325 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %326 = OpLoad %float %325
+        %327 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %328 = OpConvertSToF %float %324
+        %329 = OpFAdd %float %326 %328
+               OpStore %327 %329
+               OpBranch %320
+        %320 = OpLabel
+        %331 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_8
+        %332 = OpLoad %int %331
+        %333 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %334 = OpLoad %float %333
+        %335 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %336 = OpConvertSToF %float %332
+        %337 = OpFAdd %float %334 %336
+               OpStore %335 %337
+        %338 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %339 = OpLoad %float %338
+        %340 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %341 = OpLoad %float %340
+        %344 = OpFSub %float %339 %341
+        %342 = OpExtInst %float %343 FAbs %344
+        %345 = OpFOrdLessThan %bool %342 %float_0_25
+               OpSelectionMerge %346 None
+               OpBranchConditional %345 %347 %346
+        %347 = OpLabel
+        %348 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_9
+        %349 = OpLoad %int %348
+        %350 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %351 = OpLoad %float %350
+        %352 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %353 = OpConvertSToF %float %349
+        %354 = OpFAdd %float %351 %353
+               OpStore %352 %354
+               OpBranch %346
+        %346 = OpLabel
+        %355 = OpLoad %v3float %color
+        %356 = OpExtInst %v3float %343 Normalize %355
+        %357 = OpCompositeExtract %float %356 0
+        %358 = OpCompositeExtract %float %356 1
+        %359 = OpCompositeExtract %float %356 2
+        %360 = OpCompositeConstruct %v4float %357 %358 %359 %float_1
+               OpStore %x_GLF_color %360
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %361
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %365 = OpLabel
+        %366 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %366
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %109
+        %368 = OpLabel
+        %369 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %369
+        %370 = OpFunctionCall %void %main_1
+        %372 = OpLoad %v4float %x_GLF_color
+        %373 = OpCompositeConstruct %main_out %372
+        %371 = OpFunctionCall %void %tint_symbol_3 %373
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-dontinline/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-dontinline/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..df70a1d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-dontinline/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,256 @@
+struct QuicksortObject {
+  numbers : array<i32, 10>;
+};
+
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> obj : QuicksortObject;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_32 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn swap_i1_i1_(i : ptr<function, i32>, j : ptr<function, i32>) {
+  var temp : i32;
+  let x_225 : i32 = *(i);
+  let x_227 : i32 = obj.numbers[x_225];
+  temp = x_227;
+  let x_228 : i32 = *(i);
+  let x_229 : i32 = *(j);
+  let x_231 : i32 = obj.numbers[x_229];
+  obj.numbers[x_228] = x_231;
+  let x_233 : i32 = *(j);
+  let x_234 : i32 = temp;
+  obj.numbers[x_233] = x_234;
+  return;
+}
+
+fn performPartition_i1_i1_(l : ptr<function, i32>, h : ptr<function, i32>) -> i32 {
+  var pivot : i32;
+  var i_1 : i32;
+  var j_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  var param_3 : i32;
+  let x_237 : i32 = *(h);
+  let x_239 : i32 = obj.numbers[x_237];
+  pivot = x_239;
+  let x_240 : i32 = *(l);
+  i_1 = (x_240 - 1);
+  let x_242 : i32 = *(l);
+  j_1 = x_242;
+  loop {
+    let x_247 : i32 = j_1;
+    let x_248 : i32 = *(h);
+    if ((x_247 <= (x_248 - 1))) {
+    } else {
+      break;
+    }
+    let x_252 : i32 = j_1;
+    let x_254 : i32 = obj.numbers[x_252];
+    let x_255 : i32 = pivot;
+    if ((x_254 <= x_255)) {
+      let x_259 : i32 = i_1;
+      i_1 = (x_259 + 1);
+      let x_261 : i32 = i_1;
+      param = x_261;
+      let x_262 : i32 = j_1;
+      param_1 = x_262;
+      swap_i1_i1_(&(param), &(param_1));
+    }
+
+    continuing {
+      let x_264 : i32 = j_1;
+      j_1 = (x_264 + 1);
+    }
+  }
+  let x_266 : i32 = i_1;
+  i_1 = (x_266 + 1);
+  let x_268 : i32 = i_1;
+  param_2 = x_268;
+  let x_269 : i32 = *(h);
+  param_3 = x_269;
+  swap_i1_i1_(&(param_2), &(param_3));
+  let x_271 : i32 = i_1;
+  return x_271;
+}
+
+fn quicksort_() {
+  var l_1 : i32;
+  var h_1 : i32;
+  var top : i32;
+  var stack : array<i32, 10>;
+  var p : i32;
+  var param_4 : i32;
+  var param_5 : i32;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  let x_273 : i32 = top;
+  let x_274 : i32 = (x_273 + 1);
+  top = x_274;
+  let x_275 : i32 = l_1;
+  stack[x_274] = x_275;
+  let x_277 : i32 = top;
+  let x_278 : i32 = (x_277 + 1);
+  top = x_278;
+  let x_279 : i32 = h_1;
+  stack[x_278] = x_279;
+  loop {
+    let x_285 : i32 = top;
+    if ((x_285 >= 0)) {
+    } else {
+      break;
+    }
+    let x_288 : i32 = top;
+    top = (x_288 - 1);
+    let x_291 : i32 = stack[x_288];
+    h_1 = x_291;
+    let x_292 : i32 = top;
+    top = (x_292 - 1);
+    let x_295 : i32 = stack[x_292];
+    l_1 = x_295;
+    let x_296 : i32 = l_1;
+    param_4 = x_296;
+    let x_297 : i32 = h_1;
+    param_5 = x_297;
+    let x_298 : i32 = performPartition_i1_i1_(&(param_4), &(param_5));
+    p = x_298;
+    let x_299 : i32 = p;
+    let x_301 : i32 = l_1;
+    if (((x_299 - 1) > x_301)) {
+      let x_305 : i32 = top;
+      let x_306 : i32 = (x_305 + 1);
+      top = x_306;
+      let x_307 : i32 = l_1;
+      stack[x_306] = x_307;
+      let x_309 : i32 = top;
+      let x_310 : i32 = (x_309 + 1);
+      top = x_310;
+      let x_311 : i32 = p;
+      stack[x_310] = (x_311 - 1);
+    }
+    let x_314 : i32 = p;
+    let x_316 : i32 = h_1;
+    if (((x_314 + 1) < x_316)) {
+      let x_320 : i32 = top;
+      let x_321 : i32 = (x_320 + 1);
+      top = x_321;
+      let x_322 : i32 = p;
+      stack[x_321] = (x_322 + 1);
+      let x_325 : i32 = top;
+      let x_326 : i32 = (x_325 + 1);
+      top = x_326;
+      let x_327 : i32 = h_1;
+      stack[x_326] = x_327;
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_2 : i32;
+  var uv : vec2<f32>;
+  var color : vec3<f32>;
+  i_2 = 0;
+  loop {
+    let x_85 : i32 = i_2;
+    if ((x_85 < 10)) {
+    } else {
+      break;
+    }
+    let x_88 : i32 = i_2;
+    let x_89 : i32 = i_2;
+    obj.numbers[x_88] = (10 - x_89);
+    let x_92 : i32 = i_2;
+    let x_93 : i32 = i_2;
+    let x_95 : i32 = obj.numbers[x_93];
+    let x_96 : i32 = i_2;
+    let x_98 : i32 = obj.numbers[x_96];
+    obj.numbers[x_92] = (x_95 * x_98);
+
+    continuing {
+      let x_101 : i32 = i_2;
+      i_2 = (x_101 + 1);
+    }
+  }
+  quicksort_();
+  let x_104 : vec4<f32> = gl_FragCoord;
+  let x_107 : vec2<f32> = x_32.resolution;
+  uv = (vec2<f32>(x_104.x, x_104.y) / x_107);
+  color = vec3<f32>(1.0, 2.0, 3.0);
+  let x_110 : i32 = obj.numbers[0];
+  let x_113 : f32 = color.x;
+  color.x = (x_113 + f32(x_110));
+  let x_117 : f32 = uv.x;
+  if ((x_117 > 0.25)) {
+    let x_122 : i32 = obj.numbers[1];
+    let x_125 : f32 = color.x;
+    color.x = (x_125 + f32(x_122));
+  }
+  let x_129 : f32 = uv.x;
+  if ((x_129 > 0.5)) {
+    let x_134 : i32 = obj.numbers[2];
+    let x_137 : f32 = color.y;
+    color.y = (x_137 + f32(x_134));
+  }
+  let x_141 : f32 = uv.x;
+  if ((x_141 > 0.75)) {
+    let x_146 : i32 = obj.numbers[3];
+    let x_149 : f32 = color.z;
+    color.z = (x_149 + f32(x_146));
+  }
+  let x_153 : i32 = obj.numbers[4];
+  let x_156 : f32 = color.y;
+  color.y = (x_156 + f32(x_153));
+  let x_160 : f32 = uv.y;
+  if ((x_160 > 0.25)) {
+    let x_165 : i32 = obj.numbers[5];
+    let x_168 : f32 = color.x;
+    color.x = (x_168 + f32(x_165));
+  }
+  let x_172 : f32 = uv.y;
+  if ((x_172 > 0.5)) {
+    let x_177 : i32 = obj.numbers[6];
+    let x_180 : f32 = color.y;
+    color.y = (x_180 + f32(x_177));
+  }
+  let x_184 : f32 = uv.y;
+  if ((x_184 > 0.75)) {
+    let x_189 : i32 = obj.numbers[7];
+    let x_192 : f32 = color.z;
+    color.z = (x_192 + f32(x_189));
+  }
+  let x_196 : i32 = obj.numbers[8];
+  let x_199 : f32 = color.z;
+  color.z = (x_199 + f32(x_196));
+  let x_203 : f32 = uv.x;
+  let x_205 : f32 = uv.y;
+  if ((abs((x_203 - x_205)) < 0.25)) {
+    let x_212 : i32 = obj.numbers[9];
+    let x_215 : f32 = color.x;
+    color.x = (x_215 + f32(x_212));
+  }
+  let x_218 : vec3<f32> = color;
+  let x_219 : vec3<f32> = normalize(x_218);
+  x_GLF_color = vec4<f32>(x_219.x, x_219.y, x_219.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-dontinline/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-dontinline/0-opt.wgsl
new file mode 100644
index 0000000..df70a1d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-dontinline/0-opt.wgsl
@@ -0,0 +1,256 @@
+struct QuicksortObject {
+  numbers : array<i32, 10>;
+};
+
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> obj : QuicksortObject;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_32 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn swap_i1_i1_(i : ptr<function, i32>, j : ptr<function, i32>) {
+  var temp : i32;
+  let x_225 : i32 = *(i);
+  let x_227 : i32 = obj.numbers[x_225];
+  temp = x_227;
+  let x_228 : i32 = *(i);
+  let x_229 : i32 = *(j);
+  let x_231 : i32 = obj.numbers[x_229];
+  obj.numbers[x_228] = x_231;
+  let x_233 : i32 = *(j);
+  let x_234 : i32 = temp;
+  obj.numbers[x_233] = x_234;
+  return;
+}
+
+fn performPartition_i1_i1_(l : ptr<function, i32>, h : ptr<function, i32>) -> i32 {
+  var pivot : i32;
+  var i_1 : i32;
+  var j_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  var param_3 : i32;
+  let x_237 : i32 = *(h);
+  let x_239 : i32 = obj.numbers[x_237];
+  pivot = x_239;
+  let x_240 : i32 = *(l);
+  i_1 = (x_240 - 1);
+  let x_242 : i32 = *(l);
+  j_1 = x_242;
+  loop {
+    let x_247 : i32 = j_1;
+    let x_248 : i32 = *(h);
+    if ((x_247 <= (x_248 - 1))) {
+    } else {
+      break;
+    }
+    let x_252 : i32 = j_1;
+    let x_254 : i32 = obj.numbers[x_252];
+    let x_255 : i32 = pivot;
+    if ((x_254 <= x_255)) {
+      let x_259 : i32 = i_1;
+      i_1 = (x_259 + 1);
+      let x_261 : i32 = i_1;
+      param = x_261;
+      let x_262 : i32 = j_1;
+      param_1 = x_262;
+      swap_i1_i1_(&(param), &(param_1));
+    }
+
+    continuing {
+      let x_264 : i32 = j_1;
+      j_1 = (x_264 + 1);
+    }
+  }
+  let x_266 : i32 = i_1;
+  i_1 = (x_266 + 1);
+  let x_268 : i32 = i_1;
+  param_2 = x_268;
+  let x_269 : i32 = *(h);
+  param_3 = x_269;
+  swap_i1_i1_(&(param_2), &(param_3));
+  let x_271 : i32 = i_1;
+  return x_271;
+}
+
+fn quicksort_() {
+  var l_1 : i32;
+  var h_1 : i32;
+  var top : i32;
+  var stack : array<i32, 10>;
+  var p : i32;
+  var param_4 : i32;
+  var param_5 : i32;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  let x_273 : i32 = top;
+  let x_274 : i32 = (x_273 + 1);
+  top = x_274;
+  let x_275 : i32 = l_1;
+  stack[x_274] = x_275;
+  let x_277 : i32 = top;
+  let x_278 : i32 = (x_277 + 1);
+  top = x_278;
+  let x_279 : i32 = h_1;
+  stack[x_278] = x_279;
+  loop {
+    let x_285 : i32 = top;
+    if ((x_285 >= 0)) {
+    } else {
+      break;
+    }
+    let x_288 : i32 = top;
+    top = (x_288 - 1);
+    let x_291 : i32 = stack[x_288];
+    h_1 = x_291;
+    let x_292 : i32 = top;
+    top = (x_292 - 1);
+    let x_295 : i32 = stack[x_292];
+    l_1 = x_295;
+    let x_296 : i32 = l_1;
+    param_4 = x_296;
+    let x_297 : i32 = h_1;
+    param_5 = x_297;
+    let x_298 : i32 = performPartition_i1_i1_(&(param_4), &(param_5));
+    p = x_298;
+    let x_299 : i32 = p;
+    let x_301 : i32 = l_1;
+    if (((x_299 - 1) > x_301)) {
+      let x_305 : i32 = top;
+      let x_306 : i32 = (x_305 + 1);
+      top = x_306;
+      let x_307 : i32 = l_1;
+      stack[x_306] = x_307;
+      let x_309 : i32 = top;
+      let x_310 : i32 = (x_309 + 1);
+      top = x_310;
+      let x_311 : i32 = p;
+      stack[x_310] = (x_311 - 1);
+    }
+    let x_314 : i32 = p;
+    let x_316 : i32 = h_1;
+    if (((x_314 + 1) < x_316)) {
+      let x_320 : i32 = top;
+      let x_321 : i32 = (x_320 + 1);
+      top = x_321;
+      let x_322 : i32 = p;
+      stack[x_321] = (x_322 + 1);
+      let x_325 : i32 = top;
+      let x_326 : i32 = (x_325 + 1);
+      top = x_326;
+      let x_327 : i32 = h_1;
+      stack[x_326] = x_327;
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_2 : i32;
+  var uv : vec2<f32>;
+  var color : vec3<f32>;
+  i_2 = 0;
+  loop {
+    let x_85 : i32 = i_2;
+    if ((x_85 < 10)) {
+    } else {
+      break;
+    }
+    let x_88 : i32 = i_2;
+    let x_89 : i32 = i_2;
+    obj.numbers[x_88] = (10 - x_89);
+    let x_92 : i32 = i_2;
+    let x_93 : i32 = i_2;
+    let x_95 : i32 = obj.numbers[x_93];
+    let x_96 : i32 = i_2;
+    let x_98 : i32 = obj.numbers[x_96];
+    obj.numbers[x_92] = (x_95 * x_98);
+
+    continuing {
+      let x_101 : i32 = i_2;
+      i_2 = (x_101 + 1);
+    }
+  }
+  quicksort_();
+  let x_104 : vec4<f32> = gl_FragCoord;
+  let x_107 : vec2<f32> = x_32.resolution;
+  uv = (vec2<f32>(x_104.x, x_104.y) / x_107);
+  color = vec3<f32>(1.0, 2.0, 3.0);
+  let x_110 : i32 = obj.numbers[0];
+  let x_113 : f32 = color.x;
+  color.x = (x_113 + f32(x_110));
+  let x_117 : f32 = uv.x;
+  if ((x_117 > 0.25)) {
+    let x_122 : i32 = obj.numbers[1];
+    let x_125 : f32 = color.x;
+    color.x = (x_125 + f32(x_122));
+  }
+  let x_129 : f32 = uv.x;
+  if ((x_129 > 0.5)) {
+    let x_134 : i32 = obj.numbers[2];
+    let x_137 : f32 = color.y;
+    color.y = (x_137 + f32(x_134));
+  }
+  let x_141 : f32 = uv.x;
+  if ((x_141 > 0.75)) {
+    let x_146 : i32 = obj.numbers[3];
+    let x_149 : f32 = color.z;
+    color.z = (x_149 + f32(x_146));
+  }
+  let x_153 : i32 = obj.numbers[4];
+  let x_156 : f32 = color.y;
+  color.y = (x_156 + f32(x_153));
+  let x_160 : f32 = uv.y;
+  if ((x_160 > 0.25)) {
+    let x_165 : i32 = obj.numbers[5];
+    let x_168 : f32 = color.x;
+    color.x = (x_168 + f32(x_165));
+  }
+  let x_172 : f32 = uv.y;
+  if ((x_172 > 0.5)) {
+    let x_177 : i32 = obj.numbers[6];
+    let x_180 : f32 = color.y;
+    color.y = (x_180 + f32(x_177));
+  }
+  let x_184 : f32 = uv.y;
+  if ((x_184 > 0.75)) {
+    let x_189 : i32 = obj.numbers[7];
+    let x_192 : f32 = color.z;
+    color.z = (x_192 + f32(x_189));
+  }
+  let x_196 : i32 = obj.numbers[8];
+  let x_199 : f32 = color.z;
+  color.z = (x_199 + f32(x_196));
+  let x_203 : f32 = uv.x;
+  let x_205 : f32 = uv.y;
+  if ((abs((x_203 - x_205)) < 0.25)) {
+    let x_212 : i32 = obj.numbers[9];
+    let x_215 : f32 = color.x;
+    color.x = (x_215 + f32(x_212));
+  }
+  let x_218 : vec3<f32> = color;
+  let x_219 : vec3<f32> = normalize(x_218);
+  x_GLF_color = vec4<f32>(x_219.x, x_219.y, x_219.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
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
new file mode 100644
index 0000000..18cfa06
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-dontinline/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,214 @@
+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;
+  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;
+  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;
+  {
+    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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-dontinline/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-dontinline/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..7cd8892
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-dontinline/0-opt.wgsl.expected.msl
@@ -0,0 +1,256 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct QuicksortObject {
+  tint_array_wrapper numbers;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void swap_i1_i1_(thread int* const i, thread int* const j, thread QuicksortObject* const tint_symbol_5) {
+  int temp = 0;
+  int const x_225 = *(i);
+  int const x_227 = (*(tint_symbol_5)).numbers.arr[x_225];
+  temp = x_227;
+  int const x_228 = *(i);
+  int const x_229 = *(j);
+  int const x_231 = (*(tint_symbol_5)).numbers.arr[x_229];
+  (*(tint_symbol_5)).numbers.arr[x_228] = x_231;
+  int const x_233 = *(j);
+  int const x_234 = temp;
+  (*(tint_symbol_5)).numbers.arr[x_233] = x_234;
+  return;
+}
+
+int performPartition_i1_i1_(thread int* const l, thread int* const h, thread QuicksortObject* const tint_symbol_6) {
+  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;
+  int const x_237 = *(h);
+  int const x_239 = (*(tint_symbol_6)).numbers.arr[x_237];
+  pivot = x_239;
+  int const x_240 = *(l);
+  i_1 = (x_240 - 1);
+  int const x_242 = *(l);
+  j_1 = x_242;
+  while (true) {
+    int const x_247 = j_1;
+    int const x_248 = *(h);
+    if ((x_247 <= (x_248 - 1))) {
+    } else {
+      break;
+    }
+    int const x_252 = j_1;
+    int const x_254 = (*(tint_symbol_6)).numbers.arr[x_252];
+    int const x_255 = pivot;
+    if ((x_254 <= x_255)) {
+      int const x_259 = i_1;
+      i_1 = (x_259 + 1);
+      int const x_261 = i_1;
+      param = x_261;
+      int const x_262 = j_1;
+      param_1 = x_262;
+      swap_i1_i1_(&(param), &(param_1), tint_symbol_6);
+    }
+    {
+      int const x_264 = j_1;
+      j_1 = (x_264 + 1);
+    }
+  }
+  int const x_266 = i_1;
+  i_1 = (x_266 + 1);
+  int const x_268 = i_1;
+  param_2 = x_268;
+  int const x_269 = *(h);
+  param_3 = x_269;
+  swap_i1_i1_(&(param_2), &(param_3), tint_symbol_6);
+  int const x_271 = i_1;
+  return x_271;
+}
+
+void quicksort_(thread QuicksortObject* const tint_symbol_7) {
+  int l_1 = 0;
+  int h_1 = 0;
+  int top = 0;
+  tint_array_wrapper stack = {};
+  int p = 0;
+  int param_4 = 0;
+  int param_5 = 0;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  int const x_273 = top;
+  int const x_274 = (x_273 + 1);
+  top = x_274;
+  int const x_275 = l_1;
+  stack.arr[x_274] = x_275;
+  int const x_277 = top;
+  int const x_278 = (x_277 + 1);
+  top = x_278;
+  int const x_279 = h_1;
+  stack.arr[x_278] = x_279;
+  while (true) {
+    int const x_285 = top;
+    if ((x_285 >= 0)) {
+    } else {
+      break;
+    }
+    int const x_288 = top;
+    top = (x_288 - 1);
+    int const x_291 = stack.arr[x_288];
+    h_1 = x_291;
+    int const x_292 = top;
+    top = (x_292 - 1);
+    int const x_295 = stack.arr[x_292];
+    l_1 = x_295;
+    int const x_296 = l_1;
+    param_4 = x_296;
+    int const x_297 = h_1;
+    param_5 = x_297;
+    int const x_298 = performPartition_i1_i1_(&(param_4), &(param_5), tint_symbol_7);
+    p = x_298;
+    int const x_299 = p;
+    int const x_301 = l_1;
+    if (((x_299 - 1) > x_301)) {
+      int const x_305 = top;
+      int const x_306 = (x_305 + 1);
+      top = x_306;
+      int const x_307 = l_1;
+      stack.arr[x_306] = x_307;
+      int const x_309 = top;
+      int const x_310 = (x_309 + 1);
+      top = x_310;
+      int const x_311 = p;
+      stack.arr[x_310] = (x_311 - 1);
+    }
+    int const x_314 = p;
+    int const x_316 = h_1;
+    if (((x_314 + 1) < x_316)) {
+      int const x_320 = top;
+      int const x_321 = (x_320 + 1);
+      top = x_321;
+      int const x_322 = p;
+      stack.arr[x_321] = (x_322 + 1);
+      int const x_325 = top;
+      int const x_326 = (x_325 + 1);
+      top = x_326;
+      int const x_327 = h_1;
+      stack.arr[x_326] = x_327;
+    }
+  }
+  return;
+}
+
+void main_1(constant buf0& x_32, thread QuicksortObject* const tint_symbol_8, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10) {
+  int i_2 = 0;
+  float2 uv = 0.0f;
+  float3 color = 0.0f;
+  i_2 = 0;
+  while (true) {
+    int const x_85 = i_2;
+    if ((x_85 < 10)) {
+    } else {
+      break;
+    }
+    int const x_88 = i_2;
+    int const x_89 = i_2;
+    (*(tint_symbol_8)).numbers.arr[x_88] = (10 - x_89);
+    int const x_92 = i_2;
+    int const x_93 = i_2;
+    int const x_95 = (*(tint_symbol_8)).numbers.arr[x_93];
+    int const x_96 = i_2;
+    int const x_98 = (*(tint_symbol_8)).numbers.arr[x_96];
+    (*(tint_symbol_8)).numbers.arr[x_92] = (x_95 * x_98);
+    {
+      int const x_101 = i_2;
+      i_2 = (x_101 + 1);
+    }
+  }
+  quicksort_(tint_symbol_8);
+  float4 const x_104 = *(tint_symbol_9);
+  float2 const x_107 = x_32.resolution;
+  uv = (float2(x_104.x, x_104.y) / x_107);
+  color = float3(1.0f, 2.0f, 3.0f);
+  int const x_110 = (*(tint_symbol_8)).numbers.arr[0];
+  float const x_113 = color.x;
+  color.x = (x_113 + float(x_110));
+  float const x_117 = uv.x;
+  if ((x_117 > 0.25f)) {
+    int const x_122 = (*(tint_symbol_8)).numbers.arr[1];
+    float const x_125 = color.x;
+    color.x = (x_125 + float(x_122));
+  }
+  float const x_129 = uv.x;
+  if ((x_129 > 0.5f)) {
+    int const x_134 = (*(tint_symbol_8)).numbers.arr[2];
+    float const x_137 = color.y;
+    color.y = (x_137 + float(x_134));
+  }
+  float const x_141 = uv.x;
+  if ((x_141 > 0.75f)) {
+    int const x_146 = (*(tint_symbol_8)).numbers.arr[3];
+    float const x_149 = color.z;
+    color.z = (x_149 + float(x_146));
+  }
+  int const x_153 = (*(tint_symbol_8)).numbers.arr[4];
+  float const x_156 = color.y;
+  color.y = (x_156 + float(x_153));
+  float const x_160 = uv.y;
+  if ((x_160 > 0.25f)) {
+    int const x_165 = (*(tint_symbol_8)).numbers.arr[5];
+    float const x_168 = color.x;
+    color.x = (x_168 + float(x_165));
+  }
+  float const x_172 = uv.y;
+  if ((x_172 > 0.5f)) {
+    int const x_177 = (*(tint_symbol_8)).numbers.arr[6];
+    float const x_180 = color.y;
+    color.y = (x_180 + float(x_177));
+  }
+  float const x_184 = uv.y;
+  if ((x_184 > 0.75f)) {
+    int const x_189 = (*(tint_symbol_8)).numbers.arr[7];
+    float const x_192 = color.z;
+    color.z = (x_192 + float(x_189));
+  }
+  int const x_196 = (*(tint_symbol_8)).numbers.arr[8];
+  float const x_199 = color.z;
+  color.z = (x_199 + float(x_196));
+  float const x_203 = uv.x;
+  float const x_205 = uv.y;
+  if ((fabs((x_203 - x_205)) < 0.25f)) {
+    int const x_212 = (*(tint_symbol_8)).numbers.arr[9];
+    float const x_215 = color.x;
+    color.x = (x_215 + float(x_212));
+  }
+  float3 const x_218 = color;
+  float3 const x_219 = normalize(x_218);
+  *(tint_symbol_10) = float4(x_219.x, x_219.y, x_219.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_32 [[buffer(0)]]) {
+  thread float4 tint_symbol_11 = 0.0f;
+  thread QuicksortObject tint_symbol_12 = {};
+  thread float4 tint_symbol_13 = 0.0f;
+  tint_symbol_11 = gl_FragCoord_param;
+  main_1(x_32, &(tint_symbol_12), &(tint_symbol_11), &(tint_symbol_13));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_13};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-dontinline/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-dontinline/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..dfd34c5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-dontinline/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,541 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 374
+; Schema: 0
+               OpCapability Shader
+        %343 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %QuicksortObject "QuicksortObject"
+               OpMemberName %QuicksortObject 0 "numbers"
+               OpName %obj "obj"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_32 "x_32"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %swap_i1_i1_ "swap_i1_i1_"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %temp "temp"
+               OpName %performPartition_i1_i1_ "performPartition_i1_i1_"
+               OpName %l "l"
+               OpName %h "h"
+               OpName %pivot "pivot"
+               OpName %i_1 "i_1"
+               OpName %j_1 "j_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %quicksort_ "quicksort_"
+               OpName %l_1 "l_1"
+               OpName %h_1 "h_1"
+               OpName %top "top"
+               OpName %stack "stack"
+               OpName %p "p"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpName %main_1 "main_1"
+               OpName %i_2 "i_2"
+               OpName %uv "uv"
+               OpName %color "color"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpMemberDecorate %QuicksortObject 0 Offset 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_32 NonWritable
+               OpDecorate %x_32 DescriptorSet 0
+               OpDecorate %x_32 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%QuicksortObject = OpTypeStruct %_arr_int_uint_10
+%_ptr_Private_QuicksortObject = OpTypePointer Private %QuicksortObject
+          %8 = OpConstantNull %QuicksortObject
+        %obj = OpVariable %_ptr_Private_QuicksortObject Private %8
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %13 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %13
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_32 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %13
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %13
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+         %31 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_int = OpTypePointer Private %int
+         %49 = OpTypeFunction %int %_ptr_Function_int %_ptr_Function_int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+        %109 = OpTypeFunction %void
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+        %117 = OpConstantNull %_arr_int_uint_10
+      %int_0 = OpConstant %int 0
+      %int_9 = OpConstant %int 9
+     %int_n1 = OpConstant %int -1
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+        %189 = OpConstantNull %v2float
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+        %193 = OpConstantNull %v3float
+     %int_10 = OpConstant %int 10
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+        %231 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+%_ptr_Function_float = OpTypePointer Function %float
+ %float_0_25 = OpConstant %float 0.25
+  %float_0_5 = OpConstant %float 0.5
+      %int_2 = OpConstant %int 2
+     %uint_1 = OpConstant %uint 1
+ %float_0_75 = OpConstant %float 0.75
+      %int_3 = OpConstant %int 3
+     %uint_2 = OpConstant %uint 2
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+   %main_out = OpTypeStruct %v4float
+        %361 = OpTypeFunction %void %main_out
+%swap_i1_i1_ = OpFunction %void None %23
+          %i = OpFunctionParameter %_ptr_Function_int
+          %j = OpFunctionParameter %_ptr_Function_int
+         %29 = OpLabel
+       %temp = OpVariable %_ptr_Function_int Function %31
+         %33 = OpLoad %int %i
+         %36 = OpAccessChain %_ptr_Private_int %obj %uint_0 %33
+         %37 = OpLoad %int %36
+               OpStore %temp %37
+         %39 = OpLoad %int %i
+         %41 = OpLoad %int %j
+         %42 = OpAccessChain %_ptr_Private_int %obj %uint_0 %41
+         %43 = OpLoad %int %42
+         %44 = OpAccessChain %_ptr_Private_int %obj %uint_0 %39
+               OpStore %44 %43
+         %46 = OpLoad %int %j
+         %47 = OpLoad %int %temp
+         %48 = OpAccessChain %_ptr_Private_int %obj %uint_0 %46
+               OpStore %48 %47
+               OpReturn
+               OpFunctionEnd
+%performPartition_i1_i1_ = OpFunction %int None %49
+          %l = OpFunctionParameter %_ptr_Function_int
+          %h = OpFunctionParameter %_ptr_Function_int
+         %53 = OpLabel
+      %pivot = OpVariable %_ptr_Function_int Function %31
+        %i_1 = OpVariable %_ptr_Function_int Function %31
+        %j_1 = OpVariable %_ptr_Function_int Function %31
+      %param = OpVariable %_ptr_Function_int Function %31
+    %param_1 = OpVariable %_ptr_Function_int Function %31
+    %param_2 = OpVariable %_ptr_Function_int Function %31
+    %param_3 = OpVariable %_ptr_Function_int Function %31
+         %62 = OpLoad %int %h
+         %63 = OpAccessChain %_ptr_Private_int %obj %uint_0 %62
+         %64 = OpLoad %int %63
+               OpStore %pivot %64
+         %66 = OpLoad %int %l
+         %68 = OpISub %int %66 %int_1
+               OpStore %i_1 %68
+         %70 = OpLoad %int %l
+               OpStore %j_1 %70
+               OpBranch %71
+         %71 = OpLabel
+               OpLoopMerge %72 %73 None
+               OpBranch %74
+         %74 = OpLabel
+         %75 = OpLoad %int %j_1
+         %77 = OpLoad %int %h
+         %78 = OpISub %int %77 %int_1
+         %79 = OpSLessThanEqual %bool %75 %78
+               OpSelectionMerge %81 None
+               OpBranchConditional %79 %82 %83
+         %82 = OpLabel
+               OpBranch %81
+         %83 = OpLabel
+               OpBranch %72
+         %81 = OpLabel
+         %84 = OpLoad %int %j_1
+         %85 = OpAccessChain %_ptr_Private_int %obj %uint_0 %84
+         %86 = OpLoad %int %85
+         %87 = OpLoad %int %pivot
+         %88 = OpSLessThanEqual %bool %86 %87
+               OpSelectionMerge %89 None
+               OpBranchConditional %88 %90 %89
+         %90 = OpLabel
+         %91 = OpLoad %int %i_1
+         %92 = OpIAdd %int %91 %int_1
+               OpStore %i_1 %92
+         %93 = OpLoad %int %i_1
+               OpStore %param %93
+         %94 = OpLoad %int %j_1
+               OpStore %param_1 %94
+         %95 = OpFunctionCall %void %swap_i1_i1_ %param %param_1
+               OpBranch %89
+         %89 = OpLabel
+               OpBranch %73
+         %73 = OpLabel
+         %98 = OpLoad %int %j_1
+         %99 = OpIAdd %int %98 %int_1
+               OpStore %j_1 %99
+               OpBranch %71
+         %72 = OpLabel
+        %100 = OpLoad %int %i_1
+        %101 = OpIAdd %int %100 %int_1
+               OpStore %i_1 %101
+        %102 = OpLoad %int %i_1
+               OpStore %param_2 %102
+        %104 = OpLoad %int %h
+               OpStore %param_3 %104
+        %105 = OpFunctionCall %void %swap_i1_i1_ %param_2 %param_3
+        %108 = OpLoad %int %i_1
+               OpReturnValue %108
+               OpFunctionEnd
+ %quicksort_ = OpFunction %void None %109
+        %111 = OpLabel
+        %l_1 = OpVariable %_ptr_Function_int Function %31
+        %h_1 = OpVariable %_ptr_Function_int Function %31
+        %top = OpVariable %_ptr_Function_int Function %31
+      %stack = OpVariable %_ptr_Function__arr_int_uint_10 Function %117
+          %p = OpVariable %_ptr_Function_int Function %31
+    %param_4 = OpVariable %_ptr_Function_int Function %31
+    %param_5 = OpVariable %_ptr_Function_int Function %31
+               OpStore %l_1 %int_0
+               OpStore %h_1 %int_9
+               OpStore %top %int_n1
+        %124 = OpLoad %int %top
+        %125 = OpIAdd %int %124 %int_1
+               OpStore %top %125
+        %126 = OpLoad %int %l_1
+        %127 = OpAccessChain %_ptr_Function_int %stack %125
+               OpStore %127 %126
+        %128 = OpLoad %int %top
+        %129 = OpIAdd %int %128 %int_1
+               OpStore %top %129
+        %130 = OpLoad %int %h_1
+        %131 = OpAccessChain %_ptr_Function_int %stack %129
+               OpStore %131 %130
+               OpBranch %132
+        %132 = OpLabel
+               OpLoopMerge %133 %134 None
+               OpBranch %135
+        %135 = OpLabel
+        %136 = OpLoad %int %top
+        %137 = OpSGreaterThanEqual %bool %136 %int_0
+               OpSelectionMerge %138 None
+               OpBranchConditional %137 %139 %140
+        %139 = OpLabel
+               OpBranch %138
+        %140 = OpLabel
+               OpBranch %133
+        %138 = OpLabel
+        %141 = OpLoad %int %top
+        %142 = OpISub %int %141 %int_1
+               OpStore %top %142
+        %143 = OpAccessChain %_ptr_Function_int %stack %141
+        %144 = OpLoad %int %143
+               OpStore %h_1 %144
+        %145 = OpLoad %int %top
+        %146 = OpISub %int %145 %int_1
+               OpStore %top %146
+        %147 = OpAccessChain %_ptr_Function_int %stack %145
+        %148 = OpLoad %int %147
+               OpStore %l_1 %148
+        %149 = OpLoad %int %l_1
+               OpStore %param_4 %149
+        %150 = OpLoad %int %h_1
+               OpStore %param_5 %150
+        %151 = OpFunctionCall %int %performPartition_i1_i1_ %param_4 %param_5
+               OpStore %p %151
+        %154 = OpLoad %int %p
+        %155 = OpLoad %int %l_1
+        %156 = OpISub %int %154 %int_1
+        %157 = OpSGreaterThan %bool %156 %155
+               OpSelectionMerge %158 None
+               OpBranchConditional %157 %159 %158
+        %159 = OpLabel
+        %160 = OpLoad %int %top
+        %161 = OpIAdd %int %160 %int_1
+               OpStore %top %161
+        %162 = OpLoad %int %l_1
+        %163 = OpAccessChain %_ptr_Function_int %stack %161
+               OpStore %163 %162
+        %164 = OpLoad %int %top
+        %165 = OpIAdd %int %164 %int_1
+               OpStore %top %165
+        %166 = OpLoad %int %p
+        %167 = OpAccessChain %_ptr_Function_int %stack %165
+        %168 = OpISub %int %166 %int_1
+               OpStore %167 %168
+               OpBranch %158
+        %158 = OpLabel
+        %169 = OpLoad %int %p
+        %170 = OpLoad %int %h_1
+        %171 = OpIAdd %int %169 %int_1
+        %172 = OpSLessThan %bool %171 %170
+               OpSelectionMerge %173 None
+               OpBranchConditional %172 %174 %173
+        %174 = OpLabel
+        %175 = OpLoad %int %top
+        %176 = OpIAdd %int %175 %int_1
+               OpStore %top %176
+        %177 = OpLoad %int %p
+        %178 = OpAccessChain %_ptr_Function_int %stack %176
+        %179 = OpIAdd %int %177 %int_1
+               OpStore %178 %179
+        %180 = OpLoad %int %top
+        %181 = OpIAdd %int %180 %int_1
+               OpStore %top %181
+        %182 = OpLoad %int %h_1
+        %183 = OpAccessChain %_ptr_Function_int %stack %181
+               OpStore %183 %182
+               OpBranch %173
+        %173 = OpLabel
+               OpBranch %134
+        %134 = OpLabel
+               OpBranch %132
+        %133 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %109
+        %185 = OpLabel
+        %i_2 = OpVariable %_ptr_Function_int Function %31
+         %uv = OpVariable %_ptr_Function_v2float Function %189
+      %color = OpVariable %_ptr_Function_v3float Function %193
+               OpStore %i_2 %int_0
+               OpBranch %194
+        %194 = OpLabel
+               OpLoopMerge %195 %196 None
+               OpBranch %197
+        %197 = OpLabel
+        %198 = OpLoad %int %i_2
+        %200 = OpSLessThan %bool %198 %int_10
+               OpSelectionMerge %201 None
+               OpBranchConditional %200 %202 %203
+        %202 = OpLabel
+               OpBranch %201
+        %203 = OpLabel
+               OpBranch %195
+        %201 = OpLabel
+        %204 = OpLoad %int %i_2
+        %205 = OpLoad %int %i_2
+        %206 = OpAccessChain %_ptr_Private_int %obj %uint_0 %204
+        %207 = OpISub %int %int_10 %205
+               OpStore %206 %207
+        %208 = OpLoad %int %i_2
+        %209 = OpLoad %int %i_2
+        %210 = OpAccessChain %_ptr_Private_int %obj %uint_0 %209
+        %211 = OpLoad %int %210
+        %212 = OpLoad %int %i_2
+        %213 = OpAccessChain %_ptr_Private_int %obj %uint_0 %212
+        %214 = OpLoad %int %213
+        %215 = OpAccessChain %_ptr_Private_int %obj %uint_0 %208
+        %216 = OpIMul %int %211 %214
+               OpStore %215 %216
+               OpBranch %196
+        %196 = OpLabel
+        %217 = OpLoad %int %i_2
+        %218 = OpIAdd %int %217 %int_1
+               OpStore %i_2 %218
+               OpBranch %194
+        %195 = OpLabel
+        %219 = OpFunctionCall %void %quicksort_
+        %220 = OpLoad %v4float %gl_FragCoord
+        %222 = OpAccessChain %_ptr_Uniform_v2float %x_32 %uint_0
+        %223 = OpLoad %v2float %222
+        %224 = OpCompositeExtract %float %220 0
+        %225 = OpCompositeExtract %float %220 1
+        %226 = OpCompositeConstruct %v2float %224 %225
+        %227 = OpFDiv %v2float %226 %223
+               OpStore %uv %227
+               OpStore %color %231
+        %232 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_0
+        %233 = OpLoad %int %232
+        %235 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %236 = OpLoad %float %235
+        %237 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %238 = OpConvertSToF %float %233
+        %239 = OpFAdd %float %236 %238
+               OpStore %237 %239
+        %240 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %241 = OpLoad %float %240
+        %243 = OpFOrdGreaterThan %bool %241 %float_0_25
+               OpSelectionMerge %244 None
+               OpBranchConditional %243 %245 %244
+        %245 = OpLabel
+        %246 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_1
+        %247 = OpLoad %int %246
+        %248 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %249 = OpLoad %float %248
+        %250 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %251 = OpConvertSToF %float %247
+        %252 = OpFAdd %float %249 %251
+               OpStore %250 %252
+               OpBranch %244
+        %244 = OpLabel
+        %253 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %254 = OpLoad %float %253
+        %256 = OpFOrdGreaterThan %bool %254 %float_0_5
+               OpSelectionMerge %257 None
+               OpBranchConditional %256 %258 %257
+        %258 = OpLabel
+        %260 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_2
+        %261 = OpLoad %int %260
+        %263 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %264 = OpLoad %float %263
+        %265 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %266 = OpConvertSToF %float %261
+        %267 = OpFAdd %float %264 %266
+               OpStore %265 %267
+               OpBranch %257
+        %257 = OpLabel
+        %268 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %269 = OpLoad %float %268
+        %271 = OpFOrdGreaterThan %bool %269 %float_0_75
+               OpSelectionMerge %272 None
+               OpBranchConditional %271 %273 %272
+        %273 = OpLabel
+        %275 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_3
+        %276 = OpLoad %int %275
+        %278 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %279 = OpLoad %float %278
+        %280 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %281 = OpConvertSToF %float %276
+        %282 = OpFAdd %float %279 %281
+               OpStore %280 %282
+               OpBranch %272
+        %272 = OpLabel
+        %284 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_4
+        %285 = OpLoad %int %284
+        %286 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %287 = OpLoad %float %286
+        %288 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %289 = OpConvertSToF %float %285
+        %290 = OpFAdd %float %287 %289
+               OpStore %288 %290
+        %291 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %292 = OpLoad %float %291
+        %293 = OpFOrdGreaterThan %bool %292 %float_0_25
+               OpSelectionMerge %294 None
+               OpBranchConditional %293 %295 %294
+        %295 = OpLabel
+        %297 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_5
+        %298 = OpLoad %int %297
+        %299 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %300 = OpLoad %float %299
+        %301 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %302 = OpConvertSToF %float %298
+        %303 = OpFAdd %float %300 %302
+               OpStore %301 %303
+               OpBranch %294
+        %294 = OpLabel
+        %304 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %305 = OpLoad %float %304
+        %306 = OpFOrdGreaterThan %bool %305 %float_0_5
+               OpSelectionMerge %307 None
+               OpBranchConditional %306 %308 %307
+        %308 = OpLabel
+        %310 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_6
+        %311 = OpLoad %int %310
+        %312 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %313 = OpLoad %float %312
+        %314 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %315 = OpConvertSToF %float %311
+        %316 = OpFAdd %float %313 %315
+               OpStore %314 %316
+               OpBranch %307
+        %307 = OpLabel
+        %317 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %318 = OpLoad %float %317
+        %319 = OpFOrdGreaterThan %bool %318 %float_0_75
+               OpSelectionMerge %320 None
+               OpBranchConditional %319 %321 %320
+        %321 = OpLabel
+        %323 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_7
+        %324 = OpLoad %int %323
+        %325 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %326 = OpLoad %float %325
+        %327 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %328 = OpConvertSToF %float %324
+        %329 = OpFAdd %float %326 %328
+               OpStore %327 %329
+               OpBranch %320
+        %320 = OpLabel
+        %331 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_8
+        %332 = OpLoad %int %331
+        %333 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %334 = OpLoad %float %333
+        %335 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %336 = OpConvertSToF %float %332
+        %337 = OpFAdd %float %334 %336
+               OpStore %335 %337
+        %338 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %339 = OpLoad %float %338
+        %340 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %341 = OpLoad %float %340
+        %344 = OpFSub %float %339 %341
+        %342 = OpExtInst %float %343 FAbs %344
+        %345 = OpFOrdLessThan %bool %342 %float_0_25
+               OpSelectionMerge %346 None
+               OpBranchConditional %345 %347 %346
+        %347 = OpLabel
+        %348 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_9
+        %349 = OpLoad %int %348
+        %350 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %351 = OpLoad %float %350
+        %352 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %353 = OpConvertSToF %float %349
+        %354 = OpFAdd %float %351 %353
+               OpStore %352 %354
+               OpBranch %346
+        %346 = OpLabel
+        %355 = OpLoad %v3float %color
+        %356 = OpExtInst %v3float %343 Normalize %355
+        %357 = OpCompositeExtract %float %356 0
+        %358 = OpCompositeExtract %float %356 1
+        %359 = OpCompositeExtract %float %356 2
+        %360 = OpCompositeConstruct %v4float %357 %358 %359 %float_1
+               OpStore %x_GLF_color %360
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %361
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %365 = OpLabel
+        %366 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %366
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %109
+        %368 = OpLabel
+        %369 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %369
+        %370 = OpFunctionCall %void %main_1
+        %372 = OpLoad %v4float %x_GLF_color
+        %373 = OpCompositeConstruct %main_out %372
+        %371 = OpFunctionCall %void %tint_symbol_3 %373
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-dontinline/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-dontinline/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..df70a1d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-dontinline/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,256 @@
+struct QuicksortObject {
+  numbers : array<i32, 10>;
+};
+
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> obj : QuicksortObject;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_32 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn swap_i1_i1_(i : ptr<function, i32>, j : ptr<function, i32>) {
+  var temp : i32;
+  let x_225 : i32 = *(i);
+  let x_227 : i32 = obj.numbers[x_225];
+  temp = x_227;
+  let x_228 : i32 = *(i);
+  let x_229 : i32 = *(j);
+  let x_231 : i32 = obj.numbers[x_229];
+  obj.numbers[x_228] = x_231;
+  let x_233 : i32 = *(j);
+  let x_234 : i32 = temp;
+  obj.numbers[x_233] = x_234;
+  return;
+}
+
+fn performPartition_i1_i1_(l : ptr<function, i32>, h : ptr<function, i32>) -> i32 {
+  var pivot : i32;
+  var i_1 : i32;
+  var j_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  var param_3 : i32;
+  let x_237 : i32 = *(h);
+  let x_239 : i32 = obj.numbers[x_237];
+  pivot = x_239;
+  let x_240 : i32 = *(l);
+  i_1 = (x_240 - 1);
+  let x_242 : i32 = *(l);
+  j_1 = x_242;
+  loop {
+    let x_247 : i32 = j_1;
+    let x_248 : i32 = *(h);
+    if ((x_247 <= (x_248 - 1))) {
+    } else {
+      break;
+    }
+    let x_252 : i32 = j_1;
+    let x_254 : i32 = obj.numbers[x_252];
+    let x_255 : i32 = pivot;
+    if ((x_254 <= x_255)) {
+      let x_259 : i32 = i_1;
+      i_1 = (x_259 + 1);
+      let x_261 : i32 = i_1;
+      param = x_261;
+      let x_262 : i32 = j_1;
+      param_1 = x_262;
+      swap_i1_i1_(&(param), &(param_1));
+    }
+
+    continuing {
+      let x_264 : i32 = j_1;
+      j_1 = (x_264 + 1);
+    }
+  }
+  let x_266 : i32 = i_1;
+  i_1 = (x_266 + 1);
+  let x_268 : i32 = i_1;
+  param_2 = x_268;
+  let x_269 : i32 = *(h);
+  param_3 = x_269;
+  swap_i1_i1_(&(param_2), &(param_3));
+  let x_271 : i32 = i_1;
+  return x_271;
+}
+
+fn quicksort_() {
+  var l_1 : i32;
+  var h_1 : i32;
+  var top : i32;
+  var stack : array<i32, 10>;
+  var p : i32;
+  var param_4 : i32;
+  var param_5 : i32;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  let x_273 : i32 = top;
+  let x_274 : i32 = (x_273 + 1);
+  top = x_274;
+  let x_275 : i32 = l_1;
+  stack[x_274] = x_275;
+  let x_277 : i32 = top;
+  let x_278 : i32 = (x_277 + 1);
+  top = x_278;
+  let x_279 : i32 = h_1;
+  stack[x_278] = x_279;
+  loop {
+    let x_285 : i32 = top;
+    if ((x_285 >= 0)) {
+    } else {
+      break;
+    }
+    let x_288 : i32 = top;
+    top = (x_288 - 1);
+    let x_291 : i32 = stack[x_288];
+    h_1 = x_291;
+    let x_292 : i32 = top;
+    top = (x_292 - 1);
+    let x_295 : i32 = stack[x_292];
+    l_1 = x_295;
+    let x_296 : i32 = l_1;
+    param_4 = x_296;
+    let x_297 : i32 = h_1;
+    param_5 = x_297;
+    let x_298 : i32 = performPartition_i1_i1_(&(param_4), &(param_5));
+    p = x_298;
+    let x_299 : i32 = p;
+    let x_301 : i32 = l_1;
+    if (((x_299 - 1) > x_301)) {
+      let x_305 : i32 = top;
+      let x_306 : i32 = (x_305 + 1);
+      top = x_306;
+      let x_307 : i32 = l_1;
+      stack[x_306] = x_307;
+      let x_309 : i32 = top;
+      let x_310 : i32 = (x_309 + 1);
+      top = x_310;
+      let x_311 : i32 = p;
+      stack[x_310] = (x_311 - 1);
+    }
+    let x_314 : i32 = p;
+    let x_316 : i32 = h_1;
+    if (((x_314 + 1) < x_316)) {
+      let x_320 : i32 = top;
+      let x_321 : i32 = (x_320 + 1);
+      top = x_321;
+      let x_322 : i32 = p;
+      stack[x_321] = (x_322 + 1);
+      let x_325 : i32 = top;
+      let x_326 : i32 = (x_325 + 1);
+      top = x_326;
+      let x_327 : i32 = h_1;
+      stack[x_326] = x_327;
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_2 : i32;
+  var uv : vec2<f32>;
+  var color : vec3<f32>;
+  i_2 = 0;
+  loop {
+    let x_85 : i32 = i_2;
+    if ((x_85 < 10)) {
+    } else {
+      break;
+    }
+    let x_88 : i32 = i_2;
+    let x_89 : i32 = i_2;
+    obj.numbers[x_88] = (10 - x_89);
+    let x_92 : i32 = i_2;
+    let x_93 : i32 = i_2;
+    let x_95 : i32 = obj.numbers[x_93];
+    let x_96 : i32 = i_2;
+    let x_98 : i32 = obj.numbers[x_96];
+    obj.numbers[x_92] = (x_95 * x_98);
+
+    continuing {
+      let x_101 : i32 = i_2;
+      i_2 = (x_101 + 1);
+    }
+  }
+  quicksort_();
+  let x_104 : vec4<f32> = gl_FragCoord;
+  let x_107 : vec2<f32> = x_32.resolution;
+  uv = (vec2<f32>(x_104.x, x_104.y) / x_107);
+  color = vec3<f32>(1.0, 2.0, 3.0);
+  let x_110 : i32 = obj.numbers[0];
+  let x_113 : f32 = color.x;
+  color.x = (x_113 + f32(x_110));
+  let x_117 : f32 = uv.x;
+  if ((x_117 > 0.25)) {
+    let x_122 : i32 = obj.numbers[1];
+    let x_125 : f32 = color.x;
+    color.x = (x_125 + f32(x_122));
+  }
+  let x_129 : f32 = uv.x;
+  if ((x_129 > 0.5)) {
+    let x_134 : i32 = obj.numbers[2];
+    let x_137 : f32 = color.y;
+    color.y = (x_137 + f32(x_134));
+  }
+  let x_141 : f32 = uv.x;
+  if ((x_141 > 0.75)) {
+    let x_146 : i32 = obj.numbers[3];
+    let x_149 : f32 = color.z;
+    color.z = (x_149 + f32(x_146));
+  }
+  let x_153 : i32 = obj.numbers[4];
+  let x_156 : f32 = color.y;
+  color.y = (x_156 + f32(x_153));
+  let x_160 : f32 = uv.y;
+  if ((x_160 > 0.25)) {
+    let x_165 : i32 = obj.numbers[5];
+    let x_168 : f32 = color.x;
+    color.x = (x_168 + f32(x_165));
+  }
+  let x_172 : f32 = uv.y;
+  if ((x_172 > 0.5)) {
+    let x_177 : i32 = obj.numbers[6];
+    let x_180 : f32 = color.y;
+    color.y = (x_180 + f32(x_177));
+  }
+  let x_184 : f32 = uv.y;
+  if ((x_184 > 0.75)) {
+    let x_189 : i32 = obj.numbers[7];
+    let x_192 : f32 = color.z;
+    color.z = (x_192 + f32(x_189));
+  }
+  let x_196 : i32 = obj.numbers[8];
+  let x_199 : f32 = color.z;
+  color.z = (x_199 + f32(x_196));
+  let x_203 : f32 = uv.x;
+  let x_205 : f32 = uv.y;
+  if ((abs((x_203 - x_205)) < 0.25)) {
+    let x_212 : i32 = obj.numbers[9];
+    let x_215 : f32 = color.x;
+    color.x = (x_215 + f32(x_212));
+  }
+  let x_218 : vec3<f32> = color;
+  let x_219 : vec3<f32> = normalize(x_218);
+  x_GLF_color = vec4<f32>(x_219.x, x_219.y, x_219.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-mat-func-param/1.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-mat-func-param/1.spvasm
new file mode 100644
index 0000000..10bf636
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-mat-func-param/1.spvasm
@@ -0,0 +1,486 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %swap_i1_i1_ "swap(i1;i1;"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %performPartition_i1_i1_ "performPartition(i1;i1;"
+               OpName %l "l"
+               OpName %h "h"
+               OpName %quicksort_ "quicksort("
+               OpName %temp "temp"
+               OpName %QuicksortObject "QuicksortObject"
+               OpMemberName %QuicksortObject 0 "numbers"
+               OpName %obj "obj"
+               OpName %pivot "pivot"
+               OpName %i_0 "i"
+               OpName %j_0 "j"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %param_1 "param"
+               OpName %param_2 "param"
+               OpName %l_0 "l"
+               OpName %h_0 "h"
+               OpName %top "top"
+               OpName %stack "stack"
+               OpName %p "p"
+               OpName %param_3 "param"
+               OpName %param_4 "param"
+               OpName %i_1 "i"
+               OpName %uv "uv"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %color "color"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %35 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %38 = OpTypeFunction %int %_ptr_Function_int %_ptr_Function_int
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%QuicksortObject = OpTypeStruct %_arr_int_uint_10
+%_ptr_Private_QuicksortObject = OpTypePointer Private %QuicksortObject
+        %obj = OpVariable %_ptr_Private_QuicksortObject Private
+      %int_0 = OpConstant %int 0
+%_ptr_Private_int = OpTypePointer Private %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %int_9 = OpConstant %int 9
+     %int_n1 = OpConstant %int -1
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+     %int_10 = OpConstant %int 10
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+         %63 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+ %float_0_25 = OpConstant %float 0.25
+  %float_0_5 = OpConstant %float 0.5
+      %int_2 = OpConstant %int 2
+     %uint_1 = OpConstant %uint 1
+ %float_0_75 = OpConstant %float 0.75
+      %int_3 = OpConstant %int 3
+     %uint_2 = OpConstant %uint 2
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+%mat3v3float = OpTypeMatrix %v3float 3
+    %float_0 = OpConstant %float 0
+         %81 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+         %82 = OpConstantComposite %mat3v3float %81 %81 %81
+         %83 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int %mat3v3float
+       %main = OpFunction %void None %35
+         %84 = OpLabel
+        %i_1 = OpVariable %_ptr_Function_int Function
+         %uv = OpVariable %_ptr_Function_v2float Function
+      %color = OpVariable %_ptr_Function_v3float Function
+               OpStore %i_1 %int_0
+               OpBranch %85
+         %85 = OpLabel
+               OpLoopMerge %86 %87 None
+               OpBranch %88
+         %88 = OpLabel
+         %89 = OpLoad %int %i_1
+         %90 = OpSLessThan %bool %89 %int_10
+               OpBranchConditional %90 %91 %86
+         %91 = OpLabel
+         %92 = OpLoad %int %i_1
+         %93 = OpLoad %int %i_1
+         %94 = OpISub %int %int_10 %93
+         %95 = OpAccessChain %_ptr_Private_int %obj %int_0 %92
+               OpStore %95 %94
+         %96 = OpLoad %int %i_1
+         %97 = OpLoad %int %i_1
+         %98 = OpAccessChain %_ptr_Private_int %obj %int_0 %97
+         %99 = OpLoad %int %98
+        %100 = OpLoad %int %i_1
+        %101 = OpAccessChain %_ptr_Private_int %obj %int_0 %100
+        %102 = OpLoad %int %101
+        %103 = OpIMul %int %99 %102
+        %104 = OpAccessChain %_ptr_Private_int %obj %int_0 %96
+               OpStore %104 %103
+               OpBranch %87
+         %87 = OpLabel
+        %105 = OpLoad %int %i_1
+        %106 = OpIAdd %int %105 %int_1
+               OpStore %i_1 %106
+               OpBranch %85
+         %86 = OpLabel
+        %107 = OpFunctionCall %void %quicksort_
+        %108 = OpLoad %v4float %gl_FragCoord
+        %109 = OpVectorShuffle %v2float %108 %108 0 1
+        %110 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+        %111 = OpLoad %v2float %110
+        %112 = OpFDiv %v2float %109 %111
+               OpStore %uv %112
+               OpStore %color %63
+        %113 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_0
+        %114 = OpLoad %int %113
+        %115 = OpConvertSToF %float %114
+        %116 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %117 = OpLoad %float %116
+        %118 = OpFAdd %float %117 %115
+        %119 = OpAccessChain %_ptr_Function_float %color %uint_0
+               OpStore %119 %118
+        %120 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %121 = OpLoad %float %120
+        %122 = OpFOrdGreaterThan %bool %121 %float_0_25
+               OpSelectionMerge %123 None
+               OpBranchConditional %122 %124 %123
+        %124 = OpLabel
+        %125 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_1
+        %126 = OpLoad %int %125
+        %127 = OpConvertSToF %float %126
+        %128 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %129 = OpLoad %float %128
+        %130 = OpFAdd %float %129 %127
+        %131 = OpAccessChain %_ptr_Function_float %color %uint_0
+               OpStore %131 %130
+               OpBranch %123
+        %123 = OpLabel
+        %132 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %133 = OpLoad %float %132
+        %134 = OpFOrdGreaterThan %bool %133 %float_0_5
+               OpSelectionMerge %135 None
+               OpBranchConditional %134 %136 %135
+        %136 = OpLabel
+        %137 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_2
+        %138 = OpLoad %int %137
+        %139 = OpConvertSToF %float %138
+        %140 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %141 = OpLoad %float %140
+        %142 = OpFAdd %float %141 %139
+        %143 = OpAccessChain %_ptr_Function_float %color %uint_1
+               OpStore %143 %142
+               OpBranch %135
+        %135 = OpLabel
+        %144 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %145 = OpLoad %float %144
+        %146 = OpFOrdGreaterThan %bool %145 %float_0_75
+               OpSelectionMerge %147 None
+               OpBranchConditional %146 %148 %147
+        %148 = OpLabel
+        %149 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_3
+        %150 = OpLoad %int %149
+        %151 = OpConvertSToF %float %150
+        %152 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %153 = OpLoad %float %152
+        %154 = OpFAdd %float %153 %151
+        %155 = OpAccessChain %_ptr_Function_float %color %uint_2
+               OpStore %155 %154
+               OpBranch %147
+        %147 = OpLabel
+        %156 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_4
+        %157 = OpLoad %int %156
+        %158 = OpConvertSToF %float %157
+        %159 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %160 = OpLoad %float %159
+        %161 = OpFAdd %float %160 %158
+        %162 = OpAccessChain %_ptr_Function_float %color %uint_1
+               OpStore %162 %161
+        %163 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %164 = OpLoad %float %163
+        %165 = OpFOrdGreaterThan %bool %164 %float_0_25
+               OpSelectionMerge %166 None
+               OpBranchConditional %165 %167 %166
+        %167 = OpLabel
+        %168 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_5
+        %169 = OpLoad %int %168
+        %170 = OpConvertSToF %float %169
+        %171 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %172 = OpLoad %float %171
+        %173 = OpFAdd %float %172 %170
+        %174 = OpAccessChain %_ptr_Function_float %color %uint_0
+               OpStore %174 %173
+               OpBranch %166
+        %166 = OpLabel
+        %175 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %176 = OpLoad %float %175
+        %177 = OpFOrdGreaterThan %bool %176 %float_0_5
+               OpSelectionMerge %178 None
+               OpBranchConditional %177 %179 %178
+        %179 = OpLabel
+        %180 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_6
+        %181 = OpLoad %int %180
+        %182 = OpConvertSToF %float %181
+        %183 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %184 = OpLoad %float %183
+        %185 = OpFAdd %float %184 %182
+        %186 = OpAccessChain %_ptr_Function_float %color %uint_1
+               OpStore %186 %185
+               OpBranch %178
+        %178 = OpLabel
+        %187 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %188 = OpLoad %float %187
+        %189 = OpFOrdGreaterThan %bool %188 %float_0_75
+               OpSelectionMerge %190 None
+               OpBranchConditional %189 %191 %190
+        %191 = OpLabel
+        %192 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_7
+        %193 = OpLoad %int %192
+        %194 = OpConvertSToF %float %193
+        %195 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %196 = OpLoad %float %195
+        %197 = OpFAdd %float %196 %194
+        %198 = OpAccessChain %_ptr_Function_float %color %uint_2
+               OpStore %198 %197
+               OpBranch %190
+        %190 = OpLabel
+        %199 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_8
+        %200 = OpLoad %int %199
+        %201 = OpConvertSToF %float %200
+        %202 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %203 = OpLoad %float %202
+        %204 = OpFAdd %float %203 %201
+        %205 = OpAccessChain %_ptr_Function_float %color %uint_2
+               OpStore %205 %204
+        %206 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %207 = OpLoad %float %206
+        %208 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %209 = OpLoad %float %208
+        %210 = OpFSub %float %207 %209
+        %211 = OpExtInst %float %1 FAbs %210
+        %212 = OpFOrdLessThan %bool %211 %float_0_25
+               OpSelectionMerge %213 None
+               OpBranchConditional %212 %214 %213
+        %214 = OpLabel
+        %215 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_9
+        %216 = OpLoad %int %215
+        %217 = OpConvertSToF %float %216
+        %218 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %219 = OpLoad %float %218
+        %220 = OpFAdd %float %219 %217
+        %221 = OpAccessChain %_ptr_Function_float %color %uint_0
+               OpStore %221 %220
+               OpBranch %213
+        %213 = OpLabel
+        %222 = OpLoad %v3float %color
+        %223 = OpExtInst %v3float %1 Normalize %222
+        %224 = OpCompositeExtract %float %223 0
+        %225 = OpCompositeExtract %float %223 1
+        %226 = OpCompositeExtract %float %223 2
+        %227 = OpCompositeConstruct %v4float %224 %225 %226 %float_1
+               OpStore %_GLF_color %227
+               OpReturn
+               OpFunctionEnd
+%swap_i1_i1_ = OpFunction %void None %83
+          %i = OpFunctionParameter %_ptr_Function_int
+          %j = OpFunctionParameter %_ptr_Function_int
+        %228 = OpFunctionParameter %mat3v3float
+        %229 = OpLabel
+       %temp = OpVariable %_ptr_Function_int Function
+        %230 = OpLoad %int %i
+        %231 = OpAccessChain %_ptr_Private_int %obj %int_0 %230
+        %232 = OpLoad %int %231
+               OpStore %temp %232
+        %233 = OpLoad %int %i
+        %234 = OpLoad %int %j
+        %235 = OpAccessChain %_ptr_Private_int %obj %int_0 %234
+        %236 = OpLoad %int %235
+        %237 = OpAccessChain %_ptr_Private_int %obj %int_0 %233
+               OpStore %237 %236
+        %238 = OpLoad %int %j
+        %239 = OpLoad %int %temp
+        %240 = OpAccessChain %_ptr_Private_int %obj %int_0 %238
+               OpStore %240 %239
+               OpReturn
+               OpFunctionEnd
+%performPartition_i1_i1_ = OpFunction %int None %38
+          %l = OpFunctionParameter %_ptr_Function_int
+          %h = OpFunctionParameter %_ptr_Function_int
+        %241 = OpLabel
+      %pivot = OpVariable %_ptr_Function_int Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+        %j_0 = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_int Function
+    %param_0 = OpVariable %_ptr_Function_int Function
+    %param_1 = OpVariable %_ptr_Function_int Function
+    %param_2 = OpVariable %_ptr_Function_int Function
+        %242 = OpLoad %int %h
+        %243 = OpAccessChain %_ptr_Private_int %obj %int_0 %242
+        %244 = OpLoad %int %243
+               OpStore %pivot %244
+        %245 = OpLoad %int %l
+        %246 = OpISub %int %245 %int_1
+               OpStore %i_0 %246
+        %247 = OpLoad %int %l
+               OpStore %j_0 %247
+               OpBranch %248
+        %248 = OpLabel
+               OpLoopMerge %249 %250 None
+               OpBranch %251
+        %251 = OpLabel
+        %252 = OpLoad %int %j_0
+        %253 = OpLoad %int %h
+        %254 = OpISub %int %253 %int_1
+        %255 = OpSLessThanEqual %bool %252 %254
+               OpBranchConditional %255 %256 %249
+        %256 = OpLabel
+        %257 = OpLoad %int %j_0
+        %258 = OpAccessChain %_ptr_Private_int %obj %int_0 %257
+        %259 = OpLoad %int %258
+        %260 = OpLoad %int %pivot
+        %261 = OpSLessThanEqual %bool %259 %260
+               OpSelectionMerge %262 None
+               OpBranchConditional %261 %263 %262
+        %263 = OpLabel
+        %264 = OpLoad %int %i_0
+        %265 = OpIAdd %int %264 %int_1
+               OpStore %i_0 %265
+        %266 = OpLoad %int %i_0
+               OpStore %param %266
+        %267 = OpLoad %int %j_0
+               OpStore %param_0 %267
+        %268 = OpFunctionCall %void %swap_i1_i1_ %param %param_0 %82
+               OpBranch %262
+        %262 = OpLabel
+               OpBranch %250
+        %250 = OpLabel
+        %269 = OpLoad %int %j_0
+        %270 = OpIAdd %int %269 %int_1
+               OpStore %j_0 %270
+               OpBranch %248
+        %249 = OpLabel
+        %271 = OpLoad %int %i_0
+        %272 = OpIAdd %int %271 %int_1
+               OpStore %i_0 %272
+        %273 = OpLoad %int %i_0
+               OpStore %param_1 %273
+        %274 = OpLoad %int %h
+               OpStore %param_2 %274
+        %275 = OpFunctionCall %void %swap_i1_i1_ %param_1 %param_2 %82
+        %276 = OpLoad %int %i_0
+               OpReturnValue %276
+               OpFunctionEnd
+ %quicksort_ = OpFunction %void None %35
+        %277 = OpLabel
+        %l_0 = OpVariable %_ptr_Function_int Function
+        %h_0 = OpVariable %_ptr_Function_int Function
+        %top = OpVariable %_ptr_Function_int Function
+      %stack = OpVariable %_ptr_Function__arr_int_uint_10 Function
+          %p = OpVariable %_ptr_Function_int Function
+    %param_3 = OpVariable %_ptr_Function_int Function
+    %param_4 = OpVariable %_ptr_Function_int Function
+               OpStore %l_0 %int_0
+               OpStore %h_0 %int_9
+               OpStore %top %int_n1
+        %278 = OpLoad %int %top
+        %279 = OpIAdd %int %278 %int_1
+               OpStore %top %279
+        %280 = OpLoad %int %l_0
+        %281 = OpAccessChain %_ptr_Function_int %stack %279
+               OpStore %281 %280
+        %282 = OpLoad %int %top
+        %283 = OpIAdd %int %282 %int_1
+               OpStore %top %283
+        %284 = OpLoad %int %h_0
+        %285 = OpAccessChain %_ptr_Function_int %stack %283
+               OpStore %285 %284
+               OpBranch %286
+        %286 = OpLabel
+               OpLoopMerge %287 %288 None
+               OpBranch %289
+        %289 = OpLabel
+        %290 = OpLoad %int %top
+        %291 = OpSGreaterThanEqual %bool %290 %int_0
+               OpBranchConditional %291 %292 %287
+        %292 = OpLabel
+        %293 = OpLoad %int %top
+        %294 = OpISub %int %293 %int_1
+               OpStore %top %294
+        %295 = OpAccessChain %_ptr_Function_int %stack %293
+        %296 = OpLoad %int %295
+               OpStore %h_0 %296
+        %297 = OpLoad %int %top
+        %298 = OpISub %int %297 %int_1
+               OpStore %top %298
+        %299 = OpAccessChain %_ptr_Function_int %stack %297
+        %300 = OpLoad %int %299
+               OpStore %l_0 %300
+        %301 = OpLoad %int %l_0
+               OpStore %param_3 %301
+        %302 = OpLoad %int %h_0
+               OpStore %param_4 %302
+        %303 = OpFunctionCall %int %performPartition_i1_i1_ %param_3 %param_4
+               OpStore %p %303
+        %304 = OpLoad %int %p
+        %305 = OpISub %int %304 %int_1
+        %306 = OpLoad %int %l_0
+        %307 = OpSGreaterThan %bool %305 %306
+               OpSelectionMerge %308 None
+               OpBranchConditional %307 %309 %308
+        %309 = OpLabel
+        %310 = OpLoad %int %top
+        %311 = OpIAdd %int %310 %int_1
+               OpStore %top %311
+        %312 = OpLoad %int %l_0
+        %313 = OpAccessChain %_ptr_Function_int %stack %311
+               OpStore %313 %312
+        %314 = OpLoad %int %top
+        %315 = OpIAdd %int %314 %int_1
+               OpStore %top %315
+        %316 = OpLoad %int %p
+        %317 = OpISub %int %316 %int_1
+        %318 = OpAccessChain %_ptr_Function_int %stack %315
+               OpStore %318 %317
+               OpBranch %308
+        %308 = OpLabel
+        %319 = OpLoad %int %p
+        %320 = OpIAdd %int %319 %int_1
+        %321 = OpLoad %int %h_0
+        %322 = OpSLessThan %bool %320 %321
+               OpSelectionMerge %323 None
+               OpBranchConditional %322 %324 %323
+        %324 = OpLabel
+        %325 = OpLoad %int %top
+        %326 = OpIAdd %int %325 %int_1
+               OpStore %top %326
+        %327 = OpLoad %int %p
+        %328 = OpIAdd %int %327 %int_1
+        %329 = OpAccessChain %_ptr_Function_int %stack %326
+               OpStore %329 %328
+        %330 = OpLoad %int %top
+        %331 = OpIAdd %int %330 %int_1
+               OpStore %top %331
+        %332 = OpLoad %int %h_0
+        %333 = OpAccessChain %_ptr_Function_int %stack %331
+               OpStore %333 %332
+               OpBranch %323
+        %323 = OpLabel
+               OpBranch %288
+        %288 = OpLabel
+               OpBranch %286
+        %287 = OpLabel
+               OpReturn
+               OpFunctionEnd
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
new file mode 100644
index 0000000..405b040
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-mat-func-param/1.spvasm.expected.hlsl
@@ -0,0 +1,214 @@
+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;
+  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;
+  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;
+  {
+    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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-mat-func-param/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-mat-func-param/1.spvasm.expected.msl
new file mode 100644
index 0000000..a97ee25
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-mat-func-param/1.spvasm.expected.msl
@@ -0,0 +1,256 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct QuicksortObject {
+  tint_array_wrapper numbers;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void swap_i1_i1_(thread int* const i, thread int* const j, float3x3 x_228, thread QuicksortObject* const tint_symbol_5) {
+  int temp = 0;
+  int const x_230 = *(i);
+  int const x_232 = (*(tint_symbol_5)).numbers.arr[x_230];
+  temp = x_232;
+  int const x_233 = *(i);
+  int const x_234 = *(j);
+  int const x_236 = (*(tint_symbol_5)).numbers.arr[x_234];
+  (*(tint_symbol_5)).numbers.arr[x_233] = x_236;
+  int const x_238 = *(j);
+  int const x_239 = temp;
+  (*(tint_symbol_5)).numbers.arr[x_238] = x_239;
+  return;
+}
+
+int performPartition_i1_i1_(thread int* const l, thread int* const h, thread QuicksortObject* const tint_symbol_6) {
+  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;
+  int const x_242 = *(h);
+  int const x_244 = (*(tint_symbol_6)).numbers.arr[x_242];
+  pivot = x_244;
+  int const x_245 = *(l);
+  i_1 = (x_245 - 1);
+  int const x_247 = *(l);
+  j_1 = x_247;
+  while (true) {
+    int const x_252 = j_1;
+    int const x_253 = *(h);
+    if ((x_252 <= (x_253 - 1))) {
+    } else {
+      break;
+    }
+    int const x_257 = j_1;
+    int const x_259 = (*(tint_symbol_6)).numbers.arr[x_257];
+    int const x_260 = pivot;
+    if ((x_259 <= x_260)) {
+      int const x_264 = i_1;
+      i_1 = (x_264 + 1);
+      int const x_266 = i_1;
+      param = x_266;
+      int const x_267 = j_1;
+      param_1 = x_267;
+      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)), tint_symbol_6);
+    }
+    {
+      int const x_269 = j_1;
+      j_1 = (x_269 + 1);
+    }
+  }
+  int const x_271 = i_1;
+  i_1 = (x_271 + 1);
+  int const x_273 = i_1;
+  param_2 = x_273;
+  int const 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)), tint_symbol_6);
+  int const x_276 = i_1;
+  return x_276;
+}
+
+void quicksort_(thread QuicksortObject* const tint_symbol_7) {
+  int l_1 = 0;
+  int h_1 = 0;
+  int top = 0;
+  tint_array_wrapper stack = {};
+  int p = 0;
+  int param_4 = 0;
+  int param_5 = 0;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  int const x_278 = top;
+  int const x_279 = (x_278 + 1);
+  top = x_279;
+  int const x_280 = l_1;
+  stack.arr[x_279] = x_280;
+  int const x_282 = top;
+  int const x_283 = (x_282 + 1);
+  top = x_283;
+  int const x_284 = h_1;
+  stack.arr[x_283] = x_284;
+  while (true) {
+    int const x_290 = top;
+    if ((x_290 >= 0)) {
+    } else {
+      break;
+    }
+    int const x_293 = top;
+    top = (x_293 - 1);
+    int const x_296 = stack.arr[x_293];
+    h_1 = x_296;
+    int const x_297 = top;
+    top = (x_297 - 1);
+    int const x_300 = stack.arr[x_297];
+    l_1 = x_300;
+    int const x_301 = l_1;
+    param_4 = x_301;
+    int const x_302 = h_1;
+    param_5 = x_302;
+    int const x_303 = performPartition_i1_i1_(&(param_4), &(param_5), tint_symbol_7);
+    p = x_303;
+    int const x_304 = p;
+    int const x_306 = l_1;
+    if (((x_304 - 1) > x_306)) {
+      int const x_310 = top;
+      int const x_311 = (x_310 + 1);
+      top = x_311;
+      int const x_312 = l_1;
+      stack.arr[x_311] = x_312;
+      int const x_314 = top;
+      int const x_315 = (x_314 + 1);
+      top = x_315;
+      int const x_316 = p;
+      stack.arr[x_315] = (x_316 - 1);
+    }
+    int const x_319 = p;
+    int const x_321 = h_1;
+    if (((x_319 + 1) < x_321)) {
+      int const x_325 = top;
+      int const x_326 = (x_325 + 1);
+      top = x_326;
+      int const x_327 = p;
+      stack.arr[x_326] = (x_327 + 1);
+      int const x_330 = top;
+      int const x_331 = (x_330 + 1);
+      top = x_331;
+      int const x_332 = h_1;
+      stack.arr[x_331] = x_332;
+    }
+  }
+  return;
+}
+
+void main_1(constant buf0& x_32, thread QuicksortObject* const tint_symbol_8, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10) {
+  int i_2 = 0;
+  float2 uv = 0.0f;
+  float3 color = 0.0f;
+  i_2 = 0;
+  while (true) {
+    int const x_89 = i_2;
+    if ((x_89 < 10)) {
+    } else {
+      break;
+    }
+    int const x_92 = i_2;
+    int const x_93 = i_2;
+    (*(tint_symbol_8)).numbers.arr[x_92] = (10 - x_93);
+    int const x_96 = i_2;
+    int const x_97 = i_2;
+    int const x_99 = (*(tint_symbol_8)).numbers.arr[x_97];
+    int const x_100 = i_2;
+    int const x_102 = (*(tint_symbol_8)).numbers.arr[x_100];
+    (*(tint_symbol_8)).numbers.arr[x_96] = (x_99 * x_102);
+    {
+      int const x_105 = i_2;
+      i_2 = (x_105 + 1);
+    }
+  }
+  quicksort_(tint_symbol_8);
+  float4 const x_108 = *(tint_symbol_9);
+  float2 const x_111 = x_32.resolution;
+  uv = (float2(x_108.x, x_108.y) / x_111);
+  color = float3(1.0f, 2.0f, 3.0f);
+  int const x_114 = (*(tint_symbol_8)).numbers.arr[0];
+  float const x_117 = color.x;
+  color.x = (x_117 + float(x_114));
+  float const x_121 = uv.x;
+  if ((x_121 > 0.25f)) {
+    int const x_126 = (*(tint_symbol_8)).numbers.arr[1];
+    float const x_129 = color.x;
+    color.x = (x_129 + float(x_126));
+  }
+  float const x_133 = uv.x;
+  if ((x_133 > 0.5f)) {
+    int const x_138 = (*(tint_symbol_8)).numbers.arr[2];
+    float const x_141 = color.y;
+    color.y = (x_141 + float(x_138));
+  }
+  float const x_145 = uv.x;
+  if ((x_145 > 0.75f)) {
+    int const x_150 = (*(tint_symbol_8)).numbers.arr[3];
+    float const x_153 = color.z;
+    color.z = (x_153 + float(x_150));
+  }
+  int const x_157 = (*(tint_symbol_8)).numbers.arr[4];
+  float const x_160 = color.y;
+  color.y = (x_160 + float(x_157));
+  float const x_164 = uv.y;
+  if ((x_164 > 0.25f)) {
+    int const x_169 = (*(tint_symbol_8)).numbers.arr[5];
+    float const x_172 = color.x;
+    color.x = (x_172 + float(x_169));
+  }
+  float const x_176 = uv.y;
+  if ((x_176 > 0.5f)) {
+    int const x_181 = (*(tint_symbol_8)).numbers.arr[6];
+    float const x_184 = color.y;
+    color.y = (x_184 + float(x_181));
+  }
+  float const x_188 = uv.y;
+  if ((x_188 > 0.75f)) {
+    int const x_193 = (*(tint_symbol_8)).numbers.arr[7];
+    float const x_196 = color.z;
+    color.z = (x_196 + float(x_193));
+  }
+  int const x_200 = (*(tint_symbol_8)).numbers.arr[8];
+  float const x_203 = color.z;
+  color.z = (x_203 + float(x_200));
+  float const x_207 = uv.x;
+  float const x_209 = uv.y;
+  if ((fabs((x_207 - x_209)) < 0.25f)) {
+    int const x_216 = (*(tint_symbol_8)).numbers.arr[9];
+    float const x_219 = color.x;
+    color.x = (x_219 + float(x_216));
+  }
+  float3 const x_222 = color;
+  float3 const x_223 = normalize(x_222);
+  *(tint_symbol_10) = float4(x_223.x, x_223.y, x_223.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_32 [[buffer(0)]]) {
+  thread float4 tint_symbol_11 = 0.0f;
+  thread QuicksortObject tint_symbol_12 = {};
+  thread float4 tint_symbol_13 = 0.0f;
+  tint_symbol_11 = gl_FragCoord_param;
+  main_1(x_32, &(tint_symbol_12), &(tint_symbol_11), &(tint_symbol_13));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_13};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-mat-func-param/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-mat-func-param/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..2c8db03
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-mat-func-param/1.spvasm.expected.spvasm
@@ -0,0 +1,547 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 379
+; Schema: 0
+               OpCapability Shader
+        %348 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %QuicksortObject "QuicksortObject"
+               OpMemberName %QuicksortObject 0 "numbers"
+               OpName %obj "obj"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_32 "x_32"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %swap_i1_i1_ "swap_i1_i1_"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %x_228 "x_228"
+               OpName %temp "temp"
+               OpName %performPartition_i1_i1_ "performPartition_i1_i1_"
+               OpName %l "l"
+               OpName %h "h"
+               OpName %pivot "pivot"
+               OpName %i_1 "i_1"
+               OpName %j_1 "j_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %quicksort_ "quicksort_"
+               OpName %l_1 "l_1"
+               OpName %h_1 "h_1"
+               OpName %top "top"
+               OpName %stack "stack"
+               OpName %p "p"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpName %main_1 "main_1"
+               OpName %i_2 "i_2"
+               OpName %uv "uv"
+               OpName %color "color"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpMemberDecorate %QuicksortObject 0 Offset 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_32 NonWritable
+               OpDecorate %x_32 DescriptorSet 0
+               OpDecorate %x_32 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%QuicksortObject = OpTypeStruct %_arr_int_uint_10
+%_ptr_Private_QuicksortObject = OpTypePointer Private %QuicksortObject
+          %8 = OpConstantNull %QuicksortObject
+        %obj = OpVariable %_ptr_Private_QuicksortObject Private %8
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %13 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %13
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_32 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %13
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %13
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+    %v3float = OpTypeVector %float 3
+%mat3v3float = OpTypeMatrix %v3float 3
+         %23 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int %mat3v3float
+         %34 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_int = OpTypePointer Private %int
+         %52 = OpTypeFunction %int %_ptr_Function_int %_ptr_Function_int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+        %102 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+        %103 = OpConstantComposite %mat3v3float %102 %102 %102
+        %115 = OpTypeFunction %void
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+        %123 = OpConstantNull %_arr_int_uint_10
+      %int_0 = OpConstant %int 0
+      %int_9 = OpConstant %int 9
+     %int_n1 = OpConstant %int -1
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+        %195 = OpConstantNull %v2float
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+        %198 = OpConstantNull %v3float
+     %int_10 = OpConstant %int 10
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+        %236 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+%_ptr_Function_float = OpTypePointer Function %float
+ %float_0_25 = OpConstant %float 0.25
+  %float_0_5 = OpConstant %float 0.5
+      %int_2 = OpConstant %int 2
+     %uint_1 = OpConstant %uint 1
+ %float_0_75 = OpConstant %float 0.75
+      %int_3 = OpConstant %int 3
+     %uint_2 = OpConstant %uint 2
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+   %main_out = OpTypeStruct %v4float
+        %366 = OpTypeFunction %void %main_out
+%swap_i1_i1_ = OpFunction %void None %23
+          %i = OpFunctionParameter %_ptr_Function_int
+          %j = OpFunctionParameter %_ptr_Function_int
+      %x_228 = OpFunctionParameter %mat3v3float
+         %32 = OpLabel
+       %temp = OpVariable %_ptr_Function_int Function %34
+         %36 = OpLoad %int %i
+         %39 = OpAccessChain %_ptr_Private_int %obj %uint_0 %36
+         %40 = OpLoad %int %39
+               OpStore %temp %40
+         %42 = OpLoad %int %i
+         %44 = OpLoad %int %j
+         %45 = OpAccessChain %_ptr_Private_int %obj %uint_0 %44
+         %46 = OpLoad %int %45
+         %47 = OpAccessChain %_ptr_Private_int %obj %uint_0 %42
+               OpStore %47 %46
+         %49 = OpLoad %int %j
+         %50 = OpLoad %int %temp
+         %51 = OpAccessChain %_ptr_Private_int %obj %uint_0 %49
+               OpStore %51 %50
+               OpReturn
+               OpFunctionEnd
+%performPartition_i1_i1_ = OpFunction %int None %52
+          %l = OpFunctionParameter %_ptr_Function_int
+          %h = OpFunctionParameter %_ptr_Function_int
+         %56 = OpLabel
+      %pivot = OpVariable %_ptr_Function_int Function %34
+        %i_1 = OpVariable %_ptr_Function_int Function %34
+        %j_1 = OpVariable %_ptr_Function_int Function %34
+      %param = OpVariable %_ptr_Function_int Function %34
+    %param_1 = OpVariable %_ptr_Function_int Function %34
+    %param_2 = OpVariable %_ptr_Function_int Function %34
+    %param_3 = OpVariable %_ptr_Function_int Function %34
+         %65 = OpLoad %int %h
+         %66 = OpAccessChain %_ptr_Private_int %obj %uint_0 %65
+         %67 = OpLoad %int %66
+               OpStore %pivot %67
+         %69 = OpLoad %int %l
+         %71 = OpISub %int %69 %int_1
+               OpStore %i_1 %71
+         %73 = OpLoad %int %l
+               OpStore %j_1 %73
+               OpBranch %74
+         %74 = OpLabel
+               OpLoopMerge %75 %76 None
+               OpBranch %77
+         %77 = OpLabel
+         %78 = OpLoad %int %j_1
+         %80 = OpLoad %int %h
+         %81 = OpISub %int %80 %int_1
+         %82 = OpSLessThanEqual %bool %78 %81
+               OpSelectionMerge %84 None
+               OpBranchConditional %82 %85 %86
+         %85 = OpLabel
+               OpBranch %84
+         %86 = OpLabel
+               OpBranch %75
+         %84 = OpLabel
+         %87 = OpLoad %int %j_1
+         %88 = OpAccessChain %_ptr_Private_int %obj %uint_0 %87
+         %89 = OpLoad %int %88
+         %90 = OpLoad %int %pivot
+         %91 = OpSLessThanEqual %bool %89 %90
+               OpSelectionMerge %92 None
+               OpBranchConditional %91 %93 %92
+         %93 = OpLabel
+         %94 = OpLoad %int %i_1
+         %95 = OpIAdd %int %94 %int_1
+               OpStore %i_1 %95
+         %96 = OpLoad %int %i_1
+               OpStore %param %96
+         %97 = OpLoad %int %j_1
+               OpStore %param_1 %97
+         %98 = OpFunctionCall %void %swap_i1_i1_ %param %param_1 %103
+               OpBranch %92
+         %92 = OpLabel
+               OpBranch %76
+         %76 = OpLabel
+        %104 = OpLoad %int %j_1
+        %105 = OpIAdd %int %104 %int_1
+               OpStore %j_1 %105
+               OpBranch %74
+         %75 = OpLabel
+        %106 = OpLoad %int %i_1
+        %107 = OpIAdd %int %106 %int_1
+               OpStore %i_1 %107
+        %108 = OpLoad %int %i_1
+               OpStore %param_2 %108
+        %110 = OpLoad %int %h
+               OpStore %param_3 %110
+        %111 = OpFunctionCall %void %swap_i1_i1_ %param_2 %param_3 %103
+        %114 = OpLoad %int %i_1
+               OpReturnValue %114
+               OpFunctionEnd
+ %quicksort_ = OpFunction %void None %115
+        %117 = OpLabel
+        %l_1 = OpVariable %_ptr_Function_int Function %34
+        %h_1 = OpVariable %_ptr_Function_int Function %34
+        %top = OpVariable %_ptr_Function_int Function %34
+      %stack = OpVariable %_ptr_Function__arr_int_uint_10 Function %123
+          %p = OpVariable %_ptr_Function_int Function %34
+    %param_4 = OpVariable %_ptr_Function_int Function %34
+    %param_5 = OpVariable %_ptr_Function_int Function %34
+               OpStore %l_1 %int_0
+               OpStore %h_1 %int_9
+               OpStore %top %int_n1
+        %130 = OpLoad %int %top
+        %131 = OpIAdd %int %130 %int_1
+               OpStore %top %131
+        %132 = OpLoad %int %l_1
+        %133 = OpAccessChain %_ptr_Function_int %stack %131
+               OpStore %133 %132
+        %134 = OpLoad %int %top
+        %135 = OpIAdd %int %134 %int_1
+               OpStore %top %135
+        %136 = OpLoad %int %h_1
+        %137 = OpAccessChain %_ptr_Function_int %stack %135
+               OpStore %137 %136
+               OpBranch %138
+        %138 = OpLabel
+               OpLoopMerge %139 %140 None
+               OpBranch %141
+        %141 = OpLabel
+        %142 = OpLoad %int %top
+        %143 = OpSGreaterThanEqual %bool %142 %int_0
+               OpSelectionMerge %144 None
+               OpBranchConditional %143 %145 %146
+        %145 = OpLabel
+               OpBranch %144
+        %146 = OpLabel
+               OpBranch %139
+        %144 = OpLabel
+        %147 = OpLoad %int %top
+        %148 = OpISub %int %147 %int_1
+               OpStore %top %148
+        %149 = OpAccessChain %_ptr_Function_int %stack %147
+        %150 = OpLoad %int %149
+               OpStore %h_1 %150
+        %151 = OpLoad %int %top
+        %152 = OpISub %int %151 %int_1
+               OpStore %top %152
+        %153 = OpAccessChain %_ptr_Function_int %stack %151
+        %154 = OpLoad %int %153
+               OpStore %l_1 %154
+        %155 = OpLoad %int %l_1
+               OpStore %param_4 %155
+        %156 = OpLoad %int %h_1
+               OpStore %param_5 %156
+        %157 = OpFunctionCall %int %performPartition_i1_i1_ %param_4 %param_5
+               OpStore %p %157
+        %160 = OpLoad %int %p
+        %161 = OpLoad %int %l_1
+        %162 = OpISub %int %160 %int_1
+        %163 = OpSGreaterThan %bool %162 %161
+               OpSelectionMerge %164 None
+               OpBranchConditional %163 %165 %164
+        %165 = OpLabel
+        %166 = OpLoad %int %top
+        %167 = OpIAdd %int %166 %int_1
+               OpStore %top %167
+        %168 = OpLoad %int %l_1
+        %169 = OpAccessChain %_ptr_Function_int %stack %167
+               OpStore %169 %168
+        %170 = OpLoad %int %top
+        %171 = OpIAdd %int %170 %int_1
+               OpStore %top %171
+        %172 = OpLoad %int %p
+        %173 = OpAccessChain %_ptr_Function_int %stack %171
+        %174 = OpISub %int %172 %int_1
+               OpStore %173 %174
+               OpBranch %164
+        %164 = OpLabel
+        %175 = OpLoad %int %p
+        %176 = OpLoad %int %h_1
+        %177 = OpIAdd %int %175 %int_1
+        %178 = OpSLessThan %bool %177 %176
+               OpSelectionMerge %179 None
+               OpBranchConditional %178 %180 %179
+        %180 = OpLabel
+        %181 = OpLoad %int %top
+        %182 = OpIAdd %int %181 %int_1
+               OpStore %top %182
+        %183 = OpLoad %int %p
+        %184 = OpAccessChain %_ptr_Function_int %stack %182
+        %185 = OpIAdd %int %183 %int_1
+               OpStore %184 %185
+        %186 = OpLoad %int %top
+        %187 = OpIAdd %int %186 %int_1
+               OpStore %top %187
+        %188 = OpLoad %int %h_1
+        %189 = OpAccessChain %_ptr_Function_int %stack %187
+               OpStore %189 %188
+               OpBranch %179
+        %179 = OpLabel
+               OpBranch %140
+        %140 = OpLabel
+               OpBranch %138
+        %139 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %115
+        %191 = OpLabel
+        %i_2 = OpVariable %_ptr_Function_int Function %34
+         %uv = OpVariable %_ptr_Function_v2float Function %195
+      %color = OpVariable %_ptr_Function_v3float Function %198
+               OpStore %i_2 %int_0
+               OpBranch %199
+        %199 = OpLabel
+               OpLoopMerge %200 %201 None
+               OpBranch %202
+        %202 = OpLabel
+        %203 = OpLoad %int %i_2
+        %205 = OpSLessThan %bool %203 %int_10
+               OpSelectionMerge %206 None
+               OpBranchConditional %205 %207 %208
+        %207 = OpLabel
+               OpBranch %206
+        %208 = OpLabel
+               OpBranch %200
+        %206 = OpLabel
+        %209 = OpLoad %int %i_2
+        %210 = OpLoad %int %i_2
+        %211 = OpAccessChain %_ptr_Private_int %obj %uint_0 %209
+        %212 = OpISub %int %int_10 %210
+               OpStore %211 %212
+        %213 = OpLoad %int %i_2
+        %214 = OpLoad %int %i_2
+        %215 = OpAccessChain %_ptr_Private_int %obj %uint_0 %214
+        %216 = OpLoad %int %215
+        %217 = OpLoad %int %i_2
+        %218 = OpAccessChain %_ptr_Private_int %obj %uint_0 %217
+        %219 = OpLoad %int %218
+        %220 = OpAccessChain %_ptr_Private_int %obj %uint_0 %213
+        %221 = OpIMul %int %216 %219
+               OpStore %220 %221
+               OpBranch %201
+        %201 = OpLabel
+        %222 = OpLoad %int %i_2
+        %223 = OpIAdd %int %222 %int_1
+               OpStore %i_2 %223
+               OpBranch %199
+        %200 = OpLabel
+        %224 = OpFunctionCall %void %quicksort_
+        %225 = OpLoad %v4float %gl_FragCoord
+        %227 = OpAccessChain %_ptr_Uniform_v2float %x_32 %uint_0
+        %228 = OpLoad %v2float %227
+        %229 = OpCompositeExtract %float %225 0
+        %230 = OpCompositeExtract %float %225 1
+        %231 = OpCompositeConstruct %v2float %229 %230
+        %232 = OpFDiv %v2float %231 %228
+               OpStore %uv %232
+               OpStore %color %236
+        %237 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_0
+        %238 = OpLoad %int %237
+        %240 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %241 = OpLoad %float %240
+        %242 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %243 = OpConvertSToF %float %238
+        %244 = OpFAdd %float %241 %243
+               OpStore %242 %244
+        %245 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %246 = OpLoad %float %245
+        %248 = OpFOrdGreaterThan %bool %246 %float_0_25
+               OpSelectionMerge %249 None
+               OpBranchConditional %248 %250 %249
+        %250 = OpLabel
+        %251 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_1
+        %252 = OpLoad %int %251
+        %253 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %254 = OpLoad %float %253
+        %255 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %256 = OpConvertSToF %float %252
+        %257 = OpFAdd %float %254 %256
+               OpStore %255 %257
+               OpBranch %249
+        %249 = OpLabel
+        %258 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %259 = OpLoad %float %258
+        %261 = OpFOrdGreaterThan %bool %259 %float_0_5
+               OpSelectionMerge %262 None
+               OpBranchConditional %261 %263 %262
+        %263 = OpLabel
+        %265 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_2
+        %266 = OpLoad %int %265
+        %268 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %269 = OpLoad %float %268
+        %270 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %271 = OpConvertSToF %float %266
+        %272 = OpFAdd %float %269 %271
+               OpStore %270 %272
+               OpBranch %262
+        %262 = OpLabel
+        %273 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %274 = OpLoad %float %273
+        %276 = OpFOrdGreaterThan %bool %274 %float_0_75
+               OpSelectionMerge %277 None
+               OpBranchConditional %276 %278 %277
+        %278 = OpLabel
+        %280 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_3
+        %281 = OpLoad %int %280
+        %283 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %284 = OpLoad %float %283
+        %285 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %286 = OpConvertSToF %float %281
+        %287 = OpFAdd %float %284 %286
+               OpStore %285 %287
+               OpBranch %277
+        %277 = OpLabel
+        %289 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_4
+        %290 = OpLoad %int %289
+        %291 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %292 = OpLoad %float %291
+        %293 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %294 = OpConvertSToF %float %290
+        %295 = OpFAdd %float %292 %294
+               OpStore %293 %295
+        %296 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %297 = OpLoad %float %296
+        %298 = OpFOrdGreaterThan %bool %297 %float_0_25
+               OpSelectionMerge %299 None
+               OpBranchConditional %298 %300 %299
+        %300 = OpLabel
+        %302 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_5
+        %303 = OpLoad %int %302
+        %304 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %305 = OpLoad %float %304
+        %306 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %307 = OpConvertSToF %float %303
+        %308 = OpFAdd %float %305 %307
+               OpStore %306 %308
+               OpBranch %299
+        %299 = OpLabel
+        %309 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %310 = OpLoad %float %309
+        %311 = OpFOrdGreaterThan %bool %310 %float_0_5
+               OpSelectionMerge %312 None
+               OpBranchConditional %311 %313 %312
+        %313 = OpLabel
+        %315 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_6
+        %316 = OpLoad %int %315
+        %317 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %318 = OpLoad %float %317
+        %319 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %320 = OpConvertSToF %float %316
+        %321 = OpFAdd %float %318 %320
+               OpStore %319 %321
+               OpBranch %312
+        %312 = OpLabel
+        %322 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %323 = OpLoad %float %322
+        %324 = OpFOrdGreaterThan %bool %323 %float_0_75
+               OpSelectionMerge %325 None
+               OpBranchConditional %324 %326 %325
+        %326 = OpLabel
+        %328 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_7
+        %329 = OpLoad %int %328
+        %330 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %331 = OpLoad %float %330
+        %332 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %333 = OpConvertSToF %float %329
+        %334 = OpFAdd %float %331 %333
+               OpStore %332 %334
+               OpBranch %325
+        %325 = OpLabel
+        %336 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_8
+        %337 = OpLoad %int %336
+        %338 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %339 = OpLoad %float %338
+        %340 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %341 = OpConvertSToF %float %337
+        %342 = OpFAdd %float %339 %341
+               OpStore %340 %342
+        %343 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %344 = OpLoad %float %343
+        %345 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %346 = OpLoad %float %345
+        %349 = OpFSub %float %344 %346
+        %347 = OpExtInst %float %348 FAbs %349
+        %350 = OpFOrdLessThan %bool %347 %float_0_25
+               OpSelectionMerge %351 None
+               OpBranchConditional %350 %352 %351
+        %352 = OpLabel
+        %353 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_9
+        %354 = OpLoad %int %353
+        %355 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %356 = OpLoad %float %355
+        %357 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %358 = OpConvertSToF %float %354
+        %359 = OpFAdd %float %356 %358
+               OpStore %357 %359
+               OpBranch %351
+        %351 = OpLabel
+        %360 = OpLoad %v3float %color
+        %361 = OpExtInst %v3float %348 Normalize %360
+        %362 = OpCompositeExtract %float %361 0
+        %363 = OpCompositeExtract %float %361 1
+        %364 = OpCompositeExtract %float %361 2
+        %365 = OpCompositeConstruct %v4float %362 %363 %364 %float_1
+               OpStore %x_GLF_color %365
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %366
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %370 = OpLabel
+        %371 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %371
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %115
+        %373 = OpLabel
+        %374 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %374
+        %375 = OpFunctionCall %void %main_1
+        %377 = OpLoad %v4float %x_GLF_color
+        %378 = OpCompositeConstruct %main_out %377
+        %376 = OpFunctionCall %void %tint_symbol_3 %378
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-mat-func-param/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-mat-func-param/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..af97bb8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-mat-func-param/1.spvasm.expected.wgsl
@@ -0,0 +1,256 @@
+struct QuicksortObject {
+  numbers : array<i32, 10>;
+};
+
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> obj : QuicksortObject;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_32 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn swap_i1_i1_(i : ptr<function, i32>, j : ptr<function, i32>, x_228 : mat3x3<f32>) {
+  var temp : i32;
+  let x_230 : i32 = *(i);
+  let x_232 : i32 = obj.numbers[x_230];
+  temp = x_232;
+  let x_233 : i32 = *(i);
+  let x_234 : i32 = *(j);
+  let x_236 : i32 = obj.numbers[x_234];
+  obj.numbers[x_233] = x_236;
+  let x_238 : i32 = *(j);
+  let x_239 : i32 = temp;
+  obj.numbers[x_238] = x_239;
+  return;
+}
+
+fn performPartition_i1_i1_(l : ptr<function, i32>, h : ptr<function, i32>) -> i32 {
+  var pivot : i32;
+  var i_1 : i32;
+  var j_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  var param_3 : i32;
+  let x_242 : i32 = *(h);
+  let x_244 : i32 = obj.numbers[x_242];
+  pivot = x_244;
+  let x_245 : i32 = *(l);
+  i_1 = (x_245 - 1);
+  let x_247 : i32 = *(l);
+  j_1 = x_247;
+  loop {
+    let x_252 : i32 = j_1;
+    let x_253 : i32 = *(h);
+    if ((x_252 <= (x_253 - 1))) {
+    } else {
+      break;
+    }
+    let x_257 : i32 = j_1;
+    let x_259 : i32 = obj.numbers[x_257];
+    let x_260 : i32 = pivot;
+    if ((x_259 <= x_260)) {
+      let x_264 : i32 = i_1;
+      i_1 = (x_264 + 1);
+      let x_266 : i32 = i_1;
+      param = x_266;
+      let x_267 : i32 = j_1;
+      param_1 = x_267;
+      swap_i1_i1_(&(param), &(param_1), mat3x3<f32>(vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0)));
+    }
+
+    continuing {
+      let x_269 : i32 = j_1;
+      j_1 = (x_269 + 1);
+    }
+  }
+  let x_271 : i32 = i_1;
+  i_1 = (x_271 + 1);
+  let x_273 : i32 = i_1;
+  param_2 = x_273;
+  let x_274 : i32 = *(h);
+  param_3 = x_274;
+  swap_i1_i1_(&(param_2), &(param_3), mat3x3<f32>(vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0)));
+  let x_276 : i32 = i_1;
+  return x_276;
+}
+
+fn quicksort_() {
+  var l_1 : i32;
+  var h_1 : i32;
+  var top : i32;
+  var stack : array<i32, 10>;
+  var p : i32;
+  var param_4 : i32;
+  var param_5 : i32;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  let x_278 : i32 = top;
+  let x_279 : i32 = (x_278 + 1);
+  top = x_279;
+  let x_280 : i32 = l_1;
+  stack[x_279] = x_280;
+  let x_282 : i32 = top;
+  let x_283 : i32 = (x_282 + 1);
+  top = x_283;
+  let x_284 : i32 = h_1;
+  stack[x_283] = x_284;
+  loop {
+    let x_290 : i32 = top;
+    if ((x_290 >= 0)) {
+    } else {
+      break;
+    }
+    let x_293 : i32 = top;
+    top = (x_293 - 1);
+    let x_296 : i32 = stack[x_293];
+    h_1 = x_296;
+    let x_297 : i32 = top;
+    top = (x_297 - 1);
+    let x_300 : i32 = stack[x_297];
+    l_1 = x_300;
+    let x_301 : i32 = l_1;
+    param_4 = x_301;
+    let x_302 : i32 = h_1;
+    param_5 = x_302;
+    let x_303 : i32 = performPartition_i1_i1_(&(param_4), &(param_5));
+    p = x_303;
+    let x_304 : i32 = p;
+    let x_306 : i32 = l_1;
+    if (((x_304 - 1) > x_306)) {
+      let x_310 : i32 = top;
+      let x_311 : i32 = (x_310 + 1);
+      top = x_311;
+      let x_312 : i32 = l_1;
+      stack[x_311] = x_312;
+      let x_314 : i32 = top;
+      let x_315 : i32 = (x_314 + 1);
+      top = x_315;
+      let x_316 : i32 = p;
+      stack[x_315] = (x_316 - 1);
+    }
+    let x_319 : i32 = p;
+    let x_321 : i32 = h_1;
+    if (((x_319 + 1) < x_321)) {
+      let x_325 : i32 = top;
+      let x_326 : i32 = (x_325 + 1);
+      top = x_326;
+      let x_327 : i32 = p;
+      stack[x_326] = (x_327 + 1);
+      let x_330 : i32 = top;
+      let x_331 : i32 = (x_330 + 1);
+      top = x_331;
+      let x_332 : i32 = h_1;
+      stack[x_331] = x_332;
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_2 : i32;
+  var uv : vec2<f32>;
+  var color : vec3<f32>;
+  i_2 = 0;
+  loop {
+    let x_89 : i32 = i_2;
+    if ((x_89 < 10)) {
+    } else {
+      break;
+    }
+    let x_92 : i32 = i_2;
+    let x_93 : i32 = i_2;
+    obj.numbers[x_92] = (10 - x_93);
+    let x_96 : i32 = i_2;
+    let x_97 : i32 = i_2;
+    let x_99 : i32 = obj.numbers[x_97];
+    let x_100 : i32 = i_2;
+    let x_102 : i32 = obj.numbers[x_100];
+    obj.numbers[x_96] = (x_99 * x_102);
+
+    continuing {
+      let x_105 : i32 = i_2;
+      i_2 = (x_105 + 1);
+    }
+  }
+  quicksort_();
+  let x_108 : vec4<f32> = gl_FragCoord;
+  let x_111 : vec2<f32> = x_32.resolution;
+  uv = (vec2<f32>(x_108.x, x_108.y) / x_111);
+  color = vec3<f32>(1.0, 2.0, 3.0);
+  let x_114 : i32 = obj.numbers[0];
+  let x_117 : f32 = color.x;
+  color.x = (x_117 + f32(x_114));
+  let x_121 : f32 = uv.x;
+  if ((x_121 > 0.25)) {
+    let x_126 : i32 = obj.numbers[1];
+    let x_129 : f32 = color.x;
+    color.x = (x_129 + f32(x_126));
+  }
+  let x_133 : f32 = uv.x;
+  if ((x_133 > 0.5)) {
+    let x_138 : i32 = obj.numbers[2];
+    let x_141 : f32 = color.y;
+    color.y = (x_141 + f32(x_138));
+  }
+  let x_145 : f32 = uv.x;
+  if ((x_145 > 0.75)) {
+    let x_150 : i32 = obj.numbers[3];
+    let x_153 : f32 = color.z;
+    color.z = (x_153 + f32(x_150));
+  }
+  let x_157 : i32 = obj.numbers[4];
+  let x_160 : f32 = color.y;
+  color.y = (x_160 + f32(x_157));
+  let x_164 : f32 = uv.y;
+  if ((x_164 > 0.25)) {
+    let x_169 : i32 = obj.numbers[5];
+    let x_172 : f32 = color.x;
+    color.x = (x_172 + f32(x_169));
+  }
+  let x_176 : f32 = uv.y;
+  if ((x_176 > 0.5)) {
+    let x_181 : i32 = obj.numbers[6];
+    let x_184 : f32 = color.y;
+    color.y = (x_184 + f32(x_181));
+  }
+  let x_188 : f32 = uv.y;
+  if ((x_188 > 0.75)) {
+    let x_193 : i32 = obj.numbers[7];
+    let x_196 : f32 = color.z;
+    color.z = (x_196 + f32(x_193));
+  }
+  let x_200 : i32 = obj.numbers[8];
+  let x_203 : f32 = color.z;
+  color.z = (x_203 + f32(x_200));
+  let x_207 : f32 = uv.x;
+  let x_209 : f32 = uv.y;
+  if ((abs((x_207 - x_209)) < 0.25)) {
+    let x_216 : i32 = obj.numbers[9];
+    let x_219 : f32 = color.x;
+    color.x = (x_219 + f32(x_216));
+  }
+  let x_222 : vec3<f32> = color;
+  let x_223 : vec3<f32> = normalize(x_222);
+  x_GLF_color = vec4<f32>(x_223.x, x_223.y, x_223.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-mat-func-param/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-mat-func-param/1.wgsl
new file mode 100644
index 0000000..af97bb8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-mat-func-param/1.wgsl
@@ -0,0 +1,256 @@
+struct QuicksortObject {
+  numbers : array<i32, 10>;
+};
+
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> obj : QuicksortObject;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_32 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn swap_i1_i1_(i : ptr<function, i32>, j : ptr<function, i32>, x_228 : mat3x3<f32>) {
+  var temp : i32;
+  let x_230 : i32 = *(i);
+  let x_232 : i32 = obj.numbers[x_230];
+  temp = x_232;
+  let x_233 : i32 = *(i);
+  let x_234 : i32 = *(j);
+  let x_236 : i32 = obj.numbers[x_234];
+  obj.numbers[x_233] = x_236;
+  let x_238 : i32 = *(j);
+  let x_239 : i32 = temp;
+  obj.numbers[x_238] = x_239;
+  return;
+}
+
+fn performPartition_i1_i1_(l : ptr<function, i32>, h : ptr<function, i32>) -> i32 {
+  var pivot : i32;
+  var i_1 : i32;
+  var j_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  var param_3 : i32;
+  let x_242 : i32 = *(h);
+  let x_244 : i32 = obj.numbers[x_242];
+  pivot = x_244;
+  let x_245 : i32 = *(l);
+  i_1 = (x_245 - 1);
+  let x_247 : i32 = *(l);
+  j_1 = x_247;
+  loop {
+    let x_252 : i32 = j_1;
+    let x_253 : i32 = *(h);
+    if ((x_252 <= (x_253 - 1))) {
+    } else {
+      break;
+    }
+    let x_257 : i32 = j_1;
+    let x_259 : i32 = obj.numbers[x_257];
+    let x_260 : i32 = pivot;
+    if ((x_259 <= x_260)) {
+      let x_264 : i32 = i_1;
+      i_1 = (x_264 + 1);
+      let x_266 : i32 = i_1;
+      param = x_266;
+      let x_267 : i32 = j_1;
+      param_1 = x_267;
+      swap_i1_i1_(&(param), &(param_1), mat3x3<f32>(vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0)));
+    }
+
+    continuing {
+      let x_269 : i32 = j_1;
+      j_1 = (x_269 + 1);
+    }
+  }
+  let x_271 : i32 = i_1;
+  i_1 = (x_271 + 1);
+  let x_273 : i32 = i_1;
+  param_2 = x_273;
+  let x_274 : i32 = *(h);
+  param_3 = x_274;
+  swap_i1_i1_(&(param_2), &(param_3), mat3x3<f32>(vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0)));
+  let x_276 : i32 = i_1;
+  return x_276;
+}
+
+fn quicksort_() {
+  var l_1 : i32;
+  var h_1 : i32;
+  var top : i32;
+  var stack : array<i32, 10>;
+  var p : i32;
+  var param_4 : i32;
+  var param_5 : i32;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  let x_278 : i32 = top;
+  let x_279 : i32 = (x_278 + 1);
+  top = x_279;
+  let x_280 : i32 = l_1;
+  stack[x_279] = x_280;
+  let x_282 : i32 = top;
+  let x_283 : i32 = (x_282 + 1);
+  top = x_283;
+  let x_284 : i32 = h_1;
+  stack[x_283] = x_284;
+  loop {
+    let x_290 : i32 = top;
+    if ((x_290 >= 0)) {
+    } else {
+      break;
+    }
+    let x_293 : i32 = top;
+    top = (x_293 - 1);
+    let x_296 : i32 = stack[x_293];
+    h_1 = x_296;
+    let x_297 : i32 = top;
+    top = (x_297 - 1);
+    let x_300 : i32 = stack[x_297];
+    l_1 = x_300;
+    let x_301 : i32 = l_1;
+    param_4 = x_301;
+    let x_302 : i32 = h_1;
+    param_5 = x_302;
+    let x_303 : i32 = performPartition_i1_i1_(&(param_4), &(param_5));
+    p = x_303;
+    let x_304 : i32 = p;
+    let x_306 : i32 = l_1;
+    if (((x_304 - 1) > x_306)) {
+      let x_310 : i32 = top;
+      let x_311 : i32 = (x_310 + 1);
+      top = x_311;
+      let x_312 : i32 = l_1;
+      stack[x_311] = x_312;
+      let x_314 : i32 = top;
+      let x_315 : i32 = (x_314 + 1);
+      top = x_315;
+      let x_316 : i32 = p;
+      stack[x_315] = (x_316 - 1);
+    }
+    let x_319 : i32 = p;
+    let x_321 : i32 = h_1;
+    if (((x_319 + 1) < x_321)) {
+      let x_325 : i32 = top;
+      let x_326 : i32 = (x_325 + 1);
+      top = x_326;
+      let x_327 : i32 = p;
+      stack[x_326] = (x_327 + 1);
+      let x_330 : i32 = top;
+      let x_331 : i32 = (x_330 + 1);
+      top = x_331;
+      let x_332 : i32 = h_1;
+      stack[x_331] = x_332;
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_2 : i32;
+  var uv : vec2<f32>;
+  var color : vec3<f32>;
+  i_2 = 0;
+  loop {
+    let x_89 : i32 = i_2;
+    if ((x_89 < 10)) {
+    } else {
+      break;
+    }
+    let x_92 : i32 = i_2;
+    let x_93 : i32 = i_2;
+    obj.numbers[x_92] = (10 - x_93);
+    let x_96 : i32 = i_2;
+    let x_97 : i32 = i_2;
+    let x_99 : i32 = obj.numbers[x_97];
+    let x_100 : i32 = i_2;
+    let x_102 : i32 = obj.numbers[x_100];
+    obj.numbers[x_96] = (x_99 * x_102);
+
+    continuing {
+      let x_105 : i32 = i_2;
+      i_2 = (x_105 + 1);
+    }
+  }
+  quicksort_();
+  let x_108 : vec4<f32> = gl_FragCoord;
+  let x_111 : vec2<f32> = x_32.resolution;
+  uv = (vec2<f32>(x_108.x, x_108.y) / x_111);
+  color = vec3<f32>(1.0, 2.0, 3.0);
+  let x_114 : i32 = obj.numbers[0];
+  let x_117 : f32 = color.x;
+  color.x = (x_117 + f32(x_114));
+  let x_121 : f32 = uv.x;
+  if ((x_121 > 0.25)) {
+    let x_126 : i32 = obj.numbers[1];
+    let x_129 : f32 = color.x;
+    color.x = (x_129 + f32(x_126));
+  }
+  let x_133 : f32 = uv.x;
+  if ((x_133 > 0.5)) {
+    let x_138 : i32 = obj.numbers[2];
+    let x_141 : f32 = color.y;
+    color.y = (x_141 + f32(x_138));
+  }
+  let x_145 : f32 = uv.x;
+  if ((x_145 > 0.75)) {
+    let x_150 : i32 = obj.numbers[3];
+    let x_153 : f32 = color.z;
+    color.z = (x_153 + f32(x_150));
+  }
+  let x_157 : i32 = obj.numbers[4];
+  let x_160 : f32 = color.y;
+  color.y = (x_160 + f32(x_157));
+  let x_164 : f32 = uv.y;
+  if ((x_164 > 0.25)) {
+    let x_169 : i32 = obj.numbers[5];
+    let x_172 : f32 = color.x;
+    color.x = (x_172 + f32(x_169));
+  }
+  let x_176 : f32 = uv.y;
+  if ((x_176 > 0.5)) {
+    let x_181 : i32 = obj.numbers[6];
+    let x_184 : f32 = color.y;
+    color.y = (x_184 + f32(x_181));
+  }
+  let x_188 : f32 = uv.y;
+  if ((x_188 > 0.75)) {
+    let x_193 : i32 = obj.numbers[7];
+    let x_196 : f32 = color.z;
+    color.z = (x_196 + f32(x_193));
+  }
+  let x_200 : i32 = obj.numbers[8];
+  let x_203 : f32 = color.z;
+  color.z = (x_203 + f32(x_200));
+  let x_207 : f32 = uv.x;
+  let x_209 : f32 = uv.y;
+  if ((abs((x_207 - x_209)) < 0.25)) {
+    let x_216 : i32 = obj.numbers[9];
+    let x_219 : f32 = color.x;
+    color.x = (x_219 + f32(x_216));
+  }
+  let x_222 : vec3<f32> = color;
+  let x_223 : vec3<f32> = normalize(x_222);
+  x_GLF_color = vec4<f32>(x_223.x, x_223.y, x_223.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
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
new file mode 100644
index 0000000..405b040
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-mat-func-param/1.wgsl.expected.hlsl
@@ -0,0 +1,214 @@
+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;
+  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;
+  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;
+  {
+    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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-mat-func-param/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-mat-func-param/1.wgsl.expected.msl
new file mode 100644
index 0000000..a97ee25
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-mat-func-param/1.wgsl.expected.msl
@@ -0,0 +1,256 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct QuicksortObject {
+  tint_array_wrapper numbers;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void swap_i1_i1_(thread int* const i, thread int* const j, float3x3 x_228, thread QuicksortObject* const tint_symbol_5) {
+  int temp = 0;
+  int const x_230 = *(i);
+  int const x_232 = (*(tint_symbol_5)).numbers.arr[x_230];
+  temp = x_232;
+  int const x_233 = *(i);
+  int const x_234 = *(j);
+  int const x_236 = (*(tint_symbol_5)).numbers.arr[x_234];
+  (*(tint_symbol_5)).numbers.arr[x_233] = x_236;
+  int const x_238 = *(j);
+  int const x_239 = temp;
+  (*(tint_symbol_5)).numbers.arr[x_238] = x_239;
+  return;
+}
+
+int performPartition_i1_i1_(thread int* const l, thread int* const h, thread QuicksortObject* const tint_symbol_6) {
+  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;
+  int const x_242 = *(h);
+  int const x_244 = (*(tint_symbol_6)).numbers.arr[x_242];
+  pivot = x_244;
+  int const x_245 = *(l);
+  i_1 = (x_245 - 1);
+  int const x_247 = *(l);
+  j_1 = x_247;
+  while (true) {
+    int const x_252 = j_1;
+    int const x_253 = *(h);
+    if ((x_252 <= (x_253 - 1))) {
+    } else {
+      break;
+    }
+    int const x_257 = j_1;
+    int const x_259 = (*(tint_symbol_6)).numbers.arr[x_257];
+    int const x_260 = pivot;
+    if ((x_259 <= x_260)) {
+      int const x_264 = i_1;
+      i_1 = (x_264 + 1);
+      int const x_266 = i_1;
+      param = x_266;
+      int const x_267 = j_1;
+      param_1 = x_267;
+      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)), tint_symbol_6);
+    }
+    {
+      int const x_269 = j_1;
+      j_1 = (x_269 + 1);
+    }
+  }
+  int const x_271 = i_1;
+  i_1 = (x_271 + 1);
+  int const x_273 = i_1;
+  param_2 = x_273;
+  int const 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)), tint_symbol_6);
+  int const x_276 = i_1;
+  return x_276;
+}
+
+void quicksort_(thread QuicksortObject* const tint_symbol_7) {
+  int l_1 = 0;
+  int h_1 = 0;
+  int top = 0;
+  tint_array_wrapper stack = {};
+  int p = 0;
+  int param_4 = 0;
+  int param_5 = 0;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  int const x_278 = top;
+  int const x_279 = (x_278 + 1);
+  top = x_279;
+  int const x_280 = l_1;
+  stack.arr[x_279] = x_280;
+  int const x_282 = top;
+  int const x_283 = (x_282 + 1);
+  top = x_283;
+  int const x_284 = h_1;
+  stack.arr[x_283] = x_284;
+  while (true) {
+    int const x_290 = top;
+    if ((x_290 >= 0)) {
+    } else {
+      break;
+    }
+    int const x_293 = top;
+    top = (x_293 - 1);
+    int const x_296 = stack.arr[x_293];
+    h_1 = x_296;
+    int const x_297 = top;
+    top = (x_297 - 1);
+    int const x_300 = stack.arr[x_297];
+    l_1 = x_300;
+    int const x_301 = l_1;
+    param_4 = x_301;
+    int const x_302 = h_1;
+    param_5 = x_302;
+    int const x_303 = performPartition_i1_i1_(&(param_4), &(param_5), tint_symbol_7);
+    p = x_303;
+    int const x_304 = p;
+    int const x_306 = l_1;
+    if (((x_304 - 1) > x_306)) {
+      int const x_310 = top;
+      int const x_311 = (x_310 + 1);
+      top = x_311;
+      int const x_312 = l_1;
+      stack.arr[x_311] = x_312;
+      int const x_314 = top;
+      int const x_315 = (x_314 + 1);
+      top = x_315;
+      int const x_316 = p;
+      stack.arr[x_315] = (x_316 - 1);
+    }
+    int const x_319 = p;
+    int const x_321 = h_1;
+    if (((x_319 + 1) < x_321)) {
+      int const x_325 = top;
+      int const x_326 = (x_325 + 1);
+      top = x_326;
+      int const x_327 = p;
+      stack.arr[x_326] = (x_327 + 1);
+      int const x_330 = top;
+      int const x_331 = (x_330 + 1);
+      top = x_331;
+      int const x_332 = h_1;
+      stack.arr[x_331] = x_332;
+    }
+  }
+  return;
+}
+
+void main_1(constant buf0& x_32, thread QuicksortObject* const tint_symbol_8, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10) {
+  int i_2 = 0;
+  float2 uv = 0.0f;
+  float3 color = 0.0f;
+  i_2 = 0;
+  while (true) {
+    int const x_89 = i_2;
+    if ((x_89 < 10)) {
+    } else {
+      break;
+    }
+    int const x_92 = i_2;
+    int const x_93 = i_2;
+    (*(tint_symbol_8)).numbers.arr[x_92] = (10 - x_93);
+    int const x_96 = i_2;
+    int const x_97 = i_2;
+    int const x_99 = (*(tint_symbol_8)).numbers.arr[x_97];
+    int const x_100 = i_2;
+    int const x_102 = (*(tint_symbol_8)).numbers.arr[x_100];
+    (*(tint_symbol_8)).numbers.arr[x_96] = (x_99 * x_102);
+    {
+      int const x_105 = i_2;
+      i_2 = (x_105 + 1);
+    }
+  }
+  quicksort_(tint_symbol_8);
+  float4 const x_108 = *(tint_symbol_9);
+  float2 const x_111 = x_32.resolution;
+  uv = (float2(x_108.x, x_108.y) / x_111);
+  color = float3(1.0f, 2.0f, 3.0f);
+  int const x_114 = (*(tint_symbol_8)).numbers.arr[0];
+  float const x_117 = color.x;
+  color.x = (x_117 + float(x_114));
+  float const x_121 = uv.x;
+  if ((x_121 > 0.25f)) {
+    int const x_126 = (*(tint_symbol_8)).numbers.arr[1];
+    float const x_129 = color.x;
+    color.x = (x_129 + float(x_126));
+  }
+  float const x_133 = uv.x;
+  if ((x_133 > 0.5f)) {
+    int const x_138 = (*(tint_symbol_8)).numbers.arr[2];
+    float const x_141 = color.y;
+    color.y = (x_141 + float(x_138));
+  }
+  float const x_145 = uv.x;
+  if ((x_145 > 0.75f)) {
+    int const x_150 = (*(tint_symbol_8)).numbers.arr[3];
+    float const x_153 = color.z;
+    color.z = (x_153 + float(x_150));
+  }
+  int const x_157 = (*(tint_symbol_8)).numbers.arr[4];
+  float const x_160 = color.y;
+  color.y = (x_160 + float(x_157));
+  float const x_164 = uv.y;
+  if ((x_164 > 0.25f)) {
+    int const x_169 = (*(tint_symbol_8)).numbers.arr[5];
+    float const x_172 = color.x;
+    color.x = (x_172 + float(x_169));
+  }
+  float const x_176 = uv.y;
+  if ((x_176 > 0.5f)) {
+    int const x_181 = (*(tint_symbol_8)).numbers.arr[6];
+    float const x_184 = color.y;
+    color.y = (x_184 + float(x_181));
+  }
+  float const x_188 = uv.y;
+  if ((x_188 > 0.75f)) {
+    int const x_193 = (*(tint_symbol_8)).numbers.arr[7];
+    float const x_196 = color.z;
+    color.z = (x_196 + float(x_193));
+  }
+  int const x_200 = (*(tint_symbol_8)).numbers.arr[8];
+  float const x_203 = color.z;
+  color.z = (x_203 + float(x_200));
+  float const x_207 = uv.x;
+  float const x_209 = uv.y;
+  if ((fabs((x_207 - x_209)) < 0.25f)) {
+    int const x_216 = (*(tint_symbol_8)).numbers.arr[9];
+    float const x_219 = color.x;
+    color.x = (x_219 + float(x_216));
+  }
+  float3 const x_222 = color;
+  float3 const x_223 = normalize(x_222);
+  *(tint_symbol_10) = float4(x_223.x, x_223.y, x_223.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_32 [[buffer(0)]]) {
+  thread float4 tint_symbol_11 = 0.0f;
+  thread QuicksortObject tint_symbol_12 = {};
+  thread float4 tint_symbol_13 = 0.0f;
+  tint_symbol_11 = gl_FragCoord_param;
+  main_1(x_32, &(tint_symbol_12), &(tint_symbol_11), &(tint_symbol_13));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_13};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-mat-func-param/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-mat-func-param/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..2c8db03
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-mat-func-param/1.wgsl.expected.spvasm
@@ -0,0 +1,547 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 379
+; Schema: 0
+               OpCapability Shader
+        %348 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %QuicksortObject "QuicksortObject"
+               OpMemberName %QuicksortObject 0 "numbers"
+               OpName %obj "obj"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_32 "x_32"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %swap_i1_i1_ "swap_i1_i1_"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %x_228 "x_228"
+               OpName %temp "temp"
+               OpName %performPartition_i1_i1_ "performPartition_i1_i1_"
+               OpName %l "l"
+               OpName %h "h"
+               OpName %pivot "pivot"
+               OpName %i_1 "i_1"
+               OpName %j_1 "j_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %quicksort_ "quicksort_"
+               OpName %l_1 "l_1"
+               OpName %h_1 "h_1"
+               OpName %top "top"
+               OpName %stack "stack"
+               OpName %p "p"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpName %main_1 "main_1"
+               OpName %i_2 "i_2"
+               OpName %uv "uv"
+               OpName %color "color"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpMemberDecorate %QuicksortObject 0 Offset 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_32 NonWritable
+               OpDecorate %x_32 DescriptorSet 0
+               OpDecorate %x_32 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%QuicksortObject = OpTypeStruct %_arr_int_uint_10
+%_ptr_Private_QuicksortObject = OpTypePointer Private %QuicksortObject
+          %8 = OpConstantNull %QuicksortObject
+        %obj = OpVariable %_ptr_Private_QuicksortObject Private %8
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %13 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %13
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_32 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %13
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %13
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+    %v3float = OpTypeVector %float 3
+%mat3v3float = OpTypeMatrix %v3float 3
+         %23 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int %mat3v3float
+         %34 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_int = OpTypePointer Private %int
+         %52 = OpTypeFunction %int %_ptr_Function_int %_ptr_Function_int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+        %102 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+        %103 = OpConstantComposite %mat3v3float %102 %102 %102
+        %115 = OpTypeFunction %void
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+        %123 = OpConstantNull %_arr_int_uint_10
+      %int_0 = OpConstant %int 0
+      %int_9 = OpConstant %int 9
+     %int_n1 = OpConstant %int -1
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+        %195 = OpConstantNull %v2float
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+        %198 = OpConstantNull %v3float
+     %int_10 = OpConstant %int 10
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+        %236 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+%_ptr_Function_float = OpTypePointer Function %float
+ %float_0_25 = OpConstant %float 0.25
+  %float_0_5 = OpConstant %float 0.5
+      %int_2 = OpConstant %int 2
+     %uint_1 = OpConstant %uint 1
+ %float_0_75 = OpConstant %float 0.75
+      %int_3 = OpConstant %int 3
+     %uint_2 = OpConstant %uint 2
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+   %main_out = OpTypeStruct %v4float
+        %366 = OpTypeFunction %void %main_out
+%swap_i1_i1_ = OpFunction %void None %23
+          %i = OpFunctionParameter %_ptr_Function_int
+          %j = OpFunctionParameter %_ptr_Function_int
+      %x_228 = OpFunctionParameter %mat3v3float
+         %32 = OpLabel
+       %temp = OpVariable %_ptr_Function_int Function %34
+         %36 = OpLoad %int %i
+         %39 = OpAccessChain %_ptr_Private_int %obj %uint_0 %36
+         %40 = OpLoad %int %39
+               OpStore %temp %40
+         %42 = OpLoad %int %i
+         %44 = OpLoad %int %j
+         %45 = OpAccessChain %_ptr_Private_int %obj %uint_0 %44
+         %46 = OpLoad %int %45
+         %47 = OpAccessChain %_ptr_Private_int %obj %uint_0 %42
+               OpStore %47 %46
+         %49 = OpLoad %int %j
+         %50 = OpLoad %int %temp
+         %51 = OpAccessChain %_ptr_Private_int %obj %uint_0 %49
+               OpStore %51 %50
+               OpReturn
+               OpFunctionEnd
+%performPartition_i1_i1_ = OpFunction %int None %52
+          %l = OpFunctionParameter %_ptr_Function_int
+          %h = OpFunctionParameter %_ptr_Function_int
+         %56 = OpLabel
+      %pivot = OpVariable %_ptr_Function_int Function %34
+        %i_1 = OpVariable %_ptr_Function_int Function %34
+        %j_1 = OpVariable %_ptr_Function_int Function %34
+      %param = OpVariable %_ptr_Function_int Function %34
+    %param_1 = OpVariable %_ptr_Function_int Function %34
+    %param_2 = OpVariable %_ptr_Function_int Function %34
+    %param_3 = OpVariable %_ptr_Function_int Function %34
+         %65 = OpLoad %int %h
+         %66 = OpAccessChain %_ptr_Private_int %obj %uint_0 %65
+         %67 = OpLoad %int %66
+               OpStore %pivot %67
+         %69 = OpLoad %int %l
+         %71 = OpISub %int %69 %int_1
+               OpStore %i_1 %71
+         %73 = OpLoad %int %l
+               OpStore %j_1 %73
+               OpBranch %74
+         %74 = OpLabel
+               OpLoopMerge %75 %76 None
+               OpBranch %77
+         %77 = OpLabel
+         %78 = OpLoad %int %j_1
+         %80 = OpLoad %int %h
+         %81 = OpISub %int %80 %int_1
+         %82 = OpSLessThanEqual %bool %78 %81
+               OpSelectionMerge %84 None
+               OpBranchConditional %82 %85 %86
+         %85 = OpLabel
+               OpBranch %84
+         %86 = OpLabel
+               OpBranch %75
+         %84 = OpLabel
+         %87 = OpLoad %int %j_1
+         %88 = OpAccessChain %_ptr_Private_int %obj %uint_0 %87
+         %89 = OpLoad %int %88
+         %90 = OpLoad %int %pivot
+         %91 = OpSLessThanEqual %bool %89 %90
+               OpSelectionMerge %92 None
+               OpBranchConditional %91 %93 %92
+         %93 = OpLabel
+         %94 = OpLoad %int %i_1
+         %95 = OpIAdd %int %94 %int_1
+               OpStore %i_1 %95
+         %96 = OpLoad %int %i_1
+               OpStore %param %96
+         %97 = OpLoad %int %j_1
+               OpStore %param_1 %97
+         %98 = OpFunctionCall %void %swap_i1_i1_ %param %param_1 %103
+               OpBranch %92
+         %92 = OpLabel
+               OpBranch %76
+         %76 = OpLabel
+        %104 = OpLoad %int %j_1
+        %105 = OpIAdd %int %104 %int_1
+               OpStore %j_1 %105
+               OpBranch %74
+         %75 = OpLabel
+        %106 = OpLoad %int %i_1
+        %107 = OpIAdd %int %106 %int_1
+               OpStore %i_1 %107
+        %108 = OpLoad %int %i_1
+               OpStore %param_2 %108
+        %110 = OpLoad %int %h
+               OpStore %param_3 %110
+        %111 = OpFunctionCall %void %swap_i1_i1_ %param_2 %param_3 %103
+        %114 = OpLoad %int %i_1
+               OpReturnValue %114
+               OpFunctionEnd
+ %quicksort_ = OpFunction %void None %115
+        %117 = OpLabel
+        %l_1 = OpVariable %_ptr_Function_int Function %34
+        %h_1 = OpVariable %_ptr_Function_int Function %34
+        %top = OpVariable %_ptr_Function_int Function %34
+      %stack = OpVariable %_ptr_Function__arr_int_uint_10 Function %123
+          %p = OpVariable %_ptr_Function_int Function %34
+    %param_4 = OpVariable %_ptr_Function_int Function %34
+    %param_5 = OpVariable %_ptr_Function_int Function %34
+               OpStore %l_1 %int_0
+               OpStore %h_1 %int_9
+               OpStore %top %int_n1
+        %130 = OpLoad %int %top
+        %131 = OpIAdd %int %130 %int_1
+               OpStore %top %131
+        %132 = OpLoad %int %l_1
+        %133 = OpAccessChain %_ptr_Function_int %stack %131
+               OpStore %133 %132
+        %134 = OpLoad %int %top
+        %135 = OpIAdd %int %134 %int_1
+               OpStore %top %135
+        %136 = OpLoad %int %h_1
+        %137 = OpAccessChain %_ptr_Function_int %stack %135
+               OpStore %137 %136
+               OpBranch %138
+        %138 = OpLabel
+               OpLoopMerge %139 %140 None
+               OpBranch %141
+        %141 = OpLabel
+        %142 = OpLoad %int %top
+        %143 = OpSGreaterThanEqual %bool %142 %int_0
+               OpSelectionMerge %144 None
+               OpBranchConditional %143 %145 %146
+        %145 = OpLabel
+               OpBranch %144
+        %146 = OpLabel
+               OpBranch %139
+        %144 = OpLabel
+        %147 = OpLoad %int %top
+        %148 = OpISub %int %147 %int_1
+               OpStore %top %148
+        %149 = OpAccessChain %_ptr_Function_int %stack %147
+        %150 = OpLoad %int %149
+               OpStore %h_1 %150
+        %151 = OpLoad %int %top
+        %152 = OpISub %int %151 %int_1
+               OpStore %top %152
+        %153 = OpAccessChain %_ptr_Function_int %stack %151
+        %154 = OpLoad %int %153
+               OpStore %l_1 %154
+        %155 = OpLoad %int %l_1
+               OpStore %param_4 %155
+        %156 = OpLoad %int %h_1
+               OpStore %param_5 %156
+        %157 = OpFunctionCall %int %performPartition_i1_i1_ %param_4 %param_5
+               OpStore %p %157
+        %160 = OpLoad %int %p
+        %161 = OpLoad %int %l_1
+        %162 = OpISub %int %160 %int_1
+        %163 = OpSGreaterThan %bool %162 %161
+               OpSelectionMerge %164 None
+               OpBranchConditional %163 %165 %164
+        %165 = OpLabel
+        %166 = OpLoad %int %top
+        %167 = OpIAdd %int %166 %int_1
+               OpStore %top %167
+        %168 = OpLoad %int %l_1
+        %169 = OpAccessChain %_ptr_Function_int %stack %167
+               OpStore %169 %168
+        %170 = OpLoad %int %top
+        %171 = OpIAdd %int %170 %int_1
+               OpStore %top %171
+        %172 = OpLoad %int %p
+        %173 = OpAccessChain %_ptr_Function_int %stack %171
+        %174 = OpISub %int %172 %int_1
+               OpStore %173 %174
+               OpBranch %164
+        %164 = OpLabel
+        %175 = OpLoad %int %p
+        %176 = OpLoad %int %h_1
+        %177 = OpIAdd %int %175 %int_1
+        %178 = OpSLessThan %bool %177 %176
+               OpSelectionMerge %179 None
+               OpBranchConditional %178 %180 %179
+        %180 = OpLabel
+        %181 = OpLoad %int %top
+        %182 = OpIAdd %int %181 %int_1
+               OpStore %top %182
+        %183 = OpLoad %int %p
+        %184 = OpAccessChain %_ptr_Function_int %stack %182
+        %185 = OpIAdd %int %183 %int_1
+               OpStore %184 %185
+        %186 = OpLoad %int %top
+        %187 = OpIAdd %int %186 %int_1
+               OpStore %top %187
+        %188 = OpLoad %int %h_1
+        %189 = OpAccessChain %_ptr_Function_int %stack %187
+               OpStore %189 %188
+               OpBranch %179
+        %179 = OpLabel
+               OpBranch %140
+        %140 = OpLabel
+               OpBranch %138
+        %139 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %115
+        %191 = OpLabel
+        %i_2 = OpVariable %_ptr_Function_int Function %34
+         %uv = OpVariable %_ptr_Function_v2float Function %195
+      %color = OpVariable %_ptr_Function_v3float Function %198
+               OpStore %i_2 %int_0
+               OpBranch %199
+        %199 = OpLabel
+               OpLoopMerge %200 %201 None
+               OpBranch %202
+        %202 = OpLabel
+        %203 = OpLoad %int %i_2
+        %205 = OpSLessThan %bool %203 %int_10
+               OpSelectionMerge %206 None
+               OpBranchConditional %205 %207 %208
+        %207 = OpLabel
+               OpBranch %206
+        %208 = OpLabel
+               OpBranch %200
+        %206 = OpLabel
+        %209 = OpLoad %int %i_2
+        %210 = OpLoad %int %i_2
+        %211 = OpAccessChain %_ptr_Private_int %obj %uint_0 %209
+        %212 = OpISub %int %int_10 %210
+               OpStore %211 %212
+        %213 = OpLoad %int %i_2
+        %214 = OpLoad %int %i_2
+        %215 = OpAccessChain %_ptr_Private_int %obj %uint_0 %214
+        %216 = OpLoad %int %215
+        %217 = OpLoad %int %i_2
+        %218 = OpAccessChain %_ptr_Private_int %obj %uint_0 %217
+        %219 = OpLoad %int %218
+        %220 = OpAccessChain %_ptr_Private_int %obj %uint_0 %213
+        %221 = OpIMul %int %216 %219
+               OpStore %220 %221
+               OpBranch %201
+        %201 = OpLabel
+        %222 = OpLoad %int %i_2
+        %223 = OpIAdd %int %222 %int_1
+               OpStore %i_2 %223
+               OpBranch %199
+        %200 = OpLabel
+        %224 = OpFunctionCall %void %quicksort_
+        %225 = OpLoad %v4float %gl_FragCoord
+        %227 = OpAccessChain %_ptr_Uniform_v2float %x_32 %uint_0
+        %228 = OpLoad %v2float %227
+        %229 = OpCompositeExtract %float %225 0
+        %230 = OpCompositeExtract %float %225 1
+        %231 = OpCompositeConstruct %v2float %229 %230
+        %232 = OpFDiv %v2float %231 %228
+               OpStore %uv %232
+               OpStore %color %236
+        %237 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_0
+        %238 = OpLoad %int %237
+        %240 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %241 = OpLoad %float %240
+        %242 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %243 = OpConvertSToF %float %238
+        %244 = OpFAdd %float %241 %243
+               OpStore %242 %244
+        %245 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %246 = OpLoad %float %245
+        %248 = OpFOrdGreaterThan %bool %246 %float_0_25
+               OpSelectionMerge %249 None
+               OpBranchConditional %248 %250 %249
+        %250 = OpLabel
+        %251 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_1
+        %252 = OpLoad %int %251
+        %253 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %254 = OpLoad %float %253
+        %255 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %256 = OpConvertSToF %float %252
+        %257 = OpFAdd %float %254 %256
+               OpStore %255 %257
+               OpBranch %249
+        %249 = OpLabel
+        %258 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %259 = OpLoad %float %258
+        %261 = OpFOrdGreaterThan %bool %259 %float_0_5
+               OpSelectionMerge %262 None
+               OpBranchConditional %261 %263 %262
+        %263 = OpLabel
+        %265 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_2
+        %266 = OpLoad %int %265
+        %268 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %269 = OpLoad %float %268
+        %270 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %271 = OpConvertSToF %float %266
+        %272 = OpFAdd %float %269 %271
+               OpStore %270 %272
+               OpBranch %262
+        %262 = OpLabel
+        %273 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %274 = OpLoad %float %273
+        %276 = OpFOrdGreaterThan %bool %274 %float_0_75
+               OpSelectionMerge %277 None
+               OpBranchConditional %276 %278 %277
+        %278 = OpLabel
+        %280 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_3
+        %281 = OpLoad %int %280
+        %283 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %284 = OpLoad %float %283
+        %285 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %286 = OpConvertSToF %float %281
+        %287 = OpFAdd %float %284 %286
+               OpStore %285 %287
+               OpBranch %277
+        %277 = OpLabel
+        %289 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_4
+        %290 = OpLoad %int %289
+        %291 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %292 = OpLoad %float %291
+        %293 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %294 = OpConvertSToF %float %290
+        %295 = OpFAdd %float %292 %294
+               OpStore %293 %295
+        %296 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %297 = OpLoad %float %296
+        %298 = OpFOrdGreaterThan %bool %297 %float_0_25
+               OpSelectionMerge %299 None
+               OpBranchConditional %298 %300 %299
+        %300 = OpLabel
+        %302 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_5
+        %303 = OpLoad %int %302
+        %304 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %305 = OpLoad %float %304
+        %306 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %307 = OpConvertSToF %float %303
+        %308 = OpFAdd %float %305 %307
+               OpStore %306 %308
+               OpBranch %299
+        %299 = OpLabel
+        %309 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %310 = OpLoad %float %309
+        %311 = OpFOrdGreaterThan %bool %310 %float_0_5
+               OpSelectionMerge %312 None
+               OpBranchConditional %311 %313 %312
+        %313 = OpLabel
+        %315 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_6
+        %316 = OpLoad %int %315
+        %317 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %318 = OpLoad %float %317
+        %319 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %320 = OpConvertSToF %float %316
+        %321 = OpFAdd %float %318 %320
+               OpStore %319 %321
+               OpBranch %312
+        %312 = OpLabel
+        %322 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %323 = OpLoad %float %322
+        %324 = OpFOrdGreaterThan %bool %323 %float_0_75
+               OpSelectionMerge %325 None
+               OpBranchConditional %324 %326 %325
+        %326 = OpLabel
+        %328 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_7
+        %329 = OpLoad %int %328
+        %330 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %331 = OpLoad %float %330
+        %332 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %333 = OpConvertSToF %float %329
+        %334 = OpFAdd %float %331 %333
+               OpStore %332 %334
+               OpBranch %325
+        %325 = OpLabel
+        %336 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_8
+        %337 = OpLoad %int %336
+        %338 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %339 = OpLoad %float %338
+        %340 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %341 = OpConvertSToF %float %337
+        %342 = OpFAdd %float %339 %341
+               OpStore %340 %342
+        %343 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %344 = OpLoad %float %343
+        %345 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %346 = OpLoad %float %345
+        %349 = OpFSub %float %344 %346
+        %347 = OpExtInst %float %348 FAbs %349
+        %350 = OpFOrdLessThan %bool %347 %float_0_25
+               OpSelectionMerge %351 None
+               OpBranchConditional %350 %352 %351
+        %352 = OpLabel
+        %353 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_9
+        %354 = OpLoad %int %353
+        %355 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %356 = OpLoad %float %355
+        %357 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %358 = OpConvertSToF %float %354
+        %359 = OpFAdd %float %356 %358
+               OpStore %357 %359
+               OpBranch %351
+        %351 = OpLabel
+        %360 = OpLoad %v3float %color
+        %361 = OpExtInst %v3float %348 Normalize %360
+        %362 = OpCompositeExtract %float %361 0
+        %363 = OpCompositeExtract %float %361 1
+        %364 = OpCompositeExtract %float %361 2
+        %365 = OpCompositeConstruct %v4float %362 %363 %364 %float_1
+               OpStore %x_GLF_color %365
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %366
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %370 = OpLabel
+        %371 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %371
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %115
+        %373 = OpLabel
+        %374 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %374
+        %375 = OpFunctionCall %void %main_1
+        %377 = OpLoad %v4float %x_GLF_color
+        %378 = OpCompositeConstruct %main_out %377
+        %376 = OpFunctionCall %void %tint_symbol_3 %378
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-mat-func-param/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-mat-func-param/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..af97bb8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-quicksort-mat-func-param/1.wgsl.expected.wgsl
@@ -0,0 +1,256 @@
+struct QuicksortObject {
+  numbers : array<i32, 10>;
+};
+
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> obj : QuicksortObject;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_32 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn swap_i1_i1_(i : ptr<function, i32>, j : ptr<function, i32>, x_228 : mat3x3<f32>) {
+  var temp : i32;
+  let x_230 : i32 = *(i);
+  let x_232 : i32 = obj.numbers[x_230];
+  temp = x_232;
+  let x_233 : i32 = *(i);
+  let x_234 : i32 = *(j);
+  let x_236 : i32 = obj.numbers[x_234];
+  obj.numbers[x_233] = x_236;
+  let x_238 : i32 = *(j);
+  let x_239 : i32 = temp;
+  obj.numbers[x_238] = x_239;
+  return;
+}
+
+fn performPartition_i1_i1_(l : ptr<function, i32>, h : ptr<function, i32>) -> i32 {
+  var pivot : i32;
+  var i_1 : i32;
+  var j_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  var param_3 : i32;
+  let x_242 : i32 = *(h);
+  let x_244 : i32 = obj.numbers[x_242];
+  pivot = x_244;
+  let x_245 : i32 = *(l);
+  i_1 = (x_245 - 1);
+  let x_247 : i32 = *(l);
+  j_1 = x_247;
+  loop {
+    let x_252 : i32 = j_1;
+    let x_253 : i32 = *(h);
+    if ((x_252 <= (x_253 - 1))) {
+    } else {
+      break;
+    }
+    let x_257 : i32 = j_1;
+    let x_259 : i32 = obj.numbers[x_257];
+    let x_260 : i32 = pivot;
+    if ((x_259 <= x_260)) {
+      let x_264 : i32 = i_1;
+      i_1 = (x_264 + 1);
+      let x_266 : i32 = i_1;
+      param = x_266;
+      let x_267 : i32 = j_1;
+      param_1 = x_267;
+      swap_i1_i1_(&(param), &(param_1), mat3x3<f32>(vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0)));
+    }
+
+    continuing {
+      let x_269 : i32 = j_1;
+      j_1 = (x_269 + 1);
+    }
+  }
+  let x_271 : i32 = i_1;
+  i_1 = (x_271 + 1);
+  let x_273 : i32 = i_1;
+  param_2 = x_273;
+  let x_274 : i32 = *(h);
+  param_3 = x_274;
+  swap_i1_i1_(&(param_2), &(param_3), mat3x3<f32>(vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(0.0, 0.0, 0.0)));
+  let x_276 : i32 = i_1;
+  return x_276;
+}
+
+fn quicksort_() {
+  var l_1 : i32;
+  var h_1 : i32;
+  var top : i32;
+  var stack : array<i32, 10>;
+  var p : i32;
+  var param_4 : i32;
+  var param_5 : i32;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  let x_278 : i32 = top;
+  let x_279 : i32 = (x_278 + 1);
+  top = x_279;
+  let x_280 : i32 = l_1;
+  stack[x_279] = x_280;
+  let x_282 : i32 = top;
+  let x_283 : i32 = (x_282 + 1);
+  top = x_283;
+  let x_284 : i32 = h_1;
+  stack[x_283] = x_284;
+  loop {
+    let x_290 : i32 = top;
+    if ((x_290 >= 0)) {
+    } else {
+      break;
+    }
+    let x_293 : i32 = top;
+    top = (x_293 - 1);
+    let x_296 : i32 = stack[x_293];
+    h_1 = x_296;
+    let x_297 : i32 = top;
+    top = (x_297 - 1);
+    let x_300 : i32 = stack[x_297];
+    l_1 = x_300;
+    let x_301 : i32 = l_1;
+    param_4 = x_301;
+    let x_302 : i32 = h_1;
+    param_5 = x_302;
+    let x_303 : i32 = performPartition_i1_i1_(&(param_4), &(param_5));
+    p = x_303;
+    let x_304 : i32 = p;
+    let x_306 : i32 = l_1;
+    if (((x_304 - 1) > x_306)) {
+      let x_310 : i32 = top;
+      let x_311 : i32 = (x_310 + 1);
+      top = x_311;
+      let x_312 : i32 = l_1;
+      stack[x_311] = x_312;
+      let x_314 : i32 = top;
+      let x_315 : i32 = (x_314 + 1);
+      top = x_315;
+      let x_316 : i32 = p;
+      stack[x_315] = (x_316 - 1);
+    }
+    let x_319 : i32 = p;
+    let x_321 : i32 = h_1;
+    if (((x_319 + 1) < x_321)) {
+      let x_325 : i32 = top;
+      let x_326 : i32 = (x_325 + 1);
+      top = x_326;
+      let x_327 : i32 = p;
+      stack[x_326] = (x_327 + 1);
+      let x_330 : i32 = top;
+      let x_331 : i32 = (x_330 + 1);
+      top = x_331;
+      let x_332 : i32 = h_1;
+      stack[x_331] = x_332;
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_2 : i32;
+  var uv : vec2<f32>;
+  var color : vec3<f32>;
+  i_2 = 0;
+  loop {
+    let x_89 : i32 = i_2;
+    if ((x_89 < 10)) {
+    } else {
+      break;
+    }
+    let x_92 : i32 = i_2;
+    let x_93 : i32 = i_2;
+    obj.numbers[x_92] = (10 - x_93);
+    let x_96 : i32 = i_2;
+    let x_97 : i32 = i_2;
+    let x_99 : i32 = obj.numbers[x_97];
+    let x_100 : i32 = i_2;
+    let x_102 : i32 = obj.numbers[x_100];
+    obj.numbers[x_96] = (x_99 * x_102);
+
+    continuing {
+      let x_105 : i32 = i_2;
+      i_2 = (x_105 + 1);
+    }
+  }
+  quicksort_();
+  let x_108 : vec4<f32> = gl_FragCoord;
+  let x_111 : vec2<f32> = x_32.resolution;
+  uv = (vec2<f32>(x_108.x, x_108.y) / x_111);
+  color = vec3<f32>(1.0, 2.0, 3.0);
+  let x_114 : i32 = obj.numbers[0];
+  let x_117 : f32 = color.x;
+  color.x = (x_117 + f32(x_114));
+  let x_121 : f32 = uv.x;
+  if ((x_121 > 0.25)) {
+    let x_126 : i32 = obj.numbers[1];
+    let x_129 : f32 = color.x;
+    color.x = (x_129 + f32(x_126));
+  }
+  let x_133 : f32 = uv.x;
+  if ((x_133 > 0.5)) {
+    let x_138 : i32 = obj.numbers[2];
+    let x_141 : f32 = color.y;
+    color.y = (x_141 + f32(x_138));
+  }
+  let x_145 : f32 = uv.x;
+  if ((x_145 > 0.75)) {
+    let x_150 : i32 = obj.numbers[3];
+    let x_153 : f32 = color.z;
+    color.z = (x_153 + f32(x_150));
+  }
+  let x_157 : i32 = obj.numbers[4];
+  let x_160 : f32 = color.y;
+  color.y = (x_160 + f32(x_157));
+  let x_164 : f32 = uv.y;
+  if ((x_164 > 0.25)) {
+    let x_169 : i32 = obj.numbers[5];
+    let x_172 : f32 = color.x;
+    color.x = (x_172 + f32(x_169));
+  }
+  let x_176 : f32 = uv.y;
+  if ((x_176 > 0.5)) {
+    let x_181 : i32 = obj.numbers[6];
+    let x_184 : f32 = color.y;
+    color.y = (x_184 + f32(x_181));
+  }
+  let x_188 : f32 = uv.y;
+  if ((x_188 > 0.75)) {
+    let x_193 : i32 = obj.numbers[7];
+    let x_196 : f32 = color.z;
+    color.z = (x_196 + f32(x_193));
+  }
+  let x_200 : i32 = obj.numbers[8];
+  let x_203 : f32 = color.z;
+  color.z = (x_203 + f32(x_200));
+  let x_207 : f32 = uv.x;
+  let x_209 : f32 = uv.y;
+  if ((abs((x_207 - x_209)) < 0.25)) {
+    let x_216 : i32 = obj.numbers[9];
+    let x_219 : f32 = color.x;
+    color.x = (x_219 + f32(x_216));
+  }
+  let x_222 : vec3<f32> = color;
+  let x_223 : vec3<f32> = normalize(x_222);
+  x_GLF_color = vec4<f32>(x_223.x, x_223.y, x_223.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/1.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/1.spvasm
new file mode 100644
index 0000000..471025c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/1.spvasm
@@ -0,0 +1,193 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+      %false = OpConstantFalse %bool
+     %uint_1 = OpConstant %uint 1
+       %true = OpConstantTrue %bool
+  %float_0_5 = OpConstant %float 0.5
+    %float_1 = OpConstant %float 1
+         %22 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_1 %float_1
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_8 = OpConstant %int 8
+     %uint_8 = OpConstant %uint 8
+%_arr_v4float_uint_8 = OpTypeArray %v4float %uint_8
+    %float_4 = OpConstant %float 4
+   %float_20 = OpConstant %float 20
+         %30 = OpConstantComposite %v4float %float_4 %float_4 %float_20 %float_4
+         %31 = OpConstantComposite %v4float %float_4 %float_4 %float_4 %float_20
+         %32 = OpConstantComposite %v4float %float_4 %float_20 %float_20 %float_4
+    %float_8 = OpConstant %float 8
+         %34 = OpConstantComposite %v4float %float_20 %float_4 %float_4 %float_8
+    %float_6 = OpConstant %float 6
+    %float_2 = OpConstant %float 2
+         %37 = OpConstantComposite %v4float %float_8 %float_6 %float_4 %float_2
+   %float_12 = OpConstant %float 12
+         %39 = OpConstantComposite %v4float %float_2 %float_12 %float_2 %float_4
+   %float_16 = OpConstant %float 16
+         %41 = OpConstantComposite %v4float %float_16 %float_2 %float_4 %float_4
+   %float_22 = OpConstant %float 22
+         %43 = OpConstantComposite %v4float %float_12 %float_22 %float_4 %float_4
+         %44 = OpConstantComposite %_arr_v4float_uint_8 %30 %31 %32 %34 %37 %39 %41 %43
+%_ptr_Function__arr_v4float_uint_8 = OpTypePointer Function %_arr_v4float_uint_8
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+    %float_0 = OpConstant %float 0
+         %49 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+         %50 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+         %51 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+         %52 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+         %53 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+         %54 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+         %55 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+         %56 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+         %57 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %58 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+         %59 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+         %60 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+         %61 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+         %62 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+         %63 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+         %64 = OpConstantComposite %_arr_v4float_uint_16 %49 %50 %51 %52 %53 %54 %55 %56 %49 %57 %58 %59 %60 %61 %62 %63
+      %int_9 = OpConstant %int 9
+     %int_11 = OpConstant %int 11
+     %int_16 = OpConstant %int 16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+      %int_1 = OpConstant %int 1
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+   %float_32 = OpConstant %float 32
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %75 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+         %76 = OpConstantComposite %_arr_v4float_uint_8 %75 %75 %75 %75 %75 %75 %75 %75
+  %float_0_0 = OpConstant %float 0
+         %78 = OpConstantComposite %v4float %float_0_0 %float_0_0 %float_0_0 %float_0_0
+         %79 = OpConstantComposite %_arr_v4float_uint_8 %78 %78 %78 %78 %78 %78 %78 %78
+       %main = OpFunction %void None %8
+         %80 = OpLabel
+         %81 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %76
+         %82 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function
+         %83 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function
+         %84 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function
+         %85 = OpVariable %_ptr_Function__arr_v4float_uint_16 Function
+               OpStore %81 %44
+         %86 = OpLoad %_arr_v4float_uint_8 %81
+         %87 = OpLoad %v4float %gl_FragCoord
+         %88 = OpVectorShuffle %v2float %87 %87 0 1
+         %89 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+         %90 = OpLoad %v2float %89
+         %91 = OpFDiv %v2float %88 %90
+         %92 = OpVectorTimesScalar %v2float %91 %float_32
+         %93 = OpExtInst %v2float %1 Floor %92
+               OpBranch %94
+         %94 = OpLabel
+         %95 = OpPhi %v4float %22 %80 %96 %97
+         %98 = OpPhi %int %int_0 %80 %99 %97
+        %100 = OpSLessThan %bool %98 %int_8
+               OpLoopMerge %101 %97 None
+               OpBranchConditional %100 %102 %101
+        %102 = OpLabel
+               OpStore %82 %86
+        %103 = OpAccessChain %_ptr_Function_v4float %82 %98
+        %104 = OpLoad %v4float %103
+               OpSelectionMerge %105 None
+               OpSwitch %uint_0 %106
+        %106 = OpLabel
+        %107 = OpCompositeExtract %float %93 0
+        %108 = OpCompositeExtract %float %104 0
+        %109 = OpFOrdLessThan %bool %107 %108
+               OpSelectionMerge %110 None
+               OpBranchConditional %109 %111 %110
+        %111 = OpLabel
+               OpBranch %105
+        %110 = OpLabel
+        %112 = OpCompositeExtract %float %93 1
+        %113 = OpCompositeExtract %float %104 1
+        %114 = OpFOrdLessThan %bool %112 %113
+               OpSelectionMerge %115 None
+               OpBranchConditional %114 %116 %115
+        %116 = OpLabel
+               OpBranch %105
+        %115 = OpLabel
+        %117 = OpCompositeExtract %float %104 2
+        %118 = OpFAdd %float %108 %117
+        %119 = OpFOrdGreaterThan %bool %107 %118
+               OpSelectionMerge %120 None
+               OpBranchConditional %119 %121 %120
+        %121 = OpLabel
+               OpBranch %105
+        %120 = OpLabel
+        %122 = OpCompositeExtract %float %104 3
+        %123 = OpFAdd %float %113 %122
+        %124 = OpFOrdGreaterThan %bool %112 %123
+               OpSelectionMerge %125 None
+               OpBranchConditional %124 %126 %125
+        %126 = OpLabel
+               OpBranch %105
+        %125 = OpLabel
+               OpBranch %105
+        %105 = OpLabel
+        %127 = OpPhi %bool %false %111 %false %116 %false %121 %false %126 %true %125
+               OpSelectionMerge %128 None
+               OpBranchConditional %127 %129 %128
+        %129 = OpLabel
+               OpStore %83 %44
+        %130 = OpAccessChain %_ptr_Function_float %83 %98 %uint_0
+        %131 = OpLoad %float %130
+        %132 = OpConvertFToS %int %131
+               OpStore %84 %44
+        %133 = OpAccessChain %_ptr_Function_float %84 %98 %uint_1
+        %134 = OpLoad %float %133
+        %135 = OpLoad %_arr_v4float_uint_8 %81
+               OpStore %81 %79
+               OpStore %81 %135
+        %136 = OpConvertFToS %int %134
+        %137 = OpIMul %int %132 %136
+        %138 = OpIMul %int %98 %int_9
+        %139 = OpIAdd %int %137 %138
+        %140 = OpIAdd %int %139 %int_11
+        %141 = OpSMod %int %140 %int_16
+               OpStore %85 %64
+        %142 = OpAccessChain %_ptr_Function_v4float %85 %141
+        %143 = OpLoad %v4float %142
+               OpBranch %128
+        %128 = OpLabel
+         %96 = OpPhi %v4float %95 %105 %143 %129
+               OpBranch %97
+         %97 = OpLabel
+         %99 = OpIAdd %int %98 %int_1
+               OpBranch %94
+        %101 = OpLabel
+               OpStore %_GLF_color %95
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..2846e30
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/1.spvasm.expected.hlsl
@@ -0,0 +1,110 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 x_81[8] = {float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)};
+  float4 x_82[8] = (float4[8])0;
+  float4 x_83[8] = (float4[8])0;
+  float4 x_84[8] = (float4[8])0;
+  float4 x_85[16] = (float4[16])0;
+  float4 x_95 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 x_95_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int x_98_phi = 0;
+  const float4 tint_symbol_5[8] = {float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)};
+  x_81 = tint_symbol_5;
+  const float4 x_86[8] = x_81;
+  const float4 x_87 = gl_FragCoord;
+  const float2 x_90 = asfloat(x_6[0].xy);
+  const float2 x_93 = floor(((float2(x_87.x, x_87.y) / x_90) * 32.0f));
+  x_95_phi = float4(0.5f, 0.5f, 1.0f, 1.0f);
+  x_98_phi = 0;
+  while (true) {
+    float4 x_143 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    int x_99 = 0;
+    bool x_127_phi = false;
+    float4 x_96_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    x_95 = x_95_phi;
+    const int x_98 = x_98_phi;
+    if ((x_98 < 8)) {
+    } else {
+      break;
+    }
+    float4 x_104 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    x_82 = x_86;
+    x_104 = x_82[x_98];
+    switch(0u) {
+      default: {
+        const float x_107 = x_93.x;
+        const float x_108 = x_104.x;
+        if ((x_107 < x_108)) {
+          x_127_phi = false;
+          break;
+        }
+        const float x_112 = x_93.y;
+        const float x_113 = x_104.y;
+        if ((x_112 < x_113)) {
+          x_127_phi = false;
+          break;
+        }
+        if ((x_107 > (x_108 + x_104.z))) {
+          x_127_phi = false;
+          break;
+        }
+        if ((x_112 > (x_113 + x_104.w))) {
+          x_127_phi = false;
+          break;
+        }
+        x_127_phi = true;
+        break;
+      }
+    }
+    const bool x_127 = x_127_phi;
+    x_96_phi = x_95;
+    if (x_127) {
+      const float4 tint_symbol_6[8] = {float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)};
+      x_83 = tint_symbol_6;
+      const float x_131 = x_83[x_98].x;
+      const float4 tint_symbol_7[8] = {float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)};
+      x_84 = tint_symbol_7;
+      const float x_134 = x_84[x_98].y;
+      const float4 x_135[8] = x_81;
+      const float4 tint_symbol_8[8] = {float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)};
+      x_81 = tint_symbol_8;
+      x_81 = x_135;
+      const float4 tint_symbol_9[16] = {float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)};
+      x_85 = tint_symbol_9;
+      x_143 = x_85[((((int(x_131) * int(x_134)) + (x_98 * 9)) + 11) % 16)];
+      x_96_phi = x_143;
+    }
+    const float4 x_96 = x_96_phi;
+    {
+      x_99 = (x_98 + 1);
+      x_95_phi = x_96;
+      x_98_phi = x_99;
+    }
+  }
+  x_GLF_color = x_95;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_10 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_10;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/1.spvasm.expected.msl
new file mode 100644
index 0000000..c69c232
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/1.spvasm.expected.msl
@@ -0,0 +1,115 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  float4 arr[8];
+};
+struct tint_array_wrapper_1 {
+  float4 arr[16];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_10, thread float4* const tint_symbol_11) {
+  tint_array_wrapper x_81 = {.arr={float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)}};
+  tint_array_wrapper x_82 = {};
+  tint_array_wrapper x_83 = {};
+  tint_array_wrapper x_84 = {};
+  tint_array_wrapper_1 x_85 = {};
+  float4 x_95 = 0.0f;
+  float4 x_95_phi = 0.0f;
+  int x_98_phi = 0;
+  tint_array_wrapper const tint_symbol_4 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
+  x_81 = tint_symbol_4;
+  tint_array_wrapper const x_86 = x_81;
+  float4 const x_87 = *(tint_symbol_10);
+  float2 const x_90 = x_6.resolution;
+  float2 const x_93 = floor(((float2(x_87.x, x_87.y) / x_90) * 32.0f));
+  x_95_phi = float4(0.5f, 0.5f, 1.0f, 1.0f);
+  x_98_phi = 0;
+  while (true) {
+    float4 x_143 = 0.0f;
+    int x_99 = 0;
+    bool x_127_phi = false;
+    float4 x_96_phi = 0.0f;
+    x_95 = x_95_phi;
+    int const x_98 = x_98_phi;
+    if ((x_98 < 8)) {
+    } else {
+      break;
+    }
+    float4 x_104 = 0.0f;
+    x_82 = x_86;
+    x_104 = x_82.arr[x_98];
+    switch(0u) {
+      default: {
+        float const x_107 = x_93.x;
+        float const x_108 = x_104.x;
+        if ((x_107 < x_108)) {
+          x_127_phi = false;
+          break;
+        }
+        float const x_112 = x_93.y;
+        float const x_113 = x_104.y;
+        if ((x_112 < x_113)) {
+          x_127_phi = false;
+          break;
+        }
+        if ((x_107 > (x_108 + x_104.z))) {
+          x_127_phi = false;
+          break;
+        }
+        if ((x_112 > (x_113 + x_104.w))) {
+          x_127_phi = false;
+          break;
+        }
+        x_127_phi = true;
+        break;
+      }
+    }
+    bool const x_127 = x_127_phi;
+    x_96_phi = x_95;
+    if (x_127) {
+      tint_array_wrapper const tint_symbol_5 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
+      x_83 = tint_symbol_5;
+      float const x_131 = x_83.arr[x_98].x;
+      tint_array_wrapper const tint_symbol_6 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
+      x_84 = tint_symbol_6;
+      float const x_134 = x_84.arr[x_98].y;
+      tint_array_wrapper const x_135 = x_81;
+      tint_array_wrapper const tint_symbol_7 = {.arr={float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)}};
+      x_81 = tint_symbol_7;
+      x_81 = x_135;
+      tint_array_wrapper_1 const tint_symbol_8 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
+      x_85 = tint_symbol_8;
+      x_143 = x_85.arr[((((int(x_131) * int(x_134)) + (x_98 * 9)) + 11) % 16)];
+      x_96_phi = x_143;
+    }
+    float4 const x_96 = x_96_phi;
+    {
+      x_99 = (x_98 + 1);
+      x_95_phi = x_96;
+      x_98_phi = x_99;
+    }
+  }
+  *(tint_symbol_11) = x_95;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_12 = 0.0f;
+  thread float4 tint_symbol_13 = 0.0f;
+  tint_symbol_12 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_12), &(tint_symbol_13));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_13};
+  tint_symbol_2 const tint_symbol_9 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_9;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..5d0f00b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/1.spvasm.expected.spvasm
@@ -0,0 +1,290 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 187
+; Schema: 0
+               OpCapability Shader
+         %67 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %x_81 "x_81"
+               OpName %x_82 "x_82"
+               OpName %x_83 "x_83"
+               OpName %x_84 "x_84"
+               OpName %x_85 "x_85"
+               OpName %x_95 "x_95"
+               OpName %x_95_phi "x_95_phi"
+               OpName %x_98_phi "x_98_phi"
+               OpName %x_143 "x_143"
+               OpName %x_99 "x_99"
+               OpName %x_127_phi "x_127_phi"
+               OpName %x_96_phi "x_96_phi"
+               OpName %x_104 "x_104"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v4float_uint_8 ArrayStride 16
+               OpDecorate %_arr_v4float_uint_16 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_8 = OpConstant %uint 8
+%_arr_v4float_uint_8 = OpTypeArray %v4float %uint_8
+    %float_0 = OpConstant %float 0
+         %23 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+         %24 = OpConstantComposite %_arr_v4float_uint_8 %23 %23 %23 %23 %23 %23 %23 %23
+%_ptr_Function__arr_v4float_uint_8 = OpTypePointer Function %_arr_v4float_uint_8
+         %27 = OpConstantNull %_arr_v4float_uint_8
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+         %35 = OpConstantNull %_arr_v4float_uint_16
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %42 = OpConstantNull %int
+    %float_4 = OpConstant %float 4
+   %float_20 = OpConstant %float 20
+         %45 = OpConstantComposite %v4float %float_4 %float_4 %float_20 %float_4
+         %46 = OpConstantComposite %v4float %float_4 %float_4 %float_4 %float_20
+         %47 = OpConstantComposite %v4float %float_4 %float_20 %float_20 %float_4
+    %float_8 = OpConstant %float 8
+         %49 = OpConstantComposite %v4float %float_20 %float_4 %float_4 %float_8
+    %float_6 = OpConstant %float 6
+    %float_2 = OpConstant %float 2
+         %52 = OpConstantComposite %v4float %float_8 %float_6 %float_4 %float_2
+   %float_12 = OpConstant %float 12
+         %54 = OpConstantComposite %v4float %float_2 %float_12 %float_2 %float_4
+   %float_16 = OpConstant %float 16
+         %56 = OpConstantComposite %v4float %float_16 %float_2 %float_4 %float_4
+   %float_22 = OpConstant %float 22
+         %58 = OpConstantComposite %v4float %float_12 %float_22 %float_4 %float_4
+         %59 = OpConstantComposite %_arr_v4float_uint_8 %45 %46 %47 %49 %52 %54 %56 %58
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+   %float_32 = OpConstant %float 32
+  %float_0_5 = OpConstant %float 0.5
+    %float_1 = OpConstant %float 1
+         %76 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_1 %float_1
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %87 = OpConstantNull %bool
+      %int_8 = OpConstant %int 8
+%_ptr_Function_float = OpTypePointer Function %float
+      %false = OpConstantFalse %bool
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+     %uint_3 = OpConstant %uint 3
+       %true = OpConstantTrue %bool
+        %140 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+        %141 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+        %142 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+        %143 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+        %144 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+        %145 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+        %146 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+        %147 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+        %148 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %149 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+        %150 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+        %151 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+        %152 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+        %153 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+        %154 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+        %155 = OpConstantComposite %_arr_v4float_uint_16 %140 %141 %142 %143 %144 %145 %146 %147 %140 %148 %149 %150 %151 %152 %153 %154
+      %int_9 = OpConstant %int 9
+     %int_11 = OpConstant %int 11
+     %int_16 = OpConstant %int 16
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+        %174 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+       %x_81 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %27
+       %x_82 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %27
+       %x_83 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %27
+       %x_84 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %27
+       %x_85 = OpVariable %_ptr_Function__arr_v4float_uint_16 Function %35
+       %x_95 = OpVariable %_ptr_Function_v4float Function %5
+   %x_95_phi = OpVariable %_ptr_Function_v4float Function %5
+   %x_98_phi = OpVariable %_ptr_Function_int Function %42
+      %x_143 = OpVariable %_ptr_Function_v4float Function %5
+       %x_99 = OpVariable %_ptr_Function_int Function %42
+  %x_127_phi = OpVariable %_ptr_Function_bool Function %87
+   %x_96_phi = OpVariable %_ptr_Function_v4float Function %5
+      %x_104 = OpVariable %_ptr_Function_v4float Function %5
+               OpStore %x_81 %24
+               OpStore %x_81 %59
+         %60 = OpLoad %_arr_v4float_uint_8 %x_81
+         %61 = OpLoad %v4float %gl_FragCoord
+         %64 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %65 = OpLoad %v2float %64
+         %68 = OpCompositeExtract %float %61 0
+         %69 = OpCompositeExtract %float %61 1
+         %70 = OpCompositeConstruct %v2float %68 %69
+         %71 = OpFDiv %v2float %70 %65
+         %73 = OpVectorTimesScalar %v2float %71 %float_32
+         %66 = OpExtInst %v2float %67 Floor %73
+               OpStore %x_95_phi %76
+               OpStore %x_98_phi %int_0
+               OpBranch %78
+         %78 = OpLabel
+               OpLoopMerge %79 %80 None
+               OpBranch %81
+         %81 = OpLabel
+         %89 = OpLoad %v4float %x_95_phi
+               OpStore %x_95 %89
+         %90 = OpLoad %int %x_98_phi
+         %92 = OpSLessThan %bool %90 %int_8
+               OpSelectionMerge %93 None
+               OpBranchConditional %92 %94 %95
+         %94 = OpLabel
+               OpBranch %93
+         %95 = OpLabel
+               OpBranch %79
+         %93 = OpLabel
+               OpStore %x_82 %60
+         %97 = OpAccessChain %_ptr_Function_v4float %x_82 %90
+         %98 = OpLoad %v4float %97
+               OpStore %x_104 %98
+               OpSelectionMerge %99 None
+               OpSwitch %uint_0 %100
+        %100 = OpLabel
+        %101 = OpCompositeExtract %float %66 0
+        %103 = OpAccessChain %_ptr_Function_float %x_104 %uint_0
+        %104 = OpLoad %float %103
+        %105 = OpFOrdLessThan %bool %101 %104
+               OpSelectionMerge %106 None
+               OpBranchConditional %105 %107 %106
+        %107 = OpLabel
+               OpStore %x_127_phi %false
+               OpBranch %99
+        %106 = OpLabel
+        %109 = OpCompositeExtract %float %66 1
+        %111 = OpAccessChain %_ptr_Function_float %x_104 %uint_1
+        %112 = OpLoad %float %111
+        %113 = OpFOrdLessThan %bool %109 %112
+               OpSelectionMerge %114 None
+               OpBranchConditional %113 %115 %114
+        %115 = OpLabel
+               OpStore %x_127_phi %false
+               OpBranch %99
+        %114 = OpLabel
+        %117 = OpAccessChain %_ptr_Function_float %x_104 %uint_2
+        %118 = OpLoad %float %117
+        %119 = OpFAdd %float %104 %118
+        %120 = OpFOrdGreaterThan %bool %101 %119
+               OpSelectionMerge %121 None
+               OpBranchConditional %120 %122 %121
+        %122 = OpLabel
+               OpStore %x_127_phi %false
+               OpBranch %99
+        %121 = OpLabel
+        %124 = OpAccessChain %_ptr_Function_float %x_104 %uint_3
+        %125 = OpLoad %float %124
+        %126 = OpFAdd %float %112 %125
+        %127 = OpFOrdGreaterThan %bool %109 %126
+               OpSelectionMerge %128 None
+               OpBranchConditional %127 %129 %128
+        %129 = OpLabel
+               OpStore %x_127_phi %false
+               OpBranch %99
+        %128 = OpLabel
+               OpStore %x_127_phi %true
+               OpBranch %99
+         %99 = OpLabel
+        %131 = OpLoad %bool %x_127_phi
+        %132 = OpLoad %v4float %x_95
+               OpStore %x_96_phi %132
+               OpSelectionMerge %133 None
+               OpBranchConditional %131 %134 %133
+        %134 = OpLabel
+               OpStore %x_83 %59
+        %135 = OpAccessChain %_ptr_Function_float %x_83 %90 %uint_0
+        %136 = OpLoad %float %135
+               OpStore %x_84 %59
+        %137 = OpAccessChain %_ptr_Function_float %x_84 %90 %uint_1
+        %138 = OpLoad %float %137
+        %139 = OpLoad %_arr_v4float_uint_8 %x_81
+               OpStore %x_81 %24
+               OpStore %x_81 %139
+               OpStore %x_85 %155
+        %156 = OpConvertFToS %int %136
+        %157 = OpConvertFToS %int %138
+        %158 = OpIMul %int %156 %157
+        %160 = OpIMul %int %90 %int_9
+        %161 = OpIAdd %int %158 %160
+        %163 = OpIAdd %int %161 %int_11
+        %165 = OpSMod %int %163 %int_16
+        %166 = OpAccessChain %_ptr_Function_v4float %x_85 %165
+        %167 = OpLoad %v4float %166
+               OpStore %x_143 %167
+        %168 = OpLoad %v4float %x_143
+               OpStore %x_96_phi %168
+               OpBranch %133
+        %133 = OpLabel
+        %169 = OpLoad %v4float %x_96_phi
+               OpBranch %80
+         %80 = OpLabel
+        %171 = OpIAdd %int %90 %int_1
+               OpStore %x_99 %171
+               OpStore %x_95_phi %169
+        %172 = OpLoad %int %x_99
+               OpStore %x_98_phi %172
+               OpBranch %78
+         %79 = OpLabel
+        %173 = OpLoad %v4float %x_95
+               OpStore %x_GLF_color %173
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %174
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %178 = OpLabel
+        %179 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %179
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %181 = OpLabel
+        %182 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %182
+        %183 = OpFunctionCall %void %main_1
+        %185 = OpLoad %v4float %x_GLF_color
+        %186 = OpCompositeConstruct %main_out %185
+        %184 = OpFunctionCall %void %tint_symbol_3 %186
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..8f0982f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/1.spvasm.expected.wgsl
@@ -0,0 +1,103 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_81 : array<vec4<f32>, 8> = array<vec4<f32>, 8>(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
+  var x_82 : array<vec4<f32>, 8>;
+  var x_83 : array<vec4<f32>, 8>;
+  var x_84 : array<vec4<f32>, 8>;
+  var x_85 : array<vec4<f32>, 16>;
+  var x_95 : vec4<f32>;
+  var x_95_phi : vec4<f32>;
+  var x_98_phi : i32;
+  x_81 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+  let x_86 : array<vec4<f32>, 8> = x_81;
+  let x_87 : vec4<f32> = gl_FragCoord;
+  let x_90 : vec2<f32> = x_6.resolution;
+  let x_93 : vec2<f32> = floor(((vec2<f32>(x_87.x, x_87.y) / x_90) * 32.0));
+  x_95_phi = vec4<f32>(0.5, 0.5, 1.0, 1.0);
+  x_98_phi = 0;
+  loop {
+    var x_143 : vec4<f32>;
+    var x_99 : i32;
+    var x_127_phi : bool;
+    var x_96_phi : vec4<f32>;
+    x_95 = x_95_phi;
+    let x_98 : i32 = x_98_phi;
+    if ((x_98 < 8)) {
+    } else {
+      break;
+    }
+    var x_104 : vec4<f32>;
+    x_82 = x_86;
+    x_104 = x_82[x_98];
+    switch(0u) {
+      default: {
+        let x_107 : f32 = x_93.x;
+        let x_108 : f32 = x_104.x;
+        if ((x_107 < x_108)) {
+          x_127_phi = false;
+          break;
+        }
+        let x_112 : f32 = x_93.y;
+        let x_113 : f32 = x_104.y;
+        if ((x_112 < x_113)) {
+          x_127_phi = false;
+          break;
+        }
+        if ((x_107 > (x_108 + x_104.z))) {
+          x_127_phi = false;
+          break;
+        }
+        if ((x_112 > (x_113 + x_104.w))) {
+          x_127_phi = false;
+          break;
+        }
+        x_127_phi = true;
+      }
+    }
+    let x_127 : bool = x_127_phi;
+    x_96_phi = x_95;
+    if (x_127) {
+      x_83 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+      let x_131 : f32 = x_83[x_98].x;
+      x_84 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+      let x_134 : f32 = x_84[x_98].y;
+      let x_135 : array<vec4<f32>, 8> = x_81;
+      x_81 = array<vec4<f32>, 8>(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
+      x_81 = x_135;
+      x_85 = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+      x_143 = x_85[((((i32(x_131) * i32(x_134)) + (x_98 * 9)) + 11) % 16)];
+      x_96_phi = x_143;
+    }
+    let x_96 : vec4<f32> = x_96_phi;
+
+    continuing {
+      x_99 = (x_98 + 1);
+      x_95_phi = x_96;
+      x_98_phi = x_99;
+    }
+  }
+  x_GLF_color = x_95;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/1.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/1.wgsl
new file mode 100644
index 0000000..8f0982f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/1.wgsl
@@ -0,0 +1,103 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_81 : array<vec4<f32>, 8> = array<vec4<f32>, 8>(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
+  var x_82 : array<vec4<f32>, 8>;
+  var x_83 : array<vec4<f32>, 8>;
+  var x_84 : array<vec4<f32>, 8>;
+  var x_85 : array<vec4<f32>, 16>;
+  var x_95 : vec4<f32>;
+  var x_95_phi : vec4<f32>;
+  var x_98_phi : i32;
+  x_81 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+  let x_86 : array<vec4<f32>, 8> = x_81;
+  let x_87 : vec4<f32> = gl_FragCoord;
+  let x_90 : vec2<f32> = x_6.resolution;
+  let x_93 : vec2<f32> = floor(((vec2<f32>(x_87.x, x_87.y) / x_90) * 32.0));
+  x_95_phi = vec4<f32>(0.5, 0.5, 1.0, 1.0);
+  x_98_phi = 0;
+  loop {
+    var x_143 : vec4<f32>;
+    var x_99 : i32;
+    var x_127_phi : bool;
+    var x_96_phi : vec4<f32>;
+    x_95 = x_95_phi;
+    let x_98 : i32 = x_98_phi;
+    if ((x_98 < 8)) {
+    } else {
+      break;
+    }
+    var x_104 : vec4<f32>;
+    x_82 = x_86;
+    x_104 = x_82[x_98];
+    switch(0u) {
+      default: {
+        let x_107 : f32 = x_93.x;
+        let x_108 : f32 = x_104.x;
+        if ((x_107 < x_108)) {
+          x_127_phi = false;
+          break;
+        }
+        let x_112 : f32 = x_93.y;
+        let x_113 : f32 = x_104.y;
+        if ((x_112 < x_113)) {
+          x_127_phi = false;
+          break;
+        }
+        if ((x_107 > (x_108 + x_104.z))) {
+          x_127_phi = false;
+          break;
+        }
+        if ((x_112 > (x_113 + x_104.w))) {
+          x_127_phi = false;
+          break;
+        }
+        x_127_phi = true;
+      }
+    }
+    let x_127 : bool = x_127_phi;
+    x_96_phi = x_95;
+    if (x_127) {
+      x_83 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+      let x_131 : f32 = x_83[x_98].x;
+      x_84 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+      let x_134 : f32 = x_84[x_98].y;
+      let x_135 : array<vec4<f32>, 8> = x_81;
+      x_81 = array<vec4<f32>, 8>(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
+      x_81 = x_135;
+      x_85 = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+      x_143 = x_85[((((i32(x_131) * i32(x_134)) + (x_98 * 9)) + 11) % 16)];
+      x_96_phi = x_143;
+    }
+    let x_96 : vec4<f32> = x_96_phi;
+
+    continuing {
+      x_99 = (x_98 + 1);
+      x_95_phi = x_96;
+      x_98_phi = x_99;
+    }
+  }
+  x_GLF_color = x_95;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..2846e30
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/1.wgsl.expected.hlsl
@@ -0,0 +1,110 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 x_81[8] = {float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)};
+  float4 x_82[8] = (float4[8])0;
+  float4 x_83[8] = (float4[8])0;
+  float4 x_84[8] = (float4[8])0;
+  float4 x_85[16] = (float4[16])0;
+  float4 x_95 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 x_95_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int x_98_phi = 0;
+  const float4 tint_symbol_5[8] = {float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)};
+  x_81 = tint_symbol_5;
+  const float4 x_86[8] = x_81;
+  const float4 x_87 = gl_FragCoord;
+  const float2 x_90 = asfloat(x_6[0].xy);
+  const float2 x_93 = floor(((float2(x_87.x, x_87.y) / x_90) * 32.0f));
+  x_95_phi = float4(0.5f, 0.5f, 1.0f, 1.0f);
+  x_98_phi = 0;
+  while (true) {
+    float4 x_143 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    int x_99 = 0;
+    bool x_127_phi = false;
+    float4 x_96_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    x_95 = x_95_phi;
+    const int x_98 = x_98_phi;
+    if ((x_98 < 8)) {
+    } else {
+      break;
+    }
+    float4 x_104 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    x_82 = x_86;
+    x_104 = x_82[x_98];
+    switch(0u) {
+      default: {
+        const float x_107 = x_93.x;
+        const float x_108 = x_104.x;
+        if ((x_107 < x_108)) {
+          x_127_phi = false;
+          break;
+        }
+        const float x_112 = x_93.y;
+        const float x_113 = x_104.y;
+        if ((x_112 < x_113)) {
+          x_127_phi = false;
+          break;
+        }
+        if ((x_107 > (x_108 + x_104.z))) {
+          x_127_phi = false;
+          break;
+        }
+        if ((x_112 > (x_113 + x_104.w))) {
+          x_127_phi = false;
+          break;
+        }
+        x_127_phi = true;
+        break;
+      }
+    }
+    const bool x_127 = x_127_phi;
+    x_96_phi = x_95;
+    if (x_127) {
+      const float4 tint_symbol_6[8] = {float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)};
+      x_83 = tint_symbol_6;
+      const float x_131 = x_83[x_98].x;
+      const float4 tint_symbol_7[8] = {float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)};
+      x_84 = tint_symbol_7;
+      const float x_134 = x_84[x_98].y;
+      const float4 x_135[8] = x_81;
+      const float4 tint_symbol_8[8] = {float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)};
+      x_81 = tint_symbol_8;
+      x_81 = x_135;
+      const float4 tint_symbol_9[16] = {float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)};
+      x_85 = tint_symbol_9;
+      x_143 = x_85[((((int(x_131) * int(x_134)) + (x_98 * 9)) + 11) % 16)];
+      x_96_phi = x_143;
+    }
+    const float4 x_96 = x_96_phi;
+    {
+      x_99 = (x_98 + 1);
+      x_95_phi = x_96;
+      x_98_phi = x_99;
+    }
+  }
+  x_GLF_color = x_95;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_10 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_10;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/1.wgsl.expected.msl
new file mode 100644
index 0000000..c69c232
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/1.wgsl.expected.msl
@@ -0,0 +1,115 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  float4 arr[8];
+};
+struct tint_array_wrapper_1 {
+  float4 arr[16];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_10, thread float4* const tint_symbol_11) {
+  tint_array_wrapper x_81 = {.arr={float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)}};
+  tint_array_wrapper x_82 = {};
+  tint_array_wrapper x_83 = {};
+  tint_array_wrapper x_84 = {};
+  tint_array_wrapper_1 x_85 = {};
+  float4 x_95 = 0.0f;
+  float4 x_95_phi = 0.0f;
+  int x_98_phi = 0;
+  tint_array_wrapper const tint_symbol_4 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
+  x_81 = tint_symbol_4;
+  tint_array_wrapper const x_86 = x_81;
+  float4 const x_87 = *(tint_symbol_10);
+  float2 const x_90 = x_6.resolution;
+  float2 const x_93 = floor(((float2(x_87.x, x_87.y) / x_90) * 32.0f));
+  x_95_phi = float4(0.5f, 0.5f, 1.0f, 1.0f);
+  x_98_phi = 0;
+  while (true) {
+    float4 x_143 = 0.0f;
+    int x_99 = 0;
+    bool x_127_phi = false;
+    float4 x_96_phi = 0.0f;
+    x_95 = x_95_phi;
+    int const x_98 = x_98_phi;
+    if ((x_98 < 8)) {
+    } else {
+      break;
+    }
+    float4 x_104 = 0.0f;
+    x_82 = x_86;
+    x_104 = x_82.arr[x_98];
+    switch(0u) {
+      default: {
+        float const x_107 = x_93.x;
+        float const x_108 = x_104.x;
+        if ((x_107 < x_108)) {
+          x_127_phi = false;
+          break;
+        }
+        float const x_112 = x_93.y;
+        float const x_113 = x_104.y;
+        if ((x_112 < x_113)) {
+          x_127_phi = false;
+          break;
+        }
+        if ((x_107 > (x_108 + x_104.z))) {
+          x_127_phi = false;
+          break;
+        }
+        if ((x_112 > (x_113 + x_104.w))) {
+          x_127_phi = false;
+          break;
+        }
+        x_127_phi = true;
+        break;
+      }
+    }
+    bool const x_127 = x_127_phi;
+    x_96_phi = x_95;
+    if (x_127) {
+      tint_array_wrapper const tint_symbol_5 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
+      x_83 = tint_symbol_5;
+      float const x_131 = x_83.arr[x_98].x;
+      tint_array_wrapper const tint_symbol_6 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
+      x_84 = tint_symbol_6;
+      float const x_134 = x_84.arr[x_98].y;
+      tint_array_wrapper const x_135 = x_81;
+      tint_array_wrapper const tint_symbol_7 = {.arr={float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)}};
+      x_81 = tint_symbol_7;
+      x_81 = x_135;
+      tint_array_wrapper_1 const tint_symbol_8 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
+      x_85 = tint_symbol_8;
+      x_143 = x_85.arr[((((int(x_131) * int(x_134)) + (x_98 * 9)) + 11) % 16)];
+      x_96_phi = x_143;
+    }
+    float4 const x_96 = x_96_phi;
+    {
+      x_99 = (x_98 + 1);
+      x_95_phi = x_96;
+      x_98_phi = x_99;
+    }
+  }
+  *(tint_symbol_11) = x_95;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_12 = 0.0f;
+  thread float4 tint_symbol_13 = 0.0f;
+  tint_symbol_12 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_12), &(tint_symbol_13));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_13};
+  tint_symbol_2 const tint_symbol_9 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_9;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..5d0f00b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/1.wgsl.expected.spvasm
@@ -0,0 +1,290 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 187
+; Schema: 0
+               OpCapability Shader
+         %67 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %x_81 "x_81"
+               OpName %x_82 "x_82"
+               OpName %x_83 "x_83"
+               OpName %x_84 "x_84"
+               OpName %x_85 "x_85"
+               OpName %x_95 "x_95"
+               OpName %x_95_phi "x_95_phi"
+               OpName %x_98_phi "x_98_phi"
+               OpName %x_143 "x_143"
+               OpName %x_99 "x_99"
+               OpName %x_127_phi "x_127_phi"
+               OpName %x_96_phi "x_96_phi"
+               OpName %x_104 "x_104"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v4float_uint_8 ArrayStride 16
+               OpDecorate %_arr_v4float_uint_16 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_8 = OpConstant %uint 8
+%_arr_v4float_uint_8 = OpTypeArray %v4float %uint_8
+    %float_0 = OpConstant %float 0
+         %23 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+         %24 = OpConstantComposite %_arr_v4float_uint_8 %23 %23 %23 %23 %23 %23 %23 %23
+%_ptr_Function__arr_v4float_uint_8 = OpTypePointer Function %_arr_v4float_uint_8
+         %27 = OpConstantNull %_arr_v4float_uint_8
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+         %35 = OpConstantNull %_arr_v4float_uint_16
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %42 = OpConstantNull %int
+    %float_4 = OpConstant %float 4
+   %float_20 = OpConstant %float 20
+         %45 = OpConstantComposite %v4float %float_4 %float_4 %float_20 %float_4
+         %46 = OpConstantComposite %v4float %float_4 %float_4 %float_4 %float_20
+         %47 = OpConstantComposite %v4float %float_4 %float_20 %float_20 %float_4
+    %float_8 = OpConstant %float 8
+         %49 = OpConstantComposite %v4float %float_20 %float_4 %float_4 %float_8
+    %float_6 = OpConstant %float 6
+    %float_2 = OpConstant %float 2
+         %52 = OpConstantComposite %v4float %float_8 %float_6 %float_4 %float_2
+   %float_12 = OpConstant %float 12
+         %54 = OpConstantComposite %v4float %float_2 %float_12 %float_2 %float_4
+   %float_16 = OpConstant %float 16
+         %56 = OpConstantComposite %v4float %float_16 %float_2 %float_4 %float_4
+   %float_22 = OpConstant %float 22
+         %58 = OpConstantComposite %v4float %float_12 %float_22 %float_4 %float_4
+         %59 = OpConstantComposite %_arr_v4float_uint_8 %45 %46 %47 %49 %52 %54 %56 %58
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+   %float_32 = OpConstant %float 32
+  %float_0_5 = OpConstant %float 0.5
+    %float_1 = OpConstant %float 1
+         %76 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_1 %float_1
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %87 = OpConstantNull %bool
+      %int_8 = OpConstant %int 8
+%_ptr_Function_float = OpTypePointer Function %float
+      %false = OpConstantFalse %bool
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+     %uint_3 = OpConstant %uint 3
+       %true = OpConstantTrue %bool
+        %140 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+        %141 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+        %142 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+        %143 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+        %144 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+        %145 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+        %146 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+        %147 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+        %148 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %149 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+        %150 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+        %151 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+        %152 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+        %153 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+        %154 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+        %155 = OpConstantComposite %_arr_v4float_uint_16 %140 %141 %142 %143 %144 %145 %146 %147 %140 %148 %149 %150 %151 %152 %153 %154
+      %int_9 = OpConstant %int 9
+     %int_11 = OpConstant %int 11
+     %int_16 = OpConstant %int 16
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+        %174 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+       %x_81 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %27
+       %x_82 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %27
+       %x_83 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %27
+       %x_84 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %27
+       %x_85 = OpVariable %_ptr_Function__arr_v4float_uint_16 Function %35
+       %x_95 = OpVariable %_ptr_Function_v4float Function %5
+   %x_95_phi = OpVariable %_ptr_Function_v4float Function %5
+   %x_98_phi = OpVariable %_ptr_Function_int Function %42
+      %x_143 = OpVariable %_ptr_Function_v4float Function %5
+       %x_99 = OpVariable %_ptr_Function_int Function %42
+  %x_127_phi = OpVariable %_ptr_Function_bool Function %87
+   %x_96_phi = OpVariable %_ptr_Function_v4float Function %5
+      %x_104 = OpVariable %_ptr_Function_v4float Function %5
+               OpStore %x_81 %24
+               OpStore %x_81 %59
+         %60 = OpLoad %_arr_v4float_uint_8 %x_81
+         %61 = OpLoad %v4float %gl_FragCoord
+         %64 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %65 = OpLoad %v2float %64
+         %68 = OpCompositeExtract %float %61 0
+         %69 = OpCompositeExtract %float %61 1
+         %70 = OpCompositeConstruct %v2float %68 %69
+         %71 = OpFDiv %v2float %70 %65
+         %73 = OpVectorTimesScalar %v2float %71 %float_32
+         %66 = OpExtInst %v2float %67 Floor %73
+               OpStore %x_95_phi %76
+               OpStore %x_98_phi %int_0
+               OpBranch %78
+         %78 = OpLabel
+               OpLoopMerge %79 %80 None
+               OpBranch %81
+         %81 = OpLabel
+         %89 = OpLoad %v4float %x_95_phi
+               OpStore %x_95 %89
+         %90 = OpLoad %int %x_98_phi
+         %92 = OpSLessThan %bool %90 %int_8
+               OpSelectionMerge %93 None
+               OpBranchConditional %92 %94 %95
+         %94 = OpLabel
+               OpBranch %93
+         %95 = OpLabel
+               OpBranch %79
+         %93 = OpLabel
+               OpStore %x_82 %60
+         %97 = OpAccessChain %_ptr_Function_v4float %x_82 %90
+         %98 = OpLoad %v4float %97
+               OpStore %x_104 %98
+               OpSelectionMerge %99 None
+               OpSwitch %uint_0 %100
+        %100 = OpLabel
+        %101 = OpCompositeExtract %float %66 0
+        %103 = OpAccessChain %_ptr_Function_float %x_104 %uint_0
+        %104 = OpLoad %float %103
+        %105 = OpFOrdLessThan %bool %101 %104
+               OpSelectionMerge %106 None
+               OpBranchConditional %105 %107 %106
+        %107 = OpLabel
+               OpStore %x_127_phi %false
+               OpBranch %99
+        %106 = OpLabel
+        %109 = OpCompositeExtract %float %66 1
+        %111 = OpAccessChain %_ptr_Function_float %x_104 %uint_1
+        %112 = OpLoad %float %111
+        %113 = OpFOrdLessThan %bool %109 %112
+               OpSelectionMerge %114 None
+               OpBranchConditional %113 %115 %114
+        %115 = OpLabel
+               OpStore %x_127_phi %false
+               OpBranch %99
+        %114 = OpLabel
+        %117 = OpAccessChain %_ptr_Function_float %x_104 %uint_2
+        %118 = OpLoad %float %117
+        %119 = OpFAdd %float %104 %118
+        %120 = OpFOrdGreaterThan %bool %101 %119
+               OpSelectionMerge %121 None
+               OpBranchConditional %120 %122 %121
+        %122 = OpLabel
+               OpStore %x_127_phi %false
+               OpBranch %99
+        %121 = OpLabel
+        %124 = OpAccessChain %_ptr_Function_float %x_104 %uint_3
+        %125 = OpLoad %float %124
+        %126 = OpFAdd %float %112 %125
+        %127 = OpFOrdGreaterThan %bool %109 %126
+               OpSelectionMerge %128 None
+               OpBranchConditional %127 %129 %128
+        %129 = OpLabel
+               OpStore %x_127_phi %false
+               OpBranch %99
+        %128 = OpLabel
+               OpStore %x_127_phi %true
+               OpBranch %99
+         %99 = OpLabel
+        %131 = OpLoad %bool %x_127_phi
+        %132 = OpLoad %v4float %x_95
+               OpStore %x_96_phi %132
+               OpSelectionMerge %133 None
+               OpBranchConditional %131 %134 %133
+        %134 = OpLabel
+               OpStore %x_83 %59
+        %135 = OpAccessChain %_ptr_Function_float %x_83 %90 %uint_0
+        %136 = OpLoad %float %135
+               OpStore %x_84 %59
+        %137 = OpAccessChain %_ptr_Function_float %x_84 %90 %uint_1
+        %138 = OpLoad %float %137
+        %139 = OpLoad %_arr_v4float_uint_8 %x_81
+               OpStore %x_81 %24
+               OpStore %x_81 %139
+               OpStore %x_85 %155
+        %156 = OpConvertFToS %int %136
+        %157 = OpConvertFToS %int %138
+        %158 = OpIMul %int %156 %157
+        %160 = OpIMul %int %90 %int_9
+        %161 = OpIAdd %int %158 %160
+        %163 = OpIAdd %int %161 %int_11
+        %165 = OpSMod %int %163 %int_16
+        %166 = OpAccessChain %_ptr_Function_v4float %x_85 %165
+        %167 = OpLoad %v4float %166
+               OpStore %x_143 %167
+        %168 = OpLoad %v4float %x_143
+               OpStore %x_96_phi %168
+               OpBranch %133
+        %133 = OpLabel
+        %169 = OpLoad %v4float %x_96_phi
+               OpBranch %80
+         %80 = OpLabel
+        %171 = OpIAdd %int %90 %int_1
+               OpStore %x_99 %171
+               OpStore %x_95_phi %169
+        %172 = OpLoad %int %x_99
+               OpStore %x_98_phi %172
+               OpBranch %78
+         %79 = OpLabel
+        %173 = OpLoad %v4float %x_95
+               OpStore %x_GLF_color %173
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %174
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %178 = OpLabel
+        %179 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %179
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %181 = OpLabel
+        %182 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %182
+        %183 = OpFunctionCall %void %main_1
+        %185 = OpLoad %v4float %x_GLF_color
+        %186 = OpCompositeConstruct %main_out %185
+        %184 = OpFunctionCall %void %tint_symbol_3 %186
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..8f0982f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/1.wgsl.expected.wgsl
@@ -0,0 +1,103 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_81 : array<vec4<f32>, 8> = array<vec4<f32>, 8>(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
+  var x_82 : array<vec4<f32>, 8>;
+  var x_83 : array<vec4<f32>, 8>;
+  var x_84 : array<vec4<f32>, 8>;
+  var x_85 : array<vec4<f32>, 16>;
+  var x_95 : vec4<f32>;
+  var x_95_phi : vec4<f32>;
+  var x_98_phi : i32;
+  x_81 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+  let x_86 : array<vec4<f32>, 8> = x_81;
+  let x_87 : vec4<f32> = gl_FragCoord;
+  let x_90 : vec2<f32> = x_6.resolution;
+  let x_93 : vec2<f32> = floor(((vec2<f32>(x_87.x, x_87.y) / x_90) * 32.0));
+  x_95_phi = vec4<f32>(0.5, 0.5, 1.0, 1.0);
+  x_98_phi = 0;
+  loop {
+    var x_143 : vec4<f32>;
+    var x_99 : i32;
+    var x_127_phi : bool;
+    var x_96_phi : vec4<f32>;
+    x_95 = x_95_phi;
+    let x_98 : i32 = x_98_phi;
+    if ((x_98 < 8)) {
+    } else {
+      break;
+    }
+    var x_104 : vec4<f32>;
+    x_82 = x_86;
+    x_104 = x_82[x_98];
+    switch(0u) {
+      default: {
+        let x_107 : f32 = x_93.x;
+        let x_108 : f32 = x_104.x;
+        if ((x_107 < x_108)) {
+          x_127_phi = false;
+          break;
+        }
+        let x_112 : f32 = x_93.y;
+        let x_113 : f32 = x_104.y;
+        if ((x_112 < x_113)) {
+          x_127_phi = false;
+          break;
+        }
+        if ((x_107 > (x_108 + x_104.z))) {
+          x_127_phi = false;
+          break;
+        }
+        if ((x_112 > (x_113 + x_104.w))) {
+          x_127_phi = false;
+          break;
+        }
+        x_127_phi = true;
+      }
+    }
+    let x_127 : bool = x_127_phi;
+    x_96_phi = x_95;
+    if (x_127) {
+      x_83 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+      let x_131 : f32 = x_83[x_98].x;
+      x_84 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+      let x_134 : f32 = x_84[x_98].y;
+      let x_135 : array<vec4<f32>, 8> = x_81;
+      x_81 = array<vec4<f32>, 8>(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
+      x_81 = x_135;
+      x_85 = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+      x_143 = x_85[((((i32(x_131) * i32(x_134)) + (x_98 * 9)) + 11) % 16)];
+      x_96_phi = x_143;
+    }
+    let x_96 : vec4<f32> = x_96_phi;
+
+    continuing {
+      x_99 = (x_98 + 1);
+      x_95_phi = x_96;
+      x_98_phi = x_99;
+    }
+  }
+  x_GLF_color = x_95;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/2.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/2.spvasm
new file mode 100644
index 0000000..7ef0dcd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/2.spvasm
@@ -0,0 +1,190 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+      %false = OpConstantFalse %bool
+     %uint_1 = OpConstant %uint 1
+       %true = OpConstantTrue %bool
+  %float_0_5 = OpConstant %float 0.5
+    %float_1 = OpConstant %float 1
+         %22 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_1 %float_1
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_8 = OpConstant %int 8
+     %uint_8 = OpConstant %uint 8
+%_arr_v4float_uint_8 = OpTypeArray %v4float %uint_8
+    %float_4 = OpConstant %float 4
+   %float_20 = OpConstant %float 20
+         %30 = OpConstantComposite %v4float %float_4 %float_4 %float_20 %float_4
+         %31 = OpConstantComposite %v4float %float_4 %float_4 %float_4 %float_20
+         %32 = OpConstantComposite %v4float %float_4 %float_20 %float_20 %float_4
+    %float_8 = OpConstant %float 8
+         %34 = OpConstantComposite %v4float %float_20 %float_4 %float_4 %float_8
+    %float_6 = OpConstant %float 6
+    %float_2 = OpConstant %float 2
+         %37 = OpConstantComposite %v4float %float_8 %float_6 %float_4 %float_2
+   %float_12 = OpConstant %float 12
+         %39 = OpConstantComposite %v4float %float_2 %float_12 %float_2 %float_4
+   %float_16 = OpConstant %float 16
+         %41 = OpConstantComposite %v4float %float_16 %float_2 %float_4 %float_4
+   %float_22 = OpConstant %float 22
+         %43 = OpConstantComposite %v4float %float_12 %float_22 %float_4 %float_4
+         %44 = OpConstantComposite %_arr_v4float_uint_8 %30 %31 %32 %34 %37 %39 %41 %43
+%_ptr_Function__arr_v4float_uint_8 = OpTypePointer Function %_arr_v4float_uint_8
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+    %float_0 = OpConstant %float 0
+         %49 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+         %50 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+         %51 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+         %52 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+         %53 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+         %54 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+         %55 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+         %56 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+         %57 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %58 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+         %59 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+         %60 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+         %61 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+         %62 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+         %63 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+         %64 = OpConstantComposite %_arr_v4float_uint_16 %49 %50 %51 %52 %53 %54 %55 %56 %49 %57 %58 %59 %60 %61 %62 %63
+      %int_9 = OpConstant %int 9
+     %int_11 = OpConstant %int 11
+     %int_16 = OpConstant %int 16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+      %int_1 = OpConstant %int 1
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+   %float_32 = OpConstant %float 32
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %75 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+         %76 = OpConstantComposite %_arr_v4float_uint_8 %75 %75 %75 %75 %75 %75 %75 %75
+  %float_0_0 = OpConstant %float 0
+         %78 = OpConstantComposite %v4float %float_0_0 %float_0_0 %float_0_0 %float_0_0
+         %79 = OpConstantComposite %_arr_v4float_uint_8 %78 %78 %78 %78 %78 %78 %78 %78
+       %main = OpFunction %void None %8
+         %80 = OpLabel
+         %81 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %76
+         %82 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function
+         %83 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function
+         %84 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function
+         %85 = OpVariable %_ptr_Function__arr_v4float_uint_16 Function
+               OpStore %81 %44
+         %86 = OpLoad %_arr_v4float_uint_8 %81
+         %87 = OpLoad %v4float %gl_FragCoord
+         %88 = OpVectorShuffle %v2float %87 %87 0 1
+         %89 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+         %90 = OpLoad %v2float %89
+         %91 = OpFDiv %v2float %88 %90
+         %92 = OpVectorTimesScalar %v2float %91 %float_32
+         %93 = OpExtInst %v2float %1 Floor %92
+               OpBranch %94
+         %94 = OpLabel
+         %95 = OpPhi %v4float %22 %80 %96 %97
+         %98 = OpPhi %int %int_0 %80 %99 %97
+        %100 = OpSLessThan %bool %98 %int_8
+               OpLoopMerge %101 %97 None
+               OpBranchConditional %100 %102 %101
+        %102 = OpLabel
+               OpStore %82 %86
+        %103 = OpAccessChain %_ptr_Function_v4float %82 %98
+        %104 = OpLoad %v4float %103
+               OpSelectionMerge %105 None
+               OpSwitch %uint_0 %106
+        %106 = OpLabel
+        %107 = OpCompositeExtract %float %93 0
+        %108 = OpCompositeExtract %float %104 0
+        %109 = OpFOrdLessThan %bool %107 %108
+               OpSelectionMerge %110 None
+               OpBranchConditional %109 %111 %110
+        %111 = OpLabel
+               OpBranch %105
+        %110 = OpLabel
+        %112 = OpCompositeExtract %float %93 1
+        %113 = OpCompositeExtract %float %104 1
+        %114 = OpFOrdLessThan %bool %112 %113
+               OpSelectionMerge %115 None
+               OpBranchConditional %114 %116 %115
+        %116 = OpLabel
+               OpBranch %105
+        %115 = OpLabel
+        %117 = OpCompositeExtract %float %104 2
+        %118 = OpFAdd %float %108 %117
+        %119 = OpFOrdGreaterThan %bool %107 %118
+               OpSelectionMerge %120 None
+               OpBranchConditional %119 %121 %120
+        %121 = OpLabel
+               OpBranch %105
+        %120 = OpLabel
+        %122 = OpCompositeExtract %float %104 3
+        %123 = OpFAdd %float %113 %122
+        %124 = OpFOrdGreaterThan %bool %112 %123
+               OpSelectionMerge %125 None
+               OpBranchConditional %124 %126 %125
+        %126 = OpLabel
+               OpBranch %105
+        %125 = OpLabel
+               OpBranch %105
+        %105 = OpLabel
+        %127 = OpPhi %bool %false %111 %false %116 %false %121 %false %126 %true %125
+               OpSelectionMerge %128 None
+               OpBranchConditional %127 %129 %128
+        %129 = OpLabel
+               OpStore %83 %44
+        %130 = OpAccessChain %_ptr_Function_float %83 %98 %uint_0
+        %131 = OpLoad %float %130
+        %132 = OpConvertFToS %int %131
+               OpStore %84 %44
+        %133 = OpAccessChain %_ptr_Function_float %84 %98 %uint_1
+        %134 = OpLoad %float %133
+        %135 = OpConvertFToS %int %134
+        %136 = OpIMul %int %132 %135
+        %137 = OpIMul %int %98 %int_9
+        %138 = OpIAdd %int %136 %137
+        %139 = OpIAdd %int %138 %int_11
+        %140 = OpSMod %int %139 %int_16
+               OpStore %85 %64
+        %141 = OpAccessChain %_ptr_Function_v4float %85 %140
+        %142 = OpLoad %v4float %141
+               OpBranch %128
+        %128 = OpLabel
+         %96 = OpPhi %v4float %95 %105 %142 %129
+               OpBranch %97
+         %97 = OpLabel
+         %99 = OpIAdd %int %98 %int_1
+               OpBranch %94
+        %101 = OpLabel
+               OpStore %_GLF_color %95
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/2.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/2.spvasm.expected.hlsl
new file mode 100644
index 0000000..d50630e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/2.spvasm.expected.hlsl
@@ -0,0 +1,106 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 x_81[8] = {float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)};
+  float4 x_82[8] = (float4[8])0;
+  float4 x_83[8] = (float4[8])0;
+  float4 x_84[8] = (float4[8])0;
+  float4 x_85[16] = (float4[16])0;
+  float4 x_95 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 x_95_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int x_98_phi = 0;
+  const float4 tint_symbol_5[8] = {float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)};
+  x_81 = tint_symbol_5;
+  const float4 x_86[8] = x_81;
+  const float4 x_87 = gl_FragCoord;
+  const float2 x_90 = asfloat(x_6[0].xy);
+  const float2 x_93 = floor(((float2(x_87.x, x_87.y) / x_90) * 32.0f));
+  x_95_phi = float4(0.5f, 0.5f, 1.0f, 1.0f);
+  x_98_phi = 0;
+  while (true) {
+    float4 x_142 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    int x_99 = 0;
+    bool x_127_phi = false;
+    float4 x_96_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    x_95 = x_95_phi;
+    const int x_98 = x_98_phi;
+    if ((x_98 < 8)) {
+    } else {
+      break;
+    }
+    float4 x_104 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    x_82 = x_86;
+    x_104 = x_82[x_98];
+    switch(0u) {
+      default: {
+        const float x_107 = x_93.x;
+        const float x_108 = x_104.x;
+        if ((x_107 < x_108)) {
+          x_127_phi = false;
+          break;
+        }
+        const float x_112 = x_93.y;
+        const float x_113 = x_104.y;
+        if ((x_112 < x_113)) {
+          x_127_phi = false;
+          break;
+        }
+        if ((x_107 > (x_108 + x_104.z))) {
+          x_127_phi = false;
+          break;
+        }
+        if ((x_112 > (x_113 + x_104.w))) {
+          x_127_phi = false;
+          break;
+        }
+        x_127_phi = true;
+        break;
+      }
+    }
+    const bool x_127 = x_127_phi;
+    x_96_phi = x_95;
+    if (x_127) {
+      const float4 tint_symbol_6[8] = {float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)};
+      x_83 = tint_symbol_6;
+      const float x_131 = x_83[x_98].x;
+      const float4 tint_symbol_7[8] = {float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)};
+      x_84 = tint_symbol_7;
+      const float x_134 = x_84[x_98].y;
+      const float4 tint_symbol_8[16] = {float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)};
+      x_85 = tint_symbol_8;
+      x_142 = x_85[((((int(x_131) * int(x_134)) + (x_98 * 9)) + 11) % 16)];
+      x_96_phi = x_142;
+    }
+    const float4 x_96 = x_96_phi;
+    {
+      x_99 = (x_98 + 1);
+      x_95_phi = x_96;
+      x_98_phi = x_99;
+    }
+  }
+  x_GLF_color = x_95;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_9 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_9;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/2.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/2.spvasm.expected.msl
new file mode 100644
index 0000000..f5eb2e7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/2.spvasm.expected.msl
@@ -0,0 +1,111 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  float4 arr[8];
+};
+struct tint_array_wrapper_1 {
+  float4 arr[16];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10) {
+  tint_array_wrapper x_81 = {.arr={float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)}};
+  tint_array_wrapper x_82 = {};
+  tint_array_wrapper x_83 = {};
+  tint_array_wrapper x_84 = {};
+  tint_array_wrapper_1 x_85 = {};
+  float4 x_95 = 0.0f;
+  float4 x_95_phi = 0.0f;
+  int x_98_phi = 0;
+  tint_array_wrapper const tint_symbol_4 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
+  x_81 = tint_symbol_4;
+  tint_array_wrapper const x_86 = x_81;
+  float4 const x_87 = *(tint_symbol_9);
+  float2 const x_90 = x_6.resolution;
+  float2 const x_93 = floor(((float2(x_87.x, x_87.y) / x_90) * 32.0f));
+  x_95_phi = float4(0.5f, 0.5f, 1.0f, 1.0f);
+  x_98_phi = 0;
+  while (true) {
+    float4 x_142 = 0.0f;
+    int x_99 = 0;
+    bool x_127_phi = false;
+    float4 x_96_phi = 0.0f;
+    x_95 = x_95_phi;
+    int const x_98 = x_98_phi;
+    if ((x_98 < 8)) {
+    } else {
+      break;
+    }
+    float4 x_104 = 0.0f;
+    x_82 = x_86;
+    x_104 = x_82.arr[x_98];
+    switch(0u) {
+      default: {
+        float const x_107 = x_93.x;
+        float const x_108 = x_104.x;
+        if ((x_107 < x_108)) {
+          x_127_phi = false;
+          break;
+        }
+        float const x_112 = x_93.y;
+        float const x_113 = x_104.y;
+        if ((x_112 < x_113)) {
+          x_127_phi = false;
+          break;
+        }
+        if ((x_107 > (x_108 + x_104.z))) {
+          x_127_phi = false;
+          break;
+        }
+        if ((x_112 > (x_113 + x_104.w))) {
+          x_127_phi = false;
+          break;
+        }
+        x_127_phi = true;
+        break;
+      }
+    }
+    bool const x_127 = x_127_phi;
+    x_96_phi = x_95;
+    if (x_127) {
+      tint_array_wrapper const tint_symbol_5 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
+      x_83 = tint_symbol_5;
+      float const x_131 = x_83.arr[x_98].x;
+      tint_array_wrapper const tint_symbol_6 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
+      x_84 = tint_symbol_6;
+      float const x_134 = x_84.arr[x_98].y;
+      tint_array_wrapper_1 const tint_symbol_7 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
+      x_85 = tint_symbol_7;
+      x_142 = x_85.arr[((((int(x_131) * int(x_134)) + (x_98 * 9)) + 11) % 16)];
+      x_96_phi = x_142;
+    }
+    float4 const x_96 = x_96_phi;
+    {
+      x_99 = (x_98 + 1);
+      x_95_phi = x_96;
+      x_98_phi = x_99;
+    }
+  }
+  *(tint_symbol_10) = x_95;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_11 = 0.0f;
+  thread float4 tint_symbol_12 = 0.0f;
+  tint_symbol_11 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_11), &(tint_symbol_12));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_12};
+  tint_symbol_2 const tint_symbol_8 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_8;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/2.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/2.spvasm.expected.spvasm
new file mode 100644
index 0000000..4ef0500
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/2.spvasm.expected.spvasm
@@ -0,0 +1,287 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 186
+; Schema: 0
+               OpCapability Shader
+         %67 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %x_81 "x_81"
+               OpName %x_82 "x_82"
+               OpName %x_83 "x_83"
+               OpName %x_84 "x_84"
+               OpName %x_85 "x_85"
+               OpName %x_95 "x_95"
+               OpName %x_95_phi "x_95_phi"
+               OpName %x_98_phi "x_98_phi"
+               OpName %x_142 "x_142"
+               OpName %x_99 "x_99"
+               OpName %x_127_phi "x_127_phi"
+               OpName %x_96_phi "x_96_phi"
+               OpName %x_104 "x_104"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v4float_uint_8 ArrayStride 16
+               OpDecorate %_arr_v4float_uint_16 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_8 = OpConstant %uint 8
+%_arr_v4float_uint_8 = OpTypeArray %v4float %uint_8
+    %float_0 = OpConstant %float 0
+         %23 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+         %24 = OpConstantComposite %_arr_v4float_uint_8 %23 %23 %23 %23 %23 %23 %23 %23
+%_ptr_Function__arr_v4float_uint_8 = OpTypePointer Function %_arr_v4float_uint_8
+         %27 = OpConstantNull %_arr_v4float_uint_8
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+         %35 = OpConstantNull %_arr_v4float_uint_16
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %42 = OpConstantNull %int
+    %float_4 = OpConstant %float 4
+   %float_20 = OpConstant %float 20
+         %45 = OpConstantComposite %v4float %float_4 %float_4 %float_20 %float_4
+         %46 = OpConstantComposite %v4float %float_4 %float_4 %float_4 %float_20
+         %47 = OpConstantComposite %v4float %float_4 %float_20 %float_20 %float_4
+    %float_8 = OpConstant %float 8
+         %49 = OpConstantComposite %v4float %float_20 %float_4 %float_4 %float_8
+    %float_6 = OpConstant %float 6
+    %float_2 = OpConstant %float 2
+         %52 = OpConstantComposite %v4float %float_8 %float_6 %float_4 %float_2
+   %float_12 = OpConstant %float 12
+         %54 = OpConstantComposite %v4float %float_2 %float_12 %float_2 %float_4
+   %float_16 = OpConstant %float 16
+         %56 = OpConstantComposite %v4float %float_16 %float_2 %float_4 %float_4
+   %float_22 = OpConstant %float 22
+         %58 = OpConstantComposite %v4float %float_12 %float_22 %float_4 %float_4
+         %59 = OpConstantComposite %_arr_v4float_uint_8 %45 %46 %47 %49 %52 %54 %56 %58
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+   %float_32 = OpConstant %float 32
+  %float_0_5 = OpConstant %float 0.5
+    %float_1 = OpConstant %float 1
+         %76 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_1 %float_1
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %87 = OpConstantNull %bool
+      %int_8 = OpConstant %int 8
+%_ptr_Function_float = OpTypePointer Function %float
+      %false = OpConstantFalse %bool
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+     %uint_3 = OpConstant %uint 3
+       %true = OpConstantTrue %bool
+        %139 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+        %140 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+        %141 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+        %142 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+        %143 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+        %144 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+        %145 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+        %146 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+        %147 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %148 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+        %149 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+        %150 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+        %151 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+        %152 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+        %153 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+        %154 = OpConstantComposite %_arr_v4float_uint_16 %139 %140 %141 %142 %143 %144 %145 %146 %139 %147 %148 %149 %150 %151 %152 %153
+      %int_9 = OpConstant %int 9
+     %int_11 = OpConstant %int 11
+     %int_16 = OpConstant %int 16
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+        %173 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+       %x_81 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %27
+       %x_82 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %27
+       %x_83 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %27
+       %x_84 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %27
+       %x_85 = OpVariable %_ptr_Function__arr_v4float_uint_16 Function %35
+       %x_95 = OpVariable %_ptr_Function_v4float Function %5
+   %x_95_phi = OpVariable %_ptr_Function_v4float Function %5
+   %x_98_phi = OpVariable %_ptr_Function_int Function %42
+      %x_142 = OpVariable %_ptr_Function_v4float Function %5
+       %x_99 = OpVariable %_ptr_Function_int Function %42
+  %x_127_phi = OpVariable %_ptr_Function_bool Function %87
+   %x_96_phi = OpVariable %_ptr_Function_v4float Function %5
+      %x_104 = OpVariable %_ptr_Function_v4float Function %5
+               OpStore %x_81 %24
+               OpStore %x_81 %59
+         %60 = OpLoad %_arr_v4float_uint_8 %x_81
+         %61 = OpLoad %v4float %gl_FragCoord
+         %64 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %65 = OpLoad %v2float %64
+         %68 = OpCompositeExtract %float %61 0
+         %69 = OpCompositeExtract %float %61 1
+         %70 = OpCompositeConstruct %v2float %68 %69
+         %71 = OpFDiv %v2float %70 %65
+         %73 = OpVectorTimesScalar %v2float %71 %float_32
+         %66 = OpExtInst %v2float %67 Floor %73
+               OpStore %x_95_phi %76
+               OpStore %x_98_phi %int_0
+               OpBranch %78
+         %78 = OpLabel
+               OpLoopMerge %79 %80 None
+               OpBranch %81
+         %81 = OpLabel
+         %89 = OpLoad %v4float %x_95_phi
+               OpStore %x_95 %89
+         %90 = OpLoad %int %x_98_phi
+         %92 = OpSLessThan %bool %90 %int_8
+               OpSelectionMerge %93 None
+               OpBranchConditional %92 %94 %95
+         %94 = OpLabel
+               OpBranch %93
+         %95 = OpLabel
+               OpBranch %79
+         %93 = OpLabel
+               OpStore %x_82 %60
+         %97 = OpAccessChain %_ptr_Function_v4float %x_82 %90
+         %98 = OpLoad %v4float %97
+               OpStore %x_104 %98
+               OpSelectionMerge %99 None
+               OpSwitch %uint_0 %100
+        %100 = OpLabel
+        %101 = OpCompositeExtract %float %66 0
+        %103 = OpAccessChain %_ptr_Function_float %x_104 %uint_0
+        %104 = OpLoad %float %103
+        %105 = OpFOrdLessThan %bool %101 %104
+               OpSelectionMerge %106 None
+               OpBranchConditional %105 %107 %106
+        %107 = OpLabel
+               OpStore %x_127_phi %false
+               OpBranch %99
+        %106 = OpLabel
+        %109 = OpCompositeExtract %float %66 1
+        %111 = OpAccessChain %_ptr_Function_float %x_104 %uint_1
+        %112 = OpLoad %float %111
+        %113 = OpFOrdLessThan %bool %109 %112
+               OpSelectionMerge %114 None
+               OpBranchConditional %113 %115 %114
+        %115 = OpLabel
+               OpStore %x_127_phi %false
+               OpBranch %99
+        %114 = OpLabel
+        %117 = OpAccessChain %_ptr_Function_float %x_104 %uint_2
+        %118 = OpLoad %float %117
+        %119 = OpFAdd %float %104 %118
+        %120 = OpFOrdGreaterThan %bool %101 %119
+               OpSelectionMerge %121 None
+               OpBranchConditional %120 %122 %121
+        %122 = OpLabel
+               OpStore %x_127_phi %false
+               OpBranch %99
+        %121 = OpLabel
+        %124 = OpAccessChain %_ptr_Function_float %x_104 %uint_3
+        %125 = OpLoad %float %124
+        %126 = OpFAdd %float %112 %125
+        %127 = OpFOrdGreaterThan %bool %109 %126
+               OpSelectionMerge %128 None
+               OpBranchConditional %127 %129 %128
+        %129 = OpLabel
+               OpStore %x_127_phi %false
+               OpBranch %99
+        %128 = OpLabel
+               OpStore %x_127_phi %true
+               OpBranch %99
+         %99 = OpLabel
+        %131 = OpLoad %bool %x_127_phi
+        %132 = OpLoad %v4float %x_95
+               OpStore %x_96_phi %132
+               OpSelectionMerge %133 None
+               OpBranchConditional %131 %134 %133
+        %134 = OpLabel
+               OpStore %x_83 %59
+        %135 = OpAccessChain %_ptr_Function_float %x_83 %90 %uint_0
+        %136 = OpLoad %float %135
+               OpStore %x_84 %59
+        %137 = OpAccessChain %_ptr_Function_float %x_84 %90 %uint_1
+        %138 = OpLoad %float %137
+               OpStore %x_85 %154
+        %155 = OpConvertFToS %int %136
+        %156 = OpConvertFToS %int %138
+        %157 = OpIMul %int %155 %156
+        %159 = OpIMul %int %90 %int_9
+        %160 = OpIAdd %int %157 %159
+        %162 = OpIAdd %int %160 %int_11
+        %164 = OpSMod %int %162 %int_16
+        %165 = OpAccessChain %_ptr_Function_v4float %x_85 %164
+        %166 = OpLoad %v4float %165
+               OpStore %x_142 %166
+        %167 = OpLoad %v4float %x_142
+               OpStore %x_96_phi %167
+               OpBranch %133
+        %133 = OpLabel
+        %168 = OpLoad %v4float %x_96_phi
+               OpBranch %80
+         %80 = OpLabel
+        %170 = OpIAdd %int %90 %int_1
+               OpStore %x_99 %170
+               OpStore %x_95_phi %168
+        %171 = OpLoad %int %x_99
+               OpStore %x_98_phi %171
+               OpBranch %78
+         %79 = OpLabel
+        %172 = OpLoad %v4float %x_95
+               OpStore %x_GLF_color %172
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %173
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %177 = OpLabel
+        %178 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %178
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %180 = OpLabel
+        %181 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %181
+        %182 = OpFunctionCall %void %main_1
+        %184 = OpLoad %v4float %x_GLF_color
+        %185 = OpCompositeConstruct %main_out %184
+        %183 = OpFunctionCall %void %tint_symbol_3 %185
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/2.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/2.spvasm.expected.wgsl
new file mode 100644
index 0000000..1bf1c72
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/2.spvasm.expected.wgsl
@@ -0,0 +1,100 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_81 : array<vec4<f32>, 8> = array<vec4<f32>, 8>(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
+  var x_82 : array<vec4<f32>, 8>;
+  var x_83 : array<vec4<f32>, 8>;
+  var x_84 : array<vec4<f32>, 8>;
+  var x_85 : array<vec4<f32>, 16>;
+  var x_95 : vec4<f32>;
+  var x_95_phi : vec4<f32>;
+  var x_98_phi : i32;
+  x_81 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+  let x_86 : array<vec4<f32>, 8> = x_81;
+  let x_87 : vec4<f32> = gl_FragCoord;
+  let x_90 : vec2<f32> = x_6.resolution;
+  let x_93 : vec2<f32> = floor(((vec2<f32>(x_87.x, x_87.y) / x_90) * 32.0));
+  x_95_phi = vec4<f32>(0.5, 0.5, 1.0, 1.0);
+  x_98_phi = 0;
+  loop {
+    var x_142 : vec4<f32>;
+    var x_99 : i32;
+    var x_127_phi : bool;
+    var x_96_phi : vec4<f32>;
+    x_95 = x_95_phi;
+    let x_98 : i32 = x_98_phi;
+    if ((x_98 < 8)) {
+    } else {
+      break;
+    }
+    var x_104 : vec4<f32>;
+    x_82 = x_86;
+    x_104 = x_82[x_98];
+    switch(0u) {
+      default: {
+        let x_107 : f32 = x_93.x;
+        let x_108 : f32 = x_104.x;
+        if ((x_107 < x_108)) {
+          x_127_phi = false;
+          break;
+        }
+        let x_112 : f32 = x_93.y;
+        let x_113 : f32 = x_104.y;
+        if ((x_112 < x_113)) {
+          x_127_phi = false;
+          break;
+        }
+        if ((x_107 > (x_108 + x_104.z))) {
+          x_127_phi = false;
+          break;
+        }
+        if ((x_112 > (x_113 + x_104.w))) {
+          x_127_phi = false;
+          break;
+        }
+        x_127_phi = true;
+      }
+    }
+    let x_127 : bool = x_127_phi;
+    x_96_phi = x_95;
+    if (x_127) {
+      x_83 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+      let x_131 : f32 = x_83[x_98].x;
+      x_84 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+      let x_134 : f32 = x_84[x_98].y;
+      x_85 = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+      x_142 = x_85[((((i32(x_131) * i32(x_134)) + (x_98 * 9)) + 11) % 16)];
+      x_96_phi = x_142;
+    }
+    let x_96 : vec4<f32> = x_96_phi;
+
+    continuing {
+      x_99 = (x_98 + 1);
+      x_95_phi = x_96;
+      x_98_phi = x_99;
+    }
+  }
+  x_GLF_color = x_95;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/2.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/2.wgsl
new file mode 100644
index 0000000..1bf1c72
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/2.wgsl
@@ -0,0 +1,100 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_81 : array<vec4<f32>, 8> = array<vec4<f32>, 8>(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
+  var x_82 : array<vec4<f32>, 8>;
+  var x_83 : array<vec4<f32>, 8>;
+  var x_84 : array<vec4<f32>, 8>;
+  var x_85 : array<vec4<f32>, 16>;
+  var x_95 : vec4<f32>;
+  var x_95_phi : vec4<f32>;
+  var x_98_phi : i32;
+  x_81 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+  let x_86 : array<vec4<f32>, 8> = x_81;
+  let x_87 : vec4<f32> = gl_FragCoord;
+  let x_90 : vec2<f32> = x_6.resolution;
+  let x_93 : vec2<f32> = floor(((vec2<f32>(x_87.x, x_87.y) / x_90) * 32.0));
+  x_95_phi = vec4<f32>(0.5, 0.5, 1.0, 1.0);
+  x_98_phi = 0;
+  loop {
+    var x_142 : vec4<f32>;
+    var x_99 : i32;
+    var x_127_phi : bool;
+    var x_96_phi : vec4<f32>;
+    x_95 = x_95_phi;
+    let x_98 : i32 = x_98_phi;
+    if ((x_98 < 8)) {
+    } else {
+      break;
+    }
+    var x_104 : vec4<f32>;
+    x_82 = x_86;
+    x_104 = x_82[x_98];
+    switch(0u) {
+      default: {
+        let x_107 : f32 = x_93.x;
+        let x_108 : f32 = x_104.x;
+        if ((x_107 < x_108)) {
+          x_127_phi = false;
+          break;
+        }
+        let x_112 : f32 = x_93.y;
+        let x_113 : f32 = x_104.y;
+        if ((x_112 < x_113)) {
+          x_127_phi = false;
+          break;
+        }
+        if ((x_107 > (x_108 + x_104.z))) {
+          x_127_phi = false;
+          break;
+        }
+        if ((x_112 > (x_113 + x_104.w))) {
+          x_127_phi = false;
+          break;
+        }
+        x_127_phi = true;
+      }
+    }
+    let x_127 : bool = x_127_phi;
+    x_96_phi = x_95;
+    if (x_127) {
+      x_83 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+      let x_131 : f32 = x_83[x_98].x;
+      x_84 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+      let x_134 : f32 = x_84[x_98].y;
+      x_85 = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+      x_142 = x_85[((((i32(x_131) * i32(x_134)) + (x_98 * 9)) + 11) % 16)];
+      x_96_phi = x_142;
+    }
+    let x_96 : vec4<f32> = x_96_phi;
+
+    continuing {
+      x_99 = (x_98 + 1);
+      x_95_phi = x_96;
+      x_98_phi = x_99;
+    }
+  }
+  x_GLF_color = x_95;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/2.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/2.wgsl.expected.hlsl
new file mode 100644
index 0000000..d50630e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/2.wgsl.expected.hlsl
@@ -0,0 +1,106 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 x_81[8] = {float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)};
+  float4 x_82[8] = (float4[8])0;
+  float4 x_83[8] = (float4[8])0;
+  float4 x_84[8] = (float4[8])0;
+  float4 x_85[16] = (float4[16])0;
+  float4 x_95 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 x_95_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int x_98_phi = 0;
+  const float4 tint_symbol_5[8] = {float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)};
+  x_81 = tint_symbol_5;
+  const float4 x_86[8] = x_81;
+  const float4 x_87 = gl_FragCoord;
+  const float2 x_90 = asfloat(x_6[0].xy);
+  const float2 x_93 = floor(((float2(x_87.x, x_87.y) / x_90) * 32.0f));
+  x_95_phi = float4(0.5f, 0.5f, 1.0f, 1.0f);
+  x_98_phi = 0;
+  while (true) {
+    float4 x_142 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    int x_99 = 0;
+    bool x_127_phi = false;
+    float4 x_96_phi = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    x_95 = x_95_phi;
+    const int x_98 = x_98_phi;
+    if ((x_98 < 8)) {
+    } else {
+      break;
+    }
+    float4 x_104 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+    x_82 = x_86;
+    x_104 = x_82[x_98];
+    switch(0u) {
+      default: {
+        const float x_107 = x_93.x;
+        const float x_108 = x_104.x;
+        if ((x_107 < x_108)) {
+          x_127_phi = false;
+          break;
+        }
+        const float x_112 = x_93.y;
+        const float x_113 = x_104.y;
+        if ((x_112 < x_113)) {
+          x_127_phi = false;
+          break;
+        }
+        if ((x_107 > (x_108 + x_104.z))) {
+          x_127_phi = false;
+          break;
+        }
+        if ((x_112 > (x_113 + x_104.w))) {
+          x_127_phi = false;
+          break;
+        }
+        x_127_phi = true;
+        break;
+      }
+    }
+    const bool x_127 = x_127_phi;
+    x_96_phi = x_95;
+    if (x_127) {
+      const float4 tint_symbol_6[8] = {float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)};
+      x_83 = tint_symbol_6;
+      const float x_131 = x_83[x_98].x;
+      const float4 tint_symbol_7[8] = {float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)};
+      x_84 = tint_symbol_7;
+      const float x_134 = x_84[x_98].y;
+      const float4 tint_symbol_8[16] = {float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)};
+      x_85 = tint_symbol_8;
+      x_142 = x_85[((((int(x_131) * int(x_134)) + (x_98 * 9)) + 11) % 16)];
+      x_96_phi = x_142;
+    }
+    const float4 x_96 = x_96_phi;
+    {
+      x_99 = (x_98 + 1);
+      x_95_phi = x_96;
+      x_98_phi = x_99;
+    }
+  }
+  x_GLF_color = x_95;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_9 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_9;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/2.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/2.wgsl.expected.msl
new file mode 100644
index 0000000..f5eb2e7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/2.wgsl.expected.msl
@@ -0,0 +1,111 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  float4 arr[8];
+};
+struct tint_array_wrapper_1 {
+  float4 arr[16];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10) {
+  tint_array_wrapper x_81 = {.arr={float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 0.0f)}};
+  tint_array_wrapper x_82 = {};
+  tint_array_wrapper x_83 = {};
+  tint_array_wrapper x_84 = {};
+  tint_array_wrapper_1 x_85 = {};
+  float4 x_95 = 0.0f;
+  float4 x_95_phi = 0.0f;
+  int x_98_phi = 0;
+  tint_array_wrapper const tint_symbol_4 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
+  x_81 = tint_symbol_4;
+  tint_array_wrapper const x_86 = x_81;
+  float4 const x_87 = *(tint_symbol_9);
+  float2 const x_90 = x_6.resolution;
+  float2 const x_93 = floor(((float2(x_87.x, x_87.y) / x_90) * 32.0f));
+  x_95_phi = float4(0.5f, 0.5f, 1.0f, 1.0f);
+  x_98_phi = 0;
+  while (true) {
+    float4 x_142 = 0.0f;
+    int x_99 = 0;
+    bool x_127_phi = false;
+    float4 x_96_phi = 0.0f;
+    x_95 = x_95_phi;
+    int const x_98 = x_98_phi;
+    if ((x_98 < 8)) {
+    } else {
+      break;
+    }
+    float4 x_104 = 0.0f;
+    x_82 = x_86;
+    x_104 = x_82.arr[x_98];
+    switch(0u) {
+      default: {
+        float const x_107 = x_93.x;
+        float const x_108 = x_104.x;
+        if ((x_107 < x_108)) {
+          x_127_phi = false;
+          break;
+        }
+        float const x_112 = x_93.y;
+        float const x_113 = x_104.y;
+        if ((x_112 < x_113)) {
+          x_127_phi = false;
+          break;
+        }
+        if ((x_107 > (x_108 + x_104.z))) {
+          x_127_phi = false;
+          break;
+        }
+        if ((x_112 > (x_113 + x_104.w))) {
+          x_127_phi = false;
+          break;
+        }
+        x_127_phi = true;
+        break;
+      }
+    }
+    bool const x_127 = x_127_phi;
+    x_96_phi = x_95;
+    if (x_127) {
+      tint_array_wrapper const tint_symbol_5 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
+      x_83 = tint_symbol_5;
+      float const x_131 = x_83.arr[x_98].x;
+      tint_array_wrapper const tint_symbol_6 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
+      x_84 = tint_symbol_6;
+      float const x_134 = x_84.arr[x_98].y;
+      tint_array_wrapper_1 const tint_symbol_7 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
+      x_85 = tint_symbol_7;
+      x_142 = x_85.arr[((((int(x_131) * int(x_134)) + (x_98 * 9)) + 11) % 16)];
+      x_96_phi = x_142;
+    }
+    float4 const x_96 = x_96_phi;
+    {
+      x_99 = (x_98 + 1);
+      x_95_phi = x_96;
+      x_98_phi = x_99;
+    }
+  }
+  *(tint_symbol_10) = x_95;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_11 = 0.0f;
+  thread float4 tint_symbol_12 = 0.0f;
+  tint_symbol_11 = gl_FragCoord_param;
+  main_1(x_6, &(tint_symbol_11), &(tint_symbol_12));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_12};
+  tint_symbol_2 const tint_symbol_8 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_8;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/2.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/2.wgsl.expected.spvasm
new file mode 100644
index 0000000..4ef0500
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/2.wgsl.expected.spvasm
@@ -0,0 +1,287 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 186
+; Schema: 0
+               OpCapability Shader
+         %67 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %x_81 "x_81"
+               OpName %x_82 "x_82"
+               OpName %x_83 "x_83"
+               OpName %x_84 "x_84"
+               OpName %x_85 "x_85"
+               OpName %x_95 "x_95"
+               OpName %x_95_phi "x_95_phi"
+               OpName %x_98_phi "x_98_phi"
+               OpName %x_142 "x_142"
+               OpName %x_99 "x_99"
+               OpName %x_127_phi "x_127_phi"
+               OpName %x_96_phi "x_96_phi"
+               OpName %x_104 "x_104"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v4float_uint_8 ArrayStride 16
+               OpDecorate %_arr_v4float_uint_16 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_8 = OpConstant %uint 8
+%_arr_v4float_uint_8 = OpTypeArray %v4float %uint_8
+    %float_0 = OpConstant %float 0
+         %23 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+         %24 = OpConstantComposite %_arr_v4float_uint_8 %23 %23 %23 %23 %23 %23 %23 %23
+%_ptr_Function__arr_v4float_uint_8 = OpTypePointer Function %_arr_v4float_uint_8
+         %27 = OpConstantNull %_arr_v4float_uint_8
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+         %35 = OpConstantNull %_arr_v4float_uint_16
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %42 = OpConstantNull %int
+    %float_4 = OpConstant %float 4
+   %float_20 = OpConstant %float 20
+         %45 = OpConstantComposite %v4float %float_4 %float_4 %float_20 %float_4
+         %46 = OpConstantComposite %v4float %float_4 %float_4 %float_4 %float_20
+         %47 = OpConstantComposite %v4float %float_4 %float_20 %float_20 %float_4
+    %float_8 = OpConstant %float 8
+         %49 = OpConstantComposite %v4float %float_20 %float_4 %float_4 %float_8
+    %float_6 = OpConstant %float 6
+    %float_2 = OpConstant %float 2
+         %52 = OpConstantComposite %v4float %float_8 %float_6 %float_4 %float_2
+   %float_12 = OpConstant %float 12
+         %54 = OpConstantComposite %v4float %float_2 %float_12 %float_2 %float_4
+   %float_16 = OpConstant %float 16
+         %56 = OpConstantComposite %v4float %float_16 %float_2 %float_4 %float_4
+   %float_22 = OpConstant %float 22
+         %58 = OpConstantComposite %v4float %float_12 %float_22 %float_4 %float_4
+         %59 = OpConstantComposite %_arr_v4float_uint_8 %45 %46 %47 %49 %52 %54 %56 %58
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+   %float_32 = OpConstant %float 32
+  %float_0_5 = OpConstant %float 0.5
+    %float_1 = OpConstant %float 1
+         %76 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_1 %float_1
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %87 = OpConstantNull %bool
+      %int_8 = OpConstant %int 8
+%_ptr_Function_float = OpTypePointer Function %float
+      %false = OpConstantFalse %bool
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+     %uint_3 = OpConstant %uint 3
+       %true = OpConstantTrue %bool
+        %139 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+        %140 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+        %141 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+        %142 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+        %143 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+        %144 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+        %145 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+        %146 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+        %147 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %148 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+        %149 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+        %150 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+        %151 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+        %152 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+        %153 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+        %154 = OpConstantComposite %_arr_v4float_uint_16 %139 %140 %141 %142 %143 %144 %145 %146 %139 %147 %148 %149 %150 %151 %152 %153
+      %int_9 = OpConstant %int 9
+     %int_11 = OpConstant %int 11
+     %int_16 = OpConstant %int 16
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+        %173 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+       %x_81 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %27
+       %x_82 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %27
+       %x_83 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %27
+       %x_84 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %27
+       %x_85 = OpVariable %_ptr_Function__arr_v4float_uint_16 Function %35
+       %x_95 = OpVariable %_ptr_Function_v4float Function %5
+   %x_95_phi = OpVariable %_ptr_Function_v4float Function %5
+   %x_98_phi = OpVariable %_ptr_Function_int Function %42
+      %x_142 = OpVariable %_ptr_Function_v4float Function %5
+       %x_99 = OpVariable %_ptr_Function_int Function %42
+  %x_127_phi = OpVariable %_ptr_Function_bool Function %87
+   %x_96_phi = OpVariable %_ptr_Function_v4float Function %5
+      %x_104 = OpVariable %_ptr_Function_v4float Function %5
+               OpStore %x_81 %24
+               OpStore %x_81 %59
+         %60 = OpLoad %_arr_v4float_uint_8 %x_81
+         %61 = OpLoad %v4float %gl_FragCoord
+         %64 = OpAccessChain %_ptr_Uniform_v2float %x_6 %uint_0
+         %65 = OpLoad %v2float %64
+         %68 = OpCompositeExtract %float %61 0
+         %69 = OpCompositeExtract %float %61 1
+         %70 = OpCompositeConstruct %v2float %68 %69
+         %71 = OpFDiv %v2float %70 %65
+         %73 = OpVectorTimesScalar %v2float %71 %float_32
+         %66 = OpExtInst %v2float %67 Floor %73
+               OpStore %x_95_phi %76
+               OpStore %x_98_phi %int_0
+               OpBranch %78
+         %78 = OpLabel
+               OpLoopMerge %79 %80 None
+               OpBranch %81
+         %81 = OpLabel
+         %89 = OpLoad %v4float %x_95_phi
+               OpStore %x_95 %89
+         %90 = OpLoad %int %x_98_phi
+         %92 = OpSLessThan %bool %90 %int_8
+               OpSelectionMerge %93 None
+               OpBranchConditional %92 %94 %95
+         %94 = OpLabel
+               OpBranch %93
+         %95 = OpLabel
+               OpBranch %79
+         %93 = OpLabel
+               OpStore %x_82 %60
+         %97 = OpAccessChain %_ptr_Function_v4float %x_82 %90
+         %98 = OpLoad %v4float %97
+               OpStore %x_104 %98
+               OpSelectionMerge %99 None
+               OpSwitch %uint_0 %100
+        %100 = OpLabel
+        %101 = OpCompositeExtract %float %66 0
+        %103 = OpAccessChain %_ptr_Function_float %x_104 %uint_0
+        %104 = OpLoad %float %103
+        %105 = OpFOrdLessThan %bool %101 %104
+               OpSelectionMerge %106 None
+               OpBranchConditional %105 %107 %106
+        %107 = OpLabel
+               OpStore %x_127_phi %false
+               OpBranch %99
+        %106 = OpLabel
+        %109 = OpCompositeExtract %float %66 1
+        %111 = OpAccessChain %_ptr_Function_float %x_104 %uint_1
+        %112 = OpLoad %float %111
+        %113 = OpFOrdLessThan %bool %109 %112
+               OpSelectionMerge %114 None
+               OpBranchConditional %113 %115 %114
+        %115 = OpLabel
+               OpStore %x_127_phi %false
+               OpBranch %99
+        %114 = OpLabel
+        %117 = OpAccessChain %_ptr_Function_float %x_104 %uint_2
+        %118 = OpLoad %float %117
+        %119 = OpFAdd %float %104 %118
+        %120 = OpFOrdGreaterThan %bool %101 %119
+               OpSelectionMerge %121 None
+               OpBranchConditional %120 %122 %121
+        %122 = OpLabel
+               OpStore %x_127_phi %false
+               OpBranch %99
+        %121 = OpLabel
+        %124 = OpAccessChain %_ptr_Function_float %x_104 %uint_3
+        %125 = OpLoad %float %124
+        %126 = OpFAdd %float %112 %125
+        %127 = OpFOrdGreaterThan %bool %109 %126
+               OpSelectionMerge %128 None
+               OpBranchConditional %127 %129 %128
+        %129 = OpLabel
+               OpStore %x_127_phi %false
+               OpBranch %99
+        %128 = OpLabel
+               OpStore %x_127_phi %true
+               OpBranch %99
+         %99 = OpLabel
+        %131 = OpLoad %bool %x_127_phi
+        %132 = OpLoad %v4float %x_95
+               OpStore %x_96_phi %132
+               OpSelectionMerge %133 None
+               OpBranchConditional %131 %134 %133
+        %134 = OpLabel
+               OpStore %x_83 %59
+        %135 = OpAccessChain %_ptr_Function_float %x_83 %90 %uint_0
+        %136 = OpLoad %float %135
+               OpStore %x_84 %59
+        %137 = OpAccessChain %_ptr_Function_float %x_84 %90 %uint_1
+        %138 = OpLoad %float %137
+               OpStore %x_85 %154
+        %155 = OpConvertFToS %int %136
+        %156 = OpConvertFToS %int %138
+        %157 = OpIMul %int %155 %156
+        %159 = OpIMul %int %90 %int_9
+        %160 = OpIAdd %int %157 %159
+        %162 = OpIAdd %int %160 %int_11
+        %164 = OpSMod %int %162 %int_16
+        %165 = OpAccessChain %_ptr_Function_v4float %x_85 %164
+        %166 = OpLoad %v4float %165
+               OpStore %x_142 %166
+        %167 = OpLoad %v4float %x_142
+               OpStore %x_96_phi %167
+               OpBranch %133
+        %133 = OpLabel
+        %168 = OpLoad %v4float %x_96_phi
+               OpBranch %80
+         %80 = OpLabel
+        %170 = OpIAdd %int %90 %int_1
+               OpStore %x_99 %170
+               OpStore %x_95_phi %168
+        %171 = OpLoad %int %x_99
+               OpStore %x_98_phi %171
+               OpBranch %78
+         %79 = OpLabel
+        %172 = OpLoad %v4float %x_95
+               OpStore %x_GLF_color %172
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %173
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %177 = OpLabel
+        %178 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %178
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %180 = OpLabel
+        %181 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %181
+        %182 = OpFunctionCall %void %main_1
+        %184 = OpLoad %v4float %x_GLF_color
+        %185 = OpCompositeConstruct %main_out %184
+        %183 = OpFunctionCall %void %tint_symbol_3 %185
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/2.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/2.wgsl.expected.wgsl
new file mode 100644
index 0000000..1bf1c72
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/spv-stable-rects-Os-mutate-var-push-through-var/2.wgsl.expected.wgsl
@@ -0,0 +1,100 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_81 : array<vec4<f32>, 8> = array<vec4<f32>, 8>(vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 0.0));
+  var x_82 : array<vec4<f32>, 8>;
+  var x_83 : array<vec4<f32>, 8>;
+  var x_84 : array<vec4<f32>, 8>;
+  var x_85 : array<vec4<f32>, 16>;
+  var x_95 : vec4<f32>;
+  var x_95_phi : vec4<f32>;
+  var x_98_phi : i32;
+  x_81 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+  let x_86 : array<vec4<f32>, 8> = x_81;
+  let x_87 : vec4<f32> = gl_FragCoord;
+  let x_90 : vec2<f32> = x_6.resolution;
+  let x_93 : vec2<f32> = floor(((vec2<f32>(x_87.x, x_87.y) / x_90) * 32.0));
+  x_95_phi = vec4<f32>(0.5, 0.5, 1.0, 1.0);
+  x_98_phi = 0;
+  loop {
+    var x_142 : vec4<f32>;
+    var x_99 : i32;
+    var x_127_phi : bool;
+    var x_96_phi : vec4<f32>;
+    x_95 = x_95_phi;
+    let x_98 : i32 = x_98_phi;
+    if ((x_98 < 8)) {
+    } else {
+      break;
+    }
+    var x_104 : vec4<f32>;
+    x_82 = x_86;
+    x_104 = x_82[x_98];
+    switch(0u) {
+      default: {
+        let x_107 : f32 = x_93.x;
+        let x_108 : f32 = x_104.x;
+        if ((x_107 < x_108)) {
+          x_127_phi = false;
+          break;
+        }
+        let x_112 : f32 = x_93.y;
+        let x_113 : f32 = x_104.y;
+        if ((x_112 < x_113)) {
+          x_127_phi = false;
+          break;
+        }
+        if ((x_107 > (x_108 + x_104.z))) {
+          x_127_phi = false;
+          break;
+        }
+        if ((x_112 > (x_113 + x_104.w))) {
+          x_127_phi = false;
+          break;
+        }
+        x_127_phi = true;
+      }
+    }
+    let x_127 : bool = x_127_phi;
+    x_96_phi = x_95;
+    if (x_127) {
+      x_83 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+      let x_131 : f32 = x_83[x_98].x;
+      x_84 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+      let x_134 : f32 = x_84[x_98].y;
+      x_85 = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+      x_142 = x_85[((((i32(x_131) * i32(x_134)) + (x_98 * 9)) + 11) % 16)];
+      x_96_phi = x_142;
+    }
+    let x_96 : vec4<f32> = x_96_phi;
+
+    continuing {
+      x_99 = (x_98 + 1);
+      x_95_phi = x_96;
+      x_98_phi = x_99;
+    }
+  }
+  x_GLF_color = x_95;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/0.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/0.spvasm
new file mode 100644
index 0000000..81c39bd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/0.spvasm
@@ -0,0 +1,684 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %BST "BST"
+               OpMemberName %BST 0 "data"
+               OpMemberName %BST 1 "leftIndex"
+               OpMemberName %BST 2 "rightIndex"
+               OpName %tree "tree"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+        %BST = OpTypeStruct %int %int %int
+%_ptr_Function_BST = OpTypePointer Function %BST
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+     %int_n1 = OpConstant %int -1
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_BST_uint_10 = OpTypeArray %BST %uint_10
+      %int_9 = OpConstant %int 9
+      %int_5 = OpConstant %int 5
+     %int_12 = OpConstant %int 12
+     %int_15 = OpConstant %int 15
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+      %int_6 = OpConstant %int 6
+     %int_17 = OpConstant %int 17
+     %int_13 = OpConstant %int 13
+     %int_20 = OpConstant %int 20
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %34 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %35 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+     %uint_0 = OpConstant %uint 0
+      %false = OpConstantFalse %bool
+       %true = OpConstantTrue %bool
+%_ptr_Function__arr_BST_uint_10 = OpTypePointer Function %_arr_BST_uint_10
+         %40 = OpUndef %int
+         %41 = OpConstantComposite %BST %int_9 %int_n1 %int_n1
+         %42 = OpConstantComposite %BST %int_5 %int_n1 %int_n1
+         %43 = OpConstantComposite %BST %int_12 %int_n1 %int_n1
+      %int_3 = OpConstant %int 3
+         %45 = OpConstantComposite %BST %int_15 %int_n1 %int_n1
+      %int_4 = OpConstant %int 4
+         %47 = OpConstantComposite %BST %int_7 %int_n1 %int_n1
+         %48 = OpConstantComposite %BST %int_8 %int_n1 %int_n1
+         %49 = OpConstantComposite %BST %int_2 %int_n1 %int_n1
+         %50 = OpConstantComposite %BST %int_6 %int_n1 %int_n1
+         %51 = OpConstantComposite %BST %int_17 %int_n1 %int_n1
+         %52 = OpConstantComposite %BST %int_13 %int_n1 %int_n1
+       %main = OpFunction %void None %7
+         %53 = OpLabel
+       %tree = OpVariable %_ptr_Function__arr_BST_uint_10 Function
+         %54 = OpAccessChain %_ptr_Function_BST %tree %int_0
+               OpStore %54 %41
+               OpSelectionMerge %55 None
+               OpSwitch %uint_0 %56
+         %56 = OpLabel
+               OpBranch %57
+         %57 = OpLabel
+         %58 = OpPhi %int %int_0 %56 %59 %60
+         %61 = OpSLessThanEqual %bool %58 %int_1
+               OpLoopMerge %62 %60 None
+               OpBranchConditional %61 %63 %62
+         %63 = OpLabel
+         %64 = OpAccessChain %_ptr_Function_int %tree %58 %int_0
+         %65 = OpLoad %int %64
+         %66 = OpSLessThanEqual %bool %int_5 %65
+               OpSelectionMerge %67 None
+               OpBranchConditional %66 %68 %69
+         %69 = OpLabel
+         %70 = OpAccessChain %_ptr_Function_int %tree %58 %int_2
+         %71 = OpLoad %int %70
+         %72 = OpIEqual %bool %71 %int_n1
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %74 %75
+         %75 = OpLabel
+         %76 = OpLoad %int %70
+               OpBranch %60
+         %74 = OpLabel
+               OpStore %70 %int_1
+         %77 = OpAccessChain %_ptr_Function_BST %tree %int_1
+               OpStore %77 %42
+               OpBranch %62
+         %73 = OpLabel
+               OpUnreachable
+         %68 = OpLabel
+         %78 = OpAccessChain %_ptr_Function_int %tree %58 %int_1
+         %79 = OpLoad %int %78
+         %80 = OpIEqual %bool %79 %int_n1
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %83
+         %83 = OpLabel
+         %84 = OpLoad %int %78
+               OpBranch %60
+         %82 = OpLabel
+               OpStore %78 %int_1
+         %85 = OpAccessChain %_ptr_Function_BST %tree %int_1
+               OpStore %85 %42
+               OpBranch %62
+         %81 = OpLabel
+               OpUnreachable
+         %67 = OpLabel
+               OpUnreachable
+         %60 = OpLabel
+         %59 = OpPhi %int %84 %83 %76 %75
+               OpBranch %57
+         %62 = OpLabel
+         %86 = OpPhi %bool %false %57 %true %82 %true %74
+               OpSelectionMerge %87 None
+               OpBranchConditional %86 %55 %87
+         %87 = OpLabel
+               OpBranch %55
+         %55 = OpLabel
+               OpSelectionMerge %88 None
+               OpSwitch %uint_0 %89
+         %89 = OpLabel
+               OpBranch %90
+         %90 = OpLabel
+         %91 = OpPhi %int %int_0 %89 %92 %93
+         %94 = OpSLessThanEqual %bool %91 %int_2
+               OpLoopMerge %95 %93 None
+               OpBranchConditional %94 %96 %95
+         %96 = OpLabel
+         %97 = OpAccessChain %_ptr_Function_int %tree %91 %int_0
+         %98 = OpLoad %int %97
+         %99 = OpSLessThanEqual %bool %int_12 %98
+               OpSelectionMerge %100 None
+               OpBranchConditional %99 %101 %102
+        %102 = OpLabel
+        %103 = OpAccessChain %_ptr_Function_int %tree %91 %int_2
+        %104 = OpLoad %int %103
+        %105 = OpIEqual %bool %104 %int_n1
+               OpSelectionMerge %106 None
+               OpBranchConditional %105 %107 %108
+        %108 = OpLabel
+        %109 = OpLoad %int %103
+               OpBranch %93
+        %107 = OpLabel
+               OpStore %103 %int_2
+        %110 = OpAccessChain %_ptr_Function_BST %tree %int_2
+               OpStore %110 %43
+               OpBranch %95
+        %106 = OpLabel
+               OpUnreachable
+        %101 = OpLabel
+        %111 = OpAccessChain %_ptr_Function_int %tree %91 %int_1
+        %112 = OpLoad %int %111
+        %113 = OpIEqual %bool %112 %int_n1
+               OpSelectionMerge %114 None
+               OpBranchConditional %113 %115 %116
+        %116 = OpLabel
+        %117 = OpLoad %int %111
+               OpBranch %93
+        %115 = OpLabel
+               OpStore %111 %int_2
+        %118 = OpAccessChain %_ptr_Function_BST %tree %int_2
+               OpStore %118 %43
+               OpBranch %95
+        %114 = OpLabel
+               OpUnreachable
+        %100 = OpLabel
+               OpUnreachable
+         %93 = OpLabel
+         %92 = OpPhi %int %117 %116 %109 %108
+               OpBranch %90
+         %95 = OpLabel
+        %119 = OpPhi %bool %false %90 %true %115 %true %107
+               OpSelectionMerge %120 None
+               OpBranchConditional %119 %88 %120
+        %120 = OpLabel
+               OpBranch %88
+         %88 = OpLabel
+               OpSelectionMerge %121 None
+               OpSwitch %uint_0 %122
+        %122 = OpLabel
+               OpBranch %123
+        %123 = OpLabel
+        %124 = OpPhi %int %int_0 %122 %125 %126
+        %127 = OpSLessThanEqual %bool %124 %int_3
+               OpLoopMerge %128 %126 None
+               OpBranchConditional %127 %129 %128
+        %129 = OpLabel
+        %130 = OpAccessChain %_ptr_Function_int %tree %124 %int_0
+        %131 = OpLoad %int %130
+        %132 = OpSLessThanEqual %bool %int_15 %131
+               OpSelectionMerge %133 None
+               OpBranchConditional %132 %134 %135
+        %135 = OpLabel
+        %136 = OpAccessChain %_ptr_Function_int %tree %124 %int_2
+        %137 = OpLoad %int %136
+        %138 = OpIEqual %bool %137 %int_n1
+               OpSelectionMerge %139 None
+               OpBranchConditional %138 %140 %141
+        %141 = OpLabel
+        %142 = OpLoad %int %136
+               OpBranch %126
+        %140 = OpLabel
+               OpStore %136 %int_3
+        %143 = OpAccessChain %_ptr_Function_BST %tree %int_3
+               OpStore %143 %45
+               OpBranch %128
+        %139 = OpLabel
+               OpUnreachable
+        %134 = OpLabel
+        %144 = OpAccessChain %_ptr_Function_int %tree %124 %int_1
+        %145 = OpLoad %int %144
+        %146 = OpIEqual %bool %145 %int_n1
+               OpSelectionMerge %147 None
+               OpBranchConditional %146 %148 %149
+        %149 = OpLabel
+        %150 = OpLoad %int %144
+               OpBranch %126
+        %148 = OpLabel
+               OpStore %144 %int_3
+        %151 = OpAccessChain %_ptr_Function_BST %tree %int_3
+               OpStore %151 %45
+               OpBranch %128
+        %147 = OpLabel
+               OpUnreachable
+        %133 = OpLabel
+               OpUnreachable
+        %126 = OpLabel
+        %125 = OpPhi %int %150 %149 %142 %141
+               OpBranch %123
+        %128 = OpLabel
+        %152 = OpPhi %bool %false %123 %true %148 %true %140
+               OpSelectionMerge %153 None
+               OpBranchConditional %152 %121 %153
+        %153 = OpLabel
+               OpBranch %121
+        %121 = OpLabel
+               OpSelectionMerge %154 None
+               OpSwitch %uint_0 %155
+        %155 = OpLabel
+               OpBranch %156
+        %156 = OpLabel
+        %157 = OpPhi %int %int_0 %155 %158 %159
+        %160 = OpSLessThanEqual %bool %157 %int_4
+               OpLoopMerge %161 %159 None
+               OpBranchConditional %160 %162 %161
+        %162 = OpLabel
+        %163 = OpAccessChain %_ptr_Function_int %tree %157 %int_0
+        %164 = OpLoad %int %163
+        %165 = OpSLessThanEqual %bool %int_7 %164
+               OpSelectionMerge %166 None
+               OpBranchConditional %165 %167 %168
+        %168 = OpLabel
+        %169 = OpAccessChain %_ptr_Function_int %tree %157 %int_2
+        %170 = OpLoad %int %169
+        %171 = OpIEqual %bool %170 %int_n1
+               OpSelectionMerge %172 None
+               OpBranchConditional %171 %173 %174
+        %174 = OpLabel
+        %175 = OpLoad %int %169
+               OpBranch %159
+        %173 = OpLabel
+               OpStore %169 %int_4
+        %176 = OpAccessChain %_ptr_Function_BST %tree %int_4
+               OpStore %176 %47
+               OpBranch %161
+        %172 = OpLabel
+               OpUnreachable
+        %167 = OpLabel
+        %177 = OpAccessChain %_ptr_Function_int %tree %157 %int_1
+        %178 = OpLoad %int %177
+        %179 = OpIEqual %bool %178 %int_n1
+               OpSelectionMerge %180 None
+               OpBranchConditional %179 %181 %182
+        %182 = OpLabel
+        %183 = OpLoad %int %177
+               OpBranch %159
+        %181 = OpLabel
+               OpStore %177 %int_4
+        %184 = OpAccessChain %_ptr_Function_BST %tree %int_4
+               OpStore %184 %47
+               OpBranch %161
+        %180 = OpLabel
+               OpUnreachable
+        %166 = OpLabel
+               OpUnreachable
+        %159 = OpLabel
+        %158 = OpPhi %int %183 %182 %175 %174
+               OpBranch %156
+        %161 = OpLabel
+        %185 = OpPhi %bool %false %156 %true %181 %true %173
+               OpSelectionMerge %186 None
+               OpBranchConditional %185 %154 %186
+        %186 = OpLabel
+               OpBranch %154
+        %154 = OpLabel
+               OpSelectionMerge %187 None
+               OpSwitch %uint_0 %188
+        %188 = OpLabel
+               OpBranch %189
+        %189 = OpLabel
+        %190 = OpPhi %int %int_0 %188 %191 %192
+        %193 = OpSLessThanEqual %bool %190 %int_5
+               OpLoopMerge %194 %192 None
+               OpBranchConditional %193 %195 %194
+        %195 = OpLabel
+        %196 = OpAccessChain %_ptr_Function_int %tree %190 %int_0
+        %197 = OpLoad %int %196
+        %198 = OpSLessThanEqual %bool %int_8 %197
+               OpSelectionMerge %199 None
+               OpBranchConditional %198 %200 %201
+        %201 = OpLabel
+        %202 = OpAccessChain %_ptr_Function_int %tree %190 %int_2
+        %203 = OpLoad %int %202
+        %204 = OpIEqual %bool %203 %int_n1
+               OpSelectionMerge %205 None
+               OpBranchConditional %204 %206 %207
+        %207 = OpLabel
+        %208 = OpLoad %int %202
+               OpBranch %192
+        %206 = OpLabel
+               OpStore %202 %int_5
+        %209 = OpAccessChain %_ptr_Function_BST %tree %int_5
+               OpStore %209 %48
+               OpBranch %194
+        %205 = OpLabel
+               OpUnreachable
+        %200 = OpLabel
+        %210 = OpAccessChain %_ptr_Function_int %tree %190 %int_1
+        %211 = OpLoad %int %210
+        %212 = OpIEqual %bool %211 %int_n1
+               OpSelectionMerge %213 None
+               OpBranchConditional %212 %214 %215
+        %215 = OpLabel
+        %216 = OpLoad %int %210
+               OpBranch %192
+        %214 = OpLabel
+               OpStore %210 %int_5
+        %217 = OpAccessChain %_ptr_Function_BST %tree %int_5
+               OpStore %217 %48
+               OpBranch %194
+        %213 = OpLabel
+               OpUnreachable
+        %199 = OpLabel
+               OpUnreachable
+        %192 = OpLabel
+        %191 = OpPhi %int %216 %215 %208 %207
+               OpBranch %189
+        %194 = OpLabel
+        %218 = OpPhi %bool %false %189 %true %214 %true %206
+               OpSelectionMerge %219 None
+               OpBranchConditional %218 %187 %219
+        %219 = OpLabel
+               OpBranch %187
+        %187 = OpLabel
+               OpSelectionMerge %220 None
+               OpSwitch %uint_0 %221
+        %221 = OpLabel
+               OpBranch %222
+        %222 = OpLabel
+        %223 = OpPhi %int %int_0 %221 %224 %225
+        %226 = OpSLessThanEqual %bool %223 %int_6
+               OpLoopMerge %227 %225 None
+               OpBranchConditional %226 %228 %227
+        %228 = OpLabel
+        %229 = OpAccessChain %_ptr_Function_int %tree %223 %int_0
+        %230 = OpLoad %int %229
+        %231 = OpSLessThanEqual %bool %int_2 %230
+               OpSelectionMerge %232 None
+               OpBranchConditional %231 %233 %234
+        %234 = OpLabel
+        %235 = OpAccessChain %_ptr_Function_int %tree %223 %int_2
+        %236 = OpLoad %int %235
+        %237 = OpIEqual %bool %236 %int_n1
+               OpSelectionMerge %238 None
+               OpBranchConditional %237 %239 %240
+        %240 = OpLabel
+        %241 = OpLoad %int %235
+               OpBranch %225
+        %239 = OpLabel
+               OpStore %235 %int_6
+        %242 = OpAccessChain %_ptr_Function_BST %tree %int_6
+               OpStore %242 %49
+               OpBranch %227
+        %238 = OpLabel
+               OpUnreachable
+        %233 = OpLabel
+        %243 = OpAccessChain %_ptr_Function_int %tree %223 %int_1
+        %244 = OpLoad %int %243
+        %245 = OpIEqual %bool %244 %int_n1
+               OpSelectionMerge %246 None
+               OpBranchConditional %245 %247 %248
+        %248 = OpLabel
+        %249 = OpLoad %int %243
+               OpBranch %225
+        %247 = OpLabel
+               OpStore %243 %int_6
+        %250 = OpAccessChain %_ptr_Function_BST %tree %int_6
+               OpStore %250 %49
+               OpBranch %227
+        %246 = OpLabel
+               OpUnreachable
+        %232 = OpLabel
+               OpUnreachable
+        %225 = OpLabel
+        %224 = OpPhi %int %249 %248 %241 %240
+               OpBranch %222
+        %227 = OpLabel
+        %251 = OpPhi %bool %false %222 %true %247 %true %239
+               OpSelectionMerge %252 None
+               OpBranchConditional %251 %220 %252
+        %252 = OpLabel
+               OpBranch %220
+        %220 = OpLabel
+               OpSelectionMerge %253 None
+               OpSwitch %uint_0 %254
+        %254 = OpLabel
+               OpBranch %255
+        %255 = OpLabel
+        %256 = OpPhi %int %int_0 %254 %257 %258
+        %259 = OpSLessThanEqual %bool %256 %int_7
+               OpLoopMerge %260 %258 None
+               OpBranchConditional %259 %261 %260
+        %261 = OpLabel
+        %262 = OpAccessChain %_ptr_Function_int %tree %256 %int_0
+        %263 = OpLoad %int %262
+        %264 = OpSLessThanEqual %bool %int_6 %263
+               OpSelectionMerge %265 None
+               OpBranchConditional %264 %266 %267
+        %267 = OpLabel
+        %268 = OpAccessChain %_ptr_Function_int %tree %256 %int_2
+        %269 = OpLoad %int %268
+        %270 = OpIEqual %bool %269 %int_n1
+               OpSelectionMerge %271 None
+               OpBranchConditional %270 %272 %273
+        %273 = OpLabel
+        %274 = OpLoad %int %268
+               OpBranch %258
+        %272 = OpLabel
+               OpStore %268 %int_7
+        %275 = OpAccessChain %_ptr_Function_BST %tree %int_7
+               OpStore %275 %50
+               OpBranch %260
+        %271 = OpLabel
+               OpUnreachable
+        %266 = OpLabel
+        %276 = OpAccessChain %_ptr_Function_int %tree %256 %int_1
+        %277 = OpLoad %int %276
+        %278 = OpIEqual %bool %277 %int_n1
+               OpSelectionMerge %279 None
+               OpBranchConditional %278 %280 %281
+        %281 = OpLabel
+        %282 = OpLoad %int %276
+               OpBranch %258
+        %280 = OpLabel
+               OpStore %276 %int_7
+        %283 = OpAccessChain %_ptr_Function_BST %tree %int_7
+               OpStore %283 %50
+               OpBranch %260
+        %279 = OpLabel
+               OpUnreachable
+        %265 = OpLabel
+               OpUnreachable
+        %258 = OpLabel
+        %257 = OpPhi %int %282 %281 %274 %273
+               OpBranch %255
+        %260 = OpLabel
+        %284 = OpPhi %bool %false %255 %true %280 %true %272
+               OpSelectionMerge %285 None
+               OpBranchConditional %284 %253 %285
+        %285 = OpLabel
+               OpBranch %253
+        %253 = OpLabel
+               OpSelectionMerge %286 None
+               OpSwitch %uint_0 %287
+        %287 = OpLabel
+               OpBranch %288
+        %288 = OpLabel
+        %289 = OpPhi %int %int_0 %287 %290 %291
+        %292 = OpSLessThanEqual %bool %289 %int_8
+               OpLoopMerge %293 %291 None
+               OpBranchConditional %292 %294 %293
+        %294 = OpLabel
+        %295 = OpAccessChain %_ptr_Function_int %tree %289 %int_0
+        %296 = OpLoad %int %295
+        %297 = OpSLessThanEqual %bool %int_17 %296
+               OpSelectionMerge %298 None
+               OpBranchConditional %297 %299 %300
+        %300 = OpLabel
+        %301 = OpAccessChain %_ptr_Function_int %tree %289 %int_2
+        %302 = OpLoad %int %301
+        %303 = OpIEqual %bool %302 %int_n1
+               OpSelectionMerge %304 None
+               OpBranchConditional %303 %305 %306
+        %306 = OpLabel
+        %307 = OpLoad %int %301
+               OpBranch %291
+        %305 = OpLabel
+               OpStore %301 %int_8
+        %308 = OpAccessChain %_ptr_Function_BST %tree %int_8
+               OpStore %308 %51
+               OpBranch %293
+        %304 = OpLabel
+               OpUnreachable
+        %299 = OpLabel
+        %309 = OpAccessChain %_ptr_Function_int %tree %289 %int_1
+        %310 = OpLoad %int %309
+        %311 = OpIEqual %bool %310 %int_n1
+               OpSelectionMerge %312 None
+               OpBranchConditional %311 %313 %314
+        %314 = OpLabel
+        %315 = OpLoad %int %309
+               OpBranch %291
+        %313 = OpLabel
+               OpStore %309 %int_8
+        %316 = OpAccessChain %_ptr_Function_BST %tree %int_8
+               OpStore %316 %51
+               OpBranch %293
+        %312 = OpLabel
+               OpUnreachable
+        %298 = OpLabel
+               OpUnreachable
+        %291 = OpLabel
+        %290 = OpPhi %int %315 %314 %307 %306
+               OpBranch %288
+        %293 = OpLabel
+        %317 = OpPhi %bool %false %288 %true %313 %true %305
+               OpSelectionMerge %318 None
+               OpBranchConditional %317 %286 %318
+        %318 = OpLabel
+               OpBranch %286
+        %286 = OpLabel
+               OpSelectionMerge %319 None
+               OpSwitch %uint_0 %320
+        %320 = OpLabel
+               OpBranch %321
+        %321 = OpLabel
+        %322 = OpPhi %int %int_0 %320 %323 %324
+        %325 = OpSLessThanEqual %bool %322 %int_9
+               OpLoopMerge %326 %324 None
+               OpBranchConditional %325 %327 %326
+        %327 = OpLabel
+        %328 = OpAccessChain %_ptr_Function_int %tree %322 %int_0
+        %329 = OpLoad %int %328
+        %330 = OpSLessThanEqual %bool %int_13 %329
+               OpSelectionMerge %331 None
+               OpBranchConditional %330 %332 %333
+        %333 = OpLabel
+        %334 = OpAccessChain %_ptr_Function_int %tree %322 %int_2
+        %335 = OpLoad %int %334
+        %336 = OpIEqual %bool %335 %int_n1
+               OpSelectionMerge %337 None
+               OpBranchConditional %336 %338 %339
+        %339 = OpLabel
+        %340 = OpLoad %int %334
+               OpBranch %324
+        %338 = OpLabel
+               OpStore %334 %int_9
+        %341 = OpAccessChain %_ptr_Function_BST %tree %int_9
+               OpStore %341 %52
+               OpBranch %326
+        %337 = OpLabel
+               OpUnreachable
+        %332 = OpLabel
+        %342 = OpAccessChain %_ptr_Function_int %tree %322 %int_1
+        %343 = OpLoad %int %342
+        %344 = OpIEqual %bool %343 %int_n1
+               OpSelectionMerge %345 None
+               OpBranchConditional %344 %346 %347
+        %347 = OpLabel
+        %348 = OpLoad %int %342
+               OpBranch %324
+        %346 = OpLabel
+               OpStore %342 %int_9
+        %349 = OpAccessChain %_ptr_Function_BST %tree %int_9
+               OpStore %349 %52
+               OpBranch %326
+        %345 = OpLabel
+               OpUnreachable
+        %331 = OpLabel
+               OpUnreachable
+        %324 = OpLabel
+        %323 = OpPhi %int %348 %347 %340 %339
+               OpBranch %321
+        %326 = OpLabel
+        %350 = OpPhi %bool %false %321 %true %346 %true %338
+               OpSelectionMerge %351 None
+               OpBranchConditional %350 %319 %351
+        %351 = OpLabel
+               OpBranch %319
+        %319 = OpLabel
+               OpBranch %352
+        %352 = OpLabel
+        %353 = OpPhi %int %40 %319 %354 %355
+        %356 = OpPhi %int %int_0 %319 %357 %355
+        %358 = OpPhi %int %int_0 %319 %359 %355
+        %360 = OpSLessThan %bool %358 %int_20
+               OpLoopMerge %361 %355 None
+               OpBranchConditional %360 %362 %361
+        %362 = OpLabel
+               OpSelectionMerge %363 None
+               OpSwitch %uint_0 %364
+        %364 = OpLabel
+               OpBranch %365
+        %365 = OpLabel
+        %366 = OpPhi %int %int_0 %364 %367 %368
+        %369 = OpINotEqual %bool %366 %int_n1
+               OpLoopMerge %370 %368 None
+               OpBranchConditional %369 %371 %370
+        %371 = OpLabel
+        %372 = OpAccessChain %_ptr_Function_BST %tree %366
+        %373 = OpLoad %BST %372
+        %374 = OpCompositeExtract %int %373 0
+        %375 = OpCompositeExtract %int %373 1
+        %376 = OpCompositeExtract %int %373 2
+        %377 = OpIEqual %bool %374 %358
+               OpSelectionMerge %378 None
+               OpBranchConditional %377 %379 %378
+        %379 = OpLabel
+               OpBranch %370
+        %378 = OpLabel
+        %380 = OpSGreaterThan %bool %358 %374
+        %367 = OpSelect %int %380 %376 %375
+               OpBranch %368
+        %368 = OpLabel
+               OpBranch %365
+        %370 = OpLabel
+        %381 = OpPhi %int %353 %365 %358 %379
+        %382 = OpPhi %bool %false %365 %true %379
+               OpSelectionMerge %383 None
+               OpBranchConditional %382 %363 %383
+        %383 = OpLabel
+               OpBranch %363
+        %363 = OpLabel
+        %354 = OpPhi %int %381 %370 %int_n1 %383
+               OpSelectionMerge %384 None
+               OpSwitch %358 %385 9 %386 5 %386 12 %386 15 %386 7 %386 8 %386 2 %386 6 %386 17 %386 13 %386
+        %386 = OpLabel
+        %387 = OpIEqual %bool %354 %358
+               OpSelectionMerge %388 None
+               OpBranchConditional %387 %389 %388
+        %389 = OpLabel
+        %390 = OpIAdd %int %356 %int_1
+               OpBranch %388
+        %388 = OpLabel
+        %391 = OpPhi %int %356 %386 %390 %389
+               OpBranch %384
+        %385 = OpLabel
+        %392 = OpIEqual %bool %354 %int_n1
+               OpSelectionMerge %393 None
+               OpBranchConditional %392 %394 %393
+        %394 = OpLabel
+        %395 = OpIAdd %int %356 %int_1
+               OpBranch %393
+        %393 = OpLabel
+        %396 = OpPhi %int %356 %385 %395 %394
+               OpBranch %384
+        %384 = OpLabel
+        %357 = OpPhi %int %396 %393 %391 %388
+               OpBranch %355
+        %355 = OpLabel
+        %359 = OpIAdd %int %358 %int_1
+               OpBranch %352
+        %361 = OpLabel
+        %397 = OpIEqual %bool %356 %int_20
+               OpSelectionMerge %398 None
+               OpBranchConditional %397 %399 %400
+        %400 = OpLabel
+               OpStore %_GLF_color %35
+               OpBranch %398
+        %399 = OpLabel
+               OpStore %_GLF_color %34
+               OpBranch %398
+        %398 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..1f593e3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/0.spvasm.expected.hlsl
@@ -0,0 +1,748 @@
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  BST tree[10] = (BST[10])0;
+  int x_356 = 0;
+  int x_58_phi = 0;
+  bool x_86_phi = false;
+  int x_353_phi = 0;
+  int x_356_phi = 0;
+  int x_358_phi = 0;
+  const BST tint_symbol_2 = {9, -1, -1};
+  tree[0] = tint_symbol_2;
+  switch(0u) {
+    default: {
+      x_58_phi = 0;
+      while (true) {
+        int x_84 = 0;
+        int x_76 = 0;
+        int x_59 = 0;
+        int x_59_phi = 0;
+        const int x_58 = x_58_phi;
+        x_86_phi = false;
+        if ((x_58 <= 1)) {
+        } else {
+          break;
+        }
+        const int x_65 = tree[x_58].data;
+        if ((5 <= x_65)) {
+          const int x_78_save = x_58;
+          const int x_79 = tree[x_78_save].leftIndex;
+          if ((x_79 == -1)) {
+            tree[x_78_save].leftIndex = 1;
+            const BST tint_symbol_3 = {5, -1, -1};
+            tree[1] = tint_symbol_3;
+            x_86_phi = true;
+            break;
+          } else {
+            x_84 = tree[x_78_save].leftIndex;
+            x_59_phi = x_84;
+            {
+              x_59 = x_59_phi;
+              x_58_phi = x_59;
+            }
+            continue;
+          }
+          return;
+        } else {
+          const int x_70_save = x_58;
+          const int x_71 = tree[x_70_save].rightIndex;
+          if ((x_71 == -1)) {
+            tree[x_70_save].rightIndex = 1;
+            const BST tint_symbol_4 = {5, -1, -1};
+            tree[1] = tint_symbol_4;
+            x_86_phi = true;
+            break;
+          } else {
+            x_76 = tree[x_70_save].rightIndex;
+            x_59_phi = x_76;
+            {
+              x_59 = x_59_phi;
+              x_58_phi = x_59;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_59 = x_59_phi;
+          x_58_phi = x_59;
+        }
+      }
+      if (x_86_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_91_phi = 0;
+  bool x_119_phi = false;
+  switch(0u) {
+    default: {
+      x_91_phi = 0;
+      while (true) {
+        int x_117 = 0;
+        int x_109 = 0;
+        int x_92 = 0;
+        int x_92_phi = 0;
+        const int x_91 = x_91_phi;
+        x_119_phi = false;
+        if ((x_91 <= 2)) {
+        } else {
+          break;
+        }
+        const int x_98 = tree[x_91].data;
+        if ((12 <= x_98)) {
+          const int x_111_save = x_91;
+          const int x_112 = tree[x_111_save].leftIndex;
+          if ((x_112 == -1)) {
+            tree[x_111_save].leftIndex = 2;
+            const BST tint_symbol_5 = {12, -1, -1};
+            tree[2] = tint_symbol_5;
+            x_119_phi = true;
+            break;
+          } else {
+            x_117 = tree[x_111_save].leftIndex;
+            x_92_phi = x_117;
+            {
+              x_92 = x_92_phi;
+              x_91_phi = x_92;
+            }
+            continue;
+          }
+          return;
+        } else {
+          const int x_103_save = x_91;
+          const int x_104 = tree[x_103_save].rightIndex;
+          if ((x_104 == -1)) {
+            tree[x_103_save].rightIndex = 2;
+            const BST tint_symbol_6 = {12, -1, -1};
+            tree[2] = tint_symbol_6;
+            x_119_phi = true;
+            break;
+          } else {
+            x_109 = tree[x_103_save].rightIndex;
+            x_92_phi = x_109;
+            {
+              x_92 = x_92_phi;
+              x_91_phi = x_92;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_92 = x_92_phi;
+          x_91_phi = x_92;
+        }
+      }
+      if (x_119_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_124_phi = 0;
+  bool x_152_phi = false;
+  switch(0u) {
+    default: {
+      x_124_phi = 0;
+      while (true) {
+        int x_150 = 0;
+        int x_142 = 0;
+        int x_125 = 0;
+        int x_125_phi = 0;
+        const int x_124 = x_124_phi;
+        x_152_phi = false;
+        if ((x_124 <= 3)) {
+        } else {
+          break;
+        }
+        const int x_131 = tree[x_124].data;
+        if ((15 <= x_131)) {
+          const int x_144_save = x_124;
+          const int x_145 = tree[x_144_save].leftIndex;
+          if ((x_145 == -1)) {
+            tree[x_144_save].leftIndex = 3;
+            const BST tint_symbol_7 = {15, -1, -1};
+            tree[3] = tint_symbol_7;
+            x_152_phi = true;
+            break;
+          } else {
+            x_150 = tree[x_144_save].leftIndex;
+            x_125_phi = x_150;
+            {
+              x_125 = x_125_phi;
+              x_124_phi = x_125;
+            }
+            continue;
+          }
+          return;
+        } else {
+          const int x_136_save = x_124;
+          const int x_137 = tree[x_136_save].rightIndex;
+          if ((x_137 == -1)) {
+            tree[x_136_save].rightIndex = 3;
+            const BST tint_symbol_8 = {15, -1, -1};
+            tree[3] = tint_symbol_8;
+            x_152_phi = true;
+            break;
+          } else {
+            x_142 = tree[x_136_save].rightIndex;
+            x_125_phi = x_142;
+            {
+              x_125 = x_125_phi;
+              x_124_phi = x_125;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_125 = x_125_phi;
+          x_124_phi = x_125;
+        }
+      }
+      if (x_152_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_157_phi = 0;
+  bool x_185_phi = false;
+  switch(0u) {
+    default: {
+      x_157_phi = 0;
+      while (true) {
+        int x_183 = 0;
+        int x_175 = 0;
+        int x_158 = 0;
+        int x_158_phi = 0;
+        const int x_157 = x_157_phi;
+        x_185_phi = false;
+        if ((x_157 <= 4)) {
+        } else {
+          break;
+        }
+        const int x_164 = tree[x_157].data;
+        if ((7 <= x_164)) {
+          const int x_177_save = x_157;
+          const int x_178 = tree[x_177_save].leftIndex;
+          if ((x_178 == -1)) {
+            tree[x_177_save].leftIndex = 4;
+            const BST tint_symbol_9 = {7, -1, -1};
+            tree[4] = tint_symbol_9;
+            x_185_phi = true;
+            break;
+          } else {
+            x_183 = tree[x_177_save].leftIndex;
+            x_158_phi = x_183;
+            {
+              x_158 = x_158_phi;
+              x_157_phi = x_158;
+            }
+            continue;
+          }
+          return;
+        } else {
+          const int x_169_save = x_157;
+          const int x_170 = tree[x_169_save].rightIndex;
+          if ((x_170 == -1)) {
+            tree[x_169_save].rightIndex = 4;
+            const BST tint_symbol_10 = {7, -1, -1};
+            tree[4] = tint_symbol_10;
+            x_185_phi = true;
+            break;
+          } else {
+            x_175 = tree[x_169_save].rightIndex;
+            x_158_phi = x_175;
+            {
+              x_158 = x_158_phi;
+              x_157_phi = x_158;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_158 = x_158_phi;
+          x_157_phi = x_158;
+        }
+      }
+      if (x_185_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_190_phi = 0;
+  bool x_218_phi = false;
+  switch(0u) {
+    default: {
+      x_190_phi = 0;
+      while (true) {
+        int x_216 = 0;
+        int x_208 = 0;
+        int x_191 = 0;
+        int x_191_phi = 0;
+        const int x_190 = x_190_phi;
+        x_218_phi = false;
+        if ((x_190 <= 5)) {
+        } else {
+          break;
+        }
+        const int x_197 = tree[x_190].data;
+        if ((8 <= x_197)) {
+          const int x_210_save = x_190;
+          const int x_211 = tree[x_210_save].leftIndex;
+          if ((x_211 == -1)) {
+            tree[x_210_save].leftIndex = 5;
+            const BST tint_symbol_11 = {8, -1, -1};
+            tree[5] = tint_symbol_11;
+            x_218_phi = true;
+            break;
+          } else {
+            x_216 = tree[x_210_save].leftIndex;
+            x_191_phi = x_216;
+            {
+              x_191 = x_191_phi;
+              x_190_phi = x_191;
+            }
+            continue;
+          }
+          return;
+        } else {
+          const int x_202_save = x_190;
+          const int x_203 = tree[x_202_save].rightIndex;
+          if ((x_203 == -1)) {
+            tree[x_202_save].rightIndex = 5;
+            const BST tint_symbol_12 = {8, -1, -1};
+            tree[5] = tint_symbol_12;
+            x_218_phi = true;
+            break;
+          } else {
+            x_208 = tree[x_202_save].rightIndex;
+            x_191_phi = x_208;
+            {
+              x_191 = x_191_phi;
+              x_190_phi = x_191;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_191 = x_191_phi;
+          x_190_phi = x_191;
+        }
+      }
+      if (x_218_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_223_phi = 0;
+  bool x_251_phi = false;
+  switch(0u) {
+    default: {
+      x_223_phi = 0;
+      while (true) {
+        int x_249 = 0;
+        int x_241 = 0;
+        int x_224 = 0;
+        int x_224_phi = 0;
+        const int x_223 = x_223_phi;
+        x_251_phi = false;
+        if ((x_223 <= 6)) {
+        } else {
+          break;
+        }
+        const int x_230 = tree[x_223].data;
+        if ((2 <= x_230)) {
+          const int x_243_save = x_223;
+          const int x_244 = tree[x_243_save].leftIndex;
+          if ((x_244 == -1)) {
+            tree[x_243_save].leftIndex = 6;
+            const BST tint_symbol_13 = {2, -1, -1};
+            tree[6] = tint_symbol_13;
+            x_251_phi = true;
+            break;
+          } else {
+            x_249 = tree[x_243_save].leftIndex;
+            x_224_phi = x_249;
+            {
+              x_224 = x_224_phi;
+              x_223_phi = x_224;
+            }
+            continue;
+          }
+          return;
+        } else {
+          const int x_235_save = x_223;
+          const int x_236 = tree[x_235_save].rightIndex;
+          if ((x_236 == -1)) {
+            tree[x_235_save].rightIndex = 6;
+            const BST tint_symbol_14 = {2, -1, -1};
+            tree[6] = tint_symbol_14;
+            x_251_phi = true;
+            break;
+          } else {
+            x_241 = tree[x_235_save].rightIndex;
+            x_224_phi = x_241;
+            {
+              x_224 = x_224_phi;
+              x_223_phi = x_224;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_224 = x_224_phi;
+          x_223_phi = x_224;
+        }
+      }
+      if (x_251_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_256_phi = 0;
+  bool x_284_phi = false;
+  switch(0u) {
+    default: {
+      x_256_phi = 0;
+      while (true) {
+        int x_282 = 0;
+        int x_274 = 0;
+        int x_257 = 0;
+        int x_257_phi = 0;
+        const int x_256 = x_256_phi;
+        x_284_phi = false;
+        if ((x_256 <= 7)) {
+        } else {
+          break;
+        }
+        const int x_263 = tree[x_256].data;
+        if ((6 <= x_263)) {
+          const int x_276_save = x_256;
+          const int x_277 = tree[x_276_save].leftIndex;
+          if ((x_277 == -1)) {
+            tree[x_276_save].leftIndex = 7;
+            const BST tint_symbol_15 = {6, -1, -1};
+            tree[7] = tint_symbol_15;
+            x_284_phi = true;
+            break;
+          } else {
+            x_282 = tree[x_276_save].leftIndex;
+            x_257_phi = x_282;
+            {
+              x_257 = x_257_phi;
+              x_256_phi = x_257;
+            }
+            continue;
+          }
+          return;
+        } else {
+          const int x_268_save = x_256;
+          const int x_269 = tree[x_268_save].rightIndex;
+          if ((x_269 == -1)) {
+            tree[x_268_save].rightIndex = 7;
+            const BST tint_symbol_16 = {6, -1, -1};
+            tree[7] = tint_symbol_16;
+            x_284_phi = true;
+            break;
+          } else {
+            x_274 = tree[x_268_save].rightIndex;
+            x_257_phi = x_274;
+            {
+              x_257 = x_257_phi;
+              x_256_phi = x_257;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_257 = x_257_phi;
+          x_256_phi = x_257;
+        }
+      }
+      if (x_284_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_289_phi = 0;
+  bool x_317_phi = false;
+  switch(0u) {
+    default: {
+      x_289_phi = 0;
+      while (true) {
+        int x_315 = 0;
+        int x_307 = 0;
+        int x_290 = 0;
+        int x_290_phi = 0;
+        const int x_289 = x_289_phi;
+        x_317_phi = false;
+        if ((x_289 <= 8)) {
+        } else {
+          break;
+        }
+        const int x_296 = tree[x_289].data;
+        if ((17 <= x_296)) {
+          const int x_309_save = x_289;
+          const int x_310 = tree[x_309_save].leftIndex;
+          if ((x_310 == -1)) {
+            tree[x_309_save].leftIndex = 8;
+            const BST tint_symbol_17 = {17, -1, -1};
+            tree[8] = tint_symbol_17;
+            x_317_phi = true;
+            break;
+          } else {
+            x_315 = tree[x_309_save].leftIndex;
+            x_290_phi = x_315;
+            {
+              x_290 = x_290_phi;
+              x_289_phi = x_290;
+            }
+            continue;
+          }
+          return;
+        } else {
+          const int x_301_save = x_289;
+          const int x_302 = tree[x_301_save].rightIndex;
+          if ((x_302 == -1)) {
+            tree[x_301_save].rightIndex = 8;
+            const BST tint_symbol_18 = {17, -1, -1};
+            tree[8] = tint_symbol_18;
+            x_317_phi = true;
+            break;
+          } else {
+            x_307 = tree[x_301_save].rightIndex;
+            x_290_phi = x_307;
+            {
+              x_290 = x_290_phi;
+              x_289_phi = x_290;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_290 = x_290_phi;
+          x_289_phi = x_290;
+        }
+      }
+      if (x_317_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_322_phi = 0;
+  bool x_350_phi = false;
+  switch(0u) {
+    default: {
+      x_322_phi = 0;
+      while (true) {
+        int x_348 = 0;
+        int x_340 = 0;
+        int x_323 = 0;
+        int x_323_phi = 0;
+        const int x_322 = x_322_phi;
+        x_350_phi = false;
+        if ((x_322 <= 9)) {
+        } else {
+          break;
+        }
+        const int x_329 = tree[x_322].data;
+        if ((13 <= x_329)) {
+          const int x_342_save = x_322;
+          const int x_343 = tree[x_342_save].leftIndex;
+          if ((x_343 == -1)) {
+            tree[x_342_save].leftIndex = 9;
+            const BST tint_symbol_19 = {13, -1, -1};
+            tree[9] = tint_symbol_19;
+            x_350_phi = true;
+            break;
+          } else {
+            x_348 = tree[x_342_save].leftIndex;
+            x_323_phi = x_348;
+            {
+              x_323 = x_323_phi;
+              x_322_phi = x_323;
+            }
+            continue;
+          }
+          return;
+        } else {
+          const int x_334_save = x_322;
+          const int x_335 = tree[x_334_save].rightIndex;
+          if ((x_335 == -1)) {
+            tree[x_334_save].rightIndex = 9;
+            const BST tint_symbol_20 = {13, -1, -1};
+            tree[9] = tint_symbol_20;
+            x_350_phi = true;
+            break;
+          } else {
+            x_340 = tree[x_334_save].rightIndex;
+            x_323_phi = x_340;
+            {
+              x_323 = x_323_phi;
+              x_322_phi = x_323;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_323 = x_323_phi;
+          x_322_phi = x_323;
+        }
+      }
+      if (x_350_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  x_353_phi = 0;
+  x_356_phi = 0;
+  x_358_phi = 0;
+  while (true) {
+    int x_381 = 0;
+    int x_391 = 0;
+    int x_396 = 0;
+    int x_359 = 0;
+    int x_354_phi = 0;
+    int x_357_phi = 0;
+    const int x_353 = x_353_phi;
+    x_356 = x_356_phi;
+    const int x_358 = x_358_phi;
+    if ((x_358 < 20)) {
+    } else {
+      break;
+    }
+    int x_366_phi = 0;
+    int x_381_phi = 0;
+    bool x_382_phi = false;
+    switch(0u) {
+      default: {
+        x_366_phi = 0;
+        while (true) {
+          const int x_366 = x_366_phi;
+          x_381_phi = x_353;
+          x_382_phi = false;
+          if ((x_366 != -1)) {
+          } else {
+            break;
+          }
+          const BST x_373 = tree[x_366];
+          const int x_374 = x_373.data;
+          const int x_375 = x_373.leftIndex;
+          const int x_376 = x_373.rightIndex;
+          if ((x_374 == x_358)) {
+            x_381_phi = x_358;
+            x_382_phi = true;
+            break;
+          }
+          {
+            x_366_phi = ((x_358 > x_374) ? x_376 : x_375);
+          }
+        }
+        x_381 = x_381_phi;
+        const bool x_382 = x_382_phi;
+        x_354_phi = x_381;
+        if (x_382) {
+          break;
+        }
+        x_354_phi = -1;
+        break;
+      }
+    }
+    int x_354 = 0;
+    int x_390 = 0;
+    int x_395 = 0;
+    int x_391_phi = 0;
+    int x_396_phi = 0;
+    x_354 = x_354_phi;
+    switch(x_358) {
+      case 2:
+      case 5:
+      case 6:
+      case 7:
+      case 8:
+      case 9:
+      case 12:
+      case 13:
+      case 15:
+      case 17: {
+        x_391_phi = x_356;
+        if ((x_354 == asint(x_358))) {
+          x_390 = asint((x_356 + asint(1)));
+          x_391_phi = x_390;
+        }
+        x_391 = x_391_phi;
+        x_357_phi = x_391;
+        break;
+      }
+      default: {
+        x_396_phi = x_356;
+        if ((x_354 == asint(-1))) {
+          x_395 = asint((x_356 + asint(1)));
+          x_396_phi = x_395;
+        }
+        x_396 = x_396_phi;
+        x_357_phi = x_396;
+        break;
+      }
+    }
+    const int x_357 = x_357_phi;
+    {
+      x_359 = (x_358 + 1);
+      x_353_phi = x_354;
+      x_356_phi = x_357;
+      x_358_phi = x_359;
+    }
+  }
+  if ((x_356 == asint(20))) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_21 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_21;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/0.spvasm.expected.msl
new file mode 100644
index 0000000..752c6ed
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/0.spvasm.expected.msl
@@ -0,0 +1,762 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+struct tint_array_wrapper {
+  BST arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_23) {
+  tint_array_wrapper tree = {};
+  int x_356 = 0;
+  int x_58_phi = 0;
+  bool x_86_phi = false;
+  int x_353_phi = 0;
+  int x_356_phi = 0;
+  int x_358_phi = 0;
+  BST const tint_symbol_3 = {.data=9, .leftIndex=-1, .rightIndex=-1};
+  tree.arr[0] = tint_symbol_3;
+  switch(0u) {
+    default: {
+      x_58_phi = 0;
+      while (true) {
+        int x_84 = 0;
+        int x_76 = 0;
+        int x_59 = 0;
+        int x_59_phi = 0;
+        int const x_58 = x_58_phi;
+        x_86_phi = false;
+        if ((x_58 <= 1)) {
+        } else {
+          break;
+        }
+        int const x_65 = tree.arr[x_58].data;
+        if ((5 <= x_65)) {
+          int const x_78_save = x_58;
+          int const x_79 = tree.arr[x_78_save].leftIndex;
+          if ((x_79 == -1)) {
+            tree.arr[x_78_save].leftIndex = 1;
+            BST const tint_symbol_4 = {.data=5, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[1] = tint_symbol_4;
+            x_86_phi = true;
+            break;
+          } else {
+            x_84 = tree.arr[x_78_save].leftIndex;
+            x_59_phi = x_84;
+            {
+              x_59 = x_59_phi;
+              x_58_phi = x_59;
+            }
+            continue;
+          }
+          return;
+        } else {
+          int const x_70_save = x_58;
+          int const x_71 = tree.arr[x_70_save].rightIndex;
+          if ((x_71 == -1)) {
+            tree.arr[x_70_save].rightIndex = 1;
+            BST const tint_symbol_5 = {.data=5, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[1] = tint_symbol_5;
+            x_86_phi = true;
+            break;
+          } else {
+            x_76 = tree.arr[x_70_save].rightIndex;
+            x_59_phi = x_76;
+            {
+              x_59 = x_59_phi;
+              x_58_phi = x_59;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_59 = x_59_phi;
+          x_58_phi = x_59;
+        }
+      }
+      bool const x_86 = x_86_phi;
+      if (x_86) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_91_phi = 0;
+  bool x_119_phi = false;
+  switch(0u) {
+    default: {
+      x_91_phi = 0;
+      while (true) {
+        int x_117 = 0;
+        int x_109 = 0;
+        int x_92 = 0;
+        int x_92_phi = 0;
+        int const x_91 = x_91_phi;
+        x_119_phi = false;
+        if ((x_91 <= 2)) {
+        } else {
+          break;
+        }
+        int const x_98 = tree.arr[x_91].data;
+        if ((12 <= x_98)) {
+          int const x_111_save = x_91;
+          int const x_112 = tree.arr[x_111_save].leftIndex;
+          if ((x_112 == -1)) {
+            tree.arr[x_111_save].leftIndex = 2;
+            BST const tint_symbol_6 = {.data=12, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[2] = tint_symbol_6;
+            x_119_phi = true;
+            break;
+          } else {
+            x_117 = tree.arr[x_111_save].leftIndex;
+            x_92_phi = x_117;
+            {
+              x_92 = x_92_phi;
+              x_91_phi = x_92;
+            }
+            continue;
+          }
+          return;
+        } else {
+          int const x_103_save = x_91;
+          int const x_104 = tree.arr[x_103_save].rightIndex;
+          if ((x_104 == -1)) {
+            tree.arr[x_103_save].rightIndex = 2;
+            BST const tint_symbol_7 = {.data=12, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[2] = tint_symbol_7;
+            x_119_phi = true;
+            break;
+          } else {
+            x_109 = tree.arr[x_103_save].rightIndex;
+            x_92_phi = x_109;
+            {
+              x_92 = x_92_phi;
+              x_91_phi = x_92;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_92 = x_92_phi;
+          x_91_phi = x_92;
+        }
+      }
+      bool const x_119 = x_119_phi;
+      if (x_119) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_124_phi = 0;
+  bool x_152_phi = false;
+  switch(0u) {
+    default: {
+      x_124_phi = 0;
+      while (true) {
+        int x_150 = 0;
+        int x_142 = 0;
+        int x_125 = 0;
+        int x_125_phi = 0;
+        int const x_124 = x_124_phi;
+        x_152_phi = false;
+        if ((x_124 <= 3)) {
+        } else {
+          break;
+        }
+        int const x_131 = tree.arr[x_124].data;
+        if ((15 <= x_131)) {
+          int const x_144_save = x_124;
+          int const x_145 = tree.arr[x_144_save].leftIndex;
+          if ((x_145 == -1)) {
+            tree.arr[x_144_save].leftIndex = 3;
+            BST const tint_symbol_8 = {.data=15, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[3] = tint_symbol_8;
+            x_152_phi = true;
+            break;
+          } else {
+            x_150 = tree.arr[x_144_save].leftIndex;
+            x_125_phi = x_150;
+            {
+              x_125 = x_125_phi;
+              x_124_phi = x_125;
+            }
+            continue;
+          }
+          return;
+        } else {
+          int const x_136_save = x_124;
+          int const x_137 = tree.arr[x_136_save].rightIndex;
+          if ((x_137 == -1)) {
+            tree.arr[x_136_save].rightIndex = 3;
+            BST const tint_symbol_9 = {.data=15, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[3] = tint_symbol_9;
+            x_152_phi = true;
+            break;
+          } else {
+            x_142 = tree.arr[x_136_save].rightIndex;
+            x_125_phi = x_142;
+            {
+              x_125 = x_125_phi;
+              x_124_phi = x_125;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_125 = x_125_phi;
+          x_124_phi = x_125;
+        }
+      }
+      bool const x_152 = x_152_phi;
+      if (x_152) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_157_phi = 0;
+  bool x_185_phi = false;
+  switch(0u) {
+    default: {
+      x_157_phi = 0;
+      while (true) {
+        int x_183 = 0;
+        int x_175 = 0;
+        int x_158 = 0;
+        int x_158_phi = 0;
+        int const x_157 = x_157_phi;
+        x_185_phi = false;
+        if ((x_157 <= 4)) {
+        } else {
+          break;
+        }
+        int const x_164 = tree.arr[x_157].data;
+        if ((7 <= x_164)) {
+          int const x_177_save = x_157;
+          int const x_178 = tree.arr[x_177_save].leftIndex;
+          if ((x_178 == -1)) {
+            tree.arr[x_177_save].leftIndex = 4;
+            BST const tint_symbol_10 = {.data=7, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[4] = tint_symbol_10;
+            x_185_phi = true;
+            break;
+          } else {
+            x_183 = tree.arr[x_177_save].leftIndex;
+            x_158_phi = x_183;
+            {
+              x_158 = x_158_phi;
+              x_157_phi = x_158;
+            }
+            continue;
+          }
+          return;
+        } else {
+          int const x_169_save = x_157;
+          int const x_170 = tree.arr[x_169_save].rightIndex;
+          if ((x_170 == -1)) {
+            tree.arr[x_169_save].rightIndex = 4;
+            BST const tint_symbol_11 = {.data=7, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[4] = tint_symbol_11;
+            x_185_phi = true;
+            break;
+          } else {
+            x_175 = tree.arr[x_169_save].rightIndex;
+            x_158_phi = x_175;
+            {
+              x_158 = x_158_phi;
+              x_157_phi = x_158;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_158 = x_158_phi;
+          x_157_phi = x_158;
+        }
+      }
+      bool const x_185 = x_185_phi;
+      if (x_185) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_190_phi = 0;
+  bool x_218_phi = false;
+  switch(0u) {
+    default: {
+      x_190_phi = 0;
+      while (true) {
+        int x_216 = 0;
+        int x_208 = 0;
+        int x_191 = 0;
+        int x_191_phi = 0;
+        int const x_190 = x_190_phi;
+        x_218_phi = false;
+        if ((x_190 <= 5)) {
+        } else {
+          break;
+        }
+        int const x_197 = tree.arr[x_190].data;
+        if ((8 <= x_197)) {
+          int const x_210_save = x_190;
+          int const x_211 = tree.arr[x_210_save].leftIndex;
+          if ((x_211 == -1)) {
+            tree.arr[x_210_save].leftIndex = 5;
+            BST const tint_symbol_12 = {.data=8, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[5] = tint_symbol_12;
+            x_218_phi = true;
+            break;
+          } else {
+            x_216 = tree.arr[x_210_save].leftIndex;
+            x_191_phi = x_216;
+            {
+              x_191 = x_191_phi;
+              x_190_phi = x_191;
+            }
+            continue;
+          }
+          return;
+        } else {
+          int const x_202_save = x_190;
+          int const x_203 = tree.arr[x_202_save].rightIndex;
+          if ((x_203 == -1)) {
+            tree.arr[x_202_save].rightIndex = 5;
+            BST const tint_symbol_13 = {.data=8, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[5] = tint_symbol_13;
+            x_218_phi = true;
+            break;
+          } else {
+            x_208 = tree.arr[x_202_save].rightIndex;
+            x_191_phi = x_208;
+            {
+              x_191 = x_191_phi;
+              x_190_phi = x_191;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_191 = x_191_phi;
+          x_190_phi = x_191;
+        }
+      }
+      bool const x_218 = x_218_phi;
+      if (x_218) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_223_phi = 0;
+  bool x_251_phi = false;
+  switch(0u) {
+    default: {
+      x_223_phi = 0;
+      while (true) {
+        int x_249 = 0;
+        int x_241 = 0;
+        int x_224 = 0;
+        int x_224_phi = 0;
+        int const x_223 = x_223_phi;
+        x_251_phi = false;
+        if ((x_223 <= 6)) {
+        } else {
+          break;
+        }
+        int const x_230 = tree.arr[x_223].data;
+        if ((2 <= x_230)) {
+          int const x_243_save = x_223;
+          int const x_244 = tree.arr[x_243_save].leftIndex;
+          if ((x_244 == -1)) {
+            tree.arr[x_243_save].leftIndex = 6;
+            BST const tint_symbol_14 = {.data=2, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[6] = tint_symbol_14;
+            x_251_phi = true;
+            break;
+          } else {
+            x_249 = tree.arr[x_243_save].leftIndex;
+            x_224_phi = x_249;
+            {
+              x_224 = x_224_phi;
+              x_223_phi = x_224;
+            }
+            continue;
+          }
+          return;
+        } else {
+          int const x_235_save = x_223;
+          int const x_236 = tree.arr[x_235_save].rightIndex;
+          if ((x_236 == -1)) {
+            tree.arr[x_235_save].rightIndex = 6;
+            BST const tint_symbol_15 = {.data=2, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[6] = tint_symbol_15;
+            x_251_phi = true;
+            break;
+          } else {
+            x_241 = tree.arr[x_235_save].rightIndex;
+            x_224_phi = x_241;
+            {
+              x_224 = x_224_phi;
+              x_223_phi = x_224;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_224 = x_224_phi;
+          x_223_phi = x_224;
+        }
+      }
+      bool const x_251 = x_251_phi;
+      if (x_251) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_256_phi = 0;
+  bool x_284_phi = false;
+  switch(0u) {
+    default: {
+      x_256_phi = 0;
+      while (true) {
+        int x_282 = 0;
+        int x_274 = 0;
+        int x_257 = 0;
+        int x_257_phi = 0;
+        int const x_256 = x_256_phi;
+        x_284_phi = false;
+        if ((x_256 <= 7)) {
+        } else {
+          break;
+        }
+        int const x_263 = tree.arr[x_256].data;
+        if ((6 <= x_263)) {
+          int const x_276_save = x_256;
+          int const x_277 = tree.arr[x_276_save].leftIndex;
+          if ((x_277 == -1)) {
+            tree.arr[x_276_save].leftIndex = 7;
+            BST const tint_symbol_16 = {.data=6, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[7] = tint_symbol_16;
+            x_284_phi = true;
+            break;
+          } else {
+            x_282 = tree.arr[x_276_save].leftIndex;
+            x_257_phi = x_282;
+            {
+              x_257 = x_257_phi;
+              x_256_phi = x_257;
+            }
+            continue;
+          }
+          return;
+        } else {
+          int const x_268_save = x_256;
+          int const x_269 = tree.arr[x_268_save].rightIndex;
+          if ((x_269 == -1)) {
+            tree.arr[x_268_save].rightIndex = 7;
+            BST const tint_symbol_17 = {.data=6, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[7] = tint_symbol_17;
+            x_284_phi = true;
+            break;
+          } else {
+            x_274 = tree.arr[x_268_save].rightIndex;
+            x_257_phi = x_274;
+            {
+              x_257 = x_257_phi;
+              x_256_phi = x_257;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_257 = x_257_phi;
+          x_256_phi = x_257;
+        }
+      }
+      bool const x_284 = x_284_phi;
+      if (x_284) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_289_phi = 0;
+  bool x_317_phi = false;
+  switch(0u) {
+    default: {
+      x_289_phi = 0;
+      while (true) {
+        int x_315 = 0;
+        int x_307 = 0;
+        int x_290 = 0;
+        int x_290_phi = 0;
+        int const x_289 = x_289_phi;
+        x_317_phi = false;
+        if ((x_289 <= 8)) {
+        } else {
+          break;
+        }
+        int const x_296 = tree.arr[x_289].data;
+        if ((17 <= x_296)) {
+          int const x_309_save = x_289;
+          int const x_310 = tree.arr[x_309_save].leftIndex;
+          if ((x_310 == -1)) {
+            tree.arr[x_309_save].leftIndex = 8;
+            BST const tint_symbol_18 = {.data=17, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[8] = tint_symbol_18;
+            x_317_phi = true;
+            break;
+          } else {
+            x_315 = tree.arr[x_309_save].leftIndex;
+            x_290_phi = x_315;
+            {
+              x_290 = x_290_phi;
+              x_289_phi = x_290;
+            }
+            continue;
+          }
+          return;
+        } else {
+          int const x_301_save = x_289;
+          int const x_302 = tree.arr[x_301_save].rightIndex;
+          if ((x_302 == -1)) {
+            tree.arr[x_301_save].rightIndex = 8;
+            BST const tint_symbol_19 = {.data=17, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[8] = tint_symbol_19;
+            x_317_phi = true;
+            break;
+          } else {
+            x_307 = tree.arr[x_301_save].rightIndex;
+            x_290_phi = x_307;
+            {
+              x_290 = x_290_phi;
+              x_289_phi = x_290;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_290 = x_290_phi;
+          x_289_phi = x_290;
+        }
+      }
+      bool const x_317 = x_317_phi;
+      if (x_317) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_322_phi = 0;
+  bool x_350_phi = false;
+  switch(0u) {
+    default: {
+      x_322_phi = 0;
+      while (true) {
+        int x_348 = 0;
+        int x_340 = 0;
+        int x_323 = 0;
+        int x_323_phi = 0;
+        int const x_322 = x_322_phi;
+        x_350_phi = false;
+        if ((x_322 <= 9)) {
+        } else {
+          break;
+        }
+        int const x_329 = tree.arr[x_322].data;
+        if ((13 <= x_329)) {
+          int const x_342_save = x_322;
+          int const x_343 = tree.arr[x_342_save].leftIndex;
+          if ((x_343 == -1)) {
+            tree.arr[x_342_save].leftIndex = 9;
+            BST const tint_symbol_20 = {.data=13, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[9] = tint_symbol_20;
+            x_350_phi = true;
+            break;
+          } else {
+            x_348 = tree.arr[x_342_save].leftIndex;
+            x_323_phi = x_348;
+            {
+              x_323 = x_323_phi;
+              x_322_phi = x_323;
+            }
+            continue;
+          }
+          return;
+        } else {
+          int const x_334_save = x_322;
+          int const x_335 = tree.arr[x_334_save].rightIndex;
+          if ((x_335 == -1)) {
+            tree.arr[x_334_save].rightIndex = 9;
+            BST const tint_symbol_21 = {.data=13, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[9] = tint_symbol_21;
+            x_350_phi = true;
+            break;
+          } else {
+            x_340 = tree.arr[x_334_save].rightIndex;
+            x_323_phi = x_340;
+            {
+              x_323 = x_323_phi;
+              x_322_phi = x_323;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_323 = x_323_phi;
+          x_322_phi = x_323;
+        }
+      }
+      bool const x_350 = x_350_phi;
+      if (x_350) {
+        break;
+      }
+      break;
+    }
+  }
+  x_353_phi = 0;
+  x_356_phi = 0;
+  x_358_phi = 0;
+  while (true) {
+    int x_381 = 0;
+    int x_391 = 0;
+    int x_396 = 0;
+    int x_359 = 0;
+    int x_354_phi = 0;
+    int x_357_phi = 0;
+    int const x_353 = x_353_phi;
+    x_356 = x_356_phi;
+    int const x_358 = x_358_phi;
+    if ((x_358 < 20)) {
+    } else {
+      break;
+    }
+    int x_366_phi = 0;
+    int x_381_phi = 0;
+    bool x_382_phi = false;
+    switch(0u) {
+      default: {
+        x_366_phi = 0;
+        while (true) {
+          int const x_366 = x_366_phi;
+          x_381_phi = x_353;
+          x_382_phi = false;
+          if ((x_366 != -1)) {
+          } else {
+            break;
+          }
+          BST const x_373 = tree.arr[x_366];
+          int const x_374 = x_373.data;
+          int const x_375 = x_373.leftIndex;
+          int const x_376 = x_373.rightIndex;
+          if ((x_374 == x_358)) {
+            x_381_phi = x_358;
+            x_382_phi = true;
+            break;
+          }
+          {
+            x_366_phi = select(x_375, x_376, (x_358 > x_374));
+          }
+        }
+        x_381 = x_381_phi;
+        bool const x_382 = x_382_phi;
+        x_354_phi = x_381;
+        if (x_382) {
+          break;
+        }
+        x_354_phi = -1;
+        break;
+      }
+    }
+    int x_354 = 0;
+    int x_390 = 0;
+    int x_395 = 0;
+    int x_391_phi = 0;
+    int x_396_phi = 0;
+    x_354 = x_354_phi;
+    switch(x_358) {
+      case 2:
+      case 5:
+      case 6:
+      case 7:
+      case 8:
+      case 9:
+      case 12:
+      case 13:
+      case 15:
+      case 17: {
+        x_391_phi = x_356;
+        if ((x_354 == as_type<int>(x_358))) {
+          x_390 = as_type<int>((x_356 + as_type<int>(1)));
+          x_391_phi = x_390;
+        }
+        x_391 = x_391_phi;
+        x_357_phi = x_391;
+        break;
+      }
+      default: {
+        x_396_phi = x_356;
+        if ((x_354 == as_type<int>(-1))) {
+          x_395 = as_type<int>((x_356 + as_type<int>(1)));
+          x_396_phi = x_395;
+        }
+        x_396 = x_396_phi;
+        x_357_phi = x_396;
+        break;
+      }
+    }
+    int const x_357 = x_357_phi;
+    {
+      x_359 = (x_358 + 1);
+      x_353_phi = x_354;
+      x_356_phi = x_357;
+      x_358_phi = x_359;
+    }
+  }
+  if ((x_356 == as_type<int>(20))) {
+    *(tint_symbol_23) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_23) = float4(0.0f, 0.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_24 = 0.0f;
+  main_1(&(tint_symbol_24));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_24};
+  tint_symbol_1 const tint_symbol_22 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_22;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..9ea3312
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/0.spvasm.expected.spvasm
@@ -0,0 +1,1166 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 619
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %BST "BST"
+               OpMemberName %BST 0 "data"
+               OpMemberName %BST 1 "leftIndex"
+               OpMemberName %BST 2 "rightIndex"
+               OpName %tree "tree"
+               OpName %x_356 "x_356"
+               OpName %x_58_phi "x_58_phi"
+               OpName %x_86_phi "x_86_phi"
+               OpName %x_353_phi "x_353_phi"
+               OpName %x_356_phi "x_356_phi"
+               OpName %x_358_phi "x_358_phi"
+               OpName %x_84 "x_84"
+               OpName %x_76 "x_76"
+               OpName %x_59 "x_59"
+               OpName %x_59_phi "x_59_phi"
+               OpName %x_91_phi "x_91_phi"
+               OpName %x_119_phi "x_119_phi"
+               OpName %x_117 "x_117"
+               OpName %x_109 "x_109"
+               OpName %x_92 "x_92"
+               OpName %x_92_phi "x_92_phi"
+               OpName %x_124_phi "x_124_phi"
+               OpName %x_152_phi "x_152_phi"
+               OpName %x_150 "x_150"
+               OpName %x_142 "x_142"
+               OpName %x_125 "x_125"
+               OpName %x_125_phi "x_125_phi"
+               OpName %x_157_phi "x_157_phi"
+               OpName %x_185_phi "x_185_phi"
+               OpName %x_183 "x_183"
+               OpName %x_175 "x_175"
+               OpName %x_158 "x_158"
+               OpName %x_158_phi "x_158_phi"
+               OpName %x_190_phi "x_190_phi"
+               OpName %x_218_phi "x_218_phi"
+               OpName %x_216 "x_216"
+               OpName %x_208 "x_208"
+               OpName %x_191 "x_191"
+               OpName %x_191_phi "x_191_phi"
+               OpName %x_223_phi "x_223_phi"
+               OpName %x_251_phi "x_251_phi"
+               OpName %x_249 "x_249"
+               OpName %x_241 "x_241"
+               OpName %x_224 "x_224"
+               OpName %x_224_phi "x_224_phi"
+               OpName %x_256_phi "x_256_phi"
+               OpName %x_284_phi "x_284_phi"
+               OpName %x_282 "x_282"
+               OpName %x_274 "x_274"
+               OpName %x_257 "x_257"
+               OpName %x_257_phi "x_257_phi"
+               OpName %x_289_phi "x_289_phi"
+               OpName %x_317_phi "x_317_phi"
+               OpName %x_315 "x_315"
+               OpName %x_307 "x_307"
+               OpName %x_290 "x_290"
+               OpName %x_290_phi "x_290_phi"
+               OpName %x_322_phi "x_322_phi"
+               OpName %x_350_phi "x_350_phi"
+               OpName %x_348 "x_348"
+               OpName %x_340 "x_340"
+               OpName %x_323 "x_323"
+               OpName %x_323_phi "x_323_phi"
+               OpName %x_381 "x_381"
+               OpName %x_391 "x_391"
+               OpName %x_396 "x_396"
+               OpName %x_359 "x_359"
+               OpName %x_354_phi "x_354_phi"
+               OpName %x_357_phi "x_357_phi"
+               OpName %x_366_phi "x_366_phi"
+               OpName %x_381_phi "x_381_phi"
+               OpName %x_382_phi "x_382_phi"
+               OpName %x_354 "x_354"
+               OpName %x_390 "x_390"
+               OpName %x_395 "x_395"
+               OpName %x_391_phi "x_391_phi"
+               OpName %x_396_phi "x_396_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %BST 0 Offset 0
+               OpMemberDecorate %BST 1 Offset 4
+               OpMemberDecorate %BST 2 Offset 8
+               OpDecorate %_arr_BST_uint_10 ArrayStride 12
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+        %BST = OpTypeStruct %int %int %int
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_BST_uint_10 = OpTypeArray %BST %uint_10
+%_ptr_Function__arr_BST_uint_10 = OpTypePointer Function %_arr_BST_uint_10
+         %19 = OpConstantNull %_arr_BST_uint_10
+%_ptr_Function_int = OpTypePointer Function %int
+         %22 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %27 = OpConstantNull %bool
+      %int_0 = OpConstant %int 0
+%_ptr_Function_BST = OpTypePointer Function %BST
+      %int_9 = OpConstant %int 9
+     %int_n1 = OpConstant %int -1
+         %36 = OpConstantComposite %BST %int_9 %int_n1 %int_n1
+     %uint_0 = OpConstant %uint 0
+      %false = OpConstantFalse %bool
+      %int_1 = OpConstant %int 1
+      %int_5 = OpConstant %int 5
+     %uint_1 = OpConstant %uint 1
+         %71 = OpConstantComposite %BST %int_5 %int_n1 %int_n1
+       %true = OpConstantTrue %bool
+     %uint_2 = OpConstant %uint 2
+      %int_2 = OpConstant %int 2
+     %int_12 = OpConstant %int 12
+        %126 = OpConstantComposite %BST %int_12 %int_n1 %int_n1
+      %int_3 = OpConstant %int 3
+     %int_15 = OpConstant %int 15
+        %179 = OpConstantComposite %BST %int_15 %int_n1 %int_n1
+      %int_4 = OpConstant %int 4
+      %int_7 = OpConstant %int 7
+        %232 = OpConstantComposite %BST %int_7 %int_n1 %int_n1
+      %int_8 = OpConstant %int 8
+        %284 = OpConstantComposite %BST %int_8 %int_n1 %int_n1
+      %int_6 = OpConstant %int 6
+        %336 = OpConstantComposite %BST %int_2 %int_n1 %int_n1
+        %387 = OpConstantComposite %BST %int_6 %int_n1 %int_n1
+     %int_17 = OpConstant %int 17
+        %439 = OpConstantComposite %BST %int_17 %int_n1 %int_n1
+     %int_13 = OpConstant %int 13
+        %491 = OpConstantComposite %BST %int_13 %int_n1 %int_n1
+     %int_20 = OpConstant %int 20
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+        %605 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %606 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+        %607 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+       %tree = OpVariable %_ptr_Function__arr_BST_uint_10 Function %19
+      %x_356 = OpVariable %_ptr_Function_int Function %22
+   %x_58_phi = OpVariable %_ptr_Function_int Function %22
+   %x_86_phi = OpVariable %_ptr_Function_bool Function %27
+  %x_353_phi = OpVariable %_ptr_Function_int Function %22
+  %x_356_phi = OpVariable %_ptr_Function_int Function %22
+  %x_358_phi = OpVariable %_ptr_Function_int Function %22
+       %x_84 = OpVariable %_ptr_Function_int Function %22
+       %x_76 = OpVariable %_ptr_Function_int Function %22
+       %x_59 = OpVariable %_ptr_Function_int Function %22
+   %x_59_phi = OpVariable %_ptr_Function_int Function %22
+   %x_91_phi = OpVariable %_ptr_Function_int Function %22
+  %x_119_phi = OpVariable %_ptr_Function_bool Function %27
+      %x_117 = OpVariable %_ptr_Function_int Function %22
+      %x_109 = OpVariable %_ptr_Function_int Function %22
+       %x_92 = OpVariable %_ptr_Function_int Function %22
+   %x_92_phi = OpVariable %_ptr_Function_int Function %22
+  %x_124_phi = OpVariable %_ptr_Function_int Function %22
+  %x_152_phi = OpVariable %_ptr_Function_bool Function %27
+      %x_150 = OpVariable %_ptr_Function_int Function %22
+      %x_142 = OpVariable %_ptr_Function_int Function %22
+      %x_125 = OpVariable %_ptr_Function_int Function %22
+  %x_125_phi = OpVariable %_ptr_Function_int Function %22
+  %x_157_phi = OpVariable %_ptr_Function_int Function %22
+  %x_185_phi = OpVariable %_ptr_Function_bool Function %27
+      %x_183 = OpVariable %_ptr_Function_int Function %22
+      %x_175 = OpVariable %_ptr_Function_int Function %22
+      %x_158 = OpVariable %_ptr_Function_int Function %22
+  %x_158_phi = OpVariable %_ptr_Function_int Function %22
+  %x_190_phi = OpVariable %_ptr_Function_int Function %22
+  %x_218_phi = OpVariable %_ptr_Function_bool Function %27
+      %x_216 = OpVariable %_ptr_Function_int Function %22
+      %x_208 = OpVariable %_ptr_Function_int Function %22
+      %x_191 = OpVariable %_ptr_Function_int Function %22
+  %x_191_phi = OpVariable %_ptr_Function_int Function %22
+  %x_223_phi = OpVariable %_ptr_Function_int Function %22
+  %x_251_phi = OpVariable %_ptr_Function_bool Function %27
+      %x_249 = OpVariable %_ptr_Function_int Function %22
+      %x_241 = OpVariable %_ptr_Function_int Function %22
+      %x_224 = OpVariable %_ptr_Function_int Function %22
+  %x_224_phi = OpVariable %_ptr_Function_int Function %22
+  %x_256_phi = OpVariable %_ptr_Function_int Function %22
+  %x_284_phi = OpVariable %_ptr_Function_bool Function %27
+      %x_282 = OpVariable %_ptr_Function_int Function %22
+      %x_274 = OpVariable %_ptr_Function_int Function %22
+      %x_257 = OpVariable %_ptr_Function_int Function %22
+  %x_257_phi = OpVariable %_ptr_Function_int Function %22
+  %x_289_phi = OpVariable %_ptr_Function_int Function %22
+  %x_317_phi = OpVariable %_ptr_Function_bool Function %27
+      %x_315 = OpVariable %_ptr_Function_int Function %22
+      %x_307 = OpVariable %_ptr_Function_int Function %22
+      %x_290 = OpVariable %_ptr_Function_int Function %22
+  %x_290_phi = OpVariable %_ptr_Function_int Function %22
+  %x_322_phi = OpVariable %_ptr_Function_int Function %22
+  %x_350_phi = OpVariable %_ptr_Function_bool Function %27
+      %x_348 = OpVariable %_ptr_Function_int Function %22
+      %x_340 = OpVariable %_ptr_Function_int Function %22
+      %x_323 = OpVariable %_ptr_Function_int Function %22
+  %x_323_phi = OpVariable %_ptr_Function_int Function %22
+      %x_381 = OpVariable %_ptr_Function_int Function %22
+      %x_391 = OpVariable %_ptr_Function_int Function %22
+      %x_396 = OpVariable %_ptr_Function_int Function %22
+      %x_359 = OpVariable %_ptr_Function_int Function %22
+  %x_354_phi = OpVariable %_ptr_Function_int Function %22
+  %x_357_phi = OpVariable %_ptr_Function_int Function %22
+  %x_366_phi = OpVariable %_ptr_Function_int Function %22
+  %x_381_phi = OpVariable %_ptr_Function_int Function %22
+  %x_382_phi = OpVariable %_ptr_Function_bool Function %27
+      %x_354 = OpVariable %_ptr_Function_int Function %22
+      %x_390 = OpVariable %_ptr_Function_int Function %22
+      %x_395 = OpVariable %_ptr_Function_int Function %22
+  %x_391_phi = OpVariable %_ptr_Function_int Function %22
+  %x_396_phi = OpVariable %_ptr_Function_int Function %22
+         %33 = OpAccessChain %_ptr_Function_BST %tree %int_0
+               OpStore %33 %36
+               OpSelectionMerge %37 None
+               OpSwitch %uint_0 %39
+         %39 = OpLabel
+               OpStore %x_58_phi %int_0
+               OpBranch %40
+         %40 = OpLabel
+               OpLoopMerge %41 %42 None
+               OpBranch %43
+         %43 = OpLabel
+         %48 = OpLoad %int %x_58_phi
+               OpStore %x_86_phi %false
+         %51 = OpSLessThanEqual %bool %48 %int_1
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %54
+         %53 = OpLabel
+               OpBranch %52
+         %54 = OpLabel
+               OpBranch %41
+         %52 = OpLabel
+         %55 = OpAccessChain %_ptr_Function_int %tree %48 %uint_0
+         %56 = OpLoad %int %55
+         %58 = OpSLessThanEqual %bool %int_5 %56
+               OpSelectionMerge %59 None
+               OpBranchConditional %58 %60 %61
+         %60 = OpLabel
+         %63 = OpAccessChain %_ptr_Function_int %tree %48 %uint_1
+         %64 = OpLoad %int %63
+         %65 = OpIEqual %bool %64 %int_n1
+               OpSelectionMerge %66 None
+               OpBranchConditional %65 %67 %68
+         %67 = OpLabel
+         %69 = OpAccessChain %_ptr_Function_int %tree %48 %uint_1
+               OpStore %69 %int_1
+         %70 = OpAccessChain %_ptr_Function_BST %tree %int_1
+               OpStore %70 %71
+               OpStore %x_86_phi %true
+               OpBranch %41
+         %68 = OpLabel
+         %73 = OpAccessChain %_ptr_Function_int %tree %48 %uint_1
+         %74 = OpLoad %int %73
+               OpStore %x_84 %74
+         %75 = OpLoad %int %x_84
+               OpStore %x_59_phi %75
+               OpBranch %42
+         %66 = OpLabel
+               OpReturn
+         %61 = OpLabel
+         %77 = OpAccessChain %_ptr_Function_int %tree %48 %uint_2
+         %78 = OpLoad %int %77
+         %79 = OpIEqual %bool %78 %int_n1
+               OpSelectionMerge %80 None
+               OpBranchConditional %79 %81 %82
+         %81 = OpLabel
+         %83 = OpAccessChain %_ptr_Function_int %tree %48 %uint_2
+               OpStore %83 %int_1
+         %84 = OpAccessChain %_ptr_Function_BST %tree %int_1
+               OpStore %84 %71
+               OpStore %x_86_phi %true
+               OpBranch %41
+         %82 = OpLabel
+         %85 = OpAccessChain %_ptr_Function_int %tree %48 %uint_2
+         %86 = OpLoad %int %85
+               OpStore %x_76 %86
+         %87 = OpLoad %int %x_76
+               OpStore %x_59_phi %87
+               OpBranch %42
+         %80 = OpLabel
+               OpReturn
+         %59 = OpLabel
+               OpReturn
+         %42 = OpLabel
+         %88 = OpLoad %int %x_59_phi
+               OpStore %x_59 %88
+         %89 = OpLoad %int %x_59
+               OpStore %x_58_phi %89
+               OpBranch %40
+         %41 = OpLabel
+         %90 = OpLoad %bool %x_86_phi
+               OpSelectionMerge %91 None
+               OpBranchConditional %90 %92 %91
+         %92 = OpLabel
+               OpBranch %37
+         %91 = OpLabel
+               OpBranch %37
+         %37 = OpLabel
+               OpSelectionMerge %95 None
+               OpSwitch %uint_0 %96
+         %96 = OpLabel
+               OpStore %x_91_phi %int_0
+               OpBranch %97
+         %97 = OpLabel
+               OpLoopMerge %98 %99 None
+               OpBranch %100
+        %100 = OpLabel
+        %105 = OpLoad %int %x_91_phi
+               OpStore %x_119_phi %false
+        %107 = OpSLessThanEqual %bool %105 %int_2
+               OpSelectionMerge %108 None
+               OpBranchConditional %107 %109 %110
+        %109 = OpLabel
+               OpBranch %108
+        %110 = OpLabel
+               OpBranch %98
+        %108 = OpLabel
+        %111 = OpAccessChain %_ptr_Function_int %tree %105 %uint_0
+        %112 = OpLoad %int %111
+        %114 = OpSLessThanEqual %bool %int_12 %112
+               OpSelectionMerge %115 None
+               OpBranchConditional %114 %116 %117
+        %116 = OpLabel
+        %118 = OpAccessChain %_ptr_Function_int %tree %105 %uint_1
+        %119 = OpLoad %int %118
+        %120 = OpIEqual %bool %119 %int_n1
+               OpSelectionMerge %121 None
+               OpBranchConditional %120 %122 %123
+        %122 = OpLabel
+        %124 = OpAccessChain %_ptr_Function_int %tree %105 %uint_1
+               OpStore %124 %int_2
+        %125 = OpAccessChain %_ptr_Function_BST %tree %int_2
+               OpStore %125 %126
+               OpStore %x_119_phi %true
+               OpBranch %98
+        %123 = OpLabel
+        %127 = OpAccessChain %_ptr_Function_int %tree %105 %uint_1
+        %128 = OpLoad %int %127
+               OpStore %x_117 %128
+        %129 = OpLoad %int %x_117
+               OpStore %x_92_phi %129
+               OpBranch %99
+        %121 = OpLabel
+               OpReturn
+        %117 = OpLabel
+        %130 = OpAccessChain %_ptr_Function_int %tree %105 %uint_2
+        %131 = OpLoad %int %130
+        %132 = OpIEqual %bool %131 %int_n1
+               OpSelectionMerge %133 None
+               OpBranchConditional %132 %134 %135
+        %134 = OpLabel
+        %136 = OpAccessChain %_ptr_Function_int %tree %105 %uint_2
+               OpStore %136 %int_2
+        %137 = OpAccessChain %_ptr_Function_BST %tree %int_2
+               OpStore %137 %126
+               OpStore %x_119_phi %true
+               OpBranch %98
+        %135 = OpLabel
+        %138 = OpAccessChain %_ptr_Function_int %tree %105 %uint_2
+        %139 = OpLoad %int %138
+               OpStore %x_109 %139
+        %140 = OpLoad %int %x_109
+               OpStore %x_92_phi %140
+               OpBranch %99
+        %133 = OpLabel
+               OpReturn
+        %115 = OpLabel
+               OpReturn
+         %99 = OpLabel
+        %141 = OpLoad %int %x_92_phi
+               OpStore %x_92 %141
+        %142 = OpLoad %int %x_92
+               OpStore %x_91_phi %142
+               OpBranch %97
+         %98 = OpLabel
+        %143 = OpLoad %bool %x_119_phi
+               OpSelectionMerge %144 None
+               OpBranchConditional %143 %145 %144
+        %145 = OpLabel
+               OpBranch %95
+        %144 = OpLabel
+               OpBranch %95
+         %95 = OpLabel
+               OpSelectionMerge %148 None
+               OpSwitch %uint_0 %149
+        %149 = OpLabel
+               OpStore %x_124_phi %int_0
+               OpBranch %150
+        %150 = OpLabel
+               OpLoopMerge %151 %152 None
+               OpBranch %153
+        %153 = OpLabel
+        %158 = OpLoad %int %x_124_phi
+               OpStore %x_152_phi %false
+        %160 = OpSLessThanEqual %bool %158 %int_3
+               OpSelectionMerge %161 None
+               OpBranchConditional %160 %162 %163
+        %162 = OpLabel
+               OpBranch %161
+        %163 = OpLabel
+               OpBranch %151
+        %161 = OpLabel
+        %164 = OpAccessChain %_ptr_Function_int %tree %158 %uint_0
+        %165 = OpLoad %int %164
+        %167 = OpSLessThanEqual %bool %int_15 %165
+               OpSelectionMerge %168 None
+               OpBranchConditional %167 %169 %170
+        %169 = OpLabel
+        %171 = OpAccessChain %_ptr_Function_int %tree %158 %uint_1
+        %172 = OpLoad %int %171
+        %173 = OpIEqual %bool %172 %int_n1
+               OpSelectionMerge %174 None
+               OpBranchConditional %173 %175 %176
+        %175 = OpLabel
+        %177 = OpAccessChain %_ptr_Function_int %tree %158 %uint_1
+               OpStore %177 %int_3
+        %178 = OpAccessChain %_ptr_Function_BST %tree %int_3
+               OpStore %178 %179
+               OpStore %x_152_phi %true
+               OpBranch %151
+        %176 = OpLabel
+        %180 = OpAccessChain %_ptr_Function_int %tree %158 %uint_1
+        %181 = OpLoad %int %180
+               OpStore %x_150 %181
+        %182 = OpLoad %int %x_150
+               OpStore %x_125_phi %182
+               OpBranch %152
+        %174 = OpLabel
+               OpReturn
+        %170 = OpLabel
+        %183 = OpAccessChain %_ptr_Function_int %tree %158 %uint_2
+        %184 = OpLoad %int %183
+        %185 = OpIEqual %bool %184 %int_n1
+               OpSelectionMerge %186 None
+               OpBranchConditional %185 %187 %188
+        %187 = OpLabel
+        %189 = OpAccessChain %_ptr_Function_int %tree %158 %uint_2
+               OpStore %189 %int_3
+        %190 = OpAccessChain %_ptr_Function_BST %tree %int_3
+               OpStore %190 %179
+               OpStore %x_152_phi %true
+               OpBranch %151
+        %188 = OpLabel
+        %191 = OpAccessChain %_ptr_Function_int %tree %158 %uint_2
+        %192 = OpLoad %int %191
+               OpStore %x_142 %192
+        %193 = OpLoad %int %x_142
+               OpStore %x_125_phi %193
+               OpBranch %152
+        %186 = OpLabel
+               OpReturn
+        %168 = OpLabel
+               OpReturn
+        %152 = OpLabel
+        %194 = OpLoad %int %x_125_phi
+               OpStore %x_125 %194
+        %195 = OpLoad %int %x_125
+               OpStore %x_124_phi %195
+               OpBranch %150
+        %151 = OpLabel
+        %196 = OpLoad %bool %x_152_phi
+               OpSelectionMerge %197 None
+               OpBranchConditional %196 %198 %197
+        %198 = OpLabel
+               OpBranch %148
+        %197 = OpLabel
+               OpBranch %148
+        %148 = OpLabel
+               OpSelectionMerge %201 None
+               OpSwitch %uint_0 %202
+        %202 = OpLabel
+               OpStore %x_157_phi %int_0
+               OpBranch %203
+        %203 = OpLabel
+               OpLoopMerge %204 %205 None
+               OpBranch %206
+        %206 = OpLabel
+        %211 = OpLoad %int %x_157_phi
+               OpStore %x_185_phi %false
+        %213 = OpSLessThanEqual %bool %211 %int_4
+               OpSelectionMerge %214 None
+               OpBranchConditional %213 %215 %216
+        %215 = OpLabel
+               OpBranch %214
+        %216 = OpLabel
+               OpBranch %204
+        %214 = OpLabel
+        %217 = OpAccessChain %_ptr_Function_int %tree %211 %uint_0
+        %218 = OpLoad %int %217
+        %220 = OpSLessThanEqual %bool %int_7 %218
+               OpSelectionMerge %221 None
+               OpBranchConditional %220 %222 %223
+        %222 = OpLabel
+        %224 = OpAccessChain %_ptr_Function_int %tree %211 %uint_1
+        %225 = OpLoad %int %224
+        %226 = OpIEqual %bool %225 %int_n1
+               OpSelectionMerge %227 None
+               OpBranchConditional %226 %228 %229
+        %228 = OpLabel
+        %230 = OpAccessChain %_ptr_Function_int %tree %211 %uint_1
+               OpStore %230 %int_4
+        %231 = OpAccessChain %_ptr_Function_BST %tree %int_4
+               OpStore %231 %232
+               OpStore %x_185_phi %true
+               OpBranch %204
+        %229 = OpLabel
+        %233 = OpAccessChain %_ptr_Function_int %tree %211 %uint_1
+        %234 = OpLoad %int %233
+               OpStore %x_183 %234
+        %235 = OpLoad %int %x_183
+               OpStore %x_158_phi %235
+               OpBranch %205
+        %227 = OpLabel
+               OpReturn
+        %223 = OpLabel
+        %236 = OpAccessChain %_ptr_Function_int %tree %211 %uint_2
+        %237 = OpLoad %int %236
+        %238 = OpIEqual %bool %237 %int_n1
+               OpSelectionMerge %239 None
+               OpBranchConditional %238 %240 %241
+        %240 = OpLabel
+        %242 = OpAccessChain %_ptr_Function_int %tree %211 %uint_2
+               OpStore %242 %int_4
+        %243 = OpAccessChain %_ptr_Function_BST %tree %int_4
+               OpStore %243 %232
+               OpStore %x_185_phi %true
+               OpBranch %204
+        %241 = OpLabel
+        %244 = OpAccessChain %_ptr_Function_int %tree %211 %uint_2
+        %245 = OpLoad %int %244
+               OpStore %x_175 %245
+        %246 = OpLoad %int %x_175
+               OpStore %x_158_phi %246
+               OpBranch %205
+        %239 = OpLabel
+               OpReturn
+        %221 = OpLabel
+               OpReturn
+        %205 = OpLabel
+        %247 = OpLoad %int %x_158_phi
+               OpStore %x_158 %247
+        %248 = OpLoad %int %x_158
+               OpStore %x_157_phi %248
+               OpBranch %203
+        %204 = OpLabel
+        %249 = OpLoad %bool %x_185_phi
+               OpSelectionMerge %250 None
+               OpBranchConditional %249 %251 %250
+        %251 = OpLabel
+               OpBranch %201
+        %250 = OpLabel
+               OpBranch %201
+        %201 = OpLabel
+               OpSelectionMerge %254 None
+               OpSwitch %uint_0 %255
+        %255 = OpLabel
+               OpStore %x_190_phi %int_0
+               OpBranch %256
+        %256 = OpLabel
+               OpLoopMerge %257 %258 None
+               OpBranch %259
+        %259 = OpLabel
+        %264 = OpLoad %int %x_190_phi
+               OpStore %x_218_phi %false
+        %265 = OpSLessThanEqual %bool %264 %int_5
+               OpSelectionMerge %266 None
+               OpBranchConditional %265 %267 %268
+        %267 = OpLabel
+               OpBranch %266
+        %268 = OpLabel
+               OpBranch %257
+        %266 = OpLabel
+        %269 = OpAccessChain %_ptr_Function_int %tree %264 %uint_0
+        %270 = OpLoad %int %269
+        %272 = OpSLessThanEqual %bool %int_8 %270
+               OpSelectionMerge %273 None
+               OpBranchConditional %272 %274 %275
+        %274 = OpLabel
+        %276 = OpAccessChain %_ptr_Function_int %tree %264 %uint_1
+        %277 = OpLoad %int %276
+        %278 = OpIEqual %bool %277 %int_n1
+               OpSelectionMerge %279 None
+               OpBranchConditional %278 %280 %281
+        %280 = OpLabel
+        %282 = OpAccessChain %_ptr_Function_int %tree %264 %uint_1
+               OpStore %282 %int_5
+        %283 = OpAccessChain %_ptr_Function_BST %tree %int_5
+               OpStore %283 %284
+               OpStore %x_218_phi %true
+               OpBranch %257
+        %281 = OpLabel
+        %285 = OpAccessChain %_ptr_Function_int %tree %264 %uint_1
+        %286 = OpLoad %int %285
+               OpStore %x_216 %286
+        %287 = OpLoad %int %x_216
+               OpStore %x_191_phi %287
+               OpBranch %258
+        %279 = OpLabel
+               OpReturn
+        %275 = OpLabel
+        %288 = OpAccessChain %_ptr_Function_int %tree %264 %uint_2
+        %289 = OpLoad %int %288
+        %290 = OpIEqual %bool %289 %int_n1
+               OpSelectionMerge %291 None
+               OpBranchConditional %290 %292 %293
+        %292 = OpLabel
+        %294 = OpAccessChain %_ptr_Function_int %tree %264 %uint_2
+               OpStore %294 %int_5
+        %295 = OpAccessChain %_ptr_Function_BST %tree %int_5
+               OpStore %295 %284
+               OpStore %x_218_phi %true
+               OpBranch %257
+        %293 = OpLabel
+        %296 = OpAccessChain %_ptr_Function_int %tree %264 %uint_2
+        %297 = OpLoad %int %296
+               OpStore %x_208 %297
+        %298 = OpLoad %int %x_208
+               OpStore %x_191_phi %298
+               OpBranch %258
+        %291 = OpLabel
+               OpReturn
+        %273 = OpLabel
+               OpReturn
+        %258 = OpLabel
+        %299 = OpLoad %int %x_191_phi
+               OpStore %x_191 %299
+        %300 = OpLoad %int %x_191
+               OpStore %x_190_phi %300
+               OpBranch %256
+        %257 = OpLabel
+        %301 = OpLoad %bool %x_218_phi
+               OpSelectionMerge %302 None
+               OpBranchConditional %301 %303 %302
+        %303 = OpLabel
+               OpBranch %254
+        %302 = OpLabel
+               OpBranch %254
+        %254 = OpLabel
+               OpSelectionMerge %306 None
+               OpSwitch %uint_0 %307
+        %307 = OpLabel
+               OpStore %x_223_phi %int_0
+               OpBranch %308
+        %308 = OpLabel
+               OpLoopMerge %309 %310 None
+               OpBranch %311
+        %311 = OpLabel
+        %316 = OpLoad %int %x_223_phi
+               OpStore %x_251_phi %false
+        %318 = OpSLessThanEqual %bool %316 %int_6
+               OpSelectionMerge %319 None
+               OpBranchConditional %318 %320 %321
+        %320 = OpLabel
+               OpBranch %319
+        %321 = OpLabel
+               OpBranch %309
+        %319 = OpLabel
+        %322 = OpAccessChain %_ptr_Function_int %tree %316 %uint_0
+        %323 = OpLoad %int %322
+        %324 = OpSLessThanEqual %bool %int_2 %323
+               OpSelectionMerge %325 None
+               OpBranchConditional %324 %326 %327
+        %326 = OpLabel
+        %328 = OpAccessChain %_ptr_Function_int %tree %316 %uint_1
+        %329 = OpLoad %int %328
+        %330 = OpIEqual %bool %329 %int_n1
+               OpSelectionMerge %331 None
+               OpBranchConditional %330 %332 %333
+        %332 = OpLabel
+        %334 = OpAccessChain %_ptr_Function_int %tree %316 %uint_1
+               OpStore %334 %int_6
+        %335 = OpAccessChain %_ptr_Function_BST %tree %int_6
+               OpStore %335 %336
+               OpStore %x_251_phi %true
+               OpBranch %309
+        %333 = OpLabel
+        %337 = OpAccessChain %_ptr_Function_int %tree %316 %uint_1
+        %338 = OpLoad %int %337
+               OpStore %x_249 %338
+        %339 = OpLoad %int %x_249
+               OpStore %x_224_phi %339
+               OpBranch %310
+        %331 = OpLabel
+               OpReturn
+        %327 = OpLabel
+        %340 = OpAccessChain %_ptr_Function_int %tree %316 %uint_2
+        %341 = OpLoad %int %340
+        %342 = OpIEqual %bool %341 %int_n1
+               OpSelectionMerge %343 None
+               OpBranchConditional %342 %344 %345
+        %344 = OpLabel
+        %346 = OpAccessChain %_ptr_Function_int %tree %316 %uint_2
+               OpStore %346 %int_6
+        %347 = OpAccessChain %_ptr_Function_BST %tree %int_6
+               OpStore %347 %336
+               OpStore %x_251_phi %true
+               OpBranch %309
+        %345 = OpLabel
+        %348 = OpAccessChain %_ptr_Function_int %tree %316 %uint_2
+        %349 = OpLoad %int %348
+               OpStore %x_241 %349
+        %350 = OpLoad %int %x_241
+               OpStore %x_224_phi %350
+               OpBranch %310
+        %343 = OpLabel
+               OpReturn
+        %325 = OpLabel
+               OpReturn
+        %310 = OpLabel
+        %351 = OpLoad %int %x_224_phi
+               OpStore %x_224 %351
+        %352 = OpLoad %int %x_224
+               OpStore %x_223_phi %352
+               OpBranch %308
+        %309 = OpLabel
+        %353 = OpLoad %bool %x_251_phi
+               OpSelectionMerge %354 None
+               OpBranchConditional %353 %355 %354
+        %355 = OpLabel
+               OpBranch %306
+        %354 = OpLabel
+               OpBranch %306
+        %306 = OpLabel
+               OpSelectionMerge %358 None
+               OpSwitch %uint_0 %359
+        %359 = OpLabel
+               OpStore %x_256_phi %int_0
+               OpBranch %360
+        %360 = OpLabel
+               OpLoopMerge %361 %362 None
+               OpBranch %363
+        %363 = OpLabel
+        %368 = OpLoad %int %x_256_phi
+               OpStore %x_284_phi %false
+        %369 = OpSLessThanEqual %bool %368 %int_7
+               OpSelectionMerge %370 None
+               OpBranchConditional %369 %371 %372
+        %371 = OpLabel
+               OpBranch %370
+        %372 = OpLabel
+               OpBranch %361
+        %370 = OpLabel
+        %373 = OpAccessChain %_ptr_Function_int %tree %368 %uint_0
+        %374 = OpLoad %int %373
+        %375 = OpSLessThanEqual %bool %int_6 %374
+               OpSelectionMerge %376 None
+               OpBranchConditional %375 %377 %378
+        %377 = OpLabel
+        %379 = OpAccessChain %_ptr_Function_int %tree %368 %uint_1
+        %380 = OpLoad %int %379
+        %381 = OpIEqual %bool %380 %int_n1
+               OpSelectionMerge %382 None
+               OpBranchConditional %381 %383 %384
+        %383 = OpLabel
+        %385 = OpAccessChain %_ptr_Function_int %tree %368 %uint_1
+               OpStore %385 %int_7
+        %386 = OpAccessChain %_ptr_Function_BST %tree %int_7
+               OpStore %386 %387
+               OpStore %x_284_phi %true
+               OpBranch %361
+        %384 = OpLabel
+        %388 = OpAccessChain %_ptr_Function_int %tree %368 %uint_1
+        %389 = OpLoad %int %388
+               OpStore %x_282 %389
+        %390 = OpLoad %int %x_282
+               OpStore %x_257_phi %390
+               OpBranch %362
+        %382 = OpLabel
+               OpReturn
+        %378 = OpLabel
+        %391 = OpAccessChain %_ptr_Function_int %tree %368 %uint_2
+        %392 = OpLoad %int %391
+        %393 = OpIEqual %bool %392 %int_n1
+               OpSelectionMerge %394 None
+               OpBranchConditional %393 %395 %396
+        %395 = OpLabel
+        %397 = OpAccessChain %_ptr_Function_int %tree %368 %uint_2
+               OpStore %397 %int_7
+        %398 = OpAccessChain %_ptr_Function_BST %tree %int_7
+               OpStore %398 %387
+               OpStore %x_284_phi %true
+               OpBranch %361
+        %396 = OpLabel
+        %399 = OpAccessChain %_ptr_Function_int %tree %368 %uint_2
+        %400 = OpLoad %int %399
+               OpStore %x_274 %400
+        %401 = OpLoad %int %x_274
+               OpStore %x_257_phi %401
+               OpBranch %362
+        %394 = OpLabel
+               OpReturn
+        %376 = OpLabel
+               OpReturn
+        %362 = OpLabel
+        %402 = OpLoad %int %x_257_phi
+               OpStore %x_257 %402
+        %403 = OpLoad %int %x_257
+               OpStore %x_256_phi %403
+               OpBranch %360
+        %361 = OpLabel
+        %404 = OpLoad %bool %x_284_phi
+               OpSelectionMerge %405 None
+               OpBranchConditional %404 %406 %405
+        %406 = OpLabel
+               OpBranch %358
+        %405 = OpLabel
+               OpBranch %358
+        %358 = OpLabel
+               OpSelectionMerge %409 None
+               OpSwitch %uint_0 %410
+        %410 = OpLabel
+               OpStore %x_289_phi %int_0
+               OpBranch %411
+        %411 = OpLabel
+               OpLoopMerge %412 %413 None
+               OpBranch %414
+        %414 = OpLabel
+        %419 = OpLoad %int %x_289_phi
+               OpStore %x_317_phi %false
+        %420 = OpSLessThanEqual %bool %419 %int_8
+               OpSelectionMerge %421 None
+               OpBranchConditional %420 %422 %423
+        %422 = OpLabel
+               OpBranch %421
+        %423 = OpLabel
+               OpBranch %412
+        %421 = OpLabel
+        %424 = OpAccessChain %_ptr_Function_int %tree %419 %uint_0
+        %425 = OpLoad %int %424
+        %427 = OpSLessThanEqual %bool %int_17 %425
+               OpSelectionMerge %428 None
+               OpBranchConditional %427 %429 %430
+        %429 = OpLabel
+        %431 = OpAccessChain %_ptr_Function_int %tree %419 %uint_1
+        %432 = OpLoad %int %431
+        %433 = OpIEqual %bool %432 %int_n1
+               OpSelectionMerge %434 None
+               OpBranchConditional %433 %435 %436
+        %435 = OpLabel
+        %437 = OpAccessChain %_ptr_Function_int %tree %419 %uint_1
+               OpStore %437 %int_8
+        %438 = OpAccessChain %_ptr_Function_BST %tree %int_8
+               OpStore %438 %439
+               OpStore %x_317_phi %true
+               OpBranch %412
+        %436 = OpLabel
+        %440 = OpAccessChain %_ptr_Function_int %tree %419 %uint_1
+        %441 = OpLoad %int %440
+               OpStore %x_315 %441
+        %442 = OpLoad %int %x_315
+               OpStore %x_290_phi %442
+               OpBranch %413
+        %434 = OpLabel
+               OpReturn
+        %430 = OpLabel
+        %443 = OpAccessChain %_ptr_Function_int %tree %419 %uint_2
+        %444 = OpLoad %int %443
+        %445 = OpIEqual %bool %444 %int_n1
+               OpSelectionMerge %446 None
+               OpBranchConditional %445 %447 %448
+        %447 = OpLabel
+        %449 = OpAccessChain %_ptr_Function_int %tree %419 %uint_2
+               OpStore %449 %int_8
+        %450 = OpAccessChain %_ptr_Function_BST %tree %int_8
+               OpStore %450 %439
+               OpStore %x_317_phi %true
+               OpBranch %412
+        %448 = OpLabel
+        %451 = OpAccessChain %_ptr_Function_int %tree %419 %uint_2
+        %452 = OpLoad %int %451
+               OpStore %x_307 %452
+        %453 = OpLoad %int %x_307
+               OpStore %x_290_phi %453
+               OpBranch %413
+        %446 = OpLabel
+               OpReturn
+        %428 = OpLabel
+               OpReturn
+        %413 = OpLabel
+        %454 = OpLoad %int %x_290_phi
+               OpStore %x_290 %454
+        %455 = OpLoad %int %x_290
+               OpStore %x_289_phi %455
+               OpBranch %411
+        %412 = OpLabel
+        %456 = OpLoad %bool %x_317_phi
+               OpSelectionMerge %457 None
+               OpBranchConditional %456 %458 %457
+        %458 = OpLabel
+               OpBranch %409
+        %457 = OpLabel
+               OpBranch %409
+        %409 = OpLabel
+               OpSelectionMerge %461 None
+               OpSwitch %uint_0 %462
+        %462 = OpLabel
+               OpStore %x_322_phi %int_0
+               OpBranch %463
+        %463 = OpLabel
+               OpLoopMerge %464 %465 None
+               OpBranch %466
+        %466 = OpLabel
+        %471 = OpLoad %int %x_322_phi
+               OpStore %x_350_phi %false
+        %472 = OpSLessThanEqual %bool %471 %int_9
+               OpSelectionMerge %473 None
+               OpBranchConditional %472 %474 %475
+        %474 = OpLabel
+               OpBranch %473
+        %475 = OpLabel
+               OpBranch %464
+        %473 = OpLabel
+        %476 = OpAccessChain %_ptr_Function_int %tree %471 %uint_0
+        %477 = OpLoad %int %476
+        %479 = OpSLessThanEqual %bool %int_13 %477
+               OpSelectionMerge %480 None
+               OpBranchConditional %479 %481 %482
+        %481 = OpLabel
+        %483 = OpAccessChain %_ptr_Function_int %tree %471 %uint_1
+        %484 = OpLoad %int %483
+        %485 = OpIEqual %bool %484 %int_n1
+               OpSelectionMerge %486 None
+               OpBranchConditional %485 %487 %488
+        %487 = OpLabel
+        %489 = OpAccessChain %_ptr_Function_int %tree %471 %uint_1
+               OpStore %489 %int_9
+        %490 = OpAccessChain %_ptr_Function_BST %tree %int_9
+               OpStore %490 %491
+               OpStore %x_350_phi %true
+               OpBranch %464
+        %488 = OpLabel
+        %492 = OpAccessChain %_ptr_Function_int %tree %471 %uint_1
+        %493 = OpLoad %int %492
+               OpStore %x_348 %493
+        %494 = OpLoad %int %x_348
+               OpStore %x_323_phi %494
+               OpBranch %465
+        %486 = OpLabel
+               OpReturn
+        %482 = OpLabel
+        %495 = OpAccessChain %_ptr_Function_int %tree %471 %uint_2
+        %496 = OpLoad %int %495
+        %497 = OpIEqual %bool %496 %int_n1
+               OpSelectionMerge %498 None
+               OpBranchConditional %497 %499 %500
+        %499 = OpLabel
+        %501 = OpAccessChain %_ptr_Function_int %tree %471 %uint_2
+               OpStore %501 %int_9
+        %502 = OpAccessChain %_ptr_Function_BST %tree %int_9
+               OpStore %502 %491
+               OpStore %x_350_phi %true
+               OpBranch %464
+        %500 = OpLabel
+        %503 = OpAccessChain %_ptr_Function_int %tree %471 %uint_2
+        %504 = OpLoad %int %503
+               OpStore %x_340 %504
+        %505 = OpLoad %int %x_340
+               OpStore %x_323_phi %505
+               OpBranch %465
+        %498 = OpLabel
+               OpReturn
+        %480 = OpLabel
+               OpReturn
+        %465 = OpLabel
+        %506 = OpLoad %int %x_323_phi
+               OpStore %x_323 %506
+        %507 = OpLoad %int %x_323
+               OpStore %x_322_phi %507
+               OpBranch %463
+        %464 = OpLabel
+        %508 = OpLoad %bool %x_350_phi
+               OpSelectionMerge %509 None
+               OpBranchConditional %508 %510 %509
+        %510 = OpLabel
+               OpBranch %461
+        %509 = OpLabel
+               OpBranch %461
+        %461 = OpLabel
+               OpStore %x_353_phi %int_0
+               OpStore %x_356_phi %int_0
+               OpStore %x_358_phi %int_0
+               OpBranch %511
+        %511 = OpLabel
+               OpLoopMerge %512 %513 None
+               OpBranch %514
+        %514 = OpLabel
+        %521 = OpLoad %int %x_353_phi
+        %522 = OpLoad %int %x_356_phi
+               OpStore %x_356 %522
+        %523 = OpLoad %int %x_358_phi
+        %525 = OpSLessThan %bool %523 %int_20
+               OpSelectionMerge %526 None
+               OpBranchConditional %525 %527 %528
+        %527 = OpLabel
+               OpBranch %526
+        %528 = OpLabel
+               OpBranch %512
+        %526 = OpLabel
+               OpSelectionMerge %532 None
+               OpSwitch %uint_0 %533
+        %533 = OpLabel
+               OpStore %x_366_phi %int_0
+               OpBranch %534
+        %534 = OpLabel
+               OpLoopMerge %535 %536 None
+               OpBranch %537
+        %537 = OpLabel
+        %538 = OpLoad %int %x_366_phi
+               OpStore %x_381_phi %521
+               OpStore %x_382_phi %false
+        %539 = OpINotEqual %bool %538 %int_n1
+               OpSelectionMerge %540 None
+               OpBranchConditional %539 %541 %542
+        %541 = OpLabel
+               OpBranch %540
+        %542 = OpLabel
+               OpBranch %535
+        %540 = OpLabel
+        %543 = OpAccessChain %_ptr_Function_BST %tree %538
+        %544 = OpLoad %BST %543
+        %545 = OpCompositeExtract %int %544 0
+        %546 = OpCompositeExtract %int %544 1
+        %547 = OpCompositeExtract %int %544 2
+        %548 = OpIEqual %bool %545 %523
+               OpSelectionMerge %549 None
+               OpBranchConditional %548 %550 %549
+        %550 = OpLabel
+               OpStore %x_381_phi %523
+               OpStore %x_382_phi %true
+               OpBranch %535
+        %549 = OpLabel
+               OpBranch %536
+        %536 = OpLabel
+        %552 = OpSGreaterThan %bool %523 %545
+        %551 = OpSelect %int %552 %547 %546
+               OpStore %x_366_phi %551
+               OpBranch %534
+        %535 = OpLabel
+        %553 = OpLoad %int %x_381_phi
+               OpStore %x_381 %553
+        %554 = OpLoad %bool %x_382_phi
+        %555 = OpLoad %int %x_381
+               OpStore %x_354_phi %555
+               OpSelectionMerge %556 None
+               OpBranchConditional %554 %557 %556
+        %557 = OpLabel
+               OpBranch %532
+        %556 = OpLabel
+               OpStore %x_354_phi %int_n1
+               OpBranch %532
+        %532 = OpLabel
+        %563 = OpLoad %int %x_354_phi
+               OpStore %x_354 %563
+               OpSelectionMerge %564 None
+               OpSwitch %523 %565 2 %566 5 %566 6 %566 7 %566 8 %566 9 %566 12 %566 13 %566 15 %566 17 %566
+        %566 = OpLabel
+        %567 = OpLoad %int %x_356
+               OpStore %x_391_phi %567
+        %568 = OpLoad %int %x_354
+        %569 = OpCopyObject %int %523
+        %570 = OpIEqual %bool %568 %569
+               OpSelectionMerge %571 None
+               OpBranchConditional %570 %572 %571
+        %572 = OpLabel
+        %574 = OpLoad %int %x_356
+        %575 = OpCopyObject %int %int_1
+        %576 = OpIAdd %int %574 %575
+        %573 = OpCopyObject %int %576
+               OpStore %x_390 %573
+        %577 = OpLoad %int %x_390
+               OpStore %x_391_phi %577
+               OpBranch %571
+        %571 = OpLabel
+        %578 = OpLoad %int %x_391_phi
+               OpStore %x_391 %578
+        %579 = OpLoad %int %x_391
+               OpStore %x_357_phi %579
+               OpBranch %564
+        %565 = OpLabel
+        %580 = OpLoad %int %x_356
+               OpStore %x_396_phi %580
+        %581 = OpLoad %int %x_354
+        %582 = OpCopyObject %int %int_n1
+        %583 = OpIEqual %bool %581 %582
+               OpSelectionMerge %584 None
+               OpBranchConditional %583 %585 %584
+        %585 = OpLabel
+        %587 = OpLoad %int %x_356
+        %588 = OpCopyObject %int %int_1
+        %589 = OpIAdd %int %587 %588
+        %586 = OpCopyObject %int %589
+               OpStore %x_395 %586
+        %590 = OpLoad %int %x_395
+               OpStore %x_396_phi %590
+               OpBranch %584
+        %584 = OpLabel
+        %591 = OpLoad %int %x_396_phi
+               OpStore %x_396 %591
+        %592 = OpLoad %int %x_396
+               OpStore %x_357_phi %592
+               OpBranch %564
+        %564 = OpLabel
+        %593 = OpLoad %int %x_357_phi
+               OpBranch %513
+        %513 = OpLabel
+        %594 = OpIAdd %int %523 %int_1
+               OpStore %x_359 %594
+        %595 = OpLoad %int %x_354
+               OpStore %x_353_phi %595
+               OpStore %x_356_phi %593
+        %596 = OpLoad %int %x_359
+               OpStore %x_358_phi %596
+               OpBranch %511
+        %512 = OpLabel
+        %597 = OpLoad %int %x_356
+        %598 = OpCopyObject %int %int_20
+        %599 = OpIEqual %bool %597 %598
+               OpSelectionMerge %600 None
+               OpBranchConditional %599 %601 %602
+        %601 = OpLabel
+               OpStore %x_GLF_color %605
+               OpBranch %600
+        %602 = OpLabel
+               OpStore %x_GLF_color %606
+               OpBranch %600
+        %600 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %607
+%tint_symbol = OpFunctionParameter %main_out
+        %611 = OpLabel
+        %612 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %612
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+        %614 = OpLabel
+        %615 = OpFunctionCall %void %main_1
+        %617 = OpLoad %v4float %x_GLF_color
+        %618 = OpCompositeConstruct %main_out %617
+        %616 = OpFunctionCall %void %tint_symbol_2 %618
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..76d569e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/0.spvasm.expected.wgsl
@@ -0,0 +1,653 @@
+struct BST {
+  data : i32;
+  leftIndex : i32;
+  rightIndex : i32;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var tree : array<BST, 10>;
+  var x_356 : i32;
+  var x_58_phi : i32;
+  var x_86_phi : bool;
+  var x_353_phi : i32;
+  var x_356_phi : i32;
+  var x_358_phi : i32;
+  tree[0] = BST(9, -1, -1);
+  switch(0u) {
+    default: {
+      x_58_phi = 0;
+      loop {
+        var x_84 : i32;
+        var x_76 : i32;
+        var x_59 : i32;
+        var x_59_phi : i32;
+        let x_58 : i32 = x_58_phi;
+        x_86_phi = false;
+        if ((x_58 <= 1)) {
+        } else {
+          break;
+        }
+        let x_65 : i32 = tree[x_58].data;
+        if ((5 <= x_65)) {
+          let x_78 : ptr<function, i32> = &(tree[x_58].leftIndex);
+          let x_79 : i32 = *(x_78);
+          if ((x_79 == -1)) {
+            *(x_78) = 1;
+            tree[1] = BST(5, -1, -1);
+            x_86_phi = true;
+            break;
+          } else {
+            x_84 = *(x_78);
+            x_59_phi = x_84;
+            continue;
+          }
+          return;
+        } else {
+          let x_70 : ptr<function, i32> = &(tree[x_58].rightIndex);
+          let x_71 : i32 = *(x_70);
+          if ((x_71 == -1)) {
+            *(x_70) = 1;
+            tree[1] = BST(5, -1, -1);
+            x_86_phi = true;
+            break;
+          } else {
+            x_76 = *(x_70);
+            x_59_phi = x_76;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_59 = x_59_phi;
+          x_58_phi = x_59;
+        }
+      }
+      let x_86 : bool = x_86_phi;
+      if (x_86) {
+        break;
+      }
+    }
+  }
+  var x_91_phi : i32;
+  var x_119_phi : bool;
+  switch(0u) {
+    default: {
+      x_91_phi = 0;
+      loop {
+        var x_117 : i32;
+        var x_109 : i32;
+        var x_92 : i32;
+        var x_92_phi : i32;
+        let x_91 : i32 = x_91_phi;
+        x_119_phi = false;
+        if ((x_91 <= 2)) {
+        } else {
+          break;
+        }
+        let x_98 : i32 = tree[x_91].data;
+        if ((12 <= x_98)) {
+          let x_111 : ptr<function, i32> = &(tree[x_91].leftIndex);
+          let x_112 : i32 = *(x_111);
+          if ((x_112 == -1)) {
+            *(x_111) = 2;
+            tree[2] = BST(12, -1, -1);
+            x_119_phi = true;
+            break;
+          } else {
+            x_117 = *(x_111);
+            x_92_phi = x_117;
+            continue;
+          }
+          return;
+        } else {
+          let x_103 : ptr<function, i32> = &(tree[x_91].rightIndex);
+          let x_104 : i32 = *(x_103);
+          if ((x_104 == -1)) {
+            *(x_103) = 2;
+            tree[2] = BST(12, -1, -1);
+            x_119_phi = true;
+            break;
+          } else {
+            x_109 = *(x_103);
+            x_92_phi = x_109;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_92 = x_92_phi;
+          x_91_phi = x_92;
+        }
+      }
+      let x_119 : bool = x_119_phi;
+      if (x_119) {
+        break;
+      }
+    }
+  }
+  var x_124_phi : i32;
+  var x_152_phi : bool;
+  switch(0u) {
+    default: {
+      x_124_phi = 0;
+      loop {
+        var x_150 : i32;
+        var x_142 : i32;
+        var x_125 : i32;
+        var x_125_phi : i32;
+        let x_124 : i32 = x_124_phi;
+        x_152_phi = false;
+        if ((x_124 <= 3)) {
+        } else {
+          break;
+        }
+        let x_131 : i32 = tree[x_124].data;
+        if ((15 <= x_131)) {
+          let x_144 : ptr<function, i32> = &(tree[x_124].leftIndex);
+          let x_145 : i32 = *(x_144);
+          if ((x_145 == -1)) {
+            *(x_144) = 3;
+            tree[3] = BST(15, -1, -1);
+            x_152_phi = true;
+            break;
+          } else {
+            x_150 = *(x_144);
+            x_125_phi = x_150;
+            continue;
+          }
+          return;
+        } else {
+          let x_136 : ptr<function, i32> = &(tree[x_124].rightIndex);
+          let x_137 : i32 = *(x_136);
+          if ((x_137 == -1)) {
+            *(x_136) = 3;
+            tree[3] = BST(15, -1, -1);
+            x_152_phi = true;
+            break;
+          } else {
+            x_142 = *(x_136);
+            x_125_phi = x_142;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_125 = x_125_phi;
+          x_124_phi = x_125;
+        }
+      }
+      let x_152 : bool = x_152_phi;
+      if (x_152) {
+        break;
+      }
+    }
+  }
+  var x_157_phi : i32;
+  var x_185_phi : bool;
+  switch(0u) {
+    default: {
+      x_157_phi = 0;
+      loop {
+        var x_183 : i32;
+        var x_175 : i32;
+        var x_158 : i32;
+        var x_158_phi : i32;
+        let x_157 : i32 = x_157_phi;
+        x_185_phi = false;
+        if ((x_157 <= 4)) {
+        } else {
+          break;
+        }
+        let x_164 : i32 = tree[x_157].data;
+        if ((7 <= x_164)) {
+          let x_177 : ptr<function, i32> = &(tree[x_157].leftIndex);
+          let x_178 : i32 = *(x_177);
+          if ((x_178 == -1)) {
+            *(x_177) = 4;
+            tree[4] = BST(7, -1, -1);
+            x_185_phi = true;
+            break;
+          } else {
+            x_183 = *(x_177);
+            x_158_phi = x_183;
+            continue;
+          }
+          return;
+        } else {
+          let x_169 : ptr<function, i32> = &(tree[x_157].rightIndex);
+          let x_170 : i32 = *(x_169);
+          if ((x_170 == -1)) {
+            *(x_169) = 4;
+            tree[4] = BST(7, -1, -1);
+            x_185_phi = true;
+            break;
+          } else {
+            x_175 = *(x_169);
+            x_158_phi = x_175;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_158 = x_158_phi;
+          x_157_phi = x_158;
+        }
+      }
+      let x_185 : bool = x_185_phi;
+      if (x_185) {
+        break;
+      }
+    }
+  }
+  var x_190_phi : i32;
+  var x_218_phi : bool;
+  switch(0u) {
+    default: {
+      x_190_phi = 0;
+      loop {
+        var x_216 : i32;
+        var x_208 : i32;
+        var x_191 : i32;
+        var x_191_phi : i32;
+        let x_190 : i32 = x_190_phi;
+        x_218_phi = false;
+        if ((x_190 <= 5)) {
+        } else {
+          break;
+        }
+        let x_197 : i32 = tree[x_190].data;
+        if ((8 <= x_197)) {
+          let x_210 : ptr<function, i32> = &(tree[x_190].leftIndex);
+          let x_211 : i32 = *(x_210);
+          if ((x_211 == -1)) {
+            *(x_210) = 5;
+            tree[5] = BST(8, -1, -1);
+            x_218_phi = true;
+            break;
+          } else {
+            x_216 = *(x_210);
+            x_191_phi = x_216;
+            continue;
+          }
+          return;
+        } else {
+          let x_202 : ptr<function, i32> = &(tree[x_190].rightIndex);
+          let x_203 : i32 = *(x_202);
+          if ((x_203 == -1)) {
+            *(x_202) = 5;
+            tree[5] = BST(8, -1, -1);
+            x_218_phi = true;
+            break;
+          } else {
+            x_208 = *(x_202);
+            x_191_phi = x_208;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_191 = x_191_phi;
+          x_190_phi = x_191;
+        }
+      }
+      let x_218 : bool = x_218_phi;
+      if (x_218) {
+        break;
+      }
+    }
+  }
+  var x_223_phi : i32;
+  var x_251_phi : bool;
+  switch(0u) {
+    default: {
+      x_223_phi = 0;
+      loop {
+        var x_249 : i32;
+        var x_241 : i32;
+        var x_224 : i32;
+        var x_224_phi : i32;
+        let x_223 : i32 = x_223_phi;
+        x_251_phi = false;
+        if ((x_223 <= 6)) {
+        } else {
+          break;
+        }
+        let x_230 : i32 = tree[x_223].data;
+        if ((2 <= x_230)) {
+          let x_243 : ptr<function, i32> = &(tree[x_223].leftIndex);
+          let x_244 : i32 = *(x_243);
+          if ((x_244 == -1)) {
+            *(x_243) = 6;
+            tree[6] = BST(2, -1, -1);
+            x_251_phi = true;
+            break;
+          } else {
+            x_249 = *(x_243);
+            x_224_phi = x_249;
+            continue;
+          }
+          return;
+        } else {
+          let x_235 : ptr<function, i32> = &(tree[x_223].rightIndex);
+          let x_236 : i32 = *(x_235);
+          if ((x_236 == -1)) {
+            *(x_235) = 6;
+            tree[6] = BST(2, -1, -1);
+            x_251_phi = true;
+            break;
+          } else {
+            x_241 = *(x_235);
+            x_224_phi = x_241;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_224 = x_224_phi;
+          x_223_phi = x_224;
+        }
+      }
+      let x_251 : bool = x_251_phi;
+      if (x_251) {
+        break;
+      }
+    }
+  }
+  var x_256_phi : i32;
+  var x_284_phi : bool;
+  switch(0u) {
+    default: {
+      x_256_phi = 0;
+      loop {
+        var x_282 : i32;
+        var x_274 : i32;
+        var x_257 : i32;
+        var x_257_phi : i32;
+        let x_256 : i32 = x_256_phi;
+        x_284_phi = false;
+        if ((x_256 <= 7)) {
+        } else {
+          break;
+        }
+        let x_263 : i32 = tree[x_256].data;
+        if ((6 <= x_263)) {
+          let x_276 : ptr<function, i32> = &(tree[x_256].leftIndex);
+          let x_277 : i32 = *(x_276);
+          if ((x_277 == -1)) {
+            *(x_276) = 7;
+            tree[7] = BST(6, -1, -1);
+            x_284_phi = true;
+            break;
+          } else {
+            x_282 = *(x_276);
+            x_257_phi = x_282;
+            continue;
+          }
+          return;
+        } else {
+          let x_268 : ptr<function, i32> = &(tree[x_256].rightIndex);
+          let x_269 : i32 = *(x_268);
+          if ((x_269 == -1)) {
+            *(x_268) = 7;
+            tree[7] = BST(6, -1, -1);
+            x_284_phi = true;
+            break;
+          } else {
+            x_274 = *(x_268);
+            x_257_phi = x_274;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_257 = x_257_phi;
+          x_256_phi = x_257;
+        }
+      }
+      let x_284 : bool = x_284_phi;
+      if (x_284) {
+        break;
+      }
+    }
+  }
+  var x_289_phi : i32;
+  var x_317_phi : bool;
+  switch(0u) {
+    default: {
+      x_289_phi = 0;
+      loop {
+        var x_315 : i32;
+        var x_307 : i32;
+        var x_290 : i32;
+        var x_290_phi : i32;
+        let x_289 : i32 = x_289_phi;
+        x_317_phi = false;
+        if ((x_289 <= 8)) {
+        } else {
+          break;
+        }
+        let x_296 : i32 = tree[x_289].data;
+        if ((17 <= x_296)) {
+          let x_309 : ptr<function, i32> = &(tree[x_289].leftIndex);
+          let x_310 : i32 = *(x_309);
+          if ((x_310 == -1)) {
+            *(x_309) = 8;
+            tree[8] = BST(17, -1, -1);
+            x_317_phi = true;
+            break;
+          } else {
+            x_315 = *(x_309);
+            x_290_phi = x_315;
+            continue;
+          }
+          return;
+        } else {
+          let x_301 : ptr<function, i32> = &(tree[x_289].rightIndex);
+          let x_302 : i32 = *(x_301);
+          if ((x_302 == -1)) {
+            *(x_301) = 8;
+            tree[8] = BST(17, -1, -1);
+            x_317_phi = true;
+            break;
+          } else {
+            x_307 = *(x_301);
+            x_290_phi = x_307;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_290 = x_290_phi;
+          x_289_phi = x_290;
+        }
+      }
+      let x_317 : bool = x_317_phi;
+      if (x_317) {
+        break;
+      }
+    }
+  }
+  var x_322_phi : i32;
+  var x_350_phi : bool;
+  switch(0u) {
+    default: {
+      x_322_phi = 0;
+      loop {
+        var x_348 : i32;
+        var x_340 : i32;
+        var x_323 : i32;
+        var x_323_phi : i32;
+        let x_322 : i32 = x_322_phi;
+        x_350_phi = false;
+        if ((x_322 <= 9)) {
+        } else {
+          break;
+        }
+        let x_329 : i32 = tree[x_322].data;
+        if ((13 <= x_329)) {
+          let x_342 : ptr<function, i32> = &(tree[x_322].leftIndex);
+          let x_343 : i32 = *(x_342);
+          if ((x_343 == -1)) {
+            *(x_342) = 9;
+            tree[9] = BST(13, -1, -1);
+            x_350_phi = true;
+            break;
+          } else {
+            x_348 = *(x_342);
+            x_323_phi = x_348;
+            continue;
+          }
+          return;
+        } else {
+          let x_334 : ptr<function, i32> = &(tree[x_322].rightIndex);
+          let x_335 : i32 = *(x_334);
+          if ((x_335 == -1)) {
+            *(x_334) = 9;
+            tree[9] = BST(13, -1, -1);
+            x_350_phi = true;
+            break;
+          } else {
+            x_340 = *(x_334);
+            x_323_phi = x_340;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_323 = x_323_phi;
+          x_322_phi = x_323;
+        }
+      }
+      let x_350 : bool = x_350_phi;
+      if (x_350) {
+        break;
+      }
+    }
+  }
+  x_353_phi = 0;
+  x_356_phi = 0;
+  x_358_phi = 0;
+  loop {
+    var x_381 : i32;
+    var x_391 : i32;
+    var x_396 : i32;
+    var x_359 : i32;
+    var x_354_phi : i32;
+    var x_357_phi : i32;
+    let x_353 : i32 = x_353_phi;
+    x_356 = x_356_phi;
+    let x_358 : i32 = x_358_phi;
+    if ((x_358 < 20)) {
+    } else {
+      break;
+    }
+    var x_366_phi : i32;
+    var x_381_phi : i32;
+    var x_382_phi : bool;
+    switch(0u) {
+      default: {
+        x_366_phi = 0;
+        loop {
+          let x_366 : i32 = x_366_phi;
+          x_381_phi = x_353;
+          x_382_phi = false;
+          if ((x_366 != -1)) {
+          } else {
+            break;
+          }
+          let x_373 : BST = tree[x_366];
+          let x_374 : i32 = x_373.data;
+          let x_375 : i32 = x_373.leftIndex;
+          let x_376 : i32 = x_373.rightIndex;
+          if ((x_374 == x_358)) {
+            x_381_phi = x_358;
+            x_382_phi = true;
+            break;
+          }
+
+          continuing {
+            x_366_phi = select(x_375, x_376, (x_358 > x_374));
+          }
+        }
+        x_381 = x_381_phi;
+        let x_382 : bool = x_382_phi;
+        x_354_phi = x_381;
+        if (x_382) {
+          break;
+        }
+        x_354_phi = -1;
+      }
+    }
+    var x_354 : i32;
+    var x_390 : i32;
+    var x_395 : i32;
+    var x_391_phi : i32;
+    var x_396_phi : i32;
+    x_354 = x_354_phi;
+    switch(x_358) {
+      case 2, 5, 6, 7, 8, 9, 12, 13, 15, 17: {
+        x_391_phi = x_356;
+        if ((x_354 == bitcast<i32>(x_358))) {
+          x_390 = bitcast<i32>((x_356 + bitcast<i32>(1)));
+          x_391_phi = x_390;
+        }
+        x_391 = x_391_phi;
+        x_357_phi = x_391;
+      }
+      default: {
+        x_396_phi = x_356;
+        if ((x_354 == bitcast<i32>(-1))) {
+          x_395 = bitcast<i32>((x_356 + bitcast<i32>(1)));
+          x_396_phi = x_395;
+        }
+        x_396 = x_396_phi;
+        x_357_phi = x_396;
+      }
+    }
+    let x_357 : i32 = x_357_phi;
+
+    continuing {
+      x_359 = (x_358 + 1);
+      x_353_phi = x_354;
+      x_356_phi = x_357;
+      x_358_phi = x_359;
+    }
+  }
+  if ((x_356 == bitcast<i32>(20))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/0.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/0.wgsl
new file mode 100644
index 0000000..76d569e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/0.wgsl
@@ -0,0 +1,653 @@
+struct BST {
+  data : i32;
+  leftIndex : i32;
+  rightIndex : i32;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var tree : array<BST, 10>;
+  var x_356 : i32;
+  var x_58_phi : i32;
+  var x_86_phi : bool;
+  var x_353_phi : i32;
+  var x_356_phi : i32;
+  var x_358_phi : i32;
+  tree[0] = BST(9, -1, -1);
+  switch(0u) {
+    default: {
+      x_58_phi = 0;
+      loop {
+        var x_84 : i32;
+        var x_76 : i32;
+        var x_59 : i32;
+        var x_59_phi : i32;
+        let x_58 : i32 = x_58_phi;
+        x_86_phi = false;
+        if ((x_58 <= 1)) {
+        } else {
+          break;
+        }
+        let x_65 : i32 = tree[x_58].data;
+        if ((5 <= x_65)) {
+          let x_78 : ptr<function, i32> = &(tree[x_58].leftIndex);
+          let x_79 : i32 = *(x_78);
+          if ((x_79 == -1)) {
+            *(x_78) = 1;
+            tree[1] = BST(5, -1, -1);
+            x_86_phi = true;
+            break;
+          } else {
+            x_84 = *(x_78);
+            x_59_phi = x_84;
+            continue;
+          }
+          return;
+        } else {
+          let x_70 : ptr<function, i32> = &(tree[x_58].rightIndex);
+          let x_71 : i32 = *(x_70);
+          if ((x_71 == -1)) {
+            *(x_70) = 1;
+            tree[1] = BST(5, -1, -1);
+            x_86_phi = true;
+            break;
+          } else {
+            x_76 = *(x_70);
+            x_59_phi = x_76;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_59 = x_59_phi;
+          x_58_phi = x_59;
+        }
+      }
+      let x_86 : bool = x_86_phi;
+      if (x_86) {
+        break;
+      }
+    }
+  }
+  var x_91_phi : i32;
+  var x_119_phi : bool;
+  switch(0u) {
+    default: {
+      x_91_phi = 0;
+      loop {
+        var x_117 : i32;
+        var x_109 : i32;
+        var x_92 : i32;
+        var x_92_phi : i32;
+        let x_91 : i32 = x_91_phi;
+        x_119_phi = false;
+        if ((x_91 <= 2)) {
+        } else {
+          break;
+        }
+        let x_98 : i32 = tree[x_91].data;
+        if ((12 <= x_98)) {
+          let x_111 : ptr<function, i32> = &(tree[x_91].leftIndex);
+          let x_112 : i32 = *(x_111);
+          if ((x_112 == -1)) {
+            *(x_111) = 2;
+            tree[2] = BST(12, -1, -1);
+            x_119_phi = true;
+            break;
+          } else {
+            x_117 = *(x_111);
+            x_92_phi = x_117;
+            continue;
+          }
+          return;
+        } else {
+          let x_103 : ptr<function, i32> = &(tree[x_91].rightIndex);
+          let x_104 : i32 = *(x_103);
+          if ((x_104 == -1)) {
+            *(x_103) = 2;
+            tree[2] = BST(12, -1, -1);
+            x_119_phi = true;
+            break;
+          } else {
+            x_109 = *(x_103);
+            x_92_phi = x_109;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_92 = x_92_phi;
+          x_91_phi = x_92;
+        }
+      }
+      let x_119 : bool = x_119_phi;
+      if (x_119) {
+        break;
+      }
+    }
+  }
+  var x_124_phi : i32;
+  var x_152_phi : bool;
+  switch(0u) {
+    default: {
+      x_124_phi = 0;
+      loop {
+        var x_150 : i32;
+        var x_142 : i32;
+        var x_125 : i32;
+        var x_125_phi : i32;
+        let x_124 : i32 = x_124_phi;
+        x_152_phi = false;
+        if ((x_124 <= 3)) {
+        } else {
+          break;
+        }
+        let x_131 : i32 = tree[x_124].data;
+        if ((15 <= x_131)) {
+          let x_144 : ptr<function, i32> = &(tree[x_124].leftIndex);
+          let x_145 : i32 = *(x_144);
+          if ((x_145 == -1)) {
+            *(x_144) = 3;
+            tree[3] = BST(15, -1, -1);
+            x_152_phi = true;
+            break;
+          } else {
+            x_150 = *(x_144);
+            x_125_phi = x_150;
+            continue;
+          }
+          return;
+        } else {
+          let x_136 : ptr<function, i32> = &(tree[x_124].rightIndex);
+          let x_137 : i32 = *(x_136);
+          if ((x_137 == -1)) {
+            *(x_136) = 3;
+            tree[3] = BST(15, -1, -1);
+            x_152_phi = true;
+            break;
+          } else {
+            x_142 = *(x_136);
+            x_125_phi = x_142;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_125 = x_125_phi;
+          x_124_phi = x_125;
+        }
+      }
+      let x_152 : bool = x_152_phi;
+      if (x_152) {
+        break;
+      }
+    }
+  }
+  var x_157_phi : i32;
+  var x_185_phi : bool;
+  switch(0u) {
+    default: {
+      x_157_phi = 0;
+      loop {
+        var x_183 : i32;
+        var x_175 : i32;
+        var x_158 : i32;
+        var x_158_phi : i32;
+        let x_157 : i32 = x_157_phi;
+        x_185_phi = false;
+        if ((x_157 <= 4)) {
+        } else {
+          break;
+        }
+        let x_164 : i32 = tree[x_157].data;
+        if ((7 <= x_164)) {
+          let x_177 : ptr<function, i32> = &(tree[x_157].leftIndex);
+          let x_178 : i32 = *(x_177);
+          if ((x_178 == -1)) {
+            *(x_177) = 4;
+            tree[4] = BST(7, -1, -1);
+            x_185_phi = true;
+            break;
+          } else {
+            x_183 = *(x_177);
+            x_158_phi = x_183;
+            continue;
+          }
+          return;
+        } else {
+          let x_169 : ptr<function, i32> = &(tree[x_157].rightIndex);
+          let x_170 : i32 = *(x_169);
+          if ((x_170 == -1)) {
+            *(x_169) = 4;
+            tree[4] = BST(7, -1, -1);
+            x_185_phi = true;
+            break;
+          } else {
+            x_175 = *(x_169);
+            x_158_phi = x_175;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_158 = x_158_phi;
+          x_157_phi = x_158;
+        }
+      }
+      let x_185 : bool = x_185_phi;
+      if (x_185) {
+        break;
+      }
+    }
+  }
+  var x_190_phi : i32;
+  var x_218_phi : bool;
+  switch(0u) {
+    default: {
+      x_190_phi = 0;
+      loop {
+        var x_216 : i32;
+        var x_208 : i32;
+        var x_191 : i32;
+        var x_191_phi : i32;
+        let x_190 : i32 = x_190_phi;
+        x_218_phi = false;
+        if ((x_190 <= 5)) {
+        } else {
+          break;
+        }
+        let x_197 : i32 = tree[x_190].data;
+        if ((8 <= x_197)) {
+          let x_210 : ptr<function, i32> = &(tree[x_190].leftIndex);
+          let x_211 : i32 = *(x_210);
+          if ((x_211 == -1)) {
+            *(x_210) = 5;
+            tree[5] = BST(8, -1, -1);
+            x_218_phi = true;
+            break;
+          } else {
+            x_216 = *(x_210);
+            x_191_phi = x_216;
+            continue;
+          }
+          return;
+        } else {
+          let x_202 : ptr<function, i32> = &(tree[x_190].rightIndex);
+          let x_203 : i32 = *(x_202);
+          if ((x_203 == -1)) {
+            *(x_202) = 5;
+            tree[5] = BST(8, -1, -1);
+            x_218_phi = true;
+            break;
+          } else {
+            x_208 = *(x_202);
+            x_191_phi = x_208;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_191 = x_191_phi;
+          x_190_phi = x_191;
+        }
+      }
+      let x_218 : bool = x_218_phi;
+      if (x_218) {
+        break;
+      }
+    }
+  }
+  var x_223_phi : i32;
+  var x_251_phi : bool;
+  switch(0u) {
+    default: {
+      x_223_phi = 0;
+      loop {
+        var x_249 : i32;
+        var x_241 : i32;
+        var x_224 : i32;
+        var x_224_phi : i32;
+        let x_223 : i32 = x_223_phi;
+        x_251_phi = false;
+        if ((x_223 <= 6)) {
+        } else {
+          break;
+        }
+        let x_230 : i32 = tree[x_223].data;
+        if ((2 <= x_230)) {
+          let x_243 : ptr<function, i32> = &(tree[x_223].leftIndex);
+          let x_244 : i32 = *(x_243);
+          if ((x_244 == -1)) {
+            *(x_243) = 6;
+            tree[6] = BST(2, -1, -1);
+            x_251_phi = true;
+            break;
+          } else {
+            x_249 = *(x_243);
+            x_224_phi = x_249;
+            continue;
+          }
+          return;
+        } else {
+          let x_235 : ptr<function, i32> = &(tree[x_223].rightIndex);
+          let x_236 : i32 = *(x_235);
+          if ((x_236 == -1)) {
+            *(x_235) = 6;
+            tree[6] = BST(2, -1, -1);
+            x_251_phi = true;
+            break;
+          } else {
+            x_241 = *(x_235);
+            x_224_phi = x_241;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_224 = x_224_phi;
+          x_223_phi = x_224;
+        }
+      }
+      let x_251 : bool = x_251_phi;
+      if (x_251) {
+        break;
+      }
+    }
+  }
+  var x_256_phi : i32;
+  var x_284_phi : bool;
+  switch(0u) {
+    default: {
+      x_256_phi = 0;
+      loop {
+        var x_282 : i32;
+        var x_274 : i32;
+        var x_257 : i32;
+        var x_257_phi : i32;
+        let x_256 : i32 = x_256_phi;
+        x_284_phi = false;
+        if ((x_256 <= 7)) {
+        } else {
+          break;
+        }
+        let x_263 : i32 = tree[x_256].data;
+        if ((6 <= x_263)) {
+          let x_276 : ptr<function, i32> = &(tree[x_256].leftIndex);
+          let x_277 : i32 = *(x_276);
+          if ((x_277 == -1)) {
+            *(x_276) = 7;
+            tree[7] = BST(6, -1, -1);
+            x_284_phi = true;
+            break;
+          } else {
+            x_282 = *(x_276);
+            x_257_phi = x_282;
+            continue;
+          }
+          return;
+        } else {
+          let x_268 : ptr<function, i32> = &(tree[x_256].rightIndex);
+          let x_269 : i32 = *(x_268);
+          if ((x_269 == -1)) {
+            *(x_268) = 7;
+            tree[7] = BST(6, -1, -1);
+            x_284_phi = true;
+            break;
+          } else {
+            x_274 = *(x_268);
+            x_257_phi = x_274;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_257 = x_257_phi;
+          x_256_phi = x_257;
+        }
+      }
+      let x_284 : bool = x_284_phi;
+      if (x_284) {
+        break;
+      }
+    }
+  }
+  var x_289_phi : i32;
+  var x_317_phi : bool;
+  switch(0u) {
+    default: {
+      x_289_phi = 0;
+      loop {
+        var x_315 : i32;
+        var x_307 : i32;
+        var x_290 : i32;
+        var x_290_phi : i32;
+        let x_289 : i32 = x_289_phi;
+        x_317_phi = false;
+        if ((x_289 <= 8)) {
+        } else {
+          break;
+        }
+        let x_296 : i32 = tree[x_289].data;
+        if ((17 <= x_296)) {
+          let x_309 : ptr<function, i32> = &(tree[x_289].leftIndex);
+          let x_310 : i32 = *(x_309);
+          if ((x_310 == -1)) {
+            *(x_309) = 8;
+            tree[8] = BST(17, -1, -1);
+            x_317_phi = true;
+            break;
+          } else {
+            x_315 = *(x_309);
+            x_290_phi = x_315;
+            continue;
+          }
+          return;
+        } else {
+          let x_301 : ptr<function, i32> = &(tree[x_289].rightIndex);
+          let x_302 : i32 = *(x_301);
+          if ((x_302 == -1)) {
+            *(x_301) = 8;
+            tree[8] = BST(17, -1, -1);
+            x_317_phi = true;
+            break;
+          } else {
+            x_307 = *(x_301);
+            x_290_phi = x_307;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_290 = x_290_phi;
+          x_289_phi = x_290;
+        }
+      }
+      let x_317 : bool = x_317_phi;
+      if (x_317) {
+        break;
+      }
+    }
+  }
+  var x_322_phi : i32;
+  var x_350_phi : bool;
+  switch(0u) {
+    default: {
+      x_322_phi = 0;
+      loop {
+        var x_348 : i32;
+        var x_340 : i32;
+        var x_323 : i32;
+        var x_323_phi : i32;
+        let x_322 : i32 = x_322_phi;
+        x_350_phi = false;
+        if ((x_322 <= 9)) {
+        } else {
+          break;
+        }
+        let x_329 : i32 = tree[x_322].data;
+        if ((13 <= x_329)) {
+          let x_342 : ptr<function, i32> = &(tree[x_322].leftIndex);
+          let x_343 : i32 = *(x_342);
+          if ((x_343 == -1)) {
+            *(x_342) = 9;
+            tree[9] = BST(13, -1, -1);
+            x_350_phi = true;
+            break;
+          } else {
+            x_348 = *(x_342);
+            x_323_phi = x_348;
+            continue;
+          }
+          return;
+        } else {
+          let x_334 : ptr<function, i32> = &(tree[x_322].rightIndex);
+          let x_335 : i32 = *(x_334);
+          if ((x_335 == -1)) {
+            *(x_334) = 9;
+            tree[9] = BST(13, -1, -1);
+            x_350_phi = true;
+            break;
+          } else {
+            x_340 = *(x_334);
+            x_323_phi = x_340;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_323 = x_323_phi;
+          x_322_phi = x_323;
+        }
+      }
+      let x_350 : bool = x_350_phi;
+      if (x_350) {
+        break;
+      }
+    }
+  }
+  x_353_phi = 0;
+  x_356_phi = 0;
+  x_358_phi = 0;
+  loop {
+    var x_381 : i32;
+    var x_391 : i32;
+    var x_396 : i32;
+    var x_359 : i32;
+    var x_354_phi : i32;
+    var x_357_phi : i32;
+    let x_353 : i32 = x_353_phi;
+    x_356 = x_356_phi;
+    let x_358 : i32 = x_358_phi;
+    if ((x_358 < 20)) {
+    } else {
+      break;
+    }
+    var x_366_phi : i32;
+    var x_381_phi : i32;
+    var x_382_phi : bool;
+    switch(0u) {
+      default: {
+        x_366_phi = 0;
+        loop {
+          let x_366 : i32 = x_366_phi;
+          x_381_phi = x_353;
+          x_382_phi = false;
+          if ((x_366 != -1)) {
+          } else {
+            break;
+          }
+          let x_373 : BST = tree[x_366];
+          let x_374 : i32 = x_373.data;
+          let x_375 : i32 = x_373.leftIndex;
+          let x_376 : i32 = x_373.rightIndex;
+          if ((x_374 == x_358)) {
+            x_381_phi = x_358;
+            x_382_phi = true;
+            break;
+          }
+
+          continuing {
+            x_366_phi = select(x_375, x_376, (x_358 > x_374));
+          }
+        }
+        x_381 = x_381_phi;
+        let x_382 : bool = x_382_phi;
+        x_354_phi = x_381;
+        if (x_382) {
+          break;
+        }
+        x_354_phi = -1;
+      }
+    }
+    var x_354 : i32;
+    var x_390 : i32;
+    var x_395 : i32;
+    var x_391_phi : i32;
+    var x_396_phi : i32;
+    x_354 = x_354_phi;
+    switch(x_358) {
+      case 2, 5, 6, 7, 8, 9, 12, 13, 15, 17: {
+        x_391_phi = x_356;
+        if ((x_354 == bitcast<i32>(x_358))) {
+          x_390 = bitcast<i32>((x_356 + bitcast<i32>(1)));
+          x_391_phi = x_390;
+        }
+        x_391 = x_391_phi;
+        x_357_phi = x_391;
+      }
+      default: {
+        x_396_phi = x_356;
+        if ((x_354 == bitcast<i32>(-1))) {
+          x_395 = bitcast<i32>((x_356 + bitcast<i32>(1)));
+          x_396_phi = x_395;
+        }
+        x_396 = x_396_phi;
+        x_357_phi = x_396;
+      }
+    }
+    let x_357 : i32 = x_357_phi;
+
+    continuing {
+      x_359 = (x_358 + 1);
+      x_353_phi = x_354;
+      x_356_phi = x_357;
+      x_358_phi = x_359;
+    }
+  }
+  if ((x_356 == bitcast<i32>(20))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..1f593e3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/0.wgsl.expected.hlsl
@@ -0,0 +1,748 @@
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  BST tree[10] = (BST[10])0;
+  int x_356 = 0;
+  int x_58_phi = 0;
+  bool x_86_phi = false;
+  int x_353_phi = 0;
+  int x_356_phi = 0;
+  int x_358_phi = 0;
+  const BST tint_symbol_2 = {9, -1, -1};
+  tree[0] = tint_symbol_2;
+  switch(0u) {
+    default: {
+      x_58_phi = 0;
+      while (true) {
+        int x_84 = 0;
+        int x_76 = 0;
+        int x_59 = 0;
+        int x_59_phi = 0;
+        const int x_58 = x_58_phi;
+        x_86_phi = false;
+        if ((x_58 <= 1)) {
+        } else {
+          break;
+        }
+        const int x_65 = tree[x_58].data;
+        if ((5 <= x_65)) {
+          const int x_78_save = x_58;
+          const int x_79 = tree[x_78_save].leftIndex;
+          if ((x_79 == -1)) {
+            tree[x_78_save].leftIndex = 1;
+            const BST tint_symbol_3 = {5, -1, -1};
+            tree[1] = tint_symbol_3;
+            x_86_phi = true;
+            break;
+          } else {
+            x_84 = tree[x_78_save].leftIndex;
+            x_59_phi = x_84;
+            {
+              x_59 = x_59_phi;
+              x_58_phi = x_59;
+            }
+            continue;
+          }
+          return;
+        } else {
+          const int x_70_save = x_58;
+          const int x_71 = tree[x_70_save].rightIndex;
+          if ((x_71 == -1)) {
+            tree[x_70_save].rightIndex = 1;
+            const BST tint_symbol_4 = {5, -1, -1};
+            tree[1] = tint_symbol_4;
+            x_86_phi = true;
+            break;
+          } else {
+            x_76 = tree[x_70_save].rightIndex;
+            x_59_phi = x_76;
+            {
+              x_59 = x_59_phi;
+              x_58_phi = x_59;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_59 = x_59_phi;
+          x_58_phi = x_59;
+        }
+      }
+      if (x_86_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_91_phi = 0;
+  bool x_119_phi = false;
+  switch(0u) {
+    default: {
+      x_91_phi = 0;
+      while (true) {
+        int x_117 = 0;
+        int x_109 = 0;
+        int x_92 = 0;
+        int x_92_phi = 0;
+        const int x_91 = x_91_phi;
+        x_119_phi = false;
+        if ((x_91 <= 2)) {
+        } else {
+          break;
+        }
+        const int x_98 = tree[x_91].data;
+        if ((12 <= x_98)) {
+          const int x_111_save = x_91;
+          const int x_112 = tree[x_111_save].leftIndex;
+          if ((x_112 == -1)) {
+            tree[x_111_save].leftIndex = 2;
+            const BST tint_symbol_5 = {12, -1, -1};
+            tree[2] = tint_symbol_5;
+            x_119_phi = true;
+            break;
+          } else {
+            x_117 = tree[x_111_save].leftIndex;
+            x_92_phi = x_117;
+            {
+              x_92 = x_92_phi;
+              x_91_phi = x_92;
+            }
+            continue;
+          }
+          return;
+        } else {
+          const int x_103_save = x_91;
+          const int x_104 = tree[x_103_save].rightIndex;
+          if ((x_104 == -1)) {
+            tree[x_103_save].rightIndex = 2;
+            const BST tint_symbol_6 = {12, -1, -1};
+            tree[2] = tint_symbol_6;
+            x_119_phi = true;
+            break;
+          } else {
+            x_109 = tree[x_103_save].rightIndex;
+            x_92_phi = x_109;
+            {
+              x_92 = x_92_phi;
+              x_91_phi = x_92;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_92 = x_92_phi;
+          x_91_phi = x_92;
+        }
+      }
+      if (x_119_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_124_phi = 0;
+  bool x_152_phi = false;
+  switch(0u) {
+    default: {
+      x_124_phi = 0;
+      while (true) {
+        int x_150 = 0;
+        int x_142 = 0;
+        int x_125 = 0;
+        int x_125_phi = 0;
+        const int x_124 = x_124_phi;
+        x_152_phi = false;
+        if ((x_124 <= 3)) {
+        } else {
+          break;
+        }
+        const int x_131 = tree[x_124].data;
+        if ((15 <= x_131)) {
+          const int x_144_save = x_124;
+          const int x_145 = tree[x_144_save].leftIndex;
+          if ((x_145 == -1)) {
+            tree[x_144_save].leftIndex = 3;
+            const BST tint_symbol_7 = {15, -1, -1};
+            tree[3] = tint_symbol_7;
+            x_152_phi = true;
+            break;
+          } else {
+            x_150 = tree[x_144_save].leftIndex;
+            x_125_phi = x_150;
+            {
+              x_125 = x_125_phi;
+              x_124_phi = x_125;
+            }
+            continue;
+          }
+          return;
+        } else {
+          const int x_136_save = x_124;
+          const int x_137 = tree[x_136_save].rightIndex;
+          if ((x_137 == -1)) {
+            tree[x_136_save].rightIndex = 3;
+            const BST tint_symbol_8 = {15, -1, -1};
+            tree[3] = tint_symbol_8;
+            x_152_phi = true;
+            break;
+          } else {
+            x_142 = tree[x_136_save].rightIndex;
+            x_125_phi = x_142;
+            {
+              x_125 = x_125_phi;
+              x_124_phi = x_125;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_125 = x_125_phi;
+          x_124_phi = x_125;
+        }
+      }
+      if (x_152_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_157_phi = 0;
+  bool x_185_phi = false;
+  switch(0u) {
+    default: {
+      x_157_phi = 0;
+      while (true) {
+        int x_183 = 0;
+        int x_175 = 0;
+        int x_158 = 0;
+        int x_158_phi = 0;
+        const int x_157 = x_157_phi;
+        x_185_phi = false;
+        if ((x_157 <= 4)) {
+        } else {
+          break;
+        }
+        const int x_164 = tree[x_157].data;
+        if ((7 <= x_164)) {
+          const int x_177_save = x_157;
+          const int x_178 = tree[x_177_save].leftIndex;
+          if ((x_178 == -1)) {
+            tree[x_177_save].leftIndex = 4;
+            const BST tint_symbol_9 = {7, -1, -1};
+            tree[4] = tint_symbol_9;
+            x_185_phi = true;
+            break;
+          } else {
+            x_183 = tree[x_177_save].leftIndex;
+            x_158_phi = x_183;
+            {
+              x_158 = x_158_phi;
+              x_157_phi = x_158;
+            }
+            continue;
+          }
+          return;
+        } else {
+          const int x_169_save = x_157;
+          const int x_170 = tree[x_169_save].rightIndex;
+          if ((x_170 == -1)) {
+            tree[x_169_save].rightIndex = 4;
+            const BST tint_symbol_10 = {7, -1, -1};
+            tree[4] = tint_symbol_10;
+            x_185_phi = true;
+            break;
+          } else {
+            x_175 = tree[x_169_save].rightIndex;
+            x_158_phi = x_175;
+            {
+              x_158 = x_158_phi;
+              x_157_phi = x_158;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_158 = x_158_phi;
+          x_157_phi = x_158;
+        }
+      }
+      if (x_185_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_190_phi = 0;
+  bool x_218_phi = false;
+  switch(0u) {
+    default: {
+      x_190_phi = 0;
+      while (true) {
+        int x_216 = 0;
+        int x_208 = 0;
+        int x_191 = 0;
+        int x_191_phi = 0;
+        const int x_190 = x_190_phi;
+        x_218_phi = false;
+        if ((x_190 <= 5)) {
+        } else {
+          break;
+        }
+        const int x_197 = tree[x_190].data;
+        if ((8 <= x_197)) {
+          const int x_210_save = x_190;
+          const int x_211 = tree[x_210_save].leftIndex;
+          if ((x_211 == -1)) {
+            tree[x_210_save].leftIndex = 5;
+            const BST tint_symbol_11 = {8, -1, -1};
+            tree[5] = tint_symbol_11;
+            x_218_phi = true;
+            break;
+          } else {
+            x_216 = tree[x_210_save].leftIndex;
+            x_191_phi = x_216;
+            {
+              x_191 = x_191_phi;
+              x_190_phi = x_191;
+            }
+            continue;
+          }
+          return;
+        } else {
+          const int x_202_save = x_190;
+          const int x_203 = tree[x_202_save].rightIndex;
+          if ((x_203 == -1)) {
+            tree[x_202_save].rightIndex = 5;
+            const BST tint_symbol_12 = {8, -1, -1};
+            tree[5] = tint_symbol_12;
+            x_218_phi = true;
+            break;
+          } else {
+            x_208 = tree[x_202_save].rightIndex;
+            x_191_phi = x_208;
+            {
+              x_191 = x_191_phi;
+              x_190_phi = x_191;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_191 = x_191_phi;
+          x_190_phi = x_191;
+        }
+      }
+      if (x_218_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_223_phi = 0;
+  bool x_251_phi = false;
+  switch(0u) {
+    default: {
+      x_223_phi = 0;
+      while (true) {
+        int x_249 = 0;
+        int x_241 = 0;
+        int x_224 = 0;
+        int x_224_phi = 0;
+        const int x_223 = x_223_phi;
+        x_251_phi = false;
+        if ((x_223 <= 6)) {
+        } else {
+          break;
+        }
+        const int x_230 = tree[x_223].data;
+        if ((2 <= x_230)) {
+          const int x_243_save = x_223;
+          const int x_244 = tree[x_243_save].leftIndex;
+          if ((x_244 == -1)) {
+            tree[x_243_save].leftIndex = 6;
+            const BST tint_symbol_13 = {2, -1, -1};
+            tree[6] = tint_symbol_13;
+            x_251_phi = true;
+            break;
+          } else {
+            x_249 = tree[x_243_save].leftIndex;
+            x_224_phi = x_249;
+            {
+              x_224 = x_224_phi;
+              x_223_phi = x_224;
+            }
+            continue;
+          }
+          return;
+        } else {
+          const int x_235_save = x_223;
+          const int x_236 = tree[x_235_save].rightIndex;
+          if ((x_236 == -1)) {
+            tree[x_235_save].rightIndex = 6;
+            const BST tint_symbol_14 = {2, -1, -1};
+            tree[6] = tint_symbol_14;
+            x_251_phi = true;
+            break;
+          } else {
+            x_241 = tree[x_235_save].rightIndex;
+            x_224_phi = x_241;
+            {
+              x_224 = x_224_phi;
+              x_223_phi = x_224;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_224 = x_224_phi;
+          x_223_phi = x_224;
+        }
+      }
+      if (x_251_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_256_phi = 0;
+  bool x_284_phi = false;
+  switch(0u) {
+    default: {
+      x_256_phi = 0;
+      while (true) {
+        int x_282 = 0;
+        int x_274 = 0;
+        int x_257 = 0;
+        int x_257_phi = 0;
+        const int x_256 = x_256_phi;
+        x_284_phi = false;
+        if ((x_256 <= 7)) {
+        } else {
+          break;
+        }
+        const int x_263 = tree[x_256].data;
+        if ((6 <= x_263)) {
+          const int x_276_save = x_256;
+          const int x_277 = tree[x_276_save].leftIndex;
+          if ((x_277 == -1)) {
+            tree[x_276_save].leftIndex = 7;
+            const BST tint_symbol_15 = {6, -1, -1};
+            tree[7] = tint_symbol_15;
+            x_284_phi = true;
+            break;
+          } else {
+            x_282 = tree[x_276_save].leftIndex;
+            x_257_phi = x_282;
+            {
+              x_257 = x_257_phi;
+              x_256_phi = x_257;
+            }
+            continue;
+          }
+          return;
+        } else {
+          const int x_268_save = x_256;
+          const int x_269 = tree[x_268_save].rightIndex;
+          if ((x_269 == -1)) {
+            tree[x_268_save].rightIndex = 7;
+            const BST tint_symbol_16 = {6, -1, -1};
+            tree[7] = tint_symbol_16;
+            x_284_phi = true;
+            break;
+          } else {
+            x_274 = tree[x_268_save].rightIndex;
+            x_257_phi = x_274;
+            {
+              x_257 = x_257_phi;
+              x_256_phi = x_257;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_257 = x_257_phi;
+          x_256_phi = x_257;
+        }
+      }
+      if (x_284_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_289_phi = 0;
+  bool x_317_phi = false;
+  switch(0u) {
+    default: {
+      x_289_phi = 0;
+      while (true) {
+        int x_315 = 0;
+        int x_307 = 0;
+        int x_290 = 0;
+        int x_290_phi = 0;
+        const int x_289 = x_289_phi;
+        x_317_phi = false;
+        if ((x_289 <= 8)) {
+        } else {
+          break;
+        }
+        const int x_296 = tree[x_289].data;
+        if ((17 <= x_296)) {
+          const int x_309_save = x_289;
+          const int x_310 = tree[x_309_save].leftIndex;
+          if ((x_310 == -1)) {
+            tree[x_309_save].leftIndex = 8;
+            const BST tint_symbol_17 = {17, -1, -1};
+            tree[8] = tint_symbol_17;
+            x_317_phi = true;
+            break;
+          } else {
+            x_315 = tree[x_309_save].leftIndex;
+            x_290_phi = x_315;
+            {
+              x_290 = x_290_phi;
+              x_289_phi = x_290;
+            }
+            continue;
+          }
+          return;
+        } else {
+          const int x_301_save = x_289;
+          const int x_302 = tree[x_301_save].rightIndex;
+          if ((x_302 == -1)) {
+            tree[x_301_save].rightIndex = 8;
+            const BST tint_symbol_18 = {17, -1, -1};
+            tree[8] = tint_symbol_18;
+            x_317_phi = true;
+            break;
+          } else {
+            x_307 = tree[x_301_save].rightIndex;
+            x_290_phi = x_307;
+            {
+              x_290 = x_290_phi;
+              x_289_phi = x_290;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_290 = x_290_phi;
+          x_289_phi = x_290;
+        }
+      }
+      if (x_317_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_322_phi = 0;
+  bool x_350_phi = false;
+  switch(0u) {
+    default: {
+      x_322_phi = 0;
+      while (true) {
+        int x_348 = 0;
+        int x_340 = 0;
+        int x_323 = 0;
+        int x_323_phi = 0;
+        const int x_322 = x_322_phi;
+        x_350_phi = false;
+        if ((x_322 <= 9)) {
+        } else {
+          break;
+        }
+        const int x_329 = tree[x_322].data;
+        if ((13 <= x_329)) {
+          const int x_342_save = x_322;
+          const int x_343 = tree[x_342_save].leftIndex;
+          if ((x_343 == -1)) {
+            tree[x_342_save].leftIndex = 9;
+            const BST tint_symbol_19 = {13, -1, -1};
+            tree[9] = tint_symbol_19;
+            x_350_phi = true;
+            break;
+          } else {
+            x_348 = tree[x_342_save].leftIndex;
+            x_323_phi = x_348;
+            {
+              x_323 = x_323_phi;
+              x_322_phi = x_323;
+            }
+            continue;
+          }
+          return;
+        } else {
+          const int x_334_save = x_322;
+          const int x_335 = tree[x_334_save].rightIndex;
+          if ((x_335 == -1)) {
+            tree[x_334_save].rightIndex = 9;
+            const BST tint_symbol_20 = {13, -1, -1};
+            tree[9] = tint_symbol_20;
+            x_350_phi = true;
+            break;
+          } else {
+            x_340 = tree[x_334_save].rightIndex;
+            x_323_phi = x_340;
+            {
+              x_323 = x_323_phi;
+              x_322_phi = x_323;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_323 = x_323_phi;
+          x_322_phi = x_323;
+        }
+      }
+      if (x_350_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  x_353_phi = 0;
+  x_356_phi = 0;
+  x_358_phi = 0;
+  while (true) {
+    int x_381 = 0;
+    int x_391 = 0;
+    int x_396 = 0;
+    int x_359 = 0;
+    int x_354_phi = 0;
+    int x_357_phi = 0;
+    const int x_353 = x_353_phi;
+    x_356 = x_356_phi;
+    const int x_358 = x_358_phi;
+    if ((x_358 < 20)) {
+    } else {
+      break;
+    }
+    int x_366_phi = 0;
+    int x_381_phi = 0;
+    bool x_382_phi = false;
+    switch(0u) {
+      default: {
+        x_366_phi = 0;
+        while (true) {
+          const int x_366 = x_366_phi;
+          x_381_phi = x_353;
+          x_382_phi = false;
+          if ((x_366 != -1)) {
+          } else {
+            break;
+          }
+          const BST x_373 = tree[x_366];
+          const int x_374 = x_373.data;
+          const int x_375 = x_373.leftIndex;
+          const int x_376 = x_373.rightIndex;
+          if ((x_374 == x_358)) {
+            x_381_phi = x_358;
+            x_382_phi = true;
+            break;
+          }
+          {
+            x_366_phi = ((x_358 > x_374) ? x_376 : x_375);
+          }
+        }
+        x_381 = x_381_phi;
+        const bool x_382 = x_382_phi;
+        x_354_phi = x_381;
+        if (x_382) {
+          break;
+        }
+        x_354_phi = -1;
+        break;
+      }
+    }
+    int x_354 = 0;
+    int x_390 = 0;
+    int x_395 = 0;
+    int x_391_phi = 0;
+    int x_396_phi = 0;
+    x_354 = x_354_phi;
+    switch(x_358) {
+      case 2:
+      case 5:
+      case 6:
+      case 7:
+      case 8:
+      case 9:
+      case 12:
+      case 13:
+      case 15:
+      case 17: {
+        x_391_phi = x_356;
+        if ((x_354 == asint(x_358))) {
+          x_390 = asint((x_356 + asint(1)));
+          x_391_phi = x_390;
+        }
+        x_391 = x_391_phi;
+        x_357_phi = x_391;
+        break;
+      }
+      default: {
+        x_396_phi = x_356;
+        if ((x_354 == asint(-1))) {
+          x_395 = asint((x_356 + asint(1)));
+          x_396_phi = x_395;
+        }
+        x_396 = x_396_phi;
+        x_357_phi = x_396;
+        break;
+      }
+    }
+    const int x_357 = x_357_phi;
+    {
+      x_359 = (x_358 + 1);
+      x_353_phi = x_354;
+      x_356_phi = x_357;
+      x_358_phi = x_359;
+    }
+  }
+  if ((x_356 == asint(20))) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_21 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_21;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/0.wgsl.expected.msl
new file mode 100644
index 0000000..752c6ed
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/0.wgsl.expected.msl
@@ -0,0 +1,762 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+struct tint_array_wrapper {
+  BST arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_23) {
+  tint_array_wrapper tree = {};
+  int x_356 = 0;
+  int x_58_phi = 0;
+  bool x_86_phi = false;
+  int x_353_phi = 0;
+  int x_356_phi = 0;
+  int x_358_phi = 0;
+  BST const tint_symbol_3 = {.data=9, .leftIndex=-1, .rightIndex=-1};
+  tree.arr[0] = tint_symbol_3;
+  switch(0u) {
+    default: {
+      x_58_phi = 0;
+      while (true) {
+        int x_84 = 0;
+        int x_76 = 0;
+        int x_59 = 0;
+        int x_59_phi = 0;
+        int const x_58 = x_58_phi;
+        x_86_phi = false;
+        if ((x_58 <= 1)) {
+        } else {
+          break;
+        }
+        int const x_65 = tree.arr[x_58].data;
+        if ((5 <= x_65)) {
+          int const x_78_save = x_58;
+          int const x_79 = tree.arr[x_78_save].leftIndex;
+          if ((x_79 == -1)) {
+            tree.arr[x_78_save].leftIndex = 1;
+            BST const tint_symbol_4 = {.data=5, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[1] = tint_symbol_4;
+            x_86_phi = true;
+            break;
+          } else {
+            x_84 = tree.arr[x_78_save].leftIndex;
+            x_59_phi = x_84;
+            {
+              x_59 = x_59_phi;
+              x_58_phi = x_59;
+            }
+            continue;
+          }
+          return;
+        } else {
+          int const x_70_save = x_58;
+          int const x_71 = tree.arr[x_70_save].rightIndex;
+          if ((x_71 == -1)) {
+            tree.arr[x_70_save].rightIndex = 1;
+            BST const tint_symbol_5 = {.data=5, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[1] = tint_symbol_5;
+            x_86_phi = true;
+            break;
+          } else {
+            x_76 = tree.arr[x_70_save].rightIndex;
+            x_59_phi = x_76;
+            {
+              x_59 = x_59_phi;
+              x_58_phi = x_59;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_59 = x_59_phi;
+          x_58_phi = x_59;
+        }
+      }
+      bool const x_86 = x_86_phi;
+      if (x_86) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_91_phi = 0;
+  bool x_119_phi = false;
+  switch(0u) {
+    default: {
+      x_91_phi = 0;
+      while (true) {
+        int x_117 = 0;
+        int x_109 = 0;
+        int x_92 = 0;
+        int x_92_phi = 0;
+        int const x_91 = x_91_phi;
+        x_119_phi = false;
+        if ((x_91 <= 2)) {
+        } else {
+          break;
+        }
+        int const x_98 = tree.arr[x_91].data;
+        if ((12 <= x_98)) {
+          int const x_111_save = x_91;
+          int const x_112 = tree.arr[x_111_save].leftIndex;
+          if ((x_112 == -1)) {
+            tree.arr[x_111_save].leftIndex = 2;
+            BST const tint_symbol_6 = {.data=12, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[2] = tint_symbol_6;
+            x_119_phi = true;
+            break;
+          } else {
+            x_117 = tree.arr[x_111_save].leftIndex;
+            x_92_phi = x_117;
+            {
+              x_92 = x_92_phi;
+              x_91_phi = x_92;
+            }
+            continue;
+          }
+          return;
+        } else {
+          int const x_103_save = x_91;
+          int const x_104 = tree.arr[x_103_save].rightIndex;
+          if ((x_104 == -1)) {
+            tree.arr[x_103_save].rightIndex = 2;
+            BST const tint_symbol_7 = {.data=12, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[2] = tint_symbol_7;
+            x_119_phi = true;
+            break;
+          } else {
+            x_109 = tree.arr[x_103_save].rightIndex;
+            x_92_phi = x_109;
+            {
+              x_92 = x_92_phi;
+              x_91_phi = x_92;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_92 = x_92_phi;
+          x_91_phi = x_92;
+        }
+      }
+      bool const x_119 = x_119_phi;
+      if (x_119) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_124_phi = 0;
+  bool x_152_phi = false;
+  switch(0u) {
+    default: {
+      x_124_phi = 0;
+      while (true) {
+        int x_150 = 0;
+        int x_142 = 0;
+        int x_125 = 0;
+        int x_125_phi = 0;
+        int const x_124 = x_124_phi;
+        x_152_phi = false;
+        if ((x_124 <= 3)) {
+        } else {
+          break;
+        }
+        int const x_131 = tree.arr[x_124].data;
+        if ((15 <= x_131)) {
+          int const x_144_save = x_124;
+          int const x_145 = tree.arr[x_144_save].leftIndex;
+          if ((x_145 == -1)) {
+            tree.arr[x_144_save].leftIndex = 3;
+            BST const tint_symbol_8 = {.data=15, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[3] = tint_symbol_8;
+            x_152_phi = true;
+            break;
+          } else {
+            x_150 = tree.arr[x_144_save].leftIndex;
+            x_125_phi = x_150;
+            {
+              x_125 = x_125_phi;
+              x_124_phi = x_125;
+            }
+            continue;
+          }
+          return;
+        } else {
+          int const x_136_save = x_124;
+          int const x_137 = tree.arr[x_136_save].rightIndex;
+          if ((x_137 == -1)) {
+            tree.arr[x_136_save].rightIndex = 3;
+            BST const tint_symbol_9 = {.data=15, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[3] = tint_symbol_9;
+            x_152_phi = true;
+            break;
+          } else {
+            x_142 = tree.arr[x_136_save].rightIndex;
+            x_125_phi = x_142;
+            {
+              x_125 = x_125_phi;
+              x_124_phi = x_125;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_125 = x_125_phi;
+          x_124_phi = x_125;
+        }
+      }
+      bool const x_152 = x_152_phi;
+      if (x_152) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_157_phi = 0;
+  bool x_185_phi = false;
+  switch(0u) {
+    default: {
+      x_157_phi = 0;
+      while (true) {
+        int x_183 = 0;
+        int x_175 = 0;
+        int x_158 = 0;
+        int x_158_phi = 0;
+        int const x_157 = x_157_phi;
+        x_185_phi = false;
+        if ((x_157 <= 4)) {
+        } else {
+          break;
+        }
+        int const x_164 = tree.arr[x_157].data;
+        if ((7 <= x_164)) {
+          int const x_177_save = x_157;
+          int const x_178 = tree.arr[x_177_save].leftIndex;
+          if ((x_178 == -1)) {
+            tree.arr[x_177_save].leftIndex = 4;
+            BST const tint_symbol_10 = {.data=7, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[4] = tint_symbol_10;
+            x_185_phi = true;
+            break;
+          } else {
+            x_183 = tree.arr[x_177_save].leftIndex;
+            x_158_phi = x_183;
+            {
+              x_158 = x_158_phi;
+              x_157_phi = x_158;
+            }
+            continue;
+          }
+          return;
+        } else {
+          int const x_169_save = x_157;
+          int const x_170 = tree.arr[x_169_save].rightIndex;
+          if ((x_170 == -1)) {
+            tree.arr[x_169_save].rightIndex = 4;
+            BST const tint_symbol_11 = {.data=7, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[4] = tint_symbol_11;
+            x_185_phi = true;
+            break;
+          } else {
+            x_175 = tree.arr[x_169_save].rightIndex;
+            x_158_phi = x_175;
+            {
+              x_158 = x_158_phi;
+              x_157_phi = x_158;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_158 = x_158_phi;
+          x_157_phi = x_158;
+        }
+      }
+      bool const x_185 = x_185_phi;
+      if (x_185) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_190_phi = 0;
+  bool x_218_phi = false;
+  switch(0u) {
+    default: {
+      x_190_phi = 0;
+      while (true) {
+        int x_216 = 0;
+        int x_208 = 0;
+        int x_191 = 0;
+        int x_191_phi = 0;
+        int const x_190 = x_190_phi;
+        x_218_phi = false;
+        if ((x_190 <= 5)) {
+        } else {
+          break;
+        }
+        int const x_197 = tree.arr[x_190].data;
+        if ((8 <= x_197)) {
+          int const x_210_save = x_190;
+          int const x_211 = tree.arr[x_210_save].leftIndex;
+          if ((x_211 == -1)) {
+            tree.arr[x_210_save].leftIndex = 5;
+            BST const tint_symbol_12 = {.data=8, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[5] = tint_symbol_12;
+            x_218_phi = true;
+            break;
+          } else {
+            x_216 = tree.arr[x_210_save].leftIndex;
+            x_191_phi = x_216;
+            {
+              x_191 = x_191_phi;
+              x_190_phi = x_191;
+            }
+            continue;
+          }
+          return;
+        } else {
+          int const x_202_save = x_190;
+          int const x_203 = tree.arr[x_202_save].rightIndex;
+          if ((x_203 == -1)) {
+            tree.arr[x_202_save].rightIndex = 5;
+            BST const tint_symbol_13 = {.data=8, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[5] = tint_symbol_13;
+            x_218_phi = true;
+            break;
+          } else {
+            x_208 = tree.arr[x_202_save].rightIndex;
+            x_191_phi = x_208;
+            {
+              x_191 = x_191_phi;
+              x_190_phi = x_191;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_191 = x_191_phi;
+          x_190_phi = x_191;
+        }
+      }
+      bool const x_218 = x_218_phi;
+      if (x_218) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_223_phi = 0;
+  bool x_251_phi = false;
+  switch(0u) {
+    default: {
+      x_223_phi = 0;
+      while (true) {
+        int x_249 = 0;
+        int x_241 = 0;
+        int x_224 = 0;
+        int x_224_phi = 0;
+        int const x_223 = x_223_phi;
+        x_251_phi = false;
+        if ((x_223 <= 6)) {
+        } else {
+          break;
+        }
+        int const x_230 = tree.arr[x_223].data;
+        if ((2 <= x_230)) {
+          int const x_243_save = x_223;
+          int const x_244 = tree.arr[x_243_save].leftIndex;
+          if ((x_244 == -1)) {
+            tree.arr[x_243_save].leftIndex = 6;
+            BST const tint_symbol_14 = {.data=2, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[6] = tint_symbol_14;
+            x_251_phi = true;
+            break;
+          } else {
+            x_249 = tree.arr[x_243_save].leftIndex;
+            x_224_phi = x_249;
+            {
+              x_224 = x_224_phi;
+              x_223_phi = x_224;
+            }
+            continue;
+          }
+          return;
+        } else {
+          int const x_235_save = x_223;
+          int const x_236 = tree.arr[x_235_save].rightIndex;
+          if ((x_236 == -1)) {
+            tree.arr[x_235_save].rightIndex = 6;
+            BST const tint_symbol_15 = {.data=2, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[6] = tint_symbol_15;
+            x_251_phi = true;
+            break;
+          } else {
+            x_241 = tree.arr[x_235_save].rightIndex;
+            x_224_phi = x_241;
+            {
+              x_224 = x_224_phi;
+              x_223_phi = x_224;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_224 = x_224_phi;
+          x_223_phi = x_224;
+        }
+      }
+      bool const x_251 = x_251_phi;
+      if (x_251) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_256_phi = 0;
+  bool x_284_phi = false;
+  switch(0u) {
+    default: {
+      x_256_phi = 0;
+      while (true) {
+        int x_282 = 0;
+        int x_274 = 0;
+        int x_257 = 0;
+        int x_257_phi = 0;
+        int const x_256 = x_256_phi;
+        x_284_phi = false;
+        if ((x_256 <= 7)) {
+        } else {
+          break;
+        }
+        int const x_263 = tree.arr[x_256].data;
+        if ((6 <= x_263)) {
+          int const x_276_save = x_256;
+          int const x_277 = tree.arr[x_276_save].leftIndex;
+          if ((x_277 == -1)) {
+            tree.arr[x_276_save].leftIndex = 7;
+            BST const tint_symbol_16 = {.data=6, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[7] = tint_symbol_16;
+            x_284_phi = true;
+            break;
+          } else {
+            x_282 = tree.arr[x_276_save].leftIndex;
+            x_257_phi = x_282;
+            {
+              x_257 = x_257_phi;
+              x_256_phi = x_257;
+            }
+            continue;
+          }
+          return;
+        } else {
+          int const x_268_save = x_256;
+          int const x_269 = tree.arr[x_268_save].rightIndex;
+          if ((x_269 == -1)) {
+            tree.arr[x_268_save].rightIndex = 7;
+            BST const tint_symbol_17 = {.data=6, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[7] = tint_symbol_17;
+            x_284_phi = true;
+            break;
+          } else {
+            x_274 = tree.arr[x_268_save].rightIndex;
+            x_257_phi = x_274;
+            {
+              x_257 = x_257_phi;
+              x_256_phi = x_257;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_257 = x_257_phi;
+          x_256_phi = x_257;
+        }
+      }
+      bool const x_284 = x_284_phi;
+      if (x_284) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_289_phi = 0;
+  bool x_317_phi = false;
+  switch(0u) {
+    default: {
+      x_289_phi = 0;
+      while (true) {
+        int x_315 = 0;
+        int x_307 = 0;
+        int x_290 = 0;
+        int x_290_phi = 0;
+        int const x_289 = x_289_phi;
+        x_317_phi = false;
+        if ((x_289 <= 8)) {
+        } else {
+          break;
+        }
+        int const x_296 = tree.arr[x_289].data;
+        if ((17 <= x_296)) {
+          int const x_309_save = x_289;
+          int const x_310 = tree.arr[x_309_save].leftIndex;
+          if ((x_310 == -1)) {
+            tree.arr[x_309_save].leftIndex = 8;
+            BST const tint_symbol_18 = {.data=17, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[8] = tint_symbol_18;
+            x_317_phi = true;
+            break;
+          } else {
+            x_315 = tree.arr[x_309_save].leftIndex;
+            x_290_phi = x_315;
+            {
+              x_290 = x_290_phi;
+              x_289_phi = x_290;
+            }
+            continue;
+          }
+          return;
+        } else {
+          int const x_301_save = x_289;
+          int const x_302 = tree.arr[x_301_save].rightIndex;
+          if ((x_302 == -1)) {
+            tree.arr[x_301_save].rightIndex = 8;
+            BST const tint_symbol_19 = {.data=17, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[8] = tint_symbol_19;
+            x_317_phi = true;
+            break;
+          } else {
+            x_307 = tree.arr[x_301_save].rightIndex;
+            x_290_phi = x_307;
+            {
+              x_290 = x_290_phi;
+              x_289_phi = x_290;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_290 = x_290_phi;
+          x_289_phi = x_290;
+        }
+      }
+      bool const x_317 = x_317_phi;
+      if (x_317) {
+        break;
+      }
+      break;
+    }
+  }
+  int x_322_phi = 0;
+  bool x_350_phi = false;
+  switch(0u) {
+    default: {
+      x_322_phi = 0;
+      while (true) {
+        int x_348 = 0;
+        int x_340 = 0;
+        int x_323 = 0;
+        int x_323_phi = 0;
+        int const x_322 = x_322_phi;
+        x_350_phi = false;
+        if ((x_322 <= 9)) {
+        } else {
+          break;
+        }
+        int const x_329 = tree.arr[x_322].data;
+        if ((13 <= x_329)) {
+          int const x_342_save = x_322;
+          int const x_343 = tree.arr[x_342_save].leftIndex;
+          if ((x_343 == -1)) {
+            tree.arr[x_342_save].leftIndex = 9;
+            BST const tint_symbol_20 = {.data=13, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[9] = tint_symbol_20;
+            x_350_phi = true;
+            break;
+          } else {
+            x_348 = tree.arr[x_342_save].leftIndex;
+            x_323_phi = x_348;
+            {
+              x_323 = x_323_phi;
+              x_322_phi = x_323;
+            }
+            continue;
+          }
+          return;
+        } else {
+          int const x_334_save = x_322;
+          int const x_335 = tree.arr[x_334_save].rightIndex;
+          if ((x_335 == -1)) {
+            tree.arr[x_334_save].rightIndex = 9;
+            BST const tint_symbol_21 = {.data=13, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[9] = tint_symbol_21;
+            x_350_phi = true;
+            break;
+          } else {
+            x_340 = tree.arr[x_334_save].rightIndex;
+            x_323_phi = x_340;
+            {
+              x_323 = x_323_phi;
+              x_322_phi = x_323;
+            }
+            continue;
+          }
+          return;
+        }
+        return;
+        {
+          x_323 = x_323_phi;
+          x_322_phi = x_323;
+        }
+      }
+      bool const x_350 = x_350_phi;
+      if (x_350) {
+        break;
+      }
+      break;
+    }
+  }
+  x_353_phi = 0;
+  x_356_phi = 0;
+  x_358_phi = 0;
+  while (true) {
+    int x_381 = 0;
+    int x_391 = 0;
+    int x_396 = 0;
+    int x_359 = 0;
+    int x_354_phi = 0;
+    int x_357_phi = 0;
+    int const x_353 = x_353_phi;
+    x_356 = x_356_phi;
+    int const x_358 = x_358_phi;
+    if ((x_358 < 20)) {
+    } else {
+      break;
+    }
+    int x_366_phi = 0;
+    int x_381_phi = 0;
+    bool x_382_phi = false;
+    switch(0u) {
+      default: {
+        x_366_phi = 0;
+        while (true) {
+          int const x_366 = x_366_phi;
+          x_381_phi = x_353;
+          x_382_phi = false;
+          if ((x_366 != -1)) {
+          } else {
+            break;
+          }
+          BST const x_373 = tree.arr[x_366];
+          int const x_374 = x_373.data;
+          int const x_375 = x_373.leftIndex;
+          int const x_376 = x_373.rightIndex;
+          if ((x_374 == x_358)) {
+            x_381_phi = x_358;
+            x_382_phi = true;
+            break;
+          }
+          {
+            x_366_phi = select(x_375, x_376, (x_358 > x_374));
+          }
+        }
+        x_381 = x_381_phi;
+        bool const x_382 = x_382_phi;
+        x_354_phi = x_381;
+        if (x_382) {
+          break;
+        }
+        x_354_phi = -1;
+        break;
+      }
+    }
+    int x_354 = 0;
+    int x_390 = 0;
+    int x_395 = 0;
+    int x_391_phi = 0;
+    int x_396_phi = 0;
+    x_354 = x_354_phi;
+    switch(x_358) {
+      case 2:
+      case 5:
+      case 6:
+      case 7:
+      case 8:
+      case 9:
+      case 12:
+      case 13:
+      case 15:
+      case 17: {
+        x_391_phi = x_356;
+        if ((x_354 == as_type<int>(x_358))) {
+          x_390 = as_type<int>((x_356 + as_type<int>(1)));
+          x_391_phi = x_390;
+        }
+        x_391 = x_391_phi;
+        x_357_phi = x_391;
+        break;
+      }
+      default: {
+        x_396_phi = x_356;
+        if ((x_354 == as_type<int>(-1))) {
+          x_395 = as_type<int>((x_356 + as_type<int>(1)));
+          x_396_phi = x_395;
+        }
+        x_396 = x_396_phi;
+        x_357_phi = x_396;
+        break;
+      }
+    }
+    int const x_357 = x_357_phi;
+    {
+      x_359 = (x_358 + 1);
+      x_353_phi = x_354;
+      x_356_phi = x_357;
+      x_358_phi = x_359;
+    }
+  }
+  if ((x_356 == as_type<int>(20))) {
+    *(tint_symbol_23) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_23) = float4(0.0f, 0.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_24 = 0.0f;
+  main_1(&(tint_symbol_24));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_24};
+  tint_symbol_1 const tint_symbol_22 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_22;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..9ea3312
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/0.wgsl.expected.spvasm
@@ -0,0 +1,1166 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 619
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %BST "BST"
+               OpMemberName %BST 0 "data"
+               OpMemberName %BST 1 "leftIndex"
+               OpMemberName %BST 2 "rightIndex"
+               OpName %tree "tree"
+               OpName %x_356 "x_356"
+               OpName %x_58_phi "x_58_phi"
+               OpName %x_86_phi "x_86_phi"
+               OpName %x_353_phi "x_353_phi"
+               OpName %x_356_phi "x_356_phi"
+               OpName %x_358_phi "x_358_phi"
+               OpName %x_84 "x_84"
+               OpName %x_76 "x_76"
+               OpName %x_59 "x_59"
+               OpName %x_59_phi "x_59_phi"
+               OpName %x_91_phi "x_91_phi"
+               OpName %x_119_phi "x_119_phi"
+               OpName %x_117 "x_117"
+               OpName %x_109 "x_109"
+               OpName %x_92 "x_92"
+               OpName %x_92_phi "x_92_phi"
+               OpName %x_124_phi "x_124_phi"
+               OpName %x_152_phi "x_152_phi"
+               OpName %x_150 "x_150"
+               OpName %x_142 "x_142"
+               OpName %x_125 "x_125"
+               OpName %x_125_phi "x_125_phi"
+               OpName %x_157_phi "x_157_phi"
+               OpName %x_185_phi "x_185_phi"
+               OpName %x_183 "x_183"
+               OpName %x_175 "x_175"
+               OpName %x_158 "x_158"
+               OpName %x_158_phi "x_158_phi"
+               OpName %x_190_phi "x_190_phi"
+               OpName %x_218_phi "x_218_phi"
+               OpName %x_216 "x_216"
+               OpName %x_208 "x_208"
+               OpName %x_191 "x_191"
+               OpName %x_191_phi "x_191_phi"
+               OpName %x_223_phi "x_223_phi"
+               OpName %x_251_phi "x_251_phi"
+               OpName %x_249 "x_249"
+               OpName %x_241 "x_241"
+               OpName %x_224 "x_224"
+               OpName %x_224_phi "x_224_phi"
+               OpName %x_256_phi "x_256_phi"
+               OpName %x_284_phi "x_284_phi"
+               OpName %x_282 "x_282"
+               OpName %x_274 "x_274"
+               OpName %x_257 "x_257"
+               OpName %x_257_phi "x_257_phi"
+               OpName %x_289_phi "x_289_phi"
+               OpName %x_317_phi "x_317_phi"
+               OpName %x_315 "x_315"
+               OpName %x_307 "x_307"
+               OpName %x_290 "x_290"
+               OpName %x_290_phi "x_290_phi"
+               OpName %x_322_phi "x_322_phi"
+               OpName %x_350_phi "x_350_phi"
+               OpName %x_348 "x_348"
+               OpName %x_340 "x_340"
+               OpName %x_323 "x_323"
+               OpName %x_323_phi "x_323_phi"
+               OpName %x_381 "x_381"
+               OpName %x_391 "x_391"
+               OpName %x_396 "x_396"
+               OpName %x_359 "x_359"
+               OpName %x_354_phi "x_354_phi"
+               OpName %x_357_phi "x_357_phi"
+               OpName %x_366_phi "x_366_phi"
+               OpName %x_381_phi "x_381_phi"
+               OpName %x_382_phi "x_382_phi"
+               OpName %x_354 "x_354"
+               OpName %x_390 "x_390"
+               OpName %x_395 "x_395"
+               OpName %x_391_phi "x_391_phi"
+               OpName %x_396_phi "x_396_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %BST 0 Offset 0
+               OpMemberDecorate %BST 1 Offset 4
+               OpMemberDecorate %BST 2 Offset 8
+               OpDecorate %_arr_BST_uint_10 ArrayStride 12
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+        %BST = OpTypeStruct %int %int %int
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_BST_uint_10 = OpTypeArray %BST %uint_10
+%_ptr_Function__arr_BST_uint_10 = OpTypePointer Function %_arr_BST_uint_10
+         %19 = OpConstantNull %_arr_BST_uint_10
+%_ptr_Function_int = OpTypePointer Function %int
+         %22 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %27 = OpConstantNull %bool
+      %int_0 = OpConstant %int 0
+%_ptr_Function_BST = OpTypePointer Function %BST
+      %int_9 = OpConstant %int 9
+     %int_n1 = OpConstant %int -1
+         %36 = OpConstantComposite %BST %int_9 %int_n1 %int_n1
+     %uint_0 = OpConstant %uint 0
+      %false = OpConstantFalse %bool
+      %int_1 = OpConstant %int 1
+      %int_5 = OpConstant %int 5
+     %uint_1 = OpConstant %uint 1
+         %71 = OpConstantComposite %BST %int_5 %int_n1 %int_n1
+       %true = OpConstantTrue %bool
+     %uint_2 = OpConstant %uint 2
+      %int_2 = OpConstant %int 2
+     %int_12 = OpConstant %int 12
+        %126 = OpConstantComposite %BST %int_12 %int_n1 %int_n1
+      %int_3 = OpConstant %int 3
+     %int_15 = OpConstant %int 15
+        %179 = OpConstantComposite %BST %int_15 %int_n1 %int_n1
+      %int_4 = OpConstant %int 4
+      %int_7 = OpConstant %int 7
+        %232 = OpConstantComposite %BST %int_7 %int_n1 %int_n1
+      %int_8 = OpConstant %int 8
+        %284 = OpConstantComposite %BST %int_8 %int_n1 %int_n1
+      %int_6 = OpConstant %int 6
+        %336 = OpConstantComposite %BST %int_2 %int_n1 %int_n1
+        %387 = OpConstantComposite %BST %int_6 %int_n1 %int_n1
+     %int_17 = OpConstant %int 17
+        %439 = OpConstantComposite %BST %int_17 %int_n1 %int_n1
+     %int_13 = OpConstant %int 13
+        %491 = OpConstantComposite %BST %int_13 %int_n1 %int_n1
+     %int_20 = OpConstant %int 20
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+        %605 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %606 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+        %607 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+       %tree = OpVariable %_ptr_Function__arr_BST_uint_10 Function %19
+      %x_356 = OpVariable %_ptr_Function_int Function %22
+   %x_58_phi = OpVariable %_ptr_Function_int Function %22
+   %x_86_phi = OpVariable %_ptr_Function_bool Function %27
+  %x_353_phi = OpVariable %_ptr_Function_int Function %22
+  %x_356_phi = OpVariable %_ptr_Function_int Function %22
+  %x_358_phi = OpVariable %_ptr_Function_int Function %22
+       %x_84 = OpVariable %_ptr_Function_int Function %22
+       %x_76 = OpVariable %_ptr_Function_int Function %22
+       %x_59 = OpVariable %_ptr_Function_int Function %22
+   %x_59_phi = OpVariable %_ptr_Function_int Function %22
+   %x_91_phi = OpVariable %_ptr_Function_int Function %22
+  %x_119_phi = OpVariable %_ptr_Function_bool Function %27
+      %x_117 = OpVariable %_ptr_Function_int Function %22
+      %x_109 = OpVariable %_ptr_Function_int Function %22
+       %x_92 = OpVariable %_ptr_Function_int Function %22
+   %x_92_phi = OpVariable %_ptr_Function_int Function %22
+  %x_124_phi = OpVariable %_ptr_Function_int Function %22
+  %x_152_phi = OpVariable %_ptr_Function_bool Function %27
+      %x_150 = OpVariable %_ptr_Function_int Function %22
+      %x_142 = OpVariable %_ptr_Function_int Function %22
+      %x_125 = OpVariable %_ptr_Function_int Function %22
+  %x_125_phi = OpVariable %_ptr_Function_int Function %22
+  %x_157_phi = OpVariable %_ptr_Function_int Function %22
+  %x_185_phi = OpVariable %_ptr_Function_bool Function %27
+      %x_183 = OpVariable %_ptr_Function_int Function %22
+      %x_175 = OpVariable %_ptr_Function_int Function %22
+      %x_158 = OpVariable %_ptr_Function_int Function %22
+  %x_158_phi = OpVariable %_ptr_Function_int Function %22
+  %x_190_phi = OpVariable %_ptr_Function_int Function %22
+  %x_218_phi = OpVariable %_ptr_Function_bool Function %27
+      %x_216 = OpVariable %_ptr_Function_int Function %22
+      %x_208 = OpVariable %_ptr_Function_int Function %22
+      %x_191 = OpVariable %_ptr_Function_int Function %22
+  %x_191_phi = OpVariable %_ptr_Function_int Function %22
+  %x_223_phi = OpVariable %_ptr_Function_int Function %22
+  %x_251_phi = OpVariable %_ptr_Function_bool Function %27
+      %x_249 = OpVariable %_ptr_Function_int Function %22
+      %x_241 = OpVariable %_ptr_Function_int Function %22
+      %x_224 = OpVariable %_ptr_Function_int Function %22
+  %x_224_phi = OpVariable %_ptr_Function_int Function %22
+  %x_256_phi = OpVariable %_ptr_Function_int Function %22
+  %x_284_phi = OpVariable %_ptr_Function_bool Function %27
+      %x_282 = OpVariable %_ptr_Function_int Function %22
+      %x_274 = OpVariable %_ptr_Function_int Function %22
+      %x_257 = OpVariable %_ptr_Function_int Function %22
+  %x_257_phi = OpVariable %_ptr_Function_int Function %22
+  %x_289_phi = OpVariable %_ptr_Function_int Function %22
+  %x_317_phi = OpVariable %_ptr_Function_bool Function %27
+      %x_315 = OpVariable %_ptr_Function_int Function %22
+      %x_307 = OpVariable %_ptr_Function_int Function %22
+      %x_290 = OpVariable %_ptr_Function_int Function %22
+  %x_290_phi = OpVariable %_ptr_Function_int Function %22
+  %x_322_phi = OpVariable %_ptr_Function_int Function %22
+  %x_350_phi = OpVariable %_ptr_Function_bool Function %27
+      %x_348 = OpVariable %_ptr_Function_int Function %22
+      %x_340 = OpVariable %_ptr_Function_int Function %22
+      %x_323 = OpVariable %_ptr_Function_int Function %22
+  %x_323_phi = OpVariable %_ptr_Function_int Function %22
+      %x_381 = OpVariable %_ptr_Function_int Function %22
+      %x_391 = OpVariable %_ptr_Function_int Function %22
+      %x_396 = OpVariable %_ptr_Function_int Function %22
+      %x_359 = OpVariable %_ptr_Function_int Function %22
+  %x_354_phi = OpVariable %_ptr_Function_int Function %22
+  %x_357_phi = OpVariable %_ptr_Function_int Function %22
+  %x_366_phi = OpVariable %_ptr_Function_int Function %22
+  %x_381_phi = OpVariable %_ptr_Function_int Function %22
+  %x_382_phi = OpVariable %_ptr_Function_bool Function %27
+      %x_354 = OpVariable %_ptr_Function_int Function %22
+      %x_390 = OpVariable %_ptr_Function_int Function %22
+      %x_395 = OpVariable %_ptr_Function_int Function %22
+  %x_391_phi = OpVariable %_ptr_Function_int Function %22
+  %x_396_phi = OpVariable %_ptr_Function_int Function %22
+         %33 = OpAccessChain %_ptr_Function_BST %tree %int_0
+               OpStore %33 %36
+               OpSelectionMerge %37 None
+               OpSwitch %uint_0 %39
+         %39 = OpLabel
+               OpStore %x_58_phi %int_0
+               OpBranch %40
+         %40 = OpLabel
+               OpLoopMerge %41 %42 None
+               OpBranch %43
+         %43 = OpLabel
+         %48 = OpLoad %int %x_58_phi
+               OpStore %x_86_phi %false
+         %51 = OpSLessThanEqual %bool %48 %int_1
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %54
+         %53 = OpLabel
+               OpBranch %52
+         %54 = OpLabel
+               OpBranch %41
+         %52 = OpLabel
+         %55 = OpAccessChain %_ptr_Function_int %tree %48 %uint_0
+         %56 = OpLoad %int %55
+         %58 = OpSLessThanEqual %bool %int_5 %56
+               OpSelectionMerge %59 None
+               OpBranchConditional %58 %60 %61
+         %60 = OpLabel
+         %63 = OpAccessChain %_ptr_Function_int %tree %48 %uint_1
+         %64 = OpLoad %int %63
+         %65 = OpIEqual %bool %64 %int_n1
+               OpSelectionMerge %66 None
+               OpBranchConditional %65 %67 %68
+         %67 = OpLabel
+         %69 = OpAccessChain %_ptr_Function_int %tree %48 %uint_1
+               OpStore %69 %int_1
+         %70 = OpAccessChain %_ptr_Function_BST %tree %int_1
+               OpStore %70 %71
+               OpStore %x_86_phi %true
+               OpBranch %41
+         %68 = OpLabel
+         %73 = OpAccessChain %_ptr_Function_int %tree %48 %uint_1
+         %74 = OpLoad %int %73
+               OpStore %x_84 %74
+         %75 = OpLoad %int %x_84
+               OpStore %x_59_phi %75
+               OpBranch %42
+         %66 = OpLabel
+               OpReturn
+         %61 = OpLabel
+         %77 = OpAccessChain %_ptr_Function_int %tree %48 %uint_2
+         %78 = OpLoad %int %77
+         %79 = OpIEqual %bool %78 %int_n1
+               OpSelectionMerge %80 None
+               OpBranchConditional %79 %81 %82
+         %81 = OpLabel
+         %83 = OpAccessChain %_ptr_Function_int %tree %48 %uint_2
+               OpStore %83 %int_1
+         %84 = OpAccessChain %_ptr_Function_BST %tree %int_1
+               OpStore %84 %71
+               OpStore %x_86_phi %true
+               OpBranch %41
+         %82 = OpLabel
+         %85 = OpAccessChain %_ptr_Function_int %tree %48 %uint_2
+         %86 = OpLoad %int %85
+               OpStore %x_76 %86
+         %87 = OpLoad %int %x_76
+               OpStore %x_59_phi %87
+               OpBranch %42
+         %80 = OpLabel
+               OpReturn
+         %59 = OpLabel
+               OpReturn
+         %42 = OpLabel
+         %88 = OpLoad %int %x_59_phi
+               OpStore %x_59 %88
+         %89 = OpLoad %int %x_59
+               OpStore %x_58_phi %89
+               OpBranch %40
+         %41 = OpLabel
+         %90 = OpLoad %bool %x_86_phi
+               OpSelectionMerge %91 None
+               OpBranchConditional %90 %92 %91
+         %92 = OpLabel
+               OpBranch %37
+         %91 = OpLabel
+               OpBranch %37
+         %37 = OpLabel
+               OpSelectionMerge %95 None
+               OpSwitch %uint_0 %96
+         %96 = OpLabel
+               OpStore %x_91_phi %int_0
+               OpBranch %97
+         %97 = OpLabel
+               OpLoopMerge %98 %99 None
+               OpBranch %100
+        %100 = OpLabel
+        %105 = OpLoad %int %x_91_phi
+               OpStore %x_119_phi %false
+        %107 = OpSLessThanEqual %bool %105 %int_2
+               OpSelectionMerge %108 None
+               OpBranchConditional %107 %109 %110
+        %109 = OpLabel
+               OpBranch %108
+        %110 = OpLabel
+               OpBranch %98
+        %108 = OpLabel
+        %111 = OpAccessChain %_ptr_Function_int %tree %105 %uint_0
+        %112 = OpLoad %int %111
+        %114 = OpSLessThanEqual %bool %int_12 %112
+               OpSelectionMerge %115 None
+               OpBranchConditional %114 %116 %117
+        %116 = OpLabel
+        %118 = OpAccessChain %_ptr_Function_int %tree %105 %uint_1
+        %119 = OpLoad %int %118
+        %120 = OpIEqual %bool %119 %int_n1
+               OpSelectionMerge %121 None
+               OpBranchConditional %120 %122 %123
+        %122 = OpLabel
+        %124 = OpAccessChain %_ptr_Function_int %tree %105 %uint_1
+               OpStore %124 %int_2
+        %125 = OpAccessChain %_ptr_Function_BST %tree %int_2
+               OpStore %125 %126
+               OpStore %x_119_phi %true
+               OpBranch %98
+        %123 = OpLabel
+        %127 = OpAccessChain %_ptr_Function_int %tree %105 %uint_1
+        %128 = OpLoad %int %127
+               OpStore %x_117 %128
+        %129 = OpLoad %int %x_117
+               OpStore %x_92_phi %129
+               OpBranch %99
+        %121 = OpLabel
+               OpReturn
+        %117 = OpLabel
+        %130 = OpAccessChain %_ptr_Function_int %tree %105 %uint_2
+        %131 = OpLoad %int %130
+        %132 = OpIEqual %bool %131 %int_n1
+               OpSelectionMerge %133 None
+               OpBranchConditional %132 %134 %135
+        %134 = OpLabel
+        %136 = OpAccessChain %_ptr_Function_int %tree %105 %uint_2
+               OpStore %136 %int_2
+        %137 = OpAccessChain %_ptr_Function_BST %tree %int_2
+               OpStore %137 %126
+               OpStore %x_119_phi %true
+               OpBranch %98
+        %135 = OpLabel
+        %138 = OpAccessChain %_ptr_Function_int %tree %105 %uint_2
+        %139 = OpLoad %int %138
+               OpStore %x_109 %139
+        %140 = OpLoad %int %x_109
+               OpStore %x_92_phi %140
+               OpBranch %99
+        %133 = OpLabel
+               OpReturn
+        %115 = OpLabel
+               OpReturn
+         %99 = OpLabel
+        %141 = OpLoad %int %x_92_phi
+               OpStore %x_92 %141
+        %142 = OpLoad %int %x_92
+               OpStore %x_91_phi %142
+               OpBranch %97
+         %98 = OpLabel
+        %143 = OpLoad %bool %x_119_phi
+               OpSelectionMerge %144 None
+               OpBranchConditional %143 %145 %144
+        %145 = OpLabel
+               OpBranch %95
+        %144 = OpLabel
+               OpBranch %95
+         %95 = OpLabel
+               OpSelectionMerge %148 None
+               OpSwitch %uint_0 %149
+        %149 = OpLabel
+               OpStore %x_124_phi %int_0
+               OpBranch %150
+        %150 = OpLabel
+               OpLoopMerge %151 %152 None
+               OpBranch %153
+        %153 = OpLabel
+        %158 = OpLoad %int %x_124_phi
+               OpStore %x_152_phi %false
+        %160 = OpSLessThanEqual %bool %158 %int_3
+               OpSelectionMerge %161 None
+               OpBranchConditional %160 %162 %163
+        %162 = OpLabel
+               OpBranch %161
+        %163 = OpLabel
+               OpBranch %151
+        %161 = OpLabel
+        %164 = OpAccessChain %_ptr_Function_int %tree %158 %uint_0
+        %165 = OpLoad %int %164
+        %167 = OpSLessThanEqual %bool %int_15 %165
+               OpSelectionMerge %168 None
+               OpBranchConditional %167 %169 %170
+        %169 = OpLabel
+        %171 = OpAccessChain %_ptr_Function_int %tree %158 %uint_1
+        %172 = OpLoad %int %171
+        %173 = OpIEqual %bool %172 %int_n1
+               OpSelectionMerge %174 None
+               OpBranchConditional %173 %175 %176
+        %175 = OpLabel
+        %177 = OpAccessChain %_ptr_Function_int %tree %158 %uint_1
+               OpStore %177 %int_3
+        %178 = OpAccessChain %_ptr_Function_BST %tree %int_3
+               OpStore %178 %179
+               OpStore %x_152_phi %true
+               OpBranch %151
+        %176 = OpLabel
+        %180 = OpAccessChain %_ptr_Function_int %tree %158 %uint_1
+        %181 = OpLoad %int %180
+               OpStore %x_150 %181
+        %182 = OpLoad %int %x_150
+               OpStore %x_125_phi %182
+               OpBranch %152
+        %174 = OpLabel
+               OpReturn
+        %170 = OpLabel
+        %183 = OpAccessChain %_ptr_Function_int %tree %158 %uint_2
+        %184 = OpLoad %int %183
+        %185 = OpIEqual %bool %184 %int_n1
+               OpSelectionMerge %186 None
+               OpBranchConditional %185 %187 %188
+        %187 = OpLabel
+        %189 = OpAccessChain %_ptr_Function_int %tree %158 %uint_2
+               OpStore %189 %int_3
+        %190 = OpAccessChain %_ptr_Function_BST %tree %int_3
+               OpStore %190 %179
+               OpStore %x_152_phi %true
+               OpBranch %151
+        %188 = OpLabel
+        %191 = OpAccessChain %_ptr_Function_int %tree %158 %uint_2
+        %192 = OpLoad %int %191
+               OpStore %x_142 %192
+        %193 = OpLoad %int %x_142
+               OpStore %x_125_phi %193
+               OpBranch %152
+        %186 = OpLabel
+               OpReturn
+        %168 = OpLabel
+               OpReturn
+        %152 = OpLabel
+        %194 = OpLoad %int %x_125_phi
+               OpStore %x_125 %194
+        %195 = OpLoad %int %x_125
+               OpStore %x_124_phi %195
+               OpBranch %150
+        %151 = OpLabel
+        %196 = OpLoad %bool %x_152_phi
+               OpSelectionMerge %197 None
+               OpBranchConditional %196 %198 %197
+        %198 = OpLabel
+               OpBranch %148
+        %197 = OpLabel
+               OpBranch %148
+        %148 = OpLabel
+               OpSelectionMerge %201 None
+               OpSwitch %uint_0 %202
+        %202 = OpLabel
+               OpStore %x_157_phi %int_0
+               OpBranch %203
+        %203 = OpLabel
+               OpLoopMerge %204 %205 None
+               OpBranch %206
+        %206 = OpLabel
+        %211 = OpLoad %int %x_157_phi
+               OpStore %x_185_phi %false
+        %213 = OpSLessThanEqual %bool %211 %int_4
+               OpSelectionMerge %214 None
+               OpBranchConditional %213 %215 %216
+        %215 = OpLabel
+               OpBranch %214
+        %216 = OpLabel
+               OpBranch %204
+        %214 = OpLabel
+        %217 = OpAccessChain %_ptr_Function_int %tree %211 %uint_0
+        %218 = OpLoad %int %217
+        %220 = OpSLessThanEqual %bool %int_7 %218
+               OpSelectionMerge %221 None
+               OpBranchConditional %220 %222 %223
+        %222 = OpLabel
+        %224 = OpAccessChain %_ptr_Function_int %tree %211 %uint_1
+        %225 = OpLoad %int %224
+        %226 = OpIEqual %bool %225 %int_n1
+               OpSelectionMerge %227 None
+               OpBranchConditional %226 %228 %229
+        %228 = OpLabel
+        %230 = OpAccessChain %_ptr_Function_int %tree %211 %uint_1
+               OpStore %230 %int_4
+        %231 = OpAccessChain %_ptr_Function_BST %tree %int_4
+               OpStore %231 %232
+               OpStore %x_185_phi %true
+               OpBranch %204
+        %229 = OpLabel
+        %233 = OpAccessChain %_ptr_Function_int %tree %211 %uint_1
+        %234 = OpLoad %int %233
+               OpStore %x_183 %234
+        %235 = OpLoad %int %x_183
+               OpStore %x_158_phi %235
+               OpBranch %205
+        %227 = OpLabel
+               OpReturn
+        %223 = OpLabel
+        %236 = OpAccessChain %_ptr_Function_int %tree %211 %uint_2
+        %237 = OpLoad %int %236
+        %238 = OpIEqual %bool %237 %int_n1
+               OpSelectionMerge %239 None
+               OpBranchConditional %238 %240 %241
+        %240 = OpLabel
+        %242 = OpAccessChain %_ptr_Function_int %tree %211 %uint_2
+               OpStore %242 %int_4
+        %243 = OpAccessChain %_ptr_Function_BST %tree %int_4
+               OpStore %243 %232
+               OpStore %x_185_phi %true
+               OpBranch %204
+        %241 = OpLabel
+        %244 = OpAccessChain %_ptr_Function_int %tree %211 %uint_2
+        %245 = OpLoad %int %244
+               OpStore %x_175 %245
+        %246 = OpLoad %int %x_175
+               OpStore %x_158_phi %246
+               OpBranch %205
+        %239 = OpLabel
+               OpReturn
+        %221 = OpLabel
+               OpReturn
+        %205 = OpLabel
+        %247 = OpLoad %int %x_158_phi
+               OpStore %x_158 %247
+        %248 = OpLoad %int %x_158
+               OpStore %x_157_phi %248
+               OpBranch %203
+        %204 = OpLabel
+        %249 = OpLoad %bool %x_185_phi
+               OpSelectionMerge %250 None
+               OpBranchConditional %249 %251 %250
+        %251 = OpLabel
+               OpBranch %201
+        %250 = OpLabel
+               OpBranch %201
+        %201 = OpLabel
+               OpSelectionMerge %254 None
+               OpSwitch %uint_0 %255
+        %255 = OpLabel
+               OpStore %x_190_phi %int_0
+               OpBranch %256
+        %256 = OpLabel
+               OpLoopMerge %257 %258 None
+               OpBranch %259
+        %259 = OpLabel
+        %264 = OpLoad %int %x_190_phi
+               OpStore %x_218_phi %false
+        %265 = OpSLessThanEqual %bool %264 %int_5
+               OpSelectionMerge %266 None
+               OpBranchConditional %265 %267 %268
+        %267 = OpLabel
+               OpBranch %266
+        %268 = OpLabel
+               OpBranch %257
+        %266 = OpLabel
+        %269 = OpAccessChain %_ptr_Function_int %tree %264 %uint_0
+        %270 = OpLoad %int %269
+        %272 = OpSLessThanEqual %bool %int_8 %270
+               OpSelectionMerge %273 None
+               OpBranchConditional %272 %274 %275
+        %274 = OpLabel
+        %276 = OpAccessChain %_ptr_Function_int %tree %264 %uint_1
+        %277 = OpLoad %int %276
+        %278 = OpIEqual %bool %277 %int_n1
+               OpSelectionMerge %279 None
+               OpBranchConditional %278 %280 %281
+        %280 = OpLabel
+        %282 = OpAccessChain %_ptr_Function_int %tree %264 %uint_1
+               OpStore %282 %int_5
+        %283 = OpAccessChain %_ptr_Function_BST %tree %int_5
+               OpStore %283 %284
+               OpStore %x_218_phi %true
+               OpBranch %257
+        %281 = OpLabel
+        %285 = OpAccessChain %_ptr_Function_int %tree %264 %uint_1
+        %286 = OpLoad %int %285
+               OpStore %x_216 %286
+        %287 = OpLoad %int %x_216
+               OpStore %x_191_phi %287
+               OpBranch %258
+        %279 = OpLabel
+               OpReturn
+        %275 = OpLabel
+        %288 = OpAccessChain %_ptr_Function_int %tree %264 %uint_2
+        %289 = OpLoad %int %288
+        %290 = OpIEqual %bool %289 %int_n1
+               OpSelectionMerge %291 None
+               OpBranchConditional %290 %292 %293
+        %292 = OpLabel
+        %294 = OpAccessChain %_ptr_Function_int %tree %264 %uint_2
+               OpStore %294 %int_5
+        %295 = OpAccessChain %_ptr_Function_BST %tree %int_5
+               OpStore %295 %284
+               OpStore %x_218_phi %true
+               OpBranch %257
+        %293 = OpLabel
+        %296 = OpAccessChain %_ptr_Function_int %tree %264 %uint_2
+        %297 = OpLoad %int %296
+               OpStore %x_208 %297
+        %298 = OpLoad %int %x_208
+               OpStore %x_191_phi %298
+               OpBranch %258
+        %291 = OpLabel
+               OpReturn
+        %273 = OpLabel
+               OpReturn
+        %258 = OpLabel
+        %299 = OpLoad %int %x_191_phi
+               OpStore %x_191 %299
+        %300 = OpLoad %int %x_191
+               OpStore %x_190_phi %300
+               OpBranch %256
+        %257 = OpLabel
+        %301 = OpLoad %bool %x_218_phi
+               OpSelectionMerge %302 None
+               OpBranchConditional %301 %303 %302
+        %303 = OpLabel
+               OpBranch %254
+        %302 = OpLabel
+               OpBranch %254
+        %254 = OpLabel
+               OpSelectionMerge %306 None
+               OpSwitch %uint_0 %307
+        %307 = OpLabel
+               OpStore %x_223_phi %int_0
+               OpBranch %308
+        %308 = OpLabel
+               OpLoopMerge %309 %310 None
+               OpBranch %311
+        %311 = OpLabel
+        %316 = OpLoad %int %x_223_phi
+               OpStore %x_251_phi %false
+        %318 = OpSLessThanEqual %bool %316 %int_6
+               OpSelectionMerge %319 None
+               OpBranchConditional %318 %320 %321
+        %320 = OpLabel
+               OpBranch %319
+        %321 = OpLabel
+               OpBranch %309
+        %319 = OpLabel
+        %322 = OpAccessChain %_ptr_Function_int %tree %316 %uint_0
+        %323 = OpLoad %int %322
+        %324 = OpSLessThanEqual %bool %int_2 %323
+               OpSelectionMerge %325 None
+               OpBranchConditional %324 %326 %327
+        %326 = OpLabel
+        %328 = OpAccessChain %_ptr_Function_int %tree %316 %uint_1
+        %329 = OpLoad %int %328
+        %330 = OpIEqual %bool %329 %int_n1
+               OpSelectionMerge %331 None
+               OpBranchConditional %330 %332 %333
+        %332 = OpLabel
+        %334 = OpAccessChain %_ptr_Function_int %tree %316 %uint_1
+               OpStore %334 %int_6
+        %335 = OpAccessChain %_ptr_Function_BST %tree %int_6
+               OpStore %335 %336
+               OpStore %x_251_phi %true
+               OpBranch %309
+        %333 = OpLabel
+        %337 = OpAccessChain %_ptr_Function_int %tree %316 %uint_1
+        %338 = OpLoad %int %337
+               OpStore %x_249 %338
+        %339 = OpLoad %int %x_249
+               OpStore %x_224_phi %339
+               OpBranch %310
+        %331 = OpLabel
+               OpReturn
+        %327 = OpLabel
+        %340 = OpAccessChain %_ptr_Function_int %tree %316 %uint_2
+        %341 = OpLoad %int %340
+        %342 = OpIEqual %bool %341 %int_n1
+               OpSelectionMerge %343 None
+               OpBranchConditional %342 %344 %345
+        %344 = OpLabel
+        %346 = OpAccessChain %_ptr_Function_int %tree %316 %uint_2
+               OpStore %346 %int_6
+        %347 = OpAccessChain %_ptr_Function_BST %tree %int_6
+               OpStore %347 %336
+               OpStore %x_251_phi %true
+               OpBranch %309
+        %345 = OpLabel
+        %348 = OpAccessChain %_ptr_Function_int %tree %316 %uint_2
+        %349 = OpLoad %int %348
+               OpStore %x_241 %349
+        %350 = OpLoad %int %x_241
+               OpStore %x_224_phi %350
+               OpBranch %310
+        %343 = OpLabel
+               OpReturn
+        %325 = OpLabel
+               OpReturn
+        %310 = OpLabel
+        %351 = OpLoad %int %x_224_phi
+               OpStore %x_224 %351
+        %352 = OpLoad %int %x_224
+               OpStore %x_223_phi %352
+               OpBranch %308
+        %309 = OpLabel
+        %353 = OpLoad %bool %x_251_phi
+               OpSelectionMerge %354 None
+               OpBranchConditional %353 %355 %354
+        %355 = OpLabel
+               OpBranch %306
+        %354 = OpLabel
+               OpBranch %306
+        %306 = OpLabel
+               OpSelectionMerge %358 None
+               OpSwitch %uint_0 %359
+        %359 = OpLabel
+               OpStore %x_256_phi %int_0
+               OpBranch %360
+        %360 = OpLabel
+               OpLoopMerge %361 %362 None
+               OpBranch %363
+        %363 = OpLabel
+        %368 = OpLoad %int %x_256_phi
+               OpStore %x_284_phi %false
+        %369 = OpSLessThanEqual %bool %368 %int_7
+               OpSelectionMerge %370 None
+               OpBranchConditional %369 %371 %372
+        %371 = OpLabel
+               OpBranch %370
+        %372 = OpLabel
+               OpBranch %361
+        %370 = OpLabel
+        %373 = OpAccessChain %_ptr_Function_int %tree %368 %uint_0
+        %374 = OpLoad %int %373
+        %375 = OpSLessThanEqual %bool %int_6 %374
+               OpSelectionMerge %376 None
+               OpBranchConditional %375 %377 %378
+        %377 = OpLabel
+        %379 = OpAccessChain %_ptr_Function_int %tree %368 %uint_1
+        %380 = OpLoad %int %379
+        %381 = OpIEqual %bool %380 %int_n1
+               OpSelectionMerge %382 None
+               OpBranchConditional %381 %383 %384
+        %383 = OpLabel
+        %385 = OpAccessChain %_ptr_Function_int %tree %368 %uint_1
+               OpStore %385 %int_7
+        %386 = OpAccessChain %_ptr_Function_BST %tree %int_7
+               OpStore %386 %387
+               OpStore %x_284_phi %true
+               OpBranch %361
+        %384 = OpLabel
+        %388 = OpAccessChain %_ptr_Function_int %tree %368 %uint_1
+        %389 = OpLoad %int %388
+               OpStore %x_282 %389
+        %390 = OpLoad %int %x_282
+               OpStore %x_257_phi %390
+               OpBranch %362
+        %382 = OpLabel
+               OpReturn
+        %378 = OpLabel
+        %391 = OpAccessChain %_ptr_Function_int %tree %368 %uint_2
+        %392 = OpLoad %int %391
+        %393 = OpIEqual %bool %392 %int_n1
+               OpSelectionMerge %394 None
+               OpBranchConditional %393 %395 %396
+        %395 = OpLabel
+        %397 = OpAccessChain %_ptr_Function_int %tree %368 %uint_2
+               OpStore %397 %int_7
+        %398 = OpAccessChain %_ptr_Function_BST %tree %int_7
+               OpStore %398 %387
+               OpStore %x_284_phi %true
+               OpBranch %361
+        %396 = OpLabel
+        %399 = OpAccessChain %_ptr_Function_int %tree %368 %uint_2
+        %400 = OpLoad %int %399
+               OpStore %x_274 %400
+        %401 = OpLoad %int %x_274
+               OpStore %x_257_phi %401
+               OpBranch %362
+        %394 = OpLabel
+               OpReturn
+        %376 = OpLabel
+               OpReturn
+        %362 = OpLabel
+        %402 = OpLoad %int %x_257_phi
+               OpStore %x_257 %402
+        %403 = OpLoad %int %x_257
+               OpStore %x_256_phi %403
+               OpBranch %360
+        %361 = OpLabel
+        %404 = OpLoad %bool %x_284_phi
+               OpSelectionMerge %405 None
+               OpBranchConditional %404 %406 %405
+        %406 = OpLabel
+               OpBranch %358
+        %405 = OpLabel
+               OpBranch %358
+        %358 = OpLabel
+               OpSelectionMerge %409 None
+               OpSwitch %uint_0 %410
+        %410 = OpLabel
+               OpStore %x_289_phi %int_0
+               OpBranch %411
+        %411 = OpLabel
+               OpLoopMerge %412 %413 None
+               OpBranch %414
+        %414 = OpLabel
+        %419 = OpLoad %int %x_289_phi
+               OpStore %x_317_phi %false
+        %420 = OpSLessThanEqual %bool %419 %int_8
+               OpSelectionMerge %421 None
+               OpBranchConditional %420 %422 %423
+        %422 = OpLabel
+               OpBranch %421
+        %423 = OpLabel
+               OpBranch %412
+        %421 = OpLabel
+        %424 = OpAccessChain %_ptr_Function_int %tree %419 %uint_0
+        %425 = OpLoad %int %424
+        %427 = OpSLessThanEqual %bool %int_17 %425
+               OpSelectionMerge %428 None
+               OpBranchConditional %427 %429 %430
+        %429 = OpLabel
+        %431 = OpAccessChain %_ptr_Function_int %tree %419 %uint_1
+        %432 = OpLoad %int %431
+        %433 = OpIEqual %bool %432 %int_n1
+               OpSelectionMerge %434 None
+               OpBranchConditional %433 %435 %436
+        %435 = OpLabel
+        %437 = OpAccessChain %_ptr_Function_int %tree %419 %uint_1
+               OpStore %437 %int_8
+        %438 = OpAccessChain %_ptr_Function_BST %tree %int_8
+               OpStore %438 %439
+               OpStore %x_317_phi %true
+               OpBranch %412
+        %436 = OpLabel
+        %440 = OpAccessChain %_ptr_Function_int %tree %419 %uint_1
+        %441 = OpLoad %int %440
+               OpStore %x_315 %441
+        %442 = OpLoad %int %x_315
+               OpStore %x_290_phi %442
+               OpBranch %413
+        %434 = OpLabel
+               OpReturn
+        %430 = OpLabel
+        %443 = OpAccessChain %_ptr_Function_int %tree %419 %uint_2
+        %444 = OpLoad %int %443
+        %445 = OpIEqual %bool %444 %int_n1
+               OpSelectionMerge %446 None
+               OpBranchConditional %445 %447 %448
+        %447 = OpLabel
+        %449 = OpAccessChain %_ptr_Function_int %tree %419 %uint_2
+               OpStore %449 %int_8
+        %450 = OpAccessChain %_ptr_Function_BST %tree %int_8
+               OpStore %450 %439
+               OpStore %x_317_phi %true
+               OpBranch %412
+        %448 = OpLabel
+        %451 = OpAccessChain %_ptr_Function_int %tree %419 %uint_2
+        %452 = OpLoad %int %451
+               OpStore %x_307 %452
+        %453 = OpLoad %int %x_307
+               OpStore %x_290_phi %453
+               OpBranch %413
+        %446 = OpLabel
+               OpReturn
+        %428 = OpLabel
+               OpReturn
+        %413 = OpLabel
+        %454 = OpLoad %int %x_290_phi
+               OpStore %x_290 %454
+        %455 = OpLoad %int %x_290
+               OpStore %x_289_phi %455
+               OpBranch %411
+        %412 = OpLabel
+        %456 = OpLoad %bool %x_317_phi
+               OpSelectionMerge %457 None
+               OpBranchConditional %456 %458 %457
+        %458 = OpLabel
+               OpBranch %409
+        %457 = OpLabel
+               OpBranch %409
+        %409 = OpLabel
+               OpSelectionMerge %461 None
+               OpSwitch %uint_0 %462
+        %462 = OpLabel
+               OpStore %x_322_phi %int_0
+               OpBranch %463
+        %463 = OpLabel
+               OpLoopMerge %464 %465 None
+               OpBranch %466
+        %466 = OpLabel
+        %471 = OpLoad %int %x_322_phi
+               OpStore %x_350_phi %false
+        %472 = OpSLessThanEqual %bool %471 %int_9
+               OpSelectionMerge %473 None
+               OpBranchConditional %472 %474 %475
+        %474 = OpLabel
+               OpBranch %473
+        %475 = OpLabel
+               OpBranch %464
+        %473 = OpLabel
+        %476 = OpAccessChain %_ptr_Function_int %tree %471 %uint_0
+        %477 = OpLoad %int %476
+        %479 = OpSLessThanEqual %bool %int_13 %477
+               OpSelectionMerge %480 None
+               OpBranchConditional %479 %481 %482
+        %481 = OpLabel
+        %483 = OpAccessChain %_ptr_Function_int %tree %471 %uint_1
+        %484 = OpLoad %int %483
+        %485 = OpIEqual %bool %484 %int_n1
+               OpSelectionMerge %486 None
+               OpBranchConditional %485 %487 %488
+        %487 = OpLabel
+        %489 = OpAccessChain %_ptr_Function_int %tree %471 %uint_1
+               OpStore %489 %int_9
+        %490 = OpAccessChain %_ptr_Function_BST %tree %int_9
+               OpStore %490 %491
+               OpStore %x_350_phi %true
+               OpBranch %464
+        %488 = OpLabel
+        %492 = OpAccessChain %_ptr_Function_int %tree %471 %uint_1
+        %493 = OpLoad %int %492
+               OpStore %x_348 %493
+        %494 = OpLoad %int %x_348
+               OpStore %x_323_phi %494
+               OpBranch %465
+        %486 = OpLabel
+               OpReturn
+        %482 = OpLabel
+        %495 = OpAccessChain %_ptr_Function_int %tree %471 %uint_2
+        %496 = OpLoad %int %495
+        %497 = OpIEqual %bool %496 %int_n1
+               OpSelectionMerge %498 None
+               OpBranchConditional %497 %499 %500
+        %499 = OpLabel
+        %501 = OpAccessChain %_ptr_Function_int %tree %471 %uint_2
+               OpStore %501 %int_9
+        %502 = OpAccessChain %_ptr_Function_BST %tree %int_9
+               OpStore %502 %491
+               OpStore %x_350_phi %true
+               OpBranch %464
+        %500 = OpLabel
+        %503 = OpAccessChain %_ptr_Function_int %tree %471 %uint_2
+        %504 = OpLoad %int %503
+               OpStore %x_340 %504
+        %505 = OpLoad %int %x_340
+               OpStore %x_323_phi %505
+               OpBranch %465
+        %498 = OpLabel
+               OpReturn
+        %480 = OpLabel
+               OpReturn
+        %465 = OpLabel
+        %506 = OpLoad %int %x_323_phi
+               OpStore %x_323 %506
+        %507 = OpLoad %int %x_323
+               OpStore %x_322_phi %507
+               OpBranch %463
+        %464 = OpLabel
+        %508 = OpLoad %bool %x_350_phi
+               OpSelectionMerge %509 None
+               OpBranchConditional %508 %510 %509
+        %510 = OpLabel
+               OpBranch %461
+        %509 = OpLabel
+               OpBranch %461
+        %461 = OpLabel
+               OpStore %x_353_phi %int_0
+               OpStore %x_356_phi %int_0
+               OpStore %x_358_phi %int_0
+               OpBranch %511
+        %511 = OpLabel
+               OpLoopMerge %512 %513 None
+               OpBranch %514
+        %514 = OpLabel
+        %521 = OpLoad %int %x_353_phi
+        %522 = OpLoad %int %x_356_phi
+               OpStore %x_356 %522
+        %523 = OpLoad %int %x_358_phi
+        %525 = OpSLessThan %bool %523 %int_20
+               OpSelectionMerge %526 None
+               OpBranchConditional %525 %527 %528
+        %527 = OpLabel
+               OpBranch %526
+        %528 = OpLabel
+               OpBranch %512
+        %526 = OpLabel
+               OpSelectionMerge %532 None
+               OpSwitch %uint_0 %533
+        %533 = OpLabel
+               OpStore %x_366_phi %int_0
+               OpBranch %534
+        %534 = OpLabel
+               OpLoopMerge %535 %536 None
+               OpBranch %537
+        %537 = OpLabel
+        %538 = OpLoad %int %x_366_phi
+               OpStore %x_381_phi %521
+               OpStore %x_382_phi %false
+        %539 = OpINotEqual %bool %538 %int_n1
+               OpSelectionMerge %540 None
+               OpBranchConditional %539 %541 %542
+        %541 = OpLabel
+               OpBranch %540
+        %542 = OpLabel
+               OpBranch %535
+        %540 = OpLabel
+        %543 = OpAccessChain %_ptr_Function_BST %tree %538
+        %544 = OpLoad %BST %543
+        %545 = OpCompositeExtract %int %544 0
+        %546 = OpCompositeExtract %int %544 1
+        %547 = OpCompositeExtract %int %544 2
+        %548 = OpIEqual %bool %545 %523
+               OpSelectionMerge %549 None
+               OpBranchConditional %548 %550 %549
+        %550 = OpLabel
+               OpStore %x_381_phi %523
+               OpStore %x_382_phi %true
+               OpBranch %535
+        %549 = OpLabel
+               OpBranch %536
+        %536 = OpLabel
+        %552 = OpSGreaterThan %bool %523 %545
+        %551 = OpSelect %int %552 %547 %546
+               OpStore %x_366_phi %551
+               OpBranch %534
+        %535 = OpLabel
+        %553 = OpLoad %int %x_381_phi
+               OpStore %x_381 %553
+        %554 = OpLoad %bool %x_382_phi
+        %555 = OpLoad %int %x_381
+               OpStore %x_354_phi %555
+               OpSelectionMerge %556 None
+               OpBranchConditional %554 %557 %556
+        %557 = OpLabel
+               OpBranch %532
+        %556 = OpLabel
+               OpStore %x_354_phi %int_n1
+               OpBranch %532
+        %532 = OpLabel
+        %563 = OpLoad %int %x_354_phi
+               OpStore %x_354 %563
+               OpSelectionMerge %564 None
+               OpSwitch %523 %565 2 %566 5 %566 6 %566 7 %566 8 %566 9 %566 12 %566 13 %566 15 %566 17 %566
+        %566 = OpLabel
+        %567 = OpLoad %int %x_356
+               OpStore %x_391_phi %567
+        %568 = OpLoad %int %x_354
+        %569 = OpCopyObject %int %523
+        %570 = OpIEqual %bool %568 %569
+               OpSelectionMerge %571 None
+               OpBranchConditional %570 %572 %571
+        %572 = OpLabel
+        %574 = OpLoad %int %x_356
+        %575 = OpCopyObject %int %int_1
+        %576 = OpIAdd %int %574 %575
+        %573 = OpCopyObject %int %576
+               OpStore %x_390 %573
+        %577 = OpLoad %int %x_390
+               OpStore %x_391_phi %577
+               OpBranch %571
+        %571 = OpLabel
+        %578 = OpLoad %int %x_391_phi
+               OpStore %x_391 %578
+        %579 = OpLoad %int %x_391
+               OpStore %x_357_phi %579
+               OpBranch %564
+        %565 = OpLabel
+        %580 = OpLoad %int %x_356
+               OpStore %x_396_phi %580
+        %581 = OpLoad %int %x_354
+        %582 = OpCopyObject %int %int_n1
+        %583 = OpIEqual %bool %581 %582
+               OpSelectionMerge %584 None
+               OpBranchConditional %583 %585 %584
+        %585 = OpLabel
+        %587 = OpLoad %int %x_356
+        %588 = OpCopyObject %int %int_1
+        %589 = OpIAdd %int %587 %588
+        %586 = OpCopyObject %int %589
+               OpStore %x_395 %586
+        %590 = OpLoad %int %x_395
+               OpStore %x_396_phi %590
+               OpBranch %584
+        %584 = OpLabel
+        %591 = OpLoad %int %x_396_phi
+               OpStore %x_396 %591
+        %592 = OpLoad %int %x_396
+               OpStore %x_357_phi %592
+               OpBranch %564
+        %564 = OpLabel
+        %593 = OpLoad %int %x_357_phi
+               OpBranch %513
+        %513 = OpLabel
+        %594 = OpIAdd %int %523 %int_1
+               OpStore %x_359 %594
+        %595 = OpLoad %int %x_354
+               OpStore %x_353_phi %595
+               OpStore %x_356_phi %593
+        %596 = OpLoad %int %x_359
+               OpStore %x_358_phi %596
+               OpBranch %511
+        %512 = OpLabel
+        %597 = OpLoad %int %x_356
+        %598 = OpCopyObject %int %int_20
+        %599 = OpIEqual %bool %597 %598
+               OpSelectionMerge %600 None
+               OpBranchConditional %599 %601 %602
+        %601 = OpLabel
+               OpStore %x_GLF_color %605
+               OpBranch %600
+        %602 = OpLabel
+               OpStore %x_GLF_color %606
+               OpBranch %600
+        %600 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %607
+%tint_symbol = OpFunctionParameter %main_out
+        %611 = OpLabel
+        %612 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %612
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+        %614 = OpLabel
+        %615 = OpFunctionCall %void %main_1
+        %617 = OpLoad %v4float %x_GLF_color
+        %618 = OpCompositeConstruct %main_out %617
+        %616 = OpFunctionCall %void %tint_symbol_2 %618
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..76d569e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/0.wgsl.expected.wgsl
@@ -0,0 +1,653 @@
+struct BST {
+  data : i32;
+  leftIndex : i32;
+  rightIndex : i32;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var tree : array<BST, 10>;
+  var x_356 : i32;
+  var x_58_phi : i32;
+  var x_86_phi : bool;
+  var x_353_phi : i32;
+  var x_356_phi : i32;
+  var x_358_phi : i32;
+  tree[0] = BST(9, -1, -1);
+  switch(0u) {
+    default: {
+      x_58_phi = 0;
+      loop {
+        var x_84 : i32;
+        var x_76 : i32;
+        var x_59 : i32;
+        var x_59_phi : i32;
+        let x_58 : i32 = x_58_phi;
+        x_86_phi = false;
+        if ((x_58 <= 1)) {
+        } else {
+          break;
+        }
+        let x_65 : i32 = tree[x_58].data;
+        if ((5 <= x_65)) {
+          let x_78 : ptr<function, i32> = &(tree[x_58].leftIndex);
+          let x_79 : i32 = *(x_78);
+          if ((x_79 == -1)) {
+            *(x_78) = 1;
+            tree[1] = BST(5, -1, -1);
+            x_86_phi = true;
+            break;
+          } else {
+            x_84 = *(x_78);
+            x_59_phi = x_84;
+            continue;
+          }
+          return;
+        } else {
+          let x_70 : ptr<function, i32> = &(tree[x_58].rightIndex);
+          let x_71 : i32 = *(x_70);
+          if ((x_71 == -1)) {
+            *(x_70) = 1;
+            tree[1] = BST(5, -1, -1);
+            x_86_phi = true;
+            break;
+          } else {
+            x_76 = *(x_70);
+            x_59_phi = x_76;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_59 = x_59_phi;
+          x_58_phi = x_59;
+        }
+      }
+      let x_86 : bool = x_86_phi;
+      if (x_86) {
+        break;
+      }
+    }
+  }
+  var x_91_phi : i32;
+  var x_119_phi : bool;
+  switch(0u) {
+    default: {
+      x_91_phi = 0;
+      loop {
+        var x_117 : i32;
+        var x_109 : i32;
+        var x_92 : i32;
+        var x_92_phi : i32;
+        let x_91 : i32 = x_91_phi;
+        x_119_phi = false;
+        if ((x_91 <= 2)) {
+        } else {
+          break;
+        }
+        let x_98 : i32 = tree[x_91].data;
+        if ((12 <= x_98)) {
+          let x_111 : ptr<function, i32> = &(tree[x_91].leftIndex);
+          let x_112 : i32 = *(x_111);
+          if ((x_112 == -1)) {
+            *(x_111) = 2;
+            tree[2] = BST(12, -1, -1);
+            x_119_phi = true;
+            break;
+          } else {
+            x_117 = *(x_111);
+            x_92_phi = x_117;
+            continue;
+          }
+          return;
+        } else {
+          let x_103 : ptr<function, i32> = &(tree[x_91].rightIndex);
+          let x_104 : i32 = *(x_103);
+          if ((x_104 == -1)) {
+            *(x_103) = 2;
+            tree[2] = BST(12, -1, -1);
+            x_119_phi = true;
+            break;
+          } else {
+            x_109 = *(x_103);
+            x_92_phi = x_109;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_92 = x_92_phi;
+          x_91_phi = x_92;
+        }
+      }
+      let x_119 : bool = x_119_phi;
+      if (x_119) {
+        break;
+      }
+    }
+  }
+  var x_124_phi : i32;
+  var x_152_phi : bool;
+  switch(0u) {
+    default: {
+      x_124_phi = 0;
+      loop {
+        var x_150 : i32;
+        var x_142 : i32;
+        var x_125 : i32;
+        var x_125_phi : i32;
+        let x_124 : i32 = x_124_phi;
+        x_152_phi = false;
+        if ((x_124 <= 3)) {
+        } else {
+          break;
+        }
+        let x_131 : i32 = tree[x_124].data;
+        if ((15 <= x_131)) {
+          let x_144 : ptr<function, i32> = &(tree[x_124].leftIndex);
+          let x_145 : i32 = *(x_144);
+          if ((x_145 == -1)) {
+            *(x_144) = 3;
+            tree[3] = BST(15, -1, -1);
+            x_152_phi = true;
+            break;
+          } else {
+            x_150 = *(x_144);
+            x_125_phi = x_150;
+            continue;
+          }
+          return;
+        } else {
+          let x_136 : ptr<function, i32> = &(tree[x_124].rightIndex);
+          let x_137 : i32 = *(x_136);
+          if ((x_137 == -1)) {
+            *(x_136) = 3;
+            tree[3] = BST(15, -1, -1);
+            x_152_phi = true;
+            break;
+          } else {
+            x_142 = *(x_136);
+            x_125_phi = x_142;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_125 = x_125_phi;
+          x_124_phi = x_125;
+        }
+      }
+      let x_152 : bool = x_152_phi;
+      if (x_152) {
+        break;
+      }
+    }
+  }
+  var x_157_phi : i32;
+  var x_185_phi : bool;
+  switch(0u) {
+    default: {
+      x_157_phi = 0;
+      loop {
+        var x_183 : i32;
+        var x_175 : i32;
+        var x_158 : i32;
+        var x_158_phi : i32;
+        let x_157 : i32 = x_157_phi;
+        x_185_phi = false;
+        if ((x_157 <= 4)) {
+        } else {
+          break;
+        }
+        let x_164 : i32 = tree[x_157].data;
+        if ((7 <= x_164)) {
+          let x_177 : ptr<function, i32> = &(tree[x_157].leftIndex);
+          let x_178 : i32 = *(x_177);
+          if ((x_178 == -1)) {
+            *(x_177) = 4;
+            tree[4] = BST(7, -1, -1);
+            x_185_phi = true;
+            break;
+          } else {
+            x_183 = *(x_177);
+            x_158_phi = x_183;
+            continue;
+          }
+          return;
+        } else {
+          let x_169 : ptr<function, i32> = &(tree[x_157].rightIndex);
+          let x_170 : i32 = *(x_169);
+          if ((x_170 == -1)) {
+            *(x_169) = 4;
+            tree[4] = BST(7, -1, -1);
+            x_185_phi = true;
+            break;
+          } else {
+            x_175 = *(x_169);
+            x_158_phi = x_175;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_158 = x_158_phi;
+          x_157_phi = x_158;
+        }
+      }
+      let x_185 : bool = x_185_phi;
+      if (x_185) {
+        break;
+      }
+    }
+  }
+  var x_190_phi : i32;
+  var x_218_phi : bool;
+  switch(0u) {
+    default: {
+      x_190_phi = 0;
+      loop {
+        var x_216 : i32;
+        var x_208 : i32;
+        var x_191 : i32;
+        var x_191_phi : i32;
+        let x_190 : i32 = x_190_phi;
+        x_218_phi = false;
+        if ((x_190 <= 5)) {
+        } else {
+          break;
+        }
+        let x_197 : i32 = tree[x_190].data;
+        if ((8 <= x_197)) {
+          let x_210 : ptr<function, i32> = &(tree[x_190].leftIndex);
+          let x_211 : i32 = *(x_210);
+          if ((x_211 == -1)) {
+            *(x_210) = 5;
+            tree[5] = BST(8, -1, -1);
+            x_218_phi = true;
+            break;
+          } else {
+            x_216 = *(x_210);
+            x_191_phi = x_216;
+            continue;
+          }
+          return;
+        } else {
+          let x_202 : ptr<function, i32> = &(tree[x_190].rightIndex);
+          let x_203 : i32 = *(x_202);
+          if ((x_203 == -1)) {
+            *(x_202) = 5;
+            tree[5] = BST(8, -1, -1);
+            x_218_phi = true;
+            break;
+          } else {
+            x_208 = *(x_202);
+            x_191_phi = x_208;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_191 = x_191_phi;
+          x_190_phi = x_191;
+        }
+      }
+      let x_218 : bool = x_218_phi;
+      if (x_218) {
+        break;
+      }
+    }
+  }
+  var x_223_phi : i32;
+  var x_251_phi : bool;
+  switch(0u) {
+    default: {
+      x_223_phi = 0;
+      loop {
+        var x_249 : i32;
+        var x_241 : i32;
+        var x_224 : i32;
+        var x_224_phi : i32;
+        let x_223 : i32 = x_223_phi;
+        x_251_phi = false;
+        if ((x_223 <= 6)) {
+        } else {
+          break;
+        }
+        let x_230 : i32 = tree[x_223].data;
+        if ((2 <= x_230)) {
+          let x_243 : ptr<function, i32> = &(tree[x_223].leftIndex);
+          let x_244 : i32 = *(x_243);
+          if ((x_244 == -1)) {
+            *(x_243) = 6;
+            tree[6] = BST(2, -1, -1);
+            x_251_phi = true;
+            break;
+          } else {
+            x_249 = *(x_243);
+            x_224_phi = x_249;
+            continue;
+          }
+          return;
+        } else {
+          let x_235 : ptr<function, i32> = &(tree[x_223].rightIndex);
+          let x_236 : i32 = *(x_235);
+          if ((x_236 == -1)) {
+            *(x_235) = 6;
+            tree[6] = BST(2, -1, -1);
+            x_251_phi = true;
+            break;
+          } else {
+            x_241 = *(x_235);
+            x_224_phi = x_241;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_224 = x_224_phi;
+          x_223_phi = x_224;
+        }
+      }
+      let x_251 : bool = x_251_phi;
+      if (x_251) {
+        break;
+      }
+    }
+  }
+  var x_256_phi : i32;
+  var x_284_phi : bool;
+  switch(0u) {
+    default: {
+      x_256_phi = 0;
+      loop {
+        var x_282 : i32;
+        var x_274 : i32;
+        var x_257 : i32;
+        var x_257_phi : i32;
+        let x_256 : i32 = x_256_phi;
+        x_284_phi = false;
+        if ((x_256 <= 7)) {
+        } else {
+          break;
+        }
+        let x_263 : i32 = tree[x_256].data;
+        if ((6 <= x_263)) {
+          let x_276 : ptr<function, i32> = &(tree[x_256].leftIndex);
+          let x_277 : i32 = *(x_276);
+          if ((x_277 == -1)) {
+            *(x_276) = 7;
+            tree[7] = BST(6, -1, -1);
+            x_284_phi = true;
+            break;
+          } else {
+            x_282 = *(x_276);
+            x_257_phi = x_282;
+            continue;
+          }
+          return;
+        } else {
+          let x_268 : ptr<function, i32> = &(tree[x_256].rightIndex);
+          let x_269 : i32 = *(x_268);
+          if ((x_269 == -1)) {
+            *(x_268) = 7;
+            tree[7] = BST(6, -1, -1);
+            x_284_phi = true;
+            break;
+          } else {
+            x_274 = *(x_268);
+            x_257_phi = x_274;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_257 = x_257_phi;
+          x_256_phi = x_257;
+        }
+      }
+      let x_284 : bool = x_284_phi;
+      if (x_284) {
+        break;
+      }
+    }
+  }
+  var x_289_phi : i32;
+  var x_317_phi : bool;
+  switch(0u) {
+    default: {
+      x_289_phi = 0;
+      loop {
+        var x_315 : i32;
+        var x_307 : i32;
+        var x_290 : i32;
+        var x_290_phi : i32;
+        let x_289 : i32 = x_289_phi;
+        x_317_phi = false;
+        if ((x_289 <= 8)) {
+        } else {
+          break;
+        }
+        let x_296 : i32 = tree[x_289].data;
+        if ((17 <= x_296)) {
+          let x_309 : ptr<function, i32> = &(tree[x_289].leftIndex);
+          let x_310 : i32 = *(x_309);
+          if ((x_310 == -1)) {
+            *(x_309) = 8;
+            tree[8] = BST(17, -1, -1);
+            x_317_phi = true;
+            break;
+          } else {
+            x_315 = *(x_309);
+            x_290_phi = x_315;
+            continue;
+          }
+          return;
+        } else {
+          let x_301 : ptr<function, i32> = &(tree[x_289].rightIndex);
+          let x_302 : i32 = *(x_301);
+          if ((x_302 == -1)) {
+            *(x_301) = 8;
+            tree[8] = BST(17, -1, -1);
+            x_317_phi = true;
+            break;
+          } else {
+            x_307 = *(x_301);
+            x_290_phi = x_307;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_290 = x_290_phi;
+          x_289_phi = x_290;
+        }
+      }
+      let x_317 : bool = x_317_phi;
+      if (x_317) {
+        break;
+      }
+    }
+  }
+  var x_322_phi : i32;
+  var x_350_phi : bool;
+  switch(0u) {
+    default: {
+      x_322_phi = 0;
+      loop {
+        var x_348 : i32;
+        var x_340 : i32;
+        var x_323 : i32;
+        var x_323_phi : i32;
+        let x_322 : i32 = x_322_phi;
+        x_350_phi = false;
+        if ((x_322 <= 9)) {
+        } else {
+          break;
+        }
+        let x_329 : i32 = tree[x_322].data;
+        if ((13 <= x_329)) {
+          let x_342 : ptr<function, i32> = &(tree[x_322].leftIndex);
+          let x_343 : i32 = *(x_342);
+          if ((x_343 == -1)) {
+            *(x_342) = 9;
+            tree[9] = BST(13, -1, -1);
+            x_350_phi = true;
+            break;
+          } else {
+            x_348 = *(x_342);
+            x_323_phi = x_348;
+            continue;
+          }
+          return;
+        } else {
+          let x_334 : ptr<function, i32> = &(tree[x_322].rightIndex);
+          let x_335 : i32 = *(x_334);
+          if ((x_335 == -1)) {
+            *(x_334) = 9;
+            tree[9] = BST(13, -1, -1);
+            x_350_phi = true;
+            break;
+          } else {
+            x_340 = *(x_334);
+            x_323_phi = x_340;
+            continue;
+          }
+          return;
+        }
+        return;
+
+        continuing {
+          x_323 = x_323_phi;
+          x_322_phi = x_323;
+        }
+      }
+      let x_350 : bool = x_350_phi;
+      if (x_350) {
+        break;
+      }
+    }
+  }
+  x_353_phi = 0;
+  x_356_phi = 0;
+  x_358_phi = 0;
+  loop {
+    var x_381 : i32;
+    var x_391 : i32;
+    var x_396 : i32;
+    var x_359 : i32;
+    var x_354_phi : i32;
+    var x_357_phi : i32;
+    let x_353 : i32 = x_353_phi;
+    x_356 = x_356_phi;
+    let x_358 : i32 = x_358_phi;
+    if ((x_358 < 20)) {
+    } else {
+      break;
+    }
+    var x_366_phi : i32;
+    var x_381_phi : i32;
+    var x_382_phi : bool;
+    switch(0u) {
+      default: {
+        x_366_phi = 0;
+        loop {
+          let x_366 : i32 = x_366_phi;
+          x_381_phi = x_353;
+          x_382_phi = false;
+          if ((x_366 != -1)) {
+          } else {
+            break;
+          }
+          let x_373 : BST = tree[x_366];
+          let x_374 : i32 = x_373.data;
+          let x_375 : i32 = x_373.leftIndex;
+          let x_376 : i32 = x_373.rightIndex;
+          if ((x_374 == x_358)) {
+            x_381_phi = x_358;
+            x_382_phi = true;
+            break;
+          }
+
+          continuing {
+            x_366_phi = select(x_375, x_376, (x_358 > x_374));
+          }
+        }
+        x_381 = x_381_phi;
+        let x_382 : bool = x_382_phi;
+        x_354_phi = x_381;
+        if (x_382) {
+          break;
+        }
+        x_354_phi = -1;
+      }
+    }
+    var x_354 : i32;
+    var x_390 : i32;
+    var x_395 : i32;
+    var x_391_phi : i32;
+    var x_396_phi : i32;
+    x_354 = x_354_phi;
+    switch(x_358) {
+      case 2, 5, 6, 7, 8, 9, 12, 13, 15, 17: {
+        x_391_phi = x_356;
+        if ((x_354 == bitcast<i32>(x_358))) {
+          x_390 = bitcast<i32>((x_356 + bitcast<i32>(1)));
+          x_391_phi = x_390;
+        }
+        x_391 = x_391_phi;
+        x_357_phi = x_391;
+      }
+      default: {
+        x_396_phi = x_356;
+        if ((x_354 == bitcast<i32>(-1))) {
+          x_395 = bitcast<i32>((x_356 + bitcast<i32>(1)));
+          x_396_phi = x_395;
+        }
+        x_396 = x_396_phi;
+        x_357_phi = x_396;
+      }
+    }
+    let x_357 : i32 = x_357_phi;
+
+    continuing {
+      x_359 = (x_358 + 1);
+      x_353_phi = x_354;
+      x_356_phi = x_357;
+      x_358_phi = x_359;
+    }
+  }
+  if ((x_356 == bitcast<i32>(20))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/1.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/1.spvasm
new file mode 100644
index 0000000..235ec03
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/1.spvasm
@@ -0,0 +1,1053 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %BST "BST"
+               OpMemberName %BST 0 "data"
+               OpMemberName %BST 1 "leftIndex"
+               OpMemberName %BST 2 "rightIndex"
+               OpName %tree "tree"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+        %BST = OpTypeStruct %int %int %int
+%_ptr_Function_BST = OpTypePointer Function %BST
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+     %int_n1 = OpConstant %int -1
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_BST_uint_10 = OpTypeArray %BST %uint_10
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_0 = OpConstant %uint 0
+      %int_9 = OpConstant %int 9
+      %int_5 = OpConstant %int 5
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_0 = OpConstant %float 0
+     %int_12 = OpConstant %int 12
+     %int_15 = OpConstant %int 15
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+      %int_6 = OpConstant %int 6
+     %int_17 = OpConstant %int 17
+     %int_13 = OpConstant %int 13
+     %int_20 = OpConstant %int 20
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+         %44 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %45 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+      %false = OpConstantFalse %bool
+       %true = OpConstantTrue %bool
+%_ptr_Function__arr_BST_uint_10 = OpTypePointer Function %_arr_BST_uint_10
+         %49 = OpUndef %int
+         %50 = OpConstantComposite %BST %int_9 %int_n1 %int_n1
+         %51 = OpConstantComposite %BST %int_5 %int_n1 %int_n1
+      %int_3 = OpConstant %int 3
+         %53 = OpConstantComposite %BST %int_12 %int_n1 %int_n1
+         %54 = OpConstantComposite %BST %int_15 %int_n1 %int_n1
+      %int_4 = OpConstant %int 4
+         %56 = OpConstantComposite %BST %int_7 %int_n1 %int_n1
+         %57 = OpConstantComposite %BST %int_8 %int_n1 %int_n1
+         %58 = OpConstantComposite %BST %int_2 %int_n1 %int_n1
+         %59 = OpConstantComposite %BST %int_6 %int_n1 %int_n1
+         %60 = OpConstantComposite %BST %int_17 %int_n1 %int_n1
+         %61 = OpConstantComposite %BST %int_13 %int_n1 %int_n1
+       %main = OpFunction %void None %10
+         %62 = OpLabel
+       %tree = OpVariable %_ptr_Function__arr_BST_uint_10 Function
+         %63 = OpAccessChain %_ptr_Function_BST %tree %int_0
+               OpStore %63 %50
+               OpSelectionMerge %64 None
+               OpSwitch %uint_0 %65
+         %65 = OpLabel
+               OpBranch %66
+         %66 = OpLabel
+         %67 = OpPhi %bool %false %65 %68 %69
+         %70 = OpPhi %int %int_0 %65 %71 %69
+         %72 = OpSLessThanEqual %bool %70 %int_1
+               OpLoopMerge %73 %69 None
+               OpBranchConditional %72 %74 %73
+         %74 = OpLabel
+         %75 = OpAccessChain %_ptr_Function_int %tree %70 %int_0
+         %76 = OpLoad %int %75
+         %77 = OpSLessThanEqual %bool %int_5 %76
+               OpSelectionMerge %78 None
+               OpBranchConditional %77 %79 %80
+         %80 = OpLabel
+         %81 = OpAccessChain %_ptr_Function_int %tree %70 %int_2
+         %82 = OpLoad %int %81
+         %83 = OpIEqual %bool %82 %int_n1
+               OpSelectionMerge %84 None
+               OpBranchConditional %83 %85 %86
+         %86 = OpLabel
+         %87 = OpLoad %int %81
+               OpBranch %69
+         %85 = OpLabel
+               OpStore %81 %int_1
+         %88 = OpAccessChain %_ptr_Function_BST %tree %int_1
+               OpStore %88 %51
+               OpBranch %73
+         %84 = OpLabel
+               OpUnreachable
+         %79 = OpLabel
+         %89 = OpAccessChain %_ptr_Function_int %tree %70 %int_1
+         %90 = OpLoad %int %89
+         %91 = OpIEqual %bool %90 %int_n1
+               OpSelectionMerge %92 None
+               OpBranchConditional %91 %93 %94
+         %94 = OpLabel
+         %95 = OpLoad %int %89
+               OpBranch %69
+         %93 = OpLabel
+         %96 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %97 = OpLoad %float %96
+         %98 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %99 = OpLoad %float %98
+        %100 = OpFOrdLessThan %bool %97 %99
+               OpSelectionMerge %101 None
+               OpBranchConditional %100 %102 %101
+        %102 = OpLabel
+               OpBranch %103
+        %103 = OpLabel
+               OpLoopMerge %104 %105 None
+               OpBranch %106
+        %106 = OpLabel
+               OpKill
+        %105 = OpLabel
+               OpBranch %103
+        %104 = OpLabel
+               OpUnreachable
+        %101 = OpLabel
+               OpStore %89 %int_1
+        %107 = OpAccessChain %_ptr_Function_BST %tree %int_1
+               OpStore %107 %51
+               OpBranch %108
+        %108 = OpLabel
+        %109 = OpConvertFToS %int %97
+        %110 = OpSLessThan %bool %int_0 %109
+               OpLoopMerge %111 %112 None
+               OpBranchConditional %110 %113 %111
+        %113 = OpLabel
+               OpBranch %111
+        %112 = OpLabel
+               OpBranch %108
+        %111 = OpLabel
+        %114 = OpPhi %bool %67 %108 %true %113
+               OpSelectionMerge %115 None
+               OpBranchConditional %114 %73 %115
+        %115 = OpLabel
+               OpBranch %92
+         %92 = OpLabel
+               OpBranch %78
+         %78 = OpLabel
+               OpBranch %69
+         %69 = OpLabel
+         %68 = OpPhi %bool %67 %94 %67 %86 %114 %78
+         %71 = OpPhi %int %95 %94 %87 %86 %70 %78
+               OpBranch %66
+         %73 = OpLabel
+        %116 = OpPhi %bool %67 %66 %114 %111 %true %85
+               OpSelectionMerge %117 None
+               OpBranchConditional %116 %64 %117
+        %117 = OpLabel
+               OpBranch %64
+         %64 = OpLabel
+               OpBranch %118
+        %118 = OpLabel
+        %119 = OpPhi %int %int_0 %64 %120 %121
+               OpLoopMerge %122 %121 None
+               OpBranch %123
+        %123 = OpLabel
+        %124 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %125 = OpLoad %float %124
+        %126 = OpFOrdLessThan %bool %125 %float_0
+        %127 = OpLogicalNot %bool %126
+               OpSelectionMerge %128 None
+               OpBranchConditional %127 %129 %128
+        %129 = OpLabel
+        %130 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+        %131 = OpLoad %float %130
+        %132 = OpConvertFToS %int %131
+        %133 = OpINotEqual %bool %119 %132
+               OpBranch %128
+        %128 = OpLabel
+        %134 = OpPhi %bool %126 %123 %133 %129
+               OpBranchConditional %134 %135 %122
+        %135 = OpLabel
+               OpSelectionMerge %136 None
+               OpSwitch %uint_0 %137
+        %137 = OpLabel
+               OpBranch %138
+        %138 = OpLabel
+        %139 = OpPhi %bool %false %137 %140 %141
+        %142 = OpPhi %int %int_0 %137 %143 %141
+        %144 = OpSLessThanEqual %bool %142 %int_2
+               OpLoopMerge %145 %141 None
+               OpBranchConditional %144 %146 %145
+        %146 = OpLabel
+        %147 = OpAccessChain %_ptr_Function_int %tree %142 %int_0
+        %148 = OpLoad %int %147
+        %149 = OpSLessThanEqual %bool %int_12 %148
+               OpSelectionMerge %150 None
+               OpBranchConditional %149 %151 %152
+        %152 = OpLabel
+        %153 = OpAccessChain %_ptr_Function_int %tree %142 %int_2
+        %154 = OpLoad %int %153
+        %155 = OpIEqual %bool %154 %int_n1
+               OpSelectionMerge %156 None
+               OpBranchConditional %155 %157 %158
+        %158 = OpLabel
+        %159 = OpLoad %int %153
+               OpBranch %141
+        %157 = OpLabel
+               OpStore %153 %int_2
+        %160 = OpAccessChain %_ptr_Function_BST %tree %int_2
+               OpStore %160 %53
+               OpBranch %145
+        %156 = OpLabel
+               OpUnreachable
+        %151 = OpLabel
+        %161 = OpAccessChain %_ptr_Function_int %tree %142 %int_1
+        %162 = OpLoad %int %161
+        %163 = OpIEqual %bool %162 %int_n1
+               OpSelectionMerge %164 None
+               OpBranchConditional %163 %165 %166
+        %166 = OpLabel
+        %167 = OpLoad %int %161
+               OpBranch %141
+        %165 = OpLabel
+        %168 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+        %169 = OpLoad %float %168
+        %170 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+        %171 = OpLoad %float %170
+        %172 = OpFOrdLessThan %bool %169 %171
+               OpSelectionMerge %173 None
+               OpBranchConditional %172 %174 %173
+        %174 = OpLabel
+               OpBranch %175
+        %175 = OpLabel
+               OpLoopMerge %176 %177 None
+               OpBranch %178
+        %178 = OpLabel
+               OpKill
+        %177 = OpLabel
+               OpBranch %175
+        %176 = OpLabel
+               OpUnreachable
+        %173 = OpLabel
+               OpStore %161 %int_2
+        %179 = OpAccessChain %_ptr_Function_BST %tree %int_2
+               OpStore %179 %53
+               OpBranch %180
+        %180 = OpLabel
+        %181 = OpConvertFToS %int %169
+        %182 = OpSLessThan %bool %int_0 %181
+               OpLoopMerge %183 %184 None
+               OpBranchConditional %182 %185 %183
+        %185 = OpLabel
+               OpBranch %183
+        %184 = OpLabel
+               OpBranch %180
+        %183 = OpLabel
+        %186 = OpPhi %bool %139 %180 %true %185
+               OpSelectionMerge %187 None
+               OpBranchConditional %186 %145 %187
+        %187 = OpLabel
+               OpBranch %164
+        %164 = OpLabel
+               OpBranch %150
+        %150 = OpLabel
+               OpBranch %141
+        %141 = OpLabel
+        %140 = OpPhi %bool %139 %166 %139 %158 %186 %150
+        %143 = OpPhi %int %167 %166 %159 %158 %142 %150
+               OpBranch %138
+        %145 = OpLabel
+        %188 = OpPhi %bool %139 %138 %186 %183 %true %157
+               OpSelectionMerge %189 None
+               OpBranchConditional %188 %136 %189
+        %189 = OpLabel
+               OpBranch %136
+        %136 = OpLabel
+               OpBranch %121
+        %121 = OpLabel
+        %120 = OpIAdd %int %119 %int_1
+               OpBranch %118
+        %122 = OpLabel
+               OpSelectionMerge %190 None
+               OpSwitch %uint_0 %191
+        %191 = OpLabel
+               OpBranch %192
+        %192 = OpLabel
+        %193 = OpPhi %bool %false %191 %194 %195
+        %196 = OpPhi %int %int_0 %191 %197 %195
+        %198 = OpSLessThanEqual %bool %196 %int_3
+               OpLoopMerge %199 %195 None
+               OpBranchConditional %198 %200 %199
+        %200 = OpLabel
+        %201 = OpAccessChain %_ptr_Function_int %tree %196 %int_0
+        %202 = OpLoad %int %201
+        %203 = OpSLessThanEqual %bool %int_15 %202
+               OpSelectionMerge %204 None
+               OpBranchConditional %203 %205 %206
+        %206 = OpLabel
+        %207 = OpAccessChain %_ptr_Function_int %tree %196 %int_2
+        %208 = OpLoad %int %207
+        %209 = OpIEqual %bool %208 %int_n1
+               OpSelectionMerge %210 None
+               OpBranchConditional %209 %211 %212
+        %212 = OpLabel
+        %213 = OpLoad %int %207
+               OpBranch %195
+        %211 = OpLabel
+               OpStore %207 %int_3
+        %214 = OpAccessChain %_ptr_Function_BST %tree %int_3
+               OpStore %214 %54
+               OpBranch %199
+        %210 = OpLabel
+               OpUnreachable
+        %205 = OpLabel
+        %215 = OpAccessChain %_ptr_Function_int %tree %196 %int_1
+        %216 = OpLoad %int %215
+        %217 = OpIEqual %bool %216 %int_n1
+               OpSelectionMerge %218 None
+               OpBranchConditional %217 %219 %220
+        %220 = OpLabel
+        %221 = OpLoad %int %215
+               OpBranch %195
+        %219 = OpLabel
+        %222 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+        %223 = OpLoad %float %222
+        %224 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+        %225 = OpLoad %float %224
+        %226 = OpFOrdLessThan %bool %223 %225
+               OpSelectionMerge %227 None
+               OpBranchConditional %226 %228 %227
+        %228 = OpLabel
+               OpBranch %229
+        %229 = OpLabel
+               OpLoopMerge %230 %231 None
+               OpBranch %232
+        %232 = OpLabel
+               OpKill
+        %231 = OpLabel
+               OpBranch %229
+        %230 = OpLabel
+               OpUnreachable
+        %227 = OpLabel
+               OpStore %215 %int_3
+        %233 = OpAccessChain %_ptr_Function_BST %tree %int_3
+               OpStore %233 %54
+               OpBranch %234
+        %234 = OpLabel
+        %235 = OpConvertFToS %int %223
+        %236 = OpSLessThan %bool %int_0 %235
+               OpLoopMerge %237 %238 None
+               OpBranchConditional %236 %239 %237
+        %239 = OpLabel
+               OpBranch %237
+        %238 = OpLabel
+               OpBranch %234
+        %237 = OpLabel
+        %240 = OpPhi %bool %193 %234 %true %239
+               OpSelectionMerge %241 None
+               OpBranchConditional %240 %199 %241
+        %241 = OpLabel
+               OpBranch %218
+        %218 = OpLabel
+               OpBranch %204
+        %204 = OpLabel
+               OpBranch %195
+        %195 = OpLabel
+        %194 = OpPhi %bool %193 %220 %193 %212 %240 %204
+        %197 = OpPhi %int %221 %220 %213 %212 %196 %204
+               OpBranch %192
+        %199 = OpLabel
+        %242 = OpPhi %bool %193 %192 %240 %237 %true %211
+               OpSelectionMerge %243 None
+               OpBranchConditional %242 %190 %243
+        %243 = OpLabel
+               OpBranch %190
+        %190 = OpLabel
+               OpSelectionMerge %244 None
+               OpSwitch %uint_0 %245
+        %245 = OpLabel
+               OpBranch %246
+        %246 = OpLabel
+        %247 = OpPhi %bool %false %245 %248 %249
+        %250 = OpPhi %int %int_0 %245 %251 %249
+        %252 = OpSLessThanEqual %bool %250 %int_4
+               OpLoopMerge %253 %249 None
+               OpBranchConditional %252 %254 %253
+        %254 = OpLabel
+        %255 = OpAccessChain %_ptr_Function_int %tree %250 %int_0
+        %256 = OpLoad %int %255
+        %257 = OpSLessThanEqual %bool %int_7 %256
+               OpSelectionMerge %258 None
+               OpBranchConditional %257 %259 %260
+        %260 = OpLabel
+        %261 = OpAccessChain %_ptr_Function_int %tree %250 %int_2
+        %262 = OpLoad %int %261
+        %263 = OpIEqual %bool %262 %int_n1
+               OpSelectionMerge %264 None
+               OpBranchConditional %263 %265 %266
+        %266 = OpLabel
+        %267 = OpLoad %int %261
+               OpBranch %249
+        %265 = OpLabel
+               OpStore %261 %int_4
+        %268 = OpAccessChain %_ptr_Function_BST %tree %int_4
+               OpStore %268 %56
+               OpBranch %253
+        %264 = OpLabel
+               OpUnreachable
+        %259 = OpLabel
+        %269 = OpAccessChain %_ptr_Function_int %tree %250 %int_1
+        %270 = OpLoad %int %269
+        %271 = OpIEqual %bool %270 %int_n1
+               OpSelectionMerge %272 None
+               OpBranchConditional %271 %273 %274
+        %274 = OpLabel
+        %275 = OpLoad %int %269
+               OpBranch %249
+        %273 = OpLabel
+        %276 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+        %277 = OpLoad %float %276
+        %278 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+        %279 = OpLoad %float %278
+        %280 = OpFOrdLessThan %bool %277 %279
+               OpSelectionMerge %281 None
+               OpBranchConditional %280 %282 %281
+        %282 = OpLabel
+               OpBranch %283
+        %283 = OpLabel
+               OpLoopMerge %284 %285 None
+               OpBranch %286
+        %286 = OpLabel
+               OpKill
+        %285 = OpLabel
+               OpBranch %283
+        %284 = OpLabel
+               OpUnreachable
+        %281 = OpLabel
+               OpStore %269 %int_4
+        %287 = OpAccessChain %_ptr_Function_BST %tree %int_4
+               OpStore %287 %56
+               OpBranch %288
+        %288 = OpLabel
+        %289 = OpConvertFToS %int %277
+        %290 = OpSLessThan %bool %int_0 %289
+               OpLoopMerge %291 %292 None
+               OpBranchConditional %290 %293 %291
+        %293 = OpLabel
+               OpBranch %291
+        %292 = OpLabel
+               OpBranch %288
+        %291 = OpLabel
+        %294 = OpPhi %bool %247 %288 %true %293
+               OpSelectionMerge %295 None
+               OpBranchConditional %294 %253 %295
+        %295 = OpLabel
+               OpBranch %272
+        %272 = OpLabel
+               OpBranch %258
+        %258 = OpLabel
+               OpBranch %249
+        %249 = OpLabel
+        %248 = OpPhi %bool %247 %274 %247 %266 %294 %258
+        %251 = OpPhi %int %275 %274 %267 %266 %250 %258
+               OpBranch %246
+        %253 = OpLabel
+        %296 = OpPhi %bool %247 %246 %294 %291 %true %265
+               OpSelectionMerge %297 None
+               OpBranchConditional %296 %244 %297
+        %297 = OpLabel
+               OpBranch %244
+        %244 = OpLabel
+               OpSelectionMerge %298 None
+               OpSwitch %uint_0 %299
+        %299 = OpLabel
+               OpBranch %300
+        %300 = OpLabel
+        %301 = OpPhi %bool %false %299 %302 %303
+        %304 = OpPhi %int %int_0 %299 %305 %303
+        %306 = OpSLessThanEqual %bool %304 %int_5
+               OpLoopMerge %307 %303 None
+               OpBranchConditional %306 %308 %307
+        %308 = OpLabel
+        %309 = OpAccessChain %_ptr_Function_int %tree %304 %int_0
+        %310 = OpLoad %int %309
+        %311 = OpSLessThanEqual %bool %int_8 %310
+               OpSelectionMerge %312 None
+               OpBranchConditional %311 %313 %314
+        %314 = OpLabel
+        %315 = OpAccessChain %_ptr_Function_int %tree %304 %int_2
+        %316 = OpLoad %int %315
+        %317 = OpIEqual %bool %316 %int_n1
+               OpSelectionMerge %318 None
+               OpBranchConditional %317 %319 %320
+        %320 = OpLabel
+        %321 = OpLoad %int %315
+               OpBranch %303
+        %319 = OpLabel
+               OpStore %315 %int_5
+        %322 = OpAccessChain %_ptr_Function_BST %tree %int_5
+               OpStore %322 %57
+               OpBranch %307
+        %318 = OpLabel
+               OpUnreachable
+        %313 = OpLabel
+        %323 = OpAccessChain %_ptr_Function_int %tree %304 %int_1
+        %324 = OpLoad %int %323
+        %325 = OpIEqual %bool %324 %int_n1
+               OpSelectionMerge %326 None
+               OpBranchConditional %325 %327 %328
+        %328 = OpLabel
+        %329 = OpLoad %int %323
+               OpBranch %303
+        %327 = OpLabel
+        %330 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+        %331 = OpLoad %float %330
+        %332 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+        %333 = OpLoad %float %332
+        %334 = OpFOrdLessThan %bool %331 %333
+               OpSelectionMerge %335 None
+               OpBranchConditional %334 %336 %335
+        %336 = OpLabel
+               OpBranch %337
+        %337 = OpLabel
+               OpLoopMerge %338 %339 None
+               OpBranch %340
+        %340 = OpLabel
+               OpKill
+        %339 = OpLabel
+               OpBranch %337
+        %338 = OpLabel
+               OpUnreachable
+        %335 = OpLabel
+               OpStore %323 %int_5
+        %341 = OpAccessChain %_ptr_Function_BST %tree %int_5
+               OpStore %341 %57
+               OpBranch %342
+        %342 = OpLabel
+        %343 = OpConvertFToS %int %331
+        %344 = OpSLessThan %bool %int_0 %343
+               OpLoopMerge %345 %346 None
+               OpBranchConditional %344 %347 %345
+        %347 = OpLabel
+               OpBranch %345
+        %346 = OpLabel
+               OpBranch %342
+        %345 = OpLabel
+        %348 = OpPhi %bool %301 %342 %true %347
+               OpSelectionMerge %349 None
+               OpBranchConditional %348 %307 %349
+        %349 = OpLabel
+               OpBranch %326
+        %326 = OpLabel
+               OpBranch %312
+        %312 = OpLabel
+               OpBranch %303
+        %303 = OpLabel
+        %302 = OpPhi %bool %301 %328 %301 %320 %348 %312
+        %305 = OpPhi %int %329 %328 %321 %320 %304 %312
+               OpBranch %300
+        %307 = OpLabel
+        %350 = OpPhi %bool %301 %300 %348 %345 %true %319
+               OpSelectionMerge %351 None
+               OpBranchConditional %350 %298 %351
+        %351 = OpLabel
+               OpBranch %298
+        %298 = OpLabel
+               OpSelectionMerge %352 None
+               OpSwitch %uint_0 %353
+        %353 = OpLabel
+               OpBranch %354
+        %354 = OpLabel
+        %355 = OpPhi %bool %false %353 %356 %357
+        %358 = OpPhi %int %int_0 %353 %359 %357
+        %360 = OpSLessThanEqual %bool %358 %int_6
+               OpLoopMerge %361 %357 None
+               OpBranchConditional %360 %362 %361
+        %362 = OpLabel
+        %363 = OpAccessChain %_ptr_Function_int %tree %358 %int_0
+        %364 = OpLoad %int %363
+        %365 = OpSLessThanEqual %bool %int_2 %364
+               OpSelectionMerge %366 None
+               OpBranchConditional %365 %367 %368
+        %368 = OpLabel
+        %369 = OpAccessChain %_ptr_Function_int %tree %358 %int_2
+        %370 = OpLoad %int %369
+        %371 = OpIEqual %bool %370 %int_n1
+               OpSelectionMerge %372 None
+               OpBranchConditional %371 %373 %374
+        %374 = OpLabel
+        %375 = OpLoad %int %369
+               OpBranch %357
+        %373 = OpLabel
+               OpStore %369 %int_6
+        %376 = OpAccessChain %_ptr_Function_BST %tree %int_6
+               OpStore %376 %58
+               OpBranch %361
+        %372 = OpLabel
+               OpUnreachable
+        %367 = OpLabel
+        %377 = OpAccessChain %_ptr_Function_int %tree %358 %int_1
+        %378 = OpLoad %int %377
+        %379 = OpIEqual %bool %378 %int_n1
+               OpSelectionMerge %380 None
+               OpBranchConditional %379 %381 %382
+        %382 = OpLabel
+        %383 = OpLoad %int %377
+               OpBranch %357
+        %381 = OpLabel
+        %384 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+        %385 = OpLoad %float %384
+        %386 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+        %387 = OpLoad %float %386
+        %388 = OpFOrdLessThan %bool %385 %387
+               OpSelectionMerge %389 None
+               OpBranchConditional %388 %390 %389
+        %390 = OpLabel
+               OpBranch %391
+        %391 = OpLabel
+               OpLoopMerge %392 %393 None
+               OpBranch %394
+        %394 = OpLabel
+               OpKill
+        %393 = OpLabel
+               OpBranch %391
+        %392 = OpLabel
+               OpUnreachable
+        %389 = OpLabel
+               OpStore %377 %int_6
+        %395 = OpAccessChain %_ptr_Function_BST %tree %int_6
+               OpStore %395 %58
+               OpBranch %396
+        %396 = OpLabel
+        %397 = OpConvertFToS %int %385
+        %398 = OpSLessThan %bool %int_0 %397
+               OpLoopMerge %399 %400 None
+               OpBranchConditional %398 %401 %399
+        %401 = OpLabel
+               OpBranch %399
+        %400 = OpLabel
+               OpBranch %396
+        %399 = OpLabel
+        %402 = OpPhi %bool %355 %396 %true %401
+               OpSelectionMerge %403 None
+               OpBranchConditional %402 %361 %403
+        %403 = OpLabel
+               OpBranch %380
+        %380 = OpLabel
+               OpBranch %366
+        %366 = OpLabel
+               OpBranch %357
+        %357 = OpLabel
+        %356 = OpPhi %bool %355 %382 %355 %374 %402 %366
+        %359 = OpPhi %int %383 %382 %375 %374 %358 %366
+               OpBranch %354
+        %361 = OpLabel
+        %404 = OpPhi %bool %355 %354 %402 %399 %true %373
+               OpSelectionMerge %405 None
+               OpBranchConditional %404 %352 %405
+        %405 = OpLabel
+               OpBranch %352
+        %352 = OpLabel
+               OpSelectionMerge %406 None
+               OpSwitch %uint_0 %407
+        %407 = OpLabel
+               OpBranch %408
+        %408 = OpLabel
+        %409 = OpPhi %bool %false %407 %410 %411
+        %412 = OpPhi %int %int_0 %407 %413 %411
+        %414 = OpSLessThanEqual %bool %412 %int_7
+               OpLoopMerge %415 %411 None
+               OpBranchConditional %414 %416 %415
+        %416 = OpLabel
+        %417 = OpAccessChain %_ptr_Function_int %tree %412 %int_0
+        %418 = OpLoad %int %417
+        %419 = OpSLessThanEqual %bool %int_6 %418
+               OpSelectionMerge %420 None
+               OpBranchConditional %419 %421 %422
+        %422 = OpLabel
+        %423 = OpAccessChain %_ptr_Function_int %tree %412 %int_2
+        %424 = OpLoad %int %423
+        %425 = OpIEqual %bool %424 %int_n1
+               OpSelectionMerge %426 None
+               OpBranchConditional %425 %427 %428
+        %428 = OpLabel
+        %429 = OpLoad %int %423
+               OpBranch %411
+        %427 = OpLabel
+               OpStore %423 %int_7
+        %430 = OpAccessChain %_ptr_Function_BST %tree %int_7
+               OpStore %430 %59
+               OpBranch %415
+        %426 = OpLabel
+               OpUnreachable
+        %421 = OpLabel
+        %431 = OpAccessChain %_ptr_Function_int %tree %412 %int_1
+        %432 = OpLoad %int %431
+        %433 = OpIEqual %bool %432 %int_n1
+               OpSelectionMerge %434 None
+               OpBranchConditional %433 %435 %436
+        %436 = OpLabel
+        %437 = OpLoad %int %431
+               OpBranch %411
+        %435 = OpLabel
+        %438 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+        %439 = OpLoad %float %438
+        %440 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+        %441 = OpLoad %float %440
+        %442 = OpFOrdLessThan %bool %439 %441
+               OpSelectionMerge %443 None
+               OpBranchConditional %442 %444 %443
+        %444 = OpLabel
+               OpBranch %445
+        %445 = OpLabel
+               OpLoopMerge %446 %447 None
+               OpBranch %448
+        %448 = OpLabel
+               OpKill
+        %447 = OpLabel
+               OpBranch %445
+        %446 = OpLabel
+               OpUnreachable
+        %443 = OpLabel
+               OpStore %431 %int_7
+        %449 = OpAccessChain %_ptr_Function_BST %tree %int_7
+               OpStore %449 %59
+               OpBranch %450
+        %450 = OpLabel
+        %451 = OpConvertFToS %int %439
+        %452 = OpSLessThan %bool %int_0 %451
+               OpLoopMerge %453 %454 None
+               OpBranchConditional %452 %455 %453
+        %455 = OpLabel
+               OpBranch %453
+        %454 = OpLabel
+               OpBranch %450
+        %453 = OpLabel
+        %456 = OpPhi %bool %409 %450 %true %455
+               OpSelectionMerge %457 None
+               OpBranchConditional %456 %415 %457
+        %457 = OpLabel
+               OpBranch %434
+        %434 = OpLabel
+               OpBranch %420
+        %420 = OpLabel
+               OpBranch %411
+        %411 = OpLabel
+        %410 = OpPhi %bool %409 %436 %409 %428 %456 %420
+        %413 = OpPhi %int %437 %436 %429 %428 %412 %420
+               OpBranch %408
+        %415 = OpLabel
+        %458 = OpPhi %bool %409 %408 %456 %453 %true %427
+               OpSelectionMerge %459 None
+               OpBranchConditional %458 %406 %459
+        %459 = OpLabel
+               OpBranch %406
+        %406 = OpLabel
+               OpSelectionMerge %460 None
+               OpSwitch %uint_0 %461
+        %461 = OpLabel
+               OpBranch %462
+        %462 = OpLabel
+        %463 = OpPhi %bool %false %461 %464 %465
+        %466 = OpPhi %int %int_0 %461 %467 %465
+        %468 = OpSLessThanEqual %bool %466 %int_8
+               OpLoopMerge %469 %465 None
+               OpBranchConditional %468 %470 %469
+        %470 = OpLabel
+        %471 = OpAccessChain %_ptr_Function_int %tree %466 %int_0
+        %472 = OpLoad %int %471
+        %473 = OpSLessThanEqual %bool %int_17 %472
+               OpSelectionMerge %474 None
+               OpBranchConditional %473 %475 %476
+        %476 = OpLabel
+        %477 = OpAccessChain %_ptr_Function_int %tree %466 %int_2
+        %478 = OpLoad %int %477
+        %479 = OpIEqual %bool %478 %int_n1
+               OpSelectionMerge %480 None
+               OpBranchConditional %479 %481 %482
+        %482 = OpLabel
+        %483 = OpLoad %int %477
+               OpBranch %465
+        %481 = OpLabel
+               OpStore %477 %int_8
+        %484 = OpAccessChain %_ptr_Function_BST %tree %int_8
+               OpStore %484 %60
+               OpBranch %469
+        %480 = OpLabel
+               OpUnreachable
+        %475 = OpLabel
+        %485 = OpAccessChain %_ptr_Function_int %tree %466 %int_1
+        %486 = OpLoad %int %485
+        %487 = OpIEqual %bool %486 %int_n1
+               OpSelectionMerge %488 None
+               OpBranchConditional %487 %489 %490
+        %490 = OpLabel
+        %491 = OpLoad %int %485
+               OpBranch %465
+        %489 = OpLabel
+        %492 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+        %493 = OpLoad %float %492
+        %494 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+        %495 = OpLoad %float %494
+        %496 = OpFOrdLessThan %bool %493 %495
+               OpSelectionMerge %497 None
+               OpBranchConditional %496 %498 %497
+        %498 = OpLabel
+               OpBranch %499
+        %499 = OpLabel
+               OpLoopMerge %500 %501 None
+               OpBranch %502
+        %502 = OpLabel
+               OpKill
+        %501 = OpLabel
+               OpBranch %499
+        %500 = OpLabel
+               OpUnreachable
+        %497 = OpLabel
+               OpStore %485 %int_8
+        %503 = OpAccessChain %_ptr_Function_BST %tree %int_8
+               OpStore %503 %60
+               OpBranch %504
+        %504 = OpLabel
+        %505 = OpConvertFToS %int %493
+        %506 = OpSLessThan %bool %int_0 %505
+               OpLoopMerge %507 %508 None
+               OpBranchConditional %506 %509 %507
+        %509 = OpLabel
+               OpBranch %507
+        %508 = OpLabel
+               OpBranch %504
+        %507 = OpLabel
+        %510 = OpPhi %bool %463 %504 %true %509
+               OpSelectionMerge %511 None
+               OpBranchConditional %510 %469 %511
+        %511 = OpLabel
+               OpBranch %488
+        %488 = OpLabel
+               OpBranch %474
+        %474 = OpLabel
+               OpBranch %465
+        %465 = OpLabel
+        %464 = OpPhi %bool %463 %490 %463 %482 %510 %474
+        %467 = OpPhi %int %491 %490 %483 %482 %466 %474
+               OpBranch %462
+        %469 = OpLabel
+        %512 = OpPhi %bool %463 %462 %510 %507 %true %481
+               OpSelectionMerge %513 None
+               OpBranchConditional %512 %460 %513
+        %513 = OpLabel
+               OpBranch %460
+        %460 = OpLabel
+               OpSelectionMerge %514 None
+               OpSwitch %uint_0 %515
+        %515 = OpLabel
+               OpBranch %516
+        %516 = OpLabel
+        %517 = OpPhi %bool %false %515 %518 %519
+        %520 = OpPhi %int %int_0 %515 %521 %519
+        %522 = OpSLessThanEqual %bool %520 %int_9
+               OpLoopMerge %523 %519 None
+               OpBranchConditional %522 %524 %523
+        %524 = OpLabel
+        %525 = OpAccessChain %_ptr_Function_int %tree %520 %int_0
+        %526 = OpLoad %int %525
+        %527 = OpSLessThanEqual %bool %int_13 %526
+               OpSelectionMerge %528 None
+               OpBranchConditional %527 %529 %530
+        %530 = OpLabel
+        %531 = OpAccessChain %_ptr_Function_int %tree %520 %int_2
+        %532 = OpLoad %int %531
+        %533 = OpIEqual %bool %532 %int_n1
+               OpSelectionMerge %534 None
+               OpBranchConditional %533 %535 %536
+        %536 = OpLabel
+        %537 = OpLoad %int %531
+               OpBranch %519
+        %535 = OpLabel
+               OpStore %531 %int_9
+        %538 = OpAccessChain %_ptr_Function_BST %tree %int_9
+               OpStore %538 %61
+               OpBranch %523
+        %534 = OpLabel
+               OpUnreachable
+        %529 = OpLabel
+        %539 = OpAccessChain %_ptr_Function_int %tree %520 %int_1
+        %540 = OpLoad %int %539
+        %541 = OpIEqual %bool %540 %int_n1
+               OpSelectionMerge %542 None
+               OpBranchConditional %541 %543 %544
+        %544 = OpLabel
+        %545 = OpLoad %int %539
+               OpBranch %519
+        %543 = OpLabel
+        %546 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+        %547 = OpLoad %float %546
+        %548 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+        %549 = OpLoad %float %548
+        %550 = OpFOrdLessThan %bool %547 %549
+               OpSelectionMerge %551 None
+               OpBranchConditional %550 %552 %551
+        %552 = OpLabel
+               OpBranch %553
+        %553 = OpLabel
+               OpLoopMerge %554 %555 None
+               OpBranch %556
+        %556 = OpLabel
+               OpKill
+        %555 = OpLabel
+               OpBranch %553
+        %554 = OpLabel
+               OpUnreachable
+        %551 = OpLabel
+               OpStore %539 %int_9
+        %557 = OpAccessChain %_ptr_Function_BST %tree %int_9
+               OpStore %557 %61
+               OpBranch %558
+        %558 = OpLabel
+        %559 = OpConvertFToS %int %547
+        %560 = OpSLessThan %bool %int_0 %559
+               OpLoopMerge %561 %562 None
+               OpBranchConditional %560 %563 %561
+        %563 = OpLabel
+               OpBranch %561
+        %562 = OpLabel
+               OpBranch %558
+        %561 = OpLabel
+        %564 = OpPhi %bool %517 %558 %true %563
+               OpSelectionMerge %565 None
+               OpBranchConditional %564 %523 %565
+        %565 = OpLabel
+               OpBranch %542
+        %542 = OpLabel
+               OpBranch %528
+        %528 = OpLabel
+               OpBranch %519
+        %519 = OpLabel
+        %518 = OpPhi %bool %517 %544 %517 %536 %564 %528
+        %521 = OpPhi %int %545 %544 %537 %536 %520 %528
+               OpBranch %516
+        %523 = OpLabel
+        %566 = OpPhi %bool %517 %516 %564 %561 %true %535
+               OpSelectionMerge %567 None
+               OpBranchConditional %566 %514 %567
+        %567 = OpLabel
+               OpBranch %514
+        %514 = OpLabel
+               OpBranch %568
+        %568 = OpLabel
+        %569 = OpPhi %int %49 %514 %570 %571
+        %572 = OpPhi %int %int_0 %514 %573 %571
+        %574 = OpPhi %int %int_0 %514 %575 %571
+        %576 = OpSLessThan %bool %574 %int_20
+               OpLoopMerge %577 %571 None
+               OpBranchConditional %576 %578 %577
+        %578 = OpLabel
+               OpSelectionMerge %579 None
+               OpSwitch %uint_0 %580
+        %580 = OpLabel
+               OpBranch %581
+        %581 = OpLabel
+        %582 = OpPhi %int %int_0 %580 %583 %584
+        %585 = OpINotEqual %bool %582 %int_n1
+               OpLoopMerge %586 %584 None
+               OpBranchConditional %585 %587 %586
+        %587 = OpLabel
+        %588 = OpAccessChain %_ptr_Function_BST %tree %582
+        %589 = OpLoad %BST %588
+        %590 = OpCompositeExtract %int %589 0
+        %591 = OpCompositeExtract %int %589 1
+        %592 = OpCompositeExtract %int %589 2
+        %593 = OpIEqual %bool %590 %574
+               OpSelectionMerge %594 None
+               OpBranchConditional %593 %595 %594
+        %595 = OpLabel
+               OpBranch %586
+        %594 = OpLabel
+        %596 = OpSGreaterThan %bool %574 %590
+        %583 = OpSelect %int %596 %592 %591
+               OpBranch %584
+        %584 = OpLabel
+               OpBranch %581
+        %586 = OpLabel
+        %597 = OpPhi %int %569 %581 %574 %595
+        %598 = OpPhi %bool %false %581 %true %595
+               OpSelectionMerge %599 None
+               OpBranchConditional %598 %579 %599
+        %599 = OpLabel
+               OpBranch %579
+        %579 = OpLabel
+        %570 = OpPhi %int %597 %586 %int_n1 %599
+               OpSelectionMerge %600 None
+               OpSwitch %574 %601 9 %602 5 %602 12 %602 15 %602 7 %602 8 %602 2 %602 6 %602 17 %602 13 %602
+        %602 = OpLabel
+        %603 = OpIEqual %bool %570 %574
+               OpSelectionMerge %604 None
+               OpBranchConditional %603 %605 %604
+        %605 = OpLabel
+        %606 = OpIAdd %int %572 %int_1
+               OpBranch %604
+        %604 = OpLabel
+        %607 = OpPhi %int %572 %602 %606 %605
+               OpBranch %600
+        %601 = OpLabel
+        %608 = OpIEqual %bool %570 %int_n1
+               OpSelectionMerge %609 None
+               OpBranchConditional %608 %610 %609
+        %610 = OpLabel
+        %611 = OpIAdd %int %572 %int_1
+               OpBranch %609
+        %609 = OpLabel
+        %612 = OpPhi %int %572 %601 %611 %610
+               OpBranch %600
+        %600 = OpLabel
+        %573 = OpPhi %int %612 %609 %607 %604
+               OpBranch %571
+        %571 = OpLabel
+        %575 = OpIAdd %int %574 %int_1
+               OpBranch %568
+        %577 = OpLabel
+        %613 = OpIEqual %bool %572 %int_20
+               OpSelectionMerge %614 None
+               OpBranchConditional %613 %615 %616
+        %616 = OpLabel
+               OpStore %_GLF_color %45
+               OpBranch %614
+        %615 = OpLabel
+               OpStore %_GLF_color %44
+               OpBranch %614
+        %614 = OpLabel
+               OpReturn
+               OpFunctionEnd
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
new file mode 100755
index 0000000..5e07bc7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/1.spvasm.expected.hlsl
@@ -0,0 +1,1151 @@
+SKIP: FAILED
+
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  BST tree[10] = (BST[10])0;
+  bool x_67 = false;
+  bool x_114 = false;
+  int x_572 = 0;
+  bool x_67_phi = false;
+  int x_70_phi = 0;
+  bool x_116_phi = false;
+  int x_119_phi = 0;
+  int x_569_phi = 0;
+  int x_572_phi = 0;
+  int x_574_phi = 0;
+  const BST tint_symbol_5 = {9, -1, -1};
+  tree[0] = tint_symbol_5;
+  switch(0u) {
+    default: {
+      x_67_phi = false;
+      x_70_phi = 0;
+      while (true) {
+        int x_95 = 0;
+        int x_87 = 0;
+        bool x_68 = false;
+        int x_71 = 0;
+        bool x_68_phi = false;
+        int x_71_phi = 0;
+        x_67 = x_67_phi;
+        const int x_70 = x_70_phi;
+        x_116_phi = x_67;
+        if ((x_70 <= 1)) {
+        } else {
+          break;
+        }
+        const int x_76 = tree[x_70].data;
+        if ((5 <= x_76)) {
+          bool x_114_phi = false;
+          const int x_89_save = x_70;
+          const int x_90 = tree[x_89_save].leftIndex;
+          if ((x_90 == -1)) {
+            const float x_97 = asfloat(x_8[0].y);
+            const float x_99 = asfloat(x_8[0].x);
+            if ((x_97 < x_99)) {
+              while (true) {
+                discard;
+              }
+              return;
+            }
+            tree[x_89_save].leftIndex = 1;
+            const BST tint_symbol_6 = {5, -1, -1};
+            tree[1] = tint_symbol_6;
+            while (true) {
+              x_114_phi = x_67;
+              if ((0 < int(x_97))) {
+              } else {
+                break;
+              }
+              x_114_phi = true;
+              break;
+            }
+            x_114 = x_114_phi;
+            x_116_phi = x_114;
+            if (x_114) {
+              break;
+            }
+          } else {
+            x_95 = tree[x_89_save].leftIndex;
+            x_68_phi = x_67;
+            x_71_phi = x_95;
+            {
+              x_68 = x_68_phi;
+              x_71 = x_71_phi;
+              x_67_phi = x_68;
+              x_70_phi = x_71;
+            }
+            continue;
+          }
+        } else {
+          const int x_81_save = x_70;
+          const int x_82 = tree[x_81_save].rightIndex;
+          if ((x_82 == -1)) {
+            tree[x_81_save].rightIndex = 1;
+            const BST tint_symbol_7 = {5, -1, -1};
+            tree[1] = tint_symbol_7;
+            x_116_phi = true;
+            break;
+          } else {
+            x_87 = tree[x_81_save].rightIndex;
+            x_68_phi = x_67;
+            x_71_phi = x_87;
+            {
+              x_68 = x_68_phi;
+              x_71 = x_71_phi;
+              x_67_phi = x_68;
+              x_70_phi = x_71;
+            }
+            continue;
+          }
+          return;
+        }
+        x_68_phi = x_114;
+        x_71_phi = x_70;
+        {
+          x_68 = x_68_phi;
+          x_71 = x_71_phi;
+          x_67_phi = x_68;
+          x_70_phi = x_71;
+        }
+      }
+      if (x_116_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  x_119_phi = 0;
+  while (true) {
+    bool x_133 = false;
+    int x_120 = 0;
+    bool x_134_phi = false;
+    const int x_119 = x_119_phi;
+    const float x_125 = gl_FragCoord.y;
+    const bool x_126 = (x_125 < 0.0f);
+    x_134_phi = x_126;
+    if (!(x_126)) {
+      const float x_131 = asfloat(x_8[0].y);
+      x_133 = (x_119 != int(x_131));
+      x_134_phi = x_133;
+    }
+    if (x_134_phi) {
+    } else {
+      break;
+    }
+    bool x_139 = false;
+    bool x_186 = false;
+    bool x_139_phi = false;
+    int x_142_phi = 0;
+    bool x_188_phi = false;
+    switch(0u) {
+      default: {
+        x_139_phi = false;
+        x_142_phi = 0;
+        while (true) {
+          int x_167 = 0;
+          int x_159 = 0;
+          bool x_140 = false;
+          int x_143 = 0;
+          bool x_140_phi = false;
+          int x_143_phi = 0;
+          x_139 = x_139_phi;
+          const int x_142 = x_142_phi;
+          x_188_phi = x_139;
+          if ((x_142 <= 2)) {
+          } else {
+            break;
+          }
+          const int x_148 = tree[x_142].data;
+          if ((12 <= x_148)) {
+            bool x_186_phi = false;
+            const int x_161_save = x_142;
+            const int x_162 = tree[x_161_save].leftIndex;
+            if ((x_162 == -1)) {
+              const float x_169 = asfloat(x_8[0].y);
+              const float x_171 = asfloat(x_8[0].x);
+              if ((x_169 < x_171)) {
+                while (true) {
+                  discard;
+                }
+                return;
+              }
+              tree[x_161_save].leftIndex = 2;
+              const BST tint_symbol_8 = {12, -1, -1};
+              tree[2] = tint_symbol_8;
+              while (true) {
+                x_186_phi = x_139;
+                if ((0 < int(x_169))) {
+                } else {
+                  break;
+                }
+                x_186_phi = true;
+                break;
+              }
+              x_186 = x_186_phi;
+              x_188_phi = x_186;
+              if (x_186) {
+                break;
+              }
+            } else {
+              x_167 = tree[x_161_save].leftIndex;
+              x_140_phi = x_139;
+              x_143_phi = x_167;
+              {
+                x_140 = x_140_phi;
+                x_143 = x_143_phi;
+                x_139_phi = x_140;
+                x_142_phi = x_143;
+              }
+              continue;
+            }
+          } else {
+            const int x_153_save = x_142;
+            const int x_154 = tree[x_153_save].rightIndex;
+            if ((x_154 == -1)) {
+              tree[x_153_save].rightIndex = 2;
+              const BST tint_symbol_9 = {12, -1, -1};
+              tree[2] = tint_symbol_9;
+              x_188_phi = true;
+              break;
+            } else {
+              x_159 = tree[x_153_save].rightIndex;
+              x_140_phi = x_139;
+              x_143_phi = x_159;
+              {
+                x_140 = x_140_phi;
+                x_143 = x_143_phi;
+                x_139_phi = x_140;
+                x_142_phi = x_143;
+              }
+              continue;
+            }
+            return;
+          }
+          x_140_phi = x_186;
+          x_143_phi = x_142;
+          {
+            x_140 = x_140_phi;
+            x_143 = x_143_phi;
+            x_139_phi = x_140;
+            x_142_phi = x_143;
+          }
+        }
+        if (x_188_phi) {
+          break;
+        }
+        break;
+      }
+    }
+    {
+      x_120 = (x_119 + 1);
+      x_119_phi = x_120;
+    }
+  }
+  bool x_193 = false;
+  bool x_240 = false;
+  bool x_193_phi = false;
+  int x_196_phi = 0;
+  bool x_242_phi = false;
+  switch(0u) {
+    default: {
+      x_193_phi = false;
+      x_196_phi = 0;
+      while (true) {
+        int x_221 = 0;
+        int x_213 = 0;
+        bool x_194 = false;
+        int x_197 = 0;
+        bool x_194_phi = false;
+        int x_197_phi = 0;
+        x_193 = x_193_phi;
+        const int x_196 = x_196_phi;
+        x_242_phi = x_193;
+        if ((x_196 <= 3)) {
+        } else {
+          break;
+        }
+        const int x_202 = tree[x_196].data;
+        if ((15 <= x_202)) {
+          bool x_240_phi = false;
+          const int x_215_save = x_196;
+          const int x_216 = tree[x_215_save].leftIndex;
+          if ((x_216 == -1)) {
+            const float x_223 = asfloat(x_8[0].y);
+            const float x_225 = asfloat(x_8[0].x);
+            if ((x_223 < x_225)) {
+              while (true) {
+                discard;
+              }
+              return;
+            }
+            tree[x_215_save].leftIndex = 3;
+            const BST tint_symbol_10 = {15, -1, -1};
+            tree[3] = tint_symbol_10;
+            while (true) {
+              x_240_phi = x_193;
+              if ((0 < int(x_223))) {
+              } else {
+                break;
+              }
+              x_240_phi = true;
+              break;
+            }
+            x_240 = x_240_phi;
+            x_242_phi = x_240;
+            if (x_240) {
+              break;
+            }
+          } else {
+            x_221 = tree[x_215_save].leftIndex;
+            x_194_phi = x_193;
+            x_197_phi = x_221;
+            {
+              x_194 = x_194_phi;
+              x_197 = x_197_phi;
+              x_193_phi = x_194;
+              x_196_phi = x_197;
+            }
+            continue;
+          }
+        } else {
+          const int x_207_save = x_196;
+          const int x_208 = tree[x_207_save].rightIndex;
+          if ((x_208 == -1)) {
+            tree[x_207_save].rightIndex = 3;
+            const BST tint_symbol_11 = {15, -1, -1};
+            tree[3] = tint_symbol_11;
+            x_242_phi = true;
+            break;
+          } else {
+            x_213 = tree[x_207_save].rightIndex;
+            x_194_phi = x_193;
+            x_197_phi = x_213;
+            {
+              x_194 = x_194_phi;
+              x_197 = x_197_phi;
+              x_193_phi = x_194;
+              x_196_phi = x_197;
+            }
+            continue;
+          }
+          return;
+        }
+        x_194_phi = x_240;
+        x_197_phi = x_196;
+        {
+          x_194 = x_194_phi;
+          x_197 = x_197_phi;
+          x_193_phi = x_194;
+          x_196_phi = x_197;
+        }
+      }
+      if (x_242_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  bool x_247 = false;
+  bool x_294 = false;
+  bool x_247_phi = false;
+  int x_250_phi = 0;
+  bool x_296_phi = false;
+  switch(0u) {
+    default: {
+      x_247_phi = false;
+      x_250_phi = 0;
+      while (true) {
+        int x_275 = 0;
+        int x_267 = 0;
+        bool x_248 = false;
+        int x_251 = 0;
+        bool x_248_phi = false;
+        int x_251_phi = 0;
+        x_247 = x_247_phi;
+        const int x_250 = x_250_phi;
+        x_296_phi = x_247;
+        if ((x_250 <= 4)) {
+        } else {
+          break;
+        }
+        const int x_256 = tree[x_250].data;
+        if ((7 <= x_256)) {
+          bool x_294_phi = false;
+          const int x_269_save = x_250;
+          const int x_270 = tree[x_269_save].leftIndex;
+          if ((x_270 == -1)) {
+            const float x_277 = asfloat(x_8[0].y);
+            const float x_279 = asfloat(x_8[0].x);
+            if ((x_277 < x_279)) {
+              while (true) {
+                discard;
+              }
+              return;
+            }
+            tree[x_269_save].leftIndex = 4;
+            const BST tint_symbol_12 = {7, -1, -1};
+            tree[4] = tint_symbol_12;
+            while (true) {
+              x_294_phi = x_247;
+              if ((0 < int(x_277))) {
+              } else {
+                break;
+              }
+              x_294_phi = true;
+              break;
+            }
+            x_294 = x_294_phi;
+            x_296_phi = x_294;
+            if (x_294) {
+              break;
+            }
+          } else {
+            x_275 = tree[x_269_save].leftIndex;
+            x_248_phi = x_247;
+            x_251_phi = x_275;
+            {
+              x_248 = x_248_phi;
+              x_251 = x_251_phi;
+              x_247_phi = x_248;
+              x_250_phi = x_251;
+            }
+            continue;
+          }
+        } else {
+          const int x_261_save = x_250;
+          const int x_262 = tree[x_261_save].rightIndex;
+          if ((x_262 == -1)) {
+            tree[x_261_save].rightIndex = 4;
+            const BST tint_symbol_13 = {7, -1, -1};
+            tree[4] = tint_symbol_13;
+            x_296_phi = true;
+            break;
+          } else {
+            x_267 = tree[x_261_save].rightIndex;
+            x_248_phi = x_247;
+            x_251_phi = x_267;
+            {
+              x_248 = x_248_phi;
+              x_251 = x_251_phi;
+              x_247_phi = x_248;
+              x_250_phi = x_251;
+            }
+            continue;
+          }
+          return;
+        }
+        x_248_phi = x_294;
+        x_251_phi = x_250;
+        {
+          x_248 = x_248_phi;
+          x_251 = x_251_phi;
+          x_247_phi = x_248;
+          x_250_phi = x_251;
+        }
+      }
+      if (x_296_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  bool x_301 = false;
+  bool x_348 = false;
+  bool x_301_phi = false;
+  int x_304_phi = 0;
+  bool x_350_phi = false;
+  switch(0u) {
+    default: {
+      x_301_phi = false;
+      x_304_phi = 0;
+      while (true) {
+        int x_329 = 0;
+        int x_321 = 0;
+        bool x_302 = false;
+        int x_305 = 0;
+        bool x_302_phi = false;
+        int x_305_phi = 0;
+        x_301 = x_301_phi;
+        const int x_304 = x_304_phi;
+        x_350_phi = x_301;
+        if ((x_304 <= 5)) {
+        } else {
+          break;
+        }
+        const int x_310 = tree[x_304].data;
+        if ((8 <= x_310)) {
+          bool x_348_phi = false;
+          const int x_323_save = x_304;
+          const int x_324 = tree[x_323_save].leftIndex;
+          if ((x_324 == -1)) {
+            const float x_331 = asfloat(x_8[0].y);
+            const float x_333 = asfloat(x_8[0].x);
+            if ((x_331 < x_333)) {
+              while (true) {
+                discard;
+              }
+              return;
+            }
+            tree[x_323_save].leftIndex = 5;
+            const BST tint_symbol_14 = {8, -1, -1};
+            tree[5] = tint_symbol_14;
+            while (true) {
+              x_348_phi = x_301;
+              if ((0 < int(x_331))) {
+              } else {
+                break;
+              }
+              x_348_phi = true;
+              break;
+            }
+            x_348 = x_348_phi;
+            x_350_phi = x_348;
+            if (x_348) {
+              break;
+            }
+          } else {
+            x_329 = tree[x_323_save].leftIndex;
+            x_302_phi = x_301;
+            x_305_phi = x_329;
+            {
+              x_302 = x_302_phi;
+              x_305 = x_305_phi;
+              x_301_phi = x_302;
+              x_304_phi = x_305;
+            }
+            continue;
+          }
+        } else {
+          const int x_315_save = x_304;
+          const int x_316 = tree[x_315_save].rightIndex;
+          if ((x_316 == -1)) {
+            tree[x_315_save].rightIndex = 5;
+            const BST tint_symbol_15 = {8, -1, -1};
+            tree[5] = tint_symbol_15;
+            x_350_phi = true;
+            break;
+          } else {
+            x_321 = tree[x_315_save].rightIndex;
+            x_302_phi = x_301;
+            x_305_phi = x_321;
+            {
+              x_302 = x_302_phi;
+              x_305 = x_305_phi;
+              x_301_phi = x_302;
+              x_304_phi = x_305;
+            }
+            continue;
+          }
+          return;
+        }
+        x_302_phi = x_348;
+        x_305_phi = x_304;
+        {
+          x_302 = x_302_phi;
+          x_305 = x_305_phi;
+          x_301_phi = x_302;
+          x_304_phi = x_305;
+        }
+      }
+      if (x_350_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  bool x_355 = false;
+  bool x_402 = false;
+  bool x_355_phi = false;
+  int x_358_phi = 0;
+  bool x_404_phi = false;
+  switch(0u) {
+    default: {
+      x_355_phi = false;
+      x_358_phi = 0;
+      while (true) {
+        int x_383 = 0;
+        int x_375 = 0;
+        bool x_356 = false;
+        int x_359 = 0;
+        bool x_356_phi = false;
+        int x_359_phi = 0;
+        x_355 = x_355_phi;
+        const int x_358 = x_358_phi;
+        x_404_phi = x_355;
+        if ((x_358 <= 6)) {
+        } else {
+          break;
+        }
+        const int x_364 = tree[x_358].data;
+        if ((2 <= x_364)) {
+          bool x_402_phi = false;
+          const int x_377_save = x_358;
+          const int x_378 = tree[x_377_save].leftIndex;
+          if ((x_378 == -1)) {
+            const float x_385 = asfloat(x_8[0].y);
+            const float x_387 = asfloat(x_8[0].x);
+            if ((x_385 < x_387)) {
+              while (true) {
+                discard;
+              }
+              return;
+            }
+            tree[x_377_save].leftIndex = 6;
+            const BST tint_symbol_16 = {2, -1, -1};
+            tree[6] = tint_symbol_16;
+            while (true) {
+              x_402_phi = x_355;
+              if ((0 < int(x_385))) {
+              } else {
+                break;
+              }
+              x_402_phi = true;
+              break;
+            }
+            x_402 = x_402_phi;
+            x_404_phi = x_402;
+            if (x_402) {
+              break;
+            }
+          } else {
+            x_383 = tree[x_377_save].leftIndex;
+            x_356_phi = x_355;
+            x_359_phi = x_383;
+            {
+              x_356 = x_356_phi;
+              x_359 = x_359_phi;
+              x_355_phi = x_356;
+              x_358_phi = x_359;
+            }
+            continue;
+          }
+        } else {
+          const int x_369_save = x_358;
+          const int x_370 = tree[x_369_save].rightIndex;
+          if ((x_370 == -1)) {
+            tree[x_369_save].rightIndex = 6;
+            const BST tint_symbol_17 = {2, -1, -1};
+            tree[6] = tint_symbol_17;
+            x_404_phi = true;
+            break;
+          } else {
+            x_375 = tree[x_369_save].rightIndex;
+            x_356_phi = x_355;
+            x_359_phi = x_375;
+            {
+              x_356 = x_356_phi;
+              x_359 = x_359_phi;
+              x_355_phi = x_356;
+              x_358_phi = x_359;
+            }
+            continue;
+          }
+          return;
+        }
+        x_356_phi = x_402;
+        x_359_phi = x_358;
+        {
+          x_356 = x_356_phi;
+          x_359 = x_359_phi;
+          x_355_phi = x_356;
+          x_358_phi = x_359;
+        }
+      }
+      if (x_404_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  bool x_409 = false;
+  bool x_456 = false;
+  bool x_409_phi = false;
+  int x_412_phi = 0;
+  bool x_458_phi = false;
+  switch(0u) {
+    default: {
+      x_409_phi = false;
+      x_412_phi = 0;
+      while (true) {
+        int x_437 = 0;
+        int x_429 = 0;
+        bool x_410 = false;
+        int x_413 = 0;
+        bool x_410_phi = false;
+        int x_413_phi = 0;
+        x_409 = x_409_phi;
+        const int x_412 = x_412_phi;
+        x_458_phi = x_409;
+        if ((x_412 <= 7)) {
+        } else {
+          break;
+        }
+        const int x_418 = tree[x_412].data;
+        if ((6 <= x_418)) {
+          bool x_456_phi = false;
+          const int x_431_save = x_412;
+          const int x_432 = tree[x_431_save].leftIndex;
+          if ((x_432 == -1)) {
+            const float x_439 = asfloat(x_8[0].y);
+            const float x_441 = asfloat(x_8[0].x);
+            if ((x_439 < x_441)) {
+              while (true) {
+                discard;
+              }
+              return;
+            }
+            tree[x_431_save].leftIndex = 7;
+            const BST tint_symbol_18 = {6, -1, -1};
+            tree[7] = tint_symbol_18;
+            while (true) {
+              x_456_phi = x_409;
+              if ((0 < int(x_439))) {
+              } else {
+                break;
+              }
+              x_456_phi = true;
+              break;
+            }
+            x_456 = x_456_phi;
+            x_458_phi = x_456;
+            if (x_456) {
+              break;
+            }
+          } else {
+            x_437 = tree[x_431_save].leftIndex;
+            x_410_phi = x_409;
+            x_413_phi = x_437;
+            {
+              x_410 = x_410_phi;
+              x_413 = x_413_phi;
+              x_409_phi = x_410;
+              x_412_phi = x_413;
+            }
+            continue;
+          }
+        } else {
+          const int x_423_save = x_412;
+          const int x_424 = tree[x_423_save].rightIndex;
+          if ((x_424 == -1)) {
+            tree[x_423_save].rightIndex = 7;
+            const BST tint_symbol_19 = {6, -1, -1};
+            tree[7] = tint_symbol_19;
+            x_458_phi = true;
+            break;
+          } else {
+            x_429 = tree[x_423_save].rightIndex;
+            x_410_phi = x_409;
+            x_413_phi = x_429;
+            {
+              x_410 = x_410_phi;
+              x_413 = x_413_phi;
+              x_409_phi = x_410;
+              x_412_phi = x_413;
+            }
+            continue;
+          }
+          return;
+        }
+        x_410_phi = x_456;
+        x_413_phi = x_412;
+        {
+          x_410 = x_410_phi;
+          x_413 = x_413_phi;
+          x_409_phi = x_410;
+          x_412_phi = x_413;
+        }
+      }
+      if (x_458_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  bool x_463 = false;
+  bool x_510 = false;
+  bool x_463_phi = false;
+  int x_466_phi = 0;
+  bool x_512_phi = false;
+  switch(0u) {
+    default: {
+      x_463_phi = false;
+      x_466_phi = 0;
+      while (true) {
+        int x_491 = 0;
+        int x_483 = 0;
+        bool x_464 = false;
+        int x_467 = 0;
+        bool x_464_phi = false;
+        int x_467_phi = 0;
+        x_463 = x_463_phi;
+        const int x_466 = x_466_phi;
+        x_512_phi = x_463;
+        if ((x_466 <= 8)) {
+        } else {
+          break;
+        }
+        const int x_472 = tree[x_466].data;
+        if ((17 <= x_472)) {
+          bool x_510_phi = false;
+          const int x_485_save = x_466;
+          const int x_486 = tree[x_485_save].leftIndex;
+          if ((x_486 == -1)) {
+            const float x_493 = asfloat(x_8[0].y);
+            const float x_495 = asfloat(x_8[0].x);
+            if ((x_493 < x_495)) {
+              while (true) {
+                discard;
+              }
+              return;
+            }
+            tree[x_485_save].leftIndex = 8;
+            const BST tint_symbol_20 = {17, -1, -1};
+            tree[8] = tint_symbol_20;
+            while (true) {
+              x_510_phi = x_463;
+              if ((0 < int(x_493))) {
+              } else {
+                break;
+              }
+              x_510_phi = true;
+              break;
+            }
+            x_510 = x_510_phi;
+            x_512_phi = x_510;
+            if (x_510) {
+              break;
+            }
+          } else {
+            x_491 = tree[x_485_save].leftIndex;
+            x_464_phi = x_463;
+            x_467_phi = x_491;
+            {
+              x_464 = x_464_phi;
+              x_467 = x_467_phi;
+              x_463_phi = x_464;
+              x_466_phi = x_467;
+            }
+            continue;
+          }
+        } else {
+          const int x_477_save = x_466;
+          const int x_478 = tree[x_477_save].rightIndex;
+          if ((x_478 == -1)) {
+            tree[x_477_save].rightIndex = 8;
+            const BST tint_symbol_21 = {17, -1, -1};
+            tree[8] = tint_symbol_21;
+            x_512_phi = true;
+            break;
+          } else {
+            x_483 = tree[x_477_save].rightIndex;
+            x_464_phi = x_463;
+            x_467_phi = x_483;
+            {
+              x_464 = x_464_phi;
+              x_467 = x_467_phi;
+              x_463_phi = x_464;
+              x_466_phi = x_467;
+            }
+            continue;
+          }
+          return;
+        }
+        x_464_phi = x_510;
+        x_467_phi = x_466;
+        {
+          x_464 = x_464_phi;
+          x_467 = x_467_phi;
+          x_463_phi = x_464;
+          x_466_phi = x_467;
+        }
+      }
+      if (x_512_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  bool x_517 = false;
+  bool x_564 = false;
+  bool x_517_phi = false;
+  int x_520_phi = 0;
+  bool x_566_phi = false;
+  switch(0u) {
+    default: {
+      x_517_phi = false;
+      x_520_phi = 0;
+      while (true) {
+        int x_545 = 0;
+        int x_537 = 0;
+        bool x_518 = false;
+        int x_521 = 0;
+        bool x_518_phi = false;
+        int x_521_phi = 0;
+        x_517 = x_517_phi;
+        const int x_520 = x_520_phi;
+        x_566_phi = x_517;
+        if ((x_520 <= 9)) {
+        } else {
+          break;
+        }
+        const int x_526 = tree[x_520].data;
+        if ((13 <= x_526)) {
+          bool x_564_phi = false;
+          const int x_539_save = x_520;
+          const int x_540 = tree[x_539_save].leftIndex;
+          if ((x_540 == -1)) {
+            const float x_547 = asfloat(x_8[0].y);
+            const float x_549 = asfloat(x_8[0].x);
+            if ((x_547 < x_549)) {
+              while (true) {
+                discard;
+              }
+              return;
+            }
+            tree[x_539_save].leftIndex = 9;
+            const BST tint_symbol_22 = {13, -1, -1};
+            tree[9] = tint_symbol_22;
+            while (true) {
+              x_564_phi = x_517;
+              if ((0 < int(x_547))) {
+              } else {
+                break;
+              }
+              x_564_phi = true;
+              break;
+            }
+            x_564 = x_564_phi;
+            x_566_phi = x_564;
+            if (x_564) {
+              break;
+            }
+          } else {
+            x_545 = tree[x_539_save].leftIndex;
+            x_518_phi = x_517;
+            x_521_phi = x_545;
+            {
+              x_518 = x_518_phi;
+              x_521 = x_521_phi;
+              x_517_phi = x_518;
+              x_520_phi = x_521;
+            }
+            continue;
+          }
+        } else {
+          const int x_531_save = x_520;
+          const int x_532 = tree[x_531_save].rightIndex;
+          if ((x_532 == -1)) {
+            tree[x_531_save].rightIndex = 9;
+            const BST tint_symbol_23 = {13, -1, -1};
+            tree[9] = tint_symbol_23;
+            x_566_phi = true;
+            break;
+          } else {
+            x_537 = tree[x_531_save].rightIndex;
+            x_518_phi = x_517;
+            x_521_phi = x_537;
+            {
+              x_518 = x_518_phi;
+              x_521 = x_521_phi;
+              x_517_phi = x_518;
+              x_520_phi = x_521;
+            }
+            continue;
+          }
+          return;
+        }
+        x_518_phi = x_564;
+        x_521_phi = x_520;
+        {
+          x_518 = x_518_phi;
+          x_521 = x_521_phi;
+          x_517_phi = x_518;
+          x_520_phi = x_521;
+        }
+      }
+      if (x_566_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  x_569_phi = 0;
+  x_572_phi = 0;
+  x_574_phi = 0;
+  while (true) {
+    int x_597 = 0;
+    int x_607 = 0;
+    int x_612 = 0;
+    int x_575 = 0;
+    int x_570_phi = 0;
+    int x_573_phi = 0;
+    const int x_569 = x_569_phi;
+    x_572 = x_572_phi;
+    const int x_574 = x_574_phi;
+    if ((x_574 < 20)) {
+    } else {
+      break;
+    }
+    int x_582_phi = 0;
+    int x_597_phi = 0;
+    bool x_598_phi = false;
+    switch(0u) {
+      default: {
+        x_582_phi = 0;
+        while (true) {
+          const int x_582 = x_582_phi;
+          x_597_phi = x_569;
+          x_598_phi = false;
+          if ((x_582 != -1)) {
+          } else {
+            break;
+          }
+          const BST x_589 = tree[x_582];
+          const int x_590 = x_589.data;
+          const int x_591 = x_589.leftIndex;
+          const int x_592 = x_589.rightIndex;
+          if ((x_590 == x_574)) {
+            x_597_phi = x_574;
+            x_598_phi = true;
+            break;
+          }
+          {
+            x_582_phi = ((x_574 > x_590) ? x_592 : x_591);
+          }
+        }
+        x_597 = x_597_phi;
+        const bool x_598 = x_598_phi;
+        x_570_phi = x_597;
+        if (x_598) {
+          break;
+        }
+        x_570_phi = -1;
+        break;
+      }
+    }
+    int x_570 = 0;
+    int x_606 = 0;
+    int x_611 = 0;
+    int x_607_phi = 0;
+    int x_612_phi = 0;
+    x_570 = x_570_phi;
+    switch(x_574) {
+      case 2:
+      case 5:
+      case 6:
+      case 7:
+      case 8:
+      case 9:
+      case 12:
+      case 13:
+      case 15:
+      case 17: {
+        x_607_phi = x_572;
+        if ((x_570 == asint(x_574))) {
+          x_606 = asint((x_572 + asint(1)));
+          x_607_phi = x_606;
+        }
+        x_607 = x_607_phi;
+        x_573_phi = x_607;
+        break;
+      }
+      default: {
+        x_612_phi = x_572;
+        if ((x_570 == asint(-1))) {
+          x_611 = asint((x_572 + asint(1)));
+          x_612_phi = x_611;
+        }
+        x_612 = x_612_phi;
+        x_573_phi = x_612;
+        break;
+      }
+    }
+    const int x_573 = x_573_phi;
+    {
+      x_575 = (x_574 + 1);
+      x_569_phi = x_570;
+      x_572_phi = x_573;
+      x_574_phi = x_575;
+    }
+  }
+  if ((x_572 == asint(20))) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 1.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_24 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_24;
+}
+T:\tmp\ulw.0:1053:20: warning: equality comparison with extraneous parentheses [-Wparentheses-equality]
+        if ((x_570 == asint(x_574))) {
+             ~~~~~~^~~~~~~~~~~~~~~
+T:\tmp\ulw.0:1053:20: note: remove extraneous parentheses around the comparison to silence this warning
+        if ((x_570 == asint(x_574))) {
+            ~      ^              ~
+T:\tmp\ulw.0:1053:20: note: use '=' to turn this equality comparison into an assignment
+        if ((x_570 == asint(x_574))) {
+                   ^~
+                   =
+T:\tmp\ulw.0:1063:20: warning: equality comparison with extraneous parentheses [-Wparentheses-equality]
+        if ((x_570 == asint(-1))) {
+             ~~~~~~^~~~~~~~~~~~
+T:\tmp\ulw.0:1063:20: note: remove extraneous parentheses around the comparison to silence this warning
+        if ((x_570 == asint(-1))) {
+            ~      ^           ~
+T:\tmp\ulw.0:1063:20: note: use '=' to turn this equality comparison into an assignment
+        if ((x_570 == asint(-1))) {
+                   ^~
+                   =
+T:\tmp\ulw.0:1080:14: warning: equality comparison with extraneous parentheses [-Wparentheses-equality]
+  if ((x_572 == asint(20))) {
+       ~~~~~~^~~~~~~~~~~~
+T:\tmp\ulw.0:1080:14: note: remove extraneous parentheses around the comparison to silence this warning
+  if ((x_572 == asint(20))) {
+      ~      ^           ~
+T:\tmp\ulw.0:1080:14: note: use '=' to turn this equality comparison into an assignment
+  if ((x_572 == asint(20))) {
+             ^~
+             =
+error: validation errors
+T:\tmp\ulw.0:1098: error: Loop must have break.
+T:\tmp\ulw.0:1098: error: Loop must have break.
+T:\tmp\ulw.0:1098: error: Loop must have break.
+T:\tmp\ulw.0:1098: error: Loop must have break.
+T:\tmp\ulw.0:1098: error: Loop must have break.
+T:\tmp\ulw.0:1098: error: Loop must have break.
+T:\tmp\ulw.0:1098: error: Loop must have break.
+T:\tmp\ulw.0:1098: error: Loop must have break.
+T:\tmp\ulw.0:1098: error: Loop must have break.
+Validation failed.
+
+
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/1.spvasm.expected.msl
new file mode 100644
index 0000000..5025022
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/1.spvasm.expected.msl
@@ -0,0 +1,1116 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  BST arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_24, thread float4* const tint_symbol_25) {
+  tint_array_wrapper tree = {};
+  bool x_67 = false;
+  bool x_114 = false;
+  int x_572 = 0;
+  bool x_67_phi = false;
+  int x_70_phi = 0;
+  bool x_116_phi = false;
+  int x_119_phi = 0;
+  int x_569_phi = 0;
+  int x_572_phi = 0;
+  int x_574_phi = 0;
+  BST const tint_symbol_4 = {.data=9, .leftIndex=-1, .rightIndex=-1};
+  tree.arr[0] = tint_symbol_4;
+  switch(0u) {
+    default: {
+      x_67_phi = false;
+      x_70_phi = 0;
+      while (true) {
+        int x_95 = 0;
+        int x_87 = 0;
+        bool x_68 = false;
+        int x_71 = 0;
+        bool x_68_phi = false;
+        int x_71_phi = 0;
+        x_67 = x_67_phi;
+        int const x_70 = x_70_phi;
+        x_116_phi = x_67;
+        if ((x_70 <= 1)) {
+        } else {
+          break;
+        }
+        int const x_76 = tree.arr[x_70].data;
+        if ((5 <= x_76)) {
+          bool x_114_phi = false;
+          int const x_89_save = x_70;
+          int const x_90 = tree.arr[x_89_save].leftIndex;
+          if ((x_90 == -1)) {
+            float const x_97 = x_8.injectionSwitch.y;
+            float const x_99 = x_8.injectionSwitch.x;
+            if ((x_97 < x_99)) {
+              while (true) {
+                discard_fragment();
+              }
+              return;
+            }
+            tree.arr[x_89_save].leftIndex = 1;
+            BST const tint_symbol_5 = {.data=5, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[1] = tint_symbol_5;
+            while (true) {
+              x_114_phi = x_67;
+              if ((0 < int(x_97))) {
+              } else {
+                break;
+              }
+              x_114_phi = true;
+              break;
+            }
+            x_114 = x_114_phi;
+            x_116_phi = x_114;
+            if (x_114) {
+              break;
+            }
+          } else {
+            x_95 = tree.arr[x_89_save].leftIndex;
+            x_68_phi = x_67;
+            x_71_phi = x_95;
+            {
+              x_68 = x_68_phi;
+              x_71 = x_71_phi;
+              x_67_phi = x_68;
+              x_70_phi = x_71;
+            }
+            continue;
+          }
+        } else {
+          int const x_81_save = x_70;
+          int const x_82 = tree.arr[x_81_save].rightIndex;
+          if ((x_82 == -1)) {
+            tree.arr[x_81_save].rightIndex = 1;
+            BST const tint_symbol_6 = {.data=5, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[1] = tint_symbol_6;
+            x_116_phi = true;
+            break;
+          } else {
+            x_87 = tree.arr[x_81_save].rightIndex;
+            x_68_phi = x_67;
+            x_71_phi = x_87;
+            {
+              x_68 = x_68_phi;
+              x_71 = x_71_phi;
+              x_67_phi = x_68;
+              x_70_phi = x_71;
+            }
+            continue;
+          }
+          return;
+        }
+        x_68_phi = x_114;
+        x_71_phi = x_70;
+        {
+          x_68 = x_68_phi;
+          x_71 = x_71_phi;
+          x_67_phi = x_68;
+          x_70_phi = x_71;
+        }
+      }
+      bool const x_116 = x_116_phi;
+      if (x_116) {
+        break;
+      }
+      break;
+    }
+  }
+  x_119_phi = 0;
+  while (true) {
+    bool x_133 = false;
+    int x_120 = 0;
+    bool x_134_phi = false;
+    int const x_119 = x_119_phi;
+    float const x_125 = (*(tint_symbol_24)).y;
+    bool const x_126 = (x_125 < 0.0f);
+    x_134_phi = x_126;
+    if (!(x_126)) {
+      float const x_131 = x_8.injectionSwitch.y;
+      x_133 = (x_119 != int(x_131));
+      x_134_phi = x_133;
+    }
+    bool const x_134 = x_134_phi;
+    if (x_134) {
+    } else {
+      break;
+    }
+    bool x_139 = false;
+    bool x_186 = false;
+    bool x_139_phi = false;
+    int x_142_phi = 0;
+    bool x_188_phi = false;
+    switch(0u) {
+      default: {
+        x_139_phi = false;
+        x_142_phi = 0;
+        while (true) {
+          int x_167 = 0;
+          int x_159 = 0;
+          bool x_140 = false;
+          int x_143 = 0;
+          bool x_140_phi = false;
+          int x_143_phi = 0;
+          x_139 = x_139_phi;
+          int const x_142 = x_142_phi;
+          x_188_phi = x_139;
+          if ((x_142 <= 2)) {
+          } else {
+            break;
+          }
+          int const x_148 = tree.arr[x_142].data;
+          if ((12 <= x_148)) {
+            bool x_186_phi = false;
+            int const x_161_save = x_142;
+            int const x_162 = tree.arr[x_161_save].leftIndex;
+            if ((x_162 == -1)) {
+              float const x_169 = x_8.injectionSwitch.y;
+              float const x_171 = x_8.injectionSwitch.x;
+              if ((x_169 < x_171)) {
+                while (true) {
+                  discard_fragment();
+                }
+                return;
+              }
+              tree.arr[x_161_save].leftIndex = 2;
+              BST const tint_symbol_7 = {.data=12, .leftIndex=-1, .rightIndex=-1};
+              tree.arr[2] = tint_symbol_7;
+              while (true) {
+                x_186_phi = x_139;
+                if ((0 < int(x_169))) {
+                } else {
+                  break;
+                }
+                x_186_phi = true;
+                break;
+              }
+              x_186 = x_186_phi;
+              x_188_phi = x_186;
+              if (x_186) {
+                break;
+              }
+            } else {
+              x_167 = tree.arr[x_161_save].leftIndex;
+              x_140_phi = x_139;
+              x_143_phi = x_167;
+              {
+                x_140 = x_140_phi;
+                x_143 = x_143_phi;
+                x_139_phi = x_140;
+                x_142_phi = x_143;
+              }
+              continue;
+            }
+          } else {
+            int const x_153_save = x_142;
+            int const x_154 = tree.arr[x_153_save].rightIndex;
+            if ((x_154 == -1)) {
+              tree.arr[x_153_save].rightIndex = 2;
+              BST const tint_symbol_8 = {.data=12, .leftIndex=-1, .rightIndex=-1};
+              tree.arr[2] = tint_symbol_8;
+              x_188_phi = true;
+              break;
+            } else {
+              x_159 = tree.arr[x_153_save].rightIndex;
+              x_140_phi = x_139;
+              x_143_phi = x_159;
+              {
+                x_140 = x_140_phi;
+                x_143 = x_143_phi;
+                x_139_phi = x_140;
+                x_142_phi = x_143;
+              }
+              continue;
+            }
+            return;
+          }
+          x_140_phi = x_186;
+          x_143_phi = x_142;
+          {
+            x_140 = x_140_phi;
+            x_143 = x_143_phi;
+            x_139_phi = x_140;
+            x_142_phi = x_143;
+          }
+        }
+        bool const x_188 = x_188_phi;
+        if (x_188) {
+          break;
+        }
+        break;
+      }
+    }
+    {
+      x_120 = (x_119 + 1);
+      x_119_phi = x_120;
+    }
+  }
+  bool x_193 = false;
+  bool x_240 = false;
+  bool x_193_phi = false;
+  int x_196_phi = 0;
+  bool x_242_phi = false;
+  switch(0u) {
+    default: {
+      x_193_phi = false;
+      x_196_phi = 0;
+      while (true) {
+        int x_221 = 0;
+        int x_213 = 0;
+        bool x_194 = false;
+        int x_197 = 0;
+        bool x_194_phi = false;
+        int x_197_phi = 0;
+        x_193 = x_193_phi;
+        int const x_196 = x_196_phi;
+        x_242_phi = x_193;
+        if ((x_196 <= 3)) {
+        } else {
+          break;
+        }
+        int const x_202 = tree.arr[x_196].data;
+        if ((15 <= x_202)) {
+          bool x_240_phi = false;
+          int const x_215_save = x_196;
+          int const x_216 = tree.arr[x_215_save].leftIndex;
+          if ((x_216 == -1)) {
+            float const x_223 = x_8.injectionSwitch.y;
+            float const x_225 = x_8.injectionSwitch.x;
+            if ((x_223 < x_225)) {
+              while (true) {
+                discard_fragment();
+              }
+              return;
+            }
+            tree.arr[x_215_save].leftIndex = 3;
+            BST const tint_symbol_9 = {.data=15, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[3] = tint_symbol_9;
+            while (true) {
+              x_240_phi = x_193;
+              if ((0 < int(x_223))) {
+              } else {
+                break;
+              }
+              x_240_phi = true;
+              break;
+            }
+            x_240 = x_240_phi;
+            x_242_phi = x_240;
+            if (x_240) {
+              break;
+            }
+          } else {
+            x_221 = tree.arr[x_215_save].leftIndex;
+            x_194_phi = x_193;
+            x_197_phi = x_221;
+            {
+              x_194 = x_194_phi;
+              x_197 = x_197_phi;
+              x_193_phi = x_194;
+              x_196_phi = x_197;
+            }
+            continue;
+          }
+        } else {
+          int const x_207_save = x_196;
+          int const x_208 = tree.arr[x_207_save].rightIndex;
+          if ((x_208 == -1)) {
+            tree.arr[x_207_save].rightIndex = 3;
+            BST const tint_symbol_10 = {.data=15, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[3] = tint_symbol_10;
+            x_242_phi = true;
+            break;
+          } else {
+            x_213 = tree.arr[x_207_save].rightIndex;
+            x_194_phi = x_193;
+            x_197_phi = x_213;
+            {
+              x_194 = x_194_phi;
+              x_197 = x_197_phi;
+              x_193_phi = x_194;
+              x_196_phi = x_197;
+            }
+            continue;
+          }
+          return;
+        }
+        x_194_phi = x_240;
+        x_197_phi = x_196;
+        {
+          x_194 = x_194_phi;
+          x_197 = x_197_phi;
+          x_193_phi = x_194;
+          x_196_phi = x_197;
+        }
+      }
+      bool const x_242 = x_242_phi;
+      if (x_242) {
+        break;
+      }
+      break;
+    }
+  }
+  bool x_247 = false;
+  bool x_294 = false;
+  bool x_247_phi = false;
+  int x_250_phi = 0;
+  bool x_296_phi = false;
+  switch(0u) {
+    default: {
+      x_247_phi = false;
+      x_250_phi = 0;
+      while (true) {
+        int x_275 = 0;
+        int x_267 = 0;
+        bool x_248 = false;
+        int x_251 = 0;
+        bool x_248_phi = false;
+        int x_251_phi = 0;
+        x_247 = x_247_phi;
+        int const x_250 = x_250_phi;
+        x_296_phi = x_247;
+        if ((x_250 <= 4)) {
+        } else {
+          break;
+        }
+        int const x_256 = tree.arr[x_250].data;
+        if ((7 <= x_256)) {
+          bool x_294_phi = false;
+          int const x_269_save = x_250;
+          int const x_270 = tree.arr[x_269_save].leftIndex;
+          if ((x_270 == -1)) {
+            float const x_277 = x_8.injectionSwitch.y;
+            float const x_279 = x_8.injectionSwitch.x;
+            if ((x_277 < x_279)) {
+              while (true) {
+                discard_fragment();
+              }
+              return;
+            }
+            tree.arr[x_269_save].leftIndex = 4;
+            BST const tint_symbol_11 = {.data=7, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[4] = tint_symbol_11;
+            while (true) {
+              x_294_phi = x_247;
+              if ((0 < int(x_277))) {
+              } else {
+                break;
+              }
+              x_294_phi = true;
+              break;
+            }
+            x_294 = x_294_phi;
+            x_296_phi = x_294;
+            if (x_294) {
+              break;
+            }
+          } else {
+            x_275 = tree.arr[x_269_save].leftIndex;
+            x_248_phi = x_247;
+            x_251_phi = x_275;
+            {
+              x_248 = x_248_phi;
+              x_251 = x_251_phi;
+              x_247_phi = x_248;
+              x_250_phi = x_251;
+            }
+            continue;
+          }
+        } else {
+          int const x_261_save = x_250;
+          int const x_262 = tree.arr[x_261_save].rightIndex;
+          if ((x_262 == -1)) {
+            tree.arr[x_261_save].rightIndex = 4;
+            BST const tint_symbol_12 = {.data=7, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[4] = tint_symbol_12;
+            x_296_phi = true;
+            break;
+          } else {
+            x_267 = tree.arr[x_261_save].rightIndex;
+            x_248_phi = x_247;
+            x_251_phi = x_267;
+            {
+              x_248 = x_248_phi;
+              x_251 = x_251_phi;
+              x_247_phi = x_248;
+              x_250_phi = x_251;
+            }
+            continue;
+          }
+          return;
+        }
+        x_248_phi = x_294;
+        x_251_phi = x_250;
+        {
+          x_248 = x_248_phi;
+          x_251 = x_251_phi;
+          x_247_phi = x_248;
+          x_250_phi = x_251;
+        }
+      }
+      bool const x_296 = x_296_phi;
+      if (x_296) {
+        break;
+      }
+      break;
+    }
+  }
+  bool x_301 = false;
+  bool x_348 = false;
+  bool x_301_phi = false;
+  int x_304_phi = 0;
+  bool x_350_phi = false;
+  switch(0u) {
+    default: {
+      x_301_phi = false;
+      x_304_phi = 0;
+      while (true) {
+        int x_329 = 0;
+        int x_321 = 0;
+        bool x_302 = false;
+        int x_305 = 0;
+        bool x_302_phi = false;
+        int x_305_phi = 0;
+        x_301 = x_301_phi;
+        int const x_304 = x_304_phi;
+        x_350_phi = x_301;
+        if ((x_304 <= 5)) {
+        } else {
+          break;
+        }
+        int const x_310 = tree.arr[x_304].data;
+        if ((8 <= x_310)) {
+          bool x_348_phi = false;
+          int const x_323_save = x_304;
+          int const x_324 = tree.arr[x_323_save].leftIndex;
+          if ((x_324 == -1)) {
+            float const x_331 = x_8.injectionSwitch.y;
+            float const x_333 = x_8.injectionSwitch.x;
+            if ((x_331 < x_333)) {
+              while (true) {
+                discard_fragment();
+              }
+              return;
+            }
+            tree.arr[x_323_save].leftIndex = 5;
+            BST const tint_symbol_13 = {.data=8, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[5] = tint_symbol_13;
+            while (true) {
+              x_348_phi = x_301;
+              if ((0 < int(x_331))) {
+              } else {
+                break;
+              }
+              x_348_phi = true;
+              break;
+            }
+            x_348 = x_348_phi;
+            x_350_phi = x_348;
+            if (x_348) {
+              break;
+            }
+          } else {
+            x_329 = tree.arr[x_323_save].leftIndex;
+            x_302_phi = x_301;
+            x_305_phi = x_329;
+            {
+              x_302 = x_302_phi;
+              x_305 = x_305_phi;
+              x_301_phi = x_302;
+              x_304_phi = x_305;
+            }
+            continue;
+          }
+        } else {
+          int const x_315_save = x_304;
+          int const x_316 = tree.arr[x_315_save].rightIndex;
+          if ((x_316 == -1)) {
+            tree.arr[x_315_save].rightIndex = 5;
+            BST const tint_symbol_14 = {.data=8, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[5] = tint_symbol_14;
+            x_350_phi = true;
+            break;
+          } else {
+            x_321 = tree.arr[x_315_save].rightIndex;
+            x_302_phi = x_301;
+            x_305_phi = x_321;
+            {
+              x_302 = x_302_phi;
+              x_305 = x_305_phi;
+              x_301_phi = x_302;
+              x_304_phi = x_305;
+            }
+            continue;
+          }
+          return;
+        }
+        x_302_phi = x_348;
+        x_305_phi = x_304;
+        {
+          x_302 = x_302_phi;
+          x_305 = x_305_phi;
+          x_301_phi = x_302;
+          x_304_phi = x_305;
+        }
+      }
+      bool const x_350 = x_350_phi;
+      if (x_350) {
+        break;
+      }
+      break;
+    }
+  }
+  bool x_355 = false;
+  bool x_402 = false;
+  bool x_355_phi = false;
+  int x_358_phi = 0;
+  bool x_404_phi = false;
+  switch(0u) {
+    default: {
+      x_355_phi = false;
+      x_358_phi = 0;
+      while (true) {
+        int x_383 = 0;
+        int x_375 = 0;
+        bool x_356 = false;
+        int x_359 = 0;
+        bool x_356_phi = false;
+        int x_359_phi = 0;
+        x_355 = x_355_phi;
+        int const x_358 = x_358_phi;
+        x_404_phi = x_355;
+        if ((x_358 <= 6)) {
+        } else {
+          break;
+        }
+        int const x_364 = tree.arr[x_358].data;
+        if ((2 <= x_364)) {
+          bool x_402_phi = false;
+          int const x_377_save = x_358;
+          int const x_378 = tree.arr[x_377_save].leftIndex;
+          if ((x_378 == -1)) {
+            float const x_385 = x_8.injectionSwitch.y;
+            float const x_387 = x_8.injectionSwitch.x;
+            if ((x_385 < x_387)) {
+              while (true) {
+                discard_fragment();
+              }
+              return;
+            }
+            tree.arr[x_377_save].leftIndex = 6;
+            BST const tint_symbol_15 = {.data=2, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[6] = tint_symbol_15;
+            while (true) {
+              x_402_phi = x_355;
+              if ((0 < int(x_385))) {
+              } else {
+                break;
+              }
+              x_402_phi = true;
+              break;
+            }
+            x_402 = x_402_phi;
+            x_404_phi = x_402;
+            if (x_402) {
+              break;
+            }
+          } else {
+            x_383 = tree.arr[x_377_save].leftIndex;
+            x_356_phi = x_355;
+            x_359_phi = x_383;
+            {
+              x_356 = x_356_phi;
+              x_359 = x_359_phi;
+              x_355_phi = x_356;
+              x_358_phi = x_359;
+            }
+            continue;
+          }
+        } else {
+          int const x_369_save = x_358;
+          int const x_370 = tree.arr[x_369_save].rightIndex;
+          if ((x_370 == -1)) {
+            tree.arr[x_369_save].rightIndex = 6;
+            BST const tint_symbol_16 = {.data=2, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[6] = tint_symbol_16;
+            x_404_phi = true;
+            break;
+          } else {
+            x_375 = tree.arr[x_369_save].rightIndex;
+            x_356_phi = x_355;
+            x_359_phi = x_375;
+            {
+              x_356 = x_356_phi;
+              x_359 = x_359_phi;
+              x_355_phi = x_356;
+              x_358_phi = x_359;
+            }
+            continue;
+          }
+          return;
+        }
+        x_356_phi = x_402;
+        x_359_phi = x_358;
+        {
+          x_356 = x_356_phi;
+          x_359 = x_359_phi;
+          x_355_phi = x_356;
+          x_358_phi = x_359;
+        }
+      }
+      bool const x_404 = x_404_phi;
+      if (x_404) {
+        break;
+      }
+      break;
+    }
+  }
+  bool x_409 = false;
+  bool x_456 = false;
+  bool x_409_phi = false;
+  int x_412_phi = 0;
+  bool x_458_phi = false;
+  switch(0u) {
+    default: {
+      x_409_phi = false;
+      x_412_phi = 0;
+      while (true) {
+        int x_437 = 0;
+        int x_429 = 0;
+        bool x_410 = false;
+        int x_413 = 0;
+        bool x_410_phi = false;
+        int x_413_phi = 0;
+        x_409 = x_409_phi;
+        int const x_412 = x_412_phi;
+        x_458_phi = x_409;
+        if ((x_412 <= 7)) {
+        } else {
+          break;
+        }
+        int const x_418 = tree.arr[x_412].data;
+        if ((6 <= x_418)) {
+          bool x_456_phi = false;
+          int const x_431_save = x_412;
+          int const x_432 = tree.arr[x_431_save].leftIndex;
+          if ((x_432 == -1)) {
+            float const x_439 = x_8.injectionSwitch.y;
+            float const x_441 = x_8.injectionSwitch.x;
+            if ((x_439 < x_441)) {
+              while (true) {
+                discard_fragment();
+              }
+              return;
+            }
+            tree.arr[x_431_save].leftIndex = 7;
+            BST const tint_symbol_17 = {.data=6, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[7] = tint_symbol_17;
+            while (true) {
+              x_456_phi = x_409;
+              if ((0 < int(x_439))) {
+              } else {
+                break;
+              }
+              x_456_phi = true;
+              break;
+            }
+            x_456 = x_456_phi;
+            x_458_phi = x_456;
+            if (x_456) {
+              break;
+            }
+          } else {
+            x_437 = tree.arr[x_431_save].leftIndex;
+            x_410_phi = x_409;
+            x_413_phi = x_437;
+            {
+              x_410 = x_410_phi;
+              x_413 = x_413_phi;
+              x_409_phi = x_410;
+              x_412_phi = x_413;
+            }
+            continue;
+          }
+        } else {
+          int const x_423_save = x_412;
+          int const x_424 = tree.arr[x_423_save].rightIndex;
+          if ((x_424 == -1)) {
+            tree.arr[x_423_save].rightIndex = 7;
+            BST const tint_symbol_18 = {.data=6, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[7] = tint_symbol_18;
+            x_458_phi = true;
+            break;
+          } else {
+            x_429 = tree.arr[x_423_save].rightIndex;
+            x_410_phi = x_409;
+            x_413_phi = x_429;
+            {
+              x_410 = x_410_phi;
+              x_413 = x_413_phi;
+              x_409_phi = x_410;
+              x_412_phi = x_413;
+            }
+            continue;
+          }
+          return;
+        }
+        x_410_phi = x_456;
+        x_413_phi = x_412;
+        {
+          x_410 = x_410_phi;
+          x_413 = x_413_phi;
+          x_409_phi = x_410;
+          x_412_phi = x_413;
+        }
+      }
+      bool const x_458 = x_458_phi;
+      if (x_458) {
+        break;
+      }
+      break;
+    }
+  }
+  bool x_463 = false;
+  bool x_510 = false;
+  bool x_463_phi = false;
+  int x_466_phi = 0;
+  bool x_512_phi = false;
+  switch(0u) {
+    default: {
+      x_463_phi = false;
+      x_466_phi = 0;
+      while (true) {
+        int x_491 = 0;
+        int x_483 = 0;
+        bool x_464 = false;
+        int x_467 = 0;
+        bool x_464_phi = false;
+        int x_467_phi = 0;
+        x_463 = x_463_phi;
+        int const x_466 = x_466_phi;
+        x_512_phi = x_463;
+        if ((x_466 <= 8)) {
+        } else {
+          break;
+        }
+        int const x_472 = tree.arr[x_466].data;
+        if ((17 <= x_472)) {
+          bool x_510_phi = false;
+          int const x_485_save = x_466;
+          int const x_486 = tree.arr[x_485_save].leftIndex;
+          if ((x_486 == -1)) {
+            float const x_493 = x_8.injectionSwitch.y;
+            float const x_495 = x_8.injectionSwitch.x;
+            if ((x_493 < x_495)) {
+              while (true) {
+                discard_fragment();
+              }
+              return;
+            }
+            tree.arr[x_485_save].leftIndex = 8;
+            BST const tint_symbol_19 = {.data=17, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[8] = tint_symbol_19;
+            while (true) {
+              x_510_phi = x_463;
+              if ((0 < int(x_493))) {
+              } else {
+                break;
+              }
+              x_510_phi = true;
+              break;
+            }
+            x_510 = x_510_phi;
+            x_512_phi = x_510;
+            if (x_510) {
+              break;
+            }
+          } else {
+            x_491 = tree.arr[x_485_save].leftIndex;
+            x_464_phi = x_463;
+            x_467_phi = x_491;
+            {
+              x_464 = x_464_phi;
+              x_467 = x_467_phi;
+              x_463_phi = x_464;
+              x_466_phi = x_467;
+            }
+            continue;
+          }
+        } else {
+          int const x_477_save = x_466;
+          int const x_478 = tree.arr[x_477_save].rightIndex;
+          if ((x_478 == -1)) {
+            tree.arr[x_477_save].rightIndex = 8;
+            BST const tint_symbol_20 = {.data=17, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[8] = tint_symbol_20;
+            x_512_phi = true;
+            break;
+          } else {
+            x_483 = tree.arr[x_477_save].rightIndex;
+            x_464_phi = x_463;
+            x_467_phi = x_483;
+            {
+              x_464 = x_464_phi;
+              x_467 = x_467_phi;
+              x_463_phi = x_464;
+              x_466_phi = x_467;
+            }
+            continue;
+          }
+          return;
+        }
+        x_464_phi = x_510;
+        x_467_phi = x_466;
+        {
+          x_464 = x_464_phi;
+          x_467 = x_467_phi;
+          x_463_phi = x_464;
+          x_466_phi = x_467;
+        }
+      }
+      bool const x_512 = x_512_phi;
+      if (x_512) {
+        break;
+      }
+      break;
+    }
+  }
+  bool x_517 = false;
+  bool x_564 = false;
+  bool x_517_phi = false;
+  int x_520_phi = 0;
+  bool x_566_phi = false;
+  switch(0u) {
+    default: {
+      x_517_phi = false;
+      x_520_phi = 0;
+      while (true) {
+        int x_545 = 0;
+        int x_537 = 0;
+        bool x_518 = false;
+        int x_521 = 0;
+        bool x_518_phi = false;
+        int x_521_phi = 0;
+        x_517 = x_517_phi;
+        int const x_520 = x_520_phi;
+        x_566_phi = x_517;
+        if ((x_520 <= 9)) {
+        } else {
+          break;
+        }
+        int const x_526 = tree.arr[x_520].data;
+        if ((13 <= x_526)) {
+          bool x_564_phi = false;
+          int const x_539_save = x_520;
+          int const x_540 = tree.arr[x_539_save].leftIndex;
+          if ((x_540 == -1)) {
+            float const x_547 = x_8.injectionSwitch.y;
+            float const x_549 = x_8.injectionSwitch.x;
+            if ((x_547 < x_549)) {
+              while (true) {
+                discard_fragment();
+              }
+              return;
+            }
+            tree.arr[x_539_save].leftIndex = 9;
+            BST const tint_symbol_21 = {.data=13, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[9] = tint_symbol_21;
+            while (true) {
+              x_564_phi = x_517;
+              if ((0 < int(x_547))) {
+              } else {
+                break;
+              }
+              x_564_phi = true;
+              break;
+            }
+            x_564 = x_564_phi;
+            x_566_phi = x_564;
+            if (x_564) {
+              break;
+            }
+          } else {
+            x_545 = tree.arr[x_539_save].leftIndex;
+            x_518_phi = x_517;
+            x_521_phi = x_545;
+            {
+              x_518 = x_518_phi;
+              x_521 = x_521_phi;
+              x_517_phi = x_518;
+              x_520_phi = x_521;
+            }
+            continue;
+          }
+        } else {
+          int const x_531_save = x_520;
+          int const x_532 = tree.arr[x_531_save].rightIndex;
+          if ((x_532 == -1)) {
+            tree.arr[x_531_save].rightIndex = 9;
+            BST const tint_symbol_22 = {.data=13, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[9] = tint_symbol_22;
+            x_566_phi = true;
+            break;
+          } else {
+            x_537 = tree.arr[x_531_save].rightIndex;
+            x_518_phi = x_517;
+            x_521_phi = x_537;
+            {
+              x_518 = x_518_phi;
+              x_521 = x_521_phi;
+              x_517_phi = x_518;
+              x_520_phi = x_521;
+            }
+            continue;
+          }
+          return;
+        }
+        x_518_phi = x_564;
+        x_521_phi = x_520;
+        {
+          x_518 = x_518_phi;
+          x_521 = x_521_phi;
+          x_517_phi = x_518;
+          x_520_phi = x_521;
+        }
+      }
+      bool const x_566 = x_566_phi;
+      if (x_566) {
+        break;
+      }
+      break;
+    }
+  }
+  x_569_phi = 0;
+  x_572_phi = 0;
+  x_574_phi = 0;
+  while (true) {
+    int x_597 = 0;
+    int x_607 = 0;
+    int x_612 = 0;
+    int x_575 = 0;
+    int x_570_phi = 0;
+    int x_573_phi = 0;
+    int const x_569 = x_569_phi;
+    x_572 = x_572_phi;
+    int const x_574 = x_574_phi;
+    if ((x_574 < 20)) {
+    } else {
+      break;
+    }
+    int x_582_phi = 0;
+    int x_597_phi = 0;
+    bool x_598_phi = false;
+    switch(0u) {
+      default: {
+        x_582_phi = 0;
+        while (true) {
+          int const x_582 = x_582_phi;
+          x_597_phi = x_569;
+          x_598_phi = false;
+          if ((x_582 != -1)) {
+          } else {
+            break;
+          }
+          BST const x_589 = tree.arr[x_582];
+          int const x_590 = x_589.data;
+          int const x_591 = x_589.leftIndex;
+          int const x_592 = x_589.rightIndex;
+          if ((x_590 == x_574)) {
+            x_597_phi = x_574;
+            x_598_phi = true;
+            break;
+          }
+          {
+            x_582_phi = select(x_591, x_592, (x_574 > x_590));
+          }
+        }
+        x_597 = x_597_phi;
+        bool const x_598 = x_598_phi;
+        x_570_phi = x_597;
+        if (x_598) {
+          break;
+        }
+        x_570_phi = -1;
+        break;
+      }
+    }
+    int x_570 = 0;
+    int x_606 = 0;
+    int x_611 = 0;
+    int x_607_phi = 0;
+    int x_612_phi = 0;
+    x_570 = x_570_phi;
+    switch(x_574) {
+      case 2:
+      case 5:
+      case 6:
+      case 7:
+      case 8:
+      case 9:
+      case 12:
+      case 13:
+      case 15:
+      case 17: {
+        x_607_phi = x_572;
+        if ((x_570 == as_type<int>(x_574))) {
+          x_606 = as_type<int>((x_572 + as_type<int>(1)));
+          x_607_phi = x_606;
+        }
+        x_607 = x_607_phi;
+        x_573_phi = x_607;
+        break;
+      }
+      default: {
+        x_612_phi = x_572;
+        if ((x_570 == as_type<int>(-1))) {
+          x_611 = as_type<int>((x_572 + as_type<int>(1)));
+          x_612_phi = x_611;
+        }
+        x_612 = x_612_phi;
+        x_573_phi = x_612;
+        break;
+      }
+    }
+    int const x_573 = x_573_phi;
+    {
+      x_575 = (x_574 + 1);
+      x_569_phi = x_570;
+      x_572_phi = x_573;
+      x_574_phi = x_575;
+    }
+  }
+  if ((x_572 == as_type<int>(20))) {
+    *(tint_symbol_25) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_25) = float4(0.0f, 0.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_26 = 0.0f;
+  thread float4 tint_symbol_27 = 0.0f;
+  tint_symbol_26 = gl_FragCoord_param;
+  main_1(x_8, &(tint_symbol_26), &(tint_symbol_27));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_27};
+  tint_symbol_2 const tint_symbol_23 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_23;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..41d75a5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/1.spvasm.expected.spvasm
@@ -0,0 +1,1920 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 1006
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_8 "x_8"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %BST "BST"
+               OpMemberName %BST 0 "data"
+               OpMemberName %BST 1 "leftIndex"
+               OpMemberName %BST 2 "rightIndex"
+               OpName %tree "tree"
+               OpName %x_67 "x_67"
+               OpName %x_114 "x_114"
+               OpName %x_572 "x_572"
+               OpName %x_67_phi "x_67_phi"
+               OpName %x_70_phi "x_70_phi"
+               OpName %x_116_phi "x_116_phi"
+               OpName %x_119_phi "x_119_phi"
+               OpName %x_569_phi "x_569_phi"
+               OpName %x_572_phi "x_572_phi"
+               OpName %x_574_phi "x_574_phi"
+               OpName %x_95 "x_95"
+               OpName %x_87 "x_87"
+               OpName %x_68 "x_68"
+               OpName %x_71 "x_71"
+               OpName %x_68_phi "x_68_phi"
+               OpName %x_71_phi "x_71_phi"
+               OpName %x_114_phi "x_114_phi"
+               OpName %x_133 "x_133"
+               OpName %x_120 "x_120"
+               OpName %x_134_phi "x_134_phi"
+               OpName %x_139 "x_139"
+               OpName %x_186 "x_186"
+               OpName %x_139_phi "x_139_phi"
+               OpName %x_142_phi "x_142_phi"
+               OpName %x_188_phi "x_188_phi"
+               OpName %x_167 "x_167"
+               OpName %x_159 "x_159"
+               OpName %x_140 "x_140"
+               OpName %x_143 "x_143"
+               OpName %x_140_phi "x_140_phi"
+               OpName %x_143_phi "x_143_phi"
+               OpName %x_186_phi "x_186_phi"
+               OpName %x_193 "x_193"
+               OpName %x_240 "x_240"
+               OpName %x_193_phi "x_193_phi"
+               OpName %x_196_phi "x_196_phi"
+               OpName %x_242_phi "x_242_phi"
+               OpName %x_221 "x_221"
+               OpName %x_213 "x_213"
+               OpName %x_194 "x_194"
+               OpName %x_197 "x_197"
+               OpName %x_194_phi "x_194_phi"
+               OpName %x_197_phi "x_197_phi"
+               OpName %x_240_phi "x_240_phi"
+               OpName %x_247 "x_247"
+               OpName %x_294 "x_294"
+               OpName %x_247_phi "x_247_phi"
+               OpName %x_250_phi "x_250_phi"
+               OpName %x_296_phi "x_296_phi"
+               OpName %x_275 "x_275"
+               OpName %x_267 "x_267"
+               OpName %x_248 "x_248"
+               OpName %x_251 "x_251"
+               OpName %x_248_phi "x_248_phi"
+               OpName %x_251_phi "x_251_phi"
+               OpName %x_294_phi "x_294_phi"
+               OpName %x_301 "x_301"
+               OpName %x_348 "x_348"
+               OpName %x_301_phi "x_301_phi"
+               OpName %x_304_phi "x_304_phi"
+               OpName %x_350_phi "x_350_phi"
+               OpName %x_329 "x_329"
+               OpName %x_321 "x_321"
+               OpName %x_302 "x_302"
+               OpName %x_305 "x_305"
+               OpName %x_302_phi "x_302_phi"
+               OpName %x_305_phi "x_305_phi"
+               OpName %x_348_phi "x_348_phi"
+               OpName %x_355 "x_355"
+               OpName %x_402 "x_402"
+               OpName %x_355_phi "x_355_phi"
+               OpName %x_358_phi "x_358_phi"
+               OpName %x_404_phi "x_404_phi"
+               OpName %x_383 "x_383"
+               OpName %x_375 "x_375"
+               OpName %x_356 "x_356"
+               OpName %x_359 "x_359"
+               OpName %x_356_phi "x_356_phi"
+               OpName %x_359_phi "x_359_phi"
+               OpName %x_402_phi "x_402_phi"
+               OpName %x_409 "x_409"
+               OpName %x_456 "x_456"
+               OpName %x_409_phi "x_409_phi"
+               OpName %x_412_phi "x_412_phi"
+               OpName %x_458_phi "x_458_phi"
+               OpName %x_437 "x_437"
+               OpName %x_429 "x_429"
+               OpName %x_410 "x_410"
+               OpName %x_413 "x_413"
+               OpName %x_410_phi "x_410_phi"
+               OpName %x_413_phi "x_413_phi"
+               OpName %x_456_phi "x_456_phi"
+               OpName %x_463 "x_463"
+               OpName %x_510 "x_510"
+               OpName %x_463_phi "x_463_phi"
+               OpName %x_466_phi "x_466_phi"
+               OpName %x_512_phi "x_512_phi"
+               OpName %x_491 "x_491"
+               OpName %x_483 "x_483"
+               OpName %x_464 "x_464"
+               OpName %x_467 "x_467"
+               OpName %x_464_phi "x_464_phi"
+               OpName %x_467_phi "x_467_phi"
+               OpName %x_510_phi "x_510_phi"
+               OpName %x_517 "x_517"
+               OpName %x_564 "x_564"
+               OpName %x_517_phi "x_517_phi"
+               OpName %x_520_phi "x_520_phi"
+               OpName %x_566_phi "x_566_phi"
+               OpName %x_545 "x_545"
+               OpName %x_537 "x_537"
+               OpName %x_518 "x_518"
+               OpName %x_521 "x_521"
+               OpName %x_518_phi "x_518_phi"
+               OpName %x_521_phi "x_521_phi"
+               OpName %x_564_phi "x_564_phi"
+               OpName %x_597 "x_597"
+               OpName %x_607 "x_607"
+               OpName %x_612 "x_612"
+               OpName %x_575 "x_575"
+               OpName %x_570_phi "x_570_phi"
+               OpName %x_573_phi "x_573_phi"
+               OpName %x_582_phi "x_582_phi"
+               OpName %x_597_phi "x_597_phi"
+               OpName %x_598_phi "x_598_phi"
+               OpName %x_570 "x_570"
+               OpName %x_606 "x_606"
+               OpName %x_611 "x_611"
+               OpName %x_607_phi "x_607_phi"
+               OpName %x_612_phi "x_612_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %BST 0 Offset 0
+               OpMemberDecorate %BST 1 Offset 4
+               OpMemberDecorate %BST 2 Offset 8
+               OpDecorate %_arr_BST_uint_10 ArrayStride 12
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+        %BST = OpTypeStruct %int %int %int
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_BST_uint_10 = OpTypeArray %BST %uint_10
+%_ptr_Function__arr_BST_uint_10 = OpTypePointer Function %_arr_BST_uint_10
+         %26 = OpConstantNull %_arr_BST_uint_10
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %30 = OpConstantNull %bool
+%_ptr_Function_int = OpTypePointer Function %int
+         %34 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+%_ptr_Function_BST = OpTypePointer Function %BST
+      %int_9 = OpConstant %int 9
+     %int_n1 = OpConstant %int -1
+         %47 = OpConstantComposite %BST %int_9 %int_n1 %int_n1
+     %uint_0 = OpConstant %uint 0
+      %false = OpConstantFalse %bool
+      %int_1 = OpConstant %int 1
+      %int_5 = OpConstant %int 5
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+         %99 = OpConstantComposite %BST %int_5 %int_n1 %int_n1
+       %true = OpConstantTrue %bool
+     %uint_2 = OpConstant %uint 2
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+      %int_2 = OpConstant %int 2
+     %int_12 = OpConstant %int 12
+        %218 = OpConstantComposite %BST %int_12 %int_n1 %int_n1
+      %int_3 = OpConstant %int 3
+     %int_15 = OpConstant %int 15
+        %312 = OpConstantComposite %BST %int_15 %int_n1 %int_n1
+      %int_4 = OpConstant %int 4
+      %int_7 = OpConstant %int 7
+        %404 = OpConstantComposite %BST %int_7 %int_n1 %int_n1
+      %int_8 = OpConstant %int 8
+        %495 = OpConstantComposite %BST %int_8 %int_n1 %int_n1
+      %int_6 = OpConstant %int 6
+        %586 = OpConstantComposite %BST %int_2 %int_n1 %int_n1
+        %676 = OpConstantComposite %BST %int_6 %int_n1 %int_n1
+     %int_17 = OpConstant %int 17
+        %767 = OpConstantComposite %BST %int_17 %int_n1 %int_n1
+     %int_13 = OpConstant %int 13
+        %858 = OpConstantComposite %BST %int_13 %int_n1 %int_n1
+     %int_20 = OpConstant %int 20
+    %float_1 = OpConstant %float 1
+        %991 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %992 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+        %993 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+       %tree = OpVariable %_ptr_Function__arr_BST_uint_10 Function %26
+       %x_67 = OpVariable %_ptr_Function_bool Function %30
+      %x_114 = OpVariable %_ptr_Function_bool Function %30
+      %x_572 = OpVariable %_ptr_Function_int Function %34
+   %x_67_phi = OpVariable %_ptr_Function_bool Function %30
+   %x_70_phi = OpVariable %_ptr_Function_int Function %34
+  %x_116_phi = OpVariable %_ptr_Function_bool Function %30
+  %x_119_phi = OpVariable %_ptr_Function_int Function %34
+  %x_569_phi = OpVariable %_ptr_Function_int Function %34
+  %x_572_phi = OpVariable %_ptr_Function_int Function %34
+  %x_574_phi = OpVariable %_ptr_Function_int Function %34
+       %x_95 = OpVariable %_ptr_Function_int Function %34
+       %x_87 = OpVariable %_ptr_Function_int Function %34
+       %x_68 = OpVariable %_ptr_Function_bool Function %30
+       %x_71 = OpVariable %_ptr_Function_int Function %34
+   %x_68_phi = OpVariable %_ptr_Function_bool Function %30
+   %x_71_phi = OpVariable %_ptr_Function_int Function %34
+  %x_114_phi = OpVariable %_ptr_Function_bool Function %30
+      %x_133 = OpVariable %_ptr_Function_bool Function %30
+      %x_120 = OpVariable %_ptr_Function_int Function %34
+  %x_134_phi = OpVariable %_ptr_Function_bool Function %30
+      %x_139 = OpVariable %_ptr_Function_bool Function %30
+      %x_186 = OpVariable %_ptr_Function_bool Function %30
+  %x_139_phi = OpVariable %_ptr_Function_bool Function %30
+  %x_142_phi = OpVariable %_ptr_Function_int Function %34
+  %x_188_phi = OpVariable %_ptr_Function_bool Function %30
+      %x_167 = OpVariable %_ptr_Function_int Function %34
+      %x_159 = OpVariable %_ptr_Function_int Function %34
+      %x_140 = OpVariable %_ptr_Function_bool Function %30
+      %x_143 = OpVariable %_ptr_Function_int Function %34
+  %x_140_phi = OpVariable %_ptr_Function_bool Function %30
+  %x_143_phi = OpVariable %_ptr_Function_int Function %34
+  %x_186_phi = OpVariable %_ptr_Function_bool Function %30
+      %x_193 = OpVariable %_ptr_Function_bool Function %30
+      %x_240 = OpVariable %_ptr_Function_bool Function %30
+  %x_193_phi = OpVariable %_ptr_Function_bool Function %30
+  %x_196_phi = OpVariable %_ptr_Function_int Function %34
+  %x_242_phi = OpVariable %_ptr_Function_bool Function %30
+      %x_221 = OpVariable %_ptr_Function_int Function %34
+      %x_213 = OpVariable %_ptr_Function_int Function %34
+      %x_194 = OpVariable %_ptr_Function_bool Function %30
+      %x_197 = OpVariable %_ptr_Function_int Function %34
+  %x_194_phi = OpVariable %_ptr_Function_bool Function %30
+  %x_197_phi = OpVariable %_ptr_Function_int Function %34
+  %x_240_phi = OpVariable %_ptr_Function_bool Function %30
+      %x_247 = OpVariable %_ptr_Function_bool Function %30
+      %x_294 = OpVariable %_ptr_Function_bool Function %30
+  %x_247_phi = OpVariable %_ptr_Function_bool Function %30
+  %x_250_phi = OpVariable %_ptr_Function_int Function %34
+  %x_296_phi = OpVariable %_ptr_Function_bool Function %30
+      %x_275 = OpVariable %_ptr_Function_int Function %34
+      %x_267 = OpVariable %_ptr_Function_int Function %34
+      %x_248 = OpVariable %_ptr_Function_bool Function %30
+      %x_251 = OpVariable %_ptr_Function_int Function %34
+  %x_248_phi = OpVariable %_ptr_Function_bool Function %30
+  %x_251_phi = OpVariable %_ptr_Function_int Function %34
+  %x_294_phi = OpVariable %_ptr_Function_bool Function %30
+      %x_301 = OpVariable %_ptr_Function_bool Function %30
+      %x_348 = OpVariable %_ptr_Function_bool Function %30
+  %x_301_phi = OpVariable %_ptr_Function_bool Function %30
+  %x_304_phi = OpVariable %_ptr_Function_int Function %34
+  %x_350_phi = OpVariable %_ptr_Function_bool Function %30
+      %x_329 = OpVariable %_ptr_Function_int Function %34
+      %x_321 = OpVariable %_ptr_Function_int Function %34
+      %x_302 = OpVariable %_ptr_Function_bool Function %30
+      %x_305 = OpVariable %_ptr_Function_int Function %34
+  %x_302_phi = OpVariable %_ptr_Function_bool Function %30
+  %x_305_phi = OpVariable %_ptr_Function_int Function %34
+  %x_348_phi = OpVariable %_ptr_Function_bool Function %30
+      %x_355 = OpVariable %_ptr_Function_bool Function %30
+      %x_402 = OpVariable %_ptr_Function_bool Function %30
+  %x_355_phi = OpVariable %_ptr_Function_bool Function %30
+  %x_358_phi = OpVariable %_ptr_Function_int Function %34
+  %x_404_phi = OpVariable %_ptr_Function_bool Function %30
+      %x_383 = OpVariable %_ptr_Function_int Function %34
+      %x_375 = OpVariable %_ptr_Function_int Function %34
+      %x_356 = OpVariable %_ptr_Function_bool Function %30
+      %x_359 = OpVariable %_ptr_Function_int Function %34
+  %x_356_phi = OpVariable %_ptr_Function_bool Function %30
+  %x_359_phi = OpVariable %_ptr_Function_int Function %34
+  %x_402_phi = OpVariable %_ptr_Function_bool Function %30
+      %x_409 = OpVariable %_ptr_Function_bool Function %30
+      %x_456 = OpVariable %_ptr_Function_bool Function %30
+  %x_409_phi = OpVariable %_ptr_Function_bool Function %30
+  %x_412_phi = OpVariable %_ptr_Function_int Function %34
+  %x_458_phi = OpVariable %_ptr_Function_bool Function %30
+      %x_437 = OpVariable %_ptr_Function_int Function %34
+      %x_429 = OpVariable %_ptr_Function_int Function %34
+      %x_410 = OpVariable %_ptr_Function_bool Function %30
+      %x_413 = OpVariable %_ptr_Function_int Function %34
+  %x_410_phi = OpVariable %_ptr_Function_bool Function %30
+  %x_413_phi = OpVariable %_ptr_Function_int Function %34
+  %x_456_phi = OpVariable %_ptr_Function_bool Function %30
+      %x_463 = OpVariable %_ptr_Function_bool Function %30
+      %x_510 = OpVariable %_ptr_Function_bool Function %30
+  %x_463_phi = OpVariable %_ptr_Function_bool Function %30
+  %x_466_phi = OpVariable %_ptr_Function_int Function %34
+  %x_512_phi = OpVariable %_ptr_Function_bool Function %30
+      %x_491 = OpVariable %_ptr_Function_int Function %34
+      %x_483 = OpVariable %_ptr_Function_int Function %34
+      %x_464 = OpVariable %_ptr_Function_bool Function %30
+      %x_467 = OpVariable %_ptr_Function_int Function %34
+  %x_464_phi = OpVariable %_ptr_Function_bool Function %30
+  %x_467_phi = OpVariable %_ptr_Function_int Function %34
+  %x_510_phi = OpVariable %_ptr_Function_bool Function %30
+      %x_517 = OpVariable %_ptr_Function_bool Function %30
+      %x_564 = OpVariable %_ptr_Function_bool Function %30
+  %x_517_phi = OpVariable %_ptr_Function_bool Function %30
+  %x_520_phi = OpVariable %_ptr_Function_int Function %34
+  %x_566_phi = OpVariable %_ptr_Function_bool Function %30
+      %x_545 = OpVariable %_ptr_Function_int Function %34
+      %x_537 = OpVariable %_ptr_Function_int Function %34
+      %x_518 = OpVariable %_ptr_Function_bool Function %30
+      %x_521 = OpVariable %_ptr_Function_int Function %34
+  %x_518_phi = OpVariable %_ptr_Function_bool Function %30
+  %x_521_phi = OpVariable %_ptr_Function_int Function %34
+  %x_564_phi = OpVariable %_ptr_Function_bool Function %30
+      %x_597 = OpVariable %_ptr_Function_int Function %34
+      %x_607 = OpVariable %_ptr_Function_int Function %34
+      %x_612 = OpVariable %_ptr_Function_int Function %34
+      %x_575 = OpVariable %_ptr_Function_int Function %34
+  %x_570_phi = OpVariable %_ptr_Function_int Function %34
+  %x_573_phi = OpVariable %_ptr_Function_int Function %34
+  %x_582_phi = OpVariable %_ptr_Function_int Function %34
+  %x_597_phi = OpVariable %_ptr_Function_int Function %34
+  %x_598_phi = OpVariable %_ptr_Function_bool Function %30
+      %x_570 = OpVariable %_ptr_Function_int Function %34
+      %x_606 = OpVariable %_ptr_Function_int Function %34
+      %x_611 = OpVariable %_ptr_Function_int Function %34
+  %x_607_phi = OpVariable %_ptr_Function_int Function %34
+  %x_612_phi = OpVariable %_ptr_Function_int Function %34
+         %44 = OpAccessChain %_ptr_Function_BST %tree %int_0
+               OpStore %44 %47
+               OpSelectionMerge %48 None
+               OpSwitch %uint_0 %50
+         %50 = OpLabel
+               OpStore %x_67_phi %false
+               OpStore %x_70_phi %int_0
+               OpBranch %52
+         %52 = OpLabel
+               OpLoopMerge %53 %54 None
+               OpBranch %55
+         %55 = OpLabel
+         %62 = OpLoad %bool %x_67_phi
+               OpStore %x_67 %62
+         %63 = OpLoad %int %x_70_phi
+         %64 = OpLoad %bool %x_67
+               OpStore %x_116_phi %64
+         %66 = OpSLessThanEqual %bool %63 %int_1
+               OpSelectionMerge %67 None
+               OpBranchConditional %66 %68 %69
+         %68 = OpLabel
+               OpBranch %67
+         %69 = OpLabel
+               OpBranch %53
+         %67 = OpLabel
+         %70 = OpAccessChain %_ptr_Function_int %tree %63 %uint_0
+         %71 = OpLoad %int %70
+         %73 = OpSLessThanEqual %bool %int_5 %71
+               OpSelectionMerge %74 None
+               OpBranchConditional %73 %75 %76
+         %75 = OpLabel
+         %79 = OpAccessChain %_ptr_Function_int %tree %63 %uint_1
+         %80 = OpLoad %int %79
+         %81 = OpIEqual %bool %80 %int_n1
+               OpSelectionMerge %82 None
+               OpBranchConditional %81 %83 %84
+         %83 = OpLabel
+         %86 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+         %87 = OpLoad %float %86
+         %88 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+         %89 = OpLoad %float %88
+         %90 = OpFOrdLessThan %bool %87 %89
+               OpSelectionMerge %91 None
+               OpBranchConditional %90 %92 %91
+         %92 = OpLabel
+               OpBranch %93
+         %93 = OpLabel
+               OpLoopMerge %94 %95 None
+               OpBranch %96
+         %96 = OpLabel
+               OpKill
+         %95 = OpLabel
+               OpBranch %93
+         %94 = OpLabel
+               OpReturn
+         %91 = OpLabel
+         %97 = OpAccessChain %_ptr_Function_int %tree %63 %uint_1
+               OpStore %97 %int_1
+         %98 = OpAccessChain %_ptr_Function_BST %tree %int_1
+               OpStore %98 %99
+               OpBranch %100
+        %100 = OpLabel
+               OpLoopMerge %101 %102 None
+               OpBranch %103
+        %103 = OpLabel
+        %104 = OpLoad %bool %x_67
+               OpStore %x_114_phi %104
+        %105 = OpConvertFToS %int %87
+        %106 = OpSLessThan %bool %int_0 %105
+               OpSelectionMerge %107 None
+               OpBranchConditional %106 %108 %109
+        %108 = OpLabel
+               OpBranch %107
+        %109 = OpLabel
+               OpBranch %101
+        %107 = OpLabel
+               OpStore %x_114_phi %true
+               OpBranch %101
+        %102 = OpLabel
+               OpBranch %100
+        %101 = OpLabel
+        %111 = OpLoad %bool %x_114_phi
+               OpStore %x_114 %111
+        %112 = OpLoad %bool %x_114
+               OpStore %x_116_phi %112
+        %113 = OpLoad %bool %x_114
+               OpSelectionMerge %114 None
+               OpBranchConditional %113 %115 %114
+        %115 = OpLabel
+               OpBranch %53
+        %114 = OpLabel
+               OpBranch %82
+         %84 = OpLabel
+        %116 = OpAccessChain %_ptr_Function_int %tree %63 %uint_1
+        %117 = OpLoad %int %116
+               OpStore %x_95 %117
+        %118 = OpLoad %bool %x_67
+               OpStore %x_68_phi %118
+        %119 = OpLoad %int %x_95
+               OpStore %x_71_phi %119
+               OpBranch %54
+         %82 = OpLabel
+               OpBranch %74
+         %76 = OpLabel
+        %121 = OpAccessChain %_ptr_Function_int %tree %63 %uint_2
+        %122 = OpLoad %int %121
+        %123 = OpIEqual %bool %122 %int_n1
+               OpSelectionMerge %124 None
+               OpBranchConditional %123 %125 %126
+        %125 = OpLabel
+        %127 = OpAccessChain %_ptr_Function_int %tree %63 %uint_2
+               OpStore %127 %int_1
+        %128 = OpAccessChain %_ptr_Function_BST %tree %int_1
+               OpStore %128 %99
+               OpStore %x_116_phi %true
+               OpBranch %53
+        %126 = OpLabel
+        %129 = OpAccessChain %_ptr_Function_int %tree %63 %uint_2
+        %130 = OpLoad %int %129
+               OpStore %x_87 %130
+        %131 = OpLoad %bool %x_67
+               OpStore %x_68_phi %131
+        %132 = OpLoad %int %x_87
+               OpStore %x_71_phi %132
+               OpBranch %54
+        %124 = OpLabel
+               OpReturn
+         %74 = OpLabel
+        %133 = OpLoad %bool %x_114
+               OpStore %x_68_phi %133
+               OpStore %x_71_phi %63
+               OpBranch %54
+         %54 = OpLabel
+        %134 = OpLoad %bool %x_68_phi
+               OpStore %x_68 %134
+        %135 = OpLoad %int %x_71_phi
+               OpStore %x_71 %135
+        %136 = OpLoad %bool %x_68
+               OpStore %x_67_phi %136
+        %137 = OpLoad %int %x_71
+               OpStore %x_70_phi %137
+               OpBranch %52
+         %53 = OpLabel
+        %138 = OpLoad %bool %x_116_phi
+               OpSelectionMerge %139 None
+               OpBranchConditional %138 %140 %139
+        %140 = OpLabel
+               OpBranch %48
+        %139 = OpLabel
+               OpBranch %48
+         %48 = OpLabel
+               OpStore %x_119_phi %int_0
+               OpBranch %141
+        %141 = OpLabel
+               OpLoopMerge %142 %143 None
+               OpBranch %144
+        %144 = OpLabel
+        %148 = OpLoad %int %x_119_phi
+        %150 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %151 = OpLoad %float %150
+        %153 = OpFOrdLessThan %bool %151 %float_0
+               OpStore %x_134_phi %153
+        %154 = OpLogicalNot %bool %153
+               OpSelectionMerge %155 None
+               OpBranchConditional %154 %156 %155
+        %156 = OpLabel
+        %157 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+        %158 = OpLoad %float %157
+        %159 = OpConvertFToS %int %158
+        %160 = OpINotEqual %bool %148 %159
+               OpStore %x_133 %160
+        %161 = OpLoad %bool %x_133
+               OpStore %x_134_phi %161
+               OpBranch %155
+        %155 = OpLabel
+        %162 = OpLoad %bool %x_134_phi
+               OpSelectionMerge %163 None
+               OpBranchConditional %162 %164 %165
+        %164 = OpLabel
+               OpBranch %163
+        %165 = OpLabel
+               OpBranch %142
+        %163 = OpLabel
+               OpSelectionMerge %171 None
+               OpSwitch %uint_0 %172
+        %172 = OpLabel
+               OpStore %x_139_phi %false
+               OpStore %x_142_phi %int_0
+               OpBranch %173
+        %173 = OpLabel
+               OpLoopMerge %174 %175 None
+               OpBranch %176
+        %176 = OpLabel
+        %183 = OpLoad %bool %x_139_phi
+               OpStore %x_139 %183
+        %184 = OpLoad %int %x_142_phi
+        %185 = OpLoad %bool %x_139
+               OpStore %x_188_phi %185
+        %187 = OpSLessThanEqual %bool %184 %int_2
+               OpSelectionMerge %188 None
+               OpBranchConditional %187 %189 %190
+        %189 = OpLabel
+               OpBranch %188
+        %190 = OpLabel
+               OpBranch %174
+        %188 = OpLabel
+        %191 = OpAccessChain %_ptr_Function_int %tree %184 %uint_0
+        %192 = OpLoad %int %191
+        %194 = OpSLessThanEqual %bool %int_12 %192
+               OpSelectionMerge %195 None
+               OpBranchConditional %194 %196 %197
+        %196 = OpLabel
+        %199 = OpAccessChain %_ptr_Function_int %tree %184 %uint_1
+        %200 = OpLoad %int %199
+        %201 = OpIEqual %bool %200 %int_n1
+               OpSelectionMerge %202 None
+               OpBranchConditional %201 %203 %204
+        %203 = OpLabel
+        %205 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+        %206 = OpLoad %float %205
+        %207 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+        %208 = OpLoad %float %207
+        %209 = OpFOrdLessThan %bool %206 %208
+               OpSelectionMerge %210 None
+               OpBranchConditional %209 %211 %210
+        %211 = OpLabel
+               OpBranch %212
+        %212 = OpLabel
+               OpLoopMerge %213 %214 None
+               OpBranch %215
+        %215 = OpLabel
+               OpKill
+        %214 = OpLabel
+               OpBranch %212
+        %213 = OpLabel
+               OpReturn
+        %210 = OpLabel
+        %216 = OpAccessChain %_ptr_Function_int %tree %184 %uint_1
+               OpStore %216 %int_2
+        %217 = OpAccessChain %_ptr_Function_BST %tree %int_2
+               OpStore %217 %218
+               OpBranch %219
+        %219 = OpLabel
+               OpLoopMerge %220 %221 None
+               OpBranch %222
+        %222 = OpLabel
+        %223 = OpLoad %bool %x_139
+               OpStore %x_186_phi %223
+        %224 = OpConvertFToS %int %206
+        %225 = OpSLessThan %bool %int_0 %224
+               OpSelectionMerge %226 None
+               OpBranchConditional %225 %227 %228
+        %227 = OpLabel
+               OpBranch %226
+        %228 = OpLabel
+               OpBranch %220
+        %226 = OpLabel
+               OpStore %x_186_phi %true
+               OpBranch %220
+        %221 = OpLabel
+               OpBranch %219
+        %220 = OpLabel
+        %229 = OpLoad %bool %x_186_phi
+               OpStore %x_186 %229
+        %230 = OpLoad %bool %x_186
+               OpStore %x_188_phi %230
+        %231 = OpLoad %bool %x_186
+               OpSelectionMerge %232 None
+               OpBranchConditional %231 %233 %232
+        %233 = OpLabel
+               OpBranch %174
+        %232 = OpLabel
+               OpBranch %202
+        %204 = OpLabel
+        %234 = OpAccessChain %_ptr_Function_int %tree %184 %uint_1
+        %235 = OpLoad %int %234
+               OpStore %x_167 %235
+        %236 = OpLoad %bool %x_139
+               OpStore %x_140_phi %236
+        %237 = OpLoad %int %x_167
+               OpStore %x_143_phi %237
+               OpBranch %175
+        %202 = OpLabel
+               OpBranch %195
+        %197 = OpLabel
+        %238 = OpAccessChain %_ptr_Function_int %tree %184 %uint_2
+        %239 = OpLoad %int %238
+        %240 = OpIEqual %bool %239 %int_n1
+               OpSelectionMerge %241 None
+               OpBranchConditional %240 %242 %243
+        %242 = OpLabel
+        %244 = OpAccessChain %_ptr_Function_int %tree %184 %uint_2
+               OpStore %244 %int_2
+        %245 = OpAccessChain %_ptr_Function_BST %tree %int_2
+               OpStore %245 %218
+               OpStore %x_188_phi %true
+               OpBranch %174
+        %243 = OpLabel
+        %246 = OpAccessChain %_ptr_Function_int %tree %184 %uint_2
+        %247 = OpLoad %int %246
+               OpStore %x_159 %247
+        %248 = OpLoad %bool %x_139
+               OpStore %x_140_phi %248
+        %249 = OpLoad %int %x_159
+               OpStore %x_143_phi %249
+               OpBranch %175
+        %241 = OpLabel
+               OpReturn
+        %195 = OpLabel
+        %250 = OpLoad %bool %x_186
+               OpStore %x_140_phi %250
+               OpStore %x_143_phi %184
+               OpBranch %175
+        %175 = OpLabel
+        %251 = OpLoad %bool %x_140_phi
+               OpStore %x_140 %251
+        %252 = OpLoad %int %x_143_phi
+               OpStore %x_143 %252
+        %253 = OpLoad %bool %x_140
+               OpStore %x_139_phi %253
+        %254 = OpLoad %int %x_143
+               OpStore %x_142_phi %254
+               OpBranch %173
+        %174 = OpLabel
+        %255 = OpLoad %bool %x_188_phi
+               OpSelectionMerge %256 None
+               OpBranchConditional %255 %257 %256
+        %257 = OpLabel
+               OpBranch %171
+        %256 = OpLabel
+               OpBranch %171
+        %171 = OpLabel
+               OpBranch %143
+        %143 = OpLabel
+        %258 = OpIAdd %int %148 %int_1
+               OpStore %x_120 %258
+        %259 = OpLoad %int %x_120
+               OpStore %x_119_phi %259
+               OpBranch %141
+        %142 = OpLabel
+               OpSelectionMerge %265 None
+               OpSwitch %uint_0 %266
+        %266 = OpLabel
+               OpStore %x_193_phi %false
+               OpStore %x_196_phi %int_0
+               OpBranch %267
+        %267 = OpLabel
+               OpLoopMerge %268 %269 None
+               OpBranch %270
+        %270 = OpLabel
+        %277 = OpLoad %bool %x_193_phi
+               OpStore %x_193 %277
+        %278 = OpLoad %int %x_196_phi
+        %279 = OpLoad %bool %x_193
+               OpStore %x_242_phi %279
+        %281 = OpSLessThanEqual %bool %278 %int_3
+               OpSelectionMerge %282 None
+               OpBranchConditional %281 %283 %284
+        %283 = OpLabel
+               OpBranch %282
+        %284 = OpLabel
+               OpBranch %268
+        %282 = OpLabel
+        %285 = OpAccessChain %_ptr_Function_int %tree %278 %uint_0
+        %286 = OpLoad %int %285
+        %288 = OpSLessThanEqual %bool %int_15 %286
+               OpSelectionMerge %289 None
+               OpBranchConditional %288 %290 %291
+        %290 = OpLabel
+        %293 = OpAccessChain %_ptr_Function_int %tree %278 %uint_1
+        %294 = OpLoad %int %293
+        %295 = OpIEqual %bool %294 %int_n1
+               OpSelectionMerge %296 None
+               OpBranchConditional %295 %297 %298
+        %297 = OpLabel
+        %299 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+        %300 = OpLoad %float %299
+        %301 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+        %302 = OpLoad %float %301
+        %303 = OpFOrdLessThan %bool %300 %302
+               OpSelectionMerge %304 None
+               OpBranchConditional %303 %305 %304
+        %305 = OpLabel
+               OpBranch %306
+        %306 = OpLabel
+               OpLoopMerge %307 %308 None
+               OpBranch %309
+        %309 = OpLabel
+               OpKill
+        %308 = OpLabel
+               OpBranch %306
+        %307 = OpLabel
+               OpReturn
+        %304 = OpLabel
+        %310 = OpAccessChain %_ptr_Function_int %tree %278 %uint_1
+               OpStore %310 %int_3
+        %311 = OpAccessChain %_ptr_Function_BST %tree %int_3
+               OpStore %311 %312
+               OpBranch %313
+        %313 = OpLabel
+               OpLoopMerge %314 %315 None
+               OpBranch %316
+        %316 = OpLabel
+        %317 = OpLoad %bool %x_193
+               OpStore %x_240_phi %317
+        %318 = OpConvertFToS %int %300
+        %319 = OpSLessThan %bool %int_0 %318
+               OpSelectionMerge %320 None
+               OpBranchConditional %319 %321 %322
+        %321 = OpLabel
+               OpBranch %320
+        %322 = OpLabel
+               OpBranch %314
+        %320 = OpLabel
+               OpStore %x_240_phi %true
+               OpBranch %314
+        %315 = OpLabel
+               OpBranch %313
+        %314 = OpLabel
+        %323 = OpLoad %bool %x_240_phi
+               OpStore %x_240 %323
+        %324 = OpLoad %bool %x_240
+               OpStore %x_242_phi %324
+        %325 = OpLoad %bool %x_240
+               OpSelectionMerge %326 None
+               OpBranchConditional %325 %327 %326
+        %327 = OpLabel
+               OpBranch %268
+        %326 = OpLabel
+               OpBranch %296
+        %298 = OpLabel
+        %328 = OpAccessChain %_ptr_Function_int %tree %278 %uint_1
+        %329 = OpLoad %int %328
+               OpStore %x_221 %329
+        %330 = OpLoad %bool %x_193
+               OpStore %x_194_phi %330
+        %331 = OpLoad %int %x_221
+               OpStore %x_197_phi %331
+               OpBranch %269
+        %296 = OpLabel
+               OpBranch %289
+        %291 = OpLabel
+        %332 = OpAccessChain %_ptr_Function_int %tree %278 %uint_2
+        %333 = OpLoad %int %332
+        %334 = OpIEqual %bool %333 %int_n1
+               OpSelectionMerge %335 None
+               OpBranchConditional %334 %336 %337
+        %336 = OpLabel
+        %338 = OpAccessChain %_ptr_Function_int %tree %278 %uint_2
+               OpStore %338 %int_3
+        %339 = OpAccessChain %_ptr_Function_BST %tree %int_3
+               OpStore %339 %312
+               OpStore %x_242_phi %true
+               OpBranch %268
+        %337 = OpLabel
+        %340 = OpAccessChain %_ptr_Function_int %tree %278 %uint_2
+        %341 = OpLoad %int %340
+               OpStore %x_213 %341
+        %342 = OpLoad %bool %x_193
+               OpStore %x_194_phi %342
+        %343 = OpLoad %int %x_213
+               OpStore %x_197_phi %343
+               OpBranch %269
+        %335 = OpLabel
+               OpReturn
+        %289 = OpLabel
+        %344 = OpLoad %bool %x_240
+               OpStore %x_194_phi %344
+               OpStore %x_197_phi %278
+               OpBranch %269
+        %269 = OpLabel
+        %345 = OpLoad %bool %x_194_phi
+               OpStore %x_194 %345
+        %346 = OpLoad %int %x_197_phi
+               OpStore %x_197 %346
+        %347 = OpLoad %bool %x_194
+               OpStore %x_193_phi %347
+        %348 = OpLoad %int %x_197
+               OpStore %x_196_phi %348
+               OpBranch %267
+        %268 = OpLabel
+        %349 = OpLoad %bool %x_242_phi
+               OpSelectionMerge %350 None
+               OpBranchConditional %349 %351 %350
+        %351 = OpLabel
+               OpBranch %265
+        %350 = OpLabel
+               OpBranch %265
+        %265 = OpLabel
+               OpSelectionMerge %357 None
+               OpSwitch %uint_0 %358
+        %358 = OpLabel
+               OpStore %x_247_phi %false
+               OpStore %x_250_phi %int_0
+               OpBranch %359
+        %359 = OpLabel
+               OpLoopMerge %360 %361 None
+               OpBranch %362
+        %362 = OpLabel
+        %369 = OpLoad %bool %x_247_phi
+               OpStore %x_247 %369
+        %370 = OpLoad %int %x_250_phi
+        %371 = OpLoad %bool %x_247
+               OpStore %x_296_phi %371
+        %373 = OpSLessThanEqual %bool %370 %int_4
+               OpSelectionMerge %374 None
+               OpBranchConditional %373 %375 %376
+        %375 = OpLabel
+               OpBranch %374
+        %376 = OpLabel
+               OpBranch %360
+        %374 = OpLabel
+        %377 = OpAccessChain %_ptr_Function_int %tree %370 %uint_0
+        %378 = OpLoad %int %377
+        %380 = OpSLessThanEqual %bool %int_7 %378
+               OpSelectionMerge %381 None
+               OpBranchConditional %380 %382 %383
+        %382 = OpLabel
+        %385 = OpAccessChain %_ptr_Function_int %tree %370 %uint_1
+        %386 = OpLoad %int %385
+        %387 = OpIEqual %bool %386 %int_n1
+               OpSelectionMerge %388 None
+               OpBranchConditional %387 %389 %390
+        %389 = OpLabel
+        %391 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+        %392 = OpLoad %float %391
+        %393 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+        %394 = OpLoad %float %393
+        %395 = OpFOrdLessThan %bool %392 %394
+               OpSelectionMerge %396 None
+               OpBranchConditional %395 %397 %396
+        %397 = OpLabel
+               OpBranch %398
+        %398 = OpLabel
+               OpLoopMerge %399 %400 None
+               OpBranch %401
+        %401 = OpLabel
+               OpKill
+        %400 = OpLabel
+               OpBranch %398
+        %399 = OpLabel
+               OpReturn
+        %396 = OpLabel
+        %402 = OpAccessChain %_ptr_Function_int %tree %370 %uint_1
+               OpStore %402 %int_4
+        %403 = OpAccessChain %_ptr_Function_BST %tree %int_4
+               OpStore %403 %404
+               OpBranch %405
+        %405 = OpLabel
+               OpLoopMerge %406 %407 None
+               OpBranch %408
+        %408 = OpLabel
+        %409 = OpLoad %bool %x_247
+               OpStore %x_294_phi %409
+        %410 = OpConvertFToS %int %392
+        %411 = OpSLessThan %bool %int_0 %410
+               OpSelectionMerge %412 None
+               OpBranchConditional %411 %413 %414
+        %413 = OpLabel
+               OpBranch %412
+        %414 = OpLabel
+               OpBranch %406
+        %412 = OpLabel
+               OpStore %x_294_phi %true
+               OpBranch %406
+        %407 = OpLabel
+               OpBranch %405
+        %406 = OpLabel
+        %415 = OpLoad %bool %x_294_phi
+               OpStore %x_294 %415
+        %416 = OpLoad %bool %x_294
+               OpStore %x_296_phi %416
+        %417 = OpLoad %bool %x_294
+               OpSelectionMerge %418 None
+               OpBranchConditional %417 %419 %418
+        %419 = OpLabel
+               OpBranch %360
+        %418 = OpLabel
+               OpBranch %388
+        %390 = OpLabel
+        %420 = OpAccessChain %_ptr_Function_int %tree %370 %uint_1
+        %421 = OpLoad %int %420
+               OpStore %x_275 %421
+        %422 = OpLoad %bool %x_247
+               OpStore %x_248_phi %422
+        %423 = OpLoad %int %x_275
+               OpStore %x_251_phi %423
+               OpBranch %361
+        %388 = OpLabel
+               OpBranch %381
+        %383 = OpLabel
+        %424 = OpAccessChain %_ptr_Function_int %tree %370 %uint_2
+        %425 = OpLoad %int %424
+        %426 = OpIEqual %bool %425 %int_n1
+               OpSelectionMerge %427 None
+               OpBranchConditional %426 %428 %429
+        %428 = OpLabel
+        %430 = OpAccessChain %_ptr_Function_int %tree %370 %uint_2
+               OpStore %430 %int_4
+        %431 = OpAccessChain %_ptr_Function_BST %tree %int_4
+               OpStore %431 %404
+               OpStore %x_296_phi %true
+               OpBranch %360
+        %429 = OpLabel
+        %432 = OpAccessChain %_ptr_Function_int %tree %370 %uint_2
+        %433 = OpLoad %int %432
+               OpStore %x_267 %433
+        %434 = OpLoad %bool %x_247
+               OpStore %x_248_phi %434
+        %435 = OpLoad %int %x_267
+               OpStore %x_251_phi %435
+               OpBranch %361
+        %427 = OpLabel
+               OpReturn
+        %381 = OpLabel
+        %436 = OpLoad %bool %x_294
+               OpStore %x_248_phi %436
+               OpStore %x_251_phi %370
+               OpBranch %361
+        %361 = OpLabel
+        %437 = OpLoad %bool %x_248_phi
+               OpStore %x_248 %437
+        %438 = OpLoad %int %x_251_phi
+               OpStore %x_251 %438
+        %439 = OpLoad %bool %x_248
+               OpStore %x_247_phi %439
+        %440 = OpLoad %int %x_251
+               OpStore %x_250_phi %440
+               OpBranch %359
+        %360 = OpLabel
+        %441 = OpLoad %bool %x_296_phi
+               OpSelectionMerge %442 None
+               OpBranchConditional %441 %443 %442
+        %443 = OpLabel
+               OpBranch %357
+        %442 = OpLabel
+               OpBranch %357
+        %357 = OpLabel
+               OpSelectionMerge %449 None
+               OpSwitch %uint_0 %450
+        %450 = OpLabel
+               OpStore %x_301_phi %false
+               OpStore %x_304_phi %int_0
+               OpBranch %451
+        %451 = OpLabel
+               OpLoopMerge %452 %453 None
+               OpBranch %454
+        %454 = OpLabel
+        %461 = OpLoad %bool %x_301_phi
+               OpStore %x_301 %461
+        %462 = OpLoad %int %x_304_phi
+        %463 = OpLoad %bool %x_301
+               OpStore %x_350_phi %463
+        %464 = OpSLessThanEqual %bool %462 %int_5
+               OpSelectionMerge %465 None
+               OpBranchConditional %464 %466 %467
+        %466 = OpLabel
+               OpBranch %465
+        %467 = OpLabel
+               OpBranch %452
+        %465 = OpLabel
+        %468 = OpAccessChain %_ptr_Function_int %tree %462 %uint_0
+        %469 = OpLoad %int %468
+        %471 = OpSLessThanEqual %bool %int_8 %469
+               OpSelectionMerge %472 None
+               OpBranchConditional %471 %473 %474
+        %473 = OpLabel
+        %476 = OpAccessChain %_ptr_Function_int %tree %462 %uint_1
+        %477 = OpLoad %int %476
+        %478 = OpIEqual %bool %477 %int_n1
+               OpSelectionMerge %479 None
+               OpBranchConditional %478 %480 %481
+        %480 = OpLabel
+        %482 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+        %483 = OpLoad %float %482
+        %484 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+        %485 = OpLoad %float %484
+        %486 = OpFOrdLessThan %bool %483 %485
+               OpSelectionMerge %487 None
+               OpBranchConditional %486 %488 %487
+        %488 = OpLabel
+               OpBranch %489
+        %489 = OpLabel
+               OpLoopMerge %490 %491 None
+               OpBranch %492
+        %492 = OpLabel
+               OpKill
+        %491 = OpLabel
+               OpBranch %489
+        %490 = OpLabel
+               OpReturn
+        %487 = OpLabel
+        %493 = OpAccessChain %_ptr_Function_int %tree %462 %uint_1
+               OpStore %493 %int_5
+        %494 = OpAccessChain %_ptr_Function_BST %tree %int_5
+               OpStore %494 %495
+               OpBranch %496
+        %496 = OpLabel
+               OpLoopMerge %497 %498 None
+               OpBranch %499
+        %499 = OpLabel
+        %500 = OpLoad %bool %x_301
+               OpStore %x_348_phi %500
+        %501 = OpConvertFToS %int %483
+        %502 = OpSLessThan %bool %int_0 %501
+               OpSelectionMerge %503 None
+               OpBranchConditional %502 %504 %505
+        %504 = OpLabel
+               OpBranch %503
+        %505 = OpLabel
+               OpBranch %497
+        %503 = OpLabel
+               OpStore %x_348_phi %true
+               OpBranch %497
+        %498 = OpLabel
+               OpBranch %496
+        %497 = OpLabel
+        %506 = OpLoad %bool %x_348_phi
+               OpStore %x_348 %506
+        %507 = OpLoad %bool %x_348
+               OpStore %x_350_phi %507
+        %508 = OpLoad %bool %x_348
+               OpSelectionMerge %509 None
+               OpBranchConditional %508 %510 %509
+        %510 = OpLabel
+               OpBranch %452
+        %509 = OpLabel
+               OpBranch %479
+        %481 = OpLabel
+        %511 = OpAccessChain %_ptr_Function_int %tree %462 %uint_1
+        %512 = OpLoad %int %511
+               OpStore %x_329 %512
+        %513 = OpLoad %bool %x_301
+               OpStore %x_302_phi %513
+        %514 = OpLoad %int %x_329
+               OpStore %x_305_phi %514
+               OpBranch %453
+        %479 = OpLabel
+               OpBranch %472
+        %474 = OpLabel
+        %515 = OpAccessChain %_ptr_Function_int %tree %462 %uint_2
+        %516 = OpLoad %int %515
+        %517 = OpIEqual %bool %516 %int_n1
+               OpSelectionMerge %518 None
+               OpBranchConditional %517 %519 %520
+        %519 = OpLabel
+        %521 = OpAccessChain %_ptr_Function_int %tree %462 %uint_2
+               OpStore %521 %int_5
+        %522 = OpAccessChain %_ptr_Function_BST %tree %int_5
+               OpStore %522 %495
+               OpStore %x_350_phi %true
+               OpBranch %452
+        %520 = OpLabel
+        %523 = OpAccessChain %_ptr_Function_int %tree %462 %uint_2
+        %524 = OpLoad %int %523
+               OpStore %x_321 %524
+        %525 = OpLoad %bool %x_301
+               OpStore %x_302_phi %525
+        %526 = OpLoad %int %x_321
+               OpStore %x_305_phi %526
+               OpBranch %453
+        %518 = OpLabel
+               OpReturn
+        %472 = OpLabel
+        %527 = OpLoad %bool %x_348
+               OpStore %x_302_phi %527
+               OpStore %x_305_phi %462
+               OpBranch %453
+        %453 = OpLabel
+        %528 = OpLoad %bool %x_302_phi
+               OpStore %x_302 %528
+        %529 = OpLoad %int %x_305_phi
+               OpStore %x_305 %529
+        %530 = OpLoad %bool %x_302
+               OpStore %x_301_phi %530
+        %531 = OpLoad %int %x_305
+               OpStore %x_304_phi %531
+               OpBranch %451
+        %452 = OpLabel
+        %532 = OpLoad %bool %x_350_phi
+               OpSelectionMerge %533 None
+               OpBranchConditional %532 %534 %533
+        %534 = OpLabel
+               OpBranch %449
+        %533 = OpLabel
+               OpBranch %449
+        %449 = OpLabel
+               OpSelectionMerge %540 None
+               OpSwitch %uint_0 %541
+        %541 = OpLabel
+               OpStore %x_355_phi %false
+               OpStore %x_358_phi %int_0
+               OpBranch %542
+        %542 = OpLabel
+               OpLoopMerge %543 %544 None
+               OpBranch %545
+        %545 = OpLabel
+        %552 = OpLoad %bool %x_355_phi
+               OpStore %x_355 %552
+        %553 = OpLoad %int %x_358_phi
+        %554 = OpLoad %bool %x_355
+               OpStore %x_404_phi %554
+        %556 = OpSLessThanEqual %bool %553 %int_6
+               OpSelectionMerge %557 None
+               OpBranchConditional %556 %558 %559
+        %558 = OpLabel
+               OpBranch %557
+        %559 = OpLabel
+               OpBranch %543
+        %557 = OpLabel
+        %560 = OpAccessChain %_ptr_Function_int %tree %553 %uint_0
+        %561 = OpLoad %int %560
+        %562 = OpSLessThanEqual %bool %int_2 %561
+               OpSelectionMerge %563 None
+               OpBranchConditional %562 %564 %565
+        %564 = OpLabel
+        %567 = OpAccessChain %_ptr_Function_int %tree %553 %uint_1
+        %568 = OpLoad %int %567
+        %569 = OpIEqual %bool %568 %int_n1
+               OpSelectionMerge %570 None
+               OpBranchConditional %569 %571 %572
+        %571 = OpLabel
+        %573 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+        %574 = OpLoad %float %573
+        %575 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+        %576 = OpLoad %float %575
+        %577 = OpFOrdLessThan %bool %574 %576
+               OpSelectionMerge %578 None
+               OpBranchConditional %577 %579 %578
+        %579 = OpLabel
+               OpBranch %580
+        %580 = OpLabel
+               OpLoopMerge %581 %582 None
+               OpBranch %583
+        %583 = OpLabel
+               OpKill
+        %582 = OpLabel
+               OpBranch %580
+        %581 = OpLabel
+               OpReturn
+        %578 = OpLabel
+        %584 = OpAccessChain %_ptr_Function_int %tree %553 %uint_1
+               OpStore %584 %int_6
+        %585 = OpAccessChain %_ptr_Function_BST %tree %int_6
+               OpStore %585 %586
+               OpBranch %587
+        %587 = OpLabel
+               OpLoopMerge %588 %589 None
+               OpBranch %590
+        %590 = OpLabel
+        %591 = OpLoad %bool %x_355
+               OpStore %x_402_phi %591
+        %592 = OpConvertFToS %int %574
+        %593 = OpSLessThan %bool %int_0 %592
+               OpSelectionMerge %594 None
+               OpBranchConditional %593 %595 %596
+        %595 = OpLabel
+               OpBranch %594
+        %596 = OpLabel
+               OpBranch %588
+        %594 = OpLabel
+               OpStore %x_402_phi %true
+               OpBranch %588
+        %589 = OpLabel
+               OpBranch %587
+        %588 = OpLabel
+        %597 = OpLoad %bool %x_402_phi
+               OpStore %x_402 %597
+        %598 = OpLoad %bool %x_402
+               OpStore %x_404_phi %598
+        %599 = OpLoad %bool %x_402
+               OpSelectionMerge %600 None
+               OpBranchConditional %599 %601 %600
+        %601 = OpLabel
+               OpBranch %543
+        %600 = OpLabel
+               OpBranch %570
+        %572 = OpLabel
+        %602 = OpAccessChain %_ptr_Function_int %tree %553 %uint_1
+        %603 = OpLoad %int %602
+               OpStore %x_383 %603
+        %604 = OpLoad %bool %x_355
+               OpStore %x_356_phi %604
+        %605 = OpLoad %int %x_383
+               OpStore %x_359_phi %605
+               OpBranch %544
+        %570 = OpLabel
+               OpBranch %563
+        %565 = OpLabel
+        %606 = OpAccessChain %_ptr_Function_int %tree %553 %uint_2
+        %607 = OpLoad %int %606
+        %608 = OpIEqual %bool %607 %int_n1
+               OpSelectionMerge %609 None
+               OpBranchConditional %608 %610 %611
+        %610 = OpLabel
+        %612 = OpAccessChain %_ptr_Function_int %tree %553 %uint_2
+               OpStore %612 %int_6
+        %613 = OpAccessChain %_ptr_Function_BST %tree %int_6
+               OpStore %613 %586
+               OpStore %x_404_phi %true
+               OpBranch %543
+        %611 = OpLabel
+        %614 = OpAccessChain %_ptr_Function_int %tree %553 %uint_2
+        %615 = OpLoad %int %614
+               OpStore %x_375 %615
+        %616 = OpLoad %bool %x_355
+               OpStore %x_356_phi %616
+        %617 = OpLoad %int %x_375
+               OpStore %x_359_phi %617
+               OpBranch %544
+        %609 = OpLabel
+               OpReturn
+        %563 = OpLabel
+        %618 = OpLoad %bool %x_402
+               OpStore %x_356_phi %618
+               OpStore %x_359_phi %553
+               OpBranch %544
+        %544 = OpLabel
+        %619 = OpLoad %bool %x_356_phi
+               OpStore %x_356 %619
+        %620 = OpLoad %int %x_359_phi
+               OpStore %x_359 %620
+        %621 = OpLoad %bool %x_356
+               OpStore %x_355_phi %621
+        %622 = OpLoad %int %x_359
+               OpStore %x_358_phi %622
+               OpBranch %542
+        %543 = OpLabel
+        %623 = OpLoad %bool %x_404_phi
+               OpSelectionMerge %624 None
+               OpBranchConditional %623 %625 %624
+        %625 = OpLabel
+               OpBranch %540
+        %624 = OpLabel
+               OpBranch %540
+        %540 = OpLabel
+               OpSelectionMerge %631 None
+               OpSwitch %uint_0 %632
+        %632 = OpLabel
+               OpStore %x_409_phi %false
+               OpStore %x_412_phi %int_0
+               OpBranch %633
+        %633 = OpLabel
+               OpLoopMerge %634 %635 None
+               OpBranch %636
+        %636 = OpLabel
+        %643 = OpLoad %bool %x_409_phi
+               OpStore %x_409 %643
+        %644 = OpLoad %int %x_412_phi
+        %645 = OpLoad %bool %x_409
+               OpStore %x_458_phi %645
+        %646 = OpSLessThanEqual %bool %644 %int_7
+               OpSelectionMerge %647 None
+               OpBranchConditional %646 %648 %649
+        %648 = OpLabel
+               OpBranch %647
+        %649 = OpLabel
+               OpBranch %634
+        %647 = OpLabel
+        %650 = OpAccessChain %_ptr_Function_int %tree %644 %uint_0
+        %651 = OpLoad %int %650
+        %652 = OpSLessThanEqual %bool %int_6 %651
+               OpSelectionMerge %653 None
+               OpBranchConditional %652 %654 %655
+        %654 = OpLabel
+        %657 = OpAccessChain %_ptr_Function_int %tree %644 %uint_1
+        %658 = OpLoad %int %657
+        %659 = OpIEqual %bool %658 %int_n1
+               OpSelectionMerge %660 None
+               OpBranchConditional %659 %661 %662
+        %661 = OpLabel
+        %663 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+        %664 = OpLoad %float %663
+        %665 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+        %666 = OpLoad %float %665
+        %667 = OpFOrdLessThan %bool %664 %666
+               OpSelectionMerge %668 None
+               OpBranchConditional %667 %669 %668
+        %669 = OpLabel
+               OpBranch %670
+        %670 = OpLabel
+               OpLoopMerge %671 %672 None
+               OpBranch %673
+        %673 = OpLabel
+               OpKill
+        %672 = OpLabel
+               OpBranch %670
+        %671 = OpLabel
+               OpReturn
+        %668 = OpLabel
+        %674 = OpAccessChain %_ptr_Function_int %tree %644 %uint_1
+               OpStore %674 %int_7
+        %675 = OpAccessChain %_ptr_Function_BST %tree %int_7
+               OpStore %675 %676
+               OpBranch %677
+        %677 = OpLabel
+               OpLoopMerge %678 %679 None
+               OpBranch %680
+        %680 = OpLabel
+        %681 = OpLoad %bool %x_409
+               OpStore %x_456_phi %681
+        %682 = OpConvertFToS %int %664
+        %683 = OpSLessThan %bool %int_0 %682
+               OpSelectionMerge %684 None
+               OpBranchConditional %683 %685 %686
+        %685 = OpLabel
+               OpBranch %684
+        %686 = OpLabel
+               OpBranch %678
+        %684 = OpLabel
+               OpStore %x_456_phi %true
+               OpBranch %678
+        %679 = OpLabel
+               OpBranch %677
+        %678 = OpLabel
+        %687 = OpLoad %bool %x_456_phi
+               OpStore %x_456 %687
+        %688 = OpLoad %bool %x_456
+               OpStore %x_458_phi %688
+        %689 = OpLoad %bool %x_456
+               OpSelectionMerge %690 None
+               OpBranchConditional %689 %691 %690
+        %691 = OpLabel
+               OpBranch %634
+        %690 = OpLabel
+               OpBranch %660
+        %662 = OpLabel
+        %692 = OpAccessChain %_ptr_Function_int %tree %644 %uint_1
+        %693 = OpLoad %int %692
+               OpStore %x_437 %693
+        %694 = OpLoad %bool %x_409
+               OpStore %x_410_phi %694
+        %695 = OpLoad %int %x_437
+               OpStore %x_413_phi %695
+               OpBranch %635
+        %660 = OpLabel
+               OpBranch %653
+        %655 = OpLabel
+        %696 = OpAccessChain %_ptr_Function_int %tree %644 %uint_2
+        %697 = OpLoad %int %696
+        %698 = OpIEqual %bool %697 %int_n1
+               OpSelectionMerge %699 None
+               OpBranchConditional %698 %700 %701
+        %700 = OpLabel
+        %702 = OpAccessChain %_ptr_Function_int %tree %644 %uint_2
+               OpStore %702 %int_7
+        %703 = OpAccessChain %_ptr_Function_BST %tree %int_7
+               OpStore %703 %676
+               OpStore %x_458_phi %true
+               OpBranch %634
+        %701 = OpLabel
+        %704 = OpAccessChain %_ptr_Function_int %tree %644 %uint_2
+        %705 = OpLoad %int %704
+               OpStore %x_429 %705
+        %706 = OpLoad %bool %x_409
+               OpStore %x_410_phi %706
+        %707 = OpLoad %int %x_429
+               OpStore %x_413_phi %707
+               OpBranch %635
+        %699 = OpLabel
+               OpReturn
+        %653 = OpLabel
+        %708 = OpLoad %bool %x_456
+               OpStore %x_410_phi %708
+               OpStore %x_413_phi %644
+               OpBranch %635
+        %635 = OpLabel
+        %709 = OpLoad %bool %x_410_phi
+               OpStore %x_410 %709
+        %710 = OpLoad %int %x_413_phi
+               OpStore %x_413 %710
+        %711 = OpLoad %bool %x_410
+               OpStore %x_409_phi %711
+        %712 = OpLoad %int %x_413
+               OpStore %x_412_phi %712
+               OpBranch %633
+        %634 = OpLabel
+        %713 = OpLoad %bool %x_458_phi
+               OpSelectionMerge %714 None
+               OpBranchConditional %713 %715 %714
+        %715 = OpLabel
+               OpBranch %631
+        %714 = OpLabel
+               OpBranch %631
+        %631 = OpLabel
+               OpSelectionMerge %721 None
+               OpSwitch %uint_0 %722
+        %722 = OpLabel
+               OpStore %x_463_phi %false
+               OpStore %x_466_phi %int_0
+               OpBranch %723
+        %723 = OpLabel
+               OpLoopMerge %724 %725 None
+               OpBranch %726
+        %726 = OpLabel
+        %733 = OpLoad %bool %x_463_phi
+               OpStore %x_463 %733
+        %734 = OpLoad %int %x_466_phi
+        %735 = OpLoad %bool %x_463
+               OpStore %x_512_phi %735
+        %736 = OpSLessThanEqual %bool %734 %int_8
+               OpSelectionMerge %737 None
+               OpBranchConditional %736 %738 %739
+        %738 = OpLabel
+               OpBranch %737
+        %739 = OpLabel
+               OpBranch %724
+        %737 = OpLabel
+        %740 = OpAccessChain %_ptr_Function_int %tree %734 %uint_0
+        %741 = OpLoad %int %740
+        %743 = OpSLessThanEqual %bool %int_17 %741
+               OpSelectionMerge %744 None
+               OpBranchConditional %743 %745 %746
+        %745 = OpLabel
+        %748 = OpAccessChain %_ptr_Function_int %tree %734 %uint_1
+        %749 = OpLoad %int %748
+        %750 = OpIEqual %bool %749 %int_n1
+               OpSelectionMerge %751 None
+               OpBranchConditional %750 %752 %753
+        %752 = OpLabel
+        %754 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+        %755 = OpLoad %float %754
+        %756 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+        %757 = OpLoad %float %756
+        %758 = OpFOrdLessThan %bool %755 %757
+               OpSelectionMerge %759 None
+               OpBranchConditional %758 %760 %759
+        %760 = OpLabel
+               OpBranch %761
+        %761 = OpLabel
+               OpLoopMerge %762 %763 None
+               OpBranch %764
+        %764 = OpLabel
+               OpKill
+        %763 = OpLabel
+               OpBranch %761
+        %762 = OpLabel
+               OpReturn
+        %759 = OpLabel
+        %765 = OpAccessChain %_ptr_Function_int %tree %734 %uint_1
+               OpStore %765 %int_8
+        %766 = OpAccessChain %_ptr_Function_BST %tree %int_8
+               OpStore %766 %767
+               OpBranch %768
+        %768 = OpLabel
+               OpLoopMerge %769 %770 None
+               OpBranch %771
+        %771 = OpLabel
+        %772 = OpLoad %bool %x_463
+               OpStore %x_510_phi %772
+        %773 = OpConvertFToS %int %755
+        %774 = OpSLessThan %bool %int_0 %773
+               OpSelectionMerge %775 None
+               OpBranchConditional %774 %776 %777
+        %776 = OpLabel
+               OpBranch %775
+        %777 = OpLabel
+               OpBranch %769
+        %775 = OpLabel
+               OpStore %x_510_phi %true
+               OpBranch %769
+        %770 = OpLabel
+               OpBranch %768
+        %769 = OpLabel
+        %778 = OpLoad %bool %x_510_phi
+               OpStore %x_510 %778
+        %779 = OpLoad %bool %x_510
+               OpStore %x_512_phi %779
+        %780 = OpLoad %bool %x_510
+               OpSelectionMerge %781 None
+               OpBranchConditional %780 %782 %781
+        %782 = OpLabel
+               OpBranch %724
+        %781 = OpLabel
+               OpBranch %751
+        %753 = OpLabel
+        %783 = OpAccessChain %_ptr_Function_int %tree %734 %uint_1
+        %784 = OpLoad %int %783
+               OpStore %x_491 %784
+        %785 = OpLoad %bool %x_463
+               OpStore %x_464_phi %785
+        %786 = OpLoad %int %x_491
+               OpStore %x_467_phi %786
+               OpBranch %725
+        %751 = OpLabel
+               OpBranch %744
+        %746 = OpLabel
+        %787 = OpAccessChain %_ptr_Function_int %tree %734 %uint_2
+        %788 = OpLoad %int %787
+        %789 = OpIEqual %bool %788 %int_n1
+               OpSelectionMerge %790 None
+               OpBranchConditional %789 %791 %792
+        %791 = OpLabel
+        %793 = OpAccessChain %_ptr_Function_int %tree %734 %uint_2
+               OpStore %793 %int_8
+        %794 = OpAccessChain %_ptr_Function_BST %tree %int_8
+               OpStore %794 %767
+               OpStore %x_512_phi %true
+               OpBranch %724
+        %792 = OpLabel
+        %795 = OpAccessChain %_ptr_Function_int %tree %734 %uint_2
+        %796 = OpLoad %int %795
+               OpStore %x_483 %796
+        %797 = OpLoad %bool %x_463
+               OpStore %x_464_phi %797
+        %798 = OpLoad %int %x_483
+               OpStore %x_467_phi %798
+               OpBranch %725
+        %790 = OpLabel
+               OpReturn
+        %744 = OpLabel
+        %799 = OpLoad %bool %x_510
+               OpStore %x_464_phi %799
+               OpStore %x_467_phi %734
+               OpBranch %725
+        %725 = OpLabel
+        %800 = OpLoad %bool %x_464_phi
+               OpStore %x_464 %800
+        %801 = OpLoad %int %x_467_phi
+               OpStore %x_467 %801
+        %802 = OpLoad %bool %x_464
+               OpStore %x_463_phi %802
+        %803 = OpLoad %int %x_467
+               OpStore %x_466_phi %803
+               OpBranch %723
+        %724 = OpLabel
+        %804 = OpLoad %bool %x_512_phi
+               OpSelectionMerge %805 None
+               OpBranchConditional %804 %806 %805
+        %806 = OpLabel
+               OpBranch %721
+        %805 = OpLabel
+               OpBranch %721
+        %721 = OpLabel
+               OpSelectionMerge %812 None
+               OpSwitch %uint_0 %813
+        %813 = OpLabel
+               OpStore %x_517_phi %false
+               OpStore %x_520_phi %int_0
+               OpBranch %814
+        %814 = OpLabel
+               OpLoopMerge %815 %816 None
+               OpBranch %817
+        %817 = OpLabel
+        %824 = OpLoad %bool %x_517_phi
+               OpStore %x_517 %824
+        %825 = OpLoad %int %x_520_phi
+        %826 = OpLoad %bool %x_517
+               OpStore %x_566_phi %826
+        %827 = OpSLessThanEqual %bool %825 %int_9
+               OpSelectionMerge %828 None
+               OpBranchConditional %827 %829 %830
+        %829 = OpLabel
+               OpBranch %828
+        %830 = OpLabel
+               OpBranch %815
+        %828 = OpLabel
+        %831 = OpAccessChain %_ptr_Function_int %tree %825 %uint_0
+        %832 = OpLoad %int %831
+        %834 = OpSLessThanEqual %bool %int_13 %832
+               OpSelectionMerge %835 None
+               OpBranchConditional %834 %836 %837
+        %836 = OpLabel
+        %839 = OpAccessChain %_ptr_Function_int %tree %825 %uint_1
+        %840 = OpLoad %int %839
+        %841 = OpIEqual %bool %840 %int_n1
+               OpSelectionMerge %842 None
+               OpBranchConditional %841 %843 %844
+        %843 = OpLabel
+        %845 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+        %846 = OpLoad %float %845
+        %847 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+        %848 = OpLoad %float %847
+        %849 = OpFOrdLessThan %bool %846 %848
+               OpSelectionMerge %850 None
+               OpBranchConditional %849 %851 %850
+        %851 = OpLabel
+               OpBranch %852
+        %852 = OpLabel
+               OpLoopMerge %853 %854 None
+               OpBranch %855
+        %855 = OpLabel
+               OpKill
+        %854 = OpLabel
+               OpBranch %852
+        %853 = OpLabel
+               OpReturn
+        %850 = OpLabel
+        %856 = OpAccessChain %_ptr_Function_int %tree %825 %uint_1
+               OpStore %856 %int_9
+        %857 = OpAccessChain %_ptr_Function_BST %tree %int_9
+               OpStore %857 %858
+               OpBranch %859
+        %859 = OpLabel
+               OpLoopMerge %860 %861 None
+               OpBranch %862
+        %862 = OpLabel
+        %863 = OpLoad %bool %x_517
+               OpStore %x_564_phi %863
+        %864 = OpConvertFToS %int %846
+        %865 = OpSLessThan %bool %int_0 %864
+               OpSelectionMerge %866 None
+               OpBranchConditional %865 %867 %868
+        %867 = OpLabel
+               OpBranch %866
+        %868 = OpLabel
+               OpBranch %860
+        %866 = OpLabel
+               OpStore %x_564_phi %true
+               OpBranch %860
+        %861 = OpLabel
+               OpBranch %859
+        %860 = OpLabel
+        %869 = OpLoad %bool %x_564_phi
+               OpStore %x_564 %869
+        %870 = OpLoad %bool %x_564
+               OpStore %x_566_phi %870
+        %871 = OpLoad %bool %x_564
+               OpSelectionMerge %872 None
+               OpBranchConditional %871 %873 %872
+        %873 = OpLabel
+               OpBranch %815
+        %872 = OpLabel
+               OpBranch %842
+        %844 = OpLabel
+        %874 = OpAccessChain %_ptr_Function_int %tree %825 %uint_1
+        %875 = OpLoad %int %874
+               OpStore %x_545 %875
+        %876 = OpLoad %bool %x_517
+               OpStore %x_518_phi %876
+        %877 = OpLoad %int %x_545
+               OpStore %x_521_phi %877
+               OpBranch %816
+        %842 = OpLabel
+               OpBranch %835
+        %837 = OpLabel
+        %878 = OpAccessChain %_ptr_Function_int %tree %825 %uint_2
+        %879 = OpLoad %int %878
+        %880 = OpIEqual %bool %879 %int_n1
+               OpSelectionMerge %881 None
+               OpBranchConditional %880 %882 %883
+        %882 = OpLabel
+        %884 = OpAccessChain %_ptr_Function_int %tree %825 %uint_2
+               OpStore %884 %int_9
+        %885 = OpAccessChain %_ptr_Function_BST %tree %int_9
+               OpStore %885 %858
+               OpStore %x_566_phi %true
+               OpBranch %815
+        %883 = OpLabel
+        %886 = OpAccessChain %_ptr_Function_int %tree %825 %uint_2
+        %887 = OpLoad %int %886
+               OpStore %x_537 %887
+        %888 = OpLoad %bool %x_517
+               OpStore %x_518_phi %888
+        %889 = OpLoad %int %x_537
+               OpStore %x_521_phi %889
+               OpBranch %816
+        %881 = OpLabel
+               OpReturn
+        %835 = OpLabel
+        %890 = OpLoad %bool %x_564
+               OpStore %x_518_phi %890
+               OpStore %x_521_phi %825
+               OpBranch %816
+        %816 = OpLabel
+        %891 = OpLoad %bool %x_518_phi
+               OpStore %x_518 %891
+        %892 = OpLoad %int %x_521_phi
+               OpStore %x_521 %892
+        %893 = OpLoad %bool %x_518
+               OpStore %x_517_phi %893
+        %894 = OpLoad %int %x_521
+               OpStore %x_520_phi %894
+               OpBranch %814
+        %815 = OpLabel
+        %895 = OpLoad %bool %x_566_phi
+               OpSelectionMerge %896 None
+               OpBranchConditional %895 %897 %896
+        %897 = OpLabel
+               OpBranch %812
+        %896 = OpLabel
+               OpBranch %812
+        %812 = OpLabel
+               OpStore %x_569_phi %int_0
+               OpStore %x_572_phi %int_0
+               OpStore %x_574_phi %int_0
+               OpBranch %898
+        %898 = OpLabel
+               OpLoopMerge %899 %900 None
+               OpBranch %901
+        %901 = OpLabel
+        %908 = OpLoad %int %x_569_phi
+        %909 = OpLoad %int %x_572_phi
+               OpStore %x_572 %909
+        %910 = OpLoad %int %x_574_phi
+        %912 = OpSLessThan %bool %910 %int_20
+               OpSelectionMerge %913 None
+               OpBranchConditional %912 %914 %915
+        %914 = OpLabel
+               OpBranch %913
+        %915 = OpLabel
+               OpBranch %899
+        %913 = OpLabel
+               OpSelectionMerge %919 None
+               OpSwitch %uint_0 %920
+        %920 = OpLabel
+               OpStore %x_582_phi %int_0
+               OpBranch %921
+        %921 = OpLabel
+               OpLoopMerge %922 %923 None
+               OpBranch %924
+        %924 = OpLabel
+        %925 = OpLoad %int %x_582_phi
+               OpStore %x_597_phi %908
+               OpStore %x_598_phi %false
+        %926 = OpINotEqual %bool %925 %int_n1
+               OpSelectionMerge %927 None
+               OpBranchConditional %926 %928 %929
+        %928 = OpLabel
+               OpBranch %927
+        %929 = OpLabel
+               OpBranch %922
+        %927 = OpLabel
+        %930 = OpAccessChain %_ptr_Function_BST %tree %925
+        %931 = OpLoad %BST %930
+        %932 = OpCompositeExtract %int %931 0
+        %933 = OpCompositeExtract %int %931 1
+        %934 = OpCompositeExtract %int %931 2
+        %935 = OpIEqual %bool %932 %910
+               OpSelectionMerge %936 None
+               OpBranchConditional %935 %937 %936
+        %937 = OpLabel
+               OpStore %x_597_phi %910
+               OpStore %x_598_phi %true
+               OpBranch %922
+        %936 = OpLabel
+               OpBranch %923
+        %923 = OpLabel
+        %939 = OpSGreaterThan %bool %910 %932
+        %938 = OpSelect %int %939 %934 %933
+               OpStore %x_582_phi %938
+               OpBranch %921
+        %922 = OpLabel
+        %940 = OpLoad %int %x_597_phi
+               OpStore %x_597 %940
+        %941 = OpLoad %bool %x_598_phi
+        %942 = OpLoad %int %x_597
+               OpStore %x_570_phi %942
+               OpSelectionMerge %943 None
+               OpBranchConditional %941 %944 %943
+        %944 = OpLabel
+               OpBranch %919
+        %943 = OpLabel
+               OpStore %x_570_phi %int_n1
+               OpBranch %919
+        %919 = OpLabel
+        %950 = OpLoad %int %x_570_phi
+               OpStore %x_570 %950
+               OpSelectionMerge %951 None
+               OpSwitch %910 %952 2 %953 5 %953 6 %953 7 %953 8 %953 9 %953 12 %953 13 %953 15 %953 17 %953
+        %953 = OpLabel
+        %954 = OpLoad %int %x_572
+               OpStore %x_607_phi %954
+        %955 = OpLoad %int %x_570
+        %956 = OpCopyObject %int %910
+        %957 = OpIEqual %bool %955 %956
+               OpSelectionMerge %958 None
+               OpBranchConditional %957 %959 %958
+        %959 = OpLabel
+        %961 = OpLoad %int %x_572
+        %962 = OpCopyObject %int %int_1
+        %963 = OpIAdd %int %961 %962
+        %960 = OpCopyObject %int %963
+               OpStore %x_606 %960
+        %964 = OpLoad %int %x_606
+               OpStore %x_607_phi %964
+               OpBranch %958
+        %958 = OpLabel
+        %965 = OpLoad %int %x_607_phi
+               OpStore %x_607 %965
+        %966 = OpLoad %int %x_607
+               OpStore %x_573_phi %966
+               OpBranch %951
+        %952 = OpLabel
+        %967 = OpLoad %int %x_572
+               OpStore %x_612_phi %967
+        %968 = OpLoad %int %x_570
+        %969 = OpCopyObject %int %int_n1
+        %970 = OpIEqual %bool %968 %969
+               OpSelectionMerge %971 None
+               OpBranchConditional %970 %972 %971
+        %972 = OpLabel
+        %974 = OpLoad %int %x_572
+        %975 = OpCopyObject %int %int_1
+        %976 = OpIAdd %int %974 %975
+        %973 = OpCopyObject %int %976
+               OpStore %x_611 %973
+        %977 = OpLoad %int %x_611
+               OpStore %x_612_phi %977
+               OpBranch %971
+        %971 = OpLabel
+        %978 = OpLoad %int %x_612_phi
+               OpStore %x_612 %978
+        %979 = OpLoad %int %x_612
+               OpStore %x_573_phi %979
+               OpBranch %951
+        %951 = OpLabel
+        %980 = OpLoad %int %x_573_phi
+               OpBranch %900
+        %900 = OpLabel
+        %981 = OpIAdd %int %910 %int_1
+               OpStore %x_575 %981
+        %982 = OpLoad %int %x_570
+               OpStore %x_569_phi %982
+               OpStore %x_572_phi %980
+        %983 = OpLoad %int %x_575
+               OpStore %x_574_phi %983
+               OpBranch %898
+        %899 = OpLabel
+        %984 = OpLoad %int %x_572
+        %985 = OpCopyObject %int %int_20
+        %986 = OpIEqual %bool %984 %985
+               OpSelectionMerge %987 None
+               OpBranchConditional %986 %988 %989
+        %988 = OpLabel
+               OpStore %x_GLF_color %991
+               OpBranch %987
+        %989 = OpLabel
+               OpStore %x_GLF_color %992
+               OpBranch %987
+        %987 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %993
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %997 = OpLabel
+        %998 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %998
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+       %1000 = OpLabel
+       %1001 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %1001
+       %1002 = OpFunctionCall %void %main_1
+       %1004 = OpLoad %v4float %x_GLF_color
+       %1005 = OpCompositeConstruct %main_out %1004
+       %1003 = OpFunctionCall %void %tint_symbol_3 %1005
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..c4e135a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/1.spvasm.expected.wgsl
@@ -0,0 +1,977 @@
+struct BST {
+  data : i32;
+  leftIndex : i32;
+  rightIndex : i32;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var tree : array<BST, 10>;
+  var x_67 : bool;
+  var x_114 : bool;
+  var x_572 : i32;
+  var x_67_phi : bool;
+  var x_70_phi : i32;
+  var x_116_phi : bool;
+  var x_119_phi : i32;
+  var x_569_phi : i32;
+  var x_572_phi : i32;
+  var x_574_phi : i32;
+  tree[0] = BST(9, -1, -1);
+  switch(0u) {
+    default: {
+      x_67_phi = false;
+      x_70_phi = 0;
+      loop {
+        var x_95 : i32;
+        var x_87 : i32;
+        var x_68 : bool;
+        var x_71 : i32;
+        var x_68_phi : bool;
+        var x_71_phi : i32;
+        x_67 = x_67_phi;
+        let x_70 : i32 = x_70_phi;
+        x_116_phi = x_67;
+        if ((x_70 <= 1)) {
+        } else {
+          break;
+        }
+        let x_76 : i32 = tree[x_70].data;
+        if ((5 <= x_76)) {
+          var x_114_phi : bool;
+          let x_89 : ptr<function, i32> = &(tree[x_70].leftIndex);
+          let x_90 : i32 = *(x_89);
+          if ((x_90 == -1)) {
+            let x_97 : f32 = x_8.injectionSwitch.y;
+            let x_99 : f32 = x_8.injectionSwitch.x;
+            if ((x_97 < x_99)) {
+              loop {
+                discard;
+              }
+              return;
+            }
+            *(x_89) = 1;
+            tree[1] = BST(5, -1, -1);
+            loop {
+              x_114_phi = x_67;
+              if ((0 < i32(x_97))) {
+              } else {
+                break;
+              }
+              x_114_phi = true;
+              break;
+            }
+            x_114 = x_114_phi;
+            x_116_phi = x_114;
+            if (x_114) {
+              break;
+            }
+          } else {
+            x_95 = *(x_89);
+            x_68_phi = x_67;
+            x_71_phi = x_95;
+            continue;
+          }
+        } else {
+          let x_81 : ptr<function, i32> = &(tree[x_70].rightIndex);
+          let x_82 : i32 = *(x_81);
+          if ((x_82 == -1)) {
+            *(x_81) = 1;
+            tree[1] = BST(5, -1, -1);
+            x_116_phi = true;
+            break;
+          } else {
+            x_87 = *(x_81);
+            x_68_phi = x_67;
+            x_71_phi = x_87;
+            continue;
+          }
+          return;
+        }
+        x_68_phi = x_114;
+        x_71_phi = x_70;
+
+        continuing {
+          x_68 = x_68_phi;
+          x_71 = x_71_phi;
+          x_67_phi = x_68;
+          x_70_phi = x_71;
+        }
+      }
+      let x_116 : bool = x_116_phi;
+      if (x_116) {
+        break;
+      }
+    }
+  }
+  x_119_phi = 0;
+  loop {
+    var x_133 : bool;
+    var x_120 : i32;
+    var x_134_phi : bool;
+    let x_119 : i32 = x_119_phi;
+    let x_125 : f32 = gl_FragCoord.y;
+    let x_126 : bool = (x_125 < 0.0);
+    x_134_phi = x_126;
+    if (!(x_126)) {
+      let x_131 : f32 = x_8.injectionSwitch.y;
+      x_133 = (x_119 != i32(x_131));
+      x_134_phi = x_133;
+    }
+    let x_134 : bool = x_134_phi;
+    if (x_134) {
+    } else {
+      break;
+    }
+    var x_139 : bool;
+    var x_186 : bool;
+    var x_139_phi : bool;
+    var x_142_phi : i32;
+    var x_188_phi : bool;
+    switch(0u) {
+      default: {
+        x_139_phi = false;
+        x_142_phi = 0;
+        loop {
+          var x_167 : i32;
+          var x_159 : i32;
+          var x_140 : bool;
+          var x_143 : i32;
+          var x_140_phi : bool;
+          var x_143_phi : i32;
+          x_139 = x_139_phi;
+          let x_142 : i32 = x_142_phi;
+          x_188_phi = x_139;
+          if ((x_142 <= 2)) {
+          } else {
+            break;
+          }
+          let x_148 : i32 = tree[x_142].data;
+          if ((12 <= x_148)) {
+            var x_186_phi : bool;
+            let x_161 : ptr<function, i32> = &(tree[x_142].leftIndex);
+            let x_162 : i32 = *(x_161);
+            if ((x_162 == -1)) {
+              let x_169 : f32 = x_8.injectionSwitch.y;
+              let x_171 : f32 = x_8.injectionSwitch.x;
+              if ((x_169 < x_171)) {
+                loop {
+                  discard;
+                }
+                return;
+              }
+              *(x_161) = 2;
+              tree[2] = BST(12, -1, -1);
+              loop {
+                x_186_phi = x_139;
+                if ((0 < i32(x_169))) {
+                } else {
+                  break;
+                }
+                x_186_phi = true;
+                break;
+              }
+              x_186 = x_186_phi;
+              x_188_phi = x_186;
+              if (x_186) {
+                break;
+              }
+            } else {
+              x_167 = *(x_161);
+              x_140_phi = x_139;
+              x_143_phi = x_167;
+              continue;
+            }
+          } else {
+            let x_153 : ptr<function, i32> = &(tree[x_142].rightIndex);
+            let x_154 : i32 = *(x_153);
+            if ((x_154 == -1)) {
+              *(x_153) = 2;
+              tree[2] = BST(12, -1, -1);
+              x_188_phi = true;
+              break;
+            } else {
+              x_159 = *(x_153);
+              x_140_phi = x_139;
+              x_143_phi = x_159;
+              continue;
+            }
+            return;
+          }
+          x_140_phi = x_186;
+          x_143_phi = x_142;
+
+          continuing {
+            x_140 = x_140_phi;
+            x_143 = x_143_phi;
+            x_139_phi = x_140;
+            x_142_phi = x_143;
+          }
+        }
+        let x_188 : bool = x_188_phi;
+        if (x_188) {
+          break;
+        }
+      }
+    }
+
+    continuing {
+      x_120 = (x_119 + 1);
+      x_119_phi = x_120;
+    }
+  }
+  var x_193 : bool;
+  var x_240 : bool;
+  var x_193_phi : bool;
+  var x_196_phi : i32;
+  var x_242_phi : bool;
+  switch(0u) {
+    default: {
+      x_193_phi = false;
+      x_196_phi = 0;
+      loop {
+        var x_221 : i32;
+        var x_213 : i32;
+        var x_194 : bool;
+        var x_197 : i32;
+        var x_194_phi : bool;
+        var x_197_phi : i32;
+        x_193 = x_193_phi;
+        let x_196 : i32 = x_196_phi;
+        x_242_phi = x_193;
+        if ((x_196 <= 3)) {
+        } else {
+          break;
+        }
+        let x_202 : i32 = tree[x_196].data;
+        if ((15 <= x_202)) {
+          var x_240_phi : bool;
+          let x_215 : ptr<function, i32> = &(tree[x_196].leftIndex);
+          let x_216 : i32 = *(x_215);
+          if ((x_216 == -1)) {
+            let x_223 : f32 = x_8.injectionSwitch.y;
+            let x_225 : f32 = x_8.injectionSwitch.x;
+            if ((x_223 < x_225)) {
+              loop {
+                discard;
+              }
+              return;
+            }
+            *(x_215) = 3;
+            tree[3] = BST(15, -1, -1);
+            loop {
+              x_240_phi = x_193;
+              if ((0 < i32(x_223))) {
+              } else {
+                break;
+              }
+              x_240_phi = true;
+              break;
+            }
+            x_240 = x_240_phi;
+            x_242_phi = x_240;
+            if (x_240) {
+              break;
+            }
+          } else {
+            x_221 = *(x_215);
+            x_194_phi = x_193;
+            x_197_phi = x_221;
+            continue;
+          }
+        } else {
+          let x_207 : ptr<function, i32> = &(tree[x_196].rightIndex);
+          let x_208 : i32 = *(x_207);
+          if ((x_208 == -1)) {
+            *(x_207) = 3;
+            tree[3] = BST(15, -1, -1);
+            x_242_phi = true;
+            break;
+          } else {
+            x_213 = *(x_207);
+            x_194_phi = x_193;
+            x_197_phi = x_213;
+            continue;
+          }
+          return;
+        }
+        x_194_phi = x_240;
+        x_197_phi = x_196;
+
+        continuing {
+          x_194 = x_194_phi;
+          x_197 = x_197_phi;
+          x_193_phi = x_194;
+          x_196_phi = x_197;
+        }
+      }
+      let x_242 : bool = x_242_phi;
+      if (x_242) {
+        break;
+      }
+    }
+  }
+  var x_247 : bool;
+  var x_294 : bool;
+  var x_247_phi : bool;
+  var x_250_phi : i32;
+  var x_296_phi : bool;
+  switch(0u) {
+    default: {
+      x_247_phi = false;
+      x_250_phi = 0;
+      loop {
+        var x_275 : i32;
+        var x_267 : i32;
+        var x_248 : bool;
+        var x_251 : i32;
+        var x_248_phi : bool;
+        var x_251_phi : i32;
+        x_247 = x_247_phi;
+        let x_250 : i32 = x_250_phi;
+        x_296_phi = x_247;
+        if ((x_250 <= 4)) {
+        } else {
+          break;
+        }
+        let x_256 : i32 = tree[x_250].data;
+        if ((7 <= x_256)) {
+          var x_294_phi : bool;
+          let x_269 : ptr<function, i32> = &(tree[x_250].leftIndex);
+          let x_270 : i32 = *(x_269);
+          if ((x_270 == -1)) {
+            let x_277 : f32 = x_8.injectionSwitch.y;
+            let x_279 : f32 = x_8.injectionSwitch.x;
+            if ((x_277 < x_279)) {
+              loop {
+                discard;
+              }
+              return;
+            }
+            *(x_269) = 4;
+            tree[4] = BST(7, -1, -1);
+            loop {
+              x_294_phi = x_247;
+              if ((0 < i32(x_277))) {
+              } else {
+                break;
+              }
+              x_294_phi = true;
+              break;
+            }
+            x_294 = x_294_phi;
+            x_296_phi = x_294;
+            if (x_294) {
+              break;
+            }
+          } else {
+            x_275 = *(x_269);
+            x_248_phi = x_247;
+            x_251_phi = x_275;
+            continue;
+          }
+        } else {
+          let x_261 : ptr<function, i32> = &(tree[x_250].rightIndex);
+          let x_262 : i32 = *(x_261);
+          if ((x_262 == -1)) {
+            *(x_261) = 4;
+            tree[4] = BST(7, -1, -1);
+            x_296_phi = true;
+            break;
+          } else {
+            x_267 = *(x_261);
+            x_248_phi = x_247;
+            x_251_phi = x_267;
+            continue;
+          }
+          return;
+        }
+        x_248_phi = x_294;
+        x_251_phi = x_250;
+
+        continuing {
+          x_248 = x_248_phi;
+          x_251 = x_251_phi;
+          x_247_phi = x_248;
+          x_250_phi = x_251;
+        }
+      }
+      let x_296 : bool = x_296_phi;
+      if (x_296) {
+        break;
+      }
+    }
+  }
+  var x_301 : bool;
+  var x_348 : bool;
+  var x_301_phi : bool;
+  var x_304_phi : i32;
+  var x_350_phi : bool;
+  switch(0u) {
+    default: {
+      x_301_phi = false;
+      x_304_phi = 0;
+      loop {
+        var x_329 : i32;
+        var x_321 : i32;
+        var x_302 : bool;
+        var x_305 : i32;
+        var x_302_phi : bool;
+        var x_305_phi : i32;
+        x_301 = x_301_phi;
+        let x_304 : i32 = x_304_phi;
+        x_350_phi = x_301;
+        if ((x_304 <= 5)) {
+        } else {
+          break;
+        }
+        let x_310 : i32 = tree[x_304].data;
+        if ((8 <= x_310)) {
+          var x_348_phi : bool;
+          let x_323 : ptr<function, i32> = &(tree[x_304].leftIndex);
+          let x_324 : i32 = *(x_323);
+          if ((x_324 == -1)) {
+            let x_331 : f32 = x_8.injectionSwitch.y;
+            let x_333 : f32 = x_8.injectionSwitch.x;
+            if ((x_331 < x_333)) {
+              loop {
+                discard;
+              }
+              return;
+            }
+            *(x_323) = 5;
+            tree[5] = BST(8, -1, -1);
+            loop {
+              x_348_phi = x_301;
+              if ((0 < i32(x_331))) {
+              } else {
+                break;
+              }
+              x_348_phi = true;
+              break;
+            }
+            x_348 = x_348_phi;
+            x_350_phi = x_348;
+            if (x_348) {
+              break;
+            }
+          } else {
+            x_329 = *(x_323);
+            x_302_phi = x_301;
+            x_305_phi = x_329;
+            continue;
+          }
+        } else {
+          let x_315 : ptr<function, i32> = &(tree[x_304].rightIndex);
+          let x_316 : i32 = *(x_315);
+          if ((x_316 == -1)) {
+            *(x_315) = 5;
+            tree[5] = BST(8, -1, -1);
+            x_350_phi = true;
+            break;
+          } else {
+            x_321 = *(x_315);
+            x_302_phi = x_301;
+            x_305_phi = x_321;
+            continue;
+          }
+          return;
+        }
+        x_302_phi = x_348;
+        x_305_phi = x_304;
+
+        continuing {
+          x_302 = x_302_phi;
+          x_305 = x_305_phi;
+          x_301_phi = x_302;
+          x_304_phi = x_305;
+        }
+      }
+      let x_350 : bool = x_350_phi;
+      if (x_350) {
+        break;
+      }
+    }
+  }
+  var x_355 : bool;
+  var x_402 : bool;
+  var x_355_phi : bool;
+  var x_358_phi : i32;
+  var x_404_phi : bool;
+  switch(0u) {
+    default: {
+      x_355_phi = false;
+      x_358_phi = 0;
+      loop {
+        var x_383 : i32;
+        var x_375 : i32;
+        var x_356 : bool;
+        var x_359 : i32;
+        var x_356_phi : bool;
+        var x_359_phi : i32;
+        x_355 = x_355_phi;
+        let x_358 : i32 = x_358_phi;
+        x_404_phi = x_355;
+        if ((x_358 <= 6)) {
+        } else {
+          break;
+        }
+        let x_364 : i32 = tree[x_358].data;
+        if ((2 <= x_364)) {
+          var x_402_phi : bool;
+          let x_377 : ptr<function, i32> = &(tree[x_358].leftIndex);
+          let x_378 : i32 = *(x_377);
+          if ((x_378 == -1)) {
+            let x_385 : f32 = x_8.injectionSwitch.y;
+            let x_387 : f32 = x_8.injectionSwitch.x;
+            if ((x_385 < x_387)) {
+              loop {
+                discard;
+              }
+              return;
+            }
+            *(x_377) = 6;
+            tree[6] = BST(2, -1, -1);
+            loop {
+              x_402_phi = x_355;
+              if ((0 < i32(x_385))) {
+              } else {
+                break;
+              }
+              x_402_phi = true;
+              break;
+            }
+            x_402 = x_402_phi;
+            x_404_phi = x_402;
+            if (x_402) {
+              break;
+            }
+          } else {
+            x_383 = *(x_377);
+            x_356_phi = x_355;
+            x_359_phi = x_383;
+            continue;
+          }
+        } else {
+          let x_369 : ptr<function, i32> = &(tree[x_358].rightIndex);
+          let x_370 : i32 = *(x_369);
+          if ((x_370 == -1)) {
+            *(x_369) = 6;
+            tree[6] = BST(2, -1, -1);
+            x_404_phi = true;
+            break;
+          } else {
+            x_375 = *(x_369);
+            x_356_phi = x_355;
+            x_359_phi = x_375;
+            continue;
+          }
+          return;
+        }
+        x_356_phi = x_402;
+        x_359_phi = x_358;
+
+        continuing {
+          x_356 = x_356_phi;
+          x_359 = x_359_phi;
+          x_355_phi = x_356;
+          x_358_phi = x_359;
+        }
+      }
+      let x_404 : bool = x_404_phi;
+      if (x_404) {
+        break;
+      }
+    }
+  }
+  var x_409 : bool;
+  var x_456 : bool;
+  var x_409_phi : bool;
+  var x_412_phi : i32;
+  var x_458_phi : bool;
+  switch(0u) {
+    default: {
+      x_409_phi = false;
+      x_412_phi = 0;
+      loop {
+        var x_437 : i32;
+        var x_429 : i32;
+        var x_410 : bool;
+        var x_413 : i32;
+        var x_410_phi : bool;
+        var x_413_phi : i32;
+        x_409 = x_409_phi;
+        let x_412 : i32 = x_412_phi;
+        x_458_phi = x_409;
+        if ((x_412 <= 7)) {
+        } else {
+          break;
+        }
+        let x_418 : i32 = tree[x_412].data;
+        if ((6 <= x_418)) {
+          var x_456_phi : bool;
+          let x_431 : ptr<function, i32> = &(tree[x_412].leftIndex);
+          let x_432 : i32 = *(x_431);
+          if ((x_432 == -1)) {
+            let x_439 : f32 = x_8.injectionSwitch.y;
+            let x_441 : f32 = x_8.injectionSwitch.x;
+            if ((x_439 < x_441)) {
+              loop {
+                discard;
+              }
+              return;
+            }
+            *(x_431) = 7;
+            tree[7] = BST(6, -1, -1);
+            loop {
+              x_456_phi = x_409;
+              if ((0 < i32(x_439))) {
+              } else {
+                break;
+              }
+              x_456_phi = true;
+              break;
+            }
+            x_456 = x_456_phi;
+            x_458_phi = x_456;
+            if (x_456) {
+              break;
+            }
+          } else {
+            x_437 = *(x_431);
+            x_410_phi = x_409;
+            x_413_phi = x_437;
+            continue;
+          }
+        } else {
+          let x_423 : ptr<function, i32> = &(tree[x_412].rightIndex);
+          let x_424 : i32 = *(x_423);
+          if ((x_424 == -1)) {
+            *(x_423) = 7;
+            tree[7] = BST(6, -1, -1);
+            x_458_phi = true;
+            break;
+          } else {
+            x_429 = *(x_423);
+            x_410_phi = x_409;
+            x_413_phi = x_429;
+            continue;
+          }
+          return;
+        }
+        x_410_phi = x_456;
+        x_413_phi = x_412;
+
+        continuing {
+          x_410 = x_410_phi;
+          x_413 = x_413_phi;
+          x_409_phi = x_410;
+          x_412_phi = x_413;
+        }
+      }
+      let x_458 : bool = x_458_phi;
+      if (x_458) {
+        break;
+      }
+    }
+  }
+  var x_463 : bool;
+  var x_510 : bool;
+  var x_463_phi : bool;
+  var x_466_phi : i32;
+  var x_512_phi : bool;
+  switch(0u) {
+    default: {
+      x_463_phi = false;
+      x_466_phi = 0;
+      loop {
+        var x_491 : i32;
+        var x_483 : i32;
+        var x_464 : bool;
+        var x_467 : i32;
+        var x_464_phi : bool;
+        var x_467_phi : i32;
+        x_463 = x_463_phi;
+        let x_466 : i32 = x_466_phi;
+        x_512_phi = x_463;
+        if ((x_466 <= 8)) {
+        } else {
+          break;
+        }
+        let x_472 : i32 = tree[x_466].data;
+        if ((17 <= x_472)) {
+          var x_510_phi : bool;
+          let x_485 : ptr<function, i32> = &(tree[x_466].leftIndex);
+          let x_486 : i32 = *(x_485);
+          if ((x_486 == -1)) {
+            let x_493 : f32 = x_8.injectionSwitch.y;
+            let x_495 : f32 = x_8.injectionSwitch.x;
+            if ((x_493 < x_495)) {
+              loop {
+                discard;
+              }
+              return;
+            }
+            *(x_485) = 8;
+            tree[8] = BST(17, -1, -1);
+            loop {
+              x_510_phi = x_463;
+              if ((0 < i32(x_493))) {
+              } else {
+                break;
+              }
+              x_510_phi = true;
+              break;
+            }
+            x_510 = x_510_phi;
+            x_512_phi = x_510;
+            if (x_510) {
+              break;
+            }
+          } else {
+            x_491 = *(x_485);
+            x_464_phi = x_463;
+            x_467_phi = x_491;
+            continue;
+          }
+        } else {
+          let x_477 : ptr<function, i32> = &(tree[x_466].rightIndex);
+          let x_478 : i32 = *(x_477);
+          if ((x_478 == -1)) {
+            *(x_477) = 8;
+            tree[8] = BST(17, -1, -1);
+            x_512_phi = true;
+            break;
+          } else {
+            x_483 = *(x_477);
+            x_464_phi = x_463;
+            x_467_phi = x_483;
+            continue;
+          }
+          return;
+        }
+        x_464_phi = x_510;
+        x_467_phi = x_466;
+
+        continuing {
+          x_464 = x_464_phi;
+          x_467 = x_467_phi;
+          x_463_phi = x_464;
+          x_466_phi = x_467;
+        }
+      }
+      let x_512 : bool = x_512_phi;
+      if (x_512) {
+        break;
+      }
+    }
+  }
+  var x_517 : bool;
+  var x_564 : bool;
+  var x_517_phi : bool;
+  var x_520_phi : i32;
+  var x_566_phi : bool;
+  switch(0u) {
+    default: {
+      x_517_phi = false;
+      x_520_phi = 0;
+      loop {
+        var x_545 : i32;
+        var x_537 : i32;
+        var x_518 : bool;
+        var x_521 : i32;
+        var x_518_phi : bool;
+        var x_521_phi : i32;
+        x_517 = x_517_phi;
+        let x_520 : i32 = x_520_phi;
+        x_566_phi = x_517;
+        if ((x_520 <= 9)) {
+        } else {
+          break;
+        }
+        let x_526 : i32 = tree[x_520].data;
+        if ((13 <= x_526)) {
+          var x_564_phi : bool;
+          let x_539 : ptr<function, i32> = &(tree[x_520].leftIndex);
+          let x_540 : i32 = *(x_539);
+          if ((x_540 == -1)) {
+            let x_547 : f32 = x_8.injectionSwitch.y;
+            let x_549 : f32 = x_8.injectionSwitch.x;
+            if ((x_547 < x_549)) {
+              loop {
+                discard;
+              }
+              return;
+            }
+            *(x_539) = 9;
+            tree[9] = BST(13, -1, -1);
+            loop {
+              x_564_phi = x_517;
+              if ((0 < i32(x_547))) {
+              } else {
+                break;
+              }
+              x_564_phi = true;
+              break;
+            }
+            x_564 = x_564_phi;
+            x_566_phi = x_564;
+            if (x_564) {
+              break;
+            }
+          } else {
+            x_545 = *(x_539);
+            x_518_phi = x_517;
+            x_521_phi = x_545;
+            continue;
+          }
+        } else {
+          let x_531 : ptr<function, i32> = &(tree[x_520].rightIndex);
+          let x_532 : i32 = *(x_531);
+          if ((x_532 == -1)) {
+            *(x_531) = 9;
+            tree[9] = BST(13, -1, -1);
+            x_566_phi = true;
+            break;
+          } else {
+            x_537 = *(x_531);
+            x_518_phi = x_517;
+            x_521_phi = x_537;
+            continue;
+          }
+          return;
+        }
+        x_518_phi = x_564;
+        x_521_phi = x_520;
+
+        continuing {
+          x_518 = x_518_phi;
+          x_521 = x_521_phi;
+          x_517_phi = x_518;
+          x_520_phi = x_521;
+        }
+      }
+      let x_566 : bool = x_566_phi;
+      if (x_566) {
+        break;
+      }
+    }
+  }
+  x_569_phi = 0;
+  x_572_phi = 0;
+  x_574_phi = 0;
+  loop {
+    var x_597 : i32;
+    var x_607 : i32;
+    var x_612 : i32;
+    var x_575 : i32;
+    var x_570_phi : i32;
+    var x_573_phi : i32;
+    let x_569 : i32 = x_569_phi;
+    x_572 = x_572_phi;
+    let x_574 : i32 = x_574_phi;
+    if ((x_574 < 20)) {
+    } else {
+      break;
+    }
+    var x_582_phi : i32;
+    var x_597_phi : i32;
+    var x_598_phi : bool;
+    switch(0u) {
+      default: {
+        x_582_phi = 0;
+        loop {
+          let x_582 : i32 = x_582_phi;
+          x_597_phi = x_569;
+          x_598_phi = false;
+          if ((x_582 != -1)) {
+          } else {
+            break;
+          }
+          let x_589 : BST = tree[x_582];
+          let x_590 : i32 = x_589.data;
+          let x_591 : i32 = x_589.leftIndex;
+          let x_592 : i32 = x_589.rightIndex;
+          if ((x_590 == x_574)) {
+            x_597_phi = x_574;
+            x_598_phi = true;
+            break;
+          }
+
+          continuing {
+            x_582_phi = select(x_591, x_592, (x_574 > x_590));
+          }
+        }
+        x_597 = x_597_phi;
+        let x_598 : bool = x_598_phi;
+        x_570_phi = x_597;
+        if (x_598) {
+          break;
+        }
+        x_570_phi = -1;
+      }
+    }
+    var x_570 : i32;
+    var x_606 : i32;
+    var x_611 : i32;
+    var x_607_phi : i32;
+    var x_612_phi : i32;
+    x_570 = x_570_phi;
+    switch(x_574) {
+      case 2, 5, 6, 7, 8, 9, 12, 13, 15, 17: {
+        x_607_phi = x_572;
+        if ((x_570 == bitcast<i32>(x_574))) {
+          x_606 = bitcast<i32>((x_572 + bitcast<i32>(1)));
+          x_607_phi = x_606;
+        }
+        x_607 = x_607_phi;
+        x_573_phi = x_607;
+      }
+      default: {
+        x_612_phi = x_572;
+        if ((x_570 == bitcast<i32>(-1))) {
+          x_611 = bitcast<i32>((x_572 + bitcast<i32>(1)));
+          x_612_phi = x_611;
+        }
+        x_612 = x_612_phi;
+        x_573_phi = x_612;
+      }
+    }
+    let x_573 : i32 = x_573_phi;
+
+    continuing {
+      x_575 = (x_574 + 1);
+      x_569_phi = x_570;
+      x_572_phi = x_573;
+      x_574_phi = x_575;
+    }
+  }
+  if ((x_572 == bitcast<i32>(20))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/1.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/1.wgsl
new file mode 100644
index 0000000..c4e135a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/1.wgsl
@@ -0,0 +1,977 @@
+struct BST {
+  data : i32;
+  leftIndex : i32;
+  rightIndex : i32;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var tree : array<BST, 10>;
+  var x_67 : bool;
+  var x_114 : bool;
+  var x_572 : i32;
+  var x_67_phi : bool;
+  var x_70_phi : i32;
+  var x_116_phi : bool;
+  var x_119_phi : i32;
+  var x_569_phi : i32;
+  var x_572_phi : i32;
+  var x_574_phi : i32;
+  tree[0] = BST(9, -1, -1);
+  switch(0u) {
+    default: {
+      x_67_phi = false;
+      x_70_phi = 0;
+      loop {
+        var x_95 : i32;
+        var x_87 : i32;
+        var x_68 : bool;
+        var x_71 : i32;
+        var x_68_phi : bool;
+        var x_71_phi : i32;
+        x_67 = x_67_phi;
+        let x_70 : i32 = x_70_phi;
+        x_116_phi = x_67;
+        if ((x_70 <= 1)) {
+        } else {
+          break;
+        }
+        let x_76 : i32 = tree[x_70].data;
+        if ((5 <= x_76)) {
+          var x_114_phi : bool;
+          let x_89 : ptr<function, i32> = &(tree[x_70].leftIndex);
+          let x_90 : i32 = *(x_89);
+          if ((x_90 == -1)) {
+            let x_97 : f32 = x_8.injectionSwitch.y;
+            let x_99 : f32 = x_8.injectionSwitch.x;
+            if ((x_97 < x_99)) {
+              loop {
+                discard;
+              }
+              return;
+            }
+            *(x_89) = 1;
+            tree[1] = BST(5, -1, -1);
+            loop {
+              x_114_phi = x_67;
+              if ((0 < i32(x_97))) {
+              } else {
+                break;
+              }
+              x_114_phi = true;
+              break;
+            }
+            x_114 = x_114_phi;
+            x_116_phi = x_114;
+            if (x_114) {
+              break;
+            }
+          } else {
+            x_95 = *(x_89);
+            x_68_phi = x_67;
+            x_71_phi = x_95;
+            continue;
+          }
+        } else {
+          let x_81 : ptr<function, i32> = &(tree[x_70].rightIndex);
+          let x_82 : i32 = *(x_81);
+          if ((x_82 == -1)) {
+            *(x_81) = 1;
+            tree[1] = BST(5, -1, -1);
+            x_116_phi = true;
+            break;
+          } else {
+            x_87 = *(x_81);
+            x_68_phi = x_67;
+            x_71_phi = x_87;
+            continue;
+          }
+          return;
+        }
+        x_68_phi = x_114;
+        x_71_phi = x_70;
+
+        continuing {
+          x_68 = x_68_phi;
+          x_71 = x_71_phi;
+          x_67_phi = x_68;
+          x_70_phi = x_71;
+        }
+      }
+      let x_116 : bool = x_116_phi;
+      if (x_116) {
+        break;
+      }
+    }
+  }
+  x_119_phi = 0;
+  loop {
+    var x_133 : bool;
+    var x_120 : i32;
+    var x_134_phi : bool;
+    let x_119 : i32 = x_119_phi;
+    let x_125 : f32 = gl_FragCoord.y;
+    let x_126 : bool = (x_125 < 0.0);
+    x_134_phi = x_126;
+    if (!(x_126)) {
+      let x_131 : f32 = x_8.injectionSwitch.y;
+      x_133 = (x_119 != i32(x_131));
+      x_134_phi = x_133;
+    }
+    let x_134 : bool = x_134_phi;
+    if (x_134) {
+    } else {
+      break;
+    }
+    var x_139 : bool;
+    var x_186 : bool;
+    var x_139_phi : bool;
+    var x_142_phi : i32;
+    var x_188_phi : bool;
+    switch(0u) {
+      default: {
+        x_139_phi = false;
+        x_142_phi = 0;
+        loop {
+          var x_167 : i32;
+          var x_159 : i32;
+          var x_140 : bool;
+          var x_143 : i32;
+          var x_140_phi : bool;
+          var x_143_phi : i32;
+          x_139 = x_139_phi;
+          let x_142 : i32 = x_142_phi;
+          x_188_phi = x_139;
+          if ((x_142 <= 2)) {
+          } else {
+            break;
+          }
+          let x_148 : i32 = tree[x_142].data;
+          if ((12 <= x_148)) {
+            var x_186_phi : bool;
+            let x_161 : ptr<function, i32> = &(tree[x_142].leftIndex);
+            let x_162 : i32 = *(x_161);
+            if ((x_162 == -1)) {
+              let x_169 : f32 = x_8.injectionSwitch.y;
+              let x_171 : f32 = x_8.injectionSwitch.x;
+              if ((x_169 < x_171)) {
+                loop {
+                  discard;
+                }
+                return;
+              }
+              *(x_161) = 2;
+              tree[2] = BST(12, -1, -1);
+              loop {
+                x_186_phi = x_139;
+                if ((0 < i32(x_169))) {
+                } else {
+                  break;
+                }
+                x_186_phi = true;
+                break;
+              }
+              x_186 = x_186_phi;
+              x_188_phi = x_186;
+              if (x_186) {
+                break;
+              }
+            } else {
+              x_167 = *(x_161);
+              x_140_phi = x_139;
+              x_143_phi = x_167;
+              continue;
+            }
+          } else {
+            let x_153 : ptr<function, i32> = &(tree[x_142].rightIndex);
+            let x_154 : i32 = *(x_153);
+            if ((x_154 == -1)) {
+              *(x_153) = 2;
+              tree[2] = BST(12, -1, -1);
+              x_188_phi = true;
+              break;
+            } else {
+              x_159 = *(x_153);
+              x_140_phi = x_139;
+              x_143_phi = x_159;
+              continue;
+            }
+            return;
+          }
+          x_140_phi = x_186;
+          x_143_phi = x_142;
+
+          continuing {
+            x_140 = x_140_phi;
+            x_143 = x_143_phi;
+            x_139_phi = x_140;
+            x_142_phi = x_143;
+          }
+        }
+        let x_188 : bool = x_188_phi;
+        if (x_188) {
+          break;
+        }
+      }
+    }
+
+    continuing {
+      x_120 = (x_119 + 1);
+      x_119_phi = x_120;
+    }
+  }
+  var x_193 : bool;
+  var x_240 : bool;
+  var x_193_phi : bool;
+  var x_196_phi : i32;
+  var x_242_phi : bool;
+  switch(0u) {
+    default: {
+      x_193_phi = false;
+      x_196_phi = 0;
+      loop {
+        var x_221 : i32;
+        var x_213 : i32;
+        var x_194 : bool;
+        var x_197 : i32;
+        var x_194_phi : bool;
+        var x_197_phi : i32;
+        x_193 = x_193_phi;
+        let x_196 : i32 = x_196_phi;
+        x_242_phi = x_193;
+        if ((x_196 <= 3)) {
+        } else {
+          break;
+        }
+        let x_202 : i32 = tree[x_196].data;
+        if ((15 <= x_202)) {
+          var x_240_phi : bool;
+          let x_215 : ptr<function, i32> = &(tree[x_196].leftIndex);
+          let x_216 : i32 = *(x_215);
+          if ((x_216 == -1)) {
+            let x_223 : f32 = x_8.injectionSwitch.y;
+            let x_225 : f32 = x_8.injectionSwitch.x;
+            if ((x_223 < x_225)) {
+              loop {
+                discard;
+              }
+              return;
+            }
+            *(x_215) = 3;
+            tree[3] = BST(15, -1, -1);
+            loop {
+              x_240_phi = x_193;
+              if ((0 < i32(x_223))) {
+              } else {
+                break;
+              }
+              x_240_phi = true;
+              break;
+            }
+            x_240 = x_240_phi;
+            x_242_phi = x_240;
+            if (x_240) {
+              break;
+            }
+          } else {
+            x_221 = *(x_215);
+            x_194_phi = x_193;
+            x_197_phi = x_221;
+            continue;
+          }
+        } else {
+          let x_207 : ptr<function, i32> = &(tree[x_196].rightIndex);
+          let x_208 : i32 = *(x_207);
+          if ((x_208 == -1)) {
+            *(x_207) = 3;
+            tree[3] = BST(15, -1, -1);
+            x_242_phi = true;
+            break;
+          } else {
+            x_213 = *(x_207);
+            x_194_phi = x_193;
+            x_197_phi = x_213;
+            continue;
+          }
+          return;
+        }
+        x_194_phi = x_240;
+        x_197_phi = x_196;
+
+        continuing {
+          x_194 = x_194_phi;
+          x_197 = x_197_phi;
+          x_193_phi = x_194;
+          x_196_phi = x_197;
+        }
+      }
+      let x_242 : bool = x_242_phi;
+      if (x_242) {
+        break;
+      }
+    }
+  }
+  var x_247 : bool;
+  var x_294 : bool;
+  var x_247_phi : bool;
+  var x_250_phi : i32;
+  var x_296_phi : bool;
+  switch(0u) {
+    default: {
+      x_247_phi = false;
+      x_250_phi = 0;
+      loop {
+        var x_275 : i32;
+        var x_267 : i32;
+        var x_248 : bool;
+        var x_251 : i32;
+        var x_248_phi : bool;
+        var x_251_phi : i32;
+        x_247 = x_247_phi;
+        let x_250 : i32 = x_250_phi;
+        x_296_phi = x_247;
+        if ((x_250 <= 4)) {
+        } else {
+          break;
+        }
+        let x_256 : i32 = tree[x_250].data;
+        if ((7 <= x_256)) {
+          var x_294_phi : bool;
+          let x_269 : ptr<function, i32> = &(tree[x_250].leftIndex);
+          let x_270 : i32 = *(x_269);
+          if ((x_270 == -1)) {
+            let x_277 : f32 = x_8.injectionSwitch.y;
+            let x_279 : f32 = x_8.injectionSwitch.x;
+            if ((x_277 < x_279)) {
+              loop {
+                discard;
+              }
+              return;
+            }
+            *(x_269) = 4;
+            tree[4] = BST(7, -1, -1);
+            loop {
+              x_294_phi = x_247;
+              if ((0 < i32(x_277))) {
+              } else {
+                break;
+              }
+              x_294_phi = true;
+              break;
+            }
+            x_294 = x_294_phi;
+            x_296_phi = x_294;
+            if (x_294) {
+              break;
+            }
+          } else {
+            x_275 = *(x_269);
+            x_248_phi = x_247;
+            x_251_phi = x_275;
+            continue;
+          }
+        } else {
+          let x_261 : ptr<function, i32> = &(tree[x_250].rightIndex);
+          let x_262 : i32 = *(x_261);
+          if ((x_262 == -1)) {
+            *(x_261) = 4;
+            tree[4] = BST(7, -1, -1);
+            x_296_phi = true;
+            break;
+          } else {
+            x_267 = *(x_261);
+            x_248_phi = x_247;
+            x_251_phi = x_267;
+            continue;
+          }
+          return;
+        }
+        x_248_phi = x_294;
+        x_251_phi = x_250;
+
+        continuing {
+          x_248 = x_248_phi;
+          x_251 = x_251_phi;
+          x_247_phi = x_248;
+          x_250_phi = x_251;
+        }
+      }
+      let x_296 : bool = x_296_phi;
+      if (x_296) {
+        break;
+      }
+    }
+  }
+  var x_301 : bool;
+  var x_348 : bool;
+  var x_301_phi : bool;
+  var x_304_phi : i32;
+  var x_350_phi : bool;
+  switch(0u) {
+    default: {
+      x_301_phi = false;
+      x_304_phi = 0;
+      loop {
+        var x_329 : i32;
+        var x_321 : i32;
+        var x_302 : bool;
+        var x_305 : i32;
+        var x_302_phi : bool;
+        var x_305_phi : i32;
+        x_301 = x_301_phi;
+        let x_304 : i32 = x_304_phi;
+        x_350_phi = x_301;
+        if ((x_304 <= 5)) {
+        } else {
+          break;
+        }
+        let x_310 : i32 = tree[x_304].data;
+        if ((8 <= x_310)) {
+          var x_348_phi : bool;
+          let x_323 : ptr<function, i32> = &(tree[x_304].leftIndex);
+          let x_324 : i32 = *(x_323);
+          if ((x_324 == -1)) {
+            let x_331 : f32 = x_8.injectionSwitch.y;
+            let x_333 : f32 = x_8.injectionSwitch.x;
+            if ((x_331 < x_333)) {
+              loop {
+                discard;
+              }
+              return;
+            }
+            *(x_323) = 5;
+            tree[5] = BST(8, -1, -1);
+            loop {
+              x_348_phi = x_301;
+              if ((0 < i32(x_331))) {
+              } else {
+                break;
+              }
+              x_348_phi = true;
+              break;
+            }
+            x_348 = x_348_phi;
+            x_350_phi = x_348;
+            if (x_348) {
+              break;
+            }
+          } else {
+            x_329 = *(x_323);
+            x_302_phi = x_301;
+            x_305_phi = x_329;
+            continue;
+          }
+        } else {
+          let x_315 : ptr<function, i32> = &(tree[x_304].rightIndex);
+          let x_316 : i32 = *(x_315);
+          if ((x_316 == -1)) {
+            *(x_315) = 5;
+            tree[5] = BST(8, -1, -1);
+            x_350_phi = true;
+            break;
+          } else {
+            x_321 = *(x_315);
+            x_302_phi = x_301;
+            x_305_phi = x_321;
+            continue;
+          }
+          return;
+        }
+        x_302_phi = x_348;
+        x_305_phi = x_304;
+
+        continuing {
+          x_302 = x_302_phi;
+          x_305 = x_305_phi;
+          x_301_phi = x_302;
+          x_304_phi = x_305;
+        }
+      }
+      let x_350 : bool = x_350_phi;
+      if (x_350) {
+        break;
+      }
+    }
+  }
+  var x_355 : bool;
+  var x_402 : bool;
+  var x_355_phi : bool;
+  var x_358_phi : i32;
+  var x_404_phi : bool;
+  switch(0u) {
+    default: {
+      x_355_phi = false;
+      x_358_phi = 0;
+      loop {
+        var x_383 : i32;
+        var x_375 : i32;
+        var x_356 : bool;
+        var x_359 : i32;
+        var x_356_phi : bool;
+        var x_359_phi : i32;
+        x_355 = x_355_phi;
+        let x_358 : i32 = x_358_phi;
+        x_404_phi = x_355;
+        if ((x_358 <= 6)) {
+        } else {
+          break;
+        }
+        let x_364 : i32 = tree[x_358].data;
+        if ((2 <= x_364)) {
+          var x_402_phi : bool;
+          let x_377 : ptr<function, i32> = &(tree[x_358].leftIndex);
+          let x_378 : i32 = *(x_377);
+          if ((x_378 == -1)) {
+            let x_385 : f32 = x_8.injectionSwitch.y;
+            let x_387 : f32 = x_8.injectionSwitch.x;
+            if ((x_385 < x_387)) {
+              loop {
+                discard;
+              }
+              return;
+            }
+            *(x_377) = 6;
+            tree[6] = BST(2, -1, -1);
+            loop {
+              x_402_phi = x_355;
+              if ((0 < i32(x_385))) {
+              } else {
+                break;
+              }
+              x_402_phi = true;
+              break;
+            }
+            x_402 = x_402_phi;
+            x_404_phi = x_402;
+            if (x_402) {
+              break;
+            }
+          } else {
+            x_383 = *(x_377);
+            x_356_phi = x_355;
+            x_359_phi = x_383;
+            continue;
+          }
+        } else {
+          let x_369 : ptr<function, i32> = &(tree[x_358].rightIndex);
+          let x_370 : i32 = *(x_369);
+          if ((x_370 == -1)) {
+            *(x_369) = 6;
+            tree[6] = BST(2, -1, -1);
+            x_404_phi = true;
+            break;
+          } else {
+            x_375 = *(x_369);
+            x_356_phi = x_355;
+            x_359_phi = x_375;
+            continue;
+          }
+          return;
+        }
+        x_356_phi = x_402;
+        x_359_phi = x_358;
+
+        continuing {
+          x_356 = x_356_phi;
+          x_359 = x_359_phi;
+          x_355_phi = x_356;
+          x_358_phi = x_359;
+        }
+      }
+      let x_404 : bool = x_404_phi;
+      if (x_404) {
+        break;
+      }
+    }
+  }
+  var x_409 : bool;
+  var x_456 : bool;
+  var x_409_phi : bool;
+  var x_412_phi : i32;
+  var x_458_phi : bool;
+  switch(0u) {
+    default: {
+      x_409_phi = false;
+      x_412_phi = 0;
+      loop {
+        var x_437 : i32;
+        var x_429 : i32;
+        var x_410 : bool;
+        var x_413 : i32;
+        var x_410_phi : bool;
+        var x_413_phi : i32;
+        x_409 = x_409_phi;
+        let x_412 : i32 = x_412_phi;
+        x_458_phi = x_409;
+        if ((x_412 <= 7)) {
+        } else {
+          break;
+        }
+        let x_418 : i32 = tree[x_412].data;
+        if ((6 <= x_418)) {
+          var x_456_phi : bool;
+          let x_431 : ptr<function, i32> = &(tree[x_412].leftIndex);
+          let x_432 : i32 = *(x_431);
+          if ((x_432 == -1)) {
+            let x_439 : f32 = x_8.injectionSwitch.y;
+            let x_441 : f32 = x_8.injectionSwitch.x;
+            if ((x_439 < x_441)) {
+              loop {
+                discard;
+              }
+              return;
+            }
+            *(x_431) = 7;
+            tree[7] = BST(6, -1, -1);
+            loop {
+              x_456_phi = x_409;
+              if ((0 < i32(x_439))) {
+              } else {
+                break;
+              }
+              x_456_phi = true;
+              break;
+            }
+            x_456 = x_456_phi;
+            x_458_phi = x_456;
+            if (x_456) {
+              break;
+            }
+          } else {
+            x_437 = *(x_431);
+            x_410_phi = x_409;
+            x_413_phi = x_437;
+            continue;
+          }
+        } else {
+          let x_423 : ptr<function, i32> = &(tree[x_412].rightIndex);
+          let x_424 : i32 = *(x_423);
+          if ((x_424 == -1)) {
+            *(x_423) = 7;
+            tree[7] = BST(6, -1, -1);
+            x_458_phi = true;
+            break;
+          } else {
+            x_429 = *(x_423);
+            x_410_phi = x_409;
+            x_413_phi = x_429;
+            continue;
+          }
+          return;
+        }
+        x_410_phi = x_456;
+        x_413_phi = x_412;
+
+        continuing {
+          x_410 = x_410_phi;
+          x_413 = x_413_phi;
+          x_409_phi = x_410;
+          x_412_phi = x_413;
+        }
+      }
+      let x_458 : bool = x_458_phi;
+      if (x_458) {
+        break;
+      }
+    }
+  }
+  var x_463 : bool;
+  var x_510 : bool;
+  var x_463_phi : bool;
+  var x_466_phi : i32;
+  var x_512_phi : bool;
+  switch(0u) {
+    default: {
+      x_463_phi = false;
+      x_466_phi = 0;
+      loop {
+        var x_491 : i32;
+        var x_483 : i32;
+        var x_464 : bool;
+        var x_467 : i32;
+        var x_464_phi : bool;
+        var x_467_phi : i32;
+        x_463 = x_463_phi;
+        let x_466 : i32 = x_466_phi;
+        x_512_phi = x_463;
+        if ((x_466 <= 8)) {
+        } else {
+          break;
+        }
+        let x_472 : i32 = tree[x_466].data;
+        if ((17 <= x_472)) {
+          var x_510_phi : bool;
+          let x_485 : ptr<function, i32> = &(tree[x_466].leftIndex);
+          let x_486 : i32 = *(x_485);
+          if ((x_486 == -1)) {
+            let x_493 : f32 = x_8.injectionSwitch.y;
+            let x_495 : f32 = x_8.injectionSwitch.x;
+            if ((x_493 < x_495)) {
+              loop {
+                discard;
+              }
+              return;
+            }
+            *(x_485) = 8;
+            tree[8] = BST(17, -1, -1);
+            loop {
+              x_510_phi = x_463;
+              if ((0 < i32(x_493))) {
+              } else {
+                break;
+              }
+              x_510_phi = true;
+              break;
+            }
+            x_510 = x_510_phi;
+            x_512_phi = x_510;
+            if (x_510) {
+              break;
+            }
+          } else {
+            x_491 = *(x_485);
+            x_464_phi = x_463;
+            x_467_phi = x_491;
+            continue;
+          }
+        } else {
+          let x_477 : ptr<function, i32> = &(tree[x_466].rightIndex);
+          let x_478 : i32 = *(x_477);
+          if ((x_478 == -1)) {
+            *(x_477) = 8;
+            tree[8] = BST(17, -1, -1);
+            x_512_phi = true;
+            break;
+          } else {
+            x_483 = *(x_477);
+            x_464_phi = x_463;
+            x_467_phi = x_483;
+            continue;
+          }
+          return;
+        }
+        x_464_phi = x_510;
+        x_467_phi = x_466;
+
+        continuing {
+          x_464 = x_464_phi;
+          x_467 = x_467_phi;
+          x_463_phi = x_464;
+          x_466_phi = x_467;
+        }
+      }
+      let x_512 : bool = x_512_phi;
+      if (x_512) {
+        break;
+      }
+    }
+  }
+  var x_517 : bool;
+  var x_564 : bool;
+  var x_517_phi : bool;
+  var x_520_phi : i32;
+  var x_566_phi : bool;
+  switch(0u) {
+    default: {
+      x_517_phi = false;
+      x_520_phi = 0;
+      loop {
+        var x_545 : i32;
+        var x_537 : i32;
+        var x_518 : bool;
+        var x_521 : i32;
+        var x_518_phi : bool;
+        var x_521_phi : i32;
+        x_517 = x_517_phi;
+        let x_520 : i32 = x_520_phi;
+        x_566_phi = x_517;
+        if ((x_520 <= 9)) {
+        } else {
+          break;
+        }
+        let x_526 : i32 = tree[x_520].data;
+        if ((13 <= x_526)) {
+          var x_564_phi : bool;
+          let x_539 : ptr<function, i32> = &(tree[x_520].leftIndex);
+          let x_540 : i32 = *(x_539);
+          if ((x_540 == -1)) {
+            let x_547 : f32 = x_8.injectionSwitch.y;
+            let x_549 : f32 = x_8.injectionSwitch.x;
+            if ((x_547 < x_549)) {
+              loop {
+                discard;
+              }
+              return;
+            }
+            *(x_539) = 9;
+            tree[9] = BST(13, -1, -1);
+            loop {
+              x_564_phi = x_517;
+              if ((0 < i32(x_547))) {
+              } else {
+                break;
+              }
+              x_564_phi = true;
+              break;
+            }
+            x_564 = x_564_phi;
+            x_566_phi = x_564;
+            if (x_564) {
+              break;
+            }
+          } else {
+            x_545 = *(x_539);
+            x_518_phi = x_517;
+            x_521_phi = x_545;
+            continue;
+          }
+        } else {
+          let x_531 : ptr<function, i32> = &(tree[x_520].rightIndex);
+          let x_532 : i32 = *(x_531);
+          if ((x_532 == -1)) {
+            *(x_531) = 9;
+            tree[9] = BST(13, -1, -1);
+            x_566_phi = true;
+            break;
+          } else {
+            x_537 = *(x_531);
+            x_518_phi = x_517;
+            x_521_phi = x_537;
+            continue;
+          }
+          return;
+        }
+        x_518_phi = x_564;
+        x_521_phi = x_520;
+
+        continuing {
+          x_518 = x_518_phi;
+          x_521 = x_521_phi;
+          x_517_phi = x_518;
+          x_520_phi = x_521;
+        }
+      }
+      let x_566 : bool = x_566_phi;
+      if (x_566) {
+        break;
+      }
+    }
+  }
+  x_569_phi = 0;
+  x_572_phi = 0;
+  x_574_phi = 0;
+  loop {
+    var x_597 : i32;
+    var x_607 : i32;
+    var x_612 : i32;
+    var x_575 : i32;
+    var x_570_phi : i32;
+    var x_573_phi : i32;
+    let x_569 : i32 = x_569_phi;
+    x_572 = x_572_phi;
+    let x_574 : i32 = x_574_phi;
+    if ((x_574 < 20)) {
+    } else {
+      break;
+    }
+    var x_582_phi : i32;
+    var x_597_phi : i32;
+    var x_598_phi : bool;
+    switch(0u) {
+      default: {
+        x_582_phi = 0;
+        loop {
+          let x_582 : i32 = x_582_phi;
+          x_597_phi = x_569;
+          x_598_phi = false;
+          if ((x_582 != -1)) {
+          } else {
+            break;
+          }
+          let x_589 : BST = tree[x_582];
+          let x_590 : i32 = x_589.data;
+          let x_591 : i32 = x_589.leftIndex;
+          let x_592 : i32 = x_589.rightIndex;
+          if ((x_590 == x_574)) {
+            x_597_phi = x_574;
+            x_598_phi = true;
+            break;
+          }
+
+          continuing {
+            x_582_phi = select(x_591, x_592, (x_574 > x_590));
+          }
+        }
+        x_597 = x_597_phi;
+        let x_598 : bool = x_598_phi;
+        x_570_phi = x_597;
+        if (x_598) {
+          break;
+        }
+        x_570_phi = -1;
+      }
+    }
+    var x_570 : i32;
+    var x_606 : i32;
+    var x_611 : i32;
+    var x_607_phi : i32;
+    var x_612_phi : i32;
+    x_570 = x_570_phi;
+    switch(x_574) {
+      case 2, 5, 6, 7, 8, 9, 12, 13, 15, 17: {
+        x_607_phi = x_572;
+        if ((x_570 == bitcast<i32>(x_574))) {
+          x_606 = bitcast<i32>((x_572 + bitcast<i32>(1)));
+          x_607_phi = x_606;
+        }
+        x_607 = x_607_phi;
+        x_573_phi = x_607;
+      }
+      default: {
+        x_612_phi = x_572;
+        if ((x_570 == bitcast<i32>(-1))) {
+          x_611 = bitcast<i32>((x_572 + bitcast<i32>(1)));
+          x_612_phi = x_611;
+        }
+        x_612 = x_612_phi;
+        x_573_phi = x_612;
+      }
+    }
+    let x_573 : i32 = x_573_phi;
+
+    continuing {
+      x_575 = (x_574 + 1);
+      x_569_phi = x_570;
+      x_572_phi = x_573;
+      x_574_phi = x_575;
+    }
+  }
+  if ((x_572 == bitcast<i32>(20))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
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
new file mode 100755
index 0000000..46480e1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/1.wgsl.expected.hlsl
@@ -0,0 +1,1151 @@
+SKIP: FAILED
+
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  BST tree[10] = (BST[10])0;
+  bool x_67 = false;
+  bool x_114 = false;
+  int x_572 = 0;
+  bool x_67_phi = false;
+  int x_70_phi = 0;
+  bool x_116_phi = false;
+  int x_119_phi = 0;
+  int x_569_phi = 0;
+  int x_572_phi = 0;
+  int x_574_phi = 0;
+  const BST tint_symbol_5 = {9, -1, -1};
+  tree[0] = tint_symbol_5;
+  switch(0u) {
+    default: {
+      x_67_phi = false;
+      x_70_phi = 0;
+      while (true) {
+        int x_95 = 0;
+        int x_87 = 0;
+        bool x_68 = false;
+        int x_71 = 0;
+        bool x_68_phi = false;
+        int x_71_phi = 0;
+        x_67 = x_67_phi;
+        const int x_70 = x_70_phi;
+        x_116_phi = x_67;
+        if ((x_70 <= 1)) {
+        } else {
+          break;
+        }
+        const int x_76 = tree[x_70].data;
+        if ((5 <= x_76)) {
+          bool x_114_phi = false;
+          const int x_89_save = x_70;
+          const int x_90 = tree[x_89_save].leftIndex;
+          if ((x_90 == -1)) {
+            const float x_97 = asfloat(x_8[0].y);
+            const float x_99 = asfloat(x_8[0].x);
+            if ((x_97 < x_99)) {
+              while (true) {
+                discard;
+              }
+              return;
+            }
+            tree[x_89_save].leftIndex = 1;
+            const BST tint_symbol_6 = {5, -1, -1};
+            tree[1] = tint_symbol_6;
+            while (true) {
+              x_114_phi = x_67;
+              if ((0 < int(x_97))) {
+              } else {
+                break;
+              }
+              x_114_phi = true;
+              break;
+            }
+            x_114 = x_114_phi;
+            x_116_phi = x_114;
+            if (x_114) {
+              break;
+            }
+          } else {
+            x_95 = tree[x_89_save].leftIndex;
+            x_68_phi = x_67;
+            x_71_phi = x_95;
+            {
+              x_68 = x_68_phi;
+              x_71 = x_71_phi;
+              x_67_phi = x_68;
+              x_70_phi = x_71;
+            }
+            continue;
+          }
+        } else {
+          const int x_81_save = x_70;
+          const int x_82 = tree[x_81_save].rightIndex;
+          if ((x_82 == -1)) {
+            tree[x_81_save].rightIndex = 1;
+            const BST tint_symbol_7 = {5, -1, -1};
+            tree[1] = tint_symbol_7;
+            x_116_phi = true;
+            break;
+          } else {
+            x_87 = tree[x_81_save].rightIndex;
+            x_68_phi = x_67;
+            x_71_phi = x_87;
+            {
+              x_68 = x_68_phi;
+              x_71 = x_71_phi;
+              x_67_phi = x_68;
+              x_70_phi = x_71;
+            }
+            continue;
+          }
+          return;
+        }
+        x_68_phi = x_114;
+        x_71_phi = x_70;
+        {
+          x_68 = x_68_phi;
+          x_71 = x_71_phi;
+          x_67_phi = x_68;
+          x_70_phi = x_71;
+        }
+      }
+      if (x_116_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  x_119_phi = 0;
+  while (true) {
+    bool x_133 = false;
+    int x_120 = 0;
+    bool x_134_phi = false;
+    const int x_119 = x_119_phi;
+    const float x_125 = gl_FragCoord.y;
+    const bool x_126 = (x_125 < 0.0f);
+    x_134_phi = x_126;
+    if (!(x_126)) {
+      const float x_131 = asfloat(x_8[0].y);
+      x_133 = (x_119 != int(x_131));
+      x_134_phi = x_133;
+    }
+    if (x_134_phi) {
+    } else {
+      break;
+    }
+    bool x_139 = false;
+    bool x_186 = false;
+    bool x_139_phi = false;
+    int x_142_phi = 0;
+    bool x_188_phi = false;
+    switch(0u) {
+      default: {
+        x_139_phi = false;
+        x_142_phi = 0;
+        while (true) {
+          int x_167 = 0;
+          int x_159 = 0;
+          bool x_140 = false;
+          int x_143 = 0;
+          bool x_140_phi = false;
+          int x_143_phi = 0;
+          x_139 = x_139_phi;
+          const int x_142 = x_142_phi;
+          x_188_phi = x_139;
+          if ((x_142 <= 2)) {
+          } else {
+            break;
+          }
+          const int x_148 = tree[x_142].data;
+          if ((12 <= x_148)) {
+            bool x_186_phi = false;
+            const int x_161_save = x_142;
+            const int x_162 = tree[x_161_save].leftIndex;
+            if ((x_162 == -1)) {
+              const float x_169 = asfloat(x_8[0].y);
+              const float x_171 = asfloat(x_8[0].x);
+              if ((x_169 < x_171)) {
+                while (true) {
+                  discard;
+                }
+                return;
+              }
+              tree[x_161_save].leftIndex = 2;
+              const BST tint_symbol_8 = {12, -1, -1};
+              tree[2] = tint_symbol_8;
+              while (true) {
+                x_186_phi = x_139;
+                if ((0 < int(x_169))) {
+                } else {
+                  break;
+                }
+                x_186_phi = true;
+                break;
+              }
+              x_186 = x_186_phi;
+              x_188_phi = x_186;
+              if (x_186) {
+                break;
+              }
+            } else {
+              x_167 = tree[x_161_save].leftIndex;
+              x_140_phi = x_139;
+              x_143_phi = x_167;
+              {
+                x_140 = x_140_phi;
+                x_143 = x_143_phi;
+                x_139_phi = x_140;
+                x_142_phi = x_143;
+              }
+              continue;
+            }
+          } else {
+            const int x_153_save = x_142;
+            const int x_154 = tree[x_153_save].rightIndex;
+            if ((x_154 == -1)) {
+              tree[x_153_save].rightIndex = 2;
+              const BST tint_symbol_9 = {12, -1, -1};
+              tree[2] = tint_symbol_9;
+              x_188_phi = true;
+              break;
+            } else {
+              x_159 = tree[x_153_save].rightIndex;
+              x_140_phi = x_139;
+              x_143_phi = x_159;
+              {
+                x_140 = x_140_phi;
+                x_143 = x_143_phi;
+                x_139_phi = x_140;
+                x_142_phi = x_143;
+              }
+              continue;
+            }
+            return;
+          }
+          x_140_phi = x_186;
+          x_143_phi = x_142;
+          {
+            x_140 = x_140_phi;
+            x_143 = x_143_phi;
+            x_139_phi = x_140;
+            x_142_phi = x_143;
+          }
+        }
+        if (x_188_phi) {
+          break;
+        }
+        break;
+      }
+    }
+    {
+      x_120 = (x_119 + 1);
+      x_119_phi = x_120;
+    }
+  }
+  bool x_193 = false;
+  bool x_240 = false;
+  bool x_193_phi = false;
+  int x_196_phi = 0;
+  bool x_242_phi = false;
+  switch(0u) {
+    default: {
+      x_193_phi = false;
+      x_196_phi = 0;
+      while (true) {
+        int x_221 = 0;
+        int x_213 = 0;
+        bool x_194 = false;
+        int x_197 = 0;
+        bool x_194_phi = false;
+        int x_197_phi = 0;
+        x_193 = x_193_phi;
+        const int x_196 = x_196_phi;
+        x_242_phi = x_193;
+        if ((x_196 <= 3)) {
+        } else {
+          break;
+        }
+        const int x_202 = tree[x_196].data;
+        if ((15 <= x_202)) {
+          bool x_240_phi = false;
+          const int x_215_save = x_196;
+          const int x_216 = tree[x_215_save].leftIndex;
+          if ((x_216 == -1)) {
+            const float x_223 = asfloat(x_8[0].y);
+            const float x_225 = asfloat(x_8[0].x);
+            if ((x_223 < x_225)) {
+              while (true) {
+                discard;
+              }
+              return;
+            }
+            tree[x_215_save].leftIndex = 3;
+            const BST tint_symbol_10 = {15, -1, -1};
+            tree[3] = tint_symbol_10;
+            while (true) {
+              x_240_phi = x_193;
+              if ((0 < int(x_223))) {
+              } else {
+                break;
+              }
+              x_240_phi = true;
+              break;
+            }
+            x_240 = x_240_phi;
+            x_242_phi = x_240;
+            if (x_240) {
+              break;
+            }
+          } else {
+            x_221 = tree[x_215_save].leftIndex;
+            x_194_phi = x_193;
+            x_197_phi = x_221;
+            {
+              x_194 = x_194_phi;
+              x_197 = x_197_phi;
+              x_193_phi = x_194;
+              x_196_phi = x_197;
+            }
+            continue;
+          }
+        } else {
+          const int x_207_save = x_196;
+          const int x_208 = tree[x_207_save].rightIndex;
+          if ((x_208 == -1)) {
+            tree[x_207_save].rightIndex = 3;
+            const BST tint_symbol_11 = {15, -1, -1};
+            tree[3] = tint_symbol_11;
+            x_242_phi = true;
+            break;
+          } else {
+            x_213 = tree[x_207_save].rightIndex;
+            x_194_phi = x_193;
+            x_197_phi = x_213;
+            {
+              x_194 = x_194_phi;
+              x_197 = x_197_phi;
+              x_193_phi = x_194;
+              x_196_phi = x_197;
+            }
+            continue;
+          }
+          return;
+        }
+        x_194_phi = x_240;
+        x_197_phi = x_196;
+        {
+          x_194 = x_194_phi;
+          x_197 = x_197_phi;
+          x_193_phi = x_194;
+          x_196_phi = x_197;
+        }
+      }
+      if (x_242_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  bool x_247 = false;
+  bool x_294 = false;
+  bool x_247_phi = false;
+  int x_250_phi = 0;
+  bool x_296_phi = false;
+  switch(0u) {
+    default: {
+      x_247_phi = false;
+      x_250_phi = 0;
+      while (true) {
+        int x_275 = 0;
+        int x_267 = 0;
+        bool x_248 = false;
+        int x_251 = 0;
+        bool x_248_phi = false;
+        int x_251_phi = 0;
+        x_247 = x_247_phi;
+        const int x_250 = x_250_phi;
+        x_296_phi = x_247;
+        if ((x_250 <= 4)) {
+        } else {
+          break;
+        }
+        const int x_256 = tree[x_250].data;
+        if ((7 <= x_256)) {
+          bool x_294_phi = false;
+          const int x_269_save = x_250;
+          const int x_270 = tree[x_269_save].leftIndex;
+          if ((x_270 == -1)) {
+            const float x_277 = asfloat(x_8[0].y);
+            const float x_279 = asfloat(x_8[0].x);
+            if ((x_277 < x_279)) {
+              while (true) {
+                discard;
+              }
+              return;
+            }
+            tree[x_269_save].leftIndex = 4;
+            const BST tint_symbol_12 = {7, -1, -1};
+            tree[4] = tint_symbol_12;
+            while (true) {
+              x_294_phi = x_247;
+              if ((0 < int(x_277))) {
+              } else {
+                break;
+              }
+              x_294_phi = true;
+              break;
+            }
+            x_294 = x_294_phi;
+            x_296_phi = x_294;
+            if (x_294) {
+              break;
+            }
+          } else {
+            x_275 = tree[x_269_save].leftIndex;
+            x_248_phi = x_247;
+            x_251_phi = x_275;
+            {
+              x_248 = x_248_phi;
+              x_251 = x_251_phi;
+              x_247_phi = x_248;
+              x_250_phi = x_251;
+            }
+            continue;
+          }
+        } else {
+          const int x_261_save = x_250;
+          const int x_262 = tree[x_261_save].rightIndex;
+          if ((x_262 == -1)) {
+            tree[x_261_save].rightIndex = 4;
+            const BST tint_symbol_13 = {7, -1, -1};
+            tree[4] = tint_symbol_13;
+            x_296_phi = true;
+            break;
+          } else {
+            x_267 = tree[x_261_save].rightIndex;
+            x_248_phi = x_247;
+            x_251_phi = x_267;
+            {
+              x_248 = x_248_phi;
+              x_251 = x_251_phi;
+              x_247_phi = x_248;
+              x_250_phi = x_251;
+            }
+            continue;
+          }
+          return;
+        }
+        x_248_phi = x_294;
+        x_251_phi = x_250;
+        {
+          x_248 = x_248_phi;
+          x_251 = x_251_phi;
+          x_247_phi = x_248;
+          x_250_phi = x_251;
+        }
+      }
+      if (x_296_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  bool x_301 = false;
+  bool x_348 = false;
+  bool x_301_phi = false;
+  int x_304_phi = 0;
+  bool x_350_phi = false;
+  switch(0u) {
+    default: {
+      x_301_phi = false;
+      x_304_phi = 0;
+      while (true) {
+        int x_329 = 0;
+        int x_321 = 0;
+        bool x_302 = false;
+        int x_305 = 0;
+        bool x_302_phi = false;
+        int x_305_phi = 0;
+        x_301 = x_301_phi;
+        const int x_304 = x_304_phi;
+        x_350_phi = x_301;
+        if ((x_304 <= 5)) {
+        } else {
+          break;
+        }
+        const int x_310 = tree[x_304].data;
+        if ((8 <= x_310)) {
+          bool x_348_phi = false;
+          const int x_323_save = x_304;
+          const int x_324 = tree[x_323_save].leftIndex;
+          if ((x_324 == -1)) {
+            const float x_331 = asfloat(x_8[0].y);
+            const float x_333 = asfloat(x_8[0].x);
+            if ((x_331 < x_333)) {
+              while (true) {
+                discard;
+              }
+              return;
+            }
+            tree[x_323_save].leftIndex = 5;
+            const BST tint_symbol_14 = {8, -1, -1};
+            tree[5] = tint_symbol_14;
+            while (true) {
+              x_348_phi = x_301;
+              if ((0 < int(x_331))) {
+              } else {
+                break;
+              }
+              x_348_phi = true;
+              break;
+            }
+            x_348 = x_348_phi;
+            x_350_phi = x_348;
+            if (x_348) {
+              break;
+            }
+          } else {
+            x_329 = tree[x_323_save].leftIndex;
+            x_302_phi = x_301;
+            x_305_phi = x_329;
+            {
+              x_302 = x_302_phi;
+              x_305 = x_305_phi;
+              x_301_phi = x_302;
+              x_304_phi = x_305;
+            }
+            continue;
+          }
+        } else {
+          const int x_315_save = x_304;
+          const int x_316 = tree[x_315_save].rightIndex;
+          if ((x_316 == -1)) {
+            tree[x_315_save].rightIndex = 5;
+            const BST tint_symbol_15 = {8, -1, -1};
+            tree[5] = tint_symbol_15;
+            x_350_phi = true;
+            break;
+          } else {
+            x_321 = tree[x_315_save].rightIndex;
+            x_302_phi = x_301;
+            x_305_phi = x_321;
+            {
+              x_302 = x_302_phi;
+              x_305 = x_305_phi;
+              x_301_phi = x_302;
+              x_304_phi = x_305;
+            }
+            continue;
+          }
+          return;
+        }
+        x_302_phi = x_348;
+        x_305_phi = x_304;
+        {
+          x_302 = x_302_phi;
+          x_305 = x_305_phi;
+          x_301_phi = x_302;
+          x_304_phi = x_305;
+        }
+      }
+      if (x_350_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  bool x_355 = false;
+  bool x_402 = false;
+  bool x_355_phi = false;
+  int x_358_phi = 0;
+  bool x_404_phi = false;
+  switch(0u) {
+    default: {
+      x_355_phi = false;
+      x_358_phi = 0;
+      while (true) {
+        int x_383 = 0;
+        int x_375 = 0;
+        bool x_356 = false;
+        int x_359 = 0;
+        bool x_356_phi = false;
+        int x_359_phi = 0;
+        x_355 = x_355_phi;
+        const int x_358 = x_358_phi;
+        x_404_phi = x_355;
+        if ((x_358 <= 6)) {
+        } else {
+          break;
+        }
+        const int x_364 = tree[x_358].data;
+        if ((2 <= x_364)) {
+          bool x_402_phi = false;
+          const int x_377_save = x_358;
+          const int x_378 = tree[x_377_save].leftIndex;
+          if ((x_378 == -1)) {
+            const float x_385 = asfloat(x_8[0].y);
+            const float x_387 = asfloat(x_8[0].x);
+            if ((x_385 < x_387)) {
+              while (true) {
+                discard;
+              }
+              return;
+            }
+            tree[x_377_save].leftIndex = 6;
+            const BST tint_symbol_16 = {2, -1, -1};
+            tree[6] = tint_symbol_16;
+            while (true) {
+              x_402_phi = x_355;
+              if ((0 < int(x_385))) {
+              } else {
+                break;
+              }
+              x_402_phi = true;
+              break;
+            }
+            x_402 = x_402_phi;
+            x_404_phi = x_402;
+            if (x_402) {
+              break;
+            }
+          } else {
+            x_383 = tree[x_377_save].leftIndex;
+            x_356_phi = x_355;
+            x_359_phi = x_383;
+            {
+              x_356 = x_356_phi;
+              x_359 = x_359_phi;
+              x_355_phi = x_356;
+              x_358_phi = x_359;
+            }
+            continue;
+          }
+        } else {
+          const int x_369_save = x_358;
+          const int x_370 = tree[x_369_save].rightIndex;
+          if ((x_370 == -1)) {
+            tree[x_369_save].rightIndex = 6;
+            const BST tint_symbol_17 = {2, -1, -1};
+            tree[6] = tint_symbol_17;
+            x_404_phi = true;
+            break;
+          } else {
+            x_375 = tree[x_369_save].rightIndex;
+            x_356_phi = x_355;
+            x_359_phi = x_375;
+            {
+              x_356 = x_356_phi;
+              x_359 = x_359_phi;
+              x_355_phi = x_356;
+              x_358_phi = x_359;
+            }
+            continue;
+          }
+          return;
+        }
+        x_356_phi = x_402;
+        x_359_phi = x_358;
+        {
+          x_356 = x_356_phi;
+          x_359 = x_359_phi;
+          x_355_phi = x_356;
+          x_358_phi = x_359;
+        }
+      }
+      if (x_404_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  bool x_409 = false;
+  bool x_456 = false;
+  bool x_409_phi = false;
+  int x_412_phi = 0;
+  bool x_458_phi = false;
+  switch(0u) {
+    default: {
+      x_409_phi = false;
+      x_412_phi = 0;
+      while (true) {
+        int x_437 = 0;
+        int x_429 = 0;
+        bool x_410 = false;
+        int x_413 = 0;
+        bool x_410_phi = false;
+        int x_413_phi = 0;
+        x_409 = x_409_phi;
+        const int x_412 = x_412_phi;
+        x_458_phi = x_409;
+        if ((x_412 <= 7)) {
+        } else {
+          break;
+        }
+        const int x_418 = tree[x_412].data;
+        if ((6 <= x_418)) {
+          bool x_456_phi = false;
+          const int x_431_save = x_412;
+          const int x_432 = tree[x_431_save].leftIndex;
+          if ((x_432 == -1)) {
+            const float x_439 = asfloat(x_8[0].y);
+            const float x_441 = asfloat(x_8[0].x);
+            if ((x_439 < x_441)) {
+              while (true) {
+                discard;
+              }
+              return;
+            }
+            tree[x_431_save].leftIndex = 7;
+            const BST tint_symbol_18 = {6, -1, -1};
+            tree[7] = tint_symbol_18;
+            while (true) {
+              x_456_phi = x_409;
+              if ((0 < int(x_439))) {
+              } else {
+                break;
+              }
+              x_456_phi = true;
+              break;
+            }
+            x_456 = x_456_phi;
+            x_458_phi = x_456;
+            if (x_456) {
+              break;
+            }
+          } else {
+            x_437 = tree[x_431_save].leftIndex;
+            x_410_phi = x_409;
+            x_413_phi = x_437;
+            {
+              x_410 = x_410_phi;
+              x_413 = x_413_phi;
+              x_409_phi = x_410;
+              x_412_phi = x_413;
+            }
+            continue;
+          }
+        } else {
+          const int x_423_save = x_412;
+          const int x_424 = tree[x_423_save].rightIndex;
+          if ((x_424 == -1)) {
+            tree[x_423_save].rightIndex = 7;
+            const BST tint_symbol_19 = {6, -1, -1};
+            tree[7] = tint_symbol_19;
+            x_458_phi = true;
+            break;
+          } else {
+            x_429 = tree[x_423_save].rightIndex;
+            x_410_phi = x_409;
+            x_413_phi = x_429;
+            {
+              x_410 = x_410_phi;
+              x_413 = x_413_phi;
+              x_409_phi = x_410;
+              x_412_phi = x_413;
+            }
+            continue;
+          }
+          return;
+        }
+        x_410_phi = x_456;
+        x_413_phi = x_412;
+        {
+          x_410 = x_410_phi;
+          x_413 = x_413_phi;
+          x_409_phi = x_410;
+          x_412_phi = x_413;
+        }
+      }
+      if (x_458_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  bool x_463 = false;
+  bool x_510 = false;
+  bool x_463_phi = false;
+  int x_466_phi = 0;
+  bool x_512_phi = false;
+  switch(0u) {
+    default: {
+      x_463_phi = false;
+      x_466_phi = 0;
+      while (true) {
+        int x_491 = 0;
+        int x_483 = 0;
+        bool x_464 = false;
+        int x_467 = 0;
+        bool x_464_phi = false;
+        int x_467_phi = 0;
+        x_463 = x_463_phi;
+        const int x_466 = x_466_phi;
+        x_512_phi = x_463;
+        if ((x_466 <= 8)) {
+        } else {
+          break;
+        }
+        const int x_472 = tree[x_466].data;
+        if ((17 <= x_472)) {
+          bool x_510_phi = false;
+          const int x_485_save = x_466;
+          const int x_486 = tree[x_485_save].leftIndex;
+          if ((x_486 == -1)) {
+            const float x_493 = asfloat(x_8[0].y);
+            const float x_495 = asfloat(x_8[0].x);
+            if ((x_493 < x_495)) {
+              while (true) {
+                discard;
+              }
+              return;
+            }
+            tree[x_485_save].leftIndex = 8;
+            const BST tint_symbol_20 = {17, -1, -1};
+            tree[8] = tint_symbol_20;
+            while (true) {
+              x_510_phi = x_463;
+              if ((0 < int(x_493))) {
+              } else {
+                break;
+              }
+              x_510_phi = true;
+              break;
+            }
+            x_510 = x_510_phi;
+            x_512_phi = x_510;
+            if (x_510) {
+              break;
+            }
+          } else {
+            x_491 = tree[x_485_save].leftIndex;
+            x_464_phi = x_463;
+            x_467_phi = x_491;
+            {
+              x_464 = x_464_phi;
+              x_467 = x_467_phi;
+              x_463_phi = x_464;
+              x_466_phi = x_467;
+            }
+            continue;
+          }
+        } else {
+          const int x_477_save = x_466;
+          const int x_478 = tree[x_477_save].rightIndex;
+          if ((x_478 == -1)) {
+            tree[x_477_save].rightIndex = 8;
+            const BST tint_symbol_21 = {17, -1, -1};
+            tree[8] = tint_symbol_21;
+            x_512_phi = true;
+            break;
+          } else {
+            x_483 = tree[x_477_save].rightIndex;
+            x_464_phi = x_463;
+            x_467_phi = x_483;
+            {
+              x_464 = x_464_phi;
+              x_467 = x_467_phi;
+              x_463_phi = x_464;
+              x_466_phi = x_467;
+            }
+            continue;
+          }
+          return;
+        }
+        x_464_phi = x_510;
+        x_467_phi = x_466;
+        {
+          x_464 = x_464_phi;
+          x_467 = x_467_phi;
+          x_463_phi = x_464;
+          x_466_phi = x_467;
+        }
+      }
+      if (x_512_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  bool x_517 = false;
+  bool x_564 = false;
+  bool x_517_phi = false;
+  int x_520_phi = 0;
+  bool x_566_phi = false;
+  switch(0u) {
+    default: {
+      x_517_phi = false;
+      x_520_phi = 0;
+      while (true) {
+        int x_545 = 0;
+        int x_537 = 0;
+        bool x_518 = false;
+        int x_521 = 0;
+        bool x_518_phi = false;
+        int x_521_phi = 0;
+        x_517 = x_517_phi;
+        const int x_520 = x_520_phi;
+        x_566_phi = x_517;
+        if ((x_520 <= 9)) {
+        } else {
+          break;
+        }
+        const int x_526 = tree[x_520].data;
+        if ((13 <= x_526)) {
+          bool x_564_phi = false;
+          const int x_539_save = x_520;
+          const int x_540 = tree[x_539_save].leftIndex;
+          if ((x_540 == -1)) {
+            const float x_547 = asfloat(x_8[0].y);
+            const float x_549 = asfloat(x_8[0].x);
+            if ((x_547 < x_549)) {
+              while (true) {
+                discard;
+              }
+              return;
+            }
+            tree[x_539_save].leftIndex = 9;
+            const BST tint_symbol_22 = {13, -1, -1};
+            tree[9] = tint_symbol_22;
+            while (true) {
+              x_564_phi = x_517;
+              if ((0 < int(x_547))) {
+              } else {
+                break;
+              }
+              x_564_phi = true;
+              break;
+            }
+            x_564 = x_564_phi;
+            x_566_phi = x_564;
+            if (x_564) {
+              break;
+            }
+          } else {
+            x_545 = tree[x_539_save].leftIndex;
+            x_518_phi = x_517;
+            x_521_phi = x_545;
+            {
+              x_518 = x_518_phi;
+              x_521 = x_521_phi;
+              x_517_phi = x_518;
+              x_520_phi = x_521;
+            }
+            continue;
+          }
+        } else {
+          const int x_531_save = x_520;
+          const int x_532 = tree[x_531_save].rightIndex;
+          if ((x_532 == -1)) {
+            tree[x_531_save].rightIndex = 9;
+            const BST tint_symbol_23 = {13, -1, -1};
+            tree[9] = tint_symbol_23;
+            x_566_phi = true;
+            break;
+          } else {
+            x_537 = tree[x_531_save].rightIndex;
+            x_518_phi = x_517;
+            x_521_phi = x_537;
+            {
+              x_518 = x_518_phi;
+              x_521 = x_521_phi;
+              x_517_phi = x_518;
+              x_520_phi = x_521;
+            }
+            continue;
+          }
+          return;
+        }
+        x_518_phi = x_564;
+        x_521_phi = x_520;
+        {
+          x_518 = x_518_phi;
+          x_521 = x_521_phi;
+          x_517_phi = x_518;
+          x_520_phi = x_521;
+        }
+      }
+      if (x_566_phi) {
+        break;
+      }
+      break;
+    }
+  }
+  x_569_phi = 0;
+  x_572_phi = 0;
+  x_574_phi = 0;
+  while (true) {
+    int x_597 = 0;
+    int x_607 = 0;
+    int x_612 = 0;
+    int x_575 = 0;
+    int x_570_phi = 0;
+    int x_573_phi = 0;
+    const int x_569 = x_569_phi;
+    x_572 = x_572_phi;
+    const int x_574 = x_574_phi;
+    if ((x_574 < 20)) {
+    } else {
+      break;
+    }
+    int x_582_phi = 0;
+    int x_597_phi = 0;
+    bool x_598_phi = false;
+    switch(0u) {
+      default: {
+        x_582_phi = 0;
+        while (true) {
+          const int x_582 = x_582_phi;
+          x_597_phi = x_569;
+          x_598_phi = false;
+          if ((x_582 != -1)) {
+          } else {
+            break;
+          }
+          const BST x_589 = tree[x_582];
+          const int x_590 = x_589.data;
+          const int x_591 = x_589.leftIndex;
+          const int x_592 = x_589.rightIndex;
+          if ((x_590 == x_574)) {
+            x_597_phi = x_574;
+            x_598_phi = true;
+            break;
+          }
+          {
+            x_582_phi = ((x_574 > x_590) ? x_592 : x_591);
+          }
+        }
+        x_597 = x_597_phi;
+        const bool x_598 = x_598_phi;
+        x_570_phi = x_597;
+        if (x_598) {
+          break;
+        }
+        x_570_phi = -1;
+        break;
+      }
+    }
+    int x_570 = 0;
+    int x_606 = 0;
+    int x_611 = 0;
+    int x_607_phi = 0;
+    int x_612_phi = 0;
+    x_570 = x_570_phi;
+    switch(x_574) {
+      case 2:
+      case 5:
+      case 6:
+      case 7:
+      case 8:
+      case 9:
+      case 12:
+      case 13:
+      case 15:
+      case 17: {
+        x_607_phi = x_572;
+        if ((x_570 == asint(x_574))) {
+          x_606 = asint((x_572 + asint(1)));
+          x_607_phi = x_606;
+        }
+        x_607 = x_607_phi;
+        x_573_phi = x_607;
+        break;
+      }
+      default: {
+        x_612_phi = x_572;
+        if ((x_570 == asint(-1))) {
+          x_611 = asint((x_572 + asint(1)));
+          x_612_phi = x_611;
+        }
+        x_612 = x_612_phi;
+        x_573_phi = x_612;
+        break;
+      }
+    }
+    const int x_573 = x_573_phi;
+    {
+      x_575 = (x_574 + 1);
+      x_569_phi = x_570;
+      x_572_phi = x_573;
+      x_574_phi = x_575;
+    }
+  }
+  if ((x_572 == asint(20))) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 1.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_24 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_24;
+}
+T:\tmp\uq0.0:1053:20: warning: equality comparison with extraneous parentheses [-Wparentheses-equality]
+        if ((x_570 == asint(x_574))) {
+             ~~~~~~^~~~~~~~~~~~~~~
+T:\tmp\uq0.0:1053:20: note: remove extraneous parentheses around the comparison to silence this warning
+        if ((x_570 == asint(x_574))) {
+            ~      ^              ~
+T:\tmp\uq0.0:1053:20: note: use '=' to turn this equality comparison into an assignment
+        if ((x_570 == asint(x_574))) {
+                   ^~
+                   =
+T:\tmp\uq0.0:1063:20: warning: equality comparison with extraneous parentheses [-Wparentheses-equality]
+        if ((x_570 == asint(-1))) {
+             ~~~~~~^~~~~~~~~~~~
+T:\tmp\uq0.0:1063:20: note: remove extraneous parentheses around the comparison to silence this warning
+        if ((x_570 == asint(-1))) {
+            ~      ^           ~
+T:\tmp\uq0.0:1063:20: note: use '=' to turn this equality comparison into an assignment
+        if ((x_570 == asint(-1))) {
+                   ^~
+                   =
+T:\tmp\uq0.0:1080:14: warning: equality comparison with extraneous parentheses [-Wparentheses-equality]
+  if ((x_572 == asint(20))) {
+       ~~~~~~^~~~~~~~~~~~
+T:\tmp\uq0.0:1080:14: note: remove extraneous parentheses around the comparison to silence this warning
+  if ((x_572 == asint(20))) {
+      ~      ^           ~
+T:\tmp\uq0.0:1080:14: note: use '=' to turn this equality comparison into an assignment
+  if ((x_572 == asint(20))) {
+             ^~
+             =
+error: validation errors
+T:\tmp\uq0.0:1098: error: Loop must have break.
+T:\tmp\uq0.0:1098: error: Loop must have break.
+T:\tmp\uq0.0:1098: error: Loop must have break.
+T:\tmp\uq0.0:1098: error: Loop must have break.
+T:\tmp\uq0.0:1098: error: Loop must have break.
+T:\tmp\uq0.0:1098: error: Loop must have break.
+T:\tmp\uq0.0:1098: error: Loop must have break.
+T:\tmp\uq0.0:1098: error: Loop must have break.
+T:\tmp\uq0.0:1098: error: Loop must have break.
+Validation failed.
+
+
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/1.wgsl.expected.msl
new file mode 100644
index 0000000..5025022
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/1.wgsl.expected.msl
@@ -0,0 +1,1116 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  BST arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_24, thread float4* const tint_symbol_25) {
+  tint_array_wrapper tree = {};
+  bool x_67 = false;
+  bool x_114 = false;
+  int x_572 = 0;
+  bool x_67_phi = false;
+  int x_70_phi = 0;
+  bool x_116_phi = false;
+  int x_119_phi = 0;
+  int x_569_phi = 0;
+  int x_572_phi = 0;
+  int x_574_phi = 0;
+  BST const tint_symbol_4 = {.data=9, .leftIndex=-1, .rightIndex=-1};
+  tree.arr[0] = tint_symbol_4;
+  switch(0u) {
+    default: {
+      x_67_phi = false;
+      x_70_phi = 0;
+      while (true) {
+        int x_95 = 0;
+        int x_87 = 0;
+        bool x_68 = false;
+        int x_71 = 0;
+        bool x_68_phi = false;
+        int x_71_phi = 0;
+        x_67 = x_67_phi;
+        int const x_70 = x_70_phi;
+        x_116_phi = x_67;
+        if ((x_70 <= 1)) {
+        } else {
+          break;
+        }
+        int const x_76 = tree.arr[x_70].data;
+        if ((5 <= x_76)) {
+          bool x_114_phi = false;
+          int const x_89_save = x_70;
+          int const x_90 = tree.arr[x_89_save].leftIndex;
+          if ((x_90 == -1)) {
+            float const x_97 = x_8.injectionSwitch.y;
+            float const x_99 = x_8.injectionSwitch.x;
+            if ((x_97 < x_99)) {
+              while (true) {
+                discard_fragment();
+              }
+              return;
+            }
+            tree.arr[x_89_save].leftIndex = 1;
+            BST const tint_symbol_5 = {.data=5, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[1] = tint_symbol_5;
+            while (true) {
+              x_114_phi = x_67;
+              if ((0 < int(x_97))) {
+              } else {
+                break;
+              }
+              x_114_phi = true;
+              break;
+            }
+            x_114 = x_114_phi;
+            x_116_phi = x_114;
+            if (x_114) {
+              break;
+            }
+          } else {
+            x_95 = tree.arr[x_89_save].leftIndex;
+            x_68_phi = x_67;
+            x_71_phi = x_95;
+            {
+              x_68 = x_68_phi;
+              x_71 = x_71_phi;
+              x_67_phi = x_68;
+              x_70_phi = x_71;
+            }
+            continue;
+          }
+        } else {
+          int const x_81_save = x_70;
+          int const x_82 = tree.arr[x_81_save].rightIndex;
+          if ((x_82 == -1)) {
+            tree.arr[x_81_save].rightIndex = 1;
+            BST const tint_symbol_6 = {.data=5, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[1] = tint_symbol_6;
+            x_116_phi = true;
+            break;
+          } else {
+            x_87 = tree.arr[x_81_save].rightIndex;
+            x_68_phi = x_67;
+            x_71_phi = x_87;
+            {
+              x_68 = x_68_phi;
+              x_71 = x_71_phi;
+              x_67_phi = x_68;
+              x_70_phi = x_71;
+            }
+            continue;
+          }
+          return;
+        }
+        x_68_phi = x_114;
+        x_71_phi = x_70;
+        {
+          x_68 = x_68_phi;
+          x_71 = x_71_phi;
+          x_67_phi = x_68;
+          x_70_phi = x_71;
+        }
+      }
+      bool const x_116 = x_116_phi;
+      if (x_116) {
+        break;
+      }
+      break;
+    }
+  }
+  x_119_phi = 0;
+  while (true) {
+    bool x_133 = false;
+    int x_120 = 0;
+    bool x_134_phi = false;
+    int const x_119 = x_119_phi;
+    float const x_125 = (*(tint_symbol_24)).y;
+    bool const x_126 = (x_125 < 0.0f);
+    x_134_phi = x_126;
+    if (!(x_126)) {
+      float const x_131 = x_8.injectionSwitch.y;
+      x_133 = (x_119 != int(x_131));
+      x_134_phi = x_133;
+    }
+    bool const x_134 = x_134_phi;
+    if (x_134) {
+    } else {
+      break;
+    }
+    bool x_139 = false;
+    bool x_186 = false;
+    bool x_139_phi = false;
+    int x_142_phi = 0;
+    bool x_188_phi = false;
+    switch(0u) {
+      default: {
+        x_139_phi = false;
+        x_142_phi = 0;
+        while (true) {
+          int x_167 = 0;
+          int x_159 = 0;
+          bool x_140 = false;
+          int x_143 = 0;
+          bool x_140_phi = false;
+          int x_143_phi = 0;
+          x_139 = x_139_phi;
+          int const x_142 = x_142_phi;
+          x_188_phi = x_139;
+          if ((x_142 <= 2)) {
+          } else {
+            break;
+          }
+          int const x_148 = tree.arr[x_142].data;
+          if ((12 <= x_148)) {
+            bool x_186_phi = false;
+            int const x_161_save = x_142;
+            int const x_162 = tree.arr[x_161_save].leftIndex;
+            if ((x_162 == -1)) {
+              float const x_169 = x_8.injectionSwitch.y;
+              float const x_171 = x_8.injectionSwitch.x;
+              if ((x_169 < x_171)) {
+                while (true) {
+                  discard_fragment();
+                }
+                return;
+              }
+              tree.arr[x_161_save].leftIndex = 2;
+              BST const tint_symbol_7 = {.data=12, .leftIndex=-1, .rightIndex=-1};
+              tree.arr[2] = tint_symbol_7;
+              while (true) {
+                x_186_phi = x_139;
+                if ((0 < int(x_169))) {
+                } else {
+                  break;
+                }
+                x_186_phi = true;
+                break;
+              }
+              x_186 = x_186_phi;
+              x_188_phi = x_186;
+              if (x_186) {
+                break;
+              }
+            } else {
+              x_167 = tree.arr[x_161_save].leftIndex;
+              x_140_phi = x_139;
+              x_143_phi = x_167;
+              {
+                x_140 = x_140_phi;
+                x_143 = x_143_phi;
+                x_139_phi = x_140;
+                x_142_phi = x_143;
+              }
+              continue;
+            }
+          } else {
+            int const x_153_save = x_142;
+            int const x_154 = tree.arr[x_153_save].rightIndex;
+            if ((x_154 == -1)) {
+              tree.arr[x_153_save].rightIndex = 2;
+              BST const tint_symbol_8 = {.data=12, .leftIndex=-1, .rightIndex=-1};
+              tree.arr[2] = tint_symbol_8;
+              x_188_phi = true;
+              break;
+            } else {
+              x_159 = tree.arr[x_153_save].rightIndex;
+              x_140_phi = x_139;
+              x_143_phi = x_159;
+              {
+                x_140 = x_140_phi;
+                x_143 = x_143_phi;
+                x_139_phi = x_140;
+                x_142_phi = x_143;
+              }
+              continue;
+            }
+            return;
+          }
+          x_140_phi = x_186;
+          x_143_phi = x_142;
+          {
+            x_140 = x_140_phi;
+            x_143 = x_143_phi;
+            x_139_phi = x_140;
+            x_142_phi = x_143;
+          }
+        }
+        bool const x_188 = x_188_phi;
+        if (x_188) {
+          break;
+        }
+        break;
+      }
+    }
+    {
+      x_120 = (x_119 + 1);
+      x_119_phi = x_120;
+    }
+  }
+  bool x_193 = false;
+  bool x_240 = false;
+  bool x_193_phi = false;
+  int x_196_phi = 0;
+  bool x_242_phi = false;
+  switch(0u) {
+    default: {
+      x_193_phi = false;
+      x_196_phi = 0;
+      while (true) {
+        int x_221 = 0;
+        int x_213 = 0;
+        bool x_194 = false;
+        int x_197 = 0;
+        bool x_194_phi = false;
+        int x_197_phi = 0;
+        x_193 = x_193_phi;
+        int const x_196 = x_196_phi;
+        x_242_phi = x_193;
+        if ((x_196 <= 3)) {
+        } else {
+          break;
+        }
+        int const x_202 = tree.arr[x_196].data;
+        if ((15 <= x_202)) {
+          bool x_240_phi = false;
+          int const x_215_save = x_196;
+          int const x_216 = tree.arr[x_215_save].leftIndex;
+          if ((x_216 == -1)) {
+            float const x_223 = x_8.injectionSwitch.y;
+            float const x_225 = x_8.injectionSwitch.x;
+            if ((x_223 < x_225)) {
+              while (true) {
+                discard_fragment();
+              }
+              return;
+            }
+            tree.arr[x_215_save].leftIndex = 3;
+            BST const tint_symbol_9 = {.data=15, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[3] = tint_symbol_9;
+            while (true) {
+              x_240_phi = x_193;
+              if ((0 < int(x_223))) {
+              } else {
+                break;
+              }
+              x_240_phi = true;
+              break;
+            }
+            x_240 = x_240_phi;
+            x_242_phi = x_240;
+            if (x_240) {
+              break;
+            }
+          } else {
+            x_221 = tree.arr[x_215_save].leftIndex;
+            x_194_phi = x_193;
+            x_197_phi = x_221;
+            {
+              x_194 = x_194_phi;
+              x_197 = x_197_phi;
+              x_193_phi = x_194;
+              x_196_phi = x_197;
+            }
+            continue;
+          }
+        } else {
+          int const x_207_save = x_196;
+          int const x_208 = tree.arr[x_207_save].rightIndex;
+          if ((x_208 == -1)) {
+            tree.arr[x_207_save].rightIndex = 3;
+            BST const tint_symbol_10 = {.data=15, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[3] = tint_symbol_10;
+            x_242_phi = true;
+            break;
+          } else {
+            x_213 = tree.arr[x_207_save].rightIndex;
+            x_194_phi = x_193;
+            x_197_phi = x_213;
+            {
+              x_194 = x_194_phi;
+              x_197 = x_197_phi;
+              x_193_phi = x_194;
+              x_196_phi = x_197;
+            }
+            continue;
+          }
+          return;
+        }
+        x_194_phi = x_240;
+        x_197_phi = x_196;
+        {
+          x_194 = x_194_phi;
+          x_197 = x_197_phi;
+          x_193_phi = x_194;
+          x_196_phi = x_197;
+        }
+      }
+      bool const x_242 = x_242_phi;
+      if (x_242) {
+        break;
+      }
+      break;
+    }
+  }
+  bool x_247 = false;
+  bool x_294 = false;
+  bool x_247_phi = false;
+  int x_250_phi = 0;
+  bool x_296_phi = false;
+  switch(0u) {
+    default: {
+      x_247_phi = false;
+      x_250_phi = 0;
+      while (true) {
+        int x_275 = 0;
+        int x_267 = 0;
+        bool x_248 = false;
+        int x_251 = 0;
+        bool x_248_phi = false;
+        int x_251_phi = 0;
+        x_247 = x_247_phi;
+        int const x_250 = x_250_phi;
+        x_296_phi = x_247;
+        if ((x_250 <= 4)) {
+        } else {
+          break;
+        }
+        int const x_256 = tree.arr[x_250].data;
+        if ((7 <= x_256)) {
+          bool x_294_phi = false;
+          int const x_269_save = x_250;
+          int const x_270 = tree.arr[x_269_save].leftIndex;
+          if ((x_270 == -1)) {
+            float const x_277 = x_8.injectionSwitch.y;
+            float const x_279 = x_8.injectionSwitch.x;
+            if ((x_277 < x_279)) {
+              while (true) {
+                discard_fragment();
+              }
+              return;
+            }
+            tree.arr[x_269_save].leftIndex = 4;
+            BST const tint_symbol_11 = {.data=7, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[4] = tint_symbol_11;
+            while (true) {
+              x_294_phi = x_247;
+              if ((0 < int(x_277))) {
+              } else {
+                break;
+              }
+              x_294_phi = true;
+              break;
+            }
+            x_294 = x_294_phi;
+            x_296_phi = x_294;
+            if (x_294) {
+              break;
+            }
+          } else {
+            x_275 = tree.arr[x_269_save].leftIndex;
+            x_248_phi = x_247;
+            x_251_phi = x_275;
+            {
+              x_248 = x_248_phi;
+              x_251 = x_251_phi;
+              x_247_phi = x_248;
+              x_250_phi = x_251;
+            }
+            continue;
+          }
+        } else {
+          int const x_261_save = x_250;
+          int const x_262 = tree.arr[x_261_save].rightIndex;
+          if ((x_262 == -1)) {
+            tree.arr[x_261_save].rightIndex = 4;
+            BST const tint_symbol_12 = {.data=7, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[4] = tint_symbol_12;
+            x_296_phi = true;
+            break;
+          } else {
+            x_267 = tree.arr[x_261_save].rightIndex;
+            x_248_phi = x_247;
+            x_251_phi = x_267;
+            {
+              x_248 = x_248_phi;
+              x_251 = x_251_phi;
+              x_247_phi = x_248;
+              x_250_phi = x_251;
+            }
+            continue;
+          }
+          return;
+        }
+        x_248_phi = x_294;
+        x_251_phi = x_250;
+        {
+          x_248 = x_248_phi;
+          x_251 = x_251_phi;
+          x_247_phi = x_248;
+          x_250_phi = x_251;
+        }
+      }
+      bool const x_296 = x_296_phi;
+      if (x_296) {
+        break;
+      }
+      break;
+    }
+  }
+  bool x_301 = false;
+  bool x_348 = false;
+  bool x_301_phi = false;
+  int x_304_phi = 0;
+  bool x_350_phi = false;
+  switch(0u) {
+    default: {
+      x_301_phi = false;
+      x_304_phi = 0;
+      while (true) {
+        int x_329 = 0;
+        int x_321 = 0;
+        bool x_302 = false;
+        int x_305 = 0;
+        bool x_302_phi = false;
+        int x_305_phi = 0;
+        x_301 = x_301_phi;
+        int const x_304 = x_304_phi;
+        x_350_phi = x_301;
+        if ((x_304 <= 5)) {
+        } else {
+          break;
+        }
+        int const x_310 = tree.arr[x_304].data;
+        if ((8 <= x_310)) {
+          bool x_348_phi = false;
+          int const x_323_save = x_304;
+          int const x_324 = tree.arr[x_323_save].leftIndex;
+          if ((x_324 == -1)) {
+            float const x_331 = x_8.injectionSwitch.y;
+            float const x_333 = x_8.injectionSwitch.x;
+            if ((x_331 < x_333)) {
+              while (true) {
+                discard_fragment();
+              }
+              return;
+            }
+            tree.arr[x_323_save].leftIndex = 5;
+            BST const tint_symbol_13 = {.data=8, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[5] = tint_symbol_13;
+            while (true) {
+              x_348_phi = x_301;
+              if ((0 < int(x_331))) {
+              } else {
+                break;
+              }
+              x_348_phi = true;
+              break;
+            }
+            x_348 = x_348_phi;
+            x_350_phi = x_348;
+            if (x_348) {
+              break;
+            }
+          } else {
+            x_329 = tree.arr[x_323_save].leftIndex;
+            x_302_phi = x_301;
+            x_305_phi = x_329;
+            {
+              x_302 = x_302_phi;
+              x_305 = x_305_phi;
+              x_301_phi = x_302;
+              x_304_phi = x_305;
+            }
+            continue;
+          }
+        } else {
+          int const x_315_save = x_304;
+          int const x_316 = tree.arr[x_315_save].rightIndex;
+          if ((x_316 == -1)) {
+            tree.arr[x_315_save].rightIndex = 5;
+            BST const tint_symbol_14 = {.data=8, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[5] = tint_symbol_14;
+            x_350_phi = true;
+            break;
+          } else {
+            x_321 = tree.arr[x_315_save].rightIndex;
+            x_302_phi = x_301;
+            x_305_phi = x_321;
+            {
+              x_302 = x_302_phi;
+              x_305 = x_305_phi;
+              x_301_phi = x_302;
+              x_304_phi = x_305;
+            }
+            continue;
+          }
+          return;
+        }
+        x_302_phi = x_348;
+        x_305_phi = x_304;
+        {
+          x_302 = x_302_phi;
+          x_305 = x_305_phi;
+          x_301_phi = x_302;
+          x_304_phi = x_305;
+        }
+      }
+      bool const x_350 = x_350_phi;
+      if (x_350) {
+        break;
+      }
+      break;
+    }
+  }
+  bool x_355 = false;
+  bool x_402 = false;
+  bool x_355_phi = false;
+  int x_358_phi = 0;
+  bool x_404_phi = false;
+  switch(0u) {
+    default: {
+      x_355_phi = false;
+      x_358_phi = 0;
+      while (true) {
+        int x_383 = 0;
+        int x_375 = 0;
+        bool x_356 = false;
+        int x_359 = 0;
+        bool x_356_phi = false;
+        int x_359_phi = 0;
+        x_355 = x_355_phi;
+        int const x_358 = x_358_phi;
+        x_404_phi = x_355;
+        if ((x_358 <= 6)) {
+        } else {
+          break;
+        }
+        int const x_364 = tree.arr[x_358].data;
+        if ((2 <= x_364)) {
+          bool x_402_phi = false;
+          int const x_377_save = x_358;
+          int const x_378 = tree.arr[x_377_save].leftIndex;
+          if ((x_378 == -1)) {
+            float const x_385 = x_8.injectionSwitch.y;
+            float const x_387 = x_8.injectionSwitch.x;
+            if ((x_385 < x_387)) {
+              while (true) {
+                discard_fragment();
+              }
+              return;
+            }
+            tree.arr[x_377_save].leftIndex = 6;
+            BST const tint_symbol_15 = {.data=2, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[6] = tint_symbol_15;
+            while (true) {
+              x_402_phi = x_355;
+              if ((0 < int(x_385))) {
+              } else {
+                break;
+              }
+              x_402_phi = true;
+              break;
+            }
+            x_402 = x_402_phi;
+            x_404_phi = x_402;
+            if (x_402) {
+              break;
+            }
+          } else {
+            x_383 = tree.arr[x_377_save].leftIndex;
+            x_356_phi = x_355;
+            x_359_phi = x_383;
+            {
+              x_356 = x_356_phi;
+              x_359 = x_359_phi;
+              x_355_phi = x_356;
+              x_358_phi = x_359;
+            }
+            continue;
+          }
+        } else {
+          int const x_369_save = x_358;
+          int const x_370 = tree.arr[x_369_save].rightIndex;
+          if ((x_370 == -1)) {
+            tree.arr[x_369_save].rightIndex = 6;
+            BST const tint_symbol_16 = {.data=2, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[6] = tint_symbol_16;
+            x_404_phi = true;
+            break;
+          } else {
+            x_375 = tree.arr[x_369_save].rightIndex;
+            x_356_phi = x_355;
+            x_359_phi = x_375;
+            {
+              x_356 = x_356_phi;
+              x_359 = x_359_phi;
+              x_355_phi = x_356;
+              x_358_phi = x_359;
+            }
+            continue;
+          }
+          return;
+        }
+        x_356_phi = x_402;
+        x_359_phi = x_358;
+        {
+          x_356 = x_356_phi;
+          x_359 = x_359_phi;
+          x_355_phi = x_356;
+          x_358_phi = x_359;
+        }
+      }
+      bool const x_404 = x_404_phi;
+      if (x_404) {
+        break;
+      }
+      break;
+    }
+  }
+  bool x_409 = false;
+  bool x_456 = false;
+  bool x_409_phi = false;
+  int x_412_phi = 0;
+  bool x_458_phi = false;
+  switch(0u) {
+    default: {
+      x_409_phi = false;
+      x_412_phi = 0;
+      while (true) {
+        int x_437 = 0;
+        int x_429 = 0;
+        bool x_410 = false;
+        int x_413 = 0;
+        bool x_410_phi = false;
+        int x_413_phi = 0;
+        x_409 = x_409_phi;
+        int const x_412 = x_412_phi;
+        x_458_phi = x_409;
+        if ((x_412 <= 7)) {
+        } else {
+          break;
+        }
+        int const x_418 = tree.arr[x_412].data;
+        if ((6 <= x_418)) {
+          bool x_456_phi = false;
+          int const x_431_save = x_412;
+          int const x_432 = tree.arr[x_431_save].leftIndex;
+          if ((x_432 == -1)) {
+            float const x_439 = x_8.injectionSwitch.y;
+            float const x_441 = x_8.injectionSwitch.x;
+            if ((x_439 < x_441)) {
+              while (true) {
+                discard_fragment();
+              }
+              return;
+            }
+            tree.arr[x_431_save].leftIndex = 7;
+            BST const tint_symbol_17 = {.data=6, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[7] = tint_symbol_17;
+            while (true) {
+              x_456_phi = x_409;
+              if ((0 < int(x_439))) {
+              } else {
+                break;
+              }
+              x_456_phi = true;
+              break;
+            }
+            x_456 = x_456_phi;
+            x_458_phi = x_456;
+            if (x_456) {
+              break;
+            }
+          } else {
+            x_437 = tree.arr[x_431_save].leftIndex;
+            x_410_phi = x_409;
+            x_413_phi = x_437;
+            {
+              x_410 = x_410_phi;
+              x_413 = x_413_phi;
+              x_409_phi = x_410;
+              x_412_phi = x_413;
+            }
+            continue;
+          }
+        } else {
+          int const x_423_save = x_412;
+          int const x_424 = tree.arr[x_423_save].rightIndex;
+          if ((x_424 == -1)) {
+            tree.arr[x_423_save].rightIndex = 7;
+            BST const tint_symbol_18 = {.data=6, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[7] = tint_symbol_18;
+            x_458_phi = true;
+            break;
+          } else {
+            x_429 = tree.arr[x_423_save].rightIndex;
+            x_410_phi = x_409;
+            x_413_phi = x_429;
+            {
+              x_410 = x_410_phi;
+              x_413 = x_413_phi;
+              x_409_phi = x_410;
+              x_412_phi = x_413;
+            }
+            continue;
+          }
+          return;
+        }
+        x_410_phi = x_456;
+        x_413_phi = x_412;
+        {
+          x_410 = x_410_phi;
+          x_413 = x_413_phi;
+          x_409_phi = x_410;
+          x_412_phi = x_413;
+        }
+      }
+      bool const x_458 = x_458_phi;
+      if (x_458) {
+        break;
+      }
+      break;
+    }
+  }
+  bool x_463 = false;
+  bool x_510 = false;
+  bool x_463_phi = false;
+  int x_466_phi = 0;
+  bool x_512_phi = false;
+  switch(0u) {
+    default: {
+      x_463_phi = false;
+      x_466_phi = 0;
+      while (true) {
+        int x_491 = 0;
+        int x_483 = 0;
+        bool x_464 = false;
+        int x_467 = 0;
+        bool x_464_phi = false;
+        int x_467_phi = 0;
+        x_463 = x_463_phi;
+        int const x_466 = x_466_phi;
+        x_512_phi = x_463;
+        if ((x_466 <= 8)) {
+        } else {
+          break;
+        }
+        int const x_472 = tree.arr[x_466].data;
+        if ((17 <= x_472)) {
+          bool x_510_phi = false;
+          int const x_485_save = x_466;
+          int const x_486 = tree.arr[x_485_save].leftIndex;
+          if ((x_486 == -1)) {
+            float const x_493 = x_8.injectionSwitch.y;
+            float const x_495 = x_8.injectionSwitch.x;
+            if ((x_493 < x_495)) {
+              while (true) {
+                discard_fragment();
+              }
+              return;
+            }
+            tree.arr[x_485_save].leftIndex = 8;
+            BST const tint_symbol_19 = {.data=17, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[8] = tint_symbol_19;
+            while (true) {
+              x_510_phi = x_463;
+              if ((0 < int(x_493))) {
+              } else {
+                break;
+              }
+              x_510_phi = true;
+              break;
+            }
+            x_510 = x_510_phi;
+            x_512_phi = x_510;
+            if (x_510) {
+              break;
+            }
+          } else {
+            x_491 = tree.arr[x_485_save].leftIndex;
+            x_464_phi = x_463;
+            x_467_phi = x_491;
+            {
+              x_464 = x_464_phi;
+              x_467 = x_467_phi;
+              x_463_phi = x_464;
+              x_466_phi = x_467;
+            }
+            continue;
+          }
+        } else {
+          int const x_477_save = x_466;
+          int const x_478 = tree.arr[x_477_save].rightIndex;
+          if ((x_478 == -1)) {
+            tree.arr[x_477_save].rightIndex = 8;
+            BST const tint_symbol_20 = {.data=17, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[8] = tint_symbol_20;
+            x_512_phi = true;
+            break;
+          } else {
+            x_483 = tree.arr[x_477_save].rightIndex;
+            x_464_phi = x_463;
+            x_467_phi = x_483;
+            {
+              x_464 = x_464_phi;
+              x_467 = x_467_phi;
+              x_463_phi = x_464;
+              x_466_phi = x_467;
+            }
+            continue;
+          }
+          return;
+        }
+        x_464_phi = x_510;
+        x_467_phi = x_466;
+        {
+          x_464 = x_464_phi;
+          x_467 = x_467_phi;
+          x_463_phi = x_464;
+          x_466_phi = x_467;
+        }
+      }
+      bool const x_512 = x_512_phi;
+      if (x_512) {
+        break;
+      }
+      break;
+    }
+  }
+  bool x_517 = false;
+  bool x_564 = false;
+  bool x_517_phi = false;
+  int x_520_phi = 0;
+  bool x_566_phi = false;
+  switch(0u) {
+    default: {
+      x_517_phi = false;
+      x_520_phi = 0;
+      while (true) {
+        int x_545 = 0;
+        int x_537 = 0;
+        bool x_518 = false;
+        int x_521 = 0;
+        bool x_518_phi = false;
+        int x_521_phi = 0;
+        x_517 = x_517_phi;
+        int const x_520 = x_520_phi;
+        x_566_phi = x_517;
+        if ((x_520 <= 9)) {
+        } else {
+          break;
+        }
+        int const x_526 = tree.arr[x_520].data;
+        if ((13 <= x_526)) {
+          bool x_564_phi = false;
+          int const x_539_save = x_520;
+          int const x_540 = tree.arr[x_539_save].leftIndex;
+          if ((x_540 == -1)) {
+            float const x_547 = x_8.injectionSwitch.y;
+            float const x_549 = x_8.injectionSwitch.x;
+            if ((x_547 < x_549)) {
+              while (true) {
+                discard_fragment();
+              }
+              return;
+            }
+            tree.arr[x_539_save].leftIndex = 9;
+            BST const tint_symbol_21 = {.data=13, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[9] = tint_symbol_21;
+            while (true) {
+              x_564_phi = x_517;
+              if ((0 < int(x_547))) {
+              } else {
+                break;
+              }
+              x_564_phi = true;
+              break;
+            }
+            x_564 = x_564_phi;
+            x_566_phi = x_564;
+            if (x_564) {
+              break;
+            }
+          } else {
+            x_545 = tree.arr[x_539_save].leftIndex;
+            x_518_phi = x_517;
+            x_521_phi = x_545;
+            {
+              x_518 = x_518_phi;
+              x_521 = x_521_phi;
+              x_517_phi = x_518;
+              x_520_phi = x_521;
+            }
+            continue;
+          }
+        } else {
+          int const x_531_save = x_520;
+          int const x_532 = tree.arr[x_531_save].rightIndex;
+          if ((x_532 == -1)) {
+            tree.arr[x_531_save].rightIndex = 9;
+            BST const tint_symbol_22 = {.data=13, .leftIndex=-1, .rightIndex=-1};
+            tree.arr[9] = tint_symbol_22;
+            x_566_phi = true;
+            break;
+          } else {
+            x_537 = tree.arr[x_531_save].rightIndex;
+            x_518_phi = x_517;
+            x_521_phi = x_537;
+            {
+              x_518 = x_518_phi;
+              x_521 = x_521_phi;
+              x_517_phi = x_518;
+              x_520_phi = x_521;
+            }
+            continue;
+          }
+          return;
+        }
+        x_518_phi = x_564;
+        x_521_phi = x_520;
+        {
+          x_518 = x_518_phi;
+          x_521 = x_521_phi;
+          x_517_phi = x_518;
+          x_520_phi = x_521;
+        }
+      }
+      bool const x_566 = x_566_phi;
+      if (x_566) {
+        break;
+      }
+      break;
+    }
+  }
+  x_569_phi = 0;
+  x_572_phi = 0;
+  x_574_phi = 0;
+  while (true) {
+    int x_597 = 0;
+    int x_607 = 0;
+    int x_612 = 0;
+    int x_575 = 0;
+    int x_570_phi = 0;
+    int x_573_phi = 0;
+    int const x_569 = x_569_phi;
+    x_572 = x_572_phi;
+    int const x_574 = x_574_phi;
+    if ((x_574 < 20)) {
+    } else {
+      break;
+    }
+    int x_582_phi = 0;
+    int x_597_phi = 0;
+    bool x_598_phi = false;
+    switch(0u) {
+      default: {
+        x_582_phi = 0;
+        while (true) {
+          int const x_582 = x_582_phi;
+          x_597_phi = x_569;
+          x_598_phi = false;
+          if ((x_582 != -1)) {
+          } else {
+            break;
+          }
+          BST const x_589 = tree.arr[x_582];
+          int const x_590 = x_589.data;
+          int const x_591 = x_589.leftIndex;
+          int const x_592 = x_589.rightIndex;
+          if ((x_590 == x_574)) {
+            x_597_phi = x_574;
+            x_598_phi = true;
+            break;
+          }
+          {
+            x_582_phi = select(x_591, x_592, (x_574 > x_590));
+          }
+        }
+        x_597 = x_597_phi;
+        bool const x_598 = x_598_phi;
+        x_570_phi = x_597;
+        if (x_598) {
+          break;
+        }
+        x_570_phi = -1;
+        break;
+      }
+    }
+    int x_570 = 0;
+    int x_606 = 0;
+    int x_611 = 0;
+    int x_607_phi = 0;
+    int x_612_phi = 0;
+    x_570 = x_570_phi;
+    switch(x_574) {
+      case 2:
+      case 5:
+      case 6:
+      case 7:
+      case 8:
+      case 9:
+      case 12:
+      case 13:
+      case 15:
+      case 17: {
+        x_607_phi = x_572;
+        if ((x_570 == as_type<int>(x_574))) {
+          x_606 = as_type<int>((x_572 + as_type<int>(1)));
+          x_607_phi = x_606;
+        }
+        x_607 = x_607_phi;
+        x_573_phi = x_607;
+        break;
+      }
+      default: {
+        x_612_phi = x_572;
+        if ((x_570 == as_type<int>(-1))) {
+          x_611 = as_type<int>((x_572 + as_type<int>(1)));
+          x_612_phi = x_611;
+        }
+        x_612 = x_612_phi;
+        x_573_phi = x_612;
+        break;
+      }
+    }
+    int const x_573 = x_573_phi;
+    {
+      x_575 = (x_574 + 1);
+      x_569_phi = x_570;
+      x_572_phi = x_573;
+      x_574_phi = x_575;
+    }
+  }
+  if ((x_572 == as_type<int>(20))) {
+    *(tint_symbol_25) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_25) = float4(0.0f, 0.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_26 = 0.0f;
+  thread float4 tint_symbol_27 = 0.0f;
+  tint_symbol_26 = gl_FragCoord_param;
+  main_1(x_8, &(tint_symbol_26), &(tint_symbol_27));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_27};
+  tint_symbol_2 const tint_symbol_23 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_23;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..41d75a5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/1.wgsl.expected.spvasm
@@ -0,0 +1,1920 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 1006
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_8 "x_8"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %BST "BST"
+               OpMemberName %BST 0 "data"
+               OpMemberName %BST 1 "leftIndex"
+               OpMemberName %BST 2 "rightIndex"
+               OpName %tree "tree"
+               OpName %x_67 "x_67"
+               OpName %x_114 "x_114"
+               OpName %x_572 "x_572"
+               OpName %x_67_phi "x_67_phi"
+               OpName %x_70_phi "x_70_phi"
+               OpName %x_116_phi "x_116_phi"
+               OpName %x_119_phi "x_119_phi"
+               OpName %x_569_phi "x_569_phi"
+               OpName %x_572_phi "x_572_phi"
+               OpName %x_574_phi "x_574_phi"
+               OpName %x_95 "x_95"
+               OpName %x_87 "x_87"
+               OpName %x_68 "x_68"
+               OpName %x_71 "x_71"
+               OpName %x_68_phi "x_68_phi"
+               OpName %x_71_phi "x_71_phi"
+               OpName %x_114_phi "x_114_phi"
+               OpName %x_133 "x_133"
+               OpName %x_120 "x_120"
+               OpName %x_134_phi "x_134_phi"
+               OpName %x_139 "x_139"
+               OpName %x_186 "x_186"
+               OpName %x_139_phi "x_139_phi"
+               OpName %x_142_phi "x_142_phi"
+               OpName %x_188_phi "x_188_phi"
+               OpName %x_167 "x_167"
+               OpName %x_159 "x_159"
+               OpName %x_140 "x_140"
+               OpName %x_143 "x_143"
+               OpName %x_140_phi "x_140_phi"
+               OpName %x_143_phi "x_143_phi"
+               OpName %x_186_phi "x_186_phi"
+               OpName %x_193 "x_193"
+               OpName %x_240 "x_240"
+               OpName %x_193_phi "x_193_phi"
+               OpName %x_196_phi "x_196_phi"
+               OpName %x_242_phi "x_242_phi"
+               OpName %x_221 "x_221"
+               OpName %x_213 "x_213"
+               OpName %x_194 "x_194"
+               OpName %x_197 "x_197"
+               OpName %x_194_phi "x_194_phi"
+               OpName %x_197_phi "x_197_phi"
+               OpName %x_240_phi "x_240_phi"
+               OpName %x_247 "x_247"
+               OpName %x_294 "x_294"
+               OpName %x_247_phi "x_247_phi"
+               OpName %x_250_phi "x_250_phi"
+               OpName %x_296_phi "x_296_phi"
+               OpName %x_275 "x_275"
+               OpName %x_267 "x_267"
+               OpName %x_248 "x_248"
+               OpName %x_251 "x_251"
+               OpName %x_248_phi "x_248_phi"
+               OpName %x_251_phi "x_251_phi"
+               OpName %x_294_phi "x_294_phi"
+               OpName %x_301 "x_301"
+               OpName %x_348 "x_348"
+               OpName %x_301_phi "x_301_phi"
+               OpName %x_304_phi "x_304_phi"
+               OpName %x_350_phi "x_350_phi"
+               OpName %x_329 "x_329"
+               OpName %x_321 "x_321"
+               OpName %x_302 "x_302"
+               OpName %x_305 "x_305"
+               OpName %x_302_phi "x_302_phi"
+               OpName %x_305_phi "x_305_phi"
+               OpName %x_348_phi "x_348_phi"
+               OpName %x_355 "x_355"
+               OpName %x_402 "x_402"
+               OpName %x_355_phi "x_355_phi"
+               OpName %x_358_phi "x_358_phi"
+               OpName %x_404_phi "x_404_phi"
+               OpName %x_383 "x_383"
+               OpName %x_375 "x_375"
+               OpName %x_356 "x_356"
+               OpName %x_359 "x_359"
+               OpName %x_356_phi "x_356_phi"
+               OpName %x_359_phi "x_359_phi"
+               OpName %x_402_phi "x_402_phi"
+               OpName %x_409 "x_409"
+               OpName %x_456 "x_456"
+               OpName %x_409_phi "x_409_phi"
+               OpName %x_412_phi "x_412_phi"
+               OpName %x_458_phi "x_458_phi"
+               OpName %x_437 "x_437"
+               OpName %x_429 "x_429"
+               OpName %x_410 "x_410"
+               OpName %x_413 "x_413"
+               OpName %x_410_phi "x_410_phi"
+               OpName %x_413_phi "x_413_phi"
+               OpName %x_456_phi "x_456_phi"
+               OpName %x_463 "x_463"
+               OpName %x_510 "x_510"
+               OpName %x_463_phi "x_463_phi"
+               OpName %x_466_phi "x_466_phi"
+               OpName %x_512_phi "x_512_phi"
+               OpName %x_491 "x_491"
+               OpName %x_483 "x_483"
+               OpName %x_464 "x_464"
+               OpName %x_467 "x_467"
+               OpName %x_464_phi "x_464_phi"
+               OpName %x_467_phi "x_467_phi"
+               OpName %x_510_phi "x_510_phi"
+               OpName %x_517 "x_517"
+               OpName %x_564 "x_564"
+               OpName %x_517_phi "x_517_phi"
+               OpName %x_520_phi "x_520_phi"
+               OpName %x_566_phi "x_566_phi"
+               OpName %x_545 "x_545"
+               OpName %x_537 "x_537"
+               OpName %x_518 "x_518"
+               OpName %x_521 "x_521"
+               OpName %x_518_phi "x_518_phi"
+               OpName %x_521_phi "x_521_phi"
+               OpName %x_564_phi "x_564_phi"
+               OpName %x_597 "x_597"
+               OpName %x_607 "x_607"
+               OpName %x_612 "x_612"
+               OpName %x_575 "x_575"
+               OpName %x_570_phi "x_570_phi"
+               OpName %x_573_phi "x_573_phi"
+               OpName %x_582_phi "x_582_phi"
+               OpName %x_597_phi "x_597_phi"
+               OpName %x_598_phi "x_598_phi"
+               OpName %x_570 "x_570"
+               OpName %x_606 "x_606"
+               OpName %x_611 "x_611"
+               OpName %x_607_phi "x_607_phi"
+               OpName %x_612_phi "x_612_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %BST 0 Offset 0
+               OpMemberDecorate %BST 1 Offset 4
+               OpMemberDecorate %BST 2 Offset 8
+               OpDecorate %_arr_BST_uint_10 ArrayStride 12
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+        %BST = OpTypeStruct %int %int %int
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_BST_uint_10 = OpTypeArray %BST %uint_10
+%_ptr_Function__arr_BST_uint_10 = OpTypePointer Function %_arr_BST_uint_10
+         %26 = OpConstantNull %_arr_BST_uint_10
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %30 = OpConstantNull %bool
+%_ptr_Function_int = OpTypePointer Function %int
+         %34 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+%_ptr_Function_BST = OpTypePointer Function %BST
+      %int_9 = OpConstant %int 9
+     %int_n1 = OpConstant %int -1
+         %47 = OpConstantComposite %BST %int_9 %int_n1 %int_n1
+     %uint_0 = OpConstant %uint 0
+      %false = OpConstantFalse %bool
+      %int_1 = OpConstant %int 1
+      %int_5 = OpConstant %int 5
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+         %99 = OpConstantComposite %BST %int_5 %int_n1 %int_n1
+       %true = OpConstantTrue %bool
+     %uint_2 = OpConstant %uint 2
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+      %int_2 = OpConstant %int 2
+     %int_12 = OpConstant %int 12
+        %218 = OpConstantComposite %BST %int_12 %int_n1 %int_n1
+      %int_3 = OpConstant %int 3
+     %int_15 = OpConstant %int 15
+        %312 = OpConstantComposite %BST %int_15 %int_n1 %int_n1
+      %int_4 = OpConstant %int 4
+      %int_7 = OpConstant %int 7
+        %404 = OpConstantComposite %BST %int_7 %int_n1 %int_n1
+      %int_8 = OpConstant %int 8
+        %495 = OpConstantComposite %BST %int_8 %int_n1 %int_n1
+      %int_6 = OpConstant %int 6
+        %586 = OpConstantComposite %BST %int_2 %int_n1 %int_n1
+        %676 = OpConstantComposite %BST %int_6 %int_n1 %int_n1
+     %int_17 = OpConstant %int 17
+        %767 = OpConstantComposite %BST %int_17 %int_n1 %int_n1
+     %int_13 = OpConstant %int 13
+        %858 = OpConstantComposite %BST %int_13 %int_n1 %int_n1
+     %int_20 = OpConstant %int 20
+    %float_1 = OpConstant %float 1
+        %991 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %992 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+        %993 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+       %tree = OpVariable %_ptr_Function__arr_BST_uint_10 Function %26
+       %x_67 = OpVariable %_ptr_Function_bool Function %30
+      %x_114 = OpVariable %_ptr_Function_bool Function %30
+      %x_572 = OpVariable %_ptr_Function_int Function %34
+   %x_67_phi = OpVariable %_ptr_Function_bool Function %30
+   %x_70_phi = OpVariable %_ptr_Function_int Function %34
+  %x_116_phi = OpVariable %_ptr_Function_bool Function %30
+  %x_119_phi = OpVariable %_ptr_Function_int Function %34
+  %x_569_phi = OpVariable %_ptr_Function_int Function %34
+  %x_572_phi = OpVariable %_ptr_Function_int Function %34
+  %x_574_phi = OpVariable %_ptr_Function_int Function %34
+       %x_95 = OpVariable %_ptr_Function_int Function %34
+       %x_87 = OpVariable %_ptr_Function_int Function %34
+       %x_68 = OpVariable %_ptr_Function_bool Function %30
+       %x_71 = OpVariable %_ptr_Function_int Function %34
+   %x_68_phi = OpVariable %_ptr_Function_bool Function %30
+   %x_71_phi = OpVariable %_ptr_Function_int Function %34
+  %x_114_phi = OpVariable %_ptr_Function_bool Function %30
+      %x_133 = OpVariable %_ptr_Function_bool Function %30
+      %x_120 = OpVariable %_ptr_Function_int Function %34
+  %x_134_phi = OpVariable %_ptr_Function_bool Function %30
+      %x_139 = OpVariable %_ptr_Function_bool Function %30
+      %x_186 = OpVariable %_ptr_Function_bool Function %30
+  %x_139_phi = OpVariable %_ptr_Function_bool Function %30
+  %x_142_phi = OpVariable %_ptr_Function_int Function %34
+  %x_188_phi = OpVariable %_ptr_Function_bool Function %30
+      %x_167 = OpVariable %_ptr_Function_int Function %34
+      %x_159 = OpVariable %_ptr_Function_int Function %34
+      %x_140 = OpVariable %_ptr_Function_bool Function %30
+      %x_143 = OpVariable %_ptr_Function_int Function %34
+  %x_140_phi = OpVariable %_ptr_Function_bool Function %30
+  %x_143_phi = OpVariable %_ptr_Function_int Function %34
+  %x_186_phi = OpVariable %_ptr_Function_bool Function %30
+      %x_193 = OpVariable %_ptr_Function_bool Function %30
+      %x_240 = OpVariable %_ptr_Function_bool Function %30
+  %x_193_phi = OpVariable %_ptr_Function_bool Function %30
+  %x_196_phi = OpVariable %_ptr_Function_int Function %34
+  %x_242_phi = OpVariable %_ptr_Function_bool Function %30
+      %x_221 = OpVariable %_ptr_Function_int Function %34
+      %x_213 = OpVariable %_ptr_Function_int Function %34
+      %x_194 = OpVariable %_ptr_Function_bool Function %30
+      %x_197 = OpVariable %_ptr_Function_int Function %34
+  %x_194_phi = OpVariable %_ptr_Function_bool Function %30
+  %x_197_phi = OpVariable %_ptr_Function_int Function %34
+  %x_240_phi = OpVariable %_ptr_Function_bool Function %30
+      %x_247 = OpVariable %_ptr_Function_bool Function %30
+      %x_294 = OpVariable %_ptr_Function_bool Function %30
+  %x_247_phi = OpVariable %_ptr_Function_bool Function %30
+  %x_250_phi = OpVariable %_ptr_Function_int Function %34
+  %x_296_phi = OpVariable %_ptr_Function_bool Function %30
+      %x_275 = OpVariable %_ptr_Function_int Function %34
+      %x_267 = OpVariable %_ptr_Function_int Function %34
+      %x_248 = OpVariable %_ptr_Function_bool Function %30
+      %x_251 = OpVariable %_ptr_Function_int Function %34
+  %x_248_phi = OpVariable %_ptr_Function_bool Function %30
+  %x_251_phi = OpVariable %_ptr_Function_int Function %34
+  %x_294_phi = OpVariable %_ptr_Function_bool Function %30
+      %x_301 = OpVariable %_ptr_Function_bool Function %30
+      %x_348 = OpVariable %_ptr_Function_bool Function %30
+  %x_301_phi = OpVariable %_ptr_Function_bool Function %30
+  %x_304_phi = OpVariable %_ptr_Function_int Function %34
+  %x_350_phi = OpVariable %_ptr_Function_bool Function %30
+      %x_329 = OpVariable %_ptr_Function_int Function %34
+      %x_321 = OpVariable %_ptr_Function_int Function %34
+      %x_302 = OpVariable %_ptr_Function_bool Function %30
+      %x_305 = OpVariable %_ptr_Function_int Function %34
+  %x_302_phi = OpVariable %_ptr_Function_bool Function %30
+  %x_305_phi = OpVariable %_ptr_Function_int Function %34
+  %x_348_phi = OpVariable %_ptr_Function_bool Function %30
+      %x_355 = OpVariable %_ptr_Function_bool Function %30
+      %x_402 = OpVariable %_ptr_Function_bool Function %30
+  %x_355_phi = OpVariable %_ptr_Function_bool Function %30
+  %x_358_phi = OpVariable %_ptr_Function_int Function %34
+  %x_404_phi = OpVariable %_ptr_Function_bool Function %30
+      %x_383 = OpVariable %_ptr_Function_int Function %34
+      %x_375 = OpVariable %_ptr_Function_int Function %34
+      %x_356 = OpVariable %_ptr_Function_bool Function %30
+      %x_359 = OpVariable %_ptr_Function_int Function %34
+  %x_356_phi = OpVariable %_ptr_Function_bool Function %30
+  %x_359_phi = OpVariable %_ptr_Function_int Function %34
+  %x_402_phi = OpVariable %_ptr_Function_bool Function %30
+      %x_409 = OpVariable %_ptr_Function_bool Function %30
+      %x_456 = OpVariable %_ptr_Function_bool Function %30
+  %x_409_phi = OpVariable %_ptr_Function_bool Function %30
+  %x_412_phi = OpVariable %_ptr_Function_int Function %34
+  %x_458_phi = OpVariable %_ptr_Function_bool Function %30
+      %x_437 = OpVariable %_ptr_Function_int Function %34
+      %x_429 = OpVariable %_ptr_Function_int Function %34
+      %x_410 = OpVariable %_ptr_Function_bool Function %30
+      %x_413 = OpVariable %_ptr_Function_int Function %34
+  %x_410_phi = OpVariable %_ptr_Function_bool Function %30
+  %x_413_phi = OpVariable %_ptr_Function_int Function %34
+  %x_456_phi = OpVariable %_ptr_Function_bool Function %30
+      %x_463 = OpVariable %_ptr_Function_bool Function %30
+      %x_510 = OpVariable %_ptr_Function_bool Function %30
+  %x_463_phi = OpVariable %_ptr_Function_bool Function %30
+  %x_466_phi = OpVariable %_ptr_Function_int Function %34
+  %x_512_phi = OpVariable %_ptr_Function_bool Function %30
+      %x_491 = OpVariable %_ptr_Function_int Function %34
+      %x_483 = OpVariable %_ptr_Function_int Function %34
+      %x_464 = OpVariable %_ptr_Function_bool Function %30
+      %x_467 = OpVariable %_ptr_Function_int Function %34
+  %x_464_phi = OpVariable %_ptr_Function_bool Function %30
+  %x_467_phi = OpVariable %_ptr_Function_int Function %34
+  %x_510_phi = OpVariable %_ptr_Function_bool Function %30
+      %x_517 = OpVariable %_ptr_Function_bool Function %30
+      %x_564 = OpVariable %_ptr_Function_bool Function %30
+  %x_517_phi = OpVariable %_ptr_Function_bool Function %30
+  %x_520_phi = OpVariable %_ptr_Function_int Function %34
+  %x_566_phi = OpVariable %_ptr_Function_bool Function %30
+      %x_545 = OpVariable %_ptr_Function_int Function %34
+      %x_537 = OpVariable %_ptr_Function_int Function %34
+      %x_518 = OpVariable %_ptr_Function_bool Function %30
+      %x_521 = OpVariable %_ptr_Function_int Function %34
+  %x_518_phi = OpVariable %_ptr_Function_bool Function %30
+  %x_521_phi = OpVariable %_ptr_Function_int Function %34
+  %x_564_phi = OpVariable %_ptr_Function_bool Function %30
+      %x_597 = OpVariable %_ptr_Function_int Function %34
+      %x_607 = OpVariable %_ptr_Function_int Function %34
+      %x_612 = OpVariable %_ptr_Function_int Function %34
+      %x_575 = OpVariable %_ptr_Function_int Function %34
+  %x_570_phi = OpVariable %_ptr_Function_int Function %34
+  %x_573_phi = OpVariable %_ptr_Function_int Function %34
+  %x_582_phi = OpVariable %_ptr_Function_int Function %34
+  %x_597_phi = OpVariable %_ptr_Function_int Function %34
+  %x_598_phi = OpVariable %_ptr_Function_bool Function %30
+      %x_570 = OpVariable %_ptr_Function_int Function %34
+      %x_606 = OpVariable %_ptr_Function_int Function %34
+      %x_611 = OpVariable %_ptr_Function_int Function %34
+  %x_607_phi = OpVariable %_ptr_Function_int Function %34
+  %x_612_phi = OpVariable %_ptr_Function_int Function %34
+         %44 = OpAccessChain %_ptr_Function_BST %tree %int_0
+               OpStore %44 %47
+               OpSelectionMerge %48 None
+               OpSwitch %uint_0 %50
+         %50 = OpLabel
+               OpStore %x_67_phi %false
+               OpStore %x_70_phi %int_0
+               OpBranch %52
+         %52 = OpLabel
+               OpLoopMerge %53 %54 None
+               OpBranch %55
+         %55 = OpLabel
+         %62 = OpLoad %bool %x_67_phi
+               OpStore %x_67 %62
+         %63 = OpLoad %int %x_70_phi
+         %64 = OpLoad %bool %x_67
+               OpStore %x_116_phi %64
+         %66 = OpSLessThanEqual %bool %63 %int_1
+               OpSelectionMerge %67 None
+               OpBranchConditional %66 %68 %69
+         %68 = OpLabel
+               OpBranch %67
+         %69 = OpLabel
+               OpBranch %53
+         %67 = OpLabel
+         %70 = OpAccessChain %_ptr_Function_int %tree %63 %uint_0
+         %71 = OpLoad %int %70
+         %73 = OpSLessThanEqual %bool %int_5 %71
+               OpSelectionMerge %74 None
+               OpBranchConditional %73 %75 %76
+         %75 = OpLabel
+         %79 = OpAccessChain %_ptr_Function_int %tree %63 %uint_1
+         %80 = OpLoad %int %79
+         %81 = OpIEqual %bool %80 %int_n1
+               OpSelectionMerge %82 None
+               OpBranchConditional %81 %83 %84
+         %83 = OpLabel
+         %86 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+         %87 = OpLoad %float %86
+         %88 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+         %89 = OpLoad %float %88
+         %90 = OpFOrdLessThan %bool %87 %89
+               OpSelectionMerge %91 None
+               OpBranchConditional %90 %92 %91
+         %92 = OpLabel
+               OpBranch %93
+         %93 = OpLabel
+               OpLoopMerge %94 %95 None
+               OpBranch %96
+         %96 = OpLabel
+               OpKill
+         %95 = OpLabel
+               OpBranch %93
+         %94 = OpLabel
+               OpReturn
+         %91 = OpLabel
+         %97 = OpAccessChain %_ptr_Function_int %tree %63 %uint_1
+               OpStore %97 %int_1
+         %98 = OpAccessChain %_ptr_Function_BST %tree %int_1
+               OpStore %98 %99
+               OpBranch %100
+        %100 = OpLabel
+               OpLoopMerge %101 %102 None
+               OpBranch %103
+        %103 = OpLabel
+        %104 = OpLoad %bool %x_67
+               OpStore %x_114_phi %104
+        %105 = OpConvertFToS %int %87
+        %106 = OpSLessThan %bool %int_0 %105
+               OpSelectionMerge %107 None
+               OpBranchConditional %106 %108 %109
+        %108 = OpLabel
+               OpBranch %107
+        %109 = OpLabel
+               OpBranch %101
+        %107 = OpLabel
+               OpStore %x_114_phi %true
+               OpBranch %101
+        %102 = OpLabel
+               OpBranch %100
+        %101 = OpLabel
+        %111 = OpLoad %bool %x_114_phi
+               OpStore %x_114 %111
+        %112 = OpLoad %bool %x_114
+               OpStore %x_116_phi %112
+        %113 = OpLoad %bool %x_114
+               OpSelectionMerge %114 None
+               OpBranchConditional %113 %115 %114
+        %115 = OpLabel
+               OpBranch %53
+        %114 = OpLabel
+               OpBranch %82
+         %84 = OpLabel
+        %116 = OpAccessChain %_ptr_Function_int %tree %63 %uint_1
+        %117 = OpLoad %int %116
+               OpStore %x_95 %117
+        %118 = OpLoad %bool %x_67
+               OpStore %x_68_phi %118
+        %119 = OpLoad %int %x_95
+               OpStore %x_71_phi %119
+               OpBranch %54
+         %82 = OpLabel
+               OpBranch %74
+         %76 = OpLabel
+        %121 = OpAccessChain %_ptr_Function_int %tree %63 %uint_2
+        %122 = OpLoad %int %121
+        %123 = OpIEqual %bool %122 %int_n1
+               OpSelectionMerge %124 None
+               OpBranchConditional %123 %125 %126
+        %125 = OpLabel
+        %127 = OpAccessChain %_ptr_Function_int %tree %63 %uint_2
+               OpStore %127 %int_1
+        %128 = OpAccessChain %_ptr_Function_BST %tree %int_1
+               OpStore %128 %99
+               OpStore %x_116_phi %true
+               OpBranch %53
+        %126 = OpLabel
+        %129 = OpAccessChain %_ptr_Function_int %tree %63 %uint_2
+        %130 = OpLoad %int %129
+               OpStore %x_87 %130
+        %131 = OpLoad %bool %x_67
+               OpStore %x_68_phi %131
+        %132 = OpLoad %int %x_87
+               OpStore %x_71_phi %132
+               OpBranch %54
+        %124 = OpLabel
+               OpReturn
+         %74 = OpLabel
+        %133 = OpLoad %bool %x_114
+               OpStore %x_68_phi %133
+               OpStore %x_71_phi %63
+               OpBranch %54
+         %54 = OpLabel
+        %134 = OpLoad %bool %x_68_phi
+               OpStore %x_68 %134
+        %135 = OpLoad %int %x_71_phi
+               OpStore %x_71 %135
+        %136 = OpLoad %bool %x_68
+               OpStore %x_67_phi %136
+        %137 = OpLoad %int %x_71
+               OpStore %x_70_phi %137
+               OpBranch %52
+         %53 = OpLabel
+        %138 = OpLoad %bool %x_116_phi
+               OpSelectionMerge %139 None
+               OpBranchConditional %138 %140 %139
+        %140 = OpLabel
+               OpBranch %48
+        %139 = OpLabel
+               OpBranch %48
+         %48 = OpLabel
+               OpStore %x_119_phi %int_0
+               OpBranch %141
+        %141 = OpLabel
+               OpLoopMerge %142 %143 None
+               OpBranch %144
+        %144 = OpLabel
+        %148 = OpLoad %int %x_119_phi
+        %150 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %151 = OpLoad %float %150
+        %153 = OpFOrdLessThan %bool %151 %float_0
+               OpStore %x_134_phi %153
+        %154 = OpLogicalNot %bool %153
+               OpSelectionMerge %155 None
+               OpBranchConditional %154 %156 %155
+        %156 = OpLabel
+        %157 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+        %158 = OpLoad %float %157
+        %159 = OpConvertFToS %int %158
+        %160 = OpINotEqual %bool %148 %159
+               OpStore %x_133 %160
+        %161 = OpLoad %bool %x_133
+               OpStore %x_134_phi %161
+               OpBranch %155
+        %155 = OpLabel
+        %162 = OpLoad %bool %x_134_phi
+               OpSelectionMerge %163 None
+               OpBranchConditional %162 %164 %165
+        %164 = OpLabel
+               OpBranch %163
+        %165 = OpLabel
+               OpBranch %142
+        %163 = OpLabel
+               OpSelectionMerge %171 None
+               OpSwitch %uint_0 %172
+        %172 = OpLabel
+               OpStore %x_139_phi %false
+               OpStore %x_142_phi %int_0
+               OpBranch %173
+        %173 = OpLabel
+               OpLoopMerge %174 %175 None
+               OpBranch %176
+        %176 = OpLabel
+        %183 = OpLoad %bool %x_139_phi
+               OpStore %x_139 %183
+        %184 = OpLoad %int %x_142_phi
+        %185 = OpLoad %bool %x_139
+               OpStore %x_188_phi %185
+        %187 = OpSLessThanEqual %bool %184 %int_2
+               OpSelectionMerge %188 None
+               OpBranchConditional %187 %189 %190
+        %189 = OpLabel
+               OpBranch %188
+        %190 = OpLabel
+               OpBranch %174
+        %188 = OpLabel
+        %191 = OpAccessChain %_ptr_Function_int %tree %184 %uint_0
+        %192 = OpLoad %int %191
+        %194 = OpSLessThanEqual %bool %int_12 %192
+               OpSelectionMerge %195 None
+               OpBranchConditional %194 %196 %197
+        %196 = OpLabel
+        %199 = OpAccessChain %_ptr_Function_int %tree %184 %uint_1
+        %200 = OpLoad %int %199
+        %201 = OpIEqual %bool %200 %int_n1
+               OpSelectionMerge %202 None
+               OpBranchConditional %201 %203 %204
+        %203 = OpLabel
+        %205 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+        %206 = OpLoad %float %205
+        %207 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+        %208 = OpLoad %float %207
+        %209 = OpFOrdLessThan %bool %206 %208
+               OpSelectionMerge %210 None
+               OpBranchConditional %209 %211 %210
+        %211 = OpLabel
+               OpBranch %212
+        %212 = OpLabel
+               OpLoopMerge %213 %214 None
+               OpBranch %215
+        %215 = OpLabel
+               OpKill
+        %214 = OpLabel
+               OpBranch %212
+        %213 = OpLabel
+               OpReturn
+        %210 = OpLabel
+        %216 = OpAccessChain %_ptr_Function_int %tree %184 %uint_1
+               OpStore %216 %int_2
+        %217 = OpAccessChain %_ptr_Function_BST %tree %int_2
+               OpStore %217 %218
+               OpBranch %219
+        %219 = OpLabel
+               OpLoopMerge %220 %221 None
+               OpBranch %222
+        %222 = OpLabel
+        %223 = OpLoad %bool %x_139
+               OpStore %x_186_phi %223
+        %224 = OpConvertFToS %int %206
+        %225 = OpSLessThan %bool %int_0 %224
+               OpSelectionMerge %226 None
+               OpBranchConditional %225 %227 %228
+        %227 = OpLabel
+               OpBranch %226
+        %228 = OpLabel
+               OpBranch %220
+        %226 = OpLabel
+               OpStore %x_186_phi %true
+               OpBranch %220
+        %221 = OpLabel
+               OpBranch %219
+        %220 = OpLabel
+        %229 = OpLoad %bool %x_186_phi
+               OpStore %x_186 %229
+        %230 = OpLoad %bool %x_186
+               OpStore %x_188_phi %230
+        %231 = OpLoad %bool %x_186
+               OpSelectionMerge %232 None
+               OpBranchConditional %231 %233 %232
+        %233 = OpLabel
+               OpBranch %174
+        %232 = OpLabel
+               OpBranch %202
+        %204 = OpLabel
+        %234 = OpAccessChain %_ptr_Function_int %tree %184 %uint_1
+        %235 = OpLoad %int %234
+               OpStore %x_167 %235
+        %236 = OpLoad %bool %x_139
+               OpStore %x_140_phi %236
+        %237 = OpLoad %int %x_167
+               OpStore %x_143_phi %237
+               OpBranch %175
+        %202 = OpLabel
+               OpBranch %195
+        %197 = OpLabel
+        %238 = OpAccessChain %_ptr_Function_int %tree %184 %uint_2
+        %239 = OpLoad %int %238
+        %240 = OpIEqual %bool %239 %int_n1
+               OpSelectionMerge %241 None
+               OpBranchConditional %240 %242 %243
+        %242 = OpLabel
+        %244 = OpAccessChain %_ptr_Function_int %tree %184 %uint_2
+               OpStore %244 %int_2
+        %245 = OpAccessChain %_ptr_Function_BST %tree %int_2
+               OpStore %245 %218
+               OpStore %x_188_phi %true
+               OpBranch %174
+        %243 = OpLabel
+        %246 = OpAccessChain %_ptr_Function_int %tree %184 %uint_2
+        %247 = OpLoad %int %246
+               OpStore %x_159 %247
+        %248 = OpLoad %bool %x_139
+               OpStore %x_140_phi %248
+        %249 = OpLoad %int %x_159
+               OpStore %x_143_phi %249
+               OpBranch %175
+        %241 = OpLabel
+               OpReturn
+        %195 = OpLabel
+        %250 = OpLoad %bool %x_186
+               OpStore %x_140_phi %250
+               OpStore %x_143_phi %184
+               OpBranch %175
+        %175 = OpLabel
+        %251 = OpLoad %bool %x_140_phi
+               OpStore %x_140 %251
+        %252 = OpLoad %int %x_143_phi
+               OpStore %x_143 %252
+        %253 = OpLoad %bool %x_140
+               OpStore %x_139_phi %253
+        %254 = OpLoad %int %x_143
+               OpStore %x_142_phi %254
+               OpBranch %173
+        %174 = OpLabel
+        %255 = OpLoad %bool %x_188_phi
+               OpSelectionMerge %256 None
+               OpBranchConditional %255 %257 %256
+        %257 = OpLabel
+               OpBranch %171
+        %256 = OpLabel
+               OpBranch %171
+        %171 = OpLabel
+               OpBranch %143
+        %143 = OpLabel
+        %258 = OpIAdd %int %148 %int_1
+               OpStore %x_120 %258
+        %259 = OpLoad %int %x_120
+               OpStore %x_119_phi %259
+               OpBranch %141
+        %142 = OpLabel
+               OpSelectionMerge %265 None
+               OpSwitch %uint_0 %266
+        %266 = OpLabel
+               OpStore %x_193_phi %false
+               OpStore %x_196_phi %int_0
+               OpBranch %267
+        %267 = OpLabel
+               OpLoopMerge %268 %269 None
+               OpBranch %270
+        %270 = OpLabel
+        %277 = OpLoad %bool %x_193_phi
+               OpStore %x_193 %277
+        %278 = OpLoad %int %x_196_phi
+        %279 = OpLoad %bool %x_193
+               OpStore %x_242_phi %279
+        %281 = OpSLessThanEqual %bool %278 %int_3
+               OpSelectionMerge %282 None
+               OpBranchConditional %281 %283 %284
+        %283 = OpLabel
+               OpBranch %282
+        %284 = OpLabel
+               OpBranch %268
+        %282 = OpLabel
+        %285 = OpAccessChain %_ptr_Function_int %tree %278 %uint_0
+        %286 = OpLoad %int %285
+        %288 = OpSLessThanEqual %bool %int_15 %286
+               OpSelectionMerge %289 None
+               OpBranchConditional %288 %290 %291
+        %290 = OpLabel
+        %293 = OpAccessChain %_ptr_Function_int %tree %278 %uint_1
+        %294 = OpLoad %int %293
+        %295 = OpIEqual %bool %294 %int_n1
+               OpSelectionMerge %296 None
+               OpBranchConditional %295 %297 %298
+        %297 = OpLabel
+        %299 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+        %300 = OpLoad %float %299
+        %301 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+        %302 = OpLoad %float %301
+        %303 = OpFOrdLessThan %bool %300 %302
+               OpSelectionMerge %304 None
+               OpBranchConditional %303 %305 %304
+        %305 = OpLabel
+               OpBranch %306
+        %306 = OpLabel
+               OpLoopMerge %307 %308 None
+               OpBranch %309
+        %309 = OpLabel
+               OpKill
+        %308 = OpLabel
+               OpBranch %306
+        %307 = OpLabel
+               OpReturn
+        %304 = OpLabel
+        %310 = OpAccessChain %_ptr_Function_int %tree %278 %uint_1
+               OpStore %310 %int_3
+        %311 = OpAccessChain %_ptr_Function_BST %tree %int_3
+               OpStore %311 %312
+               OpBranch %313
+        %313 = OpLabel
+               OpLoopMerge %314 %315 None
+               OpBranch %316
+        %316 = OpLabel
+        %317 = OpLoad %bool %x_193
+               OpStore %x_240_phi %317
+        %318 = OpConvertFToS %int %300
+        %319 = OpSLessThan %bool %int_0 %318
+               OpSelectionMerge %320 None
+               OpBranchConditional %319 %321 %322
+        %321 = OpLabel
+               OpBranch %320
+        %322 = OpLabel
+               OpBranch %314
+        %320 = OpLabel
+               OpStore %x_240_phi %true
+               OpBranch %314
+        %315 = OpLabel
+               OpBranch %313
+        %314 = OpLabel
+        %323 = OpLoad %bool %x_240_phi
+               OpStore %x_240 %323
+        %324 = OpLoad %bool %x_240
+               OpStore %x_242_phi %324
+        %325 = OpLoad %bool %x_240
+               OpSelectionMerge %326 None
+               OpBranchConditional %325 %327 %326
+        %327 = OpLabel
+               OpBranch %268
+        %326 = OpLabel
+               OpBranch %296
+        %298 = OpLabel
+        %328 = OpAccessChain %_ptr_Function_int %tree %278 %uint_1
+        %329 = OpLoad %int %328
+               OpStore %x_221 %329
+        %330 = OpLoad %bool %x_193
+               OpStore %x_194_phi %330
+        %331 = OpLoad %int %x_221
+               OpStore %x_197_phi %331
+               OpBranch %269
+        %296 = OpLabel
+               OpBranch %289
+        %291 = OpLabel
+        %332 = OpAccessChain %_ptr_Function_int %tree %278 %uint_2
+        %333 = OpLoad %int %332
+        %334 = OpIEqual %bool %333 %int_n1
+               OpSelectionMerge %335 None
+               OpBranchConditional %334 %336 %337
+        %336 = OpLabel
+        %338 = OpAccessChain %_ptr_Function_int %tree %278 %uint_2
+               OpStore %338 %int_3
+        %339 = OpAccessChain %_ptr_Function_BST %tree %int_3
+               OpStore %339 %312
+               OpStore %x_242_phi %true
+               OpBranch %268
+        %337 = OpLabel
+        %340 = OpAccessChain %_ptr_Function_int %tree %278 %uint_2
+        %341 = OpLoad %int %340
+               OpStore %x_213 %341
+        %342 = OpLoad %bool %x_193
+               OpStore %x_194_phi %342
+        %343 = OpLoad %int %x_213
+               OpStore %x_197_phi %343
+               OpBranch %269
+        %335 = OpLabel
+               OpReturn
+        %289 = OpLabel
+        %344 = OpLoad %bool %x_240
+               OpStore %x_194_phi %344
+               OpStore %x_197_phi %278
+               OpBranch %269
+        %269 = OpLabel
+        %345 = OpLoad %bool %x_194_phi
+               OpStore %x_194 %345
+        %346 = OpLoad %int %x_197_phi
+               OpStore %x_197 %346
+        %347 = OpLoad %bool %x_194
+               OpStore %x_193_phi %347
+        %348 = OpLoad %int %x_197
+               OpStore %x_196_phi %348
+               OpBranch %267
+        %268 = OpLabel
+        %349 = OpLoad %bool %x_242_phi
+               OpSelectionMerge %350 None
+               OpBranchConditional %349 %351 %350
+        %351 = OpLabel
+               OpBranch %265
+        %350 = OpLabel
+               OpBranch %265
+        %265 = OpLabel
+               OpSelectionMerge %357 None
+               OpSwitch %uint_0 %358
+        %358 = OpLabel
+               OpStore %x_247_phi %false
+               OpStore %x_250_phi %int_0
+               OpBranch %359
+        %359 = OpLabel
+               OpLoopMerge %360 %361 None
+               OpBranch %362
+        %362 = OpLabel
+        %369 = OpLoad %bool %x_247_phi
+               OpStore %x_247 %369
+        %370 = OpLoad %int %x_250_phi
+        %371 = OpLoad %bool %x_247
+               OpStore %x_296_phi %371
+        %373 = OpSLessThanEqual %bool %370 %int_4
+               OpSelectionMerge %374 None
+               OpBranchConditional %373 %375 %376
+        %375 = OpLabel
+               OpBranch %374
+        %376 = OpLabel
+               OpBranch %360
+        %374 = OpLabel
+        %377 = OpAccessChain %_ptr_Function_int %tree %370 %uint_0
+        %378 = OpLoad %int %377
+        %380 = OpSLessThanEqual %bool %int_7 %378
+               OpSelectionMerge %381 None
+               OpBranchConditional %380 %382 %383
+        %382 = OpLabel
+        %385 = OpAccessChain %_ptr_Function_int %tree %370 %uint_1
+        %386 = OpLoad %int %385
+        %387 = OpIEqual %bool %386 %int_n1
+               OpSelectionMerge %388 None
+               OpBranchConditional %387 %389 %390
+        %389 = OpLabel
+        %391 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+        %392 = OpLoad %float %391
+        %393 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+        %394 = OpLoad %float %393
+        %395 = OpFOrdLessThan %bool %392 %394
+               OpSelectionMerge %396 None
+               OpBranchConditional %395 %397 %396
+        %397 = OpLabel
+               OpBranch %398
+        %398 = OpLabel
+               OpLoopMerge %399 %400 None
+               OpBranch %401
+        %401 = OpLabel
+               OpKill
+        %400 = OpLabel
+               OpBranch %398
+        %399 = OpLabel
+               OpReturn
+        %396 = OpLabel
+        %402 = OpAccessChain %_ptr_Function_int %tree %370 %uint_1
+               OpStore %402 %int_4
+        %403 = OpAccessChain %_ptr_Function_BST %tree %int_4
+               OpStore %403 %404
+               OpBranch %405
+        %405 = OpLabel
+               OpLoopMerge %406 %407 None
+               OpBranch %408
+        %408 = OpLabel
+        %409 = OpLoad %bool %x_247
+               OpStore %x_294_phi %409
+        %410 = OpConvertFToS %int %392
+        %411 = OpSLessThan %bool %int_0 %410
+               OpSelectionMerge %412 None
+               OpBranchConditional %411 %413 %414
+        %413 = OpLabel
+               OpBranch %412
+        %414 = OpLabel
+               OpBranch %406
+        %412 = OpLabel
+               OpStore %x_294_phi %true
+               OpBranch %406
+        %407 = OpLabel
+               OpBranch %405
+        %406 = OpLabel
+        %415 = OpLoad %bool %x_294_phi
+               OpStore %x_294 %415
+        %416 = OpLoad %bool %x_294
+               OpStore %x_296_phi %416
+        %417 = OpLoad %bool %x_294
+               OpSelectionMerge %418 None
+               OpBranchConditional %417 %419 %418
+        %419 = OpLabel
+               OpBranch %360
+        %418 = OpLabel
+               OpBranch %388
+        %390 = OpLabel
+        %420 = OpAccessChain %_ptr_Function_int %tree %370 %uint_1
+        %421 = OpLoad %int %420
+               OpStore %x_275 %421
+        %422 = OpLoad %bool %x_247
+               OpStore %x_248_phi %422
+        %423 = OpLoad %int %x_275
+               OpStore %x_251_phi %423
+               OpBranch %361
+        %388 = OpLabel
+               OpBranch %381
+        %383 = OpLabel
+        %424 = OpAccessChain %_ptr_Function_int %tree %370 %uint_2
+        %425 = OpLoad %int %424
+        %426 = OpIEqual %bool %425 %int_n1
+               OpSelectionMerge %427 None
+               OpBranchConditional %426 %428 %429
+        %428 = OpLabel
+        %430 = OpAccessChain %_ptr_Function_int %tree %370 %uint_2
+               OpStore %430 %int_4
+        %431 = OpAccessChain %_ptr_Function_BST %tree %int_4
+               OpStore %431 %404
+               OpStore %x_296_phi %true
+               OpBranch %360
+        %429 = OpLabel
+        %432 = OpAccessChain %_ptr_Function_int %tree %370 %uint_2
+        %433 = OpLoad %int %432
+               OpStore %x_267 %433
+        %434 = OpLoad %bool %x_247
+               OpStore %x_248_phi %434
+        %435 = OpLoad %int %x_267
+               OpStore %x_251_phi %435
+               OpBranch %361
+        %427 = OpLabel
+               OpReturn
+        %381 = OpLabel
+        %436 = OpLoad %bool %x_294
+               OpStore %x_248_phi %436
+               OpStore %x_251_phi %370
+               OpBranch %361
+        %361 = OpLabel
+        %437 = OpLoad %bool %x_248_phi
+               OpStore %x_248 %437
+        %438 = OpLoad %int %x_251_phi
+               OpStore %x_251 %438
+        %439 = OpLoad %bool %x_248
+               OpStore %x_247_phi %439
+        %440 = OpLoad %int %x_251
+               OpStore %x_250_phi %440
+               OpBranch %359
+        %360 = OpLabel
+        %441 = OpLoad %bool %x_296_phi
+               OpSelectionMerge %442 None
+               OpBranchConditional %441 %443 %442
+        %443 = OpLabel
+               OpBranch %357
+        %442 = OpLabel
+               OpBranch %357
+        %357 = OpLabel
+               OpSelectionMerge %449 None
+               OpSwitch %uint_0 %450
+        %450 = OpLabel
+               OpStore %x_301_phi %false
+               OpStore %x_304_phi %int_0
+               OpBranch %451
+        %451 = OpLabel
+               OpLoopMerge %452 %453 None
+               OpBranch %454
+        %454 = OpLabel
+        %461 = OpLoad %bool %x_301_phi
+               OpStore %x_301 %461
+        %462 = OpLoad %int %x_304_phi
+        %463 = OpLoad %bool %x_301
+               OpStore %x_350_phi %463
+        %464 = OpSLessThanEqual %bool %462 %int_5
+               OpSelectionMerge %465 None
+               OpBranchConditional %464 %466 %467
+        %466 = OpLabel
+               OpBranch %465
+        %467 = OpLabel
+               OpBranch %452
+        %465 = OpLabel
+        %468 = OpAccessChain %_ptr_Function_int %tree %462 %uint_0
+        %469 = OpLoad %int %468
+        %471 = OpSLessThanEqual %bool %int_8 %469
+               OpSelectionMerge %472 None
+               OpBranchConditional %471 %473 %474
+        %473 = OpLabel
+        %476 = OpAccessChain %_ptr_Function_int %tree %462 %uint_1
+        %477 = OpLoad %int %476
+        %478 = OpIEqual %bool %477 %int_n1
+               OpSelectionMerge %479 None
+               OpBranchConditional %478 %480 %481
+        %480 = OpLabel
+        %482 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+        %483 = OpLoad %float %482
+        %484 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+        %485 = OpLoad %float %484
+        %486 = OpFOrdLessThan %bool %483 %485
+               OpSelectionMerge %487 None
+               OpBranchConditional %486 %488 %487
+        %488 = OpLabel
+               OpBranch %489
+        %489 = OpLabel
+               OpLoopMerge %490 %491 None
+               OpBranch %492
+        %492 = OpLabel
+               OpKill
+        %491 = OpLabel
+               OpBranch %489
+        %490 = OpLabel
+               OpReturn
+        %487 = OpLabel
+        %493 = OpAccessChain %_ptr_Function_int %tree %462 %uint_1
+               OpStore %493 %int_5
+        %494 = OpAccessChain %_ptr_Function_BST %tree %int_5
+               OpStore %494 %495
+               OpBranch %496
+        %496 = OpLabel
+               OpLoopMerge %497 %498 None
+               OpBranch %499
+        %499 = OpLabel
+        %500 = OpLoad %bool %x_301
+               OpStore %x_348_phi %500
+        %501 = OpConvertFToS %int %483
+        %502 = OpSLessThan %bool %int_0 %501
+               OpSelectionMerge %503 None
+               OpBranchConditional %502 %504 %505
+        %504 = OpLabel
+               OpBranch %503
+        %505 = OpLabel
+               OpBranch %497
+        %503 = OpLabel
+               OpStore %x_348_phi %true
+               OpBranch %497
+        %498 = OpLabel
+               OpBranch %496
+        %497 = OpLabel
+        %506 = OpLoad %bool %x_348_phi
+               OpStore %x_348 %506
+        %507 = OpLoad %bool %x_348
+               OpStore %x_350_phi %507
+        %508 = OpLoad %bool %x_348
+               OpSelectionMerge %509 None
+               OpBranchConditional %508 %510 %509
+        %510 = OpLabel
+               OpBranch %452
+        %509 = OpLabel
+               OpBranch %479
+        %481 = OpLabel
+        %511 = OpAccessChain %_ptr_Function_int %tree %462 %uint_1
+        %512 = OpLoad %int %511
+               OpStore %x_329 %512
+        %513 = OpLoad %bool %x_301
+               OpStore %x_302_phi %513
+        %514 = OpLoad %int %x_329
+               OpStore %x_305_phi %514
+               OpBranch %453
+        %479 = OpLabel
+               OpBranch %472
+        %474 = OpLabel
+        %515 = OpAccessChain %_ptr_Function_int %tree %462 %uint_2
+        %516 = OpLoad %int %515
+        %517 = OpIEqual %bool %516 %int_n1
+               OpSelectionMerge %518 None
+               OpBranchConditional %517 %519 %520
+        %519 = OpLabel
+        %521 = OpAccessChain %_ptr_Function_int %tree %462 %uint_2
+               OpStore %521 %int_5
+        %522 = OpAccessChain %_ptr_Function_BST %tree %int_5
+               OpStore %522 %495
+               OpStore %x_350_phi %true
+               OpBranch %452
+        %520 = OpLabel
+        %523 = OpAccessChain %_ptr_Function_int %tree %462 %uint_2
+        %524 = OpLoad %int %523
+               OpStore %x_321 %524
+        %525 = OpLoad %bool %x_301
+               OpStore %x_302_phi %525
+        %526 = OpLoad %int %x_321
+               OpStore %x_305_phi %526
+               OpBranch %453
+        %518 = OpLabel
+               OpReturn
+        %472 = OpLabel
+        %527 = OpLoad %bool %x_348
+               OpStore %x_302_phi %527
+               OpStore %x_305_phi %462
+               OpBranch %453
+        %453 = OpLabel
+        %528 = OpLoad %bool %x_302_phi
+               OpStore %x_302 %528
+        %529 = OpLoad %int %x_305_phi
+               OpStore %x_305 %529
+        %530 = OpLoad %bool %x_302
+               OpStore %x_301_phi %530
+        %531 = OpLoad %int %x_305
+               OpStore %x_304_phi %531
+               OpBranch %451
+        %452 = OpLabel
+        %532 = OpLoad %bool %x_350_phi
+               OpSelectionMerge %533 None
+               OpBranchConditional %532 %534 %533
+        %534 = OpLabel
+               OpBranch %449
+        %533 = OpLabel
+               OpBranch %449
+        %449 = OpLabel
+               OpSelectionMerge %540 None
+               OpSwitch %uint_0 %541
+        %541 = OpLabel
+               OpStore %x_355_phi %false
+               OpStore %x_358_phi %int_0
+               OpBranch %542
+        %542 = OpLabel
+               OpLoopMerge %543 %544 None
+               OpBranch %545
+        %545 = OpLabel
+        %552 = OpLoad %bool %x_355_phi
+               OpStore %x_355 %552
+        %553 = OpLoad %int %x_358_phi
+        %554 = OpLoad %bool %x_355
+               OpStore %x_404_phi %554
+        %556 = OpSLessThanEqual %bool %553 %int_6
+               OpSelectionMerge %557 None
+               OpBranchConditional %556 %558 %559
+        %558 = OpLabel
+               OpBranch %557
+        %559 = OpLabel
+               OpBranch %543
+        %557 = OpLabel
+        %560 = OpAccessChain %_ptr_Function_int %tree %553 %uint_0
+        %561 = OpLoad %int %560
+        %562 = OpSLessThanEqual %bool %int_2 %561
+               OpSelectionMerge %563 None
+               OpBranchConditional %562 %564 %565
+        %564 = OpLabel
+        %567 = OpAccessChain %_ptr_Function_int %tree %553 %uint_1
+        %568 = OpLoad %int %567
+        %569 = OpIEqual %bool %568 %int_n1
+               OpSelectionMerge %570 None
+               OpBranchConditional %569 %571 %572
+        %571 = OpLabel
+        %573 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+        %574 = OpLoad %float %573
+        %575 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+        %576 = OpLoad %float %575
+        %577 = OpFOrdLessThan %bool %574 %576
+               OpSelectionMerge %578 None
+               OpBranchConditional %577 %579 %578
+        %579 = OpLabel
+               OpBranch %580
+        %580 = OpLabel
+               OpLoopMerge %581 %582 None
+               OpBranch %583
+        %583 = OpLabel
+               OpKill
+        %582 = OpLabel
+               OpBranch %580
+        %581 = OpLabel
+               OpReturn
+        %578 = OpLabel
+        %584 = OpAccessChain %_ptr_Function_int %tree %553 %uint_1
+               OpStore %584 %int_6
+        %585 = OpAccessChain %_ptr_Function_BST %tree %int_6
+               OpStore %585 %586
+               OpBranch %587
+        %587 = OpLabel
+               OpLoopMerge %588 %589 None
+               OpBranch %590
+        %590 = OpLabel
+        %591 = OpLoad %bool %x_355
+               OpStore %x_402_phi %591
+        %592 = OpConvertFToS %int %574
+        %593 = OpSLessThan %bool %int_0 %592
+               OpSelectionMerge %594 None
+               OpBranchConditional %593 %595 %596
+        %595 = OpLabel
+               OpBranch %594
+        %596 = OpLabel
+               OpBranch %588
+        %594 = OpLabel
+               OpStore %x_402_phi %true
+               OpBranch %588
+        %589 = OpLabel
+               OpBranch %587
+        %588 = OpLabel
+        %597 = OpLoad %bool %x_402_phi
+               OpStore %x_402 %597
+        %598 = OpLoad %bool %x_402
+               OpStore %x_404_phi %598
+        %599 = OpLoad %bool %x_402
+               OpSelectionMerge %600 None
+               OpBranchConditional %599 %601 %600
+        %601 = OpLabel
+               OpBranch %543
+        %600 = OpLabel
+               OpBranch %570
+        %572 = OpLabel
+        %602 = OpAccessChain %_ptr_Function_int %tree %553 %uint_1
+        %603 = OpLoad %int %602
+               OpStore %x_383 %603
+        %604 = OpLoad %bool %x_355
+               OpStore %x_356_phi %604
+        %605 = OpLoad %int %x_383
+               OpStore %x_359_phi %605
+               OpBranch %544
+        %570 = OpLabel
+               OpBranch %563
+        %565 = OpLabel
+        %606 = OpAccessChain %_ptr_Function_int %tree %553 %uint_2
+        %607 = OpLoad %int %606
+        %608 = OpIEqual %bool %607 %int_n1
+               OpSelectionMerge %609 None
+               OpBranchConditional %608 %610 %611
+        %610 = OpLabel
+        %612 = OpAccessChain %_ptr_Function_int %tree %553 %uint_2
+               OpStore %612 %int_6
+        %613 = OpAccessChain %_ptr_Function_BST %tree %int_6
+               OpStore %613 %586
+               OpStore %x_404_phi %true
+               OpBranch %543
+        %611 = OpLabel
+        %614 = OpAccessChain %_ptr_Function_int %tree %553 %uint_2
+        %615 = OpLoad %int %614
+               OpStore %x_375 %615
+        %616 = OpLoad %bool %x_355
+               OpStore %x_356_phi %616
+        %617 = OpLoad %int %x_375
+               OpStore %x_359_phi %617
+               OpBranch %544
+        %609 = OpLabel
+               OpReturn
+        %563 = OpLabel
+        %618 = OpLoad %bool %x_402
+               OpStore %x_356_phi %618
+               OpStore %x_359_phi %553
+               OpBranch %544
+        %544 = OpLabel
+        %619 = OpLoad %bool %x_356_phi
+               OpStore %x_356 %619
+        %620 = OpLoad %int %x_359_phi
+               OpStore %x_359 %620
+        %621 = OpLoad %bool %x_356
+               OpStore %x_355_phi %621
+        %622 = OpLoad %int %x_359
+               OpStore %x_358_phi %622
+               OpBranch %542
+        %543 = OpLabel
+        %623 = OpLoad %bool %x_404_phi
+               OpSelectionMerge %624 None
+               OpBranchConditional %623 %625 %624
+        %625 = OpLabel
+               OpBranch %540
+        %624 = OpLabel
+               OpBranch %540
+        %540 = OpLabel
+               OpSelectionMerge %631 None
+               OpSwitch %uint_0 %632
+        %632 = OpLabel
+               OpStore %x_409_phi %false
+               OpStore %x_412_phi %int_0
+               OpBranch %633
+        %633 = OpLabel
+               OpLoopMerge %634 %635 None
+               OpBranch %636
+        %636 = OpLabel
+        %643 = OpLoad %bool %x_409_phi
+               OpStore %x_409 %643
+        %644 = OpLoad %int %x_412_phi
+        %645 = OpLoad %bool %x_409
+               OpStore %x_458_phi %645
+        %646 = OpSLessThanEqual %bool %644 %int_7
+               OpSelectionMerge %647 None
+               OpBranchConditional %646 %648 %649
+        %648 = OpLabel
+               OpBranch %647
+        %649 = OpLabel
+               OpBranch %634
+        %647 = OpLabel
+        %650 = OpAccessChain %_ptr_Function_int %tree %644 %uint_0
+        %651 = OpLoad %int %650
+        %652 = OpSLessThanEqual %bool %int_6 %651
+               OpSelectionMerge %653 None
+               OpBranchConditional %652 %654 %655
+        %654 = OpLabel
+        %657 = OpAccessChain %_ptr_Function_int %tree %644 %uint_1
+        %658 = OpLoad %int %657
+        %659 = OpIEqual %bool %658 %int_n1
+               OpSelectionMerge %660 None
+               OpBranchConditional %659 %661 %662
+        %661 = OpLabel
+        %663 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+        %664 = OpLoad %float %663
+        %665 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+        %666 = OpLoad %float %665
+        %667 = OpFOrdLessThan %bool %664 %666
+               OpSelectionMerge %668 None
+               OpBranchConditional %667 %669 %668
+        %669 = OpLabel
+               OpBranch %670
+        %670 = OpLabel
+               OpLoopMerge %671 %672 None
+               OpBranch %673
+        %673 = OpLabel
+               OpKill
+        %672 = OpLabel
+               OpBranch %670
+        %671 = OpLabel
+               OpReturn
+        %668 = OpLabel
+        %674 = OpAccessChain %_ptr_Function_int %tree %644 %uint_1
+               OpStore %674 %int_7
+        %675 = OpAccessChain %_ptr_Function_BST %tree %int_7
+               OpStore %675 %676
+               OpBranch %677
+        %677 = OpLabel
+               OpLoopMerge %678 %679 None
+               OpBranch %680
+        %680 = OpLabel
+        %681 = OpLoad %bool %x_409
+               OpStore %x_456_phi %681
+        %682 = OpConvertFToS %int %664
+        %683 = OpSLessThan %bool %int_0 %682
+               OpSelectionMerge %684 None
+               OpBranchConditional %683 %685 %686
+        %685 = OpLabel
+               OpBranch %684
+        %686 = OpLabel
+               OpBranch %678
+        %684 = OpLabel
+               OpStore %x_456_phi %true
+               OpBranch %678
+        %679 = OpLabel
+               OpBranch %677
+        %678 = OpLabel
+        %687 = OpLoad %bool %x_456_phi
+               OpStore %x_456 %687
+        %688 = OpLoad %bool %x_456
+               OpStore %x_458_phi %688
+        %689 = OpLoad %bool %x_456
+               OpSelectionMerge %690 None
+               OpBranchConditional %689 %691 %690
+        %691 = OpLabel
+               OpBranch %634
+        %690 = OpLabel
+               OpBranch %660
+        %662 = OpLabel
+        %692 = OpAccessChain %_ptr_Function_int %tree %644 %uint_1
+        %693 = OpLoad %int %692
+               OpStore %x_437 %693
+        %694 = OpLoad %bool %x_409
+               OpStore %x_410_phi %694
+        %695 = OpLoad %int %x_437
+               OpStore %x_413_phi %695
+               OpBranch %635
+        %660 = OpLabel
+               OpBranch %653
+        %655 = OpLabel
+        %696 = OpAccessChain %_ptr_Function_int %tree %644 %uint_2
+        %697 = OpLoad %int %696
+        %698 = OpIEqual %bool %697 %int_n1
+               OpSelectionMerge %699 None
+               OpBranchConditional %698 %700 %701
+        %700 = OpLabel
+        %702 = OpAccessChain %_ptr_Function_int %tree %644 %uint_2
+               OpStore %702 %int_7
+        %703 = OpAccessChain %_ptr_Function_BST %tree %int_7
+               OpStore %703 %676
+               OpStore %x_458_phi %true
+               OpBranch %634
+        %701 = OpLabel
+        %704 = OpAccessChain %_ptr_Function_int %tree %644 %uint_2
+        %705 = OpLoad %int %704
+               OpStore %x_429 %705
+        %706 = OpLoad %bool %x_409
+               OpStore %x_410_phi %706
+        %707 = OpLoad %int %x_429
+               OpStore %x_413_phi %707
+               OpBranch %635
+        %699 = OpLabel
+               OpReturn
+        %653 = OpLabel
+        %708 = OpLoad %bool %x_456
+               OpStore %x_410_phi %708
+               OpStore %x_413_phi %644
+               OpBranch %635
+        %635 = OpLabel
+        %709 = OpLoad %bool %x_410_phi
+               OpStore %x_410 %709
+        %710 = OpLoad %int %x_413_phi
+               OpStore %x_413 %710
+        %711 = OpLoad %bool %x_410
+               OpStore %x_409_phi %711
+        %712 = OpLoad %int %x_413
+               OpStore %x_412_phi %712
+               OpBranch %633
+        %634 = OpLabel
+        %713 = OpLoad %bool %x_458_phi
+               OpSelectionMerge %714 None
+               OpBranchConditional %713 %715 %714
+        %715 = OpLabel
+               OpBranch %631
+        %714 = OpLabel
+               OpBranch %631
+        %631 = OpLabel
+               OpSelectionMerge %721 None
+               OpSwitch %uint_0 %722
+        %722 = OpLabel
+               OpStore %x_463_phi %false
+               OpStore %x_466_phi %int_0
+               OpBranch %723
+        %723 = OpLabel
+               OpLoopMerge %724 %725 None
+               OpBranch %726
+        %726 = OpLabel
+        %733 = OpLoad %bool %x_463_phi
+               OpStore %x_463 %733
+        %734 = OpLoad %int %x_466_phi
+        %735 = OpLoad %bool %x_463
+               OpStore %x_512_phi %735
+        %736 = OpSLessThanEqual %bool %734 %int_8
+               OpSelectionMerge %737 None
+               OpBranchConditional %736 %738 %739
+        %738 = OpLabel
+               OpBranch %737
+        %739 = OpLabel
+               OpBranch %724
+        %737 = OpLabel
+        %740 = OpAccessChain %_ptr_Function_int %tree %734 %uint_0
+        %741 = OpLoad %int %740
+        %743 = OpSLessThanEqual %bool %int_17 %741
+               OpSelectionMerge %744 None
+               OpBranchConditional %743 %745 %746
+        %745 = OpLabel
+        %748 = OpAccessChain %_ptr_Function_int %tree %734 %uint_1
+        %749 = OpLoad %int %748
+        %750 = OpIEqual %bool %749 %int_n1
+               OpSelectionMerge %751 None
+               OpBranchConditional %750 %752 %753
+        %752 = OpLabel
+        %754 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+        %755 = OpLoad %float %754
+        %756 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+        %757 = OpLoad %float %756
+        %758 = OpFOrdLessThan %bool %755 %757
+               OpSelectionMerge %759 None
+               OpBranchConditional %758 %760 %759
+        %760 = OpLabel
+               OpBranch %761
+        %761 = OpLabel
+               OpLoopMerge %762 %763 None
+               OpBranch %764
+        %764 = OpLabel
+               OpKill
+        %763 = OpLabel
+               OpBranch %761
+        %762 = OpLabel
+               OpReturn
+        %759 = OpLabel
+        %765 = OpAccessChain %_ptr_Function_int %tree %734 %uint_1
+               OpStore %765 %int_8
+        %766 = OpAccessChain %_ptr_Function_BST %tree %int_8
+               OpStore %766 %767
+               OpBranch %768
+        %768 = OpLabel
+               OpLoopMerge %769 %770 None
+               OpBranch %771
+        %771 = OpLabel
+        %772 = OpLoad %bool %x_463
+               OpStore %x_510_phi %772
+        %773 = OpConvertFToS %int %755
+        %774 = OpSLessThan %bool %int_0 %773
+               OpSelectionMerge %775 None
+               OpBranchConditional %774 %776 %777
+        %776 = OpLabel
+               OpBranch %775
+        %777 = OpLabel
+               OpBranch %769
+        %775 = OpLabel
+               OpStore %x_510_phi %true
+               OpBranch %769
+        %770 = OpLabel
+               OpBranch %768
+        %769 = OpLabel
+        %778 = OpLoad %bool %x_510_phi
+               OpStore %x_510 %778
+        %779 = OpLoad %bool %x_510
+               OpStore %x_512_phi %779
+        %780 = OpLoad %bool %x_510
+               OpSelectionMerge %781 None
+               OpBranchConditional %780 %782 %781
+        %782 = OpLabel
+               OpBranch %724
+        %781 = OpLabel
+               OpBranch %751
+        %753 = OpLabel
+        %783 = OpAccessChain %_ptr_Function_int %tree %734 %uint_1
+        %784 = OpLoad %int %783
+               OpStore %x_491 %784
+        %785 = OpLoad %bool %x_463
+               OpStore %x_464_phi %785
+        %786 = OpLoad %int %x_491
+               OpStore %x_467_phi %786
+               OpBranch %725
+        %751 = OpLabel
+               OpBranch %744
+        %746 = OpLabel
+        %787 = OpAccessChain %_ptr_Function_int %tree %734 %uint_2
+        %788 = OpLoad %int %787
+        %789 = OpIEqual %bool %788 %int_n1
+               OpSelectionMerge %790 None
+               OpBranchConditional %789 %791 %792
+        %791 = OpLabel
+        %793 = OpAccessChain %_ptr_Function_int %tree %734 %uint_2
+               OpStore %793 %int_8
+        %794 = OpAccessChain %_ptr_Function_BST %tree %int_8
+               OpStore %794 %767
+               OpStore %x_512_phi %true
+               OpBranch %724
+        %792 = OpLabel
+        %795 = OpAccessChain %_ptr_Function_int %tree %734 %uint_2
+        %796 = OpLoad %int %795
+               OpStore %x_483 %796
+        %797 = OpLoad %bool %x_463
+               OpStore %x_464_phi %797
+        %798 = OpLoad %int %x_483
+               OpStore %x_467_phi %798
+               OpBranch %725
+        %790 = OpLabel
+               OpReturn
+        %744 = OpLabel
+        %799 = OpLoad %bool %x_510
+               OpStore %x_464_phi %799
+               OpStore %x_467_phi %734
+               OpBranch %725
+        %725 = OpLabel
+        %800 = OpLoad %bool %x_464_phi
+               OpStore %x_464 %800
+        %801 = OpLoad %int %x_467_phi
+               OpStore %x_467 %801
+        %802 = OpLoad %bool %x_464
+               OpStore %x_463_phi %802
+        %803 = OpLoad %int %x_467
+               OpStore %x_466_phi %803
+               OpBranch %723
+        %724 = OpLabel
+        %804 = OpLoad %bool %x_512_phi
+               OpSelectionMerge %805 None
+               OpBranchConditional %804 %806 %805
+        %806 = OpLabel
+               OpBranch %721
+        %805 = OpLabel
+               OpBranch %721
+        %721 = OpLabel
+               OpSelectionMerge %812 None
+               OpSwitch %uint_0 %813
+        %813 = OpLabel
+               OpStore %x_517_phi %false
+               OpStore %x_520_phi %int_0
+               OpBranch %814
+        %814 = OpLabel
+               OpLoopMerge %815 %816 None
+               OpBranch %817
+        %817 = OpLabel
+        %824 = OpLoad %bool %x_517_phi
+               OpStore %x_517 %824
+        %825 = OpLoad %int %x_520_phi
+        %826 = OpLoad %bool %x_517
+               OpStore %x_566_phi %826
+        %827 = OpSLessThanEqual %bool %825 %int_9
+               OpSelectionMerge %828 None
+               OpBranchConditional %827 %829 %830
+        %829 = OpLabel
+               OpBranch %828
+        %830 = OpLabel
+               OpBranch %815
+        %828 = OpLabel
+        %831 = OpAccessChain %_ptr_Function_int %tree %825 %uint_0
+        %832 = OpLoad %int %831
+        %834 = OpSLessThanEqual %bool %int_13 %832
+               OpSelectionMerge %835 None
+               OpBranchConditional %834 %836 %837
+        %836 = OpLabel
+        %839 = OpAccessChain %_ptr_Function_int %tree %825 %uint_1
+        %840 = OpLoad %int %839
+        %841 = OpIEqual %bool %840 %int_n1
+               OpSelectionMerge %842 None
+               OpBranchConditional %841 %843 %844
+        %843 = OpLabel
+        %845 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+        %846 = OpLoad %float %845
+        %847 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+        %848 = OpLoad %float %847
+        %849 = OpFOrdLessThan %bool %846 %848
+               OpSelectionMerge %850 None
+               OpBranchConditional %849 %851 %850
+        %851 = OpLabel
+               OpBranch %852
+        %852 = OpLabel
+               OpLoopMerge %853 %854 None
+               OpBranch %855
+        %855 = OpLabel
+               OpKill
+        %854 = OpLabel
+               OpBranch %852
+        %853 = OpLabel
+               OpReturn
+        %850 = OpLabel
+        %856 = OpAccessChain %_ptr_Function_int %tree %825 %uint_1
+               OpStore %856 %int_9
+        %857 = OpAccessChain %_ptr_Function_BST %tree %int_9
+               OpStore %857 %858
+               OpBranch %859
+        %859 = OpLabel
+               OpLoopMerge %860 %861 None
+               OpBranch %862
+        %862 = OpLabel
+        %863 = OpLoad %bool %x_517
+               OpStore %x_564_phi %863
+        %864 = OpConvertFToS %int %846
+        %865 = OpSLessThan %bool %int_0 %864
+               OpSelectionMerge %866 None
+               OpBranchConditional %865 %867 %868
+        %867 = OpLabel
+               OpBranch %866
+        %868 = OpLabel
+               OpBranch %860
+        %866 = OpLabel
+               OpStore %x_564_phi %true
+               OpBranch %860
+        %861 = OpLabel
+               OpBranch %859
+        %860 = OpLabel
+        %869 = OpLoad %bool %x_564_phi
+               OpStore %x_564 %869
+        %870 = OpLoad %bool %x_564
+               OpStore %x_566_phi %870
+        %871 = OpLoad %bool %x_564
+               OpSelectionMerge %872 None
+               OpBranchConditional %871 %873 %872
+        %873 = OpLabel
+               OpBranch %815
+        %872 = OpLabel
+               OpBranch %842
+        %844 = OpLabel
+        %874 = OpAccessChain %_ptr_Function_int %tree %825 %uint_1
+        %875 = OpLoad %int %874
+               OpStore %x_545 %875
+        %876 = OpLoad %bool %x_517
+               OpStore %x_518_phi %876
+        %877 = OpLoad %int %x_545
+               OpStore %x_521_phi %877
+               OpBranch %816
+        %842 = OpLabel
+               OpBranch %835
+        %837 = OpLabel
+        %878 = OpAccessChain %_ptr_Function_int %tree %825 %uint_2
+        %879 = OpLoad %int %878
+        %880 = OpIEqual %bool %879 %int_n1
+               OpSelectionMerge %881 None
+               OpBranchConditional %880 %882 %883
+        %882 = OpLabel
+        %884 = OpAccessChain %_ptr_Function_int %tree %825 %uint_2
+               OpStore %884 %int_9
+        %885 = OpAccessChain %_ptr_Function_BST %tree %int_9
+               OpStore %885 %858
+               OpStore %x_566_phi %true
+               OpBranch %815
+        %883 = OpLabel
+        %886 = OpAccessChain %_ptr_Function_int %tree %825 %uint_2
+        %887 = OpLoad %int %886
+               OpStore %x_537 %887
+        %888 = OpLoad %bool %x_517
+               OpStore %x_518_phi %888
+        %889 = OpLoad %int %x_537
+               OpStore %x_521_phi %889
+               OpBranch %816
+        %881 = OpLabel
+               OpReturn
+        %835 = OpLabel
+        %890 = OpLoad %bool %x_564
+               OpStore %x_518_phi %890
+               OpStore %x_521_phi %825
+               OpBranch %816
+        %816 = OpLabel
+        %891 = OpLoad %bool %x_518_phi
+               OpStore %x_518 %891
+        %892 = OpLoad %int %x_521_phi
+               OpStore %x_521 %892
+        %893 = OpLoad %bool %x_518
+               OpStore %x_517_phi %893
+        %894 = OpLoad %int %x_521
+               OpStore %x_520_phi %894
+               OpBranch %814
+        %815 = OpLabel
+        %895 = OpLoad %bool %x_566_phi
+               OpSelectionMerge %896 None
+               OpBranchConditional %895 %897 %896
+        %897 = OpLabel
+               OpBranch %812
+        %896 = OpLabel
+               OpBranch %812
+        %812 = OpLabel
+               OpStore %x_569_phi %int_0
+               OpStore %x_572_phi %int_0
+               OpStore %x_574_phi %int_0
+               OpBranch %898
+        %898 = OpLabel
+               OpLoopMerge %899 %900 None
+               OpBranch %901
+        %901 = OpLabel
+        %908 = OpLoad %int %x_569_phi
+        %909 = OpLoad %int %x_572_phi
+               OpStore %x_572 %909
+        %910 = OpLoad %int %x_574_phi
+        %912 = OpSLessThan %bool %910 %int_20
+               OpSelectionMerge %913 None
+               OpBranchConditional %912 %914 %915
+        %914 = OpLabel
+               OpBranch %913
+        %915 = OpLabel
+               OpBranch %899
+        %913 = OpLabel
+               OpSelectionMerge %919 None
+               OpSwitch %uint_0 %920
+        %920 = OpLabel
+               OpStore %x_582_phi %int_0
+               OpBranch %921
+        %921 = OpLabel
+               OpLoopMerge %922 %923 None
+               OpBranch %924
+        %924 = OpLabel
+        %925 = OpLoad %int %x_582_phi
+               OpStore %x_597_phi %908
+               OpStore %x_598_phi %false
+        %926 = OpINotEqual %bool %925 %int_n1
+               OpSelectionMerge %927 None
+               OpBranchConditional %926 %928 %929
+        %928 = OpLabel
+               OpBranch %927
+        %929 = OpLabel
+               OpBranch %922
+        %927 = OpLabel
+        %930 = OpAccessChain %_ptr_Function_BST %tree %925
+        %931 = OpLoad %BST %930
+        %932 = OpCompositeExtract %int %931 0
+        %933 = OpCompositeExtract %int %931 1
+        %934 = OpCompositeExtract %int %931 2
+        %935 = OpIEqual %bool %932 %910
+               OpSelectionMerge %936 None
+               OpBranchConditional %935 %937 %936
+        %937 = OpLabel
+               OpStore %x_597_phi %910
+               OpStore %x_598_phi %true
+               OpBranch %922
+        %936 = OpLabel
+               OpBranch %923
+        %923 = OpLabel
+        %939 = OpSGreaterThan %bool %910 %932
+        %938 = OpSelect %int %939 %934 %933
+               OpStore %x_582_phi %938
+               OpBranch %921
+        %922 = OpLabel
+        %940 = OpLoad %int %x_597_phi
+               OpStore %x_597 %940
+        %941 = OpLoad %bool %x_598_phi
+        %942 = OpLoad %int %x_597
+               OpStore %x_570_phi %942
+               OpSelectionMerge %943 None
+               OpBranchConditional %941 %944 %943
+        %944 = OpLabel
+               OpBranch %919
+        %943 = OpLabel
+               OpStore %x_570_phi %int_n1
+               OpBranch %919
+        %919 = OpLabel
+        %950 = OpLoad %int %x_570_phi
+               OpStore %x_570 %950
+               OpSelectionMerge %951 None
+               OpSwitch %910 %952 2 %953 5 %953 6 %953 7 %953 8 %953 9 %953 12 %953 13 %953 15 %953 17 %953
+        %953 = OpLabel
+        %954 = OpLoad %int %x_572
+               OpStore %x_607_phi %954
+        %955 = OpLoad %int %x_570
+        %956 = OpCopyObject %int %910
+        %957 = OpIEqual %bool %955 %956
+               OpSelectionMerge %958 None
+               OpBranchConditional %957 %959 %958
+        %959 = OpLabel
+        %961 = OpLoad %int %x_572
+        %962 = OpCopyObject %int %int_1
+        %963 = OpIAdd %int %961 %962
+        %960 = OpCopyObject %int %963
+               OpStore %x_606 %960
+        %964 = OpLoad %int %x_606
+               OpStore %x_607_phi %964
+               OpBranch %958
+        %958 = OpLabel
+        %965 = OpLoad %int %x_607_phi
+               OpStore %x_607 %965
+        %966 = OpLoad %int %x_607
+               OpStore %x_573_phi %966
+               OpBranch %951
+        %952 = OpLabel
+        %967 = OpLoad %int %x_572
+               OpStore %x_612_phi %967
+        %968 = OpLoad %int %x_570
+        %969 = OpCopyObject %int %int_n1
+        %970 = OpIEqual %bool %968 %969
+               OpSelectionMerge %971 None
+               OpBranchConditional %970 %972 %971
+        %972 = OpLabel
+        %974 = OpLoad %int %x_572
+        %975 = OpCopyObject %int %int_1
+        %976 = OpIAdd %int %974 %975
+        %973 = OpCopyObject %int %976
+               OpStore %x_611 %973
+        %977 = OpLoad %int %x_611
+               OpStore %x_612_phi %977
+               OpBranch %971
+        %971 = OpLabel
+        %978 = OpLoad %int %x_612_phi
+               OpStore %x_612 %978
+        %979 = OpLoad %int %x_612
+               OpStore %x_573_phi %979
+               OpBranch %951
+        %951 = OpLabel
+        %980 = OpLoad %int %x_573_phi
+               OpBranch %900
+        %900 = OpLabel
+        %981 = OpIAdd %int %910 %int_1
+               OpStore %x_575 %981
+        %982 = OpLoad %int %x_570
+               OpStore %x_569_phi %982
+               OpStore %x_572_phi %980
+        %983 = OpLoad %int %x_575
+               OpStore %x_574_phi %983
+               OpBranch %898
+        %899 = OpLabel
+        %984 = OpLoad %int %x_572
+        %985 = OpCopyObject %int %int_20
+        %986 = OpIEqual %bool %984 %985
+               OpSelectionMerge %987 None
+               OpBranchConditional %986 %988 %989
+        %988 = OpLabel
+               OpStore %x_GLF_color %991
+               OpBranch %987
+        %989 = OpLabel
+               OpStore %x_GLF_color %992
+               OpBranch %987
+        %987 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %993
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %997 = OpLabel
+        %998 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %998
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+       %1000 = OpLabel
+       %1001 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %1001
+       %1002 = OpFunctionCall %void %main_1
+       %1004 = OpLoad %v4float %x_GLF_color
+       %1005 = OpCompositeConstruct %main_out %1004
+       %1003 = OpFunctionCall %void %tint_symbol_3 %1005
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..c4e135a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-false-if-discard-loop/1.wgsl.expected.wgsl
@@ -0,0 +1,977 @@
+struct BST {
+  data : i32;
+  leftIndex : i32;
+  rightIndex : i32;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var tree : array<BST, 10>;
+  var x_67 : bool;
+  var x_114 : bool;
+  var x_572 : i32;
+  var x_67_phi : bool;
+  var x_70_phi : i32;
+  var x_116_phi : bool;
+  var x_119_phi : i32;
+  var x_569_phi : i32;
+  var x_572_phi : i32;
+  var x_574_phi : i32;
+  tree[0] = BST(9, -1, -1);
+  switch(0u) {
+    default: {
+      x_67_phi = false;
+      x_70_phi = 0;
+      loop {
+        var x_95 : i32;
+        var x_87 : i32;
+        var x_68 : bool;
+        var x_71 : i32;
+        var x_68_phi : bool;
+        var x_71_phi : i32;
+        x_67 = x_67_phi;
+        let x_70 : i32 = x_70_phi;
+        x_116_phi = x_67;
+        if ((x_70 <= 1)) {
+        } else {
+          break;
+        }
+        let x_76 : i32 = tree[x_70].data;
+        if ((5 <= x_76)) {
+          var x_114_phi : bool;
+          let x_89 : ptr<function, i32> = &(tree[x_70].leftIndex);
+          let x_90 : i32 = *(x_89);
+          if ((x_90 == -1)) {
+            let x_97 : f32 = x_8.injectionSwitch.y;
+            let x_99 : f32 = x_8.injectionSwitch.x;
+            if ((x_97 < x_99)) {
+              loop {
+                discard;
+              }
+              return;
+            }
+            *(x_89) = 1;
+            tree[1] = BST(5, -1, -1);
+            loop {
+              x_114_phi = x_67;
+              if ((0 < i32(x_97))) {
+              } else {
+                break;
+              }
+              x_114_phi = true;
+              break;
+            }
+            x_114 = x_114_phi;
+            x_116_phi = x_114;
+            if (x_114) {
+              break;
+            }
+          } else {
+            x_95 = *(x_89);
+            x_68_phi = x_67;
+            x_71_phi = x_95;
+            continue;
+          }
+        } else {
+          let x_81 : ptr<function, i32> = &(tree[x_70].rightIndex);
+          let x_82 : i32 = *(x_81);
+          if ((x_82 == -1)) {
+            *(x_81) = 1;
+            tree[1] = BST(5, -1, -1);
+            x_116_phi = true;
+            break;
+          } else {
+            x_87 = *(x_81);
+            x_68_phi = x_67;
+            x_71_phi = x_87;
+            continue;
+          }
+          return;
+        }
+        x_68_phi = x_114;
+        x_71_phi = x_70;
+
+        continuing {
+          x_68 = x_68_phi;
+          x_71 = x_71_phi;
+          x_67_phi = x_68;
+          x_70_phi = x_71;
+        }
+      }
+      let x_116 : bool = x_116_phi;
+      if (x_116) {
+        break;
+      }
+    }
+  }
+  x_119_phi = 0;
+  loop {
+    var x_133 : bool;
+    var x_120 : i32;
+    var x_134_phi : bool;
+    let x_119 : i32 = x_119_phi;
+    let x_125 : f32 = gl_FragCoord.y;
+    let x_126 : bool = (x_125 < 0.0);
+    x_134_phi = x_126;
+    if (!(x_126)) {
+      let x_131 : f32 = x_8.injectionSwitch.y;
+      x_133 = (x_119 != i32(x_131));
+      x_134_phi = x_133;
+    }
+    let x_134 : bool = x_134_phi;
+    if (x_134) {
+    } else {
+      break;
+    }
+    var x_139 : bool;
+    var x_186 : bool;
+    var x_139_phi : bool;
+    var x_142_phi : i32;
+    var x_188_phi : bool;
+    switch(0u) {
+      default: {
+        x_139_phi = false;
+        x_142_phi = 0;
+        loop {
+          var x_167 : i32;
+          var x_159 : i32;
+          var x_140 : bool;
+          var x_143 : i32;
+          var x_140_phi : bool;
+          var x_143_phi : i32;
+          x_139 = x_139_phi;
+          let x_142 : i32 = x_142_phi;
+          x_188_phi = x_139;
+          if ((x_142 <= 2)) {
+          } else {
+            break;
+          }
+          let x_148 : i32 = tree[x_142].data;
+          if ((12 <= x_148)) {
+            var x_186_phi : bool;
+            let x_161 : ptr<function, i32> = &(tree[x_142].leftIndex);
+            let x_162 : i32 = *(x_161);
+            if ((x_162 == -1)) {
+              let x_169 : f32 = x_8.injectionSwitch.y;
+              let x_171 : f32 = x_8.injectionSwitch.x;
+              if ((x_169 < x_171)) {
+                loop {
+                  discard;
+                }
+                return;
+              }
+              *(x_161) = 2;
+              tree[2] = BST(12, -1, -1);
+              loop {
+                x_186_phi = x_139;
+                if ((0 < i32(x_169))) {
+                } else {
+                  break;
+                }
+                x_186_phi = true;
+                break;
+              }
+              x_186 = x_186_phi;
+              x_188_phi = x_186;
+              if (x_186) {
+                break;
+              }
+            } else {
+              x_167 = *(x_161);
+              x_140_phi = x_139;
+              x_143_phi = x_167;
+              continue;
+            }
+          } else {
+            let x_153 : ptr<function, i32> = &(tree[x_142].rightIndex);
+            let x_154 : i32 = *(x_153);
+            if ((x_154 == -1)) {
+              *(x_153) = 2;
+              tree[2] = BST(12, -1, -1);
+              x_188_phi = true;
+              break;
+            } else {
+              x_159 = *(x_153);
+              x_140_phi = x_139;
+              x_143_phi = x_159;
+              continue;
+            }
+            return;
+          }
+          x_140_phi = x_186;
+          x_143_phi = x_142;
+
+          continuing {
+            x_140 = x_140_phi;
+            x_143 = x_143_phi;
+            x_139_phi = x_140;
+            x_142_phi = x_143;
+          }
+        }
+        let x_188 : bool = x_188_phi;
+        if (x_188) {
+          break;
+        }
+      }
+    }
+
+    continuing {
+      x_120 = (x_119 + 1);
+      x_119_phi = x_120;
+    }
+  }
+  var x_193 : bool;
+  var x_240 : bool;
+  var x_193_phi : bool;
+  var x_196_phi : i32;
+  var x_242_phi : bool;
+  switch(0u) {
+    default: {
+      x_193_phi = false;
+      x_196_phi = 0;
+      loop {
+        var x_221 : i32;
+        var x_213 : i32;
+        var x_194 : bool;
+        var x_197 : i32;
+        var x_194_phi : bool;
+        var x_197_phi : i32;
+        x_193 = x_193_phi;
+        let x_196 : i32 = x_196_phi;
+        x_242_phi = x_193;
+        if ((x_196 <= 3)) {
+        } else {
+          break;
+        }
+        let x_202 : i32 = tree[x_196].data;
+        if ((15 <= x_202)) {
+          var x_240_phi : bool;
+          let x_215 : ptr<function, i32> = &(tree[x_196].leftIndex);
+          let x_216 : i32 = *(x_215);
+          if ((x_216 == -1)) {
+            let x_223 : f32 = x_8.injectionSwitch.y;
+            let x_225 : f32 = x_8.injectionSwitch.x;
+            if ((x_223 < x_225)) {
+              loop {
+                discard;
+              }
+              return;
+            }
+            *(x_215) = 3;
+            tree[3] = BST(15, -1, -1);
+            loop {
+              x_240_phi = x_193;
+              if ((0 < i32(x_223))) {
+              } else {
+                break;
+              }
+              x_240_phi = true;
+              break;
+            }
+            x_240 = x_240_phi;
+            x_242_phi = x_240;
+            if (x_240) {
+              break;
+            }
+          } else {
+            x_221 = *(x_215);
+            x_194_phi = x_193;
+            x_197_phi = x_221;
+            continue;
+          }
+        } else {
+          let x_207 : ptr<function, i32> = &(tree[x_196].rightIndex);
+          let x_208 : i32 = *(x_207);
+          if ((x_208 == -1)) {
+            *(x_207) = 3;
+            tree[3] = BST(15, -1, -1);
+            x_242_phi = true;
+            break;
+          } else {
+            x_213 = *(x_207);
+            x_194_phi = x_193;
+            x_197_phi = x_213;
+            continue;
+          }
+          return;
+        }
+        x_194_phi = x_240;
+        x_197_phi = x_196;
+
+        continuing {
+          x_194 = x_194_phi;
+          x_197 = x_197_phi;
+          x_193_phi = x_194;
+          x_196_phi = x_197;
+        }
+      }
+      let x_242 : bool = x_242_phi;
+      if (x_242) {
+        break;
+      }
+    }
+  }
+  var x_247 : bool;
+  var x_294 : bool;
+  var x_247_phi : bool;
+  var x_250_phi : i32;
+  var x_296_phi : bool;
+  switch(0u) {
+    default: {
+      x_247_phi = false;
+      x_250_phi = 0;
+      loop {
+        var x_275 : i32;
+        var x_267 : i32;
+        var x_248 : bool;
+        var x_251 : i32;
+        var x_248_phi : bool;
+        var x_251_phi : i32;
+        x_247 = x_247_phi;
+        let x_250 : i32 = x_250_phi;
+        x_296_phi = x_247;
+        if ((x_250 <= 4)) {
+        } else {
+          break;
+        }
+        let x_256 : i32 = tree[x_250].data;
+        if ((7 <= x_256)) {
+          var x_294_phi : bool;
+          let x_269 : ptr<function, i32> = &(tree[x_250].leftIndex);
+          let x_270 : i32 = *(x_269);
+          if ((x_270 == -1)) {
+            let x_277 : f32 = x_8.injectionSwitch.y;
+            let x_279 : f32 = x_8.injectionSwitch.x;
+            if ((x_277 < x_279)) {
+              loop {
+                discard;
+              }
+              return;
+            }
+            *(x_269) = 4;
+            tree[4] = BST(7, -1, -1);
+            loop {
+              x_294_phi = x_247;
+              if ((0 < i32(x_277))) {
+              } else {
+                break;
+              }
+              x_294_phi = true;
+              break;
+            }
+            x_294 = x_294_phi;
+            x_296_phi = x_294;
+            if (x_294) {
+              break;
+            }
+          } else {
+            x_275 = *(x_269);
+            x_248_phi = x_247;
+            x_251_phi = x_275;
+            continue;
+          }
+        } else {
+          let x_261 : ptr<function, i32> = &(tree[x_250].rightIndex);
+          let x_262 : i32 = *(x_261);
+          if ((x_262 == -1)) {
+            *(x_261) = 4;
+            tree[4] = BST(7, -1, -1);
+            x_296_phi = true;
+            break;
+          } else {
+            x_267 = *(x_261);
+            x_248_phi = x_247;
+            x_251_phi = x_267;
+            continue;
+          }
+          return;
+        }
+        x_248_phi = x_294;
+        x_251_phi = x_250;
+
+        continuing {
+          x_248 = x_248_phi;
+          x_251 = x_251_phi;
+          x_247_phi = x_248;
+          x_250_phi = x_251;
+        }
+      }
+      let x_296 : bool = x_296_phi;
+      if (x_296) {
+        break;
+      }
+    }
+  }
+  var x_301 : bool;
+  var x_348 : bool;
+  var x_301_phi : bool;
+  var x_304_phi : i32;
+  var x_350_phi : bool;
+  switch(0u) {
+    default: {
+      x_301_phi = false;
+      x_304_phi = 0;
+      loop {
+        var x_329 : i32;
+        var x_321 : i32;
+        var x_302 : bool;
+        var x_305 : i32;
+        var x_302_phi : bool;
+        var x_305_phi : i32;
+        x_301 = x_301_phi;
+        let x_304 : i32 = x_304_phi;
+        x_350_phi = x_301;
+        if ((x_304 <= 5)) {
+        } else {
+          break;
+        }
+        let x_310 : i32 = tree[x_304].data;
+        if ((8 <= x_310)) {
+          var x_348_phi : bool;
+          let x_323 : ptr<function, i32> = &(tree[x_304].leftIndex);
+          let x_324 : i32 = *(x_323);
+          if ((x_324 == -1)) {
+            let x_331 : f32 = x_8.injectionSwitch.y;
+            let x_333 : f32 = x_8.injectionSwitch.x;
+            if ((x_331 < x_333)) {
+              loop {
+                discard;
+              }
+              return;
+            }
+            *(x_323) = 5;
+            tree[5] = BST(8, -1, -1);
+            loop {
+              x_348_phi = x_301;
+              if ((0 < i32(x_331))) {
+              } else {
+                break;
+              }
+              x_348_phi = true;
+              break;
+            }
+            x_348 = x_348_phi;
+            x_350_phi = x_348;
+            if (x_348) {
+              break;
+            }
+          } else {
+            x_329 = *(x_323);
+            x_302_phi = x_301;
+            x_305_phi = x_329;
+            continue;
+          }
+        } else {
+          let x_315 : ptr<function, i32> = &(tree[x_304].rightIndex);
+          let x_316 : i32 = *(x_315);
+          if ((x_316 == -1)) {
+            *(x_315) = 5;
+            tree[5] = BST(8, -1, -1);
+            x_350_phi = true;
+            break;
+          } else {
+            x_321 = *(x_315);
+            x_302_phi = x_301;
+            x_305_phi = x_321;
+            continue;
+          }
+          return;
+        }
+        x_302_phi = x_348;
+        x_305_phi = x_304;
+
+        continuing {
+          x_302 = x_302_phi;
+          x_305 = x_305_phi;
+          x_301_phi = x_302;
+          x_304_phi = x_305;
+        }
+      }
+      let x_350 : bool = x_350_phi;
+      if (x_350) {
+        break;
+      }
+    }
+  }
+  var x_355 : bool;
+  var x_402 : bool;
+  var x_355_phi : bool;
+  var x_358_phi : i32;
+  var x_404_phi : bool;
+  switch(0u) {
+    default: {
+      x_355_phi = false;
+      x_358_phi = 0;
+      loop {
+        var x_383 : i32;
+        var x_375 : i32;
+        var x_356 : bool;
+        var x_359 : i32;
+        var x_356_phi : bool;
+        var x_359_phi : i32;
+        x_355 = x_355_phi;
+        let x_358 : i32 = x_358_phi;
+        x_404_phi = x_355;
+        if ((x_358 <= 6)) {
+        } else {
+          break;
+        }
+        let x_364 : i32 = tree[x_358].data;
+        if ((2 <= x_364)) {
+          var x_402_phi : bool;
+          let x_377 : ptr<function, i32> = &(tree[x_358].leftIndex);
+          let x_378 : i32 = *(x_377);
+          if ((x_378 == -1)) {
+            let x_385 : f32 = x_8.injectionSwitch.y;
+            let x_387 : f32 = x_8.injectionSwitch.x;
+            if ((x_385 < x_387)) {
+              loop {
+                discard;
+              }
+              return;
+            }
+            *(x_377) = 6;
+            tree[6] = BST(2, -1, -1);
+            loop {
+              x_402_phi = x_355;
+              if ((0 < i32(x_385))) {
+              } else {
+                break;
+              }
+              x_402_phi = true;
+              break;
+            }
+            x_402 = x_402_phi;
+            x_404_phi = x_402;
+            if (x_402) {
+              break;
+            }
+          } else {
+            x_383 = *(x_377);
+            x_356_phi = x_355;
+            x_359_phi = x_383;
+            continue;
+          }
+        } else {
+          let x_369 : ptr<function, i32> = &(tree[x_358].rightIndex);
+          let x_370 : i32 = *(x_369);
+          if ((x_370 == -1)) {
+            *(x_369) = 6;
+            tree[6] = BST(2, -1, -1);
+            x_404_phi = true;
+            break;
+          } else {
+            x_375 = *(x_369);
+            x_356_phi = x_355;
+            x_359_phi = x_375;
+            continue;
+          }
+          return;
+        }
+        x_356_phi = x_402;
+        x_359_phi = x_358;
+
+        continuing {
+          x_356 = x_356_phi;
+          x_359 = x_359_phi;
+          x_355_phi = x_356;
+          x_358_phi = x_359;
+        }
+      }
+      let x_404 : bool = x_404_phi;
+      if (x_404) {
+        break;
+      }
+    }
+  }
+  var x_409 : bool;
+  var x_456 : bool;
+  var x_409_phi : bool;
+  var x_412_phi : i32;
+  var x_458_phi : bool;
+  switch(0u) {
+    default: {
+      x_409_phi = false;
+      x_412_phi = 0;
+      loop {
+        var x_437 : i32;
+        var x_429 : i32;
+        var x_410 : bool;
+        var x_413 : i32;
+        var x_410_phi : bool;
+        var x_413_phi : i32;
+        x_409 = x_409_phi;
+        let x_412 : i32 = x_412_phi;
+        x_458_phi = x_409;
+        if ((x_412 <= 7)) {
+        } else {
+          break;
+        }
+        let x_418 : i32 = tree[x_412].data;
+        if ((6 <= x_418)) {
+          var x_456_phi : bool;
+          let x_431 : ptr<function, i32> = &(tree[x_412].leftIndex);
+          let x_432 : i32 = *(x_431);
+          if ((x_432 == -1)) {
+            let x_439 : f32 = x_8.injectionSwitch.y;
+            let x_441 : f32 = x_8.injectionSwitch.x;
+            if ((x_439 < x_441)) {
+              loop {
+                discard;
+              }
+              return;
+            }
+            *(x_431) = 7;
+            tree[7] = BST(6, -1, -1);
+            loop {
+              x_456_phi = x_409;
+              if ((0 < i32(x_439))) {
+              } else {
+                break;
+              }
+              x_456_phi = true;
+              break;
+            }
+            x_456 = x_456_phi;
+            x_458_phi = x_456;
+            if (x_456) {
+              break;
+            }
+          } else {
+            x_437 = *(x_431);
+            x_410_phi = x_409;
+            x_413_phi = x_437;
+            continue;
+          }
+        } else {
+          let x_423 : ptr<function, i32> = &(tree[x_412].rightIndex);
+          let x_424 : i32 = *(x_423);
+          if ((x_424 == -1)) {
+            *(x_423) = 7;
+            tree[7] = BST(6, -1, -1);
+            x_458_phi = true;
+            break;
+          } else {
+            x_429 = *(x_423);
+            x_410_phi = x_409;
+            x_413_phi = x_429;
+            continue;
+          }
+          return;
+        }
+        x_410_phi = x_456;
+        x_413_phi = x_412;
+
+        continuing {
+          x_410 = x_410_phi;
+          x_413 = x_413_phi;
+          x_409_phi = x_410;
+          x_412_phi = x_413;
+        }
+      }
+      let x_458 : bool = x_458_phi;
+      if (x_458) {
+        break;
+      }
+    }
+  }
+  var x_463 : bool;
+  var x_510 : bool;
+  var x_463_phi : bool;
+  var x_466_phi : i32;
+  var x_512_phi : bool;
+  switch(0u) {
+    default: {
+      x_463_phi = false;
+      x_466_phi = 0;
+      loop {
+        var x_491 : i32;
+        var x_483 : i32;
+        var x_464 : bool;
+        var x_467 : i32;
+        var x_464_phi : bool;
+        var x_467_phi : i32;
+        x_463 = x_463_phi;
+        let x_466 : i32 = x_466_phi;
+        x_512_phi = x_463;
+        if ((x_466 <= 8)) {
+        } else {
+          break;
+        }
+        let x_472 : i32 = tree[x_466].data;
+        if ((17 <= x_472)) {
+          var x_510_phi : bool;
+          let x_485 : ptr<function, i32> = &(tree[x_466].leftIndex);
+          let x_486 : i32 = *(x_485);
+          if ((x_486 == -1)) {
+            let x_493 : f32 = x_8.injectionSwitch.y;
+            let x_495 : f32 = x_8.injectionSwitch.x;
+            if ((x_493 < x_495)) {
+              loop {
+                discard;
+              }
+              return;
+            }
+            *(x_485) = 8;
+            tree[8] = BST(17, -1, -1);
+            loop {
+              x_510_phi = x_463;
+              if ((0 < i32(x_493))) {
+              } else {
+                break;
+              }
+              x_510_phi = true;
+              break;
+            }
+            x_510 = x_510_phi;
+            x_512_phi = x_510;
+            if (x_510) {
+              break;
+            }
+          } else {
+            x_491 = *(x_485);
+            x_464_phi = x_463;
+            x_467_phi = x_491;
+            continue;
+          }
+        } else {
+          let x_477 : ptr<function, i32> = &(tree[x_466].rightIndex);
+          let x_478 : i32 = *(x_477);
+          if ((x_478 == -1)) {
+            *(x_477) = 8;
+            tree[8] = BST(17, -1, -1);
+            x_512_phi = true;
+            break;
+          } else {
+            x_483 = *(x_477);
+            x_464_phi = x_463;
+            x_467_phi = x_483;
+            continue;
+          }
+          return;
+        }
+        x_464_phi = x_510;
+        x_467_phi = x_466;
+
+        continuing {
+          x_464 = x_464_phi;
+          x_467 = x_467_phi;
+          x_463_phi = x_464;
+          x_466_phi = x_467;
+        }
+      }
+      let x_512 : bool = x_512_phi;
+      if (x_512) {
+        break;
+      }
+    }
+  }
+  var x_517 : bool;
+  var x_564 : bool;
+  var x_517_phi : bool;
+  var x_520_phi : i32;
+  var x_566_phi : bool;
+  switch(0u) {
+    default: {
+      x_517_phi = false;
+      x_520_phi = 0;
+      loop {
+        var x_545 : i32;
+        var x_537 : i32;
+        var x_518 : bool;
+        var x_521 : i32;
+        var x_518_phi : bool;
+        var x_521_phi : i32;
+        x_517 = x_517_phi;
+        let x_520 : i32 = x_520_phi;
+        x_566_phi = x_517;
+        if ((x_520 <= 9)) {
+        } else {
+          break;
+        }
+        let x_526 : i32 = tree[x_520].data;
+        if ((13 <= x_526)) {
+          var x_564_phi : bool;
+          let x_539 : ptr<function, i32> = &(tree[x_520].leftIndex);
+          let x_540 : i32 = *(x_539);
+          if ((x_540 == -1)) {
+            let x_547 : f32 = x_8.injectionSwitch.y;
+            let x_549 : f32 = x_8.injectionSwitch.x;
+            if ((x_547 < x_549)) {
+              loop {
+                discard;
+              }
+              return;
+            }
+            *(x_539) = 9;
+            tree[9] = BST(13, -1, -1);
+            loop {
+              x_564_phi = x_517;
+              if ((0 < i32(x_547))) {
+              } else {
+                break;
+              }
+              x_564_phi = true;
+              break;
+            }
+            x_564 = x_564_phi;
+            x_566_phi = x_564;
+            if (x_564) {
+              break;
+            }
+          } else {
+            x_545 = *(x_539);
+            x_518_phi = x_517;
+            x_521_phi = x_545;
+            continue;
+          }
+        } else {
+          let x_531 : ptr<function, i32> = &(tree[x_520].rightIndex);
+          let x_532 : i32 = *(x_531);
+          if ((x_532 == -1)) {
+            *(x_531) = 9;
+            tree[9] = BST(13, -1, -1);
+            x_566_phi = true;
+            break;
+          } else {
+            x_537 = *(x_531);
+            x_518_phi = x_517;
+            x_521_phi = x_537;
+            continue;
+          }
+          return;
+        }
+        x_518_phi = x_564;
+        x_521_phi = x_520;
+
+        continuing {
+          x_518 = x_518_phi;
+          x_521 = x_521_phi;
+          x_517_phi = x_518;
+          x_520_phi = x_521;
+        }
+      }
+      let x_566 : bool = x_566_phi;
+      if (x_566) {
+        break;
+      }
+    }
+  }
+  x_569_phi = 0;
+  x_572_phi = 0;
+  x_574_phi = 0;
+  loop {
+    var x_597 : i32;
+    var x_607 : i32;
+    var x_612 : i32;
+    var x_575 : i32;
+    var x_570_phi : i32;
+    var x_573_phi : i32;
+    let x_569 : i32 = x_569_phi;
+    x_572 = x_572_phi;
+    let x_574 : i32 = x_574_phi;
+    if ((x_574 < 20)) {
+    } else {
+      break;
+    }
+    var x_582_phi : i32;
+    var x_597_phi : i32;
+    var x_598_phi : bool;
+    switch(0u) {
+      default: {
+        x_582_phi = 0;
+        loop {
+          let x_582 : i32 = x_582_phi;
+          x_597_phi = x_569;
+          x_598_phi = false;
+          if ((x_582 != -1)) {
+          } else {
+            break;
+          }
+          let x_589 : BST = tree[x_582];
+          let x_590 : i32 = x_589.data;
+          let x_591 : i32 = x_589.leftIndex;
+          let x_592 : i32 = x_589.rightIndex;
+          if ((x_590 == x_574)) {
+            x_597_phi = x_574;
+            x_598_phi = true;
+            break;
+          }
+
+          continuing {
+            x_582_phi = select(x_591, x_592, (x_574 > x_590));
+          }
+        }
+        x_597 = x_597_phi;
+        let x_598 : bool = x_598_phi;
+        x_570_phi = x_597;
+        if (x_598) {
+          break;
+        }
+        x_570_phi = -1;
+      }
+    }
+    var x_570 : i32;
+    var x_606 : i32;
+    var x_611 : i32;
+    var x_607_phi : i32;
+    var x_612_phi : i32;
+    x_570 = x_570_phi;
+    switch(x_574) {
+      case 2, 5, 6, 7, 8, 9, 12, 13, 15, 17: {
+        x_607_phi = x_572;
+        if ((x_570 == bitcast<i32>(x_574))) {
+          x_606 = bitcast<i32>((x_572 + bitcast<i32>(1)));
+          x_607_phi = x_606;
+        }
+        x_607 = x_607_phi;
+        x_573_phi = x_607;
+      }
+      default: {
+        x_612_phi = x_572;
+        if ((x_570 == bitcast<i32>(-1))) {
+          x_611 = bitcast<i32>((x_572 + bitcast<i32>(1)));
+          x_612_phi = x_611;
+        }
+        x_612 = x_612_phi;
+        x_573_phi = x_612;
+      }
+    }
+    let x_573 : i32 = x_573_phi;
+
+    continuing {
+      x_575 = (x_574 + 1);
+      x_569_phi = x_570;
+      x_572_phi = x_573;
+      x_574_phi = x_575;
+    }
+  }
+  if ((x_572 == bitcast<i32>(20))) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/0.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/0.spvasm
new file mode 100644
index 0000000..bcde2cd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/0.spvasm
@@ -0,0 +1,420 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %BST "BST"
+               OpMemberName %BST 0 "data"
+               OpMemberName %BST 1 "leftIndex"
+               OpMemberName %BST 2 "rightIndex"
+               OpName %makeTreeNode_struct_BST_i1_i1_i11_i1_ "makeTreeNode(struct-BST-i1-i1-i11;i1;"
+               OpName %tree "tree"
+               OpName %data "data"
+               OpName %insert_i1_i1_ "insert(i1;i1;"
+               OpName %treeIndex "treeIndex"
+               OpName %data_0 "data"
+               OpName %search_i1_ "search(i1;"
+               OpName %target "target"
+               OpName %baseIndex "baseIndex"
+               OpName %tree_0 "tree"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %param_1 "param"
+               OpName %param_2 "param"
+               OpName %index "index"
+               OpName %currentNode "currentNode"
+               OpName %treeIndex_0 "treeIndex"
+               OpName %param_3 "param"
+               OpName %param_4 "param"
+               OpName %param_5 "param"
+               OpName %param_6 "param"
+               OpName %param_7 "param"
+               OpName %param_8 "param"
+               OpName %param_9 "param"
+               OpName %param_10 "param"
+               OpName %param_11 "param"
+               OpName %param_12 "param"
+               OpName %param_13 "param"
+               OpName %param_14 "param"
+               OpName %param_15 "param"
+               OpName %param_16 "param"
+               OpName %param_17 "param"
+               OpName %param_18 "param"
+               OpName %param_19 "param"
+               OpName %param_20 "param"
+               OpName %param_21 "param"
+               OpName %param_22 "param"
+               OpName %count "count"
+               OpName %i "i"
+               OpName %result "result"
+               OpName %param_23 "param"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %47 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+        %BST = OpTypeStruct %int %int %int
+%_ptr_Function_BST = OpTypePointer Function %BST
+%_ptr_Function_int = OpTypePointer Function %int
+         %51 = OpTypeFunction %void %_ptr_Function_BST %_ptr_Function_int
+         %52 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+         %53 = OpTypeFunction %int %_ptr_Function_int
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+     %int_n1 = OpConstant %int -1
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_BST_uint_10 = OpTypeArray %BST %uint_10
+%_ptr_Private__arr_BST_uint_10 = OpTypePointer Private %_arr_BST_uint_10
+     %tree_0 = OpVariable %_ptr_Private__arr_BST_uint_10 Private
+%_ptr_Private_int = OpTypePointer Private %int
+%_ptr_Private_BST = OpTypePointer Private %BST
+      %int_9 = OpConstant %int 9
+      %int_5 = OpConstant %int 5
+     %int_12 = OpConstant %int 12
+     %int_15 = OpConstant %int 15
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+      %int_6 = OpConstant %int 6
+     %int_17 = OpConstant %int 17
+     %int_13 = OpConstant %int 13
+     %int_20 = OpConstant %int 20
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %80 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %81 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+       %main = OpFunction %void None %47
+         %82 = OpLabel
+%treeIndex_0 = OpVariable %_ptr_Function_int Function
+    %param_3 = OpVariable %_ptr_Function_BST Function
+    %param_4 = OpVariable %_ptr_Function_int Function
+    %param_5 = OpVariable %_ptr_Function_int Function
+    %param_6 = OpVariable %_ptr_Function_int Function
+    %param_7 = OpVariable %_ptr_Function_int Function
+    %param_8 = OpVariable %_ptr_Function_int Function
+    %param_9 = OpVariable %_ptr_Function_int Function
+   %param_10 = OpVariable %_ptr_Function_int Function
+   %param_11 = OpVariable %_ptr_Function_int Function
+   %param_12 = OpVariable %_ptr_Function_int Function
+   %param_13 = OpVariable %_ptr_Function_int Function
+   %param_14 = OpVariable %_ptr_Function_int Function
+   %param_15 = OpVariable %_ptr_Function_int Function
+   %param_16 = OpVariable %_ptr_Function_int Function
+   %param_17 = OpVariable %_ptr_Function_int Function
+   %param_18 = OpVariable %_ptr_Function_int Function
+   %param_19 = OpVariable %_ptr_Function_int Function
+   %param_20 = OpVariable %_ptr_Function_int Function
+   %param_21 = OpVariable %_ptr_Function_int Function
+   %param_22 = OpVariable %_ptr_Function_int Function
+      %count = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+     %result = OpVariable %_ptr_Function_int Function
+   %param_23 = OpVariable %_ptr_Function_int Function
+               OpStore %treeIndex_0 %int_0
+         %83 = OpAccessChain %_ptr_Private_BST %tree_0 %int_0
+         %84 = OpLoad %BST %83
+               OpStore %param_3 %84
+               OpStore %param_4 %int_9
+         %85 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param_3 %param_4
+         %86 = OpLoad %BST %param_3
+         %87 = OpAccessChain %_ptr_Private_BST %tree_0 %int_0
+               OpStore %87 %86
+         %88 = OpLoad %int %treeIndex_0
+         %89 = OpIAdd %int %88 %int_1
+               OpStore %treeIndex_0 %89
+         %90 = OpLoad %int %treeIndex_0
+               OpStore %param_5 %90
+               OpStore %param_6 %int_5
+         %91 = OpFunctionCall %void %insert_i1_i1_ %param_5 %param_6
+         %92 = OpLoad %int %treeIndex_0
+         %93 = OpIAdd %int %92 %int_1
+               OpStore %treeIndex_0 %93
+         %94 = OpLoad %int %treeIndex_0
+               OpStore %param_7 %94
+               OpStore %param_8 %int_12
+         %95 = OpFunctionCall %void %insert_i1_i1_ %param_7 %param_8
+         %96 = OpLoad %int %treeIndex_0
+         %97 = OpIAdd %int %96 %int_1
+               OpStore %treeIndex_0 %97
+         %98 = OpLoad %int %treeIndex_0
+               OpStore %param_9 %98
+               OpStore %param_10 %int_15
+         %99 = OpFunctionCall %void %insert_i1_i1_ %param_9 %param_10
+        %100 = OpLoad %int %treeIndex_0
+        %101 = OpIAdd %int %100 %int_1
+               OpStore %treeIndex_0 %101
+        %102 = OpLoad %int %treeIndex_0
+               OpStore %param_11 %102
+               OpStore %param_12 %int_7
+        %103 = OpFunctionCall %void %insert_i1_i1_ %param_11 %param_12
+        %104 = OpLoad %int %treeIndex_0
+        %105 = OpIAdd %int %104 %int_1
+               OpStore %treeIndex_0 %105
+        %106 = OpLoad %int %treeIndex_0
+               OpStore %param_13 %106
+               OpStore %param_14 %int_8
+        %107 = OpFunctionCall %void %insert_i1_i1_ %param_13 %param_14
+        %108 = OpLoad %int %treeIndex_0
+        %109 = OpIAdd %int %108 %int_1
+               OpStore %treeIndex_0 %109
+        %110 = OpLoad %int %treeIndex_0
+               OpStore %param_15 %110
+               OpStore %param_16 %int_2
+        %111 = OpFunctionCall %void %insert_i1_i1_ %param_15 %param_16
+        %112 = OpLoad %int %treeIndex_0
+        %113 = OpIAdd %int %112 %int_1
+               OpStore %treeIndex_0 %113
+        %114 = OpLoad %int %treeIndex_0
+               OpStore %param_17 %114
+               OpStore %param_18 %int_6
+        %115 = OpFunctionCall %void %insert_i1_i1_ %param_17 %param_18
+        %116 = OpLoad %int %treeIndex_0
+        %117 = OpIAdd %int %116 %int_1
+               OpStore %treeIndex_0 %117
+        %118 = OpLoad %int %treeIndex_0
+               OpStore %param_19 %118
+               OpStore %param_20 %int_17
+        %119 = OpFunctionCall %void %insert_i1_i1_ %param_19 %param_20
+        %120 = OpLoad %int %treeIndex_0
+        %121 = OpIAdd %int %120 %int_1
+               OpStore %treeIndex_0 %121
+        %122 = OpLoad %int %treeIndex_0
+               OpStore %param_21 %122
+               OpStore %param_22 %int_13
+        %123 = OpFunctionCall %void %insert_i1_i1_ %param_21 %param_22
+               OpStore %count %int_0
+               OpStore %i %int_0
+               OpBranch %124
+        %124 = OpLabel
+               OpLoopMerge %125 %126 None
+               OpBranch %127
+        %127 = OpLabel
+        %128 = OpLoad %int %i
+        %129 = OpSLessThan %bool %128 %int_20
+               OpBranchConditional %129 %130 %125
+        %130 = OpLabel
+        %131 = OpLoad %int %i
+               OpStore %param_23 %131
+        %132 = OpFunctionCall %int %search_i1_ %param_23
+               OpStore %result %132
+        %133 = OpLoad %int %i
+               OpSelectionMerge %134 None
+               OpSwitch %133 %135 9 %136 5 %136 12 %136 15 %136 7 %136 8 %136 2 %136 6 %136 17 %136 13 %136
+        %135 = OpLabel
+        %137 = OpLoad %int %result
+        %138 = OpIEqual %bool %137 %int_n1
+               OpSelectionMerge %139 None
+               OpBranchConditional %138 %140 %139
+        %140 = OpLabel
+        %141 = OpLoad %int %count
+        %142 = OpIAdd %int %141 %int_1
+               OpStore %count %142
+               OpBranch %139
+        %139 = OpLabel
+               OpBranch %134
+        %136 = OpLabel
+        %143 = OpLoad %int %result
+        %144 = OpLoad %int %i
+        %145 = OpIEqual %bool %143 %144
+               OpSelectionMerge %146 None
+               OpBranchConditional %145 %147 %146
+        %147 = OpLabel
+        %148 = OpLoad %int %count
+        %149 = OpIAdd %int %148 %int_1
+               OpStore %count %149
+               OpBranch %146
+        %146 = OpLabel
+               OpBranch %134
+        %134 = OpLabel
+               OpBranch %126
+        %126 = OpLabel
+        %150 = OpLoad %int %i
+        %151 = OpIAdd %int %150 %int_1
+               OpStore %i %151
+               OpBranch %124
+        %125 = OpLabel
+        %152 = OpLoad %int %count
+        %153 = OpIEqual %bool %152 %int_20
+               OpSelectionMerge %154 None
+               OpBranchConditional %153 %155 %156
+        %155 = OpLabel
+               OpStore %_GLF_color %80
+               OpBranch %154
+        %156 = OpLabel
+               OpStore %_GLF_color %81
+               OpBranch %154
+        %154 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%makeTreeNode_struct_BST_i1_i1_i11_i1_ = OpFunction %void None %51
+       %tree = OpFunctionParameter %_ptr_Function_BST
+       %data = OpFunctionParameter %_ptr_Function_int
+        %157 = OpLabel
+        %158 = OpLoad %int %data
+        %159 = OpAccessChain %_ptr_Function_int %tree %int_0
+               OpStore %159 %158
+        %160 = OpAccessChain %_ptr_Function_int %tree %int_1
+               OpStore %160 %int_n1
+        %161 = OpAccessChain %_ptr_Function_int %tree %int_2
+               OpStore %161 %int_n1
+               OpReturn
+               OpFunctionEnd
+%insert_i1_i1_ = OpFunction %void None %52
+  %treeIndex = OpFunctionParameter %_ptr_Function_int
+     %data_0 = OpFunctionParameter %_ptr_Function_int
+        %162 = OpLabel
+  %baseIndex = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_BST Function
+    %param_0 = OpVariable %_ptr_Function_int Function
+    %param_1 = OpVariable %_ptr_Function_BST Function
+    %param_2 = OpVariable %_ptr_Function_int Function
+               OpStore %baseIndex %int_0
+               OpBranch %163
+        %163 = OpLabel
+               OpLoopMerge %164 %165 None
+               OpBranch %166
+        %166 = OpLabel
+        %167 = OpLoad %int %baseIndex
+        %168 = OpLoad %int %treeIndex
+        %169 = OpSLessThanEqual %bool %167 %168
+               OpBranchConditional %169 %170 %164
+        %170 = OpLabel
+        %171 = OpLoad %int %data_0
+        %172 = OpLoad %int %baseIndex
+        %173 = OpAccessChain %_ptr_Private_int %tree_0 %172 %int_0
+        %174 = OpLoad %int %173
+        %175 = OpSLessThanEqual %bool %171 %174
+               OpSelectionMerge %176 None
+               OpBranchConditional %175 %177 %178
+        %177 = OpLabel
+        %179 = OpLoad %int %baseIndex
+        %180 = OpAccessChain %_ptr_Private_int %tree_0 %179 %int_1
+        %181 = OpLoad %int %180
+        %182 = OpIEqual %bool %181 %int_n1
+               OpSelectionMerge %183 None
+               OpBranchConditional %182 %184 %185
+        %184 = OpLabel
+        %186 = OpLoad %int %baseIndex
+        %187 = OpLoad %int %treeIndex
+        %188 = OpAccessChain %_ptr_Private_int %tree_0 %186 %int_1
+               OpStore %188 %187
+        %189 = OpLoad %int %treeIndex
+        %190 = OpAccessChain %_ptr_Private_BST %tree_0 %189
+        %191 = OpLoad %BST %190
+               OpStore %param %191
+        %192 = OpLoad %int %data_0
+               OpStore %param_0 %192
+        %193 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param %param_0
+        %194 = OpLoad %BST %param
+        %195 = OpAccessChain %_ptr_Private_BST %tree_0 %189
+               OpStore %195 %194
+               OpReturn
+        %185 = OpLabel
+        %196 = OpLoad %int %baseIndex
+        %197 = OpAccessChain %_ptr_Private_int %tree_0 %196 %int_1
+        %198 = OpLoad %int %197
+               OpStore %baseIndex %198
+               OpBranch %165
+        %183 = OpLabel
+               OpUnreachable
+        %178 = OpLabel
+        %199 = OpLoad %int %baseIndex
+        %200 = OpAccessChain %_ptr_Private_int %tree_0 %199 %int_2
+        %201 = OpLoad %int %200
+        %202 = OpIEqual %bool %201 %int_n1
+               OpSelectionMerge %203 None
+               OpBranchConditional %202 %204 %205
+        %204 = OpLabel
+        %206 = OpLoad %int %baseIndex
+        %207 = OpLoad %int %treeIndex
+        %208 = OpAccessChain %_ptr_Private_int %tree_0 %206 %int_2
+               OpStore %208 %207
+        %209 = OpLoad %int %treeIndex
+        %210 = OpAccessChain %_ptr_Private_BST %tree_0 %209
+        %211 = OpLoad %BST %210
+               OpStore %param_1 %211
+        %212 = OpLoad %int %data_0
+               OpStore %param_2 %212
+        %213 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param_1 %param_2
+        %214 = OpLoad %BST %param_1
+        %215 = OpAccessChain %_ptr_Private_BST %tree_0 %209
+               OpStore %215 %214
+               OpReturn
+        %205 = OpLabel
+        %216 = OpLoad %int %baseIndex
+        %217 = OpAccessChain %_ptr_Private_int %tree_0 %216 %int_2
+        %218 = OpLoad %int %217
+               OpStore %baseIndex %218
+               OpBranch %165
+        %203 = OpLabel
+               OpUnreachable
+        %176 = OpLabel
+               OpUnreachable
+        %165 = OpLabel
+               OpBranch %163
+        %164 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %search_i1_ = OpFunction %int None %53
+     %target = OpFunctionParameter %_ptr_Function_int
+        %219 = OpLabel
+      %index = OpVariable %_ptr_Function_int Function
+%currentNode = OpVariable %_ptr_Function_BST Function
+        %220 = OpVariable %_ptr_Function_int Function
+               OpStore %index %int_0
+               OpBranch %221
+        %221 = OpLabel
+               OpLoopMerge %222 %223 None
+               OpBranch %224
+        %224 = OpLabel
+        %225 = OpLoad %int %index
+        %226 = OpINotEqual %bool %225 %int_n1
+               OpBranchConditional %226 %227 %222
+        %227 = OpLabel
+        %228 = OpLoad %int %index
+        %229 = OpAccessChain %_ptr_Private_BST %tree_0 %228
+        %230 = OpLoad %BST %229
+               OpStore %currentNode %230
+        %231 = OpAccessChain %_ptr_Function_int %currentNode %int_0
+        %232 = OpLoad %int %231
+        %233 = OpLoad %int %target
+        %234 = OpIEqual %bool %232 %233
+               OpSelectionMerge %235 None
+               OpBranchConditional %234 %236 %235
+        %236 = OpLabel
+        %237 = OpLoad %int %target
+               OpReturnValue %237
+        %235 = OpLabel
+        %238 = OpLoad %int %target
+        %239 = OpAccessChain %_ptr_Function_int %currentNode %int_0
+        %240 = OpLoad %int %239
+        %241 = OpSGreaterThan %bool %238 %240
+               OpSelectionMerge %242 None
+               OpBranchConditional %241 %243 %244
+        %243 = OpLabel
+        %245 = OpAccessChain %_ptr_Function_int %currentNode %int_2
+        %246 = OpLoad %int %245
+               OpStore %220 %246
+               OpBranch %242
+        %244 = OpLabel
+        %247 = OpAccessChain %_ptr_Function_int %currentNode %int_1
+        %248 = OpLoad %int %247
+               OpStore %220 %248
+               OpBranch %242
+        %242 = OpLabel
+        %249 = OpLoad %int %220
+               OpStore %index %249
+               OpBranch %223
+        %223 = OpLabel
+               OpBranch %221
+        %222 = OpLabel
+               OpReturnValue %int_n1
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..bc5fdac
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/0.spvasm.expected.hlsl
@@ -0,0 +1,232 @@
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+
+static BST tree_1[10] = (BST[10])0;
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void makeTreeNode_struct_BST_i1_i1_i11_i1_(inout BST tree, inout int data) {
+  const int x_158 = data;
+  tree.data = x_158;
+  tree.leftIndex = -1;
+  tree.rightIndex = -1;
+  return;
+}
+
+void insert_i1_i1_(inout int treeIndex, inout int data_1) {
+  int baseIndex = 0;
+  BST param = (BST)0;
+  int param_1 = 0;
+  BST param_2 = (BST)0;
+  int param_3 = 0;
+  baseIndex = 0;
+  while (true) {
+    const int x_167 = baseIndex;
+    const int x_168 = treeIndex;
+    if ((x_167 <= x_168)) {
+    } else {
+      break;
+    }
+    const int x_171 = data_1;
+    const int x_174 = tree_1[baseIndex].data;
+    if ((x_171 <= x_174)) {
+      const int x_181 = tree_1[baseIndex].leftIndex;
+      if ((x_181 == -1)) {
+        const int x_186 = baseIndex;
+        const int x_187 = treeIndex;
+        tree_1[x_186].leftIndex = x_187;
+        const int x_189 = treeIndex;
+        const BST x_191 = tree_1[x_189];
+        param = x_191;
+        const int x_192 = data_1;
+        param_1 = x_192;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(param, param_1);
+        tree_1[x_189] = param;
+        return;
+      } else {
+        const int x_198 = tree_1[baseIndex].leftIndex;
+        baseIndex = x_198;
+        continue;
+      }
+      return;
+    } else {
+      const int x_201 = tree_1[baseIndex].rightIndex;
+      if ((x_201 == -1)) {
+        const int x_206 = baseIndex;
+        const int x_207 = treeIndex;
+        tree_1[x_206].rightIndex = x_207;
+        const int x_209 = treeIndex;
+        const BST x_211 = tree_1[x_209];
+        param_2 = x_211;
+        const int x_212 = data_1;
+        param_3 = x_212;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(param_2, param_3);
+        tree_1[x_209] = param_2;
+        return;
+      } else {
+        const int x_218 = tree_1[baseIndex].rightIndex;
+        baseIndex = x_218;
+        continue;
+      }
+      return;
+    }
+    return;
+  }
+  return;
+}
+
+int search_i1_(inout int target) {
+  int index = 0;
+  BST currentNode = (BST)0;
+  int x_220 = 0;
+  index = 0;
+  while (true) {
+    if ((index != -1)) {
+    } else {
+      break;
+    }
+    const BST x_230 = tree_1[index];
+    currentNode = x_230;
+    const int x_232 = currentNode.data;
+    const int x_233 = target;
+    if ((x_232 == x_233)) {
+      const int x_237 = target;
+      return x_237;
+    }
+    const int x_238 = target;
+    const int x_240 = currentNode.data;
+    if ((x_238 > x_240)) {
+      const int x_246 = currentNode.rightIndex;
+      x_220 = x_246;
+    } else {
+      const int x_248 = currentNode.leftIndex;
+      x_220 = x_248;
+    }
+    index = x_220;
+  }
+  return -1;
+}
+
+void main_1() {
+  int treeIndex_1 = 0;
+  BST param_4 = (BST)0;
+  int param_5 = 0;
+  int param_6 = 0;
+  int param_7 = 0;
+  int param_8 = 0;
+  int param_9 = 0;
+  int param_10 = 0;
+  int param_11 = 0;
+  int param_12 = 0;
+  int param_13 = 0;
+  int param_14 = 0;
+  int param_15 = 0;
+  int param_16 = 0;
+  int param_17 = 0;
+  int param_18 = 0;
+  int param_19 = 0;
+  int param_20 = 0;
+  int param_21 = 0;
+  int param_22 = 0;
+  int param_23 = 0;
+  int count = 0;
+  int i = 0;
+  int result = 0;
+  int param_24 = 0;
+  treeIndex_1 = 0;
+  const BST x_84 = tree_1[0];
+  param_4 = x_84;
+  param_5 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(param_4, param_5);
+  tree_1[0] = param_4;
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_6 = treeIndex_1;
+  param_7 = 5;
+  insert_i1_i1_(param_6, param_7);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_8 = treeIndex_1;
+  param_9 = 12;
+  insert_i1_i1_(param_8, param_9);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_10 = treeIndex_1;
+  param_11 = 15;
+  insert_i1_i1_(param_10, param_11);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_12 = treeIndex_1;
+  param_13 = 7;
+  insert_i1_i1_(param_12, param_13);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_14 = treeIndex_1;
+  param_15 = 8;
+  insert_i1_i1_(param_14, param_15);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_16 = treeIndex_1;
+  param_17 = 2;
+  insert_i1_i1_(param_16, param_17);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_18 = treeIndex_1;
+  param_19 = 6;
+  insert_i1_i1_(param_18, param_19);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_20 = treeIndex_1;
+  param_21 = 17;
+  insert_i1_i1_(param_20, param_21);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_22 = treeIndex_1;
+  param_23 = 13;
+  insert_i1_i1_(param_22, param_23);
+  count = 0;
+  i = 0;
+  {
+    for(; (i < 20); i = (i + 1)) {
+      param_24 = i;
+      const int x_132 = search_i1_(param_24);
+      result = x_132;
+      switch(i) {
+        case 2:
+        case 5:
+        case 6:
+        case 7:
+        case 8:
+        case 9:
+        case 12:
+        case 13:
+        case 15:
+        case 17: {
+          if ((result == i)) {
+            count = (count + 1);
+          }
+          break;
+        }
+        default: {
+          if ((result == -1)) {
+            count = (count + 1);
+          }
+          break;
+        }
+      }
+    }
+  }
+  if ((count == 20)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/0.spvasm.expected.msl
new file mode 100644
index 0000000..f509724
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/0.spvasm.expected.msl
@@ -0,0 +1,281 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+struct tint_array_wrapper {
+  BST arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void makeTreeNode_struct_BST_i1_i1_i11_i1_(thread BST* const tree, thread int* const data) {
+  int const x_158 = *(data);
+  (*(tree)).data = x_158;
+  (*(tree)).leftIndex = -1;
+  (*(tree)).rightIndex = -1;
+  return;
+}
+
+void insert_i1_i1_(thread int* const treeIndex, thread int* const data_1, thread tint_array_wrapper* const tint_symbol_4) {
+  int baseIndex = 0;
+  BST param = {};
+  int param_1 = 0;
+  BST param_2 = {};
+  int param_3 = 0;
+  baseIndex = 0;
+  while (true) {
+    int const x_167 = baseIndex;
+    int const x_168 = *(treeIndex);
+    if ((x_167 <= x_168)) {
+    } else {
+      break;
+    }
+    int const x_171 = *(data_1);
+    int const x_172 = baseIndex;
+    int const x_174 = (*(tint_symbol_4)).arr[x_172].data;
+    if ((x_171 <= x_174)) {
+      int const x_179 = baseIndex;
+      int const x_181 = (*(tint_symbol_4)).arr[x_179].leftIndex;
+      if ((x_181 == -1)) {
+        int const x_186 = baseIndex;
+        int const x_187 = *(treeIndex);
+        (*(tint_symbol_4)).arr[x_186].leftIndex = x_187;
+        int const x_189 = *(treeIndex);
+        BST const x_191 = (*(tint_symbol_4)).arr[x_189];
+        param = x_191;
+        int const x_192 = *(data_1);
+        param_1 = x_192;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param), &(param_1));
+        BST const x_194 = param;
+        (*(tint_symbol_4)).arr[x_189] = x_194;
+        return;
+      } else {
+        int const x_196 = baseIndex;
+        int const x_198 = (*(tint_symbol_4)).arr[x_196].leftIndex;
+        baseIndex = x_198;
+        continue;
+      }
+      return;
+    } else {
+      int const x_199 = baseIndex;
+      int const x_201 = (*(tint_symbol_4)).arr[x_199].rightIndex;
+      if ((x_201 == -1)) {
+        int const x_206 = baseIndex;
+        int const x_207 = *(treeIndex);
+        (*(tint_symbol_4)).arr[x_206].rightIndex = x_207;
+        int const x_209 = *(treeIndex);
+        BST const x_211 = (*(tint_symbol_4)).arr[x_209];
+        param_2 = x_211;
+        int const x_212 = *(data_1);
+        param_3 = x_212;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_2), &(param_3));
+        BST const x_214 = param_2;
+        (*(tint_symbol_4)).arr[x_209] = x_214;
+        return;
+      } else {
+        int const x_216 = baseIndex;
+        int const x_218 = (*(tint_symbol_4)).arr[x_216].rightIndex;
+        baseIndex = x_218;
+        continue;
+      }
+      return;
+    }
+    return;
+  }
+  return;
+}
+
+int search_i1_(thread int* const target, thread tint_array_wrapper* const tint_symbol_5) {
+  int index = 0;
+  BST currentNode = {};
+  int x_220 = 0;
+  index = 0;
+  while (true) {
+    int const x_225 = index;
+    if ((x_225 != -1)) {
+    } else {
+      break;
+    }
+    int const x_228 = index;
+    BST const x_230 = (*(tint_symbol_5)).arr[x_228];
+    currentNode = x_230;
+    int const x_232 = currentNode.data;
+    int const x_233 = *(target);
+    if ((x_232 == x_233)) {
+      int const x_237 = *(target);
+      return x_237;
+    }
+    int const x_238 = *(target);
+    int const x_240 = currentNode.data;
+    if ((x_238 > x_240)) {
+      int const x_246 = currentNode.rightIndex;
+      x_220 = x_246;
+    } else {
+      int const x_248 = currentNode.leftIndex;
+      x_220 = x_248;
+    }
+    int const x_249 = x_220;
+    index = x_249;
+  }
+  return -1;
+}
+
+void main_1(thread tint_array_wrapper* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  int treeIndex_1 = 0;
+  BST param_4 = {};
+  int param_5 = 0;
+  int param_6 = 0;
+  int param_7 = 0;
+  int param_8 = 0;
+  int param_9 = 0;
+  int param_10 = 0;
+  int param_11 = 0;
+  int param_12 = 0;
+  int param_13 = 0;
+  int param_14 = 0;
+  int param_15 = 0;
+  int param_16 = 0;
+  int param_17 = 0;
+  int param_18 = 0;
+  int param_19 = 0;
+  int param_20 = 0;
+  int param_21 = 0;
+  int param_22 = 0;
+  int param_23 = 0;
+  int count = 0;
+  int i = 0;
+  int result = 0;
+  int param_24 = 0;
+  treeIndex_1 = 0;
+  BST const x_84 = (*(tint_symbol_6)).arr[0];
+  param_4 = x_84;
+  param_5 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_4), &(param_5));
+  BST const x_86 = param_4;
+  (*(tint_symbol_6)).arr[0] = x_86;
+  int const x_88 = treeIndex_1;
+  treeIndex_1 = (x_88 + 1);
+  int const x_90 = treeIndex_1;
+  param_6 = x_90;
+  param_7 = 5;
+  insert_i1_i1_(&(param_6), &(param_7), tint_symbol_6);
+  int const x_92 = treeIndex_1;
+  treeIndex_1 = (x_92 + 1);
+  int const x_94 = treeIndex_1;
+  param_8 = x_94;
+  param_9 = 12;
+  insert_i1_i1_(&(param_8), &(param_9), tint_symbol_6);
+  int const x_96 = treeIndex_1;
+  treeIndex_1 = (x_96 + 1);
+  int const x_98 = treeIndex_1;
+  param_10 = x_98;
+  param_11 = 15;
+  insert_i1_i1_(&(param_10), &(param_11), tint_symbol_6);
+  int const x_100 = treeIndex_1;
+  treeIndex_1 = (x_100 + 1);
+  int const x_102 = treeIndex_1;
+  param_12 = x_102;
+  param_13 = 7;
+  insert_i1_i1_(&(param_12), &(param_13), tint_symbol_6);
+  int const x_104 = treeIndex_1;
+  treeIndex_1 = (x_104 + 1);
+  int const x_106 = treeIndex_1;
+  param_14 = x_106;
+  param_15 = 8;
+  insert_i1_i1_(&(param_14), &(param_15), tint_symbol_6);
+  int const x_108 = treeIndex_1;
+  treeIndex_1 = (x_108 + 1);
+  int const x_110 = treeIndex_1;
+  param_16 = x_110;
+  param_17 = 2;
+  insert_i1_i1_(&(param_16), &(param_17), tint_symbol_6);
+  int const x_112 = treeIndex_1;
+  treeIndex_1 = (x_112 + 1);
+  int const x_114 = treeIndex_1;
+  param_18 = x_114;
+  param_19 = 6;
+  insert_i1_i1_(&(param_18), &(param_19), tint_symbol_6);
+  int const x_116 = treeIndex_1;
+  treeIndex_1 = (x_116 + 1);
+  int const x_118 = treeIndex_1;
+  param_20 = x_118;
+  param_21 = 17;
+  insert_i1_i1_(&(param_20), &(param_21), tint_symbol_6);
+  int const x_120 = treeIndex_1;
+  treeIndex_1 = (x_120 + 1);
+  int const x_122 = treeIndex_1;
+  param_22 = x_122;
+  param_23 = 13;
+  insert_i1_i1_(&(param_22), &(param_23), tint_symbol_6);
+  count = 0;
+  i = 0;
+  while (true) {
+    int const x_128 = i;
+    if ((x_128 < 20)) {
+    } else {
+      break;
+    }
+    int const x_131 = i;
+    param_24 = x_131;
+    int const x_132 = search_i1_(&(param_24), tint_symbol_6);
+    result = x_132;
+    int const x_133 = i;
+    switch(x_133) {
+      case 2:
+      case 5:
+      case 6:
+      case 7:
+      case 8:
+      case 9:
+      case 12:
+      case 13:
+      case 15:
+      case 17: {
+        int const x_143 = result;
+        int const x_144 = i;
+        if ((x_143 == x_144)) {
+          int const x_148 = count;
+          count = (x_148 + 1);
+        }
+        break;
+      }
+      default: {
+        int const x_137 = result;
+        if ((x_137 == -1)) {
+          int const x_141 = count;
+          count = (x_141 + 1);
+        }
+        break;
+      }
+    }
+    {
+      int const x_150 = i;
+      i = (x_150 + 1);
+    }
+  }
+  int const x_152 = count;
+  if ((x_152 == 20)) {
+    *(tint_symbol_7) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_7) = float4(0.0f, 0.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread tint_array_wrapper tint_symbol_8 = {};
+  thread float4 tint_symbol_9 = 0.0f;
+  main_1(&(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..3d85c3b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/0.spvasm.expected.spvasm
@@ -0,0 +1,476 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 316
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %BST "BST"
+               OpMemberName %BST 0 "data"
+               OpMemberName %BST 1 "leftIndex"
+               OpMemberName %BST 2 "rightIndex"
+               OpName %tree_1 "tree_1"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %makeTreeNode_struct_BST_i1_i1_i11_i1_ "makeTreeNode_struct_BST_i1_i1_i11_i1_"
+               OpName %tree "tree"
+               OpName %data "data"
+               OpName %insert_i1_i1_ "insert_i1_i1_"
+               OpName %treeIndex "treeIndex"
+               OpName %data_1 "data_1"
+               OpName %baseIndex "baseIndex"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %search_i1_ "search_i1_"
+               OpName %target "target"
+               OpName %index "index"
+               OpName %currentNode "currentNode"
+               OpName %x_220 "x_220"
+               OpName %main_1 "main_1"
+               OpName %treeIndex_1 "treeIndex_1"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpName %param_6 "param_6"
+               OpName %param_7 "param_7"
+               OpName %param_8 "param_8"
+               OpName %param_9 "param_9"
+               OpName %param_10 "param_10"
+               OpName %param_11 "param_11"
+               OpName %param_12 "param_12"
+               OpName %param_13 "param_13"
+               OpName %param_14 "param_14"
+               OpName %param_15 "param_15"
+               OpName %param_16 "param_16"
+               OpName %param_17 "param_17"
+               OpName %param_18 "param_18"
+               OpName %param_19 "param_19"
+               OpName %param_20 "param_20"
+               OpName %param_21 "param_21"
+               OpName %param_22 "param_22"
+               OpName %param_23 "param_23"
+               OpName %count "count"
+               OpName %i "i"
+               OpName %result "result"
+               OpName %param_24 "param_24"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpMemberDecorate %BST 0 Offset 0
+               OpMemberDecorate %BST 1 Offset 4
+               OpMemberDecorate %BST 2 Offset 8
+               OpDecorate %_arr_BST_uint_10 ArrayStride 12
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+        %BST = OpTypeStruct %int %int %int
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_BST_uint_10 = OpTypeArray %BST %uint_10
+%_ptr_Private__arr_BST_uint_10 = OpTypePointer Private %_arr_BST_uint_10
+          %8 = OpConstantNull %_arr_BST_uint_10
+     %tree_1 = OpVariable %_ptr_Private__arr_BST_uint_10 Private %8
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %13 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %13
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %13
+       %void = OpTypeVoid
+%_ptr_Function_BST = OpTypePointer Function %BST
+%_ptr_Function_int = OpTypePointer Function %int
+         %16 = OpTypeFunction %void %_ptr_Function_BST %_ptr_Function_int
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+     %int_n1 = OpConstant %int -1
+     %uint_2 = OpConstant %uint 2
+         %36 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+         %42 = OpConstantNull %int
+         %44 = OpConstantNull %BST
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+%_ptr_Private_int = OpTypePointer Private %int
+%_ptr_Private_BST = OpTypePointer Private %BST
+        %122 = OpTypeFunction %int %_ptr_Function_int
+        %163 = OpTypeFunction %void
+      %int_9 = OpConstant %int 9
+      %int_1 = OpConstant %int 1
+      %int_5 = OpConstant %int 5
+     %int_12 = OpConstant %int 12
+     %int_15 = OpConstant %int 15
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+      %int_2 = OpConstant %int 2
+      %int_6 = OpConstant %int 6
+     %int_17 = OpConstant %int 17
+     %int_13 = OpConstant %int 13
+     %int_20 = OpConstant %int 20
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+        %302 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %303 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+        %304 = OpTypeFunction %void %main_out
+%makeTreeNode_struct_BST_i1_i1_i11_i1_ = OpFunction %void None %16
+       %tree = OpFunctionParameter %_ptr_Function_BST
+       %data = OpFunctionParameter %_ptr_Function_int
+         %23 = OpLabel
+         %25 = OpLoad %int %data
+         %28 = OpAccessChain %_ptr_Function_int %tree %uint_0
+               OpStore %28 %25
+         %31 = OpAccessChain %_ptr_Function_int %tree %uint_1
+               OpStore %31 %int_n1
+         %35 = OpAccessChain %_ptr_Function_int %tree %uint_2
+               OpStore %35 %int_n1
+               OpReturn
+               OpFunctionEnd
+%insert_i1_i1_ = OpFunction %void None %36
+  %treeIndex = OpFunctionParameter %_ptr_Function_int
+     %data_1 = OpFunctionParameter %_ptr_Function_int
+         %40 = OpLabel
+  %baseIndex = OpVariable %_ptr_Function_int Function %42
+      %param = OpVariable %_ptr_Function_BST Function %44
+    %param_1 = OpVariable %_ptr_Function_int Function %42
+    %param_2 = OpVariable %_ptr_Function_BST Function %44
+    %param_3 = OpVariable %_ptr_Function_int Function %42
+               OpStore %baseIndex %int_0
+               OpBranch %49
+         %49 = OpLabel
+               OpLoopMerge %50 %51 None
+               OpBranch %52
+         %52 = OpLabel
+         %53 = OpLoad %int %baseIndex
+         %55 = OpLoad %int %treeIndex
+         %56 = OpSLessThanEqual %bool %53 %55
+               OpSelectionMerge %58 None
+               OpBranchConditional %56 %59 %60
+         %59 = OpLabel
+               OpBranch %58
+         %60 = OpLabel
+               OpBranch %50
+         %58 = OpLabel
+         %62 = OpLoad %int %data_1
+         %63 = OpLoad %int %baseIndex
+         %65 = OpAccessChain %_ptr_Private_int %tree_1 %63 %uint_0
+         %66 = OpLoad %int %65
+         %67 = OpSLessThanEqual %bool %62 %66
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %70
+         %69 = OpLabel
+         %71 = OpLoad %int %baseIndex
+         %72 = OpAccessChain %_ptr_Private_int %tree_1 %71 %uint_1
+         %73 = OpLoad %int %72
+         %74 = OpIEqual %bool %73 %int_n1
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %77
+         %76 = OpLabel
+         %78 = OpLoad %int %baseIndex
+         %80 = OpLoad %int %treeIndex
+         %81 = OpAccessChain %_ptr_Private_int %tree_1 %78 %uint_1
+               OpStore %81 %80
+         %83 = OpLoad %int %treeIndex
+         %85 = OpAccessChain %_ptr_Private_BST %tree_1 %83
+         %86 = OpLoad %BST %85
+               OpStore %param %86
+         %88 = OpLoad %int %data_1
+               OpStore %param_1 %88
+         %89 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param %param_1
+         %92 = OpLoad %BST %param
+         %93 = OpAccessChain %_ptr_Private_BST %tree_1 %83
+               OpStore %93 %92
+               OpReturn
+         %77 = OpLabel
+         %94 = OpLoad %int %baseIndex
+         %95 = OpAccessChain %_ptr_Private_int %tree_1 %94 %uint_1
+         %96 = OpLoad %int %95
+               OpStore %baseIndex %96
+               OpBranch %51
+         %75 = OpLabel
+               OpReturn
+         %70 = OpLabel
+         %97 = OpLoad %int %baseIndex
+         %98 = OpAccessChain %_ptr_Private_int %tree_1 %97 %uint_2
+         %99 = OpLoad %int %98
+        %100 = OpIEqual %bool %99 %int_n1
+               OpSelectionMerge %101 None
+               OpBranchConditional %100 %102 %103
+        %102 = OpLabel
+        %104 = OpLoad %int %baseIndex
+        %106 = OpLoad %int %treeIndex
+        %107 = OpAccessChain %_ptr_Private_int %tree_1 %104 %uint_2
+               OpStore %107 %106
+        %109 = OpLoad %int %treeIndex
+        %110 = OpAccessChain %_ptr_Private_BST %tree_1 %109
+        %111 = OpLoad %BST %110
+               OpStore %param_2 %111
+        %113 = OpLoad %int %data_1
+               OpStore %param_3 %113
+        %114 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param_2 %param_3
+        %117 = OpLoad %BST %param_2
+        %118 = OpAccessChain %_ptr_Private_BST %tree_1 %109
+               OpStore %118 %117
+               OpReturn
+        %103 = OpLabel
+        %119 = OpLoad %int %baseIndex
+        %120 = OpAccessChain %_ptr_Private_int %tree_1 %119 %uint_2
+        %121 = OpLoad %int %120
+               OpStore %baseIndex %121
+               OpBranch %51
+        %101 = OpLabel
+               OpReturn
+         %68 = OpLabel
+               OpReturn
+         %51 = OpLabel
+               OpBranch %49
+         %50 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %search_i1_ = OpFunction %int None %122
+     %target = OpFunctionParameter %_ptr_Function_int
+        %125 = OpLabel
+      %index = OpVariable %_ptr_Function_int Function %42
+%currentNode = OpVariable %_ptr_Function_BST Function %44
+      %x_220 = OpVariable %_ptr_Function_int Function %42
+               OpStore %index %int_0
+               OpBranch %129
+        %129 = OpLabel
+               OpLoopMerge %130 %131 None
+               OpBranch %132
+        %132 = OpLabel
+        %133 = OpLoad %int %index
+        %134 = OpINotEqual %bool %133 %int_n1
+               OpSelectionMerge %135 None
+               OpBranchConditional %134 %136 %137
+        %136 = OpLabel
+               OpBranch %135
+        %137 = OpLabel
+               OpBranch %130
+        %135 = OpLabel
+        %138 = OpLoad %int %index
+        %139 = OpAccessChain %_ptr_Private_BST %tree_1 %138
+        %140 = OpLoad %BST %139
+               OpStore %currentNode %140
+        %141 = OpAccessChain %_ptr_Function_int %currentNode %uint_0
+        %142 = OpLoad %int %141
+        %144 = OpLoad %int %target
+        %145 = OpIEqual %bool %142 %144
+               OpSelectionMerge %146 None
+               OpBranchConditional %145 %147 %146
+        %147 = OpLabel
+        %149 = OpLoad %int %target
+               OpReturnValue %149
+        %146 = OpLabel
+        %151 = OpLoad %int %target
+        %152 = OpAccessChain %_ptr_Function_int %currentNode %uint_0
+        %153 = OpLoad %int %152
+        %154 = OpSGreaterThan %bool %151 %153
+               OpSelectionMerge %155 None
+               OpBranchConditional %154 %156 %157
+        %156 = OpLabel
+        %158 = OpAccessChain %_ptr_Function_int %currentNode %uint_2
+        %159 = OpLoad %int %158
+               OpStore %x_220 %159
+               OpBranch %155
+        %157 = OpLabel
+        %160 = OpAccessChain %_ptr_Function_int %currentNode %uint_1
+        %161 = OpLoad %int %160
+               OpStore %x_220 %161
+               OpBranch %155
+        %155 = OpLabel
+        %162 = OpLoad %int %x_220
+               OpStore %index %162
+               OpBranch %131
+        %131 = OpLabel
+               OpBranch %129
+        %130 = OpLabel
+               OpReturnValue %int_n1
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %163
+        %165 = OpLabel
+%treeIndex_1 = OpVariable %_ptr_Function_int Function %42
+    %param_4 = OpVariable %_ptr_Function_BST Function %44
+    %param_5 = OpVariable %_ptr_Function_int Function %42
+    %param_6 = OpVariable %_ptr_Function_int Function %42
+    %param_7 = OpVariable %_ptr_Function_int Function %42
+    %param_8 = OpVariable %_ptr_Function_int Function %42
+    %param_9 = OpVariable %_ptr_Function_int Function %42
+   %param_10 = OpVariable %_ptr_Function_int Function %42
+   %param_11 = OpVariable %_ptr_Function_int Function %42
+   %param_12 = OpVariable %_ptr_Function_int Function %42
+   %param_13 = OpVariable %_ptr_Function_int Function %42
+   %param_14 = OpVariable %_ptr_Function_int Function %42
+   %param_15 = OpVariable %_ptr_Function_int Function %42
+   %param_16 = OpVariable %_ptr_Function_int Function %42
+   %param_17 = OpVariable %_ptr_Function_int Function %42
+   %param_18 = OpVariable %_ptr_Function_int Function %42
+   %param_19 = OpVariable %_ptr_Function_int Function %42
+   %param_20 = OpVariable %_ptr_Function_int Function %42
+   %param_21 = OpVariable %_ptr_Function_int Function %42
+   %param_22 = OpVariable %_ptr_Function_int Function %42
+   %param_23 = OpVariable %_ptr_Function_int Function %42
+      %count = OpVariable %_ptr_Function_int Function %42
+          %i = OpVariable %_ptr_Function_int Function %42
+     %result = OpVariable %_ptr_Function_int Function %42
+   %param_24 = OpVariable %_ptr_Function_int Function %42
+               OpStore %treeIndex_1 %int_0
+        %191 = OpAccessChain %_ptr_Private_BST %tree_1 %int_0
+        %192 = OpLoad %BST %191
+               OpStore %param_4 %192
+               OpStore %param_5 %int_9
+        %194 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param_4 %param_5
+        %197 = OpLoad %BST %param_4
+        %198 = OpAccessChain %_ptr_Private_BST %tree_1 %int_0
+               OpStore %198 %197
+        %199 = OpLoad %int %treeIndex_1
+        %201 = OpIAdd %int %199 %int_1
+               OpStore %treeIndex_1 %201
+        %202 = OpLoad %int %treeIndex_1
+               OpStore %param_6 %202
+               OpStore %param_7 %int_5
+        %204 = OpFunctionCall %void %insert_i1_i1_ %param_6 %param_7
+        %207 = OpLoad %int %treeIndex_1
+        %208 = OpIAdd %int %207 %int_1
+               OpStore %treeIndex_1 %208
+        %209 = OpLoad %int %treeIndex_1
+               OpStore %param_8 %209
+               OpStore %param_9 %int_12
+        %211 = OpFunctionCall %void %insert_i1_i1_ %param_8 %param_9
+        %214 = OpLoad %int %treeIndex_1
+        %215 = OpIAdd %int %214 %int_1
+               OpStore %treeIndex_1 %215
+        %216 = OpLoad %int %treeIndex_1
+               OpStore %param_10 %216
+               OpStore %param_11 %int_15
+        %218 = OpFunctionCall %void %insert_i1_i1_ %param_10 %param_11
+        %221 = OpLoad %int %treeIndex_1
+        %222 = OpIAdd %int %221 %int_1
+               OpStore %treeIndex_1 %222
+        %223 = OpLoad %int %treeIndex_1
+               OpStore %param_12 %223
+               OpStore %param_13 %int_7
+        %225 = OpFunctionCall %void %insert_i1_i1_ %param_12 %param_13
+        %228 = OpLoad %int %treeIndex_1
+        %229 = OpIAdd %int %228 %int_1
+               OpStore %treeIndex_1 %229
+        %230 = OpLoad %int %treeIndex_1
+               OpStore %param_14 %230
+               OpStore %param_15 %int_8
+        %232 = OpFunctionCall %void %insert_i1_i1_ %param_14 %param_15
+        %235 = OpLoad %int %treeIndex_1
+        %236 = OpIAdd %int %235 %int_1
+               OpStore %treeIndex_1 %236
+        %237 = OpLoad %int %treeIndex_1
+               OpStore %param_16 %237
+               OpStore %param_17 %int_2
+        %239 = OpFunctionCall %void %insert_i1_i1_ %param_16 %param_17
+        %242 = OpLoad %int %treeIndex_1
+        %243 = OpIAdd %int %242 %int_1
+               OpStore %treeIndex_1 %243
+        %244 = OpLoad %int %treeIndex_1
+               OpStore %param_18 %244
+               OpStore %param_19 %int_6
+        %246 = OpFunctionCall %void %insert_i1_i1_ %param_18 %param_19
+        %249 = OpLoad %int %treeIndex_1
+        %250 = OpIAdd %int %249 %int_1
+               OpStore %treeIndex_1 %250
+        %251 = OpLoad %int %treeIndex_1
+               OpStore %param_20 %251
+               OpStore %param_21 %int_17
+        %253 = OpFunctionCall %void %insert_i1_i1_ %param_20 %param_21
+        %256 = OpLoad %int %treeIndex_1
+        %257 = OpIAdd %int %256 %int_1
+               OpStore %treeIndex_1 %257
+        %258 = OpLoad %int %treeIndex_1
+               OpStore %param_22 %258
+               OpStore %param_23 %int_13
+        %260 = OpFunctionCall %void %insert_i1_i1_ %param_22 %param_23
+               OpStore %count %int_0
+               OpStore %i %int_0
+               OpBranch %263
+        %263 = OpLabel
+               OpLoopMerge %264 %265 None
+               OpBranch %266
+        %266 = OpLabel
+        %267 = OpLoad %int %i
+        %269 = OpSLessThan %bool %267 %int_20
+               OpSelectionMerge %270 None
+               OpBranchConditional %269 %271 %272
+        %271 = OpLabel
+               OpBranch %270
+        %272 = OpLabel
+               OpBranch %264
+        %270 = OpLabel
+        %273 = OpLoad %int %i
+               OpStore %param_24 %273
+        %274 = OpFunctionCall %int %search_i1_ %param_24
+               OpStore %result %274
+        %276 = OpLoad %int %i
+               OpSelectionMerge %277 None
+               OpSwitch %276 %278 2 %279 5 %279 6 %279 7 %279 8 %279 9 %279 12 %279 13 %279 15 %279 17 %279
+        %279 = OpLabel
+        %280 = OpLoad %int %result
+        %281 = OpLoad %int %i
+        %282 = OpIEqual %bool %280 %281
+               OpSelectionMerge %283 None
+               OpBranchConditional %282 %284 %283
+        %284 = OpLabel
+        %285 = OpLoad %int %count
+        %286 = OpIAdd %int %285 %int_1
+               OpStore %count %286
+               OpBranch %283
+        %283 = OpLabel
+               OpBranch %277
+        %278 = OpLabel
+        %287 = OpLoad %int %result
+        %288 = OpIEqual %bool %287 %int_n1
+               OpSelectionMerge %289 None
+               OpBranchConditional %288 %290 %289
+        %290 = OpLabel
+        %291 = OpLoad %int %count
+        %292 = OpIAdd %int %291 %int_1
+               OpStore %count %292
+               OpBranch %289
+        %289 = OpLabel
+               OpBranch %277
+        %277 = OpLabel
+               OpBranch %265
+        %265 = OpLabel
+        %293 = OpLoad %int %i
+        %294 = OpIAdd %int %293 %int_1
+               OpStore %i %294
+               OpBranch %263
+        %264 = OpLabel
+        %295 = OpLoad %int %count
+        %296 = OpIEqual %bool %295 %int_20
+               OpSelectionMerge %297 None
+               OpBranchConditional %296 %298 %299
+        %298 = OpLabel
+               OpStore %x_GLF_color %302
+               OpBranch %297
+        %299 = OpLabel
+               OpStore %x_GLF_color %303
+               OpBranch %297
+        %297 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %304
+%tint_symbol = OpFunctionParameter %main_out
+        %308 = OpLabel
+        %309 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %309
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %163
+        %311 = OpLabel
+        %312 = OpFunctionCall %void %main_1
+        %314 = OpLoad %v4float %x_GLF_color
+        %315 = OpCompositeConstruct %main_out %314
+        %313 = OpFunctionCall %void %tint_symbol_2 %315
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..0016d4c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/0.spvasm.expected.wgsl
@@ -0,0 +1,264 @@
+struct BST {
+  data : i32;
+  leftIndex : i32;
+  rightIndex : i32;
+};
+
+var<private> tree_1 : array<BST, 10>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn makeTreeNode_struct_BST_i1_i1_i11_i1_(tree : ptr<function, BST>, data : ptr<function, i32>) {
+  let x_158 : i32 = *(data);
+  (*(tree)).data = x_158;
+  (*(tree)).leftIndex = -1;
+  (*(tree)).rightIndex = -1;
+  return;
+}
+
+fn insert_i1_i1_(treeIndex : ptr<function, i32>, data_1 : ptr<function, i32>) {
+  var baseIndex : i32;
+  var param : BST;
+  var param_1 : i32;
+  var param_2 : BST;
+  var param_3 : i32;
+  baseIndex = 0;
+  loop {
+    let x_167 : i32 = baseIndex;
+    let x_168 : i32 = *(treeIndex);
+    if ((x_167 <= x_168)) {
+    } else {
+      break;
+    }
+    let x_171 : i32 = *(data_1);
+    let x_172 : i32 = baseIndex;
+    let x_174 : i32 = tree_1[x_172].data;
+    if ((x_171 <= x_174)) {
+      let x_179 : i32 = baseIndex;
+      let x_181 : i32 = tree_1[x_179].leftIndex;
+      if ((x_181 == -1)) {
+        let x_186 : i32 = baseIndex;
+        let x_187 : i32 = *(treeIndex);
+        tree_1[x_186].leftIndex = x_187;
+        let x_189 : i32 = *(treeIndex);
+        let x_191 : BST = tree_1[x_189];
+        param = x_191;
+        let x_192 : i32 = *(data_1);
+        param_1 = x_192;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param), &(param_1));
+        let x_194 : BST = param;
+        tree_1[x_189] = x_194;
+        return;
+      } else {
+        let x_196 : i32 = baseIndex;
+        let x_198 : i32 = tree_1[x_196].leftIndex;
+        baseIndex = x_198;
+        continue;
+      }
+      return;
+    } else {
+      let x_199 : i32 = baseIndex;
+      let x_201 : i32 = tree_1[x_199].rightIndex;
+      if ((x_201 == -1)) {
+        let x_206 : i32 = baseIndex;
+        let x_207 : i32 = *(treeIndex);
+        tree_1[x_206].rightIndex = x_207;
+        let x_209 : i32 = *(treeIndex);
+        let x_211 : BST = tree_1[x_209];
+        param_2 = x_211;
+        let x_212 : i32 = *(data_1);
+        param_3 = x_212;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_2), &(param_3));
+        let x_214 : BST = param_2;
+        tree_1[x_209] = x_214;
+        return;
+      } else {
+        let x_216 : i32 = baseIndex;
+        let x_218 : i32 = tree_1[x_216].rightIndex;
+        baseIndex = x_218;
+        continue;
+      }
+      return;
+    }
+    return;
+  }
+  return;
+}
+
+fn search_i1_(target : ptr<function, i32>) -> i32 {
+  var index : i32;
+  var currentNode : BST;
+  var x_220 : i32;
+  index = 0;
+  loop {
+    let x_225 : i32 = index;
+    if ((x_225 != -1)) {
+    } else {
+      break;
+    }
+    let x_228 : i32 = index;
+    let x_230 : BST = tree_1[x_228];
+    currentNode = x_230;
+    let x_232 : i32 = currentNode.data;
+    let x_233 : i32 = *(target);
+    if ((x_232 == x_233)) {
+      let x_237 : i32 = *(target);
+      return x_237;
+    }
+    let x_238 : i32 = *(target);
+    let x_240 : i32 = currentNode.data;
+    if ((x_238 > x_240)) {
+      let x_246 : i32 = currentNode.rightIndex;
+      x_220 = x_246;
+    } else {
+      let x_248 : i32 = currentNode.leftIndex;
+      x_220 = x_248;
+    }
+    let x_249 : i32 = x_220;
+    index = x_249;
+  }
+  return -1;
+}
+
+fn main_1() {
+  var treeIndex_1 : i32;
+  var param_4 : BST;
+  var param_5 : i32;
+  var param_6 : i32;
+  var param_7 : i32;
+  var param_8 : i32;
+  var param_9 : i32;
+  var param_10 : i32;
+  var param_11 : i32;
+  var param_12 : i32;
+  var param_13 : i32;
+  var param_14 : i32;
+  var param_15 : i32;
+  var param_16 : i32;
+  var param_17 : i32;
+  var param_18 : i32;
+  var param_19 : i32;
+  var param_20 : i32;
+  var param_21 : i32;
+  var param_22 : i32;
+  var param_23 : i32;
+  var count : i32;
+  var i : i32;
+  var result : i32;
+  var param_24 : i32;
+  treeIndex_1 = 0;
+  let x_84 : BST = tree_1[0];
+  param_4 = x_84;
+  param_5 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_4), &(param_5));
+  let x_86 : BST = param_4;
+  tree_1[0] = x_86;
+  let x_88 : i32 = treeIndex_1;
+  treeIndex_1 = (x_88 + 1);
+  let x_90 : i32 = treeIndex_1;
+  param_6 = x_90;
+  param_7 = 5;
+  insert_i1_i1_(&(param_6), &(param_7));
+  let x_92 : i32 = treeIndex_1;
+  treeIndex_1 = (x_92 + 1);
+  let x_94 : i32 = treeIndex_1;
+  param_8 = x_94;
+  param_9 = 12;
+  insert_i1_i1_(&(param_8), &(param_9));
+  let x_96 : i32 = treeIndex_1;
+  treeIndex_1 = (x_96 + 1);
+  let x_98 : i32 = treeIndex_1;
+  param_10 = x_98;
+  param_11 = 15;
+  insert_i1_i1_(&(param_10), &(param_11));
+  let x_100 : i32 = treeIndex_1;
+  treeIndex_1 = (x_100 + 1);
+  let x_102 : i32 = treeIndex_1;
+  param_12 = x_102;
+  param_13 = 7;
+  insert_i1_i1_(&(param_12), &(param_13));
+  let x_104 : i32 = treeIndex_1;
+  treeIndex_1 = (x_104 + 1);
+  let x_106 : i32 = treeIndex_1;
+  param_14 = x_106;
+  param_15 = 8;
+  insert_i1_i1_(&(param_14), &(param_15));
+  let x_108 : i32 = treeIndex_1;
+  treeIndex_1 = (x_108 + 1);
+  let x_110 : i32 = treeIndex_1;
+  param_16 = x_110;
+  param_17 = 2;
+  insert_i1_i1_(&(param_16), &(param_17));
+  let x_112 : i32 = treeIndex_1;
+  treeIndex_1 = (x_112 + 1);
+  let x_114 : i32 = treeIndex_1;
+  param_18 = x_114;
+  param_19 = 6;
+  insert_i1_i1_(&(param_18), &(param_19));
+  let x_116 : i32 = treeIndex_1;
+  treeIndex_1 = (x_116 + 1);
+  let x_118 : i32 = treeIndex_1;
+  param_20 = x_118;
+  param_21 = 17;
+  insert_i1_i1_(&(param_20), &(param_21));
+  let x_120 : i32 = treeIndex_1;
+  treeIndex_1 = (x_120 + 1);
+  let x_122 : i32 = treeIndex_1;
+  param_22 = x_122;
+  param_23 = 13;
+  insert_i1_i1_(&(param_22), &(param_23));
+  count = 0;
+  i = 0;
+  loop {
+    let x_128 : i32 = i;
+    if ((x_128 < 20)) {
+    } else {
+      break;
+    }
+    let x_131 : i32 = i;
+    param_24 = x_131;
+    let x_132 : i32 = search_i1_(&(param_24));
+    result = x_132;
+    let x_133 : i32 = i;
+    switch(x_133) {
+      case 2, 5, 6, 7, 8, 9, 12, 13, 15, 17: {
+        let x_143 : i32 = result;
+        let x_144 : i32 = i;
+        if ((x_143 == x_144)) {
+          let x_148 : i32 = count;
+          count = (x_148 + 1);
+        }
+      }
+      default: {
+        let x_137 : i32 = result;
+        if ((x_137 == -1)) {
+          let x_141 : i32 = count;
+          count = (x_141 + 1);
+        }
+      }
+    }
+
+    continuing {
+      let x_150 : i32 = i;
+      i = (x_150 + 1);
+    }
+  }
+  let x_152 : i32 = count;
+  if ((x_152 == 20)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/0.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/0.wgsl
new file mode 100644
index 0000000..0016d4c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/0.wgsl
@@ -0,0 +1,264 @@
+struct BST {
+  data : i32;
+  leftIndex : i32;
+  rightIndex : i32;
+};
+
+var<private> tree_1 : array<BST, 10>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn makeTreeNode_struct_BST_i1_i1_i11_i1_(tree : ptr<function, BST>, data : ptr<function, i32>) {
+  let x_158 : i32 = *(data);
+  (*(tree)).data = x_158;
+  (*(tree)).leftIndex = -1;
+  (*(tree)).rightIndex = -1;
+  return;
+}
+
+fn insert_i1_i1_(treeIndex : ptr<function, i32>, data_1 : ptr<function, i32>) {
+  var baseIndex : i32;
+  var param : BST;
+  var param_1 : i32;
+  var param_2 : BST;
+  var param_3 : i32;
+  baseIndex = 0;
+  loop {
+    let x_167 : i32 = baseIndex;
+    let x_168 : i32 = *(treeIndex);
+    if ((x_167 <= x_168)) {
+    } else {
+      break;
+    }
+    let x_171 : i32 = *(data_1);
+    let x_172 : i32 = baseIndex;
+    let x_174 : i32 = tree_1[x_172].data;
+    if ((x_171 <= x_174)) {
+      let x_179 : i32 = baseIndex;
+      let x_181 : i32 = tree_1[x_179].leftIndex;
+      if ((x_181 == -1)) {
+        let x_186 : i32 = baseIndex;
+        let x_187 : i32 = *(treeIndex);
+        tree_1[x_186].leftIndex = x_187;
+        let x_189 : i32 = *(treeIndex);
+        let x_191 : BST = tree_1[x_189];
+        param = x_191;
+        let x_192 : i32 = *(data_1);
+        param_1 = x_192;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param), &(param_1));
+        let x_194 : BST = param;
+        tree_1[x_189] = x_194;
+        return;
+      } else {
+        let x_196 : i32 = baseIndex;
+        let x_198 : i32 = tree_1[x_196].leftIndex;
+        baseIndex = x_198;
+        continue;
+      }
+      return;
+    } else {
+      let x_199 : i32 = baseIndex;
+      let x_201 : i32 = tree_1[x_199].rightIndex;
+      if ((x_201 == -1)) {
+        let x_206 : i32 = baseIndex;
+        let x_207 : i32 = *(treeIndex);
+        tree_1[x_206].rightIndex = x_207;
+        let x_209 : i32 = *(treeIndex);
+        let x_211 : BST = tree_1[x_209];
+        param_2 = x_211;
+        let x_212 : i32 = *(data_1);
+        param_3 = x_212;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_2), &(param_3));
+        let x_214 : BST = param_2;
+        tree_1[x_209] = x_214;
+        return;
+      } else {
+        let x_216 : i32 = baseIndex;
+        let x_218 : i32 = tree_1[x_216].rightIndex;
+        baseIndex = x_218;
+        continue;
+      }
+      return;
+    }
+    return;
+  }
+  return;
+}
+
+fn search_i1_(target : ptr<function, i32>) -> i32 {
+  var index : i32;
+  var currentNode : BST;
+  var x_220 : i32;
+  index = 0;
+  loop {
+    let x_225 : i32 = index;
+    if ((x_225 != -1)) {
+    } else {
+      break;
+    }
+    let x_228 : i32 = index;
+    let x_230 : BST = tree_1[x_228];
+    currentNode = x_230;
+    let x_232 : i32 = currentNode.data;
+    let x_233 : i32 = *(target);
+    if ((x_232 == x_233)) {
+      let x_237 : i32 = *(target);
+      return x_237;
+    }
+    let x_238 : i32 = *(target);
+    let x_240 : i32 = currentNode.data;
+    if ((x_238 > x_240)) {
+      let x_246 : i32 = currentNode.rightIndex;
+      x_220 = x_246;
+    } else {
+      let x_248 : i32 = currentNode.leftIndex;
+      x_220 = x_248;
+    }
+    let x_249 : i32 = x_220;
+    index = x_249;
+  }
+  return -1;
+}
+
+fn main_1() {
+  var treeIndex_1 : i32;
+  var param_4 : BST;
+  var param_5 : i32;
+  var param_6 : i32;
+  var param_7 : i32;
+  var param_8 : i32;
+  var param_9 : i32;
+  var param_10 : i32;
+  var param_11 : i32;
+  var param_12 : i32;
+  var param_13 : i32;
+  var param_14 : i32;
+  var param_15 : i32;
+  var param_16 : i32;
+  var param_17 : i32;
+  var param_18 : i32;
+  var param_19 : i32;
+  var param_20 : i32;
+  var param_21 : i32;
+  var param_22 : i32;
+  var param_23 : i32;
+  var count : i32;
+  var i : i32;
+  var result : i32;
+  var param_24 : i32;
+  treeIndex_1 = 0;
+  let x_84 : BST = tree_1[0];
+  param_4 = x_84;
+  param_5 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_4), &(param_5));
+  let x_86 : BST = param_4;
+  tree_1[0] = x_86;
+  let x_88 : i32 = treeIndex_1;
+  treeIndex_1 = (x_88 + 1);
+  let x_90 : i32 = treeIndex_1;
+  param_6 = x_90;
+  param_7 = 5;
+  insert_i1_i1_(&(param_6), &(param_7));
+  let x_92 : i32 = treeIndex_1;
+  treeIndex_1 = (x_92 + 1);
+  let x_94 : i32 = treeIndex_1;
+  param_8 = x_94;
+  param_9 = 12;
+  insert_i1_i1_(&(param_8), &(param_9));
+  let x_96 : i32 = treeIndex_1;
+  treeIndex_1 = (x_96 + 1);
+  let x_98 : i32 = treeIndex_1;
+  param_10 = x_98;
+  param_11 = 15;
+  insert_i1_i1_(&(param_10), &(param_11));
+  let x_100 : i32 = treeIndex_1;
+  treeIndex_1 = (x_100 + 1);
+  let x_102 : i32 = treeIndex_1;
+  param_12 = x_102;
+  param_13 = 7;
+  insert_i1_i1_(&(param_12), &(param_13));
+  let x_104 : i32 = treeIndex_1;
+  treeIndex_1 = (x_104 + 1);
+  let x_106 : i32 = treeIndex_1;
+  param_14 = x_106;
+  param_15 = 8;
+  insert_i1_i1_(&(param_14), &(param_15));
+  let x_108 : i32 = treeIndex_1;
+  treeIndex_1 = (x_108 + 1);
+  let x_110 : i32 = treeIndex_1;
+  param_16 = x_110;
+  param_17 = 2;
+  insert_i1_i1_(&(param_16), &(param_17));
+  let x_112 : i32 = treeIndex_1;
+  treeIndex_1 = (x_112 + 1);
+  let x_114 : i32 = treeIndex_1;
+  param_18 = x_114;
+  param_19 = 6;
+  insert_i1_i1_(&(param_18), &(param_19));
+  let x_116 : i32 = treeIndex_1;
+  treeIndex_1 = (x_116 + 1);
+  let x_118 : i32 = treeIndex_1;
+  param_20 = x_118;
+  param_21 = 17;
+  insert_i1_i1_(&(param_20), &(param_21));
+  let x_120 : i32 = treeIndex_1;
+  treeIndex_1 = (x_120 + 1);
+  let x_122 : i32 = treeIndex_1;
+  param_22 = x_122;
+  param_23 = 13;
+  insert_i1_i1_(&(param_22), &(param_23));
+  count = 0;
+  i = 0;
+  loop {
+    let x_128 : i32 = i;
+    if ((x_128 < 20)) {
+    } else {
+      break;
+    }
+    let x_131 : i32 = i;
+    param_24 = x_131;
+    let x_132 : i32 = search_i1_(&(param_24));
+    result = x_132;
+    let x_133 : i32 = i;
+    switch(x_133) {
+      case 2, 5, 6, 7, 8, 9, 12, 13, 15, 17: {
+        let x_143 : i32 = result;
+        let x_144 : i32 = i;
+        if ((x_143 == x_144)) {
+          let x_148 : i32 = count;
+          count = (x_148 + 1);
+        }
+      }
+      default: {
+        let x_137 : i32 = result;
+        if ((x_137 == -1)) {
+          let x_141 : i32 = count;
+          count = (x_141 + 1);
+        }
+      }
+    }
+
+    continuing {
+      let x_150 : i32 = i;
+      i = (x_150 + 1);
+    }
+  }
+  let x_152 : i32 = count;
+  if ((x_152 == 20)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..bc5fdac
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/0.wgsl.expected.hlsl
@@ -0,0 +1,232 @@
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+
+static BST tree_1[10] = (BST[10])0;
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void makeTreeNode_struct_BST_i1_i1_i11_i1_(inout BST tree, inout int data) {
+  const int x_158 = data;
+  tree.data = x_158;
+  tree.leftIndex = -1;
+  tree.rightIndex = -1;
+  return;
+}
+
+void insert_i1_i1_(inout int treeIndex, inout int data_1) {
+  int baseIndex = 0;
+  BST param = (BST)0;
+  int param_1 = 0;
+  BST param_2 = (BST)0;
+  int param_3 = 0;
+  baseIndex = 0;
+  while (true) {
+    const int x_167 = baseIndex;
+    const int x_168 = treeIndex;
+    if ((x_167 <= x_168)) {
+    } else {
+      break;
+    }
+    const int x_171 = data_1;
+    const int x_174 = tree_1[baseIndex].data;
+    if ((x_171 <= x_174)) {
+      const int x_181 = tree_1[baseIndex].leftIndex;
+      if ((x_181 == -1)) {
+        const int x_186 = baseIndex;
+        const int x_187 = treeIndex;
+        tree_1[x_186].leftIndex = x_187;
+        const int x_189 = treeIndex;
+        const BST x_191 = tree_1[x_189];
+        param = x_191;
+        const int x_192 = data_1;
+        param_1 = x_192;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(param, param_1);
+        tree_1[x_189] = param;
+        return;
+      } else {
+        const int x_198 = tree_1[baseIndex].leftIndex;
+        baseIndex = x_198;
+        continue;
+      }
+      return;
+    } else {
+      const int x_201 = tree_1[baseIndex].rightIndex;
+      if ((x_201 == -1)) {
+        const int x_206 = baseIndex;
+        const int x_207 = treeIndex;
+        tree_1[x_206].rightIndex = x_207;
+        const int x_209 = treeIndex;
+        const BST x_211 = tree_1[x_209];
+        param_2 = x_211;
+        const int x_212 = data_1;
+        param_3 = x_212;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(param_2, param_3);
+        tree_1[x_209] = param_2;
+        return;
+      } else {
+        const int x_218 = tree_1[baseIndex].rightIndex;
+        baseIndex = x_218;
+        continue;
+      }
+      return;
+    }
+    return;
+  }
+  return;
+}
+
+int search_i1_(inout int target) {
+  int index = 0;
+  BST currentNode = (BST)0;
+  int x_220 = 0;
+  index = 0;
+  while (true) {
+    if ((index != -1)) {
+    } else {
+      break;
+    }
+    const BST x_230 = tree_1[index];
+    currentNode = x_230;
+    const int x_232 = currentNode.data;
+    const int x_233 = target;
+    if ((x_232 == x_233)) {
+      const int x_237 = target;
+      return x_237;
+    }
+    const int x_238 = target;
+    const int x_240 = currentNode.data;
+    if ((x_238 > x_240)) {
+      const int x_246 = currentNode.rightIndex;
+      x_220 = x_246;
+    } else {
+      const int x_248 = currentNode.leftIndex;
+      x_220 = x_248;
+    }
+    index = x_220;
+  }
+  return -1;
+}
+
+void main_1() {
+  int treeIndex_1 = 0;
+  BST param_4 = (BST)0;
+  int param_5 = 0;
+  int param_6 = 0;
+  int param_7 = 0;
+  int param_8 = 0;
+  int param_9 = 0;
+  int param_10 = 0;
+  int param_11 = 0;
+  int param_12 = 0;
+  int param_13 = 0;
+  int param_14 = 0;
+  int param_15 = 0;
+  int param_16 = 0;
+  int param_17 = 0;
+  int param_18 = 0;
+  int param_19 = 0;
+  int param_20 = 0;
+  int param_21 = 0;
+  int param_22 = 0;
+  int param_23 = 0;
+  int count = 0;
+  int i = 0;
+  int result = 0;
+  int param_24 = 0;
+  treeIndex_1 = 0;
+  const BST x_84 = tree_1[0];
+  param_4 = x_84;
+  param_5 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(param_4, param_5);
+  tree_1[0] = param_4;
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_6 = treeIndex_1;
+  param_7 = 5;
+  insert_i1_i1_(param_6, param_7);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_8 = treeIndex_1;
+  param_9 = 12;
+  insert_i1_i1_(param_8, param_9);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_10 = treeIndex_1;
+  param_11 = 15;
+  insert_i1_i1_(param_10, param_11);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_12 = treeIndex_1;
+  param_13 = 7;
+  insert_i1_i1_(param_12, param_13);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_14 = treeIndex_1;
+  param_15 = 8;
+  insert_i1_i1_(param_14, param_15);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_16 = treeIndex_1;
+  param_17 = 2;
+  insert_i1_i1_(param_16, param_17);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_18 = treeIndex_1;
+  param_19 = 6;
+  insert_i1_i1_(param_18, param_19);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_20 = treeIndex_1;
+  param_21 = 17;
+  insert_i1_i1_(param_20, param_21);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_22 = treeIndex_1;
+  param_23 = 13;
+  insert_i1_i1_(param_22, param_23);
+  count = 0;
+  i = 0;
+  {
+    for(; (i < 20); i = (i + 1)) {
+      param_24 = i;
+      const int x_132 = search_i1_(param_24);
+      result = x_132;
+      switch(i) {
+        case 2:
+        case 5:
+        case 6:
+        case 7:
+        case 8:
+        case 9:
+        case 12:
+        case 13:
+        case 15:
+        case 17: {
+          if ((result == i)) {
+            count = (count + 1);
+          }
+          break;
+        }
+        default: {
+          if ((result == -1)) {
+            count = (count + 1);
+          }
+          break;
+        }
+      }
+    }
+  }
+  if ((count == 20)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/0.wgsl.expected.msl
new file mode 100644
index 0000000..f509724
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/0.wgsl.expected.msl
@@ -0,0 +1,281 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+struct tint_array_wrapper {
+  BST arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void makeTreeNode_struct_BST_i1_i1_i11_i1_(thread BST* const tree, thread int* const data) {
+  int const x_158 = *(data);
+  (*(tree)).data = x_158;
+  (*(tree)).leftIndex = -1;
+  (*(tree)).rightIndex = -1;
+  return;
+}
+
+void insert_i1_i1_(thread int* const treeIndex, thread int* const data_1, thread tint_array_wrapper* const tint_symbol_4) {
+  int baseIndex = 0;
+  BST param = {};
+  int param_1 = 0;
+  BST param_2 = {};
+  int param_3 = 0;
+  baseIndex = 0;
+  while (true) {
+    int const x_167 = baseIndex;
+    int const x_168 = *(treeIndex);
+    if ((x_167 <= x_168)) {
+    } else {
+      break;
+    }
+    int const x_171 = *(data_1);
+    int const x_172 = baseIndex;
+    int const x_174 = (*(tint_symbol_4)).arr[x_172].data;
+    if ((x_171 <= x_174)) {
+      int const x_179 = baseIndex;
+      int const x_181 = (*(tint_symbol_4)).arr[x_179].leftIndex;
+      if ((x_181 == -1)) {
+        int const x_186 = baseIndex;
+        int const x_187 = *(treeIndex);
+        (*(tint_symbol_4)).arr[x_186].leftIndex = x_187;
+        int const x_189 = *(treeIndex);
+        BST const x_191 = (*(tint_symbol_4)).arr[x_189];
+        param = x_191;
+        int const x_192 = *(data_1);
+        param_1 = x_192;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param), &(param_1));
+        BST const x_194 = param;
+        (*(tint_symbol_4)).arr[x_189] = x_194;
+        return;
+      } else {
+        int const x_196 = baseIndex;
+        int const x_198 = (*(tint_symbol_4)).arr[x_196].leftIndex;
+        baseIndex = x_198;
+        continue;
+      }
+      return;
+    } else {
+      int const x_199 = baseIndex;
+      int const x_201 = (*(tint_symbol_4)).arr[x_199].rightIndex;
+      if ((x_201 == -1)) {
+        int const x_206 = baseIndex;
+        int const x_207 = *(treeIndex);
+        (*(tint_symbol_4)).arr[x_206].rightIndex = x_207;
+        int const x_209 = *(treeIndex);
+        BST const x_211 = (*(tint_symbol_4)).arr[x_209];
+        param_2 = x_211;
+        int const x_212 = *(data_1);
+        param_3 = x_212;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_2), &(param_3));
+        BST const x_214 = param_2;
+        (*(tint_symbol_4)).arr[x_209] = x_214;
+        return;
+      } else {
+        int const x_216 = baseIndex;
+        int const x_218 = (*(tint_symbol_4)).arr[x_216].rightIndex;
+        baseIndex = x_218;
+        continue;
+      }
+      return;
+    }
+    return;
+  }
+  return;
+}
+
+int search_i1_(thread int* const target, thread tint_array_wrapper* const tint_symbol_5) {
+  int index = 0;
+  BST currentNode = {};
+  int x_220 = 0;
+  index = 0;
+  while (true) {
+    int const x_225 = index;
+    if ((x_225 != -1)) {
+    } else {
+      break;
+    }
+    int const x_228 = index;
+    BST const x_230 = (*(tint_symbol_5)).arr[x_228];
+    currentNode = x_230;
+    int const x_232 = currentNode.data;
+    int const x_233 = *(target);
+    if ((x_232 == x_233)) {
+      int const x_237 = *(target);
+      return x_237;
+    }
+    int const x_238 = *(target);
+    int const x_240 = currentNode.data;
+    if ((x_238 > x_240)) {
+      int const x_246 = currentNode.rightIndex;
+      x_220 = x_246;
+    } else {
+      int const x_248 = currentNode.leftIndex;
+      x_220 = x_248;
+    }
+    int const x_249 = x_220;
+    index = x_249;
+  }
+  return -1;
+}
+
+void main_1(thread tint_array_wrapper* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  int treeIndex_1 = 0;
+  BST param_4 = {};
+  int param_5 = 0;
+  int param_6 = 0;
+  int param_7 = 0;
+  int param_8 = 0;
+  int param_9 = 0;
+  int param_10 = 0;
+  int param_11 = 0;
+  int param_12 = 0;
+  int param_13 = 0;
+  int param_14 = 0;
+  int param_15 = 0;
+  int param_16 = 0;
+  int param_17 = 0;
+  int param_18 = 0;
+  int param_19 = 0;
+  int param_20 = 0;
+  int param_21 = 0;
+  int param_22 = 0;
+  int param_23 = 0;
+  int count = 0;
+  int i = 0;
+  int result = 0;
+  int param_24 = 0;
+  treeIndex_1 = 0;
+  BST const x_84 = (*(tint_symbol_6)).arr[0];
+  param_4 = x_84;
+  param_5 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_4), &(param_5));
+  BST const x_86 = param_4;
+  (*(tint_symbol_6)).arr[0] = x_86;
+  int const x_88 = treeIndex_1;
+  treeIndex_1 = (x_88 + 1);
+  int const x_90 = treeIndex_1;
+  param_6 = x_90;
+  param_7 = 5;
+  insert_i1_i1_(&(param_6), &(param_7), tint_symbol_6);
+  int const x_92 = treeIndex_1;
+  treeIndex_1 = (x_92 + 1);
+  int const x_94 = treeIndex_1;
+  param_8 = x_94;
+  param_9 = 12;
+  insert_i1_i1_(&(param_8), &(param_9), tint_symbol_6);
+  int const x_96 = treeIndex_1;
+  treeIndex_1 = (x_96 + 1);
+  int const x_98 = treeIndex_1;
+  param_10 = x_98;
+  param_11 = 15;
+  insert_i1_i1_(&(param_10), &(param_11), tint_symbol_6);
+  int const x_100 = treeIndex_1;
+  treeIndex_1 = (x_100 + 1);
+  int const x_102 = treeIndex_1;
+  param_12 = x_102;
+  param_13 = 7;
+  insert_i1_i1_(&(param_12), &(param_13), tint_symbol_6);
+  int const x_104 = treeIndex_1;
+  treeIndex_1 = (x_104 + 1);
+  int const x_106 = treeIndex_1;
+  param_14 = x_106;
+  param_15 = 8;
+  insert_i1_i1_(&(param_14), &(param_15), tint_symbol_6);
+  int const x_108 = treeIndex_1;
+  treeIndex_1 = (x_108 + 1);
+  int const x_110 = treeIndex_1;
+  param_16 = x_110;
+  param_17 = 2;
+  insert_i1_i1_(&(param_16), &(param_17), tint_symbol_6);
+  int const x_112 = treeIndex_1;
+  treeIndex_1 = (x_112 + 1);
+  int const x_114 = treeIndex_1;
+  param_18 = x_114;
+  param_19 = 6;
+  insert_i1_i1_(&(param_18), &(param_19), tint_symbol_6);
+  int const x_116 = treeIndex_1;
+  treeIndex_1 = (x_116 + 1);
+  int const x_118 = treeIndex_1;
+  param_20 = x_118;
+  param_21 = 17;
+  insert_i1_i1_(&(param_20), &(param_21), tint_symbol_6);
+  int const x_120 = treeIndex_1;
+  treeIndex_1 = (x_120 + 1);
+  int const x_122 = treeIndex_1;
+  param_22 = x_122;
+  param_23 = 13;
+  insert_i1_i1_(&(param_22), &(param_23), tint_symbol_6);
+  count = 0;
+  i = 0;
+  while (true) {
+    int const x_128 = i;
+    if ((x_128 < 20)) {
+    } else {
+      break;
+    }
+    int const x_131 = i;
+    param_24 = x_131;
+    int const x_132 = search_i1_(&(param_24), tint_symbol_6);
+    result = x_132;
+    int const x_133 = i;
+    switch(x_133) {
+      case 2:
+      case 5:
+      case 6:
+      case 7:
+      case 8:
+      case 9:
+      case 12:
+      case 13:
+      case 15:
+      case 17: {
+        int const x_143 = result;
+        int const x_144 = i;
+        if ((x_143 == x_144)) {
+          int const x_148 = count;
+          count = (x_148 + 1);
+        }
+        break;
+      }
+      default: {
+        int const x_137 = result;
+        if ((x_137 == -1)) {
+          int const x_141 = count;
+          count = (x_141 + 1);
+        }
+        break;
+      }
+    }
+    {
+      int const x_150 = i;
+      i = (x_150 + 1);
+    }
+  }
+  int const x_152 = count;
+  if ((x_152 == 20)) {
+    *(tint_symbol_7) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_7) = float4(0.0f, 0.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread tint_array_wrapper tint_symbol_8 = {};
+  thread float4 tint_symbol_9 = 0.0f;
+  main_1(&(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..3d85c3b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/0.wgsl.expected.spvasm
@@ -0,0 +1,476 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 316
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %BST "BST"
+               OpMemberName %BST 0 "data"
+               OpMemberName %BST 1 "leftIndex"
+               OpMemberName %BST 2 "rightIndex"
+               OpName %tree_1 "tree_1"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %makeTreeNode_struct_BST_i1_i1_i11_i1_ "makeTreeNode_struct_BST_i1_i1_i11_i1_"
+               OpName %tree "tree"
+               OpName %data "data"
+               OpName %insert_i1_i1_ "insert_i1_i1_"
+               OpName %treeIndex "treeIndex"
+               OpName %data_1 "data_1"
+               OpName %baseIndex "baseIndex"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %search_i1_ "search_i1_"
+               OpName %target "target"
+               OpName %index "index"
+               OpName %currentNode "currentNode"
+               OpName %x_220 "x_220"
+               OpName %main_1 "main_1"
+               OpName %treeIndex_1 "treeIndex_1"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpName %param_6 "param_6"
+               OpName %param_7 "param_7"
+               OpName %param_8 "param_8"
+               OpName %param_9 "param_9"
+               OpName %param_10 "param_10"
+               OpName %param_11 "param_11"
+               OpName %param_12 "param_12"
+               OpName %param_13 "param_13"
+               OpName %param_14 "param_14"
+               OpName %param_15 "param_15"
+               OpName %param_16 "param_16"
+               OpName %param_17 "param_17"
+               OpName %param_18 "param_18"
+               OpName %param_19 "param_19"
+               OpName %param_20 "param_20"
+               OpName %param_21 "param_21"
+               OpName %param_22 "param_22"
+               OpName %param_23 "param_23"
+               OpName %count "count"
+               OpName %i "i"
+               OpName %result "result"
+               OpName %param_24 "param_24"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpMemberDecorate %BST 0 Offset 0
+               OpMemberDecorate %BST 1 Offset 4
+               OpMemberDecorate %BST 2 Offset 8
+               OpDecorate %_arr_BST_uint_10 ArrayStride 12
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+        %BST = OpTypeStruct %int %int %int
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_BST_uint_10 = OpTypeArray %BST %uint_10
+%_ptr_Private__arr_BST_uint_10 = OpTypePointer Private %_arr_BST_uint_10
+          %8 = OpConstantNull %_arr_BST_uint_10
+     %tree_1 = OpVariable %_ptr_Private__arr_BST_uint_10 Private %8
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %13 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %13
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %13
+       %void = OpTypeVoid
+%_ptr_Function_BST = OpTypePointer Function %BST
+%_ptr_Function_int = OpTypePointer Function %int
+         %16 = OpTypeFunction %void %_ptr_Function_BST %_ptr_Function_int
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+     %int_n1 = OpConstant %int -1
+     %uint_2 = OpConstant %uint 2
+         %36 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+         %42 = OpConstantNull %int
+         %44 = OpConstantNull %BST
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+%_ptr_Private_int = OpTypePointer Private %int
+%_ptr_Private_BST = OpTypePointer Private %BST
+        %122 = OpTypeFunction %int %_ptr_Function_int
+        %163 = OpTypeFunction %void
+      %int_9 = OpConstant %int 9
+      %int_1 = OpConstant %int 1
+      %int_5 = OpConstant %int 5
+     %int_12 = OpConstant %int 12
+     %int_15 = OpConstant %int 15
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+      %int_2 = OpConstant %int 2
+      %int_6 = OpConstant %int 6
+     %int_17 = OpConstant %int 17
+     %int_13 = OpConstant %int 13
+     %int_20 = OpConstant %int 20
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+        %302 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %303 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+        %304 = OpTypeFunction %void %main_out
+%makeTreeNode_struct_BST_i1_i1_i11_i1_ = OpFunction %void None %16
+       %tree = OpFunctionParameter %_ptr_Function_BST
+       %data = OpFunctionParameter %_ptr_Function_int
+         %23 = OpLabel
+         %25 = OpLoad %int %data
+         %28 = OpAccessChain %_ptr_Function_int %tree %uint_0
+               OpStore %28 %25
+         %31 = OpAccessChain %_ptr_Function_int %tree %uint_1
+               OpStore %31 %int_n1
+         %35 = OpAccessChain %_ptr_Function_int %tree %uint_2
+               OpStore %35 %int_n1
+               OpReturn
+               OpFunctionEnd
+%insert_i1_i1_ = OpFunction %void None %36
+  %treeIndex = OpFunctionParameter %_ptr_Function_int
+     %data_1 = OpFunctionParameter %_ptr_Function_int
+         %40 = OpLabel
+  %baseIndex = OpVariable %_ptr_Function_int Function %42
+      %param = OpVariable %_ptr_Function_BST Function %44
+    %param_1 = OpVariable %_ptr_Function_int Function %42
+    %param_2 = OpVariable %_ptr_Function_BST Function %44
+    %param_3 = OpVariable %_ptr_Function_int Function %42
+               OpStore %baseIndex %int_0
+               OpBranch %49
+         %49 = OpLabel
+               OpLoopMerge %50 %51 None
+               OpBranch %52
+         %52 = OpLabel
+         %53 = OpLoad %int %baseIndex
+         %55 = OpLoad %int %treeIndex
+         %56 = OpSLessThanEqual %bool %53 %55
+               OpSelectionMerge %58 None
+               OpBranchConditional %56 %59 %60
+         %59 = OpLabel
+               OpBranch %58
+         %60 = OpLabel
+               OpBranch %50
+         %58 = OpLabel
+         %62 = OpLoad %int %data_1
+         %63 = OpLoad %int %baseIndex
+         %65 = OpAccessChain %_ptr_Private_int %tree_1 %63 %uint_0
+         %66 = OpLoad %int %65
+         %67 = OpSLessThanEqual %bool %62 %66
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %70
+         %69 = OpLabel
+         %71 = OpLoad %int %baseIndex
+         %72 = OpAccessChain %_ptr_Private_int %tree_1 %71 %uint_1
+         %73 = OpLoad %int %72
+         %74 = OpIEqual %bool %73 %int_n1
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %77
+         %76 = OpLabel
+         %78 = OpLoad %int %baseIndex
+         %80 = OpLoad %int %treeIndex
+         %81 = OpAccessChain %_ptr_Private_int %tree_1 %78 %uint_1
+               OpStore %81 %80
+         %83 = OpLoad %int %treeIndex
+         %85 = OpAccessChain %_ptr_Private_BST %tree_1 %83
+         %86 = OpLoad %BST %85
+               OpStore %param %86
+         %88 = OpLoad %int %data_1
+               OpStore %param_1 %88
+         %89 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param %param_1
+         %92 = OpLoad %BST %param
+         %93 = OpAccessChain %_ptr_Private_BST %tree_1 %83
+               OpStore %93 %92
+               OpReturn
+         %77 = OpLabel
+         %94 = OpLoad %int %baseIndex
+         %95 = OpAccessChain %_ptr_Private_int %tree_1 %94 %uint_1
+         %96 = OpLoad %int %95
+               OpStore %baseIndex %96
+               OpBranch %51
+         %75 = OpLabel
+               OpReturn
+         %70 = OpLabel
+         %97 = OpLoad %int %baseIndex
+         %98 = OpAccessChain %_ptr_Private_int %tree_1 %97 %uint_2
+         %99 = OpLoad %int %98
+        %100 = OpIEqual %bool %99 %int_n1
+               OpSelectionMerge %101 None
+               OpBranchConditional %100 %102 %103
+        %102 = OpLabel
+        %104 = OpLoad %int %baseIndex
+        %106 = OpLoad %int %treeIndex
+        %107 = OpAccessChain %_ptr_Private_int %tree_1 %104 %uint_2
+               OpStore %107 %106
+        %109 = OpLoad %int %treeIndex
+        %110 = OpAccessChain %_ptr_Private_BST %tree_1 %109
+        %111 = OpLoad %BST %110
+               OpStore %param_2 %111
+        %113 = OpLoad %int %data_1
+               OpStore %param_3 %113
+        %114 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param_2 %param_3
+        %117 = OpLoad %BST %param_2
+        %118 = OpAccessChain %_ptr_Private_BST %tree_1 %109
+               OpStore %118 %117
+               OpReturn
+        %103 = OpLabel
+        %119 = OpLoad %int %baseIndex
+        %120 = OpAccessChain %_ptr_Private_int %tree_1 %119 %uint_2
+        %121 = OpLoad %int %120
+               OpStore %baseIndex %121
+               OpBranch %51
+        %101 = OpLabel
+               OpReturn
+         %68 = OpLabel
+               OpReturn
+         %51 = OpLabel
+               OpBranch %49
+         %50 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %search_i1_ = OpFunction %int None %122
+     %target = OpFunctionParameter %_ptr_Function_int
+        %125 = OpLabel
+      %index = OpVariable %_ptr_Function_int Function %42
+%currentNode = OpVariable %_ptr_Function_BST Function %44
+      %x_220 = OpVariable %_ptr_Function_int Function %42
+               OpStore %index %int_0
+               OpBranch %129
+        %129 = OpLabel
+               OpLoopMerge %130 %131 None
+               OpBranch %132
+        %132 = OpLabel
+        %133 = OpLoad %int %index
+        %134 = OpINotEqual %bool %133 %int_n1
+               OpSelectionMerge %135 None
+               OpBranchConditional %134 %136 %137
+        %136 = OpLabel
+               OpBranch %135
+        %137 = OpLabel
+               OpBranch %130
+        %135 = OpLabel
+        %138 = OpLoad %int %index
+        %139 = OpAccessChain %_ptr_Private_BST %tree_1 %138
+        %140 = OpLoad %BST %139
+               OpStore %currentNode %140
+        %141 = OpAccessChain %_ptr_Function_int %currentNode %uint_0
+        %142 = OpLoad %int %141
+        %144 = OpLoad %int %target
+        %145 = OpIEqual %bool %142 %144
+               OpSelectionMerge %146 None
+               OpBranchConditional %145 %147 %146
+        %147 = OpLabel
+        %149 = OpLoad %int %target
+               OpReturnValue %149
+        %146 = OpLabel
+        %151 = OpLoad %int %target
+        %152 = OpAccessChain %_ptr_Function_int %currentNode %uint_0
+        %153 = OpLoad %int %152
+        %154 = OpSGreaterThan %bool %151 %153
+               OpSelectionMerge %155 None
+               OpBranchConditional %154 %156 %157
+        %156 = OpLabel
+        %158 = OpAccessChain %_ptr_Function_int %currentNode %uint_2
+        %159 = OpLoad %int %158
+               OpStore %x_220 %159
+               OpBranch %155
+        %157 = OpLabel
+        %160 = OpAccessChain %_ptr_Function_int %currentNode %uint_1
+        %161 = OpLoad %int %160
+               OpStore %x_220 %161
+               OpBranch %155
+        %155 = OpLabel
+        %162 = OpLoad %int %x_220
+               OpStore %index %162
+               OpBranch %131
+        %131 = OpLabel
+               OpBranch %129
+        %130 = OpLabel
+               OpReturnValue %int_n1
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %163
+        %165 = OpLabel
+%treeIndex_1 = OpVariable %_ptr_Function_int Function %42
+    %param_4 = OpVariable %_ptr_Function_BST Function %44
+    %param_5 = OpVariable %_ptr_Function_int Function %42
+    %param_6 = OpVariable %_ptr_Function_int Function %42
+    %param_7 = OpVariable %_ptr_Function_int Function %42
+    %param_8 = OpVariable %_ptr_Function_int Function %42
+    %param_9 = OpVariable %_ptr_Function_int Function %42
+   %param_10 = OpVariable %_ptr_Function_int Function %42
+   %param_11 = OpVariable %_ptr_Function_int Function %42
+   %param_12 = OpVariable %_ptr_Function_int Function %42
+   %param_13 = OpVariable %_ptr_Function_int Function %42
+   %param_14 = OpVariable %_ptr_Function_int Function %42
+   %param_15 = OpVariable %_ptr_Function_int Function %42
+   %param_16 = OpVariable %_ptr_Function_int Function %42
+   %param_17 = OpVariable %_ptr_Function_int Function %42
+   %param_18 = OpVariable %_ptr_Function_int Function %42
+   %param_19 = OpVariable %_ptr_Function_int Function %42
+   %param_20 = OpVariable %_ptr_Function_int Function %42
+   %param_21 = OpVariable %_ptr_Function_int Function %42
+   %param_22 = OpVariable %_ptr_Function_int Function %42
+   %param_23 = OpVariable %_ptr_Function_int Function %42
+      %count = OpVariable %_ptr_Function_int Function %42
+          %i = OpVariable %_ptr_Function_int Function %42
+     %result = OpVariable %_ptr_Function_int Function %42
+   %param_24 = OpVariable %_ptr_Function_int Function %42
+               OpStore %treeIndex_1 %int_0
+        %191 = OpAccessChain %_ptr_Private_BST %tree_1 %int_0
+        %192 = OpLoad %BST %191
+               OpStore %param_4 %192
+               OpStore %param_5 %int_9
+        %194 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param_4 %param_5
+        %197 = OpLoad %BST %param_4
+        %198 = OpAccessChain %_ptr_Private_BST %tree_1 %int_0
+               OpStore %198 %197
+        %199 = OpLoad %int %treeIndex_1
+        %201 = OpIAdd %int %199 %int_1
+               OpStore %treeIndex_1 %201
+        %202 = OpLoad %int %treeIndex_1
+               OpStore %param_6 %202
+               OpStore %param_7 %int_5
+        %204 = OpFunctionCall %void %insert_i1_i1_ %param_6 %param_7
+        %207 = OpLoad %int %treeIndex_1
+        %208 = OpIAdd %int %207 %int_1
+               OpStore %treeIndex_1 %208
+        %209 = OpLoad %int %treeIndex_1
+               OpStore %param_8 %209
+               OpStore %param_9 %int_12
+        %211 = OpFunctionCall %void %insert_i1_i1_ %param_8 %param_9
+        %214 = OpLoad %int %treeIndex_1
+        %215 = OpIAdd %int %214 %int_1
+               OpStore %treeIndex_1 %215
+        %216 = OpLoad %int %treeIndex_1
+               OpStore %param_10 %216
+               OpStore %param_11 %int_15
+        %218 = OpFunctionCall %void %insert_i1_i1_ %param_10 %param_11
+        %221 = OpLoad %int %treeIndex_1
+        %222 = OpIAdd %int %221 %int_1
+               OpStore %treeIndex_1 %222
+        %223 = OpLoad %int %treeIndex_1
+               OpStore %param_12 %223
+               OpStore %param_13 %int_7
+        %225 = OpFunctionCall %void %insert_i1_i1_ %param_12 %param_13
+        %228 = OpLoad %int %treeIndex_1
+        %229 = OpIAdd %int %228 %int_1
+               OpStore %treeIndex_1 %229
+        %230 = OpLoad %int %treeIndex_1
+               OpStore %param_14 %230
+               OpStore %param_15 %int_8
+        %232 = OpFunctionCall %void %insert_i1_i1_ %param_14 %param_15
+        %235 = OpLoad %int %treeIndex_1
+        %236 = OpIAdd %int %235 %int_1
+               OpStore %treeIndex_1 %236
+        %237 = OpLoad %int %treeIndex_1
+               OpStore %param_16 %237
+               OpStore %param_17 %int_2
+        %239 = OpFunctionCall %void %insert_i1_i1_ %param_16 %param_17
+        %242 = OpLoad %int %treeIndex_1
+        %243 = OpIAdd %int %242 %int_1
+               OpStore %treeIndex_1 %243
+        %244 = OpLoad %int %treeIndex_1
+               OpStore %param_18 %244
+               OpStore %param_19 %int_6
+        %246 = OpFunctionCall %void %insert_i1_i1_ %param_18 %param_19
+        %249 = OpLoad %int %treeIndex_1
+        %250 = OpIAdd %int %249 %int_1
+               OpStore %treeIndex_1 %250
+        %251 = OpLoad %int %treeIndex_1
+               OpStore %param_20 %251
+               OpStore %param_21 %int_17
+        %253 = OpFunctionCall %void %insert_i1_i1_ %param_20 %param_21
+        %256 = OpLoad %int %treeIndex_1
+        %257 = OpIAdd %int %256 %int_1
+               OpStore %treeIndex_1 %257
+        %258 = OpLoad %int %treeIndex_1
+               OpStore %param_22 %258
+               OpStore %param_23 %int_13
+        %260 = OpFunctionCall %void %insert_i1_i1_ %param_22 %param_23
+               OpStore %count %int_0
+               OpStore %i %int_0
+               OpBranch %263
+        %263 = OpLabel
+               OpLoopMerge %264 %265 None
+               OpBranch %266
+        %266 = OpLabel
+        %267 = OpLoad %int %i
+        %269 = OpSLessThan %bool %267 %int_20
+               OpSelectionMerge %270 None
+               OpBranchConditional %269 %271 %272
+        %271 = OpLabel
+               OpBranch %270
+        %272 = OpLabel
+               OpBranch %264
+        %270 = OpLabel
+        %273 = OpLoad %int %i
+               OpStore %param_24 %273
+        %274 = OpFunctionCall %int %search_i1_ %param_24
+               OpStore %result %274
+        %276 = OpLoad %int %i
+               OpSelectionMerge %277 None
+               OpSwitch %276 %278 2 %279 5 %279 6 %279 7 %279 8 %279 9 %279 12 %279 13 %279 15 %279 17 %279
+        %279 = OpLabel
+        %280 = OpLoad %int %result
+        %281 = OpLoad %int %i
+        %282 = OpIEqual %bool %280 %281
+               OpSelectionMerge %283 None
+               OpBranchConditional %282 %284 %283
+        %284 = OpLabel
+        %285 = OpLoad %int %count
+        %286 = OpIAdd %int %285 %int_1
+               OpStore %count %286
+               OpBranch %283
+        %283 = OpLabel
+               OpBranch %277
+        %278 = OpLabel
+        %287 = OpLoad %int %result
+        %288 = OpIEqual %bool %287 %int_n1
+               OpSelectionMerge %289 None
+               OpBranchConditional %288 %290 %289
+        %290 = OpLabel
+        %291 = OpLoad %int %count
+        %292 = OpIAdd %int %291 %int_1
+               OpStore %count %292
+               OpBranch %289
+        %289 = OpLabel
+               OpBranch %277
+        %277 = OpLabel
+               OpBranch %265
+        %265 = OpLabel
+        %293 = OpLoad %int %i
+        %294 = OpIAdd %int %293 %int_1
+               OpStore %i %294
+               OpBranch %263
+        %264 = OpLabel
+        %295 = OpLoad %int %count
+        %296 = OpIEqual %bool %295 %int_20
+               OpSelectionMerge %297 None
+               OpBranchConditional %296 %298 %299
+        %298 = OpLabel
+               OpStore %x_GLF_color %302
+               OpBranch %297
+        %299 = OpLabel
+               OpStore %x_GLF_color %303
+               OpBranch %297
+        %297 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %304
+%tint_symbol = OpFunctionParameter %main_out
+        %308 = OpLabel
+        %309 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %309
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %163
+        %311 = OpLabel
+        %312 = OpFunctionCall %void %main_1
+        %314 = OpLoad %v4float %x_GLF_color
+        %315 = OpCompositeConstruct %main_out %314
+        %313 = OpFunctionCall %void %tint_symbol_2 %315
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..0016d4c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/0.wgsl.expected.wgsl
@@ -0,0 +1,264 @@
+struct BST {
+  data : i32;
+  leftIndex : i32;
+  rightIndex : i32;
+};
+
+var<private> tree_1 : array<BST, 10>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn makeTreeNode_struct_BST_i1_i1_i11_i1_(tree : ptr<function, BST>, data : ptr<function, i32>) {
+  let x_158 : i32 = *(data);
+  (*(tree)).data = x_158;
+  (*(tree)).leftIndex = -1;
+  (*(tree)).rightIndex = -1;
+  return;
+}
+
+fn insert_i1_i1_(treeIndex : ptr<function, i32>, data_1 : ptr<function, i32>) {
+  var baseIndex : i32;
+  var param : BST;
+  var param_1 : i32;
+  var param_2 : BST;
+  var param_3 : i32;
+  baseIndex = 0;
+  loop {
+    let x_167 : i32 = baseIndex;
+    let x_168 : i32 = *(treeIndex);
+    if ((x_167 <= x_168)) {
+    } else {
+      break;
+    }
+    let x_171 : i32 = *(data_1);
+    let x_172 : i32 = baseIndex;
+    let x_174 : i32 = tree_1[x_172].data;
+    if ((x_171 <= x_174)) {
+      let x_179 : i32 = baseIndex;
+      let x_181 : i32 = tree_1[x_179].leftIndex;
+      if ((x_181 == -1)) {
+        let x_186 : i32 = baseIndex;
+        let x_187 : i32 = *(treeIndex);
+        tree_1[x_186].leftIndex = x_187;
+        let x_189 : i32 = *(treeIndex);
+        let x_191 : BST = tree_1[x_189];
+        param = x_191;
+        let x_192 : i32 = *(data_1);
+        param_1 = x_192;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param), &(param_1));
+        let x_194 : BST = param;
+        tree_1[x_189] = x_194;
+        return;
+      } else {
+        let x_196 : i32 = baseIndex;
+        let x_198 : i32 = tree_1[x_196].leftIndex;
+        baseIndex = x_198;
+        continue;
+      }
+      return;
+    } else {
+      let x_199 : i32 = baseIndex;
+      let x_201 : i32 = tree_1[x_199].rightIndex;
+      if ((x_201 == -1)) {
+        let x_206 : i32 = baseIndex;
+        let x_207 : i32 = *(treeIndex);
+        tree_1[x_206].rightIndex = x_207;
+        let x_209 : i32 = *(treeIndex);
+        let x_211 : BST = tree_1[x_209];
+        param_2 = x_211;
+        let x_212 : i32 = *(data_1);
+        param_3 = x_212;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_2), &(param_3));
+        let x_214 : BST = param_2;
+        tree_1[x_209] = x_214;
+        return;
+      } else {
+        let x_216 : i32 = baseIndex;
+        let x_218 : i32 = tree_1[x_216].rightIndex;
+        baseIndex = x_218;
+        continue;
+      }
+      return;
+    }
+    return;
+  }
+  return;
+}
+
+fn search_i1_(target : ptr<function, i32>) -> i32 {
+  var index : i32;
+  var currentNode : BST;
+  var x_220 : i32;
+  index = 0;
+  loop {
+    let x_225 : i32 = index;
+    if ((x_225 != -1)) {
+    } else {
+      break;
+    }
+    let x_228 : i32 = index;
+    let x_230 : BST = tree_1[x_228];
+    currentNode = x_230;
+    let x_232 : i32 = currentNode.data;
+    let x_233 : i32 = *(target);
+    if ((x_232 == x_233)) {
+      let x_237 : i32 = *(target);
+      return x_237;
+    }
+    let x_238 : i32 = *(target);
+    let x_240 : i32 = currentNode.data;
+    if ((x_238 > x_240)) {
+      let x_246 : i32 = currentNode.rightIndex;
+      x_220 = x_246;
+    } else {
+      let x_248 : i32 = currentNode.leftIndex;
+      x_220 = x_248;
+    }
+    let x_249 : i32 = x_220;
+    index = x_249;
+  }
+  return -1;
+}
+
+fn main_1() {
+  var treeIndex_1 : i32;
+  var param_4 : BST;
+  var param_5 : i32;
+  var param_6 : i32;
+  var param_7 : i32;
+  var param_8 : i32;
+  var param_9 : i32;
+  var param_10 : i32;
+  var param_11 : i32;
+  var param_12 : i32;
+  var param_13 : i32;
+  var param_14 : i32;
+  var param_15 : i32;
+  var param_16 : i32;
+  var param_17 : i32;
+  var param_18 : i32;
+  var param_19 : i32;
+  var param_20 : i32;
+  var param_21 : i32;
+  var param_22 : i32;
+  var param_23 : i32;
+  var count : i32;
+  var i : i32;
+  var result : i32;
+  var param_24 : i32;
+  treeIndex_1 = 0;
+  let x_84 : BST = tree_1[0];
+  param_4 = x_84;
+  param_5 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_4), &(param_5));
+  let x_86 : BST = param_4;
+  tree_1[0] = x_86;
+  let x_88 : i32 = treeIndex_1;
+  treeIndex_1 = (x_88 + 1);
+  let x_90 : i32 = treeIndex_1;
+  param_6 = x_90;
+  param_7 = 5;
+  insert_i1_i1_(&(param_6), &(param_7));
+  let x_92 : i32 = treeIndex_1;
+  treeIndex_1 = (x_92 + 1);
+  let x_94 : i32 = treeIndex_1;
+  param_8 = x_94;
+  param_9 = 12;
+  insert_i1_i1_(&(param_8), &(param_9));
+  let x_96 : i32 = treeIndex_1;
+  treeIndex_1 = (x_96 + 1);
+  let x_98 : i32 = treeIndex_1;
+  param_10 = x_98;
+  param_11 = 15;
+  insert_i1_i1_(&(param_10), &(param_11));
+  let x_100 : i32 = treeIndex_1;
+  treeIndex_1 = (x_100 + 1);
+  let x_102 : i32 = treeIndex_1;
+  param_12 = x_102;
+  param_13 = 7;
+  insert_i1_i1_(&(param_12), &(param_13));
+  let x_104 : i32 = treeIndex_1;
+  treeIndex_1 = (x_104 + 1);
+  let x_106 : i32 = treeIndex_1;
+  param_14 = x_106;
+  param_15 = 8;
+  insert_i1_i1_(&(param_14), &(param_15));
+  let x_108 : i32 = treeIndex_1;
+  treeIndex_1 = (x_108 + 1);
+  let x_110 : i32 = treeIndex_1;
+  param_16 = x_110;
+  param_17 = 2;
+  insert_i1_i1_(&(param_16), &(param_17));
+  let x_112 : i32 = treeIndex_1;
+  treeIndex_1 = (x_112 + 1);
+  let x_114 : i32 = treeIndex_1;
+  param_18 = x_114;
+  param_19 = 6;
+  insert_i1_i1_(&(param_18), &(param_19));
+  let x_116 : i32 = treeIndex_1;
+  treeIndex_1 = (x_116 + 1);
+  let x_118 : i32 = treeIndex_1;
+  param_20 = x_118;
+  param_21 = 17;
+  insert_i1_i1_(&(param_20), &(param_21));
+  let x_120 : i32 = treeIndex_1;
+  treeIndex_1 = (x_120 + 1);
+  let x_122 : i32 = treeIndex_1;
+  param_22 = x_122;
+  param_23 = 13;
+  insert_i1_i1_(&(param_22), &(param_23));
+  count = 0;
+  i = 0;
+  loop {
+    let x_128 : i32 = i;
+    if ((x_128 < 20)) {
+    } else {
+      break;
+    }
+    let x_131 : i32 = i;
+    param_24 = x_131;
+    let x_132 : i32 = search_i1_(&(param_24));
+    result = x_132;
+    let x_133 : i32 = i;
+    switch(x_133) {
+      case 2, 5, 6, 7, 8, 9, 12, 13, 15, 17: {
+        let x_143 : i32 = result;
+        let x_144 : i32 = i;
+        if ((x_143 == x_144)) {
+          let x_148 : i32 = count;
+          count = (x_148 + 1);
+        }
+      }
+      default: {
+        let x_137 : i32 = result;
+        if ((x_137 == -1)) {
+          let x_141 : i32 = count;
+          count = (x_141 + 1);
+        }
+      }
+    }
+
+    continuing {
+      let x_150 : i32 = i;
+      i = (x_150 + 1);
+    }
+  }
+  let x_152 : i32 = count;
+  if ((x_152 == 20)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/1.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/1.spvasm
new file mode 100644
index 0000000..e38765c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/1.spvasm
@@ -0,0 +1,436 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %BST "BST"
+               OpMemberName %BST 0 "data"
+               OpMemberName %BST 1 "leftIndex"
+               OpMemberName %BST 2 "rightIndex"
+               OpName %makeTreeNode_struct_BST_i1_i1_i11_i1_ "makeTreeNode(struct-BST-i1-i1-i11;i1;"
+               OpName %tree "tree"
+               OpName %data "data"
+               OpName %insert_i1_i1_ "insert(i1;i1;"
+               OpName %treeIndex "treeIndex"
+               OpName %data_0 "data"
+               OpName %search_i1_ "search(i1;"
+               OpName %target "target"
+               OpName %baseIndex "baseIndex"
+               OpName %tree_0 "tree"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %param_1 "param"
+               OpName %param_2 "param"
+               OpName %index "index"
+               OpName %currentNode "currentNode"
+               OpName %treeIndex_0 "treeIndex"
+               OpName %param_3 "param"
+               OpName %param_4 "param"
+               OpName %param_5 "param"
+               OpName %param_6 "param"
+               OpName %param_7 "param"
+               OpName %param_8 "param"
+               OpName %param_9 "param"
+               OpName %param_10 "param"
+               OpName %param_11 "param"
+               OpName %param_12 "param"
+               OpName %param_13 "param"
+               OpName %param_14 "param"
+               OpName %param_15 "param"
+               OpName %param_16 "param"
+               OpName %param_17 "param"
+               OpName %param_18 "param"
+               OpName %param_19 "param"
+               OpName %param_20 "param"
+               OpName %param_21 "param"
+               OpName %param_22 "param"
+               OpName %count "count"
+               OpName %i "i"
+               OpName %result "result"
+               OpName %param_23 "param"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %48 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+        %BST = OpTypeStruct %int %int %int
+%_ptr_Function_BST = OpTypePointer Function %BST
+%_ptr_Function_int = OpTypePointer Function %int
+         %52 = OpTypeFunction %void %_ptr_Function_BST %_ptr_Function_int
+         %53 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+         %54 = OpTypeFunction %int %_ptr_Function_int
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+     %int_n1 = OpConstant %int -1
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_BST_uint_10 = OpTypeArray %BST %uint_10
+%_ptr_Private__arr_BST_uint_10 = OpTypePointer Private %_arr_BST_uint_10
+     %tree_0 = OpVariable %_ptr_Private__arr_BST_uint_10 Private
+%_ptr_Private_int = OpTypePointer Private %int
+%_ptr_Private_BST = OpTypePointer Private %BST
+      %int_9 = OpConstant %int 9
+      %int_5 = OpConstant %int 5
+     %int_12 = OpConstant %int 12
+     %int_15 = OpConstant %int 15
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+      %int_6 = OpConstant %int 6
+     %int_17 = OpConstant %int 17
+     %int_13 = OpConstant %int 13
+     %int_20 = OpConstant %int 20
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+         %84 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %85 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+       %main = OpFunction %void None %48
+         %86 = OpLabel
+%treeIndex_0 = OpVariable %_ptr_Function_int Function
+    %param_3 = OpVariable %_ptr_Function_BST Function
+    %param_4 = OpVariable %_ptr_Function_int Function
+    %param_5 = OpVariable %_ptr_Function_int Function
+    %param_6 = OpVariable %_ptr_Function_int Function
+    %param_7 = OpVariable %_ptr_Function_int Function
+    %param_8 = OpVariable %_ptr_Function_int Function
+    %param_9 = OpVariable %_ptr_Function_int Function
+   %param_10 = OpVariable %_ptr_Function_int Function
+   %param_11 = OpVariable %_ptr_Function_int Function
+   %param_12 = OpVariable %_ptr_Function_int Function
+   %param_13 = OpVariable %_ptr_Function_int Function
+   %param_14 = OpVariable %_ptr_Function_int Function
+   %param_15 = OpVariable %_ptr_Function_int Function
+   %param_16 = OpVariable %_ptr_Function_int Function
+   %param_17 = OpVariable %_ptr_Function_int Function
+   %param_18 = OpVariable %_ptr_Function_int Function
+   %param_19 = OpVariable %_ptr_Function_int Function
+   %param_20 = OpVariable %_ptr_Function_int Function
+   %param_21 = OpVariable %_ptr_Function_int Function
+   %param_22 = OpVariable %_ptr_Function_int Function
+      %count = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+     %result = OpVariable %_ptr_Function_int Function
+   %param_23 = OpVariable %_ptr_Function_int Function
+               OpStore %treeIndex_0 %int_0
+         %87 = OpAccessChain %_ptr_Private_BST %tree_0 %int_0
+         %88 = OpLoad %BST %87
+               OpStore %param_3 %88
+               OpStore %param_4 %int_9
+         %89 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param_3 %param_4
+         %90 = OpLoad %BST %param_3
+         %91 = OpAccessChain %_ptr_Private_BST %tree_0 %int_0
+               OpStore %91 %90
+         %92 = OpLoad %int %treeIndex_0
+         %93 = OpIAdd %int %92 %int_1
+               OpStore %treeIndex_0 %93
+         %94 = OpLoad %int %treeIndex_0
+               OpStore %param_5 %94
+               OpStore %param_6 %int_5
+         %95 = OpFunctionCall %void %insert_i1_i1_ %param_5 %param_6
+         %96 = OpLoad %int %treeIndex_0
+         %97 = OpIAdd %int %96 %int_1
+               OpStore %treeIndex_0 %97
+         %98 = OpLoad %int %treeIndex_0
+               OpStore %param_7 %98
+               OpStore %param_8 %int_12
+         %99 = OpFunctionCall %void %insert_i1_i1_ %param_7 %param_8
+        %100 = OpLoad %int %treeIndex_0
+        %101 = OpIAdd %int %100 %int_1
+               OpStore %treeIndex_0 %101
+        %102 = OpLoad %int %treeIndex_0
+               OpStore %param_9 %102
+               OpStore %param_10 %int_15
+        %103 = OpFunctionCall %void %insert_i1_i1_ %param_9 %param_10
+        %104 = OpLoad %int %treeIndex_0
+        %105 = OpIAdd %int %104 %int_1
+               OpStore %treeIndex_0 %105
+        %106 = OpLoad %int %treeIndex_0
+               OpStore %param_11 %106
+               OpStore %param_12 %int_7
+        %107 = OpFunctionCall %void %insert_i1_i1_ %param_11 %param_12
+        %108 = OpLoad %int %treeIndex_0
+        %109 = OpIAdd %int %108 %int_1
+               OpStore %treeIndex_0 %109
+        %110 = OpLoad %int %treeIndex_0
+               OpStore %param_13 %110
+               OpStore %param_14 %int_8
+        %111 = OpFunctionCall %void %insert_i1_i1_ %param_13 %param_14
+        %112 = OpLoad %int %treeIndex_0
+        %113 = OpIAdd %int %112 %int_1
+               OpStore %treeIndex_0 %113
+        %114 = OpLoad %int %treeIndex_0
+               OpStore %param_15 %114
+               OpStore %param_16 %int_2
+        %115 = OpFunctionCall %void %insert_i1_i1_ %param_15 %param_16
+        %116 = OpLoad %int %treeIndex_0
+        %117 = OpIAdd %int %116 %int_1
+               OpStore %treeIndex_0 %117
+        %118 = OpLoad %int %treeIndex_0
+               OpStore %param_17 %118
+               OpStore %param_18 %int_6
+        %119 = OpFunctionCall %void %insert_i1_i1_ %param_17 %param_18
+        %120 = OpLoad %int %treeIndex_0
+        %121 = OpIAdd %int %120 %int_1
+               OpStore %treeIndex_0 %121
+        %122 = OpLoad %int %treeIndex_0
+               OpStore %param_19 %122
+               OpStore %param_20 %int_17
+        %123 = OpFunctionCall %void %insert_i1_i1_ %param_19 %param_20
+        %124 = OpLoad %int %treeIndex_0
+        %125 = OpIAdd %int %124 %int_1
+               OpStore %treeIndex_0 %125
+        %126 = OpLoad %int %treeIndex_0
+               OpStore %param_21 %126
+               OpStore %param_22 %int_13
+        %127 = OpFunctionCall %void %insert_i1_i1_ %param_21 %param_22
+               OpStore %count %int_0
+               OpStore %i %int_0
+               OpBranch %128
+        %128 = OpLabel
+               OpLoopMerge %129 %130 None
+               OpBranch %131
+        %131 = OpLabel
+        %132 = OpLoad %int %i
+        %133 = OpSLessThan %bool %132 %int_20
+               OpBranchConditional %133 %134 %129
+        %134 = OpLabel
+        %135 = OpLoad %int %i
+               OpStore %param_23 %135
+        %136 = OpFunctionCall %int %search_i1_ %param_23
+               OpStore %result %136
+        %137 = OpLoad %int %i
+               OpSelectionMerge %138 None
+               OpSwitch %137 %139 9 %140 5 %140 12 %140 15 %140 7 %140 8 %140 2 %140 6 %140 17 %140 13 %140
+        %139 = OpLabel
+        %141 = OpLoad %int %result
+        %142 = OpIEqual %bool %141 %int_n1
+               OpSelectionMerge %143 None
+               OpBranchConditional %142 %144 %143
+        %144 = OpLabel
+        %145 = OpLoad %int %count
+        %146 = OpIAdd %int %145 %int_1
+               OpStore %count %146
+               OpBranch %143
+        %143 = OpLabel
+               OpBranch %138
+        %140 = OpLabel
+        %147 = OpLoad %int %result
+        %148 = OpLoad %int %i
+        %149 = OpIEqual %bool %147 %148
+        %150 = OpLogicalNot %bool %149
+               OpSelectionMerge %151 None
+               OpBranchConditional %150 %152 %151
+        %152 = OpLabel
+        %153 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+        %154 = OpLoad %float %153
+        %155 = OpFOrdLessThan %bool %154 %float_0
+               OpBranch %151
+        %151 = OpLabel
+        %156 = OpPhi %bool %149 %140 %155 %152
+               OpSelectionMerge %157 None
+               OpBranchConditional %156 %158 %157
+        %158 = OpLabel
+        %159 = OpLoad %int %count
+        %160 = OpIAdd %int %159 %int_1
+               OpStore %count %160
+               OpBranch %157
+        %157 = OpLabel
+               OpBranch %138
+        %138 = OpLabel
+               OpBranch %130
+        %130 = OpLabel
+        %161 = OpLoad %int %i
+        %162 = OpIAdd %int %161 %int_1
+               OpStore %i %162
+               OpBranch %128
+        %129 = OpLabel
+        %163 = OpLoad %int %count
+        %164 = OpIEqual %bool %163 %int_20
+               OpSelectionMerge %165 None
+               OpBranchConditional %164 %166 %167
+        %166 = OpLabel
+               OpStore %_GLF_color %84
+               OpBranch %165
+        %167 = OpLabel
+               OpStore %_GLF_color %85
+               OpBranch %165
+        %165 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%makeTreeNode_struct_BST_i1_i1_i11_i1_ = OpFunction %void None %52
+       %tree = OpFunctionParameter %_ptr_Function_BST
+       %data = OpFunctionParameter %_ptr_Function_int
+        %168 = OpLabel
+        %169 = OpLoad %int %data
+        %170 = OpAccessChain %_ptr_Function_int %tree %int_0
+               OpStore %170 %169
+        %171 = OpAccessChain %_ptr_Function_int %tree %int_1
+               OpStore %171 %int_n1
+        %172 = OpAccessChain %_ptr_Function_int %tree %int_2
+               OpStore %172 %int_n1
+               OpReturn
+               OpFunctionEnd
+%insert_i1_i1_ = OpFunction %void None %53
+  %treeIndex = OpFunctionParameter %_ptr_Function_int
+     %data_0 = OpFunctionParameter %_ptr_Function_int
+        %173 = OpLabel
+  %baseIndex = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_BST Function
+    %param_0 = OpVariable %_ptr_Function_int Function
+    %param_1 = OpVariable %_ptr_Function_BST Function
+    %param_2 = OpVariable %_ptr_Function_int Function
+               OpStore %baseIndex %int_0
+               OpBranch %174
+        %174 = OpLabel
+               OpLoopMerge %175 %176 None
+               OpBranch %177
+        %177 = OpLabel
+        %178 = OpLoad %int %baseIndex
+        %179 = OpLoad %int %treeIndex
+        %180 = OpSLessThanEqual %bool %178 %179
+               OpBranchConditional %180 %181 %175
+        %181 = OpLabel
+        %182 = OpLoad %int %data_0
+        %183 = OpLoad %int %baseIndex
+        %184 = OpAccessChain %_ptr_Private_int %tree_0 %183 %int_0
+        %185 = OpLoad %int %184
+        %186 = OpSLessThanEqual %bool %182 %185
+               OpSelectionMerge %187 None
+               OpBranchConditional %186 %188 %189
+        %188 = OpLabel
+        %190 = OpLoad %int %baseIndex
+        %191 = OpAccessChain %_ptr_Private_int %tree_0 %190 %int_1
+        %192 = OpLoad %int %191
+        %193 = OpIEqual %bool %192 %int_n1
+               OpSelectionMerge %194 None
+               OpBranchConditional %193 %195 %196
+        %195 = OpLabel
+        %197 = OpLoad %int %baseIndex
+        %198 = OpLoad %int %treeIndex
+        %199 = OpAccessChain %_ptr_Private_int %tree_0 %197 %int_1
+               OpStore %199 %198
+        %200 = OpLoad %int %treeIndex
+        %201 = OpAccessChain %_ptr_Private_BST %tree_0 %200
+        %202 = OpLoad %BST %201
+               OpStore %param %202
+        %203 = OpLoad %int %data_0
+               OpStore %param_0 %203
+        %204 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param %param_0
+        %205 = OpLoad %BST %param
+        %206 = OpAccessChain %_ptr_Private_BST %tree_0 %200
+               OpStore %206 %205
+               OpReturn
+        %196 = OpLabel
+        %207 = OpLoad %int %baseIndex
+        %208 = OpAccessChain %_ptr_Private_int %tree_0 %207 %int_1
+        %209 = OpLoad %int %208
+               OpStore %baseIndex %209
+               OpBranch %176
+        %194 = OpLabel
+               OpUnreachable
+        %189 = OpLabel
+        %210 = OpLoad %int %baseIndex
+        %211 = OpAccessChain %_ptr_Private_int %tree_0 %210 %int_2
+        %212 = OpLoad %int %211
+        %213 = OpIEqual %bool %212 %int_n1
+               OpSelectionMerge %214 None
+               OpBranchConditional %213 %215 %216
+        %215 = OpLabel
+        %217 = OpLoad %int %baseIndex
+        %218 = OpLoad %int %treeIndex
+        %219 = OpAccessChain %_ptr_Private_int %tree_0 %217 %int_2
+               OpStore %219 %218
+        %220 = OpLoad %int %treeIndex
+        %221 = OpAccessChain %_ptr_Private_BST %tree_0 %220
+        %222 = OpLoad %BST %221
+               OpStore %param_1 %222
+        %223 = OpLoad %int %data_0
+               OpStore %param_2 %223
+        %224 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param_1 %param_2
+        %225 = OpLoad %BST %param_1
+        %226 = OpAccessChain %_ptr_Private_BST %tree_0 %220
+               OpStore %226 %225
+               OpReturn
+        %216 = OpLabel
+        %227 = OpLoad %int %baseIndex
+        %228 = OpAccessChain %_ptr_Private_int %tree_0 %227 %int_2
+        %229 = OpLoad %int %228
+               OpStore %baseIndex %229
+               OpBranch %176
+        %214 = OpLabel
+               OpUnreachable
+        %187 = OpLabel
+               OpUnreachable
+        %176 = OpLabel
+               OpBranch %174
+        %175 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %search_i1_ = OpFunction %int None %54
+     %target = OpFunctionParameter %_ptr_Function_int
+        %230 = OpLabel
+      %index = OpVariable %_ptr_Function_int Function
+%currentNode = OpVariable %_ptr_Function_BST Function
+        %231 = OpVariable %_ptr_Function_int Function
+               OpStore %index %int_0
+               OpBranch %232
+        %232 = OpLabel
+               OpLoopMerge %233 %234 None
+               OpBranch %235
+        %235 = OpLabel
+        %236 = OpLoad %int %index
+        %237 = OpINotEqual %bool %236 %int_n1
+               OpBranchConditional %237 %238 %233
+        %238 = OpLabel
+        %239 = OpLoad %int %index
+        %240 = OpAccessChain %_ptr_Private_BST %tree_0 %239
+        %241 = OpLoad %BST %240
+               OpStore %currentNode %241
+        %242 = OpAccessChain %_ptr_Function_int %currentNode %int_0
+        %243 = OpLoad %int %242
+        %244 = OpLoad %int %target
+        %245 = OpIEqual %bool %243 %244
+               OpSelectionMerge %246 None
+               OpBranchConditional %245 %247 %246
+        %247 = OpLabel
+        %248 = OpLoad %int %target
+               OpReturnValue %248
+        %246 = OpLabel
+        %249 = OpLoad %int %target
+        %250 = OpAccessChain %_ptr_Function_int %currentNode %int_0
+        %251 = OpLoad %int %250
+        %252 = OpSGreaterThan %bool %249 %251
+               OpSelectionMerge %253 None
+               OpBranchConditional %252 %254 %255
+        %254 = OpLabel
+        %256 = OpAccessChain %_ptr_Function_int %currentNode %int_2
+        %257 = OpLoad %int %256
+               OpStore %231 %257
+               OpBranch %253
+        %255 = OpLabel
+        %258 = OpAccessChain %_ptr_Function_int %currentNode %int_1
+        %259 = OpLoad %int %258
+               OpStore %231 %259
+               OpBranch %253
+        %253 = OpLabel
+        %260 = OpLoad %int %231
+               OpStore %index %260
+               OpBranch %234
+        %234 = OpLabel
+               OpBranch %232
+        %233 = OpLabel
+               OpReturnValue %int_n1
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..d3b022e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/1.spvasm.expected.hlsl
@@ -0,0 +1,247 @@
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+
+static BST tree_1[10] = (BST[10])0;
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void makeTreeNode_struct_BST_i1_i1_i11_i1_(inout BST tree, inout int data) {
+  const int x_169 = data;
+  tree.data = x_169;
+  tree.leftIndex = -1;
+  tree.rightIndex = -1;
+  return;
+}
+
+void insert_i1_i1_(inout int treeIndex, inout int data_1) {
+  int baseIndex = 0;
+  BST param = (BST)0;
+  int param_1 = 0;
+  BST param_2 = (BST)0;
+  int param_3 = 0;
+  baseIndex = 0;
+  while (true) {
+    const int x_178 = baseIndex;
+    const int x_179 = treeIndex;
+    if ((x_178 <= x_179)) {
+    } else {
+      break;
+    }
+    const int x_182 = data_1;
+    const int x_185 = tree_1[baseIndex].data;
+    if ((x_182 <= x_185)) {
+      const int x_192 = tree_1[baseIndex].leftIndex;
+      if ((x_192 == -1)) {
+        const int x_197 = baseIndex;
+        const int x_198 = treeIndex;
+        tree_1[x_197].leftIndex = x_198;
+        const int x_200 = treeIndex;
+        const BST x_202 = tree_1[x_200];
+        param = x_202;
+        const int x_203 = data_1;
+        param_1 = x_203;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(param, param_1);
+        tree_1[x_200] = param;
+        return;
+      } else {
+        const int x_209 = tree_1[baseIndex].leftIndex;
+        baseIndex = x_209;
+        continue;
+      }
+      return;
+    } else {
+      const int x_212 = tree_1[baseIndex].rightIndex;
+      if ((x_212 == -1)) {
+        const int x_217 = baseIndex;
+        const int x_218 = treeIndex;
+        tree_1[x_217].rightIndex = x_218;
+        const int x_220 = treeIndex;
+        const BST x_222 = tree_1[x_220];
+        param_2 = x_222;
+        const int x_223 = data_1;
+        param_3 = x_223;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(param_2, param_3);
+        tree_1[x_220] = param_2;
+        return;
+      } else {
+        const int x_229 = tree_1[baseIndex].rightIndex;
+        baseIndex = x_229;
+        continue;
+      }
+      return;
+    }
+    return;
+  }
+  return;
+}
+
+int search_i1_(inout int target) {
+  int index = 0;
+  BST currentNode = (BST)0;
+  int x_231 = 0;
+  index = 0;
+  while (true) {
+    if ((index != -1)) {
+    } else {
+      break;
+    }
+    const BST x_241 = tree_1[index];
+    currentNode = x_241;
+    const int x_243 = currentNode.data;
+    const int x_244 = target;
+    if ((x_243 == x_244)) {
+      const int x_248 = target;
+      return x_248;
+    }
+    const int x_249 = target;
+    const int x_251 = currentNode.data;
+    if ((x_249 > x_251)) {
+      const int x_257 = currentNode.rightIndex;
+      x_231 = x_257;
+    } else {
+      const int x_259 = currentNode.leftIndex;
+      x_231 = x_259;
+    }
+    index = x_231;
+  }
+  return -1;
+}
+
+void main_1() {
+  int treeIndex_1 = 0;
+  BST param_4 = (BST)0;
+  int param_5 = 0;
+  int param_6 = 0;
+  int param_7 = 0;
+  int param_8 = 0;
+  int param_9 = 0;
+  int param_10 = 0;
+  int param_11 = 0;
+  int param_12 = 0;
+  int param_13 = 0;
+  int param_14 = 0;
+  int param_15 = 0;
+  int param_16 = 0;
+  int param_17 = 0;
+  int param_18 = 0;
+  int param_19 = 0;
+  int param_20 = 0;
+  int param_21 = 0;
+  int param_22 = 0;
+  int param_23 = 0;
+  int count = 0;
+  int i = 0;
+  int result = 0;
+  int param_24 = 0;
+  treeIndex_1 = 0;
+  const BST x_88 = tree_1[0];
+  param_4 = x_88;
+  param_5 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(param_4, param_5);
+  tree_1[0] = param_4;
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_6 = treeIndex_1;
+  param_7 = 5;
+  insert_i1_i1_(param_6, param_7);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_8 = treeIndex_1;
+  param_9 = 12;
+  insert_i1_i1_(param_8, param_9);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_10 = treeIndex_1;
+  param_11 = 15;
+  insert_i1_i1_(param_10, param_11);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_12 = treeIndex_1;
+  param_13 = 7;
+  insert_i1_i1_(param_12, param_13);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_14 = treeIndex_1;
+  param_15 = 8;
+  insert_i1_i1_(param_14, param_15);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_16 = treeIndex_1;
+  param_17 = 2;
+  insert_i1_i1_(param_16, param_17);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_18 = treeIndex_1;
+  param_19 = 6;
+  insert_i1_i1_(param_18, param_19);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_20 = treeIndex_1;
+  param_21 = 17;
+  insert_i1_i1_(param_20, param_21);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_22 = treeIndex_1;
+  param_23 = 13;
+  insert_i1_i1_(param_22, param_23);
+  count = 0;
+  i = 0;
+  {
+    for(; (i < 20); i = (i + 1)) {
+      bool x_155 = false;
+      bool x_156_phi = false;
+      param_24 = i;
+      const int x_136 = search_i1_(param_24);
+      result = x_136;
+      switch(i) {
+        case 2:
+        case 5:
+        case 6:
+        case 7:
+        case 8:
+        case 9:
+        case 12:
+        case 13:
+        case 15:
+        case 17: {
+          const bool x_149 = (result == i);
+          x_156_phi = x_149;
+          if (!(x_149)) {
+            const float x_154 = gl_FragCoord.x;
+            x_155 = (x_154 < 0.0f);
+            x_156_phi = x_155;
+          }
+          if (x_156_phi) {
+            count = (count + 1);
+          }
+          break;
+        }
+        default: {
+          if ((result == -1)) {
+            count = (count + 1);
+          }
+          break;
+        }
+      }
+    }
+  }
+  if ((count == 20)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 1.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/1.spvasm.expected.msl
new file mode 100644
index 0000000..80d83c8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/1.spvasm.expected.msl
@@ -0,0 +1,293 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+struct tint_array_wrapper {
+  BST arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void makeTreeNode_struct_BST_i1_i1_i11_i1_(thread BST* const tree, thread int* const data) {
+  int const x_169 = *(data);
+  (*(tree)).data = x_169;
+  (*(tree)).leftIndex = -1;
+  (*(tree)).rightIndex = -1;
+  return;
+}
+
+void insert_i1_i1_(thread int* const treeIndex, thread int* const data_1, thread tint_array_wrapper* const tint_symbol_5) {
+  int baseIndex = 0;
+  BST param = {};
+  int param_1 = 0;
+  BST param_2 = {};
+  int param_3 = 0;
+  baseIndex = 0;
+  while (true) {
+    int const x_178 = baseIndex;
+    int const x_179 = *(treeIndex);
+    if ((x_178 <= x_179)) {
+    } else {
+      break;
+    }
+    int const x_182 = *(data_1);
+    int const x_183 = baseIndex;
+    int const x_185 = (*(tint_symbol_5)).arr[x_183].data;
+    if ((x_182 <= x_185)) {
+      int const x_190 = baseIndex;
+      int const x_192 = (*(tint_symbol_5)).arr[x_190].leftIndex;
+      if ((x_192 == -1)) {
+        int const x_197 = baseIndex;
+        int const x_198 = *(treeIndex);
+        (*(tint_symbol_5)).arr[x_197].leftIndex = x_198;
+        int const x_200 = *(treeIndex);
+        BST const x_202 = (*(tint_symbol_5)).arr[x_200];
+        param = x_202;
+        int const x_203 = *(data_1);
+        param_1 = x_203;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param), &(param_1));
+        BST const x_205 = param;
+        (*(tint_symbol_5)).arr[x_200] = x_205;
+        return;
+      } else {
+        int const x_207 = baseIndex;
+        int const x_209 = (*(tint_symbol_5)).arr[x_207].leftIndex;
+        baseIndex = x_209;
+        continue;
+      }
+      return;
+    } else {
+      int const x_210 = baseIndex;
+      int const x_212 = (*(tint_symbol_5)).arr[x_210].rightIndex;
+      if ((x_212 == -1)) {
+        int const x_217 = baseIndex;
+        int const x_218 = *(treeIndex);
+        (*(tint_symbol_5)).arr[x_217].rightIndex = x_218;
+        int const x_220 = *(treeIndex);
+        BST const x_222 = (*(tint_symbol_5)).arr[x_220];
+        param_2 = x_222;
+        int const x_223 = *(data_1);
+        param_3 = x_223;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_2), &(param_3));
+        BST const x_225 = param_2;
+        (*(tint_symbol_5)).arr[x_220] = x_225;
+        return;
+      } else {
+        int const x_227 = baseIndex;
+        int const x_229 = (*(tint_symbol_5)).arr[x_227].rightIndex;
+        baseIndex = x_229;
+        continue;
+      }
+      return;
+    }
+    return;
+  }
+  return;
+}
+
+int search_i1_(thread int* const target, thread tint_array_wrapper* const tint_symbol_6) {
+  int index = 0;
+  BST currentNode = {};
+  int x_231 = 0;
+  index = 0;
+  while (true) {
+    int const x_236 = index;
+    if ((x_236 != -1)) {
+    } else {
+      break;
+    }
+    int const x_239 = index;
+    BST const x_241 = (*(tint_symbol_6)).arr[x_239];
+    currentNode = x_241;
+    int const x_243 = currentNode.data;
+    int const x_244 = *(target);
+    if ((x_243 == x_244)) {
+      int const x_248 = *(target);
+      return x_248;
+    }
+    int const x_249 = *(target);
+    int const x_251 = currentNode.data;
+    if ((x_249 > x_251)) {
+      int const x_257 = currentNode.rightIndex;
+      x_231 = x_257;
+    } else {
+      int const x_259 = currentNode.leftIndex;
+      x_231 = x_259;
+    }
+    int const x_260 = x_231;
+    index = x_260;
+  }
+  return -1;
+}
+
+void main_1(thread tint_array_wrapper* const tint_symbol_7, thread float4* const tint_symbol_8, thread float4* const tint_symbol_9) {
+  int treeIndex_1 = 0;
+  BST param_4 = {};
+  int param_5 = 0;
+  int param_6 = 0;
+  int param_7 = 0;
+  int param_8 = 0;
+  int param_9 = 0;
+  int param_10 = 0;
+  int param_11 = 0;
+  int param_12 = 0;
+  int param_13 = 0;
+  int param_14 = 0;
+  int param_15 = 0;
+  int param_16 = 0;
+  int param_17 = 0;
+  int param_18 = 0;
+  int param_19 = 0;
+  int param_20 = 0;
+  int param_21 = 0;
+  int param_22 = 0;
+  int param_23 = 0;
+  int count = 0;
+  int i = 0;
+  int result = 0;
+  int param_24 = 0;
+  treeIndex_1 = 0;
+  BST const x_88 = (*(tint_symbol_7)).arr[0];
+  param_4 = x_88;
+  param_5 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_4), &(param_5));
+  BST const x_90 = param_4;
+  (*(tint_symbol_7)).arr[0] = x_90;
+  int const x_92 = treeIndex_1;
+  treeIndex_1 = (x_92 + 1);
+  int const x_94 = treeIndex_1;
+  param_6 = x_94;
+  param_7 = 5;
+  insert_i1_i1_(&(param_6), &(param_7), tint_symbol_7);
+  int const x_96 = treeIndex_1;
+  treeIndex_1 = (x_96 + 1);
+  int const x_98 = treeIndex_1;
+  param_8 = x_98;
+  param_9 = 12;
+  insert_i1_i1_(&(param_8), &(param_9), tint_symbol_7);
+  int const x_100 = treeIndex_1;
+  treeIndex_1 = (x_100 + 1);
+  int const x_102 = treeIndex_1;
+  param_10 = x_102;
+  param_11 = 15;
+  insert_i1_i1_(&(param_10), &(param_11), tint_symbol_7);
+  int const x_104 = treeIndex_1;
+  treeIndex_1 = (x_104 + 1);
+  int const x_106 = treeIndex_1;
+  param_12 = x_106;
+  param_13 = 7;
+  insert_i1_i1_(&(param_12), &(param_13), tint_symbol_7);
+  int const x_108 = treeIndex_1;
+  treeIndex_1 = (x_108 + 1);
+  int const x_110 = treeIndex_1;
+  param_14 = x_110;
+  param_15 = 8;
+  insert_i1_i1_(&(param_14), &(param_15), tint_symbol_7);
+  int const x_112 = treeIndex_1;
+  treeIndex_1 = (x_112 + 1);
+  int const x_114 = treeIndex_1;
+  param_16 = x_114;
+  param_17 = 2;
+  insert_i1_i1_(&(param_16), &(param_17), tint_symbol_7);
+  int const x_116 = treeIndex_1;
+  treeIndex_1 = (x_116 + 1);
+  int const x_118 = treeIndex_1;
+  param_18 = x_118;
+  param_19 = 6;
+  insert_i1_i1_(&(param_18), &(param_19), tint_symbol_7);
+  int const x_120 = treeIndex_1;
+  treeIndex_1 = (x_120 + 1);
+  int const x_122 = treeIndex_1;
+  param_20 = x_122;
+  param_21 = 17;
+  insert_i1_i1_(&(param_20), &(param_21), tint_symbol_7);
+  int const x_124 = treeIndex_1;
+  treeIndex_1 = (x_124 + 1);
+  int const x_126 = treeIndex_1;
+  param_22 = x_126;
+  param_23 = 13;
+  insert_i1_i1_(&(param_22), &(param_23), tint_symbol_7);
+  count = 0;
+  i = 0;
+  while (true) {
+    int const x_132 = i;
+    if ((x_132 < 20)) {
+    } else {
+      break;
+    }
+    bool x_155 = false;
+    bool x_156_phi = false;
+    int const x_135 = i;
+    param_24 = x_135;
+    int const x_136 = search_i1_(&(param_24), tint_symbol_7);
+    result = x_136;
+    int const x_137 = i;
+    switch(x_137) {
+      case 2:
+      case 5:
+      case 6:
+      case 7:
+      case 8:
+      case 9:
+      case 12:
+      case 13:
+      case 15:
+      case 17: {
+        int const x_147 = result;
+        int const x_148 = i;
+        bool const x_149 = (x_147 == x_148);
+        x_156_phi = x_149;
+        if (!(x_149)) {
+          float const x_154 = (*(tint_symbol_8)).x;
+          x_155 = (x_154 < 0.0f);
+          x_156_phi = x_155;
+        }
+        bool const x_156 = x_156_phi;
+        if (x_156) {
+          int const x_159 = count;
+          count = (x_159 + 1);
+        }
+        break;
+      }
+      default: {
+        int const x_141 = result;
+        if ((x_141 == -1)) {
+          int const x_145 = count;
+          count = (x_145 + 1);
+        }
+        break;
+      }
+    }
+    {
+      int const x_161 = i;
+      i = (x_161 + 1);
+    }
+  }
+  int const x_163 = count;
+  if ((x_163 == 20)) {
+    *(tint_symbol_9) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_9) = float4(0.0f, 0.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_10 = 0.0f;
+  thread tint_array_wrapper tint_symbol_11 = {};
+  thread float4 tint_symbol_12 = 0.0f;
+  tint_symbol_10 = gl_FragCoord_param;
+  main_1(&(tint_symbol_11), &(tint_symbol_10), &(tint_symbol_12));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_12};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..b62cb2f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/1.spvasm.expected.spvasm
@@ -0,0 +1,505 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 333
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %BST "BST"
+               OpMemberName %BST 0 "data"
+               OpMemberName %BST 1 "leftIndex"
+               OpMemberName %BST 2 "rightIndex"
+               OpName %tree_1 "tree_1"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %makeTreeNode_struct_BST_i1_i1_i11_i1_ "makeTreeNode_struct_BST_i1_i1_i11_i1_"
+               OpName %tree "tree"
+               OpName %data "data"
+               OpName %insert_i1_i1_ "insert_i1_i1_"
+               OpName %treeIndex "treeIndex"
+               OpName %data_1 "data_1"
+               OpName %baseIndex "baseIndex"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %search_i1_ "search_i1_"
+               OpName %target "target"
+               OpName %index "index"
+               OpName %currentNode "currentNode"
+               OpName %x_231 "x_231"
+               OpName %main_1 "main_1"
+               OpName %treeIndex_1 "treeIndex_1"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpName %param_6 "param_6"
+               OpName %param_7 "param_7"
+               OpName %param_8 "param_8"
+               OpName %param_9 "param_9"
+               OpName %param_10 "param_10"
+               OpName %param_11 "param_11"
+               OpName %param_12 "param_12"
+               OpName %param_13 "param_13"
+               OpName %param_14 "param_14"
+               OpName %param_15 "param_15"
+               OpName %param_16 "param_16"
+               OpName %param_17 "param_17"
+               OpName %param_18 "param_18"
+               OpName %param_19 "param_19"
+               OpName %param_20 "param_20"
+               OpName %param_21 "param_21"
+               OpName %param_22 "param_22"
+               OpName %param_23 "param_23"
+               OpName %count "count"
+               OpName %i "i"
+               OpName %result "result"
+               OpName %param_24 "param_24"
+               OpName %x_155 "x_155"
+               OpName %x_156_phi "x_156_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpMemberDecorate %BST 0 Offset 0
+               OpMemberDecorate %BST 1 Offset 4
+               OpMemberDecorate %BST 2 Offset 8
+               OpDecorate %_arr_BST_uint_10 ArrayStride 12
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+        %BST = OpTypeStruct %int %int %int
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_BST_uint_10 = OpTypeArray %BST %uint_10
+%_ptr_Private__arr_BST_uint_10 = OpTypePointer Private %_arr_BST_uint_10
+          %8 = OpConstantNull %_arr_BST_uint_10
+     %tree_1 = OpVariable %_ptr_Private__arr_BST_uint_10 Private %8
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %13 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %13
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %13
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %13
+       %void = OpTypeVoid
+%_ptr_Function_BST = OpTypePointer Function %BST
+%_ptr_Function_int = OpTypePointer Function %int
+         %19 = OpTypeFunction %void %_ptr_Function_BST %_ptr_Function_int
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+     %int_n1 = OpConstant %int -1
+     %uint_2 = OpConstant %uint 2
+         %39 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+         %45 = OpConstantNull %int
+         %47 = OpConstantNull %BST
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+%_ptr_Private_int = OpTypePointer Private %int
+%_ptr_Private_BST = OpTypePointer Private %BST
+        %125 = OpTypeFunction %int %_ptr_Function_int
+        %166 = OpTypeFunction %void
+      %int_9 = OpConstant %int 9
+      %int_1 = OpConstant %int 1
+      %int_5 = OpConstant %int 5
+     %int_12 = OpConstant %int 12
+     %int_15 = OpConstant %int 15
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+      %int_2 = OpConstant %int 2
+      %int_6 = OpConstant %int 6
+     %int_17 = OpConstant %int 17
+     %int_13 = OpConstant %int 13
+     %int_20 = OpConstant %int 20
+%_ptr_Function_bool = OpTypePointer Function %bool
+        %278 = OpConstantNull %bool
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+        %318 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %319 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+        %320 = OpTypeFunction %void %main_out
+%makeTreeNode_struct_BST_i1_i1_i11_i1_ = OpFunction %void None %19
+       %tree = OpFunctionParameter %_ptr_Function_BST
+       %data = OpFunctionParameter %_ptr_Function_int
+         %26 = OpLabel
+         %28 = OpLoad %int %data
+         %31 = OpAccessChain %_ptr_Function_int %tree %uint_0
+               OpStore %31 %28
+         %34 = OpAccessChain %_ptr_Function_int %tree %uint_1
+               OpStore %34 %int_n1
+         %38 = OpAccessChain %_ptr_Function_int %tree %uint_2
+               OpStore %38 %int_n1
+               OpReturn
+               OpFunctionEnd
+%insert_i1_i1_ = OpFunction %void None %39
+  %treeIndex = OpFunctionParameter %_ptr_Function_int
+     %data_1 = OpFunctionParameter %_ptr_Function_int
+         %43 = OpLabel
+  %baseIndex = OpVariable %_ptr_Function_int Function %45
+      %param = OpVariable %_ptr_Function_BST Function %47
+    %param_1 = OpVariable %_ptr_Function_int Function %45
+    %param_2 = OpVariable %_ptr_Function_BST Function %47
+    %param_3 = OpVariable %_ptr_Function_int Function %45
+               OpStore %baseIndex %int_0
+               OpBranch %52
+         %52 = OpLabel
+               OpLoopMerge %53 %54 None
+               OpBranch %55
+         %55 = OpLabel
+         %56 = OpLoad %int %baseIndex
+         %58 = OpLoad %int %treeIndex
+         %59 = OpSLessThanEqual %bool %56 %58
+               OpSelectionMerge %61 None
+               OpBranchConditional %59 %62 %63
+         %62 = OpLabel
+               OpBranch %61
+         %63 = OpLabel
+               OpBranch %53
+         %61 = OpLabel
+         %65 = OpLoad %int %data_1
+         %66 = OpLoad %int %baseIndex
+         %68 = OpAccessChain %_ptr_Private_int %tree_1 %66 %uint_0
+         %69 = OpLoad %int %68
+         %70 = OpSLessThanEqual %bool %65 %69
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %73
+         %72 = OpLabel
+         %74 = OpLoad %int %baseIndex
+         %75 = OpAccessChain %_ptr_Private_int %tree_1 %74 %uint_1
+         %76 = OpLoad %int %75
+         %77 = OpIEqual %bool %76 %int_n1
+               OpSelectionMerge %78 None
+               OpBranchConditional %77 %79 %80
+         %79 = OpLabel
+         %81 = OpLoad %int %baseIndex
+         %83 = OpLoad %int %treeIndex
+         %84 = OpAccessChain %_ptr_Private_int %tree_1 %81 %uint_1
+               OpStore %84 %83
+         %86 = OpLoad %int %treeIndex
+         %88 = OpAccessChain %_ptr_Private_BST %tree_1 %86
+         %89 = OpLoad %BST %88
+               OpStore %param %89
+         %91 = OpLoad %int %data_1
+               OpStore %param_1 %91
+         %92 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param %param_1
+         %95 = OpLoad %BST %param
+         %96 = OpAccessChain %_ptr_Private_BST %tree_1 %86
+               OpStore %96 %95
+               OpReturn
+         %80 = OpLabel
+         %97 = OpLoad %int %baseIndex
+         %98 = OpAccessChain %_ptr_Private_int %tree_1 %97 %uint_1
+         %99 = OpLoad %int %98
+               OpStore %baseIndex %99
+               OpBranch %54
+         %78 = OpLabel
+               OpReturn
+         %73 = OpLabel
+        %100 = OpLoad %int %baseIndex
+        %101 = OpAccessChain %_ptr_Private_int %tree_1 %100 %uint_2
+        %102 = OpLoad %int %101
+        %103 = OpIEqual %bool %102 %int_n1
+               OpSelectionMerge %104 None
+               OpBranchConditional %103 %105 %106
+        %105 = OpLabel
+        %107 = OpLoad %int %baseIndex
+        %109 = OpLoad %int %treeIndex
+        %110 = OpAccessChain %_ptr_Private_int %tree_1 %107 %uint_2
+               OpStore %110 %109
+        %112 = OpLoad %int %treeIndex
+        %113 = OpAccessChain %_ptr_Private_BST %tree_1 %112
+        %114 = OpLoad %BST %113
+               OpStore %param_2 %114
+        %116 = OpLoad %int %data_1
+               OpStore %param_3 %116
+        %117 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param_2 %param_3
+        %120 = OpLoad %BST %param_2
+        %121 = OpAccessChain %_ptr_Private_BST %tree_1 %112
+               OpStore %121 %120
+               OpReturn
+        %106 = OpLabel
+        %122 = OpLoad %int %baseIndex
+        %123 = OpAccessChain %_ptr_Private_int %tree_1 %122 %uint_2
+        %124 = OpLoad %int %123
+               OpStore %baseIndex %124
+               OpBranch %54
+        %104 = OpLabel
+               OpReturn
+         %71 = OpLabel
+               OpReturn
+         %54 = OpLabel
+               OpBranch %52
+         %53 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %search_i1_ = OpFunction %int None %125
+     %target = OpFunctionParameter %_ptr_Function_int
+        %128 = OpLabel
+      %index = OpVariable %_ptr_Function_int Function %45
+%currentNode = OpVariable %_ptr_Function_BST Function %47
+      %x_231 = OpVariable %_ptr_Function_int Function %45
+               OpStore %index %int_0
+               OpBranch %132
+        %132 = OpLabel
+               OpLoopMerge %133 %134 None
+               OpBranch %135
+        %135 = OpLabel
+        %136 = OpLoad %int %index
+        %137 = OpINotEqual %bool %136 %int_n1
+               OpSelectionMerge %138 None
+               OpBranchConditional %137 %139 %140
+        %139 = OpLabel
+               OpBranch %138
+        %140 = OpLabel
+               OpBranch %133
+        %138 = OpLabel
+        %141 = OpLoad %int %index
+        %142 = OpAccessChain %_ptr_Private_BST %tree_1 %141
+        %143 = OpLoad %BST %142
+               OpStore %currentNode %143
+        %144 = OpAccessChain %_ptr_Function_int %currentNode %uint_0
+        %145 = OpLoad %int %144
+        %147 = OpLoad %int %target
+        %148 = OpIEqual %bool %145 %147
+               OpSelectionMerge %149 None
+               OpBranchConditional %148 %150 %149
+        %150 = OpLabel
+        %152 = OpLoad %int %target
+               OpReturnValue %152
+        %149 = OpLabel
+        %154 = OpLoad %int %target
+        %155 = OpAccessChain %_ptr_Function_int %currentNode %uint_0
+        %156 = OpLoad %int %155
+        %157 = OpSGreaterThan %bool %154 %156
+               OpSelectionMerge %158 None
+               OpBranchConditional %157 %159 %160
+        %159 = OpLabel
+        %161 = OpAccessChain %_ptr_Function_int %currentNode %uint_2
+        %162 = OpLoad %int %161
+               OpStore %x_231 %162
+               OpBranch %158
+        %160 = OpLabel
+        %163 = OpAccessChain %_ptr_Function_int %currentNode %uint_1
+        %164 = OpLoad %int %163
+               OpStore %x_231 %164
+               OpBranch %158
+        %158 = OpLabel
+        %165 = OpLoad %int %x_231
+               OpStore %index %165
+               OpBranch %134
+        %134 = OpLabel
+               OpBranch %132
+        %133 = OpLabel
+               OpReturnValue %int_n1
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %166
+        %168 = OpLabel
+%treeIndex_1 = OpVariable %_ptr_Function_int Function %45
+    %param_4 = OpVariable %_ptr_Function_BST Function %47
+    %param_5 = OpVariable %_ptr_Function_int Function %45
+    %param_6 = OpVariable %_ptr_Function_int Function %45
+    %param_7 = OpVariable %_ptr_Function_int Function %45
+    %param_8 = OpVariable %_ptr_Function_int Function %45
+    %param_9 = OpVariable %_ptr_Function_int Function %45
+   %param_10 = OpVariable %_ptr_Function_int Function %45
+   %param_11 = OpVariable %_ptr_Function_int Function %45
+   %param_12 = OpVariable %_ptr_Function_int Function %45
+   %param_13 = OpVariable %_ptr_Function_int Function %45
+   %param_14 = OpVariable %_ptr_Function_int Function %45
+   %param_15 = OpVariable %_ptr_Function_int Function %45
+   %param_16 = OpVariable %_ptr_Function_int Function %45
+   %param_17 = OpVariable %_ptr_Function_int Function %45
+   %param_18 = OpVariable %_ptr_Function_int Function %45
+   %param_19 = OpVariable %_ptr_Function_int Function %45
+   %param_20 = OpVariable %_ptr_Function_int Function %45
+   %param_21 = OpVariable %_ptr_Function_int Function %45
+   %param_22 = OpVariable %_ptr_Function_int Function %45
+   %param_23 = OpVariable %_ptr_Function_int Function %45
+      %count = OpVariable %_ptr_Function_int Function %45
+          %i = OpVariable %_ptr_Function_int Function %45
+     %result = OpVariable %_ptr_Function_int Function %45
+   %param_24 = OpVariable %_ptr_Function_int Function %45
+      %x_155 = OpVariable %_ptr_Function_bool Function %278
+  %x_156_phi = OpVariable %_ptr_Function_bool Function %278
+               OpStore %treeIndex_1 %int_0
+        %194 = OpAccessChain %_ptr_Private_BST %tree_1 %int_0
+        %195 = OpLoad %BST %194
+               OpStore %param_4 %195
+               OpStore %param_5 %int_9
+        %197 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param_4 %param_5
+        %200 = OpLoad %BST %param_4
+        %201 = OpAccessChain %_ptr_Private_BST %tree_1 %int_0
+               OpStore %201 %200
+        %202 = OpLoad %int %treeIndex_1
+        %204 = OpIAdd %int %202 %int_1
+               OpStore %treeIndex_1 %204
+        %205 = OpLoad %int %treeIndex_1
+               OpStore %param_6 %205
+               OpStore %param_7 %int_5
+        %207 = OpFunctionCall %void %insert_i1_i1_ %param_6 %param_7
+        %210 = OpLoad %int %treeIndex_1
+        %211 = OpIAdd %int %210 %int_1
+               OpStore %treeIndex_1 %211
+        %212 = OpLoad %int %treeIndex_1
+               OpStore %param_8 %212
+               OpStore %param_9 %int_12
+        %214 = OpFunctionCall %void %insert_i1_i1_ %param_8 %param_9
+        %217 = OpLoad %int %treeIndex_1
+        %218 = OpIAdd %int %217 %int_1
+               OpStore %treeIndex_1 %218
+        %219 = OpLoad %int %treeIndex_1
+               OpStore %param_10 %219
+               OpStore %param_11 %int_15
+        %221 = OpFunctionCall %void %insert_i1_i1_ %param_10 %param_11
+        %224 = OpLoad %int %treeIndex_1
+        %225 = OpIAdd %int %224 %int_1
+               OpStore %treeIndex_1 %225
+        %226 = OpLoad %int %treeIndex_1
+               OpStore %param_12 %226
+               OpStore %param_13 %int_7
+        %228 = OpFunctionCall %void %insert_i1_i1_ %param_12 %param_13
+        %231 = OpLoad %int %treeIndex_1
+        %232 = OpIAdd %int %231 %int_1
+               OpStore %treeIndex_1 %232
+        %233 = OpLoad %int %treeIndex_1
+               OpStore %param_14 %233
+               OpStore %param_15 %int_8
+        %235 = OpFunctionCall %void %insert_i1_i1_ %param_14 %param_15
+        %238 = OpLoad %int %treeIndex_1
+        %239 = OpIAdd %int %238 %int_1
+               OpStore %treeIndex_1 %239
+        %240 = OpLoad %int %treeIndex_1
+               OpStore %param_16 %240
+               OpStore %param_17 %int_2
+        %242 = OpFunctionCall %void %insert_i1_i1_ %param_16 %param_17
+        %245 = OpLoad %int %treeIndex_1
+        %246 = OpIAdd %int %245 %int_1
+               OpStore %treeIndex_1 %246
+        %247 = OpLoad %int %treeIndex_1
+               OpStore %param_18 %247
+               OpStore %param_19 %int_6
+        %249 = OpFunctionCall %void %insert_i1_i1_ %param_18 %param_19
+        %252 = OpLoad %int %treeIndex_1
+        %253 = OpIAdd %int %252 %int_1
+               OpStore %treeIndex_1 %253
+        %254 = OpLoad %int %treeIndex_1
+               OpStore %param_20 %254
+               OpStore %param_21 %int_17
+        %256 = OpFunctionCall %void %insert_i1_i1_ %param_20 %param_21
+        %259 = OpLoad %int %treeIndex_1
+        %260 = OpIAdd %int %259 %int_1
+               OpStore %treeIndex_1 %260
+        %261 = OpLoad %int %treeIndex_1
+               OpStore %param_22 %261
+               OpStore %param_23 %int_13
+        %263 = OpFunctionCall %void %insert_i1_i1_ %param_22 %param_23
+               OpStore %count %int_0
+               OpStore %i %int_0
+               OpBranch %266
+        %266 = OpLabel
+               OpLoopMerge %267 %268 None
+               OpBranch %269
+        %269 = OpLabel
+        %270 = OpLoad %int %i
+        %272 = OpSLessThan %bool %270 %int_20
+               OpSelectionMerge %273 None
+               OpBranchConditional %272 %274 %275
+        %274 = OpLabel
+               OpBranch %273
+        %275 = OpLabel
+               OpBranch %267
+        %273 = OpLabel
+        %280 = OpLoad %int %i
+               OpStore %param_24 %280
+        %281 = OpFunctionCall %int %search_i1_ %param_24
+               OpStore %result %281
+        %283 = OpLoad %int %i
+               OpSelectionMerge %284 None
+               OpSwitch %283 %285 2 %286 5 %286 6 %286 7 %286 8 %286 9 %286 12 %286 13 %286 15 %286 17 %286
+        %286 = OpLabel
+        %287 = OpLoad %int %result
+        %288 = OpLoad %int %i
+        %289 = OpIEqual %bool %287 %288
+               OpStore %x_156_phi %289
+        %290 = OpLogicalNot %bool %289
+               OpSelectionMerge %291 None
+               OpBranchConditional %290 %292 %291
+        %292 = OpLabel
+        %294 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+        %295 = OpLoad %float %294
+        %297 = OpFOrdLessThan %bool %295 %float_0
+               OpStore %x_155 %297
+        %298 = OpLoad %bool %x_155
+               OpStore %x_156_phi %298
+               OpBranch %291
+        %291 = OpLabel
+        %299 = OpLoad %bool %x_156_phi
+               OpSelectionMerge %300 None
+               OpBranchConditional %299 %301 %300
+        %301 = OpLabel
+        %302 = OpLoad %int %count
+        %303 = OpIAdd %int %302 %int_1
+               OpStore %count %303
+               OpBranch %300
+        %300 = OpLabel
+               OpBranch %284
+        %285 = OpLabel
+        %304 = OpLoad %int %result
+        %305 = OpIEqual %bool %304 %int_n1
+               OpSelectionMerge %306 None
+               OpBranchConditional %305 %307 %306
+        %307 = OpLabel
+        %308 = OpLoad %int %count
+        %309 = OpIAdd %int %308 %int_1
+               OpStore %count %309
+               OpBranch %306
+        %306 = OpLabel
+               OpBranch %284
+        %284 = OpLabel
+               OpBranch %268
+        %268 = OpLabel
+        %310 = OpLoad %int %i
+        %311 = OpIAdd %int %310 %int_1
+               OpStore %i %311
+               OpBranch %266
+        %267 = OpLabel
+        %312 = OpLoad %int %count
+        %313 = OpIEqual %bool %312 %int_20
+               OpSelectionMerge %314 None
+               OpBranchConditional %313 %315 %316
+        %315 = OpLabel
+               OpStore %x_GLF_color %318
+               OpBranch %314
+        %316 = OpLabel
+               OpStore %x_GLF_color %319
+               OpBranch %314
+        %314 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %320
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %324 = OpLabel
+        %325 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %325
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %166
+        %327 = OpLabel
+        %328 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %328
+        %329 = OpFunctionCall %void %main_1
+        %331 = OpLoad %v4float %x_GLF_color
+        %332 = OpCompositeConstruct %main_out %331
+        %330 = OpFunctionCall %void %tint_symbol_3 %332
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..4d268f6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/1.spvasm.expected.wgsl
@@ -0,0 +1,277 @@
+struct BST {
+  data : i32;
+  leftIndex : i32;
+  rightIndex : i32;
+};
+
+var<private> tree_1 : array<BST, 10>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn makeTreeNode_struct_BST_i1_i1_i11_i1_(tree : ptr<function, BST>, data : ptr<function, i32>) {
+  let x_169 : i32 = *(data);
+  (*(tree)).data = x_169;
+  (*(tree)).leftIndex = -1;
+  (*(tree)).rightIndex = -1;
+  return;
+}
+
+fn insert_i1_i1_(treeIndex : ptr<function, i32>, data_1 : ptr<function, i32>) {
+  var baseIndex : i32;
+  var param : BST;
+  var param_1 : i32;
+  var param_2 : BST;
+  var param_3 : i32;
+  baseIndex = 0;
+  loop {
+    let x_178 : i32 = baseIndex;
+    let x_179 : i32 = *(treeIndex);
+    if ((x_178 <= x_179)) {
+    } else {
+      break;
+    }
+    let x_182 : i32 = *(data_1);
+    let x_183 : i32 = baseIndex;
+    let x_185 : i32 = tree_1[x_183].data;
+    if ((x_182 <= x_185)) {
+      let x_190 : i32 = baseIndex;
+      let x_192 : i32 = tree_1[x_190].leftIndex;
+      if ((x_192 == -1)) {
+        let x_197 : i32 = baseIndex;
+        let x_198 : i32 = *(treeIndex);
+        tree_1[x_197].leftIndex = x_198;
+        let x_200 : i32 = *(treeIndex);
+        let x_202 : BST = tree_1[x_200];
+        param = x_202;
+        let x_203 : i32 = *(data_1);
+        param_1 = x_203;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param), &(param_1));
+        let x_205 : BST = param;
+        tree_1[x_200] = x_205;
+        return;
+      } else {
+        let x_207 : i32 = baseIndex;
+        let x_209 : i32 = tree_1[x_207].leftIndex;
+        baseIndex = x_209;
+        continue;
+      }
+      return;
+    } else {
+      let x_210 : i32 = baseIndex;
+      let x_212 : i32 = tree_1[x_210].rightIndex;
+      if ((x_212 == -1)) {
+        let x_217 : i32 = baseIndex;
+        let x_218 : i32 = *(treeIndex);
+        tree_1[x_217].rightIndex = x_218;
+        let x_220 : i32 = *(treeIndex);
+        let x_222 : BST = tree_1[x_220];
+        param_2 = x_222;
+        let x_223 : i32 = *(data_1);
+        param_3 = x_223;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_2), &(param_3));
+        let x_225 : BST = param_2;
+        tree_1[x_220] = x_225;
+        return;
+      } else {
+        let x_227 : i32 = baseIndex;
+        let x_229 : i32 = tree_1[x_227].rightIndex;
+        baseIndex = x_229;
+        continue;
+      }
+      return;
+    }
+    return;
+  }
+  return;
+}
+
+fn search_i1_(target : ptr<function, i32>) -> i32 {
+  var index : i32;
+  var currentNode : BST;
+  var x_231 : i32;
+  index = 0;
+  loop {
+    let x_236 : i32 = index;
+    if ((x_236 != -1)) {
+    } else {
+      break;
+    }
+    let x_239 : i32 = index;
+    let x_241 : BST = tree_1[x_239];
+    currentNode = x_241;
+    let x_243 : i32 = currentNode.data;
+    let x_244 : i32 = *(target);
+    if ((x_243 == x_244)) {
+      let x_248 : i32 = *(target);
+      return x_248;
+    }
+    let x_249 : i32 = *(target);
+    let x_251 : i32 = currentNode.data;
+    if ((x_249 > x_251)) {
+      let x_257 : i32 = currentNode.rightIndex;
+      x_231 = x_257;
+    } else {
+      let x_259 : i32 = currentNode.leftIndex;
+      x_231 = x_259;
+    }
+    let x_260 : i32 = x_231;
+    index = x_260;
+  }
+  return -1;
+}
+
+fn main_1() {
+  var treeIndex_1 : i32;
+  var param_4 : BST;
+  var param_5 : i32;
+  var param_6 : i32;
+  var param_7 : i32;
+  var param_8 : i32;
+  var param_9 : i32;
+  var param_10 : i32;
+  var param_11 : i32;
+  var param_12 : i32;
+  var param_13 : i32;
+  var param_14 : i32;
+  var param_15 : i32;
+  var param_16 : i32;
+  var param_17 : i32;
+  var param_18 : i32;
+  var param_19 : i32;
+  var param_20 : i32;
+  var param_21 : i32;
+  var param_22 : i32;
+  var param_23 : i32;
+  var count : i32;
+  var i : i32;
+  var result : i32;
+  var param_24 : i32;
+  treeIndex_1 = 0;
+  let x_88 : BST = tree_1[0];
+  param_4 = x_88;
+  param_5 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_4), &(param_5));
+  let x_90 : BST = param_4;
+  tree_1[0] = x_90;
+  let x_92 : i32 = treeIndex_1;
+  treeIndex_1 = (x_92 + 1);
+  let x_94 : i32 = treeIndex_1;
+  param_6 = x_94;
+  param_7 = 5;
+  insert_i1_i1_(&(param_6), &(param_7));
+  let x_96 : i32 = treeIndex_1;
+  treeIndex_1 = (x_96 + 1);
+  let x_98 : i32 = treeIndex_1;
+  param_8 = x_98;
+  param_9 = 12;
+  insert_i1_i1_(&(param_8), &(param_9));
+  let x_100 : i32 = treeIndex_1;
+  treeIndex_1 = (x_100 + 1);
+  let x_102 : i32 = treeIndex_1;
+  param_10 = x_102;
+  param_11 = 15;
+  insert_i1_i1_(&(param_10), &(param_11));
+  let x_104 : i32 = treeIndex_1;
+  treeIndex_1 = (x_104 + 1);
+  let x_106 : i32 = treeIndex_1;
+  param_12 = x_106;
+  param_13 = 7;
+  insert_i1_i1_(&(param_12), &(param_13));
+  let x_108 : i32 = treeIndex_1;
+  treeIndex_1 = (x_108 + 1);
+  let x_110 : i32 = treeIndex_1;
+  param_14 = x_110;
+  param_15 = 8;
+  insert_i1_i1_(&(param_14), &(param_15));
+  let x_112 : i32 = treeIndex_1;
+  treeIndex_1 = (x_112 + 1);
+  let x_114 : i32 = treeIndex_1;
+  param_16 = x_114;
+  param_17 = 2;
+  insert_i1_i1_(&(param_16), &(param_17));
+  let x_116 : i32 = treeIndex_1;
+  treeIndex_1 = (x_116 + 1);
+  let x_118 : i32 = treeIndex_1;
+  param_18 = x_118;
+  param_19 = 6;
+  insert_i1_i1_(&(param_18), &(param_19));
+  let x_120 : i32 = treeIndex_1;
+  treeIndex_1 = (x_120 + 1);
+  let x_122 : i32 = treeIndex_1;
+  param_20 = x_122;
+  param_21 = 17;
+  insert_i1_i1_(&(param_20), &(param_21));
+  let x_124 : i32 = treeIndex_1;
+  treeIndex_1 = (x_124 + 1);
+  let x_126 : i32 = treeIndex_1;
+  param_22 = x_126;
+  param_23 = 13;
+  insert_i1_i1_(&(param_22), &(param_23));
+  count = 0;
+  i = 0;
+  loop {
+    let x_132 : i32 = i;
+    if ((x_132 < 20)) {
+    } else {
+      break;
+    }
+    var x_155 : bool;
+    var x_156_phi : bool;
+    let x_135 : i32 = i;
+    param_24 = x_135;
+    let x_136 : i32 = search_i1_(&(param_24));
+    result = x_136;
+    let x_137 : i32 = i;
+    switch(x_137) {
+      case 2, 5, 6, 7, 8, 9, 12, 13, 15, 17: {
+        let x_147 : i32 = result;
+        let x_148 : i32 = i;
+        let x_149 : bool = (x_147 == x_148);
+        x_156_phi = x_149;
+        if (!(x_149)) {
+          let x_154 : f32 = gl_FragCoord.x;
+          x_155 = (x_154 < 0.0);
+          x_156_phi = x_155;
+        }
+        let x_156 : bool = x_156_phi;
+        if (x_156) {
+          let x_159 : i32 = count;
+          count = (x_159 + 1);
+        }
+      }
+      default: {
+        let x_141 : i32 = result;
+        if ((x_141 == -1)) {
+          let x_145 : i32 = count;
+          count = (x_145 + 1);
+        }
+      }
+    }
+
+    continuing {
+      let x_161 : i32 = i;
+      i = (x_161 + 1);
+    }
+  }
+  let x_163 : i32 = count;
+  if ((x_163 == 20)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/1.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/1.wgsl
new file mode 100644
index 0000000..4d268f6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/1.wgsl
@@ -0,0 +1,277 @@
+struct BST {
+  data : i32;
+  leftIndex : i32;
+  rightIndex : i32;
+};
+
+var<private> tree_1 : array<BST, 10>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn makeTreeNode_struct_BST_i1_i1_i11_i1_(tree : ptr<function, BST>, data : ptr<function, i32>) {
+  let x_169 : i32 = *(data);
+  (*(tree)).data = x_169;
+  (*(tree)).leftIndex = -1;
+  (*(tree)).rightIndex = -1;
+  return;
+}
+
+fn insert_i1_i1_(treeIndex : ptr<function, i32>, data_1 : ptr<function, i32>) {
+  var baseIndex : i32;
+  var param : BST;
+  var param_1 : i32;
+  var param_2 : BST;
+  var param_3 : i32;
+  baseIndex = 0;
+  loop {
+    let x_178 : i32 = baseIndex;
+    let x_179 : i32 = *(treeIndex);
+    if ((x_178 <= x_179)) {
+    } else {
+      break;
+    }
+    let x_182 : i32 = *(data_1);
+    let x_183 : i32 = baseIndex;
+    let x_185 : i32 = tree_1[x_183].data;
+    if ((x_182 <= x_185)) {
+      let x_190 : i32 = baseIndex;
+      let x_192 : i32 = tree_1[x_190].leftIndex;
+      if ((x_192 == -1)) {
+        let x_197 : i32 = baseIndex;
+        let x_198 : i32 = *(treeIndex);
+        tree_1[x_197].leftIndex = x_198;
+        let x_200 : i32 = *(treeIndex);
+        let x_202 : BST = tree_1[x_200];
+        param = x_202;
+        let x_203 : i32 = *(data_1);
+        param_1 = x_203;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param), &(param_1));
+        let x_205 : BST = param;
+        tree_1[x_200] = x_205;
+        return;
+      } else {
+        let x_207 : i32 = baseIndex;
+        let x_209 : i32 = tree_1[x_207].leftIndex;
+        baseIndex = x_209;
+        continue;
+      }
+      return;
+    } else {
+      let x_210 : i32 = baseIndex;
+      let x_212 : i32 = tree_1[x_210].rightIndex;
+      if ((x_212 == -1)) {
+        let x_217 : i32 = baseIndex;
+        let x_218 : i32 = *(treeIndex);
+        tree_1[x_217].rightIndex = x_218;
+        let x_220 : i32 = *(treeIndex);
+        let x_222 : BST = tree_1[x_220];
+        param_2 = x_222;
+        let x_223 : i32 = *(data_1);
+        param_3 = x_223;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_2), &(param_3));
+        let x_225 : BST = param_2;
+        tree_1[x_220] = x_225;
+        return;
+      } else {
+        let x_227 : i32 = baseIndex;
+        let x_229 : i32 = tree_1[x_227].rightIndex;
+        baseIndex = x_229;
+        continue;
+      }
+      return;
+    }
+    return;
+  }
+  return;
+}
+
+fn search_i1_(target : ptr<function, i32>) -> i32 {
+  var index : i32;
+  var currentNode : BST;
+  var x_231 : i32;
+  index = 0;
+  loop {
+    let x_236 : i32 = index;
+    if ((x_236 != -1)) {
+    } else {
+      break;
+    }
+    let x_239 : i32 = index;
+    let x_241 : BST = tree_1[x_239];
+    currentNode = x_241;
+    let x_243 : i32 = currentNode.data;
+    let x_244 : i32 = *(target);
+    if ((x_243 == x_244)) {
+      let x_248 : i32 = *(target);
+      return x_248;
+    }
+    let x_249 : i32 = *(target);
+    let x_251 : i32 = currentNode.data;
+    if ((x_249 > x_251)) {
+      let x_257 : i32 = currentNode.rightIndex;
+      x_231 = x_257;
+    } else {
+      let x_259 : i32 = currentNode.leftIndex;
+      x_231 = x_259;
+    }
+    let x_260 : i32 = x_231;
+    index = x_260;
+  }
+  return -1;
+}
+
+fn main_1() {
+  var treeIndex_1 : i32;
+  var param_4 : BST;
+  var param_5 : i32;
+  var param_6 : i32;
+  var param_7 : i32;
+  var param_8 : i32;
+  var param_9 : i32;
+  var param_10 : i32;
+  var param_11 : i32;
+  var param_12 : i32;
+  var param_13 : i32;
+  var param_14 : i32;
+  var param_15 : i32;
+  var param_16 : i32;
+  var param_17 : i32;
+  var param_18 : i32;
+  var param_19 : i32;
+  var param_20 : i32;
+  var param_21 : i32;
+  var param_22 : i32;
+  var param_23 : i32;
+  var count : i32;
+  var i : i32;
+  var result : i32;
+  var param_24 : i32;
+  treeIndex_1 = 0;
+  let x_88 : BST = tree_1[0];
+  param_4 = x_88;
+  param_5 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_4), &(param_5));
+  let x_90 : BST = param_4;
+  tree_1[0] = x_90;
+  let x_92 : i32 = treeIndex_1;
+  treeIndex_1 = (x_92 + 1);
+  let x_94 : i32 = treeIndex_1;
+  param_6 = x_94;
+  param_7 = 5;
+  insert_i1_i1_(&(param_6), &(param_7));
+  let x_96 : i32 = treeIndex_1;
+  treeIndex_1 = (x_96 + 1);
+  let x_98 : i32 = treeIndex_1;
+  param_8 = x_98;
+  param_9 = 12;
+  insert_i1_i1_(&(param_8), &(param_9));
+  let x_100 : i32 = treeIndex_1;
+  treeIndex_1 = (x_100 + 1);
+  let x_102 : i32 = treeIndex_1;
+  param_10 = x_102;
+  param_11 = 15;
+  insert_i1_i1_(&(param_10), &(param_11));
+  let x_104 : i32 = treeIndex_1;
+  treeIndex_1 = (x_104 + 1);
+  let x_106 : i32 = treeIndex_1;
+  param_12 = x_106;
+  param_13 = 7;
+  insert_i1_i1_(&(param_12), &(param_13));
+  let x_108 : i32 = treeIndex_1;
+  treeIndex_1 = (x_108 + 1);
+  let x_110 : i32 = treeIndex_1;
+  param_14 = x_110;
+  param_15 = 8;
+  insert_i1_i1_(&(param_14), &(param_15));
+  let x_112 : i32 = treeIndex_1;
+  treeIndex_1 = (x_112 + 1);
+  let x_114 : i32 = treeIndex_1;
+  param_16 = x_114;
+  param_17 = 2;
+  insert_i1_i1_(&(param_16), &(param_17));
+  let x_116 : i32 = treeIndex_1;
+  treeIndex_1 = (x_116 + 1);
+  let x_118 : i32 = treeIndex_1;
+  param_18 = x_118;
+  param_19 = 6;
+  insert_i1_i1_(&(param_18), &(param_19));
+  let x_120 : i32 = treeIndex_1;
+  treeIndex_1 = (x_120 + 1);
+  let x_122 : i32 = treeIndex_1;
+  param_20 = x_122;
+  param_21 = 17;
+  insert_i1_i1_(&(param_20), &(param_21));
+  let x_124 : i32 = treeIndex_1;
+  treeIndex_1 = (x_124 + 1);
+  let x_126 : i32 = treeIndex_1;
+  param_22 = x_126;
+  param_23 = 13;
+  insert_i1_i1_(&(param_22), &(param_23));
+  count = 0;
+  i = 0;
+  loop {
+    let x_132 : i32 = i;
+    if ((x_132 < 20)) {
+    } else {
+      break;
+    }
+    var x_155 : bool;
+    var x_156_phi : bool;
+    let x_135 : i32 = i;
+    param_24 = x_135;
+    let x_136 : i32 = search_i1_(&(param_24));
+    result = x_136;
+    let x_137 : i32 = i;
+    switch(x_137) {
+      case 2, 5, 6, 7, 8, 9, 12, 13, 15, 17: {
+        let x_147 : i32 = result;
+        let x_148 : i32 = i;
+        let x_149 : bool = (x_147 == x_148);
+        x_156_phi = x_149;
+        if (!(x_149)) {
+          let x_154 : f32 = gl_FragCoord.x;
+          x_155 = (x_154 < 0.0);
+          x_156_phi = x_155;
+        }
+        let x_156 : bool = x_156_phi;
+        if (x_156) {
+          let x_159 : i32 = count;
+          count = (x_159 + 1);
+        }
+      }
+      default: {
+        let x_141 : i32 = result;
+        if ((x_141 == -1)) {
+          let x_145 : i32 = count;
+          count = (x_145 + 1);
+        }
+      }
+    }
+
+    continuing {
+      let x_161 : i32 = i;
+      i = (x_161 + 1);
+    }
+  }
+  let x_163 : i32 = count;
+  if ((x_163 == 20)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..d3b022e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/1.wgsl.expected.hlsl
@@ -0,0 +1,247 @@
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+
+static BST tree_1[10] = (BST[10])0;
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void makeTreeNode_struct_BST_i1_i1_i11_i1_(inout BST tree, inout int data) {
+  const int x_169 = data;
+  tree.data = x_169;
+  tree.leftIndex = -1;
+  tree.rightIndex = -1;
+  return;
+}
+
+void insert_i1_i1_(inout int treeIndex, inout int data_1) {
+  int baseIndex = 0;
+  BST param = (BST)0;
+  int param_1 = 0;
+  BST param_2 = (BST)0;
+  int param_3 = 0;
+  baseIndex = 0;
+  while (true) {
+    const int x_178 = baseIndex;
+    const int x_179 = treeIndex;
+    if ((x_178 <= x_179)) {
+    } else {
+      break;
+    }
+    const int x_182 = data_1;
+    const int x_185 = tree_1[baseIndex].data;
+    if ((x_182 <= x_185)) {
+      const int x_192 = tree_1[baseIndex].leftIndex;
+      if ((x_192 == -1)) {
+        const int x_197 = baseIndex;
+        const int x_198 = treeIndex;
+        tree_1[x_197].leftIndex = x_198;
+        const int x_200 = treeIndex;
+        const BST x_202 = tree_1[x_200];
+        param = x_202;
+        const int x_203 = data_1;
+        param_1 = x_203;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(param, param_1);
+        tree_1[x_200] = param;
+        return;
+      } else {
+        const int x_209 = tree_1[baseIndex].leftIndex;
+        baseIndex = x_209;
+        continue;
+      }
+      return;
+    } else {
+      const int x_212 = tree_1[baseIndex].rightIndex;
+      if ((x_212 == -1)) {
+        const int x_217 = baseIndex;
+        const int x_218 = treeIndex;
+        tree_1[x_217].rightIndex = x_218;
+        const int x_220 = treeIndex;
+        const BST x_222 = tree_1[x_220];
+        param_2 = x_222;
+        const int x_223 = data_1;
+        param_3 = x_223;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(param_2, param_3);
+        tree_1[x_220] = param_2;
+        return;
+      } else {
+        const int x_229 = tree_1[baseIndex].rightIndex;
+        baseIndex = x_229;
+        continue;
+      }
+      return;
+    }
+    return;
+  }
+  return;
+}
+
+int search_i1_(inout int target) {
+  int index = 0;
+  BST currentNode = (BST)0;
+  int x_231 = 0;
+  index = 0;
+  while (true) {
+    if ((index != -1)) {
+    } else {
+      break;
+    }
+    const BST x_241 = tree_1[index];
+    currentNode = x_241;
+    const int x_243 = currentNode.data;
+    const int x_244 = target;
+    if ((x_243 == x_244)) {
+      const int x_248 = target;
+      return x_248;
+    }
+    const int x_249 = target;
+    const int x_251 = currentNode.data;
+    if ((x_249 > x_251)) {
+      const int x_257 = currentNode.rightIndex;
+      x_231 = x_257;
+    } else {
+      const int x_259 = currentNode.leftIndex;
+      x_231 = x_259;
+    }
+    index = x_231;
+  }
+  return -1;
+}
+
+void main_1() {
+  int treeIndex_1 = 0;
+  BST param_4 = (BST)0;
+  int param_5 = 0;
+  int param_6 = 0;
+  int param_7 = 0;
+  int param_8 = 0;
+  int param_9 = 0;
+  int param_10 = 0;
+  int param_11 = 0;
+  int param_12 = 0;
+  int param_13 = 0;
+  int param_14 = 0;
+  int param_15 = 0;
+  int param_16 = 0;
+  int param_17 = 0;
+  int param_18 = 0;
+  int param_19 = 0;
+  int param_20 = 0;
+  int param_21 = 0;
+  int param_22 = 0;
+  int param_23 = 0;
+  int count = 0;
+  int i = 0;
+  int result = 0;
+  int param_24 = 0;
+  treeIndex_1 = 0;
+  const BST x_88 = tree_1[0];
+  param_4 = x_88;
+  param_5 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(param_4, param_5);
+  tree_1[0] = param_4;
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_6 = treeIndex_1;
+  param_7 = 5;
+  insert_i1_i1_(param_6, param_7);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_8 = treeIndex_1;
+  param_9 = 12;
+  insert_i1_i1_(param_8, param_9);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_10 = treeIndex_1;
+  param_11 = 15;
+  insert_i1_i1_(param_10, param_11);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_12 = treeIndex_1;
+  param_13 = 7;
+  insert_i1_i1_(param_12, param_13);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_14 = treeIndex_1;
+  param_15 = 8;
+  insert_i1_i1_(param_14, param_15);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_16 = treeIndex_1;
+  param_17 = 2;
+  insert_i1_i1_(param_16, param_17);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_18 = treeIndex_1;
+  param_19 = 6;
+  insert_i1_i1_(param_18, param_19);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_20 = treeIndex_1;
+  param_21 = 17;
+  insert_i1_i1_(param_20, param_21);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_22 = treeIndex_1;
+  param_23 = 13;
+  insert_i1_i1_(param_22, param_23);
+  count = 0;
+  i = 0;
+  {
+    for(; (i < 20); i = (i + 1)) {
+      bool x_155 = false;
+      bool x_156_phi = false;
+      param_24 = i;
+      const int x_136 = search_i1_(param_24);
+      result = x_136;
+      switch(i) {
+        case 2:
+        case 5:
+        case 6:
+        case 7:
+        case 8:
+        case 9:
+        case 12:
+        case 13:
+        case 15:
+        case 17: {
+          const bool x_149 = (result == i);
+          x_156_phi = x_149;
+          if (!(x_149)) {
+            const float x_154 = gl_FragCoord.x;
+            x_155 = (x_154 < 0.0f);
+            x_156_phi = x_155;
+          }
+          if (x_156_phi) {
+            count = (count + 1);
+          }
+          break;
+        }
+        default: {
+          if ((result == -1)) {
+            count = (count + 1);
+          }
+          break;
+        }
+      }
+    }
+  }
+  if ((count == 20)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 1.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/1.wgsl.expected.msl
new file mode 100644
index 0000000..80d83c8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/1.wgsl.expected.msl
@@ -0,0 +1,293 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+struct tint_array_wrapper {
+  BST arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void makeTreeNode_struct_BST_i1_i1_i11_i1_(thread BST* const tree, thread int* const data) {
+  int const x_169 = *(data);
+  (*(tree)).data = x_169;
+  (*(tree)).leftIndex = -1;
+  (*(tree)).rightIndex = -1;
+  return;
+}
+
+void insert_i1_i1_(thread int* const treeIndex, thread int* const data_1, thread tint_array_wrapper* const tint_symbol_5) {
+  int baseIndex = 0;
+  BST param = {};
+  int param_1 = 0;
+  BST param_2 = {};
+  int param_3 = 0;
+  baseIndex = 0;
+  while (true) {
+    int const x_178 = baseIndex;
+    int const x_179 = *(treeIndex);
+    if ((x_178 <= x_179)) {
+    } else {
+      break;
+    }
+    int const x_182 = *(data_1);
+    int const x_183 = baseIndex;
+    int const x_185 = (*(tint_symbol_5)).arr[x_183].data;
+    if ((x_182 <= x_185)) {
+      int const x_190 = baseIndex;
+      int const x_192 = (*(tint_symbol_5)).arr[x_190].leftIndex;
+      if ((x_192 == -1)) {
+        int const x_197 = baseIndex;
+        int const x_198 = *(treeIndex);
+        (*(tint_symbol_5)).arr[x_197].leftIndex = x_198;
+        int const x_200 = *(treeIndex);
+        BST const x_202 = (*(tint_symbol_5)).arr[x_200];
+        param = x_202;
+        int const x_203 = *(data_1);
+        param_1 = x_203;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param), &(param_1));
+        BST const x_205 = param;
+        (*(tint_symbol_5)).arr[x_200] = x_205;
+        return;
+      } else {
+        int const x_207 = baseIndex;
+        int const x_209 = (*(tint_symbol_5)).arr[x_207].leftIndex;
+        baseIndex = x_209;
+        continue;
+      }
+      return;
+    } else {
+      int const x_210 = baseIndex;
+      int const x_212 = (*(tint_symbol_5)).arr[x_210].rightIndex;
+      if ((x_212 == -1)) {
+        int const x_217 = baseIndex;
+        int const x_218 = *(treeIndex);
+        (*(tint_symbol_5)).arr[x_217].rightIndex = x_218;
+        int const x_220 = *(treeIndex);
+        BST const x_222 = (*(tint_symbol_5)).arr[x_220];
+        param_2 = x_222;
+        int const x_223 = *(data_1);
+        param_3 = x_223;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_2), &(param_3));
+        BST const x_225 = param_2;
+        (*(tint_symbol_5)).arr[x_220] = x_225;
+        return;
+      } else {
+        int const x_227 = baseIndex;
+        int const x_229 = (*(tint_symbol_5)).arr[x_227].rightIndex;
+        baseIndex = x_229;
+        continue;
+      }
+      return;
+    }
+    return;
+  }
+  return;
+}
+
+int search_i1_(thread int* const target, thread tint_array_wrapper* const tint_symbol_6) {
+  int index = 0;
+  BST currentNode = {};
+  int x_231 = 0;
+  index = 0;
+  while (true) {
+    int const x_236 = index;
+    if ((x_236 != -1)) {
+    } else {
+      break;
+    }
+    int const x_239 = index;
+    BST const x_241 = (*(tint_symbol_6)).arr[x_239];
+    currentNode = x_241;
+    int const x_243 = currentNode.data;
+    int const x_244 = *(target);
+    if ((x_243 == x_244)) {
+      int const x_248 = *(target);
+      return x_248;
+    }
+    int const x_249 = *(target);
+    int const x_251 = currentNode.data;
+    if ((x_249 > x_251)) {
+      int const x_257 = currentNode.rightIndex;
+      x_231 = x_257;
+    } else {
+      int const x_259 = currentNode.leftIndex;
+      x_231 = x_259;
+    }
+    int const x_260 = x_231;
+    index = x_260;
+  }
+  return -1;
+}
+
+void main_1(thread tint_array_wrapper* const tint_symbol_7, thread float4* const tint_symbol_8, thread float4* const tint_symbol_9) {
+  int treeIndex_1 = 0;
+  BST param_4 = {};
+  int param_5 = 0;
+  int param_6 = 0;
+  int param_7 = 0;
+  int param_8 = 0;
+  int param_9 = 0;
+  int param_10 = 0;
+  int param_11 = 0;
+  int param_12 = 0;
+  int param_13 = 0;
+  int param_14 = 0;
+  int param_15 = 0;
+  int param_16 = 0;
+  int param_17 = 0;
+  int param_18 = 0;
+  int param_19 = 0;
+  int param_20 = 0;
+  int param_21 = 0;
+  int param_22 = 0;
+  int param_23 = 0;
+  int count = 0;
+  int i = 0;
+  int result = 0;
+  int param_24 = 0;
+  treeIndex_1 = 0;
+  BST const x_88 = (*(tint_symbol_7)).arr[0];
+  param_4 = x_88;
+  param_5 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_4), &(param_5));
+  BST const x_90 = param_4;
+  (*(tint_symbol_7)).arr[0] = x_90;
+  int const x_92 = treeIndex_1;
+  treeIndex_1 = (x_92 + 1);
+  int const x_94 = treeIndex_1;
+  param_6 = x_94;
+  param_7 = 5;
+  insert_i1_i1_(&(param_6), &(param_7), tint_symbol_7);
+  int const x_96 = treeIndex_1;
+  treeIndex_1 = (x_96 + 1);
+  int const x_98 = treeIndex_1;
+  param_8 = x_98;
+  param_9 = 12;
+  insert_i1_i1_(&(param_8), &(param_9), tint_symbol_7);
+  int const x_100 = treeIndex_1;
+  treeIndex_1 = (x_100 + 1);
+  int const x_102 = treeIndex_1;
+  param_10 = x_102;
+  param_11 = 15;
+  insert_i1_i1_(&(param_10), &(param_11), tint_symbol_7);
+  int const x_104 = treeIndex_1;
+  treeIndex_1 = (x_104 + 1);
+  int const x_106 = treeIndex_1;
+  param_12 = x_106;
+  param_13 = 7;
+  insert_i1_i1_(&(param_12), &(param_13), tint_symbol_7);
+  int const x_108 = treeIndex_1;
+  treeIndex_1 = (x_108 + 1);
+  int const x_110 = treeIndex_1;
+  param_14 = x_110;
+  param_15 = 8;
+  insert_i1_i1_(&(param_14), &(param_15), tint_symbol_7);
+  int const x_112 = treeIndex_1;
+  treeIndex_1 = (x_112 + 1);
+  int const x_114 = treeIndex_1;
+  param_16 = x_114;
+  param_17 = 2;
+  insert_i1_i1_(&(param_16), &(param_17), tint_symbol_7);
+  int const x_116 = treeIndex_1;
+  treeIndex_1 = (x_116 + 1);
+  int const x_118 = treeIndex_1;
+  param_18 = x_118;
+  param_19 = 6;
+  insert_i1_i1_(&(param_18), &(param_19), tint_symbol_7);
+  int const x_120 = treeIndex_1;
+  treeIndex_1 = (x_120 + 1);
+  int const x_122 = treeIndex_1;
+  param_20 = x_122;
+  param_21 = 17;
+  insert_i1_i1_(&(param_20), &(param_21), tint_symbol_7);
+  int const x_124 = treeIndex_1;
+  treeIndex_1 = (x_124 + 1);
+  int const x_126 = treeIndex_1;
+  param_22 = x_126;
+  param_23 = 13;
+  insert_i1_i1_(&(param_22), &(param_23), tint_symbol_7);
+  count = 0;
+  i = 0;
+  while (true) {
+    int const x_132 = i;
+    if ((x_132 < 20)) {
+    } else {
+      break;
+    }
+    bool x_155 = false;
+    bool x_156_phi = false;
+    int const x_135 = i;
+    param_24 = x_135;
+    int const x_136 = search_i1_(&(param_24), tint_symbol_7);
+    result = x_136;
+    int const x_137 = i;
+    switch(x_137) {
+      case 2:
+      case 5:
+      case 6:
+      case 7:
+      case 8:
+      case 9:
+      case 12:
+      case 13:
+      case 15:
+      case 17: {
+        int const x_147 = result;
+        int const x_148 = i;
+        bool const x_149 = (x_147 == x_148);
+        x_156_phi = x_149;
+        if (!(x_149)) {
+          float const x_154 = (*(tint_symbol_8)).x;
+          x_155 = (x_154 < 0.0f);
+          x_156_phi = x_155;
+        }
+        bool const x_156 = x_156_phi;
+        if (x_156) {
+          int const x_159 = count;
+          count = (x_159 + 1);
+        }
+        break;
+      }
+      default: {
+        int const x_141 = result;
+        if ((x_141 == -1)) {
+          int const x_145 = count;
+          count = (x_145 + 1);
+        }
+        break;
+      }
+    }
+    {
+      int const x_161 = i;
+      i = (x_161 + 1);
+    }
+  }
+  int const x_163 = count;
+  if ((x_163 == 20)) {
+    *(tint_symbol_9) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_9) = float4(0.0f, 0.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_10 = 0.0f;
+  thread tint_array_wrapper tint_symbol_11 = {};
+  thread float4 tint_symbol_12 = 0.0f;
+  tint_symbol_10 = gl_FragCoord_param;
+  main_1(&(tint_symbol_11), &(tint_symbol_10), &(tint_symbol_12));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_12};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..b62cb2f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/1.wgsl.expected.spvasm
@@ -0,0 +1,505 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 333
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %BST "BST"
+               OpMemberName %BST 0 "data"
+               OpMemberName %BST 1 "leftIndex"
+               OpMemberName %BST 2 "rightIndex"
+               OpName %tree_1 "tree_1"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %makeTreeNode_struct_BST_i1_i1_i11_i1_ "makeTreeNode_struct_BST_i1_i1_i11_i1_"
+               OpName %tree "tree"
+               OpName %data "data"
+               OpName %insert_i1_i1_ "insert_i1_i1_"
+               OpName %treeIndex "treeIndex"
+               OpName %data_1 "data_1"
+               OpName %baseIndex "baseIndex"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %search_i1_ "search_i1_"
+               OpName %target "target"
+               OpName %index "index"
+               OpName %currentNode "currentNode"
+               OpName %x_231 "x_231"
+               OpName %main_1 "main_1"
+               OpName %treeIndex_1 "treeIndex_1"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpName %param_6 "param_6"
+               OpName %param_7 "param_7"
+               OpName %param_8 "param_8"
+               OpName %param_9 "param_9"
+               OpName %param_10 "param_10"
+               OpName %param_11 "param_11"
+               OpName %param_12 "param_12"
+               OpName %param_13 "param_13"
+               OpName %param_14 "param_14"
+               OpName %param_15 "param_15"
+               OpName %param_16 "param_16"
+               OpName %param_17 "param_17"
+               OpName %param_18 "param_18"
+               OpName %param_19 "param_19"
+               OpName %param_20 "param_20"
+               OpName %param_21 "param_21"
+               OpName %param_22 "param_22"
+               OpName %param_23 "param_23"
+               OpName %count "count"
+               OpName %i "i"
+               OpName %result "result"
+               OpName %param_24 "param_24"
+               OpName %x_155 "x_155"
+               OpName %x_156_phi "x_156_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpMemberDecorate %BST 0 Offset 0
+               OpMemberDecorate %BST 1 Offset 4
+               OpMemberDecorate %BST 2 Offset 8
+               OpDecorate %_arr_BST_uint_10 ArrayStride 12
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+        %BST = OpTypeStruct %int %int %int
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_BST_uint_10 = OpTypeArray %BST %uint_10
+%_ptr_Private__arr_BST_uint_10 = OpTypePointer Private %_arr_BST_uint_10
+          %8 = OpConstantNull %_arr_BST_uint_10
+     %tree_1 = OpVariable %_ptr_Private__arr_BST_uint_10 Private %8
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %13 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %13
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %13
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %13
+       %void = OpTypeVoid
+%_ptr_Function_BST = OpTypePointer Function %BST
+%_ptr_Function_int = OpTypePointer Function %int
+         %19 = OpTypeFunction %void %_ptr_Function_BST %_ptr_Function_int
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+     %int_n1 = OpConstant %int -1
+     %uint_2 = OpConstant %uint 2
+         %39 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+         %45 = OpConstantNull %int
+         %47 = OpConstantNull %BST
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+%_ptr_Private_int = OpTypePointer Private %int
+%_ptr_Private_BST = OpTypePointer Private %BST
+        %125 = OpTypeFunction %int %_ptr_Function_int
+        %166 = OpTypeFunction %void
+      %int_9 = OpConstant %int 9
+      %int_1 = OpConstant %int 1
+      %int_5 = OpConstant %int 5
+     %int_12 = OpConstant %int 12
+     %int_15 = OpConstant %int 15
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+      %int_2 = OpConstant %int 2
+      %int_6 = OpConstant %int 6
+     %int_17 = OpConstant %int 17
+     %int_13 = OpConstant %int 13
+     %int_20 = OpConstant %int 20
+%_ptr_Function_bool = OpTypePointer Function %bool
+        %278 = OpConstantNull %bool
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+        %318 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %319 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+        %320 = OpTypeFunction %void %main_out
+%makeTreeNode_struct_BST_i1_i1_i11_i1_ = OpFunction %void None %19
+       %tree = OpFunctionParameter %_ptr_Function_BST
+       %data = OpFunctionParameter %_ptr_Function_int
+         %26 = OpLabel
+         %28 = OpLoad %int %data
+         %31 = OpAccessChain %_ptr_Function_int %tree %uint_0
+               OpStore %31 %28
+         %34 = OpAccessChain %_ptr_Function_int %tree %uint_1
+               OpStore %34 %int_n1
+         %38 = OpAccessChain %_ptr_Function_int %tree %uint_2
+               OpStore %38 %int_n1
+               OpReturn
+               OpFunctionEnd
+%insert_i1_i1_ = OpFunction %void None %39
+  %treeIndex = OpFunctionParameter %_ptr_Function_int
+     %data_1 = OpFunctionParameter %_ptr_Function_int
+         %43 = OpLabel
+  %baseIndex = OpVariable %_ptr_Function_int Function %45
+      %param = OpVariable %_ptr_Function_BST Function %47
+    %param_1 = OpVariable %_ptr_Function_int Function %45
+    %param_2 = OpVariable %_ptr_Function_BST Function %47
+    %param_3 = OpVariable %_ptr_Function_int Function %45
+               OpStore %baseIndex %int_0
+               OpBranch %52
+         %52 = OpLabel
+               OpLoopMerge %53 %54 None
+               OpBranch %55
+         %55 = OpLabel
+         %56 = OpLoad %int %baseIndex
+         %58 = OpLoad %int %treeIndex
+         %59 = OpSLessThanEqual %bool %56 %58
+               OpSelectionMerge %61 None
+               OpBranchConditional %59 %62 %63
+         %62 = OpLabel
+               OpBranch %61
+         %63 = OpLabel
+               OpBranch %53
+         %61 = OpLabel
+         %65 = OpLoad %int %data_1
+         %66 = OpLoad %int %baseIndex
+         %68 = OpAccessChain %_ptr_Private_int %tree_1 %66 %uint_0
+         %69 = OpLoad %int %68
+         %70 = OpSLessThanEqual %bool %65 %69
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %73
+         %72 = OpLabel
+         %74 = OpLoad %int %baseIndex
+         %75 = OpAccessChain %_ptr_Private_int %tree_1 %74 %uint_1
+         %76 = OpLoad %int %75
+         %77 = OpIEqual %bool %76 %int_n1
+               OpSelectionMerge %78 None
+               OpBranchConditional %77 %79 %80
+         %79 = OpLabel
+         %81 = OpLoad %int %baseIndex
+         %83 = OpLoad %int %treeIndex
+         %84 = OpAccessChain %_ptr_Private_int %tree_1 %81 %uint_1
+               OpStore %84 %83
+         %86 = OpLoad %int %treeIndex
+         %88 = OpAccessChain %_ptr_Private_BST %tree_1 %86
+         %89 = OpLoad %BST %88
+               OpStore %param %89
+         %91 = OpLoad %int %data_1
+               OpStore %param_1 %91
+         %92 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param %param_1
+         %95 = OpLoad %BST %param
+         %96 = OpAccessChain %_ptr_Private_BST %tree_1 %86
+               OpStore %96 %95
+               OpReturn
+         %80 = OpLabel
+         %97 = OpLoad %int %baseIndex
+         %98 = OpAccessChain %_ptr_Private_int %tree_1 %97 %uint_1
+         %99 = OpLoad %int %98
+               OpStore %baseIndex %99
+               OpBranch %54
+         %78 = OpLabel
+               OpReturn
+         %73 = OpLabel
+        %100 = OpLoad %int %baseIndex
+        %101 = OpAccessChain %_ptr_Private_int %tree_1 %100 %uint_2
+        %102 = OpLoad %int %101
+        %103 = OpIEqual %bool %102 %int_n1
+               OpSelectionMerge %104 None
+               OpBranchConditional %103 %105 %106
+        %105 = OpLabel
+        %107 = OpLoad %int %baseIndex
+        %109 = OpLoad %int %treeIndex
+        %110 = OpAccessChain %_ptr_Private_int %tree_1 %107 %uint_2
+               OpStore %110 %109
+        %112 = OpLoad %int %treeIndex
+        %113 = OpAccessChain %_ptr_Private_BST %tree_1 %112
+        %114 = OpLoad %BST %113
+               OpStore %param_2 %114
+        %116 = OpLoad %int %data_1
+               OpStore %param_3 %116
+        %117 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param_2 %param_3
+        %120 = OpLoad %BST %param_2
+        %121 = OpAccessChain %_ptr_Private_BST %tree_1 %112
+               OpStore %121 %120
+               OpReturn
+        %106 = OpLabel
+        %122 = OpLoad %int %baseIndex
+        %123 = OpAccessChain %_ptr_Private_int %tree_1 %122 %uint_2
+        %124 = OpLoad %int %123
+               OpStore %baseIndex %124
+               OpBranch %54
+        %104 = OpLabel
+               OpReturn
+         %71 = OpLabel
+               OpReturn
+         %54 = OpLabel
+               OpBranch %52
+         %53 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %search_i1_ = OpFunction %int None %125
+     %target = OpFunctionParameter %_ptr_Function_int
+        %128 = OpLabel
+      %index = OpVariable %_ptr_Function_int Function %45
+%currentNode = OpVariable %_ptr_Function_BST Function %47
+      %x_231 = OpVariable %_ptr_Function_int Function %45
+               OpStore %index %int_0
+               OpBranch %132
+        %132 = OpLabel
+               OpLoopMerge %133 %134 None
+               OpBranch %135
+        %135 = OpLabel
+        %136 = OpLoad %int %index
+        %137 = OpINotEqual %bool %136 %int_n1
+               OpSelectionMerge %138 None
+               OpBranchConditional %137 %139 %140
+        %139 = OpLabel
+               OpBranch %138
+        %140 = OpLabel
+               OpBranch %133
+        %138 = OpLabel
+        %141 = OpLoad %int %index
+        %142 = OpAccessChain %_ptr_Private_BST %tree_1 %141
+        %143 = OpLoad %BST %142
+               OpStore %currentNode %143
+        %144 = OpAccessChain %_ptr_Function_int %currentNode %uint_0
+        %145 = OpLoad %int %144
+        %147 = OpLoad %int %target
+        %148 = OpIEqual %bool %145 %147
+               OpSelectionMerge %149 None
+               OpBranchConditional %148 %150 %149
+        %150 = OpLabel
+        %152 = OpLoad %int %target
+               OpReturnValue %152
+        %149 = OpLabel
+        %154 = OpLoad %int %target
+        %155 = OpAccessChain %_ptr_Function_int %currentNode %uint_0
+        %156 = OpLoad %int %155
+        %157 = OpSGreaterThan %bool %154 %156
+               OpSelectionMerge %158 None
+               OpBranchConditional %157 %159 %160
+        %159 = OpLabel
+        %161 = OpAccessChain %_ptr_Function_int %currentNode %uint_2
+        %162 = OpLoad %int %161
+               OpStore %x_231 %162
+               OpBranch %158
+        %160 = OpLabel
+        %163 = OpAccessChain %_ptr_Function_int %currentNode %uint_1
+        %164 = OpLoad %int %163
+               OpStore %x_231 %164
+               OpBranch %158
+        %158 = OpLabel
+        %165 = OpLoad %int %x_231
+               OpStore %index %165
+               OpBranch %134
+        %134 = OpLabel
+               OpBranch %132
+        %133 = OpLabel
+               OpReturnValue %int_n1
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %166
+        %168 = OpLabel
+%treeIndex_1 = OpVariable %_ptr_Function_int Function %45
+    %param_4 = OpVariable %_ptr_Function_BST Function %47
+    %param_5 = OpVariable %_ptr_Function_int Function %45
+    %param_6 = OpVariable %_ptr_Function_int Function %45
+    %param_7 = OpVariable %_ptr_Function_int Function %45
+    %param_8 = OpVariable %_ptr_Function_int Function %45
+    %param_9 = OpVariable %_ptr_Function_int Function %45
+   %param_10 = OpVariable %_ptr_Function_int Function %45
+   %param_11 = OpVariable %_ptr_Function_int Function %45
+   %param_12 = OpVariable %_ptr_Function_int Function %45
+   %param_13 = OpVariable %_ptr_Function_int Function %45
+   %param_14 = OpVariable %_ptr_Function_int Function %45
+   %param_15 = OpVariable %_ptr_Function_int Function %45
+   %param_16 = OpVariable %_ptr_Function_int Function %45
+   %param_17 = OpVariable %_ptr_Function_int Function %45
+   %param_18 = OpVariable %_ptr_Function_int Function %45
+   %param_19 = OpVariable %_ptr_Function_int Function %45
+   %param_20 = OpVariable %_ptr_Function_int Function %45
+   %param_21 = OpVariable %_ptr_Function_int Function %45
+   %param_22 = OpVariable %_ptr_Function_int Function %45
+   %param_23 = OpVariable %_ptr_Function_int Function %45
+      %count = OpVariable %_ptr_Function_int Function %45
+          %i = OpVariable %_ptr_Function_int Function %45
+     %result = OpVariable %_ptr_Function_int Function %45
+   %param_24 = OpVariable %_ptr_Function_int Function %45
+      %x_155 = OpVariable %_ptr_Function_bool Function %278
+  %x_156_phi = OpVariable %_ptr_Function_bool Function %278
+               OpStore %treeIndex_1 %int_0
+        %194 = OpAccessChain %_ptr_Private_BST %tree_1 %int_0
+        %195 = OpLoad %BST %194
+               OpStore %param_4 %195
+               OpStore %param_5 %int_9
+        %197 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param_4 %param_5
+        %200 = OpLoad %BST %param_4
+        %201 = OpAccessChain %_ptr_Private_BST %tree_1 %int_0
+               OpStore %201 %200
+        %202 = OpLoad %int %treeIndex_1
+        %204 = OpIAdd %int %202 %int_1
+               OpStore %treeIndex_1 %204
+        %205 = OpLoad %int %treeIndex_1
+               OpStore %param_6 %205
+               OpStore %param_7 %int_5
+        %207 = OpFunctionCall %void %insert_i1_i1_ %param_6 %param_7
+        %210 = OpLoad %int %treeIndex_1
+        %211 = OpIAdd %int %210 %int_1
+               OpStore %treeIndex_1 %211
+        %212 = OpLoad %int %treeIndex_1
+               OpStore %param_8 %212
+               OpStore %param_9 %int_12
+        %214 = OpFunctionCall %void %insert_i1_i1_ %param_8 %param_9
+        %217 = OpLoad %int %treeIndex_1
+        %218 = OpIAdd %int %217 %int_1
+               OpStore %treeIndex_1 %218
+        %219 = OpLoad %int %treeIndex_1
+               OpStore %param_10 %219
+               OpStore %param_11 %int_15
+        %221 = OpFunctionCall %void %insert_i1_i1_ %param_10 %param_11
+        %224 = OpLoad %int %treeIndex_1
+        %225 = OpIAdd %int %224 %int_1
+               OpStore %treeIndex_1 %225
+        %226 = OpLoad %int %treeIndex_1
+               OpStore %param_12 %226
+               OpStore %param_13 %int_7
+        %228 = OpFunctionCall %void %insert_i1_i1_ %param_12 %param_13
+        %231 = OpLoad %int %treeIndex_1
+        %232 = OpIAdd %int %231 %int_1
+               OpStore %treeIndex_1 %232
+        %233 = OpLoad %int %treeIndex_1
+               OpStore %param_14 %233
+               OpStore %param_15 %int_8
+        %235 = OpFunctionCall %void %insert_i1_i1_ %param_14 %param_15
+        %238 = OpLoad %int %treeIndex_1
+        %239 = OpIAdd %int %238 %int_1
+               OpStore %treeIndex_1 %239
+        %240 = OpLoad %int %treeIndex_1
+               OpStore %param_16 %240
+               OpStore %param_17 %int_2
+        %242 = OpFunctionCall %void %insert_i1_i1_ %param_16 %param_17
+        %245 = OpLoad %int %treeIndex_1
+        %246 = OpIAdd %int %245 %int_1
+               OpStore %treeIndex_1 %246
+        %247 = OpLoad %int %treeIndex_1
+               OpStore %param_18 %247
+               OpStore %param_19 %int_6
+        %249 = OpFunctionCall %void %insert_i1_i1_ %param_18 %param_19
+        %252 = OpLoad %int %treeIndex_1
+        %253 = OpIAdd %int %252 %int_1
+               OpStore %treeIndex_1 %253
+        %254 = OpLoad %int %treeIndex_1
+               OpStore %param_20 %254
+               OpStore %param_21 %int_17
+        %256 = OpFunctionCall %void %insert_i1_i1_ %param_20 %param_21
+        %259 = OpLoad %int %treeIndex_1
+        %260 = OpIAdd %int %259 %int_1
+               OpStore %treeIndex_1 %260
+        %261 = OpLoad %int %treeIndex_1
+               OpStore %param_22 %261
+               OpStore %param_23 %int_13
+        %263 = OpFunctionCall %void %insert_i1_i1_ %param_22 %param_23
+               OpStore %count %int_0
+               OpStore %i %int_0
+               OpBranch %266
+        %266 = OpLabel
+               OpLoopMerge %267 %268 None
+               OpBranch %269
+        %269 = OpLabel
+        %270 = OpLoad %int %i
+        %272 = OpSLessThan %bool %270 %int_20
+               OpSelectionMerge %273 None
+               OpBranchConditional %272 %274 %275
+        %274 = OpLabel
+               OpBranch %273
+        %275 = OpLabel
+               OpBranch %267
+        %273 = OpLabel
+        %280 = OpLoad %int %i
+               OpStore %param_24 %280
+        %281 = OpFunctionCall %int %search_i1_ %param_24
+               OpStore %result %281
+        %283 = OpLoad %int %i
+               OpSelectionMerge %284 None
+               OpSwitch %283 %285 2 %286 5 %286 6 %286 7 %286 8 %286 9 %286 12 %286 13 %286 15 %286 17 %286
+        %286 = OpLabel
+        %287 = OpLoad %int %result
+        %288 = OpLoad %int %i
+        %289 = OpIEqual %bool %287 %288
+               OpStore %x_156_phi %289
+        %290 = OpLogicalNot %bool %289
+               OpSelectionMerge %291 None
+               OpBranchConditional %290 %292 %291
+        %292 = OpLabel
+        %294 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+        %295 = OpLoad %float %294
+        %297 = OpFOrdLessThan %bool %295 %float_0
+               OpStore %x_155 %297
+        %298 = OpLoad %bool %x_155
+               OpStore %x_156_phi %298
+               OpBranch %291
+        %291 = OpLabel
+        %299 = OpLoad %bool %x_156_phi
+               OpSelectionMerge %300 None
+               OpBranchConditional %299 %301 %300
+        %301 = OpLabel
+        %302 = OpLoad %int %count
+        %303 = OpIAdd %int %302 %int_1
+               OpStore %count %303
+               OpBranch %300
+        %300 = OpLabel
+               OpBranch %284
+        %285 = OpLabel
+        %304 = OpLoad %int %result
+        %305 = OpIEqual %bool %304 %int_n1
+               OpSelectionMerge %306 None
+               OpBranchConditional %305 %307 %306
+        %307 = OpLabel
+        %308 = OpLoad %int %count
+        %309 = OpIAdd %int %308 %int_1
+               OpStore %count %309
+               OpBranch %306
+        %306 = OpLabel
+               OpBranch %284
+        %284 = OpLabel
+               OpBranch %268
+        %268 = OpLabel
+        %310 = OpLoad %int %i
+        %311 = OpIAdd %int %310 %int_1
+               OpStore %i %311
+               OpBranch %266
+        %267 = OpLabel
+        %312 = OpLoad %int %count
+        %313 = OpIEqual %bool %312 %int_20
+               OpSelectionMerge %314 None
+               OpBranchConditional %313 %315 %316
+        %315 = OpLabel
+               OpStore %x_GLF_color %318
+               OpBranch %314
+        %316 = OpLabel
+               OpStore %x_GLF_color %319
+               OpBranch %314
+        %314 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %320
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %324 = OpLabel
+        %325 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %325
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %166
+        %327 = OpLabel
+        %328 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %328
+        %329 = OpFunctionCall %void %main_1
+        %331 = OpLoad %v4float %x_GLF_color
+        %332 = OpCompositeConstruct %main_out %331
+        %330 = OpFunctionCall %void %tint_symbol_3 %332
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..4d268f6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-fragcoord-less-than-zero/1.wgsl.expected.wgsl
@@ -0,0 +1,277 @@
+struct BST {
+  data : i32;
+  leftIndex : i32;
+  rightIndex : i32;
+};
+
+var<private> tree_1 : array<BST, 10>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn makeTreeNode_struct_BST_i1_i1_i11_i1_(tree : ptr<function, BST>, data : ptr<function, i32>) {
+  let x_169 : i32 = *(data);
+  (*(tree)).data = x_169;
+  (*(tree)).leftIndex = -1;
+  (*(tree)).rightIndex = -1;
+  return;
+}
+
+fn insert_i1_i1_(treeIndex : ptr<function, i32>, data_1 : ptr<function, i32>) {
+  var baseIndex : i32;
+  var param : BST;
+  var param_1 : i32;
+  var param_2 : BST;
+  var param_3 : i32;
+  baseIndex = 0;
+  loop {
+    let x_178 : i32 = baseIndex;
+    let x_179 : i32 = *(treeIndex);
+    if ((x_178 <= x_179)) {
+    } else {
+      break;
+    }
+    let x_182 : i32 = *(data_1);
+    let x_183 : i32 = baseIndex;
+    let x_185 : i32 = tree_1[x_183].data;
+    if ((x_182 <= x_185)) {
+      let x_190 : i32 = baseIndex;
+      let x_192 : i32 = tree_1[x_190].leftIndex;
+      if ((x_192 == -1)) {
+        let x_197 : i32 = baseIndex;
+        let x_198 : i32 = *(treeIndex);
+        tree_1[x_197].leftIndex = x_198;
+        let x_200 : i32 = *(treeIndex);
+        let x_202 : BST = tree_1[x_200];
+        param = x_202;
+        let x_203 : i32 = *(data_1);
+        param_1 = x_203;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param), &(param_1));
+        let x_205 : BST = param;
+        tree_1[x_200] = x_205;
+        return;
+      } else {
+        let x_207 : i32 = baseIndex;
+        let x_209 : i32 = tree_1[x_207].leftIndex;
+        baseIndex = x_209;
+        continue;
+      }
+      return;
+    } else {
+      let x_210 : i32 = baseIndex;
+      let x_212 : i32 = tree_1[x_210].rightIndex;
+      if ((x_212 == -1)) {
+        let x_217 : i32 = baseIndex;
+        let x_218 : i32 = *(treeIndex);
+        tree_1[x_217].rightIndex = x_218;
+        let x_220 : i32 = *(treeIndex);
+        let x_222 : BST = tree_1[x_220];
+        param_2 = x_222;
+        let x_223 : i32 = *(data_1);
+        param_3 = x_223;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_2), &(param_3));
+        let x_225 : BST = param_2;
+        tree_1[x_220] = x_225;
+        return;
+      } else {
+        let x_227 : i32 = baseIndex;
+        let x_229 : i32 = tree_1[x_227].rightIndex;
+        baseIndex = x_229;
+        continue;
+      }
+      return;
+    }
+    return;
+  }
+  return;
+}
+
+fn search_i1_(target : ptr<function, i32>) -> i32 {
+  var index : i32;
+  var currentNode : BST;
+  var x_231 : i32;
+  index = 0;
+  loop {
+    let x_236 : i32 = index;
+    if ((x_236 != -1)) {
+    } else {
+      break;
+    }
+    let x_239 : i32 = index;
+    let x_241 : BST = tree_1[x_239];
+    currentNode = x_241;
+    let x_243 : i32 = currentNode.data;
+    let x_244 : i32 = *(target);
+    if ((x_243 == x_244)) {
+      let x_248 : i32 = *(target);
+      return x_248;
+    }
+    let x_249 : i32 = *(target);
+    let x_251 : i32 = currentNode.data;
+    if ((x_249 > x_251)) {
+      let x_257 : i32 = currentNode.rightIndex;
+      x_231 = x_257;
+    } else {
+      let x_259 : i32 = currentNode.leftIndex;
+      x_231 = x_259;
+    }
+    let x_260 : i32 = x_231;
+    index = x_260;
+  }
+  return -1;
+}
+
+fn main_1() {
+  var treeIndex_1 : i32;
+  var param_4 : BST;
+  var param_5 : i32;
+  var param_6 : i32;
+  var param_7 : i32;
+  var param_8 : i32;
+  var param_9 : i32;
+  var param_10 : i32;
+  var param_11 : i32;
+  var param_12 : i32;
+  var param_13 : i32;
+  var param_14 : i32;
+  var param_15 : i32;
+  var param_16 : i32;
+  var param_17 : i32;
+  var param_18 : i32;
+  var param_19 : i32;
+  var param_20 : i32;
+  var param_21 : i32;
+  var param_22 : i32;
+  var param_23 : i32;
+  var count : i32;
+  var i : i32;
+  var result : i32;
+  var param_24 : i32;
+  treeIndex_1 = 0;
+  let x_88 : BST = tree_1[0];
+  param_4 = x_88;
+  param_5 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_4), &(param_5));
+  let x_90 : BST = param_4;
+  tree_1[0] = x_90;
+  let x_92 : i32 = treeIndex_1;
+  treeIndex_1 = (x_92 + 1);
+  let x_94 : i32 = treeIndex_1;
+  param_6 = x_94;
+  param_7 = 5;
+  insert_i1_i1_(&(param_6), &(param_7));
+  let x_96 : i32 = treeIndex_1;
+  treeIndex_1 = (x_96 + 1);
+  let x_98 : i32 = treeIndex_1;
+  param_8 = x_98;
+  param_9 = 12;
+  insert_i1_i1_(&(param_8), &(param_9));
+  let x_100 : i32 = treeIndex_1;
+  treeIndex_1 = (x_100 + 1);
+  let x_102 : i32 = treeIndex_1;
+  param_10 = x_102;
+  param_11 = 15;
+  insert_i1_i1_(&(param_10), &(param_11));
+  let x_104 : i32 = treeIndex_1;
+  treeIndex_1 = (x_104 + 1);
+  let x_106 : i32 = treeIndex_1;
+  param_12 = x_106;
+  param_13 = 7;
+  insert_i1_i1_(&(param_12), &(param_13));
+  let x_108 : i32 = treeIndex_1;
+  treeIndex_1 = (x_108 + 1);
+  let x_110 : i32 = treeIndex_1;
+  param_14 = x_110;
+  param_15 = 8;
+  insert_i1_i1_(&(param_14), &(param_15));
+  let x_112 : i32 = treeIndex_1;
+  treeIndex_1 = (x_112 + 1);
+  let x_114 : i32 = treeIndex_1;
+  param_16 = x_114;
+  param_17 = 2;
+  insert_i1_i1_(&(param_16), &(param_17));
+  let x_116 : i32 = treeIndex_1;
+  treeIndex_1 = (x_116 + 1);
+  let x_118 : i32 = treeIndex_1;
+  param_18 = x_118;
+  param_19 = 6;
+  insert_i1_i1_(&(param_18), &(param_19));
+  let x_120 : i32 = treeIndex_1;
+  treeIndex_1 = (x_120 + 1);
+  let x_122 : i32 = treeIndex_1;
+  param_20 = x_122;
+  param_21 = 17;
+  insert_i1_i1_(&(param_20), &(param_21));
+  let x_124 : i32 = treeIndex_1;
+  treeIndex_1 = (x_124 + 1);
+  let x_126 : i32 = treeIndex_1;
+  param_22 = x_126;
+  param_23 = 13;
+  insert_i1_i1_(&(param_22), &(param_23));
+  count = 0;
+  i = 0;
+  loop {
+    let x_132 : i32 = i;
+    if ((x_132 < 20)) {
+    } else {
+      break;
+    }
+    var x_155 : bool;
+    var x_156_phi : bool;
+    let x_135 : i32 = i;
+    param_24 = x_135;
+    let x_136 : i32 = search_i1_(&(param_24));
+    result = x_136;
+    let x_137 : i32 = i;
+    switch(x_137) {
+      case 2, 5, 6, 7, 8, 9, 12, 13, 15, 17: {
+        let x_147 : i32 = result;
+        let x_148 : i32 = i;
+        let x_149 : bool = (x_147 == x_148);
+        x_156_phi = x_149;
+        if (!(x_149)) {
+          let x_154 : f32 = gl_FragCoord.x;
+          x_155 = (x_154 < 0.0);
+          x_156_phi = x_155;
+        }
+        let x_156 : bool = x_156_phi;
+        if (x_156) {
+          let x_159 : i32 = count;
+          count = (x_159 + 1);
+        }
+      }
+      default: {
+        let x_141 : i32 = result;
+        if ((x_141 == -1)) {
+          let x_145 : i32 = count;
+          count = (x_145 + 1);
+        }
+      }
+    }
+
+    continuing {
+      let x_161 : i32 = i;
+      i = (x_161 + 1);
+    }
+  }
+  let x_163 : i32 = count;
+  if ((x_163 == 20)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-nested-if-and-conditional/1.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-nested-if-and-conditional/1.spvasm
new file mode 100644
index 0000000..be49363
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-nested-if-and-conditional/1.spvasm
@@ -0,0 +1,483 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %BST "BST"
+               OpMemberName %BST 0 "data"
+               OpMemberName %BST 1 "leftIndex"
+               OpMemberName %BST 2 "rightIndex"
+               OpName %makeTreeNode_struct_BST_i1_i1_i11_i1_ "makeTreeNode(struct-BST-i1-i1-i11;i1;"
+               OpName %tree "tree"
+               OpName %data "data"
+               OpName %insert_i1_i1_ "insert(i1;i1;"
+               OpName %treeIndex "treeIndex"
+               OpName %data_0 "data"
+               OpName %search_i1_ "search(i1;"
+               OpName %target "target"
+               OpName %baseIndex "baseIndex"
+               OpName %tree_0 "tree"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %param_1 "param"
+               OpName %param_2 "param"
+               OpName %index "index"
+               OpName %currentNode "currentNode"
+               OpName %treeIndex_0 "treeIndex"
+               OpName %param_3 "param"
+               OpName %param_4 "param"
+               OpName %param_5 "param"
+               OpName %param_6 "param"
+               OpName %param_7 "param"
+               OpName %param_8 "param"
+               OpName %param_9 "param"
+               OpName %param_10 "param"
+               OpName %param_11 "param"
+               OpName %param_12 "param"
+               OpName %param_13 "param"
+               OpName %param_14 "param"
+               OpName %param_15 "param"
+               OpName %param_16 "param"
+               OpName %param_17 "param"
+               OpName %param_18 "param"
+               OpName %param_19 "param"
+               OpName %param_20 "param"
+               OpName %param_21 "param"
+               OpName %param_22 "param"
+               OpName %count "count"
+               OpName %i "i"
+               OpName %result "result"
+               OpName %param_23 "param"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %49 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+        %BST = OpTypeStruct %int %int %int
+%_ptr_Function_BST = OpTypePointer Function %BST
+%_ptr_Function_int = OpTypePointer Function %int
+         %53 = OpTypeFunction %void %_ptr_Function_BST %_ptr_Function_int
+         %54 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+         %55 = OpTypeFunction %int %_ptr_Function_int
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+     %int_n1 = OpConstant %int -1
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_BST_uint_10 = OpTypeArray %BST %uint_10
+%_ptr_Private__arr_BST_uint_10 = OpTypePointer Private %_arr_BST_uint_10
+     %tree_0 = OpVariable %_ptr_Private__arr_BST_uint_10 Private
+%_ptr_Private_int = OpTypePointer Private %int
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_BST = OpTypePointer Private %BST
+      %int_9 = OpConstant %int 9
+      %int_5 = OpConstant %int 5
+     %int_12 = OpConstant %int 12
+     %int_15 = OpConstant %int 15
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+      %int_6 = OpConstant %int 6
+     %int_17 = OpConstant %int 17
+     %int_13 = OpConstant %int 13
+     %int_20 = OpConstant %int 20
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %87 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %88 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+       %main = OpFunction %void None %49
+         %89 = OpLabel
+%treeIndex_0 = OpVariable %_ptr_Function_int Function
+    %param_3 = OpVariable %_ptr_Function_BST Function
+    %param_4 = OpVariable %_ptr_Function_int Function
+    %param_5 = OpVariable %_ptr_Function_int Function
+    %param_6 = OpVariable %_ptr_Function_int Function
+    %param_7 = OpVariable %_ptr_Function_int Function
+    %param_8 = OpVariable %_ptr_Function_int Function
+    %param_9 = OpVariable %_ptr_Function_int Function
+   %param_10 = OpVariable %_ptr_Function_int Function
+   %param_11 = OpVariable %_ptr_Function_int Function
+   %param_12 = OpVariable %_ptr_Function_int Function
+   %param_13 = OpVariable %_ptr_Function_int Function
+   %param_14 = OpVariable %_ptr_Function_int Function
+   %param_15 = OpVariable %_ptr_Function_int Function
+   %param_16 = OpVariable %_ptr_Function_int Function
+   %param_17 = OpVariable %_ptr_Function_int Function
+   %param_18 = OpVariable %_ptr_Function_int Function
+   %param_19 = OpVariable %_ptr_Function_int Function
+   %param_20 = OpVariable %_ptr_Function_int Function
+   %param_21 = OpVariable %_ptr_Function_int Function
+   %param_22 = OpVariable %_ptr_Function_int Function
+      %count = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+     %result = OpVariable %_ptr_Function_int Function
+   %param_23 = OpVariable %_ptr_Function_int Function
+               OpStore %treeIndex_0 %int_0
+         %90 = OpAccessChain %_ptr_Private_BST %tree_0 %int_0
+         %91 = OpLoad %BST %90
+               OpStore %param_3 %91
+               OpStore %param_4 %int_9
+         %92 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param_3 %param_4
+         %93 = OpLoad %BST %param_3
+         %94 = OpAccessChain %_ptr_Private_BST %tree_0 %int_0
+               OpStore %94 %93
+         %95 = OpLoad %int %treeIndex_0
+         %96 = OpIAdd %int %95 %int_1
+               OpStore %treeIndex_0 %96
+         %97 = OpLoad %int %treeIndex_0
+               OpStore %param_5 %97
+               OpStore %param_6 %int_5
+         %98 = OpFunctionCall %void %insert_i1_i1_ %param_5 %param_6
+         %99 = OpLoad %int %treeIndex_0
+        %100 = OpIAdd %int %99 %int_1
+               OpStore %treeIndex_0 %100
+        %101 = OpLoad %int %treeIndex_0
+               OpStore %param_7 %101
+               OpStore %param_8 %int_12
+        %102 = OpFunctionCall %void %insert_i1_i1_ %param_7 %param_8
+        %103 = OpLoad %int %treeIndex_0
+        %104 = OpIAdd %int %103 %int_1
+               OpStore %treeIndex_0 %104
+        %105 = OpLoad %int %treeIndex_0
+               OpStore %param_9 %105
+               OpStore %param_10 %int_15
+        %106 = OpFunctionCall %void %insert_i1_i1_ %param_9 %param_10
+        %107 = OpLoad %int %treeIndex_0
+        %108 = OpIAdd %int %107 %int_1
+               OpStore %treeIndex_0 %108
+        %109 = OpLoad %int %treeIndex_0
+               OpStore %param_11 %109
+               OpStore %param_12 %int_7
+        %110 = OpFunctionCall %void %insert_i1_i1_ %param_11 %param_12
+        %111 = OpLoad %int %treeIndex_0
+        %112 = OpIAdd %int %111 %int_1
+               OpStore %treeIndex_0 %112
+        %113 = OpLoad %int %treeIndex_0
+               OpStore %param_13 %113
+               OpStore %param_14 %int_8
+        %114 = OpFunctionCall %void %insert_i1_i1_ %param_13 %param_14
+        %115 = OpLoad %int %treeIndex_0
+        %116 = OpIAdd %int %115 %int_1
+               OpStore %treeIndex_0 %116
+        %117 = OpLoad %int %treeIndex_0
+               OpStore %param_15 %117
+               OpStore %param_16 %int_2
+        %118 = OpFunctionCall %void %insert_i1_i1_ %param_15 %param_16
+        %119 = OpLoad %int %treeIndex_0
+        %120 = OpIAdd %int %119 %int_1
+               OpStore %treeIndex_0 %120
+        %121 = OpLoad %int %treeIndex_0
+               OpStore %param_17 %121
+               OpStore %param_18 %int_6
+        %122 = OpFunctionCall %void %insert_i1_i1_ %param_17 %param_18
+        %123 = OpLoad %int %treeIndex_0
+        %124 = OpIAdd %int %123 %int_1
+               OpStore %treeIndex_0 %124
+        %125 = OpLoad %int %treeIndex_0
+               OpStore %param_19 %125
+               OpStore %param_20 %int_17
+        %126 = OpFunctionCall %void %insert_i1_i1_ %param_19 %param_20
+        %127 = OpLoad %int %treeIndex_0
+        %128 = OpIAdd %int %127 %int_1
+               OpStore %treeIndex_0 %128
+        %129 = OpLoad %int %treeIndex_0
+               OpStore %param_21 %129
+               OpStore %param_22 %int_13
+        %130 = OpFunctionCall %void %insert_i1_i1_ %param_21 %param_22
+               OpStore %count %int_0
+               OpStore %i %int_0
+               OpBranch %131
+        %131 = OpLabel
+               OpLoopMerge %132 %133 None
+               OpBranch %134
+        %134 = OpLabel
+        %135 = OpLoad %int %i
+        %136 = OpSLessThan %bool %135 %int_20
+               OpBranchConditional %136 %137 %132
+        %137 = OpLabel
+        %138 = OpLoad %int %i
+               OpStore %param_23 %138
+        %139 = OpFunctionCall %int %search_i1_ %param_23
+               OpStore %result %139
+        %140 = OpLoad %int %i
+               OpSelectionMerge %141 None
+               OpSwitch %140 %142 9 %143 5 %143 12 %143 15 %143 7 %143 8 %143 2 %143 6 %143 17 %143 13 %143
+        %142 = OpLabel
+        %144 = OpLoad %int %result
+        %145 = OpIEqual %bool %144 %int_n1
+               OpSelectionMerge %146 None
+               OpBranchConditional %145 %147 %146
+        %147 = OpLabel
+        %148 = OpLoad %int %count
+        %149 = OpIAdd %int %148 %int_1
+               OpStore %count %149
+               OpBranch %146
+        %146 = OpLabel
+               OpBranch %141
+        %143 = OpLabel
+        %150 = OpLoad %int %result
+        %151 = OpLoad %int %i
+        %152 = OpIEqual %bool %150 %151
+               OpSelectionMerge %153 None
+               OpBranchConditional %152 %154 %153
+        %154 = OpLabel
+        %155 = OpLoad %int %count
+        %156 = OpIAdd %int %155 %int_1
+               OpStore %count %156
+               OpBranch %153
+        %153 = OpLabel
+               OpBranch %141
+        %141 = OpLabel
+               OpBranch %133
+        %133 = OpLabel
+        %157 = OpLoad %int %i
+        %158 = OpIAdd %int %157 %int_1
+               OpStore %i %158
+               OpBranch %131
+        %132 = OpLabel
+        %159 = OpLoad %int %count
+        %160 = OpIEqual %bool %159 %int_20
+               OpSelectionMerge %161 None
+               OpBranchConditional %160 %162 %163
+        %162 = OpLabel
+               OpStore %_GLF_color %87
+               OpBranch %161
+        %163 = OpLabel
+               OpStore %_GLF_color %88
+               OpBranch %161
+        %161 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%makeTreeNode_struct_BST_i1_i1_i11_i1_ = OpFunction %void None %53
+       %tree = OpFunctionParameter %_ptr_Function_BST
+       %data = OpFunctionParameter %_ptr_Function_int
+        %164 = OpLabel
+        %165 = OpLoad %int %data
+        %166 = OpAccessChain %_ptr_Function_int %tree %int_0
+               OpStore %166 %165
+        %167 = OpAccessChain %_ptr_Function_int %tree %int_1
+               OpStore %167 %int_n1
+        %168 = OpAccessChain %_ptr_Function_int %tree %int_2
+               OpStore %168 %int_n1
+               OpReturn
+               OpFunctionEnd
+%insert_i1_i1_ = OpFunction %void None %54
+  %treeIndex = OpFunctionParameter %_ptr_Function_int
+     %data_0 = OpFunctionParameter %_ptr_Function_int
+        %169 = OpLabel
+  %baseIndex = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_BST Function
+    %param_0 = OpVariable %_ptr_Function_int Function
+        %170 = OpVariable %_ptr_Function_int Function
+    %param_1 = OpVariable %_ptr_Function_BST Function
+    %param_2 = OpVariable %_ptr_Function_int Function
+               OpStore %baseIndex %int_0
+               OpBranch %171
+        %171 = OpLabel
+               OpLoopMerge %172 %173 None
+               OpBranch %174
+        %174 = OpLabel
+        %175 = OpLoad %int %baseIndex
+        %176 = OpLoad %int %treeIndex
+        %177 = OpSLessThanEqual %bool %175 %176
+               OpBranchConditional %177 %178 %172
+        %178 = OpLabel
+        %179 = OpLoad %int %data_0
+        %180 = OpLoad %int %baseIndex
+        %181 = OpAccessChain %_ptr_Private_int %tree_0 %180 %int_0
+        %182 = OpLoad %int %181
+        %183 = OpSLessThanEqual %bool %179 %182
+               OpSelectionMerge %184 None
+               OpBranchConditional %183 %185 %186
+        %185 = OpLabel
+        %187 = OpLoad %int %baseIndex
+        %188 = OpAccessChain %_ptr_Private_int %tree_0 %187 %int_1
+        %189 = OpLoad %int %188
+        %190 = OpIEqual %bool %189 %int_n1
+               OpSelectionMerge %191 None
+               OpBranchConditional %190 %192 %193
+        %192 = OpLabel
+        %194 = OpLoad %int %baseIndex
+        %195 = OpLoad %int %treeIndex
+        %196 = OpAccessChain %_ptr_Private_int %tree_0 %194 %int_1
+               OpStore %196 %195
+        %197 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+        %198 = OpLoad %float %197
+        %199 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+        %200 = OpLoad %float %199
+        %201 = OpFOrdLessThan %bool %198 %200
+               OpSelectionMerge %202 None
+               OpBranchConditional %201 %203 %202
+        %203 = OpLabel
+        %204 = OpLoad %int %treeIndex
+        %205 = OpAccessChain %_ptr_Private_BST %tree_0 %204
+        %206 = OpLoad %BST %205
+               OpStore %param %206
+        %207 = OpLoad %int %data_0
+               OpStore %param_0 %207
+        %208 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param %param_0
+        %209 = OpLoad %BST %param
+        %210 = OpAccessChain %_ptr_Private_BST %tree_0 %204
+               OpStore %210 %209
+               OpBranch %202
+        %202 = OpLabel
+        %211 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+        %212 = OpLoad %float %211
+        %213 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+        %214 = OpLoad %float %213
+        %215 = OpFOrdLessThan %bool %212 %214
+               OpSelectionMerge %216 None
+               OpBranchConditional %215 %217 %216
+        %217 = OpLabel
+               OpReturn
+        %216 = OpLabel
+               OpBranch %191
+        %193 = OpLabel
+        %218 = OpLoad %int %baseIndex
+        %219 = OpAccessChain %_ptr_Private_int %tree_0 %218 %int_1
+        %220 = OpLoad %int %219
+               OpStore %baseIndex %220
+               OpBranch %173
+        %191 = OpLabel
+               OpBranch %184
+        %186 = OpLabel
+        %221 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+        %222 = OpLoad %float %221
+        %223 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+        %224 = OpLoad %float %223
+        %225 = OpFOrdLessThan %bool %222 %224
+               OpSelectionMerge %226 None
+               OpBranchConditional %225 %227 %228
+        %227 = OpLabel
+        %229 = OpLoad %int %baseIndex
+        %230 = OpAccessChain %_ptr_Private_int %tree_0 %229 %int_2
+        %231 = OpLoad %int %230
+               OpStore %170 %231
+               OpBranch %226
+        %228 = OpLabel
+        %232 = OpLoad %int %baseIndex
+        %233 = OpAccessChain %_ptr_Private_int %tree_0 %232 %int_2
+        %234 = OpLoad %int %233
+               OpStore %170 %234
+               OpBranch %226
+        %226 = OpLabel
+        %235 = OpLoad %int %170
+        %236 = OpIEqual %bool %235 %int_n1
+               OpSelectionMerge %237 None
+               OpBranchConditional %236 %238 %239
+        %238 = OpLabel
+        %240 = OpLoad %int %baseIndex
+        %241 = OpLoad %int %treeIndex
+        %242 = OpAccessChain %_ptr_Private_int %tree_0 %240 %int_2
+               OpStore %242 %241
+        %243 = OpLoad %int %treeIndex
+        %244 = OpAccessChain %_ptr_Private_BST %tree_0 %243
+        %245 = OpLoad %BST %244
+               OpStore %param_1 %245
+        %246 = OpLoad %int %data_0
+               OpStore %param_2 %246
+        %247 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param_1 %param_2
+        %248 = OpLoad %BST %param_1
+        %249 = OpAccessChain %_ptr_Private_BST %tree_0 %243
+               OpStore %249 %248
+               OpReturn
+        %239 = OpLabel
+        %250 = OpLoad %int %baseIndex
+        %251 = OpAccessChain %_ptr_Private_int %tree_0 %250 %int_2
+        %252 = OpLoad %int %251
+               OpStore %baseIndex %252
+               OpBranch %173
+        %237 = OpLabel
+               OpUnreachable
+        %184 = OpLabel
+        %253 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+        %254 = OpLoad %float %253
+        %255 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+        %256 = OpLoad %float %255
+        %257 = OpFOrdGreaterThan %bool %254 %256
+               OpSelectionMerge %258 None
+               OpBranchConditional %257 %259 %258
+        %259 = OpLabel
+               OpReturn
+        %258 = OpLabel
+               OpBranch %173
+        %173 = OpLabel
+               OpBranch %171
+        %172 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %search_i1_ = OpFunction %int None %55
+     %target = OpFunctionParameter %_ptr_Function_int
+        %260 = OpLabel
+      %index = OpVariable %_ptr_Function_int Function
+%currentNode = OpVariable %_ptr_Function_BST Function
+        %261 = OpVariable %_ptr_Function_int Function
+               OpStore %index %int_0
+               OpBranch %262
+        %262 = OpLabel
+               OpLoopMerge %263 %264 None
+               OpBranch %265
+        %265 = OpLabel
+        %266 = OpLoad %int %index
+        %267 = OpINotEqual %bool %266 %int_n1
+               OpBranchConditional %267 %268 %263
+        %268 = OpLabel
+        %269 = OpLoad %int %index
+        %270 = OpAccessChain %_ptr_Private_BST %tree_0 %269
+        %271 = OpLoad %BST %270
+               OpStore %currentNode %271
+        %272 = OpAccessChain %_ptr_Function_int %currentNode %int_0
+        %273 = OpLoad %int %272
+        %274 = OpLoad %int %target
+        %275 = OpIEqual %bool %273 %274
+               OpSelectionMerge %276 None
+               OpBranchConditional %275 %277 %276
+        %277 = OpLabel
+        %278 = OpLoad %int %target
+               OpReturnValue %278
+        %276 = OpLabel
+        %279 = OpLoad %int %target
+        %280 = OpAccessChain %_ptr_Function_int %currentNode %int_0
+        %281 = OpLoad %int %280
+        %282 = OpSGreaterThan %bool %279 %281
+               OpSelectionMerge %283 None
+               OpBranchConditional %282 %284 %285
+        %284 = OpLabel
+        %286 = OpAccessChain %_ptr_Function_int %currentNode %int_2
+        %287 = OpLoad %int %286
+               OpStore %261 %287
+               OpBranch %283
+        %285 = OpLabel
+        %288 = OpAccessChain %_ptr_Function_int %currentNode %int_1
+        %289 = OpLoad %int %288
+               OpStore %261 %289
+               OpBranch %283
+        %283 = OpLabel
+        %290 = OpLoad %int %261
+               OpStore %index %290
+               OpBranch %264
+        %264 = OpLabel
+               OpBranch %262
+        %263 = OpLabel
+               OpReturnValue %int_n1
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-nested-if-and-conditional/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-nested-if-and-conditional/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..11cdc01
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-nested-if-and-conditional/1.spvasm.expected.hlsl
@@ -0,0 +1,255 @@
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+
+static BST tree_1[10] = (BST[10])0;
+cbuffer cbuffer_x_16 : register(b0, space0) {
+  uint4 x_16[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void makeTreeNode_struct_BST_i1_i1_i11_i1_(inout BST tree, inout int data) {
+  const int x_165 = data;
+  tree.data = x_165;
+  tree.leftIndex = -1;
+  tree.rightIndex = -1;
+  return;
+}
+
+void insert_i1_i1_(inout int treeIndex, inout int data_1) {
+  int baseIndex = 0;
+  BST param = (BST)0;
+  int param_1 = 0;
+  int x_170 = 0;
+  BST param_2 = (BST)0;
+  int param_3 = 0;
+  baseIndex = 0;
+  while (true) {
+    const int x_175 = baseIndex;
+    const int x_176 = treeIndex;
+    if ((x_175 <= x_176)) {
+    } else {
+      break;
+    }
+    const int x_179 = data_1;
+    const int x_182 = tree_1[baseIndex].data;
+    if ((x_179 <= x_182)) {
+      const int x_189 = tree_1[baseIndex].leftIndex;
+      if ((x_189 == -1)) {
+        const int x_194 = baseIndex;
+        const int x_195 = treeIndex;
+        tree_1[x_194].leftIndex = x_195;
+        const float x_198 = asfloat(x_16[0].x);
+        const float x_200 = asfloat(x_16[0].y);
+        if ((x_198 < x_200)) {
+          const int x_204 = treeIndex;
+          const BST x_206 = tree_1[x_204];
+          param = x_206;
+          const int x_207 = data_1;
+          param_1 = x_207;
+          makeTreeNode_struct_BST_i1_i1_i11_i1_(param, param_1);
+          tree_1[x_204] = param;
+        }
+        const float x_212 = asfloat(x_16[0].x);
+        const float x_214 = asfloat(x_16[0].y);
+        if ((x_212 < x_214)) {
+          return;
+        }
+      } else {
+        const int x_220 = tree_1[baseIndex].leftIndex;
+        baseIndex = x_220;
+        continue;
+      }
+    } else {
+      const float x_222 = asfloat(x_16[0].x);
+      const float x_224 = asfloat(x_16[0].y);
+      if ((x_222 < x_224)) {
+        const int x_231 = tree_1[baseIndex].rightIndex;
+        x_170 = x_231;
+      } else {
+        const int x_234 = tree_1[baseIndex].rightIndex;
+        x_170 = x_234;
+      }
+      if ((x_170 == -1)) {
+        const int x_240 = baseIndex;
+        const int x_241 = treeIndex;
+        tree_1[x_240].rightIndex = x_241;
+        const int x_243 = treeIndex;
+        const BST x_245 = tree_1[x_243];
+        param_2 = x_245;
+        const int x_246 = data_1;
+        param_3 = x_246;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(param_2, param_3);
+        tree_1[x_243] = param_2;
+        return;
+      } else {
+        const int x_252 = tree_1[baseIndex].rightIndex;
+        baseIndex = x_252;
+        continue;
+      }
+      return;
+    }
+    const float x_254 = asfloat(x_16[0].x);
+    const float x_256 = asfloat(x_16[0].y);
+    if ((x_254 > x_256)) {
+      return;
+    }
+  }
+  return;
+}
+
+int search_i1_(inout int target) {
+  int index = 0;
+  BST currentNode = (BST)0;
+  int x_261 = 0;
+  index = 0;
+  while (true) {
+    if ((index != -1)) {
+    } else {
+      break;
+    }
+    const BST x_271 = tree_1[index];
+    currentNode = x_271;
+    const int x_273 = currentNode.data;
+    const int x_274 = target;
+    if ((x_273 == x_274)) {
+      const int x_278 = target;
+      return x_278;
+    }
+    const int x_279 = target;
+    const int x_281 = currentNode.data;
+    if ((x_279 > x_281)) {
+      const int x_287 = currentNode.rightIndex;
+      x_261 = x_287;
+    } else {
+      const int x_289 = currentNode.leftIndex;
+      x_261 = x_289;
+    }
+    index = x_261;
+  }
+  return -1;
+}
+
+void main_1() {
+  int treeIndex_1 = 0;
+  BST param_4 = (BST)0;
+  int param_5 = 0;
+  int param_6 = 0;
+  int param_7 = 0;
+  int param_8 = 0;
+  int param_9 = 0;
+  int param_10 = 0;
+  int param_11 = 0;
+  int param_12 = 0;
+  int param_13 = 0;
+  int param_14 = 0;
+  int param_15 = 0;
+  int param_16 = 0;
+  int param_17 = 0;
+  int param_18 = 0;
+  int param_19 = 0;
+  int param_20 = 0;
+  int param_21 = 0;
+  int param_22 = 0;
+  int param_23 = 0;
+  int count = 0;
+  int i = 0;
+  int result = 0;
+  int param_24 = 0;
+  treeIndex_1 = 0;
+  const BST x_91 = tree_1[0];
+  param_4 = x_91;
+  param_5 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(param_4, param_5);
+  tree_1[0] = param_4;
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_6 = treeIndex_1;
+  param_7 = 5;
+  insert_i1_i1_(param_6, param_7);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_8 = treeIndex_1;
+  param_9 = 12;
+  insert_i1_i1_(param_8, param_9);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_10 = treeIndex_1;
+  param_11 = 15;
+  insert_i1_i1_(param_10, param_11);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_12 = treeIndex_1;
+  param_13 = 7;
+  insert_i1_i1_(param_12, param_13);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_14 = treeIndex_1;
+  param_15 = 8;
+  insert_i1_i1_(param_14, param_15);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_16 = treeIndex_1;
+  param_17 = 2;
+  insert_i1_i1_(param_16, param_17);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_18 = treeIndex_1;
+  param_19 = 6;
+  insert_i1_i1_(param_18, param_19);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_20 = treeIndex_1;
+  param_21 = 17;
+  insert_i1_i1_(param_20, param_21);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_22 = treeIndex_1;
+  param_23 = 13;
+  insert_i1_i1_(param_22, param_23);
+  count = 0;
+  i = 0;
+  {
+    for(; (i < 20); i = (i + 1)) {
+      param_24 = i;
+      const int x_139 = search_i1_(param_24);
+      result = x_139;
+      switch(i) {
+        case 2:
+        case 5:
+        case 6:
+        case 7:
+        case 8:
+        case 9:
+        case 12:
+        case 13:
+        case 15:
+        case 17: {
+          if ((result == i)) {
+            count = (count + 1);
+          }
+          break;
+        }
+        default: {
+          if ((result == -1)) {
+            count = (count + 1);
+          }
+          break;
+        }
+      }
+    }
+  }
+  if ((count == 20)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-nested-if-and-conditional/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-nested-if-and-conditional/1.spvasm.expected.msl
new file mode 100644
index 0000000..17bc280
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-nested-if-and-conditional/1.spvasm.expected.msl
@@ -0,0 +1,306 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  BST arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void makeTreeNode_struct_BST_i1_i1_i11_i1_(thread BST* const tree, thread int* const data) {
+  int const x_165 = *(data);
+  (*(tree)).data = x_165;
+  (*(tree)).leftIndex = -1;
+  (*(tree)).rightIndex = -1;
+  return;
+}
+
+void insert_i1_i1_(constant buf0& x_16, thread int* const treeIndex, thread int* const data_1, thread tint_array_wrapper* const tint_symbol_4) {
+  int baseIndex = 0;
+  BST param = {};
+  int param_1 = 0;
+  int x_170 = 0;
+  BST param_2 = {};
+  int param_3 = 0;
+  baseIndex = 0;
+  while (true) {
+    int const x_175 = baseIndex;
+    int const x_176 = *(treeIndex);
+    if ((x_175 <= x_176)) {
+    } else {
+      break;
+    }
+    int const x_179 = *(data_1);
+    int const x_180 = baseIndex;
+    int const x_182 = (*(tint_symbol_4)).arr[x_180].data;
+    if ((x_179 <= x_182)) {
+      int const x_187 = baseIndex;
+      int const x_189 = (*(tint_symbol_4)).arr[x_187].leftIndex;
+      if ((x_189 == -1)) {
+        int const x_194 = baseIndex;
+        int const x_195 = *(treeIndex);
+        (*(tint_symbol_4)).arr[x_194].leftIndex = x_195;
+        float const x_198 = x_16.injectionSwitch.x;
+        float const x_200 = x_16.injectionSwitch.y;
+        if ((x_198 < x_200)) {
+          int const x_204 = *(treeIndex);
+          BST const x_206 = (*(tint_symbol_4)).arr[x_204];
+          param = x_206;
+          int const x_207 = *(data_1);
+          param_1 = x_207;
+          makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param), &(param_1));
+          BST const x_209 = param;
+          (*(tint_symbol_4)).arr[x_204] = x_209;
+        }
+        float const x_212 = x_16.injectionSwitch.x;
+        float const x_214 = x_16.injectionSwitch.y;
+        if ((x_212 < x_214)) {
+          return;
+        }
+      } else {
+        int const x_218 = baseIndex;
+        int const x_220 = (*(tint_symbol_4)).arr[x_218].leftIndex;
+        baseIndex = x_220;
+        continue;
+      }
+    } else {
+      float const x_222 = x_16.injectionSwitch.x;
+      float const x_224 = x_16.injectionSwitch.y;
+      if ((x_222 < x_224)) {
+        int const x_229 = baseIndex;
+        int const x_231 = (*(tint_symbol_4)).arr[x_229].rightIndex;
+        x_170 = x_231;
+      } else {
+        int const x_232 = baseIndex;
+        int const x_234 = (*(tint_symbol_4)).arr[x_232].rightIndex;
+        x_170 = x_234;
+      }
+      int const x_235 = x_170;
+      if ((x_235 == -1)) {
+        int const x_240 = baseIndex;
+        int const x_241 = *(treeIndex);
+        (*(tint_symbol_4)).arr[x_240].rightIndex = x_241;
+        int const x_243 = *(treeIndex);
+        BST const x_245 = (*(tint_symbol_4)).arr[x_243];
+        param_2 = x_245;
+        int const x_246 = *(data_1);
+        param_3 = x_246;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_2), &(param_3));
+        BST const x_248 = param_2;
+        (*(tint_symbol_4)).arr[x_243] = x_248;
+        return;
+      } else {
+        int const x_250 = baseIndex;
+        int const x_252 = (*(tint_symbol_4)).arr[x_250].rightIndex;
+        baseIndex = x_252;
+        continue;
+      }
+      return;
+    }
+    float const x_254 = x_16.injectionSwitch.x;
+    float const x_256 = x_16.injectionSwitch.y;
+    if ((x_254 > x_256)) {
+      return;
+    }
+  }
+  return;
+}
+
+int search_i1_(thread int* const target, thread tint_array_wrapper* const tint_symbol_5) {
+  int index = 0;
+  BST currentNode = {};
+  int x_261 = 0;
+  index = 0;
+  while (true) {
+    int const x_266 = index;
+    if ((x_266 != -1)) {
+    } else {
+      break;
+    }
+    int const x_269 = index;
+    BST const x_271 = (*(tint_symbol_5)).arr[x_269];
+    currentNode = x_271;
+    int const x_273 = currentNode.data;
+    int const x_274 = *(target);
+    if ((x_273 == x_274)) {
+      int const x_278 = *(target);
+      return x_278;
+    }
+    int const x_279 = *(target);
+    int const x_281 = currentNode.data;
+    if ((x_279 > x_281)) {
+      int const x_287 = currentNode.rightIndex;
+      x_261 = x_287;
+    } else {
+      int const x_289 = currentNode.leftIndex;
+      x_261 = x_289;
+    }
+    int const x_290 = x_261;
+    index = x_290;
+  }
+  return -1;
+}
+
+void main_1(constant buf0& x_16, thread tint_array_wrapper* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  int treeIndex_1 = 0;
+  BST param_4 = {};
+  int param_5 = 0;
+  int param_6 = 0;
+  int param_7 = 0;
+  int param_8 = 0;
+  int param_9 = 0;
+  int param_10 = 0;
+  int param_11 = 0;
+  int param_12 = 0;
+  int param_13 = 0;
+  int param_14 = 0;
+  int param_15 = 0;
+  int param_16 = 0;
+  int param_17 = 0;
+  int param_18 = 0;
+  int param_19 = 0;
+  int param_20 = 0;
+  int param_21 = 0;
+  int param_22 = 0;
+  int param_23 = 0;
+  int count = 0;
+  int i = 0;
+  int result = 0;
+  int param_24 = 0;
+  treeIndex_1 = 0;
+  BST const x_91 = (*(tint_symbol_6)).arr[0];
+  param_4 = x_91;
+  param_5 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_4), &(param_5));
+  BST const x_93 = param_4;
+  (*(tint_symbol_6)).arr[0] = x_93;
+  int const x_95 = treeIndex_1;
+  treeIndex_1 = (x_95 + 1);
+  int const x_97 = treeIndex_1;
+  param_6 = x_97;
+  param_7 = 5;
+  insert_i1_i1_(x_16, &(param_6), &(param_7), tint_symbol_6);
+  int const x_99 = treeIndex_1;
+  treeIndex_1 = (x_99 + 1);
+  int const x_101 = treeIndex_1;
+  param_8 = x_101;
+  param_9 = 12;
+  insert_i1_i1_(x_16, &(param_8), &(param_9), tint_symbol_6);
+  int const x_103 = treeIndex_1;
+  treeIndex_1 = (x_103 + 1);
+  int const x_105 = treeIndex_1;
+  param_10 = x_105;
+  param_11 = 15;
+  insert_i1_i1_(x_16, &(param_10), &(param_11), tint_symbol_6);
+  int const x_107 = treeIndex_1;
+  treeIndex_1 = (x_107 + 1);
+  int const x_109 = treeIndex_1;
+  param_12 = x_109;
+  param_13 = 7;
+  insert_i1_i1_(x_16, &(param_12), &(param_13), tint_symbol_6);
+  int const x_111 = treeIndex_1;
+  treeIndex_1 = (x_111 + 1);
+  int const x_113 = treeIndex_1;
+  param_14 = x_113;
+  param_15 = 8;
+  insert_i1_i1_(x_16, &(param_14), &(param_15), tint_symbol_6);
+  int const x_115 = treeIndex_1;
+  treeIndex_1 = (x_115 + 1);
+  int const x_117 = treeIndex_1;
+  param_16 = x_117;
+  param_17 = 2;
+  insert_i1_i1_(x_16, &(param_16), &(param_17), tint_symbol_6);
+  int const x_119 = treeIndex_1;
+  treeIndex_1 = (x_119 + 1);
+  int const x_121 = treeIndex_1;
+  param_18 = x_121;
+  param_19 = 6;
+  insert_i1_i1_(x_16, &(param_18), &(param_19), tint_symbol_6);
+  int const x_123 = treeIndex_1;
+  treeIndex_1 = (x_123 + 1);
+  int const x_125 = treeIndex_1;
+  param_20 = x_125;
+  param_21 = 17;
+  insert_i1_i1_(x_16, &(param_20), &(param_21), tint_symbol_6);
+  int const x_127 = treeIndex_1;
+  treeIndex_1 = (x_127 + 1);
+  int const x_129 = treeIndex_1;
+  param_22 = x_129;
+  param_23 = 13;
+  insert_i1_i1_(x_16, &(param_22), &(param_23), tint_symbol_6);
+  count = 0;
+  i = 0;
+  while (true) {
+    int const x_135 = i;
+    if ((x_135 < 20)) {
+    } else {
+      break;
+    }
+    int const x_138 = i;
+    param_24 = x_138;
+    int const x_139 = search_i1_(&(param_24), tint_symbol_6);
+    result = x_139;
+    int const x_140 = i;
+    switch(x_140) {
+      case 2:
+      case 5:
+      case 6:
+      case 7:
+      case 8:
+      case 9:
+      case 12:
+      case 13:
+      case 15:
+      case 17: {
+        int const x_150 = result;
+        int const x_151 = i;
+        if ((x_150 == x_151)) {
+          int const x_155 = count;
+          count = (x_155 + 1);
+        }
+        break;
+      }
+      default: {
+        int const x_144 = result;
+        if ((x_144 == -1)) {
+          int const x_148 = count;
+          count = (x_148 + 1);
+        }
+        break;
+      }
+    }
+    {
+      int const x_157 = i;
+      i = (x_157 + 1);
+    }
+  }
+  int const x_159 = count;
+  if ((x_159 == 20)) {
+    *(tint_symbol_7) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_7) = float4(0.0f, 0.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_16 [[buffer(0)]]) {
+  thread tint_array_wrapper tint_symbol_8 = {};
+  thread float4 tint_symbol_9 = 0.0f;
+  main_1(x_16, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-nested-if-and-conditional/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-nested-if-and-conditional/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..990bb9a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-nested-if-and-conditional/1.spvasm.expected.spvasm
@@ -0,0 +1,539 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 355
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %BST "BST"
+               OpMemberName %BST 0 "data"
+               OpMemberName %BST 1 "leftIndex"
+               OpMemberName %BST 2 "rightIndex"
+               OpName %tree_1 "tree_1"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_16 "x_16"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %makeTreeNode_struct_BST_i1_i1_i11_i1_ "makeTreeNode_struct_BST_i1_i1_i11_i1_"
+               OpName %tree "tree"
+               OpName %data "data"
+               OpName %insert_i1_i1_ "insert_i1_i1_"
+               OpName %treeIndex "treeIndex"
+               OpName %data_1 "data_1"
+               OpName %baseIndex "baseIndex"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %x_170 "x_170"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %search_i1_ "search_i1_"
+               OpName %target "target"
+               OpName %index "index"
+               OpName %currentNode "currentNode"
+               OpName %x_261 "x_261"
+               OpName %main_1 "main_1"
+               OpName %treeIndex_1 "treeIndex_1"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpName %param_6 "param_6"
+               OpName %param_7 "param_7"
+               OpName %param_8 "param_8"
+               OpName %param_9 "param_9"
+               OpName %param_10 "param_10"
+               OpName %param_11 "param_11"
+               OpName %param_12 "param_12"
+               OpName %param_13 "param_13"
+               OpName %param_14 "param_14"
+               OpName %param_15 "param_15"
+               OpName %param_16 "param_16"
+               OpName %param_17 "param_17"
+               OpName %param_18 "param_18"
+               OpName %param_19 "param_19"
+               OpName %param_20 "param_20"
+               OpName %param_21 "param_21"
+               OpName %param_22 "param_22"
+               OpName %param_23 "param_23"
+               OpName %count "count"
+               OpName %i "i"
+               OpName %result "result"
+               OpName %param_24 "param_24"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpMemberDecorate %BST 0 Offset 0
+               OpMemberDecorate %BST 1 Offset 4
+               OpMemberDecorate %BST 2 Offset 8
+               OpDecorate %_arr_BST_uint_10 ArrayStride 12
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_16 NonWritable
+               OpDecorate %x_16 DescriptorSet 0
+               OpDecorate %x_16 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+        %BST = OpTypeStruct %int %int %int
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_BST_uint_10 = OpTypeArray %BST %uint_10
+%_ptr_Private__arr_BST_uint_10 = OpTypePointer Private %_arr_BST_uint_10
+          %8 = OpConstantNull %_arr_BST_uint_10
+     %tree_1 = OpVariable %_ptr_Private__arr_BST_uint_10 Private %8
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_16 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+%_ptr_Function_BST = OpTypePointer Function %BST
+%_ptr_Function_int = OpTypePointer Function %int
+         %20 = OpTypeFunction %void %_ptr_Function_BST %_ptr_Function_int
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+     %int_n1 = OpConstant %int -1
+     %uint_2 = OpConstant %uint 2
+         %40 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+         %46 = OpConstantNull %int
+         %48 = OpConstantNull %BST
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+%_ptr_Private_int = OpTypePointer Private %int
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Private_BST = OpTypePointer Private %BST
+        %161 = OpTypeFunction %int %_ptr_Function_int
+        %202 = OpTypeFunction %void
+      %int_9 = OpConstant %int 9
+      %int_1 = OpConstant %int 1
+      %int_5 = OpConstant %int 5
+     %int_12 = OpConstant %int 12
+     %int_15 = OpConstant %int 15
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+      %int_2 = OpConstant %int 2
+      %int_6 = OpConstant %int 6
+     %int_17 = OpConstant %int 17
+     %int_13 = OpConstant %int 13
+     %int_20 = OpConstant %int 20
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+        %341 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %342 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+        %343 = OpTypeFunction %void %main_out
+%makeTreeNode_struct_BST_i1_i1_i11_i1_ = OpFunction %void None %20
+       %tree = OpFunctionParameter %_ptr_Function_BST
+       %data = OpFunctionParameter %_ptr_Function_int
+         %27 = OpLabel
+         %29 = OpLoad %int %data
+         %32 = OpAccessChain %_ptr_Function_int %tree %uint_0
+               OpStore %32 %29
+         %35 = OpAccessChain %_ptr_Function_int %tree %uint_1
+               OpStore %35 %int_n1
+         %39 = OpAccessChain %_ptr_Function_int %tree %uint_2
+               OpStore %39 %int_n1
+               OpReturn
+               OpFunctionEnd
+%insert_i1_i1_ = OpFunction %void None %40
+  %treeIndex = OpFunctionParameter %_ptr_Function_int
+     %data_1 = OpFunctionParameter %_ptr_Function_int
+         %44 = OpLabel
+  %baseIndex = OpVariable %_ptr_Function_int Function %46
+      %param = OpVariable %_ptr_Function_BST Function %48
+    %param_1 = OpVariable %_ptr_Function_int Function %46
+      %x_170 = OpVariable %_ptr_Function_int Function %46
+    %param_2 = OpVariable %_ptr_Function_BST Function %48
+    %param_3 = OpVariable %_ptr_Function_int Function %46
+               OpStore %baseIndex %int_0
+               OpBranch %54
+         %54 = OpLabel
+               OpLoopMerge %55 %56 None
+               OpBranch %57
+         %57 = OpLabel
+         %58 = OpLoad %int %baseIndex
+         %60 = OpLoad %int %treeIndex
+         %61 = OpSLessThanEqual %bool %58 %60
+               OpSelectionMerge %63 None
+               OpBranchConditional %61 %64 %65
+         %64 = OpLabel
+               OpBranch %63
+         %65 = OpLabel
+               OpBranch %55
+         %63 = OpLabel
+         %67 = OpLoad %int %data_1
+         %68 = OpLoad %int %baseIndex
+         %70 = OpAccessChain %_ptr_Private_int %tree_1 %68 %uint_0
+         %71 = OpLoad %int %70
+         %72 = OpSLessThanEqual %bool %67 %71
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %74 %75
+         %74 = OpLabel
+         %76 = OpLoad %int %baseIndex
+         %77 = OpAccessChain %_ptr_Private_int %tree_1 %76 %uint_1
+         %78 = OpLoad %int %77
+         %79 = OpIEqual %bool %78 %int_n1
+               OpSelectionMerge %80 None
+               OpBranchConditional %79 %81 %82
+         %81 = OpLabel
+         %83 = OpLoad %int %baseIndex
+         %85 = OpLoad %int %treeIndex
+         %86 = OpAccessChain %_ptr_Private_int %tree_1 %83 %uint_1
+               OpStore %86 %85
+         %88 = OpAccessChain %_ptr_Uniform_float %x_16 %uint_0 %uint_0
+         %89 = OpLoad %float %88
+         %90 = OpAccessChain %_ptr_Uniform_float %x_16 %uint_0 %uint_1
+         %91 = OpLoad %float %90
+         %92 = OpFOrdLessThan %bool %89 %91
+               OpSelectionMerge %93 None
+               OpBranchConditional %92 %94 %93
+         %94 = OpLabel
+         %96 = OpLoad %int %treeIndex
+         %98 = OpAccessChain %_ptr_Private_BST %tree_1 %96
+         %99 = OpLoad %BST %98
+               OpStore %param %99
+        %101 = OpLoad %int %data_1
+               OpStore %param_1 %101
+        %102 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param %param_1
+        %105 = OpLoad %BST %param
+        %106 = OpAccessChain %_ptr_Private_BST %tree_1 %96
+               OpStore %106 %105
+               OpBranch %93
+         %93 = OpLabel
+        %107 = OpAccessChain %_ptr_Uniform_float %x_16 %uint_0 %uint_0
+        %108 = OpLoad %float %107
+        %109 = OpAccessChain %_ptr_Uniform_float %x_16 %uint_0 %uint_1
+        %110 = OpLoad %float %109
+        %111 = OpFOrdLessThan %bool %108 %110
+               OpSelectionMerge %112 None
+               OpBranchConditional %111 %113 %112
+        %113 = OpLabel
+               OpReturn
+        %112 = OpLabel
+               OpBranch %80
+         %82 = OpLabel
+        %114 = OpLoad %int %baseIndex
+        %115 = OpAccessChain %_ptr_Private_int %tree_1 %114 %uint_1
+        %116 = OpLoad %int %115
+               OpStore %baseIndex %116
+               OpBranch %56
+         %80 = OpLabel
+               OpBranch %73
+         %75 = OpLabel
+        %117 = OpAccessChain %_ptr_Uniform_float %x_16 %uint_0 %uint_0
+        %118 = OpLoad %float %117
+        %119 = OpAccessChain %_ptr_Uniform_float %x_16 %uint_0 %uint_1
+        %120 = OpLoad %float %119
+        %121 = OpFOrdLessThan %bool %118 %120
+               OpSelectionMerge %122 None
+               OpBranchConditional %121 %123 %124
+        %123 = OpLabel
+        %125 = OpLoad %int %baseIndex
+        %126 = OpAccessChain %_ptr_Private_int %tree_1 %125 %uint_2
+        %127 = OpLoad %int %126
+               OpStore %x_170 %127
+               OpBranch %122
+        %124 = OpLabel
+        %128 = OpLoad %int %baseIndex
+        %129 = OpAccessChain %_ptr_Private_int %tree_1 %128 %uint_2
+        %130 = OpLoad %int %129
+               OpStore %x_170 %130
+               OpBranch %122
+        %122 = OpLabel
+        %131 = OpLoad %int %x_170
+        %132 = OpIEqual %bool %131 %int_n1
+               OpSelectionMerge %133 None
+               OpBranchConditional %132 %134 %135
+        %134 = OpLabel
+        %136 = OpLoad %int %baseIndex
+        %138 = OpLoad %int %treeIndex
+        %139 = OpAccessChain %_ptr_Private_int %tree_1 %136 %uint_2
+               OpStore %139 %138
+        %141 = OpLoad %int %treeIndex
+        %142 = OpAccessChain %_ptr_Private_BST %tree_1 %141
+        %143 = OpLoad %BST %142
+               OpStore %param_2 %143
+        %145 = OpLoad %int %data_1
+               OpStore %param_3 %145
+        %146 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param_2 %param_3
+        %149 = OpLoad %BST %param_2
+        %150 = OpAccessChain %_ptr_Private_BST %tree_1 %141
+               OpStore %150 %149
+               OpReturn
+        %135 = OpLabel
+        %151 = OpLoad %int %baseIndex
+        %152 = OpAccessChain %_ptr_Private_int %tree_1 %151 %uint_2
+        %153 = OpLoad %int %152
+               OpStore %baseIndex %153
+               OpBranch %56
+        %133 = OpLabel
+               OpReturn
+         %73 = OpLabel
+        %154 = OpAccessChain %_ptr_Uniform_float %x_16 %uint_0 %uint_0
+        %155 = OpLoad %float %154
+        %156 = OpAccessChain %_ptr_Uniform_float %x_16 %uint_0 %uint_1
+        %157 = OpLoad %float %156
+        %158 = OpFOrdGreaterThan %bool %155 %157
+               OpSelectionMerge %159 None
+               OpBranchConditional %158 %160 %159
+        %160 = OpLabel
+               OpReturn
+        %159 = OpLabel
+               OpBranch %56
+         %56 = OpLabel
+               OpBranch %54
+         %55 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %search_i1_ = OpFunction %int None %161
+     %target = OpFunctionParameter %_ptr_Function_int
+        %164 = OpLabel
+      %index = OpVariable %_ptr_Function_int Function %46
+%currentNode = OpVariable %_ptr_Function_BST Function %48
+      %x_261 = OpVariable %_ptr_Function_int Function %46
+               OpStore %index %int_0
+               OpBranch %168
+        %168 = OpLabel
+               OpLoopMerge %169 %170 None
+               OpBranch %171
+        %171 = OpLabel
+        %172 = OpLoad %int %index
+        %173 = OpINotEqual %bool %172 %int_n1
+               OpSelectionMerge %174 None
+               OpBranchConditional %173 %175 %176
+        %175 = OpLabel
+               OpBranch %174
+        %176 = OpLabel
+               OpBranch %169
+        %174 = OpLabel
+        %177 = OpLoad %int %index
+        %178 = OpAccessChain %_ptr_Private_BST %tree_1 %177
+        %179 = OpLoad %BST %178
+               OpStore %currentNode %179
+        %180 = OpAccessChain %_ptr_Function_int %currentNode %uint_0
+        %181 = OpLoad %int %180
+        %183 = OpLoad %int %target
+        %184 = OpIEqual %bool %181 %183
+               OpSelectionMerge %185 None
+               OpBranchConditional %184 %186 %185
+        %186 = OpLabel
+        %188 = OpLoad %int %target
+               OpReturnValue %188
+        %185 = OpLabel
+        %190 = OpLoad %int %target
+        %191 = OpAccessChain %_ptr_Function_int %currentNode %uint_0
+        %192 = OpLoad %int %191
+        %193 = OpSGreaterThan %bool %190 %192
+               OpSelectionMerge %194 None
+               OpBranchConditional %193 %195 %196
+        %195 = OpLabel
+        %197 = OpAccessChain %_ptr_Function_int %currentNode %uint_2
+        %198 = OpLoad %int %197
+               OpStore %x_261 %198
+               OpBranch %194
+        %196 = OpLabel
+        %199 = OpAccessChain %_ptr_Function_int %currentNode %uint_1
+        %200 = OpLoad %int %199
+               OpStore %x_261 %200
+               OpBranch %194
+        %194 = OpLabel
+        %201 = OpLoad %int %x_261
+               OpStore %index %201
+               OpBranch %170
+        %170 = OpLabel
+               OpBranch %168
+        %169 = OpLabel
+               OpReturnValue %int_n1
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %202
+        %204 = OpLabel
+%treeIndex_1 = OpVariable %_ptr_Function_int Function %46
+    %param_4 = OpVariable %_ptr_Function_BST Function %48
+    %param_5 = OpVariable %_ptr_Function_int Function %46
+    %param_6 = OpVariable %_ptr_Function_int Function %46
+    %param_7 = OpVariable %_ptr_Function_int Function %46
+    %param_8 = OpVariable %_ptr_Function_int Function %46
+    %param_9 = OpVariable %_ptr_Function_int Function %46
+   %param_10 = OpVariable %_ptr_Function_int Function %46
+   %param_11 = OpVariable %_ptr_Function_int Function %46
+   %param_12 = OpVariable %_ptr_Function_int Function %46
+   %param_13 = OpVariable %_ptr_Function_int Function %46
+   %param_14 = OpVariable %_ptr_Function_int Function %46
+   %param_15 = OpVariable %_ptr_Function_int Function %46
+   %param_16 = OpVariable %_ptr_Function_int Function %46
+   %param_17 = OpVariable %_ptr_Function_int Function %46
+   %param_18 = OpVariable %_ptr_Function_int Function %46
+   %param_19 = OpVariable %_ptr_Function_int Function %46
+   %param_20 = OpVariable %_ptr_Function_int Function %46
+   %param_21 = OpVariable %_ptr_Function_int Function %46
+   %param_22 = OpVariable %_ptr_Function_int Function %46
+   %param_23 = OpVariable %_ptr_Function_int Function %46
+      %count = OpVariable %_ptr_Function_int Function %46
+          %i = OpVariable %_ptr_Function_int Function %46
+     %result = OpVariable %_ptr_Function_int Function %46
+   %param_24 = OpVariable %_ptr_Function_int Function %46
+               OpStore %treeIndex_1 %int_0
+        %230 = OpAccessChain %_ptr_Private_BST %tree_1 %int_0
+        %231 = OpLoad %BST %230
+               OpStore %param_4 %231
+               OpStore %param_5 %int_9
+        %233 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param_4 %param_5
+        %236 = OpLoad %BST %param_4
+        %237 = OpAccessChain %_ptr_Private_BST %tree_1 %int_0
+               OpStore %237 %236
+        %238 = OpLoad %int %treeIndex_1
+        %240 = OpIAdd %int %238 %int_1
+               OpStore %treeIndex_1 %240
+        %241 = OpLoad %int %treeIndex_1
+               OpStore %param_6 %241
+               OpStore %param_7 %int_5
+        %243 = OpFunctionCall %void %insert_i1_i1_ %param_6 %param_7
+        %246 = OpLoad %int %treeIndex_1
+        %247 = OpIAdd %int %246 %int_1
+               OpStore %treeIndex_1 %247
+        %248 = OpLoad %int %treeIndex_1
+               OpStore %param_8 %248
+               OpStore %param_9 %int_12
+        %250 = OpFunctionCall %void %insert_i1_i1_ %param_8 %param_9
+        %253 = OpLoad %int %treeIndex_1
+        %254 = OpIAdd %int %253 %int_1
+               OpStore %treeIndex_1 %254
+        %255 = OpLoad %int %treeIndex_1
+               OpStore %param_10 %255
+               OpStore %param_11 %int_15
+        %257 = OpFunctionCall %void %insert_i1_i1_ %param_10 %param_11
+        %260 = OpLoad %int %treeIndex_1
+        %261 = OpIAdd %int %260 %int_1
+               OpStore %treeIndex_1 %261
+        %262 = OpLoad %int %treeIndex_1
+               OpStore %param_12 %262
+               OpStore %param_13 %int_7
+        %264 = OpFunctionCall %void %insert_i1_i1_ %param_12 %param_13
+        %267 = OpLoad %int %treeIndex_1
+        %268 = OpIAdd %int %267 %int_1
+               OpStore %treeIndex_1 %268
+        %269 = OpLoad %int %treeIndex_1
+               OpStore %param_14 %269
+               OpStore %param_15 %int_8
+        %271 = OpFunctionCall %void %insert_i1_i1_ %param_14 %param_15
+        %274 = OpLoad %int %treeIndex_1
+        %275 = OpIAdd %int %274 %int_1
+               OpStore %treeIndex_1 %275
+        %276 = OpLoad %int %treeIndex_1
+               OpStore %param_16 %276
+               OpStore %param_17 %int_2
+        %278 = OpFunctionCall %void %insert_i1_i1_ %param_16 %param_17
+        %281 = OpLoad %int %treeIndex_1
+        %282 = OpIAdd %int %281 %int_1
+               OpStore %treeIndex_1 %282
+        %283 = OpLoad %int %treeIndex_1
+               OpStore %param_18 %283
+               OpStore %param_19 %int_6
+        %285 = OpFunctionCall %void %insert_i1_i1_ %param_18 %param_19
+        %288 = OpLoad %int %treeIndex_1
+        %289 = OpIAdd %int %288 %int_1
+               OpStore %treeIndex_1 %289
+        %290 = OpLoad %int %treeIndex_1
+               OpStore %param_20 %290
+               OpStore %param_21 %int_17
+        %292 = OpFunctionCall %void %insert_i1_i1_ %param_20 %param_21
+        %295 = OpLoad %int %treeIndex_1
+        %296 = OpIAdd %int %295 %int_1
+               OpStore %treeIndex_1 %296
+        %297 = OpLoad %int %treeIndex_1
+               OpStore %param_22 %297
+               OpStore %param_23 %int_13
+        %299 = OpFunctionCall %void %insert_i1_i1_ %param_22 %param_23
+               OpStore %count %int_0
+               OpStore %i %int_0
+               OpBranch %302
+        %302 = OpLabel
+               OpLoopMerge %303 %304 None
+               OpBranch %305
+        %305 = OpLabel
+        %306 = OpLoad %int %i
+        %308 = OpSLessThan %bool %306 %int_20
+               OpSelectionMerge %309 None
+               OpBranchConditional %308 %310 %311
+        %310 = OpLabel
+               OpBranch %309
+        %311 = OpLabel
+               OpBranch %303
+        %309 = OpLabel
+        %312 = OpLoad %int %i
+               OpStore %param_24 %312
+        %313 = OpFunctionCall %int %search_i1_ %param_24
+               OpStore %result %313
+        %315 = OpLoad %int %i
+               OpSelectionMerge %316 None
+               OpSwitch %315 %317 2 %318 5 %318 6 %318 7 %318 8 %318 9 %318 12 %318 13 %318 15 %318 17 %318
+        %318 = OpLabel
+        %319 = OpLoad %int %result
+        %320 = OpLoad %int %i
+        %321 = OpIEqual %bool %319 %320
+               OpSelectionMerge %322 None
+               OpBranchConditional %321 %323 %322
+        %323 = OpLabel
+        %324 = OpLoad %int %count
+        %325 = OpIAdd %int %324 %int_1
+               OpStore %count %325
+               OpBranch %322
+        %322 = OpLabel
+               OpBranch %316
+        %317 = OpLabel
+        %326 = OpLoad %int %result
+        %327 = OpIEqual %bool %326 %int_n1
+               OpSelectionMerge %328 None
+               OpBranchConditional %327 %329 %328
+        %329 = OpLabel
+        %330 = OpLoad %int %count
+        %331 = OpIAdd %int %330 %int_1
+               OpStore %count %331
+               OpBranch %328
+        %328 = OpLabel
+               OpBranch %316
+        %316 = OpLabel
+               OpBranch %304
+        %304 = OpLabel
+        %332 = OpLoad %int %i
+        %333 = OpIAdd %int %332 %int_1
+               OpStore %i %333
+               OpBranch %302
+        %303 = OpLabel
+        %334 = OpLoad %int %count
+        %335 = OpIEqual %bool %334 %int_20
+               OpSelectionMerge %336 None
+               OpBranchConditional %335 %337 %338
+        %337 = OpLabel
+               OpStore %x_GLF_color %341
+               OpBranch %336
+        %338 = OpLabel
+               OpStore %x_GLF_color %342
+               OpBranch %336
+        %336 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %343
+%tint_symbol = OpFunctionParameter %main_out
+        %347 = OpLabel
+        %348 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %348
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %202
+        %350 = OpLabel
+        %351 = OpFunctionCall %void %main_1
+        %353 = OpLoad %v4float %x_GLF_color
+        %354 = OpCompositeConstruct %main_out %353
+        %352 = OpFunctionCall %void %tint_symbol_2 %354
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-nested-if-and-conditional/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-nested-if-and-conditional/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..06f95bb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-nested-if-and-conditional/1.spvasm.expected.wgsl
@@ -0,0 +1,293 @@
+struct BST {
+  data : i32;
+  leftIndex : i32;
+  rightIndex : i32;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> tree_1 : array<BST, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_16 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn makeTreeNode_struct_BST_i1_i1_i11_i1_(tree : ptr<function, BST>, data : ptr<function, i32>) {
+  let x_165 : i32 = *(data);
+  (*(tree)).data = x_165;
+  (*(tree)).leftIndex = -1;
+  (*(tree)).rightIndex = -1;
+  return;
+}
+
+fn insert_i1_i1_(treeIndex : ptr<function, i32>, data_1 : ptr<function, i32>) {
+  var baseIndex : i32;
+  var param : BST;
+  var param_1 : i32;
+  var x_170 : i32;
+  var param_2 : BST;
+  var param_3 : i32;
+  baseIndex = 0;
+  loop {
+    let x_175 : i32 = baseIndex;
+    let x_176 : i32 = *(treeIndex);
+    if ((x_175 <= x_176)) {
+    } else {
+      break;
+    }
+    let x_179 : i32 = *(data_1);
+    let x_180 : i32 = baseIndex;
+    let x_182 : i32 = tree_1[x_180].data;
+    if ((x_179 <= x_182)) {
+      let x_187 : i32 = baseIndex;
+      let x_189 : i32 = tree_1[x_187].leftIndex;
+      if ((x_189 == -1)) {
+        let x_194 : i32 = baseIndex;
+        let x_195 : i32 = *(treeIndex);
+        tree_1[x_194].leftIndex = x_195;
+        let x_198 : f32 = x_16.injectionSwitch.x;
+        let x_200 : f32 = x_16.injectionSwitch.y;
+        if ((x_198 < x_200)) {
+          let x_204 : i32 = *(treeIndex);
+          let x_206 : BST = tree_1[x_204];
+          param = x_206;
+          let x_207 : i32 = *(data_1);
+          param_1 = x_207;
+          makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param), &(param_1));
+          let x_209 : BST = param;
+          tree_1[x_204] = x_209;
+        }
+        let x_212 : f32 = x_16.injectionSwitch.x;
+        let x_214 : f32 = x_16.injectionSwitch.y;
+        if ((x_212 < x_214)) {
+          return;
+        }
+      } else {
+        let x_218 : i32 = baseIndex;
+        let x_220 : i32 = tree_1[x_218].leftIndex;
+        baseIndex = x_220;
+        continue;
+      }
+    } else {
+      let x_222 : f32 = x_16.injectionSwitch.x;
+      let x_224 : f32 = x_16.injectionSwitch.y;
+      if ((x_222 < x_224)) {
+        let x_229 : i32 = baseIndex;
+        let x_231 : i32 = tree_1[x_229].rightIndex;
+        x_170 = x_231;
+      } else {
+        let x_232 : i32 = baseIndex;
+        let x_234 : i32 = tree_1[x_232].rightIndex;
+        x_170 = x_234;
+      }
+      let x_235 : i32 = x_170;
+      if ((x_235 == -1)) {
+        let x_240 : i32 = baseIndex;
+        let x_241 : i32 = *(treeIndex);
+        tree_1[x_240].rightIndex = x_241;
+        let x_243 : i32 = *(treeIndex);
+        let x_245 : BST = tree_1[x_243];
+        param_2 = x_245;
+        let x_246 : i32 = *(data_1);
+        param_3 = x_246;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_2), &(param_3));
+        let x_248 : BST = param_2;
+        tree_1[x_243] = x_248;
+        return;
+      } else {
+        let x_250 : i32 = baseIndex;
+        let x_252 : i32 = tree_1[x_250].rightIndex;
+        baseIndex = x_252;
+        continue;
+      }
+      return;
+    }
+    let x_254 : f32 = x_16.injectionSwitch.x;
+    let x_256 : f32 = x_16.injectionSwitch.y;
+    if ((x_254 > x_256)) {
+      return;
+    }
+  }
+  return;
+}
+
+fn search_i1_(target : ptr<function, i32>) -> i32 {
+  var index : i32;
+  var currentNode : BST;
+  var x_261 : i32;
+  index = 0;
+  loop {
+    let x_266 : i32 = index;
+    if ((x_266 != -1)) {
+    } else {
+      break;
+    }
+    let x_269 : i32 = index;
+    let x_271 : BST = tree_1[x_269];
+    currentNode = x_271;
+    let x_273 : i32 = currentNode.data;
+    let x_274 : i32 = *(target);
+    if ((x_273 == x_274)) {
+      let x_278 : i32 = *(target);
+      return x_278;
+    }
+    let x_279 : i32 = *(target);
+    let x_281 : i32 = currentNode.data;
+    if ((x_279 > x_281)) {
+      let x_287 : i32 = currentNode.rightIndex;
+      x_261 = x_287;
+    } else {
+      let x_289 : i32 = currentNode.leftIndex;
+      x_261 = x_289;
+    }
+    let x_290 : i32 = x_261;
+    index = x_290;
+  }
+  return -1;
+}
+
+fn main_1() {
+  var treeIndex_1 : i32;
+  var param_4 : BST;
+  var param_5 : i32;
+  var param_6 : i32;
+  var param_7 : i32;
+  var param_8 : i32;
+  var param_9 : i32;
+  var param_10 : i32;
+  var param_11 : i32;
+  var param_12 : i32;
+  var param_13 : i32;
+  var param_14 : i32;
+  var param_15 : i32;
+  var param_16 : i32;
+  var param_17 : i32;
+  var param_18 : i32;
+  var param_19 : i32;
+  var param_20 : i32;
+  var param_21 : i32;
+  var param_22 : i32;
+  var param_23 : i32;
+  var count : i32;
+  var i : i32;
+  var result : i32;
+  var param_24 : i32;
+  treeIndex_1 = 0;
+  let x_91 : BST = tree_1[0];
+  param_4 = x_91;
+  param_5 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_4), &(param_5));
+  let x_93 : BST = param_4;
+  tree_1[0] = x_93;
+  let x_95 : i32 = treeIndex_1;
+  treeIndex_1 = (x_95 + 1);
+  let x_97 : i32 = treeIndex_1;
+  param_6 = x_97;
+  param_7 = 5;
+  insert_i1_i1_(&(param_6), &(param_7));
+  let x_99 : i32 = treeIndex_1;
+  treeIndex_1 = (x_99 + 1);
+  let x_101 : i32 = treeIndex_1;
+  param_8 = x_101;
+  param_9 = 12;
+  insert_i1_i1_(&(param_8), &(param_9));
+  let x_103 : i32 = treeIndex_1;
+  treeIndex_1 = (x_103 + 1);
+  let x_105 : i32 = treeIndex_1;
+  param_10 = x_105;
+  param_11 = 15;
+  insert_i1_i1_(&(param_10), &(param_11));
+  let x_107 : i32 = treeIndex_1;
+  treeIndex_1 = (x_107 + 1);
+  let x_109 : i32 = treeIndex_1;
+  param_12 = x_109;
+  param_13 = 7;
+  insert_i1_i1_(&(param_12), &(param_13));
+  let x_111 : i32 = treeIndex_1;
+  treeIndex_1 = (x_111 + 1);
+  let x_113 : i32 = treeIndex_1;
+  param_14 = x_113;
+  param_15 = 8;
+  insert_i1_i1_(&(param_14), &(param_15));
+  let x_115 : i32 = treeIndex_1;
+  treeIndex_1 = (x_115 + 1);
+  let x_117 : i32 = treeIndex_1;
+  param_16 = x_117;
+  param_17 = 2;
+  insert_i1_i1_(&(param_16), &(param_17));
+  let x_119 : i32 = treeIndex_1;
+  treeIndex_1 = (x_119 + 1);
+  let x_121 : i32 = treeIndex_1;
+  param_18 = x_121;
+  param_19 = 6;
+  insert_i1_i1_(&(param_18), &(param_19));
+  let x_123 : i32 = treeIndex_1;
+  treeIndex_1 = (x_123 + 1);
+  let x_125 : i32 = treeIndex_1;
+  param_20 = x_125;
+  param_21 = 17;
+  insert_i1_i1_(&(param_20), &(param_21));
+  let x_127 : i32 = treeIndex_1;
+  treeIndex_1 = (x_127 + 1);
+  let x_129 : i32 = treeIndex_1;
+  param_22 = x_129;
+  param_23 = 13;
+  insert_i1_i1_(&(param_22), &(param_23));
+  count = 0;
+  i = 0;
+  loop {
+    let x_135 : i32 = i;
+    if ((x_135 < 20)) {
+    } else {
+      break;
+    }
+    let x_138 : i32 = i;
+    param_24 = x_138;
+    let x_139 : i32 = search_i1_(&(param_24));
+    result = x_139;
+    let x_140 : i32 = i;
+    switch(x_140) {
+      case 2, 5, 6, 7, 8, 9, 12, 13, 15, 17: {
+        let x_150 : i32 = result;
+        let x_151 : i32 = i;
+        if ((x_150 == x_151)) {
+          let x_155 : i32 = count;
+          count = (x_155 + 1);
+        }
+      }
+      default: {
+        let x_144 : i32 = result;
+        if ((x_144 == -1)) {
+          let x_148 : i32 = count;
+          count = (x_148 + 1);
+        }
+      }
+    }
+
+    continuing {
+      let x_157 : i32 = i;
+      i = (x_157 + 1);
+    }
+  }
+  let x_159 : i32 = count;
+  if ((x_159 == 20)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-nested-if-and-conditional/1.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-nested-if-and-conditional/1.wgsl
new file mode 100644
index 0000000..06f95bb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-nested-if-and-conditional/1.wgsl
@@ -0,0 +1,293 @@
+struct BST {
+  data : i32;
+  leftIndex : i32;
+  rightIndex : i32;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> tree_1 : array<BST, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_16 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn makeTreeNode_struct_BST_i1_i1_i11_i1_(tree : ptr<function, BST>, data : ptr<function, i32>) {
+  let x_165 : i32 = *(data);
+  (*(tree)).data = x_165;
+  (*(tree)).leftIndex = -1;
+  (*(tree)).rightIndex = -1;
+  return;
+}
+
+fn insert_i1_i1_(treeIndex : ptr<function, i32>, data_1 : ptr<function, i32>) {
+  var baseIndex : i32;
+  var param : BST;
+  var param_1 : i32;
+  var x_170 : i32;
+  var param_2 : BST;
+  var param_3 : i32;
+  baseIndex = 0;
+  loop {
+    let x_175 : i32 = baseIndex;
+    let x_176 : i32 = *(treeIndex);
+    if ((x_175 <= x_176)) {
+    } else {
+      break;
+    }
+    let x_179 : i32 = *(data_1);
+    let x_180 : i32 = baseIndex;
+    let x_182 : i32 = tree_1[x_180].data;
+    if ((x_179 <= x_182)) {
+      let x_187 : i32 = baseIndex;
+      let x_189 : i32 = tree_1[x_187].leftIndex;
+      if ((x_189 == -1)) {
+        let x_194 : i32 = baseIndex;
+        let x_195 : i32 = *(treeIndex);
+        tree_1[x_194].leftIndex = x_195;
+        let x_198 : f32 = x_16.injectionSwitch.x;
+        let x_200 : f32 = x_16.injectionSwitch.y;
+        if ((x_198 < x_200)) {
+          let x_204 : i32 = *(treeIndex);
+          let x_206 : BST = tree_1[x_204];
+          param = x_206;
+          let x_207 : i32 = *(data_1);
+          param_1 = x_207;
+          makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param), &(param_1));
+          let x_209 : BST = param;
+          tree_1[x_204] = x_209;
+        }
+        let x_212 : f32 = x_16.injectionSwitch.x;
+        let x_214 : f32 = x_16.injectionSwitch.y;
+        if ((x_212 < x_214)) {
+          return;
+        }
+      } else {
+        let x_218 : i32 = baseIndex;
+        let x_220 : i32 = tree_1[x_218].leftIndex;
+        baseIndex = x_220;
+        continue;
+      }
+    } else {
+      let x_222 : f32 = x_16.injectionSwitch.x;
+      let x_224 : f32 = x_16.injectionSwitch.y;
+      if ((x_222 < x_224)) {
+        let x_229 : i32 = baseIndex;
+        let x_231 : i32 = tree_1[x_229].rightIndex;
+        x_170 = x_231;
+      } else {
+        let x_232 : i32 = baseIndex;
+        let x_234 : i32 = tree_1[x_232].rightIndex;
+        x_170 = x_234;
+      }
+      let x_235 : i32 = x_170;
+      if ((x_235 == -1)) {
+        let x_240 : i32 = baseIndex;
+        let x_241 : i32 = *(treeIndex);
+        tree_1[x_240].rightIndex = x_241;
+        let x_243 : i32 = *(treeIndex);
+        let x_245 : BST = tree_1[x_243];
+        param_2 = x_245;
+        let x_246 : i32 = *(data_1);
+        param_3 = x_246;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_2), &(param_3));
+        let x_248 : BST = param_2;
+        tree_1[x_243] = x_248;
+        return;
+      } else {
+        let x_250 : i32 = baseIndex;
+        let x_252 : i32 = tree_1[x_250].rightIndex;
+        baseIndex = x_252;
+        continue;
+      }
+      return;
+    }
+    let x_254 : f32 = x_16.injectionSwitch.x;
+    let x_256 : f32 = x_16.injectionSwitch.y;
+    if ((x_254 > x_256)) {
+      return;
+    }
+  }
+  return;
+}
+
+fn search_i1_(target : ptr<function, i32>) -> i32 {
+  var index : i32;
+  var currentNode : BST;
+  var x_261 : i32;
+  index = 0;
+  loop {
+    let x_266 : i32 = index;
+    if ((x_266 != -1)) {
+    } else {
+      break;
+    }
+    let x_269 : i32 = index;
+    let x_271 : BST = tree_1[x_269];
+    currentNode = x_271;
+    let x_273 : i32 = currentNode.data;
+    let x_274 : i32 = *(target);
+    if ((x_273 == x_274)) {
+      let x_278 : i32 = *(target);
+      return x_278;
+    }
+    let x_279 : i32 = *(target);
+    let x_281 : i32 = currentNode.data;
+    if ((x_279 > x_281)) {
+      let x_287 : i32 = currentNode.rightIndex;
+      x_261 = x_287;
+    } else {
+      let x_289 : i32 = currentNode.leftIndex;
+      x_261 = x_289;
+    }
+    let x_290 : i32 = x_261;
+    index = x_290;
+  }
+  return -1;
+}
+
+fn main_1() {
+  var treeIndex_1 : i32;
+  var param_4 : BST;
+  var param_5 : i32;
+  var param_6 : i32;
+  var param_7 : i32;
+  var param_8 : i32;
+  var param_9 : i32;
+  var param_10 : i32;
+  var param_11 : i32;
+  var param_12 : i32;
+  var param_13 : i32;
+  var param_14 : i32;
+  var param_15 : i32;
+  var param_16 : i32;
+  var param_17 : i32;
+  var param_18 : i32;
+  var param_19 : i32;
+  var param_20 : i32;
+  var param_21 : i32;
+  var param_22 : i32;
+  var param_23 : i32;
+  var count : i32;
+  var i : i32;
+  var result : i32;
+  var param_24 : i32;
+  treeIndex_1 = 0;
+  let x_91 : BST = tree_1[0];
+  param_4 = x_91;
+  param_5 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_4), &(param_5));
+  let x_93 : BST = param_4;
+  tree_1[0] = x_93;
+  let x_95 : i32 = treeIndex_1;
+  treeIndex_1 = (x_95 + 1);
+  let x_97 : i32 = treeIndex_1;
+  param_6 = x_97;
+  param_7 = 5;
+  insert_i1_i1_(&(param_6), &(param_7));
+  let x_99 : i32 = treeIndex_1;
+  treeIndex_1 = (x_99 + 1);
+  let x_101 : i32 = treeIndex_1;
+  param_8 = x_101;
+  param_9 = 12;
+  insert_i1_i1_(&(param_8), &(param_9));
+  let x_103 : i32 = treeIndex_1;
+  treeIndex_1 = (x_103 + 1);
+  let x_105 : i32 = treeIndex_1;
+  param_10 = x_105;
+  param_11 = 15;
+  insert_i1_i1_(&(param_10), &(param_11));
+  let x_107 : i32 = treeIndex_1;
+  treeIndex_1 = (x_107 + 1);
+  let x_109 : i32 = treeIndex_1;
+  param_12 = x_109;
+  param_13 = 7;
+  insert_i1_i1_(&(param_12), &(param_13));
+  let x_111 : i32 = treeIndex_1;
+  treeIndex_1 = (x_111 + 1);
+  let x_113 : i32 = treeIndex_1;
+  param_14 = x_113;
+  param_15 = 8;
+  insert_i1_i1_(&(param_14), &(param_15));
+  let x_115 : i32 = treeIndex_1;
+  treeIndex_1 = (x_115 + 1);
+  let x_117 : i32 = treeIndex_1;
+  param_16 = x_117;
+  param_17 = 2;
+  insert_i1_i1_(&(param_16), &(param_17));
+  let x_119 : i32 = treeIndex_1;
+  treeIndex_1 = (x_119 + 1);
+  let x_121 : i32 = treeIndex_1;
+  param_18 = x_121;
+  param_19 = 6;
+  insert_i1_i1_(&(param_18), &(param_19));
+  let x_123 : i32 = treeIndex_1;
+  treeIndex_1 = (x_123 + 1);
+  let x_125 : i32 = treeIndex_1;
+  param_20 = x_125;
+  param_21 = 17;
+  insert_i1_i1_(&(param_20), &(param_21));
+  let x_127 : i32 = treeIndex_1;
+  treeIndex_1 = (x_127 + 1);
+  let x_129 : i32 = treeIndex_1;
+  param_22 = x_129;
+  param_23 = 13;
+  insert_i1_i1_(&(param_22), &(param_23));
+  count = 0;
+  i = 0;
+  loop {
+    let x_135 : i32 = i;
+    if ((x_135 < 20)) {
+    } else {
+      break;
+    }
+    let x_138 : i32 = i;
+    param_24 = x_138;
+    let x_139 : i32 = search_i1_(&(param_24));
+    result = x_139;
+    let x_140 : i32 = i;
+    switch(x_140) {
+      case 2, 5, 6, 7, 8, 9, 12, 13, 15, 17: {
+        let x_150 : i32 = result;
+        let x_151 : i32 = i;
+        if ((x_150 == x_151)) {
+          let x_155 : i32 = count;
+          count = (x_155 + 1);
+        }
+      }
+      default: {
+        let x_144 : i32 = result;
+        if ((x_144 == -1)) {
+          let x_148 : i32 = count;
+          count = (x_148 + 1);
+        }
+      }
+    }
+
+    continuing {
+      let x_157 : i32 = i;
+      i = (x_157 + 1);
+    }
+  }
+  let x_159 : i32 = count;
+  if ((x_159 == 20)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-nested-if-and-conditional/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-nested-if-and-conditional/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..11cdc01
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-nested-if-and-conditional/1.wgsl.expected.hlsl
@@ -0,0 +1,255 @@
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+
+static BST tree_1[10] = (BST[10])0;
+cbuffer cbuffer_x_16 : register(b0, space0) {
+  uint4 x_16[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void makeTreeNode_struct_BST_i1_i1_i11_i1_(inout BST tree, inout int data) {
+  const int x_165 = data;
+  tree.data = x_165;
+  tree.leftIndex = -1;
+  tree.rightIndex = -1;
+  return;
+}
+
+void insert_i1_i1_(inout int treeIndex, inout int data_1) {
+  int baseIndex = 0;
+  BST param = (BST)0;
+  int param_1 = 0;
+  int x_170 = 0;
+  BST param_2 = (BST)0;
+  int param_3 = 0;
+  baseIndex = 0;
+  while (true) {
+    const int x_175 = baseIndex;
+    const int x_176 = treeIndex;
+    if ((x_175 <= x_176)) {
+    } else {
+      break;
+    }
+    const int x_179 = data_1;
+    const int x_182 = tree_1[baseIndex].data;
+    if ((x_179 <= x_182)) {
+      const int x_189 = tree_1[baseIndex].leftIndex;
+      if ((x_189 == -1)) {
+        const int x_194 = baseIndex;
+        const int x_195 = treeIndex;
+        tree_1[x_194].leftIndex = x_195;
+        const float x_198 = asfloat(x_16[0].x);
+        const float x_200 = asfloat(x_16[0].y);
+        if ((x_198 < x_200)) {
+          const int x_204 = treeIndex;
+          const BST x_206 = tree_1[x_204];
+          param = x_206;
+          const int x_207 = data_1;
+          param_1 = x_207;
+          makeTreeNode_struct_BST_i1_i1_i11_i1_(param, param_1);
+          tree_1[x_204] = param;
+        }
+        const float x_212 = asfloat(x_16[0].x);
+        const float x_214 = asfloat(x_16[0].y);
+        if ((x_212 < x_214)) {
+          return;
+        }
+      } else {
+        const int x_220 = tree_1[baseIndex].leftIndex;
+        baseIndex = x_220;
+        continue;
+      }
+    } else {
+      const float x_222 = asfloat(x_16[0].x);
+      const float x_224 = asfloat(x_16[0].y);
+      if ((x_222 < x_224)) {
+        const int x_231 = tree_1[baseIndex].rightIndex;
+        x_170 = x_231;
+      } else {
+        const int x_234 = tree_1[baseIndex].rightIndex;
+        x_170 = x_234;
+      }
+      if ((x_170 == -1)) {
+        const int x_240 = baseIndex;
+        const int x_241 = treeIndex;
+        tree_1[x_240].rightIndex = x_241;
+        const int x_243 = treeIndex;
+        const BST x_245 = tree_1[x_243];
+        param_2 = x_245;
+        const int x_246 = data_1;
+        param_3 = x_246;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(param_2, param_3);
+        tree_1[x_243] = param_2;
+        return;
+      } else {
+        const int x_252 = tree_1[baseIndex].rightIndex;
+        baseIndex = x_252;
+        continue;
+      }
+      return;
+    }
+    const float x_254 = asfloat(x_16[0].x);
+    const float x_256 = asfloat(x_16[0].y);
+    if ((x_254 > x_256)) {
+      return;
+    }
+  }
+  return;
+}
+
+int search_i1_(inout int target) {
+  int index = 0;
+  BST currentNode = (BST)0;
+  int x_261 = 0;
+  index = 0;
+  while (true) {
+    if ((index != -1)) {
+    } else {
+      break;
+    }
+    const BST x_271 = tree_1[index];
+    currentNode = x_271;
+    const int x_273 = currentNode.data;
+    const int x_274 = target;
+    if ((x_273 == x_274)) {
+      const int x_278 = target;
+      return x_278;
+    }
+    const int x_279 = target;
+    const int x_281 = currentNode.data;
+    if ((x_279 > x_281)) {
+      const int x_287 = currentNode.rightIndex;
+      x_261 = x_287;
+    } else {
+      const int x_289 = currentNode.leftIndex;
+      x_261 = x_289;
+    }
+    index = x_261;
+  }
+  return -1;
+}
+
+void main_1() {
+  int treeIndex_1 = 0;
+  BST param_4 = (BST)0;
+  int param_5 = 0;
+  int param_6 = 0;
+  int param_7 = 0;
+  int param_8 = 0;
+  int param_9 = 0;
+  int param_10 = 0;
+  int param_11 = 0;
+  int param_12 = 0;
+  int param_13 = 0;
+  int param_14 = 0;
+  int param_15 = 0;
+  int param_16 = 0;
+  int param_17 = 0;
+  int param_18 = 0;
+  int param_19 = 0;
+  int param_20 = 0;
+  int param_21 = 0;
+  int param_22 = 0;
+  int param_23 = 0;
+  int count = 0;
+  int i = 0;
+  int result = 0;
+  int param_24 = 0;
+  treeIndex_1 = 0;
+  const BST x_91 = tree_1[0];
+  param_4 = x_91;
+  param_5 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(param_4, param_5);
+  tree_1[0] = param_4;
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_6 = treeIndex_1;
+  param_7 = 5;
+  insert_i1_i1_(param_6, param_7);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_8 = treeIndex_1;
+  param_9 = 12;
+  insert_i1_i1_(param_8, param_9);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_10 = treeIndex_1;
+  param_11 = 15;
+  insert_i1_i1_(param_10, param_11);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_12 = treeIndex_1;
+  param_13 = 7;
+  insert_i1_i1_(param_12, param_13);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_14 = treeIndex_1;
+  param_15 = 8;
+  insert_i1_i1_(param_14, param_15);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_16 = treeIndex_1;
+  param_17 = 2;
+  insert_i1_i1_(param_16, param_17);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_18 = treeIndex_1;
+  param_19 = 6;
+  insert_i1_i1_(param_18, param_19);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_20 = treeIndex_1;
+  param_21 = 17;
+  insert_i1_i1_(param_20, param_21);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_22 = treeIndex_1;
+  param_23 = 13;
+  insert_i1_i1_(param_22, param_23);
+  count = 0;
+  i = 0;
+  {
+    for(; (i < 20); i = (i + 1)) {
+      param_24 = i;
+      const int x_139 = search_i1_(param_24);
+      result = x_139;
+      switch(i) {
+        case 2:
+        case 5:
+        case 6:
+        case 7:
+        case 8:
+        case 9:
+        case 12:
+        case 13:
+        case 15:
+        case 17: {
+          if ((result == i)) {
+            count = (count + 1);
+          }
+          break;
+        }
+        default: {
+          if ((result == -1)) {
+            count = (count + 1);
+          }
+          break;
+        }
+      }
+    }
+  }
+  if ((count == 20)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-nested-if-and-conditional/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-nested-if-and-conditional/1.wgsl.expected.msl
new file mode 100644
index 0000000..17bc280
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-nested-if-and-conditional/1.wgsl.expected.msl
@@ -0,0 +1,306 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  BST arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void makeTreeNode_struct_BST_i1_i1_i11_i1_(thread BST* const tree, thread int* const data) {
+  int const x_165 = *(data);
+  (*(tree)).data = x_165;
+  (*(tree)).leftIndex = -1;
+  (*(tree)).rightIndex = -1;
+  return;
+}
+
+void insert_i1_i1_(constant buf0& x_16, thread int* const treeIndex, thread int* const data_1, thread tint_array_wrapper* const tint_symbol_4) {
+  int baseIndex = 0;
+  BST param = {};
+  int param_1 = 0;
+  int x_170 = 0;
+  BST param_2 = {};
+  int param_3 = 0;
+  baseIndex = 0;
+  while (true) {
+    int const x_175 = baseIndex;
+    int const x_176 = *(treeIndex);
+    if ((x_175 <= x_176)) {
+    } else {
+      break;
+    }
+    int const x_179 = *(data_1);
+    int const x_180 = baseIndex;
+    int const x_182 = (*(tint_symbol_4)).arr[x_180].data;
+    if ((x_179 <= x_182)) {
+      int const x_187 = baseIndex;
+      int const x_189 = (*(tint_symbol_4)).arr[x_187].leftIndex;
+      if ((x_189 == -1)) {
+        int const x_194 = baseIndex;
+        int const x_195 = *(treeIndex);
+        (*(tint_symbol_4)).arr[x_194].leftIndex = x_195;
+        float const x_198 = x_16.injectionSwitch.x;
+        float const x_200 = x_16.injectionSwitch.y;
+        if ((x_198 < x_200)) {
+          int const x_204 = *(treeIndex);
+          BST const x_206 = (*(tint_symbol_4)).arr[x_204];
+          param = x_206;
+          int const x_207 = *(data_1);
+          param_1 = x_207;
+          makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param), &(param_1));
+          BST const x_209 = param;
+          (*(tint_symbol_4)).arr[x_204] = x_209;
+        }
+        float const x_212 = x_16.injectionSwitch.x;
+        float const x_214 = x_16.injectionSwitch.y;
+        if ((x_212 < x_214)) {
+          return;
+        }
+      } else {
+        int const x_218 = baseIndex;
+        int const x_220 = (*(tint_symbol_4)).arr[x_218].leftIndex;
+        baseIndex = x_220;
+        continue;
+      }
+    } else {
+      float const x_222 = x_16.injectionSwitch.x;
+      float const x_224 = x_16.injectionSwitch.y;
+      if ((x_222 < x_224)) {
+        int const x_229 = baseIndex;
+        int const x_231 = (*(tint_symbol_4)).arr[x_229].rightIndex;
+        x_170 = x_231;
+      } else {
+        int const x_232 = baseIndex;
+        int const x_234 = (*(tint_symbol_4)).arr[x_232].rightIndex;
+        x_170 = x_234;
+      }
+      int const x_235 = x_170;
+      if ((x_235 == -1)) {
+        int const x_240 = baseIndex;
+        int const x_241 = *(treeIndex);
+        (*(tint_symbol_4)).arr[x_240].rightIndex = x_241;
+        int const x_243 = *(treeIndex);
+        BST const x_245 = (*(tint_symbol_4)).arr[x_243];
+        param_2 = x_245;
+        int const x_246 = *(data_1);
+        param_3 = x_246;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_2), &(param_3));
+        BST const x_248 = param_2;
+        (*(tint_symbol_4)).arr[x_243] = x_248;
+        return;
+      } else {
+        int const x_250 = baseIndex;
+        int const x_252 = (*(tint_symbol_4)).arr[x_250].rightIndex;
+        baseIndex = x_252;
+        continue;
+      }
+      return;
+    }
+    float const x_254 = x_16.injectionSwitch.x;
+    float const x_256 = x_16.injectionSwitch.y;
+    if ((x_254 > x_256)) {
+      return;
+    }
+  }
+  return;
+}
+
+int search_i1_(thread int* const target, thread tint_array_wrapper* const tint_symbol_5) {
+  int index = 0;
+  BST currentNode = {};
+  int x_261 = 0;
+  index = 0;
+  while (true) {
+    int const x_266 = index;
+    if ((x_266 != -1)) {
+    } else {
+      break;
+    }
+    int const x_269 = index;
+    BST const x_271 = (*(tint_symbol_5)).arr[x_269];
+    currentNode = x_271;
+    int const x_273 = currentNode.data;
+    int const x_274 = *(target);
+    if ((x_273 == x_274)) {
+      int const x_278 = *(target);
+      return x_278;
+    }
+    int const x_279 = *(target);
+    int const x_281 = currentNode.data;
+    if ((x_279 > x_281)) {
+      int const x_287 = currentNode.rightIndex;
+      x_261 = x_287;
+    } else {
+      int const x_289 = currentNode.leftIndex;
+      x_261 = x_289;
+    }
+    int const x_290 = x_261;
+    index = x_290;
+  }
+  return -1;
+}
+
+void main_1(constant buf0& x_16, thread tint_array_wrapper* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  int treeIndex_1 = 0;
+  BST param_4 = {};
+  int param_5 = 0;
+  int param_6 = 0;
+  int param_7 = 0;
+  int param_8 = 0;
+  int param_9 = 0;
+  int param_10 = 0;
+  int param_11 = 0;
+  int param_12 = 0;
+  int param_13 = 0;
+  int param_14 = 0;
+  int param_15 = 0;
+  int param_16 = 0;
+  int param_17 = 0;
+  int param_18 = 0;
+  int param_19 = 0;
+  int param_20 = 0;
+  int param_21 = 0;
+  int param_22 = 0;
+  int param_23 = 0;
+  int count = 0;
+  int i = 0;
+  int result = 0;
+  int param_24 = 0;
+  treeIndex_1 = 0;
+  BST const x_91 = (*(tint_symbol_6)).arr[0];
+  param_4 = x_91;
+  param_5 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_4), &(param_5));
+  BST const x_93 = param_4;
+  (*(tint_symbol_6)).arr[0] = x_93;
+  int const x_95 = treeIndex_1;
+  treeIndex_1 = (x_95 + 1);
+  int const x_97 = treeIndex_1;
+  param_6 = x_97;
+  param_7 = 5;
+  insert_i1_i1_(x_16, &(param_6), &(param_7), tint_symbol_6);
+  int const x_99 = treeIndex_1;
+  treeIndex_1 = (x_99 + 1);
+  int const x_101 = treeIndex_1;
+  param_8 = x_101;
+  param_9 = 12;
+  insert_i1_i1_(x_16, &(param_8), &(param_9), tint_symbol_6);
+  int const x_103 = treeIndex_1;
+  treeIndex_1 = (x_103 + 1);
+  int const x_105 = treeIndex_1;
+  param_10 = x_105;
+  param_11 = 15;
+  insert_i1_i1_(x_16, &(param_10), &(param_11), tint_symbol_6);
+  int const x_107 = treeIndex_1;
+  treeIndex_1 = (x_107 + 1);
+  int const x_109 = treeIndex_1;
+  param_12 = x_109;
+  param_13 = 7;
+  insert_i1_i1_(x_16, &(param_12), &(param_13), tint_symbol_6);
+  int const x_111 = treeIndex_1;
+  treeIndex_1 = (x_111 + 1);
+  int const x_113 = treeIndex_1;
+  param_14 = x_113;
+  param_15 = 8;
+  insert_i1_i1_(x_16, &(param_14), &(param_15), tint_symbol_6);
+  int const x_115 = treeIndex_1;
+  treeIndex_1 = (x_115 + 1);
+  int const x_117 = treeIndex_1;
+  param_16 = x_117;
+  param_17 = 2;
+  insert_i1_i1_(x_16, &(param_16), &(param_17), tint_symbol_6);
+  int const x_119 = treeIndex_1;
+  treeIndex_1 = (x_119 + 1);
+  int const x_121 = treeIndex_1;
+  param_18 = x_121;
+  param_19 = 6;
+  insert_i1_i1_(x_16, &(param_18), &(param_19), tint_symbol_6);
+  int const x_123 = treeIndex_1;
+  treeIndex_1 = (x_123 + 1);
+  int const x_125 = treeIndex_1;
+  param_20 = x_125;
+  param_21 = 17;
+  insert_i1_i1_(x_16, &(param_20), &(param_21), tint_symbol_6);
+  int const x_127 = treeIndex_1;
+  treeIndex_1 = (x_127 + 1);
+  int const x_129 = treeIndex_1;
+  param_22 = x_129;
+  param_23 = 13;
+  insert_i1_i1_(x_16, &(param_22), &(param_23), tint_symbol_6);
+  count = 0;
+  i = 0;
+  while (true) {
+    int const x_135 = i;
+    if ((x_135 < 20)) {
+    } else {
+      break;
+    }
+    int const x_138 = i;
+    param_24 = x_138;
+    int const x_139 = search_i1_(&(param_24), tint_symbol_6);
+    result = x_139;
+    int const x_140 = i;
+    switch(x_140) {
+      case 2:
+      case 5:
+      case 6:
+      case 7:
+      case 8:
+      case 9:
+      case 12:
+      case 13:
+      case 15:
+      case 17: {
+        int const x_150 = result;
+        int const x_151 = i;
+        if ((x_150 == x_151)) {
+          int const x_155 = count;
+          count = (x_155 + 1);
+        }
+        break;
+      }
+      default: {
+        int const x_144 = result;
+        if ((x_144 == -1)) {
+          int const x_148 = count;
+          count = (x_148 + 1);
+        }
+        break;
+      }
+    }
+    {
+      int const x_157 = i;
+      i = (x_157 + 1);
+    }
+  }
+  int const x_159 = count;
+  if ((x_159 == 20)) {
+    *(tint_symbol_7) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_7) = float4(0.0f, 0.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_16 [[buffer(0)]]) {
+  thread tint_array_wrapper tint_symbol_8 = {};
+  thread float4 tint_symbol_9 = 0.0f;
+  main_1(x_16, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-nested-if-and-conditional/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-nested-if-and-conditional/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..990bb9a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-nested-if-and-conditional/1.wgsl.expected.spvasm
@@ -0,0 +1,539 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 355
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %BST "BST"
+               OpMemberName %BST 0 "data"
+               OpMemberName %BST 1 "leftIndex"
+               OpMemberName %BST 2 "rightIndex"
+               OpName %tree_1 "tree_1"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_16 "x_16"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %makeTreeNode_struct_BST_i1_i1_i11_i1_ "makeTreeNode_struct_BST_i1_i1_i11_i1_"
+               OpName %tree "tree"
+               OpName %data "data"
+               OpName %insert_i1_i1_ "insert_i1_i1_"
+               OpName %treeIndex "treeIndex"
+               OpName %data_1 "data_1"
+               OpName %baseIndex "baseIndex"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %x_170 "x_170"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %search_i1_ "search_i1_"
+               OpName %target "target"
+               OpName %index "index"
+               OpName %currentNode "currentNode"
+               OpName %x_261 "x_261"
+               OpName %main_1 "main_1"
+               OpName %treeIndex_1 "treeIndex_1"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpName %param_6 "param_6"
+               OpName %param_7 "param_7"
+               OpName %param_8 "param_8"
+               OpName %param_9 "param_9"
+               OpName %param_10 "param_10"
+               OpName %param_11 "param_11"
+               OpName %param_12 "param_12"
+               OpName %param_13 "param_13"
+               OpName %param_14 "param_14"
+               OpName %param_15 "param_15"
+               OpName %param_16 "param_16"
+               OpName %param_17 "param_17"
+               OpName %param_18 "param_18"
+               OpName %param_19 "param_19"
+               OpName %param_20 "param_20"
+               OpName %param_21 "param_21"
+               OpName %param_22 "param_22"
+               OpName %param_23 "param_23"
+               OpName %count "count"
+               OpName %i "i"
+               OpName %result "result"
+               OpName %param_24 "param_24"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpMemberDecorate %BST 0 Offset 0
+               OpMemberDecorate %BST 1 Offset 4
+               OpMemberDecorate %BST 2 Offset 8
+               OpDecorate %_arr_BST_uint_10 ArrayStride 12
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_16 NonWritable
+               OpDecorate %x_16 DescriptorSet 0
+               OpDecorate %x_16 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+        %BST = OpTypeStruct %int %int %int
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_BST_uint_10 = OpTypeArray %BST %uint_10
+%_ptr_Private__arr_BST_uint_10 = OpTypePointer Private %_arr_BST_uint_10
+          %8 = OpConstantNull %_arr_BST_uint_10
+     %tree_1 = OpVariable %_ptr_Private__arr_BST_uint_10 Private %8
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_16 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+%_ptr_Function_BST = OpTypePointer Function %BST
+%_ptr_Function_int = OpTypePointer Function %int
+         %20 = OpTypeFunction %void %_ptr_Function_BST %_ptr_Function_int
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+     %int_n1 = OpConstant %int -1
+     %uint_2 = OpConstant %uint 2
+         %40 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+         %46 = OpConstantNull %int
+         %48 = OpConstantNull %BST
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+%_ptr_Private_int = OpTypePointer Private %int
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Private_BST = OpTypePointer Private %BST
+        %161 = OpTypeFunction %int %_ptr_Function_int
+        %202 = OpTypeFunction %void
+      %int_9 = OpConstant %int 9
+      %int_1 = OpConstant %int 1
+      %int_5 = OpConstant %int 5
+     %int_12 = OpConstant %int 12
+     %int_15 = OpConstant %int 15
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+      %int_2 = OpConstant %int 2
+      %int_6 = OpConstant %int 6
+     %int_17 = OpConstant %int 17
+     %int_13 = OpConstant %int 13
+     %int_20 = OpConstant %int 20
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+        %341 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %342 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+        %343 = OpTypeFunction %void %main_out
+%makeTreeNode_struct_BST_i1_i1_i11_i1_ = OpFunction %void None %20
+       %tree = OpFunctionParameter %_ptr_Function_BST
+       %data = OpFunctionParameter %_ptr_Function_int
+         %27 = OpLabel
+         %29 = OpLoad %int %data
+         %32 = OpAccessChain %_ptr_Function_int %tree %uint_0
+               OpStore %32 %29
+         %35 = OpAccessChain %_ptr_Function_int %tree %uint_1
+               OpStore %35 %int_n1
+         %39 = OpAccessChain %_ptr_Function_int %tree %uint_2
+               OpStore %39 %int_n1
+               OpReturn
+               OpFunctionEnd
+%insert_i1_i1_ = OpFunction %void None %40
+  %treeIndex = OpFunctionParameter %_ptr_Function_int
+     %data_1 = OpFunctionParameter %_ptr_Function_int
+         %44 = OpLabel
+  %baseIndex = OpVariable %_ptr_Function_int Function %46
+      %param = OpVariable %_ptr_Function_BST Function %48
+    %param_1 = OpVariable %_ptr_Function_int Function %46
+      %x_170 = OpVariable %_ptr_Function_int Function %46
+    %param_2 = OpVariable %_ptr_Function_BST Function %48
+    %param_3 = OpVariable %_ptr_Function_int Function %46
+               OpStore %baseIndex %int_0
+               OpBranch %54
+         %54 = OpLabel
+               OpLoopMerge %55 %56 None
+               OpBranch %57
+         %57 = OpLabel
+         %58 = OpLoad %int %baseIndex
+         %60 = OpLoad %int %treeIndex
+         %61 = OpSLessThanEqual %bool %58 %60
+               OpSelectionMerge %63 None
+               OpBranchConditional %61 %64 %65
+         %64 = OpLabel
+               OpBranch %63
+         %65 = OpLabel
+               OpBranch %55
+         %63 = OpLabel
+         %67 = OpLoad %int %data_1
+         %68 = OpLoad %int %baseIndex
+         %70 = OpAccessChain %_ptr_Private_int %tree_1 %68 %uint_0
+         %71 = OpLoad %int %70
+         %72 = OpSLessThanEqual %bool %67 %71
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %74 %75
+         %74 = OpLabel
+         %76 = OpLoad %int %baseIndex
+         %77 = OpAccessChain %_ptr_Private_int %tree_1 %76 %uint_1
+         %78 = OpLoad %int %77
+         %79 = OpIEqual %bool %78 %int_n1
+               OpSelectionMerge %80 None
+               OpBranchConditional %79 %81 %82
+         %81 = OpLabel
+         %83 = OpLoad %int %baseIndex
+         %85 = OpLoad %int %treeIndex
+         %86 = OpAccessChain %_ptr_Private_int %tree_1 %83 %uint_1
+               OpStore %86 %85
+         %88 = OpAccessChain %_ptr_Uniform_float %x_16 %uint_0 %uint_0
+         %89 = OpLoad %float %88
+         %90 = OpAccessChain %_ptr_Uniform_float %x_16 %uint_0 %uint_1
+         %91 = OpLoad %float %90
+         %92 = OpFOrdLessThan %bool %89 %91
+               OpSelectionMerge %93 None
+               OpBranchConditional %92 %94 %93
+         %94 = OpLabel
+         %96 = OpLoad %int %treeIndex
+         %98 = OpAccessChain %_ptr_Private_BST %tree_1 %96
+         %99 = OpLoad %BST %98
+               OpStore %param %99
+        %101 = OpLoad %int %data_1
+               OpStore %param_1 %101
+        %102 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param %param_1
+        %105 = OpLoad %BST %param
+        %106 = OpAccessChain %_ptr_Private_BST %tree_1 %96
+               OpStore %106 %105
+               OpBranch %93
+         %93 = OpLabel
+        %107 = OpAccessChain %_ptr_Uniform_float %x_16 %uint_0 %uint_0
+        %108 = OpLoad %float %107
+        %109 = OpAccessChain %_ptr_Uniform_float %x_16 %uint_0 %uint_1
+        %110 = OpLoad %float %109
+        %111 = OpFOrdLessThan %bool %108 %110
+               OpSelectionMerge %112 None
+               OpBranchConditional %111 %113 %112
+        %113 = OpLabel
+               OpReturn
+        %112 = OpLabel
+               OpBranch %80
+         %82 = OpLabel
+        %114 = OpLoad %int %baseIndex
+        %115 = OpAccessChain %_ptr_Private_int %tree_1 %114 %uint_1
+        %116 = OpLoad %int %115
+               OpStore %baseIndex %116
+               OpBranch %56
+         %80 = OpLabel
+               OpBranch %73
+         %75 = OpLabel
+        %117 = OpAccessChain %_ptr_Uniform_float %x_16 %uint_0 %uint_0
+        %118 = OpLoad %float %117
+        %119 = OpAccessChain %_ptr_Uniform_float %x_16 %uint_0 %uint_1
+        %120 = OpLoad %float %119
+        %121 = OpFOrdLessThan %bool %118 %120
+               OpSelectionMerge %122 None
+               OpBranchConditional %121 %123 %124
+        %123 = OpLabel
+        %125 = OpLoad %int %baseIndex
+        %126 = OpAccessChain %_ptr_Private_int %tree_1 %125 %uint_2
+        %127 = OpLoad %int %126
+               OpStore %x_170 %127
+               OpBranch %122
+        %124 = OpLabel
+        %128 = OpLoad %int %baseIndex
+        %129 = OpAccessChain %_ptr_Private_int %tree_1 %128 %uint_2
+        %130 = OpLoad %int %129
+               OpStore %x_170 %130
+               OpBranch %122
+        %122 = OpLabel
+        %131 = OpLoad %int %x_170
+        %132 = OpIEqual %bool %131 %int_n1
+               OpSelectionMerge %133 None
+               OpBranchConditional %132 %134 %135
+        %134 = OpLabel
+        %136 = OpLoad %int %baseIndex
+        %138 = OpLoad %int %treeIndex
+        %139 = OpAccessChain %_ptr_Private_int %tree_1 %136 %uint_2
+               OpStore %139 %138
+        %141 = OpLoad %int %treeIndex
+        %142 = OpAccessChain %_ptr_Private_BST %tree_1 %141
+        %143 = OpLoad %BST %142
+               OpStore %param_2 %143
+        %145 = OpLoad %int %data_1
+               OpStore %param_3 %145
+        %146 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param_2 %param_3
+        %149 = OpLoad %BST %param_2
+        %150 = OpAccessChain %_ptr_Private_BST %tree_1 %141
+               OpStore %150 %149
+               OpReturn
+        %135 = OpLabel
+        %151 = OpLoad %int %baseIndex
+        %152 = OpAccessChain %_ptr_Private_int %tree_1 %151 %uint_2
+        %153 = OpLoad %int %152
+               OpStore %baseIndex %153
+               OpBranch %56
+        %133 = OpLabel
+               OpReturn
+         %73 = OpLabel
+        %154 = OpAccessChain %_ptr_Uniform_float %x_16 %uint_0 %uint_0
+        %155 = OpLoad %float %154
+        %156 = OpAccessChain %_ptr_Uniform_float %x_16 %uint_0 %uint_1
+        %157 = OpLoad %float %156
+        %158 = OpFOrdGreaterThan %bool %155 %157
+               OpSelectionMerge %159 None
+               OpBranchConditional %158 %160 %159
+        %160 = OpLabel
+               OpReturn
+        %159 = OpLabel
+               OpBranch %56
+         %56 = OpLabel
+               OpBranch %54
+         %55 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %search_i1_ = OpFunction %int None %161
+     %target = OpFunctionParameter %_ptr_Function_int
+        %164 = OpLabel
+      %index = OpVariable %_ptr_Function_int Function %46
+%currentNode = OpVariable %_ptr_Function_BST Function %48
+      %x_261 = OpVariable %_ptr_Function_int Function %46
+               OpStore %index %int_0
+               OpBranch %168
+        %168 = OpLabel
+               OpLoopMerge %169 %170 None
+               OpBranch %171
+        %171 = OpLabel
+        %172 = OpLoad %int %index
+        %173 = OpINotEqual %bool %172 %int_n1
+               OpSelectionMerge %174 None
+               OpBranchConditional %173 %175 %176
+        %175 = OpLabel
+               OpBranch %174
+        %176 = OpLabel
+               OpBranch %169
+        %174 = OpLabel
+        %177 = OpLoad %int %index
+        %178 = OpAccessChain %_ptr_Private_BST %tree_1 %177
+        %179 = OpLoad %BST %178
+               OpStore %currentNode %179
+        %180 = OpAccessChain %_ptr_Function_int %currentNode %uint_0
+        %181 = OpLoad %int %180
+        %183 = OpLoad %int %target
+        %184 = OpIEqual %bool %181 %183
+               OpSelectionMerge %185 None
+               OpBranchConditional %184 %186 %185
+        %186 = OpLabel
+        %188 = OpLoad %int %target
+               OpReturnValue %188
+        %185 = OpLabel
+        %190 = OpLoad %int %target
+        %191 = OpAccessChain %_ptr_Function_int %currentNode %uint_0
+        %192 = OpLoad %int %191
+        %193 = OpSGreaterThan %bool %190 %192
+               OpSelectionMerge %194 None
+               OpBranchConditional %193 %195 %196
+        %195 = OpLabel
+        %197 = OpAccessChain %_ptr_Function_int %currentNode %uint_2
+        %198 = OpLoad %int %197
+               OpStore %x_261 %198
+               OpBranch %194
+        %196 = OpLabel
+        %199 = OpAccessChain %_ptr_Function_int %currentNode %uint_1
+        %200 = OpLoad %int %199
+               OpStore %x_261 %200
+               OpBranch %194
+        %194 = OpLabel
+        %201 = OpLoad %int %x_261
+               OpStore %index %201
+               OpBranch %170
+        %170 = OpLabel
+               OpBranch %168
+        %169 = OpLabel
+               OpReturnValue %int_n1
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %202
+        %204 = OpLabel
+%treeIndex_1 = OpVariable %_ptr_Function_int Function %46
+    %param_4 = OpVariable %_ptr_Function_BST Function %48
+    %param_5 = OpVariable %_ptr_Function_int Function %46
+    %param_6 = OpVariable %_ptr_Function_int Function %46
+    %param_7 = OpVariable %_ptr_Function_int Function %46
+    %param_8 = OpVariable %_ptr_Function_int Function %46
+    %param_9 = OpVariable %_ptr_Function_int Function %46
+   %param_10 = OpVariable %_ptr_Function_int Function %46
+   %param_11 = OpVariable %_ptr_Function_int Function %46
+   %param_12 = OpVariable %_ptr_Function_int Function %46
+   %param_13 = OpVariable %_ptr_Function_int Function %46
+   %param_14 = OpVariable %_ptr_Function_int Function %46
+   %param_15 = OpVariable %_ptr_Function_int Function %46
+   %param_16 = OpVariable %_ptr_Function_int Function %46
+   %param_17 = OpVariable %_ptr_Function_int Function %46
+   %param_18 = OpVariable %_ptr_Function_int Function %46
+   %param_19 = OpVariable %_ptr_Function_int Function %46
+   %param_20 = OpVariable %_ptr_Function_int Function %46
+   %param_21 = OpVariable %_ptr_Function_int Function %46
+   %param_22 = OpVariable %_ptr_Function_int Function %46
+   %param_23 = OpVariable %_ptr_Function_int Function %46
+      %count = OpVariable %_ptr_Function_int Function %46
+          %i = OpVariable %_ptr_Function_int Function %46
+     %result = OpVariable %_ptr_Function_int Function %46
+   %param_24 = OpVariable %_ptr_Function_int Function %46
+               OpStore %treeIndex_1 %int_0
+        %230 = OpAccessChain %_ptr_Private_BST %tree_1 %int_0
+        %231 = OpLoad %BST %230
+               OpStore %param_4 %231
+               OpStore %param_5 %int_9
+        %233 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param_4 %param_5
+        %236 = OpLoad %BST %param_4
+        %237 = OpAccessChain %_ptr_Private_BST %tree_1 %int_0
+               OpStore %237 %236
+        %238 = OpLoad %int %treeIndex_1
+        %240 = OpIAdd %int %238 %int_1
+               OpStore %treeIndex_1 %240
+        %241 = OpLoad %int %treeIndex_1
+               OpStore %param_6 %241
+               OpStore %param_7 %int_5
+        %243 = OpFunctionCall %void %insert_i1_i1_ %param_6 %param_7
+        %246 = OpLoad %int %treeIndex_1
+        %247 = OpIAdd %int %246 %int_1
+               OpStore %treeIndex_1 %247
+        %248 = OpLoad %int %treeIndex_1
+               OpStore %param_8 %248
+               OpStore %param_9 %int_12
+        %250 = OpFunctionCall %void %insert_i1_i1_ %param_8 %param_9
+        %253 = OpLoad %int %treeIndex_1
+        %254 = OpIAdd %int %253 %int_1
+               OpStore %treeIndex_1 %254
+        %255 = OpLoad %int %treeIndex_1
+               OpStore %param_10 %255
+               OpStore %param_11 %int_15
+        %257 = OpFunctionCall %void %insert_i1_i1_ %param_10 %param_11
+        %260 = OpLoad %int %treeIndex_1
+        %261 = OpIAdd %int %260 %int_1
+               OpStore %treeIndex_1 %261
+        %262 = OpLoad %int %treeIndex_1
+               OpStore %param_12 %262
+               OpStore %param_13 %int_7
+        %264 = OpFunctionCall %void %insert_i1_i1_ %param_12 %param_13
+        %267 = OpLoad %int %treeIndex_1
+        %268 = OpIAdd %int %267 %int_1
+               OpStore %treeIndex_1 %268
+        %269 = OpLoad %int %treeIndex_1
+               OpStore %param_14 %269
+               OpStore %param_15 %int_8
+        %271 = OpFunctionCall %void %insert_i1_i1_ %param_14 %param_15
+        %274 = OpLoad %int %treeIndex_1
+        %275 = OpIAdd %int %274 %int_1
+               OpStore %treeIndex_1 %275
+        %276 = OpLoad %int %treeIndex_1
+               OpStore %param_16 %276
+               OpStore %param_17 %int_2
+        %278 = OpFunctionCall %void %insert_i1_i1_ %param_16 %param_17
+        %281 = OpLoad %int %treeIndex_1
+        %282 = OpIAdd %int %281 %int_1
+               OpStore %treeIndex_1 %282
+        %283 = OpLoad %int %treeIndex_1
+               OpStore %param_18 %283
+               OpStore %param_19 %int_6
+        %285 = OpFunctionCall %void %insert_i1_i1_ %param_18 %param_19
+        %288 = OpLoad %int %treeIndex_1
+        %289 = OpIAdd %int %288 %int_1
+               OpStore %treeIndex_1 %289
+        %290 = OpLoad %int %treeIndex_1
+               OpStore %param_20 %290
+               OpStore %param_21 %int_17
+        %292 = OpFunctionCall %void %insert_i1_i1_ %param_20 %param_21
+        %295 = OpLoad %int %treeIndex_1
+        %296 = OpIAdd %int %295 %int_1
+               OpStore %treeIndex_1 %296
+        %297 = OpLoad %int %treeIndex_1
+               OpStore %param_22 %297
+               OpStore %param_23 %int_13
+        %299 = OpFunctionCall %void %insert_i1_i1_ %param_22 %param_23
+               OpStore %count %int_0
+               OpStore %i %int_0
+               OpBranch %302
+        %302 = OpLabel
+               OpLoopMerge %303 %304 None
+               OpBranch %305
+        %305 = OpLabel
+        %306 = OpLoad %int %i
+        %308 = OpSLessThan %bool %306 %int_20
+               OpSelectionMerge %309 None
+               OpBranchConditional %308 %310 %311
+        %310 = OpLabel
+               OpBranch %309
+        %311 = OpLabel
+               OpBranch %303
+        %309 = OpLabel
+        %312 = OpLoad %int %i
+               OpStore %param_24 %312
+        %313 = OpFunctionCall %int %search_i1_ %param_24
+               OpStore %result %313
+        %315 = OpLoad %int %i
+               OpSelectionMerge %316 None
+               OpSwitch %315 %317 2 %318 5 %318 6 %318 7 %318 8 %318 9 %318 12 %318 13 %318 15 %318 17 %318
+        %318 = OpLabel
+        %319 = OpLoad %int %result
+        %320 = OpLoad %int %i
+        %321 = OpIEqual %bool %319 %320
+               OpSelectionMerge %322 None
+               OpBranchConditional %321 %323 %322
+        %323 = OpLabel
+        %324 = OpLoad %int %count
+        %325 = OpIAdd %int %324 %int_1
+               OpStore %count %325
+               OpBranch %322
+        %322 = OpLabel
+               OpBranch %316
+        %317 = OpLabel
+        %326 = OpLoad %int %result
+        %327 = OpIEqual %bool %326 %int_n1
+               OpSelectionMerge %328 None
+               OpBranchConditional %327 %329 %328
+        %329 = OpLabel
+        %330 = OpLoad %int %count
+        %331 = OpIAdd %int %330 %int_1
+               OpStore %count %331
+               OpBranch %328
+        %328 = OpLabel
+               OpBranch %316
+        %316 = OpLabel
+               OpBranch %304
+        %304 = OpLabel
+        %332 = OpLoad %int %i
+        %333 = OpIAdd %int %332 %int_1
+               OpStore %i %333
+               OpBranch %302
+        %303 = OpLabel
+        %334 = OpLoad %int %count
+        %335 = OpIEqual %bool %334 %int_20
+               OpSelectionMerge %336 None
+               OpBranchConditional %335 %337 %338
+        %337 = OpLabel
+               OpStore %x_GLF_color %341
+               OpBranch %336
+        %338 = OpLabel
+               OpStore %x_GLF_color %342
+               OpBranch %336
+        %336 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %343
+%tint_symbol = OpFunctionParameter %main_out
+        %347 = OpLabel
+        %348 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %348
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %202
+        %350 = OpLabel
+        %351 = OpFunctionCall %void %main_1
+        %353 = OpLoad %v4float %x_GLF_color
+        %354 = OpCompositeConstruct %main_out %353
+        %352 = OpFunctionCall %void %tint_symbol_2 %354
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-nested-if-and-conditional/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-nested-if-and-conditional/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..06f95bb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-nested-if-and-conditional/1.wgsl.expected.wgsl
@@ -0,0 +1,293 @@
+struct BST {
+  data : i32;
+  leftIndex : i32;
+  rightIndex : i32;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> tree_1 : array<BST, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_16 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn makeTreeNode_struct_BST_i1_i1_i11_i1_(tree : ptr<function, BST>, data : ptr<function, i32>) {
+  let x_165 : i32 = *(data);
+  (*(tree)).data = x_165;
+  (*(tree)).leftIndex = -1;
+  (*(tree)).rightIndex = -1;
+  return;
+}
+
+fn insert_i1_i1_(treeIndex : ptr<function, i32>, data_1 : ptr<function, i32>) {
+  var baseIndex : i32;
+  var param : BST;
+  var param_1 : i32;
+  var x_170 : i32;
+  var param_2 : BST;
+  var param_3 : i32;
+  baseIndex = 0;
+  loop {
+    let x_175 : i32 = baseIndex;
+    let x_176 : i32 = *(treeIndex);
+    if ((x_175 <= x_176)) {
+    } else {
+      break;
+    }
+    let x_179 : i32 = *(data_1);
+    let x_180 : i32 = baseIndex;
+    let x_182 : i32 = tree_1[x_180].data;
+    if ((x_179 <= x_182)) {
+      let x_187 : i32 = baseIndex;
+      let x_189 : i32 = tree_1[x_187].leftIndex;
+      if ((x_189 == -1)) {
+        let x_194 : i32 = baseIndex;
+        let x_195 : i32 = *(treeIndex);
+        tree_1[x_194].leftIndex = x_195;
+        let x_198 : f32 = x_16.injectionSwitch.x;
+        let x_200 : f32 = x_16.injectionSwitch.y;
+        if ((x_198 < x_200)) {
+          let x_204 : i32 = *(treeIndex);
+          let x_206 : BST = tree_1[x_204];
+          param = x_206;
+          let x_207 : i32 = *(data_1);
+          param_1 = x_207;
+          makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param), &(param_1));
+          let x_209 : BST = param;
+          tree_1[x_204] = x_209;
+        }
+        let x_212 : f32 = x_16.injectionSwitch.x;
+        let x_214 : f32 = x_16.injectionSwitch.y;
+        if ((x_212 < x_214)) {
+          return;
+        }
+      } else {
+        let x_218 : i32 = baseIndex;
+        let x_220 : i32 = tree_1[x_218].leftIndex;
+        baseIndex = x_220;
+        continue;
+      }
+    } else {
+      let x_222 : f32 = x_16.injectionSwitch.x;
+      let x_224 : f32 = x_16.injectionSwitch.y;
+      if ((x_222 < x_224)) {
+        let x_229 : i32 = baseIndex;
+        let x_231 : i32 = tree_1[x_229].rightIndex;
+        x_170 = x_231;
+      } else {
+        let x_232 : i32 = baseIndex;
+        let x_234 : i32 = tree_1[x_232].rightIndex;
+        x_170 = x_234;
+      }
+      let x_235 : i32 = x_170;
+      if ((x_235 == -1)) {
+        let x_240 : i32 = baseIndex;
+        let x_241 : i32 = *(treeIndex);
+        tree_1[x_240].rightIndex = x_241;
+        let x_243 : i32 = *(treeIndex);
+        let x_245 : BST = tree_1[x_243];
+        param_2 = x_245;
+        let x_246 : i32 = *(data_1);
+        param_3 = x_246;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_2), &(param_3));
+        let x_248 : BST = param_2;
+        tree_1[x_243] = x_248;
+        return;
+      } else {
+        let x_250 : i32 = baseIndex;
+        let x_252 : i32 = tree_1[x_250].rightIndex;
+        baseIndex = x_252;
+        continue;
+      }
+      return;
+    }
+    let x_254 : f32 = x_16.injectionSwitch.x;
+    let x_256 : f32 = x_16.injectionSwitch.y;
+    if ((x_254 > x_256)) {
+      return;
+    }
+  }
+  return;
+}
+
+fn search_i1_(target : ptr<function, i32>) -> i32 {
+  var index : i32;
+  var currentNode : BST;
+  var x_261 : i32;
+  index = 0;
+  loop {
+    let x_266 : i32 = index;
+    if ((x_266 != -1)) {
+    } else {
+      break;
+    }
+    let x_269 : i32 = index;
+    let x_271 : BST = tree_1[x_269];
+    currentNode = x_271;
+    let x_273 : i32 = currentNode.data;
+    let x_274 : i32 = *(target);
+    if ((x_273 == x_274)) {
+      let x_278 : i32 = *(target);
+      return x_278;
+    }
+    let x_279 : i32 = *(target);
+    let x_281 : i32 = currentNode.data;
+    if ((x_279 > x_281)) {
+      let x_287 : i32 = currentNode.rightIndex;
+      x_261 = x_287;
+    } else {
+      let x_289 : i32 = currentNode.leftIndex;
+      x_261 = x_289;
+    }
+    let x_290 : i32 = x_261;
+    index = x_290;
+  }
+  return -1;
+}
+
+fn main_1() {
+  var treeIndex_1 : i32;
+  var param_4 : BST;
+  var param_5 : i32;
+  var param_6 : i32;
+  var param_7 : i32;
+  var param_8 : i32;
+  var param_9 : i32;
+  var param_10 : i32;
+  var param_11 : i32;
+  var param_12 : i32;
+  var param_13 : i32;
+  var param_14 : i32;
+  var param_15 : i32;
+  var param_16 : i32;
+  var param_17 : i32;
+  var param_18 : i32;
+  var param_19 : i32;
+  var param_20 : i32;
+  var param_21 : i32;
+  var param_22 : i32;
+  var param_23 : i32;
+  var count : i32;
+  var i : i32;
+  var result : i32;
+  var param_24 : i32;
+  treeIndex_1 = 0;
+  let x_91 : BST = tree_1[0];
+  param_4 = x_91;
+  param_5 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_4), &(param_5));
+  let x_93 : BST = param_4;
+  tree_1[0] = x_93;
+  let x_95 : i32 = treeIndex_1;
+  treeIndex_1 = (x_95 + 1);
+  let x_97 : i32 = treeIndex_1;
+  param_6 = x_97;
+  param_7 = 5;
+  insert_i1_i1_(&(param_6), &(param_7));
+  let x_99 : i32 = treeIndex_1;
+  treeIndex_1 = (x_99 + 1);
+  let x_101 : i32 = treeIndex_1;
+  param_8 = x_101;
+  param_9 = 12;
+  insert_i1_i1_(&(param_8), &(param_9));
+  let x_103 : i32 = treeIndex_1;
+  treeIndex_1 = (x_103 + 1);
+  let x_105 : i32 = treeIndex_1;
+  param_10 = x_105;
+  param_11 = 15;
+  insert_i1_i1_(&(param_10), &(param_11));
+  let x_107 : i32 = treeIndex_1;
+  treeIndex_1 = (x_107 + 1);
+  let x_109 : i32 = treeIndex_1;
+  param_12 = x_109;
+  param_13 = 7;
+  insert_i1_i1_(&(param_12), &(param_13));
+  let x_111 : i32 = treeIndex_1;
+  treeIndex_1 = (x_111 + 1);
+  let x_113 : i32 = treeIndex_1;
+  param_14 = x_113;
+  param_15 = 8;
+  insert_i1_i1_(&(param_14), &(param_15));
+  let x_115 : i32 = treeIndex_1;
+  treeIndex_1 = (x_115 + 1);
+  let x_117 : i32 = treeIndex_1;
+  param_16 = x_117;
+  param_17 = 2;
+  insert_i1_i1_(&(param_16), &(param_17));
+  let x_119 : i32 = treeIndex_1;
+  treeIndex_1 = (x_119 + 1);
+  let x_121 : i32 = treeIndex_1;
+  param_18 = x_121;
+  param_19 = 6;
+  insert_i1_i1_(&(param_18), &(param_19));
+  let x_123 : i32 = treeIndex_1;
+  treeIndex_1 = (x_123 + 1);
+  let x_125 : i32 = treeIndex_1;
+  param_20 = x_125;
+  param_21 = 17;
+  insert_i1_i1_(&(param_20), &(param_21));
+  let x_127 : i32 = treeIndex_1;
+  treeIndex_1 = (x_127 + 1);
+  let x_129 : i32 = treeIndex_1;
+  param_22 = x_129;
+  param_23 = 13;
+  insert_i1_i1_(&(param_22), &(param_23));
+  count = 0;
+  i = 0;
+  loop {
+    let x_135 : i32 = i;
+    if ((x_135 < 20)) {
+    } else {
+      break;
+    }
+    let x_138 : i32 = i;
+    param_24 = x_138;
+    let x_139 : i32 = search_i1_(&(param_24));
+    result = x_139;
+    let x_140 : i32 = i;
+    switch(x_140) {
+      case 2, 5, 6, 7, 8, 9, 12, 13, 15, 17: {
+        let x_150 : i32 = result;
+        let x_151 : i32 = i;
+        if ((x_150 == x_151)) {
+          let x_155 : i32 = count;
+          count = (x_155 + 1);
+        }
+      }
+      default: {
+        let x_144 : i32 = result;
+        if ((x_144 == -1)) {
+          let x_148 : i32 = count;
+          count = (x_148 + 1);
+        }
+      }
+    }
+
+    continuing {
+      let x_157 : i32 = i;
+      i = (x_157 + 1);
+    }
+  }
+  let x_159 : i32 = count;
+  if ((x_159 == 20)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/0-opt.spvasm
new file mode 100644
index 0000000..6c9029f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/0-opt.spvasm
@@ -0,0 +1,420 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %BST "BST"
+               OpMemberName %BST 0 "data"
+               OpMemberName %BST 1 "leftIndex"
+               OpMemberName %BST 2 "rightIndex"
+               OpName %makeTreeNode_struct_BST_i1_i1_i11_i1_ "makeTreeNode(struct-BST-i1-i1-i11;i1;"
+               OpName %node "node"
+               OpName %data "data"
+               OpName %insert_i1_i1_ "insert(i1;i1;"
+               OpName %treeIndex "treeIndex"
+               OpName %data_0 "data"
+               OpName %search_i1_ "search(i1;"
+               OpName %target "target"
+               OpName %baseIndex "baseIndex"
+               OpName %tree "tree"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %param_1 "param"
+               OpName %param_2 "param"
+               OpName %index "index"
+               OpName %currentNode "currentNode"
+               OpName %treeIndex_0 "treeIndex"
+               OpName %param_3 "param"
+               OpName %param_4 "param"
+               OpName %param_5 "param"
+               OpName %param_6 "param"
+               OpName %param_7 "param"
+               OpName %param_8 "param"
+               OpName %param_9 "param"
+               OpName %param_10 "param"
+               OpName %param_11 "param"
+               OpName %param_12 "param"
+               OpName %param_13 "param"
+               OpName %param_14 "param"
+               OpName %param_15 "param"
+               OpName %param_16 "param"
+               OpName %param_17 "param"
+               OpName %param_18 "param"
+               OpName %param_19 "param"
+               OpName %param_20 "param"
+               OpName %param_21 "param"
+               OpName %param_22 "param"
+               OpName %count "count"
+               OpName %i "i"
+               OpName %result "result"
+               OpName %param_23 "param"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %47 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+        %BST = OpTypeStruct %int %int %int
+%_ptr_Function_BST = OpTypePointer Function %BST
+%_ptr_Function_int = OpTypePointer Function %int
+         %51 = OpTypeFunction %void %_ptr_Function_BST %_ptr_Function_int
+         %52 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+         %53 = OpTypeFunction %int %_ptr_Function_int
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+     %int_n1 = OpConstant %int -1
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_BST_uint_10 = OpTypeArray %BST %uint_10
+%_ptr_Private__arr_BST_uint_10 = OpTypePointer Private %_arr_BST_uint_10
+       %tree = OpVariable %_ptr_Private__arr_BST_uint_10 Private
+%_ptr_Private_int = OpTypePointer Private %int
+%_ptr_Private_BST = OpTypePointer Private %BST
+      %int_9 = OpConstant %int 9
+      %int_5 = OpConstant %int 5
+     %int_12 = OpConstant %int 12
+     %int_15 = OpConstant %int 15
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+      %int_6 = OpConstant %int 6
+     %int_17 = OpConstant %int 17
+     %int_13 = OpConstant %int 13
+     %int_20 = OpConstant %int 20
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %80 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %81 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+       %main = OpFunction %void None %47
+         %82 = OpLabel
+%treeIndex_0 = OpVariable %_ptr_Function_int Function
+    %param_3 = OpVariable %_ptr_Function_BST Function
+    %param_4 = OpVariable %_ptr_Function_int Function
+    %param_5 = OpVariable %_ptr_Function_int Function
+    %param_6 = OpVariable %_ptr_Function_int Function
+    %param_7 = OpVariable %_ptr_Function_int Function
+    %param_8 = OpVariable %_ptr_Function_int Function
+    %param_9 = OpVariable %_ptr_Function_int Function
+   %param_10 = OpVariable %_ptr_Function_int Function
+   %param_11 = OpVariable %_ptr_Function_int Function
+   %param_12 = OpVariable %_ptr_Function_int Function
+   %param_13 = OpVariable %_ptr_Function_int Function
+   %param_14 = OpVariable %_ptr_Function_int Function
+   %param_15 = OpVariable %_ptr_Function_int Function
+   %param_16 = OpVariable %_ptr_Function_int Function
+   %param_17 = OpVariable %_ptr_Function_int Function
+   %param_18 = OpVariable %_ptr_Function_int Function
+   %param_19 = OpVariable %_ptr_Function_int Function
+   %param_20 = OpVariable %_ptr_Function_int Function
+   %param_21 = OpVariable %_ptr_Function_int Function
+   %param_22 = OpVariable %_ptr_Function_int Function
+      %count = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+     %result = OpVariable %_ptr_Function_int Function
+   %param_23 = OpVariable %_ptr_Function_int Function
+               OpStore %treeIndex_0 %int_0
+         %83 = OpAccessChain %_ptr_Private_BST %tree %int_0
+         %84 = OpLoad %BST %83
+               OpStore %param_3 %84
+               OpStore %param_4 %int_9
+         %85 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param_3 %param_4
+         %86 = OpLoad %BST %param_3
+         %87 = OpAccessChain %_ptr_Private_BST %tree %int_0
+               OpStore %87 %86
+         %88 = OpLoad %int %treeIndex_0
+         %89 = OpIAdd %int %88 %int_1
+               OpStore %treeIndex_0 %89
+         %90 = OpLoad %int %treeIndex_0
+               OpStore %param_5 %90
+               OpStore %param_6 %int_5
+         %91 = OpFunctionCall %void %insert_i1_i1_ %param_5 %param_6
+         %92 = OpLoad %int %treeIndex_0
+         %93 = OpIAdd %int %92 %int_1
+               OpStore %treeIndex_0 %93
+         %94 = OpLoad %int %treeIndex_0
+               OpStore %param_7 %94
+               OpStore %param_8 %int_12
+         %95 = OpFunctionCall %void %insert_i1_i1_ %param_7 %param_8
+         %96 = OpLoad %int %treeIndex_0
+         %97 = OpIAdd %int %96 %int_1
+               OpStore %treeIndex_0 %97
+         %98 = OpLoad %int %treeIndex_0
+               OpStore %param_9 %98
+               OpStore %param_10 %int_15
+         %99 = OpFunctionCall %void %insert_i1_i1_ %param_9 %param_10
+        %100 = OpLoad %int %treeIndex_0
+        %101 = OpIAdd %int %100 %int_1
+               OpStore %treeIndex_0 %101
+        %102 = OpLoad %int %treeIndex_0
+               OpStore %param_11 %102
+               OpStore %param_12 %int_7
+        %103 = OpFunctionCall %void %insert_i1_i1_ %param_11 %param_12
+        %104 = OpLoad %int %treeIndex_0
+        %105 = OpIAdd %int %104 %int_1
+               OpStore %treeIndex_0 %105
+        %106 = OpLoad %int %treeIndex_0
+               OpStore %param_13 %106
+               OpStore %param_14 %int_8
+        %107 = OpFunctionCall %void %insert_i1_i1_ %param_13 %param_14
+        %108 = OpLoad %int %treeIndex_0
+        %109 = OpIAdd %int %108 %int_1
+               OpStore %treeIndex_0 %109
+        %110 = OpLoad %int %treeIndex_0
+               OpStore %param_15 %110
+               OpStore %param_16 %int_2
+        %111 = OpFunctionCall %void %insert_i1_i1_ %param_15 %param_16
+        %112 = OpLoad %int %treeIndex_0
+        %113 = OpIAdd %int %112 %int_1
+               OpStore %treeIndex_0 %113
+        %114 = OpLoad %int %treeIndex_0
+               OpStore %param_17 %114
+               OpStore %param_18 %int_6
+        %115 = OpFunctionCall %void %insert_i1_i1_ %param_17 %param_18
+        %116 = OpLoad %int %treeIndex_0
+        %117 = OpIAdd %int %116 %int_1
+               OpStore %treeIndex_0 %117
+        %118 = OpLoad %int %treeIndex_0
+               OpStore %param_19 %118
+               OpStore %param_20 %int_17
+        %119 = OpFunctionCall %void %insert_i1_i1_ %param_19 %param_20
+        %120 = OpLoad %int %treeIndex_0
+        %121 = OpIAdd %int %120 %int_1
+               OpStore %treeIndex_0 %121
+        %122 = OpLoad %int %treeIndex_0
+               OpStore %param_21 %122
+               OpStore %param_22 %int_13
+        %123 = OpFunctionCall %void %insert_i1_i1_ %param_21 %param_22
+               OpStore %count %int_0
+               OpStore %i %int_0
+               OpBranch %124
+        %124 = OpLabel
+               OpLoopMerge %125 %126 None
+               OpBranch %127
+        %127 = OpLabel
+        %128 = OpLoad %int %i
+        %129 = OpSLessThan %bool %128 %int_20
+               OpBranchConditional %129 %130 %125
+        %130 = OpLabel
+        %131 = OpLoad %int %i
+               OpStore %param_23 %131
+        %132 = OpFunctionCall %int %search_i1_ %param_23
+               OpStore %result %132
+        %133 = OpLoad %int %i
+               OpSelectionMerge %134 None
+               OpSwitch %133 %135 9 %136 5 %136 12 %136 15 %136 7 %136 8 %136 2 %136 6 %136 17 %136 13 %136
+        %135 = OpLabel
+        %137 = OpLoad %int %result
+        %138 = OpIEqual %bool %137 %int_n1
+               OpSelectionMerge %139 None
+               OpBranchConditional %138 %140 %139
+        %140 = OpLabel
+        %141 = OpLoad %int %count
+        %142 = OpIAdd %int %141 %int_1
+               OpStore %count %142
+               OpBranch %139
+        %139 = OpLabel
+               OpBranch %134
+        %136 = OpLabel
+        %143 = OpLoad %int %result
+        %144 = OpLoad %int %i
+        %145 = OpIEqual %bool %143 %144
+               OpSelectionMerge %146 None
+               OpBranchConditional %145 %147 %146
+        %147 = OpLabel
+        %148 = OpLoad %int %count
+        %149 = OpIAdd %int %148 %int_1
+               OpStore %count %149
+               OpBranch %146
+        %146 = OpLabel
+               OpBranch %134
+        %134 = OpLabel
+               OpBranch %126
+        %126 = OpLabel
+        %150 = OpLoad %int %i
+        %151 = OpIAdd %int %150 %int_1
+               OpStore %i %151
+               OpBranch %124
+        %125 = OpLabel
+        %152 = OpLoad %int %count
+        %153 = OpIEqual %bool %152 %int_20
+               OpSelectionMerge %154 None
+               OpBranchConditional %153 %155 %156
+        %155 = OpLabel
+               OpStore %_GLF_color %80
+               OpBranch %154
+        %156 = OpLabel
+               OpStore %_GLF_color %81
+               OpBranch %154
+        %154 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%makeTreeNode_struct_BST_i1_i1_i11_i1_ = OpFunction %void None %51
+       %node = OpFunctionParameter %_ptr_Function_BST
+       %data = OpFunctionParameter %_ptr_Function_int
+        %157 = OpLabel
+        %158 = OpLoad %int %data
+        %159 = OpAccessChain %_ptr_Function_int %node %int_0
+               OpStore %159 %158
+        %160 = OpAccessChain %_ptr_Function_int %node %int_1
+               OpStore %160 %int_n1
+        %161 = OpAccessChain %_ptr_Function_int %node %int_2
+               OpStore %161 %int_n1
+               OpReturn
+               OpFunctionEnd
+%insert_i1_i1_ = OpFunction %void None %52
+  %treeIndex = OpFunctionParameter %_ptr_Function_int
+     %data_0 = OpFunctionParameter %_ptr_Function_int
+        %162 = OpLabel
+  %baseIndex = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_BST Function
+    %param_0 = OpVariable %_ptr_Function_int Function
+    %param_1 = OpVariable %_ptr_Function_BST Function
+    %param_2 = OpVariable %_ptr_Function_int Function
+               OpStore %baseIndex %int_0
+               OpBranch %163
+        %163 = OpLabel
+               OpLoopMerge %164 %165 None
+               OpBranch %166
+        %166 = OpLabel
+        %167 = OpLoad %int %baseIndex
+        %168 = OpLoad %int %treeIndex
+        %169 = OpSLessThanEqual %bool %167 %168
+               OpBranchConditional %169 %170 %164
+        %170 = OpLabel
+        %171 = OpLoad %int %data_0
+        %172 = OpLoad %int %baseIndex
+        %173 = OpAccessChain %_ptr_Private_int %tree %172 %int_0
+        %174 = OpLoad %int %173
+        %175 = OpSLessThanEqual %bool %171 %174
+               OpSelectionMerge %176 None
+               OpBranchConditional %175 %177 %178
+        %177 = OpLabel
+        %179 = OpLoad %int %baseIndex
+        %180 = OpAccessChain %_ptr_Private_int %tree %179 %int_1
+        %181 = OpLoad %int %180
+        %182 = OpIEqual %bool %181 %int_n1
+               OpSelectionMerge %183 None
+               OpBranchConditional %182 %184 %185
+        %184 = OpLabel
+        %186 = OpLoad %int %baseIndex
+        %187 = OpLoad %int %treeIndex
+        %188 = OpAccessChain %_ptr_Private_int %tree %186 %int_1
+               OpStore %188 %187
+        %189 = OpLoad %int %treeIndex
+        %190 = OpAccessChain %_ptr_Private_BST %tree %189
+        %191 = OpLoad %BST %190
+               OpStore %param %191
+        %192 = OpLoad %int %data_0
+               OpStore %param_0 %192
+        %193 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param %param_0
+        %194 = OpLoad %BST %param
+        %195 = OpAccessChain %_ptr_Private_BST %tree %189
+               OpStore %195 %194
+               OpReturn
+        %185 = OpLabel
+        %196 = OpLoad %int %baseIndex
+        %197 = OpAccessChain %_ptr_Private_int %tree %196 %int_1
+        %198 = OpLoad %int %197
+               OpStore %baseIndex %198
+               OpBranch %165
+        %183 = OpLabel
+               OpUnreachable
+        %178 = OpLabel
+        %199 = OpLoad %int %baseIndex
+        %200 = OpAccessChain %_ptr_Private_int %tree %199 %int_2
+        %201 = OpLoad %int %200
+        %202 = OpIEqual %bool %201 %int_n1
+               OpSelectionMerge %203 None
+               OpBranchConditional %202 %204 %205
+        %204 = OpLabel
+        %206 = OpLoad %int %baseIndex
+        %207 = OpLoad %int %treeIndex
+        %208 = OpAccessChain %_ptr_Private_int %tree %206 %int_2
+               OpStore %208 %207
+        %209 = OpLoad %int %treeIndex
+        %210 = OpAccessChain %_ptr_Private_BST %tree %209
+        %211 = OpLoad %BST %210
+               OpStore %param_1 %211
+        %212 = OpLoad %int %data_0
+               OpStore %param_2 %212
+        %213 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param_1 %param_2
+        %214 = OpLoad %BST %param_1
+        %215 = OpAccessChain %_ptr_Private_BST %tree %209
+               OpStore %215 %214
+               OpReturn
+        %205 = OpLabel
+        %216 = OpLoad %int %baseIndex
+        %217 = OpAccessChain %_ptr_Private_int %tree %216 %int_2
+        %218 = OpLoad %int %217
+               OpStore %baseIndex %218
+               OpBranch %165
+        %203 = OpLabel
+               OpUnreachable
+        %176 = OpLabel
+               OpUnreachable
+        %165 = OpLabel
+               OpBranch %163
+        %164 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %search_i1_ = OpFunction %int None %53
+     %target = OpFunctionParameter %_ptr_Function_int
+        %219 = OpLabel
+      %index = OpVariable %_ptr_Function_int Function
+%currentNode = OpVariable %_ptr_Function_BST Function
+        %220 = OpVariable %_ptr_Function_int Function
+               OpStore %index %int_0
+               OpBranch %221
+        %221 = OpLabel
+               OpLoopMerge %222 %223 None
+               OpBranch %224
+        %224 = OpLabel
+        %225 = OpLoad %int %index
+        %226 = OpINotEqual %bool %225 %int_n1
+               OpBranchConditional %226 %227 %222
+        %227 = OpLabel
+        %228 = OpLoad %int %index
+        %229 = OpAccessChain %_ptr_Private_BST %tree %228
+        %230 = OpLoad %BST %229
+               OpStore %currentNode %230
+        %231 = OpAccessChain %_ptr_Function_int %currentNode %int_0
+        %232 = OpLoad %int %231
+        %233 = OpLoad %int %target
+        %234 = OpIEqual %bool %232 %233
+               OpSelectionMerge %235 None
+               OpBranchConditional %234 %236 %235
+        %236 = OpLabel
+        %237 = OpLoad %int %target
+               OpReturnValue %237
+        %235 = OpLabel
+        %238 = OpLoad %int %target
+        %239 = OpAccessChain %_ptr_Function_int %currentNode %int_0
+        %240 = OpLoad %int %239
+        %241 = OpSGreaterThan %bool %238 %240
+               OpSelectionMerge %242 None
+               OpBranchConditional %241 %243 %244
+        %243 = OpLabel
+        %245 = OpAccessChain %_ptr_Function_int %currentNode %int_2
+        %246 = OpLoad %int %245
+               OpStore %220 %246
+               OpBranch %242
+        %244 = OpLabel
+        %247 = OpAccessChain %_ptr_Function_int %currentNode %int_1
+        %248 = OpLoad %int %247
+               OpStore %220 %248
+               OpBranch %242
+        %242 = OpLabel
+        %249 = OpLoad %int %220
+               OpStore %index %249
+               OpBranch %223
+        %223 = OpLabel
+               OpBranch %221
+        %222 = OpLabel
+               OpReturnValue %int_n1
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..1a82ba8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,232 @@
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+
+static BST tree[10] = (BST[10])0;
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void makeTreeNode_struct_BST_i1_i1_i11_i1_(inout BST node, inout int data) {
+  const int x_158 = data;
+  node.data = x_158;
+  node.leftIndex = -1;
+  node.rightIndex = -1;
+  return;
+}
+
+void insert_i1_i1_(inout int treeIndex, inout int data_1) {
+  int baseIndex = 0;
+  BST param = (BST)0;
+  int param_1 = 0;
+  BST param_2 = (BST)0;
+  int param_3 = 0;
+  baseIndex = 0;
+  while (true) {
+    const int x_167 = baseIndex;
+    const int x_168 = treeIndex;
+    if ((x_167 <= x_168)) {
+    } else {
+      break;
+    }
+    const int x_171 = data_1;
+    const int x_174 = tree[baseIndex].data;
+    if ((x_171 <= x_174)) {
+      const int x_181 = tree[baseIndex].leftIndex;
+      if ((x_181 == -1)) {
+        const int x_186 = baseIndex;
+        const int x_187 = treeIndex;
+        tree[x_186].leftIndex = x_187;
+        const int x_189 = treeIndex;
+        const BST x_191 = tree[x_189];
+        param = x_191;
+        const int x_192 = data_1;
+        param_1 = x_192;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(param, param_1);
+        tree[x_189] = param;
+        return;
+      } else {
+        const int x_198 = tree[baseIndex].leftIndex;
+        baseIndex = x_198;
+        continue;
+      }
+      return;
+    } else {
+      const int x_201 = tree[baseIndex].rightIndex;
+      if ((x_201 == -1)) {
+        const int x_206 = baseIndex;
+        const int x_207 = treeIndex;
+        tree[x_206].rightIndex = x_207;
+        const int x_209 = treeIndex;
+        const BST x_211 = tree[x_209];
+        param_2 = x_211;
+        const int x_212 = data_1;
+        param_3 = x_212;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(param_2, param_3);
+        tree[x_209] = param_2;
+        return;
+      } else {
+        const int x_218 = tree[baseIndex].rightIndex;
+        baseIndex = x_218;
+        continue;
+      }
+      return;
+    }
+    return;
+  }
+  return;
+}
+
+int search_i1_(inout int target) {
+  int index = 0;
+  BST currentNode = (BST)0;
+  int x_220 = 0;
+  index = 0;
+  while (true) {
+    if ((index != -1)) {
+    } else {
+      break;
+    }
+    const BST x_230 = tree[index];
+    currentNode = x_230;
+    const int x_232 = currentNode.data;
+    const int x_233 = target;
+    if ((x_232 == x_233)) {
+      const int x_237 = target;
+      return x_237;
+    }
+    const int x_238 = target;
+    const int x_240 = currentNode.data;
+    if ((x_238 > x_240)) {
+      const int x_246 = currentNode.rightIndex;
+      x_220 = x_246;
+    } else {
+      const int x_248 = currentNode.leftIndex;
+      x_220 = x_248;
+    }
+    index = x_220;
+  }
+  return -1;
+}
+
+void main_1() {
+  int treeIndex_1 = 0;
+  BST param_4 = (BST)0;
+  int param_5 = 0;
+  int param_6 = 0;
+  int param_7 = 0;
+  int param_8 = 0;
+  int param_9 = 0;
+  int param_10 = 0;
+  int param_11 = 0;
+  int param_12 = 0;
+  int param_13 = 0;
+  int param_14 = 0;
+  int param_15 = 0;
+  int param_16 = 0;
+  int param_17 = 0;
+  int param_18 = 0;
+  int param_19 = 0;
+  int param_20 = 0;
+  int param_21 = 0;
+  int param_22 = 0;
+  int param_23 = 0;
+  int count = 0;
+  int i = 0;
+  int result = 0;
+  int param_24 = 0;
+  treeIndex_1 = 0;
+  const BST x_84 = tree[0];
+  param_4 = x_84;
+  param_5 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(param_4, param_5);
+  tree[0] = param_4;
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_6 = treeIndex_1;
+  param_7 = 5;
+  insert_i1_i1_(param_6, param_7);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_8 = treeIndex_1;
+  param_9 = 12;
+  insert_i1_i1_(param_8, param_9);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_10 = treeIndex_1;
+  param_11 = 15;
+  insert_i1_i1_(param_10, param_11);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_12 = treeIndex_1;
+  param_13 = 7;
+  insert_i1_i1_(param_12, param_13);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_14 = treeIndex_1;
+  param_15 = 8;
+  insert_i1_i1_(param_14, param_15);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_16 = treeIndex_1;
+  param_17 = 2;
+  insert_i1_i1_(param_16, param_17);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_18 = treeIndex_1;
+  param_19 = 6;
+  insert_i1_i1_(param_18, param_19);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_20 = treeIndex_1;
+  param_21 = 17;
+  insert_i1_i1_(param_20, param_21);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_22 = treeIndex_1;
+  param_23 = 13;
+  insert_i1_i1_(param_22, param_23);
+  count = 0;
+  i = 0;
+  {
+    for(; (i < 20); i = (i + 1)) {
+      param_24 = i;
+      const int x_132 = search_i1_(param_24);
+      result = x_132;
+      switch(i) {
+        case 2:
+        case 5:
+        case 6:
+        case 7:
+        case 8:
+        case 9:
+        case 12:
+        case 13:
+        case 15:
+        case 17: {
+          if ((result == i)) {
+            count = (count + 1);
+          }
+          break;
+        }
+        default: {
+          if ((result == -1)) {
+            count = (count + 1);
+          }
+          break;
+        }
+      }
+    }
+  }
+  if ((count == 20)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..02ef450
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/0-opt.spvasm.expected.msl
@@ -0,0 +1,281 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+struct tint_array_wrapper {
+  BST arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void makeTreeNode_struct_BST_i1_i1_i11_i1_(thread BST* const node, thread int* const data) {
+  int const x_158 = *(data);
+  (*(node)).data = x_158;
+  (*(node)).leftIndex = -1;
+  (*(node)).rightIndex = -1;
+  return;
+}
+
+void insert_i1_i1_(thread int* const treeIndex, thread int* const data_1, thread tint_array_wrapper* const tint_symbol_4) {
+  int baseIndex = 0;
+  BST param = {};
+  int param_1 = 0;
+  BST param_2 = {};
+  int param_3 = 0;
+  baseIndex = 0;
+  while (true) {
+    int const x_167 = baseIndex;
+    int const x_168 = *(treeIndex);
+    if ((x_167 <= x_168)) {
+    } else {
+      break;
+    }
+    int const x_171 = *(data_1);
+    int const x_172 = baseIndex;
+    int const x_174 = (*(tint_symbol_4)).arr[x_172].data;
+    if ((x_171 <= x_174)) {
+      int const x_179 = baseIndex;
+      int const x_181 = (*(tint_symbol_4)).arr[x_179].leftIndex;
+      if ((x_181 == -1)) {
+        int const x_186 = baseIndex;
+        int const x_187 = *(treeIndex);
+        (*(tint_symbol_4)).arr[x_186].leftIndex = x_187;
+        int const x_189 = *(treeIndex);
+        BST const x_191 = (*(tint_symbol_4)).arr[x_189];
+        param = x_191;
+        int const x_192 = *(data_1);
+        param_1 = x_192;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param), &(param_1));
+        BST const x_194 = param;
+        (*(tint_symbol_4)).arr[x_189] = x_194;
+        return;
+      } else {
+        int const x_196 = baseIndex;
+        int const x_198 = (*(tint_symbol_4)).arr[x_196].leftIndex;
+        baseIndex = x_198;
+        continue;
+      }
+      return;
+    } else {
+      int const x_199 = baseIndex;
+      int const x_201 = (*(tint_symbol_4)).arr[x_199].rightIndex;
+      if ((x_201 == -1)) {
+        int const x_206 = baseIndex;
+        int const x_207 = *(treeIndex);
+        (*(tint_symbol_4)).arr[x_206].rightIndex = x_207;
+        int const x_209 = *(treeIndex);
+        BST const x_211 = (*(tint_symbol_4)).arr[x_209];
+        param_2 = x_211;
+        int const x_212 = *(data_1);
+        param_3 = x_212;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_2), &(param_3));
+        BST const x_214 = param_2;
+        (*(tint_symbol_4)).arr[x_209] = x_214;
+        return;
+      } else {
+        int const x_216 = baseIndex;
+        int const x_218 = (*(tint_symbol_4)).arr[x_216].rightIndex;
+        baseIndex = x_218;
+        continue;
+      }
+      return;
+    }
+    return;
+  }
+  return;
+}
+
+int search_i1_(thread int* const target, thread tint_array_wrapper* const tint_symbol_5) {
+  int index = 0;
+  BST currentNode = {};
+  int x_220 = 0;
+  index = 0;
+  while (true) {
+    int const x_225 = index;
+    if ((x_225 != -1)) {
+    } else {
+      break;
+    }
+    int const x_228 = index;
+    BST const x_230 = (*(tint_symbol_5)).arr[x_228];
+    currentNode = x_230;
+    int const x_232 = currentNode.data;
+    int const x_233 = *(target);
+    if ((x_232 == x_233)) {
+      int const x_237 = *(target);
+      return x_237;
+    }
+    int const x_238 = *(target);
+    int const x_240 = currentNode.data;
+    if ((x_238 > x_240)) {
+      int const x_246 = currentNode.rightIndex;
+      x_220 = x_246;
+    } else {
+      int const x_248 = currentNode.leftIndex;
+      x_220 = x_248;
+    }
+    int const x_249 = x_220;
+    index = x_249;
+  }
+  return -1;
+}
+
+void main_1(thread tint_array_wrapper* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  int treeIndex_1 = 0;
+  BST param_4 = {};
+  int param_5 = 0;
+  int param_6 = 0;
+  int param_7 = 0;
+  int param_8 = 0;
+  int param_9 = 0;
+  int param_10 = 0;
+  int param_11 = 0;
+  int param_12 = 0;
+  int param_13 = 0;
+  int param_14 = 0;
+  int param_15 = 0;
+  int param_16 = 0;
+  int param_17 = 0;
+  int param_18 = 0;
+  int param_19 = 0;
+  int param_20 = 0;
+  int param_21 = 0;
+  int param_22 = 0;
+  int param_23 = 0;
+  int count = 0;
+  int i = 0;
+  int result = 0;
+  int param_24 = 0;
+  treeIndex_1 = 0;
+  BST const x_84 = (*(tint_symbol_6)).arr[0];
+  param_4 = x_84;
+  param_5 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_4), &(param_5));
+  BST const x_86 = param_4;
+  (*(tint_symbol_6)).arr[0] = x_86;
+  int const x_88 = treeIndex_1;
+  treeIndex_1 = (x_88 + 1);
+  int const x_90 = treeIndex_1;
+  param_6 = x_90;
+  param_7 = 5;
+  insert_i1_i1_(&(param_6), &(param_7), tint_symbol_6);
+  int const x_92 = treeIndex_1;
+  treeIndex_1 = (x_92 + 1);
+  int const x_94 = treeIndex_1;
+  param_8 = x_94;
+  param_9 = 12;
+  insert_i1_i1_(&(param_8), &(param_9), tint_symbol_6);
+  int const x_96 = treeIndex_1;
+  treeIndex_1 = (x_96 + 1);
+  int const x_98 = treeIndex_1;
+  param_10 = x_98;
+  param_11 = 15;
+  insert_i1_i1_(&(param_10), &(param_11), tint_symbol_6);
+  int const x_100 = treeIndex_1;
+  treeIndex_1 = (x_100 + 1);
+  int const x_102 = treeIndex_1;
+  param_12 = x_102;
+  param_13 = 7;
+  insert_i1_i1_(&(param_12), &(param_13), tint_symbol_6);
+  int const x_104 = treeIndex_1;
+  treeIndex_1 = (x_104 + 1);
+  int const x_106 = treeIndex_1;
+  param_14 = x_106;
+  param_15 = 8;
+  insert_i1_i1_(&(param_14), &(param_15), tint_symbol_6);
+  int const x_108 = treeIndex_1;
+  treeIndex_1 = (x_108 + 1);
+  int const x_110 = treeIndex_1;
+  param_16 = x_110;
+  param_17 = 2;
+  insert_i1_i1_(&(param_16), &(param_17), tint_symbol_6);
+  int const x_112 = treeIndex_1;
+  treeIndex_1 = (x_112 + 1);
+  int const x_114 = treeIndex_1;
+  param_18 = x_114;
+  param_19 = 6;
+  insert_i1_i1_(&(param_18), &(param_19), tint_symbol_6);
+  int const x_116 = treeIndex_1;
+  treeIndex_1 = (x_116 + 1);
+  int const x_118 = treeIndex_1;
+  param_20 = x_118;
+  param_21 = 17;
+  insert_i1_i1_(&(param_20), &(param_21), tint_symbol_6);
+  int const x_120 = treeIndex_1;
+  treeIndex_1 = (x_120 + 1);
+  int const x_122 = treeIndex_1;
+  param_22 = x_122;
+  param_23 = 13;
+  insert_i1_i1_(&(param_22), &(param_23), tint_symbol_6);
+  count = 0;
+  i = 0;
+  while (true) {
+    int const x_128 = i;
+    if ((x_128 < 20)) {
+    } else {
+      break;
+    }
+    int const x_131 = i;
+    param_24 = x_131;
+    int const x_132 = search_i1_(&(param_24), tint_symbol_6);
+    result = x_132;
+    int const x_133 = i;
+    switch(x_133) {
+      case 2:
+      case 5:
+      case 6:
+      case 7:
+      case 8:
+      case 9:
+      case 12:
+      case 13:
+      case 15:
+      case 17: {
+        int const x_143 = result;
+        int const x_144 = i;
+        if ((x_143 == x_144)) {
+          int const x_148 = count;
+          count = (x_148 + 1);
+        }
+        break;
+      }
+      default: {
+        int const x_137 = result;
+        if ((x_137 == -1)) {
+          int const x_141 = count;
+          count = (x_141 + 1);
+        }
+        break;
+      }
+    }
+    {
+      int const x_150 = i;
+      i = (x_150 + 1);
+    }
+  }
+  int const x_152 = count;
+  if ((x_152 == 20)) {
+    *(tint_symbol_7) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_7) = float4(0.0f, 0.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread tint_array_wrapper tint_symbol_8 = {};
+  thread float4 tint_symbol_9 = 0.0f;
+  main_1(&(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..68b226d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,476 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 316
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %BST "BST"
+               OpMemberName %BST 0 "data"
+               OpMemberName %BST 1 "leftIndex"
+               OpMemberName %BST 2 "rightIndex"
+               OpName %tree "tree"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %makeTreeNode_struct_BST_i1_i1_i11_i1_ "makeTreeNode_struct_BST_i1_i1_i11_i1_"
+               OpName %node "node"
+               OpName %data "data"
+               OpName %insert_i1_i1_ "insert_i1_i1_"
+               OpName %treeIndex "treeIndex"
+               OpName %data_1 "data_1"
+               OpName %baseIndex "baseIndex"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %search_i1_ "search_i1_"
+               OpName %target "target"
+               OpName %index "index"
+               OpName %currentNode "currentNode"
+               OpName %x_220 "x_220"
+               OpName %main_1 "main_1"
+               OpName %treeIndex_1 "treeIndex_1"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpName %param_6 "param_6"
+               OpName %param_7 "param_7"
+               OpName %param_8 "param_8"
+               OpName %param_9 "param_9"
+               OpName %param_10 "param_10"
+               OpName %param_11 "param_11"
+               OpName %param_12 "param_12"
+               OpName %param_13 "param_13"
+               OpName %param_14 "param_14"
+               OpName %param_15 "param_15"
+               OpName %param_16 "param_16"
+               OpName %param_17 "param_17"
+               OpName %param_18 "param_18"
+               OpName %param_19 "param_19"
+               OpName %param_20 "param_20"
+               OpName %param_21 "param_21"
+               OpName %param_22 "param_22"
+               OpName %param_23 "param_23"
+               OpName %count "count"
+               OpName %i "i"
+               OpName %result "result"
+               OpName %param_24 "param_24"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpMemberDecorate %BST 0 Offset 0
+               OpMemberDecorate %BST 1 Offset 4
+               OpMemberDecorate %BST 2 Offset 8
+               OpDecorate %_arr_BST_uint_10 ArrayStride 12
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+        %BST = OpTypeStruct %int %int %int
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_BST_uint_10 = OpTypeArray %BST %uint_10
+%_ptr_Private__arr_BST_uint_10 = OpTypePointer Private %_arr_BST_uint_10
+          %8 = OpConstantNull %_arr_BST_uint_10
+       %tree = OpVariable %_ptr_Private__arr_BST_uint_10 Private %8
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %13 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %13
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %13
+       %void = OpTypeVoid
+%_ptr_Function_BST = OpTypePointer Function %BST
+%_ptr_Function_int = OpTypePointer Function %int
+         %16 = OpTypeFunction %void %_ptr_Function_BST %_ptr_Function_int
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+     %int_n1 = OpConstant %int -1
+     %uint_2 = OpConstant %uint 2
+         %36 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+         %42 = OpConstantNull %int
+         %44 = OpConstantNull %BST
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+%_ptr_Private_int = OpTypePointer Private %int
+%_ptr_Private_BST = OpTypePointer Private %BST
+        %122 = OpTypeFunction %int %_ptr_Function_int
+        %163 = OpTypeFunction %void
+      %int_9 = OpConstant %int 9
+      %int_1 = OpConstant %int 1
+      %int_5 = OpConstant %int 5
+     %int_12 = OpConstant %int 12
+     %int_15 = OpConstant %int 15
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+      %int_2 = OpConstant %int 2
+      %int_6 = OpConstant %int 6
+     %int_17 = OpConstant %int 17
+     %int_13 = OpConstant %int 13
+     %int_20 = OpConstant %int 20
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+        %302 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %303 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+        %304 = OpTypeFunction %void %main_out
+%makeTreeNode_struct_BST_i1_i1_i11_i1_ = OpFunction %void None %16
+       %node = OpFunctionParameter %_ptr_Function_BST
+       %data = OpFunctionParameter %_ptr_Function_int
+         %23 = OpLabel
+         %25 = OpLoad %int %data
+         %28 = OpAccessChain %_ptr_Function_int %node %uint_0
+               OpStore %28 %25
+         %31 = OpAccessChain %_ptr_Function_int %node %uint_1
+               OpStore %31 %int_n1
+         %35 = OpAccessChain %_ptr_Function_int %node %uint_2
+               OpStore %35 %int_n1
+               OpReturn
+               OpFunctionEnd
+%insert_i1_i1_ = OpFunction %void None %36
+  %treeIndex = OpFunctionParameter %_ptr_Function_int
+     %data_1 = OpFunctionParameter %_ptr_Function_int
+         %40 = OpLabel
+  %baseIndex = OpVariable %_ptr_Function_int Function %42
+      %param = OpVariable %_ptr_Function_BST Function %44
+    %param_1 = OpVariable %_ptr_Function_int Function %42
+    %param_2 = OpVariable %_ptr_Function_BST Function %44
+    %param_3 = OpVariable %_ptr_Function_int Function %42
+               OpStore %baseIndex %int_0
+               OpBranch %49
+         %49 = OpLabel
+               OpLoopMerge %50 %51 None
+               OpBranch %52
+         %52 = OpLabel
+         %53 = OpLoad %int %baseIndex
+         %55 = OpLoad %int %treeIndex
+         %56 = OpSLessThanEqual %bool %53 %55
+               OpSelectionMerge %58 None
+               OpBranchConditional %56 %59 %60
+         %59 = OpLabel
+               OpBranch %58
+         %60 = OpLabel
+               OpBranch %50
+         %58 = OpLabel
+         %62 = OpLoad %int %data_1
+         %63 = OpLoad %int %baseIndex
+         %65 = OpAccessChain %_ptr_Private_int %tree %63 %uint_0
+         %66 = OpLoad %int %65
+         %67 = OpSLessThanEqual %bool %62 %66
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %70
+         %69 = OpLabel
+         %71 = OpLoad %int %baseIndex
+         %72 = OpAccessChain %_ptr_Private_int %tree %71 %uint_1
+         %73 = OpLoad %int %72
+         %74 = OpIEqual %bool %73 %int_n1
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %77
+         %76 = OpLabel
+         %78 = OpLoad %int %baseIndex
+         %80 = OpLoad %int %treeIndex
+         %81 = OpAccessChain %_ptr_Private_int %tree %78 %uint_1
+               OpStore %81 %80
+         %83 = OpLoad %int %treeIndex
+         %85 = OpAccessChain %_ptr_Private_BST %tree %83
+         %86 = OpLoad %BST %85
+               OpStore %param %86
+         %88 = OpLoad %int %data_1
+               OpStore %param_1 %88
+         %89 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param %param_1
+         %92 = OpLoad %BST %param
+         %93 = OpAccessChain %_ptr_Private_BST %tree %83
+               OpStore %93 %92
+               OpReturn
+         %77 = OpLabel
+         %94 = OpLoad %int %baseIndex
+         %95 = OpAccessChain %_ptr_Private_int %tree %94 %uint_1
+         %96 = OpLoad %int %95
+               OpStore %baseIndex %96
+               OpBranch %51
+         %75 = OpLabel
+               OpReturn
+         %70 = OpLabel
+         %97 = OpLoad %int %baseIndex
+         %98 = OpAccessChain %_ptr_Private_int %tree %97 %uint_2
+         %99 = OpLoad %int %98
+        %100 = OpIEqual %bool %99 %int_n1
+               OpSelectionMerge %101 None
+               OpBranchConditional %100 %102 %103
+        %102 = OpLabel
+        %104 = OpLoad %int %baseIndex
+        %106 = OpLoad %int %treeIndex
+        %107 = OpAccessChain %_ptr_Private_int %tree %104 %uint_2
+               OpStore %107 %106
+        %109 = OpLoad %int %treeIndex
+        %110 = OpAccessChain %_ptr_Private_BST %tree %109
+        %111 = OpLoad %BST %110
+               OpStore %param_2 %111
+        %113 = OpLoad %int %data_1
+               OpStore %param_3 %113
+        %114 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param_2 %param_3
+        %117 = OpLoad %BST %param_2
+        %118 = OpAccessChain %_ptr_Private_BST %tree %109
+               OpStore %118 %117
+               OpReturn
+        %103 = OpLabel
+        %119 = OpLoad %int %baseIndex
+        %120 = OpAccessChain %_ptr_Private_int %tree %119 %uint_2
+        %121 = OpLoad %int %120
+               OpStore %baseIndex %121
+               OpBranch %51
+        %101 = OpLabel
+               OpReturn
+         %68 = OpLabel
+               OpReturn
+         %51 = OpLabel
+               OpBranch %49
+         %50 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %search_i1_ = OpFunction %int None %122
+     %target = OpFunctionParameter %_ptr_Function_int
+        %125 = OpLabel
+      %index = OpVariable %_ptr_Function_int Function %42
+%currentNode = OpVariable %_ptr_Function_BST Function %44
+      %x_220 = OpVariable %_ptr_Function_int Function %42
+               OpStore %index %int_0
+               OpBranch %129
+        %129 = OpLabel
+               OpLoopMerge %130 %131 None
+               OpBranch %132
+        %132 = OpLabel
+        %133 = OpLoad %int %index
+        %134 = OpINotEqual %bool %133 %int_n1
+               OpSelectionMerge %135 None
+               OpBranchConditional %134 %136 %137
+        %136 = OpLabel
+               OpBranch %135
+        %137 = OpLabel
+               OpBranch %130
+        %135 = OpLabel
+        %138 = OpLoad %int %index
+        %139 = OpAccessChain %_ptr_Private_BST %tree %138
+        %140 = OpLoad %BST %139
+               OpStore %currentNode %140
+        %141 = OpAccessChain %_ptr_Function_int %currentNode %uint_0
+        %142 = OpLoad %int %141
+        %144 = OpLoad %int %target
+        %145 = OpIEqual %bool %142 %144
+               OpSelectionMerge %146 None
+               OpBranchConditional %145 %147 %146
+        %147 = OpLabel
+        %149 = OpLoad %int %target
+               OpReturnValue %149
+        %146 = OpLabel
+        %151 = OpLoad %int %target
+        %152 = OpAccessChain %_ptr_Function_int %currentNode %uint_0
+        %153 = OpLoad %int %152
+        %154 = OpSGreaterThan %bool %151 %153
+               OpSelectionMerge %155 None
+               OpBranchConditional %154 %156 %157
+        %156 = OpLabel
+        %158 = OpAccessChain %_ptr_Function_int %currentNode %uint_2
+        %159 = OpLoad %int %158
+               OpStore %x_220 %159
+               OpBranch %155
+        %157 = OpLabel
+        %160 = OpAccessChain %_ptr_Function_int %currentNode %uint_1
+        %161 = OpLoad %int %160
+               OpStore %x_220 %161
+               OpBranch %155
+        %155 = OpLabel
+        %162 = OpLoad %int %x_220
+               OpStore %index %162
+               OpBranch %131
+        %131 = OpLabel
+               OpBranch %129
+        %130 = OpLabel
+               OpReturnValue %int_n1
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %163
+        %165 = OpLabel
+%treeIndex_1 = OpVariable %_ptr_Function_int Function %42
+    %param_4 = OpVariable %_ptr_Function_BST Function %44
+    %param_5 = OpVariable %_ptr_Function_int Function %42
+    %param_6 = OpVariable %_ptr_Function_int Function %42
+    %param_7 = OpVariable %_ptr_Function_int Function %42
+    %param_8 = OpVariable %_ptr_Function_int Function %42
+    %param_9 = OpVariable %_ptr_Function_int Function %42
+   %param_10 = OpVariable %_ptr_Function_int Function %42
+   %param_11 = OpVariable %_ptr_Function_int Function %42
+   %param_12 = OpVariable %_ptr_Function_int Function %42
+   %param_13 = OpVariable %_ptr_Function_int Function %42
+   %param_14 = OpVariable %_ptr_Function_int Function %42
+   %param_15 = OpVariable %_ptr_Function_int Function %42
+   %param_16 = OpVariable %_ptr_Function_int Function %42
+   %param_17 = OpVariable %_ptr_Function_int Function %42
+   %param_18 = OpVariable %_ptr_Function_int Function %42
+   %param_19 = OpVariable %_ptr_Function_int Function %42
+   %param_20 = OpVariable %_ptr_Function_int Function %42
+   %param_21 = OpVariable %_ptr_Function_int Function %42
+   %param_22 = OpVariable %_ptr_Function_int Function %42
+   %param_23 = OpVariable %_ptr_Function_int Function %42
+      %count = OpVariable %_ptr_Function_int Function %42
+          %i = OpVariable %_ptr_Function_int Function %42
+     %result = OpVariable %_ptr_Function_int Function %42
+   %param_24 = OpVariable %_ptr_Function_int Function %42
+               OpStore %treeIndex_1 %int_0
+        %191 = OpAccessChain %_ptr_Private_BST %tree %int_0
+        %192 = OpLoad %BST %191
+               OpStore %param_4 %192
+               OpStore %param_5 %int_9
+        %194 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param_4 %param_5
+        %197 = OpLoad %BST %param_4
+        %198 = OpAccessChain %_ptr_Private_BST %tree %int_0
+               OpStore %198 %197
+        %199 = OpLoad %int %treeIndex_1
+        %201 = OpIAdd %int %199 %int_1
+               OpStore %treeIndex_1 %201
+        %202 = OpLoad %int %treeIndex_1
+               OpStore %param_6 %202
+               OpStore %param_7 %int_5
+        %204 = OpFunctionCall %void %insert_i1_i1_ %param_6 %param_7
+        %207 = OpLoad %int %treeIndex_1
+        %208 = OpIAdd %int %207 %int_1
+               OpStore %treeIndex_1 %208
+        %209 = OpLoad %int %treeIndex_1
+               OpStore %param_8 %209
+               OpStore %param_9 %int_12
+        %211 = OpFunctionCall %void %insert_i1_i1_ %param_8 %param_9
+        %214 = OpLoad %int %treeIndex_1
+        %215 = OpIAdd %int %214 %int_1
+               OpStore %treeIndex_1 %215
+        %216 = OpLoad %int %treeIndex_1
+               OpStore %param_10 %216
+               OpStore %param_11 %int_15
+        %218 = OpFunctionCall %void %insert_i1_i1_ %param_10 %param_11
+        %221 = OpLoad %int %treeIndex_1
+        %222 = OpIAdd %int %221 %int_1
+               OpStore %treeIndex_1 %222
+        %223 = OpLoad %int %treeIndex_1
+               OpStore %param_12 %223
+               OpStore %param_13 %int_7
+        %225 = OpFunctionCall %void %insert_i1_i1_ %param_12 %param_13
+        %228 = OpLoad %int %treeIndex_1
+        %229 = OpIAdd %int %228 %int_1
+               OpStore %treeIndex_1 %229
+        %230 = OpLoad %int %treeIndex_1
+               OpStore %param_14 %230
+               OpStore %param_15 %int_8
+        %232 = OpFunctionCall %void %insert_i1_i1_ %param_14 %param_15
+        %235 = OpLoad %int %treeIndex_1
+        %236 = OpIAdd %int %235 %int_1
+               OpStore %treeIndex_1 %236
+        %237 = OpLoad %int %treeIndex_1
+               OpStore %param_16 %237
+               OpStore %param_17 %int_2
+        %239 = OpFunctionCall %void %insert_i1_i1_ %param_16 %param_17
+        %242 = OpLoad %int %treeIndex_1
+        %243 = OpIAdd %int %242 %int_1
+               OpStore %treeIndex_1 %243
+        %244 = OpLoad %int %treeIndex_1
+               OpStore %param_18 %244
+               OpStore %param_19 %int_6
+        %246 = OpFunctionCall %void %insert_i1_i1_ %param_18 %param_19
+        %249 = OpLoad %int %treeIndex_1
+        %250 = OpIAdd %int %249 %int_1
+               OpStore %treeIndex_1 %250
+        %251 = OpLoad %int %treeIndex_1
+               OpStore %param_20 %251
+               OpStore %param_21 %int_17
+        %253 = OpFunctionCall %void %insert_i1_i1_ %param_20 %param_21
+        %256 = OpLoad %int %treeIndex_1
+        %257 = OpIAdd %int %256 %int_1
+               OpStore %treeIndex_1 %257
+        %258 = OpLoad %int %treeIndex_1
+               OpStore %param_22 %258
+               OpStore %param_23 %int_13
+        %260 = OpFunctionCall %void %insert_i1_i1_ %param_22 %param_23
+               OpStore %count %int_0
+               OpStore %i %int_0
+               OpBranch %263
+        %263 = OpLabel
+               OpLoopMerge %264 %265 None
+               OpBranch %266
+        %266 = OpLabel
+        %267 = OpLoad %int %i
+        %269 = OpSLessThan %bool %267 %int_20
+               OpSelectionMerge %270 None
+               OpBranchConditional %269 %271 %272
+        %271 = OpLabel
+               OpBranch %270
+        %272 = OpLabel
+               OpBranch %264
+        %270 = OpLabel
+        %273 = OpLoad %int %i
+               OpStore %param_24 %273
+        %274 = OpFunctionCall %int %search_i1_ %param_24
+               OpStore %result %274
+        %276 = OpLoad %int %i
+               OpSelectionMerge %277 None
+               OpSwitch %276 %278 2 %279 5 %279 6 %279 7 %279 8 %279 9 %279 12 %279 13 %279 15 %279 17 %279
+        %279 = OpLabel
+        %280 = OpLoad %int %result
+        %281 = OpLoad %int %i
+        %282 = OpIEqual %bool %280 %281
+               OpSelectionMerge %283 None
+               OpBranchConditional %282 %284 %283
+        %284 = OpLabel
+        %285 = OpLoad %int %count
+        %286 = OpIAdd %int %285 %int_1
+               OpStore %count %286
+               OpBranch %283
+        %283 = OpLabel
+               OpBranch %277
+        %278 = OpLabel
+        %287 = OpLoad %int %result
+        %288 = OpIEqual %bool %287 %int_n1
+               OpSelectionMerge %289 None
+               OpBranchConditional %288 %290 %289
+        %290 = OpLabel
+        %291 = OpLoad %int %count
+        %292 = OpIAdd %int %291 %int_1
+               OpStore %count %292
+               OpBranch %289
+        %289 = OpLabel
+               OpBranch %277
+        %277 = OpLabel
+               OpBranch %265
+        %265 = OpLabel
+        %293 = OpLoad %int %i
+        %294 = OpIAdd %int %293 %int_1
+               OpStore %i %294
+               OpBranch %263
+        %264 = OpLabel
+        %295 = OpLoad %int %count
+        %296 = OpIEqual %bool %295 %int_20
+               OpSelectionMerge %297 None
+               OpBranchConditional %296 %298 %299
+        %298 = OpLabel
+               OpStore %x_GLF_color %302
+               OpBranch %297
+        %299 = OpLabel
+               OpStore %x_GLF_color %303
+               OpBranch %297
+        %297 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %304
+%tint_symbol = OpFunctionParameter %main_out
+        %308 = OpLabel
+        %309 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %309
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %163
+        %311 = OpLabel
+        %312 = OpFunctionCall %void %main_1
+        %314 = OpLoad %v4float %x_GLF_color
+        %315 = OpCompositeConstruct %main_out %314
+        %313 = OpFunctionCall %void %tint_symbol_2 %315
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..19d6c9d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,264 @@
+struct BST {
+  data : i32;
+  leftIndex : i32;
+  rightIndex : i32;
+};
+
+var<private> tree : array<BST, 10>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn makeTreeNode_struct_BST_i1_i1_i11_i1_(node : ptr<function, BST>, data : ptr<function, i32>) {
+  let x_158 : i32 = *(data);
+  (*(node)).data = x_158;
+  (*(node)).leftIndex = -1;
+  (*(node)).rightIndex = -1;
+  return;
+}
+
+fn insert_i1_i1_(treeIndex : ptr<function, i32>, data_1 : ptr<function, i32>) {
+  var baseIndex : i32;
+  var param : BST;
+  var param_1 : i32;
+  var param_2 : BST;
+  var param_3 : i32;
+  baseIndex = 0;
+  loop {
+    let x_167 : i32 = baseIndex;
+    let x_168 : i32 = *(treeIndex);
+    if ((x_167 <= x_168)) {
+    } else {
+      break;
+    }
+    let x_171 : i32 = *(data_1);
+    let x_172 : i32 = baseIndex;
+    let x_174 : i32 = tree[x_172].data;
+    if ((x_171 <= x_174)) {
+      let x_179 : i32 = baseIndex;
+      let x_181 : i32 = tree[x_179].leftIndex;
+      if ((x_181 == -1)) {
+        let x_186 : i32 = baseIndex;
+        let x_187 : i32 = *(treeIndex);
+        tree[x_186].leftIndex = x_187;
+        let x_189 : i32 = *(treeIndex);
+        let x_191 : BST = tree[x_189];
+        param = x_191;
+        let x_192 : i32 = *(data_1);
+        param_1 = x_192;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param), &(param_1));
+        let x_194 : BST = param;
+        tree[x_189] = x_194;
+        return;
+      } else {
+        let x_196 : i32 = baseIndex;
+        let x_198 : i32 = tree[x_196].leftIndex;
+        baseIndex = x_198;
+        continue;
+      }
+      return;
+    } else {
+      let x_199 : i32 = baseIndex;
+      let x_201 : i32 = tree[x_199].rightIndex;
+      if ((x_201 == -1)) {
+        let x_206 : i32 = baseIndex;
+        let x_207 : i32 = *(treeIndex);
+        tree[x_206].rightIndex = x_207;
+        let x_209 : i32 = *(treeIndex);
+        let x_211 : BST = tree[x_209];
+        param_2 = x_211;
+        let x_212 : i32 = *(data_1);
+        param_3 = x_212;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_2), &(param_3));
+        let x_214 : BST = param_2;
+        tree[x_209] = x_214;
+        return;
+      } else {
+        let x_216 : i32 = baseIndex;
+        let x_218 : i32 = tree[x_216].rightIndex;
+        baseIndex = x_218;
+        continue;
+      }
+      return;
+    }
+    return;
+  }
+  return;
+}
+
+fn search_i1_(target : ptr<function, i32>) -> i32 {
+  var index : i32;
+  var currentNode : BST;
+  var x_220 : i32;
+  index = 0;
+  loop {
+    let x_225 : i32 = index;
+    if ((x_225 != -1)) {
+    } else {
+      break;
+    }
+    let x_228 : i32 = index;
+    let x_230 : BST = tree[x_228];
+    currentNode = x_230;
+    let x_232 : i32 = currentNode.data;
+    let x_233 : i32 = *(target);
+    if ((x_232 == x_233)) {
+      let x_237 : i32 = *(target);
+      return x_237;
+    }
+    let x_238 : i32 = *(target);
+    let x_240 : i32 = currentNode.data;
+    if ((x_238 > x_240)) {
+      let x_246 : i32 = currentNode.rightIndex;
+      x_220 = x_246;
+    } else {
+      let x_248 : i32 = currentNode.leftIndex;
+      x_220 = x_248;
+    }
+    let x_249 : i32 = x_220;
+    index = x_249;
+  }
+  return -1;
+}
+
+fn main_1() {
+  var treeIndex_1 : i32;
+  var param_4 : BST;
+  var param_5 : i32;
+  var param_6 : i32;
+  var param_7 : i32;
+  var param_8 : i32;
+  var param_9 : i32;
+  var param_10 : i32;
+  var param_11 : i32;
+  var param_12 : i32;
+  var param_13 : i32;
+  var param_14 : i32;
+  var param_15 : i32;
+  var param_16 : i32;
+  var param_17 : i32;
+  var param_18 : i32;
+  var param_19 : i32;
+  var param_20 : i32;
+  var param_21 : i32;
+  var param_22 : i32;
+  var param_23 : i32;
+  var count : i32;
+  var i : i32;
+  var result : i32;
+  var param_24 : i32;
+  treeIndex_1 = 0;
+  let x_84 : BST = tree[0];
+  param_4 = x_84;
+  param_5 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_4), &(param_5));
+  let x_86 : BST = param_4;
+  tree[0] = x_86;
+  let x_88 : i32 = treeIndex_1;
+  treeIndex_1 = (x_88 + 1);
+  let x_90 : i32 = treeIndex_1;
+  param_6 = x_90;
+  param_7 = 5;
+  insert_i1_i1_(&(param_6), &(param_7));
+  let x_92 : i32 = treeIndex_1;
+  treeIndex_1 = (x_92 + 1);
+  let x_94 : i32 = treeIndex_1;
+  param_8 = x_94;
+  param_9 = 12;
+  insert_i1_i1_(&(param_8), &(param_9));
+  let x_96 : i32 = treeIndex_1;
+  treeIndex_1 = (x_96 + 1);
+  let x_98 : i32 = treeIndex_1;
+  param_10 = x_98;
+  param_11 = 15;
+  insert_i1_i1_(&(param_10), &(param_11));
+  let x_100 : i32 = treeIndex_1;
+  treeIndex_1 = (x_100 + 1);
+  let x_102 : i32 = treeIndex_1;
+  param_12 = x_102;
+  param_13 = 7;
+  insert_i1_i1_(&(param_12), &(param_13));
+  let x_104 : i32 = treeIndex_1;
+  treeIndex_1 = (x_104 + 1);
+  let x_106 : i32 = treeIndex_1;
+  param_14 = x_106;
+  param_15 = 8;
+  insert_i1_i1_(&(param_14), &(param_15));
+  let x_108 : i32 = treeIndex_1;
+  treeIndex_1 = (x_108 + 1);
+  let x_110 : i32 = treeIndex_1;
+  param_16 = x_110;
+  param_17 = 2;
+  insert_i1_i1_(&(param_16), &(param_17));
+  let x_112 : i32 = treeIndex_1;
+  treeIndex_1 = (x_112 + 1);
+  let x_114 : i32 = treeIndex_1;
+  param_18 = x_114;
+  param_19 = 6;
+  insert_i1_i1_(&(param_18), &(param_19));
+  let x_116 : i32 = treeIndex_1;
+  treeIndex_1 = (x_116 + 1);
+  let x_118 : i32 = treeIndex_1;
+  param_20 = x_118;
+  param_21 = 17;
+  insert_i1_i1_(&(param_20), &(param_21));
+  let x_120 : i32 = treeIndex_1;
+  treeIndex_1 = (x_120 + 1);
+  let x_122 : i32 = treeIndex_1;
+  param_22 = x_122;
+  param_23 = 13;
+  insert_i1_i1_(&(param_22), &(param_23));
+  count = 0;
+  i = 0;
+  loop {
+    let x_128 : i32 = i;
+    if ((x_128 < 20)) {
+    } else {
+      break;
+    }
+    let x_131 : i32 = i;
+    param_24 = x_131;
+    let x_132 : i32 = search_i1_(&(param_24));
+    result = x_132;
+    let x_133 : i32 = i;
+    switch(x_133) {
+      case 2, 5, 6, 7, 8, 9, 12, 13, 15, 17: {
+        let x_143 : i32 = result;
+        let x_144 : i32 = i;
+        if ((x_143 == x_144)) {
+          let x_148 : i32 = count;
+          count = (x_148 + 1);
+        }
+      }
+      default: {
+        let x_137 : i32 = result;
+        if ((x_137 == -1)) {
+          let x_141 : i32 = count;
+          count = (x_141 + 1);
+        }
+      }
+    }
+
+    continuing {
+      let x_150 : i32 = i;
+      i = (x_150 + 1);
+    }
+  }
+  let x_152 : i32 = count;
+  if ((x_152 == 20)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/0-opt.wgsl
new file mode 100644
index 0000000..19d6c9d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/0-opt.wgsl
@@ -0,0 +1,264 @@
+struct BST {
+  data : i32;
+  leftIndex : i32;
+  rightIndex : i32;
+};
+
+var<private> tree : array<BST, 10>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn makeTreeNode_struct_BST_i1_i1_i11_i1_(node : ptr<function, BST>, data : ptr<function, i32>) {
+  let x_158 : i32 = *(data);
+  (*(node)).data = x_158;
+  (*(node)).leftIndex = -1;
+  (*(node)).rightIndex = -1;
+  return;
+}
+
+fn insert_i1_i1_(treeIndex : ptr<function, i32>, data_1 : ptr<function, i32>) {
+  var baseIndex : i32;
+  var param : BST;
+  var param_1 : i32;
+  var param_2 : BST;
+  var param_3 : i32;
+  baseIndex = 0;
+  loop {
+    let x_167 : i32 = baseIndex;
+    let x_168 : i32 = *(treeIndex);
+    if ((x_167 <= x_168)) {
+    } else {
+      break;
+    }
+    let x_171 : i32 = *(data_1);
+    let x_172 : i32 = baseIndex;
+    let x_174 : i32 = tree[x_172].data;
+    if ((x_171 <= x_174)) {
+      let x_179 : i32 = baseIndex;
+      let x_181 : i32 = tree[x_179].leftIndex;
+      if ((x_181 == -1)) {
+        let x_186 : i32 = baseIndex;
+        let x_187 : i32 = *(treeIndex);
+        tree[x_186].leftIndex = x_187;
+        let x_189 : i32 = *(treeIndex);
+        let x_191 : BST = tree[x_189];
+        param = x_191;
+        let x_192 : i32 = *(data_1);
+        param_1 = x_192;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param), &(param_1));
+        let x_194 : BST = param;
+        tree[x_189] = x_194;
+        return;
+      } else {
+        let x_196 : i32 = baseIndex;
+        let x_198 : i32 = tree[x_196].leftIndex;
+        baseIndex = x_198;
+        continue;
+      }
+      return;
+    } else {
+      let x_199 : i32 = baseIndex;
+      let x_201 : i32 = tree[x_199].rightIndex;
+      if ((x_201 == -1)) {
+        let x_206 : i32 = baseIndex;
+        let x_207 : i32 = *(treeIndex);
+        tree[x_206].rightIndex = x_207;
+        let x_209 : i32 = *(treeIndex);
+        let x_211 : BST = tree[x_209];
+        param_2 = x_211;
+        let x_212 : i32 = *(data_1);
+        param_3 = x_212;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_2), &(param_3));
+        let x_214 : BST = param_2;
+        tree[x_209] = x_214;
+        return;
+      } else {
+        let x_216 : i32 = baseIndex;
+        let x_218 : i32 = tree[x_216].rightIndex;
+        baseIndex = x_218;
+        continue;
+      }
+      return;
+    }
+    return;
+  }
+  return;
+}
+
+fn search_i1_(target : ptr<function, i32>) -> i32 {
+  var index : i32;
+  var currentNode : BST;
+  var x_220 : i32;
+  index = 0;
+  loop {
+    let x_225 : i32 = index;
+    if ((x_225 != -1)) {
+    } else {
+      break;
+    }
+    let x_228 : i32 = index;
+    let x_230 : BST = tree[x_228];
+    currentNode = x_230;
+    let x_232 : i32 = currentNode.data;
+    let x_233 : i32 = *(target);
+    if ((x_232 == x_233)) {
+      let x_237 : i32 = *(target);
+      return x_237;
+    }
+    let x_238 : i32 = *(target);
+    let x_240 : i32 = currentNode.data;
+    if ((x_238 > x_240)) {
+      let x_246 : i32 = currentNode.rightIndex;
+      x_220 = x_246;
+    } else {
+      let x_248 : i32 = currentNode.leftIndex;
+      x_220 = x_248;
+    }
+    let x_249 : i32 = x_220;
+    index = x_249;
+  }
+  return -1;
+}
+
+fn main_1() {
+  var treeIndex_1 : i32;
+  var param_4 : BST;
+  var param_5 : i32;
+  var param_6 : i32;
+  var param_7 : i32;
+  var param_8 : i32;
+  var param_9 : i32;
+  var param_10 : i32;
+  var param_11 : i32;
+  var param_12 : i32;
+  var param_13 : i32;
+  var param_14 : i32;
+  var param_15 : i32;
+  var param_16 : i32;
+  var param_17 : i32;
+  var param_18 : i32;
+  var param_19 : i32;
+  var param_20 : i32;
+  var param_21 : i32;
+  var param_22 : i32;
+  var param_23 : i32;
+  var count : i32;
+  var i : i32;
+  var result : i32;
+  var param_24 : i32;
+  treeIndex_1 = 0;
+  let x_84 : BST = tree[0];
+  param_4 = x_84;
+  param_5 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_4), &(param_5));
+  let x_86 : BST = param_4;
+  tree[0] = x_86;
+  let x_88 : i32 = treeIndex_1;
+  treeIndex_1 = (x_88 + 1);
+  let x_90 : i32 = treeIndex_1;
+  param_6 = x_90;
+  param_7 = 5;
+  insert_i1_i1_(&(param_6), &(param_7));
+  let x_92 : i32 = treeIndex_1;
+  treeIndex_1 = (x_92 + 1);
+  let x_94 : i32 = treeIndex_1;
+  param_8 = x_94;
+  param_9 = 12;
+  insert_i1_i1_(&(param_8), &(param_9));
+  let x_96 : i32 = treeIndex_1;
+  treeIndex_1 = (x_96 + 1);
+  let x_98 : i32 = treeIndex_1;
+  param_10 = x_98;
+  param_11 = 15;
+  insert_i1_i1_(&(param_10), &(param_11));
+  let x_100 : i32 = treeIndex_1;
+  treeIndex_1 = (x_100 + 1);
+  let x_102 : i32 = treeIndex_1;
+  param_12 = x_102;
+  param_13 = 7;
+  insert_i1_i1_(&(param_12), &(param_13));
+  let x_104 : i32 = treeIndex_1;
+  treeIndex_1 = (x_104 + 1);
+  let x_106 : i32 = treeIndex_1;
+  param_14 = x_106;
+  param_15 = 8;
+  insert_i1_i1_(&(param_14), &(param_15));
+  let x_108 : i32 = treeIndex_1;
+  treeIndex_1 = (x_108 + 1);
+  let x_110 : i32 = treeIndex_1;
+  param_16 = x_110;
+  param_17 = 2;
+  insert_i1_i1_(&(param_16), &(param_17));
+  let x_112 : i32 = treeIndex_1;
+  treeIndex_1 = (x_112 + 1);
+  let x_114 : i32 = treeIndex_1;
+  param_18 = x_114;
+  param_19 = 6;
+  insert_i1_i1_(&(param_18), &(param_19));
+  let x_116 : i32 = treeIndex_1;
+  treeIndex_1 = (x_116 + 1);
+  let x_118 : i32 = treeIndex_1;
+  param_20 = x_118;
+  param_21 = 17;
+  insert_i1_i1_(&(param_20), &(param_21));
+  let x_120 : i32 = treeIndex_1;
+  treeIndex_1 = (x_120 + 1);
+  let x_122 : i32 = treeIndex_1;
+  param_22 = x_122;
+  param_23 = 13;
+  insert_i1_i1_(&(param_22), &(param_23));
+  count = 0;
+  i = 0;
+  loop {
+    let x_128 : i32 = i;
+    if ((x_128 < 20)) {
+    } else {
+      break;
+    }
+    let x_131 : i32 = i;
+    param_24 = x_131;
+    let x_132 : i32 = search_i1_(&(param_24));
+    result = x_132;
+    let x_133 : i32 = i;
+    switch(x_133) {
+      case 2, 5, 6, 7, 8, 9, 12, 13, 15, 17: {
+        let x_143 : i32 = result;
+        let x_144 : i32 = i;
+        if ((x_143 == x_144)) {
+          let x_148 : i32 = count;
+          count = (x_148 + 1);
+        }
+      }
+      default: {
+        let x_137 : i32 = result;
+        if ((x_137 == -1)) {
+          let x_141 : i32 = count;
+          count = (x_141 + 1);
+        }
+      }
+    }
+
+    continuing {
+      let x_150 : i32 = i;
+      i = (x_150 + 1);
+    }
+  }
+  let x_152 : i32 = count;
+  if ((x_152 == 20)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..1a82ba8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,232 @@
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+
+static BST tree[10] = (BST[10])0;
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void makeTreeNode_struct_BST_i1_i1_i11_i1_(inout BST node, inout int data) {
+  const int x_158 = data;
+  node.data = x_158;
+  node.leftIndex = -1;
+  node.rightIndex = -1;
+  return;
+}
+
+void insert_i1_i1_(inout int treeIndex, inout int data_1) {
+  int baseIndex = 0;
+  BST param = (BST)0;
+  int param_1 = 0;
+  BST param_2 = (BST)0;
+  int param_3 = 0;
+  baseIndex = 0;
+  while (true) {
+    const int x_167 = baseIndex;
+    const int x_168 = treeIndex;
+    if ((x_167 <= x_168)) {
+    } else {
+      break;
+    }
+    const int x_171 = data_1;
+    const int x_174 = tree[baseIndex].data;
+    if ((x_171 <= x_174)) {
+      const int x_181 = tree[baseIndex].leftIndex;
+      if ((x_181 == -1)) {
+        const int x_186 = baseIndex;
+        const int x_187 = treeIndex;
+        tree[x_186].leftIndex = x_187;
+        const int x_189 = treeIndex;
+        const BST x_191 = tree[x_189];
+        param = x_191;
+        const int x_192 = data_1;
+        param_1 = x_192;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(param, param_1);
+        tree[x_189] = param;
+        return;
+      } else {
+        const int x_198 = tree[baseIndex].leftIndex;
+        baseIndex = x_198;
+        continue;
+      }
+      return;
+    } else {
+      const int x_201 = tree[baseIndex].rightIndex;
+      if ((x_201 == -1)) {
+        const int x_206 = baseIndex;
+        const int x_207 = treeIndex;
+        tree[x_206].rightIndex = x_207;
+        const int x_209 = treeIndex;
+        const BST x_211 = tree[x_209];
+        param_2 = x_211;
+        const int x_212 = data_1;
+        param_3 = x_212;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(param_2, param_3);
+        tree[x_209] = param_2;
+        return;
+      } else {
+        const int x_218 = tree[baseIndex].rightIndex;
+        baseIndex = x_218;
+        continue;
+      }
+      return;
+    }
+    return;
+  }
+  return;
+}
+
+int search_i1_(inout int target) {
+  int index = 0;
+  BST currentNode = (BST)0;
+  int x_220 = 0;
+  index = 0;
+  while (true) {
+    if ((index != -1)) {
+    } else {
+      break;
+    }
+    const BST x_230 = tree[index];
+    currentNode = x_230;
+    const int x_232 = currentNode.data;
+    const int x_233 = target;
+    if ((x_232 == x_233)) {
+      const int x_237 = target;
+      return x_237;
+    }
+    const int x_238 = target;
+    const int x_240 = currentNode.data;
+    if ((x_238 > x_240)) {
+      const int x_246 = currentNode.rightIndex;
+      x_220 = x_246;
+    } else {
+      const int x_248 = currentNode.leftIndex;
+      x_220 = x_248;
+    }
+    index = x_220;
+  }
+  return -1;
+}
+
+void main_1() {
+  int treeIndex_1 = 0;
+  BST param_4 = (BST)0;
+  int param_5 = 0;
+  int param_6 = 0;
+  int param_7 = 0;
+  int param_8 = 0;
+  int param_9 = 0;
+  int param_10 = 0;
+  int param_11 = 0;
+  int param_12 = 0;
+  int param_13 = 0;
+  int param_14 = 0;
+  int param_15 = 0;
+  int param_16 = 0;
+  int param_17 = 0;
+  int param_18 = 0;
+  int param_19 = 0;
+  int param_20 = 0;
+  int param_21 = 0;
+  int param_22 = 0;
+  int param_23 = 0;
+  int count = 0;
+  int i = 0;
+  int result = 0;
+  int param_24 = 0;
+  treeIndex_1 = 0;
+  const BST x_84 = tree[0];
+  param_4 = x_84;
+  param_5 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(param_4, param_5);
+  tree[0] = param_4;
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_6 = treeIndex_1;
+  param_7 = 5;
+  insert_i1_i1_(param_6, param_7);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_8 = treeIndex_1;
+  param_9 = 12;
+  insert_i1_i1_(param_8, param_9);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_10 = treeIndex_1;
+  param_11 = 15;
+  insert_i1_i1_(param_10, param_11);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_12 = treeIndex_1;
+  param_13 = 7;
+  insert_i1_i1_(param_12, param_13);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_14 = treeIndex_1;
+  param_15 = 8;
+  insert_i1_i1_(param_14, param_15);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_16 = treeIndex_1;
+  param_17 = 2;
+  insert_i1_i1_(param_16, param_17);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_18 = treeIndex_1;
+  param_19 = 6;
+  insert_i1_i1_(param_18, param_19);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_20 = treeIndex_1;
+  param_21 = 17;
+  insert_i1_i1_(param_20, param_21);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_22 = treeIndex_1;
+  param_23 = 13;
+  insert_i1_i1_(param_22, param_23);
+  count = 0;
+  i = 0;
+  {
+    for(; (i < 20); i = (i + 1)) {
+      param_24 = i;
+      const int x_132 = search_i1_(param_24);
+      result = x_132;
+      switch(i) {
+        case 2:
+        case 5:
+        case 6:
+        case 7:
+        case 8:
+        case 9:
+        case 12:
+        case 13:
+        case 15:
+        case 17: {
+          if ((result == i)) {
+            count = (count + 1);
+          }
+          break;
+        }
+        default: {
+          if ((result == -1)) {
+            count = (count + 1);
+          }
+          break;
+        }
+      }
+    }
+  }
+  if ((count == 20)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..02ef450
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/0-opt.wgsl.expected.msl
@@ -0,0 +1,281 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+struct tint_array_wrapper {
+  BST arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void makeTreeNode_struct_BST_i1_i1_i11_i1_(thread BST* const node, thread int* const data) {
+  int const x_158 = *(data);
+  (*(node)).data = x_158;
+  (*(node)).leftIndex = -1;
+  (*(node)).rightIndex = -1;
+  return;
+}
+
+void insert_i1_i1_(thread int* const treeIndex, thread int* const data_1, thread tint_array_wrapper* const tint_symbol_4) {
+  int baseIndex = 0;
+  BST param = {};
+  int param_1 = 0;
+  BST param_2 = {};
+  int param_3 = 0;
+  baseIndex = 0;
+  while (true) {
+    int const x_167 = baseIndex;
+    int const x_168 = *(treeIndex);
+    if ((x_167 <= x_168)) {
+    } else {
+      break;
+    }
+    int const x_171 = *(data_1);
+    int const x_172 = baseIndex;
+    int const x_174 = (*(tint_symbol_4)).arr[x_172].data;
+    if ((x_171 <= x_174)) {
+      int const x_179 = baseIndex;
+      int const x_181 = (*(tint_symbol_4)).arr[x_179].leftIndex;
+      if ((x_181 == -1)) {
+        int const x_186 = baseIndex;
+        int const x_187 = *(treeIndex);
+        (*(tint_symbol_4)).arr[x_186].leftIndex = x_187;
+        int const x_189 = *(treeIndex);
+        BST const x_191 = (*(tint_symbol_4)).arr[x_189];
+        param = x_191;
+        int const x_192 = *(data_1);
+        param_1 = x_192;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param), &(param_1));
+        BST const x_194 = param;
+        (*(tint_symbol_4)).arr[x_189] = x_194;
+        return;
+      } else {
+        int const x_196 = baseIndex;
+        int const x_198 = (*(tint_symbol_4)).arr[x_196].leftIndex;
+        baseIndex = x_198;
+        continue;
+      }
+      return;
+    } else {
+      int const x_199 = baseIndex;
+      int const x_201 = (*(tint_symbol_4)).arr[x_199].rightIndex;
+      if ((x_201 == -1)) {
+        int const x_206 = baseIndex;
+        int const x_207 = *(treeIndex);
+        (*(tint_symbol_4)).arr[x_206].rightIndex = x_207;
+        int const x_209 = *(treeIndex);
+        BST const x_211 = (*(tint_symbol_4)).arr[x_209];
+        param_2 = x_211;
+        int const x_212 = *(data_1);
+        param_3 = x_212;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_2), &(param_3));
+        BST const x_214 = param_2;
+        (*(tint_symbol_4)).arr[x_209] = x_214;
+        return;
+      } else {
+        int const x_216 = baseIndex;
+        int const x_218 = (*(tint_symbol_4)).arr[x_216].rightIndex;
+        baseIndex = x_218;
+        continue;
+      }
+      return;
+    }
+    return;
+  }
+  return;
+}
+
+int search_i1_(thread int* const target, thread tint_array_wrapper* const tint_symbol_5) {
+  int index = 0;
+  BST currentNode = {};
+  int x_220 = 0;
+  index = 0;
+  while (true) {
+    int const x_225 = index;
+    if ((x_225 != -1)) {
+    } else {
+      break;
+    }
+    int const x_228 = index;
+    BST const x_230 = (*(tint_symbol_5)).arr[x_228];
+    currentNode = x_230;
+    int const x_232 = currentNode.data;
+    int const x_233 = *(target);
+    if ((x_232 == x_233)) {
+      int const x_237 = *(target);
+      return x_237;
+    }
+    int const x_238 = *(target);
+    int const x_240 = currentNode.data;
+    if ((x_238 > x_240)) {
+      int const x_246 = currentNode.rightIndex;
+      x_220 = x_246;
+    } else {
+      int const x_248 = currentNode.leftIndex;
+      x_220 = x_248;
+    }
+    int const x_249 = x_220;
+    index = x_249;
+  }
+  return -1;
+}
+
+void main_1(thread tint_array_wrapper* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  int treeIndex_1 = 0;
+  BST param_4 = {};
+  int param_5 = 0;
+  int param_6 = 0;
+  int param_7 = 0;
+  int param_8 = 0;
+  int param_9 = 0;
+  int param_10 = 0;
+  int param_11 = 0;
+  int param_12 = 0;
+  int param_13 = 0;
+  int param_14 = 0;
+  int param_15 = 0;
+  int param_16 = 0;
+  int param_17 = 0;
+  int param_18 = 0;
+  int param_19 = 0;
+  int param_20 = 0;
+  int param_21 = 0;
+  int param_22 = 0;
+  int param_23 = 0;
+  int count = 0;
+  int i = 0;
+  int result = 0;
+  int param_24 = 0;
+  treeIndex_1 = 0;
+  BST const x_84 = (*(tint_symbol_6)).arr[0];
+  param_4 = x_84;
+  param_5 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_4), &(param_5));
+  BST const x_86 = param_4;
+  (*(tint_symbol_6)).arr[0] = x_86;
+  int const x_88 = treeIndex_1;
+  treeIndex_1 = (x_88 + 1);
+  int const x_90 = treeIndex_1;
+  param_6 = x_90;
+  param_7 = 5;
+  insert_i1_i1_(&(param_6), &(param_7), tint_symbol_6);
+  int const x_92 = treeIndex_1;
+  treeIndex_1 = (x_92 + 1);
+  int const x_94 = treeIndex_1;
+  param_8 = x_94;
+  param_9 = 12;
+  insert_i1_i1_(&(param_8), &(param_9), tint_symbol_6);
+  int const x_96 = treeIndex_1;
+  treeIndex_1 = (x_96 + 1);
+  int const x_98 = treeIndex_1;
+  param_10 = x_98;
+  param_11 = 15;
+  insert_i1_i1_(&(param_10), &(param_11), tint_symbol_6);
+  int const x_100 = treeIndex_1;
+  treeIndex_1 = (x_100 + 1);
+  int const x_102 = treeIndex_1;
+  param_12 = x_102;
+  param_13 = 7;
+  insert_i1_i1_(&(param_12), &(param_13), tint_symbol_6);
+  int const x_104 = treeIndex_1;
+  treeIndex_1 = (x_104 + 1);
+  int const x_106 = treeIndex_1;
+  param_14 = x_106;
+  param_15 = 8;
+  insert_i1_i1_(&(param_14), &(param_15), tint_symbol_6);
+  int const x_108 = treeIndex_1;
+  treeIndex_1 = (x_108 + 1);
+  int const x_110 = treeIndex_1;
+  param_16 = x_110;
+  param_17 = 2;
+  insert_i1_i1_(&(param_16), &(param_17), tint_symbol_6);
+  int const x_112 = treeIndex_1;
+  treeIndex_1 = (x_112 + 1);
+  int const x_114 = treeIndex_1;
+  param_18 = x_114;
+  param_19 = 6;
+  insert_i1_i1_(&(param_18), &(param_19), tint_symbol_6);
+  int const x_116 = treeIndex_1;
+  treeIndex_1 = (x_116 + 1);
+  int const x_118 = treeIndex_1;
+  param_20 = x_118;
+  param_21 = 17;
+  insert_i1_i1_(&(param_20), &(param_21), tint_symbol_6);
+  int const x_120 = treeIndex_1;
+  treeIndex_1 = (x_120 + 1);
+  int const x_122 = treeIndex_1;
+  param_22 = x_122;
+  param_23 = 13;
+  insert_i1_i1_(&(param_22), &(param_23), tint_symbol_6);
+  count = 0;
+  i = 0;
+  while (true) {
+    int const x_128 = i;
+    if ((x_128 < 20)) {
+    } else {
+      break;
+    }
+    int const x_131 = i;
+    param_24 = x_131;
+    int const x_132 = search_i1_(&(param_24), tint_symbol_6);
+    result = x_132;
+    int const x_133 = i;
+    switch(x_133) {
+      case 2:
+      case 5:
+      case 6:
+      case 7:
+      case 8:
+      case 9:
+      case 12:
+      case 13:
+      case 15:
+      case 17: {
+        int const x_143 = result;
+        int const x_144 = i;
+        if ((x_143 == x_144)) {
+          int const x_148 = count;
+          count = (x_148 + 1);
+        }
+        break;
+      }
+      default: {
+        int const x_137 = result;
+        if ((x_137 == -1)) {
+          int const x_141 = count;
+          count = (x_141 + 1);
+        }
+        break;
+      }
+    }
+    {
+      int const x_150 = i;
+      i = (x_150 + 1);
+    }
+  }
+  int const x_152 = count;
+  if ((x_152 == 20)) {
+    *(tint_symbol_7) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_7) = float4(0.0f, 0.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread tint_array_wrapper tint_symbol_8 = {};
+  thread float4 tint_symbol_9 = 0.0f;
+  main_1(&(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..68b226d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,476 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 316
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %BST "BST"
+               OpMemberName %BST 0 "data"
+               OpMemberName %BST 1 "leftIndex"
+               OpMemberName %BST 2 "rightIndex"
+               OpName %tree "tree"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %makeTreeNode_struct_BST_i1_i1_i11_i1_ "makeTreeNode_struct_BST_i1_i1_i11_i1_"
+               OpName %node "node"
+               OpName %data "data"
+               OpName %insert_i1_i1_ "insert_i1_i1_"
+               OpName %treeIndex "treeIndex"
+               OpName %data_1 "data_1"
+               OpName %baseIndex "baseIndex"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %search_i1_ "search_i1_"
+               OpName %target "target"
+               OpName %index "index"
+               OpName %currentNode "currentNode"
+               OpName %x_220 "x_220"
+               OpName %main_1 "main_1"
+               OpName %treeIndex_1 "treeIndex_1"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpName %param_6 "param_6"
+               OpName %param_7 "param_7"
+               OpName %param_8 "param_8"
+               OpName %param_9 "param_9"
+               OpName %param_10 "param_10"
+               OpName %param_11 "param_11"
+               OpName %param_12 "param_12"
+               OpName %param_13 "param_13"
+               OpName %param_14 "param_14"
+               OpName %param_15 "param_15"
+               OpName %param_16 "param_16"
+               OpName %param_17 "param_17"
+               OpName %param_18 "param_18"
+               OpName %param_19 "param_19"
+               OpName %param_20 "param_20"
+               OpName %param_21 "param_21"
+               OpName %param_22 "param_22"
+               OpName %param_23 "param_23"
+               OpName %count "count"
+               OpName %i "i"
+               OpName %result "result"
+               OpName %param_24 "param_24"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpMemberDecorate %BST 0 Offset 0
+               OpMemberDecorate %BST 1 Offset 4
+               OpMemberDecorate %BST 2 Offset 8
+               OpDecorate %_arr_BST_uint_10 ArrayStride 12
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+        %BST = OpTypeStruct %int %int %int
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_BST_uint_10 = OpTypeArray %BST %uint_10
+%_ptr_Private__arr_BST_uint_10 = OpTypePointer Private %_arr_BST_uint_10
+          %8 = OpConstantNull %_arr_BST_uint_10
+       %tree = OpVariable %_ptr_Private__arr_BST_uint_10 Private %8
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %13 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %13
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %13
+       %void = OpTypeVoid
+%_ptr_Function_BST = OpTypePointer Function %BST
+%_ptr_Function_int = OpTypePointer Function %int
+         %16 = OpTypeFunction %void %_ptr_Function_BST %_ptr_Function_int
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+     %int_n1 = OpConstant %int -1
+     %uint_2 = OpConstant %uint 2
+         %36 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+         %42 = OpConstantNull %int
+         %44 = OpConstantNull %BST
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+%_ptr_Private_int = OpTypePointer Private %int
+%_ptr_Private_BST = OpTypePointer Private %BST
+        %122 = OpTypeFunction %int %_ptr_Function_int
+        %163 = OpTypeFunction %void
+      %int_9 = OpConstant %int 9
+      %int_1 = OpConstant %int 1
+      %int_5 = OpConstant %int 5
+     %int_12 = OpConstant %int 12
+     %int_15 = OpConstant %int 15
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+      %int_2 = OpConstant %int 2
+      %int_6 = OpConstant %int 6
+     %int_17 = OpConstant %int 17
+     %int_13 = OpConstant %int 13
+     %int_20 = OpConstant %int 20
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+        %302 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %303 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+        %304 = OpTypeFunction %void %main_out
+%makeTreeNode_struct_BST_i1_i1_i11_i1_ = OpFunction %void None %16
+       %node = OpFunctionParameter %_ptr_Function_BST
+       %data = OpFunctionParameter %_ptr_Function_int
+         %23 = OpLabel
+         %25 = OpLoad %int %data
+         %28 = OpAccessChain %_ptr_Function_int %node %uint_0
+               OpStore %28 %25
+         %31 = OpAccessChain %_ptr_Function_int %node %uint_1
+               OpStore %31 %int_n1
+         %35 = OpAccessChain %_ptr_Function_int %node %uint_2
+               OpStore %35 %int_n1
+               OpReturn
+               OpFunctionEnd
+%insert_i1_i1_ = OpFunction %void None %36
+  %treeIndex = OpFunctionParameter %_ptr_Function_int
+     %data_1 = OpFunctionParameter %_ptr_Function_int
+         %40 = OpLabel
+  %baseIndex = OpVariable %_ptr_Function_int Function %42
+      %param = OpVariable %_ptr_Function_BST Function %44
+    %param_1 = OpVariable %_ptr_Function_int Function %42
+    %param_2 = OpVariable %_ptr_Function_BST Function %44
+    %param_3 = OpVariable %_ptr_Function_int Function %42
+               OpStore %baseIndex %int_0
+               OpBranch %49
+         %49 = OpLabel
+               OpLoopMerge %50 %51 None
+               OpBranch %52
+         %52 = OpLabel
+         %53 = OpLoad %int %baseIndex
+         %55 = OpLoad %int %treeIndex
+         %56 = OpSLessThanEqual %bool %53 %55
+               OpSelectionMerge %58 None
+               OpBranchConditional %56 %59 %60
+         %59 = OpLabel
+               OpBranch %58
+         %60 = OpLabel
+               OpBranch %50
+         %58 = OpLabel
+         %62 = OpLoad %int %data_1
+         %63 = OpLoad %int %baseIndex
+         %65 = OpAccessChain %_ptr_Private_int %tree %63 %uint_0
+         %66 = OpLoad %int %65
+         %67 = OpSLessThanEqual %bool %62 %66
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %70
+         %69 = OpLabel
+         %71 = OpLoad %int %baseIndex
+         %72 = OpAccessChain %_ptr_Private_int %tree %71 %uint_1
+         %73 = OpLoad %int %72
+         %74 = OpIEqual %bool %73 %int_n1
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %77
+         %76 = OpLabel
+         %78 = OpLoad %int %baseIndex
+         %80 = OpLoad %int %treeIndex
+         %81 = OpAccessChain %_ptr_Private_int %tree %78 %uint_1
+               OpStore %81 %80
+         %83 = OpLoad %int %treeIndex
+         %85 = OpAccessChain %_ptr_Private_BST %tree %83
+         %86 = OpLoad %BST %85
+               OpStore %param %86
+         %88 = OpLoad %int %data_1
+               OpStore %param_1 %88
+         %89 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param %param_1
+         %92 = OpLoad %BST %param
+         %93 = OpAccessChain %_ptr_Private_BST %tree %83
+               OpStore %93 %92
+               OpReturn
+         %77 = OpLabel
+         %94 = OpLoad %int %baseIndex
+         %95 = OpAccessChain %_ptr_Private_int %tree %94 %uint_1
+         %96 = OpLoad %int %95
+               OpStore %baseIndex %96
+               OpBranch %51
+         %75 = OpLabel
+               OpReturn
+         %70 = OpLabel
+         %97 = OpLoad %int %baseIndex
+         %98 = OpAccessChain %_ptr_Private_int %tree %97 %uint_2
+         %99 = OpLoad %int %98
+        %100 = OpIEqual %bool %99 %int_n1
+               OpSelectionMerge %101 None
+               OpBranchConditional %100 %102 %103
+        %102 = OpLabel
+        %104 = OpLoad %int %baseIndex
+        %106 = OpLoad %int %treeIndex
+        %107 = OpAccessChain %_ptr_Private_int %tree %104 %uint_2
+               OpStore %107 %106
+        %109 = OpLoad %int %treeIndex
+        %110 = OpAccessChain %_ptr_Private_BST %tree %109
+        %111 = OpLoad %BST %110
+               OpStore %param_2 %111
+        %113 = OpLoad %int %data_1
+               OpStore %param_3 %113
+        %114 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param_2 %param_3
+        %117 = OpLoad %BST %param_2
+        %118 = OpAccessChain %_ptr_Private_BST %tree %109
+               OpStore %118 %117
+               OpReturn
+        %103 = OpLabel
+        %119 = OpLoad %int %baseIndex
+        %120 = OpAccessChain %_ptr_Private_int %tree %119 %uint_2
+        %121 = OpLoad %int %120
+               OpStore %baseIndex %121
+               OpBranch %51
+        %101 = OpLabel
+               OpReturn
+         %68 = OpLabel
+               OpReturn
+         %51 = OpLabel
+               OpBranch %49
+         %50 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %search_i1_ = OpFunction %int None %122
+     %target = OpFunctionParameter %_ptr_Function_int
+        %125 = OpLabel
+      %index = OpVariable %_ptr_Function_int Function %42
+%currentNode = OpVariable %_ptr_Function_BST Function %44
+      %x_220 = OpVariable %_ptr_Function_int Function %42
+               OpStore %index %int_0
+               OpBranch %129
+        %129 = OpLabel
+               OpLoopMerge %130 %131 None
+               OpBranch %132
+        %132 = OpLabel
+        %133 = OpLoad %int %index
+        %134 = OpINotEqual %bool %133 %int_n1
+               OpSelectionMerge %135 None
+               OpBranchConditional %134 %136 %137
+        %136 = OpLabel
+               OpBranch %135
+        %137 = OpLabel
+               OpBranch %130
+        %135 = OpLabel
+        %138 = OpLoad %int %index
+        %139 = OpAccessChain %_ptr_Private_BST %tree %138
+        %140 = OpLoad %BST %139
+               OpStore %currentNode %140
+        %141 = OpAccessChain %_ptr_Function_int %currentNode %uint_0
+        %142 = OpLoad %int %141
+        %144 = OpLoad %int %target
+        %145 = OpIEqual %bool %142 %144
+               OpSelectionMerge %146 None
+               OpBranchConditional %145 %147 %146
+        %147 = OpLabel
+        %149 = OpLoad %int %target
+               OpReturnValue %149
+        %146 = OpLabel
+        %151 = OpLoad %int %target
+        %152 = OpAccessChain %_ptr_Function_int %currentNode %uint_0
+        %153 = OpLoad %int %152
+        %154 = OpSGreaterThan %bool %151 %153
+               OpSelectionMerge %155 None
+               OpBranchConditional %154 %156 %157
+        %156 = OpLabel
+        %158 = OpAccessChain %_ptr_Function_int %currentNode %uint_2
+        %159 = OpLoad %int %158
+               OpStore %x_220 %159
+               OpBranch %155
+        %157 = OpLabel
+        %160 = OpAccessChain %_ptr_Function_int %currentNode %uint_1
+        %161 = OpLoad %int %160
+               OpStore %x_220 %161
+               OpBranch %155
+        %155 = OpLabel
+        %162 = OpLoad %int %x_220
+               OpStore %index %162
+               OpBranch %131
+        %131 = OpLabel
+               OpBranch %129
+        %130 = OpLabel
+               OpReturnValue %int_n1
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %163
+        %165 = OpLabel
+%treeIndex_1 = OpVariable %_ptr_Function_int Function %42
+    %param_4 = OpVariable %_ptr_Function_BST Function %44
+    %param_5 = OpVariable %_ptr_Function_int Function %42
+    %param_6 = OpVariable %_ptr_Function_int Function %42
+    %param_7 = OpVariable %_ptr_Function_int Function %42
+    %param_8 = OpVariable %_ptr_Function_int Function %42
+    %param_9 = OpVariable %_ptr_Function_int Function %42
+   %param_10 = OpVariable %_ptr_Function_int Function %42
+   %param_11 = OpVariable %_ptr_Function_int Function %42
+   %param_12 = OpVariable %_ptr_Function_int Function %42
+   %param_13 = OpVariable %_ptr_Function_int Function %42
+   %param_14 = OpVariable %_ptr_Function_int Function %42
+   %param_15 = OpVariable %_ptr_Function_int Function %42
+   %param_16 = OpVariable %_ptr_Function_int Function %42
+   %param_17 = OpVariable %_ptr_Function_int Function %42
+   %param_18 = OpVariable %_ptr_Function_int Function %42
+   %param_19 = OpVariable %_ptr_Function_int Function %42
+   %param_20 = OpVariable %_ptr_Function_int Function %42
+   %param_21 = OpVariable %_ptr_Function_int Function %42
+   %param_22 = OpVariable %_ptr_Function_int Function %42
+   %param_23 = OpVariable %_ptr_Function_int Function %42
+      %count = OpVariable %_ptr_Function_int Function %42
+          %i = OpVariable %_ptr_Function_int Function %42
+     %result = OpVariable %_ptr_Function_int Function %42
+   %param_24 = OpVariable %_ptr_Function_int Function %42
+               OpStore %treeIndex_1 %int_0
+        %191 = OpAccessChain %_ptr_Private_BST %tree %int_0
+        %192 = OpLoad %BST %191
+               OpStore %param_4 %192
+               OpStore %param_5 %int_9
+        %194 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param_4 %param_5
+        %197 = OpLoad %BST %param_4
+        %198 = OpAccessChain %_ptr_Private_BST %tree %int_0
+               OpStore %198 %197
+        %199 = OpLoad %int %treeIndex_1
+        %201 = OpIAdd %int %199 %int_1
+               OpStore %treeIndex_1 %201
+        %202 = OpLoad %int %treeIndex_1
+               OpStore %param_6 %202
+               OpStore %param_7 %int_5
+        %204 = OpFunctionCall %void %insert_i1_i1_ %param_6 %param_7
+        %207 = OpLoad %int %treeIndex_1
+        %208 = OpIAdd %int %207 %int_1
+               OpStore %treeIndex_1 %208
+        %209 = OpLoad %int %treeIndex_1
+               OpStore %param_8 %209
+               OpStore %param_9 %int_12
+        %211 = OpFunctionCall %void %insert_i1_i1_ %param_8 %param_9
+        %214 = OpLoad %int %treeIndex_1
+        %215 = OpIAdd %int %214 %int_1
+               OpStore %treeIndex_1 %215
+        %216 = OpLoad %int %treeIndex_1
+               OpStore %param_10 %216
+               OpStore %param_11 %int_15
+        %218 = OpFunctionCall %void %insert_i1_i1_ %param_10 %param_11
+        %221 = OpLoad %int %treeIndex_1
+        %222 = OpIAdd %int %221 %int_1
+               OpStore %treeIndex_1 %222
+        %223 = OpLoad %int %treeIndex_1
+               OpStore %param_12 %223
+               OpStore %param_13 %int_7
+        %225 = OpFunctionCall %void %insert_i1_i1_ %param_12 %param_13
+        %228 = OpLoad %int %treeIndex_1
+        %229 = OpIAdd %int %228 %int_1
+               OpStore %treeIndex_1 %229
+        %230 = OpLoad %int %treeIndex_1
+               OpStore %param_14 %230
+               OpStore %param_15 %int_8
+        %232 = OpFunctionCall %void %insert_i1_i1_ %param_14 %param_15
+        %235 = OpLoad %int %treeIndex_1
+        %236 = OpIAdd %int %235 %int_1
+               OpStore %treeIndex_1 %236
+        %237 = OpLoad %int %treeIndex_1
+               OpStore %param_16 %237
+               OpStore %param_17 %int_2
+        %239 = OpFunctionCall %void %insert_i1_i1_ %param_16 %param_17
+        %242 = OpLoad %int %treeIndex_1
+        %243 = OpIAdd %int %242 %int_1
+               OpStore %treeIndex_1 %243
+        %244 = OpLoad %int %treeIndex_1
+               OpStore %param_18 %244
+               OpStore %param_19 %int_6
+        %246 = OpFunctionCall %void %insert_i1_i1_ %param_18 %param_19
+        %249 = OpLoad %int %treeIndex_1
+        %250 = OpIAdd %int %249 %int_1
+               OpStore %treeIndex_1 %250
+        %251 = OpLoad %int %treeIndex_1
+               OpStore %param_20 %251
+               OpStore %param_21 %int_17
+        %253 = OpFunctionCall %void %insert_i1_i1_ %param_20 %param_21
+        %256 = OpLoad %int %treeIndex_1
+        %257 = OpIAdd %int %256 %int_1
+               OpStore %treeIndex_1 %257
+        %258 = OpLoad %int %treeIndex_1
+               OpStore %param_22 %258
+               OpStore %param_23 %int_13
+        %260 = OpFunctionCall %void %insert_i1_i1_ %param_22 %param_23
+               OpStore %count %int_0
+               OpStore %i %int_0
+               OpBranch %263
+        %263 = OpLabel
+               OpLoopMerge %264 %265 None
+               OpBranch %266
+        %266 = OpLabel
+        %267 = OpLoad %int %i
+        %269 = OpSLessThan %bool %267 %int_20
+               OpSelectionMerge %270 None
+               OpBranchConditional %269 %271 %272
+        %271 = OpLabel
+               OpBranch %270
+        %272 = OpLabel
+               OpBranch %264
+        %270 = OpLabel
+        %273 = OpLoad %int %i
+               OpStore %param_24 %273
+        %274 = OpFunctionCall %int %search_i1_ %param_24
+               OpStore %result %274
+        %276 = OpLoad %int %i
+               OpSelectionMerge %277 None
+               OpSwitch %276 %278 2 %279 5 %279 6 %279 7 %279 8 %279 9 %279 12 %279 13 %279 15 %279 17 %279
+        %279 = OpLabel
+        %280 = OpLoad %int %result
+        %281 = OpLoad %int %i
+        %282 = OpIEqual %bool %280 %281
+               OpSelectionMerge %283 None
+               OpBranchConditional %282 %284 %283
+        %284 = OpLabel
+        %285 = OpLoad %int %count
+        %286 = OpIAdd %int %285 %int_1
+               OpStore %count %286
+               OpBranch %283
+        %283 = OpLabel
+               OpBranch %277
+        %278 = OpLabel
+        %287 = OpLoad %int %result
+        %288 = OpIEqual %bool %287 %int_n1
+               OpSelectionMerge %289 None
+               OpBranchConditional %288 %290 %289
+        %290 = OpLabel
+        %291 = OpLoad %int %count
+        %292 = OpIAdd %int %291 %int_1
+               OpStore %count %292
+               OpBranch %289
+        %289 = OpLabel
+               OpBranch %277
+        %277 = OpLabel
+               OpBranch %265
+        %265 = OpLabel
+        %293 = OpLoad %int %i
+        %294 = OpIAdd %int %293 %int_1
+               OpStore %i %294
+               OpBranch %263
+        %264 = OpLabel
+        %295 = OpLoad %int %count
+        %296 = OpIEqual %bool %295 %int_20
+               OpSelectionMerge %297 None
+               OpBranchConditional %296 %298 %299
+        %298 = OpLabel
+               OpStore %x_GLF_color %302
+               OpBranch %297
+        %299 = OpLabel
+               OpStore %x_GLF_color %303
+               OpBranch %297
+        %297 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %304
+%tint_symbol = OpFunctionParameter %main_out
+        %308 = OpLabel
+        %309 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %309
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %163
+        %311 = OpLabel
+        %312 = OpFunctionCall %void %main_1
+        %314 = OpLoad %v4float %x_GLF_color
+        %315 = OpCompositeConstruct %main_out %314
+        %313 = OpFunctionCall %void %tint_symbol_2 %315
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..19d6c9d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,264 @@
+struct BST {
+  data : i32;
+  leftIndex : i32;
+  rightIndex : i32;
+};
+
+var<private> tree : array<BST, 10>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn makeTreeNode_struct_BST_i1_i1_i11_i1_(node : ptr<function, BST>, data : ptr<function, i32>) {
+  let x_158 : i32 = *(data);
+  (*(node)).data = x_158;
+  (*(node)).leftIndex = -1;
+  (*(node)).rightIndex = -1;
+  return;
+}
+
+fn insert_i1_i1_(treeIndex : ptr<function, i32>, data_1 : ptr<function, i32>) {
+  var baseIndex : i32;
+  var param : BST;
+  var param_1 : i32;
+  var param_2 : BST;
+  var param_3 : i32;
+  baseIndex = 0;
+  loop {
+    let x_167 : i32 = baseIndex;
+    let x_168 : i32 = *(treeIndex);
+    if ((x_167 <= x_168)) {
+    } else {
+      break;
+    }
+    let x_171 : i32 = *(data_1);
+    let x_172 : i32 = baseIndex;
+    let x_174 : i32 = tree[x_172].data;
+    if ((x_171 <= x_174)) {
+      let x_179 : i32 = baseIndex;
+      let x_181 : i32 = tree[x_179].leftIndex;
+      if ((x_181 == -1)) {
+        let x_186 : i32 = baseIndex;
+        let x_187 : i32 = *(treeIndex);
+        tree[x_186].leftIndex = x_187;
+        let x_189 : i32 = *(treeIndex);
+        let x_191 : BST = tree[x_189];
+        param = x_191;
+        let x_192 : i32 = *(data_1);
+        param_1 = x_192;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param), &(param_1));
+        let x_194 : BST = param;
+        tree[x_189] = x_194;
+        return;
+      } else {
+        let x_196 : i32 = baseIndex;
+        let x_198 : i32 = tree[x_196].leftIndex;
+        baseIndex = x_198;
+        continue;
+      }
+      return;
+    } else {
+      let x_199 : i32 = baseIndex;
+      let x_201 : i32 = tree[x_199].rightIndex;
+      if ((x_201 == -1)) {
+        let x_206 : i32 = baseIndex;
+        let x_207 : i32 = *(treeIndex);
+        tree[x_206].rightIndex = x_207;
+        let x_209 : i32 = *(treeIndex);
+        let x_211 : BST = tree[x_209];
+        param_2 = x_211;
+        let x_212 : i32 = *(data_1);
+        param_3 = x_212;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_2), &(param_3));
+        let x_214 : BST = param_2;
+        tree[x_209] = x_214;
+        return;
+      } else {
+        let x_216 : i32 = baseIndex;
+        let x_218 : i32 = tree[x_216].rightIndex;
+        baseIndex = x_218;
+        continue;
+      }
+      return;
+    }
+    return;
+  }
+  return;
+}
+
+fn search_i1_(target : ptr<function, i32>) -> i32 {
+  var index : i32;
+  var currentNode : BST;
+  var x_220 : i32;
+  index = 0;
+  loop {
+    let x_225 : i32 = index;
+    if ((x_225 != -1)) {
+    } else {
+      break;
+    }
+    let x_228 : i32 = index;
+    let x_230 : BST = tree[x_228];
+    currentNode = x_230;
+    let x_232 : i32 = currentNode.data;
+    let x_233 : i32 = *(target);
+    if ((x_232 == x_233)) {
+      let x_237 : i32 = *(target);
+      return x_237;
+    }
+    let x_238 : i32 = *(target);
+    let x_240 : i32 = currentNode.data;
+    if ((x_238 > x_240)) {
+      let x_246 : i32 = currentNode.rightIndex;
+      x_220 = x_246;
+    } else {
+      let x_248 : i32 = currentNode.leftIndex;
+      x_220 = x_248;
+    }
+    let x_249 : i32 = x_220;
+    index = x_249;
+  }
+  return -1;
+}
+
+fn main_1() {
+  var treeIndex_1 : i32;
+  var param_4 : BST;
+  var param_5 : i32;
+  var param_6 : i32;
+  var param_7 : i32;
+  var param_8 : i32;
+  var param_9 : i32;
+  var param_10 : i32;
+  var param_11 : i32;
+  var param_12 : i32;
+  var param_13 : i32;
+  var param_14 : i32;
+  var param_15 : i32;
+  var param_16 : i32;
+  var param_17 : i32;
+  var param_18 : i32;
+  var param_19 : i32;
+  var param_20 : i32;
+  var param_21 : i32;
+  var param_22 : i32;
+  var param_23 : i32;
+  var count : i32;
+  var i : i32;
+  var result : i32;
+  var param_24 : i32;
+  treeIndex_1 = 0;
+  let x_84 : BST = tree[0];
+  param_4 = x_84;
+  param_5 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_4), &(param_5));
+  let x_86 : BST = param_4;
+  tree[0] = x_86;
+  let x_88 : i32 = treeIndex_1;
+  treeIndex_1 = (x_88 + 1);
+  let x_90 : i32 = treeIndex_1;
+  param_6 = x_90;
+  param_7 = 5;
+  insert_i1_i1_(&(param_6), &(param_7));
+  let x_92 : i32 = treeIndex_1;
+  treeIndex_1 = (x_92 + 1);
+  let x_94 : i32 = treeIndex_1;
+  param_8 = x_94;
+  param_9 = 12;
+  insert_i1_i1_(&(param_8), &(param_9));
+  let x_96 : i32 = treeIndex_1;
+  treeIndex_1 = (x_96 + 1);
+  let x_98 : i32 = treeIndex_1;
+  param_10 = x_98;
+  param_11 = 15;
+  insert_i1_i1_(&(param_10), &(param_11));
+  let x_100 : i32 = treeIndex_1;
+  treeIndex_1 = (x_100 + 1);
+  let x_102 : i32 = treeIndex_1;
+  param_12 = x_102;
+  param_13 = 7;
+  insert_i1_i1_(&(param_12), &(param_13));
+  let x_104 : i32 = treeIndex_1;
+  treeIndex_1 = (x_104 + 1);
+  let x_106 : i32 = treeIndex_1;
+  param_14 = x_106;
+  param_15 = 8;
+  insert_i1_i1_(&(param_14), &(param_15));
+  let x_108 : i32 = treeIndex_1;
+  treeIndex_1 = (x_108 + 1);
+  let x_110 : i32 = treeIndex_1;
+  param_16 = x_110;
+  param_17 = 2;
+  insert_i1_i1_(&(param_16), &(param_17));
+  let x_112 : i32 = treeIndex_1;
+  treeIndex_1 = (x_112 + 1);
+  let x_114 : i32 = treeIndex_1;
+  param_18 = x_114;
+  param_19 = 6;
+  insert_i1_i1_(&(param_18), &(param_19));
+  let x_116 : i32 = treeIndex_1;
+  treeIndex_1 = (x_116 + 1);
+  let x_118 : i32 = treeIndex_1;
+  param_20 = x_118;
+  param_21 = 17;
+  insert_i1_i1_(&(param_20), &(param_21));
+  let x_120 : i32 = treeIndex_1;
+  treeIndex_1 = (x_120 + 1);
+  let x_122 : i32 = treeIndex_1;
+  param_22 = x_122;
+  param_23 = 13;
+  insert_i1_i1_(&(param_22), &(param_23));
+  count = 0;
+  i = 0;
+  loop {
+    let x_128 : i32 = i;
+    if ((x_128 < 20)) {
+    } else {
+      break;
+    }
+    let x_131 : i32 = i;
+    param_24 = x_131;
+    let x_132 : i32 = search_i1_(&(param_24));
+    result = x_132;
+    let x_133 : i32 = i;
+    switch(x_133) {
+      case 2, 5, 6, 7, 8, 9, 12, 13, 15, 17: {
+        let x_143 : i32 = result;
+        let x_144 : i32 = i;
+        if ((x_143 == x_144)) {
+          let x_148 : i32 = count;
+          count = (x_148 + 1);
+        }
+      }
+      default: {
+        let x_137 : i32 = result;
+        if ((x_137 == -1)) {
+          let x_141 : i32 = count;
+          count = (x_141 + 1);
+        }
+      }
+    }
+
+    continuing {
+      let x_150 : i32 = i;
+      i = (x_150 + 1);
+    }
+  }
+  let x_152 : i32 = count;
+  if ((x_152 == 20)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.spvasm
new file mode 100644
index 0000000..ef62d6c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.spvasm
@@ -0,0 +1,508 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %identity_i1_ "identity(i1;"
+               OpName %a "a"
+               OpName %BST "BST"
+               OpMemberName %BST 0 "data"
+               OpMemberName %BST 1 "leftIndex"
+               OpMemberName %BST 2 "rightIndex"
+               OpName %makeTreeNode_struct_BST_i1_i1_i11_i1_ "makeTreeNode(struct-BST-i1-i1-i11;i1;"
+               OpName %node "node"
+               OpName %data "data"
+               OpName %insert_i1_i1_ "insert(i1;i1;"
+               OpName %treeIndex "treeIndex"
+               OpName %data_0 "data"
+               OpName %search_i1_ "search(i1;"
+               OpName %target "target"
+               OpName %QuicksortObject "QuicksortObject"
+               OpMemberName %QuicksortObject 0 "numbers"
+               OpName %obj "obj"
+               OpName %baseIndex "baseIndex"
+               OpName %tree "tree"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %param_1 "param"
+               OpName %param_2 "param"
+               OpName %index "index"
+               OpName %currentNode "currentNode"
+               OpName %treeIndex_0 "treeIndex"
+               OpName %param_3 "param"
+               OpName %param_4 "param"
+               OpName %param_5 "param"
+               OpName %param_6 "param"
+               OpName %param_7 "param"
+               OpName %param_8 "param"
+               OpName %param_9 "param"
+               OpName %param_10 "param"
+               OpName %param_11 "param"
+               OpName %param_12 "param"
+               OpName %param_13 "param"
+               OpName %param_14 "param"
+               OpName %param_15 "param"
+               OpName %param_16 "param"
+               OpName %param_17 "param"
+               OpName %param_18 "param"
+               OpName %param_19 "param"
+               OpName %param_20 "param"
+               OpName %param_21 "param"
+               OpName %param_22 "param"
+               OpName %pp "pp"
+               OpName %looplimiter0 "looplimiter0"
+               OpName %i "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %param_23 "param"
+               OpName %count "count"
+               OpName %i_0 "i"
+               OpName %result "result"
+               OpName %param_24 "param"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %57 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %60 = OpTypeFunction %int %_ptr_Function_int
+        %BST = OpTypeStruct %int %int %int
+%_ptr_Function_BST = OpTypePointer Function %BST
+         %62 = OpTypeFunction %void %_ptr_Function_BST %_ptr_Function_int
+         %63 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%QuicksortObject = OpTypeStruct %_arr_int_uint_10
+%_ptr_Private_QuicksortObject = OpTypePointer Private %QuicksortObject
+        %obj = OpVariable %_ptr_Private_QuicksortObject Private
+      %int_0 = OpConstant %int 0
+%_ptr_Private_int = OpTypePointer Private %int
+      %int_2 = OpConstant %int 2
+      %int_1 = OpConstant %int 1
+     %int_n1 = OpConstant %int -1
+       %bool = OpTypeBool
+%_arr_BST_uint_10 = OpTypeArray %BST %uint_10
+%_ptr_Private__arr_BST_uint_10 = OpTypePointer Private %_arr_BST_uint_10
+       %tree = OpVariable %_ptr_Private__arr_BST_uint_10 Private
+%_ptr_Private_BST = OpTypePointer Private %BST
+      %int_9 = OpConstant %int 9
+      %int_5 = OpConstant %int 5
+     %int_12 = OpConstant %int 12
+     %int_15 = OpConstant %int 15
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+      %int_6 = OpConstant %int 6
+     %int_17 = OpConstant %int 17
+     %int_13 = OpConstant %int 13
+  %int_10000 = OpConstant %int 10000
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %int_20 = OpConstant %int 20
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %97 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %98 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+       %main = OpFunction %void None %57
+         %99 = OpLabel
+%treeIndex_0 = OpVariable %_ptr_Function_int Function
+    %param_3 = OpVariable %_ptr_Function_BST Function
+    %param_4 = OpVariable %_ptr_Function_int Function
+    %param_5 = OpVariable %_ptr_Function_int Function
+    %param_6 = OpVariable %_ptr_Function_int Function
+    %param_7 = OpVariable %_ptr_Function_int Function
+    %param_8 = OpVariable %_ptr_Function_int Function
+    %param_9 = OpVariable %_ptr_Function_int Function
+   %param_10 = OpVariable %_ptr_Function_int Function
+   %param_11 = OpVariable %_ptr_Function_int Function
+   %param_12 = OpVariable %_ptr_Function_int Function
+   %param_13 = OpVariable %_ptr_Function_int Function
+   %param_14 = OpVariable %_ptr_Function_int Function
+   %param_15 = OpVariable %_ptr_Function_int Function
+   %param_16 = OpVariable %_ptr_Function_int Function
+   %param_17 = OpVariable %_ptr_Function_int Function
+   %param_18 = OpVariable %_ptr_Function_int Function
+   %param_19 = OpVariable %_ptr_Function_int Function
+   %param_20 = OpVariable %_ptr_Function_int Function
+   %param_21 = OpVariable %_ptr_Function_int Function
+   %param_22 = OpVariable %_ptr_Function_int Function
+         %pp = OpVariable %_ptr_Function_int Function
+%looplimiter0 = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+   %param_23 = OpVariable %_ptr_Function_int Function
+      %count = OpVariable %_ptr_Function_int Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+     %result = OpVariable %_ptr_Function_int Function
+   %param_24 = OpVariable %_ptr_Function_int Function
+               OpStore %treeIndex_0 %int_0
+        %100 = OpAccessChain %_ptr_Private_BST %tree %int_0
+        %101 = OpLoad %BST %100
+               OpStore %param_3 %101
+               OpStore %param_4 %int_9
+        %102 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param_3 %param_4
+        %103 = OpLoad %BST %param_3
+        %104 = OpAccessChain %_ptr_Private_BST %tree %int_0
+               OpStore %104 %103
+        %105 = OpLoad %int %treeIndex_0
+        %106 = OpIAdd %int %105 %int_1
+               OpStore %treeIndex_0 %106
+        %107 = OpLoad %int %treeIndex_0
+               OpStore %param_5 %107
+               OpStore %param_6 %int_5
+        %108 = OpFunctionCall %void %insert_i1_i1_ %param_5 %param_6
+        %109 = OpLoad %int %treeIndex_0
+        %110 = OpIAdd %int %109 %int_1
+               OpStore %treeIndex_0 %110
+        %111 = OpLoad %int %treeIndex_0
+               OpStore %param_7 %111
+               OpStore %param_8 %int_12
+        %112 = OpFunctionCall %void %insert_i1_i1_ %param_7 %param_8
+        %113 = OpLoad %int %treeIndex_0
+        %114 = OpIAdd %int %113 %int_1
+               OpStore %treeIndex_0 %114
+        %115 = OpLoad %int %treeIndex_0
+               OpStore %param_9 %115
+               OpStore %param_10 %int_15
+        %116 = OpFunctionCall %void %insert_i1_i1_ %param_9 %param_10
+        %117 = OpLoad %int %treeIndex_0
+        %118 = OpIAdd %int %117 %int_1
+               OpStore %treeIndex_0 %118
+        %119 = OpLoad %int %treeIndex_0
+               OpStore %param_11 %119
+               OpStore %param_12 %int_7
+        %120 = OpFunctionCall %void %insert_i1_i1_ %param_11 %param_12
+        %121 = OpLoad %int %treeIndex_0
+        %122 = OpIAdd %int %121 %int_1
+               OpStore %treeIndex_0 %122
+        %123 = OpLoad %int %treeIndex_0
+               OpStore %param_13 %123
+               OpStore %param_14 %int_8
+        %124 = OpFunctionCall %void %insert_i1_i1_ %param_13 %param_14
+        %125 = OpLoad %int %treeIndex_0
+        %126 = OpIAdd %int %125 %int_1
+               OpStore %treeIndex_0 %126
+        %127 = OpLoad %int %treeIndex_0
+               OpStore %param_15 %127
+               OpStore %param_16 %int_2
+        %128 = OpFunctionCall %void %insert_i1_i1_ %param_15 %param_16
+        %129 = OpLoad %int %treeIndex_0
+        %130 = OpIAdd %int %129 %int_1
+               OpStore %treeIndex_0 %130
+        %131 = OpLoad %int %treeIndex_0
+               OpStore %param_17 %131
+               OpStore %param_18 %int_6
+        %132 = OpFunctionCall %void %insert_i1_i1_ %param_17 %param_18
+        %133 = OpLoad %int %treeIndex_0
+        %134 = OpIAdd %int %133 %int_1
+               OpStore %treeIndex_0 %134
+        %135 = OpLoad %int %treeIndex_0
+               OpStore %param_19 %135
+               OpStore %param_20 %int_17
+        %136 = OpFunctionCall %void %insert_i1_i1_ %param_19 %param_20
+        %137 = OpLoad %int %treeIndex_0
+        %138 = OpIAdd %int %137 %int_1
+               OpStore %treeIndex_0 %138
+        %139 = OpLoad %int %treeIndex_0
+               OpStore %param_21 %139
+               OpStore %param_22 %int_13
+        %140 = OpFunctionCall %void %insert_i1_i1_ %param_21 %param_22
+               OpStore %pp %int_0
+               OpStore %looplimiter0 %int_0
+               OpStore %i %int_0
+               OpBranch %141
+        %141 = OpLabel
+               OpLoopMerge %142 %143 None
+               OpBranch %144
+        %144 = OpLabel
+        %145 = OpLoad %int %i
+        %146 = OpSLessThan %bool %145 %int_10000
+               OpBranchConditional %146 %147 %142
+        %147 = OpLabel
+        %148 = OpLoad %int %looplimiter0
+        %149 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+        %150 = OpLoad %float %149
+        %151 = OpConvertFToS %int %150
+        %152 = OpSGreaterThanEqual %bool %148 %151
+               OpSelectionMerge %153 None
+               OpBranchConditional %152 %154 %153
+        %154 = OpLabel
+        %155 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+        %156 = OpLoad %float %155
+        %157 = OpConvertFToS %int %156
+        %158 = OpIAdd %int %int_1 %157
+               OpStore %param_23 %158
+        %159 = OpFunctionCall %int %identity_i1_ %param_23
+               OpStore %pp %159
+               OpBranch %142
+        %153 = OpLabel
+        %160 = OpLoad %int %looplimiter0
+        %161 = OpIAdd %int %160 %int_1
+               OpStore %looplimiter0 %161
+               OpBranch %143
+        %143 = OpLabel
+        %162 = OpLoad %int %i
+        %163 = OpIAdd %int %162 %int_1
+               OpStore %i %163
+               OpBranch %141
+        %142 = OpLabel
+        %164 = OpLoad %int %pp
+        %165 = OpINotEqual %bool %164 %int_2
+               OpSelectionMerge %166 None
+               OpBranchConditional %165 %167 %166
+        %167 = OpLabel
+               OpReturn
+        %166 = OpLabel
+               OpStore %count %int_0
+               OpStore %i_0 %int_0
+               OpBranch %168
+        %168 = OpLabel
+               OpLoopMerge %169 %170 None
+               OpBranch %171
+        %171 = OpLabel
+        %172 = OpLoad %int %i_0
+        %173 = OpSLessThan %bool %172 %int_20
+               OpBranchConditional %173 %174 %169
+        %174 = OpLabel
+        %175 = OpLoad %int %i_0
+               OpStore %param_24 %175
+        %176 = OpFunctionCall %int %search_i1_ %param_24
+               OpStore %result %176
+        %177 = OpLoad %int %i_0
+               OpSelectionMerge %178 None
+               OpSwitch %177 %179 9 %180 5 %180 12 %180 15 %180 7 %180 8 %180 2 %180 6 %180 17 %180 13 %180
+        %179 = OpLabel
+        %181 = OpLoad %int %result
+        %182 = OpIEqual %bool %181 %int_n1
+               OpSelectionMerge %183 None
+               OpBranchConditional %182 %184 %183
+        %184 = OpLabel
+        %185 = OpLoad %int %count
+        %186 = OpIAdd %int %185 %int_1
+               OpStore %count %186
+               OpBranch %183
+        %183 = OpLabel
+               OpBranch %178
+        %180 = OpLabel
+        %187 = OpLoad %int %result
+        %188 = OpLoad %int %i_0
+        %189 = OpIEqual %bool %187 %188
+               OpSelectionMerge %190 None
+               OpBranchConditional %189 %191 %190
+        %191 = OpLabel
+        %192 = OpLoad %int %count
+        %193 = OpIAdd %int %192 %int_1
+               OpStore %count %193
+               OpBranch %190
+        %190 = OpLabel
+               OpBranch %178
+        %178 = OpLabel
+               OpBranch %170
+        %170 = OpLabel
+        %194 = OpLoad %int %i_0
+        %195 = OpIAdd %int %194 %int_1
+               OpStore %i_0 %195
+               OpBranch %168
+        %169 = OpLabel
+        %196 = OpLoad %int %count
+        %197 = OpIEqual %bool %196 %int_20
+               OpSelectionMerge %198 None
+               OpBranchConditional %197 %199 %200
+        %199 = OpLabel
+               OpStore %_GLF_color %97
+               OpBranch %198
+        %200 = OpLabel
+               OpStore %_GLF_color %98
+               OpBranch %198
+        %198 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%identity_i1_ = OpFunction %int None %60
+          %a = OpFunctionParameter %_ptr_Function_int
+        %201 = OpLabel
+        %202 = OpLoad %int %a
+        %203 = OpLoad %int %a
+        %204 = OpAccessChain %_ptr_Private_int %obj %int_0 %202
+               OpStore %204 %203
+        %205 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_2
+        %206 = OpLoad %int %205
+               OpReturnValue %206
+               OpFunctionEnd
+%makeTreeNode_struct_BST_i1_i1_i11_i1_ = OpFunction %void None %62
+       %node = OpFunctionParameter %_ptr_Function_BST
+       %data = OpFunctionParameter %_ptr_Function_int
+        %207 = OpLabel
+        %208 = OpLoad %int %data
+        %209 = OpAccessChain %_ptr_Function_int %node %int_0
+               OpStore %209 %208
+        %210 = OpAccessChain %_ptr_Function_int %node %int_1
+               OpStore %210 %int_n1
+        %211 = OpAccessChain %_ptr_Function_int %node %int_2
+               OpStore %211 %int_n1
+               OpReturn
+               OpFunctionEnd
+%insert_i1_i1_ = OpFunction %void None %63
+  %treeIndex = OpFunctionParameter %_ptr_Function_int
+     %data_0 = OpFunctionParameter %_ptr_Function_int
+        %212 = OpLabel
+  %baseIndex = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_BST Function
+    %param_0 = OpVariable %_ptr_Function_int Function
+    %param_1 = OpVariable %_ptr_Function_BST Function
+    %param_2 = OpVariable %_ptr_Function_int Function
+               OpStore %baseIndex %int_0
+               OpBranch %213
+        %213 = OpLabel
+               OpLoopMerge %214 %215 None
+               OpBranch %216
+        %216 = OpLabel
+        %217 = OpLoad %int %baseIndex
+        %218 = OpLoad %int %treeIndex
+        %219 = OpSLessThanEqual %bool %217 %218
+               OpBranchConditional %219 %220 %214
+        %220 = OpLabel
+        %221 = OpLoad %int %data_0
+        %222 = OpLoad %int %baseIndex
+        %223 = OpAccessChain %_ptr_Private_int %tree %222 %int_0
+        %224 = OpLoad %int %223
+        %225 = OpSLessThanEqual %bool %221 %224
+               OpSelectionMerge %226 None
+               OpBranchConditional %225 %227 %228
+        %227 = OpLabel
+        %229 = OpLoad %int %baseIndex
+        %230 = OpAccessChain %_ptr_Private_int %tree %229 %int_1
+        %231 = OpLoad %int %230
+        %232 = OpIEqual %bool %231 %int_n1
+               OpSelectionMerge %233 None
+               OpBranchConditional %232 %234 %235
+        %234 = OpLabel
+        %236 = OpLoad %int %baseIndex
+        %237 = OpLoad %int %treeIndex
+        %238 = OpAccessChain %_ptr_Private_int %tree %236 %int_1
+               OpStore %238 %237
+        %239 = OpLoad %int %treeIndex
+        %240 = OpAccessChain %_ptr_Private_BST %tree %239
+        %241 = OpLoad %BST %240
+               OpStore %param %241
+        %242 = OpLoad %int %data_0
+               OpStore %param_0 %242
+        %243 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param %param_0
+        %244 = OpLoad %BST %param
+        %245 = OpAccessChain %_ptr_Private_BST %tree %239
+               OpStore %245 %244
+               OpReturn
+        %235 = OpLabel
+        %246 = OpLoad %int %baseIndex
+        %247 = OpAccessChain %_ptr_Private_int %tree %246 %int_1
+        %248 = OpLoad %int %247
+               OpStore %baseIndex %248
+               OpBranch %215
+        %233 = OpLabel
+               OpUnreachable
+        %228 = OpLabel
+        %249 = OpLoad %int %baseIndex
+        %250 = OpAccessChain %_ptr_Private_int %tree %249 %int_2
+        %251 = OpLoad %int %250
+        %252 = OpIEqual %bool %251 %int_n1
+               OpSelectionMerge %253 None
+               OpBranchConditional %252 %254 %255
+        %254 = OpLabel
+        %256 = OpLoad %int %baseIndex
+        %257 = OpLoad %int %treeIndex
+        %258 = OpAccessChain %_ptr_Private_int %tree %256 %int_2
+               OpStore %258 %257
+        %259 = OpLoad %int %treeIndex
+        %260 = OpAccessChain %_ptr_Private_BST %tree %259
+        %261 = OpLoad %BST %260
+               OpStore %param_1 %261
+        %262 = OpLoad %int %data_0
+               OpStore %param_2 %262
+        %263 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param_1 %param_2
+        %264 = OpLoad %BST %param_1
+        %265 = OpAccessChain %_ptr_Private_BST %tree %259
+               OpStore %265 %264
+               OpReturn
+        %255 = OpLabel
+        %266 = OpLoad %int %baseIndex
+        %267 = OpAccessChain %_ptr_Private_int %tree %266 %int_2
+        %268 = OpLoad %int %267
+               OpStore %baseIndex %268
+               OpBranch %215
+        %253 = OpLabel
+               OpUnreachable
+        %226 = OpLabel
+               OpUnreachable
+        %215 = OpLabel
+               OpBranch %213
+        %214 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %search_i1_ = OpFunction %int None %60
+     %target = OpFunctionParameter %_ptr_Function_int
+        %269 = OpLabel
+      %index = OpVariable %_ptr_Function_int Function
+%currentNode = OpVariable %_ptr_Function_BST Function
+        %270 = OpVariable %_ptr_Function_int Function
+               OpStore %index %int_0
+               OpBranch %271
+        %271 = OpLabel
+               OpLoopMerge %272 %273 None
+               OpBranch %274
+        %274 = OpLabel
+        %275 = OpLoad %int %index
+        %276 = OpINotEqual %bool %275 %int_n1
+               OpBranchConditional %276 %277 %272
+        %277 = OpLabel
+        %278 = OpLoad %int %index
+        %279 = OpAccessChain %_ptr_Private_BST %tree %278
+        %280 = OpLoad %BST %279
+               OpStore %currentNode %280
+        %281 = OpAccessChain %_ptr_Function_int %currentNode %int_0
+        %282 = OpLoad %int %281
+        %283 = OpLoad %int %target
+        %284 = OpIEqual %bool %282 %283
+               OpSelectionMerge %285 None
+               OpBranchConditional %284 %286 %285
+        %286 = OpLabel
+        %287 = OpLoad %int %target
+               OpReturnValue %287
+        %285 = OpLabel
+        %288 = OpLoad %int %target
+        %289 = OpAccessChain %_ptr_Function_int %currentNode %int_0
+        %290 = OpLoad %int %289
+        %291 = OpSGreaterThan %bool %288 %290
+               OpSelectionMerge %292 None
+               OpBranchConditional %291 %293 %294
+        %293 = OpLabel
+        %295 = OpAccessChain %_ptr_Function_int %currentNode %int_2
+        %296 = OpLoad %int %295
+               OpStore %270 %296
+               OpBranch %292
+        %294 = OpLabel
+        %297 = OpAccessChain %_ptr_Function_int %currentNode %int_1
+        %298 = OpLoad %int %297
+               OpStore %270 %298
+               OpBranch %292
+        %292 = OpLabel
+        %299 = OpLoad %int %270
+               OpStore %index %299
+               OpBranch %273
+        %273 = OpLabel
+               OpBranch %271
+        %272 = OpLabel
+               OpReturnValue %int_n1
+               OpFunctionEnd
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
new file mode 100644
index 0000000..ece942a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.spvasm.expected.hlsl
@@ -0,0 +1,271 @@
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+struct QuicksortObject {
+  int numbers[10];
+};
+
+static QuicksortObject obj = (QuicksortObject)0;
+static BST tree[10] = (BST[10])0;
+cbuffer cbuffer_x_50 : register(b0, space0) {
+  uint4 x_50[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void makeTreeNode_struct_BST_i1_i1_i11_i1_(inout BST node, inout int data) {
+  const int x_208 = data;
+  node.data = x_208;
+  node.leftIndex = -1;
+  node.rightIndex = -1;
+  return;
+}
+
+void insert_i1_i1_(inout int treeIndex, inout int data_1) {
+  int baseIndex = 0;
+  BST param = (BST)0;
+  int param_1 = 0;
+  BST param_2 = (BST)0;
+  int param_3 = 0;
+  baseIndex = 0;
+  while (true) {
+    const int x_217 = baseIndex;
+    const int x_218 = treeIndex;
+    if ((x_217 <= x_218)) {
+    } else {
+      break;
+    }
+    const int x_221 = data_1;
+    const int x_224 = tree[baseIndex].data;
+    if ((x_221 <= x_224)) {
+      const int x_231 = tree[baseIndex].leftIndex;
+      if ((x_231 == -1)) {
+        const int x_236 = baseIndex;
+        const int x_237 = treeIndex;
+        tree[x_236].leftIndex = x_237;
+        const int x_239 = treeIndex;
+        const BST x_241 = tree[x_239];
+        param = x_241;
+        const int x_242 = data_1;
+        param_1 = x_242;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(param, param_1);
+        tree[x_239] = param;
+        return;
+      } else {
+        const int x_248 = tree[baseIndex].leftIndex;
+        baseIndex = x_248;
+        continue;
+      }
+      return;
+    } else {
+      const int x_251 = tree[baseIndex].rightIndex;
+      if ((x_251 == -1)) {
+        const int x_256 = baseIndex;
+        const int x_257 = treeIndex;
+        tree[x_256].rightIndex = x_257;
+        const int x_259 = treeIndex;
+        const BST x_261 = tree[x_259];
+        param_2 = x_261;
+        const int x_262 = data_1;
+        param_3 = x_262;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(param_2, param_3);
+        tree[x_259] = param_2;
+        return;
+      } else {
+        const int x_268 = tree[baseIndex].rightIndex;
+        baseIndex = x_268;
+        continue;
+      }
+      return;
+    }
+    return;
+  }
+  return;
+}
+
+int identity_i1_(inout int a) {
+  const int x_202 = a;
+  const int x_203 = a;
+  obj.numbers[x_202] = x_203;
+  const int x_206 = obj.numbers[2];
+  return x_206;
+}
+
+int search_i1_(inout int target) {
+  int index = 0;
+  BST currentNode = (BST)0;
+  int x_270 = 0;
+  index = 0;
+  while (true) {
+    if ((index != -1)) {
+    } else {
+      break;
+    }
+    const BST x_280 = tree[index];
+    currentNode = x_280;
+    const int x_282 = currentNode.data;
+    const int x_283 = target;
+    if ((x_282 == x_283)) {
+      const int x_287 = target;
+      return x_287;
+    }
+    const int x_288 = target;
+    const int x_290 = currentNode.data;
+    if ((x_288 > x_290)) {
+      const int x_296 = currentNode.rightIndex;
+      x_270 = x_296;
+    } else {
+      const int x_298 = currentNode.leftIndex;
+      x_270 = x_298;
+    }
+    index = x_270;
+  }
+  return -1;
+}
+
+void main_1() {
+  int treeIndex_1 = 0;
+  BST param_4 = (BST)0;
+  int param_5 = 0;
+  int param_6 = 0;
+  int param_7 = 0;
+  int param_8 = 0;
+  int param_9 = 0;
+  int param_10 = 0;
+  int param_11 = 0;
+  int param_12 = 0;
+  int param_13 = 0;
+  int param_14 = 0;
+  int param_15 = 0;
+  int param_16 = 0;
+  int param_17 = 0;
+  int param_18 = 0;
+  int param_19 = 0;
+  int param_20 = 0;
+  int param_21 = 0;
+  int param_22 = 0;
+  int param_23 = 0;
+  int pp = 0;
+  int looplimiter0 = 0;
+  int i = 0;
+  int param_24 = 0;
+  int count = 0;
+  int i_1 = 0;
+  int result = 0;
+  int param_25 = 0;
+  treeIndex_1 = 0;
+  const BST x_101 = tree[0];
+  param_4 = x_101;
+  param_5 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(param_4, param_5);
+  tree[0] = param_4;
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_6 = treeIndex_1;
+  param_7 = 5;
+  insert_i1_i1_(param_6, param_7);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_8 = treeIndex_1;
+  param_9 = 12;
+  insert_i1_i1_(param_8, param_9);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_10 = treeIndex_1;
+  param_11 = 15;
+  insert_i1_i1_(param_10, param_11);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_12 = treeIndex_1;
+  param_13 = 7;
+  insert_i1_i1_(param_12, param_13);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_14 = treeIndex_1;
+  param_15 = 8;
+  insert_i1_i1_(param_14, param_15);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_16 = treeIndex_1;
+  param_17 = 2;
+  insert_i1_i1_(param_16, param_17);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_18 = treeIndex_1;
+  param_19 = 6;
+  insert_i1_i1_(param_18, param_19);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_20 = treeIndex_1;
+  param_21 = 17;
+  insert_i1_i1_(param_20, param_21);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_22 = treeIndex_1;
+  param_23 = 13;
+  insert_i1_i1_(param_22, param_23);
+  pp = 0;
+  looplimiter0 = 0;
+  i = 0;
+  {
+    for(; (i < 10000); i = (i + 1)) {
+      const int x_148 = looplimiter0;
+      const float x_150 = asfloat(x_50[0].y);
+      if ((x_148 >= int(x_150))) {
+        const float x_156 = asfloat(x_50[0].y);
+        param_24 = (1 + int(x_156));
+        const int x_159 = identity_i1_(param_24);
+        pp = x_159;
+        break;
+      }
+      looplimiter0 = (looplimiter0 + 1);
+    }
+  }
+  if ((pp != 2)) {
+    return;
+  }
+  count = 0;
+  i_1 = 0;
+  {
+    for(; (i_1 < 20); i_1 = (i_1 + 1)) {
+      param_25 = i_1;
+      const int x_176 = search_i1_(param_25);
+      result = x_176;
+      switch(i_1) {
+        case 2:
+        case 5:
+        case 6:
+        case 7:
+        case 8:
+        case 9:
+        case 12:
+        case 13:
+        case 15:
+        case 17: {
+          if ((result == i_1)) {
+            count = (count + 1);
+          }
+          break;
+        }
+        default: {
+          if ((result == -1)) {
+            count = (count + 1);
+          }
+          break;
+        }
+      }
+    }
+  }
+  if ((count == 20)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.spvasm.expected.msl
new file mode 100644
index 0000000..c0e8e43
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.spvasm.expected.msl
@@ -0,0 +1,332 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct QuicksortObject {
+  tint_array_wrapper numbers;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper_1 {
+  BST arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void makeTreeNode_struct_BST_i1_i1_i11_i1_(thread BST* const node, thread int* const data) {
+  int const x_208 = *(data);
+  (*(node)).data = x_208;
+  (*(node)).leftIndex = -1;
+  (*(node)).rightIndex = -1;
+  return;
+}
+
+void insert_i1_i1_(thread int* const treeIndex, thread int* const data_1, thread tint_array_wrapper_1* const tint_symbol_4) {
+  int baseIndex = 0;
+  BST param = {};
+  int param_1 = 0;
+  BST param_2 = {};
+  int param_3 = 0;
+  baseIndex = 0;
+  while (true) {
+    int const x_217 = baseIndex;
+    int const x_218 = *(treeIndex);
+    if ((x_217 <= x_218)) {
+    } else {
+      break;
+    }
+    int const x_221 = *(data_1);
+    int const x_222 = baseIndex;
+    int const x_224 = (*(tint_symbol_4)).arr[x_222].data;
+    if ((x_221 <= x_224)) {
+      int const x_229 = baseIndex;
+      int const x_231 = (*(tint_symbol_4)).arr[x_229].leftIndex;
+      if ((x_231 == -1)) {
+        int const x_236 = baseIndex;
+        int const x_237 = *(treeIndex);
+        (*(tint_symbol_4)).arr[x_236].leftIndex = x_237;
+        int const x_239 = *(treeIndex);
+        BST const x_241 = (*(tint_symbol_4)).arr[x_239];
+        param = x_241;
+        int const x_242 = *(data_1);
+        param_1 = x_242;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param), &(param_1));
+        BST const x_244 = param;
+        (*(tint_symbol_4)).arr[x_239] = x_244;
+        return;
+      } else {
+        int const x_246 = baseIndex;
+        int const x_248 = (*(tint_symbol_4)).arr[x_246].leftIndex;
+        baseIndex = x_248;
+        continue;
+      }
+      return;
+    } else {
+      int const x_249 = baseIndex;
+      int const x_251 = (*(tint_symbol_4)).arr[x_249].rightIndex;
+      if ((x_251 == -1)) {
+        int const x_256 = baseIndex;
+        int const x_257 = *(treeIndex);
+        (*(tint_symbol_4)).arr[x_256].rightIndex = x_257;
+        int const x_259 = *(treeIndex);
+        BST const x_261 = (*(tint_symbol_4)).arr[x_259];
+        param_2 = x_261;
+        int const x_262 = *(data_1);
+        param_3 = x_262;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_2), &(param_3));
+        BST const x_264 = param_2;
+        (*(tint_symbol_4)).arr[x_259] = x_264;
+        return;
+      } else {
+        int const x_266 = baseIndex;
+        int const x_268 = (*(tint_symbol_4)).arr[x_266].rightIndex;
+        baseIndex = x_268;
+        continue;
+      }
+      return;
+    }
+    return;
+  }
+  return;
+}
+
+int identity_i1_(thread int* const a, thread QuicksortObject* const tint_symbol_5) {
+  int const x_202 = *(a);
+  int const x_203 = *(a);
+  (*(tint_symbol_5)).numbers.arr[x_202] = x_203;
+  int const x_206 = (*(tint_symbol_5)).numbers.arr[2];
+  return x_206;
+}
+
+int search_i1_(thread int* const target, thread tint_array_wrapper_1* const tint_symbol_6) {
+  int index = 0;
+  BST currentNode = {};
+  int x_270 = 0;
+  index = 0;
+  while (true) {
+    int const x_275 = index;
+    if ((x_275 != -1)) {
+    } else {
+      break;
+    }
+    int const x_278 = index;
+    BST const x_280 = (*(tint_symbol_6)).arr[x_278];
+    currentNode = x_280;
+    int const x_282 = currentNode.data;
+    int const x_283 = *(target);
+    if ((x_282 == x_283)) {
+      int const x_287 = *(target);
+      return x_287;
+    }
+    int const x_288 = *(target);
+    int const x_290 = currentNode.data;
+    if ((x_288 > x_290)) {
+      int const x_296 = currentNode.rightIndex;
+      x_270 = x_296;
+    } else {
+      int const x_298 = currentNode.leftIndex;
+      x_270 = x_298;
+    }
+    int const x_299 = x_270;
+    index = x_299;
+  }
+  return -1;
+}
+
+void main_1(constant buf0& x_50, thread tint_array_wrapper_1* const tint_symbol_7, thread QuicksortObject* const tint_symbol_8, thread float4* const tint_symbol_9) {
+  int treeIndex_1 = 0;
+  BST param_4 = {};
+  int param_5 = 0;
+  int param_6 = 0;
+  int param_7 = 0;
+  int param_8 = 0;
+  int param_9 = 0;
+  int param_10 = 0;
+  int param_11 = 0;
+  int param_12 = 0;
+  int param_13 = 0;
+  int param_14 = 0;
+  int param_15 = 0;
+  int param_16 = 0;
+  int param_17 = 0;
+  int param_18 = 0;
+  int param_19 = 0;
+  int param_20 = 0;
+  int param_21 = 0;
+  int param_22 = 0;
+  int param_23 = 0;
+  int pp = 0;
+  int looplimiter0 = 0;
+  int i = 0;
+  int param_24 = 0;
+  int count = 0;
+  int i_1 = 0;
+  int result = 0;
+  int param_25 = 0;
+  treeIndex_1 = 0;
+  BST const x_101 = (*(tint_symbol_7)).arr[0];
+  param_4 = x_101;
+  param_5 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_4), &(param_5));
+  BST const x_103 = param_4;
+  (*(tint_symbol_7)).arr[0] = x_103;
+  int const x_105 = treeIndex_1;
+  treeIndex_1 = (x_105 + 1);
+  int const x_107 = treeIndex_1;
+  param_6 = x_107;
+  param_7 = 5;
+  insert_i1_i1_(&(param_6), &(param_7), tint_symbol_7);
+  int const x_109 = treeIndex_1;
+  treeIndex_1 = (x_109 + 1);
+  int const x_111 = treeIndex_1;
+  param_8 = x_111;
+  param_9 = 12;
+  insert_i1_i1_(&(param_8), &(param_9), tint_symbol_7);
+  int const x_113 = treeIndex_1;
+  treeIndex_1 = (x_113 + 1);
+  int const x_115 = treeIndex_1;
+  param_10 = x_115;
+  param_11 = 15;
+  insert_i1_i1_(&(param_10), &(param_11), tint_symbol_7);
+  int const x_117 = treeIndex_1;
+  treeIndex_1 = (x_117 + 1);
+  int const x_119 = treeIndex_1;
+  param_12 = x_119;
+  param_13 = 7;
+  insert_i1_i1_(&(param_12), &(param_13), tint_symbol_7);
+  int const x_121 = treeIndex_1;
+  treeIndex_1 = (x_121 + 1);
+  int const x_123 = treeIndex_1;
+  param_14 = x_123;
+  param_15 = 8;
+  insert_i1_i1_(&(param_14), &(param_15), tint_symbol_7);
+  int const x_125 = treeIndex_1;
+  treeIndex_1 = (x_125 + 1);
+  int const x_127 = treeIndex_1;
+  param_16 = x_127;
+  param_17 = 2;
+  insert_i1_i1_(&(param_16), &(param_17), tint_symbol_7);
+  int const x_129 = treeIndex_1;
+  treeIndex_1 = (x_129 + 1);
+  int const x_131 = treeIndex_1;
+  param_18 = x_131;
+  param_19 = 6;
+  insert_i1_i1_(&(param_18), &(param_19), tint_symbol_7);
+  int const x_133 = treeIndex_1;
+  treeIndex_1 = (x_133 + 1);
+  int const x_135 = treeIndex_1;
+  param_20 = x_135;
+  param_21 = 17;
+  insert_i1_i1_(&(param_20), &(param_21), tint_symbol_7);
+  int const x_137 = treeIndex_1;
+  treeIndex_1 = (x_137 + 1);
+  int const x_139 = treeIndex_1;
+  param_22 = x_139;
+  param_23 = 13;
+  insert_i1_i1_(&(param_22), &(param_23), tint_symbol_7);
+  pp = 0;
+  looplimiter0 = 0;
+  i = 0;
+  while (true) {
+    int const x_145 = i;
+    if ((x_145 < 10000)) {
+    } else {
+      break;
+    }
+    int const x_148 = looplimiter0;
+    float const x_150 = x_50.injectionSwitch.y;
+    if ((x_148 >= int(x_150))) {
+      float const x_156 = x_50.injectionSwitch.y;
+      param_24 = (1 + int(x_156));
+      int const x_159 = identity_i1_(&(param_24), tint_symbol_8);
+      pp = x_159;
+      break;
+    }
+    int const x_160 = looplimiter0;
+    looplimiter0 = (x_160 + 1);
+    {
+      int const x_162 = i;
+      i = (x_162 + 1);
+    }
+  }
+  int const x_164 = pp;
+  if ((x_164 != 2)) {
+    return;
+  }
+  count = 0;
+  i_1 = 0;
+  while (true) {
+    int const x_172 = i_1;
+    if ((x_172 < 20)) {
+    } else {
+      break;
+    }
+    int const x_175 = i_1;
+    param_25 = x_175;
+    int const x_176 = search_i1_(&(param_25), tint_symbol_7);
+    result = x_176;
+    int const x_177 = i_1;
+    switch(x_177) {
+      case 2:
+      case 5:
+      case 6:
+      case 7:
+      case 8:
+      case 9:
+      case 12:
+      case 13:
+      case 15:
+      case 17: {
+        int const x_187 = result;
+        int const x_188 = i_1;
+        if ((x_187 == x_188)) {
+          int const x_192 = count;
+          count = (x_192 + 1);
+        }
+        break;
+      }
+      default: {
+        int const x_181 = result;
+        if ((x_181 == -1)) {
+          int const x_185 = count;
+          count = (x_185 + 1);
+        }
+        break;
+      }
+    }
+    {
+      int const x_194 = i_1;
+      i_1 = (x_194 + 1);
+    }
+  }
+  int const x_196 = count;
+  if ((x_196 == 20)) {
+    *(tint_symbol_9) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_9) = float4(0.0f, 0.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_50 [[buffer(0)]]) {
+  thread tint_array_wrapper_1 tint_symbol_10 = {};
+  thread QuicksortObject tint_symbol_11 = {};
+  thread float4 tint_symbol_12 = 0.0f;
+  main_1(x_50, &(tint_symbol_10), &(tint_symbol_11), &(tint_symbol_12));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_12};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..885a0ba
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.spvasm.expected.spvasm
@@ -0,0 +1,572 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 371
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %QuicksortObject "QuicksortObject"
+               OpMemberName %QuicksortObject 0 "numbers"
+               OpName %obj "obj"
+               OpName %BST "BST"
+               OpMemberName %BST 0 "data"
+               OpMemberName %BST 1 "leftIndex"
+               OpMemberName %BST 2 "rightIndex"
+               OpName %tree "tree"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_50 "x_50"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %makeTreeNode_struct_BST_i1_i1_i11_i1_ "makeTreeNode_struct_BST_i1_i1_i11_i1_"
+               OpName %node "node"
+               OpName %data "data"
+               OpName %insert_i1_i1_ "insert_i1_i1_"
+               OpName %treeIndex "treeIndex"
+               OpName %data_1 "data_1"
+               OpName %baseIndex "baseIndex"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %identity_i1_ "identity_i1_"
+               OpName %a "a"
+               OpName %search_i1_ "search_i1_"
+               OpName %target "target"
+               OpName %index "index"
+               OpName %currentNode "currentNode"
+               OpName %x_270 "x_270"
+               OpName %main_1 "main_1"
+               OpName %treeIndex_1 "treeIndex_1"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpName %param_6 "param_6"
+               OpName %param_7 "param_7"
+               OpName %param_8 "param_8"
+               OpName %param_9 "param_9"
+               OpName %param_10 "param_10"
+               OpName %param_11 "param_11"
+               OpName %param_12 "param_12"
+               OpName %param_13 "param_13"
+               OpName %param_14 "param_14"
+               OpName %param_15 "param_15"
+               OpName %param_16 "param_16"
+               OpName %param_17 "param_17"
+               OpName %param_18 "param_18"
+               OpName %param_19 "param_19"
+               OpName %param_20 "param_20"
+               OpName %param_21 "param_21"
+               OpName %param_22 "param_22"
+               OpName %param_23 "param_23"
+               OpName %pp "pp"
+               OpName %looplimiter0 "looplimiter0"
+               OpName %i "i"
+               OpName %param_24 "param_24"
+               OpName %count "count"
+               OpName %i_1 "i_1"
+               OpName %result "result"
+               OpName %param_25 "param_25"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpMemberDecorate %QuicksortObject 0 Offset 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpMemberDecorate %BST 0 Offset 0
+               OpMemberDecorate %BST 1 Offset 4
+               OpMemberDecorate %BST 2 Offset 8
+               OpDecorate %_arr_BST_uint_10 ArrayStride 12
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_50 NonWritable
+               OpDecorate %x_50 DescriptorSet 0
+               OpDecorate %x_50 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%QuicksortObject = OpTypeStruct %_arr_int_uint_10
+%_ptr_Private_QuicksortObject = OpTypePointer Private %QuicksortObject
+          %8 = OpConstantNull %QuicksortObject
+        %obj = OpVariable %_ptr_Private_QuicksortObject Private %8
+        %BST = OpTypeStruct %int %int %int
+%_arr_BST_uint_10 = OpTypeArray %BST %uint_10
+%_ptr_Private__arr_BST_uint_10 = OpTypePointer Private %_arr_BST_uint_10
+         %13 = OpConstantNull %_arr_BST_uint_10
+       %tree = OpVariable %_ptr_Private__arr_BST_uint_10 Private %13
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_50 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %22 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %22
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %22
+       %void = OpTypeVoid
+%_ptr_Function_BST = OpTypePointer Function %BST
+%_ptr_Function_int = OpTypePointer Function %int
+         %25 = OpTypeFunction %void %_ptr_Function_BST %_ptr_Function_int
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+     %int_n1 = OpConstant %int -1
+     %uint_2 = OpConstant %uint 2
+         %45 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+         %51 = OpConstantNull %int
+         %53 = OpConstantNull %BST
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+%_ptr_Private_int = OpTypePointer Private %int
+%_ptr_Private_BST = OpTypePointer Private %BST
+        %131 = OpTypeFunction %int %_ptr_Function_int
+      %int_2 = OpConstant %int 2
+        %183 = OpTypeFunction %void
+      %int_9 = OpConstant %int 9
+      %int_1 = OpConstant %int 1
+      %int_5 = OpConstant %int 5
+     %int_12 = OpConstant %int 12
+     %int_15 = OpConstant %int 15
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+      %int_6 = OpConstant %int 6
+     %int_17 = OpConstant %int 17
+     %int_13 = OpConstant %int 13
+  %int_10000 = OpConstant %int 10000
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %int_20 = OpConstant %int 20
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+        %357 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %358 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+        %359 = OpTypeFunction %void %main_out
+%makeTreeNode_struct_BST_i1_i1_i11_i1_ = OpFunction %void None %25
+       %node = OpFunctionParameter %_ptr_Function_BST
+       %data = OpFunctionParameter %_ptr_Function_int
+         %32 = OpLabel
+         %34 = OpLoad %int %data
+         %37 = OpAccessChain %_ptr_Function_int %node %uint_0
+               OpStore %37 %34
+         %40 = OpAccessChain %_ptr_Function_int %node %uint_1
+               OpStore %40 %int_n1
+         %44 = OpAccessChain %_ptr_Function_int %node %uint_2
+               OpStore %44 %int_n1
+               OpReturn
+               OpFunctionEnd
+%insert_i1_i1_ = OpFunction %void None %45
+  %treeIndex = OpFunctionParameter %_ptr_Function_int
+     %data_1 = OpFunctionParameter %_ptr_Function_int
+         %49 = OpLabel
+  %baseIndex = OpVariable %_ptr_Function_int Function %51
+      %param = OpVariable %_ptr_Function_BST Function %53
+    %param_1 = OpVariable %_ptr_Function_int Function %51
+    %param_2 = OpVariable %_ptr_Function_BST Function %53
+    %param_3 = OpVariable %_ptr_Function_int Function %51
+               OpStore %baseIndex %int_0
+               OpBranch %58
+         %58 = OpLabel
+               OpLoopMerge %59 %60 None
+               OpBranch %61
+         %61 = OpLabel
+         %62 = OpLoad %int %baseIndex
+         %64 = OpLoad %int %treeIndex
+         %65 = OpSLessThanEqual %bool %62 %64
+               OpSelectionMerge %67 None
+               OpBranchConditional %65 %68 %69
+         %68 = OpLabel
+               OpBranch %67
+         %69 = OpLabel
+               OpBranch %59
+         %67 = OpLabel
+         %71 = OpLoad %int %data_1
+         %72 = OpLoad %int %baseIndex
+         %74 = OpAccessChain %_ptr_Private_int %tree %72 %uint_0
+         %75 = OpLoad %int %74
+         %76 = OpSLessThanEqual %bool %71 %75
+               OpSelectionMerge %77 None
+               OpBranchConditional %76 %78 %79
+         %78 = OpLabel
+         %80 = OpLoad %int %baseIndex
+         %81 = OpAccessChain %_ptr_Private_int %tree %80 %uint_1
+         %82 = OpLoad %int %81
+         %83 = OpIEqual %bool %82 %int_n1
+               OpSelectionMerge %84 None
+               OpBranchConditional %83 %85 %86
+         %85 = OpLabel
+         %87 = OpLoad %int %baseIndex
+         %89 = OpLoad %int %treeIndex
+         %90 = OpAccessChain %_ptr_Private_int %tree %87 %uint_1
+               OpStore %90 %89
+         %92 = OpLoad %int %treeIndex
+         %94 = OpAccessChain %_ptr_Private_BST %tree %92
+         %95 = OpLoad %BST %94
+               OpStore %param %95
+         %97 = OpLoad %int %data_1
+               OpStore %param_1 %97
+         %98 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param %param_1
+        %101 = OpLoad %BST %param
+        %102 = OpAccessChain %_ptr_Private_BST %tree %92
+               OpStore %102 %101
+               OpReturn
+         %86 = OpLabel
+        %103 = OpLoad %int %baseIndex
+        %104 = OpAccessChain %_ptr_Private_int %tree %103 %uint_1
+        %105 = OpLoad %int %104
+               OpStore %baseIndex %105
+               OpBranch %60
+         %84 = OpLabel
+               OpReturn
+         %79 = OpLabel
+        %106 = OpLoad %int %baseIndex
+        %107 = OpAccessChain %_ptr_Private_int %tree %106 %uint_2
+        %108 = OpLoad %int %107
+        %109 = OpIEqual %bool %108 %int_n1
+               OpSelectionMerge %110 None
+               OpBranchConditional %109 %111 %112
+        %111 = OpLabel
+        %113 = OpLoad %int %baseIndex
+        %115 = OpLoad %int %treeIndex
+        %116 = OpAccessChain %_ptr_Private_int %tree %113 %uint_2
+               OpStore %116 %115
+        %118 = OpLoad %int %treeIndex
+        %119 = OpAccessChain %_ptr_Private_BST %tree %118
+        %120 = OpLoad %BST %119
+               OpStore %param_2 %120
+        %122 = OpLoad %int %data_1
+               OpStore %param_3 %122
+        %123 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param_2 %param_3
+        %126 = OpLoad %BST %param_2
+        %127 = OpAccessChain %_ptr_Private_BST %tree %118
+               OpStore %127 %126
+               OpReturn
+        %112 = OpLabel
+        %128 = OpLoad %int %baseIndex
+        %129 = OpAccessChain %_ptr_Private_int %tree %128 %uint_2
+        %130 = OpLoad %int %129
+               OpStore %baseIndex %130
+               OpBranch %60
+        %110 = OpLabel
+               OpReturn
+         %77 = OpLabel
+               OpReturn
+         %60 = OpLabel
+               OpBranch %58
+         %59 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%identity_i1_ = OpFunction %int None %131
+          %a = OpFunctionParameter %_ptr_Function_int
+        %134 = OpLabel
+        %136 = OpLoad %int %a
+        %138 = OpLoad %int %a
+        %139 = OpAccessChain %_ptr_Private_int %obj %uint_0 %136
+               OpStore %139 %138
+        %141 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_2
+        %142 = OpLoad %int %141
+               OpReturnValue %142
+               OpFunctionEnd
+ %search_i1_ = OpFunction %int None %131
+     %target = OpFunctionParameter %_ptr_Function_int
+        %145 = OpLabel
+      %index = OpVariable %_ptr_Function_int Function %51
+%currentNode = OpVariable %_ptr_Function_BST Function %53
+      %x_270 = OpVariable %_ptr_Function_int Function %51
+               OpStore %index %int_0
+               OpBranch %149
+        %149 = OpLabel
+               OpLoopMerge %150 %151 None
+               OpBranch %152
+        %152 = OpLabel
+        %153 = OpLoad %int %index
+        %154 = OpINotEqual %bool %153 %int_n1
+               OpSelectionMerge %155 None
+               OpBranchConditional %154 %156 %157
+        %156 = OpLabel
+               OpBranch %155
+        %157 = OpLabel
+               OpBranch %150
+        %155 = OpLabel
+        %158 = OpLoad %int %index
+        %159 = OpAccessChain %_ptr_Private_BST %tree %158
+        %160 = OpLoad %BST %159
+               OpStore %currentNode %160
+        %161 = OpAccessChain %_ptr_Function_int %currentNode %uint_0
+        %162 = OpLoad %int %161
+        %164 = OpLoad %int %target
+        %165 = OpIEqual %bool %162 %164
+               OpSelectionMerge %166 None
+               OpBranchConditional %165 %167 %166
+        %167 = OpLabel
+        %169 = OpLoad %int %target
+               OpReturnValue %169
+        %166 = OpLabel
+        %171 = OpLoad %int %target
+        %172 = OpAccessChain %_ptr_Function_int %currentNode %uint_0
+        %173 = OpLoad %int %172
+        %174 = OpSGreaterThan %bool %171 %173
+               OpSelectionMerge %175 None
+               OpBranchConditional %174 %176 %177
+        %176 = OpLabel
+        %178 = OpAccessChain %_ptr_Function_int %currentNode %uint_2
+        %179 = OpLoad %int %178
+               OpStore %x_270 %179
+               OpBranch %175
+        %177 = OpLabel
+        %180 = OpAccessChain %_ptr_Function_int %currentNode %uint_1
+        %181 = OpLoad %int %180
+               OpStore %x_270 %181
+               OpBranch %175
+        %175 = OpLabel
+        %182 = OpLoad %int %x_270
+               OpStore %index %182
+               OpBranch %151
+        %151 = OpLabel
+               OpBranch %149
+        %150 = OpLabel
+               OpReturnValue %int_n1
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %183
+        %185 = OpLabel
+%treeIndex_1 = OpVariable %_ptr_Function_int Function %51
+    %param_4 = OpVariable %_ptr_Function_BST Function %53
+    %param_5 = OpVariable %_ptr_Function_int Function %51
+    %param_6 = OpVariable %_ptr_Function_int Function %51
+    %param_7 = OpVariable %_ptr_Function_int Function %51
+    %param_8 = OpVariable %_ptr_Function_int Function %51
+    %param_9 = OpVariable %_ptr_Function_int Function %51
+   %param_10 = OpVariable %_ptr_Function_int Function %51
+   %param_11 = OpVariable %_ptr_Function_int Function %51
+   %param_12 = OpVariable %_ptr_Function_int Function %51
+   %param_13 = OpVariable %_ptr_Function_int Function %51
+   %param_14 = OpVariable %_ptr_Function_int Function %51
+   %param_15 = OpVariable %_ptr_Function_int Function %51
+   %param_16 = OpVariable %_ptr_Function_int Function %51
+   %param_17 = OpVariable %_ptr_Function_int Function %51
+   %param_18 = OpVariable %_ptr_Function_int Function %51
+   %param_19 = OpVariable %_ptr_Function_int Function %51
+   %param_20 = OpVariable %_ptr_Function_int Function %51
+   %param_21 = OpVariable %_ptr_Function_int Function %51
+   %param_22 = OpVariable %_ptr_Function_int Function %51
+   %param_23 = OpVariable %_ptr_Function_int Function %51
+         %pp = OpVariable %_ptr_Function_int Function %51
+%looplimiter0 = OpVariable %_ptr_Function_int Function %51
+          %i = OpVariable %_ptr_Function_int Function %51
+   %param_24 = OpVariable %_ptr_Function_int Function %51
+      %count = OpVariable %_ptr_Function_int Function %51
+        %i_1 = OpVariable %_ptr_Function_int Function %51
+     %result = OpVariable %_ptr_Function_int Function %51
+   %param_25 = OpVariable %_ptr_Function_int Function %51
+               OpStore %treeIndex_1 %int_0
+        %215 = OpAccessChain %_ptr_Private_BST %tree %int_0
+        %216 = OpLoad %BST %215
+               OpStore %param_4 %216
+               OpStore %param_5 %int_9
+        %218 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param_4 %param_5
+        %221 = OpLoad %BST %param_4
+        %222 = OpAccessChain %_ptr_Private_BST %tree %int_0
+               OpStore %222 %221
+        %223 = OpLoad %int %treeIndex_1
+        %225 = OpIAdd %int %223 %int_1
+               OpStore %treeIndex_1 %225
+        %226 = OpLoad %int %treeIndex_1
+               OpStore %param_6 %226
+               OpStore %param_7 %int_5
+        %228 = OpFunctionCall %void %insert_i1_i1_ %param_6 %param_7
+        %231 = OpLoad %int %treeIndex_1
+        %232 = OpIAdd %int %231 %int_1
+               OpStore %treeIndex_1 %232
+        %233 = OpLoad %int %treeIndex_1
+               OpStore %param_8 %233
+               OpStore %param_9 %int_12
+        %235 = OpFunctionCall %void %insert_i1_i1_ %param_8 %param_9
+        %238 = OpLoad %int %treeIndex_1
+        %239 = OpIAdd %int %238 %int_1
+               OpStore %treeIndex_1 %239
+        %240 = OpLoad %int %treeIndex_1
+               OpStore %param_10 %240
+               OpStore %param_11 %int_15
+        %242 = OpFunctionCall %void %insert_i1_i1_ %param_10 %param_11
+        %245 = OpLoad %int %treeIndex_1
+        %246 = OpIAdd %int %245 %int_1
+               OpStore %treeIndex_1 %246
+        %247 = OpLoad %int %treeIndex_1
+               OpStore %param_12 %247
+               OpStore %param_13 %int_7
+        %249 = OpFunctionCall %void %insert_i1_i1_ %param_12 %param_13
+        %252 = OpLoad %int %treeIndex_1
+        %253 = OpIAdd %int %252 %int_1
+               OpStore %treeIndex_1 %253
+        %254 = OpLoad %int %treeIndex_1
+               OpStore %param_14 %254
+               OpStore %param_15 %int_8
+        %256 = OpFunctionCall %void %insert_i1_i1_ %param_14 %param_15
+        %259 = OpLoad %int %treeIndex_1
+        %260 = OpIAdd %int %259 %int_1
+               OpStore %treeIndex_1 %260
+        %261 = OpLoad %int %treeIndex_1
+               OpStore %param_16 %261
+               OpStore %param_17 %int_2
+        %262 = OpFunctionCall %void %insert_i1_i1_ %param_16 %param_17
+        %265 = OpLoad %int %treeIndex_1
+        %266 = OpIAdd %int %265 %int_1
+               OpStore %treeIndex_1 %266
+        %267 = OpLoad %int %treeIndex_1
+               OpStore %param_18 %267
+               OpStore %param_19 %int_6
+        %269 = OpFunctionCall %void %insert_i1_i1_ %param_18 %param_19
+        %272 = OpLoad %int %treeIndex_1
+        %273 = OpIAdd %int %272 %int_1
+               OpStore %treeIndex_1 %273
+        %274 = OpLoad %int %treeIndex_1
+               OpStore %param_20 %274
+               OpStore %param_21 %int_17
+        %276 = OpFunctionCall %void %insert_i1_i1_ %param_20 %param_21
+        %279 = OpLoad %int %treeIndex_1
+        %280 = OpIAdd %int %279 %int_1
+               OpStore %treeIndex_1 %280
+        %281 = OpLoad %int %treeIndex_1
+               OpStore %param_22 %281
+               OpStore %param_23 %int_13
+        %283 = OpFunctionCall %void %insert_i1_i1_ %param_22 %param_23
+               OpStore %pp %int_0
+               OpStore %looplimiter0 %int_0
+               OpStore %i %int_0
+               OpBranch %286
+        %286 = OpLabel
+               OpLoopMerge %287 %288 None
+               OpBranch %289
+        %289 = OpLabel
+        %290 = OpLoad %int %i
+        %292 = OpSLessThan %bool %290 %int_10000
+               OpSelectionMerge %293 None
+               OpBranchConditional %292 %294 %295
+        %294 = OpLabel
+               OpBranch %293
+        %295 = OpLabel
+               OpBranch %287
+        %293 = OpLabel
+        %296 = OpLoad %int %looplimiter0
+        %298 = OpAccessChain %_ptr_Uniform_float %x_50 %uint_0 %uint_1
+        %299 = OpLoad %float %298
+        %300 = OpConvertFToS %int %299
+        %301 = OpSGreaterThanEqual %bool %296 %300
+               OpSelectionMerge %302 None
+               OpBranchConditional %301 %303 %302
+        %303 = OpLabel
+        %304 = OpAccessChain %_ptr_Uniform_float %x_50 %uint_0 %uint_1
+        %305 = OpLoad %float %304
+        %306 = OpConvertFToS %int %305
+        %307 = OpIAdd %int %int_1 %306
+               OpStore %param_24 %307
+        %308 = OpFunctionCall %int %identity_i1_ %param_24
+               OpStore %pp %308
+               OpBranch %287
+        %302 = OpLabel
+        %310 = OpLoad %int %looplimiter0
+        %311 = OpIAdd %int %310 %int_1
+               OpStore %looplimiter0 %311
+               OpBranch %288
+        %288 = OpLabel
+        %312 = OpLoad %int %i
+        %313 = OpIAdd %int %312 %int_1
+               OpStore %i %313
+               OpBranch %286
+        %287 = OpLabel
+        %314 = OpLoad %int %pp
+        %315 = OpINotEqual %bool %314 %int_2
+               OpSelectionMerge %316 None
+               OpBranchConditional %315 %317 %316
+        %317 = OpLabel
+               OpReturn
+        %316 = OpLabel
+               OpStore %count %int_0
+               OpStore %i_1 %int_0
+               OpBranch %318
+        %318 = OpLabel
+               OpLoopMerge %319 %320 None
+               OpBranch %321
+        %321 = OpLabel
+        %322 = OpLoad %int %i_1
+        %324 = OpSLessThan %bool %322 %int_20
+               OpSelectionMerge %325 None
+               OpBranchConditional %324 %326 %327
+        %326 = OpLabel
+               OpBranch %325
+        %327 = OpLabel
+               OpBranch %319
+        %325 = OpLabel
+        %328 = OpLoad %int %i_1
+               OpStore %param_25 %328
+        %329 = OpFunctionCall %int %search_i1_ %param_25
+               OpStore %result %329
+        %331 = OpLoad %int %i_1
+               OpSelectionMerge %332 None
+               OpSwitch %331 %333 2 %334 5 %334 6 %334 7 %334 8 %334 9 %334 12 %334 13 %334 15 %334 17 %334
+        %334 = OpLabel
+        %335 = OpLoad %int %result
+        %336 = OpLoad %int %i_1
+        %337 = OpIEqual %bool %335 %336
+               OpSelectionMerge %338 None
+               OpBranchConditional %337 %339 %338
+        %339 = OpLabel
+        %340 = OpLoad %int %count
+        %341 = OpIAdd %int %340 %int_1
+               OpStore %count %341
+               OpBranch %338
+        %338 = OpLabel
+               OpBranch %332
+        %333 = OpLabel
+        %342 = OpLoad %int %result
+        %343 = OpIEqual %bool %342 %int_n1
+               OpSelectionMerge %344 None
+               OpBranchConditional %343 %345 %344
+        %345 = OpLabel
+        %346 = OpLoad %int %count
+        %347 = OpIAdd %int %346 %int_1
+               OpStore %count %347
+               OpBranch %344
+        %344 = OpLabel
+               OpBranch %332
+        %332 = OpLabel
+               OpBranch %320
+        %320 = OpLabel
+        %348 = OpLoad %int %i_1
+        %349 = OpIAdd %int %348 %int_1
+               OpStore %i_1 %349
+               OpBranch %318
+        %319 = OpLabel
+        %350 = OpLoad %int %count
+        %351 = OpIEqual %bool %350 %int_20
+               OpSelectionMerge %352 None
+               OpBranchConditional %351 %353 %354
+        %353 = OpLabel
+               OpStore %x_GLF_color %357
+               OpBranch %352
+        %354 = OpLabel
+               OpStore %x_GLF_color %358
+               OpBranch %352
+        %352 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %359
+%tint_symbol = OpFunctionParameter %main_out
+        %363 = OpLabel
+        %364 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %364
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %183
+        %366 = OpLabel
+        %367 = OpFunctionCall %void %main_1
+        %369 = OpLoad %v4float %x_GLF_color
+        %370 = OpCompositeConstruct %main_out %369
+        %368 = OpFunctionCall %void %tint_symbol_2 %370
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..cd61e29
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.spvasm.expected.wgsl
@@ -0,0 +1,319 @@
+struct BST {
+  data : i32;
+  leftIndex : i32;
+  rightIndex : i32;
+};
+
+struct QuicksortObject {
+  numbers : array<i32, 10>;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> obj : QuicksortObject;
+
+var<private> tree : array<BST, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_50 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn makeTreeNode_struct_BST_i1_i1_i11_i1_(node : ptr<function, BST>, data : ptr<function, i32>) {
+  let x_208 : i32 = *(data);
+  (*(node)).data = x_208;
+  (*(node)).leftIndex = -1;
+  (*(node)).rightIndex = -1;
+  return;
+}
+
+fn insert_i1_i1_(treeIndex : ptr<function, i32>, data_1 : ptr<function, i32>) {
+  var baseIndex : i32;
+  var param : BST;
+  var param_1 : i32;
+  var param_2 : BST;
+  var param_3 : i32;
+  baseIndex = 0;
+  loop {
+    let x_217 : i32 = baseIndex;
+    let x_218 : i32 = *(treeIndex);
+    if ((x_217 <= x_218)) {
+    } else {
+      break;
+    }
+    let x_221 : i32 = *(data_1);
+    let x_222 : i32 = baseIndex;
+    let x_224 : i32 = tree[x_222].data;
+    if ((x_221 <= x_224)) {
+      let x_229 : i32 = baseIndex;
+      let x_231 : i32 = tree[x_229].leftIndex;
+      if ((x_231 == -1)) {
+        let x_236 : i32 = baseIndex;
+        let x_237 : i32 = *(treeIndex);
+        tree[x_236].leftIndex = x_237;
+        let x_239 : i32 = *(treeIndex);
+        let x_241 : BST = tree[x_239];
+        param = x_241;
+        let x_242 : i32 = *(data_1);
+        param_1 = x_242;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param), &(param_1));
+        let x_244 : BST = param;
+        tree[x_239] = x_244;
+        return;
+      } else {
+        let x_246 : i32 = baseIndex;
+        let x_248 : i32 = tree[x_246].leftIndex;
+        baseIndex = x_248;
+        continue;
+      }
+      return;
+    } else {
+      let x_249 : i32 = baseIndex;
+      let x_251 : i32 = tree[x_249].rightIndex;
+      if ((x_251 == -1)) {
+        let x_256 : i32 = baseIndex;
+        let x_257 : i32 = *(treeIndex);
+        tree[x_256].rightIndex = x_257;
+        let x_259 : i32 = *(treeIndex);
+        let x_261 : BST = tree[x_259];
+        param_2 = x_261;
+        let x_262 : i32 = *(data_1);
+        param_3 = x_262;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_2), &(param_3));
+        let x_264 : BST = param_2;
+        tree[x_259] = x_264;
+        return;
+      } else {
+        let x_266 : i32 = baseIndex;
+        let x_268 : i32 = tree[x_266].rightIndex;
+        baseIndex = x_268;
+        continue;
+      }
+      return;
+    }
+    return;
+  }
+  return;
+}
+
+fn identity_i1_(a : ptr<function, i32>) -> i32 {
+  let x_202 : i32 = *(a);
+  let x_203 : i32 = *(a);
+  obj.numbers[x_202] = x_203;
+  let x_206 : i32 = obj.numbers[2];
+  return x_206;
+}
+
+fn search_i1_(target : ptr<function, i32>) -> i32 {
+  var index : i32;
+  var currentNode : BST;
+  var x_270 : i32;
+  index = 0;
+  loop {
+    let x_275 : i32 = index;
+    if ((x_275 != -1)) {
+    } else {
+      break;
+    }
+    let x_278 : i32 = index;
+    let x_280 : BST = tree[x_278];
+    currentNode = x_280;
+    let x_282 : i32 = currentNode.data;
+    let x_283 : i32 = *(target);
+    if ((x_282 == x_283)) {
+      let x_287 : i32 = *(target);
+      return x_287;
+    }
+    let x_288 : i32 = *(target);
+    let x_290 : i32 = currentNode.data;
+    if ((x_288 > x_290)) {
+      let x_296 : i32 = currentNode.rightIndex;
+      x_270 = x_296;
+    } else {
+      let x_298 : i32 = currentNode.leftIndex;
+      x_270 = x_298;
+    }
+    let x_299 : i32 = x_270;
+    index = x_299;
+  }
+  return -1;
+}
+
+fn main_1() {
+  var treeIndex_1 : i32;
+  var param_4 : BST;
+  var param_5 : i32;
+  var param_6 : i32;
+  var param_7 : i32;
+  var param_8 : i32;
+  var param_9 : i32;
+  var param_10 : i32;
+  var param_11 : i32;
+  var param_12 : i32;
+  var param_13 : i32;
+  var param_14 : i32;
+  var param_15 : i32;
+  var param_16 : i32;
+  var param_17 : i32;
+  var param_18 : i32;
+  var param_19 : i32;
+  var param_20 : i32;
+  var param_21 : i32;
+  var param_22 : i32;
+  var param_23 : i32;
+  var pp : i32;
+  var looplimiter0 : i32;
+  var i : i32;
+  var param_24 : i32;
+  var count : i32;
+  var i_1 : i32;
+  var result : i32;
+  var param_25 : i32;
+  treeIndex_1 = 0;
+  let x_101 : BST = tree[0];
+  param_4 = x_101;
+  param_5 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_4), &(param_5));
+  let x_103 : BST = param_4;
+  tree[0] = x_103;
+  let x_105 : i32 = treeIndex_1;
+  treeIndex_1 = (x_105 + 1);
+  let x_107 : i32 = treeIndex_1;
+  param_6 = x_107;
+  param_7 = 5;
+  insert_i1_i1_(&(param_6), &(param_7));
+  let x_109 : i32 = treeIndex_1;
+  treeIndex_1 = (x_109 + 1);
+  let x_111 : i32 = treeIndex_1;
+  param_8 = x_111;
+  param_9 = 12;
+  insert_i1_i1_(&(param_8), &(param_9));
+  let x_113 : i32 = treeIndex_1;
+  treeIndex_1 = (x_113 + 1);
+  let x_115 : i32 = treeIndex_1;
+  param_10 = x_115;
+  param_11 = 15;
+  insert_i1_i1_(&(param_10), &(param_11));
+  let x_117 : i32 = treeIndex_1;
+  treeIndex_1 = (x_117 + 1);
+  let x_119 : i32 = treeIndex_1;
+  param_12 = x_119;
+  param_13 = 7;
+  insert_i1_i1_(&(param_12), &(param_13));
+  let x_121 : i32 = treeIndex_1;
+  treeIndex_1 = (x_121 + 1);
+  let x_123 : i32 = treeIndex_1;
+  param_14 = x_123;
+  param_15 = 8;
+  insert_i1_i1_(&(param_14), &(param_15));
+  let x_125 : i32 = treeIndex_1;
+  treeIndex_1 = (x_125 + 1);
+  let x_127 : i32 = treeIndex_1;
+  param_16 = x_127;
+  param_17 = 2;
+  insert_i1_i1_(&(param_16), &(param_17));
+  let x_129 : i32 = treeIndex_1;
+  treeIndex_1 = (x_129 + 1);
+  let x_131 : i32 = treeIndex_1;
+  param_18 = x_131;
+  param_19 = 6;
+  insert_i1_i1_(&(param_18), &(param_19));
+  let x_133 : i32 = treeIndex_1;
+  treeIndex_1 = (x_133 + 1);
+  let x_135 : i32 = treeIndex_1;
+  param_20 = x_135;
+  param_21 = 17;
+  insert_i1_i1_(&(param_20), &(param_21));
+  let x_137 : i32 = treeIndex_1;
+  treeIndex_1 = (x_137 + 1);
+  let x_139 : i32 = treeIndex_1;
+  param_22 = x_139;
+  param_23 = 13;
+  insert_i1_i1_(&(param_22), &(param_23));
+  pp = 0;
+  looplimiter0 = 0;
+  i = 0;
+  loop {
+    let x_145 : i32 = i;
+    if ((x_145 < 10000)) {
+    } else {
+      break;
+    }
+    let x_148 : i32 = looplimiter0;
+    let x_150 : f32 = x_50.injectionSwitch.y;
+    if ((x_148 >= i32(x_150))) {
+      let x_156 : f32 = x_50.injectionSwitch.y;
+      param_24 = (1 + i32(x_156));
+      let x_159 : i32 = identity_i1_(&(param_24));
+      pp = x_159;
+      break;
+    }
+    let x_160 : i32 = looplimiter0;
+    looplimiter0 = (x_160 + 1);
+
+    continuing {
+      let x_162 : i32 = i;
+      i = (x_162 + 1);
+    }
+  }
+  let x_164 : i32 = pp;
+  if ((x_164 != 2)) {
+    return;
+  }
+  count = 0;
+  i_1 = 0;
+  loop {
+    let x_172 : i32 = i_1;
+    if ((x_172 < 20)) {
+    } else {
+      break;
+    }
+    let x_175 : i32 = i_1;
+    param_25 = x_175;
+    let x_176 : i32 = search_i1_(&(param_25));
+    result = x_176;
+    let x_177 : i32 = i_1;
+    switch(x_177) {
+      case 2, 5, 6, 7, 8, 9, 12, 13, 15, 17: {
+        let x_187 : i32 = result;
+        let x_188 : i32 = i_1;
+        if ((x_187 == x_188)) {
+          let x_192 : i32 = count;
+          count = (x_192 + 1);
+        }
+      }
+      default: {
+        let x_181 : i32 = result;
+        if ((x_181 == -1)) {
+          let x_185 : i32 = count;
+          count = (x_185 + 1);
+        }
+      }
+    }
+
+    continuing {
+      let x_194 : i32 = i_1;
+      i_1 = (x_194 + 1);
+    }
+  }
+  let x_196 : i32 = count;
+  if ((x_196 == 20)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.wgsl
new file mode 100644
index 0000000..cd61e29
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.wgsl
@@ -0,0 +1,319 @@
+struct BST {
+  data : i32;
+  leftIndex : i32;
+  rightIndex : i32;
+};
+
+struct QuicksortObject {
+  numbers : array<i32, 10>;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> obj : QuicksortObject;
+
+var<private> tree : array<BST, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_50 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn makeTreeNode_struct_BST_i1_i1_i11_i1_(node : ptr<function, BST>, data : ptr<function, i32>) {
+  let x_208 : i32 = *(data);
+  (*(node)).data = x_208;
+  (*(node)).leftIndex = -1;
+  (*(node)).rightIndex = -1;
+  return;
+}
+
+fn insert_i1_i1_(treeIndex : ptr<function, i32>, data_1 : ptr<function, i32>) {
+  var baseIndex : i32;
+  var param : BST;
+  var param_1 : i32;
+  var param_2 : BST;
+  var param_3 : i32;
+  baseIndex = 0;
+  loop {
+    let x_217 : i32 = baseIndex;
+    let x_218 : i32 = *(treeIndex);
+    if ((x_217 <= x_218)) {
+    } else {
+      break;
+    }
+    let x_221 : i32 = *(data_1);
+    let x_222 : i32 = baseIndex;
+    let x_224 : i32 = tree[x_222].data;
+    if ((x_221 <= x_224)) {
+      let x_229 : i32 = baseIndex;
+      let x_231 : i32 = tree[x_229].leftIndex;
+      if ((x_231 == -1)) {
+        let x_236 : i32 = baseIndex;
+        let x_237 : i32 = *(treeIndex);
+        tree[x_236].leftIndex = x_237;
+        let x_239 : i32 = *(treeIndex);
+        let x_241 : BST = tree[x_239];
+        param = x_241;
+        let x_242 : i32 = *(data_1);
+        param_1 = x_242;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param), &(param_1));
+        let x_244 : BST = param;
+        tree[x_239] = x_244;
+        return;
+      } else {
+        let x_246 : i32 = baseIndex;
+        let x_248 : i32 = tree[x_246].leftIndex;
+        baseIndex = x_248;
+        continue;
+      }
+      return;
+    } else {
+      let x_249 : i32 = baseIndex;
+      let x_251 : i32 = tree[x_249].rightIndex;
+      if ((x_251 == -1)) {
+        let x_256 : i32 = baseIndex;
+        let x_257 : i32 = *(treeIndex);
+        tree[x_256].rightIndex = x_257;
+        let x_259 : i32 = *(treeIndex);
+        let x_261 : BST = tree[x_259];
+        param_2 = x_261;
+        let x_262 : i32 = *(data_1);
+        param_3 = x_262;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_2), &(param_3));
+        let x_264 : BST = param_2;
+        tree[x_259] = x_264;
+        return;
+      } else {
+        let x_266 : i32 = baseIndex;
+        let x_268 : i32 = tree[x_266].rightIndex;
+        baseIndex = x_268;
+        continue;
+      }
+      return;
+    }
+    return;
+  }
+  return;
+}
+
+fn identity_i1_(a : ptr<function, i32>) -> i32 {
+  let x_202 : i32 = *(a);
+  let x_203 : i32 = *(a);
+  obj.numbers[x_202] = x_203;
+  let x_206 : i32 = obj.numbers[2];
+  return x_206;
+}
+
+fn search_i1_(target : ptr<function, i32>) -> i32 {
+  var index : i32;
+  var currentNode : BST;
+  var x_270 : i32;
+  index = 0;
+  loop {
+    let x_275 : i32 = index;
+    if ((x_275 != -1)) {
+    } else {
+      break;
+    }
+    let x_278 : i32 = index;
+    let x_280 : BST = tree[x_278];
+    currentNode = x_280;
+    let x_282 : i32 = currentNode.data;
+    let x_283 : i32 = *(target);
+    if ((x_282 == x_283)) {
+      let x_287 : i32 = *(target);
+      return x_287;
+    }
+    let x_288 : i32 = *(target);
+    let x_290 : i32 = currentNode.data;
+    if ((x_288 > x_290)) {
+      let x_296 : i32 = currentNode.rightIndex;
+      x_270 = x_296;
+    } else {
+      let x_298 : i32 = currentNode.leftIndex;
+      x_270 = x_298;
+    }
+    let x_299 : i32 = x_270;
+    index = x_299;
+  }
+  return -1;
+}
+
+fn main_1() {
+  var treeIndex_1 : i32;
+  var param_4 : BST;
+  var param_5 : i32;
+  var param_6 : i32;
+  var param_7 : i32;
+  var param_8 : i32;
+  var param_9 : i32;
+  var param_10 : i32;
+  var param_11 : i32;
+  var param_12 : i32;
+  var param_13 : i32;
+  var param_14 : i32;
+  var param_15 : i32;
+  var param_16 : i32;
+  var param_17 : i32;
+  var param_18 : i32;
+  var param_19 : i32;
+  var param_20 : i32;
+  var param_21 : i32;
+  var param_22 : i32;
+  var param_23 : i32;
+  var pp : i32;
+  var looplimiter0 : i32;
+  var i : i32;
+  var param_24 : i32;
+  var count : i32;
+  var i_1 : i32;
+  var result : i32;
+  var param_25 : i32;
+  treeIndex_1 = 0;
+  let x_101 : BST = tree[0];
+  param_4 = x_101;
+  param_5 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_4), &(param_5));
+  let x_103 : BST = param_4;
+  tree[0] = x_103;
+  let x_105 : i32 = treeIndex_1;
+  treeIndex_1 = (x_105 + 1);
+  let x_107 : i32 = treeIndex_1;
+  param_6 = x_107;
+  param_7 = 5;
+  insert_i1_i1_(&(param_6), &(param_7));
+  let x_109 : i32 = treeIndex_1;
+  treeIndex_1 = (x_109 + 1);
+  let x_111 : i32 = treeIndex_1;
+  param_8 = x_111;
+  param_9 = 12;
+  insert_i1_i1_(&(param_8), &(param_9));
+  let x_113 : i32 = treeIndex_1;
+  treeIndex_1 = (x_113 + 1);
+  let x_115 : i32 = treeIndex_1;
+  param_10 = x_115;
+  param_11 = 15;
+  insert_i1_i1_(&(param_10), &(param_11));
+  let x_117 : i32 = treeIndex_1;
+  treeIndex_1 = (x_117 + 1);
+  let x_119 : i32 = treeIndex_1;
+  param_12 = x_119;
+  param_13 = 7;
+  insert_i1_i1_(&(param_12), &(param_13));
+  let x_121 : i32 = treeIndex_1;
+  treeIndex_1 = (x_121 + 1);
+  let x_123 : i32 = treeIndex_1;
+  param_14 = x_123;
+  param_15 = 8;
+  insert_i1_i1_(&(param_14), &(param_15));
+  let x_125 : i32 = treeIndex_1;
+  treeIndex_1 = (x_125 + 1);
+  let x_127 : i32 = treeIndex_1;
+  param_16 = x_127;
+  param_17 = 2;
+  insert_i1_i1_(&(param_16), &(param_17));
+  let x_129 : i32 = treeIndex_1;
+  treeIndex_1 = (x_129 + 1);
+  let x_131 : i32 = treeIndex_1;
+  param_18 = x_131;
+  param_19 = 6;
+  insert_i1_i1_(&(param_18), &(param_19));
+  let x_133 : i32 = treeIndex_1;
+  treeIndex_1 = (x_133 + 1);
+  let x_135 : i32 = treeIndex_1;
+  param_20 = x_135;
+  param_21 = 17;
+  insert_i1_i1_(&(param_20), &(param_21));
+  let x_137 : i32 = treeIndex_1;
+  treeIndex_1 = (x_137 + 1);
+  let x_139 : i32 = treeIndex_1;
+  param_22 = x_139;
+  param_23 = 13;
+  insert_i1_i1_(&(param_22), &(param_23));
+  pp = 0;
+  looplimiter0 = 0;
+  i = 0;
+  loop {
+    let x_145 : i32 = i;
+    if ((x_145 < 10000)) {
+    } else {
+      break;
+    }
+    let x_148 : i32 = looplimiter0;
+    let x_150 : f32 = x_50.injectionSwitch.y;
+    if ((x_148 >= i32(x_150))) {
+      let x_156 : f32 = x_50.injectionSwitch.y;
+      param_24 = (1 + i32(x_156));
+      let x_159 : i32 = identity_i1_(&(param_24));
+      pp = x_159;
+      break;
+    }
+    let x_160 : i32 = looplimiter0;
+    looplimiter0 = (x_160 + 1);
+
+    continuing {
+      let x_162 : i32 = i;
+      i = (x_162 + 1);
+    }
+  }
+  let x_164 : i32 = pp;
+  if ((x_164 != 2)) {
+    return;
+  }
+  count = 0;
+  i_1 = 0;
+  loop {
+    let x_172 : i32 = i_1;
+    if ((x_172 < 20)) {
+    } else {
+      break;
+    }
+    let x_175 : i32 = i_1;
+    param_25 = x_175;
+    let x_176 : i32 = search_i1_(&(param_25));
+    result = x_176;
+    let x_177 : i32 = i_1;
+    switch(x_177) {
+      case 2, 5, 6, 7, 8, 9, 12, 13, 15, 17: {
+        let x_187 : i32 = result;
+        let x_188 : i32 = i_1;
+        if ((x_187 == x_188)) {
+          let x_192 : i32 = count;
+          count = (x_192 + 1);
+        }
+      }
+      default: {
+        let x_181 : i32 = result;
+        if ((x_181 == -1)) {
+          let x_185 : i32 = count;
+          count = (x_185 + 1);
+        }
+      }
+    }
+
+    continuing {
+      let x_194 : i32 = i_1;
+      i_1 = (x_194 + 1);
+    }
+  }
+  let x_196 : i32 = count;
+  if ((x_196 == 20)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
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
new file mode 100644
index 0000000..ece942a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.wgsl.expected.hlsl
@@ -0,0 +1,271 @@
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+struct QuicksortObject {
+  int numbers[10];
+};
+
+static QuicksortObject obj = (QuicksortObject)0;
+static BST tree[10] = (BST[10])0;
+cbuffer cbuffer_x_50 : register(b0, space0) {
+  uint4 x_50[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void makeTreeNode_struct_BST_i1_i1_i11_i1_(inout BST node, inout int data) {
+  const int x_208 = data;
+  node.data = x_208;
+  node.leftIndex = -1;
+  node.rightIndex = -1;
+  return;
+}
+
+void insert_i1_i1_(inout int treeIndex, inout int data_1) {
+  int baseIndex = 0;
+  BST param = (BST)0;
+  int param_1 = 0;
+  BST param_2 = (BST)0;
+  int param_3 = 0;
+  baseIndex = 0;
+  while (true) {
+    const int x_217 = baseIndex;
+    const int x_218 = treeIndex;
+    if ((x_217 <= x_218)) {
+    } else {
+      break;
+    }
+    const int x_221 = data_1;
+    const int x_224 = tree[baseIndex].data;
+    if ((x_221 <= x_224)) {
+      const int x_231 = tree[baseIndex].leftIndex;
+      if ((x_231 == -1)) {
+        const int x_236 = baseIndex;
+        const int x_237 = treeIndex;
+        tree[x_236].leftIndex = x_237;
+        const int x_239 = treeIndex;
+        const BST x_241 = tree[x_239];
+        param = x_241;
+        const int x_242 = data_1;
+        param_1 = x_242;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(param, param_1);
+        tree[x_239] = param;
+        return;
+      } else {
+        const int x_248 = tree[baseIndex].leftIndex;
+        baseIndex = x_248;
+        continue;
+      }
+      return;
+    } else {
+      const int x_251 = tree[baseIndex].rightIndex;
+      if ((x_251 == -1)) {
+        const int x_256 = baseIndex;
+        const int x_257 = treeIndex;
+        tree[x_256].rightIndex = x_257;
+        const int x_259 = treeIndex;
+        const BST x_261 = tree[x_259];
+        param_2 = x_261;
+        const int x_262 = data_1;
+        param_3 = x_262;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(param_2, param_3);
+        tree[x_259] = param_2;
+        return;
+      } else {
+        const int x_268 = tree[baseIndex].rightIndex;
+        baseIndex = x_268;
+        continue;
+      }
+      return;
+    }
+    return;
+  }
+  return;
+}
+
+int identity_i1_(inout int a) {
+  const int x_202 = a;
+  const int x_203 = a;
+  obj.numbers[x_202] = x_203;
+  const int x_206 = obj.numbers[2];
+  return x_206;
+}
+
+int search_i1_(inout int target) {
+  int index = 0;
+  BST currentNode = (BST)0;
+  int x_270 = 0;
+  index = 0;
+  while (true) {
+    if ((index != -1)) {
+    } else {
+      break;
+    }
+    const BST x_280 = tree[index];
+    currentNode = x_280;
+    const int x_282 = currentNode.data;
+    const int x_283 = target;
+    if ((x_282 == x_283)) {
+      const int x_287 = target;
+      return x_287;
+    }
+    const int x_288 = target;
+    const int x_290 = currentNode.data;
+    if ((x_288 > x_290)) {
+      const int x_296 = currentNode.rightIndex;
+      x_270 = x_296;
+    } else {
+      const int x_298 = currentNode.leftIndex;
+      x_270 = x_298;
+    }
+    index = x_270;
+  }
+  return -1;
+}
+
+void main_1() {
+  int treeIndex_1 = 0;
+  BST param_4 = (BST)0;
+  int param_5 = 0;
+  int param_6 = 0;
+  int param_7 = 0;
+  int param_8 = 0;
+  int param_9 = 0;
+  int param_10 = 0;
+  int param_11 = 0;
+  int param_12 = 0;
+  int param_13 = 0;
+  int param_14 = 0;
+  int param_15 = 0;
+  int param_16 = 0;
+  int param_17 = 0;
+  int param_18 = 0;
+  int param_19 = 0;
+  int param_20 = 0;
+  int param_21 = 0;
+  int param_22 = 0;
+  int param_23 = 0;
+  int pp = 0;
+  int looplimiter0 = 0;
+  int i = 0;
+  int param_24 = 0;
+  int count = 0;
+  int i_1 = 0;
+  int result = 0;
+  int param_25 = 0;
+  treeIndex_1 = 0;
+  const BST x_101 = tree[0];
+  param_4 = x_101;
+  param_5 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(param_4, param_5);
+  tree[0] = param_4;
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_6 = treeIndex_1;
+  param_7 = 5;
+  insert_i1_i1_(param_6, param_7);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_8 = treeIndex_1;
+  param_9 = 12;
+  insert_i1_i1_(param_8, param_9);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_10 = treeIndex_1;
+  param_11 = 15;
+  insert_i1_i1_(param_10, param_11);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_12 = treeIndex_1;
+  param_13 = 7;
+  insert_i1_i1_(param_12, param_13);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_14 = treeIndex_1;
+  param_15 = 8;
+  insert_i1_i1_(param_14, param_15);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_16 = treeIndex_1;
+  param_17 = 2;
+  insert_i1_i1_(param_16, param_17);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_18 = treeIndex_1;
+  param_19 = 6;
+  insert_i1_i1_(param_18, param_19);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_20 = treeIndex_1;
+  param_21 = 17;
+  insert_i1_i1_(param_20, param_21);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_22 = treeIndex_1;
+  param_23 = 13;
+  insert_i1_i1_(param_22, param_23);
+  pp = 0;
+  looplimiter0 = 0;
+  i = 0;
+  {
+    for(; (i < 10000); i = (i + 1)) {
+      const int x_148 = looplimiter0;
+      const float x_150 = asfloat(x_50[0].y);
+      if ((x_148 >= int(x_150))) {
+        const float x_156 = asfloat(x_50[0].y);
+        param_24 = (1 + int(x_156));
+        const int x_159 = identity_i1_(param_24);
+        pp = x_159;
+        break;
+      }
+      looplimiter0 = (looplimiter0 + 1);
+    }
+  }
+  if ((pp != 2)) {
+    return;
+  }
+  count = 0;
+  i_1 = 0;
+  {
+    for(; (i_1 < 20); i_1 = (i_1 + 1)) {
+      param_25 = i_1;
+      const int x_176 = search_i1_(param_25);
+      result = x_176;
+      switch(i_1) {
+        case 2:
+        case 5:
+        case 6:
+        case 7:
+        case 8:
+        case 9:
+        case 12:
+        case 13:
+        case 15:
+        case 17: {
+          if ((result == i_1)) {
+            count = (count + 1);
+          }
+          break;
+        }
+        default: {
+          if ((result == -1)) {
+            count = (count + 1);
+          }
+          break;
+        }
+      }
+    }
+  }
+  if ((count == 20)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.wgsl.expected.msl
new file mode 100644
index 0000000..c0e8e43
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.wgsl.expected.msl
@@ -0,0 +1,332 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct QuicksortObject {
+  tint_array_wrapper numbers;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper_1 {
+  BST arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void makeTreeNode_struct_BST_i1_i1_i11_i1_(thread BST* const node, thread int* const data) {
+  int const x_208 = *(data);
+  (*(node)).data = x_208;
+  (*(node)).leftIndex = -1;
+  (*(node)).rightIndex = -1;
+  return;
+}
+
+void insert_i1_i1_(thread int* const treeIndex, thread int* const data_1, thread tint_array_wrapper_1* const tint_symbol_4) {
+  int baseIndex = 0;
+  BST param = {};
+  int param_1 = 0;
+  BST param_2 = {};
+  int param_3 = 0;
+  baseIndex = 0;
+  while (true) {
+    int const x_217 = baseIndex;
+    int const x_218 = *(treeIndex);
+    if ((x_217 <= x_218)) {
+    } else {
+      break;
+    }
+    int const x_221 = *(data_1);
+    int const x_222 = baseIndex;
+    int const x_224 = (*(tint_symbol_4)).arr[x_222].data;
+    if ((x_221 <= x_224)) {
+      int const x_229 = baseIndex;
+      int const x_231 = (*(tint_symbol_4)).arr[x_229].leftIndex;
+      if ((x_231 == -1)) {
+        int const x_236 = baseIndex;
+        int const x_237 = *(treeIndex);
+        (*(tint_symbol_4)).arr[x_236].leftIndex = x_237;
+        int const x_239 = *(treeIndex);
+        BST const x_241 = (*(tint_symbol_4)).arr[x_239];
+        param = x_241;
+        int const x_242 = *(data_1);
+        param_1 = x_242;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param), &(param_1));
+        BST const x_244 = param;
+        (*(tint_symbol_4)).arr[x_239] = x_244;
+        return;
+      } else {
+        int const x_246 = baseIndex;
+        int const x_248 = (*(tint_symbol_4)).arr[x_246].leftIndex;
+        baseIndex = x_248;
+        continue;
+      }
+      return;
+    } else {
+      int const x_249 = baseIndex;
+      int const x_251 = (*(tint_symbol_4)).arr[x_249].rightIndex;
+      if ((x_251 == -1)) {
+        int const x_256 = baseIndex;
+        int const x_257 = *(treeIndex);
+        (*(tint_symbol_4)).arr[x_256].rightIndex = x_257;
+        int const x_259 = *(treeIndex);
+        BST const x_261 = (*(tint_symbol_4)).arr[x_259];
+        param_2 = x_261;
+        int const x_262 = *(data_1);
+        param_3 = x_262;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_2), &(param_3));
+        BST const x_264 = param_2;
+        (*(tint_symbol_4)).arr[x_259] = x_264;
+        return;
+      } else {
+        int const x_266 = baseIndex;
+        int const x_268 = (*(tint_symbol_4)).arr[x_266].rightIndex;
+        baseIndex = x_268;
+        continue;
+      }
+      return;
+    }
+    return;
+  }
+  return;
+}
+
+int identity_i1_(thread int* const a, thread QuicksortObject* const tint_symbol_5) {
+  int const x_202 = *(a);
+  int const x_203 = *(a);
+  (*(tint_symbol_5)).numbers.arr[x_202] = x_203;
+  int const x_206 = (*(tint_symbol_5)).numbers.arr[2];
+  return x_206;
+}
+
+int search_i1_(thread int* const target, thread tint_array_wrapper_1* const tint_symbol_6) {
+  int index = 0;
+  BST currentNode = {};
+  int x_270 = 0;
+  index = 0;
+  while (true) {
+    int const x_275 = index;
+    if ((x_275 != -1)) {
+    } else {
+      break;
+    }
+    int const x_278 = index;
+    BST const x_280 = (*(tint_symbol_6)).arr[x_278];
+    currentNode = x_280;
+    int const x_282 = currentNode.data;
+    int const x_283 = *(target);
+    if ((x_282 == x_283)) {
+      int const x_287 = *(target);
+      return x_287;
+    }
+    int const x_288 = *(target);
+    int const x_290 = currentNode.data;
+    if ((x_288 > x_290)) {
+      int const x_296 = currentNode.rightIndex;
+      x_270 = x_296;
+    } else {
+      int const x_298 = currentNode.leftIndex;
+      x_270 = x_298;
+    }
+    int const x_299 = x_270;
+    index = x_299;
+  }
+  return -1;
+}
+
+void main_1(constant buf0& x_50, thread tint_array_wrapper_1* const tint_symbol_7, thread QuicksortObject* const tint_symbol_8, thread float4* const tint_symbol_9) {
+  int treeIndex_1 = 0;
+  BST param_4 = {};
+  int param_5 = 0;
+  int param_6 = 0;
+  int param_7 = 0;
+  int param_8 = 0;
+  int param_9 = 0;
+  int param_10 = 0;
+  int param_11 = 0;
+  int param_12 = 0;
+  int param_13 = 0;
+  int param_14 = 0;
+  int param_15 = 0;
+  int param_16 = 0;
+  int param_17 = 0;
+  int param_18 = 0;
+  int param_19 = 0;
+  int param_20 = 0;
+  int param_21 = 0;
+  int param_22 = 0;
+  int param_23 = 0;
+  int pp = 0;
+  int looplimiter0 = 0;
+  int i = 0;
+  int param_24 = 0;
+  int count = 0;
+  int i_1 = 0;
+  int result = 0;
+  int param_25 = 0;
+  treeIndex_1 = 0;
+  BST const x_101 = (*(tint_symbol_7)).arr[0];
+  param_4 = x_101;
+  param_5 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_4), &(param_5));
+  BST const x_103 = param_4;
+  (*(tint_symbol_7)).arr[0] = x_103;
+  int const x_105 = treeIndex_1;
+  treeIndex_1 = (x_105 + 1);
+  int const x_107 = treeIndex_1;
+  param_6 = x_107;
+  param_7 = 5;
+  insert_i1_i1_(&(param_6), &(param_7), tint_symbol_7);
+  int const x_109 = treeIndex_1;
+  treeIndex_1 = (x_109 + 1);
+  int const x_111 = treeIndex_1;
+  param_8 = x_111;
+  param_9 = 12;
+  insert_i1_i1_(&(param_8), &(param_9), tint_symbol_7);
+  int const x_113 = treeIndex_1;
+  treeIndex_1 = (x_113 + 1);
+  int const x_115 = treeIndex_1;
+  param_10 = x_115;
+  param_11 = 15;
+  insert_i1_i1_(&(param_10), &(param_11), tint_symbol_7);
+  int const x_117 = treeIndex_1;
+  treeIndex_1 = (x_117 + 1);
+  int const x_119 = treeIndex_1;
+  param_12 = x_119;
+  param_13 = 7;
+  insert_i1_i1_(&(param_12), &(param_13), tint_symbol_7);
+  int const x_121 = treeIndex_1;
+  treeIndex_1 = (x_121 + 1);
+  int const x_123 = treeIndex_1;
+  param_14 = x_123;
+  param_15 = 8;
+  insert_i1_i1_(&(param_14), &(param_15), tint_symbol_7);
+  int const x_125 = treeIndex_1;
+  treeIndex_1 = (x_125 + 1);
+  int const x_127 = treeIndex_1;
+  param_16 = x_127;
+  param_17 = 2;
+  insert_i1_i1_(&(param_16), &(param_17), tint_symbol_7);
+  int const x_129 = treeIndex_1;
+  treeIndex_1 = (x_129 + 1);
+  int const x_131 = treeIndex_1;
+  param_18 = x_131;
+  param_19 = 6;
+  insert_i1_i1_(&(param_18), &(param_19), tint_symbol_7);
+  int const x_133 = treeIndex_1;
+  treeIndex_1 = (x_133 + 1);
+  int const x_135 = treeIndex_1;
+  param_20 = x_135;
+  param_21 = 17;
+  insert_i1_i1_(&(param_20), &(param_21), tint_symbol_7);
+  int const x_137 = treeIndex_1;
+  treeIndex_1 = (x_137 + 1);
+  int const x_139 = treeIndex_1;
+  param_22 = x_139;
+  param_23 = 13;
+  insert_i1_i1_(&(param_22), &(param_23), tint_symbol_7);
+  pp = 0;
+  looplimiter0 = 0;
+  i = 0;
+  while (true) {
+    int const x_145 = i;
+    if ((x_145 < 10000)) {
+    } else {
+      break;
+    }
+    int const x_148 = looplimiter0;
+    float const x_150 = x_50.injectionSwitch.y;
+    if ((x_148 >= int(x_150))) {
+      float const x_156 = x_50.injectionSwitch.y;
+      param_24 = (1 + int(x_156));
+      int const x_159 = identity_i1_(&(param_24), tint_symbol_8);
+      pp = x_159;
+      break;
+    }
+    int const x_160 = looplimiter0;
+    looplimiter0 = (x_160 + 1);
+    {
+      int const x_162 = i;
+      i = (x_162 + 1);
+    }
+  }
+  int const x_164 = pp;
+  if ((x_164 != 2)) {
+    return;
+  }
+  count = 0;
+  i_1 = 0;
+  while (true) {
+    int const x_172 = i_1;
+    if ((x_172 < 20)) {
+    } else {
+      break;
+    }
+    int const x_175 = i_1;
+    param_25 = x_175;
+    int const x_176 = search_i1_(&(param_25), tint_symbol_7);
+    result = x_176;
+    int const x_177 = i_1;
+    switch(x_177) {
+      case 2:
+      case 5:
+      case 6:
+      case 7:
+      case 8:
+      case 9:
+      case 12:
+      case 13:
+      case 15:
+      case 17: {
+        int const x_187 = result;
+        int const x_188 = i_1;
+        if ((x_187 == x_188)) {
+          int const x_192 = count;
+          count = (x_192 + 1);
+        }
+        break;
+      }
+      default: {
+        int const x_181 = result;
+        if ((x_181 == -1)) {
+          int const x_185 = count;
+          count = (x_185 + 1);
+        }
+        break;
+      }
+    }
+    {
+      int const x_194 = i_1;
+      i_1 = (x_194 + 1);
+    }
+  }
+  int const x_196 = count;
+  if ((x_196 == 20)) {
+    *(tint_symbol_9) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_9) = float4(0.0f, 0.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_50 [[buffer(0)]]) {
+  thread tint_array_wrapper_1 tint_symbol_10 = {};
+  thread QuicksortObject tint_symbol_11 = {};
+  thread float4 tint_symbol_12 = 0.0f;
+  main_1(x_50, &(tint_symbol_10), &(tint_symbol_11), &(tint_symbol_12));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_12};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..885a0ba
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.wgsl.expected.spvasm
@@ -0,0 +1,572 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 371
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %QuicksortObject "QuicksortObject"
+               OpMemberName %QuicksortObject 0 "numbers"
+               OpName %obj "obj"
+               OpName %BST "BST"
+               OpMemberName %BST 0 "data"
+               OpMemberName %BST 1 "leftIndex"
+               OpMemberName %BST 2 "rightIndex"
+               OpName %tree "tree"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_50 "x_50"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %makeTreeNode_struct_BST_i1_i1_i11_i1_ "makeTreeNode_struct_BST_i1_i1_i11_i1_"
+               OpName %node "node"
+               OpName %data "data"
+               OpName %insert_i1_i1_ "insert_i1_i1_"
+               OpName %treeIndex "treeIndex"
+               OpName %data_1 "data_1"
+               OpName %baseIndex "baseIndex"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %identity_i1_ "identity_i1_"
+               OpName %a "a"
+               OpName %search_i1_ "search_i1_"
+               OpName %target "target"
+               OpName %index "index"
+               OpName %currentNode "currentNode"
+               OpName %x_270 "x_270"
+               OpName %main_1 "main_1"
+               OpName %treeIndex_1 "treeIndex_1"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpName %param_6 "param_6"
+               OpName %param_7 "param_7"
+               OpName %param_8 "param_8"
+               OpName %param_9 "param_9"
+               OpName %param_10 "param_10"
+               OpName %param_11 "param_11"
+               OpName %param_12 "param_12"
+               OpName %param_13 "param_13"
+               OpName %param_14 "param_14"
+               OpName %param_15 "param_15"
+               OpName %param_16 "param_16"
+               OpName %param_17 "param_17"
+               OpName %param_18 "param_18"
+               OpName %param_19 "param_19"
+               OpName %param_20 "param_20"
+               OpName %param_21 "param_21"
+               OpName %param_22 "param_22"
+               OpName %param_23 "param_23"
+               OpName %pp "pp"
+               OpName %looplimiter0 "looplimiter0"
+               OpName %i "i"
+               OpName %param_24 "param_24"
+               OpName %count "count"
+               OpName %i_1 "i_1"
+               OpName %result "result"
+               OpName %param_25 "param_25"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpMemberDecorate %QuicksortObject 0 Offset 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpMemberDecorate %BST 0 Offset 0
+               OpMemberDecorate %BST 1 Offset 4
+               OpMemberDecorate %BST 2 Offset 8
+               OpDecorate %_arr_BST_uint_10 ArrayStride 12
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_50 NonWritable
+               OpDecorate %x_50 DescriptorSet 0
+               OpDecorate %x_50 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%QuicksortObject = OpTypeStruct %_arr_int_uint_10
+%_ptr_Private_QuicksortObject = OpTypePointer Private %QuicksortObject
+          %8 = OpConstantNull %QuicksortObject
+        %obj = OpVariable %_ptr_Private_QuicksortObject Private %8
+        %BST = OpTypeStruct %int %int %int
+%_arr_BST_uint_10 = OpTypeArray %BST %uint_10
+%_ptr_Private__arr_BST_uint_10 = OpTypePointer Private %_arr_BST_uint_10
+         %13 = OpConstantNull %_arr_BST_uint_10
+       %tree = OpVariable %_ptr_Private__arr_BST_uint_10 Private %13
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_50 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %22 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %22
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %22
+       %void = OpTypeVoid
+%_ptr_Function_BST = OpTypePointer Function %BST
+%_ptr_Function_int = OpTypePointer Function %int
+         %25 = OpTypeFunction %void %_ptr_Function_BST %_ptr_Function_int
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+     %int_n1 = OpConstant %int -1
+     %uint_2 = OpConstant %uint 2
+         %45 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+         %51 = OpConstantNull %int
+         %53 = OpConstantNull %BST
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+%_ptr_Private_int = OpTypePointer Private %int
+%_ptr_Private_BST = OpTypePointer Private %BST
+        %131 = OpTypeFunction %int %_ptr_Function_int
+      %int_2 = OpConstant %int 2
+        %183 = OpTypeFunction %void
+      %int_9 = OpConstant %int 9
+      %int_1 = OpConstant %int 1
+      %int_5 = OpConstant %int 5
+     %int_12 = OpConstant %int 12
+     %int_15 = OpConstant %int 15
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+      %int_6 = OpConstant %int 6
+     %int_17 = OpConstant %int 17
+     %int_13 = OpConstant %int 13
+  %int_10000 = OpConstant %int 10000
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %int_20 = OpConstant %int 20
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+        %357 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %358 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+        %359 = OpTypeFunction %void %main_out
+%makeTreeNode_struct_BST_i1_i1_i11_i1_ = OpFunction %void None %25
+       %node = OpFunctionParameter %_ptr_Function_BST
+       %data = OpFunctionParameter %_ptr_Function_int
+         %32 = OpLabel
+         %34 = OpLoad %int %data
+         %37 = OpAccessChain %_ptr_Function_int %node %uint_0
+               OpStore %37 %34
+         %40 = OpAccessChain %_ptr_Function_int %node %uint_1
+               OpStore %40 %int_n1
+         %44 = OpAccessChain %_ptr_Function_int %node %uint_2
+               OpStore %44 %int_n1
+               OpReturn
+               OpFunctionEnd
+%insert_i1_i1_ = OpFunction %void None %45
+  %treeIndex = OpFunctionParameter %_ptr_Function_int
+     %data_1 = OpFunctionParameter %_ptr_Function_int
+         %49 = OpLabel
+  %baseIndex = OpVariable %_ptr_Function_int Function %51
+      %param = OpVariable %_ptr_Function_BST Function %53
+    %param_1 = OpVariable %_ptr_Function_int Function %51
+    %param_2 = OpVariable %_ptr_Function_BST Function %53
+    %param_3 = OpVariable %_ptr_Function_int Function %51
+               OpStore %baseIndex %int_0
+               OpBranch %58
+         %58 = OpLabel
+               OpLoopMerge %59 %60 None
+               OpBranch %61
+         %61 = OpLabel
+         %62 = OpLoad %int %baseIndex
+         %64 = OpLoad %int %treeIndex
+         %65 = OpSLessThanEqual %bool %62 %64
+               OpSelectionMerge %67 None
+               OpBranchConditional %65 %68 %69
+         %68 = OpLabel
+               OpBranch %67
+         %69 = OpLabel
+               OpBranch %59
+         %67 = OpLabel
+         %71 = OpLoad %int %data_1
+         %72 = OpLoad %int %baseIndex
+         %74 = OpAccessChain %_ptr_Private_int %tree %72 %uint_0
+         %75 = OpLoad %int %74
+         %76 = OpSLessThanEqual %bool %71 %75
+               OpSelectionMerge %77 None
+               OpBranchConditional %76 %78 %79
+         %78 = OpLabel
+         %80 = OpLoad %int %baseIndex
+         %81 = OpAccessChain %_ptr_Private_int %tree %80 %uint_1
+         %82 = OpLoad %int %81
+         %83 = OpIEqual %bool %82 %int_n1
+               OpSelectionMerge %84 None
+               OpBranchConditional %83 %85 %86
+         %85 = OpLabel
+         %87 = OpLoad %int %baseIndex
+         %89 = OpLoad %int %treeIndex
+         %90 = OpAccessChain %_ptr_Private_int %tree %87 %uint_1
+               OpStore %90 %89
+         %92 = OpLoad %int %treeIndex
+         %94 = OpAccessChain %_ptr_Private_BST %tree %92
+         %95 = OpLoad %BST %94
+               OpStore %param %95
+         %97 = OpLoad %int %data_1
+               OpStore %param_1 %97
+         %98 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param %param_1
+        %101 = OpLoad %BST %param
+        %102 = OpAccessChain %_ptr_Private_BST %tree %92
+               OpStore %102 %101
+               OpReturn
+         %86 = OpLabel
+        %103 = OpLoad %int %baseIndex
+        %104 = OpAccessChain %_ptr_Private_int %tree %103 %uint_1
+        %105 = OpLoad %int %104
+               OpStore %baseIndex %105
+               OpBranch %60
+         %84 = OpLabel
+               OpReturn
+         %79 = OpLabel
+        %106 = OpLoad %int %baseIndex
+        %107 = OpAccessChain %_ptr_Private_int %tree %106 %uint_2
+        %108 = OpLoad %int %107
+        %109 = OpIEqual %bool %108 %int_n1
+               OpSelectionMerge %110 None
+               OpBranchConditional %109 %111 %112
+        %111 = OpLabel
+        %113 = OpLoad %int %baseIndex
+        %115 = OpLoad %int %treeIndex
+        %116 = OpAccessChain %_ptr_Private_int %tree %113 %uint_2
+               OpStore %116 %115
+        %118 = OpLoad %int %treeIndex
+        %119 = OpAccessChain %_ptr_Private_BST %tree %118
+        %120 = OpLoad %BST %119
+               OpStore %param_2 %120
+        %122 = OpLoad %int %data_1
+               OpStore %param_3 %122
+        %123 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param_2 %param_3
+        %126 = OpLoad %BST %param_2
+        %127 = OpAccessChain %_ptr_Private_BST %tree %118
+               OpStore %127 %126
+               OpReturn
+        %112 = OpLabel
+        %128 = OpLoad %int %baseIndex
+        %129 = OpAccessChain %_ptr_Private_int %tree %128 %uint_2
+        %130 = OpLoad %int %129
+               OpStore %baseIndex %130
+               OpBranch %60
+        %110 = OpLabel
+               OpReturn
+         %77 = OpLabel
+               OpReturn
+         %60 = OpLabel
+               OpBranch %58
+         %59 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%identity_i1_ = OpFunction %int None %131
+          %a = OpFunctionParameter %_ptr_Function_int
+        %134 = OpLabel
+        %136 = OpLoad %int %a
+        %138 = OpLoad %int %a
+        %139 = OpAccessChain %_ptr_Private_int %obj %uint_0 %136
+               OpStore %139 %138
+        %141 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_2
+        %142 = OpLoad %int %141
+               OpReturnValue %142
+               OpFunctionEnd
+ %search_i1_ = OpFunction %int None %131
+     %target = OpFunctionParameter %_ptr_Function_int
+        %145 = OpLabel
+      %index = OpVariable %_ptr_Function_int Function %51
+%currentNode = OpVariable %_ptr_Function_BST Function %53
+      %x_270 = OpVariable %_ptr_Function_int Function %51
+               OpStore %index %int_0
+               OpBranch %149
+        %149 = OpLabel
+               OpLoopMerge %150 %151 None
+               OpBranch %152
+        %152 = OpLabel
+        %153 = OpLoad %int %index
+        %154 = OpINotEqual %bool %153 %int_n1
+               OpSelectionMerge %155 None
+               OpBranchConditional %154 %156 %157
+        %156 = OpLabel
+               OpBranch %155
+        %157 = OpLabel
+               OpBranch %150
+        %155 = OpLabel
+        %158 = OpLoad %int %index
+        %159 = OpAccessChain %_ptr_Private_BST %tree %158
+        %160 = OpLoad %BST %159
+               OpStore %currentNode %160
+        %161 = OpAccessChain %_ptr_Function_int %currentNode %uint_0
+        %162 = OpLoad %int %161
+        %164 = OpLoad %int %target
+        %165 = OpIEqual %bool %162 %164
+               OpSelectionMerge %166 None
+               OpBranchConditional %165 %167 %166
+        %167 = OpLabel
+        %169 = OpLoad %int %target
+               OpReturnValue %169
+        %166 = OpLabel
+        %171 = OpLoad %int %target
+        %172 = OpAccessChain %_ptr_Function_int %currentNode %uint_0
+        %173 = OpLoad %int %172
+        %174 = OpSGreaterThan %bool %171 %173
+               OpSelectionMerge %175 None
+               OpBranchConditional %174 %176 %177
+        %176 = OpLabel
+        %178 = OpAccessChain %_ptr_Function_int %currentNode %uint_2
+        %179 = OpLoad %int %178
+               OpStore %x_270 %179
+               OpBranch %175
+        %177 = OpLabel
+        %180 = OpAccessChain %_ptr_Function_int %currentNode %uint_1
+        %181 = OpLoad %int %180
+               OpStore %x_270 %181
+               OpBranch %175
+        %175 = OpLabel
+        %182 = OpLoad %int %x_270
+               OpStore %index %182
+               OpBranch %151
+        %151 = OpLabel
+               OpBranch %149
+        %150 = OpLabel
+               OpReturnValue %int_n1
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %183
+        %185 = OpLabel
+%treeIndex_1 = OpVariable %_ptr_Function_int Function %51
+    %param_4 = OpVariable %_ptr_Function_BST Function %53
+    %param_5 = OpVariable %_ptr_Function_int Function %51
+    %param_6 = OpVariable %_ptr_Function_int Function %51
+    %param_7 = OpVariable %_ptr_Function_int Function %51
+    %param_8 = OpVariable %_ptr_Function_int Function %51
+    %param_9 = OpVariable %_ptr_Function_int Function %51
+   %param_10 = OpVariable %_ptr_Function_int Function %51
+   %param_11 = OpVariable %_ptr_Function_int Function %51
+   %param_12 = OpVariable %_ptr_Function_int Function %51
+   %param_13 = OpVariable %_ptr_Function_int Function %51
+   %param_14 = OpVariable %_ptr_Function_int Function %51
+   %param_15 = OpVariable %_ptr_Function_int Function %51
+   %param_16 = OpVariable %_ptr_Function_int Function %51
+   %param_17 = OpVariable %_ptr_Function_int Function %51
+   %param_18 = OpVariable %_ptr_Function_int Function %51
+   %param_19 = OpVariable %_ptr_Function_int Function %51
+   %param_20 = OpVariable %_ptr_Function_int Function %51
+   %param_21 = OpVariable %_ptr_Function_int Function %51
+   %param_22 = OpVariable %_ptr_Function_int Function %51
+   %param_23 = OpVariable %_ptr_Function_int Function %51
+         %pp = OpVariable %_ptr_Function_int Function %51
+%looplimiter0 = OpVariable %_ptr_Function_int Function %51
+          %i = OpVariable %_ptr_Function_int Function %51
+   %param_24 = OpVariable %_ptr_Function_int Function %51
+      %count = OpVariable %_ptr_Function_int Function %51
+        %i_1 = OpVariable %_ptr_Function_int Function %51
+     %result = OpVariable %_ptr_Function_int Function %51
+   %param_25 = OpVariable %_ptr_Function_int Function %51
+               OpStore %treeIndex_1 %int_0
+        %215 = OpAccessChain %_ptr_Private_BST %tree %int_0
+        %216 = OpLoad %BST %215
+               OpStore %param_4 %216
+               OpStore %param_5 %int_9
+        %218 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param_4 %param_5
+        %221 = OpLoad %BST %param_4
+        %222 = OpAccessChain %_ptr_Private_BST %tree %int_0
+               OpStore %222 %221
+        %223 = OpLoad %int %treeIndex_1
+        %225 = OpIAdd %int %223 %int_1
+               OpStore %treeIndex_1 %225
+        %226 = OpLoad %int %treeIndex_1
+               OpStore %param_6 %226
+               OpStore %param_7 %int_5
+        %228 = OpFunctionCall %void %insert_i1_i1_ %param_6 %param_7
+        %231 = OpLoad %int %treeIndex_1
+        %232 = OpIAdd %int %231 %int_1
+               OpStore %treeIndex_1 %232
+        %233 = OpLoad %int %treeIndex_1
+               OpStore %param_8 %233
+               OpStore %param_9 %int_12
+        %235 = OpFunctionCall %void %insert_i1_i1_ %param_8 %param_9
+        %238 = OpLoad %int %treeIndex_1
+        %239 = OpIAdd %int %238 %int_1
+               OpStore %treeIndex_1 %239
+        %240 = OpLoad %int %treeIndex_1
+               OpStore %param_10 %240
+               OpStore %param_11 %int_15
+        %242 = OpFunctionCall %void %insert_i1_i1_ %param_10 %param_11
+        %245 = OpLoad %int %treeIndex_1
+        %246 = OpIAdd %int %245 %int_1
+               OpStore %treeIndex_1 %246
+        %247 = OpLoad %int %treeIndex_1
+               OpStore %param_12 %247
+               OpStore %param_13 %int_7
+        %249 = OpFunctionCall %void %insert_i1_i1_ %param_12 %param_13
+        %252 = OpLoad %int %treeIndex_1
+        %253 = OpIAdd %int %252 %int_1
+               OpStore %treeIndex_1 %253
+        %254 = OpLoad %int %treeIndex_1
+               OpStore %param_14 %254
+               OpStore %param_15 %int_8
+        %256 = OpFunctionCall %void %insert_i1_i1_ %param_14 %param_15
+        %259 = OpLoad %int %treeIndex_1
+        %260 = OpIAdd %int %259 %int_1
+               OpStore %treeIndex_1 %260
+        %261 = OpLoad %int %treeIndex_1
+               OpStore %param_16 %261
+               OpStore %param_17 %int_2
+        %262 = OpFunctionCall %void %insert_i1_i1_ %param_16 %param_17
+        %265 = OpLoad %int %treeIndex_1
+        %266 = OpIAdd %int %265 %int_1
+               OpStore %treeIndex_1 %266
+        %267 = OpLoad %int %treeIndex_1
+               OpStore %param_18 %267
+               OpStore %param_19 %int_6
+        %269 = OpFunctionCall %void %insert_i1_i1_ %param_18 %param_19
+        %272 = OpLoad %int %treeIndex_1
+        %273 = OpIAdd %int %272 %int_1
+               OpStore %treeIndex_1 %273
+        %274 = OpLoad %int %treeIndex_1
+               OpStore %param_20 %274
+               OpStore %param_21 %int_17
+        %276 = OpFunctionCall %void %insert_i1_i1_ %param_20 %param_21
+        %279 = OpLoad %int %treeIndex_1
+        %280 = OpIAdd %int %279 %int_1
+               OpStore %treeIndex_1 %280
+        %281 = OpLoad %int %treeIndex_1
+               OpStore %param_22 %281
+               OpStore %param_23 %int_13
+        %283 = OpFunctionCall %void %insert_i1_i1_ %param_22 %param_23
+               OpStore %pp %int_0
+               OpStore %looplimiter0 %int_0
+               OpStore %i %int_0
+               OpBranch %286
+        %286 = OpLabel
+               OpLoopMerge %287 %288 None
+               OpBranch %289
+        %289 = OpLabel
+        %290 = OpLoad %int %i
+        %292 = OpSLessThan %bool %290 %int_10000
+               OpSelectionMerge %293 None
+               OpBranchConditional %292 %294 %295
+        %294 = OpLabel
+               OpBranch %293
+        %295 = OpLabel
+               OpBranch %287
+        %293 = OpLabel
+        %296 = OpLoad %int %looplimiter0
+        %298 = OpAccessChain %_ptr_Uniform_float %x_50 %uint_0 %uint_1
+        %299 = OpLoad %float %298
+        %300 = OpConvertFToS %int %299
+        %301 = OpSGreaterThanEqual %bool %296 %300
+               OpSelectionMerge %302 None
+               OpBranchConditional %301 %303 %302
+        %303 = OpLabel
+        %304 = OpAccessChain %_ptr_Uniform_float %x_50 %uint_0 %uint_1
+        %305 = OpLoad %float %304
+        %306 = OpConvertFToS %int %305
+        %307 = OpIAdd %int %int_1 %306
+               OpStore %param_24 %307
+        %308 = OpFunctionCall %int %identity_i1_ %param_24
+               OpStore %pp %308
+               OpBranch %287
+        %302 = OpLabel
+        %310 = OpLoad %int %looplimiter0
+        %311 = OpIAdd %int %310 %int_1
+               OpStore %looplimiter0 %311
+               OpBranch %288
+        %288 = OpLabel
+        %312 = OpLoad %int %i
+        %313 = OpIAdd %int %312 %int_1
+               OpStore %i %313
+               OpBranch %286
+        %287 = OpLabel
+        %314 = OpLoad %int %pp
+        %315 = OpINotEqual %bool %314 %int_2
+               OpSelectionMerge %316 None
+               OpBranchConditional %315 %317 %316
+        %317 = OpLabel
+               OpReturn
+        %316 = OpLabel
+               OpStore %count %int_0
+               OpStore %i_1 %int_0
+               OpBranch %318
+        %318 = OpLabel
+               OpLoopMerge %319 %320 None
+               OpBranch %321
+        %321 = OpLabel
+        %322 = OpLoad %int %i_1
+        %324 = OpSLessThan %bool %322 %int_20
+               OpSelectionMerge %325 None
+               OpBranchConditional %324 %326 %327
+        %326 = OpLabel
+               OpBranch %325
+        %327 = OpLabel
+               OpBranch %319
+        %325 = OpLabel
+        %328 = OpLoad %int %i_1
+               OpStore %param_25 %328
+        %329 = OpFunctionCall %int %search_i1_ %param_25
+               OpStore %result %329
+        %331 = OpLoad %int %i_1
+               OpSelectionMerge %332 None
+               OpSwitch %331 %333 2 %334 5 %334 6 %334 7 %334 8 %334 9 %334 12 %334 13 %334 15 %334 17 %334
+        %334 = OpLabel
+        %335 = OpLoad %int %result
+        %336 = OpLoad %int %i_1
+        %337 = OpIEqual %bool %335 %336
+               OpSelectionMerge %338 None
+               OpBranchConditional %337 %339 %338
+        %339 = OpLabel
+        %340 = OpLoad %int %count
+        %341 = OpIAdd %int %340 %int_1
+               OpStore %count %341
+               OpBranch %338
+        %338 = OpLabel
+               OpBranch %332
+        %333 = OpLabel
+        %342 = OpLoad %int %result
+        %343 = OpIEqual %bool %342 %int_n1
+               OpSelectionMerge %344 None
+               OpBranchConditional %343 %345 %344
+        %345 = OpLabel
+        %346 = OpLoad %int %count
+        %347 = OpIAdd %int %346 %int_1
+               OpStore %count %347
+               OpBranch %344
+        %344 = OpLabel
+               OpBranch %332
+        %332 = OpLabel
+               OpBranch %320
+        %320 = OpLabel
+        %348 = OpLoad %int %i_1
+        %349 = OpIAdd %int %348 %int_1
+               OpStore %i_1 %349
+               OpBranch %318
+        %319 = OpLabel
+        %350 = OpLoad %int %count
+        %351 = OpIEqual %bool %350 %int_20
+               OpSelectionMerge %352 None
+               OpBranchConditional %351 %353 %354
+        %353 = OpLabel
+               OpStore %x_GLF_color %357
+               OpBranch %352
+        %354 = OpLabel
+               OpStore %x_GLF_color %358
+               OpBranch %352
+        %352 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %359
+%tint_symbol = OpFunctionParameter %main_out
+        %363 = OpLabel
+        %364 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %364
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %183
+        %366 = OpLabel
+        %367 = OpFunctionCall %void %main_1
+        %369 = OpLoad %v4float %x_GLF_color
+        %370 = OpCompositeConstruct %main_out %369
+        %368 = OpFunctionCall %void %tint_symbol_2 %370
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..cd61e29
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-binarysearch-tree-with-loop-read-write-global/1.wgsl.expected.wgsl
@@ -0,0 +1,319 @@
+struct BST {
+  data : i32;
+  leftIndex : i32;
+  rightIndex : i32;
+};
+
+struct QuicksortObject {
+  numbers : array<i32, 10>;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> obj : QuicksortObject;
+
+var<private> tree : array<BST, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_50 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn makeTreeNode_struct_BST_i1_i1_i11_i1_(node : ptr<function, BST>, data : ptr<function, i32>) {
+  let x_208 : i32 = *(data);
+  (*(node)).data = x_208;
+  (*(node)).leftIndex = -1;
+  (*(node)).rightIndex = -1;
+  return;
+}
+
+fn insert_i1_i1_(treeIndex : ptr<function, i32>, data_1 : ptr<function, i32>) {
+  var baseIndex : i32;
+  var param : BST;
+  var param_1 : i32;
+  var param_2 : BST;
+  var param_3 : i32;
+  baseIndex = 0;
+  loop {
+    let x_217 : i32 = baseIndex;
+    let x_218 : i32 = *(treeIndex);
+    if ((x_217 <= x_218)) {
+    } else {
+      break;
+    }
+    let x_221 : i32 = *(data_1);
+    let x_222 : i32 = baseIndex;
+    let x_224 : i32 = tree[x_222].data;
+    if ((x_221 <= x_224)) {
+      let x_229 : i32 = baseIndex;
+      let x_231 : i32 = tree[x_229].leftIndex;
+      if ((x_231 == -1)) {
+        let x_236 : i32 = baseIndex;
+        let x_237 : i32 = *(treeIndex);
+        tree[x_236].leftIndex = x_237;
+        let x_239 : i32 = *(treeIndex);
+        let x_241 : BST = tree[x_239];
+        param = x_241;
+        let x_242 : i32 = *(data_1);
+        param_1 = x_242;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param), &(param_1));
+        let x_244 : BST = param;
+        tree[x_239] = x_244;
+        return;
+      } else {
+        let x_246 : i32 = baseIndex;
+        let x_248 : i32 = tree[x_246].leftIndex;
+        baseIndex = x_248;
+        continue;
+      }
+      return;
+    } else {
+      let x_249 : i32 = baseIndex;
+      let x_251 : i32 = tree[x_249].rightIndex;
+      if ((x_251 == -1)) {
+        let x_256 : i32 = baseIndex;
+        let x_257 : i32 = *(treeIndex);
+        tree[x_256].rightIndex = x_257;
+        let x_259 : i32 = *(treeIndex);
+        let x_261 : BST = tree[x_259];
+        param_2 = x_261;
+        let x_262 : i32 = *(data_1);
+        param_3 = x_262;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_2), &(param_3));
+        let x_264 : BST = param_2;
+        tree[x_259] = x_264;
+        return;
+      } else {
+        let x_266 : i32 = baseIndex;
+        let x_268 : i32 = tree[x_266].rightIndex;
+        baseIndex = x_268;
+        continue;
+      }
+      return;
+    }
+    return;
+  }
+  return;
+}
+
+fn identity_i1_(a : ptr<function, i32>) -> i32 {
+  let x_202 : i32 = *(a);
+  let x_203 : i32 = *(a);
+  obj.numbers[x_202] = x_203;
+  let x_206 : i32 = obj.numbers[2];
+  return x_206;
+}
+
+fn search_i1_(target : ptr<function, i32>) -> i32 {
+  var index : i32;
+  var currentNode : BST;
+  var x_270 : i32;
+  index = 0;
+  loop {
+    let x_275 : i32 = index;
+    if ((x_275 != -1)) {
+    } else {
+      break;
+    }
+    let x_278 : i32 = index;
+    let x_280 : BST = tree[x_278];
+    currentNode = x_280;
+    let x_282 : i32 = currentNode.data;
+    let x_283 : i32 = *(target);
+    if ((x_282 == x_283)) {
+      let x_287 : i32 = *(target);
+      return x_287;
+    }
+    let x_288 : i32 = *(target);
+    let x_290 : i32 = currentNode.data;
+    if ((x_288 > x_290)) {
+      let x_296 : i32 = currentNode.rightIndex;
+      x_270 = x_296;
+    } else {
+      let x_298 : i32 = currentNode.leftIndex;
+      x_270 = x_298;
+    }
+    let x_299 : i32 = x_270;
+    index = x_299;
+  }
+  return -1;
+}
+
+fn main_1() {
+  var treeIndex_1 : i32;
+  var param_4 : BST;
+  var param_5 : i32;
+  var param_6 : i32;
+  var param_7 : i32;
+  var param_8 : i32;
+  var param_9 : i32;
+  var param_10 : i32;
+  var param_11 : i32;
+  var param_12 : i32;
+  var param_13 : i32;
+  var param_14 : i32;
+  var param_15 : i32;
+  var param_16 : i32;
+  var param_17 : i32;
+  var param_18 : i32;
+  var param_19 : i32;
+  var param_20 : i32;
+  var param_21 : i32;
+  var param_22 : i32;
+  var param_23 : i32;
+  var pp : i32;
+  var looplimiter0 : i32;
+  var i : i32;
+  var param_24 : i32;
+  var count : i32;
+  var i_1 : i32;
+  var result : i32;
+  var param_25 : i32;
+  treeIndex_1 = 0;
+  let x_101 : BST = tree[0];
+  param_4 = x_101;
+  param_5 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_4), &(param_5));
+  let x_103 : BST = param_4;
+  tree[0] = x_103;
+  let x_105 : i32 = treeIndex_1;
+  treeIndex_1 = (x_105 + 1);
+  let x_107 : i32 = treeIndex_1;
+  param_6 = x_107;
+  param_7 = 5;
+  insert_i1_i1_(&(param_6), &(param_7));
+  let x_109 : i32 = treeIndex_1;
+  treeIndex_1 = (x_109 + 1);
+  let x_111 : i32 = treeIndex_1;
+  param_8 = x_111;
+  param_9 = 12;
+  insert_i1_i1_(&(param_8), &(param_9));
+  let x_113 : i32 = treeIndex_1;
+  treeIndex_1 = (x_113 + 1);
+  let x_115 : i32 = treeIndex_1;
+  param_10 = x_115;
+  param_11 = 15;
+  insert_i1_i1_(&(param_10), &(param_11));
+  let x_117 : i32 = treeIndex_1;
+  treeIndex_1 = (x_117 + 1);
+  let x_119 : i32 = treeIndex_1;
+  param_12 = x_119;
+  param_13 = 7;
+  insert_i1_i1_(&(param_12), &(param_13));
+  let x_121 : i32 = treeIndex_1;
+  treeIndex_1 = (x_121 + 1);
+  let x_123 : i32 = treeIndex_1;
+  param_14 = x_123;
+  param_15 = 8;
+  insert_i1_i1_(&(param_14), &(param_15));
+  let x_125 : i32 = treeIndex_1;
+  treeIndex_1 = (x_125 + 1);
+  let x_127 : i32 = treeIndex_1;
+  param_16 = x_127;
+  param_17 = 2;
+  insert_i1_i1_(&(param_16), &(param_17));
+  let x_129 : i32 = treeIndex_1;
+  treeIndex_1 = (x_129 + 1);
+  let x_131 : i32 = treeIndex_1;
+  param_18 = x_131;
+  param_19 = 6;
+  insert_i1_i1_(&(param_18), &(param_19));
+  let x_133 : i32 = treeIndex_1;
+  treeIndex_1 = (x_133 + 1);
+  let x_135 : i32 = treeIndex_1;
+  param_20 = x_135;
+  param_21 = 17;
+  insert_i1_i1_(&(param_20), &(param_21));
+  let x_137 : i32 = treeIndex_1;
+  treeIndex_1 = (x_137 + 1);
+  let x_139 : i32 = treeIndex_1;
+  param_22 = x_139;
+  param_23 = 13;
+  insert_i1_i1_(&(param_22), &(param_23));
+  pp = 0;
+  looplimiter0 = 0;
+  i = 0;
+  loop {
+    let x_145 : i32 = i;
+    if ((x_145 < 10000)) {
+    } else {
+      break;
+    }
+    let x_148 : i32 = looplimiter0;
+    let x_150 : f32 = x_50.injectionSwitch.y;
+    if ((x_148 >= i32(x_150))) {
+      let x_156 : f32 = x_50.injectionSwitch.y;
+      param_24 = (1 + i32(x_156));
+      let x_159 : i32 = identity_i1_(&(param_24));
+      pp = x_159;
+      break;
+    }
+    let x_160 : i32 = looplimiter0;
+    looplimiter0 = (x_160 + 1);
+
+    continuing {
+      let x_162 : i32 = i;
+      i = (x_162 + 1);
+    }
+  }
+  let x_164 : i32 = pp;
+  if ((x_164 != 2)) {
+    return;
+  }
+  count = 0;
+  i_1 = 0;
+  loop {
+    let x_172 : i32 = i_1;
+    if ((x_172 < 20)) {
+    } else {
+      break;
+    }
+    let x_175 : i32 = i_1;
+    param_25 = x_175;
+    let x_176 : i32 = search_i1_(&(param_25));
+    result = x_176;
+    let x_177 : i32 = i_1;
+    switch(x_177) {
+      case 2, 5, 6, 7, 8, 9, 12, 13, 15, 17: {
+        let x_187 : i32 = result;
+        let x_188 : i32 = i_1;
+        if ((x_187 == x_188)) {
+          let x_192 : i32 = count;
+          count = (x_192 + 1);
+        }
+      }
+      default: {
+        let x_181 : i32 = result;
+        if ((x_181 == -1)) {
+          let x_185 : i32 = count;
+          count = (x_185 + 1);
+        }
+      }
+    }
+
+    continuing {
+      let x_194 : i32 = i_1;
+      i_1 = (x_194 + 1);
+    }
+  }
+  let x_196 : i32 = count;
+  if ((x_196 == 20)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-collatz-push-constant-with-nested-min-max/0.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-collatz-push-constant-with-nested-min-max/0.spvasm
new file mode 100644
index 0000000..d5a25f6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-collatz-push-constant-with-nested-min-max/0.spvasm
@@ -0,0 +1,153 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %collatz_i1_ "collatz(i1;"
+               OpName %v "v"
+               OpName %count "count"
+               OpName %lin "lin"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %v_0 "v"
+               OpName %_GLF_color "_GLF_color"
+               OpName %param "param"
+               OpName %indexable "indexable"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpTypeFunction %int %_ptr_Function_int
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+      %int_2 = OpConstant %int 2
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_8 = OpConstant %float 8
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_8 = OpConstant %int 8
+     %uint_1 = OpConstant %uint 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+         %42 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+  %float_0_5 = OpConstant %float 0.5
+         %44 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+         %45 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+         %46 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+         %47 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+         %48 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+         %49 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+         %50 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+         %51 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %52 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+         %53 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+         %54 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+         %55 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+         %56 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+         %57 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+         %58 = OpConstantComposite %_arr_v4float_uint_16 %42 %44 %45 %46 %47 %48 %49 %50 %42 %51 %52 %53 %54 %55 %56 %57
+     %int_16 = OpConstant %int 16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %main = OpFunction %void None %15
+         %62 = OpLabel
+        %lin = OpVariable %_ptr_Function_v2float Function
+        %v_0 = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_int Function
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_16 Function
+         %63 = OpLoad %v4float %gl_FragCoord
+         %64 = OpVectorShuffle %v2float %63 %63 0 1
+         %65 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+         %66 = OpLoad %v2float %65
+         %67 = OpFDiv %v2float %64 %66
+               OpStore %lin %67
+         %68 = OpLoad %v2float %lin
+         %69 = OpVectorTimesScalar %v2float %68 %float_8
+         %70 = OpExtInst %v2float %1 Floor %69
+               OpStore %lin %70
+         %71 = OpAccessChain %_ptr_Function_float %lin %uint_0
+         %72 = OpLoad %float %71
+         %73 = OpConvertFToS %int %72
+         %74 = OpIMul %int %73 %int_8
+         %75 = OpAccessChain %_ptr_Function_float %lin %uint_1
+         %76 = OpLoad %float %75
+         %77 = OpConvertFToS %int %76
+         %78 = OpIAdd %int %74 %77
+               OpStore %v_0 %78
+         %79 = OpLoad %int %v_0
+               OpStore %param %79
+         %80 = OpFunctionCall %int %collatz_i1_ %param
+         %81 = OpSMod %int %80 %int_16
+               OpStore %indexable %58
+         %82 = OpAccessChain %_ptr_Function_v4float %indexable %81
+         %83 = OpLoad %v4float %82
+               OpStore %_GLF_color %83
+               OpReturn
+               OpFunctionEnd
+%collatz_i1_ = OpFunction %int None %18
+          %v = OpFunctionParameter %_ptr_Function_int
+         %84 = OpLabel
+      %count = OpVariable %_ptr_Function_int Function
+               OpStore %count %int_0
+               OpBranch %85
+         %85 = OpLabel
+               OpLoopMerge %86 %87 None
+               OpBranch %88
+         %88 = OpLabel
+         %89 = OpLoad %int %v
+         %90 = OpSGreaterThan %bool %89 %int_1
+               OpBranchConditional %90 %91 %86
+         %91 = OpLabel
+         %92 = OpLoad %int %v
+         %93 = OpBitwiseAnd %int %92 %int_1
+         %94 = OpIEqual %bool %93 %int_1
+               OpSelectionMerge %95 None
+               OpBranchConditional %94 %96 %97
+         %96 = OpLabel
+         %98 = OpLoad %int %v
+         %99 = OpIMul %int %int_3 %98
+        %100 = OpIAdd %int %99 %int_1
+               OpStore %v %100
+               OpBranch %95
+         %97 = OpLabel
+        %101 = OpLoad %int %v
+        %102 = OpSDiv %int %101 %int_2
+               OpStore %v %102
+               OpBranch %95
+         %95 = OpLabel
+        %103 = OpLoad %int %count
+        %104 = OpIAdd %int %103 %int_1
+               OpStore %count %104
+               OpBranch %87
+         %87 = OpLabel
+               OpBranch %85
+         %86 = OpLabel
+        %105 = OpLoad %int %count
+               OpReturnValue %105
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-collatz-push-constant-with-nested-min-max/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-collatz-push-constant-with-nested-min-max/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..b305371
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-collatz-push-constant-with-nested-min-max/0.spvasm.expected.hlsl
@@ -0,0 +1,67 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+int collatz_i1_(inout int v) {
+  int count = 0;
+  count = 0;
+  while (true) {
+    const int x_89 = v;
+    if ((x_89 > 1)) {
+    } else {
+      break;
+    }
+    const int x_92 = v;
+    if (((x_92 & 1) == 1)) {
+      const int x_98 = v;
+      v = ((3 * x_98) + 1);
+    } else {
+      const int x_101 = v;
+      v = (x_101 / 2);
+    }
+    count = (count + 1);
+  }
+  return count;
+}
+
+void main_1() {
+  float2 lin = float2(0.0f, 0.0f);
+  int v_1 = 0;
+  int param = 0;
+  float4 indexable[16] = (float4[16])0;
+  const float4 x_63 = gl_FragCoord;
+  const float2 x_66 = asfloat(x_10[0].xy);
+  lin = (float2(x_63.x, x_63.y) / x_66);
+  lin = floor((lin * 8.0f));
+  const float x_72 = lin.x;
+  const float x_76 = lin.y;
+  v_1 = ((int(x_72) * 8) + int(x_76));
+  param = v_1;
+  const int x_80 = collatz_i1_(param);
+  const float4 tint_symbol_5[16] = {float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)};
+  indexable = tint_symbol_5;
+  const float4 x_83 = indexable[(x_80 % 16)];
+  x_GLF_color = x_83;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-collatz-push-constant-with-nested-min-max/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-collatz-push-constant-with-nested-min-max/0.spvasm.expected.msl
new file mode 100644
index 0000000..94420a4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-collatz-push-constant-with-nested-min-max/0.spvasm.expected.msl
@@ -0,0 +1,73 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  float4 arr[16];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int collatz_i1_(thread int* const v) {
+  int count = 0;
+  count = 0;
+  while (true) {
+    int const x_89 = *(v);
+    if ((x_89 > 1)) {
+    } else {
+      break;
+    }
+    int const x_92 = *(v);
+    if (((x_92 & 1) == 1)) {
+      int const x_98 = *(v);
+      *(v) = ((3 * x_98) + 1);
+    } else {
+      int const x_101 = *(v);
+      *(v) = (x_101 / 2);
+    }
+    int const x_103 = count;
+    count = (x_103 + 1);
+  }
+  int const x_105 = count;
+  return x_105;
+}
+
+void main_1(constant buf0& x_10, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  float2 lin = 0.0f;
+  int v_1 = 0;
+  int param = 0;
+  tint_array_wrapper indexable = {};
+  float4 const x_63 = *(tint_symbol_6);
+  float2 const x_66 = x_10.resolution;
+  lin = (float2(x_63.x, x_63.y) / x_66);
+  float2 const x_68 = lin;
+  lin = floor((x_68 * 8.0f));
+  float const x_72 = lin.x;
+  float const x_76 = lin.y;
+  v_1 = ((int(x_72) * 8) + int(x_76));
+  int const x_79 = v_1;
+  param = x_79;
+  int const x_80 = collatz_i1_(&(param));
+  tint_array_wrapper const tint_symbol_4 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
+  indexable = tint_symbol_4;
+  float4 const x_83 = indexable.arr[(x_80 % 16)];
+  *(tint_symbol_7) = x_83;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_10 [[buffer(0)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_10, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-collatz-push-constant-with-nested-min-max/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-collatz-push-constant-with-nested-min-max/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..d892d09
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-collatz-push-constant-with-nested-min-max/0.spvasm.expected.spvasm
@@ -0,0 +1,200 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 137
+; Schema: 0
+               OpCapability Shader
+         %83 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %collatz_i1_ "collatz_i1_"
+               OpName %v "v"
+               OpName %count "count"
+               OpName %main_1 "main_1"
+               OpName %lin "lin"
+               OpName %v_1 "v_1"
+               OpName %param "param"
+               OpName %indexable "indexable"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v4float_uint_16 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %15 = OpTypeFunction %int %_ptr_Function_int
+         %22 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+      %int_2 = OpConstant %int 2
+       %void = OpTypeVoid
+         %57 = OpTypeFunction %void
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %63 = OpConstantNull %v2float
+       %uint = OpTypeInt 32 0
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+         %71 = OpConstantNull %_arr_v4float_uint_16
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_8 = OpConstant %float 8
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+      %int_8 = OpConstant %int 8
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+        %102 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+  %float_0_5 = OpConstant %float 0.5
+        %104 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+        %105 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+        %106 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+        %107 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+        %108 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+        %109 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+        %110 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+        %111 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %112 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+        %113 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+        %114 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+        %115 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+        %116 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+        %117 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+        %118 = OpConstantComposite %_arr_v4float_uint_16 %102 %104 %105 %106 %107 %108 %109 %110 %102 %111 %112 %113 %114 %115 %116 %117
+     %int_16 = OpConstant %int 16
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+   %main_out = OpTypeStruct %v4float
+        %124 = OpTypeFunction %void %main_out
+%collatz_i1_ = OpFunction %int None %15
+          %v = OpFunctionParameter %_ptr_Function_int
+         %20 = OpLabel
+      %count = OpVariable %_ptr_Function_int Function %22
+               OpStore %count %int_0
+               OpBranch %24
+         %24 = OpLabel
+               OpLoopMerge %25 %26 None
+               OpBranch %27
+         %27 = OpLabel
+         %29 = OpLoad %int %v
+         %31 = OpSGreaterThan %bool %29 %int_1
+               OpSelectionMerge %33 None
+               OpBranchConditional %31 %34 %35
+         %34 = OpLabel
+               OpBranch %33
+         %35 = OpLabel
+               OpBranch %25
+         %33 = OpLabel
+         %37 = OpLoad %int %v
+         %38 = OpBitwiseAnd %int %37 %int_1
+         %39 = OpIEqual %bool %38 %int_1
+               OpSelectionMerge %40 None
+               OpBranchConditional %39 %41 %42
+         %41 = OpLabel
+         %44 = OpLoad %int %v
+         %47 = OpIMul %int %int_3 %44
+         %48 = OpIAdd %int %47 %int_1
+               OpStore %v %48
+               OpBranch %40
+         %42 = OpLabel
+         %50 = OpLoad %int %v
+         %53 = OpSDiv %int %50 %int_2
+               OpStore %v %53
+               OpBranch %40
+         %40 = OpLabel
+         %54 = OpLoad %int %count
+         %55 = OpIAdd %int %54 %int_1
+               OpStore %count %55
+               OpBranch %26
+         %26 = OpLabel
+               OpBranch %24
+         %25 = OpLabel
+         %56 = OpLoad %int %count
+               OpReturnValue %56
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %57
+         %60 = OpLabel
+        %lin = OpVariable %_ptr_Function_v2float Function %63
+        %v_1 = OpVariable %_ptr_Function_int Function %22
+      %param = OpVariable %_ptr_Function_int Function %22
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_16 Function %71
+         %72 = OpLoad %v4float %gl_FragCoord
+         %75 = OpAccessChain %_ptr_Uniform_v2float %x_10 %uint_0
+         %76 = OpLoad %v2float %75
+         %77 = OpCompositeExtract %float %72 0
+         %78 = OpCompositeExtract %float %72 1
+         %79 = OpCompositeConstruct %v2float %77 %78
+         %80 = OpFDiv %v2float %79 %76
+               OpStore %lin %80
+         %81 = OpLoad %v2float %lin
+         %85 = OpVectorTimesScalar %v2float %81 %float_8
+         %82 = OpExtInst %v2float %83 Floor %85
+               OpStore %lin %82
+         %87 = OpAccessChain %_ptr_Function_float %lin %uint_0
+         %88 = OpLoad %float %87
+         %90 = OpAccessChain %_ptr_Function_float %lin %uint_1
+         %91 = OpLoad %float %90
+         %92 = OpConvertFToS %int %88
+         %94 = OpIMul %int %92 %int_8
+         %95 = OpConvertFToS %int %91
+         %96 = OpIAdd %int %94 %95
+               OpStore %v_1 %96
+         %97 = OpLoad %int %v_1
+               OpStore %param %97
+         %98 = OpFunctionCall %int %collatz_i1_ %param
+               OpStore %indexable %118
+        %120 = OpSMod %int %98 %int_16
+        %122 = OpAccessChain %_ptr_Function_v4float %indexable %120
+        %123 = OpLoad %v4float %122
+               OpStore %x_GLF_color %123
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %124
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %128 = OpLabel
+        %129 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %129
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %57
+        %131 = OpLabel
+        %132 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %132
+        %133 = OpFunctionCall %void %main_1
+        %135 = OpLoad %v4float %x_GLF_color
+        %136 = OpCompositeConstruct %main_out %135
+        %134 = OpFunctionCall %void %tint_symbol_3 %136
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-collatz-push-constant-with-nested-min-max/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-collatz-push-constant-with-nested-min-max/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..10f5505
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-collatz-push-constant-with-nested-min-max/0.spvasm.expected.wgsl
@@ -0,0 +1,68 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn collatz_i1_(v : ptr<function, i32>) -> i32 {
+  var count : i32;
+  count = 0;
+  loop {
+    let x_89 : i32 = *(v);
+    if ((x_89 > 1)) {
+    } else {
+      break;
+    }
+    let x_92 : i32 = *(v);
+    if (((x_92 & 1) == 1)) {
+      let x_98 : i32 = *(v);
+      *(v) = ((3 * x_98) + 1);
+    } else {
+      let x_101 : i32 = *(v);
+      *(v) = (x_101 / 2);
+    }
+    let x_103 : i32 = count;
+    count = (x_103 + 1);
+  }
+  let x_105 : i32 = count;
+  return x_105;
+}
+
+fn main_1() {
+  var lin : vec2<f32>;
+  var v_1 : i32;
+  var param : i32;
+  var indexable : array<vec4<f32>, 16>;
+  let x_63 : vec4<f32> = gl_FragCoord;
+  let x_66 : vec2<f32> = x_10.resolution;
+  lin = (vec2<f32>(x_63.x, x_63.y) / x_66);
+  let x_68 : vec2<f32> = lin;
+  lin = floor((x_68 * 8.0));
+  let x_72 : f32 = lin.x;
+  let x_76 : f32 = lin.y;
+  v_1 = ((i32(x_72) * 8) + i32(x_76));
+  let x_79 : i32 = v_1;
+  param = x_79;
+  let x_80 : i32 = collatz_i1_(&(param));
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+  let x_83 : vec4<f32> = indexable[(x_80 % 16)];
+  x_GLF_color = x_83;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-collatz-push-constant-with-nested-min-max/0.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-collatz-push-constant-with-nested-min-max/0.wgsl
new file mode 100644
index 0000000..10f5505
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-collatz-push-constant-with-nested-min-max/0.wgsl
@@ -0,0 +1,68 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn collatz_i1_(v : ptr<function, i32>) -> i32 {
+  var count : i32;
+  count = 0;
+  loop {
+    let x_89 : i32 = *(v);
+    if ((x_89 > 1)) {
+    } else {
+      break;
+    }
+    let x_92 : i32 = *(v);
+    if (((x_92 & 1) == 1)) {
+      let x_98 : i32 = *(v);
+      *(v) = ((3 * x_98) + 1);
+    } else {
+      let x_101 : i32 = *(v);
+      *(v) = (x_101 / 2);
+    }
+    let x_103 : i32 = count;
+    count = (x_103 + 1);
+  }
+  let x_105 : i32 = count;
+  return x_105;
+}
+
+fn main_1() {
+  var lin : vec2<f32>;
+  var v_1 : i32;
+  var param : i32;
+  var indexable : array<vec4<f32>, 16>;
+  let x_63 : vec4<f32> = gl_FragCoord;
+  let x_66 : vec2<f32> = x_10.resolution;
+  lin = (vec2<f32>(x_63.x, x_63.y) / x_66);
+  let x_68 : vec2<f32> = lin;
+  lin = floor((x_68 * 8.0));
+  let x_72 : f32 = lin.x;
+  let x_76 : f32 = lin.y;
+  v_1 = ((i32(x_72) * 8) + i32(x_76));
+  let x_79 : i32 = v_1;
+  param = x_79;
+  let x_80 : i32 = collatz_i1_(&(param));
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+  let x_83 : vec4<f32> = indexable[(x_80 % 16)];
+  x_GLF_color = x_83;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-collatz-push-constant-with-nested-min-max/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-collatz-push-constant-with-nested-min-max/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..b305371
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-collatz-push-constant-with-nested-min-max/0.wgsl.expected.hlsl
@@ -0,0 +1,67 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+int collatz_i1_(inout int v) {
+  int count = 0;
+  count = 0;
+  while (true) {
+    const int x_89 = v;
+    if ((x_89 > 1)) {
+    } else {
+      break;
+    }
+    const int x_92 = v;
+    if (((x_92 & 1) == 1)) {
+      const int x_98 = v;
+      v = ((3 * x_98) + 1);
+    } else {
+      const int x_101 = v;
+      v = (x_101 / 2);
+    }
+    count = (count + 1);
+  }
+  return count;
+}
+
+void main_1() {
+  float2 lin = float2(0.0f, 0.0f);
+  int v_1 = 0;
+  int param = 0;
+  float4 indexable[16] = (float4[16])0;
+  const float4 x_63 = gl_FragCoord;
+  const float2 x_66 = asfloat(x_10[0].xy);
+  lin = (float2(x_63.x, x_63.y) / x_66);
+  lin = floor((lin * 8.0f));
+  const float x_72 = lin.x;
+  const float x_76 = lin.y;
+  v_1 = ((int(x_72) * 8) + int(x_76));
+  param = v_1;
+  const int x_80 = collatz_i1_(param);
+  const float4 tint_symbol_5[16] = {float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)};
+  indexable = tint_symbol_5;
+  const float4 x_83 = indexable[(x_80 % 16)];
+  x_GLF_color = x_83;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-collatz-push-constant-with-nested-min-max/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-collatz-push-constant-with-nested-min-max/0.wgsl.expected.msl
new file mode 100644
index 0000000..94420a4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-collatz-push-constant-with-nested-min-max/0.wgsl.expected.msl
@@ -0,0 +1,73 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  float4 arr[16];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int collatz_i1_(thread int* const v) {
+  int count = 0;
+  count = 0;
+  while (true) {
+    int const x_89 = *(v);
+    if ((x_89 > 1)) {
+    } else {
+      break;
+    }
+    int const x_92 = *(v);
+    if (((x_92 & 1) == 1)) {
+      int const x_98 = *(v);
+      *(v) = ((3 * x_98) + 1);
+    } else {
+      int const x_101 = *(v);
+      *(v) = (x_101 / 2);
+    }
+    int const x_103 = count;
+    count = (x_103 + 1);
+  }
+  int const x_105 = count;
+  return x_105;
+}
+
+void main_1(constant buf0& x_10, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  float2 lin = 0.0f;
+  int v_1 = 0;
+  int param = 0;
+  tint_array_wrapper indexable = {};
+  float4 const x_63 = *(tint_symbol_6);
+  float2 const x_66 = x_10.resolution;
+  lin = (float2(x_63.x, x_63.y) / x_66);
+  float2 const x_68 = lin;
+  lin = floor((x_68 * 8.0f));
+  float const x_72 = lin.x;
+  float const x_76 = lin.y;
+  v_1 = ((int(x_72) * 8) + int(x_76));
+  int const x_79 = v_1;
+  param = x_79;
+  int const x_80 = collatz_i1_(&(param));
+  tint_array_wrapper const tint_symbol_4 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
+  indexable = tint_symbol_4;
+  float4 const x_83 = indexable.arr[(x_80 % 16)];
+  *(tint_symbol_7) = x_83;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_10 [[buffer(0)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_10, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-collatz-push-constant-with-nested-min-max/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-collatz-push-constant-with-nested-min-max/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..d892d09
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-collatz-push-constant-with-nested-min-max/0.wgsl.expected.spvasm
@@ -0,0 +1,200 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 137
+; Schema: 0
+               OpCapability Shader
+         %83 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %collatz_i1_ "collatz_i1_"
+               OpName %v "v"
+               OpName %count "count"
+               OpName %main_1 "main_1"
+               OpName %lin "lin"
+               OpName %v_1 "v_1"
+               OpName %param "param"
+               OpName %indexable "indexable"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v4float_uint_16 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %15 = OpTypeFunction %int %_ptr_Function_int
+         %22 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+      %int_2 = OpConstant %int 2
+       %void = OpTypeVoid
+         %57 = OpTypeFunction %void
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %63 = OpConstantNull %v2float
+       %uint = OpTypeInt 32 0
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+         %71 = OpConstantNull %_arr_v4float_uint_16
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_8 = OpConstant %float 8
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+      %int_8 = OpConstant %int 8
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+        %102 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+  %float_0_5 = OpConstant %float 0.5
+        %104 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+        %105 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+        %106 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+        %107 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+        %108 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+        %109 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+        %110 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+        %111 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %112 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+        %113 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+        %114 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+        %115 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+        %116 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+        %117 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+        %118 = OpConstantComposite %_arr_v4float_uint_16 %102 %104 %105 %106 %107 %108 %109 %110 %102 %111 %112 %113 %114 %115 %116 %117
+     %int_16 = OpConstant %int 16
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+   %main_out = OpTypeStruct %v4float
+        %124 = OpTypeFunction %void %main_out
+%collatz_i1_ = OpFunction %int None %15
+          %v = OpFunctionParameter %_ptr_Function_int
+         %20 = OpLabel
+      %count = OpVariable %_ptr_Function_int Function %22
+               OpStore %count %int_0
+               OpBranch %24
+         %24 = OpLabel
+               OpLoopMerge %25 %26 None
+               OpBranch %27
+         %27 = OpLabel
+         %29 = OpLoad %int %v
+         %31 = OpSGreaterThan %bool %29 %int_1
+               OpSelectionMerge %33 None
+               OpBranchConditional %31 %34 %35
+         %34 = OpLabel
+               OpBranch %33
+         %35 = OpLabel
+               OpBranch %25
+         %33 = OpLabel
+         %37 = OpLoad %int %v
+         %38 = OpBitwiseAnd %int %37 %int_1
+         %39 = OpIEqual %bool %38 %int_1
+               OpSelectionMerge %40 None
+               OpBranchConditional %39 %41 %42
+         %41 = OpLabel
+         %44 = OpLoad %int %v
+         %47 = OpIMul %int %int_3 %44
+         %48 = OpIAdd %int %47 %int_1
+               OpStore %v %48
+               OpBranch %40
+         %42 = OpLabel
+         %50 = OpLoad %int %v
+         %53 = OpSDiv %int %50 %int_2
+               OpStore %v %53
+               OpBranch %40
+         %40 = OpLabel
+         %54 = OpLoad %int %count
+         %55 = OpIAdd %int %54 %int_1
+               OpStore %count %55
+               OpBranch %26
+         %26 = OpLabel
+               OpBranch %24
+         %25 = OpLabel
+         %56 = OpLoad %int %count
+               OpReturnValue %56
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %57
+         %60 = OpLabel
+        %lin = OpVariable %_ptr_Function_v2float Function %63
+        %v_1 = OpVariable %_ptr_Function_int Function %22
+      %param = OpVariable %_ptr_Function_int Function %22
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_16 Function %71
+         %72 = OpLoad %v4float %gl_FragCoord
+         %75 = OpAccessChain %_ptr_Uniform_v2float %x_10 %uint_0
+         %76 = OpLoad %v2float %75
+         %77 = OpCompositeExtract %float %72 0
+         %78 = OpCompositeExtract %float %72 1
+         %79 = OpCompositeConstruct %v2float %77 %78
+         %80 = OpFDiv %v2float %79 %76
+               OpStore %lin %80
+         %81 = OpLoad %v2float %lin
+         %85 = OpVectorTimesScalar %v2float %81 %float_8
+         %82 = OpExtInst %v2float %83 Floor %85
+               OpStore %lin %82
+         %87 = OpAccessChain %_ptr_Function_float %lin %uint_0
+         %88 = OpLoad %float %87
+         %90 = OpAccessChain %_ptr_Function_float %lin %uint_1
+         %91 = OpLoad %float %90
+         %92 = OpConvertFToS %int %88
+         %94 = OpIMul %int %92 %int_8
+         %95 = OpConvertFToS %int %91
+         %96 = OpIAdd %int %94 %95
+               OpStore %v_1 %96
+         %97 = OpLoad %int %v_1
+               OpStore %param %97
+         %98 = OpFunctionCall %int %collatz_i1_ %param
+               OpStore %indexable %118
+        %120 = OpSMod %int %98 %int_16
+        %122 = OpAccessChain %_ptr_Function_v4float %indexable %120
+        %123 = OpLoad %v4float %122
+               OpStore %x_GLF_color %123
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %124
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %128 = OpLabel
+        %129 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %129
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %57
+        %131 = OpLabel
+        %132 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %132
+        %133 = OpFunctionCall %void %main_1
+        %135 = OpLoad %v4float %x_GLF_color
+        %136 = OpCompositeConstruct %main_out %135
+        %134 = OpFunctionCall %void %tint_symbol_3 %136
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-collatz-push-constant-with-nested-min-max/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-collatz-push-constant-with-nested-min-max/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..10f5505
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-collatz-push-constant-with-nested-min-max/0.wgsl.expected.wgsl
@@ -0,0 +1,68 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn collatz_i1_(v : ptr<function, i32>) -> i32 {
+  var count : i32;
+  count = 0;
+  loop {
+    let x_89 : i32 = *(v);
+    if ((x_89 > 1)) {
+    } else {
+      break;
+    }
+    let x_92 : i32 = *(v);
+    if (((x_92 & 1) == 1)) {
+      let x_98 : i32 = *(v);
+      *(v) = ((3 * x_98) + 1);
+    } else {
+      let x_101 : i32 = *(v);
+      *(v) = (x_101 / 2);
+    }
+    let x_103 : i32 = count;
+    count = (x_103 + 1);
+  }
+  let x_105 : i32 = count;
+  return x_105;
+}
+
+fn main_1() {
+  var lin : vec2<f32>;
+  var v_1 : i32;
+  var param : i32;
+  var indexable : array<vec4<f32>, 16>;
+  let x_63 : vec4<f32> = gl_FragCoord;
+  let x_66 : vec2<f32> = x_10.resolution;
+  lin = (vec2<f32>(x_63.x, x_63.y) / x_66);
+  let x_68 : vec2<f32> = lin;
+  lin = floor((x_68 * 8.0));
+  let x_72 : f32 = lin.x;
+  let x_76 : f32 = lin.y;
+  v_1 = ((i32(x_72) * 8) + i32(x_76));
+  let x_79 : i32 = v_1;
+  param = x_79;
+  let x_80 : i32 = collatz_i1_(&(param));
+  indexable = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+  let x_83 : vec4<f32> = indexable[(x_80 % 16)];
+  x_GLF_color = x_83;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-double-always-false-discard/1.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-double-always-false-discard/1.spvasm
new file mode 100644
index 0000000..9c84386
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-double-always-false-discard/1.spvasm
@@ -0,0 +1,263 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %c "c"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %__0 ""
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+ %float_n0_5 = OpConstant %float -0.5
+        %int = OpTypeInt 32 1
+      %int_1 = OpConstant %int 1
+    %int_800 = OpConstant %int 800
+       %bool = OpTypeBool
+     %int_32 = OpConstant %int 32
+      %int_0 = OpConstant %int 0
+%float_0_400000006 = OpConstant %float 0.400000006
+%float_0_00999999978 = OpConstant %float 0.00999999978
+  %float_100 = OpConstant %float 100
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+    %float_7 = OpConstant %float 7
+    %float_8 = OpConstant %float 8
+    %float_9 = OpConstant %float 9
+         %35 = OpConstantComposite %v3float %float_7 %float_8 %float_9
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+%_ptr_Input_float = OpTypePointer Input %float
+     %uint_2 = OpConstant %uint 2
+      %int_3 = OpConstant %int 3
+    %float_1 = OpConstant %float 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+      %false = OpConstantFalse %bool
+       %true = OpConstantTrue %bool
+         %46 = OpUndef %float
+%float_0_125 = OpConstant %float 0.125
+       %main = OpFunction %void None %11
+         %48 = OpLabel
+          %c = OpVariable %_ptr_Function_v3float Function
+               OpStore %c %35
+         %49 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %uint_0
+         %50 = OpLoad %float %49
+         %51 = OpFMul %float %50 %float_0_125
+         %52 = OpExtInst %float %1 Round %51
+         %53 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %54 = OpLoad %float %53
+               OpSelectionMerge %55 None
+               OpSwitch %uint_0 %56
+         %56 = OpLabel
+               OpBranch %57
+         %57 = OpLabel
+         %58 = OpPhi %float %float_n0_5 %56 %59 %60
+         %61 = OpPhi %int %int_1 %56 %62 %60
+         %63 = OpSLessThan %bool %61 %int_800
+               OpLoopMerge %64 %60 None
+               OpBranchConditional %63 %65 %64
+         %65 = OpLabel
+         %66 = OpSMod %int %61 %int_32
+         %67 = OpIEqual %bool %66 %int_0
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %70
+         %69 = OpLabel
+         %71 = OpFAdd %float %58 %float_0_400000006
+               OpBranch %68
+         %70 = OpLabel
+         %72 = OpConvertSToF %float %61
+         %73 = OpExtInst %float %1 Round %52
+         %74 = OpFMod %float %72 %73
+         %75 = OpFOrdLessThanEqual %bool %74 %float_0_00999999978
+               OpSelectionMerge %76 None
+               OpBranchConditional %75 %77 %76
+         %77 = OpLabel
+         %78 = OpFAdd %float %58 %float_100
+               OpBranch %76
+         %76 = OpLabel
+         %79 = OpPhi %float %58 %70 %78 %77
+         %80 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %81 = OpLoad %float %80
+         %82 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %83 = OpLoad %float %82
+         %84 = OpFOrdGreaterThan %bool %81 %83
+               OpSelectionMerge %85 None
+               OpBranchConditional %84 %86 %85
+         %86 = OpLabel
+               OpKill
+         %85 = OpLabel
+               OpBranch %68
+         %68 = OpLabel
+         %59 = OpPhi %float %71 %69 %79 %85
+         %87 = OpConvertSToF %float %61
+         %88 = OpFOrdGreaterThanEqual %bool %87 %54
+               OpSelectionMerge %89 None
+               OpBranchConditional %88 %90 %89
+         %90 = OpLabel
+               OpBranch %64
+         %89 = OpLabel
+               OpBranch %60
+         %60 = OpLabel
+         %62 = OpIAdd %int %61 %int_1
+               OpBranch %57
+         %64 = OpLabel
+         %91 = OpPhi %float %46 %57 %59 %90
+         %92 = OpPhi %float %58 %57 %59 %90
+         %93 = OpPhi %bool %false %57 %true %90
+               OpSelectionMerge %94 None
+               OpBranchConditional %93 %55 %94
+         %94 = OpLabel
+               OpBranch %55
+         %55 = OpLabel
+         %95 = OpPhi %float %91 %64 %92 %94
+         %96 = OpAccessChain %_ptr_Function_float %c %uint_0
+               OpStore %96 %95
+         %97 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %98 = OpLoad %float %97
+               OpSelectionMerge %99 None
+               OpSwitch %uint_0 %100
+        %100 = OpLabel
+               OpBranch %101
+        %101 = OpLabel
+        %102 = OpPhi %float %float_n0_5 %100 %103 %104
+        %105 = OpPhi %int %int_1 %100 %106 %104
+        %107 = OpSLessThan %bool %105 %int_800
+               OpLoopMerge %108 %104 None
+               OpBranchConditional %107 %109 %108
+        %109 = OpLabel
+        %110 = OpSMod %int %105 %int_32
+        %111 = OpIEqual %bool %110 %int_0
+               OpSelectionMerge %112 None
+               OpBranchConditional %111 %113 %114
+        %113 = OpLabel
+        %115 = OpFAdd %float %102 %float_0_400000006
+               OpBranch %112
+        %114 = OpLabel
+        %116 = OpConvertSToF %float %105
+        %117 = OpExtInst %float %1 Round %52
+        %118 = OpFMod %float %116 %117
+        %119 = OpFOrdLessThanEqual %bool %118 %float_0_00999999978
+               OpSelectionMerge %120 None
+               OpBranchConditional %119 %121 %120
+        %121 = OpLabel
+        %122 = OpFAdd %float %102 %float_100
+               OpBranch %120
+        %120 = OpLabel
+        %123 = OpPhi %float %102 %114 %122 %121
+        %124 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+        %125 = OpLoad %float %124
+        %126 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+        %127 = OpLoad %float %126
+        %128 = OpFOrdGreaterThan %bool %125 %127
+               OpSelectionMerge %129 None
+               OpBranchConditional %128 %130 %129
+        %130 = OpLabel
+               OpKill
+        %129 = OpLabel
+               OpBranch %112
+        %112 = OpLabel
+        %103 = OpPhi %float %115 %113 %123 %129
+        %131 = OpConvertSToF %float %105
+        %132 = OpFOrdGreaterThanEqual %bool %131 %98
+               OpSelectionMerge %133 None
+               OpBranchConditional %132 %134 %133
+        %134 = OpLabel
+               OpBranch %108
+        %133 = OpLabel
+               OpBranch %104
+        %104 = OpLabel
+        %106 = OpIAdd %int %105 %int_1
+               OpBranch %101
+        %108 = OpLabel
+        %135 = OpPhi %float %46 %101 %103 %134
+        %136 = OpPhi %float %102 %101 %103 %134
+        %137 = OpPhi %bool %false %101 %true %134
+               OpSelectionMerge %138 None
+               OpBranchConditional %137 %99 %138
+        %138 = OpLabel
+               OpBranch %99
+         %99 = OpLabel
+        %139 = OpPhi %float %135 %108 %136 %138
+        %140 = OpAccessChain %_ptr_Function_float %c %uint_1
+               OpStore %140 %139
+        %141 = OpLoad %float %96
+        %142 = OpLoad %float %140
+        %143 = OpFAdd %float %141 %142
+        %144 = OpAccessChain %_ptr_Function_float %c %uint_2
+               OpStore %144 %143
+               OpBranch %145
+        %145 = OpLabel
+        %146 = OpPhi %int %int_0 %99 %147 %148
+        %149 = OpSLessThan %bool %146 %int_3
+               OpLoopMerge %150 %148 None
+               OpBranchConditional %149 %151 %150
+        %151 = OpLabel
+        %152 = OpAccessChain %_ptr_Function_float %c %146
+        %153 = OpLoad %float %152
+        %154 = OpFOrdGreaterThanEqual %bool %153 %float_1
+               OpSelectionMerge %155 None
+               OpBranchConditional %154 %156 %155
+        %156 = OpLabel
+        %157 = OpLoad %float %152
+        %158 = OpLoad %float %152
+        %159 = OpFMul %float %157 %158
+               OpStore %152 %159
+        %160 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+        %161 = OpLoad %float %160
+        %162 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+        %163 = OpLoad %float %162
+        %164 = OpFOrdGreaterThan %bool %161 %163
+               OpSelectionMerge %165 None
+               OpBranchConditional %164 %166 %165
+        %166 = OpLabel
+               OpKill
+        %165 = OpLabel
+               OpBranch %155
+        %155 = OpLabel
+               OpBranch %148
+        %148 = OpLabel
+        %147 = OpIAdd %int %146 %int_1
+               OpBranch %145
+        %150 = OpLabel
+        %167 = OpLoad %v3float %c
+        %168 = OpExtInst %v3float %1 FAbs %167
+        %169 = OpExtInst %v3float %1 Normalize %168
+        %170 = OpCompositeExtract %float %169 0
+        %171 = OpCompositeExtract %float %169 1
+        %172 = OpCompositeExtract %float %169 2
+        %173 = OpCompositeConstruct %v4float %170 %171 %172 %float_1
+               OpStore %_GLF_color %173
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-double-always-false-discard/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-double-always-false-discard/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..1b409b0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-double-always-false-discard/1.spvasm.expected.hlsl
@@ -0,0 +1,220 @@
+void set_float3(inout float3 vec, int idx, float val) {
+  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
+}
+
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[1];
+};
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float3 c = float3(0.0f, 0.0f, 0.0f);
+  float x_54 = 0.0f;
+  float x_58 = 0.0f;
+  float x_59 = 0.0f;
+  float x_91 = 0.0f;
+  float x_92 = 0.0f;
+  float x_135 = 0.0f;
+  float x_136 = 0.0f;
+  float x_58_phi = 0.0f;
+  int x_61_phi = 0;
+  float x_91_phi = 0.0f;
+  float x_92_phi = 0.0f;
+  bool x_93_phi = false;
+  float x_95_phi = 0.0f;
+  float x_139_phi = 0.0f;
+  int x_146_phi = 0;
+  c = float3(7.0f, 8.0f, 9.0f);
+  const float x_50 = asfloat(x_9[0].x);
+  const float x_52 = round((x_50 * 0.125f));
+  x_54 = gl_FragCoord.x;
+  switch(0u) {
+    default: {
+      x_58_phi = -0.5f;
+      x_61_phi = 1;
+      while (true) {
+        float x_71 = 0.0f;
+        float x_79 = 0.0f;
+        int x_62 = 0;
+        float x_59_phi = 0.0f;
+        x_58 = x_58_phi;
+        const int x_61 = x_61_phi;
+        x_91_phi = 0.0f;
+        x_92_phi = x_58;
+        x_93_phi = false;
+        if ((x_61 < 800)) {
+        } else {
+          break;
+        }
+        float x_78 = 0.0f;
+        float x_79_phi = 0.0f;
+        if (((x_61 % 32) == 0)) {
+          x_71 = (x_58 + 0.400000006f);
+          x_59_phi = x_71;
+        } else {
+          x_79_phi = x_58;
+          if (((float(x_61) % round(x_52)) <= 0.01f)) {
+            x_78 = (x_58 + 100.0f);
+            x_79_phi = x_78;
+          }
+          x_79 = x_79_phi;
+          const float x_81 = asfloat(x_6[0].x);
+          const float x_83 = asfloat(x_6[0].y);
+          if ((x_81 > x_83)) {
+            discard;
+          }
+          x_59_phi = x_79;
+        }
+        x_59 = x_59_phi;
+        if ((float(x_61) >= x_54)) {
+          x_91_phi = x_59;
+          x_92_phi = x_59;
+          x_93_phi = true;
+          break;
+        }
+        {
+          x_62 = (x_61 + 1);
+          x_58_phi = x_59;
+          x_61_phi = x_62;
+        }
+      }
+      x_91 = x_91_phi;
+      x_92 = x_92_phi;
+      const bool x_93 = x_93_phi;
+      x_95_phi = x_91;
+      if (x_93) {
+        break;
+      }
+      x_95_phi = x_92;
+      break;
+    }
+  }
+  float x_98 = 0.0f;
+  float x_102 = 0.0f;
+  float x_103 = 0.0f;
+  float x_102_phi = 0.0f;
+  int x_105_phi = 0;
+  float x_135_phi = 0.0f;
+  float x_136_phi = 0.0f;
+  bool x_137_phi = false;
+  const float x_95 = x_95_phi;
+  c.x = x_95;
+  x_98 = gl_FragCoord.y;
+  switch(0u) {
+    default: {
+      x_102_phi = -0.5f;
+      x_105_phi = 1;
+      while (true) {
+        float x_115 = 0.0f;
+        float x_123 = 0.0f;
+        int x_106 = 0;
+        float x_103_phi = 0.0f;
+        x_102 = x_102_phi;
+        const int x_105 = x_105_phi;
+        x_135_phi = 0.0f;
+        x_136_phi = x_102;
+        x_137_phi = false;
+        if ((x_105 < 800)) {
+        } else {
+          break;
+        }
+        float x_122 = 0.0f;
+        float x_123_phi = 0.0f;
+        if (((x_105 % 32) == 0)) {
+          x_115 = (x_102 + 0.400000006f);
+          x_103_phi = x_115;
+        } else {
+          x_123_phi = x_102;
+          if (((float(x_105) % round(x_52)) <= 0.01f)) {
+            x_122 = (x_102 + 100.0f);
+            x_123_phi = x_122;
+          }
+          x_123 = x_123_phi;
+          const float x_125 = asfloat(x_6[0].x);
+          const float x_127 = asfloat(x_6[0].y);
+          if ((x_125 > x_127)) {
+            discard;
+          }
+          x_103_phi = x_123;
+        }
+        x_103 = x_103_phi;
+        if ((float(x_105) >= x_98)) {
+          x_135_phi = x_103;
+          x_136_phi = x_103;
+          x_137_phi = true;
+          break;
+        }
+        {
+          x_106 = (x_105 + 1);
+          x_102_phi = x_103;
+          x_105_phi = x_106;
+        }
+      }
+      x_135 = x_135_phi;
+      x_136 = x_136_phi;
+      const bool x_137 = x_137_phi;
+      x_139_phi = x_135;
+      if (x_137) {
+        break;
+      }
+      x_139_phi = x_136;
+      break;
+    }
+  }
+  const float x_139 = x_139_phi;
+  c.y = x_139;
+  const float x_141 = c.x;
+  const float x_142 = c.y;
+  c.z = (x_141 + x_142);
+  x_146_phi = 0;
+  while (true) {
+    int x_147 = 0;
+    const int x_146 = x_146_phi;
+    if ((x_146 < 3)) {
+    } else {
+      break;
+    }
+    const int x_152_save = x_146;
+    const float x_153 = c[x_152_save];
+    if ((x_153 >= 1.0f)) {
+      const float x_157 = c[x_152_save];
+      const float x_158 = c[x_152_save];
+      set_float3(c, x_152_save, (x_157 * x_158));
+      const float x_161 = asfloat(x_6[0].x);
+      const float x_163 = asfloat(x_6[0].y);
+      if ((x_161 > x_163)) {
+        discard;
+      }
+    }
+    {
+      x_147 = (x_146 + 1);
+      x_146_phi = x_147;
+    }
+  }
+  const float3 x_169 = normalize(abs(c));
+  x_GLF_color = float4(x_169.x, x_169.y, x_169.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-double-always-false-discard/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-double-always-false-discard/1.spvasm.expected.msl
new file mode 100755
index 0000000..81d5bd8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-double-always-false-discard/1.spvasm.expected.msl
@@ -0,0 +1,226 @@
+SKIP: FAILED
+
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf1 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_9, constant buf1& x_6, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float3 c = 0.0f;
+  float x_54 = 0.0f;
+  float x_58 = 0.0f;
+  float x_59 = 0.0f;
+  float x_91 = 0.0f;
+  float x_92 = 0.0f;
+  float x_135 = 0.0f;
+  float x_136 = 0.0f;
+  float x_58_phi = 0.0f;
+  int x_61_phi = 0;
+  float x_91_phi = 0.0f;
+  float x_92_phi = 0.0f;
+  bool x_93_phi = false;
+  float x_95_phi = 0.0f;
+  float x_139_phi = 0.0f;
+  int x_146_phi = 0;
+  c = float3(7.0f, 8.0f, 9.0f);
+  float const x_50 = x_9.resolution.x;
+  float const x_52 = rint((x_50 * 0.125f));
+  x_54 = (*(tint_symbol_5)).x;
+  switch(0u) {
+    default: {
+      x_58_phi = -0.5f;
+      x_61_phi = 1;
+      while (true) {
+        float x_71 = 0.0f;
+        float x_79 = 0.0f;
+        int x_62 = 0;
+        float x_59_phi = 0.0f;
+        x_58 = x_58_phi;
+        int const x_61 = x_61_phi;
+        x_91_phi = 0.0f;
+        x_92_phi = x_58;
+        x_93_phi = false;
+        if ((x_61 < 800)) {
+        } else {
+          break;
+        }
+        float x_78 = 0.0f;
+        float x_79_phi = 0.0f;
+        if (((x_61 % 32) == 0)) {
+          x_71 = (x_58 + 0.400000006f);
+          x_59_phi = x_71;
+        } else {
+          x_79_phi = x_58;
+          if (((float(x_61) % rint(x_52)) <= 0.01f)) {
+            x_78 = (x_58 + 100.0f);
+            x_79_phi = x_78;
+          }
+          x_79 = x_79_phi;
+          float const x_81 = x_6.injectionSwitch.x;
+          float const x_83 = x_6.injectionSwitch.y;
+          if ((x_81 > x_83)) {
+            discard_fragment();
+          }
+          x_59_phi = x_79;
+        }
+        x_59 = x_59_phi;
+        if ((float(x_61) >= x_54)) {
+          x_91_phi = x_59;
+          x_92_phi = x_59;
+          x_93_phi = true;
+          break;
+        }
+        {
+          x_62 = (x_61 + 1);
+          x_58_phi = x_59;
+          x_61_phi = x_62;
+        }
+      }
+      x_91 = x_91_phi;
+      x_92 = x_92_phi;
+      bool const x_93 = x_93_phi;
+      x_95_phi = x_91;
+      if (x_93) {
+        break;
+      }
+      x_95_phi = x_92;
+      break;
+    }
+  }
+  float x_98 = 0.0f;
+  float x_102 = 0.0f;
+  float x_103 = 0.0f;
+  float x_102_phi = 0.0f;
+  int x_105_phi = 0;
+  float x_135_phi = 0.0f;
+  float x_136_phi = 0.0f;
+  bool x_137_phi = false;
+  float const x_95 = x_95_phi;
+  c.x = x_95;
+  x_98 = (*(tint_symbol_5)).y;
+  switch(0u) {
+    default: {
+      x_102_phi = -0.5f;
+      x_105_phi = 1;
+      while (true) {
+        float x_115 = 0.0f;
+        float x_123 = 0.0f;
+        int x_106 = 0;
+        float x_103_phi = 0.0f;
+        x_102 = x_102_phi;
+        int const x_105 = x_105_phi;
+        x_135_phi = 0.0f;
+        x_136_phi = x_102;
+        x_137_phi = false;
+        if ((x_105 < 800)) {
+        } else {
+          break;
+        }
+        float x_122 = 0.0f;
+        float x_123_phi = 0.0f;
+        if (((x_105 % 32) == 0)) {
+          x_115 = (x_102 + 0.400000006f);
+          x_103_phi = x_115;
+        } else {
+          x_123_phi = x_102;
+          if (((float(x_105) % rint(x_52)) <= 0.01f)) {
+            x_122 = (x_102 + 100.0f);
+            x_123_phi = x_122;
+          }
+          x_123 = x_123_phi;
+          float const x_125 = x_6.injectionSwitch.x;
+          float const x_127 = x_6.injectionSwitch.y;
+          if ((x_125 > x_127)) {
+            discard_fragment();
+          }
+          x_103_phi = x_123;
+        }
+        x_103 = x_103_phi;
+        if ((float(x_105) >= x_98)) {
+          x_135_phi = x_103;
+          x_136_phi = x_103;
+          x_137_phi = true;
+          break;
+        }
+        {
+          x_106 = (x_105 + 1);
+          x_102_phi = x_103;
+          x_105_phi = x_106;
+        }
+      }
+      x_135 = x_135_phi;
+      x_136 = x_136_phi;
+      bool const x_137 = x_137_phi;
+      x_139_phi = x_135;
+      if (x_137) {
+        break;
+      }
+      x_139_phi = x_136;
+      break;
+    }
+  }
+  float const x_139 = x_139_phi;
+  c.y = x_139;
+  float const x_141 = c.x;
+  float const x_142 = c.y;
+  c.z = (x_141 + x_142);
+  x_146_phi = 0;
+  while (true) {
+    int x_147 = 0;
+    int const x_146 = x_146_phi;
+    if ((x_146 < 3)) {
+    } else {
+      break;
+    }
+    int const x_152_save = x_146;
+    float const x_153 = c[x_152_save];
+    if ((x_153 >= 1.0f)) {
+      float const x_157 = c[x_152_save];
+      float const x_158 = c[x_152_save];
+      c[x_152_save] = (x_157 * x_158);
+      float const x_161 = x_6.injectionSwitch.x;
+      float const x_163 = x_6.injectionSwitch.y;
+      if ((x_161 > x_163)) {
+        discard_fragment();
+      }
+    }
+    {
+      x_147 = (x_146 + 1);
+      x_146_phi = x_147;
+    }
+  }
+  float3 const x_167 = c;
+  float3 const x_169 = normalize(fabs(x_167));
+  *(tint_symbol_6) = float4(x_169.x, x_169.y, x_169.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_9 [[buffer(0)]], constant buf1& x_6 [[buffer(1)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_9, x_6, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
+T:\tmp\u4dc.0.metal:63:29: error: invalid operands to binary expression ('float' and 'float')
+          if (((float(x_61) % rint(x_52)) <= 0.01f)) {
+                ~~~~~~~~~~~ ^ ~~~~~~~~~~
+T:\tmp\u4dc.0.metal:135:30: error: invalid operands to binary expression ('float' and 'float')
+          if (((float(x_105) % rint(x_52)) <= 0.01f)) {
+                ~~~~~~~~~~~~ ^ ~~~~~~~~~~
+2 errors generated.
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-double-always-false-discard/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-double-always-false-discard/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..585bfcd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-double-always-false-discard/1.spvasm.expected.spvasm
@@ -0,0 +1,490 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 278
+; Schema: 0
+               OpCapability Shader
+         %59 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_9 "x_9"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %c "c"
+               OpName %x_54 "x_54"
+               OpName %x_58 "x_58"
+               OpName %x_59 "x_59"
+               OpName %x_91 "x_91"
+               OpName %x_92 "x_92"
+               OpName %x_135 "x_135"
+               OpName %x_136 "x_136"
+               OpName %x_58_phi "x_58_phi"
+               OpName %x_61_phi "x_61_phi"
+               OpName %x_91_phi "x_91_phi"
+               OpName %x_92_phi "x_92_phi"
+               OpName %x_93_phi "x_93_phi"
+               OpName %x_95_phi "x_95_phi"
+               OpName %x_139_phi "x_139_phi"
+               OpName %x_146_phi "x_146_phi"
+               OpName %x_71 "x_71"
+               OpName %x_79 "x_79"
+               OpName %x_62 "x_62"
+               OpName %x_59_phi "x_59_phi"
+               OpName %x_78 "x_78"
+               OpName %x_79_phi "x_79_phi"
+               OpName %x_98 "x_98"
+               OpName %x_102 "x_102"
+               OpName %x_103 "x_103"
+               OpName %x_102_phi "x_102_phi"
+               OpName %x_105_phi "x_105_phi"
+               OpName %x_135_phi "x_135_phi"
+               OpName %x_136_phi "x_136_phi"
+               OpName %x_137_phi "x_137_phi"
+               OpName %x_115 "x_115"
+               OpName %x_123 "x_123"
+               OpName %x_106 "x_106"
+               OpName %x_103_phi "x_103_phi"
+               OpName %x_122 "x_122"
+               OpName %x_123_phi "x_123_phi"
+               OpName %x_147 "x_147"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %12
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %25 = OpConstantNull %v3float
+%_ptr_Function_float = OpTypePointer Function %float
+         %28 = OpConstantNull %float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %39 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %45 = OpConstantNull %bool
+    %float_7 = OpConstant %float 7
+    %float_8 = OpConstant %float 8
+    %float_9 = OpConstant %float 9
+         %52 = OpConstantComposite %v3float %float_7 %float_8 %float_9
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%float_0_125 = OpConstant %float 0.125
+%_ptr_Private_float = OpTypePointer Private %float
+ %float_n0_5 = OpConstant %float -0.5
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+      %false = OpConstantFalse %bool
+    %int_800 = OpConstant %int 800
+     %int_32 = OpConstant %int 32
+      %int_0 = OpConstant %int 0
+%float_0_400000006 = OpConstant %float 0.400000006
+%float_0_00999999978 = OpConstant %float 0.00999999978
+  %float_100 = OpConstant %float 100
+     %uint_1 = OpConstant %uint 1
+       %true = OpConstantTrue %bool
+     %uint_2 = OpConstant %uint 2
+      %int_3 = OpConstant %int 3
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %265 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %18
+         %21 = OpLabel
+          %c = OpVariable %_ptr_Function_v3float Function %25
+       %x_54 = OpVariable %_ptr_Function_float Function %28
+       %x_58 = OpVariable %_ptr_Function_float Function %28
+       %x_59 = OpVariable %_ptr_Function_float Function %28
+       %x_91 = OpVariable %_ptr_Function_float Function %28
+       %x_92 = OpVariable %_ptr_Function_float Function %28
+      %x_135 = OpVariable %_ptr_Function_float Function %28
+      %x_136 = OpVariable %_ptr_Function_float Function %28
+   %x_58_phi = OpVariable %_ptr_Function_float Function %28
+   %x_61_phi = OpVariable %_ptr_Function_int Function %39
+   %x_91_phi = OpVariable %_ptr_Function_float Function %28
+   %x_92_phi = OpVariable %_ptr_Function_float Function %28
+   %x_93_phi = OpVariable %_ptr_Function_bool Function %45
+   %x_95_phi = OpVariable %_ptr_Function_float Function %28
+  %x_139_phi = OpVariable %_ptr_Function_float Function %28
+  %x_146_phi = OpVariable %_ptr_Function_int Function %39
+       %x_71 = OpVariable %_ptr_Function_float Function %28
+       %x_79 = OpVariable %_ptr_Function_float Function %28
+       %x_62 = OpVariable %_ptr_Function_int Function %39
+   %x_59_phi = OpVariable %_ptr_Function_float Function %28
+       %x_78 = OpVariable %_ptr_Function_float Function %28
+   %x_79_phi = OpVariable %_ptr_Function_float Function %28
+       %x_98 = OpVariable %_ptr_Function_float Function %28
+      %x_102 = OpVariable %_ptr_Function_float Function %28
+      %x_103 = OpVariable %_ptr_Function_float Function %28
+  %x_102_phi = OpVariable %_ptr_Function_float Function %28
+  %x_105_phi = OpVariable %_ptr_Function_int Function %39
+  %x_135_phi = OpVariable %_ptr_Function_float Function %28
+  %x_136_phi = OpVariable %_ptr_Function_float Function %28
+  %x_137_phi = OpVariable %_ptr_Function_bool Function %45
+      %x_115 = OpVariable %_ptr_Function_float Function %28
+      %x_123 = OpVariable %_ptr_Function_float Function %28
+      %x_106 = OpVariable %_ptr_Function_int Function %39
+  %x_103_phi = OpVariable %_ptr_Function_float Function %28
+      %x_122 = OpVariable %_ptr_Function_float Function %28
+  %x_123_phi = OpVariable %_ptr_Function_float Function %28
+      %x_147 = OpVariable %_ptr_Function_int Function %39
+               OpStore %c %52
+         %56 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_0
+         %57 = OpLoad %float %56
+         %61 = OpFMul %float %57 %float_0_125
+         %58 = OpExtInst %float %59 RoundEven %61
+         %63 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %64 = OpLoad %float %63
+               OpStore %x_54 %64
+               OpSelectionMerge %65 None
+               OpSwitch %uint_0 %66
+         %66 = OpLabel
+               OpStore %x_58_phi %float_n0_5
+               OpStore %x_61_phi %int_1
+               OpBranch %69
+         %69 = OpLabel
+               OpLoopMerge %70 %71 None
+               OpBranch %72
+         %72 = OpLabel
+         %77 = OpLoad %float %x_58_phi
+               OpStore %x_58 %77
+         %78 = OpLoad %int %x_61_phi
+               OpStore %x_91_phi %float_0
+         %80 = OpLoad %float %x_58
+               OpStore %x_92_phi %80
+               OpStore %x_93_phi %false
+         %83 = OpSLessThan %bool %78 %int_800
+               OpSelectionMerge %84 None
+               OpBranchConditional %83 %85 %86
+         %85 = OpLabel
+               OpBranch %84
+         %86 = OpLabel
+               OpBranch %70
+         %84 = OpLabel
+         %90 = OpSMod %int %78 %int_32
+         %92 = OpIEqual %bool %90 %int_0
+               OpSelectionMerge %93 None
+               OpBranchConditional %92 %94 %95
+         %94 = OpLabel
+         %96 = OpLoad %float %x_58
+         %98 = OpFAdd %float %96 %float_0_400000006
+               OpStore %x_71 %98
+         %99 = OpLoad %float %x_71
+               OpStore %x_59_phi %99
+               OpBranch %93
+         %95 = OpLabel
+        %100 = OpLoad %float %x_58
+               OpStore %x_79_phi %100
+        %101 = OpConvertSToF %float %78
+        %102 = OpExtInst %float %59 RoundEven %58
+        %103 = OpFMod %float %101 %102
+        %105 = OpFOrdLessThanEqual %bool %103 %float_0_00999999978
+               OpSelectionMerge %106 None
+               OpBranchConditional %105 %107 %106
+        %107 = OpLabel
+        %108 = OpLoad %float %x_58
+        %110 = OpFAdd %float %108 %float_100
+               OpStore %x_78 %110
+        %111 = OpLoad %float %x_78
+               OpStore %x_79_phi %111
+               OpBranch %106
+        %106 = OpLabel
+        %112 = OpLoad %float %x_79_phi
+               OpStore %x_79 %112
+        %113 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+        %114 = OpLoad %float %113
+        %116 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+        %117 = OpLoad %float %116
+        %118 = OpFOrdGreaterThan %bool %114 %117
+               OpSelectionMerge %119 None
+               OpBranchConditional %118 %120 %119
+        %120 = OpLabel
+               OpKill
+        %119 = OpLabel
+        %121 = OpLoad %float %x_79
+               OpStore %x_59_phi %121
+               OpBranch %93
+         %93 = OpLabel
+        %122 = OpLoad %float %x_59_phi
+               OpStore %x_59 %122
+        %123 = OpConvertSToF %float %78
+        %124 = OpLoad %float %x_54
+        %125 = OpFOrdGreaterThanEqual %bool %123 %124
+               OpSelectionMerge %126 None
+               OpBranchConditional %125 %127 %126
+        %127 = OpLabel
+        %128 = OpLoad %float %x_59
+               OpStore %x_91_phi %128
+        %129 = OpLoad %float %x_59
+               OpStore %x_92_phi %129
+               OpStore %x_93_phi %true
+               OpBranch %70
+        %126 = OpLabel
+               OpBranch %71
+         %71 = OpLabel
+        %131 = OpIAdd %int %78 %int_1
+               OpStore %x_62 %131
+        %132 = OpLoad %float %x_59
+               OpStore %x_58_phi %132
+        %133 = OpLoad %int %x_62
+               OpStore %x_61_phi %133
+               OpBranch %69
+         %70 = OpLabel
+        %134 = OpLoad %float %x_91_phi
+               OpStore %x_91 %134
+        %135 = OpLoad %float %x_92_phi
+               OpStore %x_92 %135
+        %136 = OpLoad %bool %x_93_phi
+        %137 = OpLoad %float %x_91
+               OpStore %x_95_phi %137
+               OpSelectionMerge %138 None
+               OpBranchConditional %136 %139 %138
+        %139 = OpLabel
+               OpBranch %65
+        %138 = OpLabel
+        %140 = OpLoad %float %x_92
+               OpStore %x_95_phi %140
+               OpBranch %65
+         %65 = OpLabel
+        %149 = OpLoad %float %x_95_phi
+        %150 = OpAccessChain %_ptr_Function_float %c %uint_0
+               OpStore %150 %149
+        %151 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %152 = OpLoad %float %151
+               OpStore %x_98 %152
+               OpSelectionMerge %153 None
+               OpSwitch %uint_0 %154
+        %154 = OpLabel
+               OpStore %x_102_phi %float_n0_5
+               OpStore %x_105_phi %int_1
+               OpBranch %155
+        %155 = OpLabel
+               OpLoopMerge %156 %157 None
+               OpBranch %158
+        %158 = OpLabel
+        %163 = OpLoad %float %x_102_phi
+               OpStore %x_102 %163
+        %164 = OpLoad %int %x_105_phi
+               OpStore %x_135_phi %float_0
+        %165 = OpLoad %float %x_102
+               OpStore %x_136_phi %165
+               OpStore %x_137_phi %false
+        %166 = OpSLessThan %bool %164 %int_800
+               OpSelectionMerge %167 None
+               OpBranchConditional %166 %168 %169
+        %168 = OpLabel
+               OpBranch %167
+        %169 = OpLabel
+               OpBranch %156
+        %167 = OpLabel
+        %172 = OpSMod %int %164 %int_32
+        %173 = OpIEqual %bool %172 %int_0
+               OpSelectionMerge %174 None
+               OpBranchConditional %173 %175 %176
+        %175 = OpLabel
+        %177 = OpLoad %float %x_102
+        %178 = OpFAdd %float %177 %float_0_400000006
+               OpStore %x_115 %178
+        %179 = OpLoad %float %x_115
+               OpStore %x_103_phi %179
+               OpBranch %174
+        %176 = OpLabel
+        %180 = OpLoad %float %x_102
+               OpStore %x_123_phi %180
+        %181 = OpConvertSToF %float %164
+        %182 = OpExtInst %float %59 RoundEven %58
+        %183 = OpFMod %float %181 %182
+        %184 = OpFOrdLessThanEqual %bool %183 %float_0_00999999978
+               OpSelectionMerge %185 None
+               OpBranchConditional %184 %186 %185
+        %186 = OpLabel
+        %187 = OpLoad %float %x_102
+        %188 = OpFAdd %float %187 %float_100
+               OpStore %x_122 %188
+        %189 = OpLoad %float %x_122
+               OpStore %x_123_phi %189
+               OpBranch %185
+        %185 = OpLabel
+        %190 = OpLoad %float %x_123_phi
+               OpStore %x_123 %190
+        %191 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+        %192 = OpLoad %float %191
+        %193 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+        %194 = OpLoad %float %193
+        %195 = OpFOrdGreaterThan %bool %192 %194
+               OpSelectionMerge %196 None
+               OpBranchConditional %195 %197 %196
+        %197 = OpLabel
+               OpKill
+        %196 = OpLabel
+        %198 = OpLoad %float %x_123
+               OpStore %x_103_phi %198
+               OpBranch %174
+        %174 = OpLabel
+        %199 = OpLoad %float %x_103_phi
+               OpStore %x_103 %199
+        %200 = OpConvertSToF %float %164
+        %201 = OpLoad %float %x_98
+        %202 = OpFOrdGreaterThanEqual %bool %200 %201
+               OpSelectionMerge %203 None
+               OpBranchConditional %202 %204 %203
+        %204 = OpLabel
+        %205 = OpLoad %float %x_103
+               OpStore %x_135_phi %205
+        %206 = OpLoad %float %x_103
+               OpStore %x_136_phi %206
+               OpStore %x_137_phi %true
+               OpBranch %156
+        %203 = OpLabel
+               OpBranch %157
+        %157 = OpLabel
+        %207 = OpIAdd %int %164 %int_1
+               OpStore %x_106 %207
+        %208 = OpLoad %float %x_103
+               OpStore %x_102_phi %208
+        %209 = OpLoad %int %x_106
+               OpStore %x_105_phi %209
+               OpBranch %155
+        %156 = OpLabel
+        %210 = OpLoad %float %x_135_phi
+               OpStore %x_135 %210
+        %211 = OpLoad %float %x_136_phi
+               OpStore %x_136 %211
+        %212 = OpLoad %bool %x_137_phi
+        %213 = OpLoad %float %x_135
+               OpStore %x_139_phi %213
+               OpSelectionMerge %214 None
+               OpBranchConditional %212 %215 %214
+        %215 = OpLabel
+               OpBranch %153
+        %214 = OpLabel
+        %216 = OpLoad %float %x_136
+               OpStore %x_139_phi %216
+               OpBranch %153
+        %153 = OpLabel
+        %217 = OpLoad %float %x_139_phi
+        %218 = OpAccessChain %_ptr_Function_float %c %uint_1
+               OpStore %218 %217
+        %219 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %220 = OpLoad %float %219
+        %221 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %222 = OpLoad %float %221
+        %224 = OpAccessChain %_ptr_Function_float %c %uint_2
+        %225 = OpFAdd %float %220 %222
+               OpStore %224 %225
+               OpStore %x_146_phi %int_0
+               OpBranch %226
+        %226 = OpLabel
+               OpLoopMerge %227 %228 None
+               OpBranch %229
+        %229 = OpLabel
+        %231 = OpLoad %int %x_146_phi
+        %233 = OpSLessThan %bool %231 %int_3
+               OpSelectionMerge %234 None
+               OpBranchConditional %233 %235 %236
+        %235 = OpLabel
+               OpBranch %234
+        %236 = OpLabel
+               OpBranch %227
+        %234 = OpLabel
+        %237 = OpAccessChain %_ptr_Function_float %c %231
+        %238 = OpLoad %float %237
+        %240 = OpFOrdGreaterThanEqual %bool %238 %float_1
+               OpSelectionMerge %241 None
+               OpBranchConditional %240 %242 %241
+        %242 = OpLabel
+        %243 = OpAccessChain %_ptr_Function_float %c %231
+        %244 = OpLoad %float %243
+        %245 = OpAccessChain %_ptr_Function_float %c %231
+        %246 = OpLoad %float %245
+        %247 = OpAccessChain %_ptr_Function_float %c %231
+        %248 = OpFMul %float %244 %246
+               OpStore %247 %248
+        %249 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+        %250 = OpLoad %float %249
+        %251 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+        %252 = OpLoad %float %251
+        %253 = OpFOrdGreaterThan %bool %250 %252
+               OpSelectionMerge %254 None
+               OpBranchConditional %253 %255 %254
+        %255 = OpLabel
+               OpKill
+        %254 = OpLabel
+               OpBranch %241
+        %241 = OpLabel
+               OpBranch %228
+        %228 = OpLabel
+        %256 = OpIAdd %int %231 %int_1
+               OpStore %x_147 %256
+        %257 = OpLoad %int %x_147
+               OpStore %x_146_phi %257
+               OpBranch %226
+        %227 = OpLabel
+        %258 = OpLoad %v3float %c
+        %260 = OpExtInst %v3float %59 FAbs %258
+        %259 = OpExtInst %v3float %59 Normalize %260
+        %261 = OpCompositeExtract %float %259 0
+        %262 = OpCompositeExtract %float %259 1
+        %263 = OpCompositeExtract %float %259 2
+        %264 = OpCompositeConstruct %v4float %261 %262 %263 %float_1
+               OpStore %x_GLF_color %264
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %265
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %269 = OpLabel
+        %270 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %270
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %18
+        %272 = OpLabel
+        %273 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %273
+        %274 = OpFunctionCall %void %main_1
+        %276 = OpLoad %v4float %x_GLF_color
+        %277 = OpCompositeConstruct %main_out %276
+        %275 = OpFunctionCall %void %tint_symbol_3 %277
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-double-always-false-discard/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-double-always-false-discard/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..5688188
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-double-always-false-discard/1.spvasm.expected.wgsl
@@ -0,0 +1,222 @@
+[[block]]
+struct buf1 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var c : vec3<f32>;
+  var x_54 : f32;
+  var x_58 : f32;
+  var x_59 : f32;
+  var x_91 : f32;
+  var x_92 : f32;
+  var x_135 : f32;
+  var x_136 : f32;
+  var x_58_phi : f32;
+  var x_61_phi : i32;
+  var x_91_phi : f32;
+  var x_92_phi : f32;
+  var x_93_phi : bool;
+  var x_95_phi : f32;
+  var x_139_phi : f32;
+  var x_146_phi : i32;
+  c = vec3<f32>(7.0, 8.0, 9.0);
+  let x_50 : f32 = x_9.resolution.x;
+  let x_52 : f32 = round((x_50 * 0.125));
+  x_54 = gl_FragCoord.x;
+  switch(0u) {
+    default: {
+      x_58_phi = -0.5;
+      x_61_phi = 1;
+      loop {
+        var x_71 : f32;
+        var x_79 : f32;
+        var x_62 : i32;
+        var x_59_phi : f32;
+        x_58 = x_58_phi;
+        let x_61 : i32 = x_61_phi;
+        x_91_phi = 0.0;
+        x_92_phi = x_58;
+        x_93_phi = false;
+        if ((x_61 < 800)) {
+        } else {
+          break;
+        }
+        var x_78 : f32;
+        var x_79_phi : f32;
+        if (((x_61 % 32) == 0)) {
+          x_71 = (x_58 + 0.400000006);
+          x_59_phi = x_71;
+        } else {
+          x_79_phi = x_58;
+          if (((f32(x_61) % round(x_52)) <= 0.01)) {
+            x_78 = (x_58 + 100.0);
+            x_79_phi = x_78;
+          }
+          x_79 = x_79_phi;
+          let x_81 : f32 = x_6.injectionSwitch.x;
+          let x_83 : f32 = x_6.injectionSwitch.y;
+          if ((x_81 > x_83)) {
+            discard;
+          }
+          x_59_phi = x_79;
+        }
+        x_59 = x_59_phi;
+        if ((f32(x_61) >= x_54)) {
+          x_91_phi = x_59;
+          x_92_phi = x_59;
+          x_93_phi = true;
+          break;
+        }
+
+        continuing {
+          x_62 = (x_61 + 1);
+          x_58_phi = x_59;
+          x_61_phi = x_62;
+        }
+      }
+      x_91 = x_91_phi;
+      x_92 = x_92_phi;
+      let x_93 : bool = x_93_phi;
+      x_95_phi = x_91;
+      if (x_93) {
+        break;
+      }
+      x_95_phi = x_92;
+    }
+  }
+  var x_98 : f32;
+  var x_102 : f32;
+  var x_103 : f32;
+  var x_102_phi : f32;
+  var x_105_phi : i32;
+  var x_135_phi : f32;
+  var x_136_phi : f32;
+  var x_137_phi : bool;
+  let x_95 : f32 = x_95_phi;
+  let x_96 : ptr<function, f32> = &(c.x);
+  *(x_96) = x_95;
+  x_98 = gl_FragCoord.y;
+  switch(0u) {
+    default: {
+      x_102_phi = -0.5;
+      x_105_phi = 1;
+      loop {
+        var x_115 : f32;
+        var x_123 : f32;
+        var x_106 : i32;
+        var x_103_phi : f32;
+        x_102 = x_102_phi;
+        let x_105 : i32 = x_105_phi;
+        x_135_phi = 0.0;
+        x_136_phi = x_102;
+        x_137_phi = false;
+        if ((x_105 < 800)) {
+        } else {
+          break;
+        }
+        var x_122 : f32;
+        var x_123_phi : f32;
+        if (((x_105 % 32) == 0)) {
+          x_115 = (x_102 + 0.400000006);
+          x_103_phi = x_115;
+        } else {
+          x_123_phi = x_102;
+          if (((f32(x_105) % round(x_52)) <= 0.01)) {
+            x_122 = (x_102 + 100.0);
+            x_123_phi = x_122;
+          }
+          x_123 = x_123_phi;
+          let x_125 : f32 = x_6.injectionSwitch.x;
+          let x_127 : f32 = x_6.injectionSwitch.y;
+          if ((x_125 > x_127)) {
+            discard;
+          }
+          x_103_phi = x_123;
+        }
+        x_103 = x_103_phi;
+        if ((f32(x_105) >= x_98)) {
+          x_135_phi = x_103;
+          x_136_phi = x_103;
+          x_137_phi = true;
+          break;
+        }
+
+        continuing {
+          x_106 = (x_105 + 1);
+          x_102_phi = x_103;
+          x_105_phi = x_106;
+        }
+      }
+      x_135 = x_135_phi;
+      x_136 = x_136_phi;
+      let x_137 : bool = x_137_phi;
+      x_139_phi = x_135;
+      if (x_137) {
+        break;
+      }
+      x_139_phi = x_136;
+    }
+  }
+  let x_139 : f32 = x_139_phi;
+  let x_140 : ptr<function, f32> = &(c.y);
+  *(x_140) = x_139;
+  let x_141 : f32 = *(x_96);
+  let x_142 : f32 = *(x_140);
+  c.z = (x_141 + x_142);
+  x_146_phi = 0;
+  loop {
+    var x_147 : i32;
+    let x_146 : i32 = x_146_phi;
+    if ((x_146 < 3)) {
+    } else {
+      break;
+    }
+    let x_152 : ptr<function, f32> = &(c[x_146]);
+    let x_153 : f32 = *(x_152);
+    if ((x_153 >= 1.0)) {
+      let x_157 : f32 = *(x_152);
+      let x_158 : f32 = *(x_152);
+      *(x_152) = (x_157 * x_158);
+      let x_161 : f32 = x_6.injectionSwitch.x;
+      let x_163 : f32 = x_6.injectionSwitch.y;
+      if ((x_161 > x_163)) {
+        discard;
+      }
+    }
+
+    continuing {
+      x_147 = (x_146 + 1);
+      x_146_phi = x_147;
+    }
+  }
+  let x_167 : vec3<f32> = c;
+  let x_169 : vec3<f32> = normalize(abs(x_167));
+  x_GLF_color = vec4<f32>(x_169.x, x_169.y, x_169.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-double-always-false-discard/1.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-double-always-false-discard/1.wgsl
new file mode 100644
index 0000000..5688188
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-double-always-false-discard/1.wgsl
@@ -0,0 +1,222 @@
+[[block]]
+struct buf1 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var c : vec3<f32>;
+  var x_54 : f32;
+  var x_58 : f32;
+  var x_59 : f32;
+  var x_91 : f32;
+  var x_92 : f32;
+  var x_135 : f32;
+  var x_136 : f32;
+  var x_58_phi : f32;
+  var x_61_phi : i32;
+  var x_91_phi : f32;
+  var x_92_phi : f32;
+  var x_93_phi : bool;
+  var x_95_phi : f32;
+  var x_139_phi : f32;
+  var x_146_phi : i32;
+  c = vec3<f32>(7.0, 8.0, 9.0);
+  let x_50 : f32 = x_9.resolution.x;
+  let x_52 : f32 = round((x_50 * 0.125));
+  x_54 = gl_FragCoord.x;
+  switch(0u) {
+    default: {
+      x_58_phi = -0.5;
+      x_61_phi = 1;
+      loop {
+        var x_71 : f32;
+        var x_79 : f32;
+        var x_62 : i32;
+        var x_59_phi : f32;
+        x_58 = x_58_phi;
+        let x_61 : i32 = x_61_phi;
+        x_91_phi = 0.0;
+        x_92_phi = x_58;
+        x_93_phi = false;
+        if ((x_61 < 800)) {
+        } else {
+          break;
+        }
+        var x_78 : f32;
+        var x_79_phi : f32;
+        if (((x_61 % 32) == 0)) {
+          x_71 = (x_58 + 0.400000006);
+          x_59_phi = x_71;
+        } else {
+          x_79_phi = x_58;
+          if (((f32(x_61) % round(x_52)) <= 0.01)) {
+            x_78 = (x_58 + 100.0);
+            x_79_phi = x_78;
+          }
+          x_79 = x_79_phi;
+          let x_81 : f32 = x_6.injectionSwitch.x;
+          let x_83 : f32 = x_6.injectionSwitch.y;
+          if ((x_81 > x_83)) {
+            discard;
+          }
+          x_59_phi = x_79;
+        }
+        x_59 = x_59_phi;
+        if ((f32(x_61) >= x_54)) {
+          x_91_phi = x_59;
+          x_92_phi = x_59;
+          x_93_phi = true;
+          break;
+        }
+
+        continuing {
+          x_62 = (x_61 + 1);
+          x_58_phi = x_59;
+          x_61_phi = x_62;
+        }
+      }
+      x_91 = x_91_phi;
+      x_92 = x_92_phi;
+      let x_93 : bool = x_93_phi;
+      x_95_phi = x_91;
+      if (x_93) {
+        break;
+      }
+      x_95_phi = x_92;
+    }
+  }
+  var x_98 : f32;
+  var x_102 : f32;
+  var x_103 : f32;
+  var x_102_phi : f32;
+  var x_105_phi : i32;
+  var x_135_phi : f32;
+  var x_136_phi : f32;
+  var x_137_phi : bool;
+  let x_95 : f32 = x_95_phi;
+  let x_96 : ptr<function, f32> = &(c.x);
+  *(x_96) = x_95;
+  x_98 = gl_FragCoord.y;
+  switch(0u) {
+    default: {
+      x_102_phi = -0.5;
+      x_105_phi = 1;
+      loop {
+        var x_115 : f32;
+        var x_123 : f32;
+        var x_106 : i32;
+        var x_103_phi : f32;
+        x_102 = x_102_phi;
+        let x_105 : i32 = x_105_phi;
+        x_135_phi = 0.0;
+        x_136_phi = x_102;
+        x_137_phi = false;
+        if ((x_105 < 800)) {
+        } else {
+          break;
+        }
+        var x_122 : f32;
+        var x_123_phi : f32;
+        if (((x_105 % 32) == 0)) {
+          x_115 = (x_102 + 0.400000006);
+          x_103_phi = x_115;
+        } else {
+          x_123_phi = x_102;
+          if (((f32(x_105) % round(x_52)) <= 0.01)) {
+            x_122 = (x_102 + 100.0);
+            x_123_phi = x_122;
+          }
+          x_123 = x_123_phi;
+          let x_125 : f32 = x_6.injectionSwitch.x;
+          let x_127 : f32 = x_6.injectionSwitch.y;
+          if ((x_125 > x_127)) {
+            discard;
+          }
+          x_103_phi = x_123;
+        }
+        x_103 = x_103_phi;
+        if ((f32(x_105) >= x_98)) {
+          x_135_phi = x_103;
+          x_136_phi = x_103;
+          x_137_phi = true;
+          break;
+        }
+
+        continuing {
+          x_106 = (x_105 + 1);
+          x_102_phi = x_103;
+          x_105_phi = x_106;
+        }
+      }
+      x_135 = x_135_phi;
+      x_136 = x_136_phi;
+      let x_137 : bool = x_137_phi;
+      x_139_phi = x_135;
+      if (x_137) {
+        break;
+      }
+      x_139_phi = x_136;
+    }
+  }
+  let x_139 : f32 = x_139_phi;
+  let x_140 : ptr<function, f32> = &(c.y);
+  *(x_140) = x_139;
+  let x_141 : f32 = *(x_96);
+  let x_142 : f32 = *(x_140);
+  c.z = (x_141 + x_142);
+  x_146_phi = 0;
+  loop {
+    var x_147 : i32;
+    let x_146 : i32 = x_146_phi;
+    if ((x_146 < 3)) {
+    } else {
+      break;
+    }
+    let x_152 : ptr<function, f32> = &(c[x_146]);
+    let x_153 : f32 = *(x_152);
+    if ((x_153 >= 1.0)) {
+      let x_157 : f32 = *(x_152);
+      let x_158 : f32 = *(x_152);
+      *(x_152) = (x_157 * x_158);
+      let x_161 : f32 = x_6.injectionSwitch.x;
+      let x_163 : f32 = x_6.injectionSwitch.y;
+      if ((x_161 > x_163)) {
+        discard;
+      }
+    }
+
+    continuing {
+      x_147 = (x_146 + 1);
+      x_146_phi = x_147;
+    }
+  }
+  let x_167 : vec3<f32> = c;
+  let x_169 : vec3<f32> = normalize(abs(x_167));
+  x_GLF_color = vec4<f32>(x_169.x, x_169.y, x_169.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-double-always-false-discard/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-double-always-false-discard/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..1b409b0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-double-always-false-discard/1.wgsl.expected.hlsl
@@ -0,0 +1,220 @@
+void set_float3(inout float3 vec, int idx, float val) {
+  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
+}
+
+cbuffer cbuffer_x_6 : register(b1, space0) {
+  uint4 x_6[1];
+};
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float3 c = float3(0.0f, 0.0f, 0.0f);
+  float x_54 = 0.0f;
+  float x_58 = 0.0f;
+  float x_59 = 0.0f;
+  float x_91 = 0.0f;
+  float x_92 = 0.0f;
+  float x_135 = 0.0f;
+  float x_136 = 0.0f;
+  float x_58_phi = 0.0f;
+  int x_61_phi = 0;
+  float x_91_phi = 0.0f;
+  float x_92_phi = 0.0f;
+  bool x_93_phi = false;
+  float x_95_phi = 0.0f;
+  float x_139_phi = 0.0f;
+  int x_146_phi = 0;
+  c = float3(7.0f, 8.0f, 9.0f);
+  const float x_50 = asfloat(x_9[0].x);
+  const float x_52 = round((x_50 * 0.125f));
+  x_54 = gl_FragCoord.x;
+  switch(0u) {
+    default: {
+      x_58_phi = -0.5f;
+      x_61_phi = 1;
+      while (true) {
+        float x_71 = 0.0f;
+        float x_79 = 0.0f;
+        int x_62 = 0;
+        float x_59_phi = 0.0f;
+        x_58 = x_58_phi;
+        const int x_61 = x_61_phi;
+        x_91_phi = 0.0f;
+        x_92_phi = x_58;
+        x_93_phi = false;
+        if ((x_61 < 800)) {
+        } else {
+          break;
+        }
+        float x_78 = 0.0f;
+        float x_79_phi = 0.0f;
+        if (((x_61 % 32) == 0)) {
+          x_71 = (x_58 + 0.400000006f);
+          x_59_phi = x_71;
+        } else {
+          x_79_phi = x_58;
+          if (((float(x_61) % round(x_52)) <= 0.01f)) {
+            x_78 = (x_58 + 100.0f);
+            x_79_phi = x_78;
+          }
+          x_79 = x_79_phi;
+          const float x_81 = asfloat(x_6[0].x);
+          const float x_83 = asfloat(x_6[0].y);
+          if ((x_81 > x_83)) {
+            discard;
+          }
+          x_59_phi = x_79;
+        }
+        x_59 = x_59_phi;
+        if ((float(x_61) >= x_54)) {
+          x_91_phi = x_59;
+          x_92_phi = x_59;
+          x_93_phi = true;
+          break;
+        }
+        {
+          x_62 = (x_61 + 1);
+          x_58_phi = x_59;
+          x_61_phi = x_62;
+        }
+      }
+      x_91 = x_91_phi;
+      x_92 = x_92_phi;
+      const bool x_93 = x_93_phi;
+      x_95_phi = x_91;
+      if (x_93) {
+        break;
+      }
+      x_95_phi = x_92;
+      break;
+    }
+  }
+  float x_98 = 0.0f;
+  float x_102 = 0.0f;
+  float x_103 = 0.0f;
+  float x_102_phi = 0.0f;
+  int x_105_phi = 0;
+  float x_135_phi = 0.0f;
+  float x_136_phi = 0.0f;
+  bool x_137_phi = false;
+  const float x_95 = x_95_phi;
+  c.x = x_95;
+  x_98 = gl_FragCoord.y;
+  switch(0u) {
+    default: {
+      x_102_phi = -0.5f;
+      x_105_phi = 1;
+      while (true) {
+        float x_115 = 0.0f;
+        float x_123 = 0.0f;
+        int x_106 = 0;
+        float x_103_phi = 0.0f;
+        x_102 = x_102_phi;
+        const int x_105 = x_105_phi;
+        x_135_phi = 0.0f;
+        x_136_phi = x_102;
+        x_137_phi = false;
+        if ((x_105 < 800)) {
+        } else {
+          break;
+        }
+        float x_122 = 0.0f;
+        float x_123_phi = 0.0f;
+        if (((x_105 % 32) == 0)) {
+          x_115 = (x_102 + 0.400000006f);
+          x_103_phi = x_115;
+        } else {
+          x_123_phi = x_102;
+          if (((float(x_105) % round(x_52)) <= 0.01f)) {
+            x_122 = (x_102 + 100.0f);
+            x_123_phi = x_122;
+          }
+          x_123 = x_123_phi;
+          const float x_125 = asfloat(x_6[0].x);
+          const float x_127 = asfloat(x_6[0].y);
+          if ((x_125 > x_127)) {
+            discard;
+          }
+          x_103_phi = x_123;
+        }
+        x_103 = x_103_phi;
+        if ((float(x_105) >= x_98)) {
+          x_135_phi = x_103;
+          x_136_phi = x_103;
+          x_137_phi = true;
+          break;
+        }
+        {
+          x_106 = (x_105 + 1);
+          x_102_phi = x_103;
+          x_105_phi = x_106;
+        }
+      }
+      x_135 = x_135_phi;
+      x_136 = x_136_phi;
+      const bool x_137 = x_137_phi;
+      x_139_phi = x_135;
+      if (x_137) {
+        break;
+      }
+      x_139_phi = x_136;
+      break;
+    }
+  }
+  const float x_139 = x_139_phi;
+  c.y = x_139;
+  const float x_141 = c.x;
+  const float x_142 = c.y;
+  c.z = (x_141 + x_142);
+  x_146_phi = 0;
+  while (true) {
+    int x_147 = 0;
+    const int x_146 = x_146_phi;
+    if ((x_146 < 3)) {
+    } else {
+      break;
+    }
+    const int x_152_save = x_146;
+    const float x_153 = c[x_152_save];
+    if ((x_153 >= 1.0f)) {
+      const float x_157 = c[x_152_save];
+      const float x_158 = c[x_152_save];
+      set_float3(c, x_152_save, (x_157 * x_158));
+      const float x_161 = asfloat(x_6[0].x);
+      const float x_163 = asfloat(x_6[0].y);
+      if ((x_161 > x_163)) {
+        discard;
+      }
+    }
+    {
+      x_147 = (x_146 + 1);
+      x_146_phi = x_147;
+    }
+  }
+  const float3 x_169 = normalize(abs(c));
+  x_GLF_color = float4(x_169.x, x_169.y, x_169.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-double-always-false-discard/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-double-always-false-discard/1.wgsl.expected.msl
new file mode 100755
index 0000000..1f4f528
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-double-always-false-discard/1.wgsl.expected.msl
@@ -0,0 +1,226 @@
+SKIP: FAILED
+
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf1 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_9, constant buf1& x_6, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float3 c = 0.0f;
+  float x_54 = 0.0f;
+  float x_58 = 0.0f;
+  float x_59 = 0.0f;
+  float x_91 = 0.0f;
+  float x_92 = 0.0f;
+  float x_135 = 0.0f;
+  float x_136 = 0.0f;
+  float x_58_phi = 0.0f;
+  int x_61_phi = 0;
+  float x_91_phi = 0.0f;
+  float x_92_phi = 0.0f;
+  bool x_93_phi = false;
+  float x_95_phi = 0.0f;
+  float x_139_phi = 0.0f;
+  int x_146_phi = 0;
+  c = float3(7.0f, 8.0f, 9.0f);
+  float const x_50 = x_9.resolution.x;
+  float const x_52 = rint((x_50 * 0.125f));
+  x_54 = (*(tint_symbol_5)).x;
+  switch(0u) {
+    default: {
+      x_58_phi = -0.5f;
+      x_61_phi = 1;
+      while (true) {
+        float x_71 = 0.0f;
+        float x_79 = 0.0f;
+        int x_62 = 0;
+        float x_59_phi = 0.0f;
+        x_58 = x_58_phi;
+        int const x_61 = x_61_phi;
+        x_91_phi = 0.0f;
+        x_92_phi = x_58;
+        x_93_phi = false;
+        if ((x_61 < 800)) {
+        } else {
+          break;
+        }
+        float x_78 = 0.0f;
+        float x_79_phi = 0.0f;
+        if (((x_61 % 32) == 0)) {
+          x_71 = (x_58 + 0.400000006f);
+          x_59_phi = x_71;
+        } else {
+          x_79_phi = x_58;
+          if (((float(x_61) % rint(x_52)) <= 0.01f)) {
+            x_78 = (x_58 + 100.0f);
+            x_79_phi = x_78;
+          }
+          x_79 = x_79_phi;
+          float const x_81 = x_6.injectionSwitch.x;
+          float const x_83 = x_6.injectionSwitch.y;
+          if ((x_81 > x_83)) {
+            discard_fragment();
+          }
+          x_59_phi = x_79;
+        }
+        x_59 = x_59_phi;
+        if ((float(x_61) >= x_54)) {
+          x_91_phi = x_59;
+          x_92_phi = x_59;
+          x_93_phi = true;
+          break;
+        }
+        {
+          x_62 = (x_61 + 1);
+          x_58_phi = x_59;
+          x_61_phi = x_62;
+        }
+      }
+      x_91 = x_91_phi;
+      x_92 = x_92_phi;
+      bool const x_93 = x_93_phi;
+      x_95_phi = x_91;
+      if (x_93) {
+        break;
+      }
+      x_95_phi = x_92;
+      break;
+    }
+  }
+  float x_98 = 0.0f;
+  float x_102 = 0.0f;
+  float x_103 = 0.0f;
+  float x_102_phi = 0.0f;
+  int x_105_phi = 0;
+  float x_135_phi = 0.0f;
+  float x_136_phi = 0.0f;
+  bool x_137_phi = false;
+  float const x_95 = x_95_phi;
+  c.x = x_95;
+  x_98 = (*(tint_symbol_5)).y;
+  switch(0u) {
+    default: {
+      x_102_phi = -0.5f;
+      x_105_phi = 1;
+      while (true) {
+        float x_115 = 0.0f;
+        float x_123 = 0.0f;
+        int x_106 = 0;
+        float x_103_phi = 0.0f;
+        x_102 = x_102_phi;
+        int const x_105 = x_105_phi;
+        x_135_phi = 0.0f;
+        x_136_phi = x_102;
+        x_137_phi = false;
+        if ((x_105 < 800)) {
+        } else {
+          break;
+        }
+        float x_122 = 0.0f;
+        float x_123_phi = 0.0f;
+        if (((x_105 % 32) == 0)) {
+          x_115 = (x_102 + 0.400000006f);
+          x_103_phi = x_115;
+        } else {
+          x_123_phi = x_102;
+          if (((float(x_105) % rint(x_52)) <= 0.01f)) {
+            x_122 = (x_102 + 100.0f);
+            x_123_phi = x_122;
+          }
+          x_123 = x_123_phi;
+          float const x_125 = x_6.injectionSwitch.x;
+          float const x_127 = x_6.injectionSwitch.y;
+          if ((x_125 > x_127)) {
+            discard_fragment();
+          }
+          x_103_phi = x_123;
+        }
+        x_103 = x_103_phi;
+        if ((float(x_105) >= x_98)) {
+          x_135_phi = x_103;
+          x_136_phi = x_103;
+          x_137_phi = true;
+          break;
+        }
+        {
+          x_106 = (x_105 + 1);
+          x_102_phi = x_103;
+          x_105_phi = x_106;
+        }
+      }
+      x_135 = x_135_phi;
+      x_136 = x_136_phi;
+      bool const x_137 = x_137_phi;
+      x_139_phi = x_135;
+      if (x_137) {
+        break;
+      }
+      x_139_phi = x_136;
+      break;
+    }
+  }
+  float const x_139 = x_139_phi;
+  c.y = x_139;
+  float const x_141 = c.x;
+  float const x_142 = c.y;
+  c.z = (x_141 + x_142);
+  x_146_phi = 0;
+  while (true) {
+    int x_147 = 0;
+    int const x_146 = x_146_phi;
+    if ((x_146 < 3)) {
+    } else {
+      break;
+    }
+    int const x_152_save = x_146;
+    float const x_153 = c[x_152_save];
+    if ((x_153 >= 1.0f)) {
+      float const x_157 = c[x_152_save];
+      float const x_158 = c[x_152_save];
+      c[x_152_save] = (x_157 * x_158);
+      float const x_161 = x_6.injectionSwitch.x;
+      float const x_163 = x_6.injectionSwitch.y;
+      if ((x_161 > x_163)) {
+        discard_fragment();
+      }
+    }
+    {
+      x_147 = (x_146 + 1);
+      x_146_phi = x_147;
+    }
+  }
+  float3 const x_167 = c;
+  float3 const x_169 = normalize(fabs(x_167));
+  *(tint_symbol_6) = float4(x_169.x, x_169.y, x_169.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_9 [[buffer(0)]], constant buf1& x_6 [[buffer(1)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_9, x_6, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
+T:\tmp\ucz4.0.metal:63:29: error: invalid operands to binary expression ('float' and 'float')
+          if (((float(x_61) % rint(x_52)) <= 0.01f)) {
+                ~~~~~~~~~~~ ^ ~~~~~~~~~~
+T:\tmp\ucz4.0.metal:135:30: error: invalid operands to binary expression ('float' and 'float')
+          if (((float(x_105) % rint(x_52)) <= 0.01f)) {
+                ~~~~~~~~~~~~ ^ ~~~~~~~~~~
+2 errors generated.
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-double-always-false-discard/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-double-always-false-discard/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..585bfcd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-double-always-false-discard/1.wgsl.expected.spvasm
@@ -0,0 +1,490 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 278
+; Schema: 0
+               OpCapability Shader
+         %59 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_9 "x_9"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %c "c"
+               OpName %x_54 "x_54"
+               OpName %x_58 "x_58"
+               OpName %x_59 "x_59"
+               OpName %x_91 "x_91"
+               OpName %x_92 "x_92"
+               OpName %x_135 "x_135"
+               OpName %x_136 "x_136"
+               OpName %x_58_phi "x_58_phi"
+               OpName %x_61_phi "x_61_phi"
+               OpName %x_91_phi "x_91_phi"
+               OpName %x_92_phi "x_92_phi"
+               OpName %x_93_phi "x_93_phi"
+               OpName %x_95_phi "x_95_phi"
+               OpName %x_139_phi "x_139_phi"
+               OpName %x_146_phi "x_146_phi"
+               OpName %x_71 "x_71"
+               OpName %x_79 "x_79"
+               OpName %x_62 "x_62"
+               OpName %x_59_phi "x_59_phi"
+               OpName %x_78 "x_78"
+               OpName %x_79_phi "x_79_phi"
+               OpName %x_98 "x_98"
+               OpName %x_102 "x_102"
+               OpName %x_103 "x_103"
+               OpName %x_102_phi "x_102_phi"
+               OpName %x_105_phi "x_105_phi"
+               OpName %x_135_phi "x_135_phi"
+               OpName %x_136_phi "x_136_phi"
+               OpName %x_137_phi "x_137_phi"
+               OpName %x_115 "x_115"
+               OpName %x_123 "x_123"
+               OpName %x_106 "x_106"
+               OpName %x_103_phi "x_103_phi"
+               OpName %x_122 "x_122"
+               OpName %x_123_phi "x_123_phi"
+               OpName %x_147 "x_147"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %x_6 = OpVariable %_ptr_Uniform_buf1 Uniform
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %12
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %25 = OpConstantNull %v3float
+%_ptr_Function_float = OpTypePointer Function %float
+         %28 = OpConstantNull %float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %39 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %45 = OpConstantNull %bool
+    %float_7 = OpConstant %float 7
+    %float_8 = OpConstant %float 8
+    %float_9 = OpConstant %float 9
+         %52 = OpConstantComposite %v3float %float_7 %float_8 %float_9
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%float_0_125 = OpConstant %float 0.125
+%_ptr_Private_float = OpTypePointer Private %float
+ %float_n0_5 = OpConstant %float -0.5
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+      %false = OpConstantFalse %bool
+    %int_800 = OpConstant %int 800
+     %int_32 = OpConstant %int 32
+      %int_0 = OpConstant %int 0
+%float_0_400000006 = OpConstant %float 0.400000006
+%float_0_00999999978 = OpConstant %float 0.00999999978
+  %float_100 = OpConstant %float 100
+     %uint_1 = OpConstant %uint 1
+       %true = OpConstantTrue %bool
+     %uint_2 = OpConstant %uint 2
+      %int_3 = OpConstant %int 3
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %265 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %18
+         %21 = OpLabel
+          %c = OpVariable %_ptr_Function_v3float Function %25
+       %x_54 = OpVariable %_ptr_Function_float Function %28
+       %x_58 = OpVariable %_ptr_Function_float Function %28
+       %x_59 = OpVariable %_ptr_Function_float Function %28
+       %x_91 = OpVariable %_ptr_Function_float Function %28
+       %x_92 = OpVariable %_ptr_Function_float Function %28
+      %x_135 = OpVariable %_ptr_Function_float Function %28
+      %x_136 = OpVariable %_ptr_Function_float Function %28
+   %x_58_phi = OpVariable %_ptr_Function_float Function %28
+   %x_61_phi = OpVariable %_ptr_Function_int Function %39
+   %x_91_phi = OpVariable %_ptr_Function_float Function %28
+   %x_92_phi = OpVariable %_ptr_Function_float Function %28
+   %x_93_phi = OpVariable %_ptr_Function_bool Function %45
+   %x_95_phi = OpVariable %_ptr_Function_float Function %28
+  %x_139_phi = OpVariable %_ptr_Function_float Function %28
+  %x_146_phi = OpVariable %_ptr_Function_int Function %39
+       %x_71 = OpVariable %_ptr_Function_float Function %28
+       %x_79 = OpVariable %_ptr_Function_float Function %28
+       %x_62 = OpVariable %_ptr_Function_int Function %39
+   %x_59_phi = OpVariable %_ptr_Function_float Function %28
+       %x_78 = OpVariable %_ptr_Function_float Function %28
+   %x_79_phi = OpVariable %_ptr_Function_float Function %28
+       %x_98 = OpVariable %_ptr_Function_float Function %28
+      %x_102 = OpVariable %_ptr_Function_float Function %28
+      %x_103 = OpVariable %_ptr_Function_float Function %28
+  %x_102_phi = OpVariable %_ptr_Function_float Function %28
+  %x_105_phi = OpVariable %_ptr_Function_int Function %39
+  %x_135_phi = OpVariable %_ptr_Function_float Function %28
+  %x_136_phi = OpVariable %_ptr_Function_float Function %28
+  %x_137_phi = OpVariable %_ptr_Function_bool Function %45
+      %x_115 = OpVariable %_ptr_Function_float Function %28
+      %x_123 = OpVariable %_ptr_Function_float Function %28
+      %x_106 = OpVariable %_ptr_Function_int Function %39
+  %x_103_phi = OpVariable %_ptr_Function_float Function %28
+      %x_122 = OpVariable %_ptr_Function_float Function %28
+  %x_123_phi = OpVariable %_ptr_Function_float Function %28
+      %x_147 = OpVariable %_ptr_Function_int Function %39
+               OpStore %c %52
+         %56 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_0
+         %57 = OpLoad %float %56
+         %61 = OpFMul %float %57 %float_0_125
+         %58 = OpExtInst %float %59 RoundEven %61
+         %63 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %64 = OpLoad %float %63
+               OpStore %x_54 %64
+               OpSelectionMerge %65 None
+               OpSwitch %uint_0 %66
+         %66 = OpLabel
+               OpStore %x_58_phi %float_n0_5
+               OpStore %x_61_phi %int_1
+               OpBranch %69
+         %69 = OpLabel
+               OpLoopMerge %70 %71 None
+               OpBranch %72
+         %72 = OpLabel
+         %77 = OpLoad %float %x_58_phi
+               OpStore %x_58 %77
+         %78 = OpLoad %int %x_61_phi
+               OpStore %x_91_phi %float_0
+         %80 = OpLoad %float %x_58
+               OpStore %x_92_phi %80
+               OpStore %x_93_phi %false
+         %83 = OpSLessThan %bool %78 %int_800
+               OpSelectionMerge %84 None
+               OpBranchConditional %83 %85 %86
+         %85 = OpLabel
+               OpBranch %84
+         %86 = OpLabel
+               OpBranch %70
+         %84 = OpLabel
+         %90 = OpSMod %int %78 %int_32
+         %92 = OpIEqual %bool %90 %int_0
+               OpSelectionMerge %93 None
+               OpBranchConditional %92 %94 %95
+         %94 = OpLabel
+         %96 = OpLoad %float %x_58
+         %98 = OpFAdd %float %96 %float_0_400000006
+               OpStore %x_71 %98
+         %99 = OpLoad %float %x_71
+               OpStore %x_59_phi %99
+               OpBranch %93
+         %95 = OpLabel
+        %100 = OpLoad %float %x_58
+               OpStore %x_79_phi %100
+        %101 = OpConvertSToF %float %78
+        %102 = OpExtInst %float %59 RoundEven %58
+        %103 = OpFMod %float %101 %102
+        %105 = OpFOrdLessThanEqual %bool %103 %float_0_00999999978
+               OpSelectionMerge %106 None
+               OpBranchConditional %105 %107 %106
+        %107 = OpLabel
+        %108 = OpLoad %float %x_58
+        %110 = OpFAdd %float %108 %float_100
+               OpStore %x_78 %110
+        %111 = OpLoad %float %x_78
+               OpStore %x_79_phi %111
+               OpBranch %106
+        %106 = OpLabel
+        %112 = OpLoad %float %x_79_phi
+               OpStore %x_79 %112
+        %113 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+        %114 = OpLoad %float %113
+        %116 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+        %117 = OpLoad %float %116
+        %118 = OpFOrdGreaterThan %bool %114 %117
+               OpSelectionMerge %119 None
+               OpBranchConditional %118 %120 %119
+        %120 = OpLabel
+               OpKill
+        %119 = OpLabel
+        %121 = OpLoad %float %x_79
+               OpStore %x_59_phi %121
+               OpBranch %93
+         %93 = OpLabel
+        %122 = OpLoad %float %x_59_phi
+               OpStore %x_59 %122
+        %123 = OpConvertSToF %float %78
+        %124 = OpLoad %float %x_54
+        %125 = OpFOrdGreaterThanEqual %bool %123 %124
+               OpSelectionMerge %126 None
+               OpBranchConditional %125 %127 %126
+        %127 = OpLabel
+        %128 = OpLoad %float %x_59
+               OpStore %x_91_phi %128
+        %129 = OpLoad %float %x_59
+               OpStore %x_92_phi %129
+               OpStore %x_93_phi %true
+               OpBranch %70
+        %126 = OpLabel
+               OpBranch %71
+         %71 = OpLabel
+        %131 = OpIAdd %int %78 %int_1
+               OpStore %x_62 %131
+        %132 = OpLoad %float %x_59
+               OpStore %x_58_phi %132
+        %133 = OpLoad %int %x_62
+               OpStore %x_61_phi %133
+               OpBranch %69
+         %70 = OpLabel
+        %134 = OpLoad %float %x_91_phi
+               OpStore %x_91 %134
+        %135 = OpLoad %float %x_92_phi
+               OpStore %x_92 %135
+        %136 = OpLoad %bool %x_93_phi
+        %137 = OpLoad %float %x_91
+               OpStore %x_95_phi %137
+               OpSelectionMerge %138 None
+               OpBranchConditional %136 %139 %138
+        %139 = OpLabel
+               OpBranch %65
+        %138 = OpLabel
+        %140 = OpLoad %float %x_92
+               OpStore %x_95_phi %140
+               OpBranch %65
+         %65 = OpLabel
+        %149 = OpLoad %float %x_95_phi
+        %150 = OpAccessChain %_ptr_Function_float %c %uint_0
+               OpStore %150 %149
+        %151 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %152 = OpLoad %float %151
+               OpStore %x_98 %152
+               OpSelectionMerge %153 None
+               OpSwitch %uint_0 %154
+        %154 = OpLabel
+               OpStore %x_102_phi %float_n0_5
+               OpStore %x_105_phi %int_1
+               OpBranch %155
+        %155 = OpLabel
+               OpLoopMerge %156 %157 None
+               OpBranch %158
+        %158 = OpLabel
+        %163 = OpLoad %float %x_102_phi
+               OpStore %x_102 %163
+        %164 = OpLoad %int %x_105_phi
+               OpStore %x_135_phi %float_0
+        %165 = OpLoad %float %x_102
+               OpStore %x_136_phi %165
+               OpStore %x_137_phi %false
+        %166 = OpSLessThan %bool %164 %int_800
+               OpSelectionMerge %167 None
+               OpBranchConditional %166 %168 %169
+        %168 = OpLabel
+               OpBranch %167
+        %169 = OpLabel
+               OpBranch %156
+        %167 = OpLabel
+        %172 = OpSMod %int %164 %int_32
+        %173 = OpIEqual %bool %172 %int_0
+               OpSelectionMerge %174 None
+               OpBranchConditional %173 %175 %176
+        %175 = OpLabel
+        %177 = OpLoad %float %x_102
+        %178 = OpFAdd %float %177 %float_0_400000006
+               OpStore %x_115 %178
+        %179 = OpLoad %float %x_115
+               OpStore %x_103_phi %179
+               OpBranch %174
+        %176 = OpLabel
+        %180 = OpLoad %float %x_102
+               OpStore %x_123_phi %180
+        %181 = OpConvertSToF %float %164
+        %182 = OpExtInst %float %59 RoundEven %58
+        %183 = OpFMod %float %181 %182
+        %184 = OpFOrdLessThanEqual %bool %183 %float_0_00999999978
+               OpSelectionMerge %185 None
+               OpBranchConditional %184 %186 %185
+        %186 = OpLabel
+        %187 = OpLoad %float %x_102
+        %188 = OpFAdd %float %187 %float_100
+               OpStore %x_122 %188
+        %189 = OpLoad %float %x_122
+               OpStore %x_123_phi %189
+               OpBranch %185
+        %185 = OpLabel
+        %190 = OpLoad %float %x_123_phi
+               OpStore %x_123 %190
+        %191 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+        %192 = OpLoad %float %191
+        %193 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+        %194 = OpLoad %float %193
+        %195 = OpFOrdGreaterThan %bool %192 %194
+               OpSelectionMerge %196 None
+               OpBranchConditional %195 %197 %196
+        %197 = OpLabel
+               OpKill
+        %196 = OpLabel
+        %198 = OpLoad %float %x_123
+               OpStore %x_103_phi %198
+               OpBranch %174
+        %174 = OpLabel
+        %199 = OpLoad %float %x_103_phi
+               OpStore %x_103 %199
+        %200 = OpConvertSToF %float %164
+        %201 = OpLoad %float %x_98
+        %202 = OpFOrdGreaterThanEqual %bool %200 %201
+               OpSelectionMerge %203 None
+               OpBranchConditional %202 %204 %203
+        %204 = OpLabel
+        %205 = OpLoad %float %x_103
+               OpStore %x_135_phi %205
+        %206 = OpLoad %float %x_103
+               OpStore %x_136_phi %206
+               OpStore %x_137_phi %true
+               OpBranch %156
+        %203 = OpLabel
+               OpBranch %157
+        %157 = OpLabel
+        %207 = OpIAdd %int %164 %int_1
+               OpStore %x_106 %207
+        %208 = OpLoad %float %x_103
+               OpStore %x_102_phi %208
+        %209 = OpLoad %int %x_106
+               OpStore %x_105_phi %209
+               OpBranch %155
+        %156 = OpLabel
+        %210 = OpLoad %float %x_135_phi
+               OpStore %x_135 %210
+        %211 = OpLoad %float %x_136_phi
+               OpStore %x_136 %211
+        %212 = OpLoad %bool %x_137_phi
+        %213 = OpLoad %float %x_135
+               OpStore %x_139_phi %213
+               OpSelectionMerge %214 None
+               OpBranchConditional %212 %215 %214
+        %215 = OpLabel
+               OpBranch %153
+        %214 = OpLabel
+        %216 = OpLoad %float %x_136
+               OpStore %x_139_phi %216
+               OpBranch %153
+        %153 = OpLabel
+        %217 = OpLoad %float %x_139_phi
+        %218 = OpAccessChain %_ptr_Function_float %c %uint_1
+               OpStore %218 %217
+        %219 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %220 = OpLoad %float %219
+        %221 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %222 = OpLoad %float %221
+        %224 = OpAccessChain %_ptr_Function_float %c %uint_2
+        %225 = OpFAdd %float %220 %222
+               OpStore %224 %225
+               OpStore %x_146_phi %int_0
+               OpBranch %226
+        %226 = OpLabel
+               OpLoopMerge %227 %228 None
+               OpBranch %229
+        %229 = OpLabel
+        %231 = OpLoad %int %x_146_phi
+        %233 = OpSLessThan %bool %231 %int_3
+               OpSelectionMerge %234 None
+               OpBranchConditional %233 %235 %236
+        %235 = OpLabel
+               OpBranch %234
+        %236 = OpLabel
+               OpBranch %227
+        %234 = OpLabel
+        %237 = OpAccessChain %_ptr_Function_float %c %231
+        %238 = OpLoad %float %237
+        %240 = OpFOrdGreaterThanEqual %bool %238 %float_1
+               OpSelectionMerge %241 None
+               OpBranchConditional %240 %242 %241
+        %242 = OpLabel
+        %243 = OpAccessChain %_ptr_Function_float %c %231
+        %244 = OpLoad %float %243
+        %245 = OpAccessChain %_ptr_Function_float %c %231
+        %246 = OpLoad %float %245
+        %247 = OpAccessChain %_ptr_Function_float %c %231
+        %248 = OpFMul %float %244 %246
+               OpStore %247 %248
+        %249 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+        %250 = OpLoad %float %249
+        %251 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+        %252 = OpLoad %float %251
+        %253 = OpFOrdGreaterThan %bool %250 %252
+               OpSelectionMerge %254 None
+               OpBranchConditional %253 %255 %254
+        %255 = OpLabel
+               OpKill
+        %254 = OpLabel
+               OpBranch %241
+        %241 = OpLabel
+               OpBranch %228
+        %228 = OpLabel
+        %256 = OpIAdd %int %231 %int_1
+               OpStore %x_147 %256
+        %257 = OpLoad %int %x_147
+               OpStore %x_146_phi %257
+               OpBranch %226
+        %227 = OpLabel
+        %258 = OpLoad %v3float %c
+        %260 = OpExtInst %v3float %59 FAbs %258
+        %259 = OpExtInst %v3float %59 Normalize %260
+        %261 = OpCompositeExtract %float %259 0
+        %262 = OpCompositeExtract %float %259 1
+        %263 = OpCompositeExtract %float %259 2
+        %264 = OpCompositeConstruct %v4float %261 %262 %263 %float_1
+               OpStore %x_GLF_color %264
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %265
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %269 = OpLabel
+        %270 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %270
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %18
+        %272 = OpLabel
+        %273 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %273
+        %274 = OpFunctionCall %void %main_1
+        %276 = OpLoad %v4float %x_GLF_color
+        %277 = OpCompositeConstruct %main_out %276
+        %275 = OpFunctionCall %void %tint_symbol_3 %277
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-double-always-false-discard/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-double-always-false-discard/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..5688188
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-double-always-false-discard/1.wgsl.expected.wgsl
@@ -0,0 +1,222 @@
+[[block]]
+struct buf1 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+[[group(0), binding(1)]] var<uniform> x_6 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var c : vec3<f32>;
+  var x_54 : f32;
+  var x_58 : f32;
+  var x_59 : f32;
+  var x_91 : f32;
+  var x_92 : f32;
+  var x_135 : f32;
+  var x_136 : f32;
+  var x_58_phi : f32;
+  var x_61_phi : i32;
+  var x_91_phi : f32;
+  var x_92_phi : f32;
+  var x_93_phi : bool;
+  var x_95_phi : f32;
+  var x_139_phi : f32;
+  var x_146_phi : i32;
+  c = vec3<f32>(7.0, 8.0, 9.0);
+  let x_50 : f32 = x_9.resolution.x;
+  let x_52 : f32 = round((x_50 * 0.125));
+  x_54 = gl_FragCoord.x;
+  switch(0u) {
+    default: {
+      x_58_phi = -0.5;
+      x_61_phi = 1;
+      loop {
+        var x_71 : f32;
+        var x_79 : f32;
+        var x_62 : i32;
+        var x_59_phi : f32;
+        x_58 = x_58_phi;
+        let x_61 : i32 = x_61_phi;
+        x_91_phi = 0.0;
+        x_92_phi = x_58;
+        x_93_phi = false;
+        if ((x_61 < 800)) {
+        } else {
+          break;
+        }
+        var x_78 : f32;
+        var x_79_phi : f32;
+        if (((x_61 % 32) == 0)) {
+          x_71 = (x_58 + 0.400000006);
+          x_59_phi = x_71;
+        } else {
+          x_79_phi = x_58;
+          if (((f32(x_61) % round(x_52)) <= 0.01)) {
+            x_78 = (x_58 + 100.0);
+            x_79_phi = x_78;
+          }
+          x_79 = x_79_phi;
+          let x_81 : f32 = x_6.injectionSwitch.x;
+          let x_83 : f32 = x_6.injectionSwitch.y;
+          if ((x_81 > x_83)) {
+            discard;
+          }
+          x_59_phi = x_79;
+        }
+        x_59 = x_59_phi;
+        if ((f32(x_61) >= x_54)) {
+          x_91_phi = x_59;
+          x_92_phi = x_59;
+          x_93_phi = true;
+          break;
+        }
+
+        continuing {
+          x_62 = (x_61 + 1);
+          x_58_phi = x_59;
+          x_61_phi = x_62;
+        }
+      }
+      x_91 = x_91_phi;
+      x_92 = x_92_phi;
+      let x_93 : bool = x_93_phi;
+      x_95_phi = x_91;
+      if (x_93) {
+        break;
+      }
+      x_95_phi = x_92;
+    }
+  }
+  var x_98 : f32;
+  var x_102 : f32;
+  var x_103 : f32;
+  var x_102_phi : f32;
+  var x_105_phi : i32;
+  var x_135_phi : f32;
+  var x_136_phi : f32;
+  var x_137_phi : bool;
+  let x_95 : f32 = x_95_phi;
+  let x_96 : ptr<function, f32> = &(c.x);
+  *(x_96) = x_95;
+  x_98 = gl_FragCoord.y;
+  switch(0u) {
+    default: {
+      x_102_phi = -0.5;
+      x_105_phi = 1;
+      loop {
+        var x_115 : f32;
+        var x_123 : f32;
+        var x_106 : i32;
+        var x_103_phi : f32;
+        x_102 = x_102_phi;
+        let x_105 : i32 = x_105_phi;
+        x_135_phi = 0.0;
+        x_136_phi = x_102;
+        x_137_phi = false;
+        if ((x_105 < 800)) {
+        } else {
+          break;
+        }
+        var x_122 : f32;
+        var x_123_phi : f32;
+        if (((x_105 % 32) == 0)) {
+          x_115 = (x_102 + 0.400000006);
+          x_103_phi = x_115;
+        } else {
+          x_123_phi = x_102;
+          if (((f32(x_105) % round(x_52)) <= 0.01)) {
+            x_122 = (x_102 + 100.0);
+            x_123_phi = x_122;
+          }
+          x_123 = x_123_phi;
+          let x_125 : f32 = x_6.injectionSwitch.x;
+          let x_127 : f32 = x_6.injectionSwitch.y;
+          if ((x_125 > x_127)) {
+            discard;
+          }
+          x_103_phi = x_123;
+        }
+        x_103 = x_103_phi;
+        if ((f32(x_105) >= x_98)) {
+          x_135_phi = x_103;
+          x_136_phi = x_103;
+          x_137_phi = true;
+          break;
+        }
+
+        continuing {
+          x_106 = (x_105 + 1);
+          x_102_phi = x_103;
+          x_105_phi = x_106;
+        }
+      }
+      x_135 = x_135_phi;
+      x_136 = x_136_phi;
+      let x_137 : bool = x_137_phi;
+      x_139_phi = x_135;
+      if (x_137) {
+        break;
+      }
+      x_139_phi = x_136;
+    }
+  }
+  let x_139 : f32 = x_139_phi;
+  let x_140 : ptr<function, f32> = &(c.y);
+  *(x_140) = x_139;
+  let x_141 : f32 = *(x_96);
+  let x_142 : f32 = *(x_140);
+  c.z = (x_141 + x_142);
+  x_146_phi = 0;
+  loop {
+    var x_147 : i32;
+    let x_146 : i32 = x_146_phi;
+    if ((x_146 < 3)) {
+    } else {
+      break;
+    }
+    let x_152 : ptr<function, f32> = &(c[x_146]);
+    let x_153 : f32 = *(x_152);
+    if ((x_153 >= 1.0)) {
+      let x_157 : f32 = *(x_152);
+      let x_158 : f32 = *(x_152);
+      *(x_152) = (x_157 * x_158);
+      let x_161 : f32 = x_6.injectionSwitch.x;
+      let x_163 : f32 = x_6.injectionSwitch.y;
+      if ((x_161 > x_163)) {
+        discard;
+      }
+    }
+
+    continuing {
+      x_147 = (x_146 + 1);
+      x_146_phi = x_147;
+    }
+  }
+  let x_167 : vec3<f32> = c;
+  let x_169 : vec3<f32> = normalize(abs(x_167));
+  x_GLF_color = vec4<f32>(x_169.x, x_169.y, x_169.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-float-mat-determinant-clamp/0.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-float-mat-determinant-clamp/0.spvasm
new file mode 100644
index 0000000..ff93ffd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-float-mat-determinant-clamp/0.spvasm
@@ -0,0 +1,217 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %compute_value_f1_f1_ "compute_value(f1;f1;"
+               OpName %limit "limit"
+               OpName %thirty_two "thirty_two"
+               OpName %result "result"
+               OpName %i "i"
+               OpName %c "c"
+               OpName %thirty_two_0 "thirty_two"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %param_1 "param"
+               OpName %param_2 "param"
+               OpName %i_0 "i"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+         %23 = OpTypeFunction %float %_ptr_Function_float %_ptr_Function_float
+ %float_n0_5 = OpConstant %float -0.5
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+    %int_800 = OpConstant %int 800
+       %bool = OpTypeBool
+     %int_32 = OpConstant %int 32
+      %int_0 = OpConstant %int 0
+%float_0_400000006 = OpConstant %float 0.400000006
+%float_0_00999999978 = OpConstant %float 0.00999999978
+  %float_100 = OpConstant %float 100
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+    %float_7 = OpConstant %float 7
+    %float_8 = OpConstant %float 8
+    %float_9 = OpConstant %float 9
+         %40 = OpConstantComposite %v3float %float_7 %float_8 %float_9
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+%_ptr_Input_float = OpTypePointer Input %float
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+      %int_3 = OpConstant %int 3
+    %float_1 = OpConstant %float 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %20
+         %54 = OpLabel
+          %c = OpVariable %_ptr_Function_v3float Function
+%thirty_two_0 = OpVariable %_ptr_Function_float Function
+      %param = OpVariable %_ptr_Function_float Function
+    %param_0 = OpVariable %_ptr_Function_float Function
+    %param_1 = OpVariable %_ptr_Function_float Function
+    %param_2 = OpVariable %_ptr_Function_float Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+               OpStore %c %40
+         %55 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %56 = OpLoad %float %55
+         %57 = OpFDiv %float %56 %float_8
+         %58 = OpExtInst %float %1 Round %57
+               OpStore %thirty_two_0 %58
+         %59 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %60 = OpLoad %float %59
+               OpStore %param %60
+         %61 = OpLoad %float %thirty_two_0
+               OpStore %param_0 %61
+         %62 = OpFunctionCall %float %compute_value_f1_f1_ %param %param_0
+         %63 = OpAccessChain %_ptr_Function_float %c %uint_0
+               OpStore %63 %62
+         %64 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %65 = OpLoad %float %64
+               OpStore %param_1 %65
+         %66 = OpLoad %float %thirty_two_0
+               OpStore %param_2 %66
+         %67 = OpFunctionCall %float %compute_value_f1_f1_ %param_1 %param_2
+         %68 = OpAccessChain %_ptr_Function_float %c %uint_1
+               OpStore %68 %67
+         %69 = OpAccessChain %_ptr_Function_float %c %uint_0
+         %70 = OpLoad %float %69
+         %71 = OpAccessChain %_ptr_Function_float %c %uint_1
+         %72 = OpLoad %float %71
+         %73 = OpFAdd %float %70 %72
+         %74 = OpAccessChain %_ptr_Function_float %c %uint_2
+               OpStore %74 %73
+               OpStore %i_0 %int_0
+               OpBranch %75
+         %75 = OpLabel
+               OpLoopMerge %76 %77 None
+               OpBranch %78
+         %78 = OpLabel
+         %79 = OpLoad %int %i_0
+         %80 = OpSLessThan %bool %79 %int_3
+               OpBranchConditional %80 %81 %76
+         %81 = OpLabel
+         %82 = OpLoad %int %i_0
+         %83 = OpAccessChain %_ptr_Function_float %c %82
+         %84 = OpLoad %float %83
+         %85 = OpFOrdGreaterThanEqual %bool %84 %float_1
+               OpSelectionMerge %86 None
+               OpBranchConditional %85 %87 %86
+         %87 = OpLabel
+         %88 = OpLoad %int %i_0
+         %89 = OpLoad %int %i_0
+         %90 = OpAccessChain %_ptr_Function_float %c %89
+         %91 = OpLoad %float %90
+         %92 = OpLoad %int %i_0
+         %93 = OpAccessChain %_ptr_Function_float %c %92
+         %94 = OpLoad %float %93
+         %95 = OpFMul %float %91 %94
+         %96 = OpAccessChain %_ptr_Function_float %c %88
+               OpStore %96 %95
+               OpBranch %86
+         %86 = OpLabel
+               OpBranch %77
+         %77 = OpLabel
+         %97 = OpLoad %int %i_0
+         %98 = OpIAdd %int %97 %int_1
+               OpStore %i_0 %98
+               OpBranch %75
+         %76 = OpLabel
+         %99 = OpLoad %v3float %c
+        %100 = OpExtInst %v3float %1 FAbs %99
+        %101 = OpExtInst %v3float %1 Normalize %100
+        %102 = OpCompositeExtract %float %101 0
+        %103 = OpCompositeExtract %float %101 1
+        %104 = OpCompositeExtract %float %101 2
+        %105 = OpCompositeConstruct %v4float %102 %103 %104 %float_1
+               OpStore %_GLF_color %105
+               OpReturn
+               OpFunctionEnd
+%compute_value_f1_f1_ = OpFunction %float None %23
+      %limit = OpFunctionParameter %_ptr_Function_float
+ %thirty_two = OpFunctionParameter %_ptr_Function_float
+        %106 = OpLabel
+     %result = OpVariable %_ptr_Function_float Function
+          %i = OpVariable %_ptr_Function_int Function
+               OpStore %result %float_n0_5
+               OpStore %i %int_1
+               OpBranch %107
+        %107 = OpLabel
+               OpLoopMerge %108 %109 None
+               OpBranch %110
+        %110 = OpLabel
+        %111 = OpLoad %int %i
+        %112 = OpSLessThan %bool %111 %int_800
+               OpBranchConditional %112 %113 %108
+        %113 = OpLabel
+        %114 = OpLoad %int %i
+        %115 = OpSMod %int %114 %int_32
+        %116 = OpIEqual %bool %115 %int_0
+               OpSelectionMerge %117 None
+               OpBranchConditional %116 %118 %119
+        %118 = OpLabel
+        %120 = OpLoad %float %result
+        %121 = OpFAdd %float %120 %float_0_400000006
+               OpStore %result %121
+               OpBranch %117
+        %119 = OpLabel
+        %122 = OpLoad %int %i
+        %123 = OpConvertSToF %float %122
+        %124 = OpLoad %float %thirty_two
+        %125 = OpExtInst %float %1 Round %124
+        %126 = OpFMod %float %123 %125
+        %127 = OpFOrdLessThanEqual %bool %126 %float_0_00999999978
+               OpSelectionMerge %128 None
+               OpBranchConditional %127 %129 %128
+        %129 = OpLabel
+        %130 = OpLoad %float %result
+        %131 = OpFAdd %float %130 %float_100
+               OpStore %result %131
+               OpBranch %128
+        %128 = OpLabel
+               OpBranch %117
+        %117 = OpLabel
+        %132 = OpLoad %int %i
+        %133 = OpConvertSToF %float %132
+        %134 = OpLoad %float %limit
+        %135 = OpFOrdGreaterThanEqual %bool %133 %134
+               OpSelectionMerge %136 None
+               OpBranchConditional %135 %137 %136
+        %137 = OpLabel
+        %138 = OpLoad %float %result
+               OpReturnValue %138
+        %136 = OpLabel
+               OpBranch %109
+        %109 = OpLabel
+        %139 = OpLoad %int %i
+        %140 = OpIAdd %int %139 %int_1
+               OpStore %i %140
+               OpBranch %107
+        %108 = OpLabel
+        %141 = OpLoad %float %result
+               OpReturnValue %141
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-float-mat-determinant-clamp/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-float-mat-determinant-clamp/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..7295dbb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-float-mat-determinant-clamp/0.spvasm.expected.hlsl
@@ -0,0 +1,95 @@
+void set_float3(inout float3 vec, int idx, float val) {
+  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
+}
+
+cbuffer cbuffer_x_13 : register(b0, space0) {
+  uint4 x_13[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float compute_value_f1_f1_(inout float limit, inout float thirty_two) {
+  float result = 0.0f;
+  int i = 0;
+  result = -0.5f;
+  i = 1;
+  {
+    for(; (i < 800); i = (i + 1)) {
+      if (((i % 32) == 0)) {
+        result = (result + 0.400000006f);
+      } else {
+        const int x_122 = i;
+        const float x_124 = thirty_two;
+        if (((float(x_122) % round(x_124)) <= 0.01f)) {
+          result = (result + 100.0f);
+        }
+      }
+      const int x_132 = i;
+      const float x_134 = limit;
+      if ((float(x_132) >= x_134)) {
+        return result;
+      }
+    }
+  }
+  return result;
+}
+
+void main_1() {
+  float3 c = float3(0.0f, 0.0f, 0.0f);
+  float thirty_two_1 = 0.0f;
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  float param_2 = 0.0f;
+  float param_3 = 0.0f;
+  int i_1 = 0;
+  c = float3(7.0f, 8.0f, 9.0f);
+  const float x_56 = asfloat(x_13[0].x);
+  thirty_two_1 = round((x_56 / 8.0f));
+  const float x_60 = gl_FragCoord.x;
+  param = x_60;
+  param_1 = thirty_two_1;
+  const float x_62 = compute_value_f1_f1_(param, param_1);
+  c.x = x_62;
+  const float x_65 = gl_FragCoord.y;
+  param_2 = x_65;
+  param_3 = thirty_two_1;
+  const float x_67 = compute_value_f1_f1_(param_2, param_3);
+  c.y = x_67;
+  const float x_70 = c.x;
+  const float x_72 = c.y;
+  c.z = (x_70 + x_72);
+  i_1 = 0;
+  {
+    for(; (i_1 < 3); i_1 = (i_1 + 1)) {
+      const float x_84 = c[i_1];
+      if ((x_84 >= 1.0f)) {
+        const int x_88 = i_1;
+        const float x_91 = c[i_1];
+        const float x_94 = c[i_1];
+        set_float3(c, x_88, (x_91 * x_94));
+      }
+    }
+  }
+  const float3 x_101 = normalize(abs(c));
+  x_GLF_color = float4(x_101.x, x_101.y, x_101.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-float-mat-determinant-clamp/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-float-mat-determinant-clamp/0.spvasm.expected.msl
new file mode 100755
index 0000000..51d7aa0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-float-mat-determinant-clamp/0.spvasm.expected.msl
@@ -0,0 +1,122 @@
+SKIP: FAILED
+
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float compute_value_f1_f1_(thread float* const limit, thread float* const thirty_two) {
+  float result = 0.0f;
+  int i = 0;
+  result = -0.5f;
+  i = 1;
+  while (true) {
+    int const x_111 = i;
+    if ((x_111 < 800)) {
+    } else {
+      break;
+    }
+    int const x_114 = i;
+    if (((x_114 % 32) == 0)) {
+      float const x_120 = result;
+      result = (x_120 + 0.400000006f);
+    } else {
+      int const x_122 = i;
+      float const x_124 = *(thirty_two);
+      if (((float(x_122) % rint(x_124)) <= 0.01f)) {
+        float const x_130 = result;
+        result = (x_130 + 100.0f);
+      }
+    }
+    int const x_132 = i;
+    float const x_134 = *(limit);
+    if ((float(x_132) >= x_134)) {
+      float const x_138 = result;
+      return x_138;
+    }
+    {
+      int const x_139 = i;
+      i = (x_139 + 1);
+    }
+  }
+  float const x_141 = result;
+  return x_141;
+}
+
+void main_1(constant buf0& x_13, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float3 c = 0.0f;
+  float thirty_two_1 = 0.0f;
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  float param_2 = 0.0f;
+  float param_3 = 0.0f;
+  int i_1 = 0;
+  c = float3(7.0f, 8.0f, 9.0f);
+  float const x_56 = x_13.resolution.x;
+  thirty_two_1 = rint((x_56 / 8.0f));
+  float const x_60 = (*(tint_symbol_5)).x;
+  param = x_60;
+  float const x_61 = thirty_two_1;
+  param_1 = x_61;
+  float const x_62 = compute_value_f1_f1_(&(param), &(param_1));
+  c.x = x_62;
+  float const x_65 = (*(tint_symbol_5)).y;
+  param_2 = x_65;
+  float const x_66 = thirty_two_1;
+  param_3 = x_66;
+  float const x_67 = compute_value_f1_f1_(&(param_2), &(param_3));
+  c.y = x_67;
+  float const x_70 = c.x;
+  float const x_72 = c.y;
+  c.z = (x_70 + x_72);
+  i_1 = 0;
+  while (true) {
+    int const x_79 = i_1;
+    if ((x_79 < 3)) {
+    } else {
+      break;
+    }
+    int const x_82 = i_1;
+    float const x_84 = c[x_82];
+    if ((x_84 >= 1.0f)) {
+      int const x_88 = i_1;
+      int const x_89 = i_1;
+      float const x_91 = c[x_89];
+      int const x_92 = i_1;
+      float const x_94 = c[x_92];
+      c[x_88] = (x_91 * x_94);
+    }
+    {
+      int const x_97 = i_1;
+      i_1 = (x_97 + 1);
+    }
+  }
+  float3 const x_99 = c;
+  float3 const x_101 = normalize(fabs(x_99));
+  *(tint_symbol_6) = float4(x_101.x, x_101.y, x_101.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_13 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_13, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
+T:\tmp\ufic.0.metal:32:26: error: invalid operands to binary expression ('float' and 'float')
+      if (((float(x_122) % rint(x_124)) <= 0.01f)) {
+            ~~~~~~~~~~~~ ^ ~~~~~~~~~~~
+1 error generated.
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-float-mat-determinant-clamp/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-float-mat-determinant-clamp/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..15ed885
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-float-mat-determinant-clamp/0.spvasm.expected.spvasm
@@ -0,0 +1,266 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 172
+; Schema: 0
+               OpCapability Shader
+         %56 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_13 "x_13"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %compute_value_f1_f1_ "compute_value_f1_f1_"
+               OpName %limit "limit"
+               OpName %thirty_two "thirty_two"
+               OpName %result "result"
+               OpName %i "i"
+               OpName %main_1 "main_1"
+               OpName %c "c"
+               OpName %thirty_two_1 "thirty_two_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %i_1 "i_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_13 NonWritable
+               OpDecorate %x_13 DescriptorSet 0
+               OpDecorate %x_13 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_13 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+%_ptr_Function_float = OpTypePointer Function %float
+         %15 = OpTypeFunction %float %_ptr_Function_float %_ptr_Function_float
+         %22 = OpConstantNull %float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %26 = OpConstantNull %int
+ %float_n0_5 = OpConstant %float -0.5
+      %int_1 = OpConstant %int 1
+    %int_800 = OpConstant %int 800
+       %bool = OpTypeBool
+     %int_32 = OpConstant %int 32
+      %int_0 = OpConstant %int 0
+%float_0_400000006 = OpConstant %float 0.400000006
+%float_0_00999999978 = OpConstant %float 0.00999999978
+  %float_100 = OpConstant %float 100
+       %void = OpTypeVoid
+         %76 = OpTypeFunction %void
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %83 = OpConstantNull %v3float
+    %float_7 = OpConstant %float 7
+    %float_8 = OpConstant %float 8
+    %float_9 = OpConstant %float 9
+         %93 = OpConstantComposite %v3float %float_7 %float_8 %float_9
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Private_float = OpTypePointer Private %float
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+      %int_3 = OpConstant %int 3
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %159 = OpTypeFunction %void %main_out
+%compute_value_f1_f1_ = OpFunction %float None %15
+      %limit = OpFunctionParameter %_ptr_Function_float
+ %thirty_two = OpFunctionParameter %_ptr_Function_float
+         %20 = OpLabel
+     %result = OpVariable %_ptr_Function_float Function %22
+          %i = OpVariable %_ptr_Function_int Function %26
+               OpStore %result %float_n0_5
+               OpStore %i %int_1
+               OpBranch %29
+         %29 = OpLabel
+               OpLoopMerge %30 %31 None
+               OpBranch %32
+         %32 = OpLabel
+         %33 = OpLoad %int %i
+         %35 = OpSLessThan %bool %33 %int_800
+               OpSelectionMerge %37 None
+               OpBranchConditional %35 %38 %39
+         %38 = OpLabel
+               OpBranch %37
+         %39 = OpLabel
+               OpBranch %30
+         %37 = OpLabel
+         %40 = OpLoad %int %i
+         %42 = OpSMod %int %40 %int_32
+         %44 = OpIEqual %bool %42 %int_0
+               OpSelectionMerge %45 None
+               OpBranchConditional %44 %46 %47
+         %46 = OpLabel
+         %48 = OpLoad %float %result
+         %50 = OpFAdd %float %48 %float_0_400000006
+               OpStore %result %50
+               OpBranch %45
+         %47 = OpLabel
+         %51 = OpLoad %int %i
+         %53 = OpLoad %float %thirty_two
+         %54 = OpConvertSToF %float %51
+         %55 = OpExtInst %float %56 RoundEven %53
+         %57 = OpFMod %float %54 %55
+         %59 = OpFOrdLessThanEqual %bool %57 %float_0_00999999978
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %60
+         %61 = OpLabel
+         %62 = OpLoad %float %result
+         %64 = OpFAdd %float %62 %float_100
+               OpStore %result %64
+               OpBranch %60
+         %60 = OpLabel
+               OpBranch %45
+         %45 = OpLabel
+         %65 = OpLoad %int %i
+         %67 = OpLoad %float %limit
+         %68 = OpConvertSToF %float %65
+         %69 = OpFOrdGreaterThanEqual %bool %68 %67
+               OpSelectionMerge %70 None
+               OpBranchConditional %69 %71 %70
+         %71 = OpLabel
+         %72 = OpLoad %float %result
+               OpReturnValue %72
+         %70 = OpLabel
+               OpBranch %31
+         %31 = OpLabel
+         %73 = OpLoad %int %i
+         %74 = OpIAdd %int %73 %int_1
+               OpStore %i %74
+               OpBranch %29
+         %30 = OpLabel
+         %75 = OpLoad %float %result
+               OpReturnValue %75
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %76
+         %79 = OpLabel
+          %c = OpVariable %_ptr_Function_v3float Function %83
+%thirty_two_1 = OpVariable %_ptr_Function_float Function %22
+      %param = OpVariable %_ptr_Function_float Function %22
+    %param_1 = OpVariable %_ptr_Function_float Function %22
+    %param_2 = OpVariable %_ptr_Function_float Function %22
+    %param_3 = OpVariable %_ptr_Function_float Function %22
+        %i_1 = OpVariable %_ptr_Function_int Function %26
+               OpStore %c %93
+         %97 = OpAccessChain %_ptr_Uniform_float %x_13 %uint_0 %uint_0
+         %98 = OpLoad %float %97
+        %100 = OpFDiv %float %98 %float_8
+         %99 = OpExtInst %float %56 RoundEven %100
+               OpStore %thirty_two_1 %99
+        %102 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+        %103 = OpLoad %float %102
+               OpStore %param %103
+        %104 = OpLoad %float %thirty_two_1
+               OpStore %param_1 %104
+        %105 = OpFunctionCall %float %compute_value_f1_f1_ %param %param_1
+        %108 = OpAccessChain %_ptr_Function_float %c %uint_0
+               OpStore %108 %105
+        %110 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %111 = OpLoad %float %110
+               OpStore %param_2 %111
+        %112 = OpLoad %float %thirty_two_1
+               OpStore %param_3 %112
+        %113 = OpFunctionCall %float %compute_value_f1_f1_ %param_2 %param_3
+        %116 = OpAccessChain %_ptr_Function_float %c %uint_1
+               OpStore %116 %113
+        %117 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %118 = OpLoad %float %117
+        %119 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %120 = OpLoad %float %119
+        %122 = OpAccessChain %_ptr_Function_float %c %uint_2
+        %123 = OpFAdd %float %118 %120
+               OpStore %122 %123
+               OpStore %i_1 %int_0
+               OpBranch %124
+        %124 = OpLabel
+               OpLoopMerge %125 %126 None
+               OpBranch %127
+        %127 = OpLabel
+        %128 = OpLoad %int %i_1
+        %130 = OpSLessThan %bool %128 %int_3
+               OpSelectionMerge %131 None
+               OpBranchConditional %130 %132 %133
+        %132 = OpLabel
+               OpBranch %131
+        %133 = OpLabel
+               OpBranch %125
+        %131 = OpLabel
+        %134 = OpLoad %int %i_1
+        %135 = OpAccessChain %_ptr_Function_float %c %134
+        %136 = OpLoad %float %135
+        %138 = OpFOrdGreaterThanEqual %bool %136 %float_1
+               OpSelectionMerge %139 None
+               OpBranchConditional %138 %140 %139
+        %140 = OpLabel
+        %141 = OpLoad %int %i_1
+        %142 = OpLoad %int %i_1
+        %143 = OpAccessChain %_ptr_Function_float %c %142
+        %144 = OpLoad %float %143
+        %145 = OpLoad %int %i_1
+        %146 = OpAccessChain %_ptr_Function_float %c %145
+        %147 = OpLoad %float %146
+        %148 = OpAccessChain %_ptr_Function_float %c %141
+        %149 = OpFMul %float %144 %147
+               OpStore %148 %149
+               OpBranch %139
+        %139 = OpLabel
+               OpBranch %126
+        %126 = OpLabel
+        %150 = OpLoad %int %i_1
+        %151 = OpIAdd %int %150 %int_1
+               OpStore %i_1 %151
+               OpBranch %124
+        %125 = OpLabel
+        %152 = OpLoad %v3float %c
+        %154 = OpExtInst %v3float %56 FAbs %152
+        %153 = OpExtInst %v3float %56 Normalize %154
+        %155 = OpCompositeExtract %float %153 0
+        %156 = OpCompositeExtract %float %153 1
+        %157 = OpCompositeExtract %float %153 2
+        %158 = OpCompositeConstruct %v4float %155 %156 %157 %float_1
+               OpStore %x_GLF_color %158
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %159
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %163 = OpLabel
+        %164 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %164
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %76
+        %166 = OpLabel
+        %167 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %167
+        %168 = OpFunctionCall %void %main_1
+        %170 = OpLoad %v4float %x_GLF_color
+        %171 = OpCompositeConstruct %main_out %170
+        %169 = OpFunctionCall %void %tint_symbol_3 %171
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-float-mat-determinant-clamp/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-float-mat-determinant-clamp/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..82eab45
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-float-mat-determinant-clamp/0.spvasm.expected.wgsl
@@ -0,0 +1,116 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_13 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn compute_value_f1_f1_(limit : ptr<function, f32>, thirty_two : ptr<function, f32>) -> f32 {
+  var result : f32;
+  var i : i32;
+  result = -0.5;
+  i = 1;
+  loop {
+    let x_111 : i32 = i;
+    if ((x_111 < 800)) {
+    } else {
+      break;
+    }
+    let x_114 : i32 = i;
+    if (((x_114 % 32) == 0)) {
+      let x_120 : f32 = result;
+      result = (x_120 + 0.400000006);
+    } else {
+      let x_122 : i32 = i;
+      let x_124 : f32 = *(thirty_two);
+      if (((f32(x_122) % round(x_124)) <= 0.01)) {
+        let x_130 : f32 = result;
+        result = (x_130 + 100.0);
+      }
+    }
+    let x_132 : i32 = i;
+    let x_134 : f32 = *(limit);
+    if ((f32(x_132) >= x_134)) {
+      let x_138 : f32 = result;
+      return x_138;
+    }
+
+    continuing {
+      let x_139 : i32 = i;
+      i = (x_139 + 1);
+    }
+  }
+  let x_141 : f32 = result;
+  return x_141;
+}
+
+fn main_1() {
+  var c : vec3<f32>;
+  var thirty_two_1 : f32;
+  var param : f32;
+  var param_1 : f32;
+  var param_2 : f32;
+  var param_3 : f32;
+  var i_1 : i32;
+  c = vec3<f32>(7.0, 8.0, 9.0);
+  let x_56 : f32 = x_13.resolution.x;
+  thirty_two_1 = round((x_56 / 8.0));
+  let x_60 : f32 = gl_FragCoord.x;
+  param = x_60;
+  let x_61 : f32 = thirty_two_1;
+  param_1 = x_61;
+  let x_62 : f32 = compute_value_f1_f1_(&(param), &(param_1));
+  c.x = x_62;
+  let x_65 : f32 = gl_FragCoord.y;
+  param_2 = x_65;
+  let x_66 : f32 = thirty_two_1;
+  param_3 = x_66;
+  let x_67 : f32 = compute_value_f1_f1_(&(param_2), &(param_3));
+  c.y = x_67;
+  let x_70 : f32 = c.x;
+  let x_72 : f32 = c.y;
+  c.z = (x_70 + x_72);
+  i_1 = 0;
+  loop {
+    let x_79 : i32 = i_1;
+    if ((x_79 < 3)) {
+    } else {
+      break;
+    }
+    let x_82 : i32 = i_1;
+    let x_84 : f32 = c[x_82];
+    if ((x_84 >= 1.0)) {
+      let x_88 : i32 = i_1;
+      let x_89 : i32 = i_1;
+      let x_91 : f32 = c[x_89];
+      let x_92 : i32 = i_1;
+      let x_94 : f32 = c[x_92];
+      c[x_88] = (x_91 * x_94);
+    }
+
+    continuing {
+      let x_97 : i32 = i_1;
+      i_1 = (x_97 + 1);
+    }
+  }
+  let x_99 : vec3<f32> = c;
+  let x_101 : vec3<f32> = normalize(abs(x_99));
+  x_GLF_color = vec4<f32>(x_101.x, x_101.y, x_101.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-float-mat-determinant-clamp/0.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-float-mat-determinant-clamp/0.wgsl
new file mode 100644
index 0000000..82eab45
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-float-mat-determinant-clamp/0.wgsl
@@ -0,0 +1,116 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_13 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn compute_value_f1_f1_(limit : ptr<function, f32>, thirty_two : ptr<function, f32>) -> f32 {
+  var result : f32;
+  var i : i32;
+  result = -0.5;
+  i = 1;
+  loop {
+    let x_111 : i32 = i;
+    if ((x_111 < 800)) {
+    } else {
+      break;
+    }
+    let x_114 : i32 = i;
+    if (((x_114 % 32) == 0)) {
+      let x_120 : f32 = result;
+      result = (x_120 + 0.400000006);
+    } else {
+      let x_122 : i32 = i;
+      let x_124 : f32 = *(thirty_two);
+      if (((f32(x_122) % round(x_124)) <= 0.01)) {
+        let x_130 : f32 = result;
+        result = (x_130 + 100.0);
+      }
+    }
+    let x_132 : i32 = i;
+    let x_134 : f32 = *(limit);
+    if ((f32(x_132) >= x_134)) {
+      let x_138 : f32 = result;
+      return x_138;
+    }
+
+    continuing {
+      let x_139 : i32 = i;
+      i = (x_139 + 1);
+    }
+  }
+  let x_141 : f32 = result;
+  return x_141;
+}
+
+fn main_1() {
+  var c : vec3<f32>;
+  var thirty_two_1 : f32;
+  var param : f32;
+  var param_1 : f32;
+  var param_2 : f32;
+  var param_3 : f32;
+  var i_1 : i32;
+  c = vec3<f32>(7.0, 8.0, 9.0);
+  let x_56 : f32 = x_13.resolution.x;
+  thirty_two_1 = round((x_56 / 8.0));
+  let x_60 : f32 = gl_FragCoord.x;
+  param = x_60;
+  let x_61 : f32 = thirty_two_1;
+  param_1 = x_61;
+  let x_62 : f32 = compute_value_f1_f1_(&(param), &(param_1));
+  c.x = x_62;
+  let x_65 : f32 = gl_FragCoord.y;
+  param_2 = x_65;
+  let x_66 : f32 = thirty_two_1;
+  param_3 = x_66;
+  let x_67 : f32 = compute_value_f1_f1_(&(param_2), &(param_3));
+  c.y = x_67;
+  let x_70 : f32 = c.x;
+  let x_72 : f32 = c.y;
+  c.z = (x_70 + x_72);
+  i_1 = 0;
+  loop {
+    let x_79 : i32 = i_1;
+    if ((x_79 < 3)) {
+    } else {
+      break;
+    }
+    let x_82 : i32 = i_1;
+    let x_84 : f32 = c[x_82];
+    if ((x_84 >= 1.0)) {
+      let x_88 : i32 = i_1;
+      let x_89 : i32 = i_1;
+      let x_91 : f32 = c[x_89];
+      let x_92 : i32 = i_1;
+      let x_94 : f32 = c[x_92];
+      c[x_88] = (x_91 * x_94);
+    }
+
+    continuing {
+      let x_97 : i32 = i_1;
+      i_1 = (x_97 + 1);
+    }
+  }
+  let x_99 : vec3<f32> = c;
+  let x_101 : vec3<f32> = normalize(abs(x_99));
+  x_GLF_color = vec4<f32>(x_101.x, x_101.y, x_101.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-float-mat-determinant-clamp/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-float-mat-determinant-clamp/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..7295dbb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-float-mat-determinant-clamp/0.wgsl.expected.hlsl
@@ -0,0 +1,95 @@
+void set_float3(inout float3 vec, int idx, float val) {
+  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
+}
+
+cbuffer cbuffer_x_13 : register(b0, space0) {
+  uint4 x_13[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float compute_value_f1_f1_(inout float limit, inout float thirty_two) {
+  float result = 0.0f;
+  int i = 0;
+  result = -0.5f;
+  i = 1;
+  {
+    for(; (i < 800); i = (i + 1)) {
+      if (((i % 32) == 0)) {
+        result = (result + 0.400000006f);
+      } else {
+        const int x_122 = i;
+        const float x_124 = thirty_two;
+        if (((float(x_122) % round(x_124)) <= 0.01f)) {
+          result = (result + 100.0f);
+        }
+      }
+      const int x_132 = i;
+      const float x_134 = limit;
+      if ((float(x_132) >= x_134)) {
+        return result;
+      }
+    }
+  }
+  return result;
+}
+
+void main_1() {
+  float3 c = float3(0.0f, 0.0f, 0.0f);
+  float thirty_two_1 = 0.0f;
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  float param_2 = 0.0f;
+  float param_3 = 0.0f;
+  int i_1 = 0;
+  c = float3(7.0f, 8.0f, 9.0f);
+  const float x_56 = asfloat(x_13[0].x);
+  thirty_two_1 = round((x_56 / 8.0f));
+  const float x_60 = gl_FragCoord.x;
+  param = x_60;
+  param_1 = thirty_two_1;
+  const float x_62 = compute_value_f1_f1_(param, param_1);
+  c.x = x_62;
+  const float x_65 = gl_FragCoord.y;
+  param_2 = x_65;
+  param_3 = thirty_two_1;
+  const float x_67 = compute_value_f1_f1_(param_2, param_3);
+  c.y = x_67;
+  const float x_70 = c.x;
+  const float x_72 = c.y;
+  c.z = (x_70 + x_72);
+  i_1 = 0;
+  {
+    for(; (i_1 < 3); i_1 = (i_1 + 1)) {
+      const float x_84 = c[i_1];
+      if ((x_84 >= 1.0f)) {
+        const int x_88 = i_1;
+        const float x_91 = c[i_1];
+        const float x_94 = c[i_1];
+        set_float3(c, x_88, (x_91 * x_94));
+      }
+    }
+  }
+  const float3 x_101 = normalize(abs(c));
+  x_GLF_color = float4(x_101.x, x_101.y, x_101.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-float-mat-determinant-clamp/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-float-mat-determinant-clamp/0.wgsl.expected.msl
new file mode 100755
index 0000000..e209f72
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-float-mat-determinant-clamp/0.wgsl.expected.msl
@@ -0,0 +1,122 @@
+SKIP: FAILED
+
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float compute_value_f1_f1_(thread float* const limit, thread float* const thirty_two) {
+  float result = 0.0f;
+  int i = 0;
+  result = -0.5f;
+  i = 1;
+  while (true) {
+    int const x_111 = i;
+    if ((x_111 < 800)) {
+    } else {
+      break;
+    }
+    int const x_114 = i;
+    if (((x_114 % 32) == 0)) {
+      float const x_120 = result;
+      result = (x_120 + 0.400000006f);
+    } else {
+      int const x_122 = i;
+      float const x_124 = *(thirty_two);
+      if (((float(x_122) % rint(x_124)) <= 0.01f)) {
+        float const x_130 = result;
+        result = (x_130 + 100.0f);
+      }
+    }
+    int const x_132 = i;
+    float const x_134 = *(limit);
+    if ((float(x_132) >= x_134)) {
+      float const x_138 = result;
+      return x_138;
+    }
+    {
+      int const x_139 = i;
+      i = (x_139 + 1);
+    }
+  }
+  float const x_141 = result;
+  return x_141;
+}
+
+void main_1(constant buf0& x_13, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float3 c = 0.0f;
+  float thirty_two_1 = 0.0f;
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  float param_2 = 0.0f;
+  float param_3 = 0.0f;
+  int i_1 = 0;
+  c = float3(7.0f, 8.0f, 9.0f);
+  float const x_56 = x_13.resolution.x;
+  thirty_two_1 = rint((x_56 / 8.0f));
+  float const x_60 = (*(tint_symbol_5)).x;
+  param = x_60;
+  float const x_61 = thirty_two_1;
+  param_1 = x_61;
+  float const x_62 = compute_value_f1_f1_(&(param), &(param_1));
+  c.x = x_62;
+  float const x_65 = (*(tint_symbol_5)).y;
+  param_2 = x_65;
+  float const x_66 = thirty_two_1;
+  param_3 = x_66;
+  float const x_67 = compute_value_f1_f1_(&(param_2), &(param_3));
+  c.y = x_67;
+  float const x_70 = c.x;
+  float const x_72 = c.y;
+  c.z = (x_70 + x_72);
+  i_1 = 0;
+  while (true) {
+    int const x_79 = i_1;
+    if ((x_79 < 3)) {
+    } else {
+      break;
+    }
+    int const x_82 = i_1;
+    float const x_84 = c[x_82];
+    if ((x_84 >= 1.0f)) {
+      int const x_88 = i_1;
+      int const x_89 = i_1;
+      float const x_91 = c[x_89];
+      int const x_92 = i_1;
+      float const x_94 = c[x_92];
+      c[x_88] = (x_91 * x_94);
+    }
+    {
+      int const x_97 = i_1;
+      i_1 = (x_97 + 1);
+    }
+  }
+  float3 const x_99 = c;
+  float3 const x_101 = normalize(fabs(x_99));
+  *(tint_symbol_6) = float4(x_101.x, x_101.y, x_101.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_13 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_13, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
+T:\tmp\u2a4.0.metal:32:26: error: invalid operands to binary expression ('float' and 'float')
+      if (((float(x_122) % rint(x_124)) <= 0.01f)) {
+            ~~~~~~~~~~~~ ^ ~~~~~~~~~~~
+1 error generated.
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-float-mat-determinant-clamp/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-float-mat-determinant-clamp/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..15ed885
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-float-mat-determinant-clamp/0.wgsl.expected.spvasm
@@ -0,0 +1,266 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 172
+; Schema: 0
+               OpCapability Shader
+         %56 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_13 "x_13"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %compute_value_f1_f1_ "compute_value_f1_f1_"
+               OpName %limit "limit"
+               OpName %thirty_two "thirty_two"
+               OpName %result "result"
+               OpName %i "i"
+               OpName %main_1 "main_1"
+               OpName %c "c"
+               OpName %thirty_two_1 "thirty_two_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %i_1 "i_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_13 NonWritable
+               OpDecorate %x_13 DescriptorSet 0
+               OpDecorate %x_13 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_13 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+%_ptr_Function_float = OpTypePointer Function %float
+         %15 = OpTypeFunction %float %_ptr_Function_float %_ptr_Function_float
+         %22 = OpConstantNull %float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %26 = OpConstantNull %int
+ %float_n0_5 = OpConstant %float -0.5
+      %int_1 = OpConstant %int 1
+    %int_800 = OpConstant %int 800
+       %bool = OpTypeBool
+     %int_32 = OpConstant %int 32
+      %int_0 = OpConstant %int 0
+%float_0_400000006 = OpConstant %float 0.400000006
+%float_0_00999999978 = OpConstant %float 0.00999999978
+  %float_100 = OpConstant %float 100
+       %void = OpTypeVoid
+         %76 = OpTypeFunction %void
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %83 = OpConstantNull %v3float
+    %float_7 = OpConstant %float 7
+    %float_8 = OpConstant %float 8
+    %float_9 = OpConstant %float 9
+         %93 = OpConstantComposite %v3float %float_7 %float_8 %float_9
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Private_float = OpTypePointer Private %float
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+      %int_3 = OpConstant %int 3
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %159 = OpTypeFunction %void %main_out
+%compute_value_f1_f1_ = OpFunction %float None %15
+      %limit = OpFunctionParameter %_ptr_Function_float
+ %thirty_two = OpFunctionParameter %_ptr_Function_float
+         %20 = OpLabel
+     %result = OpVariable %_ptr_Function_float Function %22
+          %i = OpVariable %_ptr_Function_int Function %26
+               OpStore %result %float_n0_5
+               OpStore %i %int_1
+               OpBranch %29
+         %29 = OpLabel
+               OpLoopMerge %30 %31 None
+               OpBranch %32
+         %32 = OpLabel
+         %33 = OpLoad %int %i
+         %35 = OpSLessThan %bool %33 %int_800
+               OpSelectionMerge %37 None
+               OpBranchConditional %35 %38 %39
+         %38 = OpLabel
+               OpBranch %37
+         %39 = OpLabel
+               OpBranch %30
+         %37 = OpLabel
+         %40 = OpLoad %int %i
+         %42 = OpSMod %int %40 %int_32
+         %44 = OpIEqual %bool %42 %int_0
+               OpSelectionMerge %45 None
+               OpBranchConditional %44 %46 %47
+         %46 = OpLabel
+         %48 = OpLoad %float %result
+         %50 = OpFAdd %float %48 %float_0_400000006
+               OpStore %result %50
+               OpBranch %45
+         %47 = OpLabel
+         %51 = OpLoad %int %i
+         %53 = OpLoad %float %thirty_two
+         %54 = OpConvertSToF %float %51
+         %55 = OpExtInst %float %56 RoundEven %53
+         %57 = OpFMod %float %54 %55
+         %59 = OpFOrdLessThanEqual %bool %57 %float_0_00999999978
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %60
+         %61 = OpLabel
+         %62 = OpLoad %float %result
+         %64 = OpFAdd %float %62 %float_100
+               OpStore %result %64
+               OpBranch %60
+         %60 = OpLabel
+               OpBranch %45
+         %45 = OpLabel
+         %65 = OpLoad %int %i
+         %67 = OpLoad %float %limit
+         %68 = OpConvertSToF %float %65
+         %69 = OpFOrdGreaterThanEqual %bool %68 %67
+               OpSelectionMerge %70 None
+               OpBranchConditional %69 %71 %70
+         %71 = OpLabel
+         %72 = OpLoad %float %result
+               OpReturnValue %72
+         %70 = OpLabel
+               OpBranch %31
+         %31 = OpLabel
+         %73 = OpLoad %int %i
+         %74 = OpIAdd %int %73 %int_1
+               OpStore %i %74
+               OpBranch %29
+         %30 = OpLabel
+         %75 = OpLoad %float %result
+               OpReturnValue %75
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %76
+         %79 = OpLabel
+          %c = OpVariable %_ptr_Function_v3float Function %83
+%thirty_two_1 = OpVariable %_ptr_Function_float Function %22
+      %param = OpVariable %_ptr_Function_float Function %22
+    %param_1 = OpVariable %_ptr_Function_float Function %22
+    %param_2 = OpVariable %_ptr_Function_float Function %22
+    %param_3 = OpVariable %_ptr_Function_float Function %22
+        %i_1 = OpVariable %_ptr_Function_int Function %26
+               OpStore %c %93
+         %97 = OpAccessChain %_ptr_Uniform_float %x_13 %uint_0 %uint_0
+         %98 = OpLoad %float %97
+        %100 = OpFDiv %float %98 %float_8
+         %99 = OpExtInst %float %56 RoundEven %100
+               OpStore %thirty_two_1 %99
+        %102 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+        %103 = OpLoad %float %102
+               OpStore %param %103
+        %104 = OpLoad %float %thirty_two_1
+               OpStore %param_1 %104
+        %105 = OpFunctionCall %float %compute_value_f1_f1_ %param %param_1
+        %108 = OpAccessChain %_ptr_Function_float %c %uint_0
+               OpStore %108 %105
+        %110 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %111 = OpLoad %float %110
+               OpStore %param_2 %111
+        %112 = OpLoad %float %thirty_two_1
+               OpStore %param_3 %112
+        %113 = OpFunctionCall %float %compute_value_f1_f1_ %param_2 %param_3
+        %116 = OpAccessChain %_ptr_Function_float %c %uint_1
+               OpStore %116 %113
+        %117 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %118 = OpLoad %float %117
+        %119 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %120 = OpLoad %float %119
+        %122 = OpAccessChain %_ptr_Function_float %c %uint_2
+        %123 = OpFAdd %float %118 %120
+               OpStore %122 %123
+               OpStore %i_1 %int_0
+               OpBranch %124
+        %124 = OpLabel
+               OpLoopMerge %125 %126 None
+               OpBranch %127
+        %127 = OpLabel
+        %128 = OpLoad %int %i_1
+        %130 = OpSLessThan %bool %128 %int_3
+               OpSelectionMerge %131 None
+               OpBranchConditional %130 %132 %133
+        %132 = OpLabel
+               OpBranch %131
+        %133 = OpLabel
+               OpBranch %125
+        %131 = OpLabel
+        %134 = OpLoad %int %i_1
+        %135 = OpAccessChain %_ptr_Function_float %c %134
+        %136 = OpLoad %float %135
+        %138 = OpFOrdGreaterThanEqual %bool %136 %float_1
+               OpSelectionMerge %139 None
+               OpBranchConditional %138 %140 %139
+        %140 = OpLabel
+        %141 = OpLoad %int %i_1
+        %142 = OpLoad %int %i_1
+        %143 = OpAccessChain %_ptr_Function_float %c %142
+        %144 = OpLoad %float %143
+        %145 = OpLoad %int %i_1
+        %146 = OpAccessChain %_ptr_Function_float %c %145
+        %147 = OpLoad %float %146
+        %148 = OpAccessChain %_ptr_Function_float %c %141
+        %149 = OpFMul %float %144 %147
+               OpStore %148 %149
+               OpBranch %139
+        %139 = OpLabel
+               OpBranch %126
+        %126 = OpLabel
+        %150 = OpLoad %int %i_1
+        %151 = OpIAdd %int %150 %int_1
+               OpStore %i_1 %151
+               OpBranch %124
+        %125 = OpLabel
+        %152 = OpLoad %v3float %c
+        %154 = OpExtInst %v3float %56 FAbs %152
+        %153 = OpExtInst %v3float %56 Normalize %154
+        %155 = OpCompositeExtract %float %153 0
+        %156 = OpCompositeExtract %float %153 1
+        %157 = OpCompositeExtract %float %153 2
+        %158 = OpCompositeConstruct %v4float %155 %156 %157 %float_1
+               OpStore %x_GLF_color %158
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %159
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %163 = OpLabel
+        %164 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %164
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %76
+        %166 = OpLabel
+        %167 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %167
+        %168 = OpFunctionCall %void %main_1
+        %170 = OpLoad %v4float %x_GLF_color
+        %171 = OpCompositeConstruct %main_out %170
+        %169 = OpFunctionCall %void %tint_symbol_3 %171
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-float-mat-determinant-clamp/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-float-mat-determinant-clamp/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..82eab45
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-float-mat-determinant-clamp/0.wgsl.expected.wgsl
@@ -0,0 +1,116 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_13 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn compute_value_f1_f1_(limit : ptr<function, f32>, thirty_two : ptr<function, f32>) -> f32 {
+  var result : f32;
+  var i : i32;
+  result = -0.5;
+  i = 1;
+  loop {
+    let x_111 : i32 = i;
+    if ((x_111 < 800)) {
+    } else {
+      break;
+    }
+    let x_114 : i32 = i;
+    if (((x_114 % 32) == 0)) {
+      let x_120 : f32 = result;
+      result = (x_120 + 0.400000006);
+    } else {
+      let x_122 : i32 = i;
+      let x_124 : f32 = *(thirty_two);
+      if (((f32(x_122) % round(x_124)) <= 0.01)) {
+        let x_130 : f32 = result;
+        result = (x_130 + 100.0);
+      }
+    }
+    let x_132 : i32 = i;
+    let x_134 : f32 = *(limit);
+    if ((f32(x_132) >= x_134)) {
+      let x_138 : f32 = result;
+      return x_138;
+    }
+
+    continuing {
+      let x_139 : i32 = i;
+      i = (x_139 + 1);
+    }
+  }
+  let x_141 : f32 = result;
+  return x_141;
+}
+
+fn main_1() {
+  var c : vec3<f32>;
+  var thirty_two_1 : f32;
+  var param : f32;
+  var param_1 : f32;
+  var param_2 : f32;
+  var param_3 : f32;
+  var i_1 : i32;
+  c = vec3<f32>(7.0, 8.0, 9.0);
+  let x_56 : f32 = x_13.resolution.x;
+  thirty_two_1 = round((x_56 / 8.0));
+  let x_60 : f32 = gl_FragCoord.x;
+  param = x_60;
+  let x_61 : f32 = thirty_two_1;
+  param_1 = x_61;
+  let x_62 : f32 = compute_value_f1_f1_(&(param), &(param_1));
+  c.x = x_62;
+  let x_65 : f32 = gl_FragCoord.y;
+  param_2 = x_65;
+  let x_66 : f32 = thirty_two_1;
+  param_3 = x_66;
+  let x_67 : f32 = compute_value_f1_f1_(&(param_2), &(param_3));
+  c.y = x_67;
+  let x_70 : f32 = c.x;
+  let x_72 : f32 = c.y;
+  c.z = (x_70 + x_72);
+  i_1 = 0;
+  loop {
+    let x_79 : i32 = i_1;
+    if ((x_79 < 3)) {
+    } else {
+      break;
+    }
+    let x_82 : i32 = i_1;
+    let x_84 : f32 = c[x_82];
+    if ((x_84 >= 1.0)) {
+      let x_88 : i32 = i_1;
+      let x_89 : i32 = i_1;
+      let x_91 : f32 = c[x_89];
+      let x_92 : i32 = i_1;
+      let x_94 : f32 = c[x_92];
+      c[x_88] = (x_91 * x_94);
+    }
+
+    continuing {
+      let x_97 : i32 = i_1;
+      i_1 = (x_97 + 1);
+    }
+  }
+  let x_99 : vec3<f32> = c;
+  let x_101 : vec3<f32> = normalize(abs(x_99));
+  x_GLF_color = vec4<f32>(x_101.x, x_101.y, x_101.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-injected-conditional-true/1.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-injected-conditional-true/1.spvasm
new file mode 100644
index 0000000..7200b4f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-injected-conditional-true/1.spvasm
@@ -0,0 +1,244 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %compute_value_f1_f1_ "compute_value(f1;f1;"
+               OpName %limit "limit"
+               OpName %thirty_two "thirty_two"
+               OpName %result "result"
+               OpName %i "i"
+               OpName %c "c"
+               OpName %thirty_two_0 "thirty_two"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %param_1 "param"
+               OpName %param_2 "param"
+               OpName %i_0 "i"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "injectionSwitch"
+               OpName %__0 ""
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+       %void = OpTypeVoid
+         %22 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+         %25 = OpTypeFunction %float %_ptr_Function_float %_ptr_Function_float
+ %float_n0_5 = OpConstant %float -0.5
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+    %int_800 = OpConstant %int 800
+       %bool = OpTypeBool
+     %int_32 = OpConstant %int 32
+      %int_0 = OpConstant %int 0
+%float_0_400000006 = OpConstant %float 0.400000006
+%float_0_00999999978 = OpConstant %float 0.00999999978
+  %float_100 = OpConstant %float 100
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+    %float_7 = OpConstant %float 7
+    %float_8 = OpConstant %float 8
+    %float_9 = OpConstant %float 9
+         %42 = OpConstantComposite %v3float %float_7 %float_8 %float_9
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+%_ptr_Input_float = OpTypePointer Input %float
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+      %int_3 = OpConstant %int 3
+    %float_1 = OpConstant %float 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+       %main = OpFunction %void None %22
+         %57 = OpLabel
+          %c = OpVariable %_ptr_Function_v3float Function
+%thirty_two_0 = OpVariable %_ptr_Function_float Function
+      %param = OpVariable %_ptr_Function_float Function
+    %param_0 = OpVariable %_ptr_Function_float Function
+    %param_1 = OpVariable %_ptr_Function_float Function
+    %param_2 = OpVariable %_ptr_Function_float Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+         %58 = OpVariable %_ptr_Function_v3float Function
+               OpStore %c %42
+         %59 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %60 = OpLoad %float %59
+         %61 = OpFDiv %float %60 %float_8
+         %62 = OpExtInst %float %1 Round %61
+               OpStore %thirty_two_0 %62
+         %63 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %64 = OpLoad %float %63
+               OpStore %param %64
+         %65 = OpLoad %float %thirty_two_0
+               OpStore %param_0 %65
+         %66 = OpFunctionCall %float %compute_value_f1_f1_ %param %param_0
+         %67 = OpAccessChain %_ptr_Function_float %c %uint_0
+               OpStore %67 %66
+         %68 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %69 = OpLoad %float %68
+               OpStore %param_1 %69
+         %70 = OpLoad %float %thirty_two_0
+               OpStore %param_2 %70
+         %71 = OpFunctionCall %float %compute_value_f1_f1_ %param_1 %param_2
+         %72 = OpAccessChain %_ptr_Function_float %c %uint_1
+               OpStore %72 %71
+         %73 = OpAccessChain %_ptr_Function_float %c %uint_0
+         %74 = OpLoad %float %73
+         %75 = OpAccessChain %_ptr_Function_float %c %uint_1
+         %76 = OpLoad %float %75
+         %77 = OpFAdd %float %74 %76
+         %78 = OpAccessChain %_ptr_Function_float %c %uint_2
+               OpStore %78 %77
+               OpStore %i_0 %int_0
+               OpBranch %79
+         %79 = OpLabel
+               OpLoopMerge %80 %81 None
+               OpBranch %82
+         %82 = OpLabel
+         %83 = OpLoad %int %i_0
+         %84 = OpSLessThan %bool %83 %int_3
+               OpBranchConditional %84 %85 %80
+         %85 = OpLabel
+         %86 = OpLoad %int %i_0
+         %87 = OpAccessChain %_ptr_Function_float %c %86
+         %88 = OpLoad %float %87
+         %89 = OpFOrdGreaterThanEqual %bool %88 %float_1
+               OpSelectionMerge %90 None
+               OpBranchConditional %89 %91 %90
+         %91 = OpLabel
+         %92 = OpLoad %int %i_0
+         %93 = OpLoad %int %i_0
+         %94 = OpAccessChain %_ptr_Function_float %c %93
+         %95 = OpLoad %float %94
+         %96 = OpLoad %int %i_0
+         %97 = OpAccessChain %_ptr_Function_float %c %96
+         %98 = OpLoad %float %97
+         %99 = OpFMul %float %95 %98
+        %100 = OpAccessChain %_ptr_Function_float %c %92
+               OpStore %100 %99
+               OpBranch %90
+         %90 = OpLabel
+               OpBranch %81
+         %81 = OpLabel
+        %101 = OpLoad %int %i_0
+        %102 = OpIAdd %int %101 %int_1
+               OpStore %i_0 %102
+               OpBranch %79
+         %80 = OpLabel
+        %103 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %uint_0
+        %104 = OpLoad %float %103
+        %105 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %uint_1
+        %106 = OpLoad %float %105
+        %107 = OpFOrdLessThan %bool %104 %106
+               OpSelectionMerge %108 None
+               OpBranchConditional %107 %109 %110
+        %109 = OpLabel
+        %111 = OpLoad %v3float %c
+        %112 = OpExtInst %v3float %1 FAbs %111
+               OpStore %58 %112
+               OpBranch %108
+        %110 = OpLabel
+        %113 = OpLoad %v3float %c
+               OpStore %58 %113
+               OpBranch %108
+        %108 = OpLabel
+        %114 = OpLoad %v3float %58
+        %115 = OpExtInst %v3float %1 Normalize %114
+        %116 = OpCompositeExtract %float %115 0
+        %117 = OpCompositeExtract %float %115 1
+        %118 = OpCompositeExtract %float %115 2
+        %119 = OpCompositeConstruct %v4float %116 %117 %118 %float_1
+               OpStore %_GLF_color %119
+               OpReturn
+               OpFunctionEnd
+%compute_value_f1_f1_ = OpFunction %float None %25
+      %limit = OpFunctionParameter %_ptr_Function_float
+ %thirty_two = OpFunctionParameter %_ptr_Function_float
+        %120 = OpLabel
+     %result = OpVariable %_ptr_Function_float Function
+          %i = OpVariable %_ptr_Function_int Function
+               OpStore %result %float_n0_5
+               OpStore %i %int_1
+               OpBranch %121
+        %121 = OpLabel
+               OpLoopMerge %122 %123 None
+               OpBranch %124
+        %124 = OpLabel
+        %125 = OpLoad %int %i
+        %126 = OpSLessThan %bool %125 %int_800
+               OpBranchConditional %126 %127 %122
+        %127 = OpLabel
+        %128 = OpLoad %int %i
+        %129 = OpSMod %int %128 %int_32
+        %130 = OpIEqual %bool %129 %int_0
+               OpSelectionMerge %131 None
+               OpBranchConditional %130 %132 %133
+        %132 = OpLabel
+        %134 = OpLoad %float %result
+        %135 = OpFAdd %float %134 %float_0_400000006
+               OpStore %result %135
+               OpBranch %131
+        %133 = OpLabel
+        %136 = OpLoad %int %i
+        %137 = OpConvertSToF %float %136
+        %138 = OpLoad %float %thirty_two
+        %139 = OpExtInst %float %1 Round %138
+        %140 = OpFMod %float %137 %139
+        %141 = OpFOrdLessThanEqual %bool %140 %float_0_00999999978
+               OpSelectionMerge %142 None
+               OpBranchConditional %141 %143 %142
+        %143 = OpLabel
+        %144 = OpLoad %float %result
+        %145 = OpFAdd %float %144 %float_100
+               OpStore %result %145
+               OpBranch %142
+        %142 = OpLabel
+               OpBranch %131
+        %131 = OpLabel
+        %146 = OpLoad %int %i
+        %147 = OpConvertSToF %float %146
+        %148 = OpLoad %float %limit
+        %149 = OpFOrdGreaterThanEqual %bool %147 %148
+               OpSelectionMerge %150 None
+               OpBranchConditional %149 %151 %150
+        %151 = OpLabel
+        %152 = OpLoad %float %result
+               OpReturnValue %152
+        %150 = OpLabel
+               OpBranch %123
+        %123 = OpLabel
+        %153 = OpLoad %int %i
+        %154 = OpIAdd %int %153 %int_1
+               OpStore %i %154
+               OpBranch %121
+        %122 = OpLabel
+        %155 = OpLoad %float %result
+               OpReturnValue %155
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-injected-conditional-true/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-injected-conditional-true/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..91938cd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-injected-conditional-true/1.spvasm.expected.hlsl
@@ -0,0 +1,106 @@
+void set_float3(inout float3 vec, int idx, float val) {
+  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
+}
+
+cbuffer cbuffer_x_13 : register(b0, space0) {
+  uint4 x_13[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_20 : register(b1, space0) {
+  uint4 x_20[1];
+};
+
+float compute_value_f1_f1_(inout float limit, inout float thirty_two) {
+  float result = 0.0f;
+  int i = 0;
+  result = -0.5f;
+  i = 1;
+  {
+    for(; (i < 800); i = (i + 1)) {
+      if (((i % 32) == 0)) {
+        result = (result + 0.400000006f);
+      } else {
+        const int x_136 = i;
+        const float x_138 = thirty_two;
+        if (((float(x_136) % round(x_138)) <= 0.01f)) {
+          result = (result + 100.0f);
+        }
+      }
+      const int x_146 = i;
+      const float x_148 = limit;
+      if ((float(x_146) >= x_148)) {
+        return result;
+      }
+    }
+  }
+  return result;
+}
+
+void main_1() {
+  float3 c = float3(0.0f, 0.0f, 0.0f);
+  float thirty_two_1 = 0.0f;
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  float param_2 = 0.0f;
+  float param_3 = 0.0f;
+  int i_1 = 0;
+  float3 x_58 = float3(0.0f, 0.0f, 0.0f);
+  c = float3(7.0f, 8.0f, 9.0f);
+  const float x_60 = asfloat(x_13[0].x);
+  thirty_two_1 = round((x_60 / 8.0f));
+  const float x_64 = gl_FragCoord.x;
+  param = x_64;
+  param_1 = thirty_two_1;
+  const float x_66 = compute_value_f1_f1_(param, param_1);
+  c.x = x_66;
+  const float x_69 = gl_FragCoord.y;
+  param_2 = x_69;
+  param_3 = thirty_two_1;
+  const float x_71 = compute_value_f1_f1_(param_2, param_3);
+  c.y = x_71;
+  const float x_74 = c.x;
+  const float x_76 = c.y;
+  c.z = (x_74 + x_76);
+  i_1 = 0;
+  {
+    for(; (i_1 < 3); i_1 = (i_1 + 1)) {
+      const float x_88 = c[i_1];
+      if ((x_88 >= 1.0f)) {
+        const int x_92 = i_1;
+        const float x_95 = c[i_1];
+        const float x_98 = c[i_1];
+        set_float3(c, x_92, (x_95 * x_98));
+      }
+    }
+  }
+  const float x_104 = asfloat(x_20[0].x);
+  const float x_106 = asfloat(x_20[0].y);
+  if ((x_104 < x_106)) {
+    x_58 = abs(c);
+  } else {
+    x_58 = c;
+  }
+  const float3 x_115 = normalize(x_58);
+  x_GLF_color = float4(x_115.x, x_115.y, x_115.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-injected-conditional-true/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-injected-conditional-true/1.spvasm.expected.msl
new file mode 100755
index 0000000..6f17012
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-injected-conditional-true/1.spvasm.expected.msl
@@ -0,0 +1,135 @@
+SKIP: FAILED
+
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct buf1 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float compute_value_f1_f1_(thread float* const limit, thread float* const thirty_two) {
+  float result = 0.0f;
+  int i = 0;
+  result = -0.5f;
+  i = 1;
+  while (true) {
+    int const x_125 = i;
+    if ((x_125 < 800)) {
+    } else {
+      break;
+    }
+    int const x_128 = i;
+    if (((x_128 % 32) == 0)) {
+      float const x_134 = result;
+      result = (x_134 + 0.400000006f);
+    } else {
+      int const x_136 = i;
+      float const x_138 = *(thirty_two);
+      if (((float(x_136) % rint(x_138)) <= 0.01f)) {
+        float const x_144 = result;
+        result = (x_144 + 100.0f);
+      }
+    }
+    int const x_146 = i;
+    float const x_148 = *(limit);
+    if ((float(x_146) >= x_148)) {
+      float const x_152 = result;
+      return x_152;
+    }
+    {
+      int const x_153 = i;
+      i = (x_153 + 1);
+    }
+  }
+  float const x_155 = result;
+  return x_155;
+}
+
+void main_1(constant buf0& x_13, constant buf1& x_20, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float3 c = 0.0f;
+  float thirty_two_1 = 0.0f;
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  float param_2 = 0.0f;
+  float param_3 = 0.0f;
+  int i_1 = 0;
+  float3 x_58 = 0.0f;
+  c = float3(7.0f, 8.0f, 9.0f);
+  float const x_60 = x_13.resolution.x;
+  thirty_two_1 = rint((x_60 / 8.0f));
+  float const x_64 = (*(tint_symbol_5)).x;
+  param = x_64;
+  float const x_65 = thirty_two_1;
+  param_1 = x_65;
+  float const x_66 = compute_value_f1_f1_(&(param), &(param_1));
+  c.x = x_66;
+  float const x_69 = (*(tint_symbol_5)).y;
+  param_2 = x_69;
+  float const x_70 = thirty_two_1;
+  param_3 = x_70;
+  float const x_71 = compute_value_f1_f1_(&(param_2), &(param_3));
+  c.y = x_71;
+  float const x_74 = c.x;
+  float const x_76 = c.y;
+  c.z = (x_74 + x_76);
+  i_1 = 0;
+  while (true) {
+    int const x_83 = i_1;
+    if ((x_83 < 3)) {
+    } else {
+      break;
+    }
+    int const x_86 = i_1;
+    float const x_88 = c[x_86];
+    if ((x_88 >= 1.0f)) {
+      int const x_92 = i_1;
+      int const x_93 = i_1;
+      float const x_95 = c[x_93];
+      int const x_96 = i_1;
+      float const x_98 = c[x_96];
+      c[x_92] = (x_95 * x_98);
+    }
+    {
+      int const x_101 = i_1;
+      i_1 = (x_101 + 1);
+    }
+  }
+  float const x_104 = x_20.injectionSwitch.x;
+  float const x_106 = x_20.injectionSwitch.y;
+  if ((x_104 < x_106)) {
+    float3 const x_111 = c;
+    x_58 = fabs(x_111);
+  } else {
+    float3 const x_113 = c;
+    x_58 = x_113;
+  }
+  float3 const x_114 = x_58;
+  float3 const x_115 = normalize(x_114);
+  *(tint_symbol_6) = float4(x_115.x, x_115.y, x_115.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_13 [[buffer(0)]], constant buf1& x_20 [[buffer(1)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_13, x_20, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
+T:\tmp\u8uo.0.metal:35:26: error: invalid operands to binary expression ('float' and 'float')
+      if (((float(x_136) % rint(x_138)) <= 0.01f)) {
+            ~~~~~~~~~~~~ ^ ~~~~~~~~~~~
+1 error generated.
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-injected-conditional-true/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-injected-conditional-true/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..91ba40f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-injected-conditional-true/1.spvasm.expected.spvasm
@@ -0,0 +1,295 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 186
+; Schema: 0
+               OpCapability Shader
+         %59 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_13 "x_13"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "injectionSwitch"
+               OpName %x_20 "x_20"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %compute_value_f1_f1_ "compute_value_f1_f1_"
+               OpName %limit "limit"
+               OpName %thirty_two "thirty_two"
+               OpName %result "result"
+               OpName %i "i"
+               OpName %main_1 "main_1"
+               OpName %c "c"
+               OpName %thirty_two_1 "thirty_two_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %i_1 "i_1"
+               OpName %x_58 "x_58"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_13 NonWritable
+               OpDecorate %x_13 DescriptorSet 0
+               OpDecorate %x_13 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_20 NonWritable
+               OpDecorate %x_20 DescriptorSet 0
+               OpDecorate %x_20 Binding 1
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_13 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_20 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+%_ptr_Function_float = OpTypePointer Function %float
+         %18 = OpTypeFunction %float %_ptr_Function_float %_ptr_Function_float
+         %25 = OpConstantNull %float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpConstantNull %int
+ %float_n0_5 = OpConstant %float -0.5
+      %int_1 = OpConstant %int 1
+    %int_800 = OpConstant %int 800
+       %bool = OpTypeBool
+     %int_32 = OpConstant %int 32
+      %int_0 = OpConstant %int 0
+%float_0_400000006 = OpConstant %float 0.400000006
+%float_0_00999999978 = OpConstant %float 0.00999999978
+  %float_100 = OpConstant %float 100
+       %void = OpTypeVoid
+         %79 = OpTypeFunction %void
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %86 = OpConstantNull %v3float
+    %float_7 = OpConstant %float 7
+    %float_8 = OpConstant %float 8
+    %float_9 = OpConstant %float 9
+         %97 = OpConstantComposite %v3float %float_7 %float_8 %float_9
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Private_float = OpTypePointer Private %float
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+      %int_3 = OpConstant %int 3
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %173 = OpTypeFunction %void %main_out
+%compute_value_f1_f1_ = OpFunction %float None %18
+      %limit = OpFunctionParameter %_ptr_Function_float
+ %thirty_two = OpFunctionParameter %_ptr_Function_float
+         %23 = OpLabel
+     %result = OpVariable %_ptr_Function_float Function %25
+          %i = OpVariable %_ptr_Function_int Function %29
+               OpStore %result %float_n0_5
+               OpStore %i %int_1
+               OpBranch %32
+         %32 = OpLabel
+               OpLoopMerge %33 %34 None
+               OpBranch %35
+         %35 = OpLabel
+         %36 = OpLoad %int %i
+         %38 = OpSLessThan %bool %36 %int_800
+               OpSelectionMerge %40 None
+               OpBranchConditional %38 %41 %42
+         %41 = OpLabel
+               OpBranch %40
+         %42 = OpLabel
+               OpBranch %33
+         %40 = OpLabel
+         %43 = OpLoad %int %i
+         %45 = OpSMod %int %43 %int_32
+         %47 = OpIEqual %bool %45 %int_0
+               OpSelectionMerge %48 None
+               OpBranchConditional %47 %49 %50
+         %49 = OpLabel
+         %51 = OpLoad %float %result
+         %53 = OpFAdd %float %51 %float_0_400000006
+               OpStore %result %53
+               OpBranch %48
+         %50 = OpLabel
+         %54 = OpLoad %int %i
+         %56 = OpLoad %float %thirty_two
+         %57 = OpConvertSToF %float %54
+         %58 = OpExtInst %float %59 RoundEven %56
+         %60 = OpFMod %float %57 %58
+         %62 = OpFOrdLessThanEqual %bool %60 %float_0_00999999978
+               OpSelectionMerge %63 None
+               OpBranchConditional %62 %64 %63
+         %64 = OpLabel
+         %65 = OpLoad %float %result
+         %67 = OpFAdd %float %65 %float_100
+               OpStore %result %67
+               OpBranch %63
+         %63 = OpLabel
+               OpBranch %48
+         %48 = OpLabel
+         %68 = OpLoad %int %i
+         %70 = OpLoad %float %limit
+         %71 = OpConvertSToF %float %68
+         %72 = OpFOrdGreaterThanEqual %bool %71 %70
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %74 %73
+         %74 = OpLabel
+         %75 = OpLoad %float %result
+               OpReturnValue %75
+         %73 = OpLabel
+               OpBranch %34
+         %34 = OpLabel
+         %76 = OpLoad %int %i
+         %77 = OpIAdd %int %76 %int_1
+               OpStore %i %77
+               OpBranch %32
+         %33 = OpLabel
+         %78 = OpLoad %float %result
+               OpReturnValue %78
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %79
+         %82 = OpLabel
+          %c = OpVariable %_ptr_Function_v3float Function %86
+%thirty_two_1 = OpVariable %_ptr_Function_float Function %25
+      %param = OpVariable %_ptr_Function_float Function %25
+    %param_1 = OpVariable %_ptr_Function_float Function %25
+    %param_2 = OpVariable %_ptr_Function_float Function %25
+    %param_3 = OpVariable %_ptr_Function_float Function %25
+        %i_1 = OpVariable %_ptr_Function_int Function %29
+       %x_58 = OpVariable %_ptr_Function_v3float Function %86
+               OpStore %c %97
+        %101 = OpAccessChain %_ptr_Uniform_float %x_13 %uint_0 %uint_0
+        %102 = OpLoad %float %101
+        %104 = OpFDiv %float %102 %float_8
+        %103 = OpExtInst %float %59 RoundEven %104
+               OpStore %thirty_two_1 %103
+        %106 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+        %107 = OpLoad %float %106
+               OpStore %param %107
+        %108 = OpLoad %float %thirty_two_1
+               OpStore %param_1 %108
+        %109 = OpFunctionCall %float %compute_value_f1_f1_ %param %param_1
+        %112 = OpAccessChain %_ptr_Function_float %c %uint_0
+               OpStore %112 %109
+        %114 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %115 = OpLoad %float %114
+               OpStore %param_2 %115
+        %116 = OpLoad %float %thirty_two_1
+               OpStore %param_3 %116
+        %117 = OpFunctionCall %float %compute_value_f1_f1_ %param_2 %param_3
+        %120 = OpAccessChain %_ptr_Function_float %c %uint_1
+               OpStore %120 %117
+        %121 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %122 = OpLoad %float %121
+        %123 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %124 = OpLoad %float %123
+        %126 = OpAccessChain %_ptr_Function_float %c %uint_2
+        %127 = OpFAdd %float %122 %124
+               OpStore %126 %127
+               OpStore %i_1 %int_0
+               OpBranch %128
+        %128 = OpLabel
+               OpLoopMerge %129 %130 None
+               OpBranch %131
+        %131 = OpLabel
+        %132 = OpLoad %int %i_1
+        %134 = OpSLessThan %bool %132 %int_3
+               OpSelectionMerge %135 None
+               OpBranchConditional %134 %136 %137
+        %136 = OpLabel
+               OpBranch %135
+        %137 = OpLabel
+               OpBranch %129
+        %135 = OpLabel
+        %138 = OpLoad %int %i_1
+        %139 = OpAccessChain %_ptr_Function_float %c %138
+        %140 = OpLoad %float %139
+        %142 = OpFOrdGreaterThanEqual %bool %140 %float_1
+               OpSelectionMerge %143 None
+               OpBranchConditional %142 %144 %143
+        %144 = OpLabel
+        %145 = OpLoad %int %i_1
+        %146 = OpLoad %int %i_1
+        %147 = OpAccessChain %_ptr_Function_float %c %146
+        %148 = OpLoad %float %147
+        %149 = OpLoad %int %i_1
+        %150 = OpAccessChain %_ptr_Function_float %c %149
+        %151 = OpLoad %float %150
+        %152 = OpAccessChain %_ptr_Function_float %c %145
+        %153 = OpFMul %float %148 %151
+               OpStore %152 %153
+               OpBranch %143
+        %143 = OpLabel
+               OpBranch %130
+        %130 = OpLabel
+        %154 = OpLoad %int %i_1
+        %155 = OpIAdd %int %154 %int_1
+               OpStore %i_1 %155
+               OpBranch %128
+        %129 = OpLabel
+        %156 = OpAccessChain %_ptr_Uniform_float %x_20 %uint_0 %uint_0
+        %157 = OpLoad %float %156
+        %158 = OpAccessChain %_ptr_Uniform_float %x_20 %uint_0 %uint_1
+        %159 = OpLoad %float %158
+        %160 = OpFOrdLessThan %bool %157 %159
+               OpSelectionMerge %161 None
+               OpBranchConditional %160 %162 %163
+        %162 = OpLabel
+        %164 = OpLoad %v3float %c
+        %165 = OpExtInst %v3float %59 FAbs %164
+               OpStore %x_58 %165
+               OpBranch %161
+        %163 = OpLabel
+        %166 = OpLoad %v3float %c
+               OpStore %x_58 %166
+               OpBranch %161
+        %161 = OpLabel
+        %167 = OpLoad %v3float %x_58
+        %168 = OpExtInst %v3float %59 Normalize %167
+        %169 = OpCompositeExtract %float %168 0
+        %170 = OpCompositeExtract %float %168 1
+        %171 = OpCompositeExtract %float %168 2
+        %172 = OpCompositeConstruct %v4float %169 %170 %171 %float_1
+               OpStore %x_GLF_color %172
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %173
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %177 = OpLabel
+        %178 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %178
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %79
+        %180 = OpLabel
+        %181 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %181
+        %182 = OpFunctionCall %void %main_1
+        %184 = OpLoad %v4float %x_GLF_color
+        %185 = OpCompositeConstruct %main_out %184
+        %183 = OpFunctionCall %void %tint_symbol_3 %185
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-injected-conditional-true/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-injected-conditional-true/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..60de1ab
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-injected-conditional-true/1.spvasm.expected.wgsl
@@ -0,0 +1,133 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+[[block]]
+struct buf1 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_13 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_20 : buf1;
+
+fn compute_value_f1_f1_(limit : ptr<function, f32>, thirty_two : ptr<function, f32>) -> f32 {
+  var result : f32;
+  var i : i32;
+  result = -0.5;
+  i = 1;
+  loop {
+    let x_125 : i32 = i;
+    if ((x_125 < 800)) {
+    } else {
+      break;
+    }
+    let x_128 : i32 = i;
+    if (((x_128 % 32) == 0)) {
+      let x_134 : f32 = result;
+      result = (x_134 + 0.400000006);
+    } else {
+      let x_136 : i32 = i;
+      let x_138 : f32 = *(thirty_two);
+      if (((f32(x_136) % round(x_138)) <= 0.01)) {
+        let x_144 : f32 = result;
+        result = (x_144 + 100.0);
+      }
+    }
+    let x_146 : i32 = i;
+    let x_148 : f32 = *(limit);
+    if ((f32(x_146) >= x_148)) {
+      let x_152 : f32 = result;
+      return x_152;
+    }
+
+    continuing {
+      let x_153 : i32 = i;
+      i = (x_153 + 1);
+    }
+  }
+  let x_155 : f32 = result;
+  return x_155;
+}
+
+fn main_1() {
+  var c : vec3<f32>;
+  var thirty_two_1 : f32;
+  var param : f32;
+  var param_1 : f32;
+  var param_2 : f32;
+  var param_3 : f32;
+  var i_1 : i32;
+  var x_58 : vec3<f32>;
+  c = vec3<f32>(7.0, 8.0, 9.0);
+  let x_60 : f32 = x_13.resolution.x;
+  thirty_two_1 = round((x_60 / 8.0));
+  let x_64 : f32 = gl_FragCoord.x;
+  param = x_64;
+  let x_65 : f32 = thirty_two_1;
+  param_1 = x_65;
+  let x_66 : f32 = compute_value_f1_f1_(&(param), &(param_1));
+  c.x = x_66;
+  let x_69 : f32 = gl_FragCoord.y;
+  param_2 = x_69;
+  let x_70 : f32 = thirty_two_1;
+  param_3 = x_70;
+  let x_71 : f32 = compute_value_f1_f1_(&(param_2), &(param_3));
+  c.y = x_71;
+  let x_74 : f32 = c.x;
+  let x_76 : f32 = c.y;
+  c.z = (x_74 + x_76);
+  i_1 = 0;
+  loop {
+    let x_83 : i32 = i_1;
+    if ((x_83 < 3)) {
+    } else {
+      break;
+    }
+    let x_86 : i32 = i_1;
+    let x_88 : f32 = c[x_86];
+    if ((x_88 >= 1.0)) {
+      let x_92 : i32 = i_1;
+      let x_93 : i32 = i_1;
+      let x_95 : f32 = c[x_93];
+      let x_96 : i32 = i_1;
+      let x_98 : f32 = c[x_96];
+      c[x_92] = (x_95 * x_98);
+    }
+
+    continuing {
+      let x_101 : i32 = i_1;
+      i_1 = (x_101 + 1);
+    }
+  }
+  let x_104 : f32 = x_20.injectionSwitch.x;
+  let x_106 : f32 = x_20.injectionSwitch.y;
+  if ((x_104 < x_106)) {
+    let x_111 : vec3<f32> = c;
+    x_58 = abs(x_111);
+  } else {
+    let x_113 : vec3<f32> = c;
+    x_58 = x_113;
+  }
+  let x_114 : vec3<f32> = x_58;
+  let x_115 : vec3<f32> = normalize(x_114);
+  x_GLF_color = vec4<f32>(x_115.x, x_115.y, x_115.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-injected-conditional-true/1.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-injected-conditional-true/1.wgsl
new file mode 100644
index 0000000..60de1ab
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-injected-conditional-true/1.wgsl
@@ -0,0 +1,133 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+[[block]]
+struct buf1 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_13 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_20 : buf1;
+
+fn compute_value_f1_f1_(limit : ptr<function, f32>, thirty_two : ptr<function, f32>) -> f32 {
+  var result : f32;
+  var i : i32;
+  result = -0.5;
+  i = 1;
+  loop {
+    let x_125 : i32 = i;
+    if ((x_125 < 800)) {
+    } else {
+      break;
+    }
+    let x_128 : i32 = i;
+    if (((x_128 % 32) == 0)) {
+      let x_134 : f32 = result;
+      result = (x_134 + 0.400000006);
+    } else {
+      let x_136 : i32 = i;
+      let x_138 : f32 = *(thirty_two);
+      if (((f32(x_136) % round(x_138)) <= 0.01)) {
+        let x_144 : f32 = result;
+        result = (x_144 + 100.0);
+      }
+    }
+    let x_146 : i32 = i;
+    let x_148 : f32 = *(limit);
+    if ((f32(x_146) >= x_148)) {
+      let x_152 : f32 = result;
+      return x_152;
+    }
+
+    continuing {
+      let x_153 : i32 = i;
+      i = (x_153 + 1);
+    }
+  }
+  let x_155 : f32 = result;
+  return x_155;
+}
+
+fn main_1() {
+  var c : vec3<f32>;
+  var thirty_two_1 : f32;
+  var param : f32;
+  var param_1 : f32;
+  var param_2 : f32;
+  var param_3 : f32;
+  var i_1 : i32;
+  var x_58 : vec3<f32>;
+  c = vec3<f32>(7.0, 8.0, 9.0);
+  let x_60 : f32 = x_13.resolution.x;
+  thirty_two_1 = round((x_60 / 8.0));
+  let x_64 : f32 = gl_FragCoord.x;
+  param = x_64;
+  let x_65 : f32 = thirty_two_1;
+  param_1 = x_65;
+  let x_66 : f32 = compute_value_f1_f1_(&(param), &(param_1));
+  c.x = x_66;
+  let x_69 : f32 = gl_FragCoord.y;
+  param_2 = x_69;
+  let x_70 : f32 = thirty_two_1;
+  param_3 = x_70;
+  let x_71 : f32 = compute_value_f1_f1_(&(param_2), &(param_3));
+  c.y = x_71;
+  let x_74 : f32 = c.x;
+  let x_76 : f32 = c.y;
+  c.z = (x_74 + x_76);
+  i_1 = 0;
+  loop {
+    let x_83 : i32 = i_1;
+    if ((x_83 < 3)) {
+    } else {
+      break;
+    }
+    let x_86 : i32 = i_1;
+    let x_88 : f32 = c[x_86];
+    if ((x_88 >= 1.0)) {
+      let x_92 : i32 = i_1;
+      let x_93 : i32 = i_1;
+      let x_95 : f32 = c[x_93];
+      let x_96 : i32 = i_1;
+      let x_98 : f32 = c[x_96];
+      c[x_92] = (x_95 * x_98);
+    }
+
+    continuing {
+      let x_101 : i32 = i_1;
+      i_1 = (x_101 + 1);
+    }
+  }
+  let x_104 : f32 = x_20.injectionSwitch.x;
+  let x_106 : f32 = x_20.injectionSwitch.y;
+  if ((x_104 < x_106)) {
+    let x_111 : vec3<f32> = c;
+    x_58 = abs(x_111);
+  } else {
+    let x_113 : vec3<f32> = c;
+    x_58 = x_113;
+  }
+  let x_114 : vec3<f32> = x_58;
+  let x_115 : vec3<f32> = normalize(x_114);
+  x_GLF_color = vec4<f32>(x_115.x, x_115.y, x_115.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-injected-conditional-true/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-injected-conditional-true/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..91938cd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-injected-conditional-true/1.wgsl.expected.hlsl
@@ -0,0 +1,106 @@
+void set_float3(inout float3 vec, int idx, float val) {
+  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
+}
+
+cbuffer cbuffer_x_13 : register(b0, space0) {
+  uint4 x_13[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_20 : register(b1, space0) {
+  uint4 x_20[1];
+};
+
+float compute_value_f1_f1_(inout float limit, inout float thirty_two) {
+  float result = 0.0f;
+  int i = 0;
+  result = -0.5f;
+  i = 1;
+  {
+    for(; (i < 800); i = (i + 1)) {
+      if (((i % 32) == 0)) {
+        result = (result + 0.400000006f);
+      } else {
+        const int x_136 = i;
+        const float x_138 = thirty_two;
+        if (((float(x_136) % round(x_138)) <= 0.01f)) {
+          result = (result + 100.0f);
+        }
+      }
+      const int x_146 = i;
+      const float x_148 = limit;
+      if ((float(x_146) >= x_148)) {
+        return result;
+      }
+    }
+  }
+  return result;
+}
+
+void main_1() {
+  float3 c = float3(0.0f, 0.0f, 0.0f);
+  float thirty_two_1 = 0.0f;
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  float param_2 = 0.0f;
+  float param_3 = 0.0f;
+  int i_1 = 0;
+  float3 x_58 = float3(0.0f, 0.0f, 0.0f);
+  c = float3(7.0f, 8.0f, 9.0f);
+  const float x_60 = asfloat(x_13[0].x);
+  thirty_two_1 = round((x_60 / 8.0f));
+  const float x_64 = gl_FragCoord.x;
+  param = x_64;
+  param_1 = thirty_two_1;
+  const float x_66 = compute_value_f1_f1_(param, param_1);
+  c.x = x_66;
+  const float x_69 = gl_FragCoord.y;
+  param_2 = x_69;
+  param_3 = thirty_two_1;
+  const float x_71 = compute_value_f1_f1_(param_2, param_3);
+  c.y = x_71;
+  const float x_74 = c.x;
+  const float x_76 = c.y;
+  c.z = (x_74 + x_76);
+  i_1 = 0;
+  {
+    for(; (i_1 < 3); i_1 = (i_1 + 1)) {
+      const float x_88 = c[i_1];
+      if ((x_88 >= 1.0f)) {
+        const int x_92 = i_1;
+        const float x_95 = c[i_1];
+        const float x_98 = c[i_1];
+        set_float3(c, x_92, (x_95 * x_98));
+      }
+    }
+  }
+  const float x_104 = asfloat(x_20[0].x);
+  const float x_106 = asfloat(x_20[0].y);
+  if ((x_104 < x_106)) {
+    x_58 = abs(c);
+  } else {
+    x_58 = c;
+  }
+  const float3 x_115 = normalize(x_58);
+  x_GLF_color = float4(x_115.x, x_115.y, x_115.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-injected-conditional-true/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-injected-conditional-true/1.wgsl.expected.msl
new file mode 100755
index 0000000..d03ce1e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-injected-conditional-true/1.wgsl.expected.msl
@@ -0,0 +1,135 @@
+SKIP: FAILED
+
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct buf1 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float compute_value_f1_f1_(thread float* const limit, thread float* const thirty_two) {
+  float result = 0.0f;
+  int i = 0;
+  result = -0.5f;
+  i = 1;
+  while (true) {
+    int const x_125 = i;
+    if ((x_125 < 800)) {
+    } else {
+      break;
+    }
+    int const x_128 = i;
+    if (((x_128 % 32) == 0)) {
+      float const x_134 = result;
+      result = (x_134 + 0.400000006f);
+    } else {
+      int const x_136 = i;
+      float const x_138 = *(thirty_two);
+      if (((float(x_136) % rint(x_138)) <= 0.01f)) {
+        float const x_144 = result;
+        result = (x_144 + 100.0f);
+      }
+    }
+    int const x_146 = i;
+    float const x_148 = *(limit);
+    if ((float(x_146) >= x_148)) {
+      float const x_152 = result;
+      return x_152;
+    }
+    {
+      int const x_153 = i;
+      i = (x_153 + 1);
+    }
+  }
+  float const x_155 = result;
+  return x_155;
+}
+
+void main_1(constant buf0& x_13, constant buf1& x_20, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float3 c = 0.0f;
+  float thirty_two_1 = 0.0f;
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  float param_2 = 0.0f;
+  float param_3 = 0.0f;
+  int i_1 = 0;
+  float3 x_58 = 0.0f;
+  c = float3(7.0f, 8.0f, 9.0f);
+  float const x_60 = x_13.resolution.x;
+  thirty_two_1 = rint((x_60 / 8.0f));
+  float const x_64 = (*(tint_symbol_5)).x;
+  param = x_64;
+  float const x_65 = thirty_two_1;
+  param_1 = x_65;
+  float const x_66 = compute_value_f1_f1_(&(param), &(param_1));
+  c.x = x_66;
+  float const x_69 = (*(tint_symbol_5)).y;
+  param_2 = x_69;
+  float const x_70 = thirty_two_1;
+  param_3 = x_70;
+  float const x_71 = compute_value_f1_f1_(&(param_2), &(param_3));
+  c.y = x_71;
+  float const x_74 = c.x;
+  float const x_76 = c.y;
+  c.z = (x_74 + x_76);
+  i_1 = 0;
+  while (true) {
+    int const x_83 = i_1;
+    if ((x_83 < 3)) {
+    } else {
+      break;
+    }
+    int const x_86 = i_1;
+    float const x_88 = c[x_86];
+    if ((x_88 >= 1.0f)) {
+      int const x_92 = i_1;
+      int const x_93 = i_1;
+      float const x_95 = c[x_93];
+      int const x_96 = i_1;
+      float const x_98 = c[x_96];
+      c[x_92] = (x_95 * x_98);
+    }
+    {
+      int const x_101 = i_1;
+      i_1 = (x_101 + 1);
+    }
+  }
+  float const x_104 = x_20.injectionSwitch.x;
+  float const x_106 = x_20.injectionSwitch.y;
+  if ((x_104 < x_106)) {
+    float3 const x_111 = c;
+    x_58 = fabs(x_111);
+  } else {
+    float3 const x_113 = c;
+    x_58 = x_113;
+  }
+  float3 const x_114 = x_58;
+  float3 const x_115 = normalize(x_114);
+  *(tint_symbol_6) = float4(x_115.x, x_115.y, x_115.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_13 [[buffer(0)]], constant buf1& x_20 [[buffer(1)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_13, x_20, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
+T:\tmp\uf2s.0.metal:35:26: error: invalid operands to binary expression ('float' and 'float')
+      if (((float(x_136) % rint(x_138)) <= 0.01f)) {
+            ~~~~~~~~~~~~ ^ ~~~~~~~~~~~
+1 error generated.
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-injected-conditional-true/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-injected-conditional-true/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..91ba40f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-injected-conditional-true/1.wgsl.expected.spvasm
@@ -0,0 +1,295 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 186
+; Schema: 0
+               OpCapability Shader
+         %59 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_13 "x_13"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "injectionSwitch"
+               OpName %x_20 "x_20"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %compute_value_f1_f1_ "compute_value_f1_f1_"
+               OpName %limit "limit"
+               OpName %thirty_two "thirty_two"
+               OpName %result "result"
+               OpName %i "i"
+               OpName %main_1 "main_1"
+               OpName %c "c"
+               OpName %thirty_two_1 "thirty_two_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %i_1 "i_1"
+               OpName %x_58 "x_58"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_13 NonWritable
+               OpDecorate %x_13 DescriptorSet 0
+               OpDecorate %x_13 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_20 NonWritable
+               OpDecorate %x_20 DescriptorSet 0
+               OpDecorate %x_20 Binding 1
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_13 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_20 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+%_ptr_Function_float = OpTypePointer Function %float
+         %18 = OpTypeFunction %float %_ptr_Function_float %_ptr_Function_float
+         %25 = OpConstantNull %float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpConstantNull %int
+ %float_n0_5 = OpConstant %float -0.5
+      %int_1 = OpConstant %int 1
+    %int_800 = OpConstant %int 800
+       %bool = OpTypeBool
+     %int_32 = OpConstant %int 32
+      %int_0 = OpConstant %int 0
+%float_0_400000006 = OpConstant %float 0.400000006
+%float_0_00999999978 = OpConstant %float 0.00999999978
+  %float_100 = OpConstant %float 100
+       %void = OpTypeVoid
+         %79 = OpTypeFunction %void
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %86 = OpConstantNull %v3float
+    %float_7 = OpConstant %float 7
+    %float_8 = OpConstant %float 8
+    %float_9 = OpConstant %float 9
+         %97 = OpConstantComposite %v3float %float_7 %float_8 %float_9
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Private_float = OpTypePointer Private %float
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+      %int_3 = OpConstant %int 3
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %173 = OpTypeFunction %void %main_out
+%compute_value_f1_f1_ = OpFunction %float None %18
+      %limit = OpFunctionParameter %_ptr_Function_float
+ %thirty_two = OpFunctionParameter %_ptr_Function_float
+         %23 = OpLabel
+     %result = OpVariable %_ptr_Function_float Function %25
+          %i = OpVariable %_ptr_Function_int Function %29
+               OpStore %result %float_n0_5
+               OpStore %i %int_1
+               OpBranch %32
+         %32 = OpLabel
+               OpLoopMerge %33 %34 None
+               OpBranch %35
+         %35 = OpLabel
+         %36 = OpLoad %int %i
+         %38 = OpSLessThan %bool %36 %int_800
+               OpSelectionMerge %40 None
+               OpBranchConditional %38 %41 %42
+         %41 = OpLabel
+               OpBranch %40
+         %42 = OpLabel
+               OpBranch %33
+         %40 = OpLabel
+         %43 = OpLoad %int %i
+         %45 = OpSMod %int %43 %int_32
+         %47 = OpIEqual %bool %45 %int_0
+               OpSelectionMerge %48 None
+               OpBranchConditional %47 %49 %50
+         %49 = OpLabel
+         %51 = OpLoad %float %result
+         %53 = OpFAdd %float %51 %float_0_400000006
+               OpStore %result %53
+               OpBranch %48
+         %50 = OpLabel
+         %54 = OpLoad %int %i
+         %56 = OpLoad %float %thirty_two
+         %57 = OpConvertSToF %float %54
+         %58 = OpExtInst %float %59 RoundEven %56
+         %60 = OpFMod %float %57 %58
+         %62 = OpFOrdLessThanEqual %bool %60 %float_0_00999999978
+               OpSelectionMerge %63 None
+               OpBranchConditional %62 %64 %63
+         %64 = OpLabel
+         %65 = OpLoad %float %result
+         %67 = OpFAdd %float %65 %float_100
+               OpStore %result %67
+               OpBranch %63
+         %63 = OpLabel
+               OpBranch %48
+         %48 = OpLabel
+         %68 = OpLoad %int %i
+         %70 = OpLoad %float %limit
+         %71 = OpConvertSToF %float %68
+         %72 = OpFOrdGreaterThanEqual %bool %71 %70
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %74 %73
+         %74 = OpLabel
+         %75 = OpLoad %float %result
+               OpReturnValue %75
+         %73 = OpLabel
+               OpBranch %34
+         %34 = OpLabel
+         %76 = OpLoad %int %i
+         %77 = OpIAdd %int %76 %int_1
+               OpStore %i %77
+               OpBranch %32
+         %33 = OpLabel
+         %78 = OpLoad %float %result
+               OpReturnValue %78
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %79
+         %82 = OpLabel
+          %c = OpVariable %_ptr_Function_v3float Function %86
+%thirty_two_1 = OpVariable %_ptr_Function_float Function %25
+      %param = OpVariable %_ptr_Function_float Function %25
+    %param_1 = OpVariable %_ptr_Function_float Function %25
+    %param_2 = OpVariable %_ptr_Function_float Function %25
+    %param_3 = OpVariable %_ptr_Function_float Function %25
+        %i_1 = OpVariable %_ptr_Function_int Function %29
+       %x_58 = OpVariable %_ptr_Function_v3float Function %86
+               OpStore %c %97
+        %101 = OpAccessChain %_ptr_Uniform_float %x_13 %uint_0 %uint_0
+        %102 = OpLoad %float %101
+        %104 = OpFDiv %float %102 %float_8
+        %103 = OpExtInst %float %59 RoundEven %104
+               OpStore %thirty_two_1 %103
+        %106 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+        %107 = OpLoad %float %106
+               OpStore %param %107
+        %108 = OpLoad %float %thirty_two_1
+               OpStore %param_1 %108
+        %109 = OpFunctionCall %float %compute_value_f1_f1_ %param %param_1
+        %112 = OpAccessChain %_ptr_Function_float %c %uint_0
+               OpStore %112 %109
+        %114 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %115 = OpLoad %float %114
+               OpStore %param_2 %115
+        %116 = OpLoad %float %thirty_two_1
+               OpStore %param_3 %116
+        %117 = OpFunctionCall %float %compute_value_f1_f1_ %param_2 %param_3
+        %120 = OpAccessChain %_ptr_Function_float %c %uint_1
+               OpStore %120 %117
+        %121 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %122 = OpLoad %float %121
+        %123 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %124 = OpLoad %float %123
+        %126 = OpAccessChain %_ptr_Function_float %c %uint_2
+        %127 = OpFAdd %float %122 %124
+               OpStore %126 %127
+               OpStore %i_1 %int_0
+               OpBranch %128
+        %128 = OpLabel
+               OpLoopMerge %129 %130 None
+               OpBranch %131
+        %131 = OpLabel
+        %132 = OpLoad %int %i_1
+        %134 = OpSLessThan %bool %132 %int_3
+               OpSelectionMerge %135 None
+               OpBranchConditional %134 %136 %137
+        %136 = OpLabel
+               OpBranch %135
+        %137 = OpLabel
+               OpBranch %129
+        %135 = OpLabel
+        %138 = OpLoad %int %i_1
+        %139 = OpAccessChain %_ptr_Function_float %c %138
+        %140 = OpLoad %float %139
+        %142 = OpFOrdGreaterThanEqual %bool %140 %float_1
+               OpSelectionMerge %143 None
+               OpBranchConditional %142 %144 %143
+        %144 = OpLabel
+        %145 = OpLoad %int %i_1
+        %146 = OpLoad %int %i_1
+        %147 = OpAccessChain %_ptr_Function_float %c %146
+        %148 = OpLoad %float %147
+        %149 = OpLoad %int %i_1
+        %150 = OpAccessChain %_ptr_Function_float %c %149
+        %151 = OpLoad %float %150
+        %152 = OpAccessChain %_ptr_Function_float %c %145
+        %153 = OpFMul %float %148 %151
+               OpStore %152 %153
+               OpBranch %143
+        %143 = OpLabel
+               OpBranch %130
+        %130 = OpLabel
+        %154 = OpLoad %int %i_1
+        %155 = OpIAdd %int %154 %int_1
+               OpStore %i_1 %155
+               OpBranch %128
+        %129 = OpLabel
+        %156 = OpAccessChain %_ptr_Uniform_float %x_20 %uint_0 %uint_0
+        %157 = OpLoad %float %156
+        %158 = OpAccessChain %_ptr_Uniform_float %x_20 %uint_0 %uint_1
+        %159 = OpLoad %float %158
+        %160 = OpFOrdLessThan %bool %157 %159
+               OpSelectionMerge %161 None
+               OpBranchConditional %160 %162 %163
+        %162 = OpLabel
+        %164 = OpLoad %v3float %c
+        %165 = OpExtInst %v3float %59 FAbs %164
+               OpStore %x_58 %165
+               OpBranch %161
+        %163 = OpLabel
+        %166 = OpLoad %v3float %c
+               OpStore %x_58 %166
+               OpBranch %161
+        %161 = OpLabel
+        %167 = OpLoad %v3float %x_58
+        %168 = OpExtInst %v3float %59 Normalize %167
+        %169 = OpCompositeExtract %float %168 0
+        %170 = OpCompositeExtract %float %168 1
+        %171 = OpCompositeExtract %float %168 2
+        %172 = OpCompositeConstruct %v4float %169 %170 %171 %float_1
+               OpStore %x_GLF_color %172
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %173
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %177 = OpLabel
+        %178 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %178
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %79
+        %180 = OpLabel
+        %181 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %181
+        %182 = OpFunctionCall %void %main_1
+        %184 = OpLoad %v4float %x_GLF_color
+        %185 = OpCompositeConstruct %main_out %184
+        %183 = OpFunctionCall %void %tint_symbol_3 %185
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-injected-conditional-true/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-injected-conditional-true/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..60de1ab
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-injected-conditional-true/1.wgsl.expected.wgsl
@@ -0,0 +1,133 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+[[block]]
+struct buf1 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_13 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_20 : buf1;
+
+fn compute_value_f1_f1_(limit : ptr<function, f32>, thirty_two : ptr<function, f32>) -> f32 {
+  var result : f32;
+  var i : i32;
+  result = -0.5;
+  i = 1;
+  loop {
+    let x_125 : i32 = i;
+    if ((x_125 < 800)) {
+    } else {
+      break;
+    }
+    let x_128 : i32 = i;
+    if (((x_128 % 32) == 0)) {
+      let x_134 : f32 = result;
+      result = (x_134 + 0.400000006);
+    } else {
+      let x_136 : i32 = i;
+      let x_138 : f32 = *(thirty_two);
+      if (((f32(x_136) % round(x_138)) <= 0.01)) {
+        let x_144 : f32 = result;
+        result = (x_144 + 100.0);
+      }
+    }
+    let x_146 : i32 = i;
+    let x_148 : f32 = *(limit);
+    if ((f32(x_146) >= x_148)) {
+      let x_152 : f32 = result;
+      return x_152;
+    }
+
+    continuing {
+      let x_153 : i32 = i;
+      i = (x_153 + 1);
+    }
+  }
+  let x_155 : f32 = result;
+  return x_155;
+}
+
+fn main_1() {
+  var c : vec3<f32>;
+  var thirty_two_1 : f32;
+  var param : f32;
+  var param_1 : f32;
+  var param_2 : f32;
+  var param_3 : f32;
+  var i_1 : i32;
+  var x_58 : vec3<f32>;
+  c = vec3<f32>(7.0, 8.0, 9.0);
+  let x_60 : f32 = x_13.resolution.x;
+  thirty_two_1 = round((x_60 / 8.0));
+  let x_64 : f32 = gl_FragCoord.x;
+  param = x_64;
+  let x_65 : f32 = thirty_two_1;
+  param_1 = x_65;
+  let x_66 : f32 = compute_value_f1_f1_(&(param), &(param_1));
+  c.x = x_66;
+  let x_69 : f32 = gl_FragCoord.y;
+  param_2 = x_69;
+  let x_70 : f32 = thirty_two_1;
+  param_3 = x_70;
+  let x_71 : f32 = compute_value_f1_f1_(&(param_2), &(param_3));
+  c.y = x_71;
+  let x_74 : f32 = c.x;
+  let x_76 : f32 = c.y;
+  c.z = (x_74 + x_76);
+  i_1 = 0;
+  loop {
+    let x_83 : i32 = i_1;
+    if ((x_83 < 3)) {
+    } else {
+      break;
+    }
+    let x_86 : i32 = i_1;
+    let x_88 : f32 = c[x_86];
+    if ((x_88 >= 1.0)) {
+      let x_92 : i32 = i_1;
+      let x_93 : i32 = i_1;
+      let x_95 : f32 = c[x_93];
+      let x_96 : i32 = i_1;
+      let x_98 : f32 = c[x_96];
+      c[x_92] = (x_95 * x_98);
+    }
+
+    continuing {
+      let x_101 : i32 = i_1;
+      i_1 = (x_101 + 1);
+    }
+  }
+  let x_104 : f32 = x_20.injectionSwitch.x;
+  let x_106 : f32 = x_20.injectionSwitch.y;
+  if ((x_104 < x_106)) {
+    let x_111 : vec3<f32> = c;
+    x_58 = abs(x_111);
+  } else {
+    let x_113 : vec3<f32> = c;
+    x_58 = x_113;
+  }
+  let x_114 : vec3<f32> = x_58;
+  let x_115 : vec3<f32> = normalize(x_114);
+  x_GLF_color = vec4<f32>(x_115.x, x_115.y, x_115.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/0-opt.spvasm
new file mode 100644
index 0000000..b936413
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/0-opt.spvasm
@@ -0,0 +1,180 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %compute_value_f1_f1_ "compute_value(f1;f1;"
+               OpName %limit "limit"
+               OpName %thirty_two "thirty_two"
+               OpName %c "c"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %param_1 "param"
+               OpName %param_2 "param"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %16 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+         %19 = OpTypeFunction %float %_ptr_Function_float %_ptr_Function_float
+ %float_n0_5 = OpConstant %float -0.5
+        %int = OpTypeInt 32 1
+      %int_1 = OpConstant %int 1
+    %int_800 = OpConstant %int 800
+       %bool = OpTypeBool
+     %int_32 = OpConstant %int 32
+      %int_0 = OpConstant %int 0
+%float_0_400000006 = OpConstant %float 0.400000006
+%float_0_00999999978 = OpConstant %float 0.00999999978
+  %float_100 = OpConstant %float 100
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+    %float_7 = OpConstant %float 7
+    %float_8 = OpConstant %float 8
+    %float_9 = OpConstant %float 9
+         %35 = OpConstantComposite %v3float %float_7 %float_8 %float_9
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+%_ptr_Input_float = OpTypePointer Input %float
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+      %int_3 = OpConstant %int 3
+    %float_1 = OpConstant %float 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+%float_0_125 = OpConstant %float 0.125
+       %main = OpFunction %void None %16
+         %50 = OpLabel
+          %c = OpVariable %_ptr_Function_v3float Function
+      %param = OpVariable %_ptr_Function_float Function
+    %param_0 = OpVariable %_ptr_Function_float Function
+    %param_1 = OpVariable %_ptr_Function_float Function
+    %param_2 = OpVariable %_ptr_Function_float Function
+               OpStore %c %35
+         %51 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %52 = OpLoad %float %51
+         %53 = OpFMul %float %52 %float_0_125
+         %54 = OpExtInst %float %1 Round %53
+         %55 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %56 = OpLoad %float %55
+               OpStore %param %56
+               OpStore %param_0 %54
+         %57 = OpFunctionCall %float %compute_value_f1_f1_ %param %param_0
+         %58 = OpAccessChain %_ptr_Function_float %c %uint_0
+               OpStore %58 %57
+         %59 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %60 = OpLoad %float %59
+               OpStore %param_1 %60
+               OpStore %param_2 %54
+         %61 = OpFunctionCall %float %compute_value_f1_f1_ %param_1 %param_2
+         %62 = OpAccessChain %_ptr_Function_float %c %uint_1
+               OpStore %62 %61
+         %63 = OpLoad %float %58
+         %64 = OpLoad %float %62
+         %65 = OpFAdd %float %63 %64
+         %66 = OpAccessChain %_ptr_Function_float %c %uint_2
+               OpStore %66 %65
+               OpBranch %67
+         %67 = OpLabel
+         %68 = OpPhi %int %int_0 %50 %69 %70
+         %71 = OpSLessThan %bool %68 %int_3
+               OpLoopMerge %72 %70 None
+               OpBranchConditional %71 %73 %72
+         %73 = OpLabel
+         %74 = OpAccessChain %_ptr_Function_float %c %68
+         %75 = OpLoad %float %74
+         %76 = OpFOrdGreaterThanEqual %bool %75 %float_1
+               OpSelectionMerge %77 None
+               OpBranchConditional %76 %78 %77
+         %78 = OpLabel
+         %79 = OpLoad %float %74
+         %80 = OpLoad %float %74
+         %81 = OpFMul %float %79 %80
+               OpStore %74 %81
+               OpBranch %77
+         %77 = OpLabel
+               OpBranch %70
+         %70 = OpLabel
+         %69 = OpIAdd %int %68 %int_1
+               OpBranch %67
+         %72 = OpLabel
+         %82 = OpLoad %v3float %c
+         %83 = OpExtInst %v3float %1 FAbs %82
+         %84 = OpExtInst %v3float %1 Normalize %83
+         %85 = OpCompositeExtract %float %84 0
+         %86 = OpCompositeExtract %float %84 1
+         %87 = OpCompositeExtract %float %84 2
+         %88 = OpCompositeConstruct %v4float %85 %86 %87 %float_1
+               OpStore %_GLF_color %88
+               OpReturn
+               OpFunctionEnd
+%compute_value_f1_f1_ = OpFunction %float None %19
+      %limit = OpFunctionParameter %_ptr_Function_float
+ %thirty_two = OpFunctionParameter %_ptr_Function_float
+         %89 = OpLabel
+               OpBranch %90
+         %90 = OpLabel
+         %91 = OpPhi %float %float_n0_5 %89 %92 %93
+         %94 = OpPhi %int %int_1 %89 %95 %93
+         %96 = OpSLessThan %bool %94 %int_800
+               OpLoopMerge %97 %93 None
+               OpBranchConditional %96 %98 %97
+         %98 = OpLabel
+         %99 = OpSMod %int %94 %int_32
+        %100 = OpIEqual %bool %99 %int_0
+               OpSelectionMerge %101 None
+               OpBranchConditional %100 %102 %103
+        %102 = OpLabel
+        %104 = OpFAdd %float %91 %float_0_400000006
+               OpBranch %101
+        %103 = OpLabel
+        %105 = OpConvertSToF %float %94
+        %106 = OpLoad %float %thirty_two
+        %107 = OpExtInst %float %1 Round %106
+        %108 = OpFMod %float %105 %107
+        %109 = OpFOrdLessThanEqual %bool %108 %float_0_00999999978
+               OpSelectionMerge %110 None
+               OpBranchConditional %109 %111 %110
+        %111 = OpLabel
+        %112 = OpFAdd %float %91 %float_100
+               OpBranch %110
+        %110 = OpLabel
+        %113 = OpPhi %float %91 %103 %112 %111
+               OpBranch %101
+        %101 = OpLabel
+         %92 = OpPhi %float %104 %102 %113 %110
+        %114 = OpConvertSToF %float %94
+        %115 = OpLoad %float %limit
+        %116 = OpFOrdGreaterThanEqual %bool %114 %115
+               OpSelectionMerge %117 None
+               OpBranchConditional %116 %118 %117
+        %118 = OpLabel
+               OpReturnValue %92
+        %117 = OpLabel
+               OpBranch %93
+         %93 = OpLabel
+         %95 = OpIAdd %int %94 %int_1
+               OpBranch %90
+         %97 = OpLabel
+               OpReturnValue %91
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..125f7d9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,123 @@
+void set_float3(inout float3 vec, int idx, float val) {
+  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
+}
+
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float compute_value_f1_f1_(inout float limit, inout float thirty_two) {
+  float x_91 = 0.0f;
+  float x_91_phi = 0.0f;
+  int x_94_phi = 0;
+  x_91_phi = -0.5f;
+  x_94_phi = 1;
+  while (true) {
+    float x_104 = 0.0f;
+    float x_113 = 0.0f;
+    int x_95 = 0;
+    float x_92_phi = 0.0f;
+    x_91 = x_91_phi;
+    const int x_94 = x_94_phi;
+    if ((x_94 < 800)) {
+    } else {
+      break;
+    }
+    float x_112 = 0.0f;
+    float x_113_phi = 0.0f;
+    if (((x_94 % 32) == 0)) {
+      x_104 = (x_91 + 0.400000006f);
+      x_92_phi = x_104;
+    } else {
+      const float x_106 = thirty_two;
+      x_113_phi = x_91;
+      if (((float(x_94) % round(x_106)) <= 0.01f)) {
+        x_112 = (x_91 + 100.0f);
+        x_113_phi = x_112;
+      }
+      x_113 = x_113_phi;
+      x_92_phi = x_113;
+    }
+    float x_92 = 0.0f;
+    x_92 = x_92_phi;
+    const float x_115 = limit;
+    if ((float(x_94) >= x_115)) {
+      return x_92;
+    }
+    {
+      x_95 = (x_94 + 1);
+      x_91_phi = x_92;
+      x_94_phi = x_95;
+    }
+  }
+  return x_91;
+}
+
+void main_1() {
+  float3 c = float3(0.0f, 0.0f, 0.0f);
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  float param_2 = 0.0f;
+  float param_3 = 0.0f;
+  int x_68_phi = 0;
+  c = float3(7.0f, 8.0f, 9.0f);
+  const float x_52 = asfloat(x_10[0].x);
+  const float x_54 = round((x_52 * 0.125f));
+  const float x_56 = gl_FragCoord.x;
+  param = x_56;
+  param_1 = x_54;
+  const float x_57 = compute_value_f1_f1_(param, param_1);
+  c.x = x_57;
+  const float x_60 = gl_FragCoord.y;
+  param_2 = x_60;
+  param_3 = x_54;
+  const float x_61 = compute_value_f1_f1_(param_2, param_3);
+  c.y = x_61;
+  const float x_63 = c.x;
+  const float x_64 = c.y;
+  c.z = (x_63 + x_64);
+  x_68_phi = 0;
+  while (true) {
+    int x_69 = 0;
+    const int x_68 = x_68_phi;
+    if ((x_68 < 3)) {
+    } else {
+      break;
+    }
+    const int x_74_save = x_68;
+    const float x_75 = c[x_74_save];
+    if ((x_75 >= 1.0f)) {
+      const float x_79 = c[x_74_save];
+      const float x_80 = c[x_74_save];
+      set_float3(c, x_74_save, (x_79 * x_80));
+    }
+    {
+      x_69 = (x_68 + 1);
+      x_68_phi = x_69;
+    }
+  }
+  const float3 x_84 = normalize(abs(c));
+  x_GLF_color = float4(x_84.x, x_84.y, x_84.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/0-opt.spvasm.expected.msl
new file mode 100755
index 0000000..798c221
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/0-opt.spvasm.expected.msl
@@ -0,0 +1,126 @@
+SKIP: FAILED
+
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float compute_value_f1_f1_(thread float* const limit, thread float* const thirty_two) {
+  float x_91 = 0.0f;
+  float x_91_phi = 0.0f;
+  int x_94_phi = 0;
+  x_91_phi = -0.5f;
+  x_94_phi = 1;
+  while (true) {
+    float x_104 = 0.0f;
+    float x_113 = 0.0f;
+    int x_95 = 0;
+    float x_92_phi = 0.0f;
+    x_91 = x_91_phi;
+    int const x_94 = x_94_phi;
+    if ((x_94 < 800)) {
+    } else {
+      break;
+    }
+    float x_112 = 0.0f;
+    float x_113_phi = 0.0f;
+    if (((x_94 % 32) == 0)) {
+      x_104 = (x_91 + 0.400000006f);
+      x_92_phi = x_104;
+    } else {
+      float const x_106 = *(thirty_two);
+      x_113_phi = x_91;
+      if (((float(x_94) % rint(x_106)) <= 0.01f)) {
+        x_112 = (x_91 + 100.0f);
+        x_113_phi = x_112;
+      }
+      x_113 = x_113_phi;
+      x_92_phi = x_113;
+    }
+    float x_92 = 0.0f;
+    x_92 = x_92_phi;
+    float const x_115 = *(limit);
+    if ((float(x_94) >= x_115)) {
+      return x_92;
+    }
+    {
+      x_95 = (x_94 + 1);
+      x_91_phi = x_92;
+      x_94_phi = x_95;
+    }
+  }
+  return x_91;
+}
+
+void main_1(constant buf0& x_10, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float3 c = 0.0f;
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  float param_2 = 0.0f;
+  float param_3 = 0.0f;
+  int x_68_phi = 0;
+  c = float3(7.0f, 8.0f, 9.0f);
+  float const x_52 = x_10.resolution.x;
+  float const x_54 = rint((x_52 * 0.125f));
+  float const x_56 = (*(tint_symbol_5)).x;
+  param = x_56;
+  param_1 = x_54;
+  float const x_57 = compute_value_f1_f1_(&(param), &(param_1));
+  c.x = x_57;
+  float const x_60 = (*(tint_symbol_5)).y;
+  param_2 = x_60;
+  param_3 = x_54;
+  float const x_61 = compute_value_f1_f1_(&(param_2), &(param_3));
+  c.y = x_61;
+  float const x_63 = c.x;
+  float const x_64 = c.y;
+  c.z = (x_63 + x_64);
+  x_68_phi = 0;
+  while (true) {
+    int x_69 = 0;
+    int const x_68 = x_68_phi;
+    if ((x_68 < 3)) {
+    } else {
+      break;
+    }
+    int const x_74_save = x_68;
+    float const x_75 = c[x_74_save];
+    if ((x_75 >= 1.0f)) {
+      float const x_79 = c[x_74_save];
+      float const x_80 = c[x_74_save];
+      c[x_74_save] = (x_79 * x_80);
+    }
+    {
+      x_69 = (x_68 + 1);
+      x_68_phi = x_69;
+    }
+  }
+  float3 const x_82 = c;
+  float3 const x_84 = normalize(fabs(x_82));
+  *(tint_symbol_6) = float4(x_84.x, x_84.y, x_84.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_10 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_10, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
+T:\tmp\u26w.0.metal:39:25: error: invalid operands to binary expression ('float' and 'float')
+      if (((float(x_94) % rint(x_106)) <= 0.01f)) {
+            ~~~~~~~~~~~ ^ ~~~~~~~~~~~
+1 error generated.
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..42303b9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,291 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 180
+; Schema: 0
+               OpCapability Shader
+         %64 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_10 "x_10"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %compute_value_f1_f1_ "compute_value_f1_f1_"
+               OpName %limit "limit"
+               OpName %thirty_two "thirty_two"
+               OpName %x_91 "x_91"
+               OpName %x_91_phi "x_91_phi"
+               OpName %x_94_phi "x_94_phi"
+               OpName %x_104 "x_104"
+               OpName %x_113 "x_113"
+               OpName %x_95 "x_95"
+               OpName %x_92_phi "x_92_phi"
+               OpName %x_112 "x_112"
+               OpName %x_113_phi "x_113_phi"
+               OpName %x_92 "x_92"
+               OpName %main_1 "main_1"
+               OpName %c "c"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %x_68_phi "x_68_phi"
+               OpName %x_69 "x_69"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+%_ptr_Function_float = OpTypePointer Function %float
+         %15 = OpTypeFunction %float %_ptr_Function_float %_ptr_Function_float
+         %22 = OpConstantNull %float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %27 = OpConstantNull %int
+ %float_n0_5 = OpConstant %float -0.5
+      %int_1 = OpConstant %int 1
+    %int_800 = OpConstant %int 800
+       %bool = OpTypeBool
+     %int_32 = OpConstant %int 32
+      %int_0 = OpConstant %int 0
+%float_0_400000006 = OpConstant %float 0.400000006
+%float_0_00999999978 = OpConstant %float 0.00999999978
+  %float_100 = OpConstant %float 100
+       %void = OpTypeVoid
+         %89 = OpTypeFunction %void
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %96 = OpConstantNull %v3float
+    %float_7 = OpConstant %float 7
+    %float_8 = OpConstant %float 8
+    %float_9 = OpConstant %float 9
+        %105 = OpConstantComposite %v3float %float_7 %float_8 %float_9
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%float_0_125 = OpConstant %float 0.125
+%_ptr_Private_float = OpTypePointer Private %float
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+      %int_3 = OpConstant %int 3
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %167 = OpTypeFunction %void %main_out
+%compute_value_f1_f1_ = OpFunction %float None %15
+      %limit = OpFunctionParameter %_ptr_Function_float
+ %thirty_two = OpFunctionParameter %_ptr_Function_float
+         %20 = OpLabel
+       %x_91 = OpVariable %_ptr_Function_float Function %22
+   %x_91_phi = OpVariable %_ptr_Function_float Function %22
+   %x_94_phi = OpVariable %_ptr_Function_int Function %27
+      %x_104 = OpVariable %_ptr_Function_float Function %22
+      %x_113 = OpVariable %_ptr_Function_float Function %22
+       %x_95 = OpVariable %_ptr_Function_int Function %27
+   %x_92_phi = OpVariable %_ptr_Function_float Function %22
+      %x_112 = OpVariable %_ptr_Function_float Function %22
+  %x_113_phi = OpVariable %_ptr_Function_float Function %22
+       %x_92 = OpVariable %_ptr_Function_float Function %22
+               OpStore %x_91_phi %float_n0_5
+               OpStore %x_94_phi %int_1
+               OpBranch %30
+         %30 = OpLabel
+               OpLoopMerge %31 %32 None
+               OpBranch %33
+         %33 = OpLabel
+         %38 = OpLoad %float %x_91_phi
+               OpStore %x_91 %38
+         %39 = OpLoad %int %x_94_phi
+         %41 = OpSLessThan %bool %39 %int_800
+               OpSelectionMerge %43 None
+               OpBranchConditional %41 %44 %45
+         %44 = OpLabel
+               OpBranch %43
+         %45 = OpLabel
+               OpBranch %31
+         %43 = OpLabel
+         %49 = OpSMod %int %39 %int_32
+         %51 = OpIEqual %bool %49 %int_0
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %54
+         %53 = OpLabel
+         %55 = OpLoad %float %x_91
+         %57 = OpFAdd %float %55 %float_0_400000006
+               OpStore %x_104 %57
+         %58 = OpLoad %float %x_104
+               OpStore %x_92_phi %58
+               OpBranch %52
+         %54 = OpLabel
+         %60 = OpLoad %float %thirty_two
+         %61 = OpLoad %float %x_91
+               OpStore %x_113_phi %61
+         %62 = OpConvertSToF %float %39
+         %63 = OpExtInst %float %64 RoundEven %60
+         %65 = OpFMod %float %62 %63
+         %67 = OpFOrdLessThanEqual %bool %65 %float_0_00999999978
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %68
+         %69 = OpLabel
+         %70 = OpLoad %float %x_91
+         %72 = OpFAdd %float %70 %float_100
+               OpStore %x_112 %72
+         %73 = OpLoad %float %x_112
+               OpStore %x_113_phi %73
+               OpBranch %68
+         %68 = OpLabel
+         %74 = OpLoad %float %x_113_phi
+               OpStore %x_113 %74
+         %75 = OpLoad %float %x_113
+               OpStore %x_92_phi %75
+               OpBranch %52
+         %52 = OpLabel
+         %77 = OpLoad %float %x_92_phi
+               OpStore %x_92 %77
+         %79 = OpLoad %float %limit
+         %80 = OpConvertSToF %float %39
+         %81 = OpFOrdGreaterThanEqual %bool %80 %79
+               OpSelectionMerge %82 None
+               OpBranchConditional %81 %83 %82
+         %83 = OpLabel
+         %84 = OpLoad %float %x_92
+               OpReturnValue %84
+         %82 = OpLabel
+               OpBranch %32
+         %32 = OpLabel
+         %85 = OpIAdd %int %39 %int_1
+               OpStore %x_95 %85
+         %86 = OpLoad %float %x_92
+               OpStore %x_91_phi %86
+         %87 = OpLoad %int %x_95
+               OpStore %x_94_phi %87
+               OpBranch %30
+         %31 = OpLabel
+         %88 = OpLoad %float %x_91
+               OpReturnValue %88
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %89
+         %92 = OpLabel
+          %c = OpVariable %_ptr_Function_v3float Function %96
+      %param = OpVariable %_ptr_Function_float Function %22
+    %param_1 = OpVariable %_ptr_Function_float Function %22
+    %param_2 = OpVariable %_ptr_Function_float Function %22
+    %param_3 = OpVariable %_ptr_Function_float Function %22
+   %x_68_phi = OpVariable %_ptr_Function_int Function %27
+       %x_69 = OpVariable %_ptr_Function_int Function %27
+               OpStore %c %105
+        %109 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %uint_0
+        %110 = OpLoad %float %109
+        %113 = OpFMul %float %110 %float_0_125
+        %111 = OpExtInst %float %64 RoundEven %113
+        %115 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+        %116 = OpLoad %float %115
+               OpStore %param %116
+               OpStore %param_1 %111
+        %117 = OpFunctionCall %float %compute_value_f1_f1_ %param %param_1
+        %120 = OpAccessChain %_ptr_Function_float %c %uint_0
+               OpStore %120 %117
+        %122 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %123 = OpLoad %float %122
+               OpStore %param_2 %123
+               OpStore %param_3 %111
+        %124 = OpFunctionCall %float %compute_value_f1_f1_ %param_2 %param_3
+        %127 = OpAccessChain %_ptr_Function_float %c %uint_1
+               OpStore %127 %124
+        %128 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %129 = OpLoad %float %128
+        %130 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %131 = OpLoad %float %130
+        %133 = OpAccessChain %_ptr_Function_float %c %uint_2
+        %134 = OpFAdd %float %129 %131
+               OpStore %133 %134
+               OpStore %x_68_phi %int_0
+               OpBranch %135
+        %135 = OpLabel
+               OpLoopMerge %136 %137 None
+               OpBranch %138
+        %138 = OpLabel
+        %140 = OpLoad %int %x_68_phi
+        %142 = OpSLessThan %bool %140 %int_3
+               OpSelectionMerge %143 None
+               OpBranchConditional %142 %144 %145
+        %144 = OpLabel
+               OpBranch %143
+        %145 = OpLabel
+               OpBranch %136
+        %143 = OpLabel
+        %146 = OpAccessChain %_ptr_Function_float %c %140
+        %147 = OpLoad %float %146
+        %149 = OpFOrdGreaterThanEqual %bool %147 %float_1
+               OpSelectionMerge %150 None
+               OpBranchConditional %149 %151 %150
+        %151 = OpLabel
+        %152 = OpAccessChain %_ptr_Function_float %c %140
+        %153 = OpLoad %float %152
+        %154 = OpAccessChain %_ptr_Function_float %c %140
+        %155 = OpLoad %float %154
+        %156 = OpAccessChain %_ptr_Function_float %c %140
+        %157 = OpFMul %float %153 %155
+               OpStore %156 %157
+               OpBranch %150
+        %150 = OpLabel
+               OpBranch %137
+        %137 = OpLabel
+        %158 = OpIAdd %int %140 %int_1
+               OpStore %x_69 %158
+        %159 = OpLoad %int %x_69
+               OpStore %x_68_phi %159
+               OpBranch %135
+        %136 = OpLabel
+        %160 = OpLoad %v3float %c
+        %162 = OpExtInst %v3float %64 FAbs %160
+        %161 = OpExtInst %v3float %64 Normalize %162
+        %163 = OpCompositeExtract %float %161 0
+        %164 = OpCompositeExtract %float %161 1
+        %165 = OpCompositeExtract %float %161 2
+        %166 = OpCompositeConstruct %v4float %163 %164 %165 %float_1
+               OpStore %x_GLF_color %166
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %167
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %171 = OpLabel
+        %172 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %172
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %89
+        %174 = OpLabel
+        %175 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %175
+        %176 = OpFunctionCall %void %main_1
+        %178 = OpLoad %v4float %x_GLF_color
+        %179 = OpCompositeConstruct %main_out %178
+        %177 = OpFunctionCall %void %tint_symbol_3 %179
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..ba37d91
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,122 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn compute_value_f1_f1_(limit : ptr<function, f32>, thirty_two : ptr<function, f32>) -> f32 {
+  var x_91 : f32;
+  var x_91_phi : f32;
+  var x_94_phi : i32;
+  x_91_phi = -0.5;
+  x_94_phi = 1;
+  loop {
+    var x_104 : f32;
+    var x_113 : f32;
+    var x_95 : i32;
+    var x_92_phi : f32;
+    x_91 = x_91_phi;
+    let x_94 : i32 = x_94_phi;
+    if ((x_94 < 800)) {
+    } else {
+      break;
+    }
+    var x_112 : f32;
+    var x_113_phi : f32;
+    if (((x_94 % 32) == 0)) {
+      x_104 = (x_91 + 0.400000006);
+      x_92_phi = x_104;
+    } else {
+      let x_106 : f32 = *(thirty_two);
+      x_113_phi = x_91;
+      if (((f32(x_94) % round(x_106)) <= 0.01)) {
+        x_112 = (x_91 + 100.0);
+        x_113_phi = x_112;
+      }
+      x_113 = x_113_phi;
+      x_92_phi = x_113;
+    }
+    var x_92 : f32;
+    x_92 = x_92_phi;
+    let x_115 : f32 = *(limit);
+    if ((f32(x_94) >= x_115)) {
+      return x_92;
+    }
+
+    continuing {
+      x_95 = (x_94 + 1);
+      x_91_phi = x_92;
+      x_94_phi = x_95;
+    }
+  }
+  return x_91;
+}
+
+fn main_1() {
+  var c : vec3<f32>;
+  var param : f32;
+  var param_1 : f32;
+  var param_2 : f32;
+  var param_3 : f32;
+  var x_68_phi : i32;
+  c = vec3<f32>(7.0, 8.0, 9.0);
+  let x_52 : f32 = x_10.resolution.x;
+  let x_54 : f32 = round((x_52 * 0.125));
+  let x_56 : f32 = gl_FragCoord.x;
+  param = x_56;
+  param_1 = x_54;
+  let x_57 : f32 = compute_value_f1_f1_(&(param), &(param_1));
+  let x_58 : ptr<function, f32> = &(c.x);
+  *(x_58) = x_57;
+  let x_60 : f32 = gl_FragCoord.y;
+  param_2 = x_60;
+  param_3 = x_54;
+  let x_61 : f32 = compute_value_f1_f1_(&(param_2), &(param_3));
+  let x_62 : ptr<function, f32> = &(c.y);
+  *(x_62) = x_61;
+  let x_63 : f32 = *(x_58);
+  let x_64 : f32 = *(x_62);
+  c.z = (x_63 + x_64);
+  x_68_phi = 0;
+  loop {
+    var x_69 : i32;
+    let x_68 : i32 = x_68_phi;
+    if ((x_68 < 3)) {
+    } else {
+      break;
+    }
+    let x_74 : ptr<function, f32> = &(c[x_68]);
+    let x_75 : f32 = *(x_74);
+    if ((x_75 >= 1.0)) {
+      let x_79 : f32 = *(x_74);
+      let x_80 : f32 = *(x_74);
+      *(x_74) = (x_79 * x_80);
+    }
+
+    continuing {
+      x_69 = (x_68 + 1);
+      x_68_phi = x_69;
+    }
+  }
+  let x_82 : vec3<f32> = c;
+  let x_84 : vec3<f32> = normalize(abs(x_82));
+  x_GLF_color = vec4<f32>(x_84.x, x_84.y, x_84.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/0-opt.wgsl
new file mode 100644
index 0000000..ba37d91
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/0-opt.wgsl
@@ -0,0 +1,122 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn compute_value_f1_f1_(limit : ptr<function, f32>, thirty_two : ptr<function, f32>) -> f32 {
+  var x_91 : f32;
+  var x_91_phi : f32;
+  var x_94_phi : i32;
+  x_91_phi = -0.5;
+  x_94_phi = 1;
+  loop {
+    var x_104 : f32;
+    var x_113 : f32;
+    var x_95 : i32;
+    var x_92_phi : f32;
+    x_91 = x_91_phi;
+    let x_94 : i32 = x_94_phi;
+    if ((x_94 < 800)) {
+    } else {
+      break;
+    }
+    var x_112 : f32;
+    var x_113_phi : f32;
+    if (((x_94 % 32) == 0)) {
+      x_104 = (x_91 + 0.400000006);
+      x_92_phi = x_104;
+    } else {
+      let x_106 : f32 = *(thirty_two);
+      x_113_phi = x_91;
+      if (((f32(x_94) % round(x_106)) <= 0.01)) {
+        x_112 = (x_91 + 100.0);
+        x_113_phi = x_112;
+      }
+      x_113 = x_113_phi;
+      x_92_phi = x_113;
+    }
+    var x_92 : f32;
+    x_92 = x_92_phi;
+    let x_115 : f32 = *(limit);
+    if ((f32(x_94) >= x_115)) {
+      return x_92;
+    }
+
+    continuing {
+      x_95 = (x_94 + 1);
+      x_91_phi = x_92;
+      x_94_phi = x_95;
+    }
+  }
+  return x_91;
+}
+
+fn main_1() {
+  var c : vec3<f32>;
+  var param : f32;
+  var param_1 : f32;
+  var param_2 : f32;
+  var param_3 : f32;
+  var x_68_phi : i32;
+  c = vec3<f32>(7.0, 8.0, 9.0);
+  let x_52 : f32 = x_10.resolution.x;
+  let x_54 : f32 = round((x_52 * 0.125));
+  let x_56 : f32 = gl_FragCoord.x;
+  param = x_56;
+  param_1 = x_54;
+  let x_57 : f32 = compute_value_f1_f1_(&(param), &(param_1));
+  let x_58 : ptr<function, f32> = &(c.x);
+  *(x_58) = x_57;
+  let x_60 : f32 = gl_FragCoord.y;
+  param_2 = x_60;
+  param_3 = x_54;
+  let x_61 : f32 = compute_value_f1_f1_(&(param_2), &(param_3));
+  let x_62 : ptr<function, f32> = &(c.y);
+  *(x_62) = x_61;
+  let x_63 : f32 = *(x_58);
+  let x_64 : f32 = *(x_62);
+  c.z = (x_63 + x_64);
+  x_68_phi = 0;
+  loop {
+    var x_69 : i32;
+    let x_68 : i32 = x_68_phi;
+    if ((x_68 < 3)) {
+    } else {
+      break;
+    }
+    let x_74 : ptr<function, f32> = &(c[x_68]);
+    let x_75 : f32 = *(x_74);
+    if ((x_75 >= 1.0)) {
+      let x_79 : f32 = *(x_74);
+      let x_80 : f32 = *(x_74);
+      *(x_74) = (x_79 * x_80);
+    }
+
+    continuing {
+      x_69 = (x_68 + 1);
+      x_68_phi = x_69;
+    }
+  }
+  let x_82 : vec3<f32> = c;
+  let x_84 : vec3<f32> = normalize(abs(x_82));
+  x_GLF_color = vec4<f32>(x_84.x, x_84.y, x_84.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..125f7d9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,123 @@
+void set_float3(inout float3 vec, int idx, float val) {
+  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
+}
+
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float compute_value_f1_f1_(inout float limit, inout float thirty_two) {
+  float x_91 = 0.0f;
+  float x_91_phi = 0.0f;
+  int x_94_phi = 0;
+  x_91_phi = -0.5f;
+  x_94_phi = 1;
+  while (true) {
+    float x_104 = 0.0f;
+    float x_113 = 0.0f;
+    int x_95 = 0;
+    float x_92_phi = 0.0f;
+    x_91 = x_91_phi;
+    const int x_94 = x_94_phi;
+    if ((x_94 < 800)) {
+    } else {
+      break;
+    }
+    float x_112 = 0.0f;
+    float x_113_phi = 0.0f;
+    if (((x_94 % 32) == 0)) {
+      x_104 = (x_91 + 0.400000006f);
+      x_92_phi = x_104;
+    } else {
+      const float x_106 = thirty_two;
+      x_113_phi = x_91;
+      if (((float(x_94) % round(x_106)) <= 0.01f)) {
+        x_112 = (x_91 + 100.0f);
+        x_113_phi = x_112;
+      }
+      x_113 = x_113_phi;
+      x_92_phi = x_113;
+    }
+    float x_92 = 0.0f;
+    x_92 = x_92_phi;
+    const float x_115 = limit;
+    if ((float(x_94) >= x_115)) {
+      return x_92;
+    }
+    {
+      x_95 = (x_94 + 1);
+      x_91_phi = x_92;
+      x_94_phi = x_95;
+    }
+  }
+  return x_91;
+}
+
+void main_1() {
+  float3 c = float3(0.0f, 0.0f, 0.0f);
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  float param_2 = 0.0f;
+  float param_3 = 0.0f;
+  int x_68_phi = 0;
+  c = float3(7.0f, 8.0f, 9.0f);
+  const float x_52 = asfloat(x_10[0].x);
+  const float x_54 = round((x_52 * 0.125f));
+  const float x_56 = gl_FragCoord.x;
+  param = x_56;
+  param_1 = x_54;
+  const float x_57 = compute_value_f1_f1_(param, param_1);
+  c.x = x_57;
+  const float x_60 = gl_FragCoord.y;
+  param_2 = x_60;
+  param_3 = x_54;
+  const float x_61 = compute_value_f1_f1_(param_2, param_3);
+  c.y = x_61;
+  const float x_63 = c.x;
+  const float x_64 = c.y;
+  c.z = (x_63 + x_64);
+  x_68_phi = 0;
+  while (true) {
+    int x_69 = 0;
+    const int x_68 = x_68_phi;
+    if ((x_68 < 3)) {
+    } else {
+      break;
+    }
+    const int x_74_save = x_68;
+    const float x_75 = c[x_74_save];
+    if ((x_75 >= 1.0f)) {
+      const float x_79 = c[x_74_save];
+      const float x_80 = c[x_74_save];
+      set_float3(c, x_74_save, (x_79 * x_80));
+    }
+    {
+      x_69 = (x_68 + 1);
+      x_68_phi = x_69;
+    }
+  }
+  const float3 x_84 = normalize(abs(c));
+  x_GLF_color = float4(x_84.x, x_84.y, x_84.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/0-opt.wgsl.expected.msl
new file mode 100755
index 0000000..5ee750f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/0-opt.wgsl.expected.msl
@@ -0,0 +1,126 @@
+SKIP: FAILED
+
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float compute_value_f1_f1_(thread float* const limit, thread float* const thirty_two) {
+  float x_91 = 0.0f;
+  float x_91_phi = 0.0f;
+  int x_94_phi = 0;
+  x_91_phi = -0.5f;
+  x_94_phi = 1;
+  while (true) {
+    float x_104 = 0.0f;
+    float x_113 = 0.0f;
+    int x_95 = 0;
+    float x_92_phi = 0.0f;
+    x_91 = x_91_phi;
+    int const x_94 = x_94_phi;
+    if ((x_94 < 800)) {
+    } else {
+      break;
+    }
+    float x_112 = 0.0f;
+    float x_113_phi = 0.0f;
+    if (((x_94 % 32) == 0)) {
+      x_104 = (x_91 + 0.400000006f);
+      x_92_phi = x_104;
+    } else {
+      float const x_106 = *(thirty_two);
+      x_113_phi = x_91;
+      if (((float(x_94) % rint(x_106)) <= 0.01f)) {
+        x_112 = (x_91 + 100.0f);
+        x_113_phi = x_112;
+      }
+      x_113 = x_113_phi;
+      x_92_phi = x_113;
+    }
+    float x_92 = 0.0f;
+    x_92 = x_92_phi;
+    float const x_115 = *(limit);
+    if ((float(x_94) >= x_115)) {
+      return x_92;
+    }
+    {
+      x_95 = (x_94 + 1);
+      x_91_phi = x_92;
+      x_94_phi = x_95;
+    }
+  }
+  return x_91;
+}
+
+void main_1(constant buf0& x_10, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float3 c = 0.0f;
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  float param_2 = 0.0f;
+  float param_3 = 0.0f;
+  int x_68_phi = 0;
+  c = float3(7.0f, 8.0f, 9.0f);
+  float const x_52 = x_10.resolution.x;
+  float const x_54 = rint((x_52 * 0.125f));
+  float const x_56 = (*(tint_symbol_5)).x;
+  param = x_56;
+  param_1 = x_54;
+  float const x_57 = compute_value_f1_f1_(&(param), &(param_1));
+  c.x = x_57;
+  float const x_60 = (*(tint_symbol_5)).y;
+  param_2 = x_60;
+  param_3 = x_54;
+  float const x_61 = compute_value_f1_f1_(&(param_2), &(param_3));
+  c.y = x_61;
+  float const x_63 = c.x;
+  float const x_64 = c.y;
+  c.z = (x_63 + x_64);
+  x_68_phi = 0;
+  while (true) {
+    int x_69 = 0;
+    int const x_68 = x_68_phi;
+    if ((x_68 < 3)) {
+    } else {
+      break;
+    }
+    int const x_74_save = x_68;
+    float const x_75 = c[x_74_save];
+    if ((x_75 >= 1.0f)) {
+      float const x_79 = c[x_74_save];
+      float const x_80 = c[x_74_save];
+      c[x_74_save] = (x_79 * x_80);
+    }
+    {
+      x_69 = (x_68 + 1);
+      x_68_phi = x_69;
+    }
+  }
+  float3 const x_82 = c;
+  float3 const x_84 = normalize(fabs(x_82));
+  *(tint_symbol_6) = float4(x_84.x, x_84.y, x_84.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_10 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_10, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
+T:\tmp\u8cs.0.metal:39:25: error: invalid operands to binary expression ('float' and 'float')
+      if (((float(x_94) % rint(x_106)) <= 0.01f)) {
+            ~~~~~~~~~~~ ^ ~~~~~~~~~~~
+1 error generated.
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..42303b9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,291 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 180
+; Schema: 0
+               OpCapability Shader
+         %64 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_10 "x_10"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %compute_value_f1_f1_ "compute_value_f1_f1_"
+               OpName %limit "limit"
+               OpName %thirty_two "thirty_two"
+               OpName %x_91 "x_91"
+               OpName %x_91_phi "x_91_phi"
+               OpName %x_94_phi "x_94_phi"
+               OpName %x_104 "x_104"
+               OpName %x_113 "x_113"
+               OpName %x_95 "x_95"
+               OpName %x_92_phi "x_92_phi"
+               OpName %x_112 "x_112"
+               OpName %x_113_phi "x_113_phi"
+               OpName %x_92 "x_92"
+               OpName %main_1 "main_1"
+               OpName %c "c"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %x_68_phi "x_68_phi"
+               OpName %x_69 "x_69"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+%_ptr_Function_float = OpTypePointer Function %float
+         %15 = OpTypeFunction %float %_ptr_Function_float %_ptr_Function_float
+         %22 = OpConstantNull %float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %27 = OpConstantNull %int
+ %float_n0_5 = OpConstant %float -0.5
+      %int_1 = OpConstant %int 1
+    %int_800 = OpConstant %int 800
+       %bool = OpTypeBool
+     %int_32 = OpConstant %int 32
+      %int_0 = OpConstant %int 0
+%float_0_400000006 = OpConstant %float 0.400000006
+%float_0_00999999978 = OpConstant %float 0.00999999978
+  %float_100 = OpConstant %float 100
+       %void = OpTypeVoid
+         %89 = OpTypeFunction %void
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %96 = OpConstantNull %v3float
+    %float_7 = OpConstant %float 7
+    %float_8 = OpConstant %float 8
+    %float_9 = OpConstant %float 9
+        %105 = OpConstantComposite %v3float %float_7 %float_8 %float_9
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%float_0_125 = OpConstant %float 0.125
+%_ptr_Private_float = OpTypePointer Private %float
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+      %int_3 = OpConstant %int 3
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %167 = OpTypeFunction %void %main_out
+%compute_value_f1_f1_ = OpFunction %float None %15
+      %limit = OpFunctionParameter %_ptr_Function_float
+ %thirty_two = OpFunctionParameter %_ptr_Function_float
+         %20 = OpLabel
+       %x_91 = OpVariable %_ptr_Function_float Function %22
+   %x_91_phi = OpVariable %_ptr_Function_float Function %22
+   %x_94_phi = OpVariable %_ptr_Function_int Function %27
+      %x_104 = OpVariable %_ptr_Function_float Function %22
+      %x_113 = OpVariable %_ptr_Function_float Function %22
+       %x_95 = OpVariable %_ptr_Function_int Function %27
+   %x_92_phi = OpVariable %_ptr_Function_float Function %22
+      %x_112 = OpVariable %_ptr_Function_float Function %22
+  %x_113_phi = OpVariable %_ptr_Function_float Function %22
+       %x_92 = OpVariable %_ptr_Function_float Function %22
+               OpStore %x_91_phi %float_n0_5
+               OpStore %x_94_phi %int_1
+               OpBranch %30
+         %30 = OpLabel
+               OpLoopMerge %31 %32 None
+               OpBranch %33
+         %33 = OpLabel
+         %38 = OpLoad %float %x_91_phi
+               OpStore %x_91 %38
+         %39 = OpLoad %int %x_94_phi
+         %41 = OpSLessThan %bool %39 %int_800
+               OpSelectionMerge %43 None
+               OpBranchConditional %41 %44 %45
+         %44 = OpLabel
+               OpBranch %43
+         %45 = OpLabel
+               OpBranch %31
+         %43 = OpLabel
+         %49 = OpSMod %int %39 %int_32
+         %51 = OpIEqual %bool %49 %int_0
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %54
+         %53 = OpLabel
+         %55 = OpLoad %float %x_91
+         %57 = OpFAdd %float %55 %float_0_400000006
+               OpStore %x_104 %57
+         %58 = OpLoad %float %x_104
+               OpStore %x_92_phi %58
+               OpBranch %52
+         %54 = OpLabel
+         %60 = OpLoad %float %thirty_two
+         %61 = OpLoad %float %x_91
+               OpStore %x_113_phi %61
+         %62 = OpConvertSToF %float %39
+         %63 = OpExtInst %float %64 RoundEven %60
+         %65 = OpFMod %float %62 %63
+         %67 = OpFOrdLessThanEqual %bool %65 %float_0_00999999978
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %68
+         %69 = OpLabel
+         %70 = OpLoad %float %x_91
+         %72 = OpFAdd %float %70 %float_100
+               OpStore %x_112 %72
+         %73 = OpLoad %float %x_112
+               OpStore %x_113_phi %73
+               OpBranch %68
+         %68 = OpLabel
+         %74 = OpLoad %float %x_113_phi
+               OpStore %x_113 %74
+         %75 = OpLoad %float %x_113
+               OpStore %x_92_phi %75
+               OpBranch %52
+         %52 = OpLabel
+         %77 = OpLoad %float %x_92_phi
+               OpStore %x_92 %77
+         %79 = OpLoad %float %limit
+         %80 = OpConvertSToF %float %39
+         %81 = OpFOrdGreaterThanEqual %bool %80 %79
+               OpSelectionMerge %82 None
+               OpBranchConditional %81 %83 %82
+         %83 = OpLabel
+         %84 = OpLoad %float %x_92
+               OpReturnValue %84
+         %82 = OpLabel
+               OpBranch %32
+         %32 = OpLabel
+         %85 = OpIAdd %int %39 %int_1
+               OpStore %x_95 %85
+         %86 = OpLoad %float %x_92
+               OpStore %x_91_phi %86
+         %87 = OpLoad %int %x_95
+               OpStore %x_94_phi %87
+               OpBranch %30
+         %31 = OpLabel
+         %88 = OpLoad %float %x_91
+               OpReturnValue %88
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %89
+         %92 = OpLabel
+          %c = OpVariable %_ptr_Function_v3float Function %96
+      %param = OpVariable %_ptr_Function_float Function %22
+    %param_1 = OpVariable %_ptr_Function_float Function %22
+    %param_2 = OpVariable %_ptr_Function_float Function %22
+    %param_3 = OpVariable %_ptr_Function_float Function %22
+   %x_68_phi = OpVariable %_ptr_Function_int Function %27
+       %x_69 = OpVariable %_ptr_Function_int Function %27
+               OpStore %c %105
+        %109 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %uint_0
+        %110 = OpLoad %float %109
+        %113 = OpFMul %float %110 %float_0_125
+        %111 = OpExtInst %float %64 RoundEven %113
+        %115 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+        %116 = OpLoad %float %115
+               OpStore %param %116
+               OpStore %param_1 %111
+        %117 = OpFunctionCall %float %compute_value_f1_f1_ %param %param_1
+        %120 = OpAccessChain %_ptr_Function_float %c %uint_0
+               OpStore %120 %117
+        %122 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %123 = OpLoad %float %122
+               OpStore %param_2 %123
+               OpStore %param_3 %111
+        %124 = OpFunctionCall %float %compute_value_f1_f1_ %param_2 %param_3
+        %127 = OpAccessChain %_ptr_Function_float %c %uint_1
+               OpStore %127 %124
+        %128 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %129 = OpLoad %float %128
+        %130 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %131 = OpLoad %float %130
+        %133 = OpAccessChain %_ptr_Function_float %c %uint_2
+        %134 = OpFAdd %float %129 %131
+               OpStore %133 %134
+               OpStore %x_68_phi %int_0
+               OpBranch %135
+        %135 = OpLabel
+               OpLoopMerge %136 %137 None
+               OpBranch %138
+        %138 = OpLabel
+        %140 = OpLoad %int %x_68_phi
+        %142 = OpSLessThan %bool %140 %int_3
+               OpSelectionMerge %143 None
+               OpBranchConditional %142 %144 %145
+        %144 = OpLabel
+               OpBranch %143
+        %145 = OpLabel
+               OpBranch %136
+        %143 = OpLabel
+        %146 = OpAccessChain %_ptr_Function_float %c %140
+        %147 = OpLoad %float %146
+        %149 = OpFOrdGreaterThanEqual %bool %147 %float_1
+               OpSelectionMerge %150 None
+               OpBranchConditional %149 %151 %150
+        %151 = OpLabel
+        %152 = OpAccessChain %_ptr_Function_float %c %140
+        %153 = OpLoad %float %152
+        %154 = OpAccessChain %_ptr_Function_float %c %140
+        %155 = OpLoad %float %154
+        %156 = OpAccessChain %_ptr_Function_float %c %140
+        %157 = OpFMul %float %153 %155
+               OpStore %156 %157
+               OpBranch %150
+        %150 = OpLabel
+               OpBranch %137
+        %137 = OpLabel
+        %158 = OpIAdd %int %140 %int_1
+               OpStore %x_69 %158
+        %159 = OpLoad %int %x_69
+               OpStore %x_68_phi %159
+               OpBranch %135
+        %136 = OpLabel
+        %160 = OpLoad %v3float %c
+        %162 = OpExtInst %v3float %64 FAbs %160
+        %161 = OpExtInst %v3float %64 Normalize %162
+        %163 = OpCompositeExtract %float %161 0
+        %164 = OpCompositeExtract %float %161 1
+        %165 = OpCompositeExtract %float %161 2
+        %166 = OpCompositeConstruct %v4float %163 %164 %165 %float_1
+               OpStore %x_GLF_color %166
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %167
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %171 = OpLabel
+        %172 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %172
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %89
+        %174 = OpLabel
+        %175 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %175
+        %176 = OpFunctionCall %void %main_1
+        %178 = OpLoad %v4float %x_GLF_color
+        %179 = OpCompositeConstruct %main_out %178
+        %177 = OpFunctionCall %void %tint_symbol_3 %179
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..ba37d91
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,122 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn compute_value_f1_f1_(limit : ptr<function, f32>, thirty_two : ptr<function, f32>) -> f32 {
+  var x_91 : f32;
+  var x_91_phi : f32;
+  var x_94_phi : i32;
+  x_91_phi = -0.5;
+  x_94_phi = 1;
+  loop {
+    var x_104 : f32;
+    var x_113 : f32;
+    var x_95 : i32;
+    var x_92_phi : f32;
+    x_91 = x_91_phi;
+    let x_94 : i32 = x_94_phi;
+    if ((x_94 < 800)) {
+    } else {
+      break;
+    }
+    var x_112 : f32;
+    var x_113_phi : f32;
+    if (((x_94 % 32) == 0)) {
+      x_104 = (x_91 + 0.400000006);
+      x_92_phi = x_104;
+    } else {
+      let x_106 : f32 = *(thirty_two);
+      x_113_phi = x_91;
+      if (((f32(x_94) % round(x_106)) <= 0.01)) {
+        x_112 = (x_91 + 100.0);
+        x_113_phi = x_112;
+      }
+      x_113 = x_113_phi;
+      x_92_phi = x_113;
+    }
+    var x_92 : f32;
+    x_92 = x_92_phi;
+    let x_115 : f32 = *(limit);
+    if ((f32(x_94) >= x_115)) {
+      return x_92;
+    }
+
+    continuing {
+      x_95 = (x_94 + 1);
+      x_91_phi = x_92;
+      x_94_phi = x_95;
+    }
+  }
+  return x_91;
+}
+
+fn main_1() {
+  var c : vec3<f32>;
+  var param : f32;
+  var param_1 : f32;
+  var param_2 : f32;
+  var param_3 : f32;
+  var x_68_phi : i32;
+  c = vec3<f32>(7.0, 8.0, 9.0);
+  let x_52 : f32 = x_10.resolution.x;
+  let x_54 : f32 = round((x_52 * 0.125));
+  let x_56 : f32 = gl_FragCoord.x;
+  param = x_56;
+  param_1 = x_54;
+  let x_57 : f32 = compute_value_f1_f1_(&(param), &(param_1));
+  let x_58 : ptr<function, f32> = &(c.x);
+  *(x_58) = x_57;
+  let x_60 : f32 = gl_FragCoord.y;
+  param_2 = x_60;
+  param_3 = x_54;
+  let x_61 : f32 = compute_value_f1_f1_(&(param_2), &(param_3));
+  let x_62 : ptr<function, f32> = &(c.y);
+  *(x_62) = x_61;
+  let x_63 : f32 = *(x_58);
+  let x_64 : f32 = *(x_62);
+  c.z = (x_63 + x_64);
+  x_68_phi = 0;
+  loop {
+    var x_69 : i32;
+    let x_68 : i32 = x_68_phi;
+    if ((x_68 < 3)) {
+    } else {
+      break;
+    }
+    let x_74 : ptr<function, f32> = &(c[x_68]);
+    let x_75 : f32 = *(x_74);
+    if ((x_75 >= 1.0)) {
+      let x_79 : f32 = *(x_74);
+      let x_80 : f32 = *(x_74);
+      *(x_74) = (x_79 * x_80);
+    }
+
+    continuing {
+      x_69 = (x_68 + 1);
+      x_68_phi = x_69;
+    }
+  }
+  let x_82 : vec3<f32> = c;
+  let x_84 : vec3<f32> = normalize(abs(x_82));
+  x_GLF_color = vec4<f32>(x_84.x, x_84.y, x_84.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/1.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/1.spvasm
new file mode 100644
index 0000000..6ff67b1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/1.spvasm
@@ -0,0 +1,204 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %compute_value_f1_f1_ "compute_value(f1;f1;"
+               OpName %limit "limit"
+               OpName %thirty_two "thirty_two"
+               OpName %c "c"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %param_1 "param"
+               OpName %param_2 "param"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "injectionSwitch"
+               OpName %__0 ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+         %21 = OpTypeFunction %float %_ptr_Function_float %_ptr_Function_float
+ %float_n0_5 = OpConstant %float -0.5
+        %int = OpTypeInt 32 1
+      %int_1 = OpConstant %int 1
+    %int_800 = OpConstant %int 800
+       %bool = OpTypeBool
+     %int_32 = OpConstant %int 32
+      %int_0 = OpConstant %int 0
+%float_0_400000006 = OpConstant %float 0.400000006
+%float_0_00999999978 = OpConstant %float 0.00999999978
+  %float_100 = OpConstant %float 100
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+    %float_7 = OpConstant %float 7
+    %float_8 = OpConstant %float 8
+    %float_9 = OpConstant %float 9
+         %37 = OpConstantComposite %v3float %float_7 %float_8 %float_9
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+%_ptr_Input_float = OpTypePointer Input %float
+     %uint_1 = OpConstant %uint 1
+    %float_1 = OpConstant %float 1
+     %uint_2 = OpConstant %uint 2
+      %int_3 = OpConstant %int 3
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+%float_0_125 = OpConstant %float 0.125
+       %main = OpFunction %void None %18
+         %53 = OpLabel
+          %c = OpVariable %_ptr_Function_v3float Function
+      %param = OpVariable %_ptr_Function_float Function
+    %param_0 = OpVariable %_ptr_Function_float Function
+    %param_1 = OpVariable %_ptr_Function_float Function
+    %param_2 = OpVariable %_ptr_Function_float Function
+         %54 = OpVariable %_ptr_Function_v3float Function
+               OpStore %c %37
+         %55 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %56 = OpLoad %float %55
+         %57 = OpFMul %float %56 %float_0_125
+         %58 = OpExtInst %float %1 Round %57
+         %59 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %60 = OpLoad %float %59
+               OpStore %param %60
+               OpStore %param_0 %58
+         %61 = OpFunctionCall %float %compute_value_f1_f1_ %param %param_0
+         %62 = OpAccessChain %_ptr_Function_float %c %uint_0
+               OpStore %62 %61
+         %63 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %64 = OpLoad %float %63
+               OpStore %param_1 %64
+               OpStore %param_2 %58
+         %65 = OpFunctionCall %float %compute_value_f1_f1_ %param_1 %param_2
+         %66 = OpAccessChain %_ptr_Function_float %c %uint_1
+               OpStore %66 %65
+         %67 = OpLoad %float %62
+         %68 = OpLoad %v3float %c
+               OpStore %54 %68
+         %69 = OpAccessChain %_ptr_Function_float %54 %uint_1
+         %70 = OpLoad %float %69
+         %71 = OpFAdd %float %67 %70
+         %72 = OpAccessChain %_ptr_Function_float %c %uint_2
+               OpStore %72 %71
+               OpBranch %73
+         %73 = OpLabel
+         %74 = OpPhi %int %int_0 %53 %75 %76
+         %77 = OpSLessThan %bool %74 %int_3
+               OpLoopMerge %78 %76 None
+               OpBranchConditional %77 %79 %78
+         %79 = OpLabel
+         %80 = OpAccessChain %_ptr_Function_float %c %74
+         %81 = OpLoad %float %80
+         %82 = OpFOrdGreaterThanEqual %bool %81 %float_1
+               OpSelectionMerge %83 None
+               OpBranchConditional %82 %84 %83
+         %84 = OpLabel
+         %85 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %uint_0
+         %86 = OpLoad %float %85
+         %87 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %uint_1
+         %88 = OpLoad %float %87
+         %89 = OpFOrdGreaterThan %bool %86 %88
+               OpSelectionMerge %90 None
+               OpBranchConditional %89 %91 %90
+         %91 = OpLabel
+               OpKill
+         %90 = OpLabel
+         %92 = OpLoad %float %80
+         %93 = OpLoad %float %80
+         %94 = OpFMul %float %92 %93
+               OpStore %80 %94
+               OpBranch %83
+         %83 = OpLabel
+               OpBranch %76
+         %76 = OpLabel
+         %75 = OpIAdd %int %74 %int_1
+               OpBranch %73
+         %78 = OpLabel
+         %95 = OpLoad %v3float %c
+         %96 = OpExtInst %v3float %1 FAbs %95
+         %97 = OpExtInst %v3float %1 Normalize %96
+         %98 = OpCompositeExtract %float %97 0
+         %99 = OpCompositeExtract %float %97 1
+        %100 = OpCompositeExtract %float %97 2
+        %101 = OpCompositeConstruct %v4float %98 %99 %100 %float_1
+               OpStore %_GLF_color %101
+               OpReturn
+               OpFunctionEnd
+%compute_value_f1_f1_ = OpFunction %float None %21
+      %limit = OpFunctionParameter %_ptr_Function_float
+ %thirty_two = OpFunctionParameter %_ptr_Function_float
+        %102 = OpLabel
+               OpBranch %103
+        %103 = OpLabel
+        %104 = OpPhi %float %float_n0_5 %102 %105 %106
+        %107 = OpPhi %int %int_1 %102 %108 %106
+        %109 = OpSLessThan %bool %107 %int_800
+               OpLoopMerge %110 %106 None
+               OpBranchConditional %109 %111 %110
+        %111 = OpLabel
+        %112 = OpSMod %int %107 %int_32
+        %113 = OpIEqual %bool %112 %int_0
+               OpSelectionMerge %114 None
+               OpBranchConditional %113 %115 %116
+        %116 = OpLabel
+        %117 = OpConvertSToF %float %107
+        %118 = OpLoad %float %thirty_two
+        %119 = OpExtInst %float %1 Round %118
+        %120 = OpFMod %float %117 %119
+        %121 = OpFOrdLessThanEqual %bool %120 %float_0_00999999978
+               OpSelectionMerge %122 None
+               OpBranchConditional %121 %123 %122
+        %123 = OpLabel
+        %124 = OpFAdd %float %104 %float_100
+               OpBranch %122
+        %122 = OpLabel
+        %125 = OpPhi %float %104 %116 %124 %123
+               OpBranch %114
+        %115 = OpLabel
+        %126 = OpFAdd %float %104 %float_0_400000006
+               OpBranch %114
+        %114 = OpLabel
+        %105 = OpPhi %float %126 %115 %125 %122
+        %127 = OpConvertSToF %float %107
+        %128 = OpLoad %float %limit
+        %129 = OpFOrdGreaterThanEqual %bool %127 %128
+               OpSelectionMerge %130 None
+               OpBranchConditional %129 %131 %130
+        %131 = OpLabel
+               OpReturnValue %105
+        %130 = OpLabel
+               OpBranch %106
+        %106 = OpLabel
+        %108 = OpIAdd %int %107 %int_1
+               OpBranch %103
+        %110 = OpLabel
+               OpReturnValue %104
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..3a417df
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/1.spvasm.expected.hlsl
@@ -0,0 +1,133 @@
+void set_float3(inout float3 vec, int idx, float val) {
+  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
+}
+
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_16 : register(b1, space0) {
+  uint4 x_16[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float compute_value_f1_f1_(inout float limit, inout float thirty_two) {
+  float x_104 = 0.0f;
+  float x_104_phi = 0.0f;
+  int x_107_phi = 0;
+  x_104_phi = -0.5f;
+  x_107_phi = 1;
+  while (true) {
+    float x_126 = 0.0f;
+    float x_125 = 0.0f;
+    int x_108 = 0;
+    float x_105_phi = 0.0f;
+    x_104 = x_104_phi;
+    const int x_107 = x_107_phi;
+    if ((x_107 < 800)) {
+    } else {
+      break;
+    }
+    float x_124 = 0.0f;
+    float x_125_phi = 0.0f;
+    if (((x_107 % 32) == 0)) {
+      x_126 = (x_104 + 0.400000006f);
+      x_105_phi = x_126;
+    } else {
+      const float x_118 = thirty_two;
+      x_125_phi = x_104;
+      if (((float(x_107) % round(x_118)) <= 0.01f)) {
+        x_124 = (x_104 + 100.0f);
+        x_125_phi = x_124;
+      }
+      x_125 = x_125_phi;
+      x_105_phi = x_125;
+    }
+    float x_105 = 0.0f;
+    x_105 = x_105_phi;
+    const float x_128 = limit;
+    if ((float(x_107) >= x_128)) {
+      return x_105;
+    }
+    {
+      x_108 = (x_107 + 1);
+      x_104_phi = x_105;
+      x_107_phi = x_108;
+    }
+  }
+  return x_104;
+}
+
+void main_1() {
+  float3 c = float3(0.0f, 0.0f, 0.0f);
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  float param_2 = 0.0f;
+  float param_3 = 0.0f;
+  float3 x_54 = float3(0.0f, 0.0f, 0.0f);
+  int x_74_phi = 0;
+  c = float3(7.0f, 8.0f, 9.0f);
+  const float x_56 = asfloat(x_10[0].x);
+  const float x_58 = round((x_56 * 0.125f));
+  const float x_60 = gl_FragCoord.x;
+  param = x_60;
+  param_1 = x_58;
+  const float x_61 = compute_value_f1_f1_(param, param_1);
+  c.x = x_61;
+  const float x_64 = gl_FragCoord.y;
+  param_2 = x_64;
+  param_3 = x_58;
+  const float x_65 = compute_value_f1_f1_(param_2, param_3);
+  c.y = x_65;
+  const float x_67 = c.x;
+  x_54 = c;
+  const float x_70 = x_54.y;
+  c.z = (x_67 + x_70);
+  x_74_phi = 0;
+  while (true) {
+    int x_75 = 0;
+    const int x_74 = x_74_phi;
+    if ((x_74 < 3)) {
+    } else {
+      break;
+    }
+    const int x_80_save = x_74;
+    const float x_81 = c[x_80_save];
+    if ((x_81 >= 1.0f)) {
+      const float x_86 = asfloat(x_16[0].x);
+      const float x_88 = asfloat(x_16[0].y);
+      if ((x_86 > x_88)) {
+        discard;
+      }
+      const float x_92 = c[x_80_save];
+      const float x_93 = c[x_80_save];
+      set_float3(c, x_80_save, (x_92 * x_93));
+    }
+    {
+      x_75 = (x_74 + 1);
+      x_74_phi = x_75;
+    }
+  }
+  const float3 x_97 = normalize(abs(c));
+  x_GLF_color = float4(x_97.x, x_97.y, x_97.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/1.spvasm.expected.msl
new file mode 100755
index 0000000..45c08ae
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/1.spvasm.expected.msl
@@ -0,0 +1,137 @@
+SKIP: FAILED
+
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct buf1 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float compute_value_f1_f1_(thread float* const limit, thread float* const thirty_two) {
+  float x_104 = 0.0f;
+  float x_104_phi = 0.0f;
+  int x_107_phi = 0;
+  x_104_phi = -0.5f;
+  x_107_phi = 1;
+  while (true) {
+    float x_126 = 0.0f;
+    float x_125 = 0.0f;
+    int x_108 = 0;
+    float x_105_phi = 0.0f;
+    x_104 = x_104_phi;
+    int const x_107 = x_107_phi;
+    if ((x_107 < 800)) {
+    } else {
+      break;
+    }
+    float x_124 = 0.0f;
+    float x_125_phi = 0.0f;
+    if (((x_107 % 32) == 0)) {
+      x_126 = (x_104 + 0.400000006f);
+      x_105_phi = x_126;
+    } else {
+      float const x_118 = *(thirty_two);
+      x_125_phi = x_104;
+      if (((float(x_107) % rint(x_118)) <= 0.01f)) {
+        x_124 = (x_104 + 100.0f);
+        x_125_phi = x_124;
+      }
+      x_125 = x_125_phi;
+      x_105_phi = x_125;
+    }
+    float x_105 = 0.0f;
+    x_105 = x_105_phi;
+    float const x_128 = *(limit);
+    if ((float(x_107) >= x_128)) {
+      return x_105;
+    }
+    {
+      x_108 = (x_107 + 1);
+      x_104_phi = x_105;
+      x_107_phi = x_108;
+    }
+  }
+  return x_104;
+}
+
+void main_1(constant buf0& x_10, constant buf1& x_16, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float3 c = 0.0f;
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  float param_2 = 0.0f;
+  float param_3 = 0.0f;
+  float3 x_54 = 0.0f;
+  int x_74_phi = 0;
+  c = float3(7.0f, 8.0f, 9.0f);
+  float const x_56 = x_10.resolution.x;
+  float const x_58 = rint((x_56 * 0.125f));
+  float const x_60 = (*(tint_symbol_5)).x;
+  param = x_60;
+  param_1 = x_58;
+  float const x_61 = compute_value_f1_f1_(&(param), &(param_1));
+  c.x = x_61;
+  float const x_64 = (*(tint_symbol_5)).y;
+  param_2 = x_64;
+  param_3 = x_58;
+  float const x_65 = compute_value_f1_f1_(&(param_2), &(param_3));
+  c.y = x_65;
+  float const x_67 = c.x;
+  float3 const x_68 = c;
+  x_54 = x_68;
+  float const x_70 = x_54.y;
+  c.z = (x_67 + x_70);
+  x_74_phi = 0;
+  while (true) {
+    int x_75 = 0;
+    int const x_74 = x_74_phi;
+    if ((x_74 < 3)) {
+    } else {
+      break;
+    }
+    int const x_80_save = x_74;
+    float const x_81 = c[x_80_save];
+    if ((x_81 >= 1.0f)) {
+      float const x_86 = x_16.injectionSwitch.x;
+      float const x_88 = x_16.injectionSwitch.y;
+      if ((x_86 > x_88)) {
+        discard_fragment();
+      }
+      float const x_92 = c[x_80_save];
+      float const x_93 = c[x_80_save];
+      c[x_80_save] = (x_92 * x_93);
+    }
+    {
+      x_75 = (x_74 + 1);
+      x_74_phi = x_75;
+    }
+  }
+  float3 const x_95 = c;
+  float3 const x_97 = normalize(fabs(x_95));
+  *(tint_symbol_6) = float4(x_97.x, x_97.y, x_97.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_10 [[buffer(0)]], constant buf1& x_16 [[buffer(1)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_10, x_16, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
+T:\tmp\ufno.0.metal:42:26: error: invalid operands to binary expression ('float' and 'float')
+      if (((float(x_107) % rint(x_118)) <= 0.01f)) {
+            ~~~~~~~~~~~~ ^ ~~~~~~~~~~~
+1 error generated.
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..d622545
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/1.spvasm.expected.spvasm
@@ -0,0 +1,316 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 192
+; Schema: 0
+               OpCapability Shader
+         %67 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_10 "x_10"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "injectionSwitch"
+               OpName %x_16 "x_16"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %compute_value_f1_f1_ "compute_value_f1_f1_"
+               OpName %limit "limit"
+               OpName %thirty_two "thirty_two"
+               OpName %x_104 "x_104"
+               OpName %x_104_phi "x_104_phi"
+               OpName %x_107_phi "x_107_phi"
+               OpName %x_126 "x_126"
+               OpName %x_125 "x_125"
+               OpName %x_108 "x_108"
+               OpName %x_105_phi "x_105_phi"
+               OpName %x_124 "x_124"
+               OpName %x_125_phi "x_125_phi"
+               OpName %x_105 "x_105"
+               OpName %main_1 "main_1"
+               OpName %c "c"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %x_54 "x_54"
+               OpName %x_74_phi "x_74_phi"
+               OpName %x_75 "x_75"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_16 NonWritable
+               OpDecorate %x_16 DescriptorSet 0
+               OpDecorate %x_16 Binding 1
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_16 = OpVariable %_ptr_Uniform_buf1 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+%_ptr_Function_float = OpTypePointer Function %float
+         %18 = OpTypeFunction %float %_ptr_Function_float %_ptr_Function_float
+         %25 = OpConstantNull %float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %30 = OpConstantNull %int
+ %float_n0_5 = OpConstant %float -0.5
+      %int_1 = OpConstant %int 1
+    %int_800 = OpConstant %int 800
+       %bool = OpTypeBool
+     %int_32 = OpConstant %int 32
+      %int_0 = OpConstant %int 0
+%float_0_400000006 = OpConstant %float 0.400000006
+%float_0_00999999978 = OpConstant %float 0.00999999978
+  %float_100 = OpConstant %float 100
+       %void = OpTypeVoid
+         %92 = OpTypeFunction %void
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %99 = OpConstantNull %v3float
+    %float_7 = OpConstant %float 7
+    %float_8 = OpConstant %float 8
+    %float_9 = OpConstant %float 9
+        %109 = OpConstantComposite %v3float %float_7 %float_8 %float_9
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%float_0_125 = OpConstant %float 0.125
+%_ptr_Private_float = OpTypePointer Private %float
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+      %int_3 = OpConstant %int 3
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %179 = OpTypeFunction %void %main_out
+%compute_value_f1_f1_ = OpFunction %float None %18
+      %limit = OpFunctionParameter %_ptr_Function_float
+ %thirty_two = OpFunctionParameter %_ptr_Function_float
+         %23 = OpLabel
+      %x_104 = OpVariable %_ptr_Function_float Function %25
+  %x_104_phi = OpVariable %_ptr_Function_float Function %25
+  %x_107_phi = OpVariable %_ptr_Function_int Function %30
+      %x_126 = OpVariable %_ptr_Function_float Function %25
+      %x_125 = OpVariable %_ptr_Function_float Function %25
+      %x_108 = OpVariable %_ptr_Function_int Function %30
+  %x_105_phi = OpVariable %_ptr_Function_float Function %25
+      %x_124 = OpVariable %_ptr_Function_float Function %25
+  %x_125_phi = OpVariable %_ptr_Function_float Function %25
+      %x_105 = OpVariable %_ptr_Function_float Function %25
+               OpStore %x_104_phi %float_n0_5
+               OpStore %x_107_phi %int_1
+               OpBranch %33
+         %33 = OpLabel
+               OpLoopMerge %34 %35 None
+               OpBranch %36
+         %36 = OpLabel
+         %41 = OpLoad %float %x_104_phi
+               OpStore %x_104 %41
+         %42 = OpLoad %int %x_107_phi
+         %44 = OpSLessThan %bool %42 %int_800
+               OpSelectionMerge %46 None
+               OpBranchConditional %44 %47 %48
+         %47 = OpLabel
+               OpBranch %46
+         %48 = OpLabel
+               OpBranch %34
+         %46 = OpLabel
+         %52 = OpSMod %int %42 %int_32
+         %54 = OpIEqual %bool %52 %int_0
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %57
+         %56 = OpLabel
+         %58 = OpLoad %float %x_104
+         %60 = OpFAdd %float %58 %float_0_400000006
+               OpStore %x_126 %60
+         %61 = OpLoad %float %x_126
+               OpStore %x_105_phi %61
+               OpBranch %55
+         %57 = OpLabel
+         %63 = OpLoad %float %thirty_two
+         %64 = OpLoad %float %x_104
+               OpStore %x_125_phi %64
+         %65 = OpConvertSToF %float %42
+         %66 = OpExtInst %float %67 RoundEven %63
+         %68 = OpFMod %float %65 %66
+         %70 = OpFOrdLessThanEqual %bool %68 %float_0_00999999978
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %71
+         %72 = OpLabel
+         %73 = OpLoad %float %x_104
+         %75 = OpFAdd %float %73 %float_100
+               OpStore %x_124 %75
+         %76 = OpLoad %float %x_124
+               OpStore %x_125_phi %76
+               OpBranch %71
+         %71 = OpLabel
+         %77 = OpLoad %float %x_125_phi
+               OpStore %x_125 %77
+         %78 = OpLoad %float %x_125
+               OpStore %x_105_phi %78
+               OpBranch %55
+         %55 = OpLabel
+         %80 = OpLoad %float %x_105_phi
+               OpStore %x_105 %80
+         %82 = OpLoad %float %limit
+         %83 = OpConvertSToF %float %42
+         %84 = OpFOrdGreaterThanEqual %bool %83 %82
+               OpSelectionMerge %85 None
+               OpBranchConditional %84 %86 %85
+         %86 = OpLabel
+         %87 = OpLoad %float %x_105
+               OpReturnValue %87
+         %85 = OpLabel
+               OpBranch %35
+         %35 = OpLabel
+         %88 = OpIAdd %int %42 %int_1
+               OpStore %x_108 %88
+         %89 = OpLoad %float %x_105
+               OpStore %x_104_phi %89
+         %90 = OpLoad %int %x_108
+               OpStore %x_107_phi %90
+               OpBranch %33
+         %34 = OpLabel
+         %91 = OpLoad %float %x_104
+               OpReturnValue %91
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %92
+         %95 = OpLabel
+          %c = OpVariable %_ptr_Function_v3float Function %99
+      %param = OpVariable %_ptr_Function_float Function %25
+    %param_1 = OpVariable %_ptr_Function_float Function %25
+    %param_2 = OpVariable %_ptr_Function_float Function %25
+    %param_3 = OpVariable %_ptr_Function_float Function %25
+       %x_54 = OpVariable %_ptr_Function_v3float Function %99
+   %x_74_phi = OpVariable %_ptr_Function_int Function %30
+       %x_75 = OpVariable %_ptr_Function_int Function %30
+               OpStore %c %109
+        %113 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %uint_0
+        %114 = OpLoad %float %113
+        %117 = OpFMul %float %114 %float_0_125
+        %115 = OpExtInst %float %67 RoundEven %117
+        %119 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+        %120 = OpLoad %float %119
+               OpStore %param %120
+               OpStore %param_1 %115
+        %121 = OpFunctionCall %float %compute_value_f1_f1_ %param %param_1
+        %124 = OpAccessChain %_ptr_Function_float %c %uint_0
+               OpStore %124 %121
+        %126 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %127 = OpLoad %float %126
+               OpStore %param_2 %127
+               OpStore %param_3 %115
+        %128 = OpFunctionCall %float %compute_value_f1_f1_ %param_2 %param_3
+        %131 = OpAccessChain %_ptr_Function_float %c %uint_1
+               OpStore %131 %128
+        %132 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %133 = OpLoad %float %132
+        %134 = OpLoad %v3float %c
+               OpStore %x_54 %134
+        %135 = OpAccessChain %_ptr_Function_float %x_54 %uint_1
+        %136 = OpLoad %float %135
+        %138 = OpAccessChain %_ptr_Function_float %c %uint_2
+        %139 = OpFAdd %float %133 %136
+               OpStore %138 %139
+               OpStore %x_74_phi %int_0
+               OpBranch %140
+        %140 = OpLabel
+               OpLoopMerge %141 %142 None
+               OpBranch %143
+        %143 = OpLabel
+        %145 = OpLoad %int %x_74_phi
+        %147 = OpSLessThan %bool %145 %int_3
+               OpSelectionMerge %148 None
+               OpBranchConditional %147 %149 %150
+        %149 = OpLabel
+               OpBranch %148
+        %150 = OpLabel
+               OpBranch %141
+        %148 = OpLabel
+        %151 = OpAccessChain %_ptr_Function_float %c %145
+        %152 = OpLoad %float %151
+        %154 = OpFOrdGreaterThanEqual %bool %152 %float_1
+               OpSelectionMerge %155 None
+               OpBranchConditional %154 %156 %155
+        %156 = OpLabel
+        %157 = OpAccessChain %_ptr_Uniform_float %x_16 %uint_0 %uint_0
+        %158 = OpLoad %float %157
+        %159 = OpAccessChain %_ptr_Uniform_float %x_16 %uint_0 %uint_1
+        %160 = OpLoad %float %159
+        %161 = OpFOrdGreaterThan %bool %158 %160
+               OpSelectionMerge %162 None
+               OpBranchConditional %161 %163 %162
+        %163 = OpLabel
+               OpKill
+        %162 = OpLabel
+        %164 = OpAccessChain %_ptr_Function_float %c %145
+        %165 = OpLoad %float %164
+        %166 = OpAccessChain %_ptr_Function_float %c %145
+        %167 = OpLoad %float %166
+        %168 = OpAccessChain %_ptr_Function_float %c %145
+        %169 = OpFMul %float %165 %167
+               OpStore %168 %169
+               OpBranch %155
+        %155 = OpLabel
+               OpBranch %142
+        %142 = OpLabel
+        %170 = OpIAdd %int %145 %int_1
+               OpStore %x_75 %170
+        %171 = OpLoad %int %x_75
+               OpStore %x_74_phi %171
+               OpBranch %140
+        %141 = OpLabel
+        %172 = OpLoad %v3float %c
+        %174 = OpExtInst %v3float %67 FAbs %172
+        %173 = OpExtInst %v3float %67 Normalize %174
+        %175 = OpCompositeExtract %float %173 0
+        %176 = OpCompositeExtract %float %173 1
+        %177 = OpCompositeExtract %float %173 2
+        %178 = OpCompositeConstruct %v4float %175 %176 %177 %float_1
+               OpStore %x_GLF_color %178
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %179
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %183 = OpLabel
+        %184 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %184
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %92
+        %186 = OpLabel
+        %187 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %187
+        %188 = OpFunctionCall %void %main_1
+        %190 = OpLoad %v4float %x_GLF_color
+        %191 = OpCompositeConstruct %main_out %190
+        %189 = OpFunctionCall %void %tint_symbol_3 %191
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..57edb9b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/1.spvasm.expected.wgsl
@@ -0,0 +1,136 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+[[block]]
+struct buf1 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_16 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn compute_value_f1_f1_(limit : ptr<function, f32>, thirty_two : ptr<function, f32>) -> f32 {
+  var x_104 : f32;
+  var x_104_phi : f32;
+  var x_107_phi : i32;
+  x_104_phi = -0.5;
+  x_107_phi = 1;
+  loop {
+    var x_126 : f32;
+    var x_125 : f32;
+    var x_108 : i32;
+    var x_105_phi : f32;
+    x_104 = x_104_phi;
+    let x_107 : i32 = x_107_phi;
+    if ((x_107 < 800)) {
+    } else {
+      break;
+    }
+    var x_124 : f32;
+    var x_125_phi : f32;
+    if (((x_107 % 32) == 0)) {
+      x_126 = (x_104 + 0.400000006);
+      x_105_phi = x_126;
+    } else {
+      let x_118 : f32 = *(thirty_two);
+      x_125_phi = x_104;
+      if (((f32(x_107) % round(x_118)) <= 0.01)) {
+        x_124 = (x_104 + 100.0);
+        x_125_phi = x_124;
+      }
+      x_125 = x_125_phi;
+      x_105_phi = x_125;
+    }
+    var x_105 : f32;
+    x_105 = x_105_phi;
+    let x_128 : f32 = *(limit);
+    if ((f32(x_107) >= x_128)) {
+      return x_105;
+    }
+
+    continuing {
+      x_108 = (x_107 + 1);
+      x_104_phi = x_105;
+      x_107_phi = x_108;
+    }
+  }
+  return x_104;
+}
+
+fn main_1() {
+  var c : vec3<f32>;
+  var param : f32;
+  var param_1 : f32;
+  var param_2 : f32;
+  var param_3 : f32;
+  var x_54 : vec3<f32>;
+  var x_74_phi : i32;
+  c = vec3<f32>(7.0, 8.0, 9.0);
+  let x_56 : f32 = x_10.resolution.x;
+  let x_58 : f32 = round((x_56 * 0.125));
+  let x_60 : f32 = gl_FragCoord.x;
+  param = x_60;
+  param_1 = x_58;
+  let x_61 : f32 = compute_value_f1_f1_(&(param), &(param_1));
+  let x_62 : ptr<function, f32> = &(c.x);
+  *(x_62) = x_61;
+  let x_64 : f32 = gl_FragCoord.y;
+  param_2 = x_64;
+  param_3 = x_58;
+  let x_65 : f32 = compute_value_f1_f1_(&(param_2), &(param_3));
+  c.y = x_65;
+  let x_67 : f32 = *(x_62);
+  let x_68 : vec3<f32> = c;
+  x_54 = x_68;
+  let x_70 : f32 = x_54.y;
+  c.z = (x_67 + x_70);
+  x_74_phi = 0;
+  loop {
+    var x_75 : i32;
+    let x_74 : i32 = x_74_phi;
+    if ((x_74 < 3)) {
+    } else {
+      break;
+    }
+    let x_80 : ptr<function, f32> = &(c[x_74]);
+    let x_81 : f32 = *(x_80);
+    if ((x_81 >= 1.0)) {
+      let x_86 : f32 = x_16.injectionSwitch.x;
+      let x_88 : f32 = x_16.injectionSwitch.y;
+      if ((x_86 > x_88)) {
+        discard;
+      }
+      let x_92 : f32 = *(x_80);
+      let x_93 : f32 = *(x_80);
+      *(x_80) = (x_92 * x_93);
+    }
+
+    continuing {
+      x_75 = (x_74 + 1);
+      x_74_phi = x_75;
+    }
+  }
+  let x_95 : vec3<f32> = c;
+  let x_97 : vec3<f32> = normalize(abs(x_95));
+  x_GLF_color = vec4<f32>(x_97.x, x_97.y, x_97.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/1.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/1.wgsl
new file mode 100644
index 0000000..57edb9b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/1.wgsl
@@ -0,0 +1,136 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+[[block]]
+struct buf1 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_16 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn compute_value_f1_f1_(limit : ptr<function, f32>, thirty_two : ptr<function, f32>) -> f32 {
+  var x_104 : f32;
+  var x_104_phi : f32;
+  var x_107_phi : i32;
+  x_104_phi = -0.5;
+  x_107_phi = 1;
+  loop {
+    var x_126 : f32;
+    var x_125 : f32;
+    var x_108 : i32;
+    var x_105_phi : f32;
+    x_104 = x_104_phi;
+    let x_107 : i32 = x_107_phi;
+    if ((x_107 < 800)) {
+    } else {
+      break;
+    }
+    var x_124 : f32;
+    var x_125_phi : f32;
+    if (((x_107 % 32) == 0)) {
+      x_126 = (x_104 + 0.400000006);
+      x_105_phi = x_126;
+    } else {
+      let x_118 : f32 = *(thirty_two);
+      x_125_phi = x_104;
+      if (((f32(x_107) % round(x_118)) <= 0.01)) {
+        x_124 = (x_104 + 100.0);
+        x_125_phi = x_124;
+      }
+      x_125 = x_125_phi;
+      x_105_phi = x_125;
+    }
+    var x_105 : f32;
+    x_105 = x_105_phi;
+    let x_128 : f32 = *(limit);
+    if ((f32(x_107) >= x_128)) {
+      return x_105;
+    }
+
+    continuing {
+      x_108 = (x_107 + 1);
+      x_104_phi = x_105;
+      x_107_phi = x_108;
+    }
+  }
+  return x_104;
+}
+
+fn main_1() {
+  var c : vec3<f32>;
+  var param : f32;
+  var param_1 : f32;
+  var param_2 : f32;
+  var param_3 : f32;
+  var x_54 : vec3<f32>;
+  var x_74_phi : i32;
+  c = vec3<f32>(7.0, 8.0, 9.0);
+  let x_56 : f32 = x_10.resolution.x;
+  let x_58 : f32 = round((x_56 * 0.125));
+  let x_60 : f32 = gl_FragCoord.x;
+  param = x_60;
+  param_1 = x_58;
+  let x_61 : f32 = compute_value_f1_f1_(&(param), &(param_1));
+  let x_62 : ptr<function, f32> = &(c.x);
+  *(x_62) = x_61;
+  let x_64 : f32 = gl_FragCoord.y;
+  param_2 = x_64;
+  param_3 = x_58;
+  let x_65 : f32 = compute_value_f1_f1_(&(param_2), &(param_3));
+  c.y = x_65;
+  let x_67 : f32 = *(x_62);
+  let x_68 : vec3<f32> = c;
+  x_54 = x_68;
+  let x_70 : f32 = x_54.y;
+  c.z = (x_67 + x_70);
+  x_74_phi = 0;
+  loop {
+    var x_75 : i32;
+    let x_74 : i32 = x_74_phi;
+    if ((x_74 < 3)) {
+    } else {
+      break;
+    }
+    let x_80 : ptr<function, f32> = &(c[x_74]);
+    let x_81 : f32 = *(x_80);
+    if ((x_81 >= 1.0)) {
+      let x_86 : f32 = x_16.injectionSwitch.x;
+      let x_88 : f32 = x_16.injectionSwitch.y;
+      if ((x_86 > x_88)) {
+        discard;
+      }
+      let x_92 : f32 = *(x_80);
+      let x_93 : f32 = *(x_80);
+      *(x_80) = (x_92 * x_93);
+    }
+
+    continuing {
+      x_75 = (x_74 + 1);
+      x_74_phi = x_75;
+    }
+  }
+  let x_95 : vec3<f32> = c;
+  let x_97 : vec3<f32> = normalize(abs(x_95));
+  x_GLF_color = vec4<f32>(x_97.x, x_97.y, x_97.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..3a417df
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/1.wgsl.expected.hlsl
@@ -0,0 +1,133 @@
+void set_float3(inout float3 vec, int idx, float val) {
+  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
+}
+
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_16 : register(b1, space0) {
+  uint4 x_16[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float compute_value_f1_f1_(inout float limit, inout float thirty_two) {
+  float x_104 = 0.0f;
+  float x_104_phi = 0.0f;
+  int x_107_phi = 0;
+  x_104_phi = -0.5f;
+  x_107_phi = 1;
+  while (true) {
+    float x_126 = 0.0f;
+    float x_125 = 0.0f;
+    int x_108 = 0;
+    float x_105_phi = 0.0f;
+    x_104 = x_104_phi;
+    const int x_107 = x_107_phi;
+    if ((x_107 < 800)) {
+    } else {
+      break;
+    }
+    float x_124 = 0.0f;
+    float x_125_phi = 0.0f;
+    if (((x_107 % 32) == 0)) {
+      x_126 = (x_104 + 0.400000006f);
+      x_105_phi = x_126;
+    } else {
+      const float x_118 = thirty_two;
+      x_125_phi = x_104;
+      if (((float(x_107) % round(x_118)) <= 0.01f)) {
+        x_124 = (x_104 + 100.0f);
+        x_125_phi = x_124;
+      }
+      x_125 = x_125_phi;
+      x_105_phi = x_125;
+    }
+    float x_105 = 0.0f;
+    x_105 = x_105_phi;
+    const float x_128 = limit;
+    if ((float(x_107) >= x_128)) {
+      return x_105;
+    }
+    {
+      x_108 = (x_107 + 1);
+      x_104_phi = x_105;
+      x_107_phi = x_108;
+    }
+  }
+  return x_104;
+}
+
+void main_1() {
+  float3 c = float3(0.0f, 0.0f, 0.0f);
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  float param_2 = 0.0f;
+  float param_3 = 0.0f;
+  float3 x_54 = float3(0.0f, 0.0f, 0.0f);
+  int x_74_phi = 0;
+  c = float3(7.0f, 8.0f, 9.0f);
+  const float x_56 = asfloat(x_10[0].x);
+  const float x_58 = round((x_56 * 0.125f));
+  const float x_60 = gl_FragCoord.x;
+  param = x_60;
+  param_1 = x_58;
+  const float x_61 = compute_value_f1_f1_(param, param_1);
+  c.x = x_61;
+  const float x_64 = gl_FragCoord.y;
+  param_2 = x_64;
+  param_3 = x_58;
+  const float x_65 = compute_value_f1_f1_(param_2, param_3);
+  c.y = x_65;
+  const float x_67 = c.x;
+  x_54 = c;
+  const float x_70 = x_54.y;
+  c.z = (x_67 + x_70);
+  x_74_phi = 0;
+  while (true) {
+    int x_75 = 0;
+    const int x_74 = x_74_phi;
+    if ((x_74 < 3)) {
+    } else {
+      break;
+    }
+    const int x_80_save = x_74;
+    const float x_81 = c[x_80_save];
+    if ((x_81 >= 1.0f)) {
+      const float x_86 = asfloat(x_16[0].x);
+      const float x_88 = asfloat(x_16[0].y);
+      if ((x_86 > x_88)) {
+        discard;
+      }
+      const float x_92 = c[x_80_save];
+      const float x_93 = c[x_80_save];
+      set_float3(c, x_80_save, (x_92 * x_93));
+    }
+    {
+      x_75 = (x_74 + 1);
+      x_74_phi = x_75;
+    }
+  }
+  const float3 x_97 = normalize(abs(c));
+  x_GLF_color = float4(x_97.x, x_97.y, x_97.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/1.wgsl.expected.msl
new file mode 100755
index 0000000..12d7016
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/1.wgsl.expected.msl
@@ -0,0 +1,137 @@
+SKIP: FAILED
+
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct buf1 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float compute_value_f1_f1_(thread float* const limit, thread float* const thirty_two) {
+  float x_104 = 0.0f;
+  float x_104_phi = 0.0f;
+  int x_107_phi = 0;
+  x_104_phi = -0.5f;
+  x_107_phi = 1;
+  while (true) {
+    float x_126 = 0.0f;
+    float x_125 = 0.0f;
+    int x_108 = 0;
+    float x_105_phi = 0.0f;
+    x_104 = x_104_phi;
+    int const x_107 = x_107_phi;
+    if ((x_107 < 800)) {
+    } else {
+      break;
+    }
+    float x_124 = 0.0f;
+    float x_125_phi = 0.0f;
+    if (((x_107 % 32) == 0)) {
+      x_126 = (x_104 + 0.400000006f);
+      x_105_phi = x_126;
+    } else {
+      float const x_118 = *(thirty_two);
+      x_125_phi = x_104;
+      if (((float(x_107) % rint(x_118)) <= 0.01f)) {
+        x_124 = (x_104 + 100.0f);
+        x_125_phi = x_124;
+      }
+      x_125 = x_125_phi;
+      x_105_phi = x_125;
+    }
+    float x_105 = 0.0f;
+    x_105 = x_105_phi;
+    float const x_128 = *(limit);
+    if ((float(x_107) >= x_128)) {
+      return x_105;
+    }
+    {
+      x_108 = (x_107 + 1);
+      x_104_phi = x_105;
+      x_107_phi = x_108;
+    }
+  }
+  return x_104;
+}
+
+void main_1(constant buf0& x_10, constant buf1& x_16, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float3 c = 0.0f;
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  float param_2 = 0.0f;
+  float param_3 = 0.0f;
+  float3 x_54 = 0.0f;
+  int x_74_phi = 0;
+  c = float3(7.0f, 8.0f, 9.0f);
+  float const x_56 = x_10.resolution.x;
+  float const x_58 = rint((x_56 * 0.125f));
+  float const x_60 = (*(tint_symbol_5)).x;
+  param = x_60;
+  param_1 = x_58;
+  float const x_61 = compute_value_f1_f1_(&(param), &(param_1));
+  c.x = x_61;
+  float const x_64 = (*(tint_symbol_5)).y;
+  param_2 = x_64;
+  param_3 = x_58;
+  float const x_65 = compute_value_f1_f1_(&(param_2), &(param_3));
+  c.y = x_65;
+  float const x_67 = c.x;
+  float3 const x_68 = c;
+  x_54 = x_68;
+  float const x_70 = x_54.y;
+  c.z = (x_67 + x_70);
+  x_74_phi = 0;
+  while (true) {
+    int x_75 = 0;
+    int const x_74 = x_74_phi;
+    if ((x_74 < 3)) {
+    } else {
+      break;
+    }
+    int const x_80_save = x_74;
+    float const x_81 = c[x_80_save];
+    if ((x_81 >= 1.0f)) {
+      float const x_86 = x_16.injectionSwitch.x;
+      float const x_88 = x_16.injectionSwitch.y;
+      if ((x_86 > x_88)) {
+        discard_fragment();
+      }
+      float const x_92 = c[x_80_save];
+      float const x_93 = c[x_80_save];
+      c[x_80_save] = (x_92 * x_93);
+    }
+    {
+      x_75 = (x_74 + 1);
+      x_74_phi = x_75;
+    }
+  }
+  float3 const x_95 = c;
+  float3 const x_97 = normalize(fabs(x_95));
+  *(tint_symbol_6) = float4(x_97.x, x_97.y, x_97.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_10 [[buffer(0)]], constant buf1& x_16 [[buffer(1)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_10, x_16, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
+T:\tmp\uq0.0.metal:42:26: error: invalid operands to binary expression ('float' and 'float')
+      if (((float(x_107) % rint(x_118)) <= 0.01f)) {
+            ~~~~~~~~~~~~ ^ ~~~~~~~~~~~
+1 error generated.
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..d622545
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/1.wgsl.expected.spvasm
@@ -0,0 +1,316 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 192
+; Schema: 0
+               OpCapability Shader
+         %67 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_10 "x_10"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "injectionSwitch"
+               OpName %x_16 "x_16"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %compute_value_f1_f1_ "compute_value_f1_f1_"
+               OpName %limit "limit"
+               OpName %thirty_two "thirty_two"
+               OpName %x_104 "x_104"
+               OpName %x_104_phi "x_104_phi"
+               OpName %x_107_phi "x_107_phi"
+               OpName %x_126 "x_126"
+               OpName %x_125 "x_125"
+               OpName %x_108 "x_108"
+               OpName %x_105_phi "x_105_phi"
+               OpName %x_124 "x_124"
+               OpName %x_125_phi "x_125_phi"
+               OpName %x_105 "x_105"
+               OpName %main_1 "main_1"
+               OpName %c "c"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %x_54 "x_54"
+               OpName %x_74_phi "x_74_phi"
+               OpName %x_75 "x_75"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_16 NonWritable
+               OpDecorate %x_16 DescriptorSet 0
+               OpDecorate %x_16 Binding 1
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_16 = OpVariable %_ptr_Uniform_buf1 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+%_ptr_Function_float = OpTypePointer Function %float
+         %18 = OpTypeFunction %float %_ptr_Function_float %_ptr_Function_float
+         %25 = OpConstantNull %float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %30 = OpConstantNull %int
+ %float_n0_5 = OpConstant %float -0.5
+      %int_1 = OpConstant %int 1
+    %int_800 = OpConstant %int 800
+       %bool = OpTypeBool
+     %int_32 = OpConstant %int 32
+      %int_0 = OpConstant %int 0
+%float_0_400000006 = OpConstant %float 0.400000006
+%float_0_00999999978 = OpConstant %float 0.00999999978
+  %float_100 = OpConstant %float 100
+       %void = OpTypeVoid
+         %92 = OpTypeFunction %void
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %99 = OpConstantNull %v3float
+    %float_7 = OpConstant %float 7
+    %float_8 = OpConstant %float 8
+    %float_9 = OpConstant %float 9
+        %109 = OpConstantComposite %v3float %float_7 %float_8 %float_9
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%float_0_125 = OpConstant %float 0.125
+%_ptr_Private_float = OpTypePointer Private %float
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+      %int_3 = OpConstant %int 3
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %179 = OpTypeFunction %void %main_out
+%compute_value_f1_f1_ = OpFunction %float None %18
+      %limit = OpFunctionParameter %_ptr_Function_float
+ %thirty_two = OpFunctionParameter %_ptr_Function_float
+         %23 = OpLabel
+      %x_104 = OpVariable %_ptr_Function_float Function %25
+  %x_104_phi = OpVariable %_ptr_Function_float Function %25
+  %x_107_phi = OpVariable %_ptr_Function_int Function %30
+      %x_126 = OpVariable %_ptr_Function_float Function %25
+      %x_125 = OpVariable %_ptr_Function_float Function %25
+      %x_108 = OpVariable %_ptr_Function_int Function %30
+  %x_105_phi = OpVariable %_ptr_Function_float Function %25
+      %x_124 = OpVariable %_ptr_Function_float Function %25
+  %x_125_phi = OpVariable %_ptr_Function_float Function %25
+      %x_105 = OpVariable %_ptr_Function_float Function %25
+               OpStore %x_104_phi %float_n0_5
+               OpStore %x_107_phi %int_1
+               OpBranch %33
+         %33 = OpLabel
+               OpLoopMerge %34 %35 None
+               OpBranch %36
+         %36 = OpLabel
+         %41 = OpLoad %float %x_104_phi
+               OpStore %x_104 %41
+         %42 = OpLoad %int %x_107_phi
+         %44 = OpSLessThan %bool %42 %int_800
+               OpSelectionMerge %46 None
+               OpBranchConditional %44 %47 %48
+         %47 = OpLabel
+               OpBranch %46
+         %48 = OpLabel
+               OpBranch %34
+         %46 = OpLabel
+         %52 = OpSMod %int %42 %int_32
+         %54 = OpIEqual %bool %52 %int_0
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %57
+         %56 = OpLabel
+         %58 = OpLoad %float %x_104
+         %60 = OpFAdd %float %58 %float_0_400000006
+               OpStore %x_126 %60
+         %61 = OpLoad %float %x_126
+               OpStore %x_105_phi %61
+               OpBranch %55
+         %57 = OpLabel
+         %63 = OpLoad %float %thirty_two
+         %64 = OpLoad %float %x_104
+               OpStore %x_125_phi %64
+         %65 = OpConvertSToF %float %42
+         %66 = OpExtInst %float %67 RoundEven %63
+         %68 = OpFMod %float %65 %66
+         %70 = OpFOrdLessThanEqual %bool %68 %float_0_00999999978
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %71
+         %72 = OpLabel
+         %73 = OpLoad %float %x_104
+         %75 = OpFAdd %float %73 %float_100
+               OpStore %x_124 %75
+         %76 = OpLoad %float %x_124
+               OpStore %x_125_phi %76
+               OpBranch %71
+         %71 = OpLabel
+         %77 = OpLoad %float %x_125_phi
+               OpStore %x_125 %77
+         %78 = OpLoad %float %x_125
+               OpStore %x_105_phi %78
+               OpBranch %55
+         %55 = OpLabel
+         %80 = OpLoad %float %x_105_phi
+               OpStore %x_105 %80
+         %82 = OpLoad %float %limit
+         %83 = OpConvertSToF %float %42
+         %84 = OpFOrdGreaterThanEqual %bool %83 %82
+               OpSelectionMerge %85 None
+               OpBranchConditional %84 %86 %85
+         %86 = OpLabel
+         %87 = OpLoad %float %x_105
+               OpReturnValue %87
+         %85 = OpLabel
+               OpBranch %35
+         %35 = OpLabel
+         %88 = OpIAdd %int %42 %int_1
+               OpStore %x_108 %88
+         %89 = OpLoad %float %x_105
+               OpStore %x_104_phi %89
+         %90 = OpLoad %int %x_108
+               OpStore %x_107_phi %90
+               OpBranch %33
+         %34 = OpLabel
+         %91 = OpLoad %float %x_104
+               OpReturnValue %91
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %92
+         %95 = OpLabel
+          %c = OpVariable %_ptr_Function_v3float Function %99
+      %param = OpVariable %_ptr_Function_float Function %25
+    %param_1 = OpVariable %_ptr_Function_float Function %25
+    %param_2 = OpVariable %_ptr_Function_float Function %25
+    %param_3 = OpVariable %_ptr_Function_float Function %25
+       %x_54 = OpVariable %_ptr_Function_v3float Function %99
+   %x_74_phi = OpVariable %_ptr_Function_int Function %30
+       %x_75 = OpVariable %_ptr_Function_int Function %30
+               OpStore %c %109
+        %113 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %uint_0
+        %114 = OpLoad %float %113
+        %117 = OpFMul %float %114 %float_0_125
+        %115 = OpExtInst %float %67 RoundEven %117
+        %119 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+        %120 = OpLoad %float %119
+               OpStore %param %120
+               OpStore %param_1 %115
+        %121 = OpFunctionCall %float %compute_value_f1_f1_ %param %param_1
+        %124 = OpAccessChain %_ptr_Function_float %c %uint_0
+               OpStore %124 %121
+        %126 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %127 = OpLoad %float %126
+               OpStore %param_2 %127
+               OpStore %param_3 %115
+        %128 = OpFunctionCall %float %compute_value_f1_f1_ %param_2 %param_3
+        %131 = OpAccessChain %_ptr_Function_float %c %uint_1
+               OpStore %131 %128
+        %132 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %133 = OpLoad %float %132
+        %134 = OpLoad %v3float %c
+               OpStore %x_54 %134
+        %135 = OpAccessChain %_ptr_Function_float %x_54 %uint_1
+        %136 = OpLoad %float %135
+        %138 = OpAccessChain %_ptr_Function_float %c %uint_2
+        %139 = OpFAdd %float %133 %136
+               OpStore %138 %139
+               OpStore %x_74_phi %int_0
+               OpBranch %140
+        %140 = OpLabel
+               OpLoopMerge %141 %142 None
+               OpBranch %143
+        %143 = OpLabel
+        %145 = OpLoad %int %x_74_phi
+        %147 = OpSLessThan %bool %145 %int_3
+               OpSelectionMerge %148 None
+               OpBranchConditional %147 %149 %150
+        %149 = OpLabel
+               OpBranch %148
+        %150 = OpLabel
+               OpBranch %141
+        %148 = OpLabel
+        %151 = OpAccessChain %_ptr_Function_float %c %145
+        %152 = OpLoad %float %151
+        %154 = OpFOrdGreaterThanEqual %bool %152 %float_1
+               OpSelectionMerge %155 None
+               OpBranchConditional %154 %156 %155
+        %156 = OpLabel
+        %157 = OpAccessChain %_ptr_Uniform_float %x_16 %uint_0 %uint_0
+        %158 = OpLoad %float %157
+        %159 = OpAccessChain %_ptr_Uniform_float %x_16 %uint_0 %uint_1
+        %160 = OpLoad %float %159
+        %161 = OpFOrdGreaterThan %bool %158 %160
+               OpSelectionMerge %162 None
+               OpBranchConditional %161 %163 %162
+        %163 = OpLabel
+               OpKill
+        %162 = OpLabel
+        %164 = OpAccessChain %_ptr_Function_float %c %145
+        %165 = OpLoad %float %164
+        %166 = OpAccessChain %_ptr_Function_float %c %145
+        %167 = OpLoad %float %166
+        %168 = OpAccessChain %_ptr_Function_float %c %145
+        %169 = OpFMul %float %165 %167
+               OpStore %168 %169
+               OpBranch %155
+        %155 = OpLabel
+               OpBranch %142
+        %142 = OpLabel
+        %170 = OpIAdd %int %145 %int_1
+               OpStore %x_75 %170
+        %171 = OpLoad %int %x_75
+               OpStore %x_74_phi %171
+               OpBranch %140
+        %141 = OpLabel
+        %172 = OpLoad %v3float %c
+        %174 = OpExtInst %v3float %67 FAbs %172
+        %173 = OpExtInst %v3float %67 Normalize %174
+        %175 = OpCompositeExtract %float %173 0
+        %176 = OpCompositeExtract %float %173 1
+        %177 = OpCompositeExtract %float %173 2
+        %178 = OpCompositeConstruct %v4float %175 %176 %177 %float_1
+               OpStore %x_GLF_color %178
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %179
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %183 = OpLabel
+        %184 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %184
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %92
+        %186 = OpLabel
+        %187 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %187
+        %188 = OpFunctionCall %void %main_1
+        %190 = OpLoad %v4float %x_GLF_color
+        %191 = OpCompositeConstruct %main_out %190
+        %189 = OpFunctionCall %void %tint_symbol_3 %191
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..57edb9b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-divided-1/1.wgsl.expected.wgsl
@@ -0,0 +1,136 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+[[block]]
+struct buf1 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_16 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn compute_value_f1_f1_(limit : ptr<function, f32>, thirty_two : ptr<function, f32>) -> f32 {
+  var x_104 : f32;
+  var x_104_phi : f32;
+  var x_107_phi : i32;
+  x_104_phi = -0.5;
+  x_107_phi = 1;
+  loop {
+    var x_126 : f32;
+    var x_125 : f32;
+    var x_108 : i32;
+    var x_105_phi : f32;
+    x_104 = x_104_phi;
+    let x_107 : i32 = x_107_phi;
+    if ((x_107 < 800)) {
+    } else {
+      break;
+    }
+    var x_124 : f32;
+    var x_125_phi : f32;
+    if (((x_107 % 32) == 0)) {
+      x_126 = (x_104 + 0.400000006);
+      x_105_phi = x_126;
+    } else {
+      let x_118 : f32 = *(thirty_two);
+      x_125_phi = x_104;
+      if (((f32(x_107) % round(x_118)) <= 0.01)) {
+        x_124 = (x_104 + 100.0);
+        x_125_phi = x_124;
+      }
+      x_125 = x_125_phi;
+      x_105_phi = x_125;
+    }
+    var x_105 : f32;
+    x_105 = x_105_phi;
+    let x_128 : f32 = *(limit);
+    if ((f32(x_107) >= x_128)) {
+      return x_105;
+    }
+
+    continuing {
+      x_108 = (x_107 + 1);
+      x_104_phi = x_105;
+      x_107_phi = x_108;
+    }
+  }
+  return x_104;
+}
+
+fn main_1() {
+  var c : vec3<f32>;
+  var param : f32;
+  var param_1 : f32;
+  var param_2 : f32;
+  var param_3 : f32;
+  var x_54 : vec3<f32>;
+  var x_74_phi : i32;
+  c = vec3<f32>(7.0, 8.0, 9.0);
+  let x_56 : f32 = x_10.resolution.x;
+  let x_58 : f32 = round((x_56 * 0.125));
+  let x_60 : f32 = gl_FragCoord.x;
+  param = x_60;
+  param_1 = x_58;
+  let x_61 : f32 = compute_value_f1_f1_(&(param), &(param_1));
+  let x_62 : ptr<function, f32> = &(c.x);
+  *(x_62) = x_61;
+  let x_64 : f32 = gl_FragCoord.y;
+  param_2 = x_64;
+  param_3 = x_58;
+  let x_65 : f32 = compute_value_f1_f1_(&(param_2), &(param_3));
+  c.y = x_65;
+  let x_67 : f32 = *(x_62);
+  let x_68 : vec3<f32> = c;
+  x_54 = x_68;
+  let x_70 : f32 = x_54.y;
+  c.z = (x_67 + x_70);
+  x_74_phi = 0;
+  loop {
+    var x_75 : i32;
+    let x_74 : i32 = x_74_phi;
+    if ((x_74 < 3)) {
+    } else {
+      break;
+    }
+    let x_80 : ptr<function, f32> = &(c[x_74]);
+    let x_81 : f32 = *(x_80);
+    if ((x_81 >= 1.0)) {
+      let x_86 : f32 = x_16.injectionSwitch.x;
+      let x_88 : f32 = x_16.injectionSwitch.y;
+      if ((x_86 > x_88)) {
+        discard;
+      }
+      let x_92 : f32 = *(x_80);
+      let x_93 : f32 = *(x_80);
+      *(x_80) = (x_92 * x_93);
+    }
+
+    continuing {
+      x_75 = (x_74 + 1);
+      x_74_phi = x_75;
+    }
+  }
+  let x_95 : vec3<f32> = c;
+  let x_97 : vec3<f32> = normalize(abs(x_95));
+  x_GLF_color = vec4<f32>(x_97.x, x_97.y, x_97.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-simple-loop/1.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-simple-loop/1.spvasm
new file mode 100644
index 0000000..9ae0514
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-simple-loop/1.spvasm
@@ -0,0 +1,275 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %compute_value_f1_f1_ "compute_value(f1;f1;"
+               OpName %limit "limit"
+               OpName %thirty_two "thirty_two"
+               OpName %result "result"
+               OpName %i "i"
+               OpName %c "c"
+               OpName %thirty_two_0 "thirty_two"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %param_1 "param"
+               OpName %param_2 "param"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "injectionSwitch"
+               OpName %__0 ""
+               OpName %i_0 "i"
+               OpName %j "j"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+         %26 = OpTypeFunction %float %_ptr_Function_float %_ptr_Function_float
+ %float_n0_5 = OpConstant %float -0.5
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+    %int_800 = OpConstant %int 800
+       %bool = OpTypeBool
+     %int_32 = OpConstant %int 32
+      %int_0 = OpConstant %int 0
+%float_0_400000006 = OpConstant %float 0.400000006
+%float_0_00999999978 = OpConstant %float 0.00999999978
+  %float_100 = OpConstant %float 100
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+    %float_7 = OpConstant %float 7
+    %float_8 = OpConstant %float 8
+    %float_9 = OpConstant %float 9
+         %43 = OpConstantComposite %v3float %float_7 %float_8 %float_9
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+%_ptr_Input_float = OpTypePointer Input %float
+     %uint_1 = OpConstant %uint 1
+       %true = OpConstantTrue %bool
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+     %uint_2 = OpConstant %uint 2
+      %int_3 = OpConstant %int 3
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %23
+         %60 = OpLabel
+          %c = OpVariable %_ptr_Function_v3float Function
+%thirty_two_0 = OpVariable %_ptr_Function_float Function
+      %param = OpVariable %_ptr_Function_float Function
+    %param_0 = OpVariable %_ptr_Function_float Function
+    %param_1 = OpVariable %_ptr_Function_float Function
+    %param_2 = OpVariable %_ptr_Function_float Function
+         %61 = OpVariable %_ptr_Function_v3float Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+          %j = OpVariable %_ptr_Function_float Function
+               OpStore %c %43
+         %62 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %63 = OpLoad %float %62
+         %64 = OpFDiv %float %63 %float_8
+         %65 = OpExtInst %float %1 Round %64
+               OpStore %thirty_two_0 %65
+         %66 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %67 = OpLoad %float %66
+               OpStore %param %67
+         %68 = OpLoad %float %thirty_two_0
+               OpStore %param_0 %68
+         %69 = OpFunctionCall %float %compute_value_f1_f1_ %param %param_0
+         %70 = OpAccessChain %_ptr_Function_float %c %uint_0
+               OpStore %70 %69
+         %71 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %72 = OpLoad %float %71
+               OpStore %param_1 %72
+         %73 = OpLoad %float %thirty_two_0
+               OpStore %param_2 %73
+         %74 = OpFunctionCall %float %compute_value_f1_f1_ %param_1 %param_2
+         %75 = OpAccessChain %_ptr_Function_float %c %uint_1
+               OpStore %75 %74
+         %76 = OpAccessChain %_ptr_Function_float %c %uint_0
+         %77 = OpLoad %float %76
+               OpSelectionMerge %78 None
+               OpBranchConditional %true %79 %80
+         %79 = OpLabel
+         %81 = OpLoad %v3float %c
+               OpStore %61 %81
+               OpBranch %78
+         %80 = OpLabel
+         %82 = OpLoad %v3float %c
+         %83 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %uint_0
+         %84 = OpLoad %float %83
+         %85 = OpVectorTimesScalar %v3float %82 %84
+               OpStore %61 %85
+               OpBranch %78
+         %78 = OpLabel
+         %86 = OpAccessChain %_ptr_Function_float %61 %uint_1
+         %87 = OpLoad %float %86
+         %88 = OpFAdd %float %77 %87
+         %89 = OpAccessChain %_ptr_Function_float %c %uint_2
+               OpStore %89 %88
+               OpStore %i_0 %int_0
+               OpBranch %90
+         %90 = OpLabel
+               OpLoopMerge %91 %92 None
+               OpBranch %93
+         %93 = OpLabel
+         %94 = OpLoad %int %i_0
+         %95 = OpSLessThan %bool %94 %int_3
+               OpBranchConditional %95 %96 %91
+         %96 = OpLabel
+         %97 = OpLoad %int %i_0
+         %98 = OpAccessChain %_ptr_Function_float %c %97
+         %99 = OpLoad %float %98
+        %100 = OpFOrdGreaterThanEqual %bool %99 %float_1
+               OpSelectionMerge %101 None
+               OpBranchConditional %100 %102 %101
+        %102 = OpLabel
+        %103 = OpLoad %int %i_0
+        %104 = OpLoad %int %i_0
+        %105 = OpAccessChain %_ptr_Function_float %c %104
+        %106 = OpLoad %float %105
+        %107 = OpLoad %int %i_0
+        %108 = OpAccessChain %_ptr_Function_float %c %107
+        %109 = OpLoad %float %108
+        %110 = OpFMul %float %106 %109
+        %111 = OpAccessChain %_ptr_Function_float %c %103
+               OpStore %111 %110
+               OpBranch %101
+        %101 = OpLabel
+               OpStore %j %float_0
+               OpBranch %112
+        %112 = OpLabel
+               OpLoopMerge %113 %114 None
+               OpBranch %115
+        %115 = OpLabel
+        %116 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %uint_0
+        %117 = OpLoad %float %116
+        %118 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %uint_1
+        %119 = OpLoad %float %118
+        %120 = OpFOrdGreaterThan %bool %117 %119
+               OpBranchConditional %120 %121 %113
+        %121 = OpLabel
+        %122 = OpLoad %float %j
+        %123 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %uint_0
+        %124 = OpLoad %float %123
+        %125 = OpFOrdGreaterThanEqual %bool %122 %124
+               OpSelectionMerge %126 None
+               OpBranchConditional %125 %127 %126
+        %127 = OpLabel
+               OpBranch %113
+        %126 = OpLabel
+        %128 = OpLoad %float %j
+        %129 = OpFAdd %float %128 %float_1
+               OpStore %j %129
+               OpBranch %114
+        %114 = OpLabel
+               OpBranch %112
+        %113 = OpLabel
+               OpBranch %92
+         %92 = OpLabel
+        %130 = OpLoad %int %i_0
+        %131 = OpIAdd %int %130 %int_1
+               OpStore %i_0 %131
+               OpBranch %90
+         %91 = OpLabel
+        %132 = OpLoad %v3float %c
+        %133 = OpExtInst %v3float %1 FAbs %132
+        %134 = OpExtInst %v3float %1 Normalize %133
+        %135 = OpCompositeExtract %float %134 0
+        %136 = OpCompositeExtract %float %134 1
+        %137 = OpCompositeExtract %float %134 2
+        %138 = OpCompositeConstruct %v4float %135 %136 %137 %float_1
+               OpStore %_GLF_color %138
+               OpReturn
+               OpFunctionEnd
+%compute_value_f1_f1_ = OpFunction %float None %26
+      %limit = OpFunctionParameter %_ptr_Function_float
+ %thirty_two = OpFunctionParameter %_ptr_Function_float
+        %139 = OpLabel
+     %result = OpVariable %_ptr_Function_float Function
+          %i = OpVariable %_ptr_Function_int Function
+               OpStore %result %float_n0_5
+               OpStore %i %int_1
+               OpBranch %140
+        %140 = OpLabel
+               OpLoopMerge %141 %142 None
+               OpBranch %143
+        %143 = OpLabel
+        %144 = OpLoad %int %i
+        %145 = OpSLessThan %bool %144 %int_800
+               OpBranchConditional %145 %146 %141
+        %146 = OpLabel
+        %147 = OpLoad %int %i
+        %148 = OpSMod %int %147 %int_32
+        %149 = OpIEqual %bool %148 %int_0
+               OpSelectionMerge %150 None
+               OpBranchConditional %149 %151 %152
+        %151 = OpLabel
+        %153 = OpLoad %float %result
+        %154 = OpFAdd %float %153 %float_0_400000006
+               OpStore %result %154
+               OpBranch %150
+        %152 = OpLabel
+        %155 = OpLoad %int %i
+        %156 = OpConvertSToF %float %155
+        %157 = OpLoad %float %thirty_two
+        %158 = OpExtInst %float %1 Round %157
+        %159 = OpFMod %float %156 %158
+        %160 = OpFOrdLessThanEqual %bool %159 %float_0_00999999978
+               OpSelectionMerge %161 None
+               OpBranchConditional %160 %162 %161
+        %162 = OpLabel
+        %163 = OpLoad %float %result
+        %164 = OpFAdd %float %163 %float_100
+               OpStore %result %164
+               OpBranch %161
+        %161 = OpLabel
+               OpBranch %150
+        %150 = OpLabel
+        %165 = OpLoad %int %i
+        %166 = OpConvertSToF %float %165
+        %167 = OpLoad %float %limit
+        %168 = OpFOrdGreaterThanEqual %bool %166 %167
+               OpSelectionMerge %169 None
+               OpBranchConditional %168 %170 %169
+        %170 = OpLabel
+        %171 = OpLoad %float %result
+               OpReturnValue %171
+        %169 = OpLabel
+               OpBranch %142
+        %142 = OpLabel
+        %172 = OpLoad %int %i
+        %173 = OpIAdd %int %172 %int_1
+               OpStore %i %173
+               OpBranch %140
+        %141 = OpLabel
+        %174 = OpLoad %float %result
+               OpReturnValue %174
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-simple-loop/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-simple-loop/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..8f3bad1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-simple-loop/1.spvasm.expected.hlsl
@@ -0,0 +1,122 @@
+void set_float3(inout float3 vec, int idx, float val) {
+  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
+}
+
+cbuffer cbuffer_x_13 : register(b0, space0) {
+  uint4 x_13[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_19 : register(b1, space0) {
+  uint4 x_19[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float compute_value_f1_f1_(inout float limit, inout float thirty_two) {
+  float result = 0.0f;
+  int i = 0;
+  result = -0.5f;
+  i = 1;
+  {
+    for(; (i < 800); i = (i + 1)) {
+      if (((i % 32) == 0)) {
+        result = (result + 0.400000006f);
+      } else {
+        const int x_155 = i;
+        const float x_157 = thirty_two;
+        if (((float(x_155) % round(x_157)) <= 0.01f)) {
+          result = (result + 100.0f);
+        }
+      }
+      const int x_165 = i;
+      const float x_167 = limit;
+      if ((float(x_165) >= x_167)) {
+        return result;
+      }
+    }
+  }
+  return result;
+}
+
+void main_1() {
+  float3 c = float3(0.0f, 0.0f, 0.0f);
+  float thirty_two_1 = 0.0f;
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  float param_2 = 0.0f;
+  float param_3 = 0.0f;
+  float3 x_61 = float3(0.0f, 0.0f, 0.0f);
+  int i_1 = 0;
+  float j = 0.0f;
+  c = float3(7.0f, 8.0f, 9.0f);
+  const float x_63 = asfloat(x_13[0].x);
+  thirty_two_1 = round((x_63 / 8.0f));
+  const float x_67 = gl_FragCoord.x;
+  param = x_67;
+  param_1 = thirty_two_1;
+  const float x_69 = compute_value_f1_f1_(param, param_1);
+  c.x = x_69;
+  const float x_72 = gl_FragCoord.y;
+  param_2 = x_72;
+  param_3 = thirty_two_1;
+  const float x_74 = compute_value_f1_f1_(param_2, param_3);
+  c.y = x_74;
+  const float x_77 = c.x;
+  if (true) {
+    x_61 = c;
+  } else {
+    const float3 x_82 = c;
+    const float x_84 = asfloat(x_19[0].x);
+    x_61 = (x_82 * x_84);
+  }
+  const float x_87 = x_61.y;
+  c.z = (x_77 + x_87);
+  i_1 = 0;
+  {
+    for(; (i_1 < 3); i_1 = (i_1 + 1)) {
+      const float x_99 = c[i_1];
+      if ((x_99 >= 1.0f)) {
+        const int x_103 = i_1;
+        const float x_106 = c[i_1];
+        const float x_109 = c[i_1];
+        set_float3(c, x_103, (x_106 * x_109));
+      }
+      j = 0.0f;
+      while (true) {
+        const float x_117 = asfloat(x_19[0].x);
+        const float x_119 = asfloat(x_19[0].y);
+        if ((x_117 > x_119)) {
+        } else {
+          break;
+        }
+        const float x_122 = j;
+        const float x_124 = asfloat(x_19[0].x);
+        if ((x_122 >= x_124)) {
+          break;
+        }
+        j = (j + 1.0f);
+      }
+    }
+  }
+  const float3 x_134 = normalize(abs(c));
+  x_GLF_color = float4(x_134.x, x_134.y, x_134.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-simple-loop/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-simple-loop/1.spvasm.expected.msl
new file mode 100755
index 0000000..721f3ab
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-simple-loop/1.spvasm.expected.msl
@@ -0,0 +1,151 @@
+SKIP: FAILED
+
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct buf1 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float compute_value_f1_f1_(thread float* const limit, thread float* const thirty_two) {
+  float result = 0.0f;
+  int i = 0;
+  result = -0.5f;
+  i = 1;
+  while (true) {
+    int const x_144 = i;
+    if ((x_144 < 800)) {
+    } else {
+      break;
+    }
+    int const x_147 = i;
+    if (((x_147 % 32) == 0)) {
+      float const x_153 = result;
+      result = (x_153 + 0.400000006f);
+    } else {
+      int const x_155 = i;
+      float const x_157 = *(thirty_two);
+      if (((float(x_155) % rint(x_157)) <= 0.01f)) {
+        float const x_163 = result;
+        result = (x_163 + 100.0f);
+      }
+    }
+    int const x_165 = i;
+    float const x_167 = *(limit);
+    if ((float(x_165) >= x_167)) {
+      float const x_171 = result;
+      return x_171;
+    }
+    {
+      int const x_172 = i;
+      i = (x_172 + 1);
+    }
+  }
+  float const x_174 = result;
+  return x_174;
+}
+
+void main_1(constant buf0& x_13, constant buf1& x_19, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float3 c = 0.0f;
+  float thirty_two_1 = 0.0f;
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  float param_2 = 0.0f;
+  float param_3 = 0.0f;
+  float3 x_61 = 0.0f;
+  int i_1 = 0;
+  float j = 0.0f;
+  c = float3(7.0f, 8.0f, 9.0f);
+  float const x_63 = x_13.resolution.x;
+  thirty_two_1 = rint((x_63 / 8.0f));
+  float const x_67 = (*(tint_symbol_5)).x;
+  param = x_67;
+  float const x_68 = thirty_two_1;
+  param_1 = x_68;
+  float const x_69 = compute_value_f1_f1_(&(param), &(param_1));
+  c.x = x_69;
+  float const x_72 = (*(tint_symbol_5)).y;
+  param_2 = x_72;
+  float const x_73 = thirty_two_1;
+  param_3 = x_73;
+  float const x_74 = compute_value_f1_f1_(&(param_2), &(param_3));
+  c.y = x_74;
+  float const x_77 = c.x;
+  if (true) {
+    float3 const x_81 = c;
+    x_61 = x_81;
+  } else {
+    float3 const x_82 = c;
+    float const x_84 = x_19.injectionSwitch.x;
+    x_61 = (x_82 * x_84);
+  }
+  float const x_87 = x_61.y;
+  c.z = (x_77 + x_87);
+  i_1 = 0;
+  while (true) {
+    int const x_94 = i_1;
+    if ((x_94 < 3)) {
+    } else {
+      break;
+    }
+    int const x_97 = i_1;
+    float const x_99 = c[x_97];
+    if ((x_99 >= 1.0f)) {
+      int const x_103 = i_1;
+      int const x_104 = i_1;
+      float const x_106 = c[x_104];
+      int const x_107 = i_1;
+      float const x_109 = c[x_107];
+      c[x_103] = (x_106 * x_109);
+    }
+    j = 0.0f;
+    while (true) {
+      float const x_117 = x_19.injectionSwitch.x;
+      float const x_119 = x_19.injectionSwitch.y;
+      if ((x_117 > x_119)) {
+      } else {
+        break;
+      }
+      float const x_122 = j;
+      float const x_124 = x_19.injectionSwitch.x;
+      if ((x_122 >= x_124)) {
+        break;
+      }
+      float const x_128 = j;
+      j = (x_128 + 1.0f);
+    }
+    {
+      int const x_130 = i_1;
+      i_1 = (x_130 + 1);
+    }
+  }
+  float3 const x_132 = c;
+  float3 const x_134 = normalize(fabs(x_132));
+  *(tint_symbol_6) = float4(x_134.x, x_134.y, x_134.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_13 [[buffer(0)]], constant buf1& x_19 [[buffer(1)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_13, x_19, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
+T:\tmp\ufhc.0.metal:35:26: error: invalid operands to binary expression ('float' and 'float')
+      if (((float(x_155) % rint(x_157)) <= 0.01f)) {
+            ~~~~~~~~~~~~ ^ ~~~~~~~~~~~
+1 error generated.
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-simple-loop/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-simple-loop/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..304913e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-simple-loop/1.spvasm.expected.spvasm
@@ -0,0 +1,331 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 207
+; Schema: 0
+               OpCapability Shader
+         %59 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_13 "x_13"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "injectionSwitch"
+               OpName %x_19 "x_19"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %compute_value_f1_f1_ "compute_value_f1_f1_"
+               OpName %limit "limit"
+               OpName %thirty_two "thirty_two"
+               OpName %result "result"
+               OpName %i "i"
+               OpName %main_1 "main_1"
+               OpName %c "c"
+               OpName %thirty_two_1 "thirty_two_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %x_61 "x_61"
+               OpName %i_1 "i_1"
+               OpName %j "j"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_13 NonWritable
+               OpDecorate %x_13 DescriptorSet 0
+               OpDecorate %x_13 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_19 NonWritable
+               OpDecorate %x_19 DescriptorSet 0
+               OpDecorate %x_19 Binding 1
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_13 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_19 = OpVariable %_ptr_Uniform_buf1 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+%_ptr_Function_float = OpTypePointer Function %float
+         %18 = OpTypeFunction %float %_ptr_Function_float %_ptr_Function_float
+         %25 = OpConstantNull %float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpConstantNull %int
+ %float_n0_5 = OpConstant %float -0.5
+      %int_1 = OpConstant %int 1
+    %int_800 = OpConstant %int 800
+       %bool = OpTypeBool
+     %int_32 = OpConstant %int 32
+      %int_0 = OpConstant %int 0
+%float_0_400000006 = OpConstant %float 0.400000006
+%float_0_00999999978 = OpConstant %float 0.00999999978
+  %float_100 = OpConstant %float 100
+       %void = OpTypeVoid
+         %79 = OpTypeFunction %void
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %86 = OpConstantNull %v3float
+    %float_7 = OpConstant %float 7
+    %float_8 = OpConstant %float 8
+    %float_9 = OpConstant %float 9
+         %98 = OpConstantComposite %v3float %float_7 %float_8 %float_9
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Private_float = OpTypePointer Private %float
+     %uint_1 = OpConstant %uint 1
+       %true = OpConstantTrue %bool
+     %uint_2 = OpConstant %uint 2
+      %int_3 = OpConstant %int 3
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+   %main_out = OpTypeStruct %v4float
+        %194 = OpTypeFunction %void %main_out
+%compute_value_f1_f1_ = OpFunction %float None %18
+      %limit = OpFunctionParameter %_ptr_Function_float
+ %thirty_two = OpFunctionParameter %_ptr_Function_float
+         %23 = OpLabel
+     %result = OpVariable %_ptr_Function_float Function %25
+          %i = OpVariable %_ptr_Function_int Function %29
+               OpStore %result %float_n0_5
+               OpStore %i %int_1
+               OpBranch %32
+         %32 = OpLabel
+               OpLoopMerge %33 %34 None
+               OpBranch %35
+         %35 = OpLabel
+         %36 = OpLoad %int %i
+         %38 = OpSLessThan %bool %36 %int_800
+               OpSelectionMerge %40 None
+               OpBranchConditional %38 %41 %42
+         %41 = OpLabel
+               OpBranch %40
+         %42 = OpLabel
+               OpBranch %33
+         %40 = OpLabel
+         %43 = OpLoad %int %i
+         %45 = OpSMod %int %43 %int_32
+         %47 = OpIEqual %bool %45 %int_0
+               OpSelectionMerge %48 None
+               OpBranchConditional %47 %49 %50
+         %49 = OpLabel
+         %51 = OpLoad %float %result
+         %53 = OpFAdd %float %51 %float_0_400000006
+               OpStore %result %53
+               OpBranch %48
+         %50 = OpLabel
+         %54 = OpLoad %int %i
+         %56 = OpLoad %float %thirty_two
+         %57 = OpConvertSToF %float %54
+         %58 = OpExtInst %float %59 RoundEven %56
+         %60 = OpFMod %float %57 %58
+         %62 = OpFOrdLessThanEqual %bool %60 %float_0_00999999978
+               OpSelectionMerge %63 None
+               OpBranchConditional %62 %64 %63
+         %64 = OpLabel
+         %65 = OpLoad %float %result
+         %67 = OpFAdd %float %65 %float_100
+               OpStore %result %67
+               OpBranch %63
+         %63 = OpLabel
+               OpBranch %48
+         %48 = OpLabel
+         %68 = OpLoad %int %i
+         %70 = OpLoad %float %limit
+         %71 = OpConvertSToF %float %68
+         %72 = OpFOrdGreaterThanEqual %bool %71 %70
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %74 %73
+         %74 = OpLabel
+         %75 = OpLoad %float %result
+               OpReturnValue %75
+         %73 = OpLabel
+               OpBranch %34
+         %34 = OpLabel
+         %76 = OpLoad %int %i
+         %77 = OpIAdd %int %76 %int_1
+               OpStore %i %77
+               OpBranch %32
+         %33 = OpLabel
+         %78 = OpLoad %float %result
+               OpReturnValue %78
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %79
+         %82 = OpLabel
+          %c = OpVariable %_ptr_Function_v3float Function %86
+%thirty_two_1 = OpVariable %_ptr_Function_float Function %25
+      %param = OpVariable %_ptr_Function_float Function %25
+    %param_1 = OpVariable %_ptr_Function_float Function %25
+    %param_2 = OpVariable %_ptr_Function_float Function %25
+    %param_3 = OpVariable %_ptr_Function_float Function %25
+       %x_61 = OpVariable %_ptr_Function_v3float Function %86
+        %i_1 = OpVariable %_ptr_Function_int Function %29
+          %j = OpVariable %_ptr_Function_float Function %25
+               OpStore %c %98
+        %102 = OpAccessChain %_ptr_Uniform_float %x_13 %uint_0 %uint_0
+        %103 = OpLoad %float %102
+        %105 = OpFDiv %float %103 %float_8
+        %104 = OpExtInst %float %59 RoundEven %105
+               OpStore %thirty_two_1 %104
+        %107 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+        %108 = OpLoad %float %107
+               OpStore %param %108
+        %109 = OpLoad %float %thirty_two_1
+               OpStore %param_1 %109
+        %110 = OpFunctionCall %float %compute_value_f1_f1_ %param %param_1
+        %113 = OpAccessChain %_ptr_Function_float %c %uint_0
+               OpStore %113 %110
+        %115 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %116 = OpLoad %float %115
+               OpStore %param_2 %116
+        %117 = OpLoad %float %thirty_two_1
+               OpStore %param_3 %117
+        %118 = OpFunctionCall %float %compute_value_f1_f1_ %param_2 %param_3
+        %121 = OpAccessChain %_ptr_Function_float %c %uint_1
+               OpStore %121 %118
+        %122 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %123 = OpLoad %float %122
+               OpSelectionMerge %125 None
+               OpBranchConditional %true %126 %127
+        %126 = OpLabel
+        %128 = OpLoad %v3float %c
+               OpStore %x_61 %128
+               OpBranch %125
+        %127 = OpLabel
+        %129 = OpLoad %v3float %c
+        %130 = OpAccessChain %_ptr_Uniform_float %x_19 %uint_0 %uint_0
+        %131 = OpLoad %float %130
+        %132 = OpVectorTimesScalar %v3float %129 %131
+               OpStore %x_61 %132
+               OpBranch %125
+        %125 = OpLabel
+        %133 = OpAccessChain %_ptr_Function_float %x_61 %uint_1
+        %134 = OpLoad %float %133
+        %136 = OpAccessChain %_ptr_Function_float %c %uint_2
+        %137 = OpFAdd %float %123 %134
+               OpStore %136 %137
+               OpStore %i_1 %int_0
+               OpBranch %138
+        %138 = OpLabel
+               OpLoopMerge %139 %140 None
+               OpBranch %141
+        %141 = OpLabel
+        %142 = OpLoad %int %i_1
+        %144 = OpSLessThan %bool %142 %int_3
+               OpSelectionMerge %145 None
+               OpBranchConditional %144 %146 %147
+        %146 = OpLabel
+               OpBranch %145
+        %147 = OpLabel
+               OpBranch %139
+        %145 = OpLabel
+        %148 = OpLoad %int %i_1
+        %149 = OpAccessChain %_ptr_Function_float %c %148
+        %150 = OpLoad %float %149
+        %152 = OpFOrdGreaterThanEqual %bool %150 %float_1
+               OpSelectionMerge %153 None
+               OpBranchConditional %152 %154 %153
+        %154 = OpLabel
+        %155 = OpLoad %int %i_1
+        %156 = OpLoad %int %i_1
+        %157 = OpAccessChain %_ptr_Function_float %c %156
+        %158 = OpLoad %float %157
+        %159 = OpLoad %int %i_1
+        %160 = OpAccessChain %_ptr_Function_float %c %159
+        %161 = OpLoad %float %160
+        %162 = OpAccessChain %_ptr_Function_float %c %155
+        %163 = OpFMul %float %158 %161
+               OpStore %162 %163
+               OpBranch %153
+        %153 = OpLabel
+               OpStore %j %float_0
+               OpBranch %165
+        %165 = OpLabel
+               OpLoopMerge %166 %167 None
+               OpBranch %168
+        %168 = OpLabel
+        %169 = OpAccessChain %_ptr_Uniform_float %x_19 %uint_0 %uint_0
+        %170 = OpLoad %float %169
+        %171 = OpAccessChain %_ptr_Uniform_float %x_19 %uint_0 %uint_1
+        %172 = OpLoad %float %171
+        %173 = OpFOrdGreaterThan %bool %170 %172
+               OpSelectionMerge %174 None
+               OpBranchConditional %173 %175 %176
+        %175 = OpLabel
+               OpBranch %174
+        %176 = OpLabel
+               OpBranch %166
+        %174 = OpLabel
+        %177 = OpLoad %float %j
+        %178 = OpAccessChain %_ptr_Uniform_float %x_19 %uint_0 %uint_0
+        %179 = OpLoad %float %178
+        %180 = OpFOrdGreaterThanEqual %bool %177 %179
+               OpSelectionMerge %181 None
+               OpBranchConditional %180 %182 %181
+        %182 = OpLabel
+               OpBranch %166
+        %181 = OpLabel
+        %183 = OpLoad %float %j
+        %184 = OpFAdd %float %183 %float_1
+               OpStore %j %184
+               OpBranch %167
+        %167 = OpLabel
+               OpBranch %165
+        %166 = OpLabel
+               OpBranch %140
+        %140 = OpLabel
+        %185 = OpLoad %int %i_1
+        %186 = OpIAdd %int %185 %int_1
+               OpStore %i_1 %186
+               OpBranch %138
+        %139 = OpLabel
+        %187 = OpLoad %v3float %c
+        %189 = OpExtInst %v3float %59 FAbs %187
+        %188 = OpExtInst %v3float %59 Normalize %189
+        %190 = OpCompositeExtract %float %188 0
+        %191 = OpCompositeExtract %float %188 1
+        %192 = OpCompositeExtract %float %188 2
+        %193 = OpCompositeConstruct %v4float %190 %191 %192 %float_1
+               OpStore %x_GLF_color %193
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %194
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %198 = OpLabel
+        %199 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %199
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %79
+        %201 = OpLabel
+        %202 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %202
+        %203 = OpFunctionCall %void %main_1
+        %205 = OpLoad %v4float %x_GLF_color
+        %206 = OpCompositeConstruct %main_out %205
+        %204 = OpFunctionCall %void %tint_symbol_3 %206
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-simple-loop/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-simple-loop/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..97ffaf9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-simple-loop/1.spvasm.expected.wgsl
@@ -0,0 +1,149 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+[[block]]
+struct buf1 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_13 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_19 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn compute_value_f1_f1_(limit : ptr<function, f32>, thirty_two : ptr<function, f32>) -> f32 {
+  var result : f32;
+  var i : i32;
+  result = -0.5;
+  i = 1;
+  loop {
+    let x_144 : i32 = i;
+    if ((x_144 < 800)) {
+    } else {
+      break;
+    }
+    let x_147 : i32 = i;
+    if (((x_147 % 32) == 0)) {
+      let x_153 : f32 = result;
+      result = (x_153 + 0.400000006);
+    } else {
+      let x_155 : i32 = i;
+      let x_157 : f32 = *(thirty_two);
+      if (((f32(x_155) % round(x_157)) <= 0.01)) {
+        let x_163 : f32 = result;
+        result = (x_163 + 100.0);
+      }
+    }
+    let x_165 : i32 = i;
+    let x_167 : f32 = *(limit);
+    if ((f32(x_165) >= x_167)) {
+      let x_171 : f32 = result;
+      return x_171;
+    }
+
+    continuing {
+      let x_172 : i32 = i;
+      i = (x_172 + 1);
+    }
+  }
+  let x_174 : f32 = result;
+  return x_174;
+}
+
+fn main_1() {
+  var c : vec3<f32>;
+  var thirty_two_1 : f32;
+  var param : f32;
+  var param_1 : f32;
+  var param_2 : f32;
+  var param_3 : f32;
+  var x_61 : vec3<f32>;
+  var i_1 : i32;
+  var j : f32;
+  c = vec3<f32>(7.0, 8.0, 9.0);
+  let x_63 : f32 = x_13.resolution.x;
+  thirty_two_1 = round((x_63 / 8.0));
+  let x_67 : f32 = gl_FragCoord.x;
+  param = x_67;
+  let x_68 : f32 = thirty_two_1;
+  param_1 = x_68;
+  let x_69 : f32 = compute_value_f1_f1_(&(param), &(param_1));
+  c.x = x_69;
+  let x_72 : f32 = gl_FragCoord.y;
+  param_2 = x_72;
+  let x_73 : f32 = thirty_two_1;
+  param_3 = x_73;
+  let x_74 : f32 = compute_value_f1_f1_(&(param_2), &(param_3));
+  c.y = x_74;
+  let x_77 : f32 = c.x;
+  if (true) {
+    let x_81 : vec3<f32> = c;
+    x_61 = x_81;
+  } else {
+    let x_82 : vec3<f32> = c;
+    let x_84 : f32 = x_19.injectionSwitch.x;
+    x_61 = (x_82 * x_84);
+  }
+  let x_87 : f32 = x_61.y;
+  c.z = (x_77 + x_87);
+  i_1 = 0;
+  loop {
+    let x_94 : i32 = i_1;
+    if ((x_94 < 3)) {
+    } else {
+      break;
+    }
+    let x_97 : i32 = i_1;
+    let x_99 : f32 = c[x_97];
+    if ((x_99 >= 1.0)) {
+      let x_103 : i32 = i_1;
+      let x_104 : i32 = i_1;
+      let x_106 : f32 = c[x_104];
+      let x_107 : i32 = i_1;
+      let x_109 : f32 = c[x_107];
+      c[x_103] = (x_106 * x_109);
+    }
+    j = 0.0;
+    loop {
+      let x_117 : f32 = x_19.injectionSwitch.x;
+      let x_119 : f32 = x_19.injectionSwitch.y;
+      if ((x_117 > x_119)) {
+      } else {
+        break;
+      }
+      let x_122 : f32 = j;
+      let x_124 : f32 = x_19.injectionSwitch.x;
+      if ((x_122 >= x_124)) {
+        break;
+      }
+      let x_128 : f32 = j;
+      j = (x_128 + 1.0);
+    }
+
+    continuing {
+      let x_130 : i32 = i_1;
+      i_1 = (x_130 + 1);
+    }
+  }
+  let x_132 : vec3<f32> = c;
+  let x_134 : vec3<f32> = normalize(abs(x_132));
+  x_GLF_color = vec4<f32>(x_134.x, x_134.y, x_134.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-simple-loop/1.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-simple-loop/1.wgsl
new file mode 100644
index 0000000..97ffaf9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-simple-loop/1.wgsl
@@ -0,0 +1,149 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+[[block]]
+struct buf1 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_13 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_19 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn compute_value_f1_f1_(limit : ptr<function, f32>, thirty_two : ptr<function, f32>) -> f32 {
+  var result : f32;
+  var i : i32;
+  result = -0.5;
+  i = 1;
+  loop {
+    let x_144 : i32 = i;
+    if ((x_144 < 800)) {
+    } else {
+      break;
+    }
+    let x_147 : i32 = i;
+    if (((x_147 % 32) == 0)) {
+      let x_153 : f32 = result;
+      result = (x_153 + 0.400000006);
+    } else {
+      let x_155 : i32 = i;
+      let x_157 : f32 = *(thirty_two);
+      if (((f32(x_155) % round(x_157)) <= 0.01)) {
+        let x_163 : f32 = result;
+        result = (x_163 + 100.0);
+      }
+    }
+    let x_165 : i32 = i;
+    let x_167 : f32 = *(limit);
+    if ((f32(x_165) >= x_167)) {
+      let x_171 : f32 = result;
+      return x_171;
+    }
+
+    continuing {
+      let x_172 : i32 = i;
+      i = (x_172 + 1);
+    }
+  }
+  let x_174 : f32 = result;
+  return x_174;
+}
+
+fn main_1() {
+  var c : vec3<f32>;
+  var thirty_two_1 : f32;
+  var param : f32;
+  var param_1 : f32;
+  var param_2 : f32;
+  var param_3 : f32;
+  var x_61 : vec3<f32>;
+  var i_1 : i32;
+  var j : f32;
+  c = vec3<f32>(7.0, 8.0, 9.0);
+  let x_63 : f32 = x_13.resolution.x;
+  thirty_two_1 = round((x_63 / 8.0));
+  let x_67 : f32 = gl_FragCoord.x;
+  param = x_67;
+  let x_68 : f32 = thirty_two_1;
+  param_1 = x_68;
+  let x_69 : f32 = compute_value_f1_f1_(&(param), &(param_1));
+  c.x = x_69;
+  let x_72 : f32 = gl_FragCoord.y;
+  param_2 = x_72;
+  let x_73 : f32 = thirty_two_1;
+  param_3 = x_73;
+  let x_74 : f32 = compute_value_f1_f1_(&(param_2), &(param_3));
+  c.y = x_74;
+  let x_77 : f32 = c.x;
+  if (true) {
+    let x_81 : vec3<f32> = c;
+    x_61 = x_81;
+  } else {
+    let x_82 : vec3<f32> = c;
+    let x_84 : f32 = x_19.injectionSwitch.x;
+    x_61 = (x_82 * x_84);
+  }
+  let x_87 : f32 = x_61.y;
+  c.z = (x_77 + x_87);
+  i_1 = 0;
+  loop {
+    let x_94 : i32 = i_1;
+    if ((x_94 < 3)) {
+    } else {
+      break;
+    }
+    let x_97 : i32 = i_1;
+    let x_99 : f32 = c[x_97];
+    if ((x_99 >= 1.0)) {
+      let x_103 : i32 = i_1;
+      let x_104 : i32 = i_1;
+      let x_106 : f32 = c[x_104];
+      let x_107 : i32 = i_1;
+      let x_109 : f32 = c[x_107];
+      c[x_103] = (x_106 * x_109);
+    }
+    j = 0.0;
+    loop {
+      let x_117 : f32 = x_19.injectionSwitch.x;
+      let x_119 : f32 = x_19.injectionSwitch.y;
+      if ((x_117 > x_119)) {
+      } else {
+        break;
+      }
+      let x_122 : f32 = j;
+      let x_124 : f32 = x_19.injectionSwitch.x;
+      if ((x_122 >= x_124)) {
+        break;
+      }
+      let x_128 : f32 = j;
+      j = (x_128 + 1.0);
+    }
+
+    continuing {
+      let x_130 : i32 = i_1;
+      i_1 = (x_130 + 1);
+    }
+  }
+  let x_132 : vec3<f32> = c;
+  let x_134 : vec3<f32> = normalize(abs(x_132));
+  x_GLF_color = vec4<f32>(x_134.x, x_134.y, x_134.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-simple-loop/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-simple-loop/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..8f3bad1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-simple-loop/1.wgsl.expected.hlsl
@@ -0,0 +1,122 @@
+void set_float3(inout float3 vec, int idx, float val) {
+  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
+}
+
+cbuffer cbuffer_x_13 : register(b0, space0) {
+  uint4 x_13[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_19 : register(b1, space0) {
+  uint4 x_19[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float compute_value_f1_f1_(inout float limit, inout float thirty_two) {
+  float result = 0.0f;
+  int i = 0;
+  result = -0.5f;
+  i = 1;
+  {
+    for(; (i < 800); i = (i + 1)) {
+      if (((i % 32) == 0)) {
+        result = (result + 0.400000006f);
+      } else {
+        const int x_155 = i;
+        const float x_157 = thirty_two;
+        if (((float(x_155) % round(x_157)) <= 0.01f)) {
+          result = (result + 100.0f);
+        }
+      }
+      const int x_165 = i;
+      const float x_167 = limit;
+      if ((float(x_165) >= x_167)) {
+        return result;
+      }
+    }
+  }
+  return result;
+}
+
+void main_1() {
+  float3 c = float3(0.0f, 0.0f, 0.0f);
+  float thirty_two_1 = 0.0f;
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  float param_2 = 0.0f;
+  float param_3 = 0.0f;
+  float3 x_61 = float3(0.0f, 0.0f, 0.0f);
+  int i_1 = 0;
+  float j = 0.0f;
+  c = float3(7.0f, 8.0f, 9.0f);
+  const float x_63 = asfloat(x_13[0].x);
+  thirty_two_1 = round((x_63 / 8.0f));
+  const float x_67 = gl_FragCoord.x;
+  param = x_67;
+  param_1 = thirty_two_1;
+  const float x_69 = compute_value_f1_f1_(param, param_1);
+  c.x = x_69;
+  const float x_72 = gl_FragCoord.y;
+  param_2 = x_72;
+  param_3 = thirty_two_1;
+  const float x_74 = compute_value_f1_f1_(param_2, param_3);
+  c.y = x_74;
+  const float x_77 = c.x;
+  if (true) {
+    x_61 = c;
+  } else {
+    const float3 x_82 = c;
+    const float x_84 = asfloat(x_19[0].x);
+    x_61 = (x_82 * x_84);
+  }
+  const float x_87 = x_61.y;
+  c.z = (x_77 + x_87);
+  i_1 = 0;
+  {
+    for(; (i_1 < 3); i_1 = (i_1 + 1)) {
+      const float x_99 = c[i_1];
+      if ((x_99 >= 1.0f)) {
+        const int x_103 = i_1;
+        const float x_106 = c[i_1];
+        const float x_109 = c[i_1];
+        set_float3(c, x_103, (x_106 * x_109));
+      }
+      j = 0.0f;
+      while (true) {
+        const float x_117 = asfloat(x_19[0].x);
+        const float x_119 = asfloat(x_19[0].y);
+        if ((x_117 > x_119)) {
+        } else {
+          break;
+        }
+        const float x_122 = j;
+        const float x_124 = asfloat(x_19[0].x);
+        if ((x_122 >= x_124)) {
+          break;
+        }
+        j = (j + 1.0f);
+      }
+    }
+  }
+  const float3 x_134 = normalize(abs(c));
+  x_GLF_color = float4(x_134.x, x_134.y, x_134.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-simple-loop/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-simple-loop/1.wgsl.expected.msl
new file mode 100755
index 0000000..2641e75
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-simple-loop/1.wgsl.expected.msl
@@ -0,0 +1,151 @@
+SKIP: FAILED
+
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct buf1 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float compute_value_f1_f1_(thread float* const limit, thread float* const thirty_two) {
+  float result = 0.0f;
+  int i = 0;
+  result = -0.5f;
+  i = 1;
+  while (true) {
+    int const x_144 = i;
+    if ((x_144 < 800)) {
+    } else {
+      break;
+    }
+    int const x_147 = i;
+    if (((x_147 % 32) == 0)) {
+      float const x_153 = result;
+      result = (x_153 + 0.400000006f);
+    } else {
+      int const x_155 = i;
+      float const x_157 = *(thirty_two);
+      if (((float(x_155) % rint(x_157)) <= 0.01f)) {
+        float const x_163 = result;
+        result = (x_163 + 100.0f);
+      }
+    }
+    int const x_165 = i;
+    float const x_167 = *(limit);
+    if ((float(x_165) >= x_167)) {
+      float const x_171 = result;
+      return x_171;
+    }
+    {
+      int const x_172 = i;
+      i = (x_172 + 1);
+    }
+  }
+  float const x_174 = result;
+  return x_174;
+}
+
+void main_1(constant buf0& x_13, constant buf1& x_19, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float3 c = 0.0f;
+  float thirty_two_1 = 0.0f;
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  float param_2 = 0.0f;
+  float param_3 = 0.0f;
+  float3 x_61 = 0.0f;
+  int i_1 = 0;
+  float j = 0.0f;
+  c = float3(7.0f, 8.0f, 9.0f);
+  float const x_63 = x_13.resolution.x;
+  thirty_two_1 = rint((x_63 / 8.0f));
+  float const x_67 = (*(tint_symbol_5)).x;
+  param = x_67;
+  float const x_68 = thirty_two_1;
+  param_1 = x_68;
+  float const x_69 = compute_value_f1_f1_(&(param), &(param_1));
+  c.x = x_69;
+  float const x_72 = (*(tint_symbol_5)).y;
+  param_2 = x_72;
+  float const x_73 = thirty_two_1;
+  param_3 = x_73;
+  float const x_74 = compute_value_f1_f1_(&(param_2), &(param_3));
+  c.y = x_74;
+  float const x_77 = c.x;
+  if (true) {
+    float3 const x_81 = c;
+    x_61 = x_81;
+  } else {
+    float3 const x_82 = c;
+    float const x_84 = x_19.injectionSwitch.x;
+    x_61 = (x_82 * x_84);
+  }
+  float const x_87 = x_61.y;
+  c.z = (x_77 + x_87);
+  i_1 = 0;
+  while (true) {
+    int const x_94 = i_1;
+    if ((x_94 < 3)) {
+    } else {
+      break;
+    }
+    int const x_97 = i_1;
+    float const x_99 = c[x_97];
+    if ((x_99 >= 1.0f)) {
+      int const x_103 = i_1;
+      int const x_104 = i_1;
+      float const x_106 = c[x_104];
+      int const x_107 = i_1;
+      float const x_109 = c[x_107];
+      c[x_103] = (x_106 * x_109);
+    }
+    j = 0.0f;
+    while (true) {
+      float const x_117 = x_19.injectionSwitch.x;
+      float const x_119 = x_19.injectionSwitch.y;
+      if ((x_117 > x_119)) {
+      } else {
+        break;
+      }
+      float const x_122 = j;
+      float const x_124 = x_19.injectionSwitch.x;
+      if ((x_122 >= x_124)) {
+        break;
+      }
+      float const x_128 = j;
+      j = (x_128 + 1.0f);
+    }
+    {
+      int const x_130 = i_1;
+      i_1 = (x_130 + 1);
+    }
+  }
+  float3 const x_132 = c;
+  float3 const x_134 = normalize(fabs(x_132));
+  *(tint_symbol_6) = float4(x_134.x, x_134.y, x_134.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_13 [[buffer(0)]], constant buf1& x_19 [[buffer(1)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_13, x_19, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
+T:\tmp\u7k8.0.metal:35:26: error: invalid operands to binary expression ('float' and 'float')
+      if (((float(x_155) % rint(x_157)) <= 0.01f)) {
+            ~~~~~~~~~~~~ ^ ~~~~~~~~~~~
+1 error generated.
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-simple-loop/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-simple-loop/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..304913e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-simple-loop/1.wgsl.expected.spvasm
@@ -0,0 +1,331 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 207
+; Schema: 0
+               OpCapability Shader
+         %59 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_13 "x_13"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "injectionSwitch"
+               OpName %x_19 "x_19"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %compute_value_f1_f1_ "compute_value_f1_f1_"
+               OpName %limit "limit"
+               OpName %thirty_two "thirty_two"
+               OpName %result "result"
+               OpName %i "i"
+               OpName %main_1 "main_1"
+               OpName %c "c"
+               OpName %thirty_two_1 "thirty_two_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %x_61 "x_61"
+               OpName %i_1 "i_1"
+               OpName %j "j"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_13 NonWritable
+               OpDecorate %x_13 DescriptorSet 0
+               OpDecorate %x_13 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_19 NonWritable
+               OpDecorate %x_19 DescriptorSet 0
+               OpDecorate %x_19 Binding 1
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_13 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_19 = OpVariable %_ptr_Uniform_buf1 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+%_ptr_Function_float = OpTypePointer Function %float
+         %18 = OpTypeFunction %float %_ptr_Function_float %_ptr_Function_float
+         %25 = OpConstantNull %float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpConstantNull %int
+ %float_n0_5 = OpConstant %float -0.5
+      %int_1 = OpConstant %int 1
+    %int_800 = OpConstant %int 800
+       %bool = OpTypeBool
+     %int_32 = OpConstant %int 32
+      %int_0 = OpConstant %int 0
+%float_0_400000006 = OpConstant %float 0.400000006
+%float_0_00999999978 = OpConstant %float 0.00999999978
+  %float_100 = OpConstant %float 100
+       %void = OpTypeVoid
+         %79 = OpTypeFunction %void
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %86 = OpConstantNull %v3float
+    %float_7 = OpConstant %float 7
+    %float_8 = OpConstant %float 8
+    %float_9 = OpConstant %float 9
+         %98 = OpConstantComposite %v3float %float_7 %float_8 %float_9
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Private_float = OpTypePointer Private %float
+     %uint_1 = OpConstant %uint 1
+       %true = OpConstantTrue %bool
+     %uint_2 = OpConstant %uint 2
+      %int_3 = OpConstant %int 3
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+   %main_out = OpTypeStruct %v4float
+        %194 = OpTypeFunction %void %main_out
+%compute_value_f1_f1_ = OpFunction %float None %18
+      %limit = OpFunctionParameter %_ptr_Function_float
+ %thirty_two = OpFunctionParameter %_ptr_Function_float
+         %23 = OpLabel
+     %result = OpVariable %_ptr_Function_float Function %25
+          %i = OpVariable %_ptr_Function_int Function %29
+               OpStore %result %float_n0_5
+               OpStore %i %int_1
+               OpBranch %32
+         %32 = OpLabel
+               OpLoopMerge %33 %34 None
+               OpBranch %35
+         %35 = OpLabel
+         %36 = OpLoad %int %i
+         %38 = OpSLessThan %bool %36 %int_800
+               OpSelectionMerge %40 None
+               OpBranchConditional %38 %41 %42
+         %41 = OpLabel
+               OpBranch %40
+         %42 = OpLabel
+               OpBranch %33
+         %40 = OpLabel
+         %43 = OpLoad %int %i
+         %45 = OpSMod %int %43 %int_32
+         %47 = OpIEqual %bool %45 %int_0
+               OpSelectionMerge %48 None
+               OpBranchConditional %47 %49 %50
+         %49 = OpLabel
+         %51 = OpLoad %float %result
+         %53 = OpFAdd %float %51 %float_0_400000006
+               OpStore %result %53
+               OpBranch %48
+         %50 = OpLabel
+         %54 = OpLoad %int %i
+         %56 = OpLoad %float %thirty_two
+         %57 = OpConvertSToF %float %54
+         %58 = OpExtInst %float %59 RoundEven %56
+         %60 = OpFMod %float %57 %58
+         %62 = OpFOrdLessThanEqual %bool %60 %float_0_00999999978
+               OpSelectionMerge %63 None
+               OpBranchConditional %62 %64 %63
+         %64 = OpLabel
+         %65 = OpLoad %float %result
+         %67 = OpFAdd %float %65 %float_100
+               OpStore %result %67
+               OpBranch %63
+         %63 = OpLabel
+               OpBranch %48
+         %48 = OpLabel
+         %68 = OpLoad %int %i
+         %70 = OpLoad %float %limit
+         %71 = OpConvertSToF %float %68
+         %72 = OpFOrdGreaterThanEqual %bool %71 %70
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %74 %73
+         %74 = OpLabel
+         %75 = OpLoad %float %result
+               OpReturnValue %75
+         %73 = OpLabel
+               OpBranch %34
+         %34 = OpLabel
+         %76 = OpLoad %int %i
+         %77 = OpIAdd %int %76 %int_1
+               OpStore %i %77
+               OpBranch %32
+         %33 = OpLabel
+         %78 = OpLoad %float %result
+               OpReturnValue %78
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %79
+         %82 = OpLabel
+          %c = OpVariable %_ptr_Function_v3float Function %86
+%thirty_two_1 = OpVariable %_ptr_Function_float Function %25
+      %param = OpVariable %_ptr_Function_float Function %25
+    %param_1 = OpVariable %_ptr_Function_float Function %25
+    %param_2 = OpVariable %_ptr_Function_float Function %25
+    %param_3 = OpVariable %_ptr_Function_float Function %25
+       %x_61 = OpVariable %_ptr_Function_v3float Function %86
+        %i_1 = OpVariable %_ptr_Function_int Function %29
+          %j = OpVariable %_ptr_Function_float Function %25
+               OpStore %c %98
+        %102 = OpAccessChain %_ptr_Uniform_float %x_13 %uint_0 %uint_0
+        %103 = OpLoad %float %102
+        %105 = OpFDiv %float %103 %float_8
+        %104 = OpExtInst %float %59 RoundEven %105
+               OpStore %thirty_two_1 %104
+        %107 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+        %108 = OpLoad %float %107
+               OpStore %param %108
+        %109 = OpLoad %float %thirty_two_1
+               OpStore %param_1 %109
+        %110 = OpFunctionCall %float %compute_value_f1_f1_ %param %param_1
+        %113 = OpAccessChain %_ptr_Function_float %c %uint_0
+               OpStore %113 %110
+        %115 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %116 = OpLoad %float %115
+               OpStore %param_2 %116
+        %117 = OpLoad %float %thirty_two_1
+               OpStore %param_3 %117
+        %118 = OpFunctionCall %float %compute_value_f1_f1_ %param_2 %param_3
+        %121 = OpAccessChain %_ptr_Function_float %c %uint_1
+               OpStore %121 %118
+        %122 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %123 = OpLoad %float %122
+               OpSelectionMerge %125 None
+               OpBranchConditional %true %126 %127
+        %126 = OpLabel
+        %128 = OpLoad %v3float %c
+               OpStore %x_61 %128
+               OpBranch %125
+        %127 = OpLabel
+        %129 = OpLoad %v3float %c
+        %130 = OpAccessChain %_ptr_Uniform_float %x_19 %uint_0 %uint_0
+        %131 = OpLoad %float %130
+        %132 = OpVectorTimesScalar %v3float %129 %131
+               OpStore %x_61 %132
+               OpBranch %125
+        %125 = OpLabel
+        %133 = OpAccessChain %_ptr_Function_float %x_61 %uint_1
+        %134 = OpLoad %float %133
+        %136 = OpAccessChain %_ptr_Function_float %c %uint_2
+        %137 = OpFAdd %float %123 %134
+               OpStore %136 %137
+               OpStore %i_1 %int_0
+               OpBranch %138
+        %138 = OpLabel
+               OpLoopMerge %139 %140 None
+               OpBranch %141
+        %141 = OpLabel
+        %142 = OpLoad %int %i_1
+        %144 = OpSLessThan %bool %142 %int_3
+               OpSelectionMerge %145 None
+               OpBranchConditional %144 %146 %147
+        %146 = OpLabel
+               OpBranch %145
+        %147 = OpLabel
+               OpBranch %139
+        %145 = OpLabel
+        %148 = OpLoad %int %i_1
+        %149 = OpAccessChain %_ptr_Function_float %c %148
+        %150 = OpLoad %float %149
+        %152 = OpFOrdGreaterThanEqual %bool %150 %float_1
+               OpSelectionMerge %153 None
+               OpBranchConditional %152 %154 %153
+        %154 = OpLabel
+        %155 = OpLoad %int %i_1
+        %156 = OpLoad %int %i_1
+        %157 = OpAccessChain %_ptr_Function_float %c %156
+        %158 = OpLoad %float %157
+        %159 = OpLoad %int %i_1
+        %160 = OpAccessChain %_ptr_Function_float %c %159
+        %161 = OpLoad %float %160
+        %162 = OpAccessChain %_ptr_Function_float %c %155
+        %163 = OpFMul %float %158 %161
+               OpStore %162 %163
+               OpBranch %153
+        %153 = OpLabel
+               OpStore %j %float_0
+               OpBranch %165
+        %165 = OpLabel
+               OpLoopMerge %166 %167 None
+               OpBranch %168
+        %168 = OpLabel
+        %169 = OpAccessChain %_ptr_Uniform_float %x_19 %uint_0 %uint_0
+        %170 = OpLoad %float %169
+        %171 = OpAccessChain %_ptr_Uniform_float %x_19 %uint_0 %uint_1
+        %172 = OpLoad %float %171
+        %173 = OpFOrdGreaterThan %bool %170 %172
+               OpSelectionMerge %174 None
+               OpBranchConditional %173 %175 %176
+        %175 = OpLabel
+               OpBranch %174
+        %176 = OpLabel
+               OpBranch %166
+        %174 = OpLabel
+        %177 = OpLoad %float %j
+        %178 = OpAccessChain %_ptr_Uniform_float %x_19 %uint_0 %uint_0
+        %179 = OpLoad %float %178
+        %180 = OpFOrdGreaterThanEqual %bool %177 %179
+               OpSelectionMerge %181 None
+               OpBranchConditional %180 %182 %181
+        %182 = OpLabel
+               OpBranch %166
+        %181 = OpLabel
+        %183 = OpLoad %float %j
+        %184 = OpFAdd %float %183 %float_1
+               OpStore %j %184
+               OpBranch %167
+        %167 = OpLabel
+               OpBranch %165
+        %166 = OpLabel
+               OpBranch %140
+        %140 = OpLabel
+        %185 = OpLoad %int %i_1
+        %186 = OpIAdd %int %185 %int_1
+               OpStore %i_1 %186
+               OpBranch %138
+        %139 = OpLabel
+        %187 = OpLoad %v3float %c
+        %189 = OpExtInst %v3float %59 FAbs %187
+        %188 = OpExtInst %v3float %59 Normalize %189
+        %190 = OpCompositeExtract %float %188 0
+        %191 = OpCompositeExtract %float %188 1
+        %192 = OpCompositeExtract %float %188 2
+        %193 = OpCompositeConstruct %v4float %190 %191 %192 %float_1
+               OpStore %x_GLF_color %193
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %194
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %198 = OpLabel
+        %199 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %199
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %79
+        %201 = OpLabel
+        %202 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %202
+        %203 = OpFunctionCall %void %main_1
+        %205 = OpLoad %v4float %x_GLF_color
+        %206 = OpCompositeConstruct %main_out %205
+        %204 = OpFunctionCall %void %tint_symbol_3 %206
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-simple-loop/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-simple-loop/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..97ffaf9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-true-conditional-simple-loop/1.wgsl.expected.wgsl
@@ -0,0 +1,149 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+[[block]]
+struct buf1 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_13 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_19 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn compute_value_f1_f1_(limit : ptr<function, f32>, thirty_two : ptr<function, f32>) -> f32 {
+  var result : f32;
+  var i : i32;
+  result = -0.5;
+  i = 1;
+  loop {
+    let x_144 : i32 = i;
+    if ((x_144 < 800)) {
+    } else {
+      break;
+    }
+    let x_147 : i32 = i;
+    if (((x_147 % 32) == 0)) {
+      let x_153 : f32 = result;
+      result = (x_153 + 0.400000006);
+    } else {
+      let x_155 : i32 = i;
+      let x_157 : f32 = *(thirty_two);
+      if (((f32(x_155) % round(x_157)) <= 0.01)) {
+        let x_163 : f32 = result;
+        result = (x_163 + 100.0);
+      }
+    }
+    let x_165 : i32 = i;
+    let x_167 : f32 = *(limit);
+    if ((f32(x_165) >= x_167)) {
+      let x_171 : f32 = result;
+      return x_171;
+    }
+
+    continuing {
+      let x_172 : i32 = i;
+      i = (x_172 + 1);
+    }
+  }
+  let x_174 : f32 = result;
+  return x_174;
+}
+
+fn main_1() {
+  var c : vec3<f32>;
+  var thirty_two_1 : f32;
+  var param : f32;
+  var param_1 : f32;
+  var param_2 : f32;
+  var param_3 : f32;
+  var x_61 : vec3<f32>;
+  var i_1 : i32;
+  var j : f32;
+  c = vec3<f32>(7.0, 8.0, 9.0);
+  let x_63 : f32 = x_13.resolution.x;
+  thirty_two_1 = round((x_63 / 8.0));
+  let x_67 : f32 = gl_FragCoord.x;
+  param = x_67;
+  let x_68 : f32 = thirty_two_1;
+  param_1 = x_68;
+  let x_69 : f32 = compute_value_f1_f1_(&(param), &(param_1));
+  c.x = x_69;
+  let x_72 : f32 = gl_FragCoord.y;
+  param_2 = x_72;
+  let x_73 : f32 = thirty_two_1;
+  param_3 = x_73;
+  let x_74 : f32 = compute_value_f1_f1_(&(param_2), &(param_3));
+  c.y = x_74;
+  let x_77 : f32 = c.x;
+  if (true) {
+    let x_81 : vec3<f32> = c;
+    x_61 = x_81;
+  } else {
+    let x_82 : vec3<f32> = c;
+    let x_84 : f32 = x_19.injectionSwitch.x;
+    x_61 = (x_82 * x_84);
+  }
+  let x_87 : f32 = x_61.y;
+  c.z = (x_77 + x_87);
+  i_1 = 0;
+  loop {
+    let x_94 : i32 = i_1;
+    if ((x_94 < 3)) {
+    } else {
+      break;
+    }
+    let x_97 : i32 = i_1;
+    let x_99 : f32 = c[x_97];
+    if ((x_99 >= 1.0)) {
+      let x_103 : i32 = i_1;
+      let x_104 : i32 = i_1;
+      let x_106 : f32 = c[x_104];
+      let x_107 : i32 = i_1;
+      let x_109 : f32 = c[x_107];
+      c[x_103] = (x_106 * x_109);
+    }
+    j = 0.0;
+    loop {
+      let x_117 : f32 = x_19.injectionSwitch.x;
+      let x_119 : f32 = x_19.injectionSwitch.y;
+      if ((x_117 > x_119)) {
+      } else {
+        break;
+      }
+      let x_122 : f32 = j;
+      let x_124 : f32 = x_19.injectionSwitch.x;
+      if ((x_122 >= x_124)) {
+        break;
+      }
+      let x_128 : f32 = j;
+      j = (x_128 + 1.0);
+    }
+
+    continuing {
+      let x_130 : i32 = i_1;
+      i_1 = (x_130 + 1);
+    }
+  }
+  let x_132 : vec3<f32> = c;
+  let x_134 : vec3<f32> = normalize(abs(x_132));
+  x_GLF_color = vec4<f32>(x_134.x, x_134.y, x_134.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.spvasm
new file mode 100644
index 0000000..5b2b65b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.spvasm
@@ -0,0 +1,245 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %compute_value_f1_f1_ "compute_value(f1;f1;"
+               OpName %limit "limit"
+               OpName %thirty_two "thirty_two"
+               OpName %result "result"
+               OpName %i "i"
+               OpName %c "c"
+               OpName %thirty_two_0 "thirty_two"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %param_1 "param"
+               OpName %param_2 "param"
+               OpName %i_0 "i"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+         %23 = OpTypeFunction %float %_ptr_Function_float %_ptr_Function_float
+ %float_n0_5 = OpConstant %float -0.5
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+    %int_800 = OpConstant %int 800
+       %bool = OpTypeBool
+     %int_32 = OpConstant %int 32
+      %int_0 = OpConstant %int 0
+%float_0_400000006 = OpConstant %float 0.400000006
+%float_0_00999999978 = OpConstant %float 0.00999999978
+  %float_100 = OpConstant %float 100
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+    %float_7 = OpConstant %float 7
+    %float_8 = OpConstant %float 8
+    %float_9 = OpConstant %float 9
+         %40 = OpConstantComposite %v3float %float_7 %float_8 %float_9
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+%_ptr_Input_float = OpTypePointer Input %float
+     %uint_1 = OpConstant %uint 1
+%mat3v3float = OpTypeMatrix %v3float 3
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %53 = OpConstantComposite %v3float %float_1 %float_0 %float_0
+         %54 = OpConstantComposite %v3float %float_0 %float_1 %float_0
+         %55 = OpConstantComposite %v3float %float_0 %float_0 %float_1
+         %56 = OpConstantComposite %mat3v3float %53 %54 %55
+%mat4v2float = OpTypeMatrix %v2float 4
+     %uint_2 = OpConstant %uint 2
+      %int_3 = OpConstant %int 3
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %20
+         %61 = OpLabel
+          %c = OpVariable %_ptr_Function_v3float Function
+%thirty_two_0 = OpVariable %_ptr_Function_float Function
+      %param = OpVariable %_ptr_Function_float Function
+    %param_0 = OpVariable %_ptr_Function_float Function
+    %param_1 = OpVariable %_ptr_Function_float Function
+    %param_2 = OpVariable %_ptr_Function_float Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+               OpStore %c %40
+         %62 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %63 = OpLoad %float %62
+         %64 = OpFDiv %float %63 %float_8
+         %65 = OpExtInst %float %1 Round %64
+               OpStore %thirty_two_0 %65
+         %66 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %67 = OpLoad %float %66
+               OpStore %param %67
+         %68 = OpLoad %float %thirty_two_0
+               OpStore %param_0 %68
+         %69 = OpFunctionCall %float %compute_value_f1_f1_ %param %param_0
+         %70 = OpAccessChain %_ptr_Function_float %c %uint_0
+               OpStore %70 %69
+         %71 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %72 = OpLoad %float %71
+               OpStore %param_1 %72
+         %73 = OpLoad %float %thirty_two_0
+               OpStore %param_2 %73
+         %74 = OpFunctionCall %float %compute_value_f1_f1_ %param_1 %param_2
+         %75 = OpAccessChain %_ptr_Function_float %c %uint_1
+               OpStore %75 %74
+         %76 = OpLoad %v3float %c
+         %77 = OpVectorTimesMatrix %v3float %76 %56
+         %78 = OpCompositeExtract %float %77 0
+         %79 = OpLoad %v3float %c
+         %80 = OpCompositeExtract %float %79 0
+         %81 = OpCompositeExtract %float %79 1
+         %82 = OpCompositeExtract %float %79 2
+         %83 = OpCompositeConstruct %v2float %80 %81
+         %84 = OpCompositeConstruct %v2float %82 %float_1
+         %85 = OpCompositeConstruct %v2float %float_1 %float_0
+         %86 = OpCompositeConstruct %v2float %float_1 %float_0
+         %87 = OpCompositeConstruct %mat4v2float %83 %84 %85 %86
+         %88 = OpCompositeExtract %float %87 0 0
+         %89 = OpCompositeExtract %float %87 0 1
+         %90 = OpCompositeExtract %float %87 1 0
+         %91 = OpCompositeConstruct %v3float %88 %89 %90
+         %92 = OpCompositeExtract %float %91 1
+         %93 = OpFAdd %float %78 %92
+         %94 = OpAccessChain %_ptr_Function_float %c %uint_2
+               OpStore %94 %93
+               OpStore %i_0 %int_0
+               OpBranch %95
+         %95 = OpLabel
+               OpLoopMerge %96 %97 None
+               OpBranch %98
+         %98 = OpLabel
+         %99 = OpLoad %int %i_0
+        %100 = OpSLessThan %bool %99 %int_3
+               OpBranchConditional %100 %101 %96
+        %101 = OpLabel
+        %102 = OpLoad %int %i_0
+        %103 = OpAccessChain %_ptr_Function_float %c %102
+        %104 = OpLoad %float %103
+        %105 = OpFOrdGreaterThanEqual %bool %104 %float_1
+               OpSelectionMerge %106 None
+               OpBranchConditional %105 %107 %106
+        %107 = OpLabel
+        %108 = OpLoad %int %i_0
+        %109 = OpLoad %int %i_0
+        %110 = OpAccessChain %_ptr_Function_float %c %109
+        %111 = OpLoad %float %110
+        %112 = OpLoad %int %i_0
+        %113 = OpAccessChain %_ptr_Function_float %c %112
+        %114 = OpLoad %float %113
+        %115 = OpFMul %float %111 %114
+        %116 = OpAccessChain %_ptr_Function_float %c %108
+               OpStore %116 %115
+        %117 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %118 = OpLoad %float %117
+        %119 = OpFOrdLessThan %bool %118 %float_0
+               OpSelectionMerge %120 None
+               OpBranchConditional %119 %121 %120
+        %121 = OpLabel
+               OpBranch %96
+        %120 = OpLabel
+               OpBranch %106
+        %106 = OpLabel
+               OpBranch %97
+         %97 = OpLabel
+        %122 = OpLoad %int %i_0
+        %123 = OpIAdd %int %122 %int_1
+               OpStore %i_0 %123
+               OpBranch %95
+         %96 = OpLabel
+        %124 = OpLoad %v3float %c
+        %125 = OpExtInst %v3float %1 FAbs %124
+        %126 = OpExtInst %v3float %1 Normalize %125
+        %127 = OpCompositeExtract %float %126 0
+        %128 = OpCompositeExtract %float %126 1
+        %129 = OpCompositeExtract %float %126 2
+        %130 = OpCompositeConstruct %v4float %127 %128 %129 %float_1
+               OpStore %_GLF_color %130
+               OpReturn
+               OpFunctionEnd
+%compute_value_f1_f1_ = OpFunction %float None %23
+      %limit = OpFunctionParameter %_ptr_Function_float
+ %thirty_two = OpFunctionParameter %_ptr_Function_float
+        %131 = OpLabel
+     %result = OpVariable %_ptr_Function_float Function
+          %i = OpVariable %_ptr_Function_int Function
+               OpStore %result %float_n0_5
+               OpStore %i %int_1
+               OpBranch %132
+        %132 = OpLabel
+               OpLoopMerge %133 %134 None
+               OpBranch %135
+        %135 = OpLabel
+        %136 = OpLoad %int %i
+        %137 = OpSLessThan %bool %136 %int_800
+               OpBranchConditional %137 %138 %133
+        %138 = OpLabel
+        %139 = OpLoad %int %i
+        %140 = OpSMod %int %139 %int_32
+        %141 = OpIEqual %bool %140 %int_0
+               OpSelectionMerge %142 None
+               OpBranchConditional %141 %143 %144
+        %143 = OpLabel
+        %145 = OpLoad %float %result
+        %146 = OpFAdd %float %145 %float_0_400000006
+               OpStore %result %146
+               OpBranch %142
+        %144 = OpLabel
+        %147 = OpLoad %int %i
+        %148 = OpConvertSToF %float %147
+        %149 = OpLoad %float %thirty_two
+        %150 = OpExtInst %float %1 Round %149
+        %151 = OpFMod %float %148 %150
+        %152 = OpFOrdLessThanEqual %bool %151 %float_0_00999999978
+               OpSelectionMerge %153 None
+               OpBranchConditional %152 %154 %153
+        %154 = OpLabel
+        %155 = OpLoad %float %result
+        %156 = OpFAdd %float %155 %float_100
+               OpStore %result %156
+               OpBranch %153
+        %153 = OpLabel
+               OpBranch %142
+        %142 = OpLabel
+        %157 = OpLoad %int %i
+        %158 = OpConvertSToF %float %157
+        %159 = OpLoad %float %limit
+        %160 = OpFOrdGreaterThanEqual %bool %158 %159
+               OpSelectionMerge %161 None
+               OpBranchConditional %160 %162 %161
+        %162 = OpLabel
+        %163 = OpLoad %float %result
+               OpReturnValue %163
+        %161 = OpLabel
+               OpBranch %134
+        %134 = OpLabel
+        %164 = OpLoad %int %i
+        %165 = OpIAdd %int %164 %int_1
+               OpStore %i %165
+               OpBranch %132
+        %133 = OpLabel
+        %166 = OpLoad %float %result
+               OpReturnValue %166
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..20808b2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.spvasm.expected.hlsl
@@ -0,0 +1,100 @@
+void set_float3(inout float3 vec, int idx, float val) {
+  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
+}
+
+cbuffer cbuffer_x_13 : register(b0, space0) {
+  uint4 x_13[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float compute_value_f1_f1_(inout float limit, inout float thirty_two) {
+  float result = 0.0f;
+  int i = 0;
+  result = -0.5f;
+  i = 1;
+  {
+    for(; (i < 800); i = (i + 1)) {
+      if (((i % 32) == 0)) {
+        result = (result + 0.400000006f);
+      } else {
+        const int x_147 = i;
+        const float x_149 = thirty_two;
+        if (((float(x_147) % round(x_149)) <= 0.01f)) {
+          result = (result + 100.0f);
+        }
+      }
+      const int x_157 = i;
+      const float x_159 = limit;
+      if ((float(x_157) >= x_159)) {
+        return result;
+      }
+    }
+  }
+  return result;
+}
+
+void main_1() {
+  float3 c = float3(0.0f, 0.0f, 0.0f);
+  float thirty_two_1 = 0.0f;
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  float param_2 = 0.0f;
+  float param_3 = 0.0f;
+  int i_1 = 0;
+  c = float3(7.0f, 8.0f, 9.0f);
+  const float x_63 = asfloat(x_13[0].x);
+  thirty_two_1 = round((x_63 / 8.0f));
+  const float x_67 = gl_FragCoord.x;
+  param = x_67;
+  param_1 = thirty_two_1;
+  const float x_69 = compute_value_f1_f1_(param, param_1);
+  c.x = x_69;
+  const float x_72 = gl_FragCoord.y;
+  param_2 = x_72;
+  param_3 = thirty_two_1;
+  const float x_74 = compute_value_f1_f1_(param_2, param_3);
+  c.y = x_74;
+  const float3 x_76 = c;
+  const float3 x_79 = c;
+  const float4x2 x_87 = float4x2(float2(x_79.x, x_79.y), float2(x_79.z, 1.0f), float2(1.0f, 0.0f), float2(1.0f, 0.0f));
+  c.z = (mul(float3x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f)), x_76).x + float3(x_87[0u].x, x_87[0u].y, x_87[1u].x).y);
+  i_1 = 0;
+  {
+    for(; (i_1 < 3); i_1 = (i_1 + 1)) {
+      const float x_104 = c[i_1];
+      if ((x_104 >= 1.0f)) {
+        const int x_108 = i_1;
+        const float x_111 = c[i_1];
+        const float x_114 = c[i_1];
+        set_float3(c, x_108, (x_111 * x_114));
+        const float x_118 = gl_FragCoord.y;
+        if ((x_118 < 0.0f)) {
+          break;
+        }
+      }
+    }
+  }
+  const float3 x_126 = normalize(abs(c));
+  x_GLF_color = float4(x_126.x, x_126.y, x_126.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.spvasm.expected.msl
new file mode 100755
index 0000000..223b0b5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.spvasm.expected.msl
@@ -0,0 +1,127 @@
+SKIP: FAILED
+
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float compute_value_f1_f1_(thread float* const limit, thread float* const thirty_two) {
+  float result = 0.0f;
+  int i = 0;
+  result = -0.5f;
+  i = 1;
+  while (true) {
+    int const x_136 = i;
+    if ((x_136 < 800)) {
+    } else {
+      break;
+    }
+    int const x_139 = i;
+    if (((x_139 % 32) == 0)) {
+      float const x_145 = result;
+      result = (x_145 + 0.400000006f);
+    } else {
+      int const x_147 = i;
+      float const x_149 = *(thirty_two);
+      if (((float(x_147) % rint(x_149)) <= 0.01f)) {
+        float const x_155 = result;
+        result = (x_155 + 100.0f);
+      }
+    }
+    int const x_157 = i;
+    float const x_159 = *(limit);
+    if ((float(x_157) >= x_159)) {
+      float const x_163 = result;
+      return x_163;
+    }
+    {
+      int const x_164 = i;
+      i = (x_164 + 1);
+    }
+  }
+  float const x_166 = result;
+  return x_166;
+}
+
+void main_1(constant buf0& x_13, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float3 c = 0.0f;
+  float thirty_two_1 = 0.0f;
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  float param_2 = 0.0f;
+  float param_3 = 0.0f;
+  int i_1 = 0;
+  c = float3(7.0f, 8.0f, 9.0f);
+  float const x_63 = x_13.resolution.x;
+  thirty_two_1 = rint((x_63 / 8.0f));
+  float const x_67 = (*(tint_symbol_5)).x;
+  param = x_67;
+  float const x_68 = thirty_two_1;
+  param_1 = x_68;
+  float const x_69 = compute_value_f1_f1_(&(param), &(param_1));
+  c.x = x_69;
+  float const x_72 = (*(tint_symbol_5)).y;
+  param_2 = x_72;
+  float const x_73 = thirty_two_1;
+  param_3 = x_73;
+  float const x_74 = compute_value_f1_f1_(&(param_2), &(param_3));
+  c.y = x_74;
+  float3 const x_76 = c;
+  float3 const x_79 = c;
+  float4x2 const x_87 = float4x2(float2(x_79.x, x_79.y), float2(x_79.z, 1.0f), float2(1.0f, 0.0f), float2(1.0f, 0.0f));
+  c.z = (((x_76 * float3x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f)))).x + float3(x_87[0u].x, x_87[0u].y, x_87[1u].x).y);
+  i_1 = 0;
+  while (true) {
+    int const x_99 = i_1;
+    if ((x_99 < 3)) {
+    } else {
+      break;
+    }
+    int const x_102 = i_1;
+    float const x_104 = c[x_102];
+    if ((x_104 >= 1.0f)) {
+      int const x_108 = i_1;
+      int const x_109 = i_1;
+      float const x_111 = c[x_109];
+      int const x_112 = i_1;
+      float const x_114 = c[x_112];
+      c[x_108] = (x_111 * x_114);
+      float const x_118 = (*(tint_symbol_5)).y;
+      if ((x_118 < 0.0f)) {
+        break;
+      }
+    }
+    {
+      int const x_122 = i_1;
+      i_1 = (x_122 + 1);
+    }
+  }
+  float3 const x_124 = c;
+  float3 const x_126 = normalize(fabs(x_124));
+  *(tint_symbol_6) = float4(x_126.x, x_126.y, x_126.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_13 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_13, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
+T:\tmp\uajw.0.metal:32:26: error: invalid operands to binary expression ('float' and 'float')
+      if (((float(x_147) % rint(x_149)) <= 0.01f)) {
+            ~~~~~~~~~~~~ ^ ~~~~~~~~~~~
+1 error generated.
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..8feef9e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.spvasm.expected.spvasm
@@ -0,0 +1,296 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 199
+; Schema: 0
+               OpCapability Shader
+         %56 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_13 "x_13"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %compute_value_f1_f1_ "compute_value_f1_f1_"
+               OpName %limit "limit"
+               OpName %thirty_two "thirty_two"
+               OpName %result "result"
+               OpName %i "i"
+               OpName %main_1 "main_1"
+               OpName %c "c"
+               OpName %thirty_two_1 "thirty_two_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %i_1 "i_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_13 NonWritable
+               OpDecorate %x_13 DescriptorSet 0
+               OpDecorate %x_13 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_13 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+%_ptr_Function_float = OpTypePointer Function %float
+         %15 = OpTypeFunction %float %_ptr_Function_float %_ptr_Function_float
+         %22 = OpConstantNull %float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %26 = OpConstantNull %int
+ %float_n0_5 = OpConstant %float -0.5
+      %int_1 = OpConstant %int 1
+    %int_800 = OpConstant %int 800
+       %bool = OpTypeBool
+     %int_32 = OpConstant %int 32
+      %int_0 = OpConstant %int 0
+%float_0_400000006 = OpConstant %float 0.400000006
+%float_0_00999999978 = OpConstant %float 0.00999999978
+  %float_100 = OpConstant %float 100
+       %void = OpTypeVoid
+         %76 = OpTypeFunction %void
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %83 = OpConstantNull %v3float
+    %float_7 = OpConstant %float 7
+    %float_8 = OpConstant %float 8
+    %float_9 = OpConstant %float 9
+         %93 = OpConstantComposite %v3float %float_7 %float_8 %float_9
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Private_float = OpTypePointer Private %float
+     %uint_1 = OpConstant %uint 1
+%mat4v2float = OpTypeMatrix %v2float 4
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+        %127 = OpConstantComposite %v2float %float_1 %float_0
+     %uint_2 = OpConstant %uint 2
+%mat3v3float = OpTypeMatrix %v3float 3
+        %132 = OpConstantComposite %v3float %float_1 %float_0 %float_0
+        %133 = OpConstantComposite %v3float %float_0 %float_1 %float_0
+        %134 = OpConstantComposite %v3float %float_0 %float_0 %float_1
+        %135 = OpConstantComposite %mat3v3float %132 %133 %134
+      %int_3 = OpConstant %int 3
+   %main_out = OpTypeStruct %v4float
+        %186 = OpTypeFunction %void %main_out
+%compute_value_f1_f1_ = OpFunction %float None %15
+      %limit = OpFunctionParameter %_ptr_Function_float
+ %thirty_two = OpFunctionParameter %_ptr_Function_float
+         %20 = OpLabel
+     %result = OpVariable %_ptr_Function_float Function %22
+          %i = OpVariable %_ptr_Function_int Function %26
+               OpStore %result %float_n0_5
+               OpStore %i %int_1
+               OpBranch %29
+         %29 = OpLabel
+               OpLoopMerge %30 %31 None
+               OpBranch %32
+         %32 = OpLabel
+         %33 = OpLoad %int %i
+         %35 = OpSLessThan %bool %33 %int_800
+               OpSelectionMerge %37 None
+               OpBranchConditional %35 %38 %39
+         %38 = OpLabel
+               OpBranch %37
+         %39 = OpLabel
+               OpBranch %30
+         %37 = OpLabel
+         %40 = OpLoad %int %i
+         %42 = OpSMod %int %40 %int_32
+         %44 = OpIEqual %bool %42 %int_0
+               OpSelectionMerge %45 None
+               OpBranchConditional %44 %46 %47
+         %46 = OpLabel
+         %48 = OpLoad %float %result
+         %50 = OpFAdd %float %48 %float_0_400000006
+               OpStore %result %50
+               OpBranch %45
+         %47 = OpLabel
+         %51 = OpLoad %int %i
+         %53 = OpLoad %float %thirty_two
+         %54 = OpConvertSToF %float %51
+         %55 = OpExtInst %float %56 RoundEven %53
+         %57 = OpFMod %float %54 %55
+         %59 = OpFOrdLessThanEqual %bool %57 %float_0_00999999978
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %60
+         %61 = OpLabel
+         %62 = OpLoad %float %result
+         %64 = OpFAdd %float %62 %float_100
+               OpStore %result %64
+               OpBranch %60
+         %60 = OpLabel
+               OpBranch %45
+         %45 = OpLabel
+         %65 = OpLoad %int %i
+         %67 = OpLoad %float %limit
+         %68 = OpConvertSToF %float %65
+         %69 = OpFOrdGreaterThanEqual %bool %68 %67
+               OpSelectionMerge %70 None
+               OpBranchConditional %69 %71 %70
+         %71 = OpLabel
+         %72 = OpLoad %float %result
+               OpReturnValue %72
+         %70 = OpLabel
+               OpBranch %31
+         %31 = OpLabel
+         %73 = OpLoad %int %i
+         %74 = OpIAdd %int %73 %int_1
+               OpStore %i %74
+               OpBranch %29
+         %30 = OpLabel
+         %75 = OpLoad %float %result
+               OpReturnValue %75
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %76
+         %79 = OpLabel
+          %c = OpVariable %_ptr_Function_v3float Function %83
+%thirty_two_1 = OpVariable %_ptr_Function_float Function %22
+      %param = OpVariable %_ptr_Function_float Function %22
+    %param_1 = OpVariable %_ptr_Function_float Function %22
+    %param_2 = OpVariable %_ptr_Function_float Function %22
+    %param_3 = OpVariable %_ptr_Function_float Function %22
+        %i_1 = OpVariable %_ptr_Function_int Function %26
+               OpStore %c %93
+         %97 = OpAccessChain %_ptr_Uniform_float %x_13 %uint_0 %uint_0
+         %98 = OpLoad %float %97
+        %100 = OpFDiv %float %98 %float_8
+         %99 = OpExtInst %float %56 RoundEven %100
+               OpStore %thirty_two_1 %99
+        %102 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+        %103 = OpLoad %float %102
+               OpStore %param %103
+        %104 = OpLoad %float %thirty_two_1
+               OpStore %param_1 %104
+        %105 = OpFunctionCall %float %compute_value_f1_f1_ %param %param_1
+        %108 = OpAccessChain %_ptr_Function_float %c %uint_0
+               OpStore %108 %105
+        %110 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %111 = OpLoad %float %110
+               OpStore %param_2 %111
+        %112 = OpLoad %float %thirty_two_1
+               OpStore %param_3 %112
+        %113 = OpFunctionCall %float %compute_value_f1_f1_ %param_2 %param_3
+        %116 = OpAccessChain %_ptr_Function_float %c %uint_1
+               OpStore %116 %113
+        %117 = OpLoad %v3float %c
+        %118 = OpLoad %v3float %c
+        %120 = OpCompositeExtract %float %118 0
+        %121 = OpCompositeExtract %float %118 1
+        %122 = OpCompositeConstruct %v2float %120 %121
+        %123 = OpCompositeExtract %float %118 2
+        %125 = OpCompositeConstruct %v2float %123 %float_1
+        %128 = OpCompositeConstruct %mat4v2float %122 %125 %127 %127
+        %130 = OpAccessChain %_ptr_Function_float %c %uint_2
+        %136 = OpVectorTimesMatrix %v3float %117 %135
+        %137 = OpCompositeExtract %float %136 0
+        %138 = OpCompositeExtract %v2float %128 0
+        %139 = OpCompositeExtract %float %138 0
+        %140 = OpCompositeExtract %v2float %128 0
+        %141 = OpCompositeExtract %float %140 1
+        %142 = OpCompositeExtract %v2float %128 1
+        %143 = OpCompositeExtract %float %142 0
+        %144 = OpCompositeConstruct %v3float %139 %141 %143
+        %145 = OpCompositeExtract %float %144 1
+        %146 = OpFAdd %float %137 %145
+               OpStore %130 %146
+               OpStore %i_1 %int_0
+               OpBranch %147
+        %147 = OpLabel
+               OpLoopMerge %148 %149 None
+               OpBranch %150
+        %150 = OpLabel
+        %151 = OpLoad %int %i_1
+        %153 = OpSLessThan %bool %151 %int_3
+               OpSelectionMerge %154 None
+               OpBranchConditional %153 %155 %156
+        %155 = OpLabel
+               OpBranch %154
+        %156 = OpLabel
+               OpBranch %148
+        %154 = OpLabel
+        %157 = OpLoad %int %i_1
+        %158 = OpAccessChain %_ptr_Function_float %c %157
+        %159 = OpLoad %float %158
+        %160 = OpFOrdGreaterThanEqual %bool %159 %float_1
+               OpSelectionMerge %161 None
+               OpBranchConditional %160 %162 %161
+        %162 = OpLabel
+        %163 = OpLoad %int %i_1
+        %164 = OpLoad %int %i_1
+        %165 = OpAccessChain %_ptr_Function_float %c %164
+        %166 = OpLoad %float %165
+        %167 = OpLoad %int %i_1
+        %168 = OpAccessChain %_ptr_Function_float %c %167
+        %169 = OpLoad %float %168
+        %170 = OpAccessChain %_ptr_Function_float %c %163
+        %171 = OpFMul %float %166 %169
+               OpStore %170 %171
+        %172 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %173 = OpLoad %float %172
+        %174 = OpFOrdLessThan %bool %173 %float_0
+               OpSelectionMerge %175 None
+               OpBranchConditional %174 %176 %175
+        %176 = OpLabel
+               OpBranch %148
+        %175 = OpLabel
+               OpBranch %161
+        %161 = OpLabel
+               OpBranch %149
+        %149 = OpLabel
+        %177 = OpLoad %int %i_1
+        %178 = OpIAdd %int %177 %int_1
+               OpStore %i_1 %178
+               OpBranch %147
+        %148 = OpLabel
+        %179 = OpLoad %v3float %c
+        %181 = OpExtInst %v3float %56 FAbs %179
+        %180 = OpExtInst %v3float %56 Normalize %181
+        %182 = OpCompositeExtract %float %180 0
+        %183 = OpCompositeExtract %float %180 1
+        %184 = OpCompositeExtract %float %180 2
+        %185 = OpCompositeConstruct %v4float %182 %183 %184 %float_1
+               OpStore %x_GLF_color %185
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %186
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %190 = OpLabel
+        %191 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %191
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %76
+        %193 = OpLabel
+        %194 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %194
+        %195 = OpFunctionCall %void %main_1
+        %197 = OpLoad %v4float %x_GLF_color
+        %198 = OpCompositeConstruct %main_out %197
+        %196 = OpFunctionCall %void %tint_symbol_3 %198
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..ee16548
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.spvasm.expected.wgsl
@@ -0,0 +1,121 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_13 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn compute_value_f1_f1_(limit : ptr<function, f32>, thirty_two : ptr<function, f32>) -> f32 {
+  var result : f32;
+  var i : i32;
+  result = -0.5;
+  i = 1;
+  loop {
+    let x_136 : i32 = i;
+    if ((x_136 < 800)) {
+    } else {
+      break;
+    }
+    let x_139 : i32 = i;
+    if (((x_139 % 32) == 0)) {
+      let x_145 : f32 = result;
+      result = (x_145 + 0.400000006);
+    } else {
+      let x_147 : i32 = i;
+      let x_149 : f32 = *(thirty_two);
+      if (((f32(x_147) % round(x_149)) <= 0.01)) {
+        let x_155 : f32 = result;
+        result = (x_155 + 100.0);
+      }
+    }
+    let x_157 : i32 = i;
+    let x_159 : f32 = *(limit);
+    if ((f32(x_157) >= x_159)) {
+      let x_163 : f32 = result;
+      return x_163;
+    }
+
+    continuing {
+      let x_164 : i32 = i;
+      i = (x_164 + 1);
+    }
+  }
+  let x_166 : f32 = result;
+  return x_166;
+}
+
+fn main_1() {
+  var c : vec3<f32>;
+  var thirty_two_1 : f32;
+  var param : f32;
+  var param_1 : f32;
+  var param_2 : f32;
+  var param_3 : f32;
+  var i_1 : i32;
+  c = vec3<f32>(7.0, 8.0, 9.0);
+  let x_63 : f32 = x_13.resolution.x;
+  thirty_two_1 = round((x_63 / 8.0));
+  let x_67 : f32 = gl_FragCoord.x;
+  param = x_67;
+  let x_68 : f32 = thirty_two_1;
+  param_1 = x_68;
+  let x_69 : f32 = compute_value_f1_f1_(&(param), &(param_1));
+  c.x = x_69;
+  let x_72 : f32 = gl_FragCoord.y;
+  param_2 = x_72;
+  let x_73 : f32 = thirty_two_1;
+  param_3 = x_73;
+  let x_74 : f32 = compute_value_f1_f1_(&(param_2), &(param_3));
+  c.y = x_74;
+  let x_76 : vec3<f32> = c;
+  let x_79 : vec3<f32> = c;
+  let x_87 : mat4x2<f32> = mat4x2<f32>(vec2<f32>(x_79.x, x_79.y), vec2<f32>(x_79.z, 1.0), vec2<f32>(1.0, 0.0), vec2<f32>(1.0, 0.0));
+  c.z = (((x_76 * mat3x3<f32>(vec3<f32>(1.0, 0.0, 0.0), vec3<f32>(0.0, 1.0, 0.0), vec3<f32>(0.0, 0.0, 1.0)))).x + vec3<f32>(x_87[0u].x, x_87[0u].y, x_87[1u].x).y);
+  i_1 = 0;
+  loop {
+    let x_99 : i32 = i_1;
+    if ((x_99 < 3)) {
+    } else {
+      break;
+    }
+    let x_102 : i32 = i_1;
+    let x_104 : f32 = c[x_102];
+    if ((x_104 >= 1.0)) {
+      let x_108 : i32 = i_1;
+      let x_109 : i32 = i_1;
+      let x_111 : f32 = c[x_109];
+      let x_112 : i32 = i_1;
+      let x_114 : f32 = c[x_112];
+      c[x_108] = (x_111 * x_114);
+      let x_118 : f32 = gl_FragCoord.y;
+      if ((x_118 < 0.0)) {
+        break;
+      }
+    }
+
+    continuing {
+      let x_122 : i32 = i_1;
+      i_1 = (x_122 + 1);
+    }
+  }
+  let x_124 : vec3<f32> = c;
+  let x_126 : vec3<f32> = normalize(abs(x_124));
+  x_GLF_color = vec4<f32>(x_126.x, x_126.y, x_126.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.wgsl
new file mode 100644
index 0000000..ee16548
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.wgsl
@@ -0,0 +1,121 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_13 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn compute_value_f1_f1_(limit : ptr<function, f32>, thirty_two : ptr<function, f32>) -> f32 {
+  var result : f32;
+  var i : i32;
+  result = -0.5;
+  i = 1;
+  loop {
+    let x_136 : i32 = i;
+    if ((x_136 < 800)) {
+    } else {
+      break;
+    }
+    let x_139 : i32 = i;
+    if (((x_139 % 32) == 0)) {
+      let x_145 : f32 = result;
+      result = (x_145 + 0.400000006);
+    } else {
+      let x_147 : i32 = i;
+      let x_149 : f32 = *(thirty_two);
+      if (((f32(x_147) % round(x_149)) <= 0.01)) {
+        let x_155 : f32 = result;
+        result = (x_155 + 100.0);
+      }
+    }
+    let x_157 : i32 = i;
+    let x_159 : f32 = *(limit);
+    if ((f32(x_157) >= x_159)) {
+      let x_163 : f32 = result;
+      return x_163;
+    }
+
+    continuing {
+      let x_164 : i32 = i;
+      i = (x_164 + 1);
+    }
+  }
+  let x_166 : f32 = result;
+  return x_166;
+}
+
+fn main_1() {
+  var c : vec3<f32>;
+  var thirty_two_1 : f32;
+  var param : f32;
+  var param_1 : f32;
+  var param_2 : f32;
+  var param_3 : f32;
+  var i_1 : i32;
+  c = vec3<f32>(7.0, 8.0, 9.0);
+  let x_63 : f32 = x_13.resolution.x;
+  thirty_two_1 = round((x_63 / 8.0));
+  let x_67 : f32 = gl_FragCoord.x;
+  param = x_67;
+  let x_68 : f32 = thirty_two_1;
+  param_1 = x_68;
+  let x_69 : f32 = compute_value_f1_f1_(&(param), &(param_1));
+  c.x = x_69;
+  let x_72 : f32 = gl_FragCoord.y;
+  param_2 = x_72;
+  let x_73 : f32 = thirty_two_1;
+  param_3 = x_73;
+  let x_74 : f32 = compute_value_f1_f1_(&(param_2), &(param_3));
+  c.y = x_74;
+  let x_76 : vec3<f32> = c;
+  let x_79 : vec3<f32> = c;
+  let x_87 : mat4x2<f32> = mat4x2<f32>(vec2<f32>(x_79.x, x_79.y), vec2<f32>(x_79.z, 1.0), vec2<f32>(1.0, 0.0), vec2<f32>(1.0, 0.0));
+  c.z = (((x_76 * mat3x3<f32>(vec3<f32>(1.0, 0.0, 0.0), vec3<f32>(0.0, 1.0, 0.0), vec3<f32>(0.0, 0.0, 1.0)))).x + vec3<f32>(x_87[0u].x, x_87[0u].y, x_87[1u].x).y);
+  i_1 = 0;
+  loop {
+    let x_99 : i32 = i_1;
+    if ((x_99 < 3)) {
+    } else {
+      break;
+    }
+    let x_102 : i32 = i_1;
+    let x_104 : f32 = c[x_102];
+    if ((x_104 >= 1.0)) {
+      let x_108 : i32 = i_1;
+      let x_109 : i32 = i_1;
+      let x_111 : f32 = c[x_109];
+      let x_112 : i32 = i_1;
+      let x_114 : f32 = c[x_112];
+      c[x_108] = (x_111 * x_114);
+      let x_118 : f32 = gl_FragCoord.y;
+      if ((x_118 < 0.0)) {
+        break;
+      }
+    }
+
+    continuing {
+      let x_122 : i32 = i_1;
+      i_1 = (x_122 + 1);
+    }
+  }
+  let x_124 : vec3<f32> = c;
+  let x_126 : vec3<f32> = normalize(abs(x_124));
+  x_GLF_color = vec4<f32>(x_126.x, x_126.y, x_126.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..20808b2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.wgsl.expected.hlsl
@@ -0,0 +1,100 @@
+void set_float3(inout float3 vec, int idx, float val) {
+  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
+}
+
+cbuffer cbuffer_x_13 : register(b0, space0) {
+  uint4 x_13[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float compute_value_f1_f1_(inout float limit, inout float thirty_two) {
+  float result = 0.0f;
+  int i = 0;
+  result = -0.5f;
+  i = 1;
+  {
+    for(; (i < 800); i = (i + 1)) {
+      if (((i % 32) == 0)) {
+        result = (result + 0.400000006f);
+      } else {
+        const int x_147 = i;
+        const float x_149 = thirty_two;
+        if (((float(x_147) % round(x_149)) <= 0.01f)) {
+          result = (result + 100.0f);
+        }
+      }
+      const int x_157 = i;
+      const float x_159 = limit;
+      if ((float(x_157) >= x_159)) {
+        return result;
+      }
+    }
+  }
+  return result;
+}
+
+void main_1() {
+  float3 c = float3(0.0f, 0.0f, 0.0f);
+  float thirty_two_1 = 0.0f;
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  float param_2 = 0.0f;
+  float param_3 = 0.0f;
+  int i_1 = 0;
+  c = float3(7.0f, 8.0f, 9.0f);
+  const float x_63 = asfloat(x_13[0].x);
+  thirty_two_1 = round((x_63 / 8.0f));
+  const float x_67 = gl_FragCoord.x;
+  param = x_67;
+  param_1 = thirty_two_1;
+  const float x_69 = compute_value_f1_f1_(param, param_1);
+  c.x = x_69;
+  const float x_72 = gl_FragCoord.y;
+  param_2 = x_72;
+  param_3 = thirty_two_1;
+  const float x_74 = compute_value_f1_f1_(param_2, param_3);
+  c.y = x_74;
+  const float3 x_76 = c;
+  const float3 x_79 = c;
+  const float4x2 x_87 = float4x2(float2(x_79.x, x_79.y), float2(x_79.z, 1.0f), float2(1.0f, 0.0f), float2(1.0f, 0.0f));
+  c.z = (mul(float3x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f)), x_76).x + float3(x_87[0u].x, x_87[0u].y, x_87[1u].x).y);
+  i_1 = 0;
+  {
+    for(; (i_1 < 3); i_1 = (i_1 + 1)) {
+      const float x_104 = c[i_1];
+      if ((x_104 >= 1.0f)) {
+        const int x_108 = i_1;
+        const float x_111 = c[i_1];
+        const float x_114 = c[i_1];
+        set_float3(c, x_108, (x_111 * x_114));
+        const float x_118 = gl_FragCoord.y;
+        if ((x_118 < 0.0f)) {
+          break;
+        }
+      }
+    }
+  }
+  const float3 x_126 = normalize(abs(c));
+  x_GLF_color = float4(x_126.x, x_126.y, x_126.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.wgsl.expected.msl
new file mode 100755
index 0000000..4db0bfd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.wgsl.expected.msl
@@ -0,0 +1,127 @@
+SKIP: FAILED
+
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float compute_value_f1_f1_(thread float* const limit, thread float* const thirty_two) {
+  float result = 0.0f;
+  int i = 0;
+  result = -0.5f;
+  i = 1;
+  while (true) {
+    int const x_136 = i;
+    if ((x_136 < 800)) {
+    } else {
+      break;
+    }
+    int const x_139 = i;
+    if (((x_139 % 32) == 0)) {
+      float const x_145 = result;
+      result = (x_145 + 0.400000006f);
+    } else {
+      int const x_147 = i;
+      float const x_149 = *(thirty_two);
+      if (((float(x_147) % rint(x_149)) <= 0.01f)) {
+        float const x_155 = result;
+        result = (x_155 + 100.0f);
+      }
+    }
+    int const x_157 = i;
+    float const x_159 = *(limit);
+    if ((float(x_157) >= x_159)) {
+      float const x_163 = result;
+      return x_163;
+    }
+    {
+      int const x_164 = i;
+      i = (x_164 + 1);
+    }
+  }
+  float const x_166 = result;
+  return x_166;
+}
+
+void main_1(constant buf0& x_13, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float3 c = 0.0f;
+  float thirty_two_1 = 0.0f;
+  float param = 0.0f;
+  float param_1 = 0.0f;
+  float param_2 = 0.0f;
+  float param_3 = 0.0f;
+  int i_1 = 0;
+  c = float3(7.0f, 8.0f, 9.0f);
+  float const x_63 = x_13.resolution.x;
+  thirty_two_1 = rint((x_63 / 8.0f));
+  float const x_67 = (*(tint_symbol_5)).x;
+  param = x_67;
+  float const x_68 = thirty_two_1;
+  param_1 = x_68;
+  float const x_69 = compute_value_f1_f1_(&(param), &(param_1));
+  c.x = x_69;
+  float const x_72 = (*(tint_symbol_5)).y;
+  param_2 = x_72;
+  float const x_73 = thirty_two_1;
+  param_3 = x_73;
+  float const x_74 = compute_value_f1_f1_(&(param_2), &(param_3));
+  c.y = x_74;
+  float3 const x_76 = c;
+  float3 const x_79 = c;
+  float4x2 const x_87 = float4x2(float2(x_79.x, x_79.y), float2(x_79.z, 1.0f), float2(1.0f, 0.0f), float2(1.0f, 0.0f));
+  c.z = (((x_76 * float3x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f)))).x + float3(x_87[0u].x, x_87[0u].y, x_87[1u].x).y);
+  i_1 = 0;
+  while (true) {
+    int const x_99 = i_1;
+    if ((x_99 < 3)) {
+    } else {
+      break;
+    }
+    int const x_102 = i_1;
+    float const x_104 = c[x_102];
+    if ((x_104 >= 1.0f)) {
+      int const x_108 = i_1;
+      int const x_109 = i_1;
+      float const x_111 = c[x_109];
+      int const x_112 = i_1;
+      float const x_114 = c[x_112];
+      c[x_108] = (x_111 * x_114);
+      float const x_118 = (*(tint_symbol_5)).y;
+      if ((x_118 < 0.0f)) {
+        break;
+      }
+    }
+    {
+      int const x_122 = i_1;
+      i_1 = (x_122 + 1);
+    }
+  }
+  float3 const x_124 = c;
+  float3 const x_126 = normalize(fabs(x_124));
+  *(tint_symbol_6) = float4(x_126.x, x_126.y, x_126.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_13 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_13, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
+T:\tmp\uet8.0.metal:32:26: error: invalid operands to binary expression ('float' and 'float')
+      if (((float(x_147) % rint(x_149)) <= 0.01f)) {
+            ~~~~~~~~~~~~ ^ ~~~~~~~~~~~
+1 error generated.
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..8feef9e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.wgsl.expected.spvasm
@@ -0,0 +1,296 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 199
+; Schema: 0
+               OpCapability Shader
+         %56 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_13 "x_13"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %compute_value_f1_f1_ "compute_value_f1_f1_"
+               OpName %limit "limit"
+               OpName %thirty_two "thirty_two"
+               OpName %result "result"
+               OpName %i "i"
+               OpName %main_1 "main_1"
+               OpName %c "c"
+               OpName %thirty_two_1 "thirty_two_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %i_1 "i_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_13 NonWritable
+               OpDecorate %x_13 DescriptorSet 0
+               OpDecorate %x_13 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_13 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+%_ptr_Function_float = OpTypePointer Function %float
+         %15 = OpTypeFunction %float %_ptr_Function_float %_ptr_Function_float
+         %22 = OpConstantNull %float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %26 = OpConstantNull %int
+ %float_n0_5 = OpConstant %float -0.5
+      %int_1 = OpConstant %int 1
+    %int_800 = OpConstant %int 800
+       %bool = OpTypeBool
+     %int_32 = OpConstant %int 32
+      %int_0 = OpConstant %int 0
+%float_0_400000006 = OpConstant %float 0.400000006
+%float_0_00999999978 = OpConstant %float 0.00999999978
+  %float_100 = OpConstant %float 100
+       %void = OpTypeVoid
+         %76 = OpTypeFunction %void
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %83 = OpConstantNull %v3float
+    %float_7 = OpConstant %float 7
+    %float_8 = OpConstant %float 8
+    %float_9 = OpConstant %float 9
+         %93 = OpConstantComposite %v3float %float_7 %float_8 %float_9
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Private_float = OpTypePointer Private %float
+     %uint_1 = OpConstant %uint 1
+%mat4v2float = OpTypeMatrix %v2float 4
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+        %127 = OpConstantComposite %v2float %float_1 %float_0
+     %uint_2 = OpConstant %uint 2
+%mat3v3float = OpTypeMatrix %v3float 3
+        %132 = OpConstantComposite %v3float %float_1 %float_0 %float_0
+        %133 = OpConstantComposite %v3float %float_0 %float_1 %float_0
+        %134 = OpConstantComposite %v3float %float_0 %float_0 %float_1
+        %135 = OpConstantComposite %mat3v3float %132 %133 %134
+      %int_3 = OpConstant %int 3
+   %main_out = OpTypeStruct %v4float
+        %186 = OpTypeFunction %void %main_out
+%compute_value_f1_f1_ = OpFunction %float None %15
+      %limit = OpFunctionParameter %_ptr_Function_float
+ %thirty_two = OpFunctionParameter %_ptr_Function_float
+         %20 = OpLabel
+     %result = OpVariable %_ptr_Function_float Function %22
+          %i = OpVariable %_ptr_Function_int Function %26
+               OpStore %result %float_n0_5
+               OpStore %i %int_1
+               OpBranch %29
+         %29 = OpLabel
+               OpLoopMerge %30 %31 None
+               OpBranch %32
+         %32 = OpLabel
+         %33 = OpLoad %int %i
+         %35 = OpSLessThan %bool %33 %int_800
+               OpSelectionMerge %37 None
+               OpBranchConditional %35 %38 %39
+         %38 = OpLabel
+               OpBranch %37
+         %39 = OpLabel
+               OpBranch %30
+         %37 = OpLabel
+         %40 = OpLoad %int %i
+         %42 = OpSMod %int %40 %int_32
+         %44 = OpIEqual %bool %42 %int_0
+               OpSelectionMerge %45 None
+               OpBranchConditional %44 %46 %47
+         %46 = OpLabel
+         %48 = OpLoad %float %result
+         %50 = OpFAdd %float %48 %float_0_400000006
+               OpStore %result %50
+               OpBranch %45
+         %47 = OpLabel
+         %51 = OpLoad %int %i
+         %53 = OpLoad %float %thirty_two
+         %54 = OpConvertSToF %float %51
+         %55 = OpExtInst %float %56 RoundEven %53
+         %57 = OpFMod %float %54 %55
+         %59 = OpFOrdLessThanEqual %bool %57 %float_0_00999999978
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %60
+         %61 = OpLabel
+         %62 = OpLoad %float %result
+         %64 = OpFAdd %float %62 %float_100
+               OpStore %result %64
+               OpBranch %60
+         %60 = OpLabel
+               OpBranch %45
+         %45 = OpLabel
+         %65 = OpLoad %int %i
+         %67 = OpLoad %float %limit
+         %68 = OpConvertSToF %float %65
+         %69 = OpFOrdGreaterThanEqual %bool %68 %67
+               OpSelectionMerge %70 None
+               OpBranchConditional %69 %71 %70
+         %71 = OpLabel
+         %72 = OpLoad %float %result
+               OpReturnValue %72
+         %70 = OpLabel
+               OpBranch %31
+         %31 = OpLabel
+         %73 = OpLoad %int %i
+         %74 = OpIAdd %int %73 %int_1
+               OpStore %i %74
+               OpBranch %29
+         %30 = OpLabel
+         %75 = OpLoad %float %result
+               OpReturnValue %75
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %76
+         %79 = OpLabel
+          %c = OpVariable %_ptr_Function_v3float Function %83
+%thirty_two_1 = OpVariable %_ptr_Function_float Function %22
+      %param = OpVariable %_ptr_Function_float Function %22
+    %param_1 = OpVariable %_ptr_Function_float Function %22
+    %param_2 = OpVariable %_ptr_Function_float Function %22
+    %param_3 = OpVariable %_ptr_Function_float Function %22
+        %i_1 = OpVariable %_ptr_Function_int Function %26
+               OpStore %c %93
+         %97 = OpAccessChain %_ptr_Uniform_float %x_13 %uint_0 %uint_0
+         %98 = OpLoad %float %97
+        %100 = OpFDiv %float %98 %float_8
+         %99 = OpExtInst %float %56 RoundEven %100
+               OpStore %thirty_two_1 %99
+        %102 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+        %103 = OpLoad %float %102
+               OpStore %param %103
+        %104 = OpLoad %float %thirty_two_1
+               OpStore %param_1 %104
+        %105 = OpFunctionCall %float %compute_value_f1_f1_ %param %param_1
+        %108 = OpAccessChain %_ptr_Function_float %c %uint_0
+               OpStore %108 %105
+        %110 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %111 = OpLoad %float %110
+               OpStore %param_2 %111
+        %112 = OpLoad %float %thirty_two_1
+               OpStore %param_3 %112
+        %113 = OpFunctionCall %float %compute_value_f1_f1_ %param_2 %param_3
+        %116 = OpAccessChain %_ptr_Function_float %c %uint_1
+               OpStore %116 %113
+        %117 = OpLoad %v3float %c
+        %118 = OpLoad %v3float %c
+        %120 = OpCompositeExtract %float %118 0
+        %121 = OpCompositeExtract %float %118 1
+        %122 = OpCompositeConstruct %v2float %120 %121
+        %123 = OpCompositeExtract %float %118 2
+        %125 = OpCompositeConstruct %v2float %123 %float_1
+        %128 = OpCompositeConstruct %mat4v2float %122 %125 %127 %127
+        %130 = OpAccessChain %_ptr_Function_float %c %uint_2
+        %136 = OpVectorTimesMatrix %v3float %117 %135
+        %137 = OpCompositeExtract %float %136 0
+        %138 = OpCompositeExtract %v2float %128 0
+        %139 = OpCompositeExtract %float %138 0
+        %140 = OpCompositeExtract %v2float %128 0
+        %141 = OpCompositeExtract %float %140 1
+        %142 = OpCompositeExtract %v2float %128 1
+        %143 = OpCompositeExtract %float %142 0
+        %144 = OpCompositeConstruct %v3float %139 %141 %143
+        %145 = OpCompositeExtract %float %144 1
+        %146 = OpFAdd %float %137 %145
+               OpStore %130 %146
+               OpStore %i_1 %int_0
+               OpBranch %147
+        %147 = OpLabel
+               OpLoopMerge %148 %149 None
+               OpBranch %150
+        %150 = OpLabel
+        %151 = OpLoad %int %i_1
+        %153 = OpSLessThan %bool %151 %int_3
+               OpSelectionMerge %154 None
+               OpBranchConditional %153 %155 %156
+        %155 = OpLabel
+               OpBranch %154
+        %156 = OpLabel
+               OpBranch %148
+        %154 = OpLabel
+        %157 = OpLoad %int %i_1
+        %158 = OpAccessChain %_ptr_Function_float %c %157
+        %159 = OpLoad %float %158
+        %160 = OpFOrdGreaterThanEqual %bool %159 %float_1
+               OpSelectionMerge %161 None
+               OpBranchConditional %160 %162 %161
+        %162 = OpLabel
+        %163 = OpLoad %int %i_1
+        %164 = OpLoad %int %i_1
+        %165 = OpAccessChain %_ptr_Function_float %c %164
+        %166 = OpLoad %float %165
+        %167 = OpLoad %int %i_1
+        %168 = OpAccessChain %_ptr_Function_float %c %167
+        %169 = OpLoad %float %168
+        %170 = OpAccessChain %_ptr_Function_float %c %163
+        %171 = OpFMul %float %166 %169
+               OpStore %170 %171
+        %172 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %173 = OpLoad %float %172
+        %174 = OpFOrdLessThan %bool %173 %float_0
+               OpSelectionMerge %175 None
+               OpBranchConditional %174 %176 %175
+        %176 = OpLabel
+               OpBranch %148
+        %175 = OpLabel
+               OpBranch %161
+        %161 = OpLabel
+               OpBranch %149
+        %149 = OpLabel
+        %177 = OpLoad %int %i_1
+        %178 = OpIAdd %int %177 %int_1
+               OpStore %i_1 %178
+               OpBranch %147
+        %148 = OpLabel
+        %179 = OpLoad %v3float %c
+        %181 = OpExtInst %v3float %56 FAbs %179
+        %180 = OpExtInst %v3float %56 Normalize %181
+        %182 = OpCompositeExtract %float %180 0
+        %183 = OpCompositeExtract %float %180 1
+        %184 = OpCompositeExtract %float %180 2
+        %185 = OpCompositeConstruct %v4float %182 %183 %184 %float_1
+               OpStore %x_GLF_color %185
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %186
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %190 = OpLabel
+        %191 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %191
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %76
+        %193 = OpLabel
+        %194 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %194
+        %195 = OpFunctionCall %void %main_1
+        %197 = OpLoad %v4float %x_GLF_color
+        %198 = OpCompositeConstruct %main_out %197
+        %196 = OpFunctionCall %void %tint_symbol_3 %198
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..ee16548
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-colorgrid-modulo-vec3-values-from-matrix/1.wgsl.expected.wgsl
@@ -0,0 +1,121 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_13 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn compute_value_f1_f1_(limit : ptr<function, f32>, thirty_two : ptr<function, f32>) -> f32 {
+  var result : f32;
+  var i : i32;
+  result = -0.5;
+  i = 1;
+  loop {
+    let x_136 : i32 = i;
+    if ((x_136 < 800)) {
+    } else {
+      break;
+    }
+    let x_139 : i32 = i;
+    if (((x_139 % 32) == 0)) {
+      let x_145 : f32 = result;
+      result = (x_145 + 0.400000006);
+    } else {
+      let x_147 : i32 = i;
+      let x_149 : f32 = *(thirty_two);
+      if (((f32(x_147) % round(x_149)) <= 0.01)) {
+        let x_155 : f32 = result;
+        result = (x_155 + 100.0);
+      }
+    }
+    let x_157 : i32 = i;
+    let x_159 : f32 = *(limit);
+    if ((f32(x_157) >= x_159)) {
+      let x_163 : f32 = result;
+      return x_163;
+    }
+
+    continuing {
+      let x_164 : i32 = i;
+      i = (x_164 + 1);
+    }
+  }
+  let x_166 : f32 = result;
+  return x_166;
+}
+
+fn main_1() {
+  var c : vec3<f32>;
+  var thirty_two_1 : f32;
+  var param : f32;
+  var param_1 : f32;
+  var param_2 : f32;
+  var param_3 : f32;
+  var i_1 : i32;
+  c = vec3<f32>(7.0, 8.0, 9.0);
+  let x_63 : f32 = x_13.resolution.x;
+  thirty_two_1 = round((x_63 / 8.0));
+  let x_67 : f32 = gl_FragCoord.x;
+  param = x_67;
+  let x_68 : f32 = thirty_two_1;
+  param_1 = x_68;
+  let x_69 : f32 = compute_value_f1_f1_(&(param), &(param_1));
+  c.x = x_69;
+  let x_72 : f32 = gl_FragCoord.y;
+  param_2 = x_72;
+  let x_73 : f32 = thirty_two_1;
+  param_3 = x_73;
+  let x_74 : f32 = compute_value_f1_f1_(&(param_2), &(param_3));
+  c.y = x_74;
+  let x_76 : vec3<f32> = c;
+  let x_79 : vec3<f32> = c;
+  let x_87 : mat4x2<f32> = mat4x2<f32>(vec2<f32>(x_79.x, x_79.y), vec2<f32>(x_79.z, 1.0), vec2<f32>(1.0, 0.0), vec2<f32>(1.0, 0.0));
+  c.z = (((x_76 * mat3x3<f32>(vec3<f32>(1.0, 0.0, 0.0), vec3<f32>(0.0, 1.0, 0.0), vec3<f32>(0.0, 0.0, 1.0)))).x + vec3<f32>(x_87[0u].x, x_87[0u].y, x_87[1u].x).y);
+  i_1 = 0;
+  loop {
+    let x_99 : i32 = i_1;
+    if ((x_99 < 3)) {
+    } else {
+      break;
+    }
+    let x_102 : i32 = i_1;
+    let x_104 : f32 = c[x_102];
+    if ((x_104 >= 1.0)) {
+      let x_108 : i32 = i_1;
+      let x_109 : i32 = i_1;
+      let x_111 : f32 = c[x_109];
+      let x_112 : i32 = i_1;
+      let x_114 : f32 = c[x_112];
+      c[x_108] = (x_111 * x_114);
+      let x_118 : f32 = gl_FragCoord.y;
+      if ((x_118 < 0.0)) {
+        break;
+      }
+    }
+
+    continuing {
+      let x_122 : i32 = i_1;
+      i_1 = (x_122 + 1);
+    }
+  }
+  let x_124 : vec3<f32> = c;
+  let x_126 : vec3<f32> = normalize(abs(x_124));
+  x_GLF_color = vec4<f32>(x_126.x, x_126.y, x_126.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-clamped-conditional-bit-shift/1.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-clamped-conditional-bit-shift/1.spvasm
new file mode 100644
index 0000000..9408cfa
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-clamped-conditional-bit-shift/1.spvasm
@@ -0,0 +1,617 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %merge_i1_i1_i1_ "merge(i1;i1;i1;"
+               OpName %from "from"
+               OpName %mid "mid"
+               OpName %to "to"
+               OpName %func_i1_i1_ "func(i1;i1;"
+               OpName %m "m"
+               OpName %high "high"
+               OpName %mergeSort_ "mergeSort("
+               OpName %k "k"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %data "data"
+               OpName %temp "temp"
+               OpName %i_0 "i"
+               OpName %x "x"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %low "low"
+               OpName %high_0 "high"
+               OpName %m_0 "m"
+               OpName %i_1 "i"
+               OpName %from_0 "from"
+               OpName %mid_0 "mid"
+               OpName %to_0 "to"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %param_1 "param"
+               OpName %param_2 "param"
+               OpName %param_3 "param"
+               OpName %i_2 "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %j_0 "j"
+               OpName %grey "grey"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %38 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %41 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int %_ptr_Function_int
+         %42 = OpTypeFunction %int %_ptr_Function_int %_ptr_Function_int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Private__arr_int_uint_10 = OpTypePointer Private %_arr_int_uint_10
+       %data = OpVariable %_ptr_Private__arr_int_uint_10 Private
+%_ptr_Private_int = OpTypePointer Private %int
+       %temp = OpVariable %_ptr_Private__arr_int_uint_10 Private
+     %int_10 = OpConstant %int 10
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_0 = OpConstant %float 0
+      %false = OpConstantFalse %bool
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+      %int_2 = OpConstant %int 2
+      %int_9 = OpConstant %int 9
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_3 = OpConstant %int 3
+     %int_n1 = OpConstant %int -1
+     %int_n2 = OpConstant %int -2
+     %int_n3 = OpConstant %int -3
+     %int_n4 = OpConstant %int -4
+     %int_n5 = OpConstant %int -5
+     %uint_1 = OpConstant %uint 1
+     %int_30 = OpConstant %int 30
+%_ptr_Function_float = OpTypePointer Function %float
+  %float_0_5 = OpConstant %float 0.5
+   %float_10 = OpConstant %float 10
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %v3float = OpTypeVector %float 3
+    %float_1 = OpConstant %float 1
+       %main = OpFunction %void None %38
+         %91 = OpLabel
+        %i_2 = OpVariable %_ptr_Function_int Function
+        %j_0 = OpVariable %_ptr_Function_int Function
+       %grey = OpVariable %_ptr_Function_float Function
+         %92 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %93 = OpLoad %float %92
+         %94 = OpConvertFToS %int %93
+               OpStore %i_2 %94
+               OpBranch %95
+         %95 = OpLabel
+               OpLoopMerge %96 %97 None
+               OpBranch %98
+         %98 = OpLabel
+         %99 = OpLoad %int %i_2
+               OpSelectionMerge %100 None
+               OpSwitch %99 %100 0 %101 1 %102 2 %103 3 %104 4 %105 5 %106 6 %107 7 %108 8 %109 9 %110
+        %101 = OpLabel
+        %111 = OpLoad %int %i_2
+        %112 = OpAccessChain %_ptr_Private_int %data %111
+               OpStore %112 %int_4
+               OpBranch %100
+        %102 = OpLabel
+        %113 = OpLoad %int %i_2
+        %114 = OpAccessChain %_ptr_Private_int %data %113
+               OpStore %114 %int_3
+               OpBranch %100
+        %103 = OpLabel
+        %115 = OpLoad %int %i_2
+        %116 = OpAccessChain %_ptr_Private_int %data %115
+               OpStore %116 %int_2
+               OpBranch %100
+        %104 = OpLabel
+        %117 = OpLoad %int %i_2
+        %118 = OpAccessChain %_ptr_Private_int %data %117
+               OpStore %118 %int_1
+               OpBranch %100
+        %105 = OpLabel
+        %119 = OpLoad %int %i_2
+        %120 = OpAccessChain %_ptr_Private_int %data %119
+               OpStore %120 %int_0
+               OpBranch %100
+        %106 = OpLabel
+        %121 = OpLoad %int %i_2
+        %122 = OpAccessChain %_ptr_Private_int %data %121
+               OpStore %122 %int_n1
+               OpBranch %100
+        %107 = OpLabel
+        %123 = OpLoad %int %i_2
+        %124 = OpAccessChain %_ptr_Private_int %data %123
+               OpStore %124 %int_n2
+               OpBranch %100
+        %108 = OpLabel
+        %125 = OpLoad %int %i_2
+        %126 = OpAccessChain %_ptr_Private_int %data %125
+               OpStore %126 %int_n3
+               OpBranch %100
+        %109 = OpLabel
+        %127 = OpLoad %int %i_2
+        %128 = OpAccessChain %_ptr_Private_int %data %127
+               OpStore %128 %int_n4
+               OpBranch %100
+        %110 = OpLabel
+        %129 = OpLoad %int %i_2
+        %130 = OpAccessChain %_ptr_Private_int %data %129
+               OpStore %130 %int_n5
+               OpBranch %100
+        %100 = OpLabel
+        %131 = OpLoad %int %i_2
+        %132 = OpIAdd %int %131 %int_1
+               OpStore %i_2 %132
+               OpBranch %97
+         %97 = OpLabel
+        %133 = OpLoad %int %i_2
+        %134 = OpSLessThan %bool %133 %int_10
+               OpBranchConditional %134 %95 %96
+         %96 = OpLabel
+               OpStore %j_0 %int_0
+               OpBranch %135
+        %135 = OpLabel
+               OpLoopMerge %136 %137 None
+               OpBranch %138
+        %138 = OpLabel
+        %139 = OpLoad %int %j_0
+        %140 = OpSLessThan %bool %139 %int_10
+               OpBranchConditional %140 %141 %136
+        %141 = OpLabel
+        %142 = OpLoad %int %j_0
+        %143 = OpLoad %int %j_0
+        %144 = OpAccessChain %_ptr_Private_int %data %143
+        %145 = OpLoad %int %144
+        %146 = OpAccessChain %_ptr_Private_int %temp %142
+               OpStore %146 %145
+               OpBranch %137
+        %137 = OpLabel
+        %147 = OpLoad %int %j_0
+        %148 = OpIAdd %int %147 %int_1
+               OpStore %j_0 %148
+               OpBranch %135
+        %136 = OpLabel
+        %149 = OpFunctionCall %void %mergeSort_
+        %150 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %151 = OpLoad %float %150
+        %152 = OpConvertFToS %int %151
+        %153 = OpSLessThan %bool %152 %int_30
+               OpSelectionMerge %154 None
+               OpBranchConditional %153 %155 %156
+        %155 = OpLabel
+        %157 = OpAccessChain %_ptr_Private_int %data %int_0
+        %158 = OpLoad %int %157
+        %159 = OpConvertSToF %float %158
+        %160 = OpFDiv %float %159 %float_10
+        %161 = OpFAdd %float %float_0_5 %160
+               OpStore %grey %161
+               OpBranch %154
+        %156 = OpLabel
+        %162 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %163 = OpLoad %float %162
+        %164 = OpConvertFToS %int %163
+        %165 = OpSLessThan %bool %164 %int_60
+               OpSelectionMerge %166 None
+               OpBranchConditional %165 %167 %168
+        %167 = OpLabel
+        %169 = OpAccessChain %_ptr_Private_int %data %int_1
+        %170 = OpLoad %int %169
+        %171 = OpConvertSToF %float %170
+        %172 = OpFDiv %float %171 %float_10
+        %173 = OpFAdd %float %float_0_5 %172
+               OpStore %grey %173
+               OpBranch %166
+        %168 = OpLabel
+        %174 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %175 = OpLoad %float %174
+        %176 = OpConvertFToS %int %175
+        %177 = OpSLessThan %bool %176 %int_90
+               OpSelectionMerge %178 None
+               OpBranchConditional %177 %179 %180
+        %179 = OpLabel
+        %181 = OpAccessChain %_ptr_Private_int %data %int_2
+        %182 = OpLoad %int %181
+        %183 = OpConvertSToF %float %182
+        %184 = OpFDiv %float %183 %float_10
+        %185 = OpFAdd %float %float_0_5 %184
+               OpStore %grey %185
+               OpBranch %178
+        %180 = OpLabel
+        %186 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %187 = OpLoad %float %186
+        %188 = OpConvertFToS %int %187
+        %189 = OpSLessThan %bool %188 %int_120
+               OpSelectionMerge %190 None
+               OpBranchConditional %189 %191 %192
+        %191 = OpLabel
+        %193 = OpAccessChain %_ptr_Private_int %data %int_3
+        %194 = OpLoad %int %193
+        %195 = OpConvertSToF %float %194
+        %196 = OpFDiv %float %195 %float_10
+        %197 = OpFAdd %float %float_0_5 %196
+               OpStore %grey %197
+               OpBranch %190
+        %192 = OpLabel
+        %198 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %199 = OpLoad %float %198
+        %200 = OpConvertFToS %int %199
+        %201 = OpSLessThan %bool %200 %int_150
+               OpSelectionMerge %202 None
+               OpBranchConditional %201 %203 %204
+        %203 = OpLabel
+               OpKill
+        %204 = OpLabel
+        %205 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %206 = OpLoad %float %205
+        %207 = OpConvertFToS %int %206
+        %208 = OpSLessThan %bool %207 %int_180
+               OpSelectionMerge %209 None
+               OpBranchConditional %208 %210 %211
+        %210 = OpLabel
+        %212 = OpAccessChain %_ptr_Private_int %data %int_5
+        %213 = OpLoad %int %212
+        %214 = OpConvertSToF %float %213
+        %215 = OpFDiv %float %214 %float_10
+        %216 = OpFAdd %float %float_0_5 %215
+               OpStore %grey %216
+               OpBranch %209
+        %211 = OpLabel
+        %217 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %218 = OpLoad %float %217
+        %219 = OpConvertFToS %int %218
+        %220 = OpSLessThan %bool %219 %int_210
+               OpSelectionMerge %221 None
+               OpBranchConditional %220 %222 %223
+        %222 = OpLabel
+        %224 = OpAccessChain %_ptr_Private_int %data %int_6
+        %225 = OpLoad %int %224
+        %226 = OpConvertSToF %float %225
+        %227 = OpFDiv %float %226 %float_10
+        %228 = OpFAdd %float %float_0_5 %227
+               OpStore %grey %228
+               OpBranch %221
+        %223 = OpLabel
+        %229 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %230 = OpLoad %float %229
+        %231 = OpConvertFToS %int %230
+        %232 = OpSLessThan %bool %231 %int_240
+               OpSelectionMerge %233 None
+               OpBranchConditional %232 %234 %235
+        %234 = OpLabel
+        %236 = OpAccessChain %_ptr_Private_int %data %int_7
+        %237 = OpLoad %int %236
+        %238 = OpConvertSToF %float %237
+        %239 = OpFDiv %float %238 %float_10
+        %240 = OpFAdd %float %float_0_5 %239
+               OpStore %grey %240
+               OpBranch %233
+        %235 = OpLabel
+        %241 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %242 = OpLoad %float %241
+        %243 = OpConvertFToS %int %242
+        %244 = OpSLessThan %bool %243 %int_270
+               OpSelectionMerge %245 None
+               OpBranchConditional %244 %246 %247
+        %246 = OpLabel
+        %248 = OpAccessChain %_ptr_Private_int %data %int_8
+        %249 = OpLoad %int %248
+        %250 = OpConvertSToF %float %249
+        %251 = OpFDiv %float %250 %float_10
+        %252 = OpFAdd %float %float_0_5 %251
+               OpStore %grey %252
+               OpBranch %245
+        %247 = OpLabel
+               OpKill
+        %245 = OpLabel
+               OpBranch %233
+        %233 = OpLabel
+               OpBranch %221
+        %221 = OpLabel
+               OpBranch %209
+        %209 = OpLabel
+               OpBranch %202
+        %202 = OpLabel
+               OpBranch %190
+        %190 = OpLabel
+               OpBranch %178
+        %178 = OpLabel
+               OpBranch %166
+        %166 = OpLabel
+               OpBranch %154
+        %154 = OpLabel
+        %253 = OpLoad %float %grey
+        %254 = OpCompositeConstruct %v3float %253 %253 %253
+        %255 = OpCompositeExtract %float %254 0
+        %256 = OpCompositeExtract %float %254 1
+        %257 = OpCompositeExtract %float %254 2
+        %258 = OpCompositeConstruct %v4float %255 %256 %257 %float_1
+               OpStore %_GLF_color %258
+               OpReturn
+               OpFunctionEnd
+%merge_i1_i1_i1_ = OpFunction %void None %41
+       %from = OpFunctionParameter %_ptr_Function_int
+        %mid = OpFunctionParameter %_ptr_Function_int
+         %to = OpFunctionParameter %_ptr_Function_int
+        %259 = OpLabel
+          %k = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+          %j = OpVariable %_ptr_Function_int Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+        %260 = OpLoad %int %from
+               OpStore %k %260
+        %261 = OpLoad %int %from
+               OpStore %i %261
+        %262 = OpLoad %int %mid
+        %263 = OpIAdd %int %262 %int_1
+               OpStore %j %263
+               OpBranch %264
+        %264 = OpLabel
+               OpLoopMerge %265 %266 None
+               OpBranch %267
+        %267 = OpLabel
+        %268 = OpLoad %int %i
+        %269 = OpLoad %int %mid
+        %270 = OpSLessThanEqual %bool %268 %269
+        %271 = OpLoad %int %j
+        %272 = OpLoad %int %to
+        %273 = OpSLessThanEqual %bool %271 %272
+        %274 = OpLogicalAnd %bool %270 %273
+               OpBranchConditional %274 %275 %265
+        %275 = OpLabel
+        %276 = OpLoad %int %i
+        %277 = OpAccessChain %_ptr_Private_int %data %276
+        %278 = OpLoad %int %277
+        %279 = OpLoad %int %j
+        %280 = OpAccessChain %_ptr_Private_int %data %279
+        %281 = OpLoad %int %280
+        %282 = OpSLessThan %bool %278 %281
+               OpSelectionMerge %283 None
+               OpBranchConditional %282 %284 %285
+        %284 = OpLabel
+        %286 = OpLoad %int %k
+        %287 = OpIAdd %int %286 %int_1
+               OpStore %k %287
+        %288 = OpLoad %int %i
+        %289 = OpIAdd %int %288 %int_1
+               OpStore %i %289
+        %290 = OpAccessChain %_ptr_Private_int %data %288
+        %291 = OpLoad %int %290
+        %292 = OpAccessChain %_ptr_Private_int %temp %286
+               OpStore %292 %291
+               OpBranch %283
+        %285 = OpLabel
+        %293 = OpLoad %int %k
+        %294 = OpIAdd %int %293 %int_1
+               OpStore %k %294
+        %295 = OpLoad %int %j
+        %296 = OpIAdd %int %295 %int_1
+               OpStore %j %296
+        %297 = OpAccessChain %_ptr_Private_int %data %295
+        %298 = OpLoad %int %297
+        %299 = OpAccessChain %_ptr_Private_int %temp %293
+               OpStore %299 %298
+               OpBranch %283
+        %283 = OpLabel
+               OpBranch %266
+        %266 = OpLabel
+               OpBranch %264
+        %265 = OpLabel
+               OpBranch %300
+        %300 = OpLabel
+               OpLoopMerge %301 %302 None
+               OpBranch %303
+        %303 = OpLabel
+        %304 = OpLoad %int %i
+        %305 = OpSLessThan %bool %304 %int_10
+        %306 = OpLoad %int %i
+        %307 = OpLoad %int %mid
+        %308 = OpSLessThanEqual %bool %306 %307
+        %309 = OpLogicalAnd %bool %305 %308
+               OpBranchConditional %309 %310 %301
+        %310 = OpLabel
+        %311 = OpLoad %int %k
+        %312 = OpIAdd %int %311 %int_1
+               OpStore %k %312
+        %313 = OpLoad %int %i
+        %314 = OpIAdd %int %313 %int_1
+               OpStore %i %314
+        %315 = OpAccessChain %_ptr_Private_int %data %313
+        %316 = OpLoad %int %315
+        %317 = OpAccessChain %_ptr_Private_int %temp %311
+               OpStore %317 %316
+               OpBranch %302
+        %302 = OpLabel
+               OpBranch %300
+        %301 = OpLabel
+        %318 = OpLoad %int %from
+               OpStore %i_0 %318
+               OpBranch %319
+        %319 = OpLabel
+               OpLoopMerge %320 %321 None
+               OpBranch %322
+        %322 = OpLabel
+        %323 = OpLoad %int %i_0
+        %324 = OpLoad %int %to
+        %325 = OpSLessThanEqual %bool %323 %324
+               OpBranchConditional %325 %326 %320
+        %326 = OpLabel
+        %327 = OpLoad %int %i_0
+        %328 = OpLoad %int %i_0
+        %329 = OpAccessChain %_ptr_Private_int %temp %328
+        %330 = OpLoad %int %329
+        %331 = OpAccessChain %_ptr_Private_int %data %327
+               OpStore %331 %330
+               OpBranch %321
+        %321 = OpLabel
+        %332 = OpLoad %int %i_0
+        %333 = OpIAdd %int %332 %int_1
+               OpStore %i_0 %333
+               OpBranch %319
+        %320 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%func_i1_i1_ = OpFunction %int None %42
+          %m = OpFunctionParameter %_ptr_Function_int
+       %high = OpFunctionParameter %_ptr_Function_int
+        %334 = OpLabel
+          %x = OpVariable %_ptr_Function_int Function
+        %335 = OpVariable %_ptr_Function_int Function
+        %336 = OpVariable %_ptr_Function_int Function
+        %337 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+        %338 = OpLoad %float %337
+        %339 = OpFOrdGreaterThanEqual %bool %338 %float_0
+               OpSelectionMerge %340 None
+               OpBranchConditional %339 %341 %342
+        %341 = OpLabel
+               OpSelectionMerge %343 None
+               OpBranchConditional %false %344 %345
+        %344 = OpLabel
+        %346 = OpLoad %int %high
+        %347 = OpShiftLeftLogical %int %346 %int_0
+               OpStore %336 %347
+               OpBranch %343
+        %345 = OpLabel
+               OpStore %336 %int_4
+               OpBranch %343
+        %343 = OpLabel
+        %348 = OpLoad %int %336
+        %349 = OpShiftLeftLogical %int %int_1 %348
+               OpStore %335 %349
+               OpBranch %340
+        %342 = OpLabel
+               OpStore %335 %int_1
+               OpBranch %340
+        %340 = OpLabel
+        %350 = OpLoad %int %335
+               OpStore %x %350
+        %351 = OpLoad %int %x
+        %352 = OpShiftRightArithmetic %int %351 %int_4
+               OpStore %x %352
+        %353 = OpLoad %int %m
+        %354 = OpIMul %int %int_2 %353
+        %355 = OpLoad %int %m
+        %356 = OpIMul %int %int_2 %355
+        %357 = OpLoad %int %m
+        %358 = OpIMul %int %int_2 %357
+        %359 = OpLoad %int %x
+        %360 = OpSDiv %int %358 %359
+        %361 = OpExtInst %int %1 SClamp %354 %356 %360
+               OpReturnValue %361
+               OpFunctionEnd
+ %mergeSort_ = OpFunction %void None %38
+        %362 = OpLabel
+        %low = OpVariable %_ptr_Function_int Function
+     %high_0 = OpVariable %_ptr_Function_int Function
+        %m_0 = OpVariable %_ptr_Function_int Function
+        %i_1 = OpVariable %_ptr_Function_int Function
+     %from_0 = OpVariable %_ptr_Function_int Function
+      %mid_0 = OpVariable %_ptr_Function_int Function
+       %to_0 = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_int Function
+    %param_0 = OpVariable %_ptr_Function_int Function
+    %param_1 = OpVariable %_ptr_Function_int Function
+    %param_2 = OpVariable %_ptr_Function_int Function
+    %param_3 = OpVariable %_ptr_Function_int Function
+               OpStore %low %int_0
+               OpStore %high_0 %int_9
+               OpStore %m_0 %int_1
+               OpBranch %363
+        %363 = OpLabel
+               OpLoopMerge %364 %365 None
+               OpBranch %366
+        %366 = OpLabel
+        %367 = OpLoad %int %m_0
+        %368 = OpLoad %int %high_0
+        %369 = OpSLessThanEqual %bool %367 %368
+               OpBranchConditional %369 %370 %364
+        %370 = OpLabel
+        %371 = OpLoad %int %low
+               OpStore %i_1 %371
+               OpBranch %372
+        %372 = OpLabel
+               OpLoopMerge %373 %374 None
+               OpBranch %375
+        %375 = OpLabel
+        %376 = OpLoad %int %i_1
+        %377 = OpLoad %int %high_0
+        %378 = OpSLessThan %bool %376 %377
+               OpBranchConditional %378 %379 %373
+        %379 = OpLabel
+        %380 = OpLoad %int %i_1
+               OpStore %from_0 %380
+        %381 = OpLoad %int %i_1
+        %382 = OpLoad %int %m_0
+        %383 = OpIAdd %int %381 %382
+        %384 = OpISub %int %383 %int_1
+               OpStore %mid_0 %384
+        %385 = OpLoad %int %i_1
+        %386 = OpLoad %int %m_0
+        %387 = OpIMul %int %int_2 %386
+        %388 = OpIAdd %int %385 %387
+        %389 = OpISub %int %388 %int_1
+        %390 = OpLoad %int %high_0
+        %391 = OpExtInst %int %1 SMin %389 %390
+               OpStore %to_0 %391
+        %392 = OpLoad %int %from_0
+               OpStore %param %392
+        %393 = OpLoad %int %mid_0
+               OpStore %param_0 %393
+        %394 = OpLoad %int %to_0
+               OpStore %param_1 %394
+        %395 = OpFunctionCall %void %merge_i1_i1_i1_ %param %param_0 %param_1
+               OpBranch %374
+        %374 = OpLabel
+        %396 = OpLoad %int %m_0
+               OpStore %param_2 %396
+        %397 = OpLoad %int %high_0
+               OpStore %param_3 %397
+        %398 = OpFunctionCall %int %func_i1_i1_ %param_2 %param_3
+        %399 = OpLoad %int %i_1
+        %400 = OpIAdd %int %399 %398
+               OpStore %i_1 %400
+               OpBranch %372
+        %373 = OpLabel
+               OpBranch %365
+        %365 = OpLabel
+        %401 = OpLoad %int %m_0
+        %402 = OpIMul %int %int_2 %401
+               OpStore %m_0 %402
+               OpBranch %363
+        %364 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-clamped-conditional-bit-shift/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-clamped-conditional-bit-shift/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..edd60f7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-clamped-conditional-bit-shift/1.spvasm.expected.hlsl
@@ -0,0 +1,302 @@
+static int data[10] = (int[10])0;
+static int temp[10] = (int[10])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 merge_i1_i1_i1_(inout int from, inout int mid, inout int to) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  const int x_260 = from;
+  k = x_260;
+  const int x_261 = from;
+  i = x_261;
+  const int x_262 = mid;
+  j = (x_262 + 1);
+  while (true) {
+    const int x_268 = i;
+    const int x_269 = mid;
+    const int x_271 = j;
+    const int x_272 = to;
+    bool tint_tmp = (x_268 <= x_269);
+    if (tint_tmp) {
+      tint_tmp = (x_271 <= x_272);
+    }
+    if ((tint_tmp)) {
+    } else {
+      break;
+    }
+    const int x_278 = data[i];
+    const int x_281 = data[j];
+    if ((x_278 < x_281)) {
+      const int x_286 = k;
+      k = (x_286 + 1);
+      const int x_288 = i;
+      i = (x_288 + 1);
+      const int x_291 = data[x_288];
+      temp[x_286] = x_291;
+    } else {
+      const int x_293 = k;
+      k = (x_293 + 1);
+      const int x_295 = j;
+      j = (x_295 + 1);
+      const int x_298 = data[x_295];
+      temp[x_293] = x_298;
+    }
+  }
+  while (true) {
+    const int x_304 = i;
+    const int x_306 = i;
+    const int x_307 = mid;
+    bool tint_tmp_1 = (x_304 < 10);
+    if (tint_tmp_1) {
+      tint_tmp_1 = (x_306 <= x_307);
+    }
+    if ((tint_tmp_1)) {
+    } else {
+      break;
+    }
+    const int x_311 = k;
+    k = (x_311 + 1);
+    const int x_313 = i;
+    i = (x_313 + 1);
+    const int x_316 = data[x_313];
+    temp[x_311] = x_316;
+  }
+  const int x_318 = from;
+  i_1 = x_318;
+  while (true) {
+    const int x_323 = i_1;
+    const int x_324 = to;
+    if ((x_323 <= x_324)) {
+    } else {
+      break;
+    }
+    const int x_327 = i_1;
+    const int x_330 = temp[i_1];
+    data[x_327] = x_330;
+    {
+      i_1 = (i_1 + 1);
+    }
+  }
+  return;
+}
+
+int func_i1_i1_(inout int m, inout int high) {
+  int x = 0;
+  int x_335 = 0;
+  int x_336 = 0;
+  const float x_338 = gl_FragCoord.x;
+  if ((x_338 >= 0.0f)) {
+    if (false) {
+      const int x_346 = high;
+      x_336 = (x_346 << asuint(0));
+    } else {
+      x_336 = 4;
+    }
+    x_335 = (1 << asuint(x_336));
+  } else {
+    x_335 = 1;
+  }
+  x = x_335;
+  x = (x >> asuint(4));
+  const int x_353 = m;
+  const int x_355 = m;
+  const int x_357 = m;
+  return clamp((2 * x_353), (2 * x_355), ((2 * x_357) / x));
+}
+
+void mergeSort_() {
+  int low = 0;
+  int high_1 = 0;
+  int m_1 = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  int param_3 = 0;
+  int param_4 = 0;
+  low = 0;
+  high_1 = 9;
+  m_1 = 1;
+  {
+    for(; (m_1 <= high_1); m_1 = (2 * m_1)) {
+      i_2 = low;
+      while (true) {
+        if ((i_2 < high_1)) {
+        } else {
+          break;
+        }
+        from_1 = i_2;
+        mid_1 = ((i_2 + m_1) - 1);
+        to_1 = min(((i_2 + (2 * m_1)) - 1), high_1);
+        param = from_1;
+        param_1 = mid_1;
+        param_2 = to_1;
+        merge_i1_i1_i1_(param, param_1, param_2);
+        {
+          param_3 = m_1;
+          param_4 = high_1;
+          const int x_398 = func_i1_i1_(param_3, param_4);
+          i_2 = (i_2 + x_398);
+        }
+      }
+    }
+  }
+  return;
+}
+
+void main_1() {
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  const float x_93 = asfloat(x_34[0].x);
+  i_3 = int(x_93);
+  while (true) {
+    switch(i_3) {
+      case 9: {
+        data[i_3] = -5;
+        break;
+      }
+      case 8: {
+        data[i_3] = -4;
+        break;
+      }
+      case 7: {
+        data[i_3] = -3;
+        break;
+      }
+      case 6: {
+        data[i_3] = -2;
+        break;
+      }
+      case 5: {
+        data[i_3] = -1;
+        break;
+      }
+      case 4: {
+        data[i_3] = 0;
+        break;
+      }
+      case 3: {
+        data[i_3] = 1;
+        break;
+      }
+      case 2: {
+        data[i_3] = 2;
+        break;
+      }
+      case 1: {
+        data[i_3] = 3;
+        break;
+      }
+      case 0: {
+        data[i_3] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    i_3 = (i_3 + 1);
+    {
+      if ((i_3 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  {
+    for(; (j_1 < 10); j_1 = (j_1 + 1)) {
+      const int x_142 = j_1;
+      const int x_145 = data[j_1];
+      temp[x_142] = x_145;
+    }
+  }
+  mergeSort_();
+  const float x_151 = gl_FragCoord.y;
+  if ((int(x_151) < 30)) {
+    const int x_158 = data[0];
+    grey = (0.5f + (float(x_158) / 10.0f));
+  } else {
+    const float x_163 = gl_FragCoord.y;
+    if ((int(x_163) < 60)) {
+      const int x_170 = data[1];
+      grey = (0.5f + (float(x_170) / 10.0f));
+    } else {
+      const float x_175 = gl_FragCoord.y;
+      if ((int(x_175) < 90)) {
+        const int x_182 = data[2];
+        grey = (0.5f + (float(x_182) / 10.0f));
+      } else {
+        const float x_187 = gl_FragCoord.y;
+        if ((int(x_187) < 120)) {
+          const int x_194 = data[3];
+          grey = (0.5f + (float(x_194) / 10.0f));
+        } else {
+          const float x_199 = gl_FragCoord.y;
+          if ((int(x_199) < 150)) {
+            discard;
+          } else {
+            const float x_206 = gl_FragCoord.y;
+            if ((int(x_206) < 180)) {
+              const int x_213 = data[5];
+              grey = (0.5f + (float(x_213) / 10.0f));
+            } else {
+              const float x_218 = gl_FragCoord.y;
+              if ((int(x_218) < 210)) {
+                const int x_225 = data[6];
+                grey = (0.5f + (float(x_225) / 10.0f));
+              } else {
+                const float x_230 = gl_FragCoord.y;
+                if ((int(x_230) < 240)) {
+                  const int x_237 = data[7];
+                  grey = (0.5f + (float(x_237) / 10.0f));
+                } else {
+                  const float x_242 = gl_FragCoord.y;
+                  if ((int(x_242) < 270)) {
+                    const int x_249 = data[8];
+                    grey = (0.5f + (float(x_249) / 10.0f));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  const float x_253 = grey;
+  const float3 x_254 = float3(x_253, x_253, x_253);
+  x_GLF_color = float4(x_254.x, x_254.y, x_254.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-clamped-conditional-bit-shift/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-clamped-conditional-bit-shift/1.spvasm.expected.msl
new file mode 100644
index 0000000..eb075ff
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-clamped-conditional-bit-shift/1.spvasm.expected.msl
@@ -0,0 +1,348 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void merge_i1_i1_i1_(thread int* const from, thread int* const mid, thread int* const to, thread tint_array_wrapper* const tint_symbol_5, thread tint_array_wrapper* const tint_symbol_6) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  int const x_260 = *(from);
+  k = x_260;
+  int const x_261 = *(from);
+  i = x_261;
+  int const x_262 = *(mid);
+  j = (x_262 + 1);
+  while (true) {
+    int const x_268 = i;
+    int const x_269 = *(mid);
+    int const x_271 = j;
+    int const x_272 = *(to);
+    if (((x_268 <= x_269) && (x_271 <= x_272))) {
+    } else {
+      break;
+    }
+    int const x_276 = i;
+    int const x_278 = (*(tint_symbol_5)).arr[x_276];
+    int const x_279 = j;
+    int const x_281 = (*(tint_symbol_5)).arr[x_279];
+    if ((x_278 < x_281)) {
+      int const x_286 = k;
+      k = (x_286 + 1);
+      int const x_288 = i;
+      i = (x_288 + 1);
+      int const x_291 = (*(tint_symbol_5)).arr[x_288];
+      (*(tint_symbol_6)).arr[x_286] = x_291;
+    } else {
+      int const x_293 = k;
+      k = (x_293 + 1);
+      int const x_295 = j;
+      j = (x_295 + 1);
+      int const x_298 = (*(tint_symbol_5)).arr[x_295];
+      (*(tint_symbol_6)).arr[x_293] = x_298;
+    }
+  }
+  while (true) {
+    int const x_304 = i;
+    int const x_306 = i;
+    int const x_307 = *(mid);
+    if (((x_304 < 10) && (x_306 <= x_307))) {
+    } else {
+      break;
+    }
+    int const x_311 = k;
+    k = (x_311 + 1);
+    int const x_313 = i;
+    i = (x_313 + 1);
+    int const x_316 = (*(tint_symbol_5)).arr[x_313];
+    (*(tint_symbol_6)).arr[x_311] = x_316;
+  }
+  int const x_318 = *(from);
+  i_1 = x_318;
+  while (true) {
+    int const x_323 = i_1;
+    int const x_324 = *(to);
+    if ((x_323 <= x_324)) {
+    } else {
+      break;
+    }
+    int const x_327 = i_1;
+    int const x_328 = i_1;
+    int const x_330 = (*(tint_symbol_6)).arr[x_328];
+    (*(tint_symbol_5)).arr[x_327] = x_330;
+    {
+      int const x_332 = i_1;
+      i_1 = (x_332 + 1);
+    }
+  }
+  return;
+}
+
+int func_i1_i1_(thread int* const m, thread int* const high, thread float4* const tint_symbol_7) {
+  int x = 0;
+  int x_335 = 0;
+  int x_336 = 0;
+  float const x_338 = (*(tint_symbol_7)).x;
+  if ((x_338 >= 0.0f)) {
+    if (false) {
+      int const x_346 = *(high);
+      x_336 = (x_346 << as_type<uint>(0));
+    } else {
+      x_336 = 4;
+    }
+    int const x_348 = x_336;
+    x_335 = (1 << as_type<uint>(x_348));
+  } else {
+    x_335 = 1;
+  }
+  int const x_350 = x_335;
+  x = x_350;
+  int const x_351 = x;
+  x = (x_351 >> as_type<uint>(4));
+  int const x_353 = *(m);
+  int const x_355 = *(m);
+  int const x_357 = *(m);
+  int const x_359 = x;
+  return clamp((2 * x_353), (2 * x_355), ((2 * x_357) / x_359));
+}
+
+void mergeSort_(thread tint_array_wrapper* const tint_symbol_8, thread tint_array_wrapper* const tint_symbol_9, thread float4* const tint_symbol_10) {
+  int low = 0;
+  int high_1 = 0;
+  int m_1 = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  int param_3 = 0;
+  int param_4 = 0;
+  low = 0;
+  high_1 = 9;
+  m_1 = 1;
+  while (true) {
+    int const x_367 = m_1;
+    int const x_368 = high_1;
+    if ((x_367 <= x_368)) {
+    } else {
+      break;
+    }
+    int const x_371 = low;
+    i_2 = x_371;
+    while (true) {
+      int const x_376 = i_2;
+      int const x_377 = high_1;
+      if ((x_376 < x_377)) {
+      } else {
+        break;
+      }
+      int const x_380 = i_2;
+      from_1 = x_380;
+      int const x_381 = i_2;
+      int const x_382 = m_1;
+      mid_1 = ((x_381 + x_382) - 1);
+      int const x_385 = i_2;
+      int const x_386 = m_1;
+      int const x_390 = high_1;
+      to_1 = min(((x_385 + (2 * x_386)) - 1), x_390);
+      int const x_392 = from_1;
+      param = x_392;
+      int const x_393 = mid_1;
+      param_1 = x_393;
+      int const x_394 = to_1;
+      param_2 = x_394;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2), tint_symbol_8, tint_symbol_9);
+      {
+        int const x_396 = m_1;
+        param_3 = x_396;
+        int const x_397 = high_1;
+        param_4 = x_397;
+        int const x_398 = func_i1_i1_(&(param_3), &(param_4), tint_symbol_10);
+        int const x_399 = i_2;
+        i_2 = (x_399 + x_398);
+      }
+    }
+    {
+      int const x_401 = m_1;
+      m_1 = (2 * x_401);
+    }
+  }
+  return;
+}
+
+void main_1(constant buf0& x_34, thread tint_array_wrapper* const tint_symbol_11, thread tint_array_wrapper* const tint_symbol_12, thread float4* const tint_symbol_13, thread float4* const tint_symbol_14) {
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  float const x_93 = x_34.injectionSwitch.x;
+  i_3 = int(x_93);
+  while (true) {
+    int const x_99 = i_3;
+    switch(x_99) {
+      case 9: {
+        int const x_129 = i_3;
+        (*(tint_symbol_11)).arr[x_129] = -5;
+        break;
+      }
+      case 8: {
+        int const x_127 = i_3;
+        (*(tint_symbol_11)).arr[x_127] = -4;
+        break;
+      }
+      case 7: {
+        int const x_125 = i_3;
+        (*(tint_symbol_11)).arr[x_125] = -3;
+        break;
+      }
+      case 6: {
+        int const x_123 = i_3;
+        (*(tint_symbol_11)).arr[x_123] = -2;
+        break;
+      }
+      case 5: {
+        int const x_121 = i_3;
+        (*(tint_symbol_11)).arr[x_121] = -1;
+        break;
+      }
+      case 4: {
+        int const x_119 = i_3;
+        (*(tint_symbol_11)).arr[x_119] = 0;
+        break;
+      }
+      case 3: {
+        int const x_117 = i_3;
+        (*(tint_symbol_11)).arr[x_117] = 1;
+        break;
+      }
+      case 2: {
+        int const x_115 = i_3;
+        (*(tint_symbol_11)).arr[x_115] = 2;
+        break;
+      }
+      case 1: {
+        int const x_113 = i_3;
+        (*(tint_symbol_11)).arr[x_113] = 3;
+        break;
+      }
+      case 0: {
+        int const x_111 = i_3;
+        (*(tint_symbol_11)).arr[x_111] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    int const x_131 = i_3;
+    i_3 = (x_131 + 1);
+    {
+      int const x_133 = i_3;
+      if ((x_133 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  while (true) {
+    int const x_139 = j_1;
+    if ((x_139 < 10)) {
+    } else {
+      break;
+    }
+    int const x_142 = j_1;
+    int const x_143 = j_1;
+    int const x_145 = (*(tint_symbol_11)).arr[x_143];
+    (*(tint_symbol_12)).arr[x_142] = x_145;
+    {
+      int const x_147 = j_1;
+      j_1 = (x_147 + 1);
+    }
+  }
+  mergeSort_(tint_symbol_11, tint_symbol_12, tint_symbol_13);
+  float const x_151 = (*(tint_symbol_13)).y;
+  if ((int(x_151) < 30)) {
+    int const x_158 = (*(tint_symbol_11)).arr[0];
+    grey = (0.5f + (float(x_158) / 10.0f));
+  } else {
+    float const x_163 = (*(tint_symbol_13)).y;
+    if ((int(x_163) < 60)) {
+      int const x_170 = (*(tint_symbol_11)).arr[1];
+      grey = (0.5f + (float(x_170) / 10.0f));
+    } else {
+      float const x_175 = (*(tint_symbol_13)).y;
+      if ((int(x_175) < 90)) {
+        int const x_182 = (*(tint_symbol_11)).arr[2];
+        grey = (0.5f + (float(x_182) / 10.0f));
+      } else {
+        float const x_187 = (*(tint_symbol_13)).y;
+        if ((int(x_187) < 120)) {
+          int const x_194 = (*(tint_symbol_11)).arr[3];
+          grey = (0.5f + (float(x_194) / 10.0f));
+        } else {
+          float const x_199 = (*(tint_symbol_13)).y;
+          if ((int(x_199) < 150)) {
+            discard_fragment();
+          } else {
+            float const x_206 = (*(tint_symbol_13)).y;
+            if ((int(x_206) < 180)) {
+              int const x_213 = (*(tint_symbol_11)).arr[5];
+              grey = (0.5f + (float(x_213) / 10.0f));
+            } else {
+              float const x_218 = (*(tint_symbol_13)).y;
+              if ((int(x_218) < 210)) {
+                int const x_225 = (*(tint_symbol_11)).arr[6];
+                grey = (0.5f + (float(x_225) / 10.0f));
+              } else {
+                float const x_230 = (*(tint_symbol_13)).y;
+                if ((int(x_230) < 240)) {
+                  int const x_237 = (*(tint_symbol_11)).arr[7];
+                  grey = (0.5f + (float(x_237) / 10.0f));
+                } else {
+                  float const x_242 = (*(tint_symbol_13)).y;
+                  if ((int(x_242) < 270)) {
+                    int const x_249 = (*(tint_symbol_11)).arr[8];
+                    grey = (0.5f + (float(x_249) / 10.0f));
+                  } else {
+                    discard_fragment();
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  float const x_253 = grey;
+  float3 const x_254 = float3(x_253, x_253, x_253);
+  *(tint_symbol_14) = float4(x_254.x, x_254.y, x_254.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_34 [[buffer(0)]]) {
+  thread float4 tint_symbol_15 = 0.0f;
+  thread tint_array_wrapper tint_symbol_16 = {};
+  thread tint_array_wrapper tint_symbol_17 = {};
+  thread float4 tint_symbol_18 = 0.0f;
+  tint_symbol_15 = gl_FragCoord_param;
+  main_1(x_34, &(tint_symbol_16), &(tint_symbol_17), &(tint_symbol_15), &(tint_symbol_18));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_18};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-clamped-conditional-bit-shift/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-clamped-conditional-bit-shift/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..6248b33
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-clamped-conditional-bit-shift/1.spvasm.expected.spvasm
@@ -0,0 +1,716 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 463
+; Schema: 0
+               OpCapability Shader
+        %174 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %data "data"
+               OpName %temp "temp"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_34 "x_34"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %merge_i1_i1_i1_ "merge_i1_i1_i1_"
+               OpName %from "from"
+               OpName %mid "mid"
+               OpName %to "to"
+               OpName %k "k"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %i_1 "i_1"
+               OpName %func_i1_i1_ "func_i1_i1_"
+               OpName %m "m"
+               OpName %high "high"
+               OpName %x "x"
+               OpName %x_335 "x_335"
+               OpName %x_336 "x_336"
+               OpName %mergeSort_ "mergeSort_"
+               OpName %low "low"
+               OpName %high_1 "high_1"
+               OpName %m_1 "m_1"
+               OpName %i_2 "i_2"
+               OpName %from_1 "from_1"
+               OpName %mid_1 "mid_1"
+               OpName %to_1 "to_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %param_4 "param_4"
+               OpName %main_1 "main_1"
+               OpName %i_3 "i_3"
+               OpName %j_1 "j_1"
+               OpName %grey "grey"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_34 NonWritable
+               OpDecorate %x_34 DescriptorSet 0
+               OpDecorate %x_34 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Private__arr_int_uint_10 = OpTypePointer Private %_arr_int_uint_10
+          %7 = OpConstantNull %_arr_int_uint_10
+       %data = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+       %temp = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %13 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %13
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_34 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %13
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %13
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int %_ptr_Function_int
+         %32 = OpConstantNull %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+%_ptr_Private_int = OpTypePointer Private %int
+     %int_10 = OpConstant %int 10
+        %132 = OpTypeFunction %int %_ptr_Function_int %_ptr_Function_int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+      %false = OpConstantFalse %bool
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+      %int_2 = OpConstant %int 2
+        %180 = OpTypeFunction %void
+      %int_9 = OpConstant %int 9
+%_ptr_Function_float = OpTypePointer Function %float
+        %251 = OpConstantNull %float
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %int_n5 = OpConstant %int -5
+     %int_n4 = OpConstant %int -4
+     %int_n3 = OpConstant %int -3
+     %int_n2 = OpConstant %int -2
+     %int_n1 = OpConstant %int -1
+      %int_3 = OpConstant %int 3
+     %uint_1 = OpConstant %uint 1
+     %int_30 = OpConstant %int 30
+  %float_0_5 = OpConstant %float 0.5
+   %float_10 = OpConstant %float 10
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+    %v3float = OpTypeVector %float 3
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %450 = OpTypeFunction %void %main_out
+%merge_i1_i1_i1_ = OpFunction %void None %23
+       %from = OpFunctionParameter %_ptr_Function_int
+        %mid = OpFunctionParameter %_ptr_Function_int
+         %to = OpFunctionParameter %_ptr_Function_int
+         %30 = OpLabel
+          %k = OpVariable %_ptr_Function_int Function %32
+          %i = OpVariable %_ptr_Function_int Function %32
+          %j = OpVariable %_ptr_Function_int Function %32
+        %i_1 = OpVariable %_ptr_Function_int Function %32
+         %37 = OpLoad %int %from
+               OpStore %k %37
+         %39 = OpLoad %int %from
+               OpStore %i %39
+         %41 = OpLoad %int %mid
+         %43 = OpIAdd %int %41 %int_1
+               OpStore %j %43
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %48 = OpLoad %int %i
+         %50 = OpLoad %int %mid
+         %51 = OpLoad %int %j
+         %53 = OpLoad %int %to
+         %54 = OpSLessThanEqual %bool %48 %50
+               OpSelectionMerge %56 None
+               OpBranchConditional %54 %57 %56
+         %57 = OpLabel
+         %58 = OpSLessThanEqual %bool %51 %53
+               OpBranch %56
+         %56 = OpLabel
+         %59 = OpPhi %bool %54 %47 %58 %57
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %62
+         %61 = OpLabel
+               OpBranch %60
+         %62 = OpLabel
+               OpBranch %45
+         %60 = OpLabel
+         %63 = OpLoad %int %i
+         %65 = OpAccessChain %_ptr_Private_int %data %63
+         %66 = OpLoad %int %65
+         %67 = OpLoad %int %j
+         %68 = OpAccessChain %_ptr_Private_int %data %67
+         %69 = OpLoad %int %68
+         %70 = OpSLessThan %bool %66 %69
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %73
+         %72 = OpLabel
+         %74 = OpLoad %int %k
+         %75 = OpIAdd %int %74 %int_1
+               OpStore %k %75
+         %76 = OpLoad %int %i
+         %77 = OpIAdd %int %76 %int_1
+               OpStore %i %77
+         %78 = OpAccessChain %_ptr_Private_int %data %76
+         %79 = OpLoad %int %78
+         %80 = OpAccessChain %_ptr_Private_int %temp %74
+               OpStore %80 %79
+               OpBranch %71
+         %73 = OpLabel
+         %81 = OpLoad %int %k
+         %82 = OpIAdd %int %81 %int_1
+               OpStore %k %82
+         %83 = OpLoad %int %j
+         %84 = OpIAdd %int %83 %int_1
+               OpStore %j %84
+         %85 = OpAccessChain %_ptr_Private_int %data %83
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_Private_int %temp %81
+               OpStore %87 %86
+               OpBranch %71
+         %71 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+               OpBranch %44
+         %45 = OpLabel
+               OpBranch %88
+         %88 = OpLabel
+               OpLoopMerge %89 %90 None
+               OpBranch %91
+         %91 = OpLabel
+         %92 = OpLoad %int %i
+         %93 = OpLoad %int %i
+         %95 = OpLoad %int %mid
+         %97 = OpSLessThan %bool %92 %int_10
+               OpSelectionMerge %98 None
+               OpBranchConditional %97 %99 %98
+         %99 = OpLabel
+        %100 = OpSLessThanEqual %bool %93 %95
+               OpBranch %98
+         %98 = OpLabel
+        %101 = OpPhi %bool %97 %91 %100 %99
+               OpSelectionMerge %102 None
+               OpBranchConditional %101 %103 %104
+        %103 = OpLabel
+               OpBranch %102
+        %104 = OpLabel
+               OpBranch %89
+        %102 = OpLabel
+        %105 = OpLoad %int %k
+        %106 = OpIAdd %int %105 %int_1
+               OpStore %k %106
+        %107 = OpLoad %int %i
+        %108 = OpIAdd %int %107 %int_1
+               OpStore %i %108
+        %109 = OpAccessChain %_ptr_Private_int %data %107
+        %110 = OpLoad %int %109
+        %111 = OpAccessChain %_ptr_Private_int %temp %105
+               OpStore %111 %110
+               OpBranch %90
+         %90 = OpLabel
+               OpBranch %88
+         %89 = OpLabel
+        %113 = OpLoad %int %from
+               OpStore %i_1 %113
+               OpBranch %114
+        %114 = OpLabel
+               OpLoopMerge %115 %116 None
+               OpBranch %117
+        %117 = OpLabel
+        %118 = OpLoad %int %i_1
+        %120 = OpLoad %int %to
+        %121 = OpSLessThanEqual %bool %118 %120
+               OpSelectionMerge %122 None
+               OpBranchConditional %121 %123 %124
+        %123 = OpLabel
+               OpBranch %122
+        %124 = OpLabel
+               OpBranch %115
+        %122 = OpLabel
+        %125 = OpLoad %int %i_1
+        %126 = OpLoad %int %i_1
+        %127 = OpAccessChain %_ptr_Private_int %temp %126
+        %128 = OpLoad %int %127
+        %129 = OpAccessChain %_ptr_Private_int %data %125
+               OpStore %129 %128
+               OpBranch %116
+        %116 = OpLabel
+        %130 = OpLoad %int %i_1
+        %131 = OpIAdd %int %130 %int_1
+               OpStore %i_1 %131
+               OpBranch %114
+        %115 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%func_i1_i1_ = OpFunction %int None %132
+          %m = OpFunctionParameter %_ptr_Function_int
+       %high = OpFunctionParameter %_ptr_Function_int
+        %136 = OpLabel
+          %x = OpVariable %_ptr_Function_int Function %32
+      %x_335 = OpVariable %_ptr_Function_int Function %32
+      %x_336 = OpVariable %_ptr_Function_int Function %32
+        %142 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+        %143 = OpLoad %float %142
+        %145 = OpFOrdGreaterThanEqual %bool %143 %float_0
+               OpSelectionMerge %146 None
+               OpBranchConditional %145 %147 %148
+        %147 = OpLabel
+               OpSelectionMerge %150 None
+               OpBranchConditional %false %151 %152
+        %151 = OpLabel
+        %154 = OpLoad %int %high
+        %155 = OpBitcast %uint %int_0
+        %157 = OpShiftLeftLogical %int %154 %155
+               OpStore %x_336 %157
+               OpBranch %150
+        %152 = OpLabel
+               OpStore %x_336 %int_4
+               OpBranch %150
+        %150 = OpLabel
+        %159 = OpLoad %int %x_336
+        %160 = OpBitcast %uint %159
+        %161 = OpShiftLeftLogical %int %int_1 %160
+               OpStore %x_335 %161
+               OpBranch %146
+        %148 = OpLabel
+               OpStore %x_335 %int_1
+               OpBranch %146
+        %146 = OpLabel
+        %162 = OpLoad %int %x_335
+               OpStore %x %162
+        %163 = OpLoad %int %x
+        %164 = OpBitcast %uint %int_4
+        %165 = OpShiftRightArithmetic %int %163 %164
+               OpStore %x %165
+        %167 = OpLoad %int %m
+        %169 = OpLoad %int %m
+        %171 = OpLoad %int %m
+        %172 = OpLoad %int %x
+        %176 = OpIMul %int %int_2 %167
+        %177 = OpIMul %int %int_2 %169
+        %178 = OpIMul %int %int_2 %171
+        %179 = OpSDiv %int %178 %172
+        %173 = OpExtInst %int %174 SClamp %176 %177 %179
+               OpReturnValue %173
+               OpFunctionEnd
+ %mergeSort_ = OpFunction %void None %180
+        %182 = OpLabel
+        %low = OpVariable %_ptr_Function_int Function %32
+     %high_1 = OpVariable %_ptr_Function_int Function %32
+        %m_1 = OpVariable %_ptr_Function_int Function %32
+        %i_2 = OpVariable %_ptr_Function_int Function %32
+     %from_1 = OpVariable %_ptr_Function_int Function %32
+      %mid_1 = OpVariable %_ptr_Function_int Function %32
+       %to_1 = OpVariable %_ptr_Function_int Function %32
+      %param = OpVariable %_ptr_Function_int Function %32
+    %param_1 = OpVariable %_ptr_Function_int Function %32
+    %param_2 = OpVariable %_ptr_Function_int Function %32
+    %param_3 = OpVariable %_ptr_Function_int Function %32
+    %param_4 = OpVariable %_ptr_Function_int Function %32
+               OpStore %low %int_0
+               OpStore %high_1 %int_9
+               OpStore %m_1 %int_1
+               OpBranch %196
+        %196 = OpLabel
+               OpLoopMerge %197 %198 None
+               OpBranch %199
+        %199 = OpLabel
+        %200 = OpLoad %int %m_1
+        %201 = OpLoad %int %high_1
+        %202 = OpSLessThanEqual %bool %200 %201
+               OpSelectionMerge %203 None
+               OpBranchConditional %202 %204 %205
+        %204 = OpLabel
+               OpBranch %203
+        %205 = OpLabel
+               OpBranch %197
+        %203 = OpLabel
+        %206 = OpLoad %int %low
+               OpStore %i_2 %206
+               OpBranch %207
+        %207 = OpLabel
+               OpLoopMerge %208 %209 None
+               OpBranch %210
+        %210 = OpLabel
+        %211 = OpLoad %int %i_2
+        %212 = OpLoad %int %high_1
+        %213 = OpSLessThan %bool %211 %212
+               OpSelectionMerge %214 None
+               OpBranchConditional %213 %215 %216
+        %215 = OpLabel
+               OpBranch %214
+        %216 = OpLabel
+               OpBranch %208
+        %214 = OpLabel
+        %217 = OpLoad %int %i_2
+               OpStore %from_1 %217
+        %218 = OpLoad %int %i_2
+        %219 = OpLoad %int %m_1
+        %220 = OpIAdd %int %218 %219
+        %221 = OpISub %int %220 %int_1
+               OpStore %mid_1 %221
+        %222 = OpLoad %int %i_2
+        %223 = OpLoad %int %m_1
+        %224 = OpLoad %int %high_1
+        %226 = OpIMul %int %int_2 %223
+        %227 = OpIAdd %int %222 %226
+        %228 = OpISub %int %227 %int_1
+        %225 = OpExtInst %int %174 SMin %228 %224
+               OpStore %to_1 %225
+        %229 = OpLoad %int %from_1
+               OpStore %param %229
+        %230 = OpLoad %int %mid_1
+               OpStore %param_1 %230
+        %231 = OpLoad %int %to_1
+               OpStore %param_2 %231
+        %232 = OpFunctionCall %void %merge_i1_i1_i1_ %param %param_1 %param_2
+               OpBranch %209
+        %209 = OpLabel
+        %236 = OpLoad %int %m_1
+               OpStore %param_3 %236
+        %237 = OpLoad %int %high_1
+               OpStore %param_4 %237
+        %238 = OpFunctionCall %int %func_i1_i1_ %param_3 %param_4
+        %241 = OpLoad %int %i_2
+        %242 = OpIAdd %int %241 %238
+               OpStore %i_2 %242
+               OpBranch %207
+        %208 = OpLabel
+               OpBranch %198
+        %198 = OpLabel
+        %243 = OpLoad %int %m_1
+        %244 = OpIMul %int %int_2 %243
+               OpStore %m_1 %244
+               OpBranch %196
+        %197 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %180
+        %246 = OpLabel
+        %i_3 = OpVariable %_ptr_Function_int Function %32
+        %j_1 = OpVariable %_ptr_Function_int Function %32
+       %grey = OpVariable %_ptr_Function_float Function %251
+        %253 = OpAccessChain %_ptr_Uniform_float %x_34 %uint_0 %uint_0
+        %254 = OpLoad %float %253
+        %255 = OpConvertFToS %int %254
+               OpStore %i_3 %255
+               OpBranch %256
+        %256 = OpLabel
+               OpLoopMerge %257 %258 None
+               OpBranch %259
+        %259 = OpLabel
+        %260 = OpLoad %int %i_3
+               OpSelectionMerge %261 None
+               OpSwitch %260 %262 9 %263 8 %264 7 %265 6 %266 5 %267 4 %268 3 %269 2 %270 1 %271 0 %272
+        %263 = OpLabel
+        %273 = OpLoad %int %i_3
+        %274 = OpAccessChain %_ptr_Private_int %data %273
+               OpStore %274 %int_n5
+               OpBranch %261
+        %264 = OpLabel
+        %276 = OpLoad %int %i_3
+        %277 = OpAccessChain %_ptr_Private_int %data %276
+               OpStore %277 %int_n4
+               OpBranch %261
+        %265 = OpLabel
+        %279 = OpLoad %int %i_3
+        %280 = OpAccessChain %_ptr_Private_int %data %279
+               OpStore %280 %int_n3
+               OpBranch %261
+        %266 = OpLabel
+        %282 = OpLoad %int %i_3
+        %283 = OpAccessChain %_ptr_Private_int %data %282
+               OpStore %283 %int_n2
+               OpBranch %261
+        %267 = OpLabel
+        %285 = OpLoad %int %i_3
+        %286 = OpAccessChain %_ptr_Private_int %data %285
+               OpStore %286 %int_n1
+               OpBranch %261
+        %268 = OpLabel
+        %288 = OpLoad %int %i_3
+        %289 = OpAccessChain %_ptr_Private_int %data %288
+               OpStore %289 %int_0
+               OpBranch %261
+        %269 = OpLabel
+        %290 = OpLoad %int %i_3
+        %291 = OpAccessChain %_ptr_Private_int %data %290
+               OpStore %291 %int_1
+               OpBranch %261
+        %270 = OpLabel
+        %292 = OpLoad %int %i_3
+        %293 = OpAccessChain %_ptr_Private_int %data %292
+               OpStore %293 %int_2
+               OpBranch %261
+        %271 = OpLabel
+        %294 = OpLoad %int %i_3
+        %295 = OpAccessChain %_ptr_Private_int %data %294
+               OpStore %295 %int_3
+               OpBranch %261
+        %272 = OpLabel
+        %297 = OpLoad %int %i_3
+        %298 = OpAccessChain %_ptr_Private_int %data %297
+               OpStore %298 %int_4
+               OpBranch %261
+        %262 = OpLabel
+               OpBranch %261
+        %261 = OpLabel
+        %299 = OpLoad %int %i_3
+        %300 = OpIAdd %int %299 %int_1
+               OpStore %i_3 %300
+               OpBranch %258
+        %258 = OpLabel
+        %301 = OpLoad %int %i_3
+        %302 = OpSLessThan %bool %301 %int_10
+               OpSelectionMerge %303 None
+               OpBranchConditional %302 %304 %305
+        %304 = OpLabel
+               OpBranch %303
+        %305 = OpLabel
+               OpBranch %257
+        %303 = OpLabel
+               OpBranch %256
+        %257 = OpLabel
+               OpStore %j_1 %int_0
+               OpBranch %306
+        %306 = OpLabel
+               OpLoopMerge %307 %308 None
+               OpBranch %309
+        %309 = OpLabel
+        %310 = OpLoad %int %j_1
+        %311 = OpSLessThan %bool %310 %int_10
+               OpSelectionMerge %312 None
+               OpBranchConditional %311 %313 %314
+        %313 = OpLabel
+               OpBranch %312
+        %314 = OpLabel
+               OpBranch %307
+        %312 = OpLabel
+        %315 = OpLoad %int %j_1
+        %316 = OpLoad %int %j_1
+        %317 = OpAccessChain %_ptr_Private_int %data %316
+        %318 = OpLoad %int %317
+        %319 = OpAccessChain %_ptr_Private_int %temp %315
+               OpStore %319 %318
+               OpBranch %308
+        %308 = OpLabel
+        %320 = OpLoad %int %j_1
+        %321 = OpIAdd %int %320 %int_1
+               OpStore %j_1 %321
+               OpBranch %306
+        %307 = OpLabel
+        %322 = OpFunctionCall %void %mergeSort_
+        %324 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %325 = OpLoad %float %324
+        %326 = OpConvertFToS %int %325
+        %328 = OpSLessThan %bool %326 %int_30
+               OpSelectionMerge %329 None
+               OpBranchConditional %328 %330 %331
+        %330 = OpLabel
+        %332 = OpAccessChain %_ptr_Private_int %data %int_0
+        %333 = OpLoad %int %332
+        %335 = OpConvertSToF %float %333
+        %337 = OpFDiv %float %335 %float_10
+        %338 = OpFAdd %float %float_0_5 %337
+               OpStore %grey %338
+               OpBranch %329
+        %331 = OpLabel
+        %339 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %340 = OpLoad %float %339
+        %341 = OpConvertFToS %int %340
+        %343 = OpSLessThan %bool %341 %int_60
+               OpSelectionMerge %344 None
+               OpBranchConditional %343 %345 %346
+        %345 = OpLabel
+        %347 = OpAccessChain %_ptr_Private_int %data %int_1
+        %348 = OpLoad %int %347
+        %349 = OpConvertSToF %float %348
+        %350 = OpFDiv %float %349 %float_10
+        %351 = OpFAdd %float %float_0_5 %350
+               OpStore %grey %351
+               OpBranch %344
+        %346 = OpLabel
+        %352 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %353 = OpLoad %float %352
+        %354 = OpConvertFToS %int %353
+        %356 = OpSLessThan %bool %354 %int_90
+               OpSelectionMerge %357 None
+               OpBranchConditional %356 %358 %359
+        %358 = OpLabel
+        %360 = OpAccessChain %_ptr_Private_int %data %int_2
+        %361 = OpLoad %int %360
+        %362 = OpConvertSToF %float %361
+        %363 = OpFDiv %float %362 %float_10
+        %364 = OpFAdd %float %float_0_5 %363
+               OpStore %grey %364
+               OpBranch %357
+        %359 = OpLabel
+        %365 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %366 = OpLoad %float %365
+        %367 = OpConvertFToS %int %366
+        %369 = OpSLessThan %bool %367 %int_120
+               OpSelectionMerge %370 None
+               OpBranchConditional %369 %371 %372
+        %371 = OpLabel
+        %373 = OpAccessChain %_ptr_Private_int %data %int_3
+        %374 = OpLoad %int %373
+        %375 = OpConvertSToF %float %374
+        %376 = OpFDiv %float %375 %float_10
+        %377 = OpFAdd %float %float_0_5 %376
+               OpStore %grey %377
+               OpBranch %370
+        %372 = OpLabel
+        %378 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %379 = OpLoad %float %378
+        %380 = OpConvertFToS %int %379
+        %382 = OpSLessThan %bool %380 %int_150
+               OpSelectionMerge %383 None
+               OpBranchConditional %382 %384 %385
+        %384 = OpLabel
+               OpKill
+        %385 = OpLabel
+        %386 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %387 = OpLoad %float %386
+        %388 = OpConvertFToS %int %387
+        %390 = OpSLessThan %bool %388 %int_180
+               OpSelectionMerge %391 None
+               OpBranchConditional %390 %392 %393
+        %392 = OpLabel
+        %395 = OpAccessChain %_ptr_Private_int %data %int_5
+        %396 = OpLoad %int %395
+        %397 = OpConvertSToF %float %396
+        %398 = OpFDiv %float %397 %float_10
+        %399 = OpFAdd %float %float_0_5 %398
+               OpStore %grey %399
+               OpBranch %391
+        %393 = OpLabel
+        %400 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %401 = OpLoad %float %400
+        %402 = OpConvertFToS %int %401
+        %404 = OpSLessThan %bool %402 %int_210
+               OpSelectionMerge %405 None
+               OpBranchConditional %404 %406 %407
+        %406 = OpLabel
+        %409 = OpAccessChain %_ptr_Private_int %data %int_6
+        %410 = OpLoad %int %409
+        %411 = OpConvertSToF %float %410
+        %412 = OpFDiv %float %411 %float_10
+        %413 = OpFAdd %float %float_0_5 %412
+               OpStore %grey %413
+               OpBranch %405
+        %407 = OpLabel
+        %414 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %415 = OpLoad %float %414
+        %416 = OpConvertFToS %int %415
+        %418 = OpSLessThan %bool %416 %int_240
+               OpSelectionMerge %419 None
+               OpBranchConditional %418 %420 %421
+        %420 = OpLabel
+        %423 = OpAccessChain %_ptr_Private_int %data %int_7
+        %424 = OpLoad %int %423
+        %425 = OpConvertSToF %float %424
+        %426 = OpFDiv %float %425 %float_10
+        %427 = OpFAdd %float %float_0_5 %426
+               OpStore %grey %427
+               OpBranch %419
+        %421 = OpLabel
+        %428 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %429 = OpLoad %float %428
+        %430 = OpConvertFToS %int %429
+        %432 = OpSLessThan %bool %430 %int_270
+               OpSelectionMerge %433 None
+               OpBranchConditional %432 %434 %435
+        %434 = OpLabel
+        %437 = OpAccessChain %_ptr_Private_int %data %int_8
+        %438 = OpLoad %int %437
+        %439 = OpConvertSToF %float %438
+        %440 = OpFDiv %float %439 %float_10
+        %441 = OpFAdd %float %float_0_5 %440
+               OpStore %grey %441
+               OpBranch %433
+        %435 = OpLabel
+               OpKill
+        %433 = OpLabel
+               OpBranch %419
+        %419 = OpLabel
+               OpBranch %405
+        %405 = OpLabel
+               OpBranch %391
+        %391 = OpLabel
+               OpBranch %383
+        %383 = OpLabel
+               OpBranch %370
+        %370 = OpLabel
+               OpBranch %357
+        %357 = OpLabel
+               OpBranch %344
+        %344 = OpLabel
+               OpBranch %329
+        %329 = OpLabel
+        %442 = OpLoad %float %grey
+        %444 = OpCompositeConstruct %v3float %442 %442 %442
+        %445 = OpCompositeExtract %float %444 0
+        %446 = OpCompositeExtract %float %444 1
+        %447 = OpCompositeExtract %float %444 2
+        %449 = OpCompositeConstruct %v4float %445 %446 %447 %float_1
+               OpStore %x_GLF_color %449
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %450
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %454 = OpLabel
+        %455 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %455
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %180
+        %457 = OpLabel
+        %458 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %458
+        %459 = OpFunctionCall %void %main_1
+        %461 = OpLoad %v4float %x_GLF_color
+        %462 = OpCompositeConstruct %main_out %461
+        %460 = OpFunctionCall %void %tint_symbol_3 %462
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 258[%258] is not post dominated by the back-edge block 303[%303]
+  %303 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-clamped-conditional-bit-shift/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-clamped-conditional-bit-shift/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..460ad4b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-clamped-conditional-bit-shift/1.spvasm.expected.wgsl
@@ -0,0 +1,340 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> data : array<i32, 10>;
+
+var<private> temp : array<i32, 10>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_34 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn merge_i1_i1_i1_(from : ptr<function, i32>, mid : ptr<function, i32>, to : ptr<function, i32>) {
+  var k : i32;
+  var i : i32;
+  var j : i32;
+  var i_1 : i32;
+  let x_260 : i32 = *(from);
+  k = x_260;
+  let x_261 : i32 = *(from);
+  i = x_261;
+  let x_262 : i32 = *(mid);
+  j = (x_262 + 1);
+  loop {
+    let x_268 : i32 = i;
+    let x_269 : i32 = *(mid);
+    let x_271 : i32 = j;
+    let x_272 : i32 = *(to);
+    if (((x_268 <= x_269) && (x_271 <= x_272))) {
+    } else {
+      break;
+    }
+    let x_276 : i32 = i;
+    let x_278 : i32 = data[x_276];
+    let x_279 : i32 = j;
+    let x_281 : i32 = data[x_279];
+    if ((x_278 < x_281)) {
+      let x_286 : i32 = k;
+      k = (x_286 + 1);
+      let x_288 : i32 = i;
+      i = (x_288 + 1);
+      let x_291 : i32 = data[x_288];
+      temp[x_286] = x_291;
+    } else {
+      let x_293 : i32 = k;
+      k = (x_293 + 1);
+      let x_295 : i32 = j;
+      j = (x_295 + 1);
+      let x_298 : i32 = data[x_295];
+      temp[x_293] = x_298;
+    }
+  }
+  loop {
+    let x_304 : i32 = i;
+    let x_306 : i32 = i;
+    let x_307 : i32 = *(mid);
+    if (((x_304 < 10) && (x_306 <= x_307))) {
+    } else {
+      break;
+    }
+    let x_311 : i32 = k;
+    k = (x_311 + 1);
+    let x_313 : i32 = i;
+    i = (x_313 + 1);
+    let x_316 : i32 = data[x_313];
+    temp[x_311] = x_316;
+  }
+  let x_318 : i32 = *(from);
+  i_1 = x_318;
+  loop {
+    let x_323 : i32 = i_1;
+    let x_324 : i32 = *(to);
+    if ((x_323 <= x_324)) {
+    } else {
+      break;
+    }
+    let x_327 : i32 = i_1;
+    let x_328 : i32 = i_1;
+    let x_330 : i32 = temp[x_328];
+    data[x_327] = x_330;
+
+    continuing {
+      let x_332 : i32 = i_1;
+      i_1 = (x_332 + 1);
+    }
+  }
+  return;
+}
+
+fn func_i1_i1_(m : ptr<function, i32>, high : ptr<function, i32>) -> i32 {
+  var x : i32;
+  var x_335 : i32;
+  var x_336 : i32;
+  let x_338 : f32 = gl_FragCoord.x;
+  if ((x_338 >= 0.0)) {
+    if (false) {
+      let x_346 : i32 = *(high);
+      x_336 = (x_346 << bitcast<u32>(0));
+    } else {
+      x_336 = 4;
+    }
+    let x_348 : i32 = x_336;
+    x_335 = (1 << bitcast<u32>(x_348));
+  } else {
+    x_335 = 1;
+  }
+  let x_350 : i32 = x_335;
+  x = x_350;
+  let x_351 : i32 = x;
+  x = (x_351 >> bitcast<u32>(4));
+  let x_353 : i32 = *(m);
+  let x_355 : i32 = *(m);
+  let x_357 : i32 = *(m);
+  let x_359 : i32 = x;
+  return clamp((2 * x_353), (2 * x_355), ((2 * x_357) / x_359));
+}
+
+fn mergeSort_() {
+  var low : i32;
+  var high_1 : i32;
+  var m_1 : i32;
+  var i_2 : i32;
+  var from_1 : i32;
+  var mid_1 : i32;
+  var to_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  var param_3 : i32;
+  var param_4 : i32;
+  low = 0;
+  high_1 = 9;
+  m_1 = 1;
+  loop {
+    let x_367 : i32 = m_1;
+    let x_368 : i32 = high_1;
+    if ((x_367 <= x_368)) {
+    } else {
+      break;
+    }
+    let x_371 : i32 = low;
+    i_2 = x_371;
+    loop {
+      let x_376 : i32 = i_2;
+      let x_377 : i32 = high_1;
+      if ((x_376 < x_377)) {
+      } else {
+        break;
+      }
+      let x_380 : i32 = i_2;
+      from_1 = x_380;
+      let x_381 : i32 = i_2;
+      let x_382 : i32 = m_1;
+      mid_1 = ((x_381 + x_382) - 1);
+      let x_385 : i32 = i_2;
+      let x_386 : i32 = m_1;
+      let x_390 : i32 = high_1;
+      to_1 = min(((x_385 + (2 * x_386)) - 1), x_390);
+      let x_392 : i32 = from_1;
+      param = x_392;
+      let x_393 : i32 = mid_1;
+      param_1 = x_393;
+      let x_394 : i32 = to_1;
+      param_2 = x_394;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2));
+
+      continuing {
+        let x_396 : i32 = m_1;
+        param_3 = x_396;
+        let x_397 : i32 = high_1;
+        param_4 = x_397;
+        let x_398 : i32 = func_i1_i1_(&(param_3), &(param_4));
+        let x_399 : i32 = i_2;
+        i_2 = (x_399 + x_398);
+      }
+    }
+
+    continuing {
+      let x_401 : i32 = m_1;
+      m_1 = (2 * x_401);
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_3 : i32;
+  var j_1 : i32;
+  var grey : f32;
+  let x_93 : f32 = x_34.injectionSwitch.x;
+  i_3 = i32(x_93);
+  loop {
+    let x_99 : i32 = i_3;
+    switch(x_99) {
+      case 9: {
+        let x_129 : i32 = i_3;
+        data[x_129] = -5;
+      }
+      case 8: {
+        let x_127 : i32 = i_3;
+        data[x_127] = -4;
+      }
+      case 7: {
+        let x_125 : i32 = i_3;
+        data[x_125] = -3;
+      }
+      case 6: {
+        let x_123 : i32 = i_3;
+        data[x_123] = -2;
+      }
+      case 5: {
+        let x_121 : i32 = i_3;
+        data[x_121] = -1;
+      }
+      case 4: {
+        let x_119 : i32 = i_3;
+        data[x_119] = 0;
+      }
+      case 3: {
+        let x_117 : i32 = i_3;
+        data[x_117] = 1;
+      }
+      case 2: {
+        let x_115 : i32 = i_3;
+        data[x_115] = 2;
+      }
+      case 1: {
+        let x_113 : i32 = i_3;
+        data[x_113] = 3;
+      }
+      case 0: {
+        let x_111 : i32 = i_3;
+        data[x_111] = 4;
+      }
+      default: {
+      }
+    }
+    let x_131 : i32 = i_3;
+    i_3 = (x_131 + 1);
+
+    continuing {
+      let x_133 : i32 = i_3;
+      if ((x_133 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  loop {
+    let x_139 : i32 = j_1;
+    if ((x_139 < 10)) {
+    } else {
+      break;
+    }
+    let x_142 : i32 = j_1;
+    let x_143 : i32 = j_1;
+    let x_145 : i32 = data[x_143];
+    temp[x_142] = x_145;
+
+    continuing {
+      let x_147 : i32 = j_1;
+      j_1 = (x_147 + 1);
+    }
+  }
+  mergeSort_();
+  let x_151 : f32 = gl_FragCoord.y;
+  if ((i32(x_151) < 30)) {
+    let x_158 : i32 = data[0];
+    grey = (0.5 + (f32(x_158) / 10.0));
+  } else {
+    let x_163 : f32 = gl_FragCoord.y;
+    if ((i32(x_163) < 60)) {
+      let x_170 : i32 = data[1];
+      grey = (0.5 + (f32(x_170) / 10.0));
+    } else {
+      let x_175 : f32 = gl_FragCoord.y;
+      if ((i32(x_175) < 90)) {
+        let x_182 : i32 = data[2];
+        grey = (0.5 + (f32(x_182) / 10.0));
+      } else {
+        let x_187 : f32 = gl_FragCoord.y;
+        if ((i32(x_187) < 120)) {
+          let x_194 : i32 = data[3];
+          grey = (0.5 + (f32(x_194) / 10.0));
+        } else {
+          let x_199 : f32 = gl_FragCoord.y;
+          if ((i32(x_199) < 150)) {
+            discard;
+          } else {
+            let x_206 : f32 = gl_FragCoord.y;
+            if ((i32(x_206) < 180)) {
+              let x_213 : i32 = data[5];
+              grey = (0.5 + (f32(x_213) / 10.0));
+            } else {
+              let x_218 : f32 = gl_FragCoord.y;
+              if ((i32(x_218) < 210)) {
+                let x_225 : i32 = data[6];
+                grey = (0.5 + (f32(x_225) / 10.0));
+              } else {
+                let x_230 : f32 = gl_FragCoord.y;
+                if ((i32(x_230) < 240)) {
+                  let x_237 : i32 = data[7];
+                  grey = (0.5 + (f32(x_237) / 10.0));
+                } else {
+                  let x_242 : f32 = gl_FragCoord.y;
+                  if ((i32(x_242) < 270)) {
+                    let x_249 : i32 = data[8];
+                    grey = (0.5 + (f32(x_249) / 10.0));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  let x_253 : f32 = grey;
+  let x_254 : vec3<f32> = vec3<f32>(x_253, x_253, x_253);
+  x_GLF_color = vec4<f32>(x_254.x, x_254.y, x_254.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-clamped-conditional-bit-shift/1.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-clamped-conditional-bit-shift/1.wgsl
new file mode 100644
index 0000000..460ad4b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-clamped-conditional-bit-shift/1.wgsl
@@ -0,0 +1,340 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> data : array<i32, 10>;
+
+var<private> temp : array<i32, 10>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_34 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn merge_i1_i1_i1_(from : ptr<function, i32>, mid : ptr<function, i32>, to : ptr<function, i32>) {
+  var k : i32;
+  var i : i32;
+  var j : i32;
+  var i_1 : i32;
+  let x_260 : i32 = *(from);
+  k = x_260;
+  let x_261 : i32 = *(from);
+  i = x_261;
+  let x_262 : i32 = *(mid);
+  j = (x_262 + 1);
+  loop {
+    let x_268 : i32 = i;
+    let x_269 : i32 = *(mid);
+    let x_271 : i32 = j;
+    let x_272 : i32 = *(to);
+    if (((x_268 <= x_269) && (x_271 <= x_272))) {
+    } else {
+      break;
+    }
+    let x_276 : i32 = i;
+    let x_278 : i32 = data[x_276];
+    let x_279 : i32 = j;
+    let x_281 : i32 = data[x_279];
+    if ((x_278 < x_281)) {
+      let x_286 : i32 = k;
+      k = (x_286 + 1);
+      let x_288 : i32 = i;
+      i = (x_288 + 1);
+      let x_291 : i32 = data[x_288];
+      temp[x_286] = x_291;
+    } else {
+      let x_293 : i32 = k;
+      k = (x_293 + 1);
+      let x_295 : i32 = j;
+      j = (x_295 + 1);
+      let x_298 : i32 = data[x_295];
+      temp[x_293] = x_298;
+    }
+  }
+  loop {
+    let x_304 : i32 = i;
+    let x_306 : i32 = i;
+    let x_307 : i32 = *(mid);
+    if (((x_304 < 10) && (x_306 <= x_307))) {
+    } else {
+      break;
+    }
+    let x_311 : i32 = k;
+    k = (x_311 + 1);
+    let x_313 : i32 = i;
+    i = (x_313 + 1);
+    let x_316 : i32 = data[x_313];
+    temp[x_311] = x_316;
+  }
+  let x_318 : i32 = *(from);
+  i_1 = x_318;
+  loop {
+    let x_323 : i32 = i_1;
+    let x_324 : i32 = *(to);
+    if ((x_323 <= x_324)) {
+    } else {
+      break;
+    }
+    let x_327 : i32 = i_1;
+    let x_328 : i32 = i_1;
+    let x_330 : i32 = temp[x_328];
+    data[x_327] = x_330;
+
+    continuing {
+      let x_332 : i32 = i_1;
+      i_1 = (x_332 + 1);
+    }
+  }
+  return;
+}
+
+fn func_i1_i1_(m : ptr<function, i32>, high : ptr<function, i32>) -> i32 {
+  var x : i32;
+  var x_335 : i32;
+  var x_336 : i32;
+  let x_338 : f32 = gl_FragCoord.x;
+  if ((x_338 >= 0.0)) {
+    if (false) {
+      let x_346 : i32 = *(high);
+      x_336 = (x_346 << bitcast<u32>(0));
+    } else {
+      x_336 = 4;
+    }
+    let x_348 : i32 = x_336;
+    x_335 = (1 << bitcast<u32>(x_348));
+  } else {
+    x_335 = 1;
+  }
+  let x_350 : i32 = x_335;
+  x = x_350;
+  let x_351 : i32 = x;
+  x = (x_351 >> bitcast<u32>(4));
+  let x_353 : i32 = *(m);
+  let x_355 : i32 = *(m);
+  let x_357 : i32 = *(m);
+  let x_359 : i32 = x;
+  return clamp((2 * x_353), (2 * x_355), ((2 * x_357) / x_359));
+}
+
+fn mergeSort_() {
+  var low : i32;
+  var high_1 : i32;
+  var m_1 : i32;
+  var i_2 : i32;
+  var from_1 : i32;
+  var mid_1 : i32;
+  var to_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  var param_3 : i32;
+  var param_4 : i32;
+  low = 0;
+  high_1 = 9;
+  m_1 = 1;
+  loop {
+    let x_367 : i32 = m_1;
+    let x_368 : i32 = high_1;
+    if ((x_367 <= x_368)) {
+    } else {
+      break;
+    }
+    let x_371 : i32 = low;
+    i_2 = x_371;
+    loop {
+      let x_376 : i32 = i_2;
+      let x_377 : i32 = high_1;
+      if ((x_376 < x_377)) {
+      } else {
+        break;
+      }
+      let x_380 : i32 = i_2;
+      from_1 = x_380;
+      let x_381 : i32 = i_2;
+      let x_382 : i32 = m_1;
+      mid_1 = ((x_381 + x_382) - 1);
+      let x_385 : i32 = i_2;
+      let x_386 : i32 = m_1;
+      let x_390 : i32 = high_1;
+      to_1 = min(((x_385 + (2 * x_386)) - 1), x_390);
+      let x_392 : i32 = from_1;
+      param = x_392;
+      let x_393 : i32 = mid_1;
+      param_1 = x_393;
+      let x_394 : i32 = to_1;
+      param_2 = x_394;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2));
+
+      continuing {
+        let x_396 : i32 = m_1;
+        param_3 = x_396;
+        let x_397 : i32 = high_1;
+        param_4 = x_397;
+        let x_398 : i32 = func_i1_i1_(&(param_3), &(param_4));
+        let x_399 : i32 = i_2;
+        i_2 = (x_399 + x_398);
+      }
+    }
+
+    continuing {
+      let x_401 : i32 = m_1;
+      m_1 = (2 * x_401);
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_3 : i32;
+  var j_1 : i32;
+  var grey : f32;
+  let x_93 : f32 = x_34.injectionSwitch.x;
+  i_3 = i32(x_93);
+  loop {
+    let x_99 : i32 = i_3;
+    switch(x_99) {
+      case 9: {
+        let x_129 : i32 = i_3;
+        data[x_129] = -5;
+      }
+      case 8: {
+        let x_127 : i32 = i_3;
+        data[x_127] = -4;
+      }
+      case 7: {
+        let x_125 : i32 = i_3;
+        data[x_125] = -3;
+      }
+      case 6: {
+        let x_123 : i32 = i_3;
+        data[x_123] = -2;
+      }
+      case 5: {
+        let x_121 : i32 = i_3;
+        data[x_121] = -1;
+      }
+      case 4: {
+        let x_119 : i32 = i_3;
+        data[x_119] = 0;
+      }
+      case 3: {
+        let x_117 : i32 = i_3;
+        data[x_117] = 1;
+      }
+      case 2: {
+        let x_115 : i32 = i_3;
+        data[x_115] = 2;
+      }
+      case 1: {
+        let x_113 : i32 = i_3;
+        data[x_113] = 3;
+      }
+      case 0: {
+        let x_111 : i32 = i_3;
+        data[x_111] = 4;
+      }
+      default: {
+      }
+    }
+    let x_131 : i32 = i_3;
+    i_3 = (x_131 + 1);
+
+    continuing {
+      let x_133 : i32 = i_3;
+      if ((x_133 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  loop {
+    let x_139 : i32 = j_1;
+    if ((x_139 < 10)) {
+    } else {
+      break;
+    }
+    let x_142 : i32 = j_1;
+    let x_143 : i32 = j_1;
+    let x_145 : i32 = data[x_143];
+    temp[x_142] = x_145;
+
+    continuing {
+      let x_147 : i32 = j_1;
+      j_1 = (x_147 + 1);
+    }
+  }
+  mergeSort_();
+  let x_151 : f32 = gl_FragCoord.y;
+  if ((i32(x_151) < 30)) {
+    let x_158 : i32 = data[0];
+    grey = (0.5 + (f32(x_158) / 10.0));
+  } else {
+    let x_163 : f32 = gl_FragCoord.y;
+    if ((i32(x_163) < 60)) {
+      let x_170 : i32 = data[1];
+      grey = (0.5 + (f32(x_170) / 10.0));
+    } else {
+      let x_175 : f32 = gl_FragCoord.y;
+      if ((i32(x_175) < 90)) {
+        let x_182 : i32 = data[2];
+        grey = (0.5 + (f32(x_182) / 10.0));
+      } else {
+        let x_187 : f32 = gl_FragCoord.y;
+        if ((i32(x_187) < 120)) {
+          let x_194 : i32 = data[3];
+          grey = (0.5 + (f32(x_194) / 10.0));
+        } else {
+          let x_199 : f32 = gl_FragCoord.y;
+          if ((i32(x_199) < 150)) {
+            discard;
+          } else {
+            let x_206 : f32 = gl_FragCoord.y;
+            if ((i32(x_206) < 180)) {
+              let x_213 : i32 = data[5];
+              grey = (0.5 + (f32(x_213) / 10.0));
+            } else {
+              let x_218 : f32 = gl_FragCoord.y;
+              if ((i32(x_218) < 210)) {
+                let x_225 : i32 = data[6];
+                grey = (0.5 + (f32(x_225) / 10.0));
+              } else {
+                let x_230 : f32 = gl_FragCoord.y;
+                if ((i32(x_230) < 240)) {
+                  let x_237 : i32 = data[7];
+                  grey = (0.5 + (f32(x_237) / 10.0));
+                } else {
+                  let x_242 : f32 = gl_FragCoord.y;
+                  if ((i32(x_242) < 270)) {
+                    let x_249 : i32 = data[8];
+                    grey = (0.5 + (f32(x_249) / 10.0));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  let x_253 : f32 = grey;
+  let x_254 : vec3<f32> = vec3<f32>(x_253, x_253, x_253);
+  x_GLF_color = vec4<f32>(x_254.x, x_254.y, x_254.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-clamped-conditional-bit-shift/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-clamped-conditional-bit-shift/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..edd60f7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-clamped-conditional-bit-shift/1.wgsl.expected.hlsl
@@ -0,0 +1,302 @@
+static int data[10] = (int[10])0;
+static int temp[10] = (int[10])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 merge_i1_i1_i1_(inout int from, inout int mid, inout int to) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  const int x_260 = from;
+  k = x_260;
+  const int x_261 = from;
+  i = x_261;
+  const int x_262 = mid;
+  j = (x_262 + 1);
+  while (true) {
+    const int x_268 = i;
+    const int x_269 = mid;
+    const int x_271 = j;
+    const int x_272 = to;
+    bool tint_tmp = (x_268 <= x_269);
+    if (tint_tmp) {
+      tint_tmp = (x_271 <= x_272);
+    }
+    if ((tint_tmp)) {
+    } else {
+      break;
+    }
+    const int x_278 = data[i];
+    const int x_281 = data[j];
+    if ((x_278 < x_281)) {
+      const int x_286 = k;
+      k = (x_286 + 1);
+      const int x_288 = i;
+      i = (x_288 + 1);
+      const int x_291 = data[x_288];
+      temp[x_286] = x_291;
+    } else {
+      const int x_293 = k;
+      k = (x_293 + 1);
+      const int x_295 = j;
+      j = (x_295 + 1);
+      const int x_298 = data[x_295];
+      temp[x_293] = x_298;
+    }
+  }
+  while (true) {
+    const int x_304 = i;
+    const int x_306 = i;
+    const int x_307 = mid;
+    bool tint_tmp_1 = (x_304 < 10);
+    if (tint_tmp_1) {
+      tint_tmp_1 = (x_306 <= x_307);
+    }
+    if ((tint_tmp_1)) {
+    } else {
+      break;
+    }
+    const int x_311 = k;
+    k = (x_311 + 1);
+    const int x_313 = i;
+    i = (x_313 + 1);
+    const int x_316 = data[x_313];
+    temp[x_311] = x_316;
+  }
+  const int x_318 = from;
+  i_1 = x_318;
+  while (true) {
+    const int x_323 = i_1;
+    const int x_324 = to;
+    if ((x_323 <= x_324)) {
+    } else {
+      break;
+    }
+    const int x_327 = i_1;
+    const int x_330 = temp[i_1];
+    data[x_327] = x_330;
+    {
+      i_1 = (i_1 + 1);
+    }
+  }
+  return;
+}
+
+int func_i1_i1_(inout int m, inout int high) {
+  int x = 0;
+  int x_335 = 0;
+  int x_336 = 0;
+  const float x_338 = gl_FragCoord.x;
+  if ((x_338 >= 0.0f)) {
+    if (false) {
+      const int x_346 = high;
+      x_336 = (x_346 << asuint(0));
+    } else {
+      x_336 = 4;
+    }
+    x_335 = (1 << asuint(x_336));
+  } else {
+    x_335 = 1;
+  }
+  x = x_335;
+  x = (x >> asuint(4));
+  const int x_353 = m;
+  const int x_355 = m;
+  const int x_357 = m;
+  return clamp((2 * x_353), (2 * x_355), ((2 * x_357) / x));
+}
+
+void mergeSort_() {
+  int low = 0;
+  int high_1 = 0;
+  int m_1 = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  int param_3 = 0;
+  int param_4 = 0;
+  low = 0;
+  high_1 = 9;
+  m_1 = 1;
+  {
+    for(; (m_1 <= high_1); m_1 = (2 * m_1)) {
+      i_2 = low;
+      while (true) {
+        if ((i_2 < high_1)) {
+        } else {
+          break;
+        }
+        from_1 = i_2;
+        mid_1 = ((i_2 + m_1) - 1);
+        to_1 = min(((i_2 + (2 * m_1)) - 1), high_1);
+        param = from_1;
+        param_1 = mid_1;
+        param_2 = to_1;
+        merge_i1_i1_i1_(param, param_1, param_2);
+        {
+          param_3 = m_1;
+          param_4 = high_1;
+          const int x_398 = func_i1_i1_(param_3, param_4);
+          i_2 = (i_2 + x_398);
+        }
+      }
+    }
+  }
+  return;
+}
+
+void main_1() {
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  const float x_93 = asfloat(x_34[0].x);
+  i_3 = int(x_93);
+  while (true) {
+    switch(i_3) {
+      case 9: {
+        data[i_3] = -5;
+        break;
+      }
+      case 8: {
+        data[i_3] = -4;
+        break;
+      }
+      case 7: {
+        data[i_3] = -3;
+        break;
+      }
+      case 6: {
+        data[i_3] = -2;
+        break;
+      }
+      case 5: {
+        data[i_3] = -1;
+        break;
+      }
+      case 4: {
+        data[i_3] = 0;
+        break;
+      }
+      case 3: {
+        data[i_3] = 1;
+        break;
+      }
+      case 2: {
+        data[i_3] = 2;
+        break;
+      }
+      case 1: {
+        data[i_3] = 3;
+        break;
+      }
+      case 0: {
+        data[i_3] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    i_3 = (i_3 + 1);
+    {
+      if ((i_3 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  {
+    for(; (j_1 < 10); j_1 = (j_1 + 1)) {
+      const int x_142 = j_1;
+      const int x_145 = data[j_1];
+      temp[x_142] = x_145;
+    }
+  }
+  mergeSort_();
+  const float x_151 = gl_FragCoord.y;
+  if ((int(x_151) < 30)) {
+    const int x_158 = data[0];
+    grey = (0.5f + (float(x_158) / 10.0f));
+  } else {
+    const float x_163 = gl_FragCoord.y;
+    if ((int(x_163) < 60)) {
+      const int x_170 = data[1];
+      grey = (0.5f + (float(x_170) / 10.0f));
+    } else {
+      const float x_175 = gl_FragCoord.y;
+      if ((int(x_175) < 90)) {
+        const int x_182 = data[2];
+        grey = (0.5f + (float(x_182) / 10.0f));
+      } else {
+        const float x_187 = gl_FragCoord.y;
+        if ((int(x_187) < 120)) {
+          const int x_194 = data[3];
+          grey = (0.5f + (float(x_194) / 10.0f));
+        } else {
+          const float x_199 = gl_FragCoord.y;
+          if ((int(x_199) < 150)) {
+            discard;
+          } else {
+            const float x_206 = gl_FragCoord.y;
+            if ((int(x_206) < 180)) {
+              const int x_213 = data[5];
+              grey = (0.5f + (float(x_213) / 10.0f));
+            } else {
+              const float x_218 = gl_FragCoord.y;
+              if ((int(x_218) < 210)) {
+                const int x_225 = data[6];
+                grey = (0.5f + (float(x_225) / 10.0f));
+              } else {
+                const float x_230 = gl_FragCoord.y;
+                if ((int(x_230) < 240)) {
+                  const int x_237 = data[7];
+                  grey = (0.5f + (float(x_237) / 10.0f));
+                } else {
+                  const float x_242 = gl_FragCoord.y;
+                  if ((int(x_242) < 270)) {
+                    const int x_249 = data[8];
+                    grey = (0.5f + (float(x_249) / 10.0f));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  const float x_253 = grey;
+  const float3 x_254 = float3(x_253, x_253, x_253);
+  x_GLF_color = float4(x_254.x, x_254.y, x_254.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-clamped-conditional-bit-shift/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-clamped-conditional-bit-shift/1.wgsl.expected.msl
new file mode 100644
index 0000000..eb075ff
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-clamped-conditional-bit-shift/1.wgsl.expected.msl
@@ -0,0 +1,348 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void merge_i1_i1_i1_(thread int* const from, thread int* const mid, thread int* const to, thread tint_array_wrapper* const tint_symbol_5, thread tint_array_wrapper* const tint_symbol_6) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  int const x_260 = *(from);
+  k = x_260;
+  int const x_261 = *(from);
+  i = x_261;
+  int const x_262 = *(mid);
+  j = (x_262 + 1);
+  while (true) {
+    int const x_268 = i;
+    int const x_269 = *(mid);
+    int const x_271 = j;
+    int const x_272 = *(to);
+    if (((x_268 <= x_269) && (x_271 <= x_272))) {
+    } else {
+      break;
+    }
+    int const x_276 = i;
+    int const x_278 = (*(tint_symbol_5)).arr[x_276];
+    int const x_279 = j;
+    int const x_281 = (*(tint_symbol_5)).arr[x_279];
+    if ((x_278 < x_281)) {
+      int const x_286 = k;
+      k = (x_286 + 1);
+      int const x_288 = i;
+      i = (x_288 + 1);
+      int const x_291 = (*(tint_symbol_5)).arr[x_288];
+      (*(tint_symbol_6)).arr[x_286] = x_291;
+    } else {
+      int const x_293 = k;
+      k = (x_293 + 1);
+      int const x_295 = j;
+      j = (x_295 + 1);
+      int const x_298 = (*(tint_symbol_5)).arr[x_295];
+      (*(tint_symbol_6)).arr[x_293] = x_298;
+    }
+  }
+  while (true) {
+    int const x_304 = i;
+    int const x_306 = i;
+    int const x_307 = *(mid);
+    if (((x_304 < 10) && (x_306 <= x_307))) {
+    } else {
+      break;
+    }
+    int const x_311 = k;
+    k = (x_311 + 1);
+    int const x_313 = i;
+    i = (x_313 + 1);
+    int const x_316 = (*(tint_symbol_5)).arr[x_313];
+    (*(tint_symbol_6)).arr[x_311] = x_316;
+  }
+  int const x_318 = *(from);
+  i_1 = x_318;
+  while (true) {
+    int const x_323 = i_1;
+    int const x_324 = *(to);
+    if ((x_323 <= x_324)) {
+    } else {
+      break;
+    }
+    int const x_327 = i_1;
+    int const x_328 = i_1;
+    int const x_330 = (*(tint_symbol_6)).arr[x_328];
+    (*(tint_symbol_5)).arr[x_327] = x_330;
+    {
+      int const x_332 = i_1;
+      i_1 = (x_332 + 1);
+    }
+  }
+  return;
+}
+
+int func_i1_i1_(thread int* const m, thread int* const high, thread float4* const tint_symbol_7) {
+  int x = 0;
+  int x_335 = 0;
+  int x_336 = 0;
+  float const x_338 = (*(tint_symbol_7)).x;
+  if ((x_338 >= 0.0f)) {
+    if (false) {
+      int const x_346 = *(high);
+      x_336 = (x_346 << as_type<uint>(0));
+    } else {
+      x_336 = 4;
+    }
+    int const x_348 = x_336;
+    x_335 = (1 << as_type<uint>(x_348));
+  } else {
+    x_335 = 1;
+  }
+  int const x_350 = x_335;
+  x = x_350;
+  int const x_351 = x;
+  x = (x_351 >> as_type<uint>(4));
+  int const x_353 = *(m);
+  int const x_355 = *(m);
+  int const x_357 = *(m);
+  int const x_359 = x;
+  return clamp((2 * x_353), (2 * x_355), ((2 * x_357) / x_359));
+}
+
+void mergeSort_(thread tint_array_wrapper* const tint_symbol_8, thread tint_array_wrapper* const tint_symbol_9, thread float4* const tint_symbol_10) {
+  int low = 0;
+  int high_1 = 0;
+  int m_1 = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  int param_3 = 0;
+  int param_4 = 0;
+  low = 0;
+  high_1 = 9;
+  m_1 = 1;
+  while (true) {
+    int const x_367 = m_1;
+    int const x_368 = high_1;
+    if ((x_367 <= x_368)) {
+    } else {
+      break;
+    }
+    int const x_371 = low;
+    i_2 = x_371;
+    while (true) {
+      int const x_376 = i_2;
+      int const x_377 = high_1;
+      if ((x_376 < x_377)) {
+      } else {
+        break;
+      }
+      int const x_380 = i_2;
+      from_1 = x_380;
+      int const x_381 = i_2;
+      int const x_382 = m_1;
+      mid_1 = ((x_381 + x_382) - 1);
+      int const x_385 = i_2;
+      int const x_386 = m_1;
+      int const x_390 = high_1;
+      to_1 = min(((x_385 + (2 * x_386)) - 1), x_390);
+      int const x_392 = from_1;
+      param = x_392;
+      int const x_393 = mid_1;
+      param_1 = x_393;
+      int const x_394 = to_1;
+      param_2 = x_394;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2), tint_symbol_8, tint_symbol_9);
+      {
+        int const x_396 = m_1;
+        param_3 = x_396;
+        int const x_397 = high_1;
+        param_4 = x_397;
+        int const x_398 = func_i1_i1_(&(param_3), &(param_4), tint_symbol_10);
+        int const x_399 = i_2;
+        i_2 = (x_399 + x_398);
+      }
+    }
+    {
+      int const x_401 = m_1;
+      m_1 = (2 * x_401);
+    }
+  }
+  return;
+}
+
+void main_1(constant buf0& x_34, thread tint_array_wrapper* const tint_symbol_11, thread tint_array_wrapper* const tint_symbol_12, thread float4* const tint_symbol_13, thread float4* const tint_symbol_14) {
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  float const x_93 = x_34.injectionSwitch.x;
+  i_3 = int(x_93);
+  while (true) {
+    int const x_99 = i_3;
+    switch(x_99) {
+      case 9: {
+        int const x_129 = i_3;
+        (*(tint_symbol_11)).arr[x_129] = -5;
+        break;
+      }
+      case 8: {
+        int const x_127 = i_3;
+        (*(tint_symbol_11)).arr[x_127] = -4;
+        break;
+      }
+      case 7: {
+        int const x_125 = i_3;
+        (*(tint_symbol_11)).arr[x_125] = -3;
+        break;
+      }
+      case 6: {
+        int const x_123 = i_3;
+        (*(tint_symbol_11)).arr[x_123] = -2;
+        break;
+      }
+      case 5: {
+        int const x_121 = i_3;
+        (*(tint_symbol_11)).arr[x_121] = -1;
+        break;
+      }
+      case 4: {
+        int const x_119 = i_3;
+        (*(tint_symbol_11)).arr[x_119] = 0;
+        break;
+      }
+      case 3: {
+        int const x_117 = i_3;
+        (*(tint_symbol_11)).arr[x_117] = 1;
+        break;
+      }
+      case 2: {
+        int const x_115 = i_3;
+        (*(tint_symbol_11)).arr[x_115] = 2;
+        break;
+      }
+      case 1: {
+        int const x_113 = i_3;
+        (*(tint_symbol_11)).arr[x_113] = 3;
+        break;
+      }
+      case 0: {
+        int const x_111 = i_3;
+        (*(tint_symbol_11)).arr[x_111] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    int const x_131 = i_3;
+    i_3 = (x_131 + 1);
+    {
+      int const x_133 = i_3;
+      if ((x_133 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  while (true) {
+    int const x_139 = j_1;
+    if ((x_139 < 10)) {
+    } else {
+      break;
+    }
+    int const x_142 = j_1;
+    int const x_143 = j_1;
+    int const x_145 = (*(tint_symbol_11)).arr[x_143];
+    (*(tint_symbol_12)).arr[x_142] = x_145;
+    {
+      int const x_147 = j_1;
+      j_1 = (x_147 + 1);
+    }
+  }
+  mergeSort_(tint_symbol_11, tint_symbol_12, tint_symbol_13);
+  float const x_151 = (*(tint_symbol_13)).y;
+  if ((int(x_151) < 30)) {
+    int const x_158 = (*(tint_symbol_11)).arr[0];
+    grey = (0.5f + (float(x_158) / 10.0f));
+  } else {
+    float const x_163 = (*(tint_symbol_13)).y;
+    if ((int(x_163) < 60)) {
+      int const x_170 = (*(tint_symbol_11)).arr[1];
+      grey = (0.5f + (float(x_170) / 10.0f));
+    } else {
+      float const x_175 = (*(tint_symbol_13)).y;
+      if ((int(x_175) < 90)) {
+        int const x_182 = (*(tint_symbol_11)).arr[2];
+        grey = (0.5f + (float(x_182) / 10.0f));
+      } else {
+        float const x_187 = (*(tint_symbol_13)).y;
+        if ((int(x_187) < 120)) {
+          int const x_194 = (*(tint_symbol_11)).arr[3];
+          grey = (0.5f + (float(x_194) / 10.0f));
+        } else {
+          float const x_199 = (*(tint_symbol_13)).y;
+          if ((int(x_199) < 150)) {
+            discard_fragment();
+          } else {
+            float const x_206 = (*(tint_symbol_13)).y;
+            if ((int(x_206) < 180)) {
+              int const x_213 = (*(tint_symbol_11)).arr[5];
+              grey = (0.5f + (float(x_213) / 10.0f));
+            } else {
+              float const x_218 = (*(tint_symbol_13)).y;
+              if ((int(x_218) < 210)) {
+                int const x_225 = (*(tint_symbol_11)).arr[6];
+                grey = (0.5f + (float(x_225) / 10.0f));
+              } else {
+                float const x_230 = (*(tint_symbol_13)).y;
+                if ((int(x_230) < 240)) {
+                  int const x_237 = (*(tint_symbol_11)).arr[7];
+                  grey = (0.5f + (float(x_237) / 10.0f));
+                } else {
+                  float const x_242 = (*(tint_symbol_13)).y;
+                  if ((int(x_242) < 270)) {
+                    int const x_249 = (*(tint_symbol_11)).arr[8];
+                    grey = (0.5f + (float(x_249) / 10.0f));
+                  } else {
+                    discard_fragment();
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  float const x_253 = grey;
+  float3 const x_254 = float3(x_253, x_253, x_253);
+  *(tint_symbol_14) = float4(x_254.x, x_254.y, x_254.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_34 [[buffer(0)]]) {
+  thread float4 tint_symbol_15 = 0.0f;
+  thread tint_array_wrapper tint_symbol_16 = {};
+  thread tint_array_wrapper tint_symbol_17 = {};
+  thread float4 tint_symbol_18 = 0.0f;
+  tint_symbol_15 = gl_FragCoord_param;
+  main_1(x_34, &(tint_symbol_16), &(tint_symbol_17), &(tint_symbol_15), &(tint_symbol_18));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_18};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-clamped-conditional-bit-shift/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-clamped-conditional-bit-shift/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..6248b33
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-clamped-conditional-bit-shift/1.wgsl.expected.spvasm
@@ -0,0 +1,716 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 463
+; Schema: 0
+               OpCapability Shader
+        %174 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %data "data"
+               OpName %temp "temp"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_34 "x_34"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %merge_i1_i1_i1_ "merge_i1_i1_i1_"
+               OpName %from "from"
+               OpName %mid "mid"
+               OpName %to "to"
+               OpName %k "k"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %i_1 "i_1"
+               OpName %func_i1_i1_ "func_i1_i1_"
+               OpName %m "m"
+               OpName %high "high"
+               OpName %x "x"
+               OpName %x_335 "x_335"
+               OpName %x_336 "x_336"
+               OpName %mergeSort_ "mergeSort_"
+               OpName %low "low"
+               OpName %high_1 "high_1"
+               OpName %m_1 "m_1"
+               OpName %i_2 "i_2"
+               OpName %from_1 "from_1"
+               OpName %mid_1 "mid_1"
+               OpName %to_1 "to_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %param_4 "param_4"
+               OpName %main_1 "main_1"
+               OpName %i_3 "i_3"
+               OpName %j_1 "j_1"
+               OpName %grey "grey"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_34 NonWritable
+               OpDecorate %x_34 DescriptorSet 0
+               OpDecorate %x_34 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Private__arr_int_uint_10 = OpTypePointer Private %_arr_int_uint_10
+          %7 = OpConstantNull %_arr_int_uint_10
+       %data = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+       %temp = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %13 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %13
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_34 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %13
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %13
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int %_ptr_Function_int
+         %32 = OpConstantNull %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+%_ptr_Private_int = OpTypePointer Private %int
+     %int_10 = OpConstant %int 10
+        %132 = OpTypeFunction %int %_ptr_Function_int %_ptr_Function_int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+      %false = OpConstantFalse %bool
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+      %int_2 = OpConstant %int 2
+        %180 = OpTypeFunction %void
+      %int_9 = OpConstant %int 9
+%_ptr_Function_float = OpTypePointer Function %float
+        %251 = OpConstantNull %float
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %int_n5 = OpConstant %int -5
+     %int_n4 = OpConstant %int -4
+     %int_n3 = OpConstant %int -3
+     %int_n2 = OpConstant %int -2
+     %int_n1 = OpConstant %int -1
+      %int_3 = OpConstant %int 3
+     %uint_1 = OpConstant %uint 1
+     %int_30 = OpConstant %int 30
+  %float_0_5 = OpConstant %float 0.5
+   %float_10 = OpConstant %float 10
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+    %v3float = OpTypeVector %float 3
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %450 = OpTypeFunction %void %main_out
+%merge_i1_i1_i1_ = OpFunction %void None %23
+       %from = OpFunctionParameter %_ptr_Function_int
+        %mid = OpFunctionParameter %_ptr_Function_int
+         %to = OpFunctionParameter %_ptr_Function_int
+         %30 = OpLabel
+          %k = OpVariable %_ptr_Function_int Function %32
+          %i = OpVariable %_ptr_Function_int Function %32
+          %j = OpVariable %_ptr_Function_int Function %32
+        %i_1 = OpVariable %_ptr_Function_int Function %32
+         %37 = OpLoad %int %from
+               OpStore %k %37
+         %39 = OpLoad %int %from
+               OpStore %i %39
+         %41 = OpLoad %int %mid
+         %43 = OpIAdd %int %41 %int_1
+               OpStore %j %43
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %48 = OpLoad %int %i
+         %50 = OpLoad %int %mid
+         %51 = OpLoad %int %j
+         %53 = OpLoad %int %to
+         %54 = OpSLessThanEqual %bool %48 %50
+               OpSelectionMerge %56 None
+               OpBranchConditional %54 %57 %56
+         %57 = OpLabel
+         %58 = OpSLessThanEqual %bool %51 %53
+               OpBranch %56
+         %56 = OpLabel
+         %59 = OpPhi %bool %54 %47 %58 %57
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %62
+         %61 = OpLabel
+               OpBranch %60
+         %62 = OpLabel
+               OpBranch %45
+         %60 = OpLabel
+         %63 = OpLoad %int %i
+         %65 = OpAccessChain %_ptr_Private_int %data %63
+         %66 = OpLoad %int %65
+         %67 = OpLoad %int %j
+         %68 = OpAccessChain %_ptr_Private_int %data %67
+         %69 = OpLoad %int %68
+         %70 = OpSLessThan %bool %66 %69
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %73
+         %72 = OpLabel
+         %74 = OpLoad %int %k
+         %75 = OpIAdd %int %74 %int_1
+               OpStore %k %75
+         %76 = OpLoad %int %i
+         %77 = OpIAdd %int %76 %int_1
+               OpStore %i %77
+         %78 = OpAccessChain %_ptr_Private_int %data %76
+         %79 = OpLoad %int %78
+         %80 = OpAccessChain %_ptr_Private_int %temp %74
+               OpStore %80 %79
+               OpBranch %71
+         %73 = OpLabel
+         %81 = OpLoad %int %k
+         %82 = OpIAdd %int %81 %int_1
+               OpStore %k %82
+         %83 = OpLoad %int %j
+         %84 = OpIAdd %int %83 %int_1
+               OpStore %j %84
+         %85 = OpAccessChain %_ptr_Private_int %data %83
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_Private_int %temp %81
+               OpStore %87 %86
+               OpBranch %71
+         %71 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+               OpBranch %44
+         %45 = OpLabel
+               OpBranch %88
+         %88 = OpLabel
+               OpLoopMerge %89 %90 None
+               OpBranch %91
+         %91 = OpLabel
+         %92 = OpLoad %int %i
+         %93 = OpLoad %int %i
+         %95 = OpLoad %int %mid
+         %97 = OpSLessThan %bool %92 %int_10
+               OpSelectionMerge %98 None
+               OpBranchConditional %97 %99 %98
+         %99 = OpLabel
+        %100 = OpSLessThanEqual %bool %93 %95
+               OpBranch %98
+         %98 = OpLabel
+        %101 = OpPhi %bool %97 %91 %100 %99
+               OpSelectionMerge %102 None
+               OpBranchConditional %101 %103 %104
+        %103 = OpLabel
+               OpBranch %102
+        %104 = OpLabel
+               OpBranch %89
+        %102 = OpLabel
+        %105 = OpLoad %int %k
+        %106 = OpIAdd %int %105 %int_1
+               OpStore %k %106
+        %107 = OpLoad %int %i
+        %108 = OpIAdd %int %107 %int_1
+               OpStore %i %108
+        %109 = OpAccessChain %_ptr_Private_int %data %107
+        %110 = OpLoad %int %109
+        %111 = OpAccessChain %_ptr_Private_int %temp %105
+               OpStore %111 %110
+               OpBranch %90
+         %90 = OpLabel
+               OpBranch %88
+         %89 = OpLabel
+        %113 = OpLoad %int %from
+               OpStore %i_1 %113
+               OpBranch %114
+        %114 = OpLabel
+               OpLoopMerge %115 %116 None
+               OpBranch %117
+        %117 = OpLabel
+        %118 = OpLoad %int %i_1
+        %120 = OpLoad %int %to
+        %121 = OpSLessThanEqual %bool %118 %120
+               OpSelectionMerge %122 None
+               OpBranchConditional %121 %123 %124
+        %123 = OpLabel
+               OpBranch %122
+        %124 = OpLabel
+               OpBranch %115
+        %122 = OpLabel
+        %125 = OpLoad %int %i_1
+        %126 = OpLoad %int %i_1
+        %127 = OpAccessChain %_ptr_Private_int %temp %126
+        %128 = OpLoad %int %127
+        %129 = OpAccessChain %_ptr_Private_int %data %125
+               OpStore %129 %128
+               OpBranch %116
+        %116 = OpLabel
+        %130 = OpLoad %int %i_1
+        %131 = OpIAdd %int %130 %int_1
+               OpStore %i_1 %131
+               OpBranch %114
+        %115 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%func_i1_i1_ = OpFunction %int None %132
+          %m = OpFunctionParameter %_ptr_Function_int
+       %high = OpFunctionParameter %_ptr_Function_int
+        %136 = OpLabel
+          %x = OpVariable %_ptr_Function_int Function %32
+      %x_335 = OpVariable %_ptr_Function_int Function %32
+      %x_336 = OpVariable %_ptr_Function_int Function %32
+        %142 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+        %143 = OpLoad %float %142
+        %145 = OpFOrdGreaterThanEqual %bool %143 %float_0
+               OpSelectionMerge %146 None
+               OpBranchConditional %145 %147 %148
+        %147 = OpLabel
+               OpSelectionMerge %150 None
+               OpBranchConditional %false %151 %152
+        %151 = OpLabel
+        %154 = OpLoad %int %high
+        %155 = OpBitcast %uint %int_0
+        %157 = OpShiftLeftLogical %int %154 %155
+               OpStore %x_336 %157
+               OpBranch %150
+        %152 = OpLabel
+               OpStore %x_336 %int_4
+               OpBranch %150
+        %150 = OpLabel
+        %159 = OpLoad %int %x_336
+        %160 = OpBitcast %uint %159
+        %161 = OpShiftLeftLogical %int %int_1 %160
+               OpStore %x_335 %161
+               OpBranch %146
+        %148 = OpLabel
+               OpStore %x_335 %int_1
+               OpBranch %146
+        %146 = OpLabel
+        %162 = OpLoad %int %x_335
+               OpStore %x %162
+        %163 = OpLoad %int %x
+        %164 = OpBitcast %uint %int_4
+        %165 = OpShiftRightArithmetic %int %163 %164
+               OpStore %x %165
+        %167 = OpLoad %int %m
+        %169 = OpLoad %int %m
+        %171 = OpLoad %int %m
+        %172 = OpLoad %int %x
+        %176 = OpIMul %int %int_2 %167
+        %177 = OpIMul %int %int_2 %169
+        %178 = OpIMul %int %int_2 %171
+        %179 = OpSDiv %int %178 %172
+        %173 = OpExtInst %int %174 SClamp %176 %177 %179
+               OpReturnValue %173
+               OpFunctionEnd
+ %mergeSort_ = OpFunction %void None %180
+        %182 = OpLabel
+        %low = OpVariable %_ptr_Function_int Function %32
+     %high_1 = OpVariable %_ptr_Function_int Function %32
+        %m_1 = OpVariable %_ptr_Function_int Function %32
+        %i_2 = OpVariable %_ptr_Function_int Function %32
+     %from_1 = OpVariable %_ptr_Function_int Function %32
+      %mid_1 = OpVariable %_ptr_Function_int Function %32
+       %to_1 = OpVariable %_ptr_Function_int Function %32
+      %param = OpVariable %_ptr_Function_int Function %32
+    %param_1 = OpVariable %_ptr_Function_int Function %32
+    %param_2 = OpVariable %_ptr_Function_int Function %32
+    %param_3 = OpVariable %_ptr_Function_int Function %32
+    %param_4 = OpVariable %_ptr_Function_int Function %32
+               OpStore %low %int_0
+               OpStore %high_1 %int_9
+               OpStore %m_1 %int_1
+               OpBranch %196
+        %196 = OpLabel
+               OpLoopMerge %197 %198 None
+               OpBranch %199
+        %199 = OpLabel
+        %200 = OpLoad %int %m_1
+        %201 = OpLoad %int %high_1
+        %202 = OpSLessThanEqual %bool %200 %201
+               OpSelectionMerge %203 None
+               OpBranchConditional %202 %204 %205
+        %204 = OpLabel
+               OpBranch %203
+        %205 = OpLabel
+               OpBranch %197
+        %203 = OpLabel
+        %206 = OpLoad %int %low
+               OpStore %i_2 %206
+               OpBranch %207
+        %207 = OpLabel
+               OpLoopMerge %208 %209 None
+               OpBranch %210
+        %210 = OpLabel
+        %211 = OpLoad %int %i_2
+        %212 = OpLoad %int %high_1
+        %213 = OpSLessThan %bool %211 %212
+               OpSelectionMerge %214 None
+               OpBranchConditional %213 %215 %216
+        %215 = OpLabel
+               OpBranch %214
+        %216 = OpLabel
+               OpBranch %208
+        %214 = OpLabel
+        %217 = OpLoad %int %i_2
+               OpStore %from_1 %217
+        %218 = OpLoad %int %i_2
+        %219 = OpLoad %int %m_1
+        %220 = OpIAdd %int %218 %219
+        %221 = OpISub %int %220 %int_1
+               OpStore %mid_1 %221
+        %222 = OpLoad %int %i_2
+        %223 = OpLoad %int %m_1
+        %224 = OpLoad %int %high_1
+        %226 = OpIMul %int %int_2 %223
+        %227 = OpIAdd %int %222 %226
+        %228 = OpISub %int %227 %int_1
+        %225 = OpExtInst %int %174 SMin %228 %224
+               OpStore %to_1 %225
+        %229 = OpLoad %int %from_1
+               OpStore %param %229
+        %230 = OpLoad %int %mid_1
+               OpStore %param_1 %230
+        %231 = OpLoad %int %to_1
+               OpStore %param_2 %231
+        %232 = OpFunctionCall %void %merge_i1_i1_i1_ %param %param_1 %param_2
+               OpBranch %209
+        %209 = OpLabel
+        %236 = OpLoad %int %m_1
+               OpStore %param_3 %236
+        %237 = OpLoad %int %high_1
+               OpStore %param_4 %237
+        %238 = OpFunctionCall %int %func_i1_i1_ %param_3 %param_4
+        %241 = OpLoad %int %i_2
+        %242 = OpIAdd %int %241 %238
+               OpStore %i_2 %242
+               OpBranch %207
+        %208 = OpLabel
+               OpBranch %198
+        %198 = OpLabel
+        %243 = OpLoad %int %m_1
+        %244 = OpIMul %int %int_2 %243
+               OpStore %m_1 %244
+               OpBranch %196
+        %197 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %180
+        %246 = OpLabel
+        %i_3 = OpVariable %_ptr_Function_int Function %32
+        %j_1 = OpVariable %_ptr_Function_int Function %32
+       %grey = OpVariable %_ptr_Function_float Function %251
+        %253 = OpAccessChain %_ptr_Uniform_float %x_34 %uint_0 %uint_0
+        %254 = OpLoad %float %253
+        %255 = OpConvertFToS %int %254
+               OpStore %i_3 %255
+               OpBranch %256
+        %256 = OpLabel
+               OpLoopMerge %257 %258 None
+               OpBranch %259
+        %259 = OpLabel
+        %260 = OpLoad %int %i_3
+               OpSelectionMerge %261 None
+               OpSwitch %260 %262 9 %263 8 %264 7 %265 6 %266 5 %267 4 %268 3 %269 2 %270 1 %271 0 %272
+        %263 = OpLabel
+        %273 = OpLoad %int %i_3
+        %274 = OpAccessChain %_ptr_Private_int %data %273
+               OpStore %274 %int_n5
+               OpBranch %261
+        %264 = OpLabel
+        %276 = OpLoad %int %i_3
+        %277 = OpAccessChain %_ptr_Private_int %data %276
+               OpStore %277 %int_n4
+               OpBranch %261
+        %265 = OpLabel
+        %279 = OpLoad %int %i_3
+        %280 = OpAccessChain %_ptr_Private_int %data %279
+               OpStore %280 %int_n3
+               OpBranch %261
+        %266 = OpLabel
+        %282 = OpLoad %int %i_3
+        %283 = OpAccessChain %_ptr_Private_int %data %282
+               OpStore %283 %int_n2
+               OpBranch %261
+        %267 = OpLabel
+        %285 = OpLoad %int %i_3
+        %286 = OpAccessChain %_ptr_Private_int %data %285
+               OpStore %286 %int_n1
+               OpBranch %261
+        %268 = OpLabel
+        %288 = OpLoad %int %i_3
+        %289 = OpAccessChain %_ptr_Private_int %data %288
+               OpStore %289 %int_0
+               OpBranch %261
+        %269 = OpLabel
+        %290 = OpLoad %int %i_3
+        %291 = OpAccessChain %_ptr_Private_int %data %290
+               OpStore %291 %int_1
+               OpBranch %261
+        %270 = OpLabel
+        %292 = OpLoad %int %i_3
+        %293 = OpAccessChain %_ptr_Private_int %data %292
+               OpStore %293 %int_2
+               OpBranch %261
+        %271 = OpLabel
+        %294 = OpLoad %int %i_3
+        %295 = OpAccessChain %_ptr_Private_int %data %294
+               OpStore %295 %int_3
+               OpBranch %261
+        %272 = OpLabel
+        %297 = OpLoad %int %i_3
+        %298 = OpAccessChain %_ptr_Private_int %data %297
+               OpStore %298 %int_4
+               OpBranch %261
+        %262 = OpLabel
+               OpBranch %261
+        %261 = OpLabel
+        %299 = OpLoad %int %i_3
+        %300 = OpIAdd %int %299 %int_1
+               OpStore %i_3 %300
+               OpBranch %258
+        %258 = OpLabel
+        %301 = OpLoad %int %i_3
+        %302 = OpSLessThan %bool %301 %int_10
+               OpSelectionMerge %303 None
+               OpBranchConditional %302 %304 %305
+        %304 = OpLabel
+               OpBranch %303
+        %305 = OpLabel
+               OpBranch %257
+        %303 = OpLabel
+               OpBranch %256
+        %257 = OpLabel
+               OpStore %j_1 %int_0
+               OpBranch %306
+        %306 = OpLabel
+               OpLoopMerge %307 %308 None
+               OpBranch %309
+        %309 = OpLabel
+        %310 = OpLoad %int %j_1
+        %311 = OpSLessThan %bool %310 %int_10
+               OpSelectionMerge %312 None
+               OpBranchConditional %311 %313 %314
+        %313 = OpLabel
+               OpBranch %312
+        %314 = OpLabel
+               OpBranch %307
+        %312 = OpLabel
+        %315 = OpLoad %int %j_1
+        %316 = OpLoad %int %j_1
+        %317 = OpAccessChain %_ptr_Private_int %data %316
+        %318 = OpLoad %int %317
+        %319 = OpAccessChain %_ptr_Private_int %temp %315
+               OpStore %319 %318
+               OpBranch %308
+        %308 = OpLabel
+        %320 = OpLoad %int %j_1
+        %321 = OpIAdd %int %320 %int_1
+               OpStore %j_1 %321
+               OpBranch %306
+        %307 = OpLabel
+        %322 = OpFunctionCall %void %mergeSort_
+        %324 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %325 = OpLoad %float %324
+        %326 = OpConvertFToS %int %325
+        %328 = OpSLessThan %bool %326 %int_30
+               OpSelectionMerge %329 None
+               OpBranchConditional %328 %330 %331
+        %330 = OpLabel
+        %332 = OpAccessChain %_ptr_Private_int %data %int_0
+        %333 = OpLoad %int %332
+        %335 = OpConvertSToF %float %333
+        %337 = OpFDiv %float %335 %float_10
+        %338 = OpFAdd %float %float_0_5 %337
+               OpStore %grey %338
+               OpBranch %329
+        %331 = OpLabel
+        %339 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %340 = OpLoad %float %339
+        %341 = OpConvertFToS %int %340
+        %343 = OpSLessThan %bool %341 %int_60
+               OpSelectionMerge %344 None
+               OpBranchConditional %343 %345 %346
+        %345 = OpLabel
+        %347 = OpAccessChain %_ptr_Private_int %data %int_1
+        %348 = OpLoad %int %347
+        %349 = OpConvertSToF %float %348
+        %350 = OpFDiv %float %349 %float_10
+        %351 = OpFAdd %float %float_0_5 %350
+               OpStore %grey %351
+               OpBranch %344
+        %346 = OpLabel
+        %352 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %353 = OpLoad %float %352
+        %354 = OpConvertFToS %int %353
+        %356 = OpSLessThan %bool %354 %int_90
+               OpSelectionMerge %357 None
+               OpBranchConditional %356 %358 %359
+        %358 = OpLabel
+        %360 = OpAccessChain %_ptr_Private_int %data %int_2
+        %361 = OpLoad %int %360
+        %362 = OpConvertSToF %float %361
+        %363 = OpFDiv %float %362 %float_10
+        %364 = OpFAdd %float %float_0_5 %363
+               OpStore %grey %364
+               OpBranch %357
+        %359 = OpLabel
+        %365 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %366 = OpLoad %float %365
+        %367 = OpConvertFToS %int %366
+        %369 = OpSLessThan %bool %367 %int_120
+               OpSelectionMerge %370 None
+               OpBranchConditional %369 %371 %372
+        %371 = OpLabel
+        %373 = OpAccessChain %_ptr_Private_int %data %int_3
+        %374 = OpLoad %int %373
+        %375 = OpConvertSToF %float %374
+        %376 = OpFDiv %float %375 %float_10
+        %377 = OpFAdd %float %float_0_5 %376
+               OpStore %grey %377
+               OpBranch %370
+        %372 = OpLabel
+        %378 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %379 = OpLoad %float %378
+        %380 = OpConvertFToS %int %379
+        %382 = OpSLessThan %bool %380 %int_150
+               OpSelectionMerge %383 None
+               OpBranchConditional %382 %384 %385
+        %384 = OpLabel
+               OpKill
+        %385 = OpLabel
+        %386 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %387 = OpLoad %float %386
+        %388 = OpConvertFToS %int %387
+        %390 = OpSLessThan %bool %388 %int_180
+               OpSelectionMerge %391 None
+               OpBranchConditional %390 %392 %393
+        %392 = OpLabel
+        %395 = OpAccessChain %_ptr_Private_int %data %int_5
+        %396 = OpLoad %int %395
+        %397 = OpConvertSToF %float %396
+        %398 = OpFDiv %float %397 %float_10
+        %399 = OpFAdd %float %float_0_5 %398
+               OpStore %grey %399
+               OpBranch %391
+        %393 = OpLabel
+        %400 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %401 = OpLoad %float %400
+        %402 = OpConvertFToS %int %401
+        %404 = OpSLessThan %bool %402 %int_210
+               OpSelectionMerge %405 None
+               OpBranchConditional %404 %406 %407
+        %406 = OpLabel
+        %409 = OpAccessChain %_ptr_Private_int %data %int_6
+        %410 = OpLoad %int %409
+        %411 = OpConvertSToF %float %410
+        %412 = OpFDiv %float %411 %float_10
+        %413 = OpFAdd %float %float_0_5 %412
+               OpStore %grey %413
+               OpBranch %405
+        %407 = OpLabel
+        %414 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %415 = OpLoad %float %414
+        %416 = OpConvertFToS %int %415
+        %418 = OpSLessThan %bool %416 %int_240
+               OpSelectionMerge %419 None
+               OpBranchConditional %418 %420 %421
+        %420 = OpLabel
+        %423 = OpAccessChain %_ptr_Private_int %data %int_7
+        %424 = OpLoad %int %423
+        %425 = OpConvertSToF %float %424
+        %426 = OpFDiv %float %425 %float_10
+        %427 = OpFAdd %float %float_0_5 %426
+               OpStore %grey %427
+               OpBranch %419
+        %421 = OpLabel
+        %428 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %429 = OpLoad %float %428
+        %430 = OpConvertFToS %int %429
+        %432 = OpSLessThan %bool %430 %int_270
+               OpSelectionMerge %433 None
+               OpBranchConditional %432 %434 %435
+        %434 = OpLabel
+        %437 = OpAccessChain %_ptr_Private_int %data %int_8
+        %438 = OpLoad %int %437
+        %439 = OpConvertSToF %float %438
+        %440 = OpFDiv %float %439 %float_10
+        %441 = OpFAdd %float %float_0_5 %440
+               OpStore %grey %441
+               OpBranch %433
+        %435 = OpLabel
+               OpKill
+        %433 = OpLabel
+               OpBranch %419
+        %419 = OpLabel
+               OpBranch %405
+        %405 = OpLabel
+               OpBranch %391
+        %391 = OpLabel
+               OpBranch %383
+        %383 = OpLabel
+               OpBranch %370
+        %370 = OpLabel
+               OpBranch %357
+        %357 = OpLabel
+               OpBranch %344
+        %344 = OpLabel
+               OpBranch %329
+        %329 = OpLabel
+        %442 = OpLoad %float %grey
+        %444 = OpCompositeConstruct %v3float %442 %442 %442
+        %445 = OpCompositeExtract %float %444 0
+        %446 = OpCompositeExtract %float %444 1
+        %447 = OpCompositeExtract %float %444 2
+        %449 = OpCompositeConstruct %v4float %445 %446 %447 %float_1
+               OpStore %x_GLF_color %449
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %450
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %454 = OpLabel
+        %455 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %455
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %180
+        %457 = OpLabel
+        %458 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %458
+        %459 = OpFunctionCall %void %main_1
+        %461 = OpLoad %v4float %x_GLF_color
+        %462 = OpCompositeConstruct %main_out %461
+        %460 = OpFunctionCall %void %tint_symbol_3 %462
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 258[%258] is not post dominated by the back-edge block 303[%303]
+  %303 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-clamped-conditional-bit-shift/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-clamped-conditional-bit-shift/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..460ad4b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-clamped-conditional-bit-shift/1.wgsl.expected.wgsl
@@ -0,0 +1,340 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> data : array<i32, 10>;
+
+var<private> temp : array<i32, 10>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_34 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn merge_i1_i1_i1_(from : ptr<function, i32>, mid : ptr<function, i32>, to : ptr<function, i32>) {
+  var k : i32;
+  var i : i32;
+  var j : i32;
+  var i_1 : i32;
+  let x_260 : i32 = *(from);
+  k = x_260;
+  let x_261 : i32 = *(from);
+  i = x_261;
+  let x_262 : i32 = *(mid);
+  j = (x_262 + 1);
+  loop {
+    let x_268 : i32 = i;
+    let x_269 : i32 = *(mid);
+    let x_271 : i32 = j;
+    let x_272 : i32 = *(to);
+    if (((x_268 <= x_269) && (x_271 <= x_272))) {
+    } else {
+      break;
+    }
+    let x_276 : i32 = i;
+    let x_278 : i32 = data[x_276];
+    let x_279 : i32 = j;
+    let x_281 : i32 = data[x_279];
+    if ((x_278 < x_281)) {
+      let x_286 : i32 = k;
+      k = (x_286 + 1);
+      let x_288 : i32 = i;
+      i = (x_288 + 1);
+      let x_291 : i32 = data[x_288];
+      temp[x_286] = x_291;
+    } else {
+      let x_293 : i32 = k;
+      k = (x_293 + 1);
+      let x_295 : i32 = j;
+      j = (x_295 + 1);
+      let x_298 : i32 = data[x_295];
+      temp[x_293] = x_298;
+    }
+  }
+  loop {
+    let x_304 : i32 = i;
+    let x_306 : i32 = i;
+    let x_307 : i32 = *(mid);
+    if (((x_304 < 10) && (x_306 <= x_307))) {
+    } else {
+      break;
+    }
+    let x_311 : i32 = k;
+    k = (x_311 + 1);
+    let x_313 : i32 = i;
+    i = (x_313 + 1);
+    let x_316 : i32 = data[x_313];
+    temp[x_311] = x_316;
+  }
+  let x_318 : i32 = *(from);
+  i_1 = x_318;
+  loop {
+    let x_323 : i32 = i_1;
+    let x_324 : i32 = *(to);
+    if ((x_323 <= x_324)) {
+    } else {
+      break;
+    }
+    let x_327 : i32 = i_1;
+    let x_328 : i32 = i_1;
+    let x_330 : i32 = temp[x_328];
+    data[x_327] = x_330;
+
+    continuing {
+      let x_332 : i32 = i_1;
+      i_1 = (x_332 + 1);
+    }
+  }
+  return;
+}
+
+fn func_i1_i1_(m : ptr<function, i32>, high : ptr<function, i32>) -> i32 {
+  var x : i32;
+  var x_335 : i32;
+  var x_336 : i32;
+  let x_338 : f32 = gl_FragCoord.x;
+  if ((x_338 >= 0.0)) {
+    if (false) {
+      let x_346 : i32 = *(high);
+      x_336 = (x_346 << bitcast<u32>(0));
+    } else {
+      x_336 = 4;
+    }
+    let x_348 : i32 = x_336;
+    x_335 = (1 << bitcast<u32>(x_348));
+  } else {
+    x_335 = 1;
+  }
+  let x_350 : i32 = x_335;
+  x = x_350;
+  let x_351 : i32 = x;
+  x = (x_351 >> bitcast<u32>(4));
+  let x_353 : i32 = *(m);
+  let x_355 : i32 = *(m);
+  let x_357 : i32 = *(m);
+  let x_359 : i32 = x;
+  return clamp((2 * x_353), (2 * x_355), ((2 * x_357) / x_359));
+}
+
+fn mergeSort_() {
+  var low : i32;
+  var high_1 : i32;
+  var m_1 : i32;
+  var i_2 : i32;
+  var from_1 : i32;
+  var mid_1 : i32;
+  var to_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  var param_3 : i32;
+  var param_4 : i32;
+  low = 0;
+  high_1 = 9;
+  m_1 = 1;
+  loop {
+    let x_367 : i32 = m_1;
+    let x_368 : i32 = high_1;
+    if ((x_367 <= x_368)) {
+    } else {
+      break;
+    }
+    let x_371 : i32 = low;
+    i_2 = x_371;
+    loop {
+      let x_376 : i32 = i_2;
+      let x_377 : i32 = high_1;
+      if ((x_376 < x_377)) {
+      } else {
+        break;
+      }
+      let x_380 : i32 = i_2;
+      from_1 = x_380;
+      let x_381 : i32 = i_2;
+      let x_382 : i32 = m_1;
+      mid_1 = ((x_381 + x_382) - 1);
+      let x_385 : i32 = i_2;
+      let x_386 : i32 = m_1;
+      let x_390 : i32 = high_1;
+      to_1 = min(((x_385 + (2 * x_386)) - 1), x_390);
+      let x_392 : i32 = from_1;
+      param = x_392;
+      let x_393 : i32 = mid_1;
+      param_1 = x_393;
+      let x_394 : i32 = to_1;
+      param_2 = x_394;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2));
+
+      continuing {
+        let x_396 : i32 = m_1;
+        param_3 = x_396;
+        let x_397 : i32 = high_1;
+        param_4 = x_397;
+        let x_398 : i32 = func_i1_i1_(&(param_3), &(param_4));
+        let x_399 : i32 = i_2;
+        i_2 = (x_399 + x_398);
+      }
+    }
+
+    continuing {
+      let x_401 : i32 = m_1;
+      m_1 = (2 * x_401);
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_3 : i32;
+  var j_1 : i32;
+  var grey : f32;
+  let x_93 : f32 = x_34.injectionSwitch.x;
+  i_3 = i32(x_93);
+  loop {
+    let x_99 : i32 = i_3;
+    switch(x_99) {
+      case 9: {
+        let x_129 : i32 = i_3;
+        data[x_129] = -5;
+      }
+      case 8: {
+        let x_127 : i32 = i_3;
+        data[x_127] = -4;
+      }
+      case 7: {
+        let x_125 : i32 = i_3;
+        data[x_125] = -3;
+      }
+      case 6: {
+        let x_123 : i32 = i_3;
+        data[x_123] = -2;
+      }
+      case 5: {
+        let x_121 : i32 = i_3;
+        data[x_121] = -1;
+      }
+      case 4: {
+        let x_119 : i32 = i_3;
+        data[x_119] = 0;
+      }
+      case 3: {
+        let x_117 : i32 = i_3;
+        data[x_117] = 1;
+      }
+      case 2: {
+        let x_115 : i32 = i_3;
+        data[x_115] = 2;
+      }
+      case 1: {
+        let x_113 : i32 = i_3;
+        data[x_113] = 3;
+      }
+      case 0: {
+        let x_111 : i32 = i_3;
+        data[x_111] = 4;
+      }
+      default: {
+      }
+    }
+    let x_131 : i32 = i_3;
+    i_3 = (x_131 + 1);
+
+    continuing {
+      let x_133 : i32 = i_3;
+      if ((x_133 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  loop {
+    let x_139 : i32 = j_1;
+    if ((x_139 < 10)) {
+    } else {
+      break;
+    }
+    let x_142 : i32 = j_1;
+    let x_143 : i32 = j_1;
+    let x_145 : i32 = data[x_143];
+    temp[x_142] = x_145;
+
+    continuing {
+      let x_147 : i32 = j_1;
+      j_1 = (x_147 + 1);
+    }
+  }
+  mergeSort_();
+  let x_151 : f32 = gl_FragCoord.y;
+  if ((i32(x_151) < 30)) {
+    let x_158 : i32 = data[0];
+    grey = (0.5 + (f32(x_158) / 10.0));
+  } else {
+    let x_163 : f32 = gl_FragCoord.y;
+    if ((i32(x_163) < 60)) {
+      let x_170 : i32 = data[1];
+      grey = (0.5 + (f32(x_170) / 10.0));
+    } else {
+      let x_175 : f32 = gl_FragCoord.y;
+      if ((i32(x_175) < 90)) {
+        let x_182 : i32 = data[2];
+        grey = (0.5 + (f32(x_182) / 10.0));
+      } else {
+        let x_187 : f32 = gl_FragCoord.y;
+        if ((i32(x_187) < 120)) {
+          let x_194 : i32 = data[3];
+          grey = (0.5 + (f32(x_194) / 10.0));
+        } else {
+          let x_199 : f32 = gl_FragCoord.y;
+          if ((i32(x_199) < 150)) {
+            discard;
+          } else {
+            let x_206 : f32 = gl_FragCoord.y;
+            if ((i32(x_206) < 180)) {
+              let x_213 : i32 = data[5];
+              grey = (0.5 + (f32(x_213) / 10.0));
+            } else {
+              let x_218 : f32 = gl_FragCoord.y;
+              if ((i32(x_218) < 210)) {
+                let x_225 : i32 = data[6];
+                grey = (0.5 + (f32(x_225) / 10.0));
+              } else {
+                let x_230 : f32 = gl_FragCoord.y;
+                if ((i32(x_230) < 240)) {
+                  let x_237 : i32 = data[7];
+                  grey = (0.5 + (f32(x_237) / 10.0));
+                } else {
+                  let x_242 : f32 = gl_FragCoord.y;
+                  if ((i32(x_242) < 270)) {
+                    let x_249 : i32 = data[8];
+                    grey = (0.5 + (f32(x_249) / 10.0));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  let x_253 : f32 = grey;
+  let x_254 : vec3<f32> = vec3<f32>(x_253, x_253, x_253);
+  x_GLF_color = vec4<f32>(x_254.x, x_254.y, x_254.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-for-always-false-if-discard/1.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-for-always-false-if-discard/1.spvasm
new file mode 100644
index 0000000..ed5aa40
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-for-always-false-if-discard/1.spvasm
@@ -0,0 +1,416 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %data "data"
+               OpName %temp "temp"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+     %int_10 = OpConstant %int 10
+      %int_0 = OpConstant %int 0
+      %int_9 = OpConstant %int 9
+      %int_2 = OpConstant %int 2
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_4 = OpConstant %int 4
+      %int_3 = OpConstant %int 3
+     %int_n1 = OpConstant %int -1
+     %int_n2 = OpConstant %int -2
+     %int_n3 = OpConstant %int -3
+     %int_n4 = OpConstant %int -4
+     %int_n5 = OpConstant %int -5
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+     %int_30 = OpConstant %int 30
+  %float_0_5 = OpConstant %float 0.5
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+         %54 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+         %55 = OpConstantComposite %v2float %float_1 %float_1
+     %int_32 = OpConstant %int 32
+    %float_0 = OpConstant %float 0
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+%float_0_100000001 = OpConstant %float 0.100000001
+       %main = OpFunction %void None %10
+         %60 = OpLabel
+       %temp = OpVariable %_ptr_Function__arr_int_uint_10 Function
+       %data = OpVariable %_ptr_Function__arr_int_uint_10 Function
+         %61 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %62 = OpLoad %float %61
+         %63 = OpConvertFToS %int %62
+               OpBranch %64
+         %64 = OpLabel
+         %65 = OpPhi %int %63 %60 %66 %67
+               OpLoopMerge %68 %67 None
+               OpBranch %69
+         %69 = OpLabel
+               OpSelectionMerge %70 None
+               OpSwitch %65 %70 0 %71 1 %72 2 %73 3 %74 4 %75 5 %76 6 %77 7 %78 8 %79 9 %80
+         %71 = OpLabel
+         %81 = OpAccessChain %_ptr_Function_int %data %65
+               OpStore %81 %int_4
+               OpBranch %70
+         %72 = OpLabel
+         %82 = OpAccessChain %_ptr_Function_int %data %65
+               OpStore %82 %int_3
+               OpBranch %70
+         %73 = OpLabel
+         %83 = OpAccessChain %_ptr_Function_int %data %65
+               OpStore %83 %int_2
+               OpBranch %70
+         %74 = OpLabel
+         %84 = OpAccessChain %_ptr_Function_int %data %65
+               OpStore %84 %int_1
+               OpBranch %70
+         %75 = OpLabel
+         %85 = OpAccessChain %_ptr_Function_int %data %65
+               OpStore %85 %int_0
+               OpBranch %70
+         %76 = OpLabel
+         %86 = OpAccessChain %_ptr_Function_int %data %65
+               OpStore %86 %int_n1
+               OpBranch %70
+         %77 = OpLabel
+         %87 = OpAccessChain %_ptr_Function_int %data %65
+               OpStore %87 %int_n2
+               OpBranch %70
+         %78 = OpLabel
+         %88 = OpAccessChain %_ptr_Function_int %data %65
+               OpStore %88 %int_n3
+               OpBranch %70
+         %79 = OpLabel
+         %89 = OpAccessChain %_ptr_Function_int %data %65
+               OpStore %89 %int_n4
+               OpBranch %70
+         %80 = OpLabel
+         %90 = OpAccessChain %_ptr_Function_int %data %65
+               OpStore %90 %int_n5
+               OpBranch %70
+         %70 = OpLabel
+         %66 = OpIAdd %int %65 %int_1
+               OpBranch %67
+         %67 = OpLabel
+         %91 = OpSLessThan %bool %66 %int_10
+               OpBranchConditional %91 %64 %68
+         %68 = OpLabel
+               OpBranch %92
+         %92 = OpLabel
+         %93 = OpPhi %int %int_0 %68 %94 %95
+         %96 = OpSLessThan %bool %93 %int_10
+               OpLoopMerge %97 %95 None
+               OpBranchConditional %96 %95 %97
+         %95 = OpLabel
+         %98 = OpAccessChain %_ptr_Function_int %data %93
+         %99 = OpLoad %int %98
+        %100 = OpAccessChain %_ptr_Function_int %temp %93
+               OpStore %100 %99
+         %94 = OpIAdd %int %93 %int_1
+               OpBranch %92
+         %97 = OpLabel
+               OpBranch %101
+        %101 = OpLabel
+        %102 = OpPhi %int %int_1 %97 %103 %104
+        %105 = OpSLessThanEqual %bool %102 %int_9
+               OpLoopMerge %106 %104 None
+               OpBranchConditional %105 %107 %106
+        %107 = OpLabel
+               OpBranch %108
+        %108 = OpLabel
+        %109 = OpPhi %int %int_0 %107 %110 %111
+        %112 = OpSLessThan %bool %109 %int_9
+               OpLoopMerge %113 %111 None
+               OpBranchConditional %112 %114 %113
+        %114 = OpLabel
+        %115 = OpIAdd %int %109 %102
+        %116 = OpISub %int %115 %int_1
+        %117 = OpIMul %int %int_2 %102
+        %110 = OpIAdd %int %109 %117
+        %118 = OpISub %int %110 %int_1
+        %119 = OpExtInst %int %1 SMin %118 %int_9
+               OpBranch %120
+        %120 = OpLabel
+        %121 = OpPhi %int %109 %114 %122 %123
+        %124 = OpPhi %int %115 %114 %125 %123
+        %126 = OpPhi %int %109 %114 %127 %123
+        %128 = OpSLessThanEqual %bool %126 %116
+        %129 = OpSLessThanEqual %bool %124 %119
+        %130 = OpLogicalAnd %bool %128 %129
+               OpLoopMerge %131 %123 None
+               OpBranchConditional %130 %132 %131
+        %132 = OpLabel
+        %133 = OpAccessChain %_ptr_Function_int %data %126
+        %134 = OpLoad %int %133
+        %135 = OpAccessChain %_ptr_Function_int %data %124
+        %136 = OpLoad %int %135
+        %137 = OpSLessThan %bool %134 %136
+        %122 = OpIAdd %int %121 %int_1
+               OpSelectionMerge %138 None
+               OpBranchConditional %137 %139 %140
+        %139 = OpLabel
+        %141 = OpIAdd %int %126 %int_1
+        %142 = OpLoad %int %133
+        %143 = OpAccessChain %_ptr_Function_int %temp %121
+               OpStore %143 %142
+               OpBranch %138
+        %140 = OpLabel
+        %144 = OpIAdd %int %124 %int_1
+        %145 = OpLoad %int %135
+        %146 = OpAccessChain %_ptr_Function_int %temp %121
+               OpStore %146 %145
+               OpBranch %138
+        %138 = OpLabel
+        %125 = OpPhi %int %124 %139 %144 %140
+        %127 = OpPhi %int %141 %139 %126 %140
+               OpBranch %123
+        %123 = OpLabel
+               OpBranch %120
+        %131 = OpLabel
+               OpBranch %147
+        %147 = OpLabel
+        %148 = OpPhi %int %121 %131 %149 %150
+        %151 = OpPhi %int %126 %131 %152 %150
+        %153 = OpSLessThan %bool %151 %int_10
+        %154 = OpSLessThanEqual %bool %151 %116
+        %155 = OpLogicalAnd %bool %153 %154
+               OpLoopMerge %156 %150 None
+               OpBranchConditional %155 %150 %156
+        %150 = OpLabel
+        %149 = OpIAdd %int %148 %int_1
+        %152 = OpIAdd %int %151 %int_1
+        %157 = OpAccessChain %_ptr_Function_int %data %151
+        %158 = OpLoad %int %157
+        %159 = OpAccessChain %_ptr_Function_int %temp %148
+               OpStore %159 %158
+               OpBranch %147
+        %156 = OpLabel
+               OpBranch %160
+        %160 = OpLabel
+        %161 = OpPhi %int %109 %156 %162 %163
+        %164 = OpSLessThanEqual %bool %161 %119
+               OpLoopMerge %165 %163 None
+               OpBranchConditional %164 %163 %165
+        %163 = OpLabel
+        %166 = OpAccessChain %_ptr_Function_int %temp %161
+        %167 = OpLoad %int %166
+        %168 = OpAccessChain %_ptr_Function_int %data %161
+               OpStore %168 %167
+        %162 = OpIAdd %int %161 %int_1
+               OpBranch %160
+        %165 = OpLabel
+               OpBranch %111
+        %111 = OpLabel
+               OpBranch %108
+        %113 = OpLabel
+               OpBranch %104
+        %104 = OpLabel
+        %103 = OpIMul %int %int_2 %102
+               OpBranch %101
+        %106 = OpLabel
+        %169 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %170 = OpLoad %float %169
+        %171 = OpConvertFToS %int %170
+        %172 = OpSLessThan %bool %171 %int_30
+               OpSelectionMerge %173 None
+               OpBranchConditional %172 %174 %175
+        %174 = OpLabel
+        %176 = OpAccessChain %_ptr_Function_int %data %int_0
+        %177 = OpLoad %int %176
+        %178 = OpConvertSToF %float %177
+        %179 = OpFMul %float %178 %float_0_100000001
+        %180 = OpFAdd %float %float_0_5 %179
+               OpBranch %173
+        %175 = OpLabel
+        %181 = OpSLessThan %bool %171 %int_60
+               OpSelectionMerge %182 None
+               OpBranchConditional %181 %183 %184
+        %183 = OpLabel
+        %185 = OpAccessChain %_ptr_Function_int %data %int_1
+        %186 = OpLoad %int %185
+        %187 = OpConvertSToF %float %186
+        %188 = OpFMul %float %187 %float_0_100000001
+        %189 = OpFAdd %float %float_0_5 %188
+               OpBranch %182
+        %184 = OpLabel
+        %190 = OpSLessThan %bool %171 %int_90
+               OpSelectionMerge %191 None
+               OpBranchConditional %190 %192 %193
+        %192 = OpLabel
+        %194 = OpAccessChain %_ptr_Function_int %data %int_2
+        %195 = OpLoad %int %194
+        %196 = OpConvertSToF %float %195
+        %197 = OpFMul %float %196 %float_0_100000001
+        %198 = OpFAdd %float %float_0_5 %197
+               OpBranch %191
+        %193 = OpLabel
+        %199 = OpSLessThan %bool %171 %int_120
+               OpSelectionMerge %200 None
+               OpBranchConditional %199 %201 %202
+        %201 = OpLabel
+        %203 = OpAccessChain %_ptr_Function_int %data %int_3
+        %204 = OpLoad %int %203
+        %205 = OpConvertSToF %float %204
+        %206 = OpFMul %float %205 %float_0_100000001
+        %207 = OpFAdd %float %float_0_5 %206
+               OpBranch %200
+        %202 = OpLabel
+        %208 = OpSLessThan %bool %171 %int_150
+               OpSelectionMerge %209 None
+               OpBranchConditional %208 %210 %211
+        %210 = OpLabel
+               OpKill
+        %211 = OpLabel
+        %212 = OpSLessThan %bool %171 %int_180
+               OpSelectionMerge %213 None
+               OpBranchConditional %212 %214 %215
+        %214 = OpLabel
+        %216 = OpAccessChain %_ptr_Function_int %data %int_5
+        %217 = OpLoad %int %216
+        %218 = OpConvertSToF %float %217
+        %219 = OpFMul %float %218 %float_0_100000001
+        %220 = OpFAdd %float %float_0_5 %219
+               OpBranch %213
+        %215 = OpLabel
+        %221 = OpSLessThan %bool %171 %int_210
+               OpSelectionMerge %222 None
+               OpBranchConditional %221 %223 %224
+        %223 = OpLabel
+        %225 = OpAccessChain %_ptr_Function_int %data %int_6
+        %226 = OpLoad %int %225
+        %227 = OpConvertSToF %float %226
+        %228 = OpFMul %float %227 %float_0_100000001
+        %229 = OpFAdd %float %float_0_5 %228
+               OpBranch %222
+        %224 = OpLabel
+        %230 = OpSLessThan %bool %171 %int_240
+               OpSelectionMerge %231 None
+               OpBranchConditional %230 %232 %233
+        %232 = OpLabel
+        %234 = OpAccessChain %_ptr_Function_int %data %int_7
+        %235 = OpLoad %int %234
+        %236 = OpConvertSToF %float %235
+        %237 = OpFMul %float %236 %float_0_100000001
+        %238 = OpFAdd %float %float_0_5 %237
+               OpBranch %231
+        %233 = OpLabel
+        %239 = OpSLessThan %bool %171 %int_270
+               OpSelectionMerge %240 None
+               OpBranchConditional %239 %240 %241
+        %240 = OpLabel
+        %242 = OpAccessChain %_ptr_Function_int %data %int_8
+        %243 = OpLoad %int %242
+        %244 = OpConvertSToF %float %243
+        %245 = OpFMul %float %244 %float_0_100000001
+        %246 = OpFAdd %float %float_0_5 %245
+               OpBranch %231
+        %241 = OpLabel
+               OpKill
+        %231 = OpLabel
+        %247 = OpPhi %float %238 %232 %246 %240
+               OpBranch %222
+        %222 = OpLabel
+        %248 = OpPhi %float %229 %223 %247 %231
+               OpBranch %213
+        %213 = OpLabel
+        %249 = OpPhi %float %220 %214 %248 %222
+        %250 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+        %251 = OpLoad %float %250
+        %252 = OpFOrdGreaterThan %bool %62 %251
+               OpSelectionMerge %253 None
+               OpBranchConditional %252 %254 %253
+        %254 = OpLabel
+               OpStore %_GLF_color %54
+               OpBranch %253
+        %253 = OpLabel
+               OpBranch %255
+        %255 = OpLabel
+        %256 = OpPhi %v2float %55 %253 %257 %258
+        %259 = OpPhi %int %int_0 %253 %260 %258
+        %261 = OpSLessThanEqual %bool %259 %int_32
+               OpLoopMerge %262 %258 None
+               OpBranchConditional %261 %263 %262
+        %263 = OpLabel
+        %264 = OpCompositeExtract %float %256 0
+        %265 = OpFOrdLessThan %bool %264 %float_0
+               OpSelectionMerge %266 None
+               OpBranchConditional %265 %267 %266
+        %267 = OpLabel
+               OpSelectionMerge %268 None
+               OpBranchConditional %252 %269 %268
+        %269 = OpLabel
+               OpKill
+        %268 = OpLabel
+        %270 = OpCompositeExtract %float %256 1
+        %271 = OpFAdd %float %270 %float_1
+        %272 = OpCompositeInsert %v2float %271 %256 1
+               OpBranch %266
+        %266 = OpLabel
+        %273 = OpPhi %v2float %256 %263 %272 %268
+        %274 = OpCompositeExtract %float %273 1
+        %275 = OpCompositeExtract %float %273 0
+        %276 = OpFAdd %float %275 %274
+        %257 = OpCompositeInsert %v2float %276 %273 0
+               OpBranch %258
+        %258 = OpLabel
+        %260 = OpIAdd %int %259 %int_1
+               OpBranch %255
+        %262 = OpLabel
+               OpBranch %209
+        %209 = OpLabel
+               OpBranch %200
+        %200 = OpLabel
+        %277 = OpPhi %float %207 %201 %249 %209
+               OpBranch %191
+        %191 = OpLabel
+        %278 = OpPhi %float %198 %192 %277 %200
+               OpBranch %182
+        %182 = OpLabel
+        %279 = OpPhi %float %189 %183 %278 %191
+               OpBranch %173
+        %173 = OpLabel
+        %280 = OpPhi %float %180 %174 %279 %182
+        %281 = OpCompositeConstruct %v4float %280 %280 %280 %float_1
+               OpStore %_GLF_color %281
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-for-always-false-if-discard/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-for-always-false-if-discard/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..d8b974e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-for-always-false-if-discard/1.spvasm.expected.hlsl
@@ -0,0 +1,357 @@
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int temp[10] = (int[10])0;
+  int data[10] = (int[10])0;
+  float x_180 = 0.0f;
+  float x_279 = 0.0f;
+  int x_65_phi = 0;
+  int x_93_phi = 0;
+  int x_102_phi = 0;
+  float x_280_phi = 0.0f;
+  const float x_62 = asfloat(x_8[0].x);
+  const int x_63 = int(x_62);
+  x_65_phi = x_63;
+  while (true) {
+    const int x_65 = x_65_phi;
+    switch(x_65) {
+      case 9: {
+        data[x_65] = -5;
+        break;
+      }
+      case 8: {
+        data[x_65] = -4;
+        break;
+      }
+      case 7: {
+        data[x_65] = -3;
+        break;
+      }
+      case 6: {
+        data[x_65] = -2;
+        break;
+      }
+      case 5: {
+        data[x_65] = -1;
+        break;
+      }
+      case 4: {
+        data[x_65] = 0;
+        break;
+      }
+      case 3: {
+        data[x_65] = 1;
+        break;
+      }
+      case 2: {
+        data[x_65] = 2;
+        break;
+      }
+      case 1: {
+        data[x_65] = 3;
+        break;
+      }
+      case 0: {
+        data[x_65] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    const int x_66 = (x_65 + 1);
+    {
+      x_65_phi = x_66;
+      if ((x_66 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_93_phi = 0;
+  while (true) {
+    int x_94 = 0;
+    const int x_93 = x_93_phi;
+    if ((x_93 < 10)) {
+    } else {
+      break;
+    }
+    {
+      const int x_99 = data[x_93];
+      temp[x_93] = x_99;
+      x_94 = (x_93 + 1);
+      x_93_phi = x_94;
+    }
+  }
+  x_102_phi = 1;
+  while (true) {
+    int x_103 = 0;
+    int x_109_phi = 0;
+    const int x_102 = x_102_phi;
+    if ((x_102 <= 9)) {
+    } else {
+      break;
+    }
+    x_109_phi = 0;
+    while (true) {
+      int x_121 = 0;
+      int x_126 = 0;
+      int x_121_phi = 0;
+      int x_124_phi = 0;
+      int x_126_phi = 0;
+      int x_148_phi = 0;
+      int x_151_phi = 0;
+      int x_161_phi = 0;
+      const int x_109 = x_109_phi;
+      if ((x_109 < 9)) {
+      } else {
+        break;
+      }
+      const int x_115 = (x_109 + x_102);
+      const int x_116 = (x_115 - 1);
+      const int x_110 = (x_109 + (2 * x_102));
+      const int x_119 = min((x_110 - 1), 9);
+      x_121_phi = x_109;
+      x_124_phi = x_115;
+      x_126_phi = x_109;
+      while (true) {
+        int x_141 = 0;
+        int x_144 = 0;
+        int x_125_phi = 0;
+        int x_127_phi = 0;
+        x_121 = x_121_phi;
+        const int x_124 = x_124_phi;
+        x_126 = x_126_phi;
+        bool tint_tmp = (x_126 <= x_116);
+        if (tint_tmp) {
+          tint_tmp = (x_124 <= x_119);
+        }
+        if ((tint_tmp)) {
+        } else {
+          break;
+        }
+        const int x_133_save = x_126;
+        const int x_134 = data[x_133_save];
+        const int x_135_save = x_124;
+        const int x_136 = data[x_135_save];
+        const int x_122 = asint((x_121 + asint(1)));
+        if ((x_134 < x_136)) {
+          x_141 = asint((x_126 + asint(1)));
+          const int x_142 = data[x_133_save];
+          temp[x_121] = x_142;
+          x_125_phi = x_124;
+          x_127_phi = x_141;
+        } else {
+          x_144 = (x_124 + 1);
+          const int x_145 = data[x_135_save];
+          temp[x_121] = x_145;
+          x_125_phi = x_144;
+          x_127_phi = x_126;
+        }
+        const int x_125 = x_125_phi;
+        const int x_127 = x_127_phi;
+        {
+          x_121_phi = x_122;
+          x_124_phi = x_125;
+          x_126_phi = x_127;
+        }
+      }
+      x_148_phi = x_121;
+      x_151_phi = x_126;
+      while (true) {
+        int x_149 = 0;
+        int x_152 = 0;
+        const int x_148 = x_148_phi;
+        const int x_151 = x_151_phi;
+        bool tint_tmp_1 = (x_151 < 10);
+        if (tint_tmp_1) {
+          tint_tmp_1 = (x_151 <= x_116);
+        }
+        if ((tint_tmp_1)) {
+        } else {
+          break;
+        }
+        {
+          x_149 = (x_148 + 1);
+          x_152 = (x_151 + 1);
+          const int x_158 = data[x_151];
+          temp[x_148] = x_158;
+          x_148_phi = x_149;
+          x_151_phi = x_152;
+        }
+      }
+      x_161_phi = x_109;
+      while (true) {
+        int x_162 = 0;
+        const int x_161 = x_161_phi;
+        if ((x_161 <= x_119)) {
+        } else {
+          break;
+        }
+        {
+          const int x_167 = temp[x_161];
+          data[x_161] = x_167;
+          x_162 = (x_161 + 1);
+          x_161_phi = x_162;
+        }
+      }
+      {
+        x_109_phi = x_110;
+      }
+    }
+    {
+      x_103 = (2 * x_102);
+      x_102_phi = x_103;
+    }
+  }
+  int x_171 = 0;
+  float x_189 = 0.0f;
+  float x_278 = 0.0f;
+  float x_279_phi = 0.0f;
+  const float x_170 = gl_FragCoord.y;
+  x_171 = int(x_170);
+  if ((x_171 < 30)) {
+    const int x_177 = data[0];
+    x_180 = (0.5f + (float(x_177) * 0.100000001f));
+    x_280_phi = x_180;
+  } else {
+    float x_198 = 0.0f;
+    float x_277 = 0.0f;
+    float x_278_phi = 0.0f;
+    if ((x_171 < 60)) {
+      const int x_186 = data[1];
+      x_189 = (0.5f + (float(x_186) * 0.100000001f));
+      x_279_phi = x_189;
+    } else {
+      float x_207 = 0.0f;
+      float x_249 = 0.0f;
+      float x_277_phi = 0.0f;
+      if ((x_171 < 90)) {
+        const int x_195 = data[2];
+        x_198 = (0.5f + (float(x_195) * 0.100000001f));
+        x_278_phi = x_198;
+      } else {
+        if ((x_171 < 120)) {
+          const int x_204 = data[3];
+          x_207 = (0.5f + (float(x_204) * 0.100000001f));
+          x_277_phi = x_207;
+        } else {
+          float x_220 = 0.0f;
+          float x_248 = 0.0f;
+          float x_249_phi = 0.0f;
+          float2 x_256_phi = float2(0.0f, 0.0f);
+          int x_259_phi = 0;
+          if ((x_171 < 150)) {
+            discard;
+          } else {
+            float x_229 = 0.0f;
+            float x_247 = 0.0f;
+            float x_248_phi = 0.0f;
+            if ((x_171 < 180)) {
+              const int x_217 = data[5];
+              x_220 = (0.5f + (float(x_217) * 0.100000001f));
+              x_249_phi = x_220;
+            } else {
+              float x_238 = 0.0f;
+              float x_246 = 0.0f;
+              float x_247_phi = 0.0f;
+              if ((x_171 < 210)) {
+                const int x_226 = data[6];
+                x_229 = (0.5f + (float(x_226) * 0.100000001f));
+                x_248_phi = x_229;
+              } else {
+                if ((x_171 < 240)) {
+                  const int x_235 = data[7];
+                  x_238 = (0.5f + (float(x_235) * 0.100000001f));
+                  x_247_phi = x_238;
+                } else {
+                  if ((x_171 < 270)) {
+                  } else {
+                    discard;
+                  }
+                  const int x_243 = data[8];
+                  x_246 = (0.5f + (float(x_243) * 0.100000001f));
+                  x_247_phi = x_246;
+                }
+                x_247 = x_247_phi;
+                x_248_phi = x_247;
+              }
+              x_248 = x_248_phi;
+              x_249_phi = x_248;
+            }
+            x_249 = x_249_phi;
+            const float x_251 = asfloat(x_8[0].y);
+            const bool x_252 = (x_62 > x_251);
+            if (x_252) {
+              x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+            }
+            x_256_phi = float2(1.0f, 1.0f);
+            x_259_phi = 0;
+            while (true) {
+              float2 x_272 = float2(0.0f, 0.0f);
+              int x_260 = 0;
+              float2 x_273_phi = float2(0.0f, 0.0f);
+              const float2 x_256 = x_256_phi;
+              const int x_259 = x_259_phi;
+              if ((x_259 <= 32)) {
+              } else {
+                break;
+              }
+              x_273_phi = x_256;
+              if ((x_256.x < 0.0f)) {
+                if (x_252) {
+                  discard;
+                }
+                x_272 = x_256;
+                x_272.y = (x_256.y + 1.0f);
+                x_273_phi = x_272;
+              }
+              const float2 x_273 = x_273_phi;
+              float2 x_257_1 = x_273;
+              x_257_1.x = (x_273.x + x_273.y);
+              const float2 x_257 = x_257_1;
+              {
+                x_260 = (x_259 + 1);
+                x_256_phi = x_257;
+                x_259_phi = x_260;
+              }
+            }
+          }
+          x_277_phi = x_249;
+        }
+        x_277 = x_277_phi;
+        x_278_phi = x_277;
+      }
+      x_278 = x_278_phi;
+      x_279_phi = x_278;
+    }
+    x_279 = x_279_phi;
+    x_280_phi = x_279;
+  }
+  const float x_280 = x_280_phi;
+  x_GLF_color = float4(x_280, x_280, x_280, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-for-always-false-if-discard/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-for-always-false-if-discard/1.spvasm.expected.msl
new file mode 100644
index 0000000..ae3ef06
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-for-always-false-if-discard/1.spvasm.expected.msl
@@ -0,0 +1,351 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  tint_array_wrapper temp = {};
+  tint_array_wrapper data = {};
+  float x_180 = 0.0f;
+  float x_279 = 0.0f;
+  int x_65_phi = 0;
+  int x_93_phi = 0;
+  int x_102_phi = 0;
+  float x_280_phi = 0.0f;
+  float const x_62 = x_8.injectionSwitch.x;
+  int const x_63 = int(x_62);
+  x_65_phi = x_63;
+  while (true) {
+    int const x_65 = x_65_phi;
+    switch(x_65) {
+      case 9: {
+        data.arr[x_65] = -5;
+        break;
+      }
+      case 8: {
+        data.arr[x_65] = -4;
+        break;
+      }
+      case 7: {
+        data.arr[x_65] = -3;
+        break;
+      }
+      case 6: {
+        data.arr[x_65] = -2;
+        break;
+      }
+      case 5: {
+        data.arr[x_65] = -1;
+        break;
+      }
+      case 4: {
+        data.arr[x_65] = 0;
+        break;
+      }
+      case 3: {
+        data.arr[x_65] = 1;
+        break;
+      }
+      case 2: {
+        data.arr[x_65] = 2;
+        break;
+      }
+      case 1: {
+        data.arr[x_65] = 3;
+        break;
+      }
+      case 0: {
+        data.arr[x_65] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    int const x_66 = (x_65 + 1);
+    {
+      x_65_phi = x_66;
+      if ((x_66 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_93_phi = 0;
+  while (true) {
+    int x_94 = 0;
+    int const x_93 = x_93_phi;
+    if ((x_93 < 10)) {
+    } else {
+      break;
+    }
+    {
+      int const x_99 = data.arr[x_93];
+      temp.arr[x_93] = x_99;
+      x_94 = (x_93 + 1);
+      x_93_phi = x_94;
+    }
+  }
+  x_102_phi = 1;
+  while (true) {
+    int x_103 = 0;
+    int x_109_phi = 0;
+    int const x_102 = x_102_phi;
+    if ((x_102 <= 9)) {
+    } else {
+      break;
+    }
+    x_109_phi = 0;
+    while (true) {
+      int x_121 = 0;
+      int x_126 = 0;
+      int x_121_phi = 0;
+      int x_124_phi = 0;
+      int x_126_phi = 0;
+      int x_148_phi = 0;
+      int x_151_phi = 0;
+      int x_161_phi = 0;
+      int const x_109 = x_109_phi;
+      if ((x_109 < 9)) {
+      } else {
+        break;
+      }
+      int const x_115 = (x_109 + x_102);
+      int const x_116 = (x_115 - 1);
+      int const x_110 = (x_109 + (2 * x_102));
+      int const x_119 = min((x_110 - 1), 9);
+      x_121_phi = x_109;
+      x_124_phi = x_115;
+      x_126_phi = x_109;
+      while (true) {
+        int x_141 = 0;
+        int x_144 = 0;
+        int x_125_phi = 0;
+        int x_127_phi = 0;
+        x_121 = x_121_phi;
+        int const x_124 = x_124_phi;
+        x_126 = x_126_phi;
+        if (((x_126 <= x_116) && (x_124 <= x_119))) {
+        } else {
+          break;
+        }
+        int const x_133_save = x_126;
+        int const x_134 = data.arr[x_133_save];
+        int const x_135_save = x_124;
+        int const x_136 = data.arr[x_135_save];
+        int const x_122 = as_type<int>((x_121 + as_type<int>(1)));
+        if ((x_134 < x_136)) {
+          x_141 = as_type<int>((x_126 + as_type<int>(1)));
+          int const x_142 = data.arr[x_133_save];
+          temp.arr[x_121] = x_142;
+          x_125_phi = x_124;
+          x_127_phi = x_141;
+        } else {
+          x_144 = (x_124 + 1);
+          int const x_145 = data.arr[x_135_save];
+          temp.arr[x_121] = x_145;
+          x_125_phi = x_144;
+          x_127_phi = x_126;
+        }
+        int const x_125 = x_125_phi;
+        int const x_127 = x_127_phi;
+        {
+          x_121_phi = x_122;
+          x_124_phi = x_125;
+          x_126_phi = x_127;
+        }
+      }
+      x_148_phi = x_121;
+      x_151_phi = x_126;
+      while (true) {
+        int x_149 = 0;
+        int x_152 = 0;
+        int const x_148 = x_148_phi;
+        int const x_151 = x_151_phi;
+        if (((x_151 < 10) && (x_151 <= x_116))) {
+        } else {
+          break;
+        }
+        {
+          x_149 = (x_148 + 1);
+          x_152 = (x_151 + 1);
+          int const x_158 = data.arr[x_151];
+          temp.arr[x_148] = x_158;
+          x_148_phi = x_149;
+          x_151_phi = x_152;
+        }
+      }
+      x_161_phi = x_109;
+      while (true) {
+        int x_162 = 0;
+        int const x_161 = x_161_phi;
+        if ((x_161 <= x_119)) {
+        } else {
+          break;
+        }
+        {
+          int const x_167 = temp.arr[x_161];
+          data.arr[x_161] = x_167;
+          x_162 = (x_161 + 1);
+          x_161_phi = x_162;
+        }
+      }
+      {
+        x_109_phi = x_110;
+      }
+    }
+    {
+      x_103 = (2 * x_102);
+      x_102_phi = x_103;
+    }
+  }
+  int x_171 = 0;
+  float x_189 = 0.0f;
+  float x_278 = 0.0f;
+  float x_279_phi = 0.0f;
+  float const x_170 = (*(tint_symbol_5)).y;
+  x_171 = int(x_170);
+  if ((x_171 < 30)) {
+    int const x_177 = data.arr[0];
+    x_180 = (0.5f + (float(x_177) * 0.100000001f));
+    x_280_phi = x_180;
+  } else {
+    float x_198 = 0.0f;
+    float x_277 = 0.0f;
+    float x_278_phi = 0.0f;
+    if ((x_171 < 60)) {
+      int const x_186 = data.arr[1];
+      x_189 = (0.5f + (float(x_186) * 0.100000001f));
+      x_279_phi = x_189;
+    } else {
+      float x_207 = 0.0f;
+      float x_249 = 0.0f;
+      float x_277_phi = 0.0f;
+      if ((x_171 < 90)) {
+        int const x_195 = data.arr[2];
+        x_198 = (0.5f + (float(x_195) * 0.100000001f));
+        x_278_phi = x_198;
+      } else {
+        if ((x_171 < 120)) {
+          int const x_204 = data.arr[3];
+          x_207 = (0.5f + (float(x_204) * 0.100000001f));
+          x_277_phi = x_207;
+        } else {
+          float x_220 = 0.0f;
+          float x_248 = 0.0f;
+          float x_249_phi = 0.0f;
+          float2 x_256_phi = 0.0f;
+          int x_259_phi = 0;
+          if ((x_171 < 150)) {
+            discard_fragment();
+          } else {
+            float x_229 = 0.0f;
+            float x_247 = 0.0f;
+            float x_248_phi = 0.0f;
+            if ((x_171 < 180)) {
+              int const x_217 = data.arr[5];
+              x_220 = (0.5f + (float(x_217) * 0.100000001f));
+              x_249_phi = x_220;
+            } else {
+              float x_238 = 0.0f;
+              float x_246 = 0.0f;
+              float x_247_phi = 0.0f;
+              if ((x_171 < 210)) {
+                int const x_226 = data.arr[6];
+                x_229 = (0.5f + (float(x_226) * 0.100000001f));
+                x_248_phi = x_229;
+              } else {
+                if ((x_171 < 240)) {
+                  int const x_235 = data.arr[7];
+                  x_238 = (0.5f + (float(x_235) * 0.100000001f));
+                  x_247_phi = x_238;
+                } else {
+                  if ((x_171 < 270)) {
+                  } else {
+                    discard_fragment();
+                  }
+                  int const x_243 = data.arr[8];
+                  x_246 = (0.5f + (float(x_243) * 0.100000001f));
+                  x_247_phi = x_246;
+                }
+                x_247 = x_247_phi;
+                x_248_phi = x_247;
+              }
+              x_248 = x_248_phi;
+              x_249_phi = x_248;
+            }
+            x_249 = x_249_phi;
+            float const x_251 = x_8.injectionSwitch.y;
+            bool const x_252 = (x_62 > x_251);
+            if (x_252) {
+              *(tint_symbol_6) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+            }
+            x_256_phi = float2(1.0f, 1.0f);
+            x_259_phi = 0;
+            while (true) {
+              float2 x_272 = 0.0f;
+              int x_260 = 0;
+              float2 x_273_phi = 0.0f;
+              float2 const x_256 = x_256_phi;
+              int const x_259 = x_259_phi;
+              if ((x_259 <= 32)) {
+              } else {
+                break;
+              }
+              x_273_phi = x_256;
+              if ((x_256.x < 0.0f)) {
+                if (x_252) {
+                  discard_fragment();
+                }
+                x_272 = x_256;
+                x_272.y = (x_256.y + 1.0f);
+                x_273_phi = x_272;
+              }
+              float2 const x_273 = x_273_phi;
+              float2 x_257_1 = x_273;
+              x_257_1.x = (x_273.x + x_273.y);
+              float2 const x_257 = x_257_1;
+              {
+                x_260 = (x_259 + 1);
+                x_256_phi = x_257;
+                x_259_phi = x_260;
+              }
+            }
+          }
+          x_277_phi = x_249;
+        }
+        x_277 = x_277_phi;
+        x_278_phi = x_277;
+      }
+      x_278 = x_278_phi;
+      x_279_phi = x_278;
+    }
+    x_279 = x_279_phi;
+    x_280_phi = x_279;
+  }
+  float const x_280 = x_280_phi;
+  *(tint_symbol_6) = float4(x_280, x_280, x_280, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_8, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-for-always-false-if-discard/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-for-always-false-if-discard/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..9831f2b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-for-always-false-if-discard/1.spvasm.expected.spvasm
@@ -0,0 +1,759 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 435
+; Schema: 0
+               OpCapability Shader
+        %135 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_8 "x_8"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %temp "temp"
+               OpName %data "data"
+               OpName %x_180 "x_180"
+               OpName %x_279 "x_279"
+               OpName %x_65_phi "x_65_phi"
+               OpName %x_93_phi "x_93_phi"
+               OpName %x_102_phi "x_102_phi"
+               OpName %x_280_phi "x_280_phi"
+               OpName %x_94 "x_94"
+               OpName %x_103 "x_103"
+               OpName %x_109_phi "x_109_phi"
+               OpName %x_121 "x_121"
+               OpName %x_126 "x_126"
+               OpName %x_121_phi "x_121_phi"
+               OpName %x_124_phi "x_124_phi"
+               OpName %x_126_phi "x_126_phi"
+               OpName %x_148_phi "x_148_phi"
+               OpName %x_151_phi "x_151_phi"
+               OpName %x_161_phi "x_161_phi"
+               OpName %x_141 "x_141"
+               OpName %x_144 "x_144"
+               OpName %x_125_phi "x_125_phi"
+               OpName %x_127_phi "x_127_phi"
+               OpName %x_149 "x_149"
+               OpName %x_152 "x_152"
+               OpName %x_162 "x_162"
+               OpName %x_171 "x_171"
+               OpName %x_189 "x_189"
+               OpName %x_278 "x_278"
+               OpName %x_279_phi "x_279_phi"
+               OpName %x_198 "x_198"
+               OpName %x_277 "x_277"
+               OpName %x_278_phi "x_278_phi"
+               OpName %x_207 "x_207"
+               OpName %x_249 "x_249"
+               OpName %x_277_phi "x_277_phi"
+               OpName %x_220 "x_220"
+               OpName %x_248 "x_248"
+               OpName %x_249_phi "x_249_phi"
+               OpName %x_256_phi "x_256_phi"
+               OpName %x_259_phi "x_259_phi"
+               OpName %x_229 "x_229"
+               OpName %x_247 "x_247"
+               OpName %x_248_phi "x_248_phi"
+               OpName %x_238 "x_238"
+               OpName %x_246 "x_246"
+               OpName %x_247_phi "x_247_phi"
+               OpName %x_272 "x_272"
+               OpName %x_260 "x_260"
+               OpName %x_273_phi "x_273_phi"
+               OpName %x_257_1 "x_257_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+         %25 = OpConstantNull %_arr_int_uint_10
+%_ptr_Function_float = OpTypePointer Function %float
+         %29 = OpConstantNull %float
+%_ptr_Function_int = OpTypePointer Function %int
+         %33 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %int_n5 = OpConstant %int -5
+     %int_n4 = OpConstant %int -4
+     %int_n3 = OpConstant %int -3
+     %int_n2 = OpConstant %int -2
+     %int_n1 = OpConstant %int -1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+     %int_10 = OpConstant %int 10
+       %bool = OpTypeBool
+      %int_9 = OpConstant %int 9
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %int_30 = OpConstant %int 30
+  %float_0_5 = OpConstant %float 0.5
+%float_0_100000001 = OpConstant %float 0.100000001
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+        %300 = OpConstantNull %v2float
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+    %float_1 = OpConstant %float 1
+        %377 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+        %378 = OpConstantComposite %v2float %float_1 %float_1
+     %int_32 = OpConstant %int 32
+    %float_0 = OpConstant %float 0
+   %main_out = OpTypeStruct %v4float
+        %422 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+       %temp = OpVariable %_ptr_Function__arr_int_uint_10 Function %25
+       %data = OpVariable %_ptr_Function__arr_int_uint_10 Function %25
+      %x_180 = OpVariable %_ptr_Function_float Function %29
+      %x_279 = OpVariable %_ptr_Function_float Function %29
+   %x_65_phi = OpVariable %_ptr_Function_int Function %33
+   %x_93_phi = OpVariable %_ptr_Function_int Function %33
+  %x_102_phi = OpVariable %_ptr_Function_int Function %33
+  %x_280_phi = OpVariable %_ptr_Function_float Function %29
+       %x_94 = OpVariable %_ptr_Function_int Function %33
+      %x_103 = OpVariable %_ptr_Function_int Function %33
+  %x_109_phi = OpVariable %_ptr_Function_int Function %33
+      %x_121 = OpVariable %_ptr_Function_int Function %33
+      %x_126 = OpVariable %_ptr_Function_int Function %33
+  %x_121_phi = OpVariable %_ptr_Function_int Function %33
+  %x_124_phi = OpVariable %_ptr_Function_int Function %33
+  %x_126_phi = OpVariable %_ptr_Function_int Function %33
+  %x_148_phi = OpVariable %_ptr_Function_int Function %33
+  %x_151_phi = OpVariable %_ptr_Function_int Function %33
+  %x_161_phi = OpVariable %_ptr_Function_int Function %33
+      %x_141 = OpVariable %_ptr_Function_int Function %33
+      %x_144 = OpVariable %_ptr_Function_int Function %33
+  %x_125_phi = OpVariable %_ptr_Function_int Function %33
+  %x_127_phi = OpVariable %_ptr_Function_int Function %33
+      %x_149 = OpVariable %_ptr_Function_int Function %33
+      %x_152 = OpVariable %_ptr_Function_int Function %33
+      %x_162 = OpVariable %_ptr_Function_int Function %33
+      %x_171 = OpVariable %_ptr_Function_int Function %33
+      %x_189 = OpVariable %_ptr_Function_float Function %29
+      %x_278 = OpVariable %_ptr_Function_float Function %29
+  %x_279_phi = OpVariable %_ptr_Function_float Function %29
+      %x_198 = OpVariable %_ptr_Function_float Function %29
+      %x_277 = OpVariable %_ptr_Function_float Function %29
+  %x_278_phi = OpVariable %_ptr_Function_float Function %29
+      %x_207 = OpVariable %_ptr_Function_float Function %29
+      %x_249 = OpVariable %_ptr_Function_float Function %29
+  %x_277_phi = OpVariable %_ptr_Function_float Function %29
+      %x_220 = OpVariable %_ptr_Function_float Function %29
+      %x_248 = OpVariable %_ptr_Function_float Function %29
+  %x_249_phi = OpVariable %_ptr_Function_float Function %29
+  %x_256_phi = OpVariable %_ptr_Function_v2float Function %300
+  %x_259_phi = OpVariable %_ptr_Function_int Function %33
+      %x_229 = OpVariable %_ptr_Function_float Function %29
+      %x_247 = OpVariable %_ptr_Function_float Function %29
+  %x_248_phi = OpVariable %_ptr_Function_float Function %29
+      %x_238 = OpVariable %_ptr_Function_float Function %29
+      %x_246 = OpVariable %_ptr_Function_float Function %29
+  %x_247_phi = OpVariable %_ptr_Function_float Function %29
+      %x_272 = OpVariable %_ptr_Function_v2float Function %300
+      %x_260 = OpVariable %_ptr_Function_int Function %33
+  %x_273_phi = OpVariable %_ptr_Function_v2float Function %300
+    %x_257_1 = OpVariable %_ptr_Function_v2float Function %300
+         %39 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+         %40 = OpLoad %float %39
+         %41 = OpConvertFToS %int %40
+               OpStore %x_65_phi %41
+               OpBranch %42
+         %42 = OpLabel
+               OpLoopMerge %43 %44 None
+               OpBranch %45
+         %45 = OpLabel
+         %46 = OpLoad %int %x_65_phi
+               OpSelectionMerge %47 None
+               OpSwitch %46 %48 9 %49 8 %50 7 %51 6 %52 5 %53 4 %54 3 %55 2 %56 1 %57 0 %58
+         %49 = OpLabel
+         %59 = OpAccessChain %_ptr_Function_int %data %46
+               OpStore %59 %int_n5
+               OpBranch %47
+         %50 = OpLabel
+         %61 = OpAccessChain %_ptr_Function_int %data %46
+               OpStore %61 %int_n4
+               OpBranch %47
+         %51 = OpLabel
+         %63 = OpAccessChain %_ptr_Function_int %data %46
+               OpStore %63 %int_n3
+               OpBranch %47
+         %52 = OpLabel
+         %65 = OpAccessChain %_ptr_Function_int %data %46
+               OpStore %65 %int_n2
+               OpBranch %47
+         %53 = OpLabel
+         %67 = OpAccessChain %_ptr_Function_int %data %46
+               OpStore %67 %int_n1
+               OpBranch %47
+         %54 = OpLabel
+         %69 = OpAccessChain %_ptr_Function_int %data %46
+               OpStore %69 %int_0
+               OpBranch %47
+         %55 = OpLabel
+         %71 = OpAccessChain %_ptr_Function_int %data %46
+               OpStore %71 %int_1
+               OpBranch %47
+         %56 = OpLabel
+         %73 = OpAccessChain %_ptr_Function_int %data %46
+               OpStore %73 %int_2
+               OpBranch %47
+         %57 = OpLabel
+         %75 = OpAccessChain %_ptr_Function_int %data %46
+               OpStore %75 %int_3
+               OpBranch %47
+         %58 = OpLabel
+         %77 = OpAccessChain %_ptr_Function_int %data %46
+               OpStore %77 %int_4
+               OpBranch %47
+         %48 = OpLabel
+               OpBranch %47
+         %47 = OpLabel
+         %79 = OpIAdd %int %46 %int_1
+               OpBranch %44
+         %44 = OpLabel
+               OpStore %x_65_phi %79
+         %81 = OpSLessThan %bool %79 %int_10
+               OpSelectionMerge %83 None
+               OpBranchConditional %81 %84 %85
+         %84 = OpLabel
+               OpBranch %83
+         %85 = OpLabel
+               OpBranch %43
+         %83 = OpLabel
+               OpBranch %42
+         %43 = OpLabel
+               OpStore %x_93_phi %int_0
+               OpBranch %86
+         %86 = OpLabel
+               OpLoopMerge %87 %88 None
+               OpBranch %89
+         %89 = OpLabel
+         %91 = OpLoad %int %x_93_phi
+         %92 = OpSLessThan %bool %91 %int_10
+               OpSelectionMerge %93 None
+               OpBranchConditional %92 %94 %95
+         %94 = OpLabel
+               OpBranch %93
+         %95 = OpLabel
+               OpBranch %87
+         %93 = OpLabel
+               OpBranch %88
+         %88 = OpLabel
+         %96 = OpAccessChain %_ptr_Function_int %data %91
+         %97 = OpLoad %int %96
+         %98 = OpAccessChain %_ptr_Function_int %temp %91
+               OpStore %98 %97
+         %99 = OpIAdd %int %91 %int_1
+               OpStore %x_94 %99
+        %100 = OpLoad %int %x_94
+               OpStore %x_93_phi %100
+               OpBranch %86
+         %87 = OpLabel
+               OpStore %x_102_phi %int_1
+               OpBranch %101
+        %101 = OpLabel
+               OpLoopMerge %102 %103 None
+               OpBranch %104
+        %104 = OpLabel
+        %107 = OpLoad %int %x_102_phi
+        %109 = OpSLessThanEqual %bool %107 %int_9
+               OpSelectionMerge %110 None
+               OpBranchConditional %109 %111 %112
+        %111 = OpLabel
+               OpBranch %110
+        %112 = OpLabel
+               OpBranch %102
+        %110 = OpLabel
+               OpStore %x_109_phi %int_0
+               OpBranch %113
+        %113 = OpLabel
+               OpLoopMerge %114 %115 None
+               OpBranch %116
+        %116 = OpLabel
+        %125 = OpLoad %int %x_109_phi
+        %126 = OpSLessThan %bool %125 %int_9
+               OpSelectionMerge %127 None
+               OpBranchConditional %126 %128 %129
+        %128 = OpLabel
+               OpBranch %127
+        %129 = OpLabel
+               OpBranch %114
+        %127 = OpLabel
+        %130 = OpIAdd %int %125 %107
+        %131 = OpISub %int %130 %int_1
+        %132 = OpIMul %int %int_2 %107
+        %133 = OpIAdd %int %125 %132
+        %136 = OpISub %int %133 %int_1
+        %134 = OpExtInst %int %135 SMin %136 %int_9
+               OpStore %x_121_phi %125
+               OpStore %x_124_phi %130
+               OpStore %x_126_phi %125
+               OpBranch %137
+        %137 = OpLabel
+               OpLoopMerge %138 %139 None
+               OpBranch %140
+        %140 = OpLabel
+        %145 = OpLoad %int %x_121_phi
+               OpStore %x_121 %145
+        %146 = OpLoad %int %x_124_phi
+        %147 = OpLoad %int %x_126_phi
+               OpStore %x_126 %147
+        %148 = OpLoad %int %x_126
+        %149 = OpSLessThanEqual %bool %148 %131
+               OpSelectionMerge %150 None
+               OpBranchConditional %149 %151 %150
+        %151 = OpLabel
+        %152 = OpSLessThanEqual %bool %146 %134
+               OpBranch %150
+        %150 = OpLabel
+        %153 = OpPhi %bool %149 %140 %152 %151
+               OpSelectionMerge %154 None
+               OpBranchConditional %153 %155 %156
+        %155 = OpLabel
+               OpBranch %154
+        %156 = OpLabel
+               OpBranch %138
+        %154 = OpLabel
+        %157 = OpLoad %int %x_126
+        %158 = OpAccessChain %_ptr_Function_int %data %157
+        %159 = OpLoad %int %158
+        %160 = OpAccessChain %_ptr_Function_int %data %146
+        %161 = OpLoad %int %160
+        %163 = OpLoad %int %x_121
+        %164 = OpCopyObject %int %int_1
+        %165 = OpIAdd %int %163 %164
+        %162 = OpCopyObject %int %165
+        %166 = OpSLessThan %bool %159 %161
+               OpSelectionMerge %167 None
+               OpBranchConditional %166 %168 %169
+        %168 = OpLabel
+        %171 = OpLoad %int %x_126
+        %172 = OpCopyObject %int %int_1
+        %173 = OpIAdd %int %171 %172
+        %170 = OpCopyObject %int %173
+               OpStore %x_141 %170
+        %174 = OpAccessChain %_ptr_Function_int %data %157
+        %175 = OpLoad %int %174
+        %176 = OpLoad %int %x_121
+        %177 = OpAccessChain %_ptr_Function_int %temp %176
+               OpStore %177 %175
+               OpStore %x_125_phi %146
+        %178 = OpLoad %int %x_141
+               OpStore %x_127_phi %178
+               OpBranch %167
+        %169 = OpLabel
+        %179 = OpIAdd %int %146 %int_1
+               OpStore %x_144 %179
+        %180 = OpAccessChain %_ptr_Function_int %data %146
+        %181 = OpLoad %int %180
+        %182 = OpLoad %int %x_121
+        %183 = OpAccessChain %_ptr_Function_int %temp %182
+               OpStore %183 %181
+        %184 = OpLoad %int %x_144
+               OpStore %x_125_phi %184
+        %185 = OpLoad %int %x_126
+               OpStore %x_127_phi %185
+               OpBranch %167
+        %167 = OpLabel
+        %186 = OpLoad %int %x_125_phi
+        %187 = OpLoad %int %x_127_phi
+               OpBranch %139
+        %139 = OpLabel
+               OpStore %x_121_phi %162
+               OpStore %x_124_phi %186
+               OpStore %x_126_phi %187
+               OpBranch %137
+        %138 = OpLabel
+        %188 = OpLoad %int %x_121
+               OpStore %x_148_phi %188
+        %189 = OpLoad %int %x_126
+               OpStore %x_151_phi %189
+               OpBranch %190
+        %190 = OpLabel
+               OpLoopMerge %191 %192 None
+               OpBranch %193
+        %193 = OpLabel
+        %196 = OpLoad %int %x_148_phi
+        %197 = OpLoad %int %x_151_phi
+        %198 = OpSLessThan %bool %197 %int_10
+               OpSelectionMerge %199 None
+               OpBranchConditional %198 %200 %199
+        %200 = OpLabel
+        %201 = OpSLessThanEqual %bool %197 %131
+               OpBranch %199
+        %199 = OpLabel
+        %202 = OpPhi %bool %198 %193 %201 %200
+               OpSelectionMerge %203 None
+               OpBranchConditional %202 %204 %205
+        %204 = OpLabel
+               OpBranch %203
+        %205 = OpLabel
+               OpBranch %191
+        %203 = OpLabel
+               OpBranch %192
+        %192 = OpLabel
+        %206 = OpIAdd %int %196 %int_1
+               OpStore %x_149 %206
+        %207 = OpIAdd %int %197 %int_1
+               OpStore %x_152 %207
+        %208 = OpAccessChain %_ptr_Function_int %data %197
+        %209 = OpLoad %int %208
+        %210 = OpAccessChain %_ptr_Function_int %temp %196
+               OpStore %210 %209
+        %211 = OpLoad %int %x_149
+               OpStore %x_148_phi %211
+        %212 = OpLoad %int %x_152
+               OpStore %x_151_phi %212
+               OpBranch %190
+        %191 = OpLabel
+               OpStore %x_161_phi %125
+               OpBranch %213
+        %213 = OpLabel
+               OpLoopMerge %214 %215 None
+               OpBranch %216
+        %216 = OpLabel
+        %218 = OpLoad %int %x_161_phi
+        %219 = OpSLessThanEqual %bool %218 %134
+               OpSelectionMerge %220 None
+               OpBranchConditional %219 %221 %222
+        %221 = OpLabel
+               OpBranch %220
+        %222 = OpLabel
+               OpBranch %214
+        %220 = OpLabel
+               OpBranch %215
+        %215 = OpLabel
+        %223 = OpAccessChain %_ptr_Function_int %temp %218
+        %224 = OpLoad %int %223
+        %225 = OpAccessChain %_ptr_Function_int %data %218
+               OpStore %225 %224
+        %226 = OpIAdd %int %218 %int_1
+               OpStore %x_162 %226
+        %227 = OpLoad %int %x_162
+               OpStore %x_161_phi %227
+               OpBranch %213
+        %214 = OpLabel
+               OpBranch %115
+        %115 = OpLabel
+               OpStore %x_109_phi %133
+               OpBranch %113
+        %114 = OpLabel
+               OpBranch %103
+        %103 = OpLabel
+        %228 = OpIMul %int %int_2 %107
+               OpStore %x_103 %228
+        %229 = OpLoad %int %x_103
+               OpStore %x_102_phi %229
+               OpBranch %101
+        %102 = OpLabel
+        %236 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %237 = OpLoad %float %236
+        %238 = OpConvertFToS %int %237
+               OpStore %x_171 %238
+        %239 = OpLoad %int %x_171
+        %241 = OpSLessThan %bool %239 %int_30
+               OpSelectionMerge %242 None
+               OpBranchConditional %241 %243 %244
+        %243 = OpLabel
+        %245 = OpAccessChain %_ptr_Function_int %data %int_0
+        %246 = OpLoad %int %245
+        %248 = OpConvertSToF %float %246
+        %250 = OpFMul %float %248 %float_0_100000001
+        %251 = OpFAdd %float %float_0_5 %250
+               OpStore %x_180 %251
+        %252 = OpLoad %float %x_180
+               OpStore %x_280_phi %252
+               OpBranch %242
+        %244 = OpLabel
+        %256 = OpLoad %int %x_171
+        %258 = OpSLessThan %bool %256 %int_60
+               OpSelectionMerge %259 None
+               OpBranchConditional %258 %260 %261
+        %260 = OpLabel
+        %262 = OpAccessChain %_ptr_Function_int %data %int_1
+        %263 = OpLoad %int %262
+        %264 = OpConvertSToF %float %263
+        %265 = OpFMul %float %264 %float_0_100000001
+        %266 = OpFAdd %float %float_0_5 %265
+               OpStore %x_189 %266
+        %267 = OpLoad %float %x_189
+               OpStore %x_279_phi %267
+               OpBranch %259
+        %261 = OpLabel
+        %271 = OpLoad %int %x_171
+        %273 = OpSLessThan %bool %271 %int_90
+               OpSelectionMerge %274 None
+               OpBranchConditional %273 %275 %276
+        %275 = OpLabel
+        %277 = OpAccessChain %_ptr_Function_int %data %int_2
+        %278 = OpLoad %int %277
+        %279 = OpConvertSToF %float %278
+        %280 = OpFMul %float %279 %float_0_100000001
+        %281 = OpFAdd %float %float_0_5 %280
+               OpStore %x_198 %281
+        %282 = OpLoad %float %x_198
+               OpStore %x_278_phi %282
+               OpBranch %274
+        %276 = OpLabel
+        %283 = OpLoad %int %x_171
+        %285 = OpSLessThan %bool %283 %int_120
+               OpSelectionMerge %286 None
+               OpBranchConditional %285 %287 %288
+        %287 = OpLabel
+        %289 = OpAccessChain %_ptr_Function_int %data %int_3
+        %290 = OpLoad %int %289
+        %291 = OpConvertSToF %float %290
+        %292 = OpFMul %float %291 %float_0_100000001
+        %293 = OpFAdd %float %float_0_5 %292
+               OpStore %x_207 %293
+        %294 = OpLoad %float %x_207
+               OpStore %x_277_phi %294
+               OpBranch %286
+        %288 = OpLabel
+        %302 = OpLoad %int %x_171
+        %304 = OpSLessThan %bool %302 %int_150
+               OpSelectionMerge %305 None
+               OpBranchConditional %304 %306 %307
+        %306 = OpLabel
+               OpKill
+        %307 = OpLabel
+        %311 = OpLoad %int %x_171
+        %313 = OpSLessThan %bool %311 %int_180
+               OpSelectionMerge %314 None
+               OpBranchConditional %313 %315 %316
+        %315 = OpLabel
+        %318 = OpAccessChain %_ptr_Function_int %data %int_5
+        %319 = OpLoad %int %318
+        %320 = OpConvertSToF %float %319
+        %321 = OpFMul %float %320 %float_0_100000001
+        %322 = OpFAdd %float %float_0_5 %321
+               OpStore %x_220 %322
+        %323 = OpLoad %float %x_220
+               OpStore %x_249_phi %323
+               OpBranch %314
+        %316 = OpLabel
+        %327 = OpLoad %int %x_171
+        %329 = OpSLessThan %bool %327 %int_210
+               OpSelectionMerge %330 None
+               OpBranchConditional %329 %331 %332
+        %331 = OpLabel
+        %334 = OpAccessChain %_ptr_Function_int %data %int_6
+        %335 = OpLoad %int %334
+        %336 = OpConvertSToF %float %335
+        %337 = OpFMul %float %336 %float_0_100000001
+        %338 = OpFAdd %float %float_0_5 %337
+               OpStore %x_229 %338
+        %339 = OpLoad %float %x_229
+               OpStore %x_248_phi %339
+               OpBranch %330
+        %332 = OpLabel
+        %340 = OpLoad %int %x_171
+        %342 = OpSLessThan %bool %340 %int_240
+               OpSelectionMerge %343 None
+               OpBranchConditional %342 %344 %345
+        %344 = OpLabel
+        %347 = OpAccessChain %_ptr_Function_int %data %int_7
+        %348 = OpLoad %int %347
+        %349 = OpConvertSToF %float %348
+        %350 = OpFMul %float %349 %float_0_100000001
+        %351 = OpFAdd %float %float_0_5 %350
+               OpStore %x_238 %351
+        %352 = OpLoad %float %x_238
+               OpStore %x_247_phi %352
+               OpBranch %343
+        %345 = OpLabel
+        %353 = OpLoad %int %x_171
+        %355 = OpSLessThan %bool %353 %int_270
+               OpSelectionMerge %356 None
+               OpBranchConditional %355 %357 %358
+        %357 = OpLabel
+               OpBranch %356
+        %358 = OpLabel
+               OpKill
+        %356 = OpLabel
+        %360 = OpAccessChain %_ptr_Function_int %data %int_8
+        %361 = OpLoad %int %360
+        %362 = OpConvertSToF %float %361
+        %363 = OpFMul %float %362 %float_0_100000001
+        %364 = OpFAdd %float %float_0_5 %363
+               OpStore %x_246 %364
+        %365 = OpLoad %float %x_246
+               OpStore %x_247_phi %365
+               OpBranch %343
+        %343 = OpLabel
+        %366 = OpLoad %float %x_247_phi
+               OpStore %x_247 %366
+        %367 = OpLoad %float %x_247
+               OpStore %x_248_phi %367
+               OpBranch %330
+        %330 = OpLabel
+        %368 = OpLoad %float %x_248_phi
+               OpStore %x_248 %368
+        %369 = OpLoad %float %x_248
+               OpStore %x_249_phi %369
+               OpBranch %314
+        %314 = OpLabel
+        %370 = OpLoad %float %x_249_phi
+               OpStore %x_249 %370
+        %371 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+        %372 = OpLoad %float %371
+        %373 = OpFOrdGreaterThan %bool %40 %372
+               OpSelectionMerge %374 None
+               OpBranchConditional %373 %375 %374
+        %375 = OpLabel
+               OpStore %x_GLF_color %377
+               OpBranch %374
+        %374 = OpLabel
+               OpStore %x_256_phi %378
+               OpStore %x_259_phi %int_0
+               OpBranch %379
+        %379 = OpLabel
+               OpLoopMerge %380 %381 None
+               OpBranch %382
+        %382 = OpLabel
+        %386 = OpLoad %v2float %x_256_phi
+        %387 = OpLoad %int %x_259_phi
+        %389 = OpSLessThanEqual %bool %387 %int_32
+               OpSelectionMerge %390 None
+               OpBranchConditional %389 %391 %392
+        %391 = OpLabel
+               OpBranch %390
+        %392 = OpLabel
+               OpBranch %380
+        %390 = OpLabel
+               OpStore %x_273_phi %386
+        %393 = OpCompositeExtract %float %386 0
+        %395 = OpFOrdLessThan %bool %393 %float_0
+               OpSelectionMerge %396 None
+               OpBranchConditional %395 %397 %396
+        %397 = OpLabel
+               OpSelectionMerge %398 None
+               OpBranchConditional %373 %399 %398
+        %399 = OpLabel
+               OpKill
+        %398 = OpLabel
+               OpStore %x_272 %386
+        %400 = OpAccessChain %_ptr_Function_float %x_272 %uint_1
+        %401 = OpCompositeExtract %float %386 1
+        %402 = OpFAdd %float %401 %float_1
+               OpStore %400 %402
+        %403 = OpLoad %v2float %x_272
+               OpStore %x_273_phi %403
+               OpBranch %396
+        %396 = OpLabel
+        %404 = OpLoad %v2float %x_273_phi
+               OpStore %x_257_1 %404
+        %406 = OpAccessChain %_ptr_Function_float %x_257_1 %uint_0
+        %407 = OpCompositeExtract %float %404 0
+        %408 = OpCompositeExtract %float %404 1
+        %409 = OpFAdd %float %407 %408
+               OpStore %406 %409
+        %410 = OpLoad %v2float %x_257_1
+               OpBranch %381
+        %381 = OpLabel
+        %411 = OpIAdd %int %387 %int_1
+               OpStore %x_260 %411
+               OpStore %x_256_phi %410
+        %412 = OpLoad %int %x_260
+               OpStore %x_259_phi %412
+               OpBranch %379
+        %380 = OpLabel
+               OpBranch %305
+        %305 = OpLabel
+        %413 = OpLoad %float %x_249
+               OpStore %x_277_phi %413
+               OpBranch %286
+        %286 = OpLabel
+        %414 = OpLoad %float %x_277_phi
+               OpStore %x_277 %414
+        %415 = OpLoad %float %x_277
+               OpStore %x_278_phi %415
+               OpBranch %274
+        %274 = OpLabel
+        %416 = OpLoad %float %x_278_phi
+               OpStore %x_278 %416
+        %417 = OpLoad %float %x_278
+               OpStore %x_279_phi %417
+               OpBranch %259
+        %259 = OpLabel
+        %418 = OpLoad %float %x_279_phi
+               OpStore %x_279 %418
+        %419 = OpLoad %float %x_279
+               OpStore %x_280_phi %419
+               OpBranch %242
+        %242 = OpLabel
+        %420 = OpLoad %float %x_280_phi
+        %421 = OpCompositeConstruct %v4float %420 %420 %420 %float_1
+               OpStore %x_GLF_color %421
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %422
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %426 = OpLabel
+        %427 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %427
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %429 = OpLabel
+        %430 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %430
+        %431 = OpFunctionCall %void %main_1
+        %433 = OpLoad %v4float %x_GLF_color
+        %434 = OpCompositeConstruct %main_out %433
+        %432 = OpFunctionCall %void %tint_symbol_3 %434
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 44[%44] is not post dominated by the back-edge block 83[%83]
+  %83 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-for-always-false-if-discard/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-for-always-false-if-discard/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..eb23a41
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-for-always-false-if-discard/1.spvasm.expected.wgsl
@@ -0,0 +1,344 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var temp : array<i32, 10>;
+  var data : array<i32, 10>;
+  var x_180 : f32;
+  var x_279 : f32;
+  var x_65_phi : i32;
+  var x_93_phi : i32;
+  var x_102_phi : i32;
+  var x_280_phi : f32;
+  let x_62 : f32 = x_8.injectionSwitch.x;
+  let x_63 : i32 = i32(x_62);
+  x_65_phi = x_63;
+  loop {
+    let x_65 : i32 = x_65_phi;
+    switch(x_65) {
+      case 9: {
+        data[x_65] = -5;
+      }
+      case 8: {
+        data[x_65] = -4;
+      }
+      case 7: {
+        data[x_65] = -3;
+      }
+      case 6: {
+        data[x_65] = -2;
+      }
+      case 5: {
+        data[x_65] = -1;
+      }
+      case 4: {
+        data[x_65] = 0;
+      }
+      case 3: {
+        data[x_65] = 1;
+      }
+      case 2: {
+        data[x_65] = 2;
+      }
+      case 1: {
+        data[x_65] = 3;
+      }
+      case 0: {
+        data[x_65] = 4;
+      }
+      default: {
+      }
+    }
+    let x_66 : i32 = (x_65 + 1);
+
+    continuing {
+      x_65_phi = x_66;
+      if ((x_66 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_93_phi = 0;
+  loop {
+    var x_94 : i32;
+    let x_93 : i32 = x_93_phi;
+    if ((x_93 < 10)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_99 : i32 = data[x_93];
+      temp[x_93] = x_99;
+      x_94 = (x_93 + 1);
+      x_93_phi = x_94;
+    }
+  }
+  x_102_phi = 1;
+  loop {
+    var x_103 : i32;
+    var x_109_phi : i32;
+    let x_102 : i32 = x_102_phi;
+    if ((x_102 <= 9)) {
+    } else {
+      break;
+    }
+    x_109_phi = 0;
+    loop {
+      var x_121 : i32;
+      var x_126 : i32;
+      var x_121_phi : i32;
+      var x_124_phi : i32;
+      var x_126_phi : i32;
+      var x_148_phi : i32;
+      var x_151_phi : i32;
+      var x_161_phi : i32;
+      let x_109 : i32 = x_109_phi;
+      if ((x_109 < 9)) {
+      } else {
+        break;
+      }
+      let x_115 : i32 = (x_109 + x_102);
+      let x_116 : i32 = (x_115 - 1);
+      let x_110 : i32 = (x_109 + (2 * x_102));
+      let x_119 : i32 = min((x_110 - 1), 9);
+      x_121_phi = x_109;
+      x_124_phi = x_115;
+      x_126_phi = x_109;
+      loop {
+        var x_141 : i32;
+        var x_144 : i32;
+        var x_125_phi : i32;
+        var x_127_phi : i32;
+        x_121 = x_121_phi;
+        let x_124 : i32 = x_124_phi;
+        x_126 = x_126_phi;
+        if (((x_126 <= x_116) && (x_124 <= x_119))) {
+        } else {
+          break;
+        }
+        let x_133 : ptr<function, i32> = &(data[x_126]);
+        let x_134 : i32 = *(x_133);
+        let x_135 : ptr<function, i32> = &(data[x_124]);
+        let x_136 : i32 = *(x_135);
+        let x_122 : i32 = bitcast<i32>((x_121 + bitcast<i32>(1)));
+        if ((x_134 < x_136)) {
+          x_141 = bitcast<i32>((x_126 + bitcast<i32>(1)));
+          let x_142 : i32 = *(x_133);
+          temp[x_121] = x_142;
+          x_125_phi = x_124;
+          x_127_phi = x_141;
+        } else {
+          x_144 = (x_124 + 1);
+          let x_145 : i32 = *(x_135);
+          temp[x_121] = x_145;
+          x_125_phi = x_144;
+          x_127_phi = x_126;
+        }
+        let x_125 : i32 = x_125_phi;
+        let x_127 : i32 = x_127_phi;
+
+        continuing {
+          x_121_phi = x_122;
+          x_124_phi = x_125;
+          x_126_phi = x_127;
+        }
+      }
+      x_148_phi = x_121;
+      x_151_phi = x_126;
+      loop {
+        var x_149 : i32;
+        var x_152 : i32;
+        let x_148 : i32 = x_148_phi;
+        let x_151 : i32 = x_151_phi;
+        if (((x_151 < 10) && (x_151 <= x_116))) {
+        } else {
+          break;
+        }
+
+        continuing {
+          x_149 = (x_148 + 1);
+          x_152 = (x_151 + 1);
+          let x_158 : i32 = data[x_151];
+          temp[x_148] = x_158;
+          x_148_phi = x_149;
+          x_151_phi = x_152;
+        }
+      }
+      x_161_phi = x_109;
+      loop {
+        var x_162 : i32;
+        let x_161 : i32 = x_161_phi;
+        if ((x_161 <= x_119)) {
+        } else {
+          break;
+        }
+
+        continuing {
+          let x_167 : i32 = temp[x_161];
+          data[x_161] = x_167;
+          x_162 = (x_161 + 1);
+          x_161_phi = x_162;
+        }
+      }
+
+      continuing {
+        x_109_phi = x_110;
+      }
+    }
+
+    continuing {
+      x_103 = (2 * x_102);
+      x_102_phi = x_103;
+    }
+  }
+  var x_171 : i32;
+  var x_189 : f32;
+  var x_278 : f32;
+  var x_279_phi : f32;
+  let x_170 : f32 = gl_FragCoord.y;
+  x_171 = i32(x_170);
+  if ((x_171 < 30)) {
+    let x_177 : i32 = data[0];
+    x_180 = (0.5 + (f32(x_177) * 0.100000001));
+    x_280_phi = x_180;
+  } else {
+    var x_198 : f32;
+    var x_277 : f32;
+    var x_278_phi : f32;
+    if ((x_171 < 60)) {
+      let x_186 : i32 = data[1];
+      x_189 = (0.5 + (f32(x_186) * 0.100000001));
+      x_279_phi = x_189;
+    } else {
+      var x_207 : f32;
+      var x_249 : f32;
+      var x_277_phi : f32;
+      if ((x_171 < 90)) {
+        let x_195 : i32 = data[2];
+        x_198 = (0.5 + (f32(x_195) * 0.100000001));
+        x_278_phi = x_198;
+      } else {
+        if ((x_171 < 120)) {
+          let x_204 : i32 = data[3];
+          x_207 = (0.5 + (f32(x_204) * 0.100000001));
+          x_277_phi = x_207;
+        } else {
+          var x_220 : f32;
+          var x_248 : f32;
+          var x_249_phi : f32;
+          var x_256_phi : vec2<f32>;
+          var x_259_phi : i32;
+          if ((x_171 < 150)) {
+            discard;
+          } else {
+            var x_229 : f32;
+            var x_247 : f32;
+            var x_248_phi : f32;
+            if ((x_171 < 180)) {
+              let x_217 : i32 = data[5];
+              x_220 = (0.5 + (f32(x_217) * 0.100000001));
+              x_249_phi = x_220;
+            } else {
+              var x_238 : f32;
+              var x_246 : f32;
+              var x_247_phi : f32;
+              if ((x_171 < 210)) {
+                let x_226 : i32 = data[6];
+                x_229 = (0.5 + (f32(x_226) * 0.100000001));
+                x_248_phi = x_229;
+              } else {
+                if ((x_171 < 240)) {
+                  let x_235 : i32 = data[7];
+                  x_238 = (0.5 + (f32(x_235) * 0.100000001));
+                  x_247_phi = x_238;
+                } else {
+                  if ((x_171 < 270)) {
+                  } else {
+                    discard;
+                  }
+                  let x_243 : i32 = data[8];
+                  x_246 = (0.5 + (f32(x_243) * 0.100000001));
+                  x_247_phi = x_246;
+                }
+                x_247 = x_247_phi;
+                x_248_phi = x_247;
+              }
+              x_248 = x_248_phi;
+              x_249_phi = x_248;
+            }
+            x_249 = x_249_phi;
+            let x_251 : f32 = x_8.injectionSwitch.y;
+            let x_252 : bool = (x_62 > x_251);
+            if (x_252) {
+              x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+            }
+            x_256_phi = vec2<f32>(1.0, 1.0);
+            x_259_phi = 0;
+            loop {
+              var x_272 : vec2<f32>;
+              var x_260 : i32;
+              var x_273_phi : vec2<f32>;
+              let x_256 : vec2<f32> = x_256_phi;
+              let x_259 : i32 = x_259_phi;
+              if ((x_259 <= 32)) {
+              } else {
+                break;
+              }
+              x_273_phi = x_256;
+              if ((x_256.x < 0.0)) {
+                if (x_252) {
+                  discard;
+                }
+                x_272 = x_256;
+                x_272.y = (x_256.y + 1.0);
+                x_273_phi = x_272;
+              }
+              let x_273 : vec2<f32> = x_273_phi;
+              var x_257_1 : vec2<f32> = x_273;
+              x_257_1.x = (x_273.x + x_273.y);
+              let x_257 : vec2<f32> = x_257_1;
+
+              continuing {
+                x_260 = (x_259 + 1);
+                x_256_phi = x_257;
+                x_259_phi = x_260;
+              }
+            }
+          }
+          x_277_phi = x_249;
+        }
+        x_277 = x_277_phi;
+        x_278_phi = x_277;
+      }
+      x_278 = x_278_phi;
+      x_279_phi = x_278;
+    }
+    x_279 = x_279_phi;
+    x_280_phi = x_279;
+  }
+  let x_280 : f32 = x_280_phi;
+  x_GLF_color = vec4<f32>(x_280, x_280, x_280, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-for-always-false-if-discard/1.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-for-always-false-if-discard/1.wgsl
new file mode 100644
index 0000000..eb23a41
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-for-always-false-if-discard/1.wgsl
@@ -0,0 +1,344 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var temp : array<i32, 10>;
+  var data : array<i32, 10>;
+  var x_180 : f32;
+  var x_279 : f32;
+  var x_65_phi : i32;
+  var x_93_phi : i32;
+  var x_102_phi : i32;
+  var x_280_phi : f32;
+  let x_62 : f32 = x_8.injectionSwitch.x;
+  let x_63 : i32 = i32(x_62);
+  x_65_phi = x_63;
+  loop {
+    let x_65 : i32 = x_65_phi;
+    switch(x_65) {
+      case 9: {
+        data[x_65] = -5;
+      }
+      case 8: {
+        data[x_65] = -4;
+      }
+      case 7: {
+        data[x_65] = -3;
+      }
+      case 6: {
+        data[x_65] = -2;
+      }
+      case 5: {
+        data[x_65] = -1;
+      }
+      case 4: {
+        data[x_65] = 0;
+      }
+      case 3: {
+        data[x_65] = 1;
+      }
+      case 2: {
+        data[x_65] = 2;
+      }
+      case 1: {
+        data[x_65] = 3;
+      }
+      case 0: {
+        data[x_65] = 4;
+      }
+      default: {
+      }
+    }
+    let x_66 : i32 = (x_65 + 1);
+
+    continuing {
+      x_65_phi = x_66;
+      if ((x_66 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_93_phi = 0;
+  loop {
+    var x_94 : i32;
+    let x_93 : i32 = x_93_phi;
+    if ((x_93 < 10)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_99 : i32 = data[x_93];
+      temp[x_93] = x_99;
+      x_94 = (x_93 + 1);
+      x_93_phi = x_94;
+    }
+  }
+  x_102_phi = 1;
+  loop {
+    var x_103 : i32;
+    var x_109_phi : i32;
+    let x_102 : i32 = x_102_phi;
+    if ((x_102 <= 9)) {
+    } else {
+      break;
+    }
+    x_109_phi = 0;
+    loop {
+      var x_121 : i32;
+      var x_126 : i32;
+      var x_121_phi : i32;
+      var x_124_phi : i32;
+      var x_126_phi : i32;
+      var x_148_phi : i32;
+      var x_151_phi : i32;
+      var x_161_phi : i32;
+      let x_109 : i32 = x_109_phi;
+      if ((x_109 < 9)) {
+      } else {
+        break;
+      }
+      let x_115 : i32 = (x_109 + x_102);
+      let x_116 : i32 = (x_115 - 1);
+      let x_110 : i32 = (x_109 + (2 * x_102));
+      let x_119 : i32 = min((x_110 - 1), 9);
+      x_121_phi = x_109;
+      x_124_phi = x_115;
+      x_126_phi = x_109;
+      loop {
+        var x_141 : i32;
+        var x_144 : i32;
+        var x_125_phi : i32;
+        var x_127_phi : i32;
+        x_121 = x_121_phi;
+        let x_124 : i32 = x_124_phi;
+        x_126 = x_126_phi;
+        if (((x_126 <= x_116) && (x_124 <= x_119))) {
+        } else {
+          break;
+        }
+        let x_133 : ptr<function, i32> = &(data[x_126]);
+        let x_134 : i32 = *(x_133);
+        let x_135 : ptr<function, i32> = &(data[x_124]);
+        let x_136 : i32 = *(x_135);
+        let x_122 : i32 = bitcast<i32>((x_121 + bitcast<i32>(1)));
+        if ((x_134 < x_136)) {
+          x_141 = bitcast<i32>((x_126 + bitcast<i32>(1)));
+          let x_142 : i32 = *(x_133);
+          temp[x_121] = x_142;
+          x_125_phi = x_124;
+          x_127_phi = x_141;
+        } else {
+          x_144 = (x_124 + 1);
+          let x_145 : i32 = *(x_135);
+          temp[x_121] = x_145;
+          x_125_phi = x_144;
+          x_127_phi = x_126;
+        }
+        let x_125 : i32 = x_125_phi;
+        let x_127 : i32 = x_127_phi;
+
+        continuing {
+          x_121_phi = x_122;
+          x_124_phi = x_125;
+          x_126_phi = x_127;
+        }
+      }
+      x_148_phi = x_121;
+      x_151_phi = x_126;
+      loop {
+        var x_149 : i32;
+        var x_152 : i32;
+        let x_148 : i32 = x_148_phi;
+        let x_151 : i32 = x_151_phi;
+        if (((x_151 < 10) && (x_151 <= x_116))) {
+        } else {
+          break;
+        }
+
+        continuing {
+          x_149 = (x_148 + 1);
+          x_152 = (x_151 + 1);
+          let x_158 : i32 = data[x_151];
+          temp[x_148] = x_158;
+          x_148_phi = x_149;
+          x_151_phi = x_152;
+        }
+      }
+      x_161_phi = x_109;
+      loop {
+        var x_162 : i32;
+        let x_161 : i32 = x_161_phi;
+        if ((x_161 <= x_119)) {
+        } else {
+          break;
+        }
+
+        continuing {
+          let x_167 : i32 = temp[x_161];
+          data[x_161] = x_167;
+          x_162 = (x_161 + 1);
+          x_161_phi = x_162;
+        }
+      }
+
+      continuing {
+        x_109_phi = x_110;
+      }
+    }
+
+    continuing {
+      x_103 = (2 * x_102);
+      x_102_phi = x_103;
+    }
+  }
+  var x_171 : i32;
+  var x_189 : f32;
+  var x_278 : f32;
+  var x_279_phi : f32;
+  let x_170 : f32 = gl_FragCoord.y;
+  x_171 = i32(x_170);
+  if ((x_171 < 30)) {
+    let x_177 : i32 = data[0];
+    x_180 = (0.5 + (f32(x_177) * 0.100000001));
+    x_280_phi = x_180;
+  } else {
+    var x_198 : f32;
+    var x_277 : f32;
+    var x_278_phi : f32;
+    if ((x_171 < 60)) {
+      let x_186 : i32 = data[1];
+      x_189 = (0.5 + (f32(x_186) * 0.100000001));
+      x_279_phi = x_189;
+    } else {
+      var x_207 : f32;
+      var x_249 : f32;
+      var x_277_phi : f32;
+      if ((x_171 < 90)) {
+        let x_195 : i32 = data[2];
+        x_198 = (0.5 + (f32(x_195) * 0.100000001));
+        x_278_phi = x_198;
+      } else {
+        if ((x_171 < 120)) {
+          let x_204 : i32 = data[3];
+          x_207 = (0.5 + (f32(x_204) * 0.100000001));
+          x_277_phi = x_207;
+        } else {
+          var x_220 : f32;
+          var x_248 : f32;
+          var x_249_phi : f32;
+          var x_256_phi : vec2<f32>;
+          var x_259_phi : i32;
+          if ((x_171 < 150)) {
+            discard;
+          } else {
+            var x_229 : f32;
+            var x_247 : f32;
+            var x_248_phi : f32;
+            if ((x_171 < 180)) {
+              let x_217 : i32 = data[5];
+              x_220 = (0.5 + (f32(x_217) * 0.100000001));
+              x_249_phi = x_220;
+            } else {
+              var x_238 : f32;
+              var x_246 : f32;
+              var x_247_phi : f32;
+              if ((x_171 < 210)) {
+                let x_226 : i32 = data[6];
+                x_229 = (0.5 + (f32(x_226) * 0.100000001));
+                x_248_phi = x_229;
+              } else {
+                if ((x_171 < 240)) {
+                  let x_235 : i32 = data[7];
+                  x_238 = (0.5 + (f32(x_235) * 0.100000001));
+                  x_247_phi = x_238;
+                } else {
+                  if ((x_171 < 270)) {
+                  } else {
+                    discard;
+                  }
+                  let x_243 : i32 = data[8];
+                  x_246 = (0.5 + (f32(x_243) * 0.100000001));
+                  x_247_phi = x_246;
+                }
+                x_247 = x_247_phi;
+                x_248_phi = x_247;
+              }
+              x_248 = x_248_phi;
+              x_249_phi = x_248;
+            }
+            x_249 = x_249_phi;
+            let x_251 : f32 = x_8.injectionSwitch.y;
+            let x_252 : bool = (x_62 > x_251);
+            if (x_252) {
+              x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+            }
+            x_256_phi = vec2<f32>(1.0, 1.0);
+            x_259_phi = 0;
+            loop {
+              var x_272 : vec2<f32>;
+              var x_260 : i32;
+              var x_273_phi : vec2<f32>;
+              let x_256 : vec2<f32> = x_256_phi;
+              let x_259 : i32 = x_259_phi;
+              if ((x_259 <= 32)) {
+              } else {
+                break;
+              }
+              x_273_phi = x_256;
+              if ((x_256.x < 0.0)) {
+                if (x_252) {
+                  discard;
+                }
+                x_272 = x_256;
+                x_272.y = (x_256.y + 1.0);
+                x_273_phi = x_272;
+              }
+              let x_273 : vec2<f32> = x_273_phi;
+              var x_257_1 : vec2<f32> = x_273;
+              x_257_1.x = (x_273.x + x_273.y);
+              let x_257 : vec2<f32> = x_257_1;
+
+              continuing {
+                x_260 = (x_259 + 1);
+                x_256_phi = x_257;
+                x_259_phi = x_260;
+              }
+            }
+          }
+          x_277_phi = x_249;
+        }
+        x_277 = x_277_phi;
+        x_278_phi = x_277;
+      }
+      x_278 = x_278_phi;
+      x_279_phi = x_278;
+    }
+    x_279 = x_279_phi;
+    x_280_phi = x_279;
+  }
+  let x_280 : f32 = x_280_phi;
+  x_GLF_color = vec4<f32>(x_280, x_280, x_280, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-for-always-false-if-discard/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-for-always-false-if-discard/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..d8b974e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-for-always-false-if-discard/1.wgsl.expected.hlsl
@@ -0,0 +1,357 @@
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int temp[10] = (int[10])0;
+  int data[10] = (int[10])0;
+  float x_180 = 0.0f;
+  float x_279 = 0.0f;
+  int x_65_phi = 0;
+  int x_93_phi = 0;
+  int x_102_phi = 0;
+  float x_280_phi = 0.0f;
+  const float x_62 = asfloat(x_8[0].x);
+  const int x_63 = int(x_62);
+  x_65_phi = x_63;
+  while (true) {
+    const int x_65 = x_65_phi;
+    switch(x_65) {
+      case 9: {
+        data[x_65] = -5;
+        break;
+      }
+      case 8: {
+        data[x_65] = -4;
+        break;
+      }
+      case 7: {
+        data[x_65] = -3;
+        break;
+      }
+      case 6: {
+        data[x_65] = -2;
+        break;
+      }
+      case 5: {
+        data[x_65] = -1;
+        break;
+      }
+      case 4: {
+        data[x_65] = 0;
+        break;
+      }
+      case 3: {
+        data[x_65] = 1;
+        break;
+      }
+      case 2: {
+        data[x_65] = 2;
+        break;
+      }
+      case 1: {
+        data[x_65] = 3;
+        break;
+      }
+      case 0: {
+        data[x_65] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    const int x_66 = (x_65 + 1);
+    {
+      x_65_phi = x_66;
+      if ((x_66 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_93_phi = 0;
+  while (true) {
+    int x_94 = 0;
+    const int x_93 = x_93_phi;
+    if ((x_93 < 10)) {
+    } else {
+      break;
+    }
+    {
+      const int x_99 = data[x_93];
+      temp[x_93] = x_99;
+      x_94 = (x_93 + 1);
+      x_93_phi = x_94;
+    }
+  }
+  x_102_phi = 1;
+  while (true) {
+    int x_103 = 0;
+    int x_109_phi = 0;
+    const int x_102 = x_102_phi;
+    if ((x_102 <= 9)) {
+    } else {
+      break;
+    }
+    x_109_phi = 0;
+    while (true) {
+      int x_121 = 0;
+      int x_126 = 0;
+      int x_121_phi = 0;
+      int x_124_phi = 0;
+      int x_126_phi = 0;
+      int x_148_phi = 0;
+      int x_151_phi = 0;
+      int x_161_phi = 0;
+      const int x_109 = x_109_phi;
+      if ((x_109 < 9)) {
+      } else {
+        break;
+      }
+      const int x_115 = (x_109 + x_102);
+      const int x_116 = (x_115 - 1);
+      const int x_110 = (x_109 + (2 * x_102));
+      const int x_119 = min((x_110 - 1), 9);
+      x_121_phi = x_109;
+      x_124_phi = x_115;
+      x_126_phi = x_109;
+      while (true) {
+        int x_141 = 0;
+        int x_144 = 0;
+        int x_125_phi = 0;
+        int x_127_phi = 0;
+        x_121 = x_121_phi;
+        const int x_124 = x_124_phi;
+        x_126 = x_126_phi;
+        bool tint_tmp = (x_126 <= x_116);
+        if (tint_tmp) {
+          tint_tmp = (x_124 <= x_119);
+        }
+        if ((tint_tmp)) {
+        } else {
+          break;
+        }
+        const int x_133_save = x_126;
+        const int x_134 = data[x_133_save];
+        const int x_135_save = x_124;
+        const int x_136 = data[x_135_save];
+        const int x_122 = asint((x_121 + asint(1)));
+        if ((x_134 < x_136)) {
+          x_141 = asint((x_126 + asint(1)));
+          const int x_142 = data[x_133_save];
+          temp[x_121] = x_142;
+          x_125_phi = x_124;
+          x_127_phi = x_141;
+        } else {
+          x_144 = (x_124 + 1);
+          const int x_145 = data[x_135_save];
+          temp[x_121] = x_145;
+          x_125_phi = x_144;
+          x_127_phi = x_126;
+        }
+        const int x_125 = x_125_phi;
+        const int x_127 = x_127_phi;
+        {
+          x_121_phi = x_122;
+          x_124_phi = x_125;
+          x_126_phi = x_127;
+        }
+      }
+      x_148_phi = x_121;
+      x_151_phi = x_126;
+      while (true) {
+        int x_149 = 0;
+        int x_152 = 0;
+        const int x_148 = x_148_phi;
+        const int x_151 = x_151_phi;
+        bool tint_tmp_1 = (x_151 < 10);
+        if (tint_tmp_1) {
+          tint_tmp_1 = (x_151 <= x_116);
+        }
+        if ((tint_tmp_1)) {
+        } else {
+          break;
+        }
+        {
+          x_149 = (x_148 + 1);
+          x_152 = (x_151 + 1);
+          const int x_158 = data[x_151];
+          temp[x_148] = x_158;
+          x_148_phi = x_149;
+          x_151_phi = x_152;
+        }
+      }
+      x_161_phi = x_109;
+      while (true) {
+        int x_162 = 0;
+        const int x_161 = x_161_phi;
+        if ((x_161 <= x_119)) {
+        } else {
+          break;
+        }
+        {
+          const int x_167 = temp[x_161];
+          data[x_161] = x_167;
+          x_162 = (x_161 + 1);
+          x_161_phi = x_162;
+        }
+      }
+      {
+        x_109_phi = x_110;
+      }
+    }
+    {
+      x_103 = (2 * x_102);
+      x_102_phi = x_103;
+    }
+  }
+  int x_171 = 0;
+  float x_189 = 0.0f;
+  float x_278 = 0.0f;
+  float x_279_phi = 0.0f;
+  const float x_170 = gl_FragCoord.y;
+  x_171 = int(x_170);
+  if ((x_171 < 30)) {
+    const int x_177 = data[0];
+    x_180 = (0.5f + (float(x_177) * 0.100000001f));
+    x_280_phi = x_180;
+  } else {
+    float x_198 = 0.0f;
+    float x_277 = 0.0f;
+    float x_278_phi = 0.0f;
+    if ((x_171 < 60)) {
+      const int x_186 = data[1];
+      x_189 = (0.5f + (float(x_186) * 0.100000001f));
+      x_279_phi = x_189;
+    } else {
+      float x_207 = 0.0f;
+      float x_249 = 0.0f;
+      float x_277_phi = 0.0f;
+      if ((x_171 < 90)) {
+        const int x_195 = data[2];
+        x_198 = (0.5f + (float(x_195) * 0.100000001f));
+        x_278_phi = x_198;
+      } else {
+        if ((x_171 < 120)) {
+          const int x_204 = data[3];
+          x_207 = (0.5f + (float(x_204) * 0.100000001f));
+          x_277_phi = x_207;
+        } else {
+          float x_220 = 0.0f;
+          float x_248 = 0.0f;
+          float x_249_phi = 0.0f;
+          float2 x_256_phi = float2(0.0f, 0.0f);
+          int x_259_phi = 0;
+          if ((x_171 < 150)) {
+            discard;
+          } else {
+            float x_229 = 0.0f;
+            float x_247 = 0.0f;
+            float x_248_phi = 0.0f;
+            if ((x_171 < 180)) {
+              const int x_217 = data[5];
+              x_220 = (0.5f + (float(x_217) * 0.100000001f));
+              x_249_phi = x_220;
+            } else {
+              float x_238 = 0.0f;
+              float x_246 = 0.0f;
+              float x_247_phi = 0.0f;
+              if ((x_171 < 210)) {
+                const int x_226 = data[6];
+                x_229 = (0.5f + (float(x_226) * 0.100000001f));
+                x_248_phi = x_229;
+              } else {
+                if ((x_171 < 240)) {
+                  const int x_235 = data[7];
+                  x_238 = (0.5f + (float(x_235) * 0.100000001f));
+                  x_247_phi = x_238;
+                } else {
+                  if ((x_171 < 270)) {
+                  } else {
+                    discard;
+                  }
+                  const int x_243 = data[8];
+                  x_246 = (0.5f + (float(x_243) * 0.100000001f));
+                  x_247_phi = x_246;
+                }
+                x_247 = x_247_phi;
+                x_248_phi = x_247;
+              }
+              x_248 = x_248_phi;
+              x_249_phi = x_248;
+            }
+            x_249 = x_249_phi;
+            const float x_251 = asfloat(x_8[0].y);
+            const bool x_252 = (x_62 > x_251);
+            if (x_252) {
+              x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+            }
+            x_256_phi = float2(1.0f, 1.0f);
+            x_259_phi = 0;
+            while (true) {
+              float2 x_272 = float2(0.0f, 0.0f);
+              int x_260 = 0;
+              float2 x_273_phi = float2(0.0f, 0.0f);
+              const float2 x_256 = x_256_phi;
+              const int x_259 = x_259_phi;
+              if ((x_259 <= 32)) {
+              } else {
+                break;
+              }
+              x_273_phi = x_256;
+              if ((x_256.x < 0.0f)) {
+                if (x_252) {
+                  discard;
+                }
+                x_272 = x_256;
+                x_272.y = (x_256.y + 1.0f);
+                x_273_phi = x_272;
+              }
+              const float2 x_273 = x_273_phi;
+              float2 x_257_1 = x_273;
+              x_257_1.x = (x_273.x + x_273.y);
+              const float2 x_257 = x_257_1;
+              {
+                x_260 = (x_259 + 1);
+                x_256_phi = x_257;
+                x_259_phi = x_260;
+              }
+            }
+          }
+          x_277_phi = x_249;
+        }
+        x_277 = x_277_phi;
+        x_278_phi = x_277;
+      }
+      x_278 = x_278_phi;
+      x_279_phi = x_278;
+    }
+    x_279 = x_279_phi;
+    x_280_phi = x_279;
+  }
+  const float x_280 = x_280_phi;
+  x_GLF_color = float4(x_280, x_280, x_280, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-for-always-false-if-discard/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-for-always-false-if-discard/1.wgsl.expected.msl
new file mode 100644
index 0000000..ae3ef06
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-for-always-false-if-discard/1.wgsl.expected.msl
@@ -0,0 +1,351 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  tint_array_wrapper temp = {};
+  tint_array_wrapper data = {};
+  float x_180 = 0.0f;
+  float x_279 = 0.0f;
+  int x_65_phi = 0;
+  int x_93_phi = 0;
+  int x_102_phi = 0;
+  float x_280_phi = 0.0f;
+  float const x_62 = x_8.injectionSwitch.x;
+  int const x_63 = int(x_62);
+  x_65_phi = x_63;
+  while (true) {
+    int const x_65 = x_65_phi;
+    switch(x_65) {
+      case 9: {
+        data.arr[x_65] = -5;
+        break;
+      }
+      case 8: {
+        data.arr[x_65] = -4;
+        break;
+      }
+      case 7: {
+        data.arr[x_65] = -3;
+        break;
+      }
+      case 6: {
+        data.arr[x_65] = -2;
+        break;
+      }
+      case 5: {
+        data.arr[x_65] = -1;
+        break;
+      }
+      case 4: {
+        data.arr[x_65] = 0;
+        break;
+      }
+      case 3: {
+        data.arr[x_65] = 1;
+        break;
+      }
+      case 2: {
+        data.arr[x_65] = 2;
+        break;
+      }
+      case 1: {
+        data.arr[x_65] = 3;
+        break;
+      }
+      case 0: {
+        data.arr[x_65] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    int const x_66 = (x_65 + 1);
+    {
+      x_65_phi = x_66;
+      if ((x_66 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_93_phi = 0;
+  while (true) {
+    int x_94 = 0;
+    int const x_93 = x_93_phi;
+    if ((x_93 < 10)) {
+    } else {
+      break;
+    }
+    {
+      int const x_99 = data.arr[x_93];
+      temp.arr[x_93] = x_99;
+      x_94 = (x_93 + 1);
+      x_93_phi = x_94;
+    }
+  }
+  x_102_phi = 1;
+  while (true) {
+    int x_103 = 0;
+    int x_109_phi = 0;
+    int const x_102 = x_102_phi;
+    if ((x_102 <= 9)) {
+    } else {
+      break;
+    }
+    x_109_phi = 0;
+    while (true) {
+      int x_121 = 0;
+      int x_126 = 0;
+      int x_121_phi = 0;
+      int x_124_phi = 0;
+      int x_126_phi = 0;
+      int x_148_phi = 0;
+      int x_151_phi = 0;
+      int x_161_phi = 0;
+      int const x_109 = x_109_phi;
+      if ((x_109 < 9)) {
+      } else {
+        break;
+      }
+      int const x_115 = (x_109 + x_102);
+      int const x_116 = (x_115 - 1);
+      int const x_110 = (x_109 + (2 * x_102));
+      int const x_119 = min((x_110 - 1), 9);
+      x_121_phi = x_109;
+      x_124_phi = x_115;
+      x_126_phi = x_109;
+      while (true) {
+        int x_141 = 0;
+        int x_144 = 0;
+        int x_125_phi = 0;
+        int x_127_phi = 0;
+        x_121 = x_121_phi;
+        int const x_124 = x_124_phi;
+        x_126 = x_126_phi;
+        if (((x_126 <= x_116) && (x_124 <= x_119))) {
+        } else {
+          break;
+        }
+        int const x_133_save = x_126;
+        int const x_134 = data.arr[x_133_save];
+        int const x_135_save = x_124;
+        int const x_136 = data.arr[x_135_save];
+        int const x_122 = as_type<int>((x_121 + as_type<int>(1)));
+        if ((x_134 < x_136)) {
+          x_141 = as_type<int>((x_126 + as_type<int>(1)));
+          int const x_142 = data.arr[x_133_save];
+          temp.arr[x_121] = x_142;
+          x_125_phi = x_124;
+          x_127_phi = x_141;
+        } else {
+          x_144 = (x_124 + 1);
+          int const x_145 = data.arr[x_135_save];
+          temp.arr[x_121] = x_145;
+          x_125_phi = x_144;
+          x_127_phi = x_126;
+        }
+        int const x_125 = x_125_phi;
+        int const x_127 = x_127_phi;
+        {
+          x_121_phi = x_122;
+          x_124_phi = x_125;
+          x_126_phi = x_127;
+        }
+      }
+      x_148_phi = x_121;
+      x_151_phi = x_126;
+      while (true) {
+        int x_149 = 0;
+        int x_152 = 0;
+        int const x_148 = x_148_phi;
+        int const x_151 = x_151_phi;
+        if (((x_151 < 10) && (x_151 <= x_116))) {
+        } else {
+          break;
+        }
+        {
+          x_149 = (x_148 + 1);
+          x_152 = (x_151 + 1);
+          int const x_158 = data.arr[x_151];
+          temp.arr[x_148] = x_158;
+          x_148_phi = x_149;
+          x_151_phi = x_152;
+        }
+      }
+      x_161_phi = x_109;
+      while (true) {
+        int x_162 = 0;
+        int const x_161 = x_161_phi;
+        if ((x_161 <= x_119)) {
+        } else {
+          break;
+        }
+        {
+          int const x_167 = temp.arr[x_161];
+          data.arr[x_161] = x_167;
+          x_162 = (x_161 + 1);
+          x_161_phi = x_162;
+        }
+      }
+      {
+        x_109_phi = x_110;
+      }
+    }
+    {
+      x_103 = (2 * x_102);
+      x_102_phi = x_103;
+    }
+  }
+  int x_171 = 0;
+  float x_189 = 0.0f;
+  float x_278 = 0.0f;
+  float x_279_phi = 0.0f;
+  float const x_170 = (*(tint_symbol_5)).y;
+  x_171 = int(x_170);
+  if ((x_171 < 30)) {
+    int const x_177 = data.arr[0];
+    x_180 = (0.5f + (float(x_177) * 0.100000001f));
+    x_280_phi = x_180;
+  } else {
+    float x_198 = 0.0f;
+    float x_277 = 0.0f;
+    float x_278_phi = 0.0f;
+    if ((x_171 < 60)) {
+      int const x_186 = data.arr[1];
+      x_189 = (0.5f + (float(x_186) * 0.100000001f));
+      x_279_phi = x_189;
+    } else {
+      float x_207 = 0.0f;
+      float x_249 = 0.0f;
+      float x_277_phi = 0.0f;
+      if ((x_171 < 90)) {
+        int const x_195 = data.arr[2];
+        x_198 = (0.5f + (float(x_195) * 0.100000001f));
+        x_278_phi = x_198;
+      } else {
+        if ((x_171 < 120)) {
+          int const x_204 = data.arr[3];
+          x_207 = (0.5f + (float(x_204) * 0.100000001f));
+          x_277_phi = x_207;
+        } else {
+          float x_220 = 0.0f;
+          float x_248 = 0.0f;
+          float x_249_phi = 0.0f;
+          float2 x_256_phi = 0.0f;
+          int x_259_phi = 0;
+          if ((x_171 < 150)) {
+            discard_fragment();
+          } else {
+            float x_229 = 0.0f;
+            float x_247 = 0.0f;
+            float x_248_phi = 0.0f;
+            if ((x_171 < 180)) {
+              int const x_217 = data.arr[5];
+              x_220 = (0.5f + (float(x_217) * 0.100000001f));
+              x_249_phi = x_220;
+            } else {
+              float x_238 = 0.0f;
+              float x_246 = 0.0f;
+              float x_247_phi = 0.0f;
+              if ((x_171 < 210)) {
+                int const x_226 = data.arr[6];
+                x_229 = (0.5f + (float(x_226) * 0.100000001f));
+                x_248_phi = x_229;
+              } else {
+                if ((x_171 < 240)) {
+                  int const x_235 = data.arr[7];
+                  x_238 = (0.5f + (float(x_235) * 0.100000001f));
+                  x_247_phi = x_238;
+                } else {
+                  if ((x_171 < 270)) {
+                  } else {
+                    discard_fragment();
+                  }
+                  int const x_243 = data.arr[8];
+                  x_246 = (0.5f + (float(x_243) * 0.100000001f));
+                  x_247_phi = x_246;
+                }
+                x_247 = x_247_phi;
+                x_248_phi = x_247;
+              }
+              x_248 = x_248_phi;
+              x_249_phi = x_248;
+            }
+            x_249 = x_249_phi;
+            float const x_251 = x_8.injectionSwitch.y;
+            bool const x_252 = (x_62 > x_251);
+            if (x_252) {
+              *(tint_symbol_6) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+            }
+            x_256_phi = float2(1.0f, 1.0f);
+            x_259_phi = 0;
+            while (true) {
+              float2 x_272 = 0.0f;
+              int x_260 = 0;
+              float2 x_273_phi = 0.0f;
+              float2 const x_256 = x_256_phi;
+              int const x_259 = x_259_phi;
+              if ((x_259 <= 32)) {
+              } else {
+                break;
+              }
+              x_273_phi = x_256;
+              if ((x_256.x < 0.0f)) {
+                if (x_252) {
+                  discard_fragment();
+                }
+                x_272 = x_256;
+                x_272.y = (x_256.y + 1.0f);
+                x_273_phi = x_272;
+              }
+              float2 const x_273 = x_273_phi;
+              float2 x_257_1 = x_273;
+              x_257_1.x = (x_273.x + x_273.y);
+              float2 const x_257 = x_257_1;
+              {
+                x_260 = (x_259 + 1);
+                x_256_phi = x_257;
+                x_259_phi = x_260;
+              }
+            }
+          }
+          x_277_phi = x_249;
+        }
+        x_277 = x_277_phi;
+        x_278_phi = x_277;
+      }
+      x_278 = x_278_phi;
+      x_279_phi = x_278;
+    }
+    x_279 = x_279_phi;
+    x_280_phi = x_279;
+  }
+  float const x_280 = x_280_phi;
+  *(tint_symbol_6) = float4(x_280, x_280, x_280, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_8, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-for-always-false-if-discard/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-for-always-false-if-discard/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..9831f2b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-for-always-false-if-discard/1.wgsl.expected.spvasm
@@ -0,0 +1,759 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 435
+; Schema: 0
+               OpCapability Shader
+        %135 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_8 "x_8"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %temp "temp"
+               OpName %data "data"
+               OpName %x_180 "x_180"
+               OpName %x_279 "x_279"
+               OpName %x_65_phi "x_65_phi"
+               OpName %x_93_phi "x_93_phi"
+               OpName %x_102_phi "x_102_phi"
+               OpName %x_280_phi "x_280_phi"
+               OpName %x_94 "x_94"
+               OpName %x_103 "x_103"
+               OpName %x_109_phi "x_109_phi"
+               OpName %x_121 "x_121"
+               OpName %x_126 "x_126"
+               OpName %x_121_phi "x_121_phi"
+               OpName %x_124_phi "x_124_phi"
+               OpName %x_126_phi "x_126_phi"
+               OpName %x_148_phi "x_148_phi"
+               OpName %x_151_phi "x_151_phi"
+               OpName %x_161_phi "x_161_phi"
+               OpName %x_141 "x_141"
+               OpName %x_144 "x_144"
+               OpName %x_125_phi "x_125_phi"
+               OpName %x_127_phi "x_127_phi"
+               OpName %x_149 "x_149"
+               OpName %x_152 "x_152"
+               OpName %x_162 "x_162"
+               OpName %x_171 "x_171"
+               OpName %x_189 "x_189"
+               OpName %x_278 "x_278"
+               OpName %x_279_phi "x_279_phi"
+               OpName %x_198 "x_198"
+               OpName %x_277 "x_277"
+               OpName %x_278_phi "x_278_phi"
+               OpName %x_207 "x_207"
+               OpName %x_249 "x_249"
+               OpName %x_277_phi "x_277_phi"
+               OpName %x_220 "x_220"
+               OpName %x_248 "x_248"
+               OpName %x_249_phi "x_249_phi"
+               OpName %x_256_phi "x_256_phi"
+               OpName %x_259_phi "x_259_phi"
+               OpName %x_229 "x_229"
+               OpName %x_247 "x_247"
+               OpName %x_248_phi "x_248_phi"
+               OpName %x_238 "x_238"
+               OpName %x_246 "x_246"
+               OpName %x_247_phi "x_247_phi"
+               OpName %x_272 "x_272"
+               OpName %x_260 "x_260"
+               OpName %x_273_phi "x_273_phi"
+               OpName %x_257_1 "x_257_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+         %25 = OpConstantNull %_arr_int_uint_10
+%_ptr_Function_float = OpTypePointer Function %float
+         %29 = OpConstantNull %float
+%_ptr_Function_int = OpTypePointer Function %int
+         %33 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %int_n5 = OpConstant %int -5
+     %int_n4 = OpConstant %int -4
+     %int_n3 = OpConstant %int -3
+     %int_n2 = OpConstant %int -2
+     %int_n1 = OpConstant %int -1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+     %int_10 = OpConstant %int 10
+       %bool = OpTypeBool
+      %int_9 = OpConstant %int 9
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %int_30 = OpConstant %int 30
+  %float_0_5 = OpConstant %float 0.5
+%float_0_100000001 = OpConstant %float 0.100000001
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+        %300 = OpConstantNull %v2float
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+    %float_1 = OpConstant %float 1
+        %377 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+        %378 = OpConstantComposite %v2float %float_1 %float_1
+     %int_32 = OpConstant %int 32
+    %float_0 = OpConstant %float 0
+   %main_out = OpTypeStruct %v4float
+        %422 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+       %temp = OpVariable %_ptr_Function__arr_int_uint_10 Function %25
+       %data = OpVariable %_ptr_Function__arr_int_uint_10 Function %25
+      %x_180 = OpVariable %_ptr_Function_float Function %29
+      %x_279 = OpVariable %_ptr_Function_float Function %29
+   %x_65_phi = OpVariable %_ptr_Function_int Function %33
+   %x_93_phi = OpVariable %_ptr_Function_int Function %33
+  %x_102_phi = OpVariable %_ptr_Function_int Function %33
+  %x_280_phi = OpVariable %_ptr_Function_float Function %29
+       %x_94 = OpVariable %_ptr_Function_int Function %33
+      %x_103 = OpVariable %_ptr_Function_int Function %33
+  %x_109_phi = OpVariable %_ptr_Function_int Function %33
+      %x_121 = OpVariable %_ptr_Function_int Function %33
+      %x_126 = OpVariable %_ptr_Function_int Function %33
+  %x_121_phi = OpVariable %_ptr_Function_int Function %33
+  %x_124_phi = OpVariable %_ptr_Function_int Function %33
+  %x_126_phi = OpVariable %_ptr_Function_int Function %33
+  %x_148_phi = OpVariable %_ptr_Function_int Function %33
+  %x_151_phi = OpVariable %_ptr_Function_int Function %33
+  %x_161_phi = OpVariable %_ptr_Function_int Function %33
+      %x_141 = OpVariable %_ptr_Function_int Function %33
+      %x_144 = OpVariable %_ptr_Function_int Function %33
+  %x_125_phi = OpVariable %_ptr_Function_int Function %33
+  %x_127_phi = OpVariable %_ptr_Function_int Function %33
+      %x_149 = OpVariable %_ptr_Function_int Function %33
+      %x_152 = OpVariable %_ptr_Function_int Function %33
+      %x_162 = OpVariable %_ptr_Function_int Function %33
+      %x_171 = OpVariable %_ptr_Function_int Function %33
+      %x_189 = OpVariable %_ptr_Function_float Function %29
+      %x_278 = OpVariable %_ptr_Function_float Function %29
+  %x_279_phi = OpVariable %_ptr_Function_float Function %29
+      %x_198 = OpVariable %_ptr_Function_float Function %29
+      %x_277 = OpVariable %_ptr_Function_float Function %29
+  %x_278_phi = OpVariable %_ptr_Function_float Function %29
+      %x_207 = OpVariable %_ptr_Function_float Function %29
+      %x_249 = OpVariable %_ptr_Function_float Function %29
+  %x_277_phi = OpVariable %_ptr_Function_float Function %29
+      %x_220 = OpVariable %_ptr_Function_float Function %29
+      %x_248 = OpVariable %_ptr_Function_float Function %29
+  %x_249_phi = OpVariable %_ptr_Function_float Function %29
+  %x_256_phi = OpVariable %_ptr_Function_v2float Function %300
+  %x_259_phi = OpVariable %_ptr_Function_int Function %33
+      %x_229 = OpVariable %_ptr_Function_float Function %29
+      %x_247 = OpVariable %_ptr_Function_float Function %29
+  %x_248_phi = OpVariable %_ptr_Function_float Function %29
+      %x_238 = OpVariable %_ptr_Function_float Function %29
+      %x_246 = OpVariable %_ptr_Function_float Function %29
+  %x_247_phi = OpVariable %_ptr_Function_float Function %29
+      %x_272 = OpVariable %_ptr_Function_v2float Function %300
+      %x_260 = OpVariable %_ptr_Function_int Function %33
+  %x_273_phi = OpVariable %_ptr_Function_v2float Function %300
+    %x_257_1 = OpVariable %_ptr_Function_v2float Function %300
+         %39 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+         %40 = OpLoad %float %39
+         %41 = OpConvertFToS %int %40
+               OpStore %x_65_phi %41
+               OpBranch %42
+         %42 = OpLabel
+               OpLoopMerge %43 %44 None
+               OpBranch %45
+         %45 = OpLabel
+         %46 = OpLoad %int %x_65_phi
+               OpSelectionMerge %47 None
+               OpSwitch %46 %48 9 %49 8 %50 7 %51 6 %52 5 %53 4 %54 3 %55 2 %56 1 %57 0 %58
+         %49 = OpLabel
+         %59 = OpAccessChain %_ptr_Function_int %data %46
+               OpStore %59 %int_n5
+               OpBranch %47
+         %50 = OpLabel
+         %61 = OpAccessChain %_ptr_Function_int %data %46
+               OpStore %61 %int_n4
+               OpBranch %47
+         %51 = OpLabel
+         %63 = OpAccessChain %_ptr_Function_int %data %46
+               OpStore %63 %int_n3
+               OpBranch %47
+         %52 = OpLabel
+         %65 = OpAccessChain %_ptr_Function_int %data %46
+               OpStore %65 %int_n2
+               OpBranch %47
+         %53 = OpLabel
+         %67 = OpAccessChain %_ptr_Function_int %data %46
+               OpStore %67 %int_n1
+               OpBranch %47
+         %54 = OpLabel
+         %69 = OpAccessChain %_ptr_Function_int %data %46
+               OpStore %69 %int_0
+               OpBranch %47
+         %55 = OpLabel
+         %71 = OpAccessChain %_ptr_Function_int %data %46
+               OpStore %71 %int_1
+               OpBranch %47
+         %56 = OpLabel
+         %73 = OpAccessChain %_ptr_Function_int %data %46
+               OpStore %73 %int_2
+               OpBranch %47
+         %57 = OpLabel
+         %75 = OpAccessChain %_ptr_Function_int %data %46
+               OpStore %75 %int_3
+               OpBranch %47
+         %58 = OpLabel
+         %77 = OpAccessChain %_ptr_Function_int %data %46
+               OpStore %77 %int_4
+               OpBranch %47
+         %48 = OpLabel
+               OpBranch %47
+         %47 = OpLabel
+         %79 = OpIAdd %int %46 %int_1
+               OpBranch %44
+         %44 = OpLabel
+               OpStore %x_65_phi %79
+         %81 = OpSLessThan %bool %79 %int_10
+               OpSelectionMerge %83 None
+               OpBranchConditional %81 %84 %85
+         %84 = OpLabel
+               OpBranch %83
+         %85 = OpLabel
+               OpBranch %43
+         %83 = OpLabel
+               OpBranch %42
+         %43 = OpLabel
+               OpStore %x_93_phi %int_0
+               OpBranch %86
+         %86 = OpLabel
+               OpLoopMerge %87 %88 None
+               OpBranch %89
+         %89 = OpLabel
+         %91 = OpLoad %int %x_93_phi
+         %92 = OpSLessThan %bool %91 %int_10
+               OpSelectionMerge %93 None
+               OpBranchConditional %92 %94 %95
+         %94 = OpLabel
+               OpBranch %93
+         %95 = OpLabel
+               OpBranch %87
+         %93 = OpLabel
+               OpBranch %88
+         %88 = OpLabel
+         %96 = OpAccessChain %_ptr_Function_int %data %91
+         %97 = OpLoad %int %96
+         %98 = OpAccessChain %_ptr_Function_int %temp %91
+               OpStore %98 %97
+         %99 = OpIAdd %int %91 %int_1
+               OpStore %x_94 %99
+        %100 = OpLoad %int %x_94
+               OpStore %x_93_phi %100
+               OpBranch %86
+         %87 = OpLabel
+               OpStore %x_102_phi %int_1
+               OpBranch %101
+        %101 = OpLabel
+               OpLoopMerge %102 %103 None
+               OpBranch %104
+        %104 = OpLabel
+        %107 = OpLoad %int %x_102_phi
+        %109 = OpSLessThanEqual %bool %107 %int_9
+               OpSelectionMerge %110 None
+               OpBranchConditional %109 %111 %112
+        %111 = OpLabel
+               OpBranch %110
+        %112 = OpLabel
+               OpBranch %102
+        %110 = OpLabel
+               OpStore %x_109_phi %int_0
+               OpBranch %113
+        %113 = OpLabel
+               OpLoopMerge %114 %115 None
+               OpBranch %116
+        %116 = OpLabel
+        %125 = OpLoad %int %x_109_phi
+        %126 = OpSLessThan %bool %125 %int_9
+               OpSelectionMerge %127 None
+               OpBranchConditional %126 %128 %129
+        %128 = OpLabel
+               OpBranch %127
+        %129 = OpLabel
+               OpBranch %114
+        %127 = OpLabel
+        %130 = OpIAdd %int %125 %107
+        %131 = OpISub %int %130 %int_1
+        %132 = OpIMul %int %int_2 %107
+        %133 = OpIAdd %int %125 %132
+        %136 = OpISub %int %133 %int_1
+        %134 = OpExtInst %int %135 SMin %136 %int_9
+               OpStore %x_121_phi %125
+               OpStore %x_124_phi %130
+               OpStore %x_126_phi %125
+               OpBranch %137
+        %137 = OpLabel
+               OpLoopMerge %138 %139 None
+               OpBranch %140
+        %140 = OpLabel
+        %145 = OpLoad %int %x_121_phi
+               OpStore %x_121 %145
+        %146 = OpLoad %int %x_124_phi
+        %147 = OpLoad %int %x_126_phi
+               OpStore %x_126 %147
+        %148 = OpLoad %int %x_126
+        %149 = OpSLessThanEqual %bool %148 %131
+               OpSelectionMerge %150 None
+               OpBranchConditional %149 %151 %150
+        %151 = OpLabel
+        %152 = OpSLessThanEqual %bool %146 %134
+               OpBranch %150
+        %150 = OpLabel
+        %153 = OpPhi %bool %149 %140 %152 %151
+               OpSelectionMerge %154 None
+               OpBranchConditional %153 %155 %156
+        %155 = OpLabel
+               OpBranch %154
+        %156 = OpLabel
+               OpBranch %138
+        %154 = OpLabel
+        %157 = OpLoad %int %x_126
+        %158 = OpAccessChain %_ptr_Function_int %data %157
+        %159 = OpLoad %int %158
+        %160 = OpAccessChain %_ptr_Function_int %data %146
+        %161 = OpLoad %int %160
+        %163 = OpLoad %int %x_121
+        %164 = OpCopyObject %int %int_1
+        %165 = OpIAdd %int %163 %164
+        %162 = OpCopyObject %int %165
+        %166 = OpSLessThan %bool %159 %161
+               OpSelectionMerge %167 None
+               OpBranchConditional %166 %168 %169
+        %168 = OpLabel
+        %171 = OpLoad %int %x_126
+        %172 = OpCopyObject %int %int_1
+        %173 = OpIAdd %int %171 %172
+        %170 = OpCopyObject %int %173
+               OpStore %x_141 %170
+        %174 = OpAccessChain %_ptr_Function_int %data %157
+        %175 = OpLoad %int %174
+        %176 = OpLoad %int %x_121
+        %177 = OpAccessChain %_ptr_Function_int %temp %176
+               OpStore %177 %175
+               OpStore %x_125_phi %146
+        %178 = OpLoad %int %x_141
+               OpStore %x_127_phi %178
+               OpBranch %167
+        %169 = OpLabel
+        %179 = OpIAdd %int %146 %int_1
+               OpStore %x_144 %179
+        %180 = OpAccessChain %_ptr_Function_int %data %146
+        %181 = OpLoad %int %180
+        %182 = OpLoad %int %x_121
+        %183 = OpAccessChain %_ptr_Function_int %temp %182
+               OpStore %183 %181
+        %184 = OpLoad %int %x_144
+               OpStore %x_125_phi %184
+        %185 = OpLoad %int %x_126
+               OpStore %x_127_phi %185
+               OpBranch %167
+        %167 = OpLabel
+        %186 = OpLoad %int %x_125_phi
+        %187 = OpLoad %int %x_127_phi
+               OpBranch %139
+        %139 = OpLabel
+               OpStore %x_121_phi %162
+               OpStore %x_124_phi %186
+               OpStore %x_126_phi %187
+               OpBranch %137
+        %138 = OpLabel
+        %188 = OpLoad %int %x_121
+               OpStore %x_148_phi %188
+        %189 = OpLoad %int %x_126
+               OpStore %x_151_phi %189
+               OpBranch %190
+        %190 = OpLabel
+               OpLoopMerge %191 %192 None
+               OpBranch %193
+        %193 = OpLabel
+        %196 = OpLoad %int %x_148_phi
+        %197 = OpLoad %int %x_151_phi
+        %198 = OpSLessThan %bool %197 %int_10
+               OpSelectionMerge %199 None
+               OpBranchConditional %198 %200 %199
+        %200 = OpLabel
+        %201 = OpSLessThanEqual %bool %197 %131
+               OpBranch %199
+        %199 = OpLabel
+        %202 = OpPhi %bool %198 %193 %201 %200
+               OpSelectionMerge %203 None
+               OpBranchConditional %202 %204 %205
+        %204 = OpLabel
+               OpBranch %203
+        %205 = OpLabel
+               OpBranch %191
+        %203 = OpLabel
+               OpBranch %192
+        %192 = OpLabel
+        %206 = OpIAdd %int %196 %int_1
+               OpStore %x_149 %206
+        %207 = OpIAdd %int %197 %int_1
+               OpStore %x_152 %207
+        %208 = OpAccessChain %_ptr_Function_int %data %197
+        %209 = OpLoad %int %208
+        %210 = OpAccessChain %_ptr_Function_int %temp %196
+               OpStore %210 %209
+        %211 = OpLoad %int %x_149
+               OpStore %x_148_phi %211
+        %212 = OpLoad %int %x_152
+               OpStore %x_151_phi %212
+               OpBranch %190
+        %191 = OpLabel
+               OpStore %x_161_phi %125
+               OpBranch %213
+        %213 = OpLabel
+               OpLoopMerge %214 %215 None
+               OpBranch %216
+        %216 = OpLabel
+        %218 = OpLoad %int %x_161_phi
+        %219 = OpSLessThanEqual %bool %218 %134
+               OpSelectionMerge %220 None
+               OpBranchConditional %219 %221 %222
+        %221 = OpLabel
+               OpBranch %220
+        %222 = OpLabel
+               OpBranch %214
+        %220 = OpLabel
+               OpBranch %215
+        %215 = OpLabel
+        %223 = OpAccessChain %_ptr_Function_int %temp %218
+        %224 = OpLoad %int %223
+        %225 = OpAccessChain %_ptr_Function_int %data %218
+               OpStore %225 %224
+        %226 = OpIAdd %int %218 %int_1
+               OpStore %x_162 %226
+        %227 = OpLoad %int %x_162
+               OpStore %x_161_phi %227
+               OpBranch %213
+        %214 = OpLabel
+               OpBranch %115
+        %115 = OpLabel
+               OpStore %x_109_phi %133
+               OpBranch %113
+        %114 = OpLabel
+               OpBranch %103
+        %103 = OpLabel
+        %228 = OpIMul %int %int_2 %107
+               OpStore %x_103 %228
+        %229 = OpLoad %int %x_103
+               OpStore %x_102_phi %229
+               OpBranch %101
+        %102 = OpLabel
+        %236 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %237 = OpLoad %float %236
+        %238 = OpConvertFToS %int %237
+               OpStore %x_171 %238
+        %239 = OpLoad %int %x_171
+        %241 = OpSLessThan %bool %239 %int_30
+               OpSelectionMerge %242 None
+               OpBranchConditional %241 %243 %244
+        %243 = OpLabel
+        %245 = OpAccessChain %_ptr_Function_int %data %int_0
+        %246 = OpLoad %int %245
+        %248 = OpConvertSToF %float %246
+        %250 = OpFMul %float %248 %float_0_100000001
+        %251 = OpFAdd %float %float_0_5 %250
+               OpStore %x_180 %251
+        %252 = OpLoad %float %x_180
+               OpStore %x_280_phi %252
+               OpBranch %242
+        %244 = OpLabel
+        %256 = OpLoad %int %x_171
+        %258 = OpSLessThan %bool %256 %int_60
+               OpSelectionMerge %259 None
+               OpBranchConditional %258 %260 %261
+        %260 = OpLabel
+        %262 = OpAccessChain %_ptr_Function_int %data %int_1
+        %263 = OpLoad %int %262
+        %264 = OpConvertSToF %float %263
+        %265 = OpFMul %float %264 %float_0_100000001
+        %266 = OpFAdd %float %float_0_5 %265
+               OpStore %x_189 %266
+        %267 = OpLoad %float %x_189
+               OpStore %x_279_phi %267
+               OpBranch %259
+        %261 = OpLabel
+        %271 = OpLoad %int %x_171
+        %273 = OpSLessThan %bool %271 %int_90
+               OpSelectionMerge %274 None
+               OpBranchConditional %273 %275 %276
+        %275 = OpLabel
+        %277 = OpAccessChain %_ptr_Function_int %data %int_2
+        %278 = OpLoad %int %277
+        %279 = OpConvertSToF %float %278
+        %280 = OpFMul %float %279 %float_0_100000001
+        %281 = OpFAdd %float %float_0_5 %280
+               OpStore %x_198 %281
+        %282 = OpLoad %float %x_198
+               OpStore %x_278_phi %282
+               OpBranch %274
+        %276 = OpLabel
+        %283 = OpLoad %int %x_171
+        %285 = OpSLessThan %bool %283 %int_120
+               OpSelectionMerge %286 None
+               OpBranchConditional %285 %287 %288
+        %287 = OpLabel
+        %289 = OpAccessChain %_ptr_Function_int %data %int_3
+        %290 = OpLoad %int %289
+        %291 = OpConvertSToF %float %290
+        %292 = OpFMul %float %291 %float_0_100000001
+        %293 = OpFAdd %float %float_0_5 %292
+               OpStore %x_207 %293
+        %294 = OpLoad %float %x_207
+               OpStore %x_277_phi %294
+               OpBranch %286
+        %288 = OpLabel
+        %302 = OpLoad %int %x_171
+        %304 = OpSLessThan %bool %302 %int_150
+               OpSelectionMerge %305 None
+               OpBranchConditional %304 %306 %307
+        %306 = OpLabel
+               OpKill
+        %307 = OpLabel
+        %311 = OpLoad %int %x_171
+        %313 = OpSLessThan %bool %311 %int_180
+               OpSelectionMerge %314 None
+               OpBranchConditional %313 %315 %316
+        %315 = OpLabel
+        %318 = OpAccessChain %_ptr_Function_int %data %int_5
+        %319 = OpLoad %int %318
+        %320 = OpConvertSToF %float %319
+        %321 = OpFMul %float %320 %float_0_100000001
+        %322 = OpFAdd %float %float_0_5 %321
+               OpStore %x_220 %322
+        %323 = OpLoad %float %x_220
+               OpStore %x_249_phi %323
+               OpBranch %314
+        %316 = OpLabel
+        %327 = OpLoad %int %x_171
+        %329 = OpSLessThan %bool %327 %int_210
+               OpSelectionMerge %330 None
+               OpBranchConditional %329 %331 %332
+        %331 = OpLabel
+        %334 = OpAccessChain %_ptr_Function_int %data %int_6
+        %335 = OpLoad %int %334
+        %336 = OpConvertSToF %float %335
+        %337 = OpFMul %float %336 %float_0_100000001
+        %338 = OpFAdd %float %float_0_5 %337
+               OpStore %x_229 %338
+        %339 = OpLoad %float %x_229
+               OpStore %x_248_phi %339
+               OpBranch %330
+        %332 = OpLabel
+        %340 = OpLoad %int %x_171
+        %342 = OpSLessThan %bool %340 %int_240
+               OpSelectionMerge %343 None
+               OpBranchConditional %342 %344 %345
+        %344 = OpLabel
+        %347 = OpAccessChain %_ptr_Function_int %data %int_7
+        %348 = OpLoad %int %347
+        %349 = OpConvertSToF %float %348
+        %350 = OpFMul %float %349 %float_0_100000001
+        %351 = OpFAdd %float %float_0_5 %350
+               OpStore %x_238 %351
+        %352 = OpLoad %float %x_238
+               OpStore %x_247_phi %352
+               OpBranch %343
+        %345 = OpLabel
+        %353 = OpLoad %int %x_171
+        %355 = OpSLessThan %bool %353 %int_270
+               OpSelectionMerge %356 None
+               OpBranchConditional %355 %357 %358
+        %357 = OpLabel
+               OpBranch %356
+        %358 = OpLabel
+               OpKill
+        %356 = OpLabel
+        %360 = OpAccessChain %_ptr_Function_int %data %int_8
+        %361 = OpLoad %int %360
+        %362 = OpConvertSToF %float %361
+        %363 = OpFMul %float %362 %float_0_100000001
+        %364 = OpFAdd %float %float_0_5 %363
+               OpStore %x_246 %364
+        %365 = OpLoad %float %x_246
+               OpStore %x_247_phi %365
+               OpBranch %343
+        %343 = OpLabel
+        %366 = OpLoad %float %x_247_phi
+               OpStore %x_247 %366
+        %367 = OpLoad %float %x_247
+               OpStore %x_248_phi %367
+               OpBranch %330
+        %330 = OpLabel
+        %368 = OpLoad %float %x_248_phi
+               OpStore %x_248 %368
+        %369 = OpLoad %float %x_248
+               OpStore %x_249_phi %369
+               OpBranch %314
+        %314 = OpLabel
+        %370 = OpLoad %float %x_249_phi
+               OpStore %x_249 %370
+        %371 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+        %372 = OpLoad %float %371
+        %373 = OpFOrdGreaterThan %bool %40 %372
+               OpSelectionMerge %374 None
+               OpBranchConditional %373 %375 %374
+        %375 = OpLabel
+               OpStore %x_GLF_color %377
+               OpBranch %374
+        %374 = OpLabel
+               OpStore %x_256_phi %378
+               OpStore %x_259_phi %int_0
+               OpBranch %379
+        %379 = OpLabel
+               OpLoopMerge %380 %381 None
+               OpBranch %382
+        %382 = OpLabel
+        %386 = OpLoad %v2float %x_256_phi
+        %387 = OpLoad %int %x_259_phi
+        %389 = OpSLessThanEqual %bool %387 %int_32
+               OpSelectionMerge %390 None
+               OpBranchConditional %389 %391 %392
+        %391 = OpLabel
+               OpBranch %390
+        %392 = OpLabel
+               OpBranch %380
+        %390 = OpLabel
+               OpStore %x_273_phi %386
+        %393 = OpCompositeExtract %float %386 0
+        %395 = OpFOrdLessThan %bool %393 %float_0
+               OpSelectionMerge %396 None
+               OpBranchConditional %395 %397 %396
+        %397 = OpLabel
+               OpSelectionMerge %398 None
+               OpBranchConditional %373 %399 %398
+        %399 = OpLabel
+               OpKill
+        %398 = OpLabel
+               OpStore %x_272 %386
+        %400 = OpAccessChain %_ptr_Function_float %x_272 %uint_1
+        %401 = OpCompositeExtract %float %386 1
+        %402 = OpFAdd %float %401 %float_1
+               OpStore %400 %402
+        %403 = OpLoad %v2float %x_272
+               OpStore %x_273_phi %403
+               OpBranch %396
+        %396 = OpLabel
+        %404 = OpLoad %v2float %x_273_phi
+               OpStore %x_257_1 %404
+        %406 = OpAccessChain %_ptr_Function_float %x_257_1 %uint_0
+        %407 = OpCompositeExtract %float %404 0
+        %408 = OpCompositeExtract %float %404 1
+        %409 = OpFAdd %float %407 %408
+               OpStore %406 %409
+        %410 = OpLoad %v2float %x_257_1
+               OpBranch %381
+        %381 = OpLabel
+        %411 = OpIAdd %int %387 %int_1
+               OpStore %x_260 %411
+               OpStore %x_256_phi %410
+        %412 = OpLoad %int %x_260
+               OpStore %x_259_phi %412
+               OpBranch %379
+        %380 = OpLabel
+               OpBranch %305
+        %305 = OpLabel
+        %413 = OpLoad %float %x_249
+               OpStore %x_277_phi %413
+               OpBranch %286
+        %286 = OpLabel
+        %414 = OpLoad %float %x_277_phi
+               OpStore %x_277 %414
+        %415 = OpLoad %float %x_277
+               OpStore %x_278_phi %415
+               OpBranch %274
+        %274 = OpLabel
+        %416 = OpLoad %float %x_278_phi
+               OpStore %x_278 %416
+        %417 = OpLoad %float %x_278
+               OpStore %x_279_phi %417
+               OpBranch %259
+        %259 = OpLabel
+        %418 = OpLoad %float %x_279_phi
+               OpStore %x_279 %418
+        %419 = OpLoad %float %x_279
+               OpStore %x_280_phi %419
+               OpBranch %242
+        %242 = OpLabel
+        %420 = OpLoad %float %x_280_phi
+        %421 = OpCompositeConstruct %v4float %420 %420 %420 %float_1
+               OpStore %x_GLF_color %421
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %422
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %426 = OpLabel
+        %427 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %427
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %429 = OpLabel
+        %430 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %430
+        %431 = OpFunctionCall %void %main_1
+        %433 = OpLoad %v4float %x_GLF_color
+        %434 = OpCompositeConstruct %main_out %433
+        %432 = OpFunctionCall %void %tint_symbol_3 %434
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 44[%44] is not post dominated by the back-edge block 83[%83]
+  %83 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-for-always-false-if-discard/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-for-always-false-if-discard/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..eb23a41
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-for-always-false-if-discard/1.wgsl.expected.wgsl
@@ -0,0 +1,344 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var temp : array<i32, 10>;
+  var data : array<i32, 10>;
+  var x_180 : f32;
+  var x_279 : f32;
+  var x_65_phi : i32;
+  var x_93_phi : i32;
+  var x_102_phi : i32;
+  var x_280_phi : f32;
+  let x_62 : f32 = x_8.injectionSwitch.x;
+  let x_63 : i32 = i32(x_62);
+  x_65_phi = x_63;
+  loop {
+    let x_65 : i32 = x_65_phi;
+    switch(x_65) {
+      case 9: {
+        data[x_65] = -5;
+      }
+      case 8: {
+        data[x_65] = -4;
+      }
+      case 7: {
+        data[x_65] = -3;
+      }
+      case 6: {
+        data[x_65] = -2;
+      }
+      case 5: {
+        data[x_65] = -1;
+      }
+      case 4: {
+        data[x_65] = 0;
+      }
+      case 3: {
+        data[x_65] = 1;
+      }
+      case 2: {
+        data[x_65] = 2;
+      }
+      case 1: {
+        data[x_65] = 3;
+      }
+      case 0: {
+        data[x_65] = 4;
+      }
+      default: {
+      }
+    }
+    let x_66 : i32 = (x_65 + 1);
+
+    continuing {
+      x_65_phi = x_66;
+      if ((x_66 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  x_93_phi = 0;
+  loop {
+    var x_94 : i32;
+    let x_93 : i32 = x_93_phi;
+    if ((x_93 < 10)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_99 : i32 = data[x_93];
+      temp[x_93] = x_99;
+      x_94 = (x_93 + 1);
+      x_93_phi = x_94;
+    }
+  }
+  x_102_phi = 1;
+  loop {
+    var x_103 : i32;
+    var x_109_phi : i32;
+    let x_102 : i32 = x_102_phi;
+    if ((x_102 <= 9)) {
+    } else {
+      break;
+    }
+    x_109_phi = 0;
+    loop {
+      var x_121 : i32;
+      var x_126 : i32;
+      var x_121_phi : i32;
+      var x_124_phi : i32;
+      var x_126_phi : i32;
+      var x_148_phi : i32;
+      var x_151_phi : i32;
+      var x_161_phi : i32;
+      let x_109 : i32 = x_109_phi;
+      if ((x_109 < 9)) {
+      } else {
+        break;
+      }
+      let x_115 : i32 = (x_109 + x_102);
+      let x_116 : i32 = (x_115 - 1);
+      let x_110 : i32 = (x_109 + (2 * x_102));
+      let x_119 : i32 = min((x_110 - 1), 9);
+      x_121_phi = x_109;
+      x_124_phi = x_115;
+      x_126_phi = x_109;
+      loop {
+        var x_141 : i32;
+        var x_144 : i32;
+        var x_125_phi : i32;
+        var x_127_phi : i32;
+        x_121 = x_121_phi;
+        let x_124 : i32 = x_124_phi;
+        x_126 = x_126_phi;
+        if (((x_126 <= x_116) && (x_124 <= x_119))) {
+        } else {
+          break;
+        }
+        let x_133 : ptr<function, i32> = &(data[x_126]);
+        let x_134 : i32 = *(x_133);
+        let x_135 : ptr<function, i32> = &(data[x_124]);
+        let x_136 : i32 = *(x_135);
+        let x_122 : i32 = bitcast<i32>((x_121 + bitcast<i32>(1)));
+        if ((x_134 < x_136)) {
+          x_141 = bitcast<i32>((x_126 + bitcast<i32>(1)));
+          let x_142 : i32 = *(x_133);
+          temp[x_121] = x_142;
+          x_125_phi = x_124;
+          x_127_phi = x_141;
+        } else {
+          x_144 = (x_124 + 1);
+          let x_145 : i32 = *(x_135);
+          temp[x_121] = x_145;
+          x_125_phi = x_144;
+          x_127_phi = x_126;
+        }
+        let x_125 : i32 = x_125_phi;
+        let x_127 : i32 = x_127_phi;
+
+        continuing {
+          x_121_phi = x_122;
+          x_124_phi = x_125;
+          x_126_phi = x_127;
+        }
+      }
+      x_148_phi = x_121;
+      x_151_phi = x_126;
+      loop {
+        var x_149 : i32;
+        var x_152 : i32;
+        let x_148 : i32 = x_148_phi;
+        let x_151 : i32 = x_151_phi;
+        if (((x_151 < 10) && (x_151 <= x_116))) {
+        } else {
+          break;
+        }
+
+        continuing {
+          x_149 = (x_148 + 1);
+          x_152 = (x_151 + 1);
+          let x_158 : i32 = data[x_151];
+          temp[x_148] = x_158;
+          x_148_phi = x_149;
+          x_151_phi = x_152;
+        }
+      }
+      x_161_phi = x_109;
+      loop {
+        var x_162 : i32;
+        let x_161 : i32 = x_161_phi;
+        if ((x_161 <= x_119)) {
+        } else {
+          break;
+        }
+
+        continuing {
+          let x_167 : i32 = temp[x_161];
+          data[x_161] = x_167;
+          x_162 = (x_161 + 1);
+          x_161_phi = x_162;
+        }
+      }
+
+      continuing {
+        x_109_phi = x_110;
+      }
+    }
+
+    continuing {
+      x_103 = (2 * x_102);
+      x_102_phi = x_103;
+    }
+  }
+  var x_171 : i32;
+  var x_189 : f32;
+  var x_278 : f32;
+  var x_279_phi : f32;
+  let x_170 : f32 = gl_FragCoord.y;
+  x_171 = i32(x_170);
+  if ((x_171 < 30)) {
+    let x_177 : i32 = data[0];
+    x_180 = (0.5 + (f32(x_177) * 0.100000001));
+    x_280_phi = x_180;
+  } else {
+    var x_198 : f32;
+    var x_277 : f32;
+    var x_278_phi : f32;
+    if ((x_171 < 60)) {
+      let x_186 : i32 = data[1];
+      x_189 = (0.5 + (f32(x_186) * 0.100000001));
+      x_279_phi = x_189;
+    } else {
+      var x_207 : f32;
+      var x_249 : f32;
+      var x_277_phi : f32;
+      if ((x_171 < 90)) {
+        let x_195 : i32 = data[2];
+        x_198 = (0.5 + (f32(x_195) * 0.100000001));
+        x_278_phi = x_198;
+      } else {
+        if ((x_171 < 120)) {
+          let x_204 : i32 = data[3];
+          x_207 = (0.5 + (f32(x_204) * 0.100000001));
+          x_277_phi = x_207;
+        } else {
+          var x_220 : f32;
+          var x_248 : f32;
+          var x_249_phi : f32;
+          var x_256_phi : vec2<f32>;
+          var x_259_phi : i32;
+          if ((x_171 < 150)) {
+            discard;
+          } else {
+            var x_229 : f32;
+            var x_247 : f32;
+            var x_248_phi : f32;
+            if ((x_171 < 180)) {
+              let x_217 : i32 = data[5];
+              x_220 = (0.5 + (f32(x_217) * 0.100000001));
+              x_249_phi = x_220;
+            } else {
+              var x_238 : f32;
+              var x_246 : f32;
+              var x_247_phi : f32;
+              if ((x_171 < 210)) {
+                let x_226 : i32 = data[6];
+                x_229 = (0.5 + (f32(x_226) * 0.100000001));
+                x_248_phi = x_229;
+              } else {
+                if ((x_171 < 240)) {
+                  let x_235 : i32 = data[7];
+                  x_238 = (0.5 + (f32(x_235) * 0.100000001));
+                  x_247_phi = x_238;
+                } else {
+                  if ((x_171 < 270)) {
+                  } else {
+                    discard;
+                  }
+                  let x_243 : i32 = data[8];
+                  x_246 = (0.5 + (f32(x_243) * 0.100000001));
+                  x_247_phi = x_246;
+                }
+                x_247 = x_247_phi;
+                x_248_phi = x_247;
+              }
+              x_248 = x_248_phi;
+              x_249_phi = x_248;
+            }
+            x_249 = x_249_phi;
+            let x_251 : f32 = x_8.injectionSwitch.y;
+            let x_252 : bool = (x_62 > x_251);
+            if (x_252) {
+              x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+            }
+            x_256_phi = vec2<f32>(1.0, 1.0);
+            x_259_phi = 0;
+            loop {
+              var x_272 : vec2<f32>;
+              var x_260 : i32;
+              var x_273_phi : vec2<f32>;
+              let x_256 : vec2<f32> = x_256_phi;
+              let x_259 : i32 = x_259_phi;
+              if ((x_259 <= 32)) {
+              } else {
+                break;
+              }
+              x_273_phi = x_256;
+              if ((x_256.x < 0.0)) {
+                if (x_252) {
+                  discard;
+                }
+                x_272 = x_256;
+                x_272.y = (x_256.y + 1.0);
+                x_273_phi = x_272;
+              }
+              let x_273 : vec2<f32> = x_273_phi;
+              var x_257_1 : vec2<f32> = x_273;
+              x_257_1.x = (x_273.x + x_273.y);
+              let x_257 : vec2<f32> = x_257_1;
+
+              continuing {
+                x_260 = (x_259 + 1);
+                x_256_phi = x_257;
+                x_259_phi = x_260;
+              }
+            }
+          }
+          x_277_phi = x_249;
+        }
+        x_277 = x_277_phi;
+        x_278_phi = x_277;
+      }
+      x_278 = x_278_phi;
+      x_279_phi = x_278;
+    }
+    x_279 = x_279_phi;
+    x_280_phi = x_279;
+  }
+  let x_280 : f32 = x_280_phi;
+  x_GLF_color = vec4<f32>(x_280, x_280, x_280, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-reversed-for-loop/1.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-reversed-for-loop/1.spvasm
new file mode 100644
index 0000000..a853052
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-reversed-for-loop/1.spvasm
@@ -0,0 +1,574 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %merge_i1_i1_i1_ "merge(i1;i1;i1;"
+               OpName %from "from"
+               OpName %mid "mid"
+               OpName %to "to"
+               OpName %mergeSort_ "mergeSort("
+               OpName %k "k"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %data "data"
+               OpName %temp "temp"
+               OpName %i_0 "i"
+               OpName %low "low"
+               OpName %high "high"
+               OpName %m "m"
+               OpName %i_1 "i"
+               OpName %from_0 "from"
+               OpName %mid_0 "mid"
+               OpName %to_0 "to"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %param_1 "param"
+               OpName %i_2 "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %j_0 "j"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %grey "grey"
+               OpName %int_i "int_i"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %33 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %36 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int %_ptr_Function_int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Private__arr_int_uint_10 = OpTypePointer Private %_arr_int_uint_10
+       %data = OpVariable %_ptr_Private__arr_int_uint_10 Private
+%_ptr_Private_int = OpTypePointer Private %int
+       %temp = OpVariable %_ptr_Private__arr_int_uint_10 Private
+     %int_10 = OpConstant %int 10
+      %int_0 = OpConstant %int 0
+      %int_9 = OpConstant %int 9
+      %int_2 = OpConstant %int 2
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_4 = OpConstant %int 4
+      %int_3 = OpConstant %int 3
+     %int_n1 = OpConstant %int -1
+     %int_n2 = OpConstant %int -2
+     %int_n3 = OpConstant %int -3
+     %int_n4 = OpConstant %int -4
+     %int_n5 = OpConstant %int -5
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+     %int_30 = OpConstant %int 30
+%_ptr_Function_float = OpTypePointer Function %float
+  %float_0_5 = OpConstant %float 0.5
+   %float_10 = OpConstant %float 10
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %v3float = OpTypeVector %float 3
+    %float_1 = OpConstant %float 1
+       %main = OpFunction %void None %33
+         %83 = OpLabel
+        %i_2 = OpVariable %_ptr_Function_int Function
+        %j_0 = OpVariable %_ptr_Function_int Function
+       %grey = OpVariable %_ptr_Function_float Function
+      %int_i = OpVariable %_ptr_Function_int Function
+         %84 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %85 = OpLoad %float %84
+         %86 = OpConvertFToS %int %85
+               OpStore %i_2 %86
+               OpBranch %87
+         %87 = OpLabel
+               OpLoopMerge %88 %89 None
+               OpBranch %90
+         %90 = OpLabel
+         %91 = OpLoad %int %i_2
+               OpSelectionMerge %92 None
+               OpSwitch %91 %92 0 %93 1 %94 2 %95 3 %96 4 %97 5 %98 6 %99 7 %100 8 %101 9 %102
+         %93 = OpLabel
+        %103 = OpLoad %int %i_2
+        %104 = OpAccessChain %_ptr_Private_int %data %103
+               OpStore %104 %int_4
+               OpBranch %92
+         %94 = OpLabel
+        %105 = OpLoad %int %i_2
+        %106 = OpAccessChain %_ptr_Private_int %data %105
+               OpStore %106 %int_3
+               OpBranch %92
+         %95 = OpLabel
+        %107 = OpLoad %int %i_2
+        %108 = OpAccessChain %_ptr_Private_int %data %107
+               OpStore %108 %int_2
+               OpBranch %92
+         %96 = OpLabel
+        %109 = OpLoad %int %i_2
+        %110 = OpAccessChain %_ptr_Private_int %data %109
+               OpStore %110 %int_1
+               OpBranch %92
+         %97 = OpLabel
+        %111 = OpLoad %int %i_2
+        %112 = OpAccessChain %_ptr_Private_int %data %111
+               OpStore %112 %int_0
+               OpBranch %92
+         %98 = OpLabel
+        %113 = OpLoad %int %i_2
+        %114 = OpAccessChain %_ptr_Private_int %data %113
+               OpStore %114 %int_n1
+               OpBranch %92
+         %99 = OpLabel
+        %115 = OpLoad %int %i_2
+        %116 = OpAccessChain %_ptr_Private_int %data %115
+               OpStore %116 %int_n2
+               OpBranch %92
+        %100 = OpLabel
+        %117 = OpLoad %int %i_2
+        %118 = OpAccessChain %_ptr_Private_int %data %117
+               OpStore %118 %int_n3
+               OpBranch %92
+        %101 = OpLabel
+        %119 = OpLoad %int %i_2
+        %120 = OpAccessChain %_ptr_Private_int %data %119
+               OpStore %120 %int_n4
+               OpBranch %92
+        %102 = OpLabel
+        %121 = OpLoad %int %i_2
+        %122 = OpAccessChain %_ptr_Private_int %data %121
+               OpStore %122 %int_n5
+               OpBranch %92
+         %92 = OpLabel
+        %123 = OpLoad %int %i_2
+        %124 = OpIAdd %int %123 %int_1
+               OpStore %i_2 %124
+               OpBranch %89
+         %89 = OpLabel
+        %125 = OpLoad %int %i_2
+        %126 = OpSLessThan %bool %125 %int_10
+               OpBranchConditional %126 %87 %88
+         %88 = OpLabel
+               OpStore %j_0 %int_0
+               OpBranch %127
+        %127 = OpLabel
+               OpLoopMerge %128 %129 None
+               OpBranch %130
+        %130 = OpLabel
+        %131 = OpLoad %int %j_0
+        %132 = OpSLessThan %bool %131 %int_10
+               OpBranchConditional %132 %133 %128
+        %133 = OpLabel
+        %134 = OpLoad %int %j_0
+        %135 = OpLoad %int %j_0
+        %136 = OpAccessChain %_ptr_Private_int %data %135
+        %137 = OpLoad %int %136
+        %138 = OpAccessChain %_ptr_Private_int %temp %134
+               OpStore %138 %137
+               OpBranch %129
+        %129 = OpLabel
+        %139 = OpLoad %int %j_0
+        %140 = OpIAdd %int %139 %int_1
+               OpStore %j_0 %140
+               OpBranch %127
+        %128 = OpLabel
+        %141 = OpFunctionCall %void %mergeSort_
+        %142 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %143 = OpLoad %float %142
+        %144 = OpConvertFToS %int %143
+        %145 = OpSLessThan %bool %144 %int_30
+               OpSelectionMerge %146 None
+               OpBranchConditional %145 %147 %148
+        %147 = OpLabel
+        %149 = OpAccessChain %_ptr_Private_int %data %int_0
+        %150 = OpLoad %int %149
+        %151 = OpConvertSToF %float %150
+        %152 = OpFDiv %float %151 %float_10
+        %153 = OpFAdd %float %float_0_5 %152
+               OpStore %grey %153
+               OpBranch %146
+        %148 = OpLabel
+        %154 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %155 = OpLoad %float %154
+        %156 = OpConvertFToS %int %155
+        %157 = OpSLessThan %bool %156 %int_60
+               OpSelectionMerge %158 None
+               OpBranchConditional %157 %159 %160
+        %159 = OpLabel
+        %161 = OpAccessChain %_ptr_Private_int %data %int_1
+        %162 = OpLoad %int %161
+        %163 = OpConvertSToF %float %162
+        %164 = OpFDiv %float %163 %float_10
+        %165 = OpFAdd %float %float_0_5 %164
+               OpStore %grey %165
+               OpBranch %158
+        %160 = OpLabel
+        %166 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %167 = OpLoad %float %166
+        %168 = OpConvertFToS %int %167
+        %169 = OpSLessThan %bool %168 %int_90
+               OpSelectionMerge %170 None
+               OpBranchConditional %169 %171 %172
+        %171 = OpLabel
+        %173 = OpAccessChain %_ptr_Private_int %data %int_2
+        %174 = OpLoad %int %173
+        %175 = OpConvertSToF %float %174
+        %176 = OpFDiv %float %175 %float_10
+        %177 = OpFAdd %float %float_0_5 %176
+               OpStore %grey %177
+               OpBranch %170
+        %172 = OpLabel
+        %178 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %179 = OpLoad %float %178
+        %180 = OpConvertFToS %int %179
+        %181 = OpSLessThan %bool %180 %int_120
+               OpSelectionMerge %182 None
+               OpBranchConditional %181 %183 %184
+        %183 = OpLabel
+        %185 = OpAccessChain %_ptr_Private_int %data %int_3
+        %186 = OpLoad %int %185
+        %187 = OpConvertSToF %float %186
+        %188 = OpFDiv %float %187 %float_10
+        %189 = OpFAdd %float %float_0_5 %188
+               OpStore %grey %189
+               OpBranch %182
+        %184 = OpLabel
+        %190 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %191 = OpLoad %float %190
+        %192 = OpConvertFToS %int %191
+        %193 = OpSLessThan %bool %192 %int_150
+               OpSelectionMerge %194 None
+               OpBranchConditional %193 %195 %196
+        %195 = OpLabel
+               OpStore %int_i %int_1
+               OpBranch %197
+        %197 = OpLabel
+               OpLoopMerge %198 %199 None
+               OpBranch %200
+        %200 = OpLabel
+        %201 = OpLoad %int %int_i
+        %202 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+        %203 = OpLoad %float %202
+        %204 = OpConvertFToS %int %203
+        %205 = OpSGreaterThan %bool %201 %204
+               OpBranchConditional %205 %206 %198
+        %206 = OpLabel
+               OpKill
+        %199 = OpLabel
+               OpBranch %197
+        %198 = OpLabel
+               OpBranch %194
+        %196 = OpLabel
+        %207 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %208 = OpLoad %float %207
+        %209 = OpConvertFToS %int %208
+        %210 = OpSLessThan %bool %209 %int_180
+               OpSelectionMerge %211 None
+               OpBranchConditional %210 %212 %213
+        %212 = OpLabel
+        %214 = OpAccessChain %_ptr_Private_int %data %int_5
+        %215 = OpLoad %int %214
+        %216 = OpConvertSToF %float %215
+        %217 = OpFDiv %float %216 %float_10
+        %218 = OpFAdd %float %float_0_5 %217
+               OpStore %grey %218
+               OpBranch %211
+        %213 = OpLabel
+        %219 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %220 = OpLoad %float %219
+        %221 = OpConvertFToS %int %220
+        %222 = OpSLessThan %bool %221 %int_210
+               OpSelectionMerge %223 None
+               OpBranchConditional %222 %224 %225
+        %224 = OpLabel
+        %226 = OpAccessChain %_ptr_Private_int %data %int_6
+        %227 = OpLoad %int %226
+        %228 = OpConvertSToF %float %227
+        %229 = OpFDiv %float %228 %float_10
+        %230 = OpFAdd %float %float_0_5 %229
+               OpStore %grey %230
+               OpBranch %223
+        %225 = OpLabel
+        %231 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %232 = OpLoad %float %231
+        %233 = OpConvertFToS %int %232
+        %234 = OpSLessThan %bool %233 %int_240
+               OpSelectionMerge %235 None
+               OpBranchConditional %234 %236 %237
+        %236 = OpLabel
+        %238 = OpAccessChain %_ptr_Private_int %data %int_7
+        %239 = OpLoad %int %238
+        %240 = OpConvertSToF %float %239
+        %241 = OpFDiv %float %240 %float_10
+        %242 = OpFAdd %float %float_0_5 %241
+               OpStore %grey %242
+               OpBranch %235
+        %237 = OpLabel
+        %243 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %244 = OpLoad %float %243
+        %245 = OpConvertFToS %int %244
+        %246 = OpSLessThan %bool %245 %int_270
+               OpSelectionMerge %247 None
+               OpBranchConditional %246 %248 %249
+        %248 = OpLabel
+        %250 = OpAccessChain %_ptr_Private_int %data %int_8
+        %251 = OpLoad %int %250
+        %252 = OpConvertSToF %float %251
+        %253 = OpFDiv %float %252 %float_10
+        %254 = OpFAdd %float %float_0_5 %253
+               OpStore %grey %254
+               OpBranch %247
+        %249 = OpLabel
+               OpKill
+        %247 = OpLabel
+               OpBranch %235
+        %235 = OpLabel
+               OpBranch %223
+        %223 = OpLabel
+               OpBranch %211
+        %211 = OpLabel
+               OpBranch %194
+        %194 = OpLabel
+               OpBranch %182
+        %182 = OpLabel
+               OpBranch %170
+        %170 = OpLabel
+               OpBranch %158
+        %158 = OpLabel
+               OpBranch %146
+        %146 = OpLabel
+        %255 = OpLoad %float %grey
+        %256 = OpCompositeConstruct %v3float %255 %255 %255
+        %257 = OpCompositeExtract %float %256 0
+        %258 = OpCompositeExtract %float %256 1
+        %259 = OpCompositeExtract %float %256 2
+        %260 = OpCompositeConstruct %v4float %257 %258 %259 %float_1
+               OpStore %_GLF_color %260
+               OpReturn
+               OpFunctionEnd
+%merge_i1_i1_i1_ = OpFunction %void None %36
+       %from = OpFunctionParameter %_ptr_Function_int
+        %mid = OpFunctionParameter %_ptr_Function_int
+         %to = OpFunctionParameter %_ptr_Function_int
+        %261 = OpLabel
+          %k = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+          %j = OpVariable %_ptr_Function_int Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+        %262 = OpLoad %int %from
+               OpStore %k %262
+        %263 = OpLoad %int %from
+               OpStore %i %263
+        %264 = OpLoad %int %mid
+        %265 = OpIAdd %int %264 %int_1
+               OpStore %j %265
+               OpBranch %266
+        %266 = OpLabel
+               OpLoopMerge %267 %268 None
+               OpBranch %269
+        %269 = OpLabel
+        %270 = OpLoad %int %i
+        %271 = OpLoad %int %mid
+        %272 = OpSLessThanEqual %bool %270 %271
+        %273 = OpLoad %int %j
+        %274 = OpLoad %int %to
+        %275 = OpSLessThanEqual %bool %273 %274
+        %276 = OpLogicalAnd %bool %272 %275
+               OpBranchConditional %276 %277 %267
+        %277 = OpLabel
+        %278 = OpLoad %int %i
+        %279 = OpAccessChain %_ptr_Private_int %data %278
+        %280 = OpLoad %int %279
+        %281 = OpLoad %int %j
+        %282 = OpAccessChain %_ptr_Private_int %data %281
+        %283 = OpLoad %int %282
+        %284 = OpSLessThan %bool %280 %283
+               OpSelectionMerge %285 None
+               OpBranchConditional %284 %286 %287
+        %286 = OpLabel
+        %288 = OpLoad %int %k
+        %289 = OpIAdd %int %288 %int_1
+               OpStore %k %289
+        %290 = OpLoad %int %i
+        %291 = OpIAdd %int %290 %int_1
+               OpStore %i %291
+        %292 = OpAccessChain %_ptr_Private_int %data %290
+        %293 = OpLoad %int %292
+        %294 = OpAccessChain %_ptr_Private_int %temp %288
+               OpStore %294 %293
+               OpBranch %285
+        %287 = OpLabel
+        %295 = OpLoad %int %k
+        %296 = OpIAdd %int %295 %int_1
+               OpStore %k %296
+        %297 = OpLoad %int %j
+        %298 = OpIAdd %int %297 %int_1
+               OpStore %j %298
+        %299 = OpAccessChain %_ptr_Private_int %data %297
+        %300 = OpLoad %int %299
+        %301 = OpAccessChain %_ptr_Private_int %temp %295
+               OpStore %301 %300
+               OpBranch %285
+        %285 = OpLabel
+               OpBranch %268
+        %268 = OpLabel
+               OpBranch %266
+        %267 = OpLabel
+               OpBranch %302
+        %302 = OpLabel
+               OpLoopMerge %303 %304 None
+               OpBranch %305
+        %305 = OpLabel
+        %306 = OpLoad %int %i
+        %307 = OpSLessThan %bool %306 %int_10
+        %308 = OpLoad %int %i
+        %309 = OpLoad %int %mid
+        %310 = OpSLessThanEqual %bool %308 %309
+        %311 = OpLogicalAnd %bool %307 %310
+               OpBranchConditional %311 %312 %303
+        %312 = OpLabel
+        %313 = OpLoad %int %k
+        %314 = OpIAdd %int %313 %int_1
+               OpStore %k %314
+        %315 = OpLoad %int %i
+        %316 = OpIAdd %int %315 %int_1
+               OpStore %i %316
+        %317 = OpAccessChain %_ptr_Private_int %data %315
+        %318 = OpLoad %int %317
+        %319 = OpAccessChain %_ptr_Private_int %temp %313
+               OpStore %319 %318
+               OpBranch %304
+        %304 = OpLabel
+               OpBranch %302
+        %303 = OpLabel
+        %320 = OpLoad %int %from
+               OpStore %i_0 %320
+               OpBranch %321
+        %321 = OpLabel
+               OpLoopMerge %322 %323 None
+               OpBranch %324
+        %324 = OpLabel
+        %325 = OpLoad %int %i_0
+        %326 = OpLoad %int %to
+        %327 = OpSLessThanEqual %bool %325 %326
+               OpBranchConditional %327 %328 %322
+        %328 = OpLabel
+        %329 = OpLoad %int %i_0
+        %330 = OpLoad %int %i_0
+        %331 = OpAccessChain %_ptr_Private_int %temp %330
+        %332 = OpLoad %int %331
+        %333 = OpAccessChain %_ptr_Private_int %data %329
+               OpStore %333 %332
+               OpBranch %323
+        %323 = OpLabel
+        %334 = OpLoad %int %i_0
+        %335 = OpIAdd %int %334 %int_1
+               OpStore %i_0 %335
+               OpBranch %321
+        %322 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %mergeSort_ = OpFunction %void None %33
+        %336 = OpLabel
+        %low = OpVariable %_ptr_Function_int Function
+       %high = OpVariable %_ptr_Function_int Function
+          %m = OpVariable %_ptr_Function_int Function
+        %i_1 = OpVariable %_ptr_Function_int Function
+     %from_0 = OpVariable %_ptr_Function_int Function
+      %mid_0 = OpVariable %_ptr_Function_int Function
+       %to_0 = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_int Function
+    %param_0 = OpVariable %_ptr_Function_int Function
+    %param_1 = OpVariable %_ptr_Function_int Function
+               OpStore %low %int_0
+               OpStore %high %int_9
+               OpStore %m %int_1
+               OpBranch %337
+        %337 = OpLabel
+               OpLoopMerge %338 %339 None
+               OpBranch %340
+        %340 = OpLabel
+        %341 = OpLoad %int %m
+        %342 = OpLoad %int %high
+        %343 = OpSLessThanEqual %bool %341 %342
+               OpBranchConditional %343 %344 %338
+        %344 = OpLabel
+        %345 = OpLoad %int %low
+               OpStore %i_1 %345
+               OpBranch %346
+        %346 = OpLabel
+               OpLoopMerge %347 %348 None
+               OpBranch %349
+        %349 = OpLabel
+        %350 = OpLoad %int %i_1
+        %351 = OpLoad %int %high
+        %352 = OpSLessThan %bool %350 %351
+               OpBranchConditional %352 %353 %347
+        %353 = OpLabel
+        %354 = OpLoad %int %i_1
+               OpStore %from_0 %354
+        %355 = OpLoad %int %i_1
+        %356 = OpLoad %int %m
+        %357 = OpIAdd %int %355 %356
+        %358 = OpISub %int %357 %int_1
+               OpStore %mid_0 %358
+        %359 = OpLoad %int %i_1
+        %360 = OpLoad %int %m
+        %361 = OpIMul %int %int_2 %360
+        %362 = OpIAdd %int %359 %361
+        %363 = OpISub %int %362 %int_1
+        %364 = OpLoad %int %high
+        %365 = OpExtInst %int %1 SMin %363 %364
+               OpStore %to_0 %365
+        %366 = OpLoad %int %from_0
+               OpStore %param %366
+        %367 = OpLoad %int %mid_0
+               OpStore %param_0 %367
+        %368 = OpLoad %int %to_0
+               OpStore %param_1 %368
+        %369 = OpFunctionCall %void %merge_i1_i1_i1_ %param %param_0 %param_1
+               OpBranch %348
+        %348 = OpLabel
+        %370 = OpLoad %int %m
+        %371 = OpIMul %int %int_2 %370
+        %372 = OpLoad %int %i_1
+        %373 = OpIAdd %int %372 %371
+               OpStore %i_1 %373
+               OpBranch %346
+        %347 = OpLabel
+               OpBranch %339
+        %339 = OpLabel
+        %374 = OpLoad %int %m
+        %375 = OpIMul %int %int_2 %374
+               OpStore %m %375
+               OpBranch %337
+        %338 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-reversed-for-loop/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-reversed-for-loop/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..347df10
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-reversed-for-loop/1.spvasm.expected.hlsl
@@ -0,0 +1,278 @@
+static int data[10] = (int[10])0;
+static int temp[10] = (int[10])0;
+cbuffer cbuffer_x_28 : register(b0, space0) {
+  uint4 x_28[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void merge_i1_i1_i1_(inout int from, inout int mid, inout int to) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  const int x_262 = from;
+  k = x_262;
+  const int x_263 = from;
+  i = x_263;
+  const int x_264 = mid;
+  j = (x_264 + 1);
+  while (true) {
+    const int x_270 = i;
+    const int x_271 = mid;
+    const int x_273 = j;
+    const int x_274 = to;
+    bool tint_tmp = (x_270 <= x_271);
+    if (tint_tmp) {
+      tint_tmp = (x_273 <= x_274);
+    }
+    if ((tint_tmp)) {
+    } else {
+      break;
+    }
+    const int x_280 = data[i];
+    const int x_283 = data[j];
+    if ((x_280 < x_283)) {
+      const int x_288 = k;
+      k = (x_288 + 1);
+      const int x_290 = i;
+      i = (x_290 + 1);
+      const int x_293 = data[x_290];
+      temp[x_288] = x_293;
+    } else {
+      const int x_295 = k;
+      k = (x_295 + 1);
+      const int x_297 = j;
+      j = (x_297 + 1);
+      const int x_300 = data[x_297];
+      temp[x_295] = x_300;
+    }
+  }
+  while (true) {
+    const int x_306 = i;
+    const int x_308 = i;
+    const int x_309 = mid;
+    bool tint_tmp_1 = (x_306 < 10);
+    if (tint_tmp_1) {
+      tint_tmp_1 = (x_308 <= x_309);
+    }
+    if ((tint_tmp_1)) {
+    } else {
+      break;
+    }
+    const int x_313 = k;
+    k = (x_313 + 1);
+    const int x_315 = i;
+    i = (x_315 + 1);
+    const int x_318 = data[x_315];
+    temp[x_313] = x_318;
+  }
+  const int x_320 = from;
+  i_1 = x_320;
+  while (true) {
+    const int x_325 = i_1;
+    const int x_326 = to;
+    if ((x_325 <= x_326)) {
+    } else {
+      break;
+    }
+    const int x_329 = i_1;
+    const int x_332 = temp[i_1];
+    data[x_329] = x_332;
+    {
+      i_1 = (i_1 + 1);
+    }
+  }
+  return;
+}
+
+void mergeSort_() {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  {
+    for(; (m <= high); m = (2 * m)) {
+      i_2 = low;
+      {
+        for(; (i_2 < high); i_2 = (i_2 + (2 * m))) {
+          from_1 = i_2;
+          mid_1 = ((i_2 + m) - 1);
+          to_1 = min(((i_2 + (2 * m)) - 1), high);
+          param = from_1;
+          param_1 = mid_1;
+          param_2 = to_1;
+          merge_i1_i1_i1_(param, param_1, param_2);
+        }
+      }
+    }
+  }
+  return;
+}
+
+void main_1() {
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  int int_i = 0;
+  const float x_85 = asfloat(x_28[0].x);
+  i_3 = int(x_85);
+  while (true) {
+    switch(i_3) {
+      case 9: {
+        data[i_3] = -5;
+        break;
+      }
+      case 8: {
+        data[i_3] = -4;
+        break;
+      }
+      case 7: {
+        data[i_3] = -3;
+        break;
+      }
+      case 6: {
+        data[i_3] = -2;
+        break;
+      }
+      case 5: {
+        data[i_3] = -1;
+        break;
+      }
+      case 4: {
+        data[i_3] = 0;
+        break;
+      }
+      case 3: {
+        data[i_3] = 1;
+        break;
+      }
+      case 2: {
+        data[i_3] = 2;
+        break;
+      }
+      case 1: {
+        data[i_3] = 3;
+        break;
+      }
+      case 0: {
+        data[i_3] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    i_3 = (i_3 + 1);
+    {
+      if ((i_3 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  {
+    for(; (j_1 < 10); j_1 = (j_1 + 1)) {
+      const int x_134 = j_1;
+      const int x_137 = data[j_1];
+      temp[x_134] = x_137;
+    }
+  }
+  mergeSort_();
+  const float x_143 = gl_FragCoord.y;
+  if ((int(x_143) < 30)) {
+    const int x_150 = data[0];
+    grey = (0.5f + (float(x_150) / 10.0f));
+  } else {
+    const float x_155 = gl_FragCoord.y;
+    if ((int(x_155) < 60)) {
+      const int x_162 = data[1];
+      grey = (0.5f + (float(x_162) / 10.0f));
+    } else {
+      const float x_167 = gl_FragCoord.y;
+      if ((int(x_167) < 90)) {
+        const int x_174 = data[2];
+        grey = (0.5f + (float(x_174) / 10.0f));
+      } else {
+        const float x_179 = gl_FragCoord.y;
+        if ((int(x_179) < 120)) {
+          const int x_186 = data[3];
+          grey = (0.5f + (float(x_186) / 10.0f));
+        } else {
+          const float x_191 = gl_FragCoord.y;
+          if ((int(x_191) < 150)) {
+            int_i = 1;
+            while (true) {
+              const int x_201 = int_i;
+              const float x_203 = asfloat(x_28[0].x);
+              if ((x_201 > int(x_203))) {
+              } else {
+                break;
+              }
+              discard;
+            }
+          } else {
+            const float x_208 = gl_FragCoord.y;
+            if ((int(x_208) < 180)) {
+              const int x_215 = data[5];
+              grey = (0.5f + (float(x_215) / 10.0f));
+            } else {
+              const float x_220 = gl_FragCoord.y;
+              if ((int(x_220) < 210)) {
+                const int x_227 = data[6];
+                grey = (0.5f + (float(x_227) / 10.0f));
+              } else {
+                const float x_232 = gl_FragCoord.y;
+                if ((int(x_232) < 240)) {
+                  const int x_239 = data[7];
+                  grey = (0.5f + (float(x_239) / 10.0f));
+                } else {
+                  const float x_244 = gl_FragCoord.y;
+                  if ((int(x_244) < 270)) {
+                    const int x_251 = data[8];
+                    grey = (0.5f + (float(x_251) / 10.0f));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  const float x_255 = grey;
+  const float3 x_256 = float3(x_255, x_255, x_255);
+  x_GLF_color = float4(x_256.x, x_256.y, x_256.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-reversed-for-loop/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-reversed-for-loop/1.spvasm.expected.msl
new file mode 100644
index 0000000..23be1b2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-reversed-for-loop/1.spvasm.expected.msl
@@ -0,0 +1,324 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void merge_i1_i1_i1_(thread int* const from, thread int* const mid, thread int* const to, thread tint_array_wrapper* const tint_symbol_5, thread tint_array_wrapper* const tint_symbol_6) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  int const x_262 = *(from);
+  k = x_262;
+  int const x_263 = *(from);
+  i = x_263;
+  int const x_264 = *(mid);
+  j = (x_264 + 1);
+  while (true) {
+    int const x_270 = i;
+    int const x_271 = *(mid);
+    int const x_273 = j;
+    int const x_274 = *(to);
+    if (((x_270 <= x_271) && (x_273 <= x_274))) {
+    } else {
+      break;
+    }
+    int const x_278 = i;
+    int const x_280 = (*(tint_symbol_5)).arr[x_278];
+    int const x_281 = j;
+    int const x_283 = (*(tint_symbol_5)).arr[x_281];
+    if ((x_280 < x_283)) {
+      int const x_288 = k;
+      k = (x_288 + 1);
+      int const x_290 = i;
+      i = (x_290 + 1);
+      int const x_293 = (*(tint_symbol_5)).arr[x_290];
+      (*(tint_symbol_6)).arr[x_288] = x_293;
+    } else {
+      int const x_295 = k;
+      k = (x_295 + 1);
+      int const x_297 = j;
+      j = (x_297 + 1);
+      int const x_300 = (*(tint_symbol_5)).arr[x_297];
+      (*(tint_symbol_6)).arr[x_295] = x_300;
+    }
+  }
+  while (true) {
+    int const x_306 = i;
+    int const x_308 = i;
+    int const x_309 = *(mid);
+    if (((x_306 < 10) && (x_308 <= x_309))) {
+    } else {
+      break;
+    }
+    int const x_313 = k;
+    k = (x_313 + 1);
+    int const x_315 = i;
+    i = (x_315 + 1);
+    int const x_318 = (*(tint_symbol_5)).arr[x_315];
+    (*(tint_symbol_6)).arr[x_313] = x_318;
+  }
+  int const x_320 = *(from);
+  i_1 = x_320;
+  while (true) {
+    int const x_325 = i_1;
+    int const x_326 = *(to);
+    if ((x_325 <= x_326)) {
+    } else {
+      break;
+    }
+    int const x_329 = i_1;
+    int const x_330 = i_1;
+    int const x_332 = (*(tint_symbol_6)).arr[x_330];
+    (*(tint_symbol_5)).arr[x_329] = x_332;
+    {
+      int const x_334 = i_1;
+      i_1 = (x_334 + 1);
+    }
+  }
+  return;
+}
+
+void mergeSort_(thread tint_array_wrapper* const tint_symbol_7, thread tint_array_wrapper* const tint_symbol_8) {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  while (true) {
+    int const x_341 = m;
+    int const x_342 = high;
+    if ((x_341 <= x_342)) {
+    } else {
+      break;
+    }
+    int const x_345 = low;
+    i_2 = x_345;
+    while (true) {
+      int const x_350 = i_2;
+      int const x_351 = high;
+      if ((x_350 < x_351)) {
+      } else {
+        break;
+      }
+      int const x_354 = i_2;
+      from_1 = x_354;
+      int const x_355 = i_2;
+      int const x_356 = m;
+      mid_1 = ((x_355 + x_356) - 1);
+      int const x_359 = i_2;
+      int const x_360 = m;
+      int const x_364 = high;
+      to_1 = min(((x_359 + (2 * x_360)) - 1), x_364);
+      int const x_366 = from_1;
+      param = x_366;
+      int const x_367 = mid_1;
+      param_1 = x_367;
+      int const x_368 = to_1;
+      param_2 = x_368;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2), tint_symbol_7, tint_symbol_8);
+      {
+        int const x_370 = m;
+        int const x_372 = i_2;
+        i_2 = (x_372 + (2 * x_370));
+      }
+    }
+    {
+      int const x_374 = m;
+      m = (2 * x_374);
+    }
+  }
+  return;
+}
+
+void main_1(constant buf0& x_28, thread tint_array_wrapper* const tint_symbol_9, thread tint_array_wrapper* const tint_symbol_10, thread float4* const tint_symbol_11, thread float4* const tint_symbol_12) {
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  int int_i = 0;
+  float const x_85 = x_28.injectionSwitch.x;
+  i_3 = int(x_85);
+  while (true) {
+    int const x_91 = i_3;
+    switch(x_91) {
+      case 9: {
+        int const x_121 = i_3;
+        (*(tint_symbol_9)).arr[x_121] = -5;
+        break;
+      }
+      case 8: {
+        int const x_119 = i_3;
+        (*(tint_symbol_9)).arr[x_119] = -4;
+        break;
+      }
+      case 7: {
+        int const x_117 = i_3;
+        (*(tint_symbol_9)).arr[x_117] = -3;
+        break;
+      }
+      case 6: {
+        int const x_115 = i_3;
+        (*(tint_symbol_9)).arr[x_115] = -2;
+        break;
+      }
+      case 5: {
+        int const x_113 = i_3;
+        (*(tint_symbol_9)).arr[x_113] = -1;
+        break;
+      }
+      case 4: {
+        int const x_111 = i_3;
+        (*(tint_symbol_9)).arr[x_111] = 0;
+        break;
+      }
+      case 3: {
+        int const x_109 = i_3;
+        (*(tint_symbol_9)).arr[x_109] = 1;
+        break;
+      }
+      case 2: {
+        int const x_107 = i_3;
+        (*(tint_symbol_9)).arr[x_107] = 2;
+        break;
+      }
+      case 1: {
+        int const x_105 = i_3;
+        (*(tint_symbol_9)).arr[x_105] = 3;
+        break;
+      }
+      case 0: {
+        int const x_103 = i_3;
+        (*(tint_symbol_9)).arr[x_103] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    int const x_123 = i_3;
+    i_3 = (x_123 + 1);
+    {
+      int const x_125 = i_3;
+      if ((x_125 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  while (true) {
+    int const x_131 = j_1;
+    if ((x_131 < 10)) {
+    } else {
+      break;
+    }
+    int const x_134 = j_1;
+    int const x_135 = j_1;
+    int const x_137 = (*(tint_symbol_9)).arr[x_135];
+    (*(tint_symbol_10)).arr[x_134] = x_137;
+    {
+      int const x_139 = j_1;
+      j_1 = (x_139 + 1);
+    }
+  }
+  mergeSort_(tint_symbol_9, tint_symbol_10);
+  float const x_143 = (*(tint_symbol_11)).y;
+  if ((int(x_143) < 30)) {
+    int const x_150 = (*(tint_symbol_9)).arr[0];
+    grey = (0.5f + (float(x_150) / 10.0f));
+  } else {
+    float const x_155 = (*(tint_symbol_11)).y;
+    if ((int(x_155) < 60)) {
+      int const x_162 = (*(tint_symbol_9)).arr[1];
+      grey = (0.5f + (float(x_162) / 10.0f));
+    } else {
+      float const x_167 = (*(tint_symbol_11)).y;
+      if ((int(x_167) < 90)) {
+        int const x_174 = (*(tint_symbol_9)).arr[2];
+        grey = (0.5f + (float(x_174) / 10.0f));
+      } else {
+        float const x_179 = (*(tint_symbol_11)).y;
+        if ((int(x_179) < 120)) {
+          int const x_186 = (*(tint_symbol_9)).arr[3];
+          grey = (0.5f + (float(x_186) / 10.0f));
+        } else {
+          float const x_191 = (*(tint_symbol_11)).y;
+          if ((int(x_191) < 150)) {
+            int_i = 1;
+            while (true) {
+              int const x_201 = int_i;
+              float const x_203 = x_28.injectionSwitch.x;
+              if ((x_201 > int(x_203))) {
+              } else {
+                break;
+              }
+              discard_fragment();
+            }
+          } else {
+            float const x_208 = (*(tint_symbol_11)).y;
+            if ((int(x_208) < 180)) {
+              int const x_215 = (*(tint_symbol_9)).arr[5];
+              grey = (0.5f + (float(x_215) / 10.0f));
+            } else {
+              float const x_220 = (*(tint_symbol_11)).y;
+              if ((int(x_220) < 210)) {
+                int const x_227 = (*(tint_symbol_9)).arr[6];
+                grey = (0.5f + (float(x_227) / 10.0f));
+              } else {
+                float const x_232 = (*(tint_symbol_11)).y;
+                if ((int(x_232) < 240)) {
+                  int const x_239 = (*(tint_symbol_9)).arr[7];
+                  grey = (0.5f + (float(x_239) / 10.0f));
+                } else {
+                  float const x_244 = (*(tint_symbol_11)).y;
+                  if ((int(x_244) < 270)) {
+                    int const x_251 = (*(tint_symbol_9)).arr[8];
+                    grey = (0.5f + (float(x_251) / 10.0f));
+                  } else {
+                    discard_fragment();
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  float const x_255 = grey;
+  float3 const x_256 = float3(x_255, x_255, x_255);
+  *(tint_symbol_12) = float4(x_256.x, x_256.y, x_256.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_28 [[buffer(0)]]) {
+  thread float4 tint_symbol_13 = 0.0f;
+  thread tint_array_wrapper tint_symbol_14 = {};
+  thread tint_array_wrapper tint_symbol_15 = {};
+  thread float4 tint_symbol_16 = 0.0f;
+  tint_symbol_13 = gl_FragCoord_param;
+  main_1(x_28, &(tint_symbol_14), &(tint_symbol_15), &(tint_symbol_13), &(tint_symbol_16));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_16};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-reversed-for-loop/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-reversed-for-loop/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..6b57991
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-reversed-for-loop/1.spvasm.expected.spvasm
@@ -0,0 +1,673 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 429
+; Schema: 0
+               OpCapability Shader
+        %177 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %data "data"
+               OpName %temp "temp"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_28 "x_28"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %merge_i1_i1_i1_ "merge_i1_i1_i1_"
+               OpName %from "from"
+               OpName %mid "mid"
+               OpName %to "to"
+               OpName %k "k"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %i_1 "i_1"
+               OpName %mergeSort_ "mergeSort_"
+               OpName %low "low"
+               OpName %high "high"
+               OpName %m "m"
+               OpName %i_2 "i_2"
+               OpName %from_1 "from_1"
+               OpName %mid_1 "mid_1"
+               OpName %to_1 "to_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %main_1 "main_1"
+               OpName %i_3 "i_3"
+               OpName %j_1 "j_1"
+               OpName %grey "grey"
+               OpName %int_i "int_i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_28 NonWritable
+               OpDecorate %x_28 DescriptorSet 0
+               OpDecorate %x_28 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Private__arr_int_uint_10 = OpTypePointer Private %_arr_int_uint_10
+          %7 = OpConstantNull %_arr_int_uint_10
+       %data = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+       %temp = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_28 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %17
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int %_ptr_Function_int
+         %32 = OpConstantNull %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+%_ptr_Private_int = OpTypePointer Private %int
+     %int_10 = OpConstant %int 10
+        %132 = OpTypeFunction %void
+      %int_0 = OpConstant %int 0
+      %int_9 = OpConstant %int 9
+      %int_2 = OpConstant %int 2
+%_ptr_Function_float = OpTypePointer Function %float
+        %201 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %int_n5 = OpConstant %int -5
+     %int_n4 = OpConstant %int -4
+     %int_n3 = OpConstant %int -3
+     %int_n2 = OpConstant %int -2
+     %int_n1 = OpConstant %int -1
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %int_30 = OpConstant %int 30
+  %float_0_5 = OpConstant %float 0.5
+   %float_10 = OpConstant %float 10
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+    %v3float = OpTypeVector %float 3
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %416 = OpTypeFunction %void %main_out
+%merge_i1_i1_i1_ = OpFunction %void None %23
+       %from = OpFunctionParameter %_ptr_Function_int
+        %mid = OpFunctionParameter %_ptr_Function_int
+         %to = OpFunctionParameter %_ptr_Function_int
+         %30 = OpLabel
+          %k = OpVariable %_ptr_Function_int Function %32
+          %i = OpVariable %_ptr_Function_int Function %32
+          %j = OpVariable %_ptr_Function_int Function %32
+        %i_1 = OpVariable %_ptr_Function_int Function %32
+         %37 = OpLoad %int %from
+               OpStore %k %37
+         %39 = OpLoad %int %from
+               OpStore %i %39
+         %41 = OpLoad %int %mid
+         %43 = OpIAdd %int %41 %int_1
+               OpStore %j %43
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %48 = OpLoad %int %i
+         %50 = OpLoad %int %mid
+         %51 = OpLoad %int %j
+         %53 = OpLoad %int %to
+         %54 = OpSLessThanEqual %bool %48 %50
+               OpSelectionMerge %56 None
+               OpBranchConditional %54 %57 %56
+         %57 = OpLabel
+         %58 = OpSLessThanEqual %bool %51 %53
+               OpBranch %56
+         %56 = OpLabel
+         %59 = OpPhi %bool %54 %47 %58 %57
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %62
+         %61 = OpLabel
+               OpBranch %60
+         %62 = OpLabel
+               OpBranch %45
+         %60 = OpLabel
+         %63 = OpLoad %int %i
+         %65 = OpAccessChain %_ptr_Private_int %data %63
+         %66 = OpLoad %int %65
+         %67 = OpLoad %int %j
+         %68 = OpAccessChain %_ptr_Private_int %data %67
+         %69 = OpLoad %int %68
+         %70 = OpSLessThan %bool %66 %69
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %73
+         %72 = OpLabel
+         %74 = OpLoad %int %k
+         %75 = OpIAdd %int %74 %int_1
+               OpStore %k %75
+         %76 = OpLoad %int %i
+         %77 = OpIAdd %int %76 %int_1
+               OpStore %i %77
+         %78 = OpAccessChain %_ptr_Private_int %data %76
+         %79 = OpLoad %int %78
+         %80 = OpAccessChain %_ptr_Private_int %temp %74
+               OpStore %80 %79
+               OpBranch %71
+         %73 = OpLabel
+         %81 = OpLoad %int %k
+         %82 = OpIAdd %int %81 %int_1
+               OpStore %k %82
+         %83 = OpLoad %int %j
+         %84 = OpIAdd %int %83 %int_1
+               OpStore %j %84
+         %85 = OpAccessChain %_ptr_Private_int %data %83
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_Private_int %temp %81
+               OpStore %87 %86
+               OpBranch %71
+         %71 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+               OpBranch %44
+         %45 = OpLabel
+               OpBranch %88
+         %88 = OpLabel
+               OpLoopMerge %89 %90 None
+               OpBranch %91
+         %91 = OpLabel
+         %92 = OpLoad %int %i
+         %93 = OpLoad %int %i
+         %95 = OpLoad %int %mid
+         %97 = OpSLessThan %bool %92 %int_10
+               OpSelectionMerge %98 None
+               OpBranchConditional %97 %99 %98
+         %99 = OpLabel
+        %100 = OpSLessThanEqual %bool %93 %95
+               OpBranch %98
+         %98 = OpLabel
+        %101 = OpPhi %bool %97 %91 %100 %99
+               OpSelectionMerge %102 None
+               OpBranchConditional %101 %103 %104
+        %103 = OpLabel
+               OpBranch %102
+        %104 = OpLabel
+               OpBranch %89
+        %102 = OpLabel
+        %105 = OpLoad %int %k
+        %106 = OpIAdd %int %105 %int_1
+               OpStore %k %106
+        %107 = OpLoad %int %i
+        %108 = OpIAdd %int %107 %int_1
+               OpStore %i %108
+        %109 = OpAccessChain %_ptr_Private_int %data %107
+        %110 = OpLoad %int %109
+        %111 = OpAccessChain %_ptr_Private_int %temp %105
+               OpStore %111 %110
+               OpBranch %90
+         %90 = OpLabel
+               OpBranch %88
+         %89 = OpLabel
+        %113 = OpLoad %int %from
+               OpStore %i_1 %113
+               OpBranch %114
+        %114 = OpLabel
+               OpLoopMerge %115 %116 None
+               OpBranch %117
+        %117 = OpLabel
+        %118 = OpLoad %int %i_1
+        %120 = OpLoad %int %to
+        %121 = OpSLessThanEqual %bool %118 %120
+               OpSelectionMerge %122 None
+               OpBranchConditional %121 %123 %124
+        %123 = OpLabel
+               OpBranch %122
+        %124 = OpLabel
+               OpBranch %115
+        %122 = OpLabel
+        %125 = OpLoad %int %i_1
+        %126 = OpLoad %int %i_1
+        %127 = OpAccessChain %_ptr_Private_int %temp %126
+        %128 = OpLoad %int %127
+        %129 = OpAccessChain %_ptr_Private_int %data %125
+               OpStore %129 %128
+               OpBranch %116
+        %116 = OpLabel
+        %130 = OpLoad %int %i_1
+        %131 = OpIAdd %int %130 %int_1
+               OpStore %i_1 %131
+               OpBranch %114
+        %115 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %mergeSort_ = OpFunction %void None %132
+        %134 = OpLabel
+        %low = OpVariable %_ptr_Function_int Function %32
+       %high = OpVariable %_ptr_Function_int Function %32
+          %m = OpVariable %_ptr_Function_int Function %32
+        %i_2 = OpVariable %_ptr_Function_int Function %32
+     %from_1 = OpVariable %_ptr_Function_int Function %32
+      %mid_1 = OpVariable %_ptr_Function_int Function %32
+       %to_1 = OpVariable %_ptr_Function_int Function %32
+      %param = OpVariable %_ptr_Function_int Function %32
+    %param_1 = OpVariable %_ptr_Function_int Function %32
+    %param_2 = OpVariable %_ptr_Function_int Function %32
+               OpStore %low %int_0
+               OpStore %high %int_9
+               OpStore %m %int_1
+               OpBranch %147
+        %147 = OpLabel
+               OpLoopMerge %148 %149 None
+               OpBranch %150
+        %150 = OpLabel
+        %151 = OpLoad %int %m
+        %152 = OpLoad %int %high
+        %153 = OpSLessThanEqual %bool %151 %152
+               OpSelectionMerge %154 None
+               OpBranchConditional %153 %155 %156
+        %155 = OpLabel
+               OpBranch %154
+        %156 = OpLabel
+               OpBranch %148
+        %154 = OpLabel
+        %157 = OpLoad %int %low
+               OpStore %i_2 %157
+               OpBranch %158
+        %158 = OpLabel
+               OpLoopMerge %159 %160 None
+               OpBranch %161
+        %161 = OpLabel
+        %162 = OpLoad %int %i_2
+        %163 = OpLoad %int %high
+        %164 = OpSLessThan %bool %162 %163
+               OpSelectionMerge %165 None
+               OpBranchConditional %164 %166 %167
+        %166 = OpLabel
+               OpBranch %165
+        %167 = OpLabel
+               OpBranch %159
+        %165 = OpLabel
+        %168 = OpLoad %int %i_2
+               OpStore %from_1 %168
+        %169 = OpLoad %int %i_2
+        %170 = OpLoad %int %m
+        %171 = OpIAdd %int %169 %170
+        %172 = OpISub %int %171 %int_1
+               OpStore %mid_1 %172
+        %173 = OpLoad %int %i_2
+        %174 = OpLoad %int %m
+        %175 = OpLoad %int %high
+        %179 = OpIMul %int %int_2 %174
+        %180 = OpIAdd %int %173 %179
+        %181 = OpISub %int %180 %int_1
+        %176 = OpExtInst %int %177 SMin %181 %175
+               OpStore %to_1 %176
+        %182 = OpLoad %int %from_1
+               OpStore %param %182
+        %183 = OpLoad %int %mid_1
+               OpStore %param_1 %183
+        %184 = OpLoad %int %to_1
+               OpStore %param_2 %184
+        %185 = OpFunctionCall %void %merge_i1_i1_i1_ %param %param_1 %param_2
+               OpBranch %160
+        %160 = OpLabel
+        %189 = OpLoad %int %m
+        %190 = OpLoad %int %i_2
+        %191 = OpIMul %int %int_2 %189
+        %192 = OpIAdd %int %190 %191
+               OpStore %i_2 %192
+               OpBranch %158
+        %159 = OpLabel
+               OpBranch %149
+        %149 = OpLabel
+        %193 = OpLoad %int %m
+        %194 = OpIMul %int %int_2 %193
+               OpStore %m %194
+               OpBranch %147
+        %148 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %132
+        %196 = OpLabel
+        %i_3 = OpVariable %_ptr_Function_int Function %32
+        %j_1 = OpVariable %_ptr_Function_int Function %32
+       %grey = OpVariable %_ptr_Function_float Function %201
+      %int_i = OpVariable %_ptr_Function_int Function %32
+        %205 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_0
+        %206 = OpLoad %float %205
+        %207 = OpConvertFToS %int %206
+               OpStore %i_3 %207
+               OpBranch %208
+        %208 = OpLabel
+               OpLoopMerge %209 %210 None
+               OpBranch %211
+        %211 = OpLabel
+        %212 = OpLoad %int %i_3
+               OpSelectionMerge %213 None
+               OpSwitch %212 %214 9 %215 8 %216 7 %217 6 %218 5 %219 4 %220 3 %221 2 %222 1 %223 0 %224
+        %215 = OpLabel
+        %225 = OpLoad %int %i_3
+        %226 = OpAccessChain %_ptr_Private_int %data %225
+               OpStore %226 %int_n5
+               OpBranch %213
+        %216 = OpLabel
+        %228 = OpLoad %int %i_3
+        %229 = OpAccessChain %_ptr_Private_int %data %228
+               OpStore %229 %int_n4
+               OpBranch %213
+        %217 = OpLabel
+        %231 = OpLoad %int %i_3
+        %232 = OpAccessChain %_ptr_Private_int %data %231
+               OpStore %232 %int_n3
+               OpBranch %213
+        %218 = OpLabel
+        %234 = OpLoad %int %i_3
+        %235 = OpAccessChain %_ptr_Private_int %data %234
+               OpStore %235 %int_n2
+               OpBranch %213
+        %219 = OpLabel
+        %237 = OpLoad %int %i_3
+        %238 = OpAccessChain %_ptr_Private_int %data %237
+               OpStore %238 %int_n1
+               OpBranch %213
+        %220 = OpLabel
+        %240 = OpLoad %int %i_3
+        %241 = OpAccessChain %_ptr_Private_int %data %240
+               OpStore %241 %int_0
+               OpBranch %213
+        %221 = OpLabel
+        %242 = OpLoad %int %i_3
+        %243 = OpAccessChain %_ptr_Private_int %data %242
+               OpStore %243 %int_1
+               OpBranch %213
+        %222 = OpLabel
+        %244 = OpLoad %int %i_3
+        %245 = OpAccessChain %_ptr_Private_int %data %244
+               OpStore %245 %int_2
+               OpBranch %213
+        %223 = OpLabel
+        %246 = OpLoad %int %i_3
+        %247 = OpAccessChain %_ptr_Private_int %data %246
+               OpStore %247 %int_3
+               OpBranch %213
+        %224 = OpLabel
+        %249 = OpLoad %int %i_3
+        %250 = OpAccessChain %_ptr_Private_int %data %249
+               OpStore %250 %int_4
+               OpBranch %213
+        %214 = OpLabel
+               OpBranch %213
+        %213 = OpLabel
+        %252 = OpLoad %int %i_3
+        %253 = OpIAdd %int %252 %int_1
+               OpStore %i_3 %253
+               OpBranch %210
+        %210 = OpLabel
+        %254 = OpLoad %int %i_3
+        %255 = OpSLessThan %bool %254 %int_10
+               OpSelectionMerge %256 None
+               OpBranchConditional %255 %257 %258
+        %257 = OpLabel
+               OpBranch %256
+        %258 = OpLabel
+               OpBranch %209
+        %256 = OpLabel
+               OpBranch %208
+        %209 = OpLabel
+               OpStore %j_1 %int_0
+               OpBranch %259
+        %259 = OpLabel
+               OpLoopMerge %260 %261 None
+               OpBranch %262
+        %262 = OpLabel
+        %263 = OpLoad %int %j_1
+        %264 = OpSLessThan %bool %263 %int_10
+               OpSelectionMerge %265 None
+               OpBranchConditional %264 %266 %267
+        %266 = OpLabel
+               OpBranch %265
+        %267 = OpLabel
+               OpBranch %260
+        %265 = OpLabel
+        %268 = OpLoad %int %j_1
+        %269 = OpLoad %int %j_1
+        %270 = OpAccessChain %_ptr_Private_int %data %269
+        %271 = OpLoad %int %270
+        %272 = OpAccessChain %_ptr_Private_int %temp %268
+               OpStore %272 %271
+               OpBranch %261
+        %261 = OpLabel
+        %273 = OpLoad %int %j_1
+        %274 = OpIAdd %int %273 %int_1
+               OpStore %j_1 %274
+               OpBranch %259
+        %260 = OpLabel
+        %275 = OpFunctionCall %void %mergeSort_
+        %278 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %279 = OpLoad %float %278
+        %280 = OpConvertFToS %int %279
+        %282 = OpSLessThan %bool %280 %int_30
+               OpSelectionMerge %283 None
+               OpBranchConditional %282 %284 %285
+        %284 = OpLabel
+        %286 = OpAccessChain %_ptr_Private_int %data %int_0
+        %287 = OpLoad %int %286
+        %289 = OpConvertSToF %float %287
+        %291 = OpFDiv %float %289 %float_10
+        %292 = OpFAdd %float %float_0_5 %291
+               OpStore %grey %292
+               OpBranch %283
+        %285 = OpLabel
+        %293 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %294 = OpLoad %float %293
+        %295 = OpConvertFToS %int %294
+        %297 = OpSLessThan %bool %295 %int_60
+               OpSelectionMerge %298 None
+               OpBranchConditional %297 %299 %300
+        %299 = OpLabel
+        %301 = OpAccessChain %_ptr_Private_int %data %int_1
+        %302 = OpLoad %int %301
+        %303 = OpConvertSToF %float %302
+        %304 = OpFDiv %float %303 %float_10
+        %305 = OpFAdd %float %float_0_5 %304
+               OpStore %grey %305
+               OpBranch %298
+        %300 = OpLabel
+        %306 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %307 = OpLoad %float %306
+        %308 = OpConvertFToS %int %307
+        %310 = OpSLessThan %bool %308 %int_90
+               OpSelectionMerge %311 None
+               OpBranchConditional %310 %312 %313
+        %312 = OpLabel
+        %314 = OpAccessChain %_ptr_Private_int %data %int_2
+        %315 = OpLoad %int %314
+        %316 = OpConvertSToF %float %315
+        %317 = OpFDiv %float %316 %float_10
+        %318 = OpFAdd %float %float_0_5 %317
+               OpStore %grey %318
+               OpBranch %311
+        %313 = OpLabel
+        %319 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %320 = OpLoad %float %319
+        %321 = OpConvertFToS %int %320
+        %323 = OpSLessThan %bool %321 %int_120
+               OpSelectionMerge %324 None
+               OpBranchConditional %323 %325 %326
+        %325 = OpLabel
+        %327 = OpAccessChain %_ptr_Private_int %data %int_3
+        %328 = OpLoad %int %327
+        %329 = OpConvertSToF %float %328
+        %330 = OpFDiv %float %329 %float_10
+        %331 = OpFAdd %float %float_0_5 %330
+               OpStore %grey %331
+               OpBranch %324
+        %326 = OpLabel
+        %332 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %333 = OpLoad %float %332
+        %334 = OpConvertFToS %int %333
+        %336 = OpSLessThan %bool %334 %int_150
+               OpSelectionMerge %337 None
+               OpBranchConditional %336 %338 %339
+        %338 = OpLabel
+               OpStore %int_i %int_1
+               OpBranch %340
+        %340 = OpLabel
+               OpLoopMerge %341 %342 None
+               OpBranch %343
+        %343 = OpLabel
+        %344 = OpLoad %int %int_i
+        %345 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_0
+        %346 = OpLoad %float %345
+        %347 = OpConvertFToS %int %346
+        %348 = OpSGreaterThan %bool %344 %347
+               OpSelectionMerge %349 None
+               OpBranchConditional %348 %350 %351
+        %350 = OpLabel
+               OpBranch %349
+        %351 = OpLabel
+               OpBranch %341
+        %349 = OpLabel
+               OpKill
+        %342 = OpLabel
+               OpBranch %340
+        %341 = OpLabel
+               OpBranch %337
+        %339 = OpLabel
+        %352 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %353 = OpLoad %float %352
+        %354 = OpConvertFToS %int %353
+        %356 = OpSLessThan %bool %354 %int_180
+               OpSelectionMerge %357 None
+               OpBranchConditional %356 %358 %359
+        %358 = OpLabel
+        %361 = OpAccessChain %_ptr_Private_int %data %int_5
+        %362 = OpLoad %int %361
+        %363 = OpConvertSToF %float %362
+        %364 = OpFDiv %float %363 %float_10
+        %365 = OpFAdd %float %float_0_5 %364
+               OpStore %grey %365
+               OpBranch %357
+        %359 = OpLabel
+        %366 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %367 = OpLoad %float %366
+        %368 = OpConvertFToS %int %367
+        %370 = OpSLessThan %bool %368 %int_210
+               OpSelectionMerge %371 None
+               OpBranchConditional %370 %372 %373
+        %372 = OpLabel
+        %375 = OpAccessChain %_ptr_Private_int %data %int_6
+        %376 = OpLoad %int %375
+        %377 = OpConvertSToF %float %376
+        %378 = OpFDiv %float %377 %float_10
+        %379 = OpFAdd %float %float_0_5 %378
+               OpStore %grey %379
+               OpBranch %371
+        %373 = OpLabel
+        %380 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %381 = OpLoad %float %380
+        %382 = OpConvertFToS %int %381
+        %384 = OpSLessThan %bool %382 %int_240
+               OpSelectionMerge %385 None
+               OpBranchConditional %384 %386 %387
+        %386 = OpLabel
+        %389 = OpAccessChain %_ptr_Private_int %data %int_7
+        %390 = OpLoad %int %389
+        %391 = OpConvertSToF %float %390
+        %392 = OpFDiv %float %391 %float_10
+        %393 = OpFAdd %float %float_0_5 %392
+               OpStore %grey %393
+               OpBranch %385
+        %387 = OpLabel
+        %394 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %395 = OpLoad %float %394
+        %396 = OpConvertFToS %int %395
+        %398 = OpSLessThan %bool %396 %int_270
+               OpSelectionMerge %399 None
+               OpBranchConditional %398 %400 %401
+        %400 = OpLabel
+        %403 = OpAccessChain %_ptr_Private_int %data %int_8
+        %404 = OpLoad %int %403
+        %405 = OpConvertSToF %float %404
+        %406 = OpFDiv %float %405 %float_10
+        %407 = OpFAdd %float %float_0_5 %406
+               OpStore %grey %407
+               OpBranch %399
+        %401 = OpLabel
+               OpKill
+        %399 = OpLabel
+               OpBranch %385
+        %385 = OpLabel
+               OpBranch %371
+        %371 = OpLabel
+               OpBranch %357
+        %357 = OpLabel
+               OpBranch %337
+        %337 = OpLabel
+               OpBranch %324
+        %324 = OpLabel
+               OpBranch %311
+        %311 = OpLabel
+               OpBranch %298
+        %298 = OpLabel
+               OpBranch %283
+        %283 = OpLabel
+        %408 = OpLoad %float %grey
+        %410 = OpCompositeConstruct %v3float %408 %408 %408
+        %411 = OpCompositeExtract %float %410 0
+        %412 = OpCompositeExtract %float %410 1
+        %413 = OpCompositeExtract %float %410 2
+        %415 = OpCompositeConstruct %v4float %411 %412 %413 %float_1
+               OpStore %x_GLF_color %415
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %416
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %420 = OpLabel
+        %421 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %421
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %132
+        %423 = OpLabel
+        %424 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %424
+        %425 = OpFunctionCall %void %main_1
+        %427 = OpLoad %v4float %x_GLF_color
+        %428 = OpCompositeConstruct %main_out %427
+        %426 = OpFunctionCall %void %tint_symbol_3 %428
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 210[%210] is not post dominated by the back-edge block 256[%256]
+  %256 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-reversed-for-loop/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-reversed-for-loop/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..c64c646
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-reversed-for-loop/1.spvasm.expected.wgsl
@@ -0,0 +1,316 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> data : array<i32, 10>;
+
+var<private> temp : array<i32, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn merge_i1_i1_i1_(from : ptr<function, i32>, mid : ptr<function, i32>, to : ptr<function, i32>) {
+  var k : i32;
+  var i : i32;
+  var j : i32;
+  var i_1 : i32;
+  let x_262 : i32 = *(from);
+  k = x_262;
+  let x_263 : i32 = *(from);
+  i = x_263;
+  let x_264 : i32 = *(mid);
+  j = (x_264 + 1);
+  loop {
+    let x_270 : i32 = i;
+    let x_271 : i32 = *(mid);
+    let x_273 : i32 = j;
+    let x_274 : i32 = *(to);
+    if (((x_270 <= x_271) && (x_273 <= x_274))) {
+    } else {
+      break;
+    }
+    let x_278 : i32 = i;
+    let x_280 : i32 = data[x_278];
+    let x_281 : i32 = j;
+    let x_283 : i32 = data[x_281];
+    if ((x_280 < x_283)) {
+      let x_288 : i32 = k;
+      k = (x_288 + 1);
+      let x_290 : i32 = i;
+      i = (x_290 + 1);
+      let x_293 : i32 = data[x_290];
+      temp[x_288] = x_293;
+    } else {
+      let x_295 : i32 = k;
+      k = (x_295 + 1);
+      let x_297 : i32 = j;
+      j = (x_297 + 1);
+      let x_300 : i32 = data[x_297];
+      temp[x_295] = x_300;
+    }
+  }
+  loop {
+    let x_306 : i32 = i;
+    let x_308 : i32 = i;
+    let x_309 : i32 = *(mid);
+    if (((x_306 < 10) && (x_308 <= x_309))) {
+    } else {
+      break;
+    }
+    let x_313 : i32 = k;
+    k = (x_313 + 1);
+    let x_315 : i32 = i;
+    i = (x_315 + 1);
+    let x_318 : i32 = data[x_315];
+    temp[x_313] = x_318;
+  }
+  let x_320 : i32 = *(from);
+  i_1 = x_320;
+  loop {
+    let x_325 : i32 = i_1;
+    let x_326 : i32 = *(to);
+    if ((x_325 <= x_326)) {
+    } else {
+      break;
+    }
+    let x_329 : i32 = i_1;
+    let x_330 : i32 = i_1;
+    let x_332 : i32 = temp[x_330];
+    data[x_329] = x_332;
+
+    continuing {
+      let x_334 : i32 = i_1;
+      i_1 = (x_334 + 1);
+    }
+  }
+  return;
+}
+
+fn mergeSort_() {
+  var low : i32;
+  var high : i32;
+  var m : i32;
+  var i_2 : i32;
+  var from_1 : i32;
+  var mid_1 : i32;
+  var to_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  low = 0;
+  high = 9;
+  m = 1;
+  loop {
+    let x_341 : i32 = m;
+    let x_342 : i32 = high;
+    if ((x_341 <= x_342)) {
+    } else {
+      break;
+    }
+    let x_345 : i32 = low;
+    i_2 = x_345;
+    loop {
+      let x_350 : i32 = i_2;
+      let x_351 : i32 = high;
+      if ((x_350 < x_351)) {
+      } else {
+        break;
+      }
+      let x_354 : i32 = i_2;
+      from_1 = x_354;
+      let x_355 : i32 = i_2;
+      let x_356 : i32 = m;
+      mid_1 = ((x_355 + x_356) - 1);
+      let x_359 : i32 = i_2;
+      let x_360 : i32 = m;
+      let x_364 : i32 = high;
+      to_1 = min(((x_359 + (2 * x_360)) - 1), x_364);
+      let x_366 : i32 = from_1;
+      param = x_366;
+      let x_367 : i32 = mid_1;
+      param_1 = x_367;
+      let x_368 : i32 = to_1;
+      param_2 = x_368;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2));
+
+      continuing {
+        let x_370 : i32 = m;
+        let x_372 : i32 = i_2;
+        i_2 = (x_372 + (2 * x_370));
+      }
+    }
+
+    continuing {
+      let x_374 : i32 = m;
+      m = (2 * x_374);
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_3 : i32;
+  var j_1 : i32;
+  var grey : f32;
+  var int_i : i32;
+  let x_85 : f32 = x_28.injectionSwitch.x;
+  i_3 = i32(x_85);
+  loop {
+    let x_91 : i32 = i_3;
+    switch(x_91) {
+      case 9: {
+        let x_121 : i32 = i_3;
+        data[x_121] = -5;
+      }
+      case 8: {
+        let x_119 : i32 = i_3;
+        data[x_119] = -4;
+      }
+      case 7: {
+        let x_117 : i32 = i_3;
+        data[x_117] = -3;
+      }
+      case 6: {
+        let x_115 : i32 = i_3;
+        data[x_115] = -2;
+      }
+      case 5: {
+        let x_113 : i32 = i_3;
+        data[x_113] = -1;
+      }
+      case 4: {
+        let x_111 : i32 = i_3;
+        data[x_111] = 0;
+      }
+      case 3: {
+        let x_109 : i32 = i_3;
+        data[x_109] = 1;
+      }
+      case 2: {
+        let x_107 : i32 = i_3;
+        data[x_107] = 2;
+      }
+      case 1: {
+        let x_105 : i32 = i_3;
+        data[x_105] = 3;
+      }
+      case 0: {
+        let x_103 : i32 = i_3;
+        data[x_103] = 4;
+      }
+      default: {
+      }
+    }
+    let x_123 : i32 = i_3;
+    i_3 = (x_123 + 1);
+
+    continuing {
+      let x_125 : i32 = i_3;
+      if ((x_125 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  loop {
+    let x_131 : i32 = j_1;
+    if ((x_131 < 10)) {
+    } else {
+      break;
+    }
+    let x_134 : i32 = j_1;
+    let x_135 : i32 = j_1;
+    let x_137 : i32 = data[x_135];
+    temp[x_134] = x_137;
+
+    continuing {
+      let x_139 : i32 = j_1;
+      j_1 = (x_139 + 1);
+    }
+  }
+  mergeSort_();
+  let x_143 : f32 = gl_FragCoord.y;
+  if ((i32(x_143) < 30)) {
+    let x_150 : i32 = data[0];
+    grey = (0.5 + (f32(x_150) / 10.0));
+  } else {
+    let x_155 : f32 = gl_FragCoord.y;
+    if ((i32(x_155) < 60)) {
+      let x_162 : i32 = data[1];
+      grey = (0.5 + (f32(x_162) / 10.0));
+    } else {
+      let x_167 : f32 = gl_FragCoord.y;
+      if ((i32(x_167) < 90)) {
+        let x_174 : i32 = data[2];
+        grey = (0.5 + (f32(x_174) / 10.0));
+      } else {
+        let x_179 : f32 = gl_FragCoord.y;
+        if ((i32(x_179) < 120)) {
+          let x_186 : i32 = data[3];
+          grey = (0.5 + (f32(x_186) / 10.0));
+        } else {
+          let x_191 : f32 = gl_FragCoord.y;
+          if ((i32(x_191) < 150)) {
+            int_i = 1;
+            loop {
+              let x_201 : i32 = int_i;
+              let x_203 : f32 = x_28.injectionSwitch.x;
+              if ((x_201 > i32(x_203))) {
+              } else {
+                break;
+              }
+              discard;
+            }
+          } else {
+            let x_208 : f32 = gl_FragCoord.y;
+            if ((i32(x_208) < 180)) {
+              let x_215 : i32 = data[5];
+              grey = (0.5 + (f32(x_215) / 10.0));
+            } else {
+              let x_220 : f32 = gl_FragCoord.y;
+              if ((i32(x_220) < 210)) {
+                let x_227 : i32 = data[6];
+                grey = (0.5 + (f32(x_227) / 10.0));
+              } else {
+                let x_232 : f32 = gl_FragCoord.y;
+                if ((i32(x_232) < 240)) {
+                  let x_239 : i32 = data[7];
+                  grey = (0.5 + (f32(x_239) / 10.0));
+                } else {
+                  let x_244 : f32 = gl_FragCoord.y;
+                  if ((i32(x_244) < 270)) {
+                    let x_251 : i32 = data[8];
+                    grey = (0.5 + (f32(x_251) / 10.0));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  let x_255 : f32 = grey;
+  let x_256 : vec3<f32> = vec3<f32>(x_255, x_255, x_255);
+  x_GLF_color = vec4<f32>(x_256.x, x_256.y, x_256.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-reversed-for-loop/1.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-reversed-for-loop/1.wgsl
new file mode 100644
index 0000000..c64c646
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-reversed-for-loop/1.wgsl
@@ -0,0 +1,316 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> data : array<i32, 10>;
+
+var<private> temp : array<i32, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn merge_i1_i1_i1_(from : ptr<function, i32>, mid : ptr<function, i32>, to : ptr<function, i32>) {
+  var k : i32;
+  var i : i32;
+  var j : i32;
+  var i_1 : i32;
+  let x_262 : i32 = *(from);
+  k = x_262;
+  let x_263 : i32 = *(from);
+  i = x_263;
+  let x_264 : i32 = *(mid);
+  j = (x_264 + 1);
+  loop {
+    let x_270 : i32 = i;
+    let x_271 : i32 = *(mid);
+    let x_273 : i32 = j;
+    let x_274 : i32 = *(to);
+    if (((x_270 <= x_271) && (x_273 <= x_274))) {
+    } else {
+      break;
+    }
+    let x_278 : i32 = i;
+    let x_280 : i32 = data[x_278];
+    let x_281 : i32 = j;
+    let x_283 : i32 = data[x_281];
+    if ((x_280 < x_283)) {
+      let x_288 : i32 = k;
+      k = (x_288 + 1);
+      let x_290 : i32 = i;
+      i = (x_290 + 1);
+      let x_293 : i32 = data[x_290];
+      temp[x_288] = x_293;
+    } else {
+      let x_295 : i32 = k;
+      k = (x_295 + 1);
+      let x_297 : i32 = j;
+      j = (x_297 + 1);
+      let x_300 : i32 = data[x_297];
+      temp[x_295] = x_300;
+    }
+  }
+  loop {
+    let x_306 : i32 = i;
+    let x_308 : i32 = i;
+    let x_309 : i32 = *(mid);
+    if (((x_306 < 10) && (x_308 <= x_309))) {
+    } else {
+      break;
+    }
+    let x_313 : i32 = k;
+    k = (x_313 + 1);
+    let x_315 : i32 = i;
+    i = (x_315 + 1);
+    let x_318 : i32 = data[x_315];
+    temp[x_313] = x_318;
+  }
+  let x_320 : i32 = *(from);
+  i_1 = x_320;
+  loop {
+    let x_325 : i32 = i_1;
+    let x_326 : i32 = *(to);
+    if ((x_325 <= x_326)) {
+    } else {
+      break;
+    }
+    let x_329 : i32 = i_1;
+    let x_330 : i32 = i_1;
+    let x_332 : i32 = temp[x_330];
+    data[x_329] = x_332;
+
+    continuing {
+      let x_334 : i32 = i_1;
+      i_1 = (x_334 + 1);
+    }
+  }
+  return;
+}
+
+fn mergeSort_() {
+  var low : i32;
+  var high : i32;
+  var m : i32;
+  var i_2 : i32;
+  var from_1 : i32;
+  var mid_1 : i32;
+  var to_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  low = 0;
+  high = 9;
+  m = 1;
+  loop {
+    let x_341 : i32 = m;
+    let x_342 : i32 = high;
+    if ((x_341 <= x_342)) {
+    } else {
+      break;
+    }
+    let x_345 : i32 = low;
+    i_2 = x_345;
+    loop {
+      let x_350 : i32 = i_2;
+      let x_351 : i32 = high;
+      if ((x_350 < x_351)) {
+      } else {
+        break;
+      }
+      let x_354 : i32 = i_2;
+      from_1 = x_354;
+      let x_355 : i32 = i_2;
+      let x_356 : i32 = m;
+      mid_1 = ((x_355 + x_356) - 1);
+      let x_359 : i32 = i_2;
+      let x_360 : i32 = m;
+      let x_364 : i32 = high;
+      to_1 = min(((x_359 + (2 * x_360)) - 1), x_364);
+      let x_366 : i32 = from_1;
+      param = x_366;
+      let x_367 : i32 = mid_1;
+      param_1 = x_367;
+      let x_368 : i32 = to_1;
+      param_2 = x_368;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2));
+
+      continuing {
+        let x_370 : i32 = m;
+        let x_372 : i32 = i_2;
+        i_2 = (x_372 + (2 * x_370));
+      }
+    }
+
+    continuing {
+      let x_374 : i32 = m;
+      m = (2 * x_374);
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_3 : i32;
+  var j_1 : i32;
+  var grey : f32;
+  var int_i : i32;
+  let x_85 : f32 = x_28.injectionSwitch.x;
+  i_3 = i32(x_85);
+  loop {
+    let x_91 : i32 = i_3;
+    switch(x_91) {
+      case 9: {
+        let x_121 : i32 = i_3;
+        data[x_121] = -5;
+      }
+      case 8: {
+        let x_119 : i32 = i_3;
+        data[x_119] = -4;
+      }
+      case 7: {
+        let x_117 : i32 = i_3;
+        data[x_117] = -3;
+      }
+      case 6: {
+        let x_115 : i32 = i_3;
+        data[x_115] = -2;
+      }
+      case 5: {
+        let x_113 : i32 = i_3;
+        data[x_113] = -1;
+      }
+      case 4: {
+        let x_111 : i32 = i_3;
+        data[x_111] = 0;
+      }
+      case 3: {
+        let x_109 : i32 = i_3;
+        data[x_109] = 1;
+      }
+      case 2: {
+        let x_107 : i32 = i_3;
+        data[x_107] = 2;
+      }
+      case 1: {
+        let x_105 : i32 = i_3;
+        data[x_105] = 3;
+      }
+      case 0: {
+        let x_103 : i32 = i_3;
+        data[x_103] = 4;
+      }
+      default: {
+      }
+    }
+    let x_123 : i32 = i_3;
+    i_3 = (x_123 + 1);
+
+    continuing {
+      let x_125 : i32 = i_3;
+      if ((x_125 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  loop {
+    let x_131 : i32 = j_1;
+    if ((x_131 < 10)) {
+    } else {
+      break;
+    }
+    let x_134 : i32 = j_1;
+    let x_135 : i32 = j_1;
+    let x_137 : i32 = data[x_135];
+    temp[x_134] = x_137;
+
+    continuing {
+      let x_139 : i32 = j_1;
+      j_1 = (x_139 + 1);
+    }
+  }
+  mergeSort_();
+  let x_143 : f32 = gl_FragCoord.y;
+  if ((i32(x_143) < 30)) {
+    let x_150 : i32 = data[0];
+    grey = (0.5 + (f32(x_150) / 10.0));
+  } else {
+    let x_155 : f32 = gl_FragCoord.y;
+    if ((i32(x_155) < 60)) {
+      let x_162 : i32 = data[1];
+      grey = (0.5 + (f32(x_162) / 10.0));
+    } else {
+      let x_167 : f32 = gl_FragCoord.y;
+      if ((i32(x_167) < 90)) {
+        let x_174 : i32 = data[2];
+        grey = (0.5 + (f32(x_174) / 10.0));
+      } else {
+        let x_179 : f32 = gl_FragCoord.y;
+        if ((i32(x_179) < 120)) {
+          let x_186 : i32 = data[3];
+          grey = (0.5 + (f32(x_186) / 10.0));
+        } else {
+          let x_191 : f32 = gl_FragCoord.y;
+          if ((i32(x_191) < 150)) {
+            int_i = 1;
+            loop {
+              let x_201 : i32 = int_i;
+              let x_203 : f32 = x_28.injectionSwitch.x;
+              if ((x_201 > i32(x_203))) {
+              } else {
+                break;
+              }
+              discard;
+            }
+          } else {
+            let x_208 : f32 = gl_FragCoord.y;
+            if ((i32(x_208) < 180)) {
+              let x_215 : i32 = data[5];
+              grey = (0.5 + (f32(x_215) / 10.0));
+            } else {
+              let x_220 : f32 = gl_FragCoord.y;
+              if ((i32(x_220) < 210)) {
+                let x_227 : i32 = data[6];
+                grey = (0.5 + (f32(x_227) / 10.0));
+              } else {
+                let x_232 : f32 = gl_FragCoord.y;
+                if ((i32(x_232) < 240)) {
+                  let x_239 : i32 = data[7];
+                  grey = (0.5 + (f32(x_239) / 10.0));
+                } else {
+                  let x_244 : f32 = gl_FragCoord.y;
+                  if ((i32(x_244) < 270)) {
+                    let x_251 : i32 = data[8];
+                    grey = (0.5 + (f32(x_251) / 10.0));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  let x_255 : f32 = grey;
+  let x_256 : vec3<f32> = vec3<f32>(x_255, x_255, x_255);
+  x_GLF_color = vec4<f32>(x_256.x, x_256.y, x_256.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-reversed-for-loop/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-reversed-for-loop/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..347df10
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-reversed-for-loop/1.wgsl.expected.hlsl
@@ -0,0 +1,278 @@
+static int data[10] = (int[10])0;
+static int temp[10] = (int[10])0;
+cbuffer cbuffer_x_28 : register(b0, space0) {
+  uint4 x_28[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void merge_i1_i1_i1_(inout int from, inout int mid, inout int to) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  const int x_262 = from;
+  k = x_262;
+  const int x_263 = from;
+  i = x_263;
+  const int x_264 = mid;
+  j = (x_264 + 1);
+  while (true) {
+    const int x_270 = i;
+    const int x_271 = mid;
+    const int x_273 = j;
+    const int x_274 = to;
+    bool tint_tmp = (x_270 <= x_271);
+    if (tint_tmp) {
+      tint_tmp = (x_273 <= x_274);
+    }
+    if ((tint_tmp)) {
+    } else {
+      break;
+    }
+    const int x_280 = data[i];
+    const int x_283 = data[j];
+    if ((x_280 < x_283)) {
+      const int x_288 = k;
+      k = (x_288 + 1);
+      const int x_290 = i;
+      i = (x_290 + 1);
+      const int x_293 = data[x_290];
+      temp[x_288] = x_293;
+    } else {
+      const int x_295 = k;
+      k = (x_295 + 1);
+      const int x_297 = j;
+      j = (x_297 + 1);
+      const int x_300 = data[x_297];
+      temp[x_295] = x_300;
+    }
+  }
+  while (true) {
+    const int x_306 = i;
+    const int x_308 = i;
+    const int x_309 = mid;
+    bool tint_tmp_1 = (x_306 < 10);
+    if (tint_tmp_1) {
+      tint_tmp_1 = (x_308 <= x_309);
+    }
+    if ((tint_tmp_1)) {
+    } else {
+      break;
+    }
+    const int x_313 = k;
+    k = (x_313 + 1);
+    const int x_315 = i;
+    i = (x_315 + 1);
+    const int x_318 = data[x_315];
+    temp[x_313] = x_318;
+  }
+  const int x_320 = from;
+  i_1 = x_320;
+  while (true) {
+    const int x_325 = i_1;
+    const int x_326 = to;
+    if ((x_325 <= x_326)) {
+    } else {
+      break;
+    }
+    const int x_329 = i_1;
+    const int x_332 = temp[i_1];
+    data[x_329] = x_332;
+    {
+      i_1 = (i_1 + 1);
+    }
+  }
+  return;
+}
+
+void mergeSort_() {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  {
+    for(; (m <= high); m = (2 * m)) {
+      i_2 = low;
+      {
+        for(; (i_2 < high); i_2 = (i_2 + (2 * m))) {
+          from_1 = i_2;
+          mid_1 = ((i_2 + m) - 1);
+          to_1 = min(((i_2 + (2 * m)) - 1), high);
+          param = from_1;
+          param_1 = mid_1;
+          param_2 = to_1;
+          merge_i1_i1_i1_(param, param_1, param_2);
+        }
+      }
+    }
+  }
+  return;
+}
+
+void main_1() {
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  int int_i = 0;
+  const float x_85 = asfloat(x_28[0].x);
+  i_3 = int(x_85);
+  while (true) {
+    switch(i_3) {
+      case 9: {
+        data[i_3] = -5;
+        break;
+      }
+      case 8: {
+        data[i_3] = -4;
+        break;
+      }
+      case 7: {
+        data[i_3] = -3;
+        break;
+      }
+      case 6: {
+        data[i_3] = -2;
+        break;
+      }
+      case 5: {
+        data[i_3] = -1;
+        break;
+      }
+      case 4: {
+        data[i_3] = 0;
+        break;
+      }
+      case 3: {
+        data[i_3] = 1;
+        break;
+      }
+      case 2: {
+        data[i_3] = 2;
+        break;
+      }
+      case 1: {
+        data[i_3] = 3;
+        break;
+      }
+      case 0: {
+        data[i_3] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    i_3 = (i_3 + 1);
+    {
+      if ((i_3 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  {
+    for(; (j_1 < 10); j_1 = (j_1 + 1)) {
+      const int x_134 = j_1;
+      const int x_137 = data[j_1];
+      temp[x_134] = x_137;
+    }
+  }
+  mergeSort_();
+  const float x_143 = gl_FragCoord.y;
+  if ((int(x_143) < 30)) {
+    const int x_150 = data[0];
+    grey = (0.5f + (float(x_150) / 10.0f));
+  } else {
+    const float x_155 = gl_FragCoord.y;
+    if ((int(x_155) < 60)) {
+      const int x_162 = data[1];
+      grey = (0.5f + (float(x_162) / 10.0f));
+    } else {
+      const float x_167 = gl_FragCoord.y;
+      if ((int(x_167) < 90)) {
+        const int x_174 = data[2];
+        grey = (0.5f + (float(x_174) / 10.0f));
+      } else {
+        const float x_179 = gl_FragCoord.y;
+        if ((int(x_179) < 120)) {
+          const int x_186 = data[3];
+          grey = (0.5f + (float(x_186) / 10.0f));
+        } else {
+          const float x_191 = gl_FragCoord.y;
+          if ((int(x_191) < 150)) {
+            int_i = 1;
+            while (true) {
+              const int x_201 = int_i;
+              const float x_203 = asfloat(x_28[0].x);
+              if ((x_201 > int(x_203))) {
+              } else {
+                break;
+              }
+              discard;
+            }
+          } else {
+            const float x_208 = gl_FragCoord.y;
+            if ((int(x_208) < 180)) {
+              const int x_215 = data[5];
+              grey = (0.5f + (float(x_215) / 10.0f));
+            } else {
+              const float x_220 = gl_FragCoord.y;
+              if ((int(x_220) < 210)) {
+                const int x_227 = data[6];
+                grey = (0.5f + (float(x_227) / 10.0f));
+              } else {
+                const float x_232 = gl_FragCoord.y;
+                if ((int(x_232) < 240)) {
+                  const int x_239 = data[7];
+                  grey = (0.5f + (float(x_239) / 10.0f));
+                } else {
+                  const float x_244 = gl_FragCoord.y;
+                  if ((int(x_244) < 270)) {
+                    const int x_251 = data[8];
+                    grey = (0.5f + (float(x_251) / 10.0f));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  const float x_255 = grey;
+  const float3 x_256 = float3(x_255, x_255, x_255);
+  x_GLF_color = float4(x_256.x, x_256.y, x_256.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-reversed-for-loop/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-reversed-for-loop/1.wgsl.expected.msl
new file mode 100644
index 0000000..23be1b2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-reversed-for-loop/1.wgsl.expected.msl
@@ -0,0 +1,324 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void merge_i1_i1_i1_(thread int* const from, thread int* const mid, thread int* const to, thread tint_array_wrapper* const tint_symbol_5, thread tint_array_wrapper* const tint_symbol_6) {
+  int k = 0;
+  int i = 0;
+  int j = 0;
+  int i_1 = 0;
+  int const x_262 = *(from);
+  k = x_262;
+  int const x_263 = *(from);
+  i = x_263;
+  int const x_264 = *(mid);
+  j = (x_264 + 1);
+  while (true) {
+    int const x_270 = i;
+    int const x_271 = *(mid);
+    int const x_273 = j;
+    int const x_274 = *(to);
+    if (((x_270 <= x_271) && (x_273 <= x_274))) {
+    } else {
+      break;
+    }
+    int const x_278 = i;
+    int const x_280 = (*(tint_symbol_5)).arr[x_278];
+    int const x_281 = j;
+    int const x_283 = (*(tint_symbol_5)).arr[x_281];
+    if ((x_280 < x_283)) {
+      int const x_288 = k;
+      k = (x_288 + 1);
+      int const x_290 = i;
+      i = (x_290 + 1);
+      int const x_293 = (*(tint_symbol_5)).arr[x_290];
+      (*(tint_symbol_6)).arr[x_288] = x_293;
+    } else {
+      int const x_295 = k;
+      k = (x_295 + 1);
+      int const x_297 = j;
+      j = (x_297 + 1);
+      int const x_300 = (*(tint_symbol_5)).arr[x_297];
+      (*(tint_symbol_6)).arr[x_295] = x_300;
+    }
+  }
+  while (true) {
+    int const x_306 = i;
+    int const x_308 = i;
+    int const x_309 = *(mid);
+    if (((x_306 < 10) && (x_308 <= x_309))) {
+    } else {
+      break;
+    }
+    int const x_313 = k;
+    k = (x_313 + 1);
+    int const x_315 = i;
+    i = (x_315 + 1);
+    int const x_318 = (*(tint_symbol_5)).arr[x_315];
+    (*(tint_symbol_6)).arr[x_313] = x_318;
+  }
+  int const x_320 = *(from);
+  i_1 = x_320;
+  while (true) {
+    int const x_325 = i_1;
+    int const x_326 = *(to);
+    if ((x_325 <= x_326)) {
+    } else {
+      break;
+    }
+    int const x_329 = i_1;
+    int const x_330 = i_1;
+    int const x_332 = (*(tint_symbol_6)).arr[x_330];
+    (*(tint_symbol_5)).arr[x_329] = x_332;
+    {
+      int const x_334 = i_1;
+      i_1 = (x_334 + 1);
+    }
+  }
+  return;
+}
+
+void mergeSort_(thread tint_array_wrapper* const tint_symbol_7, thread tint_array_wrapper* const tint_symbol_8) {
+  int low = 0;
+  int high = 0;
+  int m = 0;
+  int i_2 = 0;
+  int from_1 = 0;
+  int mid_1 = 0;
+  int to_1 = 0;
+  int param = 0;
+  int param_1 = 0;
+  int param_2 = 0;
+  low = 0;
+  high = 9;
+  m = 1;
+  while (true) {
+    int const x_341 = m;
+    int const x_342 = high;
+    if ((x_341 <= x_342)) {
+    } else {
+      break;
+    }
+    int const x_345 = low;
+    i_2 = x_345;
+    while (true) {
+      int const x_350 = i_2;
+      int const x_351 = high;
+      if ((x_350 < x_351)) {
+      } else {
+        break;
+      }
+      int const x_354 = i_2;
+      from_1 = x_354;
+      int const x_355 = i_2;
+      int const x_356 = m;
+      mid_1 = ((x_355 + x_356) - 1);
+      int const x_359 = i_2;
+      int const x_360 = m;
+      int const x_364 = high;
+      to_1 = min(((x_359 + (2 * x_360)) - 1), x_364);
+      int const x_366 = from_1;
+      param = x_366;
+      int const x_367 = mid_1;
+      param_1 = x_367;
+      int const x_368 = to_1;
+      param_2 = x_368;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2), tint_symbol_7, tint_symbol_8);
+      {
+        int const x_370 = m;
+        int const x_372 = i_2;
+        i_2 = (x_372 + (2 * x_370));
+      }
+    }
+    {
+      int const x_374 = m;
+      m = (2 * x_374);
+    }
+  }
+  return;
+}
+
+void main_1(constant buf0& x_28, thread tint_array_wrapper* const tint_symbol_9, thread tint_array_wrapper* const tint_symbol_10, thread float4* const tint_symbol_11, thread float4* const tint_symbol_12) {
+  int i_3 = 0;
+  int j_1 = 0;
+  float grey = 0.0f;
+  int int_i = 0;
+  float const x_85 = x_28.injectionSwitch.x;
+  i_3 = int(x_85);
+  while (true) {
+    int const x_91 = i_3;
+    switch(x_91) {
+      case 9: {
+        int const x_121 = i_3;
+        (*(tint_symbol_9)).arr[x_121] = -5;
+        break;
+      }
+      case 8: {
+        int const x_119 = i_3;
+        (*(tint_symbol_9)).arr[x_119] = -4;
+        break;
+      }
+      case 7: {
+        int const x_117 = i_3;
+        (*(tint_symbol_9)).arr[x_117] = -3;
+        break;
+      }
+      case 6: {
+        int const x_115 = i_3;
+        (*(tint_symbol_9)).arr[x_115] = -2;
+        break;
+      }
+      case 5: {
+        int const x_113 = i_3;
+        (*(tint_symbol_9)).arr[x_113] = -1;
+        break;
+      }
+      case 4: {
+        int const x_111 = i_3;
+        (*(tint_symbol_9)).arr[x_111] = 0;
+        break;
+      }
+      case 3: {
+        int const x_109 = i_3;
+        (*(tint_symbol_9)).arr[x_109] = 1;
+        break;
+      }
+      case 2: {
+        int const x_107 = i_3;
+        (*(tint_symbol_9)).arr[x_107] = 2;
+        break;
+      }
+      case 1: {
+        int const x_105 = i_3;
+        (*(tint_symbol_9)).arr[x_105] = 3;
+        break;
+      }
+      case 0: {
+        int const x_103 = i_3;
+        (*(tint_symbol_9)).arr[x_103] = 4;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    int const x_123 = i_3;
+    i_3 = (x_123 + 1);
+    {
+      int const x_125 = i_3;
+      if ((x_125 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  while (true) {
+    int const x_131 = j_1;
+    if ((x_131 < 10)) {
+    } else {
+      break;
+    }
+    int const x_134 = j_1;
+    int const x_135 = j_1;
+    int const x_137 = (*(tint_symbol_9)).arr[x_135];
+    (*(tint_symbol_10)).arr[x_134] = x_137;
+    {
+      int const x_139 = j_1;
+      j_1 = (x_139 + 1);
+    }
+  }
+  mergeSort_(tint_symbol_9, tint_symbol_10);
+  float const x_143 = (*(tint_symbol_11)).y;
+  if ((int(x_143) < 30)) {
+    int const x_150 = (*(tint_symbol_9)).arr[0];
+    grey = (0.5f + (float(x_150) / 10.0f));
+  } else {
+    float const x_155 = (*(tint_symbol_11)).y;
+    if ((int(x_155) < 60)) {
+      int const x_162 = (*(tint_symbol_9)).arr[1];
+      grey = (0.5f + (float(x_162) / 10.0f));
+    } else {
+      float const x_167 = (*(tint_symbol_11)).y;
+      if ((int(x_167) < 90)) {
+        int const x_174 = (*(tint_symbol_9)).arr[2];
+        grey = (0.5f + (float(x_174) / 10.0f));
+      } else {
+        float const x_179 = (*(tint_symbol_11)).y;
+        if ((int(x_179) < 120)) {
+          int const x_186 = (*(tint_symbol_9)).arr[3];
+          grey = (0.5f + (float(x_186) / 10.0f));
+        } else {
+          float const x_191 = (*(tint_symbol_11)).y;
+          if ((int(x_191) < 150)) {
+            int_i = 1;
+            while (true) {
+              int const x_201 = int_i;
+              float const x_203 = x_28.injectionSwitch.x;
+              if ((x_201 > int(x_203))) {
+              } else {
+                break;
+              }
+              discard_fragment();
+            }
+          } else {
+            float const x_208 = (*(tint_symbol_11)).y;
+            if ((int(x_208) < 180)) {
+              int const x_215 = (*(tint_symbol_9)).arr[5];
+              grey = (0.5f + (float(x_215) / 10.0f));
+            } else {
+              float const x_220 = (*(tint_symbol_11)).y;
+              if ((int(x_220) < 210)) {
+                int const x_227 = (*(tint_symbol_9)).arr[6];
+                grey = (0.5f + (float(x_227) / 10.0f));
+              } else {
+                float const x_232 = (*(tint_symbol_11)).y;
+                if ((int(x_232) < 240)) {
+                  int const x_239 = (*(tint_symbol_9)).arr[7];
+                  grey = (0.5f + (float(x_239) / 10.0f));
+                } else {
+                  float const x_244 = (*(tint_symbol_11)).y;
+                  if ((int(x_244) < 270)) {
+                    int const x_251 = (*(tint_symbol_9)).arr[8];
+                    grey = (0.5f + (float(x_251) / 10.0f));
+                  } else {
+                    discard_fragment();
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  float const x_255 = grey;
+  float3 const x_256 = float3(x_255, x_255, x_255);
+  *(tint_symbol_12) = float4(x_256.x, x_256.y, x_256.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_28 [[buffer(0)]]) {
+  thread float4 tint_symbol_13 = 0.0f;
+  thread tint_array_wrapper tint_symbol_14 = {};
+  thread tint_array_wrapper tint_symbol_15 = {};
+  thread float4 tint_symbol_16 = 0.0f;
+  tint_symbol_13 = gl_FragCoord_param;
+  main_1(x_28, &(tint_symbol_14), &(tint_symbol_15), &(tint_symbol_13), &(tint_symbol_16));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_16};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-reversed-for-loop/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-reversed-for-loop/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..6b57991
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-reversed-for-loop/1.wgsl.expected.spvasm
@@ -0,0 +1,673 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 429
+; Schema: 0
+               OpCapability Shader
+        %177 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %data "data"
+               OpName %temp "temp"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_28 "x_28"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %merge_i1_i1_i1_ "merge_i1_i1_i1_"
+               OpName %from "from"
+               OpName %mid "mid"
+               OpName %to "to"
+               OpName %k "k"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %i_1 "i_1"
+               OpName %mergeSort_ "mergeSort_"
+               OpName %low "low"
+               OpName %high "high"
+               OpName %m "m"
+               OpName %i_2 "i_2"
+               OpName %from_1 "from_1"
+               OpName %mid_1 "mid_1"
+               OpName %to_1 "to_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %main_1 "main_1"
+               OpName %i_3 "i_3"
+               OpName %j_1 "j_1"
+               OpName %grey "grey"
+               OpName %int_i "int_i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_28 NonWritable
+               OpDecorate %x_28 DescriptorSet 0
+               OpDecorate %x_28 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%_ptr_Private__arr_int_uint_10 = OpTypePointer Private %_arr_int_uint_10
+          %7 = OpConstantNull %_arr_int_uint_10
+       %data = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+       %temp = OpVariable %_ptr_Private__arr_int_uint_10 Private %7
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_28 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %17
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int %_ptr_Function_int
+         %32 = OpConstantNull %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+%_ptr_Private_int = OpTypePointer Private %int
+     %int_10 = OpConstant %int 10
+        %132 = OpTypeFunction %void
+      %int_0 = OpConstant %int 0
+      %int_9 = OpConstant %int 9
+      %int_2 = OpConstant %int 2
+%_ptr_Function_float = OpTypePointer Function %float
+        %201 = OpConstantNull %float
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %int_n5 = OpConstant %int -5
+     %int_n4 = OpConstant %int -4
+     %int_n3 = OpConstant %int -3
+     %int_n2 = OpConstant %int -2
+     %int_n1 = OpConstant %int -1
+      %int_3 = OpConstant %int 3
+      %int_4 = OpConstant %int 4
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+     %int_30 = OpConstant %int 30
+  %float_0_5 = OpConstant %float 0.5
+   %float_10 = OpConstant %float 10
+     %int_60 = OpConstant %int 60
+     %int_90 = OpConstant %int 90
+    %int_120 = OpConstant %int 120
+    %int_150 = OpConstant %int 150
+    %int_180 = OpConstant %int 180
+      %int_5 = OpConstant %int 5
+    %int_210 = OpConstant %int 210
+      %int_6 = OpConstant %int 6
+    %int_240 = OpConstant %int 240
+      %int_7 = OpConstant %int 7
+    %int_270 = OpConstant %int 270
+      %int_8 = OpConstant %int 8
+    %v3float = OpTypeVector %float 3
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+        %416 = OpTypeFunction %void %main_out
+%merge_i1_i1_i1_ = OpFunction %void None %23
+       %from = OpFunctionParameter %_ptr_Function_int
+        %mid = OpFunctionParameter %_ptr_Function_int
+         %to = OpFunctionParameter %_ptr_Function_int
+         %30 = OpLabel
+          %k = OpVariable %_ptr_Function_int Function %32
+          %i = OpVariable %_ptr_Function_int Function %32
+          %j = OpVariable %_ptr_Function_int Function %32
+        %i_1 = OpVariable %_ptr_Function_int Function %32
+         %37 = OpLoad %int %from
+               OpStore %k %37
+         %39 = OpLoad %int %from
+               OpStore %i %39
+         %41 = OpLoad %int %mid
+         %43 = OpIAdd %int %41 %int_1
+               OpStore %j %43
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %48 = OpLoad %int %i
+         %50 = OpLoad %int %mid
+         %51 = OpLoad %int %j
+         %53 = OpLoad %int %to
+         %54 = OpSLessThanEqual %bool %48 %50
+               OpSelectionMerge %56 None
+               OpBranchConditional %54 %57 %56
+         %57 = OpLabel
+         %58 = OpSLessThanEqual %bool %51 %53
+               OpBranch %56
+         %56 = OpLabel
+         %59 = OpPhi %bool %54 %47 %58 %57
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %62
+         %61 = OpLabel
+               OpBranch %60
+         %62 = OpLabel
+               OpBranch %45
+         %60 = OpLabel
+         %63 = OpLoad %int %i
+         %65 = OpAccessChain %_ptr_Private_int %data %63
+         %66 = OpLoad %int %65
+         %67 = OpLoad %int %j
+         %68 = OpAccessChain %_ptr_Private_int %data %67
+         %69 = OpLoad %int %68
+         %70 = OpSLessThan %bool %66 %69
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %73
+         %72 = OpLabel
+         %74 = OpLoad %int %k
+         %75 = OpIAdd %int %74 %int_1
+               OpStore %k %75
+         %76 = OpLoad %int %i
+         %77 = OpIAdd %int %76 %int_1
+               OpStore %i %77
+         %78 = OpAccessChain %_ptr_Private_int %data %76
+         %79 = OpLoad %int %78
+         %80 = OpAccessChain %_ptr_Private_int %temp %74
+               OpStore %80 %79
+               OpBranch %71
+         %73 = OpLabel
+         %81 = OpLoad %int %k
+         %82 = OpIAdd %int %81 %int_1
+               OpStore %k %82
+         %83 = OpLoad %int %j
+         %84 = OpIAdd %int %83 %int_1
+               OpStore %j %84
+         %85 = OpAccessChain %_ptr_Private_int %data %83
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_Private_int %temp %81
+               OpStore %87 %86
+               OpBranch %71
+         %71 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+               OpBranch %44
+         %45 = OpLabel
+               OpBranch %88
+         %88 = OpLabel
+               OpLoopMerge %89 %90 None
+               OpBranch %91
+         %91 = OpLabel
+         %92 = OpLoad %int %i
+         %93 = OpLoad %int %i
+         %95 = OpLoad %int %mid
+         %97 = OpSLessThan %bool %92 %int_10
+               OpSelectionMerge %98 None
+               OpBranchConditional %97 %99 %98
+         %99 = OpLabel
+        %100 = OpSLessThanEqual %bool %93 %95
+               OpBranch %98
+         %98 = OpLabel
+        %101 = OpPhi %bool %97 %91 %100 %99
+               OpSelectionMerge %102 None
+               OpBranchConditional %101 %103 %104
+        %103 = OpLabel
+               OpBranch %102
+        %104 = OpLabel
+               OpBranch %89
+        %102 = OpLabel
+        %105 = OpLoad %int %k
+        %106 = OpIAdd %int %105 %int_1
+               OpStore %k %106
+        %107 = OpLoad %int %i
+        %108 = OpIAdd %int %107 %int_1
+               OpStore %i %108
+        %109 = OpAccessChain %_ptr_Private_int %data %107
+        %110 = OpLoad %int %109
+        %111 = OpAccessChain %_ptr_Private_int %temp %105
+               OpStore %111 %110
+               OpBranch %90
+         %90 = OpLabel
+               OpBranch %88
+         %89 = OpLabel
+        %113 = OpLoad %int %from
+               OpStore %i_1 %113
+               OpBranch %114
+        %114 = OpLabel
+               OpLoopMerge %115 %116 None
+               OpBranch %117
+        %117 = OpLabel
+        %118 = OpLoad %int %i_1
+        %120 = OpLoad %int %to
+        %121 = OpSLessThanEqual %bool %118 %120
+               OpSelectionMerge %122 None
+               OpBranchConditional %121 %123 %124
+        %123 = OpLabel
+               OpBranch %122
+        %124 = OpLabel
+               OpBranch %115
+        %122 = OpLabel
+        %125 = OpLoad %int %i_1
+        %126 = OpLoad %int %i_1
+        %127 = OpAccessChain %_ptr_Private_int %temp %126
+        %128 = OpLoad %int %127
+        %129 = OpAccessChain %_ptr_Private_int %data %125
+               OpStore %129 %128
+               OpBranch %116
+        %116 = OpLabel
+        %130 = OpLoad %int %i_1
+        %131 = OpIAdd %int %130 %int_1
+               OpStore %i_1 %131
+               OpBranch %114
+        %115 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %mergeSort_ = OpFunction %void None %132
+        %134 = OpLabel
+        %low = OpVariable %_ptr_Function_int Function %32
+       %high = OpVariable %_ptr_Function_int Function %32
+          %m = OpVariable %_ptr_Function_int Function %32
+        %i_2 = OpVariable %_ptr_Function_int Function %32
+     %from_1 = OpVariable %_ptr_Function_int Function %32
+      %mid_1 = OpVariable %_ptr_Function_int Function %32
+       %to_1 = OpVariable %_ptr_Function_int Function %32
+      %param = OpVariable %_ptr_Function_int Function %32
+    %param_1 = OpVariable %_ptr_Function_int Function %32
+    %param_2 = OpVariable %_ptr_Function_int Function %32
+               OpStore %low %int_0
+               OpStore %high %int_9
+               OpStore %m %int_1
+               OpBranch %147
+        %147 = OpLabel
+               OpLoopMerge %148 %149 None
+               OpBranch %150
+        %150 = OpLabel
+        %151 = OpLoad %int %m
+        %152 = OpLoad %int %high
+        %153 = OpSLessThanEqual %bool %151 %152
+               OpSelectionMerge %154 None
+               OpBranchConditional %153 %155 %156
+        %155 = OpLabel
+               OpBranch %154
+        %156 = OpLabel
+               OpBranch %148
+        %154 = OpLabel
+        %157 = OpLoad %int %low
+               OpStore %i_2 %157
+               OpBranch %158
+        %158 = OpLabel
+               OpLoopMerge %159 %160 None
+               OpBranch %161
+        %161 = OpLabel
+        %162 = OpLoad %int %i_2
+        %163 = OpLoad %int %high
+        %164 = OpSLessThan %bool %162 %163
+               OpSelectionMerge %165 None
+               OpBranchConditional %164 %166 %167
+        %166 = OpLabel
+               OpBranch %165
+        %167 = OpLabel
+               OpBranch %159
+        %165 = OpLabel
+        %168 = OpLoad %int %i_2
+               OpStore %from_1 %168
+        %169 = OpLoad %int %i_2
+        %170 = OpLoad %int %m
+        %171 = OpIAdd %int %169 %170
+        %172 = OpISub %int %171 %int_1
+               OpStore %mid_1 %172
+        %173 = OpLoad %int %i_2
+        %174 = OpLoad %int %m
+        %175 = OpLoad %int %high
+        %179 = OpIMul %int %int_2 %174
+        %180 = OpIAdd %int %173 %179
+        %181 = OpISub %int %180 %int_1
+        %176 = OpExtInst %int %177 SMin %181 %175
+               OpStore %to_1 %176
+        %182 = OpLoad %int %from_1
+               OpStore %param %182
+        %183 = OpLoad %int %mid_1
+               OpStore %param_1 %183
+        %184 = OpLoad %int %to_1
+               OpStore %param_2 %184
+        %185 = OpFunctionCall %void %merge_i1_i1_i1_ %param %param_1 %param_2
+               OpBranch %160
+        %160 = OpLabel
+        %189 = OpLoad %int %m
+        %190 = OpLoad %int %i_2
+        %191 = OpIMul %int %int_2 %189
+        %192 = OpIAdd %int %190 %191
+               OpStore %i_2 %192
+               OpBranch %158
+        %159 = OpLabel
+               OpBranch %149
+        %149 = OpLabel
+        %193 = OpLoad %int %m
+        %194 = OpIMul %int %int_2 %193
+               OpStore %m %194
+               OpBranch %147
+        %148 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %132
+        %196 = OpLabel
+        %i_3 = OpVariable %_ptr_Function_int Function %32
+        %j_1 = OpVariable %_ptr_Function_int Function %32
+       %grey = OpVariable %_ptr_Function_float Function %201
+      %int_i = OpVariable %_ptr_Function_int Function %32
+        %205 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_0
+        %206 = OpLoad %float %205
+        %207 = OpConvertFToS %int %206
+               OpStore %i_3 %207
+               OpBranch %208
+        %208 = OpLabel
+               OpLoopMerge %209 %210 None
+               OpBranch %211
+        %211 = OpLabel
+        %212 = OpLoad %int %i_3
+               OpSelectionMerge %213 None
+               OpSwitch %212 %214 9 %215 8 %216 7 %217 6 %218 5 %219 4 %220 3 %221 2 %222 1 %223 0 %224
+        %215 = OpLabel
+        %225 = OpLoad %int %i_3
+        %226 = OpAccessChain %_ptr_Private_int %data %225
+               OpStore %226 %int_n5
+               OpBranch %213
+        %216 = OpLabel
+        %228 = OpLoad %int %i_3
+        %229 = OpAccessChain %_ptr_Private_int %data %228
+               OpStore %229 %int_n4
+               OpBranch %213
+        %217 = OpLabel
+        %231 = OpLoad %int %i_3
+        %232 = OpAccessChain %_ptr_Private_int %data %231
+               OpStore %232 %int_n3
+               OpBranch %213
+        %218 = OpLabel
+        %234 = OpLoad %int %i_3
+        %235 = OpAccessChain %_ptr_Private_int %data %234
+               OpStore %235 %int_n2
+               OpBranch %213
+        %219 = OpLabel
+        %237 = OpLoad %int %i_3
+        %238 = OpAccessChain %_ptr_Private_int %data %237
+               OpStore %238 %int_n1
+               OpBranch %213
+        %220 = OpLabel
+        %240 = OpLoad %int %i_3
+        %241 = OpAccessChain %_ptr_Private_int %data %240
+               OpStore %241 %int_0
+               OpBranch %213
+        %221 = OpLabel
+        %242 = OpLoad %int %i_3
+        %243 = OpAccessChain %_ptr_Private_int %data %242
+               OpStore %243 %int_1
+               OpBranch %213
+        %222 = OpLabel
+        %244 = OpLoad %int %i_3
+        %245 = OpAccessChain %_ptr_Private_int %data %244
+               OpStore %245 %int_2
+               OpBranch %213
+        %223 = OpLabel
+        %246 = OpLoad %int %i_3
+        %247 = OpAccessChain %_ptr_Private_int %data %246
+               OpStore %247 %int_3
+               OpBranch %213
+        %224 = OpLabel
+        %249 = OpLoad %int %i_3
+        %250 = OpAccessChain %_ptr_Private_int %data %249
+               OpStore %250 %int_4
+               OpBranch %213
+        %214 = OpLabel
+               OpBranch %213
+        %213 = OpLabel
+        %252 = OpLoad %int %i_3
+        %253 = OpIAdd %int %252 %int_1
+               OpStore %i_3 %253
+               OpBranch %210
+        %210 = OpLabel
+        %254 = OpLoad %int %i_3
+        %255 = OpSLessThan %bool %254 %int_10
+               OpSelectionMerge %256 None
+               OpBranchConditional %255 %257 %258
+        %257 = OpLabel
+               OpBranch %256
+        %258 = OpLabel
+               OpBranch %209
+        %256 = OpLabel
+               OpBranch %208
+        %209 = OpLabel
+               OpStore %j_1 %int_0
+               OpBranch %259
+        %259 = OpLabel
+               OpLoopMerge %260 %261 None
+               OpBranch %262
+        %262 = OpLabel
+        %263 = OpLoad %int %j_1
+        %264 = OpSLessThan %bool %263 %int_10
+               OpSelectionMerge %265 None
+               OpBranchConditional %264 %266 %267
+        %266 = OpLabel
+               OpBranch %265
+        %267 = OpLabel
+               OpBranch %260
+        %265 = OpLabel
+        %268 = OpLoad %int %j_1
+        %269 = OpLoad %int %j_1
+        %270 = OpAccessChain %_ptr_Private_int %data %269
+        %271 = OpLoad %int %270
+        %272 = OpAccessChain %_ptr_Private_int %temp %268
+               OpStore %272 %271
+               OpBranch %261
+        %261 = OpLabel
+        %273 = OpLoad %int %j_1
+        %274 = OpIAdd %int %273 %int_1
+               OpStore %j_1 %274
+               OpBranch %259
+        %260 = OpLabel
+        %275 = OpFunctionCall %void %mergeSort_
+        %278 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %279 = OpLoad %float %278
+        %280 = OpConvertFToS %int %279
+        %282 = OpSLessThan %bool %280 %int_30
+               OpSelectionMerge %283 None
+               OpBranchConditional %282 %284 %285
+        %284 = OpLabel
+        %286 = OpAccessChain %_ptr_Private_int %data %int_0
+        %287 = OpLoad %int %286
+        %289 = OpConvertSToF %float %287
+        %291 = OpFDiv %float %289 %float_10
+        %292 = OpFAdd %float %float_0_5 %291
+               OpStore %grey %292
+               OpBranch %283
+        %285 = OpLabel
+        %293 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %294 = OpLoad %float %293
+        %295 = OpConvertFToS %int %294
+        %297 = OpSLessThan %bool %295 %int_60
+               OpSelectionMerge %298 None
+               OpBranchConditional %297 %299 %300
+        %299 = OpLabel
+        %301 = OpAccessChain %_ptr_Private_int %data %int_1
+        %302 = OpLoad %int %301
+        %303 = OpConvertSToF %float %302
+        %304 = OpFDiv %float %303 %float_10
+        %305 = OpFAdd %float %float_0_5 %304
+               OpStore %grey %305
+               OpBranch %298
+        %300 = OpLabel
+        %306 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %307 = OpLoad %float %306
+        %308 = OpConvertFToS %int %307
+        %310 = OpSLessThan %bool %308 %int_90
+               OpSelectionMerge %311 None
+               OpBranchConditional %310 %312 %313
+        %312 = OpLabel
+        %314 = OpAccessChain %_ptr_Private_int %data %int_2
+        %315 = OpLoad %int %314
+        %316 = OpConvertSToF %float %315
+        %317 = OpFDiv %float %316 %float_10
+        %318 = OpFAdd %float %float_0_5 %317
+               OpStore %grey %318
+               OpBranch %311
+        %313 = OpLabel
+        %319 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %320 = OpLoad %float %319
+        %321 = OpConvertFToS %int %320
+        %323 = OpSLessThan %bool %321 %int_120
+               OpSelectionMerge %324 None
+               OpBranchConditional %323 %325 %326
+        %325 = OpLabel
+        %327 = OpAccessChain %_ptr_Private_int %data %int_3
+        %328 = OpLoad %int %327
+        %329 = OpConvertSToF %float %328
+        %330 = OpFDiv %float %329 %float_10
+        %331 = OpFAdd %float %float_0_5 %330
+               OpStore %grey %331
+               OpBranch %324
+        %326 = OpLabel
+        %332 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %333 = OpLoad %float %332
+        %334 = OpConvertFToS %int %333
+        %336 = OpSLessThan %bool %334 %int_150
+               OpSelectionMerge %337 None
+               OpBranchConditional %336 %338 %339
+        %338 = OpLabel
+               OpStore %int_i %int_1
+               OpBranch %340
+        %340 = OpLabel
+               OpLoopMerge %341 %342 None
+               OpBranch %343
+        %343 = OpLabel
+        %344 = OpLoad %int %int_i
+        %345 = OpAccessChain %_ptr_Uniform_float %x_28 %uint_0 %uint_0
+        %346 = OpLoad %float %345
+        %347 = OpConvertFToS %int %346
+        %348 = OpSGreaterThan %bool %344 %347
+               OpSelectionMerge %349 None
+               OpBranchConditional %348 %350 %351
+        %350 = OpLabel
+               OpBranch %349
+        %351 = OpLabel
+               OpBranch %341
+        %349 = OpLabel
+               OpKill
+        %342 = OpLabel
+               OpBranch %340
+        %341 = OpLabel
+               OpBranch %337
+        %339 = OpLabel
+        %352 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %353 = OpLoad %float %352
+        %354 = OpConvertFToS %int %353
+        %356 = OpSLessThan %bool %354 %int_180
+               OpSelectionMerge %357 None
+               OpBranchConditional %356 %358 %359
+        %358 = OpLabel
+        %361 = OpAccessChain %_ptr_Private_int %data %int_5
+        %362 = OpLoad %int %361
+        %363 = OpConvertSToF %float %362
+        %364 = OpFDiv %float %363 %float_10
+        %365 = OpFAdd %float %float_0_5 %364
+               OpStore %grey %365
+               OpBranch %357
+        %359 = OpLabel
+        %366 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %367 = OpLoad %float %366
+        %368 = OpConvertFToS %int %367
+        %370 = OpSLessThan %bool %368 %int_210
+               OpSelectionMerge %371 None
+               OpBranchConditional %370 %372 %373
+        %372 = OpLabel
+        %375 = OpAccessChain %_ptr_Private_int %data %int_6
+        %376 = OpLoad %int %375
+        %377 = OpConvertSToF %float %376
+        %378 = OpFDiv %float %377 %float_10
+        %379 = OpFAdd %float %float_0_5 %378
+               OpStore %grey %379
+               OpBranch %371
+        %373 = OpLabel
+        %380 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %381 = OpLoad %float %380
+        %382 = OpConvertFToS %int %381
+        %384 = OpSLessThan %bool %382 %int_240
+               OpSelectionMerge %385 None
+               OpBranchConditional %384 %386 %387
+        %386 = OpLabel
+        %389 = OpAccessChain %_ptr_Private_int %data %int_7
+        %390 = OpLoad %int %389
+        %391 = OpConvertSToF %float %390
+        %392 = OpFDiv %float %391 %float_10
+        %393 = OpFAdd %float %float_0_5 %392
+               OpStore %grey %393
+               OpBranch %385
+        %387 = OpLabel
+        %394 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %395 = OpLoad %float %394
+        %396 = OpConvertFToS %int %395
+        %398 = OpSLessThan %bool %396 %int_270
+               OpSelectionMerge %399 None
+               OpBranchConditional %398 %400 %401
+        %400 = OpLabel
+        %403 = OpAccessChain %_ptr_Private_int %data %int_8
+        %404 = OpLoad %int %403
+        %405 = OpConvertSToF %float %404
+        %406 = OpFDiv %float %405 %float_10
+        %407 = OpFAdd %float %float_0_5 %406
+               OpStore %grey %407
+               OpBranch %399
+        %401 = OpLabel
+               OpKill
+        %399 = OpLabel
+               OpBranch %385
+        %385 = OpLabel
+               OpBranch %371
+        %371 = OpLabel
+               OpBranch %357
+        %357 = OpLabel
+               OpBranch %337
+        %337 = OpLabel
+               OpBranch %324
+        %324 = OpLabel
+               OpBranch %311
+        %311 = OpLabel
+               OpBranch %298
+        %298 = OpLabel
+               OpBranch %283
+        %283 = OpLabel
+        %408 = OpLoad %float %grey
+        %410 = OpCompositeConstruct %v3float %408 %408 %408
+        %411 = OpCompositeExtract %float %410 0
+        %412 = OpCompositeExtract %float %410 1
+        %413 = OpCompositeExtract %float %410 2
+        %415 = OpCompositeConstruct %v4float %411 %412 %413 %float_1
+               OpStore %x_GLF_color %415
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %416
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %420 = OpLabel
+        %421 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %421
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %132
+        %423 = OpLabel
+        %424 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %424
+        %425 = OpFunctionCall %void %main_1
+        %427 = OpLoad %v4float %x_GLF_color
+        %428 = OpCompositeConstruct %main_out %427
+        %426 = OpFunctionCall %void %tint_symbol_3 %428
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 210[%210] is not post dominated by the back-edge block 256[%256]
+  %256 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-reversed-for-loop/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-reversed-for-loop/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..c64c646
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-reversed-for-loop/1.wgsl.expected.wgsl
@@ -0,0 +1,316 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> data : array<i32, 10>;
+
+var<private> temp : array<i32, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_28 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn merge_i1_i1_i1_(from : ptr<function, i32>, mid : ptr<function, i32>, to : ptr<function, i32>) {
+  var k : i32;
+  var i : i32;
+  var j : i32;
+  var i_1 : i32;
+  let x_262 : i32 = *(from);
+  k = x_262;
+  let x_263 : i32 = *(from);
+  i = x_263;
+  let x_264 : i32 = *(mid);
+  j = (x_264 + 1);
+  loop {
+    let x_270 : i32 = i;
+    let x_271 : i32 = *(mid);
+    let x_273 : i32 = j;
+    let x_274 : i32 = *(to);
+    if (((x_270 <= x_271) && (x_273 <= x_274))) {
+    } else {
+      break;
+    }
+    let x_278 : i32 = i;
+    let x_280 : i32 = data[x_278];
+    let x_281 : i32 = j;
+    let x_283 : i32 = data[x_281];
+    if ((x_280 < x_283)) {
+      let x_288 : i32 = k;
+      k = (x_288 + 1);
+      let x_290 : i32 = i;
+      i = (x_290 + 1);
+      let x_293 : i32 = data[x_290];
+      temp[x_288] = x_293;
+    } else {
+      let x_295 : i32 = k;
+      k = (x_295 + 1);
+      let x_297 : i32 = j;
+      j = (x_297 + 1);
+      let x_300 : i32 = data[x_297];
+      temp[x_295] = x_300;
+    }
+  }
+  loop {
+    let x_306 : i32 = i;
+    let x_308 : i32 = i;
+    let x_309 : i32 = *(mid);
+    if (((x_306 < 10) && (x_308 <= x_309))) {
+    } else {
+      break;
+    }
+    let x_313 : i32 = k;
+    k = (x_313 + 1);
+    let x_315 : i32 = i;
+    i = (x_315 + 1);
+    let x_318 : i32 = data[x_315];
+    temp[x_313] = x_318;
+  }
+  let x_320 : i32 = *(from);
+  i_1 = x_320;
+  loop {
+    let x_325 : i32 = i_1;
+    let x_326 : i32 = *(to);
+    if ((x_325 <= x_326)) {
+    } else {
+      break;
+    }
+    let x_329 : i32 = i_1;
+    let x_330 : i32 = i_1;
+    let x_332 : i32 = temp[x_330];
+    data[x_329] = x_332;
+
+    continuing {
+      let x_334 : i32 = i_1;
+      i_1 = (x_334 + 1);
+    }
+  }
+  return;
+}
+
+fn mergeSort_() {
+  var low : i32;
+  var high : i32;
+  var m : i32;
+  var i_2 : i32;
+  var from_1 : i32;
+  var mid_1 : i32;
+  var to_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  low = 0;
+  high = 9;
+  m = 1;
+  loop {
+    let x_341 : i32 = m;
+    let x_342 : i32 = high;
+    if ((x_341 <= x_342)) {
+    } else {
+      break;
+    }
+    let x_345 : i32 = low;
+    i_2 = x_345;
+    loop {
+      let x_350 : i32 = i_2;
+      let x_351 : i32 = high;
+      if ((x_350 < x_351)) {
+      } else {
+        break;
+      }
+      let x_354 : i32 = i_2;
+      from_1 = x_354;
+      let x_355 : i32 = i_2;
+      let x_356 : i32 = m;
+      mid_1 = ((x_355 + x_356) - 1);
+      let x_359 : i32 = i_2;
+      let x_360 : i32 = m;
+      let x_364 : i32 = high;
+      to_1 = min(((x_359 + (2 * x_360)) - 1), x_364);
+      let x_366 : i32 = from_1;
+      param = x_366;
+      let x_367 : i32 = mid_1;
+      param_1 = x_367;
+      let x_368 : i32 = to_1;
+      param_2 = x_368;
+      merge_i1_i1_i1_(&(param), &(param_1), &(param_2));
+
+      continuing {
+        let x_370 : i32 = m;
+        let x_372 : i32 = i_2;
+        i_2 = (x_372 + (2 * x_370));
+      }
+    }
+
+    continuing {
+      let x_374 : i32 = m;
+      m = (2 * x_374);
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_3 : i32;
+  var j_1 : i32;
+  var grey : f32;
+  var int_i : i32;
+  let x_85 : f32 = x_28.injectionSwitch.x;
+  i_3 = i32(x_85);
+  loop {
+    let x_91 : i32 = i_3;
+    switch(x_91) {
+      case 9: {
+        let x_121 : i32 = i_3;
+        data[x_121] = -5;
+      }
+      case 8: {
+        let x_119 : i32 = i_3;
+        data[x_119] = -4;
+      }
+      case 7: {
+        let x_117 : i32 = i_3;
+        data[x_117] = -3;
+      }
+      case 6: {
+        let x_115 : i32 = i_3;
+        data[x_115] = -2;
+      }
+      case 5: {
+        let x_113 : i32 = i_3;
+        data[x_113] = -1;
+      }
+      case 4: {
+        let x_111 : i32 = i_3;
+        data[x_111] = 0;
+      }
+      case 3: {
+        let x_109 : i32 = i_3;
+        data[x_109] = 1;
+      }
+      case 2: {
+        let x_107 : i32 = i_3;
+        data[x_107] = 2;
+      }
+      case 1: {
+        let x_105 : i32 = i_3;
+        data[x_105] = 3;
+      }
+      case 0: {
+        let x_103 : i32 = i_3;
+        data[x_103] = 4;
+      }
+      default: {
+      }
+    }
+    let x_123 : i32 = i_3;
+    i_3 = (x_123 + 1);
+
+    continuing {
+      let x_125 : i32 = i_3;
+      if ((x_125 < 10)) {
+      } else {
+        break;
+      }
+    }
+  }
+  j_1 = 0;
+  loop {
+    let x_131 : i32 = j_1;
+    if ((x_131 < 10)) {
+    } else {
+      break;
+    }
+    let x_134 : i32 = j_1;
+    let x_135 : i32 = j_1;
+    let x_137 : i32 = data[x_135];
+    temp[x_134] = x_137;
+
+    continuing {
+      let x_139 : i32 = j_1;
+      j_1 = (x_139 + 1);
+    }
+  }
+  mergeSort_();
+  let x_143 : f32 = gl_FragCoord.y;
+  if ((i32(x_143) < 30)) {
+    let x_150 : i32 = data[0];
+    grey = (0.5 + (f32(x_150) / 10.0));
+  } else {
+    let x_155 : f32 = gl_FragCoord.y;
+    if ((i32(x_155) < 60)) {
+      let x_162 : i32 = data[1];
+      grey = (0.5 + (f32(x_162) / 10.0));
+    } else {
+      let x_167 : f32 = gl_FragCoord.y;
+      if ((i32(x_167) < 90)) {
+        let x_174 : i32 = data[2];
+        grey = (0.5 + (f32(x_174) / 10.0));
+      } else {
+        let x_179 : f32 = gl_FragCoord.y;
+        if ((i32(x_179) < 120)) {
+          let x_186 : i32 = data[3];
+          grey = (0.5 + (f32(x_186) / 10.0));
+        } else {
+          let x_191 : f32 = gl_FragCoord.y;
+          if ((i32(x_191) < 150)) {
+            int_i = 1;
+            loop {
+              let x_201 : i32 = int_i;
+              let x_203 : f32 = x_28.injectionSwitch.x;
+              if ((x_201 > i32(x_203))) {
+              } else {
+                break;
+              }
+              discard;
+            }
+          } else {
+            let x_208 : f32 = gl_FragCoord.y;
+            if ((i32(x_208) < 180)) {
+              let x_215 : i32 = data[5];
+              grey = (0.5 + (f32(x_215) / 10.0));
+            } else {
+              let x_220 : f32 = gl_FragCoord.y;
+              if ((i32(x_220) < 210)) {
+                let x_227 : i32 = data[6];
+                grey = (0.5 + (f32(x_227) / 10.0));
+              } else {
+                let x_232 : f32 = gl_FragCoord.y;
+                if ((i32(x_232) < 240)) {
+                  let x_239 : i32 = data[7];
+                  grey = (0.5 + (f32(x_239) / 10.0));
+                } else {
+                  let x_244 : f32 = gl_FragCoord.y;
+                  if ((i32(x_244) < 270)) {
+                    let x_251 : i32 = data[8];
+                    grey = (0.5 + (f32(x_251) / 10.0));
+                  } else {
+                    discard;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  let x_255 : f32 = grey;
+  let x_256 : vec3<f32> = vec3<f32>(x_255, x_255, x_255);
+  x_GLF_color = vec4<f32>(x_256.x, x_256.y, x_256.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-conditional-bitwise-or-clamp/1.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-conditional-bitwise-or-clamp/1.spvasm
new file mode 100644
index 0000000..c523797
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-conditional-bitwise-or-clamp/1.spvasm
@@ -0,0 +1,524 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %swap_i1_i1_ "swap(i1;i1;"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %performPartition_i1_i1_ "performPartition(i1;i1;"
+               OpName %l "l"
+               OpName %h "h"
+               OpName %quicksort_ "quicksort("
+               OpName %temp "temp"
+               OpName %QuicksortObject "QuicksortObject"
+               OpMemberName %QuicksortObject 0 "numbers"
+               OpName %obj "obj"
+               OpName %pivot "pivot"
+               OpName %i_0 "i"
+               OpName %j_0 "j"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %param_1 "param"
+               OpName %param_2 "param"
+               OpName %l_0 "l"
+               OpName %h_0 "h"
+               OpName %top "top"
+               OpName %stack "stack"
+               OpName %int_a "int_a"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %clamp_a "clamp_a"
+               OpName %p "p"
+               OpName %param_3 "param"
+               OpName %param_4 "param"
+               OpName %i_1 "i"
+               OpName %uv "uv"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %color "color"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %37 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %40 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+         %41 = OpTypeFunction %int %_ptr_Function_int %_ptr_Function_int
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%QuicksortObject = OpTypeStruct %_arr_int_uint_10
+%_ptr_Private_QuicksortObject = OpTypePointer Private %QuicksortObject
+        %obj = OpVariable %_ptr_Private_QuicksortObject Private
+      %int_0 = OpConstant %int 0
+%_ptr_Private_int = OpTypePointer Private %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %int_9 = OpConstant %int 9
+     %int_n1 = OpConstant %int -1
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+     %uint_1 = OpConstant %uint 1
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_0 = OpConstant %float 0
+      %false = OpConstantFalse %bool
+     %int_10 = OpConstant %int 10
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+         %70 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+ %float_0_25 = OpConstant %float 0.25
+  %float_0_5 = OpConstant %float 0.5
+      %int_2 = OpConstant %int 2
+ %float_0_75 = OpConstant %float 0.75
+      %int_3 = OpConstant %int 3
+     %uint_2 = OpConstant %uint 2
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %37
+         %85 = OpLabel
+        %i_1 = OpVariable %_ptr_Function_int Function
+         %uv = OpVariable %_ptr_Function_v2float Function
+      %color = OpVariable %_ptr_Function_v3float Function
+               OpStore %i_1 %int_0
+               OpBranch %86
+         %86 = OpLabel
+               OpLoopMerge %87 %88 None
+               OpBranch %89
+         %89 = OpLabel
+         %90 = OpLoad %int %i_1
+         %91 = OpSLessThan %bool %90 %int_10
+               OpBranchConditional %91 %92 %87
+         %92 = OpLabel
+         %93 = OpLoad %int %i_1
+         %94 = OpLoad %int %i_1
+         %95 = OpISub %int %int_10 %94
+         %96 = OpAccessChain %_ptr_Private_int %obj %int_0 %93
+               OpStore %96 %95
+         %97 = OpLoad %int %i_1
+         %98 = OpLoad %int %i_1
+         %99 = OpAccessChain %_ptr_Private_int %obj %int_0 %98
+        %100 = OpLoad %int %99
+        %101 = OpLoad %int %i_1
+        %102 = OpAccessChain %_ptr_Private_int %obj %int_0 %101
+        %103 = OpLoad %int %102
+        %104 = OpIMul %int %100 %103
+        %105 = OpAccessChain %_ptr_Private_int %obj %int_0 %97
+               OpStore %105 %104
+               OpBranch %88
+         %88 = OpLabel
+        %106 = OpLoad %int %i_1
+        %107 = OpIAdd %int %106 %int_1
+               OpStore %i_1 %107
+               OpBranch %86
+         %87 = OpLabel
+        %108 = OpFunctionCall %void %quicksort_
+        %109 = OpLoad %v4float %gl_FragCoord
+        %110 = OpVectorShuffle %v2float %109 %109 0 1
+        %111 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+        %112 = OpLoad %v2float %111
+        %113 = OpFDiv %v2float %110 %112
+               OpStore %uv %113
+               OpStore %color %70
+        %114 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_0
+        %115 = OpLoad %int %114
+        %116 = OpConvertSToF %float %115
+        %117 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %118 = OpLoad %float %117
+        %119 = OpFAdd %float %118 %116
+        %120 = OpAccessChain %_ptr_Function_float %color %uint_0
+               OpStore %120 %119
+        %121 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %122 = OpLoad %float %121
+        %123 = OpFOrdGreaterThan %bool %122 %float_0_25
+               OpSelectionMerge %124 None
+               OpBranchConditional %123 %125 %124
+        %125 = OpLabel
+        %126 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_1
+        %127 = OpLoad %int %126
+        %128 = OpConvertSToF %float %127
+        %129 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %130 = OpLoad %float %129
+        %131 = OpFAdd %float %130 %128
+        %132 = OpAccessChain %_ptr_Function_float %color %uint_0
+               OpStore %132 %131
+               OpBranch %124
+        %124 = OpLabel
+        %133 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %134 = OpLoad %float %133
+        %135 = OpFOrdGreaterThan %bool %134 %float_0_5
+               OpSelectionMerge %136 None
+               OpBranchConditional %135 %137 %136
+        %137 = OpLabel
+        %138 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_2
+        %139 = OpLoad %int %138
+        %140 = OpConvertSToF %float %139
+        %141 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %142 = OpLoad %float %141
+        %143 = OpFAdd %float %142 %140
+        %144 = OpAccessChain %_ptr_Function_float %color %uint_1
+               OpStore %144 %143
+               OpBranch %136
+        %136 = OpLabel
+        %145 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %146 = OpLoad %float %145
+        %147 = OpFOrdGreaterThan %bool %146 %float_0_75
+               OpSelectionMerge %148 None
+               OpBranchConditional %147 %149 %148
+        %149 = OpLabel
+        %150 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_3
+        %151 = OpLoad %int %150
+        %152 = OpConvertSToF %float %151
+        %153 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %154 = OpLoad %float %153
+        %155 = OpFAdd %float %154 %152
+        %156 = OpAccessChain %_ptr_Function_float %color %uint_2
+               OpStore %156 %155
+               OpBranch %148
+        %148 = OpLabel
+        %157 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_4
+        %158 = OpLoad %int %157
+        %159 = OpConvertSToF %float %158
+        %160 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %161 = OpLoad %float %160
+        %162 = OpFAdd %float %161 %159
+        %163 = OpAccessChain %_ptr_Function_float %color %uint_1
+               OpStore %163 %162
+        %164 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %165 = OpLoad %float %164
+        %166 = OpFOrdGreaterThan %bool %165 %float_0_25
+               OpSelectionMerge %167 None
+               OpBranchConditional %166 %168 %167
+        %168 = OpLabel
+        %169 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_5
+        %170 = OpLoad %int %169
+        %171 = OpConvertSToF %float %170
+        %172 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %173 = OpLoad %float %172
+        %174 = OpFAdd %float %173 %171
+        %175 = OpAccessChain %_ptr_Function_float %color %uint_0
+               OpStore %175 %174
+               OpBranch %167
+        %167 = OpLabel
+        %176 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %177 = OpLoad %float %176
+        %178 = OpFOrdGreaterThan %bool %177 %float_0_5
+               OpSelectionMerge %179 None
+               OpBranchConditional %178 %180 %179
+        %180 = OpLabel
+        %181 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_6
+        %182 = OpLoad %int %181
+        %183 = OpConvertSToF %float %182
+        %184 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %185 = OpLoad %float %184
+        %186 = OpFAdd %float %185 %183
+        %187 = OpAccessChain %_ptr_Function_float %color %uint_1
+               OpStore %187 %186
+               OpBranch %179
+        %179 = OpLabel
+        %188 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %189 = OpLoad %float %188
+        %190 = OpFOrdGreaterThan %bool %189 %float_0_75
+               OpSelectionMerge %191 None
+               OpBranchConditional %190 %192 %191
+        %192 = OpLabel
+        %193 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_7
+        %194 = OpLoad %int %193
+        %195 = OpConvertSToF %float %194
+        %196 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %197 = OpLoad %float %196
+        %198 = OpFAdd %float %197 %195
+        %199 = OpAccessChain %_ptr_Function_float %color %uint_2
+               OpStore %199 %198
+               OpBranch %191
+        %191 = OpLabel
+        %200 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_8
+        %201 = OpLoad %int %200
+        %202 = OpConvertSToF %float %201
+        %203 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %204 = OpLoad %float %203
+        %205 = OpFAdd %float %204 %202
+        %206 = OpAccessChain %_ptr_Function_float %color %uint_2
+               OpStore %206 %205
+        %207 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %208 = OpLoad %float %207
+        %209 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %210 = OpLoad %float %209
+        %211 = OpFSub %float %208 %210
+        %212 = OpExtInst %float %1 FAbs %211
+        %213 = OpFOrdLessThan %bool %212 %float_0_25
+               OpSelectionMerge %214 None
+               OpBranchConditional %213 %215 %214
+        %215 = OpLabel
+        %216 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_9
+        %217 = OpLoad %int %216
+        %218 = OpConvertSToF %float %217
+        %219 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %220 = OpLoad %float %219
+        %221 = OpFAdd %float %220 %218
+        %222 = OpAccessChain %_ptr_Function_float %color %uint_0
+               OpStore %222 %221
+               OpBranch %214
+        %214 = OpLabel
+        %223 = OpLoad %v3float %color
+        %224 = OpExtInst %v3float %1 Normalize %223
+        %225 = OpCompositeExtract %float %224 0
+        %226 = OpCompositeExtract %float %224 1
+        %227 = OpCompositeExtract %float %224 2
+        %228 = OpCompositeConstruct %v4float %225 %226 %227 %float_1
+               OpStore %_GLF_color %228
+               OpReturn
+               OpFunctionEnd
+%swap_i1_i1_ = OpFunction %void None %40
+          %i = OpFunctionParameter %_ptr_Function_int
+          %j = OpFunctionParameter %_ptr_Function_int
+        %229 = OpLabel
+       %temp = OpVariable %_ptr_Function_int Function
+        %230 = OpLoad %int %i
+        %231 = OpAccessChain %_ptr_Private_int %obj %int_0 %230
+        %232 = OpLoad %int %231
+               OpStore %temp %232
+        %233 = OpLoad %int %i
+        %234 = OpLoad %int %j
+        %235 = OpAccessChain %_ptr_Private_int %obj %int_0 %234
+        %236 = OpLoad %int %235
+        %237 = OpAccessChain %_ptr_Private_int %obj %int_0 %233
+               OpStore %237 %236
+        %238 = OpLoad %int %j
+        %239 = OpLoad %int %temp
+        %240 = OpAccessChain %_ptr_Private_int %obj %int_0 %238
+               OpStore %240 %239
+               OpReturn
+               OpFunctionEnd
+%performPartition_i1_i1_ = OpFunction %int None %41
+          %l = OpFunctionParameter %_ptr_Function_int
+          %h = OpFunctionParameter %_ptr_Function_int
+        %241 = OpLabel
+      %pivot = OpVariable %_ptr_Function_int Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+        %j_0 = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_int Function
+    %param_0 = OpVariable %_ptr_Function_int Function
+    %param_1 = OpVariable %_ptr_Function_int Function
+    %param_2 = OpVariable %_ptr_Function_int Function
+        %242 = OpLoad %int %h
+        %243 = OpAccessChain %_ptr_Private_int %obj %int_0 %242
+        %244 = OpLoad %int %243
+               OpStore %pivot %244
+        %245 = OpLoad %int %l
+        %246 = OpISub %int %245 %int_1
+               OpStore %i_0 %246
+        %247 = OpLoad %int %l
+               OpStore %j_0 %247
+               OpBranch %248
+        %248 = OpLabel
+               OpLoopMerge %249 %250 None
+               OpBranch %251
+        %251 = OpLabel
+        %252 = OpLoad %int %j_0
+        %253 = OpLoad %int %h
+        %254 = OpISub %int %253 %int_1
+        %255 = OpSLessThanEqual %bool %252 %254
+               OpBranchConditional %255 %256 %249
+        %256 = OpLabel
+        %257 = OpLoad %int %j_0
+        %258 = OpAccessChain %_ptr_Private_int %obj %int_0 %257
+        %259 = OpLoad %int %258
+        %260 = OpLoad %int %pivot
+        %261 = OpSLessThanEqual %bool %259 %260
+               OpSelectionMerge %262 None
+               OpBranchConditional %261 %263 %262
+        %263 = OpLabel
+        %264 = OpLoad %int %i_0
+        %265 = OpIAdd %int %264 %int_1
+               OpStore %i_0 %265
+        %266 = OpLoad %int %i_0
+               OpStore %param %266
+        %267 = OpLoad %int %j_0
+               OpStore %param_0 %267
+        %268 = OpFunctionCall %void %swap_i1_i1_ %param %param_0
+               OpBranch %262
+        %262 = OpLabel
+               OpBranch %250
+        %250 = OpLabel
+        %269 = OpLoad %int %j_0
+        %270 = OpIAdd %int %269 %int_1
+               OpStore %j_0 %270
+               OpBranch %248
+        %249 = OpLabel
+        %271 = OpLoad %int %i_0
+        %272 = OpIAdd %int %271 %int_1
+               OpStore %i_0 %272
+        %273 = OpLoad %int %i_0
+               OpStore %param_1 %273
+        %274 = OpLoad %int %h
+               OpStore %param_2 %274
+        %275 = OpFunctionCall %void %swap_i1_i1_ %param_1 %param_2
+        %276 = OpLoad %int %i_0
+               OpReturnValue %276
+               OpFunctionEnd
+ %quicksort_ = OpFunction %void None %37
+        %277 = OpLabel
+        %l_0 = OpVariable %_ptr_Function_int Function
+        %h_0 = OpVariable %_ptr_Function_int Function
+        %top = OpVariable %_ptr_Function_int Function
+      %stack = OpVariable %_ptr_Function__arr_int_uint_10 Function
+      %int_a = OpVariable %_ptr_Function_int Function
+        %278 = OpVariable %_ptr_Function_int Function
+        %279 = OpVariable %_ptr_Function_int Function
+    %clamp_a = OpVariable %_ptr_Function_int Function
+          %p = OpVariable %_ptr_Function_int Function
+    %param_3 = OpVariable %_ptr_Function_int Function
+    %param_4 = OpVariable %_ptr_Function_int Function
+               OpStore %l_0 %int_0
+               OpStore %h_0 %int_9
+               OpStore %top %int_n1
+        %280 = OpLoad %int %top
+        %281 = OpIAdd %int %280 %int_1
+               OpStore %top %281
+        %282 = OpLoad %int %l_0
+        %283 = OpAccessChain %_ptr_Function_int %stack %281
+               OpStore %283 %282
+        %284 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+        %285 = OpLoad %float %284
+        %286 = OpFOrdGreaterThanEqual %bool %285 %float_0
+               OpSelectionMerge %287 None
+               OpBranchConditional %286 %288 %289
+        %288 = OpLabel
+        %290 = OpLoad %int %h_0
+               OpSelectionMerge %291 None
+               OpBranchConditional %false %292 %293
+        %292 = OpLabel
+               OpStore %279 %int_1
+               OpBranch %291
+        %293 = OpLabel
+        %294 = OpLoad %int %h_0
+        %295 = OpShiftLeftLogical %int %294 %int_0
+               OpStore %279 %295
+               OpBranch %291
+        %291 = OpLabel
+        %296 = OpLoad %int %279
+        %297 = OpBitwiseOr %int %290 %296
+               OpStore %278 %297
+               OpBranch %287
+        %289 = OpLabel
+               OpStore %278 %int_1
+               OpBranch %287
+        %287 = OpLabel
+        %298 = OpLoad %int %278
+               OpStore %int_a %298
+        %299 = OpLoad %int %h_0
+        %300 = OpLoad %int %h_0
+        %301 = OpLoad %int %int_a
+        %302 = OpExtInst %int %1 SClamp %299 %300 %301
+               OpStore %clamp_a %302
+        %303 = OpLoad %int %top
+        %304 = OpIAdd %int %303 %int_1
+               OpStore %top %304
+        %305 = OpLoad %int %clamp_a
+        %306 = OpSDiv %int %305 %int_1
+        %307 = OpAccessChain %_ptr_Function_int %stack %304
+               OpStore %307 %306
+               OpBranch %308
+        %308 = OpLabel
+               OpLoopMerge %309 %310 None
+               OpBranch %311
+        %311 = OpLabel
+        %312 = OpLoad %int %top
+        %313 = OpSGreaterThanEqual %bool %312 %int_0
+               OpBranchConditional %313 %314 %309
+        %314 = OpLabel
+        %315 = OpLoad %int %top
+        %316 = OpISub %int %315 %int_1
+               OpStore %top %316
+        %317 = OpAccessChain %_ptr_Function_int %stack %315
+        %318 = OpLoad %int %317
+               OpStore %h_0 %318
+        %319 = OpLoad %int %top
+        %320 = OpISub %int %319 %int_1
+               OpStore %top %320
+        %321 = OpAccessChain %_ptr_Function_int %stack %319
+        %322 = OpLoad %int %321
+               OpStore %l_0 %322
+        %323 = OpLoad %int %l_0
+               OpStore %param_3 %323
+        %324 = OpLoad %int %h_0
+               OpStore %param_4 %324
+        %325 = OpFunctionCall %int %performPartition_i1_i1_ %param_3 %param_4
+               OpStore %p %325
+        %326 = OpLoad %int %p
+        %327 = OpISub %int %326 %int_1
+        %328 = OpLoad %int %l_0
+        %329 = OpSGreaterThan %bool %327 %328
+               OpSelectionMerge %330 None
+               OpBranchConditional %329 %331 %330
+        %331 = OpLabel
+        %332 = OpLoad %int %top
+        %333 = OpIAdd %int %332 %int_1
+               OpStore %top %333
+        %334 = OpLoad %int %l_0
+        %335 = OpAccessChain %_ptr_Function_int %stack %333
+               OpStore %335 %334
+        %336 = OpLoad %int %top
+        %337 = OpIAdd %int %336 %int_1
+               OpStore %top %337
+        %338 = OpLoad %int %p
+        %339 = OpISub %int %338 %int_1
+        %340 = OpAccessChain %_ptr_Function_int %stack %337
+               OpStore %340 %339
+               OpBranch %330
+        %330 = OpLabel
+        %341 = OpLoad %int %p
+        %342 = OpIAdd %int %341 %int_1
+        %343 = OpLoad %int %h_0
+        %344 = OpSLessThan %bool %342 %343
+               OpSelectionMerge %345 None
+               OpBranchConditional %344 %346 %345
+        %346 = OpLabel
+        %347 = OpLoad %int %top
+        %348 = OpIAdd %int %347 %int_1
+               OpStore %top %348
+        %349 = OpLoad %int %p
+        %350 = OpIAdd %int %349 %int_1
+        %351 = OpAccessChain %_ptr_Function_int %stack %348
+               OpStore %351 %350
+        %352 = OpLoad %int %top
+        %353 = OpIAdd %int %352 %int_1
+               OpStore %top %353
+        %354 = OpLoad %int %h_0
+        %355 = OpAccessChain %_ptr_Function_int %stack %353
+               OpStore %355 %354
+               OpBranch %345
+        %345 = OpLabel
+               OpBranch %310
+        %310 = OpLabel
+               OpBranch %308
+        %309 = OpLabel
+               OpReturn
+               OpFunctionEnd
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
new file mode 100644
index 0000000..7c36066
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-conditional-bitwise-or-clamp/1.spvasm.expected.hlsl
@@ -0,0 +1,232 @@
+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;
+  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);
+  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;
+  {
+    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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-conditional-bitwise-or-clamp/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-conditional-bitwise-or-clamp/1.spvasm.expected.msl
new file mode 100644
index 0000000..825cedb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-conditional-bitwise-or-clamp/1.spvasm.expected.msl
@@ -0,0 +1,280 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct QuicksortObject {
+  tint_array_wrapper numbers;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void swap_i1_i1_(thread int* const i, thread int* const j, thread QuicksortObject* const tint_symbol_5) {
+  int temp = 0;
+  int const x_230 = *(i);
+  int const x_232 = (*(tint_symbol_5)).numbers.arr[x_230];
+  temp = x_232;
+  int const x_233 = *(i);
+  int const x_234 = *(j);
+  int const x_236 = (*(tint_symbol_5)).numbers.arr[x_234];
+  (*(tint_symbol_5)).numbers.arr[x_233] = x_236;
+  int const x_238 = *(j);
+  int const x_239 = temp;
+  (*(tint_symbol_5)).numbers.arr[x_238] = x_239;
+  return;
+}
+
+int performPartition_i1_i1_(thread int* const l, thread int* const h, thread QuicksortObject* const tint_symbol_6) {
+  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;
+  int const x_242 = *(h);
+  int const x_244 = (*(tint_symbol_6)).numbers.arr[x_242];
+  pivot = x_244;
+  int const x_245 = *(l);
+  i_1 = (x_245 - 1);
+  int const x_247 = *(l);
+  j_1 = x_247;
+  while (true) {
+    int const x_252 = j_1;
+    int const x_253 = *(h);
+    if ((x_252 <= (x_253 - 1))) {
+    } else {
+      break;
+    }
+    int const x_257 = j_1;
+    int const x_259 = (*(tint_symbol_6)).numbers.arr[x_257];
+    int const x_260 = pivot;
+    if ((x_259 <= x_260)) {
+      int const x_264 = i_1;
+      i_1 = (x_264 + 1);
+      int const x_266 = i_1;
+      param = x_266;
+      int const x_267 = j_1;
+      param_1 = x_267;
+      swap_i1_i1_(&(param), &(param_1), tint_symbol_6);
+    }
+    {
+      int const x_269 = j_1;
+      j_1 = (x_269 + 1);
+    }
+  }
+  int const x_271 = i_1;
+  i_1 = (x_271 + 1);
+  int const x_273 = i_1;
+  param_2 = x_273;
+  int const x_274 = *(h);
+  param_3 = x_274;
+  swap_i1_i1_(&(param_2), &(param_3), tint_symbol_6);
+  int const x_276 = i_1;
+  return x_276;
+}
+
+void quicksort_(thread float4* const tint_symbol_7, thread QuicksortObject* const tint_symbol_8) {
+  int l_1 = 0;
+  int h_1 = 0;
+  int top = 0;
+  tint_array_wrapper stack = {};
+  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;
+  int const x_280 = top;
+  int const x_281 = (x_280 + 1);
+  top = x_281;
+  int const x_282 = l_1;
+  stack.arr[x_281] = x_282;
+  float const x_285 = (*(tint_symbol_7)).y;
+  if ((x_285 >= 0.0f)) {
+    int const x_290 = h_1;
+    if (false) {
+      x_279 = 1;
+    } else {
+      int const x_294 = h_1;
+      x_279 = (x_294 << as_type<uint>(0));
+    }
+    int const x_296 = x_279;
+    x_278 = (x_290 | x_296);
+  } else {
+    x_278 = 1;
+  }
+  int const x_298 = x_278;
+  int_a = x_298;
+  int const x_299 = h_1;
+  int const x_300 = h_1;
+  int const x_301 = int_a;
+  clamp_a = clamp(x_299, x_300, x_301);
+  int const x_303 = top;
+  int const x_304 = (x_303 + 1);
+  top = x_304;
+  int const x_305 = clamp_a;
+  stack.arr[x_304] = (x_305 / 1);
+  while (true) {
+    int const x_312 = top;
+    if ((x_312 >= 0)) {
+    } else {
+      break;
+    }
+    int const x_315 = top;
+    top = (x_315 - 1);
+    int const x_318 = stack.arr[x_315];
+    h_1 = x_318;
+    int const x_319 = top;
+    top = (x_319 - 1);
+    int const x_322 = stack.arr[x_319];
+    l_1 = x_322;
+    int const x_323 = l_1;
+    param_4 = x_323;
+    int const x_324 = h_1;
+    param_5 = x_324;
+    int const x_325 = performPartition_i1_i1_(&(param_4), &(param_5), tint_symbol_8);
+    p = x_325;
+    int const x_326 = p;
+    int const x_328 = l_1;
+    if (((x_326 - 1) > x_328)) {
+      int const x_332 = top;
+      int const x_333 = (x_332 + 1);
+      top = x_333;
+      int const x_334 = l_1;
+      stack.arr[x_333] = x_334;
+      int const x_336 = top;
+      int const x_337 = (x_336 + 1);
+      top = x_337;
+      int const x_338 = p;
+      stack.arr[x_337] = (x_338 - 1);
+    }
+    int const x_341 = p;
+    int const x_343 = h_1;
+    if (((x_341 + 1) < x_343)) {
+      int const x_347 = top;
+      int const x_348 = (x_347 + 1);
+      top = x_348;
+      int const x_349 = p;
+      stack.arr[x_348] = (x_349 + 1);
+      int const x_352 = top;
+      int const x_353 = (x_352 + 1);
+      top = x_353;
+      int const x_354 = h_1;
+      stack.arr[x_353] = x_354;
+    }
+  }
+  return;
+}
+
+void main_1(constant buf0& x_34, thread QuicksortObject* const tint_symbol_9, thread float4* const tint_symbol_10, thread float4* const tint_symbol_11) {
+  int i_2 = 0;
+  float2 uv = 0.0f;
+  float3 color = 0.0f;
+  i_2 = 0;
+  while (true) {
+    int const x_90 = i_2;
+    if ((x_90 < 10)) {
+    } else {
+      break;
+    }
+    int const x_93 = i_2;
+    int const x_94 = i_2;
+    (*(tint_symbol_9)).numbers.arr[x_93] = (10 - x_94);
+    int const x_97 = i_2;
+    int const x_98 = i_2;
+    int const x_100 = (*(tint_symbol_9)).numbers.arr[x_98];
+    int const x_101 = i_2;
+    int const x_103 = (*(tint_symbol_9)).numbers.arr[x_101];
+    (*(tint_symbol_9)).numbers.arr[x_97] = (x_100 * x_103);
+    {
+      int const x_106 = i_2;
+      i_2 = (x_106 + 1);
+    }
+  }
+  quicksort_(tint_symbol_10, tint_symbol_9);
+  float4 const x_109 = *(tint_symbol_10);
+  float2 const x_112 = x_34.resolution;
+  uv = (float2(x_109.x, x_109.y) / x_112);
+  color = float3(1.0f, 2.0f, 3.0f);
+  int const x_115 = (*(tint_symbol_9)).numbers.arr[0];
+  float const x_118 = color.x;
+  color.x = (x_118 + float(x_115));
+  float const x_122 = uv.x;
+  if ((x_122 > 0.25f)) {
+    int const x_127 = (*(tint_symbol_9)).numbers.arr[1];
+    float const x_130 = color.x;
+    color.x = (x_130 + float(x_127));
+  }
+  float const x_134 = uv.x;
+  if ((x_134 > 0.5f)) {
+    int const x_139 = (*(tint_symbol_9)).numbers.arr[2];
+    float const x_142 = color.y;
+    color.y = (x_142 + float(x_139));
+  }
+  float const x_146 = uv.x;
+  if ((x_146 > 0.75f)) {
+    int const x_151 = (*(tint_symbol_9)).numbers.arr[3];
+    float const x_154 = color.z;
+    color.z = (x_154 + float(x_151));
+  }
+  int const x_158 = (*(tint_symbol_9)).numbers.arr[4];
+  float const x_161 = color.y;
+  color.y = (x_161 + float(x_158));
+  float const x_165 = uv.y;
+  if ((x_165 > 0.25f)) {
+    int const x_170 = (*(tint_symbol_9)).numbers.arr[5];
+    float const x_173 = color.x;
+    color.x = (x_173 + float(x_170));
+  }
+  float const x_177 = uv.y;
+  if ((x_177 > 0.5f)) {
+    int const x_182 = (*(tint_symbol_9)).numbers.arr[6];
+    float const x_185 = color.y;
+    color.y = (x_185 + float(x_182));
+  }
+  float const x_189 = uv.y;
+  if ((x_189 > 0.75f)) {
+    int const x_194 = (*(tint_symbol_9)).numbers.arr[7];
+    float const x_197 = color.z;
+    color.z = (x_197 + float(x_194));
+  }
+  int const x_201 = (*(tint_symbol_9)).numbers.arr[8];
+  float const x_204 = color.z;
+  color.z = (x_204 + float(x_201));
+  float const x_208 = uv.x;
+  float const x_210 = uv.y;
+  if ((fabs((x_208 - x_210)) < 0.25f)) {
+    int const x_217 = (*(tint_symbol_9)).numbers.arr[9];
+    float const x_220 = color.x;
+    color.x = (x_220 + float(x_217));
+  }
+  float3 const x_223 = color;
+  float3 const x_224 = normalize(x_223);
+  *(tint_symbol_11) = float4(x_224.x, x_224.y, x_224.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_34 [[buffer(0)]]) {
+  thread float4 tint_symbol_12 = 0.0f;
+  thread QuicksortObject tint_symbol_13 = {};
+  thread float4 tint_symbol_14 = 0.0f;
+  tint_symbol_12 = gl_FragCoord_param;
+  main_1(x_34, &(tint_symbol_13), &(tint_symbol_12), &(tint_symbol_14));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_14};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-conditional-bitwise-or-clamp/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-conditional-bitwise-or-clamp/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..003a32d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-conditional-bitwise-or-clamp/1.spvasm.expected.spvasm
@@ -0,0 +1,587 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 402
+; Schema: 0
+               OpCapability Shader
+        %156 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %QuicksortObject "QuicksortObject"
+               OpMemberName %QuicksortObject 0 "numbers"
+               OpName %obj "obj"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_34 "x_34"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %swap_i1_i1_ "swap_i1_i1_"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %temp "temp"
+               OpName %performPartition_i1_i1_ "performPartition_i1_i1_"
+               OpName %l "l"
+               OpName %h "h"
+               OpName %pivot "pivot"
+               OpName %i_1 "i_1"
+               OpName %j_1 "j_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %quicksort_ "quicksort_"
+               OpName %l_1 "l_1"
+               OpName %h_1 "h_1"
+               OpName %top "top"
+               OpName %stack "stack"
+               OpName %int_a "int_a"
+               OpName %x_278 "x_278"
+               OpName %x_279 "x_279"
+               OpName %clamp_a "clamp_a"
+               OpName %p "p"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpName %main_1 "main_1"
+               OpName %i_2 "i_2"
+               OpName %uv "uv"
+               OpName %color "color"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpMemberDecorate %QuicksortObject 0 Offset 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_34 NonWritable
+               OpDecorate %x_34 DescriptorSet 0
+               OpDecorate %x_34 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%QuicksortObject = OpTypeStruct %_arr_int_uint_10
+%_ptr_Private_QuicksortObject = OpTypePointer Private %QuicksortObject
+          %8 = OpConstantNull %QuicksortObject
+        %obj = OpVariable %_ptr_Private_QuicksortObject Private %8
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %13 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %13
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_34 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %13
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %13
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+         %31 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_int = OpTypePointer Private %int
+         %49 = OpTypeFunction %int %_ptr_Function_int %_ptr_Function_int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+        %109 = OpTypeFunction %void
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+        %117 = OpConstantNull %_arr_int_uint_10
+      %int_0 = OpConstant %int 0
+      %int_9 = OpConstant %int 9
+     %int_n1 = OpConstant %int -1
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+      %false = OpConstantFalse %bool
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+        %219 = OpConstantNull %v2float
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+        %223 = OpConstantNull %v3float
+     %int_10 = OpConstant %int 10
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+        %261 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+%_ptr_Function_float = OpTypePointer Function %float
+ %float_0_25 = OpConstant %float 0.25
+  %float_0_5 = OpConstant %float 0.5
+      %int_2 = OpConstant %int 2
+ %float_0_75 = OpConstant %float 0.75
+      %int_3 = OpConstant %int 3
+     %uint_2 = OpConstant %uint 2
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+   %main_out = OpTypeStruct %v4float
+        %389 = OpTypeFunction %void %main_out
+%swap_i1_i1_ = OpFunction %void None %23
+          %i = OpFunctionParameter %_ptr_Function_int
+          %j = OpFunctionParameter %_ptr_Function_int
+         %29 = OpLabel
+       %temp = OpVariable %_ptr_Function_int Function %31
+         %33 = OpLoad %int %i
+         %36 = OpAccessChain %_ptr_Private_int %obj %uint_0 %33
+         %37 = OpLoad %int %36
+               OpStore %temp %37
+         %39 = OpLoad %int %i
+         %41 = OpLoad %int %j
+         %42 = OpAccessChain %_ptr_Private_int %obj %uint_0 %41
+         %43 = OpLoad %int %42
+         %44 = OpAccessChain %_ptr_Private_int %obj %uint_0 %39
+               OpStore %44 %43
+         %46 = OpLoad %int %j
+         %47 = OpLoad %int %temp
+         %48 = OpAccessChain %_ptr_Private_int %obj %uint_0 %46
+               OpStore %48 %47
+               OpReturn
+               OpFunctionEnd
+%performPartition_i1_i1_ = OpFunction %int None %49
+          %l = OpFunctionParameter %_ptr_Function_int
+          %h = OpFunctionParameter %_ptr_Function_int
+         %53 = OpLabel
+      %pivot = OpVariable %_ptr_Function_int Function %31
+        %i_1 = OpVariable %_ptr_Function_int Function %31
+        %j_1 = OpVariable %_ptr_Function_int Function %31
+      %param = OpVariable %_ptr_Function_int Function %31
+    %param_1 = OpVariable %_ptr_Function_int Function %31
+    %param_2 = OpVariable %_ptr_Function_int Function %31
+    %param_3 = OpVariable %_ptr_Function_int Function %31
+         %62 = OpLoad %int %h
+         %63 = OpAccessChain %_ptr_Private_int %obj %uint_0 %62
+         %64 = OpLoad %int %63
+               OpStore %pivot %64
+         %66 = OpLoad %int %l
+         %68 = OpISub %int %66 %int_1
+               OpStore %i_1 %68
+         %70 = OpLoad %int %l
+               OpStore %j_1 %70
+               OpBranch %71
+         %71 = OpLabel
+               OpLoopMerge %72 %73 None
+               OpBranch %74
+         %74 = OpLabel
+         %75 = OpLoad %int %j_1
+         %77 = OpLoad %int %h
+         %78 = OpISub %int %77 %int_1
+         %79 = OpSLessThanEqual %bool %75 %78
+               OpSelectionMerge %81 None
+               OpBranchConditional %79 %82 %83
+         %82 = OpLabel
+               OpBranch %81
+         %83 = OpLabel
+               OpBranch %72
+         %81 = OpLabel
+         %84 = OpLoad %int %j_1
+         %85 = OpAccessChain %_ptr_Private_int %obj %uint_0 %84
+         %86 = OpLoad %int %85
+         %87 = OpLoad %int %pivot
+         %88 = OpSLessThanEqual %bool %86 %87
+               OpSelectionMerge %89 None
+               OpBranchConditional %88 %90 %89
+         %90 = OpLabel
+         %91 = OpLoad %int %i_1
+         %92 = OpIAdd %int %91 %int_1
+               OpStore %i_1 %92
+         %93 = OpLoad %int %i_1
+               OpStore %param %93
+         %94 = OpLoad %int %j_1
+               OpStore %param_1 %94
+         %95 = OpFunctionCall %void %swap_i1_i1_ %param %param_1
+               OpBranch %89
+         %89 = OpLabel
+               OpBranch %73
+         %73 = OpLabel
+         %98 = OpLoad %int %j_1
+         %99 = OpIAdd %int %98 %int_1
+               OpStore %j_1 %99
+               OpBranch %71
+         %72 = OpLabel
+        %100 = OpLoad %int %i_1
+        %101 = OpIAdd %int %100 %int_1
+               OpStore %i_1 %101
+        %102 = OpLoad %int %i_1
+               OpStore %param_2 %102
+        %104 = OpLoad %int %h
+               OpStore %param_3 %104
+        %105 = OpFunctionCall %void %swap_i1_i1_ %param_2 %param_3
+        %108 = OpLoad %int %i_1
+               OpReturnValue %108
+               OpFunctionEnd
+ %quicksort_ = OpFunction %void None %109
+        %111 = OpLabel
+        %l_1 = OpVariable %_ptr_Function_int Function %31
+        %h_1 = OpVariable %_ptr_Function_int Function %31
+        %top = OpVariable %_ptr_Function_int Function %31
+      %stack = OpVariable %_ptr_Function__arr_int_uint_10 Function %117
+      %int_a = OpVariable %_ptr_Function_int Function %31
+      %x_278 = OpVariable %_ptr_Function_int Function %31
+      %x_279 = OpVariable %_ptr_Function_int Function %31
+    %clamp_a = OpVariable %_ptr_Function_int Function %31
+          %p = OpVariable %_ptr_Function_int Function %31
+    %param_4 = OpVariable %_ptr_Function_int Function %31
+    %param_5 = OpVariable %_ptr_Function_int Function %31
+               OpStore %l_1 %int_0
+               OpStore %h_1 %int_9
+               OpStore %top %int_n1
+        %128 = OpLoad %int %top
+        %129 = OpIAdd %int %128 %int_1
+               OpStore %top %129
+        %130 = OpLoad %int %l_1
+        %131 = OpAccessChain %_ptr_Function_int %stack %129
+               OpStore %131 %130
+        %134 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %135 = OpLoad %float %134
+        %137 = OpFOrdGreaterThanEqual %bool %135 %float_0
+               OpSelectionMerge %138 None
+               OpBranchConditional %137 %139 %140
+        %139 = OpLabel
+        %141 = OpLoad %int %h_1
+               OpSelectionMerge %143 None
+               OpBranchConditional %false %144 %145
+        %144 = OpLabel
+               OpStore %x_279 %int_1
+               OpBranch %143
+        %145 = OpLabel
+        %146 = OpLoad %int %h_1
+        %147 = OpBitcast %uint %int_0
+        %148 = OpShiftLeftLogical %int %146 %147
+               OpStore %x_279 %148
+               OpBranch %143
+        %143 = OpLabel
+        %149 = OpLoad %int %x_279
+        %150 = OpBitwiseOr %int %141 %149
+               OpStore %x_278 %150
+               OpBranch %138
+        %140 = OpLabel
+               OpStore %x_278 %int_1
+               OpBranch %138
+        %138 = OpLabel
+        %151 = OpLoad %int %x_278
+               OpStore %int_a %151
+        %152 = OpLoad %int %h_1
+        %153 = OpLoad %int %h_1
+        %154 = OpLoad %int %int_a
+        %155 = OpExtInst %int %156 SClamp %152 %153 %154
+               OpStore %clamp_a %155
+        %157 = OpLoad %int %top
+        %158 = OpIAdd %int %157 %int_1
+               OpStore %top %158
+        %159 = OpLoad %int %clamp_a
+        %160 = OpAccessChain %_ptr_Function_int %stack %158
+        %161 = OpSDiv %int %159 %int_1
+               OpStore %160 %161
+               OpBranch %162
+        %162 = OpLabel
+               OpLoopMerge %163 %164 None
+               OpBranch %165
+        %165 = OpLabel
+        %166 = OpLoad %int %top
+        %167 = OpSGreaterThanEqual %bool %166 %int_0
+               OpSelectionMerge %168 None
+               OpBranchConditional %167 %169 %170
+        %169 = OpLabel
+               OpBranch %168
+        %170 = OpLabel
+               OpBranch %163
+        %168 = OpLabel
+        %171 = OpLoad %int %top
+        %172 = OpISub %int %171 %int_1
+               OpStore %top %172
+        %173 = OpAccessChain %_ptr_Function_int %stack %171
+        %174 = OpLoad %int %173
+               OpStore %h_1 %174
+        %175 = OpLoad %int %top
+        %176 = OpISub %int %175 %int_1
+               OpStore %top %176
+        %177 = OpAccessChain %_ptr_Function_int %stack %175
+        %178 = OpLoad %int %177
+               OpStore %l_1 %178
+        %179 = OpLoad %int %l_1
+               OpStore %param_4 %179
+        %180 = OpLoad %int %h_1
+               OpStore %param_5 %180
+        %181 = OpFunctionCall %int %performPartition_i1_i1_ %param_4 %param_5
+               OpStore %p %181
+        %184 = OpLoad %int %p
+        %185 = OpLoad %int %l_1
+        %186 = OpISub %int %184 %int_1
+        %187 = OpSGreaterThan %bool %186 %185
+               OpSelectionMerge %188 None
+               OpBranchConditional %187 %189 %188
+        %189 = OpLabel
+        %190 = OpLoad %int %top
+        %191 = OpIAdd %int %190 %int_1
+               OpStore %top %191
+        %192 = OpLoad %int %l_1
+        %193 = OpAccessChain %_ptr_Function_int %stack %191
+               OpStore %193 %192
+        %194 = OpLoad %int %top
+        %195 = OpIAdd %int %194 %int_1
+               OpStore %top %195
+        %196 = OpLoad %int %p
+        %197 = OpAccessChain %_ptr_Function_int %stack %195
+        %198 = OpISub %int %196 %int_1
+               OpStore %197 %198
+               OpBranch %188
+        %188 = OpLabel
+        %199 = OpLoad %int %p
+        %200 = OpLoad %int %h_1
+        %201 = OpIAdd %int %199 %int_1
+        %202 = OpSLessThan %bool %201 %200
+               OpSelectionMerge %203 None
+               OpBranchConditional %202 %204 %203
+        %204 = OpLabel
+        %205 = OpLoad %int %top
+        %206 = OpIAdd %int %205 %int_1
+               OpStore %top %206
+        %207 = OpLoad %int %p
+        %208 = OpAccessChain %_ptr_Function_int %stack %206
+        %209 = OpIAdd %int %207 %int_1
+               OpStore %208 %209
+        %210 = OpLoad %int %top
+        %211 = OpIAdd %int %210 %int_1
+               OpStore %top %211
+        %212 = OpLoad %int %h_1
+        %213 = OpAccessChain %_ptr_Function_int %stack %211
+               OpStore %213 %212
+               OpBranch %203
+        %203 = OpLabel
+               OpBranch %164
+        %164 = OpLabel
+               OpBranch %162
+        %163 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %109
+        %215 = OpLabel
+        %i_2 = OpVariable %_ptr_Function_int Function %31
+         %uv = OpVariable %_ptr_Function_v2float Function %219
+      %color = OpVariable %_ptr_Function_v3float Function %223
+               OpStore %i_2 %int_0
+               OpBranch %224
+        %224 = OpLabel
+               OpLoopMerge %225 %226 None
+               OpBranch %227
+        %227 = OpLabel
+        %228 = OpLoad %int %i_2
+        %230 = OpSLessThan %bool %228 %int_10
+               OpSelectionMerge %231 None
+               OpBranchConditional %230 %232 %233
+        %232 = OpLabel
+               OpBranch %231
+        %233 = OpLabel
+               OpBranch %225
+        %231 = OpLabel
+        %234 = OpLoad %int %i_2
+        %235 = OpLoad %int %i_2
+        %236 = OpAccessChain %_ptr_Private_int %obj %uint_0 %234
+        %237 = OpISub %int %int_10 %235
+               OpStore %236 %237
+        %238 = OpLoad %int %i_2
+        %239 = OpLoad %int %i_2
+        %240 = OpAccessChain %_ptr_Private_int %obj %uint_0 %239
+        %241 = OpLoad %int %240
+        %242 = OpLoad %int %i_2
+        %243 = OpAccessChain %_ptr_Private_int %obj %uint_0 %242
+        %244 = OpLoad %int %243
+        %245 = OpAccessChain %_ptr_Private_int %obj %uint_0 %238
+        %246 = OpIMul %int %241 %244
+               OpStore %245 %246
+               OpBranch %226
+        %226 = OpLabel
+        %247 = OpLoad %int %i_2
+        %248 = OpIAdd %int %247 %int_1
+               OpStore %i_2 %248
+               OpBranch %224
+        %225 = OpLabel
+        %249 = OpFunctionCall %void %quicksort_
+        %250 = OpLoad %v4float %gl_FragCoord
+        %252 = OpAccessChain %_ptr_Uniform_v2float %x_34 %uint_0
+        %253 = OpLoad %v2float %252
+        %254 = OpCompositeExtract %float %250 0
+        %255 = OpCompositeExtract %float %250 1
+        %256 = OpCompositeConstruct %v2float %254 %255
+        %257 = OpFDiv %v2float %256 %253
+               OpStore %uv %257
+               OpStore %color %261
+        %262 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_0
+        %263 = OpLoad %int %262
+        %265 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %266 = OpLoad %float %265
+        %267 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %268 = OpConvertSToF %float %263
+        %269 = OpFAdd %float %266 %268
+               OpStore %267 %269
+        %270 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %271 = OpLoad %float %270
+        %273 = OpFOrdGreaterThan %bool %271 %float_0_25
+               OpSelectionMerge %274 None
+               OpBranchConditional %273 %275 %274
+        %275 = OpLabel
+        %276 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_1
+        %277 = OpLoad %int %276
+        %278 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %279 = OpLoad %float %278
+        %280 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %281 = OpConvertSToF %float %277
+        %282 = OpFAdd %float %279 %281
+               OpStore %280 %282
+               OpBranch %274
+        %274 = OpLabel
+        %283 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %284 = OpLoad %float %283
+        %286 = OpFOrdGreaterThan %bool %284 %float_0_5
+               OpSelectionMerge %287 None
+               OpBranchConditional %286 %288 %287
+        %288 = OpLabel
+        %290 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_2
+        %291 = OpLoad %int %290
+        %292 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %293 = OpLoad %float %292
+        %294 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %295 = OpConvertSToF %float %291
+        %296 = OpFAdd %float %293 %295
+               OpStore %294 %296
+               OpBranch %287
+        %287 = OpLabel
+        %297 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %298 = OpLoad %float %297
+        %300 = OpFOrdGreaterThan %bool %298 %float_0_75
+               OpSelectionMerge %301 None
+               OpBranchConditional %300 %302 %301
+        %302 = OpLabel
+        %304 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_3
+        %305 = OpLoad %int %304
+        %307 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %308 = OpLoad %float %307
+        %309 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %310 = OpConvertSToF %float %305
+        %311 = OpFAdd %float %308 %310
+               OpStore %309 %311
+               OpBranch %301
+        %301 = OpLabel
+        %313 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_4
+        %314 = OpLoad %int %313
+        %315 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %316 = OpLoad %float %315
+        %317 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %318 = OpConvertSToF %float %314
+        %319 = OpFAdd %float %316 %318
+               OpStore %317 %319
+        %320 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %321 = OpLoad %float %320
+        %322 = OpFOrdGreaterThan %bool %321 %float_0_25
+               OpSelectionMerge %323 None
+               OpBranchConditional %322 %324 %323
+        %324 = OpLabel
+        %326 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_5
+        %327 = OpLoad %int %326
+        %328 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %329 = OpLoad %float %328
+        %330 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %331 = OpConvertSToF %float %327
+        %332 = OpFAdd %float %329 %331
+               OpStore %330 %332
+               OpBranch %323
+        %323 = OpLabel
+        %333 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %334 = OpLoad %float %333
+        %335 = OpFOrdGreaterThan %bool %334 %float_0_5
+               OpSelectionMerge %336 None
+               OpBranchConditional %335 %337 %336
+        %337 = OpLabel
+        %339 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_6
+        %340 = OpLoad %int %339
+        %341 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %342 = OpLoad %float %341
+        %343 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %344 = OpConvertSToF %float %340
+        %345 = OpFAdd %float %342 %344
+               OpStore %343 %345
+               OpBranch %336
+        %336 = OpLabel
+        %346 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %347 = OpLoad %float %346
+        %348 = OpFOrdGreaterThan %bool %347 %float_0_75
+               OpSelectionMerge %349 None
+               OpBranchConditional %348 %350 %349
+        %350 = OpLabel
+        %352 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_7
+        %353 = OpLoad %int %352
+        %354 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %355 = OpLoad %float %354
+        %356 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %357 = OpConvertSToF %float %353
+        %358 = OpFAdd %float %355 %357
+               OpStore %356 %358
+               OpBranch %349
+        %349 = OpLabel
+        %360 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_8
+        %361 = OpLoad %int %360
+        %362 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %363 = OpLoad %float %362
+        %364 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %365 = OpConvertSToF %float %361
+        %366 = OpFAdd %float %363 %365
+               OpStore %364 %366
+        %367 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %368 = OpLoad %float %367
+        %369 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %370 = OpLoad %float %369
+        %372 = OpFSub %float %368 %370
+        %371 = OpExtInst %float %156 FAbs %372
+        %373 = OpFOrdLessThan %bool %371 %float_0_25
+               OpSelectionMerge %374 None
+               OpBranchConditional %373 %375 %374
+        %375 = OpLabel
+        %376 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_9
+        %377 = OpLoad %int %376
+        %378 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %379 = OpLoad %float %378
+        %380 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %381 = OpConvertSToF %float %377
+        %382 = OpFAdd %float %379 %381
+               OpStore %380 %382
+               OpBranch %374
+        %374 = OpLabel
+        %383 = OpLoad %v3float %color
+        %384 = OpExtInst %v3float %156 Normalize %383
+        %385 = OpCompositeExtract %float %384 0
+        %386 = OpCompositeExtract %float %384 1
+        %387 = OpCompositeExtract %float %384 2
+        %388 = OpCompositeConstruct %v4float %385 %386 %387 %float_1
+               OpStore %x_GLF_color %388
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %389
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %393 = OpLabel
+        %394 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %394
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %109
+        %396 = OpLabel
+        %397 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %397
+        %398 = OpFunctionCall %void %main_1
+        %400 = OpLoad %v4float %x_GLF_color
+        %401 = OpCompositeConstruct %main_out %400
+        %399 = OpFunctionCall %void %tint_symbol_3 %401
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-conditional-bitwise-or-clamp/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-conditional-bitwise-or-clamp/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..68052db
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-conditional-bitwise-or-clamp/1.spvasm.expected.wgsl
@@ -0,0 +1,280 @@
+struct QuicksortObject {
+  numbers : array<i32, 10>;
+};
+
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> obj : QuicksortObject;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_34 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn swap_i1_i1_(i : ptr<function, i32>, j : ptr<function, i32>) {
+  var temp : i32;
+  let x_230 : i32 = *(i);
+  let x_232 : i32 = obj.numbers[x_230];
+  temp = x_232;
+  let x_233 : i32 = *(i);
+  let x_234 : i32 = *(j);
+  let x_236 : i32 = obj.numbers[x_234];
+  obj.numbers[x_233] = x_236;
+  let x_238 : i32 = *(j);
+  let x_239 : i32 = temp;
+  obj.numbers[x_238] = x_239;
+  return;
+}
+
+fn performPartition_i1_i1_(l : ptr<function, i32>, h : ptr<function, i32>) -> i32 {
+  var pivot : i32;
+  var i_1 : i32;
+  var j_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  var param_3 : i32;
+  let x_242 : i32 = *(h);
+  let x_244 : i32 = obj.numbers[x_242];
+  pivot = x_244;
+  let x_245 : i32 = *(l);
+  i_1 = (x_245 - 1);
+  let x_247 : i32 = *(l);
+  j_1 = x_247;
+  loop {
+    let x_252 : i32 = j_1;
+    let x_253 : i32 = *(h);
+    if ((x_252 <= (x_253 - 1))) {
+    } else {
+      break;
+    }
+    let x_257 : i32 = j_1;
+    let x_259 : i32 = obj.numbers[x_257];
+    let x_260 : i32 = pivot;
+    if ((x_259 <= x_260)) {
+      let x_264 : i32 = i_1;
+      i_1 = (x_264 + 1);
+      let x_266 : i32 = i_1;
+      param = x_266;
+      let x_267 : i32 = j_1;
+      param_1 = x_267;
+      swap_i1_i1_(&(param), &(param_1));
+    }
+
+    continuing {
+      let x_269 : i32 = j_1;
+      j_1 = (x_269 + 1);
+    }
+  }
+  let x_271 : i32 = i_1;
+  i_1 = (x_271 + 1);
+  let x_273 : i32 = i_1;
+  param_2 = x_273;
+  let x_274 : i32 = *(h);
+  param_3 = x_274;
+  swap_i1_i1_(&(param_2), &(param_3));
+  let x_276 : i32 = i_1;
+  return x_276;
+}
+
+fn quicksort_() {
+  var l_1 : i32;
+  var h_1 : i32;
+  var top : i32;
+  var stack : array<i32, 10>;
+  var int_a : i32;
+  var x_278 : i32;
+  var x_279 : i32;
+  var clamp_a : i32;
+  var p : i32;
+  var param_4 : i32;
+  var param_5 : i32;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  let x_280 : i32 = top;
+  let x_281 : i32 = (x_280 + 1);
+  top = x_281;
+  let x_282 : i32 = l_1;
+  stack[x_281] = x_282;
+  let x_285 : f32 = gl_FragCoord.y;
+  if ((x_285 >= 0.0)) {
+    let x_290 : i32 = h_1;
+    if (false) {
+      x_279 = 1;
+    } else {
+      let x_294 : i32 = h_1;
+      x_279 = (x_294 << bitcast<u32>(0));
+    }
+    let x_296 : i32 = x_279;
+    x_278 = (x_290 | x_296);
+  } else {
+    x_278 = 1;
+  }
+  let x_298 : i32 = x_278;
+  int_a = x_298;
+  let x_299 : i32 = h_1;
+  let x_300 : i32 = h_1;
+  let x_301 : i32 = int_a;
+  clamp_a = clamp(x_299, x_300, x_301);
+  let x_303 : i32 = top;
+  let x_304 : i32 = (x_303 + 1);
+  top = x_304;
+  let x_305 : i32 = clamp_a;
+  stack[x_304] = (x_305 / 1);
+  loop {
+    let x_312 : i32 = top;
+    if ((x_312 >= 0)) {
+    } else {
+      break;
+    }
+    let x_315 : i32 = top;
+    top = (x_315 - 1);
+    let x_318 : i32 = stack[x_315];
+    h_1 = x_318;
+    let x_319 : i32 = top;
+    top = (x_319 - 1);
+    let x_322 : i32 = stack[x_319];
+    l_1 = x_322;
+    let x_323 : i32 = l_1;
+    param_4 = x_323;
+    let x_324 : i32 = h_1;
+    param_5 = x_324;
+    let x_325 : i32 = performPartition_i1_i1_(&(param_4), &(param_5));
+    p = x_325;
+    let x_326 : i32 = p;
+    let x_328 : i32 = l_1;
+    if (((x_326 - 1) > x_328)) {
+      let x_332 : i32 = top;
+      let x_333 : i32 = (x_332 + 1);
+      top = x_333;
+      let x_334 : i32 = l_1;
+      stack[x_333] = x_334;
+      let x_336 : i32 = top;
+      let x_337 : i32 = (x_336 + 1);
+      top = x_337;
+      let x_338 : i32 = p;
+      stack[x_337] = (x_338 - 1);
+    }
+    let x_341 : i32 = p;
+    let x_343 : i32 = h_1;
+    if (((x_341 + 1) < x_343)) {
+      let x_347 : i32 = top;
+      let x_348 : i32 = (x_347 + 1);
+      top = x_348;
+      let x_349 : i32 = p;
+      stack[x_348] = (x_349 + 1);
+      let x_352 : i32 = top;
+      let x_353 : i32 = (x_352 + 1);
+      top = x_353;
+      let x_354 : i32 = h_1;
+      stack[x_353] = x_354;
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_2 : i32;
+  var uv : vec2<f32>;
+  var color : vec3<f32>;
+  i_2 = 0;
+  loop {
+    let x_90 : i32 = i_2;
+    if ((x_90 < 10)) {
+    } else {
+      break;
+    }
+    let x_93 : i32 = i_2;
+    let x_94 : i32 = i_2;
+    obj.numbers[x_93] = (10 - x_94);
+    let x_97 : i32 = i_2;
+    let x_98 : i32 = i_2;
+    let x_100 : i32 = obj.numbers[x_98];
+    let x_101 : i32 = i_2;
+    let x_103 : i32 = obj.numbers[x_101];
+    obj.numbers[x_97] = (x_100 * x_103);
+
+    continuing {
+      let x_106 : i32 = i_2;
+      i_2 = (x_106 + 1);
+    }
+  }
+  quicksort_();
+  let x_109 : vec4<f32> = gl_FragCoord;
+  let x_112 : vec2<f32> = x_34.resolution;
+  uv = (vec2<f32>(x_109.x, x_109.y) / x_112);
+  color = vec3<f32>(1.0, 2.0, 3.0);
+  let x_115 : i32 = obj.numbers[0];
+  let x_118 : f32 = color.x;
+  color.x = (x_118 + f32(x_115));
+  let x_122 : f32 = uv.x;
+  if ((x_122 > 0.25)) {
+    let x_127 : i32 = obj.numbers[1];
+    let x_130 : f32 = color.x;
+    color.x = (x_130 + f32(x_127));
+  }
+  let x_134 : f32 = uv.x;
+  if ((x_134 > 0.5)) {
+    let x_139 : i32 = obj.numbers[2];
+    let x_142 : f32 = color.y;
+    color.y = (x_142 + f32(x_139));
+  }
+  let x_146 : f32 = uv.x;
+  if ((x_146 > 0.75)) {
+    let x_151 : i32 = obj.numbers[3];
+    let x_154 : f32 = color.z;
+    color.z = (x_154 + f32(x_151));
+  }
+  let x_158 : i32 = obj.numbers[4];
+  let x_161 : f32 = color.y;
+  color.y = (x_161 + f32(x_158));
+  let x_165 : f32 = uv.y;
+  if ((x_165 > 0.25)) {
+    let x_170 : i32 = obj.numbers[5];
+    let x_173 : f32 = color.x;
+    color.x = (x_173 + f32(x_170));
+  }
+  let x_177 : f32 = uv.y;
+  if ((x_177 > 0.5)) {
+    let x_182 : i32 = obj.numbers[6];
+    let x_185 : f32 = color.y;
+    color.y = (x_185 + f32(x_182));
+  }
+  let x_189 : f32 = uv.y;
+  if ((x_189 > 0.75)) {
+    let x_194 : i32 = obj.numbers[7];
+    let x_197 : f32 = color.z;
+    color.z = (x_197 + f32(x_194));
+  }
+  let x_201 : i32 = obj.numbers[8];
+  let x_204 : f32 = color.z;
+  color.z = (x_204 + f32(x_201));
+  let x_208 : f32 = uv.x;
+  let x_210 : f32 = uv.y;
+  if ((abs((x_208 - x_210)) < 0.25)) {
+    let x_217 : i32 = obj.numbers[9];
+    let x_220 : f32 = color.x;
+    color.x = (x_220 + f32(x_217));
+  }
+  let x_223 : vec3<f32> = color;
+  let x_224 : vec3<f32> = normalize(x_223);
+  x_GLF_color = vec4<f32>(x_224.x, x_224.y, x_224.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-conditional-bitwise-or-clamp/1.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-conditional-bitwise-or-clamp/1.wgsl
new file mode 100644
index 0000000..68052db
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-conditional-bitwise-or-clamp/1.wgsl
@@ -0,0 +1,280 @@
+struct QuicksortObject {
+  numbers : array<i32, 10>;
+};
+
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> obj : QuicksortObject;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_34 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn swap_i1_i1_(i : ptr<function, i32>, j : ptr<function, i32>) {
+  var temp : i32;
+  let x_230 : i32 = *(i);
+  let x_232 : i32 = obj.numbers[x_230];
+  temp = x_232;
+  let x_233 : i32 = *(i);
+  let x_234 : i32 = *(j);
+  let x_236 : i32 = obj.numbers[x_234];
+  obj.numbers[x_233] = x_236;
+  let x_238 : i32 = *(j);
+  let x_239 : i32 = temp;
+  obj.numbers[x_238] = x_239;
+  return;
+}
+
+fn performPartition_i1_i1_(l : ptr<function, i32>, h : ptr<function, i32>) -> i32 {
+  var pivot : i32;
+  var i_1 : i32;
+  var j_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  var param_3 : i32;
+  let x_242 : i32 = *(h);
+  let x_244 : i32 = obj.numbers[x_242];
+  pivot = x_244;
+  let x_245 : i32 = *(l);
+  i_1 = (x_245 - 1);
+  let x_247 : i32 = *(l);
+  j_1 = x_247;
+  loop {
+    let x_252 : i32 = j_1;
+    let x_253 : i32 = *(h);
+    if ((x_252 <= (x_253 - 1))) {
+    } else {
+      break;
+    }
+    let x_257 : i32 = j_1;
+    let x_259 : i32 = obj.numbers[x_257];
+    let x_260 : i32 = pivot;
+    if ((x_259 <= x_260)) {
+      let x_264 : i32 = i_1;
+      i_1 = (x_264 + 1);
+      let x_266 : i32 = i_1;
+      param = x_266;
+      let x_267 : i32 = j_1;
+      param_1 = x_267;
+      swap_i1_i1_(&(param), &(param_1));
+    }
+
+    continuing {
+      let x_269 : i32 = j_1;
+      j_1 = (x_269 + 1);
+    }
+  }
+  let x_271 : i32 = i_1;
+  i_1 = (x_271 + 1);
+  let x_273 : i32 = i_1;
+  param_2 = x_273;
+  let x_274 : i32 = *(h);
+  param_3 = x_274;
+  swap_i1_i1_(&(param_2), &(param_3));
+  let x_276 : i32 = i_1;
+  return x_276;
+}
+
+fn quicksort_() {
+  var l_1 : i32;
+  var h_1 : i32;
+  var top : i32;
+  var stack : array<i32, 10>;
+  var int_a : i32;
+  var x_278 : i32;
+  var x_279 : i32;
+  var clamp_a : i32;
+  var p : i32;
+  var param_4 : i32;
+  var param_5 : i32;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  let x_280 : i32 = top;
+  let x_281 : i32 = (x_280 + 1);
+  top = x_281;
+  let x_282 : i32 = l_1;
+  stack[x_281] = x_282;
+  let x_285 : f32 = gl_FragCoord.y;
+  if ((x_285 >= 0.0)) {
+    let x_290 : i32 = h_1;
+    if (false) {
+      x_279 = 1;
+    } else {
+      let x_294 : i32 = h_1;
+      x_279 = (x_294 << bitcast<u32>(0));
+    }
+    let x_296 : i32 = x_279;
+    x_278 = (x_290 | x_296);
+  } else {
+    x_278 = 1;
+  }
+  let x_298 : i32 = x_278;
+  int_a = x_298;
+  let x_299 : i32 = h_1;
+  let x_300 : i32 = h_1;
+  let x_301 : i32 = int_a;
+  clamp_a = clamp(x_299, x_300, x_301);
+  let x_303 : i32 = top;
+  let x_304 : i32 = (x_303 + 1);
+  top = x_304;
+  let x_305 : i32 = clamp_a;
+  stack[x_304] = (x_305 / 1);
+  loop {
+    let x_312 : i32 = top;
+    if ((x_312 >= 0)) {
+    } else {
+      break;
+    }
+    let x_315 : i32 = top;
+    top = (x_315 - 1);
+    let x_318 : i32 = stack[x_315];
+    h_1 = x_318;
+    let x_319 : i32 = top;
+    top = (x_319 - 1);
+    let x_322 : i32 = stack[x_319];
+    l_1 = x_322;
+    let x_323 : i32 = l_1;
+    param_4 = x_323;
+    let x_324 : i32 = h_1;
+    param_5 = x_324;
+    let x_325 : i32 = performPartition_i1_i1_(&(param_4), &(param_5));
+    p = x_325;
+    let x_326 : i32 = p;
+    let x_328 : i32 = l_1;
+    if (((x_326 - 1) > x_328)) {
+      let x_332 : i32 = top;
+      let x_333 : i32 = (x_332 + 1);
+      top = x_333;
+      let x_334 : i32 = l_1;
+      stack[x_333] = x_334;
+      let x_336 : i32 = top;
+      let x_337 : i32 = (x_336 + 1);
+      top = x_337;
+      let x_338 : i32 = p;
+      stack[x_337] = (x_338 - 1);
+    }
+    let x_341 : i32 = p;
+    let x_343 : i32 = h_1;
+    if (((x_341 + 1) < x_343)) {
+      let x_347 : i32 = top;
+      let x_348 : i32 = (x_347 + 1);
+      top = x_348;
+      let x_349 : i32 = p;
+      stack[x_348] = (x_349 + 1);
+      let x_352 : i32 = top;
+      let x_353 : i32 = (x_352 + 1);
+      top = x_353;
+      let x_354 : i32 = h_1;
+      stack[x_353] = x_354;
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_2 : i32;
+  var uv : vec2<f32>;
+  var color : vec3<f32>;
+  i_2 = 0;
+  loop {
+    let x_90 : i32 = i_2;
+    if ((x_90 < 10)) {
+    } else {
+      break;
+    }
+    let x_93 : i32 = i_2;
+    let x_94 : i32 = i_2;
+    obj.numbers[x_93] = (10 - x_94);
+    let x_97 : i32 = i_2;
+    let x_98 : i32 = i_2;
+    let x_100 : i32 = obj.numbers[x_98];
+    let x_101 : i32 = i_2;
+    let x_103 : i32 = obj.numbers[x_101];
+    obj.numbers[x_97] = (x_100 * x_103);
+
+    continuing {
+      let x_106 : i32 = i_2;
+      i_2 = (x_106 + 1);
+    }
+  }
+  quicksort_();
+  let x_109 : vec4<f32> = gl_FragCoord;
+  let x_112 : vec2<f32> = x_34.resolution;
+  uv = (vec2<f32>(x_109.x, x_109.y) / x_112);
+  color = vec3<f32>(1.0, 2.0, 3.0);
+  let x_115 : i32 = obj.numbers[0];
+  let x_118 : f32 = color.x;
+  color.x = (x_118 + f32(x_115));
+  let x_122 : f32 = uv.x;
+  if ((x_122 > 0.25)) {
+    let x_127 : i32 = obj.numbers[1];
+    let x_130 : f32 = color.x;
+    color.x = (x_130 + f32(x_127));
+  }
+  let x_134 : f32 = uv.x;
+  if ((x_134 > 0.5)) {
+    let x_139 : i32 = obj.numbers[2];
+    let x_142 : f32 = color.y;
+    color.y = (x_142 + f32(x_139));
+  }
+  let x_146 : f32 = uv.x;
+  if ((x_146 > 0.75)) {
+    let x_151 : i32 = obj.numbers[3];
+    let x_154 : f32 = color.z;
+    color.z = (x_154 + f32(x_151));
+  }
+  let x_158 : i32 = obj.numbers[4];
+  let x_161 : f32 = color.y;
+  color.y = (x_161 + f32(x_158));
+  let x_165 : f32 = uv.y;
+  if ((x_165 > 0.25)) {
+    let x_170 : i32 = obj.numbers[5];
+    let x_173 : f32 = color.x;
+    color.x = (x_173 + f32(x_170));
+  }
+  let x_177 : f32 = uv.y;
+  if ((x_177 > 0.5)) {
+    let x_182 : i32 = obj.numbers[6];
+    let x_185 : f32 = color.y;
+    color.y = (x_185 + f32(x_182));
+  }
+  let x_189 : f32 = uv.y;
+  if ((x_189 > 0.75)) {
+    let x_194 : i32 = obj.numbers[7];
+    let x_197 : f32 = color.z;
+    color.z = (x_197 + f32(x_194));
+  }
+  let x_201 : i32 = obj.numbers[8];
+  let x_204 : f32 = color.z;
+  color.z = (x_204 + f32(x_201));
+  let x_208 : f32 = uv.x;
+  let x_210 : f32 = uv.y;
+  if ((abs((x_208 - x_210)) < 0.25)) {
+    let x_217 : i32 = obj.numbers[9];
+    let x_220 : f32 = color.x;
+    color.x = (x_220 + f32(x_217));
+  }
+  let x_223 : vec3<f32> = color;
+  let x_224 : vec3<f32> = normalize(x_223);
+  x_GLF_color = vec4<f32>(x_224.x, x_224.y, x_224.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
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
new file mode 100644
index 0000000..7c36066
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-conditional-bitwise-or-clamp/1.wgsl.expected.hlsl
@@ -0,0 +1,232 @@
+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;
+  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);
+  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;
+  {
+    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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-conditional-bitwise-or-clamp/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-conditional-bitwise-or-clamp/1.wgsl.expected.msl
new file mode 100644
index 0000000..825cedb
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-conditional-bitwise-or-clamp/1.wgsl.expected.msl
@@ -0,0 +1,280 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct QuicksortObject {
+  tint_array_wrapper numbers;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void swap_i1_i1_(thread int* const i, thread int* const j, thread QuicksortObject* const tint_symbol_5) {
+  int temp = 0;
+  int const x_230 = *(i);
+  int const x_232 = (*(tint_symbol_5)).numbers.arr[x_230];
+  temp = x_232;
+  int const x_233 = *(i);
+  int const x_234 = *(j);
+  int const x_236 = (*(tint_symbol_5)).numbers.arr[x_234];
+  (*(tint_symbol_5)).numbers.arr[x_233] = x_236;
+  int const x_238 = *(j);
+  int const x_239 = temp;
+  (*(tint_symbol_5)).numbers.arr[x_238] = x_239;
+  return;
+}
+
+int performPartition_i1_i1_(thread int* const l, thread int* const h, thread QuicksortObject* const tint_symbol_6) {
+  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;
+  int const x_242 = *(h);
+  int const x_244 = (*(tint_symbol_6)).numbers.arr[x_242];
+  pivot = x_244;
+  int const x_245 = *(l);
+  i_1 = (x_245 - 1);
+  int const x_247 = *(l);
+  j_1 = x_247;
+  while (true) {
+    int const x_252 = j_1;
+    int const x_253 = *(h);
+    if ((x_252 <= (x_253 - 1))) {
+    } else {
+      break;
+    }
+    int const x_257 = j_1;
+    int const x_259 = (*(tint_symbol_6)).numbers.arr[x_257];
+    int const x_260 = pivot;
+    if ((x_259 <= x_260)) {
+      int const x_264 = i_1;
+      i_1 = (x_264 + 1);
+      int const x_266 = i_1;
+      param = x_266;
+      int const x_267 = j_1;
+      param_1 = x_267;
+      swap_i1_i1_(&(param), &(param_1), tint_symbol_6);
+    }
+    {
+      int const x_269 = j_1;
+      j_1 = (x_269 + 1);
+    }
+  }
+  int const x_271 = i_1;
+  i_1 = (x_271 + 1);
+  int const x_273 = i_1;
+  param_2 = x_273;
+  int const x_274 = *(h);
+  param_3 = x_274;
+  swap_i1_i1_(&(param_2), &(param_3), tint_symbol_6);
+  int const x_276 = i_1;
+  return x_276;
+}
+
+void quicksort_(thread float4* const tint_symbol_7, thread QuicksortObject* const tint_symbol_8) {
+  int l_1 = 0;
+  int h_1 = 0;
+  int top = 0;
+  tint_array_wrapper stack = {};
+  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;
+  int const x_280 = top;
+  int const x_281 = (x_280 + 1);
+  top = x_281;
+  int const x_282 = l_1;
+  stack.arr[x_281] = x_282;
+  float const x_285 = (*(tint_symbol_7)).y;
+  if ((x_285 >= 0.0f)) {
+    int const x_290 = h_1;
+    if (false) {
+      x_279 = 1;
+    } else {
+      int const x_294 = h_1;
+      x_279 = (x_294 << as_type<uint>(0));
+    }
+    int const x_296 = x_279;
+    x_278 = (x_290 | x_296);
+  } else {
+    x_278 = 1;
+  }
+  int const x_298 = x_278;
+  int_a = x_298;
+  int const x_299 = h_1;
+  int const x_300 = h_1;
+  int const x_301 = int_a;
+  clamp_a = clamp(x_299, x_300, x_301);
+  int const x_303 = top;
+  int const x_304 = (x_303 + 1);
+  top = x_304;
+  int const x_305 = clamp_a;
+  stack.arr[x_304] = (x_305 / 1);
+  while (true) {
+    int const x_312 = top;
+    if ((x_312 >= 0)) {
+    } else {
+      break;
+    }
+    int const x_315 = top;
+    top = (x_315 - 1);
+    int const x_318 = stack.arr[x_315];
+    h_1 = x_318;
+    int const x_319 = top;
+    top = (x_319 - 1);
+    int const x_322 = stack.arr[x_319];
+    l_1 = x_322;
+    int const x_323 = l_1;
+    param_4 = x_323;
+    int const x_324 = h_1;
+    param_5 = x_324;
+    int const x_325 = performPartition_i1_i1_(&(param_4), &(param_5), tint_symbol_8);
+    p = x_325;
+    int const x_326 = p;
+    int const x_328 = l_1;
+    if (((x_326 - 1) > x_328)) {
+      int const x_332 = top;
+      int const x_333 = (x_332 + 1);
+      top = x_333;
+      int const x_334 = l_1;
+      stack.arr[x_333] = x_334;
+      int const x_336 = top;
+      int const x_337 = (x_336 + 1);
+      top = x_337;
+      int const x_338 = p;
+      stack.arr[x_337] = (x_338 - 1);
+    }
+    int const x_341 = p;
+    int const x_343 = h_1;
+    if (((x_341 + 1) < x_343)) {
+      int const x_347 = top;
+      int const x_348 = (x_347 + 1);
+      top = x_348;
+      int const x_349 = p;
+      stack.arr[x_348] = (x_349 + 1);
+      int const x_352 = top;
+      int const x_353 = (x_352 + 1);
+      top = x_353;
+      int const x_354 = h_1;
+      stack.arr[x_353] = x_354;
+    }
+  }
+  return;
+}
+
+void main_1(constant buf0& x_34, thread QuicksortObject* const tint_symbol_9, thread float4* const tint_symbol_10, thread float4* const tint_symbol_11) {
+  int i_2 = 0;
+  float2 uv = 0.0f;
+  float3 color = 0.0f;
+  i_2 = 0;
+  while (true) {
+    int const x_90 = i_2;
+    if ((x_90 < 10)) {
+    } else {
+      break;
+    }
+    int const x_93 = i_2;
+    int const x_94 = i_2;
+    (*(tint_symbol_9)).numbers.arr[x_93] = (10 - x_94);
+    int const x_97 = i_2;
+    int const x_98 = i_2;
+    int const x_100 = (*(tint_symbol_9)).numbers.arr[x_98];
+    int const x_101 = i_2;
+    int const x_103 = (*(tint_symbol_9)).numbers.arr[x_101];
+    (*(tint_symbol_9)).numbers.arr[x_97] = (x_100 * x_103);
+    {
+      int const x_106 = i_2;
+      i_2 = (x_106 + 1);
+    }
+  }
+  quicksort_(tint_symbol_10, tint_symbol_9);
+  float4 const x_109 = *(tint_symbol_10);
+  float2 const x_112 = x_34.resolution;
+  uv = (float2(x_109.x, x_109.y) / x_112);
+  color = float3(1.0f, 2.0f, 3.0f);
+  int const x_115 = (*(tint_symbol_9)).numbers.arr[0];
+  float const x_118 = color.x;
+  color.x = (x_118 + float(x_115));
+  float const x_122 = uv.x;
+  if ((x_122 > 0.25f)) {
+    int const x_127 = (*(tint_symbol_9)).numbers.arr[1];
+    float const x_130 = color.x;
+    color.x = (x_130 + float(x_127));
+  }
+  float const x_134 = uv.x;
+  if ((x_134 > 0.5f)) {
+    int const x_139 = (*(tint_symbol_9)).numbers.arr[2];
+    float const x_142 = color.y;
+    color.y = (x_142 + float(x_139));
+  }
+  float const x_146 = uv.x;
+  if ((x_146 > 0.75f)) {
+    int const x_151 = (*(tint_symbol_9)).numbers.arr[3];
+    float const x_154 = color.z;
+    color.z = (x_154 + float(x_151));
+  }
+  int const x_158 = (*(tint_symbol_9)).numbers.arr[4];
+  float const x_161 = color.y;
+  color.y = (x_161 + float(x_158));
+  float const x_165 = uv.y;
+  if ((x_165 > 0.25f)) {
+    int const x_170 = (*(tint_symbol_9)).numbers.arr[5];
+    float const x_173 = color.x;
+    color.x = (x_173 + float(x_170));
+  }
+  float const x_177 = uv.y;
+  if ((x_177 > 0.5f)) {
+    int const x_182 = (*(tint_symbol_9)).numbers.arr[6];
+    float const x_185 = color.y;
+    color.y = (x_185 + float(x_182));
+  }
+  float const x_189 = uv.y;
+  if ((x_189 > 0.75f)) {
+    int const x_194 = (*(tint_symbol_9)).numbers.arr[7];
+    float const x_197 = color.z;
+    color.z = (x_197 + float(x_194));
+  }
+  int const x_201 = (*(tint_symbol_9)).numbers.arr[8];
+  float const x_204 = color.z;
+  color.z = (x_204 + float(x_201));
+  float const x_208 = uv.x;
+  float const x_210 = uv.y;
+  if ((fabs((x_208 - x_210)) < 0.25f)) {
+    int const x_217 = (*(tint_symbol_9)).numbers.arr[9];
+    float const x_220 = color.x;
+    color.x = (x_220 + float(x_217));
+  }
+  float3 const x_223 = color;
+  float3 const x_224 = normalize(x_223);
+  *(tint_symbol_11) = float4(x_224.x, x_224.y, x_224.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_34 [[buffer(0)]]) {
+  thread float4 tint_symbol_12 = 0.0f;
+  thread QuicksortObject tint_symbol_13 = {};
+  thread float4 tint_symbol_14 = 0.0f;
+  tint_symbol_12 = gl_FragCoord_param;
+  main_1(x_34, &(tint_symbol_13), &(tint_symbol_12), &(tint_symbol_14));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_14};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-conditional-bitwise-or-clamp/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-conditional-bitwise-or-clamp/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..003a32d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-conditional-bitwise-or-clamp/1.wgsl.expected.spvasm
@@ -0,0 +1,587 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 402
+; Schema: 0
+               OpCapability Shader
+        %156 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %QuicksortObject "QuicksortObject"
+               OpMemberName %QuicksortObject 0 "numbers"
+               OpName %obj "obj"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_34 "x_34"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %swap_i1_i1_ "swap_i1_i1_"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %temp "temp"
+               OpName %performPartition_i1_i1_ "performPartition_i1_i1_"
+               OpName %l "l"
+               OpName %h "h"
+               OpName %pivot "pivot"
+               OpName %i_1 "i_1"
+               OpName %j_1 "j_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %quicksort_ "quicksort_"
+               OpName %l_1 "l_1"
+               OpName %h_1 "h_1"
+               OpName %top "top"
+               OpName %stack "stack"
+               OpName %int_a "int_a"
+               OpName %x_278 "x_278"
+               OpName %x_279 "x_279"
+               OpName %clamp_a "clamp_a"
+               OpName %p "p"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpName %main_1 "main_1"
+               OpName %i_2 "i_2"
+               OpName %uv "uv"
+               OpName %color "color"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpMemberDecorate %QuicksortObject 0 Offset 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_34 NonWritable
+               OpDecorate %x_34 DescriptorSet 0
+               OpDecorate %x_34 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%QuicksortObject = OpTypeStruct %_arr_int_uint_10
+%_ptr_Private_QuicksortObject = OpTypePointer Private %QuicksortObject
+          %8 = OpConstantNull %QuicksortObject
+        %obj = OpVariable %_ptr_Private_QuicksortObject Private %8
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %13 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %13
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_34 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %13
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %13
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+         %31 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_int = OpTypePointer Private %int
+         %49 = OpTypeFunction %int %_ptr_Function_int %_ptr_Function_int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+        %109 = OpTypeFunction %void
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+        %117 = OpConstantNull %_arr_int_uint_10
+      %int_0 = OpConstant %int 0
+      %int_9 = OpConstant %int 9
+     %int_n1 = OpConstant %int -1
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+      %false = OpConstantFalse %bool
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+        %219 = OpConstantNull %v2float
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+        %223 = OpConstantNull %v3float
+     %int_10 = OpConstant %int 10
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+        %261 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+%_ptr_Function_float = OpTypePointer Function %float
+ %float_0_25 = OpConstant %float 0.25
+  %float_0_5 = OpConstant %float 0.5
+      %int_2 = OpConstant %int 2
+ %float_0_75 = OpConstant %float 0.75
+      %int_3 = OpConstant %int 3
+     %uint_2 = OpConstant %uint 2
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+   %main_out = OpTypeStruct %v4float
+        %389 = OpTypeFunction %void %main_out
+%swap_i1_i1_ = OpFunction %void None %23
+          %i = OpFunctionParameter %_ptr_Function_int
+          %j = OpFunctionParameter %_ptr_Function_int
+         %29 = OpLabel
+       %temp = OpVariable %_ptr_Function_int Function %31
+         %33 = OpLoad %int %i
+         %36 = OpAccessChain %_ptr_Private_int %obj %uint_0 %33
+         %37 = OpLoad %int %36
+               OpStore %temp %37
+         %39 = OpLoad %int %i
+         %41 = OpLoad %int %j
+         %42 = OpAccessChain %_ptr_Private_int %obj %uint_0 %41
+         %43 = OpLoad %int %42
+         %44 = OpAccessChain %_ptr_Private_int %obj %uint_0 %39
+               OpStore %44 %43
+         %46 = OpLoad %int %j
+         %47 = OpLoad %int %temp
+         %48 = OpAccessChain %_ptr_Private_int %obj %uint_0 %46
+               OpStore %48 %47
+               OpReturn
+               OpFunctionEnd
+%performPartition_i1_i1_ = OpFunction %int None %49
+          %l = OpFunctionParameter %_ptr_Function_int
+          %h = OpFunctionParameter %_ptr_Function_int
+         %53 = OpLabel
+      %pivot = OpVariable %_ptr_Function_int Function %31
+        %i_1 = OpVariable %_ptr_Function_int Function %31
+        %j_1 = OpVariable %_ptr_Function_int Function %31
+      %param = OpVariable %_ptr_Function_int Function %31
+    %param_1 = OpVariable %_ptr_Function_int Function %31
+    %param_2 = OpVariable %_ptr_Function_int Function %31
+    %param_3 = OpVariable %_ptr_Function_int Function %31
+         %62 = OpLoad %int %h
+         %63 = OpAccessChain %_ptr_Private_int %obj %uint_0 %62
+         %64 = OpLoad %int %63
+               OpStore %pivot %64
+         %66 = OpLoad %int %l
+         %68 = OpISub %int %66 %int_1
+               OpStore %i_1 %68
+         %70 = OpLoad %int %l
+               OpStore %j_1 %70
+               OpBranch %71
+         %71 = OpLabel
+               OpLoopMerge %72 %73 None
+               OpBranch %74
+         %74 = OpLabel
+         %75 = OpLoad %int %j_1
+         %77 = OpLoad %int %h
+         %78 = OpISub %int %77 %int_1
+         %79 = OpSLessThanEqual %bool %75 %78
+               OpSelectionMerge %81 None
+               OpBranchConditional %79 %82 %83
+         %82 = OpLabel
+               OpBranch %81
+         %83 = OpLabel
+               OpBranch %72
+         %81 = OpLabel
+         %84 = OpLoad %int %j_1
+         %85 = OpAccessChain %_ptr_Private_int %obj %uint_0 %84
+         %86 = OpLoad %int %85
+         %87 = OpLoad %int %pivot
+         %88 = OpSLessThanEqual %bool %86 %87
+               OpSelectionMerge %89 None
+               OpBranchConditional %88 %90 %89
+         %90 = OpLabel
+         %91 = OpLoad %int %i_1
+         %92 = OpIAdd %int %91 %int_1
+               OpStore %i_1 %92
+         %93 = OpLoad %int %i_1
+               OpStore %param %93
+         %94 = OpLoad %int %j_1
+               OpStore %param_1 %94
+         %95 = OpFunctionCall %void %swap_i1_i1_ %param %param_1
+               OpBranch %89
+         %89 = OpLabel
+               OpBranch %73
+         %73 = OpLabel
+         %98 = OpLoad %int %j_1
+         %99 = OpIAdd %int %98 %int_1
+               OpStore %j_1 %99
+               OpBranch %71
+         %72 = OpLabel
+        %100 = OpLoad %int %i_1
+        %101 = OpIAdd %int %100 %int_1
+               OpStore %i_1 %101
+        %102 = OpLoad %int %i_1
+               OpStore %param_2 %102
+        %104 = OpLoad %int %h
+               OpStore %param_3 %104
+        %105 = OpFunctionCall %void %swap_i1_i1_ %param_2 %param_3
+        %108 = OpLoad %int %i_1
+               OpReturnValue %108
+               OpFunctionEnd
+ %quicksort_ = OpFunction %void None %109
+        %111 = OpLabel
+        %l_1 = OpVariable %_ptr_Function_int Function %31
+        %h_1 = OpVariable %_ptr_Function_int Function %31
+        %top = OpVariable %_ptr_Function_int Function %31
+      %stack = OpVariable %_ptr_Function__arr_int_uint_10 Function %117
+      %int_a = OpVariable %_ptr_Function_int Function %31
+      %x_278 = OpVariable %_ptr_Function_int Function %31
+      %x_279 = OpVariable %_ptr_Function_int Function %31
+    %clamp_a = OpVariable %_ptr_Function_int Function %31
+          %p = OpVariable %_ptr_Function_int Function %31
+    %param_4 = OpVariable %_ptr_Function_int Function %31
+    %param_5 = OpVariable %_ptr_Function_int Function %31
+               OpStore %l_1 %int_0
+               OpStore %h_1 %int_9
+               OpStore %top %int_n1
+        %128 = OpLoad %int %top
+        %129 = OpIAdd %int %128 %int_1
+               OpStore %top %129
+        %130 = OpLoad %int %l_1
+        %131 = OpAccessChain %_ptr_Function_int %stack %129
+               OpStore %131 %130
+        %134 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+        %135 = OpLoad %float %134
+        %137 = OpFOrdGreaterThanEqual %bool %135 %float_0
+               OpSelectionMerge %138 None
+               OpBranchConditional %137 %139 %140
+        %139 = OpLabel
+        %141 = OpLoad %int %h_1
+               OpSelectionMerge %143 None
+               OpBranchConditional %false %144 %145
+        %144 = OpLabel
+               OpStore %x_279 %int_1
+               OpBranch %143
+        %145 = OpLabel
+        %146 = OpLoad %int %h_1
+        %147 = OpBitcast %uint %int_0
+        %148 = OpShiftLeftLogical %int %146 %147
+               OpStore %x_279 %148
+               OpBranch %143
+        %143 = OpLabel
+        %149 = OpLoad %int %x_279
+        %150 = OpBitwiseOr %int %141 %149
+               OpStore %x_278 %150
+               OpBranch %138
+        %140 = OpLabel
+               OpStore %x_278 %int_1
+               OpBranch %138
+        %138 = OpLabel
+        %151 = OpLoad %int %x_278
+               OpStore %int_a %151
+        %152 = OpLoad %int %h_1
+        %153 = OpLoad %int %h_1
+        %154 = OpLoad %int %int_a
+        %155 = OpExtInst %int %156 SClamp %152 %153 %154
+               OpStore %clamp_a %155
+        %157 = OpLoad %int %top
+        %158 = OpIAdd %int %157 %int_1
+               OpStore %top %158
+        %159 = OpLoad %int %clamp_a
+        %160 = OpAccessChain %_ptr_Function_int %stack %158
+        %161 = OpSDiv %int %159 %int_1
+               OpStore %160 %161
+               OpBranch %162
+        %162 = OpLabel
+               OpLoopMerge %163 %164 None
+               OpBranch %165
+        %165 = OpLabel
+        %166 = OpLoad %int %top
+        %167 = OpSGreaterThanEqual %bool %166 %int_0
+               OpSelectionMerge %168 None
+               OpBranchConditional %167 %169 %170
+        %169 = OpLabel
+               OpBranch %168
+        %170 = OpLabel
+               OpBranch %163
+        %168 = OpLabel
+        %171 = OpLoad %int %top
+        %172 = OpISub %int %171 %int_1
+               OpStore %top %172
+        %173 = OpAccessChain %_ptr_Function_int %stack %171
+        %174 = OpLoad %int %173
+               OpStore %h_1 %174
+        %175 = OpLoad %int %top
+        %176 = OpISub %int %175 %int_1
+               OpStore %top %176
+        %177 = OpAccessChain %_ptr_Function_int %stack %175
+        %178 = OpLoad %int %177
+               OpStore %l_1 %178
+        %179 = OpLoad %int %l_1
+               OpStore %param_4 %179
+        %180 = OpLoad %int %h_1
+               OpStore %param_5 %180
+        %181 = OpFunctionCall %int %performPartition_i1_i1_ %param_4 %param_5
+               OpStore %p %181
+        %184 = OpLoad %int %p
+        %185 = OpLoad %int %l_1
+        %186 = OpISub %int %184 %int_1
+        %187 = OpSGreaterThan %bool %186 %185
+               OpSelectionMerge %188 None
+               OpBranchConditional %187 %189 %188
+        %189 = OpLabel
+        %190 = OpLoad %int %top
+        %191 = OpIAdd %int %190 %int_1
+               OpStore %top %191
+        %192 = OpLoad %int %l_1
+        %193 = OpAccessChain %_ptr_Function_int %stack %191
+               OpStore %193 %192
+        %194 = OpLoad %int %top
+        %195 = OpIAdd %int %194 %int_1
+               OpStore %top %195
+        %196 = OpLoad %int %p
+        %197 = OpAccessChain %_ptr_Function_int %stack %195
+        %198 = OpISub %int %196 %int_1
+               OpStore %197 %198
+               OpBranch %188
+        %188 = OpLabel
+        %199 = OpLoad %int %p
+        %200 = OpLoad %int %h_1
+        %201 = OpIAdd %int %199 %int_1
+        %202 = OpSLessThan %bool %201 %200
+               OpSelectionMerge %203 None
+               OpBranchConditional %202 %204 %203
+        %204 = OpLabel
+        %205 = OpLoad %int %top
+        %206 = OpIAdd %int %205 %int_1
+               OpStore %top %206
+        %207 = OpLoad %int %p
+        %208 = OpAccessChain %_ptr_Function_int %stack %206
+        %209 = OpIAdd %int %207 %int_1
+               OpStore %208 %209
+        %210 = OpLoad %int %top
+        %211 = OpIAdd %int %210 %int_1
+               OpStore %top %211
+        %212 = OpLoad %int %h_1
+        %213 = OpAccessChain %_ptr_Function_int %stack %211
+               OpStore %213 %212
+               OpBranch %203
+        %203 = OpLabel
+               OpBranch %164
+        %164 = OpLabel
+               OpBranch %162
+        %163 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %109
+        %215 = OpLabel
+        %i_2 = OpVariable %_ptr_Function_int Function %31
+         %uv = OpVariable %_ptr_Function_v2float Function %219
+      %color = OpVariable %_ptr_Function_v3float Function %223
+               OpStore %i_2 %int_0
+               OpBranch %224
+        %224 = OpLabel
+               OpLoopMerge %225 %226 None
+               OpBranch %227
+        %227 = OpLabel
+        %228 = OpLoad %int %i_2
+        %230 = OpSLessThan %bool %228 %int_10
+               OpSelectionMerge %231 None
+               OpBranchConditional %230 %232 %233
+        %232 = OpLabel
+               OpBranch %231
+        %233 = OpLabel
+               OpBranch %225
+        %231 = OpLabel
+        %234 = OpLoad %int %i_2
+        %235 = OpLoad %int %i_2
+        %236 = OpAccessChain %_ptr_Private_int %obj %uint_0 %234
+        %237 = OpISub %int %int_10 %235
+               OpStore %236 %237
+        %238 = OpLoad %int %i_2
+        %239 = OpLoad %int %i_2
+        %240 = OpAccessChain %_ptr_Private_int %obj %uint_0 %239
+        %241 = OpLoad %int %240
+        %242 = OpLoad %int %i_2
+        %243 = OpAccessChain %_ptr_Private_int %obj %uint_0 %242
+        %244 = OpLoad %int %243
+        %245 = OpAccessChain %_ptr_Private_int %obj %uint_0 %238
+        %246 = OpIMul %int %241 %244
+               OpStore %245 %246
+               OpBranch %226
+        %226 = OpLabel
+        %247 = OpLoad %int %i_2
+        %248 = OpIAdd %int %247 %int_1
+               OpStore %i_2 %248
+               OpBranch %224
+        %225 = OpLabel
+        %249 = OpFunctionCall %void %quicksort_
+        %250 = OpLoad %v4float %gl_FragCoord
+        %252 = OpAccessChain %_ptr_Uniform_v2float %x_34 %uint_0
+        %253 = OpLoad %v2float %252
+        %254 = OpCompositeExtract %float %250 0
+        %255 = OpCompositeExtract %float %250 1
+        %256 = OpCompositeConstruct %v2float %254 %255
+        %257 = OpFDiv %v2float %256 %253
+               OpStore %uv %257
+               OpStore %color %261
+        %262 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_0
+        %263 = OpLoad %int %262
+        %265 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %266 = OpLoad %float %265
+        %267 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %268 = OpConvertSToF %float %263
+        %269 = OpFAdd %float %266 %268
+               OpStore %267 %269
+        %270 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %271 = OpLoad %float %270
+        %273 = OpFOrdGreaterThan %bool %271 %float_0_25
+               OpSelectionMerge %274 None
+               OpBranchConditional %273 %275 %274
+        %275 = OpLabel
+        %276 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_1
+        %277 = OpLoad %int %276
+        %278 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %279 = OpLoad %float %278
+        %280 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %281 = OpConvertSToF %float %277
+        %282 = OpFAdd %float %279 %281
+               OpStore %280 %282
+               OpBranch %274
+        %274 = OpLabel
+        %283 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %284 = OpLoad %float %283
+        %286 = OpFOrdGreaterThan %bool %284 %float_0_5
+               OpSelectionMerge %287 None
+               OpBranchConditional %286 %288 %287
+        %288 = OpLabel
+        %290 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_2
+        %291 = OpLoad %int %290
+        %292 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %293 = OpLoad %float %292
+        %294 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %295 = OpConvertSToF %float %291
+        %296 = OpFAdd %float %293 %295
+               OpStore %294 %296
+               OpBranch %287
+        %287 = OpLabel
+        %297 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %298 = OpLoad %float %297
+        %300 = OpFOrdGreaterThan %bool %298 %float_0_75
+               OpSelectionMerge %301 None
+               OpBranchConditional %300 %302 %301
+        %302 = OpLabel
+        %304 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_3
+        %305 = OpLoad %int %304
+        %307 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %308 = OpLoad %float %307
+        %309 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %310 = OpConvertSToF %float %305
+        %311 = OpFAdd %float %308 %310
+               OpStore %309 %311
+               OpBranch %301
+        %301 = OpLabel
+        %313 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_4
+        %314 = OpLoad %int %313
+        %315 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %316 = OpLoad %float %315
+        %317 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %318 = OpConvertSToF %float %314
+        %319 = OpFAdd %float %316 %318
+               OpStore %317 %319
+        %320 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %321 = OpLoad %float %320
+        %322 = OpFOrdGreaterThan %bool %321 %float_0_25
+               OpSelectionMerge %323 None
+               OpBranchConditional %322 %324 %323
+        %324 = OpLabel
+        %326 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_5
+        %327 = OpLoad %int %326
+        %328 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %329 = OpLoad %float %328
+        %330 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %331 = OpConvertSToF %float %327
+        %332 = OpFAdd %float %329 %331
+               OpStore %330 %332
+               OpBranch %323
+        %323 = OpLabel
+        %333 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %334 = OpLoad %float %333
+        %335 = OpFOrdGreaterThan %bool %334 %float_0_5
+               OpSelectionMerge %336 None
+               OpBranchConditional %335 %337 %336
+        %337 = OpLabel
+        %339 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_6
+        %340 = OpLoad %int %339
+        %341 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %342 = OpLoad %float %341
+        %343 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %344 = OpConvertSToF %float %340
+        %345 = OpFAdd %float %342 %344
+               OpStore %343 %345
+               OpBranch %336
+        %336 = OpLabel
+        %346 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %347 = OpLoad %float %346
+        %348 = OpFOrdGreaterThan %bool %347 %float_0_75
+               OpSelectionMerge %349 None
+               OpBranchConditional %348 %350 %349
+        %350 = OpLabel
+        %352 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_7
+        %353 = OpLoad %int %352
+        %354 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %355 = OpLoad %float %354
+        %356 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %357 = OpConvertSToF %float %353
+        %358 = OpFAdd %float %355 %357
+               OpStore %356 %358
+               OpBranch %349
+        %349 = OpLabel
+        %360 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_8
+        %361 = OpLoad %int %360
+        %362 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %363 = OpLoad %float %362
+        %364 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %365 = OpConvertSToF %float %361
+        %366 = OpFAdd %float %363 %365
+               OpStore %364 %366
+        %367 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %368 = OpLoad %float %367
+        %369 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %370 = OpLoad %float %369
+        %372 = OpFSub %float %368 %370
+        %371 = OpExtInst %float %156 FAbs %372
+        %373 = OpFOrdLessThan %bool %371 %float_0_25
+               OpSelectionMerge %374 None
+               OpBranchConditional %373 %375 %374
+        %375 = OpLabel
+        %376 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_9
+        %377 = OpLoad %int %376
+        %378 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %379 = OpLoad %float %378
+        %380 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %381 = OpConvertSToF %float %377
+        %382 = OpFAdd %float %379 %381
+               OpStore %380 %382
+               OpBranch %374
+        %374 = OpLabel
+        %383 = OpLoad %v3float %color
+        %384 = OpExtInst %v3float %156 Normalize %383
+        %385 = OpCompositeExtract %float %384 0
+        %386 = OpCompositeExtract %float %384 1
+        %387 = OpCompositeExtract %float %384 2
+        %388 = OpCompositeConstruct %v4float %385 %386 %387 %float_1
+               OpStore %x_GLF_color %388
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %389
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %393 = OpLabel
+        %394 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %394
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %109
+        %396 = OpLabel
+        %397 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %397
+        %398 = OpFunctionCall %void %main_1
+        %400 = OpLoad %v4float %x_GLF_color
+        %401 = OpCompositeConstruct %main_out %400
+        %399 = OpFunctionCall %void %tint_symbol_3 %401
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-conditional-bitwise-or-clamp/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-conditional-bitwise-or-clamp/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..68052db
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-conditional-bitwise-or-clamp/1.wgsl.expected.wgsl
@@ -0,0 +1,280 @@
+struct QuicksortObject {
+  numbers : array<i32, 10>;
+};
+
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> obj : QuicksortObject;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_34 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn swap_i1_i1_(i : ptr<function, i32>, j : ptr<function, i32>) {
+  var temp : i32;
+  let x_230 : i32 = *(i);
+  let x_232 : i32 = obj.numbers[x_230];
+  temp = x_232;
+  let x_233 : i32 = *(i);
+  let x_234 : i32 = *(j);
+  let x_236 : i32 = obj.numbers[x_234];
+  obj.numbers[x_233] = x_236;
+  let x_238 : i32 = *(j);
+  let x_239 : i32 = temp;
+  obj.numbers[x_238] = x_239;
+  return;
+}
+
+fn performPartition_i1_i1_(l : ptr<function, i32>, h : ptr<function, i32>) -> i32 {
+  var pivot : i32;
+  var i_1 : i32;
+  var j_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  var param_3 : i32;
+  let x_242 : i32 = *(h);
+  let x_244 : i32 = obj.numbers[x_242];
+  pivot = x_244;
+  let x_245 : i32 = *(l);
+  i_1 = (x_245 - 1);
+  let x_247 : i32 = *(l);
+  j_1 = x_247;
+  loop {
+    let x_252 : i32 = j_1;
+    let x_253 : i32 = *(h);
+    if ((x_252 <= (x_253 - 1))) {
+    } else {
+      break;
+    }
+    let x_257 : i32 = j_1;
+    let x_259 : i32 = obj.numbers[x_257];
+    let x_260 : i32 = pivot;
+    if ((x_259 <= x_260)) {
+      let x_264 : i32 = i_1;
+      i_1 = (x_264 + 1);
+      let x_266 : i32 = i_1;
+      param = x_266;
+      let x_267 : i32 = j_1;
+      param_1 = x_267;
+      swap_i1_i1_(&(param), &(param_1));
+    }
+
+    continuing {
+      let x_269 : i32 = j_1;
+      j_1 = (x_269 + 1);
+    }
+  }
+  let x_271 : i32 = i_1;
+  i_1 = (x_271 + 1);
+  let x_273 : i32 = i_1;
+  param_2 = x_273;
+  let x_274 : i32 = *(h);
+  param_3 = x_274;
+  swap_i1_i1_(&(param_2), &(param_3));
+  let x_276 : i32 = i_1;
+  return x_276;
+}
+
+fn quicksort_() {
+  var l_1 : i32;
+  var h_1 : i32;
+  var top : i32;
+  var stack : array<i32, 10>;
+  var int_a : i32;
+  var x_278 : i32;
+  var x_279 : i32;
+  var clamp_a : i32;
+  var p : i32;
+  var param_4 : i32;
+  var param_5 : i32;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  let x_280 : i32 = top;
+  let x_281 : i32 = (x_280 + 1);
+  top = x_281;
+  let x_282 : i32 = l_1;
+  stack[x_281] = x_282;
+  let x_285 : f32 = gl_FragCoord.y;
+  if ((x_285 >= 0.0)) {
+    let x_290 : i32 = h_1;
+    if (false) {
+      x_279 = 1;
+    } else {
+      let x_294 : i32 = h_1;
+      x_279 = (x_294 << bitcast<u32>(0));
+    }
+    let x_296 : i32 = x_279;
+    x_278 = (x_290 | x_296);
+  } else {
+    x_278 = 1;
+  }
+  let x_298 : i32 = x_278;
+  int_a = x_298;
+  let x_299 : i32 = h_1;
+  let x_300 : i32 = h_1;
+  let x_301 : i32 = int_a;
+  clamp_a = clamp(x_299, x_300, x_301);
+  let x_303 : i32 = top;
+  let x_304 : i32 = (x_303 + 1);
+  top = x_304;
+  let x_305 : i32 = clamp_a;
+  stack[x_304] = (x_305 / 1);
+  loop {
+    let x_312 : i32 = top;
+    if ((x_312 >= 0)) {
+    } else {
+      break;
+    }
+    let x_315 : i32 = top;
+    top = (x_315 - 1);
+    let x_318 : i32 = stack[x_315];
+    h_1 = x_318;
+    let x_319 : i32 = top;
+    top = (x_319 - 1);
+    let x_322 : i32 = stack[x_319];
+    l_1 = x_322;
+    let x_323 : i32 = l_1;
+    param_4 = x_323;
+    let x_324 : i32 = h_1;
+    param_5 = x_324;
+    let x_325 : i32 = performPartition_i1_i1_(&(param_4), &(param_5));
+    p = x_325;
+    let x_326 : i32 = p;
+    let x_328 : i32 = l_1;
+    if (((x_326 - 1) > x_328)) {
+      let x_332 : i32 = top;
+      let x_333 : i32 = (x_332 + 1);
+      top = x_333;
+      let x_334 : i32 = l_1;
+      stack[x_333] = x_334;
+      let x_336 : i32 = top;
+      let x_337 : i32 = (x_336 + 1);
+      top = x_337;
+      let x_338 : i32 = p;
+      stack[x_337] = (x_338 - 1);
+    }
+    let x_341 : i32 = p;
+    let x_343 : i32 = h_1;
+    if (((x_341 + 1) < x_343)) {
+      let x_347 : i32 = top;
+      let x_348 : i32 = (x_347 + 1);
+      top = x_348;
+      let x_349 : i32 = p;
+      stack[x_348] = (x_349 + 1);
+      let x_352 : i32 = top;
+      let x_353 : i32 = (x_352 + 1);
+      top = x_353;
+      let x_354 : i32 = h_1;
+      stack[x_353] = x_354;
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_2 : i32;
+  var uv : vec2<f32>;
+  var color : vec3<f32>;
+  i_2 = 0;
+  loop {
+    let x_90 : i32 = i_2;
+    if ((x_90 < 10)) {
+    } else {
+      break;
+    }
+    let x_93 : i32 = i_2;
+    let x_94 : i32 = i_2;
+    obj.numbers[x_93] = (10 - x_94);
+    let x_97 : i32 = i_2;
+    let x_98 : i32 = i_2;
+    let x_100 : i32 = obj.numbers[x_98];
+    let x_101 : i32 = i_2;
+    let x_103 : i32 = obj.numbers[x_101];
+    obj.numbers[x_97] = (x_100 * x_103);
+
+    continuing {
+      let x_106 : i32 = i_2;
+      i_2 = (x_106 + 1);
+    }
+  }
+  quicksort_();
+  let x_109 : vec4<f32> = gl_FragCoord;
+  let x_112 : vec2<f32> = x_34.resolution;
+  uv = (vec2<f32>(x_109.x, x_109.y) / x_112);
+  color = vec3<f32>(1.0, 2.0, 3.0);
+  let x_115 : i32 = obj.numbers[0];
+  let x_118 : f32 = color.x;
+  color.x = (x_118 + f32(x_115));
+  let x_122 : f32 = uv.x;
+  if ((x_122 > 0.25)) {
+    let x_127 : i32 = obj.numbers[1];
+    let x_130 : f32 = color.x;
+    color.x = (x_130 + f32(x_127));
+  }
+  let x_134 : f32 = uv.x;
+  if ((x_134 > 0.5)) {
+    let x_139 : i32 = obj.numbers[2];
+    let x_142 : f32 = color.y;
+    color.y = (x_142 + f32(x_139));
+  }
+  let x_146 : f32 = uv.x;
+  if ((x_146 > 0.75)) {
+    let x_151 : i32 = obj.numbers[3];
+    let x_154 : f32 = color.z;
+    color.z = (x_154 + f32(x_151));
+  }
+  let x_158 : i32 = obj.numbers[4];
+  let x_161 : f32 = color.y;
+  color.y = (x_161 + f32(x_158));
+  let x_165 : f32 = uv.y;
+  if ((x_165 > 0.25)) {
+    let x_170 : i32 = obj.numbers[5];
+    let x_173 : f32 = color.x;
+    color.x = (x_173 + f32(x_170));
+  }
+  let x_177 : f32 = uv.y;
+  if ((x_177 > 0.5)) {
+    let x_182 : i32 = obj.numbers[6];
+    let x_185 : f32 = color.y;
+    color.y = (x_185 + f32(x_182));
+  }
+  let x_189 : f32 = uv.y;
+  if ((x_189 > 0.75)) {
+    let x_194 : i32 = obj.numbers[7];
+    let x_197 : f32 = color.z;
+    color.z = (x_197 + f32(x_194));
+  }
+  let x_201 : i32 = obj.numbers[8];
+  let x_204 : f32 = color.z;
+  color.z = (x_204 + f32(x_201));
+  let x_208 : f32 = uv.x;
+  let x_210 : f32 = uv.y;
+  if ((abs((x_208 - x_210)) < 0.25)) {
+    let x_217 : i32 = obj.numbers[9];
+    let x_220 : f32 = color.x;
+    color.x = (x_220 + f32(x_217));
+  }
+  let x_223 : vec3<f32> = color;
+  let x_224 : vec3<f32> = normalize(x_223);
+  x_GLF_color = vec4<f32>(x_224.x, x_224.y, x_224.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/0-opt.spvasm
new file mode 100644
index 0000000..b93bfe7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/0-opt.spvasm
@@ -0,0 +1,503 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %_GLF_pos %frag_color %__0
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %swap_i1_i1_ "swap(i1;i1;"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %performPartition_i1_i1_ "performPartition(i1;i1;"
+               OpName %l "l"
+               OpName %h "h"
+               OpName %quicksort_ "quicksort("
+               OpName %temp "temp"
+               OpName %QuicksortObject "QuicksortObject"
+               OpMemberName %QuicksortObject 0 "numbers"
+               OpName %obj "obj"
+               OpName %pivot "pivot"
+               OpName %i_0 "i"
+               OpName %j_0 "j"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %param_1 "param"
+               OpName %param_2 "param"
+               OpName %l_0 "l"
+               OpName %h_0 "h"
+               OpName %top "top"
+               OpName %stack "stack"
+               OpName %p "p"
+               OpName %param_3 "param"
+               OpName %param_4 "param"
+               OpName %_GLF_FragCoord "_GLF_FragCoord"
+               OpName %_GLF_pos "_GLF_pos"
+               OpName %i_1 "i"
+               OpName %uv "uv"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %color "color"
+               OpName %frag_color "frag_color"
+               OpName %gl_PerVertex "gl_PerVertex"
+               OpMemberName %gl_PerVertex 0 "gl_Position"
+               OpMemberName %gl_PerVertex 1 "gl_PointSize"
+               OpName %__0 ""
+               OpDecorate %_GLF_pos Location 0
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %frag_color Location 0
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpDecorate %gl_PerVertex Block
+       %void = OpTypeVoid
+         %38 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %41 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+         %42 = OpTypeFunction %int %_ptr_Function_int %_ptr_Function_int
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%QuicksortObject = OpTypeStruct %_arr_int_uint_10
+%_ptr_Private_QuicksortObject = OpTypePointer Private %QuicksortObject
+        %obj = OpVariable %_ptr_Private_QuicksortObject Private
+      %int_0 = OpConstant %int 0
+%_ptr_Private_int = OpTypePointer Private %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %int_9 = OpConstant %int 9
+     %int_n1 = OpConstant %int -1
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+%_GLF_FragCoord = OpVariable %_ptr_Private_v4float Private
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+   %_GLF_pos = OpVariable %_ptr_Input_v4float Input
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %60 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_0
+  %float_128 = OpConstant %float 128
+         %62 = OpConstantComposite %v4float %float_128 %float_128 %float_1 %float_1
+     %int_10 = OpConstant %int 10
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+         %72 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+ %float_0_25 = OpConstant %float 0.25
+  %float_0_5 = OpConstant %float 0.5
+      %int_2 = OpConstant %int 2
+     %uint_1 = OpConstant %uint 1
+ %float_0_75 = OpConstant %float 0.75
+      %int_3 = OpConstant %int 3
+     %uint_2 = OpConstant %uint 2
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %frag_color = OpVariable %_ptr_Output_v4float Output
+%gl_PerVertex = OpTypeStruct %v4float %float
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+        %__0 = OpVariable %_ptr_Output_gl_PerVertex Output
+       %main = OpFunction %void None %38
+         %89 = OpLabel
+        %i_1 = OpVariable %_ptr_Function_int Function
+         %uv = OpVariable %_ptr_Function_v2float Function
+      %color = OpVariable %_ptr_Function_v3float Function
+         %90 = OpLoad %v4float %_GLF_pos
+         %91 = OpFAdd %v4float %90 %60
+         %92 = OpFMul %v4float %91 %62
+               OpStore %_GLF_FragCoord %92
+               OpStore %i_1 %int_0
+               OpBranch %93
+         %93 = OpLabel
+               OpLoopMerge %94 %95 None
+               OpBranch %96
+         %96 = OpLabel
+         %97 = OpLoad %int %i_1
+         %98 = OpSLessThan %bool %97 %int_10
+               OpBranchConditional %98 %99 %94
+         %99 = OpLabel
+        %100 = OpLoad %int %i_1
+        %101 = OpLoad %int %i_1
+        %102 = OpISub %int %int_10 %101
+        %103 = OpAccessChain %_ptr_Private_int %obj %int_0 %100
+               OpStore %103 %102
+        %104 = OpLoad %int %i_1
+        %105 = OpLoad %int %i_1
+        %106 = OpAccessChain %_ptr_Private_int %obj %int_0 %105
+        %107 = OpLoad %int %106
+        %108 = OpLoad %int %i_1
+        %109 = OpAccessChain %_ptr_Private_int %obj %int_0 %108
+        %110 = OpLoad %int %109
+        %111 = OpIMul %int %107 %110
+        %112 = OpAccessChain %_ptr_Private_int %obj %int_0 %104
+               OpStore %112 %111
+               OpBranch %95
+         %95 = OpLabel
+        %113 = OpLoad %int %i_1
+        %114 = OpIAdd %int %113 %int_1
+               OpStore %i_1 %114
+               OpBranch %93
+         %94 = OpLabel
+        %115 = OpFunctionCall %void %quicksort_
+        %116 = OpLoad %v4float %_GLF_FragCoord
+        %117 = OpVectorShuffle %v2float %116 %116 0 1
+        %118 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+        %119 = OpLoad %v2float %118
+        %120 = OpFDiv %v2float %117 %119
+               OpStore %uv %120
+               OpStore %color %72
+        %121 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_0
+        %122 = OpLoad %int %121
+        %123 = OpConvertSToF %float %122
+        %124 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %125 = OpLoad %float %124
+        %126 = OpFAdd %float %125 %123
+        %127 = OpAccessChain %_ptr_Function_float %color %uint_0
+               OpStore %127 %126
+        %128 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %129 = OpLoad %float %128
+        %130 = OpFOrdGreaterThan %bool %129 %float_0_25
+               OpSelectionMerge %131 None
+               OpBranchConditional %130 %132 %131
+        %132 = OpLabel
+        %133 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_1
+        %134 = OpLoad %int %133
+        %135 = OpConvertSToF %float %134
+        %136 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %137 = OpLoad %float %136
+        %138 = OpFAdd %float %137 %135
+        %139 = OpAccessChain %_ptr_Function_float %color %uint_0
+               OpStore %139 %138
+               OpBranch %131
+        %131 = OpLabel
+        %140 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %141 = OpLoad %float %140
+        %142 = OpFOrdGreaterThan %bool %141 %float_0_5
+               OpSelectionMerge %143 None
+               OpBranchConditional %142 %144 %143
+        %144 = OpLabel
+        %145 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_2
+        %146 = OpLoad %int %145
+        %147 = OpConvertSToF %float %146
+        %148 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %149 = OpLoad %float %148
+        %150 = OpFAdd %float %149 %147
+        %151 = OpAccessChain %_ptr_Function_float %color %uint_1
+               OpStore %151 %150
+               OpBranch %143
+        %143 = OpLabel
+        %152 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %153 = OpLoad %float %152
+        %154 = OpFOrdGreaterThan %bool %153 %float_0_75
+               OpSelectionMerge %155 None
+               OpBranchConditional %154 %156 %155
+        %156 = OpLabel
+        %157 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_3
+        %158 = OpLoad %int %157
+        %159 = OpConvertSToF %float %158
+        %160 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %161 = OpLoad %float %160
+        %162 = OpFAdd %float %161 %159
+        %163 = OpAccessChain %_ptr_Function_float %color %uint_2
+               OpStore %163 %162
+               OpBranch %155
+        %155 = OpLabel
+        %164 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_4
+        %165 = OpLoad %int %164
+        %166 = OpConvertSToF %float %165
+        %167 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %168 = OpLoad %float %167
+        %169 = OpFAdd %float %168 %166
+        %170 = OpAccessChain %_ptr_Function_float %color %uint_1
+               OpStore %170 %169
+        %171 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %172 = OpLoad %float %171
+        %173 = OpFOrdGreaterThan %bool %172 %float_0_25
+               OpSelectionMerge %174 None
+               OpBranchConditional %173 %175 %174
+        %175 = OpLabel
+        %176 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_5
+        %177 = OpLoad %int %176
+        %178 = OpConvertSToF %float %177
+        %179 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %180 = OpLoad %float %179
+        %181 = OpFAdd %float %180 %178
+        %182 = OpAccessChain %_ptr_Function_float %color %uint_0
+               OpStore %182 %181
+               OpBranch %174
+        %174 = OpLabel
+        %183 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %184 = OpLoad %float %183
+        %185 = OpFOrdGreaterThan %bool %184 %float_0_5
+               OpSelectionMerge %186 None
+               OpBranchConditional %185 %187 %186
+        %187 = OpLabel
+        %188 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_6
+        %189 = OpLoad %int %188
+        %190 = OpConvertSToF %float %189
+        %191 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %192 = OpLoad %float %191
+        %193 = OpFAdd %float %192 %190
+        %194 = OpAccessChain %_ptr_Function_float %color %uint_1
+               OpStore %194 %193
+               OpBranch %186
+        %186 = OpLabel
+        %195 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %196 = OpLoad %float %195
+        %197 = OpFOrdGreaterThan %bool %196 %float_0_75
+               OpSelectionMerge %198 None
+               OpBranchConditional %197 %199 %198
+        %199 = OpLabel
+        %200 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_7
+        %201 = OpLoad %int %200
+        %202 = OpConvertSToF %float %201
+        %203 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %204 = OpLoad %float %203
+        %205 = OpFAdd %float %204 %202
+        %206 = OpAccessChain %_ptr_Function_float %color %uint_2
+               OpStore %206 %205
+               OpBranch %198
+        %198 = OpLabel
+        %207 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_8
+        %208 = OpLoad %int %207
+        %209 = OpConvertSToF %float %208
+        %210 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %211 = OpLoad %float %210
+        %212 = OpFAdd %float %211 %209
+        %213 = OpAccessChain %_ptr_Function_float %color %uint_2
+               OpStore %213 %212
+        %214 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %215 = OpLoad %float %214
+        %216 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %217 = OpLoad %float %216
+        %218 = OpFSub %float %215 %217
+        %219 = OpExtInst %float %1 FAbs %218
+        %220 = OpFOrdLessThan %bool %219 %float_0_25
+               OpSelectionMerge %221 None
+               OpBranchConditional %220 %222 %221
+        %222 = OpLabel
+        %223 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_9
+        %224 = OpLoad %int %223
+        %225 = OpConvertSToF %float %224
+        %226 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %227 = OpLoad %float %226
+        %228 = OpFAdd %float %227 %225
+        %229 = OpAccessChain %_ptr_Function_float %color %uint_0
+               OpStore %229 %228
+               OpBranch %221
+        %221 = OpLabel
+        %230 = OpLoad %v3float %color
+        %231 = OpExtInst %v3float %1 Normalize %230
+        %232 = OpCompositeExtract %float %231 0
+        %233 = OpCompositeExtract %float %231 1
+        %234 = OpCompositeExtract %float %231 2
+        %235 = OpCompositeConstruct %v4float %232 %233 %234 %float_1
+               OpStore %frag_color %235
+        %236 = OpLoad %v4float %_GLF_pos
+        %237 = OpAccessChain %_ptr_Output_v4float %__0 %int_0
+               OpStore %237 %236
+               OpReturn
+               OpFunctionEnd
+%swap_i1_i1_ = OpFunction %void None %41
+          %i = OpFunctionParameter %_ptr_Function_int
+          %j = OpFunctionParameter %_ptr_Function_int
+        %238 = OpLabel
+       %temp = OpVariable %_ptr_Function_int Function
+        %239 = OpLoad %int %i
+        %240 = OpAccessChain %_ptr_Private_int %obj %int_0 %239
+        %241 = OpLoad %int %240
+               OpStore %temp %241
+        %242 = OpLoad %int %i
+        %243 = OpLoad %int %j
+        %244 = OpAccessChain %_ptr_Private_int %obj %int_0 %243
+        %245 = OpLoad %int %244
+        %246 = OpAccessChain %_ptr_Private_int %obj %int_0 %242
+               OpStore %246 %245
+        %247 = OpLoad %int %j
+        %248 = OpLoad %int %temp
+        %249 = OpAccessChain %_ptr_Private_int %obj %int_0 %247
+               OpStore %249 %248
+               OpReturn
+               OpFunctionEnd
+%performPartition_i1_i1_ = OpFunction %int None %42
+          %l = OpFunctionParameter %_ptr_Function_int
+          %h = OpFunctionParameter %_ptr_Function_int
+        %250 = OpLabel
+      %pivot = OpVariable %_ptr_Function_int Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+        %j_0 = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_int Function
+    %param_0 = OpVariable %_ptr_Function_int Function
+    %param_1 = OpVariable %_ptr_Function_int Function
+    %param_2 = OpVariable %_ptr_Function_int Function
+        %251 = OpLoad %int %h
+        %252 = OpAccessChain %_ptr_Private_int %obj %int_0 %251
+        %253 = OpLoad %int %252
+               OpStore %pivot %253
+        %254 = OpLoad %int %l
+        %255 = OpISub %int %254 %int_1
+               OpStore %i_0 %255
+        %256 = OpLoad %int %l
+               OpStore %j_0 %256
+               OpBranch %257
+        %257 = OpLabel
+               OpLoopMerge %258 %259 None
+               OpBranch %260
+        %260 = OpLabel
+        %261 = OpLoad %int %j_0
+        %262 = OpLoad %int %h
+        %263 = OpISub %int %262 %int_1
+        %264 = OpSLessThanEqual %bool %261 %263
+               OpBranchConditional %264 %265 %258
+        %265 = OpLabel
+        %266 = OpLoad %int %j_0
+        %267 = OpAccessChain %_ptr_Private_int %obj %int_0 %266
+        %268 = OpLoad %int %267
+        %269 = OpLoad %int %pivot
+        %270 = OpSLessThanEqual %bool %268 %269
+               OpSelectionMerge %271 None
+               OpBranchConditional %270 %272 %271
+        %272 = OpLabel
+        %273 = OpLoad %int %i_0
+        %274 = OpIAdd %int %273 %int_1
+               OpStore %i_0 %274
+        %275 = OpLoad %int %i_0
+               OpStore %param %275
+        %276 = OpLoad %int %j_0
+               OpStore %param_0 %276
+        %277 = OpFunctionCall %void %swap_i1_i1_ %param %param_0
+               OpBranch %271
+        %271 = OpLabel
+               OpBranch %259
+        %259 = OpLabel
+        %278 = OpLoad %int %j_0
+        %279 = OpIAdd %int %278 %int_1
+               OpStore %j_0 %279
+               OpBranch %257
+        %258 = OpLabel
+        %280 = OpLoad %int %i_0
+        %281 = OpIAdd %int %280 %int_1
+               OpStore %param_1 %281
+        %282 = OpLoad %int %h
+               OpStore %param_2 %282
+        %283 = OpFunctionCall %void %swap_i1_i1_ %param_1 %param_2
+        %284 = OpLoad %int %i_0
+        %285 = OpIAdd %int %284 %int_1
+               OpReturnValue %285
+               OpFunctionEnd
+ %quicksort_ = OpFunction %void None %38
+        %286 = OpLabel
+        %l_0 = OpVariable %_ptr_Function_int Function
+        %h_0 = OpVariable %_ptr_Function_int Function
+        %top = OpVariable %_ptr_Function_int Function
+      %stack = OpVariable %_ptr_Function__arr_int_uint_10 Function
+          %p = OpVariable %_ptr_Function_int Function
+    %param_3 = OpVariable %_ptr_Function_int Function
+    %param_4 = OpVariable %_ptr_Function_int Function
+               OpStore %l_0 %int_0
+               OpStore %h_0 %int_9
+               OpStore %top %int_n1
+        %287 = OpLoad %int %top
+        %288 = OpIAdd %int %287 %int_1
+               OpStore %top %288
+        %289 = OpLoad %int %l_0
+        %290 = OpAccessChain %_ptr_Function_int %stack %288
+               OpStore %290 %289
+        %291 = OpLoad %int %top
+        %292 = OpIAdd %int %291 %int_1
+               OpStore %top %292
+        %293 = OpLoad %int %h_0
+        %294 = OpAccessChain %_ptr_Function_int %stack %292
+               OpStore %294 %293
+               OpBranch %295
+        %295 = OpLabel
+               OpLoopMerge %296 %297 None
+               OpBranch %298
+        %298 = OpLabel
+        %299 = OpLoad %int %top
+        %300 = OpSGreaterThanEqual %bool %299 %int_0
+               OpBranchConditional %300 %301 %296
+        %301 = OpLabel
+        %302 = OpLoad %int %top
+        %303 = OpISub %int %302 %int_1
+               OpStore %top %303
+        %304 = OpAccessChain %_ptr_Function_int %stack %302
+        %305 = OpLoad %int %304
+               OpStore %h_0 %305
+        %306 = OpLoad %int %top
+        %307 = OpISub %int %306 %int_1
+               OpStore %top %307
+        %308 = OpAccessChain %_ptr_Function_int %stack %306
+        %309 = OpLoad %int %308
+               OpStore %l_0 %309
+        %310 = OpLoad %int %l_0
+               OpStore %param_3 %310
+        %311 = OpLoad %int %h_0
+               OpStore %param_4 %311
+        %312 = OpFunctionCall %int %performPartition_i1_i1_ %param_3 %param_4
+               OpStore %p %312
+        %313 = OpLoad %int %p
+        %314 = OpISub %int %313 %int_1
+        %315 = OpLoad %int %l_0
+        %316 = OpSGreaterThan %bool %314 %315
+               OpSelectionMerge %317 None
+               OpBranchConditional %316 %318 %317
+        %318 = OpLabel
+        %319 = OpLoad %int %top
+        %320 = OpIAdd %int %319 %int_1
+               OpStore %top %320
+        %321 = OpLoad %int %l_0
+        %322 = OpAccessChain %_ptr_Function_int %stack %320
+               OpStore %322 %321
+        %323 = OpLoad %int %top
+        %324 = OpIAdd %int %323 %int_1
+               OpStore %top %324
+        %325 = OpLoad %int %p
+        %326 = OpISub %int %325 %int_1
+        %327 = OpAccessChain %_ptr_Function_int %stack %324
+               OpStore %327 %326
+               OpBranch %317
+        %317 = OpLabel
+        %328 = OpLoad %int %p
+        %329 = OpIAdd %int %328 %int_1
+        %330 = OpLoad %int %h_0
+        %331 = OpSLessThan %bool %329 %330
+               OpSelectionMerge %332 None
+               OpBranchConditional %331 %333 %332
+        %333 = OpLabel
+        %334 = OpLoad %int %top
+        %335 = OpIAdd %int %334 %int_1
+               OpStore %top %335
+        %336 = OpLoad %int %p
+        %337 = OpIAdd %int %336 %int_1
+        %338 = OpAccessChain %_ptr_Function_int %stack %335
+               OpStore %338 %337
+        %339 = OpLoad %int %top
+        %340 = OpIAdd %int %339 %int_1
+               OpStore %top %340
+        %341 = OpLoad %int %h_0
+        %342 = OpAccessChain %_ptr_Function_int %stack %340
+               OpStore %342 %341
+               OpBranch %332
+        %332 = OpLabel
+               OpBranch %297
+        %297 = OpLabel
+               OpBranch %295
+        %296 = OpLabel
+               OpReturn
+               OpFunctionEnd
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
new file mode 100644
index 0000000..a320629
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,219 @@
+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;
+  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;
+  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;
+  {
+    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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 x_GLF_pos_param = tint_symbol.x_GLF_pos_param;
+  x_GLF_pos = x_GLF_pos_param;
+  main_1();
+  const main_out tint_symbol_3 = {frag_color, gl_Position};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.frag_color_1, tint_symbol_3.gl_Position};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..f82023b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/0-opt.spvasm.expected.msl
@@ -0,0 +1,266 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct QuicksortObject {
+  tint_array_wrapper numbers;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 frag_color_1;
+  float4 gl_Position;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_pos_param [[attribute(0)]];
+};
+struct tint_symbol_3 {
+  float4 frag_color_1 [[user(locn0)]];
+  float4 gl_Position [[position]];
+};
+
+void swap_i1_i1_(thread int* const i, thread int* const j, thread QuicksortObject* const tint_symbol_6) {
+  int temp = 0;
+  int const x_239 = *(i);
+  int const x_241 = (*(tint_symbol_6)).numbers.arr[x_239];
+  temp = x_241;
+  int const x_242 = *(i);
+  int const x_243 = *(j);
+  int const x_245 = (*(tint_symbol_6)).numbers.arr[x_243];
+  (*(tint_symbol_6)).numbers.arr[x_242] = x_245;
+  int const x_247 = *(j);
+  int const x_248 = temp;
+  (*(tint_symbol_6)).numbers.arr[x_247] = x_248;
+  return;
+}
+
+int performPartition_i1_i1_(thread int* const l, thread int* const h, thread QuicksortObject* const tint_symbol_7) {
+  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;
+  int const x_251 = *(h);
+  int const x_253 = (*(tint_symbol_7)).numbers.arr[x_251];
+  pivot = x_253;
+  int const x_254 = *(l);
+  i_1 = (x_254 - 1);
+  int const x_256 = *(l);
+  j_1 = x_256;
+  while (true) {
+    int const x_261 = j_1;
+    int const x_262 = *(h);
+    if ((x_261 <= (x_262 - 1))) {
+    } else {
+      break;
+    }
+    int const x_266 = j_1;
+    int const x_268 = (*(tint_symbol_7)).numbers.arr[x_266];
+    int const x_269 = pivot;
+    if ((x_268 <= x_269)) {
+      int const x_273 = i_1;
+      i_1 = (x_273 + 1);
+      int const x_275 = i_1;
+      param = x_275;
+      int const x_276 = j_1;
+      param_1 = x_276;
+      swap_i1_i1_(&(param), &(param_1), tint_symbol_7);
+    }
+    {
+      int const x_278 = j_1;
+      j_1 = (x_278 + 1);
+    }
+  }
+  int const x_280 = i_1;
+  param_2 = (x_280 + 1);
+  int const x_282 = *(h);
+  param_3 = x_282;
+  swap_i1_i1_(&(param_2), &(param_3), tint_symbol_7);
+  int const x_284 = i_1;
+  return (x_284 + 1);
+}
+
+void quicksort_(thread QuicksortObject* const tint_symbol_8) {
+  int l_1 = 0;
+  int h_1 = 0;
+  int top = 0;
+  tint_array_wrapper stack = {};
+  int p = 0;
+  int param_4 = 0;
+  int param_5 = 0;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  int const x_287 = top;
+  int const x_288 = (x_287 + 1);
+  top = x_288;
+  int const x_289 = l_1;
+  stack.arr[x_288] = x_289;
+  int const x_291 = top;
+  int const x_292 = (x_291 + 1);
+  top = x_292;
+  int const x_293 = h_1;
+  stack.arr[x_292] = x_293;
+  while (true) {
+    int const x_299 = top;
+    if ((x_299 >= 0)) {
+    } else {
+      break;
+    }
+    int const x_302 = top;
+    top = (x_302 - 1);
+    int const x_305 = stack.arr[x_302];
+    h_1 = x_305;
+    int const x_306 = top;
+    top = (x_306 - 1);
+    int const x_309 = stack.arr[x_306];
+    l_1 = x_309;
+    int const x_310 = l_1;
+    param_4 = x_310;
+    int const x_311 = h_1;
+    param_5 = x_311;
+    int const x_312 = performPartition_i1_i1_(&(param_4), &(param_5), tint_symbol_8);
+    p = x_312;
+    int const x_313 = p;
+    int const x_315 = l_1;
+    if (((x_313 - 1) > x_315)) {
+      int const x_319 = top;
+      int const x_320 = (x_319 + 1);
+      top = x_320;
+      int const x_321 = l_1;
+      stack.arr[x_320] = x_321;
+      int const x_323 = top;
+      int const x_324 = (x_323 + 1);
+      top = x_324;
+      int const x_325 = p;
+      stack.arr[x_324] = (x_325 - 1);
+    }
+    int const x_328 = p;
+    int const x_330 = h_1;
+    if (((x_328 + 1) < x_330)) {
+      int const x_334 = top;
+      int const x_335 = (x_334 + 1);
+      top = x_335;
+      int const x_336 = p;
+      stack.arr[x_335] = (x_336 + 1);
+      int const x_339 = top;
+      int const x_340 = (x_339 + 1);
+      top = x_340;
+      int const x_341 = h_1;
+      stack.arr[x_340] = x_341;
+    }
+  }
+  return;
+}
+
+void main_1(constant buf0& x_34, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10, thread QuicksortObject* const tint_symbol_11, thread float4* const tint_symbol_12, thread float4* const tint_symbol_13) {
+  int i_2 = 0;
+  float2 uv = 0.0f;
+  float3 color = 0.0f;
+  float4 const x_90 = *(tint_symbol_9);
+  *(tint_symbol_10) = ((x_90 + float4(1.0f, 1.0f, 0.0f, 0.0f)) * float4(128.0f, 128.0f, 1.0f, 1.0f));
+  i_2 = 0;
+  while (true) {
+    int const x_97 = i_2;
+    if ((x_97 < 10)) {
+    } else {
+      break;
+    }
+    int const x_100 = i_2;
+    int const x_101 = i_2;
+    (*(tint_symbol_11)).numbers.arr[x_100] = (10 - x_101);
+    int const x_104 = i_2;
+    int const x_105 = i_2;
+    int const x_107 = (*(tint_symbol_11)).numbers.arr[x_105];
+    int const x_108 = i_2;
+    int const x_110 = (*(tint_symbol_11)).numbers.arr[x_108];
+    (*(tint_symbol_11)).numbers.arr[x_104] = (x_107 * x_110);
+    {
+      int const x_113 = i_2;
+      i_2 = (x_113 + 1);
+    }
+  }
+  quicksort_(tint_symbol_11);
+  float4 const x_116 = *(tint_symbol_10);
+  float2 const x_119 = x_34.resolution;
+  uv = (float2(x_116.x, x_116.y) / x_119);
+  color = float3(1.0f, 2.0f, 3.0f);
+  int const x_122 = (*(tint_symbol_11)).numbers.arr[0];
+  float const x_125 = color.x;
+  color.x = (x_125 + float(x_122));
+  float const x_129 = uv.x;
+  if ((x_129 > 0.25f)) {
+    int const x_134 = (*(tint_symbol_11)).numbers.arr[1];
+    float const x_137 = color.x;
+    color.x = (x_137 + float(x_134));
+  }
+  float const x_141 = uv.x;
+  if ((x_141 > 0.5f)) {
+    int const x_146 = (*(tint_symbol_11)).numbers.arr[2];
+    float const x_149 = color.y;
+    color.y = (x_149 + float(x_146));
+  }
+  float const x_153 = uv.x;
+  if ((x_153 > 0.75f)) {
+    int const x_158 = (*(tint_symbol_11)).numbers.arr[3];
+    float const x_161 = color.z;
+    color.z = (x_161 + float(x_158));
+  }
+  int const x_165 = (*(tint_symbol_11)).numbers.arr[4];
+  float const x_168 = color.y;
+  color.y = (x_168 + float(x_165));
+  float const x_172 = uv.y;
+  if ((x_172 > 0.25f)) {
+    int const x_177 = (*(tint_symbol_11)).numbers.arr[5];
+    float const x_180 = color.x;
+    color.x = (x_180 + float(x_177));
+  }
+  float const x_184 = uv.y;
+  if ((x_184 > 0.5f)) {
+    int const x_189 = (*(tint_symbol_11)).numbers.arr[6];
+    float const x_192 = color.y;
+    color.y = (x_192 + float(x_189));
+  }
+  float const x_196 = uv.y;
+  if ((x_196 > 0.75f)) {
+    int const x_201 = (*(tint_symbol_11)).numbers.arr[7];
+    float const x_204 = color.z;
+    color.z = (x_204 + float(x_201));
+  }
+  int const x_208 = (*(tint_symbol_11)).numbers.arr[8];
+  float const x_211 = color.z;
+  color.z = (x_211 + float(x_208));
+  float const x_215 = uv.x;
+  float const x_217 = uv.y;
+  if ((fabs((x_215 - x_217)) < 0.25f)) {
+    int const x_224 = (*(tint_symbol_11)).numbers.arr[9];
+    float const x_227 = color.x;
+    color.x = (x_227 + float(x_224));
+  }
+  float3 const x_230 = color;
+  float3 const x_231 = normalize(x_230);
+  *(tint_symbol_12) = float4(x_231.x, x_231.y, x_231.z, 1.0f);
+  float4 const x_236 = *(tint_symbol_9);
+  *(tint_symbol_13) = x_236;
+  return;
+}
+
+vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]], constant buf0& x_34 [[buffer(0)]]) {
+  thread float4 tint_symbol_14 = 0.0f;
+  thread float4 tint_symbol_15 = 0.0f;
+  thread QuicksortObject tint_symbol_16 = {};
+  thread float4 tint_symbol_17 = 0.0f;
+  thread float4 tint_symbol_18 = 0.0f;
+  float4 const x_GLF_pos_param = tint_symbol_1.x_GLF_pos_param;
+  tint_symbol_14 = x_GLF_pos_param;
+  main_1(x_34, &(tint_symbol_14), &(tint_symbol_15), &(tint_symbol_16), &(tint_symbol_17), &(tint_symbol_18));
+  main_out const tint_symbol_4 = {.frag_color_1=tint_symbol_17, .gl_Position=tint_symbol_18};
+  tint_symbol_3 const tint_symbol_5 = {.frag_color_1=tint_symbol_4.frag_color_1, .gl_Position=tint_symbol_4.gl_Position};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..db05970
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,567 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 390
+; Schema: 0
+               OpCapability Shader
+        %356 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %tint_pointsize %tint_symbol %tint_symbol_2 %tint_symbol_3
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %QuicksortObject "QuicksortObject"
+               OpMemberName %QuicksortObject 0 "numbers"
+               OpName %obj "obj"
+               OpName %x_GLF_FragCoord "x_GLF_FragCoord"
+               OpName %x_GLF_pos "x_GLF_pos"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_34 "x_34"
+               OpName %frag_color "frag_color"
+               OpName %gl_Position "gl_Position"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %swap_i1_i1_ "swap_i1_i1_"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %temp "temp"
+               OpName %performPartition_i1_i1_ "performPartition_i1_i1_"
+               OpName %l "l"
+               OpName %h "h"
+               OpName %pivot "pivot"
+               OpName %i_1 "i_1"
+               OpName %j_1 "j_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %quicksort_ "quicksort_"
+               OpName %l_1 "l_1"
+               OpName %h_1 "h_1"
+               OpName %top "top"
+               OpName %stack "stack"
+               OpName %p "p"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpName %main_1 "main_1"
+               OpName %i_2 "i_2"
+               OpName %uv "uv"
+               OpName %color "color"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "frag_color_1"
+               OpMemberName %main_out 1 "gl_Position"
+               OpName %tint_symbol_4 "tint_symbol_4"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpMemberDecorate %QuicksortObject 0 Offset 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_34 NonWritable
+               OpDecorate %x_34 DescriptorSet 0
+               OpDecorate %x_34 Binding 0
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %tint_symbol_3 BuiltIn Position
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%QuicksortObject = OpTypeStruct %_arr_int_uint_10
+%_ptr_Private_QuicksortObject = OpTypePointer Private %QuicksortObject
+         %12 = OpConstantNull %QuicksortObject
+        %obj = OpVariable %_ptr_Private_QuicksortObject Private %12
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_FragCoord = OpVariable %_ptr_Private_v4float Private %16
+  %x_GLF_pos = OpVariable %_ptr_Private_v4float Private %16
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_34 = OpVariable %_ptr_Uniform_buf0 Uniform
+ %frag_color = OpVariable %_ptr_Private_v4float Private %16
+%gl_Position = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %16
+%tint_symbol_3 = OpVariable %_ptr_Output_v4float Output %16
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+         %37 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_int = OpTypePointer Private %int
+         %55 = OpTypeFunction %int %_ptr_Function_int %_ptr_Function_int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+        %115 = OpTypeFunction %void
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+        %123 = OpConstantNull %_arr_int_uint_10
+      %int_0 = OpConstant %int 0
+      %int_9 = OpConstant %int 9
+     %int_n1 = OpConstant %int -1
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+        %195 = OpConstantNull %v2float
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+        %199 = OpConstantNull %v3float
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+        %203 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_0
+  %float_128 = OpConstant %float 128
+        %206 = OpConstantComposite %v4float %float_128 %float_128 %float_1 %float_1
+     %int_10 = OpConstant %int 10
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+        %244 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+%_ptr_Function_float = OpTypePointer Function %float
+ %float_0_25 = OpConstant %float 0.25
+  %float_0_5 = OpConstant %float 0.5
+      %int_2 = OpConstant %int 2
+     %uint_1 = OpConstant %uint 1
+ %float_0_75 = OpConstant %float 0.75
+      %int_3 = OpConstant %int 3
+     %uint_2 = OpConstant %uint 2
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+   %main_out = OpTypeStruct %v4float %v4float
+        %375 = OpTypeFunction %void %main_out
+%swap_i1_i1_ = OpFunction %void None %29
+          %i = OpFunctionParameter %_ptr_Function_int
+          %j = OpFunctionParameter %_ptr_Function_int
+         %35 = OpLabel
+       %temp = OpVariable %_ptr_Function_int Function %37
+         %39 = OpLoad %int %i
+         %42 = OpAccessChain %_ptr_Private_int %obj %uint_0 %39
+         %43 = OpLoad %int %42
+               OpStore %temp %43
+         %45 = OpLoad %int %i
+         %47 = OpLoad %int %j
+         %48 = OpAccessChain %_ptr_Private_int %obj %uint_0 %47
+         %49 = OpLoad %int %48
+         %50 = OpAccessChain %_ptr_Private_int %obj %uint_0 %45
+               OpStore %50 %49
+         %52 = OpLoad %int %j
+         %53 = OpLoad %int %temp
+         %54 = OpAccessChain %_ptr_Private_int %obj %uint_0 %52
+               OpStore %54 %53
+               OpReturn
+               OpFunctionEnd
+%performPartition_i1_i1_ = OpFunction %int None %55
+          %l = OpFunctionParameter %_ptr_Function_int
+          %h = OpFunctionParameter %_ptr_Function_int
+         %59 = OpLabel
+      %pivot = OpVariable %_ptr_Function_int Function %37
+        %i_1 = OpVariable %_ptr_Function_int Function %37
+        %j_1 = OpVariable %_ptr_Function_int Function %37
+      %param = OpVariable %_ptr_Function_int Function %37
+    %param_1 = OpVariable %_ptr_Function_int Function %37
+    %param_2 = OpVariable %_ptr_Function_int Function %37
+    %param_3 = OpVariable %_ptr_Function_int Function %37
+         %68 = OpLoad %int %h
+         %69 = OpAccessChain %_ptr_Private_int %obj %uint_0 %68
+         %70 = OpLoad %int %69
+               OpStore %pivot %70
+         %72 = OpLoad %int %l
+         %74 = OpISub %int %72 %int_1
+               OpStore %i_1 %74
+         %76 = OpLoad %int %l
+               OpStore %j_1 %76
+               OpBranch %77
+         %77 = OpLabel
+               OpLoopMerge %78 %79 None
+               OpBranch %80
+         %80 = OpLabel
+         %81 = OpLoad %int %j_1
+         %83 = OpLoad %int %h
+         %84 = OpISub %int %83 %int_1
+         %85 = OpSLessThanEqual %bool %81 %84
+               OpSelectionMerge %87 None
+               OpBranchConditional %85 %88 %89
+         %88 = OpLabel
+               OpBranch %87
+         %89 = OpLabel
+               OpBranch %78
+         %87 = OpLabel
+         %90 = OpLoad %int %j_1
+         %91 = OpAccessChain %_ptr_Private_int %obj %uint_0 %90
+         %92 = OpLoad %int %91
+         %93 = OpLoad %int %pivot
+         %94 = OpSLessThanEqual %bool %92 %93
+               OpSelectionMerge %95 None
+               OpBranchConditional %94 %96 %95
+         %96 = OpLabel
+         %97 = OpLoad %int %i_1
+         %98 = OpIAdd %int %97 %int_1
+               OpStore %i_1 %98
+         %99 = OpLoad %int %i_1
+               OpStore %param %99
+        %100 = OpLoad %int %j_1
+               OpStore %param_1 %100
+        %101 = OpFunctionCall %void %swap_i1_i1_ %param %param_1
+               OpBranch %95
+         %95 = OpLabel
+               OpBranch %79
+         %79 = OpLabel
+        %104 = OpLoad %int %j_1
+        %105 = OpIAdd %int %104 %int_1
+               OpStore %j_1 %105
+               OpBranch %77
+         %78 = OpLabel
+        %106 = OpLoad %int %i_1
+        %107 = OpIAdd %int %106 %int_1
+               OpStore %param_2 %107
+        %109 = OpLoad %int %h
+               OpStore %param_3 %109
+        %110 = OpFunctionCall %void %swap_i1_i1_ %param_2 %param_3
+        %113 = OpLoad %int %i_1
+        %114 = OpIAdd %int %113 %int_1
+               OpReturnValue %114
+               OpFunctionEnd
+ %quicksort_ = OpFunction %void None %115
+        %117 = OpLabel
+        %l_1 = OpVariable %_ptr_Function_int Function %37
+        %h_1 = OpVariable %_ptr_Function_int Function %37
+        %top = OpVariable %_ptr_Function_int Function %37
+      %stack = OpVariable %_ptr_Function__arr_int_uint_10 Function %123
+          %p = OpVariable %_ptr_Function_int Function %37
+    %param_4 = OpVariable %_ptr_Function_int Function %37
+    %param_5 = OpVariable %_ptr_Function_int Function %37
+               OpStore %l_1 %int_0
+               OpStore %h_1 %int_9
+               OpStore %top %int_n1
+        %130 = OpLoad %int %top
+        %131 = OpIAdd %int %130 %int_1
+               OpStore %top %131
+        %132 = OpLoad %int %l_1
+        %133 = OpAccessChain %_ptr_Function_int %stack %131
+               OpStore %133 %132
+        %134 = OpLoad %int %top
+        %135 = OpIAdd %int %134 %int_1
+               OpStore %top %135
+        %136 = OpLoad %int %h_1
+        %137 = OpAccessChain %_ptr_Function_int %stack %135
+               OpStore %137 %136
+               OpBranch %138
+        %138 = OpLabel
+               OpLoopMerge %139 %140 None
+               OpBranch %141
+        %141 = OpLabel
+        %142 = OpLoad %int %top
+        %143 = OpSGreaterThanEqual %bool %142 %int_0
+               OpSelectionMerge %144 None
+               OpBranchConditional %143 %145 %146
+        %145 = OpLabel
+               OpBranch %144
+        %146 = OpLabel
+               OpBranch %139
+        %144 = OpLabel
+        %147 = OpLoad %int %top
+        %148 = OpISub %int %147 %int_1
+               OpStore %top %148
+        %149 = OpAccessChain %_ptr_Function_int %stack %147
+        %150 = OpLoad %int %149
+               OpStore %h_1 %150
+        %151 = OpLoad %int %top
+        %152 = OpISub %int %151 %int_1
+               OpStore %top %152
+        %153 = OpAccessChain %_ptr_Function_int %stack %151
+        %154 = OpLoad %int %153
+               OpStore %l_1 %154
+        %155 = OpLoad %int %l_1
+               OpStore %param_4 %155
+        %156 = OpLoad %int %h_1
+               OpStore %param_5 %156
+        %157 = OpFunctionCall %int %performPartition_i1_i1_ %param_4 %param_5
+               OpStore %p %157
+        %160 = OpLoad %int %p
+        %161 = OpLoad %int %l_1
+        %162 = OpISub %int %160 %int_1
+        %163 = OpSGreaterThan %bool %162 %161
+               OpSelectionMerge %164 None
+               OpBranchConditional %163 %165 %164
+        %165 = OpLabel
+        %166 = OpLoad %int %top
+        %167 = OpIAdd %int %166 %int_1
+               OpStore %top %167
+        %168 = OpLoad %int %l_1
+        %169 = OpAccessChain %_ptr_Function_int %stack %167
+               OpStore %169 %168
+        %170 = OpLoad %int %top
+        %171 = OpIAdd %int %170 %int_1
+               OpStore %top %171
+        %172 = OpLoad %int %p
+        %173 = OpAccessChain %_ptr_Function_int %stack %171
+        %174 = OpISub %int %172 %int_1
+               OpStore %173 %174
+               OpBranch %164
+        %164 = OpLabel
+        %175 = OpLoad %int %p
+        %176 = OpLoad %int %h_1
+        %177 = OpIAdd %int %175 %int_1
+        %178 = OpSLessThan %bool %177 %176
+               OpSelectionMerge %179 None
+               OpBranchConditional %178 %180 %179
+        %180 = OpLabel
+        %181 = OpLoad %int %top
+        %182 = OpIAdd %int %181 %int_1
+               OpStore %top %182
+        %183 = OpLoad %int %p
+        %184 = OpAccessChain %_ptr_Function_int %stack %182
+        %185 = OpIAdd %int %183 %int_1
+               OpStore %184 %185
+        %186 = OpLoad %int %top
+        %187 = OpIAdd %int %186 %int_1
+               OpStore %top %187
+        %188 = OpLoad %int %h_1
+        %189 = OpAccessChain %_ptr_Function_int %stack %187
+               OpStore %189 %188
+               OpBranch %179
+        %179 = OpLabel
+               OpBranch %140
+        %140 = OpLabel
+               OpBranch %138
+        %139 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %115
+        %191 = OpLabel
+        %i_2 = OpVariable %_ptr_Function_int Function %37
+         %uv = OpVariable %_ptr_Function_v2float Function %195
+      %color = OpVariable %_ptr_Function_v3float Function %199
+        %200 = OpLoad %v4float %x_GLF_pos
+        %204 = OpFAdd %v4float %200 %203
+        %207 = OpFMul %v4float %204 %206
+               OpStore %x_GLF_FragCoord %207
+               OpStore %i_2 %int_0
+               OpBranch %208
+        %208 = OpLabel
+               OpLoopMerge %209 %210 None
+               OpBranch %211
+        %211 = OpLabel
+        %212 = OpLoad %int %i_2
+        %214 = OpSLessThan %bool %212 %int_10
+               OpSelectionMerge %215 None
+               OpBranchConditional %214 %216 %217
+        %216 = OpLabel
+               OpBranch %215
+        %217 = OpLabel
+               OpBranch %209
+        %215 = OpLabel
+        %218 = OpLoad %int %i_2
+        %219 = OpLoad %int %i_2
+        %220 = OpAccessChain %_ptr_Private_int %obj %uint_0 %218
+        %221 = OpISub %int %int_10 %219
+               OpStore %220 %221
+        %222 = OpLoad %int %i_2
+        %223 = OpLoad %int %i_2
+        %224 = OpAccessChain %_ptr_Private_int %obj %uint_0 %223
+        %225 = OpLoad %int %224
+        %226 = OpLoad %int %i_2
+        %227 = OpAccessChain %_ptr_Private_int %obj %uint_0 %226
+        %228 = OpLoad %int %227
+        %229 = OpAccessChain %_ptr_Private_int %obj %uint_0 %222
+        %230 = OpIMul %int %225 %228
+               OpStore %229 %230
+               OpBranch %210
+        %210 = OpLabel
+        %231 = OpLoad %int %i_2
+        %232 = OpIAdd %int %231 %int_1
+               OpStore %i_2 %232
+               OpBranch %208
+        %209 = OpLabel
+        %233 = OpFunctionCall %void %quicksort_
+        %234 = OpLoad %v4float %x_GLF_FragCoord
+        %236 = OpAccessChain %_ptr_Uniform_v2float %x_34 %uint_0
+        %237 = OpLoad %v2float %236
+        %238 = OpCompositeExtract %float %234 0
+        %239 = OpCompositeExtract %float %234 1
+        %240 = OpCompositeConstruct %v2float %238 %239
+        %241 = OpFDiv %v2float %240 %237
+               OpStore %uv %241
+               OpStore %color %244
+        %245 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_0
+        %246 = OpLoad %int %245
+        %248 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %249 = OpLoad %float %248
+        %250 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %251 = OpConvertSToF %float %246
+        %252 = OpFAdd %float %249 %251
+               OpStore %250 %252
+        %253 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %254 = OpLoad %float %253
+        %256 = OpFOrdGreaterThan %bool %254 %float_0_25
+               OpSelectionMerge %257 None
+               OpBranchConditional %256 %258 %257
+        %258 = OpLabel
+        %259 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_1
+        %260 = OpLoad %int %259
+        %261 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %262 = OpLoad %float %261
+        %263 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %264 = OpConvertSToF %float %260
+        %265 = OpFAdd %float %262 %264
+               OpStore %263 %265
+               OpBranch %257
+        %257 = OpLabel
+        %266 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %267 = OpLoad %float %266
+        %269 = OpFOrdGreaterThan %bool %267 %float_0_5
+               OpSelectionMerge %270 None
+               OpBranchConditional %269 %271 %270
+        %271 = OpLabel
+        %273 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_2
+        %274 = OpLoad %int %273
+        %276 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %277 = OpLoad %float %276
+        %278 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %279 = OpConvertSToF %float %274
+        %280 = OpFAdd %float %277 %279
+               OpStore %278 %280
+               OpBranch %270
+        %270 = OpLabel
+        %281 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %282 = OpLoad %float %281
+        %284 = OpFOrdGreaterThan %bool %282 %float_0_75
+               OpSelectionMerge %285 None
+               OpBranchConditional %284 %286 %285
+        %286 = OpLabel
+        %288 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_3
+        %289 = OpLoad %int %288
+        %291 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %292 = OpLoad %float %291
+        %293 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %294 = OpConvertSToF %float %289
+        %295 = OpFAdd %float %292 %294
+               OpStore %293 %295
+               OpBranch %285
+        %285 = OpLabel
+        %297 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_4
+        %298 = OpLoad %int %297
+        %299 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %300 = OpLoad %float %299
+        %301 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %302 = OpConvertSToF %float %298
+        %303 = OpFAdd %float %300 %302
+               OpStore %301 %303
+        %304 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %305 = OpLoad %float %304
+        %306 = OpFOrdGreaterThan %bool %305 %float_0_25
+               OpSelectionMerge %307 None
+               OpBranchConditional %306 %308 %307
+        %308 = OpLabel
+        %310 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_5
+        %311 = OpLoad %int %310
+        %312 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %313 = OpLoad %float %312
+        %314 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %315 = OpConvertSToF %float %311
+        %316 = OpFAdd %float %313 %315
+               OpStore %314 %316
+               OpBranch %307
+        %307 = OpLabel
+        %317 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %318 = OpLoad %float %317
+        %319 = OpFOrdGreaterThan %bool %318 %float_0_5
+               OpSelectionMerge %320 None
+               OpBranchConditional %319 %321 %320
+        %321 = OpLabel
+        %323 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_6
+        %324 = OpLoad %int %323
+        %325 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %326 = OpLoad %float %325
+        %327 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %328 = OpConvertSToF %float %324
+        %329 = OpFAdd %float %326 %328
+               OpStore %327 %329
+               OpBranch %320
+        %320 = OpLabel
+        %330 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %331 = OpLoad %float %330
+        %332 = OpFOrdGreaterThan %bool %331 %float_0_75
+               OpSelectionMerge %333 None
+               OpBranchConditional %332 %334 %333
+        %334 = OpLabel
+        %336 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_7
+        %337 = OpLoad %int %336
+        %338 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %339 = OpLoad %float %338
+        %340 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %341 = OpConvertSToF %float %337
+        %342 = OpFAdd %float %339 %341
+               OpStore %340 %342
+               OpBranch %333
+        %333 = OpLabel
+        %344 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_8
+        %345 = OpLoad %int %344
+        %346 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %347 = OpLoad %float %346
+        %348 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %349 = OpConvertSToF %float %345
+        %350 = OpFAdd %float %347 %349
+               OpStore %348 %350
+        %351 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %352 = OpLoad %float %351
+        %353 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %354 = OpLoad %float %353
+        %357 = OpFSub %float %352 %354
+        %355 = OpExtInst %float %356 FAbs %357
+        %358 = OpFOrdLessThan %bool %355 %float_0_25
+               OpSelectionMerge %359 None
+               OpBranchConditional %358 %360 %359
+        %360 = OpLabel
+        %361 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_9
+        %362 = OpLoad %int %361
+        %363 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %364 = OpLoad %float %363
+        %365 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %366 = OpConvertSToF %float %362
+        %367 = OpFAdd %float %364 %366
+               OpStore %365 %367
+               OpBranch %359
+        %359 = OpLabel
+        %368 = OpLoad %v3float %color
+        %369 = OpExtInst %v3float %356 Normalize %368
+        %370 = OpCompositeExtract %float %369 0
+        %371 = OpCompositeExtract %float %369 1
+        %372 = OpCompositeExtract %float %369 2
+        %373 = OpCompositeConstruct %v4float %370 %371 %372 %float_1
+               OpStore %frag_color %373
+        %374 = OpLoad %v4float %x_GLF_pos
+               OpStore %gl_Position %374
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_4 = OpFunction %void None %375
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %379 = OpLabel
+        %380 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %380
+        %381 = OpCompositeExtract %v4float %tint_symbol_1 1
+               OpStore %tint_symbol_3 %381
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %115
+        %383 = OpLabel
+               OpStore %tint_pointsize %float_1
+        %384 = OpLoad %v4float %tint_symbol
+               OpStore %x_GLF_pos %384
+        %385 = OpFunctionCall %void %main_1
+        %387 = OpLoad %v4float %frag_color
+        %388 = OpLoad %v4float %gl_Position
+        %389 = OpCompositeConstruct %main_out %387 %388
+        %386 = OpFunctionCall %void %tint_symbol_4 %389
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..134b77f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,264 @@
+struct QuicksortObject {
+  numbers : array<i32, 10>;
+};
+
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> obj : QuicksortObject;
+
+var<private> x_GLF_FragCoord : vec4<f32>;
+
+var<private> x_GLF_pos : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_34 : buf0;
+
+var<private> frag_color : vec4<f32>;
+
+var<private> gl_Position : vec4<f32>;
+
+fn swap_i1_i1_(i : ptr<function, i32>, j : ptr<function, i32>) {
+  var temp : i32;
+  let x_239 : i32 = *(i);
+  let x_241 : i32 = obj.numbers[x_239];
+  temp = x_241;
+  let x_242 : i32 = *(i);
+  let x_243 : i32 = *(j);
+  let x_245 : i32 = obj.numbers[x_243];
+  obj.numbers[x_242] = x_245;
+  let x_247 : i32 = *(j);
+  let x_248 : i32 = temp;
+  obj.numbers[x_247] = x_248;
+  return;
+}
+
+fn performPartition_i1_i1_(l : ptr<function, i32>, h : ptr<function, i32>) -> i32 {
+  var pivot : i32;
+  var i_1 : i32;
+  var j_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  var param_3 : i32;
+  let x_251 : i32 = *(h);
+  let x_253 : i32 = obj.numbers[x_251];
+  pivot = x_253;
+  let x_254 : i32 = *(l);
+  i_1 = (x_254 - 1);
+  let x_256 : i32 = *(l);
+  j_1 = x_256;
+  loop {
+    let x_261 : i32 = j_1;
+    let x_262 : i32 = *(h);
+    if ((x_261 <= (x_262 - 1))) {
+    } else {
+      break;
+    }
+    let x_266 : i32 = j_1;
+    let x_268 : i32 = obj.numbers[x_266];
+    let x_269 : i32 = pivot;
+    if ((x_268 <= x_269)) {
+      let x_273 : i32 = i_1;
+      i_1 = (x_273 + 1);
+      let x_275 : i32 = i_1;
+      param = x_275;
+      let x_276 : i32 = j_1;
+      param_1 = x_276;
+      swap_i1_i1_(&(param), &(param_1));
+    }
+
+    continuing {
+      let x_278 : i32 = j_1;
+      j_1 = (x_278 + 1);
+    }
+  }
+  let x_280 : i32 = i_1;
+  param_2 = (x_280 + 1);
+  let x_282 : i32 = *(h);
+  param_3 = x_282;
+  swap_i1_i1_(&(param_2), &(param_3));
+  let x_284 : i32 = i_1;
+  return (x_284 + 1);
+}
+
+fn quicksort_() {
+  var l_1 : i32;
+  var h_1 : i32;
+  var top : i32;
+  var stack : array<i32, 10>;
+  var p : i32;
+  var param_4 : i32;
+  var param_5 : i32;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  let x_287 : i32 = top;
+  let x_288 : i32 = (x_287 + 1);
+  top = x_288;
+  let x_289 : i32 = l_1;
+  stack[x_288] = x_289;
+  let x_291 : i32 = top;
+  let x_292 : i32 = (x_291 + 1);
+  top = x_292;
+  let x_293 : i32 = h_1;
+  stack[x_292] = x_293;
+  loop {
+    let x_299 : i32 = top;
+    if ((x_299 >= 0)) {
+    } else {
+      break;
+    }
+    let x_302 : i32 = top;
+    top = (x_302 - 1);
+    let x_305 : i32 = stack[x_302];
+    h_1 = x_305;
+    let x_306 : i32 = top;
+    top = (x_306 - 1);
+    let x_309 : i32 = stack[x_306];
+    l_1 = x_309;
+    let x_310 : i32 = l_1;
+    param_4 = x_310;
+    let x_311 : i32 = h_1;
+    param_5 = x_311;
+    let x_312 : i32 = performPartition_i1_i1_(&(param_4), &(param_5));
+    p = x_312;
+    let x_313 : i32 = p;
+    let x_315 : i32 = l_1;
+    if (((x_313 - 1) > x_315)) {
+      let x_319 : i32 = top;
+      let x_320 : i32 = (x_319 + 1);
+      top = x_320;
+      let x_321 : i32 = l_1;
+      stack[x_320] = x_321;
+      let x_323 : i32 = top;
+      let x_324 : i32 = (x_323 + 1);
+      top = x_324;
+      let x_325 : i32 = p;
+      stack[x_324] = (x_325 - 1);
+    }
+    let x_328 : i32 = p;
+    let x_330 : i32 = h_1;
+    if (((x_328 + 1) < x_330)) {
+      let x_334 : i32 = top;
+      let x_335 : i32 = (x_334 + 1);
+      top = x_335;
+      let x_336 : i32 = p;
+      stack[x_335] = (x_336 + 1);
+      let x_339 : i32 = top;
+      let x_340 : i32 = (x_339 + 1);
+      top = x_340;
+      let x_341 : i32 = h_1;
+      stack[x_340] = x_341;
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_2 : i32;
+  var uv : vec2<f32>;
+  var color : vec3<f32>;
+  let x_90 : vec4<f32> = x_GLF_pos;
+  x_GLF_FragCoord = ((x_90 + vec4<f32>(1.0, 1.0, 0.0, 0.0)) * vec4<f32>(128.0, 128.0, 1.0, 1.0));
+  i_2 = 0;
+  loop {
+    let x_97 : i32 = i_2;
+    if ((x_97 < 10)) {
+    } else {
+      break;
+    }
+    let x_100 : i32 = i_2;
+    let x_101 : i32 = i_2;
+    obj.numbers[x_100] = (10 - x_101);
+    let x_104 : i32 = i_2;
+    let x_105 : i32 = i_2;
+    let x_107 : i32 = obj.numbers[x_105];
+    let x_108 : i32 = i_2;
+    let x_110 : i32 = obj.numbers[x_108];
+    obj.numbers[x_104] = (x_107 * x_110);
+
+    continuing {
+      let x_113 : i32 = i_2;
+      i_2 = (x_113 + 1);
+    }
+  }
+  quicksort_();
+  let x_116 : vec4<f32> = x_GLF_FragCoord;
+  let x_119 : vec2<f32> = x_34.resolution;
+  uv = (vec2<f32>(x_116.x, x_116.y) / x_119);
+  color = vec3<f32>(1.0, 2.0, 3.0);
+  let x_122 : i32 = obj.numbers[0];
+  let x_125 : f32 = color.x;
+  color.x = (x_125 + f32(x_122));
+  let x_129 : f32 = uv.x;
+  if ((x_129 > 0.25)) {
+    let x_134 : i32 = obj.numbers[1];
+    let x_137 : f32 = color.x;
+    color.x = (x_137 + f32(x_134));
+  }
+  let x_141 : f32 = uv.x;
+  if ((x_141 > 0.5)) {
+    let x_146 : i32 = obj.numbers[2];
+    let x_149 : f32 = color.y;
+    color.y = (x_149 + f32(x_146));
+  }
+  let x_153 : f32 = uv.x;
+  if ((x_153 > 0.75)) {
+    let x_158 : i32 = obj.numbers[3];
+    let x_161 : f32 = color.z;
+    color.z = (x_161 + f32(x_158));
+  }
+  let x_165 : i32 = obj.numbers[4];
+  let x_168 : f32 = color.y;
+  color.y = (x_168 + f32(x_165));
+  let x_172 : f32 = uv.y;
+  if ((x_172 > 0.25)) {
+    let x_177 : i32 = obj.numbers[5];
+    let x_180 : f32 = color.x;
+    color.x = (x_180 + f32(x_177));
+  }
+  let x_184 : f32 = uv.y;
+  if ((x_184 > 0.5)) {
+    let x_189 : i32 = obj.numbers[6];
+    let x_192 : f32 = color.y;
+    color.y = (x_192 + f32(x_189));
+  }
+  let x_196 : f32 = uv.y;
+  if ((x_196 > 0.75)) {
+    let x_201 : i32 = obj.numbers[7];
+    let x_204 : f32 = color.z;
+    color.z = (x_204 + f32(x_201));
+  }
+  let x_208 : i32 = obj.numbers[8];
+  let x_211 : f32 = color.z;
+  color.z = (x_211 + f32(x_208));
+  let x_215 : f32 = uv.x;
+  let x_217 : f32 = uv.y;
+  if ((abs((x_215 - x_217)) < 0.25)) {
+    let x_224 : i32 = obj.numbers[9];
+    let x_227 : f32 = color.x;
+    color.x = (x_227 + f32(x_224));
+  }
+  let x_230 : vec3<f32> = color;
+  let x_231 : vec3<f32> = normalize(x_230);
+  frag_color = vec4<f32>(x_231.x, x_231.y, x_231.z, 1.0);
+  let x_236 : vec4<f32> = x_GLF_pos;
+  gl_Position = x_236;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  frag_color_1 : vec4<f32>;
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] x_GLF_pos_param : vec4<f32>) -> main_out {
+  x_GLF_pos = x_GLF_pos_param;
+  main_1();
+  return main_out(frag_color, gl_Position);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/0-opt.wgsl
new file mode 100644
index 0000000..134b77f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/0-opt.wgsl
@@ -0,0 +1,264 @@
+struct QuicksortObject {
+  numbers : array<i32, 10>;
+};
+
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> obj : QuicksortObject;
+
+var<private> x_GLF_FragCoord : vec4<f32>;
+
+var<private> x_GLF_pos : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_34 : buf0;
+
+var<private> frag_color : vec4<f32>;
+
+var<private> gl_Position : vec4<f32>;
+
+fn swap_i1_i1_(i : ptr<function, i32>, j : ptr<function, i32>) {
+  var temp : i32;
+  let x_239 : i32 = *(i);
+  let x_241 : i32 = obj.numbers[x_239];
+  temp = x_241;
+  let x_242 : i32 = *(i);
+  let x_243 : i32 = *(j);
+  let x_245 : i32 = obj.numbers[x_243];
+  obj.numbers[x_242] = x_245;
+  let x_247 : i32 = *(j);
+  let x_248 : i32 = temp;
+  obj.numbers[x_247] = x_248;
+  return;
+}
+
+fn performPartition_i1_i1_(l : ptr<function, i32>, h : ptr<function, i32>) -> i32 {
+  var pivot : i32;
+  var i_1 : i32;
+  var j_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  var param_3 : i32;
+  let x_251 : i32 = *(h);
+  let x_253 : i32 = obj.numbers[x_251];
+  pivot = x_253;
+  let x_254 : i32 = *(l);
+  i_1 = (x_254 - 1);
+  let x_256 : i32 = *(l);
+  j_1 = x_256;
+  loop {
+    let x_261 : i32 = j_1;
+    let x_262 : i32 = *(h);
+    if ((x_261 <= (x_262 - 1))) {
+    } else {
+      break;
+    }
+    let x_266 : i32 = j_1;
+    let x_268 : i32 = obj.numbers[x_266];
+    let x_269 : i32 = pivot;
+    if ((x_268 <= x_269)) {
+      let x_273 : i32 = i_1;
+      i_1 = (x_273 + 1);
+      let x_275 : i32 = i_1;
+      param = x_275;
+      let x_276 : i32 = j_1;
+      param_1 = x_276;
+      swap_i1_i1_(&(param), &(param_1));
+    }
+
+    continuing {
+      let x_278 : i32 = j_1;
+      j_1 = (x_278 + 1);
+    }
+  }
+  let x_280 : i32 = i_1;
+  param_2 = (x_280 + 1);
+  let x_282 : i32 = *(h);
+  param_3 = x_282;
+  swap_i1_i1_(&(param_2), &(param_3));
+  let x_284 : i32 = i_1;
+  return (x_284 + 1);
+}
+
+fn quicksort_() {
+  var l_1 : i32;
+  var h_1 : i32;
+  var top : i32;
+  var stack : array<i32, 10>;
+  var p : i32;
+  var param_4 : i32;
+  var param_5 : i32;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  let x_287 : i32 = top;
+  let x_288 : i32 = (x_287 + 1);
+  top = x_288;
+  let x_289 : i32 = l_1;
+  stack[x_288] = x_289;
+  let x_291 : i32 = top;
+  let x_292 : i32 = (x_291 + 1);
+  top = x_292;
+  let x_293 : i32 = h_1;
+  stack[x_292] = x_293;
+  loop {
+    let x_299 : i32 = top;
+    if ((x_299 >= 0)) {
+    } else {
+      break;
+    }
+    let x_302 : i32 = top;
+    top = (x_302 - 1);
+    let x_305 : i32 = stack[x_302];
+    h_1 = x_305;
+    let x_306 : i32 = top;
+    top = (x_306 - 1);
+    let x_309 : i32 = stack[x_306];
+    l_1 = x_309;
+    let x_310 : i32 = l_1;
+    param_4 = x_310;
+    let x_311 : i32 = h_1;
+    param_5 = x_311;
+    let x_312 : i32 = performPartition_i1_i1_(&(param_4), &(param_5));
+    p = x_312;
+    let x_313 : i32 = p;
+    let x_315 : i32 = l_1;
+    if (((x_313 - 1) > x_315)) {
+      let x_319 : i32 = top;
+      let x_320 : i32 = (x_319 + 1);
+      top = x_320;
+      let x_321 : i32 = l_1;
+      stack[x_320] = x_321;
+      let x_323 : i32 = top;
+      let x_324 : i32 = (x_323 + 1);
+      top = x_324;
+      let x_325 : i32 = p;
+      stack[x_324] = (x_325 - 1);
+    }
+    let x_328 : i32 = p;
+    let x_330 : i32 = h_1;
+    if (((x_328 + 1) < x_330)) {
+      let x_334 : i32 = top;
+      let x_335 : i32 = (x_334 + 1);
+      top = x_335;
+      let x_336 : i32 = p;
+      stack[x_335] = (x_336 + 1);
+      let x_339 : i32 = top;
+      let x_340 : i32 = (x_339 + 1);
+      top = x_340;
+      let x_341 : i32 = h_1;
+      stack[x_340] = x_341;
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_2 : i32;
+  var uv : vec2<f32>;
+  var color : vec3<f32>;
+  let x_90 : vec4<f32> = x_GLF_pos;
+  x_GLF_FragCoord = ((x_90 + vec4<f32>(1.0, 1.0, 0.0, 0.0)) * vec4<f32>(128.0, 128.0, 1.0, 1.0));
+  i_2 = 0;
+  loop {
+    let x_97 : i32 = i_2;
+    if ((x_97 < 10)) {
+    } else {
+      break;
+    }
+    let x_100 : i32 = i_2;
+    let x_101 : i32 = i_2;
+    obj.numbers[x_100] = (10 - x_101);
+    let x_104 : i32 = i_2;
+    let x_105 : i32 = i_2;
+    let x_107 : i32 = obj.numbers[x_105];
+    let x_108 : i32 = i_2;
+    let x_110 : i32 = obj.numbers[x_108];
+    obj.numbers[x_104] = (x_107 * x_110);
+
+    continuing {
+      let x_113 : i32 = i_2;
+      i_2 = (x_113 + 1);
+    }
+  }
+  quicksort_();
+  let x_116 : vec4<f32> = x_GLF_FragCoord;
+  let x_119 : vec2<f32> = x_34.resolution;
+  uv = (vec2<f32>(x_116.x, x_116.y) / x_119);
+  color = vec3<f32>(1.0, 2.0, 3.0);
+  let x_122 : i32 = obj.numbers[0];
+  let x_125 : f32 = color.x;
+  color.x = (x_125 + f32(x_122));
+  let x_129 : f32 = uv.x;
+  if ((x_129 > 0.25)) {
+    let x_134 : i32 = obj.numbers[1];
+    let x_137 : f32 = color.x;
+    color.x = (x_137 + f32(x_134));
+  }
+  let x_141 : f32 = uv.x;
+  if ((x_141 > 0.5)) {
+    let x_146 : i32 = obj.numbers[2];
+    let x_149 : f32 = color.y;
+    color.y = (x_149 + f32(x_146));
+  }
+  let x_153 : f32 = uv.x;
+  if ((x_153 > 0.75)) {
+    let x_158 : i32 = obj.numbers[3];
+    let x_161 : f32 = color.z;
+    color.z = (x_161 + f32(x_158));
+  }
+  let x_165 : i32 = obj.numbers[4];
+  let x_168 : f32 = color.y;
+  color.y = (x_168 + f32(x_165));
+  let x_172 : f32 = uv.y;
+  if ((x_172 > 0.25)) {
+    let x_177 : i32 = obj.numbers[5];
+    let x_180 : f32 = color.x;
+    color.x = (x_180 + f32(x_177));
+  }
+  let x_184 : f32 = uv.y;
+  if ((x_184 > 0.5)) {
+    let x_189 : i32 = obj.numbers[6];
+    let x_192 : f32 = color.y;
+    color.y = (x_192 + f32(x_189));
+  }
+  let x_196 : f32 = uv.y;
+  if ((x_196 > 0.75)) {
+    let x_201 : i32 = obj.numbers[7];
+    let x_204 : f32 = color.z;
+    color.z = (x_204 + f32(x_201));
+  }
+  let x_208 : i32 = obj.numbers[8];
+  let x_211 : f32 = color.z;
+  color.z = (x_211 + f32(x_208));
+  let x_215 : f32 = uv.x;
+  let x_217 : f32 = uv.y;
+  if ((abs((x_215 - x_217)) < 0.25)) {
+    let x_224 : i32 = obj.numbers[9];
+    let x_227 : f32 = color.x;
+    color.x = (x_227 + f32(x_224));
+  }
+  let x_230 : vec3<f32> = color;
+  let x_231 : vec3<f32> = normalize(x_230);
+  frag_color = vec4<f32>(x_231.x, x_231.y, x_231.z, 1.0);
+  let x_236 : vec4<f32> = x_GLF_pos;
+  gl_Position = x_236;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  frag_color_1 : vec4<f32>;
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] x_GLF_pos_param : vec4<f32>) -> main_out {
+  x_GLF_pos = x_GLF_pos_param;
+  main_1();
+  return main_out(frag_color, gl_Position);
+}
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
new file mode 100644
index 0000000..a320629
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,219 @@
+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;
+  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;
+  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;
+  {
+    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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 x_GLF_pos_param = tint_symbol.x_GLF_pos_param;
+  x_GLF_pos = x_GLF_pos_param;
+  main_1();
+  const main_out tint_symbol_3 = {frag_color, gl_Position};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.frag_color_1, tint_symbol_3.gl_Position};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..f82023b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/0-opt.wgsl.expected.msl
@@ -0,0 +1,266 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct QuicksortObject {
+  tint_array_wrapper numbers;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 frag_color_1;
+  float4 gl_Position;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_pos_param [[attribute(0)]];
+};
+struct tint_symbol_3 {
+  float4 frag_color_1 [[user(locn0)]];
+  float4 gl_Position [[position]];
+};
+
+void swap_i1_i1_(thread int* const i, thread int* const j, thread QuicksortObject* const tint_symbol_6) {
+  int temp = 0;
+  int const x_239 = *(i);
+  int const x_241 = (*(tint_symbol_6)).numbers.arr[x_239];
+  temp = x_241;
+  int const x_242 = *(i);
+  int const x_243 = *(j);
+  int const x_245 = (*(tint_symbol_6)).numbers.arr[x_243];
+  (*(tint_symbol_6)).numbers.arr[x_242] = x_245;
+  int const x_247 = *(j);
+  int const x_248 = temp;
+  (*(tint_symbol_6)).numbers.arr[x_247] = x_248;
+  return;
+}
+
+int performPartition_i1_i1_(thread int* const l, thread int* const h, thread QuicksortObject* const tint_symbol_7) {
+  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;
+  int const x_251 = *(h);
+  int const x_253 = (*(tint_symbol_7)).numbers.arr[x_251];
+  pivot = x_253;
+  int const x_254 = *(l);
+  i_1 = (x_254 - 1);
+  int const x_256 = *(l);
+  j_1 = x_256;
+  while (true) {
+    int const x_261 = j_1;
+    int const x_262 = *(h);
+    if ((x_261 <= (x_262 - 1))) {
+    } else {
+      break;
+    }
+    int const x_266 = j_1;
+    int const x_268 = (*(tint_symbol_7)).numbers.arr[x_266];
+    int const x_269 = pivot;
+    if ((x_268 <= x_269)) {
+      int const x_273 = i_1;
+      i_1 = (x_273 + 1);
+      int const x_275 = i_1;
+      param = x_275;
+      int const x_276 = j_1;
+      param_1 = x_276;
+      swap_i1_i1_(&(param), &(param_1), tint_symbol_7);
+    }
+    {
+      int const x_278 = j_1;
+      j_1 = (x_278 + 1);
+    }
+  }
+  int const x_280 = i_1;
+  param_2 = (x_280 + 1);
+  int const x_282 = *(h);
+  param_3 = x_282;
+  swap_i1_i1_(&(param_2), &(param_3), tint_symbol_7);
+  int const x_284 = i_1;
+  return (x_284 + 1);
+}
+
+void quicksort_(thread QuicksortObject* const tint_symbol_8) {
+  int l_1 = 0;
+  int h_1 = 0;
+  int top = 0;
+  tint_array_wrapper stack = {};
+  int p = 0;
+  int param_4 = 0;
+  int param_5 = 0;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  int const x_287 = top;
+  int const x_288 = (x_287 + 1);
+  top = x_288;
+  int const x_289 = l_1;
+  stack.arr[x_288] = x_289;
+  int const x_291 = top;
+  int const x_292 = (x_291 + 1);
+  top = x_292;
+  int const x_293 = h_1;
+  stack.arr[x_292] = x_293;
+  while (true) {
+    int const x_299 = top;
+    if ((x_299 >= 0)) {
+    } else {
+      break;
+    }
+    int const x_302 = top;
+    top = (x_302 - 1);
+    int const x_305 = stack.arr[x_302];
+    h_1 = x_305;
+    int const x_306 = top;
+    top = (x_306 - 1);
+    int const x_309 = stack.arr[x_306];
+    l_1 = x_309;
+    int const x_310 = l_1;
+    param_4 = x_310;
+    int const x_311 = h_1;
+    param_5 = x_311;
+    int const x_312 = performPartition_i1_i1_(&(param_4), &(param_5), tint_symbol_8);
+    p = x_312;
+    int const x_313 = p;
+    int const x_315 = l_1;
+    if (((x_313 - 1) > x_315)) {
+      int const x_319 = top;
+      int const x_320 = (x_319 + 1);
+      top = x_320;
+      int const x_321 = l_1;
+      stack.arr[x_320] = x_321;
+      int const x_323 = top;
+      int const x_324 = (x_323 + 1);
+      top = x_324;
+      int const x_325 = p;
+      stack.arr[x_324] = (x_325 - 1);
+    }
+    int const x_328 = p;
+    int const x_330 = h_1;
+    if (((x_328 + 1) < x_330)) {
+      int const x_334 = top;
+      int const x_335 = (x_334 + 1);
+      top = x_335;
+      int const x_336 = p;
+      stack.arr[x_335] = (x_336 + 1);
+      int const x_339 = top;
+      int const x_340 = (x_339 + 1);
+      top = x_340;
+      int const x_341 = h_1;
+      stack.arr[x_340] = x_341;
+    }
+  }
+  return;
+}
+
+void main_1(constant buf0& x_34, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10, thread QuicksortObject* const tint_symbol_11, thread float4* const tint_symbol_12, thread float4* const tint_symbol_13) {
+  int i_2 = 0;
+  float2 uv = 0.0f;
+  float3 color = 0.0f;
+  float4 const x_90 = *(tint_symbol_9);
+  *(tint_symbol_10) = ((x_90 + float4(1.0f, 1.0f, 0.0f, 0.0f)) * float4(128.0f, 128.0f, 1.0f, 1.0f));
+  i_2 = 0;
+  while (true) {
+    int const x_97 = i_2;
+    if ((x_97 < 10)) {
+    } else {
+      break;
+    }
+    int const x_100 = i_2;
+    int const x_101 = i_2;
+    (*(tint_symbol_11)).numbers.arr[x_100] = (10 - x_101);
+    int const x_104 = i_2;
+    int const x_105 = i_2;
+    int const x_107 = (*(tint_symbol_11)).numbers.arr[x_105];
+    int const x_108 = i_2;
+    int const x_110 = (*(tint_symbol_11)).numbers.arr[x_108];
+    (*(tint_symbol_11)).numbers.arr[x_104] = (x_107 * x_110);
+    {
+      int const x_113 = i_2;
+      i_2 = (x_113 + 1);
+    }
+  }
+  quicksort_(tint_symbol_11);
+  float4 const x_116 = *(tint_symbol_10);
+  float2 const x_119 = x_34.resolution;
+  uv = (float2(x_116.x, x_116.y) / x_119);
+  color = float3(1.0f, 2.0f, 3.0f);
+  int const x_122 = (*(tint_symbol_11)).numbers.arr[0];
+  float const x_125 = color.x;
+  color.x = (x_125 + float(x_122));
+  float const x_129 = uv.x;
+  if ((x_129 > 0.25f)) {
+    int const x_134 = (*(tint_symbol_11)).numbers.arr[1];
+    float const x_137 = color.x;
+    color.x = (x_137 + float(x_134));
+  }
+  float const x_141 = uv.x;
+  if ((x_141 > 0.5f)) {
+    int const x_146 = (*(tint_symbol_11)).numbers.arr[2];
+    float const x_149 = color.y;
+    color.y = (x_149 + float(x_146));
+  }
+  float const x_153 = uv.x;
+  if ((x_153 > 0.75f)) {
+    int const x_158 = (*(tint_symbol_11)).numbers.arr[3];
+    float const x_161 = color.z;
+    color.z = (x_161 + float(x_158));
+  }
+  int const x_165 = (*(tint_symbol_11)).numbers.arr[4];
+  float const x_168 = color.y;
+  color.y = (x_168 + float(x_165));
+  float const x_172 = uv.y;
+  if ((x_172 > 0.25f)) {
+    int const x_177 = (*(tint_symbol_11)).numbers.arr[5];
+    float const x_180 = color.x;
+    color.x = (x_180 + float(x_177));
+  }
+  float const x_184 = uv.y;
+  if ((x_184 > 0.5f)) {
+    int const x_189 = (*(tint_symbol_11)).numbers.arr[6];
+    float const x_192 = color.y;
+    color.y = (x_192 + float(x_189));
+  }
+  float const x_196 = uv.y;
+  if ((x_196 > 0.75f)) {
+    int const x_201 = (*(tint_symbol_11)).numbers.arr[7];
+    float const x_204 = color.z;
+    color.z = (x_204 + float(x_201));
+  }
+  int const x_208 = (*(tint_symbol_11)).numbers.arr[8];
+  float const x_211 = color.z;
+  color.z = (x_211 + float(x_208));
+  float const x_215 = uv.x;
+  float const x_217 = uv.y;
+  if ((fabs((x_215 - x_217)) < 0.25f)) {
+    int const x_224 = (*(tint_symbol_11)).numbers.arr[9];
+    float const x_227 = color.x;
+    color.x = (x_227 + float(x_224));
+  }
+  float3 const x_230 = color;
+  float3 const x_231 = normalize(x_230);
+  *(tint_symbol_12) = float4(x_231.x, x_231.y, x_231.z, 1.0f);
+  float4 const x_236 = *(tint_symbol_9);
+  *(tint_symbol_13) = x_236;
+  return;
+}
+
+vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]], constant buf0& x_34 [[buffer(0)]]) {
+  thread float4 tint_symbol_14 = 0.0f;
+  thread float4 tint_symbol_15 = 0.0f;
+  thread QuicksortObject tint_symbol_16 = {};
+  thread float4 tint_symbol_17 = 0.0f;
+  thread float4 tint_symbol_18 = 0.0f;
+  float4 const x_GLF_pos_param = tint_symbol_1.x_GLF_pos_param;
+  tint_symbol_14 = x_GLF_pos_param;
+  main_1(x_34, &(tint_symbol_14), &(tint_symbol_15), &(tint_symbol_16), &(tint_symbol_17), &(tint_symbol_18));
+  main_out const tint_symbol_4 = {.frag_color_1=tint_symbol_17, .gl_Position=tint_symbol_18};
+  tint_symbol_3 const tint_symbol_5 = {.frag_color_1=tint_symbol_4.frag_color_1, .gl_Position=tint_symbol_4.gl_Position};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..db05970
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,567 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 390
+; Schema: 0
+               OpCapability Shader
+        %356 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %tint_pointsize %tint_symbol %tint_symbol_2 %tint_symbol_3
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %QuicksortObject "QuicksortObject"
+               OpMemberName %QuicksortObject 0 "numbers"
+               OpName %obj "obj"
+               OpName %x_GLF_FragCoord "x_GLF_FragCoord"
+               OpName %x_GLF_pos "x_GLF_pos"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_34 "x_34"
+               OpName %frag_color "frag_color"
+               OpName %gl_Position "gl_Position"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %swap_i1_i1_ "swap_i1_i1_"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %temp "temp"
+               OpName %performPartition_i1_i1_ "performPartition_i1_i1_"
+               OpName %l "l"
+               OpName %h "h"
+               OpName %pivot "pivot"
+               OpName %i_1 "i_1"
+               OpName %j_1 "j_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %quicksort_ "quicksort_"
+               OpName %l_1 "l_1"
+               OpName %h_1 "h_1"
+               OpName %top "top"
+               OpName %stack "stack"
+               OpName %p "p"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpName %main_1 "main_1"
+               OpName %i_2 "i_2"
+               OpName %uv "uv"
+               OpName %color "color"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "frag_color_1"
+               OpMemberName %main_out 1 "gl_Position"
+               OpName %tint_symbol_4 "tint_symbol_4"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpMemberDecorate %QuicksortObject 0 Offset 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_34 NonWritable
+               OpDecorate %x_34 DescriptorSet 0
+               OpDecorate %x_34 Binding 0
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %tint_symbol_3 BuiltIn Position
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%QuicksortObject = OpTypeStruct %_arr_int_uint_10
+%_ptr_Private_QuicksortObject = OpTypePointer Private %QuicksortObject
+         %12 = OpConstantNull %QuicksortObject
+        %obj = OpVariable %_ptr_Private_QuicksortObject Private %12
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_FragCoord = OpVariable %_ptr_Private_v4float Private %16
+  %x_GLF_pos = OpVariable %_ptr_Private_v4float Private %16
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_34 = OpVariable %_ptr_Uniform_buf0 Uniform
+ %frag_color = OpVariable %_ptr_Private_v4float Private %16
+%gl_Position = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %16
+%tint_symbol_3 = OpVariable %_ptr_Output_v4float Output %16
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+         %37 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_int = OpTypePointer Private %int
+         %55 = OpTypeFunction %int %_ptr_Function_int %_ptr_Function_int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+        %115 = OpTypeFunction %void
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+        %123 = OpConstantNull %_arr_int_uint_10
+      %int_0 = OpConstant %int 0
+      %int_9 = OpConstant %int 9
+     %int_n1 = OpConstant %int -1
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+        %195 = OpConstantNull %v2float
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+        %199 = OpConstantNull %v3float
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+        %203 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_0
+  %float_128 = OpConstant %float 128
+        %206 = OpConstantComposite %v4float %float_128 %float_128 %float_1 %float_1
+     %int_10 = OpConstant %int 10
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+        %244 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+%_ptr_Function_float = OpTypePointer Function %float
+ %float_0_25 = OpConstant %float 0.25
+  %float_0_5 = OpConstant %float 0.5
+      %int_2 = OpConstant %int 2
+     %uint_1 = OpConstant %uint 1
+ %float_0_75 = OpConstant %float 0.75
+      %int_3 = OpConstant %int 3
+     %uint_2 = OpConstant %uint 2
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+   %main_out = OpTypeStruct %v4float %v4float
+        %375 = OpTypeFunction %void %main_out
+%swap_i1_i1_ = OpFunction %void None %29
+          %i = OpFunctionParameter %_ptr_Function_int
+          %j = OpFunctionParameter %_ptr_Function_int
+         %35 = OpLabel
+       %temp = OpVariable %_ptr_Function_int Function %37
+         %39 = OpLoad %int %i
+         %42 = OpAccessChain %_ptr_Private_int %obj %uint_0 %39
+         %43 = OpLoad %int %42
+               OpStore %temp %43
+         %45 = OpLoad %int %i
+         %47 = OpLoad %int %j
+         %48 = OpAccessChain %_ptr_Private_int %obj %uint_0 %47
+         %49 = OpLoad %int %48
+         %50 = OpAccessChain %_ptr_Private_int %obj %uint_0 %45
+               OpStore %50 %49
+         %52 = OpLoad %int %j
+         %53 = OpLoad %int %temp
+         %54 = OpAccessChain %_ptr_Private_int %obj %uint_0 %52
+               OpStore %54 %53
+               OpReturn
+               OpFunctionEnd
+%performPartition_i1_i1_ = OpFunction %int None %55
+          %l = OpFunctionParameter %_ptr_Function_int
+          %h = OpFunctionParameter %_ptr_Function_int
+         %59 = OpLabel
+      %pivot = OpVariable %_ptr_Function_int Function %37
+        %i_1 = OpVariable %_ptr_Function_int Function %37
+        %j_1 = OpVariable %_ptr_Function_int Function %37
+      %param = OpVariable %_ptr_Function_int Function %37
+    %param_1 = OpVariable %_ptr_Function_int Function %37
+    %param_2 = OpVariable %_ptr_Function_int Function %37
+    %param_3 = OpVariable %_ptr_Function_int Function %37
+         %68 = OpLoad %int %h
+         %69 = OpAccessChain %_ptr_Private_int %obj %uint_0 %68
+         %70 = OpLoad %int %69
+               OpStore %pivot %70
+         %72 = OpLoad %int %l
+         %74 = OpISub %int %72 %int_1
+               OpStore %i_1 %74
+         %76 = OpLoad %int %l
+               OpStore %j_1 %76
+               OpBranch %77
+         %77 = OpLabel
+               OpLoopMerge %78 %79 None
+               OpBranch %80
+         %80 = OpLabel
+         %81 = OpLoad %int %j_1
+         %83 = OpLoad %int %h
+         %84 = OpISub %int %83 %int_1
+         %85 = OpSLessThanEqual %bool %81 %84
+               OpSelectionMerge %87 None
+               OpBranchConditional %85 %88 %89
+         %88 = OpLabel
+               OpBranch %87
+         %89 = OpLabel
+               OpBranch %78
+         %87 = OpLabel
+         %90 = OpLoad %int %j_1
+         %91 = OpAccessChain %_ptr_Private_int %obj %uint_0 %90
+         %92 = OpLoad %int %91
+         %93 = OpLoad %int %pivot
+         %94 = OpSLessThanEqual %bool %92 %93
+               OpSelectionMerge %95 None
+               OpBranchConditional %94 %96 %95
+         %96 = OpLabel
+         %97 = OpLoad %int %i_1
+         %98 = OpIAdd %int %97 %int_1
+               OpStore %i_1 %98
+         %99 = OpLoad %int %i_1
+               OpStore %param %99
+        %100 = OpLoad %int %j_1
+               OpStore %param_1 %100
+        %101 = OpFunctionCall %void %swap_i1_i1_ %param %param_1
+               OpBranch %95
+         %95 = OpLabel
+               OpBranch %79
+         %79 = OpLabel
+        %104 = OpLoad %int %j_1
+        %105 = OpIAdd %int %104 %int_1
+               OpStore %j_1 %105
+               OpBranch %77
+         %78 = OpLabel
+        %106 = OpLoad %int %i_1
+        %107 = OpIAdd %int %106 %int_1
+               OpStore %param_2 %107
+        %109 = OpLoad %int %h
+               OpStore %param_3 %109
+        %110 = OpFunctionCall %void %swap_i1_i1_ %param_2 %param_3
+        %113 = OpLoad %int %i_1
+        %114 = OpIAdd %int %113 %int_1
+               OpReturnValue %114
+               OpFunctionEnd
+ %quicksort_ = OpFunction %void None %115
+        %117 = OpLabel
+        %l_1 = OpVariable %_ptr_Function_int Function %37
+        %h_1 = OpVariable %_ptr_Function_int Function %37
+        %top = OpVariable %_ptr_Function_int Function %37
+      %stack = OpVariable %_ptr_Function__arr_int_uint_10 Function %123
+          %p = OpVariable %_ptr_Function_int Function %37
+    %param_4 = OpVariable %_ptr_Function_int Function %37
+    %param_5 = OpVariable %_ptr_Function_int Function %37
+               OpStore %l_1 %int_0
+               OpStore %h_1 %int_9
+               OpStore %top %int_n1
+        %130 = OpLoad %int %top
+        %131 = OpIAdd %int %130 %int_1
+               OpStore %top %131
+        %132 = OpLoad %int %l_1
+        %133 = OpAccessChain %_ptr_Function_int %stack %131
+               OpStore %133 %132
+        %134 = OpLoad %int %top
+        %135 = OpIAdd %int %134 %int_1
+               OpStore %top %135
+        %136 = OpLoad %int %h_1
+        %137 = OpAccessChain %_ptr_Function_int %stack %135
+               OpStore %137 %136
+               OpBranch %138
+        %138 = OpLabel
+               OpLoopMerge %139 %140 None
+               OpBranch %141
+        %141 = OpLabel
+        %142 = OpLoad %int %top
+        %143 = OpSGreaterThanEqual %bool %142 %int_0
+               OpSelectionMerge %144 None
+               OpBranchConditional %143 %145 %146
+        %145 = OpLabel
+               OpBranch %144
+        %146 = OpLabel
+               OpBranch %139
+        %144 = OpLabel
+        %147 = OpLoad %int %top
+        %148 = OpISub %int %147 %int_1
+               OpStore %top %148
+        %149 = OpAccessChain %_ptr_Function_int %stack %147
+        %150 = OpLoad %int %149
+               OpStore %h_1 %150
+        %151 = OpLoad %int %top
+        %152 = OpISub %int %151 %int_1
+               OpStore %top %152
+        %153 = OpAccessChain %_ptr_Function_int %stack %151
+        %154 = OpLoad %int %153
+               OpStore %l_1 %154
+        %155 = OpLoad %int %l_1
+               OpStore %param_4 %155
+        %156 = OpLoad %int %h_1
+               OpStore %param_5 %156
+        %157 = OpFunctionCall %int %performPartition_i1_i1_ %param_4 %param_5
+               OpStore %p %157
+        %160 = OpLoad %int %p
+        %161 = OpLoad %int %l_1
+        %162 = OpISub %int %160 %int_1
+        %163 = OpSGreaterThan %bool %162 %161
+               OpSelectionMerge %164 None
+               OpBranchConditional %163 %165 %164
+        %165 = OpLabel
+        %166 = OpLoad %int %top
+        %167 = OpIAdd %int %166 %int_1
+               OpStore %top %167
+        %168 = OpLoad %int %l_1
+        %169 = OpAccessChain %_ptr_Function_int %stack %167
+               OpStore %169 %168
+        %170 = OpLoad %int %top
+        %171 = OpIAdd %int %170 %int_1
+               OpStore %top %171
+        %172 = OpLoad %int %p
+        %173 = OpAccessChain %_ptr_Function_int %stack %171
+        %174 = OpISub %int %172 %int_1
+               OpStore %173 %174
+               OpBranch %164
+        %164 = OpLabel
+        %175 = OpLoad %int %p
+        %176 = OpLoad %int %h_1
+        %177 = OpIAdd %int %175 %int_1
+        %178 = OpSLessThan %bool %177 %176
+               OpSelectionMerge %179 None
+               OpBranchConditional %178 %180 %179
+        %180 = OpLabel
+        %181 = OpLoad %int %top
+        %182 = OpIAdd %int %181 %int_1
+               OpStore %top %182
+        %183 = OpLoad %int %p
+        %184 = OpAccessChain %_ptr_Function_int %stack %182
+        %185 = OpIAdd %int %183 %int_1
+               OpStore %184 %185
+        %186 = OpLoad %int %top
+        %187 = OpIAdd %int %186 %int_1
+               OpStore %top %187
+        %188 = OpLoad %int %h_1
+        %189 = OpAccessChain %_ptr_Function_int %stack %187
+               OpStore %189 %188
+               OpBranch %179
+        %179 = OpLabel
+               OpBranch %140
+        %140 = OpLabel
+               OpBranch %138
+        %139 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %115
+        %191 = OpLabel
+        %i_2 = OpVariable %_ptr_Function_int Function %37
+         %uv = OpVariable %_ptr_Function_v2float Function %195
+      %color = OpVariable %_ptr_Function_v3float Function %199
+        %200 = OpLoad %v4float %x_GLF_pos
+        %204 = OpFAdd %v4float %200 %203
+        %207 = OpFMul %v4float %204 %206
+               OpStore %x_GLF_FragCoord %207
+               OpStore %i_2 %int_0
+               OpBranch %208
+        %208 = OpLabel
+               OpLoopMerge %209 %210 None
+               OpBranch %211
+        %211 = OpLabel
+        %212 = OpLoad %int %i_2
+        %214 = OpSLessThan %bool %212 %int_10
+               OpSelectionMerge %215 None
+               OpBranchConditional %214 %216 %217
+        %216 = OpLabel
+               OpBranch %215
+        %217 = OpLabel
+               OpBranch %209
+        %215 = OpLabel
+        %218 = OpLoad %int %i_2
+        %219 = OpLoad %int %i_2
+        %220 = OpAccessChain %_ptr_Private_int %obj %uint_0 %218
+        %221 = OpISub %int %int_10 %219
+               OpStore %220 %221
+        %222 = OpLoad %int %i_2
+        %223 = OpLoad %int %i_2
+        %224 = OpAccessChain %_ptr_Private_int %obj %uint_0 %223
+        %225 = OpLoad %int %224
+        %226 = OpLoad %int %i_2
+        %227 = OpAccessChain %_ptr_Private_int %obj %uint_0 %226
+        %228 = OpLoad %int %227
+        %229 = OpAccessChain %_ptr_Private_int %obj %uint_0 %222
+        %230 = OpIMul %int %225 %228
+               OpStore %229 %230
+               OpBranch %210
+        %210 = OpLabel
+        %231 = OpLoad %int %i_2
+        %232 = OpIAdd %int %231 %int_1
+               OpStore %i_2 %232
+               OpBranch %208
+        %209 = OpLabel
+        %233 = OpFunctionCall %void %quicksort_
+        %234 = OpLoad %v4float %x_GLF_FragCoord
+        %236 = OpAccessChain %_ptr_Uniform_v2float %x_34 %uint_0
+        %237 = OpLoad %v2float %236
+        %238 = OpCompositeExtract %float %234 0
+        %239 = OpCompositeExtract %float %234 1
+        %240 = OpCompositeConstruct %v2float %238 %239
+        %241 = OpFDiv %v2float %240 %237
+               OpStore %uv %241
+               OpStore %color %244
+        %245 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_0
+        %246 = OpLoad %int %245
+        %248 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %249 = OpLoad %float %248
+        %250 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %251 = OpConvertSToF %float %246
+        %252 = OpFAdd %float %249 %251
+               OpStore %250 %252
+        %253 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %254 = OpLoad %float %253
+        %256 = OpFOrdGreaterThan %bool %254 %float_0_25
+               OpSelectionMerge %257 None
+               OpBranchConditional %256 %258 %257
+        %258 = OpLabel
+        %259 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_1
+        %260 = OpLoad %int %259
+        %261 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %262 = OpLoad %float %261
+        %263 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %264 = OpConvertSToF %float %260
+        %265 = OpFAdd %float %262 %264
+               OpStore %263 %265
+               OpBranch %257
+        %257 = OpLabel
+        %266 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %267 = OpLoad %float %266
+        %269 = OpFOrdGreaterThan %bool %267 %float_0_5
+               OpSelectionMerge %270 None
+               OpBranchConditional %269 %271 %270
+        %271 = OpLabel
+        %273 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_2
+        %274 = OpLoad %int %273
+        %276 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %277 = OpLoad %float %276
+        %278 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %279 = OpConvertSToF %float %274
+        %280 = OpFAdd %float %277 %279
+               OpStore %278 %280
+               OpBranch %270
+        %270 = OpLabel
+        %281 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %282 = OpLoad %float %281
+        %284 = OpFOrdGreaterThan %bool %282 %float_0_75
+               OpSelectionMerge %285 None
+               OpBranchConditional %284 %286 %285
+        %286 = OpLabel
+        %288 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_3
+        %289 = OpLoad %int %288
+        %291 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %292 = OpLoad %float %291
+        %293 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %294 = OpConvertSToF %float %289
+        %295 = OpFAdd %float %292 %294
+               OpStore %293 %295
+               OpBranch %285
+        %285 = OpLabel
+        %297 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_4
+        %298 = OpLoad %int %297
+        %299 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %300 = OpLoad %float %299
+        %301 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %302 = OpConvertSToF %float %298
+        %303 = OpFAdd %float %300 %302
+               OpStore %301 %303
+        %304 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %305 = OpLoad %float %304
+        %306 = OpFOrdGreaterThan %bool %305 %float_0_25
+               OpSelectionMerge %307 None
+               OpBranchConditional %306 %308 %307
+        %308 = OpLabel
+        %310 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_5
+        %311 = OpLoad %int %310
+        %312 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %313 = OpLoad %float %312
+        %314 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %315 = OpConvertSToF %float %311
+        %316 = OpFAdd %float %313 %315
+               OpStore %314 %316
+               OpBranch %307
+        %307 = OpLabel
+        %317 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %318 = OpLoad %float %317
+        %319 = OpFOrdGreaterThan %bool %318 %float_0_5
+               OpSelectionMerge %320 None
+               OpBranchConditional %319 %321 %320
+        %321 = OpLabel
+        %323 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_6
+        %324 = OpLoad %int %323
+        %325 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %326 = OpLoad %float %325
+        %327 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %328 = OpConvertSToF %float %324
+        %329 = OpFAdd %float %326 %328
+               OpStore %327 %329
+               OpBranch %320
+        %320 = OpLabel
+        %330 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %331 = OpLoad %float %330
+        %332 = OpFOrdGreaterThan %bool %331 %float_0_75
+               OpSelectionMerge %333 None
+               OpBranchConditional %332 %334 %333
+        %334 = OpLabel
+        %336 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_7
+        %337 = OpLoad %int %336
+        %338 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %339 = OpLoad %float %338
+        %340 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %341 = OpConvertSToF %float %337
+        %342 = OpFAdd %float %339 %341
+               OpStore %340 %342
+               OpBranch %333
+        %333 = OpLabel
+        %344 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_8
+        %345 = OpLoad %int %344
+        %346 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %347 = OpLoad %float %346
+        %348 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %349 = OpConvertSToF %float %345
+        %350 = OpFAdd %float %347 %349
+               OpStore %348 %350
+        %351 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %352 = OpLoad %float %351
+        %353 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %354 = OpLoad %float %353
+        %357 = OpFSub %float %352 %354
+        %355 = OpExtInst %float %356 FAbs %357
+        %358 = OpFOrdLessThan %bool %355 %float_0_25
+               OpSelectionMerge %359 None
+               OpBranchConditional %358 %360 %359
+        %360 = OpLabel
+        %361 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_9
+        %362 = OpLoad %int %361
+        %363 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %364 = OpLoad %float %363
+        %365 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %366 = OpConvertSToF %float %362
+        %367 = OpFAdd %float %364 %366
+               OpStore %365 %367
+               OpBranch %359
+        %359 = OpLabel
+        %368 = OpLoad %v3float %color
+        %369 = OpExtInst %v3float %356 Normalize %368
+        %370 = OpCompositeExtract %float %369 0
+        %371 = OpCompositeExtract %float %369 1
+        %372 = OpCompositeExtract %float %369 2
+        %373 = OpCompositeConstruct %v4float %370 %371 %372 %float_1
+               OpStore %frag_color %373
+        %374 = OpLoad %v4float %x_GLF_pos
+               OpStore %gl_Position %374
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_4 = OpFunction %void None %375
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %379 = OpLabel
+        %380 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %380
+        %381 = OpCompositeExtract %v4float %tint_symbol_1 1
+               OpStore %tint_symbol_3 %381
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %115
+        %383 = OpLabel
+               OpStore %tint_pointsize %float_1
+        %384 = OpLoad %v4float %tint_symbol
+               OpStore %x_GLF_pos %384
+        %385 = OpFunctionCall %void %main_1
+        %387 = OpLoad %v4float %frag_color
+        %388 = OpLoad %v4float %gl_Position
+        %389 = OpCompositeConstruct %main_out %387 %388
+        %386 = OpFunctionCall %void %tint_symbol_4 %389
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..134b77f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,264 @@
+struct QuicksortObject {
+  numbers : array<i32, 10>;
+};
+
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> obj : QuicksortObject;
+
+var<private> x_GLF_FragCoord : vec4<f32>;
+
+var<private> x_GLF_pos : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_34 : buf0;
+
+var<private> frag_color : vec4<f32>;
+
+var<private> gl_Position : vec4<f32>;
+
+fn swap_i1_i1_(i : ptr<function, i32>, j : ptr<function, i32>) {
+  var temp : i32;
+  let x_239 : i32 = *(i);
+  let x_241 : i32 = obj.numbers[x_239];
+  temp = x_241;
+  let x_242 : i32 = *(i);
+  let x_243 : i32 = *(j);
+  let x_245 : i32 = obj.numbers[x_243];
+  obj.numbers[x_242] = x_245;
+  let x_247 : i32 = *(j);
+  let x_248 : i32 = temp;
+  obj.numbers[x_247] = x_248;
+  return;
+}
+
+fn performPartition_i1_i1_(l : ptr<function, i32>, h : ptr<function, i32>) -> i32 {
+  var pivot : i32;
+  var i_1 : i32;
+  var j_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  var param_3 : i32;
+  let x_251 : i32 = *(h);
+  let x_253 : i32 = obj.numbers[x_251];
+  pivot = x_253;
+  let x_254 : i32 = *(l);
+  i_1 = (x_254 - 1);
+  let x_256 : i32 = *(l);
+  j_1 = x_256;
+  loop {
+    let x_261 : i32 = j_1;
+    let x_262 : i32 = *(h);
+    if ((x_261 <= (x_262 - 1))) {
+    } else {
+      break;
+    }
+    let x_266 : i32 = j_1;
+    let x_268 : i32 = obj.numbers[x_266];
+    let x_269 : i32 = pivot;
+    if ((x_268 <= x_269)) {
+      let x_273 : i32 = i_1;
+      i_1 = (x_273 + 1);
+      let x_275 : i32 = i_1;
+      param = x_275;
+      let x_276 : i32 = j_1;
+      param_1 = x_276;
+      swap_i1_i1_(&(param), &(param_1));
+    }
+
+    continuing {
+      let x_278 : i32 = j_1;
+      j_1 = (x_278 + 1);
+    }
+  }
+  let x_280 : i32 = i_1;
+  param_2 = (x_280 + 1);
+  let x_282 : i32 = *(h);
+  param_3 = x_282;
+  swap_i1_i1_(&(param_2), &(param_3));
+  let x_284 : i32 = i_1;
+  return (x_284 + 1);
+}
+
+fn quicksort_() {
+  var l_1 : i32;
+  var h_1 : i32;
+  var top : i32;
+  var stack : array<i32, 10>;
+  var p : i32;
+  var param_4 : i32;
+  var param_5 : i32;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  let x_287 : i32 = top;
+  let x_288 : i32 = (x_287 + 1);
+  top = x_288;
+  let x_289 : i32 = l_1;
+  stack[x_288] = x_289;
+  let x_291 : i32 = top;
+  let x_292 : i32 = (x_291 + 1);
+  top = x_292;
+  let x_293 : i32 = h_1;
+  stack[x_292] = x_293;
+  loop {
+    let x_299 : i32 = top;
+    if ((x_299 >= 0)) {
+    } else {
+      break;
+    }
+    let x_302 : i32 = top;
+    top = (x_302 - 1);
+    let x_305 : i32 = stack[x_302];
+    h_1 = x_305;
+    let x_306 : i32 = top;
+    top = (x_306 - 1);
+    let x_309 : i32 = stack[x_306];
+    l_1 = x_309;
+    let x_310 : i32 = l_1;
+    param_4 = x_310;
+    let x_311 : i32 = h_1;
+    param_5 = x_311;
+    let x_312 : i32 = performPartition_i1_i1_(&(param_4), &(param_5));
+    p = x_312;
+    let x_313 : i32 = p;
+    let x_315 : i32 = l_1;
+    if (((x_313 - 1) > x_315)) {
+      let x_319 : i32 = top;
+      let x_320 : i32 = (x_319 + 1);
+      top = x_320;
+      let x_321 : i32 = l_1;
+      stack[x_320] = x_321;
+      let x_323 : i32 = top;
+      let x_324 : i32 = (x_323 + 1);
+      top = x_324;
+      let x_325 : i32 = p;
+      stack[x_324] = (x_325 - 1);
+    }
+    let x_328 : i32 = p;
+    let x_330 : i32 = h_1;
+    if (((x_328 + 1) < x_330)) {
+      let x_334 : i32 = top;
+      let x_335 : i32 = (x_334 + 1);
+      top = x_335;
+      let x_336 : i32 = p;
+      stack[x_335] = (x_336 + 1);
+      let x_339 : i32 = top;
+      let x_340 : i32 = (x_339 + 1);
+      top = x_340;
+      let x_341 : i32 = h_1;
+      stack[x_340] = x_341;
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_2 : i32;
+  var uv : vec2<f32>;
+  var color : vec3<f32>;
+  let x_90 : vec4<f32> = x_GLF_pos;
+  x_GLF_FragCoord = ((x_90 + vec4<f32>(1.0, 1.0, 0.0, 0.0)) * vec4<f32>(128.0, 128.0, 1.0, 1.0));
+  i_2 = 0;
+  loop {
+    let x_97 : i32 = i_2;
+    if ((x_97 < 10)) {
+    } else {
+      break;
+    }
+    let x_100 : i32 = i_2;
+    let x_101 : i32 = i_2;
+    obj.numbers[x_100] = (10 - x_101);
+    let x_104 : i32 = i_2;
+    let x_105 : i32 = i_2;
+    let x_107 : i32 = obj.numbers[x_105];
+    let x_108 : i32 = i_2;
+    let x_110 : i32 = obj.numbers[x_108];
+    obj.numbers[x_104] = (x_107 * x_110);
+
+    continuing {
+      let x_113 : i32 = i_2;
+      i_2 = (x_113 + 1);
+    }
+  }
+  quicksort_();
+  let x_116 : vec4<f32> = x_GLF_FragCoord;
+  let x_119 : vec2<f32> = x_34.resolution;
+  uv = (vec2<f32>(x_116.x, x_116.y) / x_119);
+  color = vec3<f32>(1.0, 2.0, 3.0);
+  let x_122 : i32 = obj.numbers[0];
+  let x_125 : f32 = color.x;
+  color.x = (x_125 + f32(x_122));
+  let x_129 : f32 = uv.x;
+  if ((x_129 > 0.25)) {
+    let x_134 : i32 = obj.numbers[1];
+    let x_137 : f32 = color.x;
+    color.x = (x_137 + f32(x_134));
+  }
+  let x_141 : f32 = uv.x;
+  if ((x_141 > 0.5)) {
+    let x_146 : i32 = obj.numbers[2];
+    let x_149 : f32 = color.y;
+    color.y = (x_149 + f32(x_146));
+  }
+  let x_153 : f32 = uv.x;
+  if ((x_153 > 0.75)) {
+    let x_158 : i32 = obj.numbers[3];
+    let x_161 : f32 = color.z;
+    color.z = (x_161 + f32(x_158));
+  }
+  let x_165 : i32 = obj.numbers[4];
+  let x_168 : f32 = color.y;
+  color.y = (x_168 + f32(x_165));
+  let x_172 : f32 = uv.y;
+  if ((x_172 > 0.25)) {
+    let x_177 : i32 = obj.numbers[5];
+    let x_180 : f32 = color.x;
+    color.x = (x_180 + f32(x_177));
+  }
+  let x_184 : f32 = uv.y;
+  if ((x_184 > 0.5)) {
+    let x_189 : i32 = obj.numbers[6];
+    let x_192 : f32 = color.y;
+    color.y = (x_192 + f32(x_189));
+  }
+  let x_196 : f32 = uv.y;
+  if ((x_196 > 0.75)) {
+    let x_201 : i32 = obj.numbers[7];
+    let x_204 : f32 = color.z;
+    color.z = (x_204 + f32(x_201));
+  }
+  let x_208 : i32 = obj.numbers[8];
+  let x_211 : f32 = color.z;
+  color.z = (x_211 + f32(x_208));
+  let x_215 : f32 = uv.x;
+  let x_217 : f32 = uv.y;
+  if ((abs((x_215 - x_217)) < 0.25)) {
+    let x_224 : i32 = obj.numbers[9];
+    let x_227 : f32 = color.x;
+    color.x = (x_227 + f32(x_224));
+  }
+  let x_230 : vec3<f32> = color;
+  let x_231 : vec3<f32> = normalize(x_230);
+  frag_color = vec4<f32>(x_231.x, x_231.y, x_231.z, 1.0);
+  let x_236 : vec4<f32> = x_GLF_pos;
+  gl_Position = x_236;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  frag_color_1 : vec4<f32>;
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] x_GLF_pos_param : vec4<f32>) -> main_out {
+  x_GLF_pos = x_GLF_pos_param;
+  main_1();
+  return main_out(frag_color, gl_Position);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/1.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/1.spvasm
new file mode 100644
index 0000000..90b4e34
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/1.spvasm
@@ -0,0 +1,25 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color %frag_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpName %frag_color "frag_color"
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %frag_color Location 0
+       %void = OpTypeVoid
+          %6 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+ %frag_color = OpVariable %_ptr_Input_v4float Input
+       %main = OpFunction %void None %6
+         %11 = OpLabel
+         %12 = OpLoad %v4float %frag_color
+               OpStore %_GLF_color %12
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..266b98a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/1.spvasm.expected.hlsl
@@ -0,0 +1,26 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 frag_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  x_GLF_color = frag_color;
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 frag_color_param : TEXCOORD0;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 frag_color_param = tint_symbol.frag_color_param;
+  frag_color = frag_color_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/1.spvasm.expected.msl
new file mode 100644
index 0000000..bd94fa8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/1.spvasm.expected.msl
@@ -0,0 +1,30 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 frag_color_param [[user(locn0)]];
+};
+struct tint_symbol_3 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  float4 const x_12 = *(tint_symbol_6);
+  *(tint_symbol_7) = x_12;
+  return;
+}
+
+fragment tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  float4 const frag_color_param = tint_symbol_1.frag_color_param;
+  tint_symbol_8 = frag_color_param;
+  main_1(&(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_3 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_4.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..834d21f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/1.spvasm.expected.spvasm
@@ -0,0 +1,59 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 29
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %frag_color "frag_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+ %frag_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+   %main_out = OpTypeStruct %v4float
+         %16 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+         %15 = OpLoad %v4float %frag_color
+               OpStore %x_GLF_color %15
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %16
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %20 = OpLabel
+         %21 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %21
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %23 = OpLabel
+         %24 = OpLoad %v4float %tint_symbol
+               OpStore %frag_color %24
+         %25 = OpFunctionCall %void %main_1
+         %27 = OpLoad %v4float %x_GLF_color
+         %28 = OpCompositeConstruct %main_out %27
+         %26 = OpFunctionCall %void %tint_symbol_3 %28
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..b7d3ed1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/1.spvasm.expected.wgsl
@@ -0,0 +1,21 @@
+var<private> x_GLF_color : vec4<f32>;
+
+var<private> frag_color : vec4<f32>;
+
+fn main_1() {
+  let x_12 : vec4<f32> = frag_color;
+  x_GLF_color = x_12;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[location(0)]] frag_color_param : vec4<f32>) -> main_out {
+  frag_color = frag_color_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/1.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/1.wgsl
new file mode 100644
index 0000000..b7d3ed1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/1.wgsl
@@ -0,0 +1,21 @@
+var<private> x_GLF_color : vec4<f32>;
+
+var<private> frag_color : vec4<f32>;
+
+fn main_1() {
+  let x_12 : vec4<f32> = frag_color;
+  x_GLF_color = x_12;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[location(0)]] frag_color_param : vec4<f32>) -> main_out {
+  frag_color = frag_color_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..266b98a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/1.wgsl.expected.hlsl
@@ -0,0 +1,26 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 frag_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  x_GLF_color = frag_color;
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 frag_color_param : TEXCOORD0;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 frag_color_param = tint_symbol.frag_color_param;
+  frag_color = frag_color_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/1.wgsl.expected.msl
new file mode 100644
index 0000000..bd94fa8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/1.wgsl.expected.msl
@@ -0,0 +1,30 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 frag_color_param [[user(locn0)]];
+};
+struct tint_symbol_3 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  float4 const x_12 = *(tint_symbol_6);
+  *(tint_symbol_7) = x_12;
+  return;
+}
+
+fragment tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  float4 const frag_color_param = tint_symbol_1.frag_color_param;
+  tint_symbol_8 = frag_color_param;
+  main_1(&(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_3 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_4.x_GLF_color_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..834d21f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/1.wgsl.expected.spvasm
@@ -0,0 +1,59 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 29
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %frag_color "frag_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+ %frag_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+   %main_out = OpTypeStruct %v4float
+         %16 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+         %15 = OpLoad %v4float %frag_color
+               OpStore %x_GLF_color %15
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %16
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %20 = OpLabel
+         %21 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %21
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %23 = OpLabel
+         %24 = OpLoad %v4float %tint_symbol
+               OpStore %frag_color %24
+         %25 = OpFunctionCall %void %main_1
+         %27 = OpLoad %v4float %x_GLF_color
+         %28 = OpCompositeConstruct %main_out %27
+         %26 = OpFunctionCall %void %tint_symbol_3 %28
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..b7d3ed1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/1.wgsl.expected.wgsl
@@ -0,0 +1,21 @@
+var<private> x_GLF_color : vec4<f32>;
+
+var<private> frag_color : vec4<f32>;
+
+fn main_1() {
+  let x_12 : vec4<f32> = frag_color;
+  x_GLF_color = x_12;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[location(0)]] frag_color_param : vec4<f32>) -> main_out {
+  frag_color = frag_color_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/2-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/2-opt.spvasm
new file mode 100644
index 0000000..9b0be33
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/2-opt.spvasm
@@ -0,0 +1,524 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %_GLF_pos %frag_color %__1
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %swap_i1_i1_ "swap(i1;i1;"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %performPartition_i1_i1_ "performPartition(i1;i1;"
+               OpName %l "l"
+               OpName %h "h"
+               OpName %quicksort_ "quicksort("
+               OpName %temp "temp"
+               OpName %QuicksortObject "QuicksortObject"
+               OpMemberName %QuicksortObject 0 "numbers"
+               OpName %obj "obj"
+               OpName %pivot "pivot"
+               OpName %i_0 "i"
+               OpName %j_0 "j"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %param_1 "param"
+               OpName %param_2 "param"
+               OpName %l_0 "l"
+               OpName %h_0 "h"
+               OpName %top "top"
+               OpName %stack "stack"
+               OpName %p "p"
+               OpName %param_3 "param"
+               OpName %param_4 "param"
+               OpName %_GLF_FragCoord "_GLF_FragCoord"
+               OpName %_GLF_pos "_GLF_pos"
+               OpName %i_1 "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %uv "uv"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "resolution"
+               OpName %__0 ""
+               OpName %color "color"
+               OpName %frag_color "frag_color"
+               OpName %gl_PerVertex "gl_PerVertex"
+               OpMemberName %gl_PerVertex 0 "gl_Position"
+               OpMemberName %gl_PerVertex 1 "gl_PointSize"
+               OpName %__1 ""
+               OpDecorate %_GLF_pos Location 0
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 1
+               OpDecorate %frag_color Location 0
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpDecorate %gl_PerVertex Block
+       %void = OpTypeVoid
+         %40 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %43 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+         %44 = OpTypeFunction %int %_ptr_Function_int %_ptr_Function_int
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%QuicksortObject = OpTypeStruct %_arr_int_uint_10
+%_ptr_Private_QuicksortObject = OpTypePointer Private %QuicksortObject
+        %obj = OpVariable %_ptr_Private_QuicksortObject Private
+      %int_0 = OpConstant %int 0
+%_ptr_Private_int = OpTypePointer Private %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %int_9 = OpConstant %int 9
+     %int_n1 = OpConstant %int -1
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+%_GLF_FragCoord = OpVariable %_ptr_Private_v4float Private
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+   %_GLF_pos = OpVariable %_ptr_Input_v4float Input
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %62 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_0
+  %float_128 = OpConstant %float 128
+         %64 = OpConstantComposite %v4float %float_128 %float_128 %float_1 %float_1
+     %int_10 = OpConstant %int 10
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+        %__0 = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+         %78 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+%_ptr_Function_float = OpTypePointer Function %float
+ %float_0_25 = OpConstant %float 0.25
+  %float_0_5 = OpConstant %float 0.5
+      %int_2 = OpConstant %int 2
+ %float_0_75 = OpConstant %float 0.75
+      %int_3 = OpConstant %int 3
+     %uint_2 = OpConstant %uint 2
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %frag_color = OpVariable %_ptr_Output_v4float Output
+%gl_PerVertex = OpTypeStruct %v4float %float
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+        %__1 = OpVariable %_ptr_Output_gl_PerVertex Output
+       %main = OpFunction %void None %40
+         %93 = OpLabel
+        %i_1 = OpVariable %_ptr_Function_int Function
+         %uv = OpVariable %_ptr_Function_v2float Function
+      %color = OpVariable %_ptr_Function_v3float Function
+         %94 = OpLoad %v4float %_GLF_pos
+         %95 = OpFAdd %v4float %94 %62
+         %96 = OpFMul %v4float %95 %64
+               OpStore %_GLF_FragCoord %96
+               OpStore %i_1 %int_0
+               OpBranch %97
+         %97 = OpLabel
+               OpLoopMerge %98 %99 None
+               OpBranch %100
+        %100 = OpLabel
+        %101 = OpLoad %int %i_1
+        %102 = OpSLessThan %bool %101 %int_10
+               OpBranchConditional %102 %103 %98
+        %103 = OpLabel
+        %104 = OpLoad %int %i_1
+        %105 = OpLoad %int %i_1
+        %106 = OpISub %int %int_10 %105
+        %107 = OpAccessChain %_ptr_Private_int %obj %int_0 %104
+               OpStore %107 %106
+        %108 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+        %109 = OpLoad %float %108
+        %110 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+        %111 = OpLoad %float %110
+        %112 = OpFOrdGreaterThan %bool %109 %111
+               OpSelectionMerge %113 None
+               OpBranchConditional %112 %114 %113
+        %114 = OpLabel
+               OpBranch %98
+        %113 = OpLabel
+        %115 = OpLoad %int %i_1
+        %116 = OpLoad %int %i_1
+        %117 = OpAccessChain %_ptr_Private_int %obj %int_0 %116
+        %118 = OpLoad %int %117
+        %119 = OpLoad %int %i_1
+        %120 = OpAccessChain %_ptr_Private_int %obj %int_0 %119
+        %121 = OpLoad %int %120
+        %122 = OpIMul %int %118 %121
+        %123 = OpAccessChain %_ptr_Private_int %obj %int_0 %115
+               OpStore %123 %122
+               OpBranch %99
+         %99 = OpLabel
+        %124 = OpLoad %int %i_1
+        %125 = OpIAdd %int %124 %int_1
+               OpStore %i_1 %125
+               OpBranch %97
+         %98 = OpLabel
+        %126 = OpFunctionCall %void %quicksort_
+        %127 = OpLoad %v4float %_GLF_FragCoord
+        %128 = OpVectorShuffle %v2float %127 %127 0 1
+        %129 = OpAccessChain %_ptr_Uniform_v2float %__0 %int_0
+        %130 = OpLoad %v2float %129
+        %131 = OpFDiv %v2float %128 %130
+               OpStore %uv %131
+               OpStore %color %78
+        %132 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_0
+        %133 = OpLoad %int %132
+        %134 = OpConvertSToF %float %133
+        %135 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %136 = OpLoad %float %135
+        %137 = OpFAdd %float %136 %134
+        %138 = OpAccessChain %_ptr_Function_float %color %uint_0
+               OpStore %138 %137
+        %139 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %140 = OpLoad %float %139
+        %141 = OpFOrdGreaterThan %bool %140 %float_0_25
+               OpSelectionMerge %142 None
+               OpBranchConditional %141 %143 %142
+        %143 = OpLabel
+        %144 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_1
+        %145 = OpLoad %int %144
+        %146 = OpConvertSToF %float %145
+        %147 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %148 = OpLoad %float %147
+        %149 = OpFAdd %float %148 %146
+        %150 = OpAccessChain %_ptr_Function_float %color %uint_0
+               OpStore %150 %149
+               OpBranch %142
+        %142 = OpLabel
+        %151 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %152 = OpLoad %float %151
+        %153 = OpFOrdGreaterThan %bool %152 %float_0_5
+               OpSelectionMerge %154 None
+               OpBranchConditional %153 %155 %154
+        %155 = OpLabel
+        %156 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_2
+        %157 = OpLoad %int %156
+        %158 = OpConvertSToF %float %157
+        %159 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %160 = OpLoad %float %159
+        %161 = OpFAdd %float %160 %158
+        %162 = OpAccessChain %_ptr_Function_float %color %uint_1
+               OpStore %162 %161
+               OpBranch %154
+        %154 = OpLabel
+        %163 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %164 = OpLoad %float %163
+        %165 = OpFOrdGreaterThan %bool %164 %float_0_75
+               OpSelectionMerge %166 None
+               OpBranchConditional %165 %167 %166
+        %167 = OpLabel
+        %168 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_3
+        %169 = OpLoad %int %168
+        %170 = OpConvertSToF %float %169
+        %171 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %172 = OpLoad %float %171
+        %173 = OpFAdd %float %172 %170
+        %174 = OpAccessChain %_ptr_Function_float %color %uint_2
+               OpStore %174 %173
+               OpBranch %166
+        %166 = OpLabel
+        %175 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_4
+        %176 = OpLoad %int %175
+        %177 = OpConvertSToF %float %176
+        %178 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %179 = OpLoad %float %178
+        %180 = OpFAdd %float %179 %177
+        %181 = OpAccessChain %_ptr_Function_float %color %uint_1
+               OpStore %181 %180
+        %182 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %183 = OpLoad %float %182
+        %184 = OpFOrdGreaterThan %bool %183 %float_0_25
+               OpSelectionMerge %185 None
+               OpBranchConditional %184 %186 %185
+        %186 = OpLabel
+        %187 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_5
+        %188 = OpLoad %int %187
+        %189 = OpConvertSToF %float %188
+        %190 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %191 = OpLoad %float %190
+        %192 = OpFAdd %float %191 %189
+        %193 = OpAccessChain %_ptr_Function_float %color %uint_0
+               OpStore %193 %192
+               OpBranch %185
+        %185 = OpLabel
+        %194 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %195 = OpLoad %float %194
+        %196 = OpFOrdGreaterThan %bool %195 %float_0_5
+               OpSelectionMerge %197 None
+               OpBranchConditional %196 %198 %197
+        %198 = OpLabel
+        %199 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_6
+        %200 = OpLoad %int %199
+        %201 = OpConvertSToF %float %200
+        %202 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %203 = OpLoad %float %202
+        %204 = OpFAdd %float %203 %201
+        %205 = OpAccessChain %_ptr_Function_float %color %uint_1
+               OpStore %205 %204
+               OpBranch %197
+        %197 = OpLabel
+        %206 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %207 = OpLoad %float %206
+        %208 = OpFOrdGreaterThan %bool %207 %float_0_75
+               OpSelectionMerge %209 None
+               OpBranchConditional %208 %210 %209
+        %210 = OpLabel
+        %211 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_7
+        %212 = OpLoad %int %211
+        %213 = OpConvertSToF %float %212
+        %214 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %215 = OpLoad %float %214
+        %216 = OpFAdd %float %215 %213
+        %217 = OpAccessChain %_ptr_Function_float %color %uint_2
+               OpStore %217 %216
+               OpBranch %209
+        %209 = OpLabel
+        %218 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_8
+        %219 = OpLoad %int %218
+        %220 = OpConvertSToF %float %219
+        %221 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %222 = OpLoad %float %221
+        %223 = OpFAdd %float %222 %220
+        %224 = OpAccessChain %_ptr_Function_float %color %uint_2
+               OpStore %224 %223
+        %225 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %226 = OpLoad %float %225
+        %227 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %228 = OpLoad %float %227
+        %229 = OpFSub %float %226 %228
+        %230 = OpExtInst %float %1 FAbs %229
+        %231 = OpFOrdLessThan %bool %230 %float_0_25
+               OpSelectionMerge %232 None
+               OpBranchConditional %231 %233 %232
+        %233 = OpLabel
+        %234 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_9
+        %235 = OpLoad %int %234
+        %236 = OpConvertSToF %float %235
+        %237 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %238 = OpLoad %float %237
+        %239 = OpFAdd %float %238 %236
+        %240 = OpAccessChain %_ptr_Function_float %color %uint_0
+               OpStore %240 %239
+               OpBranch %232
+        %232 = OpLabel
+        %241 = OpLoad %v3float %color
+        %242 = OpExtInst %v3float %1 Normalize %241
+        %243 = OpCompositeExtract %float %242 0
+        %244 = OpCompositeExtract %float %242 1
+        %245 = OpCompositeExtract %float %242 2
+        %246 = OpCompositeConstruct %v4float %243 %244 %245 %float_1
+               OpStore %frag_color %246
+        %247 = OpLoad %v4float %_GLF_pos
+        %248 = OpAccessChain %_ptr_Output_v4float %__1 %int_0
+               OpStore %248 %247
+               OpReturn
+               OpFunctionEnd
+%swap_i1_i1_ = OpFunction %void None %43
+          %i = OpFunctionParameter %_ptr_Function_int
+          %j = OpFunctionParameter %_ptr_Function_int
+        %249 = OpLabel
+       %temp = OpVariable %_ptr_Function_int Function
+        %250 = OpLoad %int %i
+        %251 = OpAccessChain %_ptr_Private_int %obj %int_0 %250
+        %252 = OpLoad %int %251
+               OpStore %temp %252
+        %253 = OpLoad %int %i
+        %254 = OpLoad %int %j
+        %255 = OpAccessChain %_ptr_Private_int %obj %int_0 %254
+        %256 = OpLoad %int %255
+        %257 = OpAccessChain %_ptr_Private_int %obj %int_0 %253
+               OpStore %257 %256
+        %258 = OpLoad %int %j
+        %259 = OpLoad %int %temp
+        %260 = OpAccessChain %_ptr_Private_int %obj %int_0 %258
+               OpStore %260 %259
+               OpReturn
+               OpFunctionEnd
+%performPartition_i1_i1_ = OpFunction %int None %44
+          %l = OpFunctionParameter %_ptr_Function_int
+          %h = OpFunctionParameter %_ptr_Function_int
+        %261 = OpLabel
+      %pivot = OpVariable %_ptr_Function_int Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+        %j_0 = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_int Function
+    %param_0 = OpVariable %_ptr_Function_int Function
+    %param_1 = OpVariable %_ptr_Function_int Function
+    %param_2 = OpVariable %_ptr_Function_int Function
+        %262 = OpLoad %int %h
+        %263 = OpAccessChain %_ptr_Private_int %obj %int_0 %262
+        %264 = OpLoad %int %263
+               OpStore %pivot %264
+        %265 = OpLoad %int %l
+        %266 = OpISub %int %265 %int_1
+               OpStore %i_0 %266
+        %267 = OpLoad %int %l
+               OpStore %j_0 %267
+               OpBranch %268
+        %268 = OpLabel
+               OpLoopMerge %269 %270 None
+               OpBranch %271
+        %271 = OpLabel
+        %272 = OpLoad %int %j_0
+        %273 = OpLoad %int %h
+        %274 = OpISub %int %273 %int_1
+        %275 = OpSLessThanEqual %bool %272 %274
+               OpBranchConditional %275 %276 %269
+        %276 = OpLabel
+        %277 = OpLoad %int %j_0
+        %278 = OpAccessChain %_ptr_Private_int %obj %int_0 %277
+        %279 = OpLoad %int %278
+        %280 = OpLoad %int %pivot
+        %281 = OpSLessThanEqual %bool %279 %280
+               OpSelectionMerge %282 None
+               OpBranchConditional %281 %283 %282
+        %283 = OpLabel
+        %284 = OpLoad %int %i_0
+        %285 = OpIAdd %int %284 %int_1
+               OpStore %i_0 %285
+        %286 = OpLoad %int %i_0
+               OpStore %param %286
+        %287 = OpLoad %int %j_0
+               OpStore %param_0 %287
+        %288 = OpFunctionCall %void %swap_i1_i1_ %param %param_0
+               OpBranch %282
+        %282 = OpLabel
+               OpBranch %270
+        %270 = OpLabel
+        %289 = OpLoad %int %j_0
+        %290 = OpIAdd %int %289 %int_1
+               OpStore %j_0 %290
+               OpBranch %268
+        %269 = OpLabel
+        %291 = OpLoad %int %i_0
+        %292 = OpIAdd %int %291 %int_1
+               OpStore %param_1 %292
+        %293 = OpLoad %int %h
+               OpStore %param_2 %293
+        %294 = OpFunctionCall %void %swap_i1_i1_ %param_1 %param_2
+        %295 = OpLoad %int %i_0
+        %296 = OpIAdd %int %295 %int_1
+               OpReturnValue %296
+               OpFunctionEnd
+ %quicksort_ = OpFunction %void None %40
+        %297 = OpLabel
+        %l_0 = OpVariable %_ptr_Function_int Function
+        %h_0 = OpVariable %_ptr_Function_int Function
+        %top = OpVariable %_ptr_Function_int Function
+      %stack = OpVariable %_ptr_Function__arr_int_uint_10 Function
+          %p = OpVariable %_ptr_Function_int Function
+    %param_3 = OpVariable %_ptr_Function_int Function
+    %param_4 = OpVariable %_ptr_Function_int Function
+               OpStore %l_0 %int_0
+               OpStore %h_0 %int_9
+               OpStore %top %int_n1
+        %298 = OpLoad %int %top
+        %299 = OpIAdd %int %298 %int_1
+               OpStore %top %299
+        %300 = OpLoad %int %l_0
+        %301 = OpAccessChain %_ptr_Function_int %stack %299
+               OpStore %301 %300
+        %302 = OpLoad %int %top
+        %303 = OpIAdd %int %302 %int_1
+               OpStore %top %303
+        %304 = OpLoad %int %h_0
+        %305 = OpAccessChain %_ptr_Function_int %stack %303
+               OpStore %305 %304
+               OpBranch %306
+        %306 = OpLabel
+               OpLoopMerge %307 %308 None
+               OpBranch %309
+        %309 = OpLabel
+        %310 = OpLoad %int %top
+        %311 = OpSGreaterThanEqual %bool %310 %int_0
+               OpBranchConditional %311 %312 %307
+        %312 = OpLabel
+        %313 = OpLoad %int %top
+        %314 = OpISub %int %313 %int_1
+               OpStore %top %314
+        %315 = OpAccessChain %_ptr_Function_int %stack %313
+        %316 = OpLoad %int %315
+               OpStore %h_0 %316
+        %317 = OpLoad %int %top
+        %318 = OpISub %int %317 %int_1
+               OpStore %top %318
+        %319 = OpAccessChain %_ptr_Function_int %stack %317
+        %320 = OpLoad %int %319
+               OpStore %l_0 %320
+        %321 = OpLoad %int %l_0
+               OpStore %param_3 %321
+        %322 = OpLoad %int %h_0
+               OpStore %param_4 %322
+        %323 = OpFunctionCall %int %performPartition_i1_i1_ %param_3 %param_4
+               OpStore %p %323
+        %324 = OpLoad %int %p
+        %325 = OpISub %int %324 %int_1
+        %326 = OpLoad %int %l_0
+        %327 = OpSGreaterThan %bool %325 %326
+               OpSelectionMerge %328 None
+               OpBranchConditional %327 %329 %328
+        %329 = OpLabel
+        %330 = OpLoad %int %top
+        %331 = OpIAdd %int %330 %int_1
+               OpStore %top %331
+        %332 = OpLoad %int %l_0
+        %333 = OpAccessChain %_ptr_Function_int %stack %331
+               OpStore %333 %332
+        %334 = OpLoad %int %top
+        %335 = OpIAdd %int %334 %int_1
+               OpStore %top %335
+        %336 = OpLoad %int %p
+        %337 = OpISub %int %336 %int_1
+        %338 = OpAccessChain %_ptr_Function_int %stack %335
+               OpStore %338 %337
+               OpBranch %328
+        %328 = OpLabel
+        %339 = OpLoad %int %p
+        %340 = OpIAdd %int %339 %int_1
+        %341 = OpLoad %int %h_0
+        %342 = OpSLessThan %bool %340 %341
+               OpSelectionMerge %343 None
+               OpBranchConditional %342 %344 %343
+        %344 = OpLabel
+        %345 = OpLoad %int %top
+        %346 = OpIAdd %int %345 %int_1
+               OpStore %top %346
+        %347 = OpLoad %int %p
+        %348 = OpIAdd %int %347 %int_1
+        %349 = OpAccessChain %_ptr_Function_int %stack %346
+               OpStore %349 %348
+        %350 = OpLoad %int %top
+        %351 = OpIAdd %int %350 %int_1
+               OpStore %top %351
+        %352 = OpLoad %int %h_0
+        %353 = OpAccessChain %_ptr_Function_int %stack %351
+               OpStore %353 %352
+               OpBranch %343
+        %343 = OpLabel
+               OpBranch %308
+        %308 = OpLabel
+               OpBranch %306
+        %307 = OpLabel
+               OpReturn
+               OpFunctionEnd
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
new file mode 100644
index 0000000..017bbe6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/2-opt.spvasm.expected.hlsl
@@ -0,0 +1,227 @@
+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;
+  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;
+  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;
+  {
+    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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 x_GLF_pos_param = tint_symbol.x_GLF_pos_param;
+  x_GLF_pos = x_GLF_pos_param;
+  main_1();
+  const main_out tint_symbol_3 = {frag_color, gl_Position};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.frag_color_1, tint_symbol_3.gl_Position};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/2-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/2-opt.spvasm.expected.msl
new file mode 100644
index 0000000..fae0fc6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/2-opt.spvasm.expected.msl
@@ -0,0 +1,274 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct QuicksortObject {
+  tint_array_wrapper numbers;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct buf1 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 frag_color_1;
+  float4 gl_Position;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_pos_param [[attribute(0)]];
+};
+struct tint_symbol_3 {
+  float4 frag_color_1 [[user(locn0)]];
+  float4 gl_Position [[position]];
+};
+
+void swap_i1_i1_(thread int* const i, thread int* const j, thread QuicksortObject* const tint_symbol_6) {
+  int temp = 0;
+  int const x_250 = *(i);
+  int const x_252 = (*(tint_symbol_6)).numbers.arr[x_250];
+  temp = x_252;
+  int const x_253 = *(i);
+  int const x_254 = *(j);
+  int const x_256 = (*(tint_symbol_6)).numbers.arr[x_254];
+  (*(tint_symbol_6)).numbers.arr[x_253] = x_256;
+  int const x_258 = *(j);
+  int const x_259 = temp;
+  (*(tint_symbol_6)).numbers.arr[x_258] = x_259;
+  return;
+}
+
+int performPartition_i1_i1_(thread int* const l, thread int* const h, thread QuicksortObject* const tint_symbol_7) {
+  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;
+  int const x_262 = *(h);
+  int const x_264 = (*(tint_symbol_7)).numbers.arr[x_262];
+  pivot = x_264;
+  int const x_265 = *(l);
+  i_1 = (x_265 - 1);
+  int const x_267 = *(l);
+  j_1 = x_267;
+  while (true) {
+    int const x_272 = j_1;
+    int const x_273 = *(h);
+    if ((x_272 <= (x_273 - 1))) {
+    } else {
+      break;
+    }
+    int const x_277 = j_1;
+    int const x_279 = (*(tint_symbol_7)).numbers.arr[x_277];
+    int const x_280 = pivot;
+    if ((x_279 <= x_280)) {
+      int const x_284 = i_1;
+      i_1 = (x_284 + 1);
+      int const x_286 = i_1;
+      param = x_286;
+      int const x_287 = j_1;
+      param_1 = x_287;
+      swap_i1_i1_(&(param), &(param_1), tint_symbol_7);
+    }
+    {
+      int const x_289 = j_1;
+      j_1 = (x_289 + 1);
+    }
+  }
+  int const x_291 = i_1;
+  param_2 = (x_291 + 1);
+  int const x_293 = *(h);
+  param_3 = x_293;
+  swap_i1_i1_(&(param_2), &(param_3), tint_symbol_7);
+  int const x_295 = i_1;
+  return (x_295 + 1);
+}
+
+void quicksort_(thread QuicksortObject* const tint_symbol_8) {
+  int l_1 = 0;
+  int h_1 = 0;
+  int top = 0;
+  tint_array_wrapper stack = {};
+  int p = 0;
+  int param_4 = 0;
+  int param_5 = 0;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  int const x_298 = top;
+  int const x_299 = (x_298 + 1);
+  top = x_299;
+  int const x_300 = l_1;
+  stack.arr[x_299] = x_300;
+  int const x_302 = top;
+  int const x_303 = (x_302 + 1);
+  top = x_303;
+  int const x_304 = h_1;
+  stack.arr[x_303] = x_304;
+  while (true) {
+    int const x_310 = top;
+    if ((x_310 >= 0)) {
+    } else {
+      break;
+    }
+    int const x_313 = top;
+    top = (x_313 - 1);
+    int const x_316 = stack.arr[x_313];
+    h_1 = x_316;
+    int const x_317 = top;
+    top = (x_317 - 1);
+    int const x_320 = stack.arr[x_317];
+    l_1 = x_320;
+    int const x_321 = l_1;
+    param_4 = x_321;
+    int const x_322 = h_1;
+    param_5 = x_322;
+    int const x_323 = performPartition_i1_i1_(&(param_4), &(param_5), tint_symbol_8);
+    p = x_323;
+    int const x_324 = p;
+    int const x_326 = l_1;
+    if (((x_324 - 1) > x_326)) {
+      int const x_330 = top;
+      int const x_331 = (x_330 + 1);
+      top = x_331;
+      int const x_332 = l_1;
+      stack.arr[x_331] = x_332;
+      int const x_334 = top;
+      int const x_335 = (x_334 + 1);
+      top = x_335;
+      int const x_336 = p;
+      stack.arr[x_335] = (x_336 - 1);
+    }
+    int const x_339 = p;
+    int const x_341 = h_1;
+    if (((x_339 + 1) < x_341)) {
+      int const x_345 = top;
+      int const x_346 = (x_345 + 1);
+      top = x_346;
+      int const x_347 = p;
+      stack.arr[x_346] = (x_347 + 1);
+      int const x_350 = top;
+      int const x_351 = (x_350 + 1);
+      top = x_351;
+      int const x_352 = h_1;
+      stack.arr[x_351] = x_352;
+    }
+  }
+  return;
+}
+
+void main_1(constant buf0& x_33, constant buf1& x_36, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10, thread QuicksortObject* const tint_symbol_11, thread float4* const tint_symbol_12, thread float4* const tint_symbol_13) {
+  int i_2 = 0;
+  float2 uv = 0.0f;
+  float3 color = 0.0f;
+  float4 const x_94 = *(tint_symbol_9);
+  *(tint_symbol_10) = ((x_94 + float4(1.0f, 1.0f, 0.0f, 0.0f)) * float4(128.0f, 128.0f, 1.0f, 1.0f));
+  i_2 = 0;
+  while (true) {
+    int const x_101 = i_2;
+    if ((x_101 < 10)) {
+    } else {
+      break;
+    }
+    int const x_104 = i_2;
+    int const x_105 = i_2;
+    (*(tint_symbol_11)).numbers.arr[x_104] = (10 - x_105);
+    float const x_109 = x_33.injectionSwitch.x;
+    float const x_111 = x_33.injectionSwitch.y;
+    if ((x_109 > x_111)) {
+      break;
+    }
+    int const x_115 = i_2;
+    int const x_116 = i_2;
+    int const x_118 = (*(tint_symbol_11)).numbers.arr[x_116];
+    int const x_119 = i_2;
+    int const x_121 = (*(tint_symbol_11)).numbers.arr[x_119];
+    (*(tint_symbol_11)).numbers.arr[x_115] = (x_118 * x_121);
+    {
+      int const x_124 = i_2;
+      i_2 = (x_124 + 1);
+    }
+  }
+  quicksort_(tint_symbol_11);
+  float4 const x_127 = *(tint_symbol_10);
+  float2 const x_130 = x_36.resolution;
+  uv = (float2(x_127.x, x_127.y) / x_130);
+  color = float3(1.0f, 2.0f, 3.0f);
+  int const x_133 = (*(tint_symbol_11)).numbers.arr[0];
+  float const x_136 = color.x;
+  color.x = (x_136 + float(x_133));
+  float const x_140 = uv.x;
+  if ((x_140 > 0.25f)) {
+    int const x_145 = (*(tint_symbol_11)).numbers.arr[1];
+    float const x_148 = color.x;
+    color.x = (x_148 + float(x_145));
+  }
+  float const x_152 = uv.x;
+  if ((x_152 > 0.5f)) {
+    int const x_157 = (*(tint_symbol_11)).numbers.arr[2];
+    float const x_160 = color.y;
+    color.y = (x_160 + float(x_157));
+  }
+  float const x_164 = uv.x;
+  if ((x_164 > 0.75f)) {
+    int const x_169 = (*(tint_symbol_11)).numbers.arr[3];
+    float const x_172 = color.z;
+    color.z = (x_172 + float(x_169));
+  }
+  int const x_176 = (*(tint_symbol_11)).numbers.arr[4];
+  float const x_179 = color.y;
+  color.y = (x_179 + float(x_176));
+  float const x_183 = uv.y;
+  if ((x_183 > 0.25f)) {
+    int const x_188 = (*(tint_symbol_11)).numbers.arr[5];
+    float const x_191 = color.x;
+    color.x = (x_191 + float(x_188));
+  }
+  float const x_195 = uv.y;
+  if ((x_195 > 0.5f)) {
+    int const x_200 = (*(tint_symbol_11)).numbers.arr[6];
+    float const x_203 = color.y;
+    color.y = (x_203 + float(x_200));
+  }
+  float const x_207 = uv.y;
+  if ((x_207 > 0.75f)) {
+    int const x_212 = (*(tint_symbol_11)).numbers.arr[7];
+    float const x_215 = color.z;
+    color.z = (x_215 + float(x_212));
+  }
+  int const x_219 = (*(tint_symbol_11)).numbers.arr[8];
+  float const x_222 = color.z;
+  color.z = (x_222 + float(x_219));
+  float const x_226 = uv.x;
+  float const x_228 = uv.y;
+  if ((fabs((x_226 - x_228)) < 0.25f)) {
+    int const x_235 = (*(tint_symbol_11)).numbers.arr[9];
+    float const x_238 = color.x;
+    color.x = (x_238 + float(x_235));
+  }
+  float3 const x_241 = color;
+  float3 const x_242 = normalize(x_241);
+  *(tint_symbol_12) = float4(x_242.x, x_242.y, x_242.z, 1.0f);
+  float4 const x_247 = *(tint_symbol_9);
+  *(tint_symbol_13) = x_247;
+  return;
+}
+
+vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]], constant buf0& x_33 [[buffer(0)]], constant buf1& x_36 [[buffer(1)]]) {
+  thread float4 tint_symbol_14 = 0.0f;
+  thread float4 tint_symbol_15 = 0.0f;
+  thread QuicksortObject tint_symbol_16 = {};
+  thread float4 tint_symbol_17 = 0.0f;
+  thread float4 tint_symbol_18 = 0.0f;
+  float4 const x_GLF_pos_param = tint_symbol_1.x_GLF_pos_param;
+  tint_symbol_14 = x_GLF_pos_param;
+  main_1(x_33, x_36, &(tint_symbol_14), &(tint_symbol_15), &(tint_symbol_16), &(tint_symbol_17), &(tint_symbol_18));
+  main_out const tint_symbol_4 = {.frag_color_1=tint_symbol_17, .gl_Position=tint_symbol_18};
+  tint_symbol_3 const tint_symbol_5 = {.frag_color_1=tint_symbol_4.frag_color_1, .gl_Position=tint_symbol_4.gl_Position};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/2-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/2-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..e0c2ca0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/2-opt.spvasm.expected.spvasm
@@ -0,0 +1,589 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 401
+; Schema: 0
+               OpCapability Shader
+        %367 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %tint_pointsize %tint_symbol %tint_symbol_2 %tint_symbol_3
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %QuicksortObject "QuicksortObject"
+               OpMemberName %QuicksortObject 0 "numbers"
+               OpName %obj "obj"
+               OpName %x_GLF_FragCoord "x_GLF_FragCoord"
+               OpName %x_GLF_pos "x_GLF_pos"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_33 "x_33"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "resolution"
+               OpName %x_36 "x_36"
+               OpName %frag_color "frag_color"
+               OpName %gl_Position "gl_Position"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %swap_i1_i1_ "swap_i1_i1_"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %temp "temp"
+               OpName %performPartition_i1_i1_ "performPartition_i1_i1_"
+               OpName %l "l"
+               OpName %h "h"
+               OpName %pivot "pivot"
+               OpName %i_1 "i_1"
+               OpName %j_1 "j_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %quicksort_ "quicksort_"
+               OpName %l_1 "l_1"
+               OpName %h_1 "h_1"
+               OpName %top "top"
+               OpName %stack "stack"
+               OpName %p "p"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpName %main_1 "main_1"
+               OpName %i_2 "i_2"
+               OpName %uv "uv"
+               OpName %color "color"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "frag_color_1"
+               OpMemberName %main_out 1 "gl_Position"
+               OpName %tint_symbol_4 "tint_symbol_4"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpMemberDecorate %QuicksortObject 0 Offset 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_33 NonWritable
+               OpDecorate %x_33 DescriptorSet 0
+               OpDecorate %x_33 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_36 NonWritable
+               OpDecorate %x_36 DescriptorSet 0
+               OpDecorate %x_36 Binding 1
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %tint_symbol_3 BuiltIn Position
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%QuicksortObject = OpTypeStruct %_arr_int_uint_10
+%_ptr_Private_QuicksortObject = OpTypePointer Private %QuicksortObject
+         %12 = OpConstantNull %QuicksortObject
+        %obj = OpVariable %_ptr_Private_QuicksortObject Private %12
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_FragCoord = OpVariable %_ptr_Private_v4float Private %16
+  %x_GLF_pos = OpVariable %_ptr_Private_v4float Private %16
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_33 = OpVariable %_ptr_Uniform_buf0 Uniform
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_36 = OpVariable %_ptr_Uniform_buf1 Uniform
+ %frag_color = OpVariable %_ptr_Private_v4float Private %16
+%gl_Position = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %16
+%tint_symbol_3 = OpVariable %_ptr_Output_v4float Output %16
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+         %32 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+         %40 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_int = OpTypePointer Private %int
+         %58 = OpTypeFunction %int %_ptr_Function_int %_ptr_Function_int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+        %118 = OpTypeFunction %void
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+        %126 = OpConstantNull %_arr_int_uint_10
+      %int_0 = OpConstant %int 0
+      %int_9 = OpConstant %int 9
+     %int_n1 = OpConstant %int -1
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+        %198 = OpConstantNull %v2float
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+        %202 = OpConstantNull %v3float
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+        %206 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_0
+  %float_128 = OpConstant %float 128
+        %209 = OpConstantComposite %v4float %float_128 %float_128 %float_1 %float_1
+     %int_10 = OpConstant %int 10
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+        %256 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+%_ptr_Function_float = OpTypePointer Function %float
+ %float_0_25 = OpConstant %float 0.25
+  %float_0_5 = OpConstant %float 0.5
+      %int_2 = OpConstant %int 2
+ %float_0_75 = OpConstant %float 0.75
+      %int_3 = OpConstant %int 3
+     %uint_2 = OpConstant %uint 2
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+   %main_out = OpTypeStruct %v4float %v4float
+        %386 = OpTypeFunction %void %main_out
+%swap_i1_i1_ = OpFunction %void None %32
+          %i = OpFunctionParameter %_ptr_Function_int
+          %j = OpFunctionParameter %_ptr_Function_int
+         %38 = OpLabel
+       %temp = OpVariable %_ptr_Function_int Function %40
+         %42 = OpLoad %int %i
+         %45 = OpAccessChain %_ptr_Private_int %obj %uint_0 %42
+         %46 = OpLoad %int %45
+               OpStore %temp %46
+         %48 = OpLoad %int %i
+         %50 = OpLoad %int %j
+         %51 = OpAccessChain %_ptr_Private_int %obj %uint_0 %50
+         %52 = OpLoad %int %51
+         %53 = OpAccessChain %_ptr_Private_int %obj %uint_0 %48
+               OpStore %53 %52
+         %55 = OpLoad %int %j
+         %56 = OpLoad %int %temp
+         %57 = OpAccessChain %_ptr_Private_int %obj %uint_0 %55
+               OpStore %57 %56
+               OpReturn
+               OpFunctionEnd
+%performPartition_i1_i1_ = OpFunction %int None %58
+          %l = OpFunctionParameter %_ptr_Function_int
+          %h = OpFunctionParameter %_ptr_Function_int
+         %62 = OpLabel
+      %pivot = OpVariable %_ptr_Function_int Function %40
+        %i_1 = OpVariable %_ptr_Function_int Function %40
+        %j_1 = OpVariable %_ptr_Function_int Function %40
+      %param = OpVariable %_ptr_Function_int Function %40
+    %param_1 = OpVariable %_ptr_Function_int Function %40
+    %param_2 = OpVariable %_ptr_Function_int Function %40
+    %param_3 = OpVariable %_ptr_Function_int Function %40
+         %71 = OpLoad %int %h
+         %72 = OpAccessChain %_ptr_Private_int %obj %uint_0 %71
+         %73 = OpLoad %int %72
+               OpStore %pivot %73
+         %75 = OpLoad %int %l
+         %77 = OpISub %int %75 %int_1
+               OpStore %i_1 %77
+         %79 = OpLoad %int %l
+               OpStore %j_1 %79
+               OpBranch %80
+         %80 = OpLabel
+               OpLoopMerge %81 %82 None
+               OpBranch %83
+         %83 = OpLabel
+         %84 = OpLoad %int %j_1
+         %86 = OpLoad %int %h
+         %87 = OpISub %int %86 %int_1
+         %88 = OpSLessThanEqual %bool %84 %87
+               OpSelectionMerge %90 None
+               OpBranchConditional %88 %91 %92
+         %91 = OpLabel
+               OpBranch %90
+         %92 = OpLabel
+               OpBranch %81
+         %90 = OpLabel
+         %93 = OpLoad %int %j_1
+         %94 = OpAccessChain %_ptr_Private_int %obj %uint_0 %93
+         %95 = OpLoad %int %94
+         %96 = OpLoad %int %pivot
+         %97 = OpSLessThanEqual %bool %95 %96
+               OpSelectionMerge %98 None
+               OpBranchConditional %97 %99 %98
+         %99 = OpLabel
+        %100 = OpLoad %int %i_1
+        %101 = OpIAdd %int %100 %int_1
+               OpStore %i_1 %101
+        %102 = OpLoad %int %i_1
+               OpStore %param %102
+        %103 = OpLoad %int %j_1
+               OpStore %param_1 %103
+        %104 = OpFunctionCall %void %swap_i1_i1_ %param %param_1
+               OpBranch %98
+         %98 = OpLabel
+               OpBranch %82
+         %82 = OpLabel
+        %107 = OpLoad %int %j_1
+        %108 = OpIAdd %int %107 %int_1
+               OpStore %j_1 %108
+               OpBranch %80
+         %81 = OpLabel
+        %109 = OpLoad %int %i_1
+        %110 = OpIAdd %int %109 %int_1
+               OpStore %param_2 %110
+        %112 = OpLoad %int %h
+               OpStore %param_3 %112
+        %113 = OpFunctionCall %void %swap_i1_i1_ %param_2 %param_3
+        %116 = OpLoad %int %i_1
+        %117 = OpIAdd %int %116 %int_1
+               OpReturnValue %117
+               OpFunctionEnd
+ %quicksort_ = OpFunction %void None %118
+        %120 = OpLabel
+        %l_1 = OpVariable %_ptr_Function_int Function %40
+        %h_1 = OpVariable %_ptr_Function_int Function %40
+        %top = OpVariable %_ptr_Function_int Function %40
+      %stack = OpVariable %_ptr_Function__arr_int_uint_10 Function %126
+          %p = OpVariable %_ptr_Function_int Function %40
+    %param_4 = OpVariable %_ptr_Function_int Function %40
+    %param_5 = OpVariable %_ptr_Function_int Function %40
+               OpStore %l_1 %int_0
+               OpStore %h_1 %int_9
+               OpStore %top %int_n1
+        %133 = OpLoad %int %top
+        %134 = OpIAdd %int %133 %int_1
+               OpStore %top %134
+        %135 = OpLoad %int %l_1
+        %136 = OpAccessChain %_ptr_Function_int %stack %134
+               OpStore %136 %135
+        %137 = OpLoad %int %top
+        %138 = OpIAdd %int %137 %int_1
+               OpStore %top %138
+        %139 = OpLoad %int %h_1
+        %140 = OpAccessChain %_ptr_Function_int %stack %138
+               OpStore %140 %139
+               OpBranch %141
+        %141 = OpLabel
+               OpLoopMerge %142 %143 None
+               OpBranch %144
+        %144 = OpLabel
+        %145 = OpLoad %int %top
+        %146 = OpSGreaterThanEqual %bool %145 %int_0
+               OpSelectionMerge %147 None
+               OpBranchConditional %146 %148 %149
+        %148 = OpLabel
+               OpBranch %147
+        %149 = OpLabel
+               OpBranch %142
+        %147 = OpLabel
+        %150 = OpLoad %int %top
+        %151 = OpISub %int %150 %int_1
+               OpStore %top %151
+        %152 = OpAccessChain %_ptr_Function_int %stack %150
+        %153 = OpLoad %int %152
+               OpStore %h_1 %153
+        %154 = OpLoad %int %top
+        %155 = OpISub %int %154 %int_1
+               OpStore %top %155
+        %156 = OpAccessChain %_ptr_Function_int %stack %154
+        %157 = OpLoad %int %156
+               OpStore %l_1 %157
+        %158 = OpLoad %int %l_1
+               OpStore %param_4 %158
+        %159 = OpLoad %int %h_1
+               OpStore %param_5 %159
+        %160 = OpFunctionCall %int %performPartition_i1_i1_ %param_4 %param_5
+               OpStore %p %160
+        %163 = OpLoad %int %p
+        %164 = OpLoad %int %l_1
+        %165 = OpISub %int %163 %int_1
+        %166 = OpSGreaterThan %bool %165 %164
+               OpSelectionMerge %167 None
+               OpBranchConditional %166 %168 %167
+        %168 = OpLabel
+        %169 = OpLoad %int %top
+        %170 = OpIAdd %int %169 %int_1
+               OpStore %top %170
+        %171 = OpLoad %int %l_1
+        %172 = OpAccessChain %_ptr_Function_int %stack %170
+               OpStore %172 %171
+        %173 = OpLoad %int %top
+        %174 = OpIAdd %int %173 %int_1
+               OpStore %top %174
+        %175 = OpLoad %int %p
+        %176 = OpAccessChain %_ptr_Function_int %stack %174
+        %177 = OpISub %int %175 %int_1
+               OpStore %176 %177
+               OpBranch %167
+        %167 = OpLabel
+        %178 = OpLoad %int %p
+        %179 = OpLoad %int %h_1
+        %180 = OpIAdd %int %178 %int_1
+        %181 = OpSLessThan %bool %180 %179
+               OpSelectionMerge %182 None
+               OpBranchConditional %181 %183 %182
+        %183 = OpLabel
+        %184 = OpLoad %int %top
+        %185 = OpIAdd %int %184 %int_1
+               OpStore %top %185
+        %186 = OpLoad %int %p
+        %187 = OpAccessChain %_ptr_Function_int %stack %185
+        %188 = OpIAdd %int %186 %int_1
+               OpStore %187 %188
+        %189 = OpLoad %int %top
+        %190 = OpIAdd %int %189 %int_1
+               OpStore %top %190
+        %191 = OpLoad %int %h_1
+        %192 = OpAccessChain %_ptr_Function_int %stack %190
+               OpStore %192 %191
+               OpBranch %182
+        %182 = OpLabel
+               OpBranch %143
+        %143 = OpLabel
+               OpBranch %141
+        %142 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %118
+        %194 = OpLabel
+        %i_2 = OpVariable %_ptr_Function_int Function %40
+         %uv = OpVariable %_ptr_Function_v2float Function %198
+      %color = OpVariable %_ptr_Function_v3float Function %202
+        %203 = OpLoad %v4float %x_GLF_pos
+        %207 = OpFAdd %v4float %203 %206
+        %210 = OpFMul %v4float %207 %209
+               OpStore %x_GLF_FragCoord %210
+               OpStore %i_2 %int_0
+               OpBranch %211
+        %211 = OpLabel
+               OpLoopMerge %212 %213 None
+               OpBranch %214
+        %214 = OpLabel
+        %215 = OpLoad %int %i_2
+        %217 = OpSLessThan %bool %215 %int_10
+               OpSelectionMerge %218 None
+               OpBranchConditional %217 %219 %220
+        %219 = OpLabel
+               OpBranch %218
+        %220 = OpLabel
+               OpBranch %212
+        %218 = OpLabel
+        %221 = OpLoad %int %i_2
+        %222 = OpLoad %int %i_2
+        %223 = OpAccessChain %_ptr_Private_int %obj %uint_0 %221
+        %224 = OpISub %int %int_10 %222
+               OpStore %223 %224
+        %226 = OpAccessChain %_ptr_Uniform_float %x_33 %uint_0 %uint_0
+        %227 = OpLoad %float %226
+        %229 = OpAccessChain %_ptr_Uniform_float %x_33 %uint_0 %uint_1
+        %230 = OpLoad %float %229
+        %231 = OpFOrdGreaterThan %bool %227 %230
+               OpSelectionMerge %232 None
+               OpBranchConditional %231 %233 %232
+        %233 = OpLabel
+               OpBranch %212
+        %232 = OpLabel
+        %234 = OpLoad %int %i_2
+        %235 = OpLoad %int %i_2
+        %236 = OpAccessChain %_ptr_Private_int %obj %uint_0 %235
+        %237 = OpLoad %int %236
+        %238 = OpLoad %int %i_2
+        %239 = OpAccessChain %_ptr_Private_int %obj %uint_0 %238
+        %240 = OpLoad %int %239
+        %241 = OpAccessChain %_ptr_Private_int %obj %uint_0 %234
+        %242 = OpIMul %int %237 %240
+               OpStore %241 %242
+               OpBranch %213
+        %213 = OpLabel
+        %243 = OpLoad %int %i_2
+        %244 = OpIAdd %int %243 %int_1
+               OpStore %i_2 %244
+               OpBranch %211
+        %212 = OpLabel
+        %245 = OpFunctionCall %void %quicksort_
+        %246 = OpLoad %v4float %x_GLF_FragCoord
+        %248 = OpAccessChain %_ptr_Uniform_v2float %x_36 %uint_0
+        %249 = OpLoad %v2float %248
+        %250 = OpCompositeExtract %float %246 0
+        %251 = OpCompositeExtract %float %246 1
+        %252 = OpCompositeConstruct %v2float %250 %251
+        %253 = OpFDiv %v2float %252 %249
+               OpStore %uv %253
+               OpStore %color %256
+        %257 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_0
+        %258 = OpLoad %int %257
+        %260 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %261 = OpLoad %float %260
+        %262 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %263 = OpConvertSToF %float %258
+        %264 = OpFAdd %float %261 %263
+               OpStore %262 %264
+        %265 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %266 = OpLoad %float %265
+        %268 = OpFOrdGreaterThan %bool %266 %float_0_25
+               OpSelectionMerge %269 None
+               OpBranchConditional %268 %270 %269
+        %270 = OpLabel
+        %271 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_1
+        %272 = OpLoad %int %271
+        %273 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %274 = OpLoad %float %273
+        %275 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %276 = OpConvertSToF %float %272
+        %277 = OpFAdd %float %274 %276
+               OpStore %275 %277
+               OpBranch %269
+        %269 = OpLabel
+        %278 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %279 = OpLoad %float %278
+        %281 = OpFOrdGreaterThan %bool %279 %float_0_5
+               OpSelectionMerge %282 None
+               OpBranchConditional %281 %283 %282
+        %283 = OpLabel
+        %285 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_2
+        %286 = OpLoad %int %285
+        %287 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %288 = OpLoad %float %287
+        %289 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %290 = OpConvertSToF %float %286
+        %291 = OpFAdd %float %288 %290
+               OpStore %289 %291
+               OpBranch %282
+        %282 = OpLabel
+        %292 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %293 = OpLoad %float %292
+        %295 = OpFOrdGreaterThan %bool %293 %float_0_75
+               OpSelectionMerge %296 None
+               OpBranchConditional %295 %297 %296
+        %297 = OpLabel
+        %299 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_3
+        %300 = OpLoad %int %299
+        %302 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %303 = OpLoad %float %302
+        %304 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %305 = OpConvertSToF %float %300
+        %306 = OpFAdd %float %303 %305
+               OpStore %304 %306
+               OpBranch %296
+        %296 = OpLabel
+        %308 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_4
+        %309 = OpLoad %int %308
+        %310 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %311 = OpLoad %float %310
+        %312 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %313 = OpConvertSToF %float %309
+        %314 = OpFAdd %float %311 %313
+               OpStore %312 %314
+        %315 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %316 = OpLoad %float %315
+        %317 = OpFOrdGreaterThan %bool %316 %float_0_25
+               OpSelectionMerge %318 None
+               OpBranchConditional %317 %319 %318
+        %319 = OpLabel
+        %321 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_5
+        %322 = OpLoad %int %321
+        %323 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %324 = OpLoad %float %323
+        %325 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %326 = OpConvertSToF %float %322
+        %327 = OpFAdd %float %324 %326
+               OpStore %325 %327
+               OpBranch %318
+        %318 = OpLabel
+        %328 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %329 = OpLoad %float %328
+        %330 = OpFOrdGreaterThan %bool %329 %float_0_5
+               OpSelectionMerge %331 None
+               OpBranchConditional %330 %332 %331
+        %332 = OpLabel
+        %334 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_6
+        %335 = OpLoad %int %334
+        %336 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %337 = OpLoad %float %336
+        %338 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %339 = OpConvertSToF %float %335
+        %340 = OpFAdd %float %337 %339
+               OpStore %338 %340
+               OpBranch %331
+        %331 = OpLabel
+        %341 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %342 = OpLoad %float %341
+        %343 = OpFOrdGreaterThan %bool %342 %float_0_75
+               OpSelectionMerge %344 None
+               OpBranchConditional %343 %345 %344
+        %345 = OpLabel
+        %347 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_7
+        %348 = OpLoad %int %347
+        %349 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %350 = OpLoad %float %349
+        %351 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %352 = OpConvertSToF %float %348
+        %353 = OpFAdd %float %350 %352
+               OpStore %351 %353
+               OpBranch %344
+        %344 = OpLabel
+        %355 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_8
+        %356 = OpLoad %int %355
+        %357 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %358 = OpLoad %float %357
+        %359 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %360 = OpConvertSToF %float %356
+        %361 = OpFAdd %float %358 %360
+               OpStore %359 %361
+        %362 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %363 = OpLoad %float %362
+        %364 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %365 = OpLoad %float %364
+        %368 = OpFSub %float %363 %365
+        %366 = OpExtInst %float %367 FAbs %368
+        %369 = OpFOrdLessThan %bool %366 %float_0_25
+               OpSelectionMerge %370 None
+               OpBranchConditional %369 %371 %370
+        %371 = OpLabel
+        %372 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_9
+        %373 = OpLoad %int %372
+        %374 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %375 = OpLoad %float %374
+        %376 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %377 = OpConvertSToF %float %373
+        %378 = OpFAdd %float %375 %377
+               OpStore %376 %378
+               OpBranch %370
+        %370 = OpLabel
+        %379 = OpLoad %v3float %color
+        %380 = OpExtInst %v3float %367 Normalize %379
+        %381 = OpCompositeExtract %float %380 0
+        %382 = OpCompositeExtract %float %380 1
+        %383 = OpCompositeExtract %float %380 2
+        %384 = OpCompositeConstruct %v4float %381 %382 %383 %float_1
+               OpStore %frag_color %384
+        %385 = OpLoad %v4float %x_GLF_pos
+               OpStore %gl_Position %385
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_4 = OpFunction %void None %386
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %390 = OpLabel
+        %391 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %391
+        %392 = OpCompositeExtract %v4float %tint_symbol_1 1
+               OpStore %tint_symbol_3 %392
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %118
+        %394 = OpLabel
+               OpStore %tint_pointsize %float_1
+        %395 = OpLoad %v4float %tint_symbol
+               OpStore %x_GLF_pos %395
+        %396 = OpFunctionCall %void %main_1
+        %398 = OpLoad %v4float %frag_color
+        %399 = OpLoad %v4float %gl_Position
+        %400 = OpCompositeConstruct %main_out %398 %399
+        %397 = OpFunctionCall %void %tint_symbol_4 %400
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/2-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/2-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..b0ecbc4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/2-opt.spvasm.expected.wgsl
@@ -0,0 +1,276 @@
+struct QuicksortObject {
+  numbers : array<i32, 10>;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[block]]
+struct buf1 {
+  resolution : vec2<f32>;
+};
+
+var<private> obj : QuicksortObject;
+
+var<private> x_GLF_FragCoord : vec4<f32>;
+
+var<private> x_GLF_pos : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_33 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_36 : buf1;
+
+var<private> frag_color : vec4<f32>;
+
+var<private> gl_Position : vec4<f32>;
+
+fn swap_i1_i1_(i : ptr<function, i32>, j : ptr<function, i32>) {
+  var temp : i32;
+  let x_250 : i32 = *(i);
+  let x_252 : i32 = obj.numbers[x_250];
+  temp = x_252;
+  let x_253 : i32 = *(i);
+  let x_254 : i32 = *(j);
+  let x_256 : i32 = obj.numbers[x_254];
+  obj.numbers[x_253] = x_256;
+  let x_258 : i32 = *(j);
+  let x_259 : i32 = temp;
+  obj.numbers[x_258] = x_259;
+  return;
+}
+
+fn performPartition_i1_i1_(l : ptr<function, i32>, h : ptr<function, i32>) -> i32 {
+  var pivot : i32;
+  var i_1 : i32;
+  var j_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  var param_3 : i32;
+  let x_262 : i32 = *(h);
+  let x_264 : i32 = obj.numbers[x_262];
+  pivot = x_264;
+  let x_265 : i32 = *(l);
+  i_1 = (x_265 - 1);
+  let x_267 : i32 = *(l);
+  j_1 = x_267;
+  loop {
+    let x_272 : i32 = j_1;
+    let x_273 : i32 = *(h);
+    if ((x_272 <= (x_273 - 1))) {
+    } else {
+      break;
+    }
+    let x_277 : i32 = j_1;
+    let x_279 : i32 = obj.numbers[x_277];
+    let x_280 : i32 = pivot;
+    if ((x_279 <= x_280)) {
+      let x_284 : i32 = i_1;
+      i_1 = (x_284 + 1);
+      let x_286 : i32 = i_1;
+      param = x_286;
+      let x_287 : i32 = j_1;
+      param_1 = x_287;
+      swap_i1_i1_(&(param), &(param_1));
+    }
+
+    continuing {
+      let x_289 : i32 = j_1;
+      j_1 = (x_289 + 1);
+    }
+  }
+  let x_291 : i32 = i_1;
+  param_2 = (x_291 + 1);
+  let x_293 : i32 = *(h);
+  param_3 = x_293;
+  swap_i1_i1_(&(param_2), &(param_3));
+  let x_295 : i32 = i_1;
+  return (x_295 + 1);
+}
+
+fn quicksort_() {
+  var l_1 : i32;
+  var h_1 : i32;
+  var top : i32;
+  var stack : array<i32, 10>;
+  var p : i32;
+  var param_4 : i32;
+  var param_5 : i32;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  let x_298 : i32 = top;
+  let x_299 : i32 = (x_298 + 1);
+  top = x_299;
+  let x_300 : i32 = l_1;
+  stack[x_299] = x_300;
+  let x_302 : i32 = top;
+  let x_303 : i32 = (x_302 + 1);
+  top = x_303;
+  let x_304 : i32 = h_1;
+  stack[x_303] = x_304;
+  loop {
+    let x_310 : i32 = top;
+    if ((x_310 >= 0)) {
+    } else {
+      break;
+    }
+    let x_313 : i32 = top;
+    top = (x_313 - 1);
+    let x_316 : i32 = stack[x_313];
+    h_1 = x_316;
+    let x_317 : i32 = top;
+    top = (x_317 - 1);
+    let x_320 : i32 = stack[x_317];
+    l_1 = x_320;
+    let x_321 : i32 = l_1;
+    param_4 = x_321;
+    let x_322 : i32 = h_1;
+    param_5 = x_322;
+    let x_323 : i32 = performPartition_i1_i1_(&(param_4), &(param_5));
+    p = x_323;
+    let x_324 : i32 = p;
+    let x_326 : i32 = l_1;
+    if (((x_324 - 1) > x_326)) {
+      let x_330 : i32 = top;
+      let x_331 : i32 = (x_330 + 1);
+      top = x_331;
+      let x_332 : i32 = l_1;
+      stack[x_331] = x_332;
+      let x_334 : i32 = top;
+      let x_335 : i32 = (x_334 + 1);
+      top = x_335;
+      let x_336 : i32 = p;
+      stack[x_335] = (x_336 - 1);
+    }
+    let x_339 : i32 = p;
+    let x_341 : i32 = h_1;
+    if (((x_339 + 1) < x_341)) {
+      let x_345 : i32 = top;
+      let x_346 : i32 = (x_345 + 1);
+      top = x_346;
+      let x_347 : i32 = p;
+      stack[x_346] = (x_347 + 1);
+      let x_350 : i32 = top;
+      let x_351 : i32 = (x_350 + 1);
+      top = x_351;
+      let x_352 : i32 = h_1;
+      stack[x_351] = x_352;
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_2 : i32;
+  var uv : vec2<f32>;
+  var color : vec3<f32>;
+  let x_94 : vec4<f32> = x_GLF_pos;
+  x_GLF_FragCoord = ((x_94 + vec4<f32>(1.0, 1.0, 0.0, 0.0)) * vec4<f32>(128.0, 128.0, 1.0, 1.0));
+  i_2 = 0;
+  loop {
+    let x_101 : i32 = i_2;
+    if ((x_101 < 10)) {
+    } else {
+      break;
+    }
+    let x_104 : i32 = i_2;
+    let x_105 : i32 = i_2;
+    obj.numbers[x_104] = (10 - x_105);
+    let x_109 : f32 = x_33.injectionSwitch.x;
+    let x_111 : f32 = x_33.injectionSwitch.y;
+    if ((x_109 > x_111)) {
+      break;
+    }
+    let x_115 : i32 = i_2;
+    let x_116 : i32 = i_2;
+    let x_118 : i32 = obj.numbers[x_116];
+    let x_119 : i32 = i_2;
+    let x_121 : i32 = obj.numbers[x_119];
+    obj.numbers[x_115] = (x_118 * x_121);
+
+    continuing {
+      let x_124 : i32 = i_2;
+      i_2 = (x_124 + 1);
+    }
+  }
+  quicksort_();
+  let x_127 : vec4<f32> = x_GLF_FragCoord;
+  let x_130 : vec2<f32> = x_36.resolution;
+  uv = (vec2<f32>(x_127.x, x_127.y) / x_130);
+  color = vec3<f32>(1.0, 2.0, 3.0);
+  let x_133 : i32 = obj.numbers[0];
+  let x_136 : f32 = color.x;
+  color.x = (x_136 + f32(x_133));
+  let x_140 : f32 = uv.x;
+  if ((x_140 > 0.25)) {
+    let x_145 : i32 = obj.numbers[1];
+    let x_148 : f32 = color.x;
+    color.x = (x_148 + f32(x_145));
+  }
+  let x_152 : f32 = uv.x;
+  if ((x_152 > 0.5)) {
+    let x_157 : i32 = obj.numbers[2];
+    let x_160 : f32 = color.y;
+    color.y = (x_160 + f32(x_157));
+  }
+  let x_164 : f32 = uv.x;
+  if ((x_164 > 0.75)) {
+    let x_169 : i32 = obj.numbers[3];
+    let x_172 : f32 = color.z;
+    color.z = (x_172 + f32(x_169));
+  }
+  let x_176 : i32 = obj.numbers[4];
+  let x_179 : f32 = color.y;
+  color.y = (x_179 + f32(x_176));
+  let x_183 : f32 = uv.y;
+  if ((x_183 > 0.25)) {
+    let x_188 : i32 = obj.numbers[5];
+    let x_191 : f32 = color.x;
+    color.x = (x_191 + f32(x_188));
+  }
+  let x_195 : f32 = uv.y;
+  if ((x_195 > 0.5)) {
+    let x_200 : i32 = obj.numbers[6];
+    let x_203 : f32 = color.y;
+    color.y = (x_203 + f32(x_200));
+  }
+  let x_207 : f32 = uv.y;
+  if ((x_207 > 0.75)) {
+    let x_212 : i32 = obj.numbers[7];
+    let x_215 : f32 = color.z;
+    color.z = (x_215 + f32(x_212));
+  }
+  let x_219 : i32 = obj.numbers[8];
+  let x_222 : f32 = color.z;
+  color.z = (x_222 + f32(x_219));
+  let x_226 : f32 = uv.x;
+  let x_228 : f32 = uv.y;
+  if ((abs((x_226 - x_228)) < 0.25)) {
+    let x_235 : i32 = obj.numbers[9];
+    let x_238 : f32 = color.x;
+    color.x = (x_238 + f32(x_235));
+  }
+  let x_241 : vec3<f32> = color;
+  let x_242 : vec3<f32> = normalize(x_241);
+  frag_color = vec4<f32>(x_242.x, x_242.y, x_242.z, 1.0);
+  let x_247 : vec4<f32> = x_GLF_pos;
+  gl_Position = x_247;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  frag_color_1 : vec4<f32>;
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] x_GLF_pos_param : vec4<f32>) -> main_out {
+  x_GLF_pos = x_GLF_pos_param;
+  main_1();
+  return main_out(frag_color, gl_Position);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/2-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/2-opt.wgsl
new file mode 100644
index 0000000..b0ecbc4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/2-opt.wgsl
@@ -0,0 +1,276 @@
+struct QuicksortObject {
+  numbers : array<i32, 10>;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[block]]
+struct buf1 {
+  resolution : vec2<f32>;
+};
+
+var<private> obj : QuicksortObject;
+
+var<private> x_GLF_FragCoord : vec4<f32>;
+
+var<private> x_GLF_pos : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_33 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_36 : buf1;
+
+var<private> frag_color : vec4<f32>;
+
+var<private> gl_Position : vec4<f32>;
+
+fn swap_i1_i1_(i : ptr<function, i32>, j : ptr<function, i32>) {
+  var temp : i32;
+  let x_250 : i32 = *(i);
+  let x_252 : i32 = obj.numbers[x_250];
+  temp = x_252;
+  let x_253 : i32 = *(i);
+  let x_254 : i32 = *(j);
+  let x_256 : i32 = obj.numbers[x_254];
+  obj.numbers[x_253] = x_256;
+  let x_258 : i32 = *(j);
+  let x_259 : i32 = temp;
+  obj.numbers[x_258] = x_259;
+  return;
+}
+
+fn performPartition_i1_i1_(l : ptr<function, i32>, h : ptr<function, i32>) -> i32 {
+  var pivot : i32;
+  var i_1 : i32;
+  var j_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  var param_3 : i32;
+  let x_262 : i32 = *(h);
+  let x_264 : i32 = obj.numbers[x_262];
+  pivot = x_264;
+  let x_265 : i32 = *(l);
+  i_1 = (x_265 - 1);
+  let x_267 : i32 = *(l);
+  j_1 = x_267;
+  loop {
+    let x_272 : i32 = j_1;
+    let x_273 : i32 = *(h);
+    if ((x_272 <= (x_273 - 1))) {
+    } else {
+      break;
+    }
+    let x_277 : i32 = j_1;
+    let x_279 : i32 = obj.numbers[x_277];
+    let x_280 : i32 = pivot;
+    if ((x_279 <= x_280)) {
+      let x_284 : i32 = i_1;
+      i_1 = (x_284 + 1);
+      let x_286 : i32 = i_1;
+      param = x_286;
+      let x_287 : i32 = j_1;
+      param_1 = x_287;
+      swap_i1_i1_(&(param), &(param_1));
+    }
+
+    continuing {
+      let x_289 : i32 = j_1;
+      j_1 = (x_289 + 1);
+    }
+  }
+  let x_291 : i32 = i_1;
+  param_2 = (x_291 + 1);
+  let x_293 : i32 = *(h);
+  param_3 = x_293;
+  swap_i1_i1_(&(param_2), &(param_3));
+  let x_295 : i32 = i_1;
+  return (x_295 + 1);
+}
+
+fn quicksort_() {
+  var l_1 : i32;
+  var h_1 : i32;
+  var top : i32;
+  var stack : array<i32, 10>;
+  var p : i32;
+  var param_4 : i32;
+  var param_5 : i32;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  let x_298 : i32 = top;
+  let x_299 : i32 = (x_298 + 1);
+  top = x_299;
+  let x_300 : i32 = l_1;
+  stack[x_299] = x_300;
+  let x_302 : i32 = top;
+  let x_303 : i32 = (x_302 + 1);
+  top = x_303;
+  let x_304 : i32 = h_1;
+  stack[x_303] = x_304;
+  loop {
+    let x_310 : i32 = top;
+    if ((x_310 >= 0)) {
+    } else {
+      break;
+    }
+    let x_313 : i32 = top;
+    top = (x_313 - 1);
+    let x_316 : i32 = stack[x_313];
+    h_1 = x_316;
+    let x_317 : i32 = top;
+    top = (x_317 - 1);
+    let x_320 : i32 = stack[x_317];
+    l_1 = x_320;
+    let x_321 : i32 = l_1;
+    param_4 = x_321;
+    let x_322 : i32 = h_1;
+    param_5 = x_322;
+    let x_323 : i32 = performPartition_i1_i1_(&(param_4), &(param_5));
+    p = x_323;
+    let x_324 : i32 = p;
+    let x_326 : i32 = l_1;
+    if (((x_324 - 1) > x_326)) {
+      let x_330 : i32 = top;
+      let x_331 : i32 = (x_330 + 1);
+      top = x_331;
+      let x_332 : i32 = l_1;
+      stack[x_331] = x_332;
+      let x_334 : i32 = top;
+      let x_335 : i32 = (x_334 + 1);
+      top = x_335;
+      let x_336 : i32 = p;
+      stack[x_335] = (x_336 - 1);
+    }
+    let x_339 : i32 = p;
+    let x_341 : i32 = h_1;
+    if (((x_339 + 1) < x_341)) {
+      let x_345 : i32 = top;
+      let x_346 : i32 = (x_345 + 1);
+      top = x_346;
+      let x_347 : i32 = p;
+      stack[x_346] = (x_347 + 1);
+      let x_350 : i32 = top;
+      let x_351 : i32 = (x_350 + 1);
+      top = x_351;
+      let x_352 : i32 = h_1;
+      stack[x_351] = x_352;
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_2 : i32;
+  var uv : vec2<f32>;
+  var color : vec3<f32>;
+  let x_94 : vec4<f32> = x_GLF_pos;
+  x_GLF_FragCoord = ((x_94 + vec4<f32>(1.0, 1.0, 0.0, 0.0)) * vec4<f32>(128.0, 128.0, 1.0, 1.0));
+  i_2 = 0;
+  loop {
+    let x_101 : i32 = i_2;
+    if ((x_101 < 10)) {
+    } else {
+      break;
+    }
+    let x_104 : i32 = i_2;
+    let x_105 : i32 = i_2;
+    obj.numbers[x_104] = (10 - x_105);
+    let x_109 : f32 = x_33.injectionSwitch.x;
+    let x_111 : f32 = x_33.injectionSwitch.y;
+    if ((x_109 > x_111)) {
+      break;
+    }
+    let x_115 : i32 = i_2;
+    let x_116 : i32 = i_2;
+    let x_118 : i32 = obj.numbers[x_116];
+    let x_119 : i32 = i_2;
+    let x_121 : i32 = obj.numbers[x_119];
+    obj.numbers[x_115] = (x_118 * x_121);
+
+    continuing {
+      let x_124 : i32 = i_2;
+      i_2 = (x_124 + 1);
+    }
+  }
+  quicksort_();
+  let x_127 : vec4<f32> = x_GLF_FragCoord;
+  let x_130 : vec2<f32> = x_36.resolution;
+  uv = (vec2<f32>(x_127.x, x_127.y) / x_130);
+  color = vec3<f32>(1.0, 2.0, 3.0);
+  let x_133 : i32 = obj.numbers[0];
+  let x_136 : f32 = color.x;
+  color.x = (x_136 + f32(x_133));
+  let x_140 : f32 = uv.x;
+  if ((x_140 > 0.25)) {
+    let x_145 : i32 = obj.numbers[1];
+    let x_148 : f32 = color.x;
+    color.x = (x_148 + f32(x_145));
+  }
+  let x_152 : f32 = uv.x;
+  if ((x_152 > 0.5)) {
+    let x_157 : i32 = obj.numbers[2];
+    let x_160 : f32 = color.y;
+    color.y = (x_160 + f32(x_157));
+  }
+  let x_164 : f32 = uv.x;
+  if ((x_164 > 0.75)) {
+    let x_169 : i32 = obj.numbers[3];
+    let x_172 : f32 = color.z;
+    color.z = (x_172 + f32(x_169));
+  }
+  let x_176 : i32 = obj.numbers[4];
+  let x_179 : f32 = color.y;
+  color.y = (x_179 + f32(x_176));
+  let x_183 : f32 = uv.y;
+  if ((x_183 > 0.25)) {
+    let x_188 : i32 = obj.numbers[5];
+    let x_191 : f32 = color.x;
+    color.x = (x_191 + f32(x_188));
+  }
+  let x_195 : f32 = uv.y;
+  if ((x_195 > 0.5)) {
+    let x_200 : i32 = obj.numbers[6];
+    let x_203 : f32 = color.y;
+    color.y = (x_203 + f32(x_200));
+  }
+  let x_207 : f32 = uv.y;
+  if ((x_207 > 0.75)) {
+    let x_212 : i32 = obj.numbers[7];
+    let x_215 : f32 = color.z;
+    color.z = (x_215 + f32(x_212));
+  }
+  let x_219 : i32 = obj.numbers[8];
+  let x_222 : f32 = color.z;
+  color.z = (x_222 + f32(x_219));
+  let x_226 : f32 = uv.x;
+  let x_228 : f32 = uv.y;
+  if ((abs((x_226 - x_228)) < 0.25)) {
+    let x_235 : i32 = obj.numbers[9];
+    let x_238 : f32 = color.x;
+    color.x = (x_238 + f32(x_235));
+  }
+  let x_241 : vec3<f32> = color;
+  let x_242 : vec3<f32> = normalize(x_241);
+  frag_color = vec4<f32>(x_242.x, x_242.y, x_242.z, 1.0);
+  let x_247 : vec4<f32> = x_GLF_pos;
+  gl_Position = x_247;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  frag_color_1 : vec4<f32>;
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] x_GLF_pos_param : vec4<f32>) -> main_out {
+  x_GLF_pos = x_GLF_pos_param;
+  main_1();
+  return main_out(frag_color, gl_Position);
+}
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
new file mode 100644
index 0000000..017bbe6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/2-opt.wgsl.expected.hlsl
@@ -0,0 +1,227 @@
+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;
+  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;
+  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;
+  {
+    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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 x_GLF_pos_param = tint_symbol.x_GLF_pos_param;
+  x_GLF_pos = x_GLF_pos_param;
+  main_1();
+  const main_out tint_symbol_3 = {frag_color, gl_Position};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.frag_color_1, tint_symbol_3.gl_Position};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/2-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/2-opt.wgsl.expected.msl
new file mode 100644
index 0000000..fae0fc6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/2-opt.wgsl.expected.msl
@@ -0,0 +1,274 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct QuicksortObject {
+  tint_array_wrapper numbers;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct buf1 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 frag_color_1;
+  float4 gl_Position;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_pos_param [[attribute(0)]];
+};
+struct tint_symbol_3 {
+  float4 frag_color_1 [[user(locn0)]];
+  float4 gl_Position [[position]];
+};
+
+void swap_i1_i1_(thread int* const i, thread int* const j, thread QuicksortObject* const tint_symbol_6) {
+  int temp = 0;
+  int const x_250 = *(i);
+  int const x_252 = (*(tint_symbol_6)).numbers.arr[x_250];
+  temp = x_252;
+  int const x_253 = *(i);
+  int const x_254 = *(j);
+  int const x_256 = (*(tint_symbol_6)).numbers.arr[x_254];
+  (*(tint_symbol_6)).numbers.arr[x_253] = x_256;
+  int const x_258 = *(j);
+  int const x_259 = temp;
+  (*(tint_symbol_6)).numbers.arr[x_258] = x_259;
+  return;
+}
+
+int performPartition_i1_i1_(thread int* const l, thread int* const h, thread QuicksortObject* const tint_symbol_7) {
+  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;
+  int const x_262 = *(h);
+  int const x_264 = (*(tint_symbol_7)).numbers.arr[x_262];
+  pivot = x_264;
+  int const x_265 = *(l);
+  i_1 = (x_265 - 1);
+  int const x_267 = *(l);
+  j_1 = x_267;
+  while (true) {
+    int const x_272 = j_1;
+    int const x_273 = *(h);
+    if ((x_272 <= (x_273 - 1))) {
+    } else {
+      break;
+    }
+    int const x_277 = j_1;
+    int const x_279 = (*(tint_symbol_7)).numbers.arr[x_277];
+    int const x_280 = pivot;
+    if ((x_279 <= x_280)) {
+      int const x_284 = i_1;
+      i_1 = (x_284 + 1);
+      int const x_286 = i_1;
+      param = x_286;
+      int const x_287 = j_1;
+      param_1 = x_287;
+      swap_i1_i1_(&(param), &(param_1), tint_symbol_7);
+    }
+    {
+      int const x_289 = j_1;
+      j_1 = (x_289 + 1);
+    }
+  }
+  int const x_291 = i_1;
+  param_2 = (x_291 + 1);
+  int const x_293 = *(h);
+  param_3 = x_293;
+  swap_i1_i1_(&(param_2), &(param_3), tint_symbol_7);
+  int const x_295 = i_1;
+  return (x_295 + 1);
+}
+
+void quicksort_(thread QuicksortObject* const tint_symbol_8) {
+  int l_1 = 0;
+  int h_1 = 0;
+  int top = 0;
+  tint_array_wrapper stack = {};
+  int p = 0;
+  int param_4 = 0;
+  int param_5 = 0;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  int const x_298 = top;
+  int const x_299 = (x_298 + 1);
+  top = x_299;
+  int const x_300 = l_1;
+  stack.arr[x_299] = x_300;
+  int const x_302 = top;
+  int const x_303 = (x_302 + 1);
+  top = x_303;
+  int const x_304 = h_1;
+  stack.arr[x_303] = x_304;
+  while (true) {
+    int const x_310 = top;
+    if ((x_310 >= 0)) {
+    } else {
+      break;
+    }
+    int const x_313 = top;
+    top = (x_313 - 1);
+    int const x_316 = stack.arr[x_313];
+    h_1 = x_316;
+    int const x_317 = top;
+    top = (x_317 - 1);
+    int const x_320 = stack.arr[x_317];
+    l_1 = x_320;
+    int const x_321 = l_1;
+    param_4 = x_321;
+    int const x_322 = h_1;
+    param_5 = x_322;
+    int const x_323 = performPartition_i1_i1_(&(param_4), &(param_5), tint_symbol_8);
+    p = x_323;
+    int const x_324 = p;
+    int const x_326 = l_1;
+    if (((x_324 - 1) > x_326)) {
+      int const x_330 = top;
+      int const x_331 = (x_330 + 1);
+      top = x_331;
+      int const x_332 = l_1;
+      stack.arr[x_331] = x_332;
+      int const x_334 = top;
+      int const x_335 = (x_334 + 1);
+      top = x_335;
+      int const x_336 = p;
+      stack.arr[x_335] = (x_336 - 1);
+    }
+    int const x_339 = p;
+    int const x_341 = h_1;
+    if (((x_339 + 1) < x_341)) {
+      int const x_345 = top;
+      int const x_346 = (x_345 + 1);
+      top = x_346;
+      int const x_347 = p;
+      stack.arr[x_346] = (x_347 + 1);
+      int const x_350 = top;
+      int const x_351 = (x_350 + 1);
+      top = x_351;
+      int const x_352 = h_1;
+      stack.arr[x_351] = x_352;
+    }
+  }
+  return;
+}
+
+void main_1(constant buf0& x_33, constant buf1& x_36, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10, thread QuicksortObject* const tint_symbol_11, thread float4* const tint_symbol_12, thread float4* const tint_symbol_13) {
+  int i_2 = 0;
+  float2 uv = 0.0f;
+  float3 color = 0.0f;
+  float4 const x_94 = *(tint_symbol_9);
+  *(tint_symbol_10) = ((x_94 + float4(1.0f, 1.0f, 0.0f, 0.0f)) * float4(128.0f, 128.0f, 1.0f, 1.0f));
+  i_2 = 0;
+  while (true) {
+    int const x_101 = i_2;
+    if ((x_101 < 10)) {
+    } else {
+      break;
+    }
+    int const x_104 = i_2;
+    int const x_105 = i_2;
+    (*(tint_symbol_11)).numbers.arr[x_104] = (10 - x_105);
+    float const x_109 = x_33.injectionSwitch.x;
+    float const x_111 = x_33.injectionSwitch.y;
+    if ((x_109 > x_111)) {
+      break;
+    }
+    int const x_115 = i_2;
+    int const x_116 = i_2;
+    int const x_118 = (*(tint_symbol_11)).numbers.arr[x_116];
+    int const x_119 = i_2;
+    int const x_121 = (*(tint_symbol_11)).numbers.arr[x_119];
+    (*(tint_symbol_11)).numbers.arr[x_115] = (x_118 * x_121);
+    {
+      int const x_124 = i_2;
+      i_2 = (x_124 + 1);
+    }
+  }
+  quicksort_(tint_symbol_11);
+  float4 const x_127 = *(tint_symbol_10);
+  float2 const x_130 = x_36.resolution;
+  uv = (float2(x_127.x, x_127.y) / x_130);
+  color = float3(1.0f, 2.0f, 3.0f);
+  int const x_133 = (*(tint_symbol_11)).numbers.arr[0];
+  float const x_136 = color.x;
+  color.x = (x_136 + float(x_133));
+  float const x_140 = uv.x;
+  if ((x_140 > 0.25f)) {
+    int const x_145 = (*(tint_symbol_11)).numbers.arr[1];
+    float const x_148 = color.x;
+    color.x = (x_148 + float(x_145));
+  }
+  float const x_152 = uv.x;
+  if ((x_152 > 0.5f)) {
+    int const x_157 = (*(tint_symbol_11)).numbers.arr[2];
+    float const x_160 = color.y;
+    color.y = (x_160 + float(x_157));
+  }
+  float const x_164 = uv.x;
+  if ((x_164 > 0.75f)) {
+    int const x_169 = (*(tint_symbol_11)).numbers.arr[3];
+    float const x_172 = color.z;
+    color.z = (x_172 + float(x_169));
+  }
+  int const x_176 = (*(tint_symbol_11)).numbers.arr[4];
+  float const x_179 = color.y;
+  color.y = (x_179 + float(x_176));
+  float const x_183 = uv.y;
+  if ((x_183 > 0.25f)) {
+    int const x_188 = (*(tint_symbol_11)).numbers.arr[5];
+    float const x_191 = color.x;
+    color.x = (x_191 + float(x_188));
+  }
+  float const x_195 = uv.y;
+  if ((x_195 > 0.5f)) {
+    int const x_200 = (*(tint_symbol_11)).numbers.arr[6];
+    float const x_203 = color.y;
+    color.y = (x_203 + float(x_200));
+  }
+  float const x_207 = uv.y;
+  if ((x_207 > 0.75f)) {
+    int const x_212 = (*(tint_symbol_11)).numbers.arr[7];
+    float const x_215 = color.z;
+    color.z = (x_215 + float(x_212));
+  }
+  int const x_219 = (*(tint_symbol_11)).numbers.arr[8];
+  float const x_222 = color.z;
+  color.z = (x_222 + float(x_219));
+  float const x_226 = uv.x;
+  float const x_228 = uv.y;
+  if ((fabs((x_226 - x_228)) < 0.25f)) {
+    int const x_235 = (*(tint_symbol_11)).numbers.arr[9];
+    float const x_238 = color.x;
+    color.x = (x_238 + float(x_235));
+  }
+  float3 const x_241 = color;
+  float3 const x_242 = normalize(x_241);
+  *(tint_symbol_12) = float4(x_242.x, x_242.y, x_242.z, 1.0f);
+  float4 const x_247 = *(tint_symbol_9);
+  *(tint_symbol_13) = x_247;
+  return;
+}
+
+vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]], constant buf0& x_33 [[buffer(0)]], constant buf1& x_36 [[buffer(1)]]) {
+  thread float4 tint_symbol_14 = 0.0f;
+  thread float4 tint_symbol_15 = 0.0f;
+  thread QuicksortObject tint_symbol_16 = {};
+  thread float4 tint_symbol_17 = 0.0f;
+  thread float4 tint_symbol_18 = 0.0f;
+  float4 const x_GLF_pos_param = tint_symbol_1.x_GLF_pos_param;
+  tint_symbol_14 = x_GLF_pos_param;
+  main_1(x_33, x_36, &(tint_symbol_14), &(tint_symbol_15), &(tint_symbol_16), &(tint_symbol_17), &(tint_symbol_18));
+  main_out const tint_symbol_4 = {.frag_color_1=tint_symbol_17, .gl_Position=tint_symbol_18};
+  tint_symbol_3 const tint_symbol_5 = {.frag_color_1=tint_symbol_4.frag_color_1, .gl_Position=tint_symbol_4.gl_Position};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/2-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/2-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..e0c2ca0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/2-opt.wgsl.expected.spvasm
@@ -0,0 +1,589 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 401
+; Schema: 0
+               OpCapability Shader
+        %367 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %tint_pointsize %tint_symbol %tint_symbol_2 %tint_symbol_3
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %QuicksortObject "QuicksortObject"
+               OpMemberName %QuicksortObject 0 "numbers"
+               OpName %obj "obj"
+               OpName %x_GLF_FragCoord "x_GLF_FragCoord"
+               OpName %x_GLF_pos "x_GLF_pos"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_33 "x_33"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "resolution"
+               OpName %x_36 "x_36"
+               OpName %frag_color "frag_color"
+               OpName %gl_Position "gl_Position"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %swap_i1_i1_ "swap_i1_i1_"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %temp "temp"
+               OpName %performPartition_i1_i1_ "performPartition_i1_i1_"
+               OpName %l "l"
+               OpName %h "h"
+               OpName %pivot "pivot"
+               OpName %i_1 "i_1"
+               OpName %j_1 "j_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %quicksort_ "quicksort_"
+               OpName %l_1 "l_1"
+               OpName %h_1 "h_1"
+               OpName %top "top"
+               OpName %stack "stack"
+               OpName %p "p"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpName %main_1 "main_1"
+               OpName %i_2 "i_2"
+               OpName %uv "uv"
+               OpName %color "color"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "frag_color_1"
+               OpMemberName %main_out 1 "gl_Position"
+               OpName %tint_symbol_4 "tint_symbol_4"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpMemberDecorate %QuicksortObject 0 Offset 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_33 NonWritable
+               OpDecorate %x_33 DescriptorSet 0
+               OpDecorate %x_33 Binding 0
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_36 NonWritable
+               OpDecorate %x_36 DescriptorSet 0
+               OpDecorate %x_36 Binding 1
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %tint_symbol_3 BuiltIn Position
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%QuicksortObject = OpTypeStruct %_arr_int_uint_10
+%_ptr_Private_QuicksortObject = OpTypePointer Private %QuicksortObject
+         %12 = OpConstantNull %QuicksortObject
+        %obj = OpVariable %_ptr_Private_QuicksortObject Private %12
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_FragCoord = OpVariable %_ptr_Private_v4float Private %16
+  %x_GLF_pos = OpVariable %_ptr_Private_v4float Private %16
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_33 = OpVariable %_ptr_Uniform_buf0 Uniform
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_36 = OpVariable %_ptr_Uniform_buf1 Uniform
+ %frag_color = OpVariable %_ptr_Private_v4float Private %16
+%gl_Position = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %16
+%tint_symbol_3 = OpVariable %_ptr_Output_v4float Output %16
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+         %32 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+         %40 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_int = OpTypePointer Private %int
+         %58 = OpTypeFunction %int %_ptr_Function_int %_ptr_Function_int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+        %118 = OpTypeFunction %void
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+        %126 = OpConstantNull %_arr_int_uint_10
+      %int_0 = OpConstant %int 0
+      %int_9 = OpConstant %int 9
+     %int_n1 = OpConstant %int -1
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+        %198 = OpConstantNull %v2float
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+        %202 = OpConstantNull %v3float
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+        %206 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_0
+  %float_128 = OpConstant %float 128
+        %209 = OpConstantComposite %v4float %float_128 %float_128 %float_1 %float_1
+     %int_10 = OpConstant %int 10
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+        %256 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+%_ptr_Function_float = OpTypePointer Function %float
+ %float_0_25 = OpConstant %float 0.25
+  %float_0_5 = OpConstant %float 0.5
+      %int_2 = OpConstant %int 2
+ %float_0_75 = OpConstant %float 0.75
+      %int_3 = OpConstant %int 3
+     %uint_2 = OpConstant %uint 2
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+   %main_out = OpTypeStruct %v4float %v4float
+        %386 = OpTypeFunction %void %main_out
+%swap_i1_i1_ = OpFunction %void None %32
+          %i = OpFunctionParameter %_ptr_Function_int
+          %j = OpFunctionParameter %_ptr_Function_int
+         %38 = OpLabel
+       %temp = OpVariable %_ptr_Function_int Function %40
+         %42 = OpLoad %int %i
+         %45 = OpAccessChain %_ptr_Private_int %obj %uint_0 %42
+         %46 = OpLoad %int %45
+               OpStore %temp %46
+         %48 = OpLoad %int %i
+         %50 = OpLoad %int %j
+         %51 = OpAccessChain %_ptr_Private_int %obj %uint_0 %50
+         %52 = OpLoad %int %51
+         %53 = OpAccessChain %_ptr_Private_int %obj %uint_0 %48
+               OpStore %53 %52
+         %55 = OpLoad %int %j
+         %56 = OpLoad %int %temp
+         %57 = OpAccessChain %_ptr_Private_int %obj %uint_0 %55
+               OpStore %57 %56
+               OpReturn
+               OpFunctionEnd
+%performPartition_i1_i1_ = OpFunction %int None %58
+          %l = OpFunctionParameter %_ptr_Function_int
+          %h = OpFunctionParameter %_ptr_Function_int
+         %62 = OpLabel
+      %pivot = OpVariable %_ptr_Function_int Function %40
+        %i_1 = OpVariable %_ptr_Function_int Function %40
+        %j_1 = OpVariable %_ptr_Function_int Function %40
+      %param = OpVariable %_ptr_Function_int Function %40
+    %param_1 = OpVariable %_ptr_Function_int Function %40
+    %param_2 = OpVariable %_ptr_Function_int Function %40
+    %param_3 = OpVariable %_ptr_Function_int Function %40
+         %71 = OpLoad %int %h
+         %72 = OpAccessChain %_ptr_Private_int %obj %uint_0 %71
+         %73 = OpLoad %int %72
+               OpStore %pivot %73
+         %75 = OpLoad %int %l
+         %77 = OpISub %int %75 %int_1
+               OpStore %i_1 %77
+         %79 = OpLoad %int %l
+               OpStore %j_1 %79
+               OpBranch %80
+         %80 = OpLabel
+               OpLoopMerge %81 %82 None
+               OpBranch %83
+         %83 = OpLabel
+         %84 = OpLoad %int %j_1
+         %86 = OpLoad %int %h
+         %87 = OpISub %int %86 %int_1
+         %88 = OpSLessThanEqual %bool %84 %87
+               OpSelectionMerge %90 None
+               OpBranchConditional %88 %91 %92
+         %91 = OpLabel
+               OpBranch %90
+         %92 = OpLabel
+               OpBranch %81
+         %90 = OpLabel
+         %93 = OpLoad %int %j_1
+         %94 = OpAccessChain %_ptr_Private_int %obj %uint_0 %93
+         %95 = OpLoad %int %94
+         %96 = OpLoad %int %pivot
+         %97 = OpSLessThanEqual %bool %95 %96
+               OpSelectionMerge %98 None
+               OpBranchConditional %97 %99 %98
+         %99 = OpLabel
+        %100 = OpLoad %int %i_1
+        %101 = OpIAdd %int %100 %int_1
+               OpStore %i_1 %101
+        %102 = OpLoad %int %i_1
+               OpStore %param %102
+        %103 = OpLoad %int %j_1
+               OpStore %param_1 %103
+        %104 = OpFunctionCall %void %swap_i1_i1_ %param %param_1
+               OpBranch %98
+         %98 = OpLabel
+               OpBranch %82
+         %82 = OpLabel
+        %107 = OpLoad %int %j_1
+        %108 = OpIAdd %int %107 %int_1
+               OpStore %j_1 %108
+               OpBranch %80
+         %81 = OpLabel
+        %109 = OpLoad %int %i_1
+        %110 = OpIAdd %int %109 %int_1
+               OpStore %param_2 %110
+        %112 = OpLoad %int %h
+               OpStore %param_3 %112
+        %113 = OpFunctionCall %void %swap_i1_i1_ %param_2 %param_3
+        %116 = OpLoad %int %i_1
+        %117 = OpIAdd %int %116 %int_1
+               OpReturnValue %117
+               OpFunctionEnd
+ %quicksort_ = OpFunction %void None %118
+        %120 = OpLabel
+        %l_1 = OpVariable %_ptr_Function_int Function %40
+        %h_1 = OpVariable %_ptr_Function_int Function %40
+        %top = OpVariable %_ptr_Function_int Function %40
+      %stack = OpVariable %_ptr_Function__arr_int_uint_10 Function %126
+          %p = OpVariable %_ptr_Function_int Function %40
+    %param_4 = OpVariable %_ptr_Function_int Function %40
+    %param_5 = OpVariable %_ptr_Function_int Function %40
+               OpStore %l_1 %int_0
+               OpStore %h_1 %int_9
+               OpStore %top %int_n1
+        %133 = OpLoad %int %top
+        %134 = OpIAdd %int %133 %int_1
+               OpStore %top %134
+        %135 = OpLoad %int %l_1
+        %136 = OpAccessChain %_ptr_Function_int %stack %134
+               OpStore %136 %135
+        %137 = OpLoad %int %top
+        %138 = OpIAdd %int %137 %int_1
+               OpStore %top %138
+        %139 = OpLoad %int %h_1
+        %140 = OpAccessChain %_ptr_Function_int %stack %138
+               OpStore %140 %139
+               OpBranch %141
+        %141 = OpLabel
+               OpLoopMerge %142 %143 None
+               OpBranch %144
+        %144 = OpLabel
+        %145 = OpLoad %int %top
+        %146 = OpSGreaterThanEqual %bool %145 %int_0
+               OpSelectionMerge %147 None
+               OpBranchConditional %146 %148 %149
+        %148 = OpLabel
+               OpBranch %147
+        %149 = OpLabel
+               OpBranch %142
+        %147 = OpLabel
+        %150 = OpLoad %int %top
+        %151 = OpISub %int %150 %int_1
+               OpStore %top %151
+        %152 = OpAccessChain %_ptr_Function_int %stack %150
+        %153 = OpLoad %int %152
+               OpStore %h_1 %153
+        %154 = OpLoad %int %top
+        %155 = OpISub %int %154 %int_1
+               OpStore %top %155
+        %156 = OpAccessChain %_ptr_Function_int %stack %154
+        %157 = OpLoad %int %156
+               OpStore %l_1 %157
+        %158 = OpLoad %int %l_1
+               OpStore %param_4 %158
+        %159 = OpLoad %int %h_1
+               OpStore %param_5 %159
+        %160 = OpFunctionCall %int %performPartition_i1_i1_ %param_4 %param_5
+               OpStore %p %160
+        %163 = OpLoad %int %p
+        %164 = OpLoad %int %l_1
+        %165 = OpISub %int %163 %int_1
+        %166 = OpSGreaterThan %bool %165 %164
+               OpSelectionMerge %167 None
+               OpBranchConditional %166 %168 %167
+        %168 = OpLabel
+        %169 = OpLoad %int %top
+        %170 = OpIAdd %int %169 %int_1
+               OpStore %top %170
+        %171 = OpLoad %int %l_1
+        %172 = OpAccessChain %_ptr_Function_int %stack %170
+               OpStore %172 %171
+        %173 = OpLoad %int %top
+        %174 = OpIAdd %int %173 %int_1
+               OpStore %top %174
+        %175 = OpLoad %int %p
+        %176 = OpAccessChain %_ptr_Function_int %stack %174
+        %177 = OpISub %int %175 %int_1
+               OpStore %176 %177
+               OpBranch %167
+        %167 = OpLabel
+        %178 = OpLoad %int %p
+        %179 = OpLoad %int %h_1
+        %180 = OpIAdd %int %178 %int_1
+        %181 = OpSLessThan %bool %180 %179
+               OpSelectionMerge %182 None
+               OpBranchConditional %181 %183 %182
+        %183 = OpLabel
+        %184 = OpLoad %int %top
+        %185 = OpIAdd %int %184 %int_1
+               OpStore %top %185
+        %186 = OpLoad %int %p
+        %187 = OpAccessChain %_ptr_Function_int %stack %185
+        %188 = OpIAdd %int %186 %int_1
+               OpStore %187 %188
+        %189 = OpLoad %int %top
+        %190 = OpIAdd %int %189 %int_1
+               OpStore %top %190
+        %191 = OpLoad %int %h_1
+        %192 = OpAccessChain %_ptr_Function_int %stack %190
+               OpStore %192 %191
+               OpBranch %182
+        %182 = OpLabel
+               OpBranch %143
+        %143 = OpLabel
+               OpBranch %141
+        %142 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %118
+        %194 = OpLabel
+        %i_2 = OpVariable %_ptr_Function_int Function %40
+         %uv = OpVariable %_ptr_Function_v2float Function %198
+      %color = OpVariable %_ptr_Function_v3float Function %202
+        %203 = OpLoad %v4float %x_GLF_pos
+        %207 = OpFAdd %v4float %203 %206
+        %210 = OpFMul %v4float %207 %209
+               OpStore %x_GLF_FragCoord %210
+               OpStore %i_2 %int_0
+               OpBranch %211
+        %211 = OpLabel
+               OpLoopMerge %212 %213 None
+               OpBranch %214
+        %214 = OpLabel
+        %215 = OpLoad %int %i_2
+        %217 = OpSLessThan %bool %215 %int_10
+               OpSelectionMerge %218 None
+               OpBranchConditional %217 %219 %220
+        %219 = OpLabel
+               OpBranch %218
+        %220 = OpLabel
+               OpBranch %212
+        %218 = OpLabel
+        %221 = OpLoad %int %i_2
+        %222 = OpLoad %int %i_2
+        %223 = OpAccessChain %_ptr_Private_int %obj %uint_0 %221
+        %224 = OpISub %int %int_10 %222
+               OpStore %223 %224
+        %226 = OpAccessChain %_ptr_Uniform_float %x_33 %uint_0 %uint_0
+        %227 = OpLoad %float %226
+        %229 = OpAccessChain %_ptr_Uniform_float %x_33 %uint_0 %uint_1
+        %230 = OpLoad %float %229
+        %231 = OpFOrdGreaterThan %bool %227 %230
+               OpSelectionMerge %232 None
+               OpBranchConditional %231 %233 %232
+        %233 = OpLabel
+               OpBranch %212
+        %232 = OpLabel
+        %234 = OpLoad %int %i_2
+        %235 = OpLoad %int %i_2
+        %236 = OpAccessChain %_ptr_Private_int %obj %uint_0 %235
+        %237 = OpLoad %int %236
+        %238 = OpLoad %int %i_2
+        %239 = OpAccessChain %_ptr_Private_int %obj %uint_0 %238
+        %240 = OpLoad %int %239
+        %241 = OpAccessChain %_ptr_Private_int %obj %uint_0 %234
+        %242 = OpIMul %int %237 %240
+               OpStore %241 %242
+               OpBranch %213
+        %213 = OpLabel
+        %243 = OpLoad %int %i_2
+        %244 = OpIAdd %int %243 %int_1
+               OpStore %i_2 %244
+               OpBranch %211
+        %212 = OpLabel
+        %245 = OpFunctionCall %void %quicksort_
+        %246 = OpLoad %v4float %x_GLF_FragCoord
+        %248 = OpAccessChain %_ptr_Uniform_v2float %x_36 %uint_0
+        %249 = OpLoad %v2float %248
+        %250 = OpCompositeExtract %float %246 0
+        %251 = OpCompositeExtract %float %246 1
+        %252 = OpCompositeConstruct %v2float %250 %251
+        %253 = OpFDiv %v2float %252 %249
+               OpStore %uv %253
+               OpStore %color %256
+        %257 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_0
+        %258 = OpLoad %int %257
+        %260 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %261 = OpLoad %float %260
+        %262 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %263 = OpConvertSToF %float %258
+        %264 = OpFAdd %float %261 %263
+               OpStore %262 %264
+        %265 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %266 = OpLoad %float %265
+        %268 = OpFOrdGreaterThan %bool %266 %float_0_25
+               OpSelectionMerge %269 None
+               OpBranchConditional %268 %270 %269
+        %270 = OpLabel
+        %271 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_1
+        %272 = OpLoad %int %271
+        %273 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %274 = OpLoad %float %273
+        %275 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %276 = OpConvertSToF %float %272
+        %277 = OpFAdd %float %274 %276
+               OpStore %275 %277
+               OpBranch %269
+        %269 = OpLabel
+        %278 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %279 = OpLoad %float %278
+        %281 = OpFOrdGreaterThan %bool %279 %float_0_5
+               OpSelectionMerge %282 None
+               OpBranchConditional %281 %283 %282
+        %283 = OpLabel
+        %285 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_2
+        %286 = OpLoad %int %285
+        %287 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %288 = OpLoad %float %287
+        %289 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %290 = OpConvertSToF %float %286
+        %291 = OpFAdd %float %288 %290
+               OpStore %289 %291
+               OpBranch %282
+        %282 = OpLabel
+        %292 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %293 = OpLoad %float %292
+        %295 = OpFOrdGreaterThan %bool %293 %float_0_75
+               OpSelectionMerge %296 None
+               OpBranchConditional %295 %297 %296
+        %297 = OpLabel
+        %299 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_3
+        %300 = OpLoad %int %299
+        %302 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %303 = OpLoad %float %302
+        %304 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %305 = OpConvertSToF %float %300
+        %306 = OpFAdd %float %303 %305
+               OpStore %304 %306
+               OpBranch %296
+        %296 = OpLabel
+        %308 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_4
+        %309 = OpLoad %int %308
+        %310 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %311 = OpLoad %float %310
+        %312 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %313 = OpConvertSToF %float %309
+        %314 = OpFAdd %float %311 %313
+               OpStore %312 %314
+        %315 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %316 = OpLoad %float %315
+        %317 = OpFOrdGreaterThan %bool %316 %float_0_25
+               OpSelectionMerge %318 None
+               OpBranchConditional %317 %319 %318
+        %319 = OpLabel
+        %321 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_5
+        %322 = OpLoad %int %321
+        %323 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %324 = OpLoad %float %323
+        %325 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %326 = OpConvertSToF %float %322
+        %327 = OpFAdd %float %324 %326
+               OpStore %325 %327
+               OpBranch %318
+        %318 = OpLabel
+        %328 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %329 = OpLoad %float %328
+        %330 = OpFOrdGreaterThan %bool %329 %float_0_5
+               OpSelectionMerge %331 None
+               OpBranchConditional %330 %332 %331
+        %332 = OpLabel
+        %334 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_6
+        %335 = OpLoad %int %334
+        %336 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %337 = OpLoad %float %336
+        %338 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %339 = OpConvertSToF %float %335
+        %340 = OpFAdd %float %337 %339
+               OpStore %338 %340
+               OpBranch %331
+        %331 = OpLabel
+        %341 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %342 = OpLoad %float %341
+        %343 = OpFOrdGreaterThan %bool %342 %float_0_75
+               OpSelectionMerge %344 None
+               OpBranchConditional %343 %345 %344
+        %345 = OpLabel
+        %347 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_7
+        %348 = OpLoad %int %347
+        %349 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %350 = OpLoad %float %349
+        %351 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %352 = OpConvertSToF %float %348
+        %353 = OpFAdd %float %350 %352
+               OpStore %351 %353
+               OpBranch %344
+        %344 = OpLabel
+        %355 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_8
+        %356 = OpLoad %int %355
+        %357 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %358 = OpLoad %float %357
+        %359 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %360 = OpConvertSToF %float %356
+        %361 = OpFAdd %float %358 %360
+               OpStore %359 %361
+        %362 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %363 = OpLoad %float %362
+        %364 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %365 = OpLoad %float %364
+        %368 = OpFSub %float %363 %365
+        %366 = OpExtInst %float %367 FAbs %368
+        %369 = OpFOrdLessThan %bool %366 %float_0_25
+               OpSelectionMerge %370 None
+               OpBranchConditional %369 %371 %370
+        %371 = OpLabel
+        %372 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_9
+        %373 = OpLoad %int %372
+        %374 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %375 = OpLoad %float %374
+        %376 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %377 = OpConvertSToF %float %373
+        %378 = OpFAdd %float %375 %377
+               OpStore %376 %378
+               OpBranch %370
+        %370 = OpLabel
+        %379 = OpLoad %v3float %color
+        %380 = OpExtInst %v3float %367 Normalize %379
+        %381 = OpCompositeExtract %float %380 0
+        %382 = OpCompositeExtract %float %380 1
+        %383 = OpCompositeExtract %float %380 2
+        %384 = OpCompositeConstruct %v4float %381 %382 %383 %float_1
+               OpStore %frag_color %384
+        %385 = OpLoad %v4float %x_GLF_pos
+               OpStore %gl_Position %385
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_4 = OpFunction %void None %386
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %390 = OpLabel
+        %391 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %391
+        %392 = OpCompositeExtract %v4float %tint_symbol_1 1
+               OpStore %tint_symbol_3 %392
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %118
+        %394 = OpLabel
+               OpStore %tint_pointsize %float_1
+        %395 = OpLoad %v4float %tint_symbol
+               OpStore %x_GLF_pos %395
+        %396 = OpFunctionCall %void %main_1
+        %398 = OpLoad %v4float %frag_color
+        %399 = OpLoad %v4float %gl_Position
+        %400 = OpCompositeConstruct %main_out %398 %399
+        %397 = OpFunctionCall %void %tint_symbol_4 %400
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/2-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/2-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..b0ecbc4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-for-loop-with-injection/2-opt.wgsl.expected.wgsl
@@ -0,0 +1,276 @@
+struct QuicksortObject {
+  numbers : array<i32, 10>;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[block]]
+struct buf1 {
+  resolution : vec2<f32>;
+};
+
+var<private> obj : QuicksortObject;
+
+var<private> x_GLF_FragCoord : vec4<f32>;
+
+var<private> x_GLF_pos : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_33 : buf0;
+
+[[group(0), binding(1)]] var<uniform> x_36 : buf1;
+
+var<private> frag_color : vec4<f32>;
+
+var<private> gl_Position : vec4<f32>;
+
+fn swap_i1_i1_(i : ptr<function, i32>, j : ptr<function, i32>) {
+  var temp : i32;
+  let x_250 : i32 = *(i);
+  let x_252 : i32 = obj.numbers[x_250];
+  temp = x_252;
+  let x_253 : i32 = *(i);
+  let x_254 : i32 = *(j);
+  let x_256 : i32 = obj.numbers[x_254];
+  obj.numbers[x_253] = x_256;
+  let x_258 : i32 = *(j);
+  let x_259 : i32 = temp;
+  obj.numbers[x_258] = x_259;
+  return;
+}
+
+fn performPartition_i1_i1_(l : ptr<function, i32>, h : ptr<function, i32>) -> i32 {
+  var pivot : i32;
+  var i_1 : i32;
+  var j_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  var param_3 : i32;
+  let x_262 : i32 = *(h);
+  let x_264 : i32 = obj.numbers[x_262];
+  pivot = x_264;
+  let x_265 : i32 = *(l);
+  i_1 = (x_265 - 1);
+  let x_267 : i32 = *(l);
+  j_1 = x_267;
+  loop {
+    let x_272 : i32 = j_1;
+    let x_273 : i32 = *(h);
+    if ((x_272 <= (x_273 - 1))) {
+    } else {
+      break;
+    }
+    let x_277 : i32 = j_1;
+    let x_279 : i32 = obj.numbers[x_277];
+    let x_280 : i32 = pivot;
+    if ((x_279 <= x_280)) {
+      let x_284 : i32 = i_1;
+      i_1 = (x_284 + 1);
+      let x_286 : i32 = i_1;
+      param = x_286;
+      let x_287 : i32 = j_1;
+      param_1 = x_287;
+      swap_i1_i1_(&(param), &(param_1));
+    }
+
+    continuing {
+      let x_289 : i32 = j_1;
+      j_1 = (x_289 + 1);
+    }
+  }
+  let x_291 : i32 = i_1;
+  param_2 = (x_291 + 1);
+  let x_293 : i32 = *(h);
+  param_3 = x_293;
+  swap_i1_i1_(&(param_2), &(param_3));
+  let x_295 : i32 = i_1;
+  return (x_295 + 1);
+}
+
+fn quicksort_() {
+  var l_1 : i32;
+  var h_1 : i32;
+  var top : i32;
+  var stack : array<i32, 10>;
+  var p : i32;
+  var param_4 : i32;
+  var param_5 : i32;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  let x_298 : i32 = top;
+  let x_299 : i32 = (x_298 + 1);
+  top = x_299;
+  let x_300 : i32 = l_1;
+  stack[x_299] = x_300;
+  let x_302 : i32 = top;
+  let x_303 : i32 = (x_302 + 1);
+  top = x_303;
+  let x_304 : i32 = h_1;
+  stack[x_303] = x_304;
+  loop {
+    let x_310 : i32 = top;
+    if ((x_310 >= 0)) {
+    } else {
+      break;
+    }
+    let x_313 : i32 = top;
+    top = (x_313 - 1);
+    let x_316 : i32 = stack[x_313];
+    h_1 = x_316;
+    let x_317 : i32 = top;
+    top = (x_317 - 1);
+    let x_320 : i32 = stack[x_317];
+    l_1 = x_320;
+    let x_321 : i32 = l_1;
+    param_4 = x_321;
+    let x_322 : i32 = h_1;
+    param_5 = x_322;
+    let x_323 : i32 = performPartition_i1_i1_(&(param_4), &(param_5));
+    p = x_323;
+    let x_324 : i32 = p;
+    let x_326 : i32 = l_1;
+    if (((x_324 - 1) > x_326)) {
+      let x_330 : i32 = top;
+      let x_331 : i32 = (x_330 + 1);
+      top = x_331;
+      let x_332 : i32 = l_1;
+      stack[x_331] = x_332;
+      let x_334 : i32 = top;
+      let x_335 : i32 = (x_334 + 1);
+      top = x_335;
+      let x_336 : i32 = p;
+      stack[x_335] = (x_336 - 1);
+    }
+    let x_339 : i32 = p;
+    let x_341 : i32 = h_1;
+    if (((x_339 + 1) < x_341)) {
+      let x_345 : i32 = top;
+      let x_346 : i32 = (x_345 + 1);
+      top = x_346;
+      let x_347 : i32 = p;
+      stack[x_346] = (x_347 + 1);
+      let x_350 : i32 = top;
+      let x_351 : i32 = (x_350 + 1);
+      top = x_351;
+      let x_352 : i32 = h_1;
+      stack[x_351] = x_352;
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_2 : i32;
+  var uv : vec2<f32>;
+  var color : vec3<f32>;
+  let x_94 : vec4<f32> = x_GLF_pos;
+  x_GLF_FragCoord = ((x_94 + vec4<f32>(1.0, 1.0, 0.0, 0.0)) * vec4<f32>(128.0, 128.0, 1.0, 1.0));
+  i_2 = 0;
+  loop {
+    let x_101 : i32 = i_2;
+    if ((x_101 < 10)) {
+    } else {
+      break;
+    }
+    let x_104 : i32 = i_2;
+    let x_105 : i32 = i_2;
+    obj.numbers[x_104] = (10 - x_105);
+    let x_109 : f32 = x_33.injectionSwitch.x;
+    let x_111 : f32 = x_33.injectionSwitch.y;
+    if ((x_109 > x_111)) {
+      break;
+    }
+    let x_115 : i32 = i_2;
+    let x_116 : i32 = i_2;
+    let x_118 : i32 = obj.numbers[x_116];
+    let x_119 : i32 = i_2;
+    let x_121 : i32 = obj.numbers[x_119];
+    obj.numbers[x_115] = (x_118 * x_121);
+
+    continuing {
+      let x_124 : i32 = i_2;
+      i_2 = (x_124 + 1);
+    }
+  }
+  quicksort_();
+  let x_127 : vec4<f32> = x_GLF_FragCoord;
+  let x_130 : vec2<f32> = x_36.resolution;
+  uv = (vec2<f32>(x_127.x, x_127.y) / x_130);
+  color = vec3<f32>(1.0, 2.0, 3.0);
+  let x_133 : i32 = obj.numbers[0];
+  let x_136 : f32 = color.x;
+  color.x = (x_136 + f32(x_133));
+  let x_140 : f32 = uv.x;
+  if ((x_140 > 0.25)) {
+    let x_145 : i32 = obj.numbers[1];
+    let x_148 : f32 = color.x;
+    color.x = (x_148 + f32(x_145));
+  }
+  let x_152 : f32 = uv.x;
+  if ((x_152 > 0.5)) {
+    let x_157 : i32 = obj.numbers[2];
+    let x_160 : f32 = color.y;
+    color.y = (x_160 + f32(x_157));
+  }
+  let x_164 : f32 = uv.x;
+  if ((x_164 > 0.75)) {
+    let x_169 : i32 = obj.numbers[3];
+    let x_172 : f32 = color.z;
+    color.z = (x_172 + f32(x_169));
+  }
+  let x_176 : i32 = obj.numbers[4];
+  let x_179 : f32 = color.y;
+  color.y = (x_179 + f32(x_176));
+  let x_183 : f32 = uv.y;
+  if ((x_183 > 0.25)) {
+    let x_188 : i32 = obj.numbers[5];
+    let x_191 : f32 = color.x;
+    color.x = (x_191 + f32(x_188));
+  }
+  let x_195 : f32 = uv.y;
+  if ((x_195 > 0.5)) {
+    let x_200 : i32 = obj.numbers[6];
+    let x_203 : f32 = color.y;
+    color.y = (x_203 + f32(x_200));
+  }
+  let x_207 : f32 = uv.y;
+  if ((x_207 > 0.75)) {
+    let x_212 : i32 = obj.numbers[7];
+    let x_215 : f32 = color.z;
+    color.z = (x_215 + f32(x_212));
+  }
+  let x_219 : i32 = obj.numbers[8];
+  let x_222 : f32 = color.z;
+  color.z = (x_222 + f32(x_219));
+  let x_226 : f32 = uv.x;
+  let x_228 : f32 = uv.y;
+  if ((abs((x_226 - x_228)) < 0.25)) {
+    let x_235 : i32 = obj.numbers[9];
+    let x_238 : f32 = color.x;
+    color.x = (x_238 + f32(x_235));
+  }
+  let x_241 : vec3<f32> = color;
+  let x_242 : vec3<f32> = normalize(x_241);
+  frag_color = vec4<f32>(x_242.x, x_242.y, x_242.z, 1.0);
+  let x_247 : vec4<f32> = x_GLF_pos;
+  gl_Position = x_247;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  frag_color_1 : vec4<f32>;
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] x_GLF_pos_param : vec4<f32>) -> main_out {
+  x_GLF_pos = x_GLF_pos_param;
+  main_1();
+  return main_out(frag_color, gl_Position);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/0.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/0.spvasm
new file mode 100644
index 0000000..fa20c31
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/0.spvasm
@@ -0,0 +1,689 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %_GLF_pos %frag_color %__0
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %swap_i1_i1_ "swap(i1;i1;"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %performPartition_i1_i1_ "performPartition(i1;i1;"
+               OpName %l "l"
+               OpName %h "h"
+               OpName %quicksort_ "quicksort("
+               OpName %temp "temp"
+               OpName %QuicksortObject "QuicksortObject"
+               OpMemberName %QuicksortObject 0 "numbers"
+               OpName %obj "obj"
+               OpName %pivot "pivot"
+               OpName %i_0 "i"
+               OpName %j_0 "j"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %param_1 "param"
+               OpName %param_2 "param"
+               OpName %l_0 "l"
+               OpName %h_0 "h"
+               OpName %top "top"
+               OpName %stack "stack"
+               OpName %p "p"
+               OpName %param_3 "param"
+               OpName %param_4 "param"
+               OpName %_GLF_FragCoord "_GLF_FragCoord"
+               OpName %_GLF_pos "_GLF_pos"
+               OpName %i_1 "i"
+               OpName %uv "uv"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %color "color"
+               OpName %frag_color "frag_color"
+               OpName %gl_PerVertex "gl_PerVertex"
+               OpMemberName %gl_PerVertex 0 "gl_Position"
+               OpMemberName %gl_PerVertex 1 "gl_PointSize"
+               OpName %__0 ""
+               OpDecorate %_GLF_pos Location 0
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %frag_color Location 0
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpDecorate %gl_PerVertex Block
+       %void = OpTypeVoid
+         %38 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %41 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+         %42 = OpTypeFunction %int %_ptr_Function_int %_ptr_Function_int
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%QuicksortObject = OpTypeStruct %_arr_int_uint_10
+%_ptr_Private_QuicksortObject = OpTypePointer Private %QuicksortObject
+        %obj = OpVariable %_ptr_Private_QuicksortObject Private
+      %int_0 = OpConstant %int 0
+%_ptr_Private_int = OpTypePointer Private %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %int_9 = OpConstant %int 9
+     %int_n1 = OpConstant %int -1
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+%_GLF_FragCoord = OpVariable %_ptr_Private_v4float Private
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+   %_GLF_pos = OpVariable %_ptr_Input_v4float Input
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %60 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_0
+  %float_128 = OpConstant %float 128
+         %62 = OpConstantComposite %v4float %float_128 %float_128 %float_1 %float_1
+     %int_10 = OpConstant %int 10
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+         %72 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+ %float_0_25 = OpConstant %float 0.25
+  %float_0_5 = OpConstant %float 0.5
+      %int_2 = OpConstant %int 2
+     %uint_1 = OpConstant %uint 1
+ %float_0_75 = OpConstant %float 0.75
+      %int_3 = OpConstant %int 3
+     %uint_2 = OpConstant %uint 2
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %frag_color = OpVariable %_ptr_Output_v4float Output
+%gl_PerVertex = OpTypeStruct %v4float %float
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+        %__0 = OpVariable %_ptr_Output_gl_PerVertex Output
+       %main = OpFunction %void None %38
+         %89 = OpLabel
+         %90 = OpVariable %_ptr_Function_int Function
+         %91 = OpVariable %_ptr_Function_int Function
+         %92 = OpVariable %_ptr_Function_int Function
+         %93 = OpVariable %_ptr_Function_int Function
+         %94 = OpVariable %_ptr_Function_int Function
+         %95 = OpVariable %_ptr_Function_int Function
+         %96 = OpVariable %_ptr_Function_int Function
+         %97 = OpVariable %_ptr_Function_int Function
+         %98 = OpVariable %_ptr_Function_int Function
+         %99 = OpVariable %_ptr_Function_int Function
+        %100 = OpVariable %_ptr_Function_int Function
+        %101 = OpVariable %_ptr_Function_int Function
+        %102 = OpVariable %_ptr_Function_int Function
+        %103 = OpVariable %_ptr_Function__arr_int_uint_10 Function
+        %104 = OpVariable %_ptr_Function_int Function
+        %105 = OpVariable %_ptr_Function_int Function
+        %106 = OpVariable %_ptr_Function_int Function
+        %i_1 = OpVariable %_ptr_Function_int Function
+         %uv = OpVariable %_ptr_Function_v2float Function
+      %color = OpVariable %_ptr_Function_v3float Function
+        %107 = OpLoad %v4float %_GLF_pos
+        %108 = OpFAdd %v4float %107 %60
+        %109 = OpFMul %v4float %108 %62
+               OpStore %_GLF_FragCoord %109
+               OpStore %i_1 %int_0
+               OpBranch %110
+        %110 = OpLabel
+               OpLoopMerge %111 %112 None
+               OpBranch %113
+        %113 = OpLabel
+        %114 = OpLoad %int %i_1
+        %115 = OpSLessThan %bool %114 %int_10
+               OpBranchConditional %115 %116 %111
+        %116 = OpLabel
+        %117 = OpLoad %int %i_1
+        %118 = OpLoad %int %i_1
+        %119 = OpISub %int %int_10 %118
+        %120 = OpAccessChain %_ptr_Private_int %obj %int_0 %117
+               OpStore %120 %119
+        %121 = OpLoad %int %i_1
+        %122 = OpLoad %int %i_1
+        %123 = OpAccessChain %_ptr_Private_int %obj %int_0 %122
+        %124 = OpLoad %int %123
+        %125 = OpLoad %int %i_1
+        %126 = OpAccessChain %_ptr_Private_int %obj %int_0 %125
+        %127 = OpLoad %int %126
+        %128 = OpIMul %int %124 %127
+        %129 = OpAccessChain %_ptr_Private_int %obj %int_0 %121
+               OpStore %129 %128
+               OpBranch %112
+        %112 = OpLabel
+        %130 = OpLoad %int %i_1
+        %131 = OpIAdd %int %130 %int_1
+               OpStore %i_1 %131
+               OpBranch %110
+        %111 = OpLabel
+               OpStore %100 %int_0
+               OpStore %101 %int_9
+               OpStore %102 %int_n1
+        %132 = OpLoad %int %102
+        %133 = OpIAdd %int %132 %int_1
+               OpStore %102 %133
+        %134 = OpLoad %int %100
+        %135 = OpAccessChain %_ptr_Function_int %103 %133
+               OpStore %135 %134
+        %136 = OpLoad %int %102
+        %137 = OpIAdd %int %136 %int_1
+               OpStore %102 %137
+        %138 = OpLoad %int %101
+        %139 = OpAccessChain %_ptr_Function_int %103 %137
+               OpStore %139 %138
+               OpBranch %140
+        %140 = OpLabel
+               OpLoopMerge %141 %142 None
+               OpBranch %143
+        %143 = OpLabel
+        %144 = OpLoad %int %102
+        %145 = OpSGreaterThanEqual %bool %144 %int_0
+               OpBranchConditional %145 %146 %141
+        %146 = OpLabel
+        %147 = OpLoad %int %102
+        %148 = OpISub %int %147 %int_1
+               OpStore %102 %148
+        %149 = OpAccessChain %_ptr_Function_int %103 %147
+        %150 = OpLoad %int %149
+               OpStore %101 %150
+        %151 = OpLoad %int %102
+        %152 = OpISub %int %151 %int_1
+               OpStore %102 %152
+        %153 = OpAccessChain %_ptr_Function_int %103 %151
+        %154 = OpLoad %int %153
+               OpStore %100 %154
+        %155 = OpLoad %int %100
+               OpStore %105 %155
+        %156 = OpLoad %int %101
+               OpStore %106 %156
+        %157 = OpLoad %int %106
+        %158 = OpAccessChain %_ptr_Private_int %obj %int_0 %157
+        %159 = OpLoad %int %158
+               OpStore %92 %159
+        %160 = OpLoad %int %105
+        %161 = OpISub %int %160 %int_1
+               OpStore %93 %161
+        %162 = OpLoad %int %105
+               OpStore %94 %162
+               OpBranch %163
+        %163 = OpLabel
+               OpLoopMerge %164 %165 None
+               OpBranch %166
+        %166 = OpLabel
+        %167 = OpLoad %int %94
+        %168 = OpLoad %int %106
+        %169 = OpISub %int %168 %int_1
+        %170 = OpSLessThanEqual %bool %167 %169
+               OpBranchConditional %170 %171 %164
+        %171 = OpLabel
+        %172 = OpLoad %int %94
+        %173 = OpAccessChain %_ptr_Private_int %obj %int_0 %172
+        %174 = OpLoad %int %173
+        %175 = OpLoad %int %92
+        %176 = OpSLessThanEqual %bool %174 %175
+               OpSelectionMerge %177 None
+               OpBranchConditional %176 %178 %177
+        %178 = OpLabel
+        %179 = OpLoad %int %93
+        %180 = OpIAdd %int %179 %int_1
+               OpStore %93 %180
+        %181 = OpLoad %int %93
+               OpStore %95 %181
+        %182 = OpLoad %int %94
+               OpStore %96 %182
+        %183 = OpLoad %int %95
+        %184 = OpAccessChain %_ptr_Private_int %obj %int_0 %183
+        %185 = OpLoad %int %184
+               OpStore %91 %185
+        %186 = OpLoad %int %95
+        %187 = OpLoad %int %96
+        %188 = OpAccessChain %_ptr_Private_int %obj %int_0 %187
+        %189 = OpLoad %int %188
+        %190 = OpAccessChain %_ptr_Private_int %obj %int_0 %186
+               OpStore %190 %189
+        %191 = OpLoad %int %96
+        %192 = OpLoad %int %91
+        %193 = OpAccessChain %_ptr_Private_int %obj %int_0 %191
+               OpStore %193 %192
+               OpBranch %177
+        %177 = OpLabel
+               OpBranch %165
+        %165 = OpLabel
+        %194 = OpLoad %int %94
+        %195 = OpIAdd %int %194 %int_1
+               OpStore %94 %195
+               OpBranch %163
+        %164 = OpLabel
+        %196 = OpLoad %int %93
+        %197 = OpIAdd %int %196 %int_1
+               OpStore %97 %197
+        %198 = OpLoad %int %106
+               OpStore %98 %198
+        %199 = OpLoad %int %97
+        %200 = OpAccessChain %_ptr_Private_int %obj %int_0 %199
+        %201 = OpLoad %int %200
+               OpStore %90 %201
+        %202 = OpLoad %int %97
+        %203 = OpLoad %int %98
+        %204 = OpAccessChain %_ptr_Private_int %obj %int_0 %203
+        %205 = OpLoad %int %204
+        %206 = OpAccessChain %_ptr_Private_int %obj %int_0 %202
+               OpStore %206 %205
+        %207 = OpLoad %int %98
+        %208 = OpLoad %int %90
+        %209 = OpAccessChain %_ptr_Private_int %obj %int_0 %207
+               OpStore %209 %208
+        %210 = OpLoad %int %93
+        %211 = OpIAdd %int %210 %int_1
+               OpStore %99 %211
+        %212 = OpLoad %int %99
+               OpStore %104 %212
+        %213 = OpLoad %int %104
+        %214 = OpISub %int %213 %int_1
+        %215 = OpLoad %int %100
+        %216 = OpSGreaterThan %bool %214 %215
+               OpSelectionMerge %217 None
+               OpBranchConditional %216 %218 %217
+        %218 = OpLabel
+        %219 = OpLoad %int %102
+        %220 = OpIAdd %int %219 %int_1
+               OpStore %102 %220
+        %221 = OpLoad %int %100
+        %222 = OpAccessChain %_ptr_Function_int %103 %220
+               OpStore %222 %221
+        %223 = OpLoad %int %102
+        %224 = OpIAdd %int %223 %int_1
+               OpStore %102 %224
+        %225 = OpLoad %int %104
+        %226 = OpISub %int %225 %int_1
+        %227 = OpAccessChain %_ptr_Function_int %103 %224
+               OpStore %227 %226
+               OpBranch %217
+        %217 = OpLabel
+        %228 = OpLoad %int %104
+        %229 = OpIAdd %int %228 %int_1
+        %230 = OpLoad %int %101
+        %231 = OpSLessThan %bool %229 %230
+               OpSelectionMerge %232 None
+               OpBranchConditional %231 %233 %232
+        %233 = OpLabel
+        %234 = OpLoad %int %102
+        %235 = OpIAdd %int %234 %int_1
+               OpStore %102 %235
+        %236 = OpLoad %int %104
+        %237 = OpIAdd %int %236 %int_1
+        %238 = OpAccessChain %_ptr_Function_int %103 %235
+               OpStore %238 %237
+        %239 = OpLoad %int %102
+        %240 = OpIAdd %int %239 %int_1
+               OpStore %102 %240
+        %241 = OpLoad %int %101
+        %242 = OpAccessChain %_ptr_Function_int %103 %240
+               OpStore %242 %241
+               OpBranch %232
+        %232 = OpLabel
+               OpBranch %142
+        %142 = OpLabel
+               OpBranch %140
+        %141 = OpLabel
+        %243 = OpLoad %v4float %_GLF_FragCoord
+        %244 = OpVectorShuffle %v2float %243 %243 0 1
+        %245 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+        %246 = OpLoad %v2float %245
+        %247 = OpFDiv %v2float %244 %246
+               OpStore %uv %247
+               OpStore %color %72
+        %248 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_0
+        %249 = OpLoad %int %248
+        %250 = OpConvertSToF %float %249
+        %251 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %252 = OpLoad %float %251
+        %253 = OpFAdd %float %252 %250
+        %254 = OpAccessChain %_ptr_Function_float %color %uint_0
+               OpStore %254 %253
+        %255 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %256 = OpLoad %float %255
+        %257 = OpFOrdGreaterThan %bool %256 %float_0_25
+               OpSelectionMerge %258 None
+               OpBranchConditional %257 %259 %258
+        %259 = OpLabel
+        %260 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_1
+        %261 = OpLoad %int %260
+        %262 = OpConvertSToF %float %261
+        %263 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %264 = OpLoad %float %263
+        %265 = OpFAdd %float %264 %262
+        %266 = OpAccessChain %_ptr_Function_float %color %uint_0
+               OpStore %266 %265
+               OpBranch %258
+        %258 = OpLabel
+        %267 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %268 = OpLoad %float %267
+        %269 = OpFOrdGreaterThan %bool %268 %float_0_5
+               OpSelectionMerge %270 None
+               OpBranchConditional %269 %271 %270
+        %271 = OpLabel
+        %272 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_2
+        %273 = OpLoad %int %272
+        %274 = OpConvertSToF %float %273
+        %275 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %276 = OpLoad %float %275
+        %277 = OpFAdd %float %276 %274
+        %278 = OpAccessChain %_ptr_Function_float %color %uint_1
+               OpStore %278 %277
+               OpBranch %270
+        %270 = OpLabel
+        %279 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %280 = OpLoad %float %279
+        %281 = OpFOrdGreaterThan %bool %280 %float_0_75
+               OpSelectionMerge %282 None
+               OpBranchConditional %281 %283 %282
+        %283 = OpLabel
+        %284 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_3
+        %285 = OpLoad %int %284
+        %286 = OpConvertSToF %float %285
+        %287 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %288 = OpLoad %float %287
+        %289 = OpFAdd %float %288 %286
+        %290 = OpAccessChain %_ptr_Function_float %color %uint_2
+               OpStore %290 %289
+               OpBranch %282
+        %282 = OpLabel
+        %291 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_4
+        %292 = OpLoad %int %291
+        %293 = OpConvertSToF %float %292
+        %294 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %295 = OpLoad %float %294
+        %296 = OpFAdd %float %295 %293
+        %297 = OpAccessChain %_ptr_Function_float %color %uint_1
+               OpStore %297 %296
+        %298 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %299 = OpLoad %float %298
+        %300 = OpFOrdGreaterThan %bool %299 %float_0_25
+               OpSelectionMerge %301 None
+               OpBranchConditional %300 %302 %301
+        %302 = OpLabel
+        %303 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_5
+        %304 = OpLoad %int %303
+        %305 = OpConvertSToF %float %304
+        %306 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %307 = OpLoad %float %306
+        %308 = OpFAdd %float %307 %305
+        %309 = OpAccessChain %_ptr_Function_float %color %uint_0
+               OpStore %309 %308
+               OpBranch %301
+        %301 = OpLabel
+        %310 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %311 = OpLoad %float %310
+        %312 = OpFOrdGreaterThan %bool %311 %float_0_5
+               OpSelectionMerge %313 None
+               OpBranchConditional %312 %314 %313
+        %314 = OpLabel
+        %315 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_6
+        %316 = OpLoad %int %315
+        %317 = OpConvertSToF %float %316
+        %318 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %319 = OpLoad %float %318
+        %320 = OpFAdd %float %319 %317
+        %321 = OpAccessChain %_ptr_Function_float %color %uint_1
+               OpStore %321 %320
+               OpBranch %313
+        %313 = OpLabel
+        %322 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %323 = OpLoad %float %322
+        %324 = OpFOrdGreaterThan %bool %323 %float_0_75
+               OpSelectionMerge %325 None
+               OpBranchConditional %324 %326 %325
+        %326 = OpLabel
+        %327 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_7
+        %328 = OpLoad %int %327
+        %329 = OpConvertSToF %float %328
+        %330 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %331 = OpLoad %float %330
+        %332 = OpFAdd %float %331 %329
+        %333 = OpAccessChain %_ptr_Function_float %color %uint_2
+               OpStore %333 %332
+               OpBranch %325
+        %325 = OpLabel
+        %334 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_8
+        %335 = OpLoad %int %334
+        %336 = OpConvertSToF %float %335
+        %337 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %338 = OpLoad %float %337
+        %339 = OpFAdd %float %338 %336
+        %340 = OpAccessChain %_ptr_Function_float %color %uint_2
+               OpStore %340 %339
+        %341 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %342 = OpLoad %float %341
+        %343 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %344 = OpLoad %float %343
+        %345 = OpFSub %float %342 %344
+        %346 = OpExtInst %float %1 FAbs %345
+        %347 = OpFOrdLessThan %bool %346 %float_0_25
+               OpSelectionMerge %348 None
+               OpBranchConditional %347 %349 %348
+        %349 = OpLabel
+        %350 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_9
+        %351 = OpLoad %int %350
+        %352 = OpConvertSToF %float %351
+        %353 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %354 = OpLoad %float %353
+        %355 = OpFAdd %float %354 %352
+        %356 = OpAccessChain %_ptr_Function_float %color %uint_0
+               OpStore %356 %355
+               OpBranch %348
+        %348 = OpLabel
+        %357 = OpLoad %v3float %color
+        %358 = OpExtInst %v3float %1 Normalize %357
+        %359 = OpCompositeExtract %float %358 0
+        %360 = OpCompositeExtract %float %358 1
+        %361 = OpCompositeExtract %float %358 2
+        %362 = OpCompositeConstruct %v4float %359 %360 %361 %float_1
+               OpStore %frag_color %362
+        %363 = OpLoad %v4float %_GLF_pos
+        %364 = OpAccessChain %_ptr_Output_v4float %__0 %int_0
+               OpStore %364 %363
+               OpReturn
+               OpFunctionEnd
+%swap_i1_i1_ = OpFunction %void None %41
+          %i = OpFunctionParameter %_ptr_Function_int
+          %j = OpFunctionParameter %_ptr_Function_int
+        %365 = OpLabel
+       %temp = OpVariable %_ptr_Function_int Function
+        %366 = OpLoad %int %i
+        %367 = OpAccessChain %_ptr_Private_int %obj %int_0 %366
+        %368 = OpLoad %int %367
+               OpStore %temp %368
+        %369 = OpLoad %int %i
+        %370 = OpLoad %int %j
+        %371 = OpAccessChain %_ptr_Private_int %obj %int_0 %370
+        %372 = OpLoad %int %371
+        %373 = OpAccessChain %_ptr_Private_int %obj %int_0 %369
+               OpStore %373 %372
+        %374 = OpLoad %int %j
+        %375 = OpLoad %int %temp
+        %376 = OpAccessChain %_ptr_Private_int %obj %int_0 %374
+               OpStore %376 %375
+               OpReturn
+               OpFunctionEnd
+%performPartition_i1_i1_ = OpFunction %int None %42
+          %l = OpFunctionParameter %_ptr_Function_int
+          %h = OpFunctionParameter %_ptr_Function_int
+        %377 = OpLabel
+      %pivot = OpVariable %_ptr_Function_int Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+        %j_0 = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_int Function
+    %param_0 = OpVariable %_ptr_Function_int Function
+    %param_1 = OpVariable %_ptr_Function_int Function
+    %param_2 = OpVariable %_ptr_Function_int Function
+        %378 = OpLoad %int %h
+        %379 = OpAccessChain %_ptr_Private_int %obj %int_0 %378
+        %380 = OpLoad %int %379
+               OpStore %pivot %380
+        %381 = OpLoad %int %l
+        %382 = OpISub %int %381 %int_1
+               OpStore %i_0 %382
+        %383 = OpLoad %int %l
+               OpStore %j_0 %383
+               OpBranch %384
+        %384 = OpLabel
+               OpLoopMerge %385 %386 None
+               OpBranch %387
+        %387 = OpLabel
+        %388 = OpLoad %int %j_0
+        %389 = OpLoad %int %h
+        %390 = OpISub %int %389 %int_1
+        %391 = OpSLessThanEqual %bool %388 %390
+               OpBranchConditional %391 %392 %385
+        %392 = OpLabel
+        %393 = OpLoad %int %j_0
+        %394 = OpAccessChain %_ptr_Private_int %obj %int_0 %393
+        %395 = OpLoad %int %394
+        %396 = OpLoad %int %pivot
+        %397 = OpSLessThanEqual %bool %395 %396
+               OpSelectionMerge %398 None
+               OpBranchConditional %397 %399 %398
+        %399 = OpLabel
+        %400 = OpLoad %int %i_0
+        %401 = OpIAdd %int %400 %int_1
+               OpStore %i_0 %401
+        %402 = OpLoad %int %i_0
+               OpStore %param %402
+        %403 = OpLoad %int %j_0
+               OpStore %param_0 %403
+        %404 = OpFunctionCall %void %swap_i1_i1_ %param %param_0
+               OpBranch %398
+        %398 = OpLabel
+               OpBranch %386
+        %386 = OpLabel
+        %405 = OpLoad %int %j_0
+        %406 = OpIAdd %int %405 %int_1
+               OpStore %j_0 %406
+               OpBranch %384
+        %385 = OpLabel
+        %407 = OpLoad %int %i_0
+        %408 = OpIAdd %int %407 %int_1
+               OpStore %param_1 %408
+        %409 = OpLoad %int %h
+               OpStore %param_2 %409
+        %410 = OpFunctionCall %void %swap_i1_i1_ %param_1 %param_2
+        %411 = OpLoad %int %i_0
+        %412 = OpIAdd %int %411 %int_1
+               OpReturnValue %412
+               OpFunctionEnd
+ %quicksort_ = OpFunction %void None %38
+        %413 = OpLabel
+        %l_0 = OpVariable %_ptr_Function_int Function
+        %h_0 = OpVariable %_ptr_Function_int Function
+        %top = OpVariable %_ptr_Function_int Function
+      %stack = OpVariable %_ptr_Function__arr_int_uint_10 Function
+          %p = OpVariable %_ptr_Function_int Function
+    %param_3 = OpVariable %_ptr_Function_int Function
+    %param_4 = OpVariable %_ptr_Function_int Function
+               OpStore %l_0 %int_0
+               OpStore %h_0 %int_9
+               OpStore %top %int_n1
+        %414 = OpLoad %int %top
+        %415 = OpIAdd %int %414 %int_1
+               OpStore %top %415
+        %416 = OpLoad %int %l_0
+        %417 = OpAccessChain %_ptr_Function_int %stack %415
+               OpStore %417 %416
+        %418 = OpLoad %int %top
+        %419 = OpIAdd %int %418 %int_1
+               OpStore %top %419
+        %420 = OpLoad %int %h_0
+        %421 = OpAccessChain %_ptr_Function_int %stack %419
+               OpStore %421 %420
+               OpBranch %422
+        %422 = OpLabel
+               OpLoopMerge %423 %424 None
+               OpBranch %425
+        %425 = OpLabel
+        %426 = OpLoad %int %top
+        %427 = OpSGreaterThanEqual %bool %426 %int_0
+               OpBranchConditional %427 %428 %423
+        %428 = OpLabel
+        %429 = OpLoad %int %top
+        %430 = OpISub %int %429 %int_1
+               OpStore %top %430
+        %431 = OpAccessChain %_ptr_Function_int %stack %429
+        %432 = OpLoad %int %431
+               OpStore %h_0 %432
+        %433 = OpLoad %int %top
+        %434 = OpISub %int %433 %int_1
+               OpStore %top %434
+        %435 = OpAccessChain %_ptr_Function_int %stack %433
+        %436 = OpLoad %int %435
+               OpStore %l_0 %436
+        %437 = OpLoad %int %l_0
+               OpStore %param_3 %437
+        %438 = OpLoad %int %h_0
+               OpStore %param_4 %438
+        %439 = OpFunctionCall %int %performPartition_i1_i1_ %param_3 %param_4
+               OpStore %p %439
+        %440 = OpLoad %int %p
+        %441 = OpISub %int %440 %int_1
+        %442 = OpLoad %int %l_0
+        %443 = OpSGreaterThan %bool %441 %442
+               OpSelectionMerge %444 None
+               OpBranchConditional %443 %445 %444
+        %445 = OpLabel
+        %446 = OpLoad %int %top
+        %447 = OpIAdd %int %446 %int_1
+               OpStore %top %447
+        %448 = OpLoad %int %l_0
+        %449 = OpAccessChain %_ptr_Function_int %stack %447
+               OpStore %449 %448
+        %450 = OpLoad %int %top
+        %451 = OpIAdd %int %450 %int_1
+               OpStore %top %451
+        %452 = OpLoad %int %p
+        %453 = OpISub %int %452 %int_1
+        %454 = OpAccessChain %_ptr_Function_int %stack %451
+               OpStore %454 %453
+               OpBranch %444
+        %444 = OpLabel
+        %455 = OpLoad %int %p
+        %456 = OpIAdd %int %455 %int_1
+        %457 = OpLoad %int %h_0
+        %458 = OpSLessThan %bool %456 %457
+               OpSelectionMerge %459 None
+               OpBranchConditional %458 %460 %459
+        %460 = OpLabel
+        %461 = OpLoad %int %top
+        %462 = OpIAdd %int %461 %int_1
+               OpStore %top %462
+        %463 = OpLoad %int %p
+        %464 = OpIAdd %int %463 %int_1
+        %465 = OpAccessChain %_ptr_Function_int %stack %462
+               OpStore %465 %464
+        %466 = OpLoad %int %top
+        %467 = OpIAdd %int %466 %int_1
+               OpStore %top %467
+        %468 = OpLoad %int %h_0
+        %469 = OpAccessChain %_ptr_Function_int %stack %467
+               OpStore %469 %468
+               OpBranch %459
+        %459 = OpLabel
+               OpBranch %424
+        %424 = OpLabel
+               OpBranch %422
+        %423 = OpLabel
+               OpReturn
+               OpFunctionEnd
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
new file mode 100644
index 0000000..99862c3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/0.spvasm.expected.hlsl
@@ -0,0 +1,306 @@
+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;
+  {
+    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;
+  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;
+    {
+      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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 x_GLF_pos_param = tint_symbol.x_GLF_pos_param;
+  x_GLF_pos = x_GLF_pos_param;
+  main_1();
+  const main_out tint_symbol_3 = {frag_color, gl_Position};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.frag_color_1, tint_symbol_3.gl_Position};
+  return tint_symbol_5;
+}
+
+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;
+  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;
+  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;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/0.spvasm.expected.msl
new file mode 100644
index 0000000..45ba09a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/0.spvasm.expected.msl
@@ -0,0 +1,400 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct QuicksortObject {
+  tint_array_wrapper numbers;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 frag_color_1;
+  float4 gl_Position;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_pos_param [[attribute(0)]];
+};
+struct tint_symbol_3 {
+  float4 frag_color_1 [[user(locn0)]];
+  float4 gl_Position [[position]];
+};
+
+void main_1(constant buf0& x_34, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7, thread QuicksortObject* const tint_symbol_8, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10) {
+  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;
+  tint_array_wrapper x_103 = {};
+  int x_104 = 0;
+  int x_105 = 0;
+  int x_106 = 0;
+  int i_2 = 0;
+  float2 uv = 0.0f;
+  float3 color = 0.0f;
+  float4 const x_107 = *(tint_symbol_6);
+  *(tint_symbol_7) = ((x_107 + float4(1.0f, 1.0f, 0.0f, 0.0f)) * float4(128.0f, 128.0f, 1.0f, 1.0f));
+  i_2 = 0;
+  while (true) {
+    int const x_114 = i_2;
+    if ((x_114 < 10)) {
+    } else {
+      break;
+    }
+    int const x_117 = i_2;
+    int const x_118 = i_2;
+    (*(tint_symbol_8)).numbers.arr[x_117] = (10 - x_118);
+    int const x_121 = i_2;
+    int const x_122 = i_2;
+    int const x_124 = (*(tint_symbol_8)).numbers.arr[x_122];
+    int const x_125 = i_2;
+    int const x_127 = (*(tint_symbol_8)).numbers.arr[x_125];
+    (*(tint_symbol_8)).numbers.arr[x_121] = (x_124 * x_127);
+    {
+      int const x_130 = i_2;
+      i_2 = (x_130 + 1);
+    }
+  }
+  x_100 = 0;
+  x_101 = 9;
+  x_102 = -1;
+  int const x_132 = x_102;
+  int const x_133 = (x_132 + 1);
+  x_102 = x_133;
+  int const x_134 = x_100;
+  x_103.arr[x_133] = x_134;
+  int const x_136 = x_102;
+  int const x_137 = (x_136 + 1);
+  x_102 = x_137;
+  int const x_138 = x_101;
+  x_103.arr[x_137] = x_138;
+  while (true) {
+    int const x_144 = x_102;
+    if ((x_144 >= 0)) {
+    } else {
+      break;
+    }
+    int const x_147 = x_102;
+    x_102 = (x_147 - 1);
+    int const x_150 = x_103.arr[x_147];
+    x_101 = x_150;
+    int const x_151 = x_102;
+    x_102 = (x_151 - 1);
+    int const x_154 = x_103.arr[x_151];
+    x_100 = x_154;
+    int const x_155 = x_100;
+    x_105 = x_155;
+    int const x_156 = x_101;
+    x_106 = x_156;
+    int const x_157 = x_106;
+    int const x_159 = (*(tint_symbol_8)).numbers.arr[x_157];
+    x_92 = x_159;
+    int const x_160 = x_105;
+    x_93 = (x_160 - 1);
+    int const x_162 = x_105;
+    x_94 = x_162;
+    while (true) {
+      int const x_167 = x_94;
+      int const x_168 = x_106;
+      if ((x_167 <= (x_168 - 1))) {
+      } else {
+        break;
+      }
+      int const x_172 = x_94;
+      int const x_174 = (*(tint_symbol_8)).numbers.arr[x_172];
+      int const x_175 = x_92;
+      if ((x_174 <= x_175)) {
+        int const x_179 = x_93;
+        x_93 = (x_179 + 1);
+        int const x_181 = x_93;
+        x_95 = x_181;
+        int const x_182 = x_94;
+        x_96 = x_182;
+        int const x_183 = x_95;
+        int const x_185 = (*(tint_symbol_8)).numbers.arr[x_183];
+        x_91 = x_185;
+        int const x_186 = x_95;
+        int const x_187 = x_96;
+        int const x_189 = (*(tint_symbol_8)).numbers.arr[x_187];
+        (*(tint_symbol_8)).numbers.arr[x_186] = x_189;
+        int const x_191 = x_96;
+        int const x_192 = x_91;
+        (*(tint_symbol_8)).numbers.arr[x_191] = x_192;
+      }
+      {
+        int const x_194 = x_94;
+        x_94 = (x_194 + 1);
+      }
+    }
+    int const x_196 = x_93;
+    x_97 = (x_196 + 1);
+    int const x_198 = x_106;
+    x_98 = x_198;
+    int const x_199 = x_97;
+    int const x_201 = (*(tint_symbol_8)).numbers.arr[x_199];
+    x_90 = x_201;
+    int const x_202 = x_97;
+    int const x_203 = x_98;
+    int const x_205 = (*(tint_symbol_8)).numbers.arr[x_203];
+    (*(tint_symbol_8)).numbers.arr[x_202] = x_205;
+    int const x_207 = x_98;
+    int const x_208 = x_90;
+    (*(tint_symbol_8)).numbers.arr[x_207] = x_208;
+    int const x_210 = x_93;
+    x_99 = (x_210 + 1);
+    int const x_212 = x_99;
+    x_104 = x_212;
+    int const x_213 = x_104;
+    int const x_215 = x_100;
+    if (((x_213 - 1) > x_215)) {
+      int const x_219 = x_102;
+      int const x_220 = (x_219 + 1);
+      x_102 = x_220;
+      int const x_221 = x_100;
+      x_103.arr[x_220] = x_221;
+      int const x_223 = x_102;
+      int const x_224 = (x_223 + 1);
+      x_102 = x_224;
+      int const x_225 = x_104;
+      x_103.arr[x_224] = (x_225 - 1);
+    }
+    int const x_228 = x_104;
+    int const x_230 = x_101;
+    if (((x_228 + 1) < x_230)) {
+      int const x_234 = x_102;
+      int const x_235 = (x_234 + 1);
+      x_102 = x_235;
+      int const x_236 = x_104;
+      x_103.arr[x_235] = (x_236 + 1);
+      int const x_239 = x_102;
+      int const x_240 = (x_239 + 1);
+      x_102 = x_240;
+      int const x_241 = x_101;
+      x_103.arr[x_240] = x_241;
+    }
+  }
+  float4 const x_243 = *(tint_symbol_7);
+  float2 const x_246 = x_34.resolution;
+  uv = (float2(x_243.x, x_243.y) / x_246);
+  color = float3(1.0f, 2.0f, 3.0f);
+  int const x_249 = (*(tint_symbol_8)).numbers.arr[0];
+  float const x_252 = color.x;
+  color.x = (x_252 + float(x_249));
+  float const x_256 = uv.x;
+  if ((x_256 > 0.25f)) {
+    int const x_261 = (*(tint_symbol_8)).numbers.arr[1];
+    float const x_264 = color.x;
+    color.x = (x_264 + float(x_261));
+  }
+  float const x_268 = uv.x;
+  if ((x_268 > 0.5f)) {
+    int const x_273 = (*(tint_symbol_8)).numbers.arr[2];
+    float const x_276 = color.y;
+    color.y = (x_276 + float(x_273));
+  }
+  float const x_280 = uv.x;
+  if ((x_280 > 0.75f)) {
+    int const x_285 = (*(tint_symbol_8)).numbers.arr[3];
+    float const x_288 = color.z;
+    color.z = (x_288 + float(x_285));
+  }
+  int const x_292 = (*(tint_symbol_8)).numbers.arr[4];
+  float const x_295 = color.y;
+  color.y = (x_295 + float(x_292));
+  float const x_299 = uv.y;
+  if ((x_299 > 0.25f)) {
+    int const x_304 = (*(tint_symbol_8)).numbers.arr[5];
+    float const x_307 = color.x;
+    color.x = (x_307 + float(x_304));
+  }
+  float const x_311 = uv.y;
+  if ((x_311 > 0.5f)) {
+    int const x_316 = (*(tint_symbol_8)).numbers.arr[6];
+    float const x_319 = color.y;
+    color.y = (x_319 + float(x_316));
+  }
+  float const x_323 = uv.y;
+  if ((x_323 > 0.75f)) {
+    int const x_328 = (*(tint_symbol_8)).numbers.arr[7];
+    float const x_331 = color.z;
+    color.z = (x_331 + float(x_328));
+  }
+  int const x_335 = (*(tint_symbol_8)).numbers.arr[8];
+  float const x_338 = color.z;
+  color.z = (x_338 + float(x_335));
+  float const x_342 = uv.x;
+  float const x_344 = uv.y;
+  if ((fabs((x_342 - x_344)) < 0.25f)) {
+    int const x_351 = (*(tint_symbol_8)).numbers.arr[9];
+    float const x_354 = color.x;
+    color.x = (x_354 + float(x_351));
+  }
+  float3 const x_357 = color;
+  float3 const x_358 = normalize(x_357);
+  *(tint_symbol_9) = float4(x_358.x, x_358.y, x_358.z, 1.0f);
+  float4 const x_363 = *(tint_symbol_6);
+  *(tint_symbol_10) = x_363;
+  return;
+}
+
+vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]], constant buf0& x_34 [[buffer(0)]]) {
+  thread float4 tint_symbol_11 = 0.0f;
+  thread float4 tint_symbol_12 = 0.0f;
+  thread QuicksortObject tint_symbol_13 = {};
+  thread float4 tint_symbol_14 = 0.0f;
+  thread float4 tint_symbol_15 = 0.0f;
+  float4 const x_GLF_pos_param = tint_symbol_1.x_GLF_pos_param;
+  tint_symbol_11 = x_GLF_pos_param;
+  main_1(x_34, &(tint_symbol_11), &(tint_symbol_12), &(tint_symbol_13), &(tint_symbol_14), &(tint_symbol_15));
+  main_out const tint_symbol_4 = {.frag_color_1=tint_symbol_14, .gl_Position=tint_symbol_15};
+  tint_symbol_3 const tint_symbol_5 = {.frag_color_1=tint_symbol_4.frag_color_1, .gl_Position=tint_symbol_4.gl_Position};
+  return tint_symbol_5;
+}
+
+void swap_i1_i1_(thread int* const i, thread int* const j, thread QuicksortObject* const tint_symbol_16) {
+  int temp = 0;
+  int const x_366 = *(i);
+  int const x_368 = (*(tint_symbol_16)).numbers.arr[x_366];
+  temp = x_368;
+  int const x_369 = *(i);
+  int const x_370 = *(j);
+  int const x_372 = (*(tint_symbol_16)).numbers.arr[x_370];
+  (*(tint_symbol_16)).numbers.arr[x_369] = x_372;
+  int const x_374 = *(j);
+  int const x_375 = temp;
+  (*(tint_symbol_16)).numbers.arr[x_374] = x_375;
+  return;
+}
+
+int performPartition_i1_i1_(thread int* const l, thread int* const h, thread QuicksortObject* const tint_symbol_17) {
+  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;
+  int const x_378 = *(h);
+  int const x_380 = (*(tint_symbol_17)).numbers.arr[x_378];
+  pivot = x_380;
+  int const x_381 = *(l);
+  i_1 = (x_381 - 1);
+  int const x_383 = *(l);
+  j_1 = x_383;
+  while (true) {
+    int const x_388 = j_1;
+    int const x_389 = *(h);
+    if ((x_388 <= (x_389 - 1))) {
+    } else {
+      break;
+    }
+    int const x_393 = j_1;
+    int const x_395 = (*(tint_symbol_17)).numbers.arr[x_393];
+    int const x_396 = pivot;
+    if ((x_395 <= x_396)) {
+      int const x_400 = i_1;
+      i_1 = (x_400 + 1);
+      int const x_402 = i_1;
+      param = x_402;
+      int const x_403 = j_1;
+      param_1 = x_403;
+      swap_i1_i1_(&(param), &(param_1), tint_symbol_17);
+    }
+    {
+      int const x_405 = j_1;
+      j_1 = (x_405 + 1);
+    }
+  }
+  int const x_407 = i_1;
+  param_2 = (x_407 + 1);
+  int const x_409 = *(h);
+  param_3 = x_409;
+  swap_i1_i1_(&(param_2), &(param_3), tint_symbol_17);
+  int const x_411 = i_1;
+  return (x_411 + 1);
+}
+
+void quicksort_(thread QuicksortObject* const tint_symbol_18) {
+  int l_1 = 0;
+  int h_1 = 0;
+  int top = 0;
+  tint_array_wrapper stack = {};
+  int p = 0;
+  int param_4 = 0;
+  int param_5 = 0;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  int const x_414 = top;
+  int const x_415 = (x_414 + 1);
+  top = x_415;
+  int const x_416 = l_1;
+  stack.arr[x_415] = x_416;
+  int const x_418 = top;
+  int const x_419 = (x_418 + 1);
+  top = x_419;
+  int const x_420 = h_1;
+  stack.arr[x_419] = x_420;
+  while (true) {
+    int const x_426 = top;
+    if ((x_426 >= 0)) {
+    } else {
+      break;
+    }
+    int const x_429 = top;
+    top = (x_429 - 1);
+    int const x_432 = stack.arr[x_429];
+    h_1 = x_432;
+    int const x_433 = top;
+    top = (x_433 - 1);
+    int const x_436 = stack.arr[x_433];
+    l_1 = x_436;
+    int const x_437 = l_1;
+    param_4 = x_437;
+    int const x_438 = h_1;
+    param_5 = x_438;
+    int const x_439 = performPartition_i1_i1_(&(param_4), &(param_5), tint_symbol_18);
+    p = x_439;
+    int const x_440 = p;
+    int const x_442 = l_1;
+    if (((x_440 - 1) > x_442)) {
+      int const x_446 = top;
+      int const x_447 = (x_446 + 1);
+      top = x_447;
+      int const x_448 = l_1;
+      stack.arr[x_447] = x_448;
+      int const x_450 = top;
+      int const x_451 = (x_450 + 1);
+      top = x_451;
+      int const x_452 = p;
+      stack.arr[x_451] = (x_452 - 1);
+    }
+    int const x_455 = p;
+    int const x_457 = h_1;
+    if (((x_455 + 1) < x_457)) {
+      int const x_461 = top;
+      int const x_462 = (x_461 + 1);
+      top = x_462;
+      int const x_463 = p;
+      stack.arr[x_462] = (x_463 + 1);
+      int const x_466 = top;
+      int const x_467 = (x_466 + 1);
+      top = x_467;
+      int const x_468 = h_1;
+      stack.arr[x_467] = x_468;
+    }
+  }
+  return;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..6f5c5f8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/0.spvasm.expected.spvasm
@@ -0,0 +1,780 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 521
+; Schema: 0
+               OpCapability Shader
+        %339 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %tint_pointsize %tint_symbol %tint_symbol_2 %tint_symbol_3
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %QuicksortObject "QuicksortObject"
+               OpMemberName %QuicksortObject 0 "numbers"
+               OpName %obj "obj"
+               OpName %x_GLF_FragCoord "x_GLF_FragCoord"
+               OpName %x_GLF_pos "x_GLF_pos"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_34 "x_34"
+               OpName %frag_color "frag_color"
+               OpName %gl_Position "gl_Position"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %main_1 "main_1"
+               OpName %x_90 "x_90"
+               OpName %x_91 "x_91"
+               OpName %x_92 "x_92"
+               OpName %x_93 "x_93"
+               OpName %x_94 "x_94"
+               OpName %x_95 "x_95"
+               OpName %x_96 "x_96"
+               OpName %x_97 "x_97"
+               OpName %x_98 "x_98"
+               OpName %x_99 "x_99"
+               OpName %x_100 "x_100"
+               OpName %x_101 "x_101"
+               OpName %x_102 "x_102"
+               OpName %x_103 "x_103"
+               OpName %x_104 "x_104"
+               OpName %x_105 "x_105"
+               OpName %x_106 "x_106"
+               OpName %i_2 "i_2"
+               OpName %uv "uv"
+               OpName %color "color"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "frag_color_1"
+               OpMemberName %main_out 1 "gl_Position"
+               OpName %tint_symbol_4 "tint_symbol_4"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpName %swap_i1_i1_ "swap_i1_i1_"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %temp "temp"
+               OpName %performPartition_i1_i1_ "performPartition_i1_i1_"
+               OpName %l "l"
+               OpName %h "h"
+               OpName %pivot "pivot"
+               OpName %i_1 "i_1"
+               OpName %j_1 "j_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %quicksort_ "quicksort_"
+               OpName %l_1 "l_1"
+               OpName %h_1 "h_1"
+               OpName %top "top"
+               OpName %stack "stack"
+               OpName %p "p"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpMemberDecorate %QuicksortObject 0 Offset 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_34 NonWritable
+               OpDecorate %x_34 DescriptorSet 0
+               OpDecorate %x_34 Binding 0
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %tint_symbol_3 BuiltIn Position
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%QuicksortObject = OpTypeStruct %_arr_int_uint_10
+%_ptr_Private_QuicksortObject = OpTypePointer Private %QuicksortObject
+         %12 = OpConstantNull %QuicksortObject
+        %obj = OpVariable %_ptr_Private_QuicksortObject Private %12
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_FragCoord = OpVariable %_ptr_Private_v4float Private %16
+  %x_GLF_pos = OpVariable %_ptr_Private_v4float Private %16
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_34 = OpVariable %_ptr_Uniform_buf0 Uniform
+ %frag_color = OpVariable %_ptr_Private_v4float Private %16
+%gl_Position = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %16
+%tint_symbol_3 = OpVariable %_ptr_Output_v4float Output %16
+       %void = OpTypeVoid
+         %29 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %35 = OpConstantNull %int
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+         %50 = OpConstantNull %_arr_int_uint_10
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %57 = OpConstantNull %v2float
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %61 = OpConstantNull %v3float
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %65 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_0
+  %float_128 = OpConstant %float 128
+         %68 = OpConstantComposite %v4float %float_128 %float_128 %float_1 %float_1
+      %int_0 = OpConstant %int 0
+     %int_10 = OpConstant %int 10
+       %bool = OpTypeBool
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_int = OpTypePointer Private %int
+      %int_1 = OpConstant %int 1
+      %int_9 = OpConstant %int 9
+     %int_n1 = OpConstant %int -1
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+        %227 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+%_ptr_Function_float = OpTypePointer Function %float
+ %float_0_25 = OpConstant %float 0.25
+  %float_0_5 = OpConstant %float 0.5
+      %int_2 = OpConstant %int 2
+     %uint_1 = OpConstant %uint 1
+ %float_0_75 = OpConstant %float 0.75
+      %int_3 = OpConstant %int 3
+     %uint_2 = OpConstant %uint 2
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+   %main_out = OpTypeStruct %v4float %v4float
+        %358 = OpTypeFunction %void %main_out
+        %373 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+        %394 = OpTypeFunction %int %_ptr_Function_int %_ptr_Function_int
+     %main_1 = OpFunction %void None %29
+         %32 = OpLabel
+       %x_90 = OpVariable %_ptr_Function_int Function %35
+       %x_91 = OpVariable %_ptr_Function_int Function %35
+       %x_92 = OpVariable %_ptr_Function_int Function %35
+       %x_93 = OpVariable %_ptr_Function_int Function %35
+       %x_94 = OpVariable %_ptr_Function_int Function %35
+       %x_95 = OpVariable %_ptr_Function_int Function %35
+       %x_96 = OpVariable %_ptr_Function_int Function %35
+       %x_97 = OpVariable %_ptr_Function_int Function %35
+       %x_98 = OpVariable %_ptr_Function_int Function %35
+       %x_99 = OpVariable %_ptr_Function_int Function %35
+      %x_100 = OpVariable %_ptr_Function_int Function %35
+      %x_101 = OpVariable %_ptr_Function_int Function %35
+      %x_102 = OpVariable %_ptr_Function_int Function %35
+      %x_103 = OpVariable %_ptr_Function__arr_int_uint_10 Function %50
+      %x_104 = OpVariable %_ptr_Function_int Function %35
+      %x_105 = OpVariable %_ptr_Function_int Function %35
+      %x_106 = OpVariable %_ptr_Function_int Function %35
+        %i_2 = OpVariable %_ptr_Function_int Function %35
+         %uv = OpVariable %_ptr_Function_v2float Function %57
+      %color = OpVariable %_ptr_Function_v3float Function %61
+         %62 = OpLoad %v4float %x_GLF_pos
+         %66 = OpFAdd %v4float %62 %65
+         %69 = OpFMul %v4float %66 %68
+               OpStore %x_GLF_FragCoord %69
+               OpStore %i_2 %int_0
+               OpBranch %71
+         %71 = OpLabel
+               OpLoopMerge %72 %73 None
+               OpBranch %74
+         %74 = OpLabel
+         %75 = OpLoad %int %i_2
+         %77 = OpSLessThan %bool %75 %int_10
+               OpSelectionMerge %79 None
+               OpBranchConditional %77 %80 %81
+         %80 = OpLabel
+               OpBranch %79
+         %81 = OpLabel
+               OpBranch %72
+         %79 = OpLabel
+         %82 = OpLoad %int %i_2
+         %83 = OpLoad %int %i_2
+         %86 = OpAccessChain %_ptr_Private_int %obj %uint_0 %82
+         %87 = OpISub %int %int_10 %83
+               OpStore %86 %87
+         %88 = OpLoad %int %i_2
+         %89 = OpLoad %int %i_2
+         %90 = OpAccessChain %_ptr_Private_int %obj %uint_0 %89
+         %91 = OpLoad %int %90
+         %92 = OpLoad %int %i_2
+         %93 = OpAccessChain %_ptr_Private_int %obj %uint_0 %92
+         %94 = OpLoad %int %93
+         %95 = OpAccessChain %_ptr_Private_int %obj %uint_0 %88
+         %96 = OpIMul %int %91 %94
+               OpStore %95 %96
+               OpBranch %73
+         %73 = OpLabel
+         %97 = OpLoad %int %i_2
+         %99 = OpIAdd %int %97 %int_1
+               OpStore %i_2 %99
+               OpBranch %71
+         %72 = OpLabel
+               OpStore %x_100 %int_0
+               OpStore %x_101 %int_9
+               OpStore %x_102 %int_n1
+        %102 = OpLoad %int %x_102
+        %103 = OpIAdd %int %102 %int_1
+               OpStore %x_102 %103
+        %104 = OpLoad %int %x_100
+        %105 = OpAccessChain %_ptr_Function_int %x_103 %103
+               OpStore %105 %104
+        %106 = OpLoad %int %x_102
+        %107 = OpIAdd %int %106 %int_1
+               OpStore %x_102 %107
+        %108 = OpLoad %int %x_101
+        %109 = OpAccessChain %_ptr_Function_int %x_103 %107
+               OpStore %109 %108
+               OpBranch %110
+        %110 = OpLabel
+               OpLoopMerge %111 %112 None
+               OpBranch %113
+        %113 = OpLabel
+        %114 = OpLoad %int %x_102
+        %115 = OpSGreaterThanEqual %bool %114 %int_0
+               OpSelectionMerge %116 None
+               OpBranchConditional %115 %117 %118
+        %117 = OpLabel
+               OpBranch %116
+        %118 = OpLabel
+               OpBranch %111
+        %116 = OpLabel
+        %119 = OpLoad %int %x_102
+        %120 = OpISub %int %119 %int_1
+               OpStore %x_102 %120
+        %121 = OpAccessChain %_ptr_Function_int %x_103 %119
+        %122 = OpLoad %int %121
+               OpStore %x_101 %122
+        %123 = OpLoad %int %x_102
+        %124 = OpISub %int %123 %int_1
+               OpStore %x_102 %124
+        %125 = OpAccessChain %_ptr_Function_int %x_103 %123
+        %126 = OpLoad %int %125
+               OpStore %x_100 %126
+        %127 = OpLoad %int %x_100
+               OpStore %x_105 %127
+        %128 = OpLoad %int %x_101
+               OpStore %x_106 %128
+        %129 = OpLoad %int %x_106
+        %130 = OpAccessChain %_ptr_Private_int %obj %uint_0 %129
+        %131 = OpLoad %int %130
+               OpStore %x_92 %131
+        %132 = OpLoad %int %x_105
+        %133 = OpISub %int %132 %int_1
+               OpStore %x_93 %133
+        %134 = OpLoad %int %x_105
+               OpStore %x_94 %134
+               OpBranch %135
+        %135 = OpLabel
+               OpLoopMerge %136 %137 None
+               OpBranch %138
+        %138 = OpLabel
+        %139 = OpLoad %int %x_94
+        %140 = OpLoad %int %x_106
+        %141 = OpISub %int %140 %int_1
+        %142 = OpSLessThanEqual %bool %139 %141
+               OpSelectionMerge %143 None
+               OpBranchConditional %142 %144 %145
+        %144 = OpLabel
+               OpBranch %143
+        %145 = OpLabel
+               OpBranch %136
+        %143 = OpLabel
+        %146 = OpLoad %int %x_94
+        %147 = OpAccessChain %_ptr_Private_int %obj %uint_0 %146
+        %148 = OpLoad %int %147
+        %149 = OpLoad %int %x_92
+        %150 = OpSLessThanEqual %bool %148 %149
+               OpSelectionMerge %151 None
+               OpBranchConditional %150 %152 %151
+        %152 = OpLabel
+        %153 = OpLoad %int %x_93
+        %154 = OpIAdd %int %153 %int_1
+               OpStore %x_93 %154
+        %155 = OpLoad %int %x_93
+               OpStore %x_95 %155
+        %156 = OpLoad %int %x_94
+               OpStore %x_96 %156
+        %157 = OpLoad %int %x_95
+        %158 = OpAccessChain %_ptr_Private_int %obj %uint_0 %157
+        %159 = OpLoad %int %158
+               OpStore %x_91 %159
+        %160 = OpLoad %int %x_95
+        %161 = OpLoad %int %x_96
+        %162 = OpAccessChain %_ptr_Private_int %obj %uint_0 %161
+        %163 = OpLoad %int %162
+        %164 = OpAccessChain %_ptr_Private_int %obj %uint_0 %160
+               OpStore %164 %163
+        %165 = OpLoad %int %x_96
+        %166 = OpLoad %int %x_91
+        %167 = OpAccessChain %_ptr_Private_int %obj %uint_0 %165
+               OpStore %167 %166
+               OpBranch %151
+        %151 = OpLabel
+               OpBranch %137
+        %137 = OpLabel
+        %168 = OpLoad %int %x_94
+        %169 = OpIAdd %int %168 %int_1
+               OpStore %x_94 %169
+               OpBranch %135
+        %136 = OpLabel
+        %170 = OpLoad %int %x_93
+        %171 = OpIAdd %int %170 %int_1
+               OpStore %x_97 %171
+        %172 = OpLoad %int %x_106
+               OpStore %x_98 %172
+        %173 = OpLoad %int %x_97
+        %174 = OpAccessChain %_ptr_Private_int %obj %uint_0 %173
+        %175 = OpLoad %int %174
+               OpStore %x_90 %175
+        %176 = OpLoad %int %x_97
+        %177 = OpLoad %int %x_98
+        %178 = OpAccessChain %_ptr_Private_int %obj %uint_0 %177
+        %179 = OpLoad %int %178
+        %180 = OpAccessChain %_ptr_Private_int %obj %uint_0 %176
+               OpStore %180 %179
+        %181 = OpLoad %int %x_98
+        %182 = OpLoad %int %x_90
+        %183 = OpAccessChain %_ptr_Private_int %obj %uint_0 %181
+               OpStore %183 %182
+        %184 = OpLoad %int %x_93
+        %185 = OpIAdd %int %184 %int_1
+               OpStore %x_99 %185
+        %186 = OpLoad %int %x_99
+               OpStore %x_104 %186
+        %187 = OpLoad %int %x_104
+        %188 = OpLoad %int %x_100
+        %189 = OpISub %int %187 %int_1
+        %190 = OpSGreaterThan %bool %189 %188
+               OpSelectionMerge %191 None
+               OpBranchConditional %190 %192 %191
+        %192 = OpLabel
+        %193 = OpLoad %int %x_102
+        %194 = OpIAdd %int %193 %int_1
+               OpStore %x_102 %194
+        %195 = OpLoad %int %x_100
+        %196 = OpAccessChain %_ptr_Function_int %x_103 %194
+               OpStore %196 %195
+        %197 = OpLoad %int %x_102
+        %198 = OpIAdd %int %197 %int_1
+               OpStore %x_102 %198
+        %199 = OpLoad %int %x_104
+        %200 = OpAccessChain %_ptr_Function_int %x_103 %198
+        %201 = OpISub %int %199 %int_1
+               OpStore %200 %201
+               OpBranch %191
+        %191 = OpLabel
+        %202 = OpLoad %int %x_104
+        %203 = OpLoad %int %x_101
+        %204 = OpIAdd %int %202 %int_1
+        %205 = OpSLessThan %bool %204 %203
+               OpSelectionMerge %206 None
+               OpBranchConditional %205 %207 %206
+        %207 = OpLabel
+        %208 = OpLoad %int %x_102
+        %209 = OpIAdd %int %208 %int_1
+               OpStore %x_102 %209
+        %210 = OpLoad %int %x_104
+        %211 = OpAccessChain %_ptr_Function_int %x_103 %209
+        %212 = OpIAdd %int %210 %int_1
+               OpStore %211 %212
+        %213 = OpLoad %int %x_102
+        %214 = OpIAdd %int %213 %int_1
+               OpStore %x_102 %214
+        %215 = OpLoad %int %x_101
+        %216 = OpAccessChain %_ptr_Function_int %x_103 %214
+               OpStore %216 %215
+               OpBranch %206
+        %206 = OpLabel
+               OpBranch %112
+        %112 = OpLabel
+               OpBranch %110
+        %111 = OpLabel
+        %217 = OpLoad %v4float %x_GLF_FragCoord
+        %219 = OpAccessChain %_ptr_Uniform_v2float %x_34 %uint_0
+        %220 = OpLoad %v2float %219
+        %221 = OpCompositeExtract %float %217 0
+        %222 = OpCompositeExtract %float %217 1
+        %223 = OpCompositeConstruct %v2float %221 %222
+        %224 = OpFDiv %v2float %223 %220
+               OpStore %uv %224
+               OpStore %color %227
+        %228 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_0
+        %229 = OpLoad %int %228
+        %231 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %232 = OpLoad %float %231
+        %233 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %234 = OpConvertSToF %float %229
+        %235 = OpFAdd %float %232 %234
+               OpStore %233 %235
+        %236 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %237 = OpLoad %float %236
+        %239 = OpFOrdGreaterThan %bool %237 %float_0_25
+               OpSelectionMerge %240 None
+               OpBranchConditional %239 %241 %240
+        %241 = OpLabel
+        %242 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_1
+        %243 = OpLoad %int %242
+        %244 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %245 = OpLoad %float %244
+        %246 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %247 = OpConvertSToF %float %243
+        %248 = OpFAdd %float %245 %247
+               OpStore %246 %248
+               OpBranch %240
+        %240 = OpLabel
+        %249 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %250 = OpLoad %float %249
+        %252 = OpFOrdGreaterThan %bool %250 %float_0_5
+               OpSelectionMerge %253 None
+               OpBranchConditional %252 %254 %253
+        %254 = OpLabel
+        %256 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_2
+        %257 = OpLoad %int %256
+        %259 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %260 = OpLoad %float %259
+        %261 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %262 = OpConvertSToF %float %257
+        %263 = OpFAdd %float %260 %262
+               OpStore %261 %263
+               OpBranch %253
+        %253 = OpLabel
+        %264 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %265 = OpLoad %float %264
+        %267 = OpFOrdGreaterThan %bool %265 %float_0_75
+               OpSelectionMerge %268 None
+               OpBranchConditional %267 %269 %268
+        %269 = OpLabel
+        %271 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_3
+        %272 = OpLoad %int %271
+        %274 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %275 = OpLoad %float %274
+        %276 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %277 = OpConvertSToF %float %272
+        %278 = OpFAdd %float %275 %277
+               OpStore %276 %278
+               OpBranch %268
+        %268 = OpLabel
+        %280 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_4
+        %281 = OpLoad %int %280
+        %282 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %283 = OpLoad %float %282
+        %284 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %285 = OpConvertSToF %float %281
+        %286 = OpFAdd %float %283 %285
+               OpStore %284 %286
+        %287 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %288 = OpLoad %float %287
+        %289 = OpFOrdGreaterThan %bool %288 %float_0_25
+               OpSelectionMerge %290 None
+               OpBranchConditional %289 %291 %290
+        %291 = OpLabel
+        %293 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_5
+        %294 = OpLoad %int %293
+        %295 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %296 = OpLoad %float %295
+        %297 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %298 = OpConvertSToF %float %294
+        %299 = OpFAdd %float %296 %298
+               OpStore %297 %299
+               OpBranch %290
+        %290 = OpLabel
+        %300 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %301 = OpLoad %float %300
+        %302 = OpFOrdGreaterThan %bool %301 %float_0_5
+               OpSelectionMerge %303 None
+               OpBranchConditional %302 %304 %303
+        %304 = OpLabel
+        %306 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_6
+        %307 = OpLoad %int %306
+        %308 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %309 = OpLoad %float %308
+        %310 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %311 = OpConvertSToF %float %307
+        %312 = OpFAdd %float %309 %311
+               OpStore %310 %312
+               OpBranch %303
+        %303 = OpLabel
+        %313 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %314 = OpLoad %float %313
+        %315 = OpFOrdGreaterThan %bool %314 %float_0_75
+               OpSelectionMerge %316 None
+               OpBranchConditional %315 %317 %316
+        %317 = OpLabel
+        %319 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_7
+        %320 = OpLoad %int %319
+        %321 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %322 = OpLoad %float %321
+        %323 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %324 = OpConvertSToF %float %320
+        %325 = OpFAdd %float %322 %324
+               OpStore %323 %325
+               OpBranch %316
+        %316 = OpLabel
+        %327 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_8
+        %328 = OpLoad %int %327
+        %329 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %330 = OpLoad %float %329
+        %331 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %332 = OpConvertSToF %float %328
+        %333 = OpFAdd %float %330 %332
+               OpStore %331 %333
+        %334 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %335 = OpLoad %float %334
+        %336 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %337 = OpLoad %float %336
+        %340 = OpFSub %float %335 %337
+        %338 = OpExtInst %float %339 FAbs %340
+        %341 = OpFOrdLessThan %bool %338 %float_0_25
+               OpSelectionMerge %342 None
+               OpBranchConditional %341 %343 %342
+        %343 = OpLabel
+        %344 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_9
+        %345 = OpLoad %int %344
+        %346 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %347 = OpLoad %float %346
+        %348 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %349 = OpConvertSToF %float %345
+        %350 = OpFAdd %float %347 %349
+               OpStore %348 %350
+               OpBranch %342
+        %342 = OpLabel
+        %351 = OpLoad %v3float %color
+        %352 = OpExtInst %v3float %339 Normalize %351
+        %353 = OpCompositeExtract %float %352 0
+        %354 = OpCompositeExtract %float %352 1
+        %355 = OpCompositeExtract %float %352 2
+        %356 = OpCompositeConstruct %v4float %353 %354 %355 %float_1
+               OpStore %frag_color %356
+        %357 = OpLoad %v4float %x_GLF_pos
+               OpStore %gl_Position %357
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_4 = OpFunction %void None %358
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %362 = OpLabel
+        %363 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %363
+        %364 = OpCompositeExtract %v4float %tint_symbol_1 1
+               OpStore %tint_symbol_3 %364
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %29
+        %366 = OpLabel
+               OpStore %tint_pointsize %float_1
+        %367 = OpLoad %v4float %tint_symbol
+               OpStore %x_GLF_pos %367
+        %368 = OpFunctionCall %void %main_1
+        %370 = OpLoad %v4float %frag_color
+        %371 = OpLoad %v4float %gl_Position
+        %372 = OpCompositeConstruct %main_out %370 %371
+        %369 = OpFunctionCall %void %tint_symbol_4 %372
+               OpReturn
+               OpFunctionEnd
+%swap_i1_i1_ = OpFunction %void None %373
+          %i = OpFunctionParameter %_ptr_Function_int
+          %j = OpFunctionParameter %_ptr_Function_int
+        %377 = OpLabel
+       %temp = OpVariable %_ptr_Function_int Function %35
+        %380 = OpLoad %int %i
+        %381 = OpAccessChain %_ptr_Private_int %obj %uint_0 %380
+        %382 = OpLoad %int %381
+               OpStore %temp %382
+        %384 = OpLoad %int %i
+        %386 = OpLoad %int %j
+        %387 = OpAccessChain %_ptr_Private_int %obj %uint_0 %386
+        %388 = OpLoad %int %387
+        %389 = OpAccessChain %_ptr_Private_int %obj %uint_0 %384
+               OpStore %389 %388
+        %391 = OpLoad %int %j
+        %392 = OpLoad %int %temp
+        %393 = OpAccessChain %_ptr_Private_int %obj %uint_0 %391
+               OpStore %393 %392
+               OpReturn
+               OpFunctionEnd
+%performPartition_i1_i1_ = OpFunction %int None %394
+          %l = OpFunctionParameter %_ptr_Function_int
+          %h = OpFunctionParameter %_ptr_Function_int
+        %398 = OpLabel
+      %pivot = OpVariable %_ptr_Function_int Function %35
+        %i_1 = OpVariable %_ptr_Function_int Function %35
+        %j_1 = OpVariable %_ptr_Function_int Function %35
+      %param = OpVariable %_ptr_Function_int Function %35
+    %param_1 = OpVariable %_ptr_Function_int Function %35
+    %param_2 = OpVariable %_ptr_Function_int Function %35
+    %param_3 = OpVariable %_ptr_Function_int Function %35
+        %407 = OpLoad %int %h
+        %408 = OpAccessChain %_ptr_Private_int %obj %uint_0 %407
+        %409 = OpLoad %int %408
+               OpStore %pivot %409
+        %411 = OpLoad %int %l
+        %412 = OpISub %int %411 %int_1
+               OpStore %i_1 %412
+        %414 = OpLoad %int %l
+               OpStore %j_1 %414
+               OpBranch %415
+        %415 = OpLabel
+               OpLoopMerge %416 %417 None
+               OpBranch %418
+        %418 = OpLabel
+        %419 = OpLoad %int %j_1
+        %421 = OpLoad %int %h
+        %422 = OpISub %int %421 %int_1
+        %423 = OpSLessThanEqual %bool %419 %422
+               OpSelectionMerge %424 None
+               OpBranchConditional %423 %425 %426
+        %425 = OpLabel
+               OpBranch %424
+        %426 = OpLabel
+               OpBranch %416
+        %424 = OpLabel
+        %427 = OpLoad %int %j_1
+        %428 = OpAccessChain %_ptr_Private_int %obj %uint_0 %427
+        %429 = OpLoad %int %428
+        %430 = OpLoad %int %pivot
+        %431 = OpSLessThanEqual %bool %429 %430
+               OpSelectionMerge %432 None
+               OpBranchConditional %431 %433 %432
+        %433 = OpLabel
+        %434 = OpLoad %int %i_1
+        %435 = OpIAdd %int %434 %int_1
+               OpStore %i_1 %435
+        %436 = OpLoad %int %i_1
+               OpStore %param %436
+        %437 = OpLoad %int %j_1
+               OpStore %param_1 %437
+        %438 = OpFunctionCall %void %swap_i1_i1_ %param %param_1
+               OpBranch %432
+        %432 = OpLabel
+               OpBranch %417
+        %417 = OpLabel
+        %441 = OpLoad %int %j_1
+        %442 = OpIAdd %int %441 %int_1
+               OpStore %j_1 %442
+               OpBranch %415
+        %416 = OpLabel
+        %443 = OpLoad %int %i_1
+        %444 = OpIAdd %int %443 %int_1
+               OpStore %param_2 %444
+        %446 = OpLoad %int %h
+               OpStore %param_3 %446
+        %447 = OpFunctionCall %void %swap_i1_i1_ %param_2 %param_3
+        %450 = OpLoad %int %i_1
+        %451 = OpIAdd %int %450 %int_1
+               OpReturnValue %451
+               OpFunctionEnd
+ %quicksort_ = OpFunction %void None %29
+        %453 = OpLabel
+        %l_1 = OpVariable %_ptr_Function_int Function %35
+        %h_1 = OpVariable %_ptr_Function_int Function %35
+        %top = OpVariable %_ptr_Function_int Function %35
+      %stack = OpVariable %_ptr_Function__arr_int_uint_10 Function %50
+          %p = OpVariable %_ptr_Function_int Function %35
+    %param_4 = OpVariable %_ptr_Function_int Function %35
+    %param_5 = OpVariable %_ptr_Function_int Function %35
+               OpStore %l_1 %int_0
+               OpStore %h_1 %int_9
+               OpStore %top %int_n1
+        %461 = OpLoad %int %top
+        %462 = OpIAdd %int %461 %int_1
+               OpStore %top %462
+        %463 = OpLoad %int %l_1
+        %464 = OpAccessChain %_ptr_Function_int %stack %462
+               OpStore %464 %463
+        %465 = OpLoad %int %top
+        %466 = OpIAdd %int %465 %int_1
+               OpStore %top %466
+        %467 = OpLoad %int %h_1
+        %468 = OpAccessChain %_ptr_Function_int %stack %466
+               OpStore %468 %467
+               OpBranch %469
+        %469 = OpLabel
+               OpLoopMerge %470 %471 None
+               OpBranch %472
+        %472 = OpLabel
+        %473 = OpLoad %int %top
+        %474 = OpSGreaterThanEqual %bool %473 %int_0
+               OpSelectionMerge %475 None
+               OpBranchConditional %474 %476 %477
+        %476 = OpLabel
+               OpBranch %475
+        %477 = OpLabel
+               OpBranch %470
+        %475 = OpLabel
+        %478 = OpLoad %int %top
+        %479 = OpISub %int %478 %int_1
+               OpStore %top %479
+        %480 = OpAccessChain %_ptr_Function_int %stack %478
+        %481 = OpLoad %int %480
+               OpStore %h_1 %481
+        %482 = OpLoad %int %top
+        %483 = OpISub %int %482 %int_1
+               OpStore %top %483
+        %484 = OpAccessChain %_ptr_Function_int %stack %482
+        %485 = OpLoad %int %484
+               OpStore %l_1 %485
+        %486 = OpLoad %int %l_1
+               OpStore %param_4 %486
+        %487 = OpLoad %int %h_1
+               OpStore %param_5 %487
+        %488 = OpFunctionCall %int %performPartition_i1_i1_ %param_4 %param_5
+               OpStore %p %488
+        %491 = OpLoad %int %p
+        %492 = OpLoad %int %l_1
+        %493 = OpISub %int %491 %int_1
+        %494 = OpSGreaterThan %bool %493 %492
+               OpSelectionMerge %495 None
+               OpBranchConditional %494 %496 %495
+        %496 = OpLabel
+        %497 = OpLoad %int %top
+        %498 = OpIAdd %int %497 %int_1
+               OpStore %top %498
+        %499 = OpLoad %int %l_1
+        %500 = OpAccessChain %_ptr_Function_int %stack %498
+               OpStore %500 %499
+        %501 = OpLoad %int %top
+        %502 = OpIAdd %int %501 %int_1
+               OpStore %top %502
+        %503 = OpLoad %int %p
+        %504 = OpAccessChain %_ptr_Function_int %stack %502
+        %505 = OpISub %int %503 %int_1
+               OpStore %504 %505
+               OpBranch %495
+        %495 = OpLabel
+        %506 = OpLoad %int %p
+        %507 = OpLoad %int %h_1
+        %508 = OpIAdd %int %506 %int_1
+        %509 = OpSLessThan %bool %508 %507
+               OpSelectionMerge %510 None
+               OpBranchConditional %509 %511 %510
+        %511 = OpLabel
+        %512 = OpLoad %int %top
+        %513 = OpIAdd %int %512 %int_1
+               OpStore %top %513
+        %514 = OpLoad %int %p
+        %515 = OpAccessChain %_ptr_Function_int %stack %513
+        %516 = OpIAdd %int %514 %int_1
+               OpStore %515 %516
+        %517 = OpLoad %int %top
+        %518 = OpIAdd %int %517 %int_1
+               OpStore %top %518
+        %519 = OpLoad %int %h_1
+        %520 = OpAccessChain %_ptr_Function_int %stack %518
+               OpStore %520 %519
+               OpBranch %510
+        %510 = OpLabel
+               OpBranch %471
+        %471 = OpLabel
+               OpBranch %469
+        %470 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..dcc0835
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/0.spvasm.expected.wgsl
@@ -0,0 +1,399 @@
+struct QuicksortObject {
+  numbers : array<i32, 10>;
+};
+
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> obj : QuicksortObject;
+
+var<private> x_GLF_FragCoord : vec4<f32>;
+
+var<private> x_GLF_pos : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_34 : buf0;
+
+var<private> frag_color : vec4<f32>;
+
+var<private> gl_Position : vec4<f32>;
+
+fn main_1() {
+  var x_90 : i32;
+  var x_91 : i32;
+  var x_92 : i32;
+  var x_93 : i32;
+  var x_94 : i32;
+  var x_95 : i32;
+  var x_96 : i32;
+  var x_97 : i32;
+  var x_98 : i32;
+  var x_99 : i32;
+  var x_100 : i32;
+  var x_101 : i32;
+  var x_102 : i32;
+  var x_103 : array<i32, 10>;
+  var x_104 : i32;
+  var x_105 : i32;
+  var x_106 : i32;
+  var i_2 : i32;
+  var uv : vec2<f32>;
+  var color : vec3<f32>;
+  let x_107 : vec4<f32> = x_GLF_pos;
+  x_GLF_FragCoord = ((x_107 + vec4<f32>(1.0, 1.0, 0.0, 0.0)) * vec4<f32>(128.0, 128.0, 1.0, 1.0));
+  i_2 = 0;
+  loop {
+    let x_114 : i32 = i_2;
+    if ((x_114 < 10)) {
+    } else {
+      break;
+    }
+    let x_117 : i32 = i_2;
+    let x_118 : i32 = i_2;
+    obj.numbers[x_117] = (10 - x_118);
+    let x_121 : i32 = i_2;
+    let x_122 : i32 = i_2;
+    let x_124 : i32 = obj.numbers[x_122];
+    let x_125 : i32 = i_2;
+    let x_127 : i32 = obj.numbers[x_125];
+    obj.numbers[x_121] = (x_124 * x_127);
+
+    continuing {
+      let x_130 : i32 = i_2;
+      i_2 = (x_130 + 1);
+    }
+  }
+  x_100 = 0;
+  x_101 = 9;
+  x_102 = -1;
+  let x_132 : i32 = x_102;
+  let x_133 : i32 = (x_132 + 1);
+  x_102 = x_133;
+  let x_134 : i32 = x_100;
+  x_103[x_133] = x_134;
+  let x_136 : i32 = x_102;
+  let x_137 : i32 = (x_136 + 1);
+  x_102 = x_137;
+  let x_138 : i32 = x_101;
+  x_103[x_137] = x_138;
+  loop {
+    let x_144 : i32 = x_102;
+    if ((x_144 >= 0)) {
+    } else {
+      break;
+    }
+    let x_147 : i32 = x_102;
+    x_102 = (x_147 - 1);
+    let x_150 : i32 = x_103[x_147];
+    x_101 = x_150;
+    let x_151 : i32 = x_102;
+    x_102 = (x_151 - 1);
+    let x_154 : i32 = x_103[x_151];
+    x_100 = x_154;
+    let x_155 : i32 = x_100;
+    x_105 = x_155;
+    let x_156 : i32 = x_101;
+    x_106 = x_156;
+    let x_157 : i32 = x_106;
+    let x_159 : i32 = obj.numbers[x_157];
+    x_92 = x_159;
+    let x_160 : i32 = x_105;
+    x_93 = (x_160 - 1);
+    let x_162 : i32 = x_105;
+    x_94 = x_162;
+    loop {
+      let x_167 : i32 = x_94;
+      let x_168 : i32 = x_106;
+      if ((x_167 <= (x_168 - 1))) {
+      } else {
+        break;
+      }
+      let x_172 : i32 = x_94;
+      let x_174 : i32 = obj.numbers[x_172];
+      let x_175 : i32 = x_92;
+      if ((x_174 <= x_175)) {
+        let x_179 : i32 = x_93;
+        x_93 = (x_179 + 1);
+        let x_181 : i32 = x_93;
+        x_95 = x_181;
+        let x_182 : i32 = x_94;
+        x_96 = x_182;
+        let x_183 : i32 = x_95;
+        let x_185 : i32 = obj.numbers[x_183];
+        x_91 = x_185;
+        let x_186 : i32 = x_95;
+        let x_187 : i32 = x_96;
+        let x_189 : i32 = obj.numbers[x_187];
+        obj.numbers[x_186] = x_189;
+        let x_191 : i32 = x_96;
+        let x_192 : i32 = x_91;
+        obj.numbers[x_191] = x_192;
+      }
+
+      continuing {
+        let x_194 : i32 = x_94;
+        x_94 = (x_194 + 1);
+      }
+    }
+    let x_196 : i32 = x_93;
+    x_97 = (x_196 + 1);
+    let x_198 : i32 = x_106;
+    x_98 = x_198;
+    let x_199 : i32 = x_97;
+    let x_201 : i32 = obj.numbers[x_199];
+    x_90 = x_201;
+    let x_202 : i32 = x_97;
+    let x_203 : i32 = x_98;
+    let x_205 : i32 = obj.numbers[x_203];
+    obj.numbers[x_202] = x_205;
+    let x_207 : i32 = x_98;
+    let x_208 : i32 = x_90;
+    obj.numbers[x_207] = x_208;
+    let x_210 : i32 = x_93;
+    x_99 = (x_210 + 1);
+    let x_212 : i32 = x_99;
+    x_104 = x_212;
+    let x_213 : i32 = x_104;
+    let x_215 : i32 = x_100;
+    if (((x_213 - 1) > x_215)) {
+      let x_219 : i32 = x_102;
+      let x_220 : i32 = (x_219 + 1);
+      x_102 = x_220;
+      let x_221 : i32 = x_100;
+      x_103[x_220] = x_221;
+      let x_223 : i32 = x_102;
+      let x_224 : i32 = (x_223 + 1);
+      x_102 = x_224;
+      let x_225 : i32 = x_104;
+      x_103[x_224] = (x_225 - 1);
+    }
+    let x_228 : i32 = x_104;
+    let x_230 : i32 = x_101;
+    if (((x_228 + 1) < x_230)) {
+      let x_234 : i32 = x_102;
+      let x_235 : i32 = (x_234 + 1);
+      x_102 = x_235;
+      let x_236 : i32 = x_104;
+      x_103[x_235] = (x_236 + 1);
+      let x_239 : i32 = x_102;
+      let x_240 : i32 = (x_239 + 1);
+      x_102 = x_240;
+      let x_241 : i32 = x_101;
+      x_103[x_240] = x_241;
+    }
+  }
+  let x_243 : vec4<f32> = x_GLF_FragCoord;
+  let x_246 : vec2<f32> = x_34.resolution;
+  uv = (vec2<f32>(x_243.x, x_243.y) / x_246);
+  color = vec3<f32>(1.0, 2.0, 3.0);
+  let x_249 : i32 = obj.numbers[0];
+  let x_252 : f32 = color.x;
+  color.x = (x_252 + f32(x_249));
+  let x_256 : f32 = uv.x;
+  if ((x_256 > 0.25)) {
+    let x_261 : i32 = obj.numbers[1];
+    let x_264 : f32 = color.x;
+    color.x = (x_264 + f32(x_261));
+  }
+  let x_268 : f32 = uv.x;
+  if ((x_268 > 0.5)) {
+    let x_273 : i32 = obj.numbers[2];
+    let x_276 : f32 = color.y;
+    color.y = (x_276 + f32(x_273));
+  }
+  let x_280 : f32 = uv.x;
+  if ((x_280 > 0.75)) {
+    let x_285 : i32 = obj.numbers[3];
+    let x_288 : f32 = color.z;
+    color.z = (x_288 + f32(x_285));
+  }
+  let x_292 : i32 = obj.numbers[4];
+  let x_295 : f32 = color.y;
+  color.y = (x_295 + f32(x_292));
+  let x_299 : f32 = uv.y;
+  if ((x_299 > 0.25)) {
+    let x_304 : i32 = obj.numbers[5];
+    let x_307 : f32 = color.x;
+    color.x = (x_307 + f32(x_304));
+  }
+  let x_311 : f32 = uv.y;
+  if ((x_311 > 0.5)) {
+    let x_316 : i32 = obj.numbers[6];
+    let x_319 : f32 = color.y;
+    color.y = (x_319 + f32(x_316));
+  }
+  let x_323 : f32 = uv.y;
+  if ((x_323 > 0.75)) {
+    let x_328 : i32 = obj.numbers[7];
+    let x_331 : f32 = color.z;
+    color.z = (x_331 + f32(x_328));
+  }
+  let x_335 : i32 = obj.numbers[8];
+  let x_338 : f32 = color.z;
+  color.z = (x_338 + f32(x_335));
+  let x_342 : f32 = uv.x;
+  let x_344 : f32 = uv.y;
+  if ((abs((x_342 - x_344)) < 0.25)) {
+    let x_351 : i32 = obj.numbers[9];
+    let x_354 : f32 = color.x;
+    color.x = (x_354 + f32(x_351));
+  }
+  let x_357 : vec3<f32> = color;
+  let x_358 : vec3<f32> = normalize(x_357);
+  frag_color = vec4<f32>(x_358.x, x_358.y, x_358.z, 1.0);
+  let x_363 : vec4<f32> = x_GLF_pos;
+  gl_Position = x_363;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  frag_color_1 : vec4<f32>;
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] x_GLF_pos_param : vec4<f32>) -> main_out {
+  x_GLF_pos = x_GLF_pos_param;
+  main_1();
+  return main_out(frag_color, gl_Position);
+}
+
+fn swap_i1_i1_(i : ptr<function, i32>, j : ptr<function, i32>) {
+  var temp : i32;
+  let x_366 : i32 = *(i);
+  let x_368 : i32 = obj.numbers[x_366];
+  temp = x_368;
+  let x_369 : i32 = *(i);
+  let x_370 : i32 = *(j);
+  let x_372 : i32 = obj.numbers[x_370];
+  obj.numbers[x_369] = x_372;
+  let x_374 : i32 = *(j);
+  let x_375 : i32 = temp;
+  obj.numbers[x_374] = x_375;
+  return;
+}
+
+fn performPartition_i1_i1_(l : ptr<function, i32>, h : ptr<function, i32>) -> i32 {
+  var pivot : i32;
+  var i_1 : i32;
+  var j_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  var param_3 : i32;
+  let x_378 : i32 = *(h);
+  let x_380 : i32 = obj.numbers[x_378];
+  pivot = x_380;
+  let x_381 : i32 = *(l);
+  i_1 = (x_381 - 1);
+  let x_383 : i32 = *(l);
+  j_1 = x_383;
+  loop {
+    let x_388 : i32 = j_1;
+    let x_389 : i32 = *(h);
+    if ((x_388 <= (x_389 - 1))) {
+    } else {
+      break;
+    }
+    let x_393 : i32 = j_1;
+    let x_395 : i32 = obj.numbers[x_393];
+    let x_396 : i32 = pivot;
+    if ((x_395 <= x_396)) {
+      let x_400 : i32 = i_1;
+      i_1 = (x_400 + 1);
+      let x_402 : i32 = i_1;
+      param = x_402;
+      let x_403 : i32 = j_1;
+      param_1 = x_403;
+      swap_i1_i1_(&(param), &(param_1));
+    }
+
+    continuing {
+      let x_405 : i32 = j_1;
+      j_1 = (x_405 + 1);
+    }
+  }
+  let x_407 : i32 = i_1;
+  param_2 = (x_407 + 1);
+  let x_409 : i32 = *(h);
+  param_3 = x_409;
+  swap_i1_i1_(&(param_2), &(param_3));
+  let x_411 : i32 = i_1;
+  return (x_411 + 1);
+}
+
+fn quicksort_() {
+  var l_1 : i32;
+  var h_1 : i32;
+  var top : i32;
+  var stack : array<i32, 10>;
+  var p : i32;
+  var param_4 : i32;
+  var param_5 : i32;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  let x_414 : i32 = top;
+  let x_415 : i32 = (x_414 + 1);
+  top = x_415;
+  let x_416 : i32 = l_1;
+  stack[x_415] = x_416;
+  let x_418 : i32 = top;
+  let x_419 : i32 = (x_418 + 1);
+  top = x_419;
+  let x_420 : i32 = h_1;
+  stack[x_419] = x_420;
+  loop {
+    let x_426 : i32 = top;
+    if ((x_426 >= 0)) {
+    } else {
+      break;
+    }
+    let x_429 : i32 = top;
+    top = (x_429 - 1);
+    let x_432 : i32 = stack[x_429];
+    h_1 = x_432;
+    let x_433 : i32 = top;
+    top = (x_433 - 1);
+    let x_436 : i32 = stack[x_433];
+    l_1 = x_436;
+    let x_437 : i32 = l_1;
+    param_4 = x_437;
+    let x_438 : i32 = h_1;
+    param_5 = x_438;
+    let x_439 : i32 = performPartition_i1_i1_(&(param_4), &(param_5));
+    p = x_439;
+    let x_440 : i32 = p;
+    let x_442 : i32 = l_1;
+    if (((x_440 - 1) > x_442)) {
+      let x_446 : i32 = top;
+      let x_447 : i32 = (x_446 + 1);
+      top = x_447;
+      let x_448 : i32 = l_1;
+      stack[x_447] = x_448;
+      let x_450 : i32 = top;
+      let x_451 : i32 = (x_450 + 1);
+      top = x_451;
+      let x_452 : i32 = p;
+      stack[x_451] = (x_452 - 1);
+    }
+    let x_455 : i32 = p;
+    let x_457 : i32 = h_1;
+    if (((x_455 + 1) < x_457)) {
+      let x_461 : i32 = top;
+      let x_462 : i32 = (x_461 + 1);
+      top = x_462;
+      let x_463 : i32 = p;
+      stack[x_462] = (x_463 + 1);
+      let x_466 : i32 = top;
+      let x_467 : i32 = (x_466 + 1);
+      top = x_467;
+      let x_468 : i32 = h_1;
+      stack[x_467] = x_468;
+    }
+  }
+  return;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/0.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/0.wgsl
new file mode 100644
index 0000000..dcc0835
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/0.wgsl
@@ -0,0 +1,399 @@
+struct QuicksortObject {
+  numbers : array<i32, 10>;
+};
+
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> obj : QuicksortObject;
+
+var<private> x_GLF_FragCoord : vec4<f32>;
+
+var<private> x_GLF_pos : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_34 : buf0;
+
+var<private> frag_color : vec4<f32>;
+
+var<private> gl_Position : vec4<f32>;
+
+fn main_1() {
+  var x_90 : i32;
+  var x_91 : i32;
+  var x_92 : i32;
+  var x_93 : i32;
+  var x_94 : i32;
+  var x_95 : i32;
+  var x_96 : i32;
+  var x_97 : i32;
+  var x_98 : i32;
+  var x_99 : i32;
+  var x_100 : i32;
+  var x_101 : i32;
+  var x_102 : i32;
+  var x_103 : array<i32, 10>;
+  var x_104 : i32;
+  var x_105 : i32;
+  var x_106 : i32;
+  var i_2 : i32;
+  var uv : vec2<f32>;
+  var color : vec3<f32>;
+  let x_107 : vec4<f32> = x_GLF_pos;
+  x_GLF_FragCoord = ((x_107 + vec4<f32>(1.0, 1.0, 0.0, 0.0)) * vec4<f32>(128.0, 128.0, 1.0, 1.0));
+  i_2 = 0;
+  loop {
+    let x_114 : i32 = i_2;
+    if ((x_114 < 10)) {
+    } else {
+      break;
+    }
+    let x_117 : i32 = i_2;
+    let x_118 : i32 = i_2;
+    obj.numbers[x_117] = (10 - x_118);
+    let x_121 : i32 = i_2;
+    let x_122 : i32 = i_2;
+    let x_124 : i32 = obj.numbers[x_122];
+    let x_125 : i32 = i_2;
+    let x_127 : i32 = obj.numbers[x_125];
+    obj.numbers[x_121] = (x_124 * x_127);
+
+    continuing {
+      let x_130 : i32 = i_2;
+      i_2 = (x_130 + 1);
+    }
+  }
+  x_100 = 0;
+  x_101 = 9;
+  x_102 = -1;
+  let x_132 : i32 = x_102;
+  let x_133 : i32 = (x_132 + 1);
+  x_102 = x_133;
+  let x_134 : i32 = x_100;
+  x_103[x_133] = x_134;
+  let x_136 : i32 = x_102;
+  let x_137 : i32 = (x_136 + 1);
+  x_102 = x_137;
+  let x_138 : i32 = x_101;
+  x_103[x_137] = x_138;
+  loop {
+    let x_144 : i32 = x_102;
+    if ((x_144 >= 0)) {
+    } else {
+      break;
+    }
+    let x_147 : i32 = x_102;
+    x_102 = (x_147 - 1);
+    let x_150 : i32 = x_103[x_147];
+    x_101 = x_150;
+    let x_151 : i32 = x_102;
+    x_102 = (x_151 - 1);
+    let x_154 : i32 = x_103[x_151];
+    x_100 = x_154;
+    let x_155 : i32 = x_100;
+    x_105 = x_155;
+    let x_156 : i32 = x_101;
+    x_106 = x_156;
+    let x_157 : i32 = x_106;
+    let x_159 : i32 = obj.numbers[x_157];
+    x_92 = x_159;
+    let x_160 : i32 = x_105;
+    x_93 = (x_160 - 1);
+    let x_162 : i32 = x_105;
+    x_94 = x_162;
+    loop {
+      let x_167 : i32 = x_94;
+      let x_168 : i32 = x_106;
+      if ((x_167 <= (x_168 - 1))) {
+      } else {
+        break;
+      }
+      let x_172 : i32 = x_94;
+      let x_174 : i32 = obj.numbers[x_172];
+      let x_175 : i32 = x_92;
+      if ((x_174 <= x_175)) {
+        let x_179 : i32 = x_93;
+        x_93 = (x_179 + 1);
+        let x_181 : i32 = x_93;
+        x_95 = x_181;
+        let x_182 : i32 = x_94;
+        x_96 = x_182;
+        let x_183 : i32 = x_95;
+        let x_185 : i32 = obj.numbers[x_183];
+        x_91 = x_185;
+        let x_186 : i32 = x_95;
+        let x_187 : i32 = x_96;
+        let x_189 : i32 = obj.numbers[x_187];
+        obj.numbers[x_186] = x_189;
+        let x_191 : i32 = x_96;
+        let x_192 : i32 = x_91;
+        obj.numbers[x_191] = x_192;
+      }
+
+      continuing {
+        let x_194 : i32 = x_94;
+        x_94 = (x_194 + 1);
+      }
+    }
+    let x_196 : i32 = x_93;
+    x_97 = (x_196 + 1);
+    let x_198 : i32 = x_106;
+    x_98 = x_198;
+    let x_199 : i32 = x_97;
+    let x_201 : i32 = obj.numbers[x_199];
+    x_90 = x_201;
+    let x_202 : i32 = x_97;
+    let x_203 : i32 = x_98;
+    let x_205 : i32 = obj.numbers[x_203];
+    obj.numbers[x_202] = x_205;
+    let x_207 : i32 = x_98;
+    let x_208 : i32 = x_90;
+    obj.numbers[x_207] = x_208;
+    let x_210 : i32 = x_93;
+    x_99 = (x_210 + 1);
+    let x_212 : i32 = x_99;
+    x_104 = x_212;
+    let x_213 : i32 = x_104;
+    let x_215 : i32 = x_100;
+    if (((x_213 - 1) > x_215)) {
+      let x_219 : i32 = x_102;
+      let x_220 : i32 = (x_219 + 1);
+      x_102 = x_220;
+      let x_221 : i32 = x_100;
+      x_103[x_220] = x_221;
+      let x_223 : i32 = x_102;
+      let x_224 : i32 = (x_223 + 1);
+      x_102 = x_224;
+      let x_225 : i32 = x_104;
+      x_103[x_224] = (x_225 - 1);
+    }
+    let x_228 : i32 = x_104;
+    let x_230 : i32 = x_101;
+    if (((x_228 + 1) < x_230)) {
+      let x_234 : i32 = x_102;
+      let x_235 : i32 = (x_234 + 1);
+      x_102 = x_235;
+      let x_236 : i32 = x_104;
+      x_103[x_235] = (x_236 + 1);
+      let x_239 : i32 = x_102;
+      let x_240 : i32 = (x_239 + 1);
+      x_102 = x_240;
+      let x_241 : i32 = x_101;
+      x_103[x_240] = x_241;
+    }
+  }
+  let x_243 : vec4<f32> = x_GLF_FragCoord;
+  let x_246 : vec2<f32> = x_34.resolution;
+  uv = (vec2<f32>(x_243.x, x_243.y) / x_246);
+  color = vec3<f32>(1.0, 2.0, 3.0);
+  let x_249 : i32 = obj.numbers[0];
+  let x_252 : f32 = color.x;
+  color.x = (x_252 + f32(x_249));
+  let x_256 : f32 = uv.x;
+  if ((x_256 > 0.25)) {
+    let x_261 : i32 = obj.numbers[1];
+    let x_264 : f32 = color.x;
+    color.x = (x_264 + f32(x_261));
+  }
+  let x_268 : f32 = uv.x;
+  if ((x_268 > 0.5)) {
+    let x_273 : i32 = obj.numbers[2];
+    let x_276 : f32 = color.y;
+    color.y = (x_276 + f32(x_273));
+  }
+  let x_280 : f32 = uv.x;
+  if ((x_280 > 0.75)) {
+    let x_285 : i32 = obj.numbers[3];
+    let x_288 : f32 = color.z;
+    color.z = (x_288 + f32(x_285));
+  }
+  let x_292 : i32 = obj.numbers[4];
+  let x_295 : f32 = color.y;
+  color.y = (x_295 + f32(x_292));
+  let x_299 : f32 = uv.y;
+  if ((x_299 > 0.25)) {
+    let x_304 : i32 = obj.numbers[5];
+    let x_307 : f32 = color.x;
+    color.x = (x_307 + f32(x_304));
+  }
+  let x_311 : f32 = uv.y;
+  if ((x_311 > 0.5)) {
+    let x_316 : i32 = obj.numbers[6];
+    let x_319 : f32 = color.y;
+    color.y = (x_319 + f32(x_316));
+  }
+  let x_323 : f32 = uv.y;
+  if ((x_323 > 0.75)) {
+    let x_328 : i32 = obj.numbers[7];
+    let x_331 : f32 = color.z;
+    color.z = (x_331 + f32(x_328));
+  }
+  let x_335 : i32 = obj.numbers[8];
+  let x_338 : f32 = color.z;
+  color.z = (x_338 + f32(x_335));
+  let x_342 : f32 = uv.x;
+  let x_344 : f32 = uv.y;
+  if ((abs((x_342 - x_344)) < 0.25)) {
+    let x_351 : i32 = obj.numbers[9];
+    let x_354 : f32 = color.x;
+    color.x = (x_354 + f32(x_351));
+  }
+  let x_357 : vec3<f32> = color;
+  let x_358 : vec3<f32> = normalize(x_357);
+  frag_color = vec4<f32>(x_358.x, x_358.y, x_358.z, 1.0);
+  let x_363 : vec4<f32> = x_GLF_pos;
+  gl_Position = x_363;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  frag_color_1 : vec4<f32>;
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] x_GLF_pos_param : vec4<f32>) -> main_out {
+  x_GLF_pos = x_GLF_pos_param;
+  main_1();
+  return main_out(frag_color, gl_Position);
+}
+
+fn swap_i1_i1_(i : ptr<function, i32>, j : ptr<function, i32>) {
+  var temp : i32;
+  let x_366 : i32 = *(i);
+  let x_368 : i32 = obj.numbers[x_366];
+  temp = x_368;
+  let x_369 : i32 = *(i);
+  let x_370 : i32 = *(j);
+  let x_372 : i32 = obj.numbers[x_370];
+  obj.numbers[x_369] = x_372;
+  let x_374 : i32 = *(j);
+  let x_375 : i32 = temp;
+  obj.numbers[x_374] = x_375;
+  return;
+}
+
+fn performPartition_i1_i1_(l : ptr<function, i32>, h : ptr<function, i32>) -> i32 {
+  var pivot : i32;
+  var i_1 : i32;
+  var j_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  var param_3 : i32;
+  let x_378 : i32 = *(h);
+  let x_380 : i32 = obj.numbers[x_378];
+  pivot = x_380;
+  let x_381 : i32 = *(l);
+  i_1 = (x_381 - 1);
+  let x_383 : i32 = *(l);
+  j_1 = x_383;
+  loop {
+    let x_388 : i32 = j_1;
+    let x_389 : i32 = *(h);
+    if ((x_388 <= (x_389 - 1))) {
+    } else {
+      break;
+    }
+    let x_393 : i32 = j_1;
+    let x_395 : i32 = obj.numbers[x_393];
+    let x_396 : i32 = pivot;
+    if ((x_395 <= x_396)) {
+      let x_400 : i32 = i_1;
+      i_1 = (x_400 + 1);
+      let x_402 : i32 = i_1;
+      param = x_402;
+      let x_403 : i32 = j_1;
+      param_1 = x_403;
+      swap_i1_i1_(&(param), &(param_1));
+    }
+
+    continuing {
+      let x_405 : i32 = j_1;
+      j_1 = (x_405 + 1);
+    }
+  }
+  let x_407 : i32 = i_1;
+  param_2 = (x_407 + 1);
+  let x_409 : i32 = *(h);
+  param_3 = x_409;
+  swap_i1_i1_(&(param_2), &(param_3));
+  let x_411 : i32 = i_1;
+  return (x_411 + 1);
+}
+
+fn quicksort_() {
+  var l_1 : i32;
+  var h_1 : i32;
+  var top : i32;
+  var stack : array<i32, 10>;
+  var p : i32;
+  var param_4 : i32;
+  var param_5 : i32;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  let x_414 : i32 = top;
+  let x_415 : i32 = (x_414 + 1);
+  top = x_415;
+  let x_416 : i32 = l_1;
+  stack[x_415] = x_416;
+  let x_418 : i32 = top;
+  let x_419 : i32 = (x_418 + 1);
+  top = x_419;
+  let x_420 : i32 = h_1;
+  stack[x_419] = x_420;
+  loop {
+    let x_426 : i32 = top;
+    if ((x_426 >= 0)) {
+    } else {
+      break;
+    }
+    let x_429 : i32 = top;
+    top = (x_429 - 1);
+    let x_432 : i32 = stack[x_429];
+    h_1 = x_432;
+    let x_433 : i32 = top;
+    top = (x_433 - 1);
+    let x_436 : i32 = stack[x_433];
+    l_1 = x_436;
+    let x_437 : i32 = l_1;
+    param_4 = x_437;
+    let x_438 : i32 = h_1;
+    param_5 = x_438;
+    let x_439 : i32 = performPartition_i1_i1_(&(param_4), &(param_5));
+    p = x_439;
+    let x_440 : i32 = p;
+    let x_442 : i32 = l_1;
+    if (((x_440 - 1) > x_442)) {
+      let x_446 : i32 = top;
+      let x_447 : i32 = (x_446 + 1);
+      top = x_447;
+      let x_448 : i32 = l_1;
+      stack[x_447] = x_448;
+      let x_450 : i32 = top;
+      let x_451 : i32 = (x_450 + 1);
+      top = x_451;
+      let x_452 : i32 = p;
+      stack[x_451] = (x_452 - 1);
+    }
+    let x_455 : i32 = p;
+    let x_457 : i32 = h_1;
+    if (((x_455 + 1) < x_457)) {
+      let x_461 : i32 = top;
+      let x_462 : i32 = (x_461 + 1);
+      top = x_462;
+      let x_463 : i32 = p;
+      stack[x_462] = (x_463 + 1);
+      let x_466 : i32 = top;
+      let x_467 : i32 = (x_466 + 1);
+      top = x_467;
+      let x_468 : i32 = h_1;
+      stack[x_467] = x_468;
+    }
+  }
+  return;
+}
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
new file mode 100644
index 0000000..99862c3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/0.wgsl.expected.hlsl
@@ -0,0 +1,306 @@
+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;
+  {
+    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;
+  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;
+    {
+      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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 x_GLF_pos_param = tint_symbol.x_GLF_pos_param;
+  x_GLF_pos = x_GLF_pos_param;
+  main_1();
+  const main_out tint_symbol_3 = {frag_color, gl_Position};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.frag_color_1, tint_symbol_3.gl_Position};
+  return tint_symbol_5;
+}
+
+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;
+  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;
+  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;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/0.wgsl.expected.msl
new file mode 100644
index 0000000..45ba09a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/0.wgsl.expected.msl
@@ -0,0 +1,400 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct QuicksortObject {
+  tint_array_wrapper numbers;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 frag_color_1;
+  float4 gl_Position;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_pos_param [[attribute(0)]];
+};
+struct tint_symbol_3 {
+  float4 frag_color_1 [[user(locn0)]];
+  float4 gl_Position [[position]];
+};
+
+void main_1(constant buf0& x_34, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7, thread QuicksortObject* const tint_symbol_8, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10) {
+  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;
+  tint_array_wrapper x_103 = {};
+  int x_104 = 0;
+  int x_105 = 0;
+  int x_106 = 0;
+  int i_2 = 0;
+  float2 uv = 0.0f;
+  float3 color = 0.0f;
+  float4 const x_107 = *(tint_symbol_6);
+  *(tint_symbol_7) = ((x_107 + float4(1.0f, 1.0f, 0.0f, 0.0f)) * float4(128.0f, 128.0f, 1.0f, 1.0f));
+  i_2 = 0;
+  while (true) {
+    int const x_114 = i_2;
+    if ((x_114 < 10)) {
+    } else {
+      break;
+    }
+    int const x_117 = i_2;
+    int const x_118 = i_2;
+    (*(tint_symbol_8)).numbers.arr[x_117] = (10 - x_118);
+    int const x_121 = i_2;
+    int const x_122 = i_2;
+    int const x_124 = (*(tint_symbol_8)).numbers.arr[x_122];
+    int const x_125 = i_2;
+    int const x_127 = (*(tint_symbol_8)).numbers.arr[x_125];
+    (*(tint_symbol_8)).numbers.arr[x_121] = (x_124 * x_127);
+    {
+      int const x_130 = i_2;
+      i_2 = (x_130 + 1);
+    }
+  }
+  x_100 = 0;
+  x_101 = 9;
+  x_102 = -1;
+  int const x_132 = x_102;
+  int const x_133 = (x_132 + 1);
+  x_102 = x_133;
+  int const x_134 = x_100;
+  x_103.arr[x_133] = x_134;
+  int const x_136 = x_102;
+  int const x_137 = (x_136 + 1);
+  x_102 = x_137;
+  int const x_138 = x_101;
+  x_103.arr[x_137] = x_138;
+  while (true) {
+    int const x_144 = x_102;
+    if ((x_144 >= 0)) {
+    } else {
+      break;
+    }
+    int const x_147 = x_102;
+    x_102 = (x_147 - 1);
+    int const x_150 = x_103.arr[x_147];
+    x_101 = x_150;
+    int const x_151 = x_102;
+    x_102 = (x_151 - 1);
+    int const x_154 = x_103.arr[x_151];
+    x_100 = x_154;
+    int const x_155 = x_100;
+    x_105 = x_155;
+    int const x_156 = x_101;
+    x_106 = x_156;
+    int const x_157 = x_106;
+    int const x_159 = (*(tint_symbol_8)).numbers.arr[x_157];
+    x_92 = x_159;
+    int const x_160 = x_105;
+    x_93 = (x_160 - 1);
+    int const x_162 = x_105;
+    x_94 = x_162;
+    while (true) {
+      int const x_167 = x_94;
+      int const x_168 = x_106;
+      if ((x_167 <= (x_168 - 1))) {
+      } else {
+        break;
+      }
+      int const x_172 = x_94;
+      int const x_174 = (*(tint_symbol_8)).numbers.arr[x_172];
+      int const x_175 = x_92;
+      if ((x_174 <= x_175)) {
+        int const x_179 = x_93;
+        x_93 = (x_179 + 1);
+        int const x_181 = x_93;
+        x_95 = x_181;
+        int const x_182 = x_94;
+        x_96 = x_182;
+        int const x_183 = x_95;
+        int const x_185 = (*(tint_symbol_8)).numbers.arr[x_183];
+        x_91 = x_185;
+        int const x_186 = x_95;
+        int const x_187 = x_96;
+        int const x_189 = (*(tint_symbol_8)).numbers.arr[x_187];
+        (*(tint_symbol_8)).numbers.arr[x_186] = x_189;
+        int const x_191 = x_96;
+        int const x_192 = x_91;
+        (*(tint_symbol_8)).numbers.arr[x_191] = x_192;
+      }
+      {
+        int const x_194 = x_94;
+        x_94 = (x_194 + 1);
+      }
+    }
+    int const x_196 = x_93;
+    x_97 = (x_196 + 1);
+    int const x_198 = x_106;
+    x_98 = x_198;
+    int const x_199 = x_97;
+    int const x_201 = (*(tint_symbol_8)).numbers.arr[x_199];
+    x_90 = x_201;
+    int const x_202 = x_97;
+    int const x_203 = x_98;
+    int const x_205 = (*(tint_symbol_8)).numbers.arr[x_203];
+    (*(tint_symbol_8)).numbers.arr[x_202] = x_205;
+    int const x_207 = x_98;
+    int const x_208 = x_90;
+    (*(tint_symbol_8)).numbers.arr[x_207] = x_208;
+    int const x_210 = x_93;
+    x_99 = (x_210 + 1);
+    int const x_212 = x_99;
+    x_104 = x_212;
+    int const x_213 = x_104;
+    int const x_215 = x_100;
+    if (((x_213 - 1) > x_215)) {
+      int const x_219 = x_102;
+      int const x_220 = (x_219 + 1);
+      x_102 = x_220;
+      int const x_221 = x_100;
+      x_103.arr[x_220] = x_221;
+      int const x_223 = x_102;
+      int const x_224 = (x_223 + 1);
+      x_102 = x_224;
+      int const x_225 = x_104;
+      x_103.arr[x_224] = (x_225 - 1);
+    }
+    int const x_228 = x_104;
+    int const x_230 = x_101;
+    if (((x_228 + 1) < x_230)) {
+      int const x_234 = x_102;
+      int const x_235 = (x_234 + 1);
+      x_102 = x_235;
+      int const x_236 = x_104;
+      x_103.arr[x_235] = (x_236 + 1);
+      int const x_239 = x_102;
+      int const x_240 = (x_239 + 1);
+      x_102 = x_240;
+      int const x_241 = x_101;
+      x_103.arr[x_240] = x_241;
+    }
+  }
+  float4 const x_243 = *(tint_symbol_7);
+  float2 const x_246 = x_34.resolution;
+  uv = (float2(x_243.x, x_243.y) / x_246);
+  color = float3(1.0f, 2.0f, 3.0f);
+  int const x_249 = (*(tint_symbol_8)).numbers.arr[0];
+  float const x_252 = color.x;
+  color.x = (x_252 + float(x_249));
+  float const x_256 = uv.x;
+  if ((x_256 > 0.25f)) {
+    int const x_261 = (*(tint_symbol_8)).numbers.arr[1];
+    float const x_264 = color.x;
+    color.x = (x_264 + float(x_261));
+  }
+  float const x_268 = uv.x;
+  if ((x_268 > 0.5f)) {
+    int const x_273 = (*(tint_symbol_8)).numbers.arr[2];
+    float const x_276 = color.y;
+    color.y = (x_276 + float(x_273));
+  }
+  float const x_280 = uv.x;
+  if ((x_280 > 0.75f)) {
+    int const x_285 = (*(tint_symbol_8)).numbers.arr[3];
+    float const x_288 = color.z;
+    color.z = (x_288 + float(x_285));
+  }
+  int const x_292 = (*(tint_symbol_8)).numbers.arr[4];
+  float const x_295 = color.y;
+  color.y = (x_295 + float(x_292));
+  float const x_299 = uv.y;
+  if ((x_299 > 0.25f)) {
+    int const x_304 = (*(tint_symbol_8)).numbers.arr[5];
+    float const x_307 = color.x;
+    color.x = (x_307 + float(x_304));
+  }
+  float const x_311 = uv.y;
+  if ((x_311 > 0.5f)) {
+    int const x_316 = (*(tint_symbol_8)).numbers.arr[6];
+    float const x_319 = color.y;
+    color.y = (x_319 + float(x_316));
+  }
+  float const x_323 = uv.y;
+  if ((x_323 > 0.75f)) {
+    int const x_328 = (*(tint_symbol_8)).numbers.arr[7];
+    float const x_331 = color.z;
+    color.z = (x_331 + float(x_328));
+  }
+  int const x_335 = (*(tint_symbol_8)).numbers.arr[8];
+  float const x_338 = color.z;
+  color.z = (x_338 + float(x_335));
+  float const x_342 = uv.x;
+  float const x_344 = uv.y;
+  if ((fabs((x_342 - x_344)) < 0.25f)) {
+    int const x_351 = (*(tint_symbol_8)).numbers.arr[9];
+    float const x_354 = color.x;
+    color.x = (x_354 + float(x_351));
+  }
+  float3 const x_357 = color;
+  float3 const x_358 = normalize(x_357);
+  *(tint_symbol_9) = float4(x_358.x, x_358.y, x_358.z, 1.0f);
+  float4 const x_363 = *(tint_symbol_6);
+  *(tint_symbol_10) = x_363;
+  return;
+}
+
+vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]], constant buf0& x_34 [[buffer(0)]]) {
+  thread float4 tint_symbol_11 = 0.0f;
+  thread float4 tint_symbol_12 = 0.0f;
+  thread QuicksortObject tint_symbol_13 = {};
+  thread float4 tint_symbol_14 = 0.0f;
+  thread float4 tint_symbol_15 = 0.0f;
+  float4 const x_GLF_pos_param = tint_symbol_1.x_GLF_pos_param;
+  tint_symbol_11 = x_GLF_pos_param;
+  main_1(x_34, &(tint_symbol_11), &(tint_symbol_12), &(tint_symbol_13), &(tint_symbol_14), &(tint_symbol_15));
+  main_out const tint_symbol_4 = {.frag_color_1=tint_symbol_14, .gl_Position=tint_symbol_15};
+  tint_symbol_3 const tint_symbol_5 = {.frag_color_1=tint_symbol_4.frag_color_1, .gl_Position=tint_symbol_4.gl_Position};
+  return tint_symbol_5;
+}
+
+void swap_i1_i1_(thread int* const i, thread int* const j, thread QuicksortObject* const tint_symbol_16) {
+  int temp = 0;
+  int const x_366 = *(i);
+  int const x_368 = (*(tint_symbol_16)).numbers.arr[x_366];
+  temp = x_368;
+  int const x_369 = *(i);
+  int const x_370 = *(j);
+  int const x_372 = (*(tint_symbol_16)).numbers.arr[x_370];
+  (*(tint_symbol_16)).numbers.arr[x_369] = x_372;
+  int const x_374 = *(j);
+  int const x_375 = temp;
+  (*(tint_symbol_16)).numbers.arr[x_374] = x_375;
+  return;
+}
+
+int performPartition_i1_i1_(thread int* const l, thread int* const h, thread QuicksortObject* const tint_symbol_17) {
+  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;
+  int const x_378 = *(h);
+  int const x_380 = (*(tint_symbol_17)).numbers.arr[x_378];
+  pivot = x_380;
+  int const x_381 = *(l);
+  i_1 = (x_381 - 1);
+  int const x_383 = *(l);
+  j_1 = x_383;
+  while (true) {
+    int const x_388 = j_1;
+    int const x_389 = *(h);
+    if ((x_388 <= (x_389 - 1))) {
+    } else {
+      break;
+    }
+    int const x_393 = j_1;
+    int const x_395 = (*(tint_symbol_17)).numbers.arr[x_393];
+    int const x_396 = pivot;
+    if ((x_395 <= x_396)) {
+      int const x_400 = i_1;
+      i_1 = (x_400 + 1);
+      int const x_402 = i_1;
+      param = x_402;
+      int const x_403 = j_1;
+      param_1 = x_403;
+      swap_i1_i1_(&(param), &(param_1), tint_symbol_17);
+    }
+    {
+      int const x_405 = j_1;
+      j_1 = (x_405 + 1);
+    }
+  }
+  int const x_407 = i_1;
+  param_2 = (x_407 + 1);
+  int const x_409 = *(h);
+  param_3 = x_409;
+  swap_i1_i1_(&(param_2), &(param_3), tint_symbol_17);
+  int const x_411 = i_1;
+  return (x_411 + 1);
+}
+
+void quicksort_(thread QuicksortObject* const tint_symbol_18) {
+  int l_1 = 0;
+  int h_1 = 0;
+  int top = 0;
+  tint_array_wrapper stack = {};
+  int p = 0;
+  int param_4 = 0;
+  int param_5 = 0;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  int const x_414 = top;
+  int const x_415 = (x_414 + 1);
+  top = x_415;
+  int const x_416 = l_1;
+  stack.arr[x_415] = x_416;
+  int const x_418 = top;
+  int const x_419 = (x_418 + 1);
+  top = x_419;
+  int const x_420 = h_1;
+  stack.arr[x_419] = x_420;
+  while (true) {
+    int const x_426 = top;
+    if ((x_426 >= 0)) {
+    } else {
+      break;
+    }
+    int const x_429 = top;
+    top = (x_429 - 1);
+    int const x_432 = stack.arr[x_429];
+    h_1 = x_432;
+    int const x_433 = top;
+    top = (x_433 - 1);
+    int const x_436 = stack.arr[x_433];
+    l_1 = x_436;
+    int const x_437 = l_1;
+    param_4 = x_437;
+    int const x_438 = h_1;
+    param_5 = x_438;
+    int const x_439 = performPartition_i1_i1_(&(param_4), &(param_5), tint_symbol_18);
+    p = x_439;
+    int const x_440 = p;
+    int const x_442 = l_1;
+    if (((x_440 - 1) > x_442)) {
+      int const x_446 = top;
+      int const x_447 = (x_446 + 1);
+      top = x_447;
+      int const x_448 = l_1;
+      stack.arr[x_447] = x_448;
+      int const x_450 = top;
+      int const x_451 = (x_450 + 1);
+      top = x_451;
+      int const x_452 = p;
+      stack.arr[x_451] = (x_452 - 1);
+    }
+    int const x_455 = p;
+    int const x_457 = h_1;
+    if (((x_455 + 1) < x_457)) {
+      int const x_461 = top;
+      int const x_462 = (x_461 + 1);
+      top = x_462;
+      int const x_463 = p;
+      stack.arr[x_462] = (x_463 + 1);
+      int const x_466 = top;
+      int const x_467 = (x_466 + 1);
+      top = x_467;
+      int const x_468 = h_1;
+      stack.arr[x_467] = x_468;
+    }
+  }
+  return;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..6f5c5f8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/0.wgsl.expected.spvasm
@@ -0,0 +1,780 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 521
+; Schema: 0
+               OpCapability Shader
+        %339 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %tint_pointsize %tint_symbol %tint_symbol_2 %tint_symbol_3
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %QuicksortObject "QuicksortObject"
+               OpMemberName %QuicksortObject 0 "numbers"
+               OpName %obj "obj"
+               OpName %x_GLF_FragCoord "x_GLF_FragCoord"
+               OpName %x_GLF_pos "x_GLF_pos"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_34 "x_34"
+               OpName %frag_color "frag_color"
+               OpName %gl_Position "gl_Position"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %main_1 "main_1"
+               OpName %x_90 "x_90"
+               OpName %x_91 "x_91"
+               OpName %x_92 "x_92"
+               OpName %x_93 "x_93"
+               OpName %x_94 "x_94"
+               OpName %x_95 "x_95"
+               OpName %x_96 "x_96"
+               OpName %x_97 "x_97"
+               OpName %x_98 "x_98"
+               OpName %x_99 "x_99"
+               OpName %x_100 "x_100"
+               OpName %x_101 "x_101"
+               OpName %x_102 "x_102"
+               OpName %x_103 "x_103"
+               OpName %x_104 "x_104"
+               OpName %x_105 "x_105"
+               OpName %x_106 "x_106"
+               OpName %i_2 "i_2"
+               OpName %uv "uv"
+               OpName %color "color"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "frag_color_1"
+               OpMemberName %main_out 1 "gl_Position"
+               OpName %tint_symbol_4 "tint_symbol_4"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpName %swap_i1_i1_ "swap_i1_i1_"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %temp "temp"
+               OpName %performPartition_i1_i1_ "performPartition_i1_i1_"
+               OpName %l "l"
+               OpName %h "h"
+               OpName %pivot "pivot"
+               OpName %i_1 "i_1"
+               OpName %j_1 "j_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %quicksort_ "quicksort_"
+               OpName %l_1 "l_1"
+               OpName %h_1 "h_1"
+               OpName %top "top"
+               OpName %stack "stack"
+               OpName %p "p"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpMemberDecorate %QuicksortObject 0 Offset 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_34 NonWritable
+               OpDecorate %x_34 DescriptorSet 0
+               OpDecorate %x_34 Binding 0
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %tint_symbol_3 BuiltIn Position
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%QuicksortObject = OpTypeStruct %_arr_int_uint_10
+%_ptr_Private_QuicksortObject = OpTypePointer Private %QuicksortObject
+         %12 = OpConstantNull %QuicksortObject
+        %obj = OpVariable %_ptr_Private_QuicksortObject Private %12
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_FragCoord = OpVariable %_ptr_Private_v4float Private %16
+  %x_GLF_pos = OpVariable %_ptr_Private_v4float Private %16
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_34 = OpVariable %_ptr_Uniform_buf0 Uniform
+ %frag_color = OpVariable %_ptr_Private_v4float Private %16
+%gl_Position = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %16
+%tint_symbol_3 = OpVariable %_ptr_Output_v4float Output %16
+       %void = OpTypeVoid
+         %29 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %35 = OpConstantNull %int
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+         %50 = OpConstantNull %_arr_int_uint_10
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %57 = OpConstantNull %v2float
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %61 = OpConstantNull %v3float
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %65 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_0
+  %float_128 = OpConstant %float 128
+         %68 = OpConstantComposite %v4float %float_128 %float_128 %float_1 %float_1
+      %int_0 = OpConstant %int 0
+     %int_10 = OpConstant %int 10
+       %bool = OpTypeBool
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_int = OpTypePointer Private %int
+      %int_1 = OpConstant %int 1
+      %int_9 = OpConstant %int 9
+     %int_n1 = OpConstant %int -1
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+        %227 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+%_ptr_Function_float = OpTypePointer Function %float
+ %float_0_25 = OpConstant %float 0.25
+  %float_0_5 = OpConstant %float 0.5
+      %int_2 = OpConstant %int 2
+     %uint_1 = OpConstant %uint 1
+ %float_0_75 = OpConstant %float 0.75
+      %int_3 = OpConstant %int 3
+     %uint_2 = OpConstant %uint 2
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+   %main_out = OpTypeStruct %v4float %v4float
+        %358 = OpTypeFunction %void %main_out
+        %373 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+        %394 = OpTypeFunction %int %_ptr_Function_int %_ptr_Function_int
+     %main_1 = OpFunction %void None %29
+         %32 = OpLabel
+       %x_90 = OpVariable %_ptr_Function_int Function %35
+       %x_91 = OpVariable %_ptr_Function_int Function %35
+       %x_92 = OpVariable %_ptr_Function_int Function %35
+       %x_93 = OpVariable %_ptr_Function_int Function %35
+       %x_94 = OpVariable %_ptr_Function_int Function %35
+       %x_95 = OpVariable %_ptr_Function_int Function %35
+       %x_96 = OpVariable %_ptr_Function_int Function %35
+       %x_97 = OpVariable %_ptr_Function_int Function %35
+       %x_98 = OpVariable %_ptr_Function_int Function %35
+       %x_99 = OpVariable %_ptr_Function_int Function %35
+      %x_100 = OpVariable %_ptr_Function_int Function %35
+      %x_101 = OpVariable %_ptr_Function_int Function %35
+      %x_102 = OpVariable %_ptr_Function_int Function %35
+      %x_103 = OpVariable %_ptr_Function__arr_int_uint_10 Function %50
+      %x_104 = OpVariable %_ptr_Function_int Function %35
+      %x_105 = OpVariable %_ptr_Function_int Function %35
+      %x_106 = OpVariable %_ptr_Function_int Function %35
+        %i_2 = OpVariable %_ptr_Function_int Function %35
+         %uv = OpVariable %_ptr_Function_v2float Function %57
+      %color = OpVariable %_ptr_Function_v3float Function %61
+         %62 = OpLoad %v4float %x_GLF_pos
+         %66 = OpFAdd %v4float %62 %65
+         %69 = OpFMul %v4float %66 %68
+               OpStore %x_GLF_FragCoord %69
+               OpStore %i_2 %int_0
+               OpBranch %71
+         %71 = OpLabel
+               OpLoopMerge %72 %73 None
+               OpBranch %74
+         %74 = OpLabel
+         %75 = OpLoad %int %i_2
+         %77 = OpSLessThan %bool %75 %int_10
+               OpSelectionMerge %79 None
+               OpBranchConditional %77 %80 %81
+         %80 = OpLabel
+               OpBranch %79
+         %81 = OpLabel
+               OpBranch %72
+         %79 = OpLabel
+         %82 = OpLoad %int %i_2
+         %83 = OpLoad %int %i_2
+         %86 = OpAccessChain %_ptr_Private_int %obj %uint_0 %82
+         %87 = OpISub %int %int_10 %83
+               OpStore %86 %87
+         %88 = OpLoad %int %i_2
+         %89 = OpLoad %int %i_2
+         %90 = OpAccessChain %_ptr_Private_int %obj %uint_0 %89
+         %91 = OpLoad %int %90
+         %92 = OpLoad %int %i_2
+         %93 = OpAccessChain %_ptr_Private_int %obj %uint_0 %92
+         %94 = OpLoad %int %93
+         %95 = OpAccessChain %_ptr_Private_int %obj %uint_0 %88
+         %96 = OpIMul %int %91 %94
+               OpStore %95 %96
+               OpBranch %73
+         %73 = OpLabel
+         %97 = OpLoad %int %i_2
+         %99 = OpIAdd %int %97 %int_1
+               OpStore %i_2 %99
+               OpBranch %71
+         %72 = OpLabel
+               OpStore %x_100 %int_0
+               OpStore %x_101 %int_9
+               OpStore %x_102 %int_n1
+        %102 = OpLoad %int %x_102
+        %103 = OpIAdd %int %102 %int_1
+               OpStore %x_102 %103
+        %104 = OpLoad %int %x_100
+        %105 = OpAccessChain %_ptr_Function_int %x_103 %103
+               OpStore %105 %104
+        %106 = OpLoad %int %x_102
+        %107 = OpIAdd %int %106 %int_1
+               OpStore %x_102 %107
+        %108 = OpLoad %int %x_101
+        %109 = OpAccessChain %_ptr_Function_int %x_103 %107
+               OpStore %109 %108
+               OpBranch %110
+        %110 = OpLabel
+               OpLoopMerge %111 %112 None
+               OpBranch %113
+        %113 = OpLabel
+        %114 = OpLoad %int %x_102
+        %115 = OpSGreaterThanEqual %bool %114 %int_0
+               OpSelectionMerge %116 None
+               OpBranchConditional %115 %117 %118
+        %117 = OpLabel
+               OpBranch %116
+        %118 = OpLabel
+               OpBranch %111
+        %116 = OpLabel
+        %119 = OpLoad %int %x_102
+        %120 = OpISub %int %119 %int_1
+               OpStore %x_102 %120
+        %121 = OpAccessChain %_ptr_Function_int %x_103 %119
+        %122 = OpLoad %int %121
+               OpStore %x_101 %122
+        %123 = OpLoad %int %x_102
+        %124 = OpISub %int %123 %int_1
+               OpStore %x_102 %124
+        %125 = OpAccessChain %_ptr_Function_int %x_103 %123
+        %126 = OpLoad %int %125
+               OpStore %x_100 %126
+        %127 = OpLoad %int %x_100
+               OpStore %x_105 %127
+        %128 = OpLoad %int %x_101
+               OpStore %x_106 %128
+        %129 = OpLoad %int %x_106
+        %130 = OpAccessChain %_ptr_Private_int %obj %uint_0 %129
+        %131 = OpLoad %int %130
+               OpStore %x_92 %131
+        %132 = OpLoad %int %x_105
+        %133 = OpISub %int %132 %int_1
+               OpStore %x_93 %133
+        %134 = OpLoad %int %x_105
+               OpStore %x_94 %134
+               OpBranch %135
+        %135 = OpLabel
+               OpLoopMerge %136 %137 None
+               OpBranch %138
+        %138 = OpLabel
+        %139 = OpLoad %int %x_94
+        %140 = OpLoad %int %x_106
+        %141 = OpISub %int %140 %int_1
+        %142 = OpSLessThanEqual %bool %139 %141
+               OpSelectionMerge %143 None
+               OpBranchConditional %142 %144 %145
+        %144 = OpLabel
+               OpBranch %143
+        %145 = OpLabel
+               OpBranch %136
+        %143 = OpLabel
+        %146 = OpLoad %int %x_94
+        %147 = OpAccessChain %_ptr_Private_int %obj %uint_0 %146
+        %148 = OpLoad %int %147
+        %149 = OpLoad %int %x_92
+        %150 = OpSLessThanEqual %bool %148 %149
+               OpSelectionMerge %151 None
+               OpBranchConditional %150 %152 %151
+        %152 = OpLabel
+        %153 = OpLoad %int %x_93
+        %154 = OpIAdd %int %153 %int_1
+               OpStore %x_93 %154
+        %155 = OpLoad %int %x_93
+               OpStore %x_95 %155
+        %156 = OpLoad %int %x_94
+               OpStore %x_96 %156
+        %157 = OpLoad %int %x_95
+        %158 = OpAccessChain %_ptr_Private_int %obj %uint_0 %157
+        %159 = OpLoad %int %158
+               OpStore %x_91 %159
+        %160 = OpLoad %int %x_95
+        %161 = OpLoad %int %x_96
+        %162 = OpAccessChain %_ptr_Private_int %obj %uint_0 %161
+        %163 = OpLoad %int %162
+        %164 = OpAccessChain %_ptr_Private_int %obj %uint_0 %160
+               OpStore %164 %163
+        %165 = OpLoad %int %x_96
+        %166 = OpLoad %int %x_91
+        %167 = OpAccessChain %_ptr_Private_int %obj %uint_0 %165
+               OpStore %167 %166
+               OpBranch %151
+        %151 = OpLabel
+               OpBranch %137
+        %137 = OpLabel
+        %168 = OpLoad %int %x_94
+        %169 = OpIAdd %int %168 %int_1
+               OpStore %x_94 %169
+               OpBranch %135
+        %136 = OpLabel
+        %170 = OpLoad %int %x_93
+        %171 = OpIAdd %int %170 %int_1
+               OpStore %x_97 %171
+        %172 = OpLoad %int %x_106
+               OpStore %x_98 %172
+        %173 = OpLoad %int %x_97
+        %174 = OpAccessChain %_ptr_Private_int %obj %uint_0 %173
+        %175 = OpLoad %int %174
+               OpStore %x_90 %175
+        %176 = OpLoad %int %x_97
+        %177 = OpLoad %int %x_98
+        %178 = OpAccessChain %_ptr_Private_int %obj %uint_0 %177
+        %179 = OpLoad %int %178
+        %180 = OpAccessChain %_ptr_Private_int %obj %uint_0 %176
+               OpStore %180 %179
+        %181 = OpLoad %int %x_98
+        %182 = OpLoad %int %x_90
+        %183 = OpAccessChain %_ptr_Private_int %obj %uint_0 %181
+               OpStore %183 %182
+        %184 = OpLoad %int %x_93
+        %185 = OpIAdd %int %184 %int_1
+               OpStore %x_99 %185
+        %186 = OpLoad %int %x_99
+               OpStore %x_104 %186
+        %187 = OpLoad %int %x_104
+        %188 = OpLoad %int %x_100
+        %189 = OpISub %int %187 %int_1
+        %190 = OpSGreaterThan %bool %189 %188
+               OpSelectionMerge %191 None
+               OpBranchConditional %190 %192 %191
+        %192 = OpLabel
+        %193 = OpLoad %int %x_102
+        %194 = OpIAdd %int %193 %int_1
+               OpStore %x_102 %194
+        %195 = OpLoad %int %x_100
+        %196 = OpAccessChain %_ptr_Function_int %x_103 %194
+               OpStore %196 %195
+        %197 = OpLoad %int %x_102
+        %198 = OpIAdd %int %197 %int_1
+               OpStore %x_102 %198
+        %199 = OpLoad %int %x_104
+        %200 = OpAccessChain %_ptr_Function_int %x_103 %198
+        %201 = OpISub %int %199 %int_1
+               OpStore %200 %201
+               OpBranch %191
+        %191 = OpLabel
+        %202 = OpLoad %int %x_104
+        %203 = OpLoad %int %x_101
+        %204 = OpIAdd %int %202 %int_1
+        %205 = OpSLessThan %bool %204 %203
+               OpSelectionMerge %206 None
+               OpBranchConditional %205 %207 %206
+        %207 = OpLabel
+        %208 = OpLoad %int %x_102
+        %209 = OpIAdd %int %208 %int_1
+               OpStore %x_102 %209
+        %210 = OpLoad %int %x_104
+        %211 = OpAccessChain %_ptr_Function_int %x_103 %209
+        %212 = OpIAdd %int %210 %int_1
+               OpStore %211 %212
+        %213 = OpLoad %int %x_102
+        %214 = OpIAdd %int %213 %int_1
+               OpStore %x_102 %214
+        %215 = OpLoad %int %x_101
+        %216 = OpAccessChain %_ptr_Function_int %x_103 %214
+               OpStore %216 %215
+               OpBranch %206
+        %206 = OpLabel
+               OpBranch %112
+        %112 = OpLabel
+               OpBranch %110
+        %111 = OpLabel
+        %217 = OpLoad %v4float %x_GLF_FragCoord
+        %219 = OpAccessChain %_ptr_Uniform_v2float %x_34 %uint_0
+        %220 = OpLoad %v2float %219
+        %221 = OpCompositeExtract %float %217 0
+        %222 = OpCompositeExtract %float %217 1
+        %223 = OpCompositeConstruct %v2float %221 %222
+        %224 = OpFDiv %v2float %223 %220
+               OpStore %uv %224
+               OpStore %color %227
+        %228 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_0
+        %229 = OpLoad %int %228
+        %231 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %232 = OpLoad %float %231
+        %233 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %234 = OpConvertSToF %float %229
+        %235 = OpFAdd %float %232 %234
+               OpStore %233 %235
+        %236 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %237 = OpLoad %float %236
+        %239 = OpFOrdGreaterThan %bool %237 %float_0_25
+               OpSelectionMerge %240 None
+               OpBranchConditional %239 %241 %240
+        %241 = OpLabel
+        %242 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_1
+        %243 = OpLoad %int %242
+        %244 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %245 = OpLoad %float %244
+        %246 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %247 = OpConvertSToF %float %243
+        %248 = OpFAdd %float %245 %247
+               OpStore %246 %248
+               OpBranch %240
+        %240 = OpLabel
+        %249 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %250 = OpLoad %float %249
+        %252 = OpFOrdGreaterThan %bool %250 %float_0_5
+               OpSelectionMerge %253 None
+               OpBranchConditional %252 %254 %253
+        %254 = OpLabel
+        %256 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_2
+        %257 = OpLoad %int %256
+        %259 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %260 = OpLoad %float %259
+        %261 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %262 = OpConvertSToF %float %257
+        %263 = OpFAdd %float %260 %262
+               OpStore %261 %263
+               OpBranch %253
+        %253 = OpLabel
+        %264 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %265 = OpLoad %float %264
+        %267 = OpFOrdGreaterThan %bool %265 %float_0_75
+               OpSelectionMerge %268 None
+               OpBranchConditional %267 %269 %268
+        %269 = OpLabel
+        %271 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_3
+        %272 = OpLoad %int %271
+        %274 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %275 = OpLoad %float %274
+        %276 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %277 = OpConvertSToF %float %272
+        %278 = OpFAdd %float %275 %277
+               OpStore %276 %278
+               OpBranch %268
+        %268 = OpLabel
+        %280 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_4
+        %281 = OpLoad %int %280
+        %282 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %283 = OpLoad %float %282
+        %284 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %285 = OpConvertSToF %float %281
+        %286 = OpFAdd %float %283 %285
+               OpStore %284 %286
+        %287 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %288 = OpLoad %float %287
+        %289 = OpFOrdGreaterThan %bool %288 %float_0_25
+               OpSelectionMerge %290 None
+               OpBranchConditional %289 %291 %290
+        %291 = OpLabel
+        %293 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_5
+        %294 = OpLoad %int %293
+        %295 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %296 = OpLoad %float %295
+        %297 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %298 = OpConvertSToF %float %294
+        %299 = OpFAdd %float %296 %298
+               OpStore %297 %299
+               OpBranch %290
+        %290 = OpLabel
+        %300 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %301 = OpLoad %float %300
+        %302 = OpFOrdGreaterThan %bool %301 %float_0_5
+               OpSelectionMerge %303 None
+               OpBranchConditional %302 %304 %303
+        %304 = OpLabel
+        %306 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_6
+        %307 = OpLoad %int %306
+        %308 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %309 = OpLoad %float %308
+        %310 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %311 = OpConvertSToF %float %307
+        %312 = OpFAdd %float %309 %311
+               OpStore %310 %312
+               OpBranch %303
+        %303 = OpLabel
+        %313 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %314 = OpLoad %float %313
+        %315 = OpFOrdGreaterThan %bool %314 %float_0_75
+               OpSelectionMerge %316 None
+               OpBranchConditional %315 %317 %316
+        %317 = OpLabel
+        %319 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_7
+        %320 = OpLoad %int %319
+        %321 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %322 = OpLoad %float %321
+        %323 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %324 = OpConvertSToF %float %320
+        %325 = OpFAdd %float %322 %324
+               OpStore %323 %325
+               OpBranch %316
+        %316 = OpLabel
+        %327 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_8
+        %328 = OpLoad %int %327
+        %329 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %330 = OpLoad %float %329
+        %331 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %332 = OpConvertSToF %float %328
+        %333 = OpFAdd %float %330 %332
+               OpStore %331 %333
+        %334 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %335 = OpLoad %float %334
+        %336 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %337 = OpLoad %float %336
+        %340 = OpFSub %float %335 %337
+        %338 = OpExtInst %float %339 FAbs %340
+        %341 = OpFOrdLessThan %bool %338 %float_0_25
+               OpSelectionMerge %342 None
+               OpBranchConditional %341 %343 %342
+        %343 = OpLabel
+        %344 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_9
+        %345 = OpLoad %int %344
+        %346 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %347 = OpLoad %float %346
+        %348 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %349 = OpConvertSToF %float %345
+        %350 = OpFAdd %float %347 %349
+               OpStore %348 %350
+               OpBranch %342
+        %342 = OpLabel
+        %351 = OpLoad %v3float %color
+        %352 = OpExtInst %v3float %339 Normalize %351
+        %353 = OpCompositeExtract %float %352 0
+        %354 = OpCompositeExtract %float %352 1
+        %355 = OpCompositeExtract %float %352 2
+        %356 = OpCompositeConstruct %v4float %353 %354 %355 %float_1
+               OpStore %frag_color %356
+        %357 = OpLoad %v4float %x_GLF_pos
+               OpStore %gl_Position %357
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_4 = OpFunction %void None %358
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %362 = OpLabel
+        %363 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %363
+        %364 = OpCompositeExtract %v4float %tint_symbol_1 1
+               OpStore %tint_symbol_3 %364
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %29
+        %366 = OpLabel
+               OpStore %tint_pointsize %float_1
+        %367 = OpLoad %v4float %tint_symbol
+               OpStore %x_GLF_pos %367
+        %368 = OpFunctionCall %void %main_1
+        %370 = OpLoad %v4float %frag_color
+        %371 = OpLoad %v4float %gl_Position
+        %372 = OpCompositeConstruct %main_out %370 %371
+        %369 = OpFunctionCall %void %tint_symbol_4 %372
+               OpReturn
+               OpFunctionEnd
+%swap_i1_i1_ = OpFunction %void None %373
+          %i = OpFunctionParameter %_ptr_Function_int
+          %j = OpFunctionParameter %_ptr_Function_int
+        %377 = OpLabel
+       %temp = OpVariable %_ptr_Function_int Function %35
+        %380 = OpLoad %int %i
+        %381 = OpAccessChain %_ptr_Private_int %obj %uint_0 %380
+        %382 = OpLoad %int %381
+               OpStore %temp %382
+        %384 = OpLoad %int %i
+        %386 = OpLoad %int %j
+        %387 = OpAccessChain %_ptr_Private_int %obj %uint_0 %386
+        %388 = OpLoad %int %387
+        %389 = OpAccessChain %_ptr_Private_int %obj %uint_0 %384
+               OpStore %389 %388
+        %391 = OpLoad %int %j
+        %392 = OpLoad %int %temp
+        %393 = OpAccessChain %_ptr_Private_int %obj %uint_0 %391
+               OpStore %393 %392
+               OpReturn
+               OpFunctionEnd
+%performPartition_i1_i1_ = OpFunction %int None %394
+          %l = OpFunctionParameter %_ptr_Function_int
+          %h = OpFunctionParameter %_ptr_Function_int
+        %398 = OpLabel
+      %pivot = OpVariable %_ptr_Function_int Function %35
+        %i_1 = OpVariable %_ptr_Function_int Function %35
+        %j_1 = OpVariable %_ptr_Function_int Function %35
+      %param = OpVariable %_ptr_Function_int Function %35
+    %param_1 = OpVariable %_ptr_Function_int Function %35
+    %param_2 = OpVariable %_ptr_Function_int Function %35
+    %param_3 = OpVariable %_ptr_Function_int Function %35
+        %407 = OpLoad %int %h
+        %408 = OpAccessChain %_ptr_Private_int %obj %uint_0 %407
+        %409 = OpLoad %int %408
+               OpStore %pivot %409
+        %411 = OpLoad %int %l
+        %412 = OpISub %int %411 %int_1
+               OpStore %i_1 %412
+        %414 = OpLoad %int %l
+               OpStore %j_1 %414
+               OpBranch %415
+        %415 = OpLabel
+               OpLoopMerge %416 %417 None
+               OpBranch %418
+        %418 = OpLabel
+        %419 = OpLoad %int %j_1
+        %421 = OpLoad %int %h
+        %422 = OpISub %int %421 %int_1
+        %423 = OpSLessThanEqual %bool %419 %422
+               OpSelectionMerge %424 None
+               OpBranchConditional %423 %425 %426
+        %425 = OpLabel
+               OpBranch %424
+        %426 = OpLabel
+               OpBranch %416
+        %424 = OpLabel
+        %427 = OpLoad %int %j_1
+        %428 = OpAccessChain %_ptr_Private_int %obj %uint_0 %427
+        %429 = OpLoad %int %428
+        %430 = OpLoad %int %pivot
+        %431 = OpSLessThanEqual %bool %429 %430
+               OpSelectionMerge %432 None
+               OpBranchConditional %431 %433 %432
+        %433 = OpLabel
+        %434 = OpLoad %int %i_1
+        %435 = OpIAdd %int %434 %int_1
+               OpStore %i_1 %435
+        %436 = OpLoad %int %i_1
+               OpStore %param %436
+        %437 = OpLoad %int %j_1
+               OpStore %param_1 %437
+        %438 = OpFunctionCall %void %swap_i1_i1_ %param %param_1
+               OpBranch %432
+        %432 = OpLabel
+               OpBranch %417
+        %417 = OpLabel
+        %441 = OpLoad %int %j_1
+        %442 = OpIAdd %int %441 %int_1
+               OpStore %j_1 %442
+               OpBranch %415
+        %416 = OpLabel
+        %443 = OpLoad %int %i_1
+        %444 = OpIAdd %int %443 %int_1
+               OpStore %param_2 %444
+        %446 = OpLoad %int %h
+               OpStore %param_3 %446
+        %447 = OpFunctionCall %void %swap_i1_i1_ %param_2 %param_3
+        %450 = OpLoad %int %i_1
+        %451 = OpIAdd %int %450 %int_1
+               OpReturnValue %451
+               OpFunctionEnd
+ %quicksort_ = OpFunction %void None %29
+        %453 = OpLabel
+        %l_1 = OpVariable %_ptr_Function_int Function %35
+        %h_1 = OpVariable %_ptr_Function_int Function %35
+        %top = OpVariable %_ptr_Function_int Function %35
+      %stack = OpVariable %_ptr_Function__arr_int_uint_10 Function %50
+          %p = OpVariable %_ptr_Function_int Function %35
+    %param_4 = OpVariable %_ptr_Function_int Function %35
+    %param_5 = OpVariable %_ptr_Function_int Function %35
+               OpStore %l_1 %int_0
+               OpStore %h_1 %int_9
+               OpStore %top %int_n1
+        %461 = OpLoad %int %top
+        %462 = OpIAdd %int %461 %int_1
+               OpStore %top %462
+        %463 = OpLoad %int %l_1
+        %464 = OpAccessChain %_ptr_Function_int %stack %462
+               OpStore %464 %463
+        %465 = OpLoad %int %top
+        %466 = OpIAdd %int %465 %int_1
+               OpStore %top %466
+        %467 = OpLoad %int %h_1
+        %468 = OpAccessChain %_ptr_Function_int %stack %466
+               OpStore %468 %467
+               OpBranch %469
+        %469 = OpLabel
+               OpLoopMerge %470 %471 None
+               OpBranch %472
+        %472 = OpLabel
+        %473 = OpLoad %int %top
+        %474 = OpSGreaterThanEqual %bool %473 %int_0
+               OpSelectionMerge %475 None
+               OpBranchConditional %474 %476 %477
+        %476 = OpLabel
+               OpBranch %475
+        %477 = OpLabel
+               OpBranch %470
+        %475 = OpLabel
+        %478 = OpLoad %int %top
+        %479 = OpISub %int %478 %int_1
+               OpStore %top %479
+        %480 = OpAccessChain %_ptr_Function_int %stack %478
+        %481 = OpLoad %int %480
+               OpStore %h_1 %481
+        %482 = OpLoad %int %top
+        %483 = OpISub %int %482 %int_1
+               OpStore %top %483
+        %484 = OpAccessChain %_ptr_Function_int %stack %482
+        %485 = OpLoad %int %484
+               OpStore %l_1 %485
+        %486 = OpLoad %int %l_1
+               OpStore %param_4 %486
+        %487 = OpLoad %int %h_1
+               OpStore %param_5 %487
+        %488 = OpFunctionCall %int %performPartition_i1_i1_ %param_4 %param_5
+               OpStore %p %488
+        %491 = OpLoad %int %p
+        %492 = OpLoad %int %l_1
+        %493 = OpISub %int %491 %int_1
+        %494 = OpSGreaterThan %bool %493 %492
+               OpSelectionMerge %495 None
+               OpBranchConditional %494 %496 %495
+        %496 = OpLabel
+        %497 = OpLoad %int %top
+        %498 = OpIAdd %int %497 %int_1
+               OpStore %top %498
+        %499 = OpLoad %int %l_1
+        %500 = OpAccessChain %_ptr_Function_int %stack %498
+               OpStore %500 %499
+        %501 = OpLoad %int %top
+        %502 = OpIAdd %int %501 %int_1
+               OpStore %top %502
+        %503 = OpLoad %int %p
+        %504 = OpAccessChain %_ptr_Function_int %stack %502
+        %505 = OpISub %int %503 %int_1
+               OpStore %504 %505
+               OpBranch %495
+        %495 = OpLabel
+        %506 = OpLoad %int %p
+        %507 = OpLoad %int %h_1
+        %508 = OpIAdd %int %506 %int_1
+        %509 = OpSLessThan %bool %508 %507
+               OpSelectionMerge %510 None
+               OpBranchConditional %509 %511 %510
+        %511 = OpLabel
+        %512 = OpLoad %int %top
+        %513 = OpIAdd %int %512 %int_1
+               OpStore %top %513
+        %514 = OpLoad %int %p
+        %515 = OpAccessChain %_ptr_Function_int %stack %513
+        %516 = OpIAdd %int %514 %int_1
+               OpStore %515 %516
+        %517 = OpLoad %int %top
+        %518 = OpIAdd %int %517 %int_1
+               OpStore %top %518
+        %519 = OpLoad %int %h_1
+        %520 = OpAccessChain %_ptr_Function_int %stack %518
+               OpStore %520 %519
+               OpBranch %510
+        %510 = OpLabel
+               OpBranch %471
+        %471 = OpLabel
+               OpBranch %469
+        %470 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..dcc0835
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/0.wgsl.expected.wgsl
@@ -0,0 +1,399 @@
+struct QuicksortObject {
+  numbers : array<i32, 10>;
+};
+
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> obj : QuicksortObject;
+
+var<private> x_GLF_FragCoord : vec4<f32>;
+
+var<private> x_GLF_pos : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_34 : buf0;
+
+var<private> frag_color : vec4<f32>;
+
+var<private> gl_Position : vec4<f32>;
+
+fn main_1() {
+  var x_90 : i32;
+  var x_91 : i32;
+  var x_92 : i32;
+  var x_93 : i32;
+  var x_94 : i32;
+  var x_95 : i32;
+  var x_96 : i32;
+  var x_97 : i32;
+  var x_98 : i32;
+  var x_99 : i32;
+  var x_100 : i32;
+  var x_101 : i32;
+  var x_102 : i32;
+  var x_103 : array<i32, 10>;
+  var x_104 : i32;
+  var x_105 : i32;
+  var x_106 : i32;
+  var i_2 : i32;
+  var uv : vec2<f32>;
+  var color : vec3<f32>;
+  let x_107 : vec4<f32> = x_GLF_pos;
+  x_GLF_FragCoord = ((x_107 + vec4<f32>(1.0, 1.0, 0.0, 0.0)) * vec4<f32>(128.0, 128.0, 1.0, 1.0));
+  i_2 = 0;
+  loop {
+    let x_114 : i32 = i_2;
+    if ((x_114 < 10)) {
+    } else {
+      break;
+    }
+    let x_117 : i32 = i_2;
+    let x_118 : i32 = i_2;
+    obj.numbers[x_117] = (10 - x_118);
+    let x_121 : i32 = i_2;
+    let x_122 : i32 = i_2;
+    let x_124 : i32 = obj.numbers[x_122];
+    let x_125 : i32 = i_2;
+    let x_127 : i32 = obj.numbers[x_125];
+    obj.numbers[x_121] = (x_124 * x_127);
+
+    continuing {
+      let x_130 : i32 = i_2;
+      i_2 = (x_130 + 1);
+    }
+  }
+  x_100 = 0;
+  x_101 = 9;
+  x_102 = -1;
+  let x_132 : i32 = x_102;
+  let x_133 : i32 = (x_132 + 1);
+  x_102 = x_133;
+  let x_134 : i32 = x_100;
+  x_103[x_133] = x_134;
+  let x_136 : i32 = x_102;
+  let x_137 : i32 = (x_136 + 1);
+  x_102 = x_137;
+  let x_138 : i32 = x_101;
+  x_103[x_137] = x_138;
+  loop {
+    let x_144 : i32 = x_102;
+    if ((x_144 >= 0)) {
+    } else {
+      break;
+    }
+    let x_147 : i32 = x_102;
+    x_102 = (x_147 - 1);
+    let x_150 : i32 = x_103[x_147];
+    x_101 = x_150;
+    let x_151 : i32 = x_102;
+    x_102 = (x_151 - 1);
+    let x_154 : i32 = x_103[x_151];
+    x_100 = x_154;
+    let x_155 : i32 = x_100;
+    x_105 = x_155;
+    let x_156 : i32 = x_101;
+    x_106 = x_156;
+    let x_157 : i32 = x_106;
+    let x_159 : i32 = obj.numbers[x_157];
+    x_92 = x_159;
+    let x_160 : i32 = x_105;
+    x_93 = (x_160 - 1);
+    let x_162 : i32 = x_105;
+    x_94 = x_162;
+    loop {
+      let x_167 : i32 = x_94;
+      let x_168 : i32 = x_106;
+      if ((x_167 <= (x_168 - 1))) {
+      } else {
+        break;
+      }
+      let x_172 : i32 = x_94;
+      let x_174 : i32 = obj.numbers[x_172];
+      let x_175 : i32 = x_92;
+      if ((x_174 <= x_175)) {
+        let x_179 : i32 = x_93;
+        x_93 = (x_179 + 1);
+        let x_181 : i32 = x_93;
+        x_95 = x_181;
+        let x_182 : i32 = x_94;
+        x_96 = x_182;
+        let x_183 : i32 = x_95;
+        let x_185 : i32 = obj.numbers[x_183];
+        x_91 = x_185;
+        let x_186 : i32 = x_95;
+        let x_187 : i32 = x_96;
+        let x_189 : i32 = obj.numbers[x_187];
+        obj.numbers[x_186] = x_189;
+        let x_191 : i32 = x_96;
+        let x_192 : i32 = x_91;
+        obj.numbers[x_191] = x_192;
+      }
+
+      continuing {
+        let x_194 : i32 = x_94;
+        x_94 = (x_194 + 1);
+      }
+    }
+    let x_196 : i32 = x_93;
+    x_97 = (x_196 + 1);
+    let x_198 : i32 = x_106;
+    x_98 = x_198;
+    let x_199 : i32 = x_97;
+    let x_201 : i32 = obj.numbers[x_199];
+    x_90 = x_201;
+    let x_202 : i32 = x_97;
+    let x_203 : i32 = x_98;
+    let x_205 : i32 = obj.numbers[x_203];
+    obj.numbers[x_202] = x_205;
+    let x_207 : i32 = x_98;
+    let x_208 : i32 = x_90;
+    obj.numbers[x_207] = x_208;
+    let x_210 : i32 = x_93;
+    x_99 = (x_210 + 1);
+    let x_212 : i32 = x_99;
+    x_104 = x_212;
+    let x_213 : i32 = x_104;
+    let x_215 : i32 = x_100;
+    if (((x_213 - 1) > x_215)) {
+      let x_219 : i32 = x_102;
+      let x_220 : i32 = (x_219 + 1);
+      x_102 = x_220;
+      let x_221 : i32 = x_100;
+      x_103[x_220] = x_221;
+      let x_223 : i32 = x_102;
+      let x_224 : i32 = (x_223 + 1);
+      x_102 = x_224;
+      let x_225 : i32 = x_104;
+      x_103[x_224] = (x_225 - 1);
+    }
+    let x_228 : i32 = x_104;
+    let x_230 : i32 = x_101;
+    if (((x_228 + 1) < x_230)) {
+      let x_234 : i32 = x_102;
+      let x_235 : i32 = (x_234 + 1);
+      x_102 = x_235;
+      let x_236 : i32 = x_104;
+      x_103[x_235] = (x_236 + 1);
+      let x_239 : i32 = x_102;
+      let x_240 : i32 = (x_239 + 1);
+      x_102 = x_240;
+      let x_241 : i32 = x_101;
+      x_103[x_240] = x_241;
+    }
+  }
+  let x_243 : vec4<f32> = x_GLF_FragCoord;
+  let x_246 : vec2<f32> = x_34.resolution;
+  uv = (vec2<f32>(x_243.x, x_243.y) / x_246);
+  color = vec3<f32>(1.0, 2.0, 3.0);
+  let x_249 : i32 = obj.numbers[0];
+  let x_252 : f32 = color.x;
+  color.x = (x_252 + f32(x_249));
+  let x_256 : f32 = uv.x;
+  if ((x_256 > 0.25)) {
+    let x_261 : i32 = obj.numbers[1];
+    let x_264 : f32 = color.x;
+    color.x = (x_264 + f32(x_261));
+  }
+  let x_268 : f32 = uv.x;
+  if ((x_268 > 0.5)) {
+    let x_273 : i32 = obj.numbers[2];
+    let x_276 : f32 = color.y;
+    color.y = (x_276 + f32(x_273));
+  }
+  let x_280 : f32 = uv.x;
+  if ((x_280 > 0.75)) {
+    let x_285 : i32 = obj.numbers[3];
+    let x_288 : f32 = color.z;
+    color.z = (x_288 + f32(x_285));
+  }
+  let x_292 : i32 = obj.numbers[4];
+  let x_295 : f32 = color.y;
+  color.y = (x_295 + f32(x_292));
+  let x_299 : f32 = uv.y;
+  if ((x_299 > 0.25)) {
+    let x_304 : i32 = obj.numbers[5];
+    let x_307 : f32 = color.x;
+    color.x = (x_307 + f32(x_304));
+  }
+  let x_311 : f32 = uv.y;
+  if ((x_311 > 0.5)) {
+    let x_316 : i32 = obj.numbers[6];
+    let x_319 : f32 = color.y;
+    color.y = (x_319 + f32(x_316));
+  }
+  let x_323 : f32 = uv.y;
+  if ((x_323 > 0.75)) {
+    let x_328 : i32 = obj.numbers[7];
+    let x_331 : f32 = color.z;
+    color.z = (x_331 + f32(x_328));
+  }
+  let x_335 : i32 = obj.numbers[8];
+  let x_338 : f32 = color.z;
+  color.z = (x_338 + f32(x_335));
+  let x_342 : f32 = uv.x;
+  let x_344 : f32 = uv.y;
+  if ((abs((x_342 - x_344)) < 0.25)) {
+    let x_351 : i32 = obj.numbers[9];
+    let x_354 : f32 = color.x;
+    color.x = (x_354 + f32(x_351));
+  }
+  let x_357 : vec3<f32> = color;
+  let x_358 : vec3<f32> = normalize(x_357);
+  frag_color = vec4<f32>(x_358.x, x_358.y, x_358.z, 1.0);
+  let x_363 : vec4<f32> = x_GLF_pos;
+  gl_Position = x_363;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  frag_color_1 : vec4<f32>;
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] x_GLF_pos_param : vec4<f32>) -> main_out {
+  x_GLF_pos = x_GLF_pos_param;
+  main_1();
+  return main_out(frag_color, gl_Position);
+}
+
+fn swap_i1_i1_(i : ptr<function, i32>, j : ptr<function, i32>) {
+  var temp : i32;
+  let x_366 : i32 = *(i);
+  let x_368 : i32 = obj.numbers[x_366];
+  temp = x_368;
+  let x_369 : i32 = *(i);
+  let x_370 : i32 = *(j);
+  let x_372 : i32 = obj.numbers[x_370];
+  obj.numbers[x_369] = x_372;
+  let x_374 : i32 = *(j);
+  let x_375 : i32 = temp;
+  obj.numbers[x_374] = x_375;
+  return;
+}
+
+fn performPartition_i1_i1_(l : ptr<function, i32>, h : ptr<function, i32>) -> i32 {
+  var pivot : i32;
+  var i_1 : i32;
+  var j_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  var param_3 : i32;
+  let x_378 : i32 = *(h);
+  let x_380 : i32 = obj.numbers[x_378];
+  pivot = x_380;
+  let x_381 : i32 = *(l);
+  i_1 = (x_381 - 1);
+  let x_383 : i32 = *(l);
+  j_1 = x_383;
+  loop {
+    let x_388 : i32 = j_1;
+    let x_389 : i32 = *(h);
+    if ((x_388 <= (x_389 - 1))) {
+    } else {
+      break;
+    }
+    let x_393 : i32 = j_1;
+    let x_395 : i32 = obj.numbers[x_393];
+    let x_396 : i32 = pivot;
+    if ((x_395 <= x_396)) {
+      let x_400 : i32 = i_1;
+      i_1 = (x_400 + 1);
+      let x_402 : i32 = i_1;
+      param = x_402;
+      let x_403 : i32 = j_1;
+      param_1 = x_403;
+      swap_i1_i1_(&(param), &(param_1));
+    }
+
+    continuing {
+      let x_405 : i32 = j_1;
+      j_1 = (x_405 + 1);
+    }
+  }
+  let x_407 : i32 = i_1;
+  param_2 = (x_407 + 1);
+  let x_409 : i32 = *(h);
+  param_3 = x_409;
+  swap_i1_i1_(&(param_2), &(param_3));
+  let x_411 : i32 = i_1;
+  return (x_411 + 1);
+}
+
+fn quicksort_() {
+  var l_1 : i32;
+  var h_1 : i32;
+  var top : i32;
+  var stack : array<i32, 10>;
+  var p : i32;
+  var param_4 : i32;
+  var param_5 : i32;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  let x_414 : i32 = top;
+  let x_415 : i32 = (x_414 + 1);
+  top = x_415;
+  let x_416 : i32 = l_1;
+  stack[x_415] = x_416;
+  let x_418 : i32 = top;
+  let x_419 : i32 = (x_418 + 1);
+  top = x_419;
+  let x_420 : i32 = h_1;
+  stack[x_419] = x_420;
+  loop {
+    let x_426 : i32 = top;
+    if ((x_426 >= 0)) {
+    } else {
+      break;
+    }
+    let x_429 : i32 = top;
+    top = (x_429 - 1);
+    let x_432 : i32 = stack[x_429];
+    h_1 = x_432;
+    let x_433 : i32 = top;
+    top = (x_433 - 1);
+    let x_436 : i32 = stack[x_433];
+    l_1 = x_436;
+    let x_437 : i32 = l_1;
+    param_4 = x_437;
+    let x_438 : i32 = h_1;
+    param_5 = x_438;
+    let x_439 : i32 = performPartition_i1_i1_(&(param_4), &(param_5));
+    p = x_439;
+    let x_440 : i32 = p;
+    let x_442 : i32 = l_1;
+    if (((x_440 - 1) > x_442)) {
+      let x_446 : i32 = top;
+      let x_447 : i32 = (x_446 + 1);
+      top = x_447;
+      let x_448 : i32 = l_1;
+      stack[x_447] = x_448;
+      let x_450 : i32 = top;
+      let x_451 : i32 = (x_450 + 1);
+      top = x_451;
+      let x_452 : i32 = p;
+      stack[x_451] = (x_452 - 1);
+    }
+    let x_455 : i32 = p;
+    let x_457 : i32 = h_1;
+    if (((x_455 + 1) < x_457)) {
+      let x_461 : i32 = top;
+      let x_462 : i32 = (x_461 + 1);
+      top = x_462;
+      let x_463 : i32 = p;
+      stack[x_462] = (x_463 + 1);
+      let x_466 : i32 = top;
+      let x_467 : i32 = (x_466 + 1);
+      top = x_467;
+      let x_468 : i32 = h_1;
+      stack[x_467] = x_468;
+    }
+  }
+  return;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/2.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/2.spvasm
new file mode 100644
index 0000000..2355739
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/2.spvasm
@@ -0,0 +1,636 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %_GLF_pos %frag_color %__0
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %swap_i1_i1_ "swap(i1;i1;"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %performPartition_i1_i1_ "performPartition(i1;i1;"
+               OpName %l "l"
+               OpName %h "h"
+               OpName %quicksort_ "quicksort("
+               OpName %temp "temp"
+               OpName %QuicksortObject "QuicksortObject"
+               OpMemberName %QuicksortObject 0 "numbers"
+               OpName %obj "obj"
+               OpName %pivot "pivot"
+               OpName %i_0 "i"
+               OpName %j_0 "j"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %param_1 "param"
+               OpName %param_2 "param"
+               OpName %l_0 "l"
+               OpName %h_0 "h"
+               OpName %top "top"
+               OpName %stack "stack"
+               OpName %p "p"
+               OpName %param_3 "param"
+               OpName %param_4 "param"
+               OpName %_GLF_FragCoord "_GLF_FragCoord"
+               OpName %_GLF_pos "_GLF_pos"
+               OpName %i_1 "i"
+               OpName %uv "uv"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %color "color"
+               OpName %frag_color "frag_color"
+               OpName %gl_PerVertex "gl_PerVertex"
+               OpMemberName %gl_PerVertex 0 "gl_Position"
+               OpMemberName %gl_PerVertex 1 "gl_PointSize"
+               OpName %__0 ""
+               OpDecorate %_GLF_pos Location 0
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %frag_color Location 0
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpDecorate %gl_PerVertex Block
+       %void = OpTypeVoid
+         %38 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %41 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+         %42 = OpTypeFunction %int %_ptr_Function_int %_ptr_Function_int
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%QuicksortObject = OpTypeStruct %_arr_int_uint_10
+%_ptr_Private_QuicksortObject = OpTypePointer Private %QuicksortObject
+        %obj = OpVariable %_ptr_Private_QuicksortObject Private
+      %int_0 = OpConstant %int 0
+%_ptr_Private_int = OpTypePointer Private %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+      %int_9 = OpConstant %int 9
+     %int_n1 = OpConstant %int -1
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+%_GLF_FragCoord = OpVariable %_ptr_Private_v4float Private
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+   %_GLF_pos = OpVariable %_ptr_Input_v4float Input
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %61 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_0
+  %float_128 = OpConstant %float 128
+         %63 = OpConstantComposite %v4float %float_128 %float_128 %float_1 %float_1
+     %int_10 = OpConstant %int 10
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+         %73 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+ %float_0_25 = OpConstant %float 0.25
+  %float_0_5 = OpConstant %float 0.5
+      %int_2 = OpConstant %int 2
+     %uint_1 = OpConstant %uint 1
+ %float_0_75 = OpConstant %float 0.75
+      %int_3 = OpConstant %int 3
+     %uint_2 = OpConstant %uint 2
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %frag_color = OpVariable %_ptr_Output_v4float Output
+%gl_PerVertex = OpTypeStruct %v4float %float
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+        %__0 = OpVariable %_ptr_Output_gl_PerVertex Output
+       %main = OpFunction %void None %38
+         %90 = OpLabel
+         %91 = OpVariable %_ptr_Function_int Function
+         %92 = OpVariable %_ptr_Function_int Function
+         %93 = OpVariable %_ptr_Function_int Function
+         %94 = OpVariable %_ptr_Function__arr_int_uint_10 Function
+         %95 = OpVariable %_ptr_Function_int Function
+         %96 = OpVariable %_ptr_Function_int Function
+         %97 = OpVariable %_ptr_Function_int Function
+        %i_1 = OpVariable %_ptr_Function_int Function
+         %uv = OpVariable %_ptr_Function_v2float Function
+      %color = OpVariable %_ptr_Function_v3float Function
+         %98 = OpLoad %v4float %_GLF_pos
+         %99 = OpFAdd %v4float %98 %61
+        %100 = OpFMul %v4float %99 %63
+               OpStore %_GLF_FragCoord %100
+               OpStore %i_1 %int_0
+               OpBranch %101
+        %101 = OpLabel
+               OpLoopMerge %102 %103 None
+               OpBranch %104
+        %104 = OpLabel
+        %105 = OpLoad %int %i_1
+        %106 = OpSLessThan %bool %105 %int_10
+               OpBranchConditional %106 %107 %102
+        %107 = OpLabel
+        %108 = OpLoad %int %i_1
+        %109 = OpLoad %int %i_1
+        %110 = OpISub %int %int_10 %109
+        %111 = OpAccessChain %_ptr_Private_int %obj %int_0 %108
+               OpStore %111 %110
+        %112 = OpLoad %int %i_1
+        %113 = OpLoad %int %i_1
+        %114 = OpAccessChain %_ptr_Private_int %obj %int_0 %113
+        %115 = OpLoad %int %114
+        %116 = OpLoad %int %i_1
+        %117 = OpAccessChain %_ptr_Private_int %obj %int_0 %116
+        %118 = OpLoad %int %117
+        %119 = OpIMul %int %115 %118
+        %120 = OpAccessChain %_ptr_Private_int %obj %int_0 %112
+               OpStore %120 %119
+               OpBranch %103
+        %103 = OpLabel
+        %121 = OpLoad %int %i_1
+        %122 = OpIAdd %int %121 %int_1
+               OpStore %i_1 %122
+               OpBranch %101
+        %102 = OpLabel
+               OpStore %91 %int_0
+               OpStore %92 %int_9
+               OpStore %93 %int_n1
+        %123 = OpLoad %int %93
+        %124 = OpIAdd %int %123 %int_1
+               OpStore %93 %124
+        %125 = OpLoad %int %91
+        %126 = OpAccessChain %_ptr_Function_int %94 %124
+               OpStore %126 %125
+        %127 = OpLoad %int %93
+        %128 = OpIAdd %int %127 %int_1
+               OpStore %93 %128
+        %129 = OpLoad %int %92
+        %130 = OpAccessChain %_ptr_Function_int %94 %128
+               OpStore %130 %129
+               OpBranch %131
+        %131 = OpLabel
+               OpLoopMerge %132 %133 None
+               OpBranch %134
+        %134 = OpLabel
+        %135 = OpLoad %int %93
+        %136 = OpSGreaterThanEqual %bool %135 %int_0
+               OpBranchConditional %136 %137 %132
+        %137 = OpLabel
+        %138 = OpLoad %int %93
+        %139 = OpISub %int %138 %int_1
+               OpStore %93 %139
+        %140 = OpAccessChain %_ptr_Function_int %94 %138
+        %141 = OpLoad %int %140
+               OpStore %92 %141
+        %142 = OpLoad %int %93
+        %143 = OpISub %int %142 %int_1
+               OpStore %93 %143
+        %144 = OpAccessChain %_ptr_Function_int %94 %142
+        %145 = OpLoad %int %144
+               OpStore %91 %145
+        %146 = OpLoad %int %91
+               OpStore %96 %146
+        %147 = OpLoad %int %92
+               OpStore %97 %147
+        %148 = OpFunctionCall %int %performPartition_i1_i1_ %96 %97
+               OpStore %95 %148
+        %149 = OpLoad %int %95
+        %150 = OpISub %int %149 %int_1
+        %151 = OpLoad %int %91
+        %152 = OpSGreaterThan %bool %150 %151
+               OpSelectionMerge %153 None
+               OpBranchConditional %152 %154 %153
+        %154 = OpLabel
+        %155 = OpLoad %int %93
+        %156 = OpIAdd %int %155 %int_1
+               OpStore %93 %156
+        %157 = OpLoad %int %91
+        %158 = OpAccessChain %_ptr_Function_int %94 %156
+               OpStore %158 %157
+        %159 = OpLoad %int %93
+        %160 = OpIAdd %int %159 %int_1
+               OpStore %93 %160
+        %161 = OpLoad %int %95
+        %162 = OpISub %int %161 %int_1
+        %163 = OpAccessChain %_ptr_Function_int %94 %160
+               OpStore %163 %162
+               OpBranch %153
+        %153 = OpLabel
+        %164 = OpLoad %int %95
+        %165 = OpIAdd %int %164 %int_1
+        %166 = OpLoad %int %92
+        %167 = OpSLessThan %bool %165 %166
+               OpSelectionMerge %168 None
+               OpBranchConditional %167 %169 %168
+        %169 = OpLabel
+        %170 = OpLoad %int %93
+        %171 = OpIAdd %int %170 %int_1
+               OpStore %93 %171
+        %172 = OpLoad %int %95
+        %173 = OpIAdd %int %172 %int_1
+        %174 = OpAccessChain %_ptr_Function_int %94 %171
+               OpStore %174 %173
+        %175 = OpLoad %int %93
+        %176 = OpIAdd %int %175 %int_1
+               OpStore %93 %176
+        %177 = OpLoad %int %92
+        %178 = OpAccessChain %_ptr_Function_int %94 %176
+               OpStore %178 %177
+               OpBranch %168
+        %168 = OpLabel
+               OpBranch %133
+        %133 = OpLabel
+               OpBranch %131
+        %132 = OpLabel
+        %179 = OpLoad %v4float %_GLF_FragCoord
+        %180 = OpVectorShuffle %v2float %179 %179 0 1
+        %181 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+        %182 = OpLoad %v2float %181
+        %183 = OpFDiv %v2float %180 %182
+               OpStore %uv %183
+               OpStore %color %73
+        %184 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_0
+        %185 = OpLoad %int %184
+        %186 = OpConvertSToF %float %185
+        %187 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %188 = OpLoad %float %187
+        %189 = OpFAdd %float %188 %186
+        %190 = OpAccessChain %_ptr_Function_float %color %uint_0
+               OpStore %190 %189
+        %191 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %192 = OpLoad %float %191
+        %193 = OpFOrdGreaterThan %bool %192 %float_0_25
+               OpSelectionMerge %194 None
+               OpBranchConditional %193 %195 %194
+        %195 = OpLabel
+        %196 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_1
+        %197 = OpLoad %int %196
+        %198 = OpConvertSToF %float %197
+        %199 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %200 = OpLoad %float %199
+        %201 = OpFAdd %float %200 %198
+        %202 = OpAccessChain %_ptr_Function_float %color %uint_0
+               OpStore %202 %201
+               OpBranch %194
+        %194 = OpLabel
+        %203 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %204 = OpLoad %float %203
+        %205 = OpFOrdGreaterThan %bool %204 %float_0_5
+               OpSelectionMerge %206 None
+               OpBranchConditional %205 %207 %206
+        %207 = OpLabel
+        %208 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_2
+        %209 = OpLoad %int %208
+        %210 = OpConvertSToF %float %209
+        %211 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %212 = OpLoad %float %211
+        %213 = OpFAdd %float %212 %210
+        %214 = OpAccessChain %_ptr_Function_float %color %uint_1
+               OpStore %214 %213
+               OpBranch %206
+        %206 = OpLabel
+        %215 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %216 = OpLoad %float %215
+        %217 = OpFOrdGreaterThan %bool %216 %float_0_75
+               OpSelectionMerge %218 None
+               OpBranchConditional %217 %219 %218
+        %219 = OpLabel
+        %220 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_3
+        %221 = OpLoad %int %220
+        %222 = OpConvertSToF %float %221
+        %223 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %224 = OpLoad %float %223
+        %225 = OpFAdd %float %224 %222
+        %226 = OpAccessChain %_ptr_Function_float %color %uint_2
+               OpStore %226 %225
+               OpBranch %218
+        %218 = OpLabel
+        %227 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_4
+        %228 = OpLoad %int %227
+        %229 = OpConvertSToF %float %228
+        %230 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %231 = OpLoad %float %230
+        %232 = OpFAdd %float %231 %229
+        %233 = OpAccessChain %_ptr_Function_float %color %uint_1
+               OpStore %233 %232
+        %234 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %235 = OpLoad %float %234
+        %236 = OpFOrdGreaterThan %bool %235 %float_0_25
+               OpSelectionMerge %237 None
+               OpBranchConditional %236 %238 %237
+        %238 = OpLabel
+        %239 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_5
+        %240 = OpLoad %int %239
+        %241 = OpConvertSToF %float %240
+        %242 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %243 = OpLoad %float %242
+        %244 = OpFAdd %float %243 %241
+        %245 = OpAccessChain %_ptr_Function_float %color %uint_0
+               OpStore %245 %244
+               OpBranch %237
+        %237 = OpLabel
+        %246 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %247 = OpLoad %float %246
+        %248 = OpFOrdGreaterThan %bool %247 %float_0_5
+               OpSelectionMerge %249 None
+               OpBranchConditional %248 %250 %249
+        %250 = OpLabel
+        %251 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_6
+        %252 = OpLoad %int %251
+        %253 = OpConvertSToF %float %252
+        %254 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %255 = OpLoad %float %254
+        %256 = OpFAdd %float %255 %253
+        %257 = OpAccessChain %_ptr_Function_float %color %uint_1
+               OpStore %257 %256
+               OpBranch %249
+        %249 = OpLabel
+        %258 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %259 = OpLoad %float %258
+        %260 = OpFOrdGreaterThan %bool %259 %float_0_75
+               OpSelectionMerge %261 None
+               OpBranchConditional %260 %262 %261
+        %262 = OpLabel
+        %263 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_7
+        %264 = OpLoad %int %263
+        %265 = OpConvertSToF %float %264
+        %266 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %267 = OpLoad %float %266
+        %268 = OpFAdd %float %267 %265
+        %269 = OpAccessChain %_ptr_Function_float %color %uint_2
+               OpStore %269 %268
+               OpBranch %261
+        %261 = OpLabel
+        %270 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_8
+        %271 = OpLoad %int %270
+        %272 = OpConvertSToF %float %271
+        %273 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %274 = OpLoad %float %273
+        %275 = OpFAdd %float %274 %272
+        %276 = OpAccessChain %_ptr_Function_float %color %uint_2
+               OpStore %276 %275
+        %277 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %278 = OpLoad %float %277
+        %279 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %280 = OpLoad %float %279
+        %281 = OpFSub %float %278 %280
+        %282 = OpExtInst %float %1 FAbs %281
+        %283 = OpFOrdLessThan %bool %282 %float_0_25
+               OpSelectionMerge %284 None
+               OpBranchConditional %283 %285 %284
+        %285 = OpLabel
+        %286 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_9
+        %287 = OpLoad %int %286
+        %288 = OpConvertSToF %float %287
+        %289 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %290 = OpLoad %float %289
+        %291 = OpFAdd %float %290 %288
+        %292 = OpAccessChain %_ptr_Function_float %color %uint_0
+               OpStore %292 %291
+               OpBranch %284
+        %284 = OpLabel
+        %293 = OpLoad %v3float %color
+        %294 = OpExtInst %v3float %1 Normalize %293
+        %295 = OpCompositeExtract %float %294 0
+        %296 = OpCompositeExtract %float %294 1
+        %297 = OpCompositeExtract %float %294 2
+        %298 = OpCompositeConstruct %v4float %295 %296 %297 %float_1
+               OpStore %frag_color %298
+        %299 = OpLoad %v4float %_GLF_pos
+        %300 = OpAccessChain %_ptr_Output_v4float %__0 %int_0
+               OpStore %300 %299
+               OpReturn
+               OpFunctionEnd
+%swap_i1_i1_ = OpFunction %void None %41
+          %i = OpFunctionParameter %_ptr_Function_int
+          %j = OpFunctionParameter %_ptr_Function_int
+        %301 = OpLabel
+       %temp = OpVariable %_ptr_Function_int Function
+        %302 = OpLoad %int %i
+        %303 = OpAccessChain %_ptr_Private_int %obj %int_0 %302
+        %304 = OpLoad %int %303
+               OpStore %temp %304
+        %305 = OpLoad %int %i
+        %306 = OpLoad %int %j
+        %307 = OpAccessChain %_ptr_Private_int %obj %int_0 %306
+        %308 = OpLoad %int %307
+        %309 = OpAccessChain %_ptr_Private_int %obj %int_0 %305
+               OpStore %309 %308
+        %310 = OpLoad %int %j
+        %311 = OpLoad %int %temp
+        %312 = OpAccessChain %_ptr_Private_int %obj %int_0 %310
+               OpStore %312 %311
+               OpReturn
+               OpFunctionEnd
+%performPartition_i1_i1_ = OpFunction %int None %42
+          %l = OpFunctionParameter %_ptr_Function_int
+          %h = OpFunctionParameter %_ptr_Function_int
+        %313 = OpLabel
+        %314 = OpVariable %_ptr_Function_int Function
+        %315 = OpVariable %_ptr_Function_int Function
+      %pivot = OpVariable %_ptr_Function_int Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+        %j_0 = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_int Function
+    %param_0 = OpVariable %_ptr_Function_int Function
+    %param_1 = OpVariable %_ptr_Function_int Function
+    %param_2 = OpVariable %_ptr_Function_int Function
+        %316 = OpLoad %int %h
+        %317 = OpAccessChain %_ptr_Private_int %obj %int_0 %316
+        %318 = OpLoad %int %317
+               OpStore %pivot %318
+        %319 = OpLoad %int %l
+        %320 = OpISub %int %319 %int_1
+               OpStore %i_0 %320
+        %321 = OpLoad %int %l
+               OpStore %j_0 %321
+               OpBranch %322
+        %322 = OpLabel
+               OpLoopMerge %323 %324 None
+               OpBranch %325
+        %325 = OpLabel
+        %326 = OpLoad %int %j_0
+        %327 = OpLoad %int %h
+        %328 = OpISub %int %327 %int_1
+        %329 = OpSLessThanEqual %bool %326 %328
+               OpBranchConditional %329 %330 %323
+        %330 = OpLabel
+        %331 = OpLoad %int %j_0
+        %332 = OpAccessChain %_ptr_Private_int %obj %int_0 %331
+        %333 = OpLoad %int %332
+        %334 = OpLoad %int %pivot
+        %335 = OpSLessThanEqual %bool %333 %334
+               OpSelectionMerge %336 None
+               OpBranchConditional %335 %337 %336
+        %337 = OpLabel
+        %338 = OpLoad %int %i_0
+        %339 = OpIAdd %int %338 %int_1
+               OpStore %i_0 %339
+        %340 = OpLoad %int %i_0
+               OpStore %param %340
+        %341 = OpLoad %int %j_0
+               OpStore %param_0 %341
+        %342 = OpLoad %int %param
+        %343 = OpAccessChain %_ptr_Private_int %obj %int_0 %342
+        %344 = OpLoad %int %343
+               OpStore %315 %344
+        %345 = OpLoad %int %param
+        %346 = OpLoad %int %param_0
+        %347 = OpAccessChain %_ptr_Private_int %obj %int_0 %346
+        %348 = OpLoad %int %347
+        %349 = OpAccessChain %_ptr_Private_int %obj %int_0 %345
+               OpStore %349 %348
+        %350 = OpLoad %int %param_0
+        %351 = OpLoad %int %315
+        %352 = OpAccessChain %_ptr_Private_int %obj %int_0 %350
+               OpStore %352 %351
+               OpBranch %336
+        %336 = OpLabel
+               OpBranch %324
+        %324 = OpLabel
+        %353 = OpLoad %int %j_0
+        %354 = OpIAdd %int %353 %int_1
+               OpStore %j_0 %354
+               OpBranch %322
+        %323 = OpLabel
+        %355 = OpLoad %int %i_0
+        %356 = OpIAdd %int %355 %int_1
+               OpStore %param_1 %356
+        %357 = OpLoad %int %h
+               OpStore %param_2 %357
+        %358 = OpLoad %int %param_1
+        %359 = OpAccessChain %_ptr_Private_int %obj %int_0 %358
+        %360 = OpLoad %int %359
+               OpStore %314 %360
+        %361 = OpLoad %int %param_1
+        %362 = OpLoad %int %param_2
+        %363 = OpAccessChain %_ptr_Private_int %obj %int_0 %362
+        %364 = OpLoad %int %363
+        %365 = OpAccessChain %_ptr_Private_int %obj %int_0 %361
+               OpStore %365 %364
+        %366 = OpLoad %int %param_2
+        %367 = OpLoad %int %314
+        %368 = OpAccessChain %_ptr_Private_int %obj %int_0 %366
+               OpStore %368 %367
+               OpSelectionMerge %369 None
+               OpBranchConditional %false %370 %371
+        %370 = OpLabel
+               OpBranch %369
+        %371 = OpLabel
+        %372 = OpLoad %int %i_0
+        %373 = OpIAdd %int %372 %int_1
+               OpReturnValue %373
+        %369 = OpLabel
+        %374 = OpUndef %int
+               OpReturnValue %374
+               OpFunctionEnd
+ %quicksort_ = OpFunction %void None %38
+        %375 = OpLabel
+        %l_0 = OpVariable %_ptr_Function_int Function
+        %h_0 = OpVariable %_ptr_Function_int Function
+        %top = OpVariable %_ptr_Function_int Function
+      %stack = OpVariable %_ptr_Function__arr_int_uint_10 Function
+          %p = OpVariable %_ptr_Function_int Function
+    %param_3 = OpVariable %_ptr_Function_int Function
+    %param_4 = OpVariable %_ptr_Function_int Function
+               OpStore %l_0 %int_0
+               OpStore %h_0 %int_9
+               OpStore %top %int_n1
+        %376 = OpLoad %int %top
+        %377 = OpIAdd %int %376 %int_1
+               OpStore %top %377
+        %378 = OpLoad %int %l_0
+        %379 = OpAccessChain %_ptr_Function_int %stack %377
+               OpStore %379 %378
+        %380 = OpLoad %int %top
+        %381 = OpIAdd %int %380 %int_1
+               OpStore %top %381
+        %382 = OpLoad %int %h_0
+        %383 = OpAccessChain %_ptr_Function_int %stack %381
+               OpStore %383 %382
+               OpBranch %384
+        %384 = OpLabel
+               OpLoopMerge %385 %386 None
+               OpBranch %387
+        %387 = OpLabel
+        %388 = OpLoad %int %top
+        %389 = OpSGreaterThanEqual %bool %388 %int_0
+               OpBranchConditional %389 %390 %385
+        %390 = OpLabel
+        %391 = OpLoad %int %top
+        %392 = OpISub %int %391 %int_1
+               OpStore %top %392
+        %393 = OpAccessChain %_ptr_Function_int %stack %391
+        %394 = OpLoad %int %393
+               OpStore %h_0 %394
+        %395 = OpLoad %int %top
+        %396 = OpISub %int %395 %int_1
+               OpStore %top %396
+        %397 = OpAccessChain %_ptr_Function_int %stack %395
+        %398 = OpLoad %int %397
+               OpStore %l_0 %398
+        %399 = OpLoad %int %l_0
+               OpStore %param_3 %399
+        %400 = OpLoad %int %h_0
+               OpStore %param_4 %400
+        %401 = OpFunctionCall %int %performPartition_i1_i1_ %param_3 %param_4
+               OpStore %p %401
+        %402 = OpLoad %int %p
+        %403 = OpISub %int %402 %int_1
+        %404 = OpLoad %int %l_0
+        %405 = OpSGreaterThan %bool %403 %404
+               OpSelectionMerge %406 None
+               OpBranchConditional %405 %407 %406
+        %407 = OpLabel
+        %408 = OpLoad %int %top
+        %409 = OpIAdd %int %408 %int_1
+               OpStore %top %409
+        %410 = OpLoad %int %l_0
+        %411 = OpAccessChain %_ptr_Function_int %stack %409
+               OpStore %411 %410
+        %412 = OpLoad %int %top
+        %413 = OpIAdd %int %412 %int_1
+               OpStore %top %413
+        %414 = OpLoad %int %p
+        %415 = OpISub %int %414 %int_1
+        %416 = OpAccessChain %_ptr_Function_int %stack %413
+               OpStore %416 %415
+               OpBranch %406
+        %406 = OpLabel
+        %417 = OpLoad %int %p
+        %418 = OpIAdd %int %417 %int_1
+        %419 = OpLoad %int %h_0
+        %420 = OpSLessThan %bool %418 %419
+               OpSelectionMerge %421 None
+               OpBranchConditional %420 %422 %421
+        %422 = OpLabel
+        %423 = OpLoad %int %top
+        %424 = OpIAdd %int %423 %int_1
+               OpStore %top %424
+        %425 = OpLoad %int %p
+        %426 = OpIAdd %int %425 %int_1
+        %427 = OpAccessChain %_ptr_Function_int %stack %424
+               OpStore %427 %426
+        %428 = OpLoad %int %top
+        %429 = OpIAdd %int %428 %int_1
+               OpStore %top %429
+        %430 = OpLoad %int %h_0
+        %431 = OpAccessChain %_ptr_Function_int %stack %429
+               OpStore %431 %430
+               OpBranch %421
+        %421 = OpLabel
+               OpBranch %386
+        %386 = OpLabel
+               OpBranch %384
+        %385 = OpLabel
+               OpReturn
+               OpFunctionEnd
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
new file mode 100644
index 0000000..dd128c4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/2.spvasm.expected.hlsl
@@ -0,0 +1,284 @@
+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;
+  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;
+  {
+    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;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 x_GLF_pos_param = tint_symbol.x_GLF_pos_param;
+  x_GLF_pos = x_GLF_pos_param;
+  main_1();
+  const main_out tint_symbol_3 = {frag_color, gl_Position};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.frag_color_1, tint_symbol_3.gl_Position};
+  return tint_symbol_5;
+}
+
+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;
+  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;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/2.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/2.spvasm.expected.msl
new file mode 100644
index 0000000..f6f5a8a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/2.spvasm.expected.msl
@@ -0,0 +1,358 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct QuicksortObject {
+  tint_array_wrapper numbers;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 frag_color_1;
+  float4 gl_Position;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_pos_param [[attribute(0)]];
+};
+struct tint_symbol_3 {
+  float4 frag_color_1 [[user(locn0)]];
+  float4 gl_Position [[position]];
+};
+
+int performPartition_i1_i1_(thread int* const l, thread int* const h, thread QuicksortObject* const tint_symbol_6) {
+  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;
+  int const x_316 = *(h);
+  int const x_318 = (*(tint_symbol_6)).numbers.arr[x_316];
+  pivot = x_318;
+  int const x_319 = *(l);
+  i_1 = (x_319 - 1);
+  int const x_321 = *(l);
+  j_1 = x_321;
+  while (true) {
+    int const x_326 = j_1;
+    int const x_327 = *(h);
+    if ((x_326 <= (x_327 - 1))) {
+    } else {
+      break;
+    }
+    int const x_331 = j_1;
+    int const x_333 = (*(tint_symbol_6)).numbers.arr[x_331];
+    int const x_334 = pivot;
+    if ((x_333 <= x_334)) {
+      int const x_338 = i_1;
+      i_1 = (x_338 + 1);
+      int const x_340 = i_1;
+      param = x_340;
+      int const x_341 = j_1;
+      param_1 = x_341;
+      int const x_342 = param;
+      int const x_344 = (*(tint_symbol_6)).numbers.arr[x_342];
+      x_315 = x_344;
+      int const x_345 = param;
+      int const x_346 = param_1;
+      int const x_348 = (*(tint_symbol_6)).numbers.arr[x_346];
+      (*(tint_symbol_6)).numbers.arr[x_345] = x_348;
+      int const x_350 = param_1;
+      int const x_351 = x_315;
+      (*(tint_symbol_6)).numbers.arr[x_350] = x_351;
+    }
+    {
+      int const x_353 = j_1;
+      j_1 = (x_353 + 1);
+    }
+  }
+  int const x_355 = i_1;
+  param_2 = (x_355 + 1);
+  int const x_357 = *(h);
+  param_3 = x_357;
+  int const x_358 = param_2;
+  int const x_360 = (*(tint_symbol_6)).numbers.arr[x_358];
+  x_314 = x_360;
+  int const x_361 = param_2;
+  int const x_362 = param_3;
+  int const x_364 = (*(tint_symbol_6)).numbers.arr[x_362];
+  (*(tint_symbol_6)).numbers.arr[x_361] = x_364;
+  int const x_366 = param_3;
+  int const x_367 = x_314;
+  (*(tint_symbol_6)).numbers.arr[x_366] = x_367;
+  if (false) {
+  } else {
+    int const x_372 = i_1;
+    return (x_372 + 1);
+  }
+  return 0;
+}
+
+void main_1(constant buf0& x_34, thread float4* const tint_symbol_7, thread float4* const tint_symbol_8, thread QuicksortObject* const tint_symbol_9, thread float4* const tint_symbol_10, thread float4* const tint_symbol_11) {
+  int x_91 = 0;
+  int x_92 = 0;
+  int x_93 = 0;
+  tint_array_wrapper x_94 = {};
+  int x_95 = 0;
+  int x_96 = 0;
+  int x_97 = 0;
+  int i_2 = 0;
+  float2 uv = 0.0f;
+  float3 color = 0.0f;
+  float4 const x_98 = *(tint_symbol_7);
+  *(tint_symbol_8) = ((x_98 + float4(1.0f, 1.0f, 0.0f, 0.0f)) * float4(128.0f, 128.0f, 1.0f, 1.0f));
+  i_2 = 0;
+  while (true) {
+    int const x_105 = i_2;
+    if ((x_105 < 10)) {
+    } else {
+      break;
+    }
+    int const x_108 = i_2;
+    int const x_109 = i_2;
+    (*(tint_symbol_9)).numbers.arr[x_108] = (10 - x_109);
+    int const x_112 = i_2;
+    int const x_113 = i_2;
+    int const x_115 = (*(tint_symbol_9)).numbers.arr[x_113];
+    int const x_116 = i_2;
+    int const x_118 = (*(tint_symbol_9)).numbers.arr[x_116];
+    (*(tint_symbol_9)).numbers.arr[x_112] = (x_115 * x_118);
+    {
+      int const x_121 = i_2;
+      i_2 = (x_121 + 1);
+    }
+  }
+  x_91 = 0;
+  x_92 = 9;
+  x_93 = -1;
+  int const x_123 = x_93;
+  int const x_124 = (x_123 + 1);
+  x_93 = x_124;
+  int const x_125 = x_91;
+  x_94.arr[x_124] = x_125;
+  int const x_127 = x_93;
+  int const x_128 = (x_127 + 1);
+  x_93 = x_128;
+  int const x_129 = x_92;
+  x_94.arr[x_128] = x_129;
+  while (true) {
+    int const x_135 = x_93;
+    if ((x_135 >= 0)) {
+    } else {
+      break;
+    }
+    int const x_138 = x_93;
+    x_93 = (x_138 - 1);
+    int const x_141 = x_94.arr[x_138];
+    x_92 = x_141;
+    int const x_142 = x_93;
+    x_93 = (x_142 - 1);
+    int const x_145 = x_94.arr[x_142];
+    x_91 = x_145;
+    int const x_146 = x_91;
+    x_96 = x_146;
+    int const x_147 = x_92;
+    x_97 = x_147;
+    int const x_148 = performPartition_i1_i1_(&(x_96), &(x_97), tint_symbol_9);
+    x_95 = x_148;
+    int const x_149 = x_95;
+    int const x_151 = x_91;
+    if (((x_149 - 1) > x_151)) {
+      int const x_155 = x_93;
+      int const x_156 = (x_155 + 1);
+      x_93 = x_156;
+      int const x_157 = x_91;
+      x_94.arr[x_156] = x_157;
+      int const x_159 = x_93;
+      int const x_160 = (x_159 + 1);
+      x_93 = x_160;
+      int const x_161 = x_95;
+      x_94.arr[x_160] = (x_161 - 1);
+    }
+    int const x_164 = x_95;
+    int const x_166 = x_92;
+    if (((x_164 + 1) < x_166)) {
+      int const x_170 = x_93;
+      int const x_171 = (x_170 + 1);
+      x_93 = x_171;
+      int const x_172 = x_95;
+      x_94.arr[x_171] = (x_172 + 1);
+      int const x_175 = x_93;
+      int const x_176 = (x_175 + 1);
+      x_93 = x_176;
+      int const x_177 = x_92;
+      x_94.arr[x_176] = x_177;
+    }
+  }
+  float4 const x_179 = *(tint_symbol_8);
+  float2 const x_182 = x_34.resolution;
+  uv = (float2(x_179.x, x_179.y) / x_182);
+  color = float3(1.0f, 2.0f, 3.0f);
+  int const x_185 = (*(tint_symbol_9)).numbers.arr[0];
+  float const x_188 = color.x;
+  color.x = (x_188 + float(x_185));
+  float const x_192 = uv.x;
+  if ((x_192 > 0.25f)) {
+    int const x_197 = (*(tint_symbol_9)).numbers.arr[1];
+    float const x_200 = color.x;
+    color.x = (x_200 + float(x_197));
+  }
+  float const x_204 = uv.x;
+  if ((x_204 > 0.5f)) {
+    int const x_209 = (*(tint_symbol_9)).numbers.arr[2];
+    float const x_212 = color.y;
+    color.y = (x_212 + float(x_209));
+  }
+  float const x_216 = uv.x;
+  if ((x_216 > 0.75f)) {
+    int const x_221 = (*(tint_symbol_9)).numbers.arr[3];
+    float const x_224 = color.z;
+    color.z = (x_224 + float(x_221));
+  }
+  int const x_228 = (*(tint_symbol_9)).numbers.arr[4];
+  float const x_231 = color.y;
+  color.y = (x_231 + float(x_228));
+  float const x_235 = uv.y;
+  if ((x_235 > 0.25f)) {
+    int const x_240 = (*(tint_symbol_9)).numbers.arr[5];
+    float const x_243 = color.x;
+    color.x = (x_243 + float(x_240));
+  }
+  float const x_247 = uv.y;
+  if ((x_247 > 0.5f)) {
+    int const x_252 = (*(tint_symbol_9)).numbers.arr[6];
+    float const x_255 = color.y;
+    color.y = (x_255 + float(x_252));
+  }
+  float const x_259 = uv.y;
+  if ((x_259 > 0.75f)) {
+    int const x_264 = (*(tint_symbol_9)).numbers.arr[7];
+    float const x_267 = color.z;
+    color.z = (x_267 + float(x_264));
+  }
+  int const x_271 = (*(tint_symbol_9)).numbers.arr[8];
+  float const x_274 = color.z;
+  color.z = (x_274 + float(x_271));
+  float const x_278 = uv.x;
+  float const x_280 = uv.y;
+  if ((fabs((x_278 - x_280)) < 0.25f)) {
+    int const x_287 = (*(tint_symbol_9)).numbers.arr[9];
+    float const x_290 = color.x;
+    color.x = (x_290 + float(x_287));
+  }
+  float3 const x_293 = color;
+  float3 const x_294 = normalize(x_293);
+  *(tint_symbol_10) = float4(x_294.x, x_294.y, x_294.z, 1.0f);
+  float4 const x_299 = *(tint_symbol_7);
+  *(tint_symbol_11) = x_299;
+  return;
+}
+
+vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]], constant buf0& x_34 [[buffer(0)]]) {
+  thread float4 tint_symbol_12 = 0.0f;
+  thread float4 tint_symbol_13 = 0.0f;
+  thread QuicksortObject tint_symbol_14 = {};
+  thread float4 tint_symbol_15 = 0.0f;
+  thread float4 tint_symbol_16 = 0.0f;
+  float4 const x_GLF_pos_param = tint_symbol_1.x_GLF_pos_param;
+  tint_symbol_12 = x_GLF_pos_param;
+  main_1(x_34, &(tint_symbol_12), &(tint_symbol_13), &(tint_symbol_14), &(tint_symbol_15), &(tint_symbol_16));
+  main_out const tint_symbol_4 = {.frag_color_1=tint_symbol_15, .gl_Position=tint_symbol_16};
+  tint_symbol_3 const tint_symbol_5 = {.frag_color_1=tint_symbol_4.frag_color_1, .gl_Position=tint_symbol_4.gl_Position};
+  return tint_symbol_5;
+}
+
+void swap_i1_i1_(thread int* const i, thread int* const j, thread QuicksortObject* const tint_symbol_17) {
+  int temp = 0;
+  int const x_302 = *(i);
+  int const x_304 = (*(tint_symbol_17)).numbers.arr[x_302];
+  temp = x_304;
+  int const x_305 = *(i);
+  int const x_306 = *(j);
+  int const x_308 = (*(tint_symbol_17)).numbers.arr[x_306];
+  (*(tint_symbol_17)).numbers.arr[x_305] = x_308;
+  int const x_310 = *(j);
+  int const x_311 = temp;
+  (*(tint_symbol_17)).numbers.arr[x_310] = x_311;
+  return;
+}
+
+void quicksort_(thread QuicksortObject* const tint_symbol_18) {
+  int l_1 = 0;
+  int h_1 = 0;
+  int top = 0;
+  tint_array_wrapper stack = {};
+  int p = 0;
+  int param_4 = 0;
+  int param_5 = 0;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  int const x_376 = top;
+  int const x_377 = (x_376 + 1);
+  top = x_377;
+  int const x_378 = l_1;
+  stack.arr[x_377] = x_378;
+  int const x_380 = top;
+  int const x_381 = (x_380 + 1);
+  top = x_381;
+  int const x_382 = h_1;
+  stack.arr[x_381] = x_382;
+  while (true) {
+    int const x_388 = top;
+    if ((x_388 >= 0)) {
+    } else {
+      break;
+    }
+    int const x_391 = top;
+    top = (x_391 - 1);
+    int const x_394 = stack.arr[x_391];
+    h_1 = x_394;
+    int const x_395 = top;
+    top = (x_395 - 1);
+    int const x_398 = stack.arr[x_395];
+    l_1 = x_398;
+    int const x_399 = l_1;
+    param_4 = x_399;
+    int const x_400 = h_1;
+    param_5 = x_400;
+    int const x_401 = performPartition_i1_i1_(&(param_4), &(param_5), tint_symbol_18);
+    p = x_401;
+    int const x_402 = p;
+    int const x_404 = l_1;
+    if (((x_402 - 1) > x_404)) {
+      int const x_408 = top;
+      int const x_409 = (x_408 + 1);
+      top = x_409;
+      int const x_410 = l_1;
+      stack.arr[x_409] = x_410;
+      int const x_412 = top;
+      int const x_413 = (x_412 + 1);
+      top = x_413;
+      int const x_414 = p;
+      stack.arr[x_413] = (x_414 - 1);
+    }
+    int const x_417 = p;
+    int const x_419 = h_1;
+    if (((x_417 + 1) < x_419)) {
+      int const x_423 = top;
+      int const x_424 = (x_423 + 1);
+      top = x_424;
+      int const x_425 = p;
+      stack.arr[x_424] = (x_425 + 1);
+      int const x_428 = top;
+      int const x_429 = (x_428 + 1);
+      top = x_429;
+      int const x_430 = h_1;
+      stack.arr[x_429] = x_430;
+    }
+  }
+  return;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/2.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/2.spvasm.expected.spvasm
new file mode 100644
index 0000000..01d7e03
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/2.spvasm.expected.spvasm
@@ -0,0 +1,713 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 478
+; Schema: 0
+               OpCapability Shader
+        %354 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %tint_pointsize %tint_symbol %tint_symbol_2 %tint_symbol_3
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %QuicksortObject "QuicksortObject"
+               OpMemberName %QuicksortObject 0 "numbers"
+               OpName %obj "obj"
+               OpName %x_GLF_FragCoord "x_GLF_FragCoord"
+               OpName %x_GLF_pos "x_GLF_pos"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_34 "x_34"
+               OpName %frag_color "frag_color"
+               OpName %gl_Position "gl_Position"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %performPartition_i1_i1_ "performPartition_i1_i1_"
+               OpName %l "l"
+               OpName %h "h"
+               OpName %x_314 "x_314"
+               OpName %x_315 "x_315"
+               OpName %pivot "pivot"
+               OpName %i_1 "i_1"
+               OpName %j_1 "j_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %main_1 "main_1"
+               OpName %x_91 "x_91"
+               OpName %x_92 "x_92"
+               OpName %x_93 "x_93"
+               OpName %x_94 "x_94"
+               OpName %x_95 "x_95"
+               OpName %x_96 "x_96"
+               OpName %x_97 "x_97"
+               OpName %i_2 "i_2"
+               OpName %uv "uv"
+               OpName %color "color"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "frag_color_1"
+               OpMemberName %main_out 1 "gl_Position"
+               OpName %tint_symbol_4 "tint_symbol_4"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpName %swap_i1_i1_ "swap_i1_i1_"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %temp "temp"
+               OpName %quicksort_ "quicksort_"
+               OpName %l_1 "l_1"
+               OpName %h_1 "h_1"
+               OpName %top "top"
+               OpName %stack "stack"
+               OpName %p "p"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpMemberDecorate %QuicksortObject 0 Offset 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_34 NonWritable
+               OpDecorate %x_34 DescriptorSet 0
+               OpDecorate %x_34 Binding 0
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %tint_symbol_3 BuiltIn Position
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%QuicksortObject = OpTypeStruct %_arr_int_uint_10
+%_ptr_Private_QuicksortObject = OpTypePointer Private %QuicksortObject
+         %12 = OpConstantNull %QuicksortObject
+        %obj = OpVariable %_ptr_Private_QuicksortObject Private %12
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_FragCoord = OpVariable %_ptr_Private_v4float Private %16
+  %x_GLF_pos = OpVariable %_ptr_Private_v4float Private %16
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_34 = OpVariable %_ptr_Uniform_buf0 Uniform
+ %frag_color = OpVariable %_ptr_Private_v4float Private %16
+%gl_Position = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %16
+%tint_symbol_3 = OpVariable %_ptr_Output_v4float Output %16
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpTypeFunction %int %_ptr_Function_int %_ptr_Function_int
+         %36 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_int = OpTypePointer Private %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+      %int_0 = OpConstant %int 0
+       %void = OpTypeVoid
+        %116 = OpTypeFunction %void
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+        %125 = OpConstantNull %_arr_int_uint_10
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+        %132 = OpConstantNull %v2float
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+        %136 = OpConstantNull %v3float
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+        %140 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_0
+  %float_128 = OpConstant %float 128
+        %143 = OpConstantComposite %v4float %float_128 %float_128 %float_1 %float_1
+     %int_10 = OpConstant %int 10
+      %int_9 = OpConstant %int 9
+     %int_n1 = OpConstant %int -1
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+        %242 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+%_ptr_Function_float = OpTypePointer Function %float
+ %float_0_25 = OpConstant %float 0.25
+  %float_0_5 = OpConstant %float 0.5
+      %int_2 = OpConstant %int 2
+     %uint_1 = OpConstant %uint 1
+ %float_0_75 = OpConstant %float 0.75
+      %int_3 = OpConstant %int 3
+     %uint_2 = OpConstant %uint 2
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+   %main_out = OpTypeStruct %v4float %v4float
+        %373 = OpTypeFunction %void %main_out
+        %388 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+%performPartition_i1_i1_ = OpFunction %int None %29
+          %l = OpFunctionParameter %_ptr_Function_int
+          %h = OpFunctionParameter %_ptr_Function_int
+         %34 = OpLabel
+      %x_314 = OpVariable %_ptr_Function_int Function %36
+      %x_315 = OpVariable %_ptr_Function_int Function %36
+      %pivot = OpVariable %_ptr_Function_int Function %36
+        %i_1 = OpVariable %_ptr_Function_int Function %36
+        %j_1 = OpVariable %_ptr_Function_int Function %36
+      %param = OpVariable %_ptr_Function_int Function %36
+    %param_1 = OpVariable %_ptr_Function_int Function %36
+    %param_2 = OpVariable %_ptr_Function_int Function %36
+    %param_3 = OpVariable %_ptr_Function_int Function %36
+         %46 = OpLoad %int %h
+         %49 = OpAccessChain %_ptr_Private_int %obj %uint_0 %46
+         %50 = OpLoad %int %49
+               OpStore %pivot %50
+         %52 = OpLoad %int %l
+         %54 = OpISub %int %52 %int_1
+               OpStore %i_1 %54
+         %56 = OpLoad %int %l
+               OpStore %j_1 %56
+               OpBranch %57
+         %57 = OpLabel
+               OpLoopMerge %58 %59 None
+               OpBranch %60
+         %60 = OpLabel
+         %61 = OpLoad %int %j_1
+         %63 = OpLoad %int %h
+         %64 = OpISub %int %63 %int_1
+         %65 = OpSLessThanEqual %bool %61 %64
+               OpSelectionMerge %67 None
+               OpBranchConditional %65 %68 %69
+         %68 = OpLabel
+               OpBranch %67
+         %69 = OpLabel
+               OpBranch %58
+         %67 = OpLabel
+         %70 = OpLoad %int %j_1
+         %71 = OpAccessChain %_ptr_Private_int %obj %uint_0 %70
+         %72 = OpLoad %int %71
+         %73 = OpLoad %int %pivot
+         %74 = OpSLessThanEqual %bool %72 %73
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %75
+         %76 = OpLabel
+         %77 = OpLoad %int %i_1
+         %78 = OpIAdd %int %77 %int_1
+               OpStore %i_1 %78
+         %79 = OpLoad %int %i_1
+               OpStore %param %79
+         %80 = OpLoad %int %j_1
+               OpStore %param_1 %80
+         %81 = OpLoad %int %param
+         %82 = OpAccessChain %_ptr_Private_int %obj %uint_0 %81
+         %83 = OpLoad %int %82
+               OpStore %x_315 %83
+         %84 = OpLoad %int %param
+         %85 = OpLoad %int %param_1
+         %86 = OpAccessChain %_ptr_Private_int %obj %uint_0 %85
+         %87 = OpLoad %int %86
+         %88 = OpAccessChain %_ptr_Private_int %obj %uint_0 %84
+               OpStore %88 %87
+         %89 = OpLoad %int %param_1
+         %90 = OpLoad %int %x_315
+         %91 = OpAccessChain %_ptr_Private_int %obj %uint_0 %89
+               OpStore %91 %90
+               OpBranch %75
+         %75 = OpLabel
+               OpBranch %59
+         %59 = OpLabel
+         %92 = OpLoad %int %j_1
+         %93 = OpIAdd %int %92 %int_1
+               OpStore %j_1 %93
+               OpBranch %57
+         %58 = OpLabel
+         %94 = OpLoad %int %i_1
+         %95 = OpIAdd %int %94 %int_1
+               OpStore %param_2 %95
+         %97 = OpLoad %int %h
+               OpStore %param_3 %97
+         %98 = OpLoad %int %param_2
+         %99 = OpAccessChain %_ptr_Private_int %obj %uint_0 %98
+        %100 = OpLoad %int %99
+               OpStore %x_314 %100
+        %101 = OpLoad %int %param_2
+        %102 = OpLoad %int %param_3
+        %103 = OpAccessChain %_ptr_Private_int %obj %uint_0 %102
+        %104 = OpLoad %int %103
+        %105 = OpAccessChain %_ptr_Private_int %obj %uint_0 %101
+               OpStore %105 %104
+        %106 = OpLoad %int %param_3
+        %107 = OpLoad %int %x_314
+        %108 = OpAccessChain %_ptr_Private_int %obj %uint_0 %106
+               OpStore %108 %107
+               OpSelectionMerge %110 None
+               OpBranchConditional %false %111 %112
+        %111 = OpLabel
+               OpBranch %110
+        %112 = OpLabel
+        %113 = OpLoad %int %i_1
+        %114 = OpIAdd %int %113 %int_1
+               OpReturnValue %114
+        %110 = OpLabel
+               OpReturnValue %int_0
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %116
+        %119 = OpLabel
+       %x_91 = OpVariable %_ptr_Function_int Function %36
+       %x_92 = OpVariable %_ptr_Function_int Function %36
+       %x_93 = OpVariable %_ptr_Function_int Function %36
+       %x_94 = OpVariable %_ptr_Function__arr_int_uint_10 Function %125
+       %x_95 = OpVariable %_ptr_Function_int Function %36
+       %x_96 = OpVariable %_ptr_Function_int Function %36
+       %x_97 = OpVariable %_ptr_Function_int Function %36
+        %i_2 = OpVariable %_ptr_Function_int Function %36
+         %uv = OpVariable %_ptr_Function_v2float Function %132
+      %color = OpVariable %_ptr_Function_v3float Function %136
+        %137 = OpLoad %v4float %x_GLF_pos
+        %141 = OpFAdd %v4float %137 %140
+        %144 = OpFMul %v4float %141 %143
+               OpStore %x_GLF_FragCoord %144
+               OpStore %i_2 %int_0
+               OpBranch %145
+        %145 = OpLabel
+               OpLoopMerge %146 %147 None
+               OpBranch %148
+        %148 = OpLabel
+        %149 = OpLoad %int %i_2
+        %151 = OpSLessThan %bool %149 %int_10
+               OpSelectionMerge %152 None
+               OpBranchConditional %151 %153 %154
+        %153 = OpLabel
+               OpBranch %152
+        %154 = OpLabel
+               OpBranch %146
+        %152 = OpLabel
+        %155 = OpLoad %int %i_2
+        %156 = OpLoad %int %i_2
+        %157 = OpAccessChain %_ptr_Private_int %obj %uint_0 %155
+        %158 = OpISub %int %int_10 %156
+               OpStore %157 %158
+        %159 = OpLoad %int %i_2
+        %160 = OpLoad %int %i_2
+        %161 = OpAccessChain %_ptr_Private_int %obj %uint_0 %160
+        %162 = OpLoad %int %161
+        %163 = OpLoad %int %i_2
+        %164 = OpAccessChain %_ptr_Private_int %obj %uint_0 %163
+        %165 = OpLoad %int %164
+        %166 = OpAccessChain %_ptr_Private_int %obj %uint_0 %159
+        %167 = OpIMul %int %162 %165
+               OpStore %166 %167
+               OpBranch %147
+        %147 = OpLabel
+        %168 = OpLoad %int %i_2
+        %169 = OpIAdd %int %168 %int_1
+               OpStore %i_2 %169
+               OpBranch %145
+        %146 = OpLabel
+               OpStore %x_91 %int_0
+               OpStore %x_92 %int_9
+               OpStore %x_93 %int_n1
+        %172 = OpLoad %int %x_93
+        %173 = OpIAdd %int %172 %int_1
+               OpStore %x_93 %173
+        %174 = OpLoad %int %x_91
+        %175 = OpAccessChain %_ptr_Function_int %x_94 %173
+               OpStore %175 %174
+        %176 = OpLoad %int %x_93
+        %177 = OpIAdd %int %176 %int_1
+               OpStore %x_93 %177
+        %178 = OpLoad %int %x_92
+        %179 = OpAccessChain %_ptr_Function_int %x_94 %177
+               OpStore %179 %178
+               OpBranch %180
+        %180 = OpLabel
+               OpLoopMerge %181 %182 None
+               OpBranch %183
+        %183 = OpLabel
+        %184 = OpLoad %int %x_93
+        %185 = OpSGreaterThanEqual %bool %184 %int_0
+               OpSelectionMerge %186 None
+               OpBranchConditional %185 %187 %188
+        %187 = OpLabel
+               OpBranch %186
+        %188 = OpLabel
+               OpBranch %181
+        %186 = OpLabel
+        %189 = OpLoad %int %x_93
+        %190 = OpISub %int %189 %int_1
+               OpStore %x_93 %190
+        %191 = OpAccessChain %_ptr_Function_int %x_94 %189
+        %192 = OpLoad %int %191
+               OpStore %x_92 %192
+        %193 = OpLoad %int %x_93
+        %194 = OpISub %int %193 %int_1
+               OpStore %x_93 %194
+        %195 = OpAccessChain %_ptr_Function_int %x_94 %193
+        %196 = OpLoad %int %195
+               OpStore %x_91 %196
+        %197 = OpLoad %int %x_91
+               OpStore %x_96 %197
+        %198 = OpLoad %int %x_92
+               OpStore %x_97 %198
+        %199 = OpFunctionCall %int %performPartition_i1_i1_ %x_96 %x_97
+               OpStore %x_95 %199
+        %202 = OpLoad %int %x_95
+        %203 = OpLoad %int %x_91
+        %204 = OpISub %int %202 %int_1
+        %205 = OpSGreaterThan %bool %204 %203
+               OpSelectionMerge %206 None
+               OpBranchConditional %205 %207 %206
+        %207 = OpLabel
+        %208 = OpLoad %int %x_93
+        %209 = OpIAdd %int %208 %int_1
+               OpStore %x_93 %209
+        %210 = OpLoad %int %x_91
+        %211 = OpAccessChain %_ptr_Function_int %x_94 %209
+               OpStore %211 %210
+        %212 = OpLoad %int %x_93
+        %213 = OpIAdd %int %212 %int_1
+               OpStore %x_93 %213
+        %214 = OpLoad %int %x_95
+        %215 = OpAccessChain %_ptr_Function_int %x_94 %213
+        %216 = OpISub %int %214 %int_1
+               OpStore %215 %216
+               OpBranch %206
+        %206 = OpLabel
+        %217 = OpLoad %int %x_95
+        %218 = OpLoad %int %x_92
+        %219 = OpIAdd %int %217 %int_1
+        %220 = OpSLessThan %bool %219 %218
+               OpSelectionMerge %221 None
+               OpBranchConditional %220 %222 %221
+        %222 = OpLabel
+        %223 = OpLoad %int %x_93
+        %224 = OpIAdd %int %223 %int_1
+               OpStore %x_93 %224
+        %225 = OpLoad %int %x_95
+        %226 = OpAccessChain %_ptr_Function_int %x_94 %224
+        %227 = OpIAdd %int %225 %int_1
+               OpStore %226 %227
+        %228 = OpLoad %int %x_93
+        %229 = OpIAdd %int %228 %int_1
+               OpStore %x_93 %229
+        %230 = OpLoad %int %x_92
+        %231 = OpAccessChain %_ptr_Function_int %x_94 %229
+               OpStore %231 %230
+               OpBranch %221
+        %221 = OpLabel
+               OpBranch %182
+        %182 = OpLabel
+               OpBranch %180
+        %181 = OpLabel
+        %232 = OpLoad %v4float %x_GLF_FragCoord
+        %234 = OpAccessChain %_ptr_Uniform_v2float %x_34 %uint_0
+        %235 = OpLoad %v2float %234
+        %236 = OpCompositeExtract %float %232 0
+        %237 = OpCompositeExtract %float %232 1
+        %238 = OpCompositeConstruct %v2float %236 %237
+        %239 = OpFDiv %v2float %238 %235
+               OpStore %uv %239
+               OpStore %color %242
+        %243 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_0
+        %244 = OpLoad %int %243
+        %246 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %247 = OpLoad %float %246
+        %248 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %249 = OpConvertSToF %float %244
+        %250 = OpFAdd %float %247 %249
+               OpStore %248 %250
+        %251 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %252 = OpLoad %float %251
+        %254 = OpFOrdGreaterThan %bool %252 %float_0_25
+               OpSelectionMerge %255 None
+               OpBranchConditional %254 %256 %255
+        %256 = OpLabel
+        %257 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_1
+        %258 = OpLoad %int %257
+        %259 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %260 = OpLoad %float %259
+        %261 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %262 = OpConvertSToF %float %258
+        %263 = OpFAdd %float %260 %262
+               OpStore %261 %263
+               OpBranch %255
+        %255 = OpLabel
+        %264 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %265 = OpLoad %float %264
+        %267 = OpFOrdGreaterThan %bool %265 %float_0_5
+               OpSelectionMerge %268 None
+               OpBranchConditional %267 %269 %268
+        %269 = OpLabel
+        %271 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_2
+        %272 = OpLoad %int %271
+        %274 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %275 = OpLoad %float %274
+        %276 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %277 = OpConvertSToF %float %272
+        %278 = OpFAdd %float %275 %277
+               OpStore %276 %278
+               OpBranch %268
+        %268 = OpLabel
+        %279 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %280 = OpLoad %float %279
+        %282 = OpFOrdGreaterThan %bool %280 %float_0_75
+               OpSelectionMerge %283 None
+               OpBranchConditional %282 %284 %283
+        %284 = OpLabel
+        %286 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_3
+        %287 = OpLoad %int %286
+        %289 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %290 = OpLoad %float %289
+        %291 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %292 = OpConvertSToF %float %287
+        %293 = OpFAdd %float %290 %292
+               OpStore %291 %293
+               OpBranch %283
+        %283 = OpLabel
+        %295 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_4
+        %296 = OpLoad %int %295
+        %297 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %298 = OpLoad %float %297
+        %299 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %300 = OpConvertSToF %float %296
+        %301 = OpFAdd %float %298 %300
+               OpStore %299 %301
+        %302 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %303 = OpLoad %float %302
+        %304 = OpFOrdGreaterThan %bool %303 %float_0_25
+               OpSelectionMerge %305 None
+               OpBranchConditional %304 %306 %305
+        %306 = OpLabel
+        %308 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_5
+        %309 = OpLoad %int %308
+        %310 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %311 = OpLoad %float %310
+        %312 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %313 = OpConvertSToF %float %309
+        %314 = OpFAdd %float %311 %313
+               OpStore %312 %314
+               OpBranch %305
+        %305 = OpLabel
+        %315 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %316 = OpLoad %float %315
+        %317 = OpFOrdGreaterThan %bool %316 %float_0_5
+               OpSelectionMerge %318 None
+               OpBranchConditional %317 %319 %318
+        %319 = OpLabel
+        %321 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_6
+        %322 = OpLoad %int %321
+        %323 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %324 = OpLoad %float %323
+        %325 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %326 = OpConvertSToF %float %322
+        %327 = OpFAdd %float %324 %326
+               OpStore %325 %327
+               OpBranch %318
+        %318 = OpLabel
+        %328 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %329 = OpLoad %float %328
+        %330 = OpFOrdGreaterThan %bool %329 %float_0_75
+               OpSelectionMerge %331 None
+               OpBranchConditional %330 %332 %331
+        %332 = OpLabel
+        %334 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_7
+        %335 = OpLoad %int %334
+        %336 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %337 = OpLoad %float %336
+        %338 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %339 = OpConvertSToF %float %335
+        %340 = OpFAdd %float %337 %339
+               OpStore %338 %340
+               OpBranch %331
+        %331 = OpLabel
+        %342 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_8
+        %343 = OpLoad %int %342
+        %344 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %345 = OpLoad %float %344
+        %346 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %347 = OpConvertSToF %float %343
+        %348 = OpFAdd %float %345 %347
+               OpStore %346 %348
+        %349 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %350 = OpLoad %float %349
+        %351 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %352 = OpLoad %float %351
+        %355 = OpFSub %float %350 %352
+        %353 = OpExtInst %float %354 FAbs %355
+        %356 = OpFOrdLessThan %bool %353 %float_0_25
+               OpSelectionMerge %357 None
+               OpBranchConditional %356 %358 %357
+        %358 = OpLabel
+        %359 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_9
+        %360 = OpLoad %int %359
+        %361 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %362 = OpLoad %float %361
+        %363 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %364 = OpConvertSToF %float %360
+        %365 = OpFAdd %float %362 %364
+               OpStore %363 %365
+               OpBranch %357
+        %357 = OpLabel
+        %366 = OpLoad %v3float %color
+        %367 = OpExtInst %v3float %354 Normalize %366
+        %368 = OpCompositeExtract %float %367 0
+        %369 = OpCompositeExtract %float %367 1
+        %370 = OpCompositeExtract %float %367 2
+        %371 = OpCompositeConstruct %v4float %368 %369 %370 %float_1
+               OpStore %frag_color %371
+        %372 = OpLoad %v4float %x_GLF_pos
+               OpStore %gl_Position %372
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_4 = OpFunction %void None %373
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %377 = OpLabel
+        %378 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %378
+        %379 = OpCompositeExtract %v4float %tint_symbol_1 1
+               OpStore %tint_symbol_3 %379
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %116
+        %381 = OpLabel
+               OpStore %tint_pointsize %float_1
+        %382 = OpLoad %v4float %tint_symbol
+               OpStore %x_GLF_pos %382
+        %383 = OpFunctionCall %void %main_1
+        %385 = OpLoad %v4float %frag_color
+        %386 = OpLoad %v4float %gl_Position
+        %387 = OpCompositeConstruct %main_out %385 %386
+        %384 = OpFunctionCall %void %tint_symbol_4 %387
+               OpReturn
+               OpFunctionEnd
+%swap_i1_i1_ = OpFunction %void None %388
+          %i = OpFunctionParameter %_ptr_Function_int
+          %j = OpFunctionParameter %_ptr_Function_int
+        %392 = OpLabel
+       %temp = OpVariable %_ptr_Function_int Function %36
+        %395 = OpLoad %int %i
+        %396 = OpAccessChain %_ptr_Private_int %obj %uint_0 %395
+        %397 = OpLoad %int %396
+               OpStore %temp %397
+        %399 = OpLoad %int %i
+        %401 = OpLoad %int %j
+        %402 = OpAccessChain %_ptr_Private_int %obj %uint_0 %401
+        %403 = OpLoad %int %402
+        %404 = OpAccessChain %_ptr_Private_int %obj %uint_0 %399
+               OpStore %404 %403
+        %406 = OpLoad %int %j
+        %407 = OpLoad %int %temp
+        %408 = OpAccessChain %_ptr_Private_int %obj %uint_0 %406
+               OpStore %408 %407
+               OpReturn
+               OpFunctionEnd
+ %quicksort_ = OpFunction %void None %116
+        %410 = OpLabel
+        %l_1 = OpVariable %_ptr_Function_int Function %36
+        %h_1 = OpVariable %_ptr_Function_int Function %36
+        %top = OpVariable %_ptr_Function_int Function %36
+      %stack = OpVariable %_ptr_Function__arr_int_uint_10 Function %125
+          %p = OpVariable %_ptr_Function_int Function %36
+    %param_4 = OpVariable %_ptr_Function_int Function %36
+    %param_5 = OpVariable %_ptr_Function_int Function %36
+               OpStore %l_1 %int_0
+               OpStore %h_1 %int_9
+               OpStore %top %int_n1
+        %418 = OpLoad %int %top
+        %419 = OpIAdd %int %418 %int_1
+               OpStore %top %419
+        %420 = OpLoad %int %l_1
+        %421 = OpAccessChain %_ptr_Function_int %stack %419
+               OpStore %421 %420
+        %422 = OpLoad %int %top
+        %423 = OpIAdd %int %422 %int_1
+               OpStore %top %423
+        %424 = OpLoad %int %h_1
+        %425 = OpAccessChain %_ptr_Function_int %stack %423
+               OpStore %425 %424
+               OpBranch %426
+        %426 = OpLabel
+               OpLoopMerge %427 %428 None
+               OpBranch %429
+        %429 = OpLabel
+        %430 = OpLoad %int %top
+        %431 = OpSGreaterThanEqual %bool %430 %int_0
+               OpSelectionMerge %432 None
+               OpBranchConditional %431 %433 %434
+        %433 = OpLabel
+               OpBranch %432
+        %434 = OpLabel
+               OpBranch %427
+        %432 = OpLabel
+        %435 = OpLoad %int %top
+        %436 = OpISub %int %435 %int_1
+               OpStore %top %436
+        %437 = OpAccessChain %_ptr_Function_int %stack %435
+        %438 = OpLoad %int %437
+               OpStore %h_1 %438
+        %439 = OpLoad %int %top
+        %440 = OpISub %int %439 %int_1
+               OpStore %top %440
+        %441 = OpAccessChain %_ptr_Function_int %stack %439
+        %442 = OpLoad %int %441
+               OpStore %l_1 %442
+        %443 = OpLoad %int %l_1
+               OpStore %param_4 %443
+        %444 = OpLoad %int %h_1
+               OpStore %param_5 %444
+        %445 = OpFunctionCall %int %performPartition_i1_i1_ %param_4 %param_5
+               OpStore %p %445
+        %448 = OpLoad %int %p
+        %449 = OpLoad %int %l_1
+        %450 = OpISub %int %448 %int_1
+        %451 = OpSGreaterThan %bool %450 %449
+               OpSelectionMerge %452 None
+               OpBranchConditional %451 %453 %452
+        %453 = OpLabel
+        %454 = OpLoad %int %top
+        %455 = OpIAdd %int %454 %int_1
+               OpStore %top %455
+        %456 = OpLoad %int %l_1
+        %457 = OpAccessChain %_ptr_Function_int %stack %455
+               OpStore %457 %456
+        %458 = OpLoad %int %top
+        %459 = OpIAdd %int %458 %int_1
+               OpStore %top %459
+        %460 = OpLoad %int %p
+        %461 = OpAccessChain %_ptr_Function_int %stack %459
+        %462 = OpISub %int %460 %int_1
+               OpStore %461 %462
+               OpBranch %452
+        %452 = OpLabel
+        %463 = OpLoad %int %p
+        %464 = OpLoad %int %h_1
+        %465 = OpIAdd %int %463 %int_1
+        %466 = OpSLessThan %bool %465 %464
+               OpSelectionMerge %467 None
+               OpBranchConditional %466 %468 %467
+        %468 = OpLabel
+        %469 = OpLoad %int %top
+        %470 = OpIAdd %int %469 %int_1
+               OpStore %top %470
+        %471 = OpLoad %int %p
+        %472 = OpAccessChain %_ptr_Function_int %stack %470
+        %473 = OpIAdd %int %471 %int_1
+               OpStore %472 %473
+        %474 = OpLoad %int %top
+        %475 = OpIAdd %int %474 %int_1
+               OpStore %top %475
+        %476 = OpLoad %int %h_1
+        %477 = OpAccessChain %_ptr_Function_int %stack %475
+               OpStore %477 %476
+               OpBranch %467
+        %467 = OpLabel
+               OpBranch %428
+        %428 = OpLabel
+               OpBranch %426
+        %427 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/2.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/2.spvasm.expected.wgsl
new file mode 100644
index 0000000..7c15a5c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/2.spvasm.expected.wgsl
@@ -0,0 +1,356 @@
+struct QuicksortObject {
+  numbers : array<i32, 10>;
+};
+
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> obj : QuicksortObject;
+
+var<private> x_GLF_FragCoord : vec4<f32>;
+
+var<private> x_GLF_pos : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_34 : buf0;
+
+var<private> frag_color : vec4<f32>;
+
+var<private> gl_Position : vec4<f32>;
+
+fn performPartition_i1_i1_(l : ptr<function, i32>, h : ptr<function, i32>) -> i32 {
+  var x_314 : i32;
+  var x_315 : i32;
+  var pivot : i32;
+  var i_1 : i32;
+  var j_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  var param_3 : i32;
+  let x_316 : i32 = *(h);
+  let x_318 : i32 = obj.numbers[x_316];
+  pivot = x_318;
+  let x_319 : i32 = *(l);
+  i_1 = (x_319 - 1);
+  let x_321 : i32 = *(l);
+  j_1 = x_321;
+  loop {
+    let x_326 : i32 = j_1;
+    let x_327 : i32 = *(h);
+    if ((x_326 <= (x_327 - 1))) {
+    } else {
+      break;
+    }
+    let x_331 : i32 = j_1;
+    let x_333 : i32 = obj.numbers[x_331];
+    let x_334 : i32 = pivot;
+    if ((x_333 <= x_334)) {
+      let x_338 : i32 = i_1;
+      i_1 = (x_338 + 1);
+      let x_340 : i32 = i_1;
+      param = x_340;
+      let x_341 : i32 = j_1;
+      param_1 = x_341;
+      let x_342 : i32 = param;
+      let x_344 : i32 = obj.numbers[x_342];
+      x_315 = x_344;
+      let x_345 : i32 = param;
+      let x_346 : i32 = param_1;
+      let x_348 : i32 = obj.numbers[x_346];
+      obj.numbers[x_345] = x_348;
+      let x_350 : i32 = param_1;
+      let x_351 : i32 = x_315;
+      obj.numbers[x_350] = x_351;
+    }
+
+    continuing {
+      let x_353 : i32 = j_1;
+      j_1 = (x_353 + 1);
+    }
+  }
+  let x_355 : i32 = i_1;
+  param_2 = (x_355 + 1);
+  let x_357 : i32 = *(h);
+  param_3 = x_357;
+  let x_358 : i32 = param_2;
+  let x_360 : i32 = obj.numbers[x_358];
+  x_314 = x_360;
+  let x_361 : i32 = param_2;
+  let x_362 : i32 = param_3;
+  let x_364 : i32 = obj.numbers[x_362];
+  obj.numbers[x_361] = x_364;
+  let x_366 : i32 = param_3;
+  let x_367 : i32 = x_314;
+  obj.numbers[x_366] = x_367;
+  if (false) {
+  } else {
+    let x_372 : i32 = i_1;
+    return (x_372 + 1);
+  }
+  return 0;
+}
+
+fn main_1() {
+  var x_91 : i32;
+  var x_92 : i32;
+  var x_93 : i32;
+  var x_94 : array<i32, 10>;
+  var x_95 : i32;
+  var x_96 : i32;
+  var x_97 : i32;
+  var i_2 : i32;
+  var uv : vec2<f32>;
+  var color : vec3<f32>;
+  let x_98 : vec4<f32> = x_GLF_pos;
+  x_GLF_FragCoord = ((x_98 + vec4<f32>(1.0, 1.0, 0.0, 0.0)) * vec4<f32>(128.0, 128.0, 1.0, 1.0));
+  i_2 = 0;
+  loop {
+    let x_105 : i32 = i_2;
+    if ((x_105 < 10)) {
+    } else {
+      break;
+    }
+    let x_108 : i32 = i_2;
+    let x_109 : i32 = i_2;
+    obj.numbers[x_108] = (10 - x_109);
+    let x_112 : i32 = i_2;
+    let x_113 : i32 = i_2;
+    let x_115 : i32 = obj.numbers[x_113];
+    let x_116 : i32 = i_2;
+    let x_118 : i32 = obj.numbers[x_116];
+    obj.numbers[x_112] = (x_115 * x_118);
+
+    continuing {
+      let x_121 : i32 = i_2;
+      i_2 = (x_121 + 1);
+    }
+  }
+  x_91 = 0;
+  x_92 = 9;
+  x_93 = -1;
+  let x_123 : i32 = x_93;
+  let x_124 : i32 = (x_123 + 1);
+  x_93 = x_124;
+  let x_125 : i32 = x_91;
+  x_94[x_124] = x_125;
+  let x_127 : i32 = x_93;
+  let x_128 : i32 = (x_127 + 1);
+  x_93 = x_128;
+  let x_129 : i32 = x_92;
+  x_94[x_128] = x_129;
+  loop {
+    let x_135 : i32 = x_93;
+    if ((x_135 >= 0)) {
+    } else {
+      break;
+    }
+    let x_138 : i32 = x_93;
+    x_93 = (x_138 - 1);
+    let x_141 : i32 = x_94[x_138];
+    x_92 = x_141;
+    let x_142 : i32 = x_93;
+    x_93 = (x_142 - 1);
+    let x_145 : i32 = x_94[x_142];
+    x_91 = x_145;
+    let x_146 : i32 = x_91;
+    x_96 = x_146;
+    let x_147 : i32 = x_92;
+    x_97 = x_147;
+    let x_148 : i32 = performPartition_i1_i1_(&(x_96), &(x_97));
+    x_95 = x_148;
+    let x_149 : i32 = x_95;
+    let x_151 : i32 = x_91;
+    if (((x_149 - 1) > x_151)) {
+      let x_155 : i32 = x_93;
+      let x_156 : i32 = (x_155 + 1);
+      x_93 = x_156;
+      let x_157 : i32 = x_91;
+      x_94[x_156] = x_157;
+      let x_159 : i32 = x_93;
+      let x_160 : i32 = (x_159 + 1);
+      x_93 = x_160;
+      let x_161 : i32 = x_95;
+      x_94[x_160] = (x_161 - 1);
+    }
+    let x_164 : i32 = x_95;
+    let x_166 : i32 = x_92;
+    if (((x_164 + 1) < x_166)) {
+      let x_170 : i32 = x_93;
+      let x_171 : i32 = (x_170 + 1);
+      x_93 = x_171;
+      let x_172 : i32 = x_95;
+      x_94[x_171] = (x_172 + 1);
+      let x_175 : i32 = x_93;
+      let x_176 : i32 = (x_175 + 1);
+      x_93 = x_176;
+      let x_177 : i32 = x_92;
+      x_94[x_176] = x_177;
+    }
+  }
+  let x_179 : vec4<f32> = x_GLF_FragCoord;
+  let x_182 : vec2<f32> = x_34.resolution;
+  uv = (vec2<f32>(x_179.x, x_179.y) / x_182);
+  color = vec3<f32>(1.0, 2.0, 3.0);
+  let x_185 : i32 = obj.numbers[0];
+  let x_188 : f32 = color.x;
+  color.x = (x_188 + f32(x_185));
+  let x_192 : f32 = uv.x;
+  if ((x_192 > 0.25)) {
+    let x_197 : i32 = obj.numbers[1];
+    let x_200 : f32 = color.x;
+    color.x = (x_200 + f32(x_197));
+  }
+  let x_204 : f32 = uv.x;
+  if ((x_204 > 0.5)) {
+    let x_209 : i32 = obj.numbers[2];
+    let x_212 : f32 = color.y;
+    color.y = (x_212 + f32(x_209));
+  }
+  let x_216 : f32 = uv.x;
+  if ((x_216 > 0.75)) {
+    let x_221 : i32 = obj.numbers[3];
+    let x_224 : f32 = color.z;
+    color.z = (x_224 + f32(x_221));
+  }
+  let x_228 : i32 = obj.numbers[4];
+  let x_231 : f32 = color.y;
+  color.y = (x_231 + f32(x_228));
+  let x_235 : f32 = uv.y;
+  if ((x_235 > 0.25)) {
+    let x_240 : i32 = obj.numbers[5];
+    let x_243 : f32 = color.x;
+    color.x = (x_243 + f32(x_240));
+  }
+  let x_247 : f32 = uv.y;
+  if ((x_247 > 0.5)) {
+    let x_252 : i32 = obj.numbers[6];
+    let x_255 : f32 = color.y;
+    color.y = (x_255 + f32(x_252));
+  }
+  let x_259 : f32 = uv.y;
+  if ((x_259 > 0.75)) {
+    let x_264 : i32 = obj.numbers[7];
+    let x_267 : f32 = color.z;
+    color.z = (x_267 + f32(x_264));
+  }
+  let x_271 : i32 = obj.numbers[8];
+  let x_274 : f32 = color.z;
+  color.z = (x_274 + f32(x_271));
+  let x_278 : f32 = uv.x;
+  let x_280 : f32 = uv.y;
+  if ((abs((x_278 - x_280)) < 0.25)) {
+    let x_287 : i32 = obj.numbers[9];
+    let x_290 : f32 = color.x;
+    color.x = (x_290 + f32(x_287));
+  }
+  let x_293 : vec3<f32> = color;
+  let x_294 : vec3<f32> = normalize(x_293);
+  frag_color = vec4<f32>(x_294.x, x_294.y, x_294.z, 1.0);
+  let x_299 : vec4<f32> = x_GLF_pos;
+  gl_Position = x_299;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  frag_color_1 : vec4<f32>;
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] x_GLF_pos_param : vec4<f32>) -> main_out {
+  x_GLF_pos = x_GLF_pos_param;
+  main_1();
+  return main_out(frag_color, gl_Position);
+}
+
+fn swap_i1_i1_(i : ptr<function, i32>, j : ptr<function, i32>) {
+  var temp : i32;
+  let x_302 : i32 = *(i);
+  let x_304 : i32 = obj.numbers[x_302];
+  temp = x_304;
+  let x_305 : i32 = *(i);
+  let x_306 : i32 = *(j);
+  let x_308 : i32 = obj.numbers[x_306];
+  obj.numbers[x_305] = x_308;
+  let x_310 : i32 = *(j);
+  let x_311 : i32 = temp;
+  obj.numbers[x_310] = x_311;
+  return;
+}
+
+fn quicksort_() {
+  var l_1 : i32;
+  var h_1 : i32;
+  var top : i32;
+  var stack : array<i32, 10>;
+  var p : i32;
+  var param_4 : i32;
+  var param_5 : i32;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  let x_376 : i32 = top;
+  let x_377 : i32 = (x_376 + 1);
+  top = x_377;
+  let x_378 : i32 = l_1;
+  stack[x_377] = x_378;
+  let x_380 : i32 = top;
+  let x_381 : i32 = (x_380 + 1);
+  top = x_381;
+  let x_382 : i32 = h_1;
+  stack[x_381] = x_382;
+  loop {
+    let x_388 : i32 = top;
+    if ((x_388 >= 0)) {
+    } else {
+      break;
+    }
+    let x_391 : i32 = top;
+    top = (x_391 - 1);
+    let x_394 : i32 = stack[x_391];
+    h_1 = x_394;
+    let x_395 : i32 = top;
+    top = (x_395 - 1);
+    let x_398 : i32 = stack[x_395];
+    l_1 = x_398;
+    let x_399 : i32 = l_1;
+    param_4 = x_399;
+    let x_400 : i32 = h_1;
+    param_5 = x_400;
+    let x_401 : i32 = performPartition_i1_i1_(&(param_4), &(param_5));
+    p = x_401;
+    let x_402 : i32 = p;
+    let x_404 : i32 = l_1;
+    if (((x_402 - 1) > x_404)) {
+      let x_408 : i32 = top;
+      let x_409 : i32 = (x_408 + 1);
+      top = x_409;
+      let x_410 : i32 = l_1;
+      stack[x_409] = x_410;
+      let x_412 : i32 = top;
+      let x_413 : i32 = (x_412 + 1);
+      top = x_413;
+      let x_414 : i32 = p;
+      stack[x_413] = (x_414 - 1);
+    }
+    let x_417 : i32 = p;
+    let x_419 : i32 = h_1;
+    if (((x_417 + 1) < x_419)) {
+      let x_423 : i32 = top;
+      let x_424 : i32 = (x_423 + 1);
+      top = x_424;
+      let x_425 : i32 = p;
+      stack[x_424] = (x_425 + 1);
+      let x_428 : i32 = top;
+      let x_429 : i32 = (x_428 + 1);
+      top = x_429;
+      let x_430 : i32 = h_1;
+      stack[x_429] = x_430;
+    }
+  }
+  return;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/2.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/2.wgsl
new file mode 100644
index 0000000..7c15a5c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/2.wgsl
@@ -0,0 +1,356 @@
+struct QuicksortObject {
+  numbers : array<i32, 10>;
+};
+
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> obj : QuicksortObject;
+
+var<private> x_GLF_FragCoord : vec4<f32>;
+
+var<private> x_GLF_pos : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_34 : buf0;
+
+var<private> frag_color : vec4<f32>;
+
+var<private> gl_Position : vec4<f32>;
+
+fn performPartition_i1_i1_(l : ptr<function, i32>, h : ptr<function, i32>) -> i32 {
+  var x_314 : i32;
+  var x_315 : i32;
+  var pivot : i32;
+  var i_1 : i32;
+  var j_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  var param_3 : i32;
+  let x_316 : i32 = *(h);
+  let x_318 : i32 = obj.numbers[x_316];
+  pivot = x_318;
+  let x_319 : i32 = *(l);
+  i_1 = (x_319 - 1);
+  let x_321 : i32 = *(l);
+  j_1 = x_321;
+  loop {
+    let x_326 : i32 = j_1;
+    let x_327 : i32 = *(h);
+    if ((x_326 <= (x_327 - 1))) {
+    } else {
+      break;
+    }
+    let x_331 : i32 = j_1;
+    let x_333 : i32 = obj.numbers[x_331];
+    let x_334 : i32 = pivot;
+    if ((x_333 <= x_334)) {
+      let x_338 : i32 = i_1;
+      i_1 = (x_338 + 1);
+      let x_340 : i32 = i_1;
+      param = x_340;
+      let x_341 : i32 = j_1;
+      param_1 = x_341;
+      let x_342 : i32 = param;
+      let x_344 : i32 = obj.numbers[x_342];
+      x_315 = x_344;
+      let x_345 : i32 = param;
+      let x_346 : i32 = param_1;
+      let x_348 : i32 = obj.numbers[x_346];
+      obj.numbers[x_345] = x_348;
+      let x_350 : i32 = param_1;
+      let x_351 : i32 = x_315;
+      obj.numbers[x_350] = x_351;
+    }
+
+    continuing {
+      let x_353 : i32 = j_1;
+      j_1 = (x_353 + 1);
+    }
+  }
+  let x_355 : i32 = i_1;
+  param_2 = (x_355 + 1);
+  let x_357 : i32 = *(h);
+  param_3 = x_357;
+  let x_358 : i32 = param_2;
+  let x_360 : i32 = obj.numbers[x_358];
+  x_314 = x_360;
+  let x_361 : i32 = param_2;
+  let x_362 : i32 = param_3;
+  let x_364 : i32 = obj.numbers[x_362];
+  obj.numbers[x_361] = x_364;
+  let x_366 : i32 = param_3;
+  let x_367 : i32 = x_314;
+  obj.numbers[x_366] = x_367;
+  if (false) {
+  } else {
+    let x_372 : i32 = i_1;
+    return (x_372 + 1);
+  }
+  return 0;
+}
+
+fn main_1() {
+  var x_91 : i32;
+  var x_92 : i32;
+  var x_93 : i32;
+  var x_94 : array<i32, 10>;
+  var x_95 : i32;
+  var x_96 : i32;
+  var x_97 : i32;
+  var i_2 : i32;
+  var uv : vec2<f32>;
+  var color : vec3<f32>;
+  let x_98 : vec4<f32> = x_GLF_pos;
+  x_GLF_FragCoord = ((x_98 + vec4<f32>(1.0, 1.0, 0.0, 0.0)) * vec4<f32>(128.0, 128.0, 1.0, 1.0));
+  i_2 = 0;
+  loop {
+    let x_105 : i32 = i_2;
+    if ((x_105 < 10)) {
+    } else {
+      break;
+    }
+    let x_108 : i32 = i_2;
+    let x_109 : i32 = i_2;
+    obj.numbers[x_108] = (10 - x_109);
+    let x_112 : i32 = i_2;
+    let x_113 : i32 = i_2;
+    let x_115 : i32 = obj.numbers[x_113];
+    let x_116 : i32 = i_2;
+    let x_118 : i32 = obj.numbers[x_116];
+    obj.numbers[x_112] = (x_115 * x_118);
+
+    continuing {
+      let x_121 : i32 = i_2;
+      i_2 = (x_121 + 1);
+    }
+  }
+  x_91 = 0;
+  x_92 = 9;
+  x_93 = -1;
+  let x_123 : i32 = x_93;
+  let x_124 : i32 = (x_123 + 1);
+  x_93 = x_124;
+  let x_125 : i32 = x_91;
+  x_94[x_124] = x_125;
+  let x_127 : i32 = x_93;
+  let x_128 : i32 = (x_127 + 1);
+  x_93 = x_128;
+  let x_129 : i32 = x_92;
+  x_94[x_128] = x_129;
+  loop {
+    let x_135 : i32 = x_93;
+    if ((x_135 >= 0)) {
+    } else {
+      break;
+    }
+    let x_138 : i32 = x_93;
+    x_93 = (x_138 - 1);
+    let x_141 : i32 = x_94[x_138];
+    x_92 = x_141;
+    let x_142 : i32 = x_93;
+    x_93 = (x_142 - 1);
+    let x_145 : i32 = x_94[x_142];
+    x_91 = x_145;
+    let x_146 : i32 = x_91;
+    x_96 = x_146;
+    let x_147 : i32 = x_92;
+    x_97 = x_147;
+    let x_148 : i32 = performPartition_i1_i1_(&(x_96), &(x_97));
+    x_95 = x_148;
+    let x_149 : i32 = x_95;
+    let x_151 : i32 = x_91;
+    if (((x_149 - 1) > x_151)) {
+      let x_155 : i32 = x_93;
+      let x_156 : i32 = (x_155 + 1);
+      x_93 = x_156;
+      let x_157 : i32 = x_91;
+      x_94[x_156] = x_157;
+      let x_159 : i32 = x_93;
+      let x_160 : i32 = (x_159 + 1);
+      x_93 = x_160;
+      let x_161 : i32 = x_95;
+      x_94[x_160] = (x_161 - 1);
+    }
+    let x_164 : i32 = x_95;
+    let x_166 : i32 = x_92;
+    if (((x_164 + 1) < x_166)) {
+      let x_170 : i32 = x_93;
+      let x_171 : i32 = (x_170 + 1);
+      x_93 = x_171;
+      let x_172 : i32 = x_95;
+      x_94[x_171] = (x_172 + 1);
+      let x_175 : i32 = x_93;
+      let x_176 : i32 = (x_175 + 1);
+      x_93 = x_176;
+      let x_177 : i32 = x_92;
+      x_94[x_176] = x_177;
+    }
+  }
+  let x_179 : vec4<f32> = x_GLF_FragCoord;
+  let x_182 : vec2<f32> = x_34.resolution;
+  uv = (vec2<f32>(x_179.x, x_179.y) / x_182);
+  color = vec3<f32>(1.0, 2.0, 3.0);
+  let x_185 : i32 = obj.numbers[0];
+  let x_188 : f32 = color.x;
+  color.x = (x_188 + f32(x_185));
+  let x_192 : f32 = uv.x;
+  if ((x_192 > 0.25)) {
+    let x_197 : i32 = obj.numbers[1];
+    let x_200 : f32 = color.x;
+    color.x = (x_200 + f32(x_197));
+  }
+  let x_204 : f32 = uv.x;
+  if ((x_204 > 0.5)) {
+    let x_209 : i32 = obj.numbers[2];
+    let x_212 : f32 = color.y;
+    color.y = (x_212 + f32(x_209));
+  }
+  let x_216 : f32 = uv.x;
+  if ((x_216 > 0.75)) {
+    let x_221 : i32 = obj.numbers[3];
+    let x_224 : f32 = color.z;
+    color.z = (x_224 + f32(x_221));
+  }
+  let x_228 : i32 = obj.numbers[4];
+  let x_231 : f32 = color.y;
+  color.y = (x_231 + f32(x_228));
+  let x_235 : f32 = uv.y;
+  if ((x_235 > 0.25)) {
+    let x_240 : i32 = obj.numbers[5];
+    let x_243 : f32 = color.x;
+    color.x = (x_243 + f32(x_240));
+  }
+  let x_247 : f32 = uv.y;
+  if ((x_247 > 0.5)) {
+    let x_252 : i32 = obj.numbers[6];
+    let x_255 : f32 = color.y;
+    color.y = (x_255 + f32(x_252));
+  }
+  let x_259 : f32 = uv.y;
+  if ((x_259 > 0.75)) {
+    let x_264 : i32 = obj.numbers[7];
+    let x_267 : f32 = color.z;
+    color.z = (x_267 + f32(x_264));
+  }
+  let x_271 : i32 = obj.numbers[8];
+  let x_274 : f32 = color.z;
+  color.z = (x_274 + f32(x_271));
+  let x_278 : f32 = uv.x;
+  let x_280 : f32 = uv.y;
+  if ((abs((x_278 - x_280)) < 0.25)) {
+    let x_287 : i32 = obj.numbers[9];
+    let x_290 : f32 = color.x;
+    color.x = (x_290 + f32(x_287));
+  }
+  let x_293 : vec3<f32> = color;
+  let x_294 : vec3<f32> = normalize(x_293);
+  frag_color = vec4<f32>(x_294.x, x_294.y, x_294.z, 1.0);
+  let x_299 : vec4<f32> = x_GLF_pos;
+  gl_Position = x_299;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  frag_color_1 : vec4<f32>;
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] x_GLF_pos_param : vec4<f32>) -> main_out {
+  x_GLF_pos = x_GLF_pos_param;
+  main_1();
+  return main_out(frag_color, gl_Position);
+}
+
+fn swap_i1_i1_(i : ptr<function, i32>, j : ptr<function, i32>) {
+  var temp : i32;
+  let x_302 : i32 = *(i);
+  let x_304 : i32 = obj.numbers[x_302];
+  temp = x_304;
+  let x_305 : i32 = *(i);
+  let x_306 : i32 = *(j);
+  let x_308 : i32 = obj.numbers[x_306];
+  obj.numbers[x_305] = x_308;
+  let x_310 : i32 = *(j);
+  let x_311 : i32 = temp;
+  obj.numbers[x_310] = x_311;
+  return;
+}
+
+fn quicksort_() {
+  var l_1 : i32;
+  var h_1 : i32;
+  var top : i32;
+  var stack : array<i32, 10>;
+  var p : i32;
+  var param_4 : i32;
+  var param_5 : i32;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  let x_376 : i32 = top;
+  let x_377 : i32 = (x_376 + 1);
+  top = x_377;
+  let x_378 : i32 = l_1;
+  stack[x_377] = x_378;
+  let x_380 : i32 = top;
+  let x_381 : i32 = (x_380 + 1);
+  top = x_381;
+  let x_382 : i32 = h_1;
+  stack[x_381] = x_382;
+  loop {
+    let x_388 : i32 = top;
+    if ((x_388 >= 0)) {
+    } else {
+      break;
+    }
+    let x_391 : i32 = top;
+    top = (x_391 - 1);
+    let x_394 : i32 = stack[x_391];
+    h_1 = x_394;
+    let x_395 : i32 = top;
+    top = (x_395 - 1);
+    let x_398 : i32 = stack[x_395];
+    l_1 = x_398;
+    let x_399 : i32 = l_1;
+    param_4 = x_399;
+    let x_400 : i32 = h_1;
+    param_5 = x_400;
+    let x_401 : i32 = performPartition_i1_i1_(&(param_4), &(param_5));
+    p = x_401;
+    let x_402 : i32 = p;
+    let x_404 : i32 = l_1;
+    if (((x_402 - 1) > x_404)) {
+      let x_408 : i32 = top;
+      let x_409 : i32 = (x_408 + 1);
+      top = x_409;
+      let x_410 : i32 = l_1;
+      stack[x_409] = x_410;
+      let x_412 : i32 = top;
+      let x_413 : i32 = (x_412 + 1);
+      top = x_413;
+      let x_414 : i32 = p;
+      stack[x_413] = (x_414 - 1);
+    }
+    let x_417 : i32 = p;
+    let x_419 : i32 = h_1;
+    if (((x_417 + 1) < x_419)) {
+      let x_423 : i32 = top;
+      let x_424 : i32 = (x_423 + 1);
+      top = x_424;
+      let x_425 : i32 = p;
+      stack[x_424] = (x_425 + 1);
+      let x_428 : i32 = top;
+      let x_429 : i32 = (x_428 + 1);
+      top = x_429;
+      let x_430 : i32 = h_1;
+      stack[x_429] = x_430;
+    }
+  }
+  return;
+}
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
new file mode 100644
index 0000000..dd128c4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/2.wgsl.expected.hlsl
@@ -0,0 +1,284 @@
+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;
+  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;
+  {
+    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;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 x_GLF_pos_param = tint_symbol.x_GLF_pos_param;
+  x_GLF_pos = x_GLF_pos_param;
+  main_1();
+  const main_out tint_symbol_3 = {frag_color, gl_Position};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.frag_color_1, tint_symbol_3.gl_Position};
+  return tint_symbol_5;
+}
+
+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;
+  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;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/2.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/2.wgsl.expected.msl
new file mode 100644
index 0000000..f6f5a8a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/2.wgsl.expected.msl
@@ -0,0 +1,358 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct QuicksortObject {
+  tint_array_wrapper numbers;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 frag_color_1;
+  float4 gl_Position;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_pos_param [[attribute(0)]];
+};
+struct tint_symbol_3 {
+  float4 frag_color_1 [[user(locn0)]];
+  float4 gl_Position [[position]];
+};
+
+int performPartition_i1_i1_(thread int* const l, thread int* const h, thread QuicksortObject* const tint_symbol_6) {
+  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;
+  int const x_316 = *(h);
+  int const x_318 = (*(tint_symbol_6)).numbers.arr[x_316];
+  pivot = x_318;
+  int const x_319 = *(l);
+  i_1 = (x_319 - 1);
+  int const x_321 = *(l);
+  j_1 = x_321;
+  while (true) {
+    int const x_326 = j_1;
+    int const x_327 = *(h);
+    if ((x_326 <= (x_327 - 1))) {
+    } else {
+      break;
+    }
+    int const x_331 = j_1;
+    int const x_333 = (*(tint_symbol_6)).numbers.arr[x_331];
+    int const x_334 = pivot;
+    if ((x_333 <= x_334)) {
+      int const x_338 = i_1;
+      i_1 = (x_338 + 1);
+      int const x_340 = i_1;
+      param = x_340;
+      int const x_341 = j_1;
+      param_1 = x_341;
+      int const x_342 = param;
+      int const x_344 = (*(tint_symbol_6)).numbers.arr[x_342];
+      x_315 = x_344;
+      int const x_345 = param;
+      int const x_346 = param_1;
+      int const x_348 = (*(tint_symbol_6)).numbers.arr[x_346];
+      (*(tint_symbol_6)).numbers.arr[x_345] = x_348;
+      int const x_350 = param_1;
+      int const x_351 = x_315;
+      (*(tint_symbol_6)).numbers.arr[x_350] = x_351;
+    }
+    {
+      int const x_353 = j_1;
+      j_1 = (x_353 + 1);
+    }
+  }
+  int const x_355 = i_1;
+  param_2 = (x_355 + 1);
+  int const x_357 = *(h);
+  param_3 = x_357;
+  int const x_358 = param_2;
+  int const x_360 = (*(tint_symbol_6)).numbers.arr[x_358];
+  x_314 = x_360;
+  int const x_361 = param_2;
+  int const x_362 = param_3;
+  int const x_364 = (*(tint_symbol_6)).numbers.arr[x_362];
+  (*(tint_symbol_6)).numbers.arr[x_361] = x_364;
+  int const x_366 = param_3;
+  int const x_367 = x_314;
+  (*(tint_symbol_6)).numbers.arr[x_366] = x_367;
+  if (false) {
+  } else {
+    int const x_372 = i_1;
+    return (x_372 + 1);
+  }
+  return 0;
+}
+
+void main_1(constant buf0& x_34, thread float4* const tint_symbol_7, thread float4* const tint_symbol_8, thread QuicksortObject* const tint_symbol_9, thread float4* const tint_symbol_10, thread float4* const tint_symbol_11) {
+  int x_91 = 0;
+  int x_92 = 0;
+  int x_93 = 0;
+  tint_array_wrapper x_94 = {};
+  int x_95 = 0;
+  int x_96 = 0;
+  int x_97 = 0;
+  int i_2 = 0;
+  float2 uv = 0.0f;
+  float3 color = 0.0f;
+  float4 const x_98 = *(tint_symbol_7);
+  *(tint_symbol_8) = ((x_98 + float4(1.0f, 1.0f, 0.0f, 0.0f)) * float4(128.0f, 128.0f, 1.0f, 1.0f));
+  i_2 = 0;
+  while (true) {
+    int const x_105 = i_2;
+    if ((x_105 < 10)) {
+    } else {
+      break;
+    }
+    int const x_108 = i_2;
+    int const x_109 = i_2;
+    (*(tint_symbol_9)).numbers.arr[x_108] = (10 - x_109);
+    int const x_112 = i_2;
+    int const x_113 = i_2;
+    int const x_115 = (*(tint_symbol_9)).numbers.arr[x_113];
+    int const x_116 = i_2;
+    int const x_118 = (*(tint_symbol_9)).numbers.arr[x_116];
+    (*(tint_symbol_9)).numbers.arr[x_112] = (x_115 * x_118);
+    {
+      int const x_121 = i_2;
+      i_2 = (x_121 + 1);
+    }
+  }
+  x_91 = 0;
+  x_92 = 9;
+  x_93 = -1;
+  int const x_123 = x_93;
+  int const x_124 = (x_123 + 1);
+  x_93 = x_124;
+  int const x_125 = x_91;
+  x_94.arr[x_124] = x_125;
+  int const x_127 = x_93;
+  int const x_128 = (x_127 + 1);
+  x_93 = x_128;
+  int const x_129 = x_92;
+  x_94.arr[x_128] = x_129;
+  while (true) {
+    int const x_135 = x_93;
+    if ((x_135 >= 0)) {
+    } else {
+      break;
+    }
+    int const x_138 = x_93;
+    x_93 = (x_138 - 1);
+    int const x_141 = x_94.arr[x_138];
+    x_92 = x_141;
+    int const x_142 = x_93;
+    x_93 = (x_142 - 1);
+    int const x_145 = x_94.arr[x_142];
+    x_91 = x_145;
+    int const x_146 = x_91;
+    x_96 = x_146;
+    int const x_147 = x_92;
+    x_97 = x_147;
+    int const x_148 = performPartition_i1_i1_(&(x_96), &(x_97), tint_symbol_9);
+    x_95 = x_148;
+    int const x_149 = x_95;
+    int const x_151 = x_91;
+    if (((x_149 - 1) > x_151)) {
+      int const x_155 = x_93;
+      int const x_156 = (x_155 + 1);
+      x_93 = x_156;
+      int const x_157 = x_91;
+      x_94.arr[x_156] = x_157;
+      int const x_159 = x_93;
+      int const x_160 = (x_159 + 1);
+      x_93 = x_160;
+      int const x_161 = x_95;
+      x_94.arr[x_160] = (x_161 - 1);
+    }
+    int const x_164 = x_95;
+    int const x_166 = x_92;
+    if (((x_164 + 1) < x_166)) {
+      int const x_170 = x_93;
+      int const x_171 = (x_170 + 1);
+      x_93 = x_171;
+      int const x_172 = x_95;
+      x_94.arr[x_171] = (x_172 + 1);
+      int const x_175 = x_93;
+      int const x_176 = (x_175 + 1);
+      x_93 = x_176;
+      int const x_177 = x_92;
+      x_94.arr[x_176] = x_177;
+    }
+  }
+  float4 const x_179 = *(tint_symbol_8);
+  float2 const x_182 = x_34.resolution;
+  uv = (float2(x_179.x, x_179.y) / x_182);
+  color = float3(1.0f, 2.0f, 3.0f);
+  int const x_185 = (*(tint_symbol_9)).numbers.arr[0];
+  float const x_188 = color.x;
+  color.x = (x_188 + float(x_185));
+  float const x_192 = uv.x;
+  if ((x_192 > 0.25f)) {
+    int const x_197 = (*(tint_symbol_9)).numbers.arr[1];
+    float const x_200 = color.x;
+    color.x = (x_200 + float(x_197));
+  }
+  float const x_204 = uv.x;
+  if ((x_204 > 0.5f)) {
+    int const x_209 = (*(tint_symbol_9)).numbers.arr[2];
+    float const x_212 = color.y;
+    color.y = (x_212 + float(x_209));
+  }
+  float const x_216 = uv.x;
+  if ((x_216 > 0.75f)) {
+    int const x_221 = (*(tint_symbol_9)).numbers.arr[3];
+    float const x_224 = color.z;
+    color.z = (x_224 + float(x_221));
+  }
+  int const x_228 = (*(tint_symbol_9)).numbers.arr[4];
+  float const x_231 = color.y;
+  color.y = (x_231 + float(x_228));
+  float const x_235 = uv.y;
+  if ((x_235 > 0.25f)) {
+    int const x_240 = (*(tint_symbol_9)).numbers.arr[5];
+    float const x_243 = color.x;
+    color.x = (x_243 + float(x_240));
+  }
+  float const x_247 = uv.y;
+  if ((x_247 > 0.5f)) {
+    int const x_252 = (*(tint_symbol_9)).numbers.arr[6];
+    float const x_255 = color.y;
+    color.y = (x_255 + float(x_252));
+  }
+  float const x_259 = uv.y;
+  if ((x_259 > 0.75f)) {
+    int const x_264 = (*(tint_symbol_9)).numbers.arr[7];
+    float const x_267 = color.z;
+    color.z = (x_267 + float(x_264));
+  }
+  int const x_271 = (*(tint_symbol_9)).numbers.arr[8];
+  float const x_274 = color.z;
+  color.z = (x_274 + float(x_271));
+  float const x_278 = uv.x;
+  float const x_280 = uv.y;
+  if ((fabs((x_278 - x_280)) < 0.25f)) {
+    int const x_287 = (*(tint_symbol_9)).numbers.arr[9];
+    float const x_290 = color.x;
+    color.x = (x_290 + float(x_287));
+  }
+  float3 const x_293 = color;
+  float3 const x_294 = normalize(x_293);
+  *(tint_symbol_10) = float4(x_294.x, x_294.y, x_294.z, 1.0f);
+  float4 const x_299 = *(tint_symbol_7);
+  *(tint_symbol_11) = x_299;
+  return;
+}
+
+vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]], constant buf0& x_34 [[buffer(0)]]) {
+  thread float4 tint_symbol_12 = 0.0f;
+  thread float4 tint_symbol_13 = 0.0f;
+  thread QuicksortObject tint_symbol_14 = {};
+  thread float4 tint_symbol_15 = 0.0f;
+  thread float4 tint_symbol_16 = 0.0f;
+  float4 const x_GLF_pos_param = tint_symbol_1.x_GLF_pos_param;
+  tint_symbol_12 = x_GLF_pos_param;
+  main_1(x_34, &(tint_symbol_12), &(tint_symbol_13), &(tint_symbol_14), &(tint_symbol_15), &(tint_symbol_16));
+  main_out const tint_symbol_4 = {.frag_color_1=tint_symbol_15, .gl_Position=tint_symbol_16};
+  tint_symbol_3 const tint_symbol_5 = {.frag_color_1=tint_symbol_4.frag_color_1, .gl_Position=tint_symbol_4.gl_Position};
+  return tint_symbol_5;
+}
+
+void swap_i1_i1_(thread int* const i, thread int* const j, thread QuicksortObject* const tint_symbol_17) {
+  int temp = 0;
+  int const x_302 = *(i);
+  int const x_304 = (*(tint_symbol_17)).numbers.arr[x_302];
+  temp = x_304;
+  int const x_305 = *(i);
+  int const x_306 = *(j);
+  int const x_308 = (*(tint_symbol_17)).numbers.arr[x_306];
+  (*(tint_symbol_17)).numbers.arr[x_305] = x_308;
+  int const x_310 = *(j);
+  int const x_311 = temp;
+  (*(tint_symbol_17)).numbers.arr[x_310] = x_311;
+  return;
+}
+
+void quicksort_(thread QuicksortObject* const tint_symbol_18) {
+  int l_1 = 0;
+  int h_1 = 0;
+  int top = 0;
+  tint_array_wrapper stack = {};
+  int p = 0;
+  int param_4 = 0;
+  int param_5 = 0;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  int const x_376 = top;
+  int const x_377 = (x_376 + 1);
+  top = x_377;
+  int const x_378 = l_1;
+  stack.arr[x_377] = x_378;
+  int const x_380 = top;
+  int const x_381 = (x_380 + 1);
+  top = x_381;
+  int const x_382 = h_1;
+  stack.arr[x_381] = x_382;
+  while (true) {
+    int const x_388 = top;
+    if ((x_388 >= 0)) {
+    } else {
+      break;
+    }
+    int const x_391 = top;
+    top = (x_391 - 1);
+    int const x_394 = stack.arr[x_391];
+    h_1 = x_394;
+    int const x_395 = top;
+    top = (x_395 - 1);
+    int const x_398 = stack.arr[x_395];
+    l_1 = x_398;
+    int const x_399 = l_1;
+    param_4 = x_399;
+    int const x_400 = h_1;
+    param_5 = x_400;
+    int const x_401 = performPartition_i1_i1_(&(param_4), &(param_5), tint_symbol_18);
+    p = x_401;
+    int const x_402 = p;
+    int const x_404 = l_1;
+    if (((x_402 - 1) > x_404)) {
+      int const x_408 = top;
+      int const x_409 = (x_408 + 1);
+      top = x_409;
+      int const x_410 = l_1;
+      stack.arr[x_409] = x_410;
+      int const x_412 = top;
+      int const x_413 = (x_412 + 1);
+      top = x_413;
+      int const x_414 = p;
+      stack.arr[x_413] = (x_414 - 1);
+    }
+    int const x_417 = p;
+    int const x_419 = h_1;
+    if (((x_417 + 1) < x_419)) {
+      int const x_423 = top;
+      int const x_424 = (x_423 + 1);
+      top = x_424;
+      int const x_425 = p;
+      stack.arr[x_424] = (x_425 + 1);
+      int const x_428 = top;
+      int const x_429 = (x_428 + 1);
+      top = x_429;
+      int const x_430 = h_1;
+      stack.arr[x_429] = x_430;
+    }
+  }
+  return;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/2.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/2.wgsl.expected.spvasm
new file mode 100644
index 0000000..01d7e03
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/2.wgsl.expected.spvasm
@@ -0,0 +1,713 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 478
+; Schema: 0
+               OpCapability Shader
+        %354 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %tint_pointsize %tint_symbol %tint_symbol_2 %tint_symbol_3
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %QuicksortObject "QuicksortObject"
+               OpMemberName %QuicksortObject 0 "numbers"
+               OpName %obj "obj"
+               OpName %x_GLF_FragCoord "x_GLF_FragCoord"
+               OpName %x_GLF_pos "x_GLF_pos"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_34 "x_34"
+               OpName %frag_color "frag_color"
+               OpName %gl_Position "gl_Position"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %performPartition_i1_i1_ "performPartition_i1_i1_"
+               OpName %l "l"
+               OpName %h "h"
+               OpName %x_314 "x_314"
+               OpName %x_315 "x_315"
+               OpName %pivot "pivot"
+               OpName %i_1 "i_1"
+               OpName %j_1 "j_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %main_1 "main_1"
+               OpName %x_91 "x_91"
+               OpName %x_92 "x_92"
+               OpName %x_93 "x_93"
+               OpName %x_94 "x_94"
+               OpName %x_95 "x_95"
+               OpName %x_96 "x_96"
+               OpName %x_97 "x_97"
+               OpName %i_2 "i_2"
+               OpName %uv "uv"
+               OpName %color "color"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "frag_color_1"
+               OpMemberName %main_out 1 "gl_Position"
+               OpName %tint_symbol_4 "tint_symbol_4"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpName %swap_i1_i1_ "swap_i1_i1_"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %temp "temp"
+               OpName %quicksort_ "quicksort_"
+               OpName %l_1 "l_1"
+               OpName %h_1 "h_1"
+               OpName %top "top"
+               OpName %stack "stack"
+               OpName %p "p"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpMemberDecorate %QuicksortObject 0 Offset 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_34 NonWritable
+               OpDecorate %x_34 DescriptorSet 0
+               OpDecorate %x_34 Binding 0
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %tint_symbol_3 BuiltIn Position
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%QuicksortObject = OpTypeStruct %_arr_int_uint_10
+%_ptr_Private_QuicksortObject = OpTypePointer Private %QuicksortObject
+         %12 = OpConstantNull %QuicksortObject
+        %obj = OpVariable %_ptr_Private_QuicksortObject Private %12
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_FragCoord = OpVariable %_ptr_Private_v4float Private %16
+  %x_GLF_pos = OpVariable %_ptr_Private_v4float Private %16
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_34 = OpVariable %_ptr_Uniform_buf0 Uniform
+ %frag_color = OpVariable %_ptr_Private_v4float Private %16
+%gl_Position = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %16
+%tint_symbol_3 = OpVariable %_ptr_Output_v4float Output %16
+%_ptr_Function_int = OpTypePointer Function %int
+         %29 = OpTypeFunction %int %_ptr_Function_int %_ptr_Function_int
+         %36 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_int = OpTypePointer Private %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+      %int_0 = OpConstant %int 0
+       %void = OpTypeVoid
+        %116 = OpTypeFunction %void
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+        %125 = OpConstantNull %_arr_int_uint_10
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+        %132 = OpConstantNull %v2float
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+        %136 = OpConstantNull %v3float
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+        %140 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_0
+  %float_128 = OpConstant %float 128
+        %143 = OpConstantComposite %v4float %float_128 %float_128 %float_1 %float_1
+     %int_10 = OpConstant %int 10
+      %int_9 = OpConstant %int 9
+     %int_n1 = OpConstant %int -1
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+        %242 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+%_ptr_Function_float = OpTypePointer Function %float
+ %float_0_25 = OpConstant %float 0.25
+  %float_0_5 = OpConstant %float 0.5
+      %int_2 = OpConstant %int 2
+     %uint_1 = OpConstant %uint 1
+ %float_0_75 = OpConstant %float 0.75
+      %int_3 = OpConstant %int 3
+     %uint_2 = OpConstant %uint 2
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+   %main_out = OpTypeStruct %v4float %v4float
+        %373 = OpTypeFunction %void %main_out
+        %388 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+%performPartition_i1_i1_ = OpFunction %int None %29
+          %l = OpFunctionParameter %_ptr_Function_int
+          %h = OpFunctionParameter %_ptr_Function_int
+         %34 = OpLabel
+      %x_314 = OpVariable %_ptr_Function_int Function %36
+      %x_315 = OpVariable %_ptr_Function_int Function %36
+      %pivot = OpVariable %_ptr_Function_int Function %36
+        %i_1 = OpVariable %_ptr_Function_int Function %36
+        %j_1 = OpVariable %_ptr_Function_int Function %36
+      %param = OpVariable %_ptr_Function_int Function %36
+    %param_1 = OpVariable %_ptr_Function_int Function %36
+    %param_2 = OpVariable %_ptr_Function_int Function %36
+    %param_3 = OpVariable %_ptr_Function_int Function %36
+         %46 = OpLoad %int %h
+         %49 = OpAccessChain %_ptr_Private_int %obj %uint_0 %46
+         %50 = OpLoad %int %49
+               OpStore %pivot %50
+         %52 = OpLoad %int %l
+         %54 = OpISub %int %52 %int_1
+               OpStore %i_1 %54
+         %56 = OpLoad %int %l
+               OpStore %j_1 %56
+               OpBranch %57
+         %57 = OpLabel
+               OpLoopMerge %58 %59 None
+               OpBranch %60
+         %60 = OpLabel
+         %61 = OpLoad %int %j_1
+         %63 = OpLoad %int %h
+         %64 = OpISub %int %63 %int_1
+         %65 = OpSLessThanEqual %bool %61 %64
+               OpSelectionMerge %67 None
+               OpBranchConditional %65 %68 %69
+         %68 = OpLabel
+               OpBranch %67
+         %69 = OpLabel
+               OpBranch %58
+         %67 = OpLabel
+         %70 = OpLoad %int %j_1
+         %71 = OpAccessChain %_ptr_Private_int %obj %uint_0 %70
+         %72 = OpLoad %int %71
+         %73 = OpLoad %int %pivot
+         %74 = OpSLessThanEqual %bool %72 %73
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %75
+         %76 = OpLabel
+         %77 = OpLoad %int %i_1
+         %78 = OpIAdd %int %77 %int_1
+               OpStore %i_1 %78
+         %79 = OpLoad %int %i_1
+               OpStore %param %79
+         %80 = OpLoad %int %j_1
+               OpStore %param_1 %80
+         %81 = OpLoad %int %param
+         %82 = OpAccessChain %_ptr_Private_int %obj %uint_0 %81
+         %83 = OpLoad %int %82
+               OpStore %x_315 %83
+         %84 = OpLoad %int %param
+         %85 = OpLoad %int %param_1
+         %86 = OpAccessChain %_ptr_Private_int %obj %uint_0 %85
+         %87 = OpLoad %int %86
+         %88 = OpAccessChain %_ptr_Private_int %obj %uint_0 %84
+               OpStore %88 %87
+         %89 = OpLoad %int %param_1
+         %90 = OpLoad %int %x_315
+         %91 = OpAccessChain %_ptr_Private_int %obj %uint_0 %89
+               OpStore %91 %90
+               OpBranch %75
+         %75 = OpLabel
+               OpBranch %59
+         %59 = OpLabel
+         %92 = OpLoad %int %j_1
+         %93 = OpIAdd %int %92 %int_1
+               OpStore %j_1 %93
+               OpBranch %57
+         %58 = OpLabel
+         %94 = OpLoad %int %i_1
+         %95 = OpIAdd %int %94 %int_1
+               OpStore %param_2 %95
+         %97 = OpLoad %int %h
+               OpStore %param_3 %97
+         %98 = OpLoad %int %param_2
+         %99 = OpAccessChain %_ptr_Private_int %obj %uint_0 %98
+        %100 = OpLoad %int %99
+               OpStore %x_314 %100
+        %101 = OpLoad %int %param_2
+        %102 = OpLoad %int %param_3
+        %103 = OpAccessChain %_ptr_Private_int %obj %uint_0 %102
+        %104 = OpLoad %int %103
+        %105 = OpAccessChain %_ptr_Private_int %obj %uint_0 %101
+               OpStore %105 %104
+        %106 = OpLoad %int %param_3
+        %107 = OpLoad %int %x_314
+        %108 = OpAccessChain %_ptr_Private_int %obj %uint_0 %106
+               OpStore %108 %107
+               OpSelectionMerge %110 None
+               OpBranchConditional %false %111 %112
+        %111 = OpLabel
+               OpBranch %110
+        %112 = OpLabel
+        %113 = OpLoad %int %i_1
+        %114 = OpIAdd %int %113 %int_1
+               OpReturnValue %114
+        %110 = OpLabel
+               OpReturnValue %int_0
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %116
+        %119 = OpLabel
+       %x_91 = OpVariable %_ptr_Function_int Function %36
+       %x_92 = OpVariable %_ptr_Function_int Function %36
+       %x_93 = OpVariable %_ptr_Function_int Function %36
+       %x_94 = OpVariable %_ptr_Function__arr_int_uint_10 Function %125
+       %x_95 = OpVariable %_ptr_Function_int Function %36
+       %x_96 = OpVariable %_ptr_Function_int Function %36
+       %x_97 = OpVariable %_ptr_Function_int Function %36
+        %i_2 = OpVariable %_ptr_Function_int Function %36
+         %uv = OpVariable %_ptr_Function_v2float Function %132
+      %color = OpVariable %_ptr_Function_v3float Function %136
+        %137 = OpLoad %v4float %x_GLF_pos
+        %141 = OpFAdd %v4float %137 %140
+        %144 = OpFMul %v4float %141 %143
+               OpStore %x_GLF_FragCoord %144
+               OpStore %i_2 %int_0
+               OpBranch %145
+        %145 = OpLabel
+               OpLoopMerge %146 %147 None
+               OpBranch %148
+        %148 = OpLabel
+        %149 = OpLoad %int %i_2
+        %151 = OpSLessThan %bool %149 %int_10
+               OpSelectionMerge %152 None
+               OpBranchConditional %151 %153 %154
+        %153 = OpLabel
+               OpBranch %152
+        %154 = OpLabel
+               OpBranch %146
+        %152 = OpLabel
+        %155 = OpLoad %int %i_2
+        %156 = OpLoad %int %i_2
+        %157 = OpAccessChain %_ptr_Private_int %obj %uint_0 %155
+        %158 = OpISub %int %int_10 %156
+               OpStore %157 %158
+        %159 = OpLoad %int %i_2
+        %160 = OpLoad %int %i_2
+        %161 = OpAccessChain %_ptr_Private_int %obj %uint_0 %160
+        %162 = OpLoad %int %161
+        %163 = OpLoad %int %i_2
+        %164 = OpAccessChain %_ptr_Private_int %obj %uint_0 %163
+        %165 = OpLoad %int %164
+        %166 = OpAccessChain %_ptr_Private_int %obj %uint_0 %159
+        %167 = OpIMul %int %162 %165
+               OpStore %166 %167
+               OpBranch %147
+        %147 = OpLabel
+        %168 = OpLoad %int %i_2
+        %169 = OpIAdd %int %168 %int_1
+               OpStore %i_2 %169
+               OpBranch %145
+        %146 = OpLabel
+               OpStore %x_91 %int_0
+               OpStore %x_92 %int_9
+               OpStore %x_93 %int_n1
+        %172 = OpLoad %int %x_93
+        %173 = OpIAdd %int %172 %int_1
+               OpStore %x_93 %173
+        %174 = OpLoad %int %x_91
+        %175 = OpAccessChain %_ptr_Function_int %x_94 %173
+               OpStore %175 %174
+        %176 = OpLoad %int %x_93
+        %177 = OpIAdd %int %176 %int_1
+               OpStore %x_93 %177
+        %178 = OpLoad %int %x_92
+        %179 = OpAccessChain %_ptr_Function_int %x_94 %177
+               OpStore %179 %178
+               OpBranch %180
+        %180 = OpLabel
+               OpLoopMerge %181 %182 None
+               OpBranch %183
+        %183 = OpLabel
+        %184 = OpLoad %int %x_93
+        %185 = OpSGreaterThanEqual %bool %184 %int_0
+               OpSelectionMerge %186 None
+               OpBranchConditional %185 %187 %188
+        %187 = OpLabel
+               OpBranch %186
+        %188 = OpLabel
+               OpBranch %181
+        %186 = OpLabel
+        %189 = OpLoad %int %x_93
+        %190 = OpISub %int %189 %int_1
+               OpStore %x_93 %190
+        %191 = OpAccessChain %_ptr_Function_int %x_94 %189
+        %192 = OpLoad %int %191
+               OpStore %x_92 %192
+        %193 = OpLoad %int %x_93
+        %194 = OpISub %int %193 %int_1
+               OpStore %x_93 %194
+        %195 = OpAccessChain %_ptr_Function_int %x_94 %193
+        %196 = OpLoad %int %195
+               OpStore %x_91 %196
+        %197 = OpLoad %int %x_91
+               OpStore %x_96 %197
+        %198 = OpLoad %int %x_92
+               OpStore %x_97 %198
+        %199 = OpFunctionCall %int %performPartition_i1_i1_ %x_96 %x_97
+               OpStore %x_95 %199
+        %202 = OpLoad %int %x_95
+        %203 = OpLoad %int %x_91
+        %204 = OpISub %int %202 %int_1
+        %205 = OpSGreaterThan %bool %204 %203
+               OpSelectionMerge %206 None
+               OpBranchConditional %205 %207 %206
+        %207 = OpLabel
+        %208 = OpLoad %int %x_93
+        %209 = OpIAdd %int %208 %int_1
+               OpStore %x_93 %209
+        %210 = OpLoad %int %x_91
+        %211 = OpAccessChain %_ptr_Function_int %x_94 %209
+               OpStore %211 %210
+        %212 = OpLoad %int %x_93
+        %213 = OpIAdd %int %212 %int_1
+               OpStore %x_93 %213
+        %214 = OpLoad %int %x_95
+        %215 = OpAccessChain %_ptr_Function_int %x_94 %213
+        %216 = OpISub %int %214 %int_1
+               OpStore %215 %216
+               OpBranch %206
+        %206 = OpLabel
+        %217 = OpLoad %int %x_95
+        %218 = OpLoad %int %x_92
+        %219 = OpIAdd %int %217 %int_1
+        %220 = OpSLessThan %bool %219 %218
+               OpSelectionMerge %221 None
+               OpBranchConditional %220 %222 %221
+        %222 = OpLabel
+        %223 = OpLoad %int %x_93
+        %224 = OpIAdd %int %223 %int_1
+               OpStore %x_93 %224
+        %225 = OpLoad %int %x_95
+        %226 = OpAccessChain %_ptr_Function_int %x_94 %224
+        %227 = OpIAdd %int %225 %int_1
+               OpStore %226 %227
+        %228 = OpLoad %int %x_93
+        %229 = OpIAdd %int %228 %int_1
+               OpStore %x_93 %229
+        %230 = OpLoad %int %x_92
+        %231 = OpAccessChain %_ptr_Function_int %x_94 %229
+               OpStore %231 %230
+               OpBranch %221
+        %221 = OpLabel
+               OpBranch %182
+        %182 = OpLabel
+               OpBranch %180
+        %181 = OpLabel
+        %232 = OpLoad %v4float %x_GLF_FragCoord
+        %234 = OpAccessChain %_ptr_Uniform_v2float %x_34 %uint_0
+        %235 = OpLoad %v2float %234
+        %236 = OpCompositeExtract %float %232 0
+        %237 = OpCompositeExtract %float %232 1
+        %238 = OpCompositeConstruct %v2float %236 %237
+        %239 = OpFDiv %v2float %238 %235
+               OpStore %uv %239
+               OpStore %color %242
+        %243 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_0
+        %244 = OpLoad %int %243
+        %246 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %247 = OpLoad %float %246
+        %248 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %249 = OpConvertSToF %float %244
+        %250 = OpFAdd %float %247 %249
+               OpStore %248 %250
+        %251 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %252 = OpLoad %float %251
+        %254 = OpFOrdGreaterThan %bool %252 %float_0_25
+               OpSelectionMerge %255 None
+               OpBranchConditional %254 %256 %255
+        %256 = OpLabel
+        %257 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_1
+        %258 = OpLoad %int %257
+        %259 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %260 = OpLoad %float %259
+        %261 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %262 = OpConvertSToF %float %258
+        %263 = OpFAdd %float %260 %262
+               OpStore %261 %263
+               OpBranch %255
+        %255 = OpLabel
+        %264 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %265 = OpLoad %float %264
+        %267 = OpFOrdGreaterThan %bool %265 %float_0_5
+               OpSelectionMerge %268 None
+               OpBranchConditional %267 %269 %268
+        %269 = OpLabel
+        %271 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_2
+        %272 = OpLoad %int %271
+        %274 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %275 = OpLoad %float %274
+        %276 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %277 = OpConvertSToF %float %272
+        %278 = OpFAdd %float %275 %277
+               OpStore %276 %278
+               OpBranch %268
+        %268 = OpLabel
+        %279 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %280 = OpLoad %float %279
+        %282 = OpFOrdGreaterThan %bool %280 %float_0_75
+               OpSelectionMerge %283 None
+               OpBranchConditional %282 %284 %283
+        %284 = OpLabel
+        %286 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_3
+        %287 = OpLoad %int %286
+        %289 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %290 = OpLoad %float %289
+        %291 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %292 = OpConvertSToF %float %287
+        %293 = OpFAdd %float %290 %292
+               OpStore %291 %293
+               OpBranch %283
+        %283 = OpLabel
+        %295 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_4
+        %296 = OpLoad %int %295
+        %297 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %298 = OpLoad %float %297
+        %299 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %300 = OpConvertSToF %float %296
+        %301 = OpFAdd %float %298 %300
+               OpStore %299 %301
+        %302 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %303 = OpLoad %float %302
+        %304 = OpFOrdGreaterThan %bool %303 %float_0_25
+               OpSelectionMerge %305 None
+               OpBranchConditional %304 %306 %305
+        %306 = OpLabel
+        %308 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_5
+        %309 = OpLoad %int %308
+        %310 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %311 = OpLoad %float %310
+        %312 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %313 = OpConvertSToF %float %309
+        %314 = OpFAdd %float %311 %313
+               OpStore %312 %314
+               OpBranch %305
+        %305 = OpLabel
+        %315 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %316 = OpLoad %float %315
+        %317 = OpFOrdGreaterThan %bool %316 %float_0_5
+               OpSelectionMerge %318 None
+               OpBranchConditional %317 %319 %318
+        %319 = OpLabel
+        %321 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_6
+        %322 = OpLoad %int %321
+        %323 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %324 = OpLoad %float %323
+        %325 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %326 = OpConvertSToF %float %322
+        %327 = OpFAdd %float %324 %326
+               OpStore %325 %327
+               OpBranch %318
+        %318 = OpLabel
+        %328 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %329 = OpLoad %float %328
+        %330 = OpFOrdGreaterThan %bool %329 %float_0_75
+               OpSelectionMerge %331 None
+               OpBranchConditional %330 %332 %331
+        %332 = OpLabel
+        %334 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_7
+        %335 = OpLoad %int %334
+        %336 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %337 = OpLoad %float %336
+        %338 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %339 = OpConvertSToF %float %335
+        %340 = OpFAdd %float %337 %339
+               OpStore %338 %340
+               OpBranch %331
+        %331 = OpLabel
+        %342 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_8
+        %343 = OpLoad %int %342
+        %344 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %345 = OpLoad %float %344
+        %346 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %347 = OpConvertSToF %float %343
+        %348 = OpFAdd %float %345 %347
+               OpStore %346 %348
+        %349 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %350 = OpLoad %float %349
+        %351 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %352 = OpLoad %float %351
+        %355 = OpFSub %float %350 %352
+        %353 = OpExtInst %float %354 FAbs %355
+        %356 = OpFOrdLessThan %bool %353 %float_0_25
+               OpSelectionMerge %357 None
+               OpBranchConditional %356 %358 %357
+        %358 = OpLabel
+        %359 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_9
+        %360 = OpLoad %int %359
+        %361 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %362 = OpLoad %float %361
+        %363 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %364 = OpConvertSToF %float %360
+        %365 = OpFAdd %float %362 %364
+               OpStore %363 %365
+               OpBranch %357
+        %357 = OpLabel
+        %366 = OpLoad %v3float %color
+        %367 = OpExtInst %v3float %354 Normalize %366
+        %368 = OpCompositeExtract %float %367 0
+        %369 = OpCompositeExtract %float %367 1
+        %370 = OpCompositeExtract %float %367 2
+        %371 = OpCompositeConstruct %v4float %368 %369 %370 %float_1
+               OpStore %frag_color %371
+        %372 = OpLoad %v4float %x_GLF_pos
+               OpStore %gl_Position %372
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_4 = OpFunction %void None %373
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %377 = OpLabel
+        %378 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %378
+        %379 = OpCompositeExtract %v4float %tint_symbol_1 1
+               OpStore %tint_symbol_3 %379
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %116
+        %381 = OpLabel
+               OpStore %tint_pointsize %float_1
+        %382 = OpLoad %v4float %tint_symbol
+               OpStore %x_GLF_pos %382
+        %383 = OpFunctionCall %void %main_1
+        %385 = OpLoad %v4float %frag_color
+        %386 = OpLoad %v4float %gl_Position
+        %387 = OpCompositeConstruct %main_out %385 %386
+        %384 = OpFunctionCall %void %tint_symbol_4 %387
+               OpReturn
+               OpFunctionEnd
+%swap_i1_i1_ = OpFunction %void None %388
+          %i = OpFunctionParameter %_ptr_Function_int
+          %j = OpFunctionParameter %_ptr_Function_int
+        %392 = OpLabel
+       %temp = OpVariable %_ptr_Function_int Function %36
+        %395 = OpLoad %int %i
+        %396 = OpAccessChain %_ptr_Private_int %obj %uint_0 %395
+        %397 = OpLoad %int %396
+               OpStore %temp %397
+        %399 = OpLoad %int %i
+        %401 = OpLoad %int %j
+        %402 = OpAccessChain %_ptr_Private_int %obj %uint_0 %401
+        %403 = OpLoad %int %402
+        %404 = OpAccessChain %_ptr_Private_int %obj %uint_0 %399
+               OpStore %404 %403
+        %406 = OpLoad %int %j
+        %407 = OpLoad %int %temp
+        %408 = OpAccessChain %_ptr_Private_int %obj %uint_0 %406
+               OpStore %408 %407
+               OpReturn
+               OpFunctionEnd
+ %quicksort_ = OpFunction %void None %116
+        %410 = OpLabel
+        %l_1 = OpVariable %_ptr_Function_int Function %36
+        %h_1 = OpVariable %_ptr_Function_int Function %36
+        %top = OpVariable %_ptr_Function_int Function %36
+      %stack = OpVariable %_ptr_Function__arr_int_uint_10 Function %125
+          %p = OpVariable %_ptr_Function_int Function %36
+    %param_4 = OpVariable %_ptr_Function_int Function %36
+    %param_5 = OpVariable %_ptr_Function_int Function %36
+               OpStore %l_1 %int_0
+               OpStore %h_1 %int_9
+               OpStore %top %int_n1
+        %418 = OpLoad %int %top
+        %419 = OpIAdd %int %418 %int_1
+               OpStore %top %419
+        %420 = OpLoad %int %l_1
+        %421 = OpAccessChain %_ptr_Function_int %stack %419
+               OpStore %421 %420
+        %422 = OpLoad %int %top
+        %423 = OpIAdd %int %422 %int_1
+               OpStore %top %423
+        %424 = OpLoad %int %h_1
+        %425 = OpAccessChain %_ptr_Function_int %stack %423
+               OpStore %425 %424
+               OpBranch %426
+        %426 = OpLabel
+               OpLoopMerge %427 %428 None
+               OpBranch %429
+        %429 = OpLabel
+        %430 = OpLoad %int %top
+        %431 = OpSGreaterThanEqual %bool %430 %int_0
+               OpSelectionMerge %432 None
+               OpBranchConditional %431 %433 %434
+        %433 = OpLabel
+               OpBranch %432
+        %434 = OpLabel
+               OpBranch %427
+        %432 = OpLabel
+        %435 = OpLoad %int %top
+        %436 = OpISub %int %435 %int_1
+               OpStore %top %436
+        %437 = OpAccessChain %_ptr_Function_int %stack %435
+        %438 = OpLoad %int %437
+               OpStore %h_1 %438
+        %439 = OpLoad %int %top
+        %440 = OpISub %int %439 %int_1
+               OpStore %top %440
+        %441 = OpAccessChain %_ptr_Function_int %stack %439
+        %442 = OpLoad %int %441
+               OpStore %l_1 %442
+        %443 = OpLoad %int %l_1
+               OpStore %param_4 %443
+        %444 = OpLoad %int %h_1
+               OpStore %param_5 %444
+        %445 = OpFunctionCall %int %performPartition_i1_i1_ %param_4 %param_5
+               OpStore %p %445
+        %448 = OpLoad %int %p
+        %449 = OpLoad %int %l_1
+        %450 = OpISub %int %448 %int_1
+        %451 = OpSGreaterThan %bool %450 %449
+               OpSelectionMerge %452 None
+               OpBranchConditional %451 %453 %452
+        %453 = OpLabel
+        %454 = OpLoad %int %top
+        %455 = OpIAdd %int %454 %int_1
+               OpStore %top %455
+        %456 = OpLoad %int %l_1
+        %457 = OpAccessChain %_ptr_Function_int %stack %455
+               OpStore %457 %456
+        %458 = OpLoad %int %top
+        %459 = OpIAdd %int %458 %int_1
+               OpStore %top %459
+        %460 = OpLoad %int %p
+        %461 = OpAccessChain %_ptr_Function_int %stack %459
+        %462 = OpISub %int %460 %int_1
+               OpStore %461 %462
+               OpBranch %452
+        %452 = OpLabel
+        %463 = OpLoad %int %p
+        %464 = OpLoad %int %h_1
+        %465 = OpIAdd %int %463 %int_1
+        %466 = OpSLessThan %bool %465 %464
+               OpSelectionMerge %467 None
+               OpBranchConditional %466 %468 %467
+        %468 = OpLabel
+        %469 = OpLoad %int %top
+        %470 = OpIAdd %int %469 %int_1
+               OpStore %top %470
+        %471 = OpLoad %int %p
+        %472 = OpAccessChain %_ptr_Function_int %stack %470
+        %473 = OpIAdd %int %471 %int_1
+               OpStore %472 %473
+        %474 = OpLoad %int %top
+        %475 = OpIAdd %int %474 %int_1
+               OpStore %top %475
+        %476 = OpLoad %int %h_1
+        %477 = OpAccessChain %_ptr_Function_int %stack %475
+               OpStore %477 %476
+               OpBranch %467
+        %467 = OpLabel
+               OpBranch %428
+        %428 = OpLabel
+               OpBranch %426
+        %427 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/2.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/2.wgsl.expected.wgsl
new file mode 100644
index 0000000..7c15a5c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-if-false-else-return/2.wgsl.expected.wgsl
@@ -0,0 +1,356 @@
+struct QuicksortObject {
+  numbers : array<i32, 10>;
+};
+
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> obj : QuicksortObject;
+
+var<private> x_GLF_FragCoord : vec4<f32>;
+
+var<private> x_GLF_pos : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_34 : buf0;
+
+var<private> frag_color : vec4<f32>;
+
+var<private> gl_Position : vec4<f32>;
+
+fn performPartition_i1_i1_(l : ptr<function, i32>, h : ptr<function, i32>) -> i32 {
+  var x_314 : i32;
+  var x_315 : i32;
+  var pivot : i32;
+  var i_1 : i32;
+  var j_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  var param_3 : i32;
+  let x_316 : i32 = *(h);
+  let x_318 : i32 = obj.numbers[x_316];
+  pivot = x_318;
+  let x_319 : i32 = *(l);
+  i_1 = (x_319 - 1);
+  let x_321 : i32 = *(l);
+  j_1 = x_321;
+  loop {
+    let x_326 : i32 = j_1;
+    let x_327 : i32 = *(h);
+    if ((x_326 <= (x_327 - 1))) {
+    } else {
+      break;
+    }
+    let x_331 : i32 = j_1;
+    let x_333 : i32 = obj.numbers[x_331];
+    let x_334 : i32 = pivot;
+    if ((x_333 <= x_334)) {
+      let x_338 : i32 = i_1;
+      i_1 = (x_338 + 1);
+      let x_340 : i32 = i_1;
+      param = x_340;
+      let x_341 : i32 = j_1;
+      param_1 = x_341;
+      let x_342 : i32 = param;
+      let x_344 : i32 = obj.numbers[x_342];
+      x_315 = x_344;
+      let x_345 : i32 = param;
+      let x_346 : i32 = param_1;
+      let x_348 : i32 = obj.numbers[x_346];
+      obj.numbers[x_345] = x_348;
+      let x_350 : i32 = param_1;
+      let x_351 : i32 = x_315;
+      obj.numbers[x_350] = x_351;
+    }
+
+    continuing {
+      let x_353 : i32 = j_1;
+      j_1 = (x_353 + 1);
+    }
+  }
+  let x_355 : i32 = i_1;
+  param_2 = (x_355 + 1);
+  let x_357 : i32 = *(h);
+  param_3 = x_357;
+  let x_358 : i32 = param_2;
+  let x_360 : i32 = obj.numbers[x_358];
+  x_314 = x_360;
+  let x_361 : i32 = param_2;
+  let x_362 : i32 = param_3;
+  let x_364 : i32 = obj.numbers[x_362];
+  obj.numbers[x_361] = x_364;
+  let x_366 : i32 = param_3;
+  let x_367 : i32 = x_314;
+  obj.numbers[x_366] = x_367;
+  if (false) {
+  } else {
+    let x_372 : i32 = i_1;
+    return (x_372 + 1);
+  }
+  return 0;
+}
+
+fn main_1() {
+  var x_91 : i32;
+  var x_92 : i32;
+  var x_93 : i32;
+  var x_94 : array<i32, 10>;
+  var x_95 : i32;
+  var x_96 : i32;
+  var x_97 : i32;
+  var i_2 : i32;
+  var uv : vec2<f32>;
+  var color : vec3<f32>;
+  let x_98 : vec4<f32> = x_GLF_pos;
+  x_GLF_FragCoord = ((x_98 + vec4<f32>(1.0, 1.0, 0.0, 0.0)) * vec4<f32>(128.0, 128.0, 1.0, 1.0));
+  i_2 = 0;
+  loop {
+    let x_105 : i32 = i_2;
+    if ((x_105 < 10)) {
+    } else {
+      break;
+    }
+    let x_108 : i32 = i_2;
+    let x_109 : i32 = i_2;
+    obj.numbers[x_108] = (10 - x_109);
+    let x_112 : i32 = i_2;
+    let x_113 : i32 = i_2;
+    let x_115 : i32 = obj.numbers[x_113];
+    let x_116 : i32 = i_2;
+    let x_118 : i32 = obj.numbers[x_116];
+    obj.numbers[x_112] = (x_115 * x_118);
+
+    continuing {
+      let x_121 : i32 = i_2;
+      i_2 = (x_121 + 1);
+    }
+  }
+  x_91 = 0;
+  x_92 = 9;
+  x_93 = -1;
+  let x_123 : i32 = x_93;
+  let x_124 : i32 = (x_123 + 1);
+  x_93 = x_124;
+  let x_125 : i32 = x_91;
+  x_94[x_124] = x_125;
+  let x_127 : i32 = x_93;
+  let x_128 : i32 = (x_127 + 1);
+  x_93 = x_128;
+  let x_129 : i32 = x_92;
+  x_94[x_128] = x_129;
+  loop {
+    let x_135 : i32 = x_93;
+    if ((x_135 >= 0)) {
+    } else {
+      break;
+    }
+    let x_138 : i32 = x_93;
+    x_93 = (x_138 - 1);
+    let x_141 : i32 = x_94[x_138];
+    x_92 = x_141;
+    let x_142 : i32 = x_93;
+    x_93 = (x_142 - 1);
+    let x_145 : i32 = x_94[x_142];
+    x_91 = x_145;
+    let x_146 : i32 = x_91;
+    x_96 = x_146;
+    let x_147 : i32 = x_92;
+    x_97 = x_147;
+    let x_148 : i32 = performPartition_i1_i1_(&(x_96), &(x_97));
+    x_95 = x_148;
+    let x_149 : i32 = x_95;
+    let x_151 : i32 = x_91;
+    if (((x_149 - 1) > x_151)) {
+      let x_155 : i32 = x_93;
+      let x_156 : i32 = (x_155 + 1);
+      x_93 = x_156;
+      let x_157 : i32 = x_91;
+      x_94[x_156] = x_157;
+      let x_159 : i32 = x_93;
+      let x_160 : i32 = (x_159 + 1);
+      x_93 = x_160;
+      let x_161 : i32 = x_95;
+      x_94[x_160] = (x_161 - 1);
+    }
+    let x_164 : i32 = x_95;
+    let x_166 : i32 = x_92;
+    if (((x_164 + 1) < x_166)) {
+      let x_170 : i32 = x_93;
+      let x_171 : i32 = (x_170 + 1);
+      x_93 = x_171;
+      let x_172 : i32 = x_95;
+      x_94[x_171] = (x_172 + 1);
+      let x_175 : i32 = x_93;
+      let x_176 : i32 = (x_175 + 1);
+      x_93 = x_176;
+      let x_177 : i32 = x_92;
+      x_94[x_176] = x_177;
+    }
+  }
+  let x_179 : vec4<f32> = x_GLF_FragCoord;
+  let x_182 : vec2<f32> = x_34.resolution;
+  uv = (vec2<f32>(x_179.x, x_179.y) / x_182);
+  color = vec3<f32>(1.0, 2.0, 3.0);
+  let x_185 : i32 = obj.numbers[0];
+  let x_188 : f32 = color.x;
+  color.x = (x_188 + f32(x_185));
+  let x_192 : f32 = uv.x;
+  if ((x_192 > 0.25)) {
+    let x_197 : i32 = obj.numbers[1];
+    let x_200 : f32 = color.x;
+    color.x = (x_200 + f32(x_197));
+  }
+  let x_204 : f32 = uv.x;
+  if ((x_204 > 0.5)) {
+    let x_209 : i32 = obj.numbers[2];
+    let x_212 : f32 = color.y;
+    color.y = (x_212 + f32(x_209));
+  }
+  let x_216 : f32 = uv.x;
+  if ((x_216 > 0.75)) {
+    let x_221 : i32 = obj.numbers[3];
+    let x_224 : f32 = color.z;
+    color.z = (x_224 + f32(x_221));
+  }
+  let x_228 : i32 = obj.numbers[4];
+  let x_231 : f32 = color.y;
+  color.y = (x_231 + f32(x_228));
+  let x_235 : f32 = uv.y;
+  if ((x_235 > 0.25)) {
+    let x_240 : i32 = obj.numbers[5];
+    let x_243 : f32 = color.x;
+    color.x = (x_243 + f32(x_240));
+  }
+  let x_247 : f32 = uv.y;
+  if ((x_247 > 0.5)) {
+    let x_252 : i32 = obj.numbers[6];
+    let x_255 : f32 = color.y;
+    color.y = (x_255 + f32(x_252));
+  }
+  let x_259 : f32 = uv.y;
+  if ((x_259 > 0.75)) {
+    let x_264 : i32 = obj.numbers[7];
+    let x_267 : f32 = color.z;
+    color.z = (x_267 + f32(x_264));
+  }
+  let x_271 : i32 = obj.numbers[8];
+  let x_274 : f32 = color.z;
+  color.z = (x_274 + f32(x_271));
+  let x_278 : f32 = uv.x;
+  let x_280 : f32 = uv.y;
+  if ((abs((x_278 - x_280)) < 0.25)) {
+    let x_287 : i32 = obj.numbers[9];
+    let x_290 : f32 = color.x;
+    color.x = (x_290 + f32(x_287));
+  }
+  let x_293 : vec3<f32> = color;
+  let x_294 : vec3<f32> = normalize(x_293);
+  frag_color = vec4<f32>(x_294.x, x_294.y, x_294.z, 1.0);
+  let x_299 : vec4<f32> = x_GLF_pos;
+  gl_Position = x_299;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  frag_color_1 : vec4<f32>;
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] x_GLF_pos_param : vec4<f32>) -> main_out {
+  x_GLF_pos = x_GLF_pos_param;
+  main_1();
+  return main_out(frag_color, gl_Position);
+}
+
+fn swap_i1_i1_(i : ptr<function, i32>, j : ptr<function, i32>) {
+  var temp : i32;
+  let x_302 : i32 = *(i);
+  let x_304 : i32 = obj.numbers[x_302];
+  temp = x_304;
+  let x_305 : i32 = *(i);
+  let x_306 : i32 = *(j);
+  let x_308 : i32 = obj.numbers[x_306];
+  obj.numbers[x_305] = x_308;
+  let x_310 : i32 = *(j);
+  let x_311 : i32 = temp;
+  obj.numbers[x_310] = x_311;
+  return;
+}
+
+fn quicksort_() {
+  var l_1 : i32;
+  var h_1 : i32;
+  var top : i32;
+  var stack : array<i32, 10>;
+  var p : i32;
+  var param_4 : i32;
+  var param_5 : i32;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  let x_376 : i32 = top;
+  let x_377 : i32 = (x_376 + 1);
+  top = x_377;
+  let x_378 : i32 = l_1;
+  stack[x_377] = x_378;
+  let x_380 : i32 = top;
+  let x_381 : i32 = (x_380 + 1);
+  top = x_381;
+  let x_382 : i32 = h_1;
+  stack[x_381] = x_382;
+  loop {
+    let x_388 : i32 = top;
+    if ((x_388 >= 0)) {
+    } else {
+      break;
+    }
+    let x_391 : i32 = top;
+    top = (x_391 - 1);
+    let x_394 : i32 = stack[x_391];
+    h_1 = x_394;
+    let x_395 : i32 = top;
+    top = (x_395 - 1);
+    let x_398 : i32 = stack[x_395];
+    l_1 = x_398;
+    let x_399 : i32 = l_1;
+    param_4 = x_399;
+    let x_400 : i32 = h_1;
+    param_5 = x_400;
+    let x_401 : i32 = performPartition_i1_i1_(&(param_4), &(param_5));
+    p = x_401;
+    let x_402 : i32 = p;
+    let x_404 : i32 = l_1;
+    if (((x_402 - 1) > x_404)) {
+      let x_408 : i32 = top;
+      let x_409 : i32 = (x_408 + 1);
+      top = x_409;
+      let x_410 : i32 = l_1;
+      stack[x_409] = x_410;
+      let x_412 : i32 = top;
+      let x_413 : i32 = (x_412 + 1);
+      top = x_413;
+      let x_414 : i32 = p;
+      stack[x_413] = (x_414 - 1);
+    }
+    let x_417 : i32 = p;
+    let x_419 : i32 = h_1;
+    if (((x_417 + 1) < x_419)) {
+      let x_423 : i32 = top;
+      let x_424 : i32 = (x_423 + 1);
+      top = x_424;
+      let x_425 : i32 = p;
+      stack[x_424] = (x_425 + 1);
+      let x_428 : i32 = top;
+      let x_429 : i32 = (x_428 + 1);
+      top = x_429;
+      let x_430 : i32 = h_1;
+      stack[x_429] = x_430;
+    }
+  }
+  return;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-max-value-as-index/2-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-max-value-as-index/2-opt.spvasm
new file mode 100644
index 0000000..2426da3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-max-value-as-index/2-opt.spvasm
@@ -0,0 +1,528 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %_GLF_pos %frag_color %__1
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %swap_i1_i1_ "swap(i1;i1;"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %performPartition_i1_i1_ "performPartition(i1;i1;"
+               OpName %l "l"
+               OpName %h "h"
+               OpName %quicksort_ "quicksort("
+               OpName %temp "temp"
+               OpName %QuicksortObject "QuicksortObject"
+               OpMemberName %QuicksortObject 0 "numbers"
+               OpName %obj "obj"
+               OpName %pivot "pivot"
+               OpName %i_0 "i"
+               OpName %j_0 "j"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %param_1 "param"
+               OpName %param_2 "param"
+               OpName %l_0 "l"
+               OpName %h_0 "h"
+               OpName %top "top"
+               OpName %stack "stack"
+               OpName %p "p"
+               OpName %param_3 "param"
+               OpName %param_4 "param"
+               OpName %_GLF_FragCoord "_GLF_FragCoord"
+               OpName %_GLF_pos "_GLF_pos"
+               OpName %i_1 "i"
+               OpName %uv "uv"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "resolution"
+               OpName %_ ""
+               OpName %color "color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %__0 ""
+               OpName %frag_color "frag_color"
+               OpName %gl_PerVertex "gl_PerVertex"
+               OpMemberName %gl_PerVertex 0 "gl_Position"
+               OpMemberName %gl_PerVertex 1 "gl_PointSize"
+               OpName %__1 ""
+               OpDecorate %_GLF_pos Location 0
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %frag_color Location 0
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpDecorate %gl_PerVertex Block
+       %void = OpTypeVoid
+         %40 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %43 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+         %44 = OpTypeFunction %int %_ptr_Function_int %_ptr_Function_int
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%QuicksortObject = OpTypeStruct %_arr_int_uint_10
+%_ptr_Private_QuicksortObject = OpTypePointer Private %QuicksortObject
+        %obj = OpVariable %_ptr_Private_QuicksortObject Private
+      %int_0 = OpConstant %int 0
+%_ptr_Private_int = OpTypePointer Private %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %int_9 = OpConstant %int 9
+     %int_n1 = OpConstant %int -1
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+%_GLF_FragCoord = OpVariable %_ptr_Private_v4float Private
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+   %_GLF_pos = OpVariable %_ptr_Input_v4float Input
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %62 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_0
+  %float_128 = OpConstant %float 128
+         %64 = OpConstantComposite %v4float %float_128 %float_128 %float_1 %float_1
+     %int_10 = OpConstant %int 10
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+         %74 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+ %float_0_25 = OpConstant %float 0.25
+  %float_0_5 = OpConstant %float 0.5
+      %int_2 = OpConstant %int 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+ %float_0_75 = OpConstant %float 0.75
+      %int_3 = OpConstant %int 3
+     %uint_2 = OpConstant %uint 2
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %frag_color = OpVariable %_ptr_Output_v4float Output
+%gl_PerVertex = OpTypeStruct %v4float %float
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+        %__1 = OpVariable %_ptr_Output_gl_PerVertex Output
+       %main = OpFunction %void None %40
+         %93 = OpLabel
+        %i_1 = OpVariable %_ptr_Function_int Function
+         %uv = OpVariable %_ptr_Function_v2float Function
+      %color = OpVariable %_ptr_Function_v3float Function
+         %94 = OpLoad %v4float %_GLF_pos
+         %95 = OpFAdd %v4float %94 %62
+         %96 = OpFMul %v4float %95 %64
+               OpStore %_GLF_FragCoord %96
+               OpStore %i_1 %int_0
+               OpBranch %97
+         %97 = OpLabel
+               OpLoopMerge %98 %99 None
+               OpBranch %100
+        %100 = OpLabel
+        %101 = OpLoad %int %i_1
+        %102 = OpSLessThan %bool %101 %int_10
+               OpBranchConditional %102 %103 %98
+        %103 = OpLabel
+        %104 = OpLoad %int %i_1
+        %105 = OpLoad %int %i_1
+        %106 = OpISub %int %int_10 %105
+        %107 = OpAccessChain %_ptr_Private_int %obj %int_0 %104
+               OpStore %107 %106
+        %108 = OpLoad %int %i_1
+        %109 = OpLoad %int %i_1
+        %110 = OpAccessChain %_ptr_Private_int %obj %int_0 %109
+        %111 = OpLoad %int %110
+        %112 = OpLoad %int %i_1
+        %113 = OpAccessChain %_ptr_Private_int %obj %int_0 %112
+        %114 = OpLoad %int %113
+        %115 = OpIMul %int %111 %114
+        %116 = OpAccessChain %_ptr_Private_int %obj %int_0 %108
+               OpStore %116 %115
+               OpBranch %99
+         %99 = OpLabel
+        %117 = OpLoad %int %i_1
+        %118 = OpIAdd %int %117 %int_1
+               OpStore %i_1 %118
+               OpBranch %97
+         %98 = OpLabel
+        %119 = OpFunctionCall %void %quicksort_
+        %120 = OpLoad %v4float %_GLF_FragCoord
+        %121 = OpVectorShuffle %v2float %120 %120 0 1
+        %122 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+        %123 = OpLoad %v2float %122
+        %124 = OpFDiv %v2float %121 %123
+               OpStore %uv %124
+               OpStore %color %74
+        %125 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_0
+        %126 = OpLoad %int %125
+        %127 = OpConvertSToF %float %126
+        %128 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %129 = OpLoad %float %128
+        %130 = OpFAdd %float %129 %127
+        %131 = OpAccessChain %_ptr_Function_float %color %uint_0
+               OpStore %131 %130
+        %132 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %133 = OpLoad %float %132
+        %134 = OpFOrdGreaterThan %bool %133 %float_0_25
+               OpSelectionMerge %135 None
+               OpBranchConditional %134 %136 %135
+        %136 = OpLabel
+        %137 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_1
+        %138 = OpLoad %int %137
+        %139 = OpConvertSToF %float %138
+        %140 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %141 = OpLoad %float %140
+        %142 = OpFAdd %float %141 %139
+        %143 = OpAccessChain %_ptr_Function_float %color %uint_0
+               OpStore %143 %142
+               OpBranch %135
+        %135 = OpLabel
+        %144 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %145 = OpLoad %float %144
+        %146 = OpFOrdGreaterThan %bool %145 %float_0_5
+               OpSelectionMerge %147 None
+               OpBranchConditional %146 %148 %147
+        %148 = OpLabel
+        %149 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %uint_1
+        %150 = OpLoad %float %149
+        %151 = OpConvertFToS %int %150
+        %152 = OpIMul %int %int_2 %151
+        %153 = OpExtInst %int %1 SMax %152 %int_2
+        %154 = OpAccessChain %_ptr_Private_int %obj %int_0 %153
+        %155 = OpLoad %int %154
+        %156 = OpConvertSToF %float %155
+        %157 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %uint_1
+        %158 = OpLoad %float %157
+        %159 = OpConvertFToS %int %158
+        %160 = OpIMul %int %int_2 %159
+        %161 = OpExtInst %int %1 SMax %160 %int_2
+        %162 = OpAccessChain %_ptr_Private_int %obj %int_0 %161
+        %163 = OpLoad %int %162
+        %164 = OpConvertSToF %float %163
+        %165 = OpExtInst %float %1 FMax %156 %164
+        %166 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %167 = OpLoad %float %166
+        %168 = OpFAdd %float %167 %165
+        %169 = OpAccessChain %_ptr_Function_float %color %uint_1
+               OpStore %169 %168
+               OpBranch %147
+        %147 = OpLabel
+        %170 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %171 = OpLoad %float %170
+        %172 = OpFOrdGreaterThan %bool %171 %float_0_75
+               OpSelectionMerge %173 None
+               OpBranchConditional %172 %174 %173
+        %174 = OpLabel
+        %175 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_3
+        %176 = OpLoad %int %175
+        %177 = OpConvertSToF %float %176
+        %178 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %179 = OpLoad %float %178
+        %180 = OpFAdd %float %179 %177
+        %181 = OpAccessChain %_ptr_Function_float %color %uint_2
+               OpStore %181 %180
+               OpBranch %173
+        %173 = OpLabel
+        %182 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_4
+        %183 = OpLoad %int %182
+        %184 = OpConvertSToF %float %183
+        %185 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %186 = OpLoad %float %185
+        %187 = OpFAdd %float %186 %184
+        %188 = OpAccessChain %_ptr_Function_float %color %uint_1
+               OpStore %188 %187
+        %189 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %190 = OpLoad %float %189
+        %191 = OpFOrdGreaterThan %bool %190 %float_0_25
+               OpSelectionMerge %192 None
+               OpBranchConditional %191 %193 %192
+        %193 = OpLabel
+        %194 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_5
+        %195 = OpLoad %int %194
+        %196 = OpConvertSToF %float %195
+        %197 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %198 = OpLoad %float %197
+        %199 = OpFAdd %float %198 %196
+        %200 = OpAccessChain %_ptr_Function_float %color %uint_0
+               OpStore %200 %199
+               OpBranch %192
+        %192 = OpLabel
+        %201 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %202 = OpLoad %float %201
+        %203 = OpFOrdGreaterThan %bool %202 %float_0_5
+               OpSelectionMerge %204 None
+               OpBranchConditional %203 %205 %204
+        %205 = OpLabel
+        %206 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_6
+        %207 = OpLoad %int %206
+        %208 = OpConvertSToF %float %207
+        %209 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %210 = OpLoad %float %209
+        %211 = OpFAdd %float %210 %208
+        %212 = OpAccessChain %_ptr_Function_float %color %uint_1
+               OpStore %212 %211
+               OpBranch %204
+        %204 = OpLabel
+        %213 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %214 = OpLoad %float %213
+        %215 = OpFOrdGreaterThan %bool %214 %float_0_75
+               OpSelectionMerge %216 None
+               OpBranchConditional %215 %217 %216
+        %217 = OpLabel
+        %218 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_7
+        %219 = OpLoad %int %218
+        %220 = OpConvertSToF %float %219
+        %221 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %222 = OpLoad %float %221
+        %223 = OpFAdd %float %222 %220
+        %224 = OpAccessChain %_ptr_Function_float %color %uint_2
+               OpStore %224 %223
+               OpBranch %216
+        %216 = OpLabel
+        %225 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_8
+        %226 = OpLoad %int %225
+        %227 = OpConvertSToF %float %226
+        %228 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %229 = OpLoad %float %228
+        %230 = OpFAdd %float %229 %227
+        %231 = OpAccessChain %_ptr_Function_float %color %uint_2
+               OpStore %231 %230
+        %232 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %233 = OpLoad %float %232
+        %234 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %235 = OpLoad %float %234
+        %236 = OpFSub %float %233 %235
+        %237 = OpExtInst %float %1 FAbs %236
+        %238 = OpFOrdLessThan %bool %237 %float_0_25
+               OpSelectionMerge %239 None
+               OpBranchConditional %238 %240 %239
+        %240 = OpLabel
+        %241 = OpAccessChain %_ptr_Private_int %obj %int_0 %int_9
+        %242 = OpLoad %int %241
+        %243 = OpConvertSToF %float %242
+        %244 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %245 = OpLoad %float %244
+        %246 = OpFAdd %float %245 %243
+        %247 = OpAccessChain %_ptr_Function_float %color %uint_0
+               OpStore %247 %246
+               OpBranch %239
+        %239 = OpLabel
+        %248 = OpLoad %v3float %color
+        %249 = OpExtInst %v3float %1 Normalize %248
+        %250 = OpCompositeExtract %float %249 0
+        %251 = OpCompositeExtract %float %249 1
+        %252 = OpCompositeExtract %float %249 2
+        %253 = OpCompositeConstruct %v4float %250 %251 %252 %float_1
+               OpStore %frag_color %253
+        %254 = OpLoad %v4float %_GLF_pos
+        %255 = OpAccessChain %_ptr_Output_v4float %__1 %int_0
+               OpStore %255 %254
+               OpReturn
+               OpFunctionEnd
+%swap_i1_i1_ = OpFunction %void None %43
+          %i = OpFunctionParameter %_ptr_Function_int
+          %j = OpFunctionParameter %_ptr_Function_int
+        %256 = OpLabel
+       %temp = OpVariable %_ptr_Function_int Function
+        %257 = OpLoad %int %i
+        %258 = OpAccessChain %_ptr_Private_int %obj %int_0 %257
+        %259 = OpLoad %int %258
+               OpStore %temp %259
+        %260 = OpLoad %int %i
+        %261 = OpLoad %int %j
+        %262 = OpAccessChain %_ptr_Private_int %obj %int_0 %261
+        %263 = OpLoad %int %262
+        %264 = OpAccessChain %_ptr_Private_int %obj %int_0 %260
+               OpStore %264 %263
+        %265 = OpLoad %int %j
+        %266 = OpLoad %int %temp
+        %267 = OpAccessChain %_ptr_Private_int %obj %int_0 %265
+               OpStore %267 %266
+               OpReturn
+               OpFunctionEnd
+%performPartition_i1_i1_ = OpFunction %int None %44
+          %l = OpFunctionParameter %_ptr_Function_int
+          %h = OpFunctionParameter %_ptr_Function_int
+        %268 = OpLabel
+      %pivot = OpVariable %_ptr_Function_int Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+        %j_0 = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_int Function
+    %param_0 = OpVariable %_ptr_Function_int Function
+    %param_1 = OpVariable %_ptr_Function_int Function
+    %param_2 = OpVariable %_ptr_Function_int Function
+        %269 = OpLoad %int %h
+        %270 = OpAccessChain %_ptr_Private_int %obj %int_0 %269
+        %271 = OpLoad %int %270
+               OpStore %pivot %271
+        %272 = OpLoad %int %l
+        %273 = OpISub %int %272 %int_1
+               OpStore %i_0 %273
+        %274 = OpLoad %int %l
+               OpStore %j_0 %274
+               OpBranch %275
+        %275 = OpLabel
+               OpLoopMerge %276 %277 None
+               OpBranch %278
+        %278 = OpLabel
+        %279 = OpLoad %int %j_0
+        %280 = OpLoad %int %h
+        %281 = OpISub %int %280 %int_1
+        %282 = OpSLessThanEqual %bool %279 %281
+               OpBranchConditional %282 %283 %276
+        %283 = OpLabel
+        %284 = OpLoad %int %j_0
+        %285 = OpAccessChain %_ptr_Private_int %obj %int_0 %284
+        %286 = OpLoad %int %285
+        %287 = OpLoad %int %pivot
+        %288 = OpSLessThanEqual %bool %286 %287
+               OpSelectionMerge %289 None
+               OpBranchConditional %288 %290 %289
+        %290 = OpLabel
+        %291 = OpLoad %int %i_0
+        %292 = OpIAdd %int %291 %int_1
+               OpStore %i_0 %292
+        %293 = OpLoad %int %i_0
+               OpStore %param %293
+        %294 = OpLoad %int %j_0
+               OpStore %param_0 %294
+        %295 = OpFunctionCall %void %swap_i1_i1_ %param %param_0
+               OpBranch %289
+        %289 = OpLabel
+               OpBranch %277
+        %277 = OpLabel
+        %296 = OpLoad %int %j_0
+        %297 = OpIAdd %int %296 %int_1
+               OpStore %j_0 %297
+               OpBranch %275
+        %276 = OpLabel
+        %298 = OpLoad %int %i_0
+        %299 = OpIAdd %int %298 %int_1
+               OpStore %param_1 %299
+        %300 = OpLoad %int %h
+               OpStore %param_2 %300
+        %301 = OpFunctionCall %void %swap_i1_i1_ %param_1 %param_2
+        %302 = OpLoad %int %i_0
+        %303 = OpIAdd %int %302 %int_1
+               OpReturnValue %303
+               OpFunctionEnd
+ %quicksort_ = OpFunction %void None %40
+        %304 = OpLabel
+        %l_0 = OpVariable %_ptr_Function_int Function
+        %h_0 = OpVariable %_ptr_Function_int Function
+        %top = OpVariable %_ptr_Function_int Function
+      %stack = OpVariable %_ptr_Function__arr_int_uint_10 Function
+          %p = OpVariable %_ptr_Function_int Function
+    %param_3 = OpVariable %_ptr_Function_int Function
+    %param_4 = OpVariable %_ptr_Function_int Function
+               OpStore %l_0 %int_0
+               OpStore %h_0 %int_9
+               OpStore %top %int_n1
+        %305 = OpLoad %int %top
+        %306 = OpIAdd %int %305 %int_1
+               OpStore %top %306
+        %307 = OpLoad %int %l_0
+        %308 = OpAccessChain %_ptr_Function_int %stack %306
+               OpStore %308 %307
+        %309 = OpLoad %int %top
+        %310 = OpIAdd %int %309 %int_1
+               OpStore %top %310
+        %311 = OpLoad %int %h_0
+        %312 = OpAccessChain %_ptr_Function_int %stack %310
+               OpStore %312 %311
+               OpBranch %313
+        %313 = OpLabel
+               OpLoopMerge %314 %315 None
+               OpBranch %316
+        %316 = OpLabel
+        %317 = OpLoad %int %top
+        %318 = OpSGreaterThanEqual %bool %317 %int_0
+               OpBranchConditional %318 %319 %314
+        %319 = OpLabel
+        %320 = OpLoad %int %top
+        %321 = OpISub %int %320 %int_1
+               OpStore %top %321
+        %322 = OpAccessChain %_ptr_Function_int %stack %320
+        %323 = OpLoad %int %322
+               OpStore %h_0 %323
+        %324 = OpLoad %int %top
+        %325 = OpISub %int %324 %int_1
+               OpStore %top %325
+        %326 = OpAccessChain %_ptr_Function_int %stack %324
+        %327 = OpLoad %int %326
+               OpStore %l_0 %327
+        %328 = OpLoad %int %l_0
+               OpStore %param_3 %328
+        %329 = OpLoad %int %h_0
+               OpStore %param_4 %329
+        %330 = OpFunctionCall %int %performPartition_i1_i1_ %param_3 %param_4
+               OpStore %p %330
+        %331 = OpLoad %int %p
+        %332 = OpISub %int %331 %int_1
+        %333 = OpLoad %int %l_0
+        %334 = OpSGreaterThan %bool %332 %333
+               OpSelectionMerge %335 None
+               OpBranchConditional %334 %336 %335
+        %336 = OpLabel
+        %337 = OpLoad %int %top
+        %338 = OpIAdd %int %337 %int_1
+               OpStore %top %338
+        %339 = OpLoad %int %l_0
+        %340 = OpAccessChain %_ptr_Function_int %stack %338
+               OpStore %340 %339
+        %341 = OpLoad %int %top
+        %342 = OpIAdd %int %341 %int_1
+               OpStore %top %342
+        %343 = OpLoad %int %p
+        %344 = OpISub %int %343 %int_1
+        %345 = OpAccessChain %_ptr_Function_int %stack %342
+               OpStore %345 %344
+               OpBranch %335
+        %335 = OpLabel
+        %346 = OpLoad %int %p
+        %347 = OpIAdd %int %346 %int_1
+        %348 = OpLoad %int %h_0
+        %349 = OpSLessThan %bool %347 %348
+               OpSelectionMerge %350 None
+               OpBranchConditional %349 %351 %350
+        %351 = OpLabel
+        %352 = OpLoad %int %top
+        %353 = OpIAdd %int %352 %int_1
+               OpStore %top %353
+        %354 = OpLoad %int %p
+        %355 = OpIAdd %int %354 %int_1
+        %356 = OpAccessChain %_ptr_Function_int %stack %353
+               OpStore %356 %355
+        %357 = OpLoad %int %top
+        %358 = OpIAdd %int %357 %int_1
+               OpStore %top %358
+        %359 = OpLoad %int %h_0
+        %360 = OpAccessChain %_ptr_Function_int %stack %358
+               OpStore %360 %359
+               OpBranch %350
+        %350 = OpLabel
+               OpBranch %315
+        %315 = OpLabel
+               OpBranch %313
+        %314 = OpLabel
+               OpReturn
+               OpFunctionEnd
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
new file mode 100644
index 0000000..231fdaf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-max-value-as-index/2-opt.spvasm.expected.hlsl
@@ -0,0 +1,225 @@
+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;
+  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;
+  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;
+  {
+    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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 x_GLF_pos_param = tint_symbol.x_GLF_pos_param;
+  x_GLF_pos = x_GLF_pos_param;
+  main_1();
+  const main_out tint_symbol_3 = {frag_color, gl_Position};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.frag_color_1, tint_symbol_3.gl_Position};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-max-value-as-index/2-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-max-value-as-index/2-opt.spvasm.expected.msl
new file mode 100644
index 0000000..99d5039
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-max-value-as-index/2-opt.spvasm.expected.msl
@@ -0,0 +1,272 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct QuicksortObject {
+  tint_array_wrapper numbers;
+};
+struct buf1 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 frag_color_1;
+  float4 gl_Position;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_pos_param [[attribute(0)]];
+};
+struct tint_symbol_3 {
+  float4 frag_color_1 [[user(locn0)]];
+  float4 gl_Position [[position]];
+};
+
+void swap_i1_i1_(thread int* const i, thread int* const j, thread QuicksortObject* const tint_symbol_6) {
+  int temp = 0;
+  int const x_257 = *(i);
+  int const x_259 = (*(tint_symbol_6)).numbers.arr[x_257];
+  temp = x_259;
+  int const x_260 = *(i);
+  int const x_261 = *(j);
+  int const x_263 = (*(tint_symbol_6)).numbers.arr[x_261];
+  (*(tint_symbol_6)).numbers.arr[x_260] = x_263;
+  int const x_265 = *(j);
+  int const x_266 = temp;
+  (*(tint_symbol_6)).numbers.arr[x_265] = x_266;
+  return;
+}
+
+int performPartition_i1_i1_(thread int* const l, thread int* const h, thread QuicksortObject* const tint_symbol_7) {
+  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;
+  int const x_269 = *(h);
+  int const x_271 = (*(tint_symbol_7)).numbers.arr[x_269];
+  pivot = x_271;
+  int const x_272 = *(l);
+  i_1 = (x_272 - 1);
+  int const x_274 = *(l);
+  j_1 = x_274;
+  while (true) {
+    int const x_279 = j_1;
+    int const x_280 = *(h);
+    if ((x_279 <= (x_280 - 1))) {
+    } else {
+      break;
+    }
+    int const x_284 = j_1;
+    int const x_286 = (*(tint_symbol_7)).numbers.arr[x_284];
+    int const x_287 = pivot;
+    if ((x_286 <= x_287)) {
+      int const x_291 = i_1;
+      i_1 = (x_291 + 1);
+      int const x_293 = i_1;
+      param = x_293;
+      int const x_294 = j_1;
+      param_1 = x_294;
+      swap_i1_i1_(&(param), &(param_1), tint_symbol_7);
+    }
+    {
+      int const x_296 = j_1;
+      j_1 = (x_296 + 1);
+    }
+  }
+  int const x_298 = i_1;
+  param_2 = (x_298 + 1);
+  int const x_300 = *(h);
+  param_3 = x_300;
+  swap_i1_i1_(&(param_2), &(param_3), tint_symbol_7);
+  int const x_302 = i_1;
+  return (x_302 + 1);
+}
+
+void quicksort_(thread QuicksortObject* const tint_symbol_8) {
+  int l_1 = 0;
+  int h_1 = 0;
+  int top = 0;
+  tint_array_wrapper stack = {};
+  int p = 0;
+  int param_4 = 0;
+  int param_5 = 0;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  int const x_305 = top;
+  int const x_306 = (x_305 + 1);
+  top = x_306;
+  int const x_307 = l_1;
+  stack.arr[x_306] = x_307;
+  int const x_309 = top;
+  int const x_310 = (x_309 + 1);
+  top = x_310;
+  int const x_311 = h_1;
+  stack.arr[x_310] = x_311;
+  while (true) {
+    int const x_317 = top;
+    if ((x_317 >= 0)) {
+    } else {
+      break;
+    }
+    int const x_320 = top;
+    top = (x_320 - 1);
+    int const x_323 = stack.arr[x_320];
+    h_1 = x_323;
+    int const x_324 = top;
+    top = (x_324 - 1);
+    int const x_327 = stack.arr[x_324];
+    l_1 = x_327;
+    int const x_328 = l_1;
+    param_4 = x_328;
+    int const x_329 = h_1;
+    param_5 = x_329;
+    int const x_330 = performPartition_i1_i1_(&(param_4), &(param_5), tint_symbol_8);
+    p = x_330;
+    int const x_331 = p;
+    int const x_333 = l_1;
+    if (((x_331 - 1) > x_333)) {
+      int const x_337 = top;
+      int const x_338 = (x_337 + 1);
+      top = x_338;
+      int const x_339 = l_1;
+      stack.arr[x_338] = x_339;
+      int const x_341 = top;
+      int const x_342 = (x_341 + 1);
+      top = x_342;
+      int const x_343 = p;
+      stack.arr[x_342] = (x_343 - 1);
+    }
+    int const x_346 = p;
+    int const x_348 = h_1;
+    if (((x_346 + 1) < x_348)) {
+      int const x_352 = top;
+      int const x_353 = (x_352 + 1);
+      top = x_353;
+      int const x_354 = p;
+      stack.arr[x_353] = (x_354 + 1);
+      int const x_357 = top;
+      int const x_358 = (x_357 + 1);
+      top = x_358;
+      int const x_359 = h_1;
+      stack.arr[x_358] = x_359;
+    }
+  }
+  return;
+}
+
+void main_1(constant buf1& x_34, constant buf0& x_37, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10, thread QuicksortObject* const tint_symbol_11, thread float4* const tint_symbol_12, thread float4* const tint_symbol_13) {
+  int i_2 = 0;
+  float2 uv = 0.0f;
+  float3 color = 0.0f;
+  float4 const x_94 = *(tint_symbol_9);
+  *(tint_symbol_10) = ((x_94 + float4(1.0f, 1.0f, 0.0f, 0.0f)) * float4(128.0f, 128.0f, 1.0f, 1.0f));
+  i_2 = 0;
+  while (true) {
+    int const x_101 = i_2;
+    if ((x_101 < 10)) {
+    } else {
+      break;
+    }
+    int const x_104 = i_2;
+    int const x_105 = i_2;
+    (*(tint_symbol_11)).numbers.arr[x_104] = (10 - x_105);
+    int const x_108 = i_2;
+    int const x_109 = i_2;
+    int const x_111 = (*(tint_symbol_11)).numbers.arr[x_109];
+    int const x_112 = i_2;
+    int const x_114 = (*(tint_symbol_11)).numbers.arr[x_112];
+    (*(tint_symbol_11)).numbers.arr[x_108] = (x_111 * x_114);
+    {
+      int const x_117 = i_2;
+      i_2 = (x_117 + 1);
+    }
+  }
+  quicksort_(tint_symbol_11);
+  float4 const x_120 = *(tint_symbol_10);
+  float2 const x_123 = x_34.resolution;
+  uv = (float2(x_120.x, x_120.y) / x_123);
+  color = float3(1.0f, 2.0f, 3.0f);
+  int const x_126 = (*(tint_symbol_11)).numbers.arr[0];
+  float const x_129 = color.x;
+  color.x = (x_129 + float(x_126));
+  float const x_133 = uv.x;
+  if ((x_133 > 0.25f)) {
+    int const x_138 = (*(tint_symbol_11)).numbers.arr[1];
+    float const x_141 = color.x;
+    color.x = (x_141 + float(x_138));
+  }
+  float const x_145 = uv.x;
+  if ((x_145 > 0.5f)) {
+    float const x_150 = x_37.injectionSwitch.y;
+    int const x_155 = (*(tint_symbol_11)).numbers.arr[max((2 * int(x_150)), 2)];
+    float const x_158 = x_37.injectionSwitch.y;
+    int const x_163 = (*(tint_symbol_11)).numbers.arr[max((2 * int(x_158)), 2)];
+    float const x_167 = color.y;
+    color.y = (x_167 + fmax(float(x_155), float(x_163)));
+  }
+  float const x_171 = uv.x;
+  if ((x_171 > 0.75f)) {
+    int const x_176 = (*(tint_symbol_11)).numbers.arr[3];
+    float const x_179 = color.z;
+    color.z = (x_179 + float(x_176));
+  }
+  int const x_183 = (*(tint_symbol_11)).numbers.arr[4];
+  float const x_186 = color.y;
+  color.y = (x_186 + float(x_183));
+  float const x_190 = uv.y;
+  if ((x_190 > 0.25f)) {
+    int const x_195 = (*(tint_symbol_11)).numbers.arr[5];
+    float const x_198 = color.x;
+    color.x = (x_198 + float(x_195));
+  }
+  float const x_202 = uv.y;
+  if ((x_202 > 0.5f)) {
+    int const x_207 = (*(tint_symbol_11)).numbers.arr[6];
+    float const x_210 = color.y;
+    color.y = (x_210 + float(x_207));
+  }
+  float const x_214 = uv.y;
+  if ((x_214 > 0.75f)) {
+    int const x_219 = (*(tint_symbol_11)).numbers.arr[7];
+    float const x_222 = color.z;
+    color.z = (x_222 + float(x_219));
+  }
+  int const x_226 = (*(tint_symbol_11)).numbers.arr[8];
+  float const x_229 = color.z;
+  color.z = (x_229 + float(x_226));
+  float const x_233 = uv.x;
+  float const x_235 = uv.y;
+  if ((fabs((x_233 - x_235)) < 0.25f)) {
+    int const x_242 = (*(tint_symbol_11)).numbers.arr[9];
+    float const x_245 = color.x;
+    color.x = (x_245 + float(x_242));
+  }
+  float3 const x_248 = color;
+  float3 const x_249 = normalize(x_248);
+  *(tint_symbol_12) = float4(x_249.x, x_249.y, x_249.z, 1.0f);
+  float4 const x_254 = *(tint_symbol_9);
+  *(tint_symbol_13) = x_254;
+  return;
+}
+
+vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]], constant buf1& x_34 [[buffer(1)]], constant buf0& x_37 [[buffer(0)]]) {
+  thread float4 tint_symbol_14 = 0.0f;
+  thread float4 tint_symbol_15 = 0.0f;
+  thread QuicksortObject tint_symbol_16 = {};
+  thread float4 tint_symbol_17 = 0.0f;
+  thread float4 tint_symbol_18 = 0.0f;
+  float4 const x_GLF_pos_param = tint_symbol_1.x_GLF_pos_param;
+  tint_symbol_14 = x_GLF_pos_param;
+  main_1(x_34, x_37, &(tint_symbol_14), &(tint_symbol_15), &(tint_symbol_16), &(tint_symbol_17), &(tint_symbol_18));
+  main_out const tint_symbol_4 = {.frag_color_1=tint_symbol_17, .gl_Position=tint_symbol_18};
+  tint_symbol_3 const tint_symbol_5 = {.frag_color_1=tint_symbol_4.frag_color_1, .gl_Position=tint_symbol_4.gl_Position};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-max-value-as-index/2-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-max-value-as-index/2-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..f53a11b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-max-value-as-index/2-opt.spvasm.expected.spvasm
@@ -0,0 +1,593 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 408
+; Schema: 0
+               OpCapability Shader
+        %280 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %tint_pointsize %tint_symbol %tint_symbol_2 %tint_symbol_3
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %QuicksortObject "QuicksortObject"
+               OpMemberName %QuicksortObject 0 "numbers"
+               OpName %obj "obj"
+               OpName %x_GLF_FragCoord "x_GLF_FragCoord"
+               OpName %x_GLF_pos "x_GLF_pos"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "resolution"
+               OpName %x_34 "x_34"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_37 "x_37"
+               OpName %frag_color "frag_color"
+               OpName %gl_Position "gl_Position"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %swap_i1_i1_ "swap_i1_i1_"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %temp "temp"
+               OpName %performPartition_i1_i1_ "performPartition_i1_i1_"
+               OpName %l "l"
+               OpName %h "h"
+               OpName %pivot "pivot"
+               OpName %i_1 "i_1"
+               OpName %j_1 "j_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %quicksort_ "quicksort_"
+               OpName %l_1 "l_1"
+               OpName %h_1 "h_1"
+               OpName %top "top"
+               OpName %stack "stack"
+               OpName %p "p"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpName %main_1 "main_1"
+               OpName %i_2 "i_2"
+               OpName %uv "uv"
+               OpName %color "color"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "frag_color_1"
+               OpMemberName %main_out 1 "gl_Position"
+               OpName %tint_symbol_4 "tint_symbol_4"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpMemberDecorate %QuicksortObject 0 Offset 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_34 NonWritable
+               OpDecorate %x_34 DescriptorSet 0
+               OpDecorate %x_34 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_37 NonWritable
+               OpDecorate %x_37 DescriptorSet 0
+               OpDecorate %x_37 Binding 0
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %tint_symbol_3 BuiltIn Position
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%QuicksortObject = OpTypeStruct %_arr_int_uint_10
+%_ptr_Private_QuicksortObject = OpTypePointer Private %QuicksortObject
+         %12 = OpConstantNull %QuicksortObject
+        %obj = OpVariable %_ptr_Private_QuicksortObject Private %12
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_FragCoord = OpVariable %_ptr_Private_v4float Private %16
+  %x_GLF_pos = OpVariable %_ptr_Private_v4float Private %16
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_34 = OpVariable %_ptr_Uniform_buf1 Uniform
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_37 = OpVariable %_ptr_Uniform_buf0 Uniform
+ %frag_color = OpVariable %_ptr_Private_v4float Private %16
+%gl_Position = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %16
+%tint_symbol_3 = OpVariable %_ptr_Output_v4float Output %16
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+         %32 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+         %40 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_int = OpTypePointer Private %int
+         %58 = OpTypeFunction %int %_ptr_Function_int %_ptr_Function_int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+        %118 = OpTypeFunction %void
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+        %126 = OpConstantNull %_arr_int_uint_10
+      %int_0 = OpConstant %int 0
+      %int_9 = OpConstant %int 9
+     %int_n1 = OpConstant %int -1
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+        %198 = OpConstantNull %v2float
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+        %202 = OpConstantNull %v3float
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+        %206 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_0
+  %float_128 = OpConstant %float 128
+        %209 = OpConstantComposite %v4float %float_128 %float_128 %float_1 %float_1
+     %int_10 = OpConstant %int 10
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+        %247 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+%_ptr_Function_float = OpTypePointer Function %float
+ %float_0_25 = OpConstant %float 0.25
+  %float_0_5 = OpConstant %float 0.5
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_2 = OpConstant %int 2
+ %float_0_75 = OpConstant %float 0.75
+      %int_3 = OpConstant %int 3
+     %uint_2 = OpConstant %uint 2
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+   %main_out = OpTypeStruct %v4float %v4float
+        %393 = OpTypeFunction %void %main_out
+%swap_i1_i1_ = OpFunction %void None %32
+          %i = OpFunctionParameter %_ptr_Function_int
+          %j = OpFunctionParameter %_ptr_Function_int
+         %38 = OpLabel
+       %temp = OpVariable %_ptr_Function_int Function %40
+         %42 = OpLoad %int %i
+         %45 = OpAccessChain %_ptr_Private_int %obj %uint_0 %42
+         %46 = OpLoad %int %45
+               OpStore %temp %46
+         %48 = OpLoad %int %i
+         %50 = OpLoad %int %j
+         %51 = OpAccessChain %_ptr_Private_int %obj %uint_0 %50
+         %52 = OpLoad %int %51
+         %53 = OpAccessChain %_ptr_Private_int %obj %uint_0 %48
+               OpStore %53 %52
+         %55 = OpLoad %int %j
+         %56 = OpLoad %int %temp
+         %57 = OpAccessChain %_ptr_Private_int %obj %uint_0 %55
+               OpStore %57 %56
+               OpReturn
+               OpFunctionEnd
+%performPartition_i1_i1_ = OpFunction %int None %58
+          %l = OpFunctionParameter %_ptr_Function_int
+          %h = OpFunctionParameter %_ptr_Function_int
+         %62 = OpLabel
+      %pivot = OpVariable %_ptr_Function_int Function %40
+        %i_1 = OpVariable %_ptr_Function_int Function %40
+        %j_1 = OpVariable %_ptr_Function_int Function %40
+      %param = OpVariable %_ptr_Function_int Function %40
+    %param_1 = OpVariable %_ptr_Function_int Function %40
+    %param_2 = OpVariable %_ptr_Function_int Function %40
+    %param_3 = OpVariable %_ptr_Function_int Function %40
+         %71 = OpLoad %int %h
+         %72 = OpAccessChain %_ptr_Private_int %obj %uint_0 %71
+         %73 = OpLoad %int %72
+               OpStore %pivot %73
+         %75 = OpLoad %int %l
+         %77 = OpISub %int %75 %int_1
+               OpStore %i_1 %77
+         %79 = OpLoad %int %l
+               OpStore %j_1 %79
+               OpBranch %80
+         %80 = OpLabel
+               OpLoopMerge %81 %82 None
+               OpBranch %83
+         %83 = OpLabel
+         %84 = OpLoad %int %j_1
+         %86 = OpLoad %int %h
+         %87 = OpISub %int %86 %int_1
+         %88 = OpSLessThanEqual %bool %84 %87
+               OpSelectionMerge %90 None
+               OpBranchConditional %88 %91 %92
+         %91 = OpLabel
+               OpBranch %90
+         %92 = OpLabel
+               OpBranch %81
+         %90 = OpLabel
+         %93 = OpLoad %int %j_1
+         %94 = OpAccessChain %_ptr_Private_int %obj %uint_0 %93
+         %95 = OpLoad %int %94
+         %96 = OpLoad %int %pivot
+         %97 = OpSLessThanEqual %bool %95 %96
+               OpSelectionMerge %98 None
+               OpBranchConditional %97 %99 %98
+         %99 = OpLabel
+        %100 = OpLoad %int %i_1
+        %101 = OpIAdd %int %100 %int_1
+               OpStore %i_1 %101
+        %102 = OpLoad %int %i_1
+               OpStore %param %102
+        %103 = OpLoad %int %j_1
+               OpStore %param_1 %103
+        %104 = OpFunctionCall %void %swap_i1_i1_ %param %param_1
+               OpBranch %98
+         %98 = OpLabel
+               OpBranch %82
+         %82 = OpLabel
+        %107 = OpLoad %int %j_1
+        %108 = OpIAdd %int %107 %int_1
+               OpStore %j_1 %108
+               OpBranch %80
+         %81 = OpLabel
+        %109 = OpLoad %int %i_1
+        %110 = OpIAdd %int %109 %int_1
+               OpStore %param_2 %110
+        %112 = OpLoad %int %h
+               OpStore %param_3 %112
+        %113 = OpFunctionCall %void %swap_i1_i1_ %param_2 %param_3
+        %116 = OpLoad %int %i_1
+        %117 = OpIAdd %int %116 %int_1
+               OpReturnValue %117
+               OpFunctionEnd
+ %quicksort_ = OpFunction %void None %118
+        %120 = OpLabel
+        %l_1 = OpVariable %_ptr_Function_int Function %40
+        %h_1 = OpVariable %_ptr_Function_int Function %40
+        %top = OpVariable %_ptr_Function_int Function %40
+      %stack = OpVariable %_ptr_Function__arr_int_uint_10 Function %126
+          %p = OpVariable %_ptr_Function_int Function %40
+    %param_4 = OpVariable %_ptr_Function_int Function %40
+    %param_5 = OpVariable %_ptr_Function_int Function %40
+               OpStore %l_1 %int_0
+               OpStore %h_1 %int_9
+               OpStore %top %int_n1
+        %133 = OpLoad %int %top
+        %134 = OpIAdd %int %133 %int_1
+               OpStore %top %134
+        %135 = OpLoad %int %l_1
+        %136 = OpAccessChain %_ptr_Function_int %stack %134
+               OpStore %136 %135
+        %137 = OpLoad %int %top
+        %138 = OpIAdd %int %137 %int_1
+               OpStore %top %138
+        %139 = OpLoad %int %h_1
+        %140 = OpAccessChain %_ptr_Function_int %stack %138
+               OpStore %140 %139
+               OpBranch %141
+        %141 = OpLabel
+               OpLoopMerge %142 %143 None
+               OpBranch %144
+        %144 = OpLabel
+        %145 = OpLoad %int %top
+        %146 = OpSGreaterThanEqual %bool %145 %int_0
+               OpSelectionMerge %147 None
+               OpBranchConditional %146 %148 %149
+        %148 = OpLabel
+               OpBranch %147
+        %149 = OpLabel
+               OpBranch %142
+        %147 = OpLabel
+        %150 = OpLoad %int %top
+        %151 = OpISub %int %150 %int_1
+               OpStore %top %151
+        %152 = OpAccessChain %_ptr_Function_int %stack %150
+        %153 = OpLoad %int %152
+               OpStore %h_1 %153
+        %154 = OpLoad %int %top
+        %155 = OpISub %int %154 %int_1
+               OpStore %top %155
+        %156 = OpAccessChain %_ptr_Function_int %stack %154
+        %157 = OpLoad %int %156
+               OpStore %l_1 %157
+        %158 = OpLoad %int %l_1
+               OpStore %param_4 %158
+        %159 = OpLoad %int %h_1
+               OpStore %param_5 %159
+        %160 = OpFunctionCall %int %performPartition_i1_i1_ %param_4 %param_5
+               OpStore %p %160
+        %163 = OpLoad %int %p
+        %164 = OpLoad %int %l_1
+        %165 = OpISub %int %163 %int_1
+        %166 = OpSGreaterThan %bool %165 %164
+               OpSelectionMerge %167 None
+               OpBranchConditional %166 %168 %167
+        %168 = OpLabel
+        %169 = OpLoad %int %top
+        %170 = OpIAdd %int %169 %int_1
+               OpStore %top %170
+        %171 = OpLoad %int %l_1
+        %172 = OpAccessChain %_ptr_Function_int %stack %170
+               OpStore %172 %171
+        %173 = OpLoad %int %top
+        %174 = OpIAdd %int %173 %int_1
+               OpStore %top %174
+        %175 = OpLoad %int %p
+        %176 = OpAccessChain %_ptr_Function_int %stack %174
+        %177 = OpISub %int %175 %int_1
+               OpStore %176 %177
+               OpBranch %167
+        %167 = OpLabel
+        %178 = OpLoad %int %p
+        %179 = OpLoad %int %h_1
+        %180 = OpIAdd %int %178 %int_1
+        %181 = OpSLessThan %bool %180 %179
+               OpSelectionMerge %182 None
+               OpBranchConditional %181 %183 %182
+        %183 = OpLabel
+        %184 = OpLoad %int %top
+        %185 = OpIAdd %int %184 %int_1
+               OpStore %top %185
+        %186 = OpLoad %int %p
+        %187 = OpAccessChain %_ptr_Function_int %stack %185
+        %188 = OpIAdd %int %186 %int_1
+               OpStore %187 %188
+        %189 = OpLoad %int %top
+        %190 = OpIAdd %int %189 %int_1
+               OpStore %top %190
+        %191 = OpLoad %int %h_1
+        %192 = OpAccessChain %_ptr_Function_int %stack %190
+               OpStore %192 %191
+               OpBranch %182
+        %182 = OpLabel
+               OpBranch %143
+        %143 = OpLabel
+               OpBranch %141
+        %142 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %118
+        %194 = OpLabel
+        %i_2 = OpVariable %_ptr_Function_int Function %40
+         %uv = OpVariable %_ptr_Function_v2float Function %198
+      %color = OpVariable %_ptr_Function_v3float Function %202
+        %203 = OpLoad %v4float %x_GLF_pos
+        %207 = OpFAdd %v4float %203 %206
+        %210 = OpFMul %v4float %207 %209
+               OpStore %x_GLF_FragCoord %210
+               OpStore %i_2 %int_0
+               OpBranch %211
+        %211 = OpLabel
+               OpLoopMerge %212 %213 None
+               OpBranch %214
+        %214 = OpLabel
+        %215 = OpLoad %int %i_2
+        %217 = OpSLessThan %bool %215 %int_10
+               OpSelectionMerge %218 None
+               OpBranchConditional %217 %219 %220
+        %219 = OpLabel
+               OpBranch %218
+        %220 = OpLabel
+               OpBranch %212
+        %218 = OpLabel
+        %221 = OpLoad %int %i_2
+        %222 = OpLoad %int %i_2
+        %223 = OpAccessChain %_ptr_Private_int %obj %uint_0 %221
+        %224 = OpISub %int %int_10 %222
+               OpStore %223 %224
+        %225 = OpLoad %int %i_2
+        %226 = OpLoad %int %i_2
+        %227 = OpAccessChain %_ptr_Private_int %obj %uint_0 %226
+        %228 = OpLoad %int %227
+        %229 = OpLoad %int %i_2
+        %230 = OpAccessChain %_ptr_Private_int %obj %uint_0 %229
+        %231 = OpLoad %int %230
+        %232 = OpAccessChain %_ptr_Private_int %obj %uint_0 %225
+        %233 = OpIMul %int %228 %231
+               OpStore %232 %233
+               OpBranch %213
+        %213 = OpLabel
+        %234 = OpLoad %int %i_2
+        %235 = OpIAdd %int %234 %int_1
+               OpStore %i_2 %235
+               OpBranch %211
+        %212 = OpLabel
+        %236 = OpFunctionCall %void %quicksort_
+        %237 = OpLoad %v4float %x_GLF_FragCoord
+        %239 = OpAccessChain %_ptr_Uniform_v2float %x_34 %uint_0
+        %240 = OpLoad %v2float %239
+        %241 = OpCompositeExtract %float %237 0
+        %242 = OpCompositeExtract %float %237 1
+        %243 = OpCompositeConstruct %v2float %241 %242
+        %244 = OpFDiv %v2float %243 %240
+               OpStore %uv %244
+               OpStore %color %247
+        %248 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_0
+        %249 = OpLoad %int %248
+        %251 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %252 = OpLoad %float %251
+        %253 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %254 = OpConvertSToF %float %249
+        %255 = OpFAdd %float %252 %254
+               OpStore %253 %255
+        %256 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %257 = OpLoad %float %256
+        %259 = OpFOrdGreaterThan %bool %257 %float_0_25
+               OpSelectionMerge %260 None
+               OpBranchConditional %259 %261 %260
+        %261 = OpLabel
+        %262 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_1
+        %263 = OpLoad %int %262
+        %264 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %265 = OpLoad %float %264
+        %266 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %267 = OpConvertSToF %float %263
+        %268 = OpFAdd %float %265 %267
+               OpStore %266 %268
+               OpBranch %260
+        %260 = OpLabel
+        %269 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %270 = OpLoad %float %269
+        %272 = OpFOrdGreaterThan %bool %270 %float_0_5
+               OpSelectionMerge %273 None
+               OpBranchConditional %272 %274 %273
+        %274 = OpLabel
+        %277 = OpAccessChain %_ptr_Uniform_float %x_37 %uint_0 %uint_1
+        %278 = OpLoad %float %277
+        %282 = OpConvertFToS %int %278
+        %283 = OpIMul %int %int_2 %282
+        %279 = OpExtInst %int %280 SMax %283 %int_2
+        %284 = OpAccessChain %_ptr_Private_int %obj %uint_0 %279
+        %285 = OpLoad %int %284
+        %286 = OpAccessChain %_ptr_Uniform_float %x_37 %uint_0 %uint_1
+        %287 = OpLoad %float %286
+        %289 = OpConvertFToS %int %287
+        %290 = OpIMul %int %int_2 %289
+        %288 = OpExtInst %int %280 SMax %290 %int_2
+        %291 = OpAccessChain %_ptr_Private_int %obj %uint_0 %288
+        %292 = OpLoad %int %291
+        %293 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %294 = OpLoad %float %293
+        %295 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %297 = OpConvertSToF %float %285
+        %298 = OpConvertSToF %float %292
+        %296 = OpExtInst %float %280 NMax %297 %298
+        %299 = OpFAdd %float %294 %296
+               OpStore %295 %299
+               OpBranch %273
+        %273 = OpLabel
+        %300 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %301 = OpLoad %float %300
+        %303 = OpFOrdGreaterThan %bool %301 %float_0_75
+               OpSelectionMerge %304 None
+               OpBranchConditional %303 %305 %304
+        %305 = OpLabel
+        %307 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_3
+        %308 = OpLoad %int %307
+        %310 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %311 = OpLoad %float %310
+        %312 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %313 = OpConvertSToF %float %308
+        %314 = OpFAdd %float %311 %313
+               OpStore %312 %314
+               OpBranch %304
+        %304 = OpLabel
+        %316 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_4
+        %317 = OpLoad %int %316
+        %318 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %319 = OpLoad %float %318
+        %320 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %321 = OpConvertSToF %float %317
+        %322 = OpFAdd %float %319 %321
+               OpStore %320 %322
+        %323 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %324 = OpLoad %float %323
+        %325 = OpFOrdGreaterThan %bool %324 %float_0_25
+               OpSelectionMerge %326 None
+               OpBranchConditional %325 %327 %326
+        %327 = OpLabel
+        %329 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_5
+        %330 = OpLoad %int %329
+        %331 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %332 = OpLoad %float %331
+        %333 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %334 = OpConvertSToF %float %330
+        %335 = OpFAdd %float %332 %334
+               OpStore %333 %335
+               OpBranch %326
+        %326 = OpLabel
+        %336 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %337 = OpLoad %float %336
+        %338 = OpFOrdGreaterThan %bool %337 %float_0_5
+               OpSelectionMerge %339 None
+               OpBranchConditional %338 %340 %339
+        %340 = OpLabel
+        %342 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_6
+        %343 = OpLoad %int %342
+        %344 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %345 = OpLoad %float %344
+        %346 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %347 = OpConvertSToF %float %343
+        %348 = OpFAdd %float %345 %347
+               OpStore %346 %348
+               OpBranch %339
+        %339 = OpLabel
+        %349 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %350 = OpLoad %float %349
+        %351 = OpFOrdGreaterThan %bool %350 %float_0_75
+               OpSelectionMerge %352 None
+               OpBranchConditional %351 %353 %352
+        %353 = OpLabel
+        %355 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_7
+        %356 = OpLoad %int %355
+        %357 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %358 = OpLoad %float %357
+        %359 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %360 = OpConvertSToF %float %356
+        %361 = OpFAdd %float %358 %360
+               OpStore %359 %361
+               OpBranch %352
+        %352 = OpLabel
+        %363 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_8
+        %364 = OpLoad %int %363
+        %365 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %366 = OpLoad %float %365
+        %367 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %368 = OpConvertSToF %float %364
+        %369 = OpFAdd %float %366 %368
+               OpStore %367 %369
+        %370 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %371 = OpLoad %float %370
+        %372 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %373 = OpLoad %float %372
+        %375 = OpFSub %float %371 %373
+        %374 = OpExtInst %float %280 FAbs %375
+        %376 = OpFOrdLessThan %bool %374 %float_0_25
+               OpSelectionMerge %377 None
+               OpBranchConditional %376 %378 %377
+        %378 = OpLabel
+        %379 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_9
+        %380 = OpLoad %int %379
+        %381 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %382 = OpLoad %float %381
+        %383 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %384 = OpConvertSToF %float %380
+        %385 = OpFAdd %float %382 %384
+               OpStore %383 %385
+               OpBranch %377
+        %377 = OpLabel
+        %386 = OpLoad %v3float %color
+        %387 = OpExtInst %v3float %280 Normalize %386
+        %388 = OpCompositeExtract %float %387 0
+        %389 = OpCompositeExtract %float %387 1
+        %390 = OpCompositeExtract %float %387 2
+        %391 = OpCompositeConstruct %v4float %388 %389 %390 %float_1
+               OpStore %frag_color %391
+        %392 = OpLoad %v4float %x_GLF_pos
+               OpStore %gl_Position %392
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_4 = OpFunction %void None %393
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %397 = OpLabel
+        %398 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %398
+        %399 = OpCompositeExtract %v4float %tint_symbol_1 1
+               OpStore %tint_symbol_3 %399
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %118
+        %401 = OpLabel
+               OpStore %tint_pointsize %float_1
+        %402 = OpLoad %v4float %tint_symbol
+               OpStore %x_GLF_pos %402
+        %403 = OpFunctionCall %void %main_1
+        %405 = OpLoad %v4float %frag_color
+        %406 = OpLoad %v4float %gl_Position
+        %407 = OpCompositeConstruct %main_out %405 %406
+        %404 = OpFunctionCall %void %tint_symbol_4 %407
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-max-value-as-index/2-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-max-value-as-index/2-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..3d6cec0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-max-value-as-index/2-opt.spvasm.expected.wgsl
@@ -0,0 +1,274 @@
+struct QuicksortObject {
+  numbers : array<i32, 10>;
+};
+
+[[block]]
+struct buf1 {
+  resolution : vec2<f32>;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> obj : QuicksortObject;
+
+var<private> x_GLF_FragCoord : vec4<f32>;
+
+var<private> x_GLF_pos : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_34 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_37 : buf0;
+
+var<private> frag_color : vec4<f32>;
+
+var<private> gl_Position : vec4<f32>;
+
+fn swap_i1_i1_(i : ptr<function, i32>, j : ptr<function, i32>) {
+  var temp : i32;
+  let x_257 : i32 = *(i);
+  let x_259 : i32 = obj.numbers[x_257];
+  temp = x_259;
+  let x_260 : i32 = *(i);
+  let x_261 : i32 = *(j);
+  let x_263 : i32 = obj.numbers[x_261];
+  obj.numbers[x_260] = x_263;
+  let x_265 : i32 = *(j);
+  let x_266 : i32 = temp;
+  obj.numbers[x_265] = x_266;
+  return;
+}
+
+fn performPartition_i1_i1_(l : ptr<function, i32>, h : ptr<function, i32>) -> i32 {
+  var pivot : i32;
+  var i_1 : i32;
+  var j_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  var param_3 : i32;
+  let x_269 : i32 = *(h);
+  let x_271 : i32 = obj.numbers[x_269];
+  pivot = x_271;
+  let x_272 : i32 = *(l);
+  i_1 = (x_272 - 1);
+  let x_274 : i32 = *(l);
+  j_1 = x_274;
+  loop {
+    let x_279 : i32 = j_1;
+    let x_280 : i32 = *(h);
+    if ((x_279 <= (x_280 - 1))) {
+    } else {
+      break;
+    }
+    let x_284 : i32 = j_1;
+    let x_286 : i32 = obj.numbers[x_284];
+    let x_287 : i32 = pivot;
+    if ((x_286 <= x_287)) {
+      let x_291 : i32 = i_1;
+      i_1 = (x_291 + 1);
+      let x_293 : i32 = i_1;
+      param = x_293;
+      let x_294 : i32 = j_1;
+      param_1 = x_294;
+      swap_i1_i1_(&(param), &(param_1));
+    }
+
+    continuing {
+      let x_296 : i32 = j_1;
+      j_1 = (x_296 + 1);
+    }
+  }
+  let x_298 : i32 = i_1;
+  param_2 = (x_298 + 1);
+  let x_300 : i32 = *(h);
+  param_3 = x_300;
+  swap_i1_i1_(&(param_2), &(param_3));
+  let x_302 : i32 = i_1;
+  return (x_302 + 1);
+}
+
+fn quicksort_() {
+  var l_1 : i32;
+  var h_1 : i32;
+  var top : i32;
+  var stack : array<i32, 10>;
+  var p : i32;
+  var param_4 : i32;
+  var param_5 : i32;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  let x_305 : i32 = top;
+  let x_306 : i32 = (x_305 + 1);
+  top = x_306;
+  let x_307 : i32 = l_1;
+  stack[x_306] = x_307;
+  let x_309 : i32 = top;
+  let x_310 : i32 = (x_309 + 1);
+  top = x_310;
+  let x_311 : i32 = h_1;
+  stack[x_310] = x_311;
+  loop {
+    let x_317 : i32 = top;
+    if ((x_317 >= 0)) {
+    } else {
+      break;
+    }
+    let x_320 : i32 = top;
+    top = (x_320 - 1);
+    let x_323 : i32 = stack[x_320];
+    h_1 = x_323;
+    let x_324 : i32 = top;
+    top = (x_324 - 1);
+    let x_327 : i32 = stack[x_324];
+    l_1 = x_327;
+    let x_328 : i32 = l_1;
+    param_4 = x_328;
+    let x_329 : i32 = h_1;
+    param_5 = x_329;
+    let x_330 : i32 = performPartition_i1_i1_(&(param_4), &(param_5));
+    p = x_330;
+    let x_331 : i32 = p;
+    let x_333 : i32 = l_1;
+    if (((x_331 - 1) > x_333)) {
+      let x_337 : i32 = top;
+      let x_338 : i32 = (x_337 + 1);
+      top = x_338;
+      let x_339 : i32 = l_1;
+      stack[x_338] = x_339;
+      let x_341 : i32 = top;
+      let x_342 : i32 = (x_341 + 1);
+      top = x_342;
+      let x_343 : i32 = p;
+      stack[x_342] = (x_343 - 1);
+    }
+    let x_346 : i32 = p;
+    let x_348 : i32 = h_1;
+    if (((x_346 + 1) < x_348)) {
+      let x_352 : i32 = top;
+      let x_353 : i32 = (x_352 + 1);
+      top = x_353;
+      let x_354 : i32 = p;
+      stack[x_353] = (x_354 + 1);
+      let x_357 : i32 = top;
+      let x_358 : i32 = (x_357 + 1);
+      top = x_358;
+      let x_359 : i32 = h_1;
+      stack[x_358] = x_359;
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_2 : i32;
+  var uv : vec2<f32>;
+  var color : vec3<f32>;
+  let x_94 : vec4<f32> = x_GLF_pos;
+  x_GLF_FragCoord = ((x_94 + vec4<f32>(1.0, 1.0, 0.0, 0.0)) * vec4<f32>(128.0, 128.0, 1.0, 1.0));
+  i_2 = 0;
+  loop {
+    let x_101 : i32 = i_2;
+    if ((x_101 < 10)) {
+    } else {
+      break;
+    }
+    let x_104 : i32 = i_2;
+    let x_105 : i32 = i_2;
+    obj.numbers[x_104] = (10 - x_105);
+    let x_108 : i32 = i_2;
+    let x_109 : i32 = i_2;
+    let x_111 : i32 = obj.numbers[x_109];
+    let x_112 : i32 = i_2;
+    let x_114 : i32 = obj.numbers[x_112];
+    obj.numbers[x_108] = (x_111 * x_114);
+
+    continuing {
+      let x_117 : i32 = i_2;
+      i_2 = (x_117 + 1);
+    }
+  }
+  quicksort_();
+  let x_120 : vec4<f32> = x_GLF_FragCoord;
+  let x_123 : vec2<f32> = x_34.resolution;
+  uv = (vec2<f32>(x_120.x, x_120.y) / x_123);
+  color = vec3<f32>(1.0, 2.0, 3.0);
+  let x_126 : i32 = obj.numbers[0];
+  let x_129 : f32 = color.x;
+  color.x = (x_129 + f32(x_126));
+  let x_133 : f32 = uv.x;
+  if ((x_133 > 0.25)) {
+    let x_138 : i32 = obj.numbers[1];
+    let x_141 : f32 = color.x;
+    color.x = (x_141 + f32(x_138));
+  }
+  let x_145 : f32 = uv.x;
+  if ((x_145 > 0.5)) {
+    let x_150 : f32 = x_37.injectionSwitch.y;
+    let x_155 : i32 = obj.numbers[max((2 * i32(x_150)), 2)];
+    let x_158 : f32 = x_37.injectionSwitch.y;
+    let x_163 : i32 = obj.numbers[max((2 * i32(x_158)), 2)];
+    let x_167 : f32 = color.y;
+    color.y = (x_167 + max(f32(x_155), f32(x_163)));
+  }
+  let x_171 : f32 = uv.x;
+  if ((x_171 > 0.75)) {
+    let x_176 : i32 = obj.numbers[3];
+    let x_179 : f32 = color.z;
+    color.z = (x_179 + f32(x_176));
+  }
+  let x_183 : i32 = obj.numbers[4];
+  let x_186 : f32 = color.y;
+  color.y = (x_186 + f32(x_183));
+  let x_190 : f32 = uv.y;
+  if ((x_190 > 0.25)) {
+    let x_195 : i32 = obj.numbers[5];
+    let x_198 : f32 = color.x;
+    color.x = (x_198 + f32(x_195));
+  }
+  let x_202 : f32 = uv.y;
+  if ((x_202 > 0.5)) {
+    let x_207 : i32 = obj.numbers[6];
+    let x_210 : f32 = color.y;
+    color.y = (x_210 + f32(x_207));
+  }
+  let x_214 : f32 = uv.y;
+  if ((x_214 > 0.75)) {
+    let x_219 : i32 = obj.numbers[7];
+    let x_222 : f32 = color.z;
+    color.z = (x_222 + f32(x_219));
+  }
+  let x_226 : i32 = obj.numbers[8];
+  let x_229 : f32 = color.z;
+  color.z = (x_229 + f32(x_226));
+  let x_233 : f32 = uv.x;
+  let x_235 : f32 = uv.y;
+  if ((abs((x_233 - x_235)) < 0.25)) {
+    let x_242 : i32 = obj.numbers[9];
+    let x_245 : f32 = color.x;
+    color.x = (x_245 + f32(x_242));
+  }
+  let x_248 : vec3<f32> = color;
+  let x_249 : vec3<f32> = normalize(x_248);
+  frag_color = vec4<f32>(x_249.x, x_249.y, x_249.z, 1.0);
+  let x_254 : vec4<f32> = x_GLF_pos;
+  gl_Position = x_254;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  frag_color_1 : vec4<f32>;
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] x_GLF_pos_param : vec4<f32>) -> main_out {
+  x_GLF_pos = x_GLF_pos_param;
+  main_1();
+  return main_out(frag_color, gl_Position);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-max-value-as-index/2-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-max-value-as-index/2-opt.wgsl
new file mode 100644
index 0000000..3d6cec0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-max-value-as-index/2-opt.wgsl
@@ -0,0 +1,274 @@
+struct QuicksortObject {
+  numbers : array<i32, 10>;
+};
+
+[[block]]
+struct buf1 {
+  resolution : vec2<f32>;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> obj : QuicksortObject;
+
+var<private> x_GLF_FragCoord : vec4<f32>;
+
+var<private> x_GLF_pos : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_34 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_37 : buf0;
+
+var<private> frag_color : vec4<f32>;
+
+var<private> gl_Position : vec4<f32>;
+
+fn swap_i1_i1_(i : ptr<function, i32>, j : ptr<function, i32>) {
+  var temp : i32;
+  let x_257 : i32 = *(i);
+  let x_259 : i32 = obj.numbers[x_257];
+  temp = x_259;
+  let x_260 : i32 = *(i);
+  let x_261 : i32 = *(j);
+  let x_263 : i32 = obj.numbers[x_261];
+  obj.numbers[x_260] = x_263;
+  let x_265 : i32 = *(j);
+  let x_266 : i32 = temp;
+  obj.numbers[x_265] = x_266;
+  return;
+}
+
+fn performPartition_i1_i1_(l : ptr<function, i32>, h : ptr<function, i32>) -> i32 {
+  var pivot : i32;
+  var i_1 : i32;
+  var j_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  var param_3 : i32;
+  let x_269 : i32 = *(h);
+  let x_271 : i32 = obj.numbers[x_269];
+  pivot = x_271;
+  let x_272 : i32 = *(l);
+  i_1 = (x_272 - 1);
+  let x_274 : i32 = *(l);
+  j_1 = x_274;
+  loop {
+    let x_279 : i32 = j_1;
+    let x_280 : i32 = *(h);
+    if ((x_279 <= (x_280 - 1))) {
+    } else {
+      break;
+    }
+    let x_284 : i32 = j_1;
+    let x_286 : i32 = obj.numbers[x_284];
+    let x_287 : i32 = pivot;
+    if ((x_286 <= x_287)) {
+      let x_291 : i32 = i_1;
+      i_1 = (x_291 + 1);
+      let x_293 : i32 = i_1;
+      param = x_293;
+      let x_294 : i32 = j_1;
+      param_1 = x_294;
+      swap_i1_i1_(&(param), &(param_1));
+    }
+
+    continuing {
+      let x_296 : i32 = j_1;
+      j_1 = (x_296 + 1);
+    }
+  }
+  let x_298 : i32 = i_1;
+  param_2 = (x_298 + 1);
+  let x_300 : i32 = *(h);
+  param_3 = x_300;
+  swap_i1_i1_(&(param_2), &(param_3));
+  let x_302 : i32 = i_1;
+  return (x_302 + 1);
+}
+
+fn quicksort_() {
+  var l_1 : i32;
+  var h_1 : i32;
+  var top : i32;
+  var stack : array<i32, 10>;
+  var p : i32;
+  var param_4 : i32;
+  var param_5 : i32;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  let x_305 : i32 = top;
+  let x_306 : i32 = (x_305 + 1);
+  top = x_306;
+  let x_307 : i32 = l_1;
+  stack[x_306] = x_307;
+  let x_309 : i32 = top;
+  let x_310 : i32 = (x_309 + 1);
+  top = x_310;
+  let x_311 : i32 = h_1;
+  stack[x_310] = x_311;
+  loop {
+    let x_317 : i32 = top;
+    if ((x_317 >= 0)) {
+    } else {
+      break;
+    }
+    let x_320 : i32 = top;
+    top = (x_320 - 1);
+    let x_323 : i32 = stack[x_320];
+    h_1 = x_323;
+    let x_324 : i32 = top;
+    top = (x_324 - 1);
+    let x_327 : i32 = stack[x_324];
+    l_1 = x_327;
+    let x_328 : i32 = l_1;
+    param_4 = x_328;
+    let x_329 : i32 = h_1;
+    param_5 = x_329;
+    let x_330 : i32 = performPartition_i1_i1_(&(param_4), &(param_5));
+    p = x_330;
+    let x_331 : i32 = p;
+    let x_333 : i32 = l_1;
+    if (((x_331 - 1) > x_333)) {
+      let x_337 : i32 = top;
+      let x_338 : i32 = (x_337 + 1);
+      top = x_338;
+      let x_339 : i32 = l_1;
+      stack[x_338] = x_339;
+      let x_341 : i32 = top;
+      let x_342 : i32 = (x_341 + 1);
+      top = x_342;
+      let x_343 : i32 = p;
+      stack[x_342] = (x_343 - 1);
+    }
+    let x_346 : i32 = p;
+    let x_348 : i32 = h_1;
+    if (((x_346 + 1) < x_348)) {
+      let x_352 : i32 = top;
+      let x_353 : i32 = (x_352 + 1);
+      top = x_353;
+      let x_354 : i32 = p;
+      stack[x_353] = (x_354 + 1);
+      let x_357 : i32 = top;
+      let x_358 : i32 = (x_357 + 1);
+      top = x_358;
+      let x_359 : i32 = h_1;
+      stack[x_358] = x_359;
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_2 : i32;
+  var uv : vec2<f32>;
+  var color : vec3<f32>;
+  let x_94 : vec4<f32> = x_GLF_pos;
+  x_GLF_FragCoord = ((x_94 + vec4<f32>(1.0, 1.0, 0.0, 0.0)) * vec4<f32>(128.0, 128.0, 1.0, 1.0));
+  i_2 = 0;
+  loop {
+    let x_101 : i32 = i_2;
+    if ((x_101 < 10)) {
+    } else {
+      break;
+    }
+    let x_104 : i32 = i_2;
+    let x_105 : i32 = i_2;
+    obj.numbers[x_104] = (10 - x_105);
+    let x_108 : i32 = i_2;
+    let x_109 : i32 = i_2;
+    let x_111 : i32 = obj.numbers[x_109];
+    let x_112 : i32 = i_2;
+    let x_114 : i32 = obj.numbers[x_112];
+    obj.numbers[x_108] = (x_111 * x_114);
+
+    continuing {
+      let x_117 : i32 = i_2;
+      i_2 = (x_117 + 1);
+    }
+  }
+  quicksort_();
+  let x_120 : vec4<f32> = x_GLF_FragCoord;
+  let x_123 : vec2<f32> = x_34.resolution;
+  uv = (vec2<f32>(x_120.x, x_120.y) / x_123);
+  color = vec3<f32>(1.0, 2.0, 3.0);
+  let x_126 : i32 = obj.numbers[0];
+  let x_129 : f32 = color.x;
+  color.x = (x_129 + f32(x_126));
+  let x_133 : f32 = uv.x;
+  if ((x_133 > 0.25)) {
+    let x_138 : i32 = obj.numbers[1];
+    let x_141 : f32 = color.x;
+    color.x = (x_141 + f32(x_138));
+  }
+  let x_145 : f32 = uv.x;
+  if ((x_145 > 0.5)) {
+    let x_150 : f32 = x_37.injectionSwitch.y;
+    let x_155 : i32 = obj.numbers[max((2 * i32(x_150)), 2)];
+    let x_158 : f32 = x_37.injectionSwitch.y;
+    let x_163 : i32 = obj.numbers[max((2 * i32(x_158)), 2)];
+    let x_167 : f32 = color.y;
+    color.y = (x_167 + max(f32(x_155), f32(x_163)));
+  }
+  let x_171 : f32 = uv.x;
+  if ((x_171 > 0.75)) {
+    let x_176 : i32 = obj.numbers[3];
+    let x_179 : f32 = color.z;
+    color.z = (x_179 + f32(x_176));
+  }
+  let x_183 : i32 = obj.numbers[4];
+  let x_186 : f32 = color.y;
+  color.y = (x_186 + f32(x_183));
+  let x_190 : f32 = uv.y;
+  if ((x_190 > 0.25)) {
+    let x_195 : i32 = obj.numbers[5];
+    let x_198 : f32 = color.x;
+    color.x = (x_198 + f32(x_195));
+  }
+  let x_202 : f32 = uv.y;
+  if ((x_202 > 0.5)) {
+    let x_207 : i32 = obj.numbers[6];
+    let x_210 : f32 = color.y;
+    color.y = (x_210 + f32(x_207));
+  }
+  let x_214 : f32 = uv.y;
+  if ((x_214 > 0.75)) {
+    let x_219 : i32 = obj.numbers[7];
+    let x_222 : f32 = color.z;
+    color.z = (x_222 + f32(x_219));
+  }
+  let x_226 : i32 = obj.numbers[8];
+  let x_229 : f32 = color.z;
+  color.z = (x_229 + f32(x_226));
+  let x_233 : f32 = uv.x;
+  let x_235 : f32 = uv.y;
+  if ((abs((x_233 - x_235)) < 0.25)) {
+    let x_242 : i32 = obj.numbers[9];
+    let x_245 : f32 = color.x;
+    color.x = (x_245 + f32(x_242));
+  }
+  let x_248 : vec3<f32> = color;
+  let x_249 : vec3<f32> = normalize(x_248);
+  frag_color = vec4<f32>(x_249.x, x_249.y, x_249.z, 1.0);
+  let x_254 : vec4<f32> = x_GLF_pos;
+  gl_Position = x_254;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  frag_color_1 : vec4<f32>;
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] x_GLF_pos_param : vec4<f32>) -> main_out {
+  x_GLF_pos = x_GLF_pos_param;
+  main_1();
+  return main_out(frag_color, gl_Position);
+}
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
new file mode 100644
index 0000000..231fdaf
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-max-value-as-index/2-opt.wgsl.expected.hlsl
@@ -0,0 +1,225 @@
+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;
+  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;
+  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;
+  {
+    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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 x_GLF_pos_param = tint_symbol.x_GLF_pos_param;
+  x_GLF_pos = x_GLF_pos_param;
+  main_1();
+  const main_out tint_symbol_3 = {frag_color, gl_Position};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.frag_color_1, tint_symbol_3.gl_Position};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-max-value-as-index/2-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-max-value-as-index/2-opt.wgsl.expected.msl
new file mode 100644
index 0000000..99d5039
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-max-value-as-index/2-opt.wgsl.expected.msl
@@ -0,0 +1,272 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  int arr[10];
+};
+struct QuicksortObject {
+  tint_array_wrapper numbers;
+};
+struct buf1 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 frag_color_1;
+  float4 gl_Position;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_pos_param [[attribute(0)]];
+};
+struct tint_symbol_3 {
+  float4 frag_color_1 [[user(locn0)]];
+  float4 gl_Position [[position]];
+};
+
+void swap_i1_i1_(thread int* const i, thread int* const j, thread QuicksortObject* const tint_symbol_6) {
+  int temp = 0;
+  int const x_257 = *(i);
+  int const x_259 = (*(tint_symbol_6)).numbers.arr[x_257];
+  temp = x_259;
+  int const x_260 = *(i);
+  int const x_261 = *(j);
+  int const x_263 = (*(tint_symbol_6)).numbers.arr[x_261];
+  (*(tint_symbol_6)).numbers.arr[x_260] = x_263;
+  int const x_265 = *(j);
+  int const x_266 = temp;
+  (*(tint_symbol_6)).numbers.arr[x_265] = x_266;
+  return;
+}
+
+int performPartition_i1_i1_(thread int* const l, thread int* const h, thread QuicksortObject* const tint_symbol_7) {
+  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;
+  int const x_269 = *(h);
+  int const x_271 = (*(tint_symbol_7)).numbers.arr[x_269];
+  pivot = x_271;
+  int const x_272 = *(l);
+  i_1 = (x_272 - 1);
+  int const x_274 = *(l);
+  j_1 = x_274;
+  while (true) {
+    int const x_279 = j_1;
+    int const x_280 = *(h);
+    if ((x_279 <= (x_280 - 1))) {
+    } else {
+      break;
+    }
+    int const x_284 = j_1;
+    int const x_286 = (*(tint_symbol_7)).numbers.arr[x_284];
+    int const x_287 = pivot;
+    if ((x_286 <= x_287)) {
+      int const x_291 = i_1;
+      i_1 = (x_291 + 1);
+      int const x_293 = i_1;
+      param = x_293;
+      int const x_294 = j_1;
+      param_1 = x_294;
+      swap_i1_i1_(&(param), &(param_1), tint_symbol_7);
+    }
+    {
+      int const x_296 = j_1;
+      j_1 = (x_296 + 1);
+    }
+  }
+  int const x_298 = i_1;
+  param_2 = (x_298 + 1);
+  int const x_300 = *(h);
+  param_3 = x_300;
+  swap_i1_i1_(&(param_2), &(param_3), tint_symbol_7);
+  int const x_302 = i_1;
+  return (x_302 + 1);
+}
+
+void quicksort_(thread QuicksortObject* const tint_symbol_8) {
+  int l_1 = 0;
+  int h_1 = 0;
+  int top = 0;
+  tint_array_wrapper stack = {};
+  int p = 0;
+  int param_4 = 0;
+  int param_5 = 0;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  int const x_305 = top;
+  int const x_306 = (x_305 + 1);
+  top = x_306;
+  int const x_307 = l_1;
+  stack.arr[x_306] = x_307;
+  int const x_309 = top;
+  int const x_310 = (x_309 + 1);
+  top = x_310;
+  int const x_311 = h_1;
+  stack.arr[x_310] = x_311;
+  while (true) {
+    int const x_317 = top;
+    if ((x_317 >= 0)) {
+    } else {
+      break;
+    }
+    int const x_320 = top;
+    top = (x_320 - 1);
+    int const x_323 = stack.arr[x_320];
+    h_1 = x_323;
+    int const x_324 = top;
+    top = (x_324 - 1);
+    int const x_327 = stack.arr[x_324];
+    l_1 = x_327;
+    int const x_328 = l_1;
+    param_4 = x_328;
+    int const x_329 = h_1;
+    param_5 = x_329;
+    int const x_330 = performPartition_i1_i1_(&(param_4), &(param_5), tint_symbol_8);
+    p = x_330;
+    int const x_331 = p;
+    int const x_333 = l_1;
+    if (((x_331 - 1) > x_333)) {
+      int const x_337 = top;
+      int const x_338 = (x_337 + 1);
+      top = x_338;
+      int const x_339 = l_1;
+      stack.arr[x_338] = x_339;
+      int const x_341 = top;
+      int const x_342 = (x_341 + 1);
+      top = x_342;
+      int const x_343 = p;
+      stack.arr[x_342] = (x_343 - 1);
+    }
+    int const x_346 = p;
+    int const x_348 = h_1;
+    if (((x_346 + 1) < x_348)) {
+      int const x_352 = top;
+      int const x_353 = (x_352 + 1);
+      top = x_353;
+      int const x_354 = p;
+      stack.arr[x_353] = (x_354 + 1);
+      int const x_357 = top;
+      int const x_358 = (x_357 + 1);
+      top = x_358;
+      int const x_359 = h_1;
+      stack.arr[x_358] = x_359;
+    }
+  }
+  return;
+}
+
+void main_1(constant buf1& x_34, constant buf0& x_37, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10, thread QuicksortObject* const tint_symbol_11, thread float4* const tint_symbol_12, thread float4* const tint_symbol_13) {
+  int i_2 = 0;
+  float2 uv = 0.0f;
+  float3 color = 0.0f;
+  float4 const x_94 = *(tint_symbol_9);
+  *(tint_symbol_10) = ((x_94 + float4(1.0f, 1.0f, 0.0f, 0.0f)) * float4(128.0f, 128.0f, 1.0f, 1.0f));
+  i_2 = 0;
+  while (true) {
+    int const x_101 = i_2;
+    if ((x_101 < 10)) {
+    } else {
+      break;
+    }
+    int const x_104 = i_2;
+    int const x_105 = i_2;
+    (*(tint_symbol_11)).numbers.arr[x_104] = (10 - x_105);
+    int const x_108 = i_2;
+    int const x_109 = i_2;
+    int const x_111 = (*(tint_symbol_11)).numbers.arr[x_109];
+    int const x_112 = i_2;
+    int const x_114 = (*(tint_symbol_11)).numbers.arr[x_112];
+    (*(tint_symbol_11)).numbers.arr[x_108] = (x_111 * x_114);
+    {
+      int const x_117 = i_2;
+      i_2 = (x_117 + 1);
+    }
+  }
+  quicksort_(tint_symbol_11);
+  float4 const x_120 = *(tint_symbol_10);
+  float2 const x_123 = x_34.resolution;
+  uv = (float2(x_120.x, x_120.y) / x_123);
+  color = float3(1.0f, 2.0f, 3.0f);
+  int const x_126 = (*(tint_symbol_11)).numbers.arr[0];
+  float const x_129 = color.x;
+  color.x = (x_129 + float(x_126));
+  float const x_133 = uv.x;
+  if ((x_133 > 0.25f)) {
+    int const x_138 = (*(tint_symbol_11)).numbers.arr[1];
+    float const x_141 = color.x;
+    color.x = (x_141 + float(x_138));
+  }
+  float const x_145 = uv.x;
+  if ((x_145 > 0.5f)) {
+    float const x_150 = x_37.injectionSwitch.y;
+    int const x_155 = (*(tint_symbol_11)).numbers.arr[max((2 * int(x_150)), 2)];
+    float const x_158 = x_37.injectionSwitch.y;
+    int const x_163 = (*(tint_symbol_11)).numbers.arr[max((2 * int(x_158)), 2)];
+    float const x_167 = color.y;
+    color.y = (x_167 + fmax(float(x_155), float(x_163)));
+  }
+  float const x_171 = uv.x;
+  if ((x_171 > 0.75f)) {
+    int const x_176 = (*(tint_symbol_11)).numbers.arr[3];
+    float const x_179 = color.z;
+    color.z = (x_179 + float(x_176));
+  }
+  int const x_183 = (*(tint_symbol_11)).numbers.arr[4];
+  float const x_186 = color.y;
+  color.y = (x_186 + float(x_183));
+  float const x_190 = uv.y;
+  if ((x_190 > 0.25f)) {
+    int const x_195 = (*(tint_symbol_11)).numbers.arr[5];
+    float const x_198 = color.x;
+    color.x = (x_198 + float(x_195));
+  }
+  float const x_202 = uv.y;
+  if ((x_202 > 0.5f)) {
+    int const x_207 = (*(tint_symbol_11)).numbers.arr[6];
+    float const x_210 = color.y;
+    color.y = (x_210 + float(x_207));
+  }
+  float const x_214 = uv.y;
+  if ((x_214 > 0.75f)) {
+    int const x_219 = (*(tint_symbol_11)).numbers.arr[7];
+    float const x_222 = color.z;
+    color.z = (x_222 + float(x_219));
+  }
+  int const x_226 = (*(tint_symbol_11)).numbers.arr[8];
+  float const x_229 = color.z;
+  color.z = (x_229 + float(x_226));
+  float const x_233 = uv.x;
+  float const x_235 = uv.y;
+  if ((fabs((x_233 - x_235)) < 0.25f)) {
+    int const x_242 = (*(tint_symbol_11)).numbers.arr[9];
+    float const x_245 = color.x;
+    color.x = (x_245 + float(x_242));
+  }
+  float3 const x_248 = color;
+  float3 const x_249 = normalize(x_248);
+  *(tint_symbol_12) = float4(x_249.x, x_249.y, x_249.z, 1.0f);
+  float4 const x_254 = *(tint_symbol_9);
+  *(tint_symbol_13) = x_254;
+  return;
+}
+
+vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]], constant buf1& x_34 [[buffer(1)]], constant buf0& x_37 [[buffer(0)]]) {
+  thread float4 tint_symbol_14 = 0.0f;
+  thread float4 tint_symbol_15 = 0.0f;
+  thread QuicksortObject tint_symbol_16 = {};
+  thread float4 tint_symbol_17 = 0.0f;
+  thread float4 tint_symbol_18 = 0.0f;
+  float4 const x_GLF_pos_param = tint_symbol_1.x_GLF_pos_param;
+  tint_symbol_14 = x_GLF_pos_param;
+  main_1(x_34, x_37, &(tint_symbol_14), &(tint_symbol_15), &(tint_symbol_16), &(tint_symbol_17), &(tint_symbol_18));
+  main_out const tint_symbol_4 = {.frag_color_1=tint_symbol_17, .gl_Position=tint_symbol_18};
+  tint_symbol_3 const tint_symbol_5 = {.frag_color_1=tint_symbol_4.frag_color_1, .gl_Position=tint_symbol_4.gl_Position};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-max-value-as-index/2-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-max-value-as-index/2-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..f53a11b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-max-value-as-index/2-opt.wgsl.expected.spvasm
@@ -0,0 +1,593 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 408
+; Schema: 0
+               OpCapability Shader
+        %280 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %tint_pointsize %tint_symbol %tint_symbol_2 %tint_symbol_3
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %QuicksortObject "QuicksortObject"
+               OpMemberName %QuicksortObject 0 "numbers"
+               OpName %obj "obj"
+               OpName %x_GLF_FragCoord "x_GLF_FragCoord"
+               OpName %x_GLF_pos "x_GLF_pos"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "resolution"
+               OpName %x_34 "x_34"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_37 "x_37"
+               OpName %frag_color "frag_color"
+               OpName %gl_Position "gl_Position"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %swap_i1_i1_ "swap_i1_i1_"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %temp "temp"
+               OpName %performPartition_i1_i1_ "performPartition_i1_i1_"
+               OpName %l "l"
+               OpName %h "h"
+               OpName %pivot "pivot"
+               OpName %i_1 "i_1"
+               OpName %j_1 "j_1"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %quicksort_ "quicksort_"
+               OpName %l_1 "l_1"
+               OpName %h_1 "h_1"
+               OpName %top "top"
+               OpName %stack "stack"
+               OpName %p "p"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpName %main_1 "main_1"
+               OpName %i_2 "i_2"
+               OpName %uv "uv"
+               OpName %color "color"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "frag_color_1"
+               OpMemberName %main_out 1 "gl_Position"
+               OpName %tint_symbol_4 "tint_symbol_4"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpMemberDecorate %QuicksortObject 0 Offset 0
+               OpDecorate %_arr_int_uint_10 ArrayStride 4
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_34 NonWritable
+               OpDecorate %x_34 DescriptorSet 0
+               OpDecorate %x_34 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_37 NonWritable
+               OpDecorate %x_37 DescriptorSet 0
+               OpDecorate %x_37 Binding 0
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %tint_symbol_3 BuiltIn Position
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+        %int = OpTypeInt 32 1
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_int_uint_10 = OpTypeArray %int %uint_10
+%QuicksortObject = OpTypeStruct %_arr_int_uint_10
+%_ptr_Private_QuicksortObject = OpTypePointer Private %QuicksortObject
+         %12 = OpConstantNull %QuicksortObject
+        %obj = OpVariable %_ptr_Private_QuicksortObject Private %12
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%x_GLF_FragCoord = OpVariable %_ptr_Private_v4float Private %16
+  %x_GLF_pos = OpVariable %_ptr_Private_v4float Private %16
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_34 = OpVariable %_ptr_Uniform_buf1 Uniform
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_37 = OpVariable %_ptr_Uniform_buf0 Uniform
+ %frag_color = OpVariable %_ptr_Private_v4float Private %16
+%gl_Position = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %16
+%tint_symbol_3 = OpVariable %_ptr_Output_v4float Output %16
+       %void = OpTypeVoid
+%_ptr_Function_int = OpTypePointer Function %int
+         %32 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+         %40 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_int = OpTypePointer Private %int
+         %58 = OpTypeFunction %int %_ptr_Function_int %_ptr_Function_int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+        %118 = OpTypeFunction %void
+%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
+        %126 = OpConstantNull %_arr_int_uint_10
+      %int_0 = OpConstant %int 0
+      %int_9 = OpConstant %int 9
+     %int_n1 = OpConstant %int -1
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+        %198 = OpConstantNull %v2float
+    %v3float = OpTypeVector %float 3
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+        %202 = OpConstantNull %v3float
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+        %206 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_0
+  %float_128 = OpConstant %float 128
+        %209 = OpConstantComposite %v4float %float_128 %float_128 %float_1 %float_1
+     %int_10 = OpConstant %int 10
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+        %247 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+%_ptr_Function_float = OpTypePointer Function %float
+ %float_0_25 = OpConstant %float 0.25
+  %float_0_5 = OpConstant %float 0.5
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_2 = OpConstant %int 2
+ %float_0_75 = OpConstant %float 0.75
+      %int_3 = OpConstant %int 3
+     %uint_2 = OpConstant %uint 2
+      %int_4 = OpConstant %int 4
+      %int_5 = OpConstant %int 5
+      %int_6 = OpConstant %int 6
+      %int_7 = OpConstant %int 7
+      %int_8 = OpConstant %int 8
+   %main_out = OpTypeStruct %v4float %v4float
+        %393 = OpTypeFunction %void %main_out
+%swap_i1_i1_ = OpFunction %void None %32
+          %i = OpFunctionParameter %_ptr_Function_int
+          %j = OpFunctionParameter %_ptr_Function_int
+         %38 = OpLabel
+       %temp = OpVariable %_ptr_Function_int Function %40
+         %42 = OpLoad %int %i
+         %45 = OpAccessChain %_ptr_Private_int %obj %uint_0 %42
+         %46 = OpLoad %int %45
+               OpStore %temp %46
+         %48 = OpLoad %int %i
+         %50 = OpLoad %int %j
+         %51 = OpAccessChain %_ptr_Private_int %obj %uint_0 %50
+         %52 = OpLoad %int %51
+         %53 = OpAccessChain %_ptr_Private_int %obj %uint_0 %48
+               OpStore %53 %52
+         %55 = OpLoad %int %j
+         %56 = OpLoad %int %temp
+         %57 = OpAccessChain %_ptr_Private_int %obj %uint_0 %55
+               OpStore %57 %56
+               OpReturn
+               OpFunctionEnd
+%performPartition_i1_i1_ = OpFunction %int None %58
+          %l = OpFunctionParameter %_ptr_Function_int
+          %h = OpFunctionParameter %_ptr_Function_int
+         %62 = OpLabel
+      %pivot = OpVariable %_ptr_Function_int Function %40
+        %i_1 = OpVariable %_ptr_Function_int Function %40
+        %j_1 = OpVariable %_ptr_Function_int Function %40
+      %param = OpVariable %_ptr_Function_int Function %40
+    %param_1 = OpVariable %_ptr_Function_int Function %40
+    %param_2 = OpVariable %_ptr_Function_int Function %40
+    %param_3 = OpVariable %_ptr_Function_int Function %40
+         %71 = OpLoad %int %h
+         %72 = OpAccessChain %_ptr_Private_int %obj %uint_0 %71
+         %73 = OpLoad %int %72
+               OpStore %pivot %73
+         %75 = OpLoad %int %l
+         %77 = OpISub %int %75 %int_1
+               OpStore %i_1 %77
+         %79 = OpLoad %int %l
+               OpStore %j_1 %79
+               OpBranch %80
+         %80 = OpLabel
+               OpLoopMerge %81 %82 None
+               OpBranch %83
+         %83 = OpLabel
+         %84 = OpLoad %int %j_1
+         %86 = OpLoad %int %h
+         %87 = OpISub %int %86 %int_1
+         %88 = OpSLessThanEqual %bool %84 %87
+               OpSelectionMerge %90 None
+               OpBranchConditional %88 %91 %92
+         %91 = OpLabel
+               OpBranch %90
+         %92 = OpLabel
+               OpBranch %81
+         %90 = OpLabel
+         %93 = OpLoad %int %j_1
+         %94 = OpAccessChain %_ptr_Private_int %obj %uint_0 %93
+         %95 = OpLoad %int %94
+         %96 = OpLoad %int %pivot
+         %97 = OpSLessThanEqual %bool %95 %96
+               OpSelectionMerge %98 None
+               OpBranchConditional %97 %99 %98
+         %99 = OpLabel
+        %100 = OpLoad %int %i_1
+        %101 = OpIAdd %int %100 %int_1
+               OpStore %i_1 %101
+        %102 = OpLoad %int %i_1
+               OpStore %param %102
+        %103 = OpLoad %int %j_1
+               OpStore %param_1 %103
+        %104 = OpFunctionCall %void %swap_i1_i1_ %param %param_1
+               OpBranch %98
+         %98 = OpLabel
+               OpBranch %82
+         %82 = OpLabel
+        %107 = OpLoad %int %j_1
+        %108 = OpIAdd %int %107 %int_1
+               OpStore %j_1 %108
+               OpBranch %80
+         %81 = OpLabel
+        %109 = OpLoad %int %i_1
+        %110 = OpIAdd %int %109 %int_1
+               OpStore %param_2 %110
+        %112 = OpLoad %int %h
+               OpStore %param_3 %112
+        %113 = OpFunctionCall %void %swap_i1_i1_ %param_2 %param_3
+        %116 = OpLoad %int %i_1
+        %117 = OpIAdd %int %116 %int_1
+               OpReturnValue %117
+               OpFunctionEnd
+ %quicksort_ = OpFunction %void None %118
+        %120 = OpLabel
+        %l_1 = OpVariable %_ptr_Function_int Function %40
+        %h_1 = OpVariable %_ptr_Function_int Function %40
+        %top = OpVariable %_ptr_Function_int Function %40
+      %stack = OpVariable %_ptr_Function__arr_int_uint_10 Function %126
+          %p = OpVariable %_ptr_Function_int Function %40
+    %param_4 = OpVariable %_ptr_Function_int Function %40
+    %param_5 = OpVariable %_ptr_Function_int Function %40
+               OpStore %l_1 %int_0
+               OpStore %h_1 %int_9
+               OpStore %top %int_n1
+        %133 = OpLoad %int %top
+        %134 = OpIAdd %int %133 %int_1
+               OpStore %top %134
+        %135 = OpLoad %int %l_1
+        %136 = OpAccessChain %_ptr_Function_int %stack %134
+               OpStore %136 %135
+        %137 = OpLoad %int %top
+        %138 = OpIAdd %int %137 %int_1
+               OpStore %top %138
+        %139 = OpLoad %int %h_1
+        %140 = OpAccessChain %_ptr_Function_int %stack %138
+               OpStore %140 %139
+               OpBranch %141
+        %141 = OpLabel
+               OpLoopMerge %142 %143 None
+               OpBranch %144
+        %144 = OpLabel
+        %145 = OpLoad %int %top
+        %146 = OpSGreaterThanEqual %bool %145 %int_0
+               OpSelectionMerge %147 None
+               OpBranchConditional %146 %148 %149
+        %148 = OpLabel
+               OpBranch %147
+        %149 = OpLabel
+               OpBranch %142
+        %147 = OpLabel
+        %150 = OpLoad %int %top
+        %151 = OpISub %int %150 %int_1
+               OpStore %top %151
+        %152 = OpAccessChain %_ptr_Function_int %stack %150
+        %153 = OpLoad %int %152
+               OpStore %h_1 %153
+        %154 = OpLoad %int %top
+        %155 = OpISub %int %154 %int_1
+               OpStore %top %155
+        %156 = OpAccessChain %_ptr_Function_int %stack %154
+        %157 = OpLoad %int %156
+               OpStore %l_1 %157
+        %158 = OpLoad %int %l_1
+               OpStore %param_4 %158
+        %159 = OpLoad %int %h_1
+               OpStore %param_5 %159
+        %160 = OpFunctionCall %int %performPartition_i1_i1_ %param_4 %param_5
+               OpStore %p %160
+        %163 = OpLoad %int %p
+        %164 = OpLoad %int %l_1
+        %165 = OpISub %int %163 %int_1
+        %166 = OpSGreaterThan %bool %165 %164
+               OpSelectionMerge %167 None
+               OpBranchConditional %166 %168 %167
+        %168 = OpLabel
+        %169 = OpLoad %int %top
+        %170 = OpIAdd %int %169 %int_1
+               OpStore %top %170
+        %171 = OpLoad %int %l_1
+        %172 = OpAccessChain %_ptr_Function_int %stack %170
+               OpStore %172 %171
+        %173 = OpLoad %int %top
+        %174 = OpIAdd %int %173 %int_1
+               OpStore %top %174
+        %175 = OpLoad %int %p
+        %176 = OpAccessChain %_ptr_Function_int %stack %174
+        %177 = OpISub %int %175 %int_1
+               OpStore %176 %177
+               OpBranch %167
+        %167 = OpLabel
+        %178 = OpLoad %int %p
+        %179 = OpLoad %int %h_1
+        %180 = OpIAdd %int %178 %int_1
+        %181 = OpSLessThan %bool %180 %179
+               OpSelectionMerge %182 None
+               OpBranchConditional %181 %183 %182
+        %183 = OpLabel
+        %184 = OpLoad %int %top
+        %185 = OpIAdd %int %184 %int_1
+               OpStore %top %185
+        %186 = OpLoad %int %p
+        %187 = OpAccessChain %_ptr_Function_int %stack %185
+        %188 = OpIAdd %int %186 %int_1
+               OpStore %187 %188
+        %189 = OpLoad %int %top
+        %190 = OpIAdd %int %189 %int_1
+               OpStore %top %190
+        %191 = OpLoad %int %h_1
+        %192 = OpAccessChain %_ptr_Function_int %stack %190
+               OpStore %192 %191
+               OpBranch %182
+        %182 = OpLabel
+               OpBranch %143
+        %143 = OpLabel
+               OpBranch %141
+        %142 = OpLabel
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %118
+        %194 = OpLabel
+        %i_2 = OpVariable %_ptr_Function_int Function %40
+         %uv = OpVariable %_ptr_Function_v2float Function %198
+      %color = OpVariable %_ptr_Function_v3float Function %202
+        %203 = OpLoad %v4float %x_GLF_pos
+        %207 = OpFAdd %v4float %203 %206
+        %210 = OpFMul %v4float %207 %209
+               OpStore %x_GLF_FragCoord %210
+               OpStore %i_2 %int_0
+               OpBranch %211
+        %211 = OpLabel
+               OpLoopMerge %212 %213 None
+               OpBranch %214
+        %214 = OpLabel
+        %215 = OpLoad %int %i_2
+        %217 = OpSLessThan %bool %215 %int_10
+               OpSelectionMerge %218 None
+               OpBranchConditional %217 %219 %220
+        %219 = OpLabel
+               OpBranch %218
+        %220 = OpLabel
+               OpBranch %212
+        %218 = OpLabel
+        %221 = OpLoad %int %i_2
+        %222 = OpLoad %int %i_2
+        %223 = OpAccessChain %_ptr_Private_int %obj %uint_0 %221
+        %224 = OpISub %int %int_10 %222
+               OpStore %223 %224
+        %225 = OpLoad %int %i_2
+        %226 = OpLoad %int %i_2
+        %227 = OpAccessChain %_ptr_Private_int %obj %uint_0 %226
+        %228 = OpLoad %int %227
+        %229 = OpLoad %int %i_2
+        %230 = OpAccessChain %_ptr_Private_int %obj %uint_0 %229
+        %231 = OpLoad %int %230
+        %232 = OpAccessChain %_ptr_Private_int %obj %uint_0 %225
+        %233 = OpIMul %int %228 %231
+               OpStore %232 %233
+               OpBranch %213
+        %213 = OpLabel
+        %234 = OpLoad %int %i_2
+        %235 = OpIAdd %int %234 %int_1
+               OpStore %i_2 %235
+               OpBranch %211
+        %212 = OpLabel
+        %236 = OpFunctionCall %void %quicksort_
+        %237 = OpLoad %v4float %x_GLF_FragCoord
+        %239 = OpAccessChain %_ptr_Uniform_v2float %x_34 %uint_0
+        %240 = OpLoad %v2float %239
+        %241 = OpCompositeExtract %float %237 0
+        %242 = OpCompositeExtract %float %237 1
+        %243 = OpCompositeConstruct %v2float %241 %242
+        %244 = OpFDiv %v2float %243 %240
+               OpStore %uv %244
+               OpStore %color %247
+        %248 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_0
+        %249 = OpLoad %int %248
+        %251 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %252 = OpLoad %float %251
+        %253 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %254 = OpConvertSToF %float %249
+        %255 = OpFAdd %float %252 %254
+               OpStore %253 %255
+        %256 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %257 = OpLoad %float %256
+        %259 = OpFOrdGreaterThan %bool %257 %float_0_25
+               OpSelectionMerge %260 None
+               OpBranchConditional %259 %261 %260
+        %261 = OpLabel
+        %262 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_1
+        %263 = OpLoad %int %262
+        %264 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %265 = OpLoad %float %264
+        %266 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %267 = OpConvertSToF %float %263
+        %268 = OpFAdd %float %265 %267
+               OpStore %266 %268
+               OpBranch %260
+        %260 = OpLabel
+        %269 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %270 = OpLoad %float %269
+        %272 = OpFOrdGreaterThan %bool %270 %float_0_5
+               OpSelectionMerge %273 None
+               OpBranchConditional %272 %274 %273
+        %274 = OpLabel
+        %277 = OpAccessChain %_ptr_Uniform_float %x_37 %uint_0 %uint_1
+        %278 = OpLoad %float %277
+        %282 = OpConvertFToS %int %278
+        %283 = OpIMul %int %int_2 %282
+        %279 = OpExtInst %int %280 SMax %283 %int_2
+        %284 = OpAccessChain %_ptr_Private_int %obj %uint_0 %279
+        %285 = OpLoad %int %284
+        %286 = OpAccessChain %_ptr_Uniform_float %x_37 %uint_0 %uint_1
+        %287 = OpLoad %float %286
+        %289 = OpConvertFToS %int %287
+        %290 = OpIMul %int %int_2 %289
+        %288 = OpExtInst %int %280 SMax %290 %int_2
+        %291 = OpAccessChain %_ptr_Private_int %obj %uint_0 %288
+        %292 = OpLoad %int %291
+        %293 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %294 = OpLoad %float %293
+        %295 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %297 = OpConvertSToF %float %285
+        %298 = OpConvertSToF %float %292
+        %296 = OpExtInst %float %280 NMax %297 %298
+        %299 = OpFAdd %float %294 %296
+               OpStore %295 %299
+               OpBranch %273
+        %273 = OpLabel
+        %300 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %301 = OpLoad %float %300
+        %303 = OpFOrdGreaterThan %bool %301 %float_0_75
+               OpSelectionMerge %304 None
+               OpBranchConditional %303 %305 %304
+        %305 = OpLabel
+        %307 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_3
+        %308 = OpLoad %int %307
+        %310 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %311 = OpLoad %float %310
+        %312 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %313 = OpConvertSToF %float %308
+        %314 = OpFAdd %float %311 %313
+               OpStore %312 %314
+               OpBranch %304
+        %304 = OpLabel
+        %316 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_4
+        %317 = OpLoad %int %316
+        %318 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %319 = OpLoad %float %318
+        %320 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %321 = OpConvertSToF %float %317
+        %322 = OpFAdd %float %319 %321
+               OpStore %320 %322
+        %323 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %324 = OpLoad %float %323
+        %325 = OpFOrdGreaterThan %bool %324 %float_0_25
+               OpSelectionMerge %326 None
+               OpBranchConditional %325 %327 %326
+        %327 = OpLabel
+        %329 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_5
+        %330 = OpLoad %int %329
+        %331 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %332 = OpLoad %float %331
+        %333 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %334 = OpConvertSToF %float %330
+        %335 = OpFAdd %float %332 %334
+               OpStore %333 %335
+               OpBranch %326
+        %326 = OpLabel
+        %336 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %337 = OpLoad %float %336
+        %338 = OpFOrdGreaterThan %bool %337 %float_0_5
+               OpSelectionMerge %339 None
+               OpBranchConditional %338 %340 %339
+        %340 = OpLabel
+        %342 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_6
+        %343 = OpLoad %int %342
+        %344 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %345 = OpLoad %float %344
+        %346 = OpAccessChain %_ptr_Function_float %color %uint_1
+        %347 = OpConvertSToF %float %343
+        %348 = OpFAdd %float %345 %347
+               OpStore %346 %348
+               OpBranch %339
+        %339 = OpLabel
+        %349 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %350 = OpLoad %float %349
+        %351 = OpFOrdGreaterThan %bool %350 %float_0_75
+               OpSelectionMerge %352 None
+               OpBranchConditional %351 %353 %352
+        %353 = OpLabel
+        %355 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_7
+        %356 = OpLoad %int %355
+        %357 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %358 = OpLoad %float %357
+        %359 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %360 = OpConvertSToF %float %356
+        %361 = OpFAdd %float %358 %360
+               OpStore %359 %361
+               OpBranch %352
+        %352 = OpLabel
+        %363 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_8
+        %364 = OpLoad %int %363
+        %365 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %366 = OpLoad %float %365
+        %367 = OpAccessChain %_ptr_Function_float %color %uint_2
+        %368 = OpConvertSToF %float %364
+        %369 = OpFAdd %float %366 %368
+               OpStore %367 %369
+        %370 = OpAccessChain %_ptr_Function_float %uv %uint_0
+        %371 = OpLoad %float %370
+        %372 = OpAccessChain %_ptr_Function_float %uv %uint_1
+        %373 = OpLoad %float %372
+        %375 = OpFSub %float %371 %373
+        %374 = OpExtInst %float %280 FAbs %375
+        %376 = OpFOrdLessThan %bool %374 %float_0_25
+               OpSelectionMerge %377 None
+               OpBranchConditional %376 %378 %377
+        %378 = OpLabel
+        %379 = OpAccessChain %_ptr_Private_int %obj %uint_0 %int_9
+        %380 = OpLoad %int %379
+        %381 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %382 = OpLoad %float %381
+        %383 = OpAccessChain %_ptr_Function_float %color %uint_0
+        %384 = OpConvertSToF %float %380
+        %385 = OpFAdd %float %382 %384
+               OpStore %383 %385
+               OpBranch %377
+        %377 = OpLabel
+        %386 = OpLoad %v3float %color
+        %387 = OpExtInst %v3float %280 Normalize %386
+        %388 = OpCompositeExtract %float %387 0
+        %389 = OpCompositeExtract %float %387 1
+        %390 = OpCompositeExtract %float %387 2
+        %391 = OpCompositeConstruct %v4float %388 %389 %390 %float_1
+               OpStore %frag_color %391
+        %392 = OpLoad %v4float %x_GLF_pos
+               OpStore %gl_Position %392
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_4 = OpFunction %void None %393
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %397 = OpLabel
+        %398 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %398
+        %399 = OpCompositeExtract %v4float %tint_symbol_1 1
+               OpStore %tint_symbol_3 %399
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %118
+        %401 = OpLabel
+               OpStore %tint_pointsize %float_1
+        %402 = OpLoad %v4float %tint_symbol
+               OpStore %x_GLF_pos %402
+        %403 = OpFunctionCall %void %main_1
+        %405 = OpLoad %v4float %frag_color
+        %406 = OpLoad %v4float %gl_Position
+        %407 = OpCompositeConstruct %main_out %405 %406
+        %404 = OpFunctionCall %void %tint_symbol_4 %407
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-quicksort-max-value-as-index/2-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-max-value-as-index/2-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..3d6cec0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-quicksort-max-value-as-index/2-opt.wgsl.expected.wgsl
@@ -0,0 +1,274 @@
+struct QuicksortObject {
+  numbers : array<i32, 10>;
+};
+
+[[block]]
+struct buf1 {
+  resolution : vec2<f32>;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> obj : QuicksortObject;
+
+var<private> x_GLF_FragCoord : vec4<f32>;
+
+var<private> x_GLF_pos : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_34 : buf1;
+
+[[group(0), binding(0)]] var<uniform> x_37 : buf0;
+
+var<private> frag_color : vec4<f32>;
+
+var<private> gl_Position : vec4<f32>;
+
+fn swap_i1_i1_(i : ptr<function, i32>, j : ptr<function, i32>) {
+  var temp : i32;
+  let x_257 : i32 = *(i);
+  let x_259 : i32 = obj.numbers[x_257];
+  temp = x_259;
+  let x_260 : i32 = *(i);
+  let x_261 : i32 = *(j);
+  let x_263 : i32 = obj.numbers[x_261];
+  obj.numbers[x_260] = x_263;
+  let x_265 : i32 = *(j);
+  let x_266 : i32 = temp;
+  obj.numbers[x_265] = x_266;
+  return;
+}
+
+fn performPartition_i1_i1_(l : ptr<function, i32>, h : ptr<function, i32>) -> i32 {
+  var pivot : i32;
+  var i_1 : i32;
+  var j_1 : i32;
+  var param : i32;
+  var param_1 : i32;
+  var param_2 : i32;
+  var param_3 : i32;
+  let x_269 : i32 = *(h);
+  let x_271 : i32 = obj.numbers[x_269];
+  pivot = x_271;
+  let x_272 : i32 = *(l);
+  i_1 = (x_272 - 1);
+  let x_274 : i32 = *(l);
+  j_1 = x_274;
+  loop {
+    let x_279 : i32 = j_1;
+    let x_280 : i32 = *(h);
+    if ((x_279 <= (x_280 - 1))) {
+    } else {
+      break;
+    }
+    let x_284 : i32 = j_1;
+    let x_286 : i32 = obj.numbers[x_284];
+    let x_287 : i32 = pivot;
+    if ((x_286 <= x_287)) {
+      let x_291 : i32 = i_1;
+      i_1 = (x_291 + 1);
+      let x_293 : i32 = i_1;
+      param = x_293;
+      let x_294 : i32 = j_1;
+      param_1 = x_294;
+      swap_i1_i1_(&(param), &(param_1));
+    }
+
+    continuing {
+      let x_296 : i32 = j_1;
+      j_1 = (x_296 + 1);
+    }
+  }
+  let x_298 : i32 = i_1;
+  param_2 = (x_298 + 1);
+  let x_300 : i32 = *(h);
+  param_3 = x_300;
+  swap_i1_i1_(&(param_2), &(param_3));
+  let x_302 : i32 = i_1;
+  return (x_302 + 1);
+}
+
+fn quicksort_() {
+  var l_1 : i32;
+  var h_1 : i32;
+  var top : i32;
+  var stack : array<i32, 10>;
+  var p : i32;
+  var param_4 : i32;
+  var param_5 : i32;
+  l_1 = 0;
+  h_1 = 9;
+  top = -1;
+  let x_305 : i32 = top;
+  let x_306 : i32 = (x_305 + 1);
+  top = x_306;
+  let x_307 : i32 = l_1;
+  stack[x_306] = x_307;
+  let x_309 : i32 = top;
+  let x_310 : i32 = (x_309 + 1);
+  top = x_310;
+  let x_311 : i32 = h_1;
+  stack[x_310] = x_311;
+  loop {
+    let x_317 : i32 = top;
+    if ((x_317 >= 0)) {
+    } else {
+      break;
+    }
+    let x_320 : i32 = top;
+    top = (x_320 - 1);
+    let x_323 : i32 = stack[x_320];
+    h_1 = x_323;
+    let x_324 : i32 = top;
+    top = (x_324 - 1);
+    let x_327 : i32 = stack[x_324];
+    l_1 = x_327;
+    let x_328 : i32 = l_1;
+    param_4 = x_328;
+    let x_329 : i32 = h_1;
+    param_5 = x_329;
+    let x_330 : i32 = performPartition_i1_i1_(&(param_4), &(param_5));
+    p = x_330;
+    let x_331 : i32 = p;
+    let x_333 : i32 = l_1;
+    if (((x_331 - 1) > x_333)) {
+      let x_337 : i32 = top;
+      let x_338 : i32 = (x_337 + 1);
+      top = x_338;
+      let x_339 : i32 = l_1;
+      stack[x_338] = x_339;
+      let x_341 : i32 = top;
+      let x_342 : i32 = (x_341 + 1);
+      top = x_342;
+      let x_343 : i32 = p;
+      stack[x_342] = (x_343 - 1);
+    }
+    let x_346 : i32 = p;
+    let x_348 : i32 = h_1;
+    if (((x_346 + 1) < x_348)) {
+      let x_352 : i32 = top;
+      let x_353 : i32 = (x_352 + 1);
+      top = x_353;
+      let x_354 : i32 = p;
+      stack[x_353] = (x_354 + 1);
+      let x_357 : i32 = top;
+      let x_358 : i32 = (x_357 + 1);
+      top = x_358;
+      let x_359 : i32 = h_1;
+      stack[x_358] = x_359;
+    }
+  }
+  return;
+}
+
+fn main_1() {
+  var i_2 : i32;
+  var uv : vec2<f32>;
+  var color : vec3<f32>;
+  let x_94 : vec4<f32> = x_GLF_pos;
+  x_GLF_FragCoord = ((x_94 + vec4<f32>(1.0, 1.0, 0.0, 0.0)) * vec4<f32>(128.0, 128.0, 1.0, 1.0));
+  i_2 = 0;
+  loop {
+    let x_101 : i32 = i_2;
+    if ((x_101 < 10)) {
+    } else {
+      break;
+    }
+    let x_104 : i32 = i_2;
+    let x_105 : i32 = i_2;
+    obj.numbers[x_104] = (10 - x_105);
+    let x_108 : i32 = i_2;
+    let x_109 : i32 = i_2;
+    let x_111 : i32 = obj.numbers[x_109];
+    let x_112 : i32 = i_2;
+    let x_114 : i32 = obj.numbers[x_112];
+    obj.numbers[x_108] = (x_111 * x_114);
+
+    continuing {
+      let x_117 : i32 = i_2;
+      i_2 = (x_117 + 1);
+    }
+  }
+  quicksort_();
+  let x_120 : vec4<f32> = x_GLF_FragCoord;
+  let x_123 : vec2<f32> = x_34.resolution;
+  uv = (vec2<f32>(x_120.x, x_120.y) / x_123);
+  color = vec3<f32>(1.0, 2.0, 3.0);
+  let x_126 : i32 = obj.numbers[0];
+  let x_129 : f32 = color.x;
+  color.x = (x_129 + f32(x_126));
+  let x_133 : f32 = uv.x;
+  if ((x_133 > 0.25)) {
+    let x_138 : i32 = obj.numbers[1];
+    let x_141 : f32 = color.x;
+    color.x = (x_141 + f32(x_138));
+  }
+  let x_145 : f32 = uv.x;
+  if ((x_145 > 0.5)) {
+    let x_150 : f32 = x_37.injectionSwitch.y;
+    let x_155 : i32 = obj.numbers[max((2 * i32(x_150)), 2)];
+    let x_158 : f32 = x_37.injectionSwitch.y;
+    let x_163 : i32 = obj.numbers[max((2 * i32(x_158)), 2)];
+    let x_167 : f32 = color.y;
+    color.y = (x_167 + max(f32(x_155), f32(x_163)));
+  }
+  let x_171 : f32 = uv.x;
+  if ((x_171 > 0.75)) {
+    let x_176 : i32 = obj.numbers[3];
+    let x_179 : f32 = color.z;
+    color.z = (x_179 + f32(x_176));
+  }
+  let x_183 : i32 = obj.numbers[4];
+  let x_186 : f32 = color.y;
+  color.y = (x_186 + f32(x_183));
+  let x_190 : f32 = uv.y;
+  if ((x_190 > 0.25)) {
+    let x_195 : i32 = obj.numbers[5];
+    let x_198 : f32 = color.x;
+    color.x = (x_198 + f32(x_195));
+  }
+  let x_202 : f32 = uv.y;
+  if ((x_202 > 0.5)) {
+    let x_207 : i32 = obj.numbers[6];
+    let x_210 : f32 = color.y;
+    color.y = (x_210 + f32(x_207));
+  }
+  let x_214 : f32 = uv.y;
+  if ((x_214 > 0.75)) {
+    let x_219 : i32 = obj.numbers[7];
+    let x_222 : f32 = color.z;
+    color.z = (x_222 + f32(x_219));
+  }
+  let x_226 : i32 = obj.numbers[8];
+  let x_229 : f32 = color.z;
+  color.z = (x_229 + f32(x_226));
+  let x_233 : f32 = uv.x;
+  let x_235 : f32 = uv.y;
+  if ((abs((x_233 - x_235)) < 0.25)) {
+    let x_242 : i32 = obj.numbers[9];
+    let x_245 : f32 = color.x;
+    color.x = (x_245 + f32(x_242));
+  }
+  let x_248 : vec3<f32> = color;
+  let x_249 : vec3<f32> = normalize(x_248);
+  frag_color = vec4<f32>(x_249.x, x_249.y, x_249.z, 1.0);
+  let x_254 : vec4<f32> = x_GLF_pos;
+  gl_Position = x_254;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  frag_color_1 : vec4<f32>;
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] x_GLF_pos_param : vec4<f32>) -> main_out {
+  x_GLF_pos = x_GLF_pos_param;
+  main_1();
+  return main_out(frag_color, gl_Position);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-rects-vec4-clamp-conditional-min-mix/1.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-rects-vec4-clamp-conditional-min-mix/1.spvasm
new file mode 100644
index 0000000..f72cf88
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-rects-vec4-clamp-conditional-min-mix/1.spvasm
@@ -0,0 +1,284 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %collision_vf2_vf4_ "collision(vf2;vf4;"
+               OpName %pos "pos"
+               OpName %quad "quad"
+               OpName %match_vf2_ "match(vf2;"
+               OpName %pos_0 "pos"
+               OpName %res "res"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %i "i"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %indexable "indexable"
+               OpName %indexable_0 "indexable"
+               OpName %indexable_1 "indexable"
+               OpName %indexable_2 "indexable"
+               OpName %lin "lin"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpName %param_1 "param"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %bool = OpTypeBool
+         %30 = OpTypeFunction %bool %_ptr_Function_v2float %_ptr_Function_v4float
+         %31 = OpTypeFunction %v4float %_ptr_Function_v2float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+      %false = OpConstantFalse %bool
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+     %uint_3 = OpConstant %uint 3
+       %true = OpConstantTrue %bool
+  %float_0_5 = OpConstant %float 0.5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_0 = OpConstant %float 0
+   %float_n1 = OpConstant %float -1
+    %float_1 = OpConstant %float 1
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %int_8 = OpConstant %int 8
+     %uint_8 = OpConstant %uint 8
+%_arr_v4float_uint_8 = OpTypeArray %v4float %uint_8
+    %float_4 = OpConstant %float 4
+   %float_20 = OpConstant %float 20
+         %54 = OpConstantComposite %v4float %float_4 %float_4 %float_20 %float_4
+         %55 = OpConstantComposite %v4float %float_4 %float_4 %float_4 %float_20
+         %56 = OpConstantComposite %v4float %float_4 %float_20 %float_20 %float_4
+    %float_8 = OpConstant %float 8
+         %58 = OpConstantComposite %v4float %float_20 %float_4 %float_4 %float_8
+    %float_6 = OpConstant %float 6
+    %float_2 = OpConstant %float 2
+         %61 = OpConstantComposite %v4float %float_8 %float_6 %float_4 %float_2
+   %float_12 = OpConstant %float 12
+         %63 = OpConstantComposite %v4float %float_2 %float_12 %float_2 %float_4
+   %float_16 = OpConstant %float 16
+         %65 = OpConstantComposite %v4float %float_16 %float_2 %float_4 %float_4
+   %float_22 = OpConstant %float 22
+         %67 = OpConstantComposite %v4float %float_12 %float_22 %float_4 %float_4
+         %68 = OpConstantComposite %_arr_v4float_uint_8 %54 %55 %56 %58 %61 %63 %65 %67
+%_ptr_Function__arr_v4float_uint_8 = OpTypePointer Function %_arr_v4float_uint_8
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+         %72 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+         %73 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+         %74 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+         %75 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+         %76 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+         %77 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+         %78 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+         %79 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+         %80 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %81 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+         %82 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+         %83 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+         %84 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+         %85 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+         %86 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+         %87 = OpConstantComposite %_arr_v4float_uint_16 %72 %73 %74 %75 %76 %77 %78 %79 %72 %80 %81 %82 %83 %84 %85 %86
+      %int_9 = OpConstant %int 9
+     %int_11 = OpConstant %int 11
+     %int_16 = OpConstant %int 16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+      %int_1 = OpConstant %int 1
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+   %float_32 = OpConstant %float 32
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+       %main = OpFunction %void None %23
+         %97 = OpLabel
+        %lin = OpVariable %_ptr_Function_v2float Function
+    %param_1 = OpVariable %_ptr_Function_v2float Function
+         %98 = OpLoad %v4float %gl_FragCoord
+         %99 = OpVectorShuffle %v2float %98 %98 0 1
+        %100 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+        %101 = OpLoad %v2float %100
+        %102 = OpFDiv %v2float %99 %101
+               OpStore %lin %102
+        %103 = OpLoad %v2float %lin
+        %104 = OpVectorTimesScalar %v2float %103 %float_32
+        %105 = OpExtInst %v2float %1 Floor %104
+               OpStore %lin %105
+        %106 = OpLoad %v2float %lin
+               OpStore %param_1 %106
+        %107 = OpFunctionCall %v4float %match_vf2_ %param_1
+               OpStore %_GLF_color %107
+               OpReturn
+               OpFunctionEnd
+%collision_vf2_vf4_ = OpFunction %bool None %30
+        %pos = OpFunctionParameter %_ptr_Function_v2float
+       %quad = OpFunctionParameter %_ptr_Function_v4float
+        %108 = OpLabel
+        %109 = OpAccessChain %_ptr_Function_float %pos %uint_0
+        %110 = OpLoad %float %109
+        %111 = OpAccessChain %_ptr_Function_float %quad %uint_0
+        %112 = OpLoad %float %111
+        %113 = OpFOrdLessThan %bool %110 %112
+               OpSelectionMerge %114 None
+               OpBranchConditional %113 %115 %114
+        %115 = OpLabel
+               OpReturnValue %false
+        %114 = OpLabel
+        %116 = OpAccessChain %_ptr_Function_float %pos %uint_1
+        %117 = OpLoad %float %116
+        %118 = OpAccessChain %_ptr_Function_float %quad %uint_1
+        %119 = OpLoad %float %118
+        %120 = OpFOrdLessThan %bool %117 %119
+               OpSelectionMerge %121 None
+               OpBranchConditional %120 %122 %121
+        %122 = OpLabel
+               OpReturnValue %false
+        %121 = OpLabel
+        %123 = OpAccessChain %_ptr_Function_float %pos %uint_0
+        %124 = OpLoad %float %123
+        %125 = OpAccessChain %_ptr_Function_float %quad %uint_0
+        %126 = OpLoad %float %125
+        %127 = OpAccessChain %_ptr_Function_float %quad %uint_2
+        %128 = OpLoad %float %127
+        %129 = OpFAdd %float %126 %128
+        %130 = OpFOrdGreaterThan %bool %124 %129
+               OpSelectionMerge %131 None
+               OpBranchConditional %130 %132 %131
+        %132 = OpLabel
+               OpReturnValue %false
+        %131 = OpLabel
+        %133 = OpAccessChain %_ptr_Function_float %pos %uint_1
+        %134 = OpLoad %float %133
+        %135 = OpAccessChain %_ptr_Function_float %quad %uint_1
+        %136 = OpLoad %float %135
+        %137 = OpAccessChain %_ptr_Function_float %quad %uint_3
+        %138 = OpLoad %float %137
+        %139 = OpFAdd %float %136 %138
+        %140 = OpFOrdGreaterThan %bool %134 %139
+               OpSelectionMerge %141 None
+               OpBranchConditional %140 %142 %141
+        %142 = OpLabel
+               OpReturnValue %false
+        %141 = OpLabel
+               OpReturnValue %true
+               OpFunctionEnd
+ %match_vf2_ = OpFunction %v4float None %31
+      %pos_0 = OpFunctionParameter %_ptr_Function_v2float
+        %143 = OpLabel
+        %res = OpVariable %_ptr_Function_v4float Function
+        %144 = OpVariable %_ptr_Function_float Function
+        %145 = OpVariable %_ptr_Function_float Function
+          %i = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_v2float Function
+    %param_0 = OpVariable %_ptr_Function_v4float Function
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_8 Function
+%indexable_0 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function
+%indexable_1 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function
+%indexable_2 = OpVariable %_ptr_Function__arr_v4float_uint_16 Function
+        %146 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+        %147 = OpLoad %float %146
+        %148 = OpFOrdLessThan %bool %147 %float_0
+               OpSelectionMerge %149 None
+               OpBranchConditional %148 %150 %151
+        %150 = OpLabel
+               OpStore %144 %float_n1
+               OpBranch %149
+        %151 = OpLabel
+        %152 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+        %153 = OpLoad %float %152
+        %154 = OpFOrdGreaterThanEqual %bool %153 %float_0
+               OpSelectionMerge %155 None
+               OpBranchConditional %154 %156 %157
+        %156 = OpLabel
+        %158 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+        %159 = OpLoad %float %158
+        %160 = OpFOrdGreaterThanEqual %bool %159 %float_0
+        %161 = OpSelect %float %160 %float_0_5 %float_1
+               OpStore %145 %161
+               OpBranch %155
+        %157 = OpLabel
+               OpStore %145 %float_1
+               OpBranch %155
+        %155 = OpLabel
+        %162 = OpLoad %float %145
+        %163 = OpExtInst %float %1 FMin %162 %float_0_5
+               OpStore %144 %163
+               OpBranch %149
+        %149 = OpLabel
+        %164 = OpLoad %float %144
+        %165 = OpExtInst %float %1 FClamp %float_0_5 %float_0_5 %164
+        %166 = OpCompositeConstruct %v4float %165 %float_0_5 %float_1 %float_1
+               OpStore %res %166
+               OpStore %i %int_0
+               OpBranch %167
+        %167 = OpLabel
+               OpLoopMerge %168 %169 None
+               OpBranch %170
+        %170 = OpLabel
+        %171 = OpLoad %int %i
+        %172 = OpSLessThan %bool %171 %int_8
+               OpBranchConditional %172 %173 %168
+        %173 = OpLabel
+        %174 = OpLoad %int %i
+        %175 = OpLoad %v2float %pos_0
+               OpStore %param %175
+               OpStore %indexable %68
+        %176 = OpAccessChain %_ptr_Function_v4float %indexable %174
+        %177 = OpLoad %v4float %176
+               OpStore %param_0 %177
+        %178 = OpFunctionCall %bool %collision_vf2_vf4_ %param %param_0
+               OpSelectionMerge %179 None
+               OpBranchConditional %178 %180 %179
+        %180 = OpLabel
+        %181 = OpLoad %int %i
+               OpStore %indexable_0 %68
+        %182 = OpAccessChain %_ptr_Function_float %indexable_0 %181 %uint_0
+        %183 = OpLoad %float %182
+        %184 = OpConvertFToS %int %183
+        %185 = OpLoad %int %i
+               OpStore %indexable_1 %68
+        %186 = OpAccessChain %_ptr_Function_float %indexable_1 %185 %uint_1
+        %187 = OpLoad %float %186
+        %188 = OpConvertFToS %int %187
+        %189 = OpIMul %int %184 %188
+        %190 = OpLoad %int %i
+        %191 = OpIMul %int %190 %int_9
+        %192 = OpIAdd %int %189 %191
+        %193 = OpIAdd %int %192 %int_11
+        %194 = OpSMod %int %193 %int_16
+               OpStore %indexable_2 %87
+        %195 = OpAccessChain %_ptr_Function_v4float %indexable_2 %194
+        %196 = OpLoad %v4float %195
+               OpStore %res %196
+               OpBranch %179
+        %179 = OpLabel
+               OpBranch %169
+        %169 = OpLabel
+        %197 = OpLoad %int %i
+        %198 = OpIAdd %int %197 %int_1
+               OpStore %i %198
+               OpBranch %167
+        %168 = OpLabel
+        %199 = OpLoad %v4float %res
+               OpReturnValue %199
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-rects-vec4-clamp-conditional-min-mix/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-rects-vec4-clamp-conditional-min-mix/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..69f3fe6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-rects-vec4-clamp-conditional-min-mix/1.spvasm.expected.hlsl
@@ -0,0 +1,119 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_20 : register(b0, space0) {
+  uint4 x_20[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+bool collision_vf2_vf4_(inout float2 pos, inout float4 quad) {
+  const float x_110 = pos.x;
+  const float x_112 = quad.x;
+  if ((x_110 < x_112)) {
+    return false;
+  }
+  const float x_117 = pos.y;
+  const float x_119 = quad.y;
+  if ((x_117 < x_119)) {
+    return false;
+  }
+  const float x_124 = pos.x;
+  const float x_126 = quad.x;
+  const float x_128 = quad.z;
+  if ((x_124 > (x_126 + x_128))) {
+    return false;
+  }
+  const float x_134 = pos.y;
+  const float x_136 = quad.y;
+  const float x_138 = quad.w;
+  if ((x_134 > (x_136 + x_138))) {
+    return false;
+  }
+  return true;
+}
+
+float4 match_vf2_(inout float2 pos_1) {
+  float4 res = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float x_144 = 0.0f;
+  float x_145 = 0.0f;
+  int i = 0;
+  float2 param = float2(0.0f, 0.0f);
+  float4 param_1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 indexable[8] = (float4[8])0;
+  float4 indexable_1[8] = (float4[8])0;
+  float4 indexable_2[8] = (float4[8])0;
+  float4 indexable_3[16] = (float4[16])0;
+  const float x_147 = gl_FragCoord.x;
+  if ((x_147 < 0.0f)) {
+    x_144 = -1.0f;
+  } else {
+    const float x_153 = gl_FragCoord.x;
+    if ((x_153 >= 0.0f)) {
+      const float x_159 = gl_FragCoord.x;
+      x_145 = ((x_159 >= 0.0f) ? 0.5f : 1.0f);
+    } else {
+      x_145 = 1.0f;
+    }
+    x_144 = min(x_145, 0.5f);
+  }
+  res = float4(clamp(0.5f, 0.5f, x_144), 0.5f, 1.0f, 1.0f);
+  i = 0;
+  {
+    for(; (i < 8); i = (i + 1)) {
+      const int x_174 = i;
+      const float2 x_175 = pos_1;
+      param = x_175;
+      const float4 tint_symbol_5[8] = {float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)};
+      indexable = tint_symbol_5;
+      const float4 x_177 = indexable[x_174];
+      param_1 = x_177;
+      const bool x_178 = collision_vf2_vf4_(param, param_1);
+      if (x_178) {
+        const int x_181 = i;
+        const float4 tint_symbol_6[8] = {float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)};
+        indexable_1 = tint_symbol_6;
+        const float x_183 = indexable_1[x_181].x;
+        const int x_185 = i;
+        const float4 tint_symbol_7[8] = {float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)};
+        indexable_2 = tint_symbol_7;
+        const float x_187 = indexable_2[x_185].y;
+        const int x_190 = i;
+        const float4 tint_symbol_8[16] = {float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)};
+        indexable_3 = tint_symbol_8;
+        const float4 x_196 = indexable_3[((((int(x_183) * int(x_187)) + (x_190 * 9)) + 11) % 16)];
+        res = x_196;
+      }
+    }
+  }
+  return res;
+}
+
+void main_1() {
+  float2 lin = float2(0.0f, 0.0f);
+  float2 param_2 = float2(0.0f, 0.0f);
+  const float4 x_98 = gl_FragCoord;
+  const float2 x_101 = asfloat(x_20[0].xy);
+  lin = (float2(x_98.x, x_98.y) / x_101);
+  lin = floor((lin * 32.0f));
+  param_2 = lin;
+  const float4 x_107 = match_vf2_(param_2);
+  x_GLF_color = x_107;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_9 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_9;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-rects-vec4-clamp-conditional-min-mix/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-rects-vec4-clamp-conditional-min-mix/1.spvasm.expected.msl
new file mode 100644
index 0000000..840a67c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-rects-vec4-clamp-conditional-min-mix/1.spvasm.expected.msl
@@ -0,0 +1,136 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  float4 arr[8];
+};
+struct tint_array_wrapper_1 {
+  float4 arr[16];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+bool collision_vf2_vf4_(thread float2* const pos, thread float4* const quad) {
+  float const x_110 = (*(pos)).x;
+  float const x_112 = (*(quad)).x;
+  if ((x_110 < x_112)) {
+    return false;
+  }
+  float const x_117 = (*(pos)).y;
+  float const x_119 = (*(quad)).y;
+  if ((x_117 < x_119)) {
+    return false;
+  }
+  float const x_124 = (*(pos)).x;
+  float const x_126 = (*(quad)).x;
+  float const x_128 = (*(quad)).z;
+  if ((x_124 > (x_126 + x_128))) {
+    return false;
+  }
+  float const x_134 = (*(pos)).y;
+  float const x_136 = (*(quad)).y;
+  float const x_138 = (*(quad)).w;
+  if ((x_134 > (x_136 + x_138))) {
+    return false;
+  }
+  return true;
+}
+
+float4 match_vf2_(thread float2* const pos_1, thread float4* const tint_symbol_9) {
+  float4 res = 0.0f;
+  float x_144 = 0.0f;
+  float x_145 = 0.0f;
+  int i = 0;
+  float2 param = 0.0f;
+  float4 param_1 = 0.0f;
+  tint_array_wrapper indexable = {};
+  tint_array_wrapper indexable_1 = {};
+  tint_array_wrapper indexable_2 = {};
+  tint_array_wrapper_1 indexable_3 = {};
+  float const x_147 = (*(tint_symbol_9)).x;
+  if ((x_147 < 0.0f)) {
+    x_144 = -1.0f;
+  } else {
+    float const x_153 = (*(tint_symbol_9)).x;
+    if ((x_153 >= 0.0f)) {
+      float const x_159 = (*(tint_symbol_9)).x;
+      x_145 = select(1.0f, 0.5f, (x_159 >= 0.0f));
+    } else {
+      x_145 = 1.0f;
+    }
+    float const x_162 = x_145;
+    x_144 = fmin(x_162, 0.5f);
+  }
+  float const x_164 = x_144;
+  res = float4(clamp(0.5f, 0.5f, x_164), 0.5f, 1.0f, 1.0f);
+  i = 0;
+  while (true) {
+    int const x_171 = i;
+    if ((x_171 < 8)) {
+    } else {
+      break;
+    }
+    int const x_174 = i;
+    float2 const x_175 = *(pos_1);
+    param = x_175;
+    tint_array_wrapper const tint_symbol_4 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
+    indexable = tint_symbol_4;
+    float4 const x_177 = indexable.arr[x_174];
+    param_1 = x_177;
+    bool const x_178 = collision_vf2_vf4_(&(param), &(param_1));
+    if (x_178) {
+      int const x_181 = i;
+      tint_array_wrapper const tint_symbol_5 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
+      indexable_1 = tint_symbol_5;
+      float const x_183 = indexable_1.arr[x_181].x;
+      int const x_185 = i;
+      tint_array_wrapper const tint_symbol_6 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
+      indexable_2 = tint_symbol_6;
+      float const x_187 = indexable_2.arr[x_185].y;
+      int const x_190 = i;
+      tint_array_wrapper_1 const tint_symbol_7 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
+      indexable_3 = tint_symbol_7;
+      float4 const x_196 = indexable_3.arr[((((int(x_183) * int(x_187)) + (x_190 * 9)) + 11) % 16)];
+      res = x_196;
+    }
+    {
+      int const x_197 = i;
+      i = (x_197 + 1);
+    }
+  }
+  float4 const x_199 = res;
+  return x_199;
+}
+
+void main_1(constant buf0& x_20, thread float4* const tint_symbol_10, thread float4* const tint_symbol_11) {
+  float2 lin = 0.0f;
+  float2 param_2 = 0.0f;
+  float4 const x_98 = *(tint_symbol_10);
+  float2 const x_101 = x_20.resolution;
+  lin = (float2(x_98.x, x_98.y) / x_101);
+  float2 const x_103 = lin;
+  lin = floor((x_103 * 32.0f));
+  float2 const x_106 = lin;
+  param_2 = x_106;
+  float4 const x_107 = match_vf2_(&(param_2), tint_symbol_10);
+  *(tint_symbol_11) = x_107;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_20 [[buffer(0)]]) {
+  thread float4 tint_symbol_12 = 0.0f;
+  thread float4 tint_symbol_13 = 0.0f;
+  tint_symbol_12 = gl_FragCoord_param;
+  main_1(x_20, &(tint_symbol_12), &(tint_symbol_13));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_13};
+  tint_symbol_2 const tint_symbol_8 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_8;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-rects-vec4-clamp-conditional-min-mix/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-rects-vec4-clamp-conditional-min-mix/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..5d8773e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-rects-vec4-clamp-conditional-min-mix/1.spvasm.expected.spvasm
@@ -0,0 +1,336 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 240
+; Schema: 0
+               OpCapability Shader
+        %125 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_20 "x_20"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %collision_vf2_vf4_ "collision_vf2_vf4_"
+               OpName %pos "pos"
+               OpName %quad "quad"
+               OpName %match_vf2_ "match_vf2_"
+               OpName %pos_1 "pos_1"
+               OpName %res "res"
+               OpName %x_144 "x_144"
+               OpName %x_145 "x_145"
+               OpName %i "i"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %indexable "indexable"
+               OpName %indexable_1 "indexable_1"
+               OpName %indexable_2 "indexable_2"
+               OpName %indexable_3 "indexable_3"
+               OpName %main_1 "main_1"
+               OpName %lin "lin"
+               OpName %param_2 "param_2"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_20 NonWritable
+               OpDecorate %x_20 DescriptorSet 0
+               OpDecorate %x_20 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v4float_uint_8 ArrayStride 16
+               OpDecorate %_arr_v4float_uint_16 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_20 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %bool = OpTypeBool
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+         %15 = OpTypeFunction %bool %_ptr_Function_v2float %_ptr_Function_v4float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+      %false = OpConstantFalse %bool
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+     %uint_3 = OpConstant %uint 3
+       %true = OpConstantTrue %bool
+         %75 = OpTypeFunction %v4float %_ptr_Function_v2float
+         %81 = OpConstantNull %float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %86 = OpConstantNull %int
+         %88 = OpConstantNull %v2float
+     %uint_8 = OpConstant %uint 8
+%_arr_v4float_uint_8 = OpTypeArray %v4float %uint_8
+%_ptr_Function__arr_v4float_uint_8 = OpTypePointer Function %_arr_v4float_uint_8
+         %94 = OpConstantNull %_arr_v4float_uint_8
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+        %101 = OpConstantNull %_arr_v4float_uint_16
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+   %float_n1 = OpConstant %float -1
+  %float_0_5 = OpConstant %float 0.5
+    %float_1 = OpConstant %float 1
+      %int_0 = OpConstant %int 0
+      %int_8 = OpConstant %int 8
+    %float_4 = OpConstant %float 4
+   %float_20 = OpConstant %float 20
+        %145 = OpConstantComposite %v4float %float_4 %float_4 %float_20 %float_4
+        %146 = OpConstantComposite %v4float %float_4 %float_4 %float_4 %float_20
+        %147 = OpConstantComposite %v4float %float_4 %float_20 %float_20 %float_4
+    %float_8 = OpConstant %float 8
+        %149 = OpConstantComposite %v4float %float_20 %float_4 %float_4 %float_8
+    %float_6 = OpConstant %float 6
+    %float_2 = OpConstant %float 2
+        %152 = OpConstantComposite %v4float %float_8 %float_6 %float_4 %float_2
+   %float_12 = OpConstant %float 12
+        %154 = OpConstantComposite %v4float %float_2 %float_12 %float_2 %float_4
+   %float_16 = OpConstant %float 16
+        %156 = OpConstantComposite %v4float %float_16 %float_2 %float_4 %float_4
+   %float_22 = OpConstant %float 22
+        %158 = OpConstantComposite %v4float %float_12 %float_22 %float_4 %float_4
+        %159 = OpConstantComposite %_arr_v4float_uint_8 %145 %146 %147 %149 %152 %154 %156 %158
+        %174 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+        %175 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+        %176 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+        %177 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+        %178 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+        %179 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+        %180 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+        %181 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+        %182 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %183 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+        %184 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+        %185 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+        %186 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+        %187 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+        %188 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+        %189 = OpConstantComposite %_arr_v4float_uint_16 %174 %175 %176 %177 %178 %179 %180 %181 %174 %182 %183 %184 %185 %186 %187 %188
+      %int_9 = OpConstant %int 9
+     %int_11 = OpConstant %int 11
+     %int_16 = OpConstant %int 16
+      %int_1 = OpConstant %int 1
+       %void = OpTypeVoid
+        %206 = OpTypeFunction %void
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+   %float_32 = OpConstant %float 32
+   %main_out = OpTypeStruct %v4float
+        %227 = OpTypeFunction %void %main_out
+%collision_vf2_vf4_ = OpFunction %bool None %15
+        %pos = OpFunctionParameter %_ptr_Function_v2float
+       %quad = OpFunctionParameter %_ptr_Function_v4float
+         %22 = OpLabel
+         %27 = OpAccessChain %_ptr_Function_float %pos %uint_0
+         %28 = OpLoad %float %27
+         %30 = OpAccessChain %_ptr_Function_float %quad %uint_0
+         %31 = OpLoad %float %30
+         %32 = OpFOrdLessThan %bool %28 %31
+               OpSelectionMerge %33 None
+               OpBranchConditional %32 %34 %33
+         %34 = OpLabel
+               OpReturnValue %false
+         %33 = OpLabel
+         %38 = OpAccessChain %_ptr_Function_float %pos %uint_1
+         %39 = OpLoad %float %38
+         %41 = OpAccessChain %_ptr_Function_float %quad %uint_1
+         %42 = OpLoad %float %41
+         %43 = OpFOrdLessThan %bool %39 %42
+               OpSelectionMerge %44 None
+               OpBranchConditional %43 %45 %44
+         %45 = OpLabel
+               OpReturnValue %false
+         %44 = OpLabel
+         %47 = OpAccessChain %_ptr_Function_float %pos %uint_0
+         %48 = OpLoad %float %47
+         %50 = OpAccessChain %_ptr_Function_float %quad %uint_0
+         %51 = OpLoad %float %50
+         %54 = OpAccessChain %_ptr_Function_float %quad %uint_2
+         %55 = OpLoad %float %54
+         %56 = OpFAdd %float %51 %55
+         %57 = OpFOrdGreaterThan %bool %48 %56
+               OpSelectionMerge %58 None
+               OpBranchConditional %57 %59 %58
+         %59 = OpLabel
+               OpReturnValue %false
+         %58 = OpLabel
+         %61 = OpAccessChain %_ptr_Function_float %pos %uint_1
+         %62 = OpLoad %float %61
+         %64 = OpAccessChain %_ptr_Function_float %quad %uint_1
+         %65 = OpLoad %float %64
+         %68 = OpAccessChain %_ptr_Function_float %quad %uint_3
+         %69 = OpLoad %float %68
+         %70 = OpFAdd %float %65 %69
+         %71 = OpFOrdGreaterThan %bool %62 %70
+               OpSelectionMerge %72 None
+               OpBranchConditional %71 %73 %72
+         %73 = OpLabel
+               OpReturnValue %false
+         %72 = OpLabel
+               OpReturnValue %true
+               OpFunctionEnd
+ %match_vf2_ = OpFunction %v4float None %75
+      %pos_1 = OpFunctionParameter %_ptr_Function_v2float
+         %78 = OpLabel
+        %res = OpVariable %_ptr_Function_v4float Function %5
+      %x_144 = OpVariable %_ptr_Function_float Function %81
+      %x_145 = OpVariable %_ptr_Function_float Function %81
+          %i = OpVariable %_ptr_Function_int Function %86
+      %param = OpVariable %_ptr_Function_v2float Function %88
+    %param_1 = OpVariable %_ptr_Function_v4float Function %5
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %94
+%indexable_1 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %94
+%indexable_2 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %94
+%indexable_3 = OpVariable %_ptr_Function__arr_v4float_uint_16 Function %101
+        %103 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+        %104 = OpLoad %float %103
+        %106 = OpFOrdLessThan %bool %104 %float_0
+               OpSelectionMerge %107 None
+               OpBranchConditional %106 %108 %109
+        %108 = OpLabel
+               OpStore %x_144 %float_n1
+               OpBranch %107
+        %109 = OpLabel
+        %111 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+        %112 = OpLoad %float %111
+        %113 = OpFOrdGreaterThanEqual %bool %112 %float_0
+               OpSelectionMerge %114 None
+               OpBranchConditional %113 %115 %116
+        %115 = OpLabel
+        %117 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+        %118 = OpLoad %float %117
+        %120 = OpFOrdGreaterThanEqual %bool %118 %float_0
+        %119 = OpSelect %float %120 %float_0_5 %float_1
+               OpStore %x_145 %119
+               OpBranch %114
+        %116 = OpLabel
+               OpStore %x_145 %float_1
+               OpBranch %114
+        %114 = OpLabel
+        %123 = OpLoad %float %x_145
+        %124 = OpExtInst %float %125 NMin %123 %float_0_5
+               OpStore %x_144 %124
+               OpBranch %107
+        %107 = OpLabel
+        %126 = OpLoad %float %x_144
+        %127 = OpExtInst %float %125 NClamp %float_0_5 %float_0_5 %126
+        %128 = OpCompositeConstruct %v4float %127 %float_0_5 %float_1 %float_1
+               OpStore %res %128
+               OpStore %i %int_0
+               OpBranch %130
+        %130 = OpLabel
+               OpLoopMerge %131 %132 None
+               OpBranch %133
+        %133 = OpLabel
+        %134 = OpLoad %int %i
+        %136 = OpSLessThan %bool %134 %int_8
+               OpSelectionMerge %137 None
+               OpBranchConditional %136 %138 %139
+        %138 = OpLabel
+               OpBranch %137
+        %139 = OpLabel
+               OpBranch %131
+        %137 = OpLabel
+        %140 = OpLoad %int %i
+        %142 = OpLoad %v2float %pos_1
+               OpStore %param %142
+               OpStore %indexable %159
+        %160 = OpAccessChain %_ptr_Function_v4float %indexable %140
+        %161 = OpLoad %v4float %160
+               OpStore %param_1 %161
+        %162 = OpFunctionCall %bool %collision_vf2_vf4_ %param %param_1
+               OpSelectionMerge %165 None
+               OpBranchConditional %162 %166 %165
+        %166 = OpLabel
+        %167 = OpLoad %int %i
+               OpStore %indexable_1 %159
+        %168 = OpAccessChain %_ptr_Function_float %indexable_1 %167 %uint_0
+        %169 = OpLoad %float %168
+        %170 = OpLoad %int %i
+               OpStore %indexable_2 %159
+        %171 = OpAccessChain %_ptr_Function_float %indexable_2 %170 %uint_1
+        %172 = OpLoad %float %171
+        %173 = OpLoad %int %i
+               OpStore %indexable_3 %189
+        %190 = OpConvertFToS %int %169
+        %191 = OpConvertFToS %int %172
+        %192 = OpIMul %int %190 %191
+        %194 = OpIMul %int %173 %int_9
+        %195 = OpIAdd %int %192 %194
+        %197 = OpIAdd %int %195 %int_11
+        %199 = OpSMod %int %197 %int_16
+        %200 = OpAccessChain %_ptr_Function_v4float %indexable_3 %199
+        %201 = OpLoad %v4float %200
+               OpStore %res %201
+               OpBranch %165
+        %165 = OpLabel
+               OpBranch %132
+        %132 = OpLabel
+        %202 = OpLoad %int %i
+        %204 = OpIAdd %int %202 %int_1
+               OpStore %i %204
+               OpBranch %130
+        %131 = OpLabel
+        %205 = OpLoad %v4float %res
+               OpReturnValue %205
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %206
+        %209 = OpLabel
+        %lin = OpVariable %_ptr_Function_v2float Function %88
+    %param_2 = OpVariable %_ptr_Function_v2float Function %88
+        %212 = OpLoad %v4float %gl_FragCoord
+        %214 = OpAccessChain %_ptr_Uniform_v2float %x_20 %uint_0
+        %215 = OpLoad %v2float %214
+        %216 = OpCompositeExtract %float %212 0
+        %217 = OpCompositeExtract %float %212 1
+        %218 = OpCompositeConstruct %v2float %216 %217
+        %219 = OpFDiv %v2float %218 %215
+               OpStore %lin %219
+        %220 = OpLoad %v2float %lin
+        %223 = OpVectorTimesScalar %v2float %220 %float_32
+        %221 = OpExtInst %v2float %125 Floor %223
+               OpStore %lin %221
+        %224 = OpLoad %v2float %lin
+               OpStore %param_2 %224
+        %225 = OpFunctionCall %v4float %match_vf2_ %param_2
+               OpStore %x_GLF_color %225
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %227
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %231 = OpLabel
+        %232 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %232
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %206
+        %234 = OpLabel
+        %235 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %235
+        %236 = OpFunctionCall %void %main_1
+        %238 = OpLoad %v4float %x_GLF_color
+        %239 = OpCompositeConstruct %main_out %238
+        %237 = OpFunctionCall %void %tint_symbol_3 %239
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-rects-vec4-clamp-conditional-min-mix/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-rects-vec4-clamp-conditional-min-mix/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..4b3b3b5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-rects-vec4-clamp-conditional-min-mix/1.spvasm.expected.wgsl
@@ -0,0 +1,126 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_20 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn collision_vf2_vf4_(pos : ptr<function, vec2<f32>>, quad : ptr<function, vec4<f32>>) -> bool {
+  let x_110 : f32 = (*(pos)).x;
+  let x_112 : f32 = (*(quad)).x;
+  if ((x_110 < x_112)) {
+    return false;
+  }
+  let x_117 : f32 = (*(pos)).y;
+  let x_119 : f32 = (*(quad)).y;
+  if ((x_117 < x_119)) {
+    return false;
+  }
+  let x_124 : f32 = (*(pos)).x;
+  let x_126 : f32 = (*(quad)).x;
+  let x_128 : f32 = (*(quad)).z;
+  if ((x_124 > (x_126 + x_128))) {
+    return false;
+  }
+  let x_134 : f32 = (*(pos)).y;
+  let x_136 : f32 = (*(quad)).y;
+  let x_138 : f32 = (*(quad)).w;
+  if ((x_134 > (x_136 + x_138))) {
+    return false;
+  }
+  return true;
+}
+
+fn match_vf2_(pos_1 : ptr<function, vec2<f32>>) -> vec4<f32> {
+  var res : vec4<f32>;
+  var x_144 : f32;
+  var x_145 : f32;
+  var i : i32;
+  var param : vec2<f32>;
+  var param_1 : vec4<f32>;
+  var indexable : array<vec4<f32>, 8>;
+  var indexable_1 : array<vec4<f32>, 8>;
+  var indexable_2 : array<vec4<f32>, 8>;
+  var indexable_3 : array<vec4<f32>, 16>;
+  let x_147 : f32 = gl_FragCoord.x;
+  if ((x_147 < 0.0)) {
+    x_144 = -1.0;
+  } else {
+    let x_153 : f32 = gl_FragCoord.x;
+    if ((x_153 >= 0.0)) {
+      let x_159 : f32 = gl_FragCoord.x;
+      x_145 = select(1.0, 0.5, (x_159 >= 0.0));
+    } else {
+      x_145 = 1.0;
+    }
+    let x_162 : f32 = x_145;
+    x_144 = min(x_162, 0.5);
+  }
+  let x_164 : f32 = x_144;
+  res = vec4<f32>(clamp(0.5, 0.5, x_164), 0.5, 1.0, 1.0);
+  i = 0;
+  loop {
+    let x_171 : i32 = i;
+    if ((x_171 < 8)) {
+    } else {
+      break;
+    }
+    let x_174 : i32 = i;
+    let x_175 : vec2<f32> = *(pos_1);
+    param = x_175;
+    indexable = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+    let x_177 : vec4<f32> = indexable[x_174];
+    param_1 = x_177;
+    let x_178 : bool = collision_vf2_vf4_(&(param), &(param_1));
+    if (x_178) {
+      let x_181 : i32 = i;
+      indexable_1 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+      let x_183 : f32 = indexable_1[x_181].x;
+      let x_185 : i32 = i;
+      indexable_2 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+      let x_187 : f32 = indexable_2[x_185].y;
+      let x_190 : i32 = i;
+      indexable_3 = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+      let x_196 : vec4<f32> = indexable_3[((((i32(x_183) * i32(x_187)) + (x_190 * 9)) + 11) % 16)];
+      res = x_196;
+    }
+
+    continuing {
+      let x_197 : i32 = i;
+      i = (x_197 + 1);
+    }
+  }
+  let x_199 : vec4<f32> = res;
+  return x_199;
+}
+
+fn main_1() {
+  var lin : vec2<f32>;
+  var param_2 : vec2<f32>;
+  let x_98 : vec4<f32> = gl_FragCoord;
+  let x_101 : vec2<f32> = x_20.resolution;
+  lin = (vec2<f32>(x_98.x, x_98.y) / x_101);
+  let x_103 : vec2<f32> = lin;
+  lin = floor((x_103 * 32.0));
+  let x_106 : vec2<f32> = lin;
+  param_2 = x_106;
+  let x_107 : vec4<f32> = match_vf2_(&(param_2));
+  x_GLF_color = x_107;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-rects-vec4-clamp-conditional-min-mix/1.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-rects-vec4-clamp-conditional-min-mix/1.wgsl
new file mode 100644
index 0000000..4b3b3b5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-rects-vec4-clamp-conditional-min-mix/1.wgsl
@@ -0,0 +1,126 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_20 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn collision_vf2_vf4_(pos : ptr<function, vec2<f32>>, quad : ptr<function, vec4<f32>>) -> bool {
+  let x_110 : f32 = (*(pos)).x;
+  let x_112 : f32 = (*(quad)).x;
+  if ((x_110 < x_112)) {
+    return false;
+  }
+  let x_117 : f32 = (*(pos)).y;
+  let x_119 : f32 = (*(quad)).y;
+  if ((x_117 < x_119)) {
+    return false;
+  }
+  let x_124 : f32 = (*(pos)).x;
+  let x_126 : f32 = (*(quad)).x;
+  let x_128 : f32 = (*(quad)).z;
+  if ((x_124 > (x_126 + x_128))) {
+    return false;
+  }
+  let x_134 : f32 = (*(pos)).y;
+  let x_136 : f32 = (*(quad)).y;
+  let x_138 : f32 = (*(quad)).w;
+  if ((x_134 > (x_136 + x_138))) {
+    return false;
+  }
+  return true;
+}
+
+fn match_vf2_(pos_1 : ptr<function, vec2<f32>>) -> vec4<f32> {
+  var res : vec4<f32>;
+  var x_144 : f32;
+  var x_145 : f32;
+  var i : i32;
+  var param : vec2<f32>;
+  var param_1 : vec4<f32>;
+  var indexable : array<vec4<f32>, 8>;
+  var indexable_1 : array<vec4<f32>, 8>;
+  var indexable_2 : array<vec4<f32>, 8>;
+  var indexable_3 : array<vec4<f32>, 16>;
+  let x_147 : f32 = gl_FragCoord.x;
+  if ((x_147 < 0.0)) {
+    x_144 = -1.0;
+  } else {
+    let x_153 : f32 = gl_FragCoord.x;
+    if ((x_153 >= 0.0)) {
+      let x_159 : f32 = gl_FragCoord.x;
+      x_145 = select(1.0, 0.5, (x_159 >= 0.0));
+    } else {
+      x_145 = 1.0;
+    }
+    let x_162 : f32 = x_145;
+    x_144 = min(x_162, 0.5);
+  }
+  let x_164 : f32 = x_144;
+  res = vec4<f32>(clamp(0.5, 0.5, x_164), 0.5, 1.0, 1.0);
+  i = 0;
+  loop {
+    let x_171 : i32 = i;
+    if ((x_171 < 8)) {
+    } else {
+      break;
+    }
+    let x_174 : i32 = i;
+    let x_175 : vec2<f32> = *(pos_1);
+    param = x_175;
+    indexable = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+    let x_177 : vec4<f32> = indexable[x_174];
+    param_1 = x_177;
+    let x_178 : bool = collision_vf2_vf4_(&(param), &(param_1));
+    if (x_178) {
+      let x_181 : i32 = i;
+      indexable_1 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+      let x_183 : f32 = indexable_1[x_181].x;
+      let x_185 : i32 = i;
+      indexable_2 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+      let x_187 : f32 = indexable_2[x_185].y;
+      let x_190 : i32 = i;
+      indexable_3 = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+      let x_196 : vec4<f32> = indexable_3[((((i32(x_183) * i32(x_187)) + (x_190 * 9)) + 11) % 16)];
+      res = x_196;
+    }
+
+    continuing {
+      let x_197 : i32 = i;
+      i = (x_197 + 1);
+    }
+  }
+  let x_199 : vec4<f32> = res;
+  return x_199;
+}
+
+fn main_1() {
+  var lin : vec2<f32>;
+  var param_2 : vec2<f32>;
+  let x_98 : vec4<f32> = gl_FragCoord;
+  let x_101 : vec2<f32> = x_20.resolution;
+  lin = (vec2<f32>(x_98.x, x_98.y) / x_101);
+  let x_103 : vec2<f32> = lin;
+  lin = floor((x_103 * 32.0));
+  let x_106 : vec2<f32> = lin;
+  param_2 = x_106;
+  let x_107 : vec4<f32> = match_vf2_(&(param_2));
+  x_GLF_color = x_107;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-rects-vec4-clamp-conditional-min-mix/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-rects-vec4-clamp-conditional-min-mix/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..69f3fe6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-rects-vec4-clamp-conditional-min-mix/1.wgsl.expected.hlsl
@@ -0,0 +1,119 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_20 : register(b0, space0) {
+  uint4 x_20[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+bool collision_vf2_vf4_(inout float2 pos, inout float4 quad) {
+  const float x_110 = pos.x;
+  const float x_112 = quad.x;
+  if ((x_110 < x_112)) {
+    return false;
+  }
+  const float x_117 = pos.y;
+  const float x_119 = quad.y;
+  if ((x_117 < x_119)) {
+    return false;
+  }
+  const float x_124 = pos.x;
+  const float x_126 = quad.x;
+  const float x_128 = quad.z;
+  if ((x_124 > (x_126 + x_128))) {
+    return false;
+  }
+  const float x_134 = pos.y;
+  const float x_136 = quad.y;
+  const float x_138 = quad.w;
+  if ((x_134 > (x_136 + x_138))) {
+    return false;
+  }
+  return true;
+}
+
+float4 match_vf2_(inout float2 pos_1) {
+  float4 res = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float x_144 = 0.0f;
+  float x_145 = 0.0f;
+  int i = 0;
+  float2 param = float2(0.0f, 0.0f);
+  float4 param_1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 indexable[8] = (float4[8])0;
+  float4 indexable_1[8] = (float4[8])0;
+  float4 indexable_2[8] = (float4[8])0;
+  float4 indexable_3[16] = (float4[16])0;
+  const float x_147 = gl_FragCoord.x;
+  if ((x_147 < 0.0f)) {
+    x_144 = -1.0f;
+  } else {
+    const float x_153 = gl_FragCoord.x;
+    if ((x_153 >= 0.0f)) {
+      const float x_159 = gl_FragCoord.x;
+      x_145 = ((x_159 >= 0.0f) ? 0.5f : 1.0f);
+    } else {
+      x_145 = 1.0f;
+    }
+    x_144 = min(x_145, 0.5f);
+  }
+  res = float4(clamp(0.5f, 0.5f, x_144), 0.5f, 1.0f, 1.0f);
+  i = 0;
+  {
+    for(; (i < 8); i = (i + 1)) {
+      const int x_174 = i;
+      const float2 x_175 = pos_1;
+      param = x_175;
+      const float4 tint_symbol_5[8] = {float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)};
+      indexable = tint_symbol_5;
+      const float4 x_177 = indexable[x_174];
+      param_1 = x_177;
+      const bool x_178 = collision_vf2_vf4_(param, param_1);
+      if (x_178) {
+        const int x_181 = i;
+        const float4 tint_symbol_6[8] = {float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)};
+        indexable_1 = tint_symbol_6;
+        const float x_183 = indexable_1[x_181].x;
+        const int x_185 = i;
+        const float4 tint_symbol_7[8] = {float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)};
+        indexable_2 = tint_symbol_7;
+        const float x_187 = indexable_2[x_185].y;
+        const int x_190 = i;
+        const float4 tint_symbol_8[16] = {float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)};
+        indexable_3 = tint_symbol_8;
+        const float4 x_196 = indexable_3[((((int(x_183) * int(x_187)) + (x_190 * 9)) + 11) % 16)];
+        res = x_196;
+      }
+    }
+  }
+  return res;
+}
+
+void main_1() {
+  float2 lin = float2(0.0f, 0.0f);
+  float2 param_2 = float2(0.0f, 0.0f);
+  const float4 x_98 = gl_FragCoord;
+  const float2 x_101 = asfloat(x_20[0].xy);
+  lin = (float2(x_98.x, x_98.y) / x_101);
+  lin = floor((lin * 32.0f));
+  param_2 = lin;
+  const float4 x_107 = match_vf2_(param_2);
+  x_GLF_color = x_107;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_9 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_9;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-rects-vec4-clamp-conditional-min-mix/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-rects-vec4-clamp-conditional-min-mix/1.wgsl.expected.msl
new file mode 100644
index 0000000..840a67c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-rects-vec4-clamp-conditional-min-mix/1.wgsl.expected.msl
@@ -0,0 +1,136 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct tint_array_wrapper {
+  float4 arr[8];
+};
+struct tint_array_wrapper_1 {
+  float4 arr[16];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+bool collision_vf2_vf4_(thread float2* const pos, thread float4* const quad) {
+  float const x_110 = (*(pos)).x;
+  float const x_112 = (*(quad)).x;
+  if ((x_110 < x_112)) {
+    return false;
+  }
+  float const x_117 = (*(pos)).y;
+  float const x_119 = (*(quad)).y;
+  if ((x_117 < x_119)) {
+    return false;
+  }
+  float const x_124 = (*(pos)).x;
+  float const x_126 = (*(quad)).x;
+  float const x_128 = (*(quad)).z;
+  if ((x_124 > (x_126 + x_128))) {
+    return false;
+  }
+  float const x_134 = (*(pos)).y;
+  float const x_136 = (*(quad)).y;
+  float const x_138 = (*(quad)).w;
+  if ((x_134 > (x_136 + x_138))) {
+    return false;
+  }
+  return true;
+}
+
+float4 match_vf2_(thread float2* const pos_1, thread float4* const tint_symbol_9) {
+  float4 res = 0.0f;
+  float x_144 = 0.0f;
+  float x_145 = 0.0f;
+  int i = 0;
+  float2 param = 0.0f;
+  float4 param_1 = 0.0f;
+  tint_array_wrapper indexable = {};
+  tint_array_wrapper indexable_1 = {};
+  tint_array_wrapper indexable_2 = {};
+  tint_array_wrapper_1 indexable_3 = {};
+  float const x_147 = (*(tint_symbol_9)).x;
+  if ((x_147 < 0.0f)) {
+    x_144 = -1.0f;
+  } else {
+    float const x_153 = (*(tint_symbol_9)).x;
+    if ((x_153 >= 0.0f)) {
+      float const x_159 = (*(tint_symbol_9)).x;
+      x_145 = select(1.0f, 0.5f, (x_159 >= 0.0f));
+    } else {
+      x_145 = 1.0f;
+    }
+    float const x_162 = x_145;
+    x_144 = fmin(x_162, 0.5f);
+  }
+  float const x_164 = x_144;
+  res = float4(clamp(0.5f, 0.5f, x_164), 0.5f, 1.0f, 1.0f);
+  i = 0;
+  while (true) {
+    int const x_171 = i;
+    if ((x_171 < 8)) {
+    } else {
+      break;
+    }
+    int const x_174 = i;
+    float2 const x_175 = *(pos_1);
+    param = x_175;
+    tint_array_wrapper const tint_symbol_4 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
+    indexable = tint_symbol_4;
+    float4 const x_177 = indexable.arr[x_174];
+    param_1 = x_177;
+    bool const x_178 = collision_vf2_vf4_(&(param), &(param_1));
+    if (x_178) {
+      int const x_181 = i;
+      tint_array_wrapper const tint_symbol_5 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
+      indexable_1 = tint_symbol_5;
+      float const x_183 = indexable_1.arr[x_181].x;
+      int const x_185 = i;
+      tint_array_wrapper const tint_symbol_6 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
+      indexable_2 = tint_symbol_6;
+      float const x_187 = indexable_2.arr[x_185].y;
+      int const x_190 = i;
+      tint_array_wrapper_1 const tint_symbol_7 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
+      indexable_3 = tint_symbol_7;
+      float4 const x_196 = indexable_3.arr[((((int(x_183) * int(x_187)) + (x_190 * 9)) + 11) % 16)];
+      res = x_196;
+    }
+    {
+      int const x_197 = i;
+      i = (x_197 + 1);
+    }
+  }
+  float4 const x_199 = res;
+  return x_199;
+}
+
+void main_1(constant buf0& x_20, thread float4* const tint_symbol_10, thread float4* const tint_symbol_11) {
+  float2 lin = 0.0f;
+  float2 param_2 = 0.0f;
+  float4 const x_98 = *(tint_symbol_10);
+  float2 const x_101 = x_20.resolution;
+  lin = (float2(x_98.x, x_98.y) / x_101);
+  float2 const x_103 = lin;
+  lin = floor((x_103 * 32.0f));
+  float2 const x_106 = lin;
+  param_2 = x_106;
+  float4 const x_107 = match_vf2_(&(param_2), tint_symbol_10);
+  *(tint_symbol_11) = x_107;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_20 [[buffer(0)]]) {
+  thread float4 tint_symbol_12 = 0.0f;
+  thread float4 tint_symbol_13 = 0.0f;
+  tint_symbol_12 = gl_FragCoord_param;
+  main_1(x_20, &(tint_symbol_12), &(tint_symbol_13));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_13};
+  tint_symbol_2 const tint_symbol_8 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_8;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-rects-vec4-clamp-conditional-min-mix/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-rects-vec4-clamp-conditional-min-mix/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..5d8773e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-rects-vec4-clamp-conditional-min-mix/1.wgsl.expected.spvasm
@@ -0,0 +1,336 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 240
+; Schema: 0
+               OpCapability Shader
+        %125 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_20 "x_20"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %collision_vf2_vf4_ "collision_vf2_vf4_"
+               OpName %pos "pos"
+               OpName %quad "quad"
+               OpName %match_vf2_ "match_vf2_"
+               OpName %pos_1 "pos_1"
+               OpName %res "res"
+               OpName %x_144 "x_144"
+               OpName %x_145 "x_145"
+               OpName %i "i"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %indexable "indexable"
+               OpName %indexable_1 "indexable_1"
+               OpName %indexable_2 "indexable_2"
+               OpName %indexable_3 "indexable_3"
+               OpName %main_1 "main_1"
+               OpName %lin "lin"
+               OpName %param_2 "param_2"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_20 NonWritable
+               OpDecorate %x_20 DescriptorSet 0
+               OpDecorate %x_20 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_v4float_uint_8 ArrayStride 16
+               OpDecorate %_arr_v4float_uint_16 ArrayStride 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_20 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %bool = OpTypeBool
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+         %15 = OpTypeFunction %bool %_ptr_Function_v2float %_ptr_Function_v4float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+      %false = OpConstantFalse %bool
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+     %uint_3 = OpConstant %uint 3
+       %true = OpConstantTrue %bool
+         %75 = OpTypeFunction %v4float %_ptr_Function_v2float
+         %81 = OpConstantNull %float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %86 = OpConstantNull %int
+         %88 = OpConstantNull %v2float
+     %uint_8 = OpConstant %uint 8
+%_arr_v4float_uint_8 = OpTypeArray %v4float %uint_8
+%_ptr_Function__arr_v4float_uint_8 = OpTypePointer Function %_arr_v4float_uint_8
+         %94 = OpConstantNull %_arr_v4float_uint_8
+    %uint_16 = OpConstant %uint 16
+%_arr_v4float_uint_16 = OpTypeArray %v4float %uint_16
+%_ptr_Function__arr_v4float_uint_16 = OpTypePointer Function %_arr_v4float_uint_16
+        %101 = OpConstantNull %_arr_v4float_uint_16
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_0 = OpConstant %float 0
+   %float_n1 = OpConstant %float -1
+  %float_0_5 = OpConstant %float 0.5
+    %float_1 = OpConstant %float 1
+      %int_0 = OpConstant %int 0
+      %int_8 = OpConstant %int 8
+    %float_4 = OpConstant %float 4
+   %float_20 = OpConstant %float 20
+        %145 = OpConstantComposite %v4float %float_4 %float_4 %float_20 %float_4
+        %146 = OpConstantComposite %v4float %float_4 %float_4 %float_4 %float_20
+        %147 = OpConstantComposite %v4float %float_4 %float_20 %float_20 %float_4
+    %float_8 = OpConstant %float 8
+        %149 = OpConstantComposite %v4float %float_20 %float_4 %float_4 %float_8
+    %float_6 = OpConstant %float 6
+    %float_2 = OpConstant %float 2
+        %152 = OpConstantComposite %v4float %float_8 %float_6 %float_4 %float_2
+   %float_12 = OpConstant %float 12
+        %154 = OpConstantComposite %v4float %float_2 %float_12 %float_2 %float_4
+   %float_16 = OpConstant %float 16
+        %156 = OpConstantComposite %v4float %float_16 %float_2 %float_4 %float_4
+   %float_22 = OpConstant %float 22
+        %158 = OpConstantComposite %v4float %float_12 %float_22 %float_4 %float_4
+        %159 = OpConstantComposite %_arr_v4float_uint_8 %145 %146 %147 %149 %152 %154 %156 %158
+        %174 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+        %175 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0 %float_1
+        %176 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0 %float_1
+        %177 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0 %float_1
+        %178 = OpConstantComposite %v4float %float_0 %float_0 %float_0_5 %float_1
+        %179 = OpConstantComposite %v4float %float_0_5 %float_0 %float_0_5 %float_1
+        %180 = OpConstantComposite %v4float %float_0 %float_0_5 %float_0_5 %float_1
+        %181 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
+        %182 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %183 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
+        %184 = OpConstantComposite %v4float %float_1 %float_1 %float_0 %float_1
+        %185 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_1
+        %186 = OpConstantComposite %v4float %float_1 %float_0 %float_1 %float_1
+        %187 = OpConstantComposite %v4float %float_0 %float_1 %float_1 %float_1
+        %188 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+        %189 = OpConstantComposite %_arr_v4float_uint_16 %174 %175 %176 %177 %178 %179 %180 %181 %174 %182 %183 %184 %185 %186 %187 %188
+      %int_9 = OpConstant %int 9
+     %int_11 = OpConstant %int 11
+     %int_16 = OpConstant %int 16
+      %int_1 = OpConstant %int 1
+       %void = OpTypeVoid
+        %206 = OpTypeFunction %void
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+   %float_32 = OpConstant %float 32
+   %main_out = OpTypeStruct %v4float
+        %227 = OpTypeFunction %void %main_out
+%collision_vf2_vf4_ = OpFunction %bool None %15
+        %pos = OpFunctionParameter %_ptr_Function_v2float
+       %quad = OpFunctionParameter %_ptr_Function_v4float
+         %22 = OpLabel
+         %27 = OpAccessChain %_ptr_Function_float %pos %uint_0
+         %28 = OpLoad %float %27
+         %30 = OpAccessChain %_ptr_Function_float %quad %uint_0
+         %31 = OpLoad %float %30
+         %32 = OpFOrdLessThan %bool %28 %31
+               OpSelectionMerge %33 None
+               OpBranchConditional %32 %34 %33
+         %34 = OpLabel
+               OpReturnValue %false
+         %33 = OpLabel
+         %38 = OpAccessChain %_ptr_Function_float %pos %uint_1
+         %39 = OpLoad %float %38
+         %41 = OpAccessChain %_ptr_Function_float %quad %uint_1
+         %42 = OpLoad %float %41
+         %43 = OpFOrdLessThan %bool %39 %42
+               OpSelectionMerge %44 None
+               OpBranchConditional %43 %45 %44
+         %45 = OpLabel
+               OpReturnValue %false
+         %44 = OpLabel
+         %47 = OpAccessChain %_ptr_Function_float %pos %uint_0
+         %48 = OpLoad %float %47
+         %50 = OpAccessChain %_ptr_Function_float %quad %uint_0
+         %51 = OpLoad %float %50
+         %54 = OpAccessChain %_ptr_Function_float %quad %uint_2
+         %55 = OpLoad %float %54
+         %56 = OpFAdd %float %51 %55
+         %57 = OpFOrdGreaterThan %bool %48 %56
+               OpSelectionMerge %58 None
+               OpBranchConditional %57 %59 %58
+         %59 = OpLabel
+               OpReturnValue %false
+         %58 = OpLabel
+         %61 = OpAccessChain %_ptr_Function_float %pos %uint_1
+         %62 = OpLoad %float %61
+         %64 = OpAccessChain %_ptr_Function_float %quad %uint_1
+         %65 = OpLoad %float %64
+         %68 = OpAccessChain %_ptr_Function_float %quad %uint_3
+         %69 = OpLoad %float %68
+         %70 = OpFAdd %float %65 %69
+         %71 = OpFOrdGreaterThan %bool %62 %70
+               OpSelectionMerge %72 None
+               OpBranchConditional %71 %73 %72
+         %73 = OpLabel
+               OpReturnValue %false
+         %72 = OpLabel
+               OpReturnValue %true
+               OpFunctionEnd
+ %match_vf2_ = OpFunction %v4float None %75
+      %pos_1 = OpFunctionParameter %_ptr_Function_v2float
+         %78 = OpLabel
+        %res = OpVariable %_ptr_Function_v4float Function %5
+      %x_144 = OpVariable %_ptr_Function_float Function %81
+      %x_145 = OpVariable %_ptr_Function_float Function %81
+          %i = OpVariable %_ptr_Function_int Function %86
+      %param = OpVariable %_ptr_Function_v2float Function %88
+    %param_1 = OpVariable %_ptr_Function_v4float Function %5
+  %indexable = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %94
+%indexable_1 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %94
+%indexable_2 = OpVariable %_ptr_Function__arr_v4float_uint_8 Function %94
+%indexable_3 = OpVariable %_ptr_Function__arr_v4float_uint_16 Function %101
+        %103 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+        %104 = OpLoad %float %103
+        %106 = OpFOrdLessThan %bool %104 %float_0
+               OpSelectionMerge %107 None
+               OpBranchConditional %106 %108 %109
+        %108 = OpLabel
+               OpStore %x_144 %float_n1
+               OpBranch %107
+        %109 = OpLabel
+        %111 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+        %112 = OpLoad %float %111
+        %113 = OpFOrdGreaterThanEqual %bool %112 %float_0
+               OpSelectionMerge %114 None
+               OpBranchConditional %113 %115 %116
+        %115 = OpLabel
+        %117 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+        %118 = OpLoad %float %117
+        %120 = OpFOrdGreaterThanEqual %bool %118 %float_0
+        %119 = OpSelect %float %120 %float_0_5 %float_1
+               OpStore %x_145 %119
+               OpBranch %114
+        %116 = OpLabel
+               OpStore %x_145 %float_1
+               OpBranch %114
+        %114 = OpLabel
+        %123 = OpLoad %float %x_145
+        %124 = OpExtInst %float %125 NMin %123 %float_0_5
+               OpStore %x_144 %124
+               OpBranch %107
+        %107 = OpLabel
+        %126 = OpLoad %float %x_144
+        %127 = OpExtInst %float %125 NClamp %float_0_5 %float_0_5 %126
+        %128 = OpCompositeConstruct %v4float %127 %float_0_5 %float_1 %float_1
+               OpStore %res %128
+               OpStore %i %int_0
+               OpBranch %130
+        %130 = OpLabel
+               OpLoopMerge %131 %132 None
+               OpBranch %133
+        %133 = OpLabel
+        %134 = OpLoad %int %i
+        %136 = OpSLessThan %bool %134 %int_8
+               OpSelectionMerge %137 None
+               OpBranchConditional %136 %138 %139
+        %138 = OpLabel
+               OpBranch %137
+        %139 = OpLabel
+               OpBranch %131
+        %137 = OpLabel
+        %140 = OpLoad %int %i
+        %142 = OpLoad %v2float %pos_1
+               OpStore %param %142
+               OpStore %indexable %159
+        %160 = OpAccessChain %_ptr_Function_v4float %indexable %140
+        %161 = OpLoad %v4float %160
+               OpStore %param_1 %161
+        %162 = OpFunctionCall %bool %collision_vf2_vf4_ %param %param_1
+               OpSelectionMerge %165 None
+               OpBranchConditional %162 %166 %165
+        %166 = OpLabel
+        %167 = OpLoad %int %i
+               OpStore %indexable_1 %159
+        %168 = OpAccessChain %_ptr_Function_float %indexable_1 %167 %uint_0
+        %169 = OpLoad %float %168
+        %170 = OpLoad %int %i
+               OpStore %indexable_2 %159
+        %171 = OpAccessChain %_ptr_Function_float %indexable_2 %170 %uint_1
+        %172 = OpLoad %float %171
+        %173 = OpLoad %int %i
+               OpStore %indexable_3 %189
+        %190 = OpConvertFToS %int %169
+        %191 = OpConvertFToS %int %172
+        %192 = OpIMul %int %190 %191
+        %194 = OpIMul %int %173 %int_9
+        %195 = OpIAdd %int %192 %194
+        %197 = OpIAdd %int %195 %int_11
+        %199 = OpSMod %int %197 %int_16
+        %200 = OpAccessChain %_ptr_Function_v4float %indexable_3 %199
+        %201 = OpLoad %v4float %200
+               OpStore %res %201
+               OpBranch %165
+        %165 = OpLabel
+               OpBranch %132
+        %132 = OpLabel
+        %202 = OpLoad %int %i
+        %204 = OpIAdd %int %202 %int_1
+               OpStore %i %204
+               OpBranch %130
+        %131 = OpLabel
+        %205 = OpLoad %v4float %res
+               OpReturnValue %205
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %206
+        %209 = OpLabel
+        %lin = OpVariable %_ptr_Function_v2float Function %88
+    %param_2 = OpVariable %_ptr_Function_v2float Function %88
+        %212 = OpLoad %v4float %gl_FragCoord
+        %214 = OpAccessChain %_ptr_Uniform_v2float %x_20 %uint_0
+        %215 = OpLoad %v2float %214
+        %216 = OpCompositeExtract %float %212 0
+        %217 = OpCompositeExtract %float %212 1
+        %218 = OpCompositeConstruct %v2float %216 %217
+        %219 = OpFDiv %v2float %218 %215
+               OpStore %lin %219
+        %220 = OpLoad %v2float %lin
+        %223 = OpVectorTimesScalar %v2float %220 %float_32
+        %221 = OpExtInst %v2float %125 Floor %223
+               OpStore %lin %221
+        %224 = OpLoad %v2float %lin
+               OpStore %param_2 %224
+        %225 = OpFunctionCall %v4float %match_vf2_ %param_2
+               OpStore %x_GLF_color %225
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %227
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %231 = OpLabel
+        %232 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %232
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %206
+        %234 = OpLabel
+        %235 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %235
+        %236 = OpFunctionCall %void %main_1
+        %238 = OpLoad %v4float %x_GLF_color
+        %239 = OpCompositeConstruct %main_out %238
+        %237 = OpFunctionCall %void %tint_symbol_3 %239
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-rects-vec4-clamp-conditional-min-mix/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-rects-vec4-clamp-conditional-min-mix/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..4b3b3b5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-rects-vec4-clamp-conditional-min-mix/1.wgsl.expected.wgsl
@@ -0,0 +1,126 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_20 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn collision_vf2_vf4_(pos : ptr<function, vec2<f32>>, quad : ptr<function, vec4<f32>>) -> bool {
+  let x_110 : f32 = (*(pos)).x;
+  let x_112 : f32 = (*(quad)).x;
+  if ((x_110 < x_112)) {
+    return false;
+  }
+  let x_117 : f32 = (*(pos)).y;
+  let x_119 : f32 = (*(quad)).y;
+  if ((x_117 < x_119)) {
+    return false;
+  }
+  let x_124 : f32 = (*(pos)).x;
+  let x_126 : f32 = (*(quad)).x;
+  let x_128 : f32 = (*(quad)).z;
+  if ((x_124 > (x_126 + x_128))) {
+    return false;
+  }
+  let x_134 : f32 = (*(pos)).y;
+  let x_136 : f32 = (*(quad)).y;
+  let x_138 : f32 = (*(quad)).w;
+  if ((x_134 > (x_136 + x_138))) {
+    return false;
+  }
+  return true;
+}
+
+fn match_vf2_(pos_1 : ptr<function, vec2<f32>>) -> vec4<f32> {
+  var res : vec4<f32>;
+  var x_144 : f32;
+  var x_145 : f32;
+  var i : i32;
+  var param : vec2<f32>;
+  var param_1 : vec4<f32>;
+  var indexable : array<vec4<f32>, 8>;
+  var indexable_1 : array<vec4<f32>, 8>;
+  var indexable_2 : array<vec4<f32>, 8>;
+  var indexable_3 : array<vec4<f32>, 16>;
+  let x_147 : f32 = gl_FragCoord.x;
+  if ((x_147 < 0.0)) {
+    x_144 = -1.0;
+  } else {
+    let x_153 : f32 = gl_FragCoord.x;
+    if ((x_153 >= 0.0)) {
+      let x_159 : f32 = gl_FragCoord.x;
+      x_145 = select(1.0, 0.5, (x_159 >= 0.0));
+    } else {
+      x_145 = 1.0;
+    }
+    let x_162 : f32 = x_145;
+    x_144 = min(x_162, 0.5);
+  }
+  let x_164 : f32 = x_144;
+  res = vec4<f32>(clamp(0.5, 0.5, x_164), 0.5, 1.0, 1.0);
+  i = 0;
+  loop {
+    let x_171 : i32 = i;
+    if ((x_171 < 8)) {
+    } else {
+      break;
+    }
+    let x_174 : i32 = i;
+    let x_175 : vec2<f32> = *(pos_1);
+    param = x_175;
+    indexable = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+    let x_177 : vec4<f32> = indexable[x_174];
+    param_1 = x_177;
+    let x_178 : bool = collision_vf2_vf4_(&(param), &(param_1));
+    if (x_178) {
+      let x_181 : i32 = i;
+      indexable_1 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+      let x_183 : f32 = indexable_1[x_181].x;
+      let x_185 : i32 = i;
+      indexable_2 = array<vec4<f32>, 8>(vec4<f32>(4.0, 4.0, 20.0, 4.0), vec4<f32>(4.0, 4.0, 4.0, 20.0), vec4<f32>(4.0, 20.0, 20.0, 4.0), vec4<f32>(20.0, 4.0, 4.0, 8.0), vec4<f32>(8.0, 6.0, 4.0, 2.0), vec4<f32>(2.0, 12.0, 2.0, 4.0), vec4<f32>(16.0, 2.0, 4.0, 4.0), vec4<f32>(12.0, 22.0, 4.0, 4.0));
+      let x_187 : f32 = indexable_2[x_185].y;
+      let x_190 : i32 = i;
+      indexable_3 = array<vec4<f32>, 16>(vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(0.5, 0.0, 0.0, 1.0), vec4<f32>(0.0, 0.5, 0.0, 1.0), vec4<f32>(0.5, 0.5, 0.0, 1.0), vec4<f32>(0.0, 0.0, 0.5, 1.0), vec4<f32>(0.5, 0.0, 0.5, 1.0), vec4<f32>(0.0, 0.5, 0.5, 1.0), vec4<f32>(0.5, 0.5, 0.5, 1.0), vec4<f32>(0.0, 0.0, 0.0, 1.0), vec4<f32>(1.0, 0.0, 0.0, 1.0), vec4<f32>(0.0, 1.0, 0.0, 1.0), vec4<f32>(1.0, 1.0, 0.0, 1.0), vec4<f32>(0.0, 0.0, 1.0, 1.0), vec4<f32>(1.0, 0.0, 1.0, 1.0), vec4<f32>(0.0, 1.0, 1.0, 1.0), vec4<f32>(1.0, 1.0, 1.0, 1.0));
+      let x_196 : vec4<f32> = indexable_3[((((i32(x_183) * i32(x_187)) + (x_190 * 9)) + 11) % 16)];
+      res = x_196;
+    }
+
+    continuing {
+      let x_197 : i32 = i;
+      i = (x_197 + 1);
+    }
+  }
+  let x_199 : vec4<f32> = res;
+  return x_199;
+}
+
+fn main_1() {
+  var lin : vec2<f32>;
+  var param_2 : vec2<f32>;
+  let x_98 : vec4<f32> = gl_FragCoord;
+  let x_101 : vec2<f32> = x_20.resolution;
+  lin = (vec2<f32>(x_98.x, x_98.y) / x_101);
+  let x_103 : vec2<f32> = lin;
+  lin = floor((x_103 * 32.0));
+  let x_106 : vec2<f32> = lin;
+  param_2 = x_106;
+  let x_107 : vec4<f32> = match_vf2_(&(param_2));
+  x_GLF_color = x_107;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.spvasm
new file mode 100644
index 0000000..b885c18
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.spvasm
@@ -0,0 +1,259 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %cross2d_vf2_vf2_ "cross2d(vf2;vf2;"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %pointInTriangle_vf2_vf2_vf2_vf2_ "pointInTriangle(vf2;vf2;vf2;vf2;"
+               OpName %p "p"
+               OpName %a_0 "a"
+               OpName %b_0 "b"
+               OpName %c "c"
+               OpName %pab "pab"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %pbc "pbc"
+               OpName %param_1 "param"
+               OpName %param_2 "param"
+               OpName %pca "pca"
+               OpName %param_3 "param"
+               OpName %param_4 "param"
+               OpName %pos "pos"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %param_5 "param"
+               OpName %param_6 "param"
+               OpName %param_7 "param"
+               OpName %param_8 "param"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %34 = OpTypeFunction %float %_ptr_Function_v2float %_ptr_Function_v2float
+        %int = OpTypeInt 32 1
+         %36 = OpTypeFunction %int %_ptr_Function_v2float %_ptr_Function_v2float %_ptr_Function_v2float %_ptr_Function_v2float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+%float_0_699999988 = OpConstant %float 0.699999988
+%float_0_300000012 = OpConstant %float 0.300000012
+         %51 = OpConstantComposite %v2float %float_0_699999988 %float_0_300000012
+  %float_0_5 = OpConstant %float 0.5
+%float_0_899999976 = OpConstant %float 0.899999976
+         %54 = OpConstantComposite %v2float %float_0_5 %float_0_899999976
+%float_0_100000001 = OpConstant %float 0.100000001
+%float_0_400000006 = OpConstant %float 0.400000006
+         %57 = OpConstantComposite %v2float %float_0_100000001 %float_0_400000006
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+         %60 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %61 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+%_ptr_Function_int = OpTypePointer Function %int
+      %false = OpConstantFalse %bool
+%_ptr_Function_bool = OpTypePointer Function %bool
+       %true = OpConstantTrue %bool
+       %main = OpFunction %void None %30
+         %66 = OpLabel
+        %pos = OpVariable %_ptr_Function_v2float Function
+    %param_5 = OpVariable %_ptr_Function_v2float Function
+    %param_6 = OpVariable %_ptr_Function_v2float Function
+    %param_7 = OpVariable %_ptr_Function_v2float Function
+    %param_8 = OpVariable %_ptr_Function_v2float Function
+         %67 = OpLoad %v4float %gl_FragCoord
+         %68 = OpVectorShuffle %v2float %67 %67 0 1
+         %69 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+         %70 = OpLoad %v2float %69
+         %71 = OpFDiv %v2float %68 %70
+               OpStore %pos %71
+               OpStore %param_5 %71
+               OpStore %param_6 %51
+               OpStore %param_7 %54
+               OpStore %param_8 %57
+         %72 = OpFunctionCall %int %pointInTriangle_vf2_vf2_vf2_vf2_ %param_5 %param_6 %param_7 %param_8
+         %73 = OpIEqual %bool %72 %int_1
+               OpSelectionMerge %74 None
+               OpBranchConditional %73 %75 %76
+         %75 = OpLabel
+               OpStore %_GLF_color %60
+               OpBranch %74
+         %76 = OpLabel
+               OpStore %_GLF_color %61
+               OpBranch %74
+         %74 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%cross2d_vf2_vf2_ = OpFunction %float None %34
+          %a = OpFunctionParameter %_ptr_Function_v2float
+          %b = OpFunctionParameter %_ptr_Function_v2float
+         %77 = OpLabel
+         %78 = OpAccessChain %_ptr_Function_float %a %uint_0
+         %79 = OpLoad %float %78
+         %80 = OpAccessChain %_ptr_Function_float %b %uint_1
+         %81 = OpLoad %float %80
+         %82 = OpFMul %float %79 %81
+         %83 = OpAccessChain %_ptr_Function_float %b %uint_0
+         %84 = OpLoad %float %83
+         %85 = OpAccessChain %_ptr_Function_float %a %uint_1
+         %86 = OpLoad %float %85
+         %87 = OpFMul %float %84 %86
+         %88 = OpFSub %float %82 %87
+               OpReturnValue %88
+               OpFunctionEnd
+%pointInTriangle_vf2_vf2_vf2_vf2_ = OpFunction %int None %36
+          %p = OpFunctionParameter %_ptr_Function_v2float
+        %a_0 = OpFunctionParameter %_ptr_Function_v2float
+        %b_0 = OpFunctionParameter %_ptr_Function_v2float
+          %c = OpFunctionParameter %_ptr_Function_v2float
+         %89 = OpLabel
+         %90 = OpVariable %_ptr_Function_bool Function %false
+         %91 = OpVariable %_ptr_Function_int Function
+        %pab = OpVariable %_ptr_Function_float Function
+      %param = OpVariable %_ptr_Function_v2float Function
+    %param_0 = OpVariable %_ptr_Function_v2float Function
+        %pbc = OpVariable %_ptr_Function_float Function
+    %param_1 = OpVariable %_ptr_Function_v2float Function
+    %param_2 = OpVariable %_ptr_Function_v2float Function
+        %pca = OpVariable %_ptr_Function_float Function
+    %param_3 = OpVariable %_ptr_Function_v2float Function
+    %param_4 = OpVariable %_ptr_Function_v2float Function
+               OpSelectionMerge %92 None
+               OpSwitch %uint_0 %93
+         %93 = OpLabel
+         %94 = OpAccessChain %_ptr_Function_float %p %uint_0
+         %95 = OpLoad %float %94
+         %96 = OpAccessChain %_ptr_Function_float %a_0 %uint_0
+         %97 = OpLoad %float %96
+         %98 = OpFSub %float %95 %97
+         %99 = OpAccessChain %_ptr_Function_float %p %uint_1
+        %100 = OpLoad %float %99
+        %101 = OpAccessChain %_ptr_Function_float %a_0 %uint_1
+        %102 = OpLoad %float %101
+        %103 = OpFSub %float %100 %102
+        %104 = OpCompositeConstruct %v2float %98 %103
+        %105 = OpAccessChain %_ptr_Function_float %b_0 %uint_0
+        %106 = OpLoad %float %105
+        %107 = OpLoad %float %96
+        %108 = OpFSub %float %106 %107
+        %109 = OpAccessChain %_ptr_Function_float %b_0 %uint_1
+        %110 = OpLoad %float %109
+        %111 = OpLoad %float %101
+        %112 = OpFSub %float %110 %111
+        %113 = OpCompositeConstruct %v2float %108 %112
+               OpStore %param %104
+               OpStore %param_0 %113
+        %114 = OpFunctionCall %float %cross2d_vf2_vf2_ %param %param_0
+               OpStore %pab %114
+        %115 = OpLoad %float %94
+        %116 = OpLoad %float %105
+        %117 = OpFSub %float %115 %116
+        %118 = OpLoad %float %99
+        %119 = OpLoad %float %109
+        %120 = OpFSub %float %118 %119
+        %121 = OpCompositeConstruct %v2float %117 %120
+        %122 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %123 = OpLoad %float %122
+        %124 = OpLoad %float %105
+        %125 = OpFSub %float %123 %124
+        %126 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %127 = OpLoad %float %126
+        %128 = OpLoad %float %109
+        %129 = OpFSub %float %127 %128
+        %130 = OpCompositeConstruct %v2float %125 %129
+               OpStore %param_1 %121
+               OpStore %param_2 %130
+        %131 = OpFunctionCall %float %cross2d_vf2_vf2_ %param_1 %param_2
+               OpStore %pbc %131
+        %132 = OpFOrdLessThan %bool %114 %float_0
+        %133 = OpFOrdLessThan %bool %131 %float_0
+        %134 = OpLogicalAnd %bool %132 %133
+        %135 = OpLogicalNot %bool %134
+               OpSelectionMerge %136 None
+               OpBranchConditional %135 %137 %136
+        %137 = OpLabel
+        %138 = OpFOrdGreaterThanEqual %bool %114 %float_0
+        %139 = OpFOrdGreaterThanEqual %bool %131 %float_0
+        %140 = OpLogicalAnd %bool %138 %139
+               OpBranch %136
+        %136 = OpLabel
+        %141 = OpPhi %bool %134 %93 %140 %137
+        %142 = OpLogicalNot %bool %141
+               OpSelectionMerge %143 None
+               OpBranchConditional %142 %144 %143
+        %144 = OpLabel
+               OpStore %90 %true
+               OpStore %91 %int_0
+               OpBranch %92
+        %143 = OpLabel
+        %145 = OpLoad %float %94
+        %146 = OpLoad %float %122
+        %147 = OpFSub %float %145 %146
+        %148 = OpLoad %float %99
+        %149 = OpLoad %float %126
+        %150 = OpFSub %float %148 %149
+        %151 = OpCompositeConstruct %v2float %147 %150
+        %152 = OpLoad %float %96
+        %153 = OpLoad %float %122
+        %154 = OpFSub %float %152 %153
+        %155 = OpLoad %float %101
+        %156 = OpLoad %float %126
+        %157 = OpFSub %float %155 %156
+        %158 = OpCompositeConstruct %v2float %154 %157
+               OpStore %param_3 %151
+               OpStore %param_4 %158
+        %159 = OpFunctionCall %float %cross2d_vf2_vf2_ %param_3 %param_4
+               OpStore %pca %159
+        %160 = OpFOrdLessThan %bool %114 %float_0
+        %161 = OpFOrdLessThan %bool %159 %float_0
+        %162 = OpLogicalAnd %bool %160 %161
+        %163 = OpLogicalNot %bool %162
+               OpSelectionMerge %164 None
+               OpBranchConditional %163 %165 %164
+        %165 = OpLabel
+        %166 = OpFOrdGreaterThanEqual %bool %114 %float_0
+        %167 = OpFOrdGreaterThanEqual %bool %159 %float_0
+        %168 = OpLogicalAnd %bool %166 %167
+               OpBranch %164
+        %164 = OpLabel
+        %169 = OpPhi %bool %162 %143 %168 %165
+        %170 = OpLogicalNot %bool %169
+               OpSelectionMerge %171 None
+               OpBranchConditional %170 %172 %171
+        %172 = OpLabel
+               OpStore %90 %true
+               OpStore %91 %int_0
+               OpBranch %92
+        %171 = OpLabel
+               OpStore %90 %true
+               OpStore %91 %int_1
+               OpBranch %92
+         %92 = OpLabel
+        %173 = OpPhi %int %int_0 %144 %int_0 %172 %int_1 %171
+               OpReturnValue %173
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..fd9d668
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,159 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_24 : register(b0, space0) {
+  uint4 x_24[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float cross2d_vf2_vf2_(inout float2 a, inout float2 b) {
+  const float x_79 = a.x;
+  const float x_81 = b.y;
+  const float x_84 = b.x;
+  const float x_86 = a.y;
+  return ((x_79 * x_81) - (x_84 * x_86));
+}
+
+int pointInTriangle_vf2_vf2_vf2_vf2_(inout float2 p, inout float2 a_1, inout float2 b_1, inout float2 c) {
+  bool x_90 = false;
+  int x_91 = 0;
+  float pab = 0.0f;
+  float2 param = float2(0.0f, 0.0f);
+  float2 param_1 = float2(0.0f, 0.0f);
+  float pbc = 0.0f;
+  float2 param_2 = float2(0.0f, 0.0f);
+  float2 param_3 = float2(0.0f, 0.0f);
+  float pca = 0.0f;
+  float2 param_4 = float2(0.0f, 0.0f);
+  float2 param_5 = float2(0.0f, 0.0f);
+  bool x_140 = false;
+  bool x_168 = false;
+  bool x_141_phi = false;
+  bool x_169_phi = false;
+  int x_173_phi = 0;
+  switch(0u) {
+    default: {
+      const float x_95 = p.x;
+      const float x_97 = a_1.x;
+      const float x_100 = p.y;
+      const float x_102 = a_1.y;
+      const float x_106 = b_1.x;
+      const float x_107 = a_1.x;
+      const float x_110 = b_1.y;
+      const float x_111 = a_1.y;
+      param = float2((x_95 - x_97), (x_100 - x_102));
+      param_1 = float2((x_106 - x_107), (x_110 - x_111));
+      const float x_114 = cross2d_vf2_vf2_(param, param_1);
+      pab = x_114;
+      const float x_115 = p.x;
+      const float x_116 = b_1.x;
+      const float x_118 = p.y;
+      const float x_119 = b_1.y;
+      const float x_123 = c.x;
+      const float x_124 = b_1.x;
+      const float x_127 = c.y;
+      const float x_128 = b_1.y;
+      param_2 = float2((x_115 - x_116), (x_118 - x_119));
+      param_3 = float2((x_123 - x_124), (x_127 - x_128));
+      const float x_131 = cross2d_vf2_vf2_(param_2, param_3);
+      pbc = x_131;
+      bool tint_tmp = (x_114 < 0.0f);
+      if (tint_tmp) {
+        tint_tmp = (x_131 < 0.0f);
+      }
+      const bool x_134 = (tint_tmp);
+      x_141_phi = x_134;
+      if (!(x_134)) {
+        bool tint_tmp_1 = (x_114 >= 0.0f);
+        if (tint_tmp_1) {
+          tint_tmp_1 = (x_131 >= 0.0f);
+        }
+        x_140 = (tint_tmp_1);
+        x_141_phi = x_140;
+      }
+      if (!(x_141_phi)) {
+        x_90 = true;
+        x_91 = 0;
+        x_173_phi = 0;
+        break;
+      }
+      const float x_145 = p.x;
+      const float x_146 = c.x;
+      const float x_148 = p.y;
+      const float x_149 = c.y;
+      const float x_152 = a_1.x;
+      const float x_153 = c.x;
+      const float x_155 = a_1.y;
+      const float x_156 = c.y;
+      param_4 = float2((x_145 - x_146), (x_148 - x_149));
+      param_5 = float2((x_152 - x_153), (x_155 - x_156));
+      const float x_159 = cross2d_vf2_vf2_(param_4, param_5);
+      pca = x_159;
+      bool tint_tmp_2 = (x_114 < 0.0f);
+      if (tint_tmp_2) {
+        tint_tmp_2 = (x_159 < 0.0f);
+      }
+      const bool x_162 = (tint_tmp_2);
+      x_169_phi = x_162;
+      if (!(x_162)) {
+        bool tint_tmp_3 = (x_114 >= 0.0f);
+        if (tint_tmp_3) {
+          tint_tmp_3 = (x_159 >= 0.0f);
+        }
+        x_168 = (tint_tmp_3);
+        x_169_phi = x_168;
+      }
+      if (!(x_169_phi)) {
+        x_90 = true;
+        x_91 = 0;
+        x_173_phi = 0;
+        break;
+      }
+      x_90 = true;
+      x_91 = 1;
+      x_173_phi = 1;
+      break;
+    }
+  }
+  return x_173_phi;
+}
+
+void main_1() {
+  float2 pos = float2(0.0f, 0.0f);
+  float2 param_6 = float2(0.0f, 0.0f);
+  float2 param_7 = float2(0.0f, 0.0f);
+  float2 param_8 = float2(0.0f, 0.0f);
+  float2 param_9 = float2(0.0f, 0.0f);
+  const float4 x_67 = gl_FragCoord;
+  const float2 x_70 = asfloat(x_24[0].xy);
+  const float2 x_71 = (float2(x_67.x, x_67.y) / x_70);
+  pos = x_71;
+  param_6 = x_71;
+  param_7 = float2(0.699999988f, 0.300000012f);
+  param_8 = float2(0.5f, 0.899999976f);
+  param_9 = float2(0.100000001f, 0.400000006f);
+  const int x_72 = pointInTriangle_vf2_vf2_vf2_vf2_(param_6, param_7, param_8, param_9);
+  if ((x_72 == 1)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..c8cbf19
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.spvasm.expected.msl
@@ -0,0 +1,145 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float cross2d_vf2_vf2_(thread float2* const a, thread float2* const b) {
+  float const x_79 = (*(a)).x;
+  float const x_81 = (*(b)).y;
+  float const x_84 = (*(b)).x;
+  float const x_86 = (*(a)).y;
+  return ((x_79 * x_81) - (x_84 * x_86));
+}
+
+int pointInTriangle_vf2_vf2_vf2_vf2_(thread float2* const p, thread float2* const a_1, thread float2* const b_1, thread float2* const c) {
+  bool x_90 = false;
+  int x_91 = 0;
+  float pab = 0.0f;
+  float2 param = 0.0f;
+  float2 param_1 = 0.0f;
+  float pbc = 0.0f;
+  float2 param_2 = 0.0f;
+  float2 param_3 = 0.0f;
+  float pca = 0.0f;
+  float2 param_4 = 0.0f;
+  float2 param_5 = 0.0f;
+  bool x_140 = false;
+  bool x_168 = false;
+  bool x_141_phi = false;
+  bool x_169_phi = false;
+  int x_173_phi = 0;
+  switch(0u) {
+    default: {
+      float const x_95 = (*(p)).x;
+      float const x_97 = (*(a_1)).x;
+      float const x_100 = (*(p)).y;
+      float const x_102 = (*(a_1)).y;
+      float const x_106 = (*(b_1)).x;
+      float const x_107 = (*(a_1)).x;
+      float const x_110 = (*(b_1)).y;
+      float const x_111 = (*(a_1)).y;
+      param = float2((x_95 - x_97), (x_100 - x_102));
+      param_1 = float2((x_106 - x_107), (x_110 - x_111));
+      float const x_114 = cross2d_vf2_vf2_(&(param), &(param_1));
+      pab = x_114;
+      float const x_115 = (*(p)).x;
+      float const x_116 = (*(b_1)).x;
+      float const x_118 = (*(p)).y;
+      float const x_119 = (*(b_1)).y;
+      float const x_123 = (*(c)).x;
+      float const x_124 = (*(b_1)).x;
+      float const x_127 = (*(c)).y;
+      float const x_128 = (*(b_1)).y;
+      param_2 = float2((x_115 - x_116), (x_118 - x_119));
+      param_3 = float2((x_123 - x_124), (x_127 - x_128));
+      float const x_131 = cross2d_vf2_vf2_(&(param_2), &(param_3));
+      pbc = x_131;
+      bool const x_134 = ((x_114 < 0.0f) && (x_131 < 0.0f));
+      x_141_phi = x_134;
+      if (!(x_134)) {
+        x_140 = ((x_114 >= 0.0f) && (x_131 >= 0.0f));
+        x_141_phi = x_140;
+      }
+      bool const x_141 = x_141_phi;
+      if (!(x_141)) {
+        x_90 = true;
+        x_91 = 0;
+        x_173_phi = 0;
+        break;
+      }
+      float const x_145 = (*(p)).x;
+      float const x_146 = (*(c)).x;
+      float const x_148 = (*(p)).y;
+      float const x_149 = (*(c)).y;
+      float const x_152 = (*(a_1)).x;
+      float const x_153 = (*(c)).x;
+      float const x_155 = (*(a_1)).y;
+      float const x_156 = (*(c)).y;
+      param_4 = float2((x_145 - x_146), (x_148 - x_149));
+      param_5 = float2((x_152 - x_153), (x_155 - x_156));
+      float const x_159 = cross2d_vf2_vf2_(&(param_4), &(param_5));
+      pca = x_159;
+      bool const x_162 = ((x_114 < 0.0f) && (x_159 < 0.0f));
+      x_169_phi = x_162;
+      if (!(x_162)) {
+        x_168 = ((x_114 >= 0.0f) && (x_159 >= 0.0f));
+        x_169_phi = x_168;
+      }
+      bool const x_169 = x_169_phi;
+      if (!(x_169)) {
+        x_90 = true;
+        x_91 = 0;
+        x_173_phi = 0;
+        break;
+      }
+      x_90 = true;
+      x_91 = 1;
+      x_173_phi = 1;
+      break;
+    }
+  }
+  int const x_173 = x_173_phi;
+  return x_173;
+}
+
+void main_1(constant buf0& x_24, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float2 pos = 0.0f;
+  float2 param_6 = 0.0f;
+  float2 param_7 = 0.0f;
+  float2 param_8 = 0.0f;
+  float2 param_9 = 0.0f;
+  float4 const x_67 = *(tint_symbol_5);
+  float2 const x_70 = x_24.resolution;
+  float2 const x_71 = (float2(x_67.x, x_67.y) / x_70);
+  pos = x_71;
+  param_6 = x_71;
+  param_7 = float2(0.699999988f, 0.300000012f);
+  param_8 = float2(0.5f, 0.899999976f);
+  param_9 = float2(0.100000001f, 0.400000006f);
+  int const x_72 = pointInTriangle_vf2_vf2_vf2_vf2_(&(param_6), &(param_7), &(param_8), &(param_9));
+  if ((x_72 == 1)) {
+    *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_6) = float4(0.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_24 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_24, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..59e04f8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,360 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 265
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_24 "x_24"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %cross2d_vf2_vf2_ "cross2d_vf2_vf2_"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %pointInTriangle_vf2_vf2_vf2_vf2_ "pointInTriangle_vf2_vf2_vf2_vf2_"
+               OpName %p "p"
+               OpName %a_1 "a_1"
+               OpName %b_1 "b_1"
+               OpName %c "c"
+               OpName %x_90 "x_90"
+               OpName %x_91 "x_91"
+               OpName %pab "pab"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %pbc "pbc"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %pca "pca"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpName %x_140 "x_140"
+               OpName %x_168 "x_168"
+               OpName %x_141_phi "x_141_phi"
+               OpName %x_169_phi "x_169_phi"
+               OpName %x_173_phi "x_173_phi"
+               OpName %main_1 "main_1"
+               OpName %pos "pos"
+               OpName %param_6 "param_6"
+               OpName %param_7 "param_7"
+               OpName %param_8 "param_8"
+               OpName %param_9 "param_9"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_24 NonWritable
+               OpDecorate %x_24 DescriptorSet 0
+               OpDecorate %x_24 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_24 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %15 = OpTypeFunction %float %_ptr_Function_v2float %_ptr_Function_v2float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+        %int = OpTypeInt 32 1
+         %40 = OpTypeFunction %int %_ptr_Function_v2float %_ptr_Function_v2float %_ptr_Function_v2float %_ptr_Function_v2float
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %52 = OpConstantNull %bool
+%_ptr_Function_int = OpTypePointer Function %int
+         %55 = OpConstantNull %int
+         %57 = OpConstantNull %float
+         %59 = OpConstantNull %v2float
+    %float_0 = OpConstant %float 0
+       %true = OpConstantTrue %bool
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+       %void = OpTypeVoid
+        %214 = OpTypeFunction %void
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+%float_0_699999988 = OpConstant %float 0.699999988
+%float_0_300000012 = OpConstant %float 0.300000012
+        %233 = OpConstantComposite %v2float %float_0_699999988 %float_0_300000012
+  %float_0_5 = OpConstant %float 0.5
+%float_0_899999976 = OpConstant %float 0.899999976
+        %236 = OpConstantComposite %v2float %float_0_5 %float_0_899999976
+%float_0_100000001 = OpConstant %float 0.100000001
+%float_0_400000006 = OpConstant %float 0.400000006
+        %239 = OpConstantComposite %v2float %float_0_100000001 %float_0_400000006
+    %float_1 = OpConstant %float 1
+        %250 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %251 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %252 = OpTypeFunction %void %main_out
+%cross2d_vf2_vf2_ = OpFunction %float None %15
+          %a = OpFunctionParameter %_ptr_Function_v2float
+          %b = OpFunctionParameter %_ptr_Function_v2float
+         %20 = OpLabel
+         %25 = OpAccessChain %_ptr_Function_float %a %uint_0
+         %26 = OpLoad %float %25
+         %29 = OpAccessChain %_ptr_Function_float %b %uint_1
+         %30 = OpLoad %float %29
+         %32 = OpAccessChain %_ptr_Function_float %b %uint_0
+         %33 = OpLoad %float %32
+         %35 = OpAccessChain %_ptr_Function_float %a %uint_1
+         %36 = OpLoad %float %35
+         %37 = OpFMul %float %26 %30
+         %38 = OpFMul %float %33 %36
+         %39 = OpFSub %float %37 %38
+               OpReturnValue %39
+               OpFunctionEnd
+%pointInTriangle_vf2_vf2_vf2_vf2_ = OpFunction %int None %40
+          %p = OpFunctionParameter %_ptr_Function_v2float
+        %a_1 = OpFunctionParameter %_ptr_Function_v2float
+        %b_1 = OpFunctionParameter %_ptr_Function_v2float
+          %c = OpFunctionParameter %_ptr_Function_v2float
+         %47 = OpLabel
+       %x_90 = OpVariable %_ptr_Function_bool Function %52
+       %x_91 = OpVariable %_ptr_Function_int Function %55
+        %pab = OpVariable %_ptr_Function_float Function %57
+      %param = OpVariable %_ptr_Function_v2float Function %59
+    %param_1 = OpVariable %_ptr_Function_v2float Function %59
+        %pbc = OpVariable %_ptr_Function_float Function %57
+    %param_2 = OpVariable %_ptr_Function_v2float Function %59
+    %param_3 = OpVariable %_ptr_Function_v2float Function %59
+        %pca = OpVariable %_ptr_Function_float Function %57
+    %param_4 = OpVariable %_ptr_Function_v2float Function %59
+    %param_5 = OpVariable %_ptr_Function_v2float Function %59
+      %x_140 = OpVariable %_ptr_Function_bool Function %52
+      %x_168 = OpVariable %_ptr_Function_bool Function %52
+  %x_141_phi = OpVariable %_ptr_Function_bool Function %52
+  %x_169_phi = OpVariable %_ptr_Function_bool Function %52
+  %x_173_phi = OpVariable %_ptr_Function_int Function %55
+               OpStore %x_90 %false
+               OpSelectionMerge %72 None
+               OpSwitch %uint_0 %73
+         %73 = OpLabel
+         %75 = OpAccessChain %_ptr_Function_float %p %uint_0
+         %76 = OpLoad %float %75
+         %78 = OpAccessChain %_ptr_Function_float %a_1 %uint_0
+         %79 = OpLoad %float %78
+         %81 = OpAccessChain %_ptr_Function_float %p %uint_1
+         %82 = OpLoad %float %81
+         %84 = OpAccessChain %_ptr_Function_float %a_1 %uint_1
+         %85 = OpLoad %float %84
+         %87 = OpAccessChain %_ptr_Function_float %b_1 %uint_0
+         %88 = OpLoad %float %87
+         %90 = OpAccessChain %_ptr_Function_float %a_1 %uint_0
+         %91 = OpLoad %float %90
+         %93 = OpAccessChain %_ptr_Function_float %b_1 %uint_1
+         %94 = OpLoad %float %93
+         %96 = OpAccessChain %_ptr_Function_float %a_1 %uint_1
+         %97 = OpLoad %float %96
+         %98 = OpFSub %float %76 %79
+         %99 = OpFSub %float %82 %85
+        %100 = OpCompositeConstruct %v2float %98 %99
+               OpStore %param %100
+        %101 = OpFSub %float %88 %91
+        %102 = OpFSub %float %94 %97
+        %103 = OpCompositeConstruct %v2float %101 %102
+               OpStore %param_1 %103
+        %104 = OpFunctionCall %float %cross2d_vf2_vf2_ %param %param_1
+               OpStore %pab %104
+        %108 = OpAccessChain %_ptr_Function_float %p %uint_0
+        %109 = OpLoad %float %108
+        %111 = OpAccessChain %_ptr_Function_float %b_1 %uint_0
+        %112 = OpLoad %float %111
+        %114 = OpAccessChain %_ptr_Function_float %p %uint_1
+        %115 = OpLoad %float %114
+        %117 = OpAccessChain %_ptr_Function_float %b_1 %uint_1
+        %118 = OpLoad %float %117
+        %120 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %121 = OpLoad %float %120
+        %123 = OpAccessChain %_ptr_Function_float %b_1 %uint_0
+        %124 = OpLoad %float %123
+        %126 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %127 = OpLoad %float %126
+        %129 = OpAccessChain %_ptr_Function_float %b_1 %uint_1
+        %130 = OpLoad %float %129
+        %131 = OpFSub %float %109 %112
+        %132 = OpFSub %float %115 %118
+        %133 = OpCompositeConstruct %v2float %131 %132
+               OpStore %param_2 %133
+        %134 = OpFSub %float %121 %124
+        %135 = OpFSub %float %127 %130
+        %136 = OpCompositeConstruct %v2float %134 %135
+               OpStore %param_3 %136
+        %137 = OpFunctionCall %float %cross2d_vf2_vf2_ %param_2 %param_3
+               OpStore %pbc %137
+        %141 = OpFOrdLessThan %bool %104 %float_0
+               OpSelectionMerge %142 None
+               OpBranchConditional %141 %143 %142
+        %143 = OpLabel
+        %144 = OpFOrdLessThan %bool %137 %float_0
+               OpBranch %142
+        %142 = OpLabel
+        %145 = OpPhi %bool %141 %73 %144 %143
+               OpStore %x_141_phi %145
+        %146 = OpLogicalNot %bool %145
+               OpSelectionMerge %147 None
+               OpBranchConditional %146 %148 %147
+        %148 = OpLabel
+        %149 = OpFOrdGreaterThanEqual %bool %104 %float_0
+               OpSelectionMerge %150 None
+               OpBranchConditional %149 %151 %150
+        %151 = OpLabel
+        %152 = OpFOrdGreaterThanEqual %bool %137 %float_0
+               OpBranch %150
+        %150 = OpLabel
+        %153 = OpPhi %bool %149 %148 %152 %151
+               OpStore %x_140 %153
+        %154 = OpLoad %bool %x_140
+               OpStore %x_141_phi %154
+               OpBranch %147
+        %147 = OpLabel
+        %155 = OpLoad %bool %x_141_phi
+        %156 = OpLogicalNot %bool %155
+               OpSelectionMerge %157 None
+               OpBranchConditional %156 %158 %157
+        %158 = OpLabel
+               OpStore %x_90 %true
+               OpStore %x_91 %int_0
+               OpStore %x_173_phi %int_0
+               OpBranch %72
+        %157 = OpLabel
+        %162 = OpAccessChain %_ptr_Function_float %p %uint_0
+        %163 = OpLoad %float %162
+        %165 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %166 = OpLoad %float %165
+        %168 = OpAccessChain %_ptr_Function_float %p %uint_1
+        %169 = OpLoad %float %168
+        %171 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %172 = OpLoad %float %171
+        %174 = OpAccessChain %_ptr_Function_float %a_1 %uint_0
+        %175 = OpLoad %float %174
+        %177 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %178 = OpLoad %float %177
+        %180 = OpAccessChain %_ptr_Function_float %a_1 %uint_1
+        %181 = OpLoad %float %180
+        %183 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %184 = OpLoad %float %183
+        %185 = OpFSub %float %163 %166
+        %186 = OpFSub %float %169 %172
+        %187 = OpCompositeConstruct %v2float %185 %186
+               OpStore %param_4 %187
+        %188 = OpFSub %float %175 %178
+        %189 = OpFSub %float %181 %184
+        %190 = OpCompositeConstruct %v2float %188 %189
+               OpStore %param_5 %190
+        %191 = OpFunctionCall %float %cross2d_vf2_vf2_ %param_4 %param_5
+               OpStore %pca %191
+        %194 = OpFOrdLessThan %bool %104 %float_0
+               OpSelectionMerge %195 None
+               OpBranchConditional %194 %196 %195
+        %196 = OpLabel
+        %197 = OpFOrdLessThan %bool %191 %float_0
+               OpBranch %195
+        %195 = OpLabel
+        %198 = OpPhi %bool %194 %157 %197 %196
+               OpStore %x_169_phi %198
+        %199 = OpLogicalNot %bool %198
+               OpSelectionMerge %200 None
+               OpBranchConditional %199 %201 %200
+        %201 = OpLabel
+        %202 = OpFOrdGreaterThanEqual %bool %104 %float_0
+               OpSelectionMerge %203 None
+               OpBranchConditional %202 %204 %203
+        %204 = OpLabel
+        %205 = OpFOrdGreaterThanEqual %bool %191 %float_0
+               OpBranch %203
+        %203 = OpLabel
+        %206 = OpPhi %bool %202 %201 %205 %204
+               OpStore %x_168 %206
+        %207 = OpLoad %bool %x_168
+               OpStore %x_169_phi %207
+               OpBranch %200
+        %200 = OpLabel
+        %208 = OpLoad %bool %x_169_phi
+        %209 = OpLogicalNot %bool %208
+               OpSelectionMerge %210 None
+               OpBranchConditional %209 %211 %210
+        %211 = OpLabel
+               OpStore %x_90 %true
+               OpStore %x_91 %int_0
+               OpStore %x_173_phi %int_0
+               OpBranch %72
+        %210 = OpLabel
+               OpStore %x_90 %true
+               OpStore %x_91 %int_1
+               OpStore %x_173_phi %int_1
+               OpBranch %72
+         %72 = OpLabel
+        %213 = OpLoad %int %x_173_phi
+               OpReturnValue %213
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %214
+        %217 = OpLabel
+        %pos = OpVariable %_ptr_Function_v2float Function %59
+    %param_6 = OpVariable %_ptr_Function_v2float Function %59
+    %param_7 = OpVariable %_ptr_Function_v2float Function %59
+    %param_8 = OpVariable %_ptr_Function_v2float Function %59
+    %param_9 = OpVariable %_ptr_Function_v2float Function %59
+        %223 = OpLoad %v4float %gl_FragCoord
+        %225 = OpAccessChain %_ptr_Uniform_v2float %x_24 %uint_0
+        %226 = OpLoad %v2float %225
+        %227 = OpCompositeExtract %float %223 0
+        %228 = OpCompositeExtract %float %223 1
+        %229 = OpCompositeConstruct %v2float %227 %228
+        %230 = OpFDiv %v2float %229 %226
+               OpStore %pos %230
+               OpStore %param_6 %230
+               OpStore %param_7 %233
+               OpStore %param_8 %236
+               OpStore %param_9 %239
+        %240 = OpFunctionCall %int %pointInTriangle_vf2_vf2_vf2_vf2_ %param_6 %param_7 %param_8 %param_9
+        %245 = OpIEqual %bool %240 %int_1
+               OpSelectionMerge %246 None
+               OpBranchConditional %245 %247 %248
+        %247 = OpLabel
+               OpStore %x_GLF_color %250
+               OpBranch %246
+        %248 = OpLabel
+               OpStore %x_GLF_color %251
+               OpBranch %246
+        %246 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %252
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %256 = OpLabel
+        %257 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %257
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %214
+        %259 = OpLabel
+        %260 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %260
+        %261 = OpFunctionCall %void %main_1
+        %263 = OpLoad %v4float %x_GLF_color
+        %264 = OpCompositeConstruct %main_out %263
+        %262 = OpFunctionCall %void %tint_symbol_3 %264
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..d2eec41
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,151 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_24 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn cross2d_vf2_vf2_(a : ptr<function, vec2<f32>>, b : ptr<function, vec2<f32>>) -> f32 {
+  let x_79 : f32 = (*(a)).x;
+  let x_81 : f32 = (*(b)).y;
+  let x_84 : f32 = (*(b)).x;
+  let x_86 : f32 = (*(a)).y;
+  return ((x_79 * x_81) - (x_84 * x_86));
+}
+
+fn pointInTriangle_vf2_vf2_vf2_vf2_(p : ptr<function, vec2<f32>>, a_1 : ptr<function, vec2<f32>>, b_1 : ptr<function, vec2<f32>>, c : ptr<function, vec2<f32>>) -> i32 {
+  var x_90 : bool = false;
+  var x_91 : i32;
+  var pab : f32;
+  var param : vec2<f32>;
+  var param_1 : vec2<f32>;
+  var pbc : f32;
+  var param_2 : vec2<f32>;
+  var param_3 : vec2<f32>;
+  var pca : f32;
+  var param_4 : vec2<f32>;
+  var param_5 : vec2<f32>;
+  var x_140 : bool;
+  var x_168 : bool;
+  var x_141_phi : bool;
+  var x_169_phi : bool;
+  var x_173_phi : i32;
+  switch(0u) {
+    default: {
+      let x_94 : ptr<function, f32> = &((*(p)).x);
+      let x_95 : f32 = *(x_94);
+      let x_96 : ptr<function, f32> = &((*(a_1)).x);
+      let x_97 : f32 = *(x_96);
+      let x_99 : ptr<function, f32> = &((*(p)).y);
+      let x_100 : f32 = *(x_99);
+      let x_101 : ptr<function, f32> = &((*(a_1)).y);
+      let x_102 : f32 = *(x_101);
+      let x_105 : ptr<function, f32> = &((*(b_1)).x);
+      let x_106 : f32 = *(x_105);
+      let x_107 : f32 = *(x_96);
+      let x_109 : ptr<function, f32> = &((*(b_1)).y);
+      let x_110 : f32 = *(x_109);
+      let x_111 : f32 = *(x_101);
+      param = vec2<f32>((x_95 - x_97), (x_100 - x_102));
+      param_1 = vec2<f32>((x_106 - x_107), (x_110 - x_111));
+      let x_114 : f32 = cross2d_vf2_vf2_(&(param), &(param_1));
+      pab = x_114;
+      let x_115 : f32 = *(x_94);
+      let x_116 : f32 = *(x_105);
+      let x_118 : f32 = *(x_99);
+      let x_119 : f32 = *(x_109);
+      let x_122 : ptr<function, f32> = &((*(c)).x);
+      let x_123 : f32 = *(x_122);
+      let x_124 : f32 = *(x_105);
+      let x_126 : ptr<function, f32> = &((*(c)).y);
+      let x_127 : f32 = *(x_126);
+      let x_128 : f32 = *(x_109);
+      param_2 = vec2<f32>((x_115 - x_116), (x_118 - x_119));
+      param_3 = vec2<f32>((x_123 - x_124), (x_127 - x_128));
+      let x_131 : f32 = cross2d_vf2_vf2_(&(param_2), &(param_3));
+      pbc = x_131;
+      let x_134 : bool = ((x_114 < 0.0) && (x_131 < 0.0));
+      x_141_phi = x_134;
+      if (!(x_134)) {
+        x_140 = ((x_114 >= 0.0) && (x_131 >= 0.0));
+        x_141_phi = x_140;
+      }
+      let x_141 : bool = x_141_phi;
+      if (!(x_141)) {
+        x_90 = true;
+        x_91 = 0;
+        x_173_phi = 0;
+        break;
+      }
+      let x_145 : f32 = *(x_94);
+      let x_146 : f32 = *(x_122);
+      let x_148 : f32 = *(x_99);
+      let x_149 : f32 = *(x_126);
+      let x_152 : f32 = *(x_96);
+      let x_153 : f32 = *(x_122);
+      let x_155 : f32 = *(x_101);
+      let x_156 : f32 = *(x_126);
+      param_4 = vec2<f32>((x_145 - x_146), (x_148 - x_149));
+      param_5 = vec2<f32>((x_152 - x_153), (x_155 - x_156));
+      let x_159 : f32 = cross2d_vf2_vf2_(&(param_4), &(param_5));
+      pca = x_159;
+      let x_162 : bool = ((x_114 < 0.0) && (x_159 < 0.0));
+      x_169_phi = x_162;
+      if (!(x_162)) {
+        x_168 = ((x_114 >= 0.0) && (x_159 >= 0.0));
+        x_169_phi = x_168;
+      }
+      let x_169 : bool = x_169_phi;
+      if (!(x_169)) {
+        x_90 = true;
+        x_91 = 0;
+        x_173_phi = 0;
+        break;
+      }
+      x_90 = true;
+      x_91 = 1;
+      x_173_phi = 1;
+    }
+  }
+  let x_173 : i32 = x_173_phi;
+  return x_173;
+}
+
+fn main_1() {
+  var pos : vec2<f32>;
+  var param_6 : vec2<f32>;
+  var param_7 : vec2<f32>;
+  var param_8 : vec2<f32>;
+  var param_9 : vec2<f32>;
+  let x_67 : vec4<f32> = gl_FragCoord;
+  let x_70 : vec2<f32> = x_24.resolution;
+  let x_71 : vec2<f32> = (vec2<f32>(x_67.x, x_67.y) / x_70);
+  pos = x_71;
+  param_6 = x_71;
+  param_7 = vec2<f32>(0.699999988, 0.300000012);
+  param_8 = vec2<f32>(0.5, 0.899999976);
+  param_9 = vec2<f32>(0.100000001, 0.400000006);
+  let x_72 : i32 = pointInTriangle_vf2_vf2_vf2_vf2_(&(param_6), &(param_7), &(param_8), &(param_9));
+  if ((x_72 == 1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.wgsl
new file mode 100644
index 0000000..d2eec41
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.wgsl
@@ -0,0 +1,151 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_24 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn cross2d_vf2_vf2_(a : ptr<function, vec2<f32>>, b : ptr<function, vec2<f32>>) -> f32 {
+  let x_79 : f32 = (*(a)).x;
+  let x_81 : f32 = (*(b)).y;
+  let x_84 : f32 = (*(b)).x;
+  let x_86 : f32 = (*(a)).y;
+  return ((x_79 * x_81) - (x_84 * x_86));
+}
+
+fn pointInTriangle_vf2_vf2_vf2_vf2_(p : ptr<function, vec2<f32>>, a_1 : ptr<function, vec2<f32>>, b_1 : ptr<function, vec2<f32>>, c : ptr<function, vec2<f32>>) -> i32 {
+  var x_90 : bool = false;
+  var x_91 : i32;
+  var pab : f32;
+  var param : vec2<f32>;
+  var param_1 : vec2<f32>;
+  var pbc : f32;
+  var param_2 : vec2<f32>;
+  var param_3 : vec2<f32>;
+  var pca : f32;
+  var param_4 : vec2<f32>;
+  var param_5 : vec2<f32>;
+  var x_140 : bool;
+  var x_168 : bool;
+  var x_141_phi : bool;
+  var x_169_phi : bool;
+  var x_173_phi : i32;
+  switch(0u) {
+    default: {
+      let x_94 : ptr<function, f32> = &((*(p)).x);
+      let x_95 : f32 = *(x_94);
+      let x_96 : ptr<function, f32> = &((*(a_1)).x);
+      let x_97 : f32 = *(x_96);
+      let x_99 : ptr<function, f32> = &((*(p)).y);
+      let x_100 : f32 = *(x_99);
+      let x_101 : ptr<function, f32> = &((*(a_1)).y);
+      let x_102 : f32 = *(x_101);
+      let x_105 : ptr<function, f32> = &((*(b_1)).x);
+      let x_106 : f32 = *(x_105);
+      let x_107 : f32 = *(x_96);
+      let x_109 : ptr<function, f32> = &((*(b_1)).y);
+      let x_110 : f32 = *(x_109);
+      let x_111 : f32 = *(x_101);
+      param = vec2<f32>((x_95 - x_97), (x_100 - x_102));
+      param_1 = vec2<f32>((x_106 - x_107), (x_110 - x_111));
+      let x_114 : f32 = cross2d_vf2_vf2_(&(param), &(param_1));
+      pab = x_114;
+      let x_115 : f32 = *(x_94);
+      let x_116 : f32 = *(x_105);
+      let x_118 : f32 = *(x_99);
+      let x_119 : f32 = *(x_109);
+      let x_122 : ptr<function, f32> = &((*(c)).x);
+      let x_123 : f32 = *(x_122);
+      let x_124 : f32 = *(x_105);
+      let x_126 : ptr<function, f32> = &((*(c)).y);
+      let x_127 : f32 = *(x_126);
+      let x_128 : f32 = *(x_109);
+      param_2 = vec2<f32>((x_115 - x_116), (x_118 - x_119));
+      param_3 = vec2<f32>((x_123 - x_124), (x_127 - x_128));
+      let x_131 : f32 = cross2d_vf2_vf2_(&(param_2), &(param_3));
+      pbc = x_131;
+      let x_134 : bool = ((x_114 < 0.0) && (x_131 < 0.0));
+      x_141_phi = x_134;
+      if (!(x_134)) {
+        x_140 = ((x_114 >= 0.0) && (x_131 >= 0.0));
+        x_141_phi = x_140;
+      }
+      let x_141 : bool = x_141_phi;
+      if (!(x_141)) {
+        x_90 = true;
+        x_91 = 0;
+        x_173_phi = 0;
+        break;
+      }
+      let x_145 : f32 = *(x_94);
+      let x_146 : f32 = *(x_122);
+      let x_148 : f32 = *(x_99);
+      let x_149 : f32 = *(x_126);
+      let x_152 : f32 = *(x_96);
+      let x_153 : f32 = *(x_122);
+      let x_155 : f32 = *(x_101);
+      let x_156 : f32 = *(x_126);
+      param_4 = vec2<f32>((x_145 - x_146), (x_148 - x_149));
+      param_5 = vec2<f32>((x_152 - x_153), (x_155 - x_156));
+      let x_159 : f32 = cross2d_vf2_vf2_(&(param_4), &(param_5));
+      pca = x_159;
+      let x_162 : bool = ((x_114 < 0.0) && (x_159 < 0.0));
+      x_169_phi = x_162;
+      if (!(x_162)) {
+        x_168 = ((x_114 >= 0.0) && (x_159 >= 0.0));
+        x_169_phi = x_168;
+      }
+      let x_169 : bool = x_169_phi;
+      if (!(x_169)) {
+        x_90 = true;
+        x_91 = 0;
+        x_173_phi = 0;
+        break;
+      }
+      x_90 = true;
+      x_91 = 1;
+      x_173_phi = 1;
+    }
+  }
+  let x_173 : i32 = x_173_phi;
+  return x_173;
+}
+
+fn main_1() {
+  var pos : vec2<f32>;
+  var param_6 : vec2<f32>;
+  var param_7 : vec2<f32>;
+  var param_8 : vec2<f32>;
+  var param_9 : vec2<f32>;
+  let x_67 : vec4<f32> = gl_FragCoord;
+  let x_70 : vec2<f32> = x_24.resolution;
+  let x_71 : vec2<f32> = (vec2<f32>(x_67.x, x_67.y) / x_70);
+  pos = x_71;
+  param_6 = x_71;
+  param_7 = vec2<f32>(0.699999988, 0.300000012);
+  param_8 = vec2<f32>(0.5, 0.899999976);
+  param_9 = vec2<f32>(0.100000001, 0.400000006);
+  let x_72 : i32 = pointInTriangle_vf2_vf2_vf2_vf2_(&(param_6), &(param_7), &(param_8), &(param_9));
+  if ((x_72 == 1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..fd9d668
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,159 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_24 : register(b0, space0) {
+  uint4 x_24[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float cross2d_vf2_vf2_(inout float2 a, inout float2 b) {
+  const float x_79 = a.x;
+  const float x_81 = b.y;
+  const float x_84 = b.x;
+  const float x_86 = a.y;
+  return ((x_79 * x_81) - (x_84 * x_86));
+}
+
+int pointInTriangle_vf2_vf2_vf2_vf2_(inout float2 p, inout float2 a_1, inout float2 b_1, inout float2 c) {
+  bool x_90 = false;
+  int x_91 = 0;
+  float pab = 0.0f;
+  float2 param = float2(0.0f, 0.0f);
+  float2 param_1 = float2(0.0f, 0.0f);
+  float pbc = 0.0f;
+  float2 param_2 = float2(0.0f, 0.0f);
+  float2 param_3 = float2(0.0f, 0.0f);
+  float pca = 0.0f;
+  float2 param_4 = float2(0.0f, 0.0f);
+  float2 param_5 = float2(0.0f, 0.0f);
+  bool x_140 = false;
+  bool x_168 = false;
+  bool x_141_phi = false;
+  bool x_169_phi = false;
+  int x_173_phi = 0;
+  switch(0u) {
+    default: {
+      const float x_95 = p.x;
+      const float x_97 = a_1.x;
+      const float x_100 = p.y;
+      const float x_102 = a_1.y;
+      const float x_106 = b_1.x;
+      const float x_107 = a_1.x;
+      const float x_110 = b_1.y;
+      const float x_111 = a_1.y;
+      param = float2((x_95 - x_97), (x_100 - x_102));
+      param_1 = float2((x_106 - x_107), (x_110 - x_111));
+      const float x_114 = cross2d_vf2_vf2_(param, param_1);
+      pab = x_114;
+      const float x_115 = p.x;
+      const float x_116 = b_1.x;
+      const float x_118 = p.y;
+      const float x_119 = b_1.y;
+      const float x_123 = c.x;
+      const float x_124 = b_1.x;
+      const float x_127 = c.y;
+      const float x_128 = b_1.y;
+      param_2 = float2((x_115 - x_116), (x_118 - x_119));
+      param_3 = float2((x_123 - x_124), (x_127 - x_128));
+      const float x_131 = cross2d_vf2_vf2_(param_2, param_3);
+      pbc = x_131;
+      bool tint_tmp = (x_114 < 0.0f);
+      if (tint_tmp) {
+        tint_tmp = (x_131 < 0.0f);
+      }
+      const bool x_134 = (tint_tmp);
+      x_141_phi = x_134;
+      if (!(x_134)) {
+        bool tint_tmp_1 = (x_114 >= 0.0f);
+        if (tint_tmp_1) {
+          tint_tmp_1 = (x_131 >= 0.0f);
+        }
+        x_140 = (tint_tmp_1);
+        x_141_phi = x_140;
+      }
+      if (!(x_141_phi)) {
+        x_90 = true;
+        x_91 = 0;
+        x_173_phi = 0;
+        break;
+      }
+      const float x_145 = p.x;
+      const float x_146 = c.x;
+      const float x_148 = p.y;
+      const float x_149 = c.y;
+      const float x_152 = a_1.x;
+      const float x_153 = c.x;
+      const float x_155 = a_1.y;
+      const float x_156 = c.y;
+      param_4 = float2((x_145 - x_146), (x_148 - x_149));
+      param_5 = float2((x_152 - x_153), (x_155 - x_156));
+      const float x_159 = cross2d_vf2_vf2_(param_4, param_5);
+      pca = x_159;
+      bool tint_tmp_2 = (x_114 < 0.0f);
+      if (tint_tmp_2) {
+        tint_tmp_2 = (x_159 < 0.0f);
+      }
+      const bool x_162 = (tint_tmp_2);
+      x_169_phi = x_162;
+      if (!(x_162)) {
+        bool tint_tmp_3 = (x_114 >= 0.0f);
+        if (tint_tmp_3) {
+          tint_tmp_3 = (x_159 >= 0.0f);
+        }
+        x_168 = (tint_tmp_3);
+        x_169_phi = x_168;
+      }
+      if (!(x_169_phi)) {
+        x_90 = true;
+        x_91 = 0;
+        x_173_phi = 0;
+        break;
+      }
+      x_90 = true;
+      x_91 = 1;
+      x_173_phi = 1;
+      break;
+    }
+  }
+  return x_173_phi;
+}
+
+void main_1() {
+  float2 pos = float2(0.0f, 0.0f);
+  float2 param_6 = float2(0.0f, 0.0f);
+  float2 param_7 = float2(0.0f, 0.0f);
+  float2 param_8 = float2(0.0f, 0.0f);
+  float2 param_9 = float2(0.0f, 0.0f);
+  const float4 x_67 = gl_FragCoord;
+  const float2 x_70 = asfloat(x_24[0].xy);
+  const float2 x_71 = (float2(x_67.x, x_67.y) / x_70);
+  pos = x_71;
+  param_6 = x_71;
+  param_7 = float2(0.699999988f, 0.300000012f);
+  param_8 = float2(0.5f, 0.899999976f);
+  param_9 = float2(0.100000001f, 0.400000006f);
+  const int x_72 = pointInTriangle_vf2_vf2_vf2_vf2_(param_6, param_7, param_8, param_9);
+  if ((x_72 == 1)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..c8cbf19
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.wgsl.expected.msl
@@ -0,0 +1,145 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float cross2d_vf2_vf2_(thread float2* const a, thread float2* const b) {
+  float const x_79 = (*(a)).x;
+  float const x_81 = (*(b)).y;
+  float const x_84 = (*(b)).x;
+  float const x_86 = (*(a)).y;
+  return ((x_79 * x_81) - (x_84 * x_86));
+}
+
+int pointInTriangle_vf2_vf2_vf2_vf2_(thread float2* const p, thread float2* const a_1, thread float2* const b_1, thread float2* const c) {
+  bool x_90 = false;
+  int x_91 = 0;
+  float pab = 0.0f;
+  float2 param = 0.0f;
+  float2 param_1 = 0.0f;
+  float pbc = 0.0f;
+  float2 param_2 = 0.0f;
+  float2 param_3 = 0.0f;
+  float pca = 0.0f;
+  float2 param_4 = 0.0f;
+  float2 param_5 = 0.0f;
+  bool x_140 = false;
+  bool x_168 = false;
+  bool x_141_phi = false;
+  bool x_169_phi = false;
+  int x_173_phi = 0;
+  switch(0u) {
+    default: {
+      float const x_95 = (*(p)).x;
+      float const x_97 = (*(a_1)).x;
+      float const x_100 = (*(p)).y;
+      float const x_102 = (*(a_1)).y;
+      float const x_106 = (*(b_1)).x;
+      float const x_107 = (*(a_1)).x;
+      float const x_110 = (*(b_1)).y;
+      float const x_111 = (*(a_1)).y;
+      param = float2((x_95 - x_97), (x_100 - x_102));
+      param_1 = float2((x_106 - x_107), (x_110 - x_111));
+      float const x_114 = cross2d_vf2_vf2_(&(param), &(param_1));
+      pab = x_114;
+      float const x_115 = (*(p)).x;
+      float const x_116 = (*(b_1)).x;
+      float const x_118 = (*(p)).y;
+      float const x_119 = (*(b_1)).y;
+      float const x_123 = (*(c)).x;
+      float const x_124 = (*(b_1)).x;
+      float const x_127 = (*(c)).y;
+      float const x_128 = (*(b_1)).y;
+      param_2 = float2((x_115 - x_116), (x_118 - x_119));
+      param_3 = float2((x_123 - x_124), (x_127 - x_128));
+      float const x_131 = cross2d_vf2_vf2_(&(param_2), &(param_3));
+      pbc = x_131;
+      bool const x_134 = ((x_114 < 0.0f) && (x_131 < 0.0f));
+      x_141_phi = x_134;
+      if (!(x_134)) {
+        x_140 = ((x_114 >= 0.0f) && (x_131 >= 0.0f));
+        x_141_phi = x_140;
+      }
+      bool const x_141 = x_141_phi;
+      if (!(x_141)) {
+        x_90 = true;
+        x_91 = 0;
+        x_173_phi = 0;
+        break;
+      }
+      float const x_145 = (*(p)).x;
+      float const x_146 = (*(c)).x;
+      float const x_148 = (*(p)).y;
+      float const x_149 = (*(c)).y;
+      float const x_152 = (*(a_1)).x;
+      float const x_153 = (*(c)).x;
+      float const x_155 = (*(a_1)).y;
+      float const x_156 = (*(c)).y;
+      param_4 = float2((x_145 - x_146), (x_148 - x_149));
+      param_5 = float2((x_152 - x_153), (x_155 - x_156));
+      float const x_159 = cross2d_vf2_vf2_(&(param_4), &(param_5));
+      pca = x_159;
+      bool const x_162 = ((x_114 < 0.0f) && (x_159 < 0.0f));
+      x_169_phi = x_162;
+      if (!(x_162)) {
+        x_168 = ((x_114 >= 0.0f) && (x_159 >= 0.0f));
+        x_169_phi = x_168;
+      }
+      bool const x_169 = x_169_phi;
+      if (!(x_169)) {
+        x_90 = true;
+        x_91 = 0;
+        x_173_phi = 0;
+        break;
+      }
+      x_90 = true;
+      x_91 = 1;
+      x_173_phi = 1;
+      break;
+    }
+  }
+  int const x_173 = x_173_phi;
+  return x_173;
+}
+
+void main_1(constant buf0& x_24, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float2 pos = 0.0f;
+  float2 param_6 = 0.0f;
+  float2 param_7 = 0.0f;
+  float2 param_8 = 0.0f;
+  float2 param_9 = 0.0f;
+  float4 const x_67 = *(tint_symbol_5);
+  float2 const x_70 = x_24.resolution;
+  float2 const x_71 = (float2(x_67.x, x_67.y) / x_70);
+  pos = x_71;
+  param_6 = x_71;
+  param_7 = float2(0.699999988f, 0.300000012f);
+  param_8 = float2(0.5f, 0.899999976f);
+  param_9 = float2(0.100000001f, 0.400000006f);
+  int const x_72 = pointInTriangle_vf2_vf2_vf2_vf2_(&(param_6), &(param_7), &(param_8), &(param_9));
+  if ((x_72 == 1)) {
+    *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_6) = float4(0.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_24 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_24, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..59e04f8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,360 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 265
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_24 "x_24"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %cross2d_vf2_vf2_ "cross2d_vf2_vf2_"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %pointInTriangle_vf2_vf2_vf2_vf2_ "pointInTriangle_vf2_vf2_vf2_vf2_"
+               OpName %p "p"
+               OpName %a_1 "a_1"
+               OpName %b_1 "b_1"
+               OpName %c "c"
+               OpName %x_90 "x_90"
+               OpName %x_91 "x_91"
+               OpName %pab "pab"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %pbc "pbc"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %pca "pca"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpName %x_140 "x_140"
+               OpName %x_168 "x_168"
+               OpName %x_141_phi "x_141_phi"
+               OpName %x_169_phi "x_169_phi"
+               OpName %x_173_phi "x_173_phi"
+               OpName %main_1 "main_1"
+               OpName %pos "pos"
+               OpName %param_6 "param_6"
+               OpName %param_7 "param_7"
+               OpName %param_8 "param_8"
+               OpName %param_9 "param_9"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_24 NonWritable
+               OpDecorate %x_24 DescriptorSet 0
+               OpDecorate %x_24 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_24 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %15 = OpTypeFunction %float %_ptr_Function_v2float %_ptr_Function_v2float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+        %int = OpTypeInt 32 1
+         %40 = OpTypeFunction %int %_ptr_Function_v2float %_ptr_Function_v2float %_ptr_Function_v2float %_ptr_Function_v2float
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %52 = OpConstantNull %bool
+%_ptr_Function_int = OpTypePointer Function %int
+         %55 = OpConstantNull %int
+         %57 = OpConstantNull %float
+         %59 = OpConstantNull %v2float
+    %float_0 = OpConstant %float 0
+       %true = OpConstantTrue %bool
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+       %void = OpTypeVoid
+        %214 = OpTypeFunction %void
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+%float_0_699999988 = OpConstant %float 0.699999988
+%float_0_300000012 = OpConstant %float 0.300000012
+        %233 = OpConstantComposite %v2float %float_0_699999988 %float_0_300000012
+  %float_0_5 = OpConstant %float 0.5
+%float_0_899999976 = OpConstant %float 0.899999976
+        %236 = OpConstantComposite %v2float %float_0_5 %float_0_899999976
+%float_0_100000001 = OpConstant %float 0.100000001
+%float_0_400000006 = OpConstant %float 0.400000006
+        %239 = OpConstantComposite %v2float %float_0_100000001 %float_0_400000006
+    %float_1 = OpConstant %float 1
+        %250 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %251 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %252 = OpTypeFunction %void %main_out
+%cross2d_vf2_vf2_ = OpFunction %float None %15
+          %a = OpFunctionParameter %_ptr_Function_v2float
+          %b = OpFunctionParameter %_ptr_Function_v2float
+         %20 = OpLabel
+         %25 = OpAccessChain %_ptr_Function_float %a %uint_0
+         %26 = OpLoad %float %25
+         %29 = OpAccessChain %_ptr_Function_float %b %uint_1
+         %30 = OpLoad %float %29
+         %32 = OpAccessChain %_ptr_Function_float %b %uint_0
+         %33 = OpLoad %float %32
+         %35 = OpAccessChain %_ptr_Function_float %a %uint_1
+         %36 = OpLoad %float %35
+         %37 = OpFMul %float %26 %30
+         %38 = OpFMul %float %33 %36
+         %39 = OpFSub %float %37 %38
+               OpReturnValue %39
+               OpFunctionEnd
+%pointInTriangle_vf2_vf2_vf2_vf2_ = OpFunction %int None %40
+          %p = OpFunctionParameter %_ptr_Function_v2float
+        %a_1 = OpFunctionParameter %_ptr_Function_v2float
+        %b_1 = OpFunctionParameter %_ptr_Function_v2float
+          %c = OpFunctionParameter %_ptr_Function_v2float
+         %47 = OpLabel
+       %x_90 = OpVariable %_ptr_Function_bool Function %52
+       %x_91 = OpVariable %_ptr_Function_int Function %55
+        %pab = OpVariable %_ptr_Function_float Function %57
+      %param = OpVariable %_ptr_Function_v2float Function %59
+    %param_1 = OpVariable %_ptr_Function_v2float Function %59
+        %pbc = OpVariable %_ptr_Function_float Function %57
+    %param_2 = OpVariable %_ptr_Function_v2float Function %59
+    %param_3 = OpVariable %_ptr_Function_v2float Function %59
+        %pca = OpVariable %_ptr_Function_float Function %57
+    %param_4 = OpVariable %_ptr_Function_v2float Function %59
+    %param_5 = OpVariable %_ptr_Function_v2float Function %59
+      %x_140 = OpVariable %_ptr_Function_bool Function %52
+      %x_168 = OpVariable %_ptr_Function_bool Function %52
+  %x_141_phi = OpVariable %_ptr_Function_bool Function %52
+  %x_169_phi = OpVariable %_ptr_Function_bool Function %52
+  %x_173_phi = OpVariable %_ptr_Function_int Function %55
+               OpStore %x_90 %false
+               OpSelectionMerge %72 None
+               OpSwitch %uint_0 %73
+         %73 = OpLabel
+         %75 = OpAccessChain %_ptr_Function_float %p %uint_0
+         %76 = OpLoad %float %75
+         %78 = OpAccessChain %_ptr_Function_float %a_1 %uint_0
+         %79 = OpLoad %float %78
+         %81 = OpAccessChain %_ptr_Function_float %p %uint_1
+         %82 = OpLoad %float %81
+         %84 = OpAccessChain %_ptr_Function_float %a_1 %uint_1
+         %85 = OpLoad %float %84
+         %87 = OpAccessChain %_ptr_Function_float %b_1 %uint_0
+         %88 = OpLoad %float %87
+         %90 = OpAccessChain %_ptr_Function_float %a_1 %uint_0
+         %91 = OpLoad %float %90
+         %93 = OpAccessChain %_ptr_Function_float %b_1 %uint_1
+         %94 = OpLoad %float %93
+         %96 = OpAccessChain %_ptr_Function_float %a_1 %uint_1
+         %97 = OpLoad %float %96
+         %98 = OpFSub %float %76 %79
+         %99 = OpFSub %float %82 %85
+        %100 = OpCompositeConstruct %v2float %98 %99
+               OpStore %param %100
+        %101 = OpFSub %float %88 %91
+        %102 = OpFSub %float %94 %97
+        %103 = OpCompositeConstruct %v2float %101 %102
+               OpStore %param_1 %103
+        %104 = OpFunctionCall %float %cross2d_vf2_vf2_ %param %param_1
+               OpStore %pab %104
+        %108 = OpAccessChain %_ptr_Function_float %p %uint_0
+        %109 = OpLoad %float %108
+        %111 = OpAccessChain %_ptr_Function_float %b_1 %uint_0
+        %112 = OpLoad %float %111
+        %114 = OpAccessChain %_ptr_Function_float %p %uint_1
+        %115 = OpLoad %float %114
+        %117 = OpAccessChain %_ptr_Function_float %b_1 %uint_1
+        %118 = OpLoad %float %117
+        %120 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %121 = OpLoad %float %120
+        %123 = OpAccessChain %_ptr_Function_float %b_1 %uint_0
+        %124 = OpLoad %float %123
+        %126 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %127 = OpLoad %float %126
+        %129 = OpAccessChain %_ptr_Function_float %b_1 %uint_1
+        %130 = OpLoad %float %129
+        %131 = OpFSub %float %109 %112
+        %132 = OpFSub %float %115 %118
+        %133 = OpCompositeConstruct %v2float %131 %132
+               OpStore %param_2 %133
+        %134 = OpFSub %float %121 %124
+        %135 = OpFSub %float %127 %130
+        %136 = OpCompositeConstruct %v2float %134 %135
+               OpStore %param_3 %136
+        %137 = OpFunctionCall %float %cross2d_vf2_vf2_ %param_2 %param_3
+               OpStore %pbc %137
+        %141 = OpFOrdLessThan %bool %104 %float_0
+               OpSelectionMerge %142 None
+               OpBranchConditional %141 %143 %142
+        %143 = OpLabel
+        %144 = OpFOrdLessThan %bool %137 %float_0
+               OpBranch %142
+        %142 = OpLabel
+        %145 = OpPhi %bool %141 %73 %144 %143
+               OpStore %x_141_phi %145
+        %146 = OpLogicalNot %bool %145
+               OpSelectionMerge %147 None
+               OpBranchConditional %146 %148 %147
+        %148 = OpLabel
+        %149 = OpFOrdGreaterThanEqual %bool %104 %float_0
+               OpSelectionMerge %150 None
+               OpBranchConditional %149 %151 %150
+        %151 = OpLabel
+        %152 = OpFOrdGreaterThanEqual %bool %137 %float_0
+               OpBranch %150
+        %150 = OpLabel
+        %153 = OpPhi %bool %149 %148 %152 %151
+               OpStore %x_140 %153
+        %154 = OpLoad %bool %x_140
+               OpStore %x_141_phi %154
+               OpBranch %147
+        %147 = OpLabel
+        %155 = OpLoad %bool %x_141_phi
+        %156 = OpLogicalNot %bool %155
+               OpSelectionMerge %157 None
+               OpBranchConditional %156 %158 %157
+        %158 = OpLabel
+               OpStore %x_90 %true
+               OpStore %x_91 %int_0
+               OpStore %x_173_phi %int_0
+               OpBranch %72
+        %157 = OpLabel
+        %162 = OpAccessChain %_ptr_Function_float %p %uint_0
+        %163 = OpLoad %float %162
+        %165 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %166 = OpLoad %float %165
+        %168 = OpAccessChain %_ptr_Function_float %p %uint_1
+        %169 = OpLoad %float %168
+        %171 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %172 = OpLoad %float %171
+        %174 = OpAccessChain %_ptr_Function_float %a_1 %uint_0
+        %175 = OpLoad %float %174
+        %177 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %178 = OpLoad %float %177
+        %180 = OpAccessChain %_ptr_Function_float %a_1 %uint_1
+        %181 = OpLoad %float %180
+        %183 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %184 = OpLoad %float %183
+        %185 = OpFSub %float %163 %166
+        %186 = OpFSub %float %169 %172
+        %187 = OpCompositeConstruct %v2float %185 %186
+               OpStore %param_4 %187
+        %188 = OpFSub %float %175 %178
+        %189 = OpFSub %float %181 %184
+        %190 = OpCompositeConstruct %v2float %188 %189
+               OpStore %param_5 %190
+        %191 = OpFunctionCall %float %cross2d_vf2_vf2_ %param_4 %param_5
+               OpStore %pca %191
+        %194 = OpFOrdLessThan %bool %104 %float_0
+               OpSelectionMerge %195 None
+               OpBranchConditional %194 %196 %195
+        %196 = OpLabel
+        %197 = OpFOrdLessThan %bool %191 %float_0
+               OpBranch %195
+        %195 = OpLabel
+        %198 = OpPhi %bool %194 %157 %197 %196
+               OpStore %x_169_phi %198
+        %199 = OpLogicalNot %bool %198
+               OpSelectionMerge %200 None
+               OpBranchConditional %199 %201 %200
+        %201 = OpLabel
+        %202 = OpFOrdGreaterThanEqual %bool %104 %float_0
+               OpSelectionMerge %203 None
+               OpBranchConditional %202 %204 %203
+        %204 = OpLabel
+        %205 = OpFOrdGreaterThanEqual %bool %191 %float_0
+               OpBranch %203
+        %203 = OpLabel
+        %206 = OpPhi %bool %202 %201 %205 %204
+               OpStore %x_168 %206
+        %207 = OpLoad %bool %x_168
+               OpStore %x_169_phi %207
+               OpBranch %200
+        %200 = OpLabel
+        %208 = OpLoad %bool %x_169_phi
+        %209 = OpLogicalNot %bool %208
+               OpSelectionMerge %210 None
+               OpBranchConditional %209 %211 %210
+        %211 = OpLabel
+               OpStore %x_90 %true
+               OpStore %x_91 %int_0
+               OpStore %x_173_phi %int_0
+               OpBranch %72
+        %210 = OpLabel
+               OpStore %x_90 %true
+               OpStore %x_91 %int_1
+               OpStore %x_173_phi %int_1
+               OpBranch %72
+         %72 = OpLabel
+        %213 = OpLoad %int %x_173_phi
+               OpReturnValue %213
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %214
+        %217 = OpLabel
+        %pos = OpVariable %_ptr_Function_v2float Function %59
+    %param_6 = OpVariable %_ptr_Function_v2float Function %59
+    %param_7 = OpVariable %_ptr_Function_v2float Function %59
+    %param_8 = OpVariable %_ptr_Function_v2float Function %59
+    %param_9 = OpVariable %_ptr_Function_v2float Function %59
+        %223 = OpLoad %v4float %gl_FragCoord
+        %225 = OpAccessChain %_ptr_Uniform_v2float %x_24 %uint_0
+        %226 = OpLoad %v2float %225
+        %227 = OpCompositeExtract %float %223 0
+        %228 = OpCompositeExtract %float %223 1
+        %229 = OpCompositeConstruct %v2float %227 %228
+        %230 = OpFDiv %v2float %229 %226
+               OpStore %pos %230
+               OpStore %param_6 %230
+               OpStore %param_7 %233
+               OpStore %param_8 %236
+               OpStore %param_9 %239
+        %240 = OpFunctionCall %int %pointInTriangle_vf2_vf2_vf2_vf2_ %param_6 %param_7 %param_8 %param_9
+        %245 = OpIEqual %bool %240 %int_1
+               OpSelectionMerge %246 None
+               OpBranchConditional %245 %247 %248
+        %247 = OpLabel
+               OpStore %x_GLF_color %250
+               OpBranch %246
+        %248 = OpLabel
+               OpStore %x_GLF_color %251
+               OpBranch %246
+        %246 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %252
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %256 = OpLabel
+        %257 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %257
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %214
+        %259 = OpLabel
+        %260 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %260
+        %261 = OpFunctionCall %void %main_1
+        %263 = OpLoad %v4float %x_GLF_color
+        %264 = OpCompositeConstruct %main_out %263
+        %262 = OpFunctionCall %void %tint_symbol_3 %264
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..d2eec41
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,151 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_24 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn cross2d_vf2_vf2_(a : ptr<function, vec2<f32>>, b : ptr<function, vec2<f32>>) -> f32 {
+  let x_79 : f32 = (*(a)).x;
+  let x_81 : f32 = (*(b)).y;
+  let x_84 : f32 = (*(b)).x;
+  let x_86 : f32 = (*(a)).y;
+  return ((x_79 * x_81) - (x_84 * x_86));
+}
+
+fn pointInTriangle_vf2_vf2_vf2_vf2_(p : ptr<function, vec2<f32>>, a_1 : ptr<function, vec2<f32>>, b_1 : ptr<function, vec2<f32>>, c : ptr<function, vec2<f32>>) -> i32 {
+  var x_90 : bool = false;
+  var x_91 : i32;
+  var pab : f32;
+  var param : vec2<f32>;
+  var param_1 : vec2<f32>;
+  var pbc : f32;
+  var param_2 : vec2<f32>;
+  var param_3 : vec2<f32>;
+  var pca : f32;
+  var param_4 : vec2<f32>;
+  var param_5 : vec2<f32>;
+  var x_140 : bool;
+  var x_168 : bool;
+  var x_141_phi : bool;
+  var x_169_phi : bool;
+  var x_173_phi : i32;
+  switch(0u) {
+    default: {
+      let x_94 : ptr<function, f32> = &((*(p)).x);
+      let x_95 : f32 = *(x_94);
+      let x_96 : ptr<function, f32> = &((*(a_1)).x);
+      let x_97 : f32 = *(x_96);
+      let x_99 : ptr<function, f32> = &((*(p)).y);
+      let x_100 : f32 = *(x_99);
+      let x_101 : ptr<function, f32> = &((*(a_1)).y);
+      let x_102 : f32 = *(x_101);
+      let x_105 : ptr<function, f32> = &((*(b_1)).x);
+      let x_106 : f32 = *(x_105);
+      let x_107 : f32 = *(x_96);
+      let x_109 : ptr<function, f32> = &((*(b_1)).y);
+      let x_110 : f32 = *(x_109);
+      let x_111 : f32 = *(x_101);
+      param = vec2<f32>((x_95 - x_97), (x_100 - x_102));
+      param_1 = vec2<f32>((x_106 - x_107), (x_110 - x_111));
+      let x_114 : f32 = cross2d_vf2_vf2_(&(param), &(param_1));
+      pab = x_114;
+      let x_115 : f32 = *(x_94);
+      let x_116 : f32 = *(x_105);
+      let x_118 : f32 = *(x_99);
+      let x_119 : f32 = *(x_109);
+      let x_122 : ptr<function, f32> = &((*(c)).x);
+      let x_123 : f32 = *(x_122);
+      let x_124 : f32 = *(x_105);
+      let x_126 : ptr<function, f32> = &((*(c)).y);
+      let x_127 : f32 = *(x_126);
+      let x_128 : f32 = *(x_109);
+      param_2 = vec2<f32>((x_115 - x_116), (x_118 - x_119));
+      param_3 = vec2<f32>((x_123 - x_124), (x_127 - x_128));
+      let x_131 : f32 = cross2d_vf2_vf2_(&(param_2), &(param_3));
+      pbc = x_131;
+      let x_134 : bool = ((x_114 < 0.0) && (x_131 < 0.0));
+      x_141_phi = x_134;
+      if (!(x_134)) {
+        x_140 = ((x_114 >= 0.0) && (x_131 >= 0.0));
+        x_141_phi = x_140;
+      }
+      let x_141 : bool = x_141_phi;
+      if (!(x_141)) {
+        x_90 = true;
+        x_91 = 0;
+        x_173_phi = 0;
+        break;
+      }
+      let x_145 : f32 = *(x_94);
+      let x_146 : f32 = *(x_122);
+      let x_148 : f32 = *(x_99);
+      let x_149 : f32 = *(x_126);
+      let x_152 : f32 = *(x_96);
+      let x_153 : f32 = *(x_122);
+      let x_155 : f32 = *(x_101);
+      let x_156 : f32 = *(x_126);
+      param_4 = vec2<f32>((x_145 - x_146), (x_148 - x_149));
+      param_5 = vec2<f32>((x_152 - x_153), (x_155 - x_156));
+      let x_159 : f32 = cross2d_vf2_vf2_(&(param_4), &(param_5));
+      pca = x_159;
+      let x_162 : bool = ((x_114 < 0.0) && (x_159 < 0.0));
+      x_169_phi = x_162;
+      if (!(x_162)) {
+        x_168 = ((x_114 >= 0.0) && (x_159 >= 0.0));
+        x_169_phi = x_168;
+      }
+      let x_169 : bool = x_169_phi;
+      if (!(x_169)) {
+        x_90 = true;
+        x_91 = 0;
+        x_173_phi = 0;
+        break;
+      }
+      x_90 = true;
+      x_91 = 1;
+      x_173_phi = 1;
+    }
+  }
+  let x_173 : i32 = x_173_phi;
+  return x_173;
+}
+
+fn main_1() {
+  var pos : vec2<f32>;
+  var param_6 : vec2<f32>;
+  var param_7 : vec2<f32>;
+  var param_8 : vec2<f32>;
+  var param_9 : vec2<f32>;
+  let x_67 : vec4<f32> = gl_FragCoord;
+  let x_70 : vec2<f32> = x_24.resolution;
+  let x_71 : vec2<f32> = (vec2<f32>(x_67.x, x_67.y) / x_70);
+  pos = x_71;
+  param_6 = x_71;
+  param_7 = vec2<f32>(0.699999988, 0.300000012);
+  param_8 = vec2<f32>(0.5, 0.899999976);
+  param_9 = vec2<f32>(0.100000001, 0.400000006);
+  let x_72 : i32 = pointInTriangle_vf2_vf2_vf2_vf2_(&(param_6), &(param_7), &(param_8), &(param_9));
+  if ((x_72 == 1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.spvasm
new file mode 100644
index 0000000..43c7e0b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.spvasm
@@ -0,0 +1,250 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %cross2d_vf2_vf2_ "cross2d(vf2;vf2;"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %pointInTriangle_vf2_vf2_vf2_vf2_ "pointInTriangle(vf2;vf2;vf2;vf2;"
+               OpName %p "p"
+               OpName %a_0 "a"
+               OpName %b_0 "b"
+               OpName %c "c"
+               OpName %pab "pab"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %pbc "pbc"
+               OpName %param_1 "param"
+               OpName %param_2 "param"
+               OpName %pca "pca"
+               OpName %param_3 "param"
+               OpName %param_4 "param"
+               OpName %pos "pos"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %param_5 "param"
+               OpName %param_6 "param"
+               OpName %param_7 "param"
+               OpName %param_8 "param"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %34 = OpTypeFunction %float %_ptr_Function_v2float %_ptr_Function_v2float
+        %int = OpTypeInt 32 1
+         %36 = OpTypeFunction %int %_ptr_Function_v2float %_ptr_Function_v2float %_ptr_Function_v2float %_ptr_Function_v2float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+%float_0_699999988 = OpConstant %float 0.699999988
+%float_0_300000012 = OpConstant %float 0.300000012
+         %51 = OpConstantComposite %v2float %float_0_699999988 %float_0_300000012
+  %float_0_5 = OpConstant %float 0.5
+%float_0_899999976 = OpConstant %float 0.899999976
+         %54 = OpConstantComposite %v2float %float_0_5 %float_0_899999976
+%float_0_100000001 = OpConstant %float 0.100000001
+%float_0_400000006 = OpConstant %float 0.400000006
+         %57 = OpConstantComposite %v2float %float_0_100000001 %float_0_400000006
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+         %60 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %61 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %30
+         %62 = OpLabel
+        %pos = OpVariable %_ptr_Function_v2float Function
+    %param_5 = OpVariable %_ptr_Function_v2float Function
+    %param_6 = OpVariable %_ptr_Function_v2float Function
+    %param_7 = OpVariable %_ptr_Function_v2float Function
+    %param_8 = OpVariable %_ptr_Function_v2float Function
+         %63 = OpLoad %v4float %gl_FragCoord
+         %64 = OpVectorShuffle %v2float %63 %63 0 1
+         %65 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+         %66 = OpLoad %v2float %65
+         %67 = OpFDiv %v2float %64 %66
+               OpStore %pos %67
+         %68 = OpLoad %v2float %pos
+               OpStore %param_5 %68
+               OpStore %param_6 %51
+               OpStore %param_7 %54
+               OpStore %param_8 %57
+         %69 = OpFunctionCall %int %pointInTriangle_vf2_vf2_vf2_vf2_ %param_5 %param_6 %param_7 %param_8
+         %70 = OpIEqual %bool %69 %int_1
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %73
+         %72 = OpLabel
+               OpStore %_GLF_color %60
+               OpBranch %71
+         %73 = OpLabel
+               OpStore %_GLF_color %61
+               OpBranch %71
+         %71 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%cross2d_vf2_vf2_ = OpFunction %float None %34
+          %a = OpFunctionParameter %_ptr_Function_v2float
+          %b = OpFunctionParameter %_ptr_Function_v2float
+         %74 = OpLabel
+         %75 = OpAccessChain %_ptr_Function_float %a %uint_0
+         %76 = OpLoad %float %75
+         %77 = OpAccessChain %_ptr_Function_float %b %uint_1
+         %78 = OpLoad %float %77
+         %79 = OpFMul %float %76 %78
+         %80 = OpAccessChain %_ptr_Function_float %b %uint_0
+         %81 = OpLoad %float %80
+         %82 = OpAccessChain %_ptr_Function_float %a %uint_1
+         %83 = OpLoad %float %82
+         %84 = OpFMul %float %81 %83
+         %85 = OpFSub %float %79 %84
+               OpReturnValue %85
+               OpFunctionEnd
+%pointInTriangle_vf2_vf2_vf2_vf2_ = OpFunction %int None %36
+          %p = OpFunctionParameter %_ptr_Function_v2float
+        %a_0 = OpFunctionParameter %_ptr_Function_v2float
+        %b_0 = OpFunctionParameter %_ptr_Function_v2float
+          %c = OpFunctionParameter %_ptr_Function_v2float
+         %86 = OpLabel
+        %pab = OpVariable %_ptr_Function_float Function
+      %param = OpVariable %_ptr_Function_v2float Function
+    %param_0 = OpVariable %_ptr_Function_v2float Function
+        %pbc = OpVariable %_ptr_Function_float Function
+    %param_1 = OpVariable %_ptr_Function_v2float Function
+    %param_2 = OpVariable %_ptr_Function_v2float Function
+        %pca = OpVariable %_ptr_Function_float Function
+    %param_3 = OpVariable %_ptr_Function_v2float Function
+    %param_4 = OpVariable %_ptr_Function_v2float Function
+         %87 = OpAccessChain %_ptr_Function_float %p %uint_0
+         %88 = OpLoad %float %87
+         %89 = OpAccessChain %_ptr_Function_float %a_0 %uint_0
+         %90 = OpLoad %float %89
+         %91 = OpFSub %float %88 %90
+         %92 = OpAccessChain %_ptr_Function_float %p %uint_1
+         %93 = OpLoad %float %92
+         %94 = OpAccessChain %_ptr_Function_float %a_0 %uint_1
+         %95 = OpLoad %float %94
+         %96 = OpFSub %float %93 %95
+         %97 = OpCompositeConstruct %v2float %91 %96
+         %98 = OpAccessChain %_ptr_Function_float %b_0 %uint_0
+         %99 = OpLoad %float %98
+        %100 = OpLoad %float %89
+        %101 = OpFSub %float %99 %100
+        %102 = OpAccessChain %_ptr_Function_float %b_0 %uint_1
+        %103 = OpLoad %float %102
+        %104 = OpLoad %float %94
+        %105 = OpFSub %float %103 %104
+        %106 = OpCompositeConstruct %v2float %101 %105
+               OpStore %param %97
+               OpStore %param_0 %106
+        %107 = OpFunctionCall %float %cross2d_vf2_vf2_ %param %param_0
+               OpStore %pab %107
+        %108 = OpLoad %float %87
+        %109 = OpLoad %float %98
+        %110 = OpFSub %float %108 %109
+        %111 = OpLoad %float %92
+        %112 = OpLoad %float %102
+        %113 = OpFSub %float %111 %112
+        %114 = OpCompositeConstruct %v2float %110 %113
+        %115 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %116 = OpLoad %float %115
+        %117 = OpLoad %float %98
+        %118 = OpFSub %float %116 %117
+        %119 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %120 = OpLoad %float %119
+        %121 = OpLoad %float %102
+        %122 = OpFSub %float %120 %121
+        %123 = OpCompositeConstruct %v2float %118 %122
+               OpStore %param_1 %114
+               OpStore %param_2 %123
+        %124 = OpFunctionCall %float %cross2d_vf2_vf2_ %param_1 %param_2
+               OpStore %pbc %124
+        %125 = OpLoad %float %pab
+        %126 = OpFOrdLessThan %bool %125 %float_0
+        %127 = OpLoad %float %pbc
+        %128 = OpFOrdLessThan %bool %127 %float_0
+        %129 = OpLogicalAnd %bool %126 %128
+        %130 = OpLogicalNot %bool %129
+               OpSelectionMerge %131 None
+               OpBranchConditional %130 %132 %131
+        %132 = OpLabel
+        %133 = OpLoad %float %pab
+        %134 = OpFOrdGreaterThanEqual %bool %133 %float_0
+        %135 = OpLoad %float %pbc
+        %136 = OpFOrdGreaterThanEqual %bool %135 %float_0
+        %137 = OpLogicalAnd %bool %134 %136
+               OpBranch %131
+        %131 = OpLabel
+        %138 = OpPhi %bool %129 %86 %137 %132
+        %139 = OpLogicalNot %bool %138
+               OpSelectionMerge %140 None
+               OpBranchConditional %139 %141 %140
+        %141 = OpLabel
+               OpReturnValue %int_0
+        %140 = OpLabel
+        %142 = OpLoad %float %87
+        %143 = OpLoad %float %115
+        %144 = OpFSub %float %142 %143
+        %145 = OpLoad %float %92
+        %146 = OpLoad %float %119
+        %147 = OpFSub %float %145 %146
+        %148 = OpCompositeConstruct %v2float %144 %147
+        %149 = OpLoad %float %89
+        %150 = OpLoad %float %115
+        %151 = OpFSub %float %149 %150
+        %152 = OpLoad %float %94
+        %153 = OpLoad %float %119
+        %154 = OpFSub %float %152 %153
+        %155 = OpCompositeConstruct %v2float %151 %154
+               OpStore %param_3 %148
+               OpStore %param_4 %155
+        %156 = OpFunctionCall %float %cross2d_vf2_vf2_ %param_3 %param_4
+               OpStore %pca %156
+        %157 = OpLoad %float %pab
+        %158 = OpFOrdLessThan %bool %157 %float_0
+        %159 = OpLoad %float %pca
+        %160 = OpFOrdLessThan %bool %159 %float_0
+        %161 = OpLogicalAnd %bool %158 %160
+        %162 = OpLogicalNot %bool %161
+               OpSelectionMerge %163 None
+               OpBranchConditional %162 %164 %163
+        %164 = OpLabel
+        %165 = OpLoad %float %pab
+        %166 = OpFOrdGreaterThanEqual %bool %165 %float_0
+        %167 = OpLoad %float %pca
+        %168 = OpFOrdGreaterThanEqual %bool %167 %float_0
+        %169 = OpLogicalAnd %bool %166 %168
+               OpBranch %163
+        %163 = OpLabel
+        %170 = OpPhi %bool %161 %140 %169 %164
+        %171 = OpLogicalNot %bool %170
+               OpSelectionMerge %172 None
+               OpBranchConditional %171 %173 %172
+        %173 = OpLabel
+               OpReturnValue %int_0
+        %172 = OpLabel
+               OpReturnValue %int_1
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..421b7ed
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.spvasm.expected.hlsl
@@ -0,0 +1,141 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_24 : register(b0, space0) {
+  uint4 x_24[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float cross2d_vf2_vf2_(inout float2 a, inout float2 b) {
+  const float x_76 = a.x;
+  const float x_78 = b.y;
+  const float x_81 = b.x;
+  const float x_83 = a.y;
+  return ((x_76 * x_78) - (x_81 * x_83));
+}
+
+int pointInTriangle_vf2_vf2_vf2_vf2_(inout float2 p, inout float2 a_1, inout float2 b_1, inout float2 c) {
+  float pab = 0.0f;
+  float2 param = float2(0.0f, 0.0f);
+  float2 param_1 = float2(0.0f, 0.0f);
+  float pbc = 0.0f;
+  float2 param_2 = float2(0.0f, 0.0f);
+  float2 param_3 = float2(0.0f, 0.0f);
+  float pca = 0.0f;
+  float2 param_4 = float2(0.0f, 0.0f);
+  float2 param_5 = float2(0.0f, 0.0f);
+  bool x_137 = false;
+  bool x_169 = false;
+  bool x_138_phi = false;
+  bool x_170_phi = false;
+  const float x_88 = p.x;
+  const float x_90 = a_1.x;
+  const float x_93 = p.y;
+  const float x_95 = a_1.y;
+  const float x_99 = b_1.x;
+  const float x_100 = a_1.x;
+  const float x_103 = b_1.y;
+  const float x_104 = a_1.y;
+  param = float2((x_88 - x_90), (x_93 - x_95));
+  param_1 = float2((x_99 - x_100), (x_103 - x_104));
+  const float x_107 = cross2d_vf2_vf2_(param, param_1);
+  pab = x_107;
+  const float x_108 = p.x;
+  const float x_109 = b_1.x;
+  const float x_111 = p.y;
+  const float x_112 = b_1.y;
+  const float x_116 = c.x;
+  const float x_117 = b_1.x;
+  const float x_120 = c.y;
+  const float x_121 = b_1.y;
+  param_2 = float2((x_108 - x_109), (x_111 - x_112));
+  param_3 = float2((x_116 - x_117), (x_120 - x_121));
+  const float x_124 = cross2d_vf2_vf2_(param_2, param_3);
+  pbc = x_124;
+  bool tint_tmp = (pab < 0.0f);
+  if (tint_tmp) {
+    tint_tmp = (pbc < 0.0f);
+  }
+  const bool x_129 = (tint_tmp);
+  x_138_phi = x_129;
+  if (!(x_129)) {
+    bool tint_tmp_1 = (pab >= 0.0f);
+    if (tint_tmp_1) {
+      tint_tmp_1 = (pbc >= 0.0f);
+    }
+    x_137 = (tint_tmp_1);
+    x_138_phi = x_137;
+  }
+  if (!(x_138_phi)) {
+    return 0;
+  }
+  const float x_142 = p.x;
+  const float x_143 = c.x;
+  const float x_145 = p.y;
+  const float x_146 = c.y;
+  const float x_149 = a_1.x;
+  const float x_150 = c.x;
+  const float x_152 = a_1.y;
+  const float x_153 = c.y;
+  param_4 = float2((x_142 - x_143), (x_145 - x_146));
+  param_5 = float2((x_149 - x_150), (x_152 - x_153));
+  const float x_156 = cross2d_vf2_vf2_(param_4, param_5);
+  pca = x_156;
+  bool tint_tmp_2 = (pab < 0.0f);
+  if (tint_tmp_2) {
+    tint_tmp_2 = (pca < 0.0f);
+  }
+  const bool x_161 = (tint_tmp_2);
+  x_170_phi = x_161;
+  if (!(x_161)) {
+    bool tint_tmp_3 = (pab >= 0.0f);
+    if (tint_tmp_3) {
+      tint_tmp_3 = (pca >= 0.0f);
+    }
+    x_169 = (tint_tmp_3);
+    x_170_phi = x_169;
+  }
+  if (!(x_170_phi)) {
+    return 0;
+  }
+  return 1;
+}
+
+void main_1() {
+  float2 pos = float2(0.0f, 0.0f);
+  float2 param_6 = float2(0.0f, 0.0f);
+  float2 param_7 = float2(0.0f, 0.0f);
+  float2 param_8 = float2(0.0f, 0.0f);
+  float2 param_9 = float2(0.0f, 0.0f);
+  const float4 x_63 = gl_FragCoord;
+  const float2 x_66 = asfloat(x_24[0].xy);
+  pos = (float2(x_63.x, x_63.y) / x_66);
+  param_6 = pos;
+  param_7 = float2(0.699999988f, 0.300000012f);
+  param_8 = float2(0.5f, 0.899999976f);
+  param_9 = float2(0.100000001f, 0.400000006f);
+  const int x_69 = pointInTriangle_vf2_vf2_vf2_vf2_(param_6, param_7, param_8, param_9);
+  if ((x_69 == 1)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.spvasm.expected.msl
new file mode 100644
index 0000000..ed7f078
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.spvasm.expected.msl
@@ -0,0 +1,135 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float cross2d_vf2_vf2_(thread float2* const a, thread float2* const b) {
+  float const x_76 = (*(a)).x;
+  float const x_78 = (*(b)).y;
+  float const x_81 = (*(b)).x;
+  float const x_83 = (*(a)).y;
+  return ((x_76 * x_78) - (x_81 * x_83));
+}
+
+int pointInTriangle_vf2_vf2_vf2_vf2_(thread float2* const p, thread float2* const a_1, thread float2* const b_1, thread float2* const c) {
+  float pab = 0.0f;
+  float2 param = 0.0f;
+  float2 param_1 = 0.0f;
+  float pbc = 0.0f;
+  float2 param_2 = 0.0f;
+  float2 param_3 = 0.0f;
+  float pca = 0.0f;
+  float2 param_4 = 0.0f;
+  float2 param_5 = 0.0f;
+  bool x_137 = false;
+  bool x_169 = false;
+  bool x_138_phi = false;
+  bool x_170_phi = false;
+  float const x_88 = (*(p)).x;
+  float const x_90 = (*(a_1)).x;
+  float const x_93 = (*(p)).y;
+  float const x_95 = (*(a_1)).y;
+  float const x_99 = (*(b_1)).x;
+  float const x_100 = (*(a_1)).x;
+  float const x_103 = (*(b_1)).y;
+  float const x_104 = (*(a_1)).y;
+  param = float2((x_88 - x_90), (x_93 - x_95));
+  param_1 = float2((x_99 - x_100), (x_103 - x_104));
+  float const x_107 = cross2d_vf2_vf2_(&(param), &(param_1));
+  pab = x_107;
+  float const x_108 = (*(p)).x;
+  float const x_109 = (*(b_1)).x;
+  float const x_111 = (*(p)).y;
+  float const x_112 = (*(b_1)).y;
+  float const x_116 = (*(c)).x;
+  float const x_117 = (*(b_1)).x;
+  float const x_120 = (*(c)).y;
+  float const x_121 = (*(b_1)).y;
+  param_2 = float2((x_108 - x_109), (x_111 - x_112));
+  param_3 = float2((x_116 - x_117), (x_120 - x_121));
+  float const x_124 = cross2d_vf2_vf2_(&(param_2), &(param_3));
+  pbc = x_124;
+  float const x_125 = pab;
+  float const x_127 = pbc;
+  bool const x_129 = ((x_125 < 0.0f) && (x_127 < 0.0f));
+  x_138_phi = x_129;
+  if (!(x_129)) {
+    float const x_133 = pab;
+    float const x_135 = pbc;
+    x_137 = ((x_133 >= 0.0f) && (x_135 >= 0.0f));
+    x_138_phi = x_137;
+  }
+  bool const x_138 = x_138_phi;
+  if (!(x_138)) {
+    return 0;
+  }
+  float const x_142 = (*(p)).x;
+  float const x_143 = (*(c)).x;
+  float const x_145 = (*(p)).y;
+  float const x_146 = (*(c)).y;
+  float const x_149 = (*(a_1)).x;
+  float const x_150 = (*(c)).x;
+  float const x_152 = (*(a_1)).y;
+  float const x_153 = (*(c)).y;
+  param_4 = float2((x_142 - x_143), (x_145 - x_146));
+  param_5 = float2((x_149 - x_150), (x_152 - x_153));
+  float const x_156 = cross2d_vf2_vf2_(&(param_4), &(param_5));
+  pca = x_156;
+  float const x_157 = pab;
+  float const x_159 = pca;
+  bool const x_161 = ((x_157 < 0.0f) && (x_159 < 0.0f));
+  x_170_phi = x_161;
+  if (!(x_161)) {
+    float const x_165 = pab;
+    float const x_167 = pca;
+    x_169 = ((x_165 >= 0.0f) && (x_167 >= 0.0f));
+    x_170_phi = x_169;
+  }
+  bool const x_170 = x_170_phi;
+  if (!(x_170)) {
+    return 0;
+  }
+  return 1;
+}
+
+void main_1(constant buf0& x_24, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float2 pos = 0.0f;
+  float2 param_6 = 0.0f;
+  float2 param_7 = 0.0f;
+  float2 param_8 = 0.0f;
+  float2 param_9 = 0.0f;
+  float4 const x_63 = *(tint_symbol_5);
+  float2 const x_66 = x_24.resolution;
+  pos = (float2(x_63.x, x_63.y) / x_66);
+  float2 const x_68 = pos;
+  param_6 = x_68;
+  param_7 = float2(0.699999988f, 0.300000012f);
+  param_8 = float2(0.5f, 0.899999976f);
+  param_9 = float2(0.100000001f, 0.400000006f);
+  int const x_69 = pointInTriangle_vf2_vf2_vf2_vf2_(&(param_6), &(param_7), &(param_8), &(param_9));
+  if ((x_69 == 1)) {
+    *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_6) = float4(0.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_24 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_24, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..dadcc8e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.spvasm.expected.spvasm
@@ -0,0 +1,343 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 264
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_24 "x_24"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %cross2d_vf2_vf2_ "cross2d_vf2_vf2_"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %pointInTriangle_vf2_vf2_vf2_vf2_ "pointInTriangle_vf2_vf2_vf2_vf2_"
+               OpName %p "p"
+               OpName %a_1 "a_1"
+               OpName %b_1 "b_1"
+               OpName %c "c"
+               OpName %pab "pab"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %pbc "pbc"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %pca "pca"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpName %x_137 "x_137"
+               OpName %x_169 "x_169"
+               OpName %x_138_phi "x_138_phi"
+               OpName %x_170_phi "x_170_phi"
+               OpName %main_1 "main_1"
+               OpName %pos "pos"
+               OpName %param_6 "param_6"
+               OpName %param_7 "param_7"
+               OpName %param_8 "param_8"
+               OpName %param_9 "param_9"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_24 NonWritable
+               OpDecorate %x_24 DescriptorSet 0
+               OpDecorate %x_24 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_24 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %15 = OpTypeFunction %float %_ptr_Function_v2float %_ptr_Function_v2float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+        %int = OpTypeInt 32 1
+         %40 = OpTypeFunction %int %_ptr_Function_v2float %_ptr_Function_v2float %_ptr_Function_v2float %_ptr_Function_v2float
+         %49 = OpConstantNull %float
+         %51 = OpConstantNull %v2float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %62 = OpConstantNull %bool
+    %float_0 = OpConstant %float 0
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+       %void = OpTypeVoid
+        %212 = OpTypeFunction %void
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+%float_0_699999988 = OpConstant %float 0.699999988
+%float_0_300000012 = OpConstant %float 0.300000012
+        %232 = OpConstantComposite %v2float %float_0_699999988 %float_0_300000012
+  %float_0_5 = OpConstant %float 0.5
+%float_0_899999976 = OpConstant %float 0.899999976
+        %235 = OpConstantComposite %v2float %float_0_5 %float_0_899999976
+%float_0_100000001 = OpConstant %float 0.100000001
+%float_0_400000006 = OpConstant %float 0.400000006
+        %238 = OpConstantComposite %v2float %float_0_100000001 %float_0_400000006
+    %float_1 = OpConstant %float 1
+        %249 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %250 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %251 = OpTypeFunction %void %main_out
+%cross2d_vf2_vf2_ = OpFunction %float None %15
+          %a = OpFunctionParameter %_ptr_Function_v2float
+          %b = OpFunctionParameter %_ptr_Function_v2float
+         %20 = OpLabel
+         %25 = OpAccessChain %_ptr_Function_float %a %uint_0
+         %26 = OpLoad %float %25
+         %29 = OpAccessChain %_ptr_Function_float %b %uint_1
+         %30 = OpLoad %float %29
+         %32 = OpAccessChain %_ptr_Function_float %b %uint_0
+         %33 = OpLoad %float %32
+         %35 = OpAccessChain %_ptr_Function_float %a %uint_1
+         %36 = OpLoad %float %35
+         %37 = OpFMul %float %26 %30
+         %38 = OpFMul %float %33 %36
+         %39 = OpFSub %float %37 %38
+               OpReturnValue %39
+               OpFunctionEnd
+%pointInTriangle_vf2_vf2_vf2_vf2_ = OpFunction %int None %40
+          %p = OpFunctionParameter %_ptr_Function_v2float
+        %a_1 = OpFunctionParameter %_ptr_Function_v2float
+        %b_1 = OpFunctionParameter %_ptr_Function_v2float
+          %c = OpFunctionParameter %_ptr_Function_v2float
+         %47 = OpLabel
+        %pab = OpVariable %_ptr_Function_float Function %49
+      %param = OpVariable %_ptr_Function_v2float Function %51
+    %param_1 = OpVariable %_ptr_Function_v2float Function %51
+        %pbc = OpVariable %_ptr_Function_float Function %49
+    %param_2 = OpVariable %_ptr_Function_v2float Function %51
+    %param_3 = OpVariable %_ptr_Function_v2float Function %51
+        %pca = OpVariable %_ptr_Function_float Function %49
+    %param_4 = OpVariable %_ptr_Function_v2float Function %51
+    %param_5 = OpVariable %_ptr_Function_v2float Function %51
+      %x_137 = OpVariable %_ptr_Function_bool Function %62
+      %x_169 = OpVariable %_ptr_Function_bool Function %62
+  %x_138_phi = OpVariable %_ptr_Function_bool Function %62
+  %x_170_phi = OpVariable %_ptr_Function_bool Function %62
+         %67 = OpAccessChain %_ptr_Function_float %p %uint_0
+         %68 = OpLoad %float %67
+         %70 = OpAccessChain %_ptr_Function_float %a_1 %uint_0
+         %71 = OpLoad %float %70
+         %73 = OpAccessChain %_ptr_Function_float %p %uint_1
+         %74 = OpLoad %float %73
+         %76 = OpAccessChain %_ptr_Function_float %a_1 %uint_1
+         %77 = OpLoad %float %76
+         %79 = OpAccessChain %_ptr_Function_float %b_1 %uint_0
+         %80 = OpLoad %float %79
+         %82 = OpAccessChain %_ptr_Function_float %a_1 %uint_0
+         %83 = OpLoad %float %82
+         %85 = OpAccessChain %_ptr_Function_float %b_1 %uint_1
+         %86 = OpLoad %float %85
+         %88 = OpAccessChain %_ptr_Function_float %a_1 %uint_1
+         %89 = OpLoad %float %88
+         %90 = OpFSub %float %68 %71
+         %91 = OpFSub %float %74 %77
+         %92 = OpCompositeConstruct %v2float %90 %91
+               OpStore %param %92
+         %93 = OpFSub %float %80 %83
+         %94 = OpFSub %float %86 %89
+         %95 = OpCompositeConstruct %v2float %93 %94
+               OpStore %param_1 %95
+         %96 = OpFunctionCall %float %cross2d_vf2_vf2_ %param %param_1
+               OpStore %pab %96
+        %100 = OpAccessChain %_ptr_Function_float %p %uint_0
+        %101 = OpLoad %float %100
+        %103 = OpAccessChain %_ptr_Function_float %b_1 %uint_0
+        %104 = OpLoad %float %103
+        %106 = OpAccessChain %_ptr_Function_float %p %uint_1
+        %107 = OpLoad %float %106
+        %109 = OpAccessChain %_ptr_Function_float %b_1 %uint_1
+        %110 = OpLoad %float %109
+        %112 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %113 = OpLoad %float %112
+        %115 = OpAccessChain %_ptr_Function_float %b_1 %uint_0
+        %116 = OpLoad %float %115
+        %118 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %119 = OpLoad %float %118
+        %121 = OpAccessChain %_ptr_Function_float %b_1 %uint_1
+        %122 = OpLoad %float %121
+        %123 = OpFSub %float %101 %104
+        %124 = OpFSub %float %107 %110
+        %125 = OpCompositeConstruct %v2float %123 %124
+               OpStore %param_2 %125
+        %126 = OpFSub %float %113 %116
+        %127 = OpFSub %float %119 %122
+        %128 = OpCompositeConstruct %v2float %126 %127
+               OpStore %param_3 %128
+        %129 = OpFunctionCall %float %cross2d_vf2_vf2_ %param_2 %param_3
+               OpStore %pbc %129
+        %132 = OpLoad %float %pab
+        %133 = OpLoad %float %pbc
+        %135 = OpFOrdLessThan %bool %132 %float_0
+               OpSelectionMerge %136 None
+               OpBranchConditional %135 %137 %136
+        %137 = OpLabel
+        %138 = OpFOrdLessThan %bool %133 %float_0
+               OpBranch %136
+        %136 = OpLabel
+        %139 = OpPhi %bool %135 %47 %138 %137
+               OpStore %x_138_phi %139
+        %140 = OpLogicalNot %bool %139
+               OpSelectionMerge %141 None
+               OpBranchConditional %140 %142 %141
+        %142 = OpLabel
+        %143 = OpLoad %float %pab
+        %144 = OpLoad %float %pbc
+        %145 = OpFOrdGreaterThanEqual %bool %143 %float_0
+               OpSelectionMerge %146 None
+               OpBranchConditional %145 %147 %146
+        %147 = OpLabel
+        %148 = OpFOrdGreaterThanEqual %bool %144 %float_0
+               OpBranch %146
+        %146 = OpLabel
+        %149 = OpPhi %bool %145 %142 %148 %147
+               OpStore %x_137 %149
+        %150 = OpLoad %bool %x_137
+               OpStore %x_138_phi %150
+               OpBranch %141
+        %141 = OpLabel
+        %151 = OpLoad %bool %x_138_phi
+        %152 = OpLogicalNot %bool %151
+               OpSelectionMerge %153 None
+               OpBranchConditional %152 %154 %153
+        %154 = OpLabel
+               OpReturnValue %int_0
+        %153 = OpLabel
+        %157 = OpAccessChain %_ptr_Function_float %p %uint_0
+        %158 = OpLoad %float %157
+        %160 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %161 = OpLoad %float %160
+        %163 = OpAccessChain %_ptr_Function_float %p %uint_1
+        %164 = OpLoad %float %163
+        %166 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %167 = OpLoad %float %166
+        %169 = OpAccessChain %_ptr_Function_float %a_1 %uint_0
+        %170 = OpLoad %float %169
+        %172 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %173 = OpLoad %float %172
+        %175 = OpAccessChain %_ptr_Function_float %a_1 %uint_1
+        %176 = OpLoad %float %175
+        %178 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %179 = OpLoad %float %178
+        %180 = OpFSub %float %158 %161
+        %181 = OpFSub %float %164 %167
+        %182 = OpCompositeConstruct %v2float %180 %181
+               OpStore %param_4 %182
+        %183 = OpFSub %float %170 %173
+        %184 = OpFSub %float %176 %179
+        %185 = OpCompositeConstruct %v2float %183 %184
+               OpStore %param_5 %185
+        %186 = OpFunctionCall %float %cross2d_vf2_vf2_ %param_4 %param_5
+               OpStore %pca %186
+        %189 = OpLoad %float %pab
+        %190 = OpLoad %float %pca
+        %191 = OpFOrdLessThan %bool %189 %float_0
+               OpSelectionMerge %192 None
+               OpBranchConditional %191 %193 %192
+        %193 = OpLabel
+        %194 = OpFOrdLessThan %bool %190 %float_0
+               OpBranch %192
+        %192 = OpLabel
+        %195 = OpPhi %bool %191 %153 %194 %193
+               OpStore %x_170_phi %195
+        %196 = OpLogicalNot %bool %195
+               OpSelectionMerge %197 None
+               OpBranchConditional %196 %198 %197
+        %198 = OpLabel
+        %199 = OpLoad %float %pab
+        %200 = OpLoad %float %pca
+        %201 = OpFOrdGreaterThanEqual %bool %199 %float_0
+               OpSelectionMerge %202 None
+               OpBranchConditional %201 %203 %202
+        %203 = OpLabel
+        %204 = OpFOrdGreaterThanEqual %bool %200 %float_0
+               OpBranch %202
+        %202 = OpLabel
+        %205 = OpPhi %bool %201 %198 %204 %203
+               OpStore %x_169 %205
+        %206 = OpLoad %bool %x_169
+               OpStore %x_170_phi %206
+               OpBranch %197
+        %197 = OpLabel
+        %207 = OpLoad %bool %x_170_phi
+        %208 = OpLogicalNot %bool %207
+               OpSelectionMerge %209 None
+               OpBranchConditional %208 %210 %209
+        %210 = OpLabel
+               OpReturnValue %int_0
+        %209 = OpLabel
+               OpReturnValue %int_1
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %212
+        %215 = OpLabel
+        %pos = OpVariable %_ptr_Function_v2float Function %51
+    %param_6 = OpVariable %_ptr_Function_v2float Function %51
+    %param_7 = OpVariable %_ptr_Function_v2float Function %51
+    %param_8 = OpVariable %_ptr_Function_v2float Function %51
+    %param_9 = OpVariable %_ptr_Function_v2float Function %51
+        %221 = OpLoad %v4float %gl_FragCoord
+        %223 = OpAccessChain %_ptr_Uniform_v2float %x_24 %uint_0
+        %224 = OpLoad %v2float %223
+        %225 = OpCompositeExtract %float %221 0
+        %226 = OpCompositeExtract %float %221 1
+        %227 = OpCompositeConstruct %v2float %225 %226
+        %228 = OpFDiv %v2float %227 %224
+               OpStore %pos %228
+        %229 = OpLoad %v2float %pos
+               OpStore %param_6 %229
+               OpStore %param_7 %232
+               OpStore %param_8 %235
+               OpStore %param_9 %238
+        %239 = OpFunctionCall %int %pointInTriangle_vf2_vf2_vf2_vf2_ %param_6 %param_7 %param_8 %param_9
+        %244 = OpIEqual %bool %239 %int_1
+               OpSelectionMerge %245 None
+               OpBranchConditional %244 %246 %247
+        %246 = OpLabel
+               OpStore %x_GLF_color %249
+               OpBranch %245
+        %247 = OpLabel
+               OpStore %x_GLF_color %250
+               OpBranch %245
+        %245 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %251
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %255 = OpLabel
+        %256 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %256
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %212
+        %258 = OpLabel
+        %259 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %259
+        %260 = OpFunctionCall %void %main_1
+        %262 = OpLoad %v4float %x_GLF_color
+        %263 = OpCompositeConstruct %main_out %262
+        %261 = OpFunctionCall %void %tint_symbol_3 %263
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..11cfd54
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.spvasm.expected.wgsl
@@ -0,0 +1,142 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_24 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn cross2d_vf2_vf2_(a : ptr<function, vec2<f32>>, b : ptr<function, vec2<f32>>) -> f32 {
+  let x_76 : f32 = (*(a)).x;
+  let x_78 : f32 = (*(b)).y;
+  let x_81 : f32 = (*(b)).x;
+  let x_83 : f32 = (*(a)).y;
+  return ((x_76 * x_78) - (x_81 * x_83));
+}
+
+fn pointInTriangle_vf2_vf2_vf2_vf2_(p : ptr<function, vec2<f32>>, a_1 : ptr<function, vec2<f32>>, b_1 : ptr<function, vec2<f32>>, c : ptr<function, vec2<f32>>) -> i32 {
+  var pab : f32;
+  var param : vec2<f32>;
+  var param_1 : vec2<f32>;
+  var pbc : f32;
+  var param_2 : vec2<f32>;
+  var param_3 : vec2<f32>;
+  var pca : f32;
+  var param_4 : vec2<f32>;
+  var param_5 : vec2<f32>;
+  var x_137 : bool;
+  var x_169 : bool;
+  var x_138_phi : bool;
+  var x_170_phi : bool;
+  let x_87 : ptr<function, f32> = &((*(p)).x);
+  let x_88 : f32 = *(x_87);
+  let x_89 : ptr<function, f32> = &((*(a_1)).x);
+  let x_90 : f32 = *(x_89);
+  let x_92 : ptr<function, f32> = &((*(p)).y);
+  let x_93 : f32 = *(x_92);
+  let x_94 : ptr<function, f32> = &((*(a_1)).y);
+  let x_95 : f32 = *(x_94);
+  let x_98 : ptr<function, f32> = &((*(b_1)).x);
+  let x_99 : f32 = *(x_98);
+  let x_100 : f32 = *(x_89);
+  let x_102 : ptr<function, f32> = &((*(b_1)).y);
+  let x_103 : f32 = *(x_102);
+  let x_104 : f32 = *(x_94);
+  param = vec2<f32>((x_88 - x_90), (x_93 - x_95));
+  param_1 = vec2<f32>((x_99 - x_100), (x_103 - x_104));
+  let x_107 : f32 = cross2d_vf2_vf2_(&(param), &(param_1));
+  pab = x_107;
+  let x_108 : f32 = *(x_87);
+  let x_109 : f32 = *(x_98);
+  let x_111 : f32 = *(x_92);
+  let x_112 : f32 = *(x_102);
+  let x_115 : ptr<function, f32> = &((*(c)).x);
+  let x_116 : f32 = *(x_115);
+  let x_117 : f32 = *(x_98);
+  let x_119 : ptr<function, f32> = &((*(c)).y);
+  let x_120 : f32 = *(x_119);
+  let x_121 : f32 = *(x_102);
+  param_2 = vec2<f32>((x_108 - x_109), (x_111 - x_112));
+  param_3 = vec2<f32>((x_116 - x_117), (x_120 - x_121));
+  let x_124 : f32 = cross2d_vf2_vf2_(&(param_2), &(param_3));
+  pbc = x_124;
+  let x_125 : f32 = pab;
+  let x_127 : f32 = pbc;
+  let x_129 : bool = ((x_125 < 0.0) && (x_127 < 0.0));
+  x_138_phi = x_129;
+  if (!(x_129)) {
+    let x_133 : f32 = pab;
+    let x_135 : f32 = pbc;
+    x_137 = ((x_133 >= 0.0) && (x_135 >= 0.0));
+    x_138_phi = x_137;
+  }
+  let x_138 : bool = x_138_phi;
+  if (!(x_138)) {
+    return 0;
+  }
+  let x_142 : f32 = *(x_87);
+  let x_143 : f32 = *(x_115);
+  let x_145 : f32 = *(x_92);
+  let x_146 : f32 = *(x_119);
+  let x_149 : f32 = *(x_89);
+  let x_150 : f32 = *(x_115);
+  let x_152 : f32 = *(x_94);
+  let x_153 : f32 = *(x_119);
+  param_4 = vec2<f32>((x_142 - x_143), (x_145 - x_146));
+  param_5 = vec2<f32>((x_149 - x_150), (x_152 - x_153));
+  let x_156 : f32 = cross2d_vf2_vf2_(&(param_4), &(param_5));
+  pca = x_156;
+  let x_157 : f32 = pab;
+  let x_159 : f32 = pca;
+  let x_161 : bool = ((x_157 < 0.0) && (x_159 < 0.0));
+  x_170_phi = x_161;
+  if (!(x_161)) {
+    let x_165 : f32 = pab;
+    let x_167 : f32 = pca;
+    x_169 = ((x_165 >= 0.0) && (x_167 >= 0.0));
+    x_170_phi = x_169;
+  }
+  let x_170 : bool = x_170_phi;
+  if (!(x_170)) {
+    return 0;
+  }
+  return 1;
+}
+
+fn main_1() {
+  var pos : vec2<f32>;
+  var param_6 : vec2<f32>;
+  var param_7 : vec2<f32>;
+  var param_8 : vec2<f32>;
+  var param_9 : vec2<f32>;
+  let x_63 : vec4<f32> = gl_FragCoord;
+  let x_66 : vec2<f32> = x_24.resolution;
+  pos = (vec2<f32>(x_63.x, x_63.y) / x_66);
+  let x_68 : vec2<f32> = pos;
+  param_6 = x_68;
+  param_7 = vec2<f32>(0.699999988, 0.300000012);
+  param_8 = vec2<f32>(0.5, 0.899999976);
+  param_9 = vec2<f32>(0.100000001, 0.400000006);
+  let x_69 : i32 = pointInTriangle_vf2_vf2_vf2_vf2_(&(param_6), &(param_7), &(param_8), &(param_9));
+  if ((x_69 == 1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.wgsl
new file mode 100644
index 0000000..11cfd54
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.wgsl
@@ -0,0 +1,142 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_24 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn cross2d_vf2_vf2_(a : ptr<function, vec2<f32>>, b : ptr<function, vec2<f32>>) -> f32 {
+  let x_76 : f32 = (*(a)).x;
+  let x_78 : f32 = (*(b)).y;
+  let x_81 : f32 = (*(b)).x;
+  let x_83 : f32 = (*(a)).y;
+  return ((x_76 * x_78) - (x_81 * x_83));
+}
+
+fn pointInTriangle_vf2_vf2_vf2_vf2_(p : ptr<function, vec2<f32>>, a_1 : ptr<function, vec2<f32>>, b_1 : ptr<function, vec2<f32>>, c : ptr<function, vec2<f32>>) -> i32 {
+  var pab : f32;
+  var param : vec2<f32>;
+  var param_1 : vec2<f32>;
+  var pbc : f32;
+  var param_2 : vec2<f32>;
+  var param_3 : vec2<f32>;
+  var pca : f32;
+  var param_4 : vec2<f32>;
+  var param_5 : vec2<f32>;
+  var x_137 : bool;
+  var x_169 : bool;
+  var x_138_phi : bool;
+  var x_170_phi : bool;
+  let x_87 : ptr<function, f32> = &((*(p)).x);
+  let x_88 : f32 = *(x_87);
+  let x_89 : ptr<function, f32> = &((*(a_1)).x);
+  let x_90 : f32 = *(x_89);
+  let x_92 : ptr<function, f32> = &((*(p)).y);
+  let x_93 : f32 = *(x_92);
+  let x_94 : ptr<function, f32> = &((*(a_1)).y);
+  let x_95 : f32 = *(x_94);
+  let x_98 : ptr<function, f32> = &((*(b_1)).x);
+  let x_99 : f32 = *(x_98);
+  let x_100 : f32 = *(x_89);
+  let x_102 : ptr<function, f32> = &((*(b_1)).y);
+  let x_103 : f32 = *(x_102);
+  let x_104 : f32 = *(x_94);
+  param = vec2<f32>((x_88 - x_90), (x_93 - x_95));
+  param_1 = vec2<f32>((x_99 - x_100), (x_103 - x_104));
+  let x_107 : f32 = cross2d_vf2_vf2_(&(param), &(param_1));
+  pab = x_107;
+  let x_108 : f32 = *(x_87);
+  let x_109 : f32 = *(x_98);
+  let x_111 : f32 = *(x_92);
+  let x_112 : f32 = *(x_102);
+  let x_115 : ptr<function, f32> = &((*(c)).x);
+  let x_116 : f32 = *(x_115);
+  let x_117 : f32 = *(x_98);
+  let x_119 : ptr<function, f32> = &((*(c)).y);
+  let x_120 : f32 = *(x_119);
+  let x_121 : f32 = *(x_102);
+  param_2 = vec2<f32>((x_108 - x_109), (x_111 - x_112));
+  param_3 = vec2<f32>((x_116 - x_117), (x_120 - x_121));
+  let x_124 : f32 = cross2d_vf2_vf2_(&(param_2), &(param_3));
+  pbc = x_124;
+  let x_125 : f32 = pab;
+  let x_127 : f32 = pbc;
+  let x_129 : bool = ((x_125 < 0.0) && (x_127 < 0.0));
+  x_138_phi = x_129;
+  if (!(x_129)) {
+    let x_133 : f32 = pab;
+    let x_135 : f32 = pbc;
+    x_137 = ((x_133 >= 0.0) && (x_135 >= 0.0));
+    x_138_phi = x_137;
+  }
+  let x_138 : bool = x_138_phi;
+  if (!(x_138)) {
+    return 0;
+  }
+  let x_142 : f32 = *(x_87);
+  let x_143 : f32 = *(x_115);
+  let x_145 : f32 = *(x_92);
+  let x_146 : f32 = *(x_119);
+  let x_149 : f32 = *(x_89);
+  let x_150 : f32 = *(x_115);
+  let x_152 : f32 = *(x_94);
+  let x_153 : f32 = *(x_119);
+  param_4 = vec2<f32>((x_142 - x_143), (x_145 - x_146));
+  param_5 = vec2<f32>((x_149 - x_150), (x_152 - x_153));
+  let x_156 : f32 = cross2d_vf2_vf2_(&(param_4), &(param_5));
+  pca = x_156;
+  let x_157 : f32 = pab;
+  let x_159 : f32 = pca;
+  let x_161 : bool = ((x_157 < 0.0) && (x_159 < 0.0));
+  x_170_phi = x_161;
+  if (!(x_161)) {
+    let x_165 : f32 = pab;
+    let x_167 : f32 = pca;
+    x_169 = ((x_165 >= 0.0) && (x_167 >= 0.0));
+    x_170_phi = x_169;
+  }
+  let x_170 : bool = x_170_phi;
+  if (!(x_170)) {
+    return 0;
+  }
+  return 1;
+}
+
+fn main_1() {
+  var pos : vec2<f32>;
+  var param_6 : vec2<f32>;
+  var param_7 : vec2<f32>;
+  var param_8 : vec2<f32>;
+  var param_9 : vec2<f32>;
+  let x_63 : vec4<f32> = gl_FragCoord;
+  let x_66 : vec2<f32> = x_24.resolution;
+  pos = (vec2<f32>(x_63.x, x_63.y) / x_66);
+  let x_68 : vec2<f32> = pos;
+  param_6 = x_68;
+  param_7 = vec2<f32>(0.699999988, 0.300000012);
+  param_8 = vec2<f32>(0.5, 0.899999976);
+  param_9 = vec2<f32>(0.100000001, 0.400000006);
+  let x_69 : i32 = pointInTriangle_vf2_vf2_vf2_vf2_(&(param_6), &(param_7), &(param_8), &(param_9));
+  if ((x_69 == 1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..421b7ed
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.wgsl.expected.hlsl
@@ -0,0 +1,141 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_24 : register(b0, space0) {
+  uint4 x_24[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float cross2d_vf2_vf2_(inout float2 a, inout float2 b) {
+  const float x_76 = a.x;
+  const float x_78 = b.y;
+  const float x_81 = b.x;
+  const float x_83 = a.y;
+  return ((x_76 * x_78) - (x_81 * x_83));
+}
+
+int pointInTriangle_vf2_vf2_vf2_vf2_(inout float2 p, inout float2 a_1, inout float2 b_1, inout float2 c) {
+  float pab = 0.0f;
+  float2 param = float2(0.0f, 0.0f);
+  float2 param_1 = float2(0.0f, 0.0f);
+  float pbc = 0.0f;
+  float2 param_2 = float2(0.0f, 0.0f);
+  float2 param_3 = float2(0.0f, 0.0f);
+  float pca = 0.0f;
+  float2 param_4 = float2(0.0f, 0.0f);
+  float2 param_5 = float2(0.0f, 0.0f);
+  bool x_137 = false;
+  bool x_169 = false;
+  bool x_138_phi = false;
+  bool x_170_phi = false;
+  const float x_88 = p.x;
+  const float x_90 = a_1.x;
+  const float x_93 = p.y;
+  const float x_95 = a_1.y;
+  const float x_99 = b_1.x;
+  const float x_100 = a_1.x;
+  const float x_103 = b_1.y;
+  const float x_104 = a_1.y;
+  param = float2((x_88 - x_90), (x_93 - x_95));
+  param_1 = float2((x_99 - x_100), (x_103 - x_104));
+  const float x_107 = cross2d_vf2_vf2_(param, param_1);
+  pab = x_107;
+  const float x_108 = p.x;
+  const float x_109 = b_1.x;
+  const float x_111 = p.y;
+  const float x_112 = b_1.y;
+  const float x_116 = c.x;
+  const float x_117 = b_1.x;
+  const float x_120 = c.y;
+  const float x_121 = b_1.y;
+  param_2 = float2((x_108 - x_109), (x_111 - x_112));
+  param_3 = float2((x_116 - x_117), (x_120 - x_121));
+  const float x_124 = cross2d_vf2_vf2_(param_2, param_3);
+  pbc = x_124;
+  bool tint_tmp = (pab < 0.0f);
+  if (tint_tmp) {
+    tint_tmp = (pbc < 0.0f);
+  }
+  const bool x_129 = (tint_tmp);
+  x_138_phi = x_129;
+  if (!(x_129)) {
+    bool tint_tmp_1 = (pab >= 0.0f);
+    if (tint_tmp_1) {
+      tint_tmp_1 = (pbc >= 0.0f);
+    }
+    x_137 = (tint_tmp_1);
+    x_138_phi = x_137;
+  }
+  if (!(x_138_phi)) {
+    return 0;
+  }
+  const float x_142 = p.x;
+  const float x_143 = c.x;
+  const float x_145 = p.y;
+  const float x_146 = c.y;
+  const float x_149 = a_1.x;
+  const float x_150 = c.x;
+  const float x_152 = a_1.y;
+  const float x_153 = c.y;
+  param_4 = float2((x_142 - x_143), (x_145 - x_146));
+  param_5 = float2((x_149 - x_150), (x_152 - x_153));
+  const float x_156 = cross2d_vf2_vf2_(param_4, param_5);
+  pca = x_156;
+  bool tint_tmp_2 = (pab < 0.0f);
+  if (tint_tmp_2) {
+    tint_tmp_2 = (pca < 0.0f);
+  }
+  const bool x_161 = (tint_tmp_2);
+  x_170_phi = x_161;
+  if (!(x_161)) {
+    bool tint_tmp_3 = (pab >= 0.0f);
+    if (tint_tmp_3) {
+      tint_tmp_3 = (pca >= 0.0f);
+    }
+    x_169 = (tint_tmp_3);
+    x_170_phi = x_169;
+  }
+  if (!(x_170_phi)) {
+    return 0;
+  }
+  return 1;
+}
+
+void main_1() {
+  float2 pos = float2(0.0f, 0.0f);
+  float2 param_6 = float2(0.0f, 0.0f);
+  float2 param_7 = float2(0.0f, 0.0f);
+  float2 param_8 = float2(0.0f, 0.0f);
+  float2 param_9 = float2(0.0f, 0.0f);
+  const float4 x_63 = gl_FragCoord;
+  const float2 x_66 = asfloat(x_24[0].xy);
+  pos = (float2(x_63.x, x_63.y) / x_66);
+  param_6 = pos;
+  param_7 = float2(0.699999988f, 0.300000012f);
+  param_8 = float2(0.5f, 0.899999976f);
+  param_9 = float2(0.100000001f, 0.400000006f);
+  const int x_69 = pointInTriangle_vf2_vf2_vf2_vf2_(param_6, param_7, param_8, param_9);
+  if ((x_69 == 1)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.wgsl.expected.msl
new file mode 100644
index 0000000..ed7f078
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.wgsl.expected.msl
@@ -0,0 +1,135 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float cross2d_vf2_vf2_(thread float2* const a, thread float2* const b) {
+  float const x_76 = (*(a)).x;
+  float const x_78 = (*(b)).y;
+  float const x_81 = (*(b)).x;
+  float const x_83 = (*(a)).y;
+  return ((x_76 * x_78) - (x_81 * x_83));
+}
+
+int pointInTriangle_vf2_vf2_vf2_vf2_(thread float2* const p, thread float2* const a_1, thread float2* const b_1, thread float2* const c) {
+  float pab = 0.0f;
+  float2 param = 0.0f;
+  float2 param_1 = 0.0f;
+  float pbc = 0.0f;
+  float2 param_2 = 0.0f;
+  float2 param_3 = 0.0f;
+  float pca = 0.0f;
+  float2 param_4 = 0.0f;
+  float2 param_5 = 0.0f;
+  bool x_137 = false;
+  bool x_169 = false;
+  bool x_138_phi = false;
+  bool x_170_phi = false;
+  float const x_88 = (*(p)).x;
+  float const x_90 = (*(a_1)).x;
+  float const x_93 = (*(p)).y;
+  float const x_95 = (*(a_1)).y;
+  float const x_99 = (*(b_1)).x;
+  float const x_100 = (*(a_1)).x;
+  float const x_103 = (*(b_1)).y;
+  float const x_104 = (*(a_1)).y;
+  param = float2((x_88 - x_90), (x_93 - x_95));
+  param_1 = float2((x_99 - x_100), (x_103 - x_104));
+  float const x_107 = cross2d_vf2_vf2_(&(param), &(param_1));
+  pab = x_107;
+  float const x_108 = (*(p)).x;
+  float const x_109 = (*(b_1)).x;
+  float const x_111 = (*(p)).y;
+  float const x_112 = (*(b_1)).y;
+  float const x_116 = (*(c)).x;
+  float const x_117 = (*(b_1)).x;
+  float const x_120 = (*(c)).y;
+  float const x_121 = (*(b_1)).y;
+  param_2 = float2((x_108 - x_109), (x_111 - x_112));
+  param_3 = float2((x_116 - x_117), (x_120 - x_121));
+  float const x_124 = cross2d_vf2_vf2_(&(param_2), &(param_3));
+  pbc = x_124;
+  float const x_125 = pab;
+  float const x_127 = pbc;
+  bool const x_129 = ((x_125 < 0.0f) && (x_127 < 0.0f));
+  x_138_phi = x_129;
+  if (!(x_129)) {
+    float const x_133 = pab;
+    float const x_135 = pbc;
+    x_137 = ((x_133 >= 0.0f) && (x_135 >= 0.0f));
+    x_138_phi = x_137;
+  }
+  bool const x_138 = x_138_phi;
+  if (!(x_138)) {
+    return 0;
+  }
+  float const x_142 = (*(p)).x;
+  float const x_143 = (*(c)).x;
+  float const x_145 = (*(p)).y;
+  float const x_146 = (*(c)).y;
+  float const x_149 = (*(a_1)).x;
+  float const x_150 = (*(c)).x;
+  float const x_152 = (*(a_1)).y;
+  float const x_153 = (*(c)).y;
+  param_4 = float2((x_142 - x_143), (x_145 - x_146));
+  param_5 = float2((x_149 - x_150), (x_152 - x_153));
+  float const x_156 = cross2d_vf2_vf2_(&(param_4), &(param_5));
+  pca = x_156;
+  float const x_157 = pab;
+  float const x_159 = pca;
+  bool const x_161 = ((x_157 < 0.0f) && (x_159 < 0.0f));
+  x_170_phi = x_161;
+  if (!(x_161)) {
+    float const x_165 = pab;
+    float const x_167 = pca;
+    x_169 = ((x_165 >= 0.0f) && (x_167 >= 0.0f));
+    x_170_phi = x_169;
+  }
+  bool const x_170 = x_170_phi;
+  if (!(x_170)) {
+    return 0;
+  }
+  return 1;
+}
+
+void main_1(constant buf0& x_24, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float2 pos = 0.0f;
+  float2 param_6 = 0.0f;
+  float2 param_7 = 0.0f;
+  float2 param_8 = 0.0f;
+  float2 param_9 = 0.0f;
+  float4 const x_63 = *(tint_symbol_5);
+  float2 const x_66 = x_24.resolution;
+  pos = (float2(x_63.x, x_63.y) / x_66);
+  float2 const x_68 = pos;
+  param_6 = x_68;
+  param_7 = float2(0.699999988f, 0.300000012f);
+  param_8 = float2(0.5f, 0.899999976f);
+  param_9 = float2(0.100000001f, 0.400000006f);
+  int const x_69 = pointInTriangle_vf2_vf2_vf2_vf2_(&(param_6), &(param_7), &(param_8), &(param_9));
+  if ((x_69 == 1)) {
+    *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_6) = float4(0.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_24 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_24, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..dadcc8e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.wgsl.expected.spvasm
@@ -0,0 +1,343 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 264
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_24 "x_24"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %cross2d_vf2_vf2_ "cross2d_vf2_vf2_"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %pointInTriangle_vf2_vf2_vf2_vf2_ "pointInTriangle_vf2_vf2_vf2_vf2_"
+               OpName %p "p"
+               OpName %a_1 "a_1"
+               OpName %b_1 "b_1"
+               OpName %c "c"
+               OpName %pab "pab"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %pbc "pbc"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %pca "pca"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpName %x_137 "x_137"
+               OpName %x_169 "x_169"
+               OpName %x_138_phi "x_138_phi"
+               OpName %x_170_phi "x_170_phi"
+               OpName %main_1 "main_1"
+               OpName %pos "pos"
+               OpName %param_6 "param_6"
+               OpName %param_7 "param_7"
+               OpName %param_8 "param_8"
+               OpName %param_9 "param_9"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_24 NonWritable
+               OpDecorate %x_24 DescriptorSet 0
+               OpDecorate %x_24 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_24 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %15 = OpTypeFunction %float %_ptr_Function_v2float %_ptr_Function_v2float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+        %int = OpTypeInt 32 1
+         %40 = OpTypeFunction %int %_ptr_Function_v2float %_ptr_Function_v2float %_ptr_Function_v2float %_ptr_Function_v2float
+         %49 = OpConstantNull %float
+         %51 = OpConstantNull %v2float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %62 = OpConstantNull %bool
+    %float_0 = OpConstant %float 0
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+       %void = OpTypeVoid
+        %212 = OpTypeFunction %void
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+%float_0_699999988 = OpConstant %float 0.699999988
+%float_0_300000012 = OpConstant %float 0.300000012
+        %232 = OpConstantComposite %v2float %float_0_699999988 %float_0_300000012
+  %float_0_5 = OpConstant %float 0.5
+%float_0_899999976 = OpConstant %float 0.899999976
+        %235 = OpConstantComposite %v2float %float_0_5 %float_0_899999976
+%float_0_100000001 = OpConstant %float 0.100000001
+%float_0_400000006 = OpConstant %float 0.400000006
+        %238 = OpConstantComposite %v2float %float_0_100000001 %float_0_400000006
+    %float_1 = OpConstant %float 1
+        %249 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %250 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %251 = OpTypeFunction %void %main_out
+%cross2d_vf2_vf2_ = OpFunction %float None %15
+          %a = OpFunctionParameter %_ptr_Function_v2float
+          %b = OpFunctionParameter %_ptr_Function_v2float
+         %20 = OpLabel
+         %25 = OpAccessChain %_ptr_Function_float %a %uint_0
+         %26 = OpLoad %float %25
+         %29 = OpAccessChain %_ptr_Function_float %b %uint_1
+         %30 = OpLoad %float %29
+         %32 = OpAccessChain %_ptr_Function_float %b %uint_0
+         %33 = OpLoad %float %32
+         %35 = OpAccessChain %_ptr_Function_float %a %uint_1
+         %36 = OpLoad %float %35
+         %37 = OpFMul %float %26 %30
+         %38 = OpFMul %float %33 %36
+         %39 = OpFSub %float %37 %38
+               OpReturnValue %39
+               OpFunctionEnd
+%pointInTriangle_vf2_vf2_vf2_vf2_ = OpFunction %int None %40
+          %p = OpFunctionParameter %_ptr_Function_v2float
+        %a_1 = OpFunctionParameter %_ptr_Function_v2float
+        %b_1 = OpFunctionParameter %_ptr_Function_v2float
+          %c = OpFunctionParameter %_ptr_Function_v2float
+         %47 = OpLabel
+        %pab = OpVariable %_ptr_Function_float Function %49
+      %param = OpVariable %_ptr_Function_v2float Function %51
+    %param_1 = OpVariable %_ptr_Function_v2float Function %51
+        %pbc = OpVariable %_ptr_Function_float Function %49
+    %param_2 = OpVariable %_ptr_Function_v2float Function %51
+    %param_3 = OpVariable %_ptr_Function_v2float Function %51
+        %pca = OpVariable %_ptr_Function_float Function %49
+    %param_4 = OpVariable %_ptr_Function_v2float Function %51
+    %param_5 = OpVariable %_ptr_Function_v2float Function %51
+      %x_137 = OpVariable %_ptr_Function_bool Function %62
+      %x_169 = OpVariable %_ptr_Function_bool Function %62
+  %x_138_phi = OpVariable %_ptr_Function_bool Function %62
+  %x_170_phi = OpVariable %_ptr_Function_bool Function %62
+         %67 = OpAccessChain %_ptr_Function_float %p %uint_0
+         %68 = OpLoad %float %67
+         %70 = OpAccessChain %_ptr_Function_float %a_1 %uint_0
+         %71 = OpLoad %float %70
+         %73 = OpAccessChain %_ptr_Function_float %p %uint_1
+         %74 = OpLoad %float %73
+         %76 = OpAccessChain %_ptr_Function_float %a_1 %uint_1
+         %77 = OpLoad %float %76
+         %79 = OpAccessChain %_ptr_Function_float %b_1 %uint_0
+         %80 = OpLoad %float %79
+         %82 = OpAccessChain %_ptr_Function_float %a_1 %uint_0
+         %83 = OpLoad %float %82
+         %85 = OpAccessChain %_ptr_Function_float %b_1 %uint_1
+         %86 = OpLoad %float %85
+         %88 = OpAccessChain %_ptr_Function_float %a_1 %uint_1
+         %89 = OpLoad %float %88
+         %90 = OpFSub %float %68 %71
+         %91 = OpFSub %float %74 %77
+         %92 = OpCompositeConstruct %v2float %90 %91
+               OpStore %param %92
+         %93 = OpFSub %float %80 %83
+         %94 = OpFSub %float %86 %89
+         %95 = OpCompositeConstruct %v2float %93 %94
+               OpStore %param_1 %95
+         %96 = OpFunctionCall %float %cross2d_vf2_vf2_ %param %param_1
+               OpStore %pab %96
+        %100 = OpAccessChain %_ptr_Function_float %p %uint_0
+        %101 = OpLoad %float %100
+        %103 = OpAccessChain %_ptr_Function_float %b_1 %uint_0
+        %104 = OpLoad %float %103
+        %106 = OpAccessChain %_ptr_Function_float %p %uint_1
+        %107 = OpLoad %float %106
+        %109 = OpAccessChain %_ptr_Function_float %b_1 %uint_1
+        %110 = OpLoad %float %109
+        %112 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %113 = OpLoad %float %112
+        %115 = OpAccessChain %_ptr_Function_float %b_1 %uint_0
+        %116 = OpLoad %float %115
+        %118 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %119 = OpLoad %float %118
+        %121 = OpAccessChain %_ptr_Function_float %b_1 %uint_1
+        %122 = OpLoad %float %121
+        %123 = OpFSub %float %101 %104
+        %124 = OpFSub %float %107 %110
+        %125 = OpCompositeConstruct %v2float %123 %124
+               OpStore %param_2 %125
+        %126 = OpFSub %float %113 %116
+        %127 = OpFSub %float %119 %122
+        %128 = OpCompositeConstruct %v2float %126 %127
+               OpStore %param_3 %128
+        %129 = OpFunctionCall %float %cross2d_vf2_vf2_ %param_2 %param_3
+               OpStore %pbc %129
+        %132 = OpLoad %float %pab
+        %133 = OpLoad %float %pbc
+        %135 = OpFOrdLessThan %bool %132 %float_0
+               OpSelectionMerge %136 None
+               OpBranchConditional %135 %137 %136
+        %137 = OpLabel
+        %138 = OpFOrdLessThan %bool %133 %float_0
+               OpBranch %136
+        %136 = OpLabel
+        %139 = OpPhi %bool %135 %47 %138 %137
+               OpStore %x_138_phi %139
+        %140 = OpLogicalNot %bool %139
+               OpSelectionMerge %141 None
+               OpBranchConditional %140 %142 %141
+        %142 = OpLabel
+        %143 = OpLoad %float %pab
+        %144 = OpLoad %float %pbc
+        %145 = OpFOrdGreaterThanEqual %bool %143 %float_0
+               OpSelectionMerge %146 None
+               OpBranchConditional %145 %147 %146
+        %147 = OpLabel
+        %148 = OpFOrdGreaterThanEqual %bool %144 %float_0
+               OpBranch %146
+        %146 = OpLabel
+        %149 = OpPhi %bool %145 %142 %148 %147
+               OpStore %x_137 %149
+        %150 = OpLoad %bool %x_137
+               OpStore %x_138_phi %150
+               OpBranch %141
+        %141 = OpLabel
+        %151 = OpLoad %bool %x_138_phi
+        %152 = OpLogicalNot %bool %151
+               OpSelectionMerge %153 None
+               OpBranchConditional %152 %154 %153
+        %154 = OpLabel
+               OpReturnValue %int_0
+        %153 = OpLabel
+        %157 = OpAccessChain %_ptr_Function_float %p %uint_0
+        %158 = OpLoad %float %157
+        %160 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %161 = OpLoad %float %160
+        %163 = OpAccessChain %_ptr_Function_float %p %uint_1
+        %164 = OpLoad %float %163
+        %166 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %167 = OpLoad %float %166
+        %169 = OpAccessChain %_ptr_Function_float %a_1 %uint_0
+        %170 = OpLoad %float %169
+        %172 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %173 = OpLoad %float %172
+        %175 = OpAccessChain %_ptr_Function_float %a_1 %uint_1
+        %176 = OpLoad %float %175
+        %178 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %179 = OpLoad %float %178
+        %180 = OpFSub %float %158 %161
+        %181 = OpFSub %float %164 %167
+        %182 = OpCompositeConstruct %v2float %180 %181
+               OpStore %param_4 %182
+        %183 = OpFSub %float %170 %173
+        %184 = OpFSub %float %176 %179
+        %185 = OpCompositeConstruct %v2float %183 %184
+               OpStore %param_5 %185
+        %186 = OpFunctionCall %float %cross2d_vf2_vf2_ %param_4 %param_5
+               OpStore %pca %186
+        %189 = OpLoad %float %pab
+        %190 = OpLoad %float %pca
+        %191 = OpFOrdLessThan %bool %189 %float_0
+               OpSelectionMerge %192 None
+               OpBranchConditional %191 %193 %192
+        %193 = OpLabel
+        %194 = OpFOrdLessThan %bool %190 %float_0
+               OpBranch %192
+        %192 = OpLabel
+        %195 = OpPhi %bool %191 %153 %194 %193
+               OpStore %x_170_phi %195
+        %196 = OpLogicalNot %bool %195
+               OpSelectionMerge %197 None
+               OpBranchConditional %196 %198 %197
+        %198 = OpLabel
+        %199 = OpLoad %float %pab
+        %200 = OpLoad %float %pca
+        %201 = OpFOrdGreaterThanEqual %bool %199 %float_0
+               OpSelectionMerge %202 None
+               OpBranchConditional %201 %203 %202
+        %203 = OpLabel
+        %204 = OpFOrdGreaterThanEqual %bool %200 %float_0
+               OpBranch %202
+        %202 = OpLabel
+        %205 = OpPhi %bool %201 %198 %204 %203
+               OpStore %x_169 %205
+        %206 = OpLoad %bool %x_169
+               OpStore %x_170_phi %206
+               OpBranch %197
+        %197 = OpLabel
+        %207 = OpLoad %bool %x_170_phi
+        %208 = OpLogicalNot %bool %207
+               OpSelectionMerge %209 None
+               OpBranchConditional %208 %210 %209
+        %210 = OpLabel
+               OpReturnValue %int_0
+        %209 = OpLabel
+               OpReturnValue %int_1
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %212
+        %215 = OpLabel
+        %pos = OpVariable %_ptr_Function_v2float Function %51
+    %param_6 = OpVariable %_ptr_Function_v2float Function %51
+    %param_7 = OpVariable %_ptr_Function_v2float Function %51
+    %param_8 = OpVariable %_ptr_Function_v2float Function %51
+    %param_9 = OpVariable %_ptr_Function_v2float Function %51
+        %221 = OpLoad %v4float %gl_FragCoord
+        %223 = OpAccessChain %_ptr_Uniform_v2float %x_24 %uint_0
+        %224 = OpLoad %v2float %223
+        %225 = OpCompositeExtract %float %221 0
+        %226 = OpCompositeExtract %float %221 1
+        %227 = OpCompositeConstruct %v2float %225 %226
+        %228 = OpFDiv %v2float %227 %224
+               OpStore %pos %228
+        %229 = OpLoad %v2float %pos
+               OpStore %param_6 %229
+               OpStore %param_7 %232
+               OpStore %param_8 %235
+               OpStore %param_9 %238
+        %239 = OpFunctionCall %int %pointInTriangle_vf2_vf2_vf2_vf2_ %param_6 %param_7 %param_8 %param_9
+        %244 = OpIEqual %bool %239 %int_1
+               OpSelectionMerge %245 None
+               OpBranchConditional %244 %246 %247
+        %246 = OpLabel
+               OpStore %x_GLF_color %249
+               OpBranch %245
+        %247 = OpLabel
+               OpStore %x_GLF_color %250
+               OpBranch %245
+        %245 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %251
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %255 = OpLabel
+        %256 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %256
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %212
+        %258 = OpLabel
+        %259 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %259
+        %260 = OpFunctionCall %void %main_1
+        %262 = OpLoad %v4float %x_GLF_color
+        %263 = OpCompositeConstruct %main_out %262
+        %261 = OpFunctionCall %void %tint_symbol_3 %263
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..11cfd54
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.wgsl.expected.wgsl
@@ -0,0 +1,142 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_24 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn cross2d_vf2_vf2_(a : ptr<function, vec2<f32>>, b : ptr<function, vec2<f32>>) -> f32 {
+  let x_76 : f32 = (*(a)).x;
+  let x_78 : f32 = (*(b)).y;
+  let x_81 : f32 = (*(b)).x;
+  let x_83 : f32 = (*(a)).y;
+  return ((x_76 * x_78) - (x_81 * x_83));
+}
+
+fn pointInTriangle_vf2_vf2_vf2_vf2_(p : ptr<function, vec2<f32>>, a_1 : ptr<function, vec2<f32>>, b_1 : ptr<function, vec2<f32>>, c : ptr<function, vec2<f32>>) -> i32 {
+  var pab : f32;
+  var param : vec2<f32>;
+  var param_1 : vec2<f32>;
+  var pbc : f32;
+  var param_2 : vec2<f32>;
+  var param_3 : vec2<f32>;
+  var pca : f32;
+  var param_4 : vec2<f32>;
+  var param_5 : vec2<f32>;
+  var x_137 : bool;
+  var x_169 : bool;
+  var x_138_phi : bool;
+  var x_170_phi : bool;
+  let x_87 : ptr<function, f32> = &((*(p)).x);
+  let x_88 : f32 = *(x_87);
+  let x_89 : ptr<function, f32> = &((*(a_1)).x);
+  let x_90 : f32 = *(x_89);
+  let x_92 : ptr<function, f32> = &((*(p)).y);
+  let x_93 : f32 = *(x_92);
+  let x_94 : ptr<function, f32> = &((*(a_1)).y);
+  let x_95 : f32 = *(x_94);
+  let x_98 : ptr<function, f32> = &((*(b_1)).x);
+  let x_99 : f32 = *(x_98);
+  let x_100 : f32 = *(x_89);
+  let x_102 : ptr<function, f32> = &((*(b_1)).y);
+  let x_103 : f32 = *(x_102);
+  let x_104 : f32 = *(x_94);
+  param = vec2<f32>((x_88 - x_90), (x_93 - x_95));
+  param_1 = vec2<f32>((x_99 - x_100), (x_103 - x_104));
+  let x_107 : f32 = cross2d_vf2_vf2_(&(param), &(param_1));
+  pab = x_107;
+  let x_108 : f32 = *(x_87);
+  let x_109 : f32 = *(x_98);
+  let x_111 : f32 = *(x_92);
+  let x_112 : f32 = *(x_102);
+  let x_115 : ptr<function, f32> = &((*(c)).x);
+  let x_116 : f32 = *(x_115);
+  let x_117 : f32 = *(x_98);
+  let x_119 : ptr<function, f32> = &((*(c)).y);
+  let x_120 : f32 = *(x_119);
+  let x_121 : f32 = *(x_102);
+  param_2 = vec2<f32>((x_108 - x_109), (x_111 - x_112));
+  param_3 = vec2<f32>((x_116 - x_117), (x_120 - x_121));
+  let x_124 : f32 = cross2d_vf2_vf2_(&(param_2), &(param_3));
+  pbc = x_124;
+  let x_125 : f32 = pab;
+  let x_127 : f32 = pbc;
+  let x_129 : bool = ((x_125 < 0.0) && (x_127 < 0.0));
+  x_138_phi = x_129;
+  if (!(x_129)) {
+    let x_133 : f32 = pab;
+    let x_135 : f32 = pbc;
+    x_137 = ((x_133 >= 0.0) && (x_135 >= 0.0));
+    x_138_phi = x_137;
+  }
+  let x_138 : bool = x_138_phi;
+  if (!(x_138)) {
+    return 0;
+  }
+  let x_142 : f32 = *(x_87);
+  let x_143 : f32 = *(x_115);
+  let x_145 : f32 = *(x_92);
+  let x_146 : f32 = *(x_119);
+  let x_149 : f32 = *(x_89);
+  let x_150 : f32 = *(x_115);
+  let x_152 : f32 = *(x_94);
+  let x_153 : f32 = *(x_119);
+  param_4 = vec2<f32>((x_142 - x_143), (x_145 - x_146));
+  param_5 = vec2<f32>((x_149 - x_150), (x_152 - x_153));
+  let x_156 : f32 = cross2d_vf2_vf2_(&(param_4), &(param_5));
+  pca = x_156;
+  let x_157 : f32 = pab;
+  let x_159 : f32 = pca;
+  let x_161 : bool = ((x_157 < 0.0) && (x_159 < 0.0));
+  x_170_phi = x_161;
+  if (!(x_161)) {
+    let x_165 : f32 = pab;
+    let x_167 : f32 = pca;
+    x_169 = ((x_165 >= 0.0) && (x_167 >= 0.0));
+    x_170_phi = x_169;
+  }
+  let x_170 : bool = x_170_phi;
+  if (!(x_170)) {
+    return 0;
+  }
+  return 1;
+}
+
+fn main_1() {
+  var pos : vec2<f32>;
+  var param_6 : vec2<f32>;
+  var param_7 : vec2<f32>;
+  var param_8 : vec2<f32>;
+  var param_9 : vec2<f32>;
+  let x_63 : vec4<f32> = gl_FragCoord;
+  let x_66 : vec2<f32> = x_24.resolution;
+  pos = (vec2<f32>(x_63.x, x_63.y) / x_66);
+  let x_68 : vec2<f32> = pos;
+  param_6 = x_68;
+  param_7 = vec2<f32>(0.699999988, 0.300000012);
+  param_8 = vec2<f32>(0.5, 0.899999976);
+  param_9 = vec2<f32>(0.100000001, 0.400000006);
+  let x_69 : i32 = pointInTriangle_vf2_vf2_vf2_vf2_(&(param_6), &(param_7), &(param_8), &(param_9));
+  if ((x_69 == 1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.spvasm
new file mode 100644
index 0000000..8a7252f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.spvasm
@@ -0,0 +1,302 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %cross2d_vf2_vf2_ "cross2d(vf2;vf2;"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %pointInTriangle_vf2_vf2_vf2_vf2_ "pointInTriangle(vf2;vf2;vf2;vf2;"
+               OpName %p "p"
+               OpName %a_0 "a"
+               OpName %b_0 "b"
+               OpName %c "c"
+               OpName %var_y "var_y"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %clamp_y "clamp_y"
+               OpName %pab "pab"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %pbc "pbc"
+               OpName %param_1 "param"
+               OpName %param_2 "param"
+               OpName %pca "pca"
+               OpName %param_3 "param"
+               OpName %param_4 "param"
+               OpName %pos "pos"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %param_5 "param"
+               OpName %param_6 "param"
+               OpName %param_7 "param"
+               OpName %param_8 "param"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %32 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %36 = OpTypeFunction %float %_ptr_Function_v2float %_ptr_Function_v2float
+        %int = OpTypeInt 32 1
+         %38 = OpTypeFunction %int %_ptr_Function_v2float %_ptr_Function_v2float %_ptr_Function_v2float %_ptr_Function_v2float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+       %true = OpConstantTrue %bool
+     %v2bool = OpTypeVector %bool 2
+      %false = OpConstantFalse %bool
+         %51 = OpConstantComposite %v2bool %false %false
+   %float_n1 = OpConstant %float -1
+    %float_0 = OpConstant %float 0
+      %int_1 = OpConstant %int 1
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+%float_0_699999988 = OpConstant %float 0.699999988
+%float_0_300000012 = OpConstant %float 0.300000012
+         %60 = OpConstantComposite %v2float %float_0_699999988 %float_0_300000012
+  %float_0_5 = OpConstant %float 0.5
+%float_0_899999976 = OpConstant %float 0.899999976
+         %63 = OpConstantComposite %v2float %float_0_5 %float_0_899999976
+%float_0_100000001 = OpConstant %float 0.100000001
+%float_0_400000006 = OpConstant %float 0.400000006
+         %66 = OpConstantComposite %v2float %float_0_100000001 %float_0_400000006
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %68 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %69 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+         %70 = OpUndef %float
+       %main = OpFunction %void None %32
+         %71 = OpLabel
+        %pos = OpVariable %_ptr_Function_v2float Function
+    %param_5 = OpVariable %_ptr_Function_v2float Function
+    %param_6 = OpVariable %_ptr_Function_v2float Function
+    %param_7 = OpVariable %_ptr_Function_v2float Function
+    %param_8 = OpVariable %_ptr_Function_v2float Function
+         %72 = OpLoad %v4float %gl_FragCoord
+         %73 = OpVectorShuffle %v2float %72 %72 0 1
+         %74 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+         %75 = OpLoad %v2float %74
+         %76 = OpFDiv %v2float %73 %75
+               OpStore %pos %76
+         %77 = OpLoad %v2float %pos
+               OpStore %param_5 %77
+               OpStore %param_6 %60
+               OpStore %param_7 %63
+               OpStore %param_8 %66
+         %78 = OpFunctionCall %int %pointInTriangle_vf2_vf2_vf2_vf2_ %param_5 %param_6 %param_7 %param_8
+         %79 = OpIEqual %bool %78 %int_1
+               OpSelectionMerge %80 None
+               OpBranchConditional %79 %81 %82
+         %81 = OpLabel
+               OpStore %_GLF_color %68
+               OpBranch %80
+         %82 = OpLabel
+               OpStore %_GLF_color %69
+               OpBranch %80
+         %80 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%cross2d_vf2_vf2_ = OpFunction %float None %36
+          %a = OpFunctionParameter %_ptr_Function_v2float
+          %b = OpFunctionParameter %_ptr_Function_v2float
+         %83 = OpLabel
+         %84 = OpAccessChain %_ptr_Function_float %a %uint_0
+         %85 = OpLoad %float %84
+         %86 = OpAccessChain %_ptr_Function_float %b %uint_1
+         %87 = OpLoad %float %86
+         %88 = OpFMul %float %85 %87
+         %89 = OpAccessChain %_ptr_Function_float %b %uint_0
+         %90 = OpLoad %float %89
+         %91 = OpAccessChain %_ptr_Function_float %a %uint_1
+         %92 = OpLoad %float %91
+         %93 = OpFMul %float %90 %92
+         %94 = OpFSub %float %88 %93
+               OpReturnValue %94
+               OpFunctionEnd
+%pointInTriangle_vf2_vf2_vf2_vf2_ = OpFunction %int None %38
+          %p = OpFunctionParameter %_ptr_Function_v2float
+        %a_0 = OpFunctionParameter %_ptr_Function_v2float
+        %b_0 = OpFunctionParameter %_ptr_Function_v2float
+          %c = OpFunctionParameter %_ptr_Function_v2float
+         %95 = OpLabel
+      %var_y = OpVariable %_ptr_Function_float Function
+         %96 = OpVariable %_ptr_Function_float Function
+         %97 = OpVariable %_ptr_Function_float Function
+    %clamp_y = OpVariable %_ptr_Function_float Function
+        %pab = OpVariable %_ptr_Function_float Function
+      %param = OpVariable %_ptr_Function_v2float Function
+    %param_0 = OpVariable %_ptr_Function_v2float Function
+        %pbc = OpVariable %_ptr_Function_float Function
+    %param_1 = OpVariable %_ptr_Function_v2float Function
+    %param_2 = OpVariable %_ptr_Function_v2float Function
+        %pca = OpVariable %_ptr_Function_float Function
+    %param_3 = OpVariable %_ptr_Function_v2float Function
+    %param_4 = OpVariable %_ptr_Function_v2float Function
+         %98 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %99 = OpLoad %float %98
+        %100 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+        %101 = OpLoad %float %100
+        %102 = OpFOrdEqual %bool %99 %101
+               OpSelectionMerge %103 None
+               OpBranchConditional %102 %104 %105
+        %104 = OpLabel
+        %106 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %107 = OpLoad %float %106
+        %108 = OpCompositeConstruct %v2float %70 %107
+               OpSelectionMerge %109 None
+               OpBranchConditional %true %110 %111
+        %110 = OpLabel
+        %112 = OpLoad %float %106
+               OpStore %97 %112
+               OpBranch %109
+        %111 = OpLabel
+               OpStore %97 %float_1
+               OpBranch %109
+        %109 = OpLabel
+        %113 = OpLoad %float %97
+        %114 = OpLoad %float %106
+        %115 = OpExtInst %float %1 FMax %113 %114
+        %116 = OpCompositeConstruct %v2float %float_1 %115
+        %117 = OpVectorShuffle %v2float %116 %108 2 3
+               OpStore %96 %107
+               OpBranch %103
+        %105 = OpLabel
+               OpStore %96 %float_n1
+               OpBranch %103
+        %103 = OpLabel
+        %118 = OpLoad %float %96
+               OpStore %var_y %118
+        %119 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %120 = OpLoad %float %119
+        %121 = OpLoad %float %119
+        %122 = OpLoad %float %var_y
+        %123 = OpExtInst %float %1 FClamp %120 %121 %122
+               OpStore %clamp_y %123
+        %124 = OpAccessChain %_ptr_Function_float %p %uint_0
+        %125 = OpLoad %float %124
+        %126 = OpAccessChain %_ptr_Function_float %a_0 %uint_0
+        %127 = OpLoad %float %126
+        %128 = OpFSub %float %125 %127
+        %129 = OpAccessChain %_ptr_Function_float %p %uint_1
+        %130 = OpLoad %float %129
+        %131 = OpAccessChain %_ptr_Function_float %a_0 %uint_1
+        %132 = OpLoad %float %131
+        %133 = OpFSub %float %130 %132
+        %134 = OpCompositeConstruct %v2float %128 %133
+        %135 = OpAccessChain %_ptr_Function_float %b_0 %uint_0
+        %136 = OpLoad %float %135
+        %137 = OpLoad %float %126
+        %138 = OpFSub %float %136 %137
+        %139 = OpAccessChain %_ptr_Function_float %b_0 %uint_1
+        %140 = OpLoad %float %139
+        %141 = OpLoad %float %131
+        %142 = OpFSub %float %140 %141
+        %143 = OpCompositeConstruct %v2float %138 %142
+               OpStore %param %134
+               OpStore %param_0 %143
+        %144 = OpFunctionCall %float %cross2d_vf2_vf2_ %param %param_0
+               OpStore %pab %144
+        %145 = OpLoad %float %124
+        %146 = OpLoad %float %135
+        %147 = OpFSub %float %145 %146
+        %148 = OpLoad %float %129
+        %149 = OpLoad %float %139
+        %150 = OpFSub %float %148 %149
+        %151 = OpCompositeConstruct %v2float %147 %150
+        %152 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %153 = OpLoad %float %152
+        %154 = OpLoad %float %135
+        %155 = OpFSub %float %153 %154
+        %156 = OpLoad %float %clamp_y
+        %157 = OpLoad %float %139
+        %158 = OpFSub %float %156 %157
+        %159 = OpCompositeConstruct %v2float %155 %158
+               OpStore %param_1 %151
+               OpStore %param_2 %159
+        %160 = OpFunctionCall %float %cross2d_vf2_vf2_ %param_1 %param_2
+               OpStore %pbc %160
+        %161 = OpLoad %float %pab
+        %162 = OpFOrdLessThan %bool %161 %float_0
+        %163 = OpLoad %float %pbc
+        %164 = OpFOrdLessThan %bool %163 %float_0
+        %165 = OpLogicalAnd %bool %162 %164
+        %166 = OpLogicalNot %bool %165
+               OpSelectionMerge %167 None
+               OpBranchConditional %166 %168 %167
+        %168 = OpLabel
+        %169 = OpLoad %float %pab
+        %170 = OpFOrdGreaterThanEqual %bool %169 %float_0
+        %171 = OpLoad %float %pbc
+        %172 = OpFOrdGreaterThanEqual %bool %171 %float_0
+        %173 = OpLogicalAnd %bool %170 %172
+               OpBranch %167
+        %167 = OpLabel
+        %174 = OpPhi %bool %165 %103 %173 %168
+        %175 = OpLogicalNot %bool %174
+               OpSelectionMerge %176 None
+               OpBranchConditional %175 %177 %176
+        %177 = OpLabel
+               OpReturnValue %int_0
+        %176 = OpLabel
+        %178 = OpLoad %float %124
+        %179 = OpLoad %float %152
+        %180 = OpFSub %float %178 %179
+        %181 = OpLoad %float %129
+        %182 = OpLoad %float %119
+        %183 = OpFSub %float %181 %182
+        %184 = OpCompositeConstruct %v2float %180 %183
+        %185 = OpLoad %float %126
+        %186 = OpLoad %float %152
+        %187 = OpFSub %float %185 %186
+        %188 = OpLoad %float %131
+        %189 = OpLoad %float %119
+        %190 = OpFSub %float %188 %189
+        %191 = OpCompositeConstruct %v2float %187 %190
+               OpStore %param_3 %184
+               OpStore %param_4 %191
+        %192 = OpFunctionCall %float %cross2d_vf2_vf2_ %param_3 %param_4
+               OpStore %pca %192
+        %193 = OpLoad %float %pab
+        %194 = OpFOrdLessThan %bool %193 %float_0
+        %195 = OpLoad %float %pca
+        %196 = OpFOrdLessThan %bool %195 %float_0
+        %197 = OpLogicalAnd %bool %194 %196
+        %198 = OpLogicalNot %bool %197
+               OpSelectionMerge %199 None
+               OpBranchConditional %198 %200 %199
+        %200 = OpLabel
+        %201 = OpLoad %float %pab
+        %202 = OpFOrdGreaterThanEqual %bool %201 %float_0
+        %203 = OpLoad %float %pca
+        %204 = OpFOrdGreaterThanEqual %bool %203 %float_0
+        %205 = OpLogicalAnd %bool %202 %204
+               OpBranch %199
+        %199 = OpLabel
+        %206 = OpPhi %bool %197 %176 %205 %200
+        %207 = OpLogicalNot %bool %206
+               OpSelectionMerge %208 None
+               OpBranchConditional %207 %209 %208
+        %209 = OpLabel
+               OpReturnValue %int_0
+        %208 = OpLabel
+               OpReturnValue %int_1
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..75aaaf6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.spvasm.expected.hlsl
@@ -0,0 +1,168 @@
+cbuffer cbuffer_x_15 : register(b0, space0) {
+  uint4 x_15[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float cross2d_vf2_vf2_(inout float2 a, inout float2 b) {
+  const float x_85 = a.x;
+  const float x_87 = b.y;
+  const float x_90 = b.x;
+  const float x_92 = a.y;
+  return ((x_85 * x_87) - (x_90 * x_92));
+}
+
+int pointInTriangle_vf2_vf2_vf2_vf2_(inout float2 p, inout float2 a_1, inout float2 b_1, inout float2 c) {
+  float var_y = 0.0f;
+  float x_96 = 0.0f;
+  float x_97 = 0.0f;
+  float clamp_y = 0.0f;
+  float pab = 0.0f;
+  float2 param = float2(0.0f, 0.0f);
+  float2 param_1 = float2(0.0f, 0.0f);
+  float pbc = 0.0f;
+  float2 param_2 = float2(0.0f, 0.0f);
+  float2 param_3 = float2(0.0f, 0.0f);
+  float pca = 0.0f;
+  float2 param_4 = float2(0.0f, 0.0f);
+  float2 param_5 = float2(0.0f, 0.0f);
+  bool x_173 = false;
+  bool x_205 = false;
+  bool x_174_phi = false;
+  bool x_206_phi = false;
+  const float x_99 = asfloat(x_15[0].x);
+  const float x_101 = asfloat(x_15[0].y);
+  if ((x_99 == x_101)) {
+    const float x_107 = c.y;
+    const float2 x_108 = float2(0.0f, x_107);
+    if (true) {
+      const float x_112 = c.y;
+      x_97 = x_112;
+    } else {
+      x_97 = 1.0f;
+    }
+    const float x_113 = x_97;
+    const float x_114 = c.y;
+    const float2 x_116 = float2(1.0f, max(x_113, x_114));
+    const float2 x_117 = float2(x_108.x, x_108.y);
+    x_96 = x_107;
+  } else {
+    x_96 = -1.0f;
+  }
+  var_y = x_96;
+  const float x_120 = c.y;
+  const float x_121 = c.y;
+  clamp_y = clamp(x_120, x_121, var_y);
+  const float x_125 = p.x;
+  const float x_127 = a_1.x;
+  const float x_130 = p.y;
+  const float x_132 = a_1.y;
+  const float x_136 = b_1.x;
+  const float x_137 = a_1.x;
+  const float x_140 = b_1.y;
+  const float x_141 = a_1.y;
+  param = float2((x_125 - x_127), (x_130 - x_132));
+  param_1 = float2((x_136 - x_137), (x_140 - x_141));
+  const float x_144 = cross2d_vf2_vf2_(param, param_1);
+  pab = x_144;
+  const float x_145 = p.x;
+  const float x_146 = b_1.x;
+  const float x_148 = p.y;
+  const float x_149 = b_1.y;
+  const float x_153 = c.x;
+  const float x_154 = b_1.x;
+  const float x_156 = clamp_y;
+  const float x_157 = b_1.y;
+  param_2 = float2((x_145 - x_146), (x_148 - x_149));
+  param_3 = float2((x_153 - x_154), (x_156 - x_157));
+  const float x_160 = cross2d_vf2_vf2_(param_2, param_3);
+  pbc = x_160;
+  bool tint_tmp = (pab < 0.0f);
+  if (tint_tmp) {
+    tint_tmp = (pbc < 0.0f);
+  }
+  const bool x_165 = (tint_tmp);
+  x_174_phi = x_165;
+  if (!(x_165)) {
+    bool tint_tmp_1 = (pab >= 0.0f);
+    if (tint_tmp_1) {
+      tint_tmp_1 = (pbc >= 0.0f);
+    }
+    x_173 = (tint_tmp_1);
+    x_174_phi = x_173;
+  }
+  if (!(x_174_phi)) {
+    return 0;
+  }
+  const float x_178 = p.x;
+  const float x_179 = c.x;
+  const float x_181 = p.y;
+  const float x_182 = c.y;
+  const float x_185 = a_1.x;
+  const float x_186 = c.x;
+  const float x_188 = a_1.y;
+  const float x_189 = c.y;
+  param_4 = float2((x_178 - x_179), (x_181 - x_182));
+  param_5 = float2((x_185 - x_186), (x_188 - x_189));
+  const float x_192 = cross2d_vf2_vf2_(param_4, param_5);
+  pca = x_192;
+  bool tint_tmp_2 = (pab < 0.0f);
+  if (tint_tmp_2) {
+    tint_tmp_2 = (pca < 0.0f);
+  }
+  const bool x_197 = (tint_tmp_2);
+  x_206_phi = x_197;
+  if (!(x_197)) {
+    bool tint_tmp_3 = (pab >= 0.0f);
+    if (tint_tmp_3) {
+      tint_tmp_3 = (pca >= 0.0f);
+    }
+    x_205 = (tint_tmp_3);
+    x_206_phi = x_205;
+  }
+  if (!(x_206_phi)) {
+    return 0;
+  }
+  return 1;
+}
+
+void main_1() {
+  float2 pos = float2(0.0f, 0.0f);
+  float2 param_6 = float2(0.0f, 0.0f);
+  float2 param_7 = float2(0.0f, 0.0f);
+  float2 param_8 = float2(0.0f, 0.0f);
+  float2 param_9 = float2(0.0f, 0.0f);
+  const float4 x_72 = gl_FragCoord;
+  const float2 x_75 = asfloat(x_15[0].xy);
+  pos = (float2(x_72.x, x_72.y) / x_75);
+  param_6 = pos;
+  param_7 = float2(0.699999988f, 0.300000012f);
+  param_8 = float2(0.5f, 0.899999976f);
+  param_9 = float2(0.100000001f, 0.400000006f);
+  const int x_78 = pointInTriangle_vf2_vf2_vf2_vf2_(param_6, param_7, param_8, param_9);
+  if ((x_78 == 1)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.spvasm.expected.msl
new file mode 100644
index 0000000..d0400d8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.spvasm.expected.msl
@@ -0,0 +1,164 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float cross2d_vf2_vf2_(thread float2* const a, thread float2* const b) {
+  float const x_85 = (*(a)).x;
+  float const x_87 = (*(b)).y;
+  float const x_90 = (*(b)).x;
+  float const x_92 = (*(a)).y;
+  return ((x_85 * x_87) - (x_90 * x_92));
+}
+
+int pointInTriangle_vf2_vf2_vf2_vf2_(constant buf0& x_15, thread float2* const p, thread float2* const a_1, thread float2* const b_1, thread float2* const c) {
+  float var_y = 0.0f;
+  float x_96 = 0.0f;
+  float x_97 = 0.0f;
+  float clamp_y = 0.0f;
+  float pab = 0.0f;
+  float2 param = 0.0f;
+  float2 param_1 = 0.0f;
+  float pbc = 0.0f;
+  float2 param_2 = 0.0f;
+  float2 param_3 = 0.0f;
+  float pca = 0.0f;
+  float2 param_4 = 0.0f;
+  float2 param_5 = 0.0f;
+  bool x_173 = false;
+  bool x_205 = false;
+  bool x_174_phi = false;
+  bool x_206_phi = false;
+  float const x_99 = x_15.resolution.x;
+  float const x_101 = x_15.resolution.y;
+  if ((x_99 == x_101)) {
+    float const x_107 = (*(c)).y;
+    float2 const x_108 = float2(0.0f, x_107);
+    if (true) {
+      float const x_112 = (*(c)).y;
+      x_97 = x_112;
+    } else {
+      x_97 = 1.0f;
+    }
+    float const x_113 = x_97;
+    float const x_114 = (*(c)).y;
+    float2 const x_116 = float2(1.0f, fmax(x_113, x_114));
+    float2 const x_117 = float2(x_108.x, x_108.y);
+    x_96 = x_107;
+  } else {
+    x_96 = -1.0f;
+  }
+  float const x_118 = x_96;
+  var_y = x_118;
+  float const x_120 = (*(c)).y;
+  float const x_121 = (*(c)).y;
+  float const x_122 = var_y;
+  clamp_y = clamp(x_120, x_121, x_122);
+  float const x_125 = (*(p)).x;
+  float const x_127 = (*(a_1)).x;
+  float const x_130 = (*(p)).y;
+  float const x_132 = (*(a_1)).y;
+  float const x_136 = (*(b_1)).x;
+  float const x_137 = (*(a_1)).x;
+  float const x_140 = (*(b_1)).y;
+  float const x_141 = (*(a_1)).y;
+  param = float2((x_125 - x_127), (x_130 - x_132));
+  param_1 = float2((x_136 - x_137), (x_140 - x_141));
+  float const x_144 = cross2d_vf2_vf2_(&(param), &(param_1));
+  pab = x_144;
+  float const x_145 = (*(p)).x;
+  float const x_146 = (*(b_1)).x;
+  float const x_148 = (*(p)).y;
+  float const x_149 = (*(b_1)).y;
+  float const x_153 = (*(c)).x;
+  float const x_154 = (*(b_1)).x;
+  float const x_156 = clamp_y;
+  float const x_157 = (*(b_1)).y;
+  param_2 = float2((x_145 - x_146), (x_148 - x_149));
+  param_3 = float2((x_153 - x_154), (x_156 - x_157));
+  float const x_160 = cross2d_vf2_vf2_(&(param_2), &(param_3));
+  pbc = x_160;
+  float const x_161 = pab;
+  float const x_163 = pbc;
+  bool const x_165 = ((x_161 < 0.0f) && (x_163 < 0.0f));
+  x_174_phi = x_165;
+  if (!(x_165)) {
+    float const x_169 = pab;
+    float const x_171 = pbc;
+    x_173 = ((x_169 >= 0.0f) && (x_171 >= 0.0f));
+    x_174_phi = x_173;
+  }
+  bool const x_174 = x_174_phi;
+  if (!(x_174)) {
+    return 0;
+  }
+  float const x_178 = (*(p)).x;
+  float const x_179 = (*(c)).x;
+  float const x_181 = (*(p)).y;
+  float const x_182 = (*(c)).y;
+  float const x_185 = (*(a_1)).x;
+  float const x_186 = (*(c)).x;
+  float const x_188 = (*(a_1)).y;
+  float const x_189 = (*(c)).y;
+  param_4 = float2((x_178 - x_179), (x_181 - x_182));
+  param_5 = float2((x_185 - x_186), (x_188 - x_189));
+  float const x_192 = cross2d_vf2_vf2_(&(param_4), &(param_5));
+  pca = x_192;
+  float const x_193 = pab;
+  float const x_195 = pca;
+  bool const x_197 = ((x_193 < 0.0f) && (x_195 < 0.0f));
+  x_206_phi = x_197;
+  if (!(x_197)) {
+    float const x_201 = pab;
+    float const x_203 = pca;
+    x_205 = ((x_201 >= 0.0f) && (x_203 >= 0.0f));
+    x_206_phi = x_205;
+  }
+  bool const x_206 = x_206_phi;
+  if (!(x_206)) {
+    return 0;
+  }
+  return 1;
+}
+
+void main_1(constant buf0& x_15, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float2 pos = 0.0f;
+  float2 param_6 = 0.0f;
+  float2 param_7 = 0.0f;
+  float2 param_8 = 0.0f;
+  float2 param_9 = 0.0f;
+  float4 const x_72 = *(tint_symbol_5);
+  float2 const x_75 = x_15.resolution;
+  pos = (float2(x_72.x, x_72.y) / x_75);
+  float2 const x_77 = pos;
+  param_6 = x_77;
+  param_7 = float2(0.699999988f, 0.300000012f);
+  param_8 = float2(0.5f, 0.899999976f);
+  param_9 = float2(0.100000001f, 0.400000006f);
+  int const x_78 = pointInTriangle_vf2_vf2_vf2_vf2_(x_15, &(param_6), &(param_7), &(param_8), &(param_9));
+  if ((x_78 == 1)) {
+    *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_6) = float4(0.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_15 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_15, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..98ab5e5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.spvasm.expected.spvasm
@@ -0,0 +1,399 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 306
+; Schema: 0
+               OpCapability Shader
+         %97 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_15 "x_15"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %cross2d_vf2_vf2_ "cross2d_vf2_vf2_"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %pointInTriangle_vf2_vf2_vf2_vf2_ "pointInTriangle_vf2_vf2_vf2_vf2_"
+               OpName %p "p"
+               OpName %a_1 "a_1"
+               OpName %b_1 "b_1"
+               OpName %c "c"
+               OpName %var_y "var_y"
+               OpName %x_96 "x_96"
+               OpName %x_97 "x_97"
+               OpName %clamp_y "clamp_y"
+               OpName %pab "pab"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %pbc "pbc"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %pca "pca"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpName %x_173 "x_173"
+               OpName %x_205 "x_205"
+               OpName %x_174_phi "x_174_phi"
+               OpName %x_206_phi "x_206_phi"
+               OpName %main_1 "main_1"
+               OpName %pos "pos"
+               OpName %param_6 "param_6"
+               OpName %param_7 "param_7"
+               OpName %param_8 "param_8"
+               OpName %param_9 "param_9"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_15 NonWritable
+               OpDecorate %x_15 DescriptorSet 0
+               OpDecorate %x_15 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_15 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %15 = OpTypeFunction %float %_ptr_Function_v2float %_ptr_Function_v2float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+        %int = OpTypeInt 32 1
+         %40 = OpTypeFunction %int %_ptr_Function_v2float %_ptr_Function_v2float %_ptr_Function_v2float %_ptr_Function_v2float
+         %49 = OpConstantNull %float
+         %55 = OpConstantNull %v2float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %66 = OpConstantNull %bool
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_0 = OpConstant %float 0
+       %true = OpConstantTrue %bool
+    %float_1 = OpConstant %float 1
+   %float_n1 = OpConstant %float -1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+       %void = OpTypeVoid
+        %255 = OpTypeFunction %void
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+%float_0_699999988 = OpConstant %float 0.699999988
+%float_0_300000012 = OpConstant %float 0.300000012
+        %275 = OpConstantComposite %v2float %float_0_699999988 %float_0_300000012
+  %float_0_5 = OpConstant %float 0.5
+%float_0_899999976 = OpConstant %float 0.899999976
+        %278 = OpConstantComposite %v2float %float_0_5 %float_0_899999976
+%float_0_100000001 = OpConstant %float 0.100000001
+%float_0_400000006 = OpConstant %float 0.400000006
+        %281 = OpConstantComposite %v2float %float_0_100000001 %float_0_400000006
+        %291 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %292 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %293 = OpTypeFunction %void %main_out
+%cross2d_vf2_vf2_ = OpFunction %float None %15
+          %a = OpFunctionParameter %_ptr_Function_v2float
+          %b = OpFunctionParameter %_ptr_Function_v2float
+         %20 = OpLabel
+         %25 = OpAccessChain %_ptr_Function_float %a %uint_0
+         %26 = OpLoad %float %25
+         %29 = OpAccessChain %_ptr_Function_float %b %uint_1
+         %30 = OpLoad %float %29
+         %32 = OpAccessChain %_ptr_Function_float %b %uint_0
+         %33 = OpLoad %float %32
+         %35 = OpAccessChain %_ptr_Function_float %a %uint_1
+         %36 = OpLoad %float %35
+         %37 = OpFMul %float %26 %30
+         %38 = OpFMul %float %33 %36
+         %39 = OpFSub %float %37 %38
+               OpReturnValue %39
+               OpFunctionEnd
+%pointInTriangle_vf2_vf2_vf2_vf2_ = OpFunction %int None %40
+          %p = OpFunctionParameter %_ptr_Function_v2float
+        %a_1 = OpFunctionParameter %_ptr_Function_v2float
+        %b_1 = OpFunctionParameter %_ptr_Function_v2float
+          %c = OpFunctionParameter %_ptr_Function_v2float
+         %47 = OpLabel
+      %var_y = OpVariable %_ptr_Function_float Function %49
+       %x_96 = OpVariable %_ptr_Function_float Function %49
+       %x_97 = OpVariable %_ptr_Function_float Function %49
+    %clamp_y = OpVariable %_ptr_Function_float Function %49
+        %pab = OpVariable %_ptr_Function_float Function %49
+      %param = OpVariable %_ptr_Function_v2float Function %55
+    %param_1 = OpVariable %_ptr_Function_v2float Function %55
+        %pbc = OpVariable %_ptr_Function_float Function %49
+    %param_2 = OpVariable %_ptr_Function_v2float Function %55
+    %param_3 = OpVariable %_ptr_Function_v2float Function %55
+        %pca = OpVariable %_ptr_Function_float Function %49
+    %param_4 = OpVariable %_ptr_Function_v2float Function %55
+    %param_5 = OpVariable %_ptr_Function_v2float Function %55
+      %x_173 = OpVariable %_ptr_Function_bool Function %66
+      %x_205 = OpVariable %_ptr_Function_bool Function %66
+  %x_174_phi = OpVariable %_ptr_Function_bool Function %66
+  %x_206_phi = OpVariable %_ptr_Function_bool Function %66
+         %71 = OpAccessChain %_ptr_Uniform_float %x_15 %uint_0 %uint_0
+         %72 = OpLoad %float %71
+         %73 = OpAccessChain %_ptr_Uniform_float %x_15 %uint_0 %uint_1
+         %74 = OpLoad %float %73
+         %75 = OpFOrdEqual %bool %72 %74
+               OpSelectionMerge %76 None
+               OpBranchConditional %75 %77 %78
+         %77 = OpLabel
+         %80 = OpAccessChain %_ptr_Function_float %c %uint_1
+         %81 = OpLoad %float %80
+         %83 = OpCompositeConstruct %v2float %float_0 %81
+               OpSelectionMerge %85 None
+               OpBranchConditional %true %86 %87
+         %86 = OpLabel
+         %89 = OpAccessChain %_ptr_Function_float %c %uint_1
+         %90 = OpLoad %float %89
+               OpStore %x_97 %90
+               OpBranch %85
+         %87 = OpLabel
+               OpStore %x_97 %float_1
+               OpBranch %85
+         %85 = OpLabel
+         %92 = OpLoad %float %x_97
+         %94 = OpAccessChain %_ptr_Function_float %c %uint_1
+         %95 = OpLoad %float %94
+         %96 = OpExtInst %float %97 NMax %92 %95
+         %98 = OpCompositeConstruct %v2float %float_1 %96
+         %99 = OpCompositeExtract %float %83 0
+        %100 = OpCompositeExtract %float %83 1
+        %101 = OpCompositeConstruct %v2float %99 %100
+               OpStore %x_96 %81
+               OpBranch %76
+         %78 = OpLabel
+               OpStore %x_96 %float_n1
+               OpBranch %76
+         %76 = OpLabel
+        %103 = OpLoad %float %x_96
+               OpStore %var_y %103
+        %105 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %106 = OpLoad %float %105
+        %108 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %109 = OpLoad %float %108
+        %110 = OpLoad %float %var_y
+        %111 = OpExtInst %float %97 NClamp %106 %109 %110
+               OpStore %clamp_y %111
+        %113 = OpAccessChain %_ptr_Function_float %p %uint_0
+        %114 = OpLoad %float %113
+        %116 = OpAccessChain %_ptr_Function_float %a_1 %uint_0
+        %117 = OpLoad %float %116
+        %119 = OpAccessChain %_ptr_Function_float %p %uint_1
+        %120 = OpLoad %float %119
+        %122 = OpAccessChain %_ptr_Function_float %a_1 %uint_1
+        %123 = OpLoad %float %122
+        %125 = OpAccessChain %_ptr_Function_float %b_1 %uint_0
+        %126 = OpLoad %float %125
+        %128 = OpAccessChain %_ptr_Function_float %a_1 %uint_0
+        %129 = OpLoad %float %128
+        %131 = OpAccessChain %_ptr_Function_float %b_1 %uint_1
+        %132 = OpLoad %float %131
+        %134 = OpAccessChain %_ptr_Function_float %a_1 %uint_1
+        %135 = OpLoad %float %134
+        %136 = OpFSub %float %114 %117
+        %137 = OpFSub %float %120 %123
+        %138 = OpCompositeConstruct %v2float %136 %137
+               OpStore %param %138
+        %139 = OpFSub %float %126 %129
+        %140 = OpFSub %float %132 %135
+        %141 = OpCompositeConstruct %v2float %139 %140
+               OpStore %param_1 %141
+        %142 = OpFunctionCall %float %cross2d_vf2_vf2_ %param %param_1
+               OpStore %pab %142
+        %146 = OpAccessChain %_ptr_Function_float %p %uint_0
+        %147 = OpLoad %float %146
+        %149 = OpAccessChain %_ptr_Function_float %b_1 %uint_0
+        %150 = OpLoad %float %149
+        %152 = OpAccessChain %_ptr_Function_float %p %uint_1
+        %153 = OpLoad %float %152
+        %155 = OpAccessChain %_ptr_Function_float %b_1 %uint_1
+        %156 = OpLoad %float %155
+        %158 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %159 = OpLoad %float %158
+        %161 = OpAccessChain %_ptr_Function_float %b_1 %uint_0
+        %162 = OpLoad %float %161
+        %163 = OpLoad %float %clamp_y
+        %165 = OpAccessChain %_ptr_Function_float %b_1 %uint_1
+        %166 = OpLoad %float %165
+        %167 = OpFSub %float %147 %150
+        %168 = OpFSub %float %153 %156
+        %169 = OpCompositeConstruct %v2float %167 %168
+               OpStore %param_2 %169
+        %170 = OpFSub %float %159 %162
+        %171 = OpFSub %float %163 %166
+        %172 = OpCompositeConstruct %v2float %170 %171
+               OpStore %param_3 %172
+        %173 = OpFunctionCall %float %cross2d_vf2_vf2_ %param_2 %param_3
+               OpStore %pbc %173
+        %176 = OpLoad %float %pab
+        %177 = OpLoad %float %pbc
+        %178 = OpFOrdLessThan %bool %176 %float_0
+               OpSelectionMerge %179 None
+               OpBranchConditional %178 %180 %179
+        %180 = OpLabel
+        %181 = OpFOrdLessThan %bool %177 %float_0
+               OpBranch %179
+        %179 = OpLabel
+        %182 = OpPhi %bool %178 %76 %181 %180
+               OpStore %x_174_phi %182
+        %183 = OpLogicalNot %bool %182
+               OpSelectionMerge %184 None
+               OpBranchConditional %183 %185 %184
+        %185 = OpLabel
+        %186 = OpLoad %float %pab
+        %187 = OpLoad %float %pbc
+        %188 = OpFOrdGreaterThanEqual %bool %186 %float_0
+               OpSelectionMerge %189 None
+               OpBranchConditional %188 %190 %189
+        %190 = OpLabel
+        %191 = OpFOrdGreaterThanEqual %bool %187 %float_0
+               OpBranch %189
+        %189 = OpLabel
+        %192 = OpPhi %bool %188 %185 %191 %190
+               OpStore %x_173 %192
+        %193 = OpLoad %bool %x_173
+               OpStore %x_174_phi %193
+               OpBranch %184
+        %184 = OpLabel
+        %194 = OpLoad %bool %x_174_phi
+        %195 = OpLogicalNot %bool %194
+               OpSelectionMerge %196 None
+               OpBranchConditional %195 %197 %196
+        %197 = OpLabel
+               OpReturnValue %int_0
+        %196 = OpLabel
+        %200 = OpAccessChain %_ptr_Function_float %p %uint_0
+        %201 = OpLoad %float %200
+        %203 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %204 = OpLoad %float %203
+        %206 = OpAccessChain %_ptr_Function_float %p %uint_1
+        %207 = OpLoad %float %206
+        %209 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %210 = OpLoad %float %209
+        %212 = OpAccessChain %_ptr_Function_float %a_1 %uint_0
+        %213 = OpLoad %float %212
+        %215 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %216 = OpLoad %float %215
+        %218 = OpAccessChain %_ptr_Function_float %a_1 %uint_1
+        %219 = OpLoad %float %218
+        %221 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %222 = OpLoad %float %221
+        %223 = OpFSub %float %201 %204
+        %224 = OpFSub %float %207 %210
+        %225 = OpCompositeConstruct %v2float %223 %224
+               OpStore %param_4 %225
+        %226 = OpFSub %float %213 %216
+        %227 = OpFSub %float %219 %222
+        %228 = OpCompositeConstruct %v2float %226 %227
+               OpStore %param_5 %228
+        %229 = OpFunctionCall %float %cross2d_vf2_vf2_ %param_4 %param_5
+               OpStore %pca %229
+        %232 = OpLoad %float %pab
+        %233 = OpLoad %float %pca
+        %234 = OpFOrdLessThan %bool %232 %float_0
+               OpSelectionMerge %235 None
+               OpBranchConditional %234 %236 %235
+        %236 = OpLabel
+        %237 = OpFOrdLessThan %bool %233 %float_0
+               OpBranch %235
+        %235 = OpLabel
+        %238 = OpPhi %bool %234 %196 %237 %236
+               OpStore %x_206_phi %238
+        %239 = OpLogicalNot %bool %238
+               OpSelectionMerge %240 None
+               OpBranchConditional %239 %241 %240
+        %241 = OpLabel
+        %242 = OpLoad %float %pab
+        %243 = OpLoad %float %pca
+        %244 = OpFOrdGreaterThanEqual %bool %242 %float_0
+               OpSelectionMerge %245 None
+               OpBranchConditional %244 %246 %245
+        %246 = OpLabel
+        %247 = OpFOrdGreaterThanEqual %bool %243 %float_0
+               OpBranch %245
+        %245 = OpLabel
+        %248 = OpPhi %bool %244 %241 %247 %246
+               OpStore %x_205 %248
+        %249 = OpLoad %bool %x_205
+               OpStore %x_206_phi %249
+               OpBranch %240
+        %240 = OpLabel
+        %250 = OpLoad %bool %x_206_phi
+        %251 = OpLogicalNot %bool %250
+               OpSelectionMerge %252 None
+               OpBranchConditional %251 %253 %252
+        %253 = OpLabel
+               OpReturnValue %int_0
+        %252 = OpLabel
+               OpReturnValue %int_1
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %255
+        %258 = OpLabel
+        %pos = OpVariable %_ptr_Function_v2float Function %55
+    %param_6 = OpVariable %_ptr_Function_v2float Function %55
+    %param_7 = OpVariable %_ptr_Function_v2float Function %55
+    %param_8 = OpVariable %_ptr_Function_v2float Function %55
+    %param_9 = OpVariable %_ptr_Function_v2float Function %55
+        %264 = OpLoad %v4float %gl_FragCoord
+        %266 = OpAccessChain %_ptr_Uniform_v2float %x_15 %uint_0
+        %267 = OpLoad %v2float %266
+        %268 = OpCompositeExtract %float %264 0
+        %269 = OpCompositeExtract %float %264 1
+        %270 = OpCompositeConstruct %v2float %268 %269
+        %271 = OpFDiv %v2float %270 %267
+               OpStore %pos %271
+        %272 = OpLoad %v2float %pos
+               OpStore %param_6 %272
+               OpStore %param_7 %275
+               OpStore %param_8 %278
+               OpStore %param_9 %281
+        %282 = OpFunctionCall %int %pointInTriangle_vf2_vf2_vf2_vf2_ %param_6 %param_7 %param_8 %param_9
+        %287 = OpIEqual %bool %282 %int_1
+               OpSelectionMerge %288 None
+               OpBranchConditional %287 %289 %290
+        %289 = OpLabel
+               OpStore %x_GLF_color %291
+               OpBranch %288
+        %290 = OpLabel
+               OpStore %x_GLF_color %292
+               OpBranch %288
+        %288 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %293
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %297 = OpLabel
+        %298 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %298
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %255
+        %300 = OpLabel
+        %301 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %301
+        %302 = OpFunctionCall %void %main_1
+        %304 = OpLoad %v4float %x_GLF_color
+        %305 = OpCompositeConstruct %main_out %304
+        %303 = OpFunctionCall %void %tint_symbol_3 %305
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..d58c35b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.spvasm.expected.wgsl
@@ -0,0 +1,172 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_15 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn cross2d_vf2_vf2_(a : ptr<function, vec2<f32>>, b : ptr<function, vec2<f32>>) -> f32 {
+  let x_85 : f32 = (*(a)).x;
+  let x_87 : f32 = (*(b)).y;
+  let x_90 : f32 = (*(b)).x;
+  let x_92 : f32 = (*(a)).y;
+  return ((x_85 * x_87) - (x_90 * x_92));
+}
+
+fn pointInTriangle_vf2_vf2_vf2_vf2_(p : ptr<function, vec2<f32>>, a_1 : ptr<function, vec2<f32>>, b_1 : ptr<function, vec2<f32>>, c : ptr<function, vec2<f32>>) -> i32 {
+  var var_y : f32;
+  var x_96 : f32;
+  var x_97 : f32;
+  var clamp_y : f32;
+  var pab : f32;
+  var param : vec2<f32>;
+  var param_1 : vec2<f32>;
+  var pbc : f32;
+  var param_2 : vec2<f32>;
+  var param_3 : vec2<f32>;
+  var pca : f32;
+  var param_4 : vec2<f32>;
+  var param_5 : vec2<f32>;
+  var x_173 : bool;
+  var x_205 : bool;
+  var x_174_phi : bool;
+  var x_206_phi : bool;
+  let x_99 : f32 = x_15.resolution.x;
+  let x_101 : f32 = x_15.resolution.y;
+  if ((x_99 == x_101)) {
+    let x_106 : ptr<function, f32> = &((*(c)).y);
+    let x_107 : f32 = *(x_106);
+    let x_108 : vec2<f32> = vec2<f32>(0.0, x_107);
+    if (true) {
+      let x_112 : f32 = *(x_106);
+      x_97 = x_112;
+    } else {
+      x_97 = 1.0;
+    }
+    let x_113 : f32 = x_97;
+    let x_114 : f32 = *(x_106);
+    let x_116 : vec2<f32> = vec2<f32>(1.0, max(x_113, x_114));
+    let x_117 : vec2<f32> = vec2<f32>(x_108.x, x_108.y);
+    x_96 = x_107;
+  } else {
+    x_96 = -1.0;
+  }
+  let x_118 : f32 = x_96;
+  var_y = x_118;
+  let x_119 : ptr<function, f32> = &((*(c)).y);
+  let x_120 : f32 = *(x_119);
+  let x_121 : f32 = *(x_119);
+  let x_122 : f32 = var_y;
+  clamp_y = clamp(x_120, x_121, x_122);
+  let x_124 : ptr<function, f32> = &((*(p)).x);
+  let x_125 : f32 = *(x_124);
+  let x_126 : ptr<function, f32> = &((*(a_1)).x);
+  let x_127 : f32 = *(x_126);
+  let x_129 : ptr<function, f32> = &((*(p)).y);
+  let x_130 : f32 = *(x_129);
+  let x_131 : ptr<function, f32> = &((*(a_1)).y);
+  let x_132 : f32 = *(x_131);
+  let x_135 : ptr<function, f32> = &((*(b_1)).x);
+  let x_136 : f32 = *(x_135);
+  let x_137 : f32 = *(x_126);
+  let x_139 : ptr<function, f32> = &((*(b_1)).y);
+  let x_140 : f32 = *(x_139);
+  let x_141 : f32 = *(x_131);
+  param = vec2<f32>((x_125 - x_127), (x_130 - x_132));
+  param_1 = vec2<f32>((x_136 - x_137), (x_140 - x_141));
+  let x_144 : f32 = cross2d_vf2_vf2_(&(param), &(param_1));
+  pab = x_144;
+  let x_145 : f32 = *(x_124);
+  let x_146 : f32 = *(x_135);
+  let x_148 : f32 = *(x_129);
+  let x_149 : f32 = *(x_139);
+  let x_152 : ptr<function, f32> = &((*(c)).x);
+  let x_153 : f32 = *(x_152);
+  let x_154 : f32 = *(x_135);
+  let x_156 : f32 = clamp_y;
+  let x_157 : f32 = *(x_139);
+  param_2 = vec2<f32>((x_145 - x_146), (x_148 - x_149));
+  param_3 = vec2<f32>((x_153 - x_154), (x_156 - x_157));
+  let x_160 : f32 = cross2d_vf2_vf2_(&(param_2), &(param_3));
+  pbc = x_160;
+  let x_161 : f32 = pab;
+  let x_163 : f32 = pbc;
+  let x_165 : bool = ((x_161 < 0.0) && (x_163 < 0.0));
+  x_174_phi = x_165;
+  if (!(x_165)) {
+    let x_169 : f32 = pab;
+    let x_171 : f32 = pbc;
+    x_173 = ((x_169 >= 0.0) && (x_171 >= 0.0));
+    x_174_phi = x_173;
+  }
+  let x_174 : bool = x_174_phi;
+  if (!(x_174)) {
+    return 0;
+  }
+  let x_178 : f32 = *(x_124);
+  let x_179 : f32 = *(x_152);
+  let x_181 : f32 = *(x_129);
+  let x_182 : f32 = *(x_119);
+  let x_185 : f32 = *(x_126);
+  let x_186 : f32 = *(x_152);
+  let x_188 : f32 = *(x_131);
+  let x_189 : f32 = *(x_119);
+  param_4 = vec2<f32>((x_178 - x_179), (x_181 - x_182));
+  param_5 = vec2<f32>((x_185 - x_186), (x_188 - x_189));
+  let x_192 : f32 = cross2d_vf2_vf2_(&(param_4), &(param_5));
+  pca = x_192;
+  let x_193 : f32 = pab;
+  let x_195 : f32 = pca;
+  let x_197 : bool = ((x_193 < 0.0) && (x_195 < 0.0));
+  x_206_phi = x_197;
+  if (!(x_197)) {
+    let x_201 : f32 = pab;
+    let x_203 : f32 = pca;
+    x_205 = ((x_201 >= 0.0) && (x_203 >= 0.0));
+    x_206_phi = x_205;
+  }
+  let x_206 : bool = x_206_phi;
+  if (!(x_206)) {
+    return 0;
+  }
+  return 1;
+}
+
+fn main_1() {
+  var pos : vec2<f32>;
+  var param_6 : vec2<f32>;
+  var param_7 : vec2<f32>;
+  var param_8 : vec2<f32>;
+  var param_9 : vec2<f32>;
+  let x_72 : vec4<f32> = gl_FragCoord;
+  let x_75 : vec2<f32> = x_15.resolution;
+  pos = (vec2<f32>(x_72.x, x_72.y) / x_75);
+  let x_77 : vec2<f32> = pos;
+  param_6 = x_77;
+  param_7 = vec2<f32>(0.699999988, 0.300000012);
+  param_8 = vec2<f32>(0.5, 0.899999976);
+  param_9 = vec2<f32>(0.100000001, 0.400000006);
+  let x_78 : i32 = pointInTriangle_vf2_vf2_vf2_vf2_(&(param_6), &(param_7), &(param_8), &(param_9));
+  if ((x_78 == 1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.wgsl
new file mode 100644
index 0000000..d58c35b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.wgsl
@@ -0,0 +1,172 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_15 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn cross2d_vf2_vf2_(a : ptr<function, vec2<f32>>, b : ptr<function, vec2<f32>>) -> f32 {
+  let x_85 : f32 = (*(a)).x;
+  let x_87 : f32 = (*(b)).y;
+  let x_90 : f32 = (*(b)).x;
+  let x_92 : f32 = (*(a)).y;
+  return ((x_85 * x_87) - (x_90 * x_92));
+}
+
+fn pointInTriangle_vf2_vf2_vf2_vf2_(p : ptr<function, vec2<f32>>, a_1 : ptr<function, vec2<f32>>, b_1 : ptr<function, vec2<f32>>, c : ptr<function, vec2<f32>>) -> i32 {
+  var var_y : f32;
+  var x_96 : f32;
+  var x_97 : f32;
+  var clamp_y : f32;
+  var pab : f32;
+  var param : vec2<f32>;
+  var param_1 : vec2<f32>;
+  var pbc : f32;
+  var param_2 : vec2<f32>;
+  var param_3 : vec2<f32>;
+  var pca : f32;
+  var param_4 : vec2<f32>;
+  var param_5 : vec2<f32>;
+  var x_173 : bool;
+  var x_205 : bool;
+  var x_174_phi : bool;
+  var x_206_phi : bool;
+  let x_99 : f32 = x_15.resolution.x;
+  let x_101 : f32 = x_15.resolution.y;
+  if ((x_99 == x_101)) {
+    let x_106 : ptr<function, f32> = &((*(c)).y);
+    let x_107 : f32 = *(x_106);
+    let x_108 : vec2<f32> = vec2<f32>(0.0, x_107);
+    if (true) {
+      let x_112 : f32 = *(x_106);
+      x_97 = x_112;
+    } else {
+      x_97 = 1.0;
+    }
+    let x_113 : f32 = x_97;
+    let x_114 : f32 = *(x_106);
+    let x_116 : vec2<f32> = vec2<f32>(1.0, max(x_113, x_114));
+    let x_117 : vec2<f32> = vec2<f32>(x_108.x, x_108.y);
+    x_96 = x_107;
+  } else {
+    x_96 = -1.0;
+  }
+  let x_118 : f32 = x_96;
+  var_y = x_118;
+  let x_119 : ptr<function, f32> = &((*(c)).y);
+  let x_120 : f32 = *(x_119);
+  let x_121 : f32 = *(x_119);
+  let x_122 : f32 = var_y;
+  clamp_y = clamp(x_120, x_121, x_122);
+  let x_124 : ptr<function, f32> = &((*(p)).x);
+  let x_125 : f32 = *(x_124);
+  let x_126 : ptr<function, f32> = &((*(a_1)).x);
+  let x_127 : f32 = *(x_126);
+  let x_129 : ptr<function, f32> = &((*(p)).y);
+  let x_130 : f32 = *(x_129);
+  let x_131 : ptr<function, f32> = &((*(a_1)).y);
+  let x_132 : f32 = *(x_131);
+  let x_135 : ptr<function, f32> = &((*(b_1)).x);
+  let x_136 : f32 = *(x_135);
+  let x_137 : f32 = *(x_126);
+  let x_139 : ptr<function, f32> = &((*(b_1)).y);
+  let x_140 : f32 = *(x_139);
+  let x_141 : f32 = *(x_131);
+  param = vec2<f32>((x_125 - x_127), (x_130 - x_132));
+  param_1 = vec2<f32>((x_136 - x_137), (x_140 - x_141));
+  let x_144 : f32 = cross2d_vf2_vf2_(&(param), &(param_1));
+  pab = x_144;
+  let x_145 : f32 = *(x_124);
+  let x_146 : f32 = *(x_135);
+  let x_148 : f32 = *(x_129);
+  let x_149 : f32 = *(x_139);
+  let x_152 : ptr<function, f32> = &((*(c)).x);
+  let x_153 : f32 = *(x_152);
+  let x_154 : f32 = *(x_135);
+  let x_156 : f32 = clamp_y;
+  let x_157 : f32 = *(x_139);
+  param_2 = vec2<f32>((x_145 - x_146), (x_148 - x_149));
+  param_3 = vec2<f32>((x_153 - x_154), (x_156 - x_157));
+  let x_160 : f32 = cross2d_vf2_vf2_(&(param_2), &(param_3));
+  pbc = x_160;
+  let x_161 : f32 = pab;
+  let x_163 : f32 = pbc;
+  let x_165 : bool = ((x_161 < 0.0) && (x_163 < 0.0));
+  x_174_phi = x_165;
+  if (!(x_165)) {
+    let x_169 : f32 = pab;
+    let x_171 : f32 = pbc;
+    x_173 = ((x_169 >= 0.0) && (x_171 >= 0.0));
+    x_174_phi = x_173;
+  }
+  let x_174 : bool = x_174_phi;
+  if (!(x_174)) {
+    return 0;
+  }
+  let x_178 : f32 = *(x_124);
+  let x_179 : f32 = *(x_152);
+  let x_181 : f32 = *(x_129);
+  let x_182 : f32 = *(x_119);
+  let x_185 : f32 = *(x_126);
+  let x_186 : f32 = *(x_152);
+  let x_188 : f32 = *(x_131);
+  let x_189 : f32 = *(x_119);
+  param_4 = vec2<f32>((x_178 - x_179), (x_181 - x_182));
+  param_5 = vec2<f32>((x_185 - x_186), (x_188 - x_189));
+  let x_192 : f32 = cross2d_vf2_vf2_(&(param_4), &(param_5));
+  pca = x_192;
+  let x_193 : f32 = pab;
+  let x_195 : f32 = pca;
+  let x_197 : bool = ((x_193 < 0.0) && (x_195 < 0.0));
+  x_206_phi = x_197;
+  if (!(x_197)) {
+    let x_201 : f32 = pab;
+    let x_203 : f32 = pca;
+    x_205 = ((x_201 >= 0.0) && (x_203 >= 0.0));
+    x_206_phi = x_205;
+  }
+  let x_206 : bool = x_206_phi;
+  if (!(x_206)) {
+    return 0;
+  }
+  return 1;
+}
+
+fn main_1() {
+  var pos : vec2<f32>;
+  var param_6 : vec2<f32>;
+  var param_7 : vec2<f32>;
+  var param_8 : vec2<f32>;
+  var param_9 : vec2<f32>;
+  let x_72 : vec4<f32> = gl_FragCoord;
+  let x_75 : vec2<f32> = x_15.resolution;
+  pos = (vec2<f32>(x_72.x, x_72.y) / x_75);
+  let x_77 : vec2<f32> = pos;
+  param_6 = x_77;
+  param_7 = vec2<f32>(0.699999988, 0.300000012);
+  param_8 = vec2<f32>(0.5, 0.899999976);
+  param_9 = vec2<f32>(0.100000001, 0.400000006);
+  let x_78 : i32 = pointInTriangle_vf2_vf2_vf2_vf2_(&(param_6), &(param_7), &(param_8), &(param_9));
+  if ((x_78 == 1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..75aaaf6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.wgsl.expected.hlsl
@@ -0,0 +1,168 @@
+cbuffer cbuffer_x_15 : register(b0, space0) {
+  uint4 x_15[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float cross2d_vf2_vf2_(inout float2 a, inout float2 b) {
+  const float x_85 = a.x;
+  const float x_87 = b.y;
+  const float x_90 = b.x;
+  const float x_92 = a.y;
+  return ((x_85 * x_87) - (x_90 * x_92));
+}
+
+int pointInTriangle_vf2_vf2_vf2_vf2_(inout float2 p, inout float2 a_1, inout float2 b_1, inout float2 c) {
+  float var_y = 0.0f;
+  float x_96 = 0.0f;
+  float x_97 = 0.0f;
+  float clamp_y = 0.0f;
+  float pab = 0.0f;
+  float2 param = float2(0.0f, 0.0f);
+  float2 param_1 = float2(0.0f, 0.0f);
+  float pbc = 0.0f;
+  float2 param_2 = float2(0.0f, 0.0f);
+  float2 param_3 = float2(0.0f, 0.0f);
+  float pca = 0.0f;
+  float2 param_4 = float2(0.0f, 0.0f);
+  float2 param_5 = float2(0.0f, 0.0f);
+  bool x_173 = false;
+  bool x_205 = false;
+  bool x_174_phi = false;
+  bool x_206_phi = false;
+  const float x_99 = asfloat(x_15[0].x);
+  const float x_101 = asfloat(x_15[0].y);
+  if ((x_99 == x_101)) {
+    const float x_107 = c.y;
+    const float2 x_108 = float2(0.0f, x_107);
+    if (true) {
+      const float x_112 = c.y;
+      x_97 = x_112;
+    } else {
+      x_97 = 1.0f;
+    }
+    const float x_113 = x_97;
+    const float x_114 = c.y;
+    const float2 x_116 = float2(1.0f, max(x_113, x_114));
+    const float2 x_117 = float2(x_108.x, x_108.y);
+    x_96 = x_107;
+  } else {
+    x_96 = -1.0f;
+  }
+  var_y = x_96;
+  const float x_120 = c.y;
+  const float x_121 = c.y;
+  clamp_y = clamp(x_120, x_121, var_y);
+  const float x_125 = p.x;
+  const float x_127 = a_1.x;
+  const float x_130 = p.y;
+  const float x_132 = a_1.y;
+  const float x_136 = b_1.x;
+  const float x_137 = a_1.x;
+  const float x_140 = b_1.y;
+  const float x_141 = a_1.y;
+  param = float2((x_125 - x_127), (x_130 - x_132));
+  param_1 = float2((x_136 - x_137), (x_140 - x_141));
+  const float x_144 = cross2d_vf2_vf2_(param, param_1);
+  pab = x_144;
+  const float x_145 = p.x;
+  const float x_146 = b_1.x;
+  const float x_148 = p.y;
+  const float x_149 = b_1.y;
+  const float x_153 = c.x;
+  const float x_154 = b_1.x;
+  const float x_156 = clamp_y;
+  const float x_157 = b_1.y;
+  param_2 = float2((x_145 - x_146), (x_148 - x_149));
+  param_3 = float2((x_153 - x_154), (x_156 - x_157));
+  const float x_160 = cross2d_vf2_vf2_(param_2, param_3);
+  pbc = x_160;
+  bool tint_tmp = (pab < 0.0f);
+  if (tint_tmp) {
+    tint_tmp = (pbc < 0.0f);
+  }
+  const bool x_165 = (tint_tmp);
+  x_174_phi = x_165;
+  if (!(x_165)) {
+    bool tint_tmp_1 = (pab >= 0.0f);
+    if (tint_tmp_1) {
+      tint_tmp_1 = (pbc >= 0.0f);
+    }
+    x_173 = (tint_tmp_1);
+    x_174_phi = x_173;
+  }
+  if (!(x_174_phi)) {
+    return 0;
+  }
+  const float x_178 = p.x;
+  const float x_179 = c.x;
+  const float x_181 = p.y;
+  const float x_182 = c.y;
+  const float x_185 = a_1.x;
+  const float x_186 = c.x;
+  const float x_188 = a_1.y;
+  const float x_189 = c.y;
+  param_4 = float2((x_178 - x_179), (x_181 - x_182));
+  param_5 = float2((x_185 - x_186), (x_188 - x_189));
+  const float x_192 = cross2d_vf2_vf2_(param_4, param_5);
+  pca = x_192;
+  bool tint_tmp_2 = (pab < 0.0f);
+  if (tint_tmp_2) {
+    tint_tmp_2 = (pca < 0.0f);
+  }
+  const bool x_197 = (tint_tmp_2);
+  x_206_phi = x_197;
+  if (!(x_197)) {
+    bool tint_tmp_3 = (pab >= 0.0f);
+    if (tint_tmp_3) {
+      tint_tmp_3 = (pca >= 0.0f);
+    }
+    x_205 = (tint_tmp_3);
+    x_206_phi = x_205;
+  }
+  if (!(x_206_phi)) {
+    return 0;
+  }
+  return 1;
+}
+
+void main_1() {
+  float2 pos = float2(0.0f, 0.0f);
+  float2 param_6 = float2(0.0f, 0.0f);
+  float2 param_7 = float2(0.0f, 0.0f);
+  float2 param_8 = float2(0.0f, 0.0f);
+  float2 param_9 = float2(0.0f, 0.0f);
+  const float4 x_72 = gl_FragCoord;
+  const float2 x_75 = asfloat(x_15[0].xy);
+  pos = (float2(x_72.x, x_72.y) / x_75);
+  param_6 = pos;
+  param_7 = float2(0.699999988f, 0.300000012f);
+  param_8 = float2(0.5f, 0.899999976f);
+  param_9 = float2(0.100000001f, 0.400000006f);
+  const int x_78 = pointInTriangle_vf2_vf2_vf2_vf2_(param_6, param_7, param_8, param_9);
+  if ((x_78 == 1)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.wgsl.expected.msl
new file mode 100644
index 0000000..d0400d8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.wgsl.expected.msl
@@ -0,0 +1,164 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float cross2d_vf2_vf2_(thread float2* const a, thread float2* const b) {
+  float const x_85 = (*(a)).x;
+  float const x_87 = (*(b)).y;
+  float const x_90 = (*(b)).x;
+  float const x_92 = (*(a)).y;
+  return ((x_85 * x_87) - (x_90 * x_92));
+}
+
+int pointInTriangle_vf2_vf2_vf2_vf2_(constant buf0& x_15, thread float2* const p, thread float2* const a_1, thread float2* const b_1, thread float2* const c) {
+  float var_y = 0.0f;
+  float x_96 = 0.0f;
+  float x_97 = 0.0f;
+  float clamp_y = 0.0f;
+  float pab = 0.0f;
+  float2 param = 0.0f;
+  float2 param_1 = 0.0f;
+  float pbc = 0.0f;
+  float2 param_2 = 0.0f;
+  float2 param_3 = 0.0f;
+  float pca = 0.0f;
+  float2 param_4 = 0.0f;
+  float2 param_5 = 0.0f;
+  bool x_173 = false;
+  bool x_205 = false;
+  bool x_174_phi = false;
+  bool x_206_phi = false;
+  float const x_99 = x_15.resolution.x;
+  float const x_101 = x_15.resolution.y;
+  if ((x_99 == x_101)) {
+    float const x_107 = (*(c)).y;
+    float2 const x_108 = float2(0.0f, x_107);
+    if (true) {
+      float const x_112 = (*(c)).y;
+      x_97 = x_112;
+    } else {
+      x_97 = 1.0f;
+    }
+    float const x_113 = x_97;
+    float const x_114 = (*(c)).y;
+    float2 const x_116 = float2(1.0f, fmax(x_113, x_114));
+    float2 const x_117 = float2(x_108.x, x_108.y);
+    x_96 = x_107;
+  } else {
+    x_96 = -1.0f;
+  }
+  float const x_118 = x_96;
+  var_y = x_118;
+  float const x_120 = (*(c)).y;
+  float const x_121 = (*(c)).y;
+  float const x_122 = var_y;
+  clamp_y = clamp(x_120, x_121, x_122);
+  float const x_125 = (*(p)).x;
+  float const x_127 = (*(a_1)).x;
+  float const x_130 = (*(p)).y;
+  float const x_132 = (*(a_1)).y;
+  float const x_136 = (*(b_1)).x;
+  float const x_137 = (*(a_1)).x;
+  float const x_140 = (*(b_1)).y;
+  float const x_141 = (*(a_1)).y;
+  param = float2((x_125 - x_127), (x_130 - x_132));
+  param_1 = float2((x_136 - x_137), (x_140 - x_141));
+  float const x_144 = cross2d_vf2_vf2_(&(param), &(param_1));
+  pab = x_144;
+  float const x_145 = (*(p)).x;
+  float const x_146 = (*(b_1)).x;
+  float const x_148 = (*(p)).y;
+  float const x_149 = (*(b_1)).y;
+  float const x_153 = (*(c)).x;
+  float const x_154 = (*(b_1)).x;
+  float const x_156 = clamp_y;
+  float const x_157 = (*(b_1)).y;
+  param_2 = float2((x_145 - x_146), (x_148 - x_149));
+  param_3 = float2((x_153 - x_154), (x_156 - x_157));
+  float const x_160 = cross2d_vf2_vf2_(&(param_2), &(param_3));
+  pbc = x_160;
+  float const x_161 = pab;
+  float const x_163 = pbc;
+  bool const x_165 = ((x_161 < 0.0f) && (x_163 < 0.0f));
+  x_174_phi = x_165;
+  if (!(x_165)) {
+    float const x_169 = pab;
+    float const x_171 = pbc;
+    x_173 = ((x_169 >= 0.0f) && (x_171 >= 0.0f));
+    x_174_phi = x_173;
+  }
+  bool const x_174 = x_174_phi;
+  if (!(x_174)) {
+    return 0;
+  }
+  float const x_178 = (*(p)).x;
+  float const x_179 = (*(c)).x;
+  float const x_181 = (*(p)).y;
+  float const x_182 = (*(c)).y;
+  float const x_185 = (*(a_1)).x;
+  float const x_186 = (*(c)).x;
+  float const x_188 = (*(a_1)).y;
+  float const x_189 = (*(c)).y;
+  param_4 = float2((x_178 - x_179), (x_181 - x_182));
+  param_5 = float2((x_185 - x_186), (x_188 - x_189));
+  float const x_192 = cross2d_vf2_vf2_(&(param_4), &(param_5));
+  pca = x_192;
+  float const x_193 = pab;
+  float const x_195 = pca;
+  bool const x_197 = ((x_193 < 0.0f) && (x_195 < 0.0f));
+  x_206_phi = x_197;
+  if (!(x_197)) {
+    float const x_201 = pab;
+    float const x_203 = pca;
+    x_205 = ((x_201 >= 0.0f) && (x_203 >= 0.0f));
+    x_206_phi = x_205;
+  }
+  bool const x_206 = x_206_phi;
+  if (!(x_206)) {
+    return 0;
+  }
+  return 1;
+}
+
+void main_1(constant buf0& x_15, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float2 pos = 0.0f;
+  float2 param_6 = 0.0f;
+  float2 param_7 = 0.0f;
+  float2 param_8 = 0.0f;
+  float2 param_9 = 0.0f;
+  float4 const x_72 = *(tint_symbol_5);
+  float2 const x_75 = x_15.resolution;
+  pos = (float2(x_72.x, x_72.y) / x_75);
+  float2 const x_77 = pos;
+  param_6 = x_77;
+  param_7 = float2(0.699999988f, 0.300000012f);
+  param_8 = float2(0.5f, 0.899999976f);
+  param_9 = float2(0.100000001f, 0.400000006f);
+  int const x_78 = pointInTriangle_vf2_vf2_vf2_vf2_(x_15, &(param_6), &(param_7), &(param_8), &(param_9));
+  if ((x_78 == 1)) {
+    *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_6) = float4(0.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_15 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_15, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..98ab5e5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.wgsl.expected.spvasm
@@ -0,0 +1,399 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 306
+; Schema: 0
+               OpCapability Shader
+         %97 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_15 "x_15"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %cross2d_vf2_vf2_ "cross2d_vf2_vf2_"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %pointInTriangle_vf2_vf2_vf2_vf2_ "pointInTriangle_vf2_vf2_vf2_vf2_"
+               OpName %p "p"
+               OpName %a_1 "a_1"
+               OpName %b_1 "b_1"
+               OpName %c "c"
+               OpName %var_y "var_y"
+               OpName %x_96 "x_96"
+               OpName %x_97 "x_97"
+               OpName %clamp_y "clamp_y"
+               OpName %pab "pab"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %pbc "pbc"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %pca "pca"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpName %x_173 "x_173"
+               OpName %x_205 "x_205"
+               OpName %x_174_phi "x_174_phi"
+               OpName %x_206_phi "x_206_phi"
+               OpName %main_1 "main_1"
+               OpName %pos "pos"
+               OpName %param_6 "param_6"
+               OpName %param_7 "param_7"
+               OpName %param_8 "param_8"
+               OpName %param_9 "param_9"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_15 NonWritable
+               OpDecorate %x_15 DescriptorSet 0
+               OpDecorate %x_15 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_15 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %15 = OpTypeFunction %float %_ptr_Function_v2float %_ptr_Function_v2float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+        %int = OpTypeInt 32 1
+         %40 = OpTypeFunction %int %_ptr_Function_v2float %_ptr_Function_v2float %_ptr_Function_v2float %_ptr_Function_v2float
+         %49 = OpConstantNull %float
+         %55 = OpConstantNull %v2float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %66 = OpConstantNull %bool
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_0 = OpConstant %float 0
+       %true = OpConstantTrue %bool
+    %float_1 = OpConstant %float 1
+   %float_n1 = OpConstant %float -1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+       %void = OpTypeVoid
+        %255 = OpTypeFunction %void
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+%float_0_699999988 = OpConstant %float 0.699999988
+%float_0_300000012 = OpConstant %float 0.300000012
+        %275 = OpConstantComposite %v2float %float_0_699999988 %float_0_300000012
+  %float_0_5 = OpConstant %float 0.5
+%float_0_899999976 = OpConstant %float 0.899999976
+        %278 = OpConstantComposite %v2float %float_0_5 %float_0_899999976
+%float_0_100000001 = OpConstant %float 0.100000001
+%float_0_400000006 = OpConstant %float 0.400000006
+        %281 = OpConstantComposite %v2float %float_0_100000001 %float_0_400000006
+        %291 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %292 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %293 = OpTypeFunction %void %main_out
+%cross2d_vf2_vf2_ = OpFunction %float None %15
+          %a = OpFunctionParameter %_ptr_Function_v2float
+          %b = OpFunctionParameter %_ptr_Function_v2float
+         %20 = OpLabel
+         %25 = OpAccessChain %_ptr_Function_float %a %uint_0
+         %26 = OpLoad %float %25
+         %29 = OpAccessChain %_ptr_Function_float %b %uint_1
+         %30 = OpLoad %float %29
+         %32 = OpAccessChain %_ptr_Function_float %b %uint_0
+         %33 = OpLoad %float %32
+         %35 = OpAccessChain %_ptr_Function_float %a %uint_1
+         %36 = OpLoad %float %35
+         %37 = OpFMul %float %26 %30
+         %38 = OpFMul %float %33 %36
+         %39 = OpFSub %float %37 %38
+               OpReturnValue %39
+               OpFunctionEnd
+%pointInTriangle_vf2_vf2_vf2_vf2_ = OpFunction %int None %40
+          %p = OpFunctionParameter %_ptr_Function_v2float
+        %a_1 = OpFunctionParameter %_ptr_Function_v2float
+        %b_1 = OpFunctionParameter %_ptr_Function_v2float
+          %c = OpFunctionParameter %_ptr_Function_v2float
+         %47 = OpLabel
+      %var_y = OpVariable %_ptr_Function_float Function %49
+       %x_96 = OpVariable %_ptr_Function_float Function %49
+       %x_97 = OpVariable %_ptr_Function_float Function %49
+    %clamp_y = OpVariable %_ptr_Function_float Function %49
+        %pab = OpVariable %_ptr_Function_float Function %49
+      %param = OpVariable %_ptr_Function_v2float Function %55
+    %param_1 = OpVariable %_ptr_Function_v2float Function %55
+        %pbc = OpVariable %_ptr_Function_float Function %49
+    %param_2 = OpVariable %_ptr_Function_v2float Function %55
+    %param_3 = OpVariable %_ptr_Function_v2float Function %55
+        %pca = OpVariable %_ptr_Function_float Function %49
+    %param_4 = OpVariable %_ptr_Function_v2float Function %55
+    %param_5 = OpVariable %_ptr_Function_v2float Function %55
+      %x_173 = OpVariable %_ptr_Function_bool Function %66
+      %x_205 = OpVariable %_ptr_Function_bool Function %66
+  %x_174_phi = OpVariable %_ptr_Function_bool Function %66
+  %x_206_phi = OpVariable %_ptr_Function_bool Function %66
+         %71 = OpAccessChain %_ptr_Uniform_float %x_15 %uint_0 %uint_0
+         %72 = OpLoad %float %71
+         %73 = OpAccessChain %_ptr_Uniform_float %x_15 %uint_0 %uint_1
+         %74 = OpLoad %float %73
+         %75 = OpFOrdEqual %bool %72 %74
+               OpSelectionMerge %76 None
+               OpBranchConditional %75 %77 %78
+         %77 = OpLabel
+         %80 = OpAccessChain %_ptr_Function_float %c %uint_1
+         %81 = OpLoad %float %80
+         %83 = OpCompositeConstruct %v2float %float_0 %81
+               OpSelectionMerge %85 None
+               OpBranchConditional %true %86 %87
+         %86 = OpLabel
+         %89 = OpAccessChain %_ptr_Function_float %c %uint_1
+         %90 = OpLoad %float %89
+               OpStore %x_97 %90
+               OpBranch %85
+         %87 = OpLabel
+               OpStore %x_97 %float_1
+               OpBranch %85
+         %85 = OpLabel
+         %92 = OpLoad %float %x_97
+         %94 = OpAccessChain %_ptr_Function_float %c %uint_1
+         %95 = OpLoad %float %94
+         %96 = OpExtInst %float %97 NMax %92 %95
+         %98 = OpCompositeConstruct %v2float %float_1 %96
+         %99 = OpCompositeExtract %float %83 0
+        %100 = OpCompositeExtract %float %83 1
+        %101 = OpCompositeConstruct %v2float %99 %100
+               OpStore %x_96 %81
+               OpBranch %76
+         %78 = OpLabel
+               OpStore %x_96 %float_n1
+               OpBranch %76
+         %76 = OpLabel
+        %103 = OpLoad %float %x_96
+               OpStore %var_y %103
+        %105 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %106 = OpLoad %float %105
+        %108 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %109 = OpLoad %float %108
+        %110 = OpLoad %float %var_y
+        %111 = OpExtInst %float %97 NClamp %106 %109 %110
+               OpStore %clamp_y %111
+        %113 = OpAccessChain %_ptr_Function_float %p %uint_0
+        %114 = OpLoad %float %113
+        %116 = OpAccessChain %_ptr_Function_float %a_1 %uint_0
+        %117 = OpLoad %float %116
+        %119 = OpAccessChain %_ptr_Function_float %p %uint_1
+        %120 = OpLoad %float %119
+        %122 = OpAccessChain %_ptr_Function_float %a_1 %uint_1
+        %123 = OpLoad %float %122
+        %125 = OpAccessChain %_ptr_Function_float %b_1 %uint_0
+        %126 = OpLoad %float %125
+        %128 = OpAccessChain %_ptr_Function_float %a_1 %uint_0
+        %129 = OpLoad %float %128
+        %131 = OpAccessChain %_ptr_Function_float %b_1 %uint_1
+        %132 = OpLoad %float %131
+        %134 = OpAccessChain %_ptr_Function_float %a_1 %uint_1
+        %135 = OpLoad %float %134
+        %136 = OpFSub %float %114 %117
+        %137 = OpFSub %float %120 %123
+        %138 = OpCompositeConstruct %v2float %136 %137
+               OpStore %param %138
+        %139 = OpFSub %float %126 %129
+        %140 = OpFSub %float %132 %135
+        %141 = OpCompositeConstruct %v2float %139 %140
+               OpStore %param_1 %141
+        %142 = OpFunctionCall %float %cross2d_vf2_vf2_ %param %param_1
+               OpStore %pab %142
+        %146 = OpAccessChain %_ptr_Function_float %p %uint_0
+        %147 = OpLoad %float %146
+        %149 = OpAccessChain %_ptr_Function_float %b_1 %uint_0
+        %150 = OpLoad %float %149
+        %152 = OpAccessChain %_ptr_Function_float %p %uint_1
+        %153 = OpLoad %float %152
+        %155 = OpAccessChain %_ptr_Function_float %b_1 %uint_1
+        %156 = OpLoad %float %155
+        %158 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %159 = OpLoad %float %158
+        %161 = OpAccessChain %_ptr_Function_float %b_1 %uint_0
+        %162 = OpLoad %float %161
+        %163 = OpLoad %float %clamp_y
+        %165 = OpAccessChain %_ptr_Function_float %b_1 %uint_1
+        %166 = OpLoad %float %165
+        %167 = OpFSub %float %147 %150
+        %168 = OpFSub %float %153 %156
+        %169 = OpCompositeConstruct %v2float %167 %168
+               OpStore %param_2 %169
+        %170 = OpFSub %float %159 %162
+        %171 = OpFSub %float %163 %166
+        %172 = OpCompositeConstruct %v2float %170 %171
+               OpStore %param_3 %172
+        %173 = OpFunctionCall %float %cross2d_vf2_vf2_ %param_2 %param_3
+               OpStore %pbc %173
+        %176 = OpLoad %float %pab
+        %177 = OpLoad %float %pbc
+        %178 = OpFOrdLessThan %bool %176 %float_0
+               OpSelectionMerge %179 None
+               OpBranchConditional %178 %180 %179
+        %180 = OpLabel
+        %181 = OpFOrdLessThan %bool %177 %float_0
+               OpBranch %179
+        %179 = OpLabel
+        %182 = OpPhi %bool %178 %76 %181 %180
+               OpStore %x_174_phi %182
+        %183 = OpLogicalNot %bool %182
+               OpSelectionMerge %184 None
+               OpBranchConditional %183 %185 %184
+        %185 = OpLabel
+        %186 = OpLoad %float %pab
+        %187 = OpLoad %float %pbc
+        %188 = OpFOrdGreaterThanEqual %bool %186 %float_0
+               OpSelectionMerge %189 None
+               OpBranchConditional %188 %190 %189
+        %190 = OpLabel
+        %191 = OpFOrdGreaterThanEqual %bool %187 %float_0
+               OpBranch %189
+        %189 = OpLabel
+        %192 = OpPhi %bool %188 %185 %191 %190
+               OpStore %x_173 %192
+        %193 = OpLoad %bool %x_173
+               OpStore %x_174_phi %193
+               OpBranch %184
+        %184 = OpLabel
+        %194 = OpLoad %bool %x_174_phi
+        %195 = OpLogicalNot %bool %194
+               OpSelectionMerge %196 None
+               OpBranchConditional %195 %197 %196
+        %197 = OpLabel
+               OpReturnValue %int_0
+        %196 = OpLabel
+        %200 = OpAccessChain %_ptr_Function_float %p %uint_0
+        %201 = OpLoad %float %200
+        %203 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %204 = OpLoad %float %203
+        %206 = OpAccessChain %_ptr_Function_float %p %uint_1
+        %207 = OpLoad %float %206
+        %209 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %210 = OpLoad %float %209
+        %212 = OpAccessChain %_ptr_Function_float %a_1 %uint_0
+        %213 = OpLoad %float %212
+        %215 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %216 = OpLoad %float %215
+        %218 = OpAccessChain %_ptr_Function_float %a_1 %uint_1
+        %219 = OpLoad %float %218
+        %221 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %222 = OpLoad %float %221
+        %223 = OpFSub %float %201 %204
+        %224 = OpFSub %float %207 %210
+        %225 = OpCompositeConstruct %v2float %223 %224
+               OpStore %param_4 %225
+        %226 = OpFSub %float %213 %216
+        %227 = OpFSub %float %219 %222
+        %228 = OpCompositeConstruct %v2float %226 %227
+               OpStore %param_5 %228
+        %229 = OpFunctionCall %float %cross2d_vf2_vf2_ %param_4 %param_5
+               OpStore %pca %229
+        %232 = OpLoad %float %pab
+        %233 = OpLoad %float %pca
+        %234 = OpFOrdLessThan %bool %232 %float_0
+               OpSelectionMerge %235 None
+               OpBranchConditional %234 %236 %235
+        %236 = OpLabel
+        %237 = OpFOrdLessThan %bool %233 %float_0
+               OpBranch %235
+        %235 = OpLabel
+        %238 = OpPhi %bool %234 %196 %237 %236
+               OpStore %x_206_phi %238
+        %239 = OpLogicalNot %bool %238
+               OpSelectionMerge %240 None
+               OpBranchConditional %239 %241 %240
+        %241 = OpLabel
+        %242 = OpLoad %float %pab
+        %243 = OpLoad %float %pca
+        %244 = OpFOrdGreaterThanEqual %bool %242 %float_0
+               OpSelectionMerge %245 None
+               OpBranchConditional %244 %246 %245
+        %246 = OpLabel
+        %247 = OpFOrdGreaterThanEqual %bool %243 %float_0
+               OpBranch %245
+        %245 = OpLabel
+        %248 = OpPhi %bool %244 %241 %247 %246
+               OpStore %x_205 %248
+        %249 = OpLoad %bool %x_205
+               OpStore %x_206_phi %249
+               OpBranch %240
+        %240 = OpLabel
+        %250 = OpLoad %bool %x_206_phi
+        %251 = OpLogicalNot %bool %250
+               OpSelectionMerge %252 None
+               OpBranchConditional %251 %253 %252
+        %253 = OpLabel
+               OpReturnValue %int_0
+        %252 = OpLabel
+               OpReturnValue %int_1
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %255
+        %258 = OpLabel
+        %pos = OpVariable %_ptr_Function_v2float Function %55
+    %param_6 = OpVariable %_ptr_Function_v2float Function %55
+    %param_7 = OpVariable %_ptr_Function_v2float Function %55
+    %param_8 = OpVariable %_ptr_Function_v2float Function %55
+    %param_9 = OpVariable %_ptr_Function_v2float Function %55
+        %264 = OpLoad %v4float %gl_FragCoord
+        %266 = OpAccessChain %_ptr_Uniform_v2float %x_15 %uint_0
+        %267 = OpLoad %v2float %266
+        %268 = OpCompositeExtract %float %264 0
+        %269 = OpCompositeExtract %float %264 1
+        %270 = OpCompositeConstruct %v2float %268 %269
+        %271 = OpFDiv %v2float %270 %267
+               OpStore %pos %271
+        %272 = OpLoad %v2float %pos
+               OpStore %param_6 %272
+               OpStore %param_7 %275
+               OpStore %param_8 %278
+               OpStore %param_9 %281
+        %282 = OpFunctionCall %int %pointInTriangle_vf2_vf2_vf2_vf2_ %param_6 %param_7 %param_8 %param_9
+        %287 = OpIEqual %bool %282 %int_1
+               OpSelectionMerge %288 None
+               OpBranchConditional %287 %289 %290
+        %289 = OpLabel
+               OpStore %x_GLF_color %291
+               OpBranch %288
+        %290 = OpLabel
+               OpStore %x_GLF_color %292
+               OpBranch %288
+        %288 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %293
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %297 = OpLabel
+        %298 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %298
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %255
+        %300 = OpLabel
+        %301 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %301
+        %302 = OpFunctionCall %void %main_1
+        %304 = OpLoad %v4float %x_GLF_color
+        %305 = OpCompositeConstruct %main_out %304
+        %303 = OpFunctionCall %void %tint_symbol_3 %305
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..d58c35b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.wgsl.expected.wgsl
@@ -0,0 +1,172 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_15 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn cross2d_vf2_vf2_(a : ptr<function, vec2<f32>>, b : ptr<function, vec2<f32>>) -> f32 {
+  let x_85 : f32 = (*(a)).x;
+  let x_87 : f32 = (*(b)).y;
+  let x_90 : f32 = (*(b)).x;
+  let x_92 : f32 = (*(a)).y;
+  return ((x_85 * x_87) - (x_90 * x_92));
+}
+
+fn pointInTriangle_vf2_vf2_vf2_vf2_(p : ptr<function, vec2<f32>>, a_1 : ptr<function, vec2<f32>>, b_1 : ptr<function, vec2<f32>>, c : ptr<function, vec2<f32>>) -> i32 {
+  var var_y : f32;
+  var x_96 : f32;
+  var x_97 : f32;
+  var clamp_y : f32;
+  var pab : f32;
+  var param : vec2<f32>;
+  var param_1 : vec2<f32>;
+  var pbc : f32;
+  var param_2 : vec2<f32>;
+  var param_3 : vec2<f32>;
+  var pca : f32;
+  var param_4 : vec2<f32>;
+  var param_5 : vec2<f32>;
+  var x_173 : bool;
+  var x_205 : bool;
+  var x_174_phi : bool;
+  var x_206_phi : bool;
+  let x_99 : f32 = x_15.resolution.x;
+  let x_101 : f32 = x_15.resolution.y;
+  if ((x_99 == x_101)) {
+    let x_106 : ptr<function, f32> = &((*(c)).y);
+    let x_107 : f32 = *(x_106);
+    let x_108 : vec2<f32> = vec2<f32>(0.0, x_107);
+    if (true) {
+      let x_112 : f32 = *(x_106);
+      x_97 = x_112;
+    } else {
+      x_97 = 1.0;
+    }
+    let x_113 : f32 = x_97;
+    let x_114 : f32 = *(x_106);
+    let x_116 : vec2<f32> = vec2<f32>(1.0, max(x_113, x_114));
+    let x_117 : vec2<f32> = vec2<f32>(x_108.x, x_108.y);
+    x_96 = x_107;
+  } else {
+    x_96 = -1.0;
+  }
+  let x_118 : f32 = x_96;
+  var_y = x_118;
+  let x_119 : ptr<function, f32> = &((*(c)).y);
+  let x_120 : f32 = *(x_119);
+  let x_121 : f32 = *(x_119);
+  let x_122 : f32 = var_y;
+  clamp_y = clamp(x_120, x_121, x_122);
+  let x_124 : ptr<function, f32> = &((*(p)).x);
+  let x_125 : f32 = *(x_124);
+  let x_126 : ptr<function, f32> = &((*(a_1)).x);
+  let x_127 : f32 = *(x_126);
+  let x_129 : ptr<function, f32> = &((*(p)).y);
+  let x_130 : f32 = *(x_129);
+  let x_131 : ptr<function, f32> = &((*(a_1)).y);
+  let x_132 : f32 = *(x_131);
+  let x_135 : ptr<function, f32> = &((*(b_1)).x);
+  let x_136 : f32 = *(x_135);
+  let x_137 : f32 = *(x_126);
+  let x_139 : ptr<function, f32> = &((*(b_1)).y);
+  let x_140 : f32 = *(x_139);
+  let x_141 : f32 = *(x_131);
+  param = vec2<f32>((x_125 - x_127), (x_130 - x_132));
+  param_1 = vec2<f32>((x_136 - x_137), (x_140 - x_141));
+  let x_144 : f32 = cross2d_vf2_vf2_(&(param), &(param_1));
+  pab = x_144;
+  let x_145 : f32 = *(x_124);
+  let x_146 : f32 = *(x_135);
+  let x_148 : f32 = *(x_129);
+  let x_149 : f32 = *(x_139);
+  let x_152 : ptr<function, f32> = &((*(c)).x);
+  let x_153 : f32 = *(x_152);
+  let x_154 : f32 = *(x_135);
+  let x_156 : f32 = clamp_y;
+  let x_157 : f32 = *(x_139);
+  param_2 = vec2<f32>((x_145 - x_146), (x_148 - x_149));
+  param_3 = vec2<f32>((x_153 - x_154), (x_156 - x_157));
+  let x_160 : f32 = cross2d_vf2_vf2_(&(param_2), &(param_3));
+  pbc = x_160;
+  let x_161 : f32 = pab;
+  let x_163 : f32 = pbc;
+  let x_165 : bool = ((x_161 < 0.0) && (x_163 < 0.0));
+  x_174_phi = x_165;
+  if (!(x_165)) {
+    let x_169 : f32 = pab;
+    let x_171 : f32 = pbc;
+    x_173 = ((x_169 >= 0.0) && (x_171 >= 0.0));
+    x_174_phi = x_173;
+  }
+  let x_174 : bool = x_174_phi;
+  if (!(x_174)) {
+    return 0;
+  }
+  let x_178 : f32 = *(x_124);
+  let x_179 : f32 = *(x_152);
+  let x_181 : f32 = *(x_129);
+  let x_182 : f32 = *(x_119);
+  let x_185 : f32 = *(x_126);
+  let x_186 : f32 = *(x_152);
+  let x_188 : f32 = *(x_131);
+  let x_189 : f32 = *(x_119);
+  param_4 = vec2<f32>((x_178 - x_179), (x_181 - x_182));
+  param_5 = vec2<f32>((x_185 - x_186), (x_188 - x_189));
+  let x_192 : f32 = cross2d_vf2_vf2_(&(param_4), &(param_5));
+  pca = x_192;
+  let x_193 : f32 = pab;
+  let x_195 : f32 = pca;
+  let x_197 : bool = ((x_193 < 0.0) && (x_195 < 0.0));
+  x_206_phi = x_197;
+  if (!(x_197)) {
+    let x_201 : f32 = pab;
+    let x_203 : f32 = pca;
+    x_205 = ((x_201 >= 0.0) && (x_203 >= 0.0));
+    x_206_phi = x_205;
+  }
+  let x_206 : bool = x_206_phi;
+  if (!(x_206)) {
+    return 0;
+  }
+  return 1;
+}
+
+fn main_1() {
+  var pos : vec2<f32>;
+  var param_6 : vec2<f32>;
+  var param_7 : vec2<f32>;
+  var param_8 : vec2<f32>;
+  var param_9 : vec2<f32>;
+  let x_72 : vec4<f32> = gl_FragCoord;
+  let x_75 : vec2<f32> = x_15.resolution;
+  pos = (vec2<f32>(x_72.x, x_72.y) / x_75);
+  let x_77 : vec2<f32> = pos;
+  param_6 = x_77;
+  param_7 = vec2<f32>(0.699999988, 0.300000012);
+  param_8 = vec2<f32>(0.5, 0.899999976);
+  param_9 = vec2<f32>(0.100000001, 0.400000006);
+  let x_78 : i32 = pointInTriangle_vf2_vf2_vf2_vf2_(&(param_6), &(param_7), &(param_8), &(param_9));
+  if ((x_78 == 1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-conditional-clamped-float/0.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-conditional-clamped-float/0.spvasm
new file mode 100644
index 0000000..7352728
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-conditional-clamped-float/0.spvasm
@@ -0,0 +1,266 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %cross2d_vf2_vf2_ "cross2d(vf2;vf2;"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %pointInTriangle_vf2_vf2_vf2_vf2_ "pointInTriangle(vf2;vf2;vf2;vf2;"
+               OpName %p "p"
+               OpName %a_0 "a"
+               OpName %b_0 "b"
+               OpName %c "c"
+               OpName %pab "pab"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %pbc "pbc"
+               OpName %param_1 "param"
+               OpName %param_2 "param"
+               OpName %pca "pca"
+               OpName %param_3 "param"
+               OpName %param_4 "param"
+               OpName %pos "pos"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %param_5 "param"
+               OpName %param_6 "param"
+               OpName %param_7 "param"
+               OpName %param_8 "param"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %30 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %34 = OpTypeFunction %float %_ptr_Function_v2float %_ptr_Function_v2float
+        %int = OpTypeInt 32 1
+         %36 = OpTypeFunction %int %_ptr_Function_v2float %_ptr_Function_v2float %_ptr_Function_v2float %_ptr_Function_v2float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+%float_0_699999988 = OpConstant %float 0.699999988
+%float_0_300000012 = OpConstant %float 0.300000012
+         %51 = OpConstantComposite %v2float %float_0_699999988 %float_0_300000012
+  %float_0_5 = OpConstant %float 0.5
+%float_0_899999976 = OpConstant %float 0.899999976
+         %54 = OpConstantComposite %v2float %float_0_5 %float_0_899999976
+%float_0_100000001 = OpConstant %float 0.100000001
+%float_0_400000006 = OpConstant %float 0.400000006
+         %57 = OpConstantComposite %v2float %float_0_100000001 %float_0_400000006
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+         %60 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %61 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %30
+         %62 = OpLabel
+        %pos = OpVariable %_ptr_Function_v2float Function
+    %param_5 = OpVariable %_ptr_Function_v2float Function
+    %param_6 = OpVariable %_ptr_Function_v2float Function
+    %param_7 = OpVariable %_ptr_Function_v2float Function
+    %param_8 = OpVariable %_ptr_Function_v2float Function
+         %63 = OpLoad %v4float %gl_FragCoord
+         %64 = OpVectorShuffle %v2float %63 %63 0 1
+         %65 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+         %66 = OpLoad %v2float %65
+         %67 = OpFDiv %v2float %64 %66
+               OpStore %pos %67
+         %68 = OpLoad %v2float %pos
+               OpStore %param_5 %68
+               OpStore %param_6 %51
+               OpStore %param_7 %54
+               OpStore %param_8 %57
+         %69 = OpFunctionCall %int %pointInTriangle_vf2_vf2_vf2_vf2_ %param_5 %param_6 %param_7 %param_8
+         %70 = OpIEqual %bool %69 %int_1
+               OpSelectionMerge %71 None
+               OpBranchConditional %70 %72 %73
+         %72 = OpLabel
+               OpStore %_GLF_color %60
+               OpBranch %71
+         %73 = OpLabel
+               OpStore %_GLF_color %61
+               OpBranch %71
+         %71 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%cross2d_vf2_vf2_ = OpFunction %float None %34
+          %a = OpFunctionParameter %_ptr_Function_v2float
+          %b = OpFunctionParameter %_ptr_Function_v2float
+         %74 = OpLabel
+         %75 = OpAccessChain %_ptr_Function_float %a %uint_0
+         %76 = OpLoad %float %75
+         %77 = OpAccessChain %_ptr_Function_float %b %uint_1
+         %78 = OpLoad %float %77
+         %79 = OpFMul %float %76 %78
+         %80 = OpAccessChain %_ptr_Function_float %b %uint_0
+         %81 = OpLoad %float %80
+         %82 = OpAccessChain %_ptr_Function_float %a %uint_1
+         %83 = OpLoad %float %82
+         %84 = OpFMul %float %81 %83
+         %85 = OpFSub %float %79 %84
+               OpReturnValue %85
+               OpFunctionEnd
+%pointInTriangle_vf2_vf2_vf2_vf2_ = OpFunction %int None %36
+          %p = OpFunctionParameter %_ptr_Function_v2float
+        %a_0 = OpFunctionParameter %_ptr_Function_v2float
+        %b_0 = OpFunctionParameter %_ptr_Function_v2float
+          %c = OpFunctionParameter %_ptr_Function_v2float
+         %86 = OpLabel
+        %pab = OpVariable %_ptr_Function_float Function
+      %param = OpVariable %_ptr_Function_v2float Function
+    %param_0 = OpVariable %_ptr_Function_v2float Function
+        %pbc = OpVariable %_ptr_Function_float Function
+    %param_1 = OpVariable %_ptr_Function_v2float Function
+    %param_2 = OpVariable %_ptr_Function_v2float Function
+        %pca = OpVariable %_ptr_Function_float Function
+    %param_3 = OpVariable %_ptr_Function_v2float Function
+    %param_4 = OpVariable %_ptr_Function_v2float Function
+         %87 = OpAccessChain %_ptr_Function_float %p %uint_0
+         %88 = OpLoad %float %87
+         %89 = OpAccessChain %_ptr_Function_float %a_0 %uint_0
+         %90 = OpLoad %float %89
+         %91 = OpFSub %float %88 %90
+         %92 = OpAccessChain %_ptr_Function_float %p %uint_1
+         %93 = OpLoad %float %92
+         %94 = OpAccessChain %_ptr_Function_float %a_0 %uint_1
+         %95 = OpLoad %float %94
+         %96 = OpFSub %float %93 %95
+         %97 = OpCompositeConstruct %v2float %91 %96
+         %98 = OpAccessChain %_ptr_Function_float %b_0 %uint_0
+         %99 = OpLoad %float %98
+        %100 = OpAccessChain %_ptr_Function_float %a_0 %uint_0
+        %101 = OpLoad %float %100
+        %102 = OpFSub %float %99 %101
+        %103 = OpAccessChain %_ptr_Function_float %b_0 %uint_1
+        %104 = OpLoad %float %103
+        %105 = OpAccessChain %_ptr_Function_float %a_0 %uint_1
+        %106 = OpLoad %float %105
+        %107 = OpFSub %float %104 %106
+        %108 = OpCompositeConstruct %v2float %102 %107
+               OpStore %param %97
+               OpStore %param_0 %108
+        %109 = OpFunctionCall %float %cross2d_vf2_vf2_ %param %param_0
+               OpStore %pab %109
+        %110 = OpAccessChain %_ptr_Function_float %p %uint_0
+        %111 = OpLoad %float %110
+        %112 = OpAccessChain %_ptr_Function_float %b_0 %uint_0
+        %113 = OpLoad %float %112
+        %114 = OpFSub %float %111 %113
+        %115 = OpAccessChain %_ptr_Function_float %p %uint_1
+        %116 = OpLoad %float %115
+        %117 = OpAccessChain %_ptr_Function_float %b_0 %uint_1
+        %118 = OpLoad %float %117
+        %119 = OpFSub %float %116 %118
+        %120 = OpCompositeConstruct %v2float %114 %119
+        %121 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %122 = OpLoad %float %121
+        %123 = OpAccessChain %_ptr_Function_float %b_0 %uint_0
+        %124 = OpLoad %float %123
+        %125 = OpFSub %float %122 %124
+        %126 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %127 = OpLoad %float %126
+        %128 = OpAccessChain %_ptr_Function_float %b_0 %uint_1
+        %129 = OpLoad %float %128
+        %130 = OpFSub %float %127 %129
+        %131 = OpCompositeConstruct %v2float %125 %130
+               OpStore %param_1 %120
+               OpStore %param_2 %131
+        %132 = OpFunctionCall %float %cross2d_vf2_vf2_ %param_1 %param_2
+               OpStore %pbc %132
+        %133 = OpLoad %float %pab
+        %134 = OpFOrdLessThan %bool %133 %float_0
+        %135 = OpLoad %float %pbc
+        %136 = OpFOrdLessThan %bool %135 %float_0
+        %137 = OpLogicalAnd %bool %134 %136
+        %138 = OpLogicalNot %bool %137
+               OpSelectionMerge %139 None
+               OpBranchConditional %138 %140 %139
+        %140 = OpLabel
+        %141 = OpLoad %float %pab
+        %142 = OpFOrdGreaterThanEqual %bool %141 %float_0
+        %143 = OpLoad %float %pbc
+        %144 = OpFOrdGreaterThanEqual %bool %143 %float_0
+        %145 = OpLogicalAnd %bool %142 %144
+               OpBranch %139
+        %139 = OpLabel
+        %146 = OpPhi %bool %137 %86 %145 %140
+        %147 = OpLogicalNot %bool %146
+               OpSelectionMerge %148 None
+               OpBranchConditional %147 %149 %148
+        %149 = OpLabel
+               OpReturnValue %int_0
+        %148 = OpLabel
+        %150 = OpAccessChain %_ptr_Function_float %p %uint_0
+        %151 = OpLoad %float %150
+        %152 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %153 = OpLoad %float %152
+        %154 = OpFSub %float %151 %153
+        %155 = OpAccessChain %_ptr_Function_float %p %uint_1
+        %156 = OpLoad %float %155
+        %157 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %158 = OpLoad %float %157
+        %159 = OpFSub %float %156 %158
+        %160 = OpCompositeConstruct %v2float %154 %159
+        %161 = OpAccessChain %_ptr_Function_float %a_0 %uint_0
+        %162 = OpLoad %float %161
+        %163 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %164 = OpLoad %float %163
+        %165 = OpFSub %float %162 %164
+        %166 = OpAccessChain %_ptr_Function_float %a_0 %uint_1
+        %167 = OpLoad %float %166
+        %168 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %169 = OpLoad %float %168
+        %170 = OpFSub %float %167 %169
+        %171 = OpCompositeConstruct %v2float %165 %170
+               OpStore %param_3 %160
+               OpStore %param_4 %171
+        %172 = OpFunctionCall %float %cross2d_vf2_vf2_ %param_3 %param_4
+               OpStore %pca %172
+        %173 = OpLoad %float %pab
+        %174 = OpFOrdLessThan %bool %173 %float_0
+        %175 = OpLoad %float %pca
+        %176 = OpFOrdLessThan %bool %175 %float_0
+        %177 = OpLogicalAnd %bool %174 %176
+        %178 = OpLogicalNot %bool %177
+               OpSelectionMerge %179 None
+               OpBranchConditional %178 %180 %179
+        %180 = OpLabel
+        %181 = OpLoad %float %pab
+        %182 = OpFOrdGreaterThanEqual %bool %181 %float_0
+        %183 = OpLoad %float %pca
+        %184 = OpFOrdGreaterThanEqual %bool %183 %float_0
+        %185 = OpLogicalAnd %bool %182 %184
+               OpBranch %179
+        %179 = OpLabel
+        %186 = OpPhi %bool %177 %148 %185 %180
+        %187 = OpLogicalNot %bool %186
+               OpSelectionMerge %188 None
+               OpBranchConditional %187 %189 %188
+        %189 = OpLabel
+               OpReturnValue %int_0
+        %188 = OpLabel
+               OpReturnValue %int_1
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-conditional-clamped-float/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-conditional-clamped-float/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..f228156
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-conditional-clamped-float/0.spvasm.expected.hlsl
@@ -0,0 +1,141 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_24 : register(b0, space0) {
+  uint4 x_24[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float cross2d_vf2_vf2_(inout float2 a, inout float2 b) {
+  const float x_76 = a.x;
+  const float x_78 = b.y;
+  const float x_81 = b.x;
+  const float x_83 = a.y;
+  return ((x_76 * x_78) - (x_81 * x_83));
+}
+
+int pointInTriangle_vf2_vf2_vf2_vf2_(inout float2 p, inout float2 a_1, inout float2 b_1, inout float2 c) {
+  float pab = 0.0f;
+  float2 param = float2(0.0f, 0.0f);
+  float2 param_1 = float2(0.0f, 0.0f);
+  float pbc = 0.0f;
+  float2 param_2 = float2(0.0f, 0.0f);
+  float2 param_3 = float2(0.0f, 0.0f);
+  float pca = 0.0f;
+  float2 param_4 = float2(0.0f, 0.0f);
+  float2 param_5 = float2(0.0f, 0.0f);
+  bool x_145 = false;
+  bool x_185 = false;
+  bool x_146_phi = false;
+  bool x_186_phi = false;
+  const float x_88 = p.x;
+  const float x_90 = a_1.x;
+  const float x_93 = p.y;
+  const float x_95 = a_1.y;
+  const float x_99 = b_1.x;
+  const float x_101 = a_1.x;
+  const float x_104 = b_1.y;
+  const float x_106 = a_1.y;
+  param = float2((x_88 - x_90), (x_93 - x_95));
+  param_1 = float2((x_99 - x_101), (x_104 - x_106));
+  const float x_109 = cross2d_vf2_vf2_(param, param_1);
+  pab = x_109;
+  const float x_111 = p.x;
+  const float x_113 = b_1.x;
+  const float x_116 = p.y;
+  const float x_118 = b_1.y;
+  const float x_122 = c.x;
+  const float x_124 = b_1.x;
+  const float x_127 = c.y;
+  const float x_129 = b_1.y;
+  param_2 = float2((x_111 - x_113), (x_116 - x_118));
+  param_3 = float2((x_122 - x_124), (x_127 - x_129));
+  const float x_132 = cross2d_vf2_vf2_(param_2, param_3);
+  pbc = x_132;
+  bool tint_tmp = (pab < 0.0f);
+  if (tint_tmp) {
+    tint_tmp = (pbc < 0.0f);
+  }
+  const bool x_137 = (tint_tmp);
+  x_146_phi = x_137;
+  if (!(x_137)) {
+    bool tint_tmp_1 = (pab >= 0.0f);
+    if (tint_tmp_1) {
+      tint_tmp_1 = (pbc >= 0.0f);
+    }
+    x_145 = (tint_tmp_1);
+    x_146_phi = x_145;
+  }
+  if (!(x_146_phi)) {
+    return 0;
+  }
+  const float x_151 = p.x;
+  const float x_153 = c.x;
+  const float x_156 = p.y;
+  const float x_158 = c.y;
+  const float x_162 = a_1.x;
+  const float x_164 = c.x;
+  const float x_167 = a_1.y;
+  const float x_169 = c.y;
+  param_4 = float2((x_151 - x_153), (x_156 - x_158));
+  param_5 = float2((x_162 - x_164), (x_167 - x_169));
+  const float x_172 = cross2d_vf2_vf2_(param_4, param_5);
+  pca = x_172;
+  bool tint_tmp_2 = (pab < 0.0f);
+  if (tint_tmp_2) {
+    tint_tmp_2 = (pca < 0.0f);
+  }
+  const bool x_177 = (tint_tmp_2);
+  x_186_phi = x_177;
+  if (!(x_177)) {
+    bool tint_tmp_3 = (pab >= 0.0f);
+    if (tint_tmp_3) {
+      tint_tmp_3 = (pca >= 0.0f);
+    }
+    x_185 = (tint_tmp_3);
+    x_186_phi = x_185;
+  }
+  if (!(x_186_phi)) {
+    return 0;
+  }
+  return 1;
+}
+
+void main_1() {
+  float2 pos = float2(0.0f, 0.0f);
+  float2 param_6 = float2(0.0f, 0.0f);
+  float2 param_7 = float2(0.0f, 0.0f);
+  float2 param_8 = float2(0.0f, 0.0f);
+  float2 param_9 = float2(0.0f, 0.0f);
+  const float4 x_63 = gl_FragCoord;
+  const float2 x_66 = asfloat(x_24[0].xy);
+  pos = (float2(x_63.x, x_63.y) / x_66);
+  param_6 = pos;
+  param_7 = float2(0.699999988f, 0.300000012f);
+  param_8 = float2(0.5f, 0.899999976f);
+  param_9 = float2(0.100000001f, 0.400000006f);
+  const int x_69 = pointInTriangle_vf2_vf2_vf2_vf2_(param_6, param_7, param_8, param_9);
+  if ((x_69 == 1)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-conditional-clamped-float/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-conditional-clamped-float/0.spvasm.expected.msl
new file mode 100644
index 0000000..8d1f7be
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-conditional-clamped-float/0.spvasm.expected.msl
@@ -0,0 +1,135 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float cross2d_vf2_vf2_(thread float2* const a, thread float2* const b) {
+  float const x_76 = (*(a)).x;
+  float const x_78 = (*(b)).y;
+  float const x_81 = (*(b)).x;
+  float const x_83 = (*(a)).y;
+  return ((x_76 * x_78) - (x_81 * x_83));
+}
+
+int pointInTriangle_vf2_vf2_vf2_vf2_(thread float2* const p, thread float2* const a_1, thread float2* const b_1, thread float2* const c) {
+  float pab = 0.0f;
+  float2 param = 0.0f;
+  float2 param_1 = 0.0f;
+  float pbc = 0.0f;
+  float2 param_2 = 0.0f;
+  float2 param_3 = 0.0f;
+  float pca = 0.0f;
+  float2 param_4 = 0.0f;
+  float2 param_5 = 0.0f;
+  bool x_145 = false;
+  bool x_185 = false;
+  bool x_146_phi = false;
+  bool x_186_phi = false;
+  float const x_88 = (*(p)).x;
+  float const x_90 = (*(a_1)).x;
+  float const x_93 = (*(p)).y;
+  float const x_95 = (*(a_1)).y;
+  float const x_99 = (*(b_1)).x;
+  float const x_101 = (*(a_1)).x;
+  float const x_104 = (*(b_1)).y;
+  float const x_106 = (*(a_1)).y;
+  param = float2((x_88 - x_90), (x_93 - x_95));
+  param_1 = float2((x_99 - x_101), (x_104 - x_106));
+  float const x_109 = cross2d_vf2_vf2_(&(param), &(param_1));
+  pab = x_109;
+  float const x_111 = (*(p)).x;
+  float const x_113 = (*(b_1)).x;
+  float const x_116 = (*(p)).y;
+  float const x_118 = (*(b_1)).y;
+  float const x_122 = (*(c)).x;
+  float const x_124 = (*(b_1)).x;
+  float const x_127 = (*(c)).y;
+  float const x_129 = (*(b_1)).y;
+  param_2 = float2((x_111 - x_113), (x_116 - x_118));
+  param_3 = float2((x_122 - x_124), (x_127 - x_129));
+  float const x_132 = cross2d_vf2_vf2_(&(param_2), &(param_3));
+  pbc = x_132;
+  float const x_133 = pab;
+  float const x_135 = pbc;
+  bool const x_137 = ((x_133 < 0.0f) && (x_135 < 0.0f));
+  x_146_phi = x_137;
+  if (!(x_137)) {
+    float const x_141 = pab;
+    float const x_143 = pbc;
+    x_145 = ((x_141 >= 0.0f) && (x_143 >= 0.0f));
+    x_146_phi = x_145;
+  }
+  bool const x_146 = x_146_phi;
+  if (!(x_146)) {
+    return 0;
+  }
+  float const x_151 = (*(p)).x;
+  float const x_153 = (*(c)).x;
+  float const x_156 = (*(p)).y;
+  float const x_158 = (*(c)).y;
+  float const x_162 = (*(a_1)).x;
+  float const x_164 = (*(c)).x;
+  float const x_167 = (*(a_1)).y;
+  float const x_169 = (*(c)).y;
+  param_4 = float2((x_151 - x_153), (x_156 - x_158));
+  param_5 = float2((x_162 - x_164), (x_167 - x_169));
+  float const x_172 = cross2d_vf2_vf2_(&(param_4), &(param_5));
+  pca = x_172;
+  float const x_173 = pab;
+  float const x_175 = pca;
+  bool const x_177 = ((x_173 < 0.0f) && (x_175 < 0.0f));
+  x_186_phi = x_177;
+  if (!(x_177)) {
+    float const x_181 = pab;
+    float const x_183 = pca;
+    x_185 = ((x_181 >= 0.0f) && (x_183 >= 0.0f));
+    x_186_phi = x_185;
+  }
+  bool const x_186 = x_186_phi;
+  if (!(x_186)) {
+    return 0;
+  }
+  return 1;
+}
+
+void main_1(constant buf0& x_24, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float2 pos = 0.0f;
+  float2 param_6 = 0.0f;
+  float2 param_7 = 0.0f;
+  float2 param_8 = 0.0f;
+  float2 param_9 = 0.0f;
+  float4 const x_63 = *(tint_symbol_5);
+  float2 const x_66 = x_24.resolution;
+  pos = (float2(x_63.x, x_63.y) / x_66);
+  float2 const x_68 = pos;
+  param_6 = x_68;
+  param_7 = float2(0.699999988f, 0.300000012f);
+  param_8 = float2(0.5f, 0.899999976f);
+  param_9 = float2(0.100000001f, 0.400000006f);
+  int const x_69 = pointInTriangle_vf2_vf2_vf2_vf2_(&(param_6), &(param_7), &(param_8), &(param_9));
+  if ((x_69 == 1)) {
+    *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_6) = float4(0.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_24 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_24, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-conditional-clamped-float/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-conditional-clamped-float/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..0d3239b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-conditional-clamped-float/0.spvasm.expected.spvasm
@@ -0,0 +1,343 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 264
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_24 "x_24"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %cross2d_vf2_vf2_ "cross2d_vf2_vf2_"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %pointInTriangle_vf2_vf2_vf2_vf2_ "pointInTriangle_vf2_vf2_vf2_vf2_"
+               OpName %p "p"
+               OpName %a_1 "a_1"
+               OpName %b_1 "b_1"
+               OpName %c "c"
+               OpName %pab "pab"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %pbc "pbc"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %pca "pca"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpName %x_145 "x_145"
+               OpName %x_185 "x_185"
+               OpName %x_146_phi "x_146_phi"
+               OpName %x_186_phi "x_186_phi"
+               OpName %main_1 "main_1"
+               OpName %pos "pos"
+               OpName %param_6 "param_6"
+               OpName %param_7 "param_7"
+               OpName %param_8 "param_8"
+               OpName %param_9 "param_9"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_24 NonWritable
+               OpDecorate %x_24 DescriptorSet 0
+               OpDecorate %x_24 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_24 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %15 = OpTypeFunction %float %_ptr_Function_v2float %_ptr_Function_v2float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+        %int = OpTypeInt 32 1
+         %40 = OpTypeFunction %int %_ptr_Function_v2float %_ptr_Function_v2float %_ptr_Function_v2float %_ptr_Function_v2float
+         %49 = OpConstantNull %float
+         %51 = OpConstantNull %v2float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %62 = OpConstantNull %bool
+    %float_0 = OpConstant %float 0
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+       %void = OpTypeVoid
+        %212 = OpTypeFunction %void
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+%float_0_699999988 = OpConstant %float 0.699999988
+%float_0_300000012 = OpConstant %float 0.300000012
+        %232 = OpConstantComposite %v2float %float_0_699999988 %float_0_300000012
+  %float_0_5 = OpConstant %float 0.5
+%float_0_899999976 = OpConstant %float 0.899999976
+        %235 = OpConstantComposite %v2float %float_0_5 %float_0_899999976
+%float_0_100000001 = OpConstant %float 0.100000001
+%float_0_400000006 = OpConstant %float 0.400000006
+        %238 = OpConstantComposite %v2float %float_0_100000001 %float_0_400000006
+    %float_1 = OpConstant %float 1
+        %249 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %250 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %251 = OpTypeFunction %void %main_out
+%cross2d_vf2_vf2_ = OpFunction %float None %15
+          %a = OpFunctionParameter %_ptr_Function_v2float
+          %b = OpFunctionParameter %_ptr_Function_v2float
+         %20 = OpLabel
+         %25 = OpAccessChain %_ptr_Function_float %a %uint_0
+         %26 = OpLoad %float %25
+         %29 = OpAccessChain %_ptr_Function_float %b %uint_1
+         %30 = OpLoad %float %29
+         %32 = OpAccessChain %_ptr_Function_float %b %uint_0
+         %33 = OpLoad %float %32
+         %35 = OpAccessChain %_ptr_Function_float %a %uint_1
+         %36 = OpLoad %float %35
+         %37 = OpFMul %float %26 %30
+         %38 = OpFMul %float %33 %36
+         %39 = OpFSub %float %37 %38
+               OpReturnValue %39
+               OpFunctionEnd
+%pointInTriangle_vf2_vf2_vf2_vf2_ = OpFunction %int None %40
+          %p = OpFunctionParameter %_ptr_Function_v2float
+        %a_1 = OpFunctionParameter %_ptr_Function_v2float
+        %b_1 = OpFunctionParameter %_ptr_Function_v2float
+          %c = OpFunctionParameter %_ptr_Function_v2float
+         %47 = OpLabel
+        %pab = OpVariable %_ptr_Function_float Function %49
+      %param = OpVariable %_ptr_Function_v2float Function %51
+    %param_1 = OpVariable %_ptr_Function_v2float Function %51
+        %pbc = OpVariable %_ptr_Function_float Function %49
+    %param_2 = OpVariable %_ptr_Function_v2float Function %51
+    %param_3 = OpVariable %_ptr_Function_v2float Function %51
+        %pca = OpVariable %_ptr_Function_float Function %49
+    %param_4 = OpVariable %_ptr_Function_v2float Function %51
+    %param_5 = OpVariable %_ptr_Function_v2float Function %51
+      %x_145 = OpVariable %_ptr_Function_bool Function %62
+      %x_185 = OpVariable %_ptr_Function_bool Function %62
+  %x_146_phi = OpVariable %_ptr_Function_bool Function %62
+  %x_186_phi = OpVariable %_ptr_Function_bool Function %62
+         %67 = OpAccessChain %_ptr_Function_float %p %uint_0
+         %68 = OpLoad %float %67
+         %70 = OpAccessChain %_ptr_Function_float %a_1 %uint_0
+         %71 = OpLoad %float %70
+         %73 = OpAccessChain %_ptr_Function_float %p %uint_1
+         %74 = OpLoad %float %73
+         %76 = OpAccessChain %_ptr_Function_float %a_1 %uint_1
+         %77 = OpLoad %float %76
+         %79 = OpAccessChain %_ptr_Function_float %b_1 %uint_0
+         %80 = OpLoad %float %79
+         %82 = OpAccessChain %_ptr_Function_float %a_1 %uint_0
+         %83 = OpLoad %float %82
+         %85 = OpAccessChain %_ptr_Function_float %b_1 %uint_1
+         %86 = OpLoad %float %85
+         %88 = OpAccessChain %_ptr_Function_float %a_1 %uint_1
+         %89 = OpLoad %float %88
+         %90 = OpFSub %float %68 %71
+         %91 = OpFSub %float %74 %77
+         %92 = OpCompositeConstruct %v2float %90 %91
+               OpStore %param %92
+         %93 = OpFSub %float %80 %83
+         %94 = OpFSub %float %86 %89
+         %95 = OpCompositeConstruct %v2float %93 %94
+               OpStore %param_1 %95
+         %96 = OpFunctionCall %float %cross2d_vf2_vf2_ %param %param_1
+               OpStore %pab %96
+        %100 = OpAccessChain %_ptr_Function_float %p %uint_0
+        %101 = OpLoad %float %100
+        %103 = OpAccessChain %_ptr_Function_float %b_1 %uint_0
+        %104 = OpLoad %float %103
+        %106 = OpAccessChain %_ptr_Function_float %p %uint_1
+        %107 = OpLoad %float %106
+        %109 = OpAccessChain %_ptr_Function_float %b_1 %uint_1
+        %110 = OpLoad %float %109
+        %112 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %113 = OpLoad %float %112
+        %115 = OpAccessChain %_ptr_Function_float %b_1 %uint_0
+        %116 = OpLoad %float %115
+        %118 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %119 = OpLoad %float %118
+        %121 = OpAccessChain %_ptr_Function_float %b_1 %uint_1
+        %122 = OpLoad %float %121
+        %123 = OpFSub %float %101 %104
+        %124 = OpFSub %float %107 %110
+        %125 = OpCompositeConstruct %v2float %123 %124
+               OpStore %param_2 %125
+        %126 = OpFSub %float %113 %116
+        %127 = OpFSub %float %119 %122
+        %128 = OpCompositeConstruct %v2float %126 %127
+               OpStore %param_3 %128
+        %129 = OpFunctionCall %float %cross2d_vf2_vf2_ %param_2 %param_3
+               OpStore %pbc %129
+        %132 = OpLoad %float %pab
+        %133 = OpLoad %float %pbc
+        %135 = OpFOrdLessThan %bool %132 %float_0
+               OpSelectionMerge %136 None
+               OpBranchConditional %135 %137 %136
+        %137 = OpLabel
+        %138 = OpFOrdLessThan %bool %133 %float_0
+               OpBranch %136
+        %136 = OpLabel
+        %139 = OpPhi %bool %135 %47 %138 %137
+               OpStore %x_146_phi %139
+        %140 = OpLogicalNot %bool %139
+               OpSelectionMerge %141 None
+               OpBranchConditional %140 %142 %141
+        %142 = OpLabel
+        %143 = OpLoad %float %pab
+        %144 = OpLoad %float %pbc
+        %145 = OpFOrdGreaterThanEqual %bool %143 %float_0
+               OpSelectionMerge %146 None
+               OpBranchConditional %145 %147 %146
+        %147 = OpLabel
+        %148 = OpFOrdGreaterThanEqual %bool %144 %float_0
+               OpBranch %146
+        %146 = OpLabel
+        %149 = OpPhi %bool %145 %142 %148 %147
+               OpStore %x_145 %149
+        %150 = OpLoad %bool %x_145
+               OpStore %x_146_phi %150
+               OpBranch %141
+        %141 = OpLabel
+        %151 = OpLoad %bool %x_146_phi
+        %152 = OpLogicalNot %bool %151
+               OpSelectionMerge %153 None
+               OpBranchConditional %152 %154 %153
+        %154 = OpLabel
+               OpReturnValue %int_0
+        %153 = OpLabel
+        %157 = OpAccessChain %_ptr_Function_float %p %uint_0
+        %158 = OpLoad %float %157
+        %160 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %161 = OpLoad %float %160
+        %163 = OpAccessChain %_ptr_Function_float %p %uint_1
+        %164 = OpLoad %float %163
+        %166 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %167 = OpLoad %float %166
+        %169 = OpAccessChain %_ptr_Function_float %a_1 %uint_0
+        %170 = OpLoad %float %169
+        %172 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %173 = OpLoad %float %172
+        %175 = OpAccessChain %_ptr_Function_float %a_1 %uint_1
+        %176 = OpLoad %float %175
+        %178 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %179 = OpLoad %float %178
+        %180 = OpFSub %float %158 %161
+        %181 = OpFSub %float %164 %167
+        %182 = OpCompositeConstruct %v2float %180 %181
+               OpStore %param_4 %182
+        %183 = OpFSub %float %170 %173
+        %184 = OpFSub %float %176 %179
+        %185 = OpCompositeConstruct %v2float %183 %184
+               OpStore %param_5 %185
+        %186 = OpFunctionCall %float %cross2d_vf2_vf2_ %param_4 %param_5
+               OpStore %pca %186
+        %189 = OpLoad %float %pab
+        %190 = OpLoad %float %pca
+        %191 = OpFOrdLessThan %bool %189 %float_0
+               OpSelectionMerge %192 None
+               OpBranchConditional %191 %193 %192
+        %193 = OpLabel
+        %194 = OpFOrdLessThan %bool %190 %float_0
+               OpBranch %192
+        %192 = OpLabel
+        %195 = OpPhi %bool %191 %153 %194 %193
+               OpStore %x_186_phi %195
+        %196 = OpLogicalNot %bool %195
+               OpSelectionMerge %197 None
+               OpBranchConditional %196 %198 %197
+        %198 = OpLabel
+        %199 = OpLoad %float %pab
+        %200 = OpLoad %float %pca
+        %201 = OpFOrdGreaterThanEqual %bool %199 %float_0
+               OpSelectionMerge %202 None
+               OpBranchConditional %201 %203 %202
+        %203 = OpLabel
+        %204 = OpFOrdGreaterThanEqual %bool %200 %float_0
+               OpBranch %202
+        %202 = OpLabel
+        %205 = OpPhi %bool %201 %198 %204 %203
+               OpStore %x_185 %205
+        %206 = OpLoad %bool %x_185
+               OpStore %x_186_phi %206
+               OpBranch %197
+        %197 = OpLabel
+        %207 = OpLoad %bool %x_186_phi
+        %208 = OpLogicalNot %bool %207
+               OpSelectionMerge %209 None
+               OpBranchConditional %208 %210 %209
+        %210 = OpLabel
+               OpReturnValue %int_0
+        %209 = OpLabel
+               OpReturnValue %int_1
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %212
+        %215 = OpLabel
+        %pos = OpVariable %_ptr_Function_v2float Function %51
+    %param_6 = OpVariable %_ptr_Function_v2float Function %51
+    %param_7 = OpVariable %_ptr_Function_v2float Function %51
+    %param_8 = OpVariable %_ptr_Function_v2float Function %51
+    %param_9 = OpVariable %_ptr_Function_v2float Function %51
+        %221 = OpLoad %v4float %gl_FragCoord
+        %223 = OpAccessChain %_ptr_Uniform_v2float %x_24 %uint_0
+        %224 = OpLoad %v2float %223
+        %225 = OpCompositeExtract %float %221 0
+        %226 = OpCompositeExtract %float %221 1
+        %227 = OpCompositeConstruct %v2float %225 %226
+        %228 = OpFDiv %v2float %227 %224
+               OpStore %pos %228
+        %229 = OpLoad %v2float %pos
+               OpStore %param_6 %229
+               OpStore %param_7 %232
+               OpStore %param_8 %235
+               OpStore %param_9 %238
+        %239 = OpFunctionCall %int %pointInTriangle_vf2_vf2_vf2_vf2_ %param_6 %param_7 %param_8 %param_9
+        %244 = OpIEqual %bool %239 %int_1
+               OpSelectionMerge %245 None
+               OpBranchConditional %244 %246 %247
+        %246 = OpLabel
+               OpStore %x_GLF_color %249
+               OpBranch %245
+        %247 = OpLabel
+               OpStore %x_GLF_color %250
+               OpBranch %245
+        %245 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %251
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %255 = OpLabel
+        %256 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %256
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %212
+        %258 = OpLabel
+        %259 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %259
+        %260 = OpFunctionCall %void %main_1
+        %262 = OpLoad %v4float %x_GLF_color
+        %263 = OpCompositeConstruct %main_out %262
+        %261 = OpFunctionCall %void %tint_symbol_3 %263
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-conditional-clamped-float/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-conditional-clamped-float/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..33d8a7d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-conditional-clamped-float/0.spvasm.expected.wgsl
@@ -0,0 +1,134 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_24 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn cross2d_vf2_vf2_(a : ptr<function, vec2<f32>>, b : ptr<function, vec2<f32>>) -> f32 {
+  let x_76 : f32 = (*(a)).x;
+  let x_78 : f32 = (*(b)).y;
+  let x_81 : f32 = (*(b)).x;
+  let x_83 : f32 = (*(a)).y;
+  return ((x_76 * x_78) - (x_81 * x_83));
+}
+
+fn pointInTriangle_vf2_vf2_vf2_vf2_(p : ptr<function, vec2<f32>>, a_1 : ptr<function, vec2<f32>>, b_1 : ptr<function, vec2<f32>>, c : ptr<function, vec2<f32>>) -> i32 {
+  var pab : f32;
+  var param : vec2<f32>;
+  var param_1 : vec2<f32>;
+  var pbc : f32;
+  var param_2 : vec2<f32>;
+  var param_3 : vec2<f32>;
+  var pca : f32;
+  var param_4 : vec2<f32>;
+  var param_5 : vec2<f32>;
+  var x_145 : bool;
+  var x_185 : bool;
+  var x_146_phi : bool;
+  var x_186_phi : bool;
+  let x_88 : f32 = (*(p)).x;
+  let x_90 : f32 = (*(a_1)).x;
+  let x_93 : f32 = (*(p)).y;
+  let x_95 : f32 = (*(a_1)).y;
+  let x_99 : f32 = (*(b_1)).x;
+  let x_101 : f32 = (*(a_1)).x;
+  let x_104 : f32 = (*(b_1)).y;
+  let x_106 : f32 = (*(a_1)).y;
+  param = vec2<f32>((x_88 - x_90), (x_93 - x_95));
+  param_1 = vec2<f32>((x_99 - x_101), (x_104 - x_106));
+  let x_109 : f32 = cross2d_vf2_vf2_(&(param), &(param_1));
+  pab = x_109;
+  let x_111 : f32 = (*(p)).x;
+  let x_113 : f32 = (*(b_1)).x;
+  let x_116 : f32 = (*(p)).y;
+  let x_118 : f32 = (*(b_1)).y;
+  let x_122 : f32 = (*(c)).x;
+  let x_124 : f32 = (*(b_1)).x;
+  let x_127 : f32 = (*(c)).y;
+  let x_129 : f32 = (*(b_1)).y;
+  param_2 = vec2<f32>((x_111 - x_113), (x_116 - x_118));
+  param_3 = vec2<f32>((x_122 - x_124), (x_127 - x_129));
+  let x_132 : f32 = cross2d_vf2_vf2_(&(param_2), &(param_3));
+  pbc = x_132;
+  let x_133 : f32 = pab;
+  let x_135 : f32 = pbc;
+  let x_137 : bool = ((x_133 < 0.0) && (x_135 < 0.0));
+  x_146_phi = x_137;
+  if (!(x_137)) {
+    let x_141 : f32 = pab;
+    let x_143 : f32 = pbc;
+    x_145 = ((x_141 >= 0.0) && (x_143 >= 0.0));
+    x_146_phi = x_145;
+  }
+  let x_146 : bool = x_146_phi;
+  if (!(x_146)) {
+    return 0;
+  }
+  let x_151 : f32 = (*(p)).x;
+  let x_153 : f32 = (*(c)).x;
+  let x_156 : f32 = (*(p)).y;
+  let x_158 : f32 = (*(c)).y;
+  let x_162 : f32 = (*(a_1)).x;
+  let x_164 : f32 = (*(c)).x;
+  let x_167 : f32 = (*(a_1)).y;
+  let x_169 : f32 = (*(c)).y;
+  param_4 = vec2<f32>((x_151 - x_153), (x_156 - x_158));
+  param_5 = vec2<f32>((x_162 - x_164), (x_167 - x_169));
+  let x_172 : f32 = cross2d_vf2_vf2_(&(param_4), &(param_5));
+  pca = x_172;
+  let x_173 : f32 = pab;
+  let x_175 : f32 = pca;
+  let x_177 : bool = ((x_173 < 0.0) && (x_175 < 0.0));
+  x_186_phi = x_177;
+  if (!(x_177)) {
+    let x_181 : f32 = pab;
+    let x_183 : f32 = pca;
+    x_185 = ((x_181 >= 0.0) && (x_183 >= 0.0));
+    x_186_phi = x_185;
+  }
+  let x_186 : bool = x_186_phi;
+  if (!(x_186)) {
+    return 0;
+  }
+  return 1;
+}
+
+fn main_1() {
+  var pos : vec2<f32>;
+  var param_6 : vec2<f32>;
+  var param_7 : vec2<f32>;
+  var param_8 : vec2<f32>;
+  var param_9 : vec2<f32>;
+  let x_63 : vec4<f32> = gl_FragCoord;
+  let x_66 : vec2<f32> = x_24.resolution;
+  pos = (vec2<f32>(x_63.x, x_63.y) / x_66);
+  let x_68 : vec2<f32> = pos;
+  param_6 = x_68;
+  param_7 = vec2<f32>(0.699999988, 0.300000012);
+  param_8 = vec2<f32>(0.5, 0.899999976);
+  param_9 = vec2<f32>(0.100000001, 0.400000006);
+  let x_69 : i32 = pointInTriangle_vf2_vf2_vf2_vf2_(&(param_6), &(param_7), &(param_8), &(param_9));
+  if ((x_69 == 1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-conditional-clamped-float/0.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-conditional-clamped-float/0.wgsl
new file mode 100644
index 0000000..33d8a7d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-conditional-clamped-float/0.wgsl
@@ -0,0 +1,134 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_24 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn cross2d_vf2_vf2_(a : ptr<function, vec2<f32>>, b : ptr<function, vec2<f32>>) -> f32 {
+  let x_76 : f32 = (*(a)).x;
+  let x_78 : f32 = (*(b)).y;
+  let x_81 : f32 = (*(b)).x;
+  let x_83 : f32 = (*(a)).y;
+  return ((x_76 * x_78) - (x_81 * x_83));
+}
+
+fn pointInTriangle_vf2_vf2_vf2_vf2_(p : ptr<function, vec2<f32>>, a_1 : ptr<function, vec2<f32>>, b_1 : ptr<function, vec2<f32>>, c : ptr<function, vec2<f32>>) -> i32 {
+  var pab : f32;
+  var param : vec2<f32>;
+  var param_1 : vec2<f32>;
+  var pbc : f32;
+  var param_2 : vec2<f32>;
+  var param_3 : vec2<f32>;
+  var pca : f32;
+  var param_4 : vec2<f32>;
+  var param_5 : vec2<f32>;
+  var x_145 : bool;
+  var x_185 : bool;
+  var x_146_phi : bool;
+  var x_186_phi : bool;
+  let x_88 : f32 = (*(p)).x;
+  let x_90 : f32 = (*(a_1)).x;
+  let x_93 : f32 = (*(p)).y;
+  let x_95 : f32 = (*(a_1)).y;
+  let x_99 : f32 = (*(b_1)).x;
+  let x_101 : f32 = (*(a_1)).x;
+  let x_104 : f32 = (*(b_1)).y;
+  let x_106 : f32 = (*(a_1)).y;
+  param = vec2<f32>((x_88 - x_90), (x_93 - x_95));
+  param_1 = vec2<f32>((x_99 - x_101), (x_104 - x_106));
+  let x_109 : f32 = cross2d_vf2_vf2_(&(param), &(param_1));
+  pab = x_109;
+  let x_111 : f32 = (*(p)).x;
+  let x_113 : f32 = (*(b_1)).x;
+  let x_116 : f32 = (*(p)).y;
+  let x_118 : f32 = (*(b_1)).y;
+  let x_122 : f32 = (*(c)).x;
+  let x_124 : f32 = (*(b_1)).x;
+  let x_127 : f32 = (*(c)).y;
+  let x_129 : f32 = (*(b_1)).y;
+  param_2 = vec2<f32>((x_111 - x_113), (x_116 - x_118));
+  param_3 = vec2<f32>((x_122 - x_124), (x_127 - x_129));
+  let x_132 : f32 = cross2d_vf2_vf2_(&(param_2), &(param_3));
+  pbc = x_132;
+  let x_133 : f32 = pab;
+  let x_135 : f32 = pbc;
+  let x_137 : bool = ((x_133 < 0.0) && (x_135 < 0.0));
+  x_146_phi = x_137;
+  if (!(x_137)) {
+    let x_141 : f32 = pab;
+    let x_143 : f32 = pbc;
+    x_145 = ((x_141 >= 0.0) && (x_143 >= 0.0));
+    x_146_phi = x_145;
+  }
+  let x_146 : bool = x_146_phi;
+  if (!(x_146)) {
+    return 0;
+  }
+  let x_151 : f32 = (*(p)).x;
+  let x_153 : f32 = (*(c)).x;
+  let x_156 : f32 = (*(p)).y;
+  let x_158 : f32 = (*(c)).y;
+  let x_162 : f32 = (*(a_1)).x;
+  let x_164 : f32 = (*(c)).x;
+  let x_167 : f32 = (*(a_1)).y;
+  let x_169 : f32 = (*(c)).y;
+  param_4 = vec2<f32>((x_151 - x_153), (x_156 - x_158));
+  param_5 = vec2<f32>((x_162 - x_164), (x_167 - x_169));
+  let x_172 : f32 = cross2d_vf2_vf2_(&(param_4), &(param_5));
+  pca = x_172;
+  let x_173 : f32 = pab;
+  let x_175 : f32 = pca;
+  let x_177 : bool = ((x_173 < 0.0) && (x_175 < 0.0));
+  x_186_phi = x_177;
+  if (!(x_177)) {
+    let x_181 : f32 = pab;
+    let x_183 : f32 = pca;
+    x_185 = ((x_181 >= 0.0) && (x_183 >= 0.0));
+    x_186_phi = x_185;
+  }
+  let x_186 : bool = x_186_phi;
+  if (!(x_186)) {
+    return 0;
+  }
+  return 1;
+}
+
+fn main_1() {
+  var pos : vec2<f32>;
+  var param_6 : vec2<f32>;
+  var param_7 : vec2<f32>;
+  var param_8 : vec2<f32>;
+  var param_9 : vec2<f32>;
+  let x_63 : vec4<f32> = gl_FragCoord;
+  let x_66 : vec2<f32> = x_24.resolution;
+  pos = (vec2<f32>(x_63.x, x_63.y) / x_66);
+  let x_68 : vec2<f32> = pos;
+  param_6 = x_68;
+  param_7 = vec2<f32>(0.699999988, 0.300000012);
+  param_8 = vec2<f32>(0.5, 0.899999976);
+  param_9 = vec2<f32>(0.100000001, 0.400000006);
+  let x_69 : i32 = pointInTriangle_vf2_vf2_vf2_vf2_(&(param_6), &(param_7), &(param_8), &(param_9));
+  if ((x_69 == 1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-conditional-clamped-float/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-conditional-clamped-float/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..f228156
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-conditional-clamped-float/0.wgsl.expected.hlsl
@@ -0,0 +1,141 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_24 : register(b0, space0) {
+  uint4 x_24[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float cross2d_vf2_vf2_(inout float2 a, inout float2 b) {
+  const float x_76 = a.x;
+  const float x_78 = b.y;
+  const float x_81 = b.x;
+  const float x_83 = a.y;
+  return ((x_76 * x_78) - (x_81 * x_83));
+}
+
+int pointInTriangle_vf2_vf2_vf2_vf2_(inout float2 p, inout float2 a_1, inout float2 b_1, inout float2 c) {
+  float pab = 0.0f;
+  float2 param = float2(0.0f, 0.0f);
+  float2 param_1 = float2(0.0f, 0.0f);
+  float pbc = 0.0f;
+  float2 param_2 = float2(0.0f, 0.0f);
+  float2 param_3 = float2(0.0f, 0.0f);
+  float pca = 0.0f;
+  float2 param_4 = float2(0.0f, 0.0f);
+  float2 param_5 = float2(0.0f, 0.0f);
+  bool x_145 = false;
+  bool x_185 = false;
+  bool x_146_phi = false;
+  bool x_186_phi = false;
+  const float x_88 = p.x;
+  const float x_90 = a_1.x;
+  const float x_93 = p.y;
+  const float x_95 = a_1.y;
+  const float x_99 = b_1.x;
+  const float x_101 = a_1.x;
+  const float x_104 = b_1.y;
+  const float x_106 = a_1.y;
+  param = float2((x_88 - x_90), (x_93 - x_95));
+  param_1 = float2((x_99 - x_101), (x_104 - x_106));
+  const float x_109 = cross2d_vf2_vf2_(param, param_1);
+  pab = x_109;
+  const float x_111 = p.x;
+  const float x_113 = b_1.x;
+  const float x_116 = p.y;
+  const float x_118 = b_1.y;
+  const float x_122 = c.x;
+  const float x_124 = b_1.x;
+  const float x_127 = c.y;
+  const float x_129 = b_1.y;
+  param_2 = float2((x_111 - x_113), (x_116 - x_118));
+  param_3 = float2((x_122 - x_124), (x_127 - x_129));
+  const float x_132 = cross2d_vf2_vf2_(param_2, param_3);
+  pbc = x_132;
+  bool tint_tmp = (pab < 0.0f);
+  if (tint_tmp) {
+    tint_tmp = (pbc < 0.0f);
+  }
+  const bool x_137 = (tint_tmp);
+  x_146_phi = x_137;
+  if (!(x_137)) {
+    bool tint_tmp_1 = (pab >= 0.0f);
+    if (tint_tmp_1) {
+      tint_tmp_1 = (pbc >= 0.0f);
+    }
+    x_145 = (tint_tmp_1);
+    x_146_phi = x_145;
+  }
+  if (!(x_146_phi)) {
+    return 0;
+  }
+  const float x_151 = p.x;
+  const float x_153 = c.x;
+  const float x_156 = p.y;
+  const float x_158 = c.y;
+  const float x_162 = a_1.x;
+  const float x_164 = c.x;
+  const float x_167 = a_1.y;
+  const float x_169 = c.y;
+  param_4 = float2((x_151 - x_153), (x_156 - x_158));
+  param_5 = float2((x_162 - x_164), (x_167 - x_169));
+  const float x_172 = cross2d_vf2_vf2_(param_4, param_5);
+  pca = x_172;
+  bool tint_tmp_2 = (pab < 0.0f);
+  if (tint_tmp_2) {
+    tint_tmp_2 = (pca < 0.0f);
+  }
+  const bool x_177 = (tint_tmp_2);
+  x_186_phi = x_177;
+  if (!(x_177)) {
+    bool tint_tmp_3 = (pab >= 0.0f);
+    if (tint_tmp_3) {
+      tint_tmp_3 = (pca >= 0.0f);
+    }
+    x_185 = (tint_tmp_3);
+    x_186_phi = x_185;
+  }
+  if (!(x_186_phi)) {
+    return 0;
+  }
+  return 1;
+}
+
+void main_1() {
+  float2 pos = float2(0.0f, 0.0f);
+  float2 param_6 = float2(0.0f, 0.0f);
+  float2 param_7 = float2(0.0f, 0.0f);
+  float2 param_8 = float2(0.0f, 0.0f);
+  float2 param_9 = float2(0.0f, 0.0f);
+  const float4 x_63 = gl_FragCoord;
+  const float2 x_66 = asfloat(x_24[0].xy);
+  pos = (float2(x_63.x, x_63.y) / x_66);
+  param_6 = pos;
+  param_7 = float2(0.699999988f, 0.300000012f);
+  param_8 = float2(0.5f, 0.899999976f);
+  param_9 = float2(0.100000001f, 0.400000006f);
+  const int x_69 = pointInTriangle_vf2_vf2_vf2_vf2_(param_6, param_7, param_8, param_9);
+  if ((x_69 == 1)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-conditional-clamped-float/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-conditional-clamped-float/0.wgsl.expected.msl
new file mode 100644
index 0000000..8d1f7be
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-conditional-clamped-float/0.wgsl.expected.msl
@@ -0,0 +1,135 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float cross2d_vf2_vf2_(thread float2* const a, thread float2* const b) {
+  float const x_76 = (*(a)).x;
+  float const x_78 = (*(b)).y;
+  float const x_81 = (*(b)).x;
+  float const x_83 = (*(a)).y;
+  return ((x_76 * x_78) - (x_81 * x_83));
+}
+
+int pointInTriangle_vf2_vf2_vf2_vf2_(thread float2* const p, thread float2* const a_1, thread float2* const b_1, thread float2* const c) {
+  float pab = 0.0f;
+  float2 param = 0.0f;
+  float2 param_1 = 0.0f;
+  float pbc = 0.0f;
+  float2 param_2 = 0.0f;
+  float2 param_3 = 0.0f;
+  float pca = 0.0f;
+  float2 param_4 = 0.0f;
+  float2 param_5 = 0.0f;
+  bool x_145 = false;
+  bool x_185 = false;
+  bool x_146_phi = false;
+  bool x_186_phi = false;
+  float const x_88 = (*(p)).x;
+  float const x_90 = (*(a_1)).x;
+  float const x_93 = (*(p)).y;
+  float const x_95 = (*(a_1)).y;
+  float const x_99 = (*(b_1)).x;
+  float const x_101 = (*(a_1)).x;
+  float const x_104 = (*(b_1)).y;
+  float const x_106 = (*(a_1)).y;
+  param = float2((x_88 - x_90), (x_93 - x_95));
+  param_1 = float2((x_99 - x_101), (x_104 - x_106));
+  float const x_109 = cross2d_vf2_vf2_(&(param), &(param_1));
+  pab = x_109;
+  float const x_111 = (*(p)).x;
+  float const x_113 = (*(b_1)).x;
+  float const x_116 = (*(p)).y;
+  float const x_118 = (*(b_1)).y;
+  float const x_122 = (*(c)).x;
+  float const x_124 = (*(b_1)).x;
+  float const x_127 = (*(c)).y;
+  float const x_129 = (*(b_1)).y;
+  param_2 = float2((x_111 - x_113), (x_116 - x_118));
+  param_3 = float2((x_122 - x_124), (x_127 - x_129));
+  float const x_132 = cross2d_vf2_vf2_(&(param_2), &(param_3));
+  pbc = x_132;
+  float const x_133 = pab;
+  float const x_135 = pbc;
+  bool const x_137 = ((x_133 < 0.0f) && (x_135 < 0.0f));
+  x_146_phi = x_137;
+  if (!(x_137)) {
+    float const x_141 = pab;
+    float const x_143 = pbc;
+    x_145 = ((x_141 >= 0.0f) && (x_143 >= 0.0f));
+    x_146_phi = x_145;
+  }
+  bool const x_146 = x_146_phi;
+  if (!(x_146)) {
+    return 0;
+  }
+  float const x_151 = (*(p)).x;
+  float const x_153 = (*(c)).x;
+  float const x_156 = (*(p)).y;
+  float const x_158 = (*(c)).y;
+  float const x_162 = (*(a_1)).x;
+  float const x_164 = (*(c)).x;
+  float const x_167 = (*(a_1)).y;
+  float const x_169 = (*(c)).y;
+  param_4 = float2((x_151 - x_153), (x_156 - x_158));
+  param_5 = float2((x_162 - x_164), (x_167 - x_169));
+  float const x_172 = cross2d_vf2_vf2_(&(param_4), &(param_5));
+  pca = x_172;
+  float const x_173 = pab;
+  float const x_175 = pca;
+  bool const x_177 = ((x_173 < 0.0f) && (x_175 < 0.0f));
+  x_186_phi = x_177;
+  if (!(x_177)) {
+    float const x_181 = pab;
+    float const x_183 = pca;
+    x_185 = ((x_181 >= 0.0f) && (x_183 >= 0.0f));
+    x_186_phi = x_185;
+  }
+  bool const x_186 = x_186_phi;
+  if (!(x_186)) {
+    return 0;
+  }
+  return 1;
+}
+
+void main_1(constant buf0& x_24, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float2 pos = 0.0f;
+  float2 param_6 = 0.0f;
+  float2 param_7 = 0.0f;
+  float2 param_8 = 0.0f;
+  float2 param_9 = 0.0f;
+  float4 const x_63 = *(tint_symbol_5);
+  float2 const x_66 = x_24.resolution;
+  pos = (float2(x_63.x, x_63.y) / x_66);
+  float2 const x_68 = pos;
+  param_6 = x_68;
+  param_7 = float2(0.699999988f, 0.300000012f);
+  param_8 = float2(0.5f, 0.899999976f);
+  param_9 = float2(0.100000001f, 0.400000006f);
+  int const x_69 = pointInTriangle_vf2_vf2_vf2_vf2_(&(param_6), &(param_7), &(param_8), &(param_9));
+  if ((x_69 == 1)) {
+    *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_6) = float4(0.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_24 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_24, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-conditional-clamped-float/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-conditional-clamped-float/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..0d3239b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-conditional-clamped-float/0.wgsl.expected.spvasm
@@ -0,0 +1,343 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 264
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_24 "x_24"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %cross2d_vf2_vf2_ "cross2d_vf2_vf2_"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %pointInTriangle_vf2_vf2_vf2_vf2_ "pointInTriangle_vf2_vf2_vf2_vf2_"
+               OpName %p "p"
+               OpName %a_1 "a_1"
+               OpName %b_1 "b_1"
+               OpName %c "c"
+               OpName %pab "pab"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %pbc "pbc"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %pca "pca"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpName %x_145 "x_145"
+               OpName %x_185 "x_185"
+               OpName %x_146_phi "x_146_phi"
+               OpName %x_186_phi "x_186_phi"
+               OpName %main_1 "main_1"
+               OpName %pos "pos"
+               OpName %param_6 "param_6"
+               OpName %param_7 "param_7"
+               OpName %param_8 "param_8"
+               OpName %param_9 "param_9"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_24 NonWritable
+               OpDecorate %x_24 DescriptorSet 0
+               OpDecorate %x_24 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_24 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %15 = OpTypeFunction %float %_ptr_Function_v2float %_ptr_Function_v2float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+        %int = OpTypeInt 32 1
+         %40 = OpTypeFunction %int %_ptr_Function_v2float %_ptr_Function_v2float %_ptr_Function_v2float %_ptr_Function_v2float
+         %49 = OpConstantNull %float
+         %51 = OpConstantNull %v2float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %62 = OpConstantNull %bool
+    %float_0 = OpConstant %float 0
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+       %void = OpTypeVoid
+        %212 = OpTypeFunction %void
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+%float_0_699999988 = OpConstant %float 0.699999988
+%float_0_300000012 = OpConstant %float 0.300000012
+        %232 = OpConstantComposite %v2float %float_0_699999988 %float_0_300000012
+  %float_0_5 = OpConstant %float 0.5
+%float_0_899999976 = OpConstant %float 0.899999976
+        %235 = OpConstantComposite %v2float %float_0_5 %float_0_899999976
+%float_0_100000001 = OpConstant %float 0.100000001
+%float_0_400000006 = OpConstant %float 0.400000006
+        %238 = OpConstantComposite %v2float %float_0_100000001 %float_0_400000006
+    %float_1 = OpConstant %float 1
+        %249 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %250 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %251 = OpTypeFunction %void %main_out
+%cross2d_vf2_vf2_ = OpFunction %float None %15
+          %a = OpFunctionParameter %_ptr_Function_v2float
+          %b = OpFunctionParameter %_ptr_Function_v2float
+         %20 = OpLabel
+         %25 = OpAccessChain %_ptr_Function_float %a %uint_0
+         %26 = OpLoad %float %25
+         %29 = OpAccessChain %_ptr_Function_float %b %uint_1
+         %30 = OpLoad %float %29
+         %32 = OpAccessChain %_ptr_Function_float %b %uint_0
+         %33 = OpLoad %float %32
+         %35 = OpAccessChain %_ptr_Function_float %a %uint_1
+         %36 = OpLoad %float %35
+         %37 = OpFMul %float %26 %30
+         %38 = OpFMul %float %33 %36
+         %39 = OpFSub %float %37 %38
+               OpReturnValue %39
+               OpFunctionEnd
+%pointInTriangle_vf2_vf2_vf2_vf2_ = OpFunction %int None %40
+          %p = OpFunctionParameter %_ptr_Function_v2float
+        %a_1 = OpFunctionParameter %_ptr_Function_v2float
+        %b_1 = OpFunctionParameter %_ptr_Function_v2float
+          %c = OpFunctionParameter %_ptr_Function_v2float
+         %47 = OpLabel
+        %pab = OpVariable %_ptr_Function_float Function %49
+      %param = OpVariable %_ptr_Function_v2float Function %51
+    %param_1 = OpVariable %_ptr_Function_v2float Function %51
+        %pbc = OpVariable %_ptr_Function_float Function %49
+    %param_2 = OpVariable %_ptr_Function_v2float Function %51
+    %param_3 = OpVariable %_ptr_Function_v2float Function %51
+        %pca = OpVariable %_ptr_Function_float Function %49
+    %param_4 = OpVariable %_ptr_Function_v2float Function %51
+    %param_5 = OpVariable %_ptr_Function_v2float Function %51
+      %x_145 = OpVariable %_ptr_Function_bool Function %62
+      %x_185 = OpVariable %_ptr_Function_bool Function %62
+  %x_146_phi = OpVariable %_ptr_Function_bool Function %62
+  %x_186_phi = OpVariable %_ptr_Function_bool Function %62
+         %67 = OpAccessChain %_ptr_Function_float %p %uint_0
+         %68 = OpLoad %float %67
+         %70 = OpAccessChain %_ptr_Function_float %a_1 %uint_0
+         %71 = OpLoad %float %70
+         %73 = OpAccessChain %_ptr_Function_float %p %uint_1
+         %74 = OpLoad %float %73
+         %76 = OpAccessChain %_ptr_Function_float %a_1 %uint_1
+         %77 = OpLoad %float %76
+         %79 = OpAccessChain %_ptr_Function_float %b_1 %uint_0
+         %80 = OpLoad %float %79
+         %82 = OpAccessChain %_ptr_Function_float %a_1 %uint_0
+         %83 = OpLoad %float %82
+         %85 = OpAccessChain %_ptr_Function_float %b_1 %uint_1
+         %86 = OpLoad %float %85
+         %88 = OpAccessChain %_ptr_Function_float %a_1 %uint_1
+         %89 = OpLoad %float %88
+         %90 = OpFSub %float %68 %71
+         %91 = OpFSub %float %74 %77
+         %92 = OpCompositeConstruct %v2float %90 %91
+               OpStore %param %92
+         %93 = OpFSub %float %80 %83
+         %94 = OpFSub %float %86 %89
+         %95 = OpCompositeConstruct %v2float %93 %94
+               OpStore %param_1 %95
+         %96 = OpFunctionCall %float %cross2d_vf2_vf2_ %param %param_1
+               OpStore %pab %96
+        %100 = OpAccessChain %_ptr_Function_float %p %uint_0
+        %101 = OpLoad %float %100
+        %103 = OpAccessChain %_ptr_Function_float %b_1 %uint_0
+        %104 = OpLoad %float %103
+        %106 = OpAccessChain %_ptr_Function_float %p %uint_1
+        %107 = OpLoad %float %106
+        %109 = OpAccessChain %_ptr_Function_float %b_1 %uint_1
+        %110 = OpLoad %float %109
+        %112 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %113 = OpLoad %float %112
+        %115 = OpAccessChain %_ptr_Function_float %b_1 %uint_0
+        %116 = OpLoad %float %115
+        %118 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %119 = OpLoad %float %118
+        %121 = OpAccessChain %_ptr_Function_float %b_1 %uint_1
+        %122 = OpLoad %float %121
+        %123 = OpFSub %float %101 %104
+        %124 = OpFSub %float %107 %110
+        %125 = OpCompositeConstruct %v2float %123 %124
+               OpStore %param_2 %125
+        %126 = OpFSub %float %113 %116
+        %127 = OpFSub %float %119 %122
+        %128 = OpCompositeConstruct %v2float %126 %127
+               OpStore %param_3 %128
+        %129 = OpFunctionCall %float %cross2d_vf2_vf2_ %param_2 %param_3
+               OpStore %pbc %129
+        %132 = OpLoad %float %pab
+        %133 = OpLoad %float %pbc
+        %135 = OpFOrdLessThan %bool %132 %float_0
+               OpSelectionMerge %136 None
+               OpBranchConditional %135 %137 %136
+        %137 = OpLabel
+        %138 = OpFOrdLessThan %bool %133 %float_0
+               OpBranch %136
+        %136 = OpLabel
+        %139 = OpPhi %bool %135 %47 %138 %137
+               OpStore %x_146_phi %139
+        %140 = OpLogicalNot %bool %139
+               OpSelectionMerge %141 None
+               OpBranchConditional %140 %142 %141
+        %142 = OpLabel
+        %143 = OpLoad %float %pab
+        %144 = OpLoad %float %pbc
+        %145 = OpFOrdGreaterThanEqual %bool %143 %float_0
+               OpSelectionMerge %146 None
+               OpBranchConditional %145 %147 %146
+        %147 = OpLabel
+        %148 = OpFOrdGreaterThanEqual %bool %144 %float_0
+               OpBranch %146
+        %146 = OpLabel
+        %149 = OpPhi %bool %145 %142 %148 %147
+               OpStore %x_145 %149
+        %150 = OpLoad %bool %x_145
+               OpStore %x_146_phi %150
+               OpBranch %141
+        %141 = OpLabel
+        %151 = OpLoad %bool %x_146_phi
+        %152 = OpLogicalNot %bool %151
+               OpSelectionMerge %153 None
+               OpBranchConditional %152 %154 %153
+        %154 = OpLabel
+               OpReturnValue %int_0
+        %153 = OpLabel
+        %157 = OpAccessChain %_ptr_Function_float %p %uint_0
+        %158 = OpLoad %float %157
+        %160 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %161 = OpLoad %float %160
+        %163 = OpAccessChain %_ptr_Function_float %p %uint_1
+        %164 = OpLoad %float %163
+        %166 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %167 = OpLoad %float %166
+        %169 = OpAccessChain %_ptr_Function_float %a_1 %uint_0
+        %170 = OpLoad %float %169
+        %172 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %173 = OpLoad %float %172
+        %175 = OpAccessChain %_ptr_Function_float %a_1 %uint_1
+        %176 = OpLoad %float %175
+        %178 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %179 = OpLoad %float %178
+        %180 = OpFSub %float %158 %161
+        %181 = OpFSub %float %164 %167
+        %182 = OpCompositeConstruct %v2float %180 %181
+               OpStore %param_4 %182
+        %183 = OpFSub %float %170 %173
+        %184 = OpFSub %float %176 %179
+        %185 = OpCompositeConstruct %v2float %183 %184
+               OpStore %param_5 %185
+        %186 = OpFunctionCall %float %cross2d_vf2_vf2_ %param_4 %param_5
+               OpStore %pca %186
+        %189 = OpLoad %float %pab
+        %190 = OpLoad %float %pca
+        %191 = OpFOrdLessThan %bool %189 %float_0
+               OpSelectionMerge %192 None
+               OpBranchConditional %191 %193 %192
+        %193 = OpLabel
+        %194 = OpFOrdLessThan %bool %190 %float_0
+               OpBranch %192
+        %192 = OpLabel
+        %195 = OpPhi %bool %191 %153 %194 %193
+               OpStore %x_186_phi %195
+        %196 = OpLogicalNot %bool %195
+               OpSelectionMerge %197 None
+               OpBranchConditional %196 %198 %197
+        %198 = OpLabel
+        %199 = OpLoad %float %pab
+        %200 = OpLoad %float %pca
+        %201 = OpFOrdGreaterThanEqual %bool %199 %float_0
+               OpSelectionMerge %202 None
+               OpBranchConditional %201 %203 %202
+        %203 = OpLabel
+        %204 = OpFOrdGreaterThanEqual %bool %200 %float_0
+               OpBranch %202
+        %202 = OpLabel
+        %205 = OpPhi %bool %201 %198 %204 %203
+               OpStore %x_185 %205
+        %206 = OpLoad %bool %x_185
+               OpStore %x_186_phi %206
+               OpBranch %197
+        %197 = OpLabel
+        %207 = OpLoad %bool %x_186_phi
+        %208 = OpLogicalNot %bool %207
+               OpSelectionMerge %209 None
+               OpBranchConditional %208 %210 %209
+        %210 = OpLabel
+               OpReturnValue %int_0
+        %209 = OpLabel
+               OpReturnValue %int_1
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %212
+        %215 = OpLabel
+        %pos = OpVariable %_ptr_Function_v2float Function %51
+    %param_6 = OpVariable %_ptr_Function_v2float Function %51
+    %param_7 = OpVariable %_ptr_Function_v2float Function %51
+    %param_8 = OpVariable %_ptr_Function_v2float Function %51
+    %param_9 = OpVariable %_ptr_Function_v2float Function %51
+        %221 = OpLoad %v4float %gl_FragCoord
+        %223 = OpAccessChain %_ptr_Uniform_v2float %x_24 %uint_0
+        %224 = OpLoad %v2float %223
+        %225 = OpCompositeExtract %float %221 0
+        %226 = OpCompositeExtract %float %221 1
+        %227 = OpCompositeConstruct %v2float %225 %226
+        %228 = OpFDiv %v2float %227 %224
+               OpStore %pos %228
+        %229 = OpLoad %v2float %pos
+               OpStore %param_6 %229
+               OpStore %param_7 %232
+               OpStore %param_8 %235
+               OpStore %param_9 %238
+        %239 = OpFunctionCall %int %pointInTriangle_vf2_vf2_vf2_vf2_ %param_6 %param_7 %param_8 %param_9
+        %244 = OpIEqual %bool %239 %int_1
+               OpSelectionMerge %245 None
+               OpBranchConditional %244 %246 %247
+        %246 = OpLabel
+               OpStore %x_GLF_color %249
+               OpBranch %245
+        %247 = OpLabel
+               OpStore %x_GLF_color %250
+               OpBranch %245
+        %245 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %251
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %255 = OpLabel
+        %256 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %256
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %212
+        %258 = OpLabel
+        %259 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %259
+        %260 = OpFunctionCall %void %main_1
+        %262 = OpLoad %v4float %x_GLF_color
+        %263 = OpCompositeConstruct %main_out %262
+        %261 = OpFunctionCall %void %tint_symbol_3 %263
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-conditional-clamped-float/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-conditional-clamped-float/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..33d8a7d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-conditional-clamped-float/0.wgsl.expected.wgsl
@@ -0,0 +1,134 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_24 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn cross2d_vf2_vf2_(a : ptr<function, vec2<f32>>, b : ptr<function, vec2<f32>>) -> f32 {
+  let x_76 : f32 = (*(a)).x;
+  let x_78 : f32 = (*(b)).y;
+  let x_81 : f32 = (*(b)).x;
+  let x_83 : f32 = (*(a)).y;
+  return ((x_76 * x_78) - (x_81 * x_83));
+}
+
+fn pointInTriangle_vf2_vf2_vf2_vf2_(p : ptr<function, vec2<f32>>, a_1 : ptr<function, vec2<f32>>, b_1 : ptr<function, vec2<f32>>, c : ptr<function, vec2<f32>>) -> i32 {
+  var pab : f32;
+  var param : vec2<f32>;
+  var param_1 : vec2<f32>;
+  var pbc : f32;
+  var param_2 : vec2<f32>;
+  var param_3 : vec2<f32>;
+  var pca : f32;
+  var param_4 : vec2<f32>;
+  var param_5 : vec2<f32>;
+  var x_145 : bool;
+  var x_185 : bool;
+  var x_146_phi : bool;
+  var x_186_phi : bool;
+  let x_88 : f32 = (*(p)).x;
+  let x_90 : f32 = (*(a_1)).x;
+  let x_93 : f32 = (*(p)).y;
+  let x_95 : f32 = (*(a_1)).y;
+  let x_99 : f32 = (*(b_1)).x;
+  let x_101 : f32 = (*(a_1)).x;
+  let x_104 : f32 = (*(b_1)).y;
+  let x_106 : f32 = (*(a_1)).y;
+  param = vec2<f32>((x_88 - x_90), (x_93 - x_95));
+  param_1 = vec2<f32>((x_99 - x_101), (x_104 - x_106));
+  let x_109 : f32 = cross2d_vf2_vf2_(&(param), &(param_1));
+  pab = x_109;
+  let x_111 : f32 = (*(p)).x;
+  let x_113 : f32 = (*(b_1)).x;
+  let x_116 : f32 = (*(p)).y;
+  let x_118 : f32 = (*(b_1)).y;
+  let x_122 : f32 = (*(c)).x;
+  let x_124 : f32 = (*(b_1)).x;
+  let x_127 : f32 = (*(c)).y;
+  let x_129 : f32 = (*(b_1)).y;
+  param_2 = vec2<f32>((x_111 - x_113), (x_116 - x_118));
+  param_3 = vec2<f32>((x_122 - x_124), (x_127 - x_129));
+  let x_132 : f32 = cross2d_vf2_vf2_(&(param_2), &(param_3));
+  pbc = x_132;
+  let x_133 : f32 = pab;
+  let x_135 : f32 = pbc;
+  let x_137 : bool = ((x_133 < 0.0) && (x_135 < 0.0));
+  x_146_phi = x_137;
+  if (!(x_137)) {
+    let x_141 : f32 = pab;
+    let x_143 : f32 = pbc;
+    x_145 = ((x_141 >= 0.0) && (x_143 >= 0.0));
+    x_146_phi = x_145;
+  }
+  let x_146 : bool = x_146_phi;
+  if (!(x_146)) {
+    return 0;
+  }
+  let x_151 : f32 = (*(p)).x;
+  let x_153 : f32 = (*(c)).x;
+  let x_156 : f32 = (*(p)).y;
+  let x_158 : f32 = (*(c)).y;
+  let x_162 : f32 = (*(a_1)).x;
+  let x_164 : f32 = (*(c)).x;
+  let x_167 : f32 = (*(a_1)).y;
+  let x_169 : f32 = (*(c)).y;
+  param_4 = vec2<f32>((x_151 - x_153), (x_156 - x_158));
+  param_5 = vec2<f32>((x_162 - x_164), (x_167 - x_169));
+  let x_172 : f32 = cross2d_vf2_vf2_(&(param_4), &(param_5));
+  pca = x_172;
+  let x_173 : f32 = pab;
+  let x_175 : f32 = pca;
+  let x_177 : bool = ((x_173 < 0.0) && (x_175 < 0.0));
+  x_186_phi = x_177;
+  if (!(x_177)) {
+    let x_181 : f32 = pab;
+    let x_183 : f32 = pca;
+    x_185 = ((x_181 >= 0.0) && (x_183 >= 0.0));
+    x_186_phi = x_185;
+  }
+  let x_186 : bool = x_186_phi;
+  if (!(x_186)) {
+    return 0;
+  }
+  return 1;
+}
+
+fn main_1() {
+  var pos : vec2<f32>;
+  var param_6 : vec2<f32>;
+  var param_7 : vec2<f32>;
+  var param_8 : vec2<f32>;
+  var param_9 : vec2<f32>;
+  let x_63 : vec4<f32> = gl_FragCoord;
+  let x_66 : vec2<f32> = x_24.resolution;
+  pos = (vec2<f32>(x_63.x, x_63.y) / x_66);
+  let x_68 : vec2<f32> = pos;
+  param_6 = x_68;
+  param_7 = vec2<f32>(0.699999988, 0.300000012);
+  param_8 = vec2<f32>(0.5, 0.899999976);
+  param_9 = vec2<f32>(0.100000001, 0.400000006);
+  let x_69 : i32 = pointInTriangle_vf2_vf2_vf2_vf2_(&(param_6), &(param_7), &(param_8), &(param_9));
+  if ((x_69 == 1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.spvasm
new file mode 100644
index 0000000..6806bf0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.spvasm
@@ -0,0 +1,243 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %pointInTriangle_vf2_vf2_vf2_vf2_ "pointInTriangle(vf2;vf2;vf2;vf2;"
+               OpName %p "p"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %param_1 "param"
+               OpName %param_2 "param"
+               OpName %param_3 "param"
+               OpName %param_4 "param"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %_ ""
+               OpName %param_5 "param"
+               OpName %param_6 "param"
+               OpName %param_7 "param"
+               OpName %param_8 "param"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+        %int = OpTypeInt 32 1
+         %28 = OpTypeFunction %int %_ptr_Function_v2float %_ptr_Function_v2float %_ptr_Function_v2float %_ptr_Function_v2float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+%float_0_699999988 = OpConstant %float 0.699999988
+%float_0_300000012 = OpConstant %float 0.300000012
+         %43 = OpConstantComposite %v2float %float_0_699999988 %float_0_300000012
+  %float_0_5 = OpConstant %float 0.5
+%float_0_899999976 = OpConstant %float 0.899999976
+         %46 = OpConstantComposite %v2float %float_0_5 %float_0_899999976
+%float_0_100000001 = OpConstant %float 0.100000001
+%float_0_400000006 = OpConstant %float 0.400000006
+         %49 = OpConstantComposite %v2float %float_0_100000001 %float_0_400000006
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+         %52 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %53 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %23
+         %54 = OpLabel
+    %param_5 = OpVariable %_ptr_Function_v2float Function
+    %param_6 = OpVariable %_ptr_Function_v2float Function
+    %param_7 = OpVariable %_ptr_Function_v2float Function
+    %param_8 = OpVariable %_ptr_Function_v2float Function
+         %55 = OpLoad %v4float %gl_FragCoord
+         %56 = OpVectorShuffle %v2float %55 %55 0 1
+         %57 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+         %58 = OpLoad %v2float %57
+         %59 = OpFDiv %v2float %56 %58
+               OpStore %param_5 %59
+               OpStore %param_6 %43
+               OpStore %param_7 %46
+               OpStore %param_8 %49
+         %60 = OpFunctionCall %int %pointInTriangle_vf2_vf2_vf2_vf2_ %param_5 %param_6 %param_7 %param_8
+         %61 = OpIEqual %bool %60 %int_1
+               OpSelectionMerge %62 None
+               OpBranchConditional %61 %63 %64
+         %63 = OpLabel
+               OpStore %_GLF_color %52
+               OpBranch %62
+         %64 = OpLabel
+               OpStore %_GLF_color %53
+               OpBranch %62
+         %62 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%pointInTriangle_vf2_vf2_vf2_vf2_ = OpFunction %int None %28
+          %p = OpFunctionParameter %_ptr_Function_v2float
+          %a = OpFunctionParameter %_ptr_Function_v2float
+          %b = OpFunctionParameter %_ptr_Function_v2float
+          %c = OpFunctionParameter %_ptr_Function_v2float
+         %65 = OpLabel
+         %66 = OpVariable %_ptr_Function_float Function
+         %67 = OpVariable %_ptr_Function_float Function
+         %68 = OpVariable %_ptr_Function_float Function
+      %param = OpVariable %_ptr_Function_v2float Function
+    %param_0 = OpVariable %_ptr_Function_v2float Function
+    %param_1 = OpVariable %_ptr_Function_v2float Function
+    %param_2 = OpVariable %_ptr_Function_v2float Function
+    %param_3 = OpVariable %_ptr_Function_v2float Function
+    %param_4 = OpVariable %_ptr_Function_v2float Function
+         %69 = OpAccessChain %_ptr_Function_float %p %uint_0
+         %70 = OpLoad %float %69
+         %71 = OpAccessChain %_ptr_Function_float %a %uint_0
+         %72 = OpLoad %float %71
+         %73 = OpFSub %float %70 %72
+         %74 = OpAccessChain %_ptr_Function_float %p %uint_1
+         %75 = OpLoad %float %74
+         %76 = OpAccessChain %_ptr_Function_float %a %uint_1
+         %77 = OpLoad %float %76
+         %78 = OpFSub %float %75 %77
+         %79 = OpCompositeConstruct %v2float %73 %78
+         %80 = OpAccessChain %_ptr_Function_float %b %uint_0
+         %81 = OpLoad %float %80
+         %82 = OpLoad %float %71
+         %83 = OpFSub %float %81 %82
+         %84 = OpAccessChain %_ptr_Function_float %b %uint_1
+         %85 = OpLoad %float %84
+         %86 = OpLoad %float %76
+         %87 = OpFSub %float %85 %86
+         %88 = OpCompositeConstruct %v2float %83 %87
+               OpStore %param %79
+               OpStore %param_0 %88
+         %89 = OpAccessChain %_ptr_Function_float %param %uint_0
+         %90 = OpLoad %float %89
+         %91 = OpAccessChain %_ptr_Function_float %param_0 %uint_1
+         %92 = OpLoad %float %91
+         %93 = OpFMul %float %90 %92
+         %94 = OpAccessChain %_ptr_Function_float %param_0 %uint_0
+         %95 = OpLoad %float %94
+         %96 = OpAccessChain %_ptr_Function_float %param %uint_1
+         %97 = OpLoad %float %96
+         %98 = OpFMul %float %95 %97
+         %99 = OpFSub %float %93 %98
+               OpStore %68 %99
+        %100 = OpLoad %float %69
+        %101 = OpLoad %float %80
+        %102 = OpFSub %float %100 %101
+        %103 = OpLoad %float %74
+        %104 = OpLoad %float %84
+        %105 = OpFSub %float %103 %104
+        %106 = OpCompositeConstruct %v2float %102 %105
+        %107 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %108 = OpLoad %float %107
+        %109 = OpLoad %float %80
+        %110 = OpFSub %float %108 %109
+        %111 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %112 = OpLoad %float %111
+        %113 = OpLoad %float %84
+        %114 = OpFSub %float %112 %113
+        %115 = OpCompositeConstruct %v2float %110 %114
+               OpStore %param_1 %106
+               OpStore %param_2 %115
+        %116 = OpAccessChain %_ptr_Function_float %param_1 %uint_0
+        %117 = OpLoad %float %116
+        %118 = OpAccessChain %_ptr_Function_float %param_2 %uint_1
+        %119 = OpLoad %float %118
+        %120 = OpFMul %float %117 %119
+        %121 = OpAccessChain %_ptr_Function_float %param_2 %uint_0
+        %122 = OpLoad %float %121
+        %123 = OpAccessChain %_ptr_Function_float %param_1 %uint_1
+        %124 = OpLoad %float %123
+        %125 = OpFMul %float %122 %124
+        %126 = OpFSub %float %120 %125
+               OpStore %67 %126
+        %127 = OpFOrdLessThan %bool %99 %float_0
+        %128 = OpFOrdLessThan %bool %126 %float_0
+        %129 = OpLogicalAnd %bool %127 %128
+        %130 = OpLogicalNot %bool %129
+               OpSelectionMerge %131 None
+               OpBranchConditional %130 %132 %131
+        %132 = OpLabel
+        %133 = OpFOrdGreaterThanEqual %bool %99 %float_0
+        %134 = OpFOrdGreaterThanEqual %bool %126 %float_0
+        %135 = OpLogicalAnd %bool %133 %134
+               OpBranch %131
+        %131 = OpLabel
+        %136 = OpPhi %bool %129 %65 %135 %132
+        %137 = OpLogicalNot %bool %136
+               OpSelectionMerge %138 None
+               OpBranchConditional %137 %139 %138
+        %139 = OpLabel
+               OpReturnValue %int_0
+        %138 = OpLabel
+        %140 = OpLoad %float %69
+        %141 = OpLoad %float %107
+        %142 = OpFSub %float %140 %141
+        %143 = OpLoad %float %74
+        %144 = OpLoad %float %111
+        %145 = OpFSub %float %143 %144
+        %146 = OpCompositeConstruct %v2float %142 %145
+        %147 = OpLoad %float %71
+        %148 = OpLoad %float %107
+        %149 = OpFSub %float %147 %148
+        %150 = OpLoad %float %76
+        %151 = OpLoad %float %111
+        %152 = OpFSub %float %150 %151
+        %153 = OpCompositeConstruct %v2float %149 %152
+               OpStore %param_3 %146
+               OpStore %param_4 %153
+        %154 = OpAccessChain %_ptr_Function_float %param_3 %uint_0
+        %155 = OpLoad %float %154
+        %156 = OpAccessChain %_ptr_Function_float %param_4 %uint_1
+        %157 = OpLoad %float %156
+        %158 = OpFMul %float %155 %157
+        %159 = OpAccessChain %_ptr_Function_float %param_4 %uint_0
+        %160 = OpLoad %float %159
+        %161 = OpAccessChain %_ptr_Function_float %param_3 %uint_1
+        %162 = OpLoad %float %161
+        %163 = OpFMul %float %160 %162
+        %164 = OpFSub %float %158 %163
+               OpStore %66 %164
+        %165 = OpFOrdLessThan %bool %164 %float_0
+        %166 = OpLogicalAnd %bool %127 %165
+        %167 = OpLogicalNot %bool %166
+               OpSelectionMerge %168 None
+               OpBranchConditional %167 %169 %168
+        %169 = OpLabel
+        %170 = OpFOrdGreaterThanEqual %bool %99 %float_0
+        %171 = OpFOrdGreaterThanEqual %bool %164 %float_0
+        %172 = OpLogicalAnd %bool %170 %171
+               OpBranch %168
+        %168 = OpLabel
+        %173 = OpPhi %bool %166 %138 %172 %169
+        %174 = OpLogicalNot %bool %173
+               OpSelectionMerge %175 None
+               OpBranchConditional %174 %176 %175
+        %176 = OpLabel
+               OpReturnValue %int_0
+        %175 = OpLabel
+               OpReturnValue %int_1
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..c32dae7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.spvasm.expected.hlsl
@@ -0,0 +1,144 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_17 : register(b0, space0) {
+  uint4 x_17[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+int pointInTriangle_vf2_vf2_vf2_vf2_(inout float2 p, inout float2 a, inout float2 b, inout float2 c) {
+  float x_66 = 0.0f;
+  float x_67 = 0.0f;
+  float x_68 = 0.0f;
+  float2 param = float2(0.0f, 0.0f);
+  float2 param_1 = float2(0.0f, 0.0f);
+  float2 param_2 = float2(0.0f, 0.0f);
+  float2 param_3 = float2(0.0f, 0.0f);
+  float2 param_4 = float2(0.0f, 0.0f);
+  float2 param_5 = float2(0.0f, 0.0f);
+  bool x_135 = false;
+  bool x_172 = false;
+  bool x_136_phi = false;
+  bool x_173_phi = false;
+  const float x_70 = p.x;
+  const float x_72 = a.x;
+  const float x_75 = p.y;
+  const float x_77 = a.y;
+  const float x_81 = b.x;
+  const float x_82 = a.x;
+  const float x_85 = b.y;
+  const float x_86 = a.y;
+  param = float2((x_70 - x_72), (x_75 - x_77));
+  param_1 = float2((x_81 - x_82), (x_85 - x_86));
+  const float x_90 = param.x;
+  const float x_92 = param_1.y;
+  const float x_95 = param_1.x;
+  const float x_97 = param.y;
+  const float x_99 = ((x_90 * x_92) - (x_95 * x_97));
+  x_68 = x_99;
+  const float x_100 = p.x;
+  const float x_101 = b.x;
+  const float x_103 = p.y;
+  const float x_104 = b.y;
+  const float x_108 = c.x;
+  const float x_109 = b.x;
+  const float x_112 = c.y;
+  const float x_113 = b.y;
+  param_2 = float2((x_100 - x_101), (x_103 - x_104));
+  param_3 = float2((x_108 - x_109), (x_112 - x_113));
+  const float x_117 = param_2.x;
+  const float x_119 = param_3.y;
+  const float x_122 = param_3.x;
+  const float x_124 = param_2.y;
+  const float x_126 = ((x_117 * x_119) - (x_122 * x_124));
+  x_67 = x_126;
+  const bool x_127 = (x_99 < 0.0f);
+  bool tint_tmp = x_127;
+  if (tint_tmp) {
+    tint_tmp = (x_126 < 0.0f);
+  }
+  const bool x_129 = (tint_tmp);
+  x_136_phi = x_129;
+  if (!(x_129)) {
+    bool tint_tmp_1 = (x_99 >= 0.0f);
+    if (tint_tmp_1) {
+      tint_tmp_1 = (x_126 >= 0.0f);
+    }
+    x_135 = (tint_tmp_1);
+    x_136_phi = x_135;
+  }
+  if (!(x_136_phi)) {
+    return 0;
+  }
+  const float x_140 = p.x;
+  const float x_141 = c.x;
+  const float x_143 = p.y;
+  const float x_144 = c.y;
+  const float x_147 = a.x;
+  const float x_148 = c.x;
+  const float x_150 = a.y;
+  const float x_151 = c.y;
+  param_4 = float2((x_140 - x_141), (x_143 - x_144));
+  param_5 = float2((x_147 - x_148), (x_150 - x_151));
+  const float x_155 = param_4.x;
+  const float x_157 = param_5.y;
+  const float x_160 = param_5.x;
+  const float x_162 = param_4.y;
+  const float x_164 = ((x_155 * x_157) - (x_160 * x_162));
+  x_66 = x_164;
+  bool tint_tmp_2 = x_127;
+  if (tint_tmp_2) {
+    tint_tmp_2 = (x_164 < 0.0f);
+  }
+  const bool x_166 = (tint_tmp_2);
+  x_173_phi = x_166;
+  if (!(x_166)) {
+    bool tint_tmp_3 = (x_99 >= 0.0f);
+    if (tint_tmp_3) {
+      tint_tmp_3 = (x_164 >= 0.0f);
+    }
+    x_172 = (tint_tmp_3);
+    x_173_phi = x_172;
+  }
+  if (!(x_173_phi)) {
+    return 0;
+  }
+  return 1;
+}
+
+void main_1() {
+  float2 param_6 = float2(0.0f, 0.0f);
+  float2 param_7 = float2(0.0f, 0.0f);
+  float2 param_8 = float2(0.0f, 0.0f);
+  float2 param_9 = float2(0.0f, 0.0f);
+  const float4 x_55 = gl_FragCoord;
+  const float2 x_58 = asfloat(x_17[0].xy);
+  param_6 = (float2(x_55.x, x_55.y) / x_58);
+  param_7 = float2(0.699999988f, 0.300000012f);
+  param_8 = float2(0.5f, 0.899999976f);
+  param_9 = float2(0.100000001f, 0.400000006f);
+  const int x_60 = pointInTriangle_vf2_vf2_vf2_vf2_(param_6, param_7, param_8, param_9);
+  if ((x_60 == 1)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.spvasm.expected.msl
new file mode 100644
index 0000000..fc78937
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.spvasm.expected.msl
@@ -0,0 +1,129 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int pointInTriangle_vf2_vf2_vf2_vf2_(thread float2* const p, thread float2* const a, thread float2* const b, thread float2* const c) {
+  float x_66 = 0.0f;
+  float x_67 = 0.0f;
+  float x_68 = 0.0f;
+  float2 param = 0.0f;
+  float2 param_1 = 0.0f;
+  float2 param_2 = 0.0f;
+  float2 param_3 = 0.0f;
+  float2 param_4 = 0.0f;
+  float2 param_5 = 0.0f;
+  bool x_135 = false;
+  bool x_172 = false;
+  bool x_136_phi = false;
+  bool x_173_phi = false;
+  float const x_70 = (*(p)).x;
+  float const x_72 = (*(a)).x;
+  float const x_75 = (*(p)).y;
+  float const x_77 = (*(a)).y;
+  float const x_81 = (*(b)).x;
+  float const x_82 = (*(a)).x;
+  float const x_85 = (*(b)).y;
+  float const x_86 = (*(a)).y;
+  param = float2((x_70 - x_72), (x_75 - x_77));
+  param_1 = float2((x_81 - x_82), (x_85 - x_86));
+  float const x_90 = param.x;
+  float const x_92 = param_1.y;
+  float const x_95 = param_1.x;
+  float const x_97 = param.y;
+  float const x_99 = ((x_90 * x_92) - (x_95 * x_97));
+  x_68 = x_99;
+  float const x_100 = (*(p)).x;
+  float const x_101 = (*(b)).x;
+  float const x_103 = (*(p)).y;
+  float const x_104 = (*(b)).y;
+  float const x_108 = (*(c)).x;
+  float const x_109 = (*(b)).x;
+  float const x_112 = (*(c)).y;
+  float const x_113 = (*(b)).y;
+  param_2 = float2((x_100 - x_101), (x_103 - x_104));
+  param_3 = float2((x_108 - x_109), (x_112 - x_113));
+  float const x_117 = param_2.x;
+  float const x_119 = param_3.y;
+  float const x_122 = param_3.x;
+  float const x_124 = param_2.y;
+  float const x_126 = ((x_117 * x_119) - (x_122 * x_124));
+  x_67 = x_126;
+  bool const x_127 = (x_99 < 0.0f);
+  bool const x_129 = (x_127 && (x_126 < 0.0f));
+  x_136_phi = x_129;
+  if (!(x_129)) {
+    x_135 = ((x_99 >= 0.0f) && (x_126 >= 0.0f));
+    x_136_phi = x_135;
+  }
+  bool const x_136 = x_136_phi;
+  if (!(x_136)) {
+    return 0;
+  }
+  float const x_140 = (*(p)).x;
+  float const x_141 = (*(c)).x;
+  float const x_143 = (*(p)).y;
+  float const x_144 = (*(c)).y;
+  float const x_147 = (*(a)).x;
+  float const x_148 = (*(c)).x;
+  float const x_150 = (*(a)).y;
+  float const x_151 = (*(c)).y;
+  param_4 = float2((x_140 - x_141), (x_143 - x_144));
+  param_5 = float2((x_147 - x_148), (x_150 - x_151));
+  float const x_155 = param_4.x;
+  float const x_157 = param_5.y;
+  float const x_160 = param_5.x;
+  float const x_162 = param_4.y;
+  float const x_164 = ((x_155 * x_157) - (x_160 * x_162));
+  x_66 = x_164;
+  bool const x_166 = (x_127 && (x_164 < 0.0f));
+  x_173_phi = x_166;
+  if (!(x_166)) {
+    x_172 = ((x_99 >= 0.0f) && (x_164 >= 0.0f));
+    x_173_phi = x_172;
+  }
+  bool const x_173 = x_173_phi;
+  if (!(x_173)) {
+    return 0;
+  }
+  return 1;
+}
+
+void main_1(constant buf0& x_17, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float2 param_6 = 0.0f;
+  float2 param_7 = 0.0f;
+  float2 param_8 = 0.0f;
+  float2 param_9 = 0.0f;
+  float4 const x_55 = *(tint_symbol_5);
+  float2 const x_58 = x_17.resolution;
+  param_6 = (float2(x_55.x, x_55.y) / x_58);
+  param_7 = float2(0.699999988f, 0.300000012f);
+  param_8 = float2(0.5f, 0.899999976f);
+  param_9 = float2(0.100000001f, 0.400000006f);
+  int const x_60 = pointInTriangle_vf2_vf2_vf2_vf2_(&(param_6), &(param_7), &(param_8), &(param_9));
+  if ((x_60 == 1)) {
+    *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_6) = float4(0.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_17 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_17, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..69ebf78
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.spvasm.expected.spvasm
@@ -0,0 +1,339 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 257
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_17 "x_17"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %pointInTriangle_vf2_vf2_vf2_vf2_ "pointInTriangle_vf2_vf2_vf2_vf2_"
+               OpName %p "p"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %x_66 "x_66"
+               OpName %x_67 "x_67"
+               OpName %x_68 "x_68"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpName %x_135 "x_135"
+               OpName %x_172 "x_172"
+               OpName %x_136_phi "x_136_phi"
+               OpName %x_173_phi "x_173_phi"
+               OpName %main_1 "main_1"
+               OpName %param_6 "param_6"
+               OpName %param_7 "param_7"
+               OpName %param_8 "param_8"
+               OpName %param_9 "param_9"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_17 NonWritable
+               OpDecorate %x_17 DescriptorSet 0
+               OpDecorate %x_17 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_17 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+        %int = OpTypeInt 32 1
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %15 = OpTypeFunction %int %_ptr_Function_v2float %_ptr_Function_v2float %_ptr_Function_v2float %_ptr_Function_v2float
+%_ptr_Function_float = OpTypePointer Function %float
+         %26 = OpConstantNull %float
+         %30 = OpConstantNull %v2float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %39 = OpConstantNull %bool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+    %float_0 = OpConstant %float 0
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+       %void = OpTypeVoid
+        %207 = OpTypeFunction %void
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+%float_0_699999988 = OpConstant %float 0.699999988
+%float_0_300000012 = OpConstant %float 0.300000012
+        %225 = OpConstantComposite %v2float %float_0_699999988 %float_0_300000012
+  %float_0_5 = OpConstant %float 0.5
+%float_0_899999976 = OpConstant %float 0.899999976
+        %228 = OpConstantComposite %v2float %float_0_5 %float_0_899999976
+%float_0_100000001 = OpConstant %float 0.100000001
+%float_0_400000006 = OpConstant %float 0.400000006
+        %231 = OpConstantComposite %v2float %float_0_100000001 %float_0_400000006
+    %float_1 = OpConstant %float 1
+        %242 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %243 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %244 = OpTypeFunction %void %main_out
+%pointInTriangle_vf2_vf2_vf2_vf2_ = OpFunction %int None %15
+          %p = OpFunctionParameter %_ptr_Function_v2float
+          %a = OpFunctionParameter %_ptr_Function_v2float
+          %b = OpFunctionParameter %_ptr_Function_v2float
+          %c = OpFunctionParameter %_ptr_Function_v2float
+         %23 = OpLabel
+       %x_66 = OpVariable %_ptr_Function_float Function %26
+       %x_67 = OpVariable %_ptr_Function_float Function %26
+       %x_68 = OpVariable %_ptr_Function_float Function %26
+      %param = OpVariable %_ptr_Function_v2float Function %30
+    %param_1 = OpVariable %_ptr_Function_v2float Function %30
+    %param_2 = OpVariable %_ptr_Function_v2float Function %30
+    %param_3 = OpVariable %_ptr_Function_v2float Function %30
+    %param_4 = OpVariable %_ptr_Function_v2float Function %30
+    %param_5 = OpVariable %_ptr_Function_v2float Function %30
+      %x_135 = OpVariable %_ptr_Function_bool Function %39
+      %x_172 = OpVariable %_ptr_Function_bool Function %39
+  %x_136_phi = OpVariable %_ptr_Function_bool Function %39
+  %x_173_phi = OpVariable %_ptr_Function_bool Function %39
+         %46 = OpAccessChain %_ptr_Function_float %p %uint_0
+         %47 = OpLoad %float %46
+         %49 = OpAccessChain %_ptr_Function_float %a %uint_0
+         %50 = OpLoad %float %49
+         %53 = OpAccessChain %_ptr_Function_float %p %uint_1
+         %54 = OpLoad %float %53
+         %56 = OpAccessChain %_ptr_Function_float %a %uint_1
+         %57 = OpLoad %float %56
+         %59 = OpAccessChain %_ptr_Function_float %b %uint_0
+         %60 = OpLoad %float %59
+         %62 = OpAccessChain %_ptr_Function_float %a %uint_0
+         %63 = OpLoad %float %62
+         %65 = OpAccessChain %_ptr_Function_float %b %uint_1
+         %66 = OpLoad %float %65
+         %68 = OpAccessChain %_ptr_Function_float %a %uint_1
+         %69 = OpLoad %float %68
+         %70 = OpFSub %float %47 %50
+         %71 = OpFSub %float %54 %57
+         %72 = OpCompositeConstruct %v2float %70 %71
+               OpStore %param %72
+         %73 = OpFSub %float %60 %63
+         %74 = OpFSub %float %66 %69
+         %75 = OpCompositeConstruct %v2float %73 %74
+               OpStore %param_1 %75
+         %76 = OpAccessChain %_ptr_Function_float %param %uint_0
+         %77 = OpLoad %float %76
+         %78 = OpAccessChain %_ptr_Function_float %param_1 %uint_1
+         %79 = OpLoad %float %78
+         %80 = OpAccessChain %_ptr_Function_float %param_1 %uint_0
+         %81 = OpLoad %float %80
+         %82 = OpAccessChain %_ptr_Function_float %param %uint_1
+         %83 = OpLoad %float %82
+         %84 = OpFMul %float %77 %79
+         %85 = OpFMul %float %81 %83
+         %86 = OpFSub %float %84 %85
+               OpStore %x_68 %86
+         %88 = OpAccessChain %_ptr_Function_float %p %uint_0
+         %89 = OpLoad %float %88
+         %91 = OpAccessChain %_ptr_Function_float %b %uint_0
+         %92 = OpLoad %float %91
+         %94 = OpAccessChain %_ptr_Function_float %p %uint_1
+         %95 = OpLoad %float %94
+         %97 = OpAccessChain %_ptr_Function_float %b %uint_1
+         %98 = OpLoad %float %97
+        %100 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %101 = OpLoad %float %100
+        %103 = OpAccessChain %_ptr_Function_float %b %uint_0
+        %104 = OpLoad %float %103
+        %106 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %107 = OpLoad %float %106
+        %109 = OpAccessChain %_ptr_Function_float %b %uint_1
+        %110 = OpLoad %float %109
+        %111 = OpFSub %float %89 %92
+        %112 = OpFSub %float %95 %98
+        %113 = OpCompositeConstruct %v2float %111 %112
+               OpStore %param_2 %113
+        %114 = OpFSub %float %101 %104
+        %115 = OpFSub %float %107 %110
+        %116 = OpCompositeConstruct %v2float %114 %115
+               OpStore %param_3 %116
+        %117 = OpAccessChain %_ptr_Function_float %param_2 %uint_0
+        %118 = OpLoad %float %117
+        %119 = OpAccessChain %_ptr_Function_float %param_3 %uint_1
+        %120 = OpLoad %float %119
+        %121 = OpAccessChain %_ptr_Function_float %param_3 %uint_0
+        %122 = OpLoad %float %121
+        %123 = OpAccessChain %_ptr_Function_float %param_2 %uint_1
+        %124 = OpLoad %float %123
+        %125 = OpFMul %float %118 %120
+        %126 = OpFMul %float %122 %124
+        %127 = OpFSub %float %125 %126
+               OpStore %x_67 %127
+        %129 = OpFOrdLessThan %bool %86 %float_0
+               OpSelectionMerge %130 None
+               OpBranchConditional %129 %131 %130
+        %131 = OpLabel
+        %132 = OpFOrdLessThan %bool %127 %float_0
+               OpBranch %130
+        %130 = OpLabel
+        %133 = OpPhi %bool %129 %23 %132 %131
+               OpStore %x_136_phi %133
+        %134 = OpLogicalNot %bool %133
+               OpSelectionMerge %135 None
+               OpBranchConditional %134 %136 %135
+        %136 = OpLabel
+        %137 = OpFOrdGreaterThanEqual %bool %86 %float_0
+               OpSelectionMerge %138 None
+               OpBranchConditional %137 %139 %138
+        %139 = OpLabel
+        %140 = OpFOrdGreaterThanEqual %bool %127 %float_0
+               OpBranch %138
+        %138 = OpLabel
+        %141 = OpPhi %bool %137 %136 %140 %139
+               OpStore %x_135 %141
+        %142 = OpLoad %bool %x_135
+               OpStore %x_136_phi %142
+               OpBranch %135
+        %135 = OpLabel
+        %143 = OpLoad %bool %x_136_phi
+        %144 = OpLogicalNot %bool %143
+               OpSelectionMerge %145 None
+               OpBranchConditional %144 %146 %145
+        %146 = OpLabel
+               OpReturnValue %int_0
+        %145 = OpLabel
+        %149 = OpAccessChain %_ptr_Function_float %p %uint_0
+        %150 = OpLoad %float %149
+        %152 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %153 = OpLoad %float %152
+        %155 = OpAccessChain %_ptr_Function_float %p %uint_1
+        %156 = OpLoad %float %155
+        %158 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %159 = OpLoad %float %158
+        %161 = OpAccessChain %_ptr_Function_float %a %uint_0
+        %162 = OpLoad %float %161
+        %164 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %165 = OpLoad %float %164
+        %167 = OpAccessChain %_ptr_Function_float %a %uint_1
+        %168 = OpLoad %float %167
+        %170 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %171 = OpLoad %float %170
+        %172 = OpFSub %float %150 %153
+        %173 = OpFSub %float %156 %159
+        %174 = OpCompositeConstruct %v2float %172 %173
+               OpStore %param_4 %174
+        %175 = OpFSub %float %162 %165
+        %176 = OpFSub %float %168 %171
+        %177 = OpCompositeConstruct %v2float %175 %176
+               OpStore %param_5 %177
+        %178 = OpAccessChain %_ptr_Function_float %param_4 %uint_0
+        %179 = OpLoad %float %178
+        %180 = OpAccessChain %_ptr_Function_float %param_5 %uint_1
+        %181 = OpLoad %float %180
+        %182 = OpAccessChain %_ptr_Function_float %param_5 %uint_0
+        %183 = OpLoad %float %182
+        %184 = OpAccessChain %_ptr_Function_float %param_4 %uint_1
+        %185 = OpLoad %float %184
+        %186 = OpFMul %float %179 %181
+        %187 = OpFMul %float %183 %185
+        %188 = OpFSub %float %186 %187
+               OpStore %x_66 %188
+               OpSelectionMerge %189 None
+               OpBranchConditional %129 %190 %189
+        %190 = OpLabel
+        %191 = OpFOrdLessThan %bool %188 %float_0
+               OpBranch %189
+        %189 = OpLabel
+        %192 = OpPhi %bool %129 %145 %191 %190
+               OpStore %x_173_phi %192
+        %193 = OpLogicalNot %bool %192
+               OpSelectionMerge %194 None
+               OpBranchConditional %193 %195 %194
+        %195 = OpLabel
+        %196 = OpFOrdGreaterThanEqual %bool %86 %float_0
+               OpSelectionMerge %197 None
+               OpBranchConditional %196 %198 %197
+        %198 = OpLabel
+        %199 = OpFOrdGreaterThanEqual %bool %188 %float_0
+               OpBranch %197
+        %197 = OpLabel
+        %200 = OpPhi %bool %196 %195 %199 %198
+               OpStore %x_172 %200
+        %201 = OpLoad %bool %x_172
+               OpStore %x_173_phi %201
+               OpBranch %194
+        %194 = OpLabel
+        %202 = OpLoad %bool %x_173_phi
+        %203 = OpLogicalNot %bool %202
+               OpSelectionMerge %204 None
+               OpBranchConditional %203 %205 %204
+        %205 = OpLabel
+               OpReturnValue %int_0
+        %204 = OpLabel
+               OpReturnValue %int_1
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %207
+        %210 = OpLabel
+    %param_6 = OpVariable %_ptr_Function_v2float Function %30
+    %param_7 = OpVariable %_ptr_Function_v2float Function %30
+    %param_8 = OpVariable %_ptr_Function_v2float Function %30
+    %param_9 = OpVariable %_ptr_Function_v2float Function %30
+        %215 = OpLoad %v4float %gl_FragCoord
+        %217 = OpAccessChain %_ptr_Uniform_v2float %x_17 %uint_0
+        %218 = OpLoad %v2float %217
+        %219 = OpCompositeExtract %float %215 0
+        %220 = OpCompositeExtract %float %215 1
+        %221 = OpCompositeConstruct %v2float %219 %220
+        %222 = OpFDiv %v2float %221 %218
+               OpStore %param_6 %222
+               OpStore %param_7 %225
+               OpStore %param_8 %228
+               OpStore %param_9 %231
+        %232 = OpFunctionCall %int %pointInTriangle_vf2_vf2_vf2_vf2_ %param_6 %param_7 %param_8 %param_9
+        %237 = OpIEqual %bool %232 %int_1
+               OpSelectionMerge %238 None
+               OpBranchConditional %237 %239 %240
+        %239 = OpLabel
+               OpStore %x_GLF_color %242
+               OpBranch %238
+        %240 = OpLabel
+               OpStore %x_GLF_color %243
+               OpBranch %238
+        %238 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %244
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %248 = OpLabel
+        %249 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %249
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %207
+        %251 = OpLabel
+        %252 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %252
+        %253 = OpFunctionCall %void %main_1
+        %255 = OpLoad %v4float %x_GLF_color
+        %256 = OpCompositeConstruct %main_out %255
+        %254 = OpFunctionCall %void %tint_symbol_3 %256
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..414b559
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.spvasm.expected.wgsl
@@ -0,0 +1,136 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_17 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn pointInTriangle_vf2_vf2_vf2_vf2_(p : ptr<function, vec2<f32>>, a : ptr<function, vec2<f32>>, b : ptr<function, vec2<f32>>, c : ptr<function, vec2<f32>>) -> i32 {
+  var x_66 : f32;
+  var x_67 : f32;
+  var x_68 : f32;
+  var param : vec2<f32>;
+  var param_1 : vec2<f32>;
+  var param_2 : vec2<f32>;
+  var param_3 : vec2<f32>;
+  var param_4 : vec2<f32>;
+  var param_5 : vec2<f32>;
+  var x_135 : bool;
+  var x_172 : bool;
+  var x_136_phi : bool;
+  var x_173_phi : bool;
+  let x_69 : ptr<function, f32> = &((*(p)).x);
+  let x_70 : f32 = *(x_69);
+  let x_71 : ptr<function, f32> = &((*(a)).x);
+  let x_72 : f32 = *(x_71);
+  let x_74 : ptr<function, f32> = &((*(p)).y);
+  let x_75 : f32 = *(x_74);
+  let x_76 : ptr<function, f32> = &((*(a)).y);
+  let x_77 : f32 = *(x_76);
+  let x_80 : ptr<function, f32> = &((*(b)).x);
+  let x_81 : f32 = *(x_80);
+  let x_82 : f32 = *(x_71);
+  let x_84 : ptr<function, f32> = &((*(b)).y);
+  let x_85 : f32 = *(x_84);
+  let x_86 : f32 = *(x_76);
+  param = vec2<f32>((x_70 - x_72), (x_75 - x_77));
+  param_1 = vec2<f32>((x_81 - x_82), (x_85 - x_86));
+  let x_90 : f32 = param.x;
+  let x_92 : f32 = param_1.y;
+  let x_95 : f32 = param_1.x;
+  let x_97 : f32 = param.y;
+  let x_99 : f32 = ((x_90 * x_92) - (x_95 * x_97));
+  x_68 = x_99;
+  let x_100 : f32 = *(x_69);
+  let x_101 : f32 = *(x_80);
+  let x_103 : f32 = *(x_74);
+  let x_104 : f32 = *(x_84);
+  let x_107 : ptr<function, f32> = &((*(c)).x);
+  let x_108 : f32 = *(x_107);
+  let x_109 : f32 = *(x_80);
+  let x_111 : ptr<function, f32> = &((*(c)).y);
+  let x_112 : f32 = *(x_111);
+  let x_113 : f32 = *(x_84);
+  param_2 = vec2<f32>((x_100 - x_101), (x_103 - x_104));
+  param_3 = vec2<f32>((x_108 - x_109), (x_112 - x_113));
+  let x_117 : f32 = param_2.x;
+  let x_119 : f32 = param_3.y;
+  let x_122 : f32 = param_3.x;
+  let x_124 : f32 = param_2.y;
+  let x_126 : f32 = ((x_117 * x_119) - (x_122 * x_124));
+  x_67 = x_126;
+  let x_127 : bool = (x_99 < 0.0);
+  let x_129 : bool = (x_127 && (x_126 < 0.0));
+  x_136_phi = x_129;
+  if (!(x_129)) {
+    x_135 = ((x_99 >= 0.0) && (x_126 >= 0.0));
+    x_136_phi = x_135;
+  }
+  let x_136 : bool = x_136_phi;
+  if (!(x_136)) {
+    return 0;
+  }
+  let x_140 : f32 = *(x_69);
+  let x_141 : f32 = *(x_107);
+  let x_143 : f32 = *(x_74);
+  let x_144 : f32 = *(x_111);
+  let x_147 : f32 = *(x_71);
+  let x_148 : f32 = *(x_107);
+  let x_150 : f32 = *(x_76);
+  let x_151 : f32 = *(x_111);
+  param_4 = vec2<f32>((x_140 - x_141), (x_143 - x_144));
+  param_5 = vec2<f32>((x_147 - x_148), (x_150 - x_151));
+  let x_155 : f32 = param_4.x;
+  let x_157 : f32 = param_5.y;
+  let x_160 : f32 = param_5.x;
+  let x_162 : f32 = param_4.y;
+  let x_164 : f32 = ((x_155 * x_157) - (x_160 * x_162));
+  x_66 = x_164;
+  let x_166 : bool = (x_127 && (x_164 < 0.0));
+  x_173_phi = x_166;
+  if (!(x_166)) {
+    x_172 = ((x_99 >= 0.0) && (x_164 >= 0.0));
+    x_173_phi = x_172;
+  }
+  let x_173 : bool = x_173_phi;
+  if (!(x_173)) {
+    return 0;
+  }
+  return 1;
+}
+
+fn main_1() {
+  var param_6 : vec2<f32>;
+  var param_7 : vec2<f32>;
+  var param_8 : vec2<f32>;
+  var param_9 : vec2<f32>;
+  let x_55 : vec4<f32> = gl_FragCoord;
+  let x_58 : vec2<f32> = x_17.resolution;
+  param_6 = (vec2<f32>(x_55.x, x_55.y) / x_58);
+  param_7 = vec2<f32>(0.699999988, 0.300000012);
+  param_8 = vec2<f32>(0.5, 0.899999976);
+  param_9 = vec2<f32>(0.100000001, 0.400000006);
+  let x_60 : i32 = pointInTriangle_vf2_vf2_vf2_vf2_(&(param_6), &(param_7), &(param_8), &(param_9));
+  if ((x_60 == 1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.wgsl
new file mode 100644
index 0000000..414b559
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.wgsl
@@ -0,0 +1,136 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_17 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn pointInTriangle_vf2_vf2_vf2_vf2_(p : ptr<function, vec2<f32>>, a : ptr<function, vec2<f32>>, b : ptr<function, vec2<f32>>, c : ptr<function, vec2<f32>>) -> i32 {
+  var x_66 : f32;
+  var x_67 : f32;
+  var x_68 : f32;
+  var param : vec2<f32>;
+  var param_1 : vec2<f32>;
+  var param_2 : vec2<f32>;
+  var param_3 : vec2<f32>;
+  var param_4 : vec2<f32>;
+  var param_5 : vec2<f32>;
+  var x_135 : bool;
+  var x_172 : bool;
+  var x_136_phi : bool;
+  var x_173_phi : bool;
+  let x_69 : ptr<function, f32> = &((*(p)).x);
+  let x_70 : f32 = *(x_69);
+  let x_71 : ptr<function, f32> = &((*(a)).x);
+  let x_72 : f32 = *(x_71);
+  let x_74 : ptr<function, f32> = &((*(p)).y);
+  let x_75 : f32 = *(x_74);
+  let x_76 : ptr<function, f32> = &((*(a)).y);
+  let x_77 : f32 = *(x_76);
+  let x_80 : ptr<function, f32> = &((*(b)).x);
+  let x_81 : f32 = *(x_80);
+  let x_82 : f32 = *(x_71);
+  let x_84 : ptr<function, f32> = &((*(b)).y);
+  let x_85 : f32 = *(x_84);
+  let x_86 : f32 = *(x_76);
+  param = vec2<f32>((x_70 - x_72), (x_75 - x_77));
+  param_1 = vec2<f32>((x_81 - x_82), (x_85 - x_86));
+  let x_90 : f32 = param.x;
+  let x_92 : f32 = param_1.y;
+  let x_95 : f32 = param_1.x;
+  let x_97 : f32 = param.y;
+  let x_99 : f32 = ((x_90 * x_92) - (x_95 * x_97));
+  x_68 = x_99;
+  let x_100 : f32 = *(x_69);
+  let x_101 : f32 = *(x_80);
+  let x_103 : f32 = *(x_74);
+  let x_104 : f32 = *(x_84);
+  let x_107 : ptr<function, f32> = &((*(c)).x);
+  let x_108 : f32 = *(x_107);
+  let x_109 : f32 = *(x_80);
+  let x_111 : ptr<function, f32> = &((*(c)).y);
+  let x_112 : f32 = *(x_111);
+  let x_113 : f32 = *(x_84);
+  param_2 = vec2<f32>((x_100 - x_101), (x_103 - x_104));
+  param_3 = vec2<f32>((x_108 - x_109), (x_112 - x_113));
+  let x_117 : f32 = param_2.x;
+  let x_119 : f32 = param_3.y;
+  let x_122 : f32 = param_3.x;
+  let x_124 : f32 = param_2.y;
+  let x_126 : f32 = ((x_117 * x_119) - (x_122 * x_124));
+  x_67 = x_126;
+  let x_127 : bool = (x_99 < 0.0);
+  let x_129 : bool = (x_127 && (x_126 < 0.0));
+  x_136_phi = x_129;
+  if (!(x_129)) {
+    x_135 = ((x_99 >= 0.0) && (x_126 >= 0.0));
+    x_136_phi = x_135;
+  }
+  let x_136 : bool = x_136_phi;
+  if (!(x_136)) {
+    return 0;
+  }
+  let x_140 : f32 = *(x_69);
+  let x_141 : f32 = *(x_107);
+  let x_143 : f32 = *(x_74);
+  let x_144 : f32 = *(x_111);
+  let x_147 : f32 = *(x_71);
+  let x_148 : f32 = *(x_107);
+  let x_150 : f32 = *(x_76);
+  let x_151 : f32 = *(x_111);
+  param_4 = vec2<f32>((x_140 - x_141), (x_143 - x_144));
+  param_5 = vec2<f32>((x_147 - x_148), (x_150 - x_151));
+  let x_155 : f32 = param_4.x;
+  let x_157 : f32 = param_5.y;
+  let x_160 : f32 = param_5.x;
+  let x_162 : f32 = param_4.y;
+  let x_164 : f32 = ((x_155 * x_157) - (x_160 * x_162));
+  x_66 = x_164;
+  let x_166 : bool = (x_127 && (x_164 < 0.0));
+  x_173_phi = x_166;
+  if (!(x_166)) {
+    x_172 = ((x_99 >= 0.0) && (x_164 >= 0.0));
+    x_173_phi = x_172;
+  }
+  let x_173 : bool = x_173_phi;
+  if (!(x_173)) {
+    return 0;
+  }
+  return 1;
+}
+
+fn main_1() {
+  var param_6 : vec2<f32>;
+  var param_7 : vec2<f32>;
+  var param_8 : vec2<f32>;
+  var param_9 : vec2<f32>;
+  let x_55 : vec4<f32> = gl_FragCoord;
+  let x_58 : vec2<f32> = x_17.resolution;
+  param_6 = (vec2<f32>(x_55.x, x_55.y) / x_58);
+  param_7 = vec2<f32>(0.699999988, 0.300000012);
+  param_8 = vec2<f32>(0.5, 0.899999976);
+  param_9 = vec2<f32>(0.100000001, 0.400000006);
+  let x_60 : i32 = pointInTriangle_vf2_vf2_vf2_vf2_(&(param_6), &(param_7), &(param_8), &(param_9));
+  if ((x_60 == 1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..c32dae7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.wgsl.expected.hlsl
@@ -0,0 +1,144 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_17 : register(b0, space0) {
+  uint4 x_17[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+int pointInTriangle_vf2_vf2_vf2_vf2_(inout float2 p, inout float2 a, inout float2 b, inout float2 c) {
+  float x_66 = 0.0f;
+  float x_67 = 0.0f;
+  float x_68 = 0.0f;
+  float2 param = float2(0.0f, 0.0f);
+  float2 param_1 = float2(0.0f, 0.0f);
+  float2 param_2 = float2(0.0f, 0.0f);
+  float2 param_3 = float2(0.0f, 0.0f);
+  float2 param_4 = float2(0.0f, 0.0f);
+  float2 param_5 = float2(0.0f, 0.0f);
+  bool x_135 = false;
+  bool x_172 = false;
+  bool x_136_phi = false;
+  bool x_173_phi = false;
+  const float x_70 = p.x;
+  const float x_72 = a.x;
+  const float x_75 = p.y;
+  const float x_77 = a.y;
+  const float x_81 = b.x;
+  const float x_82 = a.x;
+  const float x_85 = b.y;
+  const float x_86 = a.y;
+  param = float2((x_70 - x_72), (x_75 - x_77));
+  param_1 = float2((x_81 - x_82), (x_85 - x_86));
+  const float x_90 = param.x;
+  const float x_92 = param_1.y;
+  const float x_95 = param_1.x;
+  const float x_97 = param.y;
+  const float x_99 = ((x_90 * x_92) - (x_95 * x_97));
+  x_68 = x_99;
+  const float x_100 = p.x;
+  const float x_101 = b.x;
+  const float x_103 = p.y;
+  const float x_104 = b.y;
+  const float x_108 = c.x;
+  const float x_109 = b.x;
+  const float x_112 = c.y;
+  const float x_113 = b.y;
+  param_2 = float2((x_100 - x_101), (x_103 - x_104));
+  param_3 = float2((x_108 - x_109), (x_112 - x_113));
+  const float x_117 = param_2.x;
+  const float x_119 = param_3.y;
+  const float x_122 = param_3.x;
+  const float x_124 = param_2.y;
+  const float x_126 = ((x_117 * x_119) - (x_122 * x_124));
+  x_67 = x_126;
+  const bool x_127 = (x_99 < 0.0f);
+  bool tint_tmp = x_127;
+  if (tint_tmp) {
+    tint_tmp = (x_126 < 0.0f);
+  }
+  const bool x_129 = (tint_tmp);
+  x_136_phi = x_129;
+  if (!(x_129)) {
+    bool tint_tmp_1 = (x_99 >= 0.0f);
+    if (tint_tmp_1) {
+      tint_tmp_1 = (x_126 >= 0.0f);
+    }
+    x_135 = (tint_tmp_1);
+    x_136_phi = x_135;
+  }
+  if (!(x_136_phi)) {
+    return 0;
+  }
+  const float x_140 = p.x;
+  const float x_141 = c.x;
+  const float x_143 = p.y;
+  const float x_144 = c.y;
+  const float x_147 = a.x;
+  const float x_148 = c.x;
+  const float x_150 = a.y;
+  const float x_151 = c.y;
+  param_4 = float2((x_140 - x_141), (x_143 - x_144));
+  param_5 = float2((x_147 - x_148), (x_150 - x_151));
+  const float x_155 = param_4.x;
+  const float x_157 = param_5.y;
+  const float x_160 = param_5.x;
+  const float x_162 = param_4.y;
+  const float x_164 = ((x_155 * x_157) - (x_160 * x_162));
+  x_66 = x_164;
+  bool tint_tmp_2 = x_127;
+  if (tint_tmp_2) {
+    tint_tmp_2 = (x_164 < 0.0f);
+  }
+  const bool x_166 = (tint_tmp_2);
+  x_173_phi = x_166;
+  if (!(x_166)) {
+    bool tint_tmp_3 = (x_99 >= 0.0f);
+    if (tint_tmp_3) {
+      tint_tmp_3 = (x_164 >= 0.0f);
+    }
+    x_172 = (tint_tmp_3);
+    x_173_phi = x_172;
+  }
+  if (!(x_173_phi)) {
+    return 0;
+  }
+  return 1;
+}
+
+void main_1() {
+  float2 param_6 = float2(0.0f, 0.0f);
+  float2 param_7 = float2(0.0f, 0.0f);
+  float2 param_8 = float2(0.0f, 0.0f);
+  float2 param_9 = float2(0.0f, 0.0f);
+  const float4 x_55 = gl_FragCoord;
+  const float2 x_58 = asfloat(x_17[0].xy);
+  param_6 = (float2(x_55.x, x_55.y) / x_58);
+  param_7 = float2(0.699999988f, 0.300000012f);
+  param_8 = float2(0.5f, 0.899999976f);
+  param_9 = float2(0.100000001f, 0.400000006f);
+  const int x_60 = pointInTriangle_vf2_vf2_vf2_vf2_(param_6, param_7, param_8, param_9);
+  if ((x_60 == 1)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.wgsl.expected.msl
new file mode 100644
index 0000000..fc78937
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.wgsl.expected.msl
@@ -0,0 +1,129 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int pointInTriangle_vf2_vf2_vf2_vf2_(thread float2* const p, thread float2* const a, thread float2* const b, thread float2* const c) {
+  float x_66 = 0.0f;
+  float x_67 = 0.0f;
+  float x_68 = 0.0f;
+  float2 param = 0.0f;
+  float2 param_1 = 0.0f;
+  float2 param_2 = 0.0f;
+  float2 param_3 = 0.0f;
+  float2 param_4 = 0.0f;
+  float2 param_5 = 0.0f;
+  bool x_135 = false;
+  bool x_172 = false;
+  bool x_136_phi = false;
+  bool x_173_phi = false;
+  float const x_70 = (*(p)).x;
+  float const x_72 = (*(a)).x;
+  float const x_75 = (*(p)).y;
+  float const x_77 = (*(a)).y;
+  float const x_81 = (*(b)).x;
+  float const x_82 = (*(a)).x;
+  float const x_85 = (*(b)).y;
+  float const x_86 = (*(a)).y;
+  param = float2((x_70 - x_72), (x_75 - x_77));
+  param_1 = float2((x_81 - x_82), (x_85 - x_86));
+  float const x_90 = param.x;
+  float const x_92 = param_1.y;
+  float const x_95 = param_1.x;
+  float const x_97 = param.y;
+  float const x_99 = ((x_90 * x_92) - (x_95 * x_97));
+  x_68 = x_99;
+  float const x_100 = (*(p)).x;
+  float const x_101 = (*(b)).x;
+  float const x_103 = (*(p)).y;
+  float const x_104 = (*(b)).y;
+  float const x_108 = (*(c)).x;
+  float const x_109 = (*(b)).x;
+  float const x_112 = (*(c)).y;
+  float const x_113 = (*(b)).y;
+  param_2 = float2((x_100 - x_101), (x_103 - x_104));
+  param_3 = float2((x_108 - x_109), (x_112 - x_113));
+  float const x_117 = param_2.x;
+  float const x_119 = param_3.y;
+  float const x_122 = param_3.x;
+  float const x_124 = param_2.y;
+  float const x_126 = ((x_117 * x_119) - (x_122 * x_124));
+  x_67 = x_126;
+  bool const x_127 = (x_99 < 0.0f);
+  bool const x_129 = (x_127 && (x_126 < 0.0f));
+  x_136_phi = x_129;
+  if (!(x_129)) {
+    x_135 = ((x_99 >= 0.0f) && (x_126 >= 0.0f));
+    x_136_phi = x_135;
+  }
+  bool const x_136 = x_136_phi;
+  if (!(x_136)) {
+    return 0;
+  }
+  float const x_140 = (*(p)).x;
+  float const x_141 = (*(c)).x;
+  float const x_143 = (*(p)).y;
+  float const x_144 = (*(c)).y;
+  float const x_147 = (*(a)).x;
+  float const x_148 = (*(c)).x;
+  float const x_150 = (*(a)).y;
+  float const x_151 = (*(c)).y;
+  param_4 = float2((x_140 - x_141), (x_143 - x_144));
+  param_5 = float2((x_147 - x_148), (x_150 - x_151));
+  float const x_155 = param_4.x;
+  float const x_157 = param_5.y;
+  float const x_160 = param_5.x;
+  float const x_162 = param_4.y;
+  float const x_164 = ((x_155 * x_157) - (x_160 * x_162));
+  x_66 = x_164;
+  bool const x_166 = (x_127 && (x_164 < 0.0f));
+  x_173_phi = x_166;
+  if (!(x_166)) {
+    x_172 = ((x_99 >= 0.0f) && (x_164 >= 0.0f));
+    x_173_phi = x_172;
+  }
+  bool const x_173 = x_173_phi;
+  if (!(x_173)) {
+    return 0;
+  }
+  return 1;
+}
+
+void main_1(constant buf0& x_17, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float2 param_6 = 0.0f;
+  float2 param_7 = 0.0f;
+  float2 param_8 = 0.0f;
+  float2 param_9 = 0.0f;
+  float4 const x_55 = *(tint_symbol_5);
+  float2 const x_58 = x_17.resolution;
+  param_6 = (float2(x_55.x, x_55.y) / x_58);
+  param_7 = float2(0.699999988f, 0.300000012f);
+  param_8 = float2(0.5f, 0.899999976f);
+  param_9 = float2(0.100000001f, 0.400000006f);
+  int const x_60 = pointInTriangle_vf2_vf2_vf2_vf2_(&(param_6), &(param_7), &(param_8), &(param_9));
+  if ((x_60 == 1)) {
+    *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_6) = float4(0.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_17 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_17, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..69ebf78
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.wgsl.expected.spvasm
@@ -0,0 +1,339 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 257
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_17 "x_17"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %pointInTriangle_vf2_vf2_vf2_vf2_ "pointInTriangle_vf2_vf2_vf2_vf2_"
+               OpName %p "p"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %x_66 "x_66"
+               OpName %x_67 "x_67"
+               OpName %x_68 "x_68"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpName %x_135 "x_135"
+               OpName %x_172 "x_172"
+               OpName %x_136_phi "x_136_phi"
+               OpName %x_173_phi "x_173_phi"
+               OpName %main_1 "main_1"
+               OpName %param_6 "param_6"
+               OpName %param_7 "param_7"
+               OpName %param_8 "param_8"
+               OpName %param_9 "param_9"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_17 NonWritable
+               OpDecorate %x_17 DescriptorSet 0
+               OpDecorate %x_17 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_17 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+        %int = OpTypeInt 32 1
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %15 = OpTypeFunction %int %_ptr_Function_v2float %_ptr_Function_v2float %_ptr_Function_v2float %_ptr_Function_v2float
+%_ptr_Function_float = OpTypePointer Function %float
+         %26 = OpConstantNull %float
+         %30 = OpConstantNull %v2float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %39 = OpConstantNull %bool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+    %float_0 = OpConstant %float 0
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+       %void = OpTypeVoid
+        %207 = OpTypeFunction %void
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+%float_0_699999988 = OpConstant %float 0.699999988
+%float_0_300000012 = OpConstant %float 0.300000012
+        %225 = OpConstantComposite %v2float %float_0_699999988 %float_0_300000012
+  %float_0_5 = OpConstant %float 0.5
+%float_0_899999976 = OpConstant %float 0.899999976
+        %228 = OpConstantComposite %v2float %float_0_5 %float_0_899999976
+%float_0_100000001 = OpConstant %float 0.100000001
+%float_0_400000006 = OpConstant %float 0.400000006
+        %231 = OpConstantComposite %v2float %float_0_100000001 %float_0_400000006
+    %float_1 = OpConstant %float 1
+        %242 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %243 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %244 = OpTypeFunction %void %main_out
+%pointInTriangle_vf2_vf2_vf2_vf2_ = OpFunction %int None %15
+          %p = OpFunctionParameter %_ptr_Function_v2float
+          %a = OpFunctionParameter %_ptr_Function_v2float
+          %b = OpFunctionParameter %_ptr_Function_v2float
+          %c = OpFunctionParameter %_ptr_Function_v2float
+         %23 = OpLabel
+       %x_66 = OpVariable %_ptr_Function_float Function %26
+       %x_67 = OpVariable %_ptr_Function_float Function %26
+       %x_68 = OpVariable %_ptr_Function_float Function %26
+      %param = OpVariable %_ptr_Function_v2float Function %30
+    %param_1 = OpVariable %_ptr_Function_v2float Function %30
+    %param_2 = OpVariable %_ptr_Function_v2float Function %30
+    %param_3 = OpVariable %_ptr_Function_v2float Function %30
+    %param_4 = OpVariable %_ptr_Function_v2float Function %30
+    %param_5 = OpVariable %_ptr_Function_v2float Function %30
+      %x_135 = OpVariable %_ptr_Function_bool Function %39
+      %x_172 = OpVariable %_ptr_Function_bool Function %39
+  %x_136_phi = OpVariable %_ptr_Function_bool Function %39
+  %x_173_phi = OpVariable %_ptr_Function_bool Function %39
+         %46 = OpAccessChain %_ptr_Function_float %p %uint_0
+         %47 = OpLoad %float %46
+         %49 = OpAccessChain %_ptr_Function_float %a %uint_0
+         %50 = OpLoad %float %49
+         %53 = OpAccessChain %_ptr_Function_float %p %uint_1
+         %54 = OpLoad %float %53
+         %56 = OpAccessChain %_ptr_Function_float %a %uint_1
+         %57 = OpLoad %float %56
+         %59 = OpAccessChain %_ptr_Function_float %b %uint_0
+         %60 = OpLoad %float %59
+         %62 = OpAccessChain %_ptr_Function_float %a %uint_0
+         %63 = OpLoad %float %62
+         %65 = OpAccessChain %_ptr_Function_float %b %uint_1
+         %66 = OpLoad %float %65
+         %68 = OpAccessChain %_ptr_Function_float %a %uint_1
+         %69 = OpLoad %float %68
+         %70 = OpFSub %float %47 %50
+         %71 = OpFSub %float %54 %57
+         %72 = OpCompositeConstruct %v2float %70 %71
+               OpStore %param %72
+         %73 = OpFSub %float %60 %63
+         %74 = OpFSub %float %66 %69
+         %75 = OpCompositeConstruct %v2float %73 %74
+               OpStore %param_1 %75
+         %76 = OpAccessChain %_ptr_Function_float %param %uint_0
+         %77 = OpLoad %float %76
+         %78 = OpAccessChain %_ptr_Function_float %param_1 %uint_1
+         %79 = OpLoad %float %78
+         %80 = OpAccessChain %_ptr_Function_float %param_1 %uint_0
+         %81 = OpLoad %float %80
+         %82 = OpAccessChain %_ptr_Function_float %param %uint_1
+         %83 = OpLoad %float %82
+         %84 = OpFMul %float %77 %79
+         %85 = OpFMul %float %81 %83
+         %86 = OpFSub %float %84 %85
+               OpStore %x_68 %86
+         %88 = OpAccessChain %_ptr_Function_float %p %uint_0
+         %89 = OpLoad %float %88
+         %91 = OpAccessChain %_ptr_Function_float %b %uint_0
+         %92 = OpLoad %float %91
+         %94 = OpAccessChain %_ptr_Function_float %p %uint_1
+         %95 = OpLoad %float %94
+         %97 = OpAccessChain %_ptr_Function_float %b %uint_1
+         %98 = OpLoad %float %97
+        %100 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %101 = OpLoad %float %100
+        %103 = OpAccessChain %_ptr_Function_float %b %uint_0
+        %104 = OpLoad %float %103
+        %106 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %107 = OpLoad %float %106
+        %109 = OpAccessChain %_ptr_Function_float %b %uint_1
+        %110 = OpLoad %float %109
+        %111 = OpFSub %float %89 %92
+        %112 = OpFSub %float %95 %98
+        %113 = OpCompositeConstruct %v2float %111 %112
+               OpStore %param_2 %113
+        %114 = OpFSub %float %101 %104
+        %115 = OpFSub %float %107 %110
+        %116 = OpCompositeConstruct %v2float %114 %115
+               OpStore %param_3 %116
+        %117 = OpAccessChain %_ptr_Function_float %param_2 %uint_0
+        %118 = OpLoad %float %117
+        %119 = OpAccessChain %_ptr_Function_float %param_3 %uint_1
+        %120 = OpLoad %float %119
+        %121 = OpAccessChain %_ptr_Function_float %param_3 %uint_0
+        %122 = OpLoad %float %121
+        %123 = OpAccessChain %_ptr_Function_float %param_2 %uint_1
+        %124 = OpLoad %float %123
+        %125 = OpFMul %float %118 %120
+        %126 = OpFMul %float %122 %124
+        %127 = OpFSub %float %125 %126
+               OpStore %x_67 %127
+        %129 = OpFOrdLessThan %bool %86 %float_0
+               OpSelectionMerge %130 None
+               OpBranchConditional %129 %131 %130
+        %131 = OpLabel
+        %132 = OpFOrdLessThan %bool %127 %float_0
+               OpBranch %130
+        %130 = OpLabel
+        %133 = OpPhi %bool %129 %23 %132 %131
+               OpStore %x_136_phi %133
+        %134 = OpLogicalNot %bool %133
+               OpSelectionMerge %135 None
+               OpBranchConditional %134 %136 %135
+        %136 = OpLabel
+        %137 = OpFOrdGreaterThanEqual %bool %86 %float_0
+               OpSelectionMerge %138 None
+               OpBranchConditional %137 %139 %138
+        %139 = OpLabel
+        %140 = OpFOrdGreaterThanEqual %bool %127 %float_0
+               OpBranch %138
+        %138 = OpLabel
+        %141 = OpPhi %bool %137 %136 %140 %139
+               OpStore %x_135 %141
+        %142 = OpLoad %bool %x_135
+               OpStore %x_136_phi %142
+               OpBranch %135
+        %135 = OpLabel
+        %143 = OpLoad %bool %x_136_phi
+        %144 = OpLogicalNot %bool %143
+               OpSelectionMerge %145 None
+               OpBranchConditional %144 %146 %145
+        %146 = OpLabel
+               OpReturnValue %int_0
+        %145 = OpLabel
+        %149 = OpAccessChain %_ptr_Function_float %p %uint_0
+        %150 = OpLoad %float %149
+        %152 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %153 = OpLoad %float %152
+        %155 = OpAccessChain %_ptr_Function_float %p %uint_1
+        %156 = OpLoad %float %155
+        %158 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %159 = OpLoad %float %158
+        %161 = OpAccessChain %_ptr_Function_float %a %uint_0
+        %162 = OpLoad %float %161
+        %164 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %165 = OpLoad %float %164
+        %167 = OpAccessChain %_ptr_Function_float %a %uint_1
+        %168 = OpLoad %float %167
+        %170 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %171 = OpLoad %float %170
+        %172 = OpFSub %float %150 %153
+        %173 = OpFSub %float %156 %159
+        %174 = OpCompositeConstruct %v2float %172 %173
+               OpStore %param_4 %174
+        %175 = OpFSub %float %162 %165
+        %176 = OpFSub %float %168 %171
+        %177 = OpCompositeConstruct %v2float %175 %176
+               OpStore %param_5 %177
+        %178 = OpAccessChain %_ptr_Function_float %param_4 %uint_0
+        %179 = OpLoad %float %178
+        %180 = OpAccessChain %_ptr_Function_float %param_5 %uint_1
+        %181 = OpLoad %float %180
+        %182 = OpAccessChain %_ptr_Function_float %param_5 %uint_0
+        %183 = OpLoad %float %182
+        %184 = OpAccessChain %_ptr_Function_float %param_4 %uint_1
+        %185 = OpLoad %float %184
+        %186 = OpFMul %float %179 %181
+        %187 = OpFMul %float %183 %185
+        %188 = OpFSub %float %186 %187
+               OpStore %x_66 %188
+               OpSelectionMerge %189 None
+               OpBranchConditional %129 %190 %189
+        %190 = OpLabel
+        %191 = OpFOrdLessThan %bool %188 %float_0
+               OpBranch %189
+        %189 = OpLabel
+        %192 = OpPhi %bool %129 %145 %191 %190
+               OpStore %x_173_phi %192
+        %193 = OpLogicalNot %bool %192
+               OpSelectionMerge %194 None
+               OpBranchConditional %193 %195 %194
+        %195 = OpLabel
+        %196 = OpFOrdGreaterThanEqual %bool %86 %float_0
+               OpSelectionMerge %197 None
+               OpBranchConditional %196 %198 %197
+        %198 = OpLabel
+        %199 = OpFOrdGreaterThanEqual %bool %188 %float_0
+               OpBranch %197
+        %197 = OpLabel
+        %200 = OpPhi %bool %196 %195 %199 %198
+               OpStore %x_172 %200
+        %201 = OpLoad %bool %x_172
+               OpStore %x_173_phi %201
+               OpBranch %194
+        %194 = OpLabel
+        %202 = OpLoad %bool %x_173_phi
+        %203 = OpLogicalNot %bool %202
+               OpSelectionMerge %204 None
+               OpBranchConditional %203 %205 %204
+        %205 = OpLabel
+               OpReturnValue %int_0
+        %204 = OpLabel
+               OpReturnValue %int_1
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %207
+        %210 = OpLabel
+    %param_6 = OpVariable %_ptr_Function_v2float Function %30
+    %param_7 = OpVariable %_ptr_Function_v2float Function %30
+    %param_8 = OpVariable %_ptr_Function_v2float Function %30
+    %param_9 = OpVariable %_ptr_Function_v2float Function %30
+        %215 = OpLoad %v4float %gl_FragCoord
+        %217 = OpAccessChain %_ptr_Uniform_v2float %x_17 %uint_0
+        %218 = OpLoad %v2float %217
+        %219 = OpCompositeExtract %float %215 0
+        %220 = OpCompositeExtract %float %215 1
+        %221 = OpCompositeConstruct %v2float %219 %220
+        %222 = OpFDiv %v2float %221 %218
+               OpStore %param_6 %222
+               OpStore %param_7 %225
+               OpStore %param_8 %228
+               OpStore %param_9 %231
+        %232 = OpFunctionCall %int %pointInTriangle_vf2_vf2_vf2_vf2_ %param_6 %param_7 %param_8 %param_9
+        %237 = OpIEqual %bool %232 %int_1
+               OpSelectionMerge %238 None
+               OpBranchConditional %237 %239 %240
+        %239 = OpLabel
+               OpStore %x_GLF_color %242
+               OpBranch %238
+        %240 = OpLabel
+               OpStore %x_GLF_color %243
+               OpBranch %238
+        %238 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %244
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %248 = OpLabel
+        %249 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %249
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %207
+        %251 = OpLabel
+        %252 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %252
+        %253 = OpFunctionCall %void %main_1
+        %255 = OpLoad %v4float %x_GLF_color
+        %256 = OpCompositeConstruct %main_out %255
+        %254 = OpFunctionCall %void %tint_symbol_3 %256
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..414b559
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.wgsl.expected.wgsl
@@ -0,0 +1,136 @@
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_17 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn pointInTriangle_vf2_vf2_vf2_vf2_(p : ptr<function, vec2<f32>>, a : ptr<function, vec2<f32>>, b : ptr<function, vec2<f32>>, c : ptr<function, vec2<f32>>) -> i32 {
+  var x_66 : f32;
+  var x_67 : f32;
+  var x_68 : f32;
+  var param : vec2<f32>;
+  var param_1 : vec2<f32>;
+  var param_2 : vec2<f32>;
+  var param_3 : vec2<f32>;
+  var param_4 : vec2<f32>;
+  var param_5 : vec2<f32>;
+  var x_135 : bool;
+  var x_172 : bool;
+  var x_136_phi : bool;
+  var x_173_phi : bool;
+  let x_69 : ptr<function, f32> = &((*(p)).x);
+  let x_70 : f32 = *(x_69);
+  let x_71 : ptr<function, f32> = &((*(a)).x);
+  let x_72 : f32 = *(x_71);
+  let x_74 : ptr<function, f32> = &((*(p)).y);
+  let x_75 : f32 = *(x_74);
+  let x_76 : ptr<function, f32> = &((*(a)).y);
+  let x_77 : f32 = *(x_76);
+  let x_80 : ptr<function, f32> = &((*(b)).x);
+  let x_81 : f32 = *(x_80);
+  let x_82 : f32 = *(x_71);
+  let x_84 : ptr<function, f32> = &((*(b)).y);
+  let x_85 : f32 = *(x_84);
+  let x_86 : f32 = *(x_76);
+  param = vec2<f32>((x_70 - x_72), (x_75 - x_77));
+  param_1 = vec2<f32>((x_81 - x_82), (x_85 - x_86));
+  let x_90 : f32 = param.x;
+  let x_92 : f32 = param_1.y;
+  let x_95 : f32 = param_1.x;
+  let x_97 : f32 = param.y;
+  let x_99 : f32 = ((x_90 * x_92) - (x_95 * x_97));
+  x_68 = x_99;
+  let x_100 : f32 = *(x_69);
+  let x_101 : f32 = *(x_80);
+  let x_103 : f32 = *(x_74);
+  let x_104 : f32 = *(x_84);
+  let x_107 : ptr<function, f32> = &((*(c)).x);
+  let x_108 : f32 = *(x_107);
+  let x_109 : f32 = *(x_80);
+  let x_111 : ptr<function, f32> = &((*(c)).y);
+  let x_112 : f32 = *(x_111);
+  let x_113 : f32 = *(x_84);
+  param_2 = vec2<f32>((x_100 - x_101), (x_103 - x_104));
+  param_3 = vec2<f32>((x_108 - x_109), (x_112 - x_113));
+  let x_117 : f32 = param_2.x;
+  let x_119 : f32 = param_3.y;
+  let x_122 : f32 = param_3.x;
+  let x_124 : f32 = param_2.y;
+  let x_126 : f32 = ((x_117 * x_119) - (x_122 * x_124));
+  x_67 = x_126;
+  let x_127 : bool = (x_99 < 0.0);
+  let x_129 : bool = (x_127 && (x_126 < 0.0));
+  x_136_phi = x_129;
+  if (!(x_129)) {
+    x_135 = ((x_99 >= 0.0) && (x_126 >= 0.0));
+    x_136_phi = x_135;
+  }
+  let x_136 : bool = x_136_phi;
+  if (!(x_136)) {
+    return 0;
+  }
+  let x_140 : f32 = *(x_69);
+  let x_141 : f32 = *(x_107);
+  let x_143 : f32 = *(x_74);
+  let x_144 : f32 = *(x_111);
+  let x_147 : f32 = *(x_71);
+  let x_148 : f32 = *(x_107);
+  let x_150 : f32 = *(x_76);
+  let x_151 : f32 = *(x_111);
+  param_4 = vec2<f32>((x_140 - x_141), (x_143 - x_144));
+  param_5 = vec2<f32>((x_147 - x_148), (x_150 - x_151));
+  let x_155 : f32 = param_4.x;
+  let x_157 : f32 = param_5.y;
+  let x_160 : f32 = param_5.x;
+  let x_162 : f32 = param_4.y;
+  let x_164 : f32 = ((x_155 * x_157) - (x_160 * x_162));
+  x_66 = x_164;
+  let x_166 : bool = (x_127 && (x_164 < 0.0));
+  x_173_phi = x_166;
+  if (!(x_166)) {
+    x_172 = ((x_99 >= 0.0) && (x_164 >= 0.0));
+    x_173_phi = x_172;
+  }
+  let x_173 : bool = x_173_phi;
+  if (!(x_173)) {
+    return 0;
+  }
+  return 1;
+}
+
+fn main_1() {
+  var param_6 : vec2<f32>;
+  var param_7 : vec2<f32>;
+  var param_8 : vec2<f32>;
+  var param_9 : vec2<f32>;
+  let x_55 : vec4<f32> = gl_FragCoord;
+  let x_58 : vec2<f32> = x_17.resolution;
+  param_6 = (vec2<f32>(x_55.x, x_55.y) / x_58);
+  param_7 = vec2<f32>(0.699999988, 0.300000012);
+  param_8 = vec2<f32>(0.5, 0.899999976);
+  param_9 = vec2<f32>(0.100000001, 0.400000006);
+  let x_60 : i32 = pointInTriangle_vf2_vf2_vf2_vf2_(&(param_6), &(param_7), &(param_8), &(param_9));
+  if ((x_60 == 1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.spvasm
new file mode 100644
index 0000000..48966c3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.spvasm
@@ -0,0 +1,298 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color %gl_FragCoord
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %pointInTriangle_vf2_vf2_vf2_vf2_ "pointInTriangle(vf2;vf2;vf2;vf2;"
+               OpName %p "p"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %param_1 "param"
+               OpName %param_2 "param"
+               OpName %param_3 "param"
+               OpName %param_4 "param"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %__0 ""
+               OpName %param_5 "param"
+               OpName %param_6 "param"
+               OpName %param_7 "param"
+               OpName %param_8 "param"
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+       %void = OpTypeVoid
+         %25 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+        %int = OpTypeInt 32 1
+         %30 = OpTypeFunction %int %_ptr_Function_v2float %_ptr_Function_v2float %_ptr_Function_v2float %_ptr_Function_v2float
+    %v4float = OpTypeVector %float 4
+    %float_1 = OpConstant %float 1
+         %33 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+      %int_0 = OpConstant %int 0
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+      %int_1 = OpConstant %int 1
+     %uint_0 = OpConstant %uint 0
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_0 = OpConstant %float 0
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %__0 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+%float_0_699999988 = OpConstant %float 0.699999988
+%float_0_300000012 = OpConstant %float 0.300000012
+         %50 = OpConstantComposite %v2float %float_0_699999988 %float_0_300000012
+  %float_0_5 = OpConstant %float 0.5
+%float_0_899999976 = OpConstant %float 0.899999976
+         %53 = OpConstantComposite %v2float %float_0_5 %float_0_899999976
+%float_0_100000001 = OpConstant %float 0.100000001
+%float_0_400000006 = OpConstant %float 0.400000006
+         %56 = OpConstantComposite %v2float %float_0_100000001 %float_0_400000006
+         %57 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %58 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %25
+         %59 = OpLabel
+    %param_5 = OpVariable %_ptr_Function_v2float Function
+    %param_6 = OpVariable %_ptr_Function_v2float Function
+    %param_7 = OpVariable %_ptr_Function_v2float Function
+    %param_8 = OpVariable %_ptr_Function_v2float Function
+         %60 = OpLoad %v4float %gl_FragCoord
+         %61 = OpVectorShuffle %v2float %60 %60 0 1
+         %62 = OpAccessChain %_ptr_Uniform_v2float %__0 %int_0
+         %63 = OpLoad %v2float %62
+         %64 = OpFDiv %v2float %61 %63
+               OpStore %param_5 %64
+               OpStore %param_6 %50
+               OpStore %param_7 %53
+               OpStore %param_8 %56
+         %65 = OpFunctionCall %int %pointInTriangle_vf2_vf2_vf2_vf2_ %param_5 %param_6 %param_7 %param_8
+         %66 = OpIEqual %bool %65 %int_1
+               OpSelectionMerge %67 None
+               OpBranchConditional %66 %68 %69
+         %68 = OpLabel
+         %70 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %71 = OpLoad %float %70
+         %72 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %73 = OpLoad %float %72
+         %74 = OpFOrdGreaterThanEqual %bool %71 %73
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %75
+         %76 = OpLabel
+               OpStore %_GLF_color %57
+               OpBranch %75
+         %75 = OpLabel
+               OpBranch %67
+         %69 = OpLabel
+               OpStore %_GLF_color %58
+               OpBranch %67
+         %67 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%pointInTriangle_vf2_vf2_vf2_vf2_ = OpFunction %int None %30
+          %p = OpFunctionParameter %_ptr_Function_v2float
+          %a = OpFunctionParameter %_ptr_Function_v2float
+          %b = OpFunctionParameter %_ptr_Function_v2float
+          %c = OpFunctionParameter %_ptr_Function_v2float
+         %77 = OpLabel
+         %78 = OpVariable %_ptr_Function_float Function
+         %79 = OpVariable %_ptr_Function_float Function
+         %80 = OpVariable %_ptr_Function_float Function
+      %param = OpVariable %_ptr_Function_v2float Function
+    %param_0 = OpVariable %_ptr_Function_v2float Function
+    %param_1 = OpVariable %_ptr_Function_v2float Function
+    %param_2 = OpVariable %_ptr_Function_v2float Function
+    %param_3 = OpVariable %_ptr_Function_v2float Function
+    %param_4 = OpVariable %_ptr_Function_v2float Function
+         %81 = OpAccessChain %_ptr_Function_float %p %uint_0
+         %82 = OpLoad %float %81
+         %83 = OpAccessChain %_ptr_Function_float %a %uint_0
+         %84 = OpLoad %float %83
+         %85 = OpFSub %float %82 %84
+         %86 = OpAccessChain %_ptr_Function_float %p %uint_1
+         %87 = OpLoad %float %86
+         %88 = OpAccessChain %_ptr_Function_float %a %uint_1
+         %89 = OpLoad %float %88
+         %90 = OpFSub %float %87 %89
+         %91 = OpCompositeConstruct %v2float %85 %90
+         %92 = OpAccessChain %_ptr_Function_float %b %uint_0
+         %93 = OpLoad %float %92
+         %94 = OpLoad %float %83
+         %95 = OpFSub %float %93 %94
+         %96 = OpAccessChain %_ptr_Function_float %b %uint_1
+         %97 = OpLoad %float %96
+         %98 = OpLoad %float %88
+         %99 = OpFSub %float %97 %98
+        %100 = OpCompositeConstruct %v2float %95 %99
+               OpStore %param %91
+               OpStore %param_0 %100
+        %101 = OpAccessChain %_ptr_Function_float %param %uint_0
+        %102 = OpLoad %float %101
+        %103 = OpAccessChain %_ptr_Function_float %param_0 %uint_1
+        %104 = OpLoad %float %103
+        %105 = OpFMul %float %102 %104
+        %106 = OpAccessChain %_ptr_Function_float %param_0 %uint_0
+        %107 = OpLoad %float %106
+        %108 = OpAccessChain %_ptr_Function_float %param %uint_1
+        %109 = OpLoad %float %108
+        %110 = OpFMul %float %107 %109
+        %111 = OpFSub %float %105 %110
+               OpStore %80 %111
+        %112 = OpLoad %float %81
+        %113 = OpLoad %float %92
+        %114 = OpFSub %float %112 %113
+        %115 = OpLoad %float %86
+        %116 = OpLoad %float %96
+        %117 = OpFSub %float %115 %116
+        %118 = OpCompositeConstruct %v2float %114 %117
+        %119 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %120 = OpLoad %float %119
+        %121 = OpLoad %float %92
+        %122 = OpFSub %float %120 %121
+        %123 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %124 = OpLoad %float %123
+        %125 = OpLoad %float %96
+        %126 = OpFSub %float %124 %125
+        %127 = OpCompositeConstruct %v2float %122 %126
+               OpStore %param_1 %118
+               OpStore %param_2 %127
+        %128 = OpAccessChain %_ptr_Function_float %param_1 %uint_0
+        %129 = OpLoad %float %128
+        %130 = OpAccessChain %_ptr_Function_float %param_2 %uint_1
+        %131 = OpLoad %float %130
+        %132 = OpFMul %float %129 %131
+        %133 = OpAccessChain %_ptr_Function_float %param_2 %uint_0
+        %134 = OpLoad %float %133
+        %135 = OpAccessChain %_ptr_Function_float %param_1 %uint_1
+        %136 = OpLoad %float %135
+        %137 = OpFMul %float %134 %136
+        %138 = OpFSub %float %132 %137
+               OpStore %79 %138
+        %139 = OpFOrdLessThan %bool %111 %float_0
+        %140 = OpFOrdLessThan %bool %138 %float_0
+        %141 = OpLogicalAnd %bool %139 %140
+        %142 = OpLogicalNot %bool %141
+               OpSelectionMerge %143 None
+               OpBranchConditional %142 %144 %143
+        %144 = OpLabel
+        %145 = OpFOrdGreaterThanEqual %bool %111 %float_0
+        %146 = OpFOrdGreaterThanEqual %bool %138 %float_0
+        %147 = OpLogicalAnd %bool %145 %146
+               OpBranch %143
+        %143 = OpLabel
+        %148 = OpPhi %bool %141 %77 %147 %144
+        %149 = OpLogicalNot %bool %148
+               OpSelectionMerge %150 None
+               OpBranchConditional %149 %151 %150
+        %151 = OpLabel
+               OpBranch %152
+        %152 = OpLabel
+        %153 = OpPhi %int %int_0 %151 %154 %155
+               OpLoopMerge %156 %155 None
+               OpBranch %157
+        %157 = OpLabel
+        %158 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+        %159 = OpLoad %float %158
+        %160 = OpConvertFToS %int %159
+        %161 = OpSLessThan %bool %153 %160
+               OpBranchConditional %161 %162 %156
+        %162 = OpLabel
+               OpStore %_GLF_color %33
+               OpBranch %163
+        %163 = OpLabel
+        %164 = OpPhi %int %int_0 %162 %165 %166
+               OpLoopMerge %167 %166 None
+               OpBranch %168
+        %168 = OpLabel
+        %169 = OpSLessThan %bool %164 %160
+               OpBranchConditional %169 %170 %167
+        %170 = OpLabel
+               OpStore %_GLF_color %33
+               OpBranch %166
+        %166 = OpLabel
+        %165 = OpIAdd %int %164 %int_1
+               OpBranch %163
+        %167 = OpLabel
+               OpBranch %155
+        %155 = OpLabel
+        %154 = OpIAdd %int %153 %int_1
+               OpBranch %152
+        %156 = OpLabel
+               OpReturnValue %int_0
+        %150 = OpLabel
+        %171 = OpLoad %float %81
+        %172 = OpLoad %float %119
+        %173 = OpFSub %float %171 %172
+        %174 = OpLoad %float %86
+        %175 = OpLoad %float %123
+        %176 = OpFSub %float %174 %175
+        %177 = OpCompositeConstruct %v2float %173 %176
+        %178 = OpLoad %float %83
+        %179 = OpLoad %float %119
+        %180 = OpFSub %float %178 %179
+        %181 = OpLoad %float %88
+        %182 = OpLoad %float %123
+        %183 = OpFSub %float %181 %182
+        %184 = OpCompositeConstruct %v2float %180 %183
+               OpStore %param_3 %177
+               OpStore %param_4 %184
+        %185 = OpAccessChain %_ptr_Function_float %param_3 %uint_0
+        %186 = OpLoad %float %185
+        %187 = OpAccessChain %_ptr_Function_float %param_4 %uint_1
+        %188 = OpLoad %float %187
+        %189 = OpFMul %float %186 %188
+        %190 = OpAccessChain %_ptr_Function_float %param_4 %uint_0
+        %191 = OpLoad %float %190
+        %192 = OpAccessChain %_ptr_Function_float %param_3 %uint_1
+        %193 = OpLoad %float %192
+        %194 = OpFMul %float %191 %193
+        %195 = OpFSub %float %189 %194
+               OpStore %78 %195
+        %196 = OpFOrdLessThan %bool %195 %float_0
+        %197 = OpLogicalAnd %bool %139 %196
+        %198 = OpLogicalNot %bool %197
+               OpSelectionMerge %199 None
+               OpBranchConditional %198 %200 %199
+        %200 = OpLabel
+        %201 = OpFOrdGreaterThanEqual %bool %111 %float_0
+        %202 = OpFOrdGreaterThanEqual %bool %195 %float_0
+        %203 = OpLogicalAnd %bool %201 %202
+               OpBranch %199
+        %199 = OpLabel
+        %204 = OpPhi %bool %197 %150 %203 %200
+        %205 = OpLogicalNot %bool %204
+               OpSelectionMerge %206 None
+               OpBranchConditional %205 %207 %206
+        %207 = OpLabel
+               OpReturnValue %int_0
+        %206 = OpLabel
+               OpReturnValue %int_1
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..1e6b252
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.spvasm.expected.hlsl
@@ -0,0 +1,183 @@
+cbuffer cbuffer_x_11 : register(b1, space0) {
+  uint4 x_11[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_19 : register(b0, space0) {
+  uint4 x_19[1];
+};
+
+int pointInTriangle_vf2_vf2_vf2_vf2_(inout float2 p, inout float2 a, inout float2 b, inout float2 c) {
+  float x_78 = 0.0f;
+  float x_79 = 0.0f;
+  float x_80 = 0.0f;
+  float2 param = float2(0.0f, 0.0f);
+  float2 param_1 = float2(0.0f, 0.0f);
+  float2 param_2 = float2(0.0f, 0.0f);
+  float2 param_3 = float2(0.0f, 0.0f);
+  float2 param_4 = float2(0.0f, 0.0f);
+  float2 param_5 = float2(0.0f, 0.0f);
+  bool x_147 = false;
+  bool x_203 = false;
+  bool x_148_phi = false;
+  bool x_204_phi = false;
+  const float x_82 = p.x;
+  const float x_84 = a.x;
+  const float x_87 = p.y;
+  const float x_89 = a.y;
+  const float x_93 = b.x;
+  const float x_94 = a.x;
+  const float x_97 = b.y;
+  const float x_98 = a.y;
+  param = float2((x_82 - x_84), (x_87 - x_89));
+  param_1 = float2((x_93 - x_94), (x_97 - x_98));
+  const float x_102 = param.x;
+  const float x_104 = param_1.y;
+  const float x_107 = param_1.x;
+  const float x_109 = param.y;
+  const float x_111 = ((x_102 * x_104) - (x_107 * x_109));
+  x_80 = x_111;
+  const float x_112 = p.x;
+  const float x_113 = b.x;
+  const float x_115 = p.y;
+  const float x_116 = b.y;
+  const float x_120 = c.x;
+  const float x_121 = b.x;
+  const float x_124 = c.y;
+  const float x_125 = b.y;
+  param_2 = float2((x_112 - x_113), (x_115 - x_116));
+  param_3 = float2((x_120 - x_121), (x_124 - x_125));
+  const float x_129 = param_2.x;
+  const float x_131 = param_3.y;
+  const float x_134 = param_3.x;
+  const float x_136 = param_2.y;
+  const float x_138 = ((x_129 * x_131) - (x_134 * x_136));
+  x_79 = x_138;
+  const bool x_139 = (x_111 < 0.0f);
+  bool tint_tmp = x_139;
+  if (tint_tmp) {
+    tint_tmp = (x_138 < 0.0f);
+  }
+  const bool x_141 = (tint_tmp);
+  x_148_phi = x_141;
+  if (!(x_141)) {
+    bool tint_tmp_1 = (x_111 >= 0.0f);
+    if (tint_tmp_1) {
+      tint_tmp_1 = (x_138 >= 0.0f);
+    }
+    x_147 = (tint_tmp_1);
+    x_148_phi = x_147;
+  }
+  int x_153_phi = 0;
+  if (!(x_148_phi)) {
+    x_153_phi = 0;
+    while (true) {
+      int x_154 = 0;
+      int x_164_phi = 0;
+      const int x_153 = x_153_phi;
+      const float x_159 = asfloat(x_11[0].y);
+      const int x_160 = int(x_159);
+      if ((x_153 < x_160)) {
+      } else {
+        break;
+      }
+      x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+      x_164_phi = 0;
+      while (true) {
+        int x_165 = 0;
+        const int x_164 = x_164_phi;
+        if ((x_164 < x_160)) {
+        } else {
+          break;
+        }
+        x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+        {
+          x_165 = (x_164 + 1);
+          x_164_phi = x_165;
+        }
+      }
+      {
+        x_154 = (x_153 + 1);
+        x_153_phi = x_154;
+      }
+    }
+    return 0;
+  }
+  const float x_171 = p.x;
+  const float x_172 = c.x;
+  const float x_174 = p.y;
+  const float x_175 = c.y;
+  const float x_178 = a.x;
+  const float x_179 = c.x;
+  const float x_181 = a.y;
+  const float x_182 = c.y;
+  param_4 = float2((x_171 - x_172), (x_174 - x_175));
+  param_5 = float2((x_178 - x_179), (x_181 - x_182));
+  const float x_186 = param_4.x;
+  const float x_188 = param_5.y;
+  const float x_191 = param_5.x;
+  const float x_193 = param_4.y;
+  const float x_195 = ((x_186 * x_188) - (x_191 * x_193));
+  x_78 = x_195;
+  bool tint_tmp_2 = x_139;
+  if (tint_tmp_2) {
+    tint_tmp_2 = (x_195 < 0.0f);
+  }
+  const bool x_197 = (tint_tmp_2);
+  x_204_phi = x_197;
+  if (!(x_197)) {
+    bool tint_tmp_3 = (x_111 >= 0.0f);
+    if (tint_tmp_3) {
+      tint_tmp_3 = (x_195 >= 0.0f);
+    }
+    x_203 = (tint_tmp_3);
+    x_204_phi = x_203;
+  }
+  if (!(x_204_phi)) {
+    return 0;
+  }
+  return 1;
+}
+
+void main_1() {
+  float2 param_6 = float2(0.0f, 0.0f);
+  float2 param_7 = float2(0.0f, 0.0f);
+  float2 param_8 = float2(0.0f, 0.0f);
+  float2 param_9 = float2(0.0f, 0.0f);
+  const float4 x_60 = gl_FragCoord;
+  const float2 x_63 = asfloat(x_19[0].xy);
+  param_6 = (float2(x_60.x, x_60.y) / x_63);
+  param_7 = float2(0.699999988f, 0.300000012f);
+  param_8 = float2(0.5f, 0.899999976f);
+  param_9 = float2(0.100000001f, 0.400000006f);
+  const int x_65 = pointInTriangle_vf2_vf2_vf2_vf2_(param_6, param_7, param_8, param_9);
+  if ((x_65 == 1)) {
+    const float x_71 = asfloat(x_11[0].y);
+    const float x_73 = asfloat(x_11[0].x);
+    if ((x_71 >= x_73)) {
+      x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    }
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.spvasm.expected.msl
new file mode 100644
index 0000000..6537e89
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.spvasm.expected.msl
@@ -0,0 +1,168 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf1 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int pointInTriangle_vf2_vf2_vf2_vf2_(constant buf1& x_11, thread float2* const p, thread float2* const a, thread float2* const b, thread float2* const c, thread float4* const tint_symbol_5) {
+  float x_78 = 0.0f;
+  float x_79 = 0.0f;
+  float x_80 = 0.0f;
+  float2 param = 0.0f;
+  float2 param_1 = 0.0f;
+  float2 param_2 = 0.0f;
+  float2 param_3 = 0.0f;
+  float2 param_4 = 0.0f;
+  float2 param_5 = 0.0f;
+  bool x_147 = false;
+  bool x_203 = false;
+  bool x_148_phi = false;
+  bool x_204_phi = false;
+  float const x_82 = (*(p)).x;
+  float const x_84 = (*(a)).x;
+  float const x_87 = (*(p)).y;
+  float const x_89 = (*(a)).y;
+  float const x_93 = (*(b)).x;
+  float const x_94 = (*(a)).x;
+  float const x_97 = (*(b)).y;
+  float const x_98 = (*(a)).y;
+  param = float2((x_82 - x_84), (x_87 - x_89));
+  param_1 = float2((x_93 - x_94), (x_97 - x_98));
+  float const x_102 = param.x;
+  float const x_104 = param_1.y;
+  float const x_107 = param_1.x;
+  float const x_109 = param.y;
+  float const x_111 = ((x_102 * x_104) - (x_107 * x_109));
+  x_80 = x_111;
+  float const x_112 = (*(p)).x;
+  float const x_113 = (*(b)).x;
+  float const x_115 = (*(p)).y;
+  float const x_116 = (*(b)).y;
+  float const x_120 = (*(c)).x;
+  float const x_121 = (*(b)).x;
+  float const x_124 = (*(c)).y;
+  float const x_125 = (*(b)).y;
+  param_2 = float2((x_112 - x_113), (x_115 - x_116));
+  param_3 = float2((x_120 - x_121), (x_124 - x_125));
+  float const x_129 = param_2.x;
+  float const x_131 = param_3.y;
+  float const x_134 = param_3.x;
+  float const x_136 = param_2.y;
+  float const x_138 = ((x_129 * x_131) - (x_134 * x_136));
+  x_79 = x_138;
+  bool const x_139 = (x_111 < 0.0f);
+  bool const x_141 = (x_139 && (x_138 < 0.0f));
+  x_148_phi = x_141;
+  if (!(x_141)) {
+    x_147 = ((x_111 >= 0.0f) && (x_138 >= 0.0f));
+    x_148_phi = x_147;
+  }
+  int x_153_phi = 0;
+  bool const x_148 = x_148_phi;
+  if (!(x_148)) {
+    x_153_phi = 0;
+    while (true) {
+      int x_154 = 0;
+      int x_164_phi = 0;
+      int const x_153 = x_153_phi;
+      float const x_159 = x_11.injectionSwitch.y;
+      int const x_160 = int(x_159);
+      if ((x_153 < x_160)) {
+      } else {
+        break;
+      }
+      *(tint_symbol_5) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+      x_164_phi = 0;
+      while (true) {
+        int x_165 = 0;
+        int const x_164 = x_164_phi;
+        if ((x_164 < x_160)) {
+        } else {
+          break;
+        }
+        *(tint_symbol_5) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+        {
+          x_165 = (x_164 + 1);
+          x_164_phi = x_165;
+        }
+      }
+      {
+        x_154 = (x_153 + 1);
+        x_153_phi = x_154;
+      }
+    }
+    return 0;
+  }
+  float const x_171 = (*(p)).x;
+  float const x_172 = (*(c)).x;
+  float const x_174 = (*(p)).y;
+  float const x_175 = (*(c)).y;
+  float const x_178 = (*(a)).x;
+  float const x_179 = (*(c)).x;
+  float const x_181 = (*(a)).y;
+  float const x_182 = (*(c)).y;
+  param_4 = float2((x_171 - x_172), (x_174 - x_175));
+  param_5 = float2((x_178 - x_179), (x_181 - x_182));
+  float const x_186 = param_4.x;
+  float const x_188 = param_5.y;
+  float const x_191 = param_5.x;
+  float const x_193 = param_4.y;
+  float const x_195 = ((x_186 * x_188) - (x_191 * x_193));
+  x_78 = x_195;
+  bool const x_197 = (x_139 && (x_195 < 0.0f));
+  x_204_phi = x_197;
+  if (!(x_197)) {
+    x_203 = ((x_111 >= 0.0f) && (x_195 >= 0.0f));
+    x_204_phi = x_203;
+  }
+  bool const x_204 = x_204_phi;
+  if (!(x_204)) {
+    return 0;
+  }
+  return 1;
+}
+
+void main_1(constant buf0& x_19, constant buf1& x_11, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  float2 param_6 = 0.0f;
+  float2 param_7 = 0.0f;
+  float2 param_8 = 0.0f;
+  float2 param_9 = 0.0f;
+  float4 const x_60 = *(tint_symbol_6);
+  float2 const x_63 = x_19.resolution;
+  param_6 = (float2(x_60.x, x_60.y) / x_63);
+  param_7 = float2(0.699999988f, 0.300000012f);
+  param_8 = float2(0.5f, 0.899999976f);
+  param_9 = float2(0.100000001f, 0.400000006f);
+  int const x_65 = pointInTriangle_vf2_vf2_vf2_vf2_(x_11, &(param_6), &(param_7), &(param_8), &(param_9), tint_symbol_7);
+  if ((x_65 == 1)) {
+    float const x_71 = x_11.injectionSwitch.y;
+    float const x_73 = x_11.injectionSwitch.x;
+    if ((x_71 >= x_73)) {
+      *(tint_symbol_7) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    }
+  } else {
+    *(tint_symbol_7) = float4(0.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_19 [[buffer(0)]], constant buf1& x_11 [[buffer(1)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_19, x_11, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..8e4e6fc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.spvasm.expected.spvasm
@@ -0,0 +1,423 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 300
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "injectionSwitch"
+               OpName %x_11 "x_11"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_19 "x_19"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %pointInTriangle_vf2_vf2_vf2_vf2_ "pointInTriangle_vf2_vf2_vf2_vf2_"
+               OpName %p "p"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %x_78 "x_78"
+               OpName %x_79 "x_79"
+               OpName %x_80 "x_80"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpName %x_147 "x_147"
+               OpName %x_203 "x_203"
+               OpName %x_148_phi "x_148_phi"
+               OpName %x_204_phi "x_204_phi"
+               OpName %x_153_phi "x_153_phi"
+               OpName %x_154 "x_154"
+               OpName %x_164_phi "x_164_phi"
+               OpName %x_165 "x_165"
+               OpName %main_1 "main_1"
+               OpName %param_6 "param_6"
+               OpName %param_7 "param_7"
+               OpName %param_8 "param_8"
+               OpName %param_9 "param_9"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_11 NonWritable
+               OpDecorate %x_11 DescriptorSet 0
+               OpDecorate %x_11 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_19 NonWritable
+               OpDecorate %x_19 DescriptorSet 0
+               OpDecorate %x_19 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_11 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_19 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+        %int = OpTypeInt 32 1
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %18 = OpTypeFunction %int %_ptr_Function_v2float %_ptr_Function_v2float %_ptr_Function_v2float %_ptr_Function_v2float
+%_ptr_Function_float = OpTypePointer Function %float
+         %29 = OpConstantNull %float
+         %33 = OpConstantNull %v2float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %42 = OpConstantNull %bool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+    %float_0 = OpConstant %float 0
+%_ptr_Function_int = OpTypePointer Function %int
+        %148 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+        %170 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+      %int_1 = OpConstant %int 1
+       %void = OpTypeVoid
+        %244 = OpTypeFunction %void
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+%float_0_699999988 = OpConstant %float 0.699999988
+%float_0_300000012 = OpConstant %float 0.300000012
+        %262 = OpConstantComposite %v2float %float_0_699999988 %float_0_300000012
+  %float_0_5 = OpConstant %float 0.5
+%float_0_899999976 = OpConstant %float 0.899999976
+        %265 = OpConstantComposite %v2float %float_0_5 %float_0_899999976
+%float_0_100000001 = OpConstant %float 0.100000001
+%float_0_400000006 = OpConstant %float 0.400000006
+        %268 = OpConstantComposite %v2float %float_0_100000001 %float_0_400000006
+        %285 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %286 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %287 = OpTypeFunction %void %main_out
+%pointInTriangle_vf2_vf2_vf2_vf2_ = OpFunction %int None %18
+          %p = OpFunctionParameter %_ptr_Function_v2float
+          %a = OpFunctionParameter %_ptr_Function_v2float
+          %b = OpFunctionParameter %_ptr_Function_v2float
+          %c = OpFunctionParameter %_ptr_Function_v2float
+         %26 = OpLabel
+       %x_78 = OpVariable %_ptr_Function_float Function %29
+       %x_79 = OpVariable %_ptr_Function_float Function %29
+       %x_80 = OpVariable %_ptr_Function_float Function %29
+      %param = OpVariable %_ptr_Function_v2float Function %33
+    %param_1 = OpVariable %_ptr_Function_v2float Function %33
+    %param_2 = OpVariable %_ptr_Function_v2float Function %33
+    %param_3 = OpVariable %_ptr_Function_v2float Function %33
+    %param_4 = OpVariable %_ptr_Function_v2float Function %33
+    %param_5 = OpVariable %_ptr_Function_v2float Function %33
+      %x_147 = OpVariable %_ptr_Function_bool Function %42
+      %x_203 = OpVariable %_ptr_Function_bool Function %42
+  %x_148_phi = OpVariable %_ptr_Function_bool Function %42
+  %x_204_phi = OpVariable %_ptr_Function_bool Function %42
+  %x_153_phi = OpVariable %_ptr_Function_int Function %148
+      %x_154 = OpVariable %_ptr_Function_int Function %148
+  %x_164_phi = OpVariable %_ptr_Function_int Function %148
+      %x_165 = OpVariable %_ptr_Function_int Function %148
+         %49 = OpAccessChain %_ptr_Function_float %p %uint_0
+         %50 = OpLoad %float %49
+         %52 = OpAccessChain %_ptr_Function_float %a %uint_0
+         %53 = OpLoad %float %52
+         %56 = OpAccessChain %_ptr_Function_float %p %uint_1
+         %57 = OpLoad %float %56
+         %59 = OpAccessChain %_ptr_Function_float %a %uint_1
+         %60 = OpLoad %float %59
+         %62 = OpAccessChain %_ptr_Function_float %b %uint_0
+         %63 = OpLoad %float %62
+         %65 = OpAccessChain %_ptr_Function_float %a %uint_0
+         %66 = OpLoad %float %65
+         %68 = OpAccessChain %_ptr_Function_float %b %uint_1
+         %69 = OpLoad %float %68
+         %71 = OpAccessChain %_ptr_Function_float %a %uint_1
+         %72 = OpLoad %float %71
+         %73 = OpFSub %float %50 %53
+         %74 = OpFSub %float %57 %60
+         %75 = OpCompositeConstruct %v2float %73 %74
+               OpStore %param %75
+         %76 = OpFSub %float %63 %66
+         %77 = OpFSub %float %69 %72
+         %78 = OpCompositeConstruct %v2float %76 %77
+               OpStore %param_1 %78
+         %79 = OpAccessChain %_ptr_Function_float %param %uint_0
+         %80 = OpLoad %float %79
+         %81 = OpAccessChain %_ptr_Function_float %param_1 %uint_1
+         %82 = OpLoad %float %81
+         %83 = OpAccessChain %_ptr_Function_float %param_1 %uint_0
+         %84 = OpLoad %float %83
+         %85 = OpAccessChain %_ptr_Function_float %param %uint_1
+         %86 = OpLoad %float %85
+         %87 = OpFMul %float %80 %82
+         %88 = OpFMul %float %84 %86
+         %89 = OpFSub %float %87 %88
+               OpStore %x_80 %89
+         %91 = OpAccessChain %_ptr_Function_float %p %uint_0
+         %92 = OpLoad %float %91
+         %94 = OpAccessChain %_ptr_Function_float %b %uint_0
+         %95 = OpLoad %float %94
+         %97 = OpAccessChain %_ptr_Function_float %p %uint_1
+         %98 = OpLoad %float %97
+        %100 = OpAccessChain %_ptr_Function_float %b %uint_1
+        %101 = OpLoad %float %100
+        %103 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %104 = OpLoad %float %103
+        %106 = OpAccessChain %_ptr_Function_float %b %uint_0
+        %107 = OpLoad %float %106
+        %109 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %110 = OpLoad %float %109
+        %112 = OpAccessChain %_ptr_Function_float %b %uint_1
+        %113 = OpLoad %float %112
+        %114 = OpFSub %float %92 %95
+        %115 = OpFSub %float %98 %101
+        %116 = OpCompositeConstruct %v2float %114 %115
+               OpStore %param_2 %116
+        %117 = OpFSub %float %104 %107
+        %118 = OpFSub %float %110 %113
+        %119 = OpCompositeConstruct %v2float %117 %118
+               OpStore %param_3 %119
+        %120 = OpAccessChain %_ptr_Function_float %param_2 %uint_0
+        %121 = OpLoad %float %120
+        %122 = OpAccessChain %_ptr_Function_float %param_3 %uint_1
+        %123 = OpLoad %float %122
+        %124 = OpAccessChain %_ptr_Function_float %param_3 %uint_0
+        %125 = OpLoad %float %124
+        %126 = OpAccessChain %_ptr_Function_float %param_2 %uint_1
+        %127 = OpLoad %float %126
+        %128 = OpFMul %float %121 %123
+        %129 = OpFMul %float %125 %127
+        %130 = OpFSub %float %128 %129
+               OpStore %x_79 %130
+        %132 = OpFOrdLessThan %bool %89 %float_0
+               OpSelectionMerge %133 None
+               OpBranchConditional %132 %134 %133
+        %134 = OpLabel
+        %135 = OpFOrdLessThan %bool %130 %float_0
+               OpBranch %133
+        %133 = OpLabel
+        %136 = OpPhi %bool %132 %26 %135 %134
+               OpStore %x_148_phi %136
+        %137 = OpLogicalNot %bool %136
+               OpSelectionMerge %138 None
+               OpBranchConditional %137 %139 %138
+        %139 = OpLabel
+        %140 = OpFOrdGreaterThanEqual %bool %89 %float_0
+               OpSelectionMerge %141 None
+               OpBranchConditional %140 %142 %141
+        %142 = OpLabel
+        %143 = OpFOrdGreaterThanEqual %bool %130 %float_0
+               OpBranch %141
+        %141 = OpLabel
+        %144 = OpPhi %bool %140 %139 %143 %142
+               OpStore %x_147 %144
+        %145 = OpLoad %bool %x_147
+               OpStore %x_148_phi %145
+               OpBranch %138
+        %138 = OpLabel
+        %149 = OpLoad %bool %x_148_phi
+        %150 = OpLogicalNot %bool %149
+               OpSelectionMerge %151 None
+               OpBranchConditional %150 %152 %151
+        %152 = OpLabel
+               OpStore %x_153_phi %int_0
+               OpBranch %154
+        %154 = OpLabel
+               OpLoopMerge %155 %156 None
+               OpBranch %157
+        %157 = OpLabel
+        %160 = OpLoad %int %x_153_phi
+        %162 = OpAccessChain %_ptr_Uniform_float %x_11 %uint_0 %uint_1
+        %163 = OpLoad %float %162
+        %164 = OpConvertFToS %int %163
+        %165 = OpSLessThan %bool %160 %164
+               OpSelectionMerge %166 None
+               OpBranchConditional %165 %167 %168
+        %167 = OpLabel
+               OpBranch %166
+        %168 = OpLabel
+               OpBranch %155
+        %166 = OpLabel
+               OpStore %x_GLF_color %170
+               OpStore %x_164_phi %int_0
+               OpBranch %171
+        %171 = OpLabel
+               OpLoopMerge %172 %173 None
+               OpBranch %174
+        %174 = OpLabel
+        %176 = OpLoad %int %x_164_phi
+        %177 = OpSLessThan %bool %176 %164
+               OpSelectionMerge %178 None
+               OpBranchConditional %177 %179 %180
+        %179 = OpLabel
+               OpBranch %178
+        %180 = OpLabel
+               OpBranch %172
+        %178 = OpLabel
+               OpStore %x_GLF_color %170
+               OpBranch %173
+        %173 = OpLabel
+        %182 = OpIAdd %int %176 %int_1
+               OpStore %x_165 %182
+        %183 = OpLoad %int %x_165
+               OpStore %x_164_phi %183
+               OpBranch %171
+        %172 = OpLabel
+               OpBranch %156
+        %156 = OpLabel
+        %184 = OpIAdd %int %160 %int_1
+               OpStore %x_154 %184
+        %185 = OpLoad %int %x_154
+               OpStore %x_153_phi %185
+               OpBranch %154
+        %155 = OpLabel
+               OpReturnValue %int_0
+        %151 = OpLabel
+        %187 = OpAccessChain %_ptr_Function_float %p %uint_0
+        %188 = OpLoad %float %187
+        %190 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %191 = OpLoad %float %190
+        %193 = OpAccessChain %_ptr_Function_float %p %uint_1
+        %194 = OpLoad %float %193
+        %196 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %197 = OpLoad %float %196
+        %199 = OpAccessChain %_ptr_Function_float %a %uint_0
+        %200 = OpLoad %float %199
+        %202 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %203 = OpLoad %float %202
+        %205 = OpAccessChain %_ptr_Function_float %a %uint_1
+        %206 = OpLoad %float %205
+        %208 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %209 = OpLoad %float %208
+        %210 = OpFSub %float %188 %191
+        %211 = OpFSub %float %194 %197
+        %212 = OpCompositeConstruct %v2float %210 %211
+               OpStore %param_4 %212
+        %213 = OpFSub %float %200 %203
+        %214 = OpFSub %float %206 %209
+        %215 = OpCompositeConstruct %v2float %213 %214
+               OpStore %param_5 %215
+        %216 = OpAccessChain %_ptr_Function_float %param_4 %uint_0
+        %217 = OpLoad %float %216
+        %218 = OpAccessChain %_ptr_Function_float %param_5 %uint_1
+        %219 = OpLoad %float %218
+        %220 = OpAccessChain %_ptr_Function_float %param_5 %uint_0
+        %221 = OpLoad %float %220
+        %222 = OpAccessChain %_ptr_Function_float %param_4 %uint_1
+        %223 = OpLoad %float %222
+        %224 = OpFMul %float %217 %219
+        %225 = OpFMul %float %221 %223
+        %226 = OpFSub %float %224 %225
+               OpStore %x_78 %226
+               OpSelectionMerge %227 None
+               OpBranchConditional %132 %228 %227
+        %228 = OpLabel
+        %229 = OpFOrdLessThan %bool %226 %float_0
+               OpBranch %227
+        %227 = OpLabel
+        %230 = OpPhi %bool %132 %151 %229 %228
+               OpStore %x_204_phi %230
+        %231 = OpLogicalNot %bool %230
+               OpSelectionMerge %232 None
+               OpBranchConditional %231 %233 %232
+        %233 = OpLabel
+        %234 = OpFOrdGreaterThanEqual %bool %89 %float_0
+               OpSelectionMerge %235 None
+               OpBranchConditional %234 %236 %235
+        %236 = OpLabel
+        %237 = OpFOrdGreaterThanEqual %bool %226 %float_0
+               OpBranch %235
+        %235 = OpLabel
+        %238 = OpPhi %bool %234 %233 %237 %236
+               OpStore %x_203 %238
+        %239 = OpLoad %bool %x_203
+               OpStore %x_204_phi %239
+               OpBranch %232
+        %232 = OpLabel
+        %240 = OpLoad %bool %x_204_phi
+        %241 = OpLogicalNot %bool %240
+               OpSelectionMerge %242 None
+               OpBranchConditional %241 %243 %242
+        %243 = OpLabel
+               OpReturnValue %int_0
+        %242 = OpLabel
+               OpReturnValue %int_1
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %244
+        %247 = OpLabel
+    %param_6 = OpVariable %_ptr_Function_v2float Function %33
+    %param_7 = OpVariable %_ptr_Function_v2float Function %33
+    %param_8 = OpVariable %_ptr_Function_v2float Function %33
+    %param_9 = OpVariable %_ptr_Function_v2float Function %33
+        %252 = OpLoad %v4float %gl_FragCoord
+        %254 = OpAccessChain %_ptr_Uniform_v2float %x_19 %uint_0
+        %255 = OpLoad %v2float %254
+        %256 = OpCompositeExtract %float %252 0
+        %257 = OpCompositeExtract %float %252 1
+        %258 = OpCompositeConstruct %v2float %256 %257
+        %259 = OpFDiv %v2float %258 %255
+               OpStore %param_6 %259
+               OpStore %param_7 %262
+               OpStore %param_8 %265
+               OpStore %param_9 %268
+        %269 = OpFunctionCall %int %pointInTriangle_vf2_vf2_vf2_vf2_ %param_6 %param_7 %param_8 %param_9
+        %274 = OpIEqual %bool %269 %int_1
+               OpSelectionMerge %275 None
+               OpBranchConditional %274 %276 %277
+        %276 = OpLabel
+        %278 = OpAccessChain %_ptr_Uniform_float %x_11 %uint_0 %uint_1
+        %279 = OpLoad %float %278
+        %280 = OpAccessChain %_ptr_Uniform_float %x_11 %uint_0 %uint_0
+        %281 = OpLoad %float %280
+        %282 = OpFOrdGreaterThanEqual %bool %279 %281
+               OpSelectionMerge %283 None
+               OpBranchConditional %282 %284 %283
+        %284 = OpLabel
+               OpStore %x_GLF_color %285
+               OpBranch %283
+        %283 = OpLabel
+               OpBranch %275
+        %277 = OpLabel
+               OpStore %x_GLF_color %286
+               OpBranch %275
+        %275 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %287
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %291 = OpLabel
+        %292 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %292
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %244
+        %294 = OpLabel
+        %295 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %295
+        %296 = OpFunctionCall %void %main_1
+        %298 = OpLoad %v4float %x_GLF_color
+        %299 = OpCompositeConstruct %main_out %298
+        %297 = OpFunctionCall %void %tint_symbol_3 %299
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..c9e248c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.spvasm.expected.wgsl
@@ -0,0 +1,181 @@
+[[block]]
+struct buf1 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+[[group(0), binding(1)]] var<uniform> x_11 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_19 : buf0;
+
+fn pointInTriangle_vf2_vf2_vf2_vf2_(p : ptr<function, vec2<f32>>, a : ptr<function, vec2<f32>>, b : ptr<function, vec2<f32>>, c : ptr<function, vec2<f32>>) -> i32 {
+  var x_78 : f32;
+  var x_79 : f32;
+  var x_80 : f32;
+  var param : vec2<f32>;
+  var param_1 : vec2<f32>;
+  var param_2 : vec2<f32>;
+  var param_3 : vec2<f32>;
+  var param_4 : vec2<f32>;
+  var param_5 : vec2<f32>;
+  var x_147 : bool;
+  var x_203 : bool;
+  var x_148_phi : bool;
+  var x_204_phi : bool;
+  let x_81 : ptr<function, f32> = &((*(p)).x);
+  let x_82 : f32 = *(x_81);
+  let x_83 : ptr<function, f32> = &((*(a)).x);
+  let x_84 : f32 = *(x_83);
+  let x_86 : ptr<function, f32> = &((*(p)).y);
+  let x_87 : f32 = *(x_86);
+  let x_88 : ptr<function, f32> = &((*(a)).y);
+  let x_89 : f32 = *(x_88);
+  let x_92 : ptr<function, f32> = &((*(b)).x);
+  let x_93 : f32 = *(x_92);
+  let x_94 : f32 = *(x_83);
+  let x_96 : ptr<function, f32> = &((*(b)).y);
+  let x_97 : f32 = *(x_96);
+  let x_98 : f32 = *(x_88);
+  param = vec2<f32>((x_82 - x_84), (x_87 - x_89));
+  param_1 = vec2<f32>((x_93 - x_94), (x_97 - x_98));
+  let x_102 : f32 = param.x;
+  let x_104 : f32 = param_1.y;
+  let x_107 : f32 = param_1.x;
+  let x_109 : f32 = param.y;
+  let x_111 : f32 = ((x_102 * x_104) - (x_107 * x_109));
+  x_80 = x_111;
+  let x_112 : f32 = *(x_81);
+  let x_113 : f32 = *(x_92);
+  let x_115 : f32 = *(x_86);
+  let x_116 : f32 = *(x_96);
+  let x_119 : ptr<function, f32> = &((*(c)).x);
+  let x_120 : f32 = *(x_119);
+  let x_121 : f32 = *(x_92);
+  let x_123 : ptr<function, f32> = &((*(c)).y);
+  let x_124 : f32 = *(x_123);
+  let x_125 : f32 = *(x_96);
+  param_2 = vec2<f32>((x_112 - x_113), (x_115 - x_116));
+  param_3 = vec2<f32>((x_120 - x_121), (x_124 - x_125));
+  let x_129 : f32 = param_2.x;
+  let x_131 : f32 = param_3.y;
+  let x_134 : f32 = param_3.x;
+  let x_136 : f32 = param_2.y;
+  let x_138 : f32 = ((x_129 * x_131) - (x_134 * x_136));
+  x_79 = x_138;
+  let x_139 : bool = (x_111 < 0.0);
+  let x_141 : bool = (x_139 && (x_138 < 0.0));
+  x_148_phi = x_141;
+  if (!(x_141)) {
+    x_147 = ((x_111 >= 0.0) && (x_138 >= 0.0));
+    x_148_phi = x_147;
+  }
+  var x_153_phi : i32;
+  let x_148 : bool = x_148_phi;
+  if (!(x_148)) {
+    x_153_phi = 0;
+    loop {
+      var x_154 : i32;
+      var x_164_phi : i32;
+      let x_153 : i32 = x_153_phi;
+      let x_159 : f32 = x_11.injectionSwitch.y;
+      let x_160 : i32 = i32(x_159);
+      if ((x_153 < x_160)) {
+      } else {
+        break;
+      }
+      x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+      x_164_phi = 0;
+      loop {
+        var x_165 : i32;
+        let x_164 : i32 = x_164_phi;
+        if ((x_164 < x_160)) {
+        } else {
+          break;
+        }
+        x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+
+        continuing {
+          x_165 = (x_164 + 1);
+          x_164_phi = x_165;
+        }
+      }
+
+      continuing {
+        x_154 = (x_153 + 1);
+        x_153_phi = x_154;
+      }
+    }
+    return 0;
+  }
+  let x_171 : f32 = *(x_81);
+  let x_172 : f32 = *(x_119);
+  let x_174 : f32 = *(x_86);
+  let x_175 : f32 = *(x_123);
+  let x_178 : f32 = *(x_83);
+  let x_179 : f32 = *(x_119);
+  let x_181 : f32 = *(x_88);
+  let x_182 : f32 = *(x_123);
+  param_4 = vec2<f32>((x_171 - x_172), (x_174 - x_175));
+  param_5 = vec2<f32>((x_178 - x_179), (x_181 - x_182));
+  let x_186 : f32 = param_4.x;
+  let x_188 : f32 = param_5.y;
+  let x_191 : f32 = param_5.x;
+  let x_193 : f32 = param_4.y;
+  let x_195 : f32 = ((x_186 * x_188) - (x_191 * x_193));
+  x_78 = x_195;
+  let x_197 : bool = (x_139 && (x_195 < 0.0));
+  x_204_phi = x_197;
+  if (!(x_197)) {
+    x_203 = ((x_111 >= 0.0) && (x_195 >= 0.0));
+    x_204_phi = x_203;
+  }
+  let x_204 : bool = x_204_phi;
+  if (!(x_204)) {
+    return 0;
+  }
+  return 1;
+}
+
+fn main_1() {
+  var param_6 : vec2<f32>;
+  var param_7 : vec2<f32>;
+  var param_8 : vec2<f32>;
+  var param_9 : vec2<f32>;
+  let x_60 : vec4<f32> = gl_FragCoord;
+  let x_63 : vec2<f32> = x_19.resolution;
+  param_6 = (vec2<f32>(x_60.x, x_60.y) / x_63);
+  param_7 = vec2<f32>(0.699999988, 0.300000012);
+  param_8 = vec2<f32>(0.5, 0.899999976);
+  param_9 = vec2<f32>(0.100000001, 0.400000006);
+  let x_65 : i32 = pointInTriangle_vf2_vf2_vf2_vf2_(&(param_6), &(param_7), &(param_8), &(param_9));
+  if ((x_65 == 1)) {
+    let x_71 : f32 = x_11.injectionSwitch.y;
+    let x_73 : f32 = x_11.injectionSwitch.x;
+    if ((x_71 >= x_73)) {
+      x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    }
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.wgsl
new file mode 100644
index 0000000..c9e248c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.wgsl
@@ -0,0 +1,181 @@
+[[block]]
+struct buf1 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+[[group(0), binding(1)]] var<uniform> x_11 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_19 : buf0;
+
+fn pointInTriangle_vf2_vf2_vf2_vf2_(p : ptr<function, vec2<f32>>, a : ptr<function, vec2<f32>>, b : ptr<function, vec2<f32>>, c : ptr<function, vec2<f32>>) -> i32 {
+  var x_78 : f32;
+  var x_79 : f32;
+  var x_80 : f32;
+  var param : vec2<f32>;
+  var param_1 : vec2<f32>;
+  var param_2 : vec2<f32>;
+  var param_3 : vec2<f32>;
+  var param_4 : vec2<f32>;
+  var param_5 : vec2<f32>;
+  var x_147 : bool;
+  var x_203 : bool;
+  var x_148_phi : bool;
+  var x_204_phi : bool;
+  let x_81 : ptr<function, f32> = &((*(p)).x);
+  let x_82 : f32 = *(x_81);
+  let x_83 : ptr<function, f32> = &((*(a)).x);
+  let x_84 : f32 = *(x_83);
+  let x_86 : ptr<function, f32> = &((*(p)).y);
+  let x_87 : f32 = *(x_86);
+  let x_88 : ptr<function, f32> = &((*(a)).y);
+  let x_89 : f32 = *(x_88);
+  let x_92 : ptr<function, f32> = &((*(b)).x);
+  let x_93 : f32 = *(x_92);
+  let x_94 : f32 = *(x_83);
+  let x_96 : ptr<function, f32> = &((*(b)).y);
+  let x_97 : f32 = *(x_96);
+  let x_98 : f32 = *(x_88);
+  param = vec2<f32>((x_82 - x_84), (x_87 - x_89));
+  param_1 = vec2<f32>((x_93 - x_94), (x_97 - x_98));
+  let x_102 : f32 = param.x;
+  let x_104 : f32 = param_1.y;
+  let x_107 : f32 = param_1.x;
+  let x_109 : f32 = param.y;
+  let x_111 : f32 = ((x_102 * x_104) - (x_107 * x_109));
+  x_80 = x_111;
+  let x_112 : f32 = *(x_81);
+  let x_113 : f32 = *(x_92);
+  let x_115 : f32 = *(x_86);
+  let x_116 : f32 = *(x_96);
+  let x_119 : ptr<function, f32> = &((*(c)).x);
+  let x_120 : f32 = *(x_119);
+  let x_121 : f32 = *(x_92);
+  let x_123 : ptr<function, f32> = &((*(c)).y);
+  let x_124 : f32 = *(x_123);
+  let x_125 : f32 = *(x_96);
+  param_2 = vec2<f32>((x_112 - x_113), (x_115 - x_116));
+  param_3 = vec2<f32>((x_120 - x_121), (x_124 - x_125));
+  let x_129 : f32 = param_2.x;
+  let x_131 : f32 = param_3.y;
+  let x_134 : f32 = param_3.x;
+  let x_136 : f32 = param_2.y;
+  let x_138 : f32 = ((x_129 * x_131) - (x_134 * x_136));
+  x_79 = x_138;
+  let x_139 : bool = (x_111 < 0.0);
+  let x_141 : bool = (x_139 && (x_138 < 0.0));
+  x_148_phi = x_141;
+  if (!(x_141)) {
+    x_147 = ((x_111 >= 0.0) && (x_138 >= 0.0));
+    x_148_phi = x_147;
+  }
+  var x_153_phi : i32;
+  let x_148 : bool = x_148_phi;
+  if (!(x_148)) {
+    x_153_phi = 0;
+    loop {
+      var x_154 : i32;
+      var x_164_phi : i32;
+      let x_153 : i32 = x_153_phi;
+      let x_159 : f32 = x_11.injectionSwitch.y;
+      let x_160 : i32 = i32(x_159);
+      if ((x_153 < x_160)) {
+      } else {
+        break;
+      }
+      x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+      x_164_phi = 0;
+      loop {
+        var x_165 : i32;
+        let x_164 : i32 = x_164_phi;
+        if ((x_164 < x_160)) {
+        } else {
+          break;
+        }
+        x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+
+        continuing {
+          x_165 = (x_164 + 1);
+          x_164_phi = x_165;
+        }
+      }
+
+      continuing {
+        x_154 = (x_153 + 1);
+        x_153_phi = x_154;
+      }
+    }
+    return 0;
+  }
+  let x_171 : f32 = *(x_81);
+  let x_172 : f32 = *(x_119);
+  let x_174 : f32 = *(x_86);
+  let x_175 : f32 = *(x_123);
+  let x_178 : f32 = *(x_83);
+  let x_179 : f32 = *(x_119);
+  let x_181 : f32 = *(x_88);
+  let x_182 : f32 = *(x_123);
+  param_4 = vec2<f32>((x_171 - x_172), (x_174 - x_175));
+  param_5 = vec2<f32>((x_178 - x_179), (x_181 - x_182));
+  let x_186 : f32 = param_4.x;
+  let x_188 : f32 = param_5.y;
+  let x_191 : f32 = param_5.x;
+  let x_193 : f32 = param_4.y;
+  let x_195 : f32 = ((x_186 * x_188) - (x_191 * x_193));
+  x_78 = x_195;
+  let x_197 : bool = (x_139 && (x_195 < 0.0));
+  x_204_phi = x_197;
+  if (!(x_197)) {
+    x_203 = ((x_111 >= 0.0) && (x_195 >= 0.0));
+    x_204_phi = x_203;
+  }
+  let x_204 : bool = x_204_phi;
+  if (!(x_204)) {
+    return 0;
+  }
+  return 1;
+}
+
+fn main_1() {
+  var param_6 : vec2<f32>;
+  var param_7 : vec2<f32>;
+  var param_8 : vec2<f32>;
+  var param_9 : vec2<f32>;
+  let x_60 : vec4<f32> = gl_FragCoord;
+  let x_63 : vec2<f32> = x_19.resolution;
+  param_6 = (vec2<f32>(x_60.x, x_60.y) / x_63);
+  param_7 = vec2<f32>(0.699999988, 0.300000012);
+  param_8 = vec2<f32>(0.5, 0.899999976);
+  param_9 = vec2<f32>(0.100000001, 0.400000006);
+  let x_65 : i32 = pointInTriangle_vf2_vf2_vf2_vf2_(&(param_6), &(param_7), &(param_8), &(param_9));
+  if ((x_65 == 1)) {
+    let x_71 : f32 = x_11.injectionSwitch.y;
+    let x_73 : f32 = x_11.injectionSwitch.x;
+    if ((x_71 >= x_73)) {
+      x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    }
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..1e6b252
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.wgsl.expected.hlsl
@@ -0,0 +1,183 @@
+cbuffer cbuffer_x_11 : register(b1, space0) {
+  uint4 x_11[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_19 : register(b0, space0) {
+  uint4 x_19[1];
+};
+
+int pointInTriangle_vf2_vf2_vf2_vf2_(inout float2 p, inout float2 a, inout float2 b, inout float2 c) {
+  float x_78 = 0.0f;
+  float x_79 = 0.0f;
+  float x_80 = 0.0f;
+  float2 param = float2(0.0f, 0.0f);
+  float2 param_1 = float2(0.0f, 0.0f);
+  float2 param_2 = float2(0.0f, 0.0f);
+  float2 param_3 = float2(0.0f, 0.0f);
+  float2 param_4 = float2(0.0f, 0.0f);
+  float2 param_5 = float2(0.0f, 0.0f);
+  bool x_147 = false;
+  bool x_203 = false;
+  bool x_148_phi = false;
+  bool x_204_phi = false;
+  const float x_82 = p.x;
+  const float x_84 = a.x;
+  const float x_87 = p.y;
+  const float x_89 = a.y;
+  const float x_93 = b.x;
+  const float x_94 = a.x;
+  const float x_97 = b.y;
+  const float x_98 = a.y;
+  param = float2((x_82 - x_84), (x_87 - x_89));
+  param_1 = float2((x_93 - x_94), (x_97 - x_98));
+  const float x_102 = param.x;
+  const float x_104 = param_1.y;
+  const float x_107 = param_1.x;
+  const float x_109 = param.y;
+  const float x_111 = ((x_102 * x_104) - (x_107 * x_109));
+  x_80 = x_111;
+  const float x_112 = p.x;
+  const float x_113 = b.x;
+  const float x_115 = p.y;
+  const float x_116 = b.y;
+  const float x_120 = c.x;
+  const float x_121 = b.x;
+  const float x_124 = c.y;
+  const float x_125 = b.y;
+  param_2 = float2((x_112 - x_113), (x_115 - x_116));
+  param_3 = float2((x_120 - x_121), (x_124 - x_125));
+  const float x_129 = param_2.x;
+  const float x_131 = param_3.y;
+  const float x_134 = param_3.x;
+  const float x_136 = param_2.y;
+  const float x_138 = ((x_129 * x_131) - (x_134 * x_136));
+  x_79 = x_138;
+  const bool x_139 = (x_111 < 0.0f);
+  bool tint_tmp = x_139;
+  if (tint_tmp) {
+    tint_tmp = (x_138 < 0.0f);
+  }
+  const bool x_141 = (tint_tmp);
+  x_148_phi = x_141;
+  if (!(x_141)) {
+    bool tint_tmp_1 = (x_111 >= 0.0f);
+    if (tint_tmp_1) {
+      tint_tmp_1 = (x_138 >= 0.0f);
+    }
+    x_147 = (tint_tmp_1);
+    x_148_phi = x_147;
+  }
+  int x_153_phi = 0;
+  if (!(x_148_phi)) {
+    x_153_phi = 0;
+    while (true) {
+      int x_154 = 0;
+      int x_164_phi = 0;
+      const int x_153 = x_153_phi;
+      const float x_159 = asfloat(x_11[0].y);
+      const int x_160 = int(x_159);
+      if ((x_153 < x_160)) {
+      } else {
+        break;
+      }
+      x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+      x_164_phi = 0;
+      while (true) {
+        int x_165 = 0;
+        const int x_164 = x_164_phi;
+        if ((x_164 < x_160)) {
+        } else {
+          break;
+        }
+        x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+        {
+          x_165 = (x_164 + 1);
+          x_164_phi = x_165;
+        }
+      }
+      {
+        x_154 = (x_153 + 1);
+        x_153_phi = x_154;
+      }
+    }
+    return 0;
+  }
+  const float x_171 = p.x;
+  const float x_172 = c.x;
+  const float x_174 = p.y;
+  const float x_175 = c.y;
+  const float x_178 = a.x;
+  const float x_179 = c.x;
+  const float x_181 = a.y;
+  const float x_182 = c.y;
+  param_4 = float2((x_171 - x_172), (x_174 - x_175));
+  param_5 = float2((x_178 - x_179), (x_181 - x_182));
+  const float x_186 = param_4.x;
+  const float x_188 = param_5.y;
+  const float x_191 = param_5.x;
+  const float x_193 = param_4.y;
+  const float x_195 = ((x_186 * x_188) - (x_191 * x_193));
+  x_78 = x_195;
+  bool tint_tmp_2 = x_139;
+  if (tint_tmp_2) {
+    tint_tmp_2 = (x_195 < 0.0f);
+  }
+  const bool x_197 = (tint_tmp_2);
+  x_204_phi = x_197;
+  if (!(x_197)) {
+    bool tint_tmp_3 = (x_111 >= 0.0f);
+    if (tint_tmp_3) {
+      tint_tmp_3 = (x_195 >= 0.0f);
+    }
+    x_203 = (tint_tmp_3);
+    x_204_phi = x_203;
+  }
+  if (!(x_204_phi)) {
+    return 0;
+  }
+  return 1;
+}
+
+void main_1() {
+  float2 param_6 = float2(0.0f, 0.0f);
+  float2 param_7 = float2(0.0f, 0.0f);
+  float2 param_8 = float2(0.0f, 0.0f);
+  float2 param_9 = float2(0.0f, 0.0f);
+  const float4 x_60 = gl_FragCoord;
+  const float2 x_63 = asfloat(x_19[0].xy);
+  param_6 = (float2(x_60.x, x_60.y) / x_63);
+  param_7 = float2(0.699999988f, 0.300000012f);
+  param_8 = float2(0.5f, 0.899999976f);
+  param_9 = float2(0.100000001f, 0.400000006f);
+  const int x_65 = pointInTriangle_vf2_vf2_vf2_vf2_(param_6, param_7, param_8, param_9);
+  if ((x_65 == 1)) {
+    const float x_71 = asfloat(x_11[0].y);
+    const float x_73 = asfloat(x_11[0].x);
+    if ((x_71 >= x_73)) {
+      x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    }
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.wgsl.expected.msl
new file mode 100644
index 0000000..6537e89
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.wgsl.expected.msl
@@ -0,0 +1,168 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf1 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int pointInTriangle_vf2_vf2_vf2_vf2_(constant buf1& x_11, thread float2* const p, thread float2* const a, thread float2* const b, thread float2* const c, thread float4* const tint_symbol_5) {
+  float x_78 = 0.0f;
+  float x_79 = 0.0f;
+  float x_80 = 0.0f;
+  float2 param = 0.0f;
+  float2 param_1 = 0.0f;
+  float2 param_2 = 0.0f;
+  float2 param_3 = 0.0f;
+  float2 param_4 = 0.0f;
+  float2 param_5 = 0.0f;
+  bool x_147 = false;
+  bool x_203 = false;
+  bool x_148_phi = false;
+  bool x_204_phi = false;
+  float const x_82 = (*(p)).x;
+  float const x_84 = (*(a)).x;
+  float const x_87 = (*(p)).y;
+  float const x_89 = (*(a)).y;
+  float const x_93 = (*(b)).x;
+  float const x_94 = (*(a)).x;
+  float const x_97 = (*(b)).y;
+  float const x_98 = (*(a)).y;
+  param = float2((x_82 - x_84), (x_87 - x_89));
+  param_1 = float2((x_93 - x_94), (x_97 - x_98));
+  float const x_102 = param.x;
+  float const x_104 = param_1.y;
+  float const x_107 = param_1.x;
+  float const x_109 = param.y;
+  float const x_111 = ((x_102 * x_104) - (x_107 * x_109));
+  x_80 = x_111;
+  float const x_112 = (*(p)).x;
+  float const x_113 = (*(b)).x;
+  float const x_115 = (*(p)).y;
+  float const x_116 = (*(b)).y;
+  float const x_120 = (*(c)).x;
+  float const x_121 = (*(b)).x;
+  float const x_124 = (*(c)).y;
+  float const x_125 = (*(b)).y;
+  param_2 = float2((x_112 - x_113), (x_115 - x_116));
+  param_3 = float2((x_120 - x_121), (x_124 - x_125));
+  float const x_129 = param_2.x;
+  float const x_131 = param_3.y;
+  float const x_134 = param_3.x;
+  float const x_136 = param_2.y;
+  float const x_138 = ((x_129 * x_131) - (x_134 * x_136));
+  x_79 = x_138;
+  bool const x_139 = (x_111 < 0.0f);
+  bool const x_141 = (x_139 && (x_138 < 0.0f));
+  x_148_phi = x_141;
+  if (!(x_141)) {
+    x_147 = ((x_111 >= 0.0f) && (x_138 >= 0.0f));
+    x_148_phi = x_147;
+  }
+  int x_153_phi = 0;
+  bool const x_148 = x_148_phi;
+  if (!(x_148)) {
+    x_153_phi = 0;
+    while (true) {
+      int x_154 = 0;
+      int x_164_phi = 0;
+      int const x_153 = x_153_phi;
+      float const x_159 = x_11.injectionSwitch.y;
+      int const x_160 = int(x_159);
+      if ((x_153 < x_160)) {
+      } else {
+        break;
+      }
+      *(tint_symbol_5) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+      x_164_phi = 0;
+      while (true) {
+        int x_165 = 0;
+        int const x_164 = x_164_phi;
+        if ((x_164 < x_160)) {
+        } else {
+          break;
+        }
+        *(tint_symbol_5) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+        {
+          x_165 = (x_164 + 1);
+          x_164_phi = x_165;
+        }
+      }
+      {
+        x_154 = (x_153 + 1);
+        x_153_phi = x_154;
+      }
+    }
+    return 0;
+  }
+  float const x_171 = (*(p)).x;
+  float const x_172 = (*(c)).x;
+  float const x_174 = (*(p)).y;
+  float const x_175 = (*(c)).y;
+  float const x_178 = (*(a)).x;
+  float const x_179 = (*(c)).x;
+  float const x_181 = (*(a)).y;
+  float const x_182 = (*(c)).y;
+  param_4 = float2((x_171 - x_172), (x_174 - x_175));
+  param_5 = float2((x_178 - x_179), (x_181 - x_182));
+  float const x_186 = param_4.x;
+  float const x_188 = param_5.y;
+  float const x_191 = param_5.x;
+  float const x_193 = param_4.y;
+  float const x_195 = ((x_186 * x_188) - (x_191 * x_193));
+  x_78 = x_195;
+  bool const x_197 = (x_139 && (x_195 < 0.0f));
+  x_204_phi = x_197;
+  if (!(x_197)) {
+    x_203 = ((x_111 >= 0.0f) && (x_195 >= 0.0f));
+    x_204_phi = x_203;
+  }
+  bool const x_204 = x_204_phi;
+  if (!(x_204)) {
+    return 0;
+  }
+  return 1;
+}
+
+void main_1(constant buf0& x_19, constant buf1& x_11, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  float2 param_6 = 0.0f;
+  float2 param_7 = 0.0f;
+  float2 param_8 = 0.0f;
+  float2 param_9 = 0.0f;
+  float4 const x_60 = *(tint_symbol_6);
+  float2 const x_63 = x_19.resolution;
+  param_6 = (float2(x_60.x, x_60.y) / x_63);
+  param_7 = float2(0.699999988f, 0.300000012f);
+  param_8 = float2(0.5f, 0.899999976f);
+  param_9 = float2(0.100000001f, 0.400000006f);
+  int const x_65 = pointInTriangle_vf2_vf2_vf2_vf2_(x_11, &(param_6), &(param_7), &(param_8), &(param_9), tint_symbol_7);
+  if ((x_65 == 1)) {
+    float const x_71 = x_11.injectionSwitch.y;
+    float const x_73 = x_11.injectionSwitch.x;
+    if ((x_71 >= x_73)) {
+      *(tint_symbol_7) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    }
+  } else {
+    *(tint_symbol_7) = float4(0.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_19 [[buffer(0)]], constant buf1& x_11 [[buffer(1)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_19, x_11, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..8e4e6fc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.wgsl.expected.spvasm
@@ -0,0 +1,423 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 300
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "injectionSwitch"
+               OpName %x_11 "x_11"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "resolution"
+               OpName %x_19 "x_19"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %pointInTriangle_vf2_vf2_vf2_vf2_ "pointInTriangle_vf2_vf2_vf2_vf2_"
+               OpName %p "p"
+               OpName %a "a"
+               OpName %b "b"
+               OpName %c "c"
+               OpName %x_78 "x_78"
+               OpName %x_79 "x_79"
+               OpName %x_80 "x_80"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %param_4 "param_4"
+               OpName %param_5 "param_5"
+               OpName %x_147 "x_147"
+               OpName %x_203 "x_203"
+               OpName %x_148_phi "x_148_phi"
+               OpName %x_204_phi "x_204_phi"
+               OpName %x_153_phi "x_153_phi"
+               OpName %x_154 "x_154"
+               OpName %x_164_phi "x_164_phi"
+               OpName %x_165 "x_165"
+               OpName %main_1 "main_1"
+               OpName %param_6 "param_6"
+               OpName %param_7 "param_7"
+               OpName %param_8 "param_8"
+               OpName %param_9 "param_9"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_11 NonWritable
+               OpDecorate %x_11 DescriptorSet 0
+               OpDecorate %x_11 Binding 1
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_19 NonWritable
+               OpDecorate %x_19 DescriptorSet 0
+               OpDecorate %x_19 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_11 = OpVariable %_ptr_Uniform_buf1 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_19 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+        %int = OpTypeInt 32 1
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %18 = OpTypeFunction %int %_ptr_Function_v2float %_ptr_Function_v2float %_ptr_Function_v2float %_ptr_Function_v2float
+%_ptr_Function_float = OpTypePointer Function %float
+         %29 = OpConstantNull %float
+         %33 = OpConstantNull %v2float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %42 = OpConstantNull %bool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+    %float_0 = OpConstant %float 0
+%_ptr_Function_int = OpTypePointer Function %int
+        %148 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+        %170 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+      %int_1 = OpConstant %int 1
+       %void = OpTypeVoid
+        %244 = OpTypeFunction %void
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+%float_0_699999988 = OpConstant %float 0.699999988
+%float_0_300000012 = OpConstant %float 0.300000012
+        %262 = OpConstantComposite %v2float %float_0_699999988 %float_0_300000012
+  %float_0_5 = OpConstant %float 0.5
+%float_0_899999976 = OpConstant %float 0.899999976
+        %265 = OpConstantComposite %v2float %float_0_5 %float_0_899999976
+%float_0_100000001 = OpConstant %float 0.100000001
+%float_0_400000006 = OpConstant %float 0.400000006
+        %268 = OpConstantComposite %v2float %float_0_100000001 %float_0_400000006
+        %285 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %286 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %287 = OpTypeFunction %void %main_out
+%pointInTriangle_vf2_vf2_vf2_vf2_ = OpFunction %int None %18
+          %p = OpFunctionParameter %_ptr_Function_v2float
+          %a = OpFunctionParameter %_ptr_Function_v2float
+          %b = OpFunctionParameter %_ptr_Function_v2float
+          %c = OpFunctionParameter %_ptr_Function_v2float
+         %26 = OpLabel
+       %x_78 = OpVariable %_ptr_Function_float Function %29
+       %x_79 = OpVariable %_ptr_Function_float Function %29
+       %x_80 = OpVariable %_ptr_Function_float Function %29
+      %param = OpVariable %_ptr_Function_v2float Function %33
+    %param_1 = OpVariable %_ptr_Function_v2float Function %33
+    %param_2 = OpVariable %_ptr_Function_v2float Function %33
+    %param_3 = OpVariable %_ptr_Function_v2float Function %33
+    %param_4 = OpVariable %_ptr_Function_v2float Function %33
+    %param_5 = OpVariable %_ptr_Function_v2float Function %33
+      %x_147 = OpVariable %_ptr_Function_bool Function %42
+      %x_203 = OpVariable %_ptr_Function_bool Function %42
+  %x_148_phi = OpVariable %_ptr_Function_bool Function %42
+  %x_204_phi = OpVariable %_ptr_Function_bool Function %42
+  %x_153_phi = OpVariable %_ptr_Function_int Function %148
+      %x_154 = OpVariable %_ptr_Function_int Function %148
+  %x_164_phi = OpVariable %_ptr_Function_int Function %148
+      %x_165 = OpVariable %_ptr_Function_int Function %148
+         %49 = OpAccessChain %_ptr_Function_float %p %uint_0
+         %50 = OpLoad %float %49
+         %52 = OpAccessChain %_ptr_Function_float %a %uint_0
+         %53 = OpLoad %float %52
+         %56 = OpAccessChain %_ptr_Function_float %p %uint_1
+         %57 = OpLoad %float %56
+         %59 = OpAccessChain %_ptr_Function_float %a %uint_1
+         %60 = OpLoad %float %59
+         %62 = OpAccessChain %_ptr_Function_float %b %uint_0
+         %63 = OpLoad %float %62
+         %65 = OpAccessChain %_ptr_Function_float %a %uint_0
+         %66 = OpLoad %float %65
+         %68 = OpAccessChain %_ptr_Function_float %b %uint_1
+         %69 = OpLoad %float %68
+         %71 = OpAccessChain %_ptr_Function_float %a %uint_1
+         %72 = OpLoad %float %71
+         %73 = OpFSub %float %50 %53
+         %74 = OpFSub %float %57 %60
+         %75 = OpCompositeConstruct %v2float %73 %74
+               OpStore %param %75
+         %76 = OpFSub %float %63 %66
+         %77 = OpFSub %float %69 %72
+         %78 = OpCompositeConstruct %v2float %76 %77
+               OpStore %param_1 %78
+         %79 = OpAccessChain %_ptr_Function_float %param %uint_0
+         %80 = OpLoad %float %79
+         %81 = OpAccessChain %_ptr_Function_float %param_1 %uint_1
+         %82 = OpLoad %float %81
+         %83 = OpAccessChain %_ptr_Function_float %param_1 %uint_0
+         %84 = OpLoad %float %83
+         %85 = OpAccessChain %_ptr_Function_float %param %uint_1
+         %86 = OpLoad %float %85
+         %87 = OpFMul %float %80 %82
+         %88 = OpFMul %float %84 %86
+         %89 = OpFSub %float %87 %88
+               OpStore %x_80 %89
+         %91 = OpAccessChain %_ptr_Function_float %p %uint_0
+         %92 = OpLoad %float %91
+         %94 = OpAccessChain %_ptr_Function_float %b %uint_0
+         %95 = OpLoad %float %94
+         %97 = OpAccessChain %_ptr_Function_float %p %uint_1
+         %98 = OpLoad %float %97
+        %100 = OpAccessChain %_ptr_Function_float %b %uint_1
+        %101 = OpLoad %float %100
+        %103 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %104 = OpLoad %float %103
+        %106 = OpAccessChain %_ptr_Function_float %b %uint_0
+        %107 = OpLoad %float %106
+        %109 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %110 = OpLoad %float %109
+        %112 = OpAccessChain %_ptr_Function_float %b %uint_1
+        %113 = OpLoad %float %112
+        %114 = OpFSub %float %92 %95
+        %115 = OpFSub %float %98 %101
+        %116 = OpCompositeConstruct %v2float %114 %115
+               OpStore %param_2 %116
+        %117 = OpFSub %float %104 %107
+        %118 = OpFSub %float %110 %113
+        %119 = OpCompositeConstruct %v2float %117 %118
+               OpStore %param_3 %119
+        %120 = OpAccessChain %_ptr_Function_float %param_2 %uint_0
+        %121 = OpLoad %float %120
+        %122 = OpAccessChain %_ptr_Function_float %param_3 %uint_1
+        %123 = OpLoad %float %122
+        %124 = OpAccessChain %_ptr_Function_float %param_3 %uint_0
+        %125 = OpLoad %float %124
+        %126 = OpAccessChain %_ptr_Function_float %param_2 %uint_1
+        %127 = OpLoad %float %126
+        %128 = OpFMul %float %121 %123
+        %129 = OpFMul %float %125 %127
+        %130 = OpFSub %float %128 %129
+               OpStore %x_79 %130
+        %132 = OpFOrdLessThan %bool %89 %float_0
+               OpSelectionMerge %133 None
+               OpBranchConditional %132 %134 %133
+        %134 = OpLabel
+        %135 = OpFOrdLessThan %bool %130 %float_0
+               OpBranch %133
+        %133 = OpLabel
+        %136 = OpPhi %bool %132 %26 %135 %134
+               OpStore %x_148_phi %136
+        %137 = OpLogicalNot %bool %136
+               OpSelectionMerge %138 None
+               OpBranchConditional %137 %139 %138
+        %139 = OpLabel
+        %140 = OpFOrdGreaterThanEqual %bool %89 %float_0
+               OpSelectionMerge %141 None
+               OpBranchConditional %140 %142 %141
+        %142 = OpLabel
+        %143 = OpFOrdGreaterThanEqual %bool %130 %float_0
+               OpBranch %141
+        %141 = OpLabel
+        %144 = OpPhi %bool %140 %139 %143 %142
+               OpStore %x_147 %144
+        %145 = OpLoad %bool %x_147
+               OpStore %x_148_phi %145
+               OpBranch %138
+        %138 = OpLabel
+        %149 = OpLoad %bool %x_148_phi
+        %150 = OpLogicalNot %bool %149
+               OpSelectionMerge %151 None
+               OpBranchConditional %150 %152 %151
+        %152 = OpLabel
+               OpStore %x_153_phi %int_0
+               OpBranch %154
+        %154 = OpLabel
+               OpLoopMerge %155 %156 None
+               OpBranch %157
+        %157 = OpLabel
+        %160 = OpLoad %int %x_153_phi
+        %162 = OpAccessChain %_ptr_Uniform_float %x_11 %uint_0 %uint_1
+        %163 = OpLoad %float %162
+        %164 = OpConvertFToS %int %163
+        %165 = OpSLessThan %bool %160 %164
+               OpSelectionMerge %166 None
+               OpBranchConditional %165 %167 %168
+        %167 = OpLabel
+               OpBranch %166
+        %168 = OpLabel
+               OpBranch %155
+        %166 = OpLabel
+               OpStore %x_GLF_color %170
+               OpStore %x_164_phi %int_0
+               OpBranch %171
+        %171 = OpLabel
+               OpLoopMerge %172 %173 None
+               OpBranch %174
+        %174 = OpLabel
+        %176 = OpLoad %int %x_164_phi
+        %177 = OpSLessThan %bool %176 %164
+               OpSelectionMerge %178 None
+               OpBranchConditional %177 %179 %180
+        %179 = OpLabel
+               OpBranch %178
+        %180 = OpLabel
+               OpBranch %172
+        %178 = OpLabel
+               OpStore %x_GLF_color %170
+               OpBranch %173
+        %173 = OpLabel
+        %182 = OpIAdd %int %176 %int_1
+               OpStore %x_165 %182
+        %183 = OpLoad %int %x_165
+               OpStore %x_164_phi %183
+               OpBranch %171
+        %172 = OpLabel
+               OpBranch %156
+        %156 = OpLabel
+        %184 = OpIAdd %int %160 %int_1
+               OpStore %x_154 %184
+        %185 = OpLoad %int %x_154
+               OpStore %x_153_phi %185
+               OpBranch %154
+        %155 = OpLabel
+               OpReturnValue %int_0
+        %151 = OpLabel
+        %187 = OpAccessChain %_ptr_Function_float %p %uint_0
+        %188 = OpLoad %float %187
+        %190 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %191 = OpLoad %float %190
+        %193 = OpAccessChain %_ptr_Function_float %p %uint_1
+        %194 = OpLoad %float %193
+        %196 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %197 = OpLoad %float %196
+        %199 = OpAccessChain %_ptr_Function_float %a %uint_0
+        %200 = OpLoad %float %199
+        %202 = OpAccessChain %_ptr_Function_float %c %uint_0
+        %203 = OpLoad %float %202
+        %205 = OpAccessChain %_ptr_Function_float %a %uint_1
+        %206 = OpLoad %float %205
+        %208 = OpAccessChain %_ptr_Function_float %c %uint_1
+        %209 = OpLoad %float %208
+        %210 = OpFSub %float %188 %191
+        %211 = OpFSub %float %194 %197
+        %212 = OpCompositeConstruct %v2float %210 %211
+               OpStore %param_4 %212
+        %213 = OpFSub %float %200 %203
+        %214 = OpFSub %float %206 %209
+        %215 = OpCompositeConstruct %v2float %213 %214
+               OpStore %param_5 %215
+        %216 = OpAccessChain %_ptr_Function_float %param_4 %uint_0
+        %217 = OpLoad %float %216
+        %218 = OpAccessChain %_ptr_Function_float %param_5 %uint_1
+        %219 = OpLoad %float %218
+        %220 = OpAccessChain %_ptr_Function_float %param_5 %uint_0
+        %221 = OpLoad %float %220
+        %222 = OpAccessChain %_ptr_Function_float %param_4 %uint_1
+        %223 = OpLoad %float %222
+        %224 = OpFMul %float %217 %219
+        %225 = OpFMul %float %221 %223
+        %226 = OpFSub %float %224 %225
+               OpStore %x_78 %226
+               OpSelectionMerge %227 None
+               OpBranchConditional %132 %228 %227
+        %228 = OpLabel
+        %229 = OpFOrdLessThan %bool %226 %float_0
+               OpBranch %227
+        %227 = OpLabel
+        %230 = OpPhi %bool %132 %151 %229 %228
+               OpStore %x_204_phi %230
+        %231 = OpLogicalNot %bool %230
+               OpSelectionMerge %232 None
+               OpBranchConditional %231 %233 %232
+        %233 = OpLabel
+        %234 = OpFOrdGreaterThanEqual %bool %89 %float_0
+               OpSelectionMerge %235 None
+               OpBranchConditional %234 %236 %235
+        %236 = OpLabel
+        %237 = OpFOrdGreaterThanEqual %bool %226 %float_0
+               OpBranch %235
+        %235 = OpLabel
+        %238 = OpPhi %bool %234 %233 %237 %236
+               OpStore %x_203 %238
+        %239 = OpLoad %bool %x_203
+               OpStore %x_204_phi %239
+               OpBranch %232
+        %232 = OpLabel
+        %240 = OpLoad %bool %x_204_phi
+        %241 = OpLogicalNot %bool %240
+               OpSelectionMerge %242 None
+               OpBranchConditional %241 %243 %242
+        %243 = OpLabel
+               OpReturnValue %int_0
+        %242 = OpLabel
+               OpReturnValue %int_1
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %244
+        %247 = OpLabel
+    %param_6 = OpVariable %_ptr_Function_v2float Function %33
+    %param_7 = OpVariable %_ptr_Function_v2float Function %33
+    %param_8 = OpVariable %_ptr_Function_v2float Function %33
+    %param_9 = OpVariable %_ptr_Function_v2float Function %33
+        %252 = OpLoad %v4float %gl_FragCoord
+        %254 = OpAccessChain %_ptr_Uniform_v2float %x_19 %uint_0
+        %255 = OpLoad %v2float %254
+        %256 = OpCompositeExtract %float %252 0
+        %257 = OpCompositeExtract %float %252 1
+        %258 = OpCompositeConstruct %v2float %256 %257
+        %259 = OpFDiv %v2float %258 %255
+               OpStore %param_6 %259
+               OpStore %param_7 %262
+               OpStore %param_8 %265
+               OpStore %param_9 %268
+        %269 = OpFunctionCall %int %pointInTriangle_vf2_vf2_vf2_vf2_ %param_6 %param_7 %param_8 %param_9
+        %274 = OpIEqual %bool %269 %int_1
+               OpSelectionMerge %275 None
+               OpBranchConditional %274 %276 %277
+        %276 = OpLabel
+        %278 = OpAccessChain %_ptr_Uniform_float %x_11 %uint_0 %uint_1
+        %279 = OpLoad %float %278
+        %280 = OpAccessChain %_ptr_Uniform_float %x_11 %uint_0 %uint_0
+        %281 = OpLoad %float %280
+        %282 = OpFOrdGreaterThanEqual %bool %279 %281
+               OpSelectionMerge %283 None
+               OpBranchConditional %282 %284 %283
+        %284 = OpLabel
+               OpStore %x_GLF_color %285
+               OpBranch %283
+        %283 = OpLabel
+               OpBranch %275
+        %277 = OpLabel
+               OpStore %x_GLF_color %286
+               OpBranch %275
+        %275 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %287
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %291 = OpLabel
+        %292 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %292
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %244
+        %294 = OpLabel
+        %295 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %295
+        %296 = OpFunctionCall %void %main_1
+        %298 = OpLoad %v4float %x_GLF_color
+        %299 = OpCompositeConstruct %main_out %298
+        %297 = OpFunctionCall %void %tint_symbol_3 %299
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..c9e248c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.wgsl.expected.wgsl
@@ -0,0 +1,181 @@
+[[block]]
+struct buf1 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[block]]
+struct buf0 {
+  resolution : vec2<f32>;
+};
+
+[[group(0), binding(1)]] var<uniform> x_11 : buf1;
+
+var<private> x_GLF_color : vec4<f32>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_19 : buf0;
+
+fn pointInTriangle_vf2_vf2_vf2_vf2_(p : ptr<function, vec2<f32>>, a : ptr<function, vec2<f32>>, b : ptr<function, vec2<f32>>, c : ptr<function, vec2<f32>>) -> i32 {
+  var x_78 : f32;
+  var x_79 : f32;
+  var x_80 : f32;
+  var param : vec2<f32>;
+  var param_1 : vec2<f32>;
+  var param_2 : vec2<f32>;
+  var param_3 : vec2<f32>;
+  var param_4 : vec2<f32>;
+  var param_5 : vec2<f32>;
+  var x_147 : bool;
+  var x_203 : bool;
+  var x_148_phi : bool;
+  var x_204_phi : bool;
+  let x_81 : ptr<function, f32> = &((*(p)).x);
+  let x_82 : f32 = *(x_81);
+  let x_83 : ptr<function, f32> = &((*(a)).x);
+  let x_84 : f32 = *(x_83);
+  let x_86 : ptr<function, f32> = &((*(p)).y);
+  let x_87 : f32 = *(x_86);
+  let x_88 : ptr<function, f32> = &((*(a)).y);
+  let x_89 : f32 = *(x_88);
+  let x_92 : ptr<function, f32> = &((*(b)).x);
+  let x_93 : f32 = *(x_92);
+  let x_94 : f32 = *(x_83);
+  let x_96 : ptr<function, f32> = &((*(b)).y);
+  let x_97 : f32 = *(x_96);
+  let x_98 : f32 = *(x_88);
+  param = vec2<f32>((x_82 - x_84), (x_87 - x_89));
+  param_1 = vec2<f32>((x_93 - x_94), (x_97 - x_98));
+  let x_102 : f32 = param.x;
+  let x_104 : f32 = param_1.y;
+  let x_107 : f32 = param_1.x;
+  let x_109 : f32 = param.y;
+  let x_111 : f32 = ((x_102 * x_104) - (x_107 * x_109));
+  x_80 = x_111;
+  let x_112 : f32 = *(x_81);
+  let x_113 : f32 = *(x_92);
+  let x_115 : f32 = *(x_86);
+  let x_116 : f32 = *(x_96);
+  let x_119 : ptr<function, f32> = &((*(c)).x);
+  let x_120 : f32 = *(x_119);
+  let x_121 : f32 = *(x_92);
+  let x_123 : ptr<function, f32> = &((*(c)).y);
+  let x_124 : f32 = *(x_123);
+  let x_125 : f32 = *(x_96);
+  param_2 = vec2<f32>((x_112 - x_113), (x_115 - x_116));
+  param_3 = vec2<f32>((x_120 - x_121), (x_124 - x_125));
+  let x_129 : f32 = param_2.x;
+  let x_131 : f32 = param_3.y;
+  let x_134 : f32 = param_3.x;
+  let x_136 : f32 = param_2.y;
+  let x_138 : f32 = ((x_129 * x_131) - (x_134 * x_136));
+  x_79 = x_138;
+  let x_139 : bool = (x_111 < 0.0);
+  let x_141 : bool = (x_139 && (x_138 < 0.0));
+  x_148_phi = x_141;
+  if (!(x_141)) {
+    x_147 = ((x_111 >= 0.0) && (x_138 >= 0.0));
+    x_148_phi = x_147;
+  }
+  var x_153_phi : i32;
+  let x_148 : bool = x_148_phi;
+  if (!(x_148)) {
+    x_153_phi = 0;
+    loop {
+      var x_154 : i32;
+      var x_164_phi : i32;
+      let x_153 : i32 = x_153_phi;
+      let x_159 : f32 = x_11.injectionSwitch.y;
+      let x_160 : i32 = i32(x_159);
+      if ((x_153 < x_160)) {
+      } else {
+        break;
+      }
+      x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+      x_164_phi = 0;
+      loop {
+        var x_165 : i32;
+        let x_164 : i32 = x_164_phi;
+        if ((x_164 < x_160)) {
+        } else {
+          break;
+        }
+        x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+
+        continuing {
+          x_165 = (x_164 + 1);
+          x_164_phi = x_165;
+        }
+      }
+
+      continuing {
+        x_154 = (x_153 + 1);
+        x_153_phi = x_154;
+      }
+    }
+    return 0;
+  }
+  let x_171 : f32 = *(x_81);
+  let x_172 : f32 = *(x_119);
+  let x_174 : f32 = *(x_86);
+  let x_175 : f32 = *(x_123);
+  let x_178 : f32 = *(x_83);
+  let x_179 : f32 = *(x_119);
+  let x_181 : f32 = *(x_88);
+  let x_182 : f32 = *(x_123);
+  param_4 = vec2<f32>((x_171 - x_172), (x_174 - x_175));
+  param_5 = vec2<f32>((x_178 - x_179), (x_181 - x_182));
+  let x_186 : f32 = param_4.x;
+  let x_188 : f32 = param_5.y;
+  let x_191 : f32 = param_5.x;
+  let x_193 : f32 = param_4.y;
+  let x_195 : f32 = ((x_186 * x_188) - (x_191 * x_193));
+  x_78 = x_195;
+  let x_197 : bool = (x_139 && (x_195 < 0.0));
+  x_204_phi = x_197;
+  if (!(x_197)) {
+    x_203 = ((x_111 >= 0.0) && (x_195 >= 0.0));
+    x_204_phi = x_203;
+  }
+  let x_204 : bool = x_204_phi;
+  if (!(x_204)) {
+    return 0;
+  }
+  return 1;
+}
+
+fn main_1() {
+  var param_6 : vec2<f32>;
+  var param_7 : vec2<f32>;
+  var param_8 : vec2<f32>;
+  var param_9 : vec2<f32>;
+  let x_60 : vec4<f32> = gl_FragCoord;
+  let x_63 : vec2<f32> = x_19.resolution;
+  param_6 = (vec2<f32>(x_60.x, x_60.y) / x_63);
+  param_7 = vec2<f32>(0.699999988, 0.300000012);
+  param_8 = vec2<f32>(0.5, 0.899999976);
+  param_9 = vec2<f32>(0.100000001, 0.400000006);
+  let x_65 : i32 = pointInTriangle_vf2_vf2_vf2_vf2_(&(param_6), &(param_7), &(param_8), &(param_9));
+  if ((x_65 == 1)) {
+    let x_71 : f32 = x_11.injectionSwitch.y;
+    let x_73 : f32 = x_11.injectionSwitch.x;
+    if ((x_71 >= x_73)) {
+      x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    }
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-and-unreachable-infinite-loop/0.spvasm b/test/vk-gl-cts/graphicsfuzz/struct-and-unreachable-infinite-loop/0.spvasm
new file mode 100644
index 0000000..cca8b7a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-and-unreachable-infinite-loop/0.spvasm
@@ -0,0 +1,89 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %BST "BST"
+               OpMemberName %BST 0 "data"
+               OpMemberName %BST 1 "leftIndex"
+               OpMemberName %BST 2 "rightIndex"
+               OpName %makeTreeNode_struct_BST_i1_i1_i11_ "makeTreeNode(struct-BST-i1-i1-i11;"
+               OpName %tree "tree"
+               OpName %tree_0 "tree"
+               OpName %param "param"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %BST 0 RelaxedPrecision
+               OpMemberDecorate %BST 1 RelaxedPrecision
+               OpMemberDecorate %BST 2 RelaxedPrecision
+               OpDecorate %9 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %10 RelaxedPrecision
+               OpDecorate %11 RelaxedPrecision
+               OpDecorate %12 RelaxedPrecision
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+        %BST = OpTypeStruct %int %int %int
+%_ptr_Function_BST = OpTypePointer Function %BST
+         %17 = OpTypeFunction %void %_ptr_Function_BST
+      %int_2 = OpConstant %int 2
+      %int_1 = OpConstant %int 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_BST_uint_10 = OpTypeArray %BST %uint_10
+%_ptr_Private__arr_BST_uint_10 = OpTypePointer Private %_arr_BST_uint_10
+      %int_0 = OpConstant %int 0
+%_ptr_Private_BST = OpTypePointer Private %BST
+%_ptr_Private_int = OpTypePointer Private %int
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+%_ptr_Function__arr_BST_uint_10 = OpTypePointer Function %_arr_BST_uint_10
+       %main = OpFunction %void None %14
+         %36 = OpLabel
+     %tree_0 = OpVariable %_ptr_Function__arr_BST_uint_10 Function
+      %param = OpVariable %_ptr_Function_BST Function
+         %37 = OpLoad %_arr_BST_uint_10 %tree_0
+         %38 = OpCompositeExtract %BST %37 0
+               OpStore %param %38
+         %39 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_ %param
+         %40 = OpLoad %BST %param
+         %41 = OpLoad %_arr_BST_uint_10 %tree_0
+         %42 = OpCompositeInsert %_arr_BST_uint_10 %40 %41 0
+               OpStore %tree_0 %42
+         %43 = OpAccessChain %_ptr_Function_int %tree_0 %int_0 %int_2
+         %11 = OpLoad %_arr_BST_uint_10 %tree_0
+          %9 = OpCompositeExtract %int %11 0 2
+         %44 = OpIEqual %bool %9 %int_0
+               OpSelectionMerge %45 None
+               OpBranchConditional %44 %46 %45
+         %46 = OpLabel
+               OpBranch %47
+         %47 = OpLabel
+               OpLoopMerge %48 %47 None
+               OpBranch %47
+         %48 = OpLabel
+               OpUnreachable
+         %45 = OpLabel
+         %12 = OpLoad %_arr_BST_uint_10 %tree_0
+         %10 = OpCompositeExtract %int %12 0 2
+         %49 = OpConvertSToF %float %10
+         %50 = OpCompositeConstruct %v4float %49 %float_0 %float_0 %float_1
+               OpStore %_GLF_color %50
+               OpReturn
+               OpFunctionEnd
+%makeTreeNode_struct_BST_i1_i1_i11_ = OpFunction %void None %17
+       %tree = OpFunctionParameter %_ptr_Function_BST
+         %51 = OpLabel
+         %52 = OpAccessChain %_ptr_Function_int %tree %int_2
+               OpStore %52 %int_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-and-unreachable-infinite-loop/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/struct-and-unreachable-infinite-loop/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..f6f974f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-and-unreachable-infinite-loop/0.spvasm.expected.hlsl
@@ -0,0 +1,44 @@
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void makeTreeNode_struct_BST_i1_i1_i11_(inout BST tree) {
+  tree.rightIndex = 1;
+  return;
+}
+
+void main_1() {
+  BST tree_1[10] = (BST[10])0;
+  BST param = (BST)0;
+  param = tree_1[0u];
+  makeTreeNode_struct_BST_i1_i1_i11_(param);
+  const BST x_40 = param;
+  BST x_42_1[10] = tree_1;
+  x_42_1[0u] = x_40;
+  tree_1 = x_42_1;
+  if ((tree_1[0u].rightIndex == 0)) {
+    while (true) {
+    }
+    return;
+  }
+  x_GLF_color = float4(float(tree_1[0u].rightIndex), 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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-and-unreachable-infinite-loop/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/struct-and-unreachable-infinite-loop/0.spvasm.expected.msl
new file mode 100644
index 0000000..0c45980
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-and-unreachable-infinite-loop/0.spvasm.expected.msl
@@ -0,0 +1,54 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+struct tint_array_wrapper {
+  BST arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void makeTreeNode_struct_BST_i1_i1_i11_(thread BST* const tree) {
+  (*(tree)).rightIndex = 1;
+  return;
+}
+
+void main_1(thread float4* const tint_symbol_4) {
+  tint_array_wrapper tree_1 = {};
+  BST param = {};
+  tint_array_wrapper const x_37 = tree_1;
+  param = x_37.arr[0u];
+  makeTreeNode_struct_BST_i1_i1_i11_(&(param));
+  BST const x_40 = param;
+  tint_array_wrapper const x_41 = tree_1;
+  tint_array_wrapper x_42_1 = x_41;
+  x_42_1.arr[0u] = x_40;
+  tint_array_wrapper const x_42 = x_42_1;
+  tree_1 = x_42;
+  tint_array_wrapper const x_11 = tree_1;
+  if ((x_11.arr[0u].rightIndex == 0)) {
+    while (true) {
+    }
+    return;
+  }
+  tint_array_wrapper const x_12 = tree_1;
+  *(tint_symbol_4) = float4(float(x_12.arr[0u].rightIndex), 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-and-unreachable-infinite-loop/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/struct-and-unreachable-infinite-loop/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..902b81d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-and-unreachable-infinite-loop/0.spvasm.expected.spvasm
@@ -0,0 +1,125 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 73
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %BST "BST"
+               OpMemberName %BST 0 "data"
+               OpMemberName %BST 1 "leftIndex"
+               OpMemberName %BST 2 "rightIndex"
+               OpName %makeTreeNode_struct_BST_i1_i1_i11_ "makeTreeNode_struct_BST_i1_i1_i11_"
+               OpName %tree "tree"
+               OpName %main_1 "main_1"
+               OpName %tree_1 "tree_1"
+               OpName %param "param"
+               OpName %x_42_1 "x_42_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %BST 0 Offset 0
+               OpMemberDecorate %BST 1 Offset 4
+               OpMemberDecorate %BST 2 Offset 8
+               OpDecorate %_arr_BST_uint_10 ArrayStride 12
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+        %int = OpTypeInt 32 1
+        %BST = OpTypeStruct %int %int %int
+%_ptr_Function_BST = OpTypePointer Function %BST
+          %8 = OpTypeFunction %void %_ptr_Function_BST
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+         %22 = OpTypeFunction %void
+    %uint_10 = OpConstant %uint 10
+%_arr_BST_uint_10 = OpTypeArray %BST %uint_10
+%_ptr_Function__arr_BST_uint_10 = OpTypePointer Function %_arr_BST_uint_10
+         %29 = OpConstantNull %_arr_BST_uint_10
+         %31 = OpConstantNull %BST
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+         %61 = OpTypeFunction %void %main_out
+%makeTreeNode_struct_BST_i1_i1_i11_ = OpFunction %void None %8
+       %tree = OpFunctionParameter %_ptr_Function_BST
+         %15 = OpLabel
+         %20 = OpAccessChain %_ptr_Function_int %tree %uint_2
+               OpStore %20 %int_1
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %22
+         %24 = OpLabel
+     %tree_1 = OpVariable %_ptr_Function__arr_BST_uint_10 Function %29
+      %param = OpVariable %_ptr_Function_BST Function %31
+     %x_42_1 = OpVariable %_ptr_Function__arr_BST_uint_10 Function %29
+         %32 = OpLoad %_arr_BST_uint_10 %tree_1
+         %34 = OpCompositeExtract %BST %32 0
+               OpStore %param %34
+         %35 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_ %param
+         %37 = OpLoad %BST %param
+         %38 = OpLoad %_arr_BST_uint_10 %tree_1
+               OpStore %x_42_1 %38
+         %40 = OpAccessChain %_ptr_Function_BST %x_42_1 %uint_0
+               OpStore %40 %37
+         %41 = OpLoad %_arr_BST_uint_10 %x_42_1
+               OpStore %tree_1 %41
+         %42 = OpLoad %_arr_BST_uint_10 %tree_1
+         %43 = OpCompositeExtract %BST %42 0
+         %44 = OpCompositeExtract %int %43 2
+         %46 = OpIEqual %bool %44 %int_0
+               OpSelectionMerge %48 None
+               OpBranchConditional %46 %49 %48
+         %49 = OpLabel
+               OpBranch %50
+         %50 = OpLabel
+               OpLoopMerge %51 %52 None
+               OpBranch %53
+         %53 = OpLabel
+               OpBranch %52
+         %52 = OpLabel
+               OpBranch %50
+         %51 = OpLabel
+               OpReturn
+         %48 = OpLabel
+         %54 = OpLoad %_arr_BST_uint_10 %tree_1
+         %56 = OpCompositeExtract %BST %54 0
+         %57 = OpCompositeExtract %int %56 2
+         %55 = OpConvertSToF %float %57
+         %60 = OpCompositeConstruct %v4float %55 %float_0 %float_0 %float_1
+               OpStore %x_GLF_color %60
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %61
+%tint_symbol = OpFunctionParameter %main_out
+         %65 = OpLabel
+         %66 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %66
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %22
+         %68 = OpLabel
+         %69 = OpFunctionCall %void %main_1
+         %71 = OpLoad %v4float %x_GLF_color
+         %72 = OpCompositeConstruct %main_out %71
+         %70 = OpFunctionCall %void %tint_symbol_2 %72
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-and-unreachable-infinite-loop/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/struct-and-unreachable-infinite-loop/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..974581d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-and-unreachable-infinite-loop/0.spvasm.expected.wgsl
@@ -0,0 +1,47 @@
+struct BST {
+  data : i32;
+  leftIndex : i32;
+  rightIndex : i32;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn makeTreeNode_struct_BST_i1_i1_i11_(tree : ptr<function, BST>) {
+  (*(tree)).rightIndex = 1;
+  return;
+}
+
+fn main_1() {
+  var tree_1 : array<BST, 10>;
+  var param : BST;
+  let x_37 : array<BST, 10> = tree_1;
+  param = x_37[0u];
+  makeTreeNode_struct_BST_i1_i1_i11_(&(param));
+  let x_40 : BST = param;
+  let x_41 : array<BST, 10> = tree_1;
+  var x_42_1 : array<BST, 10> = x_41;
+  x_42_1[0u] = x_40;
+  let x_42 : array<BST, 10> = x_42_1;
+  tree_1 = x_42;
+  let x_43 : ptr<function, i32> = &(tree_1[0].rightIndex);
+  let x_11 : array<BST, 10> = tree_1;
+  if ((x_11[0u].rightIndex == 0)) {
+    loop {
+    }
+    return;
+  }
+  let x_12 : array<BST, 10> = tree_1;
+  x_GLF_color = vec4<f32>(f32(x_12[0u].rightIndex), 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-and-unreachable-infinite-loop/0.wgsl b/test/vk-gl-cts/graphicsfuzz/struct-and-unreachable-infinite-loop/0.wgsl
new file mode 100644
index 0000000..974581d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-and-unreachable-infinite-loop/0.wgsl
@@ -0,0 +1,47 @@
+struct BST {
+  data : i32;
+  leftIndex : i32;
+  rightIndex : i32;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn makeTreeNode_struct_BST_i1_i1_i11_(tree : ptr<function, BST>) {
+  (*(tree)).rightIndex = 1;
+  return;
+}
+
+fn main_1() {
+  var tree_1 : array<BST, 10>;
+  var param : BST;
+  let x_37 : array<BST, 10> = tree_1;
+  param = x_37[0u];
+  makeTreeNode_struct_BST_i1_i1_i11_(&(param));
+  let x_40 : BST = param;
+  let x_41 : array<BST, 10> = tree_1;
+  var x_42_1 : array<BST, 10> = x_41;
+  x_42_1[0u] = x_40;
+  let x_42 : array<BST, 10> = x_42_1;
+  tree_1 = x_42;
+  let x_43 : ptr<function, i32> = &(tree_1[0].rightIndex);
+  let x_11 : array<BST, 10> = tree_1;
+  if ((x_11[0u].rightIndex == 0)) {
+    loop {
+    }
+    return;
+  }
+  let x_12 : array<BST, 10> = tree_1;
+  x_GLF_color = vec4<f32>(f32(x_12[0u].rightIndex), 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-and-unreachable-infinite-loop/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/struct-and-unreachable-infinite-loop/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..f6f974f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-and-unreachable-infinite-loop/0.wgsl.expected.hlsl
@@ -0,0 +1,44 @@
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void makeTreeNode_struct_BST_i1_i1_i11_(inout BST tree) {
+  tree.rightIndex = 1;
+  return;
+}
+
+void main_1() {
+  BST tree_1[10] = (BST[10])0;
+  BST param = (BST)0;
+  param = tree_1[0u];
+  makeTreeNode_struct_BST_i1_i1_i11_(param);
+  const BST x_40 = param;
+  BST x_42_1[10] = tree_1;
+  x_42_1[0u] = x_40;
+  tree_1 = x_42_1;
+  if ((tree_1[0u].rightIndex == 0)) {
+    while (true) {
+    }
+    return;
+  }
+  x_GLF_color = float4(float(tree_1[0u].rightIndex), 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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-and-unreachable-infinite-loop/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/struct-and-unreachable-infinite-loop/0.wgsl.expected.msl
new file mode 100644
index 0000000..0c45980
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-and-unreachable-infinite-loop/0.wgsl.expected.msl
@@ -0,0 +1,54 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+struct tint_array_wrapper {
+  BST arr[10];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void makeTreeNode_struct_BST_i1_i1_i11_(thread BST* const tree) {
+  (*(tree)).rightIndex = 1;
+  return;
+}
+
+void main_1(thread float4* const tint_symbol_4) {
+  tint_array_wrapper tree_1 = {};
+  BST param = {};
+  tint_array_wrapper const x_37 = tree_1;
+  param = x_37.arr[0u];
+  makeTreeNode_struct_BST_i1_i1_i11_(&(param));
+  BST const x_40 = param;
+  tint_array_wrapper const x_41 = tree_1;
+  tint_array_wrapper x_42_1 = x_41;
+  x_42_1.arr[0u] = x_40;
+  tint_array_wrapper const x_42 = x_42_1;
+  tree_1 = x_42;
+  tint_array_wrapper const x_11 = tree_1;
+  if ((x_11.arr[0u].rightIndex == 0)) {
+    while (true) {
+    }
+    return;
+  }
+  tint_array_wrapper const x_12 = tree_1;
+  *(tint_symbol_4) = float4(float(x_12.arr[0u].rightIndex), 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-and-unreachable-infinite-loop/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/struct-and-unreachable-infinite-loop/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..902b81d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-and-unreachable-infinite-loop/0.wgsl.expected.spvasm
@@ -0,0 +1,125 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 73
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %BST "BST"
+               OpMemberName %BST 0 "data"
+               OpMemberName %BST 1 "leftIndex"
+               OpMemberName %BST 2 "rightIndex"
+               OpName %makeTreeNode_struct_BST_i1_i1_i11_ "makeTreeNode_struct_BST_i1_i1_i11_"
+               OpName %tree "tree"
+               OpName %main_1 "main_1"
+               OpName %tree_1 "tree_1"
+               OpName %param "param"
+               OpName %x_42_1 "x_42_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %BST 0 Offset 0
+               OpMemberDecorate %BST 1 Offset 4
+               OpMemberDecorate %BST 2 Offset 8
+               OpDecorate %_arr_BST_uint_10 ArrayStride 12
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+        %int = OpTypeInt 32 1
+        %BST = OpTypeStruct %int %int %int
+%_ptr_Function_BST = OpTypePointer Function %BST
+          %8 = OpTypeFunction %void %_ptr_Function_BST
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+         %22 = OpTypeFunction %void
+    %uint_10 = OpConstant %uint 10
+%_arr_BST_uint_10 = OpTypeArray %BST %uint_10
+%_ptr_Function__arr_BST_uint_10 = OpTypePointer Function %_arr_BST_uint_10
+         %29 = OpConstantNull %_arr_BST_uint_10
+         %31 = OpConstantNull %BST
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+         %61 = OpTypeFunction %void %main_out
+%makeTreeNode_struct_BST_i1_i1_i11_ = OpFunction %void None %8
+       %tree = OpFunctionParameter %_ptr_Function_BST
+         %15 = OpLabel
+         %20 = OpAccessChain %_ptr_Function_int %tree %uint_2
+               OpStore %20 %int_1
+               OpReturn
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %22
+         %24 = OpLabel
+     %tree_1 = OpVariable %_ptr_Function__arr_BST_uint_10 Function %29
+      %param = OpVariable %_ptr_Function_BST Function %31
+     %x_42_1 = OpVariable %_ptr_Function__arr_BST_uint_10 Function %29
+         %32 = OpLoad %_arr_BST_uint_10 %tree_1
+         %34 = OpCompositeExtract %BST %32 0
+               OpStore %param %34
+         %35 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_ %param
+         %37 = OpLoad %BST %param
+         %38 = OpLoad %_arr_BST_uint_10 %tree_1
+               OpStore %x_42_1 %38
+         %40 = OpAccessChain %_ptr_Function_BST %x_42_1 %uint_0
+               OpStore %40 %37
+         %41 = OpLoad %_arr_BST_uint_10 %x_42_1
+               OpStore %tree_1 %41
+         %42 = OpLoad %_arr_BST_uint_10 %tree_1
+         %43 = OpCompositeExtract %BST %42 0
+         %44 = OpCompositeExtract %int %43 2
+         %46 = OpIEqual %bool %44 %int_0
+               OpSelectionMerge %48 None
+               OpBranchConditional %46 %49 %48
+         %49 = OpLabel
+               OpBranch %50
+         %50 = OpLabel
+               OpLoopMerge %51 %52 None
+               OpBranch %53
+         %53 = OpLabel
+               OpBranch %52
+         %52 = OpLabel
+               OpBranch %50
+         %51 = OpLabel
+               OpReturn
+         %48 = OpLabel
+         %54 = OpLoad %_arr_BST_uint_10 %tree_1
+         %56 = OpCompositeExtract %BST %54 0
+         %57 = OpCompositeExtract %int %56 2
+         %55 = OpConvertSToF %float %57
+         %60 = OpCompositeConstruct %v4float %55 %float_0 %float_0 %float_1
+               OpStore %x_GLF_color %60
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %61
+%tint_symbol = OpFunctionParameter %main_out
+         %65 = OpLabel
+         %66 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %66
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %22
+         %68 = OpLabel
+         %69 = OpFunctionCall %void %main_1
+         %71 = OpLoad %v4float %x_GLF_color
+         %72 = OpCompositeConstruct %main_out %71
+         %70 = OpFunctionCall %void %tint_symbol_2 %72
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-and-unreachable-infinite-loop/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/struct-and-unreachable-infinite-loop/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..974581d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-and-unreachable-infinite-loop/0.wgsl.expected.wgsl
@@ -0,0 +1,47 @@
+struct BST {
+  data : i32;
+  leftIndex : i32;
+  rightIndex : i32;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn makeTreeNode_struct_BST_i1_i1_i11_(tree : ptr<function, BST>) {
+  (*(tree)).rightIndex = 1;
+  return;
+}
+
+fn main_1() {
+  var tree_1 : array<BST, 10>;
+  var param : BST;
+  let x_37 : array<BST, 10> = tree_1;
+  param = x_37[0u];
+  makeTreeNode_struct_BST_i1_i1_i11_(&(param));
+  let x_40 : BST = param;
+  let x_41 : array<BST, 10> = tree_1;
+  var x_42_1 : array<BST, 10> = x_41;
+  x_42_1[0u] = x_40;
+  let x_42 : array<BST, 10> = x_42_1;
+  tree_1 = x_42;
+  let x_43 : ptr<function, i32> = &(tree_1[0].rightIndex);
+  let x_11 : array<BST, 10> = tree_1;
+  if ((x_11[0u].rightIndex == 0)) {
+    loop {
+    }
+    return;
+  }
+  let x_12 : array<BST, 10> = tree_1;
+  x_GLF_color = vec4<f32>(f32(x_12[0u].rightIndex), 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-array-index/0.spvasm b/test/vk-gl-cts/graphicsfuzz/struct-array-index/0.spvasm
new file mode 100644
index 0000000..1091070
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-array-index/0.spvasm
@@ -0,0 +1,97 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %struct_base "struct_base"
+               OpMemberName %struct_base 0 "data"
+               OpMemberName %struct_base 1 "leftIndex"
+               OpMemberName %struct_base 2 "rightIndex"
+               OpName %struct_array "struct_array"
+               OpName %index "index"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%struct_base = OpTypeStruct %int %int %int
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_struct_base_uint_3 = OpTypeArray %struct_base %uint_3
+%_ptr_Private__arr_struct_base_uint_3 = OpTypePointer Private %_arr_struct_base_uint_3
+%struct_array = OpVariable %_ptr_Private__arr_struct_base_uint_3 Private
+      %int_1 = OpConstant %int 1
+         %17 = OpConstantComposite %struct_base %int_1 %int_1 %int_1
+         %18 = OpConstantComposite %_arr_struct_base_uint_3 %17 %17 %17
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_2 = OpConstant %int 2
+%_ptr_Private_int = OpTypePointer Private %int
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %34 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %35 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+       %main = OpFunction %void None %10
+         %36 = OpLabel
+      %index = OpVariable %_ptr_Function_int Function
+               OpStore %struct_array %18
+               OpStore %index %int_1
+         %37 = OpAccessChain %_ptr_Private_int %struct_array %int_1 %int_2
+               OpStore %37 %int_1
+         %38 = OpAccessChain %_ptr_Private_int %struct_array %int_1 %int_1
+         %39 = OpLoad %int %38
+         %40 = OpIEqual %bool %39 %int_1
+               OpSelectionMerge %41 None
+               OpBranchConditional %40 %42 %43
+         %42 = OpLabel
+         %44 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %45 = OpLoad %float %44
+         %46 = OpConvertFToS %int %45
+         %47 = OpAccessChain %_ptr_Private_int %struct_array %46 %int_2
+         %48 = OpLoad %int %47
+               OpStore %index %48
+               OpBranch %41
+         %43 = OpLabel
+         %49 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %50 = OpLoad %float %49
+         %51 = OpConvertFToS %int %50
+         %52 = OpAccessChain %_ptr_Private_int %struct_array %51 %int_1
+         %53 = OpLoad %int %52
+               OpStore %index %53
+               OpBranch %41
+         %41 = OpLabel
+         %54 = OpAccessChain %_ptr_Private_int %struct_array %int_1 %int_1
+         %55 = OpLoad %int %54
+         %56 = OpIEqual %bool %55 %int_1
+               OpSelectionMerge %57 None
+               OpBranchConditional %56 %58 %59
+         %58 = OpLabel
+               OpStore %_GLF_color %34
+               OpBranch %57
+         %59 = OpLabel
+               OpStore %_GLF_color %35
+               OpBranch %57
+         %57 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-array-index/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/struct-array-index/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..a1dacbe
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-array-index/0.spvasm.expected.hlsl
@@ -0,0 +1,53 @@
+struct struct_base {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+
+static struct_base struct_array[3] = (struct_base[3])0;
+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);
+
+void main_1() {
+  int index = 0;
+  const struct_base tint_symbol_3 = {1, 1, 1};
+  const struct_base tint_symbol_4 = {1, 1, 1};
+  const struct_base tint_symbol_5 = {1, 1, 1};
+  const struct_base tint_symbol_6[3] = {tint_symbol_3, tint_symbol_4, tint_symbol_5};
+  struct_array = tint_symbol_6;
+  index = 1;
+  struct_array[1].rightIndex = 1;
+  const int x_39 = struct_array[1].leftIndex;
+  if ((x_39 == 1)) {
+    const float x_45 = asfloat(x_8[0].x);
+    const int x_48 = struct_array[int(x_45)].rightIndex;
+    index = x_48;
+  } else {
+    const float x_50 = asfloat(x_8[0].y);
+    const int x_53 = struct_array[int(x_50)].leftIndex;
+    index = x_53;
+  }
+  const int x_55 = struct_array[1].leftIndex;
+  if ((x_55 == 1)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_7 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_7;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-array-index/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/struct-array-index/0.spvasm.expected.msl
new file mode 100644
index 0000000..0f1196e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-array-index/0.spvasm.expected.msl
@@ -0,0 +1,58 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct struct_base {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  struct_base arr[3];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_8, thread tint_array_wrapper* const tint_symbol_8, thread float4* const tint_symbol_9) {
+  int index = 0;
+  struct_base const tint_symbol_3 = {.data=1, .leftIndex=1, .rightIndex=1};
+  struct_base const tint_symbol_4 = {.data=1, .leftIndex=1, .rightIndex=1};
+  struct_base const tint_symbol_5 = {.data=1, .leftIndex=1, .rightIndex=1};
+  tint_array_wrapper const tint_symbol_6 = {.arr={tint_symbol_3, tint_symbol_4, tint_symbol_5}};
+  *(tint_symbol_8) = tint_symbol_6;
+  index = 1;
+  (*(tint_symbol_8)).arr[1].rightIndex = 1;
+  int const x_39 = (*(tint_symbol_8)).arr[1].leftIndex;
+  if ((x_39 == 1)) {
+    float const x_45 = x_8.injectionSwitch.x;
+    int const x_48 = (*(tint_symbol_8)).arr[int(x_45)].rightIndex;
+    index = x_48;
+  } else {
+    float const x_50 = x_8.injectionSwitch.y;
+    int const x_53 = (*(tint_symbol_8)).arr[int(x_50)].leftIndex;
+    index = x_53;
+  }
+  int const x_55 = (*(tint_symbol_8)).arr[1].leftIndex;
+  if ((x_55 == 1)) {
+    *(tint_symbol_9) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_9) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_8 [[buffer(0)]]) {
+  thread tint_array_wrapper tint_symbol_10 = {};
+  thread float4 tint_symbol_11 = 0.0f;
+  main_1(x_8, &(tint_symbol_10), &(tint_symbol_11));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_11};
+  tint_symbol_1 const tint_symbol_7 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_7;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-array-index/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/struct-array-index/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..cc8e8c1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-array-index/0.spvasm.expected.spvasm
@@ -0,0 +1,133 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 75
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %struct_base "struct_base"
+               OpMemberName %struct_base 0 "data"
+               OpMemberName %struct_base 1 "leftIndex"
+               OpMemberName %struct_base 2 "rightIndex"
+               OpName %struct_array "struct_array"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %index "index"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpMemberDecorate %struct_base 0 Offset 0
+               OpMemberDecorate %struct_base 1 Offset 4
+               OpMemberDecorate %struct_base 2 Offset 8
+               OpDecorate %_arr_struct_base_uint_3 ArrayStride 12
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+%struct_base = OpTypeStruct %int %int %int
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_struct_base_uint_3 = OpTypeArray %struct_base %uint_3
+%_ptr_Private__arr_struct_base_uint_3 = OpTypePointer Private %_arr_struct_base_uint_3
+          %8 = OpConstantNull %_arr_struct_base_uint_3
+%struct_array = OpVariable %_ptr_Private__arr_struct_base_uint_3 Private %8
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %26 = OpConstantNull %int
+      %int_1 = OpConstant %int 1
+         %28 = OpConstantComposite %struct_base %int_1 %int_1 %int_1
+         %29 = OpConstantComposite %_arr_struct_base_uint_3 %28 %28 %28
+     %uint_2 = OpConstant %uint 2
+%_ptr_Private_int = OpTypePointer Private %int
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %61 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %62 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+         %63 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+      %index = OpVariable %_ptr_Function_int Function %26
+               OpStore %struct_array %29
+               OpStore %index %int_1
+         %32 = OpAccessChain %_ptr_Private_int %struct_array %int_1 %uint_2
+               OpStore %32 %int_1
+         %34 = OpAccessChain %_ptr_Private_int %struct_array %int_1 %uint_1
+         %35 = OpLoad %int %34
+         %36 = OpIEqual %bool %35 %int_1
+               OpSelectionMerge %38 None
+               OpBranchConditional %36 %39 %40
+         %39 = OpLabel
+         %43 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+         %44 = OpLoad %float %43
+         %45 = OpConvertFToS %int %44
+         %46 = OpAccessChain %_ptr_Private_int %struct_array %45 %uint_2
+         %47 = OpLoad %int %46
+               OpStore %index %47
+               OpBranch %38
+         %40 = OpLabel
+         %48 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+         %49 = OpLoad %float %48
+         %50 = OpConvertFToS %int %49
+         %51 = OpAccessChain %_ptr_Private_int %struct_array %50 %uint_1
+         %52 = OpLoad %int %51
+               OpStore %index %52
+               OpBranch %38
+         %38 = OpLabel
+         %53 = OpAccessChain %_ptr_Private_int %struct_array %int_1 %uint_1
+         %54 = OpLoad %int %53
+         %55 = OpIEqual %bool %54 %int_1
+               OpSelectionMerge %56 None
+               OpBranchConditional %55 %57 %58
+         %57 = OpLabel
+               OpStore %x_GLF_color %61
+               OpBranch %56
+         %58 = OpLabel
+               OpStore %x_GLF_color %62
+               OpBranch %56
+         %56 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %63
+%tint_symbol = OpFunctionParameter %main_out
+         %67 = OpLabel
+         %68 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %68
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+         %70 = OpLabel
+         %71 = OpFunctionCall %void %main_1
+         %73 = OpLoad %v4float %x_GLF_color
+         %74 = OpCompositeConstruct %main_out %73
+         %72 = OpFunctionCall %void %tint_symbol_2 %74
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-array-index/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/struct-array-index/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..914402c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-array-index/0.spvasm.expected.wgsl
@@ -0,0 +1,51 @@
+struct struct_base {
+  data : i32;
+  leftIndex : i32;
+  rightIndex : i32;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> struct_array : array<struct_base, 3>;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var index : i32;
+  struct_array = array<struct_base, 3>(struct_base(1, 1, 1), struct_base(1, 1, 1), struct_base(1, 1, 1));
+  index = 1;
+  struct_array[1].rightIndex = 1;
+  let x_39 : i32 = struct_array[1].leftIndex;
+  if ((x_39 == 1)) {
+    let x_45 : f32 = x_8.injectionSwitch.x;
+    let x_48 : i32 = struct_array[i32(x_45)].rightIndex;
+    index = x_48;
+  } else {
+    let x_50 : f32 = x_8.injectionSwitch.y;
+    let x_53 : i32 = struct_array[i32(x_50)].leftIndex;
+    index = x_53;
+  }
+  let x_55 : i32 = struct_array[1].leftIndex;
+  if ((x_55 == 1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-array-index/0.wgsl b/test/vk-gl-cts/graphicsfuzz/struct-array-index/0.wgsl
new file mode 100644
index 0000000..914402c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-array-index/0.wgsl
@@ -0,0 +1,51 @@
+struct struct_base {
+  data : i32;
+  leftIndex : i32;
+  rightIndex : i32;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> struct_array : array<struct_base, 3>;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var index : i32;
+  struct_array = array<struct_base, 3>(struct_base(1, 1, 1), struct_base(1, 1, 1), struct_base(1, 1, 1));
+  index = 1;
+  struct_array[1].rightIndex = 1;
+  let x_39 : i32 = struct_array[1].leftIndex;
+  if ((x_39 == 1)) {
+    let x_45 : f32 = x_8.injectionSwitch.x;
+    let x_48 : i32 = struct_array[i32(x_45)].rightIndex;
+    index = x_48;
+  } else {
+    let x_50 : f32 = x_8.injectionSwitch.y;
+    let x_53 : i32 = struct_array[i32(x_50)].leftIndex;
+    index = x_53;
+  }
+  let x_55 : i32 = struct_array[1].leftIndex;
+  if ((x_55 == 1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-array-index/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/struct-array-index/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..a1dacbe
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-array-index/0.wgsl.expected.hlsl
@@ -0,0 +1,53 @@
+struct struct_base {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+
+static struct_base struct_array[3] = (struct_base[3])0;
+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);
+
+void main_1() {
+  int index = 0;
+  const struct_base tint_symbol_3 = {1, 1, 1};
+  const struct_base tint_symbol_4 = {1, 1, 1};
+  const struct_base tint_symbol_5 = {1, 1, 1};
+  const struct_base tint_symbol_6[3] = {tint_symbol_3, tint_symbol_4, tint_symbol_5};
+  struct_array = tint_symbol_6;
+  index = 1;
+  struct_array[1].rightIndex = 1;
+  const int x_39 = struct_array[1].leftIndex;
+  if ((x_39 == 1)) {
+    const float x_45 = asfloat(x_8[0].x);
+    const int x_48 = struct_array[int(x_45)].rightIndex;
+    index = x_48;
+  } else {
+    const float x_50 = asfloat(x_8[0].y);
+    const int x_53 = struct_array[int(x_50)].leftIndex;
+    index = x_53;
+  }
+  const int x_55 = struct_array[1].leftIndex;
+  if ((x_55 == 1)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_7 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_7;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-array-index/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/struct-array-index/0.wgsl.expected.msl
new file mode 100644
index 0000000..0f1196e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-array-index/0.wgsl.expected.msl
@@ -0,0 +1,58 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct struct_base {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  struct_base arr[3];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_8, thread tint_array_wrapper* const tint_symbol_8, thread float4* const tint_symbol_9) {
+  int index = 0;
+  struct_base const tint_symbol_3 = {.data=1, .leftIndex=1, .rightIndex=1};
+  struct_base const tint_symbol_4 = {.data=1, .leftIndex=1, .rightIndex=1};
+  struct_base const tint_symbol_5 = {.data=1, .leftIndex=1, .rightIndex=1};
+  tint_array_wrapper const tint_symbol_6 = {.arr={tint_symbol_3, tint_symbol_4, tint_symbol_5}};
+  *(tint_symbol_8) = tint_symbol_6;
+  index = 1;
+  (*(tint_symbol_8)).arr[1].rightIndex = 1;
+  int const x_39 = (*(tint_symbol_8)).arr[1].leftIndex;
+  if ((x_39 == 1)) {
+    float const x_45 = x_8.injectionSwitch.x;
+    int const x_48 = (*(tint_symbol_8)).arr[int(x_45)].rightIndex;
+    index = x_48;
+  } else {
+    float const x_50 = x_8.injectionSwitch.y;
+    int const x_53 = (*(tint_symbol_8)).arr[int(x_50)].leftIndex;
+    index = x_53;
+  }
+  int const x_55 = (*(tint_symbol_8)).arr[1].leftIndex;
+  if ((x_55 == 1)) {
+    *(tint_symbol_9) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_9) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_8 [[buffer(0)]]) {
+  thread tint_array_wrapper tint_symbol_10 = {};
+  thread float4 tint_symbol_11 = 0.0f;
+  main_1(x_8, &(tint_symbol_10), &(tint_symbol_11));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_11};
+  tint_symbol_1 const tint_symbol_7 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_7;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-array-index/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/struct-array-index/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..cc8e8c1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-array-index/0.wgsl.expected.spvasm
@@ -0,0 +1,133 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 75
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %struct_base "struct_base"
+               OpMemberName %struct_base 0 "data"
+               OpMemberName %struct_base 1 "leftIndex"
+               OpMemberName %struct_base 2 "rightIndex"
+               OpName %struct_array "struct_array"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %index "index"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpMemberDecorate %struct_base 0 Offset 0
+               OpMemberDecorate %struct_base 1 Offset 4
+               OpMemberDecorate %struct_base 2 Offset 8
+               OpDecorate %_arr_struct_base_uint_3 ArrayStride 12
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+%struct_base = OpTypeStruct %int %int %int
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%_arr_struct_base_uint_3 = OpTypeArray %struct_base %uint_3
+%_ptr_Private__arr_struct_base_uint_3 = OpTypePointer Private %_arr_struct_base_uint_3
+          %8 = OpConstantNull %_arr_struct_base_uint_3
+%struct_array = OpVariable %_ptr_Private__arr_struct_base_uint_3 Private %8
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %26 = OpConstantNull %int
+      %int_1 = OpConstant %int 1
+         %28 = OpConstantComposite %struct_base %int_1 %int_1 %int_1
+         %29 = OpConstantComposite %_arr_struct_base_uint_3 %28 %28 %28
+     %uint_2 = OpConstant %uint 2
+%_ptr_Private_int = OpTypePointer Private %int
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %61 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %62 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+         %63 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+      %index = OpVariable %_ptr_Function_int Function %26
+               OpStore %struct_array %29
+               OpStore %index %int_1
+         %32 = OpAccessChain %_ptr_Private_int %struct_array %int_1 %uint_2
+               OpStore %32 %int_1
+         %34 = OpAccessChain %_ptr_Private_int %struct_array %int_1 %uint_1
+         %35 = OpLoad %int %34
+         %36 = OpIEqual %bool %35 %int_1
+               OpSelectionMerge %38 None
+               OpBranchConditional %36 %39 %40
+         %39 = OpLabel
+         %43 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+         %44 = OpLoad %float %43
+         %45 = OpConvertFToS %int %44
+         %46 = OpAccessChain %_ptr_Private_int %struct_array %45 %uint_2
+         %47 = OpLoad %int %46
+               OpStore %index %47
+               OpBranch %38
+         %40 = OpLabel
+         %48 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+         %49 = OpLoad %float %48
+         %50 = OpConvertFToS %int %49
+         %51 = OpAccessChain %_ptr_Private_int %struct_array %50 %uint_1
+         %52 = OpLoad %int %51
+               OpStore %index %52
+               OpBranch %38
+         %38 = OpLabel
+         %53 = OpAccessChain %_ptr_Private_int %struct_array %int_1 %uint_1
+         %54 = OpLoad %int %53
+         %55 = OpIEqual %bool %54 %int_1
+               OpSelectionMerge %56 None
+               OpBranchConditional %55 %57 %58
+         %57 = OpLabel
+               OpStore %x_GLF_color %61
+               OpBranch %56
+         %58 = OpLabel
+               OpStore %x_GLF_color %62
+               OpBranch %56
+         %56 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %63
+%tint_symbol = OpFunctionParameter %main_out
+         %67 = OpLabel
+         %68 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %68
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+         %70 = OpLabel
+         %71 = OpFunctionCall %void %main_1
+         %73 = OpLoad %v4float %x_GLF_color
+         %74 = OpCompositeConstruct %main_out %73
+         %72 = OpFunctionCall %void %tint_symbol_2 %74
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-array-index/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/struct-array-index/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..914402c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-array-index/0.wgsl.expected.wgsl
@@ -0,0 +1,51 @@
+struct struct_base {
+  data : i32;
+  leftIndex : i32;
+  rightIndex : i32;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> struct_array : array<struct_base, 3>;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var index : i32;
+  struct_array = array<struct_base, 3>(struct_base(1, 1, 1), struct_base(1, 1, 1), struct_base(1, 1, 1));
+  index = 1;
+  struct_array[1].rightIndex = 1;
+  let x_39 : i32 = struct_array[1].leftIndex;
+  if ((x_39 == 1)) {
+    let x_45 : f32 = x_8.injectionSwitch.x;
+    let x_48 : i32 = struct_array[i32(x_45)].rightIndex;
+    index = x_48;
+  } else {
+    let x_50 : f32 = x_8.injectionSwitch.y;
+    let x_53 : i32 = struct_array[i32(x_50)].leftIndex;
+    index = x_53;
+  }
+  let x_55 : i32 = struct_array[1].leftIndex;
+  if ((x_55 == 1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-controlled-loop/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/struct-controlled-loop/0-opt.spvasm
new file mode 100644
index 0000000..0f3e409
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-controlled-loop/0-opt.spvasm
@@ -0,0 +1,95 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %S "S"
+               OpMemberName %S 0 "f0"
+               OpMemberName %S 1 "f1"
+               OpName %ll "ll"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %sums "sums"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %S 0 RelaxedPrecision
+               OpDecorate %9 RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %10 RelaxedPrecision
+               OpDecorate %11 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %12 RelaxedPrecision
+               OpDecorate %13 RelaxedPrecision
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %bool = OpTypeBool
+     %v3bool = OpTypeVector %bool 3
+          %S = OpTypeStruct %int %v3bool
+%_ptr_Function_S = OpTypePointer Function %S
+      %int_0 = OpConstant %int 0
+       %true = OpConstantTrue %bool
+         %22 = OpConstantComposite %v3bool %true %true %true
+         %23 = OpConstantComposite %S %int_0 %22
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_9 = OpConstant %uint 9
+%_arr_float_uint_9 = OpTypeArray %float %uint_9
+%_ptr_Function__arr_float_uint_9 = OpTypePointer Function %_arr_float_uint_9
+    %float_0 = OpConstant %float 0
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_1 = OpConstant %int 1
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+       %main = OpFunction %void None %15
+         %39 = OpLabel
+         %ll = OpVariable %_ptr_Function_S Function
+       %sums = OpVariable %_ptr_Function__arr_float_uint_9 Function
+               OpStore %ll %23
+               OpBranch %40
+         %40 = OpLabel
+               OpLoopMerge %41 %42 None
+               OpBranch %43
+         %43 = OpLabel
+         %12 = OpLoad %S %ll
+          %9 = OpCompositeExtract %int %12 0
+         %44 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %45 = OpLoad %float %44
+         %46 = OpConvertFToS %int %45
+         %47 = OpINotEqual %bool %9 %46
+               OpBranchConditional %47 %48 %41
+         %48 = OpLabel
+         %49 = OpAccessChain %_ptr_Function_float %sums %int_0
+               OpStore %49 %float_0
+               OpBranch %42
+         %42 = OpLabel
+         %13 = OpLoad %S %ll
+         %10 = OpCompositeExtract %int %13 0
+         %11 = OpIAdd %int %10 %int_1
+         %50 = OpLoad %S %ll
+         %51 = OpCompositeInsert %S %11 %50 0
+               OpStore %ll %51
+               OpBranch %40
+         %41 = OpLabel
+         %52 = OpAccessChain %_ptr_Function_float %sums %int_0
+         %53 = OpLoad %float %52
+         %54 = OpCompositeConstruct %v2float %53 %53
+         %55 = OpCompositeExtract %float %54 0
+         %56 = OpCompositeExtract %float %54 1
+         %57 = OpCompositeConstruct %v4float %float_1 %55 %56 %float_1
+               OpStore %_GLF_color %57
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-controlled-loop/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/struct-controlled-loop/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..ba47317
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-controlled-loop/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,49 @@
+struct S {
+  int f0;
+  bool3 f1;
+};
+
+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() {
+  S ll = (S)0;
+  float sums[9] = (float[9])0;
+  const S tint_symbol_3 = {0, bool3(true, true, true)};
+  ll = tint_symbol_3;
+  while (true) {
+    const S x_12 = ll;
+    const float x_45 = asfloat(x_7[0].y);
+    if ((x_12.f0 != int(x_45))) {
+    } else {
+      break;
+    }
+    sums[0] = 0.0f;
+    {
+      const S x_13 = ll;
+      S x_51_1 = ll;
+      x_51_1.f0 = (x_13.f0 + 1);
+      ll = x_51_1;
+    }
+  }
+  const float x_53 = sums[0];
+  const float2 x_54 = float2(x_53, x_53);
+  x_GLF_color = float4(1.0f, x_54.x, x_54.y, 1.0f);
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-controlled-loop/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/struct-controlled-loop/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..c9860b9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-controlled-loop/0-opt.spvasm.expected.msl
@@ -0,0 +1,56 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  int f0;
+  bool3 f1;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  float arr[9];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_5) {
+  S ll = {};
+  tint_array_wrapper sums = {};
+  S const tint_symbol_3 = {.f0=0, .f1=bool3(true, true, true)};
+  ll = tint_symbol_3;
+  while (true) {
+    S const x_12 = ll;
+    float const x_45 = x_7.injectionSwitch.y;
+    if ((x_12.f0 != int(x_45))) {
+    } else {
+      break;
+    }
+    sums.arr[0] = 0.0f;
+    {
+      S const x_13 = ll;
+      S const x_50 = ll;
+      S x_51_1 = x_50;
+      x_51_1.f0 = (x_13.f0 + 1);
+      S const x_51 = x_51_1;
+      ll = x_51;
+    }
+  }
+  float const x_53 = sums.arr[0];
+  float2 const x_54 = float2(x_53, x_53);
+  *(tint_symbol_5) = float4(1.0f, x_54.x, x_54.y, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_7, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-controlled-loop/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/struct-controlled-loop/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..1b17c76
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-controlled-loop/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,137 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 80
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %S "S"
+               OpMemberName %S 0 "f0"
+               OpMemberName %S 1 "f1"
+               OpName %ll "ll"
+               OpName %sums "sums"
+               OpName %x_51_1 "x_51_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %S 0 Offset 0
+               OpMemberDecorate %S 1 Offset 16
+               OpDecorate %_arr_float_uint_9 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %bool = OpTypeBool
+     %v3bool = OpTypeVector %bool 3
+          %S = OpTypeStruct %int %v3bool
+%_ptr_Function_S = OpTypePointer Function %S
+         %22 = OpConstantNull %S
+       %uint = OpTypeInt 32 0
+     %uint_9 = OpConstant %uint 9
+%_arr_float_uint_9 = OpTypeArray %float %uint_9
+%_ptr_Function__arr_float_uint_9 = OpTypePointer Function %_arr_float_uint_9
+         %28 = OpConstantNull %_arr_float_uint_9
+      %int_0 = OpConstant %int 0
+       %true = OpConstantTrue %bool
+         %31 = OpConstantComposite %v3bool %true %true %true
+         %32 = OpConstantComposite %S %int_0 %31
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_0 = OpConstant %float 0
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+         %68 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+         %ll = OpVariable %_ptr_Function_S Function %22
+       %sums = OpVariable %_ptr_Function__arr_float_uint_9 Function %28
+     %x_51_1 = OpVariable %_ptr_Function_S Function %22
+               OpStore %ll %32
+               OpBranch %33
+         %33 = OpLabel
+               OpLoopMerge %34 %35 None
+               OpBranch %36
+         %36 = OpLabel
+         %37 = OpLoad %S %ll
+         %41 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_1
+         %42 = OpLoad %float %41
+         %43 = OpCompositeExtract %int %37 0
+         %44 = OpConvertFToS %int %42
+         %45 = OpINotEqual %bool %43 %44
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %48
+         %47 = OpLabel
+               OpBranch %46
+         %48 = OpLabel
+               OpBranch %34
+         %46 = OpLabel
+         %50 = OpAccessChain %_ptr_Function_float %sums %int_0
+               OpStore %50 %float_0
+               OpBranch %35
+         %35 = OpLabel
+         %52 = OpLoad %S %ll
+         %53 = OpLoad %S %ll
+               OpStore %x_51_1 %53
+         %56 = OpAccessChain %_ptr_Function_int %x_51_1 %uint_0
+         %57 = OpCompositeExtract %int %52 0
+         %59 = OpIAdd %int %57 %int_1
+               OpStore %56 %59
+         %60 = OpLoad %S %x_51_1
+               OpStore %ll %60
+               OpBranch %33
+         %34 = OpLabel
+         %61 = OpAccessChain %_ptr_Function_float %sums %int_0
+         %62 = OpLoad %float %61
+         %63 = OpCompositeConstruct %v2float %62 %62
+         %65 = OpCompositeExtract %float %63 0
+         %66 = OpCompositeExtract %float %63 1
+         %67 = OpCompositeConstruct %v4float %float_1 %65 %66 %float_1
+               OpStore %x_GLF_color %67
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %68
+%tint_symbol = OpFunctionParameter %main_out
+         %72 = OpLabel
+         %73 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %73
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %75 = OpLabel
+         %76 = OpFunctionCall %void %main_1
+         %78 = OpLoad %v4float %x_GLF_color
+         %79 = OpCompositeConstruct %main_out %78
+         %77 = OpFunctionCall %void %tint_symbol_2 %79
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-controlled-loop/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/struct-controlled-loop/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..863b10c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-controlled-loop/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,52 @@
+struct S {
+  f0 : i32;
+  f1 : vec3<bool>;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var ll : S;
+  var sums : array<f32, 9>;
+  ll = S(0, vec3<bool>(true, true, true));
+  loop {
+    let x_12 : S = ll;
+    let x_45 : f32 = x_7.injectionSwitch.y;
+    if ((x_12.f0 != i32(x_45))) {
+    } else {
+      break;
+    }
+    sums[0] = 0.0;
+
+    continuing {
+      let x_13 : S = ll;
+      let x_50 : S = ll;
+      var x_51_1 : S = x_50;
+      x_51_1.f0 = (x_13.f0 + 1);
+      let x_51 : S = x_51_1;
+      ll = x_51;
+    }
+  }
+  let x_53 : f32 = sums[0];
+  let x_54 : vec2<f32> = vec2<f32>(x_53, x_53);
+  x_GLF_color = vec4<f32>(1.0, x_54.x, x_54.y, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-controlled-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/struct-controlled-loop/0-opt.wgsl
new file mode 100644
index 0000000..863b10c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-controlled-loop/0-opt.wgsl
@@ -0,0 +1,52 @@
+struct S {
+  f0 : i32;
+  f1 : vec3<bool>;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var ll : S;
+  var sums : array<f32, 9>;
+  ll = S(0, vec3<bool>(true, true, true));
+  loop {
+    let x_12 : S = ll;
+    let x_45 : f32 = x_7.injectionSwitch.y;
+    if ((x_12.f0 != i32(x_45))) {
+    } else {
+      break;
+    }
+    sums[0] = 0.0;
+
+    continuing {
+      let x_13 : S = ll;
+      let x_50 : S = ll;
+      var x_51_1 : S = x_50;
+      x_51_1.f0 = (x_13.f0 + 1);
+      let x_51 : S = x_51_1;
+      ll = x_51;
+    }
+  }
+  let x_53 : f32 = sums[0];
+  let x_54 : vec2<f32> = vec2<f32>(x_53, x_53);
+  x_GLF_color = vec4<f32>(1.0, x_54.x, x_54.y, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-controlled-loop/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/struct-controlled-loop/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..ba47317
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-controlled-loop/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,49 @@
+struct S {
+  int f0;
+  bool3 f1;
+};
+
+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() {
+  S ll = (S)0;
+  float sums[9] = (float[9])0;
+  const S tint_symbol_3 = {0, bool3(true, true, true)};
+  ll = tint_symbol_3;
+  while (true) {
+    const S x_12 = ll;
+    const float x_45 = asfloat(x_7[0].y);
+    if ((x_12.f0 != int(x_45))) {
+    } else {
+      break;
+    }
+    sums[0] = 0.0f;
+    {
+      const S x_13 = ll;
+      S x_51_1 = ll;
+      x_51_1.f0 = (x_13.f0 + 1);
+      ll = x_51_1;
+    }
+  }
+  const float x_53 = sums[0];
+  const float2 x_54 = float2(x_53, x_53);
+  x_GLF_color = float4(1.0f, x_54.x, x_54.y, 1.0f);
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-controlled-loop/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/struct-controlled-loop/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..c9860b9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-controlled-loop/0-opt.wgsl.expected.msl
@@ -0,0 +1,56 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  int f0;
+  bool3 f1;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  float arr[9];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_5) {
+  S ll = {};
+  tint_array_wrapper sums = {};
+  S const tint_symbol_3 = {.f0=0, .f1=bool3(true, true, true)};
+  ll = tint_symbol_3;
+  while (true) {
+    S const x_12 = ll;
+    float const x_45 = x_7.injectionSwitch.y;
+    if ((x_12.f0 != int(x_45))) {
+    } else {
+      break;
+    }
+    sums.arr[0] = 0.0f;
+    {
+      S const x_13 = ll;
+      S const x_50 = ll;
+      S x_51_1 = x_50;
+      x_51_1.f0 = (x_13.f0 + 1);
+      S const x_51 = x_51_1;
+      ll = x_51;
+    }
+  }
+  float const x_53 = sums.arr[0];
+  float2 const x_54 = float2(x_53, x_53);
+  *(tint_symbol_5) = float4(1.0f, x_54.x, x_54.y, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_7, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-controlled-loop/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/struct-controlled-loop/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..1b17c76
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-controlled-loop/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,137 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 80
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %S "S"
+               OpMemberName %S 0 "f0"
+               OpMemberName %S 1 "f1"
+               OpName %ll "ll"
+               OpName %sums "sums"
+               OpName %x_51_1 "x_51_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %S 0 Offset 0
+               OpMemberDecorate %S 1 Offset 16
+               OpDecorate %_arr_float_uint_9 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %bool = OpTypeBool
+     %v3bool = OpTypeVector %bool 3
+          %S = OpTypeStruct %int %v3bool
+%_ptr_Function_S = OpTypePointer Function %S
+         %22 = OpConstantNull %S
+       %uint = OpTypeInt 32 0
+     %uint_9 = OpConstant %uint 9
+%_arr_float_uint_9 = OpTypeArray %float %uint_9
+%_ptr_Function__arr_float_uint_9 = OpTypePointer Function %_arr_float_uint_9
+         %28 = OpConstantNull %_arr_float_uint_9
+      %int_0 = OpConstant %int 0
+       %true = OpConstantTrue %bool
+         %31 = OpConstantComposite %v3bool %true %true %true
+         %32 = OpConstantComposite %S %int_0 %31
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_0 = OpConstant %float 0
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+         %68 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+         %ll = OpVariable %_ptr_Function_S Function %22
+       %sums = OpVariable %_ptr_Function__arr_float_uint_9 Function %28
+     %x_51_1 = OpVariable %_ptr_Function_S Function %22
+               OpStore %ll %32
+               OpBranch %33
+         %33 = OpLabel
+               OpLoopMerge %34 %35 None
+               OpBranch %36
+         %36 = OpLabel
+         %37 = OpLoad %S %ll
+         %41 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_1
+         %42 = OpLoad %float %41
+         %43 = OpCompositeExtract %int %37 0
+         %44 = OpConvertFToS %int %42
+         %45 = OpINotEqual %bool %43 %44
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %48
+         %47 = OpLabel
+               OpBranch %46
+         %48 = OpLabel
+               OpBranch %34
+         %46 = OpLabel
+         %50 = OpAccessChain %_ptr_Function_float %sums %int_0
+               OpStore %50 %float_0
+               OpBranch %35
+         %35 = OpLabel
+         %52 = OpLoad %S %ll
+         %53 = OpLoad %S %ll
+               OpStore %x_51_1 %53
+         %56 = OpAccessChain %_ptr_Function_int %x_51_1 %uint_0
+         %57 = OpCompositeExtract %int %52 0
+         %59 = OpIAdd %int %57 %int_1
+               OpStore %56 %59
+         %60 = OpLoad %S %x_51_1
+               OpStore %ll %60
+               OpBranch %33
+         %34 = OpLabel
+         %61 = OpAccessChain %_ptr_Function_float %sums %int_0
+         %62 = OpLoad %float %61
+         %63 = OpCompositeConstruct %v2float %62 %62
+         %65 = OpCompositeExtract %float %63 0
+         %66 = OpCompositeExtract %float %63 1
+         %67 = OpCompositeConstruct %v4float %float_1 %65 %66 %float_1
+               OpStore %x_GLF_color %67
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %68
+%tint_symbol = OpFunctionParameter %main_out
+         %72 = OpLabel
+         %73 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %73
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %75 = OpLabel
+         %76 = OpFunctionCall %void %main_1
+         %78 = OpLoad %v4float %x_GLF_color
+         %79 = OpCompositeConstruct %main_out %78
+         %77 = OpFunctionCall %void %tint_symbol_2 %79
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-controlled-loop/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/struct-controlled-loop/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..863b10c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-controlled-loop/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,52 @@
+struct S {
+  f0 : i32;
+  f1 : vec3<bool>;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var ll : S;
+  var sums : array<f32, 9>;
+  ll = S(0, vec3<bool>(true, true, true));
+  loop {
+    let x_12 : S = ll;
+    let x_45 : f32 = x_7.injectionSwitch.y;
+    if ((x_12.f0 != i32(x_45))) {
+    } else {
+      break;
+    }
+    sums[0] = 0.0;
+
+    continuing {
+      let x_13 : S = ll;
+      let x_50 : S = ll;
+      var x_51_1 : S = x_50;
+      x_51_1.f0 = (x_13.f0 + 1);
+      let x_51 : S = x_51_1;
+      ll = x_51;
+    }
+  }
+  let x_53 : f32 = sums[0];
+  let x_54 : vec2<f32> = vec2<f32>(x_53, x_53);
+  x_GLF_color = vec4<f32>(1.0, x_54.x, x_54.y, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-used-as-temporary/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/struct-used-as-temporary/0-opt.spvasm
new file mode 100644
index 0000000..e3788e2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-used-as-temporary/0-opt.spvasm
@@ -0,0 +1,35 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %2 "main" %3
+               OpExecutionMode %2 OriginUpperLeft
+               OpSource ESSL 310
+               OpDecorate %3 Location 0
+               OpMemberDecorate %_struct_4 0 Offset 0
+               OpDecorate %_struct_4 Block
+               OpDecorate %5 DescriptorSet 0
+               OpDecorate %5 Binding 0
+               OpDecorate %6 RelaxedPrecision
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+          %3 = OpVariable %_ptr_Output_v4float Output
+  %_struct_4 = OpTypeStruct %v4float
+%_ptr_Uniform__struct_4 = OpTypePointer Uniform %_struct_4
+          %5 = OpVariable %_ptr_Uniform__struct_4 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
+ %_struct_16 = OpTypeStruct %v4float
+         %17 = OpUndef %_struct_16
+          %2 = OpFunction %void None %8
+         %18 = OpLabel
+         %19 = OpAccessChain %_ptr_Uniform_v4float %5 %int_0
+         %20 = OpLoad %v4float %19
+         %21 = OpCompositeInsert %_struct_16 %20 %17 0
+          %6 = OpCompositeExtract %v4float %21 0
+               OpStore %3 %6
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-used-as-temporary/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/struct-used-as-temporary/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..82d98ae
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-used-as-temporary/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,30 @@
+struct S_1 {
+  float4 field0;
+};
+
+static float4 x_3 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+
+void main_1() {
+  const float4 x_20 = asfloat(x_5[0]);
+  S_1 x_21_1 = {float4(0.0f, 0.0f, 0.0f, 0.0f)};
+  x_21_1.field0 = x_20;
+  x_3 = x_21_1.field0;
+  return;
+}
+
+struct main_out {
+  float4 x_3_1;
+};
+struct tint_symbol {
+  float4 x_3_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_3};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_3_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-used-as-temporary/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/struct-used-as-temporary/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..c193507
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-used-as-temporary/0-opt.spvasm.expected.msl
@@ -0,0 +1,33 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  /* 0x0000 */ packed_float4 field0;
+};
+struct S_1 {
+  float4 field0;
+};
+struct main_out {
+  float4 x_3_1;
+};
+struct tint_symbol_1 {
+  float4 x_3_1 [[color(0)]];
+};
+
+void main_1(constant S& x_5, thread float4* const tint_symbol_4) {
+  float4 const x_20 = x_5.field0;
+  S_1 x_21_1 = {.field0=float4(0.0f, 0.0f, 0.0f, 0.0f)};
+  x_21_1.field0 = x_20;
+  S_1 const x_21 = x_21_1;
+  *(tint_symbol_4) = x_21.field0;
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant S& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_3_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_3_1=tint_symbol_2.x_3_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-used-as-temporary/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/struct-used-as-temporary/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..4cdb9e6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-used-as-temporary/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,83 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 43
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_3 "x_3"
+               OpName %S "S"
+               OpMemberName %S 0 "field0"
+               OpName %x_5 "x_5"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %S_1 "S_1"
+               OpMemberName %S_1 0 "field0"
+               OpName %x_21_1 "x_21_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_3_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %S Block
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %S_1 0 Offset 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+        %x_3 = OpVariable %_ptr_Private_v4float Private %5
+          %S = OpTypeStruct %v4float
+%_ptr_Uniform_S = OpTypePointer Uniform %S
+        %x_5 = OpVariable %_ptr_Uniform_S Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
+        %S_1 = OpTypeStruct %v4float
+    %float_0 = OpConstant %float 0
+         %22 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+         %23 = OpConstantComposite %S_1 %22
+%_ptr_Function_S_1 = OpTypePointer Function %S_1
+         %26 = OpConstantNull %S_1
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+   %main_out = OpTypeStruct %v4float
+         %31 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+     %x_21_1 = OpVariable %_ptr_Function_S_1 Function %26
+         %18 = OpAccessChain %_ptr_Uniform_v4float %x_5 %uint_0
+         %19 = OpLoad %v4float %18
+               OpStore %x_21_1 %23
+         %28 = OpAccessChain %_ptr_Function_v4float %x_21_1 %uint_0
+               OpStore %28 %19
+         %29 = OpLoad %S_1 %x_21_1
+         %30 = OpCompositeExtract %v4float %29 0
+               OpStore %x_3 %30
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %31
+%tint_symbol = OpFunctionParameter %main_out
+         %35 = OpLabel
+         %36 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %36
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %38 = OpLabel
+         %39 = OpFunctionCall %void %main_1
+         %41 = OpLoad %v4float %x_3
+         %42 = OpCompositeConstruct %main_out %41
+         %40 = OpFunctionCall %void %tint_symbol_2 %42
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-used-as-temporary/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/struct-used-as-temporary/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..de69a65
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-used-as-temporary/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,32 @@
+[[block]]
+struct S {
+  field0 : vec4<f32>;
+};
+
+struct S_1 {
+  field0 : vec4<f32>;
+};
+
+var<private> x_3 : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : S;
+
+fn main_1() {
+  let x_20 : vec4<f32> = x_5.field0;
+  var x_21_1 : S_1 = S_1(vec4<f32>(0.0, 0.0, 0.0, 0.0));
+  x_21_1.field0 = x_20;
+  let x_21 : S_1 = x_21_1;
+  x_3 = x_21.field0;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_3_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_3);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-used-as-temporary/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/struct-used-as-temporary/0-opt.wgsl
new file mode 100644
index 0000000..de69a65
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-used-as-temporary/0-opt.wgsl
@@ -0,0 +1,32 @@
+[[block]]
+struct S {
+  field0 : vec4<f32>;
+};
+
+struct S_1 {
+  field0 : vec4<f32>;
+};
+
+var<private> x_3 : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : S;
+
+fn main_1() {
+  let x_20 : vec4<f32> = x_5.field0;
+  var x_21_1 : S_1 = S_1(vec4<f32>(0.0, 0.0, 0.0, 0.0));
+  x_21_1.field0 = x_20;
+  let x_21 : S_1 = x_21_1;
+  x_3 = x_21.field0;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_3_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_3);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-used-as-temporary/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/struct-used-as-temporary/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..82d98ae
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-used-as-temporary/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,30 @@
+struct S_1 {
+  float4 field0;
+};
+
+static float4 x_3 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+
+void main_1() {
+  const float4 x_20 = asfloat(x_5[0]);
+  S_1 x_21_1 = {float4(0.0f, 0.0f, 0.0f, 0.0f)};
+  x_21_1.field0 = x_20;
+  x_3 = x_21_1.field0;
+  return;
+}
+
+struct main_out {
+  float4 x_3_1;
+};
+struct tint_symbol {
+  float4 x_3_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_3};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_3_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-used-as-temporary/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/struct-used-as-temporary/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..c193507
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-used-as-temporary/0-opt.wgsl.expected.msl
@@ -0,0 +1,33 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  /* 0x0000 */ packed_float4 field0;
+};
+struct S_1 {
+  float4 field0;
+};
+struct main_out {
+  float4 x_3_1;
+};
+struct tint_symbol_1 {
+  float4 x_3_1 [[color(0)]];
+};
+
+void main_1(constant S& x_5, thread float4* const tint_symbol_4) {
+  float4 const x_20 = x_5.field0;
+  S_1 x_21_1 = {.field0=float4(0.0f, 0.0f, 0.0f, 0.0f)};
+  x_21_1.field0 = x_20;
+  S_1 const x_21 = x_21_1;
+  *(tint_symbol_4) = x_21.field0;
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant S& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_3_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_3_1=tint_symbol_2.x_3_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-used-as-temporary/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/struct-used-as-temporary/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..4cdb9e6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-used-as-temporary/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,83 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 43
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_3 "x_3"
+               OpName %S "S"
+               OpMemberName %S 0 "field0"
+               OpName %x_5 "x_5"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %S_1 "S_1"
+               OpMemberName %S_1 0 "field0"
+               OpName %x_21_1 "x_21_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_3_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %S Block
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %S_1 0 Offset 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+        %x_3 = OpVariable %_ptr_Private_v4float Private %5
+          %S = OpTypeStruct %v4float
+%_ptr_Uniform_S = OpTypePointer Uniform %S
+        %x_5 = OpVariable %_ptr_Uniform_S Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
+        %S_1 = OpTypeStruct %v4float
+    %float_0 = OpConstant %float 0
+         %22 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+         %23 = OpConstantComposite %S_1 %22
+%_ptr_Function_S_1 = OpTypePointer Function %S_1
+         %26 = OpConstantNull %S_1
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+   %main_out = OpTypeStruct %v4float
+         %31 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+     %x_21_1 = OpVariable %_ptr_Function_S_1 Function %26
+         %18 = OpAccessChain %_ptr_Uniform_v4float %x_5 %uint_0
+         %19 = OpLoad %v4float %18
+               OpStore %x_21_1 %23
+         %28 = OpAccessChain %_ptr_Function_v4float %x_21_1 %uint_0
+               OpStore %28 %19
+         %29 = OpLoad %S_1 %x_21_1
+         %30 = OpCompositeExtract %v4float %29 0
+               OpStore %x_3 %30
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %31
+%tint_symbol = OpFunctionParameter %main_out
+         %35 = OpLabel
+         %36 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %36
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %38 = OpLabel
+         %39 = OpFunctionCall %void %main_1
+         %41 = OpLoad %v4float %x_3
+         %42 = OpCompositeConstruct %main_out %41
+         %40 = OpFunctionCall %void %tint_symbol_2 %42
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/struct-used-as-temporary/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/struct-used-as-temporary/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..de69a65
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/struct-used-as-temporary/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,32 @@
+[[block]]
+struct S {
+  field0 : vec4<f32>;
+};
+
+struct S_1 {
+  field0 : vec4<f32>;
+};
+
+var<private> x_3 : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : S;
+
+fn main_1() {
+  let x_20 : vec4<f32> = x_5.field0;
+  var x_21_1 : S_1 = S_1(vec4<f32>(0.0, 0.0, 0.0, 0.0));
+  x_21_1.field0 = x_20;
+  let x_21 : S_1 = x_21_1;
+  x_3 = x_21.field0;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_3_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_3);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-if-discard/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/switch-if-discard/0-opt.spvasm
new file mode 100644
index 0000000..2d47ed6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-if-discard/0-opt.spvasm
@@ -0,0 +1,59 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_0 = OpConstant %uint 0
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %22 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %7
+         %23 = OpLabel
+         %24 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %25 = OpLoad %float %24
+         %26 = OpConvertFToS %int %25
+               OpSelectionMerge %27 None
+               OpSwitch %26 %27 -1 %28
+         %28 = OpLabel
+         %29 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %30 = OpLoad %float %29
+         %31 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %32 = OpLoad %float %31
+         %33 = OpFOrdGreaterThan %bool %30 %32
+               OpSelectionMerge %34 None
+               OpBranchConditional %33 %35 %34
+         %35 = OpLabel
+               OpKill
+         %34 = OpLabel
+               OpBranch %27
+         %27 = OpLabel
+               OpStore %_GLF_color %22
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-if-discard/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/switch-if-discard/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..89dad7e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-if-discard/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,37 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const float x_25 = asfloat(x_5[0].y);
+  switch(int(x_25)) {
+    case -1: {
+      const float x_30 = asfloat(x_5[0].y);
+      const float x_32 = asfloat(x_5[0].x);
+      if ((x_30 > x_32)) {
+        discard;
+      }
+      break;
+    }
+    default: {
+      break;
+    }
+  }
+  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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-if-discard/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/switch-if-discard/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..e06f14d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-if-discard/0-opt.spvasm.expected.msl
@@ -0,0 +1,40 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  float const x_25 = x_5.injectionSwitch.y;
+  switch(int(x_25)) {
+    case -1: {
+      float const x_30 = x_5.injectionSwitch.y;
+      float const x_32 = x_5.injectionSwitch.x;
+      if ((x_30 > x_32)) {
+        discard_fragment();
+      }
+      break;
+    }
+    default: {
+      break;
+    }
+  }
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-if-discard/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/switch-if-discard/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..33527de
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-if-discard/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,91 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 50
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+        %int = OpTypeInt 32 1
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %37 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %38 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+         %20 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %uint_1
+         %21 = OpLoad %float %20
+         %23 = OpConvertFToS %int %21
+               OpSelectionMerge %22 None
+               OpSwitch %23 %25 -1 %26
+         %26 = OpLabel
+         %27 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %uint_1
+         %28 = OpLoad %float %27
+         %29 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %uint_0
+         %30 = OpLoad %float %29
+         %31 = OpFOrdGreaterThan %bool %28 %30
+               OpSelectionMerge %33 None
+               OpBranchConditional %31 %34 %33
+         %34 = OpLabel
+               OpKill
+         %33 = OpLabel
+               OpBranch %22
+         %25 = OpLabel
+               OpBranch %22
+         %22 = OpLabel
+               OpStore %x_GLF_color %37
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %38
+%tint_symbol = OpFunctionParameter %main_out
+         %42 = OpLabel
+         %43 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %43
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %45 = OpLabel
+         %46 = OpFunctionCall %void %main_1
+         %48 = OpLoad %v4float %x_GLF_color
+         %49 = OpCompositeConstruct %main_out %48
+         %47 = OpFunctionCall %void %tint_symbol_2 %49
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-if-discard/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/switch-if-discard/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..2a93d7f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-if-discard/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,36 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_25 : f32 = x_5.injectionSwitch.y;
+  switch(i32(x_25)) {
+    case -1: {
+      let x_30 : f32 = x_5.injectionSwitch.y;
+      let x_32 : f32 = x_5.injectionSwitch.x;
+      if ((x_30 > x_32)) {
+        discard;
+      }
+    }
+    default: {
+    }
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-if-discard/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/switch-if-discard/0-opt.wgsl
new file mode 100644
index 0000000..2a93d7f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-if-discard/0-opt.wgsl
@@ -0,0 +1,36 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_25 : f32 = x_5.injectionSwitch.y;
+  switch(i32(x_25)) {
+    case -1: {
+      let x_30 : f32 = x_5.injectionSwitch.y;
+      let x_32 : f32 = x_5.injectionSwitch.x;
+      if ((x_30 > x_32)) {
+        discard;
+      }
+    }
+    default: {
+    }
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-if-discard/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/switch-if-discard/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..89dad7e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-if-discard/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,37 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const float x_25 = asfloat(x_5[0].y);
+  switch(int(x_25)) {
+    case -1: {
+      const float x_30 = asfloat(x_5[0].y);
+      const float x_32 = asfloat(x_5[0].x);
+      if ((x_30 > x_32)) {
+        discard;
+      }
+      break;
+    }
+    default: {
+      break;
+    }
+  }
+  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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-if-discard/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/switch-if-discard/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..e06f14d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-if-discard/0-opt.wgsl.expected.msl
@@ -0,0 +1,40 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  float const x_25 = x_5.injectionSwitch.y;
+  switch(int(x_25)) {
+    case -1: {
+      float const x_30 = x_5.injectionSwitch.y;
+      float const x_32 = x_5.injectionSwitch.x;
+      if ((x_30 > x_32)) {
+        discard_fragment();
+      }
+      break;
+    }
+    default: {
+      break;
+    }
+  }
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-if-discard/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/switch-if-discard/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..33527de
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-if-discard/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,91 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 50
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+        %int = OpTypeInt 32 1
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %37 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %38 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+         %20 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %uint_1
+         %21 = OpLoad %float %20
+         %23 = OpConvertFToS %int %21
+               OpSelectionMerge %22 None
+               OpSwitch %23 %25 -1 %26
+         %26 = OpLabel
+         %27 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %uint_1
+         %28 = OpLoad %float %27
+         %29 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %uint_0
+         %30 = OpLoad %float %29
+         %31 = OpFOrdGreaterThan %bool %28 %30
+               OpSelectionMerge %33 None
+               OpBranchConditional %31 %34 %33
+         %34 = OpLabel
+               OpKill
+         %33 = OpLabel
+               OpBranch %22
+         %25 = OpLabel
+               OpBranch %22
+         %22 = OpLabel
+               OpStore %x_GLF_color %37
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %38
+%tint_symbol = OpFunctionParameter %main_out
+         %42 = OpLabel
+         %43 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %43
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %45 = OpLabel
+         %46 = OpFunctionCall %void %main_1
+         %48 = OpLoad %v4float %x_GLF_color
+         %49 = OpCompositeConstruct %main_out %48
+         %47 = OpFunctionCall %void %tint_symbol_2 %49
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-if-discard/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/switch-if-discard/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..2a93d7f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-if-discard/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,36 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  let x_25 : f32 = x_5.injectionSwitch.y;
+  switch(i32(x_25)) {
+    case -1: {
+      let x_30 : f32 = x_5.injectionSwitch.y;
+      let x_32 : f32 = x_5.injectionSwitch.x;
+      if ((x_30 > x_32)) {
+        discard;
+      }
+    }
+    default: {
+    }
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-inside-while-always-return/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/switch-inside-while-always-return/0-opt.spvasm
new file mode 100644
index 0000000..6f83ac1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-inside-while-always-return/0-opt.spvasm
@@ -0,0 +1,83 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %merge_ "merge("
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpName %res "res"
+               OpDecorate %merge_ RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %res RelaxedPrecision
+               OpDecorate %8 RelaxedPrecision
+               OpDecorate %9 RelaxedPrecision
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+         %13 = OpTypeFunction %int
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+         %23 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %false = OpConstantFalse %bool
+%_ptr_Function_int = OpTypePointer Function %int
+       %main = OpFunction %void None %11
+         %26 = OpLabel
+        %res = OpVariable %_ptr_Function_int Function
+               OpStore %_GLF_color %23
+               OpBranch %27
+         %27 = OpLabel
+               OpLoopMerge %28 %29 None
+               OpBranch %30
+         %30 = OpLabel
+         %31 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %32 = OpLoad %float %31
+         %33 = OpConvertFToS %int %32
+               OpSelectionMerge %34 None
+               OpSwitch %33 %34 0 %35
+         %35 = OpLabel
+               OpReturn
+         %34 = OpLabel
+               OpBranch %29
+         %29 = OpLabel
+               OpBranchConditional %false %27 %28
+         %28 = OpLabel
+          %8 = OpFunctionCall %int %merge_
+               OpStore %res %8
+          %9 = OpLoad %int %res
+         %36 = OpConvertSToF %float %9
+         %37 = OpCompositeConstruct %v4float %36 %36 %36 %36
+               OpStore %_GLF_color %37
+               OpReturn
+               OpFunctionEnd
+     %merge_ = OpFunction %int None %13
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_Uniform_float %_ %int_0
+         %40 = OpLoad %float %39
+         %41 = OpFOrdLessThan %bool %40 %float_0
+               OpSelectionMerge %42 None
+               OpBranchConditional %41 %43 %42
+         %43 = OpLabel
+               OpReturnValue %int_0
+         %42 = OpLabel
+         %44 = OpUndef %int
+               OpReturnValue %44
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-inside-while-always-return/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/switch-inside-while-always-return/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..804140c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-inside-while-always-return/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,54 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+int merge_() {
+  const float x_40 = asfloat(x_6[0].x);
+  if ((x_40 < 0.0f)) {
+    return 0;
+  }
+  return 0;
+}
+
+void main_1() {
+  int res = 0;
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  while (true) {
+    const float x_32 = asfloat(x_6[0].x);
+    switch(int(x_32)) {
+      case 0: {
+        return;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  const int x_8 = merge_();
+  res = x_8;
+  const float x_36 = float(res);
+  x_GLF_color = float4(x_36, x_36, x_36, x_36);
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-inside-while-always-return/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/switch-inside-while-always-return/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..e33cab5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-inside-while-always-return/0-opt.spvasm.expected.msl
@@ -0,0 +1,58 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float zero;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int merge_(constant buf0& x_6) {
+  float const x_40 = x_6.zero;
+  if ((x_40 < 0.0f)) {
+    return 0;
+  }
+  return 0;
+}
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int res = 0;
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  while (true) {
+    float const x_32 = x_6.zero;
+    switch(int(x_32)) {
+      case 0: {
+        return;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  int const x_8 = merge_(x_6);
+  res = x_8;
+  int const x_9 = res;
+  float const x_36 = float(x_9);
+  *(tint_symbol_4) = float4(x_36, x_36, x_36, x_36);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-inside-while-always-return/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/switch-inside-while-always-return/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..a32e26e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-inside-while-always-return/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,126 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 65
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %merge_ "merge_"
+               OpName %main_1 "main_1"
+               OpName %res "res"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+        %int = OpTypeInt 32 1
+         %11 = OpTypeFunction %int
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+      %int_0 = OpConstant %int 0
+       %void = OpTypeVoid
+         %26 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %32 = OpConstantNull %int
+    %float_1 = OpConstant %float 1
+         %34 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %false = OpConstantFalse %bool
+   %main_out = OpTypeStruct %v4float
+         %53 = OpTypeFunction %void %main_out
+     %merge_ = OpFunction %int None %11
+         %14 = OpLabel
+         %18 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0
+         %19 = OpLoad %float %18
+         %21 = OpFOrdLessThan %bool %19 %float_0
+               OpSelectionMerge %23 None
+               OpBranchConditional %21 %24 %23
+         %24 = OpLabel
+               OpReturnValue %int_0
+         %23 = OpLabel
+               OpReturnValue %int_0
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %26
+         %29 = OpLabel
+        %res = OpVariable %_ptr_Function_int Function %32
+               OpStore %x_GLF_color %34
+               OpBranch %35
+         %35 = OpLabel
+               OpLoopMerge %36 %37 None
+               OpBranch %38
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0
+         %40 = OpLoad %float %39
+         %42 = OpConvertFToS %int %40
+               OpSelectionMerge %41 None
+               OpSwitch %42 %43 0 %44
+         %44 = OpLabel
+               OpReturn
+         %43 = OpLabel
+               OpBranch %41
+         %41 = OpLabel
+               OpBranch %37
+         %37 = OpLabel
+               OpSelectionMerge %46 None
+               OpBranchConditional %false %47 %48
+         %47 = OpLabel
+               OpBranch %46
+         %48 = OpLabel
+               OpBranch %36
+         %46 = OpLabel
+               OpBranch %35
+         %36 = OpLabel
+         %49 = OpFunctionCall %int %merge_
+               OpStore %res %49
+         %50 = OpLoad %int %res
+         %51 = OpConvertSToF %float %50
+         %52 = OpCompositeConstruct %v4float %51 %51 %51 %51
+               OpStore %x_GLF_color %52
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %53
+%tint_symbol = OpFunctionParameter %main_out
+         %57 = OpLabel
+         %58 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %58
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %26
+         %60 = OpLabel
+         %61 = OpFunctionCall %void %main_1
+         %63 = OpLoad %v4float %x_GLF_color
+         %64 = OpCompositeConstruct %main_out %63
+         %62 = OpFunctionCall %void %tint_symbol_2 %64
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 37[%37] is not post dominated by the back-edge block 46[%46]
+  %46 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-inside-while-always-return/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/switch-inside-while-always-return/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..546668a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-inside-while-always-return/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,55 @@
+[[block]]
+struct buf0 {
+  zero : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn merge_() -> i32 {
+  let x_40 : f32 = x_6.zero;
+  if ((x_40 < 0.0)) {
+    return 0;
+  }
+  return 0;
+}
+
+fn main_1() {
+  var res : i32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  loop {
+    let x_32 : f32 = x_6.zero;
+    switch(i32(x_32)) {
+      case 0: {
+        return;
+      }
+      default: {
+      }
+    }
+
+    continuing {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_8 : i32 = merge_();
+  res = x_8;
+  let x_9 : i32 = res;
+  let x_36 : f32 = f32(x_9);
+  x_GLF_color = vec4<f32>(x_36, x_36, x_36, x_36);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-inside-while-always-return/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/switch-inside-while-always-return/0-opt.wgsl
new file mode 100644
index 0000000..546668a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-inside-while-always-return/0-opt.wgsl
@@ -0,0 +1,55 @@
+[[block]]
+struct buf0 {
+  zero : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn merge_() -> i32 {
+  let x_40 : f32 = x_6.zero;
+  if ((x_40 < 0.0)) {
+    return 0;
+  }
+  return 0;
+}
+
+fn main_1() {
+  var res : i32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  loop {
+    let x_32 : f32 = x_6.zero;
+    switch(i32(x_32)) {
+      case 0: {
+        return;
+      }
+      default: {
+      }
+    }
+
+    continuing {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_8 : i32 = merge_();
+  res = x_8;
+  let x_9 : i32 = res;
+  let x_36 : f32 = f32(x_9);
+  x_GLF_color = vec4<f32>(x_36, x_36, x_36, x_36);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-inside-while-always-return/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/switch-inside-while-always-return/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..804140c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-inside-while-always-return/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,54 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+int merge_() {
+  const float x_40 = asfloat(x_6[0].x);
+  if ((x_40 < 0.0f)) {
+    return 0;
+  }
+  return 0;
+}
+
+void main_1() {
+  int res = 0;
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  while (true) {
+    const float x_32 = asfloat(x_6[0].x);
+    switch(int(x_32)) {
+      case 0: {
+        return;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  const int x_8 = merge_();
+  res = x_8;
+  const float x_36 = float(res);
+  x_GLF_color = float4(x_36, x_36, x_36, x_36);
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-inside-while-always-return/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/switch-inside-while-always-return/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..e33cab5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-inside-while-always-return/0-opt.wgsl.expected.msl
@@ -0,0 +1,58 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float zero;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int merge_(constant buf0& x_6) {
+  float const x_40 = x_6.zero;
+  if ((x_40 < 0.0f)) {
+    return 0;
+  }
+  return 0;
+}
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int res = 0;
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  while (true) {
+    float const x_32 = x_6.zero;
+    switch(int(x_32)) {
+      case 0: {
+        return;
+        break;
+      }
+      default: {
+        break;
+      }
+    }
+    {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  int const x_8 = merge_(x_6);
+  res = x_8;
+  int const x_9 = res;
+  float const x_36 = float(x_9);
+  *(tint_symbol_4) = float4(x_36, x_36, x_36, x_36);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-inside-while-always-return/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/switch-inside-while-always-return/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..a32e26e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-inside-while-always-return/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,126 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 65
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "zero"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %merge_ "merge_"
+               OpName %main_1 "main_1"
+               OpName %res "res"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+       %buf0 = OpTypeStruct %float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+        %int = OpTypeInt 32 1
+         %11 = OpTypeFunction %int
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+      %int_0 = OpConstant %int 0
+       %void = OpTypeVoid
+         %26 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %32 = OpConstantNull %int
+    %float_1 = OpConstant %float 1
+         %34 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %false = OpConstantFalse %bool
+   %main_out = OpTypeStruct %v4float
+         %53 = OpTypeFunction %void %main_out
+     %merge_ = OpFunction %int None %11
+         %14 = OpLabel
+         %18 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0
+         %19 = OpLoad %float %18
+         %21 = OpFOrdLessThan %bool %19 %float_0
+               OpSelectionMerge %23 None
+               OpBranchConditional %21 %24 %23
+         %24 = OpLabel
+               OpReturnValue %int_0
+         %23 = OpLabel
+               OpReturnValue %int_0
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %26
+         %29 = OpLabel
+        %res = OpVariable %_ptr_Function_int Function %32
+               OpStore %x_GLF_color %34
+               OpBranch %35
+         %35 = OpLabel
+               OpLoopMerge %36 %37 None
+               OpBranch %38
+         %38 = OpLabel
+         %39 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0
+         %40 = OpLoad %float %39
+         %42 = OpConvertFToS %int %40
+               OpSelectionMerge %41 None
+               OpSwitch %42 %43 0 %44
+         %44 = OpLabel
+               OpReturn
+         %43 = OpLabel
+               OpBranch %41
+         %41 = OpLabel
+               OpBranch %37
+         %37 = OpLabel
+               OpSelectionMerge %46 None
+               OpBranchConditional %false %47 %48
+         %47 = OpLabel
+               OpBranch %46
+         %48 = OpLabel
+               OpBranch %36
+         %46 = OpLabel
+               OpBranch %35
+         %36 = OpLabel
+         %49 = OpFunctionCall %int %merge_
+               OpStore %res %49
+         %50 = OpLoad %int %res
+         %51 = OpConvertSToF %float %50
+         %52 = OpCompositeConstruct %v4float %51 %51 %51 %51
+               OpStore %x_GLF_color %52
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %53
+%tint_symbol = OpFunctionParameter %main_out
+         %57 = OpLabel
+         %58 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %58
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %26
+         %60 = OpLabel
+         %61 = OpFunctionCall %void %main_1
+         %63 = OpLoad %v4float %x_GLF_color
+         %64 = OpCompositeConstruct %main_out %63
+         %62 = OpFunctionCall %void %tint_symbol_2 %64
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 37[%37] is not post dominated by the back-edge block 46[%46]
+  %46 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-inside-while-always-return/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/switch-inside-while-always-return/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..546668a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-inside-while-always-return/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,55 @@
+[[block]]
+struct buf0 {
+  zero : f32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn merge_() -> i32 {
+  let x_40 : f32 = x_6.zero;
+  if ((x_40 < 0.0)) {
+    return 0;
+  }
+  return 0;
+}
+
+fn main_1() {
+  var res : i32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  loop {
+    let x_32 : f32 = x_6.zero;
+    switch(i32(x_32)) {
+      case 0: {
+        return;
+      }
+      default: {
+      }
+    }
+
+    continuing {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_8 : i32 = merge_();
+  res = x_8;
+  let x_9 : i32 = res;
+  let x_36 : f32 = f32(x_9);
+  x_GLF_color = vec4<f32>(x_36, x_36, x_36, x_36);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.spvasm
new file mode 100644
index 0000000..099b620
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.spvasm
@@ -0,0 +1,134 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %i "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %i RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %7 RelaxedPrecision
+               OpDecorate %8 RelaxedPrecision
+               OpDecorate %9 RelaxedPrecision
+               OpDecorate %10 RelaxedPrecision
+               OpDecorate %11 RelaxedPrecision
+               OpDecorate %12 RelaxedPrecision
+               OpDecorate %13 RelaxedPrecision
+               OpDecorate %14 RelaxedPrecision
+               OpDecorate %15 RelaxedPrecision
+               OpDecorate %16 RelaxedPrecision
+               OpDecorate %17 RelaxedPrecision
+               OpDecorate %18 RelaxedPrecision
+               OpDecorate %19 RelaxedPrecision
+               OpDecorate %20 RelaxedPrecision
+               OpDecorate %21 RelaxedPrecision
+               OpDecorate %22 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %24 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+      %int_5 = OpConstant %int 5
+      %int_7 = OpConstant %int 7
+    %int_200 = OpConstant %int 200
+       %bool = OpTypeBool
+    %int_100 = OpConstant %int 100
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+     %int_n2 = OpConstant %int -2
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %47 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %48 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %24
+         %49 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+         %50 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %51 = OpLoad %float %50
+          %7 = OpConvertFToS %int %51
+               OpStore %i %7
+          %8 = OpLoad %int %i
+               OpSelectionMerge %52 None
+               OpSwitch %8 %53 0 %54
+         %53 = OpLabel
+         %20 = OpLoad %int %i
+         %21 = OpISub %int %20 %int_3
+               OpStore %i %21
+               OpBranch %52
+         %54 = OpLabel
+               OpBranch %55
+         %55 = OpLabel
+               OpLoopMerge %56 %57 None
+               OpBranch %58
+         %58 = OpLabel
+          %9 = OpLoad %int %i
+         %10 = OpIAdd %int %9 %int_1
+               OpStore %i %10
+         %11 = OpLoad %int %i
+               OpSelectionMerge %59 None
+               OpSwitch %11 %60 1 %61 2 %62
+         %60 = OpLabel
+         %14 = OpLoad %int %i
+         %15 = OpIAdd %int %14 %int_7
+               OpStore %i %15
+               OpBranch %59
+         %61 = OpLabel
+               OpBranch %57
+         %62 = OpLabel
+         %12 = OpLoad %int %i
+         %13 = OpIAdd %int %12 %int_5
+               OpStore %i %13
+               OpBranch %59
+         %59 = OpLabel
+               OpBranch %57
+         %57 = OpLabel
+         %16 = OpLoad %int %i
+         %63 = OpSGreaterThan %bool %16 %int_200
+               OpBranchConditional %63 %55 %56
+         %56 = OpLabel
+         %17 = OpLoad %int %i
+         %64 = OpSGreaterThan %bool %17 %int_100
+               OpSelectionMerge %65 None
+               OpBranchConditional %64 %66 %65
+         %66 = OpLabel
+         %18 = OpLoad %int %i
+         %19 = OpISub %int %18 %int_2
+               OpStore %i %19
+               OpBranch %52
+         %65 = OpLabel
+               OpBranch %53
+         %52 = OpLabel
+         %22 = OpLoad %int %i
+         %67 = OpIEqual %bool %22 %int_n2
+               OpSelectionMerge %68 None
+               OpBranchConditional %67 %69 %70
+         %69 = OpLabel
+               OpStore %_GLF_color %47
+               OpBranch %68
+         %70 = OpLabel
+               OpStore %_GLF_color %48
+               OpBranch %68
+         %68 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..68b63f9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,72 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int i = 0;
+  const float x_51 = asfloat(x_6[0].x);
+  i = int(x_51);
+  switch(i) {
+    case 0: {
+      while (true) {
+        i = (i + 1);
+        switch(i) {
+          case 2: {
+            i = (i + 5);
+            break;
+          }
+          case 1: {
+            {
+              if ((i > 200)) {
+              } else {
+                break;
+              }
+            }
+            continue;
+            break;
+          }
+          default: {
+            i = (i + 7);
+            break;
+          }
+        }
+        {
+          if ((i > 200)) {
+          } else {
+            break;
+          }
+        }
+      }
+      if ((i > 100)) {
+        i = (i - 2);
+        break;
+      }
+      /* fallthrough */
+    }
+    default: {
+      i = (i - 3);
+      break;
+    }
+  }
+  if ((i == -2)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..dbb6a91
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.spvasm.expected.msl
@@ -0,0 +1,86 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int i = 0;
+  float const x_51 = x_6.injectionSwitch.x;
+  i = int(x_51);
+  int const x_8 = i;
+  switch(x_8) {
+    case 0: {
+      while (true) {
+        int const x_9 = i;
+        i = (x_9 + 1);
+        int const x_11 = i;
+        switch(x_11) {
+          case 2: {
+            int const x_12 = i;
+            i = (x_12 + 5);
+            break;
+          }
+          case 1: {
+            {
+              int const x_16 = i;
+              if ((x_16 > 200)) {
+              } else {
+                break;
+              }
+            }
+            continue;
+            break;
+          }
+          default: {
+            int const x_14 = i;
+            i = (x_14 + 7);
+            break;
+          }
+        }
+        {
+          int const x_16 = i;
+          if ((x_16 > 200)) {
+          } else {
+            break;
+          }
+        }
+      }
+      int const x_17 = i;
+      if ((x_17 > 100)) {
+        int const x_18 = i;
+        i = (x_18 - 2);
+        break;
+      }
+      /* fallthrough */
+    }
+    default: {
+      int const x_20 = i;
+      i = (x_20 - 3);
+      break;
+    }
+  }
+  int const x_22 = i;
+  if ((x_22 == -2)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..8c6337d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,160 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 88
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %19 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+      %int_5 = OpConstant %int 5
+      %int_7 = OpConstant %int 7
+    %int_200 = OpConstant %int 200
+       %bool = OpTypeBool
+    %int_100 = OpConstant %int 100
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+     %int_n2 = OpConstant %int -2
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %74 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %75 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %76 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %19
+         %23 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+         %24 = OpLoad %float %23
+         %25 = OpConvertFToS %int %24
+               OpStore %i %25
+         %26 = OpLoad %int %i
+               OpSelectionMerge %27 None
+               OpSwitch %26 %28 0 %29
+         %29 = OpLabel
+               OpBranch %30
+         %30 = OpLabel
+               OpLoopMerge %31 %32 None
+               OpBranch %33
+         %33 = OpLabel
+         %34 = OpLoad %int %i
+         %36 = OpIAdd %int %34 %int_1
+               OpStore %i %36
+         %37 = OpLoad %int %i
+               OpSelectionMerge %38 None
+               OpSwitch %37 %39 2 %40 1 %41
+         %40 = OpLabel
+         %42 = OpLoad %int %i
+         %44 = OpIAdd %int %42 %int_5
+               OpStore %i %44
+               OpBranch %38
+         %41 = OpLabel
+               OpBranch %32
+         %39 = OpLabel
+         %45 = OpLoad %int %i
+         %47 = OpIAdd %int %45 %int_7
+               OpStore %i %47
+               OpBranch %38
+         %38 = OpLabel
+               OpBranch %32
+         %32 = OpLabel
+         %48 = OpLoad %int %i
+         %50 = OpSGreaterThan %bool %48 %int_200
+               OpSelectionMerge %52 None
+               OpBranchConditional %50 %53 %54
+         %53 = OpLabel
+               OpBranch %52
+         %54 = OpLabel
+               OpBranch %31
+         %52 = OpLabel
+               OpBranch %30
+         %31 = OpLabel
+         %55 = OpLoad %int %i
+         %57 = OpSGreaterThan %bool %55 %int_100
+               OpSelectionMerge %58 None
+               OpBranchConditional %57 %59 %58
+         %59 = OpLabel
+         %60 = OpLoad %int %i
+         %62 = OpISub %int %60 %int_2
+               OpStore %i %62
+               OpBranch %27
+         %58 = OpLabel
+               OpBranch %28
+         %28 = OpLabel
+         %63 = OpLoad %int %i
+         %65 = OpISub %int %63 %int_3
+               OpStore %i %65
+               OpBranch %27
+         %27 = OpLabel
+         %66 = OpLoad %int %i
+         %68 = OpIEqual %bool %66 %int_n2
+               OpSelectionMerge %69 None
+               OpBranchConditional %68 %70 %71
+         %70 = OpLabel
+               OpStore %x_GLF_color %74
+               OpBranch %69
+         %71 = OpLabel
+               OpStore %x_GLF_color %75
+               OpBranch %69
+         %69 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %76
+%tint_symbol = OpFunctionParameter %main_out
+         %80 = OpLabel
+         %81 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %81
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %83 = OpLabel
+         %84 = OpFunctionCall %void %main_1
+         %86 = OpLoad %v4float %x_GLF_color
+         %87 = OpCompositeConstruct %main_out %86
+         %85 = OpFunctionCall %void %tint_symbol_2 %87
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 32[%32] is not post dominated by the back-edge block 52[%52]
+  %52 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..8c6c5d7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,74 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  let x_51 : f32 = x_6.injectionSwitch.x;
+  i = i32(x_51);
+  let x_8 : i32 = i;
+  switch(x_8) {
+    case 0: {
+      loop {
+        let x_9 : i32 = i;
+        i = (x_9 + 1);
+        let x_11 : i32 = i;
+        switch(x_11) {
+          case 2: {
+            let x_12 : i32 = i;
+            i = (x_12 + 5);
+          }
+          case 1: {
+            continue;
+          }
+          default: {
+            let x_14 : i32 = i;
+            i = (x_14 + 7);
+          }
+        }
+
+        continuing {
+          let x_16 : i32 = i;
+          if ((x_16 > 200)) {
+          } else {
+            break;
+          }
+        }
+      }
+      let x_17 : i32 = i;
+      if ((x_17 > 100)) {
+        let x_18 : i32 = i;
+        i = (x_18 - 2);
+        break;
+      }
+      fallthrough;
+    }
+    default: {
+      let x_20 : i32 = i;
+      i = (x_20 - 3);
+    }
+  }
+  let x_22 : i32 = i;
+  if ((x_22 == -2)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.wgsl
new file mode 100644
index 0000000..8c6c5d7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.wgsl
@@ -0,0 +1,74 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  let x_51 : f32 = x_6.injectionSwitch.x;
+  i = i32(x_51);
+  let x_8 : i32 = i;
+  switch(x_8) {
+    case 0: {
+      loop {
+        let x_9 : i32 = i;
+        i = (x_9 + 1);
+        let x_11 : i32 = i;
+        switch(x_11) {
+          case 2: {
+            let x_12 : i32 = i;
+            i = (x_12 + 5);
+          }
+          case 1: {
+            continue;
+          }
+          default: {
+            let x_14 : i32 = i;
+            i = (x_14 + 7);
+          }
+        }
+
+        continuing {
+          let x_16 : i32 = i;
+          if ((x_16 > 200)) {
+          } else {
+            break;
+          }
+        }
+      }
+      let x_17 : i32 = i;
+      if ((x_17 > 100)) {
+        let x_18 : i32 = i;
+        i = (x_18 - 2);
+        break;
+      }
+      fallthrough;
+    }
+    default: {
+      let x_20 : i32 = i;
+      i = (x_20 - 3);
+    }
+  }
+  let x_22 : i32 = i;
+  if ((x_22 == -2)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..68b63f9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,72 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int i = 0;
+  const float x_51 = asfloat(x_6[0].x);
+  i = int(x_51);
+  switch(i) {
+    case 0: {
+      while (true) {
+        i = (i + 1);
+        switch(i) {
+          case 2: {
+            i = (i + 5);
+            break;
+          }
+          case 1: {
+            {
+              if ((i > 200)) {
+              } else {
+                break;
+              }
+            }
+            continue;
+            break;
+          }
+          default: {
+            i = (i + 7);
+            break;
+          }
+        }
+        {
+          if ((i > 200)) {
+          } else {
+            break;
+          }
+        }
+      }
+      if ((i > 100)) {
+        i = (i - 2);
+        break;
+      }
+      /* fallthrough */
+    }
+    default: {
+      i = (i - 3);
+      break;
+    }
+  }
+  if ((i == -2)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..dbb6a91
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.wgsl.expected.msl
@@ -0,0 +1,86 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int i = 0;
+  float const x_51 = x_6.injectionSwitch.x;
+  i = int(x_51);
+  int const x_8 = i;
+  switch(x_8) {
+    case 0: {
+      while (true) {
+        int const x_9 = i;
+        i = (x_9 + 1);
+        int const x_11 = i;
+        switch(x_11) {
+          case 2: {
+            int const x_12 = i;
+            i = (x_12 + 5);
+            break;
+          }
+          case 1: {
+            {
+              int const x_16 = i;
+              if ((x_16 > 200)) {
+              } else {
+                break;
+              }
+            }
+            continue;
+            break;
+          }
+          default: {
+            int const x_14 = i;
+            i = (x_14 + 7);
+            break;
+          }
+        }
+        {
+          int const x_16 = i;
+          if ((x_16 > 200)) {
+          } else {
+            break;
+          }
+        }
+      }
+      int const x_17 = i;
+      if ((x_17 > 100)) {
+        int const x_18 = i;
+        i = (x_18 - 2);
+        break;
+      }
+      /* fallthrough */
+    }
+    default: {
+      int const x_20 = i;
+      i = (x_20 - 3);
+      break;
+    }
+  }
+  int const x_22 = i;
+  if ((x_22 == -2)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..8c6337d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,160 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 88
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %19 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+      %int_5 = OpConstant %int 5
+      %int_7 = OpConstant %int 7
+    %int_200 = OpConstant %int 200
+       %bool = OpTypeBool
+    %int_100 = OpConstant %int 100
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+     %int_n2 = OpConstant %int -2
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %74 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %75 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %76 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %19
+         %23 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+         %24 = OpLoad %float %23
+         %25 = OpConvertFToS %int %24
+               OpStore %i %25
+         %26 = OpLoad %int %i
+               OpSelectionMerge %27 None
+               OpSwitch %26 %28 0 %29
+         %29 = OpLabel
+               OpBranch %30
+         %30 = OpLabel
+               OpLoopMerge %31 %32 None
+               OpBranch %33
+         %33 = OpLabel
+         %34 = OpLoad %int %i
+         %36 = OpIAdd %int %34 %int_1
+               OpStore %i %36
+         %37 = OpLoad %int %i
+               OpSelectionMerge %38 None
+               OpSwitch %37 %39 2 %40 1 %41
+         %40 = OpLabel
+         %42 = OpLoad %int %i
+         %44 = OpIAdd %int %42 %int_5
+               OpStore %i %44
+               OpBranch %38
+         %41 = OpLabel
+               OpBranch %32
+         %39 = OpLabel
+         %45 = OpLoad %int %i
+         %47 = OpIAdd %int %45 %int_7
+               OpStore %i %47
+               OpBranch %38
+         %38 = OpLabel
+               OpBranch %32
+         %32 = OpLabel
+         %48 = OpLoad %int %i
+         %50 = OpSGreaterThan %bool %48 %int_200
+               OpSelectionMerge %52 None
+               OpBranchConditional %50 %53 %54
+         %53 = OpLabel
+               OpBranch %52
+         %54 = OpLabel
+               OpBranch %31
+         %52 = OpLabel
+               OpBranch %30
+         %31 = OpLabel
+         %55 = OpLoad %int %i
+         %57 = OpSGreaterThan %bool %55 %int_100
+               OpSelectionMerge %58 None
+               OpBranchConditional %57 %59 %58
+         %59 = OpLabel
+         %60 = OpLoad %int %i
+         %62 = OpISub %int %60 %int_2
+               OpStore %i %62
+               OpBranch %27
+         %58 = OpLabel
+               OpBranch %28
+         %28 = OpLabel
+         %63 = OpLoad %int %i
+         %65 = OpISub %int %63 %int_3
+               OpStore %i %65
+               OpBranch %27
+         %27 = OpLabel
+         %66 = OpLoad %int %i
+         %68 = OpIEqual %bool %66 %int_n2
+               OpSelectionMerge %69 None
+               OpBranchConditional %68 %70 %71
+         %70 = OpLabel
+               OpStore %x_GLF_color %74
+               OpBranch %69
+         %71 = OpLabel
+               OpStore %x_GLF_color %75
+               OpBranch %69
+         %69 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %76
+%tint_symbol = OpFunctionParameter %main_out
+         %80 = OpLabel
+         %81 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %81
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %83 = OpLabel
+         %84 = OpFunctionCall %void %main_1
+         %86 = OpLoad %v4float %x_GLF_color
+         %87 = OpCompositeConstruct %main_out %86
+         %85 = OpFunctionCall %void %tint_symbol_2 %87
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 32[%32] is not post dominated by the back-edge block 52[%52]
+  %52 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..8c6c5d7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,74 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  let x_51 : f32 = x_6.injectionSwitch.x;
+  i = i32(x_51);
+  let x_8 : i32 = i;
+  switch(x_8) {
+    case 0: {
+      loop {
+        let x_9 : i32 = i;
+        i = (x_9 + 1);
+        let x_11 : i32 = i;
+        switch(x_11) {
+          case 2: {
+            let x_12 : i32 = i;
+            i = (x_12 + 5);
+          }
+          case 1: {
+            continue;
+          }
+          default: {
+            let x_14 : i32 = i;
+            i = (x_14 + 7);
+          }
+        }
+
+        continuing {
+          let x_16 : i32 = i;
+          if ((x_16 > 200)) {
+          } else {
+            break;
+          }
+        }
+      }
+      let x_17 : i32 = i;
+      if ((x_17 > 100)) {
+        let x_18 : i32 = i;
+        i = (x_18 - 2);
+        break;
+      }
+      fallthrough;
+    }
+    default: {
+      let x_20 : i32 = i;
+      i = (x_20 - 3);
+    }
+  }
+  let x_22 : i32 = i;
+  if ((x_22 == -2)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-with-empty-if-false/0.spvasm b/test/vk-gl-cts/graphicsfuzz/switch-with-empty-if-false/0.spvasm
new file mode 100644
index 0000000..87e0985
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-with-empty-if-false/0.spvasm
@@ -0,0 +1,37 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %5 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %15 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %5
+         %16 = OpLabel
+               OpSelectionMerge %17 None
+               OpSwitch %int_0 %17 0 %18
+         %18 = OpLabel
+               OpSelectionMerge %19 None
+               OpBranchConditional %false %20 %19
+         %20 = OpLabel
+               OpBranch %19
+         %19 = OpLabel
+               OpBranch %17
+         %17 = OpLabel
+               OpStore %_GLF_color %15
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-with-empty-if-false/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/switch-with-empty-if-false/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..3d10737
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-with-empty-if-false/0.spvasm.expected.hlsl
@@ -0,0 +1,30 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  switch(0) {
+    case 0: {
+      if (false) {
+      }
+      break;
+    }
+    default: {
+      break;
+    }
+  }
+  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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-with-empty-if-false/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/switch-with-empty-if-false/0.spvasm.expected.msl
new file mode 100644
index 0000000..0c08cdc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-with-empty-if-false/0.spvasm.expected.msl
@@ -0,0 +1,33 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  switch(0) {
+    case 0: {
+      if (false) {
+      }
+      break;
+    }
+    default: {
+      break;
+    }
+  }
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-with-empty-if-false/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/switch-with-empty-if-false/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..f8108c8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-with-empty-if-false/0.spvasm.expected.spvasm
@@ -0,0 +1,69 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 36
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %23 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %24 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+               OpSelectionMerge %12 None
+               OpSwitch %int_0 %15 0 %16
+         %16 = OpLabel
+               OpSelectionMerge %19 None
+               OpBranchConditional %false %20 %19
+         %20 = OpLabel
+               OpBranch %19
+         %19 = OpLabel
+               OpBranch %12
+         %15 = OpLabel
+               OpBranch %12
+         %12 = OpLabel
+               OpStore %x_GLF_color %23
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %24
+%tint_symbol = OpFunctionParameter %main_out
+         %28 = OpLabel
+         %29 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %29
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %31 = OpLabel
+         %32 = OpFunctionCall %void %main_1
+         %34 = OpLoad %v4float %x_GLF_color
+         %35 = OpCompositeConstruct %main_out %34
+         %33 = OpFunctionCall %void %tint_symbol_2 %35
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-with-empty-if-false/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/switch-with-empty-if-false/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..cdab78b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-with-empty-if-false/0.spvasm.expected.wgsl
@@ -0,0 +1,25 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  switch(0) {
+    case 0: {
+      if (false) {
+      }
+    }
+    default: {
+    }
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-with-empty-if-false/0.wgsl b/test/vk-gl-cts/graphicsfuzz/switch-with-empty-if-false/0.wgsl
new file mode 100644
index 0000000..cdab78b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-with-empty-if-false/0.wgsl
@@ -0,0 +1,25 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  switch(0) {
+    case 0: {
+      if (false) {
+      }
+    }
+    default: {
+    }
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-with-empty-if-false/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/switch-with-empty-if-false/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..3d10737
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-with-empty-if-false/0.wgsl.expected.hlsl
@@ -0,0 +1,30 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  switch(0) {
+    case 0: {
+      if (false) {
+      }
+      break;
+    }
+    default: {
+      break;
+    }
+  }
+  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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-with-empty-if-false/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/switch-with-empty-if-false/0.wgsl.expected.msl
new file mode 100644
index 0000000..0c08cdc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-with-empty-if-false/0.wgsl.expected.msl
@@ -0,0 +1,33 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  switch(0) {
+    case 0: {
+      if (false) {
+      }
+      break;
+    }
+    default: {
+      break;
+    }
+  }
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-with-empty-if-false/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/switch-with-empty-if-false/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..f8108c8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-with-empty-if-false/0.wgsl.expected.spvasm
@@ -0,0 +1,69 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 36
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %23 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %24 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+               OpSelectionMerge %12 None
+               OpSwitch %int_0 %15 0 %16
+         %16 = OpLabel
+               OpSelectionMerge %19 None
+               OpBranchConditional %false %20 %19
+         %20 = OpLabel
+               OpBranch %19
+         %19 = OpLabel
+               OpBranch %12
+         %15 = OpLabel
+               OpBranch %12
+         %12 = OpLabel
+               OpStore %x_GLF_color %23
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %24
+%tint_symbol = OpFunctionParameter %main_out
+         %28 = OpLabel
+         %29 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %29
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %31 = OpLabel
+         %32 = OpFunctionCall %void %main_1
+         %34 = OpLoad %v4float %x_GLF_color
+         %35 = OpCompositeConstruct %main_out %34
+         %33 = OpFunctionCall %void %tint_symbol_2 %35
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-with-empty-if-false/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/switch-with-empty-if-false/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..cdab78b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-with-empty-if-false/0.wgsl.expected.wgsl
@@ -0,0 +1,25 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  switch(0) {
+    case 0: {
+      if (false) {
+      }
+    }
+    default: {
+    }
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.spvasm
new file mode 100644
index 0000000..20a942d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.spvasm
@@ -0,0 +1,96 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %i "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %value "value"
+               OpName %y "y"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+%_ptr_Function_float = OpTypePointer Function %float
+  %float_0_5 = OpConstant %float 0.5
+    %float_1 = OpConstant %float 1
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+       %main = OpFunction %void None %10
+         %29 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+      %value = OpVariable %_ptr_Function_int Function
+          %y = OpVariable %_ptr_Function_float Function
+               OpStore %i %int_0
+               OpBranch %30
+         %30 = OpLabel
+         %31 = OpPhi %int %int_0 %29 %32 %33
+               OpLoopMerge %34 %33 None
+               OpBranch %35
+         %35 = OpLabel
+         %36 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %37 = OpLoad %float %36
+         %38 = OpConvertFToS %int %37
+         %39 = OpIAdd %int %int_2 %38
+         %40 = OpSLessThan %bool %31 %39
+               OpBranchConditional %40 %41 %34
+         %41 = OpLabel
+               OpStore %value %31
+               OpStore %y %float_0_5
+               OpSelectionMerge %42 None
+               OpSwitch %31 %43 0 %44 1 %45 2 %43
+         %43 = OpLabel
+         %46 = OpPhi %float %float_0_5 %41 %47 %45
+         %48 = OpFOrdEqual %bool %46 %float_1
+               OpSelectionMerge %49 None
+               OpBranchConditional %48 %50 %49
+         %50 = OpLabel
+         %51 = OpIAdd %int %31 %int_1
+         %52 = OpConvertSToF %float %51
+         %53 = OpCompositeConstruct %v4float %52 %float_0 %float_0 %float_1
+               OpStore %_GLF_color %53
+               OpReturn
+         %49 = OpLabel
+               OpBranch %42
+         %44 = OpLabel
+         %54 = OpFAdd %float %float_0_5 %float_0_5
+               OpStore %y %54
+               OpBranch %45
+         %45 = OpLabel
+         %55 = OpPhi %float %float_0_5 %41 %54 %44
+         %47 = OpExtInst %float %1 FClamp %float_1 %float_0_5 %55
+               OpStore %y %47
+               OpBranch %43
+         %42 = OpLabel
+               OpBranch %33
+         %33 = OpLabel
+         %32 = OpIAdd %int %31 %int_1
+               OpStore %i %32
+               OpBranch %30
+         %34 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..437ce74
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,71 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int i = 0;
+  int value = 0;
+  float y = 0.0f;
+  int x_31_phi = 0;
+  i = 0;
+  x_31_phi = 0;
+  while (true) {
+    const int x_31 = x_31_phi;
+    const float x_37 = asfloat(x_6[0].x);
+    if ((x_31 < (2 + int(x_37)))) {
+    } else {
+      break;
+    }
+    float x_55_phi = 0.0f;
+    float x_46_phi = 0.0f;
+    value = x_31;
+    y = 0.5f;
+    x_55_phi = 0.5f;
+    x_46_phi = 0.5f;
+    switch(x_31) {
+      case 0: {
+        const float x_54 = (0.5f + 0.5f);
+        y = x_54;
+        x_55_phi = x_54;
+        /* fallthrough */
+      }
+      case 1: {
+        const float x_47 = clamp(1.0f, 0.5f, x_55_phi);
+        y = x_47;
+        x_46_phi = x_47;
+        /* fallthrough */
+      }
+      default: {
+        /* fallthrough */
+      }
+      case 2: {
+        if ((x_46_phi == 1.0f)) {
+          x_GLF_color = float4(float((x_31 + 1)), 0.0f, 0.0f, 1.0f);
+          return;
+        }
+        break;
+      }
+    }
+    {
+      const int x_32 = (x_31 + 1);
+      i = x_32;
+      x_31_phi = x_32;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..084529b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.spvasm.expected.msl
@@ -0,0 +1,76 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int i = 0;
+  int value = 0;
+  float y = 0.0f;
+  int x_31_phi = 0;
+  i = 0;
+  x_31_phi = 0;
+  while (true) {
+    int const x_31 = x_31_phi;
+    float const x_37 = x_6.injectionSwitch.x;
+    if ((x_31 < (2 + int(x_37)))) {
+    } else {
+      break;
+    }
+    float x_55_phi = 0.0f;
+    float x_46_phi = 0.0f;
+    value = x_31;
+    y = 0.5f;
+    x_55_phi = 0.5f;
+    x_46_phi = 0.5f;
+    switch(x_31) {
+      case 0: {
+        float const x_54 = (0.5f + 0.5f);
+        y = x_54;
+        x_55_phi = x_54;
+        /* fallthrough */
+      }
+      case 1: {
+        float const x_55 = x_55_phi;
+        float const x_47 = clamp(1.0f, 0.5f, x_55);
+        y = x_47;
+        x_46_phi = x_47;
+        /* fallthrough */
+      }
+      default: {
+        /* fallthrough */
+      }
+      case 2: {
+        float const x_46 = x_46_phi;
+        if ((x_46 == 1.0f)) {
+          *(tint_symbol_4) = float4(float((x_31 + 1)), 0.0f, 0.0f, 1.0f);
+          return;
+        }
+        break;
+      }
+    }
+    {
+      int const x_32 = (x_31 + 1);
+      i = x_32;
+      x_31_phi = x_32;
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..387a26a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,149 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 79
+; Schema: 0
+               OpCapability Shader
+         %55 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %value "value"
+               OpName %y "y"
+               OpName %x_31_phi "x_31_phi"
+               OpName %x_55_phi "x_55_phi"
+               OpName %x_46_phi "x_46_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %19 = OpConstantNull %int
+%_ptr_Function_float = OpTypePointer Function %float
+         %23 = OpConstantNull %float
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+  %float_0_5 = OpConstant %float 0.5
+    %float_1 = OpConstant %float 1
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+   %main_out = OpTypeStruct %v4float
+         %67 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %19
+      %value = OpVariable %_ptr_Function_int Function %19
+          %y = OpVariable %_ptr_Function_float Function %23
+   %x_31_phi = OpVariable %_ptr_Function_int Function %19
+   %x_55_phi = OpVariable %_ptr_Function_float Function %23
+   %x_46_phi = OpVariable %_ptr_Function_float Function %23
+               OpStore %i %int_0
+               OpStore %x_31_phi %int_0
+               OpBranch %26
+         %26 = OpLabel
+               OpLoopMerge %27 %28 None
+               OpBranch %29
+         %29 = OpLabel
+         %30 = OpLoad %int %x_31_phi
+         %34 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+         %35 = OpLoad %float %34
+         %37 = OpConvertFToS %int %35
+         %38 = OpIAdd %int %int_2 %37
+         %39 = OpSLessThan %bool %30 %38
+               OpSelectionMerge %41 None
+               OpBranchConditional %39 %42 %43
+         %42 = OpLabel
+               OpBranch %41
+         %43 = OpLabel
+               OpBranch %27
+         %41 = OpLabel
+               OpStore %value %30
+               OpStore %y %float_0_5
+               OpStore %x_55_phi %float_0_5
+               OpStore %x_46_phi %float_0_5
+               OpSelectionMerge %47 None
+               OpSwitch %30 %48 0 %49 1 %50 2 %51
+         %49 = OpLabel
+         %52 = OpFAdd %float %float_0_5 %float_0_5
+               OpStore %y %52
+               OpStore %x_55_phi %52
+               OpBranch %50
+         %50 = OpLabel
+         %53 = OpLoad %float %x_55_phi
+         %54 = OpExtInst %float %55 NClamp %float_1 %float_0_5 %53
+               OpStore %y %54
+               OpStore %x_46_phi %54
+               OpBranch %48
+         %48 = OpLabel
+               OpBranch %51
+         %51 = OpLabel
+         %57 = OpLoad %float %x_46_phi
+         %58 = OpFOrdEqual %bool %57 %float_1
+               OpSelectionMerge %59 None
+               OpBranchConditional %58 %60 %59
+         %60 = OpLabel
+         %63 = OpIAdd %int %30 %int_1
+         %61 = OpConvertSToF %float %63
+         %65 = OpCompositeConstruct %v4float %61 %float_0 %float_0 %float_1
+               OpStore %x_GLF_color %65
+               OpReturn
+         %59 = OpLabel
+               OpBranch %47
+         %47 = OpLabel
+               OpBranch %28
+         %28 = OpLabel
+         %66 = OpIAdd %int %30 %int_1
+               OpStore %i %66
+               OpStore %x_31_phi %66
+               OpBranch %26
+         %27 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %67
+%tint_symbol = OpFunctionParameter %main_out
+         %71 = OpLabel
+         %72 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %72
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %74 = OpLabel
+         %75 = OpFunctionCall %void %main_1
+         %77 = OpLoad %v4float %x_GLF_color
+         %78 = OpCompositeConstruct %main_out %77
+         %76 = OpFunctionCall %void %tint_symbol_2 %78
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..b469ccc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,74 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  var value : i32;
+  var y : f32;
+  var x_31_phi : i32;
+  i = 0;
+  x_31_phi = 0;
+  loop {
+    let x_31 : i32 = x_31_phi;
+    let x_37 : f32 = x_6.injectionSwitch.x;
+    if ((x_31 < (2 + i32(x_37)))) {
+    } else {
+      break;
+    }
+    var x_55_phi : f32;
+    var x_46_phi : f32;
+    value = x_31;
+    y = 0.5;
+    x_55_phi = 0.5;
+    x_46_phi = 0.5;
+    switch(x_31) {
+      case 0: {
+        let x_54 : f32 = (0.5 + 0.5);
+        y = x_54;
+        x_55_phi = x_54;
+        fallthrough;
+      }
+      case 1: {
+        let x_55 : f32 = x_55_phi;
+        let x_47 : f32 = clamp(1.0, 0.5, x_55);
+        y = x_47;
+        x_46_phi = x_47;
+        fallthrough;
+      }
+      default: {
+        fallthrough;
+      }
+      case 2: {
+        let x_46 : f32 = x_46_phi;
+        if ((x_46 == 1.0)) {
+          x_GLF_color = vec4<f32>(f32((x_31 + 1)), 0.0, 0.0, 1.0);
+          return;
+        }
+      }
+    }
+
+    continuing {
+      let x_32 : i32 = (x_31 + 1);
+      i = x_32;
+      x_31_phi = x_32;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.wgsl
new file mode 100644
index 0000000..b469ccc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.wgsl
@@ -0,0 +1,74 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  var value : i32;
+  var y : f32;
+  var x_31_phi : i32;
+  i = 0;
+  x_31_phi = 0;
+  loop {
+    let x_31 : i32 = x_31_phi;
+    let x_37 : f32 = x_6.injectionSwitch.x;
+    if ((x_31 < (2 + i32(x_37)))) {
+    } else {
+      break;
+    }
+    var x_55_phi : f32;
+    var x_46_phi : f32;
+    value = x_31;
+    y = 0.5;
+    x_55_phi = 0.5;
+    x_46_phi = 0.5;
+    switch(x_31) {
+      case 0: {
+        let x_54 : f32 = (0.5 + 0.5);
+        y = x_54;
+        x_55_phi = x_54;
+        fallthrough;
+      }
+      case 1: {
+        let x_55 : f32 = x_55_phi;
+        let x_47 : f32 = clamp(1.0, 0.5, x_55);
+        y = x_47;
+        x_46_phi = x_47;
+        fallthrough;
+      }
+      default: {
+        fallthrough;
+      }
+      case 2: {
+        let x_46 : f32 = x_46_phi;
+        if ((x_46 == 1.0)) {
+          x_GLF_color = vec4<f32>(f32((x_31 + 1)), 0.0, 0.0, 1.0);
+          return;
+        }
+      }
+    }
+
+    continuing {
+      let x_32 : i32 = (x_31 + 1);
+      i = x_32;
+      x_31_phi = x_32;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..437ce74
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,71 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int i = 0;
+  int value = 0;
+  float y = 0.0f;
+  int x_31_phi = 0;
+  i = 0;
+  x_31_phi = 0;
+  while (true) {
+    const int x_31 = x_31_phi;
+    const float x_37 = asfloat(x_6[0].x);
+    if ((x_31 < (2 + int(x_37)))) {
+    } else {
+      break;
+    }
+    float x_55_phi = 0.0f;
+    float x_46_phi = 0.0f;
+    value = x_31;
+    y = 0.5f;
+    x_55_phi = 0.5f;
+    x_46_phi = 0.5f;
+    switch(x_31) {
+      case 0: {
+        const float x_54 = (0.5f + 0.5f);
+        y = x_54;
+        x_55_phi = x_54;
+        /* fallthrough */
+      }
+      case 1: {
+        const float x_47 = clamp(1.0f, 0.5f, x_55_phi);
+        y = x_47;
+        x_46_phi = x_47;
+        /* fallthrough */
+      }
+      default: {
+        /* fallthrough */
+      }
+      case 2: {
+        if ((x_46_phi == 1.0f)) {
+          x_GLF_color = float4(float((x_31 + 1)), 0.0f, 0.0f, 1.0f);
+          return;
+        }
+        break;
+      }
+    }
+    {
+      const int x_32 = (x_31 + 1);
+      i = x_32;
+      x_31_phi = x_32;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..084529b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.wgsl.expected.msl
@@ -0,0 +1,76 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int i = 0;
+  int value = 0;
+  float y = 0.0f;
+  int x_31_phi = 0;
+  i = 0;
+  x_31_phi = 0;
+  while (true) {
+    int const x_31 = x_31_phi;
+    float const x_37 = x_6.injectionSwitch.x;
+    if ((x_31 < (2 + int(x_37)))) {
+    } else {
+      break;
+    }
+    float x_55_phi = 0.0f;
+    float x_46_phi = 0.0f;
+    value = x_31;
+    y = 0.5f;
+    x_55_phi = 0.5f;
+    x_46_phi = 0.5f;
+    switch(x_31) {
+      case 0: {
+        float const x_54 = (0.5f + 0.5f);
+        y = x_54;
+        x_55_phi = x_54;
+        /* fallthrough */
+      }
+      case 1: {
+        float const x_55 = x_55_phi;
+        float const x_47 = clamp(1.0f, 0.5f, x_55);
+        y = x_47;
+        x_46_phi = x_47;
+        /* fallthrough */
+      }
+      default: {
+        /* fallthrough */
+      }
+      case 2: {
+        float const x_46 = x_46_phi;
+        if ((x_46 == 1.0f)) {
+          *(tint_symbol_4) = float4(float((x_31 + 1)), 0.0f, 0.0f, 1.0f);
+          return;
+        }
+        break;
+      }
+    }
+    {
+      int const x_32 = (x_31 + 1);
+      i = x_32;
+      x_31_phi = x_32;
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..387a26a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,149 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 79
+; Schema: 0
+               OpCapability Shader
+         %55 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %value "value"
+               OpName %y "y"
+               OpName %x_31_phi "x_31_phi"
+               OpName %x_55_phi "x_55_phi"
+               OpName %x_46_phi "x_46_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %19 = OpConstantNull %int
+%_ptr_Function_float = OpTypePointer Function %float
+         %23 = OpConstantNull %float
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+  %float_0_5 = OpConstant %float 0.5
+    %float_1 = OpConstant %float 1
+      %int_1 = OpConstant %int 1
+    %float_0 = OpConstant %float 0
+   %main_out = OpTypeStruct %v4float
+         %67 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %19
+      %value = OpVariable %_ptr_Function_int Function %19
+          %y = OpVariable %_ptr_Function_float Function %23
+   %x_31_phi = OpVariable %_ptr_Function_int Function %19
+   %x_55_phi = OpVariable %_ptr_Function_float Function %23
+   %x_46_phi = OpVariable %_ptr_Function_float Function %23
+               OpStore %i %int_0
+               OpStore %x_31_phi %int_0
+               OpBranch %26
+         %26 = OpLabel
+               OpLoopMerge %27 %28 None
+               OpBranch %29
+         %29 = OpLabel
+         %30 = OpLoad %int %x_31_phi
+         %34 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+         %35 = OpLoad %float %34
+         %37 = OpConvertFToS %int %35
+         %38 = OpIAdd %int %int_2 %37
+         %39 = OpSLessThan %bool %30 %38
+               OpSelectionMerge %41 None
+               OpBranchConditional %39 %42 %43
+         %42 = OpLabel
+               OpBranch %41
+         %43 = OpLabel
+               OpBranch %27
+         %41 = OpLabel
+               OpStore %value %30
+               OpStore %y %float_0_5
+               OpStore %x_55_phi %float_0_5
+               OpStore %x_46_phi %float_0_5
+               OpSelectionMerge %47 None
+               OpSwitch %30 %48 0 %49 1 %50 2 %51
+         %49 = OpLabel
+         %52 = OpFAdd %float %float_0_5 %float_0_5
+               OpStore %y %52
+               OpStore %x_55_phi %52
+               OpBranch %50
+         %50 = OpLabel
+         %53 = OpLoad %float %x_55_phi
+         %54 = OpExtInst %float %55 NClamp %float_1 %float_0_5 %53
+               OpStore %y %54
+               OpStore %x_46_phi %54
+               OpBranch %48
+         %48 = OpLabel
+               OpBranch %51
+         %51 = OpLabel
+         %57 = OpLoad %float %x_46_phi
+         %58 = OpFOrdEqual %bool %57 %float_1
+               OpSelectionMerge %59 None
+               OpBranchConditional %58 %60 %59
+         %60 = OpLabel
+         %63 = OpIAdd %int %30 %int_1
+         %61 = OpConvertSToF %float %63
+         %65 = OpCompositeConstruct %v4float %61 %float_0 %float_0 %float_1
+               OpStore %x_GLF_color %65
+               OpReturn
+         %59 = OpLabel
+               OpBranch %47
+         %47 = OpLabel
+               OpBranch %28
+         %28 = OpLabel
+         %66 = OpIAdd %int %30 %int_1
+               OpStore %i %66
+               OpStore %x_31_phi %66
+               OpBranch %26
+         %27 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %67
+%tint_symbol = OpFunctionParameter %main_out
+         %71 = OpLabel
+         %72 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %72
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %74 = OpLabel
+         %75 = OpFunctionCall %void %main_1
+         %77 = OpLoad %v4float %x_GLF_color
+         %78 = OpCompositeConstruct %main_out %77
+         %76 = OpFunctionCall %void %tint_symbol_2 %78
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..b469ccc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,74 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  var value : i32;
+  var y : f32;
+  var x_31_phi : i32;
+  i = 0;
+  x_31_phi = 0;
+  loop {
+    let x_31 : i32 = x_31_phi;
+    let x_37 : f32 = x_6.injectionSwitch.x;
+    if ((x_31 < (2 + i32(x_37)))) {
+    } else {
+      break;
+    }
+    var x_55_phi : f32;
+    var x_46_phi : f32;
+    value = x_31;
+    y = 0.5;
+    x_55_phi = 0.5;
+    x_46_phi = 0.5;
+    switch(x_31) {
+      case 0: {
+        let x_54 : f32 = (0.5 + 0.5);
+        y = x_54;
+        x_55_phi = x_54;
+        fallthrough;
+      }
+      case 1: {
+        let x_55 : f32 = x_55_phi;
+        let x_47 : f32 = clamp(1.0, 0.5, x_55);
+        y = x_47;
+        x_46_phi = x_47;
+        fallthrough;
+      }
+      default: {
+        fallthrough;
+      }
+      case 2: {
+        let x_46 : f32 = x_46_phi;
+        if ((x_46 == 1.0)) {
+          x_GLF_color = vec4<f32>(f32((x_31 + 1)), 0.0, 0.0, 1.0);
+          return;
+        }
+      }
+    }
+
+    continuing {
+      let x_32 : i32 = (x_31 + 1);
+      i = x_32;
+      x_31_phi = x_32;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/transpose-rectangular-matrix/0.spvasm b/test/vk-gl-cts/graphicsfuzz/transpose-rectangular-matrix/0.spvasm
new file mode 100644
index 0000000..c5e0d32
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/transpose-rectangular-matrix/0.spvasm
@@ -0,0 +1,77 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color %gl_FragCoord
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+       %void = OpTypeVoid
+          %6 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+    %float_1 = OpConstant %float 1
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+         %14 = OpConstantComposite %v3float %float_1 %float_0 %float_0
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+%_ptr_Input_float = OpTypePointer Input %float
+%mat4v3float = OpTypeMatrix %v3float 4
+         %20 = OpConstantComposite %v3float %float_0 %float_1 %float_0
+         %21 = OpConstantComposite %v3float %float_0 %float_0 %float_1
+         %22 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+         %23 = OpConstantComposite %mat4v3float %14 %20 %21 %22
+%mat3v4float = OpTypeMatrix %v4float 3
+         %25 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_0
+         %26 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_0
+         %27 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_0
+         %28 = OpConstantComposite %mat3v4float %25 %26 %27
+         %29 = OpUndef %v3float
+       %main = OpFunction %void None %6
+         %30 = OpLabel
+         %31 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %32 = OpLoad %float %31
+         %33 = OpFOrdLessThan %bool %32 %float_1
+               OpSelectionMerge %34 None
+               OpBranchConditional %33 %35 %36
+         %35 = OpLabel
+               OpBranch %34
+         %36 = OpLabel
+         %37 = OpTranspose %mat4v3float %28
+               OpBranch %34
+         %34 = OpLabel
+         %38 = OpPhi %mat4v3float %23 %35 %37 %36
+         %39 = OpTranspose %mat3v4float %38
+         %40 = OpCompositeExtract %float %39 0 1
+               OpBranch %41
+         %41 = OpLabel
+               OpLoopMerge %42 %43 None
+               OpBranch %44
+         %44 = OpLabel
+         %45 = OpFOrdGreaterThan %bool %40 %float_1
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %46
+         %47 = OpLabel
+               OpBranch %42
+         %46 = OpLabel
+               OpBranch %42
+         %43 = OpLabel
+               OpBranch %41
+         %42 = OpLabel
+         %48 = OpPhi %v3float %29 %47 %14 %46
+         %49 = OpCompositeExtract %float %48 0
+         %50 = OpCompositeExtract %float %48 1
+         %51 = OpCompositeExtract %float %48 2
+         %52 = OpCompositeConstruct %v4float %49 %50 %51 %float_1
+               OpStore %_GLF_color %52
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/transpose-rectangular-matrix/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/transpose-rectangular-matrix/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..2999e7d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/transpose-rectangular-matrix/0.spvasm.expected.hlsl
@@ -0,0 +1,46 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4x3 x_37 = float4x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  float4x3 x_38_phi = float4x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  float3 x_48_phi = float3(0.0f, 0.0f, 0.0f);
+  const float x_32 = gl_FragCoord.y;
+  if ((x_32 < 1.0f)) {
+    x_38_phi = float4x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f), float3(0.0f, 0.0f, 0.0f));
+  } else {
+    x_37 = transpose(float3x4(float4(1.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 1.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 1.0f, 0.0f)));
+    x_38_phi = x_37;
+  }
+  const float x_40 = transpose(x_38_phi)[0u].y;
+  while (true) {
+    if ((x_40 > 1.0f)) {
+      x_48_phi = float3(0.0f, 0.0f, 0.0f);
+      break;
+    }
+    x_48_phi = float3(1.0f, 0.0f, 0.0f);
+    break;
+  }
+  const float3 x_48 = x_48_phi;
+  x_GLF_color = float4(x_48.x, x_48.y, x_48.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/transpose-rectangular-matrix/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/transpose-rectangular-matrix/0.spvasm.expected.msl
new file mode 100644
index 0000000..f58d0ac
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/transpose-rectangular-matrix/0.spvasm.expected.msl
@@ -0,0 +1,46 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float4x3 x_37 = float4x3(0.0f);
+  float4x3 x_38_phi = float4x3(0.0f);
+  float3 x_48_phi = 0.0f;
+  float const x_32 = (*(tint_symbol_5)).y;
+  if ((x_32 < 1.0f)) {
+    x_38_phi = float4x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f), float3(0.0f, 0.0f, 0.0f));
+  } else {
+    x_37 = transpose(float3x4(float4(1.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 1.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 1.0f, 0.0f)));
+    x_38_phi = x_37;
+  }
+  float4x3 const x_38 = x_38_phi;
+  float const x_40 = transpose(x_38)[0u].y;
+  while (true) {
+    if ((x_40 > 1.0f)) {
+      x_48_phi = float3(0.0f, 0.0f, 0.0f);
+      break;
+    }
+    x_48_phi = float3(1.0f, 0.0f, 0.0f);
+    break;
+  }
+  float3 const x_48 = x_48_phi;
+  *(tint_symbol_6) = float4(x_48.x, x_48.y, x_48.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(&(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/transpose-rectangular-matrix/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/transpose-rectangular-matrix/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..7ed4633
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/transpose-rectangular-matrix/0.spvasm.expected.spvasm
@@ -0,0 +1,128 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 78
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %x_37 "x_37"
+               OpName %x_38_phi "x_38_phi"
+               OpName %x_48_phi "x_48_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+    %v3float = OpTypeVector %float 3
+%mat4v3float = OpTypeMatrix %v3float 4
+%_ptr_Function_mat4v3float = OpTypePointer Function %mat4v3float
+         %19 = OpConstantNull %mat4v3float
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %23 = OpConstantNull %v3float
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_1 = OpConstant %float 1
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+         %36 = OpConstantComposite %v3float %float_1 %float_0 %float_0
+         %37 = OpConstantComposite %v3float %float_0 %float_1 %float_0
+         %38 = OpConstantComposite %v3float %float_0 %float_0 %float_1
+         %39 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+         %40 = OpConstantComposite %mat4v3float %36 %37 %38 %39
+%mat3v4float = OpTypeMatrix %v4float 3
+         %43 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_0
+         %44 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_0
+         %45 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_0
+         %46 = OpConstantComposite %mat3v4float %43 %44 %45
+     %uint_0 = OpConstant %uint 0
+   %main_out = OpTypeStruct %v4float
+         %65 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+       %x_37 = OpVariable %_ptr_Function_mat4v3float Function %19
+   %x_38_phi = OpVariable %_ptr_Function_mat4v3float Function %19
+   %x_48_phi = OpVariable %_ptr_Function_v3float Function %23
+         %27 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %28 = OpLoad %float %27
+         %30 = OpFOrdLessThan %bool %28 %float_1
+               OpSelectionMerge %32 None
+               OpBranchConditional %30 %33 %34
+         %33 = OpLabel
+               OpStore %x_38_phi %40
+               OpBranch %32
+         %34 = OpLabel
+         %41 = OpTranspose %mat4v3float %46
+               OpStore %x_37 %41
+         %47 = OpLoad %mat4v3float %x_37
+               OpStore %x_38_phi %47
+               OpBranch %32
+         %32 = OpLabel
+         %48 = OpLoad %mat4v3float %x_38_phi
+         %49 = OpTranspose %mat3v4float %48
+         %51 = OpCompositeExtract %v4float %49 0
+         %52 = OpCompositeExtract %float %51 1
+               OpBranch %53
+         %53 = OpLabel
+               OpLoopMerge %54 %55 None
+               OpBranch %56
+         %56 = OpLabel
+         %57 = OpFOrdGreaterThan %bool %52 %float_1
+               OpSelectionMerge %58 None
+               OpBranchConditional %57 %59 %58
+         %59 = OpLabel
+               OpStore %x_48_phi %39
+               OpBranch %54
+         %58 = OpLabel
+               OpStore %x_48_phi %36
+               OpBranch %54
+         %55 = OpLabel
+               OpBranch %53
+         %54 = OpLabel
+         %60 = OpLoad %v3float %x_48_phi
+         %61 = OpCompositeExtract %float %60 0
+         %62 = OpCompositeExtract %float %60 1
+         %63 = OpCompositeExtract %float %60 2
+         %64 = OpCompositeConstruct %v4float %61 %62 %63 %float_1
+               OpStore %x_GLF_color %64
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %65
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %69 = OpLabel
+         %70 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %70
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %72 = OpLabel
+         %73 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %73
+         %74 = OpFunctionCall %void %main_1
+         %76 = OpLoad %v4float %x_GLF_color
+         %77 = OpCompositeConstruct %main_out %76
+         %75 = OpFunctionCall %void %tint_symbol_3 %77
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/transpose-rectangular-matrix/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/transpose-rectangular-matrix/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..cf0d932
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/transpose-rectangular-matrix/0.spvasm.expected.wgsl
@@ -0,0 +1,41 @@
+var<private> x_GLF_color : vec4<f32>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  var x_37 : mat4x3<f32>;
+  var x_38_phi : mat4x3<f32>;
+  var x_48_phi : vec3<f32>;
+  let x_32 : f32 = gl_FragCoord.y;
+  if ((x_32 < 1.0)) {
+    x_38_phi = mat4x3<f32>(vec3<f32>(1.0, 0.0, 0.0), vec3<f32>(0.0, 1.0, 0.0), vec3<f32>(0.0, 0.0, 1.0), vec3<f32>(0.0, 0.0, 0.0));
+  } else {
+    x_37 = transpose(mat3x4<f32>(vec4<f32>(1.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 1.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 1.0, 0.0)));
+    x_38_phi = x_37;
+  }
+  let x_38 : mat4x3<f32> = x_38_phi;
+  let x_40 : f32 = transpose(x_38)[0u].y;
+  loop {
+    if ((x_40 > 1.0)) {
+      x_48_phi = vec3<f32>(0.0, 0.0, 0.0);
+      break;
+    }
+    x_48_phi = vec3<f32>(1.0, 0.0, 0.0);
+    break;
+  }
+  let x_48 : vec3<f32> = x_48_phi;
+  x_GLF_color = vec4<f32>(x_48.x, x_48.y, x_48.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/transpose-rectangular-matrix/0.wgsl b/test/vk-gl-cts/graphicsfuzz/transpose-rectangular-matrix/0.wgsl
new file mode 100644
index 0000000..cf0d932
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/transpose-rectangular-matrix/0.wgsl
@@ -0,0 +1,41 @@
+var<private> x_GLF_color : vec4<f32>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  var x_37 : mat4x3<f32>;
+  var x_38_phi : mat4x3<f32>;
+  var x_48_phi : vec3<f32>;
+  let x_32 : f32 = gl_FragCoord.y;
+  if ((x_32 < 1.0)) {
+    x_38_phi = mat4x3<f32>(vec3<f32>(1.0, 0.0, 0.0), vec3<f32>(0.0, 1.0, 0.0), vec3<f32>(0.0, 0.0, 1.0), vec3<f32>(0.0, 0.0, 0.0));
+  } else {
+    x_37 = transpose(mat3x4<f32>(vec4<f32>(1.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 1.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 1.0, 0.0)));
+    x_38_phi = x_37;
+  }
+  let x_38 : mat4x3<f32> = x_38_phi;
+  let x_40 : f32 = transpose(x_38)[0u].y;
+  loop {
+    if ((x_40 > 1.0)) {
+      x_48_phi = vec3<f32>(0.0, 0.0, 0.0);
+      break;
+    }
+    x_48_phi = vec3<f32>(1.0, 0.0, 0.0);
+    break;
+  }
+  let x_48 : vec3<f32> = x_48_phi;
+  x_GLF_color = vec4<f32>(x_48.x, x_48.y, x_48.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/transpose-rectangular-matrix/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/transpose-rectangular-matrix/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..2999e7d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/transpose-rectangular-matrix/0.wgsl.expected.hlsl
@@ -0,0 +1,46 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4x3 x_37 = float4x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  float4x3 x_38_phi = float4x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  float3 x_48_phi = float3(0.0f, 0.0f, 0.0f);
+  const float x_32 = gl_FragCoord.y;
+  if ((x_32 < 1.0f)) {
+    x_38_phi = float4x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f), float3(0.0f, 0.0f, 0.0f));
+  } else {
+    x_37 = transpose(float3x4(float4(1.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 1.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 1.0f, 0.0f)));
+    x_38_phi = x_37;
+  }
+  const float x_40 = transpose(x_38_phi)[0u].y;
+  while (true) {
+    if ((x_40 > 1.0f)) {
+      x_48_phi = float3(0.0f, 0.0f, 0.0f);
+      break;
+    }
+    x_48_phi = float3(1.0f, 0.0f, 0.0f);
+    break;
+  }
+  const float3 x_48 = x_48_phi;
+  x_GLF_color = float4(x_48.x, x_48.y, x_48.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/transpose-rectangular-matrix/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/transpose-rectangular-matrix/0.wgsl.expected.msl
new file mode 100644
index 0000000..f58d0ac
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/transpose-rectangular-matrix/0.wgsl.expected.msl
@@ -0,0 +1,46 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float4x3 x_37 = float4x3(0.0f);
+  float4x3 x_38_phi = float4x3(0.0f);
+  float3 x_48_phi = 0.0f;
+  float const x_32 = (*(tint_symbol_5)).y;
+  if ((x_32 < 1.0f)) {
+    x_38_phi = float4x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f), float3(0.0f, 0.0f, 0.0f));
+  } else {
+    x_37 = transpose(float3x4(float4(1.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 1.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 1.0f, 0.0f)));
+    x_38_phi = x_37;
+  }
+  float4x3 const x_38 = x_38_phi;
+  float const x_40 = transpose(x_38)[0u].y;
+  while (true) {
+    if ((x_40 > 1.0f)) {
+      x_48_phi = float3(0.0f, 0.0f, 0.0f);
+      break;
+    }
+    x_48_phi = float3(1.0f, 0.0f, 0.0f);
+    break;
+  }
+  float3 const x_48 = x_48_phi;
+  *(tint_symbol_6) = float4(x_48.x, x_48.y, x_48.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(&(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/transpose-rectangular-matrix/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/transpose-rectangular-matrix/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..7ed4633
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/transpose-rectangular-matrix/0.wgsl.expected.spvasm
@@ -0,0 +1,128 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 78
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %x_37 "x_37"
+               OpName %x_38_phi "x_38_phi"
+               OpName %x_48_phi "x_48_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+    %v3float = OpTypeVector %float 3
+%mat4v3float = OpTypeMatrix %v3float 4
+%_ptr_Function_mat4v3float = OpTypePointer Function %mat4v3float
+         %19 = OpConstantNull %mat4v3float
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %23 = OpConstantNull %v3float
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Private_float = OpTypePointer Private %float
+    %float_1 = OpConstant %float 1
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+         %36 = OpConstantComposite %v3float %float_1 %float_0 %float_0
+         %37 = OpConstantComposite %v3float %float_0 %float_1 %float_0
+         %38 = OpConstantComposite %v3float %float_0 %float_0 %float_1
+         %39 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+         %40 = OpConstantComposite %mat4v3float %36 %37 %38 %39
+%mat3v4float = OpTypeMatrix %v4float 3
+         %43 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_0
+         %44 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_0
+         %45 = OpConstantComposite %v4float %float_0 %float_0 %float_1 %float_0
+         %46 = OpConstantComposite %mat3v4float %43 %44 %45
+     %uint_0 = OpConstant %uint 0
+   %main_out = OpTypeStruct %v4float
+         %65 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+       %x_37 = OpVariable %_ptr_Function_mat4v3float Function %19
+   %x_38_phi = OpVariable %_ptr_Function_mat4v3float Function %19
+   %x_48_phi = OpVariable %_ptr_Function_v3float Function %23
+         %27 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %28 = OpLoad %float %27
+         %30 = OpFOrdLessThan %bool %28 %float_1
+               OpSelectionMerge %32 None
+               OpBranchConditional %30 %33 %34
+         %33 = OpLabel
+               OpStore %x_38_phi %40
+               OpBranch %32
+         %34 = OpLabel
+         %41 = OpTranspose %mat4v3float %46
+               OpStore %x_37 %41
+         %47 = OpLoad %mat4v3float %x_37
+               OpStore %x_38_phi %47
+               OpBranch %32
+         %32 = OpLabel
+         %48 = OpLoad %mat4v3float %x_38_phi
+         %49 = OpTranspose %mat3v4float %48
+         %51 = OpCompositeExtract %v4float %49 0
+         %52 = OpCompositeExtract %float %51 1
+               OpBranch %53
+         %53 = OpLabel
+               OpLoopMerge %54 %55 None
+               OpBranch %56
+         %56 = OpLabel
+         %57 = OpFOrdGreaterThan %bool %52 %float_1
+               OpSelectionMerge %58 None
+               OpBranchConditional %57 %59 %58
+         %59 = OpLabel
+               OpStore %x_48_phi %39
+               OpBranch %54
+         %58 = OpLabel
+               OpStore %x_48_phi %36
+               OpBranch %54
+         %55 = OpLabel
+               OpBranch %53
+         %54 = OpLabel
+         %60 = OpLoad %v3float %x_48_phi
+         %61 = OpCompositeExtract %float %60 0
+         %62 = OpCompositeExtract %float %60 1
+         %63 = OpCompositeExtract %float %60 2
+         %64 = OpCompositeConstruct %v4float %61 %62 %63 %float_1
+               OpStore %x_GLF_color %64
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %65
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %69 = OpLabel
+         %70 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %70
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %72 = OpLabel
+         %73 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %73
+         %74 = OpFunctionCall %void %main_1
+         %76 = OpLoad %v4float %x_GLF_color
+         %77 = OpCompositeConstruct %main_out %76
+         %75 = OpFunctionCall %void %tint_symbol_3 %77
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/transpose-rectangular-matrix/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/transpose-rectangular-matrix/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..cf0d932
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/transpose-rectangular-matrix/0.wgsl.expected.wgsl
@@ -0,0 +1,41 @@
+var<private> x_GLF_color : vec4<f32>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  var x_37 : mat4x3<f32>;
+  var x_38_phi : mat4x3<f32>;
+  var x_48_phi : vec3<f32>;
+  let x_32 : f32 = gl_FragCoord.y;
+  if ((x_32 < 1.0)) {
+    x_38_phi = mat4x3<f32>(vec3<f32>(1.0, 0.0, 0.0), vec3<f32>(0.0, 1.0, 0.0), vec3<f32>(0.0, 0.0, 1.0), vec3<f32>(0.0, 0.0, 0.0));
+  } else {
+    x_37 = transpose(mat3x4<f32>(vec4<f32>(1.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 1.0, 0.0, 0.0), vec4<f32>(0.0, 0.0, 1.0, 0.0)));
+    x_38_phi = x_37;
+  }
+  let x_38 : mat4x3<f32> = x_38_phi;
+  let x_40 : f32 = transpose(x_38)[0u].y;
+  loop {
+    if ((x_40 > 1.0)) {
+      x_48_phi = vec3<f32>(0.0, 0.0, 0.0);
+      break;
+    }
+    x_48_phi = vec3<f32>(1.0, 0.0, 0.0);
+    break;
+  }
+  let x_48 : vec3<f32> = x_48_phi;
+  x_GLF_color = vec4<f32>(x_48.x, x_48.y, x_48.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/two-2-iteration-loops/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/two-2-iteration-loops/0-opt.spvasm
new file mode 100644
index 0000000..489ba28
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-2-iteration-loops/0-opt.spvasm
@@ -0,0 +1,211 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color %gl_FragCoord
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %odd_index "odd_index"
+               OpName %even_index "even_index"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %j "j"
+               OpName %ll "ll"
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %odd_index RelaxedPrecision
+               OpDecorate %11 RelaxedPrecision
+               OpDecorate %12 RelaxedPrecision
+               OpDecorate %13 RelaxedPrecision
+               OpDecorate %even_index RelaxedPrecision
+               OpDecorate %14 RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %15 RelaxedPrecision
+               OpDecorate %j RelaxedPrecision
+               OpDecorate %ll RelaxedPrecision
+               OpDecorate %16 RelaxedPrecision
+               OpDecorate %17 RelaxedPrecision
+               OpDecorate %18 RelaxedPrecision
+               OpDecorate %19 RelaxedPrecision
+               OpDecorate %20 RelaxedPrecision
+               OpDecorate %21 RelaxedPrecision
+               OpDecorate %22 RelaxedPrecision
+               OpDecorate %23 RelaxedPrecision
+       %void = OpTypeVoid
+         %25 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %31 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %bool = OpTypeBool
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+  %float_128 = OpConstant %float 128
+     %uint_1 = OpConstant %uint 1
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+ %float_0_25 = OpConstant %float 0.25
+%_ptr_Output_float = OpTypePointer Output %float
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %true = OpConstantTrue %bool
+      %int_3 = OpConstant %int 3
+         %50 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+       %main = OpFunction %void None %25
+         %51 = OpLabel
+  %odd_index = OpVariable %_ptr_Function_int Function
+ %even_index = OpVariable %_ptr_Function_int Function
+          %j = OpVariable %_ptr_Function_int Function
+         %ll = OpVariable %_ptr_Function_int Function
+               OpStore %_GLF_color %31
+         %52 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %53 = OpLoad %float %52
+         %54 = OpFOrdLessThan %bool %53 %float_128
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %55
+         %56 = OpLabel
+         %57 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %58 = OpLoad %float %57
+         %59 = OpFOrdLessThan %bool %58 %float_128
+               OpBranch %55
+         %55 = OpLabel
+         %60 = OpPhi %bool %54 %51 %59 %56
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %61
+         %62 = OpLabel
+               OpReturn
+         %61 = OpLabel
+               OpStore %odd_index %int_0
+               OpBranch %63
+         %63 = OpLabel
+               OpLoopMerge %64 %65 None
+               OpBranch %66
+         %66 = OpLabel
+         %11 = OpLoad %int %odd_index
+         %67 = OpSLessThanEqual %bool %11 %int_1
+               OpBranchConditional %67 %68 %64
+         %68 = OpLabel
+         %69 = OpAccessChain %_ptr_Output_float %_GLF_color %uint_0
+         %70 = OpLoad %float %69
+         %71 = OpFAdd %float %70 %float_0_25
+         %72 = OpAccessChain %_ptr_Output_float %_GLF_color %uint_0
+               OpStore %72 %71
+         %12 = OpLoad %int %odd_index
+         %13 = OpIAdd %int %12 %int_1
+               OpStore %odd_index %13
+               OpBranch %65
+         %65 = OpLabel
+               OpBranch %63
+         %64 = OpLabel
+               OpStore %even_index %int_1
+               OpBranch %73
+         %73 = OpLabel
+               OpLoopMerge %74 %75 None
+               OpBranch %76
+         %76 = OpLabel
+         %14 = OpLoad %int %even_index
+         %77 = OpSGreaterThanEqual %bool %14 %int_0
+               OpBranchConditional %77 %78 %74
+         %78 = OpLabel
+         %79 = OpAccessChain %_ptr_Output_float %_GLF_color %uint_0
+         %80 = OpLoad %float %79
+         %81 = OpFAdd %float %80 %float_0_25
+         %82 = OpAccessChain %_ptr_Output_float %_GLF_color %uint_0
+               OpStore %82 %81
+         %83 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %84 = OpLoad %float %83
+         %85 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %86 = OpLoad %float %85
+         %87 = OpFOrdGreaterThan %bool %84 %86
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %88
+         %89 = OpLabel
+               OpBranch %75
+         %88 = OpLabel
+         %15 = OpLoad %int %even_index
+         %90 = OpSGreaterThanEqual %bool %15 %int_1
+               OpSelectionMerge %91 None
+               OpBranchConditional %90 %92 %91
+         %92 = OpLabel
+               OpKill
+         %91 = OpLabel
+               OpStore %j %int_1
+               OpBranch %93
+         %93 = OpLabel
+               OpLoopMerge %94 %95 None
+               OpBranch %96
+         %96 = OpLabel
+               OpBranchConditional %true %97 %94
+         %97 = OpLabel
+         %16 = OpLoad %int %ll
+         %98 = OpSGreaterThanEqual %bool %16 %int_3
+               OpSelectionMerge %99 None
+               OpBranchConditional %98 %100 %99
+        %100 = OpLabel
+               OpBranch %94
+         %99 = OpLabel
+         %17 = OpLoad %int %ll
+         %18 = OpIAdd %int %17 %int_1
+               OpStore %ll %18
+         %19 = OpLoad %int %j
+        %101 = OpBitcast %uint %19
+        %102 = OpULessThan %bool %101 %uint_1
+               OpSelectionMerge %103 None
+               OpBranchConditional %102 %104 %103
+        %104 = OpLabel
+               OpBranch %95
+        %103 = OpLabel
+        %105 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+        %106 = OpLoad %float %105
+        %107 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+        %108 = OpLoad %float %107
+        %109 = OpFOrdGreaterThan %bool %106 %108
+               OpSelectionMerge %110 None
+               OpBranchConditional %109 %111 %110
+        %111 = OpLabel
+               OpBranch %94
+        %110 = OpLabel
+               OpBranch %95
+         %95 = OpLabel
+         %20 = OpLoad %int %j
+         %21 = OpIAdd %int %20 %int_1
+               OpStore %j %21
+               OpBranch %93
+         %94 = OpLabel
+        %112 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+        %113 = OpLoad %float %112
+        %114 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+        %115 = OpLoad %float %114
+        %116 = OpFOrdGreaterThan %bool %113 %115
+               OpSelectionMerge %117 None
+               OpBranchConditional %116 %118 %117
+        %118 = OpLabel
+               OpStore %_GLF_color %50
+               OpBranch %117
+        %117 = OpLabel
+         %22 = OpLoad %int %even_index
+         %23 = OpISub %int %22 %int_1
+               OpStore %even_index %23
+               OpBranch %75
+         %75 = OpLabel
+               OpBranch %73
+         %74 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/two-2-iteration-loops/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/two-2-iteration-loops/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..e97beb7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-2-iteration-loops/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,96 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[1];
+};
+
+void main_1() {
+  int odd_index = 0;
+  int even_index = 0;
+  int j = 0;
+  int ll = 0;
+  bool x_59 = false;
+  bool x_60_phi = false;
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  const float x_53 = gl_FragCoord.x;
+  const bool x_54 = (x_53 < 128.0f);
+  x_60_phi = x_54;
+  if (x_54) {
+    const float x_58 = gl_FragCoord.y;
+    x_59 = (x_58 < 128.0f);
+    x_60_phi = x_59;
+  }
+  if (x_60_phi) {
+    return;
+  }
+  odd_index = 0;
+  while (true) {
+    if ((odd_index <= 1)) {
+    } else {
+      break;
+    }
+    const float x_70 = x_GLF_color.x;
+    x_GLF_color.x = (x_70 + 0.25f);
+    odd_index = (odd_index + 1);
+  }
+  even_index = 1;
+  while (true) {
+    if ((even_index >= 0)) {
+    } else {
+      break;
+    }
+    const float x_80 = x_GLF_color.x;
+    x_GLF_color.x = (x_80 + 0.25f);
+    const float x_84 = asfloat(x_8[0].x);
+    const float x_86 = asfloat(x_8[0].y);
+    if ((x_84 > x_86)) {
+      continue;
+    }
+    if ((even_index >= 1)) {
+      discard;
+    }
+    j = 1;
+    {
+      for(; true; j = (j + 1)) {
+        if ((ll >= 3)) {
+          break;
+        }
+        ll = (ll + 1);
+        if ((asuint(j) < 1u)) {
+          continue;
+        }
+        const float x_106 = asfloat(x_8[0].x);
+        const float x_108 = asfloat(x_8[0].y);
+        if ((x_106 > x_108)) {
+          break;
+        }
+      }
+    }
+    const float x_113 = asfloat(x_8[0].x);
+    const float x_115 = asfloat(x_8[0].y);
+    if ((x_113 > x_115)) {
+      x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+    }
+    even_index = (even_index - 1);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/two-2-iteration-loops/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/two-2-iteration-loops/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..67500c5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-2-iteration-loops/0-opt.spvasm.expected.msl
@@ -0,0 +1,114 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int odd_index = 0;
+  int even_index = 0;
+  int j = 0;
+  int ll = 0;
+  bool x_59 = false;
+  bool x_60_phi = false;
+  *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  float const x_53 = (*(tint_symbol_6)).x;
+  bool const x_54 = (x_53 < 128.0f);
+  x_60_phi = x_54;
+  if (x_54) {
+    float const x_58 = (*(tint_symbol_6)).y;
+    x_59 = (x_58 < 128.0f);
+    x_60_phi = x_59;
+  }
+  bool const x_60 = x_60_phi;
+  if (x_60) {
+    return;
+  }
+  odd_index = 0;
+  while (true) {
+    int const x_11 = odd_index;
+    if ((x_11 <= 1)) {
+    } else {
+      break;
+    }
+    float const x_70 = (*(tint_symbol_5)).x;
+    (*(tint_symbol_5)).x = (x_70 + 0.25f);
+    int const x_12 = odd_index;
+    odd_index = (x_12 + 1);
+  }
+  even_index = 1;
+  while (true) {
+    int const x_14 = even_index;
+    if ((x_14 >= 0)) {
+    } else {
+      break;
+    }
+    float const x_80 = (*(tint_symbol_5)).x;
+    (*(tint_symbol_5)).x = (x_80 + 0.25f);
+    float const x_84 = x_8.injectionSwitch.x;
+    float const x_86 = x_8.injectionSwitch.y;
+    if ((x_84 > x_86)) {
+      continue;
+    }
+    int const x_15 = even_index;
+    if ((x_15 >= 1)) {
+      discard_fragment();
+    }
+    j = 1;
+    while (true) {
+      if (true) {
+      } else {
+        break;
+      }
+      int const x_16 = ll;
+      if ((x_16 >= 3)) {
+        break;
+      }
+      int const x_17 = ll;
+      ll = (x_17 + 1);
+      int const x_19 = j;
+      if ((as_type<uint>(x_19) < 1u)) {
+        {
+          int const x_20 = j;
+          j = (x_20 + 1);
+        }
+        continue;
+      }
+      float const x_106 = x_8.injectionSwitch.x;
+      float const x_108 = x_8.injectionSwitch.y;
+      if ((x_106 > x_108)) {
+        break;
+      }
+      {
+        int const x_20 = j;
+        j = (x_20 + 1);
+      }
+    }
+    float const x_113 = x_8.injectionSwitch.x;
+    float const x_115 = x_8.injectionSwitch.y;
+    if ((x_113 > x_115)) {
+      *(tint_symbol_5) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+    }
+    int const x_22 = even_index;
+    even_index = (x_22 - 1);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_8, &(tint_symbol_8), &(tint_symbol_7));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/two-2-iteration-loops/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/two-2-iteration-loops/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..8dcb827
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-2-iteration-loops/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,254 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 146
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_8 "x_8"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %odd_index "odd_index"
+               OpName %even_index "even_index"
+               OpName %j "j"
+               OpName %ll "ll"
+               OpName %x_59 "x_59"
+               OpName %x_60_phi "x_60_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %22 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %29 = OpConstantNull %bool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %33 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+  %float_128 = OpConstant %float 128
+     %uint_1 = OpConstant %uint 1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+ %float_0_25 = OpConstant %float 0.25
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %true = OpConstantTrue %bool
+      %int_3 = OpConstant %int 3
+        %130 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+        %133 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+  %odd_index = OpVariable %_ptr_Function_int Function %22
+ %even_index = OpVariable %_ptr_Function_int Function %22
+          %j = OpVariable %_ptr_Function_int Function %22
+         %ll = OpVariable %_ptr_Function_int Function %22
+       %x_59 = OpVariable %_ptr_Function_bool Function %29
+   %x_60_phi = OpVariable %_ptr_Function_bool Function %29
+               OpStore %x_GLF_color %33
+         %37 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %38 = OpLoad %float %37
+         %40 = OpFOrdLessThan %bool %38 %float_128
+               OpStore %x_60_phi %40
+               OpSelectionMerge %41 None
+               OpBranchConditional %40 %42 %41
+         %42 = OpLabel
+         %44 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %45 = OpLoad %float %44
+         %46 = OpFOrdLessThan %bool %45 %float_128
+               OpStore %x_59 %46
+         %47 = OpLoad %bool %x_59
+               OpStore %x_60_phi %47
+               OpBranch %41
+         %41 = OpLabel
+         %48 = OpLoad %bool %x_60_phi
+               OpSelectionMerge %49 None
+               OpBranchConditional %48 %50 %49
+         %50 = OpLabel
+               OpReturn
+         %49 = OpLabel
+               OpStore %odd_index %int_0
+               OpBranch %52
+         %52 = OpLabel
+               OpLoopMerge %53 %54 None
+               OpBranch %55
+         %55 = OpLabel
+         %56 = OpLoad %int %odd_index
+         %58 = OpSLessThanEqual %bool %56 %int_1
+               OpSelectionMerge %59 None
+               OpBranchConditional %58 %60 %61
+         %60 = OpLabel
+               OpBranch %59
+         %61 = OpLabel
+               OpBranch %53
+         %59 = OpLabel
+         %62 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_0
+         %63 = OpLoad %float %62
+         %64 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_0
+         %66 = OpFAdd %float %63 %float_0_25
+               OpStore %64 %66
+         %67 = OpLoad %int %odd_index
+         %68 = OpIAdd %int %67 %int_1
+               OpStore %odd_index %68
+               OpBranch %54
+         %54 = OpLabel
+               OpBranch %52
+         %53 = OpLabel
+               OpStore %even_index %int_1
+               OpBranch %69
+         %69 = OpLabel
+               OpLoopMerge %70 %71 None
+               OpBranch %72
+         %72 = OpLabel
+         %73 = OpLoad %int %even_index
+         %74 = OpSGreaterThanEqual %bool %73 %int_0
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %77
+         %76 = OpLabel
+               OpBranch %75
+         %77 = OpLabel
+               OpBranch %70
+         %75 = OpLabel
+         %78 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_0
+         %79 = OpLoad %float %78
+         %80 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_0
+         %81 = OpFAdd %float %79 %float_0_25
+               OpStore %80 %81
+         %83 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+         %84 = OpLoad %float %83
+         %85 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+         %86 = OpLoad %float %85
+         %87 = OpFOrdGreaterThan %bool %84 %86
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %88
+         %89 = OpLabel
+               OpBranch %71
+         %88 = OpLabel
+         %90 = OpLoad %int %even_index
+         %91 = OpSGreaterThanEqual %bool %90 %int_1
+               OpSelectionMerge %92 None
+               OpBranchConditional %91 %93 %92
+         %93 = OpLabel
+               OpKill
+         %92 = OpLabel
+               OpStore %j %int_1
+               OpBranch %94
+         %94 = OpLabel
+               OpLoopMerge %95 %96 None
+               OpBranch %97
+         %97 = OpLabel
+               OpSelectionMerge %99 None
+               OpBranchConditional %true %100 %101
+        %100 = OpLabel
+               OpBranch %99
+        %101 = OpLabel
+               OpBranch %95
+         %99 = OpLabel
+        %102 = OpLoad %int %ll
+        %104 = OpSGreaterThanEqual %bool %102 %int_3
+               OpSelectionMerge %105 None
+               OpBranchConditional %104 %106 %105
+        %106 = OpLabel
+               OpBranch %95
+        %105 = OpLabel
+        %107 = OpLoad %int %ll
+        %108 = OpIAdd %int %107 %int_1
+               OpStore %ll %108
+        %109 = OpLoad %int %j
+        %110 = OpBitcast %uint %109
+        %111 = OpULessThan %bool %110 %uint_1
+               OpSelectionMerge %112 None
+               OpBranchConditional %111 %113 %112
+        %113 = OpLabel
+               OpBranch %96
+        %112 = OpLabel
+        %114 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+        %115 = OpLoad %float %114
+        %116 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+        %117 = OpLoad %float %116
+        %118 = OpFOrdGreaterThan %bool %115 %117
+               OpSelectionMerge %119 None
+               OpBranchConditional %118 %120 %119
+        %120 = OpLabel
+               OpBranch %95
+        %119 = OpLabel
+               OpBranch %96
+         %96 = OpLabel
+        %121 = OpLoad %int %j
+        %122 = OpIAdd %int %121 %int_1
+               OpStore %j %122
+               OpBranch %94
+         %95 = OpLabel
+        %123 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+        %124 = OpLoad %float %123
+        %125 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+        %126 = OpLoad %float %125
+        %127 = OpFOrdGreaterThan %bool %124 %126
+               OpSelectionMerge %128 None
+               OpBranchConditional %127 %129 %128
+        %129 = OpLabel
+               OpStore %x_GLF_color %130
+               OpBranch %128
+        %128 = OpLabel
+        %131 = OpLoad %int %even_index
+        %132 = OpISub %int %131 %int_1
+               OpStore %even_index %132
+               OpBranch %71
+         %71 = OpLabel
+               OpBranch %69
+         %70 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %133
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %137 = OpLabel
+        %138 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %138
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %140 = OpLabel
+        %141 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %141
+        %142 = OpFunctionCall %void %main_1
+        %144 = OpLoad %v4float %x_GLF_color
+        %145 = OpCompositeConstruct %main_out %144
+        %143 = OpFunctionCall %void %tint_symbol_3 %145
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/two-2-iteration-loops/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/two-2-iteration-loops/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..aec3b11
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-2-iteration-loops/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,110 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+fn main_1() {
+  var odd_index : i32;
+  var even_index : i32;
+  var j : i32;
+  var ll : i32;
+  var x_59 : bool;
+  var x_60_phi : bool;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  let x_53 : f32 = gl_FragCoord.x;
+  let x_54 : bool = (x_53 < 128.0);
+  x_60_phi = x_54;
+  if (x_54) {
+    let x_58 : f32 = gl_FragCoord.y;
+    x_59 = (x_58 < 128.0);
+    x_60_phi = x_59;
+  }
+  let x_60 : bool = x_60_phi;
+  if (x_60) {
+    return;
+  }
+  odd_index = 0;
+  loop {
+    let x_11 : i32 = odd_index;
+    if ((x_11 <= 1)) {
+    } else {
+      break;
+    }
+    let x_70 : f32 = x_GLF_color.x;
+    x_GLF_color.x = (x_70 + 0.25);
+    let x_12 : i32 = odd_index;
+    odd_index = (x_12 + 1);
+  }
+  even_index = 1;
+  loop {
+    let x_14 : i32 = even_index;
+    if ((x_14 >= 0)) {
+    } else {
+      break;
+    }
+    let x_80 : f32 = x_GLF_color.x;
+    x_GLF_color.x = (x_80 + 0.25);
+    let x_84 : f32 = x_8.injectionSwitch.x;
+    let x_86 : f32 = x_8.injectionSwitch.y;
+    if ((x_84 > x_86)) {
+      continue;
+    }
+    let x_15 : i32 = even_index;
+    if ((x_15 >= 1)) {
+      discard;
+    }
+    j = 1;
+    loop {
+      if (true) {
+      } else {
+        break;
+      }
+      let x_16 : i32 = ll;
+      if ((x_16 >= 3)) {
+        break;
+      }
+      let x_17 : i32 = ll;
+      ll = (x_17 + 1);
+      let x_19 : i32 = j;
+      if ((bitcast<u32>(x_19) < 1u)) {
+        continue;
+      }
+      let x_106 : f32 = x_8.injectionSwitch.x;
+      let x_108 : f32 = x_8.injectionSwitch.y;
+      if ((x_106 > x_108)) {
+        break;
+      }
+
+      continuing {
+        let x_20 : i32 = j;
+        j = (x_20 + 1);
+      }
+    }
+    let x_113 : f32 = x_8.injectionSwitch.x;
+    let x_115 : f32 = x_8.injectionSwitch.y;
+    if ((x_113 > x_115)) {
+      x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+    }
+    let x_22 : i32 = even_index;
+    even_index = (x_22 - 1);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/two-2-iteration-loops/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/two-2-iteration-loops/0-opt.wgsl
new file mode 100644
index 0000000..aec3b11
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-2-iteration-loops/0-opt.wgsl
@@ -0,0 +1,110 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+fn main_1() {
+  var odd_index : i32;
+  var even_index : i32;
+  var j : i32;
+  var ll : i32;
+  var x_59 : bool;
+  var x_60_phi : bool;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  let x_53 : f32 = gl_FragCoord.x;
+  let x_54 : bool = (x_53 < 128.0);
+  x_60_phi = x_54;
+  if (x_54) {
+    let x_58 : f32 = gl_FragCoord.y;
+    x_59 = (x_58 < 128.0);
+    x_60_phi = x_59;
+  }
+  let x_60 : bool = x_60_phi;
+  if (x_60) {
+    return;
+  }
+  odd_index = 0;
+  loop {
+    let x_11 : i32 = odd_index;
+    if ((x_11 <= 1)) {
+    } else {
+      break;
+    }
+    let x_70 : f32 = x_GLF_color.x;
+    x_GLF_color.x = (x_70 + 0.25);
+    let x_12 : i32 = odd_index;
+    odd_index = (x_12 + 1);
+  }
+  even_index = 1;
+  loop {
+    let x_14 : i32 = even_index;
+    if ((x_14 >= 0)) {
+    } else {
+      break;
+    }
+    let x_80 : f32 = x_GLF_color.x;
+    x_GLF_color.x = (x_80 + 0.25);
+    let x_84 : f32 = x_8.injectionSwitch.x;
+    let x_86 : f32 = x_8.injectionSwitch.y;
+    if ((x_84 > x_86)) {
+      continue;
+    }
+    let x_15 : i32 = even_index;
+    if ((x_15 >= 1)) {
+      discard;
+    }
+    j = 1;
+    loop {
+      if (true) {
+      } else {
+        break;
+      }
+      let x_16 : i32 = ll;
+      if ((x_16 >= 3)) {
+        break;
+      }
+      let x_17 : i32 = ll;
+      ll = (x_17 + 1);
+      let x_19 : i32 = j;
+      if ((bitcast<u32>(x_19) < 1u)) {
+        continue;
+      }
+      let x_106 : f32 = x_8.injectionSwitch.x;
+      let x_108 : f32 = x_8.injectionSwitch.y;
+      if ((x_106 > x_108)) {
+        break;
+      }
+
+      continuing {
+        let x_20 : i32 = j;
+        j = (x_20 + 1);
+      }
+    }
+    let x_113 : f32 = x_8.injectionSwitch.x;
+    let x_115 : f32 = x_8.injectionSwitch.y;
+    if ((x_113 > x_115)) {
+      x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+    }
+    let x_22 : i32 = even_index;
+    even_index = (x_22 - 1);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/two-2-iteration-loops/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/two-2-iteration-loops/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..e97beb7
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-2-iteration-loops/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,96 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[1];
+};
+
+void main_1() {
+  int odd_index = 0;
+  int even_index = 0;
+  int j = 0;
+  int ll = 0;
+  bool x_59 = false;
+  bool x_60_phi = false;
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  const float x_53 = gl_FragCoord.x;
+  const bool x_54 = (x_53 < 128.0f);
+  x_60_phi = x_54;
+  if (x_54) {
+    const float x_58 = gl_FragCoord.y;
+    x_59 = (x_58 < 128.0f);
+    x_60_phi = x_59;
+  }
+  if (x_60_phi) {
+    return;
+  }
+  odd_index = 0;
+  while (true) {
+    if ((odd_index <= 1)) {
+    } else {
+      break;
+    }
+    const float x_70 = x_GLF_color.x;
+    x_GLF_color.x = (x_70 + 0.25f);
+    odd_index = (odd_index + 1);
+  }
+  even_index = 1;
+  while (true) {
+    if ((even_index >= 0)) {
+    } else {
+      break;
+    }
+    const float x_80 = x_GLF_color.x;
+    x_GLF_color.x = (x_80 + 0.25f);
+    const float x_84 = asfloat(x_8[0].x);
+    const float x_86 = asfloat(x_8[0].y);
+    if ((x_84 > x_86)) {
+      continue;
+    }
+    if ((even_index >= 1)) {
+      discard;
+    }
+    j = 1;
+    {
+      for(; true; j = (j + 1)) {
+        if ((ll >= 3)) {
+          break;
+        }
+        ll = (ll + 1);
+        if ((asuint(j) < 1u)) {
+          continue;
+        }
+        const float x_106 = asfloat(x_8[0].x);
+        const float x_108 = asfloat(x_8[0].y);
+        if ((x_106 > x_108)) {
+          break;
+        }
+      }
+    }
+    const float x_113 = asfloat(x_8[0].x);
+    const float x_115 = asfloat(x_8[0].y);
+    if ((x_113 > x_115)) {
+      x_GLF_color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+    }
+    even_index = (even_index - 1);
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/two-2-iteration-loops/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/two-2-iteration-loops/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..67500c5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-2-iteration-loops/0-opt.wgsl.expected.msl
@@ -0,0 +1,114 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int odd_index = 0;
+  int even_index = 0;
+  int j = 0;
+  int ll = 0;
+  bool x_59 = false;
+  bool x_60_phi = false;
+  *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  float const x_53 = (*(tint_symbol_6)).x;
+  bool const x_54 = (x_53 < 128.0f);
+  x_60_phi = x_54;
+  if (x_54) {
+    float const x_58 = (*(tint_symbol_6)).y;
+    x_59 = (x_58 < 128.0f);
+    x_60_phi = x_59;
+  }
+  bool const x_60 = x_60_phi;
+  if (x_60) {
+    return;
+  }
+  odd_index = 0;
+  while (true) {
+    int const x_11 = odd_index;
+    if ((x_11 <= 1)) {
+    } else {
+      break;
+    }
+    float const x_70 = (*(tint_symbol_5)).x;
+    (*(tint_symbol_5)).x = (x_70 + 0.25f);
+    int const x_12 = odd_index;
+    odd_index = (x_12 + 1);
+  }
+  even_index = 1;
+  while (true) {
+    int const x_14 = even_index;
+    if ((x_14 >= 0)) {
+    } else {
+      break;
+    }
+    float const x_80 = (*(tint_symbol_5)).x;
+    (*(tint_symbol_5)).x = (x_80 + 0.25f);
+    float const x_84 = x_8.injectionSwitch.x;
+    float const x_86 = x_8.injectionSwitch.y;
+    if ((x_84 > x_86)) {
+      continue;
+    }
+    int const x_15 = even_index;
+    if ((x_15 >= 1)) {
+      discard_fragment();
+    }
+    j = 1;
+    while (true) {
+      if (true) {
+      } else {
+        break;
+      }
+      int const x_16 = ll;
+      if ((x_16 >= 3)) {
+        break;
+      }
+      int const x_17 = ll;
+      ll = (x_17 + 1);
+      int const x_19 = j;
+      if ((as_type<uint>(x_19) < 1u)) {
+        {
+          int const x_20 = j;
+          j = (x_20 + 1);
+        }
+        continue;
+      }
+      float const x_106 = x_8.injectionSwitch.x;
+      float const x_108 = x_8.injectionSwitch.y;
+      if ((x_106 > x_108)) {
+        break;
+      }
+      {
+        int const x_20 = j;
+        j = (x_20 + 1);
+      }
+    }
+    float const x_113 = x_8.injectionSwitch.x;
+    float const x_115 = x_8.injectionSwitch.y;
+    if ((x_113 > x_115)) {
+      *(tint_symbol_5) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+    }
+    int const x_22 = even_index;
+    even_index = (x_22 - 1);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_8, &(tint_symbol_8), &(tint_symbol_7));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/two-2-iteration-loops/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/two-2-iteration-loops/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..8dcb827
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-2-iteration-loops/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,254 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 146
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_8 "x_8"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %odd_index "odd_index"
+               OpName %even_index "even_index"
+               OpName %j "j"
+               OpName %ll "ll"
+               OpName %x_59 "x_59"
+               OpName %x_60_phi "x_60_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %22 = OpConstantNull %int
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %29 = OpConstantNull %bool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %33 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+  %float_128 = OpConstant %float 128
+     %uint_1 = OpConstant %uint 1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+ %float_0_25 = OpConstant %float 0.25
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %true = OpConstantTrue %bool
+      %int_3 = OpConstant %int 3
+        %130 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+        %133 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+  %odd_index = OpVariable %_ptr_Function_int Function %22
+ %even_index = OpVariable %_ptr_Function_int Function %22
+          %j = OpVariable %_ptr_Function_int Function %22
+         %ll = OpVariable %_ptr_Function_int Function %22
+       %x_59 = OpVariable %_ptr_Function_bool Function %29
+   %x_60_phi = OpVariable %_ptr_Function_bool Function %29
+               OpStore %x_GLF_color %33
+         %37 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %38 = OpLoad %float %37
+         %40 = OpFOrdLessThan %bool %38 %float_128
+               OpStore %x_60_phi %40
+               OpSelectionMerge %41 None
+               OpBranchConditional %40 %42 %41
+         %42 = OpLabel
+         %44 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %45 = OpLoad %float %44
+         %46 = OpFOrdLessThan %bool %45 %float_128
+               OpStore %x_59 %46
+         %47 = OpLoad %bool %x_59
+               OpStore %x_60_phi %47
+               OpBranch %41
+         %41 = OpLabel
+         %48 = OpLoad %bool %x_60_phi
+               OpSelectionMerge %49 None
+               OpBranchConditional %48 %50 %49
+         %50 = OpLabel
+               OpReturn
+         %49 = OpLabel
+               OpStore %odd_index %int_0
+               OpBranch %52
+         %52 = OpLabel
+               OpLoopMerge %53 %54 None
+               OpBranch %55
+         %55 = OpLabel
+         %56 = OpLoad %int %odd_index
+         %58 = OpSLessThanEqual %bool %56 %int_1
+               OpSelectionMerge %59 None
+               OpBranchConditional %58 %60 %61
+         %60 = OpLabel
+               OpBranch %59
+         %61 = OpLabel
+               OpBranch %53
+         %59 = OpLabel
+         %62 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_0
+         %63 = OpLoad %float %62
+         %64 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_0
+         %66 = OpFAdd %float %63 %float_0_25
+               OpStore %64 %66
+         %67 = OpLoad %int %odd_index
+         %68 = OpIAdd %int %67 %int_1
+               OpStore %odd_index %68
+               OpBranch %54
+         %54 = OpLabel
+               OpBranch %52
+         %53 = OpLabel
+               OpStore %even_index %int_1
+               OpBranch %69
+         %69 = OpLabel
+               OpLoopMerge %70 %71 None
+               OpBranch %72
+         %72 = OpLabel
+         %73 = OpLoad %int %even_index
+         %74 = OpSGreaterThanEqual %bool %73 %int_0
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %77
+         %76 = OpLabel
+               OpBranch %75
+         %77 = OpLabel
+               OpBranch %70
+         %75 = OpLabel
+         %78 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_0
+         %79 = OpLoad %float %78
+         %80 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_0
+         %81 = OpFAdd %float %79 %float_0_25
+               OpStore %80 %81
+         %83 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+         %84 = OpLoad %float %83
+         %85 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+         %86 = OpLoad %float %85
+         %87 = OpFOrdGreaterThan %bool %84 %86
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %88
+         %89 = OpLabel
+               OpBranch %71
+         %88 = OpLabel
+         %90 = OpLoad %int %even_index
+         %91 = OpSGreaterThanEqual %bool %90 %int_1
+               OpSelectionMerge %92 None
+               OpBranchConditional %91 %93 %92
+         %93 = OpLabel
+               OpKill
+         %92 = OpLabel
+               OpStore %j %int_1
+               OpBranch %94
+         %94 = OpLabel
+               OpLoopMerge %95 %96 None
+               OpBranch %97
+         %97 = OpLabel
+               OpSelectionMerge %99 None
+               OpBranchConditional %true %100 %101
+        %100 = OpLabel
+               OpBranch %99
+        %101 = OpLabel
+               OpBranch %95
+         %99 = OpLabel
+        %102 = OpLoad %int %ll
+        %104 = OpSGreaterThanEqual %bool %102 %int_3
+               OpSelectionMerge %105 None
+               OpBranchConditional %104 %106 %105
+        %106 = OpLabel
+               OpBranch %95
+        %105 = OpLabel
+        %107 = OpLoad %int %ll
+        %108 = OpIAdd %int %107 %int_1
+               OpStore %ll %108
+        %109 = OpLoad %int %j
+        %110 = OpBitcast %uint %109
+        %111 = OpULessThan %bool %110 %uint_1
+               OpSelectionMerge %112 None
+               OpBranchConditional %111 %113 %112
+        %113 = OpLabel
+               OpBranch %96
+        %112 = OpLabel
+        %114 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+        %115 = OpLoad %float %114
+        %116 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+        %117 = OpLoad %float %116
+        %118 = OpFOrdGreaterThan %bool %115 %117
+               OpSelectionMerge %119 None
+               OpBranchConditional %118 %120 %119
+        %120 = OpLabel
+               OpBranch %95
+        %119 = OpLabel
+               OpBranch %96
+         %96 = OpLabel
+        %121 = OpLoad %int %j
+        %122 = OpIAdd %int %121 %int_1
+               OpStore %j %122
+               OpBranch %94
+         %95 = OpLabel
+        %123 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_0
+        %124 = OpLoad %float %123
+        %125 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %uint_1
+        %126 = OpLoad %float %125
+        %127 = OpFOrdGreaterThan %bool %124 %126
+               OpSelectionMerge %128 None
+               OpBranchConditional %127 %129 %128
+        %129 = OpLabel
+               OpStore %x_GLF_color %130
+               OpBranch %128
+        %128 = OpLabel
+        %131 = OpLoad %int %even_index
+        %132 = OpISub %int %131 %int_1
+               OpStore %even_index %132
+               OpBranch %71
+         %71 = OpLabel
+               OpBranch %69
+         %70 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %133
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %137 = OpLabel
+        %138 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %138
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %140 = OpLabel
+        %141 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %141
+        %142 = OpFunctionCall %void %main_1
+        %144 = OpLoad %v4float %x_GLF_color
+        %145 = OpCompositeConstruct %main_out %144
+        %143 = OpFunctionCall %void %tint_symbol_3 %145
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/two-2-iteration-loops/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/two-2-iteration-loops/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..aec3b11
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-2-iteration-loops/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,110 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+fn main_1() {
+  var odd_index : i32;
+  var even_index : i32;
+  var j : i32;
+  var ll : i32;
+  var x_59 : bool;
+  var x_60_phi : bool;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  let x_53 : f32 = gl_FragCoord.x;
+  let x_54 : bool = (x_53 < 128.0);
+  x_60_phi = x_54;
+  if (x_54) {
+    let x_58 : f32 = gl_FragCoord.y;
+    x_59 = (x_58 < 128.0);
+    x_60_phi = x_59;
+  }
+  let x_60 : bool = x_60_phi;
+  if (x_60) {
+    return;
+  }
+  odd_index = 0;
+  loop {
+    let x_11 : i32 = odd_index;
+    if ((x_11 <= 1)) {
+    } else {
+      break;
+    }
+    let x_70 : f32 = x_GLF_color.x;
+    x_GLF_color.x = (x_70 + 0.25);
+    let x_12 : i32 = odd_index;
+    odd_index = (x_12 + 1);
+  }
+  even_index = 1;
+  loop {
+    let x_14 : i32 = even_index;
+    if ((x_14 >= 0)) {
+    } else {
+      break;
+    }
+    let x_80 : f32 = x_GLF_color.x;
+    x_GLF_color.x = (x_80 + 0.25);
+    let x_84 : f32 = x_8.injectionSwitch.x;
+    let x_86 : f32 = x_8.injectionSwitch.y;
+    if ((x_84 > x_86)) {
+      continue;
+    }
+    let x_15 : i32 = even_index;
+    if ((x_15 >= 1)) {
+      discard;
+    }
+    j = 1;
+    loop {
+      if (true) {
+      } else {
+        break;
+      }
+      let x_16 : i32 = ll;
+      if ((x_16 >= 3)) {
+        break;
+      }
+      let x_17 : i32 = ll;
+      ll = (x_17 + 1);
+      let x_19 : i32 = j;
+      if ((bitcast<u32>(x_19) < 1u)) {
+        continue;
+      }
+      let x_106 : f32 = x_8.injectionSwitch.x;
+      let x_108 : f32 = x_8.injectionSwitch.y;
+      if ((x_106 > x_108)) {
+        break;
+      }
+
+      continuing {
+        let x_20 : i32 = j;
+        j = (x_20 + 1);
+      }
+    }
+    let x_113 : f32 = x_8.injectionSwitch.x;
+    let x_115 : f32 = x_8.injectionSwitch.y;
+    if ((x_113 > x_115)) {
+      x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+    }
+    let x_22 : i32 = even_index;
+    even_index = (x_22 - 1);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/two-for-loops-with-barrier-function/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/two-for-loops-with-barrier-function/0-opt.spvasm
new file mode 100644
index 0000000..f4d1bab
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-for-loops-with-barrier-function/0-opt.spvasm
@@ -0,0 +1,184 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main"
+               OpExecutionMode %main LocalSize 1 18 6
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %GLF_live2_looplimiter1 "GLF_live2_looplimiter1"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %GLF_live2gl_FragCoord "GLF_live2gl_FragCoord"
+               OpName %GLF_dead3x "GLF_dead3x"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %GLF_dead3k "GLF_dead3k"
+               OpName %doesNotMatter "doesNotMatter"
+               OpMemberName %doesNotMatter 0 "_compute_data"
+               OpName %__0 ""
+               OpDecorate %GLF_live2gl_FragCoord RelaxedPrecision
+               OpDecorate %13 RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %14 RelaxedPrecision
+               OpDecorate %15 RelaxedPrecision
+               OpDecorate %16 RelaxedPrecision
+               OpDecorate %_runtimearr_uint ArrayStride 4
+               OpMemberDecorate %doesNotMatter 0 Offset 0
+               OpDecorate %doesNotMatter BufferBlock
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+%GLF_live2gl_FragCoord = OpVariable %_ptr_Private_v4float Private
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+    %int_120 = OpConstant %int 120
+     %uint_2 = OpConstant %uint 2
+   %uint_264 = OpConstant %uint 264
+%_ptr_Function_float = OpTypePointer Function %float
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+    %float_0 = OpConstant %float 0
+      %int_2 = OpConstant %int 2
+    %float_4 = OpConstant %float 4
+%_runtimearr_uint = OpTypeRuntimeArray %uint
+%doesNotMatter = OpTypeStruct %_runtimearr_uint
+%_ptr_Uniform_doesNotMatter = OpTypePointer Uniform %doesNotMatter
+        %__0 = OpVariable %_ptr_Uniform_doesNotMatter Uniform
+    %uint_42 = OpConstant %uint 42
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+     %v3uint = OpTypeVector %uint 3
+    %uint_18 = OpConstant %uint 18
+     %uint_6 = OpConstant %uint 6
+%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_1 %uint_18 %uint_6
+       %main = OpFunction %void None %20
+         %50 = OpLabel
+%GLF_live2_looplimiter1 = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+          %j = OpVariable %_ptr_Function_int Function
+ %GLF_dead3x = OpVariable %_ptr_Function_float Function
+         %51 = OpVariable %_ptr_Function_float Function
+ %GLF_dead3k = OpVariable %_ptr_Function_int Function
+               OpStore %GLF_live2_looplimiter1 %int_0
+               OpStore %i %int_0
+               OpBranch %52
+         %52 = OpLabel
+               OpLoopMerge %53 %54 None
+               OpBranch %55
+         %55 = OpLabel
+         %56 = OpLoad %int %i
+         %57 = OpSLessThan %bool %56 %int_1
+               OpBranchConditional %57 %58 %53
+         %58 = OpLabel
+         %59 = OpLoad %int %GLF_live2_looplimiter1
+         %60 = OpSGreaterThanEqual %bool %59 %int_3
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %61
+         %62 = OpLabel
+               OpStore %j %int_0
+               OpBranch %63
+         %63 = OpLabel
+               OpLoopMerge %64 %65 None
+               OpBranch %66
+         %66 = OpLabel
+         %67 = OpLoad %int %j
+         %68 = OpSLessThan %bool %67 %int_1
+               OpBranchConditional %68 %69 %64
+         %69 = OpLabel
+         %70 = OpAccessChain %_ptr_Private_float %GLF_live2gl_FragCoord %uint_0
+         %13 = OpLoad %float %70
+         %71 = OpConvertFToS %int %13
+         %72 = OpSLessThan %bool %71 %int_120
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %74 %75
+         %74 = OpLabel
+               OpBranch %73
+         %75 = OpLabel
+               OpControlBarrier %uint_2 %uint_2 %uint_264
+               OpBranch %73
+         %73 = OpLabel
+               OpBranch %65
+         %65 = OpLabel
+         %76 = OpLoad %int %j
+         %77 = OpIAdd %int %76 %int_1
+               OpStore %j %77
+               OpBranch %63
+         %64 = OpLabel
+               OpBranch %53
+         %61 = OpLabel
+               OpBranch %54
+         %54 = OpLabel
+         %78 = OpLoad %int %i
+         %79 = OpIAdd %int %78 %int_1
+               OpStore %i %79
+               OpBranch %52
+         %53 = OpLabel
+         %80 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %81 = OpLoad %float %80
+         %82 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %83 = OpLoad %float %82
+         %84 = OpFOrdGreaterThan %bool %81 %83
+               OpSelectionMerge %85 None
+               OpBranchConditional %84 %86 %87
+         %86 = OpLabel
+         %88 = OpAccessChain %_ptr_Private_float %GLF_live2gl_FragCoord %uint_0
+         %14 = OpLoad %float %88
+               OpStore %51 %14
+               OpBranch %85
+         %87 = OpLabel
+               OpStore %51 %float_0
+               OpBranch %85
+         %85 = OpLabel
+         %15 = OpLoad %float %51
+               OpStore %GLF_dead3x %15
+               OpStore %GLF_dead3k %int_0
+               OpBranch %89
+         %89 = OpLabel
+               OpLoopMerge %90 %91 None
+               OpBranch %92
+         %92 = OpLabel
+         %93 = OpLoad %int %GLF_dead3k
+         %94 = OpSLessThan %bool %93 %int_2
+               OpBranchConditional %94 %95 %90
+         %95 = OpLabel
+         %96 = OpLoad %float %GLF_dead3x
+         %97 = OpFOrdGreaterThan %bool %96 %float_4
+               OpSelectionMerge %98 None
+               OpBranchConditional %97 %99 %98
+         %99 = OpLabel
+               OpBranch %90
+         %98 = OpLabel
+        %100 = OpAccessChain %_ptr_Private_float %GLF_live2gl_FragCoord %uint_0
+         %16 = OpLoad %float %100
+               OpStore %GLF_dead3x %16
+               OpControlBarrier %uint_2 %uint_2 %uint_264
+               OpBranch %91
+         %91 = OpLabel
+        %101 = OpLoad %int %GLF_dead3k
+        %102 = OpIAdd %int %101 %int_1
+               OpStore %GLF_dead3k %102
+               OpBranch %89
+         %90 = OpLabel
+        %103 = OpAccessChain %_ptr_Uniform_uint %__0 %int_0 %int_0
+               OpStore %103 %uint_42
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/two-for-loops-with-barrier-function/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/two-for-loops-with-barrier-function/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..054c863
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-for-loops-with-barrier-function/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,61 @@
+static float4 GLF_live2gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_9 : register(b1, space0) {
+  uint4 x_9[1];
+};
+RWByteAddressBuffer x_12 : register(u0, space0);
+
+void main_1() {
+  int GLF_live2_looplimiter1 = 0;
+  int i = 0;
+  int j = 0;
+  float GLF_dead3x = 0.0f;
+  float x_51 = 0.0f;
+  int GLF_dead3k = 0;
+  GLF_live2_looplimiter1 = 0;
+  i = 0;
+  {
+    for(; (i < 1); i = (i + 1)) {
+      if ((GLF_live2_looplimiter1 >= 3)) {
+        j = 0;
+        {
+          for(; (j < 1); j = (j + 1)) {
+            const float x_13 = GLF_live2gl_FragCoord.x;
+            if ((int(x_13) < 120)) {
+            } else {
+              GroupMemoryBarrierWithGroupSync();
+            }
+          }
+        }
+        break;
+      }
+    }
+  }
+  const float x_81 = asfloat(x_9[0].x);
+  const float x_83 = asfloat(x_9[0].y);
+  if ((x_81 > x_83)) {
+    const float x_14 = GLF_live2gl_FragCoord.x;
+    x_51 = x_14;
+  } else {
+    x_51 = 0.0f;
+  }
+  GLF_dead3x = x_51;
+  GLF_dead3k = 0;
+  {
+    for(; (GLF_dead3k < 2); GLF_dead3k = (GLF_dead3k + 1)) {
+      if ((GLF_dead3x > 4.0f)) {
+        break;
+      }
+      const float x_16 = GLF_live2gl_FragCoord.x;
+      GLF_dead3x = x_16;
+      GroupMemoryBarrierWithGroupSync();
+    }
+  }
+  x_12.Store((4u * uint(0)), asuint(42u));
+  return;
+}
+
+[numthreads(1, 18, 6)]
+void main() {
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/two-for-loops-with-barrier-function/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/two-for-loops-with-barrier-function/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..e1b045e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-for-loops-with-barrier-function/0-opt.spvasm.expected.msl
@@ -0,0 +1,90 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct doesNotMatter {
+  /* 0x0000 */ uint x_compute_data[1];
+};
+
+void main_1(constant buf0& x_9, device doesNotMatter& x_12, thread float4* const tint_symbol_1) {
+  int GLF_live2_looplimiter1 = 0;
+  int i = 0;
+  int j = 0;
+  float GLF_dead3x = 0.0f;
+  float x_51 = 0.0f;
+  int GLF_dead3k = 0;
+  GLF_live2_looplimiter1 = 0;
+  i = 0;
+  while (true) {
+    int const x_56 = i;
+    if ((x_56 < 1)) {
+    } else {
+      break;
+    }
+    int const x_59 = GLF_live2_looplimiter1;
+    if ((x_59 >= 3)) {
+      j = 0;
+      while (true) {
+        int const x_67 = j;
+        if ((x_67 < 1)) {
+        } else {
+          break;
+        }
+        float const x_13 = (*(tint_symbol_1)).x;
+        if ((int(x_13) < 120)) {
+        } else {
+          threadgroup_barrier(mem_flags::mem_threadgroup);
+        }
+        {
+          int const x_76 = j;
+          j = (x_76 + 1);
+        }
+      }
+      break;
+    }
+    {
+      int const x_78 = i;
+      i = (x_78 + 1);
+    }
+  }
+  float const x_81 = x_9.injectionSwitch.x;
+  float const x_83 = x_9.injectionSwitch.y;
+  if ((x_81 > x_83)) {
+    float const x_14 = (*(tint_symbol_1)).x;
+    x_51 = x_14;
+  } else {
+    x_51 = 0.0f;
+  }
+  float const x_15 = x_51;
+  GLF_dead3x = x_15;
+  GLF_dead3k = 0;
+  while (true) {
+    int const x_93 = GLF_dead3k;
+    if ((x_93 < 2)) {
+    } else {
+      break;
+    }
+    float const x_96 = GLF_dead3x;
+    if ((x_96 > 4.0f)) {
+      break;
+    }
+    float const x_16 = (*(tint_symbol_1)).x;
+    GLF_dead3x = x_16;
+    threadgroup_barrier(mem_flags::mem_threadgroup);
+    {
+      int const x_101 = GLF_dead3k;
+      GLF_dead3k = (x_101 + 1);
+    }
+  }
+  x_12.x_compute_data[0] = 42u;
+  return;
+}
+
+kernel void tint_symbol(constant buf0& x_9 [[buffer(1)]], device doesNotMatter& x_12 [[buffer(0)]]) {
+  thread float4 tint_symbol_2 = 0.0f;
+  main_1(x_9, x_12, &(tint_symbol_2));
+  return;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/two-for-loops-with-barrier-function/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/two-for-loops-with-barrier-function/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..8978ada
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-for-loops-with-barrier-function/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,203 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 113
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main"
+               OpExecutionMode %main LocalSize 1 18 6
+               OpName %GLF_live2gl_FragCoord "GLF_live2gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_9 "x_9"
+               OpName %doesNotMatter "doesNotMatter"
+               OpMemberName %doesNotMatter 0 "x_compute_data"
+               OpName %x_12 "x_12"
+               OpName %main_1 "main_1"
+               OpName %GLF_live2_looplimiter1 "GLF_live2_looplimiter1"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %GLF_dead3x "GLF_dead3x"
+               OpName %x_51 "x_51"
+               OpName %GLF_dead3k "GLF_dead3k"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 1
+               OpDecorate %doesNotMatter Block
+               OpMemberDecorate %doesNotMatter 0 Offset 0
+               OpDecorate %_runtimearr_uint ArrayStride 4
+               OpDecorate %x_12 DescriptorSet 0
+               OpDecorate %x_12 Binding 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%GLF_live2gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+       %uint = OpTypeInt 32 0
+%_runtimearr_uint = OpTypeRuntimeArray %uint
+%doesNotMatter = OpTypeStruct %_runtimearr_uint
+%_ptr_StorageBuffer_doesNotMatter = OpTypePointer StorageBuffer %doesNotMatter
+       %x_12 = OpVariable %_ptr_StorageBuffer_doesNotMatter StorageBuffer
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %22 = OpConstantNull %int
+%_ptr_Function_float = OpTypePointer Function %float
+         %27 = OpConstantNull %float
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+    %int_120 = OpConstant %int 120
+     %uint_2 = OpConstant %uint 2
+   %uint_264 = OpConstant %uint 264
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+    %float_0 = OpConstant %float 0
+      %int_2 = OpConstant %int 2
+    %float_4 = OpConstant %float 4
+%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
+    %uint_42 = OpConstant %uint 42
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+%GLF_live2_looplimiter1 = OpVariable %_ptr_Function_int Function %22
+          %i = OpVariable %_ptr_Function_int Function %22
+          %j = OpVariable %_ptr_Function_int Function %22
+ %GLF_dead3x = OpVariable %_ptr_Function_float Function %27
+       %x_51 = OpVariable %_ptr_Function_float Function %27
+ %GLF_dead3k = OpVariable %_ptr_Function_int Function %22
+               OpStore %GLF_live2_looplimiter1 %int_0
+               OpStore %i %int_0
+               OpBranch %31
+         %31 = OpLabel
+               OpLoopMerge %32 %33 None
+               OpBranch %34
+         %34 = OpLabel
+         %35 = OpLoad %int %i
+         %37 = OpSLessThan %bool %35 %int_1
+               OpSelectionMerge %39 None
+               OpBranchConditional %37 %40 %41
+         %40 = OpLabel
+               OpBranch %39
+         %41 = OpLabel
+               OpBranch %32
+         %39 = OpLabel
+         %42 = OpLoad %int %GLF_live2_looplimiter1
+         %44 = OpSGreaterThanEqual %bool %42 %int_3
+               OpSelectionMerge %45 None
+               OpBranchConditional %44 %46 %45
+         %46 = OpLabel
+               OpStore %j %int_0
+               OpBranch %47
+         %47 = OpLabel
+               OpLoopMerge %48 %49 None
+               OpBranch %50
+         %50 = OpLabel
+         %51 = OpLoad %int %j
+         %52 = OpSLessThan %bool %51 %int_1
+               OpSelectionMerge %53 None
+               OpBranchConditional %52 %54 %55
+         %54 = OpLabel
+               OpBranch %53
+         %55 = OpLabel
+               OpBranch %48
+         %53 = OpLabel
+         %58 = OpAccessChain %_ptr_Private_float %GLF_live2gl_FragCoord %uint_0
+         %59 = OpLoad %float %58
+         %60 = OpConvertFToS %int %59
+         %62 = OpSLessThan %bool %60 %int_120
+               OpSelectionMerge %63 None
+               OpBranchConditional %62 %64 %65
+         %64 = OpLabel
+               OpBranch %63
+         %65 = OpLabel
+               OpControlBarrier %uint_2 %uint_2 %uint_264
+               OpBranch %63
+         %63 = OpLabel
+               OpBranch %49
+         %49 = OpLabel
+         %69 = OpLoad %int %j
+         %70 = OpIAdd %int %69 %int_1
+               OpStore %j %70
+               OpBranch %47
+         %48 = OpLabel
+               OpBranch %32
+         %45 = OpLabel
+               OpBranch %33
+         %33 = OpLabel
+         %71 = OpLoad %int %i
+         %72 = OpIAdd %int %71 %int_1
+               OpStore %i %72
+               OpBranch %31
+         %32 = OpLabel
+         %74 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_0
+         %75 = OpLoad %float %74
+         %77 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_1
+         %78 = OpLoad %float %77
+         %79 = OpFOrdGreaterThan %bool %75 %78
+               OpSelectionMerge %80 None
+               OpBranchConditional %79 %81 %82
+         %81 = OpLabel
+         %83 = OpAccessChain %_ptr_Private_float %GLF_live2gl_FragCoord %uint_0
+         %84 = OpLoad %float %83
+               OpStore %x_51 %84
+               OpBranch %80
+         %82 = OpLabel
+               OpStore %x_51 %float_0
+               OpBranch %80
+         %80 = OpLabel
+         %86 = OpLoad %float %x_51
+               OpStore %GLF_dead3x %86
+               OpStore %GLF_dead3k %int_0
+               OpBranch %87
+         %87 = OpLabel
+               OpLoopMerge %88 %89 None
+               OpBranch %90
+         %90 = OpLabel
+         %91 = OpLoad %int %GLF_dead3k
+         %93 = OpSLessThan %bool %91 %int_2
+               OpSelectionMerge %94 None
+               OpBranchConditional %93 %95 %96
+         %95 = OpLabel
+               OpBranch %94
+         %96 = OpLabel
+               OpBranch %88
+         %94 = OpLabel
+         %97 = OpLoad %float %GLF_dead3x
+         %99 = OpFOrdGreaterThan %bool %97 %float_4
+               OpSelectionMerge %100 None
+               OpBranchConditional %99 %101 %100
+        %101 = OpLabel
+               OpBranch %88
+        %100 = OpLabel
+        %102 = OpAccessChain %_ptr_Private_float %GLF_live2gl_FragCoord %uint_0
+        %103 = OpLoad %float %102
+               OpStore %GLF_dead3x %103
+               OpControlBarrier %uint_2 %uint_2 %uint_264
+               OpBranch %89
+         %89 = OpLabel
+        %105 = OpLoad %int %GLF_dead3k
+        %106 = OpIAdd %int %105 %int_1
+               OpStore %GLF_dead3k %106
+               OpBranch %87
+         %88 = OpLabel
+        %108 = OpAccessChain %_ptr_StorageBuffer_uint %x_12 %uint_0 %int_0
+               OpStore %108 %uint_42
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %111 = OpLabel
+        %112 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/two-for-loops-with-barrier-function/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/two-for-loops-with-barrier-function/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..bc88eb2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-for-loops-with-barrier-function/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,99 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+type RTArr = [[stride(4)]] array<u32>;
+
+[[block]]
+struct doesNotMatter {
+  x_compute_data : RTArr;
+};
+
+var<private> GLF_live2gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf0;
+
+[[group(0), binding(0)]] var<storage, read_write> x_12 : doesNotMatter;
+
+fn main_1() {
+  var GLF_live2_looplimiter1 : i32;
+  var i : i32;
+  var j : i32;
+  var GLF_dead3x : f32;
+  var x_51 : f32;
+  var GLF_dead3k : i32;
+  GLF_live2_looplimiter1 = 0;
+  i = 0;
+  loop {
+    let x_56 : i32 = i;
+    if ((x_56 < 1)) {
+    } else {
+      break;
+    }
+    let x_59 : i32 = GLF_live2_looplimiter1;
+    if ((x_59 >= 3)) {
+      j = 0;
+      loop {
+        let x_67 : i32 = j;
+        if ((x_67 < 1)) {
+        } else {
+          break;
+        }
+        let x_13 : f32 = GLF_live2gl_FragCoord.x;
+        if ((i32(x_13) < 120)) {
+        } else {
+          workgroupBarrier();
+        }
+
+        continuing {
+          let x_76 : i32 = j;
+          j = (x_76 + 1);
+        }
+      }
+      break;
+    }
+
+    continuing {
+      let x_78 : i32 = i;
+      i = (x_78 + 1);
+    }
+  }
+  let x_81 : f32 = x_9.injectionSwitch.x;
+  let x_83 : f32 = x_9.injectionSwitch.y;
+  if ((x_81 > x_83)) {
+    let x_14 : f32 = GLF_live2gl_FragCoord.x;
+    x_51 = x_14;
+  } else {
+    x_51 = 0.0;
+  }
+  let x_15 : f32 = x_51;
+  GLF_dead3x = x_15;
+  GLF_dead3k = 0;
+  loop {
+    let x_93 : i32 = GLF_dead3k;
+    if ((x_93 < 2)) {
+    } else {
+      break;
+    }
+    let x_96 : f32 = GLF_dead3x;
+    if ((x_96 > 4.0)) {
+      break;
+    }
+    let x_16 : f32 = GLF_live2gl_FragCoord.x;
+    GLF_dead3x = x_16;
+    workgroupBarrier();
+
+    continuing {
+      let x_101 : i32 = GLF_dead3k;
+      GLF_dead3k = (x_101 + 1);
+    }
+  }
+  x_12.x_compute_data[0] = 42u;
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 18, 6)]]
+fn main() {
+  main_1();
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/two-for-loops-with-barrier-function/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/two-for-loops-with-barrier-function/0-opt.wgsl
new file mode 100644
index 0000000..bc88eb2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-for-loops-with-barrier-function/0-opt.wgsl
@@ -0,0 +1,99 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+type RTArr = [[stride(4)]] array<u32>;
+
+[[block]]
+struct doesNotMatter {
+  x_compute_data : RTArr;
+};
+
+var<private> GLF_live2gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf0;
+
+[[group(0), binding(0)]] var<storage, read_write> x_12 : doesNotMatter;
+
+fn main_1() {
+  var GLF_live2_looplimiter1 : i32;
+  var i : i32;
+  var j : i32;
+  var GLF_dead3x : f32;
+  var x_51 : f32;
+  var GLF_dead3k : i32;
+  GLF_live2_looplimiter1 = 0;
+  i = 0;
+  loop {
+    let x_56 : i32 = i;
+    if ((x_56 < 1)) {
+    } else {
+      break;
+    }
+    let x_59 : i32 = GLF_live2_looplimiter1;
+    if ((x_59 >= 3)) {
+      j = 0;
+      loop {
+        let x_67 : i32 = j;
+        if ((x_67 < 1)) {
+        } else {
+          break;
+        }
+        let x_13 : f32 = GLF_live2gl_FragCoord.x;
+        if ((i32(x_13) < 120)) {
+        } else {
+          workgroupBarrier();
+        }
+
+        continuing {
+          let x_76 : i32 = j;
+          j = (x_76 + 1);
+        }
+      }
+      break;
+    }
+
+    continuing {
+      let x_78 : i32 = i;
+      i = (x_78 + 1);
+    }
+  }
+  let x_81 : f32 = x_9.injectionSwitch.x;
+  let x_83 : f32 = x_9.injectionSwitch.y;
+  if ((x_81 > x_83)) {
+    let x_14 : f32 = GLF_live2gl_FragCoord.x;
+    x_51 = x_14;
+  } else {
+    x_51 = 0.0;
+  }
+  let x_15 : f32 = x_51;
+  GLF_dead3x = x_15;
+  GLF_dead3k = 0;
+  loop {
+    let x_93 : i32 = GLF_dead3k;
+    if ((x_93 < 2)) {
+    } else {
+      break;
+    }
+    let x_96 : f32 = GLF_dead3x;
+    if ((x_96 > 4.0)) {
+      break;
+    }
+    let x_16 : f32 = GLF_live2gl_FragCoord.x;
+    GLF_dead3x = x_16;
+    workgroupBarrier();
+
+    continuing {
+      let x_101 : i32 = GLF_dead3k;
+      GLF_dead3k = (x_101 + 1);
+    }
+  }
+  x_12.x_compute_data[0] = 42u;
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 18, 6)]]
+fn main() {
+  main_1();
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/two-for-loops-with-barrier-function/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/two-for-loops-with-barrier-function/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..054c863
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-for-loops-with-barrier-function/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,61 @@
+static float4 GLF_live2gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_9 : register(b1, space0) {
+  uint4 x_9[1];
+};
+RWByteAddressBuffer x_12 : register(u0, space0);
+
+void main_1() {
+  int GLF_live2_looplimiter1 = 0;
+  int i = 0;
+  int j = 0;
+  float GLF_dead3x = 0.0f;
+  float x_51 = 0.0f;
+  int GLF_dead3k = 0;
+  GLF_live2_looplimiter1 = 0;
+  i = 0;
+  {
+    for(; (i < 1); i = (i + 1)) {
+      if ((GLF_live2_looplimiter1 >= 3)) {
+        j = 0;
+        {
+          for(; (j < 1); j = (j + 1)) {
+            const float x_13 = GLF_live2gl_FragCoord.x;
+            if ((int(x_13) < 120)) {
+            } else {
+              GroupMemoryBarrierWithGroupSync();
+            }
+          }
+        }
+        break;
+      }
+    }
+  }
+  const float x_81 = asfloat(x_9[0].x);
+  const float x_83 = asfloat(x_9[0].y);
+  if ((x_81 > x_83)) {
+    const float x_14 = GLF_live2gl_FragCoord.x;
+    x_51 = x_14;
+  } else {
+    x_51 = 0.0f;
+  }
+  GLF_dead3x = x_51;
+  GLF_dead3k = 0;
+  {
+    for(; (GLF_dead3k < 2); GLF_dead3k = (GLF_dead3k + 1)) {
+      if ((GLF_dead3x > 4.0f)) {
+        break;
+      }
+      const float x_16 = GLF_live2gl_FragCoord.x;
+      GLF_dead3x = x_16;
+      GroupMemoryBarrierWithGroupSync();
+    }
+  }
+  x_12.Store((4u * uint(0)), asuint(42u));
+  return;
+}
+
+[numthreads(1, 18, 6)]
+void main() {
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/two-for-loops-with-barrier-function/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/two-for-loops-with-barrier-function/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..e1b045e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-for-loops-with-barrier-function/0-opt.wgsl.expected.msl
@@ -0,0 +1,90 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct doesNotMatter {
+  /* 0x0000 */ uint x_compute_data[1];
+};
+
+void main_1(constant buf0& x_9, device doesNotMatter& x_12, thread float4* const tint_symbol_1) {
+  int GLF_live2_looplimiter1 = 0;
+  int i = 0;
+  int j = 0;
+  float GLF_dead3x = 0.0f;
+  float x_51 = 0.0f;
+  int GLF_dead3k = 0;
+  GLF_live2_looplimiter1 = 0;
+  i = 0;
+  while (true) {
+    int const x_56 = i;
+    if ((x_56 < 1)) {
+    } else {
+      break;
+    }
+    int const x_59 = GLF_live2_looplimiter1;
+    if ((x_59 >= 3)) {
+      j = 0;
+      while (true) {
+        int const x_67 = j;
+        if ((x_67 < 1)) {
+        } else {
+          break;
+        }
+        float const x_13 = (*(tint_symbol_1)).x;
+        if ((int(x_13) < 120)) {
+        } else {
+          threadgroup_barrier(mem_flags::mem_threadgroup);
+        }
+        {
+          int const x_76 = j;
+          j = (x_76 + 1);
+        }
+      }
+      break;
+    }
+    {
+      int const x_78 = i;
+      i = (x_78 + 1);
+    }
+  }
+  float const x_81 = x_9.injectionSwitch.x;
+  float const x_83 = x_9.injectionSwitch.y;
+  if ((x_81 > x_83)) {
+    float const x_14 = (*(tint_symbol_1)).x;
+    x_51 = x_14;
+  } else {
+    x_51 = 0.0f;
+  }
+  float const x_15 = x_51;
+  GLF_dead3x = x_15;
+  GLF_dead3k = 0;
+  while (true) {
+    int const x_93 = GLF_dead3k;
+    if ((x_93 < 2)) {
+    } else {
+      break;
+    }
+    float const x_96 = GLF_dead3x;
+    if ((x_96 > 4.0f)) {
+      break;
+    }
+    float const x_16 = (*(tint_symbol_1)).x;
+    GLF_dead3x = x_16;
+    threadgroup_barrier(mem_flags::mem_threadgroup);
+    {
+      int const x_101 = GLF_dead3k;
+      GLF_dead3k = (x_101 + 1);
+    }
+  }
+  x_12.x_compute_data[0] = 42u;
+  return;
+}
+
+kernel void tint_symbol(constant buf0& x_9 [[buffer(1)]], device doesNotMatter& x_12 [[buffer(0)]]) {
+  thread float4 tint_symbol_2 = 0.0f;
+  main_1(x_9, x_12, &(tint_symbol_2));
+  return;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/two-for-loops-with-barrier-function/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/two-for-loops-with-barrier-function/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..8978ada
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-for-loops-with-barrier-function/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,203 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 113
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main"
+               OpExecutionMode %main LocalSize 1 18 6
+               OpName %GLF_live2gl_FragCoord "GLF_live2gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_9 "x_9"
+               OpName %doesNotMatter "doesNotMatter"
+               OpMemberName %doesNotMatter 0 "x_compute_data"
+               OpName %x_12 "x_12"
+               OpName %main_1 "main_1"
+               OpName %GLF_live2_looplimiter1 "GLF_live2_looplimiter1"
+               OpName %i "i"
+               OpName %j "j"
+               OpName %GLF_dead3x "GLF_dead3x"
+               OpName %x_51 "x_51"
+               OpName %GLF_dead3k "GLF_dead3k"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 1
+               OpDecorate %doesNotMatter Block
+               OpMemberDecorate %doesNotMatter 0 Offset 0
+               OpDecorate %_runtimearr_uint ArrayStride 4
+               OpDecorate %x_12 DescriptorSet 0
+               OpDecorate %x_12 Binding 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%GLF_live2gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+       %uint = OpTypeInt 32 0
+%_runtimearr_uint = OpTypeRuntimeArray %uint
+%doesNotMatter = OpTypeStruct %_runtimearr_uint
+%_ptr_StorageBuffer_doesNotMatter = OpTypePointer StorageBuffer %doesNotMatter
+       %x_12 = OpVariable %_ptr_StorageBuffer_doesNotMatter StorageBuffer
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %22 = OpConstantNull %int
+%_ptr_Function_float = OpTypePointer Function %float
+         %27 = OpConstantNull %float
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+    %int_120 = OpConstant %int 120
+     %uint_2 = OpConstant %uint 2
+   %uint_264 = OpConstant %uint 264
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+    %float_0 = OpConstant %float 0
+      %int_2 = OpConstant %int 2
+    %float_4 = OpConstant %float 4
+%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
+    %uint_42 = OpConstant %uint 42
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+%GLF_live2_looplimiter1 = OpVariable %_ptr_Function_int Function %22
+          %i = OpVariable %_ptr_Function_int Function %22
+          %j = OpVariable %_ptr_Function_int Function %22
+ %GLF_dead3x = OpVariable %_ptr_Function_float Function %27
+       %x_51 = OpVariable %_ptr_Function_float Function %27
+ %GLF_dead3k = OpVariable %_ptr_Function_int Function %22
+               OpStore %GLF_live2_looplimiter1 %int_0
+               OpStore %i %int_0
+               OpBranch %31
+         %31 = OpLabel
+               OpLoopMerge %32 %33 None
+               OpBranch %34
+         %34 = OpLabel
+         %35 = OpLoad %int %i
+         %37 = OpSLessThan %bool %35 %int_1
+               OpSelectionMerge %39 None
+               OpBranchConditional %37 %40 %41
+         %40 = OpLabel
+               OpBranch %39
+         %41 = OpLabel
+               OpBranch %32
+         %39 = OpLabel
+         %42 = OpLoad %int %GLF_live2_looplimiter1
+         %44 = OpSGreaterThanEqual %bool %42 %int_3
+               OpSelectionMerge %45 None
+               OpBranchConditional %44 %46 %45
+         %46 = OpLabel
+               OpStore %j %int_0
+               OpBranch %47
+         %47 = OpLabel
+               OpLoopMerge %48 %49 None
+               OpBranch %50
+         %50 = OpLabel
+         %51 = OpLoad %int %j
+         %52 = OpSLessThan %bool %51 %int_1
+               OpSelectionMerge %53 None
+               OpBranchConditional %52 %54 %55
+         %54 = OpLabel
+               OpBranch %53
+         %55 = OpLabel
+               OpBranch %48
+         %53 = OpLabel
+         %58 = OpAccessChain %_ptr_Private_float %GLF_live2gl_FragCoord %uint_0
+         %59 = OpLoad %float %58
+         %60 = OpConvertFToS %int %59
+         %62 = OpSLessThan %bool %60 %int_120
+               OpSelectionMerge %63 None
+               OpBranchConditional %62 %64 %65
+         %64 = OpLabel
+               OpBranch %63
+         %65 = OpLabel
+               OpControlBarrier %uint_2 %uint_2 %uint_264
+               OpBranch %63
+         %63 = OpLabel
+               OpBranch %49
+         %49 = OpLabel
+         %69 = OpLoad %int %j
+         %70 = OpIAdd %int %69 %int_1
+               OpStore %j %70
+               OpBranch %47
+         %48 = OpLabel
+               OpBranch %32
+         %45 = OpLabel
+               OpBranch %33
+         %33 = OpLabel
+         %71 = OpLoad %int %i
+         %72 = OpIAdd %int %71 %int_1
+               OpStore %i %72
+               OpBranch %31
+         %32 = OpLabel
+         %74 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_0
+         %75 = OpLoad %float %74
+         %77 = OpAccessChain %_ptr_Uniform_float %x_9 %uint_0 %uint_1
+         %78 = OpLoad %float %77
+         %79 = OpFOrdGreaterThan %bool %75 %78
+               OpSelectionMerge %80 None
+               OpBranchConditional %79 %81 %82
+         %81 = OpLabel
+         %83 = OpAccessChain %_ptr_Private_float %GLF_live2gl_FragCoord %uint_0
+         %84 = OpLoad %float %83
+               OpStore %x_51 %84
+               OpBranch %80
+         %82 = OpLabel
+               OpStore %x_51 %float_0
+               OpBranch %80
+         %80 = OpLabel
+         %86 = OpLoad %float %x_51
+               OpStore %GLF_dead3x %86
+               OpStore %GLF_dead3k %int_0
+               OpBranch %87
+         %87 = OpLabel
+               OpLoopMerge %88 %89 None
+               OpBranch %90
+         %90 = OpLabel
+         %91 = OpLoad %int %GLF_dead3k
+         %93 = OpSLessThan %bool %91 %int_2
+               OpSelectionMerge %94 None
+               OpBranchConditional %93 %95 %96
+         %95 = OpLabel
+               OpBranch %94
+         %96 = OpLabel
+               OpBranch %88
+         %94 = OpLabel
+         %97 = OpLoad %float %GLF_dead3x
+         %99 = OpFOrdGreaterThan %bool %97 %float_4
+               OpSelectionMerge %100 None
+               OpBranchConditional %99 %101 %100
+        %101 = OpLabel
+               OpBranch %88
+        %100 = OpLabel
+        %102 = OpAccessChain %_ptr_Private_float %GLF_live2gl_FragCoord %uint_0
+        %103 = OpLoad %float %102
+               OpStore %GLF_dead3x %103
+               OpControlBarrier %uint_2 %uint_2 %uint_264
+               OpBranch %89
+         %89 = OpLabel
+        %105 = OpLoad %int %GLF_dead3k
+        %106 = OpIAdd %int %105 %int_1
+               OpStore %GLF_dead3k %106
+               OpBranch %87
+         %88 = OpLabel
+        %108 = OpAccessChain %_ptr_StorageBuffer_uint %x_12 %uint_0 %int_0
+               OpStore %108 %uint_42
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %111 = OpLabel
+        %112 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/two-for-loops-with-barrier-function/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/two-for-loops-with-barrier-function/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..bc88eb2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-for-loops-with-barrier-function/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,99 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+type RTArr = [[stride(4)]] array<u32>;
+
+[[block]]
+struct doesNotMatter {
+  x_compute_data : RTArr;
+};
+
+var<private> GLF_live2gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(1)]] var<uniform> x_9 : buf0;
+
+[[group(0), binding(0)]] var<storage, read_write> x_12 : doesNotMatter;
+
+fn main_1() {
+  var GLF_live2_looplimiter1 : i32;
+  var i : i32;
+  var j : i32;
+  var GLF_dead3x : f32;
+  var x_51 : f32;
+  var GLF_dead3k : i32;
+  GLF_live2_looplimiter1 = 0;
+  i = 0;
+  loop {
+    let x_56 : i32 = i;
+    if ((x_56 < 1)) {
+    } else {
+      break;
+    }
+    let x_59 : i32 = GLF_live2_looplimiter1;
+    if ((x_59 >= 3)) {
+      j = 0;
+      loop {
+        let x_67 : i32 = j;
+        if ((x_67 < 1)) {
+        } else {
+          break;
+        }
+        let x_13 : f32 = GLF_live2gl_FragCoord.x;
+        if ((i32(x_13) < 120)) {
+        } else {
+          workgroupBarrier();
+        }
+
+        continuing {
+          let x_76 : i32 = j;
+          j = (x_76 + 1);
+        }
+      }
+      break;
+    }
+
+    continuing {
+      let x_78 : i32 = i;
+      i = (x_78 + 1);
+    }
+  }
+  let x_81 : f32 = x_9.injectionSwitch.x;
+  let x_83 : f32 = x_9.injectionSwitch.y;
+  if ((x_81 > x_83)) {
+    let x_14 : f32 = GLF_live2gl_FragCoord.x;
+    x_51 = x_14;
+  } else {
+    x_51 = 0.0;
+  }
+  let x_15 : f32 = x_51;
+  GLF_dead3x = x_15;
+  GLF_dead3k = 0;
+  loop {
+    let x_93 : i32 = GLF_dead3k;
+    if ((x_93 < 2)) {
+    } else {
+      break;
+    }
+    let x_96 : f32 = GLF_dead3x;
+    if ((x_96 > 4.0)) {
+      break;
+    }
+    let x_16 : f32 = GLF_live2gl_FragCoord.x;
+    GLF_dead3x = x_16;
+    workgroupBarrier();
+
+    continuing {
+      let x_101 : i32 = GLF_dead3k;
+      GLF_dead3k = (x_101 + 1);
+    }
+  }
+  x_12.x_compute_data[0] = 42u;
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 18, 6)]]
+fn main() {
+  main_1();
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.spvasm b/test/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.spvasm
new file mode 100644
index 0000000..7f00636
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.spvasm
@@ -0,0 +1,126 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %x "x"
+               OpName %matrix_u "matrix_u"
+               OpName %b "b"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "matrix_a_uni"
+               OpName %_ ""
+               OpName %matrix_b "matrix_b"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %x RelaxedPrecision
+               OpDecorate %10 RelaxedPrecision
+               OpDecorate %11 RelaxedPrecision
+               OpDecorate %12 RelaxedPrecision
+               OpDecorate %13 RelaxedPrecision
+               OpDecorate %b RelaxedPrecision
+               OpMemberDecorate %buf0 0 ColMajor
+               OpMemberDecorate %buf0 0 Offset 0
+               OpMemberDecorate %buf0 0 MatrixStride 16
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %14 RelaxedPrecision
+               OpDecorate %15 RelaxedPrecision
+               OpDecorate %16 RelaxedPrecision
+               OpDecorate %17 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_4 = OpConstant %int 4
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+    %float_1 = OpConstant %float 1
+%_ptr_Function_float = OpTypePointer Function %float
+%mat4v4float = OpTypeMatrix %v4float 4
+       %buf0 = OpTypeStruct %mat4v4float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+   %float_n1 = OpConstant %float -1
+     %uint_1 = OpConstant %uint 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %40 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %19
+         %41 = OpLabel
+          %x = OpVariable %_ptr_Function_int Function
+   %matrix_u = OpVariable %_ptr_Function_v4float Function
+          %b = OpVariable %_ptr_Function_int Function
+   %matrix_b = OpVariable %_ptr_Function_v4float Function
+         %42 = OpVariable %_ptr_Function_v4float Function
+               OpStore %x %int_4
+               OpBranch %43
+         %43 = OpLabel
+               OpLoopMerge %44 %45 None
+               OpBranch %46
+         %46 = OpLabel
+         %10 = OpLoad %int %x
+         %47 = OpSGreaterThanEqual %bool %10 %int_1
+               OpBranchConditional %47 %48 %44
+         %48 = OpLabel
+         %11 = OpLoad %int %x
+         %49 = OpAccessChain %_ptr_Function_float %matrix_u %11
+               OpStore %49 %float_1
+               OpBranch %45
+         %45 = OpLabel
+         %12 = OpLoad %int %x
+         %13 = OpISub %int %12 %int_1
+               OpStore %x %13
+               OpBranch %43
+         %44 = OpLabel
+               OpStore %b %int_4
+               OpBranch %50
+         %50 = OpLabel
+               OpLoopMerge %51 %52 None
+               OpBranch %53
+         %53 = OpLabel
+         %54 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0 %uint_0
+         %55 = OpLoad %float %54
+         %56 = OpFOrdLessThan %bool %55 %float_n1
+               OpBranchConditional %56 %57 %51
+         %57 = OpLabel
+         %14 = OpLoad %int %b
+         %15 = OpLoad %int %b
+         %58 = OpSGreaterThan %bool %15 %int_1
+               OpSelectionMerge %59 None
+               OpBranchConditional %58 %60 %61
+         %60 = OpLabel
+         %62 = OpLoad %v4float %matrix_b
+         %63 = OpLoad %v4float %matrix_b
+         %64 = OpExtInst %v4float %1 FMin %62 %63
+               OpStore %42 %64
+               OpBranch %59
+         %61 = OpLabel
+         %65 = OpLoad %v4float %matrix_u
+               OpStore %42 %65
+               OpBranch %59
+         %59 = OpLabel
+         %66 = OpAccessChain %_ptr_Function_float %42 %uint_1
+         %67 = OpLoad %float %66
+         %68 = OpAccessChain %_ptr_Function_float %matrix_b %14
+               OpStore %68 %67
+               OpBranch %52
+         %52 = OpLabel
+         %16 = OpLoad %int %b
+         %17 = OpISub %int %16 %int_1
+               OpStore %b %17
+               OpBranch %50
+         %51 = OpLabel
+               OpStore %_GLF_color %40
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..807ea01
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.spvasm.expected.hlsl
@@ -0,0 +1,58 @@
+void set_float4(inout float4 vec, int idx, float val) {
+  vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
+}
+
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int x = 0;
+  float4 matrix_u = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int b = 0;
+  float4 matrix_b = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 x_42 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  x = 4;
+  {
+    for(; (x >= 1); x = (x - 1)) {
+      set_float4(matrix_u, x, 1.0f);
+    }
+  }
+  b = 4;
+  while (true) {
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const float x_55 = asfloat(x_8[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_55 < -1.0f)) {
+    } else {
+      break;
+    }
+    const int x_14 = b;
+    if ((b > 1)) {
+      x_42 = min(matrix_b, matrix_b);
+    } else {
+      x_42 = matrix_u;
+    }
+    const float x_67 = x_42.y;
+    set_float4(matrix_b, x_14, x_67);
+    {
+      b = (b - 1);
+    }
+  }
+  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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.spvasm.expected.msl
new file mode 100644
index 0000000..3b8cbfc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.spvasm.expected.msl
@@ -0,0 +1,69 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float4x4 matrix_a_uni;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_4) {
+  int x = 0;
+  float4 matrix_u = 0.0f;
+  int b = 0;
+  float4 matrix_b = 0.0f;
+  float4 x_42 = 0.0f;
+  x = 4;
+  while (true) {
+    int const x_10 = x;
+    if ((x_10 >= 1)) {
+    } else {
+      break;
+    }
+    int const x_11 = x;
+    matrix_u[x_11] = 1.0f;
+    {
+      int const x_12 = x;
+      x = (x_12 - 1);
+    }
+  }
+  b = 4;
+  while (true) {
+    float const x_55 = x_8.matrix_a_uni[0].x;
+    if ((x_55 < -1.0f)) {
+    } else {
+      break;
+    }
+    int const x_14 = b;
+    int const x_15 = b;
+    if ((x_15 > 1)) {
+      float4 const x_62 = matrix_b;
+      float4 const x_63 = matrix_b;
+      x_42 = fmin(x_62, x_63);
+    } else {
+      float4 const x_65 = matrix_u;
+      x_42 = x_65;
+    }
+    float const x_67 = x_42.y;
+    matrix_b[x_14] = x_67;
+    {
+      int const x_16 = b;
+      b = (x_16 - 1);
+    }
+  }
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..3f924a6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.spvasm.expected.spvasm
@@ -0,0 +1,160 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 89
+; Schema: 0
+               OpCapability Shader
+         %67 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "matrix_a_uni"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x "x"
+               OpName %matrix_u "matrix_u"
+               OpName %b "b"
+               OpName %matrix_b "matrix_b"
+               OpName %x_42 "x_42"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpMemberDecorate %buf0 0 ColMajor
+               OpMemberDecorate %buf0 0 MatrixStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%mat4v4float = OpTypeMatrix %v4float 4
+       %buf0 = OpTypeStruct %mat4v4float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %19 = OpConstantNull %int
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+      %int_4 = OpConstant %int 4
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_1 = OpConstant %float 1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+   %float_n1 = OpConstant %float -1
+     %uint_1 = OpConstant %uint 1
+    %float_0 = OpConstant %float 0
+         %76 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %77 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %x = OpVariable %_ptr_Function_int Function %19
+   %matrix_u = OpVariable %_ptr_Function_v4float Function %9
+          %b = OpVariable %_ptr_Function_int Function %19
+   %matrix_b = OpVariable %_ptr_Function_v4float Function %9
+       %x_42 = OpVariable %_ptr_Function_v4float Function %9
+               OpStore %x %int_4
+               OpBranch %26
+         %26 = OpLabel
+               OpLoopMerge %27 %28 None
+               OpBranch %29
+         %29 = OpLabel
+         %30 = OpLoad %int %x
+         %32 = OpSGreaterThanEqual %bool %30 %int_1
+               OpSelectionMerge %34 None
+               OpBranchConditional %32 %35 %36
+         %35 = OpLabel
+               OpBranch %34
+         %36 = OpLabel
+               OpBranch %27
+         %34 = OpLabel
+         %37 = OpLoad %int %x
+         %39 = OpAccessChain %_ptr_Function_float %matrix_u %37
+               OpStore %39 %float_1
+               OpBranch %28
+         %28 = OpLabel
+         %41 = OpLoad %int %x
+         %42 = OpISub %int %41 %int_1
+               OpStore %x %42
+               OpBranch %26
+         %27 = OpLabel
+               OpStore %b %int_4
+               OpBranch %43
+         %43 = OpLabel
+               OpLoopMerge %44 %45 None
+               OpBranch %46
+         %46 = OpLabel
+         %51 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0 %uint_0
+         %52 = OpLoad %float %51
+         %54 = OpFOrdLessThan %bool %52 %float_n1
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %57
+         %56 = OpLabel
+               OpBranch %55
+         %57 = OpLabel
+               OpBranch %44
+         %55 = OpLabel
+         %58 = OpLoad %int %b
+         %59 = OpLoad %int %b
+         %60 = OpSGreaterThan %bool %59 %int_1
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %63
+         %62 = OpLabel
+         %64 = OpLoad %v4float %matrix_b
+         %65 = OpLoad %v4float %matrix_b
+         %66 = OpExtInst %v4float %67 NMin %64 %65
+               OpStore %x_42 %66
+               OpBranch %61
+         %63 = OpLabel
+         %68 = OpLoad %v4float %matrix_u
+               OpStore %x_42 %68
+               OpBranch %61
+         %61 = OpLabel
+         %70 = OpAccessChain %_ptr_Function_float %x_42 %uint_1
+         %71 = OpLoad %float %70
+         %72 = OpAccessChain %_ptr_Function_float %matrix_b %58
+               OpStore %72 %71
+               OpBranch %45
+         %45 = OpLabel
+         %73 = OpLoad %int %b
+         %74 = OpISub %int %73 %int_1
+               OpStore %b %74
+               OpBranch %43
+         %44 = OpLabel
+               OpStore %x_GLF_color %76
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %77
+%tint_symbol = OpFunctionParameter %main_out
+         %81 = OpLabel
+         %82 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %82
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %84 = OpLabel
+         %85 = OpFunctionCall %void %main_1
+         %87 = OpLoad %v4float %x_GLF_color
+         %88 = OpCompositeConstruct %main_out %87
+         %86 = OpFunctionCall %void %tint_symbol_2 %88
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..71733dd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.spvasm.expected.wgsl
@@ -0,0 +1,69 @@
+[[block]]
+struct buf0 {
+  matrix_a_uni : mat4x4<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x : i32;
+  var matrix_u : vec4<f32>;
+  var b : i32;
+  var matrix_b : vec4<f32>;
+  var x_42 : vec4<f32>;
+  x = 4;
+  loop {
+    let x_10 : i32 = x;
+    if ((x_10 >= 1)) {
+    } else {
+      break;
+    }
+    let x_11 : i32 = x;
+    matrix_u[x_11] = 1.0;
+
+    continuing {
+      let x_12 : i32 = x;
+      x = (x_12 - 1);
+    }
+  }
+  b = 4;
+  loop {
+    let x_55 : f32 = x_8.matrix_a_uni[0].x;
+    if ((x_55 < -1.0)) {
+    } else {
+      break;
+    }
+    let x_14 : i32 = b;
+    let x_15 : i32 = b;
+    if ((x_15 > 1)) {
+      let x_62 : vec4<f32> = matrix_b;
+      let x_63 : vec4<f32> = matrix_b;
+      x_42 = min(x_62, x_63);
+    } else {
+      let x_65 : vec4<f32> = matrix_u;
+      x_42 = x_65;
+    }
+    let x_67 : f32 = x_42.y;
+    matrix_b[x_14] = x_67;
+
+    continuing {
+      let x_16 : i32 = b;
+      b = (x_16 - 1);
+    }
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.wgsl b/test/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.wgsl
new file mode 100644
index 0000000..71733dd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.wgsl
@@ -0,0 +1,69 @@
+[[block]]
+struct buf0 {
+  matrix_a_uni : mat4x4<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x : i32;
+  var matrix_u : vec4<f32>;
+  var b : i32;
+  var matrix_b : vec4<f32>;
+  var x_42 : vec4<f32>;
+  x = 4;
+  loop {
+    let x_10 : i32 = x;
+    if ((x_10 >= 1)) {
+    } else {
+      break;
+    }
+    let x_11 : i32 = x;
+    matrix_u[x_11] = 1.0;
+
+    continuing {
+      let x_12 : i32 = x;
+      x = (x_12 - 1);
+    }
+  }
+  b = 4;
+  loop {
+    let x_55 : f32 = x_8.matrix_a_uni[0].x;
+    if ((x_55 < -1.0)) {
+    } else {
+      break;
+    }
+    let x_14 : i32 = b;
+    let x_15 : i32 = b;
+    if ((x_15 > 1)) {
+      let x_62 : vec4<f32> = matrix_b;
+      let x_63 : vec4<f32> = matrix_b;
+      x_42 = min(x_62, x_63);
+    } else {
+      let x_65 : vec4<f32> = matrix_u;
+      x_42 = x_65;
+    }
+    let x_67 : f32 = x_42.y;
+    matrix_b[x_14] = x_67;
+
+    continuing {
+      let x_16 : i32 = b;
+      b = (x_16 - 1);
+    }
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..807ea01
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.wgsl.expected.hlsl
@@ -0,0 +1,58 @@
+void set_float4(inout float4 vec, int idx, float val) {
+  vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
+}
+
+cbuffer cbuffer_x_8 : register(b0, space0) {
+  uint4 x_8[4];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int x = 0;
+  float4 matrix_u = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int b = 0;
+  float4 matrix_b = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float4 x_42 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  x = 4;
+  {
+    for(; (x >= 1); x = (x - 1)) {
+      set_float4(matrix_u, x, 1.0f);
+    }
+  }
+  b = 4;
+  while (true) {
+    const uint scalar_offset = ((16u * uint(0))) / 4;
+    const float x_55 = asfloat(x_8[scalar_offset / 4][scalar_offset % 4]);
+    if ((x_55 < -1.0f)) {
+    } else {
+      break;
+    }
+    const int x_14 = b;
+    if ((b > 1)) {
+      x_42 = min(matrix_b, matrix_b);
+    } else {
+      x_42 = matrix_u;
+    }
+    const float x_67 = x_42.y;
+    set_float4(matrix_b, x_14, x_67);
+    {
+      b = (b - 1);
+    }
+  }
+  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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.wgsl.expected.msl
new file mode 100644
index 0000000..3b8cbfc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.wgsl.expected.msl
@@ -0,0 +1,69 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ float4x4 matrix_a_uni;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_8, thread float4* const tint_symbol_4) {
+  int x = 0;
+  float4 matrix_u = 0.0f;
+  int b = 0;
+  float4 matrix_b = 0.0f;
+  float4 x_42 = 0.0f;
+  x = 4;
+  while (true) {
+    int const x_10 = x;
+    if ((x_10 >= 1)) {
+    } else {
+      break;
+    }
+    int const x_11 = x;
+    matrix_u[x_11] = 1.0f;
+    {
+      int const x_12 = x;
+      x = (x_12 - 1);
+    }
+  }
+  b = 4;
+  while (true) {
+    float const x_55 = x_8.matrix_a_uni[0].x;
+    if ((x_55 < -1.0f)) {
+    } else {
+      break;
+    }
+    int const x_14 = b;
+    int const x_15 = b;
+    if ((x_15 > 1)) {
+      float4 const x_62 = matrix_b;
+      float4 const x_63 = matrix_b;
+      x_42 = fmin(x_62, x_63);
+    } else {
+      float4 const x_65 = matrix_u;
+      x_42 = x_65;
+    }
+    float const x_67 = x_42.y;
+    matrix_b[x_14] = x_67;
+    {
+      int const x_16 = b;
+      b = (x_16 - 1);
+    }
+  }
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_8 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_8, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..3f924a6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.wgsl.expected.spvasm
@@ -0,0 +1,160 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 89
+; Schema: 0
+               OpCapability Shader
+         %67 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "matrix_a_uni"
+               OpName %x_8 "x_8"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x "x"
+               OpName %matrix_u "matrix_u"
+               OpName %b "b"
+               OpName %matrix_b "matrix_b"
+               OpName %x_42 "x_42"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpMemberDecorate %buf0 0 ColMajor
+               OpMemberDecorate %buf0 0 MatrixStride 16
+               OpDecorate %x_8 NonWritable
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%mat4v4float = OpTypeMatrix %v4float 4
+       %buf0 = OpTypeStruct %mat4v4float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_8 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %19 = OpConstantNull %int
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+      %int_4 = OpConstant %int 4
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_1 = OpConstant %float 1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+   %float_n1 = OpConstant %float -1
+     %uint_1 = OpConstant %uint 1
+    %float_0 = OpConstant %float 0
+         %76 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %77 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %x = OpVariable %_ptr_Function_int Function %19
+   %matrix_u = OpVariable %_ptr_Function_v4float Function %9
+          %b = OpVariable %_ptr_Function_int Function %19
+   %matrix_b = OpVariable %_ptr_Function_v4float Function %9
+       %x_42 = OpVariable %_ptr_Function_v4float Function %9
+               OpStore %x %int_4
+               OpBranch %26
+         %26 = OpLabel
+               OpLoopMerge %27 %28 None
+               OpBranch %29
+         %29 = OpLabel
+         %30 = OpLoad %int %x
+         %32 = OpSGreaterThanEqual %bool %30 %int_1
+               OpSelectionMerge %34 None
+               OpBranchConditional %32 %35 %36
+         %35 = OpLabel
+               OpBranch %34
+         %36 = OpLabel
+               OpBranch %27
+         %34 = OpLabel
+         %37 = OpLoad %int %x
+         %39 = OpAccessChain %_ptr_Function_float %matrix_u %37
+               OpStore %39 %float_1
+               OpBranch %28
+         %28 = OpLabel
+         %41 = OpLoad %int %x
+         %42 = OpISub %int %41 %int_1
+               OpStore %x %42
+               OpBranch %26
+         %27 = OpLabel
+               OpStore %b %int_4
+               OpBranch %43
+         %43 = OpLabel
+               OpLoopMerge %44 %45 None
+               OpBranch %46
+         %46 = OpLabel
+         %51 = OpAccessChain %_ptr_Uniform_float %x_8 %uint_0 %int_0 %uint_0
+         %52 = OpLoad %float %51
+         %54 = OpFOrdLessThan %bool %52 %float_n1
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %57
+         %56 = OpLabel
+               OpBranch %55
+         %57 = OpLabel
+               OpBranch %44
+         %55 = OpLabel
+         %58 = OpLoad %int %b
+         %59 = OpLoad %int %b
+         %60 = OpSGreaterThan %bool %59 %int_1
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %63
+         %62 = OpLabel
+         %64 = OpLoad %v4float %matrix_b
+         %65 = OpLoad %v4float %matrix_b
+         %66 = OpExtInst %v4float %67 NMin %64 %65
+               OpStore %x_42 %66
+               OpBranch %61
+         %63 = OpLabel
+         %68 = OpLoad %v4float %matrix_u
+               OpStore %x_42 %68
+               OpBranch %61
+         %61 = OpLabel
+         %70 = OpAccessChain %_ptr_Function_float %x_42 %uint_1
+         %71 = OpLoad %float %70
+         %72 = OpAccessChain %_ptr_Function_float %matrix_b %58
+               OpStore %72 %71
+               OpBranch %45
+         %45 = OpLabel
+         %73 = OpLoad %int %b
+         %74 = OpISub %int %73 %int_1
+               OpStore %b %74
+               OpBranch %43
+         %44 = OpLabel
+               OpStore %x_GLF_color %76
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %77
+%tint_symbol = OpFunctionParameter %main_out
+         %81 = OpLabel
+         %82 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %82
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %84 = OpLabel
+         %85 = OpFunctionCall %void %main_1
+         %87 = OpLoad %v4float %x_GLF_color
+         %88 = OpCompositeConstruct %main_out %87
+         %86 = OpFunctionCall %void %tint_symbol_2 %88
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..71733dd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-loops-matrix/0.wgsl.expected.wgsl
@@ -0,0 +1,69 @@
+[[block]]
+struct buf0 {
+  matrix_a_uni : mat4x4<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_8 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x : i32;
+  var matrix_u : vec4<f32>;
+  var b : i32;
+  var matrix_b : vec4<f32>;
+  var x_42 : vec4<f32>;
+  x = 4;
+  loop {
+    let x_10 : i32 = x;
+    if ((x_10 >= 1)) {
+    } else {
+      break;
+    }
+    let x_11 : i32 = x;
+    matrix_u[x_11] = 1.0;
+
+    continuing {
+      let x_12 : i32 = x;
+      x = (x_12 - 1);
+    }
+  }
+  b = 4;
+  loop {
+    let x_55 : f32 = x_8.matrix_a_uni[0].x;
+    if ((x_55 < -1.0)) {
+    } else {
+      break;
+    }
+    let x_14 : i32 = b;
+    let x_15 : i32 = b;
+    if ((x_15 > 1)) {
+      let x_62 : vec4<f32> = matrix_b;
+      let x_63 : vec4<f32> = matrix_b;
+      x_42 = min(x_62, x_63);
+    } else {
+      let x_65 : vec4<f32> = matrix_u;
+      x_42 = x_65;
+    }
+    let x_67 : f32 = x_42.y;
+    matrix_b[x_14] = x_67;
+
+    continuing {
+      let x_16 : i32 = b;
+      b = (x_16 - 1);
+    }
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/two-loops-set-struct/0.spvasm b/test/vk-gl-cts/graphicsfuzz/two-loops-set-struct/0.spvasm
new file mode 100644
index 0000000..5657c00
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-loops-set-struct/0.spvasm
@@ -0,0 +1,84 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %StructType "StructType"
+               OpMemberName %StructType 0 "col"
+               OpMemberName %StructType 1 "bbbb"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %7 RelaxedPrecision
+               OpDecorate %8 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %9 RelaxedPrecision
+               OpDecorate %10 RelaxedPrecision
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+    %v3float = OpTypeVector %float 3
+     %v4bool = OpTypeVector %bool 4
+ %StructType = OpTypeStruct %v3float %v4bool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %26 = OpConstantComposite %v3float %float_1 %float_0 %float_0
+      %int_1 = OpConstant %int 1
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %30 = OpUndef %StructType
+       %main = OpFunction %void None %12
+         %31 = OpLabel
+               OpBranch %32
+         %32 = OpLabel
+         %33 = OpPhi %StructType %30 %31 %34 %35
+          %9 = OpPhi %int %int_0 %31 %7 %35
+         %36 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %37 = OpLoad %float %36
+         %38 = OpConvertFToS %int %37
+         %39 = OpSLessThan %bool %9 %38
+               OpLoopMerge %40 %35 None
+               OpBranchConditional %39 %35 %40
+         %35 = OpLabel
+         %34 = OpCompositeInsert %StructType %26 %33 0
+          %7 = OpIAdd %int %9 %int_1
+               OpBranch %32
+         %40 = OpLabel
+               OpBranch %41
+         %41 = OpLabel
+         %42 = OpPhi %StructType %33 %40 %43 %44
+         %10 = OpPhi %int %int_0 %40 %8 %44
+         %45 = OpSLessThan %bool %10 %38
+               OpLoopMerge %46 %44 None
+               OpBranchConditional %45 %44 %46
+         %44 = OpLabel
+         %43 = OpCompositeInsert %StructType %26 %42 0
+          %8 = OpIAdd %int %10 %int_1
+               OpBranch %41
+         %46 = OpLabel
+         %47 = OpCompositeExtract %v3float %42 0
+         %48 = OpCompositeExtract %float %47 0
+         %49 = OpCompositeExtract %float %47 1
+         %50 = OpCompositeExtract %float %47 2
+         %51 = OpCompositeConstruct %v4float %48 %49 %50 %float_1
+               OpStore %_GLF_color %51
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/two-loops-set-struct/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/two-loops-set-struct/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..3a00c14
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-loops-set-struct/0.spvasm.expected.hlsl
@@ -0,0 +1,77 @@
+struct StructType {
+  float3 col;
+  bool4 bbbb;
+};
+
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  StructType x_33 = (StructType)0;
+  int x_38 = 0;
+  StructType x_42 = (StructType)0;
+  StructType x_33_phi = (StructType)0;
+  int x_9_phi = 0;
+  StructType x_42_phi = (StructType)0;
+  int x_10_phi = 0;
+  const StructType tint_symbol_3 = {float3(0.0f, 0.0f, 0.0f), bool4(false, false, false, false)};
+  x_33_phi = tint_symbol_3;
+  x_9_phi = 0;
+  while (true) {
+    StructType x_34 = (StructType)0;
+    int x_7 = 0;
+    x_33 = x_33_phi;
+    const int x_9 = x_9_phi;
+    const float x_37 = asfloat(x_5[0].y);
+    x_38 = int(x_37);
+    if ((x_9 < x_38)) {
+    } else {
+      break;
+    }
+    {
+      x_34 = x_33;
+      x_34.col = float3(1.0f, 0.0f, 0.0f);
+      x_7 = (x_9 + 1);
+      x_33_phi = x_34;
+      x_9_phi = x_7;
+    }
+  }
+  x_42_phi = x_33;
+  x_10_phi = 0;
+  while (true) {
+    StructType x_43 = (StructType)0;
+    int x_8 = 0;
+    x_42 = x_42_phi;
+    const int x_10 = x_10_phi;
+    if ((x_10 < x_38)) {
+    } else {
+      break;
+    }
+    {
+      x_43 = x_42;
+      x_43.col = float3(1.0f, 0.0f, 0.0f);
+      x_8 = (x_10 + 1);
+      x_42_phi = x_43;
+      x_10_phi = x_8;
+    }
+  }
+  const float3 x_47 = x_42.col;
+  x_GLF_color = float4(x_47.x, x_47.y, x_47.z, 1.0f);
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/two-loops-set-struct/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/two-loops-set-struct/0.spvasm.expected.msl
new file mode 100644
index 0000000..51c44be
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-loops-set-struct/0.spvasm.expected.msl
@@ -0,0 +1,79 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct StructType {
+  float3 col;
+  bool4 bbbb;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_5) {
+  StructType x_33 = {};
+  int x_38 = 0;
+  StructType x_42 = {};
+  StructType x_33_phi = {};
+  int x_9_phi = 0;
+  StructType x_42_phi = {};
+  int x_10_phi = 0;
+  StructType const tint_symbol_3 = {.col=float3(0.0f, 0.0f, 0.0f), .bbbb=bool4(false, false, false, false)};
+  x_33_phi = tint_symbol_3;
+  x_9_phi = 0;
+  while (true) {
+    StructType x_34 = {};
+    int x_7 = 0;
+    x_33 = x_33_phi;
+    int const x_9 = x_9_phi;
+    float const x_37 = x_5.injectionSwitch.y;
+    x_38 = int(x_37);
+    if ((x_9 < x_38)) {
+    } else {
+      break;
+    }
+    {
+      x_34 = x_33;
+      x_34.col = float3(1.0f, 0.0f, 0.0f);
+      x_7 = (x_9 + 1);
+      x_33_phi = x_34;
+      x_9_phi = x_7;
+    }
+  }
+  x_42_phi = x_33;
+  x_10_phi = 0;
+  while (true) {
+    StructType x_43 = {};
+    int x_8 = 0;
+    x_42 = x_42_phi;
+    int const x_10 = x_10_phi;
+    if ((x_10 < x_38)) {
+    } else {
+      break;
+    }
+    {
+      x_43 = x_42;
+      x_43.col = float3(1.0f, 0.0f, 0.0f);
+      x_8 = (x_10 + 1);
+      x_42_phi = x_43;
+      x_10_phi = x_8;
+    }
+  }
+  float3 const x_47 = x_42.col;
+  *(tint_symbol_5) = float4(x_47.x, x_47.y, x_47.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_5, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/two-loops-set-struct/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/two-loops-set-struct/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..c14f116
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-loops-set-struct/0.spvasm.expected.spvasm
@@ -0,0 +1,189 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 104
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %StructType "StructType"
+               OpMemberName %StructType 0 "col"
+               OpMemberName %StructType 1 "bbbb"
+               OpName %x_33 "x_33"
+               OpName %x_38 "x_38"
+               OpName %x_42 "x_42"
+               OpName %x_33_phi "x_33_phi"
+               OpName %x_9_phi "x_9_phi"
+               OpName %x_42_phi "x_42_phi"
+               OpName %x_10_phi "x_10_phi"
+               OpName %x_34 "x_34"
+               OpName %x_7 "x_7"
+               OpName %x_43 "x_43"
+               OpName %x_8 "x_8"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %StructType 0 Offset 0
+               OpMemberDecorate %StructType 1 Offset 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+    %v3float = OpTypeVector %float 3
+       %bool = OpTypeBool
+     %v4bool = OpTypeVector %bool 4
+ %StructType = OpTypeStruct %v3float %v4bool
+%_ptr_Function_StructType = OpTypePointer Function %StructType
+         %22 = OpConstantNull %StructType
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %26 = OpConstantNull %int
+    %float_0 = OpConstant %float 0
+         %33 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+      %false = OpConstantFalse %bool
+         %35 = OpConstantComposite %v4bool %false %false %false %false
+         %36 = OpConstantComposite %StructType %33 %35
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+    %float_1 = OpConstant %float 1
+         %62 = OpConstantComposite %v3float %float_1 %float_0 %float_0
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %92 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+       %x_33 = OpVariable %_ptr_Function_StructType Function %22
+       %x_38 = OpVariable %_ptr_Function_int Function %26
+       %x_42 = OpVariable %_ptr_Function_StructType Function %22
+   %x_33_phi = OpVariable %_ptr_Function_StructType Function %22
+    %x_9_phi = OpVariable %_ptr_Function_int Function %26
+   %x_42_phi = OpVariable %_ptr_Function_StructType Function %22
+   %x_10_phi = OpVariable %_ptr_Function_int Function %26
+       %x_34 = OpVariable %_ptr_Function_StructType Function %22
+        %x_7 = OpVariable %_ptr_Function_int Function %26
+       %x_43 = OpVariable %_ptr_Function_StructType Function %22
+        %x_8 = OpVariable %_ptr_Function_int Function %26
+               OpStore %x_33_phi %36
+               OpStore %x_9_phi %int_0
+               OpBranch %38
+         %38 = OpLabel
+               OpLoopMerge %39 %40 None
+               OpBranch %41
+         %41 = OpLabel
+         %44 = OpLoad %StructType %x_33_phi
+               OpStore %x_33 %44
+         %45 = OpLoad %int %x_9_phi
+         %50 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %uint_1
+         %51 = OpLoad %float %50
+         %52 = OpConvertFToS %int %51
+               OpStore %x_38 %52
+         %53 = OpLoad %int %x_38
+         %54 = OpSLessThan %bool %45 %53
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %57
+         %56 = OpLabel
+               OpBranch %55
+         %57 = OpLabel
+               OpBranch %39
+         %55 = OpLabel
+               OpBranch %40
+         %40 = OpLabel
+         %58 = OpLoad %StructType %x_33
+               OpStore %x_34 %58
+         %60 = OpAccessChain %_ptr_Function_v3float %x_34 %uint_0
+               OpStore %60 %62
+         %64 = OpIAdd %int %45 %int_1
+               OpStore %x_7 %64
+         %65 = OpLoad %StructType %x_34
+               OpStore %x_33_phi %65
+         %66 = OpLoad %int %x_7
+               OpStore %x_9_phi %66
+               OpBranch %38
+         %39 = OpLabel
+         %67 = OpLoad %StructType %x_33
+               OpStore %x_42_phi %67
+               OpStore %x_10_phi %int_0
+               OpBranch %68
+         %68 = OpLabel
+               OpLoopMerge %69 %70 None
+               OpBranch %71
+         %71 = OpLabel
+         %74 = OpLoad %StructType %x_42_phi
+               OpStore %x_42 %74
+         %75 = OpLoad %int %x_10_phi
+         %76 = OpLoad %int %x_38
+         %77 = OpSLessThan %bool %75 %76
+               OpSelectionMerge %78 None
+               OpBranchConditional %77 %79 %80
+         %79 = OpLabel
+               OpBranch %78
+         %80 = OpLabel
+               OpBranch %69
+         %78 = OpLabel
+               OpBranch %70
+         %70 = OpLabel
+         %81 = OpLoad %StructType %x_42
+               OpStore %x_43 %81
+         %82 = OpAccessChain %_ptr_Function_v3float %x_43 %uint_0
+               OpStore %82 %62
+         %83 = OpIAdd %int %75 %int_1
+               OpStore %x_8 %83
+         %84 = OpLoad %StructType %x_43
+               OpStore %x_42_phi %84
+         %85 = OpLoad %int %x_8
+               OpStore %x_10_phi %85
+               OpBranch %68
+         %69 = OpLabel
+         %86 = OpAccessChain %_ptr_Function_v3float %x_42 %uint_0
+         %87 = OpLoad %v3float %86
+         %88 = OpCompositeExtract %float %87 0
+         %89 = OpCompositeExtract %float %87 1
+         %90 = OpCompositeExtract %float %87 2
+         %91 = OpCompositeConstruct %v4float %88 %89 %90 %float_1
+               OpStore %x_GLF_color %91
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %92
+%tint_symbol = OpFunctionParameter %main_out
+         %96 = OpLabel
+         %97 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %97
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %99 = OpLabel
+        %100 = OpFunctionCall %void %main_1
+        %102 = OpLoad %v4float %x_GLF_color
+        %103 = OpCompositeConstruct %main_out %102
+        %101 = OpFunctionCall %void %tint_symbol_2 %103
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/two-loops-set-struct/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/two-loops-set-struct/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..187ea36
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-loops-set-struct/0.spvasm.expected.wgsl
@@ -0,0 +1,79 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+struct StructType {
+  col : vec3<f32>;
+  bbbb : vec4<bool>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_33 : StructType;
+  var x_38 : i32;
+  var x_42 : StructType;
+  var x_33_phi : StructType;
+  var x_9_phi : i32;
+  var x_42_phi : StructType;
+  var x_10_phi : i32;
+  x_33_phi = StructType(vec3<f32>(0.0, 0.0, 0.0), vec4<bool>(false, false, false, false));
+  x_9_phi = 0;
+  loop {
+    var x_34 : StructType;
+    var x_7 : i32;
+    x_33 = x_33_phi;
+    let x_9 : i32 = x_9_phi;
+    let x_37 : f32 = x_5.injectionSwitch.y;
+    x_38 = i32(x_37);
+    if ((x_9 < x_38)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_34 = x_33;
+      x_34.col = vec3<f32>(1.0, 0.0, 0.0);
+      x_7 = (x_9 + 1);
+      x_33_phi = x_34;
+      x_9_phi = x_7;
+    }
+  }
+  x_42_phi = x_33;
+  x_10_phi = 0;
+  loop {
+    var x_43 : StructType;
+    var x_8 : i32;
+    x_42 = x_42_phi;
+    let x_10 : i32 = x_10_phi;
+    if ((x_10 < x_38)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_43 = x_42;
+      x_43.col = vec3<f32>(1.0, 0.0, 0.0);
+      x_8 = (x_10 + 1);
+      x_42_phi = x_43;
+      x_10_phi = x_8;
+    }
+  }
+  let x_47 : vec3<f32> = x_42.col;
+  x_GLF_color = vec4<f32>(x_47.x, x_47.y, x_47.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/two-loops-set-struct/0.wgsl b/test/vk-gl-cts/graphicsfuzz/two-loops-set-struct/0.wgsl
new file mode 100644
index 0000000..187ea36
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-loops-set-struct/0.wgsl
@@ -0,0 +1,79 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+struct StructType {
+  col : vec3<f32>;
+  bbbb : vec4<bool>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_33 : StructType;
+  var x_38 : i32;
+  var x_42 : StructType;
+  var x_33_phi : StructType;
+  var x_9_phi : i32;
+  var x_42_phi : StructType;
+  var x_10_phi : i32;
+  x_33_phi = StructType(vec3<f32>(0.0, 0.0, 0.0), vec4<bool>(false, false, false, false));
+  x_9_phi = 0;
+  loop {
+    var x_34 : StructType;
+    var x_7 : i32;
+    x_33 = x_33_phi;
+    let x_9 : i32 = x_9_phi;
+    let x_37 : f32 = x_5.injectionSwitch.y;
+    x_38 = i32(x_37);
+    if ((x_9 < x_38)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_34 = x_33;
+      x_34.col = vec3<f32>(1.0, 0.0, 0.0);
+      x_7 = (x_9 + 1);
+      x_33_phi = x_34;
+      x_9_phi = x_7;
+    }
+  }
+  x_42_phi = x_33;
+  x_10_phi = 0;
+  loop {
+    var x_43 : StructType;
+    var x_8 : i32;
+    x_42 = x_42_phi;
+    let x_10 : i32 = x_10_phi;
+    if ((x_10 < x_38)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_43 = x_42;
+      x_43.col = vec3<f32>(1.0, 0.0, 0.0);
+      x_8 = (x_10 + 1);
+      x_42_phi = x_43;
+      x_10_phi = x_8;
+    }
+  }
+  let x_47 : vec3<f32> = x_42.col;
+  x_GLF_color = vec4<f32>(x_47.x, x_47.y, x_47.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/two-loops-set-struct/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/two-loops-set-struct/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..3a00c14
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-loops-set-struct/0.wgsl.expected.hlsl
@@ -0,0 +1,77 @@
+struct StructType {
+  float3 col;
+  bool4 bbbb;
+};
+
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  StructType x_33 = (StructType)0;
+  int x_38 = 0;
+  StructType x_42 = (StructType)0;
+  StructType x_33_phi = (StructType)0;
+  int x_9_phi = 0;
+  StructType x_42_phi = (StructType)0;
+  int x_10_phi = 0;
+  const StructType tint_symbol_3 = {float3(0.0f, 0.0f, 0.0f), bool4(false, false, false, false)};
+  x_33_phi = tint_symbol_3;
+  x_9_phi = 0;
+  while (true) {
+    StructType x_34 = (StructType)0;
+    int x_7 = 0;
+    x_33 = x_33_phi;
+    const int x_9 = x_9_phi;
+    const float x_37 = asfloat(x_5[0].y);
+    x_38 = int(x_37);
+    if ((x_9 < x_38)) {
+    } else {
+      break;
+    }
+    {
+      x_34 = x_33;
+      x_34.col = float3(1.0f, 0.0f, 0.0f);
+      x_7 = (x_9 + 1);
+      x_33_phi = x_34;
+      x_9_phi = x_7;
+    }
+  }
+  x_42_phi = x_33;
+  x_10_phi = 0;
+  while (true) {
+    StructType x_43 = (StructType)0;
+    int x_8 = 0;
+    x_42 = x_42_phi;
+    const int x_10 = x_10_phi;
+    if ((x_10 < x_38)) {
+    } else {
+      break;
+    }
+    {
+      x_43 = x_42;
+      x_43.col = float3(1.0f, 0.0f, 0.0f);
+      x_8 = (x_10 + 1);
+      x_42_phi = x_43;
+      x_10_phi = x_8;
+    }
+  }
+  const float3 x_47 = x_42.col;
+  x_GLF_color = float4(x_47.x, x_47.y, x_47.z, 1.0f);
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_4 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/two-loops-set-struct/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/two-loops-set-struct/0.wgsl.expected.msl
new file mode 100644
index 0000000..51c44be
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-loops-set-struct/0.wgsl.expected.msl
@@ -0,0 +1,79 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct StructType {
+  float3 col;
+  bool4 bbbb;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_5) {
+  StructType x_33 = {};
+  int x_38 = 0;
+  StructType x_42 = {};
+  StructType x_33_phi = {};
+  int x_9_phi = 0;
+  StructType x_42_phi = {};
+  int x_10_phi = 0;
+  StructType const tint_symbol_3 = {.col=float3(0.0f, 0.0f, 0.0f), .bbbb=bool4(false, false, false, false)};
+  x_33_phi = tint_symbol_3;
+  x_9_phi = 0;
+  while (true) {
+    StructType x_34 = {};
+    int x_7 = 0;
+    x_33 = x_33_phi;
+    int const x_9 = x_9_phi;
+    float const x_37 = x_5.injectionSwitch.y;
+    x_38 = int(x_37);
+    if ((x_9 < x_38)) {
+    } else {
+      break;
+    }
+    {
+      x_34 = x_33;
+      x_34.col = float3(1.0f, 0.0f, 0.0f);
+      x_7 = (x_9 + 1);
+      x_33_phi = x_34;
+      x_9_phi = x_7;
+    }
+  }
+  x_42_phi = x_33;
+  x_10_phi = 0;
+  while (true) {
+    StructType x_43 = {};
+    int x_8 = 0;
+    x_42 = x_42_phi;
+    int const x_10 = x_10_phi;
+    if ((x_10 < x_38)) {
+    } else {
+      break;
+    }
+    {
+      x_43 = x_42;
+      x_43.col = float3(1.0f, 0.0f, 0.0f);
+      x_8 = (x_10 + 1);
+      x_42_phi = x_43;
+      x_10_phi = x_8;
+    }
+  }
+  float3 const x_47 = x_42.col;
+  *(tint_symbol_5) = float4(x_47.x, x_47.y, x_47.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_5, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/two-loops-set-struct/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/two-loops-set-struct/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..c14f116
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-loops-set-struct/0.wgsl.expected.spvasm
@@ -0,0 +1,189 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 104
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %StructType "StructType"
+               OpMemberName %StructType 0 "col"
+               OpMemberName %StructType 1 "bbbb"
+               OpName %x_33 "x_33"
+               OpName %x_38 "x_38"
+               OpName %x_42 "x_42"
+               OpName %x_33_phi "x_33_phi"
+               OpName %x_9_phi "x_9_phi"
+               OpName %x_42_phi "x_42_phi"
+               OpName %x_10_phi "x_10_phi"
+               OpName %x_34 "x_34"
+               OpName %x_7 "x_7"
+               OpName %x_43 "x_43"
+               OpName %x_8 "x_8"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %StructType 0 Offset 0
+               OpMemberDecorate %StructType 1 Offset 16
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+    %v3float = OpTypeVector %float 3
+       %bool = OpTypeBool
+     %v4bool = OpTypeVector %bool 4
+ %StructType = OpTypeStruct %v3float %v4bool
+%_ptr_Function_StructType = OpTypePointer Function %StructType
+         %22 = OpConstantNull %StructType
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %26 = OpConstantNull %int
+    %float_0 = OpConstant %float 0
+         %33 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+      %false = OpConstantFalse %bool
+         %35 = OpConstantComposite %v4bool %false %false %false %false
+         %36 = OpConstantComposite %StructType %33 %35
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+    %float_1 = OpConstant %float 1
+         %62 = OpConstantComposite %v3float %float_1 %float_0 %float_0
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %92 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+       %x_33 = OpVariable %_ptr_Function_StructType Function %22
+       %x_38 = OpVariable %_ptr_Function_int Function %26
+       %x_42 = OpVariable %_ptr_Function_StructType Function %22
+   %x_33_phi = OpVariable %_ptr_Function_StructType Function %22
+    %x_9_phi = OpVariable %_ptr_Function_int Function %26
+   %x_42_phi = OpVariable %_ptr_Function_StructType Function %22
+   %x_10_phi = OpVariable %_ptr_Function_int Function %26
+       %x_34 = OpVariable %_ptr_Function_StructType Function %22
+        %x_7 = OpVariable %_ptr_Function_int Function %26
+       %x_43 = OpVariable %_ptr_Function_StructType Function %22
+        %x_8 = OpVariable %_ptr_Function_int Function %26
+               OpStore %x_33_phi %36
+               OpStore %x_9_phi %int_0
+               OpBranch %38
+         %38 = OpLabel
+               OpLoopMerge %39 %40 None
+               OpBranch %41
+         %41 = OpLabel
+         %44 = OpLoad %StructType %x_33_phi
+               OpStore %x_33 %44
+         %45 = OpLoad %int %x_9_phi
+         %50 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %uint_1
+         %51 = OpLoad %float %50
+         %52 = OpConvertFToS %int %51
+               OpStore %x_38 %52
+         %53 = OpLoad %int %x_38
+         %54 = OpSLessThan %bool %45 %53
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %57
+         %56 = OpLabel
+               OpBranch %55
+         %57 = OpLabel
+               OpBranch %39
+         %55 = OpLabel
+               OpBranch %40
+         %40 = OpLabel
+         %58 = OpLoad %StructType %x_33
+               OpStore %x_34 %58
+         %60 = OpAccessChain %_ptr_Function_v3float %x_34 %uint_0
+               OpStore %60 %62
+         %64 = OpIAdd %int %45 %int_1
+               OpStore %x_7 %64
+         %65 = OpLoad %StructType %x_34
+               OpStore %x_33_phi %65
+         %66 = OpLoad %int %x_7
+               OpStore %x_9_phi %66
+               OpBranch %38
+         %39 = OpLabel
+         %67 = OpLoad %StructType %x_33
+               OpStore %x_42_phi %67
+               OpStore %x_10_phi %int_0
+               OpBranch %68
+         %68 = OpLabel
+               OpLoopMerge %69 %70 None
+               OpBranch %71
+         %71 = OpLabel
+         %74 = OpLoad %StructType %x_42_phi
+               OpStore %x_42 %74
+         %75 = OpLoad %int %x_10_phi
+         %76 = OpLoad %int %x_38
+         %77 = OpSLessThan %bool %75 %76
+               OpSelectionMerge %78 None
+               OpBranchConditional %77 %79 %80
+         %79 = OpLabel
+               OpBranch %78
+         %80 = OpLabel
+               OpBranch %69
+         %78 = OpLabel
+               OpBranch %70
+         %70 = OpLabel
+         %81 = OpLoad %StructType %x_42
+               OpStore %x_43 %81
+         %82 = OpAccessChain %_ptr_Function_v3float %x_43 %uint_0
+               OpStore %82 %62
+         %83 = OpIAdd %int %75 %int_1
+               OpStore %x_8 %83
+         %84 = OpLoad %StructType %x_43
+               OpStore %x_42_phi %84
+         %85 = OpLoad %int %x_8
+               OpStore %x_10_phi %85
+               OpBranch %68
+         %69 = OpLabel
+         %86 = OpAccessChain %_ptr_Function_v3float %x_42 %uint_0
+         %87 = OpLoad %v3float %86
+         %88 = OpCompositeExtract %float %87 0
+         %89 = OpCompositeExtract %float %87 1
+         %90 = OpCompositeExtract %float %87 2
+         %91 = OpCompositeConstruct %v4float %88 %89 %90 %float_1
+               OpStore %x_GLF_color %91
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %92
+%tint_symbol = OpFunctionParameter %main_out
+         %96 = OpLabel
+         %97 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %97
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %99 = OpLabel
+        %100 = OpFunctionCall %void %main_1
+        %102 = OpLoad %v4float %x_GLF_color
+        %103 = OpCompositeConstruct %main_out %102
+        %101 = OpFunctionCall %void %tint_symbol_2 %103
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/two-loops-set-struct/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/two-loops-set-struct/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..187ea36
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-loops-set-struct/0.wgsl.expected.wgsl
@@ -0,0 +1,79 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+struct StructType {
+  col : vec3<f32>;
+  bbbb : vec4<bool>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_33 : StructType;
+  var x_38 : i32;
+  var x_42 : StructType;
+  var x_33_phi : StructType;
+  var x_9_phi : i32;
+  var x_42_phi : StructType;
+  var x_10_phi : i32;
+  x_33_phi = StructType(vec3<f32>(0.0, 0.0, 0.0), vec4<bool>(false, false, false, false));
+  x_9_phi = 0;
+  loop {
+    var x_34 : StructType;
+    var x_7 : i32;
+    x_33 = x_33_phi;
+    let x_9 : i32 = x_9_phi;
+    let x_37 : f32 = x_5.injectionSwitch.y;
+    x_38 = i32(x_37);
+    if ((x_9 < x_38)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_34 = x_33;
+      x_34.col = vec3<f32>(1.0, 0.0, 0.0);
+      x_7 = (x_9 + 1);
+      x_33_phi = x_34;
+      x_9_phi = x_7;
+    }
+  }
+  x_42_phi = x_33;
+  x_10_phi = 0;
+  loop {
+    var x_43 : StructType;
+    var x_8 : i32;
+    x_42 = x_42_phi;
+    let x_10 : i32 = x_10_phi;
+    if ((x_10 < x_38)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      x_43 = x_42;
+      x_43.col = vec3<f32>(1.0, 0.0, 0.0);
+      x_8 = (x_10 + 1);
+      x_42_phi = x_43;
+      x_10_phi = x_8;
+    }
+  }
+  let x_47 : vec3<f32> = x_42.col;
+  x_GLF_color = vec4<f32>(x_47.x, x_47.y, x_47.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/two-loops-with-break/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/two-loops-with-break/0-opt.spvasm
new file mode 100644
index 0000000..f71423f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-loops-with-break/0-opt.spvasm
@@ -0,0 +1,127 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %GLF_live15c "GLF_live15c"
+               OpName %GLF_live15i "GLF_live15i"
+               OpName %GLF_live15d "GLF_live15d"
+               OpName %GLF_live15i_0 "GLF_live15i"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %GLF_live15i RelaxedPrecision
+               OpDecorate %8 RelaxedPrecision
+               OpDecorate %9 RelaxedPrecision
+               OpDecorate %10 RelaxedPrecision
+               OpDecorate %11 RelaxedPrecision
+               OpDecorate %12 RelaxedPrecision
+               OpDecorate %GLF_live15i_0 RelaxedPrecision
+               OpDecorate %13 RelaxedPrecision
+               OpDecorate %14 RelaxedPrecision
+               OpDecorate %15 RelaxedPrecision
+               OpDecorate %16 RelaxedPrecision
+               OpDecorate %17 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+    %float_0 = OpConstant %float 0
+         %24 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_1 = OpConstant %float 1
+      %int_1 = OpConstant %int 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %37 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %19
+         %38 = OpLabel
+%GLF_live15c = OpVariable %_ptr_Function_v4float Function
+%GLF_live15i = OpVariable %_ptr_Function_int Function
+%GLF_live15d = OpVariable %_ptr_Function_v4float Function
+%GLF_live15i_0 = OpVariable %_ptr_Function_int Function
+               OpStore %GLF_live15c %24
+               OpStore %GLF_live15i %int_0
+               OpBranch %39
+         %39 = OpLabel
+               OpLoopMerge %40 %41 None
+               OpBranch %42
+         %42 = OpLabel
+          %8 = OpLoad %int %GLF_live15i
+         %43 = OpSLessThan %bool %8 %int_4
+               OpBranchConditional %43 %44 %40
+         %44 = OpLabel
+          %9 = OpLoad %int %GLF_live15i
+         %45 = OpSGreaterThanEqual %bool %9 %int_3
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %46
+         %47 = OpLabel
+               OpBranch %40
+         %46 = OpLabel
+         %48 = OpAccessChain %_ptr_Function_float %GLF_live15c %uint_1
+         %49 = OpLoad %float %48
+         %50 = OpFOrdGreaterThanEqual %bool %49 %float_1
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %52 %51
+         %52 = OpLabel
+         %10 = OpLoad %int %GLF_live15i
+         %53 = OpAccessChain %_ptr_Function_float %GLF_live15c %10
+               OpStore %53 %float_1
+               OpBranch %51
+         %51 = OpLabel
+               OpBranch %41
+         %41 = OpLabel
+         %11 = OpLoad %int %GLF_live15i
+         %12 = OpIAdd %int %11 %int_1
+               OpStore %GLF_live15i %12
+               OpBranch %39
+         %40 = OpLabel
+               OpStore %GLF_live15d %24
+               OpStore %GLF_live15i_0 %int_0
+               OpBranch %54
+         %54 = OpLabel
+               OpLoopMerge %55 %56 None
+               OpBranch %57
+         %57 = OpLabel
+         %13 = OpLoad %int %GLF_live15i_0
+         %58 = OpSLessThan %bool %13 %int_4
+               OpBranchConditional %58 %59 %55
+         %59 = OpLabel
+         %14 = OpLoad %int %GLF_live15i_0
+         %60 = OpSGreaterThanEqual %bool %14 %int_3
+               OpSelectionMerge %61 None
+               OpBranchConditional %60 %62 %61
+         %62 = OpLabel
+               OpBranch %55
+         %61 = OpLabel
+         %63 = OpAccessChain %_ptr_Function_float %GLF_live15d %uint_1
+         %64 = OpLoad %float %63
+         %65 = OpFOrdGreaterThanEqual %bool %64 %float_1
+               OpSelectionMerge %66 None
+               OpBranchConditional %65 %67 %66
+         %67 = OpLabel
+         %15 = OpLoad %int %GLF_live15i_0
+         %68 = OpAccessChain %_ptr_Function_float %GLF_live15d %15
+               OpStore %68 %float_1
+               OpBranch %66
+         %66 = OpLabel
+               OpBranch %56
+         %56 = OpLabel
+         %16 = OpLoad %int %GLF_live15i_0
+         %17 = OpIAdd %int %16 %int_1
+               OpStore %GLF_live15i_0 %17
+               OpBranch %54
+         %55 = OpLabel
+               OpStore %_GLF_color %37
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/two-loops-with-break/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/two-loops-with-break/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..55bac3a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-loops-with-break/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,54 @@
+void set_float4(inout float4 vec, int idx, float val) {
+  vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
+}
+
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 GLF_live15c = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int GLF_live15i = 0;
+  float4 GLF_live15d = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int GLF_live15i_1 = 0;
+  GLF_live15c = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  GLF_live15i = 0;
+  {
+    for(; (GLF_live15i < 4); GLF_live15i = (GLF_live15i + 1)) {
+      if ((GLF_live15i >= 3)) {
+        break;
+      }
+      const float x_49 = GLF_live15c.y;
+      if ((x_49 >= 1.0f)) {
+        set_float4(GLF_live15c, GLF_live15i, 1.0f);
+      }
+    }
+  }
+  GLF_live15d = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  GLF_live15i_1 = 0;
+  {
+    for(; (GLF_live15i_1 < 4); GLF_live15i_1 = (GLF_live15i_1 + 1)) {
+      if ((GLF_live15i_1 >= 3)) {
+        break;
+      }
+      const float x_64 = GLF_live15d.y;
+      if ((x_64 >= 1.0f)) {
+        set_float4(GLF_live15d, GLF_live15i_1, 1.0f);
+      }
+    }
+  }
+  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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/two-loops-with-break/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/two-loops-with-break/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..afbd08f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-loops-with-break/0-opt.spvasm.expected.msl
@@ -0,0 +1,71 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  float4 GLF_live15c = 0.0f;
+  int GLF_live15i = 0;
+  float4 GLF_live15d = 0.0f;
+  int GLF_live15i_1 = 0;
+  GLF_live15c = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  GLF_live15i = 0;
+  while (true) {
+    int const x_8 = GLF_live15i;
+    if ((x_8 < 4)) {
+    } else {
+      break;
+    }
+    int const x_9 = GLF_live15i;
+    if ((x_9 >= 3)) {
+      break;
+    }
+    float const x_49 = GLF_live15c.y;
+    if ((x_49 >= 1.0f)) {
+      int const x_10 = GLF_live15i;
+      GLF_live15c[x_10] = 1.0f;
+    }
+    {
+      int const x_11 = GLF_live15i;
+      GLF_live15i = (x_11 + 1);
+    }
+  }
+  GLF_live15d = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  GLF_live15i_1 = 0;
+  while (true) {
+    int const x_13 = GLF_live15i_1;
+    if ((x_13 < 4)) {
+    } else {
+      break;
+    }
+    int const x_14 = GLF_live15i_1;
+    if ((x_14 >= 3)) {
+      break;
+    }
+    float const x_64 = GLF_live15d.y;
+    if ((x_64 >= 1.0f)) {
+      int const x_15 = GLF_live15i_1;
+      GLF_live15d[x_15] = 1.0f;
+    }
+    {
+      int const x_16 = GLF_live15i_1;
+      GLF_live15i_1 = (x_16 + 1);
+    }
+  }
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/two-loops-with-break/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/two-loops-with-break/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..9128fc2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-loops-with-break/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,156 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 88
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %GLF_live15c "GLF_live15c"
+               OpName %GLF_live15i "GLF_live15i"
+               OpName %GLF_live15d "GLF_live15d"
+               OpName %GLF_live15i_1 "GLF_live15i_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %17 = OpConstantNull %int
+    %float_0 = OpConstant %float 0
+         %21 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_1 = OpConstant %float 1
+      %int_1 = OpConstant %int 1
+         %75 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %76 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+%GLF_live15c = OpVariable %_ptr_Function_v4float Function %5
+%GLF_live15i = OpVariable %_ptr_Function_int Function %17
+%GLF_live15d = OpVariable %_ptr_Function_v4float Function %5
+%GLF_live15i_1 = OpVariable %_ptr_Function_int Function %17
+               OpStore %GLF_live15c %21
+               OpStore %GLF_live15i %int_0
+               OpBranch %23
+         %23 = OpLabel
+               OpLoopMerge %24 %25 None
+               OpBranch %26
+         %26 = OpLabel
+         %27 = OpLoad %int %GLF_live15i
+         %29 = OpSLessThan %bool %27 %int_4
+               OpSelectionMerge %31 None
+               OpBranchConditional %29 %32 %33
+         %32 = OpLabel
+               OpBranch %31
+         %33 = OpLabel
+               OpBranch %24
+         %31 = OpLabel
+         %34 = OpLoad %int %GLF_live15i
+         %36 = OpSGreaterThanEqual %bool %34 %int_3
+               OpSelectionMerge %37 None
+               OpBranchConditional %36 %38 %37
+         %38 = OpLabel
+               OpBranch %24
+         %37 = OpLabel
+         %42 = OpAccessChain %_ptr_Function_float %GLF_live15c %uint_1
+         %43 = OpLoad %float %42
+         %45 = OpFOrdGreaterThanEqual %bool %43 %float_1
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %46
+         %47 = OpLabel
+         %48 = OpLoad %int %GLF_live15i
+         %49 = OpAccessChain %_ptr_Function_float %GLF_live15c %48
+               OpStore %49 %float_1
+               OpBranch %46
+         %46 = OpLabel
+               OpBranch %25
+         %25 = OpLabel
+         %50 = OpLoad %int %GLF_live15i
+         %52 = OpIAdd %int %50 %int_1
+               OpStore %GLF_live15i %52
+               OpBranch %23
+         %24 = OpLabel
+               OpStore %GLF_live15d %21
+               OpStore %GLF_live15i_1 %int_0
+               OpBranch %53
+         %53 = OpLabel
+               OpLoopMerge %54 %55 None
+               OpBranch %56
+         %56 = OpLabel
+         %57 = OpLoad %int %GLF_live15i_1
+         %58 = OpSLessThan %bool %57 %int_4
+               OpSelectionMerge %59 None
+               OpBranchConditional %58 %60 %61
+         %60 = OpLabel
+               OpBranch %59
+         %61 = OpLabel
+               OpBranch %54
+         %59 = OpLabel
+         %62 = OpLoad %int %GLF_live15i_1
+         %63 = OpSGreaterThanEqual %bool %62 %int_3
+               OpSelectionMerge %64 None
+               OpBranchConditional %63 %65 %64
+         %65 = OpLabel
+               OpBranch %54
+         %64 = OpLabel
+         %66 = OpAccessChain %_ptr_Function_float %GLF_live15d %uint_1
+         %67 = OpLoad %float %66
+         %68 = OpFOrdGreaterThanEqual %bool %67 %float_1
+               OpSelectionMerge %69 None
+               OpBranchConditional %68 %70 %69
+         %70 = OpLabel
+         %71 = OpLoad %int %GLF_live15i_1
+         %72 = OpAccessChain %_ptr_Function_float %GLF_live15d %71
+               OpStore %72 %float_1
+               OpBranch %69
+         %69 = OpLabel
+               OpBranch %55
+         %55 = OpLabel
+         %73 = OpLoad %int %GLF_live15i_1
+         %74 = OpIAdd %int %73 %int_1
+               OpStore %GLF_live15i_1 %74
+               OpBranch %53
+         %54 = OpLabel
+               OpStore %x_GLF_color %75
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %76
+%tint_symbol = OpFunctionParameter %main_out
+         %80 = OpLabel
+         %81 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %81
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %83 = OpLabel
+         %84 = OpFunctionCall %void %main_1
+         %86 = OpLoad %v4float %x_GLF_color
+         %87 = OpCompositeConstruct %main_out %86
+         %85 = OpFunctionCall %void %tint_symbol_2 %87
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/two-loops-with-break/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/two-loops-with-break/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..a5541a2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-loops-with-break/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,67 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var GLF_live15c : vec4<f32>;
+  var GLF_live15i : i32;
+  var GLF_live15d : vec4<f32>;
+  var GLF_live15i_1 : i32;
+  GLF_live15c = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  GLF_live15i = 0;
+  loop {
+    let x_8 : i32 = GLF_live15i;
+    if ((x_8 < 4)) {
+    } else {
+      break;
+    }
+    let x_9 : i32 = GLF_live15i;
+    if ((x_9 >= 3)) {
+      break;
+    }
+    let x_49 : f32 = GLF_live15c.y;
+    if ((x_49 >= 1.0)) {
+      let x_10 : i32 = GLF_live15i;
+      GLF_live15c[x_10] = 1.0;
+    }
+
+    continuing {
+      let x_11 : i32 = GLF_live15i;
+      GLF_live15i = (x_11 + 1);
+    }
+  }
+  GLF_live15d = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  GLF_live15i_1 = 0;
+  loop {
+    let x_13 : i32 = GLF_live15i_1;
+    if ((x_13 < 4)) {
+    } else {
+      break;
+    }
+    let x_14 : i32 = GLF_live15i_1;
+    if ((x_14 >= 3)) {
+      break;
+    }
+    let x_64 : f32 = GLF_live15d.y;
+    if ((x_64 >= 1.0)) {
+      let x_15 : i32 = GLF_live15i_1;
+      GLF_live15d[x_15] = 1.0;
+    }
+
+    continuing {
+      let x_16 : i32 = GLF_live15i_1;
+      GLF_live15i_1 = (x_16 + 1);
+    }
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/two-loops-with-break/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/two-loops-with-break/0-opt.wgsl
new file mode 100644
index 0000000..a5541a2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-loops-with-break/0-opt.wgsl
@@ -0,0 +1,67 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var GLF_live15c : vec4<f32>;
+  var GLF_live15i : i32;
+  var GLF_live15d : vec4<f32>;
+  var GLF_live15i_1 : i32;
+  GLF_live15c = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  GLF_live15i = 0;
+  loop {
+    let x_8 : i32 = GLF_live15i;
+    if ((x_8 < 4)) {
+    } else {
+      break;
+    }
+    let x_9 : i32 = GLF_live15i;
+    if ((x_9 >= 3)) {
+      break;
+    }
+    let x_49 : f32 = GLF_live15c.y;
+    if ((x_49 >= 1.0)) {
+      let x_10 : i32 = GLF_live15i;
+      GLF_live15c[x_10] = 1.0;
+    }
+
+    continuing {
+      let x_11 : i32 = GLF_live15i;
+      GLF_live15i = (x_11 + 1);
+    }
+  }
+  GLF_live15d = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  GLF_live15i_1 = 0;
+  loop {
+    let x_13 : i32 = GLF_live15i_1;
+    if ((x_13 < 4)) {
+    } else {
+      break;
+    }
+    let x_14 : i32 = GLF_live15i_1;
+    if ((x_14 >= 3)) {
+      break;
+    }
+    let x_64 : f32 = GLF_live15d.y;
+    if ((x_64 >= 1.0)) {
+      let x_15 : i32 = GLF_live15i_1;
+      GLF_live15d[x_15] = 1.0;
+    }
+
+    continuing {
+      let x_16 : i32 = GLF_live15i_1;
+      GLF_live15i_1 = (x_16 + 1);
+    }
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/two-loops-with-break/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/two-loops-with-break/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..55bac3a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-loops-with-break/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,54 @@
+void set_float4(inout float4 vec, int idx, float val) {
+  vec = (idx.xxxx == int4(0, 1, 2, 3)) ? val.xxxx : vec;
+}
+
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4 GLF_live15c = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int GLF_live15i = 0;
+  float4 GLF_live15d = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int GLF_live15i_1 = 0;
+  GLF_live15c = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  GLF_live15i = 0;
+  {
+    for(; (GLF_live15i < 4); GLF_live15i = (GLF_live15i + 1)) {
+      if ((GLF_live15i >= 3)) {
+        break;
+      }
+      const float x_49 = GLF_live15c.y;
+      if ((x_49 >= 1.0f)) {
+        set_float4(GLF_live15c, GLF_live15i, 1.0f);
+      }
+    }
+  }
+  GLF_live15d = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  GLF_live15i_1 = 0;
+  {
+    for(; (GLF_live15i_1 < 4); GLF_live15i_1 = (GLF_live15i_1 + 1)) {
+      if ((GLF_live15i_1 >= 3)) {
+        break;
+      }
+      const float x_64 = GLF_live15d.y;
+      if ((x_64 >= 1.0f)) {
+        set_float4(GLF_live15d, GLF_live15i_1, 1.0f);
+      }
+    }
+  }
+  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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/two-loops-with-break/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/two-loops-with-break/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..afbd08f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-loops-with-break/0-opt.wgsl.expected.msl
@@ -0,0 +1,71 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  float4 GLF_live15c = 0.0f;
+  int GLF_live15i = 0;
+  float4 GLF_live15d = 0.0f;
+  int GLF_live15i_1 = 0;
+  GLF_live15c = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  GLF_live15i = 0;
+  while (true) {
+    int const x_8 = GLF_live15i;
+    if ((x_8 < 4)) {
+    } else {
+      break;
+    }
+    int const x_9 = GLF_live15i;
+    if ((x_9 >= 3)) {
+      break;
+    }
+    float const x_49 = GLF_live15c.y;
+    if ((x_49 >= 1.0f)) {
+      int const x_10 = GLF_live15i;
+      GLF_live15c[x_10] = 1.0f;
+    }
+    {
+      int const x_11 = GLF_live15i;
+      GLF_live15i = (x_11 + 1);
+    }
+  }
+  GLF_live15d = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  GLF_live15i_1 = 0;
+  while (true) {
+    int const x_13 = GLF_live15i_1;
+    if ((x_13 < 4)) {
+    } else {
+      break;
+    }
+    int const x_14 = GLF_live15i_1;
+    if ((x_14 >= 3)) {
+      break;
+    }
+    float const x_64 = GLF_live15d.y;
+    if ((x_64 >= 1.0f)) {
+      int const x_15 = GLF_live15i_1;
+      GLF_live15d[x_15] = 1.0f;
+    }
+    {
+      int const x_16 = GLF_live15i_1;
+      GLF_live15i_1 = (x_16 + 1);
+    }
+  }
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/two-loops-with-break/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/two-loops-with-break/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..9128fc2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-loops-with-break/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,156 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 88
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %GLF_live15c "GLF_live15c"
+               OpName %GLF_live15i "GLF_live15i"
+               OpName %GLF_live15d "GLF_live15d"
+               OpName %GLF_live15i_1 "GLF_live15i_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %17 = OpConstantNull %int
+    %float_0 = OpConstant %float 0
+         %21 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+      %int_0 = OpConstant %int 0
+      %int_4 = OpConstant %int 4
+       %bool = OpTypeBool
+      %int_3 = OpConstant %int 3
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_1 = OpConstant %float 1
+      %int_1 = OpConstant %int 1
+         %75 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %76 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+%GLF_live15c = OpVariable %_ptr_Function_v4float Function %5
+%GLF_live15i = OpVariable %_ptr_Function_int Function %17
+%GLF_live15d = OpVariable %_ptr_Function_v4float Function %5
+%GLF_live15i_1 = OpVariable %_ptr_Function_int Function %17
+               OpStore %GLF_live15c %21
+               OpStore %GLF_live15i %int_0
+               OpBranch %23
+         %23 = OpLabel
+               OpLoopMerge %24 %25 None
+               OpBranch %26
+         %26 = OpLabel
+         %27 = OpLoad %int %GLF_live15i
+         %29 = OpSLessThan %bool %27 %int_4
+               OpSelectionMerge %31 None
+               OpBranchConditional %29 %32 %33
+         %32 = OpLabel
+               OpBranch %31
+         %33 = OpLabel
+               OpBranch %24
+         %31 = OpLabel
+         %34 = OpLoad %int %GLF_live15i
+         %36 = OpSGreaterThanEqual %bool %34 %int_3
+               OpSelectionMerge %37 None
+               OpBranchConditional %36 %38 %37
+         %38 = OpLabel
+               OpBranch %24
+         %37 = OpLabel
+         %42 = OpAccessChain %_ptr_Function_float %GLF_live15c %uint_1
+         %43 = OpLoad %float %42
+         %45 = OpFOrdGreaterThanEqual %bool %43 %float_1
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %46
+         %47 = OpLabel
+         %48 = OpLoad %int %GLF_live15i
+         %49 = OpAccessChain %_ptr_Function_float %GLF_live15c %48
+               OpStore %49 %float_1
+               OpBranch %46
+         %46 = OpLabel
+               OpBranch %25
+         %25 = OpLabel
+         %50 = OpLoad %int %GLF_live15i
+         %52 = OpIAdd %int %50 %int_1
+               OpStore %GLF_live15i %52
+               OpBranch %23
+         %24 = OpLabel
+               OpStore %GLF_live15d %21
+               OpStore %GLF_live15i_1 %int_0
+               OpBranch %53
+         %53 = OpLabel
+               OpLoopMerge %54 %55 None
+               OpBranch %56
+         %56 = OpLabel
+         %57 = OpLoad %int %GLF_live15i_1
+         %58 = OpSLessThan %bool %57 %int_4
+               OpSelectionMerge %59 None
+               OpBranchConditional %58 %60 %61
+         %60 = OpLabel
+               OpBranch %59
+         %61 = OpLabel
+               OpBranch %54
+         %59 = OpLabel
+         %62 = OpLoad %int %GLF_live15i_1
+         %63 = OpSGreaterThanEqual %bool %62 %int_3
+               OpSelectionMerge %64 None
+               OpBranchConditional %63 %65 %64
+         %65 = OpLabel
+               OpBranch %54
+         %64 = OpLabel
+         %66 = OpAccessChain %_ptr_Function_float %GLF_live15d %uint_1
+         %67 = OpLoad %float %66
+         %68 = OpFOrdGreaterThanEqual %bool %67 %float_1
+               OpSelectionMerge %69 None
+               OpBranchConditional %68 %70 %69
+         %70 = OpLabel
+         %71 = OpLoad %int %GLF_live15i_1
+         %72 = OpAccessChain %_ptr_Function_float %GLF_live15d %71
+               OpStore %72 %float_1
+               OpBranch %69
+         %69 = OpLabel
+               OpBranch %55
+         %55 = OpLabel
+         %73 = OpLoad %int %GLF_live15i_1
+         %74 = OpIAdd %int %73 %int_1
+               OpStore %GLF_live15i_1 %74
+               OpBranch %53
+         %54 = OpLabel
+               OpStore %x_GLF_color %75
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %76
+%tint_symbol = OpFunctionParameter %main_out
+         %80 = OpLabel
+         %81 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %81
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %83 = OpLabel
+         %84 = OpFunctionCall %void %main_1
+         %86 = OpLoad %v4float %x_GLF_color
+         %87 = OpCompositeConstruct %main_out %86
+         %85 = OpFunctionCall %void %tint_symbol_2 %87
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/two-loops-with-break/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/two-loops-with-break/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..a5541a2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-loops-with-break/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,67 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var GLF_live15c : vec4<f32>;
+  var GLF_live15i : i32;
+  var GLF_live15d : vec4<f32>;
+  var GLF_live15i_1 : i32;
+  GLF_live15c = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  GLF_live15i = 0;
+  loop {
+    let x_8 : i32 = GLF_live15i;
+    if ((x_8 < 4)) {
+    } else {
+      break;
+    }
+    let x_9 : i32 = GLF_live15i;
+    if ((x_9 >= 3)) {
+      break;
+    }
+    let x_49 : f32 = GLF_live15c.y;
+    if ((x_49 >= 1.0)) {
+      let x_10 : i32 = GLF_live15i;
+      GLF_live15c[x_10] = 1.0;
+    }
+
+    continuing {
+      let x_11 : i32 = GLF_live15i;
+      GLF_live15i = (x_11 + 1);
+    }
+  }
+  GLF_live15d = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  GLF_live15i_1 = 0;
+  loop {
+    let x_13 : i32 = GLF_live15i_1;
+    if ((x_13 < 4)) {
+    } else {
+      break;
+    }
+    let x_14 : i32 = GLF_live15i_1;
+    if ((x_14 >= 3)) {
+      break;
+    }
+    let x_64 : f32 = GLF_live15d.y;
+    if ((x_64 >= 1.0)) {
+      let x_15 : i32 = GLF_live15i_1;
+      GLF_live15d[x_15] = 1.0;
+    }
+
+    continuing {
+      let x_16 : i32 = GLF_live15i_1;
+      GLF_live15i_1 = (x_16 + 1);
+    }
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/two-nested-do-whiles/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/two-nested-do-whiles/0-opt.spvasm
new file mode 100644
index 0000000..33f273e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-nested-do-whiles/0-opt.spvasm
@@ -0,0 +1,133 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color %gl_FragCoord
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpName %i "i"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %i_0 "i"
+               OpName %i_1 "i"
+               OpDecorate %_GLF_color Location 0
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %17 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+%_ptr_Input_float = OpTypePointer Input %float
+   %float_n1 = OpConstant %float -1
+    %int_256 = OpConstant %int 256
+      %int_1 = OpConstant %int 1
+      %false = OpConstantFalse %bool
+       %main = OpFunction %void None %11
+         %33 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+        %i_1 = OpVariable %_ptr_Function_int Function
+               OpStore %_GLF_color %17
+               OpStore %i %int_0
+         %34 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %35 = OpLoad %float %34
+         %36 = OpFOrdLessThan %bool %35 %float_0
+               OpSelectionMerge %37 None
+               OpBranchConditional %36 %38 %39
+         %38 = OpLabel
+               OpBranch %37
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %41 = OpLoad %float %40
+         %42 = OpFOrdLessThan %bool %41 %float_n1
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %45
+         %44 = OpLabel
+               OpBranch %43
+         %45 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+               OpLoopMerge %47 %48 None
+               OpBranch %49
+         %49 = OpLabel
+         %50 = OpLoad %int %i
+         %51 = OpSGreaterThanEqual %bool %50 %int_256
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %52
+         %53 = OpLabel
+               OpBranch %47
+         %52 = OpLabel
+               OpBranch %54
+         %54 = OpLabel
+               OpStore %i_0 %int_0
+               OpLoopMerge %55 %56 None
+               OpBranch %57
+         %57 = OpLabel
+         %58 = OpLoad %int %i_0
+         %59 = OpSLessThan %bool %58 %int_1
+               OpLoopMerge %60 %61 None
+               OpBranchConditional %59 %62 %60
+         %62 = OpLabel
+               OpSelectionMerge %63 None
+               OpBranchConditional %42 %64 %63
+         %64 = OpLabel
+               OpStore %i_1 %int_0
+               OpBranch %65
+         %65 = OpLabel
+         %66 = OpLoad %int %i_1
+         %67 = OpSLessThan %bool %66 %int_1
+               OpLoopMerge %68 %69 None
+               OpBranchConditional %67 %69 %68
+         %69 = OpLabel
+         %70 = OpLoad %int %i_1
+         %71 = OpIAdd %int %70 %int_1
+               OpStore %i_1 %71
+               OpBranch %65
+         %68 = OpLabel
+               OpBranch %61
+         %61 = OpLabel
+         %72 = OpLoad %int %i_0
+         %73 = OpIAdd %int %72 %int_1
+               OpStore %i_0 %73
+               OpBranch %57
+         %63 = OpLabel
+               OpReturn
+         %60 = OpLabel
+               OpBranch %56
+         %56 = OpLabel
+               OpBranchConditional %false %54 %55
+         %55 = OpLabel
+               OpBranch %48
+         %48 = OpLabel
+               OpBranchConditional %false %46 %47
+         %47 = OpLabel
+               OpBranch %43
+         %43 = OpLabel
+               OpBranch %37
+         %37 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/two-nested-do-whiles/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/two-nested-do-whiles/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..3f53893
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-nested-do-whiles/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,98 @@
+SKIP: FAILED
+
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  var i_1 : i32;
+  var i_2 : i32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  i = 0;
+  let x_35 : f32 = x_7.injectionSwitch.y;
+  if ((x_35 < 0.0)) {
+  } else {
+    var x_42 : bool;
+    let x_41 : f32 = gl_FragCoord.y;
+    x_42 = (x_41 < -1.0);
+    if (x_42) {
+    } else {
+      loop {
+        let x_50 : i32 = i;
+        if ((x_50 >= 256)) {
+          break;
+        }
+        loop {
+          i_1 = 0;
+          loop {
+            let x_58 : i32 = i_1;
+            if ((x_58 < 1)) {
+            } else {
+              break;
+            }
+            if (x_42) {
+              i_2 = 0;
+              loop {
+                let x_66 : i32 = i_2;
+                if ((x_66 < 1)) {
+                } else {
+                  break;
+                }
+
+                continuing {
+                  let x_70 : i32 = i_2;
+                  i_2 = (x_70 + 1);
+                }
+              }
+              continue;
+            }
+            return;
+
+            continuing {
+              let x_72 : i32 = i_1;
+              i_1 = (x_72 + 1);
+            }
+          }
+
+          continuing {
+            if (false) {
+            } else {
+              break;
+            }
+          }
+        }
+
+        continuing {
+          if (false) {
+          } else {
+            break;
+          }
+        }
+      }
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+Failed to generate: error: break statement must be in a loop or switch case
diff --git a/test/vk-gl-cts/graphicsfuzz/two-nested-do-whiles/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/two-nested-do-whiles/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..4489a5b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-nested-do-whiles/0-opt.spvasm.expected.msl
@@ -0,0 +1,94 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int i = 0;
+  int i_1 = 0;
+  int i_2 = 0;
+  *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  i = 0;
+  float const x_35 = x_7.injectionSwitch.y;
+  if ((x_35 < 0.0f)) {
+  } else {
+    bool x_42 = false;
+    float const x_41 = (*(tint_symbol_6)).y;
+    x_42 = (x_41 < -1.0f);
+    if (x_42) {
+    } else {
+      while (true) {
+        int const x_50 = i;
+        if ((x_50 >= 256)) {
+          break;
+        }
+        while (true) {
+          i_1 = 0;
+          while (true) {
+            int const x_58 = i_1;
+            if ((x_58 < 1)) {
+            } else {
+              break;
+            }
+            if (x_42) {
+              i_2 = 0;
+              while (true) {
+                int const x_66 = i_2;
+                if ((x_66 < 1)) {
+                } else {
+                  break;
+                }
+                {
+                  int const x_70 = i_2;
+                  i_2 = (x_70 + 1);
+                }
+              }
+              {
+                int const x_72 = i_1;
+                i_1 = (x_72 + 1);
+              }
+              continue;
+            }
+            return;
+            {
+              int const x_72 = i_1;
+              i_1 = (x_72 + 1);
+            }
+          }
+          {
+            if (false) {
+            } else {
+              break;
+            }
+          }
+        }
+        {
+          if (false) {
+          } else {
+            break;
+          }
+        }
+      }
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_7, &(tint_symbol_8), &(tint_symbol_7));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/two-nested-do-whiles/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/two-nested-do-whiles/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..3fe30e2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-nested-do-whiles/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,214 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 111
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_7 "x_7"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %i_1 "i_1"
+               OpName %i_2 "i_2"
+               OpName %x_42 "x_42"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %22 = OpConstantNull %int
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %27 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %42 = OpConstantNull %bool
+%_ptr_Private_float = OpTypePointer Private %float
+   %float_n1 = OpConstant %float -1
+    %int_256 = OpConstant %int 256
+      %int_1 = OpConstant %int 1
+      %false = OpConstantFalse %bool
+   %main_out = OpTypeStruct %v4float
+         %98 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %22
+        %i_1 = OpVariable %_ptr_Function_int Function %22
+        %i_2 = OpVariable %_ptr_Function_int Function %22
+       %x_42 = OpVariable %_ptr_Function_bool Function %42
+               OpStore %x_GLF_color %27
+               OpStore %i %int_0
+         %33 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_1
+         %34 = OpLoad %float %33
+         %35 = OpFOrdLessThan %bool %34 %float_0
+               OpSelectionMerge %37 None
+               OpBranchConditional %35 %38 %39
+         %38 = OpLabel
+               OpBranch %37
+         %39 = OpLabel
+         %44 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %45 = OpLoad %float %44
+         %47 = OpFOrdLessThan %bool %45 %float_n1
+               OpStore %x_42 %47
+         %48 = OpLoad %bool %x_42
+               OpSelectionMerge %49 None
+               OpBranchConditional %48 %50 %51
+         %50 = OpLabel
+               OpBranch %49
+         %51 = OpLabel
+               OpBranch %52
+         %52 = OpLabel
+               OpLoopMerge %53 %54 None
+               OpBranch %55
+         %55 = OpLabel
+         %56 = OpLoad %int %i
+         %58 = OpSGreaterThanEqual %bool %56 %int_256
+               OpSelectionMerge %59 None
+               OpBranchConditional %58 %60 %59
+         %60 = OpLabel
+               OpBranch %53
+         %59 = OpLabel
+               OpBranch %61
+         %61 = OpLabel
+               OpLoopMerge %62 %63 None
+               OpBranch %64
+         %64 = OpLabel
+               OpStore %i_1 %int_0
+               OpBranch %65
+         %65 = OpLabel
+               OpLoopMerge %66 %67 None
+               OpBranch %68
+         %68 = OpLabel
+         %69 = OpLoad %int %i_1
+         %71 = OpSLessThan %bool %69 %int_1
+               OpSelectionMerge %72 None
+               OpBranchConditional %71 %73 %74
+         %73 = OpLabel
+               OpBranch %72
+         %74 = OpLabel
+               OpBranch %66
+         %72 = OpLabel
+         %75 = OpLoad %bool %x_42
+               OpSelectionMerge %76 None
+               OpBranchConditional %75 %77 %76
+         %77 = OpLabel
+               OpStore %i_2 %int_0
+               OpBranch %78
+         %78 = OpLabel
+               OpLoopMerge %79 %80 None
+               OpBranch %81
+         %81 = OpLabel
+         %82 = OpLoad %int %i_2
+         %83 = OpSLessThan %bool %82 %int_1
+               OpSelectionMerge %84 None
+               OpBranchConditional %83 %85 %86
+         %85 = OpLabel
+               OpBranch %84
+         %86 = OpLabel
+               OpBranch %79
+         %84 = OpLabel
+               OpBranch %80
+         %80 = OpLabel
+         %87 = OpLoad %int %i_2
+         %88 = OpIAdd %int %87 %int_1
+               OpStore %i_2 %88
+               OpBranch %78
+         %79 = OpLabel
+               OpBranch %67
+         %76 = OpLabel
+               OpReturn
+         %67 = OpLabel
+         %89 = OpLoad %int %i_1
+         %90 = OpIAdd %int %89 %int_1
+               OpStore %i_1 %90
+               OpBranch %65
+         %66 = OpLabel
+               OpBranch %63
+         %63 = OpLabel
+               OpSelectionMerge %92 None
+               OpBranchConditional %false %93 %94
+         %93 = OpLabel
+               OpBranch %92
+         %94 = OpLabel
+               OpBranch %62
+         %92 = OpLabel
+               OpBranch %61
+         %62 = OpLabel
+               OpBranch %54
+         %54 = OpLabel
+               OpSelectionMerge %95 None
+               OpBranchConditional %false %96 %97
+         %96 = OpLabel
+               OpBranch %95
+         %97 = OpLabel
+               OpBranch %53
+         %95 = OpLabel
+               OpBranch %52
+         %53 = OpLabel
+               OpBranch %49
+         %49 = OpLabel
+               OpBranch %37
+         %37 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %98
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %102 = OpLabel
+        %103 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %103
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %105 = OpLabel
+        %106 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %106
+        %107 = OpFunctionCall %void %main_1
+        %109 = OpLoad %v4float %x_GLF_color
+        %110 = OpCompositeConstruct %main_out %109
+        %108 = OpFunctionCall %void %tint_symbol_3 %110
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 54[%54] is not post dominated by the back-edge block 95[%95]
+  %95 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/two-nested-do-whiles/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/two-nested-do-whiles/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..a826fa8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-nested-do-whiles/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,93 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  var i_1 : i32;
+  var i_2 : i32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  i = 0;
+  let x_35 : f32 = x_7.injectionSwitch.y;
+  if ((x_35 < 0.0)) {
+  } else {
+    var x_42 : bool;
+    let x_41 : f32 = gl_FragCoord.y;
+    x_42 = (x_41 < -1.0);
+    if (x_42) {
+    } else {
+      loop {
+        let x_50 : i32 = i;
+        if ((x_50 >= 256)) {
+          break;
+        }
+        loop {
+          i_1 = 0;
+          loop {
+            let x_58 : i32 = i_1;
+            if ((x_58 < 1)) {
+            } else {
+              break;
+            }
+            if (x_42) {
+              i_2 = 0;
+              loop {
+                let x_66 : i32 = i_2;
+                if ((x_66 < 1)) {
+                } else {
+                  break;
+                }
+
+                continuing {
+                  let x_70 : i32 = i_2;
+                  i_2 = (x_70 + 1);
+                }
+              }
+              continue;
+            }
+            return;
+
+            continuing {
+              let x_72 : i32 = i_1;
+              i_1 = (x_72 + 1);
+            }
+          }
+
+          continuing {
+            if (false) {
+            } else {
+              break;
+            }
+          }
+        }
+
+        continuing {
+          if (false) {
+          } else {
+            break;
+          }
+        }
+      }
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/two-nested-do-whiles/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/two-nested-do-whiles/0-opt.wgsl
new file mode 100644
index 0000000..a826fa8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-nested-do-whiles/0-opt.wgsl
@@ -0,0 +1,93 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  var i_1 : i32;
+  var i_2 : i32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  i = 0;
+  let x_35 : f32 = x_7.injectionSwitch.y;
+  if ((x_35 < 0.0)) {
+  } else {
+    var x_42 : bool;
+    let x_41 : f32 = gl_FragCoord.y;
+    x_42 = (x_41 < -1.0);
+    if (x_42) {
+    } else {
+      loop {
+        let x_50 : i32 = i;
+        if ((x_50 >= 256)) {
+          break;
+        }
+        loop {
+          i_1 = 0;
+          loop {
+            let x_58 : i32 = i_1;
+            if ((x_58 < 1)) {
+            } else {
+              break;
+            }
+            if (x_42) {
+              i_2 = 0;
+              loop {
+                let x_66 : i32 = i_2;
+                if ((x_66 < 1)) {
+                } else {
+                  break;
+                }
+
+                continuing {
+                  let x_70 : i32 = i_2;
+                  i_2 = (x_70 + 1);
+                }
+              }
+              continue;
+            }
+            return;
+
+            continuing {
+              let x_72 : i32 = i_1;
+              i_1 = (x_72 + 1);
+            }
+          }
+
+          continuing {
+            if (false) {
+            } else {
+              break;
+            }
+          }
+        }
+
+        continuing {
+          if (false) {
+          } else {
+            break;
+          }
+        }
+      }
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/two-nested-do-whiles/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/two-nested-do-whiles/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..8a64f0c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-nested-do-whiles/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,101 @@
+SKIP: FAILED
+
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  var i_1 : i32;
+  var i_2 : i32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  i = 0;
+  let x_35 : f32 = x_7.injectionSwitch.y;
+  if ((x_35 < 0.0)) {
+  } else {
+    var x_42 : bool;
+    let x_41 : f32 = gl_FragCoord.y;
+    x_42 = (x_41 < -1.0);
+    if (x_42) {
+    } else {
+      loop {
+        let x_50 : i32 = i;
+        if ((x_50 >= 256)) {
+          break;
+        }
+        loop {
+          i_1 = 0;
+          loop {
+            let x_58 : i32 = i_1;
+            if ((x_58 < 1)) {
+            } else {
+              break;
+            }
+            if (x_42) {
+              i_2 = 0;
+              loop {
+                let x_66 : i32 = i_2;
+                if ((x_66 < 1)) {
+                } else {
+                  break;
+                }
+
+                continuing {
+                  let x_70 : i32 = i_2;
+                  i_2 = (x_70 + 1);
+                }
+              }
+              continue;
+            }
+            return;
+
+            continuing {
+              let x_72 : i32 = i_1;
+              i_1 = (x_72 + 1);
+            }
+          }
+
+          continuing {
+            if (false) {
+            } else {
+              break;
+            }
+          }
+        }
+
+        continuing {
+          if (false) {
+          } else {
+            break;
+          }
+        }
+      }
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
+
+Failed to generate: graphicsfuzz/two-nested-do-whiles/0-opt.wgsl:74:13 error: break statement must be in a loop or switch case
+            break;
+            ^^^^^
+
diff --git a/test/vk-gl-cts/graphicsfuzz/two-nested-do-whiles/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/two-nested-do-whiles/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..4489a5b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-nested-do-whiles/0-opt.wgsl.expected.msl
@@ -0,0 +1,94 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  int i = 0;
+  int i_1 = 0;
+  int i_2 = 0;
+  *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  i = 0;
+  float const x_35 = x_7.injectionSwitch.y;
+  if ((x_35 < 0.0f)) {
+  } else {
+    bool x_42 = false;
+    float const x_41 = (*(tint_symbol_6)).y;
+    x_42 = (x_41 < -1.0f);
+    if (x_42) {
+    } else {
+      while (true) {
+        int const x_50 = i;
+        if ((x_50 >= 256)) {
+          break;
+        }
+        while (true) {
+          i_1 = 0;
+          while (true) {
+            int const x_58 = i_1;
+            if ((x_58 < 1)) {
+            } else {
+              break;
+            }
+            if (x_42) {
+              i_2 = 0;
+              while (true) {
+                int const x_66 = i_2;
+                if ((x_66 < 1)) {
+                } else {
+                  break;
+                }
+                {
+                  int const x_70 = i_2;
+                  i_2 = (x_70 + 1);
+                }
+              }
+              {
+                int const x_72 = i_1;
+                i_1 = (x_72 + 1);
+              }
+              continue;
+            }
+            return;
+            {
+              int const x_72 = i_1;
+              i_1 = (x_72 + 1);
+            }
+          }
+          {
+            if (false) {
+            } else {
+              break;
+            }
+          }
+        }
+        {
+          if (false) {
+          } else {
+            break;
+          }
+        }
+      }
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_7, &(tint_symbol_8), &(tint_symbol_7));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/two-nested-do-whiles/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/two-nested-do-whiles/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..3fe30e2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-nested-do-whiles/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,214 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 111
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_7 "x_7"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %i_1 "i_1"
+               OpName %i_2 "i_2"
+               OpName %x_42 "x_42"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %22 = OpConstantNull %int
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %27 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %42 = OpConstantNull %bool
+%_ptr_Private_float = OpTypePointer Private %float
+   %float_n1 = OpConstant %float -1
+    %int_256 = OpConstant %int 256
+      %int_1 = OpConstant %int 1
+      %false = OpConstantFalse %bool
+   %main_out = OpTypeStruct %v4float
+         %98 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %22
+        %i_1 = OpVariable %_ptr_Function_int Function %22
+        %i_2 = OpVariable %_ptr_Function_int Function %22
+       %x_42 = OpVariable %_ptr_Function_bool Function %42
+               OpStore %x_GLF_color %27
+               OpStore %i %int_0
+         %33 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_1
+         %34 = OpLoad %float %33
+         %35 = OpFOrdLessThan %bool %34 %float_0
+               OpSelectionMerge %37 None
+               OpBranchConditional %35 %38 %39
+         %38 = OpLabel
+               OpBranch %37
+         %39 = OpLabel
+         %44 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %45 = OpLoad %float %44
+         %47 = OpFOrdLessThan %bool %45 %float_n1
+               OpStore %x_42 %47
+         %48 = OpLoad %bool %x_42
+               OpSelectionMerge %49 None
+               OpBranchConditional %48 %50 %51
+         %50 = OpLabel
+               OpBranch %49
+         %51 = OpLabel
+               OpBranch %52
+         %52 = OpLabel
+               OpLoopMerge %53 %54 None
+               OpBranch %55
+         %55 = OpLabel
+         %56 = OpLoad %int %i
+         %58 = OpSGreaterThanEqual %bool %56 %int_256
+               OpSelectionMerge %59 None
+               OpBranchConditional %58 %60 %59
+         %60 = OpLabel
+               OpBranch %53
+         %59 = OpLabel
+               OpBranch %61
+         %61 = OpLabel
+               OpLoopMerge %62 %63 None
+               OpBranch %64
+         %64 = OpLabel
+               OpStore %i_1 %int_0
+               OpBranch %65
+         %65 = OpLabel
+               OpLoopMerge %66 %67 None
+               OpBranch %68
+         %68 = OpLabel
+         %69 = OpLoad %int %i_1
+         %71 = OpSLessThan %bool %69 %int_1
+               OpSelectionMerge %72 None
+               OpBranchConditional %71 %73 %74
+         %73 = OpLabel
+               OpBranch %72
+         %74 = OpLabel
+               OpBranch %66
+         %72 = OpLabel
+         %75 = OpLoad %bool %x_42
+               OpSelectionMerge %76 None
+               OpBranchConditional %75 %77 %76
+         %77 = OpLabel
+               OpStore %i_2 %int_0
+               OpBranch %78
+         %78 = OpLabel
+               OpLoopMerge %79 %80 None
+               OpBranch %81
+         %81 = OpLabel
+         %82 = OpLoad %int %i_2
+         %83 = OpSLessThan %bool %82 %int_1
+               OpSelectionMerge %84 None
+               OpBranchConditional %83 %85 %86
+         %85 = OpLabel
+               OpBranch %84
+         %86 = OpLabel
+               OpBranch %79
+         %84 = OpLabel
+               OpBranch %80
+         %80 = OpLabel
+         %87 = OpLoad %int %i_2
+         %88 = OpIAdd %int %87 %int_1
+               OpStore %i_2 %88
+               OpBranch %78
+         %79 = OpLabel
+               OpBranch %67
+         %76 = OpLabel
+               OpReturn
+         %67 = OpLabel
+         %89 = OpLoad %int %i_1
+         %90 = OpIAdd %int %89 %int_1
+               OpStore %i_1 %90
+               OpBranch %65
+         %66 = OpLabel
+               OpBranch %63
+         %63 = OpLabel
+               OpSelectionMerge %92 None
+               OpBranchConditional %false %93 %94
+         %93 = OpLabel
+               OpBranch %92
+         %94 = OpLabel
+               OpBranch %62
+         %92 = OpLabel
+               OpBranch %61
+         %62 = OpLabel
+               OpBranch %54
+         %54 = OpLabel
+               OpSelectionMerge %95 None
+               OpBranchConditional %false %96 %97
+         %96 = OpLabel
+               OpBranch %95
+         %97 = OpLabel
+               OpBranch %53
+         %95 = OpLabel
+               OpBranch %52
+         %53 = OpLabel
+               OpBranch %49
+         %49 = OpLabel
+               OpBranch %37
+         %37 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %98
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %102 = OpLabel
+        %103 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %103
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+        %105 = OpLabel
+        %106 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %106
+        %107 = OpFunctionCall %void %main_1
+        %109 = OpLoad %v4float %x_GLF_color
+        %110 = OpCompositeConstruct %main_out %109
+        %108 = OpFunctionCall %void %tint_symbol_3 %110
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 54[%54] is not post dominated by the back-edge block 95[%95]
+  %95 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/two-nested-do-whiles/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/two-nested-do-whiles/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..a826fa8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-nested-do-whiles/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,93 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  var i_1 : i32;
+  var i_2 : i32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  i = 0;
+  let x_35 : f32 = x_7.injectionSwitch.y;
+  if ((x_35 < 0.0)) {
+  } else {
+    var x_42 : bool;
+    let x_41 : f32 = gl_FragCoord.y;
+    x_42 = (x_41 < -1.0);
+    if (x_42) {
+    } else {
+      loop {
+        let x_50 : i32 = i;
+        if ((x_50 >= 256)) {
+          break;
+        }
+        loop {
+          i_1 = 0;
+          loop {
+            let x_58 : i32 = i_1;
+            if ((x_58 < 1)) {
+            } else {
+              break;
+            }
+            if (x_42) {
+              i_2 = 0;
+              loop {
+                let x_66 : i32 = i_2;
+                if ((x_66 < 1)) {
+                } else {
+                  break;
+                }
+
+                continuing {
+                  let x_70 : i32 = i_2;
+                  i_2 = (x_70 + 1);
+                }
+              }
+              continue;
+            }
+            return;
+
+            continuing {
+              let x_72 : i32 = i_1;
+              i_1 = (x_72 + 1);
+            }
+          }
+
+          continuing {
+            if (false) {
+            } else {
+              break;
+            }
+          }
+        }
+
+        continuing {
+          if (false) {
+          } else {
+            break;
+          }
+        }
+      }
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/two-nested-for-loops-with-returns/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/two-nested-for-loops-with-returns/0-opt.spvasm
new file mode 100644
index 0000000..a49611f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-nested-for-loops-with-returns/0-opt.spvasm
@@ -0,0 +1,102 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main"
+               OpExecutionMode %main LocalSize 1 1 1
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %nb_mod_ "nb_mod("
+               OpName %s "s"
+               OpName %i "i"
+               OpName %GLF_live1i "GLF_live1i"
+               OpName %GLF_live1_looplimiter2 "GLF_live1_looplimiter2"
+               OpName %doesNotMatter "doesNotMatter"
+               OpMemberName %doesNotMatter 0 "_compute_data"
+               OpName %_ ""
+               OpDecorate %_runtimearr_float ArrayStride 4
+               OpMemberDecorate %doesNotMatter 0 Offset 0
+               OpDecorate %doesNotMatter BufferBlock
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+         %14 = OpTypeFunction %float
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_0 = OpConstant %float 0
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_5 = OpConstant %int 5
+    %int_800 = OpConstant %int 800
+       %bool = OpTypeBool
+      %int_0 = OpConstant %int 0
+     %int_20 = OpConstant %int 20
+    %float_1 = OpConstant %float 1
+   %float_42 = OpConstant %float 42
+      %int_1 = OpConstant %int 1
+%_runtimearr_float = OpTypeRuntimeArray %float
+%doesNotMatter = OpTypeStruct %_runtimearr_float
+%_ptr_Uniform_doesNotMatter = OpTypePointer Uniform %doesNotMatter
+          %_ = OpVariable %_ptr_Uniform_doesNotMatter Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+         %29 = OpUndef %int
+         %30 = OpUndef %float
+       %main = OpFunction %void None %12
+         %31 = OpLabel
+         %32 = OpFunctionCall %float %nb_mod_
+         %33 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0
+               OpStore %33 %32
+               OpReturn
+               OpFunctionEnd
+    %nb_mod_ = OpFunction %float None %14
+         %34 = OpLabel
+          %s = OpVariable %_ptr_Function_float Function
+          %i = OpVariable %_ptr_Function_int Function
+ %GLF_live1i = OpVariable %_ptr_Function_int Function
+%GLF_live1_looplimiter2 = OpVariable %_ptr_Function_int Function
+               OpStore %s %float_0
+               OpStore %i %int_5
+               OpBranch %35
+         %35 = OpLabel
+               OpLoopMerge %36 %37 None
+               OpBranch %38
+         %38 = OpLabel
+         %39 = OpSLessThan %bool %int_5 %int_800
+               OpBranchConditional %39 %40 %36
+         %40 = OpLabel
+               OpStore %GLF_live1i %int_0
+               OpBranch %41
+         %41 = OpLabel
+               OpLoopMerge %42 %43 None
+               OpBranch %44
+         %44 = OpLabel
+         %45 = OpSLessThan %bool %int_0 %int_20
+               OpBranchConditional %45 %46 %42
+         %46 = OpLabel
+         %47 = OpSGreaterThanEqual %bool %29 %int_5
+               OpSelectionMerge %48 None
+               OpBranchConditional %47 %49 %48
+         %49 = OpLabel
+         %50 = OpFAdd %float %float_0 %float_1
+               OpStore %s %50
+               OpBranch %42
+         %48 = OpLabel
+               OpReturnValue %float_42
+         %43 = OpLabel
+               OpBranch %41
+         %42 = OpLabel
+         %51 = OpPhi %float %float_0 %44 %50 %49
+         %52 = OpConvertSToF %float %int_5
+         %53 = OpFOrdLessThanEqual %bool %52 %51
+               OpSelectionMerge %54 None
+               OpBranchConditional %53 %55 %54
+         %55 = OpLabel
+               OpBranch %36
+         %54 = OpLabel
+               OpReturnValue %float_42
+         %37 = OpLabel
+               OpBranch %35
+         %36 = OpLabel
+         %56 = OpPhi %float %float_0 %38 %51 %55
+               OpReturnValue %56
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/two-nested-for-loops-with-returns/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/two-nested-for-loops-with-returns/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..522b92d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-nested-for-loops-with-returns/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,55 @@
+RWByteAddressBuffer x_9 : register(u0, space0);
+
+float nb_mod_() {
+  float s = 0.0f;
+  int i = 0;
+  int GLF_live1i = 0;
+  int GLF_live1_looplimiter2 = 0;
+  float x_51 = 0.0f;
+  float x_56_phi = 0.0f;
+  s = 0.0f;
+  i = 5;
+  while (true) {
+    float x_50 = 0.0f;
+    float x_51_phi = 0.0f;
+    x_56_phi = 0.0f;
+    if ((5 < 800)) {
+    } else {
+      break;
+    }
+    GLF_live1i = 0;
+    while (true) {
+      x_51_phi = 0.0f;
+      if ((0 < 20)) {
+      } else {
+        break;
+      }
+      if ((0 >= 5)) {
+        x_50 = (0.0f + 1.0f);
+        s = x_50;
+        x_51_phi = x_50;
+        break;
+      }
+      return 42.0f;
+    }
+    x_51 = x_51_phi;
+    if ((float(5) <= x_51)) {
+      x_56_phi = x_51;
+      break;
+    }
+    return 42.0f;
+  }
+  return x_56_phi;
+}
+
+void main_1() {
+  const float x_32 = nb_mod_();
+  x_9.Store((4u * uint(0)), asuint(x_32));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void main() {
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/two-nested-for-loops-with-returns/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/two-nested-for-loops-with-returns/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..d1dd6df
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-nested-for-loops-with-returns/0-opt.spvasm.expected.msl
@@ -0,0 +1,61 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct doesNotMatter {
+  /* 0x0000 */ float x_compute_data[1];
+};
+
+float nb_mod_() {
+  float s = 0.0f;
+  int i = 0;
+  int GLF_live1i = 0;
+  int GLF_live1_looplimiter2 = 0;
+  float x_51 = 0.0f;
+  float x_56_phi = 0.0f;
+  s = 0.0f;
+  i = 5;
+  while (true) {
+    float x_50 = 0.0f;
+    float x_51_phi = 0.0f;
+    x_56_phi = 0.0f;
+    if ((5 < 800)) {
+    } else {
+      break;
+    }
+    GLF_live1i = 0;
+    while (true) {
+      x_51_phi = 0.0f;
+      if ((0 < 20)) {
+      } else {
+        break;
+      }
+      if ((0 >= 5)) {
+        x_50 = (0.0f + 1.0f);
+        s = x_50;
+        x_51_phi = x_50;
+        break;
+      }
+      return 42.0f;
+    }
+    x_51 = x_51_phi;
+    if ((float(5) <= x_51)) {
+      x_56_phi = x_51;
+      break;
+    }
+    return 42.0f;
+  }
+  float const x_56 = x_56_phi;
+  return x_56;
+}
+
+void main_1(device doesNotMatter& x_9) {
+  float const x_32 = nb_mod_();
+  x_9.x_compute_data[0] = x_32;
+  return;
+}
+
+kernel void tint_symbol(device doesNotMatter& x_9 [[buffer(0)]]) {
+  main_1(x_9);
+  return;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/two-nested-for-loops-with-returns/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/two-nested-for-loops-with-returns/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..6f8894803
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-nested-for-loops-with-returns/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,140 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 72
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main"
+               OpExecutionMode %main LocalSize 1 1 1
+               OpName %doesNotMatter "doesNotMatter"
+               OpMemberName %doesNotMatter 0 "x_compute_data"
+               OpName %x_9 "x_9"
+               OpName %nb_mod_ "nb_mod_"
+               OpName %s "s"
+               OpName %i "i"
+               OpName %GLF_live1i "GLF_live1i"
+               OpName %GLF_live1_looplimiter2 "GLF_live1_looplimiter2"
+               OpName %x_51 "x_51"
+               OpName %x_56_phi "x_56_phi"
+               OpName %x_50 "x_50"
+               OpName %x_51_phi "x_51_phi"
+               OpName %main_1 "main_1"
+               OpName %main "main"
+               OpDecorate %doesNotMatter Block
+               OpMemberDecorate %doesNotMatter 0 Offset 0
+               OpDecorate %_runtimearr_float ArrayStride 4
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+      %float = OpTypeFloat 32
+%_runtimearr_float = OpTypeRuntimeArray %float
+%doesNotMatter = OpTypeStruct %_runtimearr_float
+%_ptr_StorageBuffer_doesNotMatter = OpTypePointer StorageBuffer %doesNotMatter
+        %x_9 = OpVariable %_ptr_StorageBuffer_doesNotMatter StorageBuffer
+          %6 = OpTypeFunction %float
+%_ptr_Function_float = OpTypePointer Function %float
+         %11 = OpConstantNull %float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %15 = OpConstantNull %int
+    %float_0 = OpConstant %float 0
+      %int_5 = OpConstant %int 5
+    %int_800 = OpConstant %int 800
+       %bool = OpTypeBool
+      %int_0 = OpConstant %int 0
+     %int_20 = OpConstant %int 20
+    %float_1 = OpConstant %float 1
+   %float_42 = OpConstant %float 42
+    %float_5 = OpConstant %float 5
+       %void = OpTypeVoid
+         %60 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_StorageBuffer_float = OpTypePointer StorageBuffer %float
+    %nb_mod_ = OpFunction %float None %6
+          %8 = OpLabel
+          %s = OpVariable %_ptr_Function_float Function %11
+          %i = OpVariable %_ptr_Function_int Function %15
+ %GLF_live1i = OpVariable %_ptr_Function_int Function %15
+%GLF_live1_looplimiter2 = OpVariable %_ptr_Function_int Function %15
+       %x_51 = OpVariable %_ptr_Function_float Function %11
+   %x_56_phi = OpVariable %_ptr_Function_float Function %11
+       %x_50 = OpVariable %_ptr_Function_float Function %11
+   %x_51_phi = OpVariable %_ptr_Function_float Function %11
+               OpStore %s %float_0
+               OpStore %i %int_5
+               OpBranch %22
+         %22 = OpLabel
+               OpLoopMerge %23 %24 None
+               OpBranch %25
+         %25 = OpLabel
+               OpStore %x_56_phi %float_0
+         %29 = OpSLessThan %bool %int_5 %int_800
+               OpSelectionMerge %31 None
+               OpBranchConditional %29 %32 %33
+         %32 = OpLabel
+               OpBranch %31
+         %33 = OpLabel
+               OpBranch %23
+         %31 = OpLabel
+               OpStore %GLF_live1i %int_0
+               OpBranch %35
+         %35 = OpLabel
+               OpLoopMerge %36 %37 None
+               OpBranch %38
+         %38 = OpLabel
+               OpStore %x_51_phi %float_0
+         %40 = OpSLessThan %bool %int_0 %int_20
+               OpSelectionMerge %41 None
+               OpBranchConditional %40 %42 %43
+         %42 = OpLabel
+               OpBranch %41
+         %43 = OpLabel
+               OpBranch %36
+         %41 = OpLabel
+         %44 = OpSGreaterThanEqual %bool %int_0 %int_5
+               OpSelectionMerge %45 None
+               OpBranchConditional %44 %46 %45
+         %46 = OpLabel
+         %48 = OpFAdd %float %float_0 %float_1
+               OpStore %x_50 %48
+         %49 = OpLoad %float %x_50
+               OpStore %s %49
+         %50 = OpLoad %float %x_50
+               OpStore %x_51_phi %50
+               OpBranch %36
+         %45 = OpLabel
+               OpReturnValue %float_42
+         %37 = OpLabel
+               OpBranch %35
+         %36 = OpLabel
+         %52 = OpLoad %float %x_51_phi
+               OpStore %x_51 %52
+         %54 = OpLoad %float %x_51
+         %55 = OpFOrdLessThanEqual %bool %float_5 %54
+               OpSelectionMerge %56 None
+               OpBranchConditional %55 %57 %56
+         %57 = OpLabel
+         %58 = OpLoad %float %x_51
+               OpStore %x_56_phi %58
+               OpBranch %23
+         %56 = OpLabel
+               OpReturnValue %float_42
+         %24 = OpLabel
+               OpBranch %22
+         %23 = OpLabel
+         %59 = OpLoad %float %x_56_phi
+               OpReturnValue %59
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %60
+         %63 = OpLabel
+         %64 = OpFunctionCall %float %nb_mod_
+         %68 = OpAccessChain %_ptr_StorageBuffer_float %x_9 %uint_0 %int_0
+               OpStore %68 %64
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %60
+         %70 = OpLabel
+         %71 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/two-nested-for-loops-with-returns/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/two-nested-for-loops-with-returns/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..01d9e68
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-nested-for-loops-with-returns/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,62 @@
+type RTArr = [[stride(4)]] array<f32>;
+
+[[block]]
+struct doesNotMatter {
+  x_compute_data : RTArr;
+};
+
+[[group(0), binding(0)]] var<storage, read_write> x_9 : doesNotMatter;
+
+fn nb_mod_() -> f32 {
+  var s : f32;
+  var i : i32;
+  var GLF_live1i : i32;
+  var GLF_live1_looplimiter2 : i32;
+  var x_51 : f32;
+  var x_56_phi : f32;
+  s = 0.0;
+  i = 5;
+  loop {
+    var x_50 : f32;
+    var x_51_phi : f32;
+    x_56_phi = 0.0;
+    if ((5 < 800)) {
+    } else {
+      break;
+    }
+    GLF_live1i = 0;
+    loop {
+      x_51_phi = 0.0;
+      if ((0 < 20)) {
+      } else {
+        break;
+      }
+      if ((0 >= 5)) {
+        x_50 = (0.0 + 1.0);
+        s = x_50;
+        x_51_phi = x_50;
+        break;
+      }
+      return 42.0;
+    }
+    x_51 = x_51_phi;
+    if ((f32(5) <= x_51)) {
+      x_56_phi = x_51;
+      break;
+    }
+    return 42.0;
+  }
+  let x_56 : f32 = x_56_phi;
+  return x_56;
+}
+
+fn main_1() {
+  let x_32 : f32 = nb_mod_();
+  x_9.x_compute_data[0] = x_32;
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main() {
+  main_1();
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/two-nested-for-loops-with-returns/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/two-nested-for-loops-with-returns/0-opt.wgsl
new file mode 100644
index 0000000..01d9e68
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-nested-for-loops-with-returns/0-opt.wgsl
@@ -0,0 +1,62 @@
+type RTArr = [[stride(4)]] array<f32>;
+
+[[block]]
+struct doesNotMatter {
+  x_compute_data : RTArr;
+};
+
+[[group(0), binding(0)]] var<storage, read_write> x_9 : doesNotMatter;
+
+fn nb_mod_() -> f32 {
+  var s : f32;
+  var i : i32;
+  var GLF_live1i : i32;
+  var GLF_live1_looplimiter2 : i32;
+  var x_51 : f32;
+  var x_56_phi : f32;
+  s = 0.0;
+  i = 5;
+  loop {
+    var x_50 : f32;
+    var x_51_phi : f32;
+    x_56_phi = 0.0;
+    if ((5 < 800)) {
+    } else {
+      break;
+    }
+    GLF_live1i = 0;
+    loop {
+      x_51_phi = 0.0;
+      if ((0 < 20)) {
+      } else {
+        break;
+      }
+      if ((0 >= 5)) {
+        x_50 = (0.0 + 1.0);
+        s = x_50;
+        x_51_phi = x_50;
+        break;
+      }
+      return 42.0;
+    }
+    x_51 = x_51_phi;
+    if ((f32(5) <= x_51)) {
+      x_56_phi = x_51;
+      break;
+    }
+    return 42.0;
+  }
+  let x_56 : f32 = x_56_phi;
+  return x_56;
+}
+
+fn main_1() {
+  let x_32 : f32 = nb_mod_();
+  x_9.x_compute_data[0] = x_32;
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main() {
+  main_1();
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/two-nested-for-loops-with-returns/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/two-nested-for-loops-with-returns/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..522b92d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-nested-for-loops-with-returns/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,55 @@
+RWByteAddressBuffer x_9 : register(u0, space0);
+
+float nb_mod_() {
+  float s = 0.0f;
+  int i = 0;
+  int GLF_live1i = 0;
+  int GLF_live1_looplimiter2 = 0;
+  float x_51 = 0.0f;
+  float x_56_phi = 0.0f;
+  s = 0.0f;
+  i = 5;
+  while (true) {
+    float x_50 = 0.0f;
+    float x_51_phi = 0.0f;
+    x_56_phi = 0.0f;
+    if ((5 < 800)) {
+    } else {
+      break;
+    }
+    GLF_live1i = 0;
+    while (true) {
+      x_51_phi = 0.0f;
+      if ((0 < 20)) {
+      } else {
+        break;
+      }
+      if ((0 >= 5)) {
+        x_50 = (0.0f + 1.0f);
+        s = x_50;
+        x_51_phi = x_50;
+        break;
+      }
+      return 42.0f;
+    }
+    x_51 = x_51_phi;
+    if ((float(5) <= x_51)) {
+      x_56_phi = x_51;
+      break;
+    }
+    return 42.0f;
+  }
+  return x_56_phi;
+}
+
+void main_1() {
+  const float x_32 = nb_mod_();
+  x_9.Store((4u * uint(0)), asuint(x_32));
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void main() {
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/two-nested-for-loops-with-returns/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/two-nested-for-loops-with-returns/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..d1dd6df
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-nested-for-loops-with-returns/0-opt.wgsl.expected.msl
@@ -0,0 +1,61 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct doesNotMatter {
+  /* 0x0000 */ float x_compute_data[1];
+};
+
+float nb_mod_() {
+  float s = 0.0f;
+  int i = 0;
+  int GLF_live1i = 0;
+  int GLF_live1_looplimiter2 = 0;
+  float x_51 = 0.0f;
+  float x_56_phi = 0.0f;
+  s = 0.0f;
+  i = 5;
+  while (true) {
+    float x_50 = 0.0f;
+    float x_51_phi = 0.0f;
+    x_56_phi = 0.0f;
+    if ((5 < 800)) {
+    } else {
+      break;
+    }
+    GLF_live1i = 0;
+    while (true) {
+      x_51_phi = 0.0f;
+      if ((0 < 20)) {
+      } else {
+        break;
+      }
+      if ((0 >= 5)) {
+        x_50 = (0.0f + 1.0f);
+        s = x_50;
+        x_51_phi = x_50;
+        break;
+      }
+      return 42.0f;
+    }
+    x_51 = x_51_phi;
+    if ((float(5) <= x_51)) {
+      x_56_phi = x_51;
+      break;
+    }
+    return 42.0f;
+  }
+  float const x_56 = x_56_phi;
+  return x_56;
+}
+
+void main_1(device doesNotMatter& x_9) {
+  float const x_32 = nb_mod_();
+  x_9.x_compute_data[0] = x_32;
+  return;
+}
+
+kernel void tint_symbol(device doesNotMatter& x_9 [[buffer(0)]]) {
+  main_1(x_9);
+  return;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/two-nested-for-loops-with-returns/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/two-nested-for-loops-with-returns/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..6f8894803
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-nested-for-loops-with-returns/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,140 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 72
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main"
+               OpExecutionMode %main LocalSize 1 1 1
+               OpName %doesNotMatter "doesNotMatter"
+               OpMemberName %doesNotMatter 0 "x_compute_data"
+               OpName %x_9 "x_9"
+               OpName %nb_mod_ "nb_mod_"
+               OpName %s "s"
+               OpName %i "i"
+               OpName %GLF_live1i "GLF_live1i"
+               OpName %GLF_live1_looplimiter2 "GLF_live1_looplimiter2"
+               OpName %x_51 "x_51"
+               OpName %x_56_phi "x_56_phi"
+               OpName %x_50 "x_50"
+               OpName %x_51_phi "x_51_phi"
+               OpName %main_1 "main_1"
+               OpName %main "main"
+               OpDecorate %doesNotMatter Block
+               OpMemberDecorate %doesNotMatter 0 Offset 0
+               OpDecorate %_runtimearr_float ArrayStride 4
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+      %float = OpTypeFloat 32
+%_runtimearr_float = OpTypeRuntimeArray %float
+%doesNotMatter = OpTypeStruct %_runtimearr_float
+%_ptr_StorageBuffer_doesNotMatter = OpTypePointer StorageBuffer %doesNotMatter
+        %x_9 = OpVariable %_ptr_StorageBuffer_doesNotMatter StorageBuffer
+          %6 = OpTypeFunction %float
+%_ptr_Function_float = OpTypePointer Function %float
+         %11 = OpConstantNull %float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %15 = OpConstantNull %int
+    %float_0 = OpConstant %float 0
+      %int_5 = OpConstant %int 5
+    %int_800 = OpConstant %int 800
+       %bool = OpTypeBool
+      %int_0 = OpConstant %int 0
+     %int_20 = OpConstant %int 20
+    %float_1 = OpConstant %float 1
+   %float_42 = OpConstant %float 42
+    %float_5 = OpConstant %float 5
+       %void = OpTypeVoid
+         %60 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_StorageBuffer_float = OpTypePointer StorageBuffer %float
+    %nb_mod_ = OpFunction %float None %6
+          %8 = OpLabel
+          %s = OpVariable %_ptr_Function_float Function %11
+          %i = OpVariable %_ptr_Function_int Function %15
+ %GLF_live1i = OpVariable %_ptr_Function_int Function %15
+%GLF_live1_looplimiter2 = OpVariable %_ptr_Function_int Function %15
+       %x_51 = OpVariable %_ptr_Function_float Function %11
+   %x_56_phi = OpVariable %_ptr_Function_float Function %11
+       %x_50 = OpVariable %_ptr_Function_float Function %11
+   %x_51_phi = OpVariable %_ptr_Function_float Function %11
+               OpStore %s %float_0
+               OpStore %i %int_5
+               OpBranch %22
+         %22 = OpLabel
+               OpLoopMerge %23 %24 None
+               OpBranch %25
+         %25 = OpLabel
+               OpStore %x_56_phi %float_0
+         %29 = OpSLessThan %bool %int_5 %int_800
+               OpSelectionMerge %31 None
+               OpBranchConditional %29 %32 %33
+         %32 = OpLabel
+               OpBranch %31
+         %33 = OpLabel
+               OpBranch %23
+         %31 = OpLabel
+               OpStore %GLF_live1i %int_0
+               OpBranch %35
+         %35 = OpLabel
+               OpLoopMerge %36 %37 None
+               OpBranch %38
+         %38 = OpLabel
+               OpStore %x_51_phi %float_0
+         %40 = OpSLessThan %bool %int_0 %int_20
+               OpSelectionMerge %41 None
+               OpBranchConditional %40 %42 %43
+         %42 = OpLabel
+               OpBranch %41
+         %43 = OpLabel
+               OpBranch %36
+         %41 = OpLabel
+         %44 = OpSGreaterThanEqual %bool %int_0 %int_5
+               OpSelectionMerge %45 None
+               OpBranchConditional %44 %46 %45
+         %46 = OpLabel
+         %48 = OpFAdd %float %float_0 %float_1
+               OpStore %x_50 %48
+         %49 = OpLoad %float %x_50
+               OpStore %s %49
+         %50 = OpLoad %float %x_50
+               OpStore %x_51_phi %50
+               OpBranch %36
+         %45 = OpLabel
+               OpReturnValue %float_42
+         %37 = OpLabel
+               OpBranch %35
+         %36 = OpLabel
+         %52 = OpLoad %float %x_51_phi
+               OpStore %x_51 %52
+         %54 = OpLoad %float %x_51
+         %55 = OpFOrdLessThanEqual %bool %float_5 %54
+               OpSelectionMerge %56 None
+               OpBranchConditional %55 %57 %56
+         %57 = OpLabel
+         %58 = OpLoad %float %x_51
+               OpStore %x_56_phi %58
+               OpBranch %23
+         %56 = OpLabel
+               OpReturnValue %float_42
+         %24 = OpLabel
+               OpBranch %22
+         %23 = OpLabel
+         %59 = OpLoad %float %x_56_phi
+               OpReturnValue %59
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %60
+         %63 = OpLabel
+         %64 = OpFunctionCall %float %nb_mod_
+         %68 = OpAccessChain %_ptr_StorageBuffer_float %x_9 %uint_0 %int_0
+               OpStore %68 %64
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %60
+         %70 = OpLabel
+         %71 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/two-nested-for-loops-with-returns/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/two-nested-for-loops-with-returns/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..01d9e68
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-nested-for-loops-with-returns/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,62 @@
+type RTArr = [[stride(4)]] array<f32>;
+
+[[block]]
+struct doesNotMatter {
+  x_compute_data : RTArr;
+};
+
+[[group(0), binding(0)]] var<storage, read_write> x_9 : doesNotMatter;
+
+fn nb_mod_() -> f32 {
+  var s : f32;
+  var i : i32;
+  var GLF_live1i : i32;
+  var GLF_live1_looplimiter2 : i32;
+  var x_51 : f32;
+  var x_56_phi : f32;
+  s = 0.0;
+  i = 5;
+  loop {
+    var x_50 : f32;
+    var x_51_phi : f32;
+    x_56_phi = 0.0;
+    if ((5 < 800)) {
+    } else {
+      break;
+    }
+    GLF_live1i = 0;
+    loop {
+      x_51_phi = 0.0;
+      if ((0 < 20)) {
+      } else {
+        break;
+      }
+      if ((0 >= 5)) {
+        x_50 = (0.0 + 1.0);
+        s = x_50;
+        x_51_phi = x_50;
+        break;
+      }
+      return 42.0;
+    }
+    x_51 = x_51_phi;
+    if ((f32(5) <= x_51)) {
+      x_56_phi = x_51;
+      break;
+    }
+    return 42.0;
+  }
+  let x_56 : f32 = x_56_phi;
+  return x_56;
+}
+
+fn main_1() {
+  let x_32 : f32 = nb_mod_();
+  x_9.x_compute_data[0] = x_32;
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main() {
+  main_1();
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/two-nested-infinite-loops-discard/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/two-nested-infinite-loops-discard/0-opt.spvasm
new file mode 100644
index 0000000..bfce82b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-nested-infinite-loops-discard/0-opt.spvasm
@@ -0,0 +1,91 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %mand_ "mand("
+               OpName %k "k"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %j "j"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %k RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %j RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %int_0 RelaxedPrecision
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+         %14 = OpTypeFunction %v3float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+   %int_1000 = OpConstant %int 1000
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+         %21 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+      %int_4 = OpConstant %int 4
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %32 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %33 = OpUndef %int
+       %true = OpConstantTrue %bool
+       %main = OpFunction %void None %11
+         %35 = OpLabel
+          %j = OpVariable %_ptr_Function_int Function
+         %36 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %37 = OpLoad %float %36
+         %38 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %39 = OpLoad %float %38
+         %40 = OpFOrdGreaterThan %bool %37 %39
+               OpSelectionMerge %41 None
+               OpBranchConditional %40 %42 %41
+         %42 = OpLabel
+               OpStore %j %int_0
+               OpBranch %43
+         %43 = OpLabel
+               OpLoopMerge %44 %45 None
+               OpBranchConditional %true %45 %44
+         %45 = OpLabel
+         %46 = OpFunctionCall %v3float %mand_
+               OpBranch %43
+         %44 = OpLabel
+               OpBranch %41
+         %41 = OpLabel
+               OpStore %_GLF_color %32
+               OpReturn
+               OpFunctionEnd
+      %mand_ = OpFunction %v3float None %14
+         %47 = OpLabel
+          %k = OpVariable %_ptr_Function_int Function
+               OpStore %k %int_0
+               OpBranch %48
+         %48 = OpLabel
+               OpLoopMerge %49 %50 None
+               OpBranchConditional %true %51 %49
+         %51 = OpLabel
+               OpKill
+         %50 = OpLabel
+               OpBranch %48
+         %49 = OpLabel
+               OpReturnValue %21
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/two-nested-infinite-loops-discard/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/two-nested-infinite-loops-discard/0-opt.spvasm.expected.hlsl
new file mode 100755
index 0000000..6b19022
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-nested-infinite-loops-discard/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,57 @@
+SKIP: FAILED
+
+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);
+
+float3 mand_() {
+  int k = 0;
+  k = 0;
+  while (true) {
+    if (true) {
+    } else {
+      break;
+    }
+    discard;
+  }
+  return float3(1.0f, 1.0f, 1.0f);
+}
+
+void main_1() {
+  int j = 0;
+  const float x_37 = asfloat(x_7[0].x);
+  const float x_39 = asfloat(x_7[0].y);
+  if ((x_37 > x_39)) {
+    j = 0;
+    {
+      for(; true; const float3 x_46 = mand_()) {
+      }
+    }
+  }
+  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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
+T:\tmp\udpk.0:26:19: error: expected expression
+      for(; true; const float3 x_46 = mand_()) {
+                  ^
+T:\tmp\udpk.0:26:19: error: expected ')'
+T:\tmp\udpk.0:26:10: note: to match this '('
+      for(; true; const float3 x_46 = mand_()) {
+         ^
+
+
diff --git a/test/vk-gl-cts/graphicsfuzz/two-nested-infinite-loops-discard/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/two-nested-infinite-loops-discard/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..82947bc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-nested-infinite-loops-discard/0-opt.spvasm.expected.msl
@@ -0,0 +1,54 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float3 mand_() {
+  int k = 0;
+  k = 0;
+  while (true) {
+    if (true) {
+    } else {
+      break;
+    }
+    discard_fragment();
+  }
+  return float3(1.0f, 1.0f, 1.0f);
+}
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_4) {
+  int j = 0;
+  float const x_37 = x_7.injectionSwitch.x;
+  float const x_39 = x_7.injectionSwitch.y;
+  if ((x_37 > x_39)) {
+    j = 0;
+    while (true) {
+      if (true) {
+      } else {
+        break;
+      }
+      {
+        float3 const x_46 = mand_();
+      }
+    }
+  }
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/two-nested-infinite-loops-discard/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/two-nested-infinite-loops-discard/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..8d1e068
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-nested-infinite-loops-discard/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,132 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 70
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %mand_ "mand_"
+               OpName %k "k"
+               OpName %main_1 "main_1"
+               OpName %j "j"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+    %v3float = OpTypeVector %float 3
+         %12 = OpTypeFunction %v3float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %19 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+    %float_1 = OpConstant %float 1
+         %31 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+       %void = OpTypeVoid
+         %32 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+    %float_0 = OpConstant %float 0
+         %57 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %58 = OpTypeFunction %void %main_out
+      %mand_ = OpFunction %v3float None %12
+         %15 = OpLabel
+          %k = OpVariable %_ptr_Function_int Function %19
+               OpStore %k %int_0
+               OpBranch %21
+         %21 = OpLabel
+               OpLoopMerge %22 %23 None
+               OpBranch %24
+         %24 = OpLabel
+               OpSelectionMerge %27 None
+               OpBranchConditional %true %28 %29
+         %28 = OpLabel
+               OpBranch %27
+         %29 = OpLabel
+               OpBranch %22
+         %27 = OpLabel
+               OpKill
+         %23 = OpLabel
+               OpBranch %21
+         %22 = OpLabel
+               OpReturnValue %31
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %32
+         %35 = OpLabel
+          %j = OpVariable %_ptr_Function_int Function %19
+         %40 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_0
+         %41 = OpLoad %float %40
+         %43 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_1
+         %44 = OpLoad %float %43
+         %45 = OpFOrdGreaterThan %bool %41 %44
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %46
+         %47 = OpLabel
+               OpStore %j %int_0
+               OpBranch %48
+         %48 = OpLabel
+               OpLoopMerge %49 %50 None
+               OpBranch %51
+         %51 = OpLabel
+               OpSelectionMerge %52 None
+               OpBranchConditional %true %53 %54
+         %53 = OpLabel
+               OpBranch %52
+         %54 = OpLabel
+               OpBranch %49
+         %52 = OpLabel
+               OpBranch %50
+         %50 = OpLabel
+         %55 = OpFunctionCall %v3float %mand_
+               OpBranch %48
+         %49 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+               OpStore %x_GLF_color %57
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %58
+%tint_symbol = OpFunctionParameter %main_out
+         %62 = OpLabel
+         %63 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %63
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %32
+         %65 = OpLabel
+         %66 = OpFunctionCall %void %main_1
+         %68 = OpLoad %v4float %x_GLF_color
+         %69 = OpCompositeConstruct %main_out %68
+         %67 = OpFunctionCall %void %tint_symbol_2 %69
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/two-nested-infinite-loops-discard/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/two-nested-infinite-loops-discard/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..26e8226
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-nested-infinite-loops-discard/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,53 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn mand_() -> vec3<f32> {
+  var k : i32;
+  k = 0;
+  loop {
+    if (true) {
+    } else {
+      break;
+    }
+    discard;
+  }
+  return vec3<f32>(1.0, 1.0, 1.0);
+}
+
+fn main_1() {
+  var j : i32;
+  let x_37 : f32 = x_7.injectionSwitch.x;
+  let x_39 : f32 = x_7.injectionSwitch.y;
+  if ((x_37 > x_39)) {
+    j = 0;
+    loop {
+      if (true) {
+      } else {
+        break;
+      }
+
+      continuing {
+        let x_46 : vec3<f32> = mand_();
+      }
+    }
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/two-nested-infinite-loops-discard/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/two-nested-infinite-loops-discard/0-opt.wgsl
new file mode 100644
index 0000000..26e8226
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-nested-infinite-loops-discard/0-opt.wgsl
@@ -0,0 +1,53 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn mand_() -> vec3<f32> {
+  var k : i32;
+  k = 0;
+  loop {
+    if (true) {
+    } else {
+      break;
+    }
+    discard;
+  }
+  return vec3<f32>(1.0, 1.0, 1.0);
+}
+
+fn main_1() {
+  var j : i32;
+  let x_37 : f32 = x_7.injectionSwitch.x;
+  let x_39 : f32 = x_7.injectionSwitch.y;
+  if ((x_37 > x_39)) {
+    j = 0;
+    loop {
+      if (true) {
+      } else {
+        break;
+      }
+
+      continuing {
+        let x_46 : vec3<f32> = mand_();
+      }
+    }
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/two-nested-infinite-loops-discard/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/two-nested-infinite-loops-discard/0-opt.wgsl.expected.hlsl
new file mode 100755
index 0000000..05c2717
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-nested-infinite-loops-discard/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,57 @@
+SKIP: FAILED
+
+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);
+
+float3 mand_() {
+  int k = 0;
+  k = 0;
+  while (true) {
+    if (true) {
+    } else {
+      break;
+    }
+    discard;
+  }
+  return float3(1.0f, 1.0f, 1.0f);
+}
+
+void main_1() {
+  int j = 0;
+  const float x_37 = asfloat(x_7[0].x);
+  const float x_39 = asfloat(x_7[0].y);
+  if ((x_37 > x_39)) {
+    j = 0;
+    {
+      for(; true; const float3 x_46 = mand_()) {
+      }
+    }
+  }
+  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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
+T:\tmp\ub0s.0:26:19: error: expected expression
+      for(; true; const float3 x_46 = mand_()) {
+                  ^
+T:\tmp\ub0s.0:26:19: error: expected ')'
+T:\tmp\ub0s.0:26:10: note: to match this '('
+      for(; true; const float3 x_46 = mand_()) {
+         ^
+
+
diff --git a/test/vk-gl-cts/graphicsfuzz/two-nested-infinite-loops-discard/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/two-nested-infinite-loops-discard/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..82947bc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-nested-infinite-loops-discard/0-opt.wgsl.expected.msl
@@ -0,0 +1,54 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float3 mand_() {
+  int k = 0;
+  k = 0;
+  while (true) {
+    if (true) {
+    } else {
+      break;
+    }
+    discard_fragment();
+  }
+  return float3(1.0f, 1.0f, 1.0f);
+}
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_4) {
+  int j = 0;
+  float const x_37 = x_7.injectionSwitch.x;
+  float const x_39 = x_7.injectionSwitch.y;
+  if ((x_37 > x_39)) {
+    j = 0;
+    while (true) {
+      if (true) {
+      } else {
+        break;
+      }
+      {
+        float3 const x_46 = mand_();
+      }
+    }
+  }
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_7, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/two-nested-infinite-loops-discard/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/two-nested-infinite-loops-discard/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..8d1e068
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-nested-infinite-loops-discard/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,132 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 70
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_7 "x_7"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %mand_ "mand_"
+               OpName %k "k"
+               OpName %main_1 "main_1"
+               OpName %j "j"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+    %v3float = OpTypeVector %float 3
+         %12 = OpTypeFunction %v3float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %19 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+    %float_1 = OpConstant %float 1
+         %31 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+       %void = OpTypeVoid
+         %32 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+    %float_0 = OpConstant %float 0
+         %57 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %58 = OpTypeFunction %void %main_out
+      %mand_ = OpFunction %v3float None %12
+         %15 = OpLabel
+          %k = OpVariable %_ptr_Function_int Function %19
+               OpStore %k %int_0
+               OpBranch %21
+         %21 = OpLabel
+               OpLoopMerge %22 %23 None
+               OpBranch %24
+         %24 = OpLabel
+               OpSelectionMerge %27 None
+               OpBranchConditional %true %28 %29
+         %28 = OpLabel
+               OpBranch %27
+         %29 = OpLabel
+               OpBranch %22
+         %27 = OpLabel
+               OpKill
+         %23 = OpLabel
+               OpBranch %21
+         %22 = OpLabel
+               OpReturnValue %31
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %32
+         %35 = OpLabel
+          %j = OpVariable %_ptr_Function_int Function %19
+         %40 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_0
+         %41 = OpLoad %float %40
+         %43 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_1
+         %44 = OpLoad %float %43
+         %45 = OpFOrdGreaterThan %bool %41 %44
+               OpSelectionMerge %46 None
+               OpBranchConditional %45 %47 %46
+         %47 = OpLabel
+               OpStore %j %int_0
+               OpBranch %48
+         %48 = OpLabel
+               OpLoopMerge %49 %50 None
+               OpBranch %51
+         %51 = OpLabel
+               OpSelectionMerge %52 None
+               OpBranchConditional %true %53 %54
+         %53 = OpLabel
+               OpBranch %52
+         %54 = OpLabel
+               OpBranch %49
+         %52 = OpLabel
+               OpBranch %50
+         %50 = OpLabel
+         %55 = OpFunctionCall %v3float %mand_
+               OpBranch %48
+         %49 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+               OpStore %x_GLF_color %57
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %58
+%tint_symbol = OpFunctionParameter %main_out
+         %62 = OpLabel
+         %63 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %63
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %32
+         %65 = OpLabel
+         %66 = OpFunctionCall %void %main_1
+         %68 = OpLoad %v4float %x_GLF_color
+         %69 = OpCompositeConstruct %main_out %68
+         %67 = OpFunctionCall %void %tint_symbol_2 %69
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/two-nested-infinite-loops-discard/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/two-nested-infinite-loops-discard/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..26e8226
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/two-nested-infinite-loops-discard/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,53 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn mand_() -> vec3<f32> {
+  var k : i32;
+  k = 0;
+  loop {
+    if (true) {
+    } else {
+      break;
+    }
+    discard;
+  }
+  return vec3<f32>(1.0, 1.0, 1.0);
+}
+
+fn main_1() {
+  var j : i32;
+  let x_37 : f32 = x_7.injectionSwitch.x;
+  let x_39 : f32 = x_7.injectionSwitch.y;
+  if ((x_37 > x_39)) {
+    j = 0;
+    loop {
+      if (true) {
+      } else {
+        break;
+      }
+
+      continuing {
+        let x_46 : vec3<f32> = mand_();
+      }
+    }
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/undefined-assign-in-infinite-loop/0.spvasm b/test/vk-gl-cts/graphicsfuzz/undefined-assign-in-infinite-loop/0.spvasm
new file mode 100644
index 0000000..de10e0e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/undefined-assign-in-infinite-loop/0.spvasm
@@ -0,0 +1,82 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpName %GLF_dead6index "GLF_dead6index"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %GLF_dead6currentNode "GLF_dead6currentNode"
+               OpName %donor_replacementGLF_dead6tree "donor_replacementGLF_dead6tree"
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %GLF_dead6index RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %GLF_dead6currentNode RelaxedPrecision
+               OpDecorate %donor_replacementGLF_dead6tree RelaxedPrecision
+               OpDecorate %9 RelaxedPrecision
+               OpDecorate %10 RelaxedPrecision
+               OpDecorate %11 RelaxedPrecision
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %19 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+%_arr_int_uint_1 = OpTypeArray %int %uint_1
+%_ptr_Function__arr_int_uint_1 = OpTypePointer Function %_arr_int_uint_1
+       %main = OpFunction %void None %13
+         %32 = OpLabel
+%GLF_dead6index = OpVariable %_ptr_Function_int Function
+%GLF_dead6currentNode = OpVariable %_ptr_Function_int Function
+%donor_replacementGLF_dead6tree = OpVariable %_ptr_Function__arr_int_uint_1 Function
+               OpStore %_GLF_color %19
+               OpStore %GLF_dead6index %int_0
+         %33 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %34 = OpLoad %float %33
+         %35 = OpFOrdLessThan %bool %34 %float_0
+               OpSelectionMerge %36 None
+               OpBranchConditional %35 %37 %36
+         %37 = OpLabel
+               OpBranch %38
+         %38 = OpLabel
+               OpLoopMerge %39 %40 None
+               OpBranch %41
+         %41 = OpLabel
+               OpBranchConditional %true %42 %39
+         %42 = OpLabel
+          %9 = OpLoad %int %GLF_dead6index
+         %43 = OpAccessChain %_ptr_Function_int %donor_replacementGLF_dead6tree %9
+         %10 = OpLoad %int %43
+               OpStore %GLF_dead6currentNode %10
+         %11 = OpLoad %int %GLF_dead6currentNode
+               OpStore %GLF_dead6index %11
+               OpBranch %40
+         %40 = OpLabel
+               OpBranch %38
+         %39 = OpLabel
+               OpBranch %36
+         %36 = OpLabel
+               OpReturn
+               OpFunctionEnd
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
new file mode 100755
index 0000000..cd1e894
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/undefined-assign-in-infinite-loop/0.spvasm.expected.hlsl
@@ -0,0 +1,47 @@
+SKIP: FAILED
+
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+
+void main_1() {
+  int GLF_dead6index = 0;
+  int GLF_dead6currentNode = 0;
+  int donor_replacementGLF_dead6tree[1] = (int[1])0;
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  GLF_dead6index = 0;
+  const float x_34 = asfloat(x_6[0].y);
+  if ((x_34 < 0.0f)) {
+    while (true) {
+      if (true) {
+      } else {
+        break;
+      }
+      const int x_10 = donor_replacementGLF_dead6tree[GLF_dead6index];
+      GLF_dead6currentNode = x_10;
+      GLF_dead6index = GLF_dead6currentNode;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
+error: validation errors
+T:\tmp\u4lc.0:34: error: Loop must have break.
+Validation failed.
+
+
+
diff --git a/test/vk-gl-cts/graphicsfuzz/undefined-assign-in-infinite-loop/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/undefined-assign-in-infinite-loop/0.spvasm.expected.msl
new file mode 100644
index 0000000..3986db2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/undefined-assign-in-infinite-loop/0.spvasm.expected.msl
@@ -0,0 +1,47 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  int arr[1];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int GLF_dead6index = 0;
+  int GLF_dead6currentNode = 0;
+  tint_array_wrapper donor_replacementGLF_dead6tree = {};
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  GLF_dead6index = 0;
+  float const x_34 = x_6.injectionSwitch.y;
+  if ((x_34 < 0.0f)) {
+    while (true) {
+      if (true) {
+      } else {
+        break;
+      }
+      int const x_9 = GLF_dead6index;
+      int const x_10 = donor_replacementGLF_dead6tree.arr[x_9];
+      GLF_dead6currentNode = x_10;
+      int const x_11 = GLF_dead6currentNode;
+      GLF_dead6index = x_11;
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/undefined-assign-in-infinite-loop/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/undefined-assign-in-infinite-loop/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..4f5ea06
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/undefined-assign-in-infinite-loop/0.spvasm.expected.spvasm
@@ -0,0 +1,116 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 63
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %GLF_dead6index "GLF_dead6index"
+               OpName %GLF_dead6currentNode "GLF_dead6currentNode"
+               OpName %donor_replacementGLF_dead6tree "donor_replacementGLF_dead6tree"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_1 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %19 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_int_uint_1 = OpTypeArray %int %uint_1
+%_ptr_Function__arr_int_uint_1 = OpTypePointer Function %_arr_int_uint_1
+         %26 = OpConstantNull %_arr_int_uint_1
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %29 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %int_0 = OpConstant %int 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+   %main_out = OpTypeStruct %v4float
+         %51 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+%GLF_dead6index = OpVariable %_ptr_Function_int Function %19
+%GLF_dead6currentNode = OpVariable %_ptr_Function_int Function %19
+%donor_replacementGLF_dead6tree = OpVariable %_ptr_Function__arr_int_uint_1 Function %26
+               OpStore %x_GLF_color %29
+               OpStore %GLF_dead6index %int_0
+         %33 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %34 = OpLoad %float %33
+         %35 = OpFOrdLessThan %bool %34 %float_0
+               OpSelectionMerge %37 None
+               OpBranchConditional %35 %38 %37
+         %38 = OpLabel
+               OpBranch %39
+         %39 = OpLabel
+               OpLoopMerge %40 %41 None
+               OpBranch %42
+         %42 = OpLabel
+               OpSelectionMerge %44 None
+               OpBranchConditional %true %45 %46
+         %45 = OpLabel
+               OpBranch %44
+         %46 = OpLabel
+               OpBranch %40
+         %44 = OpLabel
+         %47 = OpLoad %int %GLF_dead6index
+         %48 = OpAccessChain %_ptr_Function_int %donor_replacementGLF_dead6tree %47
+         %49 = OpLoad %int %48
+               OpStore %GLF_dead6currentNode %49
+         %50 = OpLoad %int %GLF_dead6currentNode
+               OpStore %GLF_dead6index %50
+               OpBranch %41
+         %41 = OpLabel
+               OpBranch %39
+         %40 = OpLabel
+               OpBranch %37
+         %37 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %51
+%tint_symbol = OpFunctionParameter %main_out
+         %55 = OpLabel
+         %56 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %56
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %58 = OpLabel
+         %59 = OpFunctionCall %void %main_1
+         %61 = OpLoad %v4float %x_GLF_color
+         %62 = OpCompositeConstruct %main_out %61
+         %60 = OpFunctionCall %void %tint_symbol_2 %62
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/undefined-assign-in-infinite-loop/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/undefined-assign-in-infinite-loop/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..eec717f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/undefined-assign-in-infinite-loop/0.spvasm.expected.wgsl
@@ -0,0 +1,42 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+fn main_1() {
+  var GLF_dead6index : i32;
+  var GLF_dead6currentNode : i32;
+  var donor_replacementGLF_dead6tree : array<i32, 1>;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  GLF_dead6index = 0;
+  let x_34 : f32 = x_6.injectionSwitch.y;
+  if ((x_34 < 0.0)) {
+    loop {
+      if (true) {
+      } else {
+        break;
+      }
+      let x_9 : i32 = GLF_dead6index;
+      let x_10 : i32 = donor_replacementGLF_dead6tree[x_9];
+      GLF_dead6currentNode = x_10;
+      let x_11 : i32 = GLF_dead6currentNode;
+      GLF_dead6index = x_11;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/undefined-assign-in-infinite-loop/0.wgsl b/test/vk-gl-cts/graphicsfuzz/undefined-assign-in-infinite-loop/0.wgsl
new file mode 100644
index 0000000..eec717f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/undefined-assign-in-infinite-loop/0.wgsl
@@ -0,0 +1,42 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+fn main_1() {
+  var GLF_dead6index : i32;
+  var GLF_dead6currentNode : i32;
+  var donor_replacementGLF_dead6tree : array<i32, 1>;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  GLF_dead6index = 0;
+  let x_34 : f32 = x_6.injectionSwitch.y;
+  if ((x_34 < 0.0)) {
+    loop {
+      if (true) {
+      } else {
+        break;
+      }
+      let x_9 : i32 = GLF_dead6index;
+      let x_10 : i32 = donor_replacementGLF_dead6tree[x_9];
+      GLF_dead6currentNode = x_10;
+      let x_11 : i32 = GLF_dead6currentNode;
+      GLF_dead6index = x_11;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
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
new file mode 100755
index 0000000..633f6e3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/undefined-assign-in-infinite-loop/0.wgsl.expected.hlsl
@@ -0,0 +1,47 @@
+SKIP: FAILED
+
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+
+void main_1() {
+  int GLF_dead6index = 0;
+  int GLF_dead6currentNode = 0;
+  int donor_replacementGLF_dead6tree[1] = (int[1])0;
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  GLF_dead6index = 0;
+  const float x_34 = asfloat(x_6[0].y);
+  if ((x_34 < 0.0f)) {
+    while (true) {
+      if (true) {
+      } else {
+        break;
+      }
+      const int x_10 = donor_replacementGLF_dead6tree[GLF_dead6index];
+      GLF_dead6currentNode = x_10;
+      GLF_dead6index = GLF_dead6currentNode;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
+error: validation errors
+T:\tmp\u4wo.0:34: error: Loop must have break.
+Validation failed.
+
+
+
diff --git a/test/vk-gl-cts/graphicsfuzz/undefined-assign-in-infinite-loop/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/undefined-assign-in-infinite-loop/0.wgsl.expected.msl
new file mode 100644
index 0000000..3986db2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/undefined-assign-in-infinite-loop/0.wgsl.expected.msl
@@ -0,0 +1,47 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  int arr[1];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int GLF_dead6index = 0;
+  int GLF_dead6currentNode = 0;
+  tint_array_wrapper donor_replacementGLF_dead6tree = {};
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  GLF_dead6index = 0;
+  float const x_34 = x_6.injectionSwitch.y;
+  if ((x_34 < 0.0f)) {
+    while (true) {
+      if (true) {
+      } else {
+        break;
+      }
+      int const x_9 = GLF_dead6index;
+      int const x_10 = donor_replacementGLF_dead6tree.arr[x_9];
+      GLF_dead6currentNode = x_10;
+      int const x_11 = GLF_dead6currentNode;
+      GLF_dead6index = x_11;
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/undefined-assign-in-infinite-loop/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/undefined-assign-in-infinite-loop/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..4f5ea06
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/undefined-assign-in-infinite-loop/0.wgsl.expected.spvasm
@@ -0,0 +1,116 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 63
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %GLF_dead6index "GLF_dead6index"
+               OpName %GLF_dead6currentNode "GLF_dead6currentNode"
+               OpName %donor_replacementGLF_dead6tree "donor_replacementGLF_dead6tree"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_int_uint_1 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %19 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_int_uint_1 = OpTypeArray %int %uint_1
+%_ptr_Function__arr_int_uint_1 = OpTypePointer Function %_arr_int_uint_1
+         %26 = OpConstantNull %_arr_int_uint_1
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %29 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %int_0 = OpConstant %int 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+   %main_out = OpTypeStruct %v4float
+         %51 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+%GLF_dead6index = OpVariable %_ptr_Function_int Function %19
+%GLF_dead6currentNode = OpVariable %_ptr_Function_int Function %19
+%donor_replacementGLF_dead6tree = OpVariable %_ptr_Function__arr_int_uint_1 Function %26
+               OpStore %x_GLF_color %29
+               OpStore %GLF_dead6index %int_0
+         %33 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %34 = OpLoad %float %33
+         %35 = OpFOrdLessThan %bool %34 %float_0
+               OpSelectionMerge %37 None
+               OpBranchConditional %35 %38 %37
+         %38 = OpLabel
+               OpBranch %39
+         %39 = OpLabel
+               OpLoopMerge %40 %41 None
+               OpBranch %42
+         %42 = OpLabel
+               OpSelectionMerge %44 None
+               OpBranchConditional %true %45 %46
+         %45 = OpLabel
+               OpBranch %44
+         %46 = OpLabel
+               OpBranch %40
+         %44 = OpLabel
+         %47 = OpLoad %int %GLF_dead6index
+         %48 = OpAccessChain %_ptr_Function_int %donor_replacementGLF_dead6tree %47
+         %49 = OpLoad %int %48
+               OpStore %GLF_dead6currentNode %49
+         %50 = OpLoad %int %GLF_dead6currentNode
+               OpStore %GLF_dead6index %50
+               OpBranch %41
+         %41 = OpLabel
+               OpBranch %39
+         %40 = OpLabel
+               OpBranch %37
+         %37 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %51
+%tint_symbol = OpFunctionParameter %main_out
+         %55 = OpLabel
+         %56 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %56
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %58 = OpLabel
+         %59 = OpFunctionCall %void %main_1
+         %61 = OpLoad %v4float %x_GLF_color
+         %62 = OpCompositeConstruct %main_out %61
+         %60 = OpFunctionCall %void %tint_symbol_2 %62
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/undefined-assign-in-infinite-loop/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/undefined-assign-in-infinite-loop/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..eec717f
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/undefined-assign-in-infinite-loop/0.wgsl.expected.wgsl
@@ -0,0 +1,42 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+fn main_1() {
+  var GLF_dead6index : i32;
+  var GLF_dead6currentNode : i32;
+  var donor_replacementGLF_dead6tree : array<i32, 1>;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  GLF_dead6index = 0;
+  let x_34 : f32 = x_6.injectionSwitch.y;
+  if ((x_34 < 0.0)) {
+    loop {
+      if (true) {
+      } else {
+        break;
+      }
+      let x_9 : i32 = GLF_dead6index;
+      let x_10 : i32 = donor_replacementGLF_dead6tree[x_9];
+      GLF_dead6currentNode = x_10;
+      let x_11 : i32 = GLF_dead6currentNode;
+      GLF_dead6index = x_11;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/undefined-integer-in-function/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/undefined-integer-in-function/0-opt.spvasm
new file mode 100644
index 0000000..180f484
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/undefined-integer-in-function/0-opt.spvasm
@@ -0,0 +1,113 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %performPartition_ "performPartition("
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %GLF_live0i "GLF_live0i"
+               OpName %i "i"
+               OpDecorate %performPartition_ RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %GLF_live0i RelaxedPrecision
+               OpDecorate %i RelaxedPrecision
+               OpDecorate %9 RelaxedPrecision
+               OpDecorate %10 RelaxedPrecision
+               OpDecorate %11 RelaxedPrecision
+               OpDecorate %10 RelaxedPrecision
+               OpDecorate %10 RelaxedPrecision
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+         %15 = OpTypeFunction %int
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %21 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+      %false = OpConstantFalse %bool
+         %32 = OpUndef %int
+       %true = OpConstantTrue %bool
+       %main = OpFunction %void None %13
+         %34 = OpLabel
+          %9 = OpFunctionCall %int %performPartition_
+               OpReturn
+               OpFunctionEnd
+%performPartition_ = OpFunction %int None %15
+         %35 = OpLabel
+ %GLF_live0i = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+               OpStore %_GLF_color %21
+               OpBranch %36
+         %36 = OpLabel
+         %10 = OpPhi %int %32 %35 %11 %37
+               OpLoopMerge %38 %37 None
+               OpBranch %39
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %41 = OpLoad %float %40
+         %42 = OpFOrdLessThan %bool %41 %float_0
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %45
+         %45 = OpLabel
+               OpStore %GLF_live0i %int_0
+               OpBranch %46
+         %46 = OpLabel
+         %47 = OpSLessThan %bool %int_0 %int_1
+               OpLoopMerge %48 %49 None
+               OpBranch %50
+         %50 = OpLabel
+               OpSelectionMerge %51 None
+               OpBranchConditional %42 %48 %51
+         %48 = OpLabel
+               OpSelectionMerge %52 None
+               OpBranchConditional %42 %53 %52
+         %51 = OpLabel
+               OpReturnValue %int_1
+         %49 = OpLabel
+               OpBranch %46
+         %53 = OpLabel
+               OpBranch %54
+         %54 = OpLabel
+               OpLoopMerge %55 %56 None
+               OpBranch %57
+         %57 = OpLabel
+               OpReturnValue %int_1
+         %56 = OpLabel
+               OpBranch %54
+         %55 = OpLabel
+               OpUnreachable
+         %52 = OpLabel
+               OpBranch %37
+         %44 = OpLabel
+               OpBranch %37
+         %43 = OpLabel
+               OpBranch %37
+         %37 = OpLabel
+         %11 = OpPhi %int %10 %44 %10 %52 %int_0 %43
+               OpBranchConditional %false %36 %38
+         %38 = OpLabel
+               OpReturnValue %11
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/undefined-integer-in-function/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/undefined-integer-in-function/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..301c375
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/undefined-integer-in-function/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,86 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+
+int performPartition_() {
+  int GLF_live0i = 0;
+  int i = 0;
+  int x_11 = 0;
+  int x_10_phi = 0;
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  x_10_phi = 0;
+  while (true) {
+    int x_11_phi = 0;
+    const int x_10 = x_10_phi;
+    bool x_42 = false;
+    const float x_41 = asfloat(x_6[0].y);
+    x_42 = (x_41 < 0.0f);
+    if (x_42) {
+      x_11_phi = x_10;
+      {
+        x_11 = x_11_phi;
+        x_10_phi = x_11;
+        if (false) {
+        } else {
+          break;
+        }
+      }
+      continue;
+    } else {
+      GLF_live0i = 0;
+      while (true) {
+        const bool x_47 = (0 < 1);
+        if (x_42) {
+          break;
+        }
+        return 1;
+      }
+      if (x_42) {
+        while (true) {
+          return 1;
+        }
+        return 0;
+      }
+      x_11_phi = x_10;
+      {
+        x_11 = x_11_phi;
+        x_10_phi = x_11;
+        if (false) {
+        } else {
+          break;
+        }
+      }
+      continue;
+    }
+    x_11_phi = 0;
+    {
+      x_11 = x_11_phi;
+      x_10_phi = x_11;
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  return x_11;
+}
+
+void main_1() {
+  const int x_9 = performPartition_();
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/undefined-integer-in-function/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/undefined-integer-in-function/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..4c1cf9d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/undefined-integer-in-function/0-opt.spvasm.expected.msl
@@ -0,0 +1,89 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int performPartition_(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int GLF_live0i = 0;
+  int i = 0;
+  int x_11 = 0;
+  int x_10_phi = 0;
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  x_10_phi = 0;
+  while (true) {
+    int x_11_phi = 0;
+    int const x_10 = x_10_phi;
+    bool x_42 = false;
+    float const x_41 = x_6.injectionSwitch.y;
+    x_42 = (x_41 < 0.0f);
+    if (x_42) {
+      x_11_phi = x_10;
+      {
+        x_11 = x_11_phi;
+        x_10_phi = x_11;
+        if (false) {
+        } else {
+          break;
+        }
+      }
+      continue;
+    } else {
+      GLF_live0i = 0;
+      while (true) {
+        bool const x_47 = (0 < 1);
+        if (x_42) {
+          break;
+        }
+        return 1;
+      }
+      if (x_42) {
+        while (true) {
+          return 1;
+        }
+        return 0;
+      }
+      x_11_phi = x_10;
+      {
+        x_11 = x_11_phi;
+        x_10_phi = x_11;
+        if (false) {
+        } else {
+          break;
+        }
+      }
+      continue;
+    }
+    x_11_phi = 0;
+    {
+      x_11 = x_11_phi;
+      x_10_phi = x_11;
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  return x_11;
+}
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_5) {
+  int const x_9 = performPartition_(x_6, tint_symbol_5);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_6, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/undefined-integer-in-function/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/undefined-integer-in-function/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..b8befb6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/undefined-integer-in-function/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,172 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 87
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %performPartition_ "performPartition_"
+               OpName %GLF_live0i "GLF_live0i"
+               OpName %i "i"
+               OpName %x_11 "x_11"
+               OpName %x_10_phi "x_10_phi"
+               OpName %x_11_phi "x_11_phi"
+               OpName %x_42 "x_42"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+        %int = OpTypeInt 32 1
+         %12 = OpTypeFunction %int
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %24 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %35 = OpConstantNull %bool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+      %false = OpConstantFalse %bool
+       %void = OpTypeVoid
+         %70 = OpTypeFunction %void
+   %main_out = OpTypeStruct %v4float
+         %75 = OpTypeFunction %void %main_out
+%performPartition_ = OpFunction %int None %12
+         %15 = OpLabel
+ %GLF_live0i = OpVariable %_ptr_Function_int Function %18
+          %i = OpVariable %_ptr_Function_int Function %18
+       %x_11 = OpVariable %_ptr_Function_int Function %18
+   %x_10_phi = OpVariable %_ptr_Function_int Function %18
+   %x_11_phi = OpVariable %_ptr_Function_int Function %18
+       %x_42 = OpVariable %_ptr_Function_bool Function %35
+               OpStore %x_GLF_color %24
+               OpStore %x_10_phi %int_0
+               OpBranch %26
+         %26 = OpLabel
+               OpLoopMerge %27 %28 None
+               OpBranch %29
+         %29 = OpLabel
+         %31 = OpLoad %int %x_10_phi
+         %40 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %41 = OpLoad %float %40
+         %42 = OpFOrdLessThan %bool %41 %float_0
+               OpStore %x_42 %42
+         %43 = OpLoad %bool %x_42
+               OpSelectionMerge %44 None
+               OpBranchConditional %43 %45 %46
+         %45 = OpLabel
+               OpStore %x_11_phi %31
+               OpBranch %28
+         %46 = OpLabel
+               OpStore %GLF_live0i %int_0
+               OpBranch %47
+         %47 = OpLabel
+               OpLoopMerge %48 %49 None
+               OpBranch %50
+         %50 = OpLabel
+         %52 = OpSLessThan %bool %int_0 %int_1
+         %53 = OpLoad %bool %x_42
+               OpSelectionMerge %54 None
+               OpBranchConditional %53 %55 %54
+         %55 = OpLabel
+               OpBranch %48
+         %54 = OpLabel
+               OpReturnValue %int_1
+         %49 = OpLabel
+               OpBranch %47
+         %48 = OpLabel
+         %56 = OpLoad %bool %x_42
+               OpSelectionMerge %57 None
+               OpBranchConditional %56 %58 %57
+         %58 = OpLabel
+               OpBranch %59
+         %59 = OpLabel
+               OpLoopMerge %60 %61 None
+               OpBranch %62
+         %62 = OpLabel
+               OpReturnValue %int_1
+         %61 = OpLabel
+               OpBranch %59
+         %60 = OpLabel
+               OpReturnValue %int_0
+         %57 = OpLabel
+               OpStore %x_11_phi %31
+               OpBranch %28
+         %44 = OpLabel
+               OpStore %x_11_phi %int_0
+               OpBranch %28
+         %28 = OpLabel
+         %63 = OpLoad %int %x_11_phi
+               OpStore %x_11 %63
+         %64 = OpLoad %int %x_11
+               OpStore %x_10_phi %64
+               OpSelectionMerge %66 None
+               OpBranchConditional %false %67 %68
+         %67 = OpLabel
+               OpBranch %66
+         %68 = OpLabel
+               OpBranch %27
+         %66 = OpLabel
+               OpBranch %26
+         %27 = OpLabel
+         %69 = OpLoad %int %x_11
+               OpReturnValue %69
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %70
+         %73 = OpLabel
+         %74 = OpFunctionCall %int %performPartition_
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %75
+%tint_symbol = OpFunctionParameter %main_out
+         %79 = OpLabel
+         %80 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %80
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %70
+         %82 = OpLabel
+         %83 = OpFunctionCall %void %main_1
+         %85 = OpLoad %v4float %x_GLF_color
+         %86 = OpCompositeConstruct %main_out %85
+         %84 = OpFunctionCall %void %tint_symbol_2 %86
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 28[%28] is not post dominated by the back-edge block 66[%66]
+  %66 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/undefined-integer-in-function/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/undefined-integer-in-function/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..0ddfab8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/undefined-integer-in-function/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,72 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+fn performPartition_() -> i32 {
+  var GLF_live0i : i32;
+  var i : i32;
+  var x_11 : i32;
+  var x_10_phi : i32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  x_10_phi = 0;
+  loop {
+    var x_11_phi : i32;
+    let x_10 : i32 = x_10_phi;
+    var x_42 : bool;
+    let x_41 : f32 = x_6.injectionSwitch.y;
+    x_42 = (x_41 < 0.0);
+    if (x_42) {
+      x_11_phi = x_10;
+      continue;
+    } else {
+      GLF_live0i = 0;
+      loop {
+        let x_47 : bool = (0 < 1);
+        if (x_42) {
+          break;
+        }
+        return 1;
+      }
+      if (x_42) {
+        loop {
+          return 1;
+        }
+        return 0;
+      }
+      x_11_phi = x_10;
+      continue;
+    }
+    x_11_phi = 0;
+
+    continuing {
+      x_11 = x_11_phi;
+      x_10_phi = x_11;
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  return x_11;
+}
+
+fn main_1() {
+  let x_9 : i32 = performPartition_();
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/undefined-integer-in-function/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/undefined-integer-in-function/0-opt.wgsl
new file mode 100644
index 0000000..0ddfab8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/undefined-integer-in-function/0-opt.wgsl
@@ -0,0 +1,72 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+fn performPartition_() -> i32 {
+  var GLF_live0i : i32;
+  var i : i32;
+  var x_11 : i32;
+  var x_10_phi : i32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  x_10_phi = 0;
+  loop {
+    var x_11_phi : i32;
+    let x_10 : i32 = x_10_phi;
+    var x_42 : bool;
+    let x_41 : f32 = x_6.injectionSwitch.y;
+    x_42 = (x_41 < 0.0);
+    if (x_42) {
+      x_11_phi = x_10;
+      continue;
+    } else {
+      GLF_live0i = 0;
+      loop {
+        let x_47 : bool = (0 < 1);
+        if (x_42) {
+          break;
+        }
+        return 1;
+      }
+      if (x_42) {
+        loop {
+          return 1;
+        }
+        return 0;
+      }
+      x_11_phi = x_10;
+      continue;
+    }
+    x_11_phi = 0;
+
+    continuing {
+      x_11 = x_11_phi;
+      x_10_phi = x_11;
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  return x_11;
+}
+
+fn main_1() {
+  let x_9 : i32 = performPartition_();
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/undefined-integer-in-function/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/undefined-integer-in-function/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..301c375
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/undefined-integer-in-function/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,86 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+
+int performPartition_() {
+  int GLF_live0i = 0;
+  int i = 0;
+  int x_11 = 0;
+  int x_10_phi = 0;
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  x_10_phi = 0;
+  while (true) {
+    int x_11_phi = 0;
+    const int x_10 = x_10_phi;
+    bool x_42 = false;
+    const float x_41 = asfloat(x_6[0].y);
+    x_42 = (x_41 < 0.0f);
+    if (x_42) {
+      x_11_phi = x_10;
+      {
+        x_11 = x_11_phi;
+        x_10_phi = x_11;
+        if (false) {
+        } else {
+          break;
+        }
+      }
+      continue;
+    } else {
+      GLF_live0i = 0;
+      while (true) {
+        const bool x_47 = (0 < 1);
+        if (x_42) {
+          break;
+        }
+        return 1;
+      }
+      if (x_42) {
+        while (true) {
+          return 1;
+        }
+        return 0;
+      }
+      x_11_phi = x_10;
+      {
+        x_11 = x_11_phi;
+        x_10_phi = x_11;
+        if (false) {
+        } else {
+          break;
+        }
+      }
+      continue;
+    }
+    x_11_phi = 0;
+    {
+      x_11 = x_11_phi;
+      x_10_phi = x_11;
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  return x_11;
+}
+
+void main_1() {
+  const int x_9 = performPartition_();
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/undefined-integer-in-function/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/undefined-integer-in-function/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..4c1cf9d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/undefined-integer-in-function/0-opt.wgsl.expected.msl
@@ -0,0 +1,89 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int performPartition_(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int GLF_live0i = 0;
+  int i = 0;
+  int x_11 = 0;
+  int x_10_phi = 0;
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  x_10_phi = 0;
+  while (true) {
+    int x_11_phi = 0;
+    int const x_10 = x_10_phi;
+    bool x_42 = false;
+    float const x_41 = x_6.injectionSwitch.y;
+    x_42 = (x_41 < 0.0f);
+    if (x_42) {
+      x_11_phi = x_10;
+      {
+        x_11 = x_11_phi;
+        x_10_phi = x_11;
+        if (false) {
+        } else {
+          break;
+        }
+      }
+      continue;
+    } else {
+      GLF_live0i = 0;
+      while (true) {
+        bool const x_47 = (0 < 1);
+        if (x_42) {
+          break;
+        }
+        return 1;
+      }
+      if (x_42) {
+        while (true) {
+          return 1;
+        }
+        return 0;
+      }
+      x_11_phi = x_10;
+      {
+        x_11 = x_11_phi;
+        x_10_phi = x_11;
+        if (false) {
+        } else {
+          break;
+        }
+      }
+      continue;
+    }
+    x_11_phi = 0;
+    {
+      x_11 = x_11_phi;
+      x_10_phi = x_11;
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  return x_11;
+}
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_5) {
+  int const x_9 = performPartition_(x_6, tint_symbol_5);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_6, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/undefined-integer-in-function/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/undefined-integer-in-function/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..b8befb6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/undefined-integer-in-function/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,172 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 87
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %performPartition_ "performPartition_"
+               OpName %GLF_live0i "GLF_live0i"
+               OpName %i "i"
+               OpName %x_11 "x_11"
+               OpName %x_10_phi "x_10_phi"
+               OpName %x_11_phi "x_11_phi"
+               OpName %x_42 "x_42"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+        %int = OpTypeInt 32 1
+         %12 = OpTypeFunction %int
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %24 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %35 = OpConstantNull %bool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+      %false = OpConstantFalse %bool
+       %void = OpTypeVoid
+         %70 = OpTypeFunction %void
+   %main_out = OpTypeStruct %v4float
+         %75 = OpTypeFunction %void %main_out
+%performPartition_ = OpFunction %int None %12
+         %15 = OpLabel
+ %GLF_live0i = OpVariable %_ptr_Function_int Function %18
+          %i = OpVariable %_ptr_Function_int Function %18
+       %x_11 = OpVariable %_ptr_Function_int Function %18
+   %x_10_phi = OpVariable %_ptr_Function_int Function %18
+   %x_11_phi = OpVariable %_ptr_Function_int Function %18
+       %x_42 = OpVariable %_ptr_Function_bool Function %35
+               OpStore %x_GLF_color %24
+               OpStore %x_10_phi %int_0
+               OpBranch %26
+         %26 = OpLabel
+               OpLoopMerge %27 %28 None
+               OpBranch %29
+         %29 = OpLabel
+         %31 = OpLoad %int %x_10_phi
+         %40 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %41 = OpLoad %float %40
+         %42 = OpFOrdLessThan %bool %41 %float_0
+               OpStore %x_42 %42
+         %43 = OpLoad %bool %x_42
+               OpSelectionMerge %44 None
+               OpBranchConditional %43 %45 %46
+         %45 = OpLabel
+               OpStore %x_11_phi %31
+               OpBranch %28
+         %46 = OpLabel
+               OpStore %GLF_live0i %int_0
+               OpBranch %47
+         %47 = OpLabel
+               OpLoopMerge %48 %49 None
+               OpBranch %50
+         %50 = OpLabel
+         %52 = OpSLessThan %bool %int_0 %int_1
+         %53 = OpLoad %bool %x_42
+               OpSelectionMerge %54 None
+               OpBranchConditional %53 %55 %54
+         %55 = OpLabel
+               OpBranch %48
+         %54 = OpLabel
+               OpReturnValue %int_1
+         %49 = OpLabel
+               OpBranch %47
+         %48 = OpLabel
+         %56 = OpLoad %bool %x_42
+               OpSelectionMerge %57 None
+               OpBranchConditional %56 %58 %57
+         %58 = OpLabel
+               OpBranch %59
+         %59 = OpLabel
+               OpLoopMerge %60 %61 None
+               OpBranch %62
+         %62 = OpLabel
+               OpReturnValue %int_1
+         %61 = OpLabel
+               OpBranch %59
+         %60 = OpLabel
+               OpReturnValue %int_0
+         %57 = OpLabel
+               OpStore %x_11_phi %31
+               OpBranch %28
+         %44 = OpLabel
+               OpStore %x_11_phi %int_0
+               OpBranch %28
+         %28 = OpLabel
+         %63 = OpLoad %int %x_11_phi
+               OpStore %x_11 %63
+         %64 = OpLoad %int %x_11
+               OpStore %x_10_phi %64
+               OpSelectionMerge %66 None
+               OpBranchConditional %false %67 %68
+         %67 = OpLabel
+               OpBranch %66
+         %68 = OpLabel
+               OpBranch %27
+         %66 = OpLabel
+               OpBranch %26
+         %27 = OpLabel
+         %69 = OpLoad %int %x_11
+               OpReturnValue %69
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %70
+         %73 = OpLabel
+         %74 = OpFunctionCall %int %performPartition_
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %75
+%tint_symbol = OpFunctionParameter %main_out
+         %79 = OpLabel
+         %80 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %80
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %70
+         %82 = OpLabel
+         %83 = OpFunctionCall %void %main_1
+         %85 = OpLoad %v4float %x_GLF_color
+         %86 = OpCompositeConstruct %main_out %85
+         %84 = OpFunctionCall %void %tint_symbol_2 %86
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 28[%28] is not post dominated by the back-edge block 66[%66]
+  %66 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/undefined-integer-in-function/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/undefined-integer-in-function/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..0ddfab8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/undefined-integer-in-function/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,72 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+fn performPartition_() -> i32 {
+  var GLF_live0i : i32;
+  var i : i32;
+  var x_11 : i32;
+  var x_10_phi : i32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  x_10_phi = 0;
+  loop {
+    var x_11_phi : i32;
+    let x_10 : i32 = x_10_phi;
+    var x_42 : bool;
+    let x_41 : f32 = x_6.injectionSwitch.y;
+    x_42 = (x_41 < 0.0);
+    if (x_42) {
+      x_11_phi = x_10;
+      continue;
+    } else {
+      GLF_live0i = 0;
+      loop {
+        let x_47 : bool = (0 < 1);
+        if (x_42) {
+          break;
+        }
+        return 1;
+      }
+      if (x_42) {
+        loop {
+          return 1;
+        }
+        return 0;
+      }
+      x_11_phi = x_10;
+      continue;
+    }
+    x_11_phi = 0;
+
+    continuing {
+      x_11 = x_11_phi;
+      x_10_phi = x_11;
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  return x_11;
+}
+
+fn main_1() {
+  let x_9 : i32 = performPartition_();
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/uninit-element-cast-in-loop/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/uninit-element-cast-in-loop/0-opt.spvasm
new file mode 100644
index 0000000..88da2e9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/uninit-element-cast-in-loop/0-opt.spvasm
@@ -0,0 +1,71 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+      %false = OpConstantFalse %bool
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%_ptr_Function__arr_float_uint_1 = OpTypePointer Function %_arr_float_uint_1
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Function_float = OpTypePointer Function %float
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %27 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %28 = OpUndef %float
+       %main = OpFunction %void None %7
+         %29 = OpLabel
+         %30 = OpVariable %_ptr_Function_float Function
+               OpBranch %31
+         %31 = OpLabel
+         %32 = OpPhi %float %28 %29 %33 %34
+               OpLoopMerge %35 %34 None
+               OpBranch %36
+         %36 = OpLabel
+         %33 = OpPhi %float %32 %31 %28 %37
+         %38 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %39 = OpLoad %float %38
+         %40 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %41 = OpLoad %float %40
+         %42 = OpFOrdLessThan %bool %39 %41
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %34
+         %37 = OpLabel
+               OpBranch %36
+         %44 = OpLabel
+               OpStore %_GLF_color %27
+               OpReturn
+         %43 = OpLabel
+               OpBranch %34
+         %34 = OpLabel
+               OpBranch %31
+         %35 = OpLabel
+               OpUnreachable
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/uninit-element-cast-in-loop/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/uninit-element-cast-in-loop/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..704ebff
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/uninit-element-cast-in-loop/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,44 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float x_30 = 0.0f;
+  float x_32_phi = 0.0f;
+  x_32_phi = 0.0f;
+  while (true) {
+    float x_33_phi = 0.0f;
+    x_33_phi = x_32_phi;
+    const float x_33 = x_33_phi;
+    const float x_39 = asfloat(x_5[0].x);
+    const float x_41 = asfloat(x_5[0].y);
+    if ((x_39 < x_41)) {
+      x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+      return;
+    } else {
+      {
+        x_32_phi = x_33;
+      }
+      continue;
+    }
+    {
+      x_32_phi = x_33;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/uninit-element-cast-in-loop/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/uninit-element-cast-in-loop/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..f3bfdd2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/uninit-element-cast-in-loop/0-opt.spvasm.expected.msl
@@ -0,0 +1,48 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  float x_30 = 0.0f;
+  float x_32_phi = 0.0f;
+  x_32_phi = 0.0f;
+  while (true) {
+    float x_33_phi = 0.0f;
+    float const x_32 = x_32_phi;
+    x_33_phi = x_32;
+    float const x_33 = x_33_phi;
+    float const x_39 = x_5.injectionSwitch.x;
+    float const x_41 = x_5.injectionSwitch.y;
+    if ((x_39 < x_41)) {
+      *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+      return;
+    } else {
+      {
+        x_32_phi = x_33;
+      }
+      continue;
+    }
+    {
+      x_32_phi = x_33;
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/uninit-element-cast-in-loop/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/uninit-element-cast-in-loop/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..2cc6d3b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/uninit-element-cast-in-loop/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,104 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 55
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_30 "x_30"
+               OpName %x_32_phi "x_32_phi"
+               OpName %x_33_phi "x_33_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %18 = OpConstantNull %float
+    %float_0 = OpConstant %float 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+         %42 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %43 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+       %x_30 = OpVariable %_ptr_Function_float Function %18
+   %x_32_phi = OpVariable %_ptr_Function_float Function %18
+   %x_33_phi = OpVariable %_ptr_Function_float Function %18
+               OpStore %x_32_phi %float_0
+               OpBranch %21
+         %21 = OpLabel
+               OpLoopMerge %22 %23 None
+               OpBranch %24
+         %24 = OpLabel
+         %26 = OpLoad %float %x_32_phi
+               OpStore %x_33_phi %26
+         %27 = OpLoad %float %x_33_phi
+         %31 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %uint_0
+         %32 = OpLoad %float %31
+         %34 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %uint_1
+         %35 = OpLoad %float %34
+         %36 = OpFOrdLessThan %bool %32 %35
+               OpSelectionMerge %38 None
+               OpBranchConditional %36 %39 %40
+         %39 = OpLabel
+               OpStore %x_GLF_color %42
+               OpReturn
+         %40 = OpLabel
+               OpBranch %23
+         %38 = OpLabel
+               OpBranch %23
+         %23 = OpLabel
+               OpStore %x_32_phi %27
+               OpBranch %21
+         %22 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %43
+%tint_symbol = OpFunctionParameter %main_out
+         %47 = OpLabel
+         %48 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %48
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %50 = OpLabel
+         %51 = OpFunctionCall %void %main_1
+         %53 = OpLoad %v4float %x_GLF_color
+         %54 = OpCompositeConstruct %main_out %53
+         %52 = OpFunctionCall %void %tint_symbol_2 %54
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/uninit-element-cast-in-loop/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/uninit-element-cast-in-loop/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..ee9a420
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/uninit-element-cast-in-loop/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,44 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_30 : f32;
+  var x_32_phi : f32;
+  x_32_phi = 0.0;
+  loop {
+    var x_33_phi : f32;
+    let x_32 : f32 = x_32_phi;
+    x_33_phi = x_32;
+    let x_33 : f32 = x_33_phi;
+    let x_39 : f32 = x_5.injectionSwitch.x;
+    let x_41 : f32 = x_5.injectionSwitch.y;
+    if ((x_39 < x_41)) {
+      x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+      return;
+    } else {
+      continue;
+    }
+
+    continuing {
+      x_32_phi = x_33;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/uninit-element-cast-in-loop/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/uninit-element-cast-in-loop/0-opt.wgsl
new file mode 100644
index 0000000..ee9a420
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/uninit-element-cast-in-loop/0-opt.wgsl
@@ -0,0 +1,44 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_30 : f32;
+  var x_32_phi : f32;
+  x_32_phi = 0.0;
+  loop {
+    var x_33_phi : f32;
+    let x_32 : f32 = x_32_phi;
+    x_33_phi = x_32;
+    let x_33 : f32 = x_33_phi;
+    let x_39 : f32 = x_5.injectionSwitch.x;
+    let x_41 : f32 = x_5.injectionSwitch.y;
+    if ((x_39 < x_41)) {
+      x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+      return;
+    } else {
+      continue;
+    }
+
+    continuing {
+      x_32_phi = x_33;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/uninit-element-cast-in-loop/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/uninit-element-cast-in-loop/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..704ebff
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/uninit-element-cast-in-loop/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,44 @@
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float x_30 = 0.0f;
+  float x_32_phi = 0.0f;
+  x_32_phi = 0.0f;
+  while (true) {
+    float x_33_phi = 0.0f;
+    x_33_phi = x_32_phi;
+    const float x_33 = x_33_phi;
+    const float x_39 = asfloat(x_5[0].x);
+    const float x_41 = asfloat(x_5[0].y);
+    if ((x_39 < x_41)) {
+      x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+      return;
+    } else {
+      {
+        x_32_phi = x_33;
+      }
+      continue;
+    }
+    {
+      x_32_phi = x_33;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/uninit-element-cast-in-loop/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/uninit-element-cast-in-loop/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..f3bfdd2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/uninit-element-cast-in-loop/0-opt.wgsl.expected.msl
@@ -0,0 +1,48 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  float x_30 = 0.0f;
+  float x_32_phi = 0.0f;
+  x_32_phi = 0.0f;
+  while (true) {
+    float x_33_phi = 0.0f;
+    float const x_32 = x_32_phi;
+    x_33_phi = x_32;
+    float const x_33 = x_33_phi;
+    float const x_39 = x_5.injectionSwitch.x;
+    float const x_41 = x_5.injectionSwitch.y;
+    if ((x_39 < x_41)) {
+      *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+      return;
+    } else {
+      {
+        x_32_phi = x_33;
+      }
+      continue;
+    }
+    {
+      x_32_phi = x_33;
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/uninit-element-cast-in-loop/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/uninit-element-cast-in-loop/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..2cc6d3b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/uninit-element-cast-in-loop/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,104 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 55
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_5 "x_5"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_30 "x_30"
+               OpName %x_32_phi "x_32_phi"
+               OpName %x_33_phi "x_33_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %18 = OpConstantNull %float
+    %float_0 = OpConstant %float 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+         %42 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %43 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+       %x_30 = OpVariable %_ptr_Function_float Function %18
+   %x_32_phi = OpVariable %_ptr_Function_float Function %18
+   %x_33_phi = OpVariable %_ptr_Function_float Function %18
+               OpStore %x_32_phi %float_0
+               OpBranch %21
+         %21 = OpLabel
+               OpLoopMerge %22 %23 None
+               OpBranch %24
+         %24 = OpLabel
+         %26 = OpLoad %float %x_32_phi
+               OpStore %x_33_phi %26
+         %27 = OpLoad %float %x_33_phi
+         %31 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %uint_0
+         %32 = OpLoad %float %31
+         %34 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %uint_1
+         %35 = OpLoad %float %34
+         %36 = OpFOrdLessThan %bool %32 %35
+               OpSelectionMerge %38 None
+               OpBranchConditional %36 %39 %40
+         %39 = OpLabel
+               OpStore %x_GLF_color %42
+               OpReturn
+         %40 = OpLabel
+               OpBranch %23
+         %38 = OpLabel
+               OpBranch %23
+         %23 = OpLabel
+               OpStore %x_32_phi %27
+               OpBranch %21
+         %22 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %43
+%tint_symbol = OpFunctionParameter %main_out
+         %47 = OpLabel
+         %48 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %48
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %50 = OpLabel
+         %51 = OpFunctionCall %void %main_1
+         %53 = OpLoad %v4float %x_GLF_color
+         %54 = OpCompositeConstruct %main_out %53
+         %52 = OpFunctionCall %void %tint_symbol_2 %54
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/uninit-element-cast-in-loop/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/uninit-element-cast-in-loop/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..ee9a420
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/uninit-element-cast-in-loop/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,44 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_30 : f32;
+  var x_32_phi : f32;
+  x_32_phi = 0.0;
+  loop {
+    var x_33_phi : f32;
+    let x_32 : f32 = x_32_phi;
+    x_33_phi = x_32;
+    let x_33 : f32 = x_33_phi;
+    let x_39 : f32 = x_5.injectionSwitch.x;
+    let x_41 : f32 = x_5.injectionSwitch.y;
+    if ((x_39 < x_41)) {
+      x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+      return;
+    } else {
+      continue;
+    }
+
+    continuing {
+      x_32_phi = x_33;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/uninitialized-var-decrement-and-add/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/uninitialized-var-decrement-and-add/0-opt.spvasm
new file mode 100644
index 0000000..2dd3c4d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/uninitialized-var-decrement-and-add/0-opt.spvasm
@@ -0,0 +1,67 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color %gl_FragCoord
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %foo "foo"
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %foo RelaxedPrecision
+               OpDecorate %6 RelaxedPrecision
+               OpDecorate %7 RelaxedPrecision
+               OpDecorate %8 RelaxedPrecision
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %16 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+   %float_n1 = OpConstant %float -1
+       %bool = OpTypeBool
+%_ptr_Function_float = OpTypePointer Function %float
+%_ptr_Output_float = OpTypePointer Output %float
+%uint_178493 = OpConstant %uint 178493
+%_ptr_Function_uint = OpTypePointer Function %uint
+        %int = OpTypeInt 32 1
+      %int_1 = OpConstant %int 1
+       %main = OpFunction %void None %10
+         %29 = OpLabel
+         %30 = OpVariable %_ptr_Function_float Function
+        %foo = OpVariable %_ptr_Function_uint Function
+               OpStore %_GLF_color %16
+         %31 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %32 = OpLoad %float %31
+         %33 = OpFOrdGreaterThan %bool %32 %float_n1
+               OpSelectionMerge %34 None
+               OpBranchConditional %33 %35 %36
+         %35 = OpLabel
+         %37 = OpAccessChain %_ptr_Output_float %_GLF_color %uint_0
+         %38 = OpLoad %float %37
+               OpStore %30 %38
+               OpBranch %34
+         %36 = OpLabel
+          %6 = OpLoad %uint %foo
+          %7 = OpISub %uint %6 %int_1
+               OpStore %foo %7
+          %8 = OpIAdd %uint %uint_178493 %7
+         %39 = OpConvertUToF %float %8
+               OpStore %30 %39
+               OpBranch %34
+         %34 = OpLabel
+         %40 = OpLoad %float %30
+         %41 = OpAccessChain %_ptr_Output_float %_GLF_color %uint_0
+               OpStore %41 %40
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/uninitialized-var-decrement-and-add/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/uninitialized-var-decrement-and-add/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..9722e0d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/uninitialized-var-decrement-and-add/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,38 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float x_30 = 0.0f;
+  uint foo = 0u;
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  const float x_32 = gl_FragCoord.x;
+  if ((x_32 > -1.0f)) {
+    const float x_38 = x_GLF_color.x;
+    x_30 = x_38;
+  } else {
+    const uint x_7 = (foo - asuint(1));
+    foo = x_7;
+    x_30 = float((178493u + x_7));
+  }
+  x_GLF_color.x = x_30;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/uninitialized-var-decrement-and-add/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/uninitialized-var-decrement-and-add/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..a3f6ec6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/uninitialized-var-decrement-and-add/0-opt.spvasm.expected.msl
@@ -0,0 +1,39 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float x_30 = 0.0f;
+  uint foo = 0u;
+  *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  float const x_32 = (*(tint_symbol_6)).x;
+  if ((x_32 > -1.0f)) {
+    float const x_38 = (*(tint_symbol_5)).x;
+    x_30 = x_38;
+  } else {
+    uint const x_6 = foo;
+    uint const x_7 = (x_6 - as_type<uint>(1));
+    foo = x_7;
+    x_30 = float((178493u + x_7));
+  }
+  float const x_40 = x_30;
+  (*(tint_symbol_5)).x = x_40;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(&(tint_symbol_8), &(tint_symbol_7));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/uninitialized-var-decrement-and-add/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/uninitialized-var-decrement-and-add/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..10ff9fa
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/uninitialized-var-decrement-and-add/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,100 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 60
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %x_30 "x_30"
+               OpName %foo "foo"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %17 = OpConstantNull %float
+       %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+         %21 = OpConstantNull %uint
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %24 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+   %float_n1 = OpConstant %float -1
+       %bool = OpTypeBool
+        %int = OpTypeInt 32 1
+      %int_1 = OpConstant %int 1
+%uint_178493 = OpConstant %uint 178493
+   %main_out = OpTypeStruct %v4float
+         %47 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+       %x_30 = OpVariable %_ptr_Function_float Function %17
+        %foo = OpVariable %_ptr_Function_uint Function %21
+               OpStore %x_GLF_color %24
+         %27 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %28 = OpLoad %float %27
+         %30 = OpFOrdGreaterThan %bool %28 %float_n1
+               OpSelectionMerge %32 None
+               OpBranchConditional %30 %33 %34
+         %33 = OpLabel
+         %35 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_0
+         %36 = OpLoad %float %35
+               OpStore %x_30 %36
+               OpBranch %32
+         %34 = OpLabel
+         %37 = OpLoad %uint %foo
+         %38 = OpBitcast %uint %int_1
+         %41 = OpISub %uint %37 %38
+               OpStore %foo %41
+         %44 = OpIAdd %uint %uint_178493 %41
+         %42 = OpConvertUToF %float %44
+               OpStore %x_30 %42
+               OpBranch %32
+         %32 = OpLabel
+         %45 = OpLoad %float %x_30
+         %46 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_0
+               OpStore %46 %45
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %47
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %51 = OpLabel
+         %52 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %52
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %54 = OpLabel
+         %55 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %55
+         %56 = OpFunctionCall %void %main_1
+         %58 = OpLoad %v4float %x_GLF_color
+         %59 = OpCompositeConstruct %main_out %58
+         %57 = OpFunctionCall %void %tint_symbol_3 %59
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/uninitialized-var-decrement-and-add/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/uninitialized-var-decrement-and-add/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..3b84978
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/uninitialized-var-decrement-and-add/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,34 @@
+var<private> x_GLF_color : vec4<f32>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  var x_30 : f32;
+  var foo : u32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  let x_32 : f32 = gl_FragCoord.x;
+  if ((x_32 > -1.0)) {
+    let x_38 : f32 = x_GLF_color.x;
+    x_30 = x_38;
+  } else {
+    let x_6 : u32 = foo;
+    let x_7 : u32 = (x_6 - bitcast<u32>(1));
+    foo = x_7;
+    x_30 = f32((178493u + x_7));
+  }
+  let x_40 : f32 = x_30;
+  x_GLF_color.x = x_40;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/uninitialized-var-decrement-and-add/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/uninitialized-var-decrement-and-add/0-opt.wgsl
new file mode 100644
index 0000000..3b84978
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/uninitialized-var-decrement-and-add/0-opt.wgsl
@@ -0,0 +1,34 @@
+var<private> x_GLF_color : vec4<f32>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  var x_30 : f32;
+  var foo : u32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  let x_32 : f32 = gl_FragCoord.x;
+  if ((x_32 > -1.0)) {
+    let x_38 : f32 = x_GLF_color.x;
+    x_30 = x_38;
+  } else {
+    let x_6 : u32 = foo;
+    let x_7 : u32 = (x_6 - bitcast<u32>(1));
+    foo = x_7;
+    x_30 = f32((178493u + x_7));
+  }
+  let x_40 : f32 = x_30;
+  x_GLF_color.x = x_40;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/uninitialized-var-decrement-and-add/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/uninitialized-var-decrement-and-add/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..9722e0d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/uninitialized-var-decrement-and-add/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,38 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float x_30 = 0.0f;
+  uint foo = 0u;
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  const float x_32 = gl_FragCoord.x;
+  if ((x_32 > -1.0f)) {
+    const float x_38 = x_GLF_color.x;
+    x_30 = x_38;
+  } else {
+    const uint x_7 = (foo - asuint(1));
+    foo = x_7;
+    x_30 = float((178493u + x_7));
+  }
+  x_GLF_color.x = x_30;
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/uninitialized-var-decrement-and-add/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/uninitialized-var-decrement-and-add/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..a3f6ec6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/uninitialized-var-decrement-and-add/0-opt.wgsl.expected.msl
@@ -0,0 +1,39 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float x_30 = 0.0f;
+  uint foo = 0u;
+  *(tint_symbol_5) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  float const x_32 = (*(tint_symbol_6)).x;
+  if ((x_32 > -1.0f)) {
+    float const x_38 = (*(tint_symbol_5)).x;
+    x_30 = x_38;
+  } else {
+    uint const x_6 = foo;
+    uint const x_7 = (x_6 - as_type<uint>(1));
+    foo = x_7;
+    x_30 = float((178493u + x_7));
+  }
+  float const x_40 = x_30;
+  (*(tint_symbol_5)).x = x_40;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(&(tint_symbol_8), &(tint_symbol_7));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/uninitialized-var-decrement-and-add/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/uninitialized-var-decrement-and-add/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..10ff9fa
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/uninitialized-var-decrement-and-add/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,100 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 60
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %x_30 "x_30"
+               OpName %foo "foo"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %17 = OpConstantNull %float
+       %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+         %21 = OpConstantNull %uint
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %24 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+   %float_n1 = OpConstant %float -1
+       %bool = OpTypeBool
+        %int = OpTypeInt 32 1
+      %int_1 = OpConstant %int 1
+%uint_178493 = OpConstant %uint 178493
+   %main_out = OpTypeStruct %v4float
+         %47 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+       %x_30 = OpVariable %_ptr_Function_float Function %17
+        %foo = OpVariable %_ptr_Function_uint Function %21
+               OpStore %x_GLF_color %24
+         %27 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %28 = OpLoad %float %27
+         %30 = OpFOrdGreaterThan %bool %28 %float_n1
+               OpSelectionMerge %32 None
+               OpBranchConditional %30 %33 %34
+         %33 = OpLabel
+         %35 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_0
+         %36 = OpLoad %float %35
+               OpStore %x_30 %36
+               OpBranch %32
+         %34 = OpLabel
+         %37 = OpLoad %uint %foo
+         %38 = OpBitcast %uint %int_1
+         %41 = OpISub %uint %37 %38
+               OpStore %foo %41
+         %44 = OpIAdd %uint %uint_178493 %41
+         %42 = OpConvertUToF %float %44
+               OpStore %x_30 %42
+               OpBranch %32
+         %32 = OpLabel
+         %45 = OpLoad %float %x_30
+         %46 = OpAccessChain %_ptr_Private_float %x_GLF_color %uint_0
+               OpStore %46 %45
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %47
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %51 = OpLabel
+         %52 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %52
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %54 = OpLabel
+         %55 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %55
+         %56 = OpFunctionCall %void %main_1
+         %58 = OpLoad %v4float %x_GLF_color
+         %59 = OpCompositeConstruct %main_out %58
+         %57 = OpFunctionCall %void %tint_symbol_3 %59
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/uninitialized-var-decrement-and-add/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/uninitialized-var-decrement-and-add/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..3b84978
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/uninitialized-var-decrement-and-add/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,34 @@
+var<private> x_GLF_color : vec4<f32>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  var x_30 : f32;
+  var foo : u32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  let x_32 : f32 = gl_FragCoord.x;
+  if ((x_32 > -1.0)) {
+    let x_38 : f32 = x_GLF_color.x;
+    x_30 = x_38;
+  } else {
+    let x_6 : u32 = foo;
+    let x_7 : u32 = (x_6 - bitcast<u32>(1));
+    foo = x_7;
+    x_30 = f32((178493u + x_7));
+  }
+  let x_40 : f32 = x_30;
+  x_GLF_color.x = x_40;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-barrier-in-loops/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/unreachable-barrier-in-loops/0-opt.spvasm
new file mode 100644
index 0000000..d6a929a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-barrier-in-loops/0-opt.spvasm
@@ -0,0 +1,269 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main" %gl_GlobalInvocationID
+               OpExecutionMode %main LocalSize 1 1 1
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %A "A"
+               OpName %i "i"
+               OpName %gl_GlobalInvocationID "gl_GlobalInvocationID"
+               OpName %value "value"
+               OpName %m "m"
+               OpName %l "l"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %n "n"
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "resolution"
+               OpName %__0 ""
+               OpName %doesNotMatter "doesNotMatter"
+               OpMemberName %doesNotMatter 0 "_compute_data"
+               OpName %__1 ""
+               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %buf2 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 2
+               OpDecorate %_runtimearr_int ArrayStride 4
+               OpMemberDecorate %doesNotMatter 0 Offset 0
+               OpDecorate %doesNotMatter BufferBlock
+               OpDecorate %__1 DescriptorSet 0
+               OpDecorate %__1 Binding 0
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%_ptr_Function__arr_float_uint_1 = OpTypePointer Function %_arr_float_uint_1
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+    %float_0 = OpConstant %float 0
+%_ptr_Function_float = OpTypePointer Function %float
+%_ptr_Function_int = OpTypePointer Function %int
+     %int_50 = OpConstant %int 50
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_uint = OpTypePointer Input %uint
+   %uint_100 = OpConstant %uint 100
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+    %float_1 = OpConstant %float 1
+         %40 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+          %_ = OpVariable %_ptr_Uniform_buf1 Uniform
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_2 = OpConstant %uint 2
+   %uint_264 = OpConstant %uint 264
+   %uint_120 = OpConstant %uint 120
+       %buf2 = OpTypeStruct %v2float
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+        %__0 = OpVariable %_ptr_Uniform_buf2 Uniform
+      %false = OpConstantFalse %bool
+%_runtimearr_int = OpTypeRuntimeArray %int
+%doesNotMatter = OpTypeStruct %_runtimearr_int
+%_ptr_Uniform_doesNotMatter = OpTypePointer Uniform %doesNotMatter
+        %__1 = OpVariable %_ptr_Uniform_doesNotMatter Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+     %uint_3 = OpConstant %uint 3
+       %main = OpFunction %void None %18
+         %54 = OpLabel
+          %A = OpVariable %_ptr_Function__arr_float_uint_1 Function
+          %i = OpVariable %_ptr_Function_int Function
+      %value = OpVariable %_ptr_Function_v4float Function
+          %m = OpVariable %_ptr_Function_int Function
+          %l = OpVariable %_ptr_Function_int Function
+          %n = OpVariable %_ptr_Function_int Function
+         %55 = OpAccessChain %_ptr_Function_float %A %int_0
+               OpStore %55 %float_0
+               OpStore %i %int_0
+               OpBranch %56
+         %56 = OpLabel
+               OpLoopMerge %57 %58 None
+               OpBranch %59
+         %59 = OpLabel
+         %60 = OpLoad %int %i
+         %61 = OpSLessThan %bool %60 %int_50
+               OpBranchConditional %61 %62 %57
+         %62 = OpLabel
+         %63 = OpLoad %int %i
+         %64 = OpSGreaterThan %bool %63 %int_0
+               OpSelectionMerge %65 None
+               OpBranchConditional %64 %66 %65
+         %66 = OpLabel
+         %67 = OpAccessChain %_ptr_Function_float %A %int_0
+         %68 = OpLoad %float %67
+         %69 = OpAccessChain %_ptr_Function_float %A %int_0
+         %70 = OpLoad %float %69
+         %71 = OpFAdd %float %70 %68
+         %72 = OpAccessChain %_ptr_Function_float %A %int_0
+               OpStore %72 %71
+               OpBranch %65
+         %65 = OpLabel
+               OpBranch %58
+         %58 = OpLabel
+         %73 = OpLoad %int %i
+         %74 = OpIAdd %int %73 %int_1
+               OpStore %i %74
+               OpBranch %56
+         %57 = OpLabel
+               OpBranch %75
+         %75 = OpLabel
+               OpLoopMerge %76 %77 None
+               OpBranch %78
+         %78 = OpLabel
+         %79 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_0
+         %80 = OpLoad %uint %79
+         %81 = OpULessThan %bool %80 %uint_100
+               OpSelectionMerge %82 None
+               OpBranchConditional %81 %83 %84
+         %83 = OpLabel
+               OpStore %value %40
+               OpStore %m %int_0
+               OpBranch %85
+         %85 = OpLabel
+               OpLoopMerge %86 %87 None
+               OpBranch %88
+         %88 = OpLabel
+         %89 = OpLoad %int %m
+         %90 = OpSLessThan %bool %89 %int_1
+               OpBranchConditional %90 %91 %86
+         %91 = OpLabel
+               OpStore %l %int_0
+               OpBranch %92
+         %92 = OpLabel
+               OpLoopMerge %93 %94 None
+               OpBranch %95
+         %95 = OpLabel
+         %96 = OpLoad %int %l
+         %97 = OpSLessThan %bool %96 %int_1
+               OpBranchConditional %97 %98 %93
+         %98 = OpLabel
+         %99 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+        %100 = OpLoad %float %99
+        %101 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+        %102 = OpLoad %float %101
+        %103 = OpFOrdGreaterThan %bool %100 %102
+               OpSelectionMerge %104 None
+               OpBranchConditional %103 %105 %104
+        %105 = OpLabel
+               OpReturn
+        %104 = OpLabel
+               OpBranch %94
+         %94 = OpLabel
+        %106 = OpLoad %int %l
+        %107 = OpIAdd %int %106 %int_1
+               OpStore %l %107
+               OpBranch %92
+         %93 = OpLabel
+               OpBranch %87
+         %87 = OpLabel
+        %108 = OpLoad %int %m
+        %109 = OpIAdd %int %108 %int_1
+               OpStore %m %109
+               OpBranch %85
+         %86 = OpLabel
+               OpStore %n %int_0
+               OpBranch %110
+        %110 = OpLabel
+               OpLoopMerge %111 %112 None
+               OpBranch %113
+        %113 = OpLabel
+        %114 = OpLoad %int %n
+        %115 = OpSLessThan %bool %114 %int_1
+               OpBranchConditional %115 %116 %111
+        %116 = OpLabel
+        %117 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+        %118 = OpLoad %float %117
+        %119 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+        %120 = OpLoad %float %119
+        %121 = OpFOrdGreaterThan %bool %118 %120
+               OpSelectionMerge %122 None
+               OpBranchConditional %121 %123 %122
+        %123 = OpLabel
+               OpControlBarrier %uint_2 %uint_2 %uint_264
+               OpBranch %122
+        %122 = OpLabel
+               OpBranch %112
+        %112 = OpLabel
+        %124 = OpLoad %int %n
+        %125 = OpIAdd %int %124 %int_1
+               OpStore %n %125
+               OpBranch %110
+        %111 = OpLabel
+               OpBranch %82
+         %84 = OpLabel
+        %126 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_0
+        %127 = OpLoad %uint %126
+        %128 = OpULessThan %bool %127 %uint_120
+               OpSelectionMerge %129 None
+               OpBranchConditional %128 %130 %131
+        %130 = OpLabel
+        %132 = OpAccessChain %_ptr_Function_float %A %int_0
+        %133 = OpLoad %float %132
+        %134 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %uint_0
+        %135 = OpLoad %float %134
+        %136 = OpFDiv %float %133 %135
+        %137 = OpAccessChain %_ptr_Function_float %A %int_0
+        %138 = OpLoad %float %137
+        %139 = OpAccessChain %_ptr_Uniform_float %__0 %int_0 %uint_1
+        %140 = OpLoad %float %139
+        %141 = OpFDiv %float %138 %140
+        %142 = OpCompositeConstruct %v4float %136 %141 %float_0 %float_1
+               OpStore %value %142
+               OpBranch %129
+        %131 = OpLabel
+        %143 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+        %144 = OpLoad %float %143
+        %145 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+        %146 = OpLoad %float %145
+        %147 = OpFOrdGreaterThan %bool %144 %146
+               OpSelectionMerge %148 None
+               OpBranchConditional %147 %149 %148
+        %149 = OpLabel
+               OpBranch %77
+        %148 = OpLabel
+               OpBranch %129
+        %129 = OpLabel
+               OpBranch %82
+         %82 = OpLabel
+               OpBranch %77
+         %77 = OpLabel
+               OpBranchConditional %false %75 %76
+         %76 = OpLabel
+        %150 = OpAccessChain %_ptr_Function_float %value %uint_0
+        %151 = OpLoad %float %150
+        %152 = OpConvertFToS %int %151
+        %153 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_0
+               OpStore %153 %152
+        %154 = OpAccessChain %_ptr_Function_float %value %uint_1
+        %155 = OpLoad %float %154
+        %156 = OpConvertFToS %int %155
+        %157 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_1
+               OpStore %157 %156
+        %158 = OpAccessChain %_ptr_Function_float %value %uint_2
+        %159 = OpLoad %float %158
+        %160 = OpConvertFToS %int %159
+        %161 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_2
+               OpStore %161 %160
+        %162 = OpAccessChain %_ptr_Function_float %value %uint_3
+        %163 = OpLoad %float %162
+        %164 = OpConvertFToS %int %163
+        %165 = OpAccessChain %_ptr_Uniform_int %__1 %int_0 %int_3
+               OpStore %165 %164
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-barrier-in-loops/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/unreachable-barrier-in-loops/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..47ae9f1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-barrier-in-loops/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,107 @@
+static uint3 gl_GlobalInvocationID = uint3(0u, 0u, 0u);
+cbuffer cbuffer_x_10 : register(b1, space0) {
+  uint4 x_10[1];
+};
+cbuffer cbuffer_x_13 : register(b2, space0) {
+  uint4 x_13[1];
+};
+RWByteAddressBuffer x_15 : register(u0, space0);
+
+void main_1() {
+  float A[1] = (float[1])0;
+  int i = 0;
+  float4 value = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int m = 0;
+  int l = 0;
+  int n = 0;
+  A[0] = 0.0f;
+  i = 0;
+  {
+    for(; (i < 50); i = (i + 1)) {
+      if ((i > 0)) {
+        const float x_68 = A[0];
+        const float x_70 = A[0];
+        A[0] = (x_70 + x_68);
+      }
+    }
+  }
+  while (true) {
+    const uint x_80 = gl_GlobalInvocationID.x;
+    if ((x_80 < 100u)) {
+      value = float4(0.0f, 0.0f, 0.0f, 1.0f);
+      m = 0;
+      {
+        for(; (m < 1); m = (m + 1)) {
+          l = 0;
+          {
+            for(; (l < 1); l = (l + 1)) {
+              const float x_100 = asfloat(x_10[0].x);
+              const float x_102 = asfloat(x_10[0].y);
+              if ((x_100 > x_102)) {
+                return;
+              }
+            }
+          }
+        }
+      }
+      n = 0;
+      {
+        for(; (n < 1); n = (n + 1)) {
+          const float x_118 = asfloat(x_10[0].x);
+          const float x_120 = asfloat(x_10[0].y);
+          if ((x_118 > x_120)) {
+            GroupMemoryBarrierWithGroupSync();
+          }
+        }
+      }
+    } else {
+      const uint x_127 = gl_GlobalInvocationID.x;
+      if ((x_127 < 120u)) {
+        const float x_133 = A[0];
+        const float x_135 = asfloat(x_13[0].x);
+        const float x_138 = A[0];
+        const float x_140 = asfloat(x_13[0].y);
+        value = float4((x_133 / x_135), (x_138 / x_140), 0.0f, 1.0f);
+      } else {
+        const float x_144 = asfloat(x_10[0].x);
+        const float x_146 = asfloat(x_10[0].y);
+        if ((x_144 > x_146)) {
+          {
+            if (false) {
+            } else {
+              break;
+            }
+          }
+          continue;
+        }
+      }
+    }
+    {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  const float x_151 = value.x;
+  x_15.Store((4u * uint(0)), asuint(int(x_151)));
+  const float x_155 = value.y;
+  x_15.Store(4u, asuint(int(x_155)));
+  const float x_159 = value.z;
+  x_15.Store(8u, asuint(int(x_159)));
+  const float x_163 = value.w;
+  x_15.Store(12u, asuint(int(x_163)));
+  return;
+}
+
+struct tint_symbol_1 {
+  uint3 gl_GlobalInvocationID_param : SV_DispatchThreadID;
+};
+
+[numthreads(1, 1, 1)]
+void main(tint_symbol_1 tint_symbol) {
+  const uint3 gl_GlobalInvocationID_param = tint_symbol.gl_GlobalInvocationID_param;
+  gl_GlobalInvocationID = gl_GlobalInvocationID_param;
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-barrier-in-loops/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/unreachable-barrier-in-loops/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..a4f03c0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-barrier-in-loops/0-opt.spvasm.expected.msl
@@ -0,0 +1,139 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf1 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct buf2 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct doesNotMatter {
+  /* 0x0000 */ int x_compute_data[1];
+};
+struct tint_array_wrapper {
+  float arr[1];
+};
+
+void main_1(constant buf1& x_10, constant buf2& x_13, device doesNotMatter& x_15, thread uint3* const tint_symbol_2) {
+  tint_array_wrapper A = {};
+  int i = 0;
+  float4 value = 0.0f;
+  int m = 0;
+  int l = 0;
+  int n = 0;
+  A.arr[0] = 0.0f;
+  i = 0;
+  while (true) {
+    int const x_60 = i;
+    if ((x_60 < 50)) {
+    } else {
+      break;
+    }
+    int const x_63 = i;
+    if ((x_63 > 0)) {
+      float const x_68 = A.arr[0];
+      float const x_70 = A.arr[0];
+      A.arr[0] = (x_70 + x_68);
+    }
+    {
+      int const x_73 = i;
+      i = (x_73 + 1);
+    }
+  }
+  while (true) {
+    uint const x_80 = (*(tint_symbol_2)).x;
+    if ((x_80 < 100u)) {
+      value = float4(0.0f, 0.0f, 0.0f, 1.0f);
+      m = 0;
+      while (true) {
+        int const x_89 = m;
+        if ((x_89 < 1)) {
+        } else {
+          break;
+        }
+        l = 0;
+        while (true) {
+          int const x_96 = l;
+          if ((x_96 < 1)) {
+          } else {
+            break;
+          }
+          float const x_100 = x_10.injectionSwitch.x;
+          float const x_102 = x_10.injectionSwitch.y;
+          if ((x_100 > x_102)) {
+            return;
+          }
+          {
+            int const x_106 = l;
+            l = (x_106 + 1);
+          }
+        }
+        {
+          int const x_108 = m;
+          m = (x_108 + 1);
+        }
+      }
+      n = 0;
+      while (true) {
+        int const x_114 = n;
+        if ((x_114 < 1)) {
+        } else {
+          break;
+        }
+        float const x_118 = x_10.injectionSwitch.x;
+        float const x_120 = x_10.injectionSwitch.y;
+        if ((x_118 > x_120)) {
+          threadgroup_barrier(mem_flags::mem_threadgroup);
+        }
+        {
+          int const x_124 = n;
+          n = (x_124 + 1);
+        }
+      }
+    } else {
+      uint const x_127 = (*(tint_symbol_2)).x;
+      if ((x_127 < 120u)) {
+        float const x_133 = A.arr[0];
+        float const x_135 = x_13.resolution.x;
+        float const x_138 = A.arr[0];
+        float const x_140 = x_13.resolution.y;
+        value = float4((x_133 / x_135), (x_138 / x_140), 0.0f, 1.0f);
+      } else {
+        float const x_144 = x_10.injectionSwitch.x;
+        float const x_146 = x_10.injectionSwitch.y;
+        if ((x_144 > x_146)) {
+          {
+            if (false) {
+            } else {
+              break;
+            }
+          }
+          continue;
+        }
+      }
+    }
+    {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  float const x_151 = value.x;
+  x_15.x_compute_data[0] = int(x_151);
+  float const x_155 = value.y;
+  x_15.x_compute_data[1] = int(x_155);
+  float const x_159 = value.z;
+  x_15.x_compute_data[2] = int(x_159);
+  float const x_163 = value.w;
+  x_15.x_compute_data[3] = int(x_163);
+  return;
+}
+
+kernel void tint_symbol(uint3 gl_GlobalInvocationID_param [[thread_position_in_grid]], constant buf1& x_10 [[buffer(1)]], constant buf2& x_13 [[buffer(2)]], device doesNotMatter& x_15 [[buffer(0)]]) {
+  thread uint3 tint_symbol_3 = 0u;
+  tint_symbol_3 = gl_GlobalInvocationID_param;
+  main_1(x_10, x_13, x_15, &(tint_symbol_3));
+  return;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-barrier-in-loops/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/unreachable-barrier-in-loops/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..553aab9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-barrier-in-loops/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,322 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 187
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main" %tint_symbol
+               OpExecutionMode %main LocalSize 1 1 1
+               OpName %gl_GlobalInvocationID "gl_GlobalInvocationID"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "injectionSwitch"
+               OpName %x_10 "x_10"
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "resolution"
+               OpName %x_13 "x_13"
+               OpName %doesNotMatter "doesNotMatter"
+               OpMemberName %doesNotMatter 0 "x_compute_data"
+               OpName %x_15 "x_15"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main_1 "main_1"
+               OpName %A "A"
+               OpName %i "i"
+               OpName %value "value"
+               OpName %m "m"
+               OpName %l "l"
+               OpName %n "n"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 1
+               OpDecorate %buf2 Block
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %x_13 NonWritable
+               OpDecorate %x_13 DescriptorSet 0
+               OpDecorate %x_13 Binding 2
+               OpDecorate %doesNotMatter Block
+               OpMemberDecorate %doesNotMatter 0 Offset 0
+               OpDecorate %_runtimearr_int ArrayStride 4
+               OpDecorate %x_15 DescriptorSet 0
+               OpDecorate %x_15 Binding 0
+               OpDecorate %tint_symbol BuiltIn GlobalInvocationId
+               OpDecorate %_arr_float_uint_1 ArrayStride 4
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Private_v3uint = OpTypePointer Private %v3uint
+          %5 = OpConstantNull %v3uint
+%gl_GlobalInvocationID = OpVariable %_ptr_Private_v3uint Private %5
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_10 = OpVariable %_ptr_Uniform_buf1 Uniform
+       %buf2 = OpTypeStruct %v2float
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+       %x_13 = OpVariable %_ptr_Uniform_buf2 Uniform
+        %int = OpTypeInt 32 1
+%_runtimearr_int = OpTypeRuntimeArray %int
+%doesNotMatter = OpTypeStruct %_runtimearr_int
+%_ptr_StorageBuffer_doesNotMatter = OpTypePointer StorageBuffer %doesNotMatter
+       %x_15 = OpVariable %_ptr_StorageBuffer_doesNotMatter StorageBuffer
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%tint_symbol = OpVariable %_ptr_Input_v3uint Input
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%_ptr_Function__arr_float_uint_1 = OpTypePointer Function %_arr_float_uint_1
+         %29 = OpConstantNull %_arr_float_uint_1
+%_ptr_Function_int = OpTypePointer Function %int
+         %32 = OpConstantNull %int
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+         %36 = OpConstantNull %v4float
+      %int_0 = OpConstant %int 0
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_0 = OpConstant %float 0
+     %int_50 = OpConstant %int 50
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_uint = OpTypePointer Private %uint
+   %uint_100 = OpConstant %uint 100
+    %float_1 = OpConstant %float 1
+         %82 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_2 = OpConstant %uint 2
+   %uint_264 = OpConstant %uint 264
+   %uint_120 = OpConstant %uint 120
+      %false = OpConstantFalse %bool
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+      %int_2 = OpConstant %int 2
+     %uint_3 = OpConstant %uint 3
+      %int_3 = OpConstant %int 3
+     %main_1 = OpFunction %void None %21
+         %24 = OpLabel
+          %A = OpVariable %_ptr_Function__arr_float_uint_1 Function %29
+          %i = OpVariable %_ptr_Function_int Function %32
+      %value = OpVariable %_ptr_Function_v4float Function %36
+          %m = OpVariable %_ptr_Function_int Function %32
+          %l = OpVariable %_ptr_Function_int Function %32
+          %n = OpVariable %_ptr_Function_int Function %32
+         %42 = OpAccessChain %_ptr_Function_float %A %int_0
+               OpStore %42 %float_0
+               OpStore %i %int_0
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %48 = OpLoad %int %i
+         %50 = OpSLessThan %bool %48 %int_50
+               OpSelectionMerge %52 None
+               OpBranchConditional %50 %53 %54
+         %53 = OpLabel
+               OpBranch %52
+         %54 = OpLabel
+               OpBranch %45
+         %52 = OpLabel
+         %55 = OpLoad %int %i
+         %56 = OpSGreaterThan %bool %55 %int_0
+               OpSelectionMerge %57 None
+               OpBranchConditional %56 %58 %57
+         %58 = OpLabel
+         %59 = OpAccessChain %_ptr_Function_float %A %int_0
+         %60 = OpLoad %float %59
+         %61 = OpAccessChain %_ptr_Function_float %A %int_0
+         %62 = OpLoad %float %61
+         %63 = OpAccessChain %_ptr_Function_float %A %int_0
+         %64 = OpFAdd %float %62 %60
+               OpStore %63 %64
+               OpBranch %57
+         %57 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+         %65 = OpLoad %int %i
+         %67 = OpIAdd %int %65 %int_1
+               OpStore %i %67
+               OpBranch %44
+         %45 = OpLabel
+               OpBranch %68
+         %68 = OpLabel
+               OpLoopMerge %69 %70 None
+               OpBranch %71
+         %71 = OpLabel
+         %74 = OpAccessChain %_ptr_Private_uint %gl_GlobalInvocationID %uint_0
+         %75 = OpLoad %uint %74
+         %77 = OpULessThan %bool %75 %uint_100
+               OpSelectionMerge %78 None
+               OpBranchConditional %77 %79 %80
+         %79 = OpLabel
+               OpStore %value %82
+               OpStore %m %int_0
+               OpBranch %83
+         %83 = OpLabel
+               OpLoopMerge %84 %85 None
+               OpBranch %86
+         %86 = OpLabel
+         %87 = OpLoad %int %m
+         %88 = OpSLessThan %bool %87 %int_1
+               OpSelectionMerge %89 None
+               OpBranchConditional %88 %90 %91
+         %90 = OpLabel
+               OpBranch %89
+         %91 = OpLabel
+               OpBranch %84
+         %89 = OpLabel
+               OpStore %l %int_0
+               OpBranch %92
+         %92 = OpLabel
+               OpLoopMerge %93 %94 None
+               OpBranch %95
+         %95 = OpLabel
+         %96 = OpLoad %int %l
+         %97 = OpSLessThan %bool %96 %int_1
+               OpSelectionMerge %98 None
+               OpBranchConditional %97 %99 %100
+         %99 = OpLabel
+               OpBranch %98
+        %100 = OpLabel
+               OpBranch %93
+         %98 = OpLabel
+        %102 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %uint_0
+        %103 = OpLoad %float %102
+        %104 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %uint_1
+        %105 = OpLoad %float %104
+        %106 = OpFOrdGreaterThan %bool %103 %105
+               OpSelectionMerge %107 None
+               OpBranchConditional %106 %108 %107
+        %108 = OpLabel
+               OpReturn
+        %107 = OpLabel
+               OpBranch %94
+         %94 = OpLabel
+        %109 = OpLoad %int %l
+        %110 = OpIAdd %int %109 %int_1
+               OpStore %l %110
+               OpBranch %92
+         %93 = OpLabel
+               OpBranch %85
+         %85 = OpLabel
+        %111 = OpLoad %int %m
+        %112 = OpIAdd %int %111 %int_1
+               OpStore %m %112
+               OpBranch %83
+         %84 = OpLabel
+               OpStore %n %int_0
+               OpBranch %113
+        %113 = OpLabel
+               OpLoopMerge %114 %115 None
+               OpBranch %116
+        %116 = OpLabel
+        %117 = OpLoad %int %n
+        %118 = OpSLessThan %bool %117 %int_1
+               OpSelectionMerge %119 None
+               OpBranchConditional %118 %120 %121
+        %120 = OpLabel
+               OpBranch %119
+        %121 = OpLabel
+               OpBranch %114
+        %119 = OpLabel
+        %122 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %uint_0
+        %123 = OpLoad %float %122
+        %124 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %uint_1
+        %125 = OpLoad %float %124
+        %126 = OpFOrdGreaterThan %bool %123 %125
+               OpSelectionMerge %127 None
+               OpBranchConditional %126 %128 %127
+        %128 = OpLabel
+               OpControlBarrier %uint_2 %uint_2 %uint_264
+               OpBranch %127
+        %127 = OpLabel
+               OpBranch %115
+        %115 = OpLabel
+        %132 = OpLoad %int %n
+        %133 = OpIAdd %int %132 %int_1
+               OpStore %n %133
+               OpBranch %113
+        %114 = OpLabel
+               OpBranch %78
+         %80 = OpLabel
+        %134 = OpAccessChain %_ptr_Private_uint %gl_GlobalInvocationID %uint_0
+        %135 = OpLoad %uint %134
+        %137 = OpULessThan %bool %135 %uint_120
+               OpSelectionMerge %138 None
+               OpBranchConditional %137 %139 %140
+        %139 = OpLabel
+        %141 = OpAccessChain %_ptr_Function_float %A %int_0
+        %142 = OpLoad %float %141
+        %143 = OpAccessChain %_ptr_Uniform_float %x_13 %uint_0 %uint_0
+        %144 = OpLoad %float %143
+        %145 = OpAccessChain %_ptr_Function_float %A %int_0
+        %146 = OpLoad %float %145
+        %147 = OpAccessChain %_ptr_Uniform_float %x_13 %uint_0 %uint_1
+        %148 = OpLoad %float %147
+        %149 = OpFDiv %float %142 %144
+        %150 = OpFDiv %float %146 %148
+        %151 = OpCompositeConstruct %v4float %149 %150 %float_0 %float_1
+               OpStore %value %151
+               OpBranch %138
+        %140 = OpLabel
+        %152 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %uint_0
+        %153 = OpLoad %float %152
+        %154 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %uint_1
+        %155 = OpLoad %float %154
+        %156 = OpFOrdGreaterThan %bool %153 %155
+               OpSelectionMerge %157 None
+               OpBranchConditional %156 %158 %157
+        %158 = OpLabel
+               OpBranch %70
+        %157 = OpLabel
+               OpBranch %138
+        %138 = OpLabel
+               OpBranch %78
+         %78 = OpLabel
+               OpBranch %70
+         %70 = OpLabel
+               OpSelectionMerge %160 None
+               OpBranchConditional %false %161 %162
+        %161 = OpLabel
+               OpBranch %160
+        %162 = OpLabel
+               OpBranch %69
+        %160 = OpLabel
+               OpBranch %68
+         %69 = OpLabel
+        %163 = OpAccessChain %_ptr_Function_float %value %uint_0
+        %164 = OpLoad %float %163
+        %166 = OpAccessChain %_ptr_StorageBuffer_int %x_15 %uint_0 %int_0
+        %167 = OpConvertFToS %int %164
+               OpStore %166 %167
+        %168 = OpAccessChain %_ptr_Function_float %value %uint_1
+        %169 = OpLoad %float %168
+        %170 = OpAccessChain %_ptr_StorageBuffer_int %x_15 %uint_0 %int_1
+        %171 = OpConvertFToS %int %169
+               OpStore %170 %171
+        %172 = OpAccessChain %_ptr_Function_float %value %uint_2
+        %173 = OpLoad %float %172
+        %175 = OpAccessChain %_ptr_StorageBuffer_int %x_15 %uint_0 %int_2
+        %176 = OpConvertFToS %int %173
+               OpStore %175 %176
+        %178 = OpAccessChain %_ptr_Function_float %value %uint_3
+        %179 = OpLoad %float %178
+        %181 = OpAccessChain %_ptr_StorageBuffer_int %x_15 %uint_0 %int_3
+        %182 = OpConvertFToS %int %179
+               OpStore %181 %182
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %21
+        %184 = OpLabel
+        %185 = OpLoad %v3uint %tint_symbol
+               OpStore %gl_GlobalInvocationID %185
+        %186 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 70[%70] is not post dominated by the back-edge block 160[%160]
+  %160 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-barrier-in-loops/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/unreachable-barrier-in-loops/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..2b4eb0e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-barrier-in-loops/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,145 @@
+[[block]]
+struct buf1 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[block]]
+struct buf2 {
+  resolution : vec2<f32>;
+};
+
+type RTArr = [[stride(4)]] array<i32>;
+
+[[block]]
+struct doesNotMatter {
+  x_compute_data : RTArr;
+};
+
+var<private> gl_GlobalInvocationID : vec3<u32>;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+[[group(0), binding(2)]] var<uniform> x_13 : buf2;
+
+[[group(0), binding(0)]] var<storage, read_write> x_15 : doesNotMatter;
+
+fn main_1() {
+  var A : array<f32, 1>;
+  var i : i32;
+  var value : vec4<f32>;
+  var m : i32;
+  var l : i32;
+  var n : i32;
+  A[0] = 0.0;
+  i = 0;
+  loop {
+    let x_60 : i32 = i;
+    if ((x_60 < 50)) {
+    } else {
+      break;
+    }
+    let x_63 : i32 = i;
+    if ((x_63 > 0)) {
+      let x_68 : f32 = A[0];
+      let x_70 : f32 = A[0];
+      A[0] = (x_70 + x_68);
+    }
+
+    continuing {
+      let x_73 : i32 = i;
+      i = (x_73 + 1);
+    }
+  }
+  loop {
+    let x_80 : u32 = gl_GlobalInvocationID.x;
+    if ((x_80 < 100u)) {
+      value = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+      m = 0;
+      loop {
+        let x_89 : i32 = m;
+        if ((x_89 < 1)) {
+        } else {
+          break;
+        }
+        l = 0;
+        loop {
+          let x_96 : i32 = l;
+          if ((x_96 < 1)) {
+          } else {
+            break;
+          }
+          let x_100 : f32 = x_10.injectionSwitch.x;
+          let x_102 : f32 = x_10.injectionSwitch.y;
+          if ((x_100 > x_102)) {
+            return;
+          }
+
+          continuing {
+            let x_106 : i32 = l;
+            l = (x_106 + 1);
+          }
+        }
+
+        continuing {
+          let x_108 : i32 = m;
+          m = (x_108 + 1);
+        }
+      }
+      n = 0;
+      loop {
+        let x_114 : i32 = n;
+        if ((x_114 < 1)) {
+        } else {
+          break;
+        }
+        let x_118 : f32 = x_10.injectionSwitch.x;
+        let x_120 : f32 = x_10.injectionSwitch.y;
+        if ((x_118 > x_120)) {
+          workgroupBarrier();
+        }
+
+        continuing {
+          let x_124 : i32 = n;
+          n = (x_124 + 1);
+        }
+      }
+    } else {
+      let x_127 : u32 = gl_GlobalInvocationID.x;
+      if ((x_127 < 120u)) {
+        let x_133 : f32 = A[0];
+        let x_135 : f32 = x_13.resolution.x;
+        let x_138 : f32 = A[0];
+        let x_140 : f32 = x_13.resolution.y;
+        value = vec4<f32>((x_133 / x_135), (x_138 / x_140), 0.0, 1.0);
+      } else {
+        let x_144 : f32 = x_10.injectionSwitch.x;
+        let x_146 : f32 = x_10.injectionSwitch.y;
+        if ((x_144 > x_146)) {
+          continue;
+        }
+      }
+    }
+
+    continuing {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_151 : f32 = value.x;
+  x_15.x_compute_data[0] = i32(x_151);
+  let x_155 : f32 = value.y;
+  x_15.x_compute_data[1] = i32(x_155);
+  let x_159 : f32 = value.z;
+  x_15.x_compute_data[2] = i32(x_159);
+  let x_163 : f32 = value.w;
+  x_15.x_compute_data[3] = i32(x_163);
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main([[builtin(global_invocation_id)]] gl_GlobalInvocationID_param : vec3<u32>) {
+  gl_GlobalInvocationID = gl_GlobalInvocationID_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-barrier-in-loops/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/unreachable-barrier-in-loops/0-opt.wgsl
new file mode 100644
index 0000000..2b4eb0e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-barrier-in-loops/0-opt.wgsl
@@ -0,0 +1,145 @@
+[[block]]
+struct buf1 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[block]]
+struct buf2 {
+  resolution : vec2<f32>;
+};
+
+type RTArr = [[stride(4)]] array<i32>;
+
+[[block]]
+struct doesNotMatter {
+  x_compute_data : RTArr;
+};
+
+var<private> gl_GlobalInvocationID : vec3<u32>;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+[[group(0), binding(2)]] var<uniform> x_13 : buf2;
+
+[[group(0), binding(0)]] var<storage, read_write> x_15 : doesNotMatter;
+
+fn main_1() {
+  var A : array<f32, 1>;
+  var i : i32;
+  var value : vec4<f32>;
+  var m : i32;
+  var l : i32;
+  var n : i32;
+  A[0] = 0.0;
+  i = 0;
+  loop {
+    let x_60 : i32 = i;
+    if ((x_60 < 50)) {
+    } else {
+      break;
+    }
+    let x_63 : i32 = i;
+    if ((x_63 > 0)) {
+      let x_68 : f32 = A[0];
+      let x_70 : f32 = A[0];
+      A[0] = (x_70 + x_68);
+    }
+
+    continuing {
+      let x_73 : i32 = i;
+      i = (x_73 + 1);
+    }
+  }
+  loop {
+    let x_80 : u32 = gl_GlobalInvocationID.x;
+    if ((x_80 < 100u)) {
+      value = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+      m = 0;
+      loop {
+        let x_89 : i32 = m;
+        if ((x_89 < 1)) {
+        } else {
+          break;
+        }
+        l = 0;
+        loop {
+          let x_96 : i32 = l;
+          if ((x_96 < 1)) {
+          } else {
+            break;
+          }
+          let x_100 : f32 = x_10.injectionSwitch.x;
+          let x_102 : f32 = x_10.injectionSwitch.y;
+          if ((x_100 > x_102)) {
+            return;
+          }
+
+          continuing {
+            let x_106 : i32 = l;
+            l = (x_106 + 1);
+          }
+        }
+
+        continuing {
+          let x_108 : i32 = m;
+          m = (x_108 + 1);
+        }
+      }
+      n = 0;
+      loop {
+        let x_114 : i32 = n;
+        if ((x_114 < 1)) {
+        } else {
+          break;
+        }
+        let x_118 : f32 = x_10.injectionSwitch.x;
+        let x_120 : f32 = x_10.injectionSwitch.y;
+        if ((x_118 > x_120)) {
+          workgroupBarrier();
+        }
+
+        continuing {
+          let x_124 : i32 = n;
+          n = (x_124 + 1);
+        }
+      }
+    } else {
+      let x_127 : u32 = gl_GlobalInvocationID.x;
+      if ((x_127 < 120u)) {
+        let x_133 : f32 = A[0];
+        let x_135 : f32 = x_13.resolution.x;
+        let x_138 : f32 = A[0];
+        let x_140 : f32 = x_13.resolution.y;
+        value = vec4<f32>((x_133 / x_135), (x_138 / x_140), 0.0, 1.0);
+      } else {
+        let x_144 : f32 = x_10.injectionSwitch.x;
+        let x_146 : f32 = x_10.injectionSwitch.y;
+        if ((x_144 > x_146)) {
+          continue;
+        }
+      }
+    }
+
+    continuing {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_151 : f32 = value.x;
+  x_15.x_compute_data[0] = i32(x_151);
+  let x_155 : f32 = value.y;
+  x_15.x_compute_data[1] = i32(x_155);
+  let x_159 : f32 = value.z;
+  x_15.x_compute_data[2] = i32(x_159);
+  let x_163 : f32 = value.w;
+  x_15.x_compute_data[3] = i32(x_163);
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main([[builtin(global_invocation_id)]] gl_GlobalInvocationID_param : vec3<u32>) {
+  gl_GlobalInvocationID = gl_GlobalInvocationID_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-barrier-in-loops/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/unreachable-barrier-in-loops/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..47ae9f1
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-barrier-in-loops/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,107 @@
+static uint3 gl_GlobalInvocationID = uint3(0u, 0u, 0u);
+cbuffer cbuffer_x_10 : register(b1, space0) {
+  uint4 x_10[1];
+};
+cbuffer cbuffer_x_13 : register(b2, space0) {
+  uint4 x_13[1];
+};
+RWByteAddressBuffer x_15 : register(u0, space0);
+
+void main_1() {
+  float A[1] = (float[1])0;
+  int i = 0;
+  float4 value = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  int m = 0;
+  int l = 0;
+  int n = 0;
+  A[0] = 0.0f;
+  i = 0;
+  {
+    for(; (i < 50); i = (i + 1)) {
+      if ((i > 0)) {
+        const float x_68 = A[0];
+        const float x_70 = A[0];
+        A[0] = (x_70 + x_68);
+      }
+    }
+  }
+  while (true) {
+    const uint x_80 = gl_GlobalInvocationID.x;
+    if ((x_80 < 100u)) {
+      value = float4(0.0f, 0.0f, 0.0f, 1.0f);
+      m = 0;
+      {
+        for(; (m < 1); m = (m + 1)) {
+          l = 0;
+          {
+            for(; (l < 1); l = (l + 1)) {
+              const float x_100 = asfloat(x_10[0].x);
+              const float x_102 = asfloat(x_10[0].y);
+              if ((x_100 > x_102)) {
+                return;
+              }
+            }
+          }
+        }
+      }
+      n = 0;
+      {
+        for(; (n < 1); n = (n + 1)) {
+          const float x_118 = asfloat(x_10[0].x);
+          const float x_120 = asfloat(x_10[0].y);
+          if ((x_118 > x_120)) {
+            GroupMemoryBarrierWithGroupSync();
+          }
+        }
+      }
+    } else {
+      const uint x_127 = gl_GlobalInvocationID.x;
+      if ((x_127 < 120u)) {
+        const float x_133 = A[0];
+        const float x_135 = asfloat(x_13[0].x);
+        const float x_138 = A[0];
+        const float x_140 = asfloat(x_13[0].y);
+        value = float4((x_133 / x_135), (x_138 / x_140), 0.0f, 1.0f);
+      } else {
+        const float x_144 = asfloat(x_10[0].x);
+        const float x_146 = asfloat(x_10[0].y);
+        if ((x_144 > x_146)) {
+          {
+            if (false) {
+            } else {
+              break;
+            }
+          }
+          continue;
+        }
+      }
+    }
+    {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  const float x_151 = value.x;
+  x_15.Store((4u * uint(0)), asuint(int(x_151)));
+  const float x_155 = value.y;
+  x_15.Store(4u, asuint(int(x_155)));
+  const float x_159 = value.z;
+  x_15.Store(8u, asuint(int(x_159)));
+  const float x_163 = value.w;
+  x_15.Store(12u, asuint(int(x_163)));
+  return;
+}
+
+struct tint_symbol_1 {
+  uint3 gl_GlobalInvocationID_param : SV_DispatchThreadID;
+};
+
+[numthreads(1, 1, 1)]
+void main(tint_symbol_1 tint_symbol) {
+  const uint3 gl_GlobalInvocationID_param = tint_symbol.gl_GlobalInvocationID_param;
+  gl_GlobalInvocationID = gl_GlobalInvocationID_param;
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-barrier-in-loops/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/unreachable-barrier-in-loops/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..a4f03c0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-barrier-in-loops/0-opt.wgsl.expected.msl
@@ -0,0 +1,139 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf1 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct buf2 {
+  /* 0x0000 */ packed_float2 resolution;
+};
+struct doesNotMatter {
+  /* 0x0000 */ int x_compute_data[1];
+};
+struct tint_array_wrapper {
+  float arr[1];
+};
+
+void main_1(constant buf1& x_10, constant buf2& x_13, device doesNotMatter& x_15, thread uint3* const tint_symbol_2) {
+  tint_array_wrapper A = {};
+  int i = 0;
+  float4 value = 0.0f;
+  int m = 0;
+  int l = 0;
+  int n = 0;
+  A.arr[0] = 0.0f;
+  i = 0;
+  while (true) {
+    int const x_60 = i;
+    if ((x_60 < 50)) {
+    } else {
+      break;
+    }
+    int const x_63 = i;
+    if ((x_63 > 0)) {
+      float const x_68 = A.arr[0];
+      float const x_70 = A.arr[0];
+      A.arr[0] = (x_70 + x_68);
+    }
+    {
+      int const x_73 = i;
+      i = (x_73 + 1);
+    }
+  }
+  while (true) {
+    uint const x_80 = (*(tint_symbol_2)).x;
+    if ((x_80 < 100u)) {
+      value = float4(0.0f, 0.0f, 0.0f, 1.0f);
+      m = 0;
+      while (true) {
+        int const x_89 = m;
+        if ((x_89 < 1)) {
+        } else {
+          break;
+        }
+        l = 0;
+        while (true) {
+          int const x_96 = l;
+          if ((x_96 < 1)) {
+          } else {
+            break;
+          }
+          float const x_100 = x_10.injectionSwitch.x;
+          float const x_102 = x_10.injectionSwitch.y;
+          if ((x_100 > x_102)) {
+            return;
+          }
+          {
+            int const x_106 = l;
+            l = (x_106 + 1);
+          }
+        }
+        {
+          int const x_108 = m;
+          m = (x_108 + 1);
+        }
+      }
+      n = 0;
+      while (true) {
+        int const x_114 = n;
+        if ((x_114 < 1)) {
+        } else {
+          break;
+        }
+        float const x_118 = x_10.injectionSwitch.x;
+        float const x_120 = x_10.injectionSwitch.y;
+        if ((x_118 > x_120)) {
+          threadgroup_barrier(mem_flags::mem_threadgroup);
+        }
+        {
+          int const x_124 = n;
+          n = (x_124 + 1);
+        }
+      }
+    } else {
+      uint const x_127 = (*(tint_symbol_2)).x;
+      if ((x_127 < 120u)) {
+        float const x_133 = A.arr[0];
+        float const x_135 = x_13.resolution.x;
+        float const x_138 = A.arr[0];
+        float const x_140 = x_13.resolution.y;
+        value = float4((x_133 / x_135), (x_138 / x_140), 0.0f, 1.0f);
+      } else {
+        float const x_144 = x_10.injectionSwitch.x;
+        float const x_146 = x_10.injectionSwitch.y;
+        if ((x_144 > x_146)) {
+          {
+            if (false) {
+            } else {
+              break;
+            }
+          }
+          continue;
+        }
+      }
+    }
+    {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  float const x_151 = value.x;
+  x_15.x_compute_data[0] = int(x_151);
+  float const x_155 = value.y;
+  x_15.x_compute_data[1] = int(x_155);
+  float const x_159 = value.z;
+  x_15.x_compute_data[2] = int(x_159);
+  float const x_163 = value.w;
+  x_15.x_compute_data[3] = int(x_163);
+  return;
+}
+
+kernel void tint_symbol(uint3 gl_GlobalInvocationID_param [[thread_position_in_grid]], constant buf1& x_10 [[buffer(1)]], constant buf2& x_13 [[buffer(2)]], device doesNotMatter& x_15 [[buffer(0)]]) {
+  thread uint3 tint_symbol_3 = 0u;
+  tint_symbol_3 = gl_GlobalInvocationID_param;
+  main_1(x_10, x_13, x_15, &(tint_symbol_3));
+  return;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-barrier-in-loops/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/unreachable-barrier-in-loops/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..553aab9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-barrier-in-loops/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,322 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 187
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main" %tint_symbol
+               OpExecutionMode %main LocalSize 1 1 1
+               OpName %gl_GlobalInvocationID "gl_GlobalInvocationID"
+               OpName %buf1 "buf1"
+               OpMemberName %buf1 0 "injectionSwitch"
+               OpName %x_10 "x_10"
+               OpName %buf2 "buf2"
+               OpMemberName %buf2 0 "resolution"
+               OpName %x_13 "x_13"
+               OpName %doesNotMatter "doesNotMatter"
+               OpMemberName %doesNotMatter 0 "x_compute_data"
+               OpName %x_15 "x_15"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main_1 "main_1"
+               OpName %A "A"
+               OpName %i "i"
+               OpName %value "value"
+               OpName %m "m"
+               OpName %l "l"
+               OpName %n "n"
+               OpName %main "main"
+               OpDecorate %buf1 Block
+               OpMemberDecorate %buf1 0 Offset 0
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 1
+               OpDecorate %buf2 Block
+               OpMemberDecorate %buf2 0 Offset 0
+               OpDecorate %x_13 NonWritable
+               OpDecorate %x_13 DescriptorSet 0
+               OpDecorate %x_13 Binding 2
+               OpDecorate %doesNotMatter Block
+               OpMemberDecorate %doesNotMatter 0 Offset 0
+               OpDecorate %_runtimearr_int ArrayStride 4
+               OpDecorate %x_15 DescriptorSet 0
+               OpDecorate %x_15 Binding 0
+               OpDecorate %tint_symbol BuiltIn GlobalInvocationId
+               OpDecorate %_arr_float_uint_1 ArrayStride 4
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Private_v3uint = OpTypePointer Private %v3uint
+          %5 = OpConstantNull %v3uint
+%gl_GlobalInvocationID = OpVariable %_ptr_Private_v3uint Private %5
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf1 = OpTypeStruct %v2float
+%_ptr_Uniform_buf1 = OpTypePointer Uniform %buf1
+       %x_10 = OpVariable %_ptr_Uniform_buf1 Uniform
+       %buf2 = OpTypeStruct %v2float
+%_ptr_Uniform_buf2 = OpTypePointer Uniform %buf2
+       %x_13 = OpVariable %_ptr_Uniform_buf2 Uniform
+        %int = OpTypeInt 32 1
+%_runtimearr_int = OpTypeRuntimeArray %int
+%doesNotMatter = OpTypeStruct %_runtimearr_int
+%_ptr_StorageBuffer_doesNotMatter = OpTypePointer StorageBuffer %doesNotMatter
+       %x_15 = OpVariable %_ptr_StorageBuffer_doesNotMatter StorageBuffer
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%tint_symbol = OpVariable %_ptr_Input_v3uint Input
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%_ptr_Function__arr_float_uint_1 = OpTypePointer Function %_arr_float_uint_1
+         %29 = OpConstantNull %_arr_float_uint_1
+%_ptr_Function_int = OpTypePointer Function %int
+         %32 = OpConstantNull %int
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+         %36 = OpConstantNull %v4float
+      %int_0 = OpConstant %int 0
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_0 = OpConstant %float 0
+     %int_50 = OpConstant %int 50
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_uint = OpTypePointer Private %uint
+   %uint_100 = OpConstant %uint 100
+    %float_1 = OpConstant %float 1
+         %82 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_2 = OpConstant %uint 2
+   %uint_264 = OpConstant %uint 264
+   %uint_120 = OpConstant %uint 120
+      %false = OpConstantFalse %bool
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+      %int_2 = OpConstant %int 2
+     %uint_3 = OpConstant %uint 3
+      %int_3 = OpConstant %int 3
+     %main_1 = OpFunction %void None %21
+         %24 = OpLabel
+          %A = OpVariable %_ptr_Function__arr_float_uint_1 Function %29
+          %i = OpVariable %_ptr_Function_int Function %32
+      %value = OpVariable %_ptr_Function_v4float Function %36
+          %m = OpVariable %_ptr_Function_int Function %32
+          %l = OpVariable %_ptr_Function_int Function %32
+          %n = OpVariable %_ptr_Function_int Function %32
+         %42 = OpAccessChain %_ptr_Function_float %A %int_0
+               OpStore %42 %float_0
+               OpStore %i %int_0
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+         %48 = OpLoad %int %i
+         %50 = OpSLessThan %bool %48 %int_50
+               OpSelectionMerge %52 None
+               OpBranchConditional %50 %53 %54
+         %53 = OpLabel
+               OpBranch %52
+         %54 = OpLabel
+               OpBranch %45
+         %52 = OpLabel
+         %55 = OpLoad %int %i
+         %56 = OpSGreaterThan %bool %55 %int_0
+               OpSelectionMerge %57 None
+               OpBranchConditional %56 %58 %57
+         %58 = OpLabel
+         %59 = OpAccessChain %_ptr_Function_float %A %int_0
+         %60 = OpLoad %float %59
+         %61 = OpAccessChain %_ptr_Function_float %A %int_0
+         %62 = OpLoad %float %61
+         %63 = OpAccessChain %_ptr_Function_float %A %int_0
+         %64 = OpFAdd %float %62 %60
+               OpStore %63 %64
+               OpBranch %57
+         %57 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+         %65 = OpLoad %int %i
+         %67 = OpIAdd %int %65 %int_1
+               OpStore %i %67
+               OpBranch %44
+         %45 = OpLabel
+               OpBranch %68
+         %68 = OpLabel
+               OpLoopMerge %69 %70 None
+               OpBranch %71
+         %71 = OpLabel
+         %74 = OpAccessChain %_ptr_Private_uint %gl_GlobalInvocationID %uint_0
+         %75 = OpLoad %uint %74
+         %77 = OpULessThan %bool %75 %uint_100
+               OpSelectionMerge %78 None
+               OpBranchConditional %77 %79 %80
+         %79 = OpLabel
+               OpStore %value %82
+               OpStore %m %int_0
+               OpBranch %83
+         %83 = OpLabel
+               OpLoopMerge %84 %85 None
+               OpBranch %86
+         %86 = OpLabel
+         %87 = OpLoad %int %m
+         %88 = OpSLessThan %bool %87 %int_1
+               OpSelectionMerge %89 None
+               OpBranchConditional %88 %90 %91
+         %90 = OpLabel
+               OpBranch %89
+         %91 = OpLabel
+               OpBranch %84
+         %89 = OpLabel
+               OpStore %l %int_0
+               OpBranch %92
+         %92 = OpLabel
+               OpLoopMerge %93 %94 None
+               OpBranch %95
+         %95 = OpLabel
+         %96 = OpLoad %int %l
+         %97 = OpSLessThan %bool %96 %int_1
+               OpSelectionMerge %98 None
+               OpBranchConditional %97 %99 %100
+         %99 = OpLabel
+               OpBranch %98
+        %100 = OpLabel
+               OpBranch %93
+         %98 = OpLabel
+        %102 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %uint_0
+        %103 = OpLoad %float %102
+        %104 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %uint_1
+        %105 = OpLoad %float %104
+        %106 = OpFOrdGreaterThan %bool %103 %105
+               OpSelectionMerge %107 None
+               OpBranchConditional %106 %108 %107
+        %108 = OpLabel
+               OpReturn
+        %107 = OpLabel
+               OpBranch %94
+         %94 = OpLabel
+        %109 = OpLoad %int %l
+        %110 = OpIAdd %int %109 %int_1
+               OpStore %l %110
+               OpBranch %92
+         %93 = OpLabel
+               OpBranch %85
+         %85 = OpLabel
+        %111 = OpLoad %int %m
+        %112 = OpIAdd %int %111 %int_1
+               OpStore %m %112
+               OpBranch %83
+         %84 = OpLabel
+               OpStore %n %int_0
+               OpBranch %113
+        %113 = OpLabel
+               OpLoopMerge %114 %115 None
+               OpBranch %116
+        %116 = OpLabel
+        %117 = OpLoad %int %n
+        %118 = OpSLessThan %bool %117 %int_1
+               OpSelectionMerge %119 None
+               OpBranchConditional %118 %120 %121
+        %120 = OpLabel
+               OpBranch %119
+        %121 = OpLabel
+               OpBranch %114
+        %119 = OpLabel
+        %122 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %uint_0
+        %123 = OpLoad %float %122
+        %124 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %uint_1
+        %125 = OpLoad %float %124
+        %126 = OpFOrdGreaterThan %bool %123 %125
+               OpSelectionMerge %127 None
+               OpBranchConditional %126 %128 %127
+        %128 = OpLabel
+               OpControlBarrier %uint_2 %uint_2 %uint_264
+               OpBranch %127
+        %127 = OpLabel
+               OpBranch %115
+        %115 = OpLabel
+        %132 = OpLoad %int %n
+        %133 = OpIAdd %int %132 %int_1
+               OpStore %n %133
+               OpBranch %113
+        %114 = OpLabel
+               OpBranch %78
+         %80 = OpLabel
+        %134 = OpAccessChain %_ptr_Private_uint %gl_GlobalInvocationID %uint_0
+        %135 = OpLoad %uint %134
+        %137 = OpULessThan %bool %135 %uint_120
+               OpSelectionMerge %138 None
+               OpBranchConditional %137 %139 %140
+        %139 = OpLabel
+        %141 = OpAccessChain %_ptr_Function_float %A %int_0
+        %142 = OpLoad %float %141
+        %143 = OpAccessChain %_ptr_Uniform_float %x_13 %uint_0 %uint_0
+        %144 = OpLoad %float %143
+        %145 = OpAccessChain %_ptr_Function_float %A %int_0
+        %146 = OpLoad %float %145
+        %147 = OpAccessChain %_ptr_Uniform_float %x_13 %uint_0 %uint_1
+        %148 = OpLoad %float %147
+        %149 = OpFDiv %float %142 %144
+        %150 = OpFDiv %float %146 %148
+        %151 = OpCompositeConstruct %v4float %149 %150 %float_0 %float_1
+               OpStore %value %151
+               OpBranch %138
+        %140 = OpLabel
+        %152 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %uint_0
+        %153 = OpLoad %float %152
+        %154 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %uint_1
+        %155 = OpLoad %float %154
+        %156 = OpFOrdGreaterThan %bool %153 %155
+               OpSelectionMerge %157 None
+               OpBranchConditional %156 %158 %157
+        %158 = OpLabel
+               OpBranch %70
+        %157 = OpLabel
+               OpBranch %138
+        %138 = OpLabel
+               OpBranch %78
+         %78 = OpLabel
+               OpBranch %70
+         %70 = OpLabel
+               OpSelectionMerge %160 None
+               OpBranchConditional %false %161 %162
+        %161 = OpLabel
+               OpBranch %160
+        %162 = OpLabel
+               OpBranch %69
+        %160 = OpLabel
+               OpBranch %68
+         %69 = OpLabel
+        %163 = OpAccessChain %_ptr_Function_float %value %uint_0
+        %164 = OpLoad %float %163
+        %166 = OpAccessChain %_ptr_StorageBuffer_int %x_15 %uint_0 %int_0
+        %167 = OpConvertFToS %int %164
+               OpStore %166 %167
+        %168 = OpAccessChain %_ptr_Function_float %value %uint_1
+        %169 = OpLoad %float %168
+        %170 = OpAccessChain %_ptr_StorageBuffer_int %x_15 %uint_0 %int_1
+        %171 = OpConvertFToS %int %169
+               OpStore %170 %171
+        %172 = OpAccessChain %_ptr_Function_float %value %uint_2
+        %173 = OpLoad %float %172
+        %175 = OpAccessChain %_ptr_StorageBuffer_int %x_15 %uint_0 %int_2
+        %176 = OpConvertFToS %int %173
+               OpStore %175 %176
+        %178 = OpAccessChain %_ptr_Function_float %value %uint_3
+        %179 = OpLoad %float %178
+        %181 = OpAccessChain %_ptr_StorageBuffer_int %x_15 %uint_0 %int_3
+        %182 = OpConvertFToS %int %179
+               OpStore %181 %182
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %21
+        %184 = OpLabel
+        %185 = OpLoad %v3uint %tint_symbol
+               OpStore %gl_GlobalInvocationID %185
+        %186 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 70[%70] is not post dominated by the back-edge block 160[%160]
+  %160 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-barrier-in-loops/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/unreachable-barrier-in-loops/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..2b4eb0e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-barrier-in-loops/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,145 @@
+[[block]]
+struct buf1 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[block]]
+struct buf2 {
+  resolution : vec2<f32>;
+};
+
+type RTArr = [[stride(4)]] array<i32>;
+
+[[block]]
+struct doesNotMatter {
+  x_compute_data : RTArr;
+};
+
+var<private> gl_GlobalInvocationID : vec3<u32>;
+
+[[group(0), binding(1)]] var<uniform> x_10 : buf1;
+
+[[group(0), binding(2)]] var<uniform> x_13 : buf2;
+
+[[group(0), binding(0)]] var<storage, read_write> x_15 : doesNotMatter;
+
+fn main_1() {
+  var A : array<f32, 1>;
+  var i : i32;
+  var value : vec4<f32>;
+  var m : i32;
+  var l : i32;
+  var n : i32;
+  A[0] = 0.0;
+  i = 0;
+  loop {
+    let x_60 : i32 = i;
+    if ((x_60 < 50)) {
+    } else {
+      break;
+    }
+    let x_63 : i32 = i;
+    if ((x_63 > 0)) {
+      let x_68 : f32 = A[0];
+      let x_70 : f32 = A[0];
+      A[0] = (x_70 + x_68);
+    }
+
+    continuing {
+      let x_73 : i32 = i;
+      i = (x_73 + 1);
+    }
+  }
+  loop {
+    let x_80 : u32 = gl_GlobalInvocationID.x;
+    if ((x_80 < 100u)) {
+      value = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+      m = 0;
+      loop {
+        let x_89 : i32 = m;
+        if ((x_89 < 1)) {
+        } else {
+          break;
+        }
+        l = 0;
+        loop {
+          let x_96 : i32 = l;
+          if ((x_96 < 1)) {
+          } else {
+            break;
+          }
+          let x_100 : f32 = x_10.injectionSwitch.x;
+          let x_102 : f32 = x_10.injectionSwitch.y;
+          if ((x_100 > x_102)) {
+            return;
+          }
+
+          continuing {
+            let x_106 : i32 = l;
+            l = (x_106 + 1);
+          }
+        }
+
+        continuing {
+          let x_108 : i32 = m;
+          m = (x_108 + 1);
+        }
+      }
+      n = 0;
+      loop {
+        let x_114 : i32 = n;
+        if ((x_114 < 1)) {
+        } else {
+          break;
+        }
+        let x_118 : f32 = x_10.injectionSwitch.x;
+        let x_120 : f32 = x_10.injectionSwitch.y;
+        if ((x_118 > x_120)) {
+          workgroupBarrier();
+        }
+
+        continuing {
+          let x_124 : i32 = n;
+          n = (x_124 + 1);
+        }
+      }
+    } else {
+      let x_127 : u32 = gl_GlobalInvocationID.x;
+      if ((x_127 < 120u)) {
+        let x_133 : f32 = A[0];
+        let x_135 : f32 = x_13.resolution.x;
+        let x_138 : f32 = A[0];
+        let x_140 : f32 = x_13.resolution.y;
+        value = vec4<f32>((x_133 / x_135), (x_138 / x_140), 0.0, 1.0);
+      } else {
+        let x_144 : f32 = x_10.injectionSwitch.x;
+        let x_146 : f32 = x_10.injectionSwitch.y;
+        if ((x_144 > x_146)) {
+          continue;
+        }
+      }
+    }
+
+    continuing {
+      if (false) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_151 : f32 = value.x;
+  x_15.x_compute_data[0] = i32(x_151);
+  let x_155 : f32 = value.y;
+  x_15.x_compute_data[1] = i32(x_155);
+  let x_159 : f32 = value.z;
+  x_15.x_compute_data[2] = i32(x_159);
+  let x_163 : f32 = value.w;
+  x_15.x_compute_data[3] = i32(x_163);
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main([[builtin(global_invocation_id)]] gl_GlobalInvocationID_param : vec3<u32>) {
+  gl_GlobalInvocationID = gl_GlobalInvocationID_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-continue-statement/0.spvasm b/test/vk-gl-cts/graphicsfuzz/unreachable-continue-statement/0.spvasm
new file mode 100644
index 0000000..ef406ac
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-continue-statement/0.spvasm
@@ -0,0 +1,81 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %computeColor_ "computeColor("
+               OpName %_GLF_color "_GLF_color"
+               OpName %_injected_loop_counter "_injected_loop_counter"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %_injected_loop_counter RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+         %12 = OpTypeFunction %v3float
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %17 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+         %29 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+       %main = OpFunction %void None %9
+         %30 = OpLabel
+         %31 = OpFunctionCall %v3float %computeColor_
+               OpReturn
+               OpFunctionEnd
+%computeColor_ = OpFunction %v3float None %12
+         %32 = OpLabel
+%_injected_loop_counter = OpVariable %_ptr_Function_int Function
+               OpStore %_GLF_color %17
+               OpStore %_injected_loop_counter %int_1
+               OpBranch %33
+         %33 = OpLabel
+               OpLoopMerge %34 %35 None
+               OpBranch %36
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %38 = OpLoad %float %37
+         %39 = OpFOrdGreaterThan %bool %38 %float_1
+               OpSelectionMerge %40 None
+               OpBranchConditional %39 %41 %40
+         %41 = OpLabel
+         %42 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %43 = OpLoad %float %42
+         %44 = OpFOrdGreaterThan %bool %43 %float_1
+               OpSelectionMerge %45 None
+               OpBranchConditional %44 %46 %35
+         %46 = OpLabel
+               OpBranch %35
+         %45 = OpLabel
+               OpBranch %35
+         %35 = OpLabel
+               OpBranch %33
+         %40 = OpLabel
+               OpReturnValue %29
+         %34 = OpLabel
+               OpUnreachable
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-continue-statement/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/unreachable-continue-statement/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..701d8d9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-continue-statement/0.spvasm.expected.hlsl
@@ -0,0 +1,43 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[1];
+};
+
+float3 computeColor_() {
+  int x_injected_loop_counter = 0;
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  x_injected_loop_counter = 1;
+  while (true) {
+    const float x_38 = asfloat(x_7[0].x);
+    if ((x_38 > 1.0f)) {
+      const float x_43 = asfloat(x_7[0].x);
+      if ((x_43 > 1.0f)) {
+        continue;
+      } else {
+        continue;
+      }
+      continue;
+    }
+    return float3(1.0f, 1.0f, 1.0f);
+  }
+  return float3(0.0f, 0.0f, 0.0f);
+}
+
+void main_1() {
+  const float3 x_31 = computeColor_();
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-continue-statement/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/unreachable-continue-statement/0.spvasm.expected.msl
new file mode 100644
index 0000000..ac448be
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-continue-statement/0.spvasm.expected.msl
@@ -0,0 +1,46 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float3 computeColor_(constant buf0& x_7, thread float4* const tint_symbol_4) {
+  int x_injected_loop_counter = 0;
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  x_injected_loop_counter = 1;
+  while (true) {
+    float const x_38 = x_7.injectionSwitch.x;
+    if ((x_38 > 1.0f)) {
+      float const x_43 = x_7.injectionSwitch.x;
+      if ((x_43 > 1.0f)) {
+        continue;
+      } else {
+        continue;
+      }
+      continue;
+    }
+    return float3(1.0f, 1.0f, 1.0f);
+  }
+  return float3(0.0f, 0.0f, 0.0f);
+}
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_5) {
+  float3 const x_31 = computeColor_(x_7, tint_symbol_5);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_7, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-continue-statement/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/unreachable-continue-statement/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..d114d3c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-continue-statement/0.spvasm.expected.spvasm
@@ -0,0 +1,113 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 62
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_7 "x_7"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %computeColor_ "computeColor_"
+               OpName %x_injected_loop_counter "x_injected_loop_counter"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+    %v3float = OpTypeVector %float 3
+         %12 = OpTypeFunction %v3float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %19 = OpConstantNull %int
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %22 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %int_1 = OpConstant %int 1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+         %43 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+         %44 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+       %void = OpTypeVoid
+         %45 = OpTypeFunction %void
+   %main_out = OpTypeStruct %v4float
+         %50 = OpTypeFunction %void %main_out
+%computeColor_ = OpFunction %v3float None %12
+         %15 = OpLabel
+%x_injected_loop_counter = OpVariable %_ptr_Function_int Function %19
+               OpStore %x_GLF_color %22
+               OpStore %x_injected_loop_counter %int_1
+               OpBranch %24
+         %24 = OpLabel
+               OpLoopMerge %25 %26 None
+               OpBranch %27
+         %27 = OpLabel
+         %31 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_0
+         %32 = OpLoad %float %31
+         %33 = OpFOrdGreaterThan %bool %32 %float_1
+               OpSelectionMerge %35 None
+               OpBranchConditional %33 %36 %35
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_0
+         %38 = OpLoad %float %37
+         %39 = OpFOrdGreaterThan %bool %38 %float_1
+               OpSelectionMerge %40 None
+               OpBranchConditional %39 %41 %42
+         %41 = OpLabel
+               OpBranch %26
+         %42 = OpLabel
+               OpBranch %26
+         %40 = OpLabel
+               OpBranch %26
+         %35 = OpLabel
+               OpReturnValue %43
+         %26 = OpLabel
+               OpBranch %24
+         %25 = OpLabel
+               OpReturnValue %44
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %45
+         %48 = OpLabel
+         %49 = OpFunctionCall %v3float %computeColor_
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %50
+%tint_symbol = OpFunctionParameter %main_out
+         %54 = OpLabel
+         %55 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %55
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %45
+         %57 = OpLabel
+         %58 = OpFunctionCall %void %main_1
+         %60 = OpLoad %v4float %x_GLF_color
+         %61 = OpCompositeConstruct %main_out %60
+         %59 = OpFunctionCall %void %tint_symbol_2 %61
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-continue-statement/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/unreachable-continue-statement/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..543e524
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-continue-statement/0.spvasm.expected.wgsl
@@ -0,0 +1,44 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+fn computeColor_() -> vec3<f32> {
+  var x_injected_loop_counter : i32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  x_injected_loop_counter = 1;
+  loop {
+    let x_38 : f32 = x_7.injectionSwitch.x;
+    if ((x_38 > 1.0)) {
+      let x_43 : f32 = x_7.injectionSwitch.x;
+      if ((x_43 > 1.0)) {
+        continue;
+      } else {
+        continue;
+      }
+      continue;
+    }
+    return vec3<f32>(1.0, 1.0, 1.0);
+  }
+  return vec3<f32>(0.0, 0.0, 0.0);
+}
+
+fn main_1() {
+  let x_31 : vec3<f32> = computeColor_();
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-continue-statement/0.wgsl b/test/vk-gl-cts/graphicsfuzz/unreachable-continue-statement/0.wgsl
new file mode 100644
index 0000000..543e524
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-continue-statement/0.wgsl
@@ -0,0 +1,44 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+fn computeColor_() -> vec3<f32> {
+  var x_injected_loop_counter : i32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  x_injected_loop_counter = 1;
+  loop {
+    let x_38 : f32 = x_7.injectionSwitch.x;
+    if ((x_38 > 1.0)) {
+      let x_43 : f32 = x_7.injectionSwitch.x;
+      if ((x_43 > 1.0)) {
+        continue;
+      } else {
+        continue;
+      }
+      continue;
+    }
+    return vec3<f32>(1.0, 1.0, 1.0);
+  }
+  return vec3<f32>(0.0, 0.0, 0.0);
+}
+
+fn main_1() {
+  let x_31 : vec3<f32> = computeColor_();
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-continue-statement/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/unreachable-continue-statement/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..701d8d9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-continue-statement/0.wgsl.expected.hlsl
@@ -0,0 +1,43 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[1];
+};
+
+float3 computeColor_() {
+  int x_injected_loop_counter = 0;
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  x_injected_loop_counter = 1;
+  while (true) {
+    const float x_38 = asfloat(x_7[0].x);
+    if ((x_38 > 1.0f)) {
+      const float x_43 = asfloat(x_7[0].x);
+      if ((x_43 > 1.0f)) {
+        continue;
+      } else {
+        continue;
+      }
+      continue;
+    }
+    return float3(1.0f, 1.0f, 1.0f);
+  }
+  return float3(0.0f, 0.0f, 0.0f);
+}
+
+void main_1() {
+  const float3 x_31 = computeColor_();
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-continue-statement/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/unreachable-continue-statement/0.wgsl.expected.msl
new file mode 100644
index 0000000..ac448be
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-continue-statement/0.wgsl.expected.msl
@@ -0,0 +1,46 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float3 computeColor_(constant buf0& x_7, thread float4* const tint_symbol_4) {
+  int x_injected_loop_counter = 0;
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  x_injected_loop_counter = 1;
+  while (true) {
+    float const x_38 = x_7.injectionSwitch.x;
+    if ((x_38 > 1.0f)) {
+      float const x_43 = x_7.injectionSwitch.x;
+      if ((x_43 > 1.0f)) {
+        continue;
+      } else {
+        continue;
+      }
+      continue;
+    }
+    return float3(1.0f, 1.0f, 1.0f);
+  }
+  return float3(0.0f, 0.0f, 0.0f);
+}
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_5) {
+  float3 const x_31 = computeColor_(x_7, tint_symbol_5);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_6 = 0.0f;
+  main_1(x_7, &(tint_symbol_6));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_6};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-continue-statement/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/unreachable-continue-statement/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..d114d3c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-continue-statement/0.wgsl.expected.spvasm
@@ -0,0 +1,113 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 62
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_7 "x_7"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %computeColor_ "computeColor_"
+               OpName %x_injected_loop_counter "x_injected_loop_counter"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+    %v3float = OpTypeVector %float 3
+         %12 = OpTypeFunction %v3float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %19 = OpConstantNull %int
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %22 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %int_1 = OpConstant %int 1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+       %bool = OpTypeBool
+         %43 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+         %44 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+       %void = OpTypeVoid
+         %45 = OpTypeFunction %void
+   %main_out = OpTypeStruct %v4float
+         %50 = OpTypeFunction %void %main_out
+%computeColor_ = OpFunction %v3float None %12
+         %15 = OpLabel
+%x_injected_loop_counter = OpVariable %_ptr_Function_int Function %19
+               OpStore %x_GLF_color %22
+               OpStore %x_injected_loop_counter %int_1
+               OpBranch %24
+         %24 = OpLabel
+               OpLoopMerge %25 %26 None
+               OpBranch %27
+         %27 = OpLabel
+         %31 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_0
+         %32 = OpLoad %float %31
+         %33 = OpFOrdGreaterThan %bool %32 %float_1
+               OpSelectionMerge %35 None
+               OpBranchConditional %33 %36 %35
+         %36 = OpLabel
+         %37 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_0
+         %38 = OpLoad %float %37
+         %39 = OpFOrdGreaterThan %bool %38 %float_1
+               OpSelectionMerge %40 None
+               OpBranchConditional %39 %41 %42
+         %41 = OpLabel
+               OpBranch %26
+         %42 = OpLabel
+               OpBranch %26
+         %40 = OpLabel
+               OpBranch %26
+         %35 = OpLabel
+               OpReturnValue %43
+         %26 = OpLabel
+               OpBranch %24
+         %25 = OpLabel
+               OpReturnValue %44
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %45
+         %48 = OpLabel
+         %49 = OpFunctionCall %v3float %computeColor_
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %50
+%tint_symbol = OpFunctionParameter %main_out
+         %54 = OpLabel
+         %55 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %55
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %45
+         %57 = OpLabel
+         %58 = OpFunctionCall %void %main_1
+         %60 = OpLoad %v4float %x_GLF_color
+         %61 = OpCompositeConstruct %main_out %60
+         %59 = OpFunctionCall %void %tint_symbol_2 %61
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-continue-statement/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/unreachable-continue-statement/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..543e524
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-continue-statement/0.wgsl.expected.wgsl
@@ -0,0 +1,44 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+fn computeColor_() -> vec3<f32> {
+  var x_injected_loop_counter : i32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  x_injected_loop_counter = 1;
+  loop {
+    let x_38 : f32 = x_7.injectionSwitch.x;
+    if ((x_38 > 1.0)) {
+      let x_43 : f32 = x_7.injectionSwitch.x;
+      if ((x_43 > 1.0)) {
+        continue;
+      } else {
+        continue;
+      }
+      continue;
+    }
+    return vec3<f32>(1.0, 1.0, 1.0);
+  }
+  return vec3<f32>(0.0, 0.0, 0.0);
+}
+
+fn main_1() {
+  let x_31 : vec3<f32> = computeColor_();
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement-in-if/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement-in-if/0-opt.spvasm
new file mode 100644
index 0000000..b17f848
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement-in-if/0-opt.spvasm
@@ -0,0 +1,90 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %computePoint_ "computePoint("
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+         %12 = OpTypeFunction %v3float
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+         %23 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+      %false = OpConstantFalse %bool
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %30 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+%_ptr_Function_bool = OpTypePointer Function %bool
+       %true = OpConstantTrue %bool
+       %main = OpFunction %void None %9
+         %33 = OpLabel
+         %34 = OpVariable %_ptr_Function_bool Function %false
+               OpBranch %35
+         %35 = OpLabel
+         %36 = OpFunctionCall %v3float %computePoint_
+               OpLoopMerge %37 %38 None
+               OpBranch %39
+         %39 = OpLabel
+         %40 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %41 = OpLoad %float %40
+         %42 = OpFOrdLessThan %bool %41 %float_0
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %43
+         %44 = OpLabel
+               OpStore %34 %true
+               OpBranch %37
+         %43 = OpLabel
+         %45 = OpFunctionCall %v3float %computePoint_
+               OpStore %_GLF_color %30
+               OpStore %34 %true
+               OpBranch %37
+         %38 = OpLabel
+               OpBranch %35
+         %37 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%computePoint_ = OpFunction %v3float None %12
+         %46 = OpLabel
+         %47 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %48 = OpLoad %float %47
+         %49 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %50 = OpLoad %float %49
+         %51 = OpFOrdGreaterThan %bool %48 %50
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %52
+         %53 = OpLabel
+               OpKill
+         %52 = OpLabel
+         %54 = OpUndef %v3float
+               OpReturnValue %54
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement-in-if/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement-in-if/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..ccaa960
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement-in-if/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,50 @@
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float3 computePoint_() {
+  const float x_48 = asfloat(x_7[0].x);
+  const float x_50 = asfloat(x_7[0].y);
+  if ((x_48 > x_50)) {
+    discard;
+  }
+  return float3(0.0f, 0.0f, 0.0f);
+}
+
+void main_1() {
+  bool x_34 = false;
+  while (true) {
+    const float3 x_36 = computePoint_();
+    const float x_41 = gl_FragCoord.x;
+    if ((x_41 < 0.0f)) {
+      x_34 = true;
+      break;
+    }
+    const float3 x_45 = computePoint_();
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    x_34 = true;
+    break;
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement-in-if/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement-in-if/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..d52c896
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement-in-if/0-opt.spvasm.expected.msl
@@ -0,0 +1,49 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float3 computePoint_(constant buf0& x_7) {
+  float const x_48 = x_7.injectionSwitch.x;
+  float const x_50 = x_7.injectionSwitch.y;
+  if ((x_48 > x_50)) {
+    discard_fragment();
+  }
+  return float3(0.0f, 0.0f, 0.0f);
+}
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  bool x_34 = false;
+  while (true) {
+    float3 const x_36 = computePoint_(x_7);
+    float const x_41 = (*(tint_symbol_5)).x;
+    if ((x_41 < 0.0f)) {
+      x_34 = true;
+      break;
+    }
+    float3 const x_45 = computePoint_(x_7);
+    *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    x_34 = true;
+    break;
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_7, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement-in-if/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement-in-if/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..c4ffa4c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement-in-if/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,125 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 69
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_7 "x_7"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %computePoint_ "computePoint_"
+               OpName %main_1 "main_1"
+               OpName %x_34 "x_34"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+    %v3float = OpTypeVector %float 3
+         %15 = OpTypeFunction %v3float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+         %32 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+       %void = OpTypeVoid
+         %33 = OpTypeFunction %void
+      %false = OpConstantFalse %bool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %40 = OpConstantNull %bool
+%_ptr_Private_float = OpTypePointer Private %float
+       %true = OpConstantTrue %bool
+    %float_1 = OpConstant %float 1
+         %55 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %56 = OpTypeFunction %void %main_out
+%computePoint_ = OpFunction %v3float None %15
+         %18 = OpLabel
+         %22 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_0
+         %23 = OpLoad %float %22
+         %25 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_1
+         %26 = OpLoad %float %25
+         %27 = OpFOrdGreaterThan %bool %23 %26
+               OpSelectionMerge %29 None
+               OpBranchConditional %27 %30 %29
+         %30 = OpLabel
+               OpKill
+         %29 = OpLabel
+               OpReturnValue %32
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %33
+         %36 = OpLabel
+       %x_34 = OpVariable %_ptr_Function_bool Function %40
+               OpStore %x_34 %false
+               OpBranch %41
+         %41 = OpLabel
+               OpLoopMerge %42 %43 None
+               OpBranch %44
+         %44 = OpLabel
+         %45 = OpFunctionCall %v3float %computePoint_
+         %47 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %48 = OpLoad %float %47
+         %49 = OpFOrdLessThan %bool %48 %float_0
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %50
+         %51 = OpLabel
+               OpStore %x_34 %true
+               OpBranch %42
+         %50 = OpLabel
+         %53 = OpFunctionCall %v3float %computePoint_
+               OpStore %x_GLF_color %55
+               OpStore %x_34 %true
+               OpBranch %42
+         %43 = OpLabel
+               OpBranch %41
+         %42 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %56
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %60 = OpLabel
+         %61 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %61
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %33
+         %63 = OpLabel
+         %64 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %64
+         %65 = OpFunctionCall %void %main_1
+         %67 = OpLoad %v4float %x_GLF_color
+         %68 = OpCompositeConstruct %main_out %67
+         %66 = OpFunctionCall %void %tint_symbol_3 %68
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement-in-if/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement-in-if/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..9873801
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement-in-if/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,48 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn computePoint_() -> vec3<f32> {
+  let x_48 : f32 = x_7.injectionSwitch.x;
+  let x_50 : f32 = x_7.injectionSwitch.y;
+  if ((x_48 > x_50)) {
+    discard;
+  }
+  return vec3<f32>(0.0, 0.0, 0.0);
+}
+
+fn main_1() {
+  var x_34 : bool = false;
+  loop {
+    let x_36 : vec3<f32> = computePoint_();
+    let x_41 : f32 = gl_FragCoord.x;
+    if ((x_41 < 0.0)) {
+      x_34 = true;
+      break;
+    }
+    let x_45 : vec3<f32> = computePoint_();
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    x_34 = true;
+    break;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement-in-if/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement-in-if/0-opt.wgsl
new file mode 100644
index 0000000..9873801
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement-in-if/0-opt.wgsl
@@ -0,0 +1,48 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn computePoint_() -> vec3<f32> {
+  let x_48 : f32 = x_7.injectionSwitch.x;
+  let x_50 : f32 = x_7.injectionSwitch.y;
+  if ((x_48 > x_50)) {
+    discard;
+  }
+  return vec3<f32>(0.0, 0.0, 0.0);
+}
+
+fn main_1() {
+  var x_34 : bool = false;
+  loop {
+    let x_36 : vec3<f32> = computePoint_();
+    let x_41 : f32 = gl_FragCoord.x;
+    if ((x_41 < 0.0)) {
+      x_34 = true;
+      break;
+    }
+    let x_45 : vec3<f32> = computePoint_();
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    x_34 = true;
+    break;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement-in-if/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement-in-if/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..ccaa960
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement-in-if/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,50 @@
+cbuffer cbuffer_x_7 : register(b0, space0) {
+  uint4 x_7[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float3 computePoint_() {
+  const float x_48 = asfloat(x_7[0].x);
+  const float x_50 = asfloat(x_7[0].y);
+  if ((x_48 > x_50)) {
+    discard;
+  }
+  return float3(0.0f, 0.0f, 0.0f);
+}
+
+void main_1() {
+  bool x_34 = false;
+  while (true) {
+    const float3 x_36 = computePoint_();
+    const float x_41 = gl_FragCoord.x;
+    if ((x_41 < 0.0f)) {
+      x_34 = true;
+      break;
+    }
+    const float3 x_45 = computePoint_();
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    x_34 = true;
+    break;
+  }
+  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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement-in-if/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement-in-if/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..d52c896
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement-in-if/0-opt.wgsl.expected.msl
@@ -0,0 +1,49 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float3 computePoint_(constant buf0& x_7) {
+  float const x_48 = x_7.injectionSwitch.x;
+  float const x_50 = x_7.injectionSwitch.y;
+  if ((x_48 > x_50)) {
+    discard_fragment();
+  }
+  return float3(0.0f, 0.0f, 0.0f);
+}
+
+void main_1(constant buf0& x_7, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  bool x_34 = false;
+  while (true) {
+    float3 const x_36 = computePoint_(x_7);
+    float const x_41 = (*(tint_symbol_5)).x;
+    if ((x_41 < 0.0f)) {
+      x_34 = true;
+      break;
+    }
+    float3 const x_45 = computePoint_(x_7);
+    *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    x_34 = true;
+    break;
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(x_7, &(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement-in-if/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement-in-if/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..c4ffa4c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement-in-if/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,125 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 69
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_7 "x_7"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %computePoint_ "computePoint_"
+               OpName %main_1 "main_1"
+               OpName %x_34 "x_34"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_7 NonWritable
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_7 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %9
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %9
+    %v3float = OpTypeVector %float 3
+         %15 = OpTypeFunction %v3float
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+    %float_0 = OpConstant %float 0
+         %32 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+       %void = OpTypeVoid
+         %33 = OpTypeFunction %void
+      %false = OpConstantFalse %bool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %40 = OpConstantNull %bool
+%_ptr_Private_float = OpTypePointer Private %float
+       %true = OpConstantTrue %bool
+    %float_1 = OpConstant %float 1
+         %55 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %56 = OpTypeFunction %void %main_out
+%computePoint_ = OpFunction %v3float None %15
+         %18 = OpLabel
+         %22 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_0
+         %23 = OpLoad %float %22
+         %25 = OpAccessChain %_ptr_Uniform_float %x_7 %uint_0 %uint_1
+         %26 = OpLoad %float %25
+         %27 = OpFOrdGreaterThan %bool %23 %26
+               OpSelectionMerge %29 None
+               OpBranchConditional %27 %30 %29
+         %30 = OpLabel
+               OpKill
+         %29 = OpLabel
+               OpReturnValue %32
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %33
+         %36 = OpLabel
+       %x_34 = OpVariable %_ptr_Function_bool Function %40
+               OpStore %x_34 %false
+               OpBranch %41
+         %41 = OpLabel
+               OpLoopMerge %42 %43 None
+               OpBranch %44
+         %44 = OpLabel
+         %45 = OpFunctionCall %v3float %computePoint_
+         %47 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %48 = OpLoad %float %47
+         %49 = OpFOrdLessThan %bool %48 %float_0
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %50
+         %51 = OpLabel
+               OpStore %x_34 %true
+               OpBranch %42
+         %50 = OpLabel
+         %53 = OpFunctionCall %v3float %computePoint_
+               OpStore %x_GLF_color %55
+               OpStore %x_34 %true
+               OpBranch %42
+         %43 = OpLabel
+               OpBranch %41
+         %42 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %56
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %60 = OpLabel
+         %61 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %61
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %33
+         %63 = OpLabel
+         %64 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %64
+         %65 = OpFunctionCall %void %main_1
+         %67 = OpLoad %v4float %x_GLF_color
+         %68 = OpCompositeConstruct %main_out %67
+         %66 = OpFunctionCall %void %tint_symbol_3 %68
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement-in-if/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement-in-if/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..9873801
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement-in-if/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,48 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_7 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn computePoint_() -> vec3<f32> {
+  let x_48 : f32 = x_7.injectionSwitch.x;
+  let x_50 : f32 = x_7.injectionSwitch.y;
+  if ((x_48 > x_50)) {
+    discard;
+  }
+  return vec3<f32>(0.0, 0.0, 0.0);
+}
+
+fn main_1() {
+  var x_34 : bool = false;
+  loop {
+    let x_36 : vec3<f32> = computePoint_();
+    let x_41 : f32 = gl_FragCoord.x;
+    if ((x_41 < 0.0)) {
+      x_34 = true;
+      break;
+    }
+    let x_45 : vec3<f32> = computePoint_();
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    x_34 = true;
+    break;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement/0.spvasm b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement/0.spvasm
new file mode 100644
index 0000000..f051a44
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement/0.spvasm
@@ -0,0 +1,94 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %mand_ "mand("
+               OpName %k "k"
+               OpName %_GLF_color "_GLF_color"
+               OpName %i "i"
+               OpDecorate %k RelaxedPrecision
+               OpDecorate %7 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %i RelaxedPrecision
+               OpDecorate %8 RelaxedPrecision
+               OpDecorate %9 RelaxedPrecision
+               OpDecorate %10 RelaxedPrecision
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+         %15 = OpTypeFunction %v3float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+   %int_1000 = OpConstant %int 1000
+       %bool = OpTypeBool
+    %float_1 = OpConstant %float 1
+         %22 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+      %int_1 = OpConstant %int 1
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %27 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %int_4 = OpConstant %int 4
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+      %false = OpConstantFalse %bool
+%_ptr_Function_bool = OpTypePointer Function %bool
+       %true = OpConstantTrue %bool
+       %main = OpFunction %void None %12
+         %33 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+               OpStore %_GLF_color %27
+               OpStore %i %int_0
+               OpBranch %34
+         %34 = OpLabel
+          %8 = OpLoad %int %i
+         %35 = OpSLessThan %bool %8 %int_4
+               OpLoopMerge %36 %37 None
+               OpBranchConditional %35 %37 %36
+         %37 = OpLabel
+         %38 = OpFunctionCall %v3float %mand_
+          %9 = OpLoad %int %i
+         %10 = OpIAdd %int %9 %int_1
+               OpStore %i %10
+               OpBranch %34
+         %36 = OpLabel
+               OpReturn
+               OpFunctionEnd
+      %mand_ = OpFunction %v3float None %15
+         %39 = OpLabel
+         %40 = OpVariable %_ptr_Function_bool Function %false
+         %41 = OpVariable %_ptr_Function_v3float Function
+          %k = OpVariable %_ptr_Function_int Function
+               OpBranch %42
+         %42 = OpLabel
+               OpStore %k %int_0
+               OpLoopMerge %43 %44 None
+               OpBranch %45
+         %45 = OpLabel
+          %7 = OpLoad %int %k
+         %46 = OpSLessThan %bool %7 %int_1000
+               OpLoopMerge %47 %48 None
+               OpBranchConditional %46 %49 %47
+         %49 = OpLabel
+               OpStore %40 %true
+               OpStore %41 %22
+               OpBranch %47
+         %48 = OpLabel
+               OpBranch %45
+         %47 = OpLabel
+         %50 = OpLoad %bool %40
+               OpSelectionMerge %51 None
+               OpBranchConditional %50 %43 %51
+         %51 = OpLabel
+               OpKill
+         %44 = OpLabel
+               OpBranch %42
+         %43 = OpLabel
+         %52 = OpLoad %v3float %41
+               OpReturnValue %52
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..a06fe40
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement/0.spvasm.expected.hlsl
@@ -0,0 +1,55 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float3 mand_() {
+  bool x_40 = false;
+  float3 x_41 = float3(0.0f, 0.0f, 0.0f);
+  int k = 0;
+  while (true) {
+    k = 0;
+    while (true) {
+      if ((k < 1000)) {
+      } else {
+        break;
+      }
+      x_40 = true;
+      x_41 = float3(1.0f, 1.0f, 1.0f);
+      break;
+    }
+    if (x_40) {
+      break;
+    }
+    discard;
+  }
+  return x_41;
+}
+
+void main_1() {
+  int i = 0;
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  i = 0;
+  while (true) {
+    if ((i < 4)) {
+    } else {
+      break;
+    }
+    {
+      const float3 x_38 = mand_();
+      i = (i + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement/0.spvasm.expected.msl
new file mode 100644
index 0000000..73ff170
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement/0.spvasm.expected.msl
@@ -0,0 +1,63 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float3 mand_() {
+  bool x_40 = false;
+  float3 x_41 = 0.0f;
+  int k = 0;
+  while (true) {
+    k = 0;
+    while (true) {
+      int const x_7 = k;
+      if ((x_7 < 1000)) {
+      } else {
+        break;
+      }
+      x_40 = true;
+      x_41 = float3(1.0f, 1.0f, 1.0f);
+      break;
+    }
+    bool const x_50 = x_40;
+    if (x_50) {
+      break;
+    }
+    discard_fragment();
+  }
+  float3 const x_52 = x_41;
+  return x_52;
+}
+
+void main_1(thread float4* const tint_symbol_4) {
+  int i = 0;
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  i = 0;
+  while (true) {
+    int const x_8 = i;
+    if ((x_8 < 4)) {
+    } else {
+      break;
+    }
+    {
+      float3 const x_38 = mand_();
+      int const x_9 = i;
+      i = (x_9 + 1);
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..422a368
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement/0.spvasm.expected.spvasm
@@ -0,0 +1,144 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 79
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %mand_ "mand_"
+               OpName %x_40 "x_40"
+               OpName %x_41 "x_41"
+               OpName %k "k"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+    %v3float = OpTypeVector %float 3
+          %8 = OpTypeFunction %v3float
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %16 = OpConstantNull %bool
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %19 = OpConstantNull %v3float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+   %int_1000 = OpConstant %int 1000
+       %true = OpConstantTrue %bool
+    %float_1 = OpConstant %float 1
+         %41 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+       %void = OpTypeVoid
+         %46 = OpTypeFunction %void
+    %float_0 = OpConstant %float 0
+         %52 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %int_4 = OpConstant %int 4
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %67 = OpTypeFunction %void %main_out
+      %mand_ = OpFunction %v3float None %8
+         %11 = OpLabel
+       %x_40 = OpVariable %_ptr_Function_bool Function %16
+       %x_41 = OpVariable %_ptr_Function_v3float Function %19
+          %k = OpVariable %_ptr_Function_int Function %23
+               OpStore %x_40 %false
+               OpBranch %24
+         %24 = OpLabel
+               OpLoopMerge %25 %26 None
+               OpBranch %27
+         %27 = OpLabel
+               OpStore %k %int_0
+               OpBranch %29
+         %29 = OpLabel
+               OpLoopMerge %30 %31 None
+               OpBranch %32
+         %32 = OpLabel
+         %33 = OpLoad %int %k
+         %35 = OpSLessThan %bool %33 %int_1000
+               OpSelectionMerge %36 None
+               OpBranchConditional %35 %37 %38
+         %37 = OpLabel
+               OpBranch %36
+         %38 = OpLabel
+               OpBranch %30
+         %36 = OpLabel
+               OpStore %x_40 %true
+               OpStore %x_41 %41
+               OpBranch %30
+         %31 = OpLabel
+               OpBranch %29
+         %30 = OpLabel
+         %42 = OpLoad %bool %x_40
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %43
+         %44 = OpLabel
+               OpBranch %25
+         %43 = OpLabel
+               OpKill
+         %26 = OpLabel
+               OpBranch %24
+         %25 = OpLabel
+         %45 = OpLoad %v3float %x_41
+               OpReturnValue %45
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %46
+         %49 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %23
+               OpStore %x_GLF_color %52
+               OpStore %i %int_0
+               OpBranch %53
+         %53 = OpLabel
+               OpLoopMerge %54 %55 None
+               OpBranch %56
+         %56 = OpLabel
+         %57 = OpLoad %int %i
+         %59 = OpSLessThan %bool %57 %int_4
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %62
+         %61 = OpLabel
+               OpBranch %60
+         %62 = OpLabel
+               OpBranch %54
+         %60 = OpLabel
+               OpBranch %55
+         %55 = OpLabel
+         %63 = OpFunctionCall %v3float %mand_
+         %64 = OpLoad %int %i
+         %66 = OpIAdd %int %64 %int_1
+               OpStore %i %66
+               OpBranch %53
+         %54 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %67
+%tint_symbol = OpFunctionParameter %main_out
+         %71 = OpLabel
+         %72 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %72
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %46
+         %74 = OpLabel
+         %75 = OpFunctionCall %void %main_1
+         %77 = OpLoad %v4float %x_GLF_color
+         %78 = OpCompositeConstruct %main_out %77
+         %76 = OpFunctionCall %void %tint_symbol_2 %78
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..5ad0b89
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement/0.spvasm.expected.wgsl
@@ -0,0 +1,58 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn mand_() -> vec3<f32> {
+  var x_40 : bool = false;
+  var x_41 : vec3<f32>;
+  var k : i32;
+  loop {
+    k = 0;
+    loop {
+      let x_7 : i32 = k;
+      if ((x_7 < 1000)) {
+      } else {
+        break;
+      }
+      x_40 = true;
+      x_41 = vec3<f32>(1.0, 1.0, 1.0);
+      break;
+    }
+    let x_50 : bool = x_40;
+    if (x_50) {
+      break;
+    }
+    discard;
+  }
+  let x_52 : vec3<f32> = x_41;
+  return x_52;
+}
+
+fn main_1() {
+  var i : i32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  i = 0;
+  loop {
+    let x_8 : i32 = i;
+    if ((x_8 < 4)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_38 : vec3<f32> = mand_();
+      let x_9 : i32 = i;
+      i = (x_9 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement/0.wgsl b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement/0.wgsl
new file mode 100644
index 0000000..5ad0b89
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement/0.wgsl
@@ -0,0 +1,58 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn mand_() -> vec3<f32> {
+  var x_40 : bool = false;
+  var x_41 : vec3<f32>;
+  var k : i32;
+  loop {
+    k = 0;
+    loop {
+      let x_7 : i32 = k;
+      if ((x_7 < 1000)) {
+      } else {
+        break;
+      }
+      x_40 = true;
+      x_41 = vec3<f32>(1.0, 1.0, 1.0);
+      break;
+    }
+    let x_50 : bool = x_40;
+    if (x_50) {
+      break;
+    }
+    discard;
+  }
+  let x_52 : vec3<f32> = x_41;
+  return x_52;
+}
+
+fn main_1() {
+  var i : i32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  i = 0;
+  loop {
+    let x_8 : i32 = i;
+    if ((x_8 < 4)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_38 : vec3<f32> = mand_();
+      let x_9 : i32 = i;
+      i = (x_9 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..a06fe40
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement/0.wgsl.expected.hlsl
@@ -0,0 +1,55 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float3 mand_() {
+  bool x_40 = false;
+  float3 x_41 = float3(0.0f, 0.0f, 0.0f);
+  int k = 0;
+  while (true) {
+    k = 0;
+    while (true) {
+      if ((k < 1000)) {
+      } else {
+        break;
+      }
+      x_40 = true;
+      x_41 = float3(1.0f, 1.0f, 1.0f);
+      break;
+    }
+    if (x_40) {
+      break;
+    }
+    discard;
+  }
+  return x_41;
+}
+
+void main_1() {
+  int i = 0;
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  i = 0;
+  while (true) {
+    if ((i < 4)) {
+    } else {
+      break;
+    }
+    {
+      const float3 x_38 = mand_();
+      i = (i + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement/0.wgsl.expected.msl
new file mode 100644
index 0000000..73ff170
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement/0.wgsl.expected.msl
@@ -0,0 +1,63 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float3 mand_() {
+  bool x_40 = false;
+  float3 x_41 = 0.0f;
+  int k = 0;
+  while (true) {
+    k = 0;
+    while (true) {
+      int const x_7 = k;
+      if ((x_7 < 1000)) {
+      } else {
+        break;
+      }
+      x_40 = true;
+      x_41 = float3(1.0f, 1.0f, 1.0f);
+      break;
+    }
+    bool const x_50 = x_40;
+    if (x_50) {
+      break;
+    }
+    discard_fragment();
+  }
+  float3 const x_52 = x_41;
+  return x_52;
+}
+
+void main_1(thread float4* const tint_symbol_4) {
+  int i = 0;
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  i = 0;
+  while (true) {
+    int const x_8 = i;
+    if ((x_8 < 4)) {
+    } else {
+      break;
+    }
+    {
+      float3 const x_38 = mand_();
+      int const x_9 = i;
+      i = (x_9 + 1);
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..422a368
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement/0.wgsl.expected.spvasm
@@ -0,0 +1,144 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 79
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %mand_ "mand_"
+               OpName %x_40 "x_40"
+               OpName %x_41 "x_41"
+               OpName %k "k"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+    %v3float = OpTypeVector %float 3
+          %8 = OpTypeFunction %v3float
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %16 = OpConstantNull %bool
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %19 = OpConstantNull %v3float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpConstantNull %int
+      %int_0 = OpConstant %int 0
+   %int_1000 = OpConstant %int 1000
+       %true = OpConstantTrue %bool
+    %float_1 = OpConstant %float 1
+         %41 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+       %void = OpTypeVoid
+         %46 = OpTypeFunction %void
+    %float_0 = OpConstant %float 0
+         %52 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %int_4 = OpConstant %int 4
+      %int_1 = OpConstant %int 1
+   %main_out = OpTypeStruct %v4float
+         %67 = OpTypeFunction %void %main_out
+      %mand_ = OpFunction %v3float None %8
+         %11 = OpLabel
+       %x_40 = OpVariable %_ptr_Function_bool Function %16
+       %x_41 = OpVariable %_ptr_Function_v3float Function %19
+          %k = OpVariable %_ptr_Function_int Function %23
+               OpStore %x_40 %false
+               OpBranch %24
+         %24 = OpLabel
+               OpLoopMerge %25 %26 None
+               OpBranch %27
+         %27 = OpLabel
+               OpStore %k %int_0
+               OpBranch %29
+         %29 = OpLabel
+               OpLoopMerge %30 %31 None
+               OpBranch %32
+         %32 = OpLabel
+         %33 = OpLoad %int %k
+         %35 = OpSLessThan %bool %33 %int_1000
+               OpSelectionMerge %36 None
+               OpBranchConditional %35 %37 %38
+         %37 = OpLabel
+               OpBranch %36
+         %38 = OpLabel
+               OpBranch %30
+         %36 = OpLabel
+               OpStore %x_40 %true
+               OpStore %x_41 %41
+               OpBranch %30
+         %31 = OpLabel
+               OpBranch %29
+         %30 = OpLabel
+         %42 = OpLoad %bool %x_40
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %43
+         %44 = OpLabel
+               OpBranch %25
+         %43 = OpLabel
+               OpKill
+         %26 = OpLabel
+               OpBranch %24
+         %25 = OpLabel
+         %45 = OpLoad %v3float %x_41
+               OpReturnValue %45
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %46
+         %49 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %23
+               OpStore %x_GLF_color %52
+               OpStore %i %int_0
+               OpBranch %53
+         %53 = OpLabel
+               OpLoopMerge %54 %55 None
+               OpBranch %56
+         %56 = OpLabel
+         %57 = OpLoad %int %i
+         %59 = OpSLessThan %bool %57 %int_4
+               OpSelectionMerge %60 None
+               OpBranchConditional %59 %61 %62
+         %61 = OpLabel
+               OpBranch %60
+         %62 = OpLabel
+               OpBranch %54
+         %60 = OpLabel
+               OpBranch %55
+         %55 = OpLabel
+         %63 = OpFunctionCall %v3float %mand_
+         %64 = OpLoad %int %i
+         %66 = OpIAdd %int %64 %int_1
+               OpStore %i %66
+               OpBranch %53
+         %54 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %67
+%tint_symbol = OpFunctionParameter %main_out
+         %71 = OpLabel
+         %72 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %72
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %46
+         %74 = OpLabel
+         %75 = OpFunctionCall %void %main_1
+         %77 = OpLoad %v4float %x_GLF_color
+         %78 = OpCompositeConstruct %main_out %77
+         %76 = OpFunctionCall %void %tint_symbol_2 %78
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..5ad0b89
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-discard-statement/0.wgsl.expected.wgsl
@@ -0,0 +1,58 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn mand_() -> vec3<f32> {
+  var x_40 : bool = false;
+  var x_41 : vec3<f32>;
+  var k : i32;
+  loop {
+    k = 0;
+    loop {
+      let x_7 : i32 = k;
+      if ((x_7 < 1000)) {
+      } else {
+        break;
+      }
+      x_40 = true;
+      x_41 = vec3<f32>(1.0, 1.0, 1.0);
+      break;
+    }
+    let x_50 : bool = x_40;
+    if (x_50) {
+      break;
+    }
+    discard;
+  }
+  let x_52 : vec3<f32> = x_41;
+  return x_52;
+}
+
+fn main_1() {
+  var i : i32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  i = 0;
+  loop {
+    let x_8 : i32 = i;
+    if ((x_8 < 4)) {
+    } else {
+      break;
+    }
+
+    continuing {
+      let x_38 : vec3<f32> = mand_();
+      let x_9 : i32 = i;
+      i = (x_9 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-loops-in-switch/0.spvasm b/test/vk-gl-cts/graphicsfuzz/unreachable-loops-in-switch/0.spvasm
new file mode 100644
index 0000000..5791da8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-loops-in-switch/0.spvasm
@@ -0,0 +1,116 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpName %i "i"
+               OpName %data "data"
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %i RelaxedPrecision
+               OpDecorate %6 RelaxedPrecision
+               OpDecorate %7 RelaxedPrecision
+               OpDecorate %8 RelaxedPrecision
+               OpDecorate %9 RelaxedPrecision
+               OpDecorate %10 RelaxedPrecision
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %18 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%_ptr_Function__arr_float_uint_1 = OpTypePointer Function %_arr_float_uint_1
+%_ptr_Function_float = OpTypePointer Function %float
+      %false = OpConstantFalse %bool
+       %true = OpConstantTrue %bool
+    %float_2 = OpConstant %float 2
+       %main = OpFunction %void None %12
+         %32 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function
+       %data = OpVariable %_ptr_Function__arr_float_uint_1 Function
+               OpStore %_GLF_color %18
+               OpStore %i %int_0
+               OpBranch %33
+         %33 = OpLabel
+               OpLoopMerge %34 %35 None
+               OpBranch %36
+         %36 = OpLabel
+          %6 = OpLoad %int %i
+         %37 = OpSLessThan %bool %6 %int_1
+               OpBranchConditional %37 %38 %34
+         %38 = OpLabel
+          %7 = OpLoad %int %i
+         %39 = OpAccessChain %_ptr_Function_float %data %7
+         %40 = OpLoad %float %39
+         %41 = OpAccessChain %_ptr_Function_float %data %int_0
+         %42 = OpLoad %float %41
+         %43 = OpFOrdLessThan %bool %40 %42
+               OpSelectionMerge %44 None
+               OpBranchConditional %43 %45 %44
+         %45 = OpLabel
+               OpSelectionMerge %46 None
+               OpBranchConditional %false %47 %46
+         %47 = OpLabel
+          %8 = OpLoad %int %i
+         %48 = OpConvertSToF %float %8
+         %49 = OpFOrdGreaterThanEqual %bool %48 %float_1
+               OpSelectionMerge %50 None
+               OpBranchConditional %49 %51 %50
+         %51 = OpLabel
+               OpBranch %50
+         %50 = OpLabel
+               OpBranch %46
+         %46 = OpLabel
+               OpSelectionMerge %52 None
+               OpSwitch %int_0 %52 1 %53 0 %54
+         %53 = OpLabel
+               OpBranch %55
+         %55 = OpLabel
+               OpLoopMerge %56 %57 None
+               OpBranch %58
+         %58 = OpLabel
+               OpBranchConditional %true %59 %56
+         %59 = OpLabel
+               OpBranch %57
+         %57 = OpLabel
+               OpBranch %55
+         %56 = OpLabel
+               OpBranch %60
+         %60 = OpLabel
+               OpLoopMerge %61 %62 None
+               OpBranch %63
+         %63 = OpLabel
+               OpBranch %62
+         %62 = OpLabel
+               OpBranch %60
+         %61 = OpLabel
+               OpBranch %54
+         %54 = OpLabel
+         %64 = OpAccessChain %_ptr_Function_float %data %int_0
+               OpStore %64 %float_2
+               OpBranch %52
+         %52 = OpLabel
+               OpBranch %44
+         %44 = OpLabel
+               OpBranch %35
+         %35 = OpLabel
+          %9 = OpLoad %int %i
+         %10 = OpIAdd %int %9 %int_1
+               OpStore %i %10
+               OpBranch %33
+         %34 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-loops-in-switch/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/unreachable-loops-in-switch/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..49336f5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-loops-in-switch/0.spvasm.expected.hlsl
@@ -0,0 +1,55 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int i = 0;
+  float data[1] = (float[1])0;
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  i = 0;
+  {
+    for(; (i < 1); i = (i + 1)) {
+      const float x_40 = data[i];
+      const float x_42 = data[0];
+      if ((x_40 < x_42)) {
+        if (false) {
+          if ((float(i) >= 1.0f)) {
+          }
+        }
+        switch(0) {
+          case 1: {
+            while (true) {
+              if (true) {
+              } else {
+                break;
+              }
+            }
+            while (true) {
+            }
+            /* fallthrough */
+          }
+          case 0: {
+            data[0] = 2.0f;
+            break;
+          }
+          default: {
+            break;
+          }
+        }
+      }
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-loops-in-switch/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/unreachable-loops-in-switch/0.spvasm.expected.msl
new file mode 100644
index 0000000..cc9b3ff
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-loops-in-switch/0.spvasm.expected.msl
@@ -0,0 +1,70 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  float arr[1];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  int i = 0;
+  tint_array_wrapper data = {};
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  i = 0;
+  while (true) {
+    int const x_6 = i;
+    if ((x_6 < 1)) {
+    } else {
+      break;
+    }
+    int const x_7 = i;
+    float const x_40 = data.arr[x_7];
+    float const x_42 = data.arr[0];
+    if ((x_40 < x_42)) {
+      if (false) {
+        int const x_8 = i;
+        if ((float(x_8) >= 1.0f)) {
+        }
+      }
+      switch(0) {
+        case 1: {
+          while (true) {
+            if (true) {
+            } else {
+              break;
+            }
+          }
+          while (true) {
+          }
+          /* fallthrough */
+        }
+        case 0: {
+          data.arr[0] = 2.0f;
+          break;
+        }
+        default: {
+          break;
+        }
+      }
+    }
+    {
+      int const x_9 = i;
+      i = (x_9 + 1);
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-loops-in-switch/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/unreachable-loops-in-switch/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..74f2106
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-loops-in-switch/0.spvasm.expected.spvasm
@@ -0,0 +1,155 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 86
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %data "data"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %15 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%_ptr_Function__arr_float_uint_1 = OpTypePointer Function %_arr_float_uint_1
+         %21 = OpConstantNull %_arr_float_uint_1
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %24 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+%_ptr_Function_float = OpTypePointer Function %float
+      %false = OpConstantFalse %bool
+       %true = OpConstantTrue %bool
+    %float_2 = OpConstant %float 2
+   %main_out = OpTypeStruct %v4float
+         %74 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %15
+       %data = OpVariable %_ptr_Function__arr_float_uint_1 Function %21
+               OpStore %x_GLF_color %24
+               OpStore %i %int_0
+               OpBranch %26
+         %26 = OpLabel
+               OpLoopMerge %27 %28 None
+               OpBranch %29
+         %29 = OpLabel
+         %30 = OpLoad %int %i
+         %32 = OpSLessThan %bool %30 %int_1
+               OpSelectionMerge %34 None
+               OpBranchConditional %32 %35 %36
+         %35 = OpLabel
+               OpBranch %34
+         %36 = OpLabel
+               OpBranch %27
+         %34 = OpLabel
+         %37 = OpLoad %int %i
+         %39 = OpAccessChain %_ptr_Function_float %data %37
+         %40 = OpLoad %float %39
+         %41 = OpAccessChain %_ptr_Function_float %data %int_0
+         %42 = OpLoad %float %41
+         %43 = OpFOrdLessThan %bool %40 %42
+               OpSelectionMerge %44 None
+               OpBranchConditional %43 %45 %44
+         %45 = OpLabel
+               OpSelectionMerge %47 None
+               OpBranchConditional %false %48 %47
+         %48 = OpLabel
+         %49 = OpLoad %int %i
+         %50 = OpConvertSToF %float %49
+         %51 = OpFOrdGreaterThanEqual %bool %50 %float_1
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %52
+         %53 = OpLabel
+               OpBranch %52
+         %52 = OpLabel
+               OpBranch %47
+         %47 = OpLabel
+               OpSelectionMerge %54 None
+               OpSwitch %int_0 %55 1 %56 0 %57
+         %56 = OpLabel
+               OpBranch %58
+         %58 = OpLabel
+               OpLoopMerge %59 %60 None
+               OpBranch %61
+         %61 = OpLabel
+               OpSelectionMerge %63 None
+               OpBranchConditional %true %64 %65
+         %64 = OpLabel
+               OpBranch %63
+         %65 = OpLabel
+               OpBranch %59
+         %63 = OpLabel
+               OpBranch %60
+         %60 = OpLabel
+               OpBranch %58
+         %59 = OpLabel
+               OpBranch %66
+         %66 = OpLabel
+               OpLoopMerge %67 %68 None
+               OpBranch %69
+         %69 = OpLabel
+               OpBranch %68
+         %68 = OpLabel
+               OpBranch %66
+         %67 = OpLabel
+               OpBranch %57
+         %57 = OpLabel
+         %70 = OpAccessChain %_ptr_Function_float %data %int_0
+               OpStore %70 %float_2
+               OpBranch %54
+         %55 = OpLabel
+               OpBranch %54
+         %54 = OpLabel
+               OpBranch %44
+         %44 = OpLabel
+               OpBranch %28
+         %28 = OpLabel
+         %72 = OpLoad %int %i
+         %73 = OpIAdd %int %72 %int_1
+               OpStore %i %73
+               OpBranch %26
+         %27 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %74
+%tint_symbol = OpFunctionParameter %main_out
+         %78 = OpLabel
+         %79 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %79
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %81 = OpLabel
+         %82 = OpFunctionCall %void %main_1
+         %84 = OpLoad %v4float %x_GLF_color
+         %85 = OpCompositeConstruct %main_out %84
+         %83 = OpFunctionCall %void %tint_symbol_2 %85
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-loops-in-switch/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/unreachable-loops-in-switch/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..27a00c6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-loops-in-switch/0.spvasm.expected.wgsl
@@ -0,0 +1,60 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  var data : array<f32, 1>;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  i = 0;
+  loop {
+    let x_6 : i32 = i;
+    if ((x_6 < 1)) {
+    } else {
+      break;
+    }
+    let x_7 : i32 = i;
+    let x_40 : f32 = data[x_7];
+    let x_42 : f32 = data[0];
+    if ((x_40 < x_42)) {
+      if (false) {
+        let x_8 : i32 = i;
+        if ((f32(x_8) >= 1.0)) {
+        }
+      }
+      switch(0) {
+        case 1: {
+          loop {
+            if (true) {
+            } else {
+              break;
+            }
+          }
+          loop {
+          }
+          fallthrough;
+        }
+        case 0: {
+          data[0] = 2.0;
+        }
+        default: {
+        }
+      }
+    }
+
+    continuing {
+      let x_9 : i32 = i;
+      i = (x_9 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-loops-in-switch/0.wgsl b/test/vk-gl-cts/graphicsfuzz/unreachable-loops-in-switch/0.wgsl
new file mode 100644
index 0000000..27a00c6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-loops-in-switch/0.wgsl
@@ -0,0 +1,60 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  var data : array<f32, 1>;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  i = 0;
+  loop {
+    let x_6 : i32 = i;
+    if ((x_6 < 1)) {
+    } else {
+      break;
+    }
+    let x_7 : i32 = i;
+    let x_40 : f32 = data[x_7];
+    let x_42 : f32 = data[0];
+    if ((x_40 < x_42)) {
+      if (false) {
+        let x_8 : i32 = i;
+        if ((f32(x_8) >= 1.0)) {
+        }
+      }
+      switch(0) {
+        case 1: {
+          loop {
+            if (true) {
+            } else {
+              break;
+            }
+          }
+          loop {
+          }
+          fallthrough;
+        }
+        case 0: {
+          data[0] = 2.0;
+        }
+        default: {
+        }
+      }
+    }
+
+    continuing {
+      let x_9 : i32 = i;
+      i = (x_9 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-loops-in-switch/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/unreachable-loops-in-switch/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..49336f5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-loops-in-switch/0.wgsl.expected.hlsl
@@ -0,0 +1,55 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int i = 0;
+  float data[1] = (float[1])0;
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  i = 0;
+  {
+    for(; (i < 1); i = (i + 1)) {
+      const float x_40 = data[i];
+      const float x_42 = data[0];
+      if ((x_40 < x_42)) {
+        if (false) {
+          if ((float(i) >= 1.0f)) {
+          }
+        }
+        switch(0) {
+          case 1: {
+            while (true) {
+              if (true) {
+              } else {
+                break;
+              }
+            }
+            while (true) {
+            }
+            /* fallthrough */
+          }
+          case 0: {
+            data[0] = 2.0f;
+            break;
+          }
+          default: {
+            break;
+          }
+        }
+      }
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-loops-in-switch/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/unreachable-loops-in-switch/0.wgsl.expected.msl
new file mode 100644
index 0000000..cc9b3ff
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-loops-in-switch/0.wgsl.expected.msl
@@ -0,0 +1,70 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  float arr[1];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  int i = 0;
+  tint_array_wrapper data = {};
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  i = 0;
+  while (true) {
+    int const x_6 = i;
+    if ((x_6 < 1)) {
+    } else {
+      break;
+    }
+    int const x_7 = i;
+    float const x_40 = data.arr[x_7];
+    float const x_42 = data.arr[0];
+    if ((x_40 < x_42)) {
+      if (false) {
+        int const x_8 = i;
+        if ((float(x_8) >= 1.0f)) {
+        }
+      }
+      switch(0) {
+        case 1: {
+          while (true) {
+            if (true) {
+            } else {
+              break;
+            }
+          }
+          while (true) {
+          }
+          /* fallthrough */
+        }
+        case 0: {
+          data.arr[0] = 2.0f;
+          break;
+        }
+        default: {
+          break;
+        }
+      }
+    }
+    {
+      int const x_9 = i;
+      i = (x_9 + 1);
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-loops-in-switch/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/unreachable-loops-in-switch/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..74f2106
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-loops-in-switch/0.wgsl.expected.spvasm
@@ -0,0 +1,155 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 86
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %data "data"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %15 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%_ptr_Function__arr_float_uint_1 = OpTypePointer Function %_arr_float_uint_1
+         %21 = OpConstantNull %_arr_float_uint_1
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %24 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+%_ptr_Function_float = OpTypePointer Function %float
+      %false = OpConstantFalse %bool
+       %true = OpConstantTrue %bool
+    %float_2 = OpConstant %float 2
+   %main_out = OpTypeStruct %v4float
+         %74 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+          %i = OpVariable %_ptr_Function_int Function %15
+       %data = OpVariable %_ptr_Function__arr_float_uint_1 Function %21
+               OpStore %x_GLF_color %24
+               OpStore %i %int_0
+               OpBranch %26
+         %26 = OpLabel
+               OpLoopMerge %27 %28 None
+               OpBranch %29
+         %29 = OpLabel
+         %30 = OpLoad %int %i
+         %32 = OpSLessThan %bool %30 %int_1
+               OpSelectionMerge %34 None
+               OpBranchConditional %32 %35 %36
+         %35 = OpLabel
+               OpBranch %34
+         %36 = OpLabel
+               OpBranch %27
+         %34 = OpLabel
+         %37 = OpLoad %int %i
+         %39 = OpAccessChain %_ptr_Function_float %data %37
+         %40 = OpLoad %float %39
+         %41 = OpAccessChain %_ptr_Function_float %data %int_0
+         %42 = OpLoad %float %41
+         %43 = OpFOrdLessThan %bool %40 %42
+               OpSelectionMerge %44 None
+               OpBranchConditional %43 %45 %44
+         %45 = OpLabel
+               OpSelectionMerge %47 None
+               OpBranchConditional %false %48 %47
+         %48 = OpLabel
+         %49 = OpLoad %int %i
+         %50 = OpConvertSToF %float %49
+         %51 = OpFOrdGreaterThanEqual %bool %50 %float_1
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %52
+         %53 = OpLabel
+               OpBranch %52
+         %52 = OpLabel
+               OpBranch %47
+         %47 = OpLabel
+               OpSelectionMerge %54 None
+               OpSwitch %int_0 %55 1 %56 0 %57
+         %56 = OpLabel
+               OpBranch %58
+         %58 = OpLabel
+               OpLoopMerge %59 %60 None
+               OpBranch %61
+         %61 = OpLabel
+               OpSelectionMerge %63 None
+               OpBranchConditional %true %64 %65
+         %64 = OpLabel
+               OpBranch %63
+         %65 = OpLabel
+               OpBranch %59
+         %63 = OpLabel
+               OpBranch %60
+         %60 = OpLabel
+               OpBranch %58
+         %59 = OpLabel
+               OpBranch %66
+         %66 = OpLabel
+               OpLoopMerge %67 %68 None
+               OpBranch %69
+         %69 = OpLabel
+               OpBranch %68
+         %68 = OpLabel
+               OpBranch %66
+         %67 = OpLabel
+               OpBranch %57
+         %57 = OpLabel
+         %70 = OpAccessChain %_ptr_Function_float %data %int_0
+               OpStore %70 %float_2
+               OpBranch %54
+         %55 = OpLabel
+               OpBranch %54
+         %54 = OpLabel
+               OpBranch %44
+         %44 = OpLabel
+               OpBranch %28
+         %28 = OpLabel
+         %72 = OpLoad %int %i
+         %73 = OpIAdd %int %72 %int_1
+               OpStore %i %73
+               OpBranch %26
+         %27 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %74
+%tint_symbol = OpFunctionParameter %main_out
+         %78 = OpLabel
+         %79 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %79
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %81 = OpLabel
+         %82 = OpFunctionCall %void %main_1
+         %84 = OpLoad %v4float %x_GLF_color
+         %85 = OpCompositeConstruct %main_out %84
+         %83 = OpFunctionCall %void %tint_symbol_2 %85
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-loops-in-switch/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/unreachable-loops-in-switch/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..27a00c6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-loops-in-switch/0.wgsl.expected.wgsl
@@ -0,0 +1,60 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var i : i32;
+  var data : array<f32, 1>;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  i = 0;
+  loop {
+    let x_6 : i32 = i;
+    if ((x_6 < 1)) {
+    } else {
+      break;
+    }
+    let x_7 : i32 = i;
+    let x_40 : f32 = data[x_7];
+    let x_42 : f32 = data[0];
+    if ((x_40 < x_42)) {
+      if (false) {
+        let x_8 : i32 = i;
+        if ((f32(x_8) >= 1.0)) {
+        }
+      }
+      switch(0) {
+        case 1: {
+          loop {
+            if (true) {
+            } else {
+              break;
+            }
+          }
+          loop {
+          }
+          fallthrough;
+        }
+        case 0: {
+          data[0] = 2.0;
+        }
+        default: {
+        }
+      }
+    }
+
+    continuing {
+      let x_9 : i32 = i;
+      i = (x_9 + 1);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-loops/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/unreachable-loops/0-opt.spvasm
new file mode 100644
index 0000000..66d7a31
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-loops/0-opt.spvasm
@@ -0,0 +1,80 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injected"
+               OpName %_ ""
+               OpName %m "m"
+               OpDecorate %_GLF_color Location 0
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %m RelaxedPrecision
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %14 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+       %true = OpConstantTrue %bool
+       %main = OpFunction %void None %8
+         %28 = OpLabel
+          %m = OpVariable %_ptr_Function_int Function
+               OpStore %_GLF_color %14
+         %29 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %30 = OpLoad %float %29
+         %31 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %32 = OpLoad %float %31
+         %33 = OpFOrdGreaterThan %bool %30 %32
+               OpSelectionMerge %34 None
+               OpBranchConditional %33 %35 %34
+         %35 = OpLabel
+               OpBranch %36
+         %36 = OpLabel
+               OpLoopMerge %37 %38 None
+               OpBranch %39
+         %39 = OpLabel
+               OpBranch %38
+         %38 = OpLabel
+               OpBranchConditional %false %36 %37
+         %37 = OpLabel
+               OpStore %m %int_1
+               OpBranch %40
+         %40 = OpLabel
+               OpLoopMerge %41 %42 None
+               OpBranch %43
+         %43 = OpLabel
+               OpBranchConditional %true %44 %41
+         %44 = OpLabel
+               OpStore %_GLF_color %14
+               OpBranch %42
+         %42 = OpLabel
+               OpBranch %40
+         %41 = OpLabel
+               OpBranch %34
+         %34 = OpLabel
+               OpReturn
+               OpFunctionEnd
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
new file mode 100755
index 0000000..807cb12
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-loops/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,52 @@
+SKIP: FAILED
+
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+
+void main_1() {
+  int m = 0;
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  const float x_30 = asfloat(x_5[0].x);
+  const float x_32 = asfloat(x_5[0].y);
+  if ((x_30 > x_32)) {
+    while (true) {
+      {
+        if (false) {
+        } else {
+          break;
+        }
+      }
+    }
+    m = 1;
+    while (true) {
+      if (true) {
+      } else {
+        break;
+      }
+      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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
+error: validation errors
+T:\tmp\u8hw.0:39: error: Loop must have break.
+Validation failed.
+
+
+
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-loops/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/unreachable-loops/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..da051cd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-loops/0-opt.spvasm.expected.msl
@@ -0,0 +1,47 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injected;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  int m = 0;
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  float const x_30 = x_5.injected.x;
+  float const x_32 = x_5.injected.y;
+  if ((x_30 > x_32)) {
+    while (true) {
+      {
+        if (false) {
+        } else {
+          break;
+        }
+      }
+    }
+    m = 1;
+    while (true) {
+      if (true) {
+      } else {
+        break;
+      }
+      *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-loops/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/unreachable-loops/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..65afab8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-loops/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,127 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 64
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injected"
+               OpName %x_5 "x_5"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %m "m"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %19 = OpConstantNull %int
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %22 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+      %int_1 = OpConstant %int 1
+       %true = OpConstantTrue %bool
+   %main_out = OpTypeStruct %v4float
+         %52 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %m = OpVariable %_ptr_Function_int Function %19
+               OpStore %x_GLF_color %22
+         %26 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %uint_0
+         %27 = OpLoad %float %26
+         %29 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %uint_1
+         %30 = OpLoad %float %29
+         %31 = OpFOrdGreaterThan %bool %27 %30
+               OpSelectionMerge %33 None
+               OpBranchConditional %31 %34 %33
+         %34 = OpLabel
+               OpBranch %35
+         %35 = OpLabel
+               OpLoopMerge %36 %37 None
+               OpBranch %38
+         %38 = OpLabel
+               OpBranch %37
+         %37 = OpLabel
+               OpSelectionMerge %40 None
+               OpBranchConditional %false %41 %42
+         %41 = OpLabel
+               OpBranch %40
+         %42 = OpLabel
+               OpBranch %36
+         %40 = OpLabel
+               OpBranch %35
+         %36 = OpLabel
+               OpStore %m %int_1
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+               OpSelectionMerge %49 None
+               OpBranchConditional %true %50 %51
+         %50 = OpLabel
+               OpBranch %49
+         %51 = OpLabel
+               OpBranch %45
+         %49 = OpLabel
+               OpStore %x_GLF_color %22
+               OpBranch %46
+         %46 = OpLabel
+               OpBranch %44
+         %45 = OpLabel
+               OpBranch %33
+         %33 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %52
+%tint_symbol = OpFunctionParameter %main_out
+         %56 = OpLabel
+         %57 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %57
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %59 = OpLabel
+         %60 = OpFunctionCall %void %main_1
+         %62 = OpLoad %v4float %x_GLF_color
+         %63 = OpCompositeConstruct %main_out %62
+         %61 = OpFunctionCall %void %tint_symbol_2 %63
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 37[%37] is not post dominated by the back-edge block 40[%40]
+  %40 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-loops/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/unreachable-loops/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..204bbae
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-loops/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,46 @@
+[[block]]
+struct buf0 {
+  injected : vec2<f32>;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+fn main_1() {
+  var m : i32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  let x_30 : f32 = x_5.injected.x;
+  let x_32 : f32 = x_5.injected.y;
+  if ((x_30 > x_32)) {
+    loop {
+
+      continuing {
+        if (false) {
+        } else {
+          break;
+        }
+      }
+    }
+    m = 1;
+    loop {
+      if (true) {
+      } else {
+        break;
+      }
+      x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-loops/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/unreachable-loops/0-opt.wgsl
new file mode 100644
index 0000000..204bbae
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-loops/0-opt.wgsl
@@ -0,0 +1,46 @@
+[[block]]
+struct buf0 {
+  injected : vec2<f32>;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+fn main_1() {
+  var m : i32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  let x_30 : f32 = x_5.injected.x;
+  let x_32 : f32 = x_5.injected.y;
+  if ((x_30 > x_32)) {
+    loop {
+
+      continuing {
+        if (false) {
+        } else {
+          break;
+        }
+      }
+    }
+    m = 1;
+    loop {
+      if (true) {
+      } else {
+        break;
+      }
+      x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
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
new file mode 100755
index 0000000..a35bdfc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-loops/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,52 @@
+SKIP: FAILED
+
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_5 : register(b0, space0) {
+  uint4 x_5[1];
+};
+
+void main_1() {
+  int m = 0;
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  const float x_30 = asfloat(x_5[0].x);
+  const float x_32 = asfloat(x_5[0].y);
+  if ((x_30 > x_32)) {
+    while (true) {
+      {
+        if (false) {
+        } else {
+          break;
+        }
+      }
+    }
+    m = 1;
+    while (true) {
+      if (true) {
+      } else {
+        break;
+      }
+      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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
+error: validation errors
+T:\tmp\u7ck.0:39: error: Loop must have break.
+Validation failed.
+
+
+
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-loops/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/unreachable-loops/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..da051cd
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-loops/0-opt.wgsl.expected.msl
@@ -0,0 +1,47 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injected;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_5, thread float4* const tint_symbol_4) {
+  int m = 0;
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  float const x_30 = x_5.injected.x;
+  float const x_32 = x_5.injected.y;
+  if ((x_30 > x_32)) {
+    while (true) {
+      {
+        if (false) {
+        } else {
+          break;
+        }
+      }
+    }
+    m = 1;
+    while (true) {
+      if (true) {
+      } else {
+        break;
+      }
+      *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_5, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-loops/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/unreachable-loops/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..65afab8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-loops/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,127 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 64
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injected"
+               OpName %x_5 "x_5"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %m "m"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_5 NonWritable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_5 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %19 = OpConstantNull %int
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %22 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+       %bool = OpTypeBool
+      %false = OpConstantFalse %bool
+      %int_1 = OpConstant %int 1
+       %true = OpConstantTrue %bool
+   %main_out = OpTypeStruct %v4float
+         %52 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %m = OpVariable %_ptr_Function_int Function %19
+               OpStore %x_GLF_color %22
+         %26 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %uint_0
+         %27 = OpLoad %float %26
+         %29 = OpAccessChain %_ptr_Uniform_float %x_5 %uint_0 %uint_1
+         %30 = OpLoad %float %29
+         %31 = OpFOrdGreaterThan %bool %27 %30
+               OpSelectionMerge %33 None
+               OpBranchConditional %31 %34 %33
+         %34 = OpLabel
+               OpBranch %35
+         %35 = OpLabel
+               OpLoopMerge %36 %37 None
+               OpBranch %38
+         %38 = OpLabel
+               OpBranch %37
+         %37 = OpLabel
+               OpSelectionMerge %40 None
+               OpBranchConditional %false %41 %42
+         %41 = OpLabel
+               OpBranch %40
+         %42 = OpLabel
+               OpBranch %36
+         %40 = OpLabel
+               OpBranch %35
+         %36 = OpLabel
+               OpStore %m %int_1
+               OpBranch %44
+         %44 = OpLabel
+               OpLoopMerge %45 %46 None
+               OpBranch %47
+         %47 = OpLabel
+               OpSelectionMerge %49 None
+               OpBranchConditional %true %50 %51
+         %50 = OpLabel
+               OpBranch %49
+         %51 = OpLabel
+               OpBranch %45
+         %49 = OpLabel
+               OpStore %x_GLF_color %22
+               OpBranch %46
+         %46 = OpLabel
+               OpBranch %44
+         %45 = OpLabel
+               OpBranch %33
+         %33 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %52
+%tint_symbol = OpFunctionParameter %main_out
+         %56 = OpLabel
+         %57 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %57
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %59 = OpLabel
+         %60 = OpFunctionCall %void %main_1
+         %62 = OpLoad %v4float %x_GLF_color
+         %63 = OpCompositeConstruct %main_out %62
+         %61 = OpFunctionCall %void %tint_symbol_2 %63
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 37[%37] is not post dominated by the back-edge block 40[%40]
+  %40 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-loops/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/unreachable-loops/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..204bbae
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-loops/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,46 @@
+[[block]]
+struct buf0 {
+  injected : vec2<f32>;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_5 : buf0;
+
+fn main_1() {
+  var m : i32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  let x_30 : f32 = x_5.injected.x;
+  let x_32 : f32 = x_5.injected.y;
+  if ((x_30 > x_32)) {
+    loop {
+
+      continuing {
+        if (false) {
+        } else {
+          break;
+        }
+      }
+    }
+    m = 1;
+    loop {
+      if (true) {
+      } else {
+        break;
+      }
+      x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-return-in-loop/0.spvasm b/test/vk-gl-cts/graphicsfuzz/unreachable-return-in-loop/0.spvasm
new file mode 100644
index 0000000..4ec26d6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-return-in-loop/0.spvasm
@@ -0,0 +1,53 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %5 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %int_1 = OpConstant %int 1
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %15 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %false = OpConstantFalse %bool
+       %true = OpConstantTrue %bool
+         %18 = OpUndef %bool
+       %main = OpFunction %void None %5
+         %19 = OpLabel
+               OpBranch %20
+         %20 = OpLabel
+         %21 = OpPhi %bool %false %19 %18 %22
+               OpLoopMerge %23 %22 None
+               OpBranch %24
+         %24 = OpLabel
+         %25 = OpPhi %bool %21 %20 %18 %26
+         %27 = OpSLessThan %bool %int_1 %int_0
+               OpLoopMerge %28 %26 None
+               OpBranchConditional %27 %29 %28
+         %29 = OpLabel
+               OpBranch %28
+         %26 = OpLabel
+               OpBranch %24
+         %28 = OpLabel
+         %30 = OpPhi %bool %25 %24 %true %29
+               OpSelectionMerge %31 None
+               OpBranchConditional %30 %23 %31
+         %31 = OpLabel
+               OpStore %_GLF_color %15
+               OpBranch %23
+         %22 = OpLabel
+               OpBranch %20
+         %23 = OpLabel
+               OpReturn
+               OpFunctionEnd
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
new file mode 100755
index 0000000..423d101
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-return-in-loop/0.spvasm.expected.hlsl
@@ -0,0 +1,52 @@
+SKIP: FAILED
+
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  bool x_21_phi = false;
+  x_21_phi = false;
+  while (true) {
+    bool x_25 = false;
+    bool x_25_phi = false;
+    bool x_30_phi = false;
+    x_25_phi = x_21_phi;
+    while (true) {
+      x_25 = x_25_phi;
+      x_30_phi = x_25;
+      if ((1 < 0)) {
+      } else {
+        break;
+      }
+      x_30_phi = true;
+      break;
+      {
+        x_25_phi = false;
+      }
+    }
+    if (x_30_phi) {
+      break;
+    }
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    break;
+    {
+      x_21_phi = false;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
+Internal compiler error: access violation. Attempted to read from address 0x0000000000000048
+
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-return-in-loop/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/unreachable-return-in-loop/0.spvasm.expected.msl
new file mode 100644
index 0000000..1daa960
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-return-in-loop/0.spvasm.expected.msl
@@ -0,0 +1,53 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  bool x_21_phi = false;
+  x_21_phi = false;
+  while (true) {
+    bool x_25 = false;
+    bool x_25_phi = false;
+    bool x_30_phi = false;
+    bool const x_21 = x_21_phi;
+    x_25_phi = x_21;
+    while (true) {
+      x_25 = x_25_phi;
+      x_30_phi = x_25;
+      if ((1 < 0)) {
+      } else {
+        break;
+      }
+      x_30_phi = true;
+      break;
+      {
+        x_25_phi = false;
+      }
+    }
+    bool const x_30 = x_30_phi;
+    if (x_30) {
+      break;
+    }
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    break;
+    {
+      x_21_phi = false;
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-return-in-loop/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/unreachable-return-in-loop/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..335fc7b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-return-in-loop/0.spvasm.expected.spvasm
@@ -0,0 +1,111 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 57
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_21_phi "x_21_phi"
+               OpName %x_25 "x_25"
+               OpName %x_25_phi "x_25_phi"
+               OpName %x_30_phi "x_30_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %15 = OpConstantNull %bool
+      %false = OpConstantFalse %bool
+        %int = OpTypeInt 32 1
+      %int_1 = OpConstant %int 1
+      %int_0 = OpConstant %int 0
+       %true = OpConstantTrue %bool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %44 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %45 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+   %x_21_phi = OpVariable %_ptr_Function_bool Function %15
+       %x_25 = OpVariable %_ptr_Function_bool Function %15
+   %x_25_phi = OpVariable %_ptr_Function_bool Function %15
+   %x_30_phi = OpVariable %_ptr_Function_bool Function %15
+               OpStore %x_21_phi %false
+               OpBranch %17
+         %17 = OpLabel
+               OpLoopMerge %18 %19 None
+               OpBranch %20
+         %20 = OpLabel
+         %24 = OpLoad %bool %x_21_phi
+               OpStore %x_25_phi %24
+               OpBranch %25
+         %25 = OpLabel
+               OpLoopMerge %26 %27 None
+               OpBranch %28
+         %28 = OpLabel
+         %29 = OpLoad %bool %x_25_phi
+               OpStore %x_25 %29
+         %30 = OpLoad %bool %x_25
+               OpStore %x_30_phi %30
+         %34 = OpSLessThan %bool %int_1 %int_0
+               OpSelectionMerge %35 None
+               OpBranchConditional %34 %36 %37
+         %36 = OpLabel
+               OpBranch %35
+         %37 = OpLabel
+               OpBranch %26
+         %35 = OpLabel
+               OpStore %x_30_phi %true
+               OpBranch %26
+         %27 = OpLabel
+               OpStore %x_25_phi %false
+               OpBranch %25
+         %26 = OpLabel
+         %39 = OpLoad %bool %x_30_phi
+               OpSelectionMerge %40 None
+               OpBranchConditional %39 %41 %40
+         %41 = OpLabel
+               OpBranch %18
+         %40 = OpLabel
+               OpStore %x_GLF_color %44
+               OpBranch %18
+         %19 = OpLabel
+               OpStore %x_21_phi %false
+               OpBranch %17
+         %18 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %45
+%tint_symbol = OpFunctionParameter %main_out
+         %49 = OpLabel
+         %50 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %50
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %52 = OpLabel
+         %53 = OpFunctionCall %void %main_1
+         %55 = OpLoad %v4float %x_GLF_color
+         %56 = OpCompositeConstruct %main_out %55
+         %54 = OpFunctionCall %void %tint_symbol_2 %56
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-return-in-loop/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/unreachable-return-in-loop/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..005fa19
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-return-in-loop/0.spvasm.expected.wgsl
@@ -0,0 +1,49 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_21_phi : bool;
+  x_21_phi = false;
+  loop {
+    var x_25 : bool;
+    var x_25_phi : bool;
+    var x_30_phi : bool;
+    let x_21 : bool = x_21_phi;
+    x_25_phi = x_21;
+    loop {
+      x_25 = x_25_phi;
+      x_30_phi = x_25;
+      if ((1 < 0)) {
+      } else {
+        break;
+      }
+      x_30_phi = true;
+      break;
+
+      continuing {
+        x_25_phi = false;
+      }
+    }
+    let x_30 : bool = x_30_phi;
+    if (x_30) {
+      break;
+    }
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    break;
+
+    continuing {
+      x_21_phi = false;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-return-in-loop/0.wgsl b/test/vk-gl-cts/graphicsfuzz/unreachable-return-in-loop/0.wgsl
new file mode 100644
index 0000000..005fa19
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-return-in-loop/0.wgsl
@@ -0,0 +1,49 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_21_phi : bool;
+  x_21_phi = false;
+  loop {
+    var x_25 : bool;
+    var x_25_phi : bool;
+    var x_30_phi : bool;
+    let x_21 : bool = x_21_phi;
+    x_25_phi = x_21;
+    loop {
+      x_25 = x_25_phi;
+      x_30_phi = x_25;
+      if ((1 < 0)) {
+      } else {
+        break;
+      }
+      x_30_phi = true;
+      break;
+
+      continuing {
+        x_25_phi = false;
+      }
+    }
+    let x_30 : bool = x_30_phi;
+    if (x_30) {
+      break;
+    }
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    break;
+
+    continuing {
+      x_21_phi = false;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
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
new file mode 100755
index 0000000..423d101
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-return-in-loop/0.wgsl.expected.hlsl
@@ -0,0 +1,52 @@
+SKIP: FAILED
+
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  bool x_21_phi = false;
+  x_21_phi = false;
+  while (true) {
+    bool x_25 = false;
+    bool x_25_phi = false;
+    bool x_30_phi = false;
+    x_25_phi = x_21_phi;
+    while (true) {
+      x_25 = x_25_phi;
+      x_30_phi = x_25;
+      if ((1 < 0)) {
+      } else {
+        break;
+      }
+      x_30_phi = true;
+      break;
+      {
+        x_25_phi = false;
+      }
+    }
+    if (x_30_phi) {
+      break;
+    }
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    break;
+    {
+      x_21_phi = false;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
+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.msl b/test/vk-gl-cts/graphicsfuzz/unreachable-return-in-loop/0.wgsl.expected.msl
new file mode 100644
index 0000000..1daa960
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-return-in-loop/0.wgsl.expected.msl
@@ -0,0 +1,53 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  bool x_21_phi = false;
+  x_21_phi = false;
+  while (true) {
+    bool x_25 = false;
+    bool x_25_phi = false;
+    bool x_30_phi = false;
+    bool const x_21 = x_21_phi;
+    x_25_phi = x_21;
+    while (true) {
+      x_25 = x_25_phi;
+      x_30_phi = x_25;
+      if ((1 < 0)) {
+      } else {
+        break;
+      }
+      x_30_phi = true;
+      break;
+      {
+        x_25_phi = false;
+      }
+    }
+    bool const x_30 = x_30_phi;
+    if (x_30) {
+      break;
+    }
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    break;
+    {
+      x_21_phi = false;
+    }
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-return-in-loop/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/unreachable-return-in-loop/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..335fc7b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-return-in-loop/0.wgsl.expected.spvasm
@@ -0,0 +1,111 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 57
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %x_21_phi "x_21_phi"
+               OpName %x_25 "x_25"
+               OpName %x_25_phi "x_25_phi"
+               OpName %x_30_phi "x_30_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %15 = OpConstantNull %bool
+      %false = OpConstantFalse %bool
+        %int = OpTypeInt 32 1
+      %int_1 = OpConstant %int 1
+      %int_0 = OpConstant %int 0
+       %true = OpConstantTrue %bool
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %44 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %45 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+   %x_21_phi = OpVariable %_ptr_Function_bool Function %15
+       %x_25 = OpVariable %_ptr_Function_bool Function %15
+   %x_25_phi = OpVariable %_ptr_Function_bool Function %15
+   %x_30_phi = OpVariable %_ptr_Function_bool Function %15
+               OpStore %x_21_phi %false
+               OpBranch %17
+         %17 = OpLabel
+               OpLoopMerge %18 %19 None
+               OpBranch %20
+         %20 = OpLabel
+         %24 = OpLoad %bool %x_21_phi
+               OpStore %x_25_phi %24
+               OpBranch %25
+         %25 = OpLabel
+               OpLoopMerge %26 %27 None
+               OpBranch %28
+         %28 = OpLabel
+         %29 = OpLoad %bool %x_25_phi
+               OpStore %x_25 %29
+         %30 = OpLoad %bool %x_25
+               OpStore %x_30_phi %30
+         %34 = OpSLessThan %bool %int_1 %int_0
+               OpSelectionMerge %35 None
+               OpBranchConditional %34 %36 %37
+         %36 = OpLabel
+               OpBranch %35
+         %37 = OpLabel
+               OpBranch %26
+         %35 = OpLabel
+               OpStore %x_30_phi %true
+               OpBranch %26
+         %27 = OpLabel
+               OpStore %x_25_phi %false
+               OpBranch %25
+         %26 = OpLabel
+         %39 = OpLoad %bool %x_30_phi
+               OpSelectionMerge %40 None
+               OpBranchConditional %39 %41 %40
+         %41 = OpLabel
+               OpBranch %18
+         %40 = OpLabel
+               OpStore %x_GLF_color %44
+               OpBranch %18
+         %19 = OpLabel
+               OpStore %x_21_phi %false
+               OpBranch %17
+         %18 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %45
+%tint_symbol = OpFunctionParameter %main_out
+         %49 = OpLabel
+         %50 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %50
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %52 = OpLabel
+         %53 = OpFunctionCall %void %main_1
+         %55 = OpLoad %v4float %x_GLF_color
+         %56 = OpCompositeConstruct %main_out %55
+         %54 = OpFunctionCall %void %tint_symbol_2 %56
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/unreachable-return-in-loop/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/unreachable-return-in-loop/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..005fa19
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/unreachable-return-in-loop/0.wgsl.expected.wgsl
@@ -0,0 +1,49 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var x_21_phi : bool;
+  x_21_phi = false;
+  loop {
+    var x_25 : bool;
+    var x_25_phi : bool;
+    var x_30_phi : bool;
+    let x_21 : bool = x_21_phi;
+    x_25_phi = x_21;
+    loop {
+      x_25 = x_25_phi;
+      x_30_phi = x_25;
+      if ((1 < 0)) {
+      } else {
+        break;
+      }
+      x_30_phi = true;
+      break;
+
+      continuing {
+        x_25_phi = false;
+      }
+    }
+    let x_30 : bool = x_30_phi;
+    if (x_30) {
+      break;
+    }
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    break;
+
+    continuing {
+      x_21_phi = false;
+    }
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/uv-value-comparison-as-boolean/0.spvasm b/test/vk-gl-cts/graphicsfuzz/uv-value-comparison-as-boolean/0.spvasm
new file mode 100644
index 0000000..7284b6b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/uv-value-comparison-as-boolean/0.spvasm
@@ -0,0 +1,74 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %c1 "c1"
+               OpName %uv "uv"
+               OpName %i "i"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %i RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %7 RelaxedPrecision
+               OpDecorate %8 RelaxedPrecision
+               OpDecorate %9 RelaxedPrecision
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_float = OpTypePointer Function %float
+ %float_0_25 = OpConstant %float 0.25
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %29 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %30 = OpUndef %int
+         %31 = OpUndef %bool
+       %main = OpFunction %void None %11
+         %32 = OpLabel
+         %c1 = OpVariable %_ptr_Function_bool Function
+         %uv = OpVariable %_ptr_Function_v2float Function
+          %i = OpVariable %_ptr_Function_int Function
+         %33 = OpAccessChain %_ptr_Function_float %uv %uint_1
+         %34 = OpLoad %float %33
+         %35 = OpFOrdLessThan %bool %34 %float_0_25
+               OpStore %c1 %35
+               OpStore %i %int_0
+               OpBranch %36
+         %36 = OpLabel
+         %37 = OpPhi %bool %35 %32 %31 %38
+          %9 = OpPhi %int %int_0 %32 %30 %38
+               OpLoopMerge %39 %38 None
+               OpBranch %40
+         %40 = OpLabel
+         %41 = OpSLessThan %bool %9 %int_1
+               OpBranchConditional %41 %42 %39
+         %42 = OpLabel
+               OpStore %_GLF_color %29
+               OpReturn
+         %38 = OpLabel
+          %7 = OpLoad %int %i
+          %8 = OpIAdd %int %7 %int_1
+               OpStore %i %8
+               OpBranch %36
+         %39 = OpLabel
+               OpSelectionMerge %43 None
+               OpBranchConditional %37 %44 %43
+         %44 = OpLabel
+               OpReturn
+         %43 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/uv-value-comparison-as-boolean/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/uv-value-comparison-as-boolean/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..49c10a4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/uv-value-comparison-as-boolean/0.spvasm.expected.hlsl
@@ -0,0 +1,48 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  bool c1 = false;
+  float2 uv = float2(0.0f, 0.0f);
+  int i = 0;
+  bool x_37 = false;
+  bool x_37_phi = false;
+  int x_9_phi = 0;
+  const float x_34 = uv.y;
+  const bool x_35 = (x_34 < 0.25f);
+  c1 = x_35;
+  i = 0;
+  x_37_phi = x_35;
+  x_9_phi = 0;
+  while (true) {
+    x_37 = x_37_phi;
+    if ((x_9_phi < 1)) {
+    } else {
+      break;
+    }
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    return;
+    {
+      i = (i + 1);
+      x_37_phi = false;
+      x_9_phi = 0;
+    }
+  }
+  if (x_37) {
+    return;
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/uv-value-comparison-as-boolean/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/uv-value-comparison-as-boolean/0.spvasm.expected.msl
new file mode 100644
index 0000000..04778b9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/uv-value-comparison-as-boolean/0.spvasm.expected.msl
@@ -0,0 +1,53 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  bool c1 = false;
+  float2 uv = 0.0f;
+  int i = 0;
+  bool x_37 = false;
+  bool x_37_phi = false;
+  int x_9_phi = 0;
+  float const x_34 = uv.y;
+  bool const x_35 = (x_34 < 0.25f);
+  c1 = x_35;
+  i = 0;
+  x_37_phi = x_35;
+  x_9_phi = 0;
+  while (true) {
+    x_37 = x_37_phi;
+    int const x_9 = x_9_phi;
+    if ((x_9 < 1)) {
+    } else {
+      break;
+    }
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    return;
+    {
+      int const x_7 = i;
+      i = (x_7 + 1);
+      x_37_phi = false;
+      x_9_phi = 0;
+    }
+  }
+  if (x_37) {
+    return;
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/uv-value-comparison-as-boolean/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/uv-value-comparison-as-boolean/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..d8fd878
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/uv-value-comparison-as-boolean/0.spvasm.expected.spvasm
@@ -0,0 +1,119 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 67
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %c1 "c1"
+               OpName %uv "uv"
+               OpName %i "i"
+               OpName %x_37 "x_37"
+               OpName %x_37_phi "x_37_phi"
+               OpName %x_9_phi "x_9_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %15 = OpConstantNull %bool
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %19 = OpConstantNull %v2float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_float = OpTypePointer Function %float
+ %float_0_25 = OpConstant %float 0.25
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %48 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %false = OpConstantFalse %bool
+   %main_out = OpTypeStruct %v4float
+         %55 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+         %c1 = OpVariable %_ptr_Function_bool Function %15
+         %uv = OpVariable %_ptr_Function_v2float Function %19
+          %i = OpVariable %_ptr_Function_int Function %23
+       %x_37 = OpVariable %_ptr_Function_bool Function %15
+   %x_37_phi = OpVariable %_ptr_Function_bool Function %15
+    %x_9_phi = OpVariable %_ptr_Function_int Function %23
+         %30 = OpAccessChain %_ptr_Function_float %uv %uint_1
+         %31 = OpLoad %float %30
+         %33 = OpFOrdLessThan %bool %31 %float_0_25
+               OpStore %c1 %33
+               OpStore %i %int_0
+               OpStore %x_37_phi %33
+               OpStore %x_9_phi %int_0
+               OpBranch %35
+         %35 = OpLabel
+               OpLoopMerge %36 %37 None
+               OpBranch %38
+         %38 = OpLabel
+         %39 = OpLoad %bool %x_37_phi
+               OpStore %x_37 %39
+         %40 = OpLoad %int %x_9_phi
+         %42 = OpSLessThan %bool %40 %int_1
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %45
+         %44 = OpLabel
+               OpBranch %43
+         %45 = OpLabel
+               OpBranch %36
+         %43 = OpLabel
+               OpStore %x_GLF_color %48
+               OpReturn
+         %37 = OpLabel
+         %49 = OpLoad %int %i
+         %50 = OpIAdd %int %49 %int_1
+               OpStore %i %50
+               OpStore %x_37_phi %false
+               OpStore %x_9_phi %int_0
+               OpBranch %35
+         %36 = OpLabel
+         %52 = OpLoad %bool %x_37
+               OpSelectionMerge %53 None
+               OpBranchConditional %52 %54 %53
+         %54 = OpLabel
+               OpReturn
+         %53 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %55
+%tint_symbol = OpFunctionParameter %main_out
+         %59 = OpLabel
+         %60 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %60
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %62 = OpLabel
+         %63 = OpFunctionCall %void %main_1
+         %65 = OpLoad %v4float %x_GLF_color
+         %66 = OpCompositeConstruct %main_out %65
+         %64 = OpFunctionCall %void %tint_symbol_2 %66
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/uv-value-comparison-as-boolean/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/uv-value-comparison-as-boolean/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..bd4cfad
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/uv-value-comparison-as-boolean/0.spvasm.expected.wgsl
@@ -0,0 +1,48 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var c1 : bool;
+  var uv : vec2<f32>;
+  var i : i32;
+  var x_37 : bool;
+  var x_37_phi : bool;
+  var x_9_phi : i32;
+  let x_34 : f32 = uv.y;
+  let x_35 : bool = (x_34 < 0.25);
+  c1 = x_35;
+  i = 0;
+  x_37_phi = x_35;
+  x_9_phi = 0;
+  loop {
+    x_37 = x_37_phi;
+    let x_9 : i32 = x_9_phi;
+    if ((x_9 < 1)) {
+    } else {
+      break;
+    }
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    return;
+
+    continuing {
+      let x_7 : i32 = i;
+      i = (x_7 + 1);
+      x_37_phi = false;
+      x_9_phi = 0;
+    }
+  }
+  if (x_37) {
+    return;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/uv-value-comparison-as-boolean/0.wgsl b/test/vk-gl-cts/graphicsfuzz/uv-value-comparison-as-boolean/0.wgsl
new file mode 100644
index 0000000..bd4cfad
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/uv-value-comparison-as-boolean/0.wgsl
@@ -0,0 +1,48 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var c1 : bool;
+  var uv : vec2<f32>;
+  var i : i32;
+  var x_37 : bool;
+  var x_37_phi : bool;
+  var x_9_phi : i32;
+  let x_34 : f32 = uv.y;
+  let x_35 : bool = (x_34 < 0.25);
+  c1 = x_35;
+  i = 0;
+  x_37_phi = x_35;
+  x_9_phi = 0;
+  loop {
+    x_37 = x_37_phi;
+    let x_9 : i32 = x_9_phi;
+    if ((x_9 < 1)) {
+    } else {
+      break;
+    }
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    return;
+
+    continuing {
+      let x_7 : i32 = i;
+      i = (x_7 + 1);
+      x_37_phi = false;
+      x_9_phi = 0;
+    }
+  }
+  if (x_37) {
+    return;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/uv-value-comparison-as-boolean/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/uv-value-comparison-as-boolean/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..49c10a4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/uv-value-comparison-as-boolean/0.wgsl.expected.hlsl
@@ -0,0 +1,48 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  bool c1 = false;
+  float2 uv = float2(0.0f, 0.0f);
+  int i = 0;
+  bool x_37 = false;
+  bool x_37_phi = false;
+  int x_9_phi = 0;
+  const float x_34 = uv.y;
+  const bool x_35 = (x_34 < 0.25f);
+  c1 = x_35;
+  i = 0;
+  x_37_phi = x_35;
+  x_9_phi = 0;
+  while (true) {
+    x_37 = x_37_phi;
+    if ((x_9_phi < 1)) {
+    } else {
+      break;
+    }
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    return;
+    {
+      i = (i + 1);
+      x_37_phi = false;
+      x_9_phi = 0;
+    }
+  }
+  if (x_37) {
+    return;
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/uv-value-comparison-as-boolean/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/uv-value-comparison-as-boolean/0.wgsl.expected.msl
new file mode 100644
index 0000000..04778b9
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/uv-value-comparison-as-boolean/0.wgsl.expected.msl
@@ -0,0 +1,53 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  bool c1 = false;
+  float2 uv = 0.0f;
+  int i = 0;
+  bool x_37 = false;
+  bool x_37_phi = false;
+  int x_9_phi = 0;
+  float const x_34 = uv.y;
+  bool const x_35 = (x_34 < 0.25f);
+  c1 = x_35;
+  i = 0;
+  x_37_phi = x_35;
+  x_9_phi = 0;
+  while (true) {
+    x_37 = x_37_phi;
+    int const x_9 = x_9_phi;
+    if ((x_9 < 1)) {
+    } else {
+      break;
+    }
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    return;
+    {
+      int const x_7 = i;
+      i = (x_7 + 1);
+      x_37_phi = false;
+      x_9_phi = 0;
+    }
+  }
+  if (x_37) {
+    return;
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/uv-value-comparison-as-boolean/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/uv-value-comparison-as-boolean/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..d8fd878
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/uv-value-comparison-as-boolean/0.wgsl.expected.spvasm
@@ -0,0 +1,119 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 67
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %c1 "c1"
+               OpName %uv "uv"
+               OpName %i "i"
+               OpName %x_37 "x_37"
+               OpName %x_37_phi "x_37_phi"
+               OpName %x_9_phi "x_9_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %15 = OpConstantNull %bool
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %19 = OpConstantNull %v2float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_float = OpTypePointer Function %float
+ %float_0_25 = OpConstant %float 0.25
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %48 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %false = OpConstantFalse %bool
+   %main_out = OpTypeStruct %v4float
+         %55 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+         %c1 = OpVariable %_ptr_Function_bool Function %15
+         %uv = OpVariable %_ptr_Function_v2float Function %19
+          %i = OpVariable %_ptr_Function_int Function %23
+       %x_37 = OpVariable %_ptr_Function_bool Function %15
+   %x_37_phi = OpVariable %_ptr_Function_bool Function %15
+    %x_9_phi = OpVariable %_ptr_Function_int Function %23
+         %30 = OpAccessChain %_ptr_Function_float %uv %uint_1
+         %31 = OpLoad %float %30
+         %33 = OpFOrdLessThan %bool %31 %float_0_25
+               OpStore %c1 %33
+               OpStore %i %int_0
+               OpStore %x_37_phi %33
+               OpStore %x_9_phi %int_0
+               OpBranch %35
+         %35 = OpLabel
+               OpLoopMerge %36 %37 None
+               OpBranch %38
+         %38 = OpLabel
+         %39 = OpLoad %bool %x_37_phi
+               OpStore %x_37 %39
+         %40 = OpLoad %int %x_9_phi
+         %42 = OpSLessThan %bool %40 %int_1
+               OpSelectionMerge %43 None
+               OpBranchConditional %42 %44 %45
+         %44 = OpLabel
+               OpBranch %43
+         %45 = OpLabel
+               OpBranch %36
+         %43 = OpLabel
+               OpStore %x_GLF_color %48
+               OpReturn
+         %37 = OpLabel
+         %49 = OpLoad %int %i
+         %50 = OpIAdd %int %49 %int_1
+               OpStore %i %50
+               OpStore %x_37_phi %false
+               OpStore %x_9_phi %int_0
+               OpBranch %35
+         %36 = OpLabel
+         %52 = OpLoad %bool %x_37
+               OpSelectionMerge %53 None
+               OpBranchConditional %52 %54 %53
+         %54 = OpLabel
+               OpReturn
+         %53 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %55
+%tint_symbol = OpFunctionParameter %main_out
+         %59 = OpLabel
+         %60 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %60
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %62 = OpLabel
+         %63 = OpFunctionCall %void %main_1
+         %65 = OpLoad %v4float %x_GLF_color
+         %66 = OpCompositeConstruct %main_out %65
+         %64 = OpFunctionCall %void %tint_symbol_2 %66
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/uv-value-comparison-as-boolean/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/uv-value-comparison-as-boolean/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..bd4cfad
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/uv-value-comparison-as-boolean/0.wgsl.expected.wgsl
@@ -0,0 +1,48 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var c1 : bool;
+  var uv : vec2<f32>;
+  var i : i32;
+  var x_37 : bool;
+  var x_37_phi : bool;
+  var x_9_phi : i32;
+  let x_34 : f32 = uv.y;
+  let x_35 : bool = (x_34 < 0.25);
+  c1 = x_35;
+  i = 0;
+  x_37_phi = x_35;
+  x_9_phi = 0;
+  loop {
+    x_37 = x_37_phi;
+    let x_9 : i32 = x_9_phi;
+    if ((x_9 < 1)) {
+    } else {
+      break;
+    }
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    return;
+
+    continuing {
+      let x_7 : i32 = i;
+      i = (x_7 + 1);
+      x_37_phi = false;
+      x_9_phi = 0;
+    }
+  }
+  if (x_37) {
+    return;
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/vector-values-multiplied-by-fragcoord/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/vector-values-multiplied-by-fragcoord/0-opt.spvasm
new file mode 100644
index 0000000..b5dc0a0
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/vector-values-multiplied-by-fragcoord/0-opt.spvasm
@@ -0,0 +1,195 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %func_ "func("
+               OpName %alwaysFalse "alwaysFalse"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %value "value"
+               OpName %a "a"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %count "count"
+               OpName %i_0 "i"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+         %17 = OpTypeFunction %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+   %float_n1 = OpConstant %float -1
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_2 = OpConstant %float 2
+         %34 = OpConstantComposite %v2float %float_2 %float_2
+%_ptr_Function_int = OpTypePointer Function %int
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+      %int_2 = OpConstant %int 2
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %44 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %45 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %15
+         %46 = OpLabel
+      %count = OpVariable %_ptr_Function_int Function
+        %i_0 = OpVariable %_ptr_Function_int Function
+               OpStore %count %int_0
+               OpStore %i_0 %int_0
+               OpBranch %47
+         %47 = OpLabel
+               OpLoopMerge %48 %49 None
+               OpBranch %50
+         %50 = OpLabel
+         %51 = OpLoad %int %i_0
+         %52 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %53 = OpLoad %float %52
+         %54 = OpConvertFToS %int %53
+         %55 = OpIAdd %int %54 %int_1
+         %56 = OpSLessThan %bool %51 %55
+               OpBranchConditional %56 %57 %48
+         %57 = OpLabel
+         %58 = OpFunctionCall %float %func_
+         %59 = OpConvertFToS %int %58
+         %60 = OpLoad %int %count
+         %61 = OpIAdd %int %60 %59
+               OpStore %count %61
+               OpBranch %49
+         %49 = OpLabel
+         %62 = OpLoad %int %i_0
+         %63 = OpIAdd %int %62 %int_1
+               OpStore %i_0 %63
+               OpBranch %47
+         %48 = OpLabel
+         %64 = OpLoad %int %count
+         %65 = OpIEqual %bool %64 %int_2
+               OpSelectionMerge %66 None
+               OpBranchConditional %65 %67 %68
+         %67 = OpLabel
+               OpStore %_GLF_color %44
+               OpBranch %66
+         %68 = OpLabel
+               OpStore %_GLF_color %45
+               OpBranch %66
+         %66 = OpLabel
+               OpReturn
+               OpFunctionEnd
+      %func_ = OpFunction %float None %17
+         %69 = OpLabel
+%alwaysFalse = OpVariable %_ptr_Function_bool Function
+      %value = OpVariable %_ptr_Function_v4float Function
+          %a = OpVariable %_ptr_Function_v2float Function
+          %i = OpVariable %_ptr_Function_int Function
+         %70 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %71 = OpLoad %float %70
+         %72 = OpFOrdLessThan %bool %71 %float_n1
+               OpStore %alwaysFalse %72
+         %73 = OpLoad %bool %alwaysFalse
+               OpSelectionMerge %74 None
+               OpBranchConditional %73 %75 %74
+         %75 = OpLabel
+         %76 = OpLoad %v2float %a
+         %77 = OpLoad %v4float %value
+         %78 = OpVectorShuffle %v4float %77 %76 4 5 2 3
+               OpStore %value %78
+               OpBranch %74
+         %74 = OpLabel
+         %79 = OpLoad %bool %alwaysFalse
+         %80 = OpLogicalNot %bool %79
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %81
+         %82 = OpLabel
+         %83 = OpAccessChain %_ptr_Uniform_v2float %_ %int_0
+         %84 = OpLoad %v2float %83
+         %85 = OpLoad %v4float %value
+         %86 = OpVectorShuffle %v4float %85 %84 4 5 2 3
+               OpStore %value %86
+               OpBranch %81
+         %81 = OpLabel
+         %87 = OpLoad %v4float %gl_FragCoord
+         %88 = OpVectorShuffle %v2float %87 %87 0 1
+         %89 = OpLoad %v4float %value
+         %90 = OpVectorShuffle %v2float %89 %89 0 1
+         %91 = OpFMul %v2float %88 %90
+         %92 = OpFMul %v2float %91 %34
+         %93 = OpLoad %v4float %value
+         %94 = OpVectorShuffle %v2float %93 %93 0 1
+         %95 = OpFAdd %v2float %92 %94
+         %96 = OpLoad %v4float %value
+         %97 = OpVectorShuffle %v4float %96 %95 0 1 4 5
+               OpStore %value %97
+               OpStore %i %int_0
+               OpBranch %98
+         %98 = OpLabel
+               OpLoopMerge %99 %100 None
+               OpBranch %101
+        %101 = OpLabel
+        %102 = OpLoad %int %i
+        %103 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+        %104 = OpLoad %float %103
+        %105 = OpConvertFToS %int %104
+        %106 = OpIAdd %int %105 %int_1
+        %107 = OpSLessThan %bool %102 %106
+               OpBranchConditional %107 %108 %99
+        %108 = OpLabel
+        %109 = OpLoad %int %i
+        %110 = OpConvertSToF %float %109
+        %111 = OpAccessChain %_ptr_Function_float %value %uint_0
+               OpStore %111 %110
+               OpBranch %100
+        %100 = OpLabel
+        %112 = OpLoad %int %i
+        %113 = OpIAdd %int %112 %int_1
+               OpStore %i %113
+               OpBranch %98
+         %99 = OpLabel
+        %114 = OpAccessChain %_ptr_Function_float %value %uint_0
+        %115 = OpLoad %float %114
+        %116 = OpFOrdEqual %bool %115 %float_1
+               OpSelectionMerge %117 None
+               OpBranchConditional %116 %118 %117
+        %118 = OpLabel
+        %119 = OpAccessChain %_ptr_Function_float %value %uint_1
+        %120 = OpLoad %float %119
+        %121 = OpFOrdEqual %bool %120 %float_1
+               OpBranch %117
+        %117 = OpLabel
+        %122 = OpPhi %bool %116 %99 %121 %118
+               OpSelectionMerge %123 None
+               OpBranchConditional %122 %124 %125
+        %124 = OpLabel
+               OpReturnValue %float_1
+        %125 = OpLabel
+               OpReturnValue %float_0
+        %123 = OpLabel
+               OpUnreachable
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/vector-values-multiplied-by-fragcoord/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/vector-values-multiplied-by-fragcoord/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..f65360e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/vector-values-multiplied-by-fragcoord/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,104 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float func_() {
+  bool alwaysFalse = false;
+  float4 value = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float2 a = float2(0.0f, 0.0f);
+  int i = 0;
+  bool x_121 = false;
+  bool x_122_phi = false;
+  const float x_71 = gl_FragCoord.x;
+  alwaysFalse = (x_71 < -1.0f);
+  if (alwaysFalse) {
+    const float2 x_76 = a;
+    const float4 x_77 = value;
+    value = float4(x_76.x, x_76.y, x_77.z, x_77.w);
+  }
+  if (!(alwaysFalse)) {
+    const float2 x_84 = asfloat(x_10[0].xy);
+    const float4 x_85 = value;
+    value = float4(x_84.x, x_84.y, x_85.z, x_85.w);
+  }
+  const float4 x_87 = gl_FragCoord;
+  const float4 x_89 = value;
+  const float4 x_93 = value;
+  const float2 x_95 = (((float2(x_87.x, x_87.y) * float2(x_89.x, x_89.y)) * float2(2.0f, 2.0f)) + float2(x_93.x, x_93.y));
+  const float4 x_96 = value;
+  value = float4(x_96.x, x_96.y, x_95.x, x_95.y);
+  i = 0;
+  while (true) {
+    const int x_102 = i;
+    const float x_104 = asfloat(x_10[0].y);
+    if ((x_102 < (int(x_104) + 1))) {
+    } else {
+      break;
+    }
+    value.x = float(i);
+    {
+      i = (i + 1);
+    }
+  }
+  const float x_115 = value.x;
+  const bool x_116 = (x_115 == 1.0f);
+  x_122_phi = x_116;
+  if (x_116) {
+    const float x_120 = value.y;
+    x_121 = (x_120 == 1.0f);
+    x_122_phi = x_121;
+  }
+  if (x_122_phi) {
+    return 1.0f;
+  } else {
+    return 0.0f;
+  }
+  return 0.0f;
+}
+
+void main_1() {
+  int count = 0;
+  int i_1 = 0;
+  count = 0;
+  i_1 = 0;
+  while (true) {
+    const int x_51 = i_1;
+    const float x_53 = asfloat(x_10[0].y);
+    if ((x_51 < (int(x_53) + 1))) {
+    } else {
+      break;
+    }
+    const float x_58 = func_();
+    count = (count + int(x_58));
+    {
+      i_1 = (i_1 + 1);
+    }
+  }
+  if ((count == 2)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/vector-values-multiplied-by-fragcoord/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/vector-values-multiplied-by-fragcoord/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..282221c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/vector-values-multiplied-by-fragcoord/0-opt.spvasm.expected.msl
@@ -0,0 +1,111 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float func_(constant buf0& x_10, thread float4* const tint_symbol_5) {
+  bool alwaysFalse = false;
+  float4 value = 0.0f;
+  float2 a = 0.0f;
+  int i = 0;
+  bool x_121 = false;
+  bool x_122_phi = false;
+  float const x_71 = (*(tint_symbol_5)).x;
+  alwaysFalse = (x_71 < -1.0f);
+  bool const x_73 = alwaysFalse;
+  if (x_73) {
+    float2 const x_76 = a;
+    float4 const x_77 = value;
+    value = float4(x_76.x, x_76.y, x_77.z, x_77.w);
+  }
+  bool const x_79 = alwaysFalse;
+  if (!(x_79)) {
+    float2 const x_84 = x_10.injectionSwitch;
+    float4 const x_85 = value;
+    value = float4(x_84.x, x_84.y, x_85.z, x_85.w);
+  }
+  float4 const x_87 = *(tint_symbol_5);
+  float4 const x_89 = value;
+  float4 const x_93 = value;
+  float2 const x_95 = (((float2(x_87.x, x_87.y) * float2(x_89.x, x_89.y)) * float2(2.0f, 2.0f)) + float2(x_93.x, x_93.y));
+  float4 const x_96 = value;
+  value = float4(x_96.x, x_96.y, x_95.x, x_95.y);
+  i = 0;
+  while (true) {
+    int const x_102 = i;
+    float const x_104 = x_10.injectionSwitch.y;
+    if ((x_102 < (int(x_104) + 1))) {
+    } else {
+      break;
+    }
+    int const x_109 = i;
+    value.x = float(x_109);
+    {
+      int const x_112 = i;
+      i = (x_112 + 1);
+    }
+  }
+  float const x_115 = value.x;
+  bool const x_116 = (x_115 == 1.0f);
+  x_122_phi = x_116;
+  if (x_116) {
+    float const x_120 = value.y;
+    x_121 = (x_120 == 1.0f);
+    x_122_phi = x_121;
+  }
+  bool const x_122 = x_122_phi;
+  if (x_122) {
+    return 1.0f;
+  } else {
+    return 0.0f;
+  }
+  return 0.0f;
+}
+
+void main_1(constant buf0& x_10, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  int count = 0;
+  int i_1 = 0;
+  count = 0;
+  i_1 = 0;
+  while (true) {
+    int const x_51 = i_1;
+    float const x_53 = x_10.injectionSwitch.y;
+    if ((x_51 < (int(x_53) + 1))) {
+    } else {
+      break;
+    }
+    float const x_58 = func_(x_10, tint_symbol_6);
+    int const x_60 = count;
+    count = (x_60 + int(x_58));
+    {
+      int const x_62 = i_1;
+      i_1 = (x_62 + 1);
+    }
+  }
+  int const x_64 = count;
+  if ((x_64 == 2)) {
+    *(tint_symbol_7) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_7) = float4(0.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_10 [[buffer(0)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_10, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/vector-values-multiplied-by-fragcoord/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/vector-values-multiplied-by-fragcoord/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..b6beec4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/vector-values-multiplied-by-fragcoord/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,269 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 170
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %func_ "func_"
+               OpName %alwaysFalse "alwaysFalse"
+               OpName %value "value"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %x_121 "x_121"
+               OpName %x_122_phi "x_122_phi"
+               OpName %main_1 "main_1"
+               OpName %count "count"
+               OpName %i_1 "i_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+         %15 = OpTypeFunction %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %21 = OpConstantNull %bool
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %26 = OpConstantNull %v2float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %30 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+   %float_n1 = OpConstant %float -1
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_2 = OpConstant %float 2
+         %74 = OpConstantComposite %v2float %float_2 %float_2
+      %int_0 = OpConstant %int 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+       %void = OpTypeVoid
+        %124 = OpTypeFunction %void
+      %int_2 = OpConstant %int 2
+        %155 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %156 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %157 = OpTypeFunction %void %main_out
+      %func_ = OpFunction %float None %15
+         %17 = OpLabel
+%alwaysFalse = OpVariable %_ptr_Function_bool Function %21
+      %value = OpVariable %_ptr_Function_v4float Function %5
+          %a = OpVariable %_ptr_Function_v2float Function %26
+          %i = OpVariable %_ptr_Function_int Function %30
+      %x_121 = OpVariable %_ptr_Function_bool Function %21
+  %x_122_phi = OpVariable %_ptr_Function_bool Function %21
+         %36 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %37 = OpLoad %float %36
+         %39 = OpFOrdLessThan %bool %37 %float_n1
+               OpStore %alwaysFalse %39
+         %40 = OpLoad %bool %alwaysFalse
+               OpSelectionMerge %41 None
+               OpBranchConditional %40 %42 %41
+         %42 = OpLabel
+         %43 = OpLoad %v2float %a
+         %44 = OpLoad %v4float %value
+         %45 = OpCompositeExtract %float %43 0
+         %46 = OpCompositeExtract %float %43 1
+         %47 = OpCompositeExtract %float %44 2
+         %48 = OpCompositeExtract %float %44 3
+         %49 = OpCompositeConstruct %v4float %45 %46 %47 %48
+               OpStore %value %49
+               OpBranch %41
+         %41 = OpLabel
+         %50 = OpLoad %bool %alwaysFalse
+         %51 = OpLogicalNot %bool %50
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %52
+         %53 = OpLabel
+         %55 = OpAccessChain %_ptr_Uniform_v2float %x_10 %uint_0
+         %56 = OpLoad %v2float %55
+         %57 = OpLoad %v4float %value
+         %58 = OpCompositeExtract %float %56 0
+         %59 = OpCompositeExtract %float %56 1
+         %60 = OpCompositeExtract %float %57 2
+         %61 = OpCompositeExtract %float %57 3
+         %62 = OpCompositeConstruct %v4float %58 %59 %60 %61
+               OpStore %value %62
+               OpBranch %52
+         %52 = OpLabel
+         %63 = OpLoad %v4float %gl_FragCoord
+         %64 = OpLoad %v4float %value
+         %65 = OpLoad %v4float %value
+         %66 = OpCompositeExtract %float %63 0
+         %67 = OpCompositeExtract %float %63 1
+         %68 = OpCompositeConstruct %v2float %66 %67
+         %69 = OpCompositeExtract %float %64 0
+         %70 = OpCompositeExtract %float %64 1
+         %71 = OpCompositeConstruct %v2float %69 %70
+         %72 = OpFMul %v2float %68 %71
+         %75 = OpFMul %v2float %72 %74
+         %76 = OpCompositeExtract %float %65 0
+         %77 = OpCompositeExtract %float %65 1
+         %78 = OpCompositeConstruct %v2float %76 %77
+         %79 = OpFAdd %v2float %75 %78
+         %80 = OpLoad %v4float %value
+         %81 = OpCompositeExtract %float %80 0
+         %82 = OpCompositeExtract %float %80 1
+         %83 = OpCompositeExtract %float %79 0
+         %84 = OpCompositeExtract %float %79 1
+         %85 = OpCompositeConstruct %v4float %81 %82 %83 %84
+               OpStore %value %85
+               OpStore %i %int_0
+               OpBranch %87
+         %87 = OpLabel
+               OpLoopMerge %88 %89 None
+               OpBranch %90
+         %90 = OpLabel
+         %91 = OpLoad %int %i
+         %94 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %uint_1
+         %95 = OpLoad %float %94
+         %96 = OpConvertFToS %int %95
+         %98 = OpIAdd %int %96 %int_1
+         %99 = OpSLessThan %bool %91 %98
+               OpSelectionMerge %100 None
+               OpBranchConditional %99 %101 %102
+        %101 = OpLabel
+               OpBranch %100
+        %102 = OpLabel
+               OpBranch %88
+        %100 = OpLabel
+        %103 = OpLoad %int %i
+        %105 = OpAccessChain %_ptr_Function_float %value %uint_0
+        %106 = OpConvertSToF %float %103
+               OpStore %105 %106
+               OpBranch %89
+         %89 = OpLabel
+        %107 = OpLoad %int %i
+        %108 = OpIAdd %int %107 %int_1
+               OpStore %i %108
+               OpBranch %87
+         %88 = OpLabel
+        %109 = OpAccessChain %_ptr_Function_float %value %uint_0
+        %110 = OpLoad %float %109
+        %112 = OpFOrdEqual %bool %110 %float_1
+               OpStore %x_122_phi %112
+               OpSelectionMerge %113 None
+               OpBranchConditional %112 %114 %113
+        %114 = OpLabel
+        %115 = OpAccessChain %_ptr_Function_float %value %uint_1
+        %116 = OpLoad %float %115
+        %117 = OpFOrdEqual %bool %116 %float_1
+               OpStore %x_121 %117
+        %118 = OpLoad %bool %x_121
+               OpStore %x_122_phi %118
+               OpBranch %113
+        %113 = OpLabel
+        %119 = OpLoad %bool %x_122_phi
+               OpSelectionMerge %120 None
+               OpBranchConditional %119 %121 %122
+        %121 = OpLabel
+               OpReturnValue %float_1
+        %122 = OpLabel
+               OpReturnValue %float_0
+        %120 = OpLabel
+               OpReturnValue %float_0
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %124
+        %127 = OpLabel
+      %count = OpVariable %_ptr_Function_int Function %30
+        %i_1 = OpVariable %_ptr_Function_int Function %30
+               OpStore %count %int_0
+               OpStore %i_1 %int_0
+               OpBranch %130
+        %130 = OpLabel
+               OpLoopMerge %131 %132 None
+               OpBranch %133
+        %133 = OpLabel
+        %134 = OpLoad %int %i_1
+        %135 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %uint_1
+        %136 = OpLoad %float %135
+        %137 = OpConvertFToS %int %136
+        %138 = OpIAdd %int %137 %int_1
+        %139 = OpSLessThan %bool %134 %138
+               OpSelectionMerge %140 None
+               OpBranchConditional %139 %141 %142
+        %141 = OpLabel
+               OpBranch %140
+        %142 = OpLabel
+               OpBranch %131
+        %140 = OpLabel
+        %143 = OpFunctionCall %float %func_
+        %144 = OpLoad %int %count
+        %145 = OpConvertFToS %int %143
+        %146 = OpIAdd %int %144 %145
+               OpStore %count %146
+               OpBranch %132
+        %132 = OpLabel
+        %147 = OpLoad %int %i_1
+        %148 = OpIAdd %int %147 %int_1
+               OpStore %i_1 %148
+               OpBranch %130
+        %131 = OpLabel
+        %149 = OpLoad %int %count
+        %151 = OpIEqual %bool %149 %int_2
+               OpSelectionMerge %152 None
+               OpBranchConditional %151 %153 %154
+        %153 = OpLabel
+               OpStore %x_GLF_color %155
+               OpBranch %152
+        %154 = OpLabel
+               OpStore %x_GLF_color %156
+               OpBranch %152
+        %152 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %157
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %161 = OpLabel
+        %162 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %162
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %124
+        %164 = OpLabel
+        %165 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %165
+        %166 = OpFunctionCall %void %main_1
+        %168 = OpLoad %v4float %x_GLF_color
+        %169 = OpCompositeConstruct %main_out %168
+        %167 = OpFunctionCall %void %tint_symbol_3 %169
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/vector-values-multiplied-by-fragcoord/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/vector-values-multiplied-by-fragcoord/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..1036f48
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/vector-values-multiplied-by-fragcoord/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,112 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> f32 {
+  var alwaysFalse : bool;
+  var value : vec4<f32>;
+  var a : vec2<f32>;
+  var i : i32;
+  var x_121 : bool;
+  var x_122_phi : bool;
+  let x_71 : f32 = gl_FragCoord.x;
+  alwaysFalse = (x_71 < -1.0);
+  let x_73 : bool = alwaysFalse;
+  if (x_73) {
+    let x_76 : vec2<f32> = a;
+    let x_77 : vec4<f32> = value;
+    value = vec4<f32>(x_76.x, x_76.y, x_77.z, x_77.w);
+  }
+  let x_79 : bool = alwaysFalse;
+  if (!(x_79)) {
+    let x_84 : vec2<f32> = x_10.injectionSwitch;
+    let x_85 : vec4<f32> = value;
+    value = vec4<f32>(x_84.x, x_84.y, x_85.z, x_85.w);
+  }
+  let x_87 : vec4<f32> = gl_FragCoord;
+  let x_89 : vec4<f32> = value;
+  let x_93 : vec4<f32> = value;
+  let x_95 : vec2<f32> = (((vec2<f32>(x_87.x, x_87.y) * vec2<f32>(x_89.x, x_89.y)) * vec2<f32>(2.0, 2.0)) + vec2<f32>(x_93.x, x_93.y));
+  let x_96 : vec4<f32> = value;
+  value = vec4<f32>(x_96.x, x_96.y, x_95.x, x_95.y);
+  i = 0;
+  loop {
+    let x_102 : i32 = i;
+    let x_104 : f32 = x_10.injectionSwitch.y;
+    if ((x_102 < (i32(x_104) + 1))) {
+    } else {
+      break;
+    }
+    let x_109 : i32 = i;
+    value.x = f32(x_109);
+
+    continuing {
+      let x_112 : i32 = i;
+      i = (x_112 + 1);
+    }
+  }
+  let x_115 : f32 = value.x;
+  let x_116 : bool = (x_115 == 1.0);
+  x_122_phi = x_116;
+  if (x_116) {
+    let x_120 : f32 = value.y;
+    x_121 = (x_120 == 1.0);
+    x_122_phi = x_121;
+  }
+  let x_122 : bool = x_122_phi;
+  if (x_122) {
+    return 1.0;
+  } else {
+    return 0.0;
+  }
+  return 0.0;
+}
+
+fn main_1() {
+  var count : i32;
+  var i_1 : i32;
+  count = 0;
+  i_1 = 0;
+  loop {
+    let x_51 : i32 = i_1;
+    let x_53 : f32 = x_10.injectionSwitch.y;
+    if ((x_51 < (i32(x_53) + 1))) {
+    } else {
+      break;
+    }
+    let x_58 : f32 = func_();
+    let x_60 : i32 = count;
+    count = (x_60 + i32(x_58));
+
+    continuing {
+      let x_62 : i32 = i_1;
+      i_1 = (x_62 + 1);
+    }
+  }
+  let x_64 : i32 = count;
+  if ((x_64 == 2)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/vector-values-multiplied-by-fragcoord/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/vector-values-multiplied-by-fragcoord/0-opt.wgsl
new file mode 100644
index 0000000..1036f48
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/vector-values-multiplied-by-fragcoord/0-opt.wgsl
@@ -0,0 +1,112 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> f32 {
+  var alwaysFalse : bool;
+  var value : vec4<f32>;
+  var a : vec2<f32>;
+  var i : i32;
+  var x_121 : bool;
+  var x_122_phi : bool;
+  let x_71 : f32 = gl_FragCoord.x;
+  alwaysFalse = (x_71 < -1.0);
+  let x_73 : bool = alwaysFalse;
+  if (x_73) {
+    let x_76 : vec2<f32> = a;
+    let x_77 : vec4<f32> = value;
+    value = vec4<f32>(x_76.x, x_76.y, x_77.z, x_77.w);
+  }
+  let x_79 : bool = alwaysFalse;
+  if (!(x_79)) {
+    let x_84 : vec2<f32> = x_10.injectionSwitch;
+    let x_85 : vec4<f32> = value;
+    value = vec4<f32>(x_84.x, x_84.y, x_85.z, x_85.w);
+  }
+  let x_87 : vec4<f32> = gl_FragCoord;
+  let x_89 : vec4<f32> = value;
+  let x_93 : vec4<f32> = value;
+  let x_95 : vec2<f32> = (((vec2<f32>(x_87.x, x_87.y) * vec2<f32>(x_89.x, x_89.y)) * vec2<f32>(2.0, 2.0)) + vec2<f32>(x_93.x, x_93.y));
+  let x_96 : vec4<f32> = value;
+  value = vec4<f32>(x_96.x, x_96.y, x_95.x, x_95.y);
+  i = 0;
+  loop {
+    let x_102 : i32 = i;
+    let x_104 : f32 = x_10.injectionSwitch.y;
+    if ((x_102 < (i32(x_104) + 1))) {
+    } else {
+      break;
+    }
+    let x_109 : i32 = i;
+    value.x = f32(x_109);
+
+    continuing {
+      let x_112 : i32 = i;
+      i = (x_112 + 1);
+    }
+  }
+  let x_115 : f32 = value.x;
+  let x_116 : bool = (x_115 == 1.0);
+  x_122_phi = x_116;
+  if (x_116) {
+    let x_120 : f32 = value.y;
+    x_121 = (x_120 == 1.0);
+    x_122_phi = x_121;
+  }
+  let x_122 : bool = x_122_phi;
+  if (x_122) {
+    return 1.0;
+  } else {
+    return 0.0;
+  }
+  return 0.0;
+}
+
+fn main_1() {
+  var count : i32;
+  var i_1 : i32;
+  count = 0;
+  i_1 = 0;
+  loop {
+    let x_51 : i32 = i_1;
+    let x_53 : f32 = x_10.injectionSwitch.y;
+    if ((x_51 < (i32(x_53) + 1))) {
+    } else {
+      break;
+    }
+    let x_58 : f32 = func_();
+    let x_60 : i32 = count;
+    count = (x_60 + i32(x_58));
+
+    continuing {
+      let x_62 : i32 = i_1;
+      i_1 = (x_62 + 1);
+    }
+  }
+  let x_64 : i32 = count;
+  if ((x_64 == 2)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/vector-values-multiplied-by-fragcoord/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/vector-values-multiplied-by-fragcoord/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..f65360e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/vector-values-multiplied-by-fragcoord/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,104 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_10 : register(b0, space0) {
+  uint4 x_10[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+float func_() {
+  bool alwaysFalse = false;
+  float4 value = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float2 a = float2(0.0f, 0.0f);
+  int i = 0;
+  bool x_121 = false;
+  bool x_122_phi = false;
+  const float x_71 = gl_FragCoord.x;
+  alwaysFalse = (x_71 < -1.0f);
+  if (alwaysFalse) {
+    const float2 x_76 = a;
+    const float4 x_77 = value;
+    value = float4(x_76.x, x_76.y, x_77.z, x_77.w);
+  }
+  if (!(alwaysFalse)) {
+    const float2 x_84 = asfloat(x_10[0].xy);
+    const float4 x_85 = value;
+    value = float4(x_84.x, x_84.y, x_85.z, x_85.w);
+  }
+  const float4 x_87 = gl_FragCoord;
+  const float4 x_89 = value;
+  const float4 x_93 = value;
+  const float2 x_95 = (((float2(x_87.x, x_87.y) * float2(x_89.x, x_89.y)) * float2(2.0f, 2.0f)) + float2(x_93.x, x_93.y));
+  const float4 x_96 = value;
+  value = float4(x_96.x, x_96.y, x_95.x, x_95.y);
+  i = 0;
+  while (true) {
+    const int x_102 = i;
+    const float x_104 = asfloat(x_10[0].y);
+    if ((x_102 < (int(x_104) + 1))) {
+    } else {
+      break;
+    }
+    value.x = float(i);
+    {
+      i = (i + 1);
+    }
+  }
+  const float x_115 = value.x;
+  const bool x_116 = (x_115 == 1.0f);
+  x_122_phi = x_116;
+  if (x_116) {
+    const float x_120 = value.y;
+    x_121 = (x_120 == 1.0f);
+    x_122_phi = x_121;
+  }
+  if (x_122_phi) {
+    return 1.0f;
+  } else {
+    return 0.0f;
+  }
+  return 0.0f;
+}
+
+void main_1() {
+  int count = 0;
+  int i_1 = 0;
+  count = 0;
+  i_1 = 0;
+  while (true) {
+    const int x_51 = i_1;
+    const float x_53 = asfloat(x_10[0].y);
+    if ((x_51 < (int(x_53) + 1))) {
+    } else {
+      break;
+    }
+    const float x_58 = func_();
+    count = (count + int(x_58));
+    {
+      i_1 = (i_1 + 1);
+    }
+  }
+  if ((count == 2)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.0f, 0.0f, 0.0f, 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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_6;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/vector-values-multiplied-by-fragcoord/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/vector-values-multiplied-by-fragcoord/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..282221c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/vector-values-multiplied-by-fragcoord/0-opt.wgsl.expected.msl
@@ -0,0 +1,111 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+float func_(constant buf0& x_10, thread float4* const tint_symbol_5) {
+  bool alwaysFalse = false;
+  float4 value = 0.0f;
+  float2 a = 0.0f;
+  int i = 0;
+  bool x_121 = false;
+  bool x_122_phi = false;
+  float const x_71 = (*(tint_symbol_5)).x;
+  alwaysFalse = (x_71 < -1.0f);
+  bool const x_73 = alwaysFalse;
+  if (x_73) {
+    float2 const x_76 = a;
+    float4 const x_77 = value;
+    value = float4(x_76.x, x_76.y, x_77.z, x_77.w);
+  }
+  bool const x_79 = alwaysFalse;
+  if (!(x_79)) {
+    float2 const x_84 = x_10.injectionSwitch;
+    float4 const x_85 = value;
+    value = float4(x_84.x, x_84.y, x_85.z, x_85.w);
+  }
+  float4 const x_87 = *(tint_symbol_5);
+  float4 const x_89 = value;
+  float4 const x_93 = value;
+  float2 const x_95 = (((float2(x_87.x, x_87.y) * float2(x_89.x, x_89.y)) * float2(2.0f, 2.0f)) + float2(x_93.x, x_93.y));
+  float4 const x_96 = value;
+  value = float4(x_96.x, x_96.y, x_95.x, x_95.y);
+  i = 0;
+  while (true) {
+    int const x_102 = i;
+    float const x_104 = x_10.injectionSwitch.y;
+    if ((x_102 < (int(x_104) + 1))) {
+    } else {
+      break;
+    }
+    int const x_109 = i;
+    value.x = float(x_109);
+    {
+      int const x_112 = i;
+      i = (x_112 + 1);
+    }
+  }
+  float const x_115 = value.x;
+  bool const x_116 = (x_115 == 1.0f);
+  x_122_phi = x_116;
+  if (x_116) {
+    float const x_120 = value.y;
+    x_121 = (x_120 == 1.0f);
+    x_122_phi = x_121;
+  }
+  bool const x_122 = x_122_phi;
+  if (x_122) {
+    return 1.0f;
+  } else {
+    return 0.0f;
+  }
+  return 0.0f;
+}
+
+void main_1(constant buf0& x_10, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  int count = 0;
+  int i_1 = 0;
+  count = 0;
+  i_1 = 0;
+  while (true) {
+    int const x_51 = i_1;
+    float const x_53 = x_10.injectionSwitch.y;
+    if ((x_51 < (int(x_53) + 1))) {
+    } else {
+      break;
+    }
+    float const x_58 = func_(x_10, tint_symbol_6);
+    int const x_60 = count;
+    count = (x_60 + int(x_58));
+    {
+      int const x_62 = i_1;
+      i_1 = (x_62 + 1);
+    }
+  }
+  int const x_64 = count;
+  if ((x_64 == 2)) {
+    *(tint_symbol_7) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_7) = float4(0.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_10 [[buffer(0)]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(x_10, &(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/vector-values-multiplied-by-fragcoord/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/vector-values-multiplied-by-fragcoord/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..b6beec4
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/vector-values-multiplied-by-fragcoord/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,269 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 170
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_10 "x_10"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %func_ "func_"
+               OpName %alwaysFalse "alwaysFalse"
+               OpName %value "value"
+               OpName %a "a"
+               OpName %i "i"
+               OpName %x_121 "x_121"
+               OpName %x_122_phi "x_122_phi"
+               OpName %main_1 "main_1"
+               OpName %count "count"
+               OpName %i_1 "i_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_10 NonWritable
+               OpDecorate %x_10 DescriptorSet 0
+               OpDecorate %x_10 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_10 = OpVariable %_ptr_Uniform_buf0 Uniform
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+         %15 = OpTypeFunction %float
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %21 = OpConstantNull %bool
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %26 = OpConstantNull %v2float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %30 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+   %float_n1 = OpConstant %float -1
+%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float
+    %float_2 = OpConstant %float 2
+         %74 = OpConstantComposite %v2float %float_2 %float_2
+      %int_0 = OpConstant %int 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_1 = OpConstant %int 1
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+       %void = OpTypeVoid
+        %124 = OpTypeFunction %void
+      %int_2 = OpConstant %int 2
+        %155 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %156 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+        %157 = OpTypeFunction %void %main_out
+      %func_ = OpFunction %float None %15
+         %17 = OpLabel
+%alwaysFalse = OpVariable %_ptr_Function_bool Function %21
+      %value = OpVariable %_ptr_Function_v4float Function %5
+          %a = OpVariable %_ptr_Function_v2float Function %26
+          %i = OpVariable %_ptr_Function_int Function %30
+      %x_121 = OpVariable %_ptr_Function_bool Function %21
+  %x_122_phi = OpVariable %_ptr_Function_bool Function %21
+         %36 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %37 = OpLoad %float %36
+         %39 = OpFOrdLessThan %bool %37 %float_n1
+               OpStore %alwaysFalse %39
+         %40 = OpLoad %bool %alwaysFalse
+               OpSelectionMerge %41 None
+               OpBranchConditional %40 %42 %41
+         %42 = OpLabel
+         %43 = OpLoad %v2float %a
+         %44 = OpLoad %v4float %value
+         %45 = OpCompositeExtract %float %43 0
+         %46 = OpCompositeExtract %float %43 1
+         %47 = OpCompositeExtract %float %44 2
+         %48 = OpCompositeExtract %float %44 3
+         %49 = OpCompositeConstruct %v4float %45 %46 %47 %48
+               OpStore %value %49
+               OpBranch %41
+         %41 = OpLabel
+         %50 = OpLoad %bool %alwaysFalse
+         %51 = OpLogicalNot %bool %50
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %52
+         %53 = OpLabel
+         %55 = OpAccessChain %_ptr_Uniform_v2float %x_10 %uint_0
+         %56 = OpLoad %v2float %55
+         %57 = OpLoad %v4float %value
+         %58 = OpCompositeExtract %float %56 0
+         %59 = OpCompositeExtract %float %56 1
+         %60 = OpCompositeExtract %float %57 2
+         %61 = OpCompositeExtract %float %57 3
+         %62 = OpCompositeConstruct %v4float %58 %59 %60 %61
+               OpStore %value %62
+               OpBranch %52
+         %52 = OpLabel
+         %63 = OpLoad %v4float %gl_FragCoord
+         %64 = OpLoad %v4float %value
+         %65 = OpLoad %v4float %value
+         %66 = OpCompositeExtract %float %63 0
+         %67 = OpCompositeExtract %float %63 1
+         %68 = OpCompositeConstruct %v2float %66 %67
+         %69 = OpCompositeExtract %float %64 0
+         %70 = OpCompositeExtract %float %64 1
+         %71 = OpCompositeConstruct %v2float %69 %70
+         %72 = OpFMul %v2float %68 %71
+         %75 = OpFMul %v2float %72 %74
+         %76 = OpCompositeExtract %float %65 0
+         %77 = OpCompositeExtract %float %65 1
+         %78 = OpCompositeConstruct %v2float %76 %77
+         %79 = OpFAdd %v2float %75 %78
+         %80 = OpLoad %v4float %value
+         %81 = OpCompositeExtract %float %80 0
+         %82 = OpCompositeExtract %float %80 1
+         %83 = OpCompositeExtract %float %79 0
+         %84 = OpCompositeExtract %float %79 1
+         %85 = OpCompositeConstruct %v4float %81 %82 %83 %84
+               OpStore %value %85
+               OpStore %i %int_0
+               OpBranch %87
+         %87 = OpLabel
+               OpLoopMerge %88 %89 None
+               OpBranch %90
+         %90 = OpLabel
+         %91 = OpLoad %int %i
+         %94 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %uint_1
+         %95 = OpLoad %float %94
+         %96 = OpConvertFToS %int %95
+         %98 = OpIAdd %int %96 %int_1
+         %99 = OpSLessThan %bool %91 %98
+               OpSelectionMerge %100 None
+               OpBranchConditional %99 %101 %102
+        %101 = OpLabel
+               OpBranch %100
+        %102 = OpLabel
+               OpBranch %88
+        %100 = OpLabel
+        %103 = OpLoad %int %i
+        %105 = OpAccessChain %_ptr_Function_float %value %uint_0
+        %106 = OpConvertSToF %float %103
+               OpStore %105 %106
+               OpBranch %89
+         %89 = OpLabel
+        %107 = OpLoad %int %i
+        %108 = OpIAdd %int %107 %int_1
+               OpStore %i %108
+               OpBranch %87
+         %88 = OpLabel
+        %109 = OpAccessChain %_ptr_Function_float %value %uint_0
+        %110 = OpLoad %float %109
+        %112 = OpFOrdEqual %bool %110 %float_1
+               OpStore %x_122_phi %112
+               OpSelectionMerge %113 None
+               OpBranchConditional %112 %114 %113
+        %114 = OpLabel
+        %115 = OpAccessChain %_ptr_Function_float %value %uint_1
+        %116 = OpLoad %float %115
+        %117 = OpFOrdEqual %bool %116 %float_1
+               OpStore %x_121 %117
+        %118 = OpLoad %bool %x_121
+               OpStore %x_122_phi %118
+               OpBranch %113
+        %113 = OpLabel
+        %119 = OpLoad %bool %x_122_phi
+               OpSelectionMerge %120 None
+               OpBranchConditional %119 %121 %122
+        %121 = OpLabel
+               OpReturnValue %float_1
+        %122 = OpLabel
+               OpReturnValue %float_0
+        %120 = OpLabel
+               OpReturnValue %float_0
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %124
+        %127 = OpLabel
+      %count = OpVariable %_ptr_Function_int Function %30
+        %i_1 = OpVariable %_ptr_Function_int Function %30
+               OpStore %count %int_0
+               OpStore %i_1 %int_0
+               OpBranch %130
+        %130 = OpLabel
+               OpLoopMerge %131 %132 None
+               OpBranch %133
+        %133 = OpLabel
+        %134 = OpLoad %int %i_1
+        %135 = OpAccessChain %_ptr_Uniform_float %x_10 %uint_0 %uint_1
+        %136 = OpLoad %float %135
+        %137 = OpConvertFToS %int %136
+        %138 = OpIAdd %int %137 %int_1
+        %139 = OpSLessThan %bool %134 %138
+               OpSelectionMerge %140 None
+               OpBranchConditional %139 %141 %142
+        %141 = OpLabel
+               OpBranch %140
+        %142 = OpLabel
+               OpBranch %131
+        %140 = OpLabel
+        %143 = OpFunctionCall %float %func_
+        %144 = OpLoad %int %count
+        %145 = OpConvertFToS %int %143
+        %146 = OpIAdd %int %144 %145
+               OpStore %count %146
+               OpBranch %132
+        %132 = OpLabel
+        %147 = OpLoad %int %i_1
+        %148 = OpIAdd %int %147 %int_1
+               OpStore %i_1 %148
+               OpBranch %130
+        %131 = OpLabel
+        %149 = OpLoad %int %count
+        %151 = OpIEqual %bool %149 %int_2
+               OpSelectionMerge %152 None
+               OpBranchConditional %151 %153 %154
+        %153 = OpLabel
+               OpStore %x_GLF_color %155
+               OpBranch %152
+        %154 = OpLabel
+               OpStore %x_GLF_color %156
+               OpBranch %152
+        %152 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %157
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %161 = OpLabel
+        %162 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %162
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %124
+        %164 = OpLabel
+        %165 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %165
+        %166 = OpFunctionCall %void %main_1
+        %168 = OpLoad %v4float %x_GLF_color
+        %169 = OpCompositeConstruct %main_out %168
+        %167 = OpFunctionCall %void %tint_symbol_3 %169
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/vector-values-multiplied-by-fragcoord/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/vector-values-multiplied-by-fragcoord/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..1036f48
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/vector-values-multiplied-by-fragcoord/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,112 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> gl_FragCoord : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_10 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> f32 {
+  var alwaysFalse : bool;
+  var value : vec4<f32>;
+  var a : vec2<f32>;
+  var i : i32;
+  var x_121 : bool;
+  var x_122_phi : bool;
+  let x_71 : f32 = gl_FragCoord.x;
+  alwaysFalse = (x_71 < -1.0);
+  let x_73 : bool = alwaysFalse;
+  if (x_73) {
+    let x_76 : vec2<f32> = a;
+    let x_77 : vec4<f32> = value;
+    value = vec4<f32>(x_76.x, x_76.y, x_77.z, x_77.w);
+  }
+  let x_79 : bool = alwaysFalse;
+  if (!(x_79)) {
+    let x_84 : vec2<f32> = x_10.injectionSwitch;
+    let x_85 : vec4<f32> = value;
+    value = vec4<f32>(x_84.x, x_84.y, x_85.z, x_85.w);
+  }
+  let x_87 : vec4<f32> = gl_FragCoord;
+  let x_89 : vec4<f32> = value;
+  let x_93 : vec4<f32> = value;
+  let x_95 : vec2<f32> = (((vec2<f32>(x_87.x, x_87.y) * vec2<f32>(x_89.x, x_89.y)) * vec2<f32>(2.0, 2.0)) + vec2<f32>(x_93.x, x_93.y));
+  let x_96 : vec4<f32> = value;
+  value = vec4<f32>(x_96.x, x_96.y, x_95.x, x_95.y);
+  i = 0;
+  loop {
+    let x_102 : i32 = i;
+    let x_104 : f32 = x_10.injectionSwitch.y;
+    if ((x_102 < (i32(x_104) + 1))) {
+    } else {
+      break;
+    }
+    let x_109 : i32 = i;
+    value.x = f32(x_109);
+
+    continuing {
+      let x_112 : i32 = i;
+      i = (x_112 + 1);
+    }
+  }
+  let x_115 : f32 = value.x;
+  let x_116 : bool = (x_115 == 1.0);
+  x_122_phi = x_116;
+  if (x_116) {
+    let x_120 : f32 = value.y;
+    x_121 = (x_120 == 1.0);
+    x_122_phi = x_121;
+  }
+  let x_122 : bool = x_122_phi;
+  if (x_122) {
+    return 1.0;
+  } else {
+    return 0.0;
+  }
+  return 0.0;
+}
+
+fn main_1() {
+  var count : i32;
+  var i_1 : i32;
+  count = 0;
+  i_1 = 0;
+  loop {
+    let x_51 : i32 = i_1;
+    let x_53 : f32 = x_10.injectionSwitch.y;
+    if ((x_51 < (i32(x_53) + 1))) {
+    } else {
+      break;
+    }
+    let x_58 : f32 = func_();
+    let x_60 : i32 = count;
+    count = (x_60 + i32(x_58));
+
+    continuing {
+      let x_62 : i32 = i_1;
+      i_1 = (x_62 + 1);
+    }
+  }
+  let x_64 : i32 = count;
+  if ((x_64 == 2)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/vectors-and-discard-in-function/0.spvasm b/test/vk-gl-cts/graphicsfuzz/vectors-and-discard-in-function/0.spvasm
new file mode 100644
index 0000000..0e0d541
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/vectors-and-discard-in-function/0.spvasm
@@ -0,0 +1,81 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %func_ "func("
+               OpName %coord "coord"
+               OpName %tmp3 "tmp3"
+               OpName %tmp2 "tmp2"
+               OpName %tmp "tmp"
+               OpName %_GLF_color "_GLF_color"
+               OpDecorate %func_ RelaxedPrecision
+               OpDecorate %9 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+         %13 = OpTypeFunction %int
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+    %float_1 = OpConstant %float 1
+         %18 = OpConstantComposite %v2float %float_1 %float_1
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_float = OpTypePointer Function %float
+    %int_180 = OpConstant %int 180
+       %bool = OpTypeBool
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%_ptr_Function__arr_float_uint_1 = OpTypePointer Function %_arr_float_uint_1
+      %int_0 = OpConstant %int 0
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+      %int_1 = OpConstant %int 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %32 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %33 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %11
+         %34 = OpLabel
+          %9 = OpFunctionCall %int %func_
+         %35 = OpIEqual %bool %9 %int_1
+               OpSelectionMerge %36 None
+               OpBranchConditional %35 %37 %38
+         %37 = OpLabel
+               OpStore %_GLF_color %32
+               OpBranch %36
+         %38 = OpLabel
+               OpStore %_GLF_color %33
+               OpBranch %36
+         %36 = OpLabel
+               OpReturn
+               OpFunctionEnd
+      %func_ = OpFunction %int None %13
+         %39 = OpLabel
+      %coord = OpVariable %_ptr_Function_v2float Function
+       %tmp3 = OpVariable %_ptr_Function_float Function
+       %tmp2 = OpVariable %_ptr_Function__arr_float_uint_1 Function
+        %tmp = OpVariable %_ptr_Function_v4float Function
+               OpStore %coord %18
+         %40 = OpAccessChain %_ptr_Function_float %coord %uint_1
+         %41 = OpLoad %float %40
+         %42 = OpConvertFToS %int %41
+         %43 = OpSLessThan %bool %42 %int_180
+               OpSelectionMerge %44 None
+               OpBranchConditional %43 %45 %46
+         %45 = OpLabel
+         %47 = OpAccessChain %_ptr_Function_float %tmp2 %int_0
+         %48 = OpLoad %float %47
+               OpStore %tmp3 %48
+               OpBranch %44
+         %46 = OpLabel
+               OpKill
+         %44 = OpLabel
+         %49 = OpCompositeConstruct %v4float %48 %48 %48 %48
+               OpStore %tmp %49
+               OpReturnValue %int_1
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/vectors-and-discard-in-function/0.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/vectors-and-discard-in-function/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..1051003
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/vectors-and-discard-in-function/0.spvasm.expected.hlsl
@@ -0,0 +1,43 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+int func_() {
+  float2 coord = float2(0.0f, 0.0f);
+  float tmp3 = 0.0f;
+  float tmp2[1] = (float[1])0;
+  float4 tmp = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float x_48 = 0.0f;
+  coord = float2(1.0f, 1.0f);
+  const float x_41 = coord.y;
+  if ((int(x_41) < 180)) {
+    x_48 = tmp2[0];
+    tmp3 = x_48;
+  } else {
+    discard;
+  }
+  tmp = float4(x_48, x_48, x_48, x_48);
+  return 1;
+}
+
+void main_1() {
+  const int x_9 = func_();
+  if ((x_9 == 1)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/vectors-and-discard-in-function/0.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/vectors-and-discard-in-function/0.spvasm.expected.msl
new file mode 100644
index 0000000..ed94dc2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/vectors-and-discard-in-function/0.spvasm.expected.msl
@@ -0,0 +1,49 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  float arr[1];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int func_() {
+  float2 coord = 0.0f;
+  float tmp3 = 0.0f;
+  tint_array_wrapper tmp2 = {};
+  float4 tmp = 0.0f;
+  float x_48 = 0.0f;
+  coord = float2(1.0f, 1.0f);
+  float const x_41 = coord.y;
+  if ((int(x_41) < 180)) {
+    x_48 = tmp2.arr[0];
+    tmp3 = x_48;
+  } else {
+    discard_fragment();
+  }
+  tmp = float4(x_48, x_48, x_48, x_48);
+  return 1;
+}
+
+void main_1(thread float4* const tint_symbol_4) {
+  int const x_9 = func_();
+  if ((x_9 == 1)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/vectors-and-discard-in-function/0.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/vectors-and-discard-in-function/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..658ed91
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/vectors-and-discard-in-function/0.spvasm.expected.spvasm
@@ -0,0 +1,121 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 73
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_ "func_"
+               OpName %coord "coord"
+               OpName %tmp3 "tmp3"
+               OpName %tmp2 "tmp2"
+               OpName %tmp "tmp"
+               OpName %x_48 "x_48"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+        %int = OpTypeInt 32 1
+          %8 = OpTypeFunction %int
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %15 = OpConstantNull %v2float
+%_ptr_Function_float = OpTypePointer Function %float
+         %18 = OpConstantNull %float
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%_ptr_Function__arr_float_uint_1 = OpTypePointer Function %_arr_float_uint_1
+         %24 = OpConstantNull %_arr_float_uint_1
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+    %float_1 = OpConstant %float 1
+         %29 = OpConstantComposite %v2float %float_1 %float_1
+    %int_180 = OpConstant %int 180
+       %bool = OpTypeBool
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+       %void = OpTypeVoid
+         %49 = OpTypeFunction %void
+    %float_0 = OpConstant %float 0
+         %59 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %60 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %61 = OpTypeFunction %void %main_out
+      %func_ = OpFunction %int None %8
+         %11 = OpLabel
+      %coord = OpVariable %_ptr_Function_v2float Function %15
+       %tmp3 = OpVariable %_ptr_Function_float Function %18
+       %tmp2 = OpVariable %_ptr_Function__arr_float_uint_1 Function %24
+        %tmp = OpVariable %_ptr_Function_v4float Function %5
+       %x_48 = OpVariable %_ptr_Function_float Function %18
+               OpStore %coord %29
+         %30 = OpAccessChain %_ptr_Function_float %coord %uint_1
+         %31 = OpLoad %float %30
+         %32 = OpConvertFToS %int %31
+         %34 = OpSLessThan %bool %32 %int_180
+               OpSelectionMerge %36 None
+               OpBranchConditional %34 %37 %38
+         %37 = OpLabel
+         %40 = OpAccessChain %_ptr_Function_float %tmp2 %int_0
+         %41 = OpLoad %float %40
+               OpStore %x_48 %41
+         %42 = OpLoad %float %x_48
+               OpStore %tmp3 %42
+               OpBranch %36
+         %38 = OpLabel
+               OpKill
+         %36 = OpLabel
+         %43 = OpLoad %float %x_48
+         %44 = OpLoad %float %x_48
+         %45 = OpLoad %float %x_48
+         %46 = OpLoad %float %x_48
+         %47 = OpCompositeConstruct %v4float %43 %44 %45 %46
+               OpStore %tmp %47
+               OpReturnValue %int_1
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %49
+         %52 = OpLabel
+         %53 = OpFunctionCall %int %func_
+         %54 = OpIEqual %bool %53 %int_1
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %57
+         %56 = OpLabel
+               OpStore %x_GLF_color %59
+               OpBranch %55
+         %57 = OpLabel
+               OpStore %x_GLF_color %60
+               OpBranch %55
+         %55 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %61
+%tint_symbol = OpFunctionParameter %main_out
+         %65 = OpLabel
+         %66 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %66
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %49
+         %68 = OpLabel
+         %69 = OpFunctionCall %void %main_1
+         %71 = OpLoad %v4float %x_GLF_color
+         %72 = OpCompositeConstruct %main_out %71
+         %70 = OpFunctionCall %void %tint_symbol_2 %72
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/vectors-and-discard-in-function/0.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/vectors-and-discard-in-function/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..3461a66
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/vectors-and-discard-in-function/0.spvasm.expected.wgsl
@@ -0,0 +1,40 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> i32 {
+  var coord : vec2<f32>;
+  var tmp3 : f32;
+  var tmp2 : array<f32, 1>;
+  var tmp : vec4<f32>;
+  var x_48 : f32;
+  coord = vec2<f32>(1.0, 1.0);
+  let x_41 : f32 = coord.y;
+  if ((i32(x_41) < 180)) {
+    x_48 = tmp2[0];
+    tmp3 = x_48;
+  } else {
+    discard;
+  }
+  tmp = vec4<f32>(x_48, x_48, x_48, x_48);
+  return 1;
+}
+
+fn main_1() {
+  let x_9 : i32 = func_();
+  if ((x_9 == 1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/vectors-and-discard-in-function/0.wgsl b/test/vk-gl-cts/graphicsfuzz/vectors-and-discard-in-function/0.wgsl
new file mode 100644
index 0000000..3461a66
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/vectors-and-discard-in-function/0.wgsl
@@ -0,0 +1,40 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> i32 {
+  var coord : vec2<f32>;
+  var tmp3 : f32;
+  var tmp2 : array<f32, 1>;
+  var tmp : vec4<f32>;
+  var x_48 : f32;
+  coord = vec2<f32>(1.0, 1.0);
+  let x_41 : f32 = coord.y;
+  if ((i32(x_41) < 180)) {
+    x_48 = tmp2[0];
+    tmp3 = x_48;
+  } else {
+    discard;
+  }
+  tmp = vec4<f32>(x_48, x_48, x_48, x_48);
+  return 1;
+}
+
+fn main_1() {
+  let x_9 : i32 = func_();
+  if ((x_9 == 1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/vectors-and-discard-in-function/0.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/vectors-and-discard-in-function/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..1051003
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/vectors-and-discard-in-function/0.wgsl.expected.hlsl
@@ -0,0 +1,43 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+int func_() {
+  float2 coord = float2(0.0f, 0.0f);
+  float tmp3 = 0.0f;
+  float tmp2[1] = (float[1])0;
+  float4 tmp = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float x_48 = 0.0f;
+  coord = float2(1.0f, 1.0f);
+  const float x_41 = coord.y;
+  if ((int(x_41) < 180)) {
+    x_48 = tmp2[0];
+    tmp3 = x_48;
+  } else {
+    discard;
+  }
+  tmp = float4(x_48, x_48, x_48, x_48);
+  return 1;
+}
+
+void main_1() {
+  const int x_9 = func_();
+  if ((x_9 == 1)) {
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    x_GLF_color = float4(0.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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/vectors-and-discard-in-function/0.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/vectors-and-discard-in-function/0.wgsl.expected.msl
new file mode 100644
index 0000000..ed94dc2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/vectors-and-discard-in-function/0.wgsl.expected.msl
@@ -0,0 +1,49 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  float arr[1];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+int func_() {
+  float2 coord = 0.0f;
+  float tmp3 = 0.0f;
+  tint_array_wrapper tmp2 = {};
+  float4 tmp = 0.0f;
+  float x_48 = 0.0f;
+  coord = float2(1.0f, 1.0f);
+  float const x_41 = coord.y;
+  if ((int(x_41) < 180)) {
+    x_48 = tmp2.arr[0];
+    tmp3 = x_48;
+  } else {
+    discard_fragment();
+  }
+  tmp = float4(x_48, x_48, x_48, x_48);
+  return 1;
+}
+
+void main_1(thread float4* const tint_symbol_4) {
+  int const x_9 = func_();
+  if ((x_9 == 1)) {
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  } else {
+    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 1.0f);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/vectors-and-discard-in-function/0.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/vectors-and-discard-in-function/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..658ed91
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/vectors-and-discard-in-function/0.wgsl.expected.spvasm
@@ -0,0 +1,121 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 73
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %func_ "func_"
+               OpName %coord "coord"
+               OpName %tmp3 "tmp3"
+               OpName %tmp2 "tmp2"
+               OpName %tmp "tmp"
+               OpName %x_48 "x_48"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_float_uint_1 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+        %int = OpTypeInt 32 1
+          %8 = OpTypeFunction %int
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %15 = OpConstantNull %v2float
+%_ptr_Function_float = OpTypePointer Function %float
+         %18 = OpConstantNull %float
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%_ptr_Function__arr_float_uint_1 = OpTypePointer Function %_arr_float_uint_1
+         %24 = OpConstantNull %_arr_float_uint_1
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+    %float_1 = OpConstant %float 1
+         %29 = OpConstantComposite %v2float %float_1 %float_1
+    %int_180 = OpConstant %int 180
+       %bool = OpTypeBool
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+       %void = OpTypeVoid
+         %49 = OpTypeFunction %void
+    %float_0 = OpConstant %float 0
+         %59 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+         %60 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %61 = OpTypeFunction %void %main_out
+      %func_ = OpFunction %int None %8
+         %11 = OpLabel
+      %coord = OpVariable %_ptr_Function_v2float Function %15
+       %tmp3 = OpVariable %_ptr_Function_float Function %18
+       %tmp2 = OpVariable %_ptr_Function__arr_float_uint_1 Function %24
+        %tmp = OpVariable %_ptr_Function_v4float Function %5
+       %x_48 = OpVariable %_ptr_Function_float Function %18
+               OpStore %coord %29
+         %30 = OpAccessChain %_ptr_Function_float %coord %uint_1
+         %31 = OpLoad %float %30
+         %32 = OpConvertFToS %int %31
+         %34 = OpSLessThan %bool %32 %int_180
+               OpSelectionMerge %36 None
+               OpBranchConditional %34 %37 %38
+         %37 = OpLabel
+         %40 = OpAccessChain %_ptr_Function_float %tmp2 %int_0
+         %41 = OpLoad %float %40
+               OpStore %x_48 %41
+         %42 = OpLoad %float %x_48
+               OpStore %tmp3 %42
+               OpBranch %36
+         %38 = OpLabel
+               OpKill
+         %36 = OpLabel
+         %43 = OpLoad %float %x_48
+         %44 = OpLoad %float %x_48
+         %45 = OpLoad %float %x_48
+         %46 = OpLoad %float %x_48
+         %47 = OpCompositeConstruct %v4float %43 %44 %45 %46
+               OpStore %tmp %47
+               OpReturnValue %int_1
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %49
+         %52 = OpLabel
+         %53 = OpFunctionCall %int %func_
+         %54 = OpIEqual %bool %53 %int_1
+               OpSelectionMerge %55 None
+               OpBranchConditional %54 %56 %57
+         %56 = OpLabel
+               OpStore %x_GLF_color %59
+               OpBranch %55
+         %57 = OpLabel
+               OpStore %x_GLF_color %60
+               OpBranch %55
+         %55 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %61
+%tint_symbol = OpFunctionParameter %main_out
+         %65 = OpLabel
+         %66 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %66
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %49
+         %68 = OpLabel
+         %69 = OpFunctionCall %void %main_1
+         %71 = OpLoad %v4float %x_GLF_color
+         %72 = OpCompositeConstruct %main_out %71
+         %70 = OpFunctionCall %void %tint_symbol_2 %72
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/vectors-and-discard-in-function/0.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/vectors-and-discard-in-function/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..3461a66
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/vectors-and-discard-in-function/0.wgsl.expected.wgsl
@@ -0,0 +1,40 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn func_() -> i32 {
+  var coord : vec2<f32>;
+  var tmp3 : f32;
+  var tmp2 : array<f32, 1>;
+  var tmp : vec4<f32>;
+  var x_48 : f32;
+  coord = vec2<f32>(1.0, 1.0);
+  let x_41 : f32 = coord.y;
+  if ((i32(x_41) < 180)) {
+    x_48 = tmp2[0];
+    tmp3 = x_48;
+  } else {
+    discard;
+  }
+  tmp = vec4<f32>(x_48, x_48, x_48, x_48);
+  return 1;
+}
+
+fn main_1() {
+  let x_9 : i32 = func_();
+  if ((x_9 == 1)) {
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  } else {
+    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/while-function-always-false/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/while-function-always-false/0-opt.spvasm
new file mode 100644
index 0000000..39c774d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/while-function-always-false/0-opt.spvasm
@@ -0,0 +1,75 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %_GLF_color "_GLF_color"
+               OpName %j "j"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %j RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %7 RelaxedPrecision
+               OpDecorate %8 RelaxedPrecision
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %16 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+      %int_1 = OpConstant %int 1
+     %uint_1 = OpConstant %uint 1
+       %main = OpFunction %void None %10
+         %29 = OpLabel
+          %j = OpVariable %_ptr_Function_int Function
+               OpStore %_GLF_color %16
+               OpBranch %30
+         %30 = OpLabel
+         %31 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+         %32 = OpLoad %float %31
+          %7 = OpConvertFToS %int %32
+               OpStore %j %7
+               OpLoopMerge %33 %34 None
+               OpBranch %35
+         %35 = OpLabel
+          %8 = OpLoad %int %j
+         %36 = OpSLessThan %bool %8 %int_2
+               OpLoopMerge %37 %38 None
+               OpBranchConditional %36 %39 %37
+         %39 = OpLabel
+               OpReturn
+         %38 = OpLabel
+               OpBranch %35
+         %37 = OpLabel
+               OpBranch %34
+         %34 = OpLabel
+         %40 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %41 = OpLoad %float %40
+         %42 = OpFOrdGreaterThan %bool %float_0 %41
+               OpBranchConditional %42 %30 %33
+         %33 = OpLabel
+         %43 = OpConvertFToS %int %41
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/while-function-always-false/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/while-function-always-false/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..257e1e6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/while-function-always-false/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,44 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+
+void main_1() {
+  int j = 0;
+  float x_41 = 0.0f;
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  while (true) {
+    const float x_32 = asfloat(x_6[0].x);
+    j = int(x_32);
+    while (true) {
+      if ((j < 2)) {
+      } else {
+        break;
+      }
+      return;
+    }
+    {
+      x_41 = asfloat(x_6[0].y);
+      if ((0.0f > x_41)) {
+      } else {
+        break;
+      }
+    }
+  }
+  const int x_43 = int(x_41);
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/while-function-always-false/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/while-function-always-false/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..042f177
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/while-function-always-false/0-opt.spvasm.expected.msl
@@ -0,0 +1,48 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int j = 0;
+  float x_41 = 0.0f;
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  while (true) {
+    float const x_32 = x_6.injectionSwitch.x;
+    j = int(x_32);
+    while (true) {
+      int const x_8 = j;
+      if ((x_8 < 2)) {
+      } else {
+        break;
+      }
+      return;
+    }
+    {
+      x_41 = x_6.injectionSwitch.y;
+      if ((0.0f > x_41)) {
+      } else {
+        break;
+      }
+    }
+  }
+  int const x_43 = int(x_41);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/while-function-always-false/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/while-function-always-false/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..1f04f3b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/while-function-always-false/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,130 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 69
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %j "j"
+               OpName %x_41 "x_41"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %19 = OpConstantNull %int
+%_ptr_Function_float = OpTypePointer Function %float
+         %22 = OpConstantNull %float
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %25 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+     %uint_1 = OpConstant %uint 1
+   %main_out = OpTypeStruct %v4float
+         %57 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %j = OpVariable %_ptr_Function_int Function %19
+       %x_41 = OpVariable %_ptr_Function_float Function %22
+               OpStore %x_GLF_color %25
+               OpBranch %26
+         %26 = OpLabel
+               OpLoopMerge %27 %28 None
+               OpBranch %29
+         %29 = OpLabel
+         %33 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+         %34 = OpLoad %float %33
+         %35 = OpConvertFToS %int %34
+               OpStore %j %35
+               OpBranch %36
+         %36 = OpLabel
+               OpLoopMerge %37 %38 None
+               OpBranch %39
+         %39 = OpLabel
+         %40 = OpLoad %int %j
+         %42 = OpSLessThan %bool %40 %int_2
+               OpSelectionMerge %44 None
+               OpBranchConditional %42 %45 %46
+         %45 = OpLabel
+               OpBranch %44
+         %46 = OpLabel
+               OpBranch %37
+         %44 = OpLabel
+               OpReturn
+         %38 = OpLabel
+               OpBranch %36
+         %37 = OpLabel
+               OpBranch %28
+         %28 = OpLabel
+         %48 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %49 = OpLoad %float %48
+               OpStore %x_41 %49
+         %50 = OpLoad %float %x_41
+         %51 = OpFOrdGreaterThan %bool %float_0 %50
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %54
+         %53 = OpLabel
+               OpBranch %52
+         %54 = OpLabel
+               OpBranch %27
+         %52 = OpLabel
+               OpBranch %26
+         %27 = OpLabel
+         %56 = OpLoad %float %x_41
+         %55 = OpConvertFToS %int %56
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %57
+%tint_symbol = OpFunctionParameter %main_out
+         %61 = OpLabel
+         %62 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %62
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %64 = OpLabel
+         %65 = OpFunctionCall %void %main_1
+         %67 = OpLoad %v4float %x_GLF_color
+         %68 = OpCompositeConstruct %main_out %67
+         %66 = OpFunctionCall %void %tint_symbol_2 %68
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 28[%28] is not post dominated by the back-edge block 52[%52]
+  %52 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/while-function-always-false/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/while-function-always-false/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..563d5c3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/while-function-always-false/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,47 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+fn main_1() {
+  var j : i32;
+  var x_41 : f32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  loop {
+    let x_32 : f32 = x_6.injectionSwitch.x;
+    j = i32(x_32);
+    loop {
+      let x_8 : i32 = j;
+      if ((x_8 < 2)) {
+      } else {
+        break;
+      }
+      return;
+    }
+
+    continuing {
+      x_41 = x_6.injectionSwitch.y;
+      if ((0.0 > x_41)) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_43 : i32 = i32(x_41);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/while-function-always-false/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/while-function-always-false/0-opt.wgsl
new file mode 100644
index 0000000..563d5c3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/while-function-always-false/0-opt.wgsl
@@ -0,0 +1,47 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+fn main_1() {
+  var j : i32;
+  var x_41 : f32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  loop {
+    let x_32 : f32 = x_6.injectionSwitch.x;
+    j = i32(x_32);
+    loop {
+      let x_8 : i32 = j;
+      if ((x_8 < 2)) {
+      } else {
+        break;
+      }
+      return;
+    }
+
+    continuing {
+      x_41 = x_6.injectionSwitch.y;
+      if ((0.0 > x_41)) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_43 : i32 = i32(x_41);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/while-function-always-false/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/while-function-always-false/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..257e1e6
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/while-function-always-false/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,44 @@
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+
+void main_1() {
+  int j = 0;
+  float x_41 = 0.0f;
+  x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  while (true) {
+    const float x_32 = asfloat(x_6[0].x);
+    j = int(x_32);
+    while (true) {
+      if ((j < 2)) {
+      } else {
+        break;
+      }
+      return;
+    }
+    {
+      x_41 = asfloat(x_6[0].y);
+      if ((0.0f > x_41)) {
+      } else {
+        break;
+      }
+    }
+  }
+  const int x_43 = int(x_41);
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/while-function-always-false/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/while-function-always-false/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..042f177
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/while-function-always-false/0-opt.wgsl.expected.msl
@@ -0,0 +1,48 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  int j = 0;
+  float x_41 = 0.0f;
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  while (true) {
+    float const x_32 = x_6.injectionSwitch.x;
+    j = int(x_32);
+    while (true) {
+      int const x_8 = j;
+      if ((x_8 < 2)) {
+      } else {
+        break;
+      }
+      return;
+    }
+    {
+      x_41 = x_6.injectionSwitch.y;
+      if ((0.0f > x_41)) {
+      } else {
+        break;
+      }
+    }
+  }
+  int const x_43 = int(x_41);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/while-function-always-false/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/while-function-always-false/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..1f04f3b
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/while-function-always-false/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,130 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 69
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %j "j"
+               OpName %x_41 "x_41"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %19 = OpConstantNull %int
+%_ptr_Function_float = OpTypePointer Function %float
+         %22 = OpConstantNull %float
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %25 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+     %uint_1 = OpConstant %uint 1
+   %main_out = OpTypeStruct %v4float
+         %57 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+          %j = OpVariable %_ptr_Function_int Function %19
+       %x_41 = OpVariable %_ptr_Function_float Function %22
+               OpStore %x_GLF_color %25
+               OpBranch %26
+         %26 = OpLabel
+               OpLoopMerge %27 %28 None
+               OpBranch %29
+         %29 = OpLabel
+         %33 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_0
+         %34 = OpLoad %float %33
+         %35 = OpConvertFToS %int %34
+               OpStore %j %35
+               OpBranch %36
+         %36 = OpLabel
+               OpLoopMerge %37 %38 None
+               OpBranch %39
+         %39 = OpLabel
+         %40 = OpLoad %int %j
+         %42 = OpSLessThan %bool %40 %int_2
+               OpSelectionMerge %44 None
+               OpBranchConditional %42 %45 %46
+         %45 = OpLabel
+               OpBranch %44
+         %46 = OpLabel
+               OpBranch %37
+         %44 = OpLabel
+               OpReturn
+         %38 = OpLabel
+               OpBranch %36
+         %37 = OpLabel
+               OpBranch %28
+         %28 = OpLabel
+         %48 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %49 = OpLoad %float %48
+               OpStore %x_41 %49
+         %50 = OpLoad %float %x_41
+         %51 = OpFOrdGreaterThan %bool %float_0 %50
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %54
+         %53 = OpLabel
+               OpBranch %52
+         %54 = OpLabel
+               OpBranch %27
+         %52 = OpLabel
+               OpBranch %26
+         %27 = OpLabel
+         %56 = OpLoad %float %x_41
+         %55 = OpConvertFToS %int %56
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %57
+%tint_symbol = OpFunctionParameter %main_out
+         %61 = OpLabel
+         %62 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %62
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %64 = OpLabel
+         %65 = OpFunctionCall %void %main_1
+         %67 = OpLoad %v4float %x_GLF_color
+         %68 = OpCompositeConstruct %main_out %67
+         %66 = OpFunctionCall %void %tint_symbol_2 %68
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 28[%28] is not post dominated by the back-edge block 52[%52]
+  %52 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/while-function-always-false/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/while-function-always-false/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..563d5c3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/while-function-always-false/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,47 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+var<private> x_GLF_color : vec4<f32>;
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+fn main_1() {
+  var j : i32;
+  var x_41 : f32;
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  loop {
+    let x_32 : f32 = x_6.injectionSwitch.x;
+    j = i32(x_32);
+    loop {
+      let x_8 : i32 = j;
+      if ((x_8 < 2)) {
+      } else {
+        break;
+      }
+      return;
+    }
+
+    continuing {
+      x_41 = x_6.injectionSwitch.y;
+      if ((0.0 > x_41)) {
+      } else {
+        break;
+      }
+    }
+  }
+  let x_43 : i32 = i32(x_41);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.spvasm
new file mode 100644
index 0000000..806ac7a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.spvasm
@@ -0,0 +1,231 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %idx "idx"
+               OpName %m43 "m43"
+               OpName %ll_1 "ll_1"
+               OpName %GLF_live6rows "GLF_live6rows"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injected"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpName %z "z"
+               OpName %ll_2 "ll_2"
+               OpName %ctr "ctr"
+               OpName %tempm43 "tempm43"
+               OpName %ll_3 "ll_3"
+               OpName %c "c"
+               OpName %d "d"
+               OpName %GLF_live6sums "GLF_live6sums"
+               OpDecorate %idx RelaxedPrecision
+               OpDecorate %ll_1 RelaxedPrecision
+               OpDecorate %GLF_live6rows RelaxedPrecision
+               OpDecorate %18 RelaxedPrecision
+               OpMemberDecorate %buf0 0 RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %19 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %20 RelaxedPrecision
+               OpDecorate %21 RelaxedPrecision
+               OpDecorate %z RelaxedPrecision
+               OpDecorate %22 RelaxedPrecision
+               OpDecorate %ll_2 RelaxedPrecision
+               OpDecorate %ctr RelaxedPrecision
+               OpDecorate %23 RelaxedPrecision
+               OpDecorate %24 RelaxedPrecision
+               OpDecorate %25 RelaxedPrecision
+               OpDecorate %26 RelaxedPrecision
+               OpDecorate %27 RelaxedPrecision
+               OpDecorate %ll_3 RelaxedPrecision
+               OpDecorate %c RelaxedPrecision
+               OpDecorate %28 RelaxedPrecision
+               OpDecorate %d RelaxedPrecision
+               OpDecorate %29 RelaxedPrecision
+               OpDecorate %30 RelaxedPrecision
+               OpDecorate %31 RelaxedPrecision
+               OpDecorate %32 RelaxedPrecision
+               OpDecorate %33 RelaxedPrecision
+               OpDecorate %34 RelaxedPrecision
+               OpDecorate %35 RelaxedPrecision
+               OpDecorate %36 RelaxedPrecision
+               OpDecorate %37 RelaxedPrecision
+               OpDecorate %38 RelaxedPrecision
+               OpDecorate %39 RelaxedPrecision
+               OpDecorate %40 RelaxedPrecision
+               OpDecorate %41 RelaxedPrecision
+               OpDecorate %42 RelaxedPrecision
+               OpDecorate %43 RelaxedPrecision
+               OpDecorate %44 RelaxedPrecision
+       %void = OpTypeVoid
+         %46 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+%mat4v3float = OpTypeMatrix %v3float 4
+%_ptr_Function_mat4v3float = OpTypePointer Function %mat4v3float
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %56 = OpConstantComposite %v3float %float_1 %float_0 %float_0
+         %57 = OpConstantComposite %v3float %float_0 %float_1 %float_0
+         %58 = OpConstantComposite %v3float %float_0 %float_0 %float_1
+         %59 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+         %60 = OpConstantComposite %mat4v3float %56 %57 %58 %59
+      %int_2 = OpConstant %int 2
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %67 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %int_1 = OpConstant %int 1
+      %int_4 = OpConstant %int 4
+      %int_3 = OpConstant %int 3
+%_ptr_Function_float = OpTypePointer Function %float
+       %uint = OpTypeInt 32 0
+     %uint_9 = OpConstant %uint 9
+%_arr_float_uint_9 = OpTypeArray %float %uint_9
+%_ptr_Function__arr_float_uint_9 = OpTypePointer Function %_arr_float_uint_9
+      %int_9 = OpConstant %int 9
+     %uint_1 = OpConstant %uint 1
+       %main = OpFunction %void None %46
+         %78 = OpLabel
+        %idx = OpVariable %_ptr_Function_int Function
+        %m43 = OpVariable %_ptr_Function_mat4v3float Function
+       %ll_1 = OpVariable %_ptr_Function_int Function
+%GLF_live6rows = OpVariable %_ptr_Function_int Function
+          %z = OpVariable %_ptr_Function_int Function
+       %ll_2 = OpVariable %_ptr_Function_int Function
+        %ctr = OpVariable %_ptr_Function_int Function
+    %tempm43 = OpVariable %_ptr_Function_mat4v3float Function
+       %ll_3 = OpVariable %_ptr_Function_int Function
+          %c = OpVariable %_ptr_Function_int Function
+          %d = OpVariable %_ptr_Function_int Function
+%GLF_live6sums = OpVariable %_ptr_Function__arr_float_uint_9 Function
+               OpStore %idx %int_0
+               OpStore %m43 %60
+               OpStore %ll_1 %int_0
+               OpStore %GLF_live6rows %int_2
+               OpBranch %79
+         %79 = OpLabel
+               OpLoopMerge %80 %81 None
+               OpBranch %82
+         %82 = OpLabel
+         %18 = OpLoad %int %ll_1
+         %83 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %19 = OpLoad %int %83
+         %84 = OpSGreaterThanEqual %bool %18 %19
+               OpSelectionMerge %85 None
+               OpBranchConditional %84 %86 %85
+         %86 = OpLabel
+               OpStore %_GLF_color %67
+               OpBranch %80
+         %85 = OpLabel
+         %20 = OpLoad %int %ll_1
+         %21 = OpIAdd %int %20 %int_1
+               OpStore %ll_1 %21
+         %87 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %22 = OpLoad %int %87
+               OpStore %z %22
+               OpStore %ll_2 %int_0
+               OpStore %ctr %int_0
+               OpBranch %88
+         %88 = OpLabel
+               OpLoopMerge %89 %90 None
+               OpBranch %91
+         %91 = OpLabel
+         %23 = OpLoad %int %ctr
+         %92 = OpSLessThan %bool %23 %int_1
+               OpBranchConditional %92 %93 %89
+         %93 = OpLabel
+         %24 = OpLoad %int %ll_2
+         %94 = OpAccessChain %_ptr_Uniform_int %_ %int_0
+         %25 = OpLoad %int %94
+         %95 = OpSGreaterThanEqual %bool %24 %25
+               OpSelectionMerge %96 None
+               OpBranchConditional %95 %97 %96
+         %97 = OpLabel
+               OpBranch %89
+         %96 = OpLabel
+         %26 = OpLoad %int %ll_2
+         %27 = OpIAdd %int %26 %int_1
+               OpStore %ll_2 %27
+         %98 = OpLoad %mat4v3float %m43
+               OpStore %tempm43 %98
+               OpStore %ll_3 %int_0
+               OpStore %c %int_0
+               OpBranch %99
+         %99 = OpLabel
+               OpLoopMerge %100 %101 None
+               OpBranch %102
+        %102 = OpLabel
+         %28 = OpLoad %int %z
+        %103 = OpSLessThan %bool %int_1 %28
+               OpBranchConditional %103 %104 %100
+        %104 = OpLabel
+               OpStore %d %int_0
+         %29 = OpLoad %int %c
+        %105 = OpSGreaterThanEqual %bool %29 %int_0
+         %30 = OpLoad %int %c
+        %106 = OpSLessThan %bool %30 %int_4
+        %107 = OpLogicalAnd %bool %105 %106
+         %31 = OpLoad %int %c
+        %108 = OpSelect %int %107 %31 %int_0
+         %32 = OpLoad %int %d
+        %109 = OpSGreaterThanEqual %bool %32 %int_0
+         %33 = OpLoad %int %d
+        %110 = OpSLessThan %bool %33 %int_3
+        %111 = OpLogicalAnd %bool %109 %110
+         %34 = OpLoad %int %d
+        %112 = OpSelect %int %111 %34 %int_0
+        %113 = OpAccessChain %_ptr_Function_float %tempm43 %108 %112
+               OpStore %113 %float_1
+               OpBranch %101
+        %101 = OpLabel
+         %35 = OpLoad %int %c
+         %36 = OpIAdd %int %35 %int_1
+               OpStore %c %36
+               OpBranch %99
+        %100 = OpLabel
+         %37 = OpLoad %int %idx
+        %114 = OpSGreaterThanEqual %bool %37 %int_0
+         %38 = OpLoad %int %idx
+        %115 = OpSLessThan %bool %38 %int_9
+        %116 = OpLogicalAnd %bool %114 %115
+         %39 = OpLoad %int %idx
+        %117 = OpSelect %int %116 %39 %int_0
+         %40 = OpLoad %int %ctr
+        %118 = OpAccessChain %_ptr_Function_float %m43 %40 %uint_1
+        %119 = OpLoad %float %118
+        %120 = OpAccessChain %_ptr_Function_float %GLF_live6sums %117
+        %121 = OpLoad %float %120
+        %122 = OpFAdd %float %121 %119
+        %123 = OpAccessChain %_ptr_Function_float %GLF_live6sums %117
+               OpStore %123 %122
+               OpBranch %90
+         %90 = OpLabel
+         %41 = OpLoad %int %ctr
+         %42 = OpIAdd %int %41 %int_1
+               OpStore %ctr %42
+               OpBranch %88
+         %89 = OpLabel
+         %43 = OpLoad %int %idx
+         %44 = OpIAdd %int %43 %int_1
+               OpStore %idx %44
+               OpBranch %81
+         %81 = OpLabel
+               OpBranch %79
+         %80 = OpLabel
+               OpReturn
+               OpFunctionEnd
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
new file mode 100755
index 0000000..66b4a0e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,99 @@
+SKIP: FAILED
+
+void set_float3(inout float3 vec, int idx, float val) {
+  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
+}
+
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int idx = 0;
+  float4x3 m43 = float4x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  int ll_1 = 0;
+  int GLF_live6rows = 0;
+  int z = 0;
+  int ll_2 = 0;
+  int ctr = 0;
+  float4x3 tempm43 = float4x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  int ll_3 = 0;
+  int c = 0;
+  int d = 0;
+  float GLF_live6sums[9] = (float[9])0;
+  idx = 0;
+  m43 = float4x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f), float3(0.0f, 0.0f, 0.0f));
+  ll_1 = 0;
+  GLF_live6rows = 2;
+  while (true) {
+    const int x_18 = ll_1;
+    const int x_19 = asint(x_9[0].x);
+    if ((x_18 >= x_19)) {
+      x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+      break;
+    }
+    ll_1 = (ll_1 + 1);
+    const int x_22 = asint(x_9[0].x);
+    z = x_22;
+    ll_2 = 0;
+    ctr = 0;
+    {
+      for(; (ctr < 1); ctr = (ctr + 1)) {
+        const int x_24 = ll_2;
+        const int x_25 = asint(x_9[0].x);
+        if ((x_24 >= x_25)) {
+          break;
+        }
+        ll_2 = (ll_2 + 1);
+        tempm43 = m43;
+        ll_3 = 0;
+        c = 0;
+        {
+          for(; (1 < z); c = (c + 1)) {
+            d = 0;
+            bool tint_tmp = (c >= 0);
+            if (tint_tmp) {
+              tint_tmp = (c < 4);
+            }
+            bool tint_tmp_1 = (d >= 0);
+            if (tint_tmp_1) {
+              tint_tmp_1 = (d < 3);
+            }
+            set_float3(tempm43[((tint_tmp) ? c : 0)], ((tint_tmp_1) ? d : 0), 1.0f);
+          }
+        }
+        bool tint_tmp_2 = (idx >= 0);
+        if (tint_tmp_2) {
+          tint_tmp_2 = (idx < 9);
+        }
+        const int x_117 = ((tint_tmp_2) ? idx : 0);
+        const float x_119 = m43[ctr].y;
+        const float x_121 = GLF_live6sums[x_117];
+        GLF_live6sums[x_117] = (x_121 + x_119);
+      }
+    }
+    idx = (idx + 1);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
+error: validation errors
+T:\tmp\ufmo.0:86: error: Loop must have break.
+Validation failed.
+
+
+
diff --git a/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..aa5c43e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.spvasm.expected.msl
@@ -0,0 +1,109 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int injected;
+};
+struct tint_array_wrapper {
+  float arr[9];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_9, thread float4* const tint_symbol_4) {
+  int idx = 0;
+  float4x3 m43 = float4x3(0.0f);
+  int ll_1 = 0;
+  int GLF_live6rows = 0;
+  int z = 0;
+  int ll_2 = 0;
+  int ctr = 0;
+  float4x3 tempm43 = float4x3(0.0f);
+  int ll_3 = 0;
+  int c = 0;
+  int d = 0;
+  tint_array_wrapper GLF_live6sums = {};
+  idx = 0;
+  m43 = float4x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f), float3(0.0f, 0.0f, 0.0f));
+  ll_1 = 0;
+  GLF_live6rows = 2;
+  while (true) {
+    int const x_18 = ll_1;
+    int const x_19 = x_9.injected;
+    if ((x_18 >= x_19)) {
+      *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+      break;
+    }
+    int const x_20 = ll_1;
+    ll_1 = (x_20 + 1);
+    int const x_22 = x_9.injected;
+    z = x_22;
+    ll_2 = 0;
+    ctr = 0;
+    while (true) {
+      int const x_23 = ctr;
+      if ((x_23 < 1)) {
+      } else {
+        break;
+      }
+      int const x_24 = ll_2;
+      int const x_25 = x_9.injected;
+      if ((x_24 >= x_25)) {
+        break;
+      }
+      int const x_26 = ll_2;
+      ll_2 = (x_26 + 1);
+      float4x3 const x_98 = m43;
+      tempm43 = x_98;
+      ll_3 = 0;
+      c = 0;
+      while (true) {
+        int const x_28 = z;
+        if ((1 < x_28)) {
+        } else {
+          break;
+        }
+        d = 0;
+        int const x_29 = c;
+        int const x_30 = c;
+        int const x_31 = c;
+        int const x_32 = d;
+        int const x_33 = d;
+        int const x_34 = d;
+        tempm43[select(0, x_31, ((x_29 >= 0) && (x_30 < 4)))][select(0, x_34, ((x_32 >= 0) && (x_33 < 3)))] = 1.0f;
+        {
+          int const x_35 = c;
+          c = (x_35 + 1);
+        }
+      }
+      int const x_37 = idx;
+      int const x_38 = idx;
+      int const x_39 = idx;
+      int const x_117 = select(0, x_39, ((x_37 >= 0) && (x_38 < 9)));
+      int const x_40 = ctr;
+      float const x_119 = m43[x_40].y;
+      float const x_121 = GLF_live6sums.arr[x_117];
+      GLF_live6sums.arr[x_117] = (x_121 + x_119);
+      {
+        int const x_41 = ctr;
+        ctr = (x_41 + 1);
+      }
+    }
+    int const x_43 = idx;
+    idx = (x_43 + 1);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..63de0fc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,255 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 152
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injected"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %idx "idx"
+               OpName %m43 "m43"
+               OpName %ll_1 "ll_1"
+               OpName %GLF_live6rows "GLF_live6rows"
+               OpName %z "z"
+               OpName %ll_2 "ll_2"
+               OpName %ctr "ctr"
+               OpName %tempm43 "tempm43"
+               OpName %ll_3 "ll_3"
+               OpName %c "c"
+               OpName %d "d"
+               OpName %GLF_live6sums "GLF_live6sums"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_float_uint_9 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+    %v3float = OpTypeVector %float 3
+%mat4v3float = OpTypeMatrix %v3float 4
+%_ptr_Function_mat4v3float = OpTypePointer Function %mat4v3float
+         %23 = OpConstantNull %mat4v3float
+       %uint = OpTypeInt 32 0
+     %uint_9 = OpConstant %uint 9
+%_arr_float_uint_9 = OpTypeArray %float %uint_9
+%_ptr_Function__arr_float_uint_9 = OpTypePointer Function %_arr_float_uint_9
+         %38 = OpConstantNull %_arr_float_uint_9
+      %int_0 = OpConstant %int 0
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %42 = OpConstantComposite %v3float %float_1 %float_0 %float_0
+         %43 = OpConstantComposite %v3float %float_0 %float_1 %float_0
+         %44 = OpConstantComposite %v3float %float_0 %float_0 %float_1
+         %45 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+         %46 = OpConstantComposite %mat4v3float %42 %43 %44 %45
+      %int_2 = OpConstant %int 2
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+         %61 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %int_1 = OpConstant %int 1
+      %int_4 = OpConstant %int 4
+      %int_3 = OpConstant %int 3
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_9 = OpConstant %int 9
+     %uint_1 = OpConstant %uint 1
+   %main_out = OpTypeStruct %v4float
+        %140 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+        %idx = OpVariable %_ptr_Function_int Function %18
+        %m43 = OpVariable %_ptr_Function_mat4v3float Function %23
+       %ll_1 = OpVariable %_ptr_Function_int Function %18
+%GLF_live6rows = OpVariable %_ptr_Function_int Function %18
+          %z = OpVariable %_ptr_Function_int Function %18
+       %ll_2 = OpVariable %_ptr_Function_int Function %18
+        %ctr = OpVariable %_ptr_Function_int Function %18
+    %tempm43 = OpVariable %_ptr_Function_mat4v3float Function %23
+       %ll_3 = OpVariable %_ptr_Function_int Function %18
+          %c = OpVariable %_ptr_Function_int Function %18
+          %d = OpVariable %_ptr_Function_int Function %18
+%GLF_live6sums = OpVariable %_ptr_Function__arr_float_uint_9 Function %38
+               OpStore %idx %int_0
+               OpStore %m43 %46
+               OpStore %ll_1 %int_0
+               OpStore %GLF_live6rows %int_2
+               OpBranch %48
+         %48 = OpLabel
+               OpLoopMerge %49 %50 None
+               OpBranch %51
+         %51 = OpLabel
+         %52 = OpLoad %int %ll_1
+         %55 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0
+         %56 = OpLoad %int %55
+         %57 = OpSGreaterThanEqual %bool %52 %56
+               OpSelectionMerge %59 None
+               OpBranchConditional %57 %60 %59
+         %60 = OpLabel
+               OpStore %x_GLF_color %61
+               OpBranch %49
+         %59 = OpLabel
+         %62 = OpLoad %int %ll_1
+         %64 = OpIAdd %int %62 %int_1
+               OpStore %ll_1 %64
+         %65 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0
+         %66 = OpLoad %int %65
+               OpStore %z %66
+               OpStore %ll_2 %int_0
+               OpStore %ctr %int_0
+               OpBranch %67
+         %67 = OpLabel
+               OpLoopMerge %68 %69 None
+               OpBranch %70
+         %70 = OpLabel
+         %71 = OpLoad %int %ctr
+         %72 = OpSLessThan %bool %71 %int_1
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %74 %75
+         %74 = OpLabel
+               OpBranch %73
+         %75 = OpLabel
+               OpBranch %68
+         %73 = OpLabel
+         %76 = OpLoad %int %ll_2
+         %77 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0
+         %78 = OpLoad %int %77
+         %79 = OpSGreaterThanEqual %bool %76 %78
+               OpSelectionMerge %80 None
+               OpBranchConditional %79 %81 %80
+         %81 = OpLabel
+               OpBranch %68
+         %80 = OpLabel
+         %82 = OpLoad %int %ll_2
+         %83 = OpIAdd %int %82 %int_1
+               OpStore %ll_2 %83
+         %84 = OpLoad %mat4v3float %m43
+               OpStore %tempm43 %84
+               OpStore %ll_3 %int_0
+               OpStore %c %int_0
+               OpBranch %85
+         %85 = OpLabel
+               OpLoopMerge %86 %87 None
+               OpBranch %88
+         %88 = OpLabel
+         %89 = OpLoad %int %z
+         %90 = OpSLessThan %bool %int_1 %89
+               OpSelectionMerge %91 None
+               OpBranchConditional %90 %92 %93
+         %92 = OpLabel
+               OpBranch %91
+         %93 = OpLabel
+               OpBranch %86
+         %91 = OpLabel
+               OpStore %d %int_0
+         %94 = OpLoad %int %c
+         %95 = OpLoad %int %c
+         %96 = OpLoad %int %c
+         %97 = OpLoad %int %d
+         %98 = OpLoad %int %d
+         %99 = OpLoad %int %d
+        %101 = OpSGreaterThanEqual %bool %94 %int_0
+               OpSelectionMerge %102 None
+               OpBranchConditional %101 %103 %102
+        %103 = OpLabel
+        %105 = OpSLessThan %bool %95 %int_4
+               OpBranch %102
+        %102 = OpLabel
+        %106 = OpPhi %bool %101 %91 %105 %103
+        %100 = OpSelect %int %106 %96 %int_0
+        %108 = OpSGreaterThanEqual %bool %97 %int_0
+               OpSelectionMerge %109 None
+               OpBranchConditional %108 %110 %109
+        %110 = OpLabel
+        %112 = OpSLessThan %bool %98 %int_3
+               OpBranch %109
+        %109 = OpLabel
+        %113 = OpPhi %bool %108 %102 %112 %110
+        %107 = OpSelect %int %113 %99 %int_0
+        %115 = OpAccessChain %_ptr_Function_float %tempm43 %100 %107
+               OpStore %115 %float_1
+               OpBranch %87
+         %87 = OpLabel
+        %116 = OpLoad %int %c
+        %117 = OpIAdd %int %116 %int_1
+               OpStore %c %117
+               OpBranch %85
+         %86 = OpLabel
+        %118 = OpLoad %int %idx
+        %119 = OpLoad %int %idx
+        %120 = OpLoad %int %idx
+        %122 = OpSGreaterThanEqual %bool %118 %int_0
+               OpSelectionMerge %123 None
+               OpBranchConditional %122 %124 %123
+        %124 = OpLabel
+        %126 = OpSLessThan %bool %119 %int_9
+               OpBranch %123
+        %123 = OpLabel
+        %127 = OpPhi %bool %122 %86 %126 %124
+        %121 = OpSelect %int %127 %120 %int_0
+        %128 = OpLoad %int %ctr
+        %130 = OpAccessChain %_ptr_Function_float %m43 %128 %uint_1
+        %131 = OpLoad %float %130
+        %132 = OpAccessChain %_ptr_Function_float %GLF_live6sums %121
+        %133 = OpLoad %float %132
+        %134 = OpAccessChain %_ptr_Function_float %GLF_live6sums %121
+        %135 = OpFAdd %float %133 %131
+               OpStore %134 %135
+               OpBranch %69
+         %69 = OpLabel
+        %136 = OpLoad %int %ctr
+        %137 = OpIAdd %int %136 %int_1
+               OpStore %ctr %137
+               OpBranch %67
+         %68 = OpLabel
+        %138 = OpLoad %int %idx
+        %139 = OpIAdd %int %138 %int_1
+               OpStore %idx %139
+               OpBranch %50
+         %50 = OpLabel
+               OpBranch %48
+         %49 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %140
+%tint_symbol = OpFunctionParameter %main_out
+        %144 = OpLabel
+        %145 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %145
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+        %147 = OpLabel
+        %148 = OpFunctionCall %void %main_1
+        %150 = OpLoad %v4float %x_GLF_color
+        %151 = OpCompositeConstruct %main_out %150
+        %149 = OpFunctionCall %void %tint_symbol_2 %151
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..00e805e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,106 @@
+[[block]]
+struct buf0 {
+  injected : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var idx : i32;
+  var m43 : mat4x3<f32>;
+  var ll_1 : i32;
+  var GLF_live6rows : i32;
+  var z : i32;
+  var ll_2 : i32;
+  var ctr : i32;
+  var tempm43 : mat4x3<f32>;
+  var ll_3 : i32;
+  var c : i32;
+  var d : i32;
+  var GLF_live6sums : array<f32, 9>;
+  idx = 0;
+  m43 = mat4x3<f32>(vec3<f32>(1.0, 0.0, 0.0), vec3<f32>(0.0, 1.0, 0.0), vec3<f32>(0.0, 0.0, 1.0), vec3<f32>(0.0, 0.0, 0.0));
+  ll_1 = 0;
+  GLF_live6rows = 2;
+  loop {
+    let x_18 : i32 = ll_1;
+    let x_19 : i32 = x_9.injected;
+    if ((x_18 >= x_19)) {
+      x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+      break;
+    }
+    let x_20 : i32 = ll_1;
+    ll_1 = (x_20 + 1);
+    let x_22 : i32 = x_9.injected;
+    z = x_22;
+    ll_2 = 0;
+    ctr = 0;
+    loop {
+      let x_23 : i32 = ctr;
+      if ((x_23 < 1)) {
+      } else {
+        break;
+      }
+      let x_24 : i32 = ll_2;
+      let x_25 : i32 = x_9.injected;
+      if ((x_24 >= x_25)) {
+        break;
+      }
+      let x_26 : i32 = ll_2;
+      ll_2 = (x_26 + 1);
+      let x_98 : mat4x3<f32> = m43;
+      tempm43 = x_98;
+      ll_3 = 0;
+      c = 0;
+      loop {
+        let x_28 : i32 = z;
+        if ((1 < x_28)) {
+        } else {
+          break;
+        }
+        d = 0;
+        let x_29 : i32 = c;
+        let x_30 : i32 = c;
+        let x_31 : i32 = c;
+        let x_32 : i32 = d;
+        let x_33 : i32 = d;
+        let x_34 : i32 = d;
+        tempm43[select(0, x_31, ((x_29 >= 0) && (x_30 < 4)))][select(0, x_34, ((x_32 >= 0) && (x_33 < 3)))] = 1.0;
+
+        continuing {
+          let x_35 : i32 = c;
+          c = (x_35 + 1);
+        }
+      }
+      let x_37 : i32 = idx;
+      let x_38 : i32 = idx;
+      let x_39 : i32 = idx;
+      let x_117 : i32 = select(0, x_39, ((x_37 >= 0) && (x_38 < 9)));
+      let x_40 : i32 = ctr;
+      let x_119 : f32 = m43[x_40].y;
+      let x_121 : f32 = GLF_live6sums[x_117];
+      GLF_live6sums[x_117] = (x_121 + x_119);
+
+      continuing {
+        let x_41 : i32 = ctr;
+        ctr = (x_41 + 1);
+      }
+    }
+    let x_43 : i32 = idx;
+    idx = (x_43 + 1);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.wgsl
new file mode 100644
index 0000000..00e805e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.wgsl
@@ -0,0 +1,106 @@
+[[block]]
+struct buf0 {
+  injected : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var idx : i32;
+  var m43 : mat4x3<f32>;
+  var ll_1 : i32;
+  var GLF_live6rows : i32;
+  var z : i32;
+  var ll_2 : i32;
+  var ctr : i32;
+  var tempm43 : mat4x3<f32>;
+  var ll_3 : i32;
+  var c : i32;
+  var d : i32;
+  var GLF_live6sums : array<f32, 9>;
+  idx = 0;
+  m43 = mat4x3<f32>(vec3<f32>(1.0, 0.0, 0.0), vec3<f32>(0.0, 1.0, 0.0), vec3<f32>(0.0, 0.0, 1.0), vec3<f32>(0.0, 0.0, 0.0));
+  ll_1 = 0;
+  GLF_live6rows = 2;
+  loop {
+    let x_18 : i32 = ll_1;
+    let x_19 : i32 = x_9.injected;
+    if ((x_18 >= x_19)) {
+      x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+      break;
+    }
+    let x_20 : i32 = ll_1;
+    ll_1 = (x_20 + 1);
+    let x_22 : i32 = x_9.injected;
+    z = x_22;
+    ll_2 = 0;
+    ctr = 0;
+    loop {
+      let x_23 : i32 = ctr;
+      if ((x_23 < 1)) {
+      } else {
+        break;
+      }
+      let x_24 : i32 = ll_2;
+      let x_25 : i32 = x_9.injected;
+      if ((x_24 >= x_25)) {
+        break;
+      }
+      let x_26 : i32 = ll_2;
+      ll_2 = (x_26 + 1);
+      let x_98 : mat4x3<f32> = m43;
+      tempm43 = x_98;
+      ll_3 = 0;
+      c = 0;
+      loop {
+        let x_28 : i32 = z;
+        if ((1 < x_28)) {
+        } else {
+          break;
+        }
+        d = 0;
+        let x_29 : i32 = c;
+        let x_30 : i32 = c;
+        let x_31 : i32 = c;
+        let x_32 : i32 = d;
+        let x_33 : i32 = d;
+        let x_34 : i32 = d;
+        tempm43[select(0, x_31, ((x_29 >= 0) && (x_30 < 4)))][select(0, x_34, ((x_32 >= 0) && (x_33 < 3)))] = 1.0;
+
+        continuing {
+          let x_35 : i32 = c;
+          c = (x_35 + 1);
+        }
+      }
+      let x_37 : i32 = idx;
+      let x_38 : i32 = idx;
+      let x_39 : i32 = idx;
+      let x_117 : i32 = select(0, x_39, ((x_37 >= 0) && (x_38 < 9)));
+      let x_40 : i32 = ctr;
+      let x_119 : f32 = m43[x_40].y;
+      let x_121 : f32 = GLF_live6sums[x_117];
+      GLF_live6sums[x_117] = (x_121 + x_119);
+
+      continuing {
+        let x_41 : i32 = ctr;
+        ctr = (x_41 + 1);
+      }
+    }
+    let x_43 : i32 = idx;
+    idx = (x_43 + 1);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
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
new file mode 100755
index 0000000..b2cb2a3
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,99 @@
+SKIP: FAILED
+
+void set_float3(inout float3 vec, int idx, float val) {
+  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
+}
+
+cbuffer cbuffer_x_9 : register(b0, space0) {
+  uint4 x_9[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  int idx = 0;
+  float4x3 m43 = float4x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  int ll_1 = 0;
+  int GLF_live6rows = 0;
+  int z = 0;
+  int ll_2 = 0;
+  int ctr = 0;
+  float4x3 tempm43 = float4x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  int ll_3 = 0;
+  int c = 0;
+  int d = 0;
+  float GLF_live6sums[9] = (float[9])0;
+  idx = 0;
+  m43 = float4x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f), float3(0.0f, 0.0f, 0.0f));
+  ll_1 = 0;
+  GLF_live6rows = 2;
+  while (true) {
+    const int x_18 = ll_1;
+    const int x_19 = asint(x_9[0].x);
+    if ((x_18 >= x_19)) {
+      x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+      break;
+    }
+    ll_1 = (ll_1 + 1);
+    const int x_22 = asint(x_9[0].x);
+    z = x_22;
+    ll_2 = 0;
+    ctr = 0;
+    {
+      for(; (ctr < 1); ctr = (ctr + 1)) {
+        const int x_24 = ll_2;
+        const int x_25 = asint(x_9[0].x);
+        if ((x_24 >= x_25)) {
+          break;
+        }
+        ll_2 = (ll_2 + 1);
+        tempm43 = m43;
+        ll_3 = 0;
+        c = 0;
+        {
+          for(; (1 < z); c = (c + 1)) {
+            d = 0;
+            bool tint_tmp = (c >= 0);
+            if (tint_tmp) {
+              tint_tmp = (c < 4);
+            }
+            bool tint_tmp_1 = (d >= 0);
+            if (tint_tmp_1) {
+              tint_tmp_1 = (d < 3);
+            }
+            set_float3(tempm43[((tint_tmp) ? c : 0)], ((tint_tmp_1) ? d : 0), 1.0f);
+          }
+        }
+        bool tint_tmp_2 = (idx >= 0);
+        if (tint_tmp_2) {
+          tint_tmp_2 = (idx < 9);
+        }
+        const int x_117 = ((tint_tmp_2) ? idx : 0);
+        const float x_119 = m43[ctr].y;
+        const float x_121 = GLF_live6sums[x_117];
+        GLF_live6sums[x_117] = (x_121 + x_119);
+      }
+    }
+    idx = (idx + 1);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
+error: validation errors
+T:\tmp\udx0.0:86: error: Loop must have break.
+Validation failed.
+
+
+
diff --git a/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..aa5c43e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.wgsl.expected.msl
@@ -0,0 +1,109 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ int injected;
+};
+struct tint_array_wrapper {
+  float arr[9];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_9, thread float4* const tint_symbol_4) {
+  int idx = 0;
+  float4x3 m43 = float4x3(0.0f);
+  int ll_1 = 0;
+  int GLF_live6rows = 0;
+  int z = 0;
+  int ll_2 = 0;
+  int ctr = 0;
+  float4x3 tempm43 = float4x3(0.0f);
+  int ll_3 = 0;
+  int c = 0;
+  int d = 0;
+  tint_array_wrapper GLF_live6sums = {};
+  idx = 0;
+  m43 = float4x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f), float3(0.0f, 0.0f, 0.0f));
+  ll_1 = 0;
+  GLF_live6rows = 2;
+  while (true) {
+    int const x_18 = ll_1;
+    int const x_19 = x_9.injected;
+    if ((x_18 >= x_19)) {
+      *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+      break;
+    }
+    int const x_20 = ll_1;
+    ll_1 = (x_20 + 1);
+    int const x_22 = x_9.injected;
+    z = x_22;
+    ll_2 = 0;
+    ctr = 0;
+    while (true) {
+      int const x_23 = ctr;
+      if ((x_23 < 1)) {
+      } else {
+        break;
+      }
+      int const x_24 = ll_2;
+      int const x_25 = x_9.injected;
+      if ((x_24 >= x_25)) {
+        break;
+      }
+      int const x_26 = ll_2;
+      ll_2 = (x_26 + 1);
+      float4x3 const x_98 = m43;
+      tempm43 = x_98;
+      ll_3 = 0;
+      c = 0;
+      while (true) {
+        int const x_28 = z;
+        if ((1 < x_28)) {
+        } else {
+          break;
+        }
+        d = 0;
+        int const x_29 = c;
+        int const x_30 = c;
+        int const x_31 = c;
+        int const x_32 = d;
+        int const x_33 = d;
+        int const x_34 = d;
+        tempm43[select(0, x_31, ((x_29 >= 0) && (x_30 < 4)))][select(0, x_34, ((x_32 >= 0) && (x_33 < 3)))] = 1.0f;
+        {
+          int const x_35 = c;
+          c = (x_35 + 1);
+        }
+      }
+      int const x_37 = idx;
+      int const x_38 = idx;
+      int const x_39 = idx;
+      int const x_117 = select(0, x_39, ((x_37 >= 0) && (x_38 < 9)));
+      int const x_40 = ctr;
+      float const x_119 = m43[x_40].y;
+      float const x_121 = GLF_live6sums.arr[x_117];
+      GLF_live6sums.arr[x_117] = (x_121 + x_119);
+      {
+        int const x_41 = ctr;
+        ctr = (x_41 + 1);
+      }
+    }
+    int const x_43 = idx;
+    idx = (x_43 + 1);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_9 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_9, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..63de0fc
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,255 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 152
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injected"
+               OpName %x_9 "x_9"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %idx "idx"
+               OpName %m43 "m43"
+               OpName %ll_1 "ll_1"
+               OpName %GLF_live6rows "GLF_live6rows"
+               OpName %z "z"
+               OpName %ll_2 "ll_2"
+               OpName %ctr "ctr"
+               OpName %tempm43 "tempm43"
+               OpName %ll_3 "ll_3"
+               OpName %c "c"
+               OpName %d "d"
+               OpName %GLF_live6sums "GLF_live6sums"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_9 NonWritable
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_float_uint_9 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+       %buf0 = OpTypeStruct %int
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_9 = OpVariable %_ptr_Uniform_buf0 Uniform
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+         %18 = OpConstantNull %int
+    %v3float = OpTypeVector %float 3
+%mat4v3float = OpTypeMatrix %v3float 4
+%_ptr_Function_mat4v3float = OpTypePointer Function %mat4v3float
+         %23 = OpConstantNull %mat4v3float
+       %uint = OpTypeInt 32 0
+     %uint_9 = OpConstant %uint 9
+%_arr_float_uint_9 = OpTypeArray %float %uint_9
+%_ptr_Function__arr_float_uint_9 = OpTypePointer Function %_arr_float_uint_9
+         %38 = OpConstantNull %_arr_float_uint_9
+      %int_0 = OpConstant %int 0
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %42 = OpConstantComposite %v3float %float_1 %float_0 %float_0
+         %43 = OpConstantComposite %v3float %float_0 %float_1 %float_0
+         %44 = OpConstantComposite %v3float %float_0 %float_0 %float_1
+         %45 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+         %46 = OpConstantComposite %mat4v3float %42 %43 %44 %45
+      %int_2 = OpConstant %int 2
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+       %bool = OpTypeBool
+         %61 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %int_1 = OpConstant %int 1
+      %int_4 = OpConstant %int 4
+      %int_3 = OpConstant %int 3
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_9 = OpConstant %int 9
+     %uint_1 = OpConstant %uint 1
+   %main_out = OpTypeStruct %v4float
+        %140 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+        %idx = OpVariable %_ptr_Function_int Function %18
+        %m43 = OpVariable %_ptr_Function_mat4v3float Function %23
+       %ll_1 = OpVariable %_ptr_Function_int Function %18
+%GLF_live6rows = OpVariable %_ptr_Function_int Function %18
+          %z = OpVariable %_ptr_Function_int Function %18
+       %ll_2 = OpVariable %_ptr_Function_int Function %18
+        %ctr = OpVariable %_ptr_Function_int Function %18
+    %tempm43 = OpVariable %_ptr_Function_mat4v3float Function %23
+       %ll_3 = OpVariable %_ptr_Function_int Function %18
+          %c = OpVariable %_ptr_Function_int Function %18
+          %d = OpVariable %_ptr_Function_int Function %18
+%GLF_live6sums = OpVariable %_ptr_Function__arr_float_uint_9 Function %38
+               OpStore %idx %int_0
+               OpStore %m43 %46
+               OpStore %ll_1 %int_0
+               OpStore %GLF_live6rows %int_2
+               OpBranch %48
+         %48 = OpLabel
+               OpLoopMerge %49 %50 None
+               OpBranch %51
+         %51 = OpLabel
+         %52 = OpLoad %int %ll_1
+         %55 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0
+         %56 = OpLoad %int %55
+         %57 = OpSGreaterThanEqual %bool %52 %56
+               OpSelectionMerge %59 None
+               OpBranchConditional %57 %60 %59
+         %60 = OpLabel
+               OpStore %x_GLF_color %61
+               OpBranch %49
+         %59 = OpLabel
+         %62 = OpLoad %int %ll_1
+         %64 = OpIAdd %int %62 %int_1
+               OpStore %ll_1 %64
+         %65 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0
+         %66 = OpLoad %int %65
+               OpStore %z %66
+               OpStore %ll_2 %int_0
+               OpStore %ctr %int_0
+               OpBranch %67
+         %67 = OpLabel
+               OpLoopMerge %68 %69 None
+               OpBranch %70
+         %70 = OpLabel
+         %71 = OpLoad %int %ctr
+         %72 = OpSLessThan %bool %71 %int_1
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %74 %75
+         %74 = OpLabel
+               OpBranch %73
+         %75 = OpLabel
+               OpBranch %68
+         %73 = OpLabel
+         %76 = OpLoad %int %ll_2
+         %77 = OpAccessChain %_ptr_Uniform_int %x_9 %uint_0
+         %78 = OpLoad %int %77
+         %79 = OpSGreaterThanEqual %bool %76 %78
+               OpSelectionMerge %80 None
+               OpBranchConditional %79 %81 %80
+         %81 = OpLabel
+               OpBranch %68
+         %80 = OpLabel
+         %82 = OpLoad %int %ll_2
+         %83 = OpIAdd %int %82 %int_1
+               OpStore %ll_2 %83
+         %84 = OpLoad %mat4v3float %m43
+               OpStore %tempm43 %84
+               OpStore %ll_3 %int_0
+               OpStore %c %int_0
+               OpBranch %85
+         %85 = OpLabel
+               OpLoopMerge %86 %87 None
+               OpBranch %88
+         %88 = OpLabel
+         %89 = OpLoad %int %z
+         %90 = OpSLessThan %bool %int_1 %89
+               OpSelectionMerge %91 None
+               OpBranchConditional %90 %92 %93
+         %92 = OpLabel
+               OpBranch %91
+         %93 = OpLabel
+               OpBranch %86
+         %91 = OpLabel
+               OpStore %d %int_0
+         %94 = OpLoad %int %c
+         %95 = OpLoad %int %c
+         %96 = OpLoad %int %c
+         %97 = OpLoad %int %d
+         %98 = OpLoad %int %d
+         %99 = OpLoad %int %d
+        %101 = OpSGreaterThanEqual %bool %94 %int_0
+               OpSelectionMerge %102 None
+               OpBranchConditional %101 %103 %102
+        %103 = OpLabel
+        %105 = OpSLessThan %bool %95 %int_4
+               OpBranch %102
+        %102 = OpLabel
+        %106 = OpPhi %bool %101 %91 %105 %103
+        %100 = OpSelect %int %106 %96 %int_0
+        %108 = OpSGreaterThanEqual %bool %97 %int_0
+               OpSelectionMerge %109 None
+               OpBranchConditional %108 %110 %109
+        %110 = OpLabel
+        %112 = OpSLessThan %bool %98 %int_3
+               OpBranch %109
+        %109 = OpLabel
+        %113 = OpPhi %bool %108 %102 %112 %110
+        %107 = OpSelect %int %113 %99 %int_0
+        %115 = OpAccessChain %_ptr_Function_float %tempm43 %100 %107
+               OpStore %115 %float_1
+               OpBranch %87
+         %87 = OpLabel
+        %116 = OpLoad %int %c
+        %117 = OpIAdd %int %116 %int_1
+               OpStore %c %117
+               OpBranch %85
+         %86 = OpLabel
+        %118 = OpLoad %int %idx
+        %119 = OpLoad %int %idx
+        %120 = OpLoad %int %idx
+        %122 = OpSGreaterThanEqual %bool %118 %int_0
+               OpSelectionMerge %123 None
+               OpBranchConditional %122 %124 %123
+        %124 = OpLabel
+        %126 = OpSLessThan %bool %119 %int_9
+               OpBranch %123
+        %123 = OpLabel
+        %127 = OpPhi %bool %122 %86 %126 %124
+        %121 = OpSelect %int %127 %120 %int_0
+        %128 = OpLoad %int %ctr
+        %130 = OpAccessChain %_ptr_Function_float %m43 %128 %uint_1
+        %131 = OpLoad %float %130
+        %132 = OpAccessChain %_ptr_Function_float %GLF_live6sums %121
+        %133 = OpLoad %float %132
+        %134 = OpAccessChain %_ptr_Function_float %GLF_live6sums %121
+        %135 = OpFAdd %float %133 %131
+               OpStore %134 %135
+               OpBranch %69
+         %69 = OpLabel
+        %136 = OpLoad %int %ctr
+        %137 = OpIAdd %int %136 %int_1
+               OpStore %ctr %137
+               OpBranch %67
+         %68 = OpLabel
+        %138 = OpLoad %int %idx
+        %139 = OpIAdd %int %138 %int_1
+               OpStore %idx %139
+               OpBranch %50
+         %50 = OpLabel
+               OpBranch %48
+         %49 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %140
+%tint_symbol = OpFunctionParameter %main_out
+        %144 = OpLabel
+        %145 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %145
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+        %147 = OpLabel
+        %148 = OpFunctionCall %void %main_1
+        %150 = OpLoad %v4float %x_GLF_color
+        %151 = OpCompositeConstruct %main_out %150
+        %149 = OpFunctionCall %void %tint_symbol_2 %151
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..00e805e
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,106 @@
+[[block]]
+struct buf0 {
+  injected : i32;
+};
+
+[[group(0), binding(0)]] var<uniform> x_9 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var idx : i32;
+  var m43 : mat4x3<f32>;
+  var ll_1 : i32;
+  var GLF_live6rows : i32;
+  var z : i32;
+  var ll_2 : i32;
+  var ctr : i32;
+  var tempm43 : mat4x3<f32>;
+  var ll_3 : i32;
+  var c : i32;
+  var d : i32;
+  var GLF_live6sums : array<f32, 9>;
+  idx = 0;
+  m43 = mat4x3<f32>(vec3<f32>(1.0, 0.0, 0.0), vec3<f32>(0.0, 1.0, 0.0), vec3<f32>(0.0, 0.0, 1.0), vec3<f32>(0.0, 0.0, 0.0));
+  ll_1 = 0;
+  GLF_live6rows = 2;
+  loop {
+    let x_18 : i32 = ll_1;
+    let x_19 : i32 = x_9.injected;
+    if ((x_18 >= x_19)) {
+      x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+      break;
+    }
+    let x_20 : i32 = ll_1;
+    ll_1 = (x_20 + 1);
+    let x_22 : i32 = x_9.injected;
+    z = x_22;
+    ll_2 = 0;
+    ctr = 0;
+    loop {
+      let x_23 : i32 = ctr;
+      if ((x_23 < 1)) {
+      } else {
+        break;
+      }
+      let x_24 : i32 = ll_2;
+      let x_25 : i32 = x_9.injected;
+      if ((x_24 >= x_25)) {
+        break;
+      }
+      let x_26 : i32 = ll_2;
+      ll_2 = (x_26 + 1);
+      let x_98 : mat4x3<f32> = m43;
+      tempm43 = x_98;
+      ll_3 = 0;
+      c = 0;
+      loop {
+        let x_28 : i32 = z;
+        if ((1 < x_28)) {
+        } else {
+          break;
+        }
+        d = 0;
+        let x_29 : i32 = c;
+        let x_30 : i32 = c;
+        let x_31 : i32 = c;
+        let x_32 : i32 = d;
+        let x_33 : i32 = d;
+        let x_34 : i32 = d;
+        tempm43[select(0, x_31, ((x_29 >= 0) && (x_30 < 4)))][select(0, x_34, ((x_32 >= 0) && (x_33 < 3)))] = 1.0;
+
+        continuing {
+          let x_35 : i32 = c;
+          c = (x_35 + 1);
+        }
+      }
+      let x_37 : i32 = idx;
+      let x_38 : i32 = idx;
+      let x_39 : i32 = idx;
+      let x_117 : i32 = select(0, x_39, ((x_37 >= 0) && (x_38 < 9)));
+      let x_40 : i32 = ctr;
+      let x_119 : f32 = m43[x_40].y;
+      let x_121 : f32 = GLF_live6sums[x_117];
+      GLF_live6sums[x_117] = (x_121 + x_119);
+
+      continuing {
+        let x_41 : i32 = ctr;
+        ctr = (x_41 + 1);
+      }
+    }
+    let x_43 : i32 = idx;
+    idx = (x_43 + 1);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.spvasm
new file mode 100644
index 0000000..2e99227
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.spvasm
@@ -0,0 +1,817 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %BST "BST"
+               OpMemberName %BST 0 "data"
+               OpMemberName %BST 1 "leftIndex"
+               OpMemberName %BST 2 "rightIndex"
+               OpName %makeTreeNode_struct_BST_i1_i1_i11_i1_ "makeTreeNode(struct-BST-i1-i1-i11;i1;"
+               OpName %tree "tree"
+               OpName %data "data"
+               OpName %insert_i1_i1_ "insert(i1;i1;"
+               OpName %treeIndex "treeIndex"
+               OpName %data_0 "data"
+               OpName %search_i1_ "search(i1;"
+               OpName %target "target"
+               OpName %hueColor_f1_ "hueColor(f1;"
+               OpName %angle "angle"
+               OpName %makeFrame_f1_ "makeFrame(f1;"
+               OpName %v "v"
+               OpName %baseIndex "baseIndex"
+               OpName %tree_0 "tree"
+               OpName %param "param"
+               OpName %param_0 "param"
+               OpName %param_1 "param"
+               OpName %param_2 "param"
+               OpName %GLF_live8i "GLF_live8i"
+               OpName %GLF_live8A "GLF_live8A"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %index "index"
+               OpName %currentNode "currentNode"
+               OpName %nodeData "nodeData"
+               OpName %param_3 "param"
+               OpName %param_4 "param"
+               OpName %param_5 "param"
+               OpName %param_6 "param"
+               OpName %treeIndex_0 "treeIndex"
+               OpName %param_7 "param"
+               OpName %param_8 "param"
+               OpName %param_9 "param"
+               OpName %param_10 "param"
+               OpName %GLF_live1_looplimiter2 "GLF_live1_looplimiter2"
+               OpName %GLF_live1i "GLF_live1i"
+               OpName %param_11 "param"
+               OpName %param_12 "param"
+               OpName %param_13 "param"
+               OpName %param_14 "param"
+               OpName %param_15 "param"
+               OpName %param_16 "param"
+               OpName %param_17 "param"
+               OpName %param_18 "param"
+               OpName %param_19 "param"
+               OpName %param_20 "param"
+               OpName %param_21 "param"
+               OpName %param_22 "param"
+               OpName %GLF_live4_looplimiter3 "GLF_live4_looplimiter3"
+               OpName %GLF_live4i "GLF_live4i"
+               OpName %GLF_live4index "GLF_live4index"
+               OpName %Obj "Obj"
+               OpMemberName %Obj 0 "odd_numbers"
+               OpMemberName %Obj 1 "even_numbers"
+               OpName %GLF_live4obj "GLF_live4obj"
+               OpName %param_23 "param"
+               OpName %param_24 "param"
+               OpName %param_25 "param"
+               OpName %param_26 "param"
+               OpName %z "z"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x "x"
+               OpName %param_27 "param"
+               OpName %y "y"
+               OpName %param_28 "param"
+               OpName %sum "sum"
+               OpName %target_0 "target"
+               OpName %result "result"
+               OpName %param_29 "param"
+               OpName %a "a"
+               OpName %_GLF_color "_GLF_color"
+               OpName %param_30 "param"
+               OpMemberDecorate %BST 0 RelaxedPrecision
+               OpMemberDecorate %BST 1 RelaxedPrecision
+               OpMemberDecorate %BST 2 RelaxedPrecision
+               OpDecorate %data RelaxedPrecision
+               OpDecorate %treeIndex RelaxedPrecision
+               OpDecorate %data_0 RelaxedPrecision
+               OpDecorate %search_i1_ RelaxedPrecision
+               OpDecorate %target RelaxedPrecision
+               OpDecorate %74 RelaxedPrecision
+               OpDecorate %baseIndex RelaxedPrecision
+               OpDecorate %75 RelaxedPrecision
+               OpDecorate %76 RelaxedPrecision
+               OpDecorate %77 RelaxedPrecision
+               OpDecorate %78 RelaxedPrecision
+               OpDecorate %79 RelaxedPrecision
+               OpDecorate %80 RelaxedPrecision
+               OpDecorate %81 RelaxedPrecision
+               OpDecorate %82 RelaxedPrecision
+               OpDecorate %83 RelaxedPrecision
+               OpDecorate %84 RelaxedPrecision
+               OpDecorate %85 RelaxedPrecision
+               OpDecorate %86 RelaxedPrecision
+               OpDecorate %87 RelaxedPrecision
+               OpDecorate %88 RelaxedPrecision
+               OpDecorate %89 RelaxedPrecision
+               OpDecorate %90 RelaxedPrecision
+               OpDecorate %91 RelaxedPrecision
+               OpDecorate %92 RelaxedPrecision
+               OpDecorate %93 RelaxedPrecision
+               OpDecorate %GLF_live8i RelaxedPrecision
+               OpDecorate %94 RelaxedPrecision
+               OpDecorate %95 RelaxedPrecision
+               OpDecorate %96 RelaxedPrecision
+               OpDecorate %97 RelaxedPrecision
+               OpDecorate %98 RelaxedPrecision
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %index RelaxedPrecision
+               OpDecorate %99 RelaxedPrecision
+               OpDecorate %100 RelaxedPrecision
+               OpDecorate %101 RelaxedPrecision
+               OpDecorate %102 RelaxedPrecision
+               OpDecorate %103 RelaxedPrecision
+               OpDecorate %104 RelaxedPrecision
+               OpDecorate %105 RelaxedPrecision
+               OpDecorate %106 RelaxedPrecision
+               OpDecorate %107 RelaxedPrecision
+               OpDecorate %108 RelaxedPrecision
+               OpDecorate %109 RelaxedPrecision
+               OpDecorate %110 RelaxedPrecision
+               OpDecorate %111 RelaxedPrecision
+               OpDecorate %112 RelaxedPrecision
+               OpDecorate %treeIndex_0 RelaxedPrecision
+               OpDecorate %113 RelaxedPrecision
+               OpDecorate %114 RelaxedPrecision
+               OpDecorate %115 RelaxedPrecision
+               OpDecorate %116 RelaxedPrecision
+               OpDecorate %117 RelaxedPrecision
+               OpDecorate %GLF_live1_looplimiter2 RelaxedPrecision
+               OpDecorate %GLF_live1i RelaxedPrecision
+               OpDecorate %118 RelaxedPrecision
+               OpDecorate %119 RelaxedPrecision
+               OpDecorate %120 RelaxedPrecision
+               OpDecorate %121 RelaxedPrecision
+               OpDecorate %122 RelaxedPrecision
+               OpDecorate %123 RelaxedPrecision
+               OpDecorate %124 RelaxedPrecision
+               OpDecorate %125 RelaxedPrecision
+               OpDecorate %126 RelaxedPrecision
+               OpDecorate %127 RelaxedPrecision
+               OpDecorate %128 RelaxedPrecision
+               OpDecorate %129 RelaxedPrecision
+               OpDecorate %130 RelaxedPrecision
+               OpDecorate %131 RelaxedPrecision
+               OpDecorate %132 RelaxedPrecision
+               OpDecorate %133 RelaxedPrecision
+               OpDecorate %134 RelaxedPrecision
+               OpDecorate %135 RelaxedPrecision
+               OpDecorate %136 RelaxedPrecision
+               OpDecorate %137 RelaxedPrecision
+               OpDecorate %138 RelaxedPrecision
+               OpDecorate %139 RelaxedPrecision
+               OpDecorate %140 RelaxedPrecision
+               OpDecorate %GLF_live4_looplimiter3 RelaxedPrecision
+               OpDecorate %GLF_live4i RelaxedPrecision
+               OpDecorate %141 RelaxedPrecision
+               OpDecorate %142 RelaxedPrecision
+               OpDecorate %143 RelaxedPrecision
+               OpDecorate %GLF_live4index RelaxedPrecision
+               OpDecorate %144 RelaxedPrecision
+               OpDecorate %145 RelaxedPrecision
+               OpDecorate %146 RelaxedPrecision
+               OpDecorate %147 RelaxedPrecision
+               OpDecorate %148 RelaxedPrecision
+               OpDecorate %149 RelaxedPrecision
+               OpDecorate %150 RelaxedPrecision
+               OpDecorate %151 RelaxedPrecision
+               OpDecorate %152 RelaxedPrecision
+               OpDecorate %153 RelaxedPrecision
+               OpDecorate %154 RelaxedPrecision
+               OpDecorate %155 RelaxedPrecision
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %sum RelaxedPrecision
+               OpDecorate %target_0 RelaxedPrecision
+               OpDecorate %156 RelaxedPrecision
+               OpDecorate %result RelaxedPrecision
+               OpDecorate %157 RelaxedPrecision
+               OpDecorate %158 RelaxedPrecision
+               OpDecorate %159 RelaxedPrecision
+               OpDecorate %160 RelaxedPrecision
+               OpDecorate %161 RelaxedPrecision
+               OpDecorate %162 RelaxedPrecision
+               OpDecorate %163 RelaxedPrecision
+               OpDecorate %164 RelaxedPrecision
+               OpDecorate %165 RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+        %167 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+        %BST = OpTypeStruct %int %int %int
+%_ptr_Function_BST = OpTypePointer Function %BST
+%_ptr_Function_int = OpTypePointer Function %int
+        %171 = OpTypeFunction %void %_ptr_Function_BST %_ptr_Function_int
+        %172 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+        %173 = OpTypeFunction %int %_ptr_Function_int
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+    %v3float = OpTypeVector %float 3
+        %177 = OpTypeFunction %v3float %_ptr_Function_float
+        %178 = OpTypeFunction %float %_ptr_Function_float
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+     %int_n1 = OpConstant %int -1
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_BST_uint_10 = OpTypeArray %BST %uint_10
+%_ptr_Private__arr_BST_uint_10 = OpTypePointer Private %_arr_BST_uint_10
+     %tree_0 = OpVariable %_ptr_Private__arr_BST_uint_10 Private
+%_ptr_Private_int = OpTypePointer Private %int
+%_ptr_Private_BST = OpTypePointer Private %BST
+    %uint_50 = OpConstant %uint 50
+%_arr_float_uint_50 = OpTypeArray %float %uint_50
+%_ptr_Function__arr_float_uint_50 = OpTypePointer Function %_arr_float_uint_50
+     %int_50 = OpConstant %int 50
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+     %uint_1 = OpConstant %uint 1
+     %int_15 = OpConstant %int 15
+   %float_30 = OpConstant %float 30
+    %float_1 = OpConstant %float 1
+    %float_5 = OpConstant %float 5
+   %float_50 = OpConstant %float 50
+  %float_6_5 = OpConstant %float 6.5
+  %float_1_5 = OpConstant %float 1.5
+    %int_100 = OpConstant %int 100
+    %float_4 = OpConstant %float 4
+    %float_0 = OpConstant %float 0
+      %int_6 = OpConstant %int 6
+   %float_10 = OpConstant %float 10
+     %int_30 = OpConstant %int 30
+      %int_9 = OpConstant %int 9
+      %int_5 = OpConstant %int 5
+       %true = OpConstantTrue %bool
+      %int_7 = OpConstant %int 7
+     %int_12 = OpConstant %int 12
+      %int_8 = OpConstant %int 8
+      %int_3 = OpConstant %int 3
+%_arr_float_uint_10 = OpTypeArray %float %uint_10
+        %Obj = OpTypeStruct %_arr_float_uint_10 %_arr_float_uint_10
+%_ptr_Function_Obj = OpTypePointer Function %Obj
+     %int_10 = OpConstant %int 10
+     %int_17 = OpConstant %int 17
+     %int_13 = OpConstant %int 13
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+  %float_256 = OpConstant %float 256
+        %228 = OpConstantComposite %v2float %float_256 %float_256
+   %int_n100 = OpConstant %int -100
+     %int_20 = OpConstant %int 20
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+        %233 = OpConstantComposite %v3float %float_1 %float_0 %float_0
+       %main = OpFunction %void None %167
+        %234 = OpLabel
+%treeIndex_0 = OpVariable %_ptr_Function_int Function
+    %param_7 = OpVariable %_ptr_Function_BST Function
+    %param_8 = OpVariable %_ptr_Function_int Function
+    %param_9 = OpVariable %_ptr_Function_int Function
+   %param_10 = OpVariable %_ptr_Function_int Function
+%GLF_live1_looplimiter2 = OpVariable %_ptr_Function_int Function
+ %GLF_live1i = OpVariable %_ptr_Function_int Function
+   %param_11 = OpVariable %_ptr_Function_int Function
+   %param_12 = OpVariable %_ptr_Function_int Function
+   %param_13 = OpVariable %_ptr_Function_int Function
+   %param_14 = OpVariable %_ptr_Function_int Function
+   %param_15 = OpVariable %_ptr_Function_int Function
+   %param_16 = OpVariable %_ptr_Function_int Function
+   %param_17 = OpVariable %_ptr_Function_int Function
+   %param_18 = OpVariable %_ptr_Function_int Function
+   %param_19 = OpVariable %_ptr_Function_int Function
+   %param_20 = OpVariable %_ptr_Function_int Function
+   %param_21 = OpVariable %_ptr_Function_int Function
+   %param_22 = OpVariable %_ptr_Function_int Function
+%GLF_live4_looplimiter3 = OpVariable %_ptr_Function_int Function
+ %GLF_live4i = OpVariable %_ptr_Function_int Function
+%GLF_live4index = OpVariable %_ptr_Function_int Function
+%GLF_live4obj = OpVariable %_ptr_Function_Obj Function
+   %param_23 = OpVariable %_ptr_Function_int Function
+   %param_24 = OpVariable %_ptr_Function_int Function
+   %param_25 = OpVariable %_ptr_Function_int Function
+   %param_26 = OpVariable %_ptr_Function_int Function
+          %z = OpVariable %_ptr_Function_v2float Function
+          %x = OpVariable %_ptr_Function_float Function
+   %param_27 = OpVariable %_ptr_Function_float Function
+          %y = OpVariable %_ptr_Function_float Function
+   %param_28 = OpVariable %_ptr_Function_float Function
+        %sum = OpVariable %_ptr_Function_int Function
+   %target_0 = OpVariable %_ptr_Function_int Function
+     %result = OpVariable %_ptr_Function_int Function
+   %param_29 = OpVariable %_ptr_Function_int Function
+          %a = OpVariable %_ptr_Function_float Function
+        %235 = OpVariable %_ptr_Function_v3float Function
+   %param_30 = OpVariable %_ptr_Function_float Function
+               OpStore %treeIndex_0 %int_0
+        %236 = OpAccessChain %_ptr_Private_BST %tree_0 %int_0
+        %237 = OpLoad %BST %236
+               OpStore %param_7 %237
+               OpStore %param_8 %int_9
+        %238 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param_7 %param_8
+        %239 = OpLoad %BST %param_7
+        %240 = OpAccessChain %_ptr_Private_BST %tree_0 %int_0
+               OpStore %240 %239
+        %113 = OpLoad %int %treeIndex_0
+        %114 = OpIAdd %int %113 %int_1
+               OpStore %treeIndex_0 %114
+        %115 = OpLoad %int %treeIndex_0
+               OpStore %param_9 %115
+               OpStore %param_10 %int_5
+        %241 = OpFunctionCall %void %insert_i1_i1_ %param_9 %param_10
+        %116 = OpLoad %int %treeIndex_0
+        %117 = OpIAdd %int %116 %int_1
+               OpStore %treeIndex_0 %117
+               OpStore %GLF_live1_looplimiter2 %int_0
+               OpStore %GLF_live1i %int_0
+               OpBranch %242
+        %242 = OpLabel
+               OpLoopMerge %243 %244 None
+               OpBranch %245
+        %245 = OpLabel
+               OpBranchConditional %true %246 %243
+        %246 = OpLabel
+        %118 = OpLoad %int %GLF_live1_looplimiter2
+        %247 = OpSGreaterThanEqual %bool %118 %int_7
+               OpSelectionMerge %248 None
+               OpBranchConditional %247 %249 %248
+        %249 = OpLabel
+               OpBranch %243
+        %248 = OpLabel
+        %119 = OpLoad %int %GLF_live1_looplimiter2
+        %120 = OpIAdd %int %119 %int_1
+               OpStore %GLF_live1_looplimiter2 %120
+               OpBranch %244
+        %244 = OpLabel
+        %121 = OpLoad %int %GLF_live1i
+        %122 = OpIAdd %int %121 %int_1
+               OpStore %GLF_live1i %122
+               OpBranch %242
+        %243 = OpLabel
+        %123 = OpLoad %int %treeIndex_0
+               OpStore %param_11 %123
+               OpStore %param_12 %int_12
+        %250 = OpFunctionCall %void %insert_i1_i1_ %param_11 %param_12
+        %124 = OpLoad %int %treeIndex_0
+        %125 = OpIAdd %int %124 %int_1
+               OpStore %treeIndex_0 %125
+        %126 = OpLoad %int %treeIndex_0
+               OpStore %param_13 %126
+               OpStore %param_14 %int_15
+        %251 = OpFunctionCall %void %insert_i1_i1_ %param_13 %param_14
+        %127 = OpLoad %int %treeIndex_0
+        %128 = OpIAdd %int %127 %int_1
+               OpStore %treeIndex_0 %128
+        %129 = OpLoad %int %treeIndex_0
+               OpStore %param_15 %129
+               OpStore %param_16 %int_7
+        %252 = OpFunctionCall %void %insert_i1_i1_ %param_15 %param_16
+        %130 = OpLoad %int %treeIndex_0
+        %131 = OpIAdd %int %130 %int_1
+               OpStore %treeIndex_0 %131
+        %132 = OpLoad %int %treeIndex_0
+               OpStore %param_17 %132
+               OpStore %param_18 %int_8
+        %253 = OpFunctionCall %void %insert_i1_i1_ %param_17 %param_18
+        %133 = OpLoad %int %treeIndex_0
+        %134 = OpIAdd %int %133 %int_1
+               OpStore %treeIndex_0 %134
+        %135 = OpLoad %int %treeIndex_0
+               OpStore %param_19 %135
+               OpStore %param_20 %int_2
+        %254 = OpFunctionCall %void %insert_i1_i1_ %param_19 %param_20
+        %136 = OpLoad %int %treeIndex_0
+        %137 = OpIAdd %int %136 %int_1
+               OpStore %treeIndex_0 %137
+        %138 = OpLoad %int %treeIndex_0
+               OpStore %param_21 %138
+               OpStore %param_22 %int_6
+        %255 = OpFunctionCall %void %insert_i1_i1_ %param_21 %param_22
+        %139 = OpLoad %int %treeIndex_0
+        %140 = OpIAdd %int %139 %int_1
+               OpStore %treeIndex_0 %140
+               OpStore %GLF_live4_looplimiter3 %int_0
+               OpStore %GLF_live4i %int_0
+               OpBranch %256
+        %256 = OpLabel
+               OpLoopMerge %257 %258 None
+               OpBranch %259
+        %259 = OpLabel
+               OpBranchConditional %true %260 %257
+        %260 = OpLabel
+        %141 = OpLoad %int %GLF_live4_looplimiter3
+        %261 = OpSGreaterThanEqual %bool %141 %int_3
+               OpSelectionMerge %262 None
+               OpBranchConditional %261 %263 %262
+        %263 = OpLabel
+               OpBranch %257
+        %262 = OpLabel
+        %142 = OpLoad %int %GLF_live4_looplimiter3
+        %143 = OpIAdd %int %142 %int_1
+               OpStore %GLF_live4_looplimiter3 %143
+               OpStore %GLF_live4index %int_1
+        %144 = OpLoad %int %GLF_live4index
+        %264 = OpSGreaterThanEqual %bool %144 %int_0
+        %145 = OpLoad %int %GLF_live4index
+        %265 = OpSLessThan %bool %145 %int_10
+        %266 = OpLogicalAnd %bool %264 %265
+        %146 = OpLoad %int %GLF_live4index
+        %267 = OpSelect %int %266 %146 %int_0
+        %268 = OpAccessChain %_ptr_Function_float %GLF_live4obj %int_1 %int_1
+        %269 = OpLoad %float %268
+        %270 = OpAccessChain %_ptr_Function_float %GLF_live4obj %int_1 %267
+               OpStore %270 %269
+        %147 = OpLoad %int %GLF_live4i
+        %271 = OpSGreaterThanEqual %bool %147 %int_0
+        %148 = OpLoad %int %GLF_live4i
+        %272 = OpSLessThan %bool %148 %int_10
+        %273 = OpLogicalAnd %bool %271 %272
+        %149 = OpLoad %int %GLF_live4i
+        %274 = OpSelect %int %273 %149 %int_0
+        %275 = OpAccessChain %_ptr_Function_float %GLF_live4obj %int_1 %274
+               OpStore %275 %float_1
+               OpBranch %258
+        %258 = OpLabel
+        %150 = OpLoad %int %GLF_live4i
+        %151 = OpIAdd %int %150 %int_1
+               OpStore %GLF_live4i %151
+               OpBranch %256
+        %257 = OpLabel
+        %152 = OpLoad %int %treeIndex_0
+               OpStore %param_23 %152
+               OpStore %param_24 %int_17
+        %276 = OpFunctionCall %void %insert_i1_i1_ %param_23 %param_24
+        %277 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+        %278 = OpLoad %float %277
+        %279 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+        %280 = OpLoad %float %279
+        %281 = OpFOrdGreaterThan %bool %278 %280
+               OpSelectionMerge %282 None
+               OpBranchConditional %281 %283 %282
+        %283 = OpLabel
+               OpReturn
+        %282 = OpLabel
+        %153 = OpLoad %int %treeIndex_0
+        %154 = OpIAdd %int %153 %int_1
+               OpStore %treeIndex_0 %154
+        %155 = OpLoad %int %treeIndex_0
+               OpStore %param_25 %155
+               OpStore %param_26 %int_13
+        %284 = OpFunctionCall %void %insert_i1_i1_ %param_25 %param_26
+        %285 = OpLoad %v4float %gl_FragCoord
+        %286 = OpVectorShuffle %v2float %285 %285 1 0
+        %287 = OpFDiv %v2float %286 %228
+               OpStore %z %287
+        %288 = OpAccessChain %_ptr_Function_float %z %uint_0
+        %289 = OpLoad %float %288
+               OpStore %param_27 %289
+        %290 = OpFunctionCall %float %makeFrame_f1_ %param_27
+               OpStore %x %290
+        %291 = OpAccessChain %_ptr_Function_float %z %uint_1
+        %292 = OpLoad %float %291
+               OpStore %param_28 %292
+        %293 = OpFunctionCall %float %makeFrame_f1_ %param_28
+               OpStore %y %293
+               OpStore %sum %int_n100
+               OpStore %target_0 %int_0
+               OpBranch %294
+        %294 = OpLabel
+               OpLoopMerge %295 %296 None
+               OpBranch %297
+        %297 = OpLabel
+        %156 = OpLoad %int %target_0
+        %298 = OpSLessThan %bool %156 %int_20
+               OpBranchConditional %298 %299 %295
+        %299 = OpLabel
+        %157 = OpLoad %int %target_0
+               OpStore %param_29 %157
+        %158 = OpFunctionCall %int %search_i1_ %param_29
+               OpStore %result %158
+        %159 = OpLoad %int %result
+        %300 = OpSGreaterThan %bool %159 %int_0
+               OpSelectionMerge %301 None
+               OpBranchConditional %300 %302 %303
+        %302 = OpLabel
+               OpBranch %301
+        %303 = OpLabel
+        %160 = OpLoad %int %result
+               OpSelectionMerge %304 None
+               OpSwitch %160 %304 -1 %305 0 %306
+        %305 = OpLabel
+        %161 = OpLoad %int %sum
+        %162 = OpIAdd %int %161 %int_1
+               OpStore %sum %162
+               OpBranch %304
+        %306 = OpLabel
+               OpReturn
+        %304 = OpLabel
+               OpBranch %301
+        %301 = OpLabel
+               OpBranch %296
+        %296 = OpLabel
+        %163 = OpLoad %int %target_0
+        %164 = OpIAdd %int %163 %int_1
+               OpStore %target_0 %164
+               OpBranch %294
+        %295 = OpLabel
+        %307 = OpLoad %float %x
+        %308 = OpLoad %float %y
+        %165 = OpLoad %int %sum
+        %309 = OpConvertSToF %float %165
+        %310 = OpFMul %float %308 %309
+        %311 = OpFAdd %float %307 %310
+               OpStore %a %311
+        %312 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+        %313 = OpLoad %float %312
+        %314 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+        %315 = OpLoad %float %314
+        %316 = OpFOrdLessThan %bool %313 %315
+               OpSelectionMerge %317 None
+               OpBranchConditional %316 %318 %319
+        %318 = OpLabel
+               OpStore %235 %233
+               OpBranch %317
+        %319 = OpLabel
+        %320 = OpLoad %float %a
+               OpStore %param_30 %320
+        %321 = OpFunctionCall %v3float %hueColor_f1_ %param_30
+               OpStore %235 %321
+               OpBranch %317
+        %317 = OpLabel
+        %322 = OpLoad %v3float %235
+        %323 = OpCompositeExtract %float %322 0
+        %324 = OpCompositeExtract %float %322 1
+        %325 = OpCompositeExtract %float %322 2
+        %326 = OpCompositeConstruct %v4float %323 %324 %325 %float_1
+               OpStore %_GLF_color %326
+               OpReturn
+               OpFunctionEnd
+%makeTreeNode_struct_BST_i1_i1_i11_i1_ = OpFunction %void None %171
+       %tree = OpFunctionParameter %_ptr_Function_BST
+       %data = OpFunctionParameter %_ptr_Function_int
+        %327 = OpLabel
+         %74 = OpLoad %int %data
+        %328 = OpAccessChain %_ptr_Function_int %tree %int_0
+               OpStore %328 %74
+        %329 = OpAccessChain %_ptr_Function_int %tree %int_1
+               OpStore %329 %int_n1
+        %330 = OpAccessChain %_ptr_Function_int %tree %int_2
+               OpStore %330 %int_n1
+               OpReturn
+               OpFunctionEnd
+%insert_i1_i1_ = OpFunction %void None %172
+  %treeIndex = OpFunctionParameter %_ptr_Function_int
+     %data_0 = OpFunctionParameter %_ptr_Function_int
+        %331 = OpLabel
+  %baseIndex = OpVariable %_ptr_Function_int Function
+      %param = OpVariable %_ptr_Function_BST Function
+    %param_0 = OpVariable %_ptr_Function_int Function
+    %param_1 = OpVariable %_ptr_Function_BST Function
+    %param_2 = OpVariable %_ptr_Function_int Function
+ %GLF_live8i = OpVariable %_ptr_Function_int Function
+ %GLF_live8A = OpVariable %_ptr_Function__arr_float_uint_50 Function
+               OpStore %baseIndex %int_0
+               OpBranch %332
+        %332 = OpLabel
+               OpLoopMerge %333 %334 None
+               OpBranch %335
+        %335 = OpLabel
+         %75 = OpLoad %int %baseIndex
+         %76 = OpLoad %int %treeIndex
+        %336 = OpSLessThanEqual %bool %75 %76
+               OpBranchConditional %336 %337 %333
+        %337 = OpLabel
+         %77 = OpLoad %int %data_0
+         %78 = OpLoad %int %baseIndex
+        %338 = OpAccessChain %_ptr_Private_int %tree_0 %78 %int_0
+         %79 = OpLoad %int %338
+        %339 = OpSLessThanEqual %bool %77 %79
+               OpSelectionMerge %340 None
+               OpBranchConditional %339 %341 %342
+        %341 = OpLabel
+         %80 = OpLoad %int %baseIndex
+        %343 = OpAccessChain %_ptr_Private_int %tree_0 %80 %int_1
+         %81 = OpLoad %int %343
+        %344 = OpIEqual %bool %81 %int_n1
+               OpSelectionMerge %345 None
+               OpBranchConditional %344 %346 %347
+        %346 = OpLabel
+         %82 = OpLoad %int %baseIndex
+         %83 = OpLoad %int %treeIndex
+        %348 = OpAccessChain %_ptr_Private_int %tree_0 %82 %int_1
+               OpStore %348 %83
+         %84 = OpLoad %int %treeIndex
+        %349 = OpAccessChain %_ptr_Private_BST %tree_0 %84
+        %350 = OpLoad %BST %349
+               OpStore %param %350
+         %85 = OpLoad %int %data_0
+               OpStore %param_0 %85
+        %351 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param %param_0
+        %352 = OpLoad %BST %param
+        %353 = OpAccessChain %_ptr_Private_BST %tree_0 %84
+               OpStore %353 %352
+               OpReturn
+        %347 = OpLabel
+         %86 = OpLoad %int %baseIndex
+        %354 = OpAccessChain %_ptr_Private_int %tree_0 %86 %int_1
+         %87 = OpLoad %int %354
+               OpStore %baseIndex %87
+               OpBranch %334
+        %345 = OpLabel
+               OpBranch %340
+        %342 = OpLabel
+         %88 = OpLoad %int %baseIndex
+        %355 = OpAccessChain %_ptr_Private_int %tree_0 %88 %int_2
+         %89 = OpLoad %int %355
+        %356 = OpIEqual %bool %89 %int_n1
+               OpSelectionMerge %357 None
+               OpBranchConditional %356 %358 %359
+        %358 = OpLabel
+         %90 = OpLoad %int %baseIndex
+         %91 = OpLoad %int %treeIndex
+        %360 = OpAccessChain %_ptr_Private_int %tree_0 %90 %int_2
+               OpStore %360 %91
+         %92 = OpLoad %int %treeIndex
+        %361 = OpAccessChain %_ptr_Private_BST %tree_0 %92
+        %362 = OpLoad %BST %361
+               OpStore %param_1 %362
+         %93 = OpLoad %int %data_0
+               OpStore %param_2 %93
+        %363 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param_1 %param_2
+        %364 = OpLoad %BST %param_1
+        %365 = OpAccessChain %_ptr_Private_BST %tree_0 %92
+               OpStore %365 %364
+               OpReturn
+        %359 = OpLabel
+               OpStore %GLF_live8i %int_1
+         %94 = OpLoad %int %GLF_live8i
+        %366 = OpSGreaterThanEqual %bool %94 %int_0
+         %95 = OpLoad %int %GLF_live8i
+        %367 = OpSLessThan %bool %95 %int_50
+        %368 = OpLogicalAnd %bool %366 %367
+         %96 = OpLoad %int %GLF_live8i
+        %369 = OpSelect %int %368 %96 %int_0
+        %370 = OpAccessChain %_ptr_Function_float %GLF_live8A %int_0
+        %371 = OpLoad %float %370
+        %372 = OpAccessChain %_ptr_Function_float %GLF_live8A %369
+        %373 = OpLoad %float %372
+        %374 = OpFAdd %float %373 %371
+        %375 = OpAccessChain %_ptr_Function_float %GLF_live8A %369
+               OpStore %375 %374
+               OpBranch %376
+        %376 = OpLabel
+               OpLoopMerge %377 %378 None
+               OpBranch %379
+        %379 = OpLabel
+         %97 = OpLoad %int %baseIndex
+        %380 = OpAccessChain %_ptr_Private_int %tree_0 %97 %int_2
+         %98 = OpLoad %int %380
+               OpStore %baseIndex %98
+               OpBranch %378
+        %378 = OpLabel
+        %381 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
+        %382 = OpLoad %float %381
+        %383 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+        %384 = OpLoad %float %383
+        %385 = OpFOrdGreaterThan %bool %382 %384
+               OpBranchConditional %385 %376 %377
+        %377 = OpLabel
+               OpBranch %334
+        %357 = OpLabel
+               OpBranch %340
+        %340 = OpLabel
+               OpBranch %334
+        %334 = OpLabel
+               OpBranch %332
+        %333 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %search_i1_ = OpFunction %int None %173
+     %target = OpFunctionParameter %_ptr_Function_int
+        %386 = OpLabel
+      %index = OpVariable %_ptr_Function_int Function
+%currentNode = OpVariable %_ptr_Function_BST Function
+        %387 = OpVariable %_ptr_Function_int Function
+               OpStore %index %int_0
+               OpBranch %388
+        %388 = OpLabel
+               OpLoopMerge %389 %390 None
+               OpBranch %391
+        %391 = OpLabel
+         %99 = OpLoad %int %index
+        %392 = OpINotEqual %bool %99 %int_n1
+               OpBranchConditional %392 %393 %389
+        %393 = OpLabel
+        %100 = OpLoad %int %index
+        %394 = OpAccessChain %_ptr_Private_BST %tree_0 %100
+        %395 = OpLoad %BST %394
+               OpStore %currentNode %395
+        %396 = OpAccessChain %_ptr_Function_int %currentNode %int_0
+        %101 = OpLoad %int %396
+        %102 = OpLoad %int %target
+        %397 = OpIEqual %bool %101 %102
+               OpSelectionMerge %398 None
+               OpBranchConditional %397 %399 %398
+        %399 = OpLabel
+        %103 = OpLoad %int %target
+               OpReturnValue %103
+        %398 = OpLabel
+        %104 = OpLoad %int %target
+        %400 = OpAccessChain %_ptr_Function_int %currentNode %int_0
+        %105 = OpLoad %int %400
+        %401 = OpSGreaterThan %bool %104 %105
+               OpSelectionMerge %402 None
+               OpBranchConditional %401 %403 %404
+        %403 = OpLabel
+        %405 = OpAccessChain %_ptr_Function_int %currentNode %int_2
+        %106 = OpLoad %int %405
+               OpStore %387 %106
+               OpBranch %402
+        %404 = OpLabel
+        %406 = OpAccessChain %_ptr_Function_int %currentNode %int_1
+        %107 = OpLoad %int %406
+               OpStore %387 %107
+               OpBranch %402
+        %402 = OpLabel
+        %108 = OpLoad %int %387
+               OpStore %index %108
+               OpBranch %390
+        %390 = OpLabel
+               OpBranch %388
+        %389 = OpLabel
+               OpReturnValue %int_n1
+               OpFunctionEnd
+%hueColor_f1_ = OpFunction %v3float None %177
+      %angle = OpFunctionParameter %_ptr_Function_float
+        %407 = OpLabel
+   %nodeData = OpVariable %_ptr_Function_float Function
+    %param_3 = OpVariable %_ptr_Function_int Function
+               OpStore %param_3 %int_15
+        %109 = OpFunctionCall %int %search_i1_ %param_3
+        %408 = OpConvertSToF %float %109
+               OpStore %nodeData %408
+        %409 = OpLoad %float %angle
+        %410 = OpLoad %float %nodeData
+        %411 = OpCompositeConstruct %v3float %float_1 %float_5 %410
+        %412 = OpVectorTimesScalar %v3float %411 %409
+        %413 = OpCompositeConstruct %v3float %float_30 %float_30 %float_30
+        %414 = OpFAdd %v3float %413 %412
+        %415 = OpCompositeConstruct %v3float %float_50 %float_50 %float_50
+        %416 = OpFDiv %v3float %414 %415
+               OpReturnValue %416
+               OpFunctionEnd
+%makeFrame_f1_ = OpFunction %float None %178
+          %v = OpFunctionParameter %_ptr_Function_float
+        %417 = OpLabel
+    %param_4 = OpVariable %_ptr_Function_int Function
+    %param_5 = OpVariable %_ptr_Function_int Function
+    %param_6 = OpVariable %_ptr_Function_int Function
+        %418 = OpLoad %float %v
+        %419 = OpFMul %float %418 %float_6_5
+               OpStore %v %419
+        %420 = OpLoad %float %v
+        %421 = OpFOrdLessThan %bool %420 %float_1_5
+               OpSelectionMerge %422 None
+               OpBranchConditional %421 %423 %422
+        %423 = OpLabel
+               OpStore %param_4 %int_100
+        %110 = OpFunctionCall %int %search_i1_ %param_4
+        %424 = OpConvertSToF %float %110
+               OpReturnValue %424
+        %422 = OpLabel
+        %425 = OpLoad %float %v
+        %426 = OpFOrdLessThan %bool %425 %float_4
+               OpSelectionMerge %427 None
+               OpBranchConditional %426 %428 %427
+        %428 = OpLabel
+               OpReturnValue %float_0
+        %427 = OpLabel
+        %429 = OpLoad %float %v
+               OpStore %param_5 %int_6
+        %111 = OpFunctionCall %int %search_i1_ %param_5
+        %430 = OpConvertSToF %float %111
+        %431 = OpFOrdLessThan %bool %429 %430
+               OpSelectionMerge %432 None
+               OpBranchConditional %431 %433 %432
+        %433 = OpLabel
+               OpReturnValue %float_1
+        %432 = OpLabel
+               OpStore %param_6 %int_30
+        %112 = OpFunctionCall %int %search_i1_ %param_6
+        %434 = OpConvertSToF %float %112
+        %435 = OpFAdd %float %float_10 %434
+               OpReturnValue %435
+               OpFunctionEnd
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
new file mode 100644
index 0000000..4e1c940
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,364 @@
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+struct Obj {
+  float odd_numbers[10];
+  float even_numbers[10];
+};
+
+static BST tree_1[10] = (BST[10])0;
+cbuffer cbuffer_x_27 : register(b0, space0) {
+  uint4 x_27[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void makeTreeNode_struct_BST_i1_i1_i11_i1_(inout BST tree, inout int data) {
+  const int x_74 = data;
+  tree.data = x_74;
+  tree.leftIndex = -1;
+  tree.rightIndex = -1;
+  return;
+}
+
+void insert_i1_i1_(inout int treeIndex, inout int data_1) {
+  int baseIndex = 0;
+  BST param = (BST)0;
+  int param_1 = 0;
+  BST param_2 = (BST)0;
+  int param_3 = 0;
+  int GLF_live8i = 0;
+  float GLF_live8A[50] = (float[50])0;
+  baseIndex = 0;
+  while (true) {
+    const int x_75 = baseIndex;
+    const int x_76 = treeIndex;
+    if ((x_75 <= x_76)) {
+    } else {
+      break;
+    }
+    const int x_77 = data_1;
+    const int x_79 = tree_1[baseIndex].data;
+    if ((x_77 <= x_79)) {
+      const int x_81 = tree_1[baseIndex].leftIndex;
+      if ((x_81 == -1)) {
+        const int x_82 = baseIndex;
+        const int x_83 = treeIndex;
+        tree_1[x_82].leftIndex = x_83;
+        const int x_84 = treeIndex;
+        const BST x_350 = tree_1[x_84];
+        param = x_350;
+        const int x_85 = data_1;
+        param_1 = x_85;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(param, param_1);
+        tree_1[x_84] = param;
+        return;
+      } else {
+        const int x_87 = tree_1[baseIndex].leftIndex;
+        baseIndex = x_87;
+        continue;
+      }
+    } else {
+      const int x_89 = tree_1[baseIndex].rightIndex;
+      if ((x_89 == -1)) {
+        const int x_90 = baseIndex;
+        const int x_91 = treeIndex;
+        tree_1[x_90].rightIndex = x_91;
+        const int x_92 = treeIndex;
+        const BST x_362 = tree_1[x_92];
+        param_2 = x_362;
+        const int x_93 = data_1;
+        param_3 = x_93;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(param_2, param_3);
+        tree_1[x_92] = param_2;
+        return;
+      } else {
+        GLF_live8i = 1;
+        bool tint_tmp = (GLF_live8i >= 0);
+        if (tint_tmp) {
+          tint_tmp = (GLF_live8i < 50);
+        }
+        const int x_369 = ((tint_tmp) ? GLF_live8i : 0);
+        const float x_371 = GLF_live8A[0];
+        const float x_373 = GLF_live8A[x_369];
+        GLF_live8A[x_369] = (x_373 + x_371);
+        while (true) {
+          const int x_98 = tree_1[baseIndex].rightIndex;
+          baseIndex = x_98;
+          {
+            const float x_382 = asfloat(x_27[0].x);
+            const float x_384 = asfloat(x_27[0].y);
+            if ((x_382 > x_384)) {
+            } else {
+              break;
+            }
+          }
+        }
+        continue;
+      }
+    }
+  }
+  return;
+}
+
+int search_i1_(inout int target) {
+  int index = 0;
+  BST currentNode = (BST)0;
+  int x_387 = 0;
+  index = 0;
+  while (true) {
+    if ((index != -1)) {
+    } else {
+      break;
+    }
+    const BST x_395 = tree_1[index];
+    currentNode = x_395;
+    const int x_101 = currentNode.data;
+    const int x_102 = target;
+    if ((x_101 == x_102)) {
+      const int x_103 = target;
+      return x_103;
+    }
+    const int x_104 = target;
+    const int x_105 = currentNode.data;
+    if ((x_104 > x_105)) {
+      const int x_106 = currentNode.rightIndex;
+      x_387 = x_106;
+    } else {
+      const int x_107 = currentNode.leftIndex;
+      x_387 = x_107;
+    }
+    index = x_387;
+  }
+  return -1;
+}
+
+float makeFrame_f1_(inout float v) {
+  int param_5 = 0;
+  int param_6 = 0;
+  int param_7 = 0;
+  const float x_418 = v;
+  v = (x_418 * 6.5f);
+  const float x_420 = v;
+  if ((x_420 < 1.5f)) {
+    param_5 = 100;
+    const int x_110 = search_i1_(param_5);
+    return float(x_110);
+  }
+  const float x_425 = v;
+  if ((x_425 < 4.0f)) {
+    return 0.0f;
+  }
+  const float x_429 = v;
+  param_6 = 6;
+  const int x_111 = search_i1_(param_6);
+  if ((x_429 < float(x_111))) {
+    return 1.0f;
+  }
+  param_7 = 30;
+  const int x_112 = search_i1_(param_7);
+  return (10.0f + float(x_112));
+}
+
+float3 hueColor_f1_(inout float angle) {
+  float nodeData = 0.0f;
+  int param_4 = 0;
+  param_4 = 15;
+  const int x_109 = search_i1_(param_4);
+  nodeData = float(x_109);
+  const float x_409 = angle;
+  return ((float3(30.0f, 30.0f, 30.0f) + (float3(1.0f, 5.0f, nodeData) * x_409)) / float3(50.0f, 50.0f, 50.0f));
+}
+
+void main_1() {
+  int treeIndex_1 = 0;
+  BST param_8 = (BST)0;
+  int param_9 = 0;
+  int param_10 = 0;
+  int param_11 = 0;
+  int GLF_live1_looplimiter2 = 0;
+  int GLF_live1i = 0;
+  int param_12 = 0;
+  int param_13 = 0;
+  int param_14 = 0;
+  int param_15 = 0;
+  int param_16 = 0;
+  int param_17 = 0;
+  int param_18 = 0;
+  int param_19 = 0;
+  int param_20 = 0;
+  int param_21 = 0;
+  int param_22 = 0;
+  int param_23 = 0;
+  int GLF_live4_looplimiter3 = 0;
+  int GLF_live4i = 0;
+  int GLF_live4index = 0;
+  Obj GLF_live4obj = (Obj)0;
+  int param_24 = 0;
+  int param_25 = 0;
+  int param_26 = 0;
+  int param_27 = 0;
+  float2 z = float2(0.0f, 0.0f);
+  float x_1 = 0.0f;
+  float param_28 = 0.0f;
+  float y_1 = 0.0f;
+  float param_29 = 0.0f;
+  int sum = 0;
+  int target_1 = 0;
+  int result = 0;
+  int param_30 = 0;
+  float a = 0.0f;
+  float3 x_235 = float3(0.0f, 0.0f, 0.0f);
+  float param_31 = 0.0f;
+  treeIndex_1 = 0;
+  const BST x_237 = tree_1[0];
+  param_8 = x_237;
+  param_9 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(param_8, param_9);
+  tree_1[0] = param_8;
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_10 = treeIndex_1;
+  param_11 = 5;
+  insert_i1_i1_(param_10, param_11);
+  treeIndex_1 = (treeIndex_1 + 1);
+  GLF_live1_looplimiter2 = 0;
+  GLF_live1i = 0;
+  {
+    for(; true; GLF_live1i = (GLF_live1i + 1)) {
+      if ((GLF_live1_looplimiter2 >= 7)) {
+        break;
+      }
+      GLF_live1_looplimiter2 = (GLF_live1_looplimiter2 + 1);
+    }
+  }
+  param_12 = treeIndex_1;
+  param_13 = 12;
+  insert_i1_i1_(param_12, param_13);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_14 = treeIndex_1;
+  param_15 = 15;
+  insert_i1_i1_(param_14, param_15);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_16 = treeIndex_1;
+  param_17 = 7;
+  insert_i1_i1_(param_16, param_17);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_18 = treeIndex_1;
+  param_19 = 8;
+  insert_i1_i1_(param_18, param_19);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_20 = treeIndex_1;
+  param_21 = 2;
+  insert_i1_i1_(param_20, param_21);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_22 = treeIndex_1;
+  param_23 = 6;
+  insert_i1_i1_(param_22, param_23);
+  treeIndex_1 = (treeIndex_1 + 1);
+  GLF_live4_looplimiter3 = 0;
+  GLF_live4i = 0;
+  {
+    for(; true; GLF_live4i = (GLF_live4i + 1)) {
+      if ((GLF_live4_looplimiter3 >= 3)) {
+        break;
+      }
+      GLF_live4_looplimiter3 = (GLF_live4_looplimiter3 + 1);
+      GLF_live4index = 1;
+      const int x_144 = GLF_live4index;
+      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);
+      }
+      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);
+      }
+      GLF_live4obj.even_numbers[((tint_tmp_2) ? GLF_live4i : 0)] = 1.0f;
+    }
+  }
+  param_24 = treeIndex_1;
+  param_25 = 17;
+  insert_i1_i1_(param_24, param_25);
+  const float x_278 = asfloat(x_27[0].x);
+  const float x_280 = asfloat(x_27[0].y);
+  if ((x_278 > x_280)) {
+    return;
+  }
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_26 = treeIndex_1;
+  param_27 = 13;
+  insert_i1_i1_(param_26, param_27);
+  const float4 x_285 = gl_FragCoord;
+  z = (float2(x_285.y, x_285.x) / float2(256.0f, 256.0f));
+  const float x_289 = z.x;
+  param_28 = x_289;
+  const float x_290 = makeFrame_f1_(param_28);
+  x_1 = x_290;
+  const float x_292 = z.y;
+  param_29 = x_292;
+  const float x_293 = makeFrame_f1_(param_29);
+  y_1 = x_293;
+  sum = -100;
+  target_1 = 0;
+  {
+    for(; (target_1 < 20); target_1 = (target_1 + 1)) {
+      param_30 = target_1;
+      const int x_158 = search_i1_(param_30);
+      result = x_158;
+      if ((result > 0)) {
+      } else {
+        switch(result) {
+          case 0: {
+            return;
+            break;
+          }
+          case -1: {
+            sum = (sum + 1);
+            break;
+          }
+          default: {
+            break;
+          }
+        }
+      }
+    }
+  }
+  a = (x_1 + (y_1 * float(sum)));
+  const float x_313 = asfloat(x_27[0].x);
+  const float x_315 = asfloat(x_27[0].y);
+  if ((x_313 < x_315)) {
+    x_235 = float3(1.0f, 0.0f, 0.0f);
+  } else {
+    param_31 = a;
+    const float3 x_321 = hueColor_f1_(param_31);
+    x_235 = x_321;
+  }
+  const float3 x_322 = x_235;
+  x_GLF_color = float4(x_322.x, x_322.y, x_322.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..10ddae2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.spvasm.expected.msl
@@ -0,0 +1,426 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  float arr[10];
+};
+struct Obj {
+  tint_array_wrapper odd_numbers;
+  tint_array_wrapper even_numbers;
+};
+struct tint_array_wrapper_1 {
+  BST arr[10];
+};
+struct tint_array_wrapper_2 {
+  float arr[50];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void makeTreeNode_struct_BST_i1_i1_i11_i1_(thread BST* const tree, thread int* const data) {
+  int const x_74 = *(data);
+  (*(tree)).data = x_74;
+  (*(tree)).leftIndex = -1;
+  (*(tree)).rightIndex = -1;
+  return;
+}
+
+void insert_i1_i1_(constant buf0& x_27, thread int* const treeIndex, thread int* const data_1, thread tint_array_wrapper_1* const tint_symbol_5) {
+  int baseIndex = 0;
+  BST param = {};
+  int param_1 = 0;
+  BST param_2 = {};
+  int param_3 = 0;
+  int GLF_live8i = 0;
+  tint_array_wrapper_2 GLF_live8A = {};
+  baseIndex = 0;
+  while (true) {
+    int const x_75 = baseIndex;
+    int const x_76 = *(treeIndex);
+    if ((x_75 <= x_76)) {
+    } else {
+      break;
+    }
+    int const x_77 = *(data_1);
+    int const x_78 = baseIndex;
+    int const x_79 = (*(tint_symbol_5)).arr[x_78].data;
+    if ((x_77 <= x_79)) {
+      int const x_80 = baseIndex;
+      int const x_81 = (*(tint_symbol_5)).arr[x_80].leftIndex;
+      if ((x_81 == -1)) {
+        int const x_82 = baseIndex;
+        int const x_83 = *(treeIndex);
+        (*(tint_symbol_5)).arr[x_82].leftIndex = x_83;
+        int const x_84 = *(treeIndex);
+        BST const x_350 = (*(tint_symbol_5)).arr[x_84];
+        param = x_350;
+        int const x_85 = *(data_1);
+        param_1 = x_85;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param), &(param_1));
+        BST const x_352 = param;
+        (*(tint_symbol_5)).arr[x_84] = x_352;
+        return;
+      } else {
+        int const x_86 = baseIndex;
+        int const x_87 = (*(tint_symbol_5)).arr[x_86].leftIndex;
+        baseIndex = x_87;
+        continue;
+      }
+    } else {
+      int const x_88 = baseIndex;
+      int const x_89 = (*(tint_symbol_5)).arr[x_88].rightIndex;
+      if ((x_89 == -1)) {
+        int const x_90 = baseIndex;
+        int const x_91 = *(treeIndex);
+        (*(tint_symbol_5)).arr[x_90].rightIndex = x_91;
+        int const x_92 = *(treeIndex);
+        BST const x_362 = (*(tint_symbol_5)).arr[x_92];
+        param_2 = x_362;
+        int const x_93 = *(data_1);
+        param_3 = x_93;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_2), &(param_3));
+        BST const x_364 = param_2;
+        (*(tint_symbol_5)).arr[x_92] = x_364;
+        return;
+      } else {
+        GLF_live8i = 1;
+        int const x_94 = GLF_live8i;
+        int const x_95 = GLF_live8i;
+        int const x_96 = GLF_live8i;
+        int const x_369 = select(0, x_96, ((x_94 >= 0) && (x_95 < 50)));
+        float const x_371 = GLF_live8A.arr[0];
+        float const x_373 = GLF_live8A.arr[x_369];
+        GLF_live8A.arr[x_369] = (x_373 + x_371);
+        while (true) {
+          int const x_97 = baseIndex;
+          int const x_98 = (*(tint_symbol_5)).arr[x_97].rightIndex;
+          baseIndex = x_98;
+          {
+            float const x_382 = x_27.injectionSwitch.x;
+            float const x_384 = x_27.injectionSwitch.y;
+            if ((x_382 > x_384)) {
+            } else {
+              break;
+            }
+          }
+        }
+        continue;
+      }
+    }
+  }
+  return;
+}
+
+int search_i1_(thread int* const target, thread tint_array_wrapper_1* const tint_symbol_6) {
+  int index = 0;
+  BST currentNode = {};
+  int x_387 = 0;
+  index = 0;
+  while (true) {
+    int const x_99 = index;
+    if ((x_99 != -1)) {
+    } else {
+      break;
+    }
+    int const x_100 = index;
+    BST const x_395 = (*(tint_symbol_6)).arr[x_100];
+    currentNode = x_395;
+    int const x_101 = currentNode.data;
+    int const x_102 = *(target);
+    if ((x_101 == x_102)) {
+      int const x_103 = *(target);
+      return x_103;
+    }
+    int const x_104 = *(target);
+    int const x_105 = currentNode.data;
+    if ((x_104 > x_105)) {
+      int const x_106 = currentNode.rightIndex;
+      x_387 = x_106;
+    } else {
+      int const x_107 = currentNode.leftIndex;
+      x_387 = x_107;
+    }
+    int const x_108 = x_387;
+    index = x_108;
+  }
+  return -1;
+}
+
+float makeFrame_f1_(thread float* const v, thread tint_array_wrapper_1* const tint_symbol_7) {
+  int param_5 = 0;
+  int param_6 = 0;
+  int param_7 = 0;
+  float const x_418 = *(v);
+  *(v) = (x_418 * 6.5f);
+  float const x_420 = *(v);
+  if ((x_420 < 1.5f)) {
+    param_5 = 100;
+    int const x_110 = search_i1_(&(param_5), tint_symbol_7);
+    return float(x_110);
+  }
+  float const x_425 = *(v);
+  if ((x_425 < 4.0f)) {
+    return 0.0f;
+  }
+  float const x_429 = *(v);
+  param_6 = 6;
+  int const x_111 = search_i1_(&(param_6), tint_symbol_7);
+  if ((x_429 < float(x_111))) {
+    return 1.0f;
+  }
+  param_7 = 30;
+  int const x_112 = search_i1_(&(param_7), tint_symbol_7);
+  return (10.0f + float(x_112));
+}
+
+float3 hueColor_f1_(thread float* const angle, thread tint_array_wrapper_1* const tint_symbol_8) {
+  float nodeData = 0.0f;
+  int param_4 = 0;
+  param_4 = 15;
+  int const x_109 = search_i1_(&(param_4), tint_symbol_8);
+  nodeData = float(x_109);
+  float const x_409 = *(angle);
+  float const x_410 = nodeData;
+  return ((float3(30.0f, 30.0f, 30.0f) + (float3(1.0f, 5.0f, x_410) * x_409)) / float3(50.0f, 50.0f, 50.0f));
+}
+
+void main_1(constant buf0& x_27, thread tint_array_wrapper_1* const tint_symbol_9, thread float4* const tint_symbol_10, thread float4* const tint_symbol_11) {
+  int treeIndex_1 = 0;
+  BST param_8 = {};
+  int param_9 = 0;
+  int param_10 = 0;
+  int param_11 = 0;
+  int GLF_live1_looplimiter2 = 0;
+  int GLF_live1i = 0;
+  int param_12 = 0;
+  int param_13 = 0;
+  int param_14 = 0;
+  int param_15 = 0;
+  int param_16 = 0;
+  int param_17 = 0;
+  int param_18 = 0;
+  int param_19 = 0;
+  int param_20 = 0;
+  int param_21 = 0;
+  int param_22 = 0;
+  int param_23 = 0;
+  int GLF_live4_looplimiter3 = 0;
+  int GLF_live4i = 0;
+  int GLF_live4index = 0;
+  Obj GLF_live4obj = {};
+  int param_24 = 0;
+  int param_25 = 0;
+  int param_26 = 0;
+  int param_27 = 0;
+  float2 z = 0.0f;
+  float x_1 = 0.0f;
+  float param_28 = 0.0f;
+  float y_1 = 0.0f;
+  float param_29 = 0.0f;
+  int sum = 0;
+  int target_1 = 0;
+  int result = 0;
+  int param_30 = 0;
+  float a = 0.0f;
+  float3 x_235 = 0.0f;
+  float param_31 = 0.0f;
+  treeIndex_1 = 0;
+  BST const x_237 = (*(tint_symbol_9)).arr[0];
+  param_8 = x_237;
+  param_9 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_8), &(param_9));
+  BST const x_239 = param_8;
+  (*(tint_symbol_9)).arr[0] = x_239;
+  int const x_113 = treeIndex_1;
+  treeIndex_1 = (x_113 + 1);
+  int const x_115 = treeIndex_1;
+  param_10 = x_115;
+  param_11 = 5;
+  insert_i1_i1_(x_27, &(param_10), &(param_11), tint_symbol_9);
+  int const x_116 = treeIndex_1;
+  treeIndex_1 = (x_116 + 1);
+  GLF_live1_looplimiter2 = 0;
+  GLF_live1i = 0;
+  while (true) {
+    if (true) {
+    } else {
+      break;
+    }
+    int const x_118 = GLF_live1_looplimiter2;
+    if ((x_118 >= 7)) {
+      break;
+    }
+    int const x_119 = GLF_live1_looplimiter2;
+    GLF_live1_looplimiter2 = (x_119 + 1);
+    {
+      int const x_121 = GLF_live1i;
+      GLF_live1i = (x_121 + 1);
+    }
+  }
+  int const x_123 = treeIndex_1;
+  param_12 = x_123;
+  param_13 = 12;
+  insert_i1_i1_(x_27, &(param_12), &(param_13), tint_symbol_9);
+  int const x_124 = treeIndex_1;
+  treeIndex_1 = (x_124 + 1);
+  int const x_126 = treeIndex_1;
+  param_14 = x_126;
+  param_15 = 15;
+  insert_i1_i1_(x_27, &(param_14), &(param_15), tint_symbol_9);
+  int const x_127 = treeIndex_1;
+  treeIndex_1 = (x_127 + 1);
+  int const x_129 = treeIndex_1;
+  param_16 = x_129;
+  param_17 = 7;
+  insert_i1_i1_(x_27, &(param_16), &(param_17), tint_symbol_9);
+  int const x_130 = treeIndex_1;
+  treeIndex_1 = (x_130 + 1);
+  int const x_132 = treeIndex_1;
+  param_18 = x_132;
+  param_19 = 8;
+  insert_i1_i1_(x_27, &(param_18), &(param_19), tint_symbol_9);
+  int const x_133 = treeIndex_1;
+  treeIndex_1 = (x_133 + 1);
+  int const x_135 = treeIndex_1;
+  param_20 = x_135;
+  param_21 = 2;
+  insert_i1_i1_(x_27, &(param_20), &(param_21), tint_symbol_9);
+  int const x_136 = treeIndex_1;
+  treeIndex_1 = (x_136 + 1);
+  int const x_138 = treeIndex_1;
+  param_22 = x_138;
+  param_23 = 6;
+  insert_i1_i1_(x_27, &(param_22), &(param_23), tint_symbol_9);
+  int const x_139 = treeIndex_1;
+  treeIndex_1 = (x_139 + 1);
+  GLF_live4_looplimiter3 = 0;
+  GLF_live4i = 0;
+  while (true) {
+    if (true) {
+    } else {
+      break;
+    }
+    int const x_141 = GLF_live4_looplimiter3;
+    if ((x_141 >= 3)) {
+      break;
+    }
+    int const x_142 = GLF_live4_looplimiter3;
+    GLF_live4_looplimiter3 = (x_142 + 1);
+    GLF_live4index = 1;
+    int const x_144 = GLF_live4index;
+    int const x_145 = GLF_live4index;
+    int const x_146 = GLF_live4index;
+    float const x_269 = GLF_live4obj.even_numbers.arr[1];
+    GLF_live4obj.even_numbers.arr[select(0, x_146, ((x_144 >= 0) && (x_145 < 10)))] = x_269;
+    int const x_147 = GLF_live4i;
+    int const x_148 = GLF_live4i;
+    int const x_149 = GLF_live4i;
+    GLF_live4obj.even_numbers.arr[select(0, x_149, ((x_147 >= 0) && (x_148 < 10)))] = 1.0f;
+    {
+      int const x_150 = GLF_live4i;
+      GLF_live4i = (x_150 + 1);
+    }
+  }
+  int const x_152 = treeIndex_1;
+  param_24 = x_152;
+  param_25 = 17;
+  insert_i1_i1_(x_27, &(param_24), &(param_25), tint_symbol_9);
+  float const x_278 = x_27.injectionSwitch.x;
+  float const x_280 = x_27.injectionSwitch.y;
+  if ((x_278 > x_280)) {
+    return;
+  }
+  int const x_153 = treeIndex_1;
+  treeIndex_1 = (x_153 + 1);
+  int const x_155 = treeIndex_1;
+  param_26 = x_155;
+  param_27 = 13;
+  insert_i1_i1_(x_27, &(param_26), &(param_27), tint_symbol_9);
+  float4 const x_285 = *(tint_symbol_10);
+  z = (float2(x_285.y, x_285.x) / float2(256.0f, 256.0f));
+  float const x_289 = z.x;
+  param_28 = x_289;
+  float const x_290 = makeFrame_f1_(&(param_28), tint_symbol_9);
+  x_1 = x_290;
+  float const x_292 = z.y;
+  param_29 = x_292;
+  float const x_293 = makeFrame_f1_(&(param_29), tint_symbol_9);
+  y_1 = x_293;
+  sum = -100;
+  target_1 = 0;
+  while (true) {
+    int const x_156 = target_1;
+    if ((x_156 < 20)) {
+    } else {
+      break;
+    }
+    int const x_157 = target_1;
+    param_30 = x_157;
+    int const x_158 = search_i1_(&(param_30), tint_symbol_9);
+    result = x_158;
+    int const x_159 = result;
+    if ((x_159 > 0)) {
+    } else {
+      int const x_160 = result;
+      switch(x_160) {
+        case 0: {
+          return;
+          break;
+        }
+        case -1: {
+          int const x_161 = sum;
+          sum = (x_161 + 1);
+          break;
+        }
+        default: {
+          break;
+        }
+      }
+    }
+    {
+      int const x_163 = target_1;
+      target_1 = (x_163 + 1);
+    }
+  }
+  float const x_307 = x_1;
+  float const x_308 = y_1;
+  int const x_165 = sum;
+  a = (x_307 + (x_308 * float(x_165)));
+  float const x_313 = x_27.injectionSwitch.x;
+  float const x_315 = x_27.injectionSwitch.y;
+  if ((x_313 < x_315)) {
+    x_235 = float3(1.0f, 0.0f, 0.0f);
+  } else {
+    float const x_320 = a;
+    param_31 = x_320;
+    float3 const x_321 = hueColor_f1_(&(param_31), tint_symbol_9);
+    x_235 = x_321;
+  }
+  float3 const x_322 = x_235;
+  *(tint_symbol_11) = float4(x_322.x, x_322.y, x_322.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_27 [[buffer(0)]]) {
+  thread float4 tint_symbol_12 = 0.0f;
+  thread tint_array_wrapper_1 tint_symbol_13 = {};
+  thread float4 tint_symbol_14 = 0.0f;
+  tint_symbol_12 = gl_FragCoord_param;
+  main_1(x_27, &(tint_symbol_13), &(tint_symbol_12), &(tint_symbol_14));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_14};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..ff48698
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,815 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 536
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %BST "BST"
+               OpMemberName %BST 0 "data"
+               OpMemberName %BST 1 "leftIndex"
+               OpMemberName %BST 2 "rightIndex"
+               OpName %tree_1 "tree_1"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_27 "x_27"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %makeTreeNode_struct_BST_i1_i1_i11_i1_ "makeTreeNode_struct_BST_i1_i1_i11_i1_"
+               OpName %tree "tree"
+               OpName %data "data"
+               OpName %insert_i1_i1_ "insert_i1_i1_"
+               OpName %treeIndex "treeIndex"
+               OpName %data_1 "data_1"
+               OpName %baseIndex "baseIndex"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %GLF_live8i "GLF_live8i"
+               OpName %GLF_live8A "GLF_live8A"
+               OpName %search_i1_ "search_i1_"
+               OpName %target "target"
+               OpName %index "index"
+               OpName %currentNode "currentNode"
+               OpName %x_387 "x_387"
+               OpName %makeFrame_f1_ "makeFrame_f1_"
+               OpName %v "v"
+               OpName %param_5 "param_5"
+               OpName %param_6 "param_6"
+               OpName %param_7 "param_7"
+               OpName %hueColor_f1_ "hueColor_f1_"
+               OpName %angle "angle"
+               OpName %nodeData "nodeData"
+               OpName %param_4 "param_4"
+               OpName %main_1 "main_1"
+               OpName %treeIndex_1 "treeIndex_1"
+               OpName %param_8 "param_8"
+               OpName %param_9 "param_9"
+               OpName %param_10 "param_10"
+               OpName %param_11 "param_11"
+               OpName %GLF_live1_looplimiter2 "GLF_live1_looplimiter2"
+               OpName %GLF_live1i "GLF_live1i"
+               OpName %param_12 "param_12"
+               OpName %param_13 "param_13"
+               OpName %param_14 "param_14"
+               OpName %param_15 "param_15"
+               OpName %param_16 "param_16"
+               OpName %param_17 "param_17"
+               OpName %param_18 "param_18"
+               OpName %param_19 "param_19"
+               OpName %param_20 "param_20"
+               OpName %param_21 "param_21"
+               OpName %param_22 "param_22"
+               OpName %param_23 "param_23"
+               OpName %GLF_live4_looplimiter3 "GLF_live4_looplimiter3"
+               OpName %GLF_live4i "GLF_live4i"
+               OpName %GLF_live4index "GLF_live4index"
+               OpName %Obj "Obj"
+               OpMemberName %Obj 0 "odd_numbers"
+               OpMemberName %Obj 1 "even_numbers"
+               OpName %GLF_live4obj "GLF_live4obj"
+               OpName %param_24 "param_24"
+               OpName %param_25 "param_25"
+               OpName %param_26 "param_26"
+               OpName %param_27 "param_27"
+               OpName %z "z"
+               OpName %x "x"
+               OpName %param_28 "param_28"
+               OpName %y "y"
+               OpName %param_29 "param_29"
+               OpName %sum "sum"
+               OpName %target_1 "target_1"
+               OpName %result "result"
+               OpName %param_30 "param_30"
+               OpName %a "a"
+               OpName %x_235 "x_235"
+               OpName %param_31 "param_31"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpMemberDecorate %BST 0 Offset 0
+               OpMemberDecorate %BST 1 Offset 4
+               OpMemberDecorate %BST 2 Offset 8
+               OpDecorate %_arr_BST_uint_10 ArrayStride 12
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_27 NonWritable
+               OpDecorate %x_27 DescriptorSet 0
+               OpDecorate %x_27 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_float_uint_50 ArrayStride 4
+               OpMemberDecorate %Obj 0 Offset 0
+               OpDecorate %_arr_float_uint_10 ArrayStride 4
+               OpMemberDecorate %Obj 1 Offset 40
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+        %BST = OpTypeStruct %int %int %int
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_BST_uint_10 = OpTypeArray %BST %uint_10
+%_ptr_Private__arr_BST_uint_10 = OpTypePointer Private %_arr_BST_uint_10
+          %8 = OpConstantNull %_arr_BST_uint_10
+     %tree_1 = OpVariable %_ptr_Private__arr_BST_uint_10 Private %8
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_27 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %17
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+%_ptr_Function_BST = OpTypePointer Function %BST
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpTypeFunction %void %_ptr_Function_BST %_ptr_Function_int
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+     %int_n1 = OpConstant %int -1
+     %uint_2 = OpConstant %uint 2
+         %43 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+         %49 = OpConstantNull %int
+         %51 = OpConstantNull %BST
+    %uint_50 = OpConstant %uint 50
+%_arr_float_uint_50 = OpTypeArray %float %uint_50
+%_ptr_Function__arr_float_uint_50 = OpTypePointer Function %_arr_float_uint_50
+         %60 = OpConstantNull %_arr_float_uint_50
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+%_ptr_Private_int = OpTypePointer Private %int
+%_ptr_Private_BST = OpTypePointer Private %BST
+      %int_1 = OpConstant %int 1
+     %int_50 = OpConstant %int 50
+%_ptr_Function_float = OpTypePointer Function %float
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+        %166 = OpTypeFunction %int %_ptr_Function_int
+        %207 = OpTypeFunction %float %_ptr_Function_float
+  %float_6_5 = OpConstant %float 6.5
+  %float_1_5 = OpConstant %float 1.5
+    %int_100 = OpConstant %int 100
+    %float_4 = OpConstant %float 4
+    %float_0 = OpConstant %float 0
+      %int_6 = OpConstant %int 6
+    %float_1 = OpConstant %float 1
+     %int_30 = OpConstant %int 30
+   %float_10 = OpConstant %float 10
+    %v3float = OpTypeVector %float 3
+        %252 = OpTypeFunction %v3float %_ptr_Function_float
+        %258 = OpConstantNull %float
+     %int_15 = OpConstant %int 15
+   %float_30 = OpConstant %float 30
+        %268 = OpConstantComposite %v3float %float_30 %float_30 %float_30
+    %float_5 = OpConstant %float 5
+   %float_50 = OpConstant %float 50
+        %274 = OpConstantComposite %v3float %float_50 %float_50 %float_50
+        %276 = OpTypeFunction %void
+%_arr_float_uint_10 = OpTypeArray %float %uint_10
+        %Obj = OpTypeStruct %_arr_float_uint_10 %_arr_float_uint_10
+%_ptr_Function_Obj = OpTypePointer Function %Obj
+        %305 = OpConstantNull %Obj
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+        %312 = OpConstantNull %v2float
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+        %324 = OpConstantNull %v3float
+      %int_9 = OpConstant %int 9
+      %int_5 = OpConstant %int 5
+       %true = OpConstantTrue %bool
+      %int_7 = OpConstant %int 7
+     %int_12 = OpConstant %int 12
+      %int_8 = OpConstant %int 8
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+     %int_10 = OpConstant %int 10
+     %int_17 = OpConstant %int 17
+     %int_13 = OpConstant %int 13
+  %float_256 = OpConstant %float 256
+        %462 = OpConstantComposite %v2float %float_256 %float_256
+   %int_n100 = OpConstant %int -100
+     %int_20 = OpConstant %int 20
+        %514 = OpConstantComposite %v3float %float_1 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+        %523 = OpTypeFunction %void %main_out
+%makeTreeNode_struct_BST_i1_i1_i11_i1_ = OpFunction %void None %23
+       %tree = OpFunctionParameter %_ptr_Function_BST
+       %data = OpFunctionParameter %_ptr_Function_int
+         %30 = OpLabel
+         %32 = OpLoad %int %data
+         %35 = OpAccessChain %_ptr_Function_int %tree %uint_0
+               OpStore %35 %32
+         %38 = OpAccessChain %_ptr_Function_int %tree %uint_1
+               OpStore %38 %int_n1
+         %42 = OpAccessChain %_ptr_Function_int %tree %uint_2
+               OpStore %42 %int_n1
+               OpReturn
+               OpFunctionEnd
+%insert_i1_i1_ = OpFunction %void None %43
+  %treeIndex = OpFunctionParameter %_ptr_Function_int
+     %data_1 = OpFunctionParameter %_ptr_Function_int
+         %47 = OpLabel
+  %baseIndex = OpVariable %_ptr_Function_int Function %49
+      %param = OpVariable %_ptr_Function_BST Function %51
+    %param_1 = OpVariable %_ptr_Function_int Function %49
+    %param_2 = OpVariable %_ptr_Function_BST Function %51
+    %param_3 = OpVariable %_ptr_Function_int Function %49
+ %GLF_live8i = OpVariable %_ptr_Function_int Function %49
+ %GLF_live8A = OpVariable %_ptr_Function__arr_float_uint_50 Function %60
+               OpStore %baseIndex %int_0
+               OpBranch %62
+         %62 = OpLabel
+               OpLoopMerge %63 %64 None
+               OpBranch %65
+         %65 = OpLabel
+         %66 = OpLoad %int %baseIndex
+         %68 = OpLoad %int %treeIndex
+         %69 = OpSLessThanEqual %bool %66 %68
+               OpSelectionMerge %71 None
+               OpBranchConditional %69 %72 %73
+         %72 = OpLabel
+               OpBranch %71
+         %73 = OpLabel
+               OpBranch %63
+         %71 = OpLabel
+         %75 = OpLoad %int %data_1
+         %76 = OpLoad %int %baseIndex
+         %78 = OpAccessChain %_ptr_Private_int %tree_1 %76 %uint_0
+         %79 = OpLoad %int %78
+         %80 = OpSLessThanEqual %bool %75 %79
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %83
+         %82 = OpLabel
+         %84 = OpLoad %int %baseIndex
+         %85 = OpAccessChain %_ptr_Private_int %tree_1 %84 %uint_1
+         %86 = OpLoad %int %85
+         %87 = OpIEqual %bool %86 %int_n1
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %90
+         %89 = OpLabel
+         %91 = OpLoad %int %baseIndex
+         %93 = OpLoad %int %treeIndex
+         %94 = OpAccessChain %_ptr_Private_int %tree_1 %91 %uint_1
+               OpStore %94 %93
+         %96 = OpLoad %int %treeIndex
+         %98 = OpAccessChain %_ptr_Private_BST %tree_1 %96
+         %99 = OpLoad %BST %98
+               OpStore %param %99
+        %101 = OpLoad %int %data_1
+               OpStore %param_1 %101
+        %102 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param %param_1
+        %105 = OpLoad %BST %param
+        %106 = OpAccessChain %_ptr_Private_BST %tree_1 %96
+               OpStore %106 %105
+               OpReturn
+         %90 = OpLabel
+        %107 = OpLoad %int %baseIndex
+        %108 = OpAccessChain %_ptr_Private_int %tree_1 %107 %uint_1
+        %109 = OpLoad %int %108
+               OpStore %baseIndex %109
+               OpBranch %64
+         %88 = OpLabel
+               OpBranch %81
+         %83 = OpLabel
+        %110 = OpLoad %int %baseIndex
+        %111 = OpAccessChain %_ptr_Private_int %tree_1 %110 %uint_2
+        %112 = OpLoad %int %111
+        %113 = OpIEqual %bool %112 %int_n1
+               OpSelectionMerge %114 None
+               OpBranchConditional %113 %115 %116
+        %115 = OpLabel
+        %117 = OpLoad %int %baseIndex
+        %119 = OpLoad %int %treeIndex
+        %120 = OpAccessChain %_ptr_Private_int %tree_1 %117 %uint_2
+               OpStore %120 %119
+        %122 = OpLoad %int %treeIndex
+        %123 = OpAccessChain %_ptr_Private_BST %tree_1 %122
+        %124 = OpLoad %BST %123
+               OpStore %param_2 %124
+        %126 = OpLoad %int %data_1
+               OpStore %param_3 %126
+        %127 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param_2 %param_3
+        %130 = OpLoad %BST %param_2
+        %131 = OpAccessChain %_ptr_Private_BST %tree_1 %122
+               OpStore %131 %130
+               OpReturn
+        %116 = OpLabel
+               OpStore %GLF_live8i %int_1
+        %133 = OpLoad %int %GLF_live8i
+        %134 = OpLoad %int %GLF_live8i
+        %135 = OpLoad %int %GLF_live8i
+        %137 = OpSGreaterThanEqual %bool %133 %int_0
+               OpSelectionMerge %138 None
+               OpBranchConditional %137 %139 %138
+        %139 = OpLabel
+        %141 = OpSLessThan %bool %134 %int_50
+               OpBranch %138
+        %138 = OpLabel
+        %142 = OpPhi %bool %137 %116 %141 %139
+        %136 = OpSelect %int %142 %135 %int_0
+        %144 = OpAccessChain %_ptr_Function_float %GLF_live8A %int_0
+        %145 = OpLoad %float %144
+        %146 = OpAccessChain %_ptr_Function_float %GLF_live8A %136
+        %147 = OpLoad %float %146
+        %148 = OpAccessChain %_ptr_Function_float %GLF_live8A %136
+        %149 = OpFAdd %float %147 %145
+               OpStore %148 %149
+               OpBranch %150
+        %150 = OpLabel
+               OpLoopMerge %151 %152 None
+               OpBranch %153
+        %153 = OpLabel
+        %154 = OpLoad %int %baseIndex
+        %155 = OpAccessChain %_ptr_Private_int %tree_1 %154 %uint_2
+        %156 = OpLoad %int %155
+               OpStore %baseIndex %156
+               OpBranch %152
+        %152 = OpLabel
+        %158 = OpAccessChain %_ptr_Uniform_float %x_27 %uint_0 %uint_0
+        %159 = OpLoad %float %158
+        %160 = OpAccessChain %_ptr_Uniform_float %x_27 %uint_0 %uint_1
+        %161 = OpLoad %float %160
+        %162 = OpFOrdGreaterThan %bool %159 %161
+               OpSelectionMerge %163 None
+               OpBranchConditional %162 %164 %165
+        %164 = OpLabel
+               OpBranch %163
+        %165 = OpLabel
+               OpBranch %151
+        %163 = OpLabel
+               OpBranch %150
+        %151 = OpLabel
+               OpBranch %64
+        %114 = OpLabel
+               OpBranch %81
+         %81 = OpLabel
+               OpBranch %64
+         %64 = OpLabel
+               OpBranch %62
+         %63 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %search_i1_ = OpFunction %int None %166
+     %target = OpFunctionParameter %_ptr_Function_int
+        %169 = OpLabel
+      %index = OpVariable %_ptr_Function_int Function %49
+%currentNode = OpVariable %_ptr_Function_BST Function %51
+      %x_387 = OpVariable %_ptr_Function_int Function %49
+               OpStore %index %int_0
+               OpBranch %173
+        %173 = OpLabel
+               OpLoopMerge %174 %175 None
+               OpBranch %176
+        %176 = OpLabel
+        %177 = OpLoad %int %index
+        %178 = OpINotEqual %bool %177 %int_n1
+               OpSelectionMerge %179 None
+               OpBranchConditional %178 %180 %181
+        %180 = OpLabel
+               OpBranch %179
+        %181 = OpLabel
+               OpBranch %174
+        %179 = OpLabel
+        %182 = OpLoad %int %index
+        %183 = OpAccessChain %_ptr_Private_BST %tree_1 %182
+        %184 = OpLoad %BST %183
+               OpStore %currentNode %184
+        %185 = OpAccessChain %_ptr_Function_int %currentNode %uint_0
+        %186 = OpLoad %int %185
+        %188 = OpLoad %int %target
+        %189 = OpIEqual %bool %186 %188
+               OpSelectionMerge %190 None
+               OpBranchConditional %189 %191 %190
+        %191 = OpLabel
+        %193 = OpLoad %int %target
+               OpReturnValue %193
+        %190 = OpLabel
+        %195 = OpLoad %int %target
+        %196 = OpAccessChain %_ptr_Function_int %currentNode %uint_0
+        %197 = OpLoad %int %196
+        %198 = OpSGreaterThan %bool %195 %197
+               OpSelectionMerge %199 None
+               OpBranchConditional %198 %200 %201
+        %200 = OpLabel
+        %202 = OpAccessChain %_ptr_Function_int %currentNode %uint_2
+        %203 = OpLoad %int %202
+               OpStore %x_387 %203
+               OpBranch %199
+        %201 = OpLabel
+        %204 = OpAccessChain %_ptr_Function_int %currentNode %uint_1
+        %205 = OpLoad %int %204
+               OpStore %x_387 %205
+               OpBranch %199
+        %199 = OpLabel
+        %206 = OpLoad %int %x_387
+               OpStore %index %206
+               OpBranch %175
+        %175 = OpLabel
+               OpBranch %173
+        %174 = OpLabel
+               OpReturnValue %int_n1
+               OpFunctionEnd
+%makeFrame_f1_ = OpFunction %float None %207
+          %v = OpFunctionParameter %_ptr_Function_float
+        %210 = OpLabel
+    %param_5 = OpVariable %_ptr_Function_int Function %49
+    %param_6 = OpVariable %_ptr_Function_int Function %49
+    %param_7 = OpVariable %_ptr_Function_int Function %49
+        %215 = OpLoad %float %v
+        %218 = OpFMul %float %215 %float_6_5
+               OpStore %v %218
+        %220 = OpLoad %float %v
+        %222 = OpFOrdLessThan %bool %220 %float_1_5
+               OpSelectionMerge %223 None
+               OpBranchConditional %222 %224 %223
+        %224 = OpLabel
+               OpStore %param_5 %int_100
+        %226 = OpFunctionCall %int %search_i1_ %param_5
+        %228 = OpConvertSToF %float %226
+               OpReturnValue %228
+        %223 = OpLabel
+        %230 = OpLoad %float %v
+        %232 = OpFOrdLessThan %bool %230 %float_4
+               OpSelectionMerge %233 None
+               OpBranchConditional %232 %234 %233
+        %234 = OpLabel
+               OpReturnValue %float_0
+        %233 = OpLabel
+        %237 = OpLoad %float %v
+               OpStore %param_6 %int_6
+        %239 = OpFunctionCall %int %search_i1_ %param_6
+        %241 = OpConvertSToF %float %239
+        %242 = OpFOrdLessThan %bool %237 %241
+               OpSelectionMerge %243 None
+               OpBranchConditional %242 %244 %243
+        %244 = OpLabel
+               OpReturnValue %float_1
+        %243 = OpLabel
+               OpStore %param_7 %int_30
+        %247 = OpFunctionCall %int %search_i1_ %param_7
+        %250 = OpConvertSToF %float %247
+        %251 = OpFAdd %float %float_10 %250
+               OpReturnValue %251
+               OpFunctionEnd
+%hueColor_f1_ = OpFunction %v3float None %252
+      %angle = OpFunctionParameter %_ptr_Function_float
+        %256 = OpLabel
+   %nodeData = OpVariable %_ptr_Function_float Function %258
+    %param_4 = OpVariable %_ptr_Function_int Function %49
+               OpStore %param_4 %int_15
+        %261 = OpFunctionCall %int %search_i1_ %param_4
+        %263 = OpConvertSToF %float %261
+               OpStore %nodeData %263
+        %265 = OpLoad %float %angle
+        %266 = OpLoad %float %nodeData
+        %270 = OpCompositeConstruct %v3float %float_1 %float_5 %266
+        %271 = OpVectorTimesScalar %v3float %270 %265
+        %272 = OpFAdd %v3float %268 %271
+        %275 = OpFDiv %v3float %272 %274
+               OpReturnValue %275
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %276
+        %278 = OpLabel
+%treeIndex_1 = OpVariable %_ptr_Function_int Function %49
+    %param_8 = OpVariable %_ptr_Function_BST Function %51
+    %param_9 = OpVariable %_ptr_Function_int Function %49
+   %param_10 = OpVariable %_ptr_Function_int Function %49
+   %param_11 = OpVariable %_ptr_Function_int Function %49
+%GLF_live1_looplimiter2 = OpVariable %_ptr_Function_int Function %49
+ %GLF_live1i = OpVariable %_ptr_Function_int Function %49
+   %param_12 = OpVariable %_ptr_Function_int Function %49
+   %param_13 = OpVariable %_ptr_Function_int Function %49
+   %param_14 = OpVariable %_ptr_Function_int Function %49
+   %param_15 = OpVariable %_ptr_Function_int Function %49
+   %param_16 = OpVariable %_ptr_Function_int Function %49
+   %param_17 = OpVariable %_ptr_Function_int Function %49
+   %param_18 = OpVariable %_ptr_Function_int Function %49
+   %param_19 = OpVariable %_ptr_Function_int Function %49
+   %param_20 = OpVariable %_ptr_Function_int Function %49
+   %param_21 = OpVariable %_ptr_Function_int Function %49
+   %param_22 = OpVariable %_ptr_Function_int Function %49
+   %param_23 = OpVariable %_ptr_Function_int Function %49
+%GLF_live4_looplimiter3 = OpVariable %_ptr_Function_int Function %49
+ %GLF_live4i = OpVariable %_ptr_Function_int Function %49
+%GLF_live4index = OpVariable %_ptr_Function_int Function %49
+%GLF_live4obj = OpVariable %_ptr_Function_Obj Function %305
+   %param_24 = OpVariable %_ptr_Function_int Function %49
+   %param_25 = OpVariable %_ptr_Function_int Function %49
+   %param_26 = OpVariable %_ptr_Function_int Function %49
+   %param_27 = OpVariable %_ptr_Function_int Function %49
+          %z = OpVariable %_ptr_Function_v2float Function %312
+          %x = OpVariable %_ptr_Function_float Function %258
+   %param_28 = OpVariable %_ptr_Function_float Function %258
+          %y = OpVariable %_ptr_Function_float Function %258
+   %param_29 = OpVariable %_ptr_Function_float Function %258
+        %sum = OpVariable %_ptr_Function_int Function %49
+   %target_1 = OpVariable %_ptr_Function_int Function %49
+     %result = OpVariable %_ptr_Function_int Function %49
+   %param_30 = OpVariable %_ptr_Function_int Function %49
+          %a = OpVariable %_ptr_Function_float Function %258
+      %x_235 = OpVariable %_ptr_Function_v3float Function %324
+   %param_31 = OpVariable %_ptr_Function_float Function %258
+               OpStore %treeIndex_1 %int_0
+        %326 = OpAccessChain %_ptr_Private_BST %tree_1 %int_0
+        %327 = OpLoad %BST %326
+               OpStore %param_8 %327
+               OpStore %param_9 %int_9
+        %329 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param_8 %param_9
+        %332 = OpLoad %BST %param_8
+        %333 = OpAccessChain %_ptr_Private_BST %tree_1 %int_0
+               OpStore %333 %332
+        %334 = OpLoad %int %treeIndex_1
+        %335 = OpIAdd %int %334 %int_1
+               OpStore %treeIndex_1 %335
+        %336 = OpLoad %int %treeIndex_1
+               OpStore %param_10 %336
+               OpStore %param_11 %int_5
+        %338 = OpFunctionCall %void %insert_i1_i1_ %param_10 %param_11
+        %341 = OpLoad %int %treeIndex_1
+        %342 = OpIAdd %int %341 %int_1
+               OpStore %treeIndex_1 %342
+               OpStore %GLF_live1_looplimiter2 %int_0
+               OpStore %GLF_live1i %int_0
+               OpBranch %343
+        %343 = OpLabel
+               OpLoopMerge %344 %345 None
+               OpBranch %346
+        %346 = OpLabel
+               OpSelectionMerge %348 None
+               OpBranchConditional %true %349 %350
+        %349 = OpLabel
+               OpBranch %348
+        %350 = OpLabel
+               OpBranch %344
+        %348 = OpLabel
+        %351 = OpLoad %int %GLF_live1_looplimiter2
+        %353 = OpSGreaterThanEqual %bool %351 %int_7
+               OpSelectionMerge %354 None
+               OpBranchConditional %353 %355 %354
+        %355 = OpLabel
+               OpBranch %344
+        %354 = OpLabel
+        %356 = OpLoad %int %GLF_live1_looplimiter2
+        %357 = OpIAdd %int %356 %int_1
+               OpStore %GLF_live1_looplimiter2 %357
+               OpBranch %345
+        %345 = OpLabel
+        %358 = OpLoad %int %GLF_live1i
+        %359 = OpIAdd %int %358 %int_1
+               OpStore %GLF_live1i %359
+               OpBranch %343
+        %344 = OpLabel
+        %360 = OpLoad %int %treeIndex_1
+               OpStore %param_12 %360
+               OpStore %param_13 %int_12
+        %362 = OpFunctionCall %void %insert_i1_i1_ %param_12 %param_13
+        %365 = OpLoad %int %treeIndex_1
+        %366 = OpIAdd %int %365 %int_1
+               OpStore %treeIndex_1 %366
+        %367 = OpLoad %int %treeIndex_1
+               OpStore %param_14 %367
+               OpStore %param_15 %int_15
+        %368 = OpFunctionCall %void %insert_i1_i1_ %param_14 %param_15
+        %371 = OpLoad %int %treeIndex_1
+        %372 = OpIAdd %int %371 %int_1
+               OpStore %treeIndex_1 %372
+        %373 = OpLoad %int %treeIndex_1
+               OpStore %param_16 %373
+               OpStore %param_17 %int_7
+        %374 = OpFunctionCall %void %insert_i1_i1_ %param_16 %param_17
+        %377 = OpLoad %int %treeIndex_1
+        %378 = OpIAdd %int %377 %int_1
+               OpStore %treeIndex_1 %378
+        %379 = OpLoad %int %treeIndex_1
+               OpStore %param_18 %379
+               OpStore %param_19 %int_8
+        %381 = OpFunctionCall %void %insert_i1_i1_ %param_18 %param_19
+        %384 = OpLoad %int %treeIndex_1
+        %385 = OpIAdd %int %384 %int_1
+               OpStore %treeIndex_1 %385
+        %386 = OpLoad %int %treeIndex_1
+               OpStore %param_20 %386
+               OpStore %param_21 %int_2
+        %388 = OpFunctionCall %void %insert_i1_i1_ %param_20 %param_21
+        %391 = OpLoad %int %treeIndex_1
+        %392 = OpIAdd %int %391 %int_1
+               OpStore %treeIndex_1 %392
+        %393 = OpLoad %int %treeIndex_1
+               OpStore %param_22 %393
+               OpStore %param_23 %int_6
+        %394 = OpFunctionCall %void %insert_i1_i1_ %param_22 %param_23
+        %397 = OpLoad %int %treeIndex_1
+        %398 = OpIAdd %int %397 %int_1
+               OpStore %treeIndex_1 %398
+               OpStore %GLF_live4_looplimiter3 %int_0
+               OpStore %GLF_live4i %int_0
+               OpBranch %399
+        %399 = OpLabel
+               OpLoopMerge %400 %401 None
+               OpBranch %402
+        %402 = OpLabel
+               OpSelectionMerge %403 None
+               OpBranchConditional %true %404 %405
+        %404 = OpLabel
+               OpBranch %403
+        %405 = OpLabel
+               OpBranch %400
+        %403 = OpLabel
+        %406 = OpLoad %int %GLF_live4_looplimiter3
+        %408 = OpSGreaterThanEqual %bool %406 %int_3
+               OpSelectionMerge %409 None
+               OpBranchConditional %408 %410 %409
+        %410 = OpLabel
+               OpBranch %400
+        %409 = OpLabel
+        %411 = OpLoad %int %GLF_live4_looplimiter3
+        %412 = OpIAdd %int %411 %int_1
+               OpStore %GLF_live4_looplimiter3 %412
+               OpStore %GLF_live4index %int_1
+        %413 = OpLoad %int %GLF_live4index
+        %414 = OpLoad %int %GLF_live4index
+        %415 = OpLoad %int %GLF_live4index
+        %416 = OpAccessChain %_ptr_Function_float %GLF_live4obj %uint_1 %int_1
+        %417 = OpLoad %float %416
+        %419 = OpSGreaterThanEqual %bool %413 %int_0
+               OpSelectionMerge %420 None
+               OpBranchConditional %419 %421 %420
+        %421 = OpLabel
+        %423 = OpSLessThan %bool %414 %int_10
+               OpBranch %420
+        %420 = OpLabel
+        %424 = OpPhi %bool %419 %409 %423 %421
+        %418 = OpSelect %int %424 %415 %int_0
+        %425 = OpAccessChain %_ptr_Function_float %GLF_live4obj %uint_1 %418
+               OpStore %425 %417
+        %426 = OpLoad %int %GLF_live4i
+        %427 = OpLoad %int %GLF_live4i
+        %428 = OpLoad %int %GLF_live4i
+        %430 = OpSGreaterThanEqual %bool %426 %int_0
+               OpSelectionMerge %431 None
+               OpBranchConditional %430 %432 %431
+        %432 = OpLabel
+        %433 = OpSLessThan %bool %427 %int_10
+               OpBranch %431
+        %431 = OpLabel
+        %434 = OpPhi %bool %430 %420 %433 %432
+        %429 = OpSelect %int %434 %428 %int_0
+        %435 = OpAccessChain %_ptr_Function_float %GLF_live4obj %uint_1 %429
+               OpStore %435 %float_1
+               OpBranch %401
+        %401 = OpLabel
+        %436 = OpLoad %int %GLF_live4i
+        %437 = OpIAdd %int %436 %int_1
+               OpStore %GLF_live4i %437
+               OpBranch %399
+        %400 = OpLabel
+        %438 = OpLoad %int %treeIndex_1
+               OpStore %param_24 %438
+               OpStore %param_25 %int_17
+        %440 = OpFunctionCall %void %insert_i1_i1_ %param_24 %param_25
+        %443 = OpAccessChain %_ptr_Uniform_float %x_27 %uint_0 %uint_0
+        %444 = OpLoad %float %443
+        %445 = OpAccessChain %_ptr_Uniform_float %x_27 %uint_0 %uint_1
+        %446 = OpLoad %float %445
+        %447 = OpFOrdGreaterThan %bool %444 %446
+               OpSelectionMerge %448 None
+               OpBranchConditional %447 %449 %448
+        %449 = OpLabel
+               OpReturn
+        %448 = OpLabel
+        %450 = OpLoad %int %treeIndex_1
+        %451 = OpIAdd %int %450 %int_1
+               OpStore %treeIndex_1 %451
+        %452 = OpLoad %int %treeIndex_1
+               OpStore %param_26 %452
+               OpStore %param_27 %int_13
+        %454 = OpFunctionCall %void %insert_i1_i1_ %param_26 %param_27
+        %457 = OpLoad %v4float %gl_FragCoord
+        %458 = OpCompositeExtract %float %457 1
+        %459 = OpCompositeExtract %float %457 0
+        %460 = OpCompositeConstruct %v2float %458 %459
+        %463 = OpFDiv %v2float %460 %462
+               OpStore %z %463
+        %464 = OpAccessChain %_ptr_Function_float %z %uint_0
+        %465 = OpLoad %float %464
+               OpStore %param_28 %465
+        %466 = OpFunctionCall %float %makeFrame_f1_ %param_28
+               OpStore %x %466
+        %468 = OpAccessChain %_ptr_Function_float %z %uint_1
+        %469 = OpLoad %float %468
+               OpStore %param_29 %469
+        %470 = OpFunctionCall %float %makeFrame_f1_ %param_29
+               OpStore %y %470
+               OpStore %sum %int_n100
+               OpStore %target_1 %int_0
+               OpBranch %473
+        %473 = OpLabel
+               OpLoopMerge %474 %475 None
+               OpBranch %476
+        %476 = OpLabel
+        %477 = OpLoad %int %target_1
+        %479 = OpSLessThan %bool %477 %int_20
+               OpSelectionMerge %480 None
+               OpBranchConditional %479 %481 %482
+        %481 = OpLabel
+               OpBranch %480
+        %482 = OpLabel
+               OpBranch %474
+        %480 = OpLabel
+        %483 = OpLoad %int %target_1
+               OpStore %param_30 %483
+        %484 = OpFunctionCall %int %search_i1_ %param_30
+               OpStore %result %484
+        %486 = OpLoad %int %result
+        %487 = OpSGreaterThan %bool %486 %int_0
+               OpSelectionMerge %488 None
+               OpBranchConditional %487 %489 %490
+        %489 = OpLabel
+               OpBranch %488
+        %490 = OpLabel
+        %491 = OpLoad %int %result
+               OpSelectionMerge %492 None
+               OpSwitch %491 %493 0 %494 -1 %495
+        %494 = OpLabel
+               OpReturn
+        %495 = OpLabel
+        %496 = OpLoad %int %sum
+        %497 = OpIAdd %int %496 %int_1
+               OpStore %sum %497
+               OpBranch %492
+        %493 = OpLabel
+               OpBranch %492
+        %492 = OpLabel
+               OpBranch %488
+        %488 = OpLabel
+               OpBranch %475
+        %475 = OpLabel
+        %498 = OpLoad %int %target_1
+        %499 = OpIAdd %int %498 %int_1
+               OpStore %target_1 %499
+               OpBranch %473
+        %474 = OpLabel
+        %500 = OpLoad %float %x
+        %501 = OpLoad %float %y
+        %502 = OpLoad %int %sum
+        %503 = OpConvertSToF %float %502
+        %504 = OpFMul %float %501 %503
+        %505 = OpFAdd %float %500 %504
+               OpStore %a %505
+        %506 = OpAccessChain %_ptr_Uniform_float %x_27 %uint_0 %uint_0
+        %507 = OpLoad %float %506
+        %508 = OpAccessChain %_ptr_Uniform_float %x_27 %uint_0 %uint_1
+        %509 = OpLoad %float %508
+        %510 = OpFOrdLessThan %bool %507 %509
+               OpSelectionMerge %511 None
+               OpBranchConditional %510 %512 %513
+        %512 = OpLabel
+               OpStore %x_235 %514
+               OpBranch %511
+        %513 = OpLabel
+        %515 = OpLoad %float %a
+               OpStore %param_31 %515
+        %516 = OpFunctionCall %v3float %hueColor_f1_ %param_31
+               OpStore %x_235 %516
+               OpBranch %511
+        %511 = OpLabel
+        %518 = OpLoad %v3float %x_235
+        %519 = OpCompositeExtract %float %518 0
+        %520 = OpCompositeExtract %float %518 1
+        %521 = OpCompositeExtract %float %518 2
+        %522 = OpCompositeConstruct %v4float %519 %520 %521 %float_1
+               OpStore %x_GLF_color %522
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %523
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %527 = OpLabel
+        %528 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %528
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %276
+        %530 = OpLabel
+        %531 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %531
+        %532 = OpFunctionCall %void %main_1
+        %534 = OpLoad %v4float %x_GLF_color
+        %535 = OpCompositeConstruct %main_out %534
+        %533 = OpFunctionCall %void %tint_symbol_3 %535
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 152[%152] is not post dominated by the back-edge block 163[%163]
+  %163 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..eaa0aec
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,420 @@
+struct BST {
+  data : i32;
+  leftIndex : i32;
+  rightIndex : i32;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+struct Obj {
+  odd_numbers : array<f32, 10>;
+  even_numbers : array<f32, 10>;
+};
+
+var<private> tree_1 : array<BST, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_27 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn makeTreeNode_struct_BST_i1_i1_i11_i1_(tree : ptr<function, BST>, data : ptr<function, i32>) {
+  let x_74 : i32 = *(data);
+  (*(tree)).data = x_74;
+  (*(tree)).leftIndex = -1;
+  (*(tree)).rightIndex = -1;
+  return;
+}
+
+fn insert_i1_i1_(treeIndex : ptr<function, i32>, data_1 : ptr<function, i32>) {
+  var baseIndex : i32;
+  var param : BST;
+  var param_1 : i32;
+  var param_2 : BST;
+  var param_3 : i32;
+  var GLF_live8i : i32;
+  var GLF_live8A : array<f32, 50>;
+  baseIndex = 0;
+  loop {
+    let x_75 : i32 = baseIndex;
+    let x_76 : i32 = *(treeIndex);
+    if ((x_75 <= x_76)) {
+    } else {
+      break;
+    }
+    let x_77 : i32 = *(data_1);
+    let x_78 : i32 = baseIndex;
+    let x_79 : i32 = tree_1[x_78].data;
+    if ((x_77 <= x_79)) {
+      let x_80 : i32 = baseIndex;
+      let x_81 : i32 = tree_1[x_80].leftIndex;
+      if ((x_81 == -1)) {
+        let x_82 : i32 = baseIndex;
+        let x_83 : i32 = *(treeIndex);
+        tree_1[x_82].leftIndex = x_83;
+        let x_84 : i32 = *(treeIndex);
+        let x_350 : BST = tree_1[x_84];
+        param = x_350;
+        let x_85 : i32 = *(data_1);
+        param_1 = x_85;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param), &(param_1));
+        let x_352 : BST = param;
+        tree_1[x_84] = x_352;
+        return;
+      } else {
+        let x_86 : i32 = baseIndex;
+        let x_87 : i32 = tree_1[x_86].leftIndex;
+        baseIndex = x_87;
+        continue;
+      }
+    } else {
+      let x_88 : i32 = baseIndex;
+      let x_89 : i32 = tree_1[x_88].rightIndex;
+      if ((x_89 == -1)) {
+        let x_90 : i32 = baseIndex;
+        let x_91 : i32 = *(treeIndex);
+        tree_1[x_90].rightIndex = x_91;
+        let x_92 : i32 = *(treeIndex);
+        let x_362 : BST = tree_1[x_92];
+        param_2 = x_362;
+        let x_93 : i32 = *(data_1);
+        param_3 = x_93;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_2), &(param_3));
+        let x_364 : BST = param_2;
+        tree_1[x_92] = x_364;
+        return;
+      } else {
+        GLF_live8i = 1;
+        let x_94 : i32 = GLF_live8i;
+        let x_95 : i32 = GLF_live8i;
+        let x_96 : i32 = GLF_live8i;
+        let x_369 : i32 = select(0, x_96, ((x_94 >= 0) && (x_95 < 50)));
+        let x_371 : f32 = GLF_live8A[0];
+        let x_373 : f32 = GLF_live8A[x_369];
+        GLF_live8A[x_369] = (x_373 + x_371);
+        loop {
+          let x_97 : i32 = baseIndex;
+          let x_98 : i32 = tree_1[x_97].rightIndex;
+          baseIndex = x_98;
+
+          continuing {
+            let x_382 : f32 = x_27.injectionSwitch.x;
+            let x_384 : f32 = x_27.injectionSwitch.y;
+            if ((x_382 > x_384)) {
+            } else {
+              break;
+            }
+          }
+        }
+        continue;
+      }
+    }
+  }
+  return;
+}
+
+fn search_i1_(target : ptr<function, i32>) -> i32 {
+  var index : i32;
+  var currentNode : BST;
+  var x_387 : i32;
+  index = 0;
+  loop {
+    let x_99 : i32 = index;
+    if ((x_99 != -1)) {
+    } else {
+      break;
+    }
+    let x_100 : i32 = index;
+    let x_395 : BST = tree_1[x_100];
+    currentNode = x_395;
+    let x_101 : i32 = currentNode.data;
+    let x_102 : i32 = *(target);
+    if ((x_101 == x_102)) {
+      let x_103 : i32 = *(target);
+      return x_103;
+    }
+    let x_104 : i32 = *(target);
+    let x_105 : i32 = currentNode.data;
+    if ((x_104 > x_105)) {
+      let x_106 : i32 = currentNode.rightIndex;
+      x_387 = x_106;
+    } else {
+      let x_107 : i32 = currentNode.leftIndex;
+      x_387 = x_107;
+    }
+    let x_108 : i32 = x_387;
+    index = x_108;
+  }
+  return -1;
+}
+
+fn makeFrame_f1_(v : ptr<function, f32>) -> f32 {
+  var param_5 : i32;
+  var param_6 : i32;
+  var param_7 : i32;
+  let x_418 : f32 = *(v);
+  *(v) = (x_418 * 6.5);
+  let x_420 : f32 = *(v);
+  if ((x_420 < 1.5)) {
+    param_5 = 100;
+    let x_110 : i32 = search_i1_(&(param_5));
+    return f32(x_110);
+  }
+  let x_425 : f32 = *(v);
+  if ((x_425 < 4.0)) {
+    return 0.0;
+  }
+  let x_429 : f32 = *(v);
+  param_6 = 6;
+  let x_111 : i32 = search_i1_(&(param_6));
+  if ((x_429 < f32(x_111))) {
+    return 1.0;
+  }
+  param_7 = 30;
+  let x_112 : i32 = search_i1_(&(param_7));
+  return (10.0 + f32(x_112));
+}
+
+fn hueColor_f1_(angle : ptr<function, f32>) -> vec3<f32> {
+  var nodeData : f32;
+  var param_4 : i32;
+  param_4 = 15;
+  let x_109 : i32 = search_i1_(&(param_4));
+  nodeData = f32(x_109);
+  let x_409 : f32 = *(angle);
+  let x_410 : f32 = nodeData;
+  return ((vec3<f32>(30.0, 30.0, 30.0) + (vec3<f32>(1.0, 5.0, x_410) * x_409)) / vec3<f32>(50.0, 50.0, 50.0));
+}
+
+fn main_1() {
+  var treeIndex_1 : i32;
+  var param_8 : BST;
+  var param_9 : i32;
+  var param_10 : i32;
+  var param_11 : i32;
+  var GLF_live1_looplimiter2 : i32;
+  var GLF_live1i : i32;
+  var param_12 : i32;
+  var param_13 : i32;
+  var param_14 : i32;
+  var param_15 : i32;
+  var param_16 : i32;
+  var param_17 : i32;
+  var param_18 : i32;
+  var param_19 : i32;
+  var param_20 : i32;
+  var param_21 : i32;
+  var param_22 : i32;
+  var param_23 : i32;
+  var GLF_live4_looplimiter3 : i32;
+  var GLF_live4i : i32;
+  var GLF_live4index : i32;
+  var GLF_live4obj : Obj;
+  var param_24 : i32;
+  var param_25 : i32;
+  var param_26 : i32;
+  var param_27 : i32;
+  var z : vec2<f32>;
+  var x : f32;
+  var param_28 : f32;
+  var y : f32;
+  var param_29 : f32;
+  var sum : i32;
+  var target_1 : i32;
+  var result : i32;
+  var param_30 : i32;
+  var a : f32;
+  var x_235 : vec3<f32>;
+  var param_31 : f32;
+  treeIndex_1 = 0;
+  let x_237 : BST = tree_1[0];
+  param_8 = x_237;
+  param_9 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_8), &(param_9));
+  let x_239 : BST = param_8;
+  tree_1[0] = x_239;
+  let x_113 : i32 = treeIndex_1;
+  treeIndex_1 = (x_113 + 1);
+  let x_115 : i32 = treeIndex_1;
+  param_10 = x_115;
+  param_11 = 5;
+  insert_i1_i1_(&(param_10), &(param_11));
+  let x_116 : i32 = treeIndex_1;
+  treeIndex_1 = (x_116 + 1);
+  GLF_live1_looplimiter2 = 0;
+  GLF_live1i = 0;
+  loop {
+    if (true) {
+    } else {
+      break;
+    }
+    let x_118 : i32 = GLF_live1_looplimiter2;
+    if ((x_118 >= 7)) {
+      break;
+    }
+    let x_119 : i32 = GLF_live1_looplimiter2;
+    GLF_live1_looplimiter2 = (x_119 + 1);
+
+    continuing {
+      let x_121 : i32 = GLF_live1i;
+      GLF_live1i = (x_121 + 1);
+    }
+  }
+  let x_123 : i32 = treeIndex_1;
+  param_12 = x_123;
+  param_13 = 12;
+  insert_i1_i1_(&(param_12), &(param_13));
+  let x_124 : i32 = treeIndex_1;
+  treeIndex_1 = (x_124 + 1);
+  let x_126 : i32 = treeIndex_1;
+  param_14 = x_126;
+  param_15 = 15;
+  insert_i1_i1_(&(param_14), &(param_15));
+  let x_127 : i32 = treeIndex_1;
+  treeIndex_1 = (x_127 + 1);
+  let x_129 : i32 = treeIndex_1;
+  param_16 = x_129;
+  param_17 = 7;
+  insert_i1_i1_(&(param_16), &(param_17));
+  let x_130 : i32 = treeIndex_1;
+  treeIndex_1 = (x_130 + 1);
+  let x_132 : i32 = treeIndex_1;
+  param_18 = x_132;
+  param_19 = 8;
+  insert_i1_i1_(&(param_18), &(param_19));
+  let x_133 : i32 = treeIndex_1;
+  treeIndex_1 = (x_133 + 1);
+  let x_135 : i32 = treeIndex_1;
+  param_20 = x_135;
+  param_21 = 2;
+  insert_i1_i1_(&(param_20), &(param_21));
+  let x_136 : i32 = treeIndex_1;
+  treeIndex_1 = (x_136 + 1);
+  let x_138 : i32 = treeIndex_1;
+  param_22 = x_138;
+  param_23 = 6;
+  insert_i1_i1_(&(param_22), &(param_23));
+  let x_139 : i32 = treeIndex_1;
+  treeIndex_1 = (x_139 + 1);
+  GLF_live4_looplimiter3 = 0;
+  GLF_live4i = 0;
+  loop {
+    if (true) {
+    } else {
+      break;
+    }
+    let x_141 : i32 = GLF_live4_looplimiter3;
+    if ((x_141 >= 3)) {
+      break;
+    }
+    let x_142 : i32 = GLF_live4_looplimiter3;
+    GLF_live4_looplimiter3 = (x_142 + 1);
+    GLF_live4index = 1;
+    let x_144 : i32 = GLF_live4index;
+    let x_145 : i32 = GLF_live4index;
+    let x_146 : i32 = GLF_live4index;
+    let x_269 : f32 = GLF_live4obj.even_numbers[1];
+    GLF_live4obj.even_numbers[select(0, x_146, ((x_144 >= 0) && (x_145 < 10)))] = x_269;
+    let x_147 : i32 = GLF_live4i;
+    let x_148 : i32 = GLF_live4i;
+    let x_149 : i32 = GLF_live4i;
+    GLF_live4obj.even_numbers[select(0, x_149, ((x_147 >= 0) && (x_148 < 10)))] = 1.0;
+
+    continuing {
+      let x_150 : i32 = GLF_live4i;
+      GLF_live4i = (x_150 + 1);
+    }
+  }
+  let x_152 : i32 = treeIndex_1;
+  param_24 = x_152;
+  param_25 = 17;
+  insert_i1_i1_(&(param_24), &(param_25));
+  let x_278 : f32 = x_27.injectionSwitch.x;
+  let x_280 : f32 = x_27.injectionSwitch.y;
+  if ((x_278 > x_280)) {
+    return;
+  }
+  let x_153 : i32 = treeIndex_1;
+  treeIndex_1 = (x_153 + 1);
+  let x_155 : i32 = treeIndex_1;
+  param_26 = x_155;
+  param_27 = 13;
+  insert_i1_i1_(&(param_26), &(param_27));
+  let x_285 : vec4<f32> = gl_FragCoord;
+  z = (vec2<f32>(x_285.y, x_285.x) / vec2<f32>(256.0, 256.0));
+  let x_289 : f32 = z.x;
+  param_28 = x_289;
+  let x_290 : f32 = makeFrame_f1_(&(param_28));
+  x = x_290;
+  let x_292 : f32 = z.y;
+  param_29 = x_292;
+  let x_293 : f32 = makeFrame_f1_(&(param_29));
+  y = x_293;
+  sum = -100;
+  target_1 = 0;
+  loop {
+    let x_156 : i32 = target_1;
+    if ((x_156 < 20)) {
+    } else {
+      break;
+    }
+    let x_157 : i32 = target_1;
+    param_30 = x_157;
+    let x_158 : i32 = search_i1_(&(param_30));
+    result = x_158;
+    let x_159 : i32 = result;
+    if ((x_159 > 0)) {
+    } else {
+      let x_160 : i32 = result;
+      switch(x_160) {
+        case 0: {
+          return;
+        }
+        case -1: {
+          let x_161 : i32 = sum;
+          sum = (x_161 + 1);
+        }
+        default: {
+        }
+      }
+    }
+
+    continuing {
+      let x_163 : i32 = target_1;
+      target_1 = (x_163 + 1);
+    }
+  }
+  let x_307 : f32 = x;
+  let x_308 : f32 = y;
+  let x_165 : i32 = sum;
+  a = (x_307 + (x_308 * f32(x_165)));
+  let x_313 : f32 = x_27.injectionSwitch.x;
+  let x_315 : f32 = x_27.injectionSwitch.y;
+  if ((x_313 < x_315)) {
+    x_235 = vec3<f32>(1.0, 0.0, 0.0);
+  } else {
+    let x_320 : f32 = a;
+    param_31 = x_320;
+    let x_321 : vec3<f32> = hueColor_f1_(&(param_31));
+    x_235 = x_321;
+  }
+  let x_322 : vec3<f32> = x_235;
+  x_GLF_color = vec4<f32>(x_322.x, x_322.y, x_322.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.wgsl
new file mode 100644
index 0000000..eaa0aec
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.wgsl
@@ -0,0 +1,420 @@
+struct BST {
+  data : i32;
+  leftIndex : i32;
+  rightIndex : i32;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+struct Obj {
+  odd_numbers : array<f32, 10>;
+  even_numbers : array<f32, 10>;
+};
+
+var<private> tree_1 : array<BST, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_27 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn makeTreeNode_struct_BST_i1_i1_i11_i1_(tree : ptr<function, BST>, data : ptr<function, i32>) {
+  let x_74 : i32 = *(data);
+  (*(tree)).data = x_74;
+  (*(tree)).leftIndex = -1;
+  (*(tree)).rightIndex = -1;
+  return;
+}
+
+fn insert_i1_i1_(treeIndex : ptr<function, i32>, data_1 : ptr<function, i32>) {
+  var baseIndex : i32;
+  var param : BST;
+  var param_1 : i32;
+  var param_2 : BST;
+  var param_3 : i32;
+  var GLF_live8i : i32;
+  var GLF_live8A : array<f32, 50>;
+  baseIndex = 0;
+  loop {
+    let x_75 : i32 = baseIndex;
+    let x_76 : i32 = *(treeIndex);
+    if ((x_75 <= x_76)) {
+    } else {
+      break;
+    }
+    let x_77 : i32 = *(data_1);
+    let x_78 : i32 = baseIndex;
+    let x_79 : i32 = tree_1[x_78].data;
+    if ((x_77 <= x_79)) {
+      let x_80 : i32 = baseIndex;
+      let x_81 : i32 = tree_1[x_80].leftIndex;
+      if ((x_81 == -1)) {
+        let x_82 : i32 = baseIndex;
+        let x_83 : i32 = *(treeIndex);
+        tree_1[x_82].leftIndex = x_83;
+        let x_84 : i32 = *(treeIndex);
+        let x_350 : BST = tree_1[x_84];
+        param = x_350;
+        let x_85 : i32 = *(data_1);
+        param_1 = x_85;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param), &(param_1));
+        let x_352 : BST = param;
+        tree_1[x_84] = x_352;
+        return;
+      } else {
+        let x_86 : i32 = baseIndex;
+        let x_87 : i32 = tree_1[x_86].leftIndex;
+        baseIndex = x_87;
+        continue;
+      }
+    } else {
+      let x_88 : i32 = baseIndex;
+      let x_89 : i32 = tree_1[x_88].rightIndex;
+      if ((x_89 == -1)) {
+        let x_90 : i32 = baseIndex;
+        let x_91 : i32 = *(treeIndex);
+        tree_1[x_90].rightIndex = x_91;
+        let x_92 : i32 = *(treeIndex);
+        let x_362 : BST = tree_1[x_92];
+        param_2 = x_362;
+        let x_93 : i32 = *(data_1);
+        param_3 = x_93;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_2), &(param_3));
+        let x_364 : BST = param_2;
+        tree_1[x_92] = x_364;
+        return;
+      } else {
+        GLF_live8i = 1;
+        let x_94 : i32 = GLF_live8i;
+        let x_95 : i32 = GLF_live8i;
+        let x_96 : i32 = GLF_live8i;
+        let x_369 : i32 = select(0, x_96, ((x_94 >= 0) && (x_95 < 50)));
+        let x_371 : f32 = GLF_live8A[0];
+        let x_373 : f32 = GLF_live8A[x_369];
+        GLF_live8A[x_369] = (x_373 + x_371);
+        loop {
+          let x_97 : i32 = baseIndex;
+          let x_98 : i32 = tree_1[x_97].rightIndex;
+          baseIndex = x_98;
+
+          continuing {
+            let x_382 : f32 = x_27.injectionSwitch.x;
+            let x_384 : f32 = x_27.injectionSwitch.y;
+            if ((x_382 > x_384)) {
+            } else {
+              break;
+            }
+          }
+        }
+        continue;
+      }
+    }
+  }
+  return;
+}
+
+fn search_i1_(target : ptr<function, i32>) -> i32 {
+  var index : i32;
+  var currentNode : BST;
+  var x_387 : i32;
+  index = 0;
+  loop {
+    let x_99 : i32 = index;
+    if ((x_99 != -1)) {
+    } else {
+      break;
+    }
+    let x_100 : i32 = index;
+    let x_395 : BST = tree_1[x_100];
+    currentNode = x_395;
+    let x_101 : i32 = currentNode.data;
+    let x_102 : i32 = *(target);
+    if ((x_101 == x_102)) {
+      let x_103 : i32 = *(target);
+      return x_103;
+    }
+    let x_104 : i32 = *(target);
+    let x_105 : i32 = currentNode.data;
+    if ((x_104 > x_105)) {
+      let x_106 : i32 = currentNode.rightIndex;
+      x_387 = x_106;
+    } else {
+      let x_107 : i32 = currentNode.leftIndex;
+      x_387 = x_107;
+    }
+    let x_108 : i32 = x_387;
+    index = x_108;
+  }
+  return -1;
+}
+
+fn makeFrame_f1_(v : ptr<function, f32>) -> f32 {
+  var param_5 : i32;
+  var param_6 : i32;
+  var param_7 : i32;
+  let x_418 : f32 = *(v);
+  *(v) = (x_418 * 6.5);
+  let x_420 : f32 = *(v);
+  if ((x_420 < 1.5)) {
+    param_5 = 100;
+    let x_110 : i32 = search_i1_(&(param_5));
+    return f32(x_110);
+  }
+  let x_425 : f32 = *(v);
+  if ((x_425 < 4.0)) {
+    return 0.0;
+  }
+  let x_429 : f32 = *(v);
+  param_6 = 6;
+  let x_111 : i32 = search_i1_(&(param_6));
+  if ((x_429 < f32(x_111))) {
+    return 1.0;
+  }
+  param_7 = 30;
+  let x_112 : i32 = search_i1_(&(param_7));
+  return (10.0 + f32(x_112));
+}
+
+fn hueColor_f1_(angle : ptr<function, f32>) -> vec3<f32> {
+  var nodeData : f32;
+  var param_4 : i32;
+  param_4 = 15;
+  let x_109 : i32 = search_i1_(&(param_4));
+  nodeData = f32(x_109);
+  let x_409 : f32 = *(angle);
+  let x_410 : f32 = nodeData;
+  return ((vec3<f32>(30.0, 30.0, 30.0) + (vec3<f32>(1.0, 5.0, x_410) * x_409)) / vec3<f32>(50.0, 50.0, 50.0));
+}
+
+fn main_1() {
+  var treeIndex_1 : i32;
+  var param_8 : BST;
+  var param_9 : i32;
+  var param_10 : i32;
+  var param_11 : i32;
+  var GLF_live1_looplimiter2 : i32;
+  var GLF_live1i : i32;
+  var param_12 : i32;
+  var param_13 : i32;
+  var param_14 : i32;
+  var param_15 : i32;
+  var param_16 : i32;
+  var param_17 : i32;
+  var param_18 : i32;
+  var param_19 : i32;
+  var param_20 : i32;
+  var param_21 : i32;
+  var param_22 : i32;
+  var param_23 : i32;
+  var GLF_live4_looplimiter3 : i32;
+  var GLF_live4i : i32;
+  var GLF_live4index : i32;
+  var GLF_live4obj : Obj;
+  var param_24 : i32;
+  var param_25 : i32;
+  var param_26 : i32;
+  var param_27 : i32;
+  var z : vec2<f32>;
+  var x : f32;
+  var param_28 : f32;
+  var y : f32;
+  var param_29 : f32;
+  var sum : i32;
+  var target_1 : i32;
+  var result : i32;
+  var param_30 : i32;
+  var a : f32;
+  var x_235 : vec3<f32>;
+  var param_31 : f32;
+  treeIndex_1 = 0;
+  let x_237 : BST = tree_1[0];
+  param_8 = x_237;
+  param_9 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_8), &(param_9));
+  let x_239 : BST = param_8;
+  tree_1[0] = x_239;
+  let x_113 : i32 = treeIndex_1;
+  treeIndex_1 = (x_113 + 1);
+  let x_115 : i32 = treeIndex_1;
+  param_10 = x_115;
+  param_11 = 5;
+  insert_i1_i1_(&(param_10), &(param_11));
+  let x_116 : i32 = treeIndex_1;
+  treeIndex_1 = (x_116 + 1);
+  GLF_live1_looplimiter2 = 0;
+  GLF_live1i = 0;
+  loop {
+    if (true) {
+    } else {
+      break;
+    }
+    let x_118 : i32 = GLF_live1_looplimiter2;
+    if ((x_118 >= 7)) {
+      break;
+    }
+    let x_119 : i32 = GLF_live1_looplimiter2;
+    GLF_live1_looplimiter2 = (x_119 + 1);
+
+    continuing {
+      let x_121 : i32 = GLF_live1i;
+      GLF_live1i = (x_121 + 1);
+    }
+  }
+  let x_123 : i32 = treeIndex_1;
+  param_12 = x_123;
+  param_13 = 12;
+  insert_i1_i1_(&(param_12), &(param_13));
+  let x_124 : i32 = treeIndex_1;
+  treeIndex_1 = (x_124 + 1);
+  let x_126 : i32 = treeIndex_1;
+  param_14 = x_126;
+  param_15 = 15;
+  insert_i1_i1_(&(param_14), &(param_15));
+  let x_127 : i32 = treeIndex_1;
+  treeIndex_1 = (x_127 + 1);
+  let x_129 : i32 = treeIndex_1;
+  param_16 = x_129;
+  param_17 = 7;
+  insert_i1_i1_(&(param_16), &(param_17));
+  let x_130 : i32 = treeIndex_1;
+  treeIndex_1 = (x_130 + 1);
+  let x_132 : i32 = treeIndex_1;
+  param_18 = x_132;
+  param_19 = 8;
+  insert_i1_i1_(&(param_18), &(param_19));
+  let x_133 : i32 = treeIndex_1;
+  treeIndex_1 = (x_133 + 1);
+  let x_135 : i32 = treeIndex_1;
+  param_20 = x_135;
+  param_21 = 2;
+  insert_i1_i1_(&(param_20), &(param_21));
+  let x_136 : i32 = treeIndex_1;
+  treeIndex_1 = (x_136 + 1);
+  let x_138 : i32 = treeIndex_1;
+  param_22 = x_138;
+  param_23 = 6;
+  insert_i1_i1_(&(param_22), &(param_23));
+  let x_139 : i32 = treeIndex_1;
+  treeIndex_1 = (x_139 + 1);
+  GLF_live4_looplimiter3 = 0;
+  GLF_live4i = 0;
+  loop {
+    if (true) {
+    } else {
+      break;
+    }
+    let x_141 : i32 = GLF_live4_looplimiter3;
+    if ((x_141 >= 3)) {
+      break;
+    }
+    let x_142 : i32 = GLF_live4_looplimiter3;
+    GLF_live4_looplimiter3 = (x_142 + 1);
+    GLF_live4index = 1;
+    let x_144 : i32 = GLF_live4index;
+    let x_145 : i32 = GLF_live4index;
+    let x_146 : i32 = GLF_live4index;
+    let x_269 : f32 = GLF_live4obj.even_numbers[1];
+    GLF_live4obj.even_numbers[select(0, x_146, ((x_144 >= 0) && (x_145 < 10)))] = x_269;
+    let x_147 : i32 = GLF_live4i;
+    let x_148 : i32 = GLF_live4i;
+    let x_149 : i32 = GLF_live4i;
+    GLF_live4obj.even_numbers[select(0, x_149, ((x_147 >= 0) && (x_148 < 10)))] = 1.0;
+
+    continuing {
+      let x_150 : i32 = GLF_live4i;
+      GLF_live4i = (x_150 + 1);
+    }
+  }
+  let x_152 : i32 = treeIndex_1;
+  param_24 = x_152;
+  param_25 = 17;
+  insert_i1_i1_(&(param_24), &(param_25));
+  let x_278 : f32 = x_27.injectionSwitch.x;
+  let x_280 : f32 = x_27.injectionSwitch.y;
+  if ((x_278 > x_280)) {
+    return;
+  }
+  let x_153 : i32 = treeIndex_1;
+  treeIndex_1 = (x_153 + 1);
+  let x_155 : i32 = treeIndex_1;
+  param_26 = x_155;
+  param_27 = 13;
+  insert_i1_i1_(&(param_26), &(param_27));
+  let x_285 : vec4<f32> = gl_FragCoord;
+  z = (vec2<f32>(x_285.y, x_285.x) / vec2<f32>(256.0, 256.0));
+  let x_289 : f32 = z.x;
+  param_28 = x_289;
+  let x_290 : f32 = makeFrame_f1_(&(param_28));
+  x = x_290;
+  let x_292 : f32 = z.y;
+  param_29 = x_292;
+  let x_293 : f32 = makeFrame_f1_(&(param_29));
+  y = x_293;
+  sum = -100;
+  target_1 = 0;
+  loop {
+    let x_156 : i32 = target_1;
+    if ((x_156 < 20)) {
+    } else {
+      break;
+    }
+    let x_157 : i32 = target_1;
+    param_30 = x_157;
+    let x_158 : i32 = search_i1_(&(param_30));
+    result = x_158;
+    let x_159 : i32 = result;
+    if ((x_159 > 0)) {
+    } else {
+      let x_160 : i32 = result;
+      switch(x_160) {
+        case 0: {
+          return;
+        }
+        case -1: {
+          let x_161 : i32 = sum;
+          sum = (x_161 + 1);
+        }
+        default: {
+        }
+      }
+    }
+
+    continuing {
+      let x_163 : i32 = target_1;
+      target_1 = (x_163 + 1);
+    }
+  }
+  let x_307 : f32 = x;
+  let x_308 : f32 = y;
+  let x_165 : i32 = sum;
+  a = (x_307 + (x_308 * f32(x_165)));
+  let x_313 : f32 = x_27.injectionSwitch.x;
+  let x_315 : f32 = x_27.injectionSwitch.y;
+  if ((x_313 < x_315)) {
+    x_235 = vec3<f32>(1.0, 0.0, 0.0);
+  } else {
+    let x_320 : f32 = a;
+    param_31 = x_320;
+    let x_321 : vec3<f32> = hueColor_f1_(&(param_31));
+    x_235 = x_321;
+  }
+  let x_322 : vec3<f32> = x_235;
+  x_GLF_color = vec4<f32>(x_322.x, x_322.y, x_322.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
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
new file mode 100644
index 0000000..4e1c940
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,364 @@
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+struct Obj {
+  float odd_numbers[10];
+  float even_numbers[10];
+};
+
+static BST tree_1[10] = (BST[10])0;
+cbuffer cbuffer_x_27 : register(b0, space0) {
+  uint4 x_27[1];
+};
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void makeTreeNode_struct_BST_i1_i1_i11_i1_(inout BST tree, inout int data) {
+  const int x_74 = data;
+  tree.data = x_74;
+  tree.leftIndex = -1;
+  tree.rightIndex = -1;
+  return;
+}
+
+void insert_i1_i1_(inout int treeIndex, inout int data_1) {
+  int baseIndex = 0;
+  BST param = (BST)0;
+  int param_1 = 0;
+  BST param_2 = (BST)0;
+  int param_3 = 0;
+  int GLF_live8i = 0;
+  float GLF_live8A[50] = (float[50])0;
+  baseIndex = 0;
+  while (true) {
+    const int x_75 = baseIndex;
+    const int x_76 = treeIndex;
+    if ((x_75 <= x_76)) {
+    } else {
+      break;
+    }
+    const int x_77 = data_1;
+    const int x_79 = tree_1[baseIndex].data;
+    if ((x_77 <= x_79)) {
+      const int x_81 = tree_1[baseIndex].leftIndex;
+      if ((x_81 == -1)) {
+        const int x_82 = baseIndex;
+        const int x_83 = treeIndex;
+        tree_1[x_82].leftIndex = x_83;
+        const int x_84 = treeIndex;
+        const BST x_350 = tree_1[x_84];
+        param = x_350;
+        const int x_85 = data_1;
+        param_1 = x_85;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(param, param_1);
+        tree_1[x_84] = param;
+        return;
+      } else {
+        const int x_87 = tree_1[baseIndex].leftIndex;
+        baseIndex = x_87;
+        continue;
+      }
+    } else {
+      const int x_89 = tree_1[baseIndex].rightIndex;
+      if ((x_89 == -1)) {
+        const int x_90 = baseIndex;
+        const int x_91 = treeIndex;
+        tree_1[x_90].rightIndex = x_91;
+        const int x_92 = treeIndex;
+        const BST x_362 = tree_1[x_92];
+        param_2 = x_362;
+        const int x_93 = data_1;
+        param_3 = x_93;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(param_2, param_3);
+        tree_1[x_92] = param_2;
+        return;
+      } else {
+        GLF_live8i = 1;
+        bool tint_tmp = (GLF_live8i >= 0);
+        if (tint_tmp) {
+          tint_tmp = (GLF_live8i < 50);
+        }
+        const int x_369 = ((tint_tmp) ? GLF_live8i : 0);
+        const float x_371 = GLF_live8A[0];
+        const float x_373 = GLF_live8A[x_369];
+        GLF_live8A[x_369] = (x_373 + x_371);
+        while (true) {
+          const int x_98 = tree_1[baseIndex].rightIndex;
+          baseIndex = x_98;
+          {
+            const float x_382 = asfloat(x_27[0].x);
+            const float x_384 = asfloat(x_27[0].y);
+            if ((x_382 > x_384)) {
+            } else {
+              break;
+            }
+          }
+        }
+        continue;
+      }
+    }
+  }
+  return;
+}
+
+int search_i1_(inout int target) {
+  int index = 0;
+  BST currentNode = (BST)0;
+  int x_387 = 0;
+  index = 0;
+  while (true) {
+    if ((index != -1)) {
+    } else {
+      break;
+    }
+    const BST x_395 = tree_1[index];
+    currentNode = x_395;
+    const int x_101 = currentNode.data;
+    const int x_102 = target;
+    if ((x_101 == x_102)) {
+      const int x_103 = target;
+      return x_103;
+    }
+    const int x_104 = target;
+    const int x_105 = currentNode.data;
+    if ((x_104 > x_105)) {
+      const int x_106 = currentNode.rightIndex;
+      x_387 = x_106;
+    } else {
+      const int x_107 = currentNode.leftIndex;
+      x_387 = x_107;
+    }
+    index = x_387;
+  }
+  return -1;
+}
+
+float makeFrame_f1_(inout float v) {
+  int param_5 = 0;
+  int param_6 = 0;
+  int param_7 = 0;
+  const float x_418 = v;
+  v = (x_418 * 6.5f);
+  const float x_420 = v;
+  if ((x_420 < 1.5f)) {
+    param_5 = 100;
+    const int x_110 = search_i1_(param_5);
+    return float(x_110);
+  }
+  const float x_425 = v;
+  if ((x_425 < 4.0f)) {
+    return 0.0f;
+  }
+  const float x_429 = v;
+  param_6 = 6;
+  const int x_111 = search_i1_(param_6);
+  if ((x_429 < float(x_111))) {
+    return 1.0f;
+  }
+  param_7 = 30;
+  const int x_112 = search_i1_(param_7);
+  return (10.0f + float(x_112));
+}
+
+float3 hueColor_f1_(inout float angle) {
+  float nodeData = 0.0f;
+  int param_4 = 0;
+  param_4 = 15;
+  const int x_109 = search_i1_(param_4);
+  nodeData = float(x_109);
+  const float x_409 = angle;
+  return ((float3(30.0f, 30.0f, 30.0f) + (float3(1.0f, 5.0f, nodeData) * x_409)) / float3(50.0f, 50.0f, 50.0f));
+}
+
+void main_1() {
+  int treeIndex_1 = 0;
+  BST param_8 = (BST)0;
+  int param_9 = 0;
+  int param_10 = 0;
+  int param_11 = 0;
+  int GLF_live1_looplimiter2 = 0;
+  int GLF_live1i = 0;
+  int param_12 = 0;
+  int param_13 = 0;
+  int param_14 = 0;
+  int param_15 = 0;
+  int param_16 = 0;
+  int param_17 = 0;
+  int param_18 = 0;
+  int param_19 = 0;
+  int param_20 = 0;
+  int param_21 = 0;
+  int param_22 = 0;
+  int param_23 = 0;
+  int GLF_live4_looplimiter3 = 0;
+  int GLF_live4i = 0;
+  int GLF_live4index = 0;
+  Obj GLF_live4obj = (Obj)0;
+  int param_24 = 0;
+  int param_25 = 0;
+  int param_26 = 0;
+  int param_27 = 0;
+  float2 z = float2(0.0f, 0.0f);
+  float x_1 = 0.0f;
+  float param_28 = 0.0f;
+  float y_1 = 0.0f;
+  float param_29 = 0.0f;
+  int sum = 0;
+  int target_1 = 0;
+  int result = 0;
+  int param_30 = 0;
+  float a = 0.0f;
+  float3 x_235 = float3(0.0f, 0.0f, 0.0f);
+  float param_31 = 0.0f;
+  treeIndex_1 = 0;
+  const BST x_237 = tree_1[0];
+  param_8 = x_237;
+  param_9 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(param_8, param_9);
+  tree_1[0] = param_8;
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_10 = treeIndex_1;
+  param_11 = 5;
+  insert_i1_i1_(param_10, param_11);
+  treeIndex_1 = (treeIndex_1 + 1);
+  GLF_live1_looplimiter2 = 0;
+  GLF_live1i = 0;
+  {
+    for(; true; GLF_live1i = (GLF_live1i + 1)) {
+      if ((GLF_live1_looplimiter2 >= 7)) {
+        break;
+      }
+      GLF_live1_looplimiter2 = (GLF_live1_looplimiter2 + 1);
+    }
+  }
+  param_12 = treeIndex_1;
+  param_13 = 12;
+  insert_i1_i1_(param_12, param_13);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_14 = treeIndex_1;
+  param_15 = 15;
+  insert_i1_i1_(param_14, param_15);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_16 = treeIndex_1;
+  param_17 = 7;
+  insert_i1_i1_(param_16, param_17);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_18 = treeIndex_1;
+  param_19 = 8;
+  insert_i1_i1_(param_18, param_19);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_20 = treeIndex_1;
+  param_21 = 2;
+  insert_i1_i1_(param_20, param_21);
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_22 = treeIndex_1;
+  param_23 = 6;
+  insert_i1_i1_(param_22, param_23);
+  treeIndex_1 = (treeIndex_1 + 1);
+  GLF_live4_looplimiter3 = 0;
+  GLF_live4i = 0;
+  {
+    for(; true; GLF_live4i = (GLF_live4i + 1)) {
+      if ((GLF_live4_looplimiter3 >= 3)) {
+        break;
+      }
+      GLF_live4_looplimiter3 = (GLF_live4_looplimiter3 + 1);
+      GLF_live4index = 1;
+      const int x_144 = GLF_live4index;
+      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);
+      }
+      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);
+      }
+      GLF_live4obj.even_numbers[((tint_tmp_2) ? GLF_live4i : 0)] = 1.0f;
+    }
+  }
+  param_24 = treeIndex_1;
+  param_25 = 17;
+  insert_i1_i1_(param_24, param_25);
+  const float x_278 = asfloat(x_27[0].x);
+  const float x_280 = asfloat(x_27[0].y);
+  if ((x_278 > x_280)) {
+    return;
+  }
+  treeIndex_1 = (treeIndex_1 + 1);
+  param_26 = treeIndex_1;
+  param_27 = 13;
+  insert_i1_i1_(param_26, param_27);
+  const float4 x_285 = gl_FragCoord;
+  z = (float2(x_285.y, x_285.x) / float2(256.0f, 256.0f));
+  const float x_289 = z.x;
+  param_28 = x_289;
+  const float x_290 = makeFrame_f1_(param_28);
+  x_1 = x_290;
+  const float x_292 = z.y;
+  param_29 = x_292;
+  const float x_293 = makeFrame_f1_(param_29);
+  y_1 = x_293;
+  sum = -100;
+  target_1 = 0;
+  {
+    for(; (target_1 < 20); target_1 = (target_1 + 1)) {
+      param_30 = target_1;
+      const int x_158 = search_i1_(param_30);
+      result = x_158;
+      if ((result > 0)) {
+      } else {
+        switch(result) {
+          case 0: {
+            return;
+            break;
+          }
+          case -1: {
+            sum = (sum + 1);
+            break;
+          }
+          default: {
+            break;
+          }
+        }
+      }
+    }
+  }
+  a = (x_1 + (y_1 * float(sum)));
+  const float x_313 = asfloat(x_27[0].x);
+  const float x_315 = asfloat(x_27[0].y);
+  if ((x_313 < x_315)) {
+    x_235 = float3(1.0f, 0.0f, 0.0f);
+  } else {
+    param_31 = a;
+    const float3 x_321 = hueColor_f1_(param_31);
+    x_235 = x_321;
+  }
+  const float3 x_322 = x_235;
+  x_GLF_color = float4(x_322.x, x_322.y, x_322.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;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_GLF_color};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..10ddae2
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.wgsl.expected.msl
@@ -0,0 +1,426 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct BST {
+  int data;
+  int leftIndex;
+  int rightIndex;
+};
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct tint_array_wrapper {
+  float arr[10];
+};
+struct Obj {
+  tint_array_wrapper odd_numbers;
+  tint_array_wrapper even_numbers;
+};
+struct tint_array_wrapper_1 {
+  BST arr[10];
+};
+struct tint_array_wrapper_2 {
+  float arr[50];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_2 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void makeTreeNode_struct_BST_i1_i1_i11_i1_(thread BST* const tree, thread int* const data) {
+  int const x_74 = *(data);
+  (*(tree)).data = x_74;
+  (*(tree)).leftIndex = -1;
+  (*(tree)).rightIndex = -1;
+  return;
+}
+
+void insert_i1_i1_(constant buf0& x_27, thread int* const treeIndex, thread int* const data_1, thread tint_array_wrapper_1* const tint_symbol_5) {
+  int baseIndex = 0;
+  BST param = {};
+  int param_1 = 0;
+  BST param_2 = {};
+  int param_3 = 0;
+  int GLF_live8i = 0;
+  tint_array_wrapper_2 GLF_live8A = {};
+  baseIndex = 0;
+  while (true) {
+    int const x_75 = baseIndex;
+    int const x_76 = *(treeIndex);
+    if ((x_75 <= x_76)) {
+    } else {
+      break;
+    }
+    int const x_77 = *(data_1);
+    int const x_78 = baseIndex;
+    int const x_79 = (*(tint_symbol_5)).arr[x_78].data;
+    if ((x_77 <= x_79)) {
+      int const x_80 = baseIndex;
+      int const x_81 = (*(tint_symbol_5)).arr[x_80].leftIndex;
+      if ((x_81 == -1)) {
+        int const x_82 = baseIndex;
+        int const x_83 = *(treeIndex);
+        (*(tint_symbol_5)).arr[x_82].leftIndex = x_83;
+        int const x_84 = *(treeIndex);
+        BST const x_350 = (*(tint_symbol_5)).arr[x_84];
+        param = x_350;
+        int const x_85 = *(data_1);
+        param_1 = x_85;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param), &(param_1));
+        BST const x_352 = param;
+        (*(tint_symbol_5)).arr[x_84] = x_352;
+        return;
+      } else {
+        int const x_86 = baseIndex;
+        int const x_87 = (*(tint_symbol_5)).arr[x_86].leftIndex;
+        baseIndex = x_87;
+        continue;
+      }
+    } else {
+      int const x_88 = baseIndex;
+      int const x_89 = (*(tint_symbol_5)).arr[x_88].rightIndex;
+      if ((x_89 == -1)) {
+        int const x_90 = baseIndex;
+        int const x_91 = *(treeIndex);
+        (*(tint_symbol_5)).arr[x_90].rightIndex = x_91;
+        int const x_92 = *(treeIndex);
+        BST const x_362 = (*(tint_symbol_5)).arr[x_92];
+        param_2 = x_362;
+        int const x_93 = *(data_1);
+        param_3 = x_93;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_2), &(param_3));
+        BST const x_364 = param_2;
+        (*(tint_symbol_5)).arr[x_92] = x_364;
+        return;
+      } else {
+        GLF_live8i = 1;
+        int const x_94 = GLF_live8i;
+        int const x_95 = GLF_live8i;
+        int const x_96 = GLF_live8i;
+        int const x_369 = select(0, x_96, ((x_94 >= 0) && (x_95 < 50)));
+        float const x_371 = GLF_live8A.arr[0];
+        float const x_373 = GLF_live8A.arr[x_369];
+        GLF_live8A.arr[x_369] = (x_373 + x_371);
+        while (true) {
+          int const x_97 = baseIndex;
+          int const x_98 = (*(tint_symbol_5)).arr[x_97].rightIndex;
+          baseIndex = x_98;
+          {
+            float const x_382 = x_27.injectionSwitch.x;
+            float const x_384 = x_27.injectionSwitch.y;
+            if ((x_382 > x_384)) {
+            } else {
+              break;
+            }
+          }
+        }
+        continue;
+      }
+    }
+  }
+  return;
+}
+
+int search_i1_(thread int* const target, thread tint_array_wrapper_1* const tint_symbol_6) {
+  int index = 0;
+  BST currentNode = {};
+  int x_387 = 0;
+  index = 0;
+  while (true) {
+    int const x_99 = index;
+    if ((x_99 != -1)) {
+    } else {
+      break;
+    }
+    int const x_100 = index;
+    BST const x_395 = (*(tint_symbol_6)).arr[x_100];
+    currentNode = x_395;
+    int const x_101 = currentNode.data;
+    int const x_102 = *(target);
+    if ((x_101 == x_102)) {
+      int const x_103 = *(target);
+      return x_103;
+    }
+    int const x_104 = *(target);
+    int const x_105 = currentNode.data;
+    if ((x_104 > x_105)) {
+      int const x_106 = currentNode.rightIndex;
+      x_387 = x_106;
+    } else {
+      int const x_107 = currentNode.leftIndex;
+      x_387 = x_107;
+    }
+    int const x_108 = x_387;
+    index = x_108;
+  }
+  return -1;
+}
+
+float makeFrame_f1_(thread float* const v, thread tint_array_wrapper_1* const tint_symbol_7) {
+  int param_5 = 0;
+  int param_6 = 0;
+  int param_7 = 0;
+  float const x_418 = *(v);
+  *(v) = (x_418 * 6.5f);
+  float const x_420 = *(v);
+  if ((x_420 < 1.5f)) {
+    param_5 = 100;
+    int const x_110 = search_i1_(&(param_5), tint_symbol_7);
+    return float(x_110);
+  }
+  float const x_425 = *(v);
+  if ((x_425 < 4.0f)) {
+    return 0.0f;
+  }
+  float const x_429 = *(v);
+  param_6 = 6;
+  int const x_111 = search_i1_(&(param_6), tint_symbol_7);
+  if ((x_429 < float(x_111))) {
+    return 1.0f;
+  }
+  param_7 = 30;
+  int const x_112 = search_i1_(&(param_7), tint_symbol_7);
+  return (10.0f + float(x_112));
+}
+
+float3 hueColor_f1_(thread float* const angle, thread tint_array_wrapper_1* const tint_symbol_8) {
+  float nodeData = 0.0f;
+  int param_4 = 0;
+  param_4 = 15;
+  int const x_109 = search_i1_(&(param_4), tint_symbol_8);
+  nodeData = float(x_109);
+  float const x_409 = *(angle);
+  float const x_410 = nodeData;
+  return ((float3(30.0f, 30.0f, 30.0f) + (float3(1.0f, 5.0f, x_410) * x_409)) / float3(50.0f, 50.0f, 50.0f));
+}
+
+void main_1(constant buf0& x_27, thread tint_array_wrapper_1* const tint_symbol_9, thread float4* const tint_symbol_10, thread float4* const tint_symbol_11) {
+  int treeIndex_1 = 0;
+  BST param_8 = {};
+  int param_9 = 0;
+  int param_10 = 0;
+  int param_11 = 0;
+  int GLF_live1_looplimiter2 = 0;
+  int GLF_live1i = 0;
+  int param_12 = 0;
+  int param_13 = 0;
+  int param_14 = 0;
+  int param_15 = 0;
+  int param_16 = 0;
+  int param_17 = 0;
+  int param_18 = 0;
+  int param_19 = 0;
+  int param_20 = 0;
+  int param_21 = 0;
+  int param_22 = 0;
+  int param_23 = 0;
+  int GLF_live4_looplimiter3 = 0;
+  int GLF_live4i = 0;
+  int GLF_live4index = 0;
+  Obj GLF_live4obj = {};
+  int param_24 = 0;
+  int param_25 = 0;
+  int param_26 = 0;
+  int param_27 = 0;
+  float2 z = 0.0f;
+  float x_1 = 0.0f;
+  float param_28 = 0.0f;
+  float y_1 = 0.0f;
+  float param_29 = 0.0f;
+  int sum = 0;
+  int target_1 = 0;
+  int result = 0;
+  int param_30 = 0;
+  float a = 0.0f;
+  float3 x_235 = 0.0f;
+  float param_31 = 0.0f;
+  treeIndex_1 = 0;
+  BST const x_237 = (*(tint_symbol_9)).arr[0];
+  param_8 = x_237;
+  param_9 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_8), &(param_9));
+  BST const x_239 = param_8;
+  (*(tint_symbol_9)).arr[0] = x_239;
+  int const x_113 = treeIndex_1;
+  treeIndex_1 = (x_113 + 1);
+  int const x_115 = treeIndex_1;
+  param_10 = x_115;
+  param_11 = 5;
+  insert_i1_i1_(x_27, &(param_10), &(param_11), tint_symbol_9);
+  int const x_116 = treeIndex_1;
+  treeIndex_1 = (x_116 + 1);
+  GLF_live1_looplimiter2 = 0;
+  GLF_live1i = 0;
+  while (true) {
+    if (true) {
+    } else {
+      break;
+    }
+    int const x_118 = GLF_live1_looplimiter2;
+    if ((x_118 >= 7)) {
+      break;
+    }
+    int const x_119 = GLF_live1_looplimiter2;
+    GLF_live1_looplimiter2 = (x_119 + 1);
+    {
+      int const x_121 = GLF_live1i;
+      GLF_live1i = (x_121 + 1);
+    }
+  }
+  int const x_123 = treeIndex_1;
+  param_12 = x_123;
+  param_13 = 12;
+  insert_i1_i1_(x_27, &(param_12), &(param_13), tint_symbol_9);
+  int const x_124 = treeIndex_1;
+  treeIndex_1 = (x_124 + 1);
+  int const x_126 = treeIndex_1;
+  param_14 = x_126;
+  param_15 = 15;
+  insert_i1_i1_(x_27, &(param_14), &(param_15), tint_symbol_9);
+  int const x_127 = treeIndex_1;
+  treeIndex_1 = (x_127 + 1);
+  int const x_129 = treeIndex_1;
+  param_16 = x_129;
+  param_17 = 7;
+  insert_i1_i1_(x_27, &(param_16), &(param_17), tint_symbol_9);
+  int const x_130 = treeIndex_1;
+  treeIndex_1 = (x_130 + 1);
+  int const x_132 = treeIndex_1;
+  param_18 = x_132;
+  param_19 = 8;
+  insert_i1_i1_(x_27, &(param_18), &(param_19), tint_symbol_9);
+  int const x_133 = treeIndex_1;
+  treeIndex_1 = (x_133 + 1);
+  int const x_135 = treeIndex_1;
+  param_20 = x_135;
+  param_21 = 2;
+  insert_i1_i1_(x_27, &(param_20), &(param_21), tint_symbol_9);
+  int const x_136 = treeIndex_1;
+  treeIndex_1 = (x_136 + 1);
+  int const x_138 = treeIndex_1;
+  param_22 = x_138;
+  param_23 = 6;
+  insert_i1_i1_(x_27, &(param_22), &(param_23), tint_symbol_9);
+  int const x_139 = treeIndex_1;
+  treeIndex_1 = (x_139 + 1);
+  GLF_live4_looplimiter3 = 0;
+  GLF_live4i = 0;
+  while (true) {
+    if (true) {
+    } else {
+      break;
+    }
+    int const x_141 = GLF_live4_looplimiter3;
+    if ((x_141 >= 3)) {
+      break;
+    }
+    int const x_142 = GLF_live4_looplimiter3;
+    GLF_live4_looplimiter3 = (x_142 + 1);
+    GLF_live4index = 1;
+    int const x_144 = GLF_live4index;
+    int const x_145 = GLF_live4index;
+    int const x_146 = GLF_live4index;
+    float const x_269 = GLF_live4obj.even_numbers.arr[1];
+    GLF_live4obj.even_numbers.arr[select(0, x_146, ((x_144 >= 0) && (x_145 < 10)))] = x_269;
+    int const x_147 = GLF_live4i;
+    int const x_148 = GLF_live4i;
+    int const x_149 = GLF_live4i;
+    GLF_live4obj.even_numbers.arr[select(0, x_149, ((x_147 >= 0) && (x_148 < 10)))] = 1.0f;
+    {
+      int const x_150 = GLF_live4i;
+      GLF_live4i = (x_150 + 1);
+    }
+  }
+  int const x_152 = treeIndex_1;
+  param_24 = x_152;
+  param_25 = 17;
+  insert_i1_i1_(x_27, &(param_24), &(param_25), tint_symbol_9);
+  float const x_278 = x_27.injectionSwitch.x;
+  float const x_280 = x_27.injectionSwitch.y;
+  if ((x_278 > x_280)) {
+    return;
+  }
+  int const x_153 = treeIndex_1;
+  treeIndex_1 = (x_153 + 1);
+  int const x_155 = treeIndex_1;
+  param_26 = x_155;
+  param_27 = 13;
+  insert_i1_i1_(x_27, &(param_26), &(param_27), tint_symbol_9);
+  float4 const x_285 = *(tint_symbol_10);
+  z = (float2(x_285.y, x_285.x) / float2(256.0f, 256.0f));
+  float const x_289 = z.x;
+  param_28 = x_289;
+  float const x_290 = makeFrame_f1_(&(param_28), tint_symbol_9);
+  x_1 = x_290;
+  float const x_292 = z.y;
+  param_29 = x_292;
+  float const x_293 = makeFrame_f1_(&(param_29), tint_symbol_9);
+  y_1 = x_293;
+  sum = -100;
+  target_1 = 0;
+  while (true) {
+    int const x_156 = target_1;
+    if ((x_156 < 20)) {
+    } else {
+      break;
+    }
+    int const x_157 = target_1;
+    param_30 = x_157;
+    int const x_158 = search_i1_(&(param_30), tint_symbol_9);
+    result = x_158;
+    int const x_159 = result;
+    if ((x_159 > 0)) {
+    } else {
+      int const x_160 = result;
+      switch(x_160) {
+        case 0: {
+          return;
+          break;
+        }
+        case -1: {
+          int const x_161 = sum;
+          sum = (x_161 + 1);
+          break;
+        }
+        default: {
+          break;
+        }
+      }
+    }
+    {
+      int const x_163 = target_1;
+      target_1 = (x_163 + 1);
+    }
+  }
+  float const x_307 = x_1;
+  float const x_308 = y_1;
+  int const x_165 = sum;
+  a = (x_307 + (x_308 * float(x_165)));
+  float const x_313 = x_27.injectionSwitch.x;
+  float const x_315 = x_27.injectionSwitch.y;
+  if ((x_313 < x_315)) {
+    x_235 = float3(1.0f, 0.0f, 0.0f);
+  } else {
+    float const x_320 = a;
+    param_31 = x_320;
+    float3 const x_321 = hueColor_f1_(&(param_31), tint_symbol_9);
+    x_235 = x_321;
+  }
+  float3 const x_322 = x_235;
+  *(tint_symbol_11) = float4(x_322.x, x_322.y, x_322.z, 1.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_27 [[buffer(0)]]) {
+  thread float4 tint_symbol_12 = 0.0f;
+  thread tint_array_wrapper_1 tint_symbol_13 = {};
+  thread float4 tint_symbol_14 = 0.0f;
+  tint_symbol_12 = gl_FragCoord_param;
+  main_1(x_27, &(tint_symbol_13), &(tint_symbol_12), &(tint_symbol_14));
+  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_14};
+  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..ff48698
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,815 @@
+SKIP: FAILED
+
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 536
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %BST "BST"
+               OpMemberName %BST 0 "data"
+               OpMemberName %BST 1 "leftIndex"
+               OpMemberName %BST 2 "rightIndex"
+               OpName %tree_1 "tree_1"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_27 "x_27"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %makeTreeNode_struct_BST_i1_i1_i11_i1_ "makeTreeNode_struct_BST_i1_i1_i11_i1_"
+               OpName %tree "tree"
+               OpName %data "data"
+               OpName %insert_i1_i1_ "insert_i1_i1_"
+               OpName %treeIndex "treeIndex"
+               OpName %data_1 "data_1"
+               OpName %baseIndex "baseIndex"
+               OpName %param "param"
+               OpName %param_1 "param_1"
+               OpName %param_2 "param_2"
+               OpName %param_3 "param_3"
+               OpName %GLF_live8i "GLF_live8i"
+               OpName %GLF_live8A "GLF_live8A"
+               OpName %search_i1_ "search_i1_"
+               OpName %target "target"
+               OpName %index "index"
+               OpName %currentNode "currentNode"
+               OpName %x_387 "x_387"
+               OpName %makeFrame_f1_ "makeFrame_f1_"
+               OpName %v "v"
+               OpName %param_5 "param_5"
+               OpName %param_6 "param_6"
+               OpName %param_7 "param_7"
+               OpName %hueColor_f1_ "hueColor_f1_"
+               OpName %angle "angle"
+               OpName %nodeData "nodeData"
+               OpName %param_4 "param_4"
+               OpName %main_1 "main_1"
+               OpName %treeIndex_1 "treeIndex_1"
+               OpName %param_8 "param_8"
+               OpName %param_9 "param_9"
+               OpName %param_10 "param_10"
+               OpName %param_11 "param_11"
+               OpName %GLF_live1_looplimiter2 "GLF_live1_looplimiter2"
+               OpName %GLF_live1i "GLF_live1i"
+               OpName %param_12 "param_12"
+               OpName %param_13 "param_13"
+               OpName %param_14 "param_14"
+               OpName %param_15 "param_15"
+               OpName %param_16 "param_16"
+               OpName %param_17 "param_17"
+               OpName %param_18 "param_18"
+               OpName %param_19 "param_19"
+               OpName %param_20 "param_20"
+               OpName %param_21 "param_21"
+               OpName %param_22 "param_22"
+               OpName %param_23 "param_23"
+               OpName %GLF_live4_looplimiter3 "GLF_live4_looplimiter3"
+               OpName %GLF_live4i "GLF_live4i"
+               OpName %GLF_live4index "GLF_live4index"
+               OpName %Obj "Obj"
+               OpMemberName %Obj 0 "odd_numbers"
+               OpMemberName %Obj 1 "even_numbers"
+               OpName %GLF_live4obj "GLF_live4obj"
+               OpName %param_24 "param_24"
+               OpName %param_25 "param_25"
+               OpName %param_26 "param_26"
+               OpName %param_27 "param_27"
+               OpName %z "z"
+               OpName %x "x"
+               OpName %param_28 "param_28"
+               OpName %y "y"
+               OpName %param_29 "param_29"
+               OpName %sum "sum"
+               OpName %target_1 "target_1"
+               OpName %result "result"
+               OpName %param_30 "param_30"
+               OpName %a "a"
+               OpName %x_235 "x_235"
+               OpName %param_31 "param_31"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpMemberDecorate %BST 0 Offset 0
+               OpMemberDecorate %BST 1 Offset 4
+               OpMemberDecorate %BST 2 Offset 8
+               OpDecorate %_arr_BST_uint_10 ArrayStride 12
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_27 NonWritable
+               OpDecorate %x_27 DescriptorSet 0
+               OpDecorate %x_27 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %_arr_float_uint_50 ArrayStride 4
+               OpMemberDecorate %Obj 0 Offset 0
+               OpDecorate %_arr_float_uint_10 ArrayStride 4
+               OpMemberDecorate %Obj 1 Offset 40
+               OpMemberDecorate %main_out 0 Offset 0
+        %int = OpTypeInt 32 1
+        %BST = OpTypeStruct %int %int %int
+       %uint = OpTypeInt 32 0
+    %uint_10 = OpConstant %uint 10
+%_arr_BST_uint_10 = OpTypeArray %BST %uint_10
+%_ptr_Private__arr_BST_uint_10 = OpTypePointer Private %_arr_BST_uint_10
+          %8 = OpConstantNull %_arr_BST_uint_10
+     %tree_1 = OpVariable %_ptr_Private__arr_BST_uint_10 Private %8
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+       %x_27 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %17
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+%_ptr_Function_BST = OpTypePointer Function %BST
+%_ptr_Function_int = OpTypePointer Function %int
+         %23 = OpTypeFunction %void %_ptr_Function_BST %_ptr_Function_int
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+     %int_n1 = OpConstant %int -1
+     %uint_2 = OpConstant %uint 2
+         %43 = OpTypeFunction %void %_ptr_Function_int %_ptr_Function_int
+         %49 = OpConstantNull %int
+         %51 = OpConstantNull %BST
+    %uint_50 = OpConstant %uint 50
+%_arr_float_uint_50 = OpTypeArray %float %uint_50
+%_ptr_Function__arr_float_uint_50 = OpTypePointer Function %_arr_float_uint_50
+         %60 = OpConstantNull %_arr_float_uint_50
+      %int_0 = OpConstant %int 0
+       %bool = OpTypeBool
+%_ptr_Private_int = OpTypePointer Private %int
+%_ptr_Private_BST = OpTypePointer Private %BST
+      %int_1 = OpConstant %int 1
+     %int_50 = OpConstant %int 50
+%_ptr_Function_float = OpTypePointer Function %float
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+        %166 = OpTypeFunction %int %_ptr_Function_int
+        %207 = OpTypeFunction %float %_ptr_Function_float
+  %float_6_5 = OpConstant %float 6.5
+  %float_1_5 = OpConstant %float 1.5
+    %int_100 = OpConstant %int 100
+    %float_4 = OpConstant %float 4
+    %float_0 = OpConstant %float 0
+      %int_6 = OpConstant %int 6
+    %float_1 = OpConstant %float 1
+     %int_30 = OpConstant %int 30
+   %float_10 = OpConstant %float 10
+    %v3float = OpTypeVector %float 3
+        %252 = OpTypeFunction %v3float %_ptr_Function_float
+        %258 = OpConstantNull %float
+     %int_15 = OpConstant %int 15
+   %float_30 = OpConstant %float 30
+        %268 = OpConstantComposite %v3float %float_30 %float_30 %float_30
+    %float_5 = OpConstant %float 5
+   %float_50 = OpConstant %float 50
+        %274 = OpConstantComposite %v3float %float_50 %float_50 %float_50
+        %276 = OpTypeFunction %void
+%_arr_float_uint_10 = OpTypeArray %float %uint_10
+        %Obj = OpTypeStruct %_arr_float_uint_10 %_arr_float_uint_10
+%_ptr_Function_Obj = OpTypePointer Function %Obj
+        %305 = OpConstantNull %Obj
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+        %312 = OpConstantNull %v2float
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+        %324 = OpConstantNull %v3float
+      %int_9 = OpConstant %int 9
+      %int_5 = OpConstant %int 5
+       %true = OpConstantTrue %bool
+      %int_7 = OpConstant %int 7
+     %int_12 = OpConstant %int 12
+      %int_8 = OpConstant %int 8
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+     %int_10 = OpConstant %int 10
+     %int_17 = OpConstant %int 17
+     %int_13 = OpConstant %int 13
+  %float_256 = OpConstant %float 256
+        %462 = OpConstantComposite %v2float %float_256 %float_256
+   %int_n100 = OpConstant %int -100
+     %int_20 = OpConstant %int 20
+        %514 = OpConstantComposite %v3float %float_1 %float_0 %float_0
+   %main_out = OpTypeStruct %v4float
+        %523 = OpTypeFunction %void %main_out
+%makeTreeNode_struct_BST_i1_i1_i11_i1_ = OpFunction %void None %23
+       %tree = OpFunctionParameter %_ptr_Function_BST
+       %data = OpFunctionParameter %_ptr_Function_int
+         %30 = OpLabel
+         %32 = OpLoad %int %data
+         %35 = OpAccessChain %_ptr_Function_int %tree %uint_0
+               OpStore %35 %32
+         %38 = OpAccessChain %_ptr_Function_int %tree %uint_1
+               OpStore %38 %int_n1
+         %42 = OpAccessChain %_ptr_Function_int %tree %uint_2
+               OpStore %42 %int_n1
+               OpReturn
+               OpFunctionEnd
+%insert_i1_i1_ = OpFunction %void None %43
+  %treeIndex = OpFunctionParameter %_ptr_Function_int
+     %data_1 = OpFunctionParameter %_ptr_Function_int
+         %47 = OpLabel
+  %baseIndex = OpVariable %_ptr_Function_int Function %49
+      %param = OpVariable %_ptr_Function_BST Function %51
+    %param_1 = OpVariable %_ptr_Function_int Function %49
+    %param_2 = OpVariable %_ptr_Function_BST Function %51
+    %param_3 = OpVariable %_ptr_Function_int Function %49
+ %GLF_live8i = OpVariable %_ptr_Function_int Function %49
+ %GLF_live8A = OpVariable %_ptr_Function__arr_float_uint_50 Function %60
+               OpStore %baseIndex %int_0
+               OpBranch %62
+         %62 = OpLabel
+               OpLoopMerge %63 %64 None
+               OpBranch %65
+         %65 = OpLabel
+         %66 = OpLoad %int %baseIndex
+         %68 = OpLoad %int %treeIndex
+         %69 = OpSLessThanEqual %bool %66 %68
+               OpSelectionMerge %71 None
+               OpBranchConditional %69 %72 %73
+         %72 = OpLabel
+               OpBranch %71
+         %73 = OpLabel
+               OpBranch %63
+         %71 = OpLabel
+         %75 = OpLoad %int %data_1
+         %76 = OpLoad %int %baseIndex
+         %78 = OpAccessChain %_ptr_Private_int %tree_1 %76 %uint_0
+         %79 = OpLoad %int %78
+         %80 = OpSLessThanEqual %bool %75 %79
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %83
+         %82 = OpLabel
+         %84 = OpLoad %int %baseIndex
+         %85 = OpAccessChain %_ptr_Private_int %tree_1 %84 %uint_1
+         %86 = OpLoad %int %85
+         %87 = OpIEqual %bool %86 %int_n1
+               OpSelectionMerge %88 None
+               OpBranchConditional %87 %89 %90
+         %89 = OpLabel
+         %91 = OpLoad %int %baseIndex
+         %93 = OpLoad %int %treeIndex
+         %94 = OpAccessChain %_ptr_Private_int %tree_1 %91 %uint_1
+               OpStore %94 %93
+         %96 = OpLoad %int %treeIndex
+         %98 = OpAccessChain %_ptr_Private_BST %tree_1 %96
+         %99 = OpLoad %BST %98
+               OpStore %param %99
+        %101 = OpLoad %int %data_1
+               OpStore %param_1 %101
+        %102 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param %param_1
+        %105 = OpLoad %BST %param
+        %106 = OpAccessChain %_ptr_Private_BST %tree_1 %96
+               OpStore %106 %105
+               OpReturn
+         %90 = OpLabel
+        %107 = OpLoad %int %baseIndex
+        %108 = OpAccessChain %_ptr_Private_int %tree_1 %107 %uint_1
+        %109 = OpLoad %int %108
+               OpStore %baseIndex %109
+               OpBranch %64
+         %88 = OpLabel
+               OpBranch %81
+         %83 = OpLabel
+        %110 = OpLoad %int %baseIndex
+        %111 = OpAccessChain %_ptr_Private_int %tree_1 %110 %uint_2
+        %112 = OpLoad %int %111
+        %113 = OpIEqual %bool %112 %int_n1
+               OpSelectionMerge %114 None
+               OpBranchConditional %113 %115 %116
+        %115 = OpLabel
+        %117 = OpLoad %int %baseIndex
+        %119 = OpLoad %int %treeIndex
+        %120 = OpAccessChain %_ptr_Private_int %tree_1 %117 %uint_2
+               OpStore %120 %119
+        %122 = OpLoad %int %treeIndex
+        %123 = OpAccessChain %_ptr_Private_BST %tree_1 %122
+        %124 = OpLoad %BST %123
+               OpStore %param_2 %124
+        %126 = OpLoad %int %data_1
+               OpStore %param_3 %126
+        %127 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param_2 %param_3
+        %130 = OpLoad %BST %param_2
+        %131 = OpAccessChain %_ptr_Private_BST %tree_1 %122
+               OpStore %131 %130
+               OpReturn
+        %116 = OpLabel
+               OpStore %GLF_live8i %int_1
+        %133 = OpLoad %int %GLF_live8i
+        %134 = OpLoad %int %GLF_live8i
+        %135 = OpLoad %int %GLF_live8i
+        %137 = OpSGreaterThanEqual %bool %133 %int_0
+               OpSelectionMerge %138 None
+               OpBranchConditional %137 %139 %138
+        %139 = OpLabel
+        %141 = OpSLessThan %bool %134 %int_50
+               OpBranch %138
+        %138 = OpLabel
+        %142 = OpPhi %bool %137 %116 %141 %139
+        %136 = OpSelect %int %142 %135 %int_0
+        %144 = OpAccessChain %_ptr_Function_float %GLF_live8A %int_0
+        %145 = OpLoad %float %144
+        %146 = OpAccessChain %_ptr_Function_float %GLF_live8A %136
+        %147 = OpLoad %float %146
+        %148 = OpAccessChain %_ptr_Function_float %GLF_live8A %136
+        %149 = OpFAdd %float %147 %145
+               OpStore %148 %149
+               OpBranch %150
+        %150 = OpLabel
+               OpLoopMerge %151 %152 None
+               OpBranch %153
+        %153 = OpLabel
+        %154 = OpLoad %int %baseIndex
+        %155 = OpAccessChain %_ptr_Private_int %tree_1 %154 %uint_2
+        %156 = OpLoad %int %155
+               OpStore %baseIndex %156
+               OpBranch %152
+        %152 = OpLabel
+        %158 = OpAccessChain %_ptr_Uniform_float %x_27 %uint_0 %uint_0
+        %159 = OpLoad %float %158
+        %160 = OpAccessChain %_ptr_Uniform_float %x_27 %uint_0 %uint_1
+        %161 = OpLoad %float %160
+        %162 = OpFOrdGreaterThan %bool %159 %161
+               OpSelectionMerge %163 None
+               OpBranchConditional %162 %164 %165
+        %164 = OpLabel
+               OpBranch %163
+        %165 = OpLabel
+               OpBranch %151
+        %163 = OpLabel
+               OpBranch %150
+        %151 = OpLabel
+               OpBranch %64
+        %114 = OpLabel
+               OpBranch %81
+         %81 = OpLabel
+               OpBranch %64
+         %64 = OpLabel
+               OpBranch %62
+         %63 = OpLabel
+               OpReturn
+               OpFunctionEnd
+ %search_i1_ = OpFunction %int None %166
+     %target = OpFunctionParameter %_ptr_Function_int
+        %169 = OpLabel
+      %index = OpVariable %_ptr_Function_int Function %49
+%currentNode = OpVariable %_ptr_Function_BST Function %51
+      %x_387 = OpVariable %_ptr_Function_int Function %49
+               OpStore %index %int_0
+               OpBranch %173
+        %173 = OpLabel
+               OpLoopMerge %174 %175 None
+               OpBranch %176
+        %176 = OpLabel
+        %177 = OpLoad %int %index
+        %178 = OpINotEqual %bool %177 %int_n1
+               OpSelectionMerge %179 None
+               OpBranchConditional %178 %180 %181
+        %180 = OpLabel
+               OpBranch %179
+        %181 = OpLabel
+               OpBranch %174
+        %179 = OpLabel
+        %182 = OpLoad %int %index
+        %183 = OpAccessChain %_ptr_Private_BST %tree_1 %182
+        %184 = OpLoad %BST %183
+               OpStore %currentNode %184
+        %185 = OpAccessChain %_ptr_Function_int %currentNode %uint_0
+        %186 = OpLoad %int %185
+        %188 = OpLoad %int %target
+        %189 = OpIEqual %bool %186 %188
+               OpSelectionMerge %190 None
+               OpBranchConditional %189 %191 %190
+        %191 = OpLabel
+        %193 = OpLoad %int %target
+               OpReturnValue %193
+        %190 = OpLabel
+        %195 = OpLoad %int %target
+        %196 = OpAccessChain %_ptr_Function_int %currentNode %uint_0
+        %197 = OpLoad %int %196
+        %198 = OpSGreaterThan %bool %195 %197
+               OpSelectionMerge %199 None
+               OpBranchConditional %198 %200 %201
+        %200 = OpLabel
+        %202 = OpAccessChain %_ptr_Function_int %currentNode %uint_2
+        %203 = OpLoad %int %202
+               OpStore %x_387 %203
+               OpBranch %199
+        %201 = OpLabel
+        %204 = OpAccessChain %_ptr_Function_int %currentNode %uint_1
+        %205 = OpLoad %int %204
+               OpStore %x_387 %205
+               OpBranch %199
+        %199 = OpLabel
+        %206 = OpLoad %int %x_387
+               OpStore %index %206
+               OpBranch %175
+        %175 = OpLabel
+               OpBranch %173
+        %174 = OpLabel
+               OpReturnValue %int_n1
+               OpFunctionEnd
+%makeFrame_f1_ = OpFunction %float None %207
+          %v = OpFunctionParameter %_ptr_Function_float
+        %210 = OpLabel
+    %param_5 = OpVariable %_ptr_Function_int Function %49
+    %param_6 = OpVariable %_ptr_Function_int Function %49
+    %param_7 = OpVariable %_ptr_Function_int Function %49
+        %215 = OpLoad %float %v
+        %218 = OpFMul %float %215 %float_6_5
+               OpStore %v %218
+        %220 = OpLoad %float %v
+        %222 = OpFOrdLessThan %bool %220 %float_1_5
+               OpSelectionMerge %223 None
+               OpBranchConditional %222 %224 %223
+        %224 = OpLabel
+               OpStore %param_5 %int_100
+        %226 = OpFunctionCall %int %search_i1_ %param_5
+        %228 = OpConvertSToF %float %226
+               OpReturnValue %228
+        %223 = OpLabel
+        %230 = OpLoad %float %v
+        %232 = OpFOrdLessThan %bool %230 %float_4
+               OpSelectionMerge %233 None
+               OpBranchConditional %232 %234 %233
+        %234 = OpLabel
+               OpReturnValue %float_0
+        %233 = OpLabel
+        %237 = OpLoad %float %v
+               OpStore %param_6 %int_6
+        %239 = OpFunctionCall %int %search_i1_ %param_6
+        %241 = OpConvertSToF %float %239
+        %242 = OpFOrdLessThan %bool %237 %241
+               OpSelectionMerge %243 None
+               OpBranchConditional %242 %244 %243
+        %244 = OpLabel
+               OpReturnValue %float_1
+        %243 = OpLabel
+               OpStore %param_7 %int_30
+        %247 = OpFunctionCall %int %search_i1_ %param_7
+        %250 = OpConvertSToF %float %247
+        %251 = OpFAdd %float %float_10 %250
+               OpReturnValue %251
+               OpFunctionEnd
+%hueColor_f1_ = OpFunction %v3float None %252
+      %angle = OpFunctionParameter %_ptr_Function_float
+        %256 = OpLabel
+   %nodeData = OpVariable %_ptr_Function_float Function %258
+    %param_4 = OpVariable %_ptr_Function_int Function %49
+               OpStore %param_4 %int_15
+        %261 = OpFunctionCall %int %search_i1_ %param_4
+        %263 = OpConvertSToF %float %261
+               OpStore %nodeData %263
+        %265 = OpLoad %float %angle
+        %266 = OpLoad %float %nodeData
+        %270 = OpCompositeConstruct %v3float %float_1 %float_5 %266
+        %271 = OpVectorTimesScalar %v3float %270 %265
+        %272 = OpFAdd %v3float %268 %271
+        %275 = OpFDiv %v3float %272 %274
+               OpReturnValue %275
+               OpFunctionEnd
+     %main_1 = OpFunction %void None %276
+        %278 = OpLabel
+%treeIndex_1 = OpVariable %_ptr_Function_int Function %49
+    %param_8 = OpVariable %_ptr_Function_BST Function %51
+    %param_9 = OpVariable %_ptr_Function_int Function %49
+   %param_10 = OpVariable %_ptr_Function_int Function %49
+   %param_11 = OpVariable %_ptr_Function_int Function %49
+%GLF_live1_looplimiter2 = OpVariable %_ptr_Function_int Function %49
+ %GLF_live1i = OpVariable %_ptr_Function_int Function %49
+   %param_12 = OpVariable %_ptr_Function_int Function %49
+   %param_13 = OpVariable %_ptr_Function_int Function %49
+   %param_14 = OpVariable %_ptr_Function_int Function %49
+   %param_15 = OpVariable %_ptr_Function_int Function %49
+   %param_16 = OpVariable %_ptr_Function_int Function %49
+   %param_17 = OpVariable %_ptr_Function_int Function %49
+   %param_18 = OpVariable %_ptr_Function_int Function %49
+   %param_19 = OpVariable %_ptr_Function_int Function %49
+   %param_20 = OpVariable %_ptr_Function_int Function %49
+   %param_21 = OpVariable %_ptr_Function_int Function %49
+   %param_22 = OpVariable %_ptr_Function_int Function %49
+   %param_23 = OpVariable %_ptr_Function_int Function %49
+%GLF_live4_looplimiter3 = OpVariable %_ptr_Function_int Function %49
+ %GLF_live4i = OpVariable %_ptr_Function_int Function %49
+%GLF_live4index = OpVariable %_ptr_Function_int Function %49
+%GLF_live4obj = OpVariable %_ptr_Function_Obj Function %305
+   %param_24 = OpVariable %_ptr_Function_int Function %49
+   %param_25 = OpVariable %_ptr_Function_int Function %49
+   %param_26 = OpVariable %_ptr_Function_int Function %49
+   %param_27 = OpVariable %_ptr_Function_int Function %49
+          %z = OpVariable %_ptr_Function_v2float Function %312
+          %x = OpVariable %_ptr_Function_float Function %258
+   %param_28 = OpVariable %_ptr_Function_float Function %258
+          %y = OpVariable %_ptr_Function_float Function %258
+   %param_29 = OpVariable %_ptr_Function_float Function %258
+        %sum = OpVariable %_ptr_Function_int Function %49
+   %target_1 = OpVariable %_ptr_Function_int Function %49
+     %result = OpVariable %_ptr_Function_int Function %49
+   %param_30 = OpVariable %_ptr_Function_int Function %49
+          %a = OpVariable %_ptr_Function_float Function %258
+      %x_235 = OpVariable %_ptr_Function_v3float Function %324
+   %param_31 = OpVariable %_ptr_Function_float Function %258
+               OpStore %treeIndex_1 %int_0
+        %326 = OpAccessChain %_ptr_Private_BST %tree_1 %int_0
+        %327 = OpLoad %BST %326
+               OpStore %param_8 %327
+               OpStore %param_9 %int_9
+        %329 = OpFunctionCall %void %makeTreeNode_struct_BST_i1_i1_i11_i1_ %param_8 %param_9
+        %332 = OpLoad %BST %param_8
+        %333 = OpAccessChain %_ptr_Private_BST %tree_1 %int_0
+               OpStore %333 %332
+        %334 = OpLoad %int %treeIndex_1
+        %335 = OpIAdd %int %334 %int_1
+               OpStore %treeIndex_1 %335
+        %336 = OpLoad %int %treeIndex_1
+               OpStore %param_10 %336
+               OpStore %param_11 %int_5
+        %338 = OpFunctionCall %void %insert_i1_i1_ %param_10 %param_11
+        %341 = OpLoad %int %treeIndex_1
+        %342 = OpIAdd %int %341 %int_1
+               OpStore %treeIndex_1 %342
+               OpStore %GLF_live1_looplimiter2 %int_0
+               OpStore %GLF_live1i %int_0
+               OpBranch %343
+        %343 = OpLabel
+               OpLoopMerge %344 %345 None
+               OpBranch %346
+        %346 = OpLabel
+               OpSelectionMerge %348 None
+               OpBranchConditional %true %349 %350
+        %349 = OpLabel
+               OpBranch %348
+        %350 = OpLabel
+               OpBranch %344
+        %348 = OpLabel
+        %351 = OpLoad %int %GLF_live1_looplimiter2
+        %353 = OpSGreaterThanEqual %bool %351 %int_7
+               OpSelectionMerge %354 None
+               OpBranchConditional %353 %355 %354
+        %355 = OpLabel
+               OpBranch %344
+        %354 = OpLabel
+        %356 = OpLoad %int %GLF_live1_looplimiter2
+        %357 = OpIAdd %int %356 %int_1
+               OpStore %GLF_live1_looplimiter2 %357
+               OpBranch %345
+        %345 = OpLabel
+        %358 = OpLoad %int %GLF_live1i
+        %359 = OpIAdd %int %358 %int_1
+               OpStore %GLF_live1i %359
+               OpBranch %343
+        %344 = OpLabel
+        %360 = OpLoad %int %treeIndex_1
+               OpStore %param_12 %360
+               OpStore %param_13 %int_12
+        %362 = OpFunctionCall %void %insert_i1_i1_ %param_12 %param_13
+        %365 = OpLoad %int %treeIndex_1
+        %366 = OpIAdd %int %365 %int_1
+               OpStore %treeIndex_1 %366
+        %367 = OpLoad %int %treeIndex_1
+               OpStore %param_14 %367
+               OpStore %param_15 %int_15
+        %368 = OpFunctionCall %void %insert_i1_i1_ %param_14 %param_15
+        %371 = OpLoad %int %treeIndex_1
+        %372 = OpIAdd %int %371 %int_1
+               OpStore %treeIndex_1 %372
+        %373 = OpLoad %int %treeIndex_1
+               OpStore %param_16 %373
+               OpStore %param_17 %int_7
+        %374 = OpFunctionCall %void %insert_i1_i1_ %param_16 %param_17
+        %377 = OpLoad %int %treeIndex_1
+        %378 = OpIAdd %int %377 %int_1
+               OpStore %treeIndex_1 %378
+        %379 = OpLoad %int %treeIndex_1
+               OpStore %param_18 %379
+               OpStore %param_19 %int_8
+        %381 = OpFunctionCall %void %insert_i1_i1_ %param_18 %param_19
+        %384 = OpLoad %int %treeIndex_1
+        %385 = OpIAdd %int %384 %int_1
+               OpStore %treeIndex_1 %385
+        %386 = OpLoad %int %treeIndex_1
+               OpStore %param_20 %386
+               OpStore %param_21 %int_2
+        %388 = OpFunctionCall %void %insert_i1_i1_ %param_20 %param_21
+        %391 = OpLoad %int %treeIndex_1
+        %392 = OpIAdd %int %391 %int_1
+               OpStore %treeIndex_1 %392
+        %393 = OpLoad %int %treeIndex_1
+               OpStore %param_22 %393
+               OpStore %param_23 %int_6
+        %394 = OpFunctionCall %void %insert_i1_i1_ %param_22 %param_23
+        %397 = OpLoad %int %treeIndex_1
+        %398 = OpIAdd %int %397 %int_1
+               OpStore %treeIndex_1 %398
+               OpStore %GLF_live4_looplimiter3 %int_0
+               OpStore %GLF_live4i %int_0
+               OpBranch %399
+        %399 = OpLabel
+               OpLoopMerge %400 %401 None
+               OpBranch %402
+        %402 = OpLabel
+               OpSelectionMerge %403 None
+               OpBranchConditional %true %404 %405
+        %404 = OpLabel
+               OpBranch %403
+        %405 = OpLabel
+               OpBranch %400
+        %403 = OpLabel
+        %406 = OpLoad %int %GLF_live4_looplimiter3
+        %408 = OpSGreaterThanEqual %bool %406 %int_3
+               OpSelectionMerge %409 None
+               OpBranchConditional %408 %410 %409
+        %410 = OpLabel
+               OpBranch %400
+        %409 = OpLabel
+        %411 = OpLoad %int %GLF_live4_looplimiter3
+        %412 = OpIAdd %int %411 %int_1
+               OpStore %GLF_live4_looplimiter3 %412
+               OpStore %GLF_live4index %int_1
+        %413 = OpLoad %int %GLF_live4index
+        %414 = OpLoad %int %GLF_live4index
+        %415 = OpLoad %int %GLF_live4index
+        %416 = OpAccessChain %_ptr_Function_float %GLF_live4obj %uint_1 %int_1
+        %417 = OpLoad %float %416
+        %419 = OpSGreaterThanEqual %bool %413 %int_0
+               OpSelectionMerge %420 None
+               OpBranchConditional %419 %421 %420
+        %421 = OpLabel
+        %423 = OpSLessThan %bool %414 %int_10
+               OpBranch %420
+        %420 = OpLabel
+        %424 = OpPhi %bool %419 %409 %423 %421
+        %418 = OpSelect %int %424 %415 %int_0
+        %425 = OpAccessChain %_ptr_Function_float %GLF_live4obj %uint_1 %418
+               OpStore %425 %417
+        %426 = OpLoad %int %GLF_live4i
+        %427 = OpLoad %int %GLF_live4i
+        %428 = OpLoad %int %GLF_live4i
+        %430 = OpSGreaterThanEqual %bool %426 %int_0
+               OpSelectionMerge %431 None
+               OpBranchConditional %430 %432 %431
+        %432 = OpLabel
+        %433 = OpSLessThan %bool %427 %int_10
+               OpBranch %431
+        %431 = OpLabel
+        %434 = OpPhi %bool %430 %420 %433 %432
+        %429 = OpSelect %int %434 %428 %int_0
+        %435 = OpAccessChain %_ptr_Function_float %GLF_live4obj %uint_1 %429
+               OpStore %435 %float_1
+               OpBranch %401
+        %401 = OpLabel
+        %436 = OpLoad %int %GLF_live4i
+        %437 = OpIAdd %int %436 %int_1
+               OpStore %GLF_live4i %437
+               OpBranch %399
+        %400 = OpLabel
+        %438 = OpLoad %int %treeIndex_1
+               OpStore %param_24 %438
+               OpStore %param_25 %int_17
+        %440 = OpFunctionCall %void %insert_i1_i1_ %param_24 %param_25
+        %443 = OpAccessChain %_ptr_Uniform_float %x_27 %uint_0 %uint_0
+        %444 = OpLoad %float %443
+        %445 = OpAccessChain %_ptr_Uniform_float %x_27 %uint_0 %uint_1
+        %446 = OpLoad %float %445
+        %447 = OpFOrdGreaterThan %bool %444 %446
+               OpSelectionMerge %448 None
+               OpBranchConditional %447 %449 %448
+        %449 = OpLabel
+               OpReturn
+        %448 = OpLabel
+        %450 = OpLoad %int %treeIndex_1
+        %451 = OpIAdd %int %450 %int_1
+               OpStore %treeIndex_1 %451
+        %452 = OpLoad %int %treeIndex_1
+               OpStore %param_26 %452
+               OpStore %param_27 %int_13
+        %454 = OpFunctionCall %void %insert_i1_i1_ %param_26 %param_27
+        %457 = OpLoad %v4float %gl_FragCoord
+        %458 = OpCompositeExtract %float %457 1
+        %459 = OpCompositeExtract %float %457 0
+        %460 = OpCompositeConstruct %v2float %458 %459
+        %463 = OpFDiv %v2float %460 %462
+               OpStore %z %463
+        %464 = OpAccessChain %_ptr_Function_float %z %uint_0
+        %465 = OpLoad %float %464
+               OpStore %param_28 %465
+        %466 = OpFunctionCall %float %makeFrame_f1_ %param_28
+               OpStore %x %466
+        %468 = OpAccessChain %_ptr_Function_float %z %uint_1
+        %469 = OpLoad %float %468
+               OpStore %param_29 %469
+        %470 = OpFunctionCall %float %makeFrame_f1_ %param_29
+               OpStore %y %470
+               OpStore %sum %int_n100
+               OpStore %target_1 %int_0
+               OpBranch %473
+        %473 = OpLabel
+               OpLoopMerge %474 %475 None
+               OpBranch %476
+        %476 = OpLabel
+        %477 = OpLoad %int %target_1
+        %479 = OpSLessThan %bool %477 %int_20
+               OpSelectionMerge %480 None
+               OpBranchConditional %479 %481 %482
+        %481 = OpLabel
+               OpBranch %480
+        %482 = OpLabel
+               OpBranch %474
+        %480 = OpLabel
+        %483 = OpLoad %int %target_1
+               OpStore %param_30 %483
+        %484 = OpFunctionCall %int %search_i1_ %param_30
+               OpStore %result %484
+        %486 = OpLoad %int %result
+        %487 = OpSGreaterThan %bool %486 %int_0
+               OpSelectionMerge %488 None
+               OpBranchConditional %487 %489 %490
+        %489 = OpLabel
+               OpBranch %488
+        %490 = OpLabel
+        %491 = OpLoad %int %result
+               OpSelectionMerge %492 None
+               OpSwitch %491 %493 0 %494 -1 %495
+        %494 = OpLabel
+               OpReturn
+        %495 = OpLabel
+        %496 = OpLoad %int %sum
+        %497 = OpIAdd %int %496 %int_1
+               OpStore %sum %497
+               OpBranch %492
+        %493 = OpLabel
+               OpBranch %492
+        %492 = OpLabel
+               OpBranch %488
+        %488 = OpLabel
+               OpBranch %475
+        %475 = OpLabel
+        %498 = OpLoad %int %target_1
+        %499 = OpIAdd %int %498 %int_1
+               OpStore %target_1 %499
+               OpBranch %473
+        %474 = OpLabel
+        %500 = OpLoad %float %x
+        %501 = OpLoad %float %y
+        %502 = OpLoad %int %sum
+        %503 = OpConvertSToF %float %502
+        %504 = OpFMul %float %501 %503
+        %505 = OpFAdd %float %500 %504
+               OpStore %a %505
+        %506 = OpAccessChain %_ptr_Uniform_float %x_27 %uint_0 %uint_0
+        %507 = OpLoad %float %506
+        %508 = OpAccessChain %_ptr_Uniform_float %x_27 %uint_0 %uint_1
+        %509 = OpLoad %float %508
+        %510 = OpFOrdLessThan %bool %507 %509
+               OpSelectionMerge %511 None
+               OpBranchConditional %510 %512 %513
+        %512 = OpLabel
+               OpStore %x_235 %514
+               OpBranch %511
+        %513 = OpLabel
+        %515 = OpLoad %float %a
+               OpStore %param_31 %515
+        %516 = OpFunctionCall %v3float %hueColor_f1_ %param_31
+               OpStore %x_235 %516
+               OpBranch %511
+        %511 = OpLabel
+        %518 = OpLoad %v3float %x_235
+        %519 = OpCompositeExtract %float %518 0
+        %520 = OpCompositeExtract %float %518 1
+        %521 = OpCompositeExtract %float %518 2
+        %522 = OpCompositeConstruct %v4float %519 %520 %521 %float_1
+               OpStore %x_GLF_color %522
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %523
+%tint_symbol_1 = OpFunctionParameter %main_out
+        %527 = OpLabel
+        %528 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %528
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %276
+        %530 = OpLabel
+        %531 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %531
+        %532 = OpFunctionCall %void %main_1
+        %534 = OpLoad %v4float %x_GLF_color
+        %535 = OpCompositeConstruct %main_out %534
+        %533 = OpFunctionCall %void %tint_symbol_3 %535
+               OpReturn
+               OpFunctionEnd
+1:1: The continue construct with the continue target 152[%152] is not post dominated by the back-edge block 163[%163]
+  %163 = OpLabel
+
diff --git a/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..eaa0aec
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,420 @@
+struct BST {
+  data : i32;
+  leftIndex : i32;
+  rightIndex : i32;
+};
+
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+struct Obj {
+  odd_numbers : array<f32, 10>;
+  even_numbers : array<f32, 10>;
+};
+
+var<private> tree_1 : array<BST, 10>;
+
+[[group(0), binding(0)]] var<uniform> x_27 : buf0;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn makeTreeNode_struct_BST_i1_i1_i11_i1_(tree : ptr<function, BST>, data : ptr<function, i32>) {
+  let x_74 : i32 = *(data);
+  (*(tree)).data = x_74;
+  (*(tree)).leftIndex = -1;
+  (*(tree)).rightIndex = -1;
+  return;
+}
+
+fn insert_i1_i1_(treeIndex : ptr<function, i32>, data_1 : ptr<function, i32>) {
+  var baseIndex : i32;
+  var param : BST;
+  var param_1 : i32;
+  var param_2 : BST;
+  var param_3 : i32;
+  var GLF_live8i : i32;
+  var GLF_live8A : array<f32, 50>;
+  baseIndex = 0;
+  loop {
+    let x_75 : i32 = baseIndex;
+    let x_76 : i32 = *(treeIndex);
+    if ((x_75 <= x_76)) {
+    } else {
+      break;
+    }
+    let x_77 : i32 = *(data_1);
+    let x_78 : i32 = baseIndex;
+    let x_79 : i32 = tree_1[x_78].data;
+    if ((x_77 <= x_79)) {
+      let x_80 : i32 = baseIndex;
+      let x_81 : i32 = tree_1[x_80].leftIndex;
+      if ((x_81 == -1)) {
+        let x_82 : i32 = baseIndex;
+        let x_83 : i32 = *(treeIndex);
+        tree_1[x_82].leftIndex = x_83;
+        let x_84 : i32 = *(treeIndex);
+        let x_350 : BST = tree_1[x_84];
+        param = x_350;
+        let x_85 : i32 = *(data_1);
+        param_1 = x_85;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param), &(param_1));
+        let x_352 : BST = param;
+        tree_1[x_84] = x_352;
+        return;
+      } else {
+        let x_86 : i32 = baseIndex;
+        let x_87 : i32 = tree_1[x_86].leftIndex;
+        baseIndex = x_87;
+        continue;
+      }
+    } else {
+      let x_88 : i32 = baseIndex;
+      let x_89 : i32 = tree_1[x_88].rightIndex;
+      if ((x_89 == -1)) {
+        let x_90 : i32 = baseIndex;
+        let x_91 : i32 = *(treeIndex);
+        tree_1[x_90].rightIndex = x_91;
+        let x_92 : i32 = *(treeIndex);
+        let x_362 : BST = tree_1[x_92];
+        param_2 = x_362;
+        let x_93 : i32 = *(data_1);
+        param_3 = x_93;
+        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_2), &(param_3));
+        let x_364 : BST = param_2;
+        tree_1[x_92] = x_364;
+        return;
+      } else {
+        GLF_live8i = 1;
+        let x_94 : i32 = GLF_live8i;
+        let x_95 : i32 = GLF_live8i;
+        let x_96 : i32 = GLF_live8i;
+        let x_369 : i32 = select(0, x_96, ((x_94 >= 0) && (x_95 < 50)));
+        let x_371 : f32 = GLF_live8A[0];
+        let x_373 : f32 = GLF_live8A[x_369];
+        GLF_live8A[x_369] = (x_373 + x_371);
+        loop {
+          let x_97 : i32 = baseIndex;
+          let x_98 : i32 = tree_1[x_97].rightIndex;
+          baseIndex = x_98;
+
+          continuing {
+            let x_382 : f32 = x_27.injectionSwitch.x;
+            let x_384 : f32 = x_27.injectionSwitch.y;
+            if ((x_382 > x_384)) {
+            } else {
+              break;
+            }
+          }
+        }
+        continue;
+      }
+    }
+  }
+  return;
+}
+
+fn search_i1_(target : ptr<function, i32>) -> i32 {
+  var index : i32;
+  var currentNode : BST;
+  var x_387 : i32;
+  index = 0;
+  loop {
+    let x_99 : i32 = index;
+    if ((x_99 != -1)) {
+    } else {
+      break;
+    }
+    let x_100 : i32 = index;
+    let x_395 : BST = tree_1[x_100];
+    currentNode = x_395;
+    let x_101 : i32 = currentNode.data;
+    let x_102 : i32 = *(target);
+    if ((x_101 == x_102)) {
+      let x_103 : i32 = *(target);
+      return x_103;
+    }
+    let x_104 : i32 = *(target);
+    let x_105 : i32 = currentNode.data;
+    if ((x_104 > x_105)) {
+      let x_106 : i32 = currentNode.rightIndex;
+      x_387 = x_106;
+    } else {
+      let x_107 : i32 = currentNode.leftIndex;
+      x_387 = x_107;
+    }
+    let x_108 : i32 = x_387;
+    index = x_108;
+  }
+  return -1;
+}
+
+fn makeFrame_f1_(v : ptr<function, f32>) -> f32 {
+  var param_5 : i32;
+  var param_6 : i32;
+  var param_7 : i32;
+  let x_418 : f32 = *(v);
+  *(v) = (x_418 * 6.5);
+  let x_420 : f32 = *(v);
+  if ((x_420 < 1.5)) {
+    param_5 = 100;
+    let x_110 : i32 = search_i1_(&(param_5));
+    return f32(x_110);
+  }
+  let x_425 : f32 = *(v);
+  if ((x_425 < 4.0)) {
+    return 0.0;
+  }
+  let x_429 : f32 = *(v);
+  param_6 = 6;
+  let x_111 : i32 = search_i1_(&(param_6));
+  if ((x_429 < f32(x_111))) {
+    return 1.0;
+  }
+  param_7 = 30;
+  let x_112 : i32 = search_i1_(&(param_7));
+  return (10.0 + f32(x_112));
+}
+
+fn hueColor_f1_(angle : ptr<function, f32>) -> vec3<f32> {
+  var nodeData : f32;
+  var param_4 : i32;
+  param_4 = 15;
+  let x_109 : i32 = search_i1_(&(param_4));
+  nodeData = f32(x_109);
+  let x_409 : f32 = *(angle);
+  let x_410 : f32 = nodeData;
+  return ((vec3<f32>(30.0, 30.0, 30.0) + (vec3<f32>(1.0, 5.0, x_410) * x_409)) / vec3<f32>(50.0, 50.0, 50.0));
+}
+
+fn main_1() {
+  var treeIndex_1 : i32;
+  var param_8 : BST;
+  var param_9 : i32;
+  var param_10 : i32;
+  var param_11 : i32;
+  var GLF_live1_looplimiter2 : i32;
+  var GLF_live1i : i32;
+  var param_12 : i32;
+  var param_13 : i32;
+  var param_14 : i32;
+  var param_15 : i32;
+  var param_16 : i32;
+  var param_17 : i32;
+  var param_18 : i32;
+  var param_19 : i32;
+  var param_20 : i32;
+  var param_21 : i32;
+  var param_22 : i32;
+  var param_23 : i32;
+  var GLF_live4_looplimiter3 : i32;
+  var GLF_live4i : i32;
+  var GLF_live4index : i32;
+  var GLF_live4obj : Obj;
+  var param_24 : i32;
+  var param_25 : i32;
+  var param_26 : i32;
+  var param_27 : i32;
+  var z : vec2<f32>;
+  var x : f32;
+  var param_28 : f32;
+  var y : f32;
+  var param_29 : f32;
+  var sum : i32;
+  var target_1 : i32;
+  var result : i32;
+  var param_30 : i32;
+  var a : f32;
+  var x_235 : vec3<f32>;
+  var param_31 : f32;
+  treeIndex_1 = 0;
+  let x_237 : BST = tree_1[0];
+  param_8 = x_237;
+  param_9 = 9;
+  makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_8), &(param_9));
+  let x_239 : BST = param_8;
+  tree_1[0] = x_239;
+  let x_113 : i32 = treeIndex_1;
+  treeIndex_1 = (x_113 + 1);
+  let x_115 : i32 = treeIndex_1;
+  param_10 = x_115;
+  param_11 = 5;
+  insert_i1_i1_(&(param_10), &(param_11));
+  let x_116 : i32 = treeIndex_1;
+  treeIndex_1 = (x_116 + 1);
+  GLF_live1_looplimiter2 = 0;
+  GLF_live1i = 0;
+  loop {
+    if (true) {
+    } else {
+      break;
+    }
+    let x_118 : i32 = GLF_live1_looplimiter2;
+    if ((x_118 >= 7)) {
+      break;
+    }
+    let x_119 : i32 = GLF_live1_looplimiter2;
+    GLF_live1_looplimiter2 = (x_119 + 1);
+
+    continuing {
+      let x_121 : i32 = GLF_live1i;
+      GLF_live1i = (x_121 + 1);
+    }
+  }
+  let x_123 : i32 = treeIndex_1;
+  param_12 = x_123;
+  param_13 = 12;
+  insert_i1_i1_(&(param_12), &(param_13));
+  let x_124 : i32 = treeIndex_1;
+  treeIndex_1 = (x_124 + 1);
+  let x_126 : i32 = treeIndex_1;
+  param_14 = x_126;
+  param_15 = 15;
+  insert_i1_i1_(&(param_14), &(param_15));
+  let x_127 : i32 = treeIndex_1;
+  treeIndex_1 = (x_127 + 1);
+  let x_129 : i32 = treeIndex_1;
+  param_16 = x_129;
+  param_17 = 7;
+  insert_i1_i1_(&(param_16), &(param_17));
+  let x_130 : i32 = treeIndex_1;
+  treeIndex_1 = (x_130 + 1);
+  let x_132 : i32 = treeIndex_1;
+  param_18 = x_132;
+  param_19 = 8;
+  insert_i1_i1_(&(param_18), &(param_19));
+  let x_133 : i32 = treeIndex_1;
+  treeIndex_1 = (x_133 + 1);
+  let x_135 : i32 = treeIndex_1;
+  param_20 = x_135;
+  param_21 = 2;
+  insert_i1_i1_(&(param_20), &(param_21));
+  let x_136 : i32 = treeIndex_1;
+  treeIndex_1 = (x_136 + 1);
+  let x_138 : i32 = treeIndex_1;
+  param_22 = x_138;
+  param_23 = 6;
+  insert_i1_i1_(&(param_22), &(param_23));
+  let x_139 : i32 = treeIndex_1;
+  treeIndex_1 = (x_139 + 1);
+  GLF_live4_looplimiter3 = 0;
+  GLF_live4i = 0;
+  loop {
+    if (true) {
+    } else {
+      break;
+    }
+    let x_141 : i32 = GLF_live4_looplimiter3;
+    if ((x_141 >= 3)) {
+      break;
+    }
+    let x_142 : i32 = GLF_live4_looplimiter3;
+    GLF_live4_looplimiter3 = (x_142 + 1);
+    GLF_live4index = 1;
+    let x_144 : i32 = GLF_live4index;
+    let x_145 : i32 = GLF_live4index;
+    let x_146 : i32 = GLF_live4index;
+    let x_269 : f32 = GLF_live4obj.even_numbers[1];
+    GLF_live4obj.even_numbers[select(0, x_146, ((x_144 >= 0) && (x_145 < 10)))] = x_269;
+    let x_147 : i32 = GLF_live4i;
+    let x_148 : i32 = GLF_live4i;
+    let x_149 : i32 = GLF_live4i;
+    GLF_live4obj.even_numbers[select(0, x_149, ((x_147 >= 0) && (x_148 < 10)))] = 1.0;
+
+    continuing {
+      let x_150 : i32 = GLF_live4i;
+      GLF_live4i = (x_150 + 1);
+    }
+  }
+  let x_152 : i32 = treeIndex_1;
+  param_24 = x_152;
+  param_25 = 17;
+  insert_i1_i1_(&(param_24), &(param_25));
+  let x_278 : f32 = x_27.injectionSwitch.x;
+  let x_280 : f32 = x_27.injectionSwitch.y;
+  if ((x_278 > x_280)) {
+    return;
+  }
+  let x_153 : i32 = treeIndex_1;
+  treeIndex_1 = (x_153 + 1);
+  let x_155 : i32 = treeIndex_1;
+  param_26 = x_155;
+  param_27 = 13;
+  insert_i1_i1_(&(param_26), &(param_27));
+  let x_285 : vec4<f32> = gl_FragCoord;
+  z = (vec2<f32>(x_285.y, x_285.x) / vec2<f32>(256.0, 256.0));
+  let x_289 : f32 = z.x;
+  param_28 = x_289;
+  let x_290 : f32 = makeFrame_f1_(&(param_28));
+  x = x_290;
+  let x_292 : f32 = z.y;
+  param_29 = x_292;
+  let x_293 : f32 = makeFrame_f1_(&(param_29));
+  y = x_293;
+  sum = -100;
+  target_1 = 0;
+  loop {
+    let x_156 : i32 = target_1;
+    if ((x_156 < 20)) {
+    } else {
+      break;
+    }
+    let x_157 : i32 = target_1;
+    param_30 = x_157;
+    let x_158 : i32 = search_i1_(&(param_30));
+    result = x_158;
+    let x_159 : i32 = result;
+    if ((x_159 > 0)) {
+    } else {
+      let x_160 : i32 = result;
+      switch(x_160) {
+        case 0: {
+          return;
+        }
+        case -1: {
+          let x_161 : i32 = sum;
+          sum = (x_161 + 1);
+        }
+        default: {
+        }
+      }
+    }
+
+    continuing {
+      let x_163 : i32 = target_1;
+      target_1 = (x_163 + 1);
+    }
+  }
+  let x_307 : f32 = x;
+  let x_308 : f32 = y;
+  let x_165 : i32 = sum;
+  a = (x_307 + (x_308 * f32(x_165)));
+  let x_313 : f32 = x_27.injectionSwitch.x;
+  let x_315 : f32 = x_27.injectionSwitch.y;
+  if ((x_313 < x_315)) {
+    x_235 = vec3<f32>(1.0, 0.0, 0.0);
+  } else {
+    let x_320 : f32 = a;
+    param_31 = x_320;
+    let x_321 : vec3<f32> = hueColor_f1_(&(param_31));
+    x_235 = x_321;
+  }
+  let x_322 : vec3<f32> = x_235;
+  x_GLF_color = vec4<f32>(x_322.x, x_322.y, x_322.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/write-red-in-loop-nest/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/write-red-in-loop-nest/0-opt.spvasm
new file mode 100644
index 0000000..553996a
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/write-red-in-loop-nest/0-opt.spvasm
@@ -0,0 +1,213 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %m43 "m43"
+               OpName %ll1 "ll1"
+               OpName %rows "rows"
+               OpName %_GLF_color "_GLF_color"
+               OpName %ll4 "ll4"
+               OpName %ll2 "ll2"
+               OpName %c "c"
+               OpName %tempm43 "tempm43"
+               OpName %ll3 "ll3"
+               OpName %d "d"
+               OpName %r "r"
+               OpName %sums "sums"
+               OpName %idx "idx"
+               OpDecorate %ll1 RelaxedPrecision
+               OpDecorate %rows RelaxedPrecision
+               OpDecorate %_GLF_color Location 0
+               OpDecorate %16 RelaxedPrecision
+               OpDecorate %17 RelaxedPrecision
+               OpDecorate %18 RelaxedPrecision
+               OpDecorate %ll4 RelaxedPrecision
+               OpDecorate %ll2 RelaxedPrecision
+               OpDecorate %c RelaxedPrecision
+               OpDecorate %19 RelaxedPrecision
+               OpDecorate %20 RelaxedPrecision
+               OpDecorate %21 RelaxedPrecision
+               OpDecorate %22 RelaxedPrecision
+               OpDecorate %ll3 RelaxedPrecision
+               OpDecorate %d RelaxedPrecision
+               OpDecorate %23 RelaxedPrecision
+               OpDecorate %24 RelaxedPrecision
+               OpDecorate %25 RelaxedPrecision
+               OpDecorate %26 RelaxedPrecision
+               OpDecorate %r RelaxedPrecision
+               OpDecorate %27 RelaxedPrecision
+               OpDecorate %28 RelaxedPrecision
+               OpDecorate %29 RelaxedPrecision
+               OpDecorate %30 RelaxedPrecision
+               OpDecorate %31 RelaxedPrecision
+               OpDecorate %idx RelaxedPrecision
+               OpDecorate %32 RelaxedPrecision
+               OpDecorate %33 RelaxedPrecision
+               OpDecorate %34 RelaxedPrecision
+               OpDecorate %35 RelaxedPrecision
+               OpDecorate %36 RelaxedPrecision
+               OpDecorate %37 RelaxedPrecision
+               OpDecorate %38 RelaxedPrecision
+               OpDecorate %39 RelaxedPrecision
+       %void = OpTypeVoid
+         %41 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+%mat4v3float = OpTypeMatrix %v3float 4
+%_ptr_Function_mat4v3float = OpTypePointer Function %mat4v3float
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %48 = OpConstantComposite %v3float %float_1 %float_0 %float_0
+         %49 = OpConstantComposite %v3float %float_0 %float_1 %float_0
+         %50 = OpConstantComposite %v3float %float_0 %float_0 %float_1
+         %51 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+         %52 = OpConstantComposite %mat4v3float %48 %49 %50 %51
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+         %61 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %int_5 = OpConstant %int 5
+      %int_1 = OpConstant %int 1
+     %int_10 = OpConstant %int 10
+      %int_4 = OpConstant %int 4
+      %int_3 = OpConstant %int 3
+%_ptr_Function_float = OpTypePointer Function %float
+       %uint = OpTypeInt 32 0
+     %uint_9 = OpConstant %uint 9
+%_arr_float_uint_9 = OpTypeArray %float %uint_9
+%_ptr_Function__arr_float_uint_9 = OpTypePointer Function %_arr_float_uint_9
+      %int_9 = OpConstant %int 9
+     %uint_1 = OpConstant %uint 1
+       %main = OpFunction %void None %41
+         %74 = OpLabel
+        %m43 = OpVariable %_ptr_Function_mat4v3float Function
+        %ll1 = OpVariable %_ptr_Function_int Function
+       %rows = OpVariable %_ptr_Function_int Function
+        %ll4 = OpVariable %_ptr_Function_int Function
+        %ll2 = OpVariable %_ptr_Function_int Function
+          %c = OpVariable %_ptr_Function_int Function
+    %tempm43 = OpVariable %_ptr_Function_mat4v3float Function
+        %ll3 = OpVariable %_ptr_Function_int Function
+          %d = OpVariable %_ptr_Function_int Function
+          %r = OpVariable %_ptr_Function_int Function
+       %sums = OpVariable %_ptr_Function__arr_float_uint_9 Function
+        %idx = OpVariable %_ptr_Function_int Function
+               OpStore %m43 %52
+               OpStore %ll1 %int_0
+               OpStore %rows %int_2
+               OpBranch %75
+         %75 = OpLabel
+               OpLoopMerge %76 %77 None
+               OpBranch %78
+         %78 = OpLabel
+               OpBranchConditional %true %79 %76
+         %79 = OpLabel
+               OpStore %_GLF_color %61
+         %16 = OpLoad %int %ll1
+         %80 = OpSGreaterThanEqual %bool %16 %int_5
+               OpSelectionMerge %81 None
+               OpBranchConditional %80 %82 %81
+         %82 = OpLabel
+               OpBranch %76
+         %81 = OpLabel
+         %17 = OpLoad %int %ll1
+         %18 = OpIAdd %int %17 %int_1
+               OpStore %ll1 %18
+               OpStore %ll4 %int_10
+               OpStore %ll2 %int_0
+               OpStore %c %int_0
+               OpBranch %83
+         %83 = OpLabel
+               OpLoopMerge %84 %85 None
+               OpBranch %86
+         %86 = OpLabel
+         %19 = OpLoad %int %c
+         %87 = OpSLessThan %bool %19 %int_1
+               OpBranchConditional %87 %88 %84
+         %88 = OpLabel
+         %20 = OpLoad %int %ll2
+         %89 = OpSGreaterThanEqual %bool %20 %int_0
+               OpSelectionMerge %90 None
+               OpBranchConditional %89 %91 %90
+         %91 = OpLabel
+               OpBranch %84
+         %90 = OpLabel
+         %21 = OpLoad %int %ll2
+         %22 = OpIAdd %int %21 %int_1
+               OpStore %ll2 %22
+         %92 = OpLoad %mat4v3float %m43
+               OpStore %tempm43 %92
+               OpStore %ll3 %int_0
+               OpStore %d %int_0
+               OpBranch %93
+         %93 = OpLabel
+               OpLoopMerge %94 %95 None
+               OpBranch %96
+         %96 = OpLabel
+         %23 = OpLoad %int %ll4
+         %97 = OpSLessThan %bool %int_1 %23
+               OpBranchConditional %97 %98 %94
+         %98 = OpLabel
+         %24 = OpLoad %int %d
+         %99 = OpSGreaterThanEqual %bool %24 %int_0
+         %25 = OpLoad %int %d
+        %100 = OpSLessThan %bool %25 %int_4
+        %101 = OpLogicalAnd %bool %99 %100
+         %26 = OpLoad %int %d
+        %102 = OpSelect %int %101 %26 %int_0
+         %27 = OpLoad %int %r
+        %103 = OpSGreaterThanEqual %bool %27 %int_0
+         %28 = OpLoad %int %r
+        %104 = OpSLessThan %bool %28 %int_3
+        %105 = OpLogicalAnd %bool %103 %104
+         %29 = OpLoad %int %r
+        %106 = OpSelect %int %105 %29 %int_0
+        %107 = OpAccessChain %_ptr_Function_float %tempm43 %102 %106
+               OpStore %107 %float_1
+               OpBranch %95
+         %95 = OpLabel
+         %30 = OpLoad %int %d
+         %31 = OpIAdd %int %30 %int_1
+               OpStore %d %31
+               OpBranch %93
+         %94 = OpLabel
+         %32 = OpLoad %int %idx
+        %108 = OpSGreaterThanEqual %bool %32 %int_0
+         %33 = OpLoad %int %idx
+        %109 = OpSLessThan %bool %33 %int_9
+        %110 = OpLogicalAnd %bool %108 %109
+         %34 = OpLoad %int %idx
+        %111 = OpSelect %int %110 %34 %int_0
+         %35 = OpLoad %int %c
+        %112 = OpAccessChain %_ptr_Function_float %m43 %35 %uint_1
+        %113 = OpLoad %float %112
+        %114 = OpAccessChain %_ptr_Function_float %sums %111
+        %115 = OpLoad %float %114
+        %116 = OpFAdd %float %115 %113
+        %117 = OpAccessChain %_ptr_Function_float %sums %111
+               OpStore %117 %116
+               OpBranch %85
+         %85 = OpLabel
+         %36 = OpLoad %int %c
+         %37 = OpIAdd %int %36 %int_1
+               OpStore %c %37
+               OpBranch %83
+         %84 = OpLabel
+         %38 = OpLoad %int %idx
+         %39 = OpIAdd %int %38 %int_1
+               OpStore %idx %39
+               OpBranch %77
+         %77 = OpLabel
+               OpBranch %75
+         %76 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/write-red-in-loop-nest/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/write-red-in-loop-nest/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..26a0704
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/write-red-in-loop-nest/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,85 @@
+void set_float3(inout float3 vec, int idx, float val) {
+  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
+}
+
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4x3 m43 = float4x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  int ll1 = 0;
+  int rows = 0;
+  int ll4 = 0;
+  int ll2 = 0;
+  int c = 0;
+  float4x3 tempm43 = float4x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  int ll3 = 0;
+  int d = 0;
+  int r = 0;
+  float sums[9] = (float[9])0;
+  int idx = 0;
+  m43 = float4x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f), float3(0.0f, 0.0f, 0.0f));
+  ll1 = 0;
+  rows = 2;
+  while (true) {
+    if (true) {
+    } else {
+      break;
+    }
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    if ((ll1 >= 5)) {
+      break;
+    }
+    ll1 = (ll1 + 1);
+    ll4 = 10;
+    ll2 = 0;
+    c = 0;
+    {
+      for(; (c < 1); c = (c + 1)) {
+        if ((ll2 >= 0)) {
+          break;
+        }
+        ll2 = (ll2 + 1);
+        tempm43 = m43;
+        ll3 = 0;
+        d = 0;
+        {
+          for(; (1 < ll4); d = (d + 1)) {
+            bool tint_tmp = (d >= 0);
+            if (tint_tmp) {
+              tint_tmp = (d < 4);
+            }
+            bool tint_tmp_1 = (r >= 0);
+            if (tint_tmp_1) {
+              tint_tmp_1 = (r < 3);
+            }
+            set_float3(tempm43[((tint_tmp) ? d : 0)], ((tint_tmp_1) ? r : 0), 1.0f);
+          }
+        }
+        bool tint_tmp_2 = (idx >= 0);
+        if (tint_tmp_2) {
+          tint_tmp_2 = (idx < 9);
+        }
+        const int x_111 = ((tint_tmp_2) ? idx : 0);
+        const float x_113 = m43[c].y;
+        const float x_115 = sums[x_111];
+        sums[x_111] = (x_115 + x_113);
+      }
+    }
+    idx = (idx + 1);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/write-red-in-loop-nest/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/write-red-in-loop-nest/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..2070937
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/write-red-in-loop-nest/0-opt.spvasm.expected.msl
@@ -0,0 +1,105 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  float arr[9];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  float4x3 m43 = float4x3(0.0f);
+  int ll1 = 0;
+  int rows = 0;
+  int ll4 = 0;
+  int ll2 = 0;
+  int c = 0;
+  float4x3 tempm43 = float4x3(0.0f);
+  int ll3 = 0;
+  int d = 0;
+  int r = 0;
+  tint_array_wrapper sums = {};
+  int idx = 0;
+  m43 = float4x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f), float3(0.0f, 0.0f, 0.0f));
+  ll1 = 0;
+  rows = 2;
+  while (true) {
+    if (true) {
+    } else {
+      break;
+    }
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    int const x_16 = ll1;
+    if ((x_16 >= 5)) {
+      break;
+    }
+    int const x_17 = ll1;
+    ll1 = (x_17 + 1);
+    ll4 = 10;
+    ll2 = 0;
+    c = 0;
+    while (true) {
+      int const x_19 = c;
+      if ((x_19 < 1)) {
+      } else {
+        break;
+      }
+      int const x_20 = ll2;
+      if ((x_20 >= 0)) {
+        break;
+      }
+      int const x_21 = ll2;
+      ll2 = (x_21 + 1);
+      float4x3 const x_92 = m43;
+      tempm43 = x_92;
+      ll3 = 0;
+      d = 0;
+      while (true) {
+        int const x_23 = ll4;
+        if ((1 < x_23)) {
+        } else {
+          break;
+        }
+        int const x_24 = d;
+        int const x_25 = d;
+        int const x_26 = d;
+        int const x_27 = r;
+        int const x_28 = r;
+        int const x_29 = r;
+        tempm43[select(0, x_26, ((x_24 >= 0) && (x_25 < 4)))][select(0, x_29, ((x_27 >= 0) && (x_28 < 3)))] = 1.0f;
+        {
+          int const x_30 = d;
+          d = (x_30 + 1);
+        }
+      }
+      int const x_32 = idx;
+      int const x_33 = idx;
+      int const x_34 = idx;
+      int const x_111 = select(0, x_34, ((x_32 >= 0) && (x_33 < 9)));
+      int const x_35 = c;
+      float const x_113 = m43[x_35].y;
+      float const x_115 = sums.arr[x_111];
+      sums.arr[x_111] = (x_115 + x_113);
+      {
+        int const x_36 = c;
+        c = (x_36 + 1);
+      }
+    }
+    int const x_38 = idx;
+    idx = (x_38 + 1);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/write-red-in-loop-nest/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/write-red-in-loop-nest/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..397a1d8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/write-red-in-loop-nest/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,244 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 147
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %m43 "m43"
+               OpName %ll1 "ll1"
+               OpName %rows "rows"
+               OpName %ll4 "ll4"
+               OpName %ll2 "ll2"
+               OpName %c "c"
+               OpName %tempm43 "tempm43"
+               OpName %ll3 "ll3"
+               OpName %d "d"
+               OpName %r "r"
+               OpName %sums "sums"
+               OpName %idx "idx"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_float_uint_9 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+    %v3float = OpTypeVector %float 3
+%mat4v3float = OpTypeMatrix %v3float 4
+%_ptr_Function_mat4v3float = OpTypePointer Function %mat4v3float
+         %16 = OpConstantNull %mat4v3float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %20 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_9 = OpConstant %uint 9
+%_arr_float_uint_9 = OpTypeArray %float %uint_9
+%_ptr_Function__arr_float_uint_9 = OpTypePointer Function %_arr_float_uint_9
+         %34 = OpConstantNull %_arr_float_uint_9
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %38 = OpConstantComposite %v3float %float_1 %float_0 %float_0
+         %39 = OpConstantComposite %v3float %float_0 %float_1 %float_0
+         %40 = OpConstantComposite %v3float %float_0 %float_0 %float_1
+         %41 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+         %42 = OpConstantComposite %mat4v3float %38 %39 %40 %41
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+         %54 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %int_5 = OpConstant %int 5
+      %int_1 = OpConstant %int 1
+     %int_10 = OpConstant %int 10
+      %int_4 = OpConstant %int 4
+      %int_3 = OpConstant %int 3
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_9 = OpConstant %int 9
+     %uint_1 = OpConstant %uint 1
+   %main_out = OpTypeStruct %v4float
+        %135 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+        %m43 = OpVariable %_ptr_Function_mat4v3float Function %16
+        %ll1 = OpVariable %_ptr_Function_int Function %20
+       %rows = OpVariable %_ptr_Function_int Function %20
+        %ll4 = OpVariable %_ptr_Function_int Function %20
+        %ll2 = OpVariable %_ptr_Function_int Function %20
+          %c = OpVariable %_ptr_Function_int Function %20
+    %tempm43 = OpVariable %_ptr_Function_mat4v3float Function %16
+        %ll3 = OpVariable %_ptr_Function_int Function %20
+          %d = OpVariable %_ptr_Function_int Function %20
+          %r = OpVariable %_ptr_Function_int Function %20
+       %sums = OpVariable %_ptr_Function__arr_float_uint_9 Function %34
+        %idx = OpVariable %_ptr_Function_int Function %20
+               OpStore %m43 %42
+               OpStore %ll1 %int_0
+               OpStore %rows %int_2
+               OpBranch %45
+         %45 = OpLabel
+               OpLoopMerge %46 %47 None
+               OpBranch %48
+         %48 = OpLabel
+               OpSelectionMerge %51 None
+               OpBranchConditional %true %52 %53
+         %52 = OpLabel
+               OpBranch %51
+         %53 = OpLabel
+               OpBranch %46
+         %51 = OpLabel
+               OpStore %x_GLF_color %54
+         %55 = OpLoad %int %ll1
+         %57 = OpSGreaterThanEqual %bool %55 %int_5
+               OpSelectionMerge %58 None
+               OpBranchConditional %57 %59 %58
+         %59 = OpLabel
+               OpBranch %46
+         %58 = OpLabel
+         %60 = OpLoad %int %ll1
+         %62 = OpIAdd %int %60 %int_1
+               OpStore %ll1 %62
+               OpStore %ll4 %int_10
+               OpStore %ll2 %int_0
+               OpStore %c %int_0
+               OpBranch %64
+         %64 = OpLabel
+               OpLoopMerge %65 %66 None
+               OpBranch %67
+         %67 = OpLabel
+         %68 = OpLoad %int %c
+         %69 = OpSLessThan %bool %68 %int_1
+               OpSelectionMerge %70 None
+               OpBranchConditional %69 %71 %72
+         %71 = OpLabel
+               OpBranch %70
+         %72 = OpLabel
+               OpBranch %65
+         %70 = OpLabel
+         %73 = OpLoad %int %ll2
+         %74 = OpSGreaterThanEqual %bool %73 %int_0
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %75
+         %76 = OpLabel
+               OpBranch %65
+         %75 = OpLabel
+         %77 = OpLoad %int %ll2
+         %78 = OpIAdd %int %77 %int_1
+               OpStore %ll2 %78
+         %79 = OpLoad %mat4v3float %m43
+               OpStore %tempm43 %79
+               OpStore %ll3 %int_0
+               OpStore %d %int_0
+               OpBranch %80
+         %80 = OpLabel
+               OpLoopMerge %81 %82 None
+               OpBranch %83
+         %83 = OpLabel
+         %84 = OpLoad %int %ll4
+         %85 = OpSLessThan %bool %int_1 %84
+               OpSelectionMerge %86 None
+               OpBranchConditional %85 %87 %88
+         %87 = OpLabel
+               OpBranch %86
+         %88 = OpLabel
+               OpBranch %81
+         %86 = OpLabel
+         %89 = OpLoad %int %d
+         %90 = OpLoad %int %d
+         %91 = OpLoad %int %d
+         %92 = OpLoad %int %r
+         %93 = OpLoad %int %r
+         %94 = OpLoad %int %r
+         %96 = OpSGreaterThanEqual %bool %89 %int_0
+               OpSelectionMerge %97 None
+               OpBranchConditional %96 %98 %97
+         %98 = OpLabel
+        %100 = OpSLessThan %bool %90 %int_4
+               OpBranch %97
+         %97 = OpLabel
+        %101 = OpPhi %bool %96 %86 %100 %98
+         %95 = OpSelect %int %101 %91 %int_0
+        %103 = OpSGreaterThanEqual %bool %92 %int_0
+               OpSelectionMerge %104 None
+               OpBranchConditional %103 %105 %104
+        %105 = OpLabel
+        %107 = OpSLessThan %bool %93 %int_3
+               OpBranch %104
+        %104 = OpLabel
+        %108 = OpPhi %bool %103 %97 %107 %105
+        %102 = OpSelect %int %108 %94 %int_0
+        %110 = OpAccessChain %_ptr_Function_float %tempm43 %95 %102
+               OpStore %110 %float_1
+               OpBranch %82
+         %82 = OpLabel
+        %111 = OpLoad %int %d
+        %112 = OpIAdd %int %111 %int_1
+               OpStore %d %112
+               OpBranch %80
+         %81 = OpLabel
+        %113 = OpLoad %int %idx
+        %114 = OpLoad %int %idx
+        %115 = OpLoad %int %idx
+        %117 = OpSGreaterThanEqual %bool %113 %int_0
+               OpSelectionMerge %118 None
+               OpBranchConditional %117 %119 %118
+        %119 = OpLabel
+        %121 = OpSLessThan %bool %114 %int_9
+               OpBranch %118
+        %118 = OpLabel
+        %122 = OpPhi %bool %117 %81 %121 %119
+        %116 = OpSelect %int %122 %115 %int_0
+        %123 = OpLoad %int %c
+        %125 = OpAccessChain %_ptr_Function_float %m43 %123 %uint_1
+        %126 = OpLoad %float %125
+        %127 = OpAccessChain %_ptr_Function_float %sums %116
+        %128 = OpLoad %float %127
+        %129 = OpAccessChain %_ptr_Function_float %sums %116
+        %130 = OpFAdd %float %128 %126
+               OpStore %129 %130
+               OpBranch %66
+         %66 = OpLabel
+        %131 = OpLoad %int %c
+        %132 = OpIAdd %int %131 %int_1
+               OpStore %c %132
+               OpBranch %64
+         %65 = OpLabel
+        %133 = OpLoad %int %idx
+        %134 = OpIAdd %int %133 %int_1
+               OpStore %idx %134
+               OpBranch %47
+         %47 = OpLabel
+               OpBranch %45
+         %46 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %135
+%tint_symbol = OpFunctionParameter %main_out
+        %139 = OpLabel
+        %140 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %140
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+        %142 = OpLabel
+        %143 = OpFunctionCall %void %main_1
+        %145 = OpLoad %v4float %x_GLF_color
+        %146 = OpCompositeConstruct %main_out %145
+        %144 = OpFunctionCall %void %tint_symbol_2 %146
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/write-red-in-loop-nest/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/write-red-in-loop-nest/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..dd18573
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/write-red-in-loop-nest/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,98 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m43 : mat4x3<f32>;
+  var ll1 : i32;
+  var rows : i32;
+  var ll4 : i32;
+  var ll2 : i32;
+  var c : i32;
+  var tempm43 : mat4x3<f32>;
+  var ll3 : i32;
+  var d : i32;
+  var r : i32;
+  var sums : array<f32, 9>;
+  var idx : i32;
+  m43 = mat4x3<f32>(vec3<f32>(1.0, 0.0, 0.0), vec3<f32>(0.0, 1.0, 0.0), vec3<f32>(0.0, 0.0, 1.0), vec3<f32>(0.0, 0.0, 0.0));
+  ll1 = 0;
+  rows = 2;
+  loop {
+    if (true) {
+    } else {
+      break;
+    }
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    let x_16 : i32 = ll1;
+    if ((x_16 >= 5)) {
+      break;
+    }
+    let x_17 : i32 = ll1;
+    ll1 = (x_17 + 1);
+    ll4 = 10;
+    ll2 = 0;
+    c = 0;
+    loop {
+      let x_19 : i32 = c;
+      if ((x_19 < 1)) {
+      } else {
+        break;
+      }
+      let x_20 : i32 = ll2;
+      if ((x_20 >= 0)) {
+        break;
+      }
+      let x_21 : i32 = ll2;
+      ll2 = (x_21 + 1);
+      let x_92 : mat4x3<f32> = m43;
+      tempm43 = x_92;
+      ll3 = 0;
+      d = 0;
+      loop {
+        let x_23 : i32 = ll4;
+        if ((1 < x_23)) {
+        } else {
+          break;
+        }
+        let x_24 : i32 = d;
+        let x_25 : i32 = d;
+        let x_26 : i32 = d;
+        let x_27 : i32 = r;
+        let x_28 : i32 = r;
+        let x_29 : i32 = r;
+        tempm43[select(0, x_26, ((x_24 >= 0) && (x_25 < 4)))][select(0, x_29, ((x_27 >= 0) && (x_28 < 3)))] = 1.0;
+
+        continuing {
+          let x_30 : i32 = d;
+          d = (x_30 + 1);
+        }
+      }
+      let x_32 : i32 = idx;
+      let x_33 : i32 = idx;
+      let x_34 : i32 = idx;
+      let x_111 : i32 = select(0, x_34, ((x_32 >= 0) && (x_33 < 9)));
+      let x_35 : i32 = c;
+      let x_113 : f32 = m43[x_35].y;
+      let x_115 : f32 = sums[x_111];
+      sums[x_111] = (x_115 + x_113);
+
+      continuing {
+        let x_36 : i32 = c;
+        c = (x_36 + 1);
+      }
+    }
+    let x_38 : i32 = idx;
+    idx = (x_38 + 1);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/write-red-in-loop-nest/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/write-red-in-loop-nest/0-opt.wgsl
new file mode 100644
index 0000000..dd18573
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/write-red-in-loop-nest/0-opt.wgsl
@@ -0,0 +1,98 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m43 : mat4x3<f32>;
+  var ll1 : i32;
+  var rows : i32;
+  var ll4 : i32;
+  var ll2 : i32;
+  var c : i32;
+  var tempm43 : mat4x3<f32>;
+  var ll3 : i32;
+  var d : i32;
+  var r : i32;
+  var sums : array<f32, 9>;
+  var idx : i32;
+  m43 = mat4x3<f32>(vec3<f32>(1.0, 0.0, 0.0), vec3<f32>(0.0, 1.0, 0.0), vec3<f32>(0.0, 0.0, 1.0), vec3<f32>(0.0, 0.0, 0.0));
+  ll1 = 0;
+  rows = 2;
+  loop {
+    if (true) {
+    } else {
+      break;
+    }
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    let x_16 : i32 = ll1;
+    if ((x_16 >= 5)) {
+      break;
+    }
+    let x_17 : i32 = ll1;
+    ll1 = (x_17 + 1);
+    ll4 = 10;
+    ll2 = 0;
+    c = 0;
+    loop {
+      let x_19 : i32 = c;
+      if ((x_19 < 1)) {
+      } else {
+        break;
+      }
+      let x_20 : i32 = ll2;
+      if ((x_20 >= 0)) {
+        break;
+      }
+      let x_21 : i32 = ll2;
+      ll2 = (x_21 + 1);
+      let x_92 : mat4x3<f32> = m43;
+      tempm43 = x_92;
+      ll3 = 0;
+      d = 0;
+      loop {
+        let x_23 : i32 = ll4;
+        if ((1 < x_23)) {
+        } else {
+          break;
+        }
+        let x_24 : i32 = d;
+        let x_25 : i32 = d;
+        let x_26 : i32 = d;
+        let x_27 : i32 = r;
+        let x_28 : i32 = r;
+        let x_29 : i32 = r;
+        tempm43[select(0, x_26, ((x_24 >= 0) && (x_25 < 4)))][select(0, x_29, ((x_27 >= 0) && (x_28 < 3)))] = 1.0;
+
+        continuing {
+          let x_30 : i32 = d;
+          d = (x_30 + 1);
+        }
+      }
+      let x_32 : i32 = idx;
+      let x_33 : i32 = idx;
+      let x_34 : i32 = idx;
+      let x_111 : i32 = select(0, x_34, ((x_32 >= 0) && (x_33 < 9)));
+      let x_35 : i32 = c;
+      let x_113 : f32 = m43[x_35].y;
+      let x_115 : f32 = sums[x_111];
+      sums[x_111] = (x_115 + x_113);
+
+      continuing {
+        let x_36 : i32 = c;
+        c = (x_36 + 1);
+      }
+    }
+    let x_38 : i32 = idx;
+    idx = (x_38 + 1);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/write-red-in-loop-nest/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/write-red-in-loop-nest/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..26a0704
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/write-red-in-loop-nest/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,85 @@
+void set_float3(inout float3 vec, int idx, float val) {
+  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
+}
+
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float4x3 m43 = float4x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  int ll1 = 0;
+  int rows = 0;
+  int ll4 = 0;
+  int ll2 = 0;
+  int c = 0;
+  float4x3 tempm43 = float4x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
+  int ll3 = 0;
+  int d = 0;
+  int r = 0;
+  float sums[9] = (float[9])0;
+  int idx = 0;
+  m43 = float4x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f), float3(0.0f, 0.0f, 0.0f));
+  ll1 = 0;
+  rows = 2;
+  while (true) {
+    if (true) {
+    } else {
+      break;
+    }
+    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    if ((ll1 >= 5)) {
+      break;
+    }
+    ll1 = (ll1 + 1);
+    ll4 = 10;
+    ll2 = 0;
+    c = 0;
+    {
+      for(; (c < 1); c = (c + 1)) {
+        if ((ll2 >= 0)) {
+          break;
+        }
+        ll2 = (ll2 + 1);
+        tempm43 = m43;
+        ll3 = 0;
+        d = 0;
+        {
+          for(; (1 < ll4); d = (d + 1)) {
+            bool tint_tmp = (d >= 0);
+            if (tint_tmp) {
+              tint_tmp = (d < 4);
+            }
+            bool tint_tmp_1 = (r >= 0);
+            if (tint_tmp_1) {
+              tint_tmp_1 = (r < 3);
+            }
+            set_float3(tempm43[((tint_tmp) ? d : 0)], ((tint_tmp_1) ? r : 0), 1.0f);
+          }
+        }
+        bool tint_tmp_2 = (idx >= 0);
+        if (tint_tmp_2) {
+          tint_tmp_2 = (idx < 9);
+        }
+        const int x_111 = ((tint_tmp_2) ? idx : 0);
+        const float x_113 = m43[c].y;
+        const float x_115 = sums[x_111];
+        sums[x_111] = (x_115 + x_113);
+      }
+    }
+    idx = (idx + 1);
+  }
+  return;
+}
+
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol {
+  float4 x_GLF_color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/write-red-in-loop-nest/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/write-red-in-loop-nest/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..2070937
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/write-red-in-loop-nest/0-opt.wgsl.expected.msl
@@ -0,0 +1,105 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  float arr[9];
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  float4x3 m43 = float4x3(0.0f);
+  int ll1 = 0;
+  int rows = 0;
+  int ll4 = 0;
+  int ll2 = 0;
+  int c = 0;
+  float4x3 tempm43 = float4x3(0.0f);
+  int ll3 = 0;
+  int d = 0;
+  int r = 0;
+  tint_array_wrapper sums = {};
+  int idx = 0;
+  m43 = float4x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f), float3(0.0f, 0.0f, 0.0f));
+  ll1 = 0;
+  rows = 2;
+  while (true) {
+    if (true) {
+    } else {
+      break;
+    }
+    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+    int const x_16 = ll1;
+    if ((x_16 >= 5)) {
+      break;
+    }
+    int const x_17 = ll1;
+    ll1 = (x_17 + 1);
+    ll4 = 10;
+    ll2 = 0;
+    c = 0;
+    while (true) {
+      int const x_19 = c;
+      if ((x_19 < 1)) {
+      } else {
+        break;
+      }
+      int const x_20 = ll2;
+      if ((x_20 >= 0)) {
+        break;
+      }
+      int const x_21 = ll2;
+      ll2 = (x_21 + 1);
+      float4x3 const x_92 = m43;
+      tempm43 = x_92;
+      ll3 = 0;
+      d = 0;
+      while (true) {
+        int const x_23 = ll4;
+        if ((1 < x_23)) {
+        } else {
+          break;
+        }
+        int const x_24 = d;
+        int const x_25 = d;
+        int const x_26 = d;
+        int const x_27 = r;
+        int const x_28 = r;
+        int const x_29 = r;
+        tempm43[select(0, x_26, ((x_24 >= 0) && (x_25 < 4)))][select(0, x_29, ((x_27 >= 0) && (x_28 < 3)))] = 1.0f;
+        {
+          int const x_30 = d;
+          d = (x_30 + 1);
+        }
+      }
+      int const x_32 = idx;
+      int const x_33 = idx;
+      int const x_34 = idx;
+      int const x_111 = select(0, x_34, ((x_32 >= 0) && (x_33 < 9)));
+      int const x_35 = c;
+      float const x_113 = m43[x_35].y;
+      float const x_115 = sums.arr[x_111];
+      sums.arr[x_111] = (x_115 + x_113);
+      {
+        int const x_36 = c;
+        c = (x_36 + 1);
+      }
+    }
+    int const x_38 = idx;
+    idx = (x_38 + 1);
+  }
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/write-red-in-loop-nest/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/write-red-in-loop-nest/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..397a1d8
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/write-red-in-loop-nest/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,244 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 147
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %m43 "m43"
+               OpName %ll1 "ll1"
+               OpName %rows "rows"
+               OpName %ll4 "ll4"
+               OpName %ll2 "ll2"
+               OpName %c "c"
+               OpName %tempm43 "tempm43"
+               OpName %ll3 "ll3"
+               OpName %d "d"
+               OpName %r "r"
+               OpName %sums "sums"
+               OpName %idx "idx"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %_arr_float_uint_9 ArrayStride 4
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+    %v3float = OpTypeVector %float 3
+%mat4v3float = OpTypeMatrix %v3float 4
+%_ptr_Function_mat4v3float = OpTypePointer Function %mat4v3float
+         %16 = OpConstantNull %mat4v3float
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+         %20 = OpConstantNull %int
+       %uint = OpTypeInt 32 0
+     %uint_9 = OpConstant %uint 9
+%_arr_float_uint_9 = OpTypeArray %float %uint_9
+%_ptr_Function__arr_float_uint_9 = OpTypePointer Function %_arr_float_uint_9
+         %34 = OpConstantNull %_arr_float_uint_9
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %38 = OpConstantComposite %v3float %float_1 %float_0 %float_0
+         %39 = OpConstantComposite %v3float %float_0 %float_1 %float_0
+         %40 = OpConstantComposite %v3float %float_0 %float_0 %float_1
+         %41 = OpConstantComposite %v3float %float_0 %float_0 %float_0
+         %42 = OpConstantComposite %mat4v3float %38 %39 %40 %41
+      %int_0 = OpConstant %int 0
+      %int_2 = OpConstant %int 2
+       %bool = OpTypeBool
+       %true = OpConstantTrue %bool
+         %54 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+      %int_5 = OpConstant %int 5
+      %int_1 = OpConstant %int 1
+     %int_10 = OpConstant %int 10
+      %int_4 = OpConstant %int 4
+      %int_3 = OpConstant %int 3
+%_ptr_Function_float = OpTypePointer Function %float
+      %int_9 = OpConstant %int 9
+     %uint_1 = OpConstant %uint 1
+   %main_out = OpTypeStruct %v4float
+        %135 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+        %m43 = OpVariable %_ptr_Function_mat4v3float Function %16
+        %ll1 = OpVariable %_ptr_Function_int Function %20
+       %rows = OpVariable %_ptr_Function_int Function %20
+        %ll4 = OpVariable %_ptr_Function_int Function %20
+        %ll2 = OpVariable %_ptr_Function_int Function %20
+          %c = OpVariable %_ptr_Function_int Function %20
+    %tempm43 = OpVariable %_ptr_Function_mat4v3float Function %16
+        %ll3 = OpVariable %_ptr_Function_int Function %20
+          %d = OpVariable %_ptr_Function_int Function %20
+          %r = OpVariable %_ptr_Function_int Function %20
+       %sums = OpVariable %_ptr_Function__arr_float_uint_9 Function %34
+        %idx = OpVariable %_ptr_Function_int Function %20
+               OpStore %m43 %42
+               OpStore %ll1 %int_0
+               OpStore %rows %int_2
+               OpBranch %45
+         %45 = OpLabel
+               OpLoopMerge %46 %47 None
+               OpBranch %48
+         %48 = OpLabel
+               OpSelectionMerge %51 None
+               OpBranchConditional %true %52 %53
+         %52 = OpLabel
+               OpBranch %51
+         %53 = OpLabel
+               OpBranch %46
+         %51 = OpLabel
+               OpStore %x_GLF_color %54
+         %55 = OpLoad %int %ll1
+         %57 = OpSGreaterThanEqual %bool %55 %int_5
+               OpSelectionMerge %58 None
+               OpBranchConditional %57 %59 %58
+         %59 = OpLabel
+               OpBranch %46
+         %58 = OpLabel
+         %60 = OpLoad %int %ll1
+         %62 = OpIAdd %int %60 %int_1
+               OpStore %ll1 %62
+               OpStore %ll4 %int_10
+               OpStore %ll2 %int_0
+               OpStore %c %int_0
+               OpBranch %64
+         %64 = OpLabel
+               OpLoopMerge %65 %66 None
+               OpBranch %67
+         %67 = OpLabel
+         %68 = OpLoad %int %c
+         %69 = OpSLessThan %bool %68 %int_1
+               OpSelectionMerge %70 None
+               OpBranchConditional %69 %71 %72
+         %71 = OpLabel
+               OpBranch %70
+         %72 = OpLabel
+               OpBranch %65
+         %70 = OpLabel
+         %73 = OpLoad %int %ll2
+         %74 = OpSGreaterThanEqual %bool %73 %int_0
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %75
+         %76 = OpLabel
+               OpBranch %65
+         %75 = OpLabel
+         %77 = OpLoad %int %ll2
+         %78 = OpIAdd %int %77 %int_1
+               OpStore %ll2 %78
+         %79 = OpLoad %mat4v3float %m43
+               OpStore %tempm43 %79
+               OpStore %ll3 %int_0
+               OpStore %d %int_0
+               OpBranch %80
+         %80 = OpLabel
+               OpLoopMerge %81 %82 None
+               OpBranch %83
+         %83 = OpLabel
+         %84 = OpLoad %int %ll4
+         %85 = OpSLessThan %bool %int_1 %84
+               OpSelectionMerge %86 None
+               OpBranchConditional %85 %87 %88
+         %87 = OpLabel
+               OpBranch %86
+         %88 = OpLabel
+               OpBranch %81
+         %86 = OpLabel
+         %89 = OpLoad %int %d
+         %90 = OpLoad %int %d
+         %91 = OpLoad %int %d
+         %92 = OpLoad %int %r
+         %93 = OpLoad %int %r
+         %94 = OpLoad %int %r
+         %96 = OpSGreaterThanEqual %bool %89 %int_0
+               OpSelectionMerge %97 None
+               OpBranchConditional %96 %98 %97
+         %98 = OpLabel
+        %100 = OpSLessThan %bool %90 %int_4
+               OpBranch %97
+         %97 = OpLabel
+        %101 = OpPhi %bool %96 %86 %100 %98
+         %95 = OpSelect %int %101 %91 %int_0
+        %103 = OpSGreaterThanEqual %bool %92 %int_0
+               OpSelectionMerge %104 None
+               OpBranchConditional %103 %105 %104
+        %105 = OpLabel
+        %107 = OpSLessThan %bool %93 %int_3
+               OpBranch %104
+        %104 = OpLabel
+        %108 = OpPhi %bool %103 %97 %107 %105
+        %102 = OpSelect %int %108 %94 %int_0
+        %110 = OpAccessChain %_ptr_Function_float %tempm43 %95 %102
+               OpStore %110 %float_1
+               OpBranch %82
+         %82 = OpLabel
+        %111 = OpLoad %int %d
+        %112 = OpIAdd %int %111 %int_1
+               OpStore %d %112
+               OpBranch %80
+         %81 = OpLabel
+        %113 = OpLoad %int %idx
+        %114 = OpLoad %int %idx
+        %115 = OpLoad %int %idx
+        %117 = OpSGreaterThanEqual %bool %113 %int_0
+               OpSelectionMerge %118 None
+               OpBranchConditional %117 %119 %118
+        %119 = OpLabel
+        %121 = OpSLessThan %bool %114 %int_9
+               OpBranch %118
+        %118 = OpLabel
+        %122 = OpPhi %bool %117 %81 %121 %119
+        %116 = OpSelect %int %122 %115 %int_0
+        %123 = OpLoad %int %c
+        %125 = OpAccessChain %_ptr_Function_float %m43 %123 %uint_1
+        %126 = OpLoad %float %125
+        %127 = OpAccessChain %_ptr_Function_float %sums %116
+        %128 = OpLoad %float %127
+        %129 = OpAccessChain %_ptr_Function_float %sums %116
+        %130 = OpFAdd %float %128 %126
+               OpStore %129 %130
+               OpBranch %66
+         %66 = OpLabel
+        %131 = OpLoad %int %c
+        %132 = OpIAdd %int %131 %int_1
+               OpStore %c %132
+               OpBranch %64
+         %65 = OpLabel
+        %133 = OpLoad %int %idx
+        %134 = OpIAdd %int %133 %int_1
+               OpStore %idx %134
+               OpBranch %47
+         %47 = OpLabel
+               OpBranch %45
+         %46 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %135
+%tint_symbol = OpFunctionParameter %main_out
+        %139 = OpLabel
+        %140 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %140
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+        %142 = OpLabel
+        %143 = OpFunctionCall %void %main_1
+        %145 = OpLoad %v4float %x_GLF_color
+        %146 = OpCompositeConstruct %main_out %145
+        %144 = OpFunctionCall %void %tint_symbol_2 %146
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/write-red-in-loop-nest/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/write-red-in-loop-nest/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..dd18573
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/write-red-in-loop-nest/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,98 @@
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var m43 : mat4x3<f32>;
+  var ll1 : i32;
+  var rows : i32;
+  var ll4 : i32;
+  var ll2 : i32;
+  var c : i32;
+  var tempm43 : mat4x3<f32>;
+  var ll3 : i32;
+  var d : i32;
+  var r : i32;
+  var sums : array<f32, 9>;
+  var idx : i32;
+  m43 = mat4x3<f32>(vec3<f32>(1.0, 0.0, 0.0), vec3<f32>(0.0, 1.0, 0.0), vec3<f32>(0.0, 0.0, 1.0), vec3<f32>(0.0, 0.0, 0.0));
+  ll1 = 0;
+  rows = 2;
+  loop {
+    if (true) {
+    } else {
+      break;
+    }
+    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+    let x_16 : i32 = ll1;
+    if ((x_16 >= 5)) {
+      break;
+    }
+    let x_17 : i32 = ll1;
+    ll1 = (x_17 + 1);
+    ll4 = 10;
+    ll2 = 0;
+    c = 0;
+    loop {
+      let x_19 : i32 = c;
+      if ((x_19 < 1)) {
+      } else {
+        break;
+      }
+      let x_20 : i32 = ll2;
+      if ((x_20 >= 0)) {
+        break;
+      }
+      let x_21 : i32 = ll2;
+      ll2 = (x_21 + 1);
+      let x_92 : mat4x3<f32> = m43;
+      tempm43 = x_92;
+      ll3 = 0;
+      d = 0;
+      loop {
+        let x_23 : i32 = ll4;
+        if ((1 < x_23)) {
+        } else {
+          break;
+        }
+        let x_24 : i32 = d;
+        let x_25 : i32 = d;
+        let x_26 : i32 = d;
+        let x_27 : i32 = r;
+        let x_28 : i32 = r;
+        let x_29 : i32 = r;
+        tempm43[select(0, x_26, ((x_24 >= 0) && (x_25 < 4)))][select(0, x_29, ((x_27 >= 0) && (x_28 < 3)))] = 1.0;
+
+        continuing {
+          let x_30 : i32 = d;
+          d = (x_30 + 1);
+        }
+      }
+      let x_32 : i32 = idx;
+      let x_33 : i32 = idx;
+      let x_34 : i32 = idx;
+      let x_111 : i32 = select(0, x_34, ((x_32 >= 0) && (x_33 < 9)));
+      let x_35 : i32 = c;
+      let x_113 : f32 = m43[x_35].y;
+      let x_115 : f32 = sums[x_111];
+      sums[x_111] = (x_115 + x_113);
+
+      continuing {
+        let x_36 : i32 = c;
+        c = (x_36 + 1);
+      }
+    }
+    let x_38 : i32 = idx;
+    idx = (x_38 + 1);
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/wrong-color-in-always-false-if/0-opt.spvasm b/test/vk-gl-cts/graphicsfuzz/wrong-color-in-always-false-if/0-opt.spvasm
new file mode 100644
index 0000000..04eff6c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/wrong-color-in-always-false-if/0-opt.spvasm
@@ -0,0 +1,70 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %_GLF_color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource ESSL 310
+               OpName %main "main"
+               OpName %height "height"
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %_ ""
+               OpName %_GLF_color "_GLF_color"
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %buf0 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 0
+               OpDecorate %_GLF_color Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+%_ptr_Function_float = OpTypePointer Function %float
+  %float_256 = OpConstant %float 256
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+          %_ = OpVariable %_ptr_Uniform_buf0 Uniform
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+ %_GLF_color = OpVariable %_ptr_Output_v4float Output
+%float_30_1800003 = OpConstant %float 30.1800003
+%float_8840 = OpConstant %float 8840.0
+%float_469_970001 = OpConstant %float 469.970001
+%float_18_2399998 = OpConstant %float 18.2399998
+         %27 = OpConstantComposite %v4float %float_30_1800003 %float_8840 %float_469_970001 %float_18_2399998
+%float_9_89999962 = OpConstant %float 9.89999962
+%float_0_100000001 = OpConstant %float 0.100000001
+%float_1169_5387 = OpConstant %float 1169.5387
+%float_55_7900009 = OpConstant %float 55.7900009
+         %32 = OpConstantComposite %v4float %float_9_89999962 %float_0_100000001 %float_1169_5387 %float_55_7900009
+%float_7612_94531 = OpConstant %float 7612.94531
+%float_797_010986 = OpConstant %float 797.010986
+    %float_9 = OpConstant %float 9
+    %float_1 = OpConstant %float 1
+         %37 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+       %main = OpFunction %void None %8
+         %38 = OpLabel
+     %height = OpVariable %_ptr_Function_float Function
+               OpStore %height %float_256
+         %39 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_1
+         %40 = OpLoad %float %39
+         %41 = OpFOrdLessThan %bool %40 %float_0
+               OpSelectionMerge %42 None
+               OpBranchConditional %41 %43 %42
+         %43 = OpLabel
+         %44 = OpLoad %float %height
+         %45 = OpCompositeConstruct %v4float %float_7612_94531 %float_797_010986 %44 %float_9
+         %46 = OpExtInst %v4float %1 FMix %27 %32 %45
+               OpStore %_GLF_color %46
+               OpBranch %42
+         %42 = OpLabel
+               OpStore %_GLF_color %37
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/wrong-color-in-always-false-if/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/wrong-color-in-always-false-if/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..c608e00
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/wrong-color-in-always-false-if/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,29 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float height = 0.0f;
+  height = 256.0f;
+  const float x_40 = asfloat(x_6[0].y);
+  if ((x_40 < 0.0f)) {
+    x_GLF_color = lerp(float4(30.180000305f, 8840.0f, 469.970001221f, 18.239999771f), float4(9.899999619f, 0.100000001f, 1169.538696289f, 55.790000916f), float4(7612.9453125f, 797.010986328f, height, 9.0f));
+  }
+  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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/wrong-color-in-always-false-if/0-opt.spvasm.expected.msl b/test/vk-gl-cts/graphicsfuzz/wrong-color-in-always-false-if/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..25fe33c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/wrong-color-in-always-false-if/0-opt.spvasm.expected.msl
@@ -0,0 +1,33 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float height = 0.0f;
+  height = 256.0f;
+  float const x_40 = x_6.injectionSwitch.y;
+  if ((x_40 < 0.0f)) {
+    float const x_44 = height;
+    *(tint_symbol_4) = mix(float4(30.180000305f, 8840.0f, 469.970001221f, 18.239999771f), float4(9.899999619f, 0.100000001f, 1169.538696289f, 55.790000916f), float4(7612.9453125f, 797.010986328f, x_44, 9.0f));
+  }
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/wrong-color-in-always-false-if/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/wrong-color-in-always-false-if/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..864cc6d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/wrong-color-in-always-false-if/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,102 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 62
+; Schema: 0
+               OpCapability Shader
+         %33 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %height "height"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %18 = OpConstantNull %float
+  %float_256 = OpConstant %float 256
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+%float_30_1800003 = OpConstant %float 30.1800003
+ %float_8840 = OpConstant %float 8840
+%float_469_970001 = OpConstant %float 469.970001
+%float_18_2399998 = OpConstant %float 18.2399998
+         %38 = OpConstantComposite %v4float %float_30_1800003 %float_8840 %float_469_970001 %float_18_2399998
+%float_9_89999962 = OpConstant %float 9.89999962
+%float_0_100000001 = OpConstant %float 0.100000001
+%float_1169_5387 = OpConstant %float 1169.5387
+%float_55_7900009 = OpConstant %float 55.7900009
+         %43 = OpConstantComposite %v4float %float_9_89999962 %float_0_100000001 %float_1169_5387 %float_55_7900009
+%float_7612_94531 = OpConstant %float 7612.94531
+%float_797_010986 = OpConstant %float 797.010986
+    %float_9 = OpConstant %float 9
+    %float_1 = OpConstant %float 1
+         %49 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %50 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+     %height = OpVariable %_ptr_Function_float Function %18
+               OpStore %height %float_256
+         %24 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %25 = OpLoad %float %24
+         %27 = OpFOrdLessThan %bool %25 %float_0
+               OpSelectionMerge %29 None
+               OpBranchConditional %27 %30 %29
+         %30 = OpLabel
+         %31 = OpLoad %float %height
+         %47 = OpCompositeConstruct %v4float %float_7612_94531 %float_797_010986 %31 %float_9
+         %32 = OpExtInst %v4float %33 FMix %38 %43 %47
+               OpStore %x_GLF_color %32
+               OpBranch %29
+         %29 = OpLabel
+               OpStore %x_GLF_color %49
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %50
+%tint_symbol = OpFunctionParameter %main_out
+         %54 = OpLabel
+         %55 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %55
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %57 = OpLabel
+         %58 = OpFunctionCall %void %main_1
+         %60 = OpLoad %v4float %x_GLF_color
+         %61 = OpCompositeConstruct %main_out %60
+         %59 = OpFunctionCall %void %tint_symbol_2 %61
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/wrong-color-in-always-false-if/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/wrong-color-in-always-false-if/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..a5f11f5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/wrong-color-in-always-false-if/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,31 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var height : f32;
+  height = 256.0;
+  let x_40 : f32 = x_6.injectionSwitch.y;
+  if ((x_40 < 0.0)) {
+    let x_44 : f32 = height;
+    x_GLF_color = mix(vec4<f32>(30.180000305, 8840.0, 469.970001221, 18.239999771), vec4<f32>(9.899999619, 0.100000001, 1169.538696289, 55.790000916), vec4<f32>(7612.9453125, 797.010986328, x_44, 9.0));
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/wrong-color-in-always-false-if/0-opt.wgsl b/test/vk-gl-cts/graphicsfuzz/wrong-color-in-always-false-if/0-opt.wgsl
new file mode 100644
index 0000000..a5f11f5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/wrong-color-in-always-false-if/0-opt.wgsl
@@ -0,0 +1,31 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var height : f32;
+  height = 256.0;
+  let x_40 : f32 = x_6.injectionSwitch.y;
+  if ((x_40 < 0.0)) {
+    let x_44 : f32 = height;
+    x_GLF_color = mix(vec4<f32>(30.180000305, 8840.0, 469.970001221, 18.239999771), vec4<f32>(9.899999619, 0.100000001, 1169.538696289, 55.790000916), vec4<f32>(7612.9453125, 797.010986328, x_44, 9.0));
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/wrong-color-in-always-false-if/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/graphicsfuzz/wrong-color-in-always-false-if/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..c608e00
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/wrong-color-in-always-false-if/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,29 @@
+cbuffer cbuffer_x_6 : register(b0, space0) {
+  uint4 x_6[1];
+};
+static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  float height = 0.0f;
+  height = 256.0f;
+  const float x_40 = asfloat(x_6[0].y);
+  if ((x_40 < 0.0f)) {
+    x_GLF_color = lerp(float4(30.180000305f, 8840.0f, 469.970001221f, 18.239999771f), float4(9.899999619f, 0.100000001f, 1169.538696289f, 55.790000916f), float4(7612.9453125f, 797.010986328f, height, 9.0f));
+  }
+  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;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {x_GLF_color};
+  const tint_symbol tint_symbol_3 = {tint_symbol_1.x_GLF_color_1};
+  return tint_symbol_3;
+}
diff --git a/test/vk-gl-cts/graphicsfuzz/wrong-color-in-always-false-if/0-opt.wgsl.expected.msl b/test/vk-gl-cts/graphicsfuzz/wrong-color-in-always-false-if/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..25fe33c
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/wrong-color-in-always-false-if/0-opt.wgsl.expected.msl
@@ -0,0 +1,33 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct buf0 {
+  /* 0x0000 */ packed_float2 injectionSwitch;
+};
+struct main_out {
+  float4 x_GLF_color_1;
+};
+struct tint_symbol_1 {
+  float4 x_GLF_color_1 [[color(0)]];
+};
+
+void main_1(constant buf0& x_6, thread float4* const tint_symbol_4) {
+  float height = 0.0f;
+  height = 256.0f;
+  float const x_40 = x_6.injectionSwitch.y;
+  if ((x_40 < 0.0f)) {
+    float const x_44 = height;
+    *(tint_symbol_4) = mix(float4(30.180000305f, 8840.0f, 469.970001221f, 18.239999771f), float4(9.899999619f, 0.100000001f, 1169.538696289f, 55.790000916f), float4(7612.9453125f, 797.010986328f, x_44, 9.0f));
+  }
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(x_6, &(tint_symbol_5));
+  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/graphicsfuzz/wrong-color-in-always-false-if/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/graphicsfuzz/wrong-color-in-always-false-if/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..864cc6d
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/wrong-color-in-always-false-if/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,102 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 62
+; Schema: 0
+               OpCapability Shader
+         %33 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %buf0 "buf0"
+               OpMemberName %buf0 0 "injectionSwitch"
+               OpName %x_6 "x_6"
+               OpName %x_GLF_color "x_GLF_color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %height "height"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_GLF_color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %buf0 Block
+               OpMemberDecorate %buf0 0 Offset 0
+               OpDecorate %x_6 NonWritable
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+       %buf0 = OpTypeStruct %v2float
+%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
+        %x_6 = OpVariable %_ptr_Uniform_buf0 Uniform
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %9 = OpConstantNull %v4float
+%x_GLF_color = OpVariable %_ptr_Private_v4float Private %9
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %9
+       %void = OpTypeVoid
+         %12 = OpTypeFunction %void
+%_ptr_Function_float = OpTypePointer Function %float
+         %18 = OpConstantNull %float
+  %float_256 = OpConstant %float 256
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+    %float_0 = OpConstant %float 0
+       %bool = OpTypeBool
+%float_30_1800003 = OpConstant %float 30.1800003
+ %float_8840 = OpConstant %float 8840
+%float_469_970001 = OpConstant %float 469.970001
+%float_18_2399998 = OpConstant %float 18.2399998
+         %38 = OpConstantComposite %v4float %float_30_1800003 %float_8840 %float_469_970001 %float_18_2399998
+%float_9_89999962 = OpConstant %float 9.89999962
+%float_0_100000001 = OpConstant %float 0.100000001
+%float_1169_5387 = OpConstant %float 1169.5387
+%float_55_7900009 = OpConstant %float 55.7900009
+         %43 = OpConstantComposite %v4float %float_9_89999962 %float_0_100000001 %float_1169_5387 %float_55_7900009
+%float_7612_94531 = OpConstant %float 7612.94531
+%float_797_010986 = OpConstant %float 797.010986
+    %float_9 = OpConstant %float 9
+    %float_1 = OpConstant %float 1
+         %49 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+   %main_out = OpTypeStruct %v4float
+         %50 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %12
+         %15 = OpLabel
+     %height = OpVariable %_ptr_Function_float Function %18
+               OpStore %height %float_256
+         %24 = OpAccessChain %_ptr_Uniform_float %x_6 %uint_0 %uint_1
+         %25 = OpLoad %float %24
+         %27 = OpFOrdLessThan %bool %25 %float_0
+               OpSelectionMerge %29 None
+               OpBranchConditional %27 %30 %29
+         %30 = OpLabel
+         %31 = OpLoad %float %height
+         %47 = OpCompositeConstruct %v4float %float_7612_94531 %float_797_010986 %31 %float_9
+         %32 = OpExtInst %v4float %33 FMix %38 %43 %47
+               OpStore %x_GLF_color %32
+               OpBranch %29
+         %29 = OpLabel
+               OpStore %x_GLF_color %49
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %50
+%tint_symbol = OpFunctionParameter %main_out
+         %54 = OpLabel
+         %55 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %55
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %12
+         %57 = OpLabel
+         %58 = OpFunctionCall %void %main_1
+         %60 = OpLoad %v4float %x_GLF_color
+         %61 = OpCompositeConstruct %main_out %60
+         %59 = OpFunctionCall %void %tint_symbol_2 %61
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/graphicsfuzz/wrong-color-in-always-false-if/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/graphicsfuzz/wrong-color-in-always-false-if/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..a5f11f5
--- /dev/null
+++ b/test/vk-gl-cts/graphicsfuzz/wrong-color-in-always-false-if/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,31 @@
+[[block]]
+struct buf0 {
+  injectionSwitch : vec2<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> x_6 : buf0;
+
+var<private> x_GLF_color : vec4<f32>;
+
+fn main_1() {
+  var height : f32;
+  height = 256.0;
+  let x_40 : f32 = x_6.injectionSwitch.y;
+  if ((x_40 < 0.0)) {
+    let x_44 : f32 = height;
+    x_GLF_color = mix(vec4<f32>(30.180000305, 8840.0, 469.970001221, 18.239999771), vec4<f32>(9.899999619, 0.100000001, 1169.538696289, 55.790000916), vec4<f32>(7612.9453125, 797.010986328, x_44, 9.0));
+  }
+  x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_GLF_color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(x_GLF_color);
+}
diff --git a/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_overflow/0-opt.spvasm b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_overflow/0-opt.spvasm
new file mode 100644
index 0000000..cc4f09d
--- /dev/null
+++ b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_overflow/0-opt.spvasm
@@ -0,0 +1,209 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main" %gl_WorkGroupID
+               OpExecutionMode %main LocalSize 4 1 1
+               OpSource GLSL 430
+               OpName %main "main"
+               OpName %base_index_in "base_index_in"
+               OpName %gl_WorkGroupID "gl_WorkGroupID"
+               OpName %base_index_out "base_index_out"
+               OpName %index_in0 "index_in0"
+               OpName %index_in1 "index_in1"
+               OpName %index_out0 "index_out0"
+               OpName %index_out1 "index_out1"
+               OpName %condition_index "condition_index"
+               OpName %i "i"
+               OpName %In2 "In2"
+               OpMemberName %In2 0 "data_in2"
+               OpName %_ ""
+               OpName %Out0 "Out0"
+               OpMemberName %Out0 0 "data_out0"
+               OpName %__0 ""
+               OpName %In1 "In1"
+               OpMemberName %In1 0 "data_in1"
+               OpName %__1 ""
+               OpName %In0 "In0"
+               OpMemberName %In0 0 "data_in0"
+               OpName %__2 ""
+               OpName %temp0 "temp0"
+               OpName %temp1 "temp1"
+               OpDecorate %gl_WorkGroupID BuiltIn WorkgroupId
+               OpDecorate %_arr_int_uint_8 ArrayStride 4
+               OpMemberDecorate %In2 0 NonWritable
+               OpMemberDecorate %In2 0 Offset 0
+               OpDecorate %In2 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 2
+               OpDecorate %_arr_int_uint_1024 ArrayStride 4
+               OpMemberDecorate %Out0 0 NonReadable
+               OpMemberDecorate %Out0 0 Offset 0
+               OpDecorate %Out0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 3
+               OpDecorate %_arr_int_uint_512 ArrayStride 4
+               OpMemberDecorate %In1 0 NonWritable
+               OpMemberDecorate %In1 0 Offset 0
+               OpDecorate %In1 Block
+               OpDecorate %__1 DescriptorSet 0
+               OpDecorate %__1 Binding 1
+               OpDecorate %_arr_int_uint_512_0 ArrayStride 4
+               OpMemberDecorate %In0 0 NonWritable
+               OpMemberDecorate %In0 0 Offset 0
+               OpDecorate %In0 Block
+               OpDecorate %__2 DescriptorSet 0
+               OpDecorate %__2 Binding 0
+               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+   %uint_128 = OpConstant %uint 128
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%gl_WorkGroupID = OpVariable %_ptr_Input_v3uint Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_uint = OpTypePointer Input %uint
+   %uint_256 = OpConstant %uint 256
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+    %int_127 = OpConstant %int 127
+    %int_383 = OpConstant %int 383
+    %int_255 = OpConstant %int 255
+      %int_0 = OpConstant %int 0
+    %int_256 = OpConstant %int 256
+       %bool = OpTypeBool
+     %uint_8 = OpConstant %uint 8
+%_arr_int_uint_8 = OpTypeArray %int %uint_8
+        %In2 = OpTypeStruct %_arr_int_uint_8
+%_ptr_StorageBuffer_In2 = OpTypePointer StorageBuffer %In2
+          %_ = OpVariable %_ptr_StorageBuffer_In2 StorageBuffer
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+  %uint_1024 = OpConstant %uint 1024
+%_arr_int_uint_1024 = OpTypeArray %int %uint_1024
+       %Out0 = OpTypeStruct %_arr_int_uint_1024
+%_ptr_StorageBuffer_Out0 = OpTypePointer StorageBuffer %Out0
+        %__0 = OpVariable %_ptr_StorageBuffer_Out0 StorageBuffer
+   %uint_512 = OpConstant %uint 512
+%_arr_int_uint_512 = OpTypeArray %int %uint_512
+        %In1 = OpTypeStruct %_arr_int_uint_512
+%_ptr_StorageBuffer_In1 = OpTypePointer StorageBuffer %In1
+        %__1 = OpVariable %_ptr_StorageBuffer_In1 StorageBuffer
+      %int_1 = OpConstant %int 1
+%_arr_int_uint_512_0 = OpTypeArray %int %uint_512
+        %In0 = OpTypeStruct %_arr_int_uint_512_0
+%_ptr_StorageBuffer_In0 = OpTypePointer StorageBuffer %In0
+        %__2 = OpVariable %_ptr_StorageBuffer_In0 StorageBuffer
+     %uint_4 = OpConstant %uint 4
+     %uint_1 = OpConstant %uint 1
+%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_1 %uint_1
+       %main = OpFunction %void None %28
+         %56 = OpLabel
+%base_index_in = OpVariable %_ptr_Function_uint Function
+%base_index_out = OpVariable %_ptr_Function_uint Function
+  %index_in0 = OpVariable %_ptr_Function_int Function
+  %index_in1 = OpVariable %_ptr_Function_int Function
+ %index_out0 = OpVariable %_ptr_Function_int Function
+ %index_out1 = OpVariable %_ptr_Function_int Function
+%condition_index = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+      %temp0 = OpVariable %_ptr_Function_int Function
+      %temp1 = OpVariable %_ptr_Function_int Function
+         %57 = OpAccessChain %_ptr_Input_uint %gl_WorkGroupID %uint_0
+         %58 = OpLoad %uint %57
+         %59 = OpIMul %uint %uint_128 %58
+               OpStore %base_index_in %59
+         %60 = OpAccessChain %_ptr_Input_uint %gl_WorkGroupID %uint_0
+         %61 = OpLoad %uint %60
+         %62 = OpIMul %uint %uint_256 %61
+               OpStore %base_index_out %62
+               OpStore %index_in0 %int_127
+               OpStore %index_in1 %int_383
+               OpStore %index_out0 %int_255
+               OpStore %index_out1 %int_383
+               OpStore %condition_index %int_0
+               OpStore %i %int_0
+               OpBranch %63
+         %63 = OpLabel
+               OpLoopMerge %64 %65 None
+               OpBranch %66
+         %66 = OpLabel
+         %67 = OpLoad %int %i
+         %68 = OpSLessThan %bool %67 %int_256
+               OpBranchConditional %68 %69 %64
+         %69 = OpLabel
+         %70 = OpLoad %int %condition_index
+         %71 = OpAccessChain %_ptr_StorageBuffer_int %_ %int_0 %70
+         %72 = OpLoad %int %71
+         %73 = OpIEqual %bool %72 %int_0
+               OpSelectionMerge %74 None
+               OpBranchConditional %73 %75 %76
+         %75 = OpLabel
+         %77 = OpLoad %uint %base_index_out
+         %78 = OpLoad %int %index_out0
+         %79 = OpBitcast %uint %78
+         %80 = OpIAdd %uint %77 %79
+         %81 = OpLoad %uint %base_index_in
+         %82 = OpLoad %int %index_in0
+         %83 = OpBitcast %uint %82
+         %84 = OpIAdd %uint %81 %83
+         %85 = OpAccessChain %_ptr_StorageBuffer_int %__1 %int_0 %84
+         %86 = OpLoad %int %85
+         %87 = OpAccessChain %_ptr_StorageBuffer_int %__0 %int_0 %80
+               OpStore %87 %86
+         %88 = OpLoad %int %index_out0
+         %89 = OpISub %int %88 %int_1
+               OpStore %index_out0 %89
+         %90 = OpLoad %int %index_in1
+         %91 = OpISub %int %90 %int_1
+               OpStore %index_in1 %91
+               OpBranch %74
+         %76 = OpLabel
+         %92 = OpLoad %uint %base_index_out
+         %93 = OpLoad %int %index_out1
+         %94 = OpBitcast %uint %93
+         %95 = OpIAdd %uint %92 %94
+         %96 = OpLoad %uint %base_index_in
+         %97 = OpLoad %int %index_in1
+         %98 = OpBitcast %uint %97
+         %99 = OpIAdd %uint %96 %98
+        %100 = OpAccessChain %_ptr_StorageBuffer_int %__2 %int_0 %99
+        %101 = OpLoad %int %100
+        %102 = OpAccessChain %_ptr_StorageBuffer_int %__0 %int_0 %95
+               OpStore %102 %101
+        %103 = OpLoad %int %index_out1
+        %104 = OpISub %int %103 %int_1
+               OpStore %index_out1 %104
+        %105 = OpLoad %int %index_in1
+        %106 = OpISub %int %105 %int_1
+               OpStore %index_in1 %106
+               OpBranch %74
+         %74 = OpLabel
+        %107 = OpLoad %int %condition_index
+        %108 = OpIAdd %int %107 %int_1
+        %109 = OpAccessChain %_ptr_StorageBuffer_int %_ %int_0 %108
+        %110 = OpLoad %int %109
+        %111 = OpLoad %int %condition_index
+        %112 = OpIAdd %int %111 %110
+               OpStore %condition_index %112
+        %113 = OpLoad %int %index_in0
+               OpStore %temp0 %113
+        %114 = OpLoad %int %index_in1
+               OpStore %index_in0 %114
+        %115 = OpLoad %int %temp0
+               OpStore %index_in1 %115
+        %116 = OpLoad %int %index_out0
+               OpStore %temp1 %116
+        %117 = OpLoad %int %index_out1
+               OpStore %index_out0 %117
+        %118 = OpLoad %int %temp1
+               OpStore %index_out1 %118
+               OpBranch %65
+         %65 = OpLabel
+        %119 = OpLoad %int %i
+        %120 = OpIAdd %int %119 %int_1
+               OpStore %i %120
+               OpBranch %63
+         %64 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_overflow/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_overflow/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..14fc121
--- /dev/null
+++ b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_overflow/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,69 @@
+static uint3 gl_WorkGroupID = uint3(0u, 0u, 0u);
+ByteAddressBuffer x_13 : register(t2, space0);
+RWByteAddressBuffer x_15 : register(u3, space0);
+ByteAddressBuffer x_17 : register(t1, space0);
+ByteAddressBuffer x_19 : register(t0, space0);
+
+void main_1() {
+  uint base_index_in = 0u;
+  uint base_index_out = 0u;
+  int index_in0 = 0;
+  int index_in1 = 0;
+  int index_out0 = 0;
+  int index_out1 = 0;
+  int condition_index = 0;
+  int i = 0;
+  int temp0 = 0;
+  int temp1 = 0;
+  const uint x_58 = gl_WorkGroupID.x;
+  base_index_in = (128u * x_58);
+  const uint x_61 = gl_WorkGroupID.x;
+  base_index_out = (256u * x_61);
+  index_in0 = 127;
+  index_in1 = 383;
+  index_out0 = 255;
+  index_out1 = 383;
+  condition_index = 0;
+  i = 0;
+  {
+    for(; (i < 256); i = (i + 1)) {
+      const int x_72 = asint(x_13.Load((4u * uint(condition_index))));
+      if ((x_72 == 0)) {
+        const uint x_77 = base_index_out;
+        const int x_78 = index_out0;
+        const int x_86 = asint(x_17.Load((4u * (base_index_in + asuint(index_in0)))));
+        x_15.Store((4u * (x_77 + asuint(x_78))), asuint(x_86));
+        index_out0 = (index_out0 - 1);
+        index_in1 = (index_in1 - 1);
+      } else {
+        const uint x_92 = base_index_out;
+        const int x_93 = index_out1;
+        const int x_101 = asint(x_19.Load((4u * (base_index_in + asuint(index_in1)))));
+        x_15.Store((4u * (x_92 + asuint(x_93))), asuint(x_101));
+        index_out1 = (index_out1 - 1);
+        index_in1 = (index_in1 - 1);
+      }
+      const int x_110 = asint(x_13.Load((4u * uint((condition_index + 1)))));
+      condition_index = (condition_index + x_110);
+      temp0 = index_in0;
+      index_in0 = index_in1;
+      index_in1 = temp0;
+      temp1 = index_out0;
+      index_out0 = index_out1;
+      index_out1 = temp1;
+    }
+  }
+  return;
+}
+
+struct tint_symbol_1 {
+  uint3 gl_WorkGroupID_param : SV_GroupID;
+};
+
+[numthreads(4, 1, 1)]
+void main(tint_symbol_1 tint_symbol) {
+  const uint3 gl_WorkGroupID_param = tint_symbol.gl_WorkGroupID_param;
+  gl_WorkGroupID = gl_WorkGroupID_param;
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_overflow/0-opt.spvasm.expected.msl b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_overflow/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..be9d456
--- /dev/null
+++ b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_overflow/0-opt.spvasm.expected.msl
@@ -0,0 +1,108 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  /* 0x0000 */ int arr[8];
+};
+struct In2 {
+  /* 0x0000 */ tint_array_wrapper data_in2;
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ int arr[1024];
+};
+struct Out0 {
+  /* 0x0000 */ tint_array_wrapper_1 data_out0;
+};
+struct tint_array_wrapper_2 {
+  /* 0x0000 */ int arr[512];
+};
+struct In1 {
+  /* 0x0000 */ tint_array_wrapper_2 data_in1;
+};
+struct In0 {
+  /* 0x0000 */ tint_array_wrapper_2 data_in0;
+};
+
+void main_1(const device In2& x_13, const device In1& x_17, device Out0& x_15, const device In0& x_19, thread uint3* const tint_symbol_2) {
+  uint base_index_in = 0u;
+  uint base_index_out = 0u;
+  int index_in0 = 0;
+  int index_in1 = 0;
+  int index_out0 = 0;
+  int index_out1 = 0;
+  int condition_index = 0;
+  int i = 0;
+  int temp0 = 0;
+  int temp1 = 0;
+  uint const x_58 = (*(tint_symbol_2)).x;
+  base_index_in = (128u * x_58);
+  uint const x_61 = (*(tint_symbol_2)).x;
+  base_index_out = (256u * x_61);
+  index_in0 = 127;
+  index_in1 = 383;
+  index_out0 = 255;
+  index_out1 = 383;
+  condition_index = 0;
+  i = 0;
+  while (true) {
+    int const x_67 = i;
+    if ((x_67 < 256)) {
+    } else {
+      break;
+    }
+    int const x_70 = condition_index;
+    int const x_72 = x_13.data_in2.arr[x_70];
+    if ((x_72 == 0)) {
+      uint const x_77 = base_index_out;
+      int const x_78 = index_out0;
+      uint const x_81 = base_index_in;
+      int const x_82 = index_in0;
+      int const x_86 = x_17.data_in1.arr[(x_81 + as_type<uint>(x_82))];
+      x_15.data_out0.arr[(x_77 + as_type<uint>(x_78))] = x_86;
+      int const x_88 = index_out0;
+      index_out0 = (x_88 - 1);
+      int const x_90 = index_in1;
+      index_in1 = (x_90 - 1);
+    } else {
+      uint const x_92 = base_index_out;
+      int const x_93 = index_out1;
+      uint const x_96 = base_index_in;
+      int const x_97 = index_in1;
+      int const x_101 = x_19.data_in0.arr[(x_96 + as_type<uint>(x_97))];
+      x_15.data_out0.arr[(x_92 + as_type<uint>(x_93))] = x_101;
+      int const x_103 = index_out1;
+      index_out1 = (x_103 - 1);
+      int const x_105 = index_in1;
+      index_in1 = (x_105 - 1);
+    }
+    int const x_107 = condition_index;
+    int const x_110 = x_13.data_in2.arr[(x_107 + 1)];
+    int const x_111 = condition_index;
+    condition_index = (x_111 + x_110);
+    int const x_113 = index_in0;
+    temp0 = x_113;
+    int const x_114 = index_in1;
+    index_in0 = x_114;
+    int const x_115 = temp0;
+    index_in1 = x_115;
+    int const x_116 = index_out0;
+    temp1 = x_116;
+    int const x_117 = index_out1;
+    index_out0 = x_117;
+    int const x_118 = temp1;
+    index_out1 = x_118;
+    {
+      int const x_119 = i;
+      i = (x_119 + 1);
+    }
+  }
+  return;
+}
+
+kernel void tint_symbol(uint3 gl_WorkGroupID_param [[threadgroup_position_in_grid]], const device In2& x_13 [[buffer(2)]], const device In1& x_17 [[buffer(1)]], device Out0& x_15 [[buffer(3)]], const device In0& x_19 [[buffer(0)]]) {
+  thread uint3 tint_symbol_3 = 0u;
+  tint_symbol_3 = gl_WorkGroupID_param;
+  main_1(x_13, x_17, x_15, x_19, &(tint_symbol_3));
+  return;
+}
+
diff --git a/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_overflow/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_overflow/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..85465cc
--- /dev/null
+++ b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_overflow/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,224 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 127
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main" %tint_symbol
+               OpExecutionMode %main LocalSize 4 1 1
+               OpName %gl_WorkGroupID "gl_WorkGroupID"
+               OpName %In2 "In2"
+               OpMemberName %In2 0 "data_in2"
+               OpName %x_13 "x_13"
+               OpName %Out0 "Out0"
+               OpMemberName %Out0 0 "data_out0"
+               OpName %x_15 "x_15"
+               OpName %In1 "In1"
+               OpMemberName %In1 0 "data_in1"
+               OpName %x_17 "x_17"
+               OpName %In0 "In0"
+               OpMemberName %In0 0 "data_in0"
+               OpName %x_19 "x_19"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main_1 "main_1"
+               OpName %base_index_in "base_index_in"
+               OpName %base_index_out "base_index_out"
+               OpName %index_in0 "index_in0"
+               OpName %index_in1 "index_in1"
+               OpName %index_out0 "index_out0"
+               OpName %index_out1 "index_out1"
+               OpName %condition_index "condition_index"
+               OpName %i "i"
+               OpName %temp0 "temp0"
+               OpName %temp1 "temp1"
+               OpName %main "main"
+               OpDecorate %In2 Block
+               OpMemberDecorate %In2 0 Offset 0
+               OpDecorate %_arr_int_uint_8 ArrayStride 4
+               OpDecorate %x_13 NonWritable
+               OpDecorate %x_13 DescriptorSet 0
+               OpDecorate %x_13 Binding 2
+               OpDecorate %Out0 Block
+               OpMemberDecorate %Out0 0 Offset 0
+               OpDecorate %_arr_int_uint_1024 ArrayStride 4
+               OpDecorate %x_15 DescriptorSet 0
+               OpDecorate %x_15 Binding 3
+               OpDecorate %In1 Block
+               OpMemberDecorate %In1 0 Offset 0
+               OpDecorate %_arr_int_uint_512 ArrayStride 4
+               OpDecorate %x_17 NonWritable
+               OpDecorate %x_17 DescriptorSet 0
+               OpDecorate %x_17 Binding 1
+               OpDecorate %In0 Block
+               OpMemberDecorate %In0 0 Offset 0
+               OpDecorate %x_19 NonWritable
+               OpDecorate %x_19 DescriptorSet 0
+               OpDecorate %x_19 Binding 0
+               OpDecorate %tint_symbol BuiltIn WorkgroupId
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Private_v3uint = OpTypePointer Private %v3uint
+          %5 = OpConstantNull %v3uint
+%gl_WorkGroupID = OpVariable %_ptr_Private_v3uint Private %5
+        %int = OpTypeInt 32 1
+     %uint_8 = OpConstant %uint 8
+%_arr_int_uint_8 = OpTypeArray %int %uint_8
+        %In2 = OpTypeStruct %_arr_int_uint_8
+%_ptr_StorageBuffer_In2 = OpTypePointer StorageBuffer %In2
+       %x_13 = OpVariable %_ptr_StorageBuffer_In2 StorageBuffer
+  %uint_1024 = OpConstant %uint 1024
+%_arr_int_uint_1024 = OpTypeArray %int %uint_1024
+       %Out0 = OpTypeStruct %_arr_int_uint_1024
+%_ptr_StorageBuffer_Out0 = OpTypePointer StorageBuffer %Out0
+       %x_15 = OpVariable %_ptr_StorageBuffer_Out0 StorageBuffer
+   %uint_512 = OpConstant %uint 512
+%_arr_int_uint_512 = OpTypeArray %int %uint_512
+        %In1 = OpTypeStruct %_arr_int_uint_512
+%_ptr_StorageBuffer_In1 = OpTypePointer StorageBuffer %In1
+       %x_17 = OpVariable %_ptr_StorageBuffer_In1 StorageBuffer
+        %In0 = OpTypeStruct %_arr_int_uint_512
+%_ptr_StorageBuffer_In0 = OpTypePointer StorageBuffer %In0
+       %x_19 = OpVariable %_ptr_StorageBuffer_In0 StorageBuffer
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%tint_symbol = OpVariable %_ptr_Input_v3uint Input
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
+%_ptr_Function_uint = OpTypePointer Function %uint
+         %33 = OpConstantNull %uint
+%_ptr_Function_int = OpTypePointer Function %int
+         %37 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_uint = OpTypePointer Private %uint
+   %uint_128 = OpConstant %uint 128
+   %uint_256 = OpConstant %uint 256
+    %int_127 = OpConstant %int 127
+    %int_383 = OpConstant %int 383
+    %int_255 = OpConstant %int 255
+      %int_0 = OpConstant %int 0
+    %int_256 = OpConstant %int 256
+       %bool = OpTypeBool
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+      %int_1 = OpConstant %int 1
+     %main_1 = OpFunction %void None %27
+         %30 = OpLabel
+%base_index_in = OpVariable %_ptr_Function_uint Function %33
+%base_index_out = OpVariable %_ptr_Function_uint Function %33
+  %index_in0 = OpVariable %_ptr_Function_int Function %37
+  %index_in1 = OpVariable %_ptr_Function_int Function %37
+ %index_out0 = OpVariable %_ptr_Function_int Function %37
+ %index_out1 = OpVariable %_ptr_Function_int Function %37
+%condition_index = OpVariable %_ptr_Function_int Function %37
+          %i = OpVariable %_ptr_Function_int Function %37
+      %temp0 = OpVariable %_ptr_Function_int Function %37
+      %temp1 = OpVariable %_ptr_Function_int Function %37
+         %47 = OpAccessChain %_ptr_Private_uint %gl_WorkGroupID %uint_0
+         %48 = OpLoad %uint %47
+         %50 = OpIMul %uint %uint_128 %48
+               OpStore %base_index_in %50
+         %51 = OpAccessChain %_ptr_Private_uint %gl_WorkGroupID %uint_0
+         %52 = OpLoad %uint %51
+         %54 = OpIMul %uint %uint_256 %52
+               OpStore %base_index_out %54
+               OpStore %index_in0 %int_127
+               OpStore %index_in1 %int_383
+               OpStore %index_out0 %int_255
+               OpStore %index_out1 %int_383
+               OpStore %condition_index %int_0
+               OpStore %i %int_0
+               OpBranch %59
+         %59 = OpLabel
+               OpLoopMerge %60 %61 None
+               OpBranch %62
+         %62 = OpLabel
+         %63 = OpLoad %int %i
+         %65 = OpSLessThan %bool %63 %int_256
+               OpSelectionMerge %67 None
+               OpBranchConditional %65 %68 %69
+         %68 = OpLabel
+               OpBranch %67
+         %69 = OpLabel
+               OpBranch %60
+         %67 = OpLabel
+         %70 = OpLoad %int %condition_index
+         %72 = OpAccessChain %_ptr_StorageBuffer_int %x_13 %uint_0 %70
+         %73 = OpLoad %int %72
+         %74 = OpIEqual %bool %73 %int_0
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %77
+         %76 = OpLabel
+         %78 = OpLoad %uint %base_index_out
+         %79 = OpLoad %int %index_out0
+         %80 = OpLoad %uint %base_index_in
+         %81 = OpLoad %int %index_in0
+         %82 = OpBitcast %uint %81
+         %83 = OpIAdd %uint %80 %82
+         %84 = OpAccessChain %_ptr_StorageBuffer_int %x_17 %uint_0 %83
+         %85 = OpLoad %int %84
+         %86 = OpBitcast %uint %79
+         %87 = OpIAdd %uint %78 %86
+         %88 = OpAccessChain %_ptr_StorageBuffer_int %x_15 %uint_0 %87
+               OpStore %88 %85
+         %89 = OpLoad %int %index_out0
+         %91 = OpISub %int %89 %int_1
+               OpStore %index_out0 %91
+         %92 = OpLoad %int %index_in1
+         %93 = OpISub %int %92 %int_1
+               OpStore %index_in1 %93
+               OpBranch %75
+         %77 = OpLabel
+         %94 = OpLoad %uint %base_index_out
+         %95 = OpLoad %int %index_out1
+         %96 = OpLoad %uint %base_index_in
+         %97 = OpLoad %int %index_in1
+         %98 = OpBitcast %uint %97
+         %99 = OpIAdd %uint %96 %98
+        %100 = OpAccessChain %_ptr_StorageBuffer_int %x_19 %uint_0 %99
+        %101 = OpLoad %int %100
+        %102 = OpBitcast %uint %95
+        %103 = OpIAdd %uint %94 %102
+        %104 = OpAccessChain %_ptr_StorageBuffer_int %x_15 %uint_0 %103
+               OpStore %104 %101
+        %105 = OpLoad %int %index_out1
+        %106 = OpISub %int %105 %int_1
+               OpStore %index_out1 %106
+        %107 = OpLoad %int %index_in1
+        %108 = OpISub %int %107 %int_1
+               OpStore %index_in1 %108
+               OpBranch %75
+         %75 = OpLabel
+        %109 = OpLoad %int %condition_index
+        %110 = OpIAdd %int %109 %int_1
+        %111 = OpAccessChain %_ptr_StorageBuffer_int %x_13 %uint_0 %110
+        %112 = OpLoad %int %111
+        %113 = OpLoad %int %condition_index
+        %114 = OpIAdd %int %113 %112
+               OpStore %condition_index %114
+        %115 = OpLoad %int %index_in0
+               OpStore %temp0 %115
+        %116 = OpLoad %int %index_in1
+               OpStore %index_in0 %116
+        %117 = OpLoad %int %temp0
+               OpStore %index_in1 %117
+        %118 = OpLoad %int %index_out0
+               OpStore %temp1 %118
+        %119 = OpLoad %int %index_out1
+               OpStore %index_out0 %119
+        %120 = OpLoad %int %temp1
+               OpStore %index_out1 %120
+               OpBranch %61
+         %61 = OpLabel
+        %121 = OpLoad %int %i
+        %122 = OpIAdd %int %121 %int_1
+               OpStore %i %122
+               OpBranch %59
+         %60 = OpLabel
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %27
+        %124 = OpLabel
+        %125 = OpLoad %v3uint %tint_symbol
+               OpStore %gl_WorkGroupID %125
+        %126 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_overflow/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_overflow/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..e16f3b9
--- /dev/null
+++ b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_overflow/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,120 @@
+type Arr = [[stride(4)]] array<i32, 8>;
+
+[[block]]
+struct In2 {
+  data_in2 : Arr;
+};
+
+type Arr_1 = [[stride(4)]] array<i32, 1024>;
+
+[[block]]
+struct Out0 {
+  data_out0 : Arr_1;
+};
+
+type Arr_2 = [[stride(4)]] array<i32, 512>;
+
+type Arr_3 = [[stride(4)]] array<i32, 512>;
+
+[[block]]
+struct In1 {
+  data_in1 : Arr_3;
+};
+
+[[block]]
+struct In0 {
+  data_in0 : Arr_3;
+};
+
+var<private> gl_WorkGroupID : vec3<u32>;
+
+[[group(0), binding(2)]] var<storage, read> x_13 : In2;
+
+[[group(0), binding(3)]] var<storage, read_write> x_15 : Out0;
+
+[[group(0), binding(1)]] var<storage, read> x_17 : In1;
+
+[[group(0), binding(0)]] var<storage, read> x_19 : In0;
+
+fn main_1() {
+  var base_index_in : u32;
+  var base_index_out : u32;
+  var index_in0 : i32;
+  var index_in1 : i32;
+  var index_out0 : i32;
+  var index_out1 : i32;
+  var condition_index : i32;
+  var i : i32;
+  var temp0 : i32;
+  var temp1 : i32;
+  let x_58 : u32 = gl_WorkGroupID.x;
+  base_index_in = (128u * x_58);
+  let x_61 : u32 = gl_WorkGroupID.x;
+  base_index_out = (256u * x_61);
+  index_in0 = 127;
+  index_in1 = 383;
+  index_out0 = 255;
+  index_out1 = 383;
+  condition_index = 0;
+  i = 0;
+  loop {
+    let x_67 : i32 = i;
+    if ((x_67 < 256)) {
+    } else {
+      break;
+    }
+    let x_70 : i32 = condition_index;
+    let x_72 : i32 = x_13.data_in2[x_70];
+    if ((x_72 == 0)) {
+      let x_77 : u32 = base_index_out;
+      let x_78 : i32 = index_out0;
+      let x_81 : u32 = base_index_in;
+      let x_82 : i32 = index_in0;
+      let x_86 : i32 = x_17.data_in1[(x_81 + bitcast<u32>(x_82))];
+      x_15.data_out0[(x_77 + bitcast<u32>(x_78))] = x_86;
+      let x_88 : i32 = index_out0;
+      index_out0 = (x_88 - 1);
+      let x_90 : i32 = index_in1;
+      index_in1 = (x_90 - 1);
+    } else {
+      let x_92 : u32 = base_index_out;
+      let x_93 : i32 = index_out1;
+      let x_96 : u32 = base_index_in;
+      let x_97 : i32 = index_in1;
+      let x_101 : i32 = x_19.data_in0[(x_96 + bitcast<u32>(x_97))];
+      x_15.data_out0[(x_92 + bitcast<u32>(x_93))] = x_101;
+      let x_103 : i32 = index_out1;
+      index_out1 = (x_103 - 1);
+      let x_105 : i32 = index_in1;
+      index_in1 = (x_105 - 1);
+    }
+    let x_107 : i32 = condition_index;
+    let x_110 : i32 = x_13.data_in2[(x_107 + 1)];
+    let x_111 : i32 = condition_index;
+    condition_index = (x_111 + x_110);
+    let x_113 : i32 = index_in0;
+    temp0 = x_113;
+    let x_114 : i32 = index_in1;
+    index_in0 = x_114;
+    let x_115 : i32 = temp0;
+    index_in1 = x_115;
+    let x_116 : i32 = index_out0;
+    temp1 = x_116;
+    let x_117 : i32 = index_out1;
+    index_out0 = x_117;
+    let x_118 : i32 = temp1;
+    index_out1 = x_118;
+
+    continuing {
+      let x_119 : i32 = i;
+      i = (x_119 + 1);
+    }
+  }
+  return;
+}
+
+[[stage(compute), workgroup_size(4, 1, 1)]]
+fn main([[builtin(workgroup_id)]] gl_WorkGroupID_param : vec3<u32>) {
+  gl_WorkGroupID = gl_WorkGroupID_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_overflow/0-opt.wgsl b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_overflow/0-opt.wgsl
new file mode 100644
index 0000000..e16f3b9
--- /dev/null
+++ b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_overflow/0-opt.wgsl
@@ -0,0 +1,120 @@
+type Arr = [[stride(4)]] array<i32, 8>;
+
+[[block]]
+struct In2 {
+  data_in2 : Arr;
+};
+
+type Arr_1 = [[stride(4)]] array<i32, 1024>;
+
+[[block]]
+struct Out0 {
+  data_out0 : Arr_1;
+};
+
+type Arr_2 = [[stride(4)]] array<i32, 512>;
+
+type Arr_3 = [[stride(4)]] array<i32, 512>;
+
+[[block]]
+struct In1 {
+  data_in1 : Arr_3;
+};
+
+[[block]]
+struct In0 {
+  data_in0 : Arr_3;
+};
+
+var<private> gl_WorkGroupID : vec3<u32>;
+
+[[group(0), binding(2)]] var<storage, read> x_13 : In2;
+
+[[group(0), binding(3)]] var<storage, read_write> x_15 : Out0;
+
+[[group(0), binding(1)]] var<storage, read> x_17 : In1;
+
+[[group(0), binding(0)]] var<storage, read> x_19 : In0;
+
+fn main_1() {
+  var base_index_in : u32;
+  var base_index_out : u32;
+  var index_in0 : i32;
+  var index_in1 : i32;
+  var index_out0 : i32;
+  var index_out1 : i32;
+  var condition_index : i32;
+  var i : i32;
+  var temp0 : i32;
+  var temp1 : i32;
+  let x_58 : u32 = gl_WorkGroupID.x;
+  base_index_in = (128u * x_58);
+  let x_61 : u32 = gl_WorkGroupID.x;
+  base_index_out = (256u * x_61);
+  index_in0 = 127;
+  index_in1 = 383;
+  index_out0 = 255;
+  index_out1 = 383;
+  condition_index = 0;
+  i = 0;
+  loop {
+    let x_67 : i32 = i;
+    if ((x_67 < 256)) {
+    } else {
+      break;
+    }
+    let x_70 : i32 = condition_index;
+    let x_72 : i32 = x_13.data_in2[x_70];
+    if ((x_72 == 0)) {
+      let x_77 : u32 = base_index_out;
+      let x_78 : i32 = index_out0;
+      let x_81 : u32 = base_index_in;
+      let x_82 : i32 = index_in0;
+      let x_86 : i32 = x_17.data_in1[(x_81 + bitcast<u32>(x_82))];
+      x_15.data_out0[(x_77 + bitcast<u32>(x_78))] = x_86;
+      let x_88 : i32 = index_out0;
+      index_out0 = (x_88 - 1);
+      let x_90 : i32 = index_in1;
+      index_in1 = (x_90 - 1);
+    } else {
+      let x_92 : u32 = base_index_out;
+      let x_93 : i32 = index_out1;
+      let x_96 : u32 = base_index_in;
+      let x_97 : i32 = index_in1;
+      let x_101 : i32 = x_19.data_in0[(x_96 + bitcast<u32>(x_97))];
+      x_15.data_out0[(x_92 + bitcast<u32>(x_93))] = x_101;
+      let x_103 : i32 = index_out1;
+      index_out1 = (x_103 - 1);
+      let x_105 : i32 = index_in1;
+      index_in1 = (x_105 - 1);
+    }
+    let x_107 : i32 = condition_index;
+    let x_110 : i32 = x_13.data_in2[(x_107 + 1)];
+    let x_111 : i32 = condition_index;
+    condition_index = (x_111 + x_110);
+    let x_113 : i32 = index_in0;
+    temp0 = x_113;
+    let x_114 : i32 = index_in1;
+    index_in0 = x_114;
+    let x_115 : i32 = temp0;
+    index_in1 = x_115;
+    let x_116 : i32 = index_out0;
+    temp1 = x_116;
+    let x_117 : i32 = index_out1;
+    index_out0 = x_117;
+    let x_118 : i32 = temp1;
+    index_out1 = x_118;
+
+    continuing {
+      let x_119 : i32 = i;
+      i = (x_119 + 1);
+    }
+  }
+  return;
+}
+
+[[stage(compute), workgroup_size(4, 1, 1)]]
+fn main([[builtin(workgroup_id)]] gl_WorkGroupID_param : vec3<u32>) {
+  gl_WorkGroupID = gl_WorkGroupID_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_overflow/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_overflow/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..14fc121
--- /dev/null
+++ b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_overflow/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,69 @@
+static uint3 gl_WorkGroupID = uint3(0u, 0u, 0u);
+ByteAddressBuffer x_13 : register(t2, space0);
+RWByteAddressBuffer x_15 : register(u3, space0);
+ByteAddressBuffer x_17 : register(t1, space0);
+ByteAddressBuffer x_19 : register(t0, space0);
+
+void main_1() {
+  uint base_index_in = 0u;
+  uint base_index_out = 0u;
+  int index_in0 = 0;
+  int index_in1 = 0;
+  int index_out0 = 0;
+  int index_out1 = 0;
+  int condition_index = 0;
+  int i = 0;
+  int temp0 = 0;
+  int temp1 = 0;
+  const uint x_58 = gl_WorkGroupID.x;
+  base_index_in = (128u * x_58);
+  const uint x_61 = gl_WorkGroupID.x;
+  base_index_out = (256u * x_61);
+  index_in0 = 127;
+  index_in1 = 383;
+  index_out0 = 255;
+  index_out1 = 383;
+  condition_index = 0;
+  i = 0;
+  {
+    for(; (i < 256); i = (i + 1)) {
+      const int x_72 = asint(x_13.Load((4u * uint(condition_index))));
+      if ((x_72 == 0)) {
+        const uint x_77 = base_index_out;
+        const int x_78 = index_out0;
+        const int x_86 = asint(x_17.Load((4u * (base_index_in + asuint(index_in0)))));
+        x_15.Store((4u * (x_77 + asuint(x_78))), asuint(x_86));
+        index_out0 = (index_out0 - 1);
+        index_in1 = (index_in1 - 1);
+      } else {
+        const uint x_92 = base_index_out;
+        const int x_93 = index_out1;
+        const int x_101 = asint(x_19.Load((4u * (base_index_in + asuint(index_in1)))));
+        x_15.Store((4u * (x_92 + asuint(x_93))), asuint(x_101));
+        index_out1 = (index_out1 - 1);
+        index_in1 = (index_in1 - 1);
+      }
+      const int x_110 = asint(x_13.Load((4u * uint((condition_index + 1)))));
+      condition_index = (condition_index + x_110);
+      temp0 = index_in0;
+      index_in0 = index_in1;
+      index_in1 = temp0;
+      temp1 = index_out0;
+      index_out0 = index_out1;
+      index_out1 = temp1;
+    }
+  }
+  return;
+}
+
+struct tint_symbol_1 {
+  uint3 gl_WorkGroupID_param : SV_GroupID;
+};
+
+[numthreads(4, 1, 1)]
+void main(tint_symbol_1 tint_symbol) {
+  const uint3 gl_WorkGroupID_param = tint_symbol.gl_WorkGroupID_param;
+  gl_WorkGroupID = gl_WorkGroupID_param;
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_overflow/0-opt.wgsl.expected.msl b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_overflow/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..be9d456
--- /dev/null
+++ b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_overflow/0-opt.wgsl.expected.msl
@@ -0,0 +1,108 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  /* 0x0000 */ int arr[8];
+};
+struct In2 {
+  /* 0x0000 */ tint_array_wrapper data_in2;
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ int arr[1024];
+};
+struct Out0 {
+  /* 0x0000 */ tint_array_wrapper_1 data_out0;
+};
+struct tint_array_wrapper_2 {
+  /* 0x0000 */ int arr[512];
+};
+struct In1 {
+  /* 0x0000 */ tint_array_wrapper_2 data_in1;
+};
+struct In0 {
+  /* 0x0000 */ tint_array_wrapper_2 data_in0;
+};
+
+void main_1(const device In2& x_13, const device In1& x_17, device Out0& x_15, const device In0& x_19, thread uint3* const tint_symbol_2) {
+  uint base_index_in = 0u;
+  uint base_index_out = 0u;
+  int index_in0 = 0;
+  int index_in1 = 0;
+  int index_out0 = 0;
+  int index_out1 = 0;
+  int condition_index = 0;
+  int i = 0;
+  int temp0 = 0;
+  int temp1 = 0;
+  uint const x_58 = (*(tint_symbol_2)).x;
+  base_index_in = (128u * x_58);
+  uint const x_61 = (*(tint_symbol_2)).x;
+  base_index_out = (256u * x_61);
+  index_in0 = 127;
+  index_in1 = 383;
+  index_out0 = 255;
+  index_out1 = 383;
+  condition_index = 0;
+  i = 0;
+  while (true) {
+    int const x_67 = i;
+    if ((x_67 < 256)) {
+    } else {
+      break;
+    }
+    int const x_70 = condition_index;
+    int const x_72 = x_13.data_in2.arr[x_70];
+    if ((x_72 == 0)) {
+      uint const x_77 = base_index_out;
+      int const x_78 = index_out0;
+      uint const x_81 = base_index_in;
+      int const x_82 = index_in0;
+      int const x_86 = x_17.data_in1.arr[(x_81 + as_type<uint>(x_82))];
+      x_15.data_out0.arr[(x_77 + as_type<uint>(x_78))] = x_86;
+      int const x_88 = index_out0;
+      index_out0 = (x_88 - 1);
+      int const x_90 = index_in1;
+      index_in1 = (x_90 - 1);
+    } else {
+      uint const x_92 = base_index_out;
+      int const x_93 = index_out1;
+      uint const x_96 = base_index_in;
+      int const x_97 = index_in1;
+      int const x_101 = x_19.data_in0.arr[(x_96 + as_type<uint>(x_97))];
+      x_15.data_out0.arr[(x_92 + as_type<uint>(x_93))] = x_101;
+      int const x_103 = index_out1;
+      index_out1 = (x_103 - 1);
+      int const x_105 = index_in1;
+      index_in1 = (x_105 - 1);
+    }
+    int const x_107 = condition_index;
+    int const x_110 = x_13.data_in2.arr[(x_107 + 1)];
+    int const x_111 = condition_index;
+    condition_index = (x_111 + x_110);
+    int const x_113 = index_in0;
+    temp0 = x_113;
+    int const x_114 = index_in1;
+    index_in0 = x_114;
+    int const x_115 = temp0;
+    index_in1 = x_115;
+    int const x_116 = index_out0;
+    temp1 = x_116;
+    int const x_117 = index_out1;
+    index_out0 = x_117;
+    int const x_118 = temp1;
+    index_out1 = x_118;
+    {
+      int const x_119 = i;
+      i = (x_119 + 1);
+    }
+  }
+  return;
+}
+
+kernel void tint_symbol(uint3 gl_WorkGroupID_param [[threadgroup_position_in_grid]], const device In2& x_13 [[buffer(2)]], const device In1& x_17 [[buffer(1)]], device Out0& x_15 [[buffer(3)]], const device In0& x_19 [[buffer(0)]]) {
+  thread uint3 tint_symbol_3 = 0u;
+  tint_symbol_3 = gl_WorkGroupID_param;
+  main_1(x_13, x_17, x_15, x_19, &(tint_symbol_3));
+  return;
+}
+
diff --git a/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_overflow/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_overflow/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..85465cc
--- /dev/null
+++ b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_overflow/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,224 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 127
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main" %tint_symbol
+               OpExecutionMode %main LocalSize 4 1 1
+               OpName %gl_WorkGroupID "gl_WorkGroupID"
+               OpName %In2 "In2"
+               OpMemberName %In2 0 "data_in2"
+               OpName %x_13 "x_13"
+               OpName %Out0 "Out0"
+               OpMemberName %Out0 0 "data_out0"
+               OpName %x_15 "x_15"
+               OpName %In1 "In1"
+               OpMemberName %In1 0 "data_in1"
+               OpName %x_17 "x_17"
+               OpName %In0 "In0"
+               OpMemberName %In0 0 "data_in0"
+               OpName %x_19 "x_19"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main_1 "main_1"
+               OpName %base_index_in "base_index_in"
+               OpName %base_index_out "base_index_out"
+               OpName %index_in0 "index_in0"
+               OpName %index_in1 "index_in1"
+               OpName %index_out0 "index_out0"
+               OpName %index_out1 "index_out1"
+               OpName %condition_index "condition_index"
+               OpName %i "i"
+               OpName %temp0 "temp0"
+               OpName %temp1 "temp1"
+               OpName %main "main"
+               OpDecorate %In2 Block
+               OpMemberDecorate %In2 0 Offset 0
+               OpDecorate %_arr_int_uint_8 ArrayStride 4
+               OpDecorate %x_13 NonWritable
+               OpDecorate %x_13 DescriptorSet 0
+               OpDecorate %x_13 Binding 2
+               OpDecorate %Out0 Block
+               OpMemberDecorate %Out0 0 Offset 0
+               OpDecorate %_arr_int_uint_1024 ArrayStride 4
+               OpDecorate %x_15 DescriptorSet 0
+               OpDecorate %x_15 Binding 3
+               OpDecorate %In1 Block
+               OpMemberDecorate %In1 0 Offset 0
+               OpDecorate %_arr_int_uint_512 ArrayStride 4
+               OpDecorate %x_17 NonWritable
+               OpDecorate %x_17 DescriptorSet 0
+               OpDecorate %x_17 Binding 1
+               OpDecorate %In0 Block
+               OpMemberDecorate %In0 0 Offset 0
+               OpDecorate %x_19 NonWritable
+               OpDecorate %x_19 DescriptorSet 0
+               OpDecorate %x_19 Binding 0
+               OpDecorate %tint_symbol BuiltIn WorkgroupId
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Private_v3uint = OpTypePointer Private %v3uint
+          %5 = OpConstantNull %v3uint
+%gl_WorkGroupID = OpVariable %_ptr_Private_v3uint Private %5
+        %int = OpTypeInt 32 1
+     %uint_8 = OpConstant %uint 8
+%_arr_int_uint_8 = OpTypeArray %int %uint_8
+        %In2 = OpTypeStruct %_arr_int_uint_8
+%_ptr_StorageBuffer_In2 = OpTypePointer StorageBuffer %In2
+       %x_13 = OpVariable %_ptr_StorageBuffer_In2 StorageBuffer
+  %uint_1024 = OpConstant %uint 1024
+%_arr_int_uint_1024 = OpTypeArray %int %uint_1024
+       %Out0 = OpTypeStruct %_arr_int_uint_1024
+%_ptr_StorageBuffer_Out0 = OpTypePointer StorageBuffer %Out0
+       %x_15 = OpVariable %_ptr_StorageBuffer_Out0 StorageBuffer
+   %uint_512 = OpConstant %uint 512
+%_arr_int_uint_512 = OpTypeArray %int %uint_512
+        %In1 = OpTypeStruct %_arr_int_uint_512
+%_ptr_StorageBuffer_In1 = OpTypePointer StorageBuffer %In1
+       %x_17 = OpVariable %_ptr_StorageBuffer_In1 StorageBuffer
+        %In0 = OpTypeStruct %_arr_int_uint_512
+%_ptr_StorageBuffer_In0 = OpTypePointer StorageBuffer %In0
+       %x_19 = OpVariable %_ptr_StorageBuffer_In0 StorageBuffer
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%tint_symbol = OpVariable %_ptr_Input_v3uint Input
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
+%_ptr_Function_uint = OpTypePointer Function %uint
+         %33 = OpConstantNull %uint
+%_ptr_Function_int = OpTypePointer Function %int
+         %37 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_uint = OpTypePointer Private %uint
+   %uint_128 = OpConstant %uint 128
+   %uint_256 = OpConstant %uint 256
+    %int_127 = OpConstant %int 127
+    %int_383 = OpConstant %int 383
+    %int_255 = OpConstant %int 255
+      %int_0 = OpConstant %int 0
+    %int_256 = OpConstant %int 256
+       %bool = OpTypeBool
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+      %int_1 = OpConstant %int 1
+     %main_1 = OpFunction %void None %27
+         %30 = OpLabel
+%base_index_in = OpVariable %_ptr_Function_uint Function %33
+%base_index_out = OpVariable %_ptr_Function_uint Function %33
+  %index_in0 = OpVariable %_ptr_Function_int Function %37
+  %index_in1 = OpVariable %_ptr_Function_int Function %37
+ %index_out0 = OpVariable %_ptr_Function_int Function %37
+ %index_out1 = OpVariable %_ptr_Function_int Function %37
+%condition_index = OpVariable %_ptr_Function_int Function %37
+          %i = OpVariable %_ptr_Function_int Function %37
+      %temp0 = OpVariable %_ptr_Function_int Function %37
+      %temp1 = OpVariable %_ptr_Function_int Function %37
+         %47 = OpAccessChain %_ptr_Private_uint %gl_WorkGroupID %uint_0
+         %48 = OpLoad %uint %47
+         %50 = OpIMul %uint %uint_128 %48
+               OpStore %base_index_in %50
+         %51 = OpAccessChain %_ptr_Private_uint %gl_WorkGroupID %uint_0
+         %52 = OpLoad %uint %51
+         %54 = OpIMul %uint %uint_256 %52
+               OpStore %base_index_out %54
+               OpStore %index_in0 %int_127
+               OpStore %index_in1 %int_383
+               OpStore %index_out0 %int_255
+               OpStore %index_out1 %int_383
+               OpStore %condition_index %int_0
+               OpStore %i %int_0
+               OpBranch %59
+         %59 = OpLabel
+               OpLoopMerge %60 %61 None
+               OpBranch %62
+         %62 = OpLabel
+         %63 = OpLoad %int %i
+         %65 = OpSLessThan %bool %63 %int_256
+               OpSelectionMerge %67 None
+               OpBranchConditional %65 %68 %69
+         %68 = OpLabel
+               OpBranch %67
+         %69 = OpLabel
+               OpBranch %60
+         %67 = OpLabel
+         %70 = OpLoad %int %condition_index
+         %72 = OpAccessChain %_ptr_StorageBuffer_int %x_13 %uint_0 %70
+         %73 = OpLoad %int %72
+         %74 = OpIEqual %bool %73 %int_0
+               OpSelectionMerge %75 None
+               OpBranchConditional %74 %76 %77
+         %76 = OpLabel
+         %78 = OpLoad %uint %base_index_out
+         %79 = OpLoad %int %index_out0
+         %80 = OpLoad %uint %base_index_in
+         %81 = OpLoad %int %index_in0
+         %82 = OpBitcast %uint %81
+         %83 = OpIAdd %uint %80 %82
+         %84 = OpAccessChain %_ptr_StorageBuffer_int %x_17 %uint_0 %83
+         %85 = OpLoad %int %84
+         %86 = OpBitcast %uint %79
+         %87 = OpIAdd %uint %78 %86
+         %88 = OpAccessChain %_ptr_StorageBuffer_int %x_15 %uint_0 %87
+               OpStore %88 %85
+         %89 = OpLoad %int %index_out0
+         %91 = OpISub %int %89 %int_1
+               OpStore %index_out0 %91
+         %92 = OpLoad %int %index_in1
+         %93 = OpISub %int %92 %int_1
+               OpStore %index_in1 %93
+               OpBranch %75
+         %77 = OpLabel
+         %94 = OpLoad %uint %base_index_out
+         %95 = OpLoad %int %index_out1
+         %96 = OpLoad %uint %base_index_in
+         %97 = OpLoad %int %index_in1
+         %98 = OpBitcast %uint %97
+         %99 = OpIAdd %uint %96 %98
+        %100 = OpAccessChain %_ptr_StorageBuffer_int %x_19 %uint_0 %99
+        %101 = OpLoad %int %100
+        %102 = OpBitcast %uint %95
+        %103 = OpIAdd %uint %94 %102
+        %104 = OpAccessChain %_ptr_StorageBuffer_int %x_15 %uint_0 %103
+               OpStore %104 %101
+        %105 = OpLoad %int %index_out1
+        %106 = OpISub %int %105 %int_1
+               OpStore %index_out1 %106
+        %107 = OpLoad %int %index_in1
+        %108 = OpISub %int %107 %int_1
+               OpStore %index_in1 %108
+               OpBranch %75
+         %75 = OpLabel
+        %109 = OpLoad %int %condition_index
+        %110 = OpIAdd %int %109 %int_1
+        %111 = OpAccessChain %_ptr_StorageBuffer_int %x_13 %uint_0 %110
+        %112 = OpLoad %int %111
+        %113 = OpLoad %int %condition_index
+        %114 = OpIAdd %int %113 %112
+               OpStore %condition_index %114
+        %115 = OpLoad %int %index_in0
+               OpStore %temp0 %115
+        %116 = OpLoad %int %index_in1
+               OpStore %index_in0 %116
+        %117 = OpLoad %int %temp0
+               OpStore %index_in1 %117
+        %118 = OpLoad %int %index_out0
+               OpStore %temp1 %118
+        %119 = OpLoad %int %index_out1
+               OpStore %index_out0 %119
+        %120 = OpLoad %int %temp1
+               OpStore %index_out1 %120
+               OpBranch %61
+         %61 = OpLabel
+        %121 = OpLoad %int %i
+        %122 = OpIAdd %int %121 %int_1
+               OpStore %i %122
+               OpBranch %59
+         %60 = OpLabel
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %27
+        %124 = OpLabel
+        %125 = OpLoad %v3uint %tint_symbol
+               OpStore %gl_WorkGroupID %125
+        %126 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_overflow/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_overflow/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..e16f3b9
--- /dev/null
+++ b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_overflow/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,120 @@
+type Arr = [[stride(4)]] array<i32, 8>;
+
+[[block]]
+struct In2 {
+  data_in2 : Arr;
+};
+
+type Arr_1 = [[stride(4)]] array<i32, 1024>;
+
+[[block]]
+struct Out0 {
+  data_out0 : Arr_1;
+};
+
+type Arr_2 = [[stride(4)]] array<i32, 512>;
+
+type Arr_3 = [[stride(4)]] array<i32, 512>;
+
+[[block]]
+struct In1 {
+  data_in1 : Arr_3;
+};
+
+[[block]]
+struct In0 {
+  data_in0 : Arr_3;
+};
+
+var<private> gl_WorkGroupID : vec3<u32>;
+
+[[group(0), binding(2)]] var<storage, read> x_13 : In2;
+
+[[group(0), binding(3)]] var<storage, read_write> x_15 : Out0;
+
+[[group(0), binding(1)]] var<storage, read> x_17 : In1;
+
+[[group(0), binding(0)]] var<storage, read> x_19 : In0;
+
+fn main_1() {
+  var base_index_in : u32;
+  var base_index_out : u32;
+  var index_in0 : i32;
+  var index_in1 : i32;
+  var index_out0 : i32;
+  var index_out1 : i32;
+  var condition_index : i32;
+  var i : i32;
+  var temp0 : i32;
+  var temp1 : i32;
+  let x_58 : u32 = gl_WorkGroupID.x;
+  base_index_in = (128u * x_58);
+  let x_61 : u32 = gl_WorkGroupID.x;
+  base_index_out = (256u * x_61);
+  index_in0 = 127;
+  index_in1 = 383;
+  index_out0 = 255;
+  index_out1 = 383;
+  condition_index = 0;
+  i = 0;
+  loop {
+    let x_67 : i32 = i;
+    if ((x_67 < 256)) {
+    } else {
+      break;
+    }
+    let x_70 : i32 = condition_index;
+    let x_72 : i32 = x_13.data_in2[x_70];
+    if ((x_72 == 0)) {
+      let x_77 : u32 = base_index_out;
+      let x_78 : i32 = index_out0;
+      let x_81 : u32 = base_index_in;
+      let x_82 : i32 = index_in0;
+      let x_86 : i32 = x_17.data_in1[(x_81 + bitcast<u32>(x_82))];
+      x_15.data_out0[(x_77 + bitcast<u32>(x_78))] = x_86;
+      let x_88 : i32 = index_out0;
+      index_out0 = (x_88 - 1);
+      let x_90 : i32 = index_in1;
+      index_in1 = (x_90 - 1);
+    } else {
+      let x_92 : u32 = base_index_out;
+      let x_93 : i32 = index_out1;
+      let x_96 : u32 = base_index_in;
+      let x_97 : i32 = index_in1;
+      let x_101 : i32 = x_19.data_in0[(x_96 + bitcast<u32>(x_97))];
+      x_15.data_out0[(x_92 + bitcast<u32>(x_93))] = x_101;
+      let x_103 : i32 = index_out1;
+      index_out1 = (x_103 - 1);
+      let x_105 : i32 = index_in1;
+      index_in1 = (x_105 - 1);
+    }
+    let x_107 : i32 = condition_index;
+    let x_110 : i32 = x_13.data_in2[(x_107 + 1)];
+    let x_111 : i32 = condition_index;
+    condition_index = (x_111 + x_110);
+    let x_113 : i32 = index_in0;
+    temp0 = x_113;
+    let x_114 : i32 = index_in1;
+    index_in0 = x_114;
+    let x_115 : i32 = temp0;
+    index_in1 = x_115;
+    let x_116 : i32 = index_out0;
+    temp1 = x_116;
+    let x_117 : i32 = index_out1;
+    index_out0 = x_117;
+    let x_118 : i32 = temp1;
+    index_out1 = x_118;
+
+    continuing {
+      let x_119 : i32 = i;
+      i = (x_119 + 1);
+    }
+  }
+  return;
+}
+
+[[stage(compute), workgroup_size(4, 1, 1)]]
+fn main([[builtin(workgroup_id)]] gl_WorkGroupID_param : vec3<u32>) {
+  gl_WorkGroupID = gl_WorkGroupID_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_underflow/0-opt.spvasm b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_underflow/0-opt.spvasm
new file mode 100644
index 0000000..50b5277
--- /dev/null
+++ b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_underflow/0-opt.spvasm
@@ -0,0 +1,207 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main" %gl_WorkGroupID
+               OpExecutionMode %main LocalSize 4 1 1
+               OpSource GLSL 430
+               OpName %main "main"
+               OpName %base_index_in "base_index_in"
+               OpName %gl_WorkGroupID "gl_WorkGroupID"
+               OpName %base_index_out "base_index_out"
+               OpName %index_in0 "index_in0"
+               OpName %index_in1 "index_in1"
+               OpName %index_out0 "index_out0"
+               OpName %index_out1 "index_out1"
+               OpName %condition_index "condition_index"
+               OpName %i "i"
+               OpName %In2 "In2"
+               OpMemberName %In2 0 "data_in2"
+               OpName %_ ""
+               OpName %Out0 "Out0"
+               OpMemberName %Out0 0 "data_out0"
+               OpName %__0 ""
+               OpName %In0 "In0"
+               OpMemberName %In0 0 "data_in0"
+               OpName %__1 ""
+               OpName %In1 "In1"
+               OpMemberName %In1 0 "data_in1"
+               OpName %__2 ""
+               OpName %temp0 "temp0"
+               OpName %temp1 "temp1"
+               OpDecorate %gl_WorkGroupID BuiltIn WorkgroupId
+               OpDecorate %_arr_int_uint_8 ArrayStride 4
+               OpMemberDecorate %In2 0 NonWritable
+               OpMemberDecorate %In2 0 Offset 0
+               OpDecorate %In2 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 2
+               OpDecorate %_arr_int_uint_1024 ArrayStride 4
+               OpMemberDecorate %Out0 0 NonReadable
+               OpMemberDecorate %Out0 0 Offset 0
+               OpDecorate %Out0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 3
+               OpDecorate %_arr_int_uint_512 ArrayStride 4
+               OpMemberDecorate %In0 0 NonWritable
+               OpMemberDecorate %In0 0 Offset 0
+               OpDecorate %In0 Block
+               OpDecorate %__1 DescriptorSet 0
+               OpDecorate %__1 Binding 0
+               OpDecorate %_arr_int_uint_512_0 ArrayStride 4
+               OpMemberDecorate %In1 0 NonWritable
+               OpMemberDecorate %In1 0 Offset 0
+               OpDecorate %In1 Block
+               OpDecorate %__2 DescriptorSet 0
+               OpDecorate %__2 Binding 1
+               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize
+       %void = OpTypeVoid
+         %28 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+   %uint_128 = OpConstant %uint 128
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%gl_WorkGroupID = OpVariable %_ptr_Input_v3uint Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_uint = OpTypePointer Input %uint
+   %uint_256 = OpConstant %uint 256
+        %int = OpTypeInt 32 1
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+   %int_n128 = OpConstant %int -128
+    %int_256 = OpConstant %int 256
+       %bool = OpTypeBool
+     %uint_8 = OpConstant %uint 8
+%_arr_int_uint_8 = OpTypeArray %int %uint_8
+        %In2 = OpTypeStruct %_arr_int_uint_8
+%_ptr_StorageBuffer_In2 = OpTypePointer StorageBuffer %In2
+          %_ = OpVariable %_ptr_StorageBuffer_In2 StorageBuffer
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+  %uint_1024 = OpConstant %uint 1024
+%_arr_int_uint_1024 = OpTypeArray %int %uint_1024
+       %Out0 = OpTypeStruct %_arr_int_uint_1024
+%_ptr_StorageBuffer_Out0 = OpTypePointer StorageBuffer %Out0
+        %__0 = OpVariable %_ptr_StorageBuffer_Out0 StorageBuffer
+   %uint_512 = OpConstant %uint 512
+%_arr_int_uint_512 = OpTypeArray %int %uint_512
+        %In0 = OpTypeStruct %_arr_int_uint_512
+%_ptr_StorageBuffer_In0 = OpTypePointer StorageBuffer %In0
+        %__1 = OpVariable %_ptr_StorageBuffer_In0 StorageBuffer
+      %int_1 = OpConstant %int 1
+%_arr_int_uint_512_0 = OpTypeArray %int %uint_512
+        %In1 = OpTypeStruct %_arr_int_uint_512_0
+%_ptr_StorageBuffer_In1 = OpTypePointer StorageBuffer %In1
+        %__2 = OpVariable %_ptr_StorageBuffer_In1 StorageBuffer
+     %uint_4 = OpConstant %uint 4
+     %uint_1 = OpConstant %uint 1
+%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_1 %uint_1
+       %main = OpFunction %void None %28
+         %54 = OpLabel
+%base_index_in = OpVariable %_ptr_Function_uint Function
+%base_index_out = OpVariable %_ptr_Function_uint Function
+  %index_in0 = OpVariable %_ptr_Function_int Function
+  %index_in1 = OpVariable %_ptr_Function_int Function
+ %index_out0 = OpVariable %_ptr_Function_int Function
+ %index_out1 = OpVariable %_ptr_Function_int Function
+%condition_index = OpVariable %_ptr_Function_int Function
+          %i = OpVariable %_ptr_Function_int Function
+      %temp0 = OpVariable %_ptr_Function_int Function
+      %temp1 = OpVariable %_ptr_Function_int Function
+         %55 = OpAccessChain %_ptr_Input_uint %gl_WorkGroupID %uint_0
+         %56 = OpLoad %uint %55
+         %57 = OpIMul %uint %uint_128 %56
+               OpStore %base_index_in %57
+         %58 = OpAccessChain %_ptr_Input_uint %gl_WorkGroupID %uint_0
+         %59 = OpLoad %uint %58
+         %60 = OpIMul %uint %uint_256 %59
+               OpStore %base_index_out %60
+               OpStore %index_in0 %int_0
+               OpStore %index_in1 %int_n128
+               OpStore %index_out0 %int_0
+               OpStore %index_out1 %int_n128
+               OpStore %condition_index %int_0
+               OpStore %i %int_0
+               OpBranch %61
+         %61 = OpLabel
+               OpLoopMerge %62 %63 None
+               OpBranch %64
+         %64 = OpLabel
+         %65 = OpLoad %int %i
+         %66 = OpSLessThan %bool %65 %int_256
+               OpBranchConditional %66 %67 %62
+         %67 = OpLabel
+         %68 = OpLoad %int %condition_index
+         %69 = OpAccessChain %_ptr_StorageBuffer_int %_ %int_0 %68
+         %70 = OpLoad %int %69
+         %71 = OpIEqual %bool %70 %int_0
+               OpSelectionMerge %72 None
+               OpBranchConditional %71 %73 %74
+         %73 = OpLabel
+         %75 = OpLoad %uint %base_index_out
+         %76 = OpLoad %int %index_out0
+         %77 = OpBitcast %uint %76
+         %78 = OpIAdd %uint %75 %77
+         %79 = OpLoad %uint %base_index_in
+         %80 = OpLoad %int %index_in0
+         %81 = OpBitcast %uint %80
+         %82 = OpIAdd %uint %79 %81
+         %83 = OpAccessChain %_ptr_StorageBuffer_int %__1 %int_0 %82
+         %84 = OpLoad %int %83
+         %85 = OpAccessChain %_ptr_StorageBuffer_int %__0 %int_0 %78
+               OpStore %85 %84
+         %86 = OpLoad %int %index_out0
+         %87 = OpIAdd %int %86 %int_1
+               OpStore %index_out0 %87
+         %88 = OpLoad %int %index_in1
+         %89 = OpIAdd %int %88 %int_1
+               OpStore %index_in1 %89
+               OpBranch %72
+         %74 = OpLabel
+         %90 = OpLoad %uint %base_index_out
+         %91 = OpLoad %int %index_out1
+         %92 = OpBitcast %uint %91
+         %93 = OpIAdd %uint %90 %92
+         %94 = OpLoad %uint %base_index_in
+         %95 = OpLoad %int %index_in1
+         %96 = OpBitcast %uint %95
+         %97 = OpIAdd %uint %94 %96
+         %98 = OpAccessChain %_ptr_StorageBuffer_int %__2 %int_0 %97
+         %99 = OpLoad %int %98
+        %100 = OpAccessChain %_ptr_StorageBuffer_int %__0 %int_0 %93
+               OpStore %100 %99
+        %101 = OpLoad %int %index_out1
+        %102 = OpIAdd %int %101 %int_1
+               OpStore %index_out1 %102
+        %103 = OpLoad %int %index_in1
+        %104 = OpIAdd %int %103 %int_1
+               OpStore %index_in1 %104
+               OpBranch %72
+         %72 = OpLabel
+        %105 = OpLoad %int %condition_index
+        %106 = OpIAdd %int %105 %int_1
+        %107 = OpAccessChain %_ptr_StorageBuffer_int %_ %int_0 %106
+        %108 = OpLoad %int %107
+        %109 = OpLoad %int %condition_index
+        %110 = OpIAdd %int %109 %108
+               OpStore %condition_index %110
+        %111 = OpLoad %int %index_in0
+               OpStore %temp0 %111
+        %112 = OpLoad %int %index_in1
+               OpStore %index_in0 %112
+        %113 = OpLoad %int %temp0
+               OpStore %index_in1 %113
+        %114 = OpLoad %int %index_out0
+               OpStore %temp1 %114
+        %115 = OpLoad %int %index_out1
+               OpStore %index_out0 %115
+        %116 = OpLoad %int %temp1
+               OpStore %index_out1 %116
+               OpBranch %63
+         %63 = OpLabel
+        %117 = OpLoad %int %i
+        %118 = OpIAdd %int %117 %int_1
+               OpStore %i %118
+               OpBranch %61
+         %62 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_underflow/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_underflow/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..df55b6b
--- /dev/null
+++ b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_underflow/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,69 @@
+static uint3 gl_WorkGroupID = uint3(0u, 0u, 0u);
+ByteAddressBuffer x_13 : register(t2, space0);
+RWByteAddressBuffer x_15 : register(u3, space0);
+ByteAddressBuffer x_17 : register(t0, space0);
+ByteAddressBuffer x_19 : register(t1, space0);
+
+void main_1() {
+  uint base_index_in = 0u;
+  uint base_index_out = 0u;
+  int index_in0 = 0;
+  int index_in1 = 0;
+  int index_out0 = 0;
+  int index_out1 = 0;
+  int condition_index = 0;
+  int i = 0;
+  int temp0 = 0;
+  int temp1 = 0;
+  const uint x_56 = gl_WorkGroupID.x;
+  base_index_in = (128u * x_56);
+  const uint x_59 = gl_WorkGroupID.x;
+  base_index_out = (256u * x_59);
+  index_in0 = 0;
+  index_in1 = -128;
+  index_out0 = 0;
+  index_out1 = -128;
+  condition_index = 0;
+  i = 0;
+  {
+    for(; (i < 256); i = (i + 1)) {
+      const int x_70 = asint(x_13.Load((4u * uint(condition_index))));
+      if ((x_70 == 0)) {
+        const uint x_75 = base_index_out;
+        const int x_76 = index_out0;
+        const int x_84 = asint(x_17.Load((4u * (base_index_in + asuint(index_in0)))));
+        x_15.Store((4u * (x_75 + asuint(x_76))), asuint(x_84));
+        index_out0 = (index_out0 + 1);
+        index_in1 = (index_in1 + 1);
+      } else {
+        const uint x_90 = base_index_out;
+        const int x_91 = index_out1;
+        const int x_99 = asint(x_19.Load((4u * (base_index_in + asuint(index_in1)))));
+        x_15.Store((4u * (x_90 + asuint(x_91))), asuint(x_99));
+        index_out1 = (index_out1 + 1);
+        index_in1 = (index_in1 + 1);
+      }
+      const int x_108 = asint(x_13.Load((4u * uint((condition_index + 1)))));
+      condition_index = (condition_index + x_108);
+      temp0 = index_in0;
+      index_in0 = index_in1;
+      index_in1 = temp0;
+      temp1 = index_out0;
+      index_out0 = index_out1;
+      index_out1 = temp1;
+    }
+  }
+  return;
+}
+
+struct tint_symbol_1 {
+  uint3 gl_WorkGroupID_param : SV_GroupID;
+};
+
+[numthreads(4, 1, 1)]
+void main(tint_symbol_1 tint_symbol) {
+  const uint3 gl_WorkGroupID_param = tint_symbol.gl_WorkGroupID_param;
+  gl_WorkGroupID = gl_WorkGroupID_param;
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_underflow/0-opt.spvasm.expected.msl b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_underflow/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..734a346
--- /dev/null
+++ b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_underflow/0-opt.spvasm.expected.msl
@@ -0,0 +1,108 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  /* 0x0000 */ int arr[8];
+};
+struct In2 {
+  /* 0x0000 */ tint_array_wrapper data_in2;
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ int arr[1024];
+};
+struct Out0 {
+  /* 0x0000 */ tint_array_wrapper_1 data_out0;
+};
+struct tint_array_wrapper_2 {
+  /* 0x0000 */ int arr[512];
+};
+struct In0 {
+  /* 0x0000 */ tint_array_wrapper_2 data_in0;
+};
+struct In1 {
+  /* 0x0000 */ tint_array_wrapper_2 data_in1;
+};
+
+void main_1(const device In2& x_13, const device In0& x_17, device Out0& x_15, const device In1& x_19, thread uint3* const tint_symbol_2) {
+  uint base_index_in = 0u;
+  uint base_index_out = 0u;
+  int index_in0 = 0;
+  int index_in1 = 0;
+  int index_out0 = 0;
+  int index_out1 = 0;
+  int condition_index = 0;
+  int i = 0;
+  int temp0 = 0;
+  int temp1 = 0;
+  uint const x_56 = (*(tint_symbol_2)).x;
+  base_index_in = (128u * x_56);
+  uint const x_59 = (*(tint_symbol_2)).x;
+  base_index_out = (256u * x_59);
+  index_in0 = 0;
+  index_in1 = -128;
+  index_out0 = 0;
+  index_out1 = -128;
+  condition_index = 0;
+  i = 0;
+  while (true) {
+    int const x_65 = i;
+    if ((x_65 < 256)) {
+    } else {
+      break;
+    }
+    int const x_68 = condition_index;
+    int const x_70 = x_13.data_in2.arr[x_68];
+    if ((x_70 == 0)) {
+      uint const x_75 = base_index_out;
+      int const x_76 = index_out0;
+      uint const x_79 = base_index_in;
+      int const x_80 = index_in0;
+      int const x_84 = x_17.data_in0.arr[(x_79 + as_type<uint>(x_80))];
+      x_15.data_out0.arr[(x_75 + as_type<uint>(x_76))] = x_84;
+      int const x_86 = index_out0;
+      index_out0 = (x_86 + 1);
+      int const x_88 = index_in1;
+      index_in1 = (x_88 + 1);
+    } else {
+      uint const x_90 = base_index_out;
+      int const x_91 = index_out1;
+      uint const x_94 = base_index_in;
+      int const x_95 = index_in1;
+      int const x_99 = x_19.data_in1.arr[(x_94 + as_type<uint>(x_95))];
+      x_15.data_out0.arr[(x_90 + as_type<uint>(x_91))] = x_99;
+      int const x_101 = index_out1;
+      index_out1 = (x_101 + 1);
+      int const x_103 = index_in1;
+      index_in1 = (x_103 + 1);
+    }
+    int const x_105 = condition_index;
+    int const x_108 = x_13.data_in2.arr[(x_105 + 1)];
+    int const x_109 = condition_index;
+    condition_index = (x_109 + x_108);
+    int const x_111 = index_in0;
+    temp0 = x_111;
+    int const x_112 = index_in1;
+    index_in0 = x_112;
+    int const x_113 = temp0;
+    index_in1 = x_113;
+    int const x_114 = index_out0;
+    temp1 = x_114;
+    int const x_115 = index_out1;
+    index_out0 = x_115;
+    int const x_116 = temp1;
+    index_out1 = x_116;
+    {
+      int const x_117 = i;
+      i = (x_117 + 1);
+    }
+  }
+  return;
+}
+
+kernel void tint_symbol(uint3 gl_WorkGroupID_param [[threadgroup_position_in_grid]], const device In2& x_13 [[buffer(2)]], const device In0& x_17 [[buffer(0)]], device Out0& x_15 [[buffer(3)]], const device In1& x_19 [[buffer(1)]]) {
+  thread uint3 tint_symbol_3 = 0u;
+  tint_symbol_3 = gl_WorkGroupID_param;
+  main_1(x_13, x_17, x_15, x_19, &(tint_symbol_3));
+  return;
+}
+
diff --git a/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_underflow/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_underflow/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..fd4ea43
--- /dev/null
+++ b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_underflow/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,222 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 125
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main" %tint_symbol
+               OpExecutionMode %main LocalSize 4 1 1
+               OpName %gl_WorkGroupID "gl_WorkGroupID"
+               OpName %In2 "In2"
+               OpMemberName %In2 0 "data_in2"
+               OpName %x_13 "x_13"
+               OpName %Out0 "Out0"
+               OpMemberName %Out0 0 "data_out0"
+               OpName %x_15 "x_15"
+               OpName %In0 "In0"
+               OpMemberName %In0 0 "data_in0"
+               OpName %x_17 "x_17"
+               OpName %In1 "In1"
+               OpMemberName %In1 0 "data_in1"
+               OpName %x_19 "x_19"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main_1 "main_1"
+               OpName %base_index_in "base_index_in"
+               OpName %base_index_out "base_index_out"
+               OpName %index_in0 "index_in0"
+               OpName %index_in1 "index_in1"
+               OpName %index_out0 "index_out0"
+               OpName %index_out1 "index_out1"
+               OpName %condition_index "condition_index"
+               OpName %i "i"
+               OpName %temp0 "temp0"
+               OpName %temp1 "temp1"
+               OpName %main "main"
+               OpDecorate %In2 Block
+               OpMemberDecorate %In2 0 Offset 0
+               OpDecorate %_arr_int_uint_8 ArrayStride 4
+               OpDecorate %x_13 NonWritable
+               OpDecorate %x_13 DescriptorSet 0
+               OpDecorate %x_13 Binding 2
+               OpDecorate %Out0 Block
+               OpMemberDecorate %Out0 0 Offset 0
+               OpDecorate %_arr_int_uint_1024 ArrayStride 4
+               OpDecorate %x_15 DescriptorSet 0
+               OpDecorate %x_15 Binding 3
+               OpDecorate %In0 Block
+               OpMemberDecorate %In0 0 Offset 0
+               OpDecorate %_arr_int_uint_512 ArrayStride 4
+               OpDecorate %x_17 NonWritable
+               OpDecorate %x_17 DescriptorSet 0
+               OpDecorate %x_17 Binding 0
+               OpDecorate %In1 Block
+               OpMemberDecorate %In1 0 Offset 0
+               OpDecorate %x_19 NonWritable
+               OpDecorate %x_19 DescriptorSet 0
+               OpDecorate %x_19 Binding 1
+               OpDecorate %tint_symbol BuiltIn WorkgroupId
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Private_v3uint = OpTypePointer Private %v3uint
+          %5 = OpConstantNull %v3uint
+%gl_WorkGroupID = OpVariable %_ptr_Private_v3uint Private %5
+        %int = OpTypeInt 32 1
+     %uint_8 = OpConstant %uint 8
+%_arr_int_uint_8 = OpTypeArray %int %uint_8
+        %In2 = OpTypeStruct %_arr_int_uint_8
+%_ptr_StorageBuffer_In2 = OpTypePointer StorageBuffer %In2
+       %x_13 = OpVariable %_ptr_StorageBuffer_In2 StorageBuffer
+  %uint_1024 = OpConstant %uint 1024
+%_arr_int_uint_1024 = OpTypeArray %int %uint_1024
+       %Out0 = OpTypeStruct %_arr_int_uint_1024
+%_ptr_StorageBuffer_Out0 = OpTypePointer StorageBuffer %Out0
+       %x_15 = OpVariable %_ptr_StorageBuffer_Out0 StorageBuffer
+   %uint_512 = OpConstant %uint 512
+%_arr_int_uint_512 = OpTypeArray %int %uint_512
+        %In0 = OpTypeStruct %_arr_int_uint_512
+%_ptr_StorageBuffer_In0 = OpTypePointer StorageBuffer %In0
+       %x_17 = OpVariable %_ptr_StorageBuffer_In0 StorageBuffer
+        %In1 = OpTypeStruct %_arr_int_uint_512
+%_ptr_StorageBuffer_In1 = OpTypePointer StorageBuffer %In1
+       %x_19 = OpVariable %_ptr_StorageBuffer_In1 StorageBuffer
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%tint_symbol = OpVariable %_ptr_Input_v3uint Input
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
+%_ptr_Function_uint = OpTypePointer Function %uint
+         %33 = OpConstantNull %uint
+%_ptr_Function_int = OpTypePointer Function %int
+         %37 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_uint = OpTypePointer Private %uint
+   %uint_128 = OpConstant %uint 128
+   %uint_256 = OpConstant %uint 256
+      %int_0 = OpConstant %int 0
+   %int_n128 = OpConstant %int -128
+    %int_256 = OpConstant %int 256
+       %bool = OpTypeBool
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+      %int_1 = OpConstant %int 1
+     %main_1 = OpFunction %void None %27
+         %30 = OpLabel
+%base_index_in = OpVariable %_ptr_Function_uint Function %33
+%base_index_out = OpVariable %_ptr_Function_uint Function %33
+  %index_in0 = OpVariable %_ptr_Function_int Function %37
+  %index_in1 = OpVariable %_ptr_Function_int Function %37
+ %index_out0 = OpVariable %_ptr_Function_int Function %37
+ %index_out1 = OpVariable %_ptr_Function_int Function %37
+%condition_index = OpVariable %_ptr_Function_int Function %37
+          %i = OpVariable %_ptr_Function_int Function %37
+      %temp0 = OpVariable %_ptr_Function_int Function %37
+      %temp1 = OpVariable %_ptr_Function_int Function %37
+         %47 = OpAccessChain %_ptr_Private_uint %gl_WorkGroupID %uint_0
+         %48 = OpLoad %uint %47
+         %50 = OpIMul %uint %uint_128 %48
+               OpStore %base_index_in %50
+         %51 = OpAccessChain %_ptr_Private_uint %gl_WorkGroupID %uint_0
+         %52 = OpLoad %uint %51
+         %54 = OpIMul %uint %uint_256 %52
+               OpStore %base_index_out %54
+               OpStore %index_in0 %int_0
+               OpStore %index_in1 %int_n128
+               OpStore %index_out0 %int_0
+               OpStore %index_out1 %int_n128
+               OpStore %condition_index %int_0
+               OpStore %i %int_0
+               OpBranch %57
+         %57 = OpLabel
+               OpLoopMerge %58 %59 None
+               OpBranch %60
+         %60 = OpLabel
+         %61 = OpLoad %int %i
+         %63 = OpSLessThan %bool %61 %int_256
+               OpSelectionMerge %65 None
+               OpBranchConditional %63 %66 %67
+         %66 = OpLabel
+               OpBranch %65
+         %67 = OpLabel
+               OpBranch %58
+         %65 = OpLabel
+         %68 = OpLoad %int %condition_index
+         %70 = OpAccessChain %_ptr_StorageBuffer_int %x_13 %uint_0 %68
+         %71 = OpLoad %int %70
+         %72 = OpIEqual %bool %71 %int_0
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %74 %75
+         %74 = OpLabel
+         %76 = OpLoad %uint %base_index_out
+         %77 = OpLoad %int %index_out0
+         %78 = OpLoad %uint %base_index_in
+         %79 = OpLoad %int %index_in0
+         %80 = OpBitcast %uint %79
+         %81 = OpIAdd %uint %78 %80
+         %82 = OpAccessChain %_ptr_StorageBuffer_int %x_17 %uint_0 %81
+         %83 = OpLoad %int %82
+         %84 = OpBitcast %uint %77
+         %85 = OpIAdd %uint %76 %84
+         %86 = OpAccessChain %_ptr_StorageBuffer_int %x_15 %uint_0 %85
+               OpStore %86 %83
+         %87 = OpLoad %int %index_out0
+         %89 = OpIAdd %int %87 %int_1
+               OpStore %index_out0 %89
+         %90 = OpLoad %int %index_in1
+         %91 = OpIAdd %int %90 %int_1
+               OpStore %index_in1 %91
+               OpBranch %73
+         %75 = OpLabel
+         %92 = OpLoad %uint %base_index_out
+         %93 = OpLoad %int %index_out1
+         %94 = OpLoad %uint %base_index_in
+         %95 = OpLoad %int %index_in1
+         %96 = OpBitcast %uint %95
+         %97 = OpIAdd %uint %94 %96
+         %98 = OpAccessChain %_ptr_StorageBuffer_int %x_19 %uint_0 %97
+         %99 = OpLoad %int %98
+        %100 = OpBitcast %uint %93
+        %101 = OpIAdd %uint %92 %100
+        %102 = OpAccessChain %_ptr_StorageBuffer_int %x_15 %uint_0 %101
+               OpStore %102 %99
+        %103 = OpLoad %int %index_out1
+        %104 = OpIAdd %int %103 %int_1
+               OpStore %index_out1 %104
+        %105 = OpLoad %int %index_in1
+        %106 = OpIAdd %int %105 %int_1
+               OpStore %index_in1 %106
+               OpBranch %73
+         %73 = OpLabel
+        %107 = OpLoad %int %condition_index
+        %108 = OpIAdd %int %107 %int_1
+        %109 = OpAccessChain %_ptr_StorageBuffer_int %x_13 %uint_0 %108
+        %110 = OpLoad %int %109
+        %111 = OpLoad %int %condition_index
+        %112 = OpIAdd %int %111 %110
+               OpStore %condition_index %112
+        %113 = OpLoad %int %index_in0
+               OpStore %temp0 %113
+        %114 = OpLoad %int %index_in1
+               OpStore %index_in0 %114
+        %115 = OpLoad %int %temp0
+               OpStore %index_in1 %115
+        %116 = OpLoad %int %index_out0
+               OpStore %temp1 %116
+        %117 = OpLoad %int %index_out1
+               OpStore %index_out0 %117
+        %118 = OpLoad %int %temp1
+               OpStore %index_out1 %118
+               OpBranch %59
+         %59 = OpLabel
+        %119 = OpLoad %int %i
+        %120 = OpIAdd %int %119 %int_1
+               OpStore %i %120
+               OpBranch %57
+         %58 = OpLabel
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %27
+        %122 = OpLabel
+        %123 = OpLoad %v3uint %tint_symbol
+               OpStore %gl_WorkGroupID %123
+        %124 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_underflow/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_underflow/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..6aa8659
--- /dev/null
+++ b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_underflow/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,120 @@
+type Arr = [[stride(4)]] array<i32, 8>;
+
+[[block]]
+struct In2 {
+  data_in2 : Arr;
+};
+
+type Arr_1 = [[stride(4)]] array<i32, 1024>;
+
+[[block]]
+struct Out0 {
+  data_out0 : Arr_1;
+};
+
+type Arr_2 = [[stride(4)]] array<i32, 512>;
+
+type Arr_3 = [[stride(4)]] array<i32, 512>;
+
+[[block]]
+struct In0 {
+  data_in0 : Arr_3;
+};
+
+[[block]]
+struct In1 {
+  data_in1 : Arr_3;
+};
+
+var<private> gl_WorkGroupID : vec3<u32>;
+
+[[group(0), binding(2)]] var<storage, read> x_13 : In2;
+
+[[group(0), binding(3)]] var<storage, read_write> x_15 : Out0;
+
+[[group(0), binding(0)]] var<storage, read> x_17 : In0;
+
+[[group(0), binding(1)]] var<storage, read> x_19 : In1;
+
+fn main_1() {
+  var base_index_in : u32;
+  var base_index_out : u32;
+  var index_in0 : i32;
+  var index_in1 : i32;
+  var index_out0 : i32;
+  var index_out1 : i32;
+  var condition_index : i32;
+  var i : i32;
+  var temp0 : i32;
+  var temp1 : i32;
+  let x_56 : u32 = gl_WorkGroupID.x;
+  base_index_in = (128u * x_56);
+  let x_59 : u32 = gl_WorkGroupID.x;
+  base_index_out = (256u * x_59);
+  index_in0 = 0;
+  index_in1 = -128;
+  index_out0 = 0;
+  index_out1 = -128;
+  condition_index = 0;
+  i = 0;
+  loop {
+    let x_65 : i32 = i;
+    if ((x_65 < 256)) {
+    } else {
+      break;
+    }
+    let x_68 : i32 = condition_index;
+    let x_70 : i32 = x_13.data_in2[x_68];
+    if ((x_70 == 0)) {
+      let x_75 : u32 = base_index_out;
+      let x_76 : i32 = index_out0;
+      let x_79 : u32 = base_index_in;
+      let x_80 : i32 = index_in0;
+      let x_84 : i32 = x_17.data_in0[(x_79 + bitcast<u32>(x_80))];
+      x_15.data_out0[(x_75 + bitcast<u32>(x_76))] = x_84;
+      let x_86 : i32 = index_out0;
+      index_out0 = (x_86 + 1);
+      let x_88 : i32 = index_in1;
+      index_in1 = (x_88 + 1);
+    } else {
+      let x_90 : u32 = base_index_out;
+      let x_91 : i32 = index_out1;
+      let x_94 : u32 = base_index_in;
+      let x_95 : i32 = index_in1;
+      let x_99 : i32 = x_19.data_in1[(x_94 + bitcast<u32>(x_95))];
+      x_15.data_out0[(x_90 + bitcast<u32>(x_91))] = x_99;
+      let x_101 : i32 = index_out1;
+      index_out1 = (x_101 + 1);
+      let x_103 : i32 = index_in1;
+      index_in1 = (x_103 + 1);
+    }
+    let x_105 : i32 = condition_index;
+    let x_108 : i32 = x_13.data_in2[(x_105 + 1)];
+    let x_109 : i32 = condition_index;
+    condition_index = (x_109 + x_108);
+    let x_111 : i32 = index_in0;
+    temp0 = x_111;
+    let x_112 : i32 = index_in1;
+    index_in0 = x_112;
+    let x_113 : i32 = temp0;
+    index_in1 = x_113;
+    let x_114 : i32 = index_out0;
+    temp1 = x_114;
+    let x_115 : i32 = index_out1;
+    index_out0 = x_115;
+    let x_116 : i32 = temp1;
+    index_out1 = x_116;
+
+    continuing {
+      let x_117 : i32 = i;
+      i = (x_117 + 1);
+    }
+  }
+  return;
+}
+
+[[stage(compute), workgroup_size(4, 1, 1)]]
+fn main([[builtin(workgroup_id)]] gl_WorkGroupID_param : vec3<u32>) {
+  gl_WorkGroupID = gl_WorkGroupID_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_underflow/0-opt.wgsl b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_underflow/0-opt.wgsl
new file mode 100644
index 0000000..6aa8659
--- /dev/null
+++ b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_underflow/0-opt.wgsl
@@ -0,0 +1,120 @@
+type Arr = [[stride(4)]] array<i32, 8>;
+
+[[block]]
+struct In2 {
+  data_in2 : Arr;
+};
+
+type Arr_1 = [[stride(4)]] array<i32, 1024>;
+
+[[block]]
+struct Out0 {
+  data_out0 : Arr_1;
+};
+
+type Arr_2 = [[stride(4)]] array<i32, 512>;
+
+type Arr_3 = [[stride(4)]] array<i32, 512>;
+
+[[block]]
+struct In0 {
+  data_in0 : Arr_3;
+};
+
+[[block]]
+struct In1 {
+  data_in1 : Arr_3;
+};
+
+var<private> gl_WorkGroupID : vec3<u32>;
+
+[[group(0), binding(2)]] var<storage, read> x_13 : In2;
+
+[[group(0), binding(3)]] var<storage, read_write> x_15 : Out0;
+
+[[group(0), binding(0)]] var<storage, read> x_17 : In0;
+
+[[group(0), binding(1)]] var<storage, read> x_19 : In1;
+
+fn main_1() {
+  var base_index_in : u32;
+  var base_index_out : u32;
+  var index_in0 : i32;
+  var index_in1 : i32;
+  var index_out0 : i32;
+  var index_out1 : i32;
+  var condition_index : i32;
+  var i : i32;
+  var temp0 : i32;
+  var temp1 : i32;
+  let x_56 : u32 = gl_WorkGroupID.x;
+  base_index_in = (128u * x_56);
+  let x_59 : u32 = gl_WorkGroupID.x;
+  base_index_out = (256u * x_59);
+  index_in0 = 0;
+  index_in1 = -128;
+  index_out0 = 0;
+  index_out1 = -128;
+  condition_index = 0;
+  i = 0;
+  loop {
+    let x_65 : i32 = i;
+    if ((x_65 < 256)) {
+    } else {
+      break;
+    }
+    let x_68 : i32 = condition_index;
+    let x_70 : i32 = x_13.data_in2[x_68];
+    if ((x_70 == 0)) {
+      let x_75 : u32 = base_index_out;
+      let x_76 : i32 = index_out0;
+      let x_79 : u32 = base_index_in;
+      let x_80 : i32 = index_in0;
+      let x_84 : i32 = x_17.data_in0[(x_79 + bitcast<u32>(x_80))];
+      x_15.data_out0[(x_75 + bitcast<u32>(x_76))] = x_84;
+      let x_86 : i32 = index_out0;
+      index_out0 = (x_86 + 1);
+      let x_88 : i32 = index_in1;
+      index_in1 = (x_88 + 1);
+    } else {
+      let x_90 : u32 = base_index_out;
+      let x_91 : i32 = index_out1;
+      let x_94 : u32 = base_index_in;
+      let x_95 : i32 = index_in1;
+      let x_99 : i32 = x_19.data_in1[(x_94 + bitcast<u32>(x_95))];
+      x_15.data_out0[(x_90 + bitcast<u32>(x_91))] = x_99;
+      let x_101 : i32 = index_out1;
+      index_out1 = (x_101 + 1);
+      let x_103 : i32 = index_in1;
+      index_in1 = (x_103 + 1);
+    }
+    let x_105 : i32 = condition_index;
+    let x_108 : i32 = x_13.data_in2[(x_105 + 1)];
+    let x_109 : i32 = condition_index;
+    condition_index = (x_109 + x_108);
+    let x_111 : i32 = index_in0;
+    temp0 = x_111;
+    let x_112 : i32 = index_in1;
+    index_in0 = x_112;
+    let x_113 : i32 = temp0;
+    index_in1 = x_113;
+    let x_114 : i32 = index_out0;
+    temp1 = x_114;
+    let x_115 : i32 = index_out1;
+    index_out0 = x_115;
+    let x_116 : i32 = temp1;
+    index_out1 = x_116;
+
+    continuing {
+      let x_117 : i32 = i;
+      i = (x_117 + 1);
+    }
+  }
+  return;
+}
+
+[[stage(compute), workgroup_size(4, 1, 1)]]
+fn main([[builtin(workgroup_id)]] gl_WorkGroupID_param : vec3<u32>) {
+  gl_WorkGroupID = gl_WorkGroupID_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_underflow/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_underflow/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..df55b6b
--- /dev/null
+++ b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_underflow/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,69 @@
+static uint3 gl_WorkGroupID = uint3(0u, 0u, 0u);
+ByteAddressBuffer x_13 : register(t2, space0);
+RWByteAddressBuffer x_15 : register(u3, space0);
+ByteAddressBuffer x_17 : register(t0, space0);
+ByteAddressBuffer x_19 : register(t1, space0);
+
+void main_1() {
+  uint base_index_in = 0u;
+  uint base_index_out = 0u;
+  int index_in0 = 0;
+  int index_in1 = 0;
+  int index_out0 = 0;
+  int index_out1 = 0;
+  int condition_index = 0;
+  int i = 0;
+  int temp0 = 0;
+  int temp1 = 0;
+  const uint x_56 = gl_WorkGroupID.x;
+  base_index_in = (128u * x_56);
+  const uint x_59 = gl_WorkGroupID.x;
+  base_index_out = (256u * x_59);
+  index_in0 = 0;
+  index_in1 = -128;
+  index_out0 = 0;
+  index_out1 = -128;
+  condition_index = 0;
+  i = 0;
+  {
+    for(; (i < 256); i = (i + 1)) {
+      const int x_70 = asint(x_13.Load((4u * uint(condition_index))));
+      if ((x_70 == 0)) {
+        const uint x_75 = base_index_out;
+        const int x_76 = index_out0;
+        const int x_84 = asint(x_17.Load((4u * (base_index_in + asuint(index_in0)))));
+        x_15.Store((4u * (x_75 + asuint(x_76))), asuint(x_84));
+        index_out0 = (index_out0 + 1);
+        index_in1 = (index_in1 + 1);
+      } else {
+        const uint x_90 = base_index_out;
+        const int x_91 = index_out1;
+        const int x_99 = asint(x_19.Load((4u * (base_index_in + asuint(index_in1)))));
+        x_15.Store((4u * (x_90 + asuint(x_91))), asuint(x_99));
+        index_out1 = (index_out1 + 1);
+        index_in1 = (index_in1 + 1);
+      }
+      const int x_108 = asint(x_13.Load((4u * uint((condition_index + 1)))));
+      condition_index = (condition_index + x_108);
+      temp0 = index_in0;
+      index_in0 = index_in1;
+      index_in1 = temp0;
+      temp1 = index_out0;
+      index_out0 = index_out1;
+      index_out1 = temp1;
+    }
+  }
+  return;
+}
+
+struct tint_symbol_1 {
+  uint3 gl_WorkGroupID_param : SV_GroupID;
+};
+
+[numthreads(4, 1, 1)]
+void main(tint_symbol_1 tint_symbol) {
+  const uint3 gl_WorkGroupID_param = tint_symbol.gl_WorkGroupID_param;
+  gl_WorkGroupID = gl_WorkGroupID_param;
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_underflow/0-opt.wgsl.expected.msl b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_underflow/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..734a346
--- /dev/null
+++ b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_underflow/0-opt.wgsl.expected.msl
@@ -0,0 +1,108 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+  /* 0x0000 */ int arr[8];
+};
+struct In2 {
+  /* 0x0000 */ tint_array_wrapper data_in2;
+};
+struct tint_array_wrapper_1 {
+  /* 0x0000 */ int arr[1024];
+};
+struct Out0 {
+  /* 0x0000 */ tint_array_wrapper_1 data_out0;
+};
+struct tint_array_wrapper_2 {
+  /* 0x0000 */ int arr[512];
+};
+struct In0 {
+  /* 0x0000 */ tint_array_wrapper_2 data_in0;
+};
+struct In1 {
+  /* 0x0000 */ tint_array_wrapper_2 data_in1;
+};
+
+void main_1(const device In2& x_13, const device In0& x_17, device Out0& x_15, const device In1& x_19, thread uint3* const tint_symbol_2) {
+  uint base_index_in = 0u;
+  uint base_index_out = 0u;
+  int index_in0 = 0;
+  int index_in1 = 0;
+  int index_out0 = 0;
+  int index_out1 = 0;
+  int condition_index = 0;
+  int i = 0;
+  int temp0 = 0;
+  int temp1 = 0;
+  uint const x_56 = (*(tint_symbol_2)).x;
+  base_index_in = (128u * x_56);
+  uint const x_59 = (*(tint_symbol_2)).x;
+  base_index_out = (256u * x_59);
+  index_in0 = 0;
+  index_in1 = -128;
+  index_out0 = 0;
+  index_out1 = -128;
+  condition_index = 0;
+  i = 0;
+  while (true) {
+    int const x_65 = i;
+    if ((x_65 < 256)) {
+    } else {
+      break;
+    }
+    int const x_68 = condition_index;
+    int const x_70 = x_13.data_in2.arr[x_68];
+    if ((x_70 == 0)) {
+      uint const x_75 = base_index_out;
+      int const x_76 = index_out0;
+      uint const x_79 = base_index_in;
+      int const x_80 = index_in0;
+      int const x_84 = x_17.data_in0.arr[(x_79 + as_type<uint>(x_80))];
+      x_15.data_out0.arr[(x_75 + as_type<uint>(x_76))] = x_84;
+      int const x_86 = index_out0;
+      index_out0 = (x_86 + 1);
+      int const x_88 = index_in1;
+      index_in1 = (x_88 + 1);
+    } else {
+      uint const x_90 = base_index_out;
+      int const x_91 = index_out1;
+      uint const x_94 = base_index_in;
+      int const x_95 = index_in1;
+      int const x_99 = x_19.data_in1.arr[(x_94 + as_type<uint>(x_95))];
+      x_15.data_out0.arr[(x_90 + as_type<uint>(x_91))] = x_99;
+      int const x_101 = index_out1;
+      index_out1 = (x_101 + 1);
+      int const x_103 = index_in1;
+      index_in1 = (x_103 + 1);
+    }
+    int const x_105 = condition_index;
+    int const x_108 = x_13.data_in2.arr[(x_105 + 1)];
+    int const x_109 = condition_index;
+    condition_index = (x_109 + x_108);
+    int const x_111 = index_in0;
+    temp0 = x_111;
+    int const x_112 = index_in1;
+    index_in0 = x_112;
+    int const x_113 = temp0;
+    index_in1 = x_113;
+    int const x_114 = index_out0;
+    temp1 = x_114;
+    int const x_115 = index_out1;
+    index_out0 = x_115;
+    int const x_116 = temp1;
+    index_out1 = x_116;
+    {
+      int const x_117 = i;
+      i = (x_117 + 1);
+    }
+  }
+  return;
+}
+
+kernel void tint_symbol(uint3 gl_WorkGroupID_param [[threadgroup_position_in_grid]], const device In2& x_13 [[buffer(2)]], const device In0& x_17 [[buffer(0)]], device Out0& x_15 [[buffer(3)]], const device In1& x_19 [[buffer(1)]]) {
+  thread uint3 tint_symbol_3 = 0u;
+  tint_symbol_3 = gl_WorkGroupID_param;
+  main_1(x_13, x_17, x_15, x_19, &(tint_symbol_3));
+  return;
+}
+
diff --git a/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_underflow/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_underflow/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..fd4ea43
--- /dev/null
+++ b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_underflow/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,222 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 125
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main" %tint_symbol
+               OpExecutionMode %main LocalSize 4 1 1
+               OpName %gl_WorkGroupID "gl_WorkGroupID"
+               OpName %In2 "In2"
+               OpMemberName %In2 0 "data_in2"
+               OpName %x_13 "x_13"
+               OpName %Out0 "Out0"
+               OpMemberName %Out0 0 "data_out0"
+               OpName %x_15 "x_15"
+               OpName %In0 "In0"
+               OpMemberName %In0 0 "data_in0"
+               OpName %x_17 "x_17"
+               OpName %In1 "In1"
+               OpMemberName %In1 0 "data_in1"
+               OpName %x_19 "x_19"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main_1 "main_1"
+               OpName %base_index_in "base_index_in"
+               OpName %base_index_out "base_index_out"
+               OpName %index_in0 "index_in0"
+               OpName %index_in1 "index_in1"
+               OpName %index_out0 "index_out0"
+               OpName %index_out1 "index_out1"
+               OpName %condition_index "condition_index"
+               OpName %i "i"
+               OpName %temp0 "temp0"
+               OpName %temp1 "temp1"
+               OpName %main "main"
+               OpDecorate %In2 Block
+               OpMemberDecorate %In2 0 Offset 0
+               OpDecorate %_arr_int_uint_8 ArrayStride 4
+               OpDecorate %x_13 NonWritable
+               OpDecorate %x_13 DescriptorSet 0
+               OpDecorate %x_13 Binding 2
+               OpDecorate %Out0 Block
+               OpMemberDecorate %Out0 0 Offset 0
+               OpDecorate %_arr_int_uint_1024 ArrayStride 4
+               OpDecorate %x_15 DescriptorSet 0
+               OpDecorate %x_15 Binding 3
+               OpDecorate %In0 Block
+               OpMemberDecorate %In0 0 Offset 0
+               OpDecorate %_arr_int_uint_512 ArrayStride 4
+               OpDecorate %x_17 NonWritable
+               OpDecorate %x_17 DescriptorSet 0
+               OpDecorate %x_17 Binding 0
+               OpDecorate %In1 Block
+               OpMemberDecorate %In1 0 Offset 0
+               OpDecorate %x_19 NonWritable
+               OpDecorate %x_19 DescriptorSet 0
+               OpDecorate %x_19 Binding 1
+               OpDecorate %tint_symbol BuiltIn WorkgroupId
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Private_v3uint = OpTypePointer Private %v3uint
+          %5 = OpConstantNull %v3uint
+%gl_WorkGroupID = OpVariable %_ptr_Private_v3uint Private %5
+        %int = OpTypeInt 32 1
+     %uint_8 = OpConstant %uint 8
+%_arr_int_uint_8 = OpTypeArray %int %uint_8
+        %In2 = OpTypeStruct %_arr_int_uint_8
+%_ptr_StorageBuffer_In2 = OpTypePointer StorageBuffer %In2
+       %x_13 = OpVariable %_ptr_StorageBuffer_In2 StorageBuffer
+  %uint_1024 = OpConstant %uint 1024
+%_arr_int_uint_1024 = OpTypeArray %int %uint_1024
+       %Out0 = OpTypeStruct %_arr_int_uint_1024
+%_ptr_StorageBuffer_Out0 = OpTypePointer StorageBuffer %Out0
+       %x_15 = OpVariable %_ptr_StorageBuffer_Out0 StorageBuffer
+   %uint_512 = OpConstant %uint 512
+%_arr_int_uint_512 = OpTypeArray %int %uint_512
+        %In0 = OpTypeStruct %_arr_int_uint_512
+%_ptr_StorageBuffer_In0 = OpTypePointer StorageBuffer %In0
+       %x_17 = OpVariable %_ptr_StorageBuffer_In0 StorageBuffer
+        %In1 = OpTypeStruct %_arr_int_uint_512
+%_ptr_StorageBuffer_In1 = OpTypePointer StorageBuffer %In1
+       %x_19 = OpVariable %_ptr_StorageBuffer_In1 StorageBuffer
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%tint_symbol = OpVariable %_ptr_Input_v3uint Input
+       %void = OpTypeVoid
+         %27 = OpTypeFunction %void
+%_ptr_Function_uint = OpTypePointer Function %uint
+         %33 = OpConstantNull %uint
+%_ptr_Function_int = OpTypePointer Function %int
+         %37 = OpConstantNull %int
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_uint = OpTypePointer Private %uint
+   %uint_128 = OpConstant %uint 128
+   %uint_256 = OpConstant %uint 256
+      %int_0 = OpConstant %int 0
+   %int_n128 = OpConstant %int -128
+    %int_256 = OpConstant %int 256
+       %bool = OpTypeBool
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+      %int_1 = OpConstant %int 1
+     %main_1 = OpFunction %void None %27
+         %30 = OpLabel
+%base_index_in = OpVariable %_ptr_Function_uint Function %33
+%base_index_out = OpVariable %_ptr_Function_uint Function %33
+  %index_in0 = OpVariable %_ptr_Function_int Function %37
+  %index_in1 = OpVariable %_ptr_Function_int Function %37
+ %index_out0 = OpVariable %_ptr_Function_int Function %37
+ %index_out1 = OpVariable %_ptr_Function_int Function %37
+%condition_index = OpVariable %_ptr_Function_int Function %37
+          %i = OpVariable %_ptr_Function_int Function %37
+      %temp0 = OpVariable %_ptr_Function_int Function %37
+      %temp1 = OpVariable %_ptr_Function_int Function %37
+         %47 = OpAccessChain %_ptr_Private_uint %gl_WorkGroupID %uint_0
+         %48 = OpLoad %uint %47
+         %50 = OpIMul %uint %uint_128 %48
+               OpStore %base_index_in %50
+         %51 = OpAccessChain %_ptr_Private_uint %gl_WorkGroupID %uint_0
+         %52 = OpLoad %uint %51
+         %54 = OpIMul %uint %uint_256 %52
+               OpStore %base_index_out %54
+               OpStore %index_in0 %int_0
+               OpStore %index_in1 %int_n128
+               OpStore %index_out0 %int_0
+               OpStore %index_out1 %int_n128
+               OpStore %condition_index %int_0
+               OpStore %i %int_0
+               OpBranch %57
+         %57 = OpLabel
+               OpLoopMerge %58 %59 None
+               OpBranch %60
+         %60 = OpLabel
+         %61 = OpLoad %int %i
+         %63 = OpSLessThan %bool %61 %int_256
+               OpSelectionMerge %65 None
+               OpBranchConditional %63 %66 %67
+         %66 = OpLabel
+               OpBranch %65
+         %67 = OpLabel
+               OpBranch %58
+         %65 = OpLabel
+         %68 = OpLoad %int %condition_index
+         %70 = OpAccessChain %_ptr_StorageBuffer_int %x_13 %uint_0 %68
+         %71 = OpLoad %int %70
+         %72 = OpIEqual %bool %71 %int_0
+               OpSelectionMerge %73 None
+               OpBranchConditional %72 %74 %75
+         %74 = OpLabel
+         %76 = OpLoad %uint %base_index_out
+         %77 = OpLoad %int %index_out0
+         %78 = OpLoad %uint %base_index_in
+         %79 = OpLoad %int %index_in0
+         %80 = OpBitcast %uint %79
+         %81 = OpIAdd %uint %78 %80
+         %82 = OpAccessChain %_ptr_StorageBuffer_int %x_17 %uint_0 %81
+         %83 = OpLoad %int %82
+         %84 = OpBitcast %uint %77
+         %85 = OpIAdd %uint %76 %84
+         %86 = OpAccessChain %_ptr_StorageBuffer_int %x_15 %uint_0 %85
+               OpStore %86 %83
+         %87 = OpLoad %int %index_out0
+         %89 = OpIAdd %int %87 %int_1
+               OpStore %index_out0 %89
+         %90 = OpLoad %int %index_in1
+         %91 = OpIAdd %int %90 %int_1
+               OpStore %index_in1 %91
+               OpBranch %73
+         %75 = OpLabel
+         %92 = OpLoad %uint %base_index_out
+         %93 = OpLoad %int %index_out1
+         %94 = OpLoad %uint %base_index_in
+         %95 = OpLoad %int %index_in1
+         %96 = OpBitcast %uint %95
+         %97 = OpIAdd %uint %94 %96
+         %98 = OpAccessChain %_ptr_StorageBuffer_int %x_19 %uint_0 %97
+         %99 = OpLoad %int %98
+        %100 = OpBitcast %uint %93
+        %101 = OpIAdd %uint %92 %100
+        %102 = OpAccessChain %_ptr_StorageBuffer_int %x_15 %uint_0 %101
+               OpStore %102 %99
+        %103 = OpLoad %int %index_out1
+        %104 = OpIAdd %int %103 %int_1
+               OpStore %index_out1 %104
+        %105 = OpLoad %int %index_in1
+        %106 = OpIAdd %int %105 %int_1
+               OpStore %index_in1 %106
+               OpBranch %73
+         %73 = OpLabel
+        %107 = OpLoad %int %condition_index
+        %108 = OpIAdd %int %107 %int_1
+        %109 = OpAccessChain %_ptr_StorageBuffer_int %x_13 %uint_0 %108
+        %110 = OpLoad %int %109
+        %111 = OpLoad %int %condition_index
+        %112 = OpIAdd %int %111 %110
+               OpStore %condition_index %112
+        %113 = OpLoad %int %index_in0
+               OpStore %temp0 %113
+        %114 = OpLoad %int %index_in1
+               OpStore %index_in0 %114
+        %115 = OpLoad %int %temp0
+               OpStore %index_in1 %115
+        %116 = OpLoad %int %index_out0
+               OpStore %temp1 %116
+        %117 = OpLoad %int %index_out1
+               OpStore %index_out0 %117
+        %118 = OpLoad %int %temp1
+               OpStore %index_out1 %118
+               OpBranch %59
+         %59 = OpLabel
+        %119 = OpLoad %int %i
+        %120 = OpIAdd %int %119 %int_1
+               OpStore %i %120
+               OpBranch %57
+         %58 = OpLabel
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %27
+        %122 = OpLabel
+        %123 = OpLoad %v3uint %tint_symbol
+               OpStore %gl_WorkGroupID %123
+        %124 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_underflow/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_underflow/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..6aa8659
--- /dev/null
+++ b/test/vk-gl-cts/non_robust_buffer_access/unexecuted_oob_underflow/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,120 @@
+type Arr = [[stride(4)]] array<i32, 8>;
+
+[[block]]
+struct In2 {
+  data_in2 : Arr;
+};
+
+type Arr_1 = [[stride(4)]] array<i32, 1024>;
+
+[[block]]
+struct Out0 {
+  data_out0 : Arr_1;
+};
+
+type Arr_2 = [[stride(4)]] array<i32, 512>;
+
+type Arr_3 = [[stride(4)]] array<i32, 512>;
+
+[[block]]
+struct In0 {
+  data_in0 : Arr_3;
+};
+
+[[block]]
+struct In1 {
+  data_in1 : Arr_3;
+};
+
+var<private> gl_WorkGroupID : vec3<u32>;
+
+[[group(0), binding(2)]] var<storage, read> x_13 : In2;
+
+[[group(0), binding(3)]] var<storage, read_write> x_15 : Out0;
+
+[[group(0), binding(0)]] var<storage, read> x_17 : In0;
+
+[[group(0), binding(1)]] var<storage, read> x_19 : In1;
+
+fn main_1() {
+  var base_index_in : u32;
+  var base_index_out : u32;
+  var index_in0 : i32;
+  var index_in1 : i32;
+  var index_out0 : i32;
+  var index_out1 : i32;
+  var condition_index : i32;
+  var i : i32;
+  var temp0 : i32;
+  var temp1 : i32;
+  let x_56 : u32 = gl_WorkGroupID.x;
+  base_index_in = (128u * x_56);
+  let x_59 : u32 = gl_WorkGroupID.x;
+  base_index_out = (256u * x_59);
+  index_in0 = 0;
+  index_in1 = -128;
+  index_out0 = 0;
+  index_out1 = -128;
+  condition_index = 0;
+  i = 0;
+  loop {
+    let x_65 : i32 = i;
+    if ((x_65 < 256)) {
+    } else {
+      break;
+    }
+    let x_68 : i32 = condition_index;
+    let x_70 : i32 = x_13.data_in2[x_68];
+    if ((x_70 == 0)) {
+      let x_75 : u32 = base_index_out;
+      let x_76 : i32 = index_out0;
+      let x_79 : u32 = base_index_in;
+      let x_80 : i32 = index_in0;
+      let x_84 : i32 = x_17.data_in0[(x_79 + bitcast<u32>(x_80))];
+      x_15.data_out0[(x_75 + bitcast<u32>(x_76))] = x_84;
+      let x_86 : i32 = index_out0;
+      index_out0 = (x_86 + 1);
+      let x_88 : i32 = index_in1;
+      index_in1 = (x_88 + 1);
+    } else {
+      let x_90 : u32 = base_index_out;
+      let x_91 : i32 = index_out1;
+      let x_94 : u32 = base_index_in;
+      let x_95 : i32 = index_in1;
+      let x_99 : i32 = x_19.data_in1[(x_94 + bitcast<u32>(x_95))];
+      x_15.data_out0[(x_90 + bitcast<u32>(x_91))] = x_99;
+      let x_101 : i32 = index_out1;
+      index_out1 = (x_101 + 1);
+      let x_103 : i32 = index_in1;
+      index_in1 = (x_103 + 1);
+    }
+    let x_105 : i32 = condition_index;
+    let x_108 : i32 = x_13.data_in2[(x_105 + 1)];
+    let x_109 : i32 = condition_index;
+    condition_index = (x_109 + x_108);
+    let x_111 : i32 = index_in0;
+    temp0 = x_111;
+    let x_112 : i32 = index_in1;
+    index_in0 = x_112;
+    let x_113 : i32 = temp0;
+    index_in1 = x_113;
+    let x_114 : i32 = index_out0;
+    temp1 = x_114;
+    let x_115 : i32 = index_out1;
+    index_out0 = x_115;
+    let x_116 : i32 = temp1;
+    index_out1 = x_116;
+
+    continuing {
+      let x_117 : i32 = i;
+      i = (x_117 + 1);
+    }
+  }
+  return;
+}
+
+[[stage(compute), workgroup_size(4, 1, 1)]]
+fn main([[builtin(workgroup_id)]] gl_WorkGroupID_param : vec3<u32>) {
+  gl_WorkGroupID = gl_WorkGroupID_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/rasterization/line_continuity/line-strip/0.spvasm b/test/vk-gl-cts/rasterization/line_continuity/line-strip/0.spvasm
new file mode 100644
index 0000000..38520f7
--- /dev/null
+++ b/test/vk-gl-cts/rasterization/line_continuity/line-strip/0.spvasm
@@ -0,0 +1,22 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %color
+               OpExecutionMode %main OriginUpperLeft
+               OpSource GLSL 430
+               OpName %main "main"
+               OpName %color "color"
+               OpDecorate %color Location 0
+       %void = OpTypeVoid
+          %5 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+      %color = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+         %10 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+       %main = OpFunction %void None %5
+         %11 = OpLabel
+               OpStore %color %10
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/rasterization/line_continuity/line-strip/0.spvasm.expected.hlsl b/test/vk-gl-cts/rasterization/line_continuity/line-strip/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..bd7ca9f
--- /dev/null
+++ b/test/vk-gl-cts/rasterization/line_continuity/line-strip/0.spvasm.expected.hlsl
@@ -0,0 +1,20 @@
+static float4 color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  return;
+}
+
+struct main_out {
+  float4 color_1;
+};
+struct tint_symbol {
+  float4 color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/rasterization/line_continuity/line-strip/0.spvasm.expected.msl b/test/vk-gl-cts/rasterization/line_continuity/line-strip/0.spvasm.expected.msl
new file mode 100644
index 0000000..8c9629d
--- /dev/null
+++ b/test/vk-gl-cts/rasterization/line_continuity/line-strip/0.spvasm.expected.msl
@@ -0,0 +1,23 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 color_1;
+};
+struct tint_symbol_1 {
+  float4 color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  *(tint_symbol_4) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.color_1=tint_symbol_2.color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/rasterization/line_continuity/line-strip/0.spvasm.expected.spvasm b/test/vk-gl-cts/rasterization/line_continuity/line-strip/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..7964ca8
--- /dev/null
+++ b/test/vk-gl-cts/rasterization/line_continuity/line-strip/0.spvasm.expected.spvasm
@@ -0,0 +1,52 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 26
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %color "color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+      %color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+    %float_1 = OpConstant %float 1
+         %13 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+         %14 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+               OpStore %color %13
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %14
+%tint_symbol = OpFunctionParameter %main_out
+         %18 = OpLabel
+         %19 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %19
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %21 = OpLabel
+         %22 = OpFunctionCall %void %main_1
+         %24 = OpLoad %v4float %color
+         %25 = OpCompositeConstruct %main_out %24
+         %23 = OpFunctionCall %void %tint_symbol_2 %25
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/rasterization/line_continuity/line-strip/0.spvasm.expected.wgsl b/test/vk-gl-cts/rasterization/line_continuity/line-strip/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..c1d101c
--- /dev/null
+++ b/test/vk-gl-cts/rasterization/line_continuity/line-strip/0.spvasm.expected.wgsl
@@ -0,0 +1,17 @@
+var<private> color : vec4<f32>;
+
+fn main_1() {
+  color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(color);
+}
diff --git a/test/vk-gl-cts/rasterization/line_continuity/line-strip/0.wgsl b/test/vk-gl-cts/rasterization/line_continuity/line-strip/0.wgsl
new file mode 100644
index 0000000..c1d101c
--- /dev/null
+++ b/test/vk-gl-cts/rasterization/line_continuity/line-strip/0.wgsl
@@ -0,0 +1,17 @@
+var<private> color : vec4<f32>;
+
+fn main_1() {
+  color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(color);
+}
diff --git a/test/vk-gl-cts/rasterization/line_continuity/line-strip/0.wgsl.expected.hlsl b/test/vk-gl-cts/rasterization/line_continuity/line-strip/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..bd7ca9f
--- /dev/null
+++ b/test/vk-gl-cts/rasterization/line_continuity/line-strip/0.wgsl.expected.hlsl
@@ -0,0 +1,20 @@
+static float4 color = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  return;
+}
+
+struct main_out {
+  float4 color_1;
+};
+struct tint_symbol {
+  float4 color_1 : SV_Target0;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {color};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.color_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/rasterization/line_continuity/line-strip/0.wgsl.expected.msl b/test/vk-gl-cts/rasterization/line_continuity/line-strip/0.wgsl.expected.msl
new file mode 100644
index 0000000..8c9629d
--- /dev/null
+++ b/test/vk-gl-cts/rasterization/line_continuity/line-strip/0.wgsl.expected.msl
@@ -0,0 +1,23 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 color_1;
+};
+struct tint_symbol_1 {
+  float4 color_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_4) {
+  *(tint_symbol_4) = float4(1.0f, 1.0f, 1.0f, 1.0f);
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_5 = 0.0f;
+  main_1(&(tint_symbol_5));
+  main_out const tint_symbol_2 = {.color_1=tint_symbol_5};
+  tint_symbol_1 const tint_symbol_3 = {.color_1=tint_symbol_2.color_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/rasterization/line_continuity/line-strip/0.wgsl.expected.spvasm b/test/vk-gl-cts/rasterization/line_continuity/line-strip/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..7964ca8
--- /dev/null
+++ b/test/vk-gl-cts/rasterization/line_continuity/line-strip/0.wgsl.expected.spvasm
@@ -0,0 +1,52 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 26
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1
+               OpExecutionMode %main OriginUpperLeft
+               OpName %color "color"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "color_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+      %color = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+    %float_1 = OpConstant %float 1
+         %13 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+   %main_out = OpTypeStruct %v4float
+         %14 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %8
+         %11 = OpLabel
+               OpStore %color %13
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %14
+%tint_symbol = OpFunctionParameter %main_out
+         %18 = OpLabel
+         %19 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %19
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %8
+         %21 = OpLabel
+         %22 = OpFunctionCall %void %main_1
+         %24 = OpLoad %v4float %color
+         %25 = OpCompositeConstruct %main_out %24
+         %23 = OpFunctionCall %void %tint_symbol_2 %25
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/rasterization/line_continuity/line-strip/0.wgsl.expected.wgsl b/test/vk-gl-cts/rasterization/line_continuity/line-strip/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..c1d101c
--- /dev/null
+++ b/test/vk-gl-cts/rasterization/line_continuity/line-strip/0.wgsl.expected.wgsl
@@ -0,0 +1,17 @@
+var<private> color : vec4<f32>;
+
+fn main_1() {
+  color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  color_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(color);
+}
diff --git a/test/vk-gl-cts/rasterization/line_continuity/line-strip/1.spvasm b/test/vk-gl-cts/rasterization/line_continuity/line-strip/1.spvasm
new file mode 100644
index 0000000..5b5e77b
--- /dev/null
+++ b/test/vk-gl-cts/rasterization/line_continuity/line-strip/1.spvasm
@@ -0,0 +1,39 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %color_out %gl_FragCoord
+               OpExecutionMode %main OriginUpperLeft
+               OpSource GLSL 430
+               OpName %main "main"
+               OpName %color_out "color_out"
+               OpName %texture "texture"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpDecorate %color_out Location 0
+               OpDecorate %texture DescriptorSet 0
+               OpDecorate %texture Binding 0
+               OpDecorate %texture NonWritable
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+  %color_out = OpVariable %_ptr_Output_v4float Output
+         %11 = OpTypeImage %float 2D 0 0 0 2 Rgba8
+%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
+    %texture = OpVariable %_ptr_UniformConstant_11 UniformConstant
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+    %v2float = OpTypeVector %float 2
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+       %main = OpFunction %void None %7
+         %17 = OpLabel
+         %18 = OpLoad %11 %texture
+         %19 = OpLoad %v4float %gl_FragCoord
+         %20 = OpVectorShuffle %v2float %19 %19 0 1
+         %21 = OpConvertFToS %v2int %20
+         %22 = OpImageRead %v4float %18 %21
+               OpStore %color_out %22
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/rasterization/line_continuity/line-strip/1.spvasm.expected.hlsl b/test/vk-gl-cts/rasterization/line_continuity/line-strip/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..64748f3
--- /dev/null
+++ b/test/vk-gl-cts/rasterization/line_continuity/line-strip/1.spvasm.expected.hlsl
@@ -0,0 +1,29 @@
+static float4 color_out = float4(0.0f, 0.0f, 0.0f, 0.0f);
+Texture2D<float4> tint_symbol : register(t0, space0);
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const float4 x_19 = gl_FragCoord;
+  const float4 x_22 = tint_symbol.Load(int3(float2(x_19.x, x_19.y), 0));
+  color_out = x_22;
+  return;
+}
+
+struct main_out {
+  float4 color_out_1;
+};
+struct tint_symbol_2 {
+  float4 gl_FragCoord_param : SV_Position;
+};
+struct tint_symbol_3 {
+  float4 color_out_1 : SV_Target0;
+};
+
+tint_symbol_3 main(tint_symbol_2 tint_symbol_1) {
+  const float4 gl_FragCoord_param = tint_symbol_1.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_4 = {color_out};
+  const tint_symbol_3 tint_symbol_5 = {tint_symbol_4.color_out_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/rasterization/line_continuity/line-strip/1.spvasm.expected.msl b/test/vk-gl-cts/rasterization/line_continuity/line-strip/1.spvasm.expected.msl
new file mode 100644
index 0000000..43e2437
--- /dev/null
+++ b/test/vk-gl-cts/rasterization/line_continuity/line-strip/1.spvasm.expected.msl
@@ -0,0 +1,27 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 color_out_1;
+};
+struct tint_symbol_3 {
+  float4 color_out_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_6, texture2d<float, access::read> tint_symbol_7, thread float4* const tint_symbol_8) {
+  float4 const x_19 = *(tint_symbol_6);
+  float4 const x_22 = tint_symbol_7.read(uint2(int2(float2(x_19.x, x_19.y))));
+  *(tint_symbol_8) = x_22;
+  return;
+}
+
+fragment tint_symbol_3 tint_symbol_1(texture2d<float, access::read> tint_symbol_10 [[texture(0)]], float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_9 = 0.0f;
+  thread float4 tint_symbol_11 = 0.0f;
+  tint_symbol_9 = gl_FragCoord_param;
+  main_1(&(tint_symbol_9), tint_symbol_10, &(tint_symbol_11));
+  main_out const tint_symbol_4 = {.color_out_1=tint_symbol_11};
+  tint_symbol_3 const tint_symbol_5 = {.color_out_1=tint_symbol_4.color_out_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/rasterization/line_continuity/line-strip/1.spvasm.expected.spvasm b/test/vk-gl-cts/rasterization/line_continuity/line-strip/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..5055955
--- /dev/null
+++ b/test/vk-gl-cts/rasterization/line_continuity/line-strip/1.spvasm.expected.spvasm
@@ -0,0 +1,75 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 41
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %color_out "color_out"
+               OpName %texture "texture"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "color_out_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %texture NonWritable
+               OpDecorate %texture DescriptorSet 0
+               OpDecorate %texture Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+  %color_out = OpVariable %_ptr_Private_v4float Private %5
+          %8 = OpTypeImage %float 2D 0 0 0 2 Rgba8
+%_ptr_UniformConstant_8 = OpTypePointer UniformConstant %8
+    %texture = OpVariable %_ptr_UniformConstant_8 UniformConstant
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+    %v2float = OpTypeVector %float 2
+   %main_out = OpTypeStruct %v4float
+         %28 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+         %18 = OpLoad %v4float %gl_FragCoord
+         %20 = OpLoad %8 %texture
+         %25 = OpCompositeExtract %float %18 0
+         %26 = OpCompositeExtract %float %18 1
+         %27 = OpCompositeConstruct %v2float %25 %26
+         %21 = OpConvertFToS %v2int %27
+         %19 = OpImageRead %v4float %20 %21
+               OpStore %color_out %19
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %28
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %32 = OpLabel
+         %33 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %33
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %35 = OpLabel
+         %36 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %36
+         %37 = OpFunctionCall %void %main_1
+         %39 = OpLoad %v4float %color_out
+         %40 = OpCompositeConstruct %main_out %39
+         %38 = OpFunctionCall %void %tint_symbol_3 %40
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/rasterization/line_continuity/line-strip/1.spvasm.expected.wgsl b/test/vk-gl-cts/rasterization/line_continuity/line-strip/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..85b125f
--- /dev/null
+++ b/test/vk-gl-cts/rasterization/line_continuity/line-strip/1.spvasm.expected.wgsl
@@ -0,0 +1,24 @@
+var<private> color_out : vec4<f32>;
+
+[[group(0), binding(0)]] var texture : texture_storage_2d<rgba8unorm, read>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  let x_19 : vec4<f32> = gl_FragCoord;
+  let x_22 : vec4<f32> = textureLoad(texture, vec2<i32>(vec2<f32>(x_19.x, x_19.y)));
+  color_out = x_22;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  color_out_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(color_out);
+}
diff --git a/test/vk-gl-cts/rasterization/line_continuity/line-strip/1.wgsl b/test/vk-gl-cts/rasterization/line_continuity/line-strip/1.wgsl
new file mode 100644
index 0000000..85b125f
--- /dev/null
+++ b/test/vk-gl-cts/rasterization/line_continuity/line-strip/1.wgsl
@@ -0,0 +1,24 @@
+var<private> color_out : vec4<f32>;
+
+[[group(0), binding(0)]] var texture : texture_storage_2d<rgba8unorm, read>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  let x_19 : vec4<f32> = gl_FragCoord;
+  let x_22 : vec4<f32> = textureLoad(texture, vec2<i32>(vec2<f32>(x_19.x, x_19.y)));
+  color_out = x_22;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  color_out_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(color_out);
+}
diff --git a/test/vk-gl-cts/rasterization/line_continuity/line-strip/1.wgsl.expected.hlsl b/test/vk-gl-cts/rasterization/line_continuity/line-strip/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..64748f3
--- /dev/null
+++ b/test/vk-gl-cts/rasterization/line_continuity/line-strip/1.wgsl.expected.hlsl
@@ -0,0 +1,29 @@
+static float4 color_out = float4(0.0f, 0.0f, 0.0f, 0.0f);
+Texture2D<float4> tint_symbol : register(t0, space0);
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const float4 x_19 = gl_FragCoord;
+  const float4 x_22 = tint_symbol.Load(int3(float2(x_19.x, x_19.y), 0));
+  color_out = x_22;
+  return;
+}
+
+struct main_out {
+  float4 color_out_1;
+};
+struct tint_symbol_2 {
+  float4 gl_FragCoord_param : SV_Position;
+};
+struct tint_symbol_3 {
+  float4 color_out_1 : SV_Target0;
+};
+
+tint_symbol_3 main(tint_symbol_2 tint_symbol_1) {
+  const float4 gl_FragCoord_param = tint_symbol_1.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_4 = {color_out};
+  const tint_symbol_3 tint_symbol_5 = {tint_symbol_4.color_out_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/rasterization/line_continuity/line-strip/1.wgsl.expected.msl b/test/vk-gl-cts/rasterization/line_continuity/line-strip/1.wgsl.expected.msl
new file mode 100644
index 0000000..43e2437
--- /dev/null
+++ b/test/vk-gl-cts/rasterization/line_continuity/line-strip/1.wgsl.expected.msl
@@ -0,0 +1,27 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 color_out_1;
+};
+struct tint_symbol_3 {
+  float4 color_out_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_6, texture2d<float, access::read> tint_symbol_7, thread float4* const tint_symbol_8) {
+  float4 const x_19 = *(tint_symbol_6);
+  float4 const x_22 = tint_symbol_7.read(uint2(int2(float2(x_19.x, x_19.y))));
+  *(tint_symbol_8) = x_22;
+  return;
+}
+
+fragment tint_symbol_3 tint_symbol_1(texture2d<float, access::read> tint_symbol_10 [[texture(0)]], float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_9 = 0.0f;
+  thread float4 tint_symbol_11 = 0.0f;
+  tint_symbol_9 = gl_FragCoord_param;
+  main_1(&(tint_symbol_9), tint_symbol_10, &(tint_symbol_11));
+  main_out const tint_symbol_4 = {.color_out_1=tint_symbol_11};
+  tint_symbol_3 const tint_symbol_5 = {.color_out_1=tint_symbol_4.color_out_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/rasterization/line_continuity/line-strip/1.wgsl.expected.spvasm b/test/vk-gl-cts/rasterization/line_continuity/line-strip/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..5055955
--- /dev/null
+++ b/test/vk-gl-cts/rasterization/line_continuity/line-strip/1.wgsl.expected.spvasm
@@ -0,0 +1,75 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 41
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %color_out "color_out"
+               OpName %texture "texture"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "color_out_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %texture NonWritable
+               OpDecorate %texture DescriptorSet 0
+               OpDecorate %texture Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+  %color_out = OpVariable %_ptr_Private_v4float Private %5
+          %8 = OpTypeImage %float 2D 0 0 0 2 Rgba8
+%_ptr_UniformConstant_8 = OpTypePointer UniformConstant %8
+    %texture = OpVariable %_ptr_UniformConstant_8 UniformConstant
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+    %v2float = OpTypeVector %float 2
+   %main_out = OpTypeStruct %v4float
+         %28 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+         %18 = OpLoad %v4float %gl_FragCoord
+         %20 = OpLoad %8 %texture
+         %25 = OpCompositeExtract %float %18 0
+         %26 = OpCompositeExtract %float %18 1
+         %27 = OpCompositeConstruct %v2float %25 %26
+         %21 = OpConvertFToS %v2int %27
+         %19 = OpImageRead %v4float %20 %21
+               OpStore %color_out %19
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %28
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %32 = OpLabel
+         %33 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %33
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %35 = OpLabel
+         %36 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %36
+         %37 = OpFunctionCall %void %main_1
+         %39 = OpLoad %v4float %color_out
+         %40 = OpCompositeConstruct %main_out %39
+         %38 = OpFunctionCall %void %tint_symbol_3 %40
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/rasterization/line_continuity/line-strip/1.wgsl.expected.wgsl b/test/vk-gl-cts/rasterization/line_continuity/line-strip/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..85b125f
--- /dev/null
+++ b/test/vk-gl-cts/rasterization/line_continuity/line-strip/1.wgsl.expected.wgsl
@@ -0,0 +1,24 @@
+var<private> color_out : vec4<f32>;
+
+[[group(0), binding(0)]] var texture : texture_storage_2d<rgba8unorm, read>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  let x_19 : vec4<f32> = gl_FragCoord;
+  let x_22 : vec4<f32> = textureLoad(texture, vec2<i32>(vec2<f32>(x_19.x, x_19.y)));
+  color_out = x_22;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  color_out_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(color_out);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/arraylength/array-stride-larger-than-element-size/1.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/compute/arraylength/array-stride-larger-than-element-size/1.spvasm
new file mode 100644
index 0000000..e24aea7
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/arraylength/array-stride-larger-than-element-size/1.spvasm
@@ -0,0 +1,84 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main"
+               OpExecutionMode %main LocalSize 1 1 1
+               OpSource ESSL 320
+               OpName %main "main"
+               OpName %Buf1 "Buf1"
+               OpMemberName %Buf1 0 "result"
+               OpName %_ ""
+               OpName %i "i"
+               OpName %Buf0 "Buf0"
+               OpMemberName %Buf0 0 "values"
+               OpName %__0 ""
+               OpMemberDecorate %Buf1 0 Offset 0
+               OpDecorate %Buf1 Block
+               OpDecorate %_ DescriptorSet 0
+               OpDecorate %_ Binding 1
+               OpDecorate %_runtimearr_uint ArrayStride 4
+               OpMemberDecorate %Buf0 0 Offset 0
+               OpDecorate %Buf0 Block
+               OpDecorate %__0 DescriptorSet 0
+               OpDecorate %__0 Binding 0
+               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+       %Buf1 = OpTypeStruct %int
+%_ptr_StorageBuffer_Buf1 = OpTypePointer StorageBuffer %Buf1
+          %_ = OpVariable %_ptr_StorageBuffer_Buf1 StorageBuffer
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+       %uint = OpTypeInt 32 0
+%_ptr_Function_uint = OpTypePointer Function %uint
+     %uint_0 = OpConstant %uint 0
+   %uint_512 = OpConstant %uint 512
+       %bool = OpTypeBool
+%_runtimearr_uint = OpTypeRuntimeArray %uint
+       %Buf0 = OpTypeStruct %_runtimearr_uint
+%_ptr_StorageBuffer_Buf0 = OpTypePointer StorageBuffer %Buf0
+        %__0 = OpVariable %_ptr_StorageBuffer_Buf0 StorageBuffer
+     %uint_2 = OpConstant %uint 2
+%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
+     %v3uint = OpTypeVector %uint 3
+     %uint_1 = OpConstant %uint 1
+%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_1 %uint_1 %uint_1
+       %main = OpFunction %void None %11
+         %27 = OpLabel
+          %i = OpVariable %_ptr_Function_uint Function
+         %28 = OpAccessChain %_ptr_StorageBuffer_int %_ %int_0
+               OpStore %28 %int_1
+               OpStore %i %uint_0
+               OpBranch %29
+         %29 = OpLabel
+               OpLoopMerge %30 %31 None
+               OpBranch %32
+         %32 = OpLabel
+         %33 = OpLoad %uint %i
+         %34 = OpULessThan %bool %33 %uint_512
+               OpBranchConditional %34 %35 %30
+         %35 = OpLabel
+         %36 = OpLoad %uint %i
+         %37 = OpIMul %uint %36 %uint_2
+         %38 = OpAccessChain %_ptr_StorageBuffer_uint %__0 %int_0 %37
+         %39 = OpLoad %uint %38
+         %40 = OpLoad %uint %i
+         %41 = OpINotEqual %bool %39 %40
+               OpSelectionMerge %42 None
+               OpBranchConditional %41 %43 %42
+         %43 = OpLabel
+         %44 = OpAccessChain %_ptr_StorageBuffer_int %_ %int_0
+               OpStore %44 %int_0
+               OpBranch %42
+         %42 = OpLabel
+               OpBranch %31
+         %31 = OpLabel
+         %45 = OpLoad %uint %i
+         %46 = OpIAdd %uint %45 %int_1
+               OpStore %i %46
+               OpBranch %29
+         %30 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/arraylength/array-stride-larger-than-element-size/1.spvasm.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/arraylength/array-stride-larger-than-element-size/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..db86fa5
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/arraylength/array-stride-larger-than-element-size/1.spvasm.expected.hlsl
@@ -0,0 +1,23 @@
+RWByteAddressBuffer x_4 : register(u1, space0);
+RWByteAddressBuffer x_7 : register(u0, space0);
+
+void main_1() {
+  uint i = 0u;
+  x_4.Store(0u, asuint(1));
+  i = 0u;
+  {
+    for(; (i < 512u); i = (i + asuint(1))) {
+      const uint x_39 = x_7.Load((4u * (i * 2u)));
+      if ((x_39 != i)) {
+        x_4.Store(0u, asuint(0));
+      }
+    }
+  }
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void main() {
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/arraylength/array-stride-larger-than-element-size/1.spvasm.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/compute/arraylength/array-stride-larger-than-element-size/1.spvasm.expected.msl
new file mode 100644
index 0000000..1917c7a
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/arraylength/array-stride-larger-than-element-size/1.spvasm.expected.msl
@@ -0,0 +1,39 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct Buf1 {
+  /* 0x0000 */ int result;
+};
+struct Buf0 {
+  /* 0x0000 */ uint values[1];
+};
+
+void main_1(device Buf1& x_4, device Buf0& x_7) {
+  uint i = 0u;
+  x_4.result = 1;
+  i = 0u;
+  while (true) {
+    uint const x_33 = i;
+    if ((x_33 < 512u)) {
+    } else {
+      break;
+    }
+    uint const x_36 = i;
+    uint const x_39 = x_7.values[(x_36 * 2u)];
+    uint const x_40 = i;
+    if ((x_39 != x_40)) {
+      x_4.result = 0;
+    }
+    {
+      uint const x_45 = i;
+      i = (x_45 + as_type<uint>(1));
+    }
+  }
+  return;
+}
+
+kernel void tint_symbol(device Buf1& x_4 [[buffer(1)]], device Buf0& x_7 [[buffer(0)]]) {
+  main_1(x_4, x_7);
+  return;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/arraylength/array-stride-larger-than-element-size/1.spvasm.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/compute/arraylength/array-stride-larger-than-element-size/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..9b18e23
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/arraylength/array-stride-larger-than-element-size/1.spvasm.expected.spvasm
@@ -0,0 +1,96 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 50
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main"
+               OpExecutionMode %main LocalSize 1 1 1
+               OpName %Buf1 "Buf1"
+               OpMemberName %Buf1 0 "result"
+               OpName %x_4 "x_4"
+               OpName %Buf0 "Buf0"
+               OpMemberName %Buf0 0 "values"
+               OpName %x_7 "x_7"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %main "main"
+               OpDecorate %Buf1 Block
+               OpMemberDecorate %Buf1 0 Offset 0
+               OpDecorate %x_4 DescriptorSet 0
+               OpDecorate %x_4 Binding 1
+               OpDecorate %Buf0 Block
+               OpMemberDecorate %Buf0 0 Offset 0
+               OpDecorate %_runtimearr_uint ArrayStride 4
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+        %int = OpTypeInt 32 1
+       %Buf1 = OpTypeStruct %int
+%_ptr_StorageBuffer_Buf1 = OpTypePointer StorageBuffer %Buf1
+        %x_4 = OpVariable %_ptr_StorageBuffer_Buf1 StorageBuffer
+       %uint = OpTypeInt 32 0
+%_runtimearr_uint = OpTypeRuntimeArray %uint
+       %Buf0 = OpTypeStruct %_runtimearr_uint
+%_ptr_StorageBuffer_Buf0 = OpTypePointer StorageBuffer %Buf0
+        %x_7 = OpVariable %_ptr_StorageBuffer_Buf0 StorageBuffer
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+%_ptr_Function_uint = OpTypePointer Function %uint
+         %16 = OpConstantNull %uint
+     %uint_0 = OpConstant %uint 0
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+      %int_1 = OpConstant %int 1
+   %uint_512 = OpConstant %uint 512
+       %bool = OpTypeBool
+     %uint_2 = OpConstant %uint 2
+%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
+      %int_0 = OpConstant %int 0
+     %main_1 = OpFunction %void None %10
+         %13 = OpLabel
+          %i = OpVariable %_ptr_Function_uint Function %16
+         %19 = OpAccessChain %_ptr_StorageBuffer_int %x_4 %uint_0
+               OpStore %19 %int_1
+               OpStore %i %uint_0
+               OpBranch %21
+         %21 = OpLabel
+               OpLoopMerge %22 %23 None
+               OpBranch %24
+         %24 = OpLabel
+         %25 = OpLoad %uint %i
+         %27 = OpULessThan %bool %25 %uint_512
+               OpSelectionMerge %29 None
+               OpBranchConditional %27 %30 %31
+         %30 = OpLabel
+               OpBranch %29
+         %31 = OpLabel
+               OpBranch %22
+         %29 = OpLabel
+         %32 = OpLoad %uint %i
+         %34 = OpIMul %uint %32 %uint_2
+         %36 = OpAccessChain %_ptr_StorageBuffer_uint %x_7 %uint_0 %34
+         %37 = OpLoad %uint %36
+         %38 = OpLoad %uint %i
+         %39 = OpINotEqual %bool %37 %38
+               OpSelectionMerge %40 None
+               OpBranchConditional %39 %41 %40
+         %41 = OpLabel
+         %42 = OpAccessChain %_ptr_StorageBuffer_int %x_4 %uint_0
+               OpStore %42 %int_0
+               OpBranch %40
+         %40 = OpLabel
+               OpBranch %23
+         %23 = OpLabel
+         %44 = OpLoad %uint %i
+         %45 = OpBitcast %uint %int_1
+         %46 = OpIAdd %uint %44 %45
+               OpStore %i %46
+               OpBranch %21
+         %22 = OpLabel
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %10
+         %48 = OpLabel
+         %49 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/arraylength/array-stride-larger-than-element-size/1.spvasm.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/arraylength/array-stride-larger-than-element-size/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..8c7af0e
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/arraylength/array-stride-larger-than-element-size/1.spvasm.expected.wgsl
@@ -0,0 +1,45 @@
+[[block]]
+struct Buf1 {
+  result : i32;
+};
+
+type RTArr = [[stride(4)]] array<u32>;
+
+[[block]]
+struct Buf0 {
+  values : RTArr;
+};
+
+[[group(0), binding(1)]] var<storage, read_write> x_4 : Buf1;
+
+[[group(0), binding(0)]] var<storage, read_write> x_7 : Buf0;
+
+fn main_1() {
+  var i : u32;
+  x_4.result = 1;
+  i = 0u;
+  loop {
+    let x_33 : u32 = i;
+    if ((x_33 < 512u)) {
+    } else {
+      break;
+    }
+    let x_36 : u32 = i;
+    let x_39 : u32 = x_7.values[(x_36 * 2u)];
+    let x_40 : u32 = i;
+    if ((x_39 != x_40)) {
+      x_4.result = 0;
+    }
+
+    continuing {
+      let x_45 : u32 = i;
+      i = (x_45 + bitcast<u32>(1));
+    }
+  }
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main() {
+  main_1();
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/arraylength/array-stride-larger-than-element-size/1.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/arraylength/array-stride-larger-than-element-size/1.wgsl
new file mode 100644
index 0000000..8c7af0e
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/arraylength/array-stride-larger-than-element-size/1.wgsl
@@ -0,0 +1,45 @@
+[[block]]
+struct Buf1 {
+  result : i32;
+};
+
+type RTArr = [[stride(4)]] array<u32>;
+
+[[block]]
+struct Buf0 {
+  values : RTArr;
+};
+
+[[group(0), binding(1)]] var<storage, read_write> x_4 : Buf1;
+
+[[group(0), binding(0)]] var<storage, read_write> x_7 : Buf0;
+
+fn main_1() {
+  var i : u32;
+  x_4.result = 1;
+  i = 0u;
+  loop {
+    let x_33 : u32 = i;
+    if ((x_33 < 512u)) {
+    } else {
+      break;
+    }
+    let x_36 : u32 = i;
+    let x_39 : u32 = x_7.values[(x_36 * 2u)];
+    let x_40 : u32 = i;
+    if ((x_39 != x_40)) {
+      x_4.result = 0;
+    }
+
+    continuing {
+      let x_45 : u32 = i;
+      i = (x_45 + bitcast<u32>(1));
+    }
+  }
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main() {
+  main_1();
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/arraylength/array-stride-larger-than-element-size/1.wgsl.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/arraylength/array-stride-larger-than-element-size/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..db86fa5
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/arraylength/array-stride-larger-than-element-size/1.wgsl.expected.hlsl
@@ -0,0 +1,23 @@
+RWByteAddressBuffer x_4 : register(u1, space0);
+RWByteAddressBuffer x_7 : register(u0, space0);
+
+void main_1() {
+  uint i = 0u;
+  x_4.Store(0u, asuint(1));
+  i = 0u;
+  {
+    for(; (i < 512u); i = (i + asuint(1))) {
+      const uint x_39 = x_7.Load((4u * (i * 2u)));
+      if ((x_39 != i)) {
+        x_4.Store(0u, asuint(0));
+      }
+    }
+  }
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void main() {
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/arraylength/array-stride-larger-than-element-size/1.wgsl.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/compute/arraylength/array-stride-larger-than-element-size/1.wgsl.expected.msl
new file mode 100644
index 0000000..1917c7a
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/arraylength/array-stride-larger-than-element-size/1.wgsl.expected.msl
@@ -0,0 +1,39 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct Buf1 {
+  /* 0x0000 */ int result;
+};
+struct Buf0 {
+  /* 0x0000 */ uint values[1];
+};
+
+void main_1(device Buf1& x_4, device Buf0& x_7) {
+  uint i = 0u;
+  x_4.result = 1;
+  i = 0u;
+  while (true) {
+    uint const x_33 = i;
+    if ((x_33 < 512u)) {
+    } else {
+      break;
+    }
+    uint const x_36 = i;
+    uint const x_39 = x_7.values[(x_36 * 2u)];
+    uint const x_40 = i;
+    if ((x_39 != x_40)) {
+      x_4.result = 0;
+    }
+    {
+      uint const x_45 = i;
+      i = (x_45 + as_type<uint>(1));
+    }
+  }
+  return;
+}
+
+kernel void tint_symbol(device Buf1& x_4 [[buffer(1)]], device Buf0& x_7 [[buffer(0)]]) {
+  main_1(x_4, x_7);
+  return;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/arraylength/array-stride-larger-than-element-size/1.wgsl.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/compute/arraylength/array-stride-larger-than-element-size/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..9b18e23
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/arraylength/array-stride-larger-than-element-size/1.wgsl.expected.spvasm
@@ -0,0 +1,96 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 50
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main"
+               OpExecutionMode %main LocalSize 1 1 1
+               OpName %Buf1 "Buf1"
+               OpMemberName %Buf1 0 "result"
+               OpName %x_4 "x_4"
+               OpName %Buf0 "Buf0"
+               OpMemberName %Buf0 0 "values"
+               OpName %x_7 "x_7"
+               OpName %main_1 "main_1"
+               OpName %i "i"
+               OpName %main "main"
+               OpDecorate %Buf1 Block
+               OpMemberDecorate %Buf1 0 Offset 0
+               OpDecorate %x_4 DescriptorSet 0
+               OpDecorate %x_4 Binding 1
+               OpDecorate %Buf0 Block
+               OpMemberDecorate %Buf0 0 Offset 0
+               OpDecorate %_runtimearr_uint ArrayStride 4
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 0
+        %int = OpTypeInt 32 1
+       %Buf1 = OpTypeStruct %int
+%_ptr_StorageBuffer_Buf1 = OpTypePointer StorageBuffer %Buf1
+        %x_4 = OpVariable %_ptr_StorageBuffer_Buf1 StorageBuffer
+       %uint = OpTypeInt 32 0
+%_runtimearr_uint = OpTypeRuntimeArray %uint
+       %Buf0 = OpTypeStruct %_runtimearr_uint
+%_ptr_StorageBuffer_Buf0 = OpTypePointer StorageBuffer %Buf0
+        %x_7 = OpVariable %_ptr_StorageBuffer_Buf0 StorageBuffer
+       %void = OpTypeVoid
+         %10 = OpTypeFunction %void
+%_ptr_Function_uint = OpTypePointer Function %uint
+         %16 = OpConstantNull %uint
+     %uint_0 = OpConstant %uint 0
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+      %int_1 = OpConstant %int 1
+   %uint_512 = OpConstant %uint 512
+       %bool = OpTypeBool
+     %uint_2 = OpConstant %uint 2
+%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
+      %int_0 = OpConstant %int 0
+     %main_1 = OpFunction %void None %10
+         %13 = OpLabel
+          %i = OpVariable %_ptr_Function_uint Function %16
+         %19 = OpAccessChain %_ptr_StorageBuffer_int %x_4 %uint_0
+               OpStore %19 %int_1
+               OpStore %i %uint_0
+               OpBranch %21
+         %21 = OpLabel
+               OpLoopMerge %22 %23 None
+               OpBranch %24
+         %24 = OpLabel
+         %25 = OpLoad %uint %i
+         %27 = OpULessThan %bool %25 %uint_512
+               OpSelectionMerge %29 None
+               OpBranchConditional %27 %30 %31
+         %30 = OpLabel
+               OpBranch %29
+         %31 = OpLabel
+               OpBranch %22
+         %29 = OpLabel
+         %32 = OpLoad %uint %i
+         %34 = OpIMul %uint %32 %uint_2
+         %36 = OpAccessChain %_ptr_StorageBuffer_uint %x_7 %uint_0 %34
+         %37 = OpLoad %uint %36
+         %38 = OpLoad %uint %i
+         %39 = OpINotEqual %bool %37 %38
+               OpSelectionMerge %40 None
+               OpBranchConditional %39 %41 %40
+         %41 = OpLabel
+         %42 = OpAccessChain %_ptr_StorageBuffer_int %x_4 %uint_0
+               OpStore %42 %int_0
+               OpBranch %40
+         %40 = OpLabel
+               OpBranch %23
+         %23 = OpLabel
+         %44 = OpLoad %uint %i
+         %45 = OpBitcast %uint %int_1
+         %46 = OpIAdd %uint %44 %45
+               OpStore %i %46
+               OpBranch %21
+         %22 = OpLabel
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %10
+         %48 = OpLabel
+         %49 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/arraylength/array-stride-larger-than-element-size/1.wgsl.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/arraylength/array-stride-larger-than-element-size/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..8c7af0e
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/arraylength/array-stride-larger-than-element-size/1.wgsl.expected.wgsl
@@ -0,0 +1,45 @@
+[[block]]
+struct Buf1 {
+  result : i32;
+};
+
+type RTArr = [[stride(4)]] array<u32>;
+
+[[block]]
+struct Buf0 {
+  values : RTArr;
+};
+
+[[group(0), binding(1)]] var<storage, read_write> x_4 : Buf1;
+
+[[group(0), binding(0)]] var<storage, read_write> x_7 : Buf0;
+
+fn main_1() {
+  var i : u32;
+  x_4.result = 1;
+  i = 0u;
+  loop {
+    let x_33 : u32 = i;
+    if ((x_33 < 512u)) {
+    } else {
+      break;
+    }
+    let x_36 : u32 = i;
+    let x_39 : u32 = x_7.values[(x_36 * 2u)];
+    let x_40 : u32 = i;
+    if ((x_39 != x_40)) {
+      x_4.result = 0;
+    }
+
+    continuing {
+      let x_45 : u32 = i;
+      i = (x_45 + bitcast<u32>(1));
+    }
+  }
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main() {
+  main_1();
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthan/0.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthan/0.spvasm
new file mode 100644
index 0000000..cde9063
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthan/0.spvasm
@@ -0,0 +1,46 @@
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %1 "main" %gl_GlobalInvocationID
+               OpExecutionMode %1 LocalSize 1 1 1
+               OpSource OpenCL_C 120
+               OpDecorate %_runtimearr_uint ArrayStride 4
+               OpMemberDecorate %_struct_4 0 Offset 0
+               OpDecorate %_struct_4 BufferBlock
+               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
+               OpDecorate %5 DescriptorSet 0
+               OpDecorate %5 Binding 0
+               OpDecorate %6 DescriptorSet 0
+               OpDecorate %6 Binding 1
+               OpDecorate %7 DescriptorSet 0
+               OpDecorate %7 Binding 2
+       %uint = OpTypeInt 32 0
+%_runtimearr_uint = OpTypeRuntimeArray %uint
+  %_struct_4 = OpTypeStruct %_runtimearr_uint
+%_ptr_Uniform__struct_4 = OpTypePointer Uniform %_struct_4
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+       %bool = OpTypeBool
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
+          %5 = OpVariable %_ptr_Uniform__struct_4 Uniform
+          %6 = OpVariable %_ptr_Uniform__struct_4 Uniform
+          %7 = OpVariable %_ptr_Uniform__struct_4 Uniform
+          %1 = OpFunction %void None %11
+         %19 = OpLabel
+         %20 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_0
+         %21 = OpLoad %uint %20
+         %22 = OpAccessChain %_ptr_Uniform_uint %5 %uint_0 %21
+         %23 = OpLoad %uint %22
+         %24 = OpAccessChain %_ptr_Uniform_uint %6 %uint_0 %21
+         %25 = OpLoad %uint %24
+         %26 = OpSGreaterThan %bool %23 %25
+         %27 = OpSelect %uint %26 %uint_1 %uint_0
+         %28 = OpAccessChain %_ptr_Uniform_uint %7 %uint_0 %21
+               OpStore %28 %27
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthan/0.spvasm.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthan/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..666291e
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthan/0.spvasm.expected.hlsl
@@ -0,0 +1,24 @@
+static uint3 x_2 = uint3(0u, 0u, 0u);
+RWByteAddressBuffer x_5 : register(u0, space0);
+RWByteAddressBuffer x_6 : register(u1, space0);
+RWByteAddressBuffer x_7 : register(u2, space0);
+
+void main_1() {
+  const uint x_21 = x_2.x;
+  const uint x_23 = x_5.Load((4u * x_21));
+  const uint x_25 = x_6.Load((4u * x_21));
+  x_7.Store((4u * x_21), asuint(((asint(x_23) > asint(x_25)) ? 1u : 0u)));
+  return;
+}
+
+struct tint_symbol_1 {
+  uint3 x_2_param : SV_DispatchThreadID;
+};
+
+[numthreads(1, 1, 1)]
+void main(tint_symbol_1 tint_symbol) {
+  const uint3 x_2_param = tint_symbol.x_2_param;
+  x_2 = x_2_param;
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthan/0.spvasm.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthan/0.spvasm.expected.msl
new file mode 100644
index 0000000..5a1dc97
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthan/0.spvasm.expected.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  /* 0x0000 */ uint field0[1];
+};
+
+void main_1(device S& x_5, device S& x_6, device S& x_7, thread uint3* const tint_symbol_2) {
+  uint const x_21 = (*(tint_symbol_2)).x;
+  uint const x_23 = x_5.field0[x_21];
+  uint const x_25 = x_6.field0[x_21];
+  x_7.field0[x_21] = select(0u, 1u, (as_type<int>(x_23) > as_type<int>(x_25)));
+  return;
+}
+
+kernel void tint_symbol(uint3 x_2_param [[thread_position_in_grid]], device S& x_5 [[buffer(0)]], device S& x_6 [[buffer(1)]], device S& x_7 [[buffer(2)]]) {
+  thread uint3 tint_symbol_3 = 0u;
+  tint_symbol_3 = x_2_param;
+  main_1(x_5, x_6, x_7, &(tint_symbol_3));
+  return;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthan/0.spvasm.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthan/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..21ad2a6
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthan/0.spvasm.expected.spvasm
@@ -0,0 +1,72 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 39
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main" %tint_symbol
+               OpExecutionMode %main LocalSize 1 1 1
+               OpName %x_2 "x_2"
+               OpName %S "S"
+               OpMemberName %S 0 "field0"
+               OpName %x_5 "x_5"
+               OpName %x_6 "x_6"
+               OpName %x_7 "x_7"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main_1 "main_1"
+               OpName %main "main"
+               OpDecorate %S Block
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %_runtimearr_uint ArrayStride 4
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 2
+               OpDecorate %tint_symbol BuiltIn GlobalInvocationId
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Private_v3uint = OpTypePointer Private %v3uint
+          %5 = OpConstantNull %v3uint
+        %x_2 = OpVariable %_ptr_Private_v3uint Private %5
+%_runtimearr_uint = OpTypeRuntimeArray %uint
+          %S = OpTypeStruct %_runtimearr_uint
+%_ptr_StorageBuffer_S = OpTypePointer StorageBuffer %S
+        %x_5 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_6 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_7 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%tint_symbol = OpVariable %_ptr_Input_v3uint Input
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_uint = OpTypePointer Private %uint
+%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
+        %int = OpTypeInt 32 1
+       %bool = OpTypeBool
+     %uint_1 = OpConstant %uint 1
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+         %20 = OpAccessChain %_ptr_Private_uint %x_2 %uint_0
+         %21 = OpLoad %uint %20
+         %23 = OpAccessChain %_ptr_StorageBuffer_uint %x_5 %uint_0 %21
+         %24 = OpLoad %uint %23
+         %25 = OpAccessChain %_ptr_StorageBuffer_uint %x_6 %uint_0 %21
+         %26 = OpLoad %uint %25
+         %27 = OpAccessChain %_ptr_StorageBuffer_uint %x_7 %uint_0 %21
+         %29 = OpBitcast %int %24
+         %31 = OpBitcast %int %26
+         %32 = OpSGreaterThan %bool %29 %31
+         %28 = OpSelect %uint %32 %uint_1 %uint_0
+               OpStore %27 %28
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %36 = OpLabel
+         %37 = OpLoad %v3uint %tint_symbol
+               OpStore %x_2 %37
+         %38 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthan/0.spvasm.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthan/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..b5c093a
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthan/0.spvasm.expected.wgsl
@@ -0,0 +1,28 @@
+type RTArr = [[stride(4)]] array<u32>;
+
+[[block]]
+struct S {
+  field0 : RTArr;
+};
+
+var<private> x_2 : vec3<u32>;
+
+[[group(0), binding(0)]] var<storage, read_write> x_5 : S;
+
+[[group(0), binding(1)]] var<storage, read_write> x_6 : S;
+
+[[group(0), binding(2)]] var<storage, read_write> x_7 : S;
+
+fn main_1() {
+  let x_21 : u32 = x_2.x;
+  let x_23 : u32 = x_5.field0[x_21];
+  let x_25 : u32 = x_6.field0[x_21];
+  x_7.field0[x_21] = select(0u, 1u, (bitcast<i32>(x_23) > bitcast<i32>(x_25)));
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main([[builtin(global_invocation_id)]] x_2_param : vec3<u32>) {
+  x_2 = x_2_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthan/0.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthan/0.wgsl
new file mode 100644
index 0000000..b5c093a
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthan/0.wgsl
@@ -0,0 +1,28 @@
+type RTArr = [[stride(4)]] array<u32>;
+
+[[block]]
+struct S {
+  field0 : RTArr;
+};
+
+var<private> x_2 : vec3<u32>;
+
+[[group(0), binding(0)]] var<storage, read_write> x_5 : S;
+
+[[group(0), binding(1)]] var<storage, read_write> x_6 : S;
+
+[[group(0), binding(2)]] var<storage, read_write> x_7 : S;
+
+fn main_1() {
+  let x_21 : u32 = x_2.x;
+  let x_23 : u32 = x_5.field0[x_21];
+  let x_25 : u32 = x_6.field0[x_21];
+  x_7.field0[x_21] = select(0u, 1u, (bitcast<i32>(x_23) > bitcast<i32>(x_25)));
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main([[builtin(global_invocation_id)]] x_2_param : vec3<u32>) {
+  x_2 = x_2_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthan/0.wgsl.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthan/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..666291e
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthan/0.wgsl.expected.hlsl
@@ -0,0 +1,24 @@
+static uint3 x_2 = uint3(0u, 0u, 0u);
+RWByteAddressBuffer x_5 : register(u0, space0);
+RWByteAddressBuffer x_6 : register(u1, space0);
+RWByteAddressBuffer x_7 : register(u2, space0);
+
+void main_1() {
+  const uint x_21 = x_2.x;
+  const uint x_23 = x_5.Load((4u * x_21));
+  const uint x_25 = x_6.Load((4u * x_21));
+  x_7.Store((4u * x_21), asuint(((asint(x_23) > asint(x_25)) ? 1u : 0u)));
+  return;
+}
+
+struct tint_symbol_1 {
+  uint3 x_2_param : SV_DispatchThreadID;
+};
+
+[numthreads(1, 1, 1)]
+void main(tint_symbol_1 tint_symbol) {
+  const uint3 x_2_param = tint_symbol.x_2_param;
+  x_2 = x_2_param;
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthan/0.wgsl.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthan/0.wgsl.expected.msl
new file mode 100644
index 0000000..5a1dc97
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthan/0.wgsl.expected.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  /* 0x0000 */ uint field0[1];
+};
+
+void main_1(device S& x_5, device S& x_6, device S& x_7, thread uint3* const tint_symbol_2) {
+  uint const x_21 = (*(tint_symbol_2)).x;
+  uint const x_23 = x_5.field0[x_21];
+  uint const x_25 = x_6.field0[x_21];
+  x_7.field0[x_21] = select(0u, 1u, (as_type<int>(x_23) > as_type<int>(x_25)));
+  return;
+}
+
+kernel void tint_symbol(uint3 x_2_param [[thread_position_in_grid]], device S& x_5 [[buffer(0)]], device S& x_6 [[buffer(1)]], device S& x_7 [[buffer(2)]]) {
+  thread uint3 tint_symbol_3 = 0u;
+  tint_symbol_3 = x_2_param;
+  main_1(x_5, x_6, x_7, &(tint_symbol_3));
+  return;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthan/0.wgsl.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthan/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..21ad2a6
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthan/0.wgsl.expected.spvasm
@@ -0,0 +1,72 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 39
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main" %tint_symbol
+               OpExecutionMode %main LocalSize 1 1 1
+               OpName %x_2 "x_2"
+               OpName %S "S"
+               OpMemberName %S 0 "field0"
+               OpName %x_5 "x_5"
+               OpName %x_6 "x_6"
+               OpName %x_7 "x_7"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main_1 "main_1"
+               OpName %main "main"
+               OpDecorate %S Block
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %_runtimearr_uint ArrayStride 4
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 2
+               OpDecorate %tint_symbol BuiltIn GlobalInvocationId
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Private_v3uint = OpTypePointer Private %v3uint
+          %5 = OpConstantNull %v3uint
+        %x_2 = OpVariable %_ptr_Private_v3uint Private %5
+%_runtimearr_uint = OpTypeRuntimeArray %uint
+          %S = OpTypeStruct %_runtimearr_uint
+%_ptr_StorageBuffer_S = OpTypePointer StorageBuffer %S
+        %x_5 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_6 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_7 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%tint_symbol = OpVariable %_ptr_Input_v3uint Input
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_uint = OpTypePointer Private %uint
+%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
+        %int = OpTypeInt 32 1
+       %bool = OpTypeBool
+     %uint_1 = OpConstant %uint 1
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+         %20 = OpAccessChain %_ptr_Private_uint %x_2 %uint_0
+         %21 = OpLoad %uint %20
+         %23 = OpAccessChain %_ptr_StorageBuffer_uint %x_5 %uint_0 %21
+         %24 = OpLoad %uint %23
+         %25 = OpAccessChain %_ptr_StorageBuffer_uint %x_6 %uint_0 %21
+         %26 = OpLoad %uint %25
+         %27 = OpAccessChain %_ptr_StorageBuffer_uint %x_7 %uint_0 %21
+         %29 = OpBitcast %int %24
+         %31 = OpBitcast %int %26
+         %32 = OpSGreaterThan %bool %29 %31
+         %28 = OpSelect %uint %32 %uint_1 %uint_0
+               OpStore %27 %28
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %36 = OpLabel
+         %37 = OpLoad %v3uint %tint_symbol
+               OpStore %x_2 %37
+         %38 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthan/0.wgsl.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthan/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..b5c093a
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthan/0.wgsl.expected.wgsl
@@ -0,0 +1,28 @@
+type RTArr = [[stride(4)]] array<u32>;
+
+[[block]]
+struct S {
+  field0 : RTArr;
+};
+
+var<private> x_2 : vec3<u32>;
+
+[[group(0), binding(0)]] var<storage, read_write> x_5 : S;
+
+[[group(0), binding(1)]] var<storage, read_write> x_6 : S;
+
+[[group(0), binding(2)]] var<storage, read_write> x_7 : S;
+
+fn main_1() {
+  let x_21 : u32 = x_2.x;
+  let x_23 : u32 = x_5.field0[x_21];
+  let x_25 : u32 = x_6.field0[x_21];
+  x_7.field0[x_21] = select(0u, 1u, (bitcast<i32>(x_23) > bitcast<i32>(x_25)));
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main([[builtin(global_invocation_id)]] x_2_param : vec3<u32>) {
+  x_2 = x_2_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthanequal/0.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthanequal/0.spvasm
new file mode 100644
index 0000000..1560001
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthanequal/0.spvasm
@@ -0,0 +1,46 @@
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %1 "main" %gl_GlobalInvocationID
+               OpExecutionMode %1 LocalSize 1 1 1
+               OpSource OpenCL_C 120
+               OpDecorate %_runtimearr_uint ArrayStride 4
+               OpMemberDecorate %_struct_4 0 Offset 0
+               OpDecorate %_struct_4 BufferBlock
+               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
+               OpDecorate %5 DescriptorSet 0
+               OpDecorate %5 Binding 0
+               OpDecorate %6 DescriptorSet 0
+               OpDecorate %6 Binding 1
+               OpDecorate %7 DescriptorSet 0
+               OpDecorate %7 Binding 2
+       %uint = OpTypeInt 32 0
+%_runtimearr_uint = OpTypeRuntimeArray %uint
+  %_struct_4 = OpTypeStruct %_runtimearr_uint
+%_ptr_Uniform__struct_4 = OpTypePointer Uniform %_struct_4
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+       %bool = OpTypeBool
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
+          %5 = OpVariable %_ptr_Uniform__struct_4 Uniform
+          %6 = OpVariable %_ptr_Uniform__struct_4 Uniform
+          %7 = OpVariable %_ptr_Uniform__struct_4 Uniform
+          %1 = OpFunction %void None %11
+         %19 = OpLabel
+         %20 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_0
+         %21 = OpLoad %uint %20
+         %22 = OpAccessChain %_ptr_Uniform_uint %5 %uint_0 %21
+         %23 = OpLoad %uint %22
+         %24 = OpAccessChain %_ptr_Uniform_uint %6 %uint_0 %21
+         %25 = OpLoad %uint %24
+         %26 = OpSGreaterThanEqual %bool %23 %25
+         %27 = OpSelect %uint %26 %uint_1 %uint_0
+         %28 = OpAccessChain %_ptr_Uniform_uint %7 %uint_0 %21
+               OpStore %28 %27
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthanequal/0.spvasm.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthanequal/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..95f5645
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthanequal/0.spvasm.expected.hlsl
@@ -0,0 +1,24 @@
+static uint3 x_2 = uint3(0u, 0u, 0u);
+RWByteAddressBuffer x_5 : register(u0, space0);
+RWByteAddressBuffer x_6 : register(u1, space0);
+RWByteAddressBuffer x_7 : register(u2, space0);
+
+void main_1() {
+  const uint x_21 = x_2.x;
+  const uint x_23 = x_5.Load((4u * x_21));
+  const uint x_25 = x_6.Load((4u * x_21));
+  x_7.Store((4u * x_21), asuint(((asint(x_23) >= asint(x_25)) ? 1u : 0u)));
+  return;
+}
+
+struct tint_symbol_1 {
+  uint3 x_2_param : SV_DispatchThreadID;
+};
+
+[numthreads(1, 1, 1)]
+void main(tint_symbol_1 tint_symbol) {
+  const uint3 x_2_param = tint_symbol.x_2_param;
+  x_2 = x_2_param;
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthanequal/0.spvasm.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthanequal/0.spvasm.expected.msl
new file mode 100644
index 0000000..459deef
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthanequal/0.spvasm.expected.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  /* 0x0000 */ uint field0[1];
+};
+
+void main_1(device S& x_5, device S& x_6, device S& x_7, thread uint3* const tint_symbol_2) {
+  uint const x_21 = (*(tint_symbol_2)).x;
+  uint const x_23 = x_5.field0[x_21];
+  uint const x_25 = x_6.field0[x_21];
+  x_7.field0[x_21] = select(0u, 1u, (as_type<int>(x_23) >= as_type<int>(x_25)));
+  return;
+}
+
+kernel void tint_symbol(uint3 x_2_param [[thread_position_in_grid]], device S& x_5 [[buffer(0)]], device S& x_6 [[buffer(1)]], device S& x_7 [[buffer(2)]]) {
+  thread uint3 tint_symbol_3 = 0u;
+  tint_symbol_3 = x_2_param;
+  main_1(x_5, x_6, x_7, &(tint_symbol_3));
+  return;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthanequal/0.spvasm.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthanequal/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..b55f16e
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthanequal/0.spvasm.expected.spvasm
@@ -0,0 +1,72 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 39
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main" %tint_symbol
+               OpExecutionMode %main LocalSize 1 1 1
+               OpName %x_2 "x_2"
+               OpName %S "S"
+               OpMemberName %S 0 "field0"
+               OpName %x_5 "x_5"
+               OpName %x_6 "x_6"
+               OpName %x_7 "x_7"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main_1 "main_1"
+               OpName %main "main"
+               OpDecorate %S Block
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %_runtimearr_uint ArrayStride 4
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 2
+               OpDecorate %tint_symbol BuiltIn GlobalInvocationId
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Private_v3uint = OpTypePointer Private %v3uint
+          %5 = OpConstantNull %v3uint
+        %x_2 = OpVariable %_ptr_Private_v3uint Private %5
+%_runtimearr_uint = OpTypeRuntimeArray %uint
+          %S = OpTypeStruct %_runtimearr_uint
+%_ptr_StorageBuffer_S = OpTypePointer StorageBuffer %S
+        %x_5 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_6 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_7 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%tint_symbol = OpVariable %_ptr_Input_v3uint Input
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_uint = OpTypePointer Private %uint
+%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
+        %int = OpTypeInt 32 1
+       %bool = OpTypeBool
+     %uint_1 = OpConstant %uint 1
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+         %20 = OpAccessChain %_ptr_Private_uint %x_2 %uint_0
+         %21 = OpLoad %uint %20
+         %23 = OpAccessChain %_ptr_StorageBuffer_uint %x_5 %uint_0 %21
+         %24 = OpLoad %uint %23
+         %25 = OpAccessChain %_ptr_StorageBuffer_uint %x_6 %uint_0 %21
+         %26 = OpLoad %uint %25
+         %27 = OpAccessChain %_ptr_StorageBuffer_uint %x_7 %uint_0 %21
+         %29 = OpBitcast %int %24
+         %31 = OpBitcast %int %26
+         %32 = OpSGreaterThanEqual %bool %29 %31
+         %28 = OpSelect %uint %32 %uint_1 %uint_0
+               OpStore %27 %28
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %36 = OpLabel
+         %37 = OpLoad %v3uint %tint_symbol
+               OpStore %x_2 %37
+         %38 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthanequal/0.spvasm.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthanequal/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..4aba7ac
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthanequal/0.spvasm.expected.wgsl
@@ -0,0 +1,28 @@
+type RTArr = [[stride(4)]] array<u32>;
+
+[[block]]
+struct S {
+  field0 : RTArr;
+};
+
+var<private> x_2 : vec3<u32>;
+
+[[group(0), binding(0)]] var<storage, read_write> x_5 : S;
+
+[[group(0), binding(1)]] var<storage, read_write> x_6 : S;
+
+[[group(0), binding(2)]] var<storage, read_write> x_7 : S;
+
+fn main_1() {
+  let x_21 : u32 = x_2.x;
+  let x_23 : u32 = x_5.field0[x_21];
+  let x_25 : u32 = x_6.field0[x_21];
+  x_7.field0[x_21] = select(0u, 1u, (bitcast<i32>(x_23) >= bitcast<i32>(x_25)));
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main([[builtin(global_invocation_id)]] x_2_param : vec3<u32>) {
+  x_2 = x_2_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthanequal/0.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthanequal/0.wgsl
new file mode 100644
index 0000000..4aba7ac
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthanequal/0.wgsl
@@ -0,0 +1,28 @@
+type RTArr = [[stride(4)]] array<u32>;
+
+[[block]]
+struct S {
+  field0 : RTArr;
+};
+
+var<private> x_2 : vec3<u32>;
+
+[[group(0), binding(0)]] var<storage, read_write> x_5 : S;
+
+[[group(0), binding(1)]] var<storage, read_write> x_6 : S;
+
+[[group(0), binding(2)]] var<storage, read_write> x_7 : S;
+
+fn main_1() {
+  let x_21 : u32 = x_2.x;
+  let x_23 : u32 = x_5.field0[x_21];
+  let x_25 : u32 = x_6.field0[x_21];
+  x_7.field0[x_21] = select(0u, 1u, (bitcast<i32>(x_23) >= bitcast<i32>(x_25)));
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main([[builtin(global_invocation_id)]] x_2_param : vec3<u32>) {
+  x_2 = x_2_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthanequal/0.wgsl.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthanequal/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..95f5645
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthanequal/0.wgsl.expected.hlsl
@@ -0,0 +1,24 @@
+static uint3 x_2 = uint3(0u, 0u, 0u);
+RWByteAddressBuffer x_5 : register(u0, space0);
+RWByteAddressBuffer x_6 : register(u1, space0);
+RWByteAddressBuffer x_7 : register(u2, space0);
+
+void main_1() {
+  const uint x_21 = x_2.x;
+  const uint x_23 = x_5.Load((4u * x_21));
+  const uint x_25 = x_6.Load((4u * x_21));
+  x_7.Store((4u * x_21), asuint(((asint(x_23) >= asint(x_25)) ? 1u : 0u)));
+  return;
+}
+
+struct tint_symbol_1 {
+  uint3 x_2_param : SV_DispatchThreadID;
+};
+
+[numthreads(1, 1, 1)]
+void main(tint_symbol_1 tint_symbol) {
+  const uint3 x_2_param = tint_symbol.x_2_param;
+  x_2 = x_2_param;
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthanequal/0.wgsl.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthanequal/0.wgsl.expected.msl
new file mode 100644
index 0000000..459deef
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthanequal/0.wgsl.expected.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  /* 0x0000 */ uint field0[1];
+};
+
+void main_1(device S& x_5, device S& x_6, device S& x_7, thread uint3* const tint_symbol_2) {
+  uint const x_21 = (*(tint_symbol_2)).x;
+  uint const x_23 = x_5.field0[x_21];
+  uint const x_25 = x_6.field0[x_21];
+  x_7.field0[x_21] = select(0u, 1u, (as_type<int>(x_23) >= as_type<int>(x_25)));
+  return;
+}
+
+kernel void tint_symbol(uint3 x_2_param [[thread_position_in_grid]], device S& x_5 [[buffer(0)]], device S& x_6 [[buffer(1)]], device S& x_7 [[buffer(2)]]) {
+  thread uint3 tint_symbol_3 = 0u;
+  tint_symbol_3 = x_2_param;
+  main_1(x_5, x_6, x_7, &(tint_symbol_3));
+  return;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthanequal/0.wgsl.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthanequal/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..b55f16e
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthanequal/0.wgsl.expected.spvasm
@@ -0,0 +1,72 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 39
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main" %tint_symbol
+               OpExecutionMode %main LocalSize 1 1 1
+               OpName %x_2 "x_2"
+               OpName %S "S"
+               OpMemberName %S 0 "field0"
+               OpName %x_5 "x_5"
+               OpName %x_6 "x_6"
+               OpName %x_7 "x_7"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main_1 "main_1"
+               OpName %main "main"
+               OpDecorate %S Block
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %_runtimearr_uint ArrayStride 4
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 2
+               OpDecorate %tint_symbol BuiltIn GlobalInvocationId
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Private_v3uint = OpTypePointer Private %v3uint
+          %5 = OpConstantNull %v3uint
+        %x_2 = OpVariable %_ptr_Private_v3uint Private %5
+%_runtimearr_uint = OpTypeRuntimeArray %uint
+          %S = OpTypeStruct %_runtimearr_uint
+%_ptr_StorageBuffer_S = OpTypePointer StorageBuffer %S
+        %x_5 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_6 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_7 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%tint_symbol = OpVariable %_ptr_Input_v3uint Input
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_uint = OpTypePointer Private %uint
+%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
+        %int = OpTypeInt 32 1
+       %bool = OpTypeBool
+     %uint_1 = OpConstant %uint 1
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+         %20 = OpAccessChain %_ptr_Private_uint %x_2 %uint_0
+         %21 = OpLoad %uint %20
+         %23 = OpAccessChain %_ptr_StorageBuffer_uint %x_5 %uint_0 %21
+         %24 = OpLoad %uint %23
+         %25 = OpAccessChain %_ptr_StorageBuffer_uint %x_6 %uint_0 %21
+         %26 = OpLoad %uint %25
+         %27 = OpAccessChain %_ptr_StorageBuffer_uint %x_7 %uint_0 %21
+         %29 = OpBitcast %int %24
+         %31 = OpBitcast %int %26
+         %32 = OpSGreaterThanEqual %bool %29 %31
+         %28 = OpSelect %uint %32 %uint_1 %uint_0
+               OpStore %27 %28
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %36 = OpLabel
+         %37 = OpLoad %v3uint %tint_symbol
+               OpStore %x_2 %37
+         %38 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthanequal/0.wgsl.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthanequal/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..4aba7ac
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_sgreaterthanequal/0.wgsl.expected.wgsl
@@ -0,0 +1,28 @@
+type RTArr = [[stride(4)]] array<u32>;
+
+[[block]]
+struct S {
+  field0 : RTArr;
+};
+
+var<private> x_2 : vec3<u32>;
+
+[[group(0), binding(0)]] var<storage, read_write> x_5 : S;
+
+[[group(0), binding(1)]] var<storage, read_write> x_6 : S;
+
+[[group(0), binding(2)]] var<storage, read_write> x_7 : S;
+
+fn main_1() {
+  let x_21 : u32 = x_2.x;
+  let x_23 : u32 = x_5.field0[x_21];
+  let x_25 : u32 = x_6.field0[x_21];
+  x_7.field0[x_21] = select(0u, 1u, (bitcast<i32>(x_23) >= bitcast<i32>(x_25)));
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main([[builtin(global_invocation_id)]] x_2_param : vec3<u32>) {
+  x_2 = x_2_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthan/0.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthan/0.spvasm
new file mode 100644
index 0000000..6c13257
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthan/0.spvasm
@@ -0,0 +1,46 @@
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %1 "main" %gl_GlobalInvocationID
+               OpExecutionMode %1 LocalSize 1 1 1
+               OpSource OpenCL_C 120
+               OpDecorate %_runtimearr_uint ArrayStride 4
+               OpMemberDecorate %_struct_4 0 Offset 0
+               OpDecorate %_struct_4 BufferBlock
+               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
+               OpDecorate %5 DescriptorSet 0
+               OpDecorate %5 Binding 0
+               OpDecorate %6 DescriptorSet 0
+               OpDecorate %6 Binding 1
+               OpDecorate %7 DescriptorSet 0
+               OpDecorate %7 Binding 2
+       %uint = OpTypeInt 32 0
+%_runtimearr_uint = OpTypeRuntimeArray %uint
+  %_struct_4 = OpTypeStruct %_runtimearr_uint
+%_ptr_Uniform__struct_4 = OpTypePointer Uniform %_struct_4
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+       %bool = OpTypeBool
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
+          %5 = OpVariable %_ptr_Uniform__struct_4 Uniform
+          %6 = OpVariable %_ptr_Uniform__struct_4 Uniform
+          %7 = OpVariable %_ptr_Uniform__struct_4 Uniform
+          %1 = OpFunction %void None %11
+         %19 = OpLabel
+         %20 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_0
+         %21 = OpLoad %uint %20
+         %22 = OpAccessChain %_ptr_Uniform_uint %5 %uint_0 %21
+         %23 = OpLoad %uint %22
+         %24 = OpAccessChain %_ptr_Uniform_uint %6 %uint_0 %21
+         %25 = OpLoad %uint %24
+         %26 = OpSLessThan %bool %23 %25
+         %27 = OpSelect %uint %26 %uint_1 %uint_0
+         %28 = OpAccessChain %_ptr_Uniform_uint %7 %uint_0 %21
+               OpStore %28 %27
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthan/0.spvasm.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthan/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..03594c8
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthan/0.spvasm.expected.hlsl
@@ -0,0 +1,24 @@
+static uint3 x_2 = uint3(0u, 0u, 0u);
+RWByteAddressBuffer x_5 : register(u0, space0);
+RWByteAddressBuffer x_6 : register(u1, space0);
+RWByteAddressBuffer x_7 : register(u2, space0);
+
+void main_1() {
+  const uint x_21 = x_2.x;
+  const uint x_23 = x_5.Load((4u * x_21));
+  const uint x_25 = x_6.Load((4u * x_21));
+  x_7.Store((4u * x_21), asuint(((asint(x_23) < asint(x_25)) ? 1u : 0u)));
+  return;
+}
+
+struct tint_symbol_1 {
+  uint3 x_2_param : SV_DispatchThreadID;
+};
+
+[numthreads(1, 1, 1)]
+void main(tint_symbol_1 tint_symbol) {
+  const uint3 x_2_param = tint_symbol.x_2_param;
+  x_2 = x_2_param;
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthan/0.spvasm.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthan/0.spvasm.expected.msl
new file mode 100644
index 0000000..169d49e
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthan/0.spvasm.expected.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  /* 0x0000 */ uint field0[1];
+};
+
+void main_1(device S& x_5, device S& x_6, device S& x_7, thread uint3* const tint_symbol_2) {
+  uint const x_21 = (*(tint_symbol_2)).x;
+  uint const x_23 = x_5.field0[x_21];
+  uint const x_25 = x_6.field0[x_21];
+  x_7.field0[x_21] = select(0u, 1u, (as_type<int>(x_23) < as_type<int>(x_25)));
+  return;
+}
+
+kernel void tint_symbol(uint3 x_2_param [[thread_position_in_grid]], device S& x_5 [[buffer(0)]], device S& x_6 [[buffer(1)]], device S& x_7 [[buffer(2)]]) {
+  thread uint3 tint_symbol_3 = 0u;
+  tint_symbol_3 = x_2_param;
+  main_1(x_5, x_6, x_7, &(tint_symbol_3));
+  return;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthan/0.spvasm.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthan/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..19b5307
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthan/0.spvasm.expected.spvasm
@@ -0,0 +1,72 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 39
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main" %tint_symbol
+               OpExecutionMode %main LocalSize 1 1 1
+               OpName %x_2 "x_2"
+               OpName %S "S"
+               OpMemberName %S 0 "field0"
+               OpName %x_5 "x_5"
+               OpName %x_6 "x_6"
+               OpName %x_7 "x_7"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main_1 "main_1"
+               OpName %main "main"
+               OpDecorate %S Block
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %_runtimearr_uint ArrayStride 4
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 2
+               OpDecorate %tint_symbol BuiltIn GlobalInvocationId
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Private_v3uint = OpTypePointer Private %v3uint
+          %5 = OpConstantNull %v3uint
+        %x_2 = OpVariable %_ptr_Private_v3uint Private %5
+%_runtimearr_uint = OpTypeRuntimeArray %uint
+          %S = OpTypeStruct %_runtimearr_uint
+%_ptr_StorageBuffer_S = OpTypePointer StorageBuffer %S
+        %x_5 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_6 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_7 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%tint_symbol = OpVariable %_ptr_Input_v3uint Input
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_uint = OpTypePointer Private %uint
+%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
+        %int = OpTypeInt 32 1
+       %bool = OpTypeBool
+     %uint_1 = OpConstant %uint 1
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+         %20 = OpAccessChain %_ptr_Private_uint %x_2 %uint_0
+         %21 = OpLoad %uint %20
+         %23 = OpAccessChain %_ptr_StorageBuffer_uint %x_5 %uint_0 %21
+         %24 = OpLoad %uint %23
+         %25 = OpAccessChain %_ptr_StorageBuffer_uint %x_6 %uint_0 %21
+         %26 = OpLoad %uint %25
+         %27 = OpAccessChain %_ptr_StorageBuffer_uint %x_7 %uint_0 %21
+         %29 = OpBitcast %int %24
+         %31 = OpBitcast %int %26
+         %32 = OpSLessThan %bool %29 %31
+         %28 = OpSelect %uint %32 %uint_1 %uint_0
+               OpStore %27 %28
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %36 = OpLabel
+         %37 = OpLoad %v3uint %tint_symbol
+               OpStore %x_2 %37
+         %38 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthan/0.spvasm.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthan/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..c8fe707
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthan/0.spvasm.expected.wgsl
@@ -0,0 +1,28 @@
+type RTArr = [[stride(4)]] array<u32>;
+
+[[block]]
+struct S {
+  field0 : RTArr;
+};
+
+var<private> x_2 : vec3<u32>;
+
+[[group(0), binding(0)]] var<storage, read_write> x_5 : S;
+
+[[group(0), binding(1)]] var<storage, read_write> x_6 : S;
+
+[[group(0), binding(2)]] var<storage, read_write> x_7 : S;
+
+fn main_1() {
+  let x_21 : u32 = x_2.x;
+  let x_23 : u32 = x_5.field0[x_21];
+  let x_25 : u32 = x_6.field0[x_21];
+  x_7.field0[x_21] = select(0u, 1u, (bitcast<i32>(x_23) < bitcast<i32>(x_25)));
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main([[builtin(global_invocation_id)]] x_2_param : vec3<u32>) {
+  x_2 = x_2_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthan/0.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthan/0.wgsl
new file mode 100644
index 0000000..c8fe707
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthan/0.wgsl
@@ -0,0 +1,28 @@
+type RTArr = [[stride(4)]] array<u32>;
+
+[[block]]
+struct S {
+  field0 : RTArr;
+};
+
+var<private> x_2 : vec3<u32>;
+
+[[group(0), binding(0)]] var<storage, read_write> x_5 : S;
+
+[[group(0), binding(1)]] var<storage, read_write> x_6 : S;
+
+[[group(0), binding(2)]] var<storage, read_write> x_7 : S;
+
+fn main_1() {
+  let x_21 : u32 = x_2.x;
+  let x_23 : u32 = x_5.field0[x_21];
+  let x_25 : u32 = x_6.field0[x_21];
+  x_7.field0[x_21] = select(0u, 1u, (bitcast<i32>(x_23) < bitcast<i32>(x_25)));
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main([[builtin(global_invocation_id)]] x_2_param : vec3<u32>) {
+  x_2 = x_2_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthan/0.wgsl.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthan/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..03594c8
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthan/0.wgsl.expected.hlsl
@@ -0,0 +1,24 @@
+static uint3 x_2 = uint3(0u, 0u, 0u);
+RWByteAddressBuffer x_5 : register(u0, space0);
+RWByteAddressBuffer x_6 : register(u1, space0);
+RWByteAddressBuffer x_7 : register(u2, space0);
+
+void main_1() {
+  const uint x_21 = x_2.x;
+  const uint x_23 = x_5.Load((4u * x_21));
+  const uint x_25 = x_6.Load((4u * x_21));
+  x_7.Store((4u * x_21), asuint(((asint(x_23) < asint(x_25)) ? 1u : 0u)));
+  return;
+}
+
+struct tint_symbol_1 {
+  uint3 x_2_param : SV_DispatchThreadID;
+};
+
+[numthreads(1, 1, 1)]
+void main(tint_symbol_1 tint_symbol) {
+  const uint3 x_2_param = tint_symbol.x_2_param;
+  x_2 = x_2_param;
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthan/0.wgsl.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthan/0.wgsl.expected.msl
new file mode 100644
index 0000000..169d49e
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthan/0.wgsl.expected.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  /* 0x0000 */ uint field0[1];
+};
+
+void main_1(device S& x_5, device S& x_6, device S& x_7, thread uint3* const tint_symbol_2) {
+  uint const x_21 = (*(tint_symbol_2)).x;
+  uint const x_23 = x_5.field0[x_21];
+  uint const x_25 = x_6.field0[x_21];
+  x_7.field0[x_21] = select(0u, 1u, (as_type<int>(x_23) < as_type<int>(x_25)));
+  return;
+}
+
+kernel void tint_symbol(uint3 x_2_param [[thread_position_in_grid]], device S& x_5 [[buffer(0)]], device S& x_6 [[buffer(1)]], device S& x_7 [[buffer(2)]]) {
+  thread uint3 tint_symbol_3 = 0u;
+  tint_symbol_3 = x_2_param;
+  main_1(x_5, x_6, x_7, &(tint_symbol_3));
+  return;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthan/0.wgsl.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthan/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..19b5307
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthan/0.wgsl.expected.spvasm
@@ -0,0 +1,72 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 39
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main" %tint_symbol
+               OpExecutionMode %main LocalSize 1 1 1
+               OpName %x_2 "x_2"
+               OpName %S "S"
+               OpMemberName %S 0 "field0"
+               OpName %x_5 "x_5"
+               OpName %x_6 "x_6"
+               OpName %x_7 "x_7"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main_1 "main_1"
+               OpName %main "main"
+               OpDecorate %S Block
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %_runtimearr_uint ArrayStride 4
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 2
+               OpDecorate %tint_symbol BuiltIn GlobalInvocationId
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Private_v3uint = OpTypePointer Private %v3uint
+          %5 = OpConstantNull %v3uint
+        %x_2 = OpVariable %_ptr_Private_v3uint Private %5
+%_runtimearr_uint = OpTypeRuntimeArray %uint
+          %S = OpTypeStruct %_runtimearr_uint
+%_ptr_StorageBuffer_S = OpTypePointer StorageBuffer %S
+        %x_5 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_6 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_7 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%tint_symbol = OpVariable %_ptr_Input_v3uint Input
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_uint = OpTypePointer Private %uint
+%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
+        %int = OpTypeInt 32 1
+       %bool = OpTypeBool
+     %uint_1 = OpConstant %uint 1
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+         %20 = OpAccessChain %_ptr_Private_uint %x_2 %uint_0
+         %21 = OpLoad %uint %20
+         %23 = OpAccessChain %_ptr_StorageBuffer_uint %x_5 %uint_0 %21
+         %24 = OpLoad %uint %23
+         %25 = OpAccessChain %_ptr_StorageBuffer_uint %x_6 %uint_0 %21
+         %26 = OpLoad %uint %25
+         %27 = OpAccessChain %_ptr_StorageBuffer_uint %x_7 %uint_0 %21
+         %29 = OpBitcast %int %24
+         %31 = OpBitcast %int %26
+         %32 = OpSLessThan %bool %29 %31
+         %28 = OpSelect %uint %32 %uint_1 %uint_0
+               OpStore %27 %28
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %36 = OpLabel
+         %37 = OpLoad %v3uint %tint_symbol
+               OpStore %x_2 %37
+         %38 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthan/0.wgsl.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthan/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..c8fe707
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthan/0.wgsl.expected.wgsl
@@ -0,0 +1,28 @@
+type RTArr = [[stride(4)]] array<u32>;
+
+[[block]]
+struct S {
+  field0 : RTArr;
+};
+
+var<private> x_2 : vec3<u32>;
+
+[[group(0), binding(0)]] var<storage, read_write> x_5 : S;
+
+[[group(0), binding(1)]] var<storage, read_write> x_6 : S;
+
+[[group(0), binding(2)]] var<storage, read_write> x_7 : S;
+
+fn main_1() {
+  let x_21 : u32 = x_2.x;
+  let x_23 : u32 = x_5.field0[x_21];
+  let x_25 : u32 = x_6.field0[x_21];
+  x_7.field0[x_21] = select(0u, 1u, (bitcast<i32>(x_23) < bitcast<i32>(x_25)));
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main([[builtin(global_invocation_id)]] x_2_param : vec3<u32>) {
+  x_2 = x_2_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthanequal/0.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthanequal/0.spvasm
new file mode 100644
index 0000000..e38823e
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthanequal/0.spvasm
@@ -0,0 +1,46 @@
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %1 "main" %gl_GlobalInvocationID
+               OpExecutionMode %1 LocalSize 1 1 1
+               OpSource OpenCL_C 120
+               OpDecorate %_runtimearr_uint ArrayStride 4
+               OpMemberDecorate %_struct_4 0 Offset 0
+               OpDecorate %_struct_4 BufferBlock
+               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
+               OpDecorate %5 DescriptorSet 0
+               OpDecorate %5 Binding 0
+               OpDecorate %6 DescriptorSet 0
+               OpDecorate %6 Binding 1
+               OpDecorate %7 DescriptorSet 0
+               OpDecorate %7 Binding 2
+       %uint = OpTypeInt 32 0
+%_runtimearr_uint = OpTypeRuntimeArray %uint
+  %_struct_4 = OpTypeStruct %_runtimearr_uint
+%_ptr_Uniform__struct_4 = OpTypePointer Uniform %_struct_4
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%_ptr_Input_uint = OpTypePointer Input %uint
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+       %bool = OpTypeBool
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
+          %5 = OpVariable %_ptr_Uniform__struct_4 Uniform
+          %6 = OpVariable %_ptr_Uniform__struct_4 Uniform
+          %7 = OpVariable %_ptr_Uniform__struct_4 Uniform
+          %1 = OpFunction %void None %11
+         %19 = OpLabel
+         %20 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_0
+         %21 = OpLoad %uint %20
+         %22 = OpAccessChain %_ptr_Uniform_uint %5 %uint_0 %21
+         %23 = OpLoad %uint %22
+         %24 = OpAccessChain %_ptr_Uniform_uint %6 %uint_0 %21
+         %25 = OpLoad %uint %24
+         %26 = OpSLessThanEqual %bool %23 %25
+         %27 = OpSelect %uint %26 %uint_1 %uint_0
+         %28 = OpAccessChain %_ptr_Uniform_uint %7 %uint_0 %21
+               OpStore %28 %27
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthanequal/0.spvasm.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthanequal/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..65e9ee6
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthanequal/0.spvasm.expected.hlsl
@@ -0,0 +1,24 @@
+static uint3 x_2 = uint3(0u, 0u, 0u);
+RWByteAddressBuffer x_5 : register(u0, space0);
+RWByteAddressBuffer x_6 : register(u1, space0);
+RWByteAddressBuffer x_7 : register(u2, space0);
+
+void main_1() {
+  const uint x_21 = x_2.x;
+  const uint x_23 = x_5.Load((4u * x_21));
+  const uint x_25 = x_6.Load((4u * x_21));
+  x_7.Store((4u * x_21), asuint(((asint(x_23) <= asint(x_25)) ? 1u : 0u)));
+  return;
+}
+
+struct tint_symbol_1 {
+  uint3 x_2_param : SV_DispatchThreadID;
+};
+
+[numthreads(1, 1, 1)]
+void main(tint_symbol_1 tint_symbol) {
+  const uint3 x_2_param = tint_symbol.x_2_param;
+  x_2 = x_2_param;
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthanequal/0.spvasm.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthanequal/0.spvasm.expected.msl
new file mode 100644
index 0000000..7ae0315
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthanequal/0.spvasm.expected.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  /* 0x0000 */ uint field0[1];
+};
+
+void main_1(device S& x_5, device S& x_6, device S& x_7, thread uint3* const tint_symbol_2) {
+  uint const x_21 = (*(tint_symbol_2)).x;
+  uint const x_23 = x_5.field0[x_21];
+  uint const x_25 = x_6.field0[x_21];
+  x_7.field0[x_21] = select(0u, 1u, (as_type<int>(x_23) <= as_type<int>(x_25)));
+  return;
+}
+
+kernel void tint_symbol(uint3 x_2_param [[thread_position_in_grid]], device S& x_5 [[buffer(0)]], device S& x_6 [[buffer(1)]], device S& x_7 [[buffer(2)]]) {
+  thread uint3 tint_symbol_3 = 0u;
+  tint_symbol_3 = x_2_param;
+  main_1(x_5, x_6, x_7, &(tint_symbol_3));
+  return;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthanequal/0.spvasm.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthanequal/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..830ac7d
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthanequal/0.spvasm.expected.spvasm
@@ -0,0 +1,72 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 39
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main" %tint_symbol
+               OpExecutionMode %main LocalSize 1 1 1
+               OpName %x_2 "x_2"
+               OpName %S "S"
+               OpMemberName %S 0 "field0"
+               OpName %x_5 "x_5"
+               OpName %x_6 "x_6"
+               OpName %x_7 "x_7"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main_1 "main_1"
+               OpName %main "main"
+               OpDecorate %S Block
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %_runtimearr_uint ArrayStride 4
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 2
+               OpDecorate %tint_symbol BuiltIn GlobalInvocationId
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Private_v3uint = OpTypePointer Private %v3uint
+          %5 = OpConstantNull %v3uint
+        %x_2 = OpVariable %_ptr_Private_v3uint Private %5
+%_runtimearr_uint = OpTypeRuntimeArray %uint
+          %S = OpTypeStruct %_runtimearr_uint
+%_ptr_StorageBuffer_S = OpTypePointer StorageBuffer %S
+        %x_5 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_6 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_7 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%tint_symbol = OpVariable %_ptr_Input_v3uint Input
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_uint = OpTypePointer Private %uint
+%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
+        %int = OpTypeInt 32 1
+       %bool = OpTypeBool
+     %uint_1 = OpConstant %uint 1
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+         %20 = OpAccessChain %_ptr_Private_uint %x_2 %uint_0
+         %21 = OpLoad %uint %20
+         %23 = OpAccessChain %_ptr_StorageBuffer_uint %x_5 %uint_0 %21
+         %24 = OpLoad %uint %23
+         %25 = OpAccessChain %_ptr_StorageBuffer_uint %x_6 %uint_0 %21
+         %26 = OpLoad %uint %25
+         %27 = OpAccessChain %_ptr_StorageBuffer_uint %x_7 %uint_0 %21
+         %29 = OpBitcast %int %24
+         %31 = OpBitcast %int %26
+         %32 = OpSLessThanEqual %bool %29 %31
+         %28 = OpSelect %uint %32 %uint_1 %uint_0
+               OpStore %27 %28
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %36 = OpLabel
+         %37 = OpLoad %v3uint %tint_symbol
+               OpStore %x_2 %37
+         %38 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthanequal/0.spvasm.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthanequal/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..a8c97bf
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthanequal/0.spvasm.expected.wgsl
@@ -0,0 +1,28 @@
+type RTArr = [[stride(4)]] array<u32>;
+
+[[block]]
+struct S {
+  field0 : RTArr;
+};
+
+var<private> x_2 : vec3<u32>;
+
+[[group(0), binding(0)]] var<storage, read_write> x_5 : S;
+
+[[group(0), binding(1)]] var<storage, read_write> x_6 : S;
+
+[[group(0), binding(2)]] var<storage, read_write> x_7 : S;
+
+fn main_1() {
+  let x_21 : u32 = x_2.x;
+  let x_23 : u32 = x_5.field0[x_21];
+  let x_25 : u32 = x_6.field0[x_21];
+  x_7.field0[x_21] = select(0u, 1u, (bitcast<i32>(x_23) <= bitcast<i32>(x_25)));
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main([[builtin(global_invocation_id)]] x_2_param : vec3<u32>) {
+  x_2 = x_2_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthanequal/0.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthanequal/0.wgsl
new file mode 100644
index 0000000..a8c97bf
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthanequal/0.wgsl
@@ -0,0 +1,28 @@
+type RTArr = [[stride(4)]] array<u32>;
+
+[[block]]
+struct S {
+  field0 : RTArr;
+};
+
+var<private> x_2 : vec3<u32>;
+
+[[group(0), binding(0)]] var<storage, read_write> x_5 : S;
+
+[[group(0), binding(1)]] var<storage, read_write> x_6 : S;
+
+[[group(0), binding(2)]] var<storage, read_write> x_7 : S;
+
+fn main_1() {
+  let x_21 : u32 = x_2.x;
+  let x_23 : u32 = x_5.field0[x_21];
+  let x_25 : u32 = x_6.field0[x_21];
+  x_7.field0[x_21] = select(0u, 1u, (bitcast<i32>(x_23) <= bitcast<i32>(x_25)));
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main([[builtin(global_invocation_id)]] x_2_param : vec3<u32>) {
+  x_2 = x_2_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthanequal/0.wgsl.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthanequal/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..65e9ee6
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthanequal/0.wgsl.expected.hlsl
@@ -0,0 +1,24 @@
+static uint3 x_2 = uint3(0u, 0u, 0u);
+RWByteAddressBuffer x_5 : register(u0, space0);
+RWByteAddressBuffer x_6 : register(u1, space0);
+RWByteAddressBuffer x_7 : register(u2, space0);
+
+void main_1() {
+  const uint x_21 = x_2.x;
+  const uint x_23 = x_5.Load((4u * x_21));
+  const uint x_25 = x_6.Load((4u * x_21));
+  x_7.Store((4u * x_21), asuint(((asint(x_23) <= asint(x_25)) ? 1u : 0u)));
+  return;
+}
+
+struct tint_symbol_1 {
+  uint3 x_2_param : SV_DispatchThreadID;
+};
+
+[numthreads(1, 1, 1)]
+void main(tint_symbol_1 tint_symbol) {
+  const uint3 x_2_param = tint_symbol.x_2_param;
+  x_2 = x_2_param;
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthanequal/0.wgsl.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthanequal/0.wgsl.expected.msl
new file mode 100644
index 0000000..7ae0315
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthanequal/0.wgsl.expected.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  /* 0x0000 */ uint field0[1];
+};
+
+void main_1(device S& x_5, device S& x_6, device S& x_7, thread uint3* const tint_symbol_2) {
+  uint const x_21 = (*(tint_symbol_2)).x;
+  uint const x_23 = x_5.field0[x_21];
+  uint const x_25 = x_6.field0[x_21];
+  x_7.field0[x_21] = select(0u, 1u, (as_type<int>(x_23) <= as_type<int>(x_25)));
+  return;
+}
+
+kernel void tint_symbol(uint3 x_2_param [[thread_position_in_grid]], device S& x_5 [[buffer(0)]], device S& x_6 [[buffer(1)]], device S& x_7 [[buffer(2)]]) {
+  thread uint3 tint_symbol_3 = 0u;
+  tint_symbol_3 = x_2_param;
+  main_1(x_5, x_6, x_7, &(tint_symbol_3));
+  return;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthanequal/0.wgsl.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthanequal/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..830ac7d
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthanequal/0.wgsl.expected.spvasm
@@ -0,0 +1,72 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 39
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main" %tint_symbol
+               OpExecutionMode %main LocalSize 1 1 1
+               OpName %x_2 "x_2"
+               OpName %S "S"
+               OpMemberName %S 0 "field0"
+               OpName %x_5 "x_5"
+               OpName %x_6 "x_6"
+               OpName %x_7 "x_7"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main_1 "main_1"
+               OpName %main "main"
+               OpDecorate %S Block
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %_runtimearr_uint ArrayStride 4
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 2
+               OpDecorate %tint_symbol BuiltIn GlobalInvocationId
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Private_v3uint = OpTypePointer Private %v3uint
+          %5 = OpConstantNull %v3uint
+        %x_2 = OpVariable %_ptr_Private_v3uint Private %5
+%_runtimearr_uint = OpTypeRuntimeArray %uint
+          %S = OpTypeStruct %_runtimearr_uint
+%_ptr_StorageBuffer_S = OpTypePointer StorageBuffer %S
+        %x_5 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_6 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_7 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%tint_symbol = OpVariable %_ptr_Input_v3uint Input
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_uint = OpTypePointer Private %uint
+%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
+        %int = OpTypeInt 32 1
+       %bool = OpTypeBool
+     %uint_1 = OpConstant %uint 1
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+         %20 = OpAccessChain %_ptr_Private_uint %x_2 %uint_0
+         %21 = OpLoad %uint %20
+         %23 = OpAccessChain %_ptr_StorageBuffer_uint %x_5 %uint_0 %21
+         %24 = OpLoad %uint %23
+         %25 = OpAccessChain %_ptr_StorageBuffer_uint %x_6 %uint_0 %21
+         %26 = OpLoad %uint %25
+         %27 = OpAccessChain %_ptr_StorageBuffer_uint %x_7 %uint_0 %21
+         %29 = OpBitcast %int %24
+         %31 = OpBitcast %int %26
+         %32 = OpSLessThanEqual %bool %29 %31
+         %28 = OpSelect %uint %32 %uint_1 %uint_0
+               OpStore %27 %28
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %36 = OpLabel
+         %37 = OpLoad %v3uint %tint_symbol
+               OpStore %x_2 %37
+         %38 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthanequal/0.wgsl.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthanequal/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..a8c97bf
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_int_compare/uint_slessthanequal/0.wgsl.expected.wgsl
@@ -0,0 +1,28 @@
+type RTArr = [[stride(4)]] array<u32>;
+
+[[block]]
+struct S {
+  field0 : RTArr;
+};
+
+var<private> x_2 : vec3<u32>;
+
+[[group(0), binding(0)]] var<storage, read_write> x_5 : S;
+
+[[group(0), binding(1)]] var<storage, read_write> x_6 : S;
+
+[[group(0), binding(2)]] var<storage, read_write> x_7 : S;
+
+fn main_1() {
+  let x_21 : u32 = x_2.x;
+  let x_23 : u32 = x_5.field0[x_21];
+  let x_25 : u32 = x_6.field0[x_21];
+  x_7.field0[x_21] = select(0u, 1u, (bitcast<i32>(x_23) <= bitcast<i32>(x_25)));
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main([[builtin(global_invocation_id)]] x_2_param : vec3<u32>) {
+  x_2 = x_2_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_int_uclamp/0-opt.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_int_uclamp/0-opt.spvasm
new file mode 100644
index 0000000..0e25dbb
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_int_uclamp/0-opt.spvasm
@@ -0,0 +1,53 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %2 "main" %gl_GlobalInvocationID
+               OpExecutionMode %2 LocalSize 1 1 1
+               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
+               OpDecorate %_runtimearr_int ArrayStride 4
+               OpDecorate %_struct_5 BufferBlock
+               OpMemberDecorate %_struct_5 0 Offset 0
+               OpDecorate %6 DescriptorSet 0
+               OpDecorate %6 Binding 0
+               OpDecorate %7 DescriptorSet 0
+               OpDecorate %7 Binding 1
+               OpDecorate %8 DescriptorSet 0
+               OpDecorate %8 Binding 2
+               OpDecorate %9 DescriptorSet 0
+               OpDecorate %9 Binding 3
+       %uint = OpTypeInt 32 0
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+%_ptr_Input_uint = OpTypePointer Input %uint
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+       %void = OpTypeVoid
+         %16 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+        %int = OpTypeInt 32 1
+%_runtimearr_int = OpTypeRuntimeArray %int
+      %v4int = OpTypeVector %int 4
+%_ptr_Input_int = OpTypePointer Input %int
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+  %_struct_5 = OpTypeStruct %_runtimearr_int
+%_ptr_Uniform__struct_5 = OpTypePointer Uniform %_struct_5
+%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
+          %6 = OpVariable %_ptr_Uniform__struct_5 Uniform
+          %7 = OpVariable %_ptr_Uniform__struct_5 Uniform
+          %8 = OpVariable %_ptr_Uniform__struct_5 Uniform
+          %9 = OpVariable %_ptr_Uniform__struct_5 Uniform
+          %2 = OpFunction %void None %16
+         %24 = OpLabel
+         %25 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_0
+         %26 = OpLoad %uint %25
+         %27 = OpAccessChain %_ptr_Uniform_int %6 %uint_0 %26
+         %28 = OpLoad %int %27
+         %29 = OpAccessChain %_ptr_Uniform_int %7 %uint_0 %26
+         %30 = OpLoad %int %29
+         %31 = OpAccessChain %_ptr_Uniform_int %8 %uint_0 %26
+         %32 = OpLoad %int %31
+         %33 = OpExtInst %int %1 UClamp %28 %30 %32
+         %34 = OpAccessChain %_ptr_Uniform_int %9 %uint_0 %26
+               OpStore %34 %33
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_int_uclamp/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_int_uclamp/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..09ae3b9
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_int_uclamp/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,26 @@
+static uint3 x_3 = uint3(0u, 0u, 0u);
+RWByteAddressBuffer x_6 : register(u0, space0);
+RWByteAddressBuffer x_7 : register(u1, space0);
+RWByteAddressBuffer x_8 : register(u2, space0);
+RWByteAddressBuffer x_9 : register(u3, space0);
+
+void main_1() {
+  const uint x_26 = x_3.x;
+  const int x_28 = asint(x_6.Load((4u * x_26)));
+  const int x_30 = asint(x_7.Load((4u * x_26)));
+  const int x_32 = asint(x_8.Load((4u * x_26)));
+  x_9.Store((4u * x_26), asuint(asint(clamp(asuint(x_28), asuint(x_30), asuint(x_32)))));
+  return;
+}
+
+struct tint_symbol_1 {
+  uint3 x_3_param : SV_DispatchThreadID;
+};
+
+[numthreads(1, 1, 1)]
+void main(tint_symbol_1 tint_symbol) {
+  const uint3 x_3_param = tint_symbol.x_3_param;
+  x_3 = x_3_param;
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_int_uclamp/0-opt.spvasm.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_int_uclamp/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..ef9ae4b
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_int_uclamp/0-opt.spvasm.expected.msl
@@ -0,0 +1,23 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  /* 0x0000 */ int field0[1];
+};
+
+void main_1(device S& x_6, device S& x_7, device S& x_8, device S& x_9, thread uint3* const tint_symbol_2) {
+  uint const x_26 = (*(tint_symbol_2)).x;
+  int const x_28 = x_6.field0[x_26];
+  int const x_30 = x_7.field0[x_26];
+  int const x_32 = x_8.field0[x_26];
+  x_9.field0[x_26] = as_type<int>(clamp(as_type<uint>(x_28), as_type<uint>(x_30), as_type<uint>(x_32)));
+  return;
+}
+
+kernel void tint_symbol(uint3 x_3_param [[thread_position_in_grid]], device S& x_6 [[buffer(0)]], device S& x_7 [[buffer(1)]], device S& x_8 [[buffer(2)]], device S& x_9 [[buffer(3)]]) {
+  thread uint3 tint_symbol_3 = 0u;
+  tint_symbol_3 = x_3_param;
+  main_1(x_6, x_7, x_8, x_9, &(tint_symbol_3));
+  return;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_int_uclamp/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_int_uclamp/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..2f44746
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_int_uclamp/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,78 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 42
+; Schema: 0
+               OpCapability Shader
+         %34 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main" %tint_symbol
+               OpExecutionMode %main LocalSize 1 1 1
+               OpName %x_3 "x_3"
+               OpName %S "S"
+               OpMemberName %S 0 "field0"
+               OpName %x_6 "x_6"
+               OpName %x_7 "x_7"
+               OpName %x_8 "x_8"
+               OpName %x_9 "x_9"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main_1 "main_1"
+               OpName %main "main"
+               OpDecorate %S Block
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %_runtimearr_int ArrayStride 4
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 2
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 3
+               OpDecorate %tint_symbol BuiltIn GlobalInvocationId
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Private_v3uint = OpTypePointer Private %v3uint
+          %5 = OpConstantNull %v3uint
+        %x_3 = OpVariable %_ptr_Private_v3uint Private %5
+        %int = OpTypeInt 32 1
+%_runtimearr_int = OpTypeRuntimeArray %int
+          %S = OpTypeStruct %_runtimearr_int
+%_ptr_StorageBuffer_S = OpTypePointer StorageBuffer %S
+        %x_6 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_7 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_8 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_9 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%tint_symbol = OpVariable %_ptr_Input_v3uint Input
+       %void = OpTypeVoid
+         %16 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_uint = OpTypePointer Private %uint
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+     %main_1 = OpFunction %void None %16
+         %19 = OpLabel
+         %22 = OpAccessChain %_ptr_Private_uint %x_3 %uint_0
+         %23 = OpLoad %uint %22
+         %25 = OpAccessChain %_ptr_StorageBuffer_int %x_6 %uint_0 %23
+         %26 = OpLoad %int %25
+         %27 = OpAccessChain %_ptr_StorageBuffer_int %x_7 %uint_0 %23
+         %28 = OpLoad %int %27
+         %29 = OpAccessChain %_ptr_StorageBuffer_int %x_8 %uint_0 %23
+         %30 = OpLoad %int %29
+         %31 = OpAccessChain %_ptr_StorageBuffer_int %x_9 %uint_0 %23
+         %35 = OpBitcast %uint %26
+         %36 = OpBitcast %uint %28
+         %37 = OpBitcast %uint %30
+         %33 = OpExtInst %uint %34 UClamp %35 %36 %37
+         %32 = OpBitcast %int %33
+               OpStore %31 %32
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %16
+         %39 = OpLabel
+         %40 = OpLoad %v3uint %tint_symbol
+               OpStore %x_3 %40
+         %41 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_int_uclamp/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_int_uclamp/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..d03857b
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_int_uclamp/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,31 @@
+type RTArr = [[stride(4)]] array<i32>;
+
+[[block]]
+struct S {
+  field0 : RTArr;
+};
+
+var<private> x_3 : vec3<u32>;
+
+[[group(0), binding(0)]] var<storage, read_write> x_6 : S;
+
+[[group(0), binding(1)]] var<storage, read_write> x_7 : S;
+
+[[group(0), binding(2)]] var<storage, read_write> x_8 : S;
+
+[[group(0), binding(3)]] var<storage, read_write> x_9 : S;
+
+fn main_1() {
+  let x_26 : u32 = x_3.x;
+  let x_28 : i32 = x_6.field0[x_26];
+  let x_30 : i32 = x_7.field0[x_26];
+  let x_32 : i32 = x_8.field0[x_26];
+  x_9.field0[x_26] = bitcast<i32>(clamp(bitcast<u32>(x_28), bitcast<u32>(x_30), bitcast<u32>(x_32)));
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main([[builtin(global_invocation_id)]] x_3_param : vec3<u32>) {
+  x_3 = x_3_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_int_uclamp/0-opt.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_int_uclamp/0-opt.wgsl
new file mode 100644
index 0000000..d03857b
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_int_uclamp/0-opt.wgsl
@@ -0,0 +1,31 @@
+type RTArr = [[stride(4)]] array<i32>;
+
+[[block]]
+struct S {
+  field0 : RTArr;
+};
+
+var<private> x_3 : vec3<u32>;
+
+[[group(0), binding(0)]] var<storage, read_write> x_6 : S;
+
+[[group(0), binding(1)]] var<storage, read_write> x_7 : S;
+
+[[group(0), binding(2)]] var<storage, read_write> x_8 : S;
+
+[[group(0), binding(3)]] var<storage, read_write> x_9 : S;
+
+fn main_1() {
+  let x_26 : u32 = x_3.x;
+  let x_28 : i32 = x_6.field0[x_26];
+  let x_30 : i32 = x_7.field0[x_26];
+  let x_32 : i32 = x_8.field0[x_26];
+  x_9.field0[x_26] = bitcast<i32>(clamp(bitcast<u32>(x_28), bitcast<u32>(x_30), bitcast<u32>(x_32)));
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main([[builtin(global_invocation_id)]] x_3_param : vec3<u32>) {
+  x_3 = x_3_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_int_uclamp/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_int_uclamp/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..09ae3b9
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_int_uclamp/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,26 @@
+static uint3 x_3 = uint3(0u, 0u, 0u);
+RWByteAddressBuffer x_6 : register(u0, space0);
+RWByteAddressBuffer x_7 : register(u1, space0);
+RWByteAddressBuffer x_8 : register(u2, space0);
+RWByteAddressBuffer x_9 : register(u3, space0);
+
+void main_1() {
+  const uint x_26 = x_3.x;
+  const int x_28 = asint(x_6.Load((4u * x_26)));
+  const int x_30 = asint(x_7.Load((4u * x_26)));
+  const int x_32 = asint(x_8.Load((4u * x_26)));
+  x_9.Store((4u * x_26), asuint(asint(clamp(asuint(x_28), asuint(x_30), asuint(x_32)))));
+  return;
+}
+
+struct tint_symbol_1 {
+  uint3 x_3_param : SV_DispatchThreadID;
+};
+
+[numthreads(1, 1, 1)]
+void main(tint_symbol_1 tint_symbol) {
+  const uint3 x_3_param = tint_symbol.x_3_param;
+  x_3 = x_3_param;
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_int_uclamp/0-opt.wgsl.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_int_uclamp/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..ef9ae4b
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_int_uclamp/0-opt.wgsl.expected.msl
@@ -0,0 +1,23 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  /* 0x0000 */ int field0[1];
+};
+
+void main_1(device S& x_6, device S& x_7, device S& x_8, device S& x_9, thread uint3* const tint_symbol_2) {
+  uint const x_26 = (*(tint_symbol_2)).x;
+  int const x_28 = x_6.field0[x_26];
+  int const x_30 = x_7.field0[x_26];
+  int const x_32 = x_8.field0[x_26];
+  x_9.field0[x_26] = as_type<int>(clamp(as_type<uint>(x_28), as_type<uint>(x_30), as_type<uint>(x_32)));
+  return;
+}
+
+kernel void tint_symbol(uint3 x_3_param [[thread_position_in_grid]], device S& x_6 [[buffer(0)]], device S& x_7 [[buffer(1)]], device S& x_8 [[buffer(2)]], device S& x_9 [[buffer(3)]]) {
+  thread uint3 tint_symbol_3 = 0u;
+  tint_symbol_3 = x_3_param;
+  main_1(x_6, x_7, x_8, x_9, &(tint_symbol_3));
+  return;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_int_uclamp/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_int_uclamp/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..2f44746
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_int_uclamp/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,78 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 42
+; Schema: 0
+               OpCapability Shader
+         %34 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main" %tint_symbol
+               OpExecutionMode %main LocalSize 1 1 1
+               OpName %x_3 "x_3"
+               OpName %S "S"
+               OpMemberName %S 0 "field0"
+               OpName %x_6 "x_6"
+               OpName %x_7 "x_7"
+               OpName %x_8 "x_8"
+               OpName %x_9 "x_9"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main_1 "main_1"
+               OpName %main "main"
+               OpDecorate %S Block
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %_runtimearr_int ArrayStride 4
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 2
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 3
+               OpDecorate %tint_symbol BuiltIn GlobalInvocationId
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Private_v3uint = OpTypePointer Private %v3uint
+          %5 = OpConstantNull %v3uint
+        %x_3 = OpVariable %_ptr_Private_v3uint Private %5
+        %int = OpTypeInt 32 1
+%_runtimearr_int = OpTypeRuntimeArray %int
+          %S = OpTypeStruct %_runtimearr_int
+%_ptr_StorageBuffer_S = OpTypePointer StorageBuffer %S
+        %x_6 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_7 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_8 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_9 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%tint_symbol = OpVariable %_ptr_Input_v3uint Input
+       %void = OpTypeVoid
+         %16 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_uint = OpTypePointer Private %uint
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+     %main_1 = OpFunction %void None %16
+         %19 = OpLabel
+         %22 = OpAccessChain %_ptr_Private_uint %x_3 %uint_0
+         %23 = OpLoad %uint %22
+         %25 = OpAccessChain %_ptr_StorageBuffer_int %x_6 %uint_0 %23
+         %26 = OpLoad %int %25
+         %27 = OpAccessChain %_ptr_StorageBuffer_int %x_7 %uint_0 %23
+         %28 = OpLoad %int %27
+         %29 = OpAccessChain %_ptr_StorageBuffer_int %x_8 %uint_0 %23
+         %30 = OpLoad %int %29
+         %31 = OpAccessChain %_ptr_StorageBuffer_int %x_9 %uint_0 %23
+         %35 = OpBitcast %uint %26
+         %36 = OpBitcast %uint %28
+         %37 = OpBitcast %uint %30
+         %33 = OpExtInst %uint %34 UClamp %35 %36 %37
+         %32 = OpBitcast %int %33
+               OpStore %31 %32
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %16
+         %39 = OpLabel
+         %40 = OpLoad %v3uint %tint_symbol
+               OpStore %x_3 %40
+         %41 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_int_uclamp/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_int_uclamp/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..d03857b
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_int_uclamp/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,31 @@
+type RTArr = [[stride(4)]] array<i32>;
+
+[[block]]
+struct S {
+  field0 : RTArr;
+};
+
+var<private> x_3 : vec3<u32>;
+
+[[group(0), binding(0)]] var<storage, read_write> x_6 : S;
+
+[[group(0), binding(1)]] var<storage, read_write> x_7 : S;
+
+[[group(0), binding(2)]] var<storage, read_write> x_8 : S;
+
+[[group(0), binding(3)]] var<storage, read_write> x_9 : S;
+
+fn main_1() {
+  let x_26 : u32 = x_3.x;
+  let x_28 : i32 = x_6.field0[x_26];
+  let x_30 : i32 = x_7.field0[x_26];
+  let x_32 : i32 = x_8.field0[x_26];
+  x_9.field0[x_26] = bitcast<i32>(clamp(bitcast<u32>(x_28), bitcast<u32>(x_30), bitcast<u32>(x_32)));
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main([[builtin(global_invocation_id)]] x_3_param : vec3<u32>) {
+  x_3 = x_3_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sabs/0-opt.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sabs/0-opt.spvasm
new file mode 100644
index 0000000..9da709e
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sabs/0-opt.spvasm
@@ -0,0 +1,40 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %2 "main" %gl_GlobalInvocationID
+               OpExecutionMode %2 LocalSize 1 1 1
+               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
+               OpDecorate %_runtimearr_uint ArrayStride 4
+               OpDecorate %_struct_5 BufferBlock
+               OpMemberDecorate %_struct_5 0 Offset 0
+               OpDecorate %6 DescriptorSet 0
+               OpDecorate %6 Binding 0
+               OpDecorate %7 DescriptorSet 0
+               OpDecorate %7 Binding 1
+       %uint = OpTypeInt 32 0
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+%_ptr_Input_uint = OpTypePointer Input %uint
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_runtimearr_uint = OpTypeRuntimeArray %uint
+     %v2uint = OpTypeVector %uint 2
+  %_struct_5 = OpTypeStruct %_runtimearr_uint
+%_ptr_Uniform__struct_5 = OpTypePointer Uniform %_struct_5
+%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
+          %6 = OpVariable %_ptr_Uniform__struct_5 Uniform
+          %7 = OpVariable %_ptr_Uniform__struct_5 Uniform
+          %2 = OpFunction %void None %14
+         %19 = OpLabel
+         %20 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_0
+         %21 = OpLoad %uint %20
+         %22 = OpAccessChain %_ptr_Uniform_uint %6 %uint_0 %21
+         %23 = OpLoad %uint %22
+         %24 = OpExtInst %uint %1 SAbs %23
+         %25 = OpAccessChain %_ptr_Uniform_uint %7 %uint_0 %21
+               OpStore %25 %24
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sabs/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sabs/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..fd7b050
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sabs/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,22 @@
+static uint3 x_3 = uint3(0u, 0u, 0u);
+RWByteAddressBuffer x_6 : register(u0, space0);
+RWByteAddressBuffer x_7 : register(u1, space0);
+
+void main_1() {
+  const uint x_21 = x_3.x;
+  const uint x_23 = x_6.Load((4u * x_21));
+  x_7.Store((4u * x_21), asuint(asuint(abs(asint(x_23)))));
+  return;
+}
+
+struct tint_symbol_1 {
+  uint3 x_3_param : SV_DispatchThreadID;
+};
+
+[numthreads(1, 1, 1)]
+void main(tint_symbol_1 tint_symbol) {
+  const uint3 x_3_param = tint_symbol.x_3_param;
+  x_3 = x_3_param;
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sabs/0-opt.spvasm.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sabs/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..dd60856
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sabs/0-opt.spvasm.expected.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  /* 0x0000 */ uint field0[1];
+};
+
+void main_1(device S& x_6, device S& x_7, thread uint3* const tint_symbol_2) {
+  uint const x_21 = (*(tint_symbol_2)).x;
+  uint const x_23 = x_6.field0[x_21];
+  x_7.field0[x_21] = as_type<uint>(abs(as_type<int>(x_23)));
+  return;
+}
+
+kernel void tint_symbol(uint3 x_3_param [[thread_position_in_grid]], device S& x_6 [[buffer(0)]], device S& x_7 [[buffer(1)]]) {
+  thread uint3 tint_symbol_3 = 0u;
+  tint_symbol_3 = x_3_param;
+  main_1(x_6, x_7, &(tint_symbol_3));
+  return;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sabs/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sabs/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..866a110
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sabs/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,64 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 34
+; Schema: 0
+               OpCapability Shader
+         %28 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main" %tint_symbol
+               OpExecutionMode %main LocalSize 1 1 1
+               OpName %x_3 "x_3"
+               OpName %S "S"
+               OpMemberName %S 0 "field0"
+               OpName %x_6 "x_6"
+               OpName %x_7 "x_7"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main_1 "main_1"
+               OpName %main "main"
+               OpDecorate %S Block
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %_runtimearr_uint ArrayStride 4
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %tint_symbol BuiltIn GlobalInvocationId
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Private_v3uint = OpTypePointer Private %v3uint
+          %5 = OpConstantNull %v3uint
+        %x_3 = OpVariable %_ptr_Private_v3uint Private %5
+%_runtimearr_uint = OpTypeRuntimeArray %uint
+          %S = OpTypeStruct %_runtimearr_uint
+%_ptr_StorageBuffer_S = OpTypePointer StorageBuffer %S
+        %x_6 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_7 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%tint_symbol = OpVariable %_ptr_Input_v3uint Input
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_uint = OpTypePointer Private %uint
+%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
+        %int = OpTypeInt 32 1
+     %main_1 = OpFunction %void None %13
+         %16 = OpLabel
+         %19 = OpAccessChain %_ptr_Private_uint %x_3 %uint_0
+         %20 = OpLoad %uint %19
+         %22 = OpAccessChain %_ptr_StorageBuffer_uint %x_6 %uint_0 %20
+         %23 = OpLoad %uint %22
+         %24 = OpAccessChain %_ptr_StorageBuffer_uint %x_7 %uint_0 %20
+         %29 = OpBitcast %int %23
+         %26 = OpExtInst %int %28 SAbs %29
+         %25 = OpBitcast %uint %26
+               OpStore %24 %25
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %13
+         %31 = OpLabel
+         %32 = OpLoad %v3uint %tint_symbol
+               OpStore %x_3 %32
+         %33 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sabs/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sabs/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..52b1532
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sabs/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,25 @@
+type RTArr = [[stride(4)]] array<u32>;
+
+[[block]]
+struct S {
+  field0 : RTArr;
+};
+
+var<private> x_3 : vec3<u32>;
+
+[[group(0), binding(0)]] var<storage, read_write> x_6 : S;
+
+[[group(0), binding(1)]] var<storage, read_write> x_7 : S;
+
+fn main_1() {
+  let x_21 : u32 = x_3.x;
+  let x_23 : u32 = x_6.field0[x_21];
+  x_7.field0[x_21] = bitcast<u32>(abs(bitcast<i32>(x_23)));
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main([[builtin(global_invocation_id)]] x_3_param : vec3<u32>) {
+  x_3 = x_3_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sabs/0-opt.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sabs/0-opt.wgsl
new file mode 100644
index 0000000..52b1532
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sabs/0-opt.wgsl
@@ -0,0 +1,25 @@
+type RTArr = [[stride(4)]] array<u32>;
+
+[[block]]
+struct S {
+  field0 : RTArr;
+};
+
+var<private> x_3 : vec3<u32>;
+
+[[group(0), binding(0)]] var<storage, read_write> x_6 : S;
+
+[[group(0), binding(1)]] var<storage, read_write> x_7 : S;
+
+fn main_1() {
+  let x_21 : u32 = x_3.x;
+  let x_23 : u32 = x_6.field0[x_21];
+  x_7.field0[x_21] = bitcast<u32>(abs(bitcast<i32>(x_23)));
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main([[builtin(global_invocation_id)]] x_3_param : vec3<u32>) {
+  x_3 = x_3_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sabs/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sabs/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..fd7b050
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sabs/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,22 @@
+static uint3 x_3 = uint3(0u, 0u, 0u);
+RWByteAddressBuffer x_6 : register(u0, space0);
+RWByteAddressBuffer x_7 : register(u1, space0);
+
+void main_1() {
+  const uint x_21 = x_3.x;
+  const uint x_23 = x_6.Load((4u * x_21));
+  x_7.Store((4u * x_21), asuint(asuint(abs(asint(x_23)))));
+  return;
+}
+
+struct tint_symbol_1 {
+  uint3 x_3_param : SV_DispatchThreadID;
+};
+
+[numthreads(1, 1, 1)]
+void main(tint_symbol_1 tint_symbol) {
+  const uint3 x_3_param = tint_symbol.x_3_param;
+  x_3 = x_3_param;
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sabs/0-opt.wgsl.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sabs/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..dd60856
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sabs/0-opt.wgsl.expected.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  /* 0x0000 */ uint field0[1];
+};
+
+void main_1(device S& x_6, device S& x_7, thread uint3* const tint_symbol_2) {
+  uint const x_21 = (*(tint_symbol_2)).x;
+  uint const x_23 = x_6.field0[x_21];
+  x_7.field0[x_21] = as_type<uint>(abs(as_type<int>(x_23)));
+  return;
+}
+
+kernel void tint_symbol(uint3 x_3_param [[thread_position_in_grid]], device S& x_6 [[buffer(0)]], device S& x_7 [[buffer(1)]]) {
+  thread uint3 tint_symbol_3 = 0u;
+  tint_symbol_3 = x_3_param;
+  main_1(x_6, x_7, &(tint_symbol_3));
+  return;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sabs/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sabs/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..866a110
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sabs/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,64 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 34
+; Schema: 0
+               OpCapability Shader
+         %28 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main" %tint_symbol
+               OpExecutionMode %main LocalSize 1 1 1
+               OpName %x_3 "x_3"
+               OpName %S "S"
+               OpMemberName %S 0 "field0"
+               OpName %x_6 "x_6"
+               OpName %x_7 "x_7"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main_1 "main_1"
+               OpName %main "main"
+               OpDecorate %S Block
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %_runtimearr_uint ArrayStride 4
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %tint_symbol BuiltIn GlobalInvocationId
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Private_v3uint = OpTypePointer Private %v3uint
+          %5 = OpConstantNull %v3uint
+        %x_3 = OpVariable %_ptr_Private_v3uint Private %5
+%_runtimearr_uint = OpTypeRuntimeArray %uint
+          %S = OpTypeStruct %_runtimearr_uint
+%_ptr_StorageBuffer_S = OpTypePointer StorageBuffer %S
+        %x_6 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_7 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%tint_symbol = OpVariable %_ptr_Input_v3uint Input
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_uint = OpTypePointer Private %uint
+%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
+        %int = OpTypeInt 32 1
+     %main_1 = OpFunction %void None %13
+         %16 = OpLabel
+         %19 = OpAccessChain %_ptr_Private_uint %x_3 %uint_0
+         %20 = OpLoad %uint %19
+         %22 = OpAccessChain %_ptr_StorageBuffer_uint %x_6 %uint_0 %20
+         %23 = OpLoad %uint %22
+         %24 = OpAccessChain %_ptr_StorageBuffer_uint %x_7 %uint_0 %20
+         %29 = OpBitcast %int %23
+         %26 = OpExtInst %int %28 SAbs %29
+         %25 = OpBitcast %uint %26
+               OpStore %24 %25
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %13
+         %31 = OpLabel
+         %32 = OpLoad %v3uint %tint_symbol
+               OpStore %x_3 %32
+         %33 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sabs/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sabs/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..52b1532
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sabs/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,25 @@
+type RTArr = [[stride(4)]] array<u32>;
+
+[[block]]
+struct S {
+  field0 : RTArr;
+};
+
+var<private> x_3 : vec3<u32>;
+
+[[group(0), binding(0)]] var<storage, read_write> x_6 : S;
+
+[[group(0), binding(1)]] var<storage, read_write> x_7 : S;
+
+fn main_1() {
+  let x_21 : u32 = x_3.x;
+  let x_23 : u32 = x_6.field0[x_21];
+  x_7.field0[x_21] = bitcast<u32>(abs(bitcast<i32>(x_23)));
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main([[builtin(global_invocation_id)]] x_3_param : vec3<u32>) {
+  x_3 = x_3_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sclamp/0-opt.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sclamp/0-opt.spvasm
new file mode 100644
index 0000000..9b588f9
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sclamp/0-opt.spvasm
@@ -0,0 +1,50 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %2 "main" %gl_GlobalInvocationID
+               OpExecutionMode %2 LocalSize 1 1 1
+               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
+               OpDecorate %_runtimearr_uint ArrayStride 4
+               OpDecorate %_struct_5 BufferBlock
+               OpMemberDecorate %_struct_5 0 Offset 0
+               OpDecorate %6 DescriptorSet 0
+               OpDecorate %6 Binding 0
+               OpDecorate %7 DescriptorSet 0
+               OpDecorate %7 Binding 1
+               OpDecorate %8 DescriptorSet 0
+               OpDecorate %8 Binding 2
+               OpDecorate %9 DescriptorSet 0
+               OpDecorate %9 Binding 3
+       %uint = OpTypeInt 32 0
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+%_ptr_Input_uint = OpTypePointer Input %uint
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+       %void = OpTypeVoid
+         %16 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_runtimearr_uint = OpTypeRuntimeArray %uint
+     %v4uint = OpTypeVector %uint 4
+  %_struct_5 = OpTypeStruct %_runtimearr_uint
+%_ptr_Uniform__struct_5 = OpTypePointer Uniform %_struct_5
+%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
+          %6 = OpVariable %_ptr_Uniform__struct_5 Uniform
+          %7 = OpVariable %_ptr_Uniform__struct_5 Uniform
+          %8 = OpVariable %_ptr_Uniform__struct_5 Uniform
+          %9 = OpVariable %_ptr_Uniform__struct_5 Uniform
+          %2 = OpFunction %void None %16
+         %21 = OpLabel
+         %22 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_0
+         %23 = OpLoad %uint %22
+         %24 = OpAccessChain %_ptr_Uniform_uint %6 %uint_0 %23
+         %25 = OpLoad %uint %24
+         %26 = OpAccessChain %_ptr_Uniform_uint %7 %uint_0 %23
+         %27 = OpLoad %uint %26
+         %28 = OpAccessChain %_ptr_Uniform_uint %8 %uint_0 %23
+         %29 = OpLoad %uint %28
+         %30 = OpExtInst %uint %1 SClamp %25 %27 %29
+         %31 = OpAccessChain %_ptr_Uniform_uint %9 %uint_0 %23
+               OpStore %31 %30
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sclamp/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sclamp/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..55f55f5
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sclamp/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,26 @@
+static uint3 x_3 = uint3(0u, 0u, 0u);
+RWByteAddressBuffer x_6 : register(u0, space0);
+RWByteAddressBuffer x_7 : register(u1, space0);
+RWByteAddressBuffer x_8 : register(u2, space0);
+RWByteAddressBuffer x_9 : register(u3, space0);
+
+void main_1() {
+  const uint x_23 = x_3.x;
+  const uint x_25 = x_6.Load((4u * x_23));
+  const uint x_27 = x_7.Load((4u * x_23));
+  const uint x_29 = x_8.Load((4u * x_23));
+  x_9.Store((4u * x_23), asuint(asuint(clamp(asint(x_25), asint(x_27), asint(x_29)))));
+  return;
+}
+
+struct tint_symbol_1 {
+  uint3 x_3_param : SV_DispatchThreadID;
+};
+
+[numthreads(1, 1, 1)]
+void main(tint_symbol_1 tint_symbol) {
+  const uint3 x_3_param = tint_symbol.x_3_param;
+  x_3 = x_3_param;
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sclamp/0-opt.spvasm.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sclamp/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..f8e42e1
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sclamp/0-opt.spvasm.expected.msl
@@ -0,0 +1,23 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  /* 0x0000 */ uint field0[1];
+};
+
+void main_1(device S& x_6, device S& x_7, device S& x_8, device S& x_9, thread uint3* const tint_symbol_2) {
+  uint const x_23 = (*(tint_symbol_2)).x;
+  uint const x_25 = x_6.field0[x_23];
+  uint const x_27 = x_7.field0[x_23];
+  uint const x_29 = x_8.field0[x_23];
+  x_9.field0[x_23] = as_type<uint>(clamp(as_type<int>(x_25), as_type<int>(x_27), as_type<int>(x_29)));
+  return;
+}
+
+kernel void tint_symbol(uint3 x_3_param [[thread_position_in_grid]], device S& x_6 [[buffer(0)]], device S& x_7 [[buffer(1)]], device S& x_8 [[buffer(2)]], device S& x_9 [[buffer(3)]]) {
+  thread uint3 tint_symbol_3 = 0u;
+  tint_symbol_3 = x_3_param;
+  main_1(x_6, x_7, x_8, x_9, &(tint_symbol_3));
+  return;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sclamp/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sclamp/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..35000ef
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sclamp/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,78 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 42
+; Schema: 0
+               OpCapability Shader
+         %34 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main" %tint_symbol
+               OpExecutionMode %main LocalSize 1 1 1
+               OpName %x_3 "x_3"
+               OpName %S "S"
+               OpMemberName %S 0 "field0"
+               OpName %x_6 "x_6"
+               OpName %x_7 "x_7"
+               OpName %x_8 "x_8"
+               OpName %x_9 "x_9"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main_1 "main_1"
+               OpName %main "main"
+               OpDecorate %S Block
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %_runtimearr_uint ArrayStride 4
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 2
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 3
+               OpDecorate %tint_symbol BuiltIn GlobalInvocationId
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Private_v3uint = OpTypePointer Private %v3uint
+          %5 = OpConstantNull %v3uint
+        %x_3 = OpVariable %_ptr_Private_v3uint Private %5
+%_runtimearr_uint = OpTypeRuntimeArray %uint
+          %S = OpTypeStruct %_runtimearr_uint
+%_ptr_StorageBuffer_S = OpTypePointer StorageBuffer %S
+        %x_6 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_7 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_8 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_9 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%tint_symbol = OpVariable %_ptr_Input_v3uint Input
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_uint = OpTypePointer Private %uint
+%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
+        %int = OpTypeInt 32 1
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+         %21 = OpAccessChain %_ptr_Private_uint %x_3 %uint_0
+         %22 = OpLoad %uint %21
+         %24 = OpAccessChain %_ptr_StorageBuffer_uint %x_6 %uint_0 %22
+         %25 = OpLoad %uint %24
+         %26 = OpAccessChain %_ptr_StorageBuffer_uint %x_7 %uint_0 %22
+         %27 = OpLoad %uint %26
+         %28 = OpAccessChain %_ptr_StorageBuffer_uint %x_8 %uint_0 %22
+         %29 = OpLoad %uint %28
+         %30 = OpAccessChain %_ptr_StorageBuffer_uint %x_9 %uint_0 %22
+         %35 = OpBitcast %int %25
+         %36 = OpBitcast %int %27
+         %37 = OpBitcast %int %29
+         %32 = OpExtInst %int %34 SClamp %35 %36 %37
+         %31 = OpBitcast %uint %32
+               OpStore %30 %31
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %39 = OpLabel
+         %40 = OpLoad %v3uint %tint_symbol
+               OpStore %x_3 %40
+         %41 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sclamp/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sclamp/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..e582903
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sclamp/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,31 @@
+type RTArr = [[stride(4)]] array<u32>;
+
+[[block]]
+struct S {
+  field0 : RTArr;
+};
+
+var<private> x_3 : vec3<u32>;
+
+[[group(0), binding(0)]] var<storage, read_write> x_6 : S;
+
+[[group(0), binding(1)]] var<storage, read_write> x_7 : S;
+
+[[group(0), binding(2)]] var<storage, read_write> x_8 : S;
+
+[[group(0), binding(3)]] var<storage, read_write> x_9 : S;
+
+fn main_1() {
+  let x_23 : u32 = x_3.x;
+  let x_25 : u32 = x_6.field0[x_23];
+  let x_27 : u32 = x_7.field0[x_23];
+  let x_29 : u32 = x_8.field0[x_23];
+  x_9.field0[x_23] = bitcast<u32>(clamp(bitcast<i32>(x_25), bitcast<i32>(x_27), bitcast<i32>(x_29)));
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main([[builtin(global_invocation_id)]] x_3_param : vec3<u32>) {
+  x_3 = x_3_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sclamp/0-opt.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sclamp/0-opt.wgsl
new file mode 100644
index 0000000..e582903
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sclamp/0-opt.wgsl
@@ -0,0 +1,31 @@
+type RTArr = [[stride(4)]] array<u32>;
+
+[[block]]
+struct S {
+  field0 : RTArr;
+};
+
+var<private> x_3 : vec3<u32>;
+
+[[group(0), binding(0)]] var<storage, read_write> x_6 : S;
+
+[[group(0), binding(1)]] var<storage, read_write> x_7 : S;
+
+[[group(0), binding(2)]] var<storage, read_write> x_8 : S;
+
+[[group(0), binding(3)]] var<storage, read_write> x_9 : S;
+
+fn main_1() {
+  let x_23 : u32 = x_3.x;
+  let x_25 : u32 = x_6.field0[x_23];
+  let x_27 : u32 = x_7.field0[x_23];
+  let x_29 : u32 = x_8.field0[x_23];
+  x_9.field0[x_23] = bitcast<u32>(clamp(bitcast<i32>(x_25), bitcast<i32>(x_27), bitcast<i32>(x_29)));
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main([[builtin(global_invocation_id)]] x_3_param : vec3<u32>) {
+  x_3 = x_3_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sclamp/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sclamp/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..55f55f5
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sclamp/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,26 @@
+static uint3 x_3 = uint3(0u, 0u, 0u);
+RWByteAddressBuffer x_6 : register(u0, space0);
+RWByteAddressBuffer x_7 : register(u1, space0);
+RWByteAddressBuffer x_8 : register(u2, space0);
+RWByteAddressBuffer x_9 : register(u3, space0);
+
+void main_1() {
+  const uint x_23 = x_3.x;
+  const uint x_25 = x_6.Load((4u * x_23));
+  const uint x_27 = x_7.Load((4u * x_23));
+  const uint x_29 = x_8.Load((4u * x_23));
+  x_9.Store((4u * x_23), asuint(asuint(clamp(asint(x_25), asint(x_27), asint(x_29)))));
+  return;
+}
+
+struct tint_symbol_1 {
+  uint3 x_3_param : SV_DispatchThreadID;
+};
+
+[numthreads(1, 1, 1)]
+void main(tint_symbol_1 tint_symbol) {
+  const uint3 x_3_param = tint_symbol.x_3_param;
+  x_3 = x_3_param;
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sclamp/0-opt.wgsl.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sclamp/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..f8e42e1
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sclamp/0-opt.wgsl.expected.msl
@@ -0,0 +1,23 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  /* 0x0000 */ uint field0[1];
+};
+
+void main_1(device S& x_6, device S& x_7, device S& x_8, device S& x_9, thread uint3* const tint_symbol_2) {
+  uint const x_23 = (*(tint_symbol_2)).x;
+  uint const x_25 = x_6.field0[x_23];
+  uint const x_27 = x_7.field0[x_23];
+  uint const x_29 = x_8.field0[x_23];
+  x_9.field0[x_23] = as_type<uint>(clamp(as_type<int>(x_25), as_type<int>(x_27), as_type<int>(x_29)));
+  return;
+}
+
+kernel void tint_symbol(uint3 x_3_param [[thread_position_in_grid]], device S& x_6 [[buffer(0)]], device S& x_7 [[buffer(1)]], device S& x_8 [[buffer(2)]], device S& x_9 [[buffer(3)]]) {
+  thread uint3 tint_symbol_3 = 0u;
+  tint_symbol_3 = x_3_param;
+  main_1(x_6, x_7, x_8, x_9, &(tint_symbol_3));
+  return;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sclamp/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sclamp/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..35000ef
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sclamp/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,78 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 42
+; Schema: 0
+               OpCapability Shader
+         %34 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main" %tint_symbol
+               OpExecutionMode %main LocalSize 1 1 1
+               OpName %x_3 "x_3"
+               OpName %S "S"
+               OpMemberName %S 0 "field0"
+               OpName %x_6 "x_6"
+               OpName %x_7 "x_7"
+               OpName %x_8 "x_8"
+               OpName %x_9 "x_9"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main_1 "main_1"
+               OpName %main "main"
+               OpDecorate %S Block
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %_runtimearr_uint ArrayStride 4
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 2
+               OpDecorate %x_9 DescriptorSet 0
+               OpDecorate %x_9 Binding 3
+               OpDecorate %tint_symbol BuiltIn GlobalInvocationId
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Private_v3uint = OpTypePointer Private %v3uint
+          %5 = OpConstantNull %v3uint
+        %x_3 = OpVariable %_ptr_Private_v3uint Private %5
+%_runtimearr_uint = OpTypeRuntimeArray %uint
+          %S = OpTypeStruct %_runtimearr_uint
+%_ptr_StorageBuffer_S = OpTypePointer StorageBuffer %S
+        %x_6 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_7 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_8 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_9 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%tint_symbol = OpVariable %_ptr_Input_v3uint Input
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_uint = OpTypePointer Private %uint
+%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
+        %int = OpTypeInt 32 1
+     %main_1 = OpFunction %void None %15
+         %18 = OpLabel
+         %21 = OpAccessChain %_ptr_Private_uint %x_3 %uint_0
+         %22 = OpLoad %uint %21
+         %24 = OpAccessChain %_ptr_StorageBuffer_uint %x_6 %uint_0 %22
+         %25 = OpLoad %uint %24
+         %26 = OpAccessChain %_ptr_StorageBuffer_uint %x_7 %uint_0 %22
+         %27 = OpLoad %uint %26
+         %28 = OpAccessChain %_ptr_StorageBuffer_uint %x_8 %uint_0 %22
+         %29 = OpLoad %uint %28
+         %30 = OpAccessChain %_ptr_StorageBuffer_uint %x_9 %uint_0 %22
+         %35 = OpBitcast %int %25
+         %36 = OpBitcast %int %27
+         %37 = OpBitcast %int %29
+         %32 = OpExtInst %int %34 SClamp %35 %36 %37
+         %31 = OpBitcast %uint %32
+               OpStore %30 %31
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %15
+         %39 = OpLabel
+         %40 = OpLoad %v3uint %tint_symbol
+               OpStore %x_3 %40
+         %41 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sclamp/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sclamp/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..e582903
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_sclamp/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,31 @@
+type RTArr = [[stride(4)]] array<u32>;
+
+[[block]]
+struct S {
+  field0 : RTArr;
+};
+
+var<private> x_3 : vec3<u32>;
+
+[[group(0), binding(0)]] var<storage, read_write> x_6 : S;
+
+[[group(0), binding(1)]] var<storage, read_write> x_7 : S;
+
+[[group(0), binding(2)]] var<storage, read_write> x_8 : S;
+
+[[group(0), binding(3)]] var<storage, read_write> x_9 : S;
+
+fn main_1() {
+  let x_23 : u32 = x_3.x;
+  let x_25 : u32 = x_6.field0[x_23];
+  let x_27 : u32 = x_7.field0[x_23];
+  let x_29 : u32 = x_8.field0[x_23];
+  x_9.field0[x_23] = bitcast<u32>(clamp(bitcast<i32>(x_25), bitcast<i32>(x_27), bitcast<i32>(x_29)));
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main([[builtin(global_invocation_id)]] x_3_param : vec3<u32>) {
+  x_3 = x_3_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smax/0-opt.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smax/0-opt.spvasm
new file mode 100644
index 0000000..e472f01
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smax/0-opt.spvasm
@@ -0,0 +1,44 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %2 "main" %gl_GlobalInvocationID
+               OpExecutionMode %2 LocalSize 1 1 1
+               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
+               OpDecorate %_runtimearr_uint ArrayStride 4
+               OpDecorate %_struct_5 BufferBlock
+               OpMemberDecorate %_struct_5 0 Offset 0
+               OpDecorate %6 DescriptorSet 0
+               OpDecorate %6 Binding 0
+               OpDecorate %7 DescriptorSet 0
+               OpDecorate %7 Binding 1
+               OpDecorate %8 DescriptorSet 0
+               OpDecorate %8 Binding 2
+       %uint = OpTypeInt 32 0
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+%_ptr_Input_uint = OpTypePointer Input %uint
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_runtimearr_uint = OpTypeRuntimeArray %uint
+  %_struct_5 = OpTypeStruct %_runtimearr_uint
+%_ptr_Uniform__struct_5 = OpTypePointer Uniform %_struct_5
+%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
+          %6 = OpVariable %_ptr_Uniform__struct_5 Uniform
+          %7 = OpVariable %_ptr_Uniform__struct_5 Uniform
+          %8 = OpVariable %_ptr_Uniform__struct_5 Uniform
+          %2 = OpFunction %void None %15
+         %19 = OpLabel
+         %20 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_0
+         %21 = OpLoad %uint %20
+         %22 = OpAccessChain %_ptr_Uniform_uint %6 %uint_0 %21
+         %23 = OpLoad %uint %22
+         %24 = OpAccessChain %_ptr_Uniform_uint %7 %uint_0 %21
+         %25 = OpLoad %uint %24
+         %26 = OpExtInst %uint %1 SMax %23 %25
+         %27 = OpAccessChain %_ptr_Uniform_uint %8 %uint_0 %21
+               OpStore %27 %26
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smax/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smax/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..31dbd68
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smax/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,24 @@
+static uint3 x_3 = uint3(0u, 0u, 0u);
+RWByteAddressBuffer x_6 : register(u0, space0);
+RWByteAddressBuffer x_7 : register(u1, space0);
+RWByteAddressBuffer x_8 : register(u2, space0);
+
+void main_1() {
+  const uint x_21 = x_3.x;
+  const uint x_23 = x_6.Load((4u * x_21));
+  const uint x_25 = x_7.Load((4u * x_21));
+  x_8.Store((4u * x_21), asuint(asuint(max(asint(x_23), asint(x_25)))));
+  return;
+}
+
+struct tint_symbol_1 {
+  uint3 x_3_param : SV_DispatchThreadID;
+};
+
+[numthreads(1, 1, 1)]
+void main(tint_symbol_1 tint_symbol) {
+  const uint3 x_3_param = tint_symbol.x_3_param;
+  x_3 = x_3_param;
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smax/0-opt.spvasm.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smax/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..d2e3922
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smax/0-opt.spvasm.expected.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  /* 0x0000 */ uint field0[1];
+};
+
+void main_1(device S& x_6, device S& x_7, device S& x_8, thread uint3* const tint_symbol_2) {
+  uint const x_21 = (*(tint_symbol_2)).x;
+  uint const x_23 = x_6.field0[x_21];
+  uint const x_25 = x_7.field0[x_21];
+  x_8.field0[x_21] = as_type<uint>(max(as_type<int>(x_23), as_type<int>(x_25)));
+  return;
+}
+
+kernel void tint_symbol(uint3 x_3_param [[thread_position_in_grid]], device S& x_6 [[buffer(0)]], device S& x_7 [[buffer(1)]], device S& x_8 [[buffer(2)]]) {
+  thread uint3 tint_symbol_3 = 0u;
+  tint_symbol_3 = x_3_param;
+  main_1(x_6, x_7, x_8, &(tint_symbol_3));
+  return;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smax/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smax/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..9f6c616
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smax/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,71 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 38
+; Schema: 0
+               OpCapability Shader
+         %31 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main" %tint_symbol
+               OpExecutionMode %main LocalSize 1 1 1
+               OpName %x_3 "x_3"
+               OpName %S "S"
+               OpMemberName %S 0 "field0"
+               OpName %x_6 "x_6"
+               OpName %x_7 "x_7"
+               OpName %x_8 "x_8"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main_1 "main_1"
+               OpName %main "main"
+               OpDecorate %S Block
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %_runtimearr_uint ArrayStride 4
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 2
+               OpDecorate %tint_symbol BuiltIn GlobalInvocationId
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Private_v3uint = OpTypePointer Private %v3uint
+          %5 = OpConstantNull %v3uint
+        %x_3 = OpVariable %_ptr_Private_v3uint Private %5
+%_runtimearr_uint = OpTypeRuntimeArray %uint
+          %S = OpTypeStruct %_runtimearr_uint
+%_ptr_StorageBuffer_S = OpTypePointer StorageBuffer %S
+        %x_6 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_7 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_8 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%tint_symbol = OpVariable %_ptr_Input_v3uint Input
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_uint = OpTypePointer Private %uint
+%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
+        %int = OpTypeInt 32 1
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+         %20 = OpAccessChain %_ptr_Private_uint %x_3 %uint_0
+         %21 = OpLoad %uint %20
+         %23 = OpAccessChain %_ptr_StorageBuffer_uint %x_6 %uint_0 %21
+         %24 = OpLoad %uint %23
+         %25 = OpAccessChain %_ptr_StorageBuffer_uint %x_7 %uint_0 %21
+         %26 = OpLoad %uint %25
+         %27 = OpAccessChain %_ptr_StorageBuffer_uint %x_8 %uint_0 %21
+         %32 = OpBitcast %int %24
+         %33 = OpBitcast %int %26
+         %29 = OpExtInst %int %31 SMax %32 %33
+         %28 = OpBitcast %uint %29
+               OpStore %27 %28
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %35 = OpLabel
+         %36 = OpLoad %v3uint %tint_symbol
+               OpStore %x_3 %36
+         %37 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smax/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smax/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..883eb2a
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smax/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,28 @@
+type RTArr = [[stride(4)]] array<u32>;
+
+[[block]]
+struct S {
+  field0 : RTArr;
+};
+
+var<private> x_3 : vec3<u32>;
+
+[[group(0), binding(0)]] var<storage, read_write> x_6 : S;
+
+[[group(0), binding(1)]] var<storage, read_write> x_7 : S;
+
+[[group(0), binding(2)]] var<storage, read_write> x_8 : S;
+
+fn main_1() {
+  let x_21 : u32 = x_3.x;
+  let x_23 : u32 = x_6.field0[x_21];
+  let x_25 : u32 = x_7.field0[x_21];
+  x_8.field0[x_21] = bitcast<u32>(max(bitcast<i32>(x_23), bitcast<i32>(x_25)));
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main([[builtin(global_invocation_id)]] x_3_param : vec3<u32>) {
+  x_3 = x_3_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smax/0-opt.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smax/0-opt.wgsl
new file mode 100644
index 0000000..883eb2a
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smax/0-opt.wgsl
@@ -0,0 +1,28 @@
+type RTArr = [[stride(4)]] array<u32>;
+
+[[block]]
+struct S {
+  field0 : RTArr;
+};
+
+var<private> x_3 : vec3<u32>;
+
+[[group(0), binding(0)]] var<storage, read_write> x_6 : S;
+
+[[group(0), binding(1)]] var<storage, read_write> x_7 : S;
+
+[[group(0), binding(2)]] var<storage, read_write> x_8 : S;
+
+fn main_1() {
+  let x_21 : u32 = x_3.x;
+  let x_23 : u32 = x_6.field0[x_21];
+  let x_25 : u32 = x_7.field0[x_21];
+  x_8.field0[x_21] = bitcast<u32>(max(bitcast<i32>(x_23), bitcast<i32>(x_25)));
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main([[builtin(global_invocation_id)]] x_3_param : vec3<u32>) {
+  x_3 = x_3_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smax/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smax/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..31dbd68
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smax/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,24 @@
+static uint3 x_3 = uint3(0u, 0u, 0u);
+RWByteAddressBuffer x_6 : register(u0, space0);
+RWByteAddressBuffer x_7 : register(u1, space0);
+RWByteAddressBuffer x_8 : register(u2, space0);
+
+void main_1() {
+  const uint x_21 = x_3.x;
+  const uint x_23 = x_6.Load((4u * x_21));
+  const uint x_25 = x_7.Load((4u * x_21));
+  x_8.Store((4u * x_21), asuint(asuint(max(asint(x_23), asint(x_25)))));
+  return;
+}
+
+struct tint_symbol_1 {
+  uint3 x_3_param : SV_DispatchThreadID;
+};
+
+[numthreads(1, 1, 1)]
+void main(tint_symbol_1 tint_symbol) {
+  const uint3 x_3_param = tint_symbol.x_3_param;
+  x_3 = x_3_param;
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smax/0-opt.wgsl.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smax/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..d2e3922
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smax/0-opt.wgsl.expected.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  /* 0x0000 */ uint field0[1];
+};
+
+void main_1(device S& x_6, device S& x_7, device S& x_8, thread uint3* const tint_symbol_2) {
+  uint const x_21 = (*(tint_symbol_2)).x;
+  uint const x_23 = x_6.field0[x_21];
+  uint const x_25 = x_7.field0[x_21];
+  x_8.field0[x_21] = as_type<uint>(max(as_type<int>(x_23), as_type<int>(x_25)));
+  return;
+}
+
+kernel void tint_symbol(uint3 x_3_param [[thread_position_in_grid]], device S& x_6 [[buffer(0)]], device S& x_7 [[buffer(1)]], device S& x_8 [[buffer(2)]]) {
+  thread uint3 tint_symbol_3 = 0u;
+  tint_symbol_3 = x_3_param;
+  main_1(x_6, x_7, x_8, &(tint_symbol_3));
+  return;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smax/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smax/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..9f6c616
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smax/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,71 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 38
+; Schema: 0
+               OpCapability Shader
+         %31 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main" %tint_symbol
+               OpExecutionMode %main LocalSize 1 1 1
+               OpName %x_3 "x_3"
+               OpName %S "S"
+               OpMemberName %S 0 "field0"
+               OpName %x_6 "x_6"
+               OpName %x_7 "x_7"
+               OpName %x_8 "x_8"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main_1 "main_1"
+               OpName %main "main"
+               OpDecorate %S Block
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %_runtimearr_uint ArrayStride 4
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 2
+               OpDecorate %tint_symbol BuiltIn GlobalInvocationId
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Private_v3uint = OpTypePointer Private %v3uint
+          %5 = OpConstantNull %v3uint
+        %x_3 = OpVariable %_ptr_Private_v3uint Private %5
+%_runtimearr_uint = OpTypeRuntimeArray %uint
+          %S = OpTypeStruct %_runtimearr_uint
+%_ptr_StorageBuffer_S = OpTypePointer StorageBuffer %S
+        %x_6 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_7 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_8 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%tint_symbol = OpVariable %_ptr_Input_v3uint Input
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_uint = OpTypePointer Private %uint
+%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
+        %int = OpTypeInt 32 1
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+         %20 = OpAccessChain %_ptr_Private_uint %x_3 %uint_0
+         %21 = OpLoad %uint %20
+         %23 = OpAccessChain %_ptr_StorageBuffer_uint %x_6 %uint_0 %21
+         %24 = OpLoad %uint %23
+         %25 = OpAccessChain %_ptr_StorageBuffer_uint %x_7 %uint_0 %21
+         %26 = OpLoad %uint %25
+         %27 = OpAccessChain %_ptr_StorageBuffer_uint %x_8 %uint_0 %21
+         %32 = OpBitcast %int %24
+         %33 = OpBitcast %int %26
+         %29 = OpExtInst %int %31 SMax %32 %33
+         %28 = OpBitcast %uint %29
+               OpStore %27 %28
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %35 = OpLabel
+         %36 = OpLoad %v3uint %tint_symbol
+               OpStore %x_3 %36
+         %37 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smax/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smax/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..883eb2a
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smax/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,28 @@
+type RTArr = [[stride(4)]] array<u32>;
+
+[[block]]
+struct S {
+  field0 : RTArr;
+};
+
+var<private> x_3 : vec3<u32>;
+
+[[group(0), binding(0)]] var<storage, read_write> x_6 : S;
+
+[[group(0), binding(1)]] var<storage, read_write> x_7 : S;
+
+[[group(0), binding(2)]] var<storage, read_write> x_8 : S;
+
+fn main_1() {
+  let x_21 : u32 = x_3.x;
+  let x_23 : u32 = x_6.field0[x_21];
+  let x_25 : u32 = x_7.field0[x_21];
+  x_8.field0[x_21] = bitcast<u32>(max(bitcast<i32>(x_23), bitcast<i32>(x_25)));
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main([[builtin(global_invocation_id)]] x_3_param : vec3<u32>) {
+  x_3 = x_3_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smin/0-opt.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smin/0-opt.spvasm
new file mode 100644
index 0000000..da2186c
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smin/0-opt.spvasm
@@ -0,0 +1,44 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %2 "main" %gl_GlobalInvocationID
+               OpExecutionMode %2 LocalSize 1 1 1
+               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
+               OpDecorate %_runtimearr_uint ArrayStride 4
+               OpDecorate %_struct_5 BufferBlock
+               OpMemberDecorate %_struct_5 0 Offset 0
+               OpDecorate %6 DescriptorSet 0
+               OpDecorate %6 Binding 0
+               OpDecorate %7 DescriptorSet 0
+               OpDecorate %7 Binding 1
+               OpDecorate %8 DescriptorSet 0
+               OpDecorate %8 Binding 2
+       %uint = OpTypeInt 32 0
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+%_ptr_Input_uint = OpTypePointer Input %uint
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+       %void = OpTypeVoid
+         %15 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_runtimearr_uint = OpTypeRuntimeArray %uint
+  %_struct_5 = OpTypeStruct %_runtimearr_uint
+%_ptr_Uniform__struct_5 = OpTypePointer Uniform %_struct_5
+%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
+          %6 = OpVariable %_ptr_Uniform__struct_5 Uniform
+          %7 = OpVariable %_ptr_Uniform__struct_5 Uniform
+          %8 = OpVariable %_ptr_Uniform__struct_5 Uniform
+          %2 = OpFunction %void None %15
+         %19 = OpLabel
+         %20 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_0
+         %21 = OpLoad %uint %20
+         %22 = OpAccessChain %_ptr_Uniform_uint %6 %uint_0 %21
+         %23 = OpLoad %uint %22
+         %24 = OpAccessChain %_ptr_Uniform_uint %7 %uint_0 %21
+         %25 = OpLoad %uint %24
+         %26 = OpExtInst %uint %1 SMin %23 %25
+         %27 = OpAccessChain %_ptr_Uniform_uint %8 %uint_0 %21
+               OpStore %27 %26
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smin/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smin/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..12b249c
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smin/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,24 @@
+static uint3 x_3 = uint3(0u, 0u, 0u);
+RWByteAddressBuffer x_6 : register(u0, space0);
+RWByteAddressBuffer x_7 : register(u1, space0);
+RWByteAddressBuffer x_8 : register(u2, space0);
+
+void main_1() {
+  const uint x_21 = x_3.x;
+  const uint x_23 = x_6.Load((4u * x_21));
+  const uint x_25 = x_7.Load((4u * x_21));
+  x_8.Store((4u * x_21), asuint(asuint(min(asint(x_23), asint(x_25)))));
+  return;
+}
+
+struct tint_symbol_1 {
+  uint3 x_3_param : SV_DispatchThreadID;
+};
+
+[numthreads(1, 1, 1)]
+void main(tint_symbol_1 tint_symbol) {
+  const uint3 x_3_param = tint_symbol.x_3_param;
+  x_3 = x_3_param;
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smin/0-opt.spvasm.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smin/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..aa0d280
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smin/0-opt.spvasm.expected.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  /* 0x0000 */ uint field0[1];
+};
+
+void main_1(device S& x_6, device S& x_7, device S& x_8, thread uint3* const tint_symbol_2) {
+  uint const x_21 = (*(tint_symbol_2)).x;
+  uint const x_23 = x_6.field0[x_21];
+  uint const x_25 = x_7.field0[x_21];
+  x_8.field0[x_21] = as_type<uint>(min(as_type<int>(x_23), as_type<int>(x_25)));
+  return;
+}
+
+kernel void tint_symbol(uint3 x_3_param [[thread_position_in_grid]], device S& x_6 [[buffer(0)]], device S& x_7 [[buffer(1)]], device S& x_8 [[buffer(2)]]) {
+  thread uint3 tint_symbol_3 = 0u;
+  tint_symbol_3 = x_3_param;
+  main_1(x_6, x_7, x_8, &(tint_symbol_3));
+  return;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smin/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smin/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..46045f1
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smin/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,71 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 38
+; Schema: 0
+               OpCapability Shader
+         %31 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main" %tint_symbol
+               OpExecutionMode %main LocalSize 1 1 1
+               OpName %x_3 "x_3"
+               OpName %S "S"
+               OpMemberName %S 0 "field0"
+               OpName %x_6 "x_6"
+               OpName %x_7 "x_7"
+               OpName %x_8 "x_8"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main_1 "main_1"
+               OpName %main "main"
+               OpDecorate %S Block
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %_runtimearr_uint ArrayStride 4
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 2
+               OpDecorate %tint_symbol BuiltIn GlobalInvocationId
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Private_v3uint = OpTypePointer Private %v3uint
+          %5 = OpConstantNull %v3uint
+        %x_3 = OpVariable %_ptr_Private_v3uint Private %5
+%_runtimearr_uint = OpTypeRuntimeArray %uint
+          %S = OpTypeStruct %_runtimearr_uint
+%_ptr_StorageBuffer_S = OpTypePointer StorageBuffer %S
+        %x_6 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_7 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_8 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%tint_symbol = OpVariable %_ptr_Input_v3uint Input
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_uint = OpTypePointer Private %uint
+%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
+        %int = OpTypeInt 32 1
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+         %20 = OpAccessChain %_ptr_Private_uint %x_3 %uint_0
+         %21 = OpLoad %uint %20
+         %23 = OpAccessChain %_ptr_StorageBuffer_uint %x_6 %uint_0 %21
+         %24 = OpLoad %uint %23
+         %25 = OpAccessChain %_ptr_StorageBuffer_uint %x_7 %uint_0 %21
+         %26 = OpLoad %uint %25
+         %27 = OpAccessChain %_ptr_StorageBuffer_uint %x_8 %uint_0 %21
+         %32 = OpBitcast %int %24
+         %33 = OpBitcast %int %26
+         %29 = OpExtInst %int %31 SMin %32 %33
+         %28 = OpBitcast %uint %29
+               OpStore %27 %28
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %35 = OpLabel
+         %36 = OpLoad %v3uint %tint_symbol
+               OpStore %x_3 %36
+         %37 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smin/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smin/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..93b1988
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smin/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,28 @@
+type RTArr = [[stride(4)]] array<u32>;
+
+[[block]]
+struct S {
+  field0 : RTArr;
+};
+
+var<private> x_3 : vec3<u32>;
+
+[[group(0), binding(0)]] var<storage, read_write> x_6 : S;
+
+[[group(0), binding(1)]] var<storage, read_write> x_7 : S;
+
+[[group(0), binding(2)]] var<storage, read_write> x_8 : S;
+
+fn main_1() {
+  let x_21 : u32 = x_3.x;
+  let x_23 : u32 = x_6.field0[x_21];
+  let x_25 : u32 = x_7.field0[x_21];
+  x_8.field0[x_21] = bitcast<u32>(min(bitcast<i32>(x_23), bitcast<i32>(x_25)));
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main([[builtin(global_invocation_id)]] x_3_param : vec3<u32>) {
+  x_3 = x_3_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smin/0-opt.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smin/0-opt.wgsl
new file mode 100644
index 0000000..93b1988
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smin/0-opt.wgsl
@@ -0,0 +1,28 @@
+type RTArr = [[stride(4)]] array<u32>;
+
+[[block]]
+struct S {
+  field0 : RTArr;
+};
+
+var<private> x_3 : vec3<u32>;
+
+[[group(0), binding(0)]] var<storage, read_write> x_6 : S;
+
+[[group(0), binding(1)]] var<storage, read_write> x_7 : S;
+
+[[group(0), binding(2)]] var<storage, read_write> x_8 : S;
+
+fn main_1() {
+  let x_21 : u32 = x_3.x;
+  let x_23 : u32 = x_6.field0[x_21];
+  let x_25 : u32 = x_7.field0[x_21];
+  x_8.field0[x_21] = bitcast<u32>(min(bitcast<i32>(x_23), bitcast<i32>(x_25)));
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main([[builtin(global_invocation_id)]] x_3_param : vec3<u32>) {
+  x_3 = x_3_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smin/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smin/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..12b249c
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smin/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,24 @@
+static uint3 x_3 = uint3(0u, 0u, 0u);
+RWByteAddressBuffer x_6 : register(u0, space0);
+RWByteAddressBuffer x_7 : register(u1, space0);
+RWByteAddressBuffer x_8 : register(u2, space0);
+
+void main_1() {
+  const uint x_21 = x_3.x;
+  const uint x_23 = x_6.Load((4u * x_21));
+  const uint x_25 = x_7.Load((4u * x_21));
+  x_8.Store((4u * x_21), asuint(asuint(min(asint(x_23), asint(x_25)))));
+  return;
+}
+
+struct tint_symbol_1 {
+  uint3 x_3_param : SV_DispatchThreadID;
+};
+
+[numthreads(1, 1, 1)]
+void main(tint_symbol_1 tint_symbol) {
+  const uint3 x_3_param = tint_symbol.x_3_param;
+  x_3 = x_3_param;
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smin/0-opt.wgsl.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smin/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..aa0d280
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smin/0-opt.wgsl.expected.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  /* 0x0000 */ uint field0[1];
+};
+
+void main_1(device S& x_6, device S& x_7, device S& x_8, thread uint3* const tint_symbol_2) {
+  uint const x_21 = (*(tint_symbol_2)).x;
+  uint const x_23 = x_6.field0[x_21];
+  uint const x_25 = x_7.field0[x_21];
+  x_8.field0[x_21] = as_type<uint>(min(as_type<int>(x_23), as_type<int>(x_25)));
+  return;
+}
+
+kernel void tint_symbol(uint3 x_3_param [[thread_position_in_grid]], device S& x_6 [[buffer(0)]], device S& x_7 [[buffer(1)]], device S& x_8 [[buffer(2)]]) {
+  thread uint3 tint_symbol_3 = 0u;
+  tint_symbol_3 = x_3_param;
+  main_1(x_6, x_7, x_8, &(tint_symbol_3));
+  return;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smin/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smin/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..46045f1
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smin/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,71 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 38
+; Schema: 0
+               OpCapability Shader
+         %31 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main" %tint_symbol
+               OpExecutionMode %main LocalSize 1 1 1
+               OpName %x_3 "x_3"
+               OpName %S "S"
+               OpMemberName %S 0 "field0"
+               OpName %x_6 "x_6"
+               OpName %x_7 "x_7"
+               OpName %x_8 "x_8"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main_1 "main_1"
+               OpName %main "main"
+               OpDecorate %S Block
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %_runtimearr_uint ArrayStride 4
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 0
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 1
+               OpDecorate %x_8 DescriptorSet 0
+               OpDecorate %x_8 Binding 2
+               OpDecorate %tint_symbol BuiltIn GlobalInvocationId
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Private_v3uint = OpTypePointer Private %v3uint
+          %5 = OpConstantNull %v3uint
+        %x_3 = OpVariable %_ptr_Private_v3uint Private %5
+%_runtimearr_uint = OpTypeRuntimeArray %uint
+          %S = OpTypeStruct %_runtimearr_uint
+%_ptr_StorageBuffer_S = OpTypePointer StorageBuffer %S
+        %x_6 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_7 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_8 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%tint_symbol = OpVariable %_ptr_Input_v3uint Input
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_uint = OpTypePointer Private %uint
+%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
+        %int = OpTypeInt 32 1
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+         %20 = OpAccessChain %_ptr_Private_uint %x_3 %uint_0
+         %21 = OpLoad %uint %20
+         %23 = OpAccessChain %_ptr_StorageBuffer_uint %x_6 %uint_0 %21
+         %24 = OpLoad %uint %23
+         %25 = OpAccessChain %_ptr_StorageBuffer_uint %x_7 %uint_0 %21
+         %26 = OpLoad %uint %25
+         %27 = OpAccessChain %_ptr_StorageBuffer_uint %x_8 %uint_0 %21
+         %32 = OpBitcast %int %24
+         %33 = OpBitcast %int %26
+         %29 = OpExtInst %int %31 SMin %32 %33
+         %28 = OpBitcast %uint %29
+               OpStore %27 %28
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %35 = OpLabel
+         %36 = OpLoad %v3uint %tint_symbol
+               OpStore %x_3 %36
+         %37 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smin/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smin/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..93b1988
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/glsl_uint_smin/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,28 @@
+type RTArr = [[stride(4)]] array<u32>;
+
+[[block]]
+struct S {
+  field0 : RTArr;
+};
+
+var<private> x_3 : vec3<u32>;
+
+[[group(0), binding(0)]] var<storage, read_write> x_6 : S;
+
+[[group(0), binding(1)]] var<storage, read_write> x_7 : S;
+
+[[group(0), binding(2)]] var<storage, read_write> x_8 : S;
+
+fn main_1() {
+  let x_21 : u32 = x_3.x;
+  let x_23 : u32 = x_6.field0[x_21];
+  let x_25 : u32 = x_7.field0[x_21];
+  x_8.field0[x_21] = bitcast<u32>(min(bitcast<i32>(x_23), bitcast<i32>(x_25)));
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main([[builtin(global_invocation_id)]] x_3_param : vec3<u32>) {
+  x_3 = x_3_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_sdiv/0-opt.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_sdiv/0-opt.spvasm
new file mode 100644
index 0000000..3ebec95
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_sdiv/0-opt.spvasm
@@ -0,0 +1,43 @@
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %1 "main" %gl_GlobalInvocationID
+               OpExecutionMode %1 LocalSize 1 1 1
+               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
+               OpDecorate %_runtimearr_uint ArrayStride 4
+               OpDecorate %_struct_4 BufferBlock
+               OpMemberDecorate %_struct_4 0 Offset 0
+               OpDecorate %5 DescriptorSet 0
+               OpDecorate %5 Binding 0
+               OpDecorate %6 DescriptorSet 0
+               OpDecorate %6 Binding 1
+               OpDecorate %7 DescriptorSet 0
+               OpDecorate %7 Binding 2
+       %uint = OpTypeInt 32 0
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+%_ptr_Input_uint = OpTypePointer Input %uint
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_runtimearr_uint = OpTypeRuntimeArray %uint
+  %_struct_4 = OpTypeStruct %_runtimearr_uint
+%_ptr_Uniform__struct_4 = OpTypePointer Uniform %_struct_4
+%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
+          %5 = OpVariable %_ptr_Uniform__struct_4 Uniform
+          %6 = OpVariable %_ptr_Uniform__struct_4 Uniform
+          %7 = OpVariable %_ptr_Uniform__struct_4 Uniform
+          %1 = OpFunction %void None %14
+         %18 = OpLabel
+         %19 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_0
+         %20 = OpLoad %uint %19
+         %21 = OpAccessChain %_ptr_Uniform_uint %5 %uint_0 %20
+         %22 = OpLoad %uint %21
+         %23 = OpAccessChain %_ptr_Uniform_uint %6 %uint_0 %20
+         %24 = OpLoad %uint %23
+         %25 = OpSDiv %uint %22 %24
+         %26 = OpAccessChain %_ptr_Uniform_uint %7 %uint_0 %20
+               OpStore %26 %25
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_sdiv/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_sdiv/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..0533d3d
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_sdiv/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,24 @@
+static uint3 x_2 = uint3(0u, 0u, 0u);
+RWByteAddressBuffer x_5 : register(u0, space0);
+RWByteAddressBuffer x_6 : register(u1, space0);
+RWByteAddressBuffer x_7 : register(u2, space0);
+
+void main_1() {
+  const uint x_20 = x_2.x;
+  const uint x_22 = x_5.Load((4u * x_20));
+  const uint x_24 = x_6.Load((4u * x_20));
+  x_7.Store((4u * x_20), asuint(asuint((asint(x_22) / asint(x_24)))));
+  return;
+}
+
+struct tint_symbol_1 {
+  uint3 x_2_param : SV_DispatchThreadID;
+};
+
+[numthreads(1, 1, 1)]
+void main(tint_symbol_1 tint_symbol) {
+  const uint3 x_2_param = tint_symbol.x_2_param;
+  x_2 = x_2_param;
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_sdiv/0-opt.spvasm.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_sdiv/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..df3eba3
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_sdiv/0-opt.spvasm.expected.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  /* 0x0000 */ uint field0[1];
+};
+
+void main_1(device S& x_5, device S& x_6, device S& x_7, thread uint3* const tint_symbol_2) {
+  uint const x_20 = (*(tint_symbol_2)).x;
+  uint const x_22 = x_5.field0[x_20];
+  uint const x_24 = x_6.field0[x_20];
+  x_7.field0[x_20] = as_type<uint>((as_type<int>(x_22) / as_type<int>(x_24)));
+  return;
+}
+
+kernel void tint_symbol(uint3 x_2_param [[thread_position_in_grid]], device S& x_5 [[buffer(0)]], device S& x_6 [[buffer(1)]], device S& x_7 [[buffer(2)]]) {
+  thread uint3 tint_symbol_3 = 0u;
+  tint_symbol_3 = x_2_param;
+  main_1(x_5, x_6, x_7, &(tint_symbol_3));
+  return;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_sdiv/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_sdiv/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..5b924e4
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_sdiv/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,70 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 37
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main" %tint_symbol
+               OpExecutionMode %main LocalSize 1 1 1
+               OpName %x_2 "x_2"
+               OpName %S "S"
+               OpMemberName %S 0 "field0"
+               OpName %x_5 "x_5"
+               OpName %x_6 "x_6"
+               OpName %x_7 "x_7"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main_1 "main_1"
+               OpName %main "main"
+               OpDecorate %S Block
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %_runtimearr_uint ArrayStride 4
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 2
+               OpDecorate %tint_symbol BuiltIn GlobalInvocationId
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Private_v3uint = OpTypePointer Private %v3uint
+          %5 = OpConstantNull %v3uint
+        %x_2 = OpVariable %_ptr_Private_v3uint Private %5
+%_runtimearr_uint = OpTypeRuntimeArray %uint
+          %S = OpTypeStruct %_runtimearr_uint
+%_ptr_StorageBuffer_S = OpTypePointer StorageBuffer %S
+        %x_5 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_6 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_7 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%tint_symbol = OpVariable %_ptr_Input_v3uint Input
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_uint = OpTypePointer Private %uint
+%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
+        %int = OpTypeInt 32 1
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+         %20 = OpAccessChain %_ptr_Private_uint %x_2 %uint_0
+         %21 = OpLoad %uint %20
+         %23 = OpAccessChain %_ptr_StorageBuffer_uint %x_5 %uint_0 %21
+         %24 = OpLoad %uint %23
+         %25 = OpAccessChain %_ptr_StorageBuffer_uint %x_6 %uint_0 %21
+         %26 = OpLoad %uint %25
+         %27 = OpAccessChain %_ptr_StorageBuffer_uint %x_7 %uint_0 %21
+         %29 = OpBitcast %int %24
+         %31 = OpBitcast %int %26
+         %32 = OpSDiv %int %29 %31
+         %28 = OpBitcast %uint %32
+               OpStore %27 %28
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %34 = OpLabel
+         %35 = OpLoad %v3uint %tint_symbol
+               OpStore %x_2 %35
+         %36 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_sdiv/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_sdiv/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..c6a7af6
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_sdiv/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,28 @@
+type RTArr = [[stride(4)]] array<u32>;
+
+[[block]]
+struct S {
+  field0 : RTArr;
+};
+
+var<private> x_2 : vec3<u32>;
+
+[[group(0), binding(0)]] var<storage, read_write> x_5 : S;
+
+[[group(0), binding(1)]] var<storage, read_write> x_6 : S;
+
+[[group(0), binding(2)]] var<storage, read_write> x_7 : S;
+
+fn main_1() {
+  let x_20 : u32 = x_2.x;
+  let x_22 : u32 = x_5.field0[x_20];
+  let x_24 : u32 = x_6.field0[x_20];
+  x_7.field0[x_20] = bitcast<u32>((bitcast<i32>(x_22) / bitcast<i32>(x_24)));
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main([[builtin(global_invocation_id)]] x_2_param : vec3<u32>) {
+  x_2 = x_2_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_sdiv/0-opt.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_sdiv/0-opt.wgsl
new file mode 100644
index 0000000..c6a7af6
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_sdiv/0-opt.wgsl
@@ -0,0 +1,28 @@
+type RTArr = [[stride(4)]] array<u32>;
+
+[[block]]
+struct S {
+  field0 : RTArr;
+};
+
+var<private> x_2 : vec3<u32>;
+
+[[group(0), binding(0)]] var<storage, read_write> x_5 : S;
+
+[[group(0), binding(1)]] var<storage, read_write> x_6 : S;
+
+[[group(0), binding(2)]] var<storage, read_write> x_7 : S;
+
+fn main_1() {
+  let x_20 : u32 = x_2.x;
+  let x_22 : u32 = x_5.field0[x_20];
+  let x_24 : u32 = x_6.field0[x_20];
+  x_7.field0[x_20] = bitcast<u32>((bitcast<i32>(x_22) / bitcast<i32>(x_24)));
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main([[builtin(global_invocation_id)]] x_2_param : vec3<u32>) {
+  x_2 = x_2_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_sdiv/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_sdiv/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..0533d3d
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_sdiv/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,24 @@
+static uint3 x_2 = uint3(0u, 0u, 0u);
+RWByteAddressBuffer x_5 : register(u0, space0);
+RWByteAddressBuffer x_6 : register(u1, space0);
+RWByteAddressBuffer x_7 : register(u2, space0);
+
+void main_1() {
+  const uint x_20 = x_2.x;
+  const uint x_22 = x_5.Load((4u * x_20));
+  const uint x_24 = x_6.Load((4u * x_20));
+  x_7.Store((4u * x_20), asuint(asuint((asint(x_22) / asint(x_24)))));
+  return;
+}
+
+struct tint_symbol_1 {
+  uint3 x_2_param : SV_DispatchThreadID;
+};
+
+[numthreads(1, 1, 1)]
+void main(tint_symbol_1 tint_symbol) {
+  const uint3 x_2_param = tint_symbol.x_2_param;
+  x_2 = x_2_param;
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_sdiv/0-opt.wgsl.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_sdiv/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..df3eba3
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_sdiv/0-opt.wgsl.expected.msl
@@ -0,0 +1,22 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  /* 0x0000 */ uint field0[1];
+};
+
+void main_1(device S& x_5, device S& x_6, device S& x_7, thread uint3* const tint_symbol_2) {
+  uint const x_20 = (*(tint_symbol_2)).x;
+  uint const x_22 = x_5.field0[x_20];
+  uint const x_24 = x_6.field0[x_20];
+  x_7.field0[x_20] = as_type<uint>((as_type<int>(x_22) / as_type<int>(x_24)));
+  return;
+}
+
+kernel void tint_symbol(uint3 x_2_param [[thread_position_in_grid]], device S& x_5 [[buffer(0)]], device S& x_6 [[buffer(1)]], device S& x_7 [[buffer(2)]]) {
+  thread uint3 tint_symbol_3 = 0u;
+  tint_symbol_3 = x_2_param;
+  main_1(x_5, x_6, x_7, &(tint_symbol_3));
+  return;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_sdiv/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_sdiv/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..5b924e4
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_sdiv/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,70 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 37
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main" %tint_symbol
+               OpExecutionMode %main LocalSize 1 1 1
+               OpName %x_2 "x_2"
+               OpName %S "S"
+               OpMemberName %S 0 "field0"
+               OpName %x_5 "x_5"
+               OpName %x_6 "x_6"
+               OpName %x_7 "x_7"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main_1 "main_1"
+               OpName %main "main"
+               OpDecorate %S Block
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %_runtimearr_uint ArrayStride 4
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %x_7 DescriptorSet 0
+               OpDecorate %x_7 Binding 2
+               OpDecorate %tint_symbol BuiltIn GlobalInvocationId
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Private_v3uint = OpTypePointer Private %v3uint
+          %5 = OpConstantNull %v3uint
+        %x_2 = OpVariable %_ptr_Private_v3uint Private %5
+%_runtimearr_uint = OpTypeRuntimeArray %uint
+          %S = OpTypeStruct %_runtimearr_uint
+%_ptr_StorageBuffer_S = OpTypePointer StorageBuffer %S
+        %x_5 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_6 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_7 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%tint_symbol = OpVariable %_ptr_Input_v3uint Input
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_uint = OpTypePointer Private %uint
+%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
+        %int = OpTypeInt 32 1
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+         %20 = OpAccessChain %_ptr_Private_uint %x_2 %uint_0
+         %21 = OpLoad %uint %20
+         %23 = OpAccessChain %_ptr_StorageBuffer_uint %x_5 %uint_0 %21
+         %24 = OpLoad %uint %23
+         %25 = OpAccessChain %_ptr_StorageBuffer_uint %x_6 %uint_0 %21
+         %26 = OpLoad %uint %25
+         %27 = OpAccessChain %_ptr_StorageBuffer_uint %x_7 %uint_0 %21
+         %29 = OpBitcast %int %24
+         %31 = OpBitcast %int %26
+         %32 = OpSDiv %int %29 %31
+         %28 = OpBitcast %uint %32
+               OpStore %27 %28
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %34 = OpLabel
+         %35 = OpLoad %v3uint %tint_symbol
+               OpStore %x_2 %35
+         %36 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_sdiv/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_sdiv/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..c6a7af6
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_sdiv/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,28 @@
+type RTArr = [[stride(4)]] array<u32>;
+
+[[block]]
+struct S {
+  field0 : RTArr;
+};
+
+var<private> x_2 : vec3<u32>;
+
+[[group(0), binding(0)]] var<storage, read_write> x_5 : S;
+
+[[group(0), binding(1)]] var<storage, read_write> x_6 : S;
+
+[[group(0), binding(2)]] var<storage, read_write> x_7 : S;
+
+fn main_1() {
+  let x_20 : u32 = x_2.x;
+  let x_22 : u32 = x_5.field0[x_20];
+  let x_24 : u32 = x_6.field0[x_20];
+  x_7.field0[x_20] = bitcast<u32>((bitcast<i32>(x_22) / bitcast<i32>(x_24)));
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main([[builtin(global_invocation_id)]] x_2_param : vec3<u32>) {
+  x_2 = x_2_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_snegate/0-opt.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_snegate/0-opt.spvasm
new file mode 100644
index 0000000..40a9c24
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_snegate/0-opt.spvasm
@@ -0,0 +1,39 @@
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %1 "main" %gl_GlobalInvocationID
+               OpExecutionMode %1 LocalSize 1 1 1
+               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
+               OpDecorate %_runtimearr_uint ArrayStride 4
+               OpDecorate %_struct_4 BufferBlock
+               OpMemberDecorate %_struct_4 0 Offset 0
+               OpDecorate %5 DescriptorSet 0
+               OpDecorate %5 Binding 0
+               OpDecorate %6 DescriptorSet 0
+               OpDecorate %6 Binding 1
+       %uint = OpTypeInt 32 0
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+%_ptr_Input_uint = OpTypePointer Input %uint
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+     %uint_1 = OpConstant %uint 1
+%_runtimearr_uint = OpTypeRuntimeArray %uint
+     %v2uint = OpTypeVector %uint 2
+  %_struct_4 = OpTypeStruct %_runtimearr_uint
+%_ptr_Uniform__struct_4 = OpTypePointer Uniform %_struct_4
+%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
+          %5 = OpVariable %_ptr_Uniform__struct_4 Uniform
+          %6 = OpVariable %_ptr_Uniform__struct_4 Uniform
+          %1 = OpFunction %void None %13
+         %18 = OpLabel
+         %19 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_0
+         %20 = OpLoad %uint %19
+         %21 = OpAccessChain %_ptr_Uniform_uint %5 %uint_0 %20
+         %22 = OpLoad %uint %21
+         %23 = OpSNegate %uint %22
+         %24 = OpAccessChain %_ptr_Uniform_uint %6 %uint_0 %20
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_snegate/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_snegate/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..35858e0
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_snegate/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,22 @@
+static uint3 x_2 = uint3(0u, 0u, 0u);
+RWByteAddressBuffer x_5 : register(u0, space0);
+RWByteAddressBuffer x_6 : register(u1, space0);
+
+void main_1() {
+  const uint x_20 = x_2.x;
+  const uint x_22 = x_5.Load((4u * x_20));
+  x_6.Store((4u * x_20), asuint(asuint(-(asint(x_22)))));
+  return;
+}
+
+struct tint_symbol_1 {
+  uint3 x_2_param : SV_DispatchThreadID;
+};
+
+[numthreads(1, 1, 1)]
+void main(tint_symbol_1 tint_symbol) {
+  const uint3 x_2_param = tint_symbol.x_2_param;
+  x_2 = x_2_param;
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_snegate/0-opt.spvasm.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_snegate/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..d7828a3
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_snegate/0-opt.spvasm.expected.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  /* 0x0000 */ uint field0[1];
+};
+
+void main_1(device S& x_5, device S& x_6, thread uint3* const tint_symbol_2) {
+  uint const x_20 = (*(tint_symbol_2)).x;
+  uint const x_22 = x_5.field0[x_20];
+  x_6.field0[x_20] = as_type<uint>(-(as_type<int>(x_22)));
+  return;
+}
+
+kernel void tint_symbol(uint3 x_2_param [[thread_position_in_grid]], device S& x_5 [[buffer(0)]], device S& x_6 [[buffer(1)]]) {
+  thread uint3 tint_symbol_3 = 0u;
+  tint_symbol_3 = x_2_param;
+  main_1(x_5, x_6, &(tint_symbol_3));
+  return;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_snegate/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_snegate/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..4ce732f
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_snegate/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,63 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 33
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main" %tint_symbol
+               OpExecutionMode %main LocalSize 1 1 1
+               OpName %x_2 "x_2"
+               OpName %S "S"
+               OpMemberName %S 0 "field0"
+               OpName %x_5 "x_5"
+               OpName %x_6 "x_6"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main_1 "main_1"
+               OpName %main "main"
+               OpDecorate %S Block
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %_runtimearr_uint ArrayStride 4
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %tint_symbol BuiltIn GlobalInvocationId
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Private_v3uint = OpTypePointer Private %v3uint
+          %5 = OpConstantNull %v3uint
+        %x_2 = OpVariable %_ptr_Private_v3uint Private %5
+%_runtimearr_uint = OpTypeRuntimeArray %uint
+          %S = OpTypeStruct %_runtimearr_uint
+%_ptr_StorageBuffer_S = OpTypePointer StorageBuffer %S
+        %x_5 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_6 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%tint_symbol = OpVariable %_ptr_Input_v3uint Input
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_uint = OpTypePointer Private %uint
+%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
+        %int = OpTypeInt 32 1
+     %main_1 = OpFunction %void None %13
+         %16 = OpLabel
+         %19 = OpAccessChain %_ptr_Private_uint %x_2 %uint_0
+         %20 = OpLoad %uint %19
+         %22 = OpAccessChain %_ptr_StorageBuffer_uint %x_5 %uint_0 %20
+         %23 = OpLoad %uint %22
+         %24 = OpAccessChain %_ptr_StorageBuffer_uint %x_6 %uint_0 %20
+         %27 = OpBitcast %int %23
+         %26 = OpSNegate %int %27
+         %25 = OpBitcast %uint %26
+               OpStore %24 %25
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %13
+         %30 = OpLabel
+         %31 = OpLoad %v3uint %tint_symbol
+               OpStore %x_2 %31
+         %32 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_snegate/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_snegate/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..1956524
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_snegate/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,25 @@
+type RTArr = [[stride(4)]] array<u32>;
+
+[[block]]
+struct S {
+  field0 : RTArr;
+};
+
+var<private> x_2 : vec3<u32>;
+
+[[group(0), binding(0)]] var<storage, read_write> x_5 : S;
+
+[[group(0), binding(1)]] var<storage, read_write> x_6 : S;
+
+fn main_1() {
+  let x_20 : u32 = x_2.x;
+  let x_22 : u32 = x_5.field0[x_20];
+  x_6.field0[x_20] = bitcast<u32>(-(bitcast<i32>(x_22)));
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main([[builtin(global_invocation_id)]] x_2_param : vec3<u32>) {
+  x_2 = x_2_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_snegate/0-opt.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_snegate/0-opt.wgsl
new file mode 100644
index 0000000..1956524
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_snegate/0-opt.wgsl
@@ -0,0 +1,25 @@
+type RTArr = [[stride(4)]] array<u32>;
+
+[[block]]
+struct S {
+  field0 : RTArr;
+};
+
+var<private> x_2 : vec3<u32>;
+
+[[group(0), binding(0)]] var<storage, read_write> x_5 : S;
+
+[[group(0), binding(1)]] var<storage, read_write> x_6 : S;
+
+fn main_1() {
+  let x_20 : u32 = x_2.x;
+  let x_22 : u32 = x_5.field0[x_20];
+  x_6.field0[x_20] = bitcast<u32>(-(bitcast<i32>(x_22)));
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main([[builtin(global_invocation_id)]] x_2_param : vec3<u32>) {
+  x_2 = x_2_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_snegate/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_snegate/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..35858e0
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_snegate/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,22 @@
+static uint3 x_2 = uint3(0u, 0u, 0u);
+RWByteAddressBuffer x_5 : register(u0, space0);
+RWByteAddressBuffer x_6 : register(u1, space0);
+
+void main_1() {
+  const uint x_20 = x_2.x;
+  const uint x_22 = x_5.Load((4u * x_20));
+  x_6.Store((4u * x_20), asuint(asuint(-(asint(x_22)))));
+  return;
+}
+
+struct tint_symbol_1 {
+  uint3 x_2_param : SV_DispatchThreadID;
+};
+
+[numthreads(1, 1, 1)]
+void main(tint_symbol_1 tint_symbol) {
+  const uint3 x_2_param = tint_symbol.x_2_param;
+  x_2 = x_2_param;
+  main_1();
+  return;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_snegate/0-opt.wgsl.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_snegate/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..d7828a3
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_snegate/0-opt.wgsl.expected.msl
@@ -0,0 +1,21 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  /* 0x0000 */ uint field0[1];
+};
+
+void main_1(device S& x_5, device S& x_6, thread uint3* const tint_symbol_2) {
+  uint const x_20 = (*(tint_symbol_2)).x;
+  uint const x_22 = x_5.field0[x_20];
+  x_6.field0[x_20] = as_type<uint>(-(as_type<int>(x_22)));
+  return;
+}
+
+kernel void tint_symbol(uint3 x_2_param [[thread_position_in_grid]], device S& x_5 [[buffer(0)]], device S& x_6 [[buffer(1)]]) {
+  thread uint3 tint_symbol_3 = 0u;
+  tint_symbol_3 = x_2_param;
+  main_1(x_5, x_6, &(tint_symbol_3));
+  return;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_snegate/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_snegate/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..4ce732f
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_snegate/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,63 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 33
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %main "main" %tint_symbol
+               OpExecutionMode %main LocalSize 1 1 1
+               OpName %x_2 "x_2"
+               OpName %S "S"
+               OpMemberName %S 0 "field0"
+               OpName %x_5 "x_5"
+               OpName %x_6 "x_6"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main_1 "main_1"
+               OpName %main "main"
+               OpDecorate %S Block
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %_runtimearr_uint ArrayStride 4
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %x_6 DescriptorSet 0
+               OpDecorate %x_6 Binding 1
+               OpDecorate %tint_symbol BuiltIn GlobalInvocationId
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%_ptr_Private_v3uint = OpTypePointer Private %v3uint
+          %5 = OpConstantNull %v3uint
+        %x_2 = OpVariable %_ptr_Private_v3uint Private %5
+%_runtimearr_uint = OpTypeRuntimeArray %uint
+          %S = OpTypeStruct %_runtimearr_uint
+%_ptr_StorageBuffer_S = OpTypePointer StorageBuffer %S
+        %x_5 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+        %x_6 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+%_ptr_Input_v3uint = OpTypePointer Input %v3uint
+%tint_symbol = OpVariable %_ptr_Input_v3uint Input
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_uint = OpTypePointer Private %uint
+%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
+        %int = OpTypeInt 32 1
+     %main_1 = OpFunction %void None %13
+         %16 = OpLabel
+         %19 = OpAccessChain %_ptr_Private_uint %x_2 %uint_0
+         %20 = OpLoad %uint %19
+         %22 = OpAccessChain %_ptr_StorageBuffer_uint %x_5 %uint_0 %20
+         %23 = OpLoad %uint %22
+         %24 = OpAccessChain %_ptr_StorageBuffer_uint %x_6 %uint_0 %20
+         %27 = OpBitcast %int %23
+         %26 = OpSNegate %int %27
+         %25 = OpBitcast %uint %26
+               OpStore %24 %25
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %13
+         %30 = OpLabel
+         %31 = OpLoad %v3uint %tint_symbol
+               OpStore %x_2 %31
+         %32 = OpFunctionCall %void %main_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_snegate/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_snegate/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..1956524
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/compute/signed_op/uint_snegate/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,25 @@
+type RTArr = [[stride(4)]] array<u32>;
+
+[[block]]
+struct S {
+  field0 : RTArr;
+};
+
+var<private> x_2 : vec3<u32>;
+
+[[group(0), binding(0)]] var<storage, read_write> x_5 : S;
+
+[[group(0), binding(1)]] var<storage, read_write> x_6 : S;
+
+fn main_1() {
+  let x_20 : u32 = x_2.x;
+  let x_22 : u32 = x_5.field0[x_20];
+  x_6.field0[x_20] = bitcast<u32>(-(bitcast<i32>(x_22)));
+  return;
+}
+
+[[stage(compute), workgroup_size(1, 1, 1)]]
+fn main([[builtin(global_invocation_id)]] x_2_param : vec3<u32>) {
+  x_2 = x_2_param;
+  main_1();
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/float32/comparison/frexpstruct_1_frag/0.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/float32/comparison/frexpstruct_1_frag/0.spvasm
new file mode 100644
index 0000000..a99e3ba
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/float32/comparison/frexpstruct_1_frag/0.spvasm
@@ -0,0 +1,61 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %2 "main" %3 %4 %5
+               OpDecorate %3 Location 0
+               OpDecorate %4 Flat
+               OpDecorate %4 Location 0
+               OpMemberDecorate %_struct_6 0 BuiltIn Position
+               OpMemberDecorate %_struct_6 1 BuiltIn PointSize
+               OpMemberDecorate %_struct_6 2 BuiltIn ClipDistance
+               OpDecorate %_struct_6 Block
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+          %3 = OpVariable %_ptr_Input_v2float Input
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+    %float_1 = OpConstant %float 1
+     %uint_1 = OpConstant %uint 1
+%_ptr_Output_uint = OpTypePointer Output %uint
+          %4 = OpVariable %_ptr_Output_uint Output
+    %uint_36 = OpConstant %uint 36
+    %v4float = OpTypeVector %float 4
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+  %_struct_6 = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output__struct_6 = OpTypePointer Output %_struct_6
+          %5 = OpVariable %_ptr_Output__struct_6 Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+    %float_0 = OpConstant %float 0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%float_1_02777779 = OpConstant %float 1.02777779
+   %float_18 = OpConstant %float 18
+          %2 = OpFunction %void None %8
+         %28 = OpLabel
+         %29 = OpAccessChain %_ptr_Input_float %3 %uint_0
+         %30 = OpLoad %float %29
+         %31 = OpFAdd %float %30 %float_1_02777779
+         %32 = OpFMul %float %31 %float_18
+         %33 = OpFSub %float %32 %float_1
+         %34 = OpConvertFToU %uint %33
+         %35 = OpAccessChain %_ptr_Input_float %3 %uint_1
+         %36 = OpLoad %float %35
+         %37 = OpFAdd %float %36 %float_1_02777779
+         %38 = OpFMul %float %37 %float_18
+         %39 = OpFSub %float %38 %float_1
+         %40 = OpConvertFToU %uint %39
+         %41 = OpIMul %uint %40 %uint_36
+         %42 = OpIAdd %uint %34 %41
+               OpStore %4 %42
+         %43 = OpLoad %v2float %3
+         %44 = OpCompositeExtract %float %43 0
+         %45 = OpCompositeExtract %float %43 1
+         %46 = OpCompositeConstruct %v4float %44 %45 %float_0 %float_1
+         %47 = OpAccessChain %_ptr_Output_v4float %5 %int_0
+               OpStore %47 %46
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/float32/comparison/frexpstruct_1_frag/0.spvasm.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/float32/comparison/frexpstruct_1_frag/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..1e05739
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/float32/comparison/frexpstruct_1_frag/0.spvasm.expected.hlsl
@@ -0,0 +1,33 @@
+static float2 x_3 = float2(0.0f, 0.0f);
+static uint x_4 = 0u;
+static float4 gl_Position = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const float x_30 = x_3.x;
+  const float x_36 = x_3.y;
+  x_4 = (uint((((x_30 + 1.027777791f) * 18.0f) - 1.0f)) + (uint((((x_36 + 1.027777791f) * 18.0f) - 1.0f)) * 36u));
+  const float2 x_43 = x_3;
+  gl_Position = float4(x_43.x, x_43.y, 0.0f, 1.0f);
+  return;
+}
+
+struct main_out {
+  uint x_4_1;
+  float4 gl_Position;
+};
+struct tint_symbol_1 {
+  float2 x_3_param : TEXCOORD0;
+};
+struct tint_symbol_2 {
+  uint x_4_1 : TEXCOORD0;
+  float4 gl_Position : SV_Position;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float2 x_3_param = tint_symbol.x_3_param;
+  x_3 = x_3_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_4, gl_Position};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_4_1, tint_symbol_3.gl_Position};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/float32/comparison/frexpstruct_1_frag/0.spvasm.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/float32/comparison/frexpstruct_1_frag/0.spvasm.expected.msl
new file mode 100644
index 0000000..7bcd3c2
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/float32/comparison/frexpstruct_1_frag/0.spvasm.expected.msl
@@ -0,0 +1,36 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  uint x_4_1;
+  float4 gl_Position;
+};
+struct tint_symbol_2 {
+  float2 x_3_param [[attribute(0)]];
+};
+struct tint_symbol_3 {
+  uint x_4_1 [[user(locn0)]];
+  float4 gl_Position [[position]];
+};
+
+void main_1(thread float2* const tint_symbol_6, thread uint* const tint_symbol_7, thread float4* const tint_symbol_8) {
+  float const x_30 = (*(tint_symbol_6)).x;
+  float const x_36 = (*(tint_symbol_6)).y;
+  *(tint_symbol_7) = (uint((((x_30 + 1.027777791f) * 18.0f) - 1.0f)) + (uint((((x_36 + 1.027777791f) * 18.0f) - 1.0f)) * 36u));
+  float2 const x_43 = *(tint_symbol_6);
+  *(tint_symbol_8) = float4(x_43.x, x_43.y, 0.0f, 1.0f);
+  return;
+}
+
+vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread float2 tint_symbol_9 = 0.0f;
+  thread uint tint_symbol_10 = 0u;
+  thread float4 tint_symbol_11 = 0.0f;
+  float2 const x_3_param = tint_symbol_1.x_3_param;
+  tint_symbol_9 = x_3_param;
+  main_1(&(tint_symbol_9), &(tint_symbol_10), &(tint_symbol_11));
+  main_out const tint_symbol_4 = {.x_4_1=tint_symbol_10, .gl_Position=tint_symbol_11};
+  tint_symbol_3 const tint_symbol_5 = {.x_4_1=tint_symbol_4.x_4_1, .gl_Position=tint_symbol_4.gl_Position};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/float32/comparison/frexpstruct_1_frag/0.spvasm.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/float32/comparison/frexpstruct_1_frag/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..b95f794
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/float32/comparison/frexpstruct_1_frag/0.spvasm.expected.spvasm
@@ -0,0 +1,108 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 68
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %tint_pointsize %tint_symbol %tint_symbol_2 %tint_symbol_3
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %x_3 "x_3"
+               OpName %x_4 "x_4"
+               OpName %gl_Position "gl_Position"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_4_1"
+               OpMemberName %main_out 1 "gl_Position"
+               OpName %tint_symbol_4 "tint_symbol_4"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %tint_symbol_2 Flat
+               OpDecorate %tint_symbol_3 BuiltIn Position
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+    %v2float = OpTypeVector %float 2
+%_ptr_Private_v2float = OpTypePointer Private %v2float
+          %8 = OpConstantNull %v2float
+        %x_3 = OpVariable %_ptr_Private_v2float Private %8
+       %uint = OpTypeInt 32 0
+%_ptr_Private_uint = OpTypePointer Private %uint
+         %12 = OpConstantNull %uint
+        %x_4 = OpVariable %_ptr_Private_uint Private %12
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%gl_Position = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+%tint_symbol = OpVariable %_ptr_Input_v2float Input
+%_ptr_Output_uint = OpTypePointer Output %uint
+%tint_symbol_2 = OpVariable %_ptr_Output_uint Output %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_3 = OpVariable %_ptr_Output_v4float Output %16
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+     %uint_1 = OpConstant %uint 1
+%float_1_02777779 = OpConstant %float 1.02777779
+   %float_18 = OpConstant %float 18
+    %float_1 = OpConstant %float 1
+    %uint_36 = OpConstant %uint 36
+    %float_0 = OpConstant %float 0
+   %main_out = OpTypeStruct %uint %v4float
+         %53 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %23
+         %26 = OpLabel
+         %29 = OpAccessChain %_ptr_Private_float %x_3 %uint_0
+         %30 = OpLoad %float %29
+         %32 = OpAccessChain %_ptr_Private_float %x_3 %uint_1
+         %33 = OpLoad %float %32
+         %36 = OpFAdd %float %30 %float_1_02777779
+         %38 = OpFMul %float %36 %float_18
+         %40 = OpFSub %float %38 %float_1
+         %34 = OpConvertFToU %uint %40
+         %42 = OpFAdd %float %33 %float_1_02777779
+         %43 = OpFMul %float %42 %float_18
+         %44 = OpFSub %float %43 %float_1
+         %41 = OpConvertFToU %uint %44
+         %46 = OpIMul %uint %41 %uint_36
+         %47 = OpIAdd %uint %34 %46
+               OpStore %x_4 %47
+         %48 = OpLoad %v2float %x_3
+         %49 = OpCompositeExtract %float %48 0
+         %50 = OpCompositeExtract %float %48 1
+         %52 = OpCompositeConstruct %v4float %49 %50 %float_0 %float_1
+               OpStore %gl_Position %52
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_4 = OpFunction %void None %53
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %57 = OpLabel
+         %58 = OpCompositeExtract %uint %tint_symbol_1 0
+               OpStore %tint_symbol_2 %58
+         %59 = OpCompositeExtract %v4float %tint_symbol_1 1
+               OpStore %tint_symbol_3 %59
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %23
+         %61 = OpLabel
+               OpStore %tint_pointsize %float_1
+         %62 = OpLoad %v2float %tint_symbol
+               OpStore %x_3 %62
+         %63 = OpFunctionCall %void %main_1
+         %65 = OpLoad %uint %x_4
+         %66 = OpLoad %v4float %gl_Position
+         %67 = OpCompositeConstruct %main_out %65 %66
+         %64 = OpFunctionCall %void %tint_symbol_4 %67
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/float32/comparison/frexpstruct_1_frag/0.spvasm.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/float32/comparison/frexpstruct_1_frag/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..eef9fd1
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/float32/comparison/frexpstruct_1_frag/0.spvasm.expected.wgsl
@@ -0,0 +1,28 @@
+var<private> x_3 : vec2<f32>;
+
+var<private> x_4 : u32;
+
+var<private> gl_Position : vec4<f32>;
+
+fn main_1() {
+  let x_30 : f32 = x_3.x;
+  let x_36 : f32 = x_3.y;
+  x_4 = (u32((((x_30 + 1.027777791) * 18.0) - 1.0)) + (u32((((x_36 + 1.027777791) * 18.0) - 1.0)) * 36u));
+  let x_43 : vec2<f32> = x_3;
+  gl_Position = vec4<f32>(x_43.x, x_43.y, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_4_1 : u32;
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] x_3_param : vec2<f32>) -> main_out {
+  x_3 = x_3_param;
+  main_1();
+  return main_out(x_4, gl_Position);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/float32/comparison/frexpstruct_1_frag/0.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/float32/comparison/frexpstruct_1_frag/0.wgsl
new file mode 100644
index 0000000..eef9fd1
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/float32/comparison/frexpstruct_1_frag/0.wgsl
@@ -0,0 +1,28 @@
+var<private> x_3 : vec2<f32>;
+
+var<private> x_4 : u32;
+
+var<private> gl_Position : vec4<f32>;
+
+fn main_1() {
+  let x_30 : f32 = x_3.x;
+  let x_36 : f32 = x_3.y;
+  x_4 = (u32((((x_30 + 1.027777791) * 18.0) - 1.0)) + (u32((((x_36 + 1.027777791) * 18.0) - 1.0)) * 36u));
+  let x_43 : vec2<f32> = x_3;
+  gl_Position = vec4<f32>(x_43.x, x_43.y, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_4_1 : u32;
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] x_3_param : vec2<f32>) -> main_out {
+  x_3 = x_3_param;
+  main_1();
+  return main_out(x_4, gl_Position);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/float32/comparison/frexpstruct_1_frag/0.wgsl.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/float32/comparison/frexpstruct_1_frag/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..1e05739
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/float32/comparison/frexpstruct_1_frag/0.wgsl.expected.hlsl
@@ -0,0 +1,33 @@
+static float2 x_3 = float2(0.0f, 0.0f);
+static uint x_4 = 0u;
+static float4 gl_Position = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const float x_30 = x_3.x;
+  const float x_36 = x_3.y;
+  x_4 = (uint((((x_30 + 1.027777791f) * 18.0f) - 1.0f)) + (uint((((x_36 + 1.027777791f) * 18.0f) - 1.0f)) * 36u));
+  const float2 x_43 = x_3;
+  gl_Position = float4(x_43.x, x_43.y, 0.0f, 1.0f);
+  return;
+}
+
+struct main_out {
+  uint x_4_1;
+  float4 gl_Position;
+};
+struct tint_symbol_1 {
+  float2 x_3_param : TEXCOORD0;
+};
+struct tint_symbol_2 {
+  uint x_4_1 : TEXCOORD0;
+  float4 gl_Position : SV_Position;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float2 x_3_param = tint_symbol.x_3_param;
+  x_3 = x_3_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_4, gl_Position};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_4_1, tint_symbol_3.gl_Position};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/float32/comparison/frexpstruct_1_frag/0.wgsl.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/float32/comparison/frexpstruct_1_frag/0.wgsl.expected.msl
new file mode 100644
index 0000000..7bcd3c2
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/float32/comparison/frexpstruct_1_frag/0.wgsl.expected.msl
@@ -0,0 +1,36 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  uint x_4_1;
+  float4 gl_Position;
+};
+struct tint_symbol_2 {
+  float2 x_3_param [[attribute(0)]];
+};
+struct tint_symbol_3 {
+  uint x_4_1 [[user(locn0)]];
+  float4 gl_Position [[position]];
+};
+
+void main_1(thread float2* const tint_symbol_6, thread uint* const tint_symbol_7, thread float4* const tint_symbol_8) {
+  float const x_30 = (*(tint_symbol_6)).x;
+  float const x_36 = (*(tint_symbol_6)).y;
+  *(tint_symbol_7) = (uint((((x_30 + 1.027777791f) * 18.0f) - 1.0f)) + (uint((((x_36 + 1.027777791f) * 18.0f) - 1.0f)) * 36u));
+  float2 const x_43 = *(tint_symbol_6);
+  *(tint_symbol_8) = float4(x_43.x, x_43.y, 0.0f, 1.0f);
+  return;
+}
+
+vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread float2 tint_symbol_9 = 0.0f;
+  thread uint tint_symbol_10 = 0u;
+  thread float4 tint_symbol_11 = 0.0f;
+  float2 const x_3_param = tint_symbol_1.x_3_param;
+  tint_symbol_9 = x_3_param;
+  main_1(&(tint_symbol_9), &(tint_symbol_10), &(tint_symbol_11));
+  main_out const tint_symbol_4 = {.x_4_1=tint_symbol_10, .gl_Position=tint_symbol_11};
+  tint_symbol_3 const tint_symbol_5 = {.x_4_1=tint_symbol_4.x_4_1, .gl_Position=tint_symbol_4.gl_Position};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/float32/comparison/frexpstruct_1_frag/0.wgsl.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/float32/comparison/frexpstruct_1_frag/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..b95f794
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/float32/comparison/frexpstruct_1_frag/0.wgsl.expected.spvasm
@@ -0,0 +1,108 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 68
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %tint_pointsize %tint_symbol %tint_symbol_2 %tint_symbol_3
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %x_3 "x_3"
+               OpName %x_4 "x_4"
+               OpName %gl_Position "gl_Position"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_4_1"
+               OpMemberName %main_out 1 "gl_Position"
+               OpName %tint_symbol_4 "tint_symbol_4"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %tint_symbol_2 Flat
+               OpDecorate %tint_symbol_3 BuiltIn Position
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+    %v2float = OpTypeVector %float 2
+%_ptr_Private_v2float = OpTypePointer Private %v2float
+          %8 = OpConstantNull %v2float
+        %x_3 = OpVariable %_ptr_Private_v2float Private %8
+       %uint = OpTypeInt 32 0
+%_ptr_Private_uint = OpTypePointer Private %uint
+         %12 = OpConstantNull %uint
+        %x_4 = OpVariable %_ptr_Private_uint Private %12
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %16 = OpConstantNull %v4float
+%gl_Position = OpVariable %_ptr_Private_v4float Private %16
+%_ptr_Input_v2float = OpTypePointer Input %v2float
+%tint_symbol = OpVariable %_ptr_Input_v2float Input
+%_ptr_Output_uint = OpTypePointer Output %uint
+%tint_symbol_2 = OpVariable %_ptr_Output_uint Output %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_3 = OpVariable %_ptr_Output_v4float Output %16
+       %void = OpTypeVoid
+         %23 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+     %uint_1 = OpConstant %uint 1
+%float_1_02777779 = OpConstant %float 1.02777779
+   %float_18 = OpConstant %float 18
+    %float_1 = OpConstant %float 1
+    %uint_36 = OpConstant %uint 36
+    %float_0 = OpConstant %float 0
+   %main_out = OpTypeStruct %uint %v4float
+         %53 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %23
+         %26 = OpLabel
+         %29 = OpAccessChain %_ptr_Private_float %x_3 %uint_0
+         %30 = OpLoad %float %29
+         %32 = OpAccessChain %_ptr_Private_float %x_3 %uint_1
+         %33 = OpLoad %float %32
+         %36 = OpFAdd %float %30 %float_1_02777779
+         %38 = OpFMul %float %36 %float_18
+         %40 = OpFSub %float %38 %float_1
+         %34 = OpConvertFToU %uint %40
+         %42 = OpFAdd %float %33 %float_1_02777779
+         %43 = OpFMul %float %42 %float_18
+         %44 = OpFSub %float %43 %float_1
+         %41 = OpConvertFToU %uint %44
+         %46 = OpIMul %uint %41 %uint_36
+         %47 = OpIAdd %uint %34 %46
+               OpStore %x_4 %47
+         %48 = OpLoad %v2float %x_3
+         %49 = OpCompositeExtract %float %48 0
+         %50 = OpCompositeExtract %float %48 1
+         %52 = OpCompositeConstruct %v4float %49 %50 %float_0 %float_1
+               OpStore %gl_Position %52
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_4 = OpFunction %void None %53
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %57 = OpLabel
+         %58 = OpCompositeExtract %uint %tint_symbol_1 0
+               OpStore %tint_symbol_2 %58
+         %59 = OpCompositeExtract %v4float %tint_symbol_1 1
+               OpStore %tint_symbol_3 %59
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %23
+         %61 = OpLabel
+               OpStore %tint_pointsize %float_1
+         %62 = OpLoad %v2float %tint_symbol
+               OpStore %x_3 %62
+         %63 = OpFunctionCall %void %main_1
+         %65 = OpLoad %uint %x_4
+         %66 = OpLoad %v4float %gl_Position
+         %67 = OpCompositeConstruct %main_out %65 %66
+         %64 = OpFunctionCall %void %tint_symbol_4 %67
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/float32/comparison/frexpstruct_1_frag/0.wgsl.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/float32/comparison/frexpstruct_1_frag/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..eef9fd1
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/float32/comparison/frexpstruct_1_frag/0.wgsl.expected.wgsl
@@ -0,0 +1,28 @@
+var<private> x_3 : vec2<f32>;
+
+var<private> x_4 : u32;
+
+var<private> gl_Position : vec4<f32>;
+
+fn main_1() {
+  let x_30 : f32 = x_3.x;
+  let x_36 : f32 = x_3.y;
+  x_4 = (u32((((x_30 + 1.027777791) * 18.0) - 1.0)) + (u32((((x_36 + 1.027777791) * 18.0) - 1.0)) * 36u));
+  let x_43 : vec2<f32> = x_3;
+  gl_Position = vec4<f32>(x_43.x, x_43.y, 0.0, 1.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_4_1 : u32;
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] x_3_param : vec2<f32>) -> main_out {
+  x_3 = x_3_param;
+  main_1();
+  return main_out(x_4, gl_Position);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/0-opt.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/0-opt.spvasm
new file mode 100644
index 0000000..4dca9c5
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/0-opt.spvasm
@@ -0,0 +1,46 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %_ %position
+               OpSource GLSL 430
+               OpName %main "main"
+               OpName %gl_PerVertex "gl_PerVertex"
+               OpMemberName %gl_PerVertex 0 "gl_Position"
+               OpMemberName %gl_PerVertex 1 "gl_PointSize"
+               OpMemberName %gl_PerVertex 2 "gl_ClipDistance"
+               OpName %_ ""
+               OpName %position "position"
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+               OpDecorate %position Location 0
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+   %position = OpVariable %_ptr_Input_v4float Input
+    %v2float = OpTypeVector %float 2
+  %float_0_5 = OpConstant %float 0.5
+    %float_1 = OpConstant %float 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+       %main = OpFunction %void None %7
+         %21 = OpLabel
+         %22 = OpLoad %v4float %position
+         %23 = OpVectorShuffle %v2float %22 %22 0 1
+         %24 = OpCompositeExtract %float %23 0
+         %25 = OpCompositeExtract %float %23 1
+         %26 = OpCompositeConstruct %v4float %24 %25 %float_0_5 %float_1
+         %27 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+               OpStore %27 %26
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..067c7f0
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,28 @@
+static float4 position = 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() {
+  const float4 x_22 = position;
+  const float2 x_23 = float2(x_22.x, x_22.y);
+  gl_Position = float4(x_23.x, x_23.y, 0.5f, 1.0f);
+  return;
+}
+
+struct main_out {
+  float4 gl_Position;
+};
+struct tint_symbol_1 {
+  float4 position_param : TEXCOORD0;
+};
+struct tint_symbol_2 {
+  float4 gl_Position : SV_Position;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 position_param = tint_symbol.position_param;
+  position = position_param;
+  main_1();
+  const main_out tint_symbol_3 = {gl_Position};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.gl_Position};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/0-opt.spvasm.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..f654314
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/0-opt.spvasm.expected.msl
@@ -0,0 +1,31 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 gl_Position;
+};
+struct tint_symbol_2 {
+  float4 position_param [[attribute(0)]];
+};
+struct tint_symbol_3 {
+  float4 gl_Position [[position]];
+};
+
+void main_1(thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  float4 const x_22 = *(tint_symbol_6);
+  float2 const x_23 = float2(x_22.x, x_22.y);
+  *(tint_symbol_7) = float4(x_23.x, x_23.y, 0.5f, 1.0f);
+  return;
+}
+
+vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  float4 const position_param = tint_symbol_1.position_param;
+  tint_symbol_8 = position_param;
+  main_1(&(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_4 = {.gl_Position=tint_symbol_9};
+  tint_symbol_3 const tint_symbol_5 = {.gl_Position=tint_symbol_4.gl_Position};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..bb27f18
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,73 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 41
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %tint_pointsize %tint_symbol %tint_symbol_2
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %position "position"
+               OpName %gl_Position "gl_Position"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "gl_Position"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_2 BuiltIn Position
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+   %position = OpVariable %_ptr_Private_v4float Private %8
+%gl_Position = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+  %float_0_5 = OpConstant %float 0.5
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+         %28 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+         %18 = OpLoad %v4float %position
+         %20 = OpCompositeExtract %float %18 0
+         %21 = OpCompositeExtract %float %18 1
+         %22 = OpCompositeConstruct %v2float %20 %21
+         %23 = OpCompositeExtract %float %22 0
+         %24 = OpCompositeExtract %float %22 1
+         %27 = OpCompositeConstruct %v4float %23 %24 %float_0_5 %float_1
+               OpStore %gl_Position %27
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %28
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %32 = OpLabel
+         %33 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %33
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %35 = OpLabel
+               OpStore %tint_pointsize %float_1
+         %36 = OpLoad %v4float %tint_symbol
+               OpStore %position %36
+         %37 = OpFunctionCall %void %main_1
+         %39 = OpLoad %v4float %gl_Position
+         %40 = OpCompositeConstruct %main_out %39
+         %38 = OpFunctionCall %void %tint_symbol_3 %40
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..bf7b1a4
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,22 @@
+var<private> position : vec4<f32>;
+
+var<private> gl_Position : vec4<f32>;
+
+fn main_1() {
+  let x_22 : vec4<f32> = position;
+  let x_23 : vec2<f32> = vec2<f32>(x_22.x, x_22.y);
+  gl_Position = vec4<f32>(x_23.x, x_23.y, 0.5, 1.0);
+  return;
+}
+
+struct main_out {
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] position_param : vec4<f32>) -> main_out {
+  position = position_param;
+  main_1();
+  return main_out(gl_Position);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/0-opt.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/0-opt.wgsl
new file mode 100644
index 0000000..bf7b1a4
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/0-opt.wgsl
@@ -0,0 +1,22 @@
+var<private> position : vec4<f32>;
+
+var<private> gl_Position : vec4<f32>;
+
+fn main_1() {
+  let x_22 : vec4<f32> = position;
+  let x_23 : vec2<f32> = vec2<f32>(x_22.x, x_22.y);
+  gl_Position = vec4<f32>(x_23.x, x_23.y, 0.5, 1.0);
+  return;
+}
+
+struct main_out {
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] position_param : vec4<f32>) -> main_out {
+  position = position_param;
+  main_1();
+  return main_out(gl_Position);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..067c7f0
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,28 @@
+static float4 position = 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() {
+  const float4 x_22 = position;
+  const float2 x_23 = float2(x_22.x, x_22.y);
+  gl_Position = float4(x_23.x, x_23.y, 0.5f, 1.0f);
+  return;
+}
+
+struct main_out {
+  float4 gl_Position;
+};
+struct tint_symbol_1 {
+  float4 position_param : TEXCOORD0;
+};
+struct tint_symbol_2 {
+  float4 gl_Position : SV_Position;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 position_param = tint_symbol.position_param;
+  position = position_param;
+  main_1();
+  const main_out tint_symbol_3 = {gl_Position};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.gl_Position};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/0-opt.wgsl.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..f654314
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/0-opt.wgsl.expected.msl
@@ -0,0 +1,31 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 gl_Position;
+};
+struct tint_symbol_2 {
+  float4 position_param [[attribute(0)]];
+};
+struct tint_symbol_3 {
+  float4 gl_Position [[position]];
+};
+
+void main_1(thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  float4 const x_22 = *(tint_symbol_6);
+  float2 const x_23 = float2(x_22.x, x_22.y);
+  *(tint_symbol_7) = float4(x_23.x, x_23.y, 0.5f, 1.0f);
+  return;
+}
+
+vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  float4 const position_param = tint_symbol_1.position_param;
+  tint_symbol_8 = position_param;
+  main_1(&(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_4 = {.gl_Position=tint_symbol_9};
+  tint_symbol_3 const tint_symbol_5 = {.gl_Position=tint_symbol_4.gl_Position};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..bb27f18
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,73 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 41
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %tint_pointsize %tint_symbol %tint_symbol_2
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %position "position"
+               OpName %gl_Position "gl_Position"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "gl_Position"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_2 BuiltIn Position
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+   %position = OpVariable %_ptr_Private_v4float Private %8
+%gl_Position = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+  %float_0_5 = OpConstant %float 0.5
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+         %28 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+         %18 = OpLoad %v4float %position
+         %20 = OpCompositeExtract %float %18 0
+         %21 = OpCompositeExtract %float %18 1
+         %22 = OpCompositeConstruct %v2float %20 %21
+         %23 = OpCompositeExtract %float %22 0
+         %24 = OpCompositeExtract %float %22 1
+         %27 = OpCompositeConstruct %v4float %23 %24 %float_0_5 %float_1
+               OpStore %gl_Position %27
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %28
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %32 = OpLabel
+         %33 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %33
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %35 = OpLabel
+               OpStore %tint_pointsize %float_1
+         %36 = OpLoad %v4float %tint_symbol
+               OpStore %position %36
+         %37 = OpFunctionCall %void %main_1
+         %39 = OpLoad %v4float %gl_Position
+         %40 = OpCompositeConstruct %main_out %39
+         %38 = OpFunctionCall %void %tint_symbol_3 %40
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..bf7b1a4
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,22 @@
+var<private> position : vec4<f32>;
+
+var<private> gl_Position : vec4<f32>;
+
+fn main_1() {
+  let x_22 : vec4<f32> = position;
+  let x_23 : vec2<f32> = vec2<f32>(x_22.x, x_22.y);
+  gl_Position = vec4<f32>(x_23.x, x_23.y, 0.5, 1.0);
+  return;
+}
+
+struct main_out {
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] position_param : vec4<f32>) -> main_out {
+  position = position_param;
+  main_1();
+  return main_out(gl_Position);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/1.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/1.spvasm
new file mode 100644
index 0000000..c63fe28
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/1.spvasm
@@ -0,0 +1,31 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %color_out %gl_FragDepth
+               OpExecutionMode %main OriginUpperLeft
+               OpExecutionMode %main EarlyFragmentTests
+               OpExecutionMode %main DepthReplacing
+               OpSource GLSL 430
+               OpName %main "main"
+               OpName %color_out "color_out"
+               OpName %gl_FragDepth "gl_FragDepth"
+               OpDecorate %color_out Location 0
+               OpDecorate %gl_FragDepth BuiltIn FragDepth
+       %void = OpTypeVoid
+          %6 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+  %color_out = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %12 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+%_ptr_Output_float = OpTypePointer Output %float
+%gl_FragDepth = OpVariable %_ptr_Output_float Output
+%float_0_300000012 = OpConstant %float 0.300000012
+       %main = OpFunction %void None %6
+         %15 = OpLabel
+               OpStore %color_out %12
+               OpStore %gl_FragDepth %float_0_300000012
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/1.spvasm.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..25aecc7
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/1.spvasm.expected.hlsl
@@ -0,0 +1,24 @@
+static float4 color_out = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float gl_FragDepth = 0.0f;
+
+void main_1() {
+  color_out = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  gl_FragDepth = 0.300000012f;
+  return;
+}
+
+struct main_out {
+  float4 color_out_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol {
+  float4 color_out_1 : SV_Target0;
+  float gl_FragDepth_1 : SV_Depth;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {color_out, gl_FragDepth};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.color_out_1, tint_symbol_1.gl_FragDepth_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/1.spvasm.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/1.spvasm.expected.msl
new file mode 100644
index 0000000..d3a4444
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/1.spvasm.expected.msl
@@ -0,0 +1,27 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 color_out_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol_1 {
+  float4 color_out_1 [[color(0)]];
+  float gl_FragDepth_1 [[depth(any)]];
+};
+
+void main_1(thread float4* const tint_symbol_4, thread float* const tint_symbol_5) {
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  *(tint_symbol_5) = 0.300000012f;
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_6 = 0.0f;
+  thread float tint_symbol_7 = 0.0f;
+  main_1(&(tint_symbol_6), &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.color_out_1=tint_symbol_6, .gl_FragDepth_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_3 = {.color_out_1=tint_symbol_2.color_out_1, .gl_FragDepth_1=tint_symbol_2.gl_FragDepth_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/1.spvasm.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..2656eac
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/1.spvasm.expected.spvasm
@@ -0,0 +1,69 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 35
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1 %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpExecutionMode %main DepthReplacing
+               OpName %color_out "color_out"
+               OpName %gl_FragDepth "gl_FragDepth"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "color_out_1"
+               OpMemberName %main_out 1 "gl_FragDepth_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %tint_symbol_2 BuiltIn FragDepth
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+  %color_out = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Private_float = OpTypePointer Private %float
+          %8 = OpConstantNull %float
+%gl_FragDepth = OpVariable %_ptr_Private_float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Output_float = OpTypePointer Output %float
+%tint_symbol_2 = OpVariable %_ptr_Output_float Output %8
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %19 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+%float_0_300000012 = OpConstant %float 0.300000012
+   %main_out = OpTypeStruct %v4float %float
+         %21 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %13
+         %16 = OpLabel
+               OpStore %color_out %19
+               OpStore %gl_FragDepth %float_0_300000012
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %21
+%tint_symbol = OpFunctionParameter %main_out
+         %25 = OpLabel
+         %26 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %26
+         %27 = OpCompositeExtract %float %tint_symbol 1
+               OpStore %tint_symbol_2 %27
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %13
+         %29 = OpLabel
+         %30 = OpFunctionCall %void %main_1
+         %32 = OpLoad %v4float %color_out
+         %33 = OpLoad %float %gl_FragDepth
+         %34 = OpCompositeConstruct %main_out %32 %33
+         %31 = OpFunctionCall %void %tint_symbol_3 %34
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/1.spvasm.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..48a9583
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/1.spvasm.expected.wgsl
@@ -0,0 +1,22 @@
+var<private> color_out : vec4<f32>;
+
+var<private> gl_FragDepth : f32;
+
+fn main_1() {
+  color_out = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  gl_FragDepth = 0.300000012;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  color_out_1 : vec4<f32>;
+  [[builtin(frag_depth)]]
+  gl_FragDepth_1 : f32;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(color_out, gl_FragDepth);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/1.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/1.wgsl
new file mode 100644
index 0000000..48a9583
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/1.wgsl
@@ -0,0 +1,22 @@
+var<private> color_out : vec4<f32>;
+
+var<private> gl_FragDepth : f32;
+
+fn main_1() {
+  color_out = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  gl_FragDepth = 0.300000012;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  color_out_1 : vec4<f32>;
+  [[builtin(frag_depth)]]
+  gl_FragDepth_1 : f32;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(color_out, gl_FragDepth);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/1.wgsl.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..25aecc7
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/1.wgsl.expected.hlsl
@@ -0,0 +1,24 @@
+static float4 color_out = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float gl_FragDepth = 0.0f;
+
+void main_1() {
+  color_out = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  gl_FragDepth = 0.300000012f;
+  return;
+}
+
+struct main_out {
+  float4 color_out_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol {
+  float4 color_out_1 : SV_Target0;
+  float gl_FragDepth_1 : SV_Depth;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {color_out, gl_FragDepth};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.color_out_1, tint_symbol_1.gl_FragDepth_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/1.wgsl.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/1.wgsl.expected.msl
new file mode 100644
index 0000000..d3a4444
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/1.wgsl.expected.msl
@@ -0,0 +1,27 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 color_out_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol_1 {
+  float4 color_out_1 [[color(0)]];
+  float gl_FragDepth_1 [[depth(any)]];
+};
+
+void main_1(thread float4* const tint_symbol_4, thread float* const tint_symbol_5) {
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  *(tint_symbol_5) = 0.300000012f;
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_6 = 0.0f;
+  thread float tint_symbol_7 = 0.0f;
+  main_1(&(tint_symbol_6), &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.color_out_1=tint_symbol_6, .gl_FragDepth_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_3 = {.color_out_1=tint_symbol_2.color_out_1, .gl_FragDepth_1=tint_symbol_2.gl_FragDepth_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/1.wgsl.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..2656eac
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/1.wgsl.expected.spvasm
@@ -0,0 +1,69 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 35
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1 %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpExecutionMode %main DepthReplacing
+               OpName %color_out "color_out"
+               OpName %gl_FragDepth "gl_FragDepth"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "color_out_1"
+               OpMemberName %main_out 1 "gl_FragDepth_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %tint_symbol_2 BuiltIn FragDepth
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+  %color_out = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Private_float = OpTypePointer Private %float
+          %8 = OpConstantNull %float
+%gl_FragDepth = OpVariable %_ptr_Private_float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Output_float = OpTypePointer Output %float
+%tint_symbol_2 = OpVariable %_ptr_Output_float Output %8
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %19 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+%float_0_300000012 = OpConstant %float 0.300000012
+   %main_out = OpTypeStruct %v4float %float
+         %21 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %13
+         %16 = OpLabel
+               OpStore %color_out %19
+               OpStore %gl_FragDepth %float_0_300000012
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %21
+%tint_symbol = OpFunctionParameter %main_out
+         %25 = OpLabel
+         %26 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %26
+         %27 = OpCompositeExtract %float %tint_symbol 1
+               OpStore %tint_symbol_2 %27
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %13
+         %29 = OpLabel
+         %30 = OpFunctionCall %void %main_1
+         %32 = OpLoad %v4float %color_out
+         %33 = OpLoad %float %gl_FragDepth
+         %34 = OpCompositeConstruct %main_out %32 %33
+         %31 = OpFunctionCall %void %tint_symbol_3 %34
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/1.wgsl.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..48a9583
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_equal/1.wgsl.expected.wgsl
@@ -0,0 +1,22 @@
+var<private> color_out : vec4<f32>;
+
+var<private> gl_FragDepth : f32;
+
+fn main_1() {
+  color_out = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  gl_FragDepth = 0.300000012;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  color_out_1 : vec4<f32>;
+  [[builtin(frag_depth)]]
+  gl_FragDepth_1 : f32;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(color_out, gl_FragDepth);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/0-opt.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/0-opt.spvasm
new file mode 100644
index 0000000..6944ce4
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/0-opt.spvasm
@@ -0,0 +1,46 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %_ %position
+               OpSource GLSL 430
+               OpName %main "main"
+               OpName %gl_PerVertex "gl_PerVertex"
+               OpMemberName %gl_PerVertex 0 "gl_Position"
+               OpMemberName %gl_PerVertex 1 "gl_PointSize"
+               OpMemberName %gl_PerVertex 2 "gl_ClipDistance"
+               OpName %_ ""
+               OpName %position "position"
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+               OpDecorate %position Location 0
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+   %position = OpVariable %_ptr_Input_v4float Input
+    %v2float = OpTypeVector %float 2
+%float_0_600000024 = OpConstant %float 0.600000024
+    %float_1 = OpConstant %float 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+       %main = OpFunction %void None %7
+         %21 = OpLabel
+         %22 = OpLoad %v4float %position
+         %23 = OpVectorShuffle %v2float %22 %22 0 1
+         %24 = OpCompositeExtract %float %23 0
+         %25 = OpCompositeExtract %float %23 1
+         %26 = OpCompositeConstruct %v4float %24 %25 %float_0_600000024 %float_1
+         %27 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+               OpStore %27 %26
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..224ce12
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,28 @@
+static float4 position = 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() {
+  const float4 x_22 = position;
+  const float2 x_23 = float2(x_22.x, x_22.y);
+  gl_Position = float4(x_23.x, x_23.y, 0.600000024f, 1.0f);
+  return;
+}
+
+struct main_out {
+  float4 gl_Position;
+};
+struct tint_symbol_1 {
+  float4 position_param : TEXCOORD0;
+};
+struct tint_symbol_2 {
+  float4 gl_Position : SV_Position;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 position_param = tint_symbol.position_param;
+  position = position_param;
+  main_1();
+  const main_out tint_symbol_3 = {gl_Position};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.gl_Position};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/0-opt.spvasm.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..ccc433e
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/0-opt.spvasm.expected.msl
@@ -0,0 +1,31 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 gl_Position;
+};
+struct tint_symbol_2 {
+  float4 position_param [[attribute(0)]];
+};
+struct tint_symbol_3 {
+  float4 gl_Position [[position]];
+};
+
+void main_1(thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  float4 const x_22 = *(tint_symbol_6);
+  float2 const x_23 = float2(x_22.x, x_22.y);
+  *(tint_symbol_7) = float4(x_23.x, x_23.y, 0.600000024f, 1.0f);
+  return;
+}
+
+vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  float4 const position_param = tint_symbol_1.position_param;
+  tint_symbol_8 = position_param;
+  main_1(&(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_4 = {.gl_Position=tint_symbol_9};
+  tint_symbol_3 const tint_symbol_5 = {.gl_Position=tint_symbol_4.gl_Position};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..67f68ab
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,73 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 41
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %tint_pointsize %tint_symbol %tint_symbol_2
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %position "position"
+               OpName %gl_Position "gl_Position"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "gl_Position"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_2 BuiltIn Position
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+   %position = OpVariable %_ptr_Private_v4float Private %8
+%gl_Position = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%float_0_600000024 = OpConstant %float 0.600000024
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+         %28 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+         %18 = OpLoad %v4float %position
+         %20 = OpCompositeExtract %float %18 0
+         %21 = OpCompositeExtract %float %18 1
+         %22 = OpCompositeConstruct %v2float %20 %21
+         %23 = OpCompositeExtract %float %22 0
+         %24 = OpCompositeExtract %float %22 1
+         %27 = OpCompositeConstruct %v4float %23 %24 %float_0_600000024 %float_1
+               OpStore %gl_Position %27
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %28
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %32 = OpLabel
+         %33 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %33
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %35 = OpLabel
+               OpStore %tint_pointsize %float_1
+         %36 = OpLoad %v4float %tint_symbol
+               OpStore %position %36
+         %37 = OpFunctionCall %void %main_1
+         %39 = OpLoad %v4float %gl_Position
+         %40 = OpCompositeConstruct %main_out %39
+         %38 = OpFunctionCall %void %tint_symbol_3 %40
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..574d2de
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,22 @@
+var<private> position : vec4<f32>;
+
+var<private> gl_Position : vec4<f32>;
+
+fn main_1() {
+  let x_22 : vec4<f32> = position;
+  let x_23 : vec2<f32> = vec2<f32>(x_22.x, x_22.y);
+  gl_Position = vec4<f32>(x_23.x, x_23.y, 0.600000024, 1.0);
+  return;
+}
+
+struct main_out {
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] position_param : vec4<f32>) -> main_out {
+  position = position_param;
+  main_1();
+  return main_out(gl_Position);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/0-opt.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/0-opt.wgsl
new file mode 100644
index 0000000..574d2de
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/0-opt.wgsl
@@ -0,0 +1,22 @@
+var<private> position : vec4<f32>;
+
+var<private> gl_Position : vec4<f32>;
+
+fn main_1() {
+  let x_22 : vec4<f32> = position;
+  let x_23 : vec2<f32> = vec2<f32>(x_22.x, x_22.y);
+  gl_Position = vec4<f32>(x_23.x, x_23.y, 0.600000024, 1.0);
+  return;
+}
+
+struct main_out {
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] position_param : vec4<f32>) -> main_out {
+  position = position_param;
+  main_1();
+  return main_out(gl_Position);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..224ce12
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,28 @@
+static float4 position = 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() {
+  const float4 x_22 = position;
+  const float2 x_23 = float2(x_22.x, x_22.y);
+  gl_Position = float4(x_23.x, x_23.y, 0.600000024f, 1.0f);
+  return;
+}
+
+struct main_out {
+  float4 gl_Position;
+};
+struct tint_symbol_1 {
+  float4 position_param : TEXCOORD0;
+};
+struct tint_symbol_2 {
+  float4 gl_Position : SV_Position;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 position_param = tint_symbol.position_param;
+  position = position_param;
+  main_1();
+  const main_out tint_symbol_3 = {gl_Position};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.gl_Position};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/0-opt.wgsl.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..ccc433e
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/0-opt.wgsl.expected.msl
@@ -0,0 +1,31 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 gl_Position;
+};
+struct tint_symbol_2 {
+  float4 position_param [[attribute(0)]];
+};
+struct tint_symbol_3 {
+  float4 gl_Position [[position]];
+};
+
+void main_1(thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  float4 const x_22 = *(tint_symbol_6);
+  float2 const x_23 = float2(x_22.x, x_22.y);
+  *(tint_symbol_7) = float4(x_23.x, x_23.y, 0.600000024f, 1.0f);
+  return;
+}
+
+vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  float4 const position_param = tint_symbol_1.position_param;
+  tint_symbol_8 = position_param;
+  main_1(&(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_4 = {.gl_Position=tint_symbol_9};
+  tint_symbol_3 const tint_symbol_5 = {.gl_Position=tint_symbol_4.gl_Position};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..67f68ab
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,73 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 41
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %tint_pointsize %tint_symbol %tint_symbol_2
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %position "position"
+               OpName %gl_Position "gl_Position"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "gl_Position"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_2 BuiltIn Position
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+   %position = OpVariable %_ptr_Private_v4float Private %8
+%gl_Position = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%float_0_600000024 = OpConstant %float 0.600000024
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+         %28 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+         %18 = OpLoad %v4float %position
+         %20 = OpCompositeExtract %float %18 0
+         %21 = OpCompositeExtract %float %18 1
+         %22 = OpCompositeConstruct %v2float %20 %21
+         %23 = OpCompositeExtract %float %22 0
+         %24 = OpCompositeExtract %float %22 1
+         %27 = OpCompositeConstruct %v4float %23 %24 %float_0_600000024 %float_1
+               OpStore %gl_Position %27
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %28
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %32 = OpLabel
+         %33 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %33
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %35 = OpLabel
+               OpStore %tint_pointsize %float_1
+         %36 = OpLoad %v4float %tint_symbol
+               OpStore %position %36
+         %37 = OpFunctionCall %void %main_1
+         %39 = OpLoad %v4float %gl_Position
+         %40 = OpCompositeConstruct %main_out %39
+         %38 = OpFunctionCall %void %tint_symbol_3 %40
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..574d2de
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,22 @@
+var<private> position : vec4<f32>;
+
+var<private> gl_Position : vec4<f32>;
+
+fn main_1() {
+  let x_22 : vec4<f32> = position;
+  let x_23 : vec2<f32> = vec2<f32>(x_22.x, x_22.y);
+  gl_Position = vec4<f32>(x_23.x, x_23.y, 0.600000024, 1.0);
+  return;
+}
+
+struct main_out {
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] position_param : vec4<f32>) -> main_out {
+  position = position_param;
+  main_1();
+  return main_out(gl_Position);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/1.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/1.spvasm
new file mode 100644
index 0000000..490b9ef
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/1.spvasm
@@ -0,0 +1,32 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %color_out %gl_FragDepth
+               OpExecutionMode %main OriginUpperLeft
+               OpExecutionMode %main EarlyFragmentTests
+               OpExecutionMode %main DepthReplacing
+               OpExecutionMode %main DepthGreater
+               OpSource GLSL 430
+               OpName %main "main"
+               OpName %color_out "color_out"
+               OpName %gl_FragDepth "gl_FragDepth"
+               OpDecorate %color_out Location 0
+               OpDecorate %gl_FragDepth BuiltIn FragDepth
+       %void = OpTypeVoid
+          %6 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+  %color_out = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %12 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+%_ptr_Output_float = OpTypePointer Output %float
+%gl_FragDepth = OpVariable %_ptr_Output_float Output
+%float_0_400000006 = OpConstant %float 0.400000006
+       %main = OpFunction %void None %6
+         %15 = OpLabel
+               OpStore %color_out %12
+               OpStore %gl_FragDepth %float_0_400000006
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/1.spvasm.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..4e8b74d
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/1.spvasm.expected.hlsl
@@ -0,0 +1,24 @@
+static float4 color_out = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float gl_FragDepth = 0.0f;
+
+void main_1() {
+  color_out = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  gl_FragDepth = 0.400000006f;
+  return;
+}
+
+struct main_out {
+  float4 color_out_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol {
+  float4 color_out_1 : SV_Target0;
+  float gl_FragDepth_1 : SV_Depth;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {color_out, gl_FragDepth};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.color_out_1, tint_symbol_1.gl_FragDepth_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/1.spvasm.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/1.spvasm.expected.msl
new file mode 100644
index 0000000..0189307
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/1.spvasm.expected.msl
@@ -0,0 +1,27 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 color_out_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol_1 {
+  float4 color_out_1 [[color(0)]];
+  float gl_FragDepth_1 [[depth(any)]];
+};
+
+void main_1(thread float4* const tint_symbol_4, thread float* const tint_symbol_5) {
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  *(tint_symbol_5) = 0.400000006f;
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_6 = 0.0f;
+  thread float tint_symbol_7 = 0.0f;
+  main_1(&(tint_symbol_6), &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.color_out_1=tint_symbol_6, .gl_FragDepth_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_3 = {.color_out_1=tint_symbol_2.color_out_1, .gl_FragDepth_1=tint_symbol_2.gl_FragDepth_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/1.spvasm.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..2c1b030
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/1.spvasm.expected.spvasm
@@ -0,0 +1,69 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 35
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1 %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpExecutionMode %main DepthReplacing
+               OpName %color_out "color_out"
+               OpName %gl_FragDepth "gl_FragDepth"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "color_out_1"
+               OpMemberName %main_out 1 "gl_FragDepth_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %tint_symbol_2 BuiltIn FragDepth
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+  %color_out = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Private_float = OpTypePointer Private %float
+          %8 = OpConstantNull %float
+%gl_FragDepth = OpVariable %_ptr_Private_float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Output_float = OpTypePointer Output %float
+%tint_symbol_2 = OpVariable %_ptr_Output_float Output %8
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %19 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+%float_0_400000006 = OpConstant %float 0.400000006
+   %main_out = OpTypeStruct %v4float %float
+         %21 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %13
+         %16 = OpLabel
+               OpStore %color_out %19
+               OpStore %gl_FragDepth %float_0_400000006
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %21
+%tint_symbol = OpFunctionParameter %main_out
+         %25 = OpLabel
+         %26 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %26
+         %27 = OpCompositeExtract %float %tint_symbol 1
+               OpStore %tint_symbol_2 %27
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %13
+         %29 = OpLabel
+         %30 = OpFunctionCall %void %main_1
+         %32 = OpLoad %v4float %color_out
+         %33 = OpLoad %float %gl_FragDepth
+         %34 = OpCompositeConstruct %main_out %32 %33
+         %31 = OpFunctionCall %void %tint_symbol_3 %34
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/1.spvasm.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..df3c7e3
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/1.spvasm.expected.wgsl
@@ -0,0 +1,22 @@
+var<private> color_out : vec4<f32>;
+
+var<private> gl_FragDepth : f32;
+
+fn main_1() {
+  color_out = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  gl_FragDepth = 0.400000006;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  color_out_1 : vec4<f32>;
+  [[builtin(frag_depth)]]
+  gl_FragDepth_1 : f32;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(color_out, gl_FragDepth);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/1.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/1.wgsl
new file mode 100644
index 0000000..df3c7e3
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/1.wgsl
@@ -0,0 +1,22 @@
+var<private> color_out : vec4<f32>;
+
+var<private> gl_FragDepth : f32;
+
+fn main_1() {
+  color_out = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  gl_FragDepth = 0.400000006;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  color_out_1 : vec4<f32>;
+  [[builtin(frag_depth)]]
+  gl_FragDepth_1 : f32;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(color_out, gl_FragDepth);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/1.wgsl.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..4e8b74d
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/1.wgsl.expected.hlsl
@@ -0,0 +1,24 @@
+static float4 color_out = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float gl_FragDepth = 0.0f;
+
+void main_1() {
+  color_out = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  gl_FragDepth = 0.400000006f;
+  return;
+}
+
+struct main_out {
+  float4 color_out_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol {
+  float4 color_out_1 : SV_Target0;
+  float gl_FragDepth_1 : SV_Depth;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {color_out, gl_FragDepth};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.color_out_1, tint_symbol_1.gl_FragDepth_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/1.wgsl.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/1.wgsl.expected.msl
new file mode 100644
index 0000000..0189307
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/1.wgsl.expected.msl
@@ -0,0 +1,27 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 color_out_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol_1 {
+  float4 color_out_1 [[color(0)]];
+  float gl_FragDepth_1 [[depth(any)]];
+};
+
+void main_1(thread float4* const tint_symbol_4, thread float* const tint_symbol_5) {
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  *(tint_symbol_5) = 0.400000006f;
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_6 = 0.0f;
+  thread float tint_symbol_7 = 0.0f;
+  main_1(&(tint_symbol_6), &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.color_out_1=tint_symbol_6, .gl_FragDepth_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_3 = {.color_out_1=tint_symbol_2.color_out_1, .gl_FragDepth_1=tint_symbol_2.gl_FragDepth_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/1.wgsl.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..2c1b030
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/1.wgsl.expected.spvasm
@@ -0,0 +1,69 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 35
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1 %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpExecutionMode %main DepthReplacing
+               OpName %color_out "color_out"
+               OpName %gl_FragDepth "gl_FragDepth"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "color_out_1"
+               OpMemberName %main_out 1 "gl_FragDepth_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %tint_symbol_2 BuiltIn FragDepth
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+  %color_out = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Private_float = OpTypePointer Private %float
+          %8 = OpConstantNull %float
+%gl_FragDepth = OpVariable %_ptr_Private_float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Output_float = OpTypePointer Output %float
+%tint_symbol_2 = OpVariable %_ptr_Output_float Output %8
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %19 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+%float_0_400000006 = OpConstant %float 0.400000006
+   %main_out = OpTypeStruct %v4float %float
+         %21 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %13
+         %16 = OpLabel
+               OpStore %color_out %19
+               OpStore %gl_FragDepth %float_0_400000006
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %21
+%tint_symbol = OpFunctionParameter %main_out
+         %25 = OpLabel
+         %26 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %26
+         %27 = OpCompositeExtract %float %tint_symbol 1
+               OpStore %tint_symbol_2 %27
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %13
+         %29 = OpLabel
+         %30 = OpFunctionCall %void %main_1
+         %32 = OpLoad %v4float %color_out
+         %33 = OpLoad %float %gl_FragDepth
+         %34 = OpCompositeConstruct %main_out %32 %33
+         %31 = OpFunctionCall %void %tint_symbol_3 %34
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/1.wgsl.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..df3c7e3
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_greater/1.wgsl.expected.wgsl
@@ -0,0 +1,22 @@
+var<private> color_out : vec4<f32>;
+
+var<private> gl_FragDepth : f32;
+
+fn main_1() {
+  color_out = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  gl_FragDepth = 0.400000006;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  color_out_1 : vec4<f32>;
+  [[builtin(frag_depth)]]
+  gl_FragDepth_1 : f32;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(color_out, gl_FragDepth);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less/0-opt.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less/0-opt.spvasm
new file mode 100644
index 0000000..716c4b7
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less/0-opt.spvasm
@@ -0,0 +1,46 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %_ %position
+               OpSource GLSL 430
+               OpName %main "main"
+               OpName %gl_PerVertex "gl_PerVertex"
+               OpMemberName %gl_PerVertex 0 "gl_Position"
+               OpMemberName %gl_PerVertex 1 "gl_PointSize"
+               OpMemberName %gl_PerVertex 2 "gl_ClipDistance"
+               OpName %_ ""
+               OpName %position "position"
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+               OpDecorate %position Location 0
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+   %position = OpVariable %_ptr_Input_v4float Input
+    %v2float = OpTypeVector %float 2
+%float_0_400000006 = OpConstant %float 0.400000006
+    %float_1 = OpConstant %float 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+       %main = OpFunction %void None %7
+         %21 = OpLabel
+         %22 = OpLoad %v4float %position
+         %23 = OpVectorShuffle %v2float %22 %22 0 1
+         %24 = OpCompositeExtract %float %23 0
+         %25 = OpCompositeExtract %float %23 1
+         %26 = OpCompositeConstruct %v4float %24 %25 %float_0_400000006 %float_1
+         %27 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+               OpStore %27 %26
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..2f5b031
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,28 @@
+static float4 position = 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() {
+  const float4 x_22 = position;
+  const float2 x_23 = float2(x_22.x, x_22.y);
+  gl_Position = float4(x_23.x, x_23.y, 0.400000006f, 1.0f);
+  return;
+}
+
+struct main_out {
+  float4 gl_Position;
+};
+struct tint_symbol_1 {
+  float4 position_param : TEXCOORD0;
+};
+struct tint_symbol_2 {
+  float4 gl_Position : SV_Position;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 position_param = tint_symbol.position_param;
+  position = position_param;
+  main_1();
+  const main_out tint_symbol_3 = {gl_Position};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.gl_Position};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less/0-opt.spvasm.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..0f220e3
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less/0-opt.spvasm.expected.msl
@@ -0,0 +1,31 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 gl_Position;
+};
+struct tint_symbol_2 {
+  float4 position_param [[attribute(0)]];
+};
+struct tint_symbol_3 {
+  float4 gl_Position [[position]];
+};
+
+void main_1(thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  float4 const x_22 = *(tint_symbol_6);
+  float2 const x_23 = float2(x_22.x, x_22.y);
+  *(tint_symbol_7) = float4(x_23.x, x_23.y, 0.400000006f, 1.0f);
+  return;
+}
+
+vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  float4 const position_param = tint_symbol_1.position_param;
+  tint_symbol_8 = position_param;
+  main_1(&(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_4 = {.gl_Position=tint_symbol_9};
+  tint_symbol_3 const tint_symbol_5 = {.gl_Position=tint_symbol_4.gl_Position};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..57cab41
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,73 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 41
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %tint_pointsize %tint_symbol %tint_symbol_2
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %position "position"
+               OpName %gl_Position "gl_Position"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "gl_Position"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_2 BuiltIn Position
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+   %position = OpVariable %_ptr_Private_v4float Private %8
+%gl_Position = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%float_0_400000006 = OpConstant %float 0.400000006
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+         %28 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+         %18 = OpLoad %v4float %position
+         %20 = OpCompositeExtract %float %18 0
+         %21 = OpCompositeExtract %float %18 1
+         %22 = OpCompositeConstruct %v2float %20 %21
+         %23 = OpCompositeExtract %float %22 0
+         %24 = OpCompositeExtract %float %22 1
+         %27 = OpCompositeConstruct %v4float %23 %24 %float_0_400000006 %float_1
+               OpStore %gl_Position %27
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %28
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %32 = OpLabel
+         %33 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %33
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %35 = OpLabel
+               OpStore %tint_pointsize %float_1
+         %36 = OpLoad %v4float %tint_symbol
+               OpStore %position %36
+         %37 = OpFunctionCall %void %main_1
+         %39 = OpLoad %v4float %gl_Position
+         %40 = OpCompositeConstruct %main_out %39
+         %38 = OpFunctionCall %void %tint_symbol_3 %40
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..f3aec87
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,22 @@
+var<private> position : vec4<f32>;
+
+var<private> gl_Position : vec4<f32>;
+
+fn main_1() {
+  let x_22 : vec4<f32> = position;
+  let x_23 : vec2<f32> = vec2<f32>(x_22.x, x_22.y);
+  gl_Position = vec4<f32>(x_23.x, x_23.y, 0.400000006, 1.0);
+  return;
+}
+
+struct main_out {
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] position_param : vec4<f32>) -> main_out {
+  position = position_param;
+  main_1();
+  return main_out(gl_Position);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less/0-opt.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less/0-opt.wgsl
new file mode 100644
index 0000000..f3aec87
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less/0-opt.wgsl
@@ -0,0 +1,22 @@
+var<private> position : vec4<f32>;
+
+var<private> gl_Position : vec4<f32>;
+
+fn main_1() {
+  let x_22 : vec4<f32> = position;
+  let x_23 : vec2<f32> = vec2<f32>(x_22.x, x_22.y);
+  gl_Position = vec4<f32>(x_23.x, x_23.y, 0.400000006, 1.0);
+  return;
+}
+
+struct main_out {
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] position_param : vec4<f32>) -> main_out {
+  position = position_param;
+  main_1();
+  return main_out(gl_Position);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..2f5b031
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,28 @@
+static float4 position = 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() {
+  const float4 x_22 = position;
+  const float2 x_23 = float2(x_22.x, x_22.y);
+  gl_Position = float4(x_23.x, x_23.y, 0.400000006f, 1.0f);
+  return;
+}
+
+struct main_out {
+  float4 gl_Position;
+};
+struct tint_symbol_1 {
+  float4 position_param : TEXCOORD0;
+};
+struct tint_symbol_2 {
+  float4 gl_Position : SV_Position;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 position_param = tint_symbol.position_param;
+  position = position_param;
+  main_1();
+  const main_out tint_symbol_3 = {gl_Position};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.gl_Position};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less/0-opt.wgsl.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..0f220e3
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less/0-opt.wgsl.expected.msl
@@ -0,0 +1,31 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 gl_Position;
+};
+struct tint_symbol_2 {
+  float4 position_param [[attribute(0)]];
+};
+struct tint_symbol_3 {
+  float4 gl_Position [[position]];
+};
+
+void main_1(thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  float4 const x_22 = *(tint_symbol_6);
+  float2 const x_23 = float2(x_22.x, x_22.y);
+  *(tint_symbol_7) = float4(x_23.x, x_23.y, 0.400000006f, 1.0f);
+  return;
+}
+
+vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  float4 const position_param = tint_symbol_1.position_param;
+  tint_symbol_8 = position_param;
+  main_1(&(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_4 = {.gl_Position=tint_symbol_9};
+  tint_symbol_3 const tint_symbol_5 = {.gl_Position=tint_symbol_4.gl_Position};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..57cab41
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,73 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 41
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %tint_pointsize %tint_symbol %tint_symbol_2
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %position "position"
+               OpName %gl_Position "gl_Position"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "gl_Position"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_2 BuiltIn Position
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+   %position = OpVariable %_ptr_Private_v4float Private %8
+%gl_Position = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%float_0_400000006 = OpConstant %float 0.400000006
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+         %28 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+         %18 = OpLoad %v4float %position
+         %20 = OpCompositeExtract %float %18 0
+         %21 = OpCompositeExtract %float %18 1
+         %22 = OpCompositeConstruct %v2float %20 %21
+         %23 = OpCompositeExtract %float %22 0
+         %24 = OpCompositeExtract %float %22 1
+         %27 = OpCompositeConstruct %v4float %23 %24 %float_0_400000006 %float_1
+               OpStore %gl_Position %27
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %28
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %32 = OpLabel
+         %33 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %33
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %35 = OpLabel
+               OpStore %tint_pointsize %float_1
+         %36 = OpLoad %v4float %tint_symbol
+               OpStore %position %36
+         %37 = OpFunctionCall %void %main_1
+         %39 = OpLoad %v4float %gl_Position
+         %40 = OpCompositeConstruct %main_out %39
+         %38 = OpFunctionCall %void %tint_symbol_3 %40
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..f3aec87
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,22 @@
+var<private> position : vec4<f32>;
+
+var<private> gl_Position : vec4<f32>;
+
+fn main_1() {
+  let x_22 : vec4<f32> = position;
+  let x_23 : vec2<f32> = vec2<f32>(x_22.x, x_22.y);
+  gl_Position = vec4<f32>(x_23.x, x_23.y, 0.400000006, 1.0);
+  return;
+}
+
+struct main_out {
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] position_param : vec4<f32>) -> main_out {
+  position = position_param;
+  main_1();
+  return main_out(gl_Position);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less_or_equal/1.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less_or_equal/1.spvasm
new file mode 100644
index 0000000..c195cb3
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less_or_equal/1.spvasm
@@ -0,0 +1,31 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %color_out %gl_FragDepth
+               OpExecutionMode %main OriginUpperLeft
+               OpExecutionMode %main EarlyFragmentTests
+               OpExecutionMode %main DepthReplacing
+               OpSource GLSL 430
+               OpName %main "main"
+               OpName %color_out "color_out"
+               OpName %gl_FragDepth "gl_FragDepth"
+               OpDecorate %color_out Location 0
+               OpDecorate %gl_FragDepth BuiltIn FragDepth
+       %void = OpTypeVoid
+          %6 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+  %color_out = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %12 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+%_ptr_Output_float = OpTypePointer Output %float
+%gl_FragDepth = OpVariable %_ptr_Output_float Output
+%float_0_699999988 = OpConstant %float 0.699999988
+       %main = OpFunction %void None %6
+         %15 = OpLabel
+               OpStore %color_out %12
+               OpStore %gl_FragDepth %float_0_699999988
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less_or_equal/1.spvasm.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less_or_equal/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..47aefbb
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less_or_equal/1.spvasm.expected.hlsl
@@ -0,0 +1,24 @@
+static float4 color_out = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float gl_FragDepth = 0.0f;
+
+void main_1() {
+  color_out = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  gl_FragDepth = 0.699999988f;
+  return;
+}
+
+struct main_out {
+  float4 color_out_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol {
+  float4 color_out_1 : SV_Target0;
+  float gl_FragDepth_1 : SV_Depth;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {color_out, gl_FragDepth};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.color_out_1, tint_symbol_1.gl_FragDepth_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less_or_equal/1.spvasm.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less_or_equal/1.spvasm.expected.msl
new file mode 100644
index 0000000..842cf9d
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less_or_equal/1.spvasm.expected.msl
@@ -0,0 +1,27 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 color_out_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol_1 {
+  float4 color_out_1 [[color(0)]];
+  float gl_FragDepth_1 [[depth(any)]];
+};
+
+void main_1(thread float4* const tint_symbol_4, thread float* const tint_symbol_5) {
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  *(tint_symbol_5) = 0.699999988f;
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_6 = 0.0f;
+  thread float tint_symbol_7 = 0.0f;
+  main_1(&(tint_symbol_6), &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.color_out_1=tint_symbol_6, .gl_FragDepth_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_3 = {.color_out_1=tint_symbol_2.color_out_1, .gl_FragDepth_1=tint_symbol_2.gl_FragDepth_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less_or_equal/1.spvasm.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less_or_equal/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..2f52f93
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less_or_equal/1.spvasm.expected.spvasm
@@ -0,0 +1,69 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 35
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1 %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpExecutionMode %main DepthReplacing
+               OpName %color_out "color_out"
+               OpName %gl_FragDepth "gl_FragDepth"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "color_out_1"
+               OpMemberName %main_out 1 "gl_FragDepth_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %tint_symbol_2 BuiltIn FragDepth
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+  %color_out = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Private_float = OpTypePointer Private %float
+          %8 = OpConstantNull %float
+%gl_FragDepth = OpVariable %_ptr_Private_float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Output_float = OpTypePointer Output %float
+%tint_symbol_2 = OpVariable %_ptr_Output_float Output %8
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %19 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+%float_0_699999988 = OpConstant %float 0.699999988
+   %main_out = OpTypeStruct %v4float %float
+         %21 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %13
+         %16 = OpLabel
+               OpStore %color_out %19
+               OpStore %gl_FragDepth %float_0_699999988
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %21
+%tint_symbol = OpFunctionParameter %main_out
+         %25 = OpLabel
+         %26 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %26
+         %27 = OpCompositeExtract %float %tint_symbol 1
+               OpStore %tint_symbol_2 %27
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %13
+         %29 = OpLabel
+         %30 = OpFunctionCall %void %main_1
+         %32 = OpLoad %v4float %color_out
+         %33 = OpLoad %float %gl_FragDepth
+         %34 = OpCompositeConstruct %main_out %32 %33
+         %31 = OpFunctionCall %void %tint_symbol_3 %34
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less_or_equal/1.spvasm.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less_or_equal/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..8bf833a
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less_or_equal/1.spvasm.expected.wgsl
@@ -0,0 +1,22 @@
+var<private> color_out : vec4<f32>;
+
+var<private> gl_FragDepth : f32;
+
+fn main_1() {
+  color_out = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  gl_FragDepth = 0.699999988;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  color_out_1 : vec4<f32>;
+  [[builtin(frag_depth)]]
+  gl_FragDepth_1 : f32;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(color_out, gl_FragDepth);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less_or_equal/1.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less_or_equal/1.wgsl
new file mode 100644
index 0000000..8bf833a
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less_or_equal/1.wgsl
@@ -0,0 +1,22 @@
+var<private> color_out : vec4<f32>;
+
+var<private> gl_FragDepth : f32;
+
+fn main_1() {
+  color_out = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  gl_FragDepth = 0.699999988;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  color_out_1 : vec4<f32>;
+  [[builtin(frag_depth)]]
+  gl_FragDepth_1 : f32;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(color_out, gl_FragDepth);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less_or_equal/1.wgsl.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less_or_equal/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..47aefbb
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less_or_equal/1.wgsl.expected.hlsl
@@ -0,0 +1,24 @@
+static float4 color_out = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float gl_FragDepth = 0.0f;
+
+void main_1() {
+  color_out = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  gl_FragDepth = 0.699999988f;
+  return;
+}
+
+struct main_out {
+  float4 color_out_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol {
+  float4 color_out_1 : SV_Target0;
+  float gl_FragDepth_1 : SV_Depth;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {color_out, gl_FragDepth};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.color_out_1, tint_symbol_1.gl_FragDepth_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less_or_equal/1.wgsl.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less_or_equal/1.wgsl.expected.msl
new file mode 100644
index 0000000..842cf9d
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less_or_equal/1.wgsl.expected.msl
@@ -0,0 +1,27 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 color_out_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol_1 {
+  float4 color_out_1 [[color(0)]];
+  float gl_FragDepth_1 [[depth(any)]];
+};
+
+void main_1(thread float4* const tint_symbol_4, thread float* const tint_symbol_5) {
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  *(tint_symbol_5) = 0.699999988f;
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_6 = 0.0f;
+  thread float tint_symbol_7 = 0.0f;
+  main_1(&(tint_symbol_6), &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.color_out_1=tint_symbol_6, .gl_FragDepth_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_3 = {.color_out_1=tint_symbol_2.color_out_1, .gl_FragDepth_1=tint_symbol_2.gl_FragDepth_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less_or_equal/1.wgsl.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less_or_equal/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..2f52f93
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less_or_equal/1.wgsl.expected.spvasm
@@ -0,0 +1,69 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 35
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1 %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpExecutionMode %main DepthReplacing
+               OpName %color_out "color_out"
+               OpName %gl_FragDepth "gl_FragDepth"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "color_out_1"
+               OpMemberName %main_out 1 "gl_FragDepth_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %tint_symbol_2 BuiltIn FragDepth
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+  %color_out = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Private_float = OpTypePointer Private %float
+          %8 = OpConstantNull %float
+%gl_FragDepth = OpVariable %_ptr_Private_float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Output_float = OpTypePointer Output %float
+%tint_symbol_2 = OpVariable %_ptr_Output_float Output %8
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %19 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+%float_0_699999988 = OpConstant %float 0.699999988
+   %main_out = OpTypeStruct %v4float %float
+         %21 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %13
+         %16 = OpLabel
+               OpStore %color_out %19
+               OpStore %gl_FragDepth %float_0_699999988
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %21
+%tint_symbol = OpFunctionParameter %main_out
+         %25 = OpLabel
+         %26 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %26
+         %27 = OpCompositeExtract %float %tint_symbol 1
+               OpStore %tint_symbol_2 %27
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %13
+         %29 = OpLabel
+         %30 = OpFunctionCall %void %main_1
+         %32 = OpLoad %v4float %color_out
+         %33 = OpLoad %float %gl_FragDepth
+         %34 = OpCompositeConstruct %main_out %32 %33
+         %31 = OpFunctionCall %void %tint_symbol_3 %34
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less_or_equal/1.wgsl.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less_or_equal/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..8bf833a
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_less_or_equal/1.wgsl.expected.wgsl
@@ -0,0 +1,22 @@
+var<private> color_out : vec4<f32>;
+
+var<private> gl_FragDepth : f32;
+
+fn main_1() {
+  color_out = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  gl_FragDepth = 0.699999988;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  color_out_1 : vec4<f32>;
+  [[builtin(frag_depth)]]
+  gl_FragDepth_1 : f32;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(color_out, gl_FragDepth);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/0-opt.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/0-opt.spvasm
new file mode 100644
index 0000000..0d5987d
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/0-opt.spvasm
@@ -0,0 +1,46 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %_ %position
+               OpSource GLSL 430
+               OpName %main "main"
+               OpName %gl_PerVertex "gl_PerVertex"
+               OpMemberName %gl_PerVertex 0 "gl_Position"
+               OpMemberName %gl_PerVertex 1 "gl_PointSize"
+               OpMemberName %gl_PerVertex 2 "gl_ClipDistance"
+               OpName %_ ""
+               OpName %position "position"
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+               OpDecorate %position Location 0
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+   %position = OpVariable %_ptr_Input_v4float Input
+    %v2float = OpTypeVector %float 2
+%float_0_300000012 = OpConstant %float 0.300000012
+    %float_1 = OpConstant %float 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+       %main = OpFunction %void None %7
+         %21 = OpLabel
+         %22 = OpLoad %v4float %position
+         %23 = OpVectorShuffle %v2float %22 %22 0 1
+         %24 = OpCompositeExtract %float %23 0
+         %25 = OpCompositeExtract %float %23 1
+         %26 = OpCompositeConstruct %v4float %24 %25 %float_0_300000012 %float_1
+         %27 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+               OpStore %27 %26
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..c0bd655
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,28 @@
+static float4 position = 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() {
+  const float4 x_22 = position;
+  const float2 x_23 = float2(x_22.x, x_22.y);
+  gl_Position = float4(x_23.x, x_23.y, 0.300000012f, 1.0f);
+  return;
+}
+
+struct main_out {
+  float4 gl_Position;
+};
+struct tint_symbol_1 {
+  float4 position_param : TEXCOORD0;
+};
+struct tint_symbol_2 {
+  float4 gl_Position : SV_Position;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 position_param = tint_symbol.position_param;
+  position = position_param;
+  main_1();
+  const main_out tint_symbol_3 = {gl_Position};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.gl_Position};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/0-opt.spvasm.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..771a789
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/0-opt.spvasm.expected.msl
@@ -0,0 +1,31 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 gl_Position;
+};
+struct tint_symbol_2 {
+  float4 position_param [[attribute(0)]];
+};
+struct tint_symbol_3 {
+  float4 gl_Position [[position]];
+};
+
+void main_1(thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  float4 const x_22 = *(tint_symbol_6);
+  float2 const x_23 = float2(x_22.x, x_22.y);
+  *(tint_symbol_7) = float4(x_23.x, x_23.y, 0.300000012f, 1.0f);
+  return;
+}
+
+vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  float4 const position_param = tint_symbol_1.position_param;
+  tint_symbol_8 = position_param;
+  main_1(&(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_4 = {.gl_Position=tint_symbol_9};
+  tint_symbol_3 const tint_symbol_5 = {.gl_Position=tint_symbol_4.gl_Position};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..18e2bca
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,73 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 41
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %tint_pointsize %tint_symbol %tint_symbol_2
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %position "position"
+               OpName %gl_Position "gl_Position"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "gl_Position"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_2 BuiltIn Position
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+   %position = OpVariable %_ptr_Private_v4float Private %8
+%gl_Position = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%float_0_300000012 = OpConstant %float 0.300000012
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+         %28 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+         %18 = OpLoad %v4float %position
+         %20 = OpCompositeExtract %float %18 0
+         %21 = OpCompositeExtract %float %18 1
+         %22 = OpCompositeConstruct %v2float %20 %21
+         %23 = OpCompositeExtract %float %22 0
+         %24 = OpCompositeExtract %float %22 1
+         %27 = OpCompositeConstruct %v4float %23 %24 %float_0_300000012 %float_1
+               OpStore %gl_Position %27
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %28
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %32 = OpLabel
+         %33 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %33
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %35 = OpLabel
+               OpStore %tint_pointsize %float_1
+         %36 = OpLoad %v4float %tint_symbol
+               OpStore %position %36
+         %37 = OpFunctionCall %void %main_1
+         %39 = OpLoad %v4float %gl_Position
+         %40 = OpCompositeConstruct %main_out %39
+         %38 = OpFunctionCall %void %tint_symbol_3 %40
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..1cc00dd
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,22 @@
+var<private> position : vec4<f32>;
+
+var<private> gl_Position : vec4<f32>;
+
+fn main_1() {
+  let x_22 : vec4<f32> = position;
+  let x_23 : vec2<f32> = vec2<f32>(x_22.x, x_22.y);
+  gl_Position = vec4<f32>(x_23.x, x_23.y, 0.300000012, 1.0);
+  return;
+}
+
+struct main_out {
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] position_param : vec4<f32>) -> main_out {
+  position = position_param;
+  main_1();
+  return main_out(gl_Position);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/0-opt.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/0-opt.wgsl
new file mode 100644
index 0000000..1cc00dd
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/0-opt.wgsl
@@ -0,0 +1,22 @@
+var<private> position : vec4<f32>;
+
+var<private> gl_Position : vec4<f32>;
+
+fn main_1() {
+  let x_22 : vec4<f32> = position;
+  let x_23 : vec2<f32> = vec2<f32>(x_22.x, x_22.y);
+  gl_Position = vec4<f32>(x_23.x, x_23.y, 0.300000012, 1.0);
+  return;
+}
+
+struct main_out {
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] position_param : vec4<f32>) -> main_out {
+  position = position_param;
+  main_1();
+  return main_out(gl_Position);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..c0bd655
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,28 @@
+static float4 position = 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() {
+  const float4 x_22 = position;
+  const float2 x_23 = float2(x_22.x, x_22.y);
+  gl_Position = float4(x_23.x, x_23.y, 0.300000012f, 1.0f);
+  return;
+}
+
+struct main_out {
+  float4 gl_Position;
+};
+struct tint_symbol_1 {
+  float4 position_param : TEXCOORD0;
+};
+struct tint_symbol_2 {
+  float4 gl_Position : SV_Position;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 position_param = tint_symbol.position_param;
+  position = position_param;
+  main_1();
+  const main_out tint_symbol_3 = {gl_Position};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.gl_Position};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/0-opt.wgsl.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..771a789
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/0-opt.wgsl.expected.msl
@@ -0,0 +1,31 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 gl_Position;
+};
+struct tint_symbol_2 {
+  float4 position_param [[attribute(0)]];
+};
+struct tint_symbol_3 {
+  float4 gl_Position [[position]];
+};
+
+void main_1(thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  float4 const x_22 = *(tint_symbol_6);
+  float2 const x_23 = float2(x_22.x, x_22.y);
+  *(tint_symbol_7) = float4(x_23.x, x_23.y, 0.300000012f, 1.0f);
+  return;
+}
+
+vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  float4 const position_param = tint_symbol_1.position_param;
+  tint_symbol_8 = position_param;
+  main_1(&(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_4 = {.gl_Position=tint_symbol_9};
+  tint_symbol_3 const tint_symbol_5 = {.gl_Position=tint_symbol_4.gl_Position};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..18e2bca
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,73 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 41
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %tint_pointsize %tint_symbol %tint_symbol_2
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %position "position"
+               OpName %gl_Position "gl_Position"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "gl_Position"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_2 BuiltIn Position
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+   %position = OpVariable %_ptr_Private_v4float Private %8
+%gl_Position = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%float_0_300000012 = OpConstant %float 0.300000012
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+         %28 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+         %18 = OpLoad %v4float %position
+         %20 = OpCompositeExtract %float %18 0
+         %21 = OpCompositeExtract %float %18 1
+         %22 = OpCompositeConstruct %v2float %20 %21
+         %23 = OpCompositeExtract %float %22 0
+         %24 = OpCompositeExtract %float %22 1
+         %27 = OpCompositeConstruct %v4float %23 %24 %float_0_300000012 %float_1
+               OpStore %gl_Position %27
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %28
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %32 = OpLabel
+         %33 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %33
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %35 = OpLabel
+               OpStore %tint_pointsize %float_1
+         %36 = OpLoad %v4float %tint_symbol
+               OpStore %position %36
+         %37 = OpFunctionCall %void %main_1
+         %39 = OpLoad %v4float %gl_Position
+         %40 = OpCompositeConstruct %main_out %39
+         %38 = OpFunctionCall %void %tint_symbol_3 %40
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..1cc00dd
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,22 @@
+var<private> position : vec4<f32>;
+
+var<private> gl_Position : vec4<f32>;
+
+fn main_1() {
+  let x_22 : vec4<f32> = position;
+  let x_23 : vec2<f32> = vec2<f32>(x_22.x, x_22.y);
+  gl_Position = vec4<f32>(x_23.x, x_23.y, 0.300000012, 1.0);
+  return;
+}
+
+struct main_out {
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] position_param : vec4<f32>) -> main_out {
+  position = position_param;
+  main_1();
+  return main_out(gl_Position);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/1.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/1.spvasm
new file mode 100644
index 0000000..2667aee
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/1.spvasm
@@ -0,0 +1,31 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %color_out %gl_FragDepth
+               OpExecutionMode %main OriginUpperLeft
+               OpExecutionMode %main EarlyFragmentTests
+               OpExecutionMode %main DepthReplacing
+               OpSource GLSL 430
+               OpName %main "main"
+               OpName %color_out "color_out"
+               OpName %gl_FragDepth "gl_FragDepth"
+               OpDecorate %color_out Location 0
+               OpDecorate %gl_FragDepth BuiltIn FragDepth
+       %void = OpTypeVoid
+          %6 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+  %color_out = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %12 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+%_ptr_Output_float = OpTypePointer Output %float
+%gl_FragDepth = OpVariable %_ptr_Output_float Output
+  %float_0_5 = OpConstant %float 0.5
+       %main = OpFunction %void None %6
+         %15 = OpLabel
+               OpStore %color_out %12
+               OpStore %gl_FragDepth %float_0_5
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/1.spvasm.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..4343195
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/1.spvasm.expected.hlsl
@@ -0,0 +1,24 @@
+static float4 color_out = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float gl_FragDepth = 0.0f;
+
+void main_1() {
+  color_out = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  gl_FragDepth = 0.5f;
+  return;
+}
+
+struct main_out {
+  float4 color_out_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol {
+  float4 color_out_1 : SV_Target0;
+  float gl_FragDepth_1 : SV_Depth;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {color_out, gl_FragDepth};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.color_out_1, tint_symbol_1.gl_FragDepth_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/1.spvasm.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/1.spvasm.expected.msl
new file mode 100644
index 0000000..ed4b69c
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/1.spvasm.expected.msl
@@ -0,0 +1,27 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 color_out_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol_1 {
+  float4 color_out_1 [[color(0)]];
+  float gl_FragDepth_1 [[depth(any)]];
+};
+
+void main_1(thread float4* const tint_symbol_4, thread float* const tint_symbol_5) {
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  *(tint_symbol_5) = 0.5f;
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_6 = 0.0f;
+  thread float tint_symbol_7 = 0.0f;
+  main_1(&(tint_symbol_6), &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.color_out_1=tint_symbol_6, .gl_FragDepth_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_3 = {.color_out_1=tint_symbol_2.color_out_1, .gl_FragDepth_1=tint_symbol_2.gl_FragDepth_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/1.spvasm.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..a305e7a
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/1.spvasm.expected.spvasm
@@ -0,0 +1,69 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 35
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1 %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpExecutionMode %main DepthReplacing
+               OpName %color_out "color_out"
+               OpName %gl_FragDepth "gl_FragDepth"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "color_out_1"
+               OpMemberName %main_out 1 "gl_FragDepth_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %tint_symbol_2 BuiltIn FragDepth
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+  %color_out = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Private_float = OpTypePointer Private %float
+          %8 = OpConstantNull %float
+%gl_FragDepth = OpVariable %_ptr_Private_float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Output_float = OpTypePointer Output %float
+%tint_symbol_2 = OpVariable %_ptr_Output_float Output %8
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %19 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+  %float_0_5 = OpConstant %float 0.5
+   %main_out = OpTypeStruct %v4float %float
+         %21 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %13
+         %16 = OpLabel
+               OpStore %color_out %19
+               OpStore %gl_FragDepth %float_0_5
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %21
+%tint_symbol = OpFunctionParameter %main_out
+         %25 = OpLabel
+         %26 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %26
+         %27 = OpCompositeExtract %float %tint_symbol 1
+               OpStore %tint_symbol_2 %27
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %13
+         %29 = OpLabel
+         %30 = OpFunctionCall %void %main_1
+         %32 = OpLoad %v4float %color_out
+         %33 = OpLoad %float %gl_FragDepth
+         %34 = OpCompositeConstruct %main_out %32 %33
+         %31 = OpFunctionCall %void %tint_symbol_3 %34
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/1.spvasm.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..5051169
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/1.spvasm.expected.wgsl
@@ -0,0 +1,22 @@
+var<private> color_out : vec4<f32>;
+
+var<private> gl_FragDepth : f32;
+
+fn main_1() {
+  color_out = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  gl_FragDepth = 0.5;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  color_out_1 : vec4<f32>;
+  [[builtin(frag_depth)]]
+  gl_FragDepth_1 : f32;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(color_out, gl_FragDepth);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/1.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/1.wgsl
new file mode 100644
index 0000000..5051169
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/1.wgsl
@@ -0,0 +1,22 @@
+var<private> color_out : vec4<f32>;
+
+var<private> gl_FragDepth : f32;
+
+fn main_1() {
+  color_out = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  gl_FragDepth = 0.5;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  color_out_1 : vec4<f32>;
+  [[builtin(frag_depth)]]
+  gl_FragDepth_1 : f32;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(color_out, gl_FragDepth);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/1.wgsl.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..4343195
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/1.wgsl.expected.hlsl
@@ -0,0 +1,24 @@
+static float4 color_out = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float gl_FragDepth = 0.0f;
+
+void main_1() {
+  color_out = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  gl_FragDepth = 0.5f;
+  return;
+}
+
+struct main_out {
+  float4 color_out_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol {
+  float4 color_out_1 : SV_Target0;
+  float gl_FragDepth_1 : SV_Depth;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {color_out, gl_FragDepth};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.color_out_1, tint_symbol_1.gl_FragDepth_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/1.wgsl.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/1.wgsl.expected.msl
new file mode 100644
index 0000000..ed4b69c
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/1.wgsl.expected.msl
@@ -0,0 +1,27 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 color_out_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol_1 {
+  float4 color_out_1 [[color(0)]];
+  float gl_FragDepth_1 [[depth(any)]];
+};
+
+void main_1(thread float4* const tint_symbol_4, thread float* const tint_symbol_5) {
+  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
+  *(tint_symbol_5) = 0.5f;
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_6 = 0.0f;
+  thread float tint_symbol_7 = 0.0f;
+  main_1(&(tint_symbol_6), &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.color_out_1=tint_symbol_6, .gl_FragDepth_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_3 = {.color_out_1=tint_symbol_2.color_out_1, .gl_FragDepth_1=tint_symbol_2.gl_FragDepth_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/1.wgsl.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..a305e7a
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/1.wgsl.expected.spvasm
@@ -0,0 +1,69 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 35
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1 %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpExecutionMode %main DepthReplacing
+               OpName %color_out "color_out"
+               OpName %gl_FragDepth "gl_FragDepth"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "color_out_1"
+               OpMemberName %main_out 1 "gl_FragDepth_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %tint_symbol_2 BuiltIn FragDepth
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+  %color_out = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Private_float = OpTypePointer Private %float
+          %8 = OpConstantNull %float
+%gl_FragDepth = OpVariable %_ptr_Private_float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Output_float = OpTypePointer Output %float
+%tint_symbol_2 = OpVariable %_ptr_Output_float Output %8
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+    %float_1 = OpConstant %float 1
+    %float_0 = OpConstant %float 0
+         %19 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
+  %float_0_5 = OpConstant %float 0.5
+   %main_out = OpTypeStruct %v4float %float
+         %21 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %13
+         %16 = OpLabel
+               OpStore %color_out %19
+               OpStore %gl_FragDepth %float_0_5
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %21
+%tint_symbol = OpFunctionParameter %main_out
+         %25 = OpLabel
+         %26 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %26
+         %27 = OpCompositeExtract %float %tint_symbol 1
+               OpStore %tint_symbol_2 %27
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %13
+         %29 = OpLabel
+         %30 = OpFunctionCall %void %main_1
+         %32 = OpLoad %v4float %color_out
+         %33 = OpLoad %float %gl_FragDepth
+         %34 = OpCompositeConstruct %main_out %32 %33
+         %31 = OpFunctionCall %void %tint_symbol_3 %34
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/1.wgsl.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..5051169
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/early_fragment/depth_not_equal/1.wgsl.expected.wgsl
@@ -0,0 +1,22 @@
+var<private> color_out : vec4<f32>;
+
+var<private> gl_FragDepth : f32;
+
+fn main_1() {
+  color_out = vec4<f32>(1.0, 0.0, 0.0, 1.0);
+  gl_FragDepth = 0.5;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  color_out_1 : vec4<f32>;
+  [[builtin(frag_depth)]]
+  gl_FragDepth_1 : f32;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(color_out, gl_FragDepth);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_1/0-opt.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_1/0-opt.spvasm
new file mode 100644
index 0000000..872cc9f
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_1/0-opt.spvasm
@@ -0,0 +1,46 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %_ %position
+               OpSource GLSL 430
+               OpName %main "main"
+               OpName %gl_PerVertex "gl_PerVertex"
+               OpMemberName %gl_PerVertex 0 "gl_Position"
+               OpMemberName %gl_PerVertex 1 "gl_PointSize"
+               OpMemberName %gl_PerVertex 2 "gl_ClipDistance"
+               OpName %_ ""
+               OpName %position "position"
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+               OpDecorate %position Location 0
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+   %position = OpVariable %_ptr_Input_v4float Input
+    %v2float = OpTypeVector %float 2
+%float_0_699999988 = OpConstant %float 0.699999988
+    %float_1 = OpConstant %float 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+       %main = OpFunction %void None %7
+         %21 = OpLabel
+         %22 = OpLoad %v4float %position
+         %23 = OpVectorShuffle %v2float %22 %22 0 1
+         %24 = OpCompositeExtract %float %23 0
+         %25 = OpCompositeExtract %float %23 1
+         %26 = OpCompositeConstruct %v4float %24 %25 %float_0_699999988 %float_1
+         %27 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+               OpStore %27 %26
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_1/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_1/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..bf017e3
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_1/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,28 @@
+static float4 position = 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() {
+  const float4 x_22 = position;
+  const float2 x_23 = float2(x_22.x, x_22.y);
+  gl_Position = float4(x_23.x, x_23.y, 0.699999988f, 1.0f);
+  return;
+}
+
+struct main_out {
+  float4 gl_Position;
+};
+struct tint_symbol_1 {
+  float4 position_param : TEXCOORD0;
+};
+struct tint_symbol_2 {
+  float4 gl_Position : SV_Position;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 position_param = tint_symbol.position_param;
+  position = position_param;
+  main_1();
+  const main_out tint_symbol_3 = {gl_Position};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.gl_Position};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_1/0-opt.spvasm.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_1/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..0c5e876
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_1/0-opt.spvasm.expected.msl
@@ -0,0 +1,31 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 gl_Position;
+};
+struct tint_symbol_2 {
+  float4 position_param [[attribute(0)]];
+};
+struct tint_symbol_3 {
+  float4 gl_Position [[position]];
+};
+
+void main_1(thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  float4 const x_22 = *(tint_symbol_6);
+  float2 const x_23 = float2(x_22.x, x_22.y);
+  *(tint_symbol_7) = float4(x_23.x, x_23.y, 0.699999988f, 1.0f);
+  return;
+}
+
+vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  float4 const position_param = tint_symbol_1.position_param;
+  tint_symbol_8 = position_param;
+  main_1(&(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_4 = {.gl_Position=tint_symbol_9};
+  tint_symbol_3 const tint_symbol_5 = {.gl_Position=tint_symbol_4.gl_Position};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_1/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_1/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..cf0602b
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_1/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,73 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 41
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %tint_pointsize %tint_symbol %tint_symbol_2
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %position "position"
+               OpName %gl_Position "gl_Position"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "gl_Position"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_2 BuiltIn Position
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+   %position = OpVariable %_ptr_Private_v4float Private %8
+%gl_Position = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%float_0_699999988 = OpConstant %float 0.699999988
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+         %28 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+         %18 = OpLoad %v4float %position
+         %20 = OpCompositeExtract %float %18 0
+         %21 = OpCompositeExtract %float %18 1
+         %22 = OpCompositeConstruct %v2float %20 %21
+         %23 = OpCompositeExtract %float %22 0
+         %24 = OpCompositeExtract %float %22 1
+         %27 = OpCompositeConstruct %v4float %23 %24 %float_0_699999988 %float_1
+               OpStore %gl_Position %27
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %28
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %32 = OpLabel
+         %33 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %33
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %35 = OpLabel
+               OpStore %tint_pointsize %float_1
+         %36 = OpLoad %v4float %tint_symbol
+               OpStore %position %36
+         %37 = OpFunctionCall %void %main_1
+         %39 = OpLoad %v4float %gl_Position
+         %40 = OpCompositeConstruct %main_out %39
+         %38 = OpFunctionCall %void %tint_symbol_3 %40
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_1/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_1/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..788ee5b
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_1/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,22 @@
+var<private> position : vec4<f32>;
+
+var<private> gl_Position : vec4<f32>;
+
+fn main_1() {
+  let x_22 : vec4<f32> = position;
+  let x_23 : vec2<f32> = vec2<f32>(x_22.x, x_22.y);
+  gl_Position = vec4<f32>(x_23.x, x_23.y, 0.699999988, 1.0);
+  return;
+}
+
+struct main_out {
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] position_param : vec4<f32>) -> main_out {
+  position = position_param;
+  main_1();
+  return main_out(gl_Position);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_1/0-opt.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_1/0-opt.wgsl
new file mode 100644
index 0000000..788ee5b
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_1/0-opt.wgsl
@@ -0,0 +1,22 @@
+var<private> position : vec4<f32>;
+
+var<private> gl_Position : vec4<f32>;
+
+fn main_1() {
+  let x_22 : vec4<f32> = position;
+  let x_23 : vec2<f32> = vec2<f32>(x_22.x, x_22.y);
+  gl_Position = vec4<f32>(x_23.x, x_23.y, 0.699999988, 1.0);
+  return;
+}
+
+struct main_out {
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] position_param : vec4<f32>) -> main_out {
+  position = position_param;
+  main_1();
+  return main_out(gl_Position);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_1/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_1/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..bf017e3
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_1/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,28 @@
+static float4 position = 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() {
+  const float4 x_22 = position;
+  const float2 x_23 = float2(x_22.x, x_22.y);
+  gl_Position = float4(x_23.x, x_23.y, 0.699999988f, 1.0f);
+  return;
+}
+
+struct main_out {
+  float4 gl_Position;
+};
+struct tint_symbol_1 {
+  float4 position_param : TEXCOORD0;
+};
+struct tint_symbol_2 {
+  float4 gl_Position : SV_Position;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 position_param = tint_symbol.position_param;
+  position = position_param;
+  main_1();
+  const main_out tint_symbol_3 = {gl_Position};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.gl_Position};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_1/0-opt.wgsl.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_1/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..0c5e876
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_1/0-opt.wgsl.expected.msl
@@ -0,0 +1,31 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 gl_Position;
+};
+struct tint_symbol_2 {
+  float4 position_param [[attribute(0)]];
+};
+struct tint_symbol_3 {
+  float4 gl_Position [[position]];
+};
+
+void main_1(thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  float4 const x_22 = *(tint_symbol_6);
+  float2 const x_23 = float2(x_22.x, x_22.y);
+  *(tint_symbol_7) = float4(x_23.x, x_23.y, 0.699999988f, 1.0f);
+  return;
+}
+
+vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  float4 const position_param = tint_symbol_1.position_param;
+  tint_symbol_8 = position_param;
+  main_1(&(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_4 = {.gl_Position=tint_symbol_9};
+  tint_symbol_3 const tint_symbol_5 = {.gl_Position=tint_symbol_4.gl_Position};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_1/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_1/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..cf0602b
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_1/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,73 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 41
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %tint_pointsize %tint_symbol %tint_symbol_2
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %position "position"
+               OpName %gl_Position "gl_Position"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "gl_Position"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_2 BuiltIn Position
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+   %position = OpVariable %_ptr_Private_v4float Private %8
+%gl_Position = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%float_0_699999988 = OpConstant %float 0.699999988
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+         %28 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+         %18 = OpLoad %v4float %position
+         %20 = OpCompositeExtract %float %18 0
+         %21 = OpCompositeExtract %float %18 1
+         %22 = OpCompositeConstruct %v2float %20 %21
+         %23 = OpCompositeExtract %float %22 0
+         %24 = OpCompositeExtract %float %22 1
+         %27 = OpCompositeConstruct %v4float %23 %24 %float_0_699999988 %float_1
+               OpStore %gl_Position %27
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %28
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %32 = OpLabel
+         %33 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %33
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %35 = OpLabel
+               OpStore %tint_pointsize %float_1
+         %36 = OpLoad %v4float %tint_symbol
+               OpStore %position %36
+         %37 = OpFunctionCall %void %main_1
+         %39 = OpLoad %v4float %gl_Position
+         %40 = OpCompositeConstruct %main_out %39
+         %38 = OpFunctionCall %void %tint_symbol_3 %40
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_1/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_1/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..788ee5b
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_1/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,22 @@
+var<private> position : vec4<f32>;
+
+var<private> gl_Position : vec4<f32>;
+
+fn main_1() {
+  let x_22 : vec4<f32> = position;
+  let x_23 : vec2<f32> = vec2<f32>(x_22.x, x_22.y);
+  gl_Position = vec4<f32>(x_23.x, x_23.y, 0.699999988, 1.0);
+  return;
+}
+
+struct main_out {
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] position_param : vec4<f32>) -> main_out {
+  position = position_param;
+  main_1();
+  return main_out(gl_Position);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/0-opt.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/0-opt.spvasm
new file mode 100644
index 0000000..3d18840
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/0-opt.spvasm
@@ -0,0 +1,46 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %_ %position
+               OpSource GLSL 430
+               OpName %main "main"
+               OpName %gl_PerVertex "gl_PerVertex"
+               OpMemberName %gl_PerVertex 0 "gl_Position"
+               OpMemberName %gl_PerVertex 1 "gl_PointSize"
+               OpMemberName %gl_PerVertex 2 "gl_ClipDistance"
+               OpName %_ ""
+               OpName %position "position"
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+               OpDecorate %position Location 0
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+   %position = OpVariable %_ptr_Input_v4float Input
+    %v2float = OpTypeVector %float 2
+%float_0_200000003 = OpConstant %float 0.200000003
+    %float_1 = OpConstant %float 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+       %main = OpFunction %void None %7
+         %21 = OpLabel
+         %22 = OpLoad %v4float %position
+         %23 = OpVectorShuffle %v2float %22 %22 0 1
+         %24 = OpCompositeExtract %float %23 0
+         %25 = OpCompositeExtract %float %23 1
+         %26 = OpCompositeConstruct %v4float %24 %25 %float_0_200000003 %float_1
+         %27 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+               OpStore %27 %26
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..0ae9555
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,28 @@
+static float4 position = 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() {
+  const float4 x_22 = position;
+  const float2 x_23 = float2(x_22.x, x_22.y);
+  gl_Position = float4(x_23.x, x_23.y, 0.200000003f, 1.0f);
+  return;
+}
+
+struct main_out {
+  float4 gl_Position;
+};
+struct tint_symbol_1 {
+  float4 position_param : TEXCOORD0;
+};
+struct tint_symbol_2 {
+  float4 gl_Position : SV_Position;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 position_param = tint_symbol.position_param;
+  position = position_param;
+  main_1();
+  const main_out tint_symbol_3 = {gl_Position};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.gl_Position};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/0-opt.spvasm.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..94ed6c1
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/0-opt.spvasm.expected.msl
@@ -0,0 +1,31 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 gl_Position;
+};
+struct tint_symbol_2 {
+  float4 position_param [[attribute(0)]];
+};
+struct tint_symbol_3 {
+  float4 gl_Position [[position]];
+};
+
+void main_1(thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  float4 const x_22 = *(tint_symbol_6);
+  float2 const x_23 = float2(x_22.x, x_22.y);
+  *(tint_symbol_7) = float4(x_23.x, x_23.y, 0.200000003f, 1.0f);
+  return;
+}
+
+vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  float4 const position_param = tint_symbol_1.position_param;
+  tint_symbol_8 = position_param;
+  main_1(&(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_4 = {.gl_Position=tint_symbol_9};
+  tint_symbol_3 const tint_symbol_5 = {.gl_Position=tint_symbol_4.gl_Position};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..240e679
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,73 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 41
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %tint_pointsize %tint_symbol %tint_symbol_2
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %position "position"
+               OpName %gl_Position "gl_Position"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "gl_Position"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_2 BuiltIn Position
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+   %position = OpVariable %_ptr_Private_v4float Private %8
+%gl_Position = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%float_0_200000003 = OpConstant %float 0.200000003
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+         %28 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+         %18 = OpLoad %v4float %position
+         %20 = OpCompositeExtract %float %18 0
+         %21 = OpCompositeExtract %float %18 1
+         %22 = OpCompositeConstruct %v2float %20 %21
+         %23 = OpCompositeExtract %float %22 0
+         %24 = OpCompositeExtract %float %22 1
+         %27 = OpCompositeConstruct %v4float %23 %24 %float_0_200000003 %float_1
+               OpStore %gl_Position %27
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %28
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %32 = OpLabel
+         %33 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %33
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %35 = OpLabel
+               OpStore %tint_pointsize %float_1
+         %36 = OpLoad %v4float %tint_symbol
+               OpStore %position %36
+         %37 = OpFunctionCall %void %main_1
+         %39 = OpLoad %v4float %gl_Position
+         %40 = OpCompositeConstruct %main_out %39
+         %38 = OpFunctionCall %void %tint_symbol_3 %40
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..f71b320
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,22 @@
+var<private> position : vec4<f32>;
+
+var<private> gl_Position : vec4<f32>;
+
+fn main_1() {
+  let x_22 : vec4<f32> = position;
+  let x_23 : vec2<f32> = vec2<f32>(x_22.x, x_22.y);
+  gl_Position = vec4<f32>(x_23.x, x_23.y, 0.200000003, 1.0);
+  return;
+}
+
+struct main_out {
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] position_param : vec4<f32>) -> main_out {
+  position = position_param;
+  main_1();
+  return main_out(gl_Position);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/0-opt.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/0-opt.wgsl
new file mode 100644
index 0000000..f71b320
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/0-opt.wgsl
@@ -0,0 +1,22 @@
+var<private> position : vec4<f32>;
+
+var<private> gl_Position : vec4<f32>;
+
+fn main_1() {
+  let x_22 : vec4<f32> = position;
+  let x_23 : vec2<f32> = vec2<f32>(x_22.x, x_22.y);
+  gl_Position = vec4<f32>(x_23.x, x_23.y, 0.200000003, 1.0);
+  return;
+}
+
+struct main_out {
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] position_param : vec4<f32>) -> main_out {
+  position = position_param;
+  main_1();
+  return main_out(gl_Position);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..0ae9555
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,28 @@
+static float4 position = 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() {
+  const float4 x_22 = position;
+  const float2 x_23 = float2(x_22.x, x_22.y);
+  gl_Position = float4(x_23.x, x_23.y, 0.200000003f, 1.0f);
+  return;
+}
+
+struct main_out {
+  float4 gl_Position;
+};
+struct tint_symbol_1 {
+  float4 position_param : TEXCOORD0;
+};
+struct tint_symbol_2 {
+  float4 gl_Position : SV_Position;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 position_param = tint_symbol.position_param;
+  position = position_param;
+  main_1();
+  const main_out tint_symbol_3 = {gl_Position};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.gl_Position};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/0-opt.wgsl.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..94ed6c1
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/0-opt.wgsl.expected.msl
@@ -0,0 +1,31 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 gl_Position;
+};
+struct tint_symbol_2 {
+  float4 position_param [[attribute(0)]];
+};
+struct tint_symbol_3 {
+  float4 gl_Position [[position]];
+};
+
+void main_1(thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  float4 const x_22 = *(tint_symbol_6);
+  float2 const x_23 = float2(x_22.x, x_22.y);
+  *(tint_symbol_7) = float4(x_23.x, x_23.y, 0.200000003f, 1.0f);
+  return;
+}
+
+vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  float4 const position_param = tint_symbol_1.position_param;
+  tint_symbol_8 = position_param;
+  main_1(&(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_4 = {.gl_Position=tint_symbol_9};
+  tint_symbol_3 const tint_symbol_5 = {.gl_Position=tint_symbol_4.gl_Position};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..240e679
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,73 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 41
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %tint_pointsize %tint_symbol %tint_symbol_2
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %position "position"
+               OpName %gl_Position "gl_Position"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "gl_Position"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_2 BuiltIn Position
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+   %position = OpVariable %_ptr_Private_v4float Private %8
+%gl_Position = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%float_0_200000003 = OpConstant %float 0.200000003
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+         %28 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+         %18 = OpLoad %v4float %position
+         %20 = OpCompositeExtract %float %18 0
+         %21 = OpCompositeExtract %float %18 1
+         %22 = OpCompositeConstruct %v2float %20 %21
+         %23 = OpCompositeExtract %float %22 0
+         %24 = OpCompositeExtract %float %22 1
+         %27 = OpCompositeConstruct %v4float %23 %24 %float_0_200000003 %float_1
+               OpStore %gl_Position %27
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %28
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %32 = OpLabel
+         %33 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %33
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %35 = OpLabel
+               OpStore %tint_pointsize %float_1
+         %36 = OpLoad %v4float %tint_symbol
+               OpStore %position %36
+         %37 = OpFunctionCall %void %main_1
+         %39 = OpLoad %v4float %gl_Position
+         %40 = OpCompositeConstruct %main_out %39
+         %38 = OpFunctionCall %void %tint_symbol_3 %40
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..f71b320
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,22 @@
+var<private> position : vec4<f32>;
+
+var<private> gl_Position : vec4<f32>;
+
+fn main_1() {
+  let x_22 : vec4<f32> = position;
+  let x_23 : vec2<f32> = vec2<f32>(x_22.x, x_22.y);
+  gl_Position = vec4<f32>(x_23.x, x_23.y, 0.200000003, 1.0);
+  return;
+}
+
+struct main_out {
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] position_param : vec4<f32>) -> main_out {
+  position = position_param;
+  main_1();
+  return main_out(gl_Position);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/1.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/1.spvasm
new file mode 100644
index 0000000..ff79f72
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/1.spvasm
@@ -0,0 +1,30 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %outColor %gl_FragDepth
+               OpExecutionMode %main OriginUpperLeft
+               OpExecutionMode %main DepthReplacing
+               OpExecutionMode %main DepthGreater
+               OpSource GLSL 430
+               OpName %main "main"
+               OpName %outColor "outColor"
+               OpName %gl_FragDepth "gl_FragDepth"
+               OpDecorate %outColor Location 0
+               OpDecorate %gl_FragDepth BuiltIn FragDepth
+       %void = OpTypeVoid
+          %6 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+   %outColor = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %11 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+%_ptr_Output_float = OpTypePointer Output %float
+%gl_FragDepth = OpVariable %_ptr_Output_float Output
+%float_0_300000012 = OpConstant %float 0.300000012
+       %main = OpFunction %void None %6
+         %14 = OpLabel
+               OpStore %outColor %11
+               OpStore %gl_FragDepth %float_0_300000012
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/1.spvasm.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..5cb1813
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/1.spvasm.expected.hlsl
@@ -0,0 +1,24 @@
+static float4 outColor = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float gl_FragDepth = 0.0f;
+
+void main_1() {
+  outColor = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  gl_FragDepth = 0.300000012f;
+  return;
+}
+
+struct main_out {
+  float4 outColor_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol {
+  float4 outColor_1 : SV_Target0;
+  float gl_FragDepth_1 : SV_Depth;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {outColor, gl_FragDepth};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.outColor_1, tint_symbol_1.gl_FragDepth_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/1.spvasm.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/1.spvasm.expected.msl
new file mode 100644
index 0000000..620803a
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/1.spvasm.expected.msl
@@ -0,0 +1,27 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 outColor_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol_1 {
+  float4 outColor_1 [[color(0)]];
+  float gl_FragDepth_1 [[depth(any)]];
+};
+
+void main_1(thread float4* const tint_symbol_4, thread float* const tint_symbol_5) {
+  *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  *(tint_symbol_5) = 0.300000012f;
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_6 = 0.0f;
+  thread float tint_symbol_7 = 0.0f;
+  main_1(&(tint_symbol_6), &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.outColor_1=tint_symbol_6, .gl_FragDepth_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_3 = {.outColor_1=tint_symbol_2.outColor_1, .gl_FragDepth_1=tint_symbol_2.gl_FragDepth_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/1.spvasm.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..bb4715a
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/1.spvasm.expected.spvasm
@@ -0,0 +1,68 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 34
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1 %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpExecutionMode %main DepthReplacing
+               OpName %outColor "outColor"
+               OpName %gl_FragDepth "gl_FragDepth"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "outColor_1"
+               OpMemberName %main_out 1 "gl_FragDepth_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %tint_symbol_2 BuiltIn FragDepth
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+   %outColor = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Private_float = OpTypePointer Private %float
+          %8 = OpConstantNull %float
+%gl_FragDepth = OpVariable %_ptr_Private_float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Output_float = OpTypePointer Output %float
+%tint_symbol_2 = OpVariable %_ptr_Output_float Output %8
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+    %float_0 = OpConstant %float 0
+         %18 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+%float_0_300000012 = OpConstant %float 0.300000012
+   %main_out = OpTypeStruct %v4float %float
+         %20 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %13
+         %16 = OpLabel
+               OpStore %outColor %18
+               OpStore %gl_FragDepth %float_0_300000012
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %20
+%tint_symbol = OpFunctionParameter %main_out
+         %24 = OpLabel
+         %25 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %25
+         %26 = OpCompositeExtract %float %tint_symbol 1
+               OpStore %tint_symbol_2 %26
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %13
+         %28 = OpLabel
+         %29 = OpFunctionCall %void %main_1
+         %31 = OpLoad %v4float %outColor
+         %32 = OpLoad %float %gl_FragDepth
+         %33 = OpCompositeConstruct %main_out %31 %32
+         %30 = OpFunctionCall %void %tint_symbol_3 %33
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/1.spvasm.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..b6e0701
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/1.spvasm.expected.wgsl
@@ -0,0 +1,22 @@
+var<private> outColor : vec4<f32>;
+
+var<private> gl_FragDepth : f32;
+
+fn main_1() {
+  outColor = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  gl_FragDepth = 0.300000012;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  outColor_1 : vec4<f32>;
+  [[builtin(frag_depth)]]
+  gl_FragDepth_1 : f32;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(outColor, gl_FragDepth);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/1.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/1.wgsl
new file mode 100644
index 0000000..b6e0701
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/1.wgsl
@@ -0,0 +1,22 @@
+var<private> outColor : vec4<f32>;
+
+var<private> gl_FragDepth : f32;
+
+fn main_1() {
+  outColor = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  gl_FragDepth = 0.300000012;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  outColor_1 : vec4<f32>;
+  [[builtin(frag_depth)]]
+  gl_FragDepth_1 : f32;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(outColor, gl_FragDepth);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/1.wgsl.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..5cb1813
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/1.wgsl.expected.hlsl
@@ -0,0 +1,24 @@
+static float4 outColor = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float gl_FragDepth = 0.0f;
+
+void main_1() {
+  outColor = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  gl_FragDepth = 0.300000012f;
+  return;
+}
+
+struct main_out {
+  float4 outColor_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol {
+  float4 outColor_1 : SV_Target0;
+  float gl_FragDepth_1 : SV_Depth;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {outColor, gl_FragDepth};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.outColor_1, tint_symbol_1.gl_FragDepth_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/1.wgsl.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/1.wgsl.expected.msl
new file mode 100644
index 0000000..620803a
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/1.wgsl.expected.msl
@@ -0,0 +1,27 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 outColor_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol_1 {
+  float4 outColor_1 [[color(0)]];
+  float gl_FragDepth_1 [[depth(any)]];
+};
+
+void main_1(thread float4* const tint_symbol_4, thread float* const tint_symbol_5) {
+  *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  *(tint_symbol_5) = 0.300000012f;
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_6 = 0.0f;
+  thread float tint_symbol_7 = 0.0f;
+  main_1(&(tint_symbol_6), &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.outColor_1=tint_symbol_6, .gl_FragDepth_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_3 = {.outColor_1=tint_symbol_2.outColor_1, .gl_FragDepth_1=tint_symbol_2.gl_FragDepth_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/1.wgsl.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..bb4715a
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/1.wgsl.expected.spvasm
@@ -0,0 +1,68 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 34
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1 %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpExecutionMode %main DepthReplacing
+               OpName %outColor "outColor"
+               OpName %gl_FragDepth "gl_FragDepth"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "outColor_1"
+               OpMemberName %main_out 1 "gl_FragDepth_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %tint_symbol_2 BuiltIn FragDepth
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+   %outColor = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Private_float = OpTypePointer Private %float
+          %8 = OpConstantNull %float
+%gl_FragDepth = OpVariable %_ptr_Private_float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Output_float = OpTypePointer Output %float
+%tint_symbol_2 = OpVariable %_ptr_Output_float Output %8
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+    %float_0 = OpConstant %float 0
+         %18 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+%float_0_300000012 = OpConstant %float 0.300000012
+   %main_out = OpTypeStruct %v4float %float
+         %20 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %13
+         %16 = OpLabel
+               OpStore %outColor %18
+               OpStore %gl_FragDepth %float_0_300000012
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %20
+%tint_symbol = OpFunctionParameter %main_out
+         %24 = OpLabel
+         %25 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %25
+         %26 = OpCompositeExtract %float %tint_symbol 1
+               OpStore %tint_symbol_2 %26
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %13
+         %28 = OpLabel
+         %29 = OpFunctionCall %void %main_1
+         %31 = OpLoad %v4float %outColor
+         %32 = OpLoad %float %gl_FragDepth
+         %33 = OpCompositeConstruct %main_out %31 %32
+         %30 = OpFunctionCall %void %tint_symbol_3 %33
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/1.wgsl.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..b6e0701
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthgreater_2/1.wgsl.expected.wgsl
@@ -0,0 +1,22 @@
+var<private> outColor : vec4<f32>;
+
+var<private> gl_FragDepth : f32;
+
+fn main_1() {
+  outColor = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  gl_FragDepth = 0.300000012;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  outColor_1 : vec4<f32>;
+  [[builtin(frag_depth)]]
+  gl_FragDepth_1 : f32;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(outColor, gl_FragDepth);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_0/1.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_0/1.spvasm
new file mode 100644
index 0000000..e503380
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_0/1.spvasm
@@ -0,0 +1,30 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %outColor %gl_FragDepth
+               OpExecutionMode %main OriginUpperLeft
+               OpExecutionMode %main DepthReplacing
+               OpExecutionMode %main DepthLess
+               OpSource GLSL 430
+               OpName %main "main"
+               OpName %outColor "outColor"
+               OpName %gl_FragDepth "gl_FragDepth"
+               OpDecorate %outColor Location 0
+               OpDecorate %gl_FragDepth BuiltIn FragDepth
+       %void = OpTypeVoid
+          %6 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+   %outColor = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %11 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+%_ptr_Output_float = OpTypePointer Output %float
+%gl_FragDepth = OpVariable %_ptr_Output_float Output
+%float_0_100000001 = OpConstant %float 0.100000001
+       %main = OpFunction %void None %6
+         %14 = OpLabel
+               OpStore %outColor %11
+               OpStore %gl_FragDepth %float_0_100000001
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_0/1.spvasm.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_0/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..195740d
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_0/1.spvasm.expected.hlsl
@@ -0,0 +1,24 @@
+static float4 outColor = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float gl_FragDepth = 0.0f;
+
+void main_1() {
+  outColor = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  gl_FragDepth = 0.100000001f;
+  return;
+}
+
+struct main_out {
+  float4 outColor_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol {
+  float4 outColor_1 : SV_Target0;
+  float gl_FragDepth_1 : SV_Depth;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {outColor, gl_FragDepth};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.outColor_1, tint_symbol_1.gl_FragDepth_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_0/1.spvasm.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_0/1.spvasm.expected.msl
new file mode 100644
index 0000000..1f7be87
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_0/1.spvasm.expected.msl
@@ -0,0 +1,27 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 outColor_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol_1 {
+  float4 outColor_1 [[color(0)]];
+  float gl_FragDepth_1 [[depth(any)]];
+};
+
+void main_1(thread float4* const tint_symbol_4, thread float* const tint_symbol_5) {
+  *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  *(tint_symbol_5) = 0.100000001f;
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_6 = 0.0f;
+  thread float tint_symbol_7 = 0.0f;
+  main_1(&(tint_symbol_6), &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.outColor_1=tint_symbol_6, .gl_FragDepth_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_3 = {.outColor_1=tint_symbol_2.outColor_1, .gl_FragDepth_1=tint_symbol_2.gl_FragDepth_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_0/1.spvasm.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_0/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..d7a733d
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_0/1.spvasm.expected.spvasm
@@ -0,0 +1,68 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 34
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1 %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpExecutionMode %main DepthReplacing
+               OpName %outColor "outColor"
+               OpName %gl_FragDepth "gl_FragDepth"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "outColor_1"
+               OpMemberName %main_out 1 "gl_FragDepth_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %tint_symbol_2 BuiltIn FragDepth
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+   %outColor = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Private_float = OpTypePointer Private %float
+          %8 = OpConstantNull %float
+%gl_FragDepth = OpVariable %_ptr_Private_float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Output_float = OpTypePointer Output %float
+%tint_symbol_2 = OpVariable %_ptr_Output_float Output %8
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+    %float_0 = OpConstant %float 0
+         %18 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+%float_0_100000001 = OpConstant %float 0.100000001
+   %main_out = OpTypeStruct %v4float %float
+         %20 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %13
+         %16 = OpLabel
+               OpStore %outColor %18
+               OpStore %gl_FragDepth %float_0_100000001
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %20
+%tint_symbol = OpFunctionParameter %main_out
+         %24 = OpLabel
+         %25 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %25
+         %26 = OpCompositeExtract %float %tint_symbol 1
+               OpStore %tint_symbol_2 %26
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %13
+         %28 = OpLabel
+         %29 = OpFunctionCall %void %main_1
+         %31 = OpLoad %v4float %outColor
+         %32 = OpLoad %float %gl_FragDepth
+         %33 = OpCompositeConstruct %main_out %31 %32
+         %30 = OpFunctionCall %void %tint_symbol_3 %33
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_0/1.spvasm.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_0/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..9f726a7
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_0/1.spvasm.expected.wgsl
@@ -0,0 +1,22 @@
+var<private> outColor : vec4<f32>;
+
+var<private> gl_FragDepth : f32;
+
+fn main_1() {
+  outColor = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  gl_FragDepth = 0.100000001;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  outColor_1 : vec4<f32>;
+  [[builtin(frag_depth)]]
+  gl_FragDepth_1 : f32;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(outColor, gl_FragDepth);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_0/1.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_0/1.wgsl
new file mode 100644
index 0000000..9f726a7
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_0/1.wgsl
@@ -0,0 +1,22 @@
+var<private> outColor : vec4<f32>;
+
+var<private> gl_FragDepth : f32;
+
+fn main_1() {
+  outColor = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  gl_FragDepth = 0.100000001;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  outColor_1 : vec4<f32>;
+  [[builtin(frag_depth)]]
+  gl_FragDepth_1 : f32;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(outColor, gl_FragDepth);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_0/1.wgsl.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_0/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..195740d
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_0/1.wgsl.expected.hlsl
@@ -0,0 +1,24 @@
+static float4 outColor = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float gl_FragDepth = 0.0f;
+
+void main_1() {
+  outColor = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  gl_FragDepth = 0.100000001f;
+  return;
+}
+
+struct main_out {
+  float4 outColor_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol {
+  float4 outColor_1 : SV_Target0;
+  float gl_FragDepth_1 : SV_Depth;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {outColor, gl_FragDepth};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.outColor_1, tint_symbol_1.gl_FragDepth_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_0/1.wgsl.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_0/1.wgsl.expected.msl
new file mode 100644
index 0000000..1f7be87
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_0/1.wgsl.expected.msl
@@ -0,0 +1,27 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 outColor_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol_1 {
+  float4 outColor_1 [[color(0)]];
+  float gl_FragDepth_1 [[depth(any)]];
+};
+
+void main_1(thread float4* const tint_symbol_4, thread float* const tint_symbol_5) {
+  *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  *(tint_symbol_5) = 0.100000001f;
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_6 = 0.0f;
+  thread float tint_symbol_7 = 0.0f;
+  main_1(&(tint_symbol_6), &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.outColor_1=tint_symbol_6, .gl_FragDepth_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_3 = {.outColor_1=tint_symbol_2.outColor_1, .gl_FragDepth_1=tint_symbol_2.gl_FragDepth_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_0/1.wgsl.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_0/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..d7a733d
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_0/1.wgsl.expected.spvasm
@@ -0,0 +1,68 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 34
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1 %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpExecutionMode %main DepthReplacing
+               OpName %outColor "outColor"
+               OpName %gl_FragDepth "gl_FragDepth"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "outColor_1"
+               OpMemberName %main_out 1 "gl_FragDepth_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %tint_symbol_2 BuiltIn FragDepth
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+   %outColor = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Private_float = OpTypePointer Private %float
+          %8 = OpConstantNull %float
+%gl_FragDepth = OpVariable %_ptr_Private_float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Output_float = OpTypePointer Output %float
+%tint_symbol_2 = OpVariable %_ptr_Output_float Output %8
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+    %float_0 = OpConstant %float 0
+         %18 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+%float_0_100000001 = OpConstant %float 0.100000001
+   %main_out = OpTypeStruct %v4float %float
+         %20 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %13
+         %16 = OpLabel
+               OpStore %outColor %18
+               OpStore %gl_FragDepth %float_0_100000001
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %20
+%tint_symbol = OpFunctionParameter %main_out
+         %24 = OpLabel
+         %25 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %25
+         %26 = OpCompositeExtract %float %tint_symbol 1
+               OpStore %tint_symbol_2 %26
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %13
+         %28 = OpLabel
+         %29 = OpFunctionCall %void %main_1
+         %31 = OpLoad %v4float %outColor
+         %32 = OpLoad %float %gl_FragDepth
+         %33 = OpCompositeConstruct %main_out %31 %32
+         %30 = OpFunctionCall %void %tint_symbol_3 %33
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_0/1.wgsl.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_0/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..9f726a7
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_0/1.wgsl.expected.wgsl
@@ -0,0 +1,22 @@
+var<private> outColor : vec4<f32>;
+
+var<private> gl_FragDepth : f32;
+
+fn main_1() {
+  outColor = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  gl_FragDepth = 0.100000001;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  outColor_1 : vec4<f32>;
+  [[builtin(frag_depth)]]
+  gl_FragDepth_1 : f32;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(outColor, gl_FragDepth);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_2/1.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_2/1.spvasm
new file mode 100644
index 0000000..29ea362
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_2/1.spvasm
@@ -0,0 +1,30 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %outColor %gl_FragDepth
+               OpExecutionMode %main OriginUpperLeft
+               OpExecutionMode %main DepthReplacing
+               OpExecutionMode %main DepthLess
+               OpSource GLSL 430
+               OpName %main "main"
+               OpName %outColor "outColor"
+               OpName %gl_FragDepth "gl_FragDepth"
+               OpDecorate %outColor Location 0
+               OpDecorate %gl_FragDepth BuiltIn FragDepth
+       %void = OpTypeVoid
+          %6 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+   %outColor = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %11 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+%_ptr_Output_float = OpTypePointer Output %float
+%gl_FragDepth = OpVariable %_ptr_Output_float Output
+%float_0_600000024 = OpConstant %float 0.600000024
+       %main = OpFunction %void None %6
+         %14 = OpLabel
+               OpStore %outColor %11
+               OpStore %gl_FragDepth %float_0_600000024
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_2/1.spvasm.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_2/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..d098fd2
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_2/1.spvasm.expected.hlsl
@@ -0,0 +1,24 @@
+static float4 outColor = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float gl_FragDepth = 0.0f;
+
+void main_1() {
+  outColor = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  gl_FragDepth = 0.600000024f;
+  return;
+}
+
+struct main_out {
+  float4 outColor_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol {
+  float4 outColor_1 : SV_Target0;
+  float gl_FragDepth_1 : SV_Depth;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {outColor, gl_FragDepth};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.outColor_1, tint_symbol_1.gl_FragDepth_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_2/1.spvasm.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_2/1.spvasm.expected.msl
new file mode 100644
index 0000000..ea4a1fc
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_2/1.spvasm.expected.msl
@@ -0,0 +1,27 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 outColor_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol_1 {
+  float4 outColor_1 [[color(0)]];
+  float gl_FragDepth_1 [[depth(any)]];
+};
+
+void main_1(thread float4* const tint_symbol_4, thread float* const tint_symbol_5) {
+  *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  *(tint_symbol_5) = 0.600000024f;
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_6 = 0.0f;
+  thread float tint_symbol_7 = 0.0f;
+  main_1(&(tint_symbol_6), &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.outColor_1=tint_symbol_6, .gl_FragDepth_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_3 = {.outColor_1=tint_symbol_2.outColor_1, .gl_FragDepth_1=tint_symbol_2.gl_FragDepth_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_2/1.spvasm.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_2/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..927ca49
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_2/1.spvasm.expected.spvasm
@@ -0,0 +1,68 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 34
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1 %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpExecutionMode %main DepthReplacing
+               OpName %outColor "outColor"
+               OpName %gl_FragDepth "gl_FragDepth"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "outColor_1"
+               OpMemberName %main_out 1 "gl_FragDepth_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %tint_symbol_2 BuiltIn FragDepth
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+   %outColor = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Private_float = OpTypePointer Private %float
+          %8 = OpConstantNull %float
+%gl_FragDepth = OpVariable %_ptr_Private_float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Output_float = OpTypePointer Output %float
+%tint_symbol_2 = OpVariable %_ptr_Output_float Output %8
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+    %float_0 = OpConstant %float 0
+         %18 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+%float_0_600000024 = OpConstant %float 0.600000024
+   %main_out = OpTypeStruct %v4float %float
+         %20 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %13
+         %16 = OpLabel
+               OpStore %outColor %18
+               OpStore %gl_FragDepth %float_0_600000024
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %20
+%tint_symbol = OpFunctionParameter %main_out
+         %24 = OpLabel
+         %25 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %25
+         %26 = OpCompositeExtract %float %tint_symbol 1
+               OpStore %tint_symbol_2 %26
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %13
+         %28 = OpLabel
+         %29 = OpFunctionCall %void %main_1
+         %31 = OpLoad %v4float %outColor
+         %32 = OpLoad %float %gl_FragDepth
+         %33 = OpCompositeConstruct %main_out %31 %32
+         %30 = OpFunctionCall %void %tint_symbol_3 %33
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_2/1.spvasm.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_2/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..bc535ca
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_2/1.spvasm.expected.wgsl
@@ -0,0 +1,22 @@
+var<private> outColor : vec4<f32>;
+
+var<private> gl_FragDepth : f32;
+
+fn main_1() {
+  outColor = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  gl_FragDepth = 0.600000024;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  outColor_1 : vec4<f32>;
+  [[builtin(frag_depth)]]
+  gl_FragDepth_1 : f32;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(outColor, gl_FragDepth);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_2/1.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_2/1.wgsl
new file mode 100644
index 0000000..bc535ca
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_2/1.wgsl
@@ -0,0 +1,22 @@
+var<private> outColor : vec4<f32>;
+
+var<private> gl_FragDepth : f32;
+
+fn main_1() {
+  outColor = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  gl_FragDepth = 0.600000024;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  outColor_1 : vec4<f32>;
+  [[builtin(frag_depth)]]
+  gl_FragDepth_1 : f32;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(outColor, gl_FragDepth);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_2/1.wgsl.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_2/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..d098fd2
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_2/1.wgsl.expected.hlsl
@@ -0,0 +1,24 @@
+static float4 outColor = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float gl_FragDepth = 0.0f;
+
+void main_1() {
+  outColor = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  gl_FragDepth = 0.600000024f;
+  return;
+}
+
+struct main_out {
+  float4 outColor_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol {
+  float4 outColor_1 : SV_Target0;
+  float gl_FragDepth_1 : SV_Depth;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {outColor, gl_FragDepth};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.outColor_1, tint_symbol_1.gl_FragDepth_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_2/1.wgsl.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_2/1.wgsl.expected.msl
new file mode 100644
index 0000000..ea4a1fc
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_2/1.wgsl.expected.msl
@@ -0,0 +1,27 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 outColor_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol_1 {
+  float4 outColor_1 [[color(0)]];
+  float gl_FragDepth_1 [[depth(any)]];
+};
+
+void main_1(thread float4* const tint_symbol_4, thread float* const tint_symbol_5) {
+  *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  *(tint_symbol_5) = 0.600000024f;
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_6 = 0.0f;
+  thread float tint_symbol_7 = 0.0f;
+  main_1(&(tint_symbol_6), &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.outColor_1=tint_symbol_6, .gl_FragDepth_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_3 = {.outColor_1=tint_symbol_2.outColor_1, .gl_FragDepth_1=tint_symbol_2.gl_FragDepth_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_2/1.wgsl.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_2/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..927ca49
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_2/1.wgsl.expected.spvasm
@@ -0,0 +1,68 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 34
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1 %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpExecutionMode %main DepthReplacing
+               OpName %outColor "outColor"
+               OpName %gl_FragDepth "gl_FragDepth"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "outColor_1"
+               OpMemberName %main_out 1 "gl_FragDepth_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %tint_symbol_2 BuiltIn FragDepth
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+   %outColor = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Private_float = OpTypePointer Private %float
+          %8 = OpConstantNull %float
+%gl_FragDepth = OpVariable %_ptr_Private_float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Output_float = OpTypePointer Output %float
+%tint_symbol_2 = OpVariable %_ptr_Output_float Output %8
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+    %float_0 = OpConstant %float 0
+         %18 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+%float_0_600000024 = OpConstant %float 0.600000024
+   %main_out = OpTypeStruct %v4float %float
+         %20 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %13
+         %16 = OpLabel
+               OpStore %outColor %18
+               OpStore %gl_FragDepth %float_0_600000024
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %20
+%tint_symbol = OpFunctionParameter %main_out
+         %24 = OpLabel
+         %25 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %25
+         %26 = OpCompositeExtract %float %tint_symbol 1
+               OpStore %tint_symbol_2 %26
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %13
+         %28 = OpLabel
+         %29 = OpFunctionCall %void %main_1
+         %31 = OpLoad %v4float %outColor
+         %32 = OpLoad %float %gl_FragDepth
+         %33 = OpCompositeConstruct %main_out %31 %32
+         %30 = OpFunctionCall %void %tint_symbol_3 %33
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_2/1.wgsl.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_2/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..bc535ca
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthless_2/1.wgsl.expected.wgsl
@@ -0,0 +1,22 @@
+var<private> outColor : vec4<f32>;
+
+var<private> gl_FragDepth : f32;
+
+fn main_1() {
+  outColor = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  gl_FragDepth = 0.600000024;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  outColor_1 : vec4<f32>;
+  [[builtin(frag_depth)]]
+  gl_FragDepth_1 : f32;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(outColor, gl_FragDepth);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_0/1.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_0/1.spvasm
new file mode 100644
index 0000000..544b4ff
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_0/1.spvasm
@@ -0,0 +1,38 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %outColor %gl_FragDepth %gl_FragCoord
+               OpExecutionMode %main OriginUpperLeft
+               OpExecutionMode %main DepthReplacing
+               OpExecutionMode %main DepthUnchanged
+               OpSource GLSL 430
+               OpName %main "main"
+               OpName %outColor "outColor"
+               OpName %gl_FragDepth "gl_FragDepth"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpDecorate %outColor Location 0
+               OpDecorate %gl_FragDepth BuiltIn FragDepth
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+   %outColor = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %12 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+%_ptr_Output_float = OpTypePointer Output %float
+%gl_FragDepth = OpVariable %_ptr_Output_float Output
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+%_ptr_Input_float = OpTypePointer Input %float
+       %main = OpFunction %void None %7
+         %18 = OpLabel
+               OpStore %outColor %12
+         %19 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_2
+         %20 = OpLoad %float %19
+               OpStore %gl_FragDepth %20
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_0/1.spvasm.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_0/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..9aee57c
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_0/1.spvasm.expected.hlsl
@@ -0,0 +1,31 @@
+static float4 outColor = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float gl_FragDepth = 0.0f;
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  outColor = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  const float x_20 = gl_FragCoord.z;
+  gl_FragDepth = x_20;
+  return;
+}
+
+struct main_out {
+  float4 outColor_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol_1 {
+  float4 gl_FragCoord_param : SV_Position;
+};
+struct tint_symbol_2 {
+  float4 outColor_1 : SV_Target0;
+  float gl_FragDepth_1 : SV_Depth;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {outColor, gl_FragDepth};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.outColor_1, tint_symbol_3.gl_FragDepth_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_0/1.spvasm.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_0/1.spvasm.expected.msl
new file mode 100644
index 0000000..b08a200
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_0/1.spvasm.expected.msl
@@ -0,0 +1,30 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 outColor_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol_2 {
+  float4 outColor_1 [[color(0)]];
+  float gl_FragDepth_1 [[depth(any)]];
+};
+
+void main_1(thread float4* const tint_symbol_5, thread float4* const tint_symbol_6, thread float* const tint_symbol_7) {
+  *(tint_symbol_5) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float const x_20 = (*(tint_symbol_6)).z;
+  *(tint_symbol_7) = x_20;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  thread float tint_symbol_10 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(&(tint_symbol_9), &(tint_symbol_8), &(tint_symbol_10));
+  main_out const tint_symbol_3 = {.outColor_1=tint_symbol_9, .gl_FragDepth_1=tint_symbol_10};
+  tint_symbol_2 const tint_symbol_4 = {.outColor_1=tint_symbol_3.outColor_1, .gl_FragDepth_1=tint_symbol_3.gl_FragDepth_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_0/1.spvasm.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_0/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..ce10d20
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_0/1.spvasm.expected.spvasm
@@ -0,0 +1,79 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 41
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2 %tint_symbol_3
+               OpExecutionMode %main OriginUpperLeft
+               OpExecutionMode %main DepthReplacing
+               OpName %outColor "outColor"
+               OpName %gl_FragDepth "gl_FragDepth"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "outColor_1"
+               OpMemberName %main_out 1 "gl_FragDepth_1"
+               OpName %tint_symbol_4 "tint_symbol_4"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %tint_symbol_3 BuiltIn FragDepth
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+   %outColor = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Private_float = OpTypePointer Private %float
+          %8 = OpConstantNull %float
+%gl_FragDepth = OpVariable %_ptr_Private_float Private %8
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Output_float = OpTypePointer Output %float
+%tint_symbol_3 = OpVariable %_ptr_Output_float Output %8
+       %void = OpTypeVoid
+         %16 = OpTypeFunction %void
+    %float_0 = OpConstant %float 0
+         %21 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+   %main_out = OpTypeStruct %v4float %float
+         %26 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %16
+         %19 = OpLabel
+               OpStore %outColor %21
+         %24 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_2
+         %25 = OpLoad %float %24
+               OpStore %gl_FragDepth %25
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_4 = OpFunction %void None %26
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %30 = OpLabel
+         %31 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %31
+         %32 = OpCompositeExtract %float %tint_symbol_1 1
+               OpStore %tint_symbol_3 %32
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %16
+         %34 = OpLabel
+         %35 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %35
+         %36 = OpFunctionCall %void %main_1
+         %38 = OpLoad %v4float %outColor
+         %39 = OpLoad %float %gl_FragDepth
+         %40 = OpCompositeConstruct %main_out %38 %39
+         %37 = OpFunctionCall %void %tint_symbol_4 %40
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_0/1.spvasm.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_0/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..0fe24e6
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_0/1.spvasm.expected.wgsl
@@ -0,0 +1,26 @@
+var<private> outColor : vec4<f32>;
+
+var<private> gl_FragDepth : f32;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  outColor = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  let x_20 : f32 = gl_FragCoord.z;
+  gl_FragDepth = x_20;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  outColor_1 : vec4<f32>;
+  [[builtin(frag_depth)]]
+  gl_FragDepth_1 : f32;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(outColor, gl_FragDepth);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_0/1.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_0/1.wgsl
new file mode 100644
index 0000000..0fe24e6
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_0/1.wgsl
@@ -0,0 +1,26 @@
+var<private> outColor : vec4<f32>;
+
+var<private> gl_FragDepth : f32;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  outColor = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  let x_20 : f32 = gl_FragCoord.z;
+  gl_FragDepth = x_20;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  outColor_1 : vec4<f32>;
+  [[builtin(frag_depth)]]
+  gl_FragDepth_1 : f32;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(outColor, gl_FragDepth);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_0/1.wgsl.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_0/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..9aee57c
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_0/1.wgsl.expected.hlsl
@@ -0,0 +1,31 @@
+static float4 outColor = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float gl_FragDepth = 0.0f;
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  outColor = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  const float x_20 = gl_FragCoord.z;
+  gl_FragDepth = x_20;
+  return;
+}
+
+struct main_out {
+  float4 outColor_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol_1 {
+  float4 gl_FragCoord_param : SV_Position;
+};
+struct tint_symbol_2 {
+  float4 outColor_1 : SV_Target0;
+  float gl_FragDepth_1 : SV_Depth;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {outColor, gl_FragDepth};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.outColor_1, tint_symbol_3.gl_FragDepth_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_0/1.wgsl.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_0/1.wgsl.expected.msl
new file mode 100644
index 0000000..b08a200
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_0/1.wgsl.expected.msl
@@ -0,0 +1,30 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 outColor_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol_2 {
+  float4 outColor_1 [[color(0)]];
+  float gl_FragDepth_1 [[depth(any)]];
+};
+
+void main_1(thread float4* const tint_symbol_5, thread float4* const tint_symbol_6, thread float* const tint_symbol_7) {
+  *(tint_symbol_5) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  float const x_20 = (*(tint_symbol_6)).z;
+  *(tint_symbol_7) = x_20;
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  thread float tint_symbol_10 = 0.0f;
+  tint_symbol_8 = gl_FragCoord_param;
+  main_1(&(tint_symbol_9), &(tint_symbol_8), &(tint_symbol_10));
+  main_out const tint_symbol_3 = {.outColor_1=tint_symbol_9, .gl_FragDepth_1=tint_symbol_10};
+  tint_symbol_2 const tint_symbol_4 = {.outColor_1=tint_symbol_3.outColor_1, .gl_FragDepth_1=tint_symbol_3.gl_FragDepth_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_0/1.wgsl.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_0/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..ce10d20
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_0/1.wgsl.expected.spvasm
@@ -0,0 +1,79 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 41
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2 %tint_symbol_3
+               OpExecutionMode %main OriginUpperLeft
+               OpExecutionMode %main DepthReplacing
+               OpName %outColor "outColor"
+               OpName %gl_FragDepth "gl_FragDepth"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "outColor_1"
+               OpMemberName %main_out 1 "gl_FragDepth_1"
+               OpName %tint_symbol_4 "tint_symbol_4"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpDecorate %tint_symbol_3 BuiltIn FragDepth
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+   %outColor = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Private_float = OpTypePointer Private %float
+          %8 = OpConstantNull %float
+%gl_FragDepth = OpVariable %_ptr_Private_float Private %8
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Output_float = OpTypePointer Output %float
+%tint_symbol_3 = OpVariable %_ptr_Output_float Output %8
+       %void = OpTypeVoid
+         %16 = OpTypeFunction %void
+    %float_0 = OpConstant %float 0
+         %21 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+       %uint = OpTypeInt 32 0
+     %uint_2 = OpConstant %uint 2
+   %main_out = OpTypeStruct %v4float %float
+         %26 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %16
+         %19 = OpLabel
+               OpStore %outColor %21
+         %24 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_2
+         %25 = OpLoad %float %24
+               OpStore %gl_FragDepth %25
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_4 = OpFunction %void None %26
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %30 = OpLabel
+         %31 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %31
+         %32 = OpCompositeExtract %float %tint_symbol_1 1
+               OpStore %tint_symbol_3 %32
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %16
+         %34 = OpLabel
+         %35 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %35
+         %36 = OpFunctionCall %void %main_1
+         %38 = OpLoad %v4float %outColor
+         %39 = OpLoad %float %gl_FragDepth
+         %40 = OpCompositeConstruct %main_out %38 %39
+         %37 = OpFunctionCall %void %tint_symbol_4 %40
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_0/1.wgsl.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_0/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..0fe24e6
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_0/1.wgsl.expected.wgsl
@@ -0,0 +1,26 @@
+var<private> outColor : vec4<f32>;
+
+var<private> gl_FragDepth : f32;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  outColor = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  let x_20 : f32 = gl_FragCoord.z;
+  gl_FragDepth = x_20;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  outColor_1 : vec4<f32>;
+  [[builtin(frag_depth)]]
+  gl_FragDepth_1 : f32;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(outColor, gl_FragDepth);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_2/1.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_2/1.spvasm
new file mode 100644
index 0000000..65f7b45
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_2/1.spvasm
@@ -0,0 +1,30 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %outColor %gl_FragDepth
+               OpExecutionMode %main OriginUpperLeft
+               OpExecutionMode %main DepthReplacing
+               OpExecutionMode %main DepthUnchanged
+               OpSource GLSL 430
+               OpName %main "main"
+               OpName %outColor "outColor"
+               OpName %gl_FragDepth "gl_FragDepth"
+               OpDecorate %outColor Location 0
+               OpDecorate %gl_FragDepth BuiltIn FragDepth
+       %void = OpTypeVoid
+          %6 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+   %outColor = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %11 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+%_ptr_Output_float = OpTypePointer Output %float
+%gl_FragDepth = OpVariable %_ptr_Output_float Output
+%float_0_699999988 = OpConstant %float 0.699999988
+       %main = OpFunction %void None %6
+         %14 = OpLabel
+               OpStore %outColor %11
+               OpStore %gl_FragDepth %float_0_699999988
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_2/1.spvasm.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_2/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..2776dc2
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_2/1.spvasm.expected.hlsl
@@ -0,0 +1,24 @@
+static float4 outColor = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float gl_FragDepth = 0.0f;
+
+void main_1() {
+  outColor = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  gl_FragDepth = 0.699999988f;
+  return;
+}
+
+struct main_out {
+  float4 outColor_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol {
+  float4 outColor_1 : SV_Target0;
+  float gl_FragDepth_1 : SV_Depth;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {outColor, gl_FragDepth};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.outColor_1, tint_symbol_1.gl_FragDepth_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_2/1.spvasm.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_2/1.spvasm.expected.msl
new file mode 100644
index 0000000..a3796dc
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_2/1.spvasm.expected.msl
@@ -0,0 +1,27 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 outColor_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol_1 {
+  float4 outColor_1 [[color(0)]];
+  float gl_FragDepth_1 [[depth(any)]];
+};
+
+void main_1(thread float4* const tint_symbol_4, thread float* const tint_symbol_5) {
+  *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  *(tint_symbol_5) = 0.699999988f;
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_6 = 0.0f;
+  thread float tint_symbol_7 = 0.0f;
+  main_1(&(tint_symbol_6), &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.outColor_1=tint_symbol_6, .gl_FragDepth_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_3 = {.outColor_1=tint_symbol_2.outColor_1, .gl_FragDepth_1=tint_symbol_2.gl_FragDepth_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_2/1.spvasm.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_2/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..9df6dab
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_2/1.spvasm.expected.spvasm
@@ -0,0 +1,68 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 34
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1 %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpExecutionMode %main DepthReplacing
+               OpName %outColor "outColor"
+               OpName %gl_FragDepth "gl_FragDepth"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "outColor_1"
+               OpMemberName %main_out 1 "gl_FragDepth_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %tint_symbol_2 BuiltIn FragDepth
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+   %outColor = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Private_float = OpTypePointer Private %float
+          %8 = OpConstantNull %float
+%gl_FragDepth = OpVariable %_ptr_Private_float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Output_float = OpTypePointer Output %float
+%tint_symbol_2 = OpVariable %_ptr_Output_float Output %8
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+    %float_0 = OpConstant %float 0
+         %18 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+%float_0_699999988 = OpConstant %float 0.699999988
+   %main_out = OpTypeStruct %v4float %float
+         %20 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %13
+         %16 = OpLabel
+               OpStore %outColor %18
+               OpStore %gl_FragDepth %float_0_699999988
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %20
+%tint_symbol = OpFunctionParameter %main_out
+         %24 = OpLabel
+         %25 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %25
+         %26 = OpCompositeExtract %float %tint_symbol 1
+               OpStore %tint_symbol_2 %26
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %13
+         %28 = OpLabel
+         %29 = OpFunctionCall %void %main_1
+         %31 = OpLoad %v4float %outColor
+         %32 = OpLoad %float %gl_FragDepth
+         %33 = OpCompositeConstruct %main_out %31 %32
+         %30 = OpFunctionCall %void %tint_symbol_3 %33
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_2/1.spvasm.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_2/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..04a6db7
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_2/1.spvasm.expected.wgsl
@@ -0,0 +1,22 @@
+var<private> outColor : vec4<f32>;
+
+var<private> gl_FragDepth : f32;
+
+fn main_1() {
+  outColor = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  gl_FragDepth = 0.699999988;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  outColor_1 : vec4<f32>;
+  [[builtin(frag_depth)]]
+  gl_FragDepth_1 : f32;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(outColor, gl_FragDepth);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_2/1.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_2/1.wgsl
new file mode 100644
index 0000000..04a6db7
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_2/1.wgsl
@@ -0,0 +1,22 @@
+var<private> outColor : vec4<f32>;
+
+var<private> gl_FragDepth : f32;
+
+fn main_1() {
+  outColor = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  gl_FragDepth = 0.699999988;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  outColor_1 : vec4<f32>;
+  [[builtin(frag_depth)]]
+  gl_FragDepth_1 : f32;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(outColor, gl_FragDepth);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_2/1.wgsl.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_2/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..2776dc2
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_2/1.wgsl.expected.hlsl
@@ -0,0 +1,24 @@
+static float4 outColor = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float gl_FragDepth = 0.0f;
+
+void main_1() {
+  outColor = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  gl_FragDepth = 0.699999988f;
+  return;
+}
+
+struct main_out {
+  float4 outColor_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol {
+  float4 outColor_1 : SV_Target0;
+  float gl_FragDepth_1 : SV_Depth;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {outColor, gl_FragDepth};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.outColor_1, tint_symbol_1.gl_FragDepth_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_2/1.wgsl.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_2/1.wgsl.expected.msl
new file mode 100644
index 0000000..a3796dc
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_2/1.wgsl.expected.msl
@@ -0,0 +1,27 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 outColor_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol_1 {
+  float4 outColor_1 [[color(0)]];
+  float gl_FragDepth_1 [[depth(any)]];
+};
+
+void main_1(thread float4* const tint_symbol_4, thread float* const tint_symbol_5) {
+  *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  *(tint_symbol_5) = 0.699999988f;
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_6 = 0.0f;
+  thread float tint_symbol_7 = 0.0f;
+  main_1(&(tint_symbol_6), &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.outColor_1=tint_symbol_6, .gl_FragDepth_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_3 = {.outColor_1=tint_symbol_2.outColor_1, .gl_FragDepth_1=tint_symbol_2.gl_FragDepth_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_2/1.wgsl.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_2/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..9df6dab
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_2/1.wgsl.expected.spvasm
@@ -0,0 +1,68 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 34
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1 %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpExecutionMode %main DepthReplacing
+               OpName %outColor "outColor"
+               OpName %gl_FragDepth "gl_FragDepth"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "outColor_1"
+               OpMemberName %main_out 1 "gl_FragDepth_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %tint_symbol_2 BuiltIn FragDepth
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+   %outColor = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Private_float = OpTypePointer Private %float
+          %8 = OpConstantNull %float
+%gl_FragDepth = OpVariable %_ptr_Private_float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Output_float = OpTypePointer Output %float
+%tint_symbol_2 = OpVariable %_ptr_Output_float Output %8
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+    %float_0 = OpConstant %float 0
+         %18 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+%float_0_699999988 = OpConstant %float 0.699999988
+   %main_out = OpTypeStruct %v4float %float
+         %20 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %13
+         %16 = OpLabel
+               OpStore %outColor %18
+               OpStore %gl_FragDepth %float_0_699999988
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %20
+%tint_symbol = OpFunctionParameter %main_out
+         %24 = OpLabel
+         %25 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %25
+         %26 = OpCompositeExtract %float %tint_symbol 1
+               OpStore %tint_symbol_2 %26
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %13
+         %28 = OpLabel
+         %29 = OpFunctionCall %void %main_1
+         %31 = OpLoad %v4float %outColor
+         %32 = OpLoad %float %gl_FragDepth
+         %33 = OpCompositeConstruct %main_out %31 %32
+         %30 = OpFunctionCall %void %tint_symbol_3 %33
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_2/1.wgsl.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_2/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..04a6db7
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_2/1.wgsl.expected.wgsl
@@ -0,0 +1,22 @@
+var<private> outColor : vec4<f32>;
+
+var<private> gl_FragDepth : f32;
+
+fn main_1() {
+  outColor = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  gl_FragDepth = 0.699999988;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  outColor_1 : vec4<f32>;
+  [[builtin(frag_depth)]]
+  gl_FragDepth_1 : f32;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(outColor, gl_FragDepth);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_3/1.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_3/1.spvasm
new file mode 100644
index 0000000..0842b2d
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_3/1.spvasm
@@ -0,0 +1,30 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %outColor %gl_FragDepth
+               OpExecutionMode %main OriginUpperLeft
+               OpExecutionMode %main DepthReplacing
+               OpExecutionMode %main DepthUnchanged
+               OpSource GLSL 430
+               OpName %main "main"
+               OpName %outColor "outColor"
+               OpName %gl_FragDepth "gl_FragDepth"
+               OpDecorate %outColor Location 0
+               OpDecorate %gl_FragDepth BuiltIn FragDepth
+       %void = OpTypeVoid
+          %6 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+   %outColor = OpVariable %_ptr_Output_v4float Output
+    %float_0 = OpConstant %float 0
+         %11 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+%_ptr_Output_float = OpTypePointer Output %float
+%gl_FragDepth = OpVariable %_ptr_Output_float Output
+%float_0_400000006 = OpConstant %float 0.400000006
+       %main = OpFunction %void None %6
+         %14 = OpLabel
+               OpStore %outColor %11
+               OpStore %gl_FragDepth %float_0_400000006
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_3/1.spvasm.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_3/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..7047d54
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_3/1.spvasm.expected.hlsl
@@ -0,0 +1,24 @@
+static float4 outColor = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float gl_FragDepth = 0.0f;
+
+void main_1() {
+  outColor = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  gl_FragDepth = 0.400000006f;
+  return;
+}
+
+struct main_out {
+  float4 outColor_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol {
+  float4 outColor_1 : SV_Target0;
+  float gl_FragDepth_1 : SV_Depth;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {outColor, gl_FragDepth};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.outColor_1, tint_symbol_1.gl_FragDepth_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_3/1.spvasm.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_3/1.spvasm.expected.msl
new file mode 100644
index 0000000..99a77a3
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_3/1.spvasm.expected.msl
@@ -0,0 +1,27 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 outColor_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol_1 {
+  float4 outColor_1 [[color(0)]];
+  float gl_FragDepth_1 [[depth(any)]];
+};
+
+void main_1(thread float4* const tint_symbol_4, thread float* const tint_symbol_5) {
+  *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  *(tint_symbol_5) = 0.400000006f;
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_6 = 0.0f;
+  thread float tint_symbol_7 = 0.0f;
+  main_1(&(tint_symbol_6), &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.outColor_1=tint_symbol_6, .gl_FragDepth_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_3 = {.outColor_1=tint_symbol_2.outColor_1, .gl_FragDepth_1=tint_symbol_2.gl_FragDepth_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_3/1.spvasm.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_3/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..abc3df8
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_3/1.spvasm.expected.spvasm
@@ -0,0 +1,68 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 34
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1 %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpExecutionMode %main DepthReplacing
+               OpName %outColor "outColor"
+               OpName %gl_FragDepth "gl_FragDepth"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "outColor_1"
+               OpMemberName %main_out 1 "gl_FragDepth_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %tint_symbol_2 BuiltIn FragDepth
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+   %outColor = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Private_float = OpTypePointer Private %float
+          %8 = OpConstantNull %float
+%gl_FragDepth = OpVariable %_ptr_Private_float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Output_float = OpTypePointer Output %float
+%tint_symbol_2 = OpVariable %_ptr_Output_float Output %8
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+    %float_0 = OpConstant %float 0
+         %18 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+%float_0_400000006 = OpConstant %float 0.400000006
+   %main_out = OpTypeStruct %v4float %float
+         %20 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %13
+         %16 = OpLabel
+               OpStore %outColor %18
+               OpStore %gl_FragDepth %float_0_400000006
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %20
+%tint_symbol = OpFunctionParameter %main_out
+         %24 = OpLabel
+         %25 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %25
+         %26 = OpCompositeExtract %float %tint_symbol 1
+               OpStore %tint_symbol_2 %26
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %13
+         %28 = OpLabel
+         %29 = OpFunctionCall %void %main_1
+         %31 = OpLoad %v4float %outColor
+         %32 = OpLoad %float %gl_FragDepth
+         %33 = OpCompositeConstruct %main_out %31 %32
+         %30 = OpFunctionCall %void %tint_symbol_3 %33
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_3/1.spvasm.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_3/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..f6cb3ea
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_3/1.spvasm.expected.wgsl
@@ -0,0 +1,22 @@
+var<private> outColor : vec4<f32>;
+
+var<private> gl_FragDepth : f32;
+
+fn main_1() {
+  outColor = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  gl_FragDepth = 0.400000006;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  outColor_1 : vec4<f32>;
+  [[builtin(frag_depth)]]
+  gl_FragDepth_1 : f32;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(outColor, gl_FragDepth);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_3/1.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_3/1.wgsl
new file mode 100644
index 0000000..f6cb3ea
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_3/1.wgsl
@@ -0,0 +1,22 @@
+var<private> outColor : vec4<f32>;
+
+var<private> gl_FragDepth : f32;
+
+fn main_1() {
+  outColor = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  gl_FragDepth = 0.400000006;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  outColor_1 : vec4<f32>;
+  [[builtin(frag_depth)]]
+  gl_FragDepth_1 : f32;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(outColor, gl_FragDepth);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_3/1.wgsl.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_3/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..7047d54
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_3/1.wgsl.expected.hlsl
@@ -0,0 +1,24 @@
+static float4 outColor = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float gl_FragDepth = 0.0f;
+
+void main_1() {
+  outColor = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  gl_FragDepth = 0.400000006f;
+  return;
+}
+
+struct main_out {
+  float4 outColor_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol {
+  float4 outColor_1 : SV_Target0;
+  float gl_FragDepth_1 : SV_Depth;
+};
+
+tint_symbol main() {
+  main_1();
+  const main_out tint_symbol_1 = {outColor, gl_FragDepth};
+  const tint_symbol tint_symbol_2 = {tint_symbol_1.outColor_1, tint_symbol_1.gl_FragDepth_1};
+  return tint_symbol_2;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_3/1.wgsl.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_3/1.wgsl.expected.msl
new file mode 100644
index 0000000..99a77a3
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_3/1.wgsl.expected.msl
@@ -0,0 +1,27 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 outColor_1;
+  float gl_FragDepth_1;
+};
+struct tint_symbol_1 {
+  float4 outColor_1 [[color(0)]];
+  float gl_FragDepth_1 [[depth(any)]];
+};
+
+void main_1(thread float4* const tint_symbol_4, thread float* const tint_symbol_5) {
+  *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
+  *(tint_symbol_5) = 0.400000006f;
+  return;
+}
+
+fragment tint_symbol_1 tint_symbol() {
+  thread float4 tint_symbol_6 = 0.0f;
+  thread float tint_symbol_7 = 0.0f;
+  main_1(&(tint_symbol_6), &(tint_symbol_7));
+  main_out const tint_symbol_2 = {.outColor_1=tint_symbol_6, .gl_FragDepth_1=tint_symbol_7};
+  tint_symbol_1 const tint_symbol_3 = {.outColor_1=tint_symbol_2.outColor_1, .gl_FragDepth_1=tint_symbol_2.gl_FragDepth_1};
+  return tint_symbol_3;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_3/1.wgsl.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_3/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..abc3df8
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_3/1.wgsl.expected.spvasm
@@ -0,0 +1,68 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 34
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol_1 %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpExecutionMode %main DepthReplacing
+               OpName %outColor "outColor"
+               OpName %gl_FragDepth "gl_FragDepth"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "outColor_1"
+               OpMemberName %main_out 1 "gl_FragDepth_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol "tint_symbol"
+               OpName %main "main"
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %tint_symbol_2 BuiltIn FragDepth
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+   %outColor = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Private_float = OpTypePointer Private %float
+          %8 = OpConstantNull %float
+%gl_FragDepth = OpVariable %_ptr_Private_float Private %8
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %5
+%_ptr_Output_float = OpTypePointer Output %float
+%tint_symbol_2 = OpVariable %_ptr_Output_float Output %8
+       %void = OpTypeVoid
+         %13 = OpTypeFunction %void
+    %float_0 = OpConstant %float 0
+         %18 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+%float_0_400000006 = OpConstant %float 0.400000006
+   %main_out = OpTypeStruct %v4float %float
+         %20 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %13
+         %16 = OpLabel
+               OpStore %outColor %18
+               OpStore %gl_FragDepth %float_0_400000006
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %20
+%tint_symbol = OpFunctionParameter %main_out
+         %24 = OpLabel
+         %25 = OpCompositeExtract %v4float %tint_symbol 0
+               OpStore %tint_symbol_1 %25
+         %26 = OpCompositeExtract %float %tint_symbol 1
+               OpStore %tint_symbol_2 %26
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %13
+         %28 = OpLabel
+         %29 = OpFunctionCall %void %main_1
+         %31 = OpLoad %v4float %outColor
+         %32 = OpLoad %float %gl_FragDepth
+         %33 = OpCompositeConstruct %main_out %31 %32
+         %30 = OpFunctionCall %void %tint_symbol_3 %33
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_3/1.wgsl.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_3/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..f6cb3ea
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/graphics/execution_mode/depthunchanged_3/1.wgsl.expected.wgsl
@@ -0,0 +1,22 @@
+var<private> outColor : vec4<f32>;
+
+var<private> gl_FragDepth : f32;
+
+fn main_1() {
+  outColor = vec4<f32>(0.0, 0.0, 0.0, 0.0);
+  gl_FragDepth = 0.400000006;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  outColor_1 : vec4<f32>;
+  [[builtin(frag_depth)]]
+  gl_FragDepth_1 : f32;
+};
+
+[[stage(fragment)]]
+fn main() -> main_out {
+  main_1();
+  return main_out(outColor, gl_FragDepth);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/decorate_string/0.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/decorate_string/0.spvasm
new file mode 100644
index 0000000..ba4adaf
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/decorate_string/0.spvasm
@@ -0,0 +1,48 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %_ %position %pos
+               OpSource GLSL 450
+               OpName %main "main"
+               OpName %gl_PerVertex "gl_PerVertex"
+               OpMemberName %gl_PerVertex 0 "gl_Position"
+               OpMemberName %gl_PerVertex 1 "gl_PointSize"
+               OpMemberName %gl_PerVertex 2 "gl_ClipDistance"
+               OpMemberName %gl_PerVertex 3 "gl_CullDistance"
+               OpName %_ ""
+               OpName %position "position"
+               OpName %pos "pos"
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpMemberDecorate %gl_PerVertex 3 BuiltIn CullDistance
+               OpDecorate %gl_PerVertex Block
+               OpDecorate %position Location 0
+               OpDecorate %pos Flat
+               OpDecorate %pos Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1 %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+   %position = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%_ptr_Output_uint = OpTypePointer Output %uint
+        %pos = OpVariable %_ptr_Output_uint Output
+     %uint_0 = OpConstant %uint 0
+       %main = OpFunction %void None %8
+         %21 = OpLabel
+         %22 = OpLoad %v4float %position
+         %23 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+               OpStore %23 %22
+               OpStore %pos %uint_0
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/decorate_string/0.spvasm.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/decorate_string/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..b121d9e
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/decorate_string/0.spvasm.expected.hlsl
@@ -0,0 +1,30 @@
+static float4 position = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static uint pos = 0u;
+static float4 gl_Position = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  gl_Position = position;
+  pos = 0u;
+  return;
+}
+
+struct main_out {
+  float4 gl_Position;
+  uint pos_1;
+};
+struct tint_symbol_1 {
+  float4 position_param : TEXCOORD0;
+};
+struct tint_symbol_2 {
+  uint pos_1 : TEXCOORD0;
+  float4 gl_Position : SV_Position;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 position_param = tint_symbol.position_param;
+  position = position_param;
+  main_1();
+  const main_out tint_symbol_3 = {gl_Position, pos};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.pos_1, tint_symbol_3.gl_Position};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/decorate_string/0.spvasm.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/decorate_string/0.spvasm.expected.msl
new file mode 100644
index 0000000..5a99a8e
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/decorate_string/0.spvasm.expected.msl
@@ -0,0 +1,34 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 gl_Position;
+  uint pos_1;
+};
+struct tint_symbol_2 {
+  float4 position_param [[attribute(0)]];
+};
+struct tint_symbol_3 {
+  uint pos_1 [[user(locn0)]];
+  float4 gl_Position [[position]];
+};
+
+void main_1(thread float4* const tint_symbol_6, thread float4* const tint_symbol_7, thread uint* const tint_symbol_8) {
+  float4 const x_22 = *(tint_symbol_6);
+  *(tint_symbol_7) = x_22;
+  *(tint_symbol_8) = 0u;
+  return;
+}
+
+vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread float4 tint_symbol_9 = 0.0f;
+  thread float4 tint_symbol_10 = 0.0f;
+  thread uint tint_symbol_11 = 0u;
+  float4 const position_param = tint_symbol_1.position_param;
+  tint_symbol_9 = position_param;
+  main_1(&(tint_symbol_9), &(tint_symbol_10), &(tint_symbol_11));
+  main_out const tint_symbol_4 = {.gl_Position=tint_symbol_10, .pos_1=tint_symbol_11};
+  tint_symbol_3 const tint_symbol_5 = {.pos_1=tint_symbol_4.pos_1, .gl_Position=tint_symbol_4.gl_Position};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/decorate_string/0.spvasm.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/decorate_string/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..b7ee735
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/decorate_string/0.spvasm.expected.spvasm
@@ -0,0 +1,82 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 42
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %tint_pointsize %tint_symbol %tint_symbol_2 %tint_symbol_3
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %position "position"
+               OpName %pos "pos"
+               OpName %gl_Position "gl_Position"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "gl_Position"
+               OpMemberName %main_out 1 "pos_1"
+               OpName %tint_symbol_4 "tint_symbol_4"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_2 BuiltIn Position
+               OpDecorate %tint_symbol_3 Location 0
+               OpDecorate %tint_symbol_3 Flat
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+   %position = OpVariable %_ptr_Private_v4float Private %8
+       %uint = OpTypeInt 32 0
+%_ptr_Private_uint = OpTypePointer Private %uint
+         %12 = OpConstantNull %uint
+        %pos = OpVariable %_ptr_Private_uint Private %12
+%gl_Position = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %8
+%_ptr_Output_uint = OpTypePointer Output %uint
+%tint_symbol_3 = OpVariable %_ptr_Output_uint Output %12
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+   %main_out = OpTypeStruct %v4float %uint
+         %26 = OpTypeFunction %void %main_out
+    %float_1 = OpConstant %float 1
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+         %24 = OpLoad %v4float %position
+               OpStore %gl_Position %24
+               OpStore %pos %uint_0
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_4 = OpFunction %void None %26
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %30 = OpLabel
+         %31 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %31
+         %32 = OpCompositeExtract %uint %tint_symbol_1 1
+               OpStore %tint_symbol_3 %32
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+         %34 = OpLabel
+               OpStore %tint_pointsize %float_1
+         %36 = OpLoad %v4float %tint_symbol
+               OpStore %position %36
+         %37 = OpFunctionCall %void %main_1
+         %39 = OpLoad %v4float %gl_Position
+         %40 = OpLoad %uint %pos
+         %41 = OpCompositeConstruct %main_out %39 %40
+         %38 = OpFunctionCall %void %tint_symbol_4 %41
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/decorate_string/0.spvasm.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/decorate_string/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..081740c
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/decorate_string/0.spvasm.expected.wgsl
@@ -0,0 +1,26 @@
+var<private> position : vec4<f32>;
+
+var<private> pos : u32;
+
+var<private> gl_Position : vec4<f32>;
+
+fn main_1() {
+  let x_22 : vec4<f32> = position;
+  gl_Position = x_22;
+  pos = 0u;
+  return;
+}
+
+struct main_out {
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+  [[location(0)]]
+  pos_1 : u32;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] position_param : vec4<f32>) -> main_out {
+  position = position_param;
+  main_1();
+  return main_out(gl_Position, pos);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/decorate_string/0.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/decorate_string/0.wgsl
new file mode 100644
index 0000000..081740c
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/decorate_string/0.wgsl
@@ -0,0 +1,26 @@
+var<private> position : vec4<f32>;
+
+var<private> pos : u32;
+
+var<private> gl_Position : vec4<f32>;
+
+fn main_1() {
+  let x_22 : vec4<f32> = position;
+  gl_Position = x_22;
+  pos = 0u;
+  return;
+}
+
+struct main_out {
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+  [[location(0)]]
+  pos_1 : u32;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] position_param : vec4<f32>) -> main_out {
+  position = position_param;
+  main_1();
+  return main_out(gl_Position, pos);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/decorate_string/0.wgsl.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/decorate_string/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..b121d9e
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/decorate_string/0.wgsl.expected.hlsl
@@ -0,0 +1,30 @@
+static float4 position = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static uint pos = 0u;
+static float4 gl_Position = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  gl_Position = position;
+  pos = 0u;
+  return;
+}
+
+struct main_out {
+  float4 gl_Position;
+  uint pos_1;
+};
+struct tint_symbol_1 {
+  float4 position_param : TEXCOORD0;
+};
+struct tint_symbol_2 {
+  uint pos_1 : TEXCOORD0;
+  float4 gl_Position : SV_Position;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 position_param = tint_symbol.position_param;
+  position = position_param;
+  main_1();
+  const main_out tint_symbol_3 = {gl_Position, pos};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.pos_1, tint_symbol_3.gl_Position};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/decorate_string/0.wgsl.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/decorate_string/0.wgsl.expected.msl
new file mode 100644
index 0000000..5a99a8e
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/decorate_string/0.wgsl.expected.msl
@@ -0,0 +1,34 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 gl_Position;
+  uint pos_1;
+};
+struct tint_symbol_2 {
+  float4 position_param [[attribute(0)]];
+};
+struct tint_symbol_3 {
+  uint pos_1 [[user(locn0)]];
+  float4 gl_Position [[position]];
+};
+
+void main_1(thread float4* const tint_symbol_6, thread float4* const tint_symbol_7, thread uint* const tint_symbol_8) {
+  float4 const x_22 = *(tint_symbol_6);
+  *(tint_symbol_7) = x_22;
+  *(tint_symbol_8) = 0u;
+  return;
+}
+
+vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread float4 tint_symbol_9 = 0.0f;
+  thread float4 tint_symbol_10 = 0.0f;
+  thread uint tint_symbol_11 = 0u;
+  float4 const position_param = tint_symbol_1.position_param;
+  tint_symbol_9 = position_param;
+  main_1(&(tint_symbol_9), &(tint_symbol_10), &(tint_symbol_11));
+  main_out const tint_symbol_4 = {.gl_Position=tint_symbol_10, .pos_1=tint_symbol_11};
+  tint_symbol_3 const tint_symbol_5 = {.pos_1=tint_symbol_4.pos_1, .gl_Position=tint_symbol_4.gl_Position};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/decorate_string/0.wgsl.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/decorate_string/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..b7ee735
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/decorate_string/0.wgsl.expected.spvasm
@@ -0,0 +1,82 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 42
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %tint_pointsize %tint_symbol %tint_symbol_2 %tint_symbol_3
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %position "position"
+               OpName %pos "pos"
+               OpName %gl_Position "gl_Position"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "gl_Position"
+               OpMemberName %main_out 1 "pos_1"
+               OpName %tint_symbol_4 "tint_symbol_4"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_2 BuiltIn Position
+               OpDecorate %tint_symbol_3 Location 0
+               OpDecorate %tint_symbol_3 Flat
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %8 = OpConstantNull %v4float
+   %position = OpVariable %_ptr_Private_v4float Private %8
+       %uint = OpTypeInt 32 0
+%_ptr_Private_uint = OpTypePointer Private %uint
+         %12 = OpConstantNull %uint
+        %pos = OpVariable %_ptr_Private_uint Private %12
+%gl_Position = OpVariable %_ptr_Private_v4float Private %8
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %8
+%_ptr_Output_uint = OpTypePointer Output %uint
+%tint_symbol_3 = OpVariable %_ptr_Output_uint Output %12
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+   %main_out = OpTypeStruct %v4float %uint
+         %26 = OpTypeFunction %void %main_out
+    %float_1 = OpConstant %float 1
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+         %24 = OpLoad %v4float %position
+               OpStore %gl_Position %24
+               OpStore %pos %uint_0
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_4 = OpFunction %void None %26
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %30 = OpLabel
+         %31 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %31
+         %32 = OpCompositeExtract %uint %tint_symbol_1 1
+               OpStore %tint_symbol_3 %32
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+         %34 = OpLabel
+               OpStore %tint_pointsize %float_1
+         %36 = OpLoad %v4float %tint_symbol
+               OpStore %position %36
+         %37 = OpFunctionCall %void %main_1
+         %39 = OpLoad %v4float %gl_Position
+         %40 = OpLoad %uint %pos
+         %41 = OpCompositeConstruct %main_out %39 %40
+         %38 = OpFunctionCall %void %tint_symbol_4 %41
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/decorate_string/0.wgsl.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/decorate_string/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..081740c
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/spirv1p4/hlsl_functionality1/decorate_string/0.wgsl.expected.wgsl
@@ -0,0 +1,26 @@
+var<private> position : vec4<f32>;
+
+var<private> pos : u32;
+
+var<private> gl_Position : vec4<f32>;
+
+fn main_1() {
+  let x_22 : vec4<f32> = position;
+  gl_Position = x_22;
+  pos = 0u;
+  return;
+}
+
+struct main_out {
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+  [[location(0)]]
+  pos_1 : u32;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] position_param : vec4<f32>) -> main_out {
+  position = position_param;
+  main_1();
+  return main_out(gl_Position, pos);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_atomic/0-opt.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_atomic/0-opt.spvasm
new file mode 100644
index 0000000..b74d27f
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_atomic/0-opt.spvasm
@@ -0,0 +1,36 @@
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %1 "main" %2 %3 %4 %5
+               OpDecorate %2 Location 0
+               OpDecorate %3 Location 1
+               OpDecorate %4 Location 0
+               OpDecorate %_struct_6 Block
+               OpMemberDecorate %_struct_6 0 BuiltIn Position
+       %void = OpTypeVoid
+       %bool = OpTypeBool
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %float = OpTypeFloat 32
+    %float_1 = OpConstant %float 1
+    %v3float = OpTypeVector %float 3
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v3float = OpTypePointer Input %v3float
+%_ptr_Input_int = OpTypePointer Input %int
+%_ptr_Output_int = OpTypePointer Output %int
+  %_struct_6 = OpTypeStruct %v4float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%_ptr_Output__struct_6 = OpTypePointer Output %_struct_6
+          %2 = OpVariable %_ptr_Input_v3float Input
+          %3 = OpVariable %_ptr_Input_int Input
+          %4 = OpVariable %_ptr_Output_int Output
+          %5 = OpVariable %_ptr_Output__struct_6 Output
+         %20 = OpTypeFunction %void
+          %1 = OpFunction %void None %20
+         %21 = OpLabel
+         %22 = OpLoad %v3float %2
+         %23 = OpCompositeConstruct %v4float %22 %float_1
+         %24 = OpAccessChain %_ptr_Output_v4float %5 %int_0
+               OpStore %24 %23
+               OpCopyMemory %4 %3
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_atomic/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_atomic/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..4d470f2
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_atomic/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,34 @@
+static float3 x_2 = float3(0.0f, 0.0f, 0.0f);
+static int x_3 = 0;
+static int x_4 = 0;
+static float4 gl_Position = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  gl_Position = float4(x_2, 1.0f);
+  x_4 = x_3;
+  return;
+}
+
+struct main_out {
+  int x_4_1;
+  float4 gl_Position;
+};
+struct tint_symbol_1 {
+  float3 x_2_param : TEXCOORD0;
+  int x_3_param : TEXCOORD1;
+};
+struct tint_symbol_2 {
+  int x_4_1 : TEXCOORD0;
+  float4 gl_Position : SV_Position;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float3 x_2_param = tint_symbol.x_2_param;
+  const int x_3_param = tint_symbol.x_3_param;
+  x_2 = x_2_param;
+  x_3 = x_3_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_4, gl_Position};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_4_1, tint_symbol_3.gl_Position};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_atomic/0-opt.spvasm.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_atomic/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..fcba4cc
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_atomic/0-opt.spvasm.expected.msl
@@ -0,0 +1,38 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  int x_4_1;
+  float4 gl_Position;
+};
+struct tint_symbol_2 {
+  float3 x_2_param [[attribute(0)]];
+  int x_3_param [[attribute(1)]];
+};
+struct tint_symbol_3 {
+  int x_4_1 [[user(locn0)]];
+  float4 gl_Position [[position]];
+};
+
+void main_1(thread float3* const tint_symbol_6, thread float4* const tint_symbol_7, thread int* const tint_symbol_8, thread int* const tint_symbol_9) {
+  float3 const x_22 = *(tint_symbol_6);
+  *(tint_symbol_7) = float4(x_22, 1.0f);
+  *(tint_symbol_8) = *(tint_symbol_9);
+  return;
+}
+
+vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread float3 tint_symbol_10 = 0.0f;
+  thread int tint_symbol_11 = 0;
+  thread float4 tint_symbol_12 = 0.0f;
+  thread int tint_symbol_13 = 0;
+  float3 const x_2_param = tint_symbol_1.x_2_param;
+  int const x_3_param = tint_symbol_1.x_3_param;
+  tint_symbol_10 = x_2_param;
+  tint_symbol_11 = x_3_param;
+  main_1(&(tint_symbol_10), &(tint_symbol_12), &(tint_symbol_13), &(tint_symbol_11));
+  main_out const tint_symbol_4 = {.x_4_1=tint_symbol_13, .gl_Position=tint_symbol_12};
+  tint_symbol_3 const tint_symbol_5 = {.x_4_1=tint_symbol_4.x_4_1, .gl_Position=tint_symbol_4.gl_Position};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_atomic/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_atomic/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..2bfe24c
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_atomic/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,97 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 53
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %tint_pointsize %tint_symbol %tint_symbol_1 %tint_symbol_3 %tint_symbol_4
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %x_2 "x_2"
+               OpName %x_3 "x_3"
+               OpName %x_4 "x_4"
+               OpName %gl_Position "gl_Position"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_4 "tint_symbol_4"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_4_1"
+               OpMemberName %main_out 1 "gl_Position"
+               OpName %tint_symbol_5 "tint_symbol_5"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main "main"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_1 Location 1
+               OpDecorate %tint_symbol_3 Location 0
+               OpDecorate %tint_symbol_3 Flat
+               OpDecorate %tint_symbol_4 BuiltIn Position
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+    %v3float = OpTypeVector %float 3
+%_ptr_Private_v3float = OpTypePointer Private %v3float
+          %8 = OpConstantNull %v3float
+        %x_2 = OpVariable %_ptr_Private_v3float Private %8
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+         %12 = OpConstantNull %int
+        %x_3 = OpVariable %_ptr_Private_int Private %12
+        %x_4 = OpVariable %_ptr_Private_int Private %12
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%gl_Position = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Input_v3float = OpTypePointer Input %v3float
+%tint_symbol = OpVariable %_ptr_Input_v3float Input
+%_ptr_Input_int = OpTypePointer Input %int
+%tint_symbol_1 = OpVariable %_ptr_Input_int Input
+%_ptr_Output_int = OpTypePointer Output %int
+%tint_symbol_3 = OpVariable %_ptr_Output_int Output %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_4 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %26 = OpTypeFunction %void
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %int %v4float
+         %37 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %26
+         %29 = OpLabel
+         %30 = OpLoad %v3float %x_2
+         %31 = OpCompositeExtract %float %30 0
+         %32 = OpCompositeExtract %float %30 1
+         %33 = OpCompositeExtract %float %30 2
+         %35 = OpCompositeConstruct %v4float %31 %32 %33 %float_1
+               OpStore %gl_Position %35
+         %36 = OpLoad %int %x_3
+               OpStore %x_4 %36
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_5 = OpFunction %void None %37
+%tint_symbol_2 = OpFunctionParameter %main_out
+         %41 = OpLabel
+         %42 = OpCompositeExtract %int %tint_symbol_2 0
+               OpStore %tint_symbol_3 %42
+         %43 = OpCompositeExtract %v4float %tint_symbol_2 1
+               OpStore %tint_symbol_4 %43
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %26
+         %45 = OpLabel
+               OpStore %tint_pointsize %float_1
+         %46 = OpLoad %v3float %tint_symbol
+               OpStore %x_2 %46
+         %47 = OpLoad %int %tint_symbol_1
+               OpStore %x_3 %47
+         %48 = OpFunctionCall %void %main_1
+         %50 = OpLoad %int %x_4
+         %51 = OpLoad %v4float %gl_Position
+         %52 = OpCompositeConstruct %main_out %50 %51
+         %49 = OpFunctionCall %void %tint_symbol_5 %52
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_atomic/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_atomic/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..9959aa6
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_atomic/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,29 @@
+var<private> x_2 : vec3<f32>;
+
+var<private> x_3 : i32;
+
+var<private> x_4 : i32;
+
+var<private> gl_Position : vec4<f32>;
+
+fn main_1() {
+  let x_22 : vec3<f32> = x_2;
+  gl_Position = vec4<f32>(x_22, 1.0);
+  x_4 = x_3;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_4_1 : i32;
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] x_2_param : vec3<f32>, [[location(1)]] x_3_param : i32) -> main_out {
+  x_2 = x_2_param;
+  x_3 = x_3_param;
+  main_1();
+  return main_out(x_4, gl_Position);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_atomic/0-opt.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_atomic/0-opt.wgsl
new file mode 100644
index 0000000..9959aa6
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_atomic/0-opt.wgsl
@@ -0,0 +1,29 @@
+var<private> x_2 : vec3<f32>;
+
+var<private> x_3 : i32;
+
+var<private> x_4 : i32;
+
+var<private> gl_Position : vec4<f32>;
+
+fn main_1() {
+  let x_22 : vec3<f32> = x_2;
+  gl_Position = vec4<f32>(x_22, 1.0);
+  x_4 = x_3;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_4_1 : i32;
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] x_2_param : vec3<f32>, [[location(1)]] x_3_param : i32) -> main_out {
+  x_2 = x_2_param;
+  x_3 = x_3_param;
+  main_1();
+  return main_out(x_4, gl_Position);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_atomic/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_atomic/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..4d470f2
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_atomic/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,34 @@
+static float3 x_2 = float3(0.0f, 0.0f, 0.0f);
+static int x_3 = 0;
+static int x_4 = 0;
+static float4 gl_Position = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  gl_Position = float4(x_2, 1.0f);
+  x_4 = x_3;
+  return;
+}
+
+struct main_out {
+  int x_4_1;
+  float4 gl_Position;
+};
+struct tint_symbol_1 {
+  float3 x_2_param : TEXCOORD0;
+  int x_3_param : TEXCOORD1;
+};
+struct tint_symbol_2 {
+  int x_4_1 : TEXCOORD0;
+  float4 gl_Position : SV_Position;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float3 x_2_param = tint_symbol.x_2_param;
+  const int x_3_param = tint_symbol.x_3_param;
+  x_2 = x_2_param;
+  x_3 = x_3_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_4, gl_Position};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_4_1, tint_symbol_3.gl_Position};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_atomic/0-opt.wgsl.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_atomic/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..fcba4cc
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_atomic/0-opt.wgsl.expected.msl
@@ -0,0 +1,38 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  int x_4_1;
+  float4 gl_Position;
+};
+struct tint_symbol_2 {
+  float3 x_2_param [[attribute(0)]];
+  int x_3_param [[attribute(1)]];
+};
+struct tint_symbol_3 {
+  int x_4_1 [[user(locn0)]];
+  float4 gl_Position [[position]];
+};
+
+void main_1(thread float3* const tint_symbol_6, thread float4* const tint_symbol_7, thread int* const tint_symbol_8, thread int* const tint_symbol_9) {
+  float3 const x_22 = *(tint_symbol_6);
+  *(tint_symbol_7) = float4(x_22, 1.0f);
+  *(tint_symbol_8) = *(tint_symbol_9);
+  return;
+}
+
+vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread float3 tint_symbol_10 = 0.0f;
+  thread int tint_symbol_11 = 0;
+  thread float4 tint_symbol_12 = 0.0f;
+  thread int tint_symbol_13 = 0;
+  float3 const x_2_param = tint_symbol_1.x_2_param;
+  int const x_3_param = tint_symbol_1.x_3_param;
+  tint_symbol_10 = x_2_param;
+  tint_symbol_11 = x_3_param;
+  main_1(&(tint_symbol_10), &(tint_symbol_12), &(tint_symbol_13), &(tint_symbol_11));
+  main_out const tint_symbol_4 = {.x_4_1=tint_symbol_13, .gl_Position=tint_symbol_12};
+  tint_symbol_3 const tint_symbol_5 = {.x_4_1=tint_symbol_4.x_4_1, .gl_Position=tint_symbol_4.gl_Position};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_atomic/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_atomic/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..2bfe24c
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_atomic/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,97 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 53
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %tint_pointsize %tint_symbol %tint_symbol_1 %tint_symbol_3 %tint_symbol_4
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %x_2 "x_2"
+               OpName %x_3 "x_3"
+               OpName %x_4 "x_4"
+               OpName %gl_Position "gl_Position"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_4 "tint_symbol_4"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_4_1"
+               OpMemberName %main_out 1 "gl_Position"
+               OpName %tint_symbol_5 "tint_symbol_5"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main "main"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_1 Location 1
+               OpDecorate %tint_symbol_3 Location 0
+               OpDecorate %tint_symbol_3 Flat
+               OpDecorate %tint_symbol_4 BuiltIn Position
+               OpMemberDecorate %main_out 0 Offset 0
+               OpMemberDecorate %main_out 1 Offset 16
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+    %v3float = OpTypeVector %float 3
+%_ptr_Private_v3float = OpTypePointer Private %v3float
+          %8 = OpConstantNull %v3float
+        %x_2 = OpVariable %_ptr_Private_v3float Private %8
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+         %12 = OpConstantNull %int
+        %x_3 = OpVariable %_ptr_Private_int Private %12
+        %x_4 = OpVariable %_ptr_Private_int Private %12
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %17 = OpConstantNull %v4float
+%gl_Position = OpVariable %_ptr_Private_v4float Private %17
+%_ptr_Input_v3float = OpTypePointer Input %v3float
+%tint_symbol = OpVariable %_ptr_Input_v3float Input
+%_ptr_Input_int = OpTypePointer Input %int
+%tint_symbol_1 = OpVariable %_ptr_Input_int Input
+%_ptr_Output_int = OpTypePointer Output %int
+%tint_symbol_3 = OpVariable %_ptr_Output_int Output %12
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_4 = OpVariable %_ptr_Output_v4float Output %17
+       %void = OpTypeVoid
+         %26 = OpTypeFunction %void
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %int %v4float
+         %37 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %26
+         %29 = OpLabel
+         %30 = OpLoad %v3float %x_2
+         %31 = OpCompositeExtract %float %30 0
+         %32 = OpCompositeExtract %float %30 1
+         %33 = OpCompositeExtract %float %30 2
+         %35 = OpCompositeConstruct %v4float %31 %32 %33 %float_1
+               OpStore %gl_Position %35
+         %36 = OpLoad %int %x_3
+               OpStore %x_4 %36
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_5 = OpFunction %void None %37
+%tint_symbol_2 = OpFunctionParameter %main_out
+         %41 = OpLabel
+         %42 = OpCompositeExtract %int %tint_symbol_2 0
+               OpStore %tint_symbol_3 %42
+         %43 = OpCompositeExtract %v4float %tint_symbol_2 1
+               OpStore %tint_symbol_4 %43
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %26
+         %45 = OpLabel
+               OpStore %tint_pointsize %float_1
+         %46 = OpLoad %v3float %tint_symbol
+               OpStore %x_2 %46
+         %47 = OpLoad %int %tint_symbol_1
+               OpStore %x_3 %47
+         %48 = OpFunctionCall %void %main_1
+         %50 = OpLoad %int %x_4
+         %51 = OpLoad %v4float %gl_Position
+         %52 = OpCompositeConstruct %main_out %50 %51
+         %49 = OpFunctionCall %void %tint_symbol_5 %52
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_atomic/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_atomic/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..9959aa6
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_atomic/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,29 @@
+var<private> x_2 : vec3<f32>;
+
+var<private> x_3 : i32;
+
+var<private> x_4 : i32;
+
+var<private> gl_Position : vec4<f32>;
+
+fn main_1() {
+  let x_22 : vec3<f32> = x_2;
+  gl_Position = vec4<f32>(x_22, 1.0);
+  x_4 = x_3;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_4_1 : i32;
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] x_2_param : vec3<f32>, [[location(1)]] x_3_param : i32) -> main_out {
+  x_2 = x_2_param;
+  x_3 = x_3_param;
+  main_1();
+  return main_out(x_4, gl_Position);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_store/1.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_store/1.spvasm
new file mode 100644
index 0000000..d84314b
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_store/1.spvasm
@@ -0,0 +1,58 @@
+               OpCapability Shader
+               OpExtension "SPV_KHR_terminate_invocation"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %1 "main" %gl_FragCoord %3 %4
+               OpExecutionMode %1 OriginUpperLeft
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %3 Location 0
+               OpDecorate %3 Flat
+               OpDecorate %4 Location 0
+               OpDecorate %5 DescriptorSet 0
+               OpDecorate %5 Binding 0
+       %void = OpTypeVoid
+       %bool = OpTypeBool
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+      %int_8 = OpConstant %int 8
+      %v2int = OpTypeVector %int 2
+      %v4int = OpTypeVector %int 4
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_int = OpTypePointer Input %int
+%_ptr_Output_int = OpTypePointer Output %int
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+          %3 = OpVariable %_ptr_Input_int Input
+          %4 = OpVariable %_ptr_Output_int Output
+         %19 = OpTypeImage %int 2D 0 0 0 2 R32i
+%_ptr_UniformConstant_19 = OpTypePointer UniformConstant %19
+          %5 = OpVariable %_ptr_UniformConstant_19 UniformConstant
+         %21 = OpTypeFunction %void
+          %1 = OpFunction %void None %21
+         %22 = OpLabel
+               OpStore %4 %int_1
+         %23 = OpLoad %v4float %gl_FragCoord
+         %24 = OpCompositeExtract %float %23 0
+         %25 = OpCompositeExtract %float %23 1
+         %26 = OpCompositeExtract %float %23 2
+         %27 = OpConvertFToS %int %24
+         %28 = OpConvertFToS %int %25
+         %29 = OpConvertFToS %int %26
+         %30 = OpBitwiseAnd %int %27 %int_1
+         %31 = OpBitwiseAnd %int %28 %int_1
+         %32 = OpIAdd %int %30 %31
+         %33 = OpLoad %int %3
+         %34 = OpIAdd %int %32 %33
+         %35 = OpIEqual %bool %34 %29
+               OpSelectionMerge %36 None
+               OpBranchConditional %35 %37 %36
+         %37 = OpLabel
+               OpTerminateInvocation
+         %36 = OpLabel
+         %38 = OpCompositeConstruct %v4int %27 %int_0 %int_0 %int_0
+         %39 = OpCompositeConstruct %v2int %27 %28
+         %40 = OpLoad %19 %5
+               OpImageWrite %40 %39 %38
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_store/1.spvasm.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_store/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..0097cb2
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_store/1.spvasm.expected.hlsl
@@ -0,0 +1,37 @@
+static float4 x_2 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static int x_3 = 0;
+static int x_4 = 0;
+RWTexture2D<int4> x_5 : register(u0, space0);
+
+void main_1() {
+  x_4 = 1;
+  const float4 x_23 = x_2;
+  const int x_27 = int(x_23.x);
+  const int x_28 = int(x_23.y);
+  if (((((x_27 & 1) + (x_28 & 1)) + x_3) == int(x_23.z))) {
+  }
+  x_5[int2(x_27, x_28)] = int4(x_27, 0, 0, 0);
+  return;
+}
+
+struct main_out {
+  int x_4_1;
+};
+struct tint_symbol_1 {
+  int x_3_param : TEXCOORD0;
+  float4 x_2_param : SV_Position;
+};
+struct tint_symbol_2 {
+  int x_4_1 : SV_Target0;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 x_2_param = tint_symbol.x_2_param;
+  const int x_3_param = tint_symbol.x_3_param;
+  x_2 = x_2_param;
+  x_3 = x_3_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_4};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_4_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_store/1.spvasm.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_store/1.spvasm.expected.msl
new file mode 100644
index 0000000..88c8f1c
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_store/1.spvasm.expected.msl
@@ -0,0 +1,38 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  int x_4_1;
+};
+struct tint_symbol_2 {
+  int x_3_param [[user(locn0)]];
+};
+struct tint_symbol_3 {
+  int x_4_1 [[color(0)]];
+};
+
+void main_1(thread int* const tint_symbol_6, thread float4* const tint_symbol_7, thread int* const tint_symbol_8, texture2d<int, access::write> tint_symbol_9) {
+  *(tint_symbol_6) = 1;
+  float4 const x_23 = *(tint_symbol_7);
+  int const x_27 = int(x_23.x);
+  int const x_28 = int(x_23.y);
+  int const x_33 = *(tint_symbol_8);
+  if (((((x_27 & 1) + (x_28 & 1)) + x_33) == int(x_23.z))) {
+  }
+  tint_symbol_9.write(int4(x_27, 0, 0, 0), uint2(int2(x_27, x_28)));
+  return;
+}
+
+fragment tint_symbol_3 tint_symbol(texture2d<int, access::write> tint_symbol_13 [[texture(0)]], float4 x_2_param [[position]], tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread float4 tint_symbol_10 = 0.0f;
+  thread int tint_symbol_11 = 0;
+  thread int tint_symbol_12 = 0;
+  int const x_3_param = tint_symbol_1.x_3_param;
+  tint_symbol_10 = x_2_param;
+  tint_symbol_11 = x_3_param;
+  main_1(&(tint_symbol_12), &(tint_symbol_10), &(tint_symbol_11), tint_symbol_13);
+  main_out const tint_symbol_4 = {.x_4_1=tint_symbol_12};
+  tint_symbol_3 const tint_symbol_5 = {.x_4_1=tint_symbol_4.x_4_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_store/1.spvasm.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_store/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..3a722c8
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_store/1.spvasm.expected.spvasm
@@ -0,0 +1,104 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 62
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_1 %tint_symbol_3
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_2 "x_2"
+               OpName %x_3 "x_3"
+               OpName %x_4 "x_4"
+               OpName %x_5 "x_5"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_4_1"
+               OpName %tint_symbol_4 "tint_symbol_4"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main "main"
+               OpDecorate %x_5 NonReadable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %tint_symbol_1 Flat
+               OpDecorate %tint_symbol_3 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+        %x_2 = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+          %9 = OpConstantNull %int
+        %x_3 = OpVariable %_ptr_Private_int Private %9
+        %x_4 = OpVariable %_ptr_Private_int Private %9
+         %13 = OpTypeImage %int 2D 0 0 0 2 R32i
+%_ptr_UniformConstant_13 = OpTypePointer UniformConstant %13
+        %x_5 = OpVariable %_ptr_UniformConstant_13 UniformConstant
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Input_int = OpTypePointer Input %int
+%tint_symbol_1 = OpVariable %_ptr_Input_int Input
+%_ptr_Output_int = OpTypePointer Output %int
+%tint_symbol_3 = OpVariable %_ptr_Output_int Output %9
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %v2int = OpTypeVector %int 2
+      %v4int = OpTypeVector %int 4
+      %int_0 = OpConstant %int 0
+   %main_out = OpTypeStruct %int
+         %48 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+               OpStore %x_4 %int_1
+         %25 = OpLoad %v4float %x_2
+         %27 = OpCompositeExtract %float %25 0
+         %26 = OpConvertFToS %int %27
+         %29 = OpCompositeExtract %float %25 1
+         %28 = OpConvertFToS %int %29
+         %30 = OpLoad %int %x_3
+         %31 = OpBitwiseAnd %int %26 %int_1
+         %32 = OpBitwiseAnd %int %28 %int_1
+         %33 = OpIAdd %int %31 %32
+         %34 = OpIAdd %int %33 %30
+         %36 = OpCompositeExtract %float %25 2
+         %35 = OpConvertFToS %int %36
+         %37 = OpIEqual %bool %34 %35
+               OpSelectionMerge %39 None
+               OpBranchConditional %37 %40 %39
+         %40 = OpLabel
+               OpBranch %39
+         %39 = OpLabel
+         %42 = OpLoad %13 %x_5
+         %44 = OpCompositeConstruct %v2int %26 %28
+         %47 = OpCompositeConstruct %v4int %26 %int_0 %int_0 %int_0
+               OpImageWrite %42 %44 %47
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_4 = OpFunction %void None %48
+%tint_symbol_2 = OpFunctionParameter %main_out
+         %52 = OpLabel
+         %53 = OpCompositeExtract %int %tint_symbol_2 0
+               OpStore %tint_symbol_3 %53
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+         %55 = OpLabel
+         %56 = OpLoad %v4float %tint_symbol
+               OpStore %x_2 %56
+         %57 = OpLoad %int %tint_symbol_1
+               OpStore %x_3 %57
+         %58 = OpFunctionCall %void %main_1
+         %60 = OpLoad %int %x_4
+         %61 = OpCompositeConstruct %main_out %60
+         %59 = OpFunctionCall %void %tint_symbol_4 %61
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_store/1.spvasm.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_store/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..0f3c732
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_store/1.spvasm.expected.wgsl
@@ -0,0 +1,32 @@
+var<private> x_2 : vec4<f32>;
+
+var<private> x_3 : i32;
+
+var<private> x_4 : i32;
+
+[[group(0), binding(0)]] var x_5 : texture_storage_2d<r32sint, write>;
+
+fn main_1() {
+  x_4 = 1;
+  let x_23 : vec4<f32> = x_2;
+  let x_27 : i32 = i32(x_23.x);
+  let x_28 : i32 = i32(x_23.y);
+  let x_33 : i32 = x_3;
+  if (((((x_27 & 1) + (x_28 & 1)) + x_33) == i32(x_23.z))) {
+  }
+  textureStore(x_5, vec2<i32>(x_27, x_28), vec4<i32>(x_27, 0, 0, 0));
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_4_1 : i32;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] x_2_param : vec4<f32>, [[location(0)]] x_3_param : i32) -> main_out {
+  x_2 = x_2_param;
+  x_3 = x_3_param;
+  main_1();
+  return main_out(x_4);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_store/1.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_store/1.wgsl
new file mode 100644
index 0000000..0f3c732
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_store/1.wgsl
@@ -0,0 +1,32 @@
+var<private> x_2 : vec4<f32>;
+
+var<private> x_3 : i32;
+
+var<private> x_4 : i32;
+
+[[group(0), binding(0)]] var x_5 : texture_storage_2d<r32sint, write>;
+
+fn main_1() {
+  x_4 = 1;
+  let x_23 : vec4<f32> = x_2;
+  let x_27 : i32 = i32(x_23.x);
+  let x_28 : i32 = i32(x_23.y);
+  let x_33 : i32 = x_3;
+  if (((((x_27 & 1) + (x_28 & 1)) + x_33) == i32(x_23.z))) {
+  }
+  textureStore(x_5, vec2<i32>(x_27, x_28), vec4<i32>(x_27, 0, 0, 0));
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_4_1 : i32;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] x_2_param : vec4<f32>, [[location(0)]] x_3_param : i32) -> main_out {
+  x_2 = x_2_param;
+  x_3 = x_3_param;
+  main_1();
+  return main_out(x_4);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_store/1.wgsl.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_store/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..0097cb2
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_store/1.wgsl.expected.hlsl
@@ -0,0 +1,37 @@
+static float4 x_2 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static int x_3 = 0;
+static int x_4 = 0;
+RWTexture2D<int4> x_5 : register(u0, space0);
+
+void main_1() {
+  x_4 = 1;
+  const float4 x_23 = x_2;
+  const int x_27 = int(x_23.x);
+  const int x_28 = int(x_23.y);
+  if (((((x_27 & 1) + (x_28 & 1)) + x_3) == int(x_23.z))) {
+  }
+  x_5[int2(x_27, x_28)] = int4(x_27, 0, 0, 0);
+  return;
+}
+
+struct main_out {
+  int x_4_1;
+};
+struct tint_symbol_1 {
+  int x_3_param : TEXCOORD0;
+  float4 x_2_param : SV_Position;
+};
+struct tint_symbol_2 {
+  int x_4_1 : SV_Target0;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 x_2_param = tint_symbol.x_2_param;
+  const int x_3_param = tint_symbol.x_3_param;
+  x_2 = x_2_param;
+  x_3 = x_3_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_4};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_4_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_store/1.wgsl.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_store/1.wgsl.expected.msl
new file mode 100644
index 0000000..88c8f1c
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_store/1.wgsl.expected.msl
@@ -0,0 +1,38 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  int x_4_1;
+};
+struct tint_symbol_2 {
+  int x_3_param [[user(locn0)]];
+};
+struct tint_symbol_3 {
+  int x_4_1 [[color(0)]];
+};
+
+void main_1(thread int* const tint_symbol_6, thread float4* const tint_symbol_7, thread int* const tint_symbol_8, texture2d<int, access::write> tint_symbol_9) {
+  *(tint_symbol_6) = 1;
+  float4 const x_23 = *(tint_symbol_7);
+  int const x_27 = int(x_23.x);
+  int const x_28 = int(x_23.y);
+  int const x_33 = *(tint_symbol_8);
+  if (((((x_27 & 1) + (x_28 & 1)) + x_33) == int(x_23.z))) {
+  }
+  tint_symbol_9.write(int4(x_27, 0, 0, 0), uint2(int2(x_27, x_28)));
+  return;
+}
+
+fragment tint_symbol_3 tint_symbol(texture2d<int, access::write> tint_symbol_13 [[texture(0)]], float4 x_2_param [[position]], tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread float4 tint_symbol_10 = 0.0f;
+  thread int tint_symbol_11 = 0;
+  thread int tint_symbol_12 = 0;
+  int const x_3_param = tint_symbol_1.x_3_param;
+  tint_symbol_10 = x_2_param;
+  tint_symbol_11 = x_3_param;
+  main_1(&(tint_symbol_12), &(tint_symbol_10), &(tint_symbol_11), tint_symbol_13);
+  main_out const tint_symbol_4 = {.x_4_1=tint_symbol_12};
+  tint_symbol_3 const tint_symbol_5 = {.x_4_1=tint_symbol_4.x_4_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_store/1.wgsl.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_store/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..3a722c8
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_store/1.wgsl.expected.spvasm
@@ -0,0 +1,104 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 62
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_1 %tint_symbol_3
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_2 "x_2"
+               OpName %x_3 "x_3"
+               OpName %x_4 "x_4"
+               OpName %x_5 "x_5"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_4_1"
+               OpName %tint_symbol_4 "tint_symbol_4"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main "main"
+               OpDecorate %x_5 NonReadable
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %tint_symbol_1 Flat
+               OpDecorate %tint_symbol_3 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+        %x_2 = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+          %9 = OpConstantNull %int
+        %x_3 = OpVariable %_ptr_Private_int Private %9
+        %x_4 = OpVariable %_ptr_Private_int Private %9
+         %13 = OpTypeImage %int 2D 0 0 0 2 R32i
+%_ptr_UniformConstant_13 = OpTypePointer UniformConstant %13
+        %x_5 = OpVariable %_ptr_UniformConstant_13 UniformConstant
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Input_int = OpTypePointer Input %int
+%tint_symbol_1 = OpVariable %_ptr_Input_int Input
+%_ptr_Output_int = OpTypePointer Output %int
+%tint_symbol_3 = OpVariable %_ptr_Output_int Output %9
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+      %v2int = OpTypeVector %int 2
+      %v4int = OpTypeVector %int 4
+      %int_0 = OpConstant %int 0
+   %main_out = OpTypeStruct %int
+         %48 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %20
+         %23 = OpLabel
+               OpStore %x_4 %int_1
+         %25 = OpLoad %v4float %x_2
+         %27 = OpCompositeExtract %float %25 0
+         %26 = OpConvertFToS %int %27
+         %29 = OpCompositeExtract %float %25 1
+         %28 = OpConvertFToS %int %29
+         %30 = OpLoad %int %x_3
+         %31 = OpBitwiseAnd %int %26 %int_1
+         %32 = OpBitwiseAnd %int %28 %int_1
+         %33 = OpIAdd %int %31 %32
+         %34 = OpIAdd %int %33 %30
+         %36 = OpCompositeExtract %float %25 2
+         %35 = OpConvertFToS %int %36
+         %37 = OpIEqual %bool %34 %35
+               OpSelectionMerge %39 None
+               OpBranchConditional %37 %40 %39
+         %40 = OpLabel
+               OpBranch %39
+         %39 = OpLabel
+         %42 = OpLoad %13 %x_5
+         %44 = OpCompositeConstruct %v2int %26 %28
+         %47 = OpCompositeConstruct %v4int %26 %int_0 %int_0 %int_0
+               OpImageWrite %42 %44 %47
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_4 = OpFunction %void None %48
+%tint_symbol_2 = OpFunctionParameter %main_out
+         %52 = OpLabel
+         %53 = OpCompositeExtract %int %tint_symbol_2 0
+               OpStore %tint_symbol_3 %53
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %20
+         %55 = OpLabel
+         %56 = OpLoad %v4float %tint_symbol
+               OpStore %x_2 %56
+         %57 = OpLoad %int %tint_symbol_1
+               OpStore %x_3 %57
+         %58 = OpFunctionCall %void %main_1
+         %60 = OpLoad %int %x_4
+         %61 = OpCompositeConstruct %main_out %60
+         %59 = OpFunctionCall %void %tint_symbol_4 %61
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_store/1.wgsl.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_store/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..0f3c732
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_image_store/1.wgsl.expected.wgsl
@@ -0,0 +1,32 @@
+var<private> x_2 : vec4<f32>;
+
+var<private> x_3 : i32;
+
+var<private> x_4 : i32;
+
+[[group(0), binding(0)]] var x_5 : texture_storage_2d<r32sint, write>;
+
+fn main_1() {
+  x_4 = 1;
+  let x_23 : vec4<f32> = x_2;
+  let x_27 : i32 = i32(x_23.x);
+  let x_28 : i32 = i32(x_23.y);
+  let x_33 : i32 = x_3;
+  if (((((x_27 & 1) + (x_28 & 1)) + x_33) == i32(x_23.z))) {
+  }
+  textureStore(x_5, vec2<i32>(x_27, x_28), vec4<i32>(x_27, 0, 0, 0));
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_4_1 : i32;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] x_2_param : vec4<f32>, [[location(0)]] x_3_param : i32) -> main_out {
+  x_2 = x_2_param;
+  x_3 = x_3_param;
+  main_1();
+  return main_out(x_4);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/1.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/1.spvasm
new file mode 100644
index 0000000..e70d79a
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/1.spvasm
@@ -0,0 +1,45 @@
+               OpCapability Shader
+               OpExtension "SPV_KHR_terminate_invocation"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %1 "main" %gl_FragCoord %3 %4
+               OpExecutionMode %1 OriginUpperLeft
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %3 Location 0
+               OpDecorate %3 Flat
+               OpDecorate %4 Location 0
+       %void = OpTypeVoid
+       %bool = OpTypeBool
+        %int = OpTypeInt 32 1
+      %int_1 = OpConstant %int 1
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_int = OpTypePointer Input %int
+%_ptr_Output_int = OpTypePointer Output %int
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+          %3 = OpVariable %_ptr_Input_int Input
+          %4 = OpVariable %_ptr_Output_int Output
+         %14 = OpTypeFunction %void
+          %1 = OpFunction %void None %14
+         %15 = OpLabel
+         %16 = OpLoad %v4float %gl_FragCoord
+         %17 = OpCompositeExtract %float %16 0
+         %18 = OpCompositeExtract %float %16 1
+         %19 = OpCompositeExtract %float %16 2
+         %20 = OpConvertFToS %int %17
+         %21 = OpConvertFToS %int %18
+         %22 = OpConvertFToS %int %19
+         %23 = OpBitwiseAnd %int %20 %int_1
+         %24 = OpBitwiseAnd %int %21 %int_1
+         %25 = OpIAdd %int %23 %24
+         %26 = OpLoad %int %3
+         %27 = OpIAdd %int %25 %26
+         %28 = OpIEqual %bool %27 %22
+               OpSelectionMerge %29 None
+               OpBranchConditional %28 %30 %29
+         %30 = OpLabel
+               OpTerminateInvocation
+         %29 = OpLabel
+               OpStore %4 %int_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/1.spvasm.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..a97b541
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/1.spvasm.expected.hlsl
@@ -0,0 +1,33 @@
+static float4 x_2 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static int x_3 = 0;
+static int x_4 = 0;
+
+void main_1() {
+  const float4 x_16 = x_2;
+  if (((((int(x_16.x) & 1) + (int(x_16.y) & 1)) + x_3) == int(x_16.z))) {
+  }
+  x_4 = 1;
+  return;
+}
+
+struct main_out {
+  int x_4_1;
+};
+struct tint_symbol_1 {
+  int x_3_param : TEXCOORD0;
+  float4 x_2_param : SV_Position;
+};
+struct tint_symbol_2 {
+  int x_4_1 : SV_Target0;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 x_2_param = tint_symbol.x_2_param;
+  const int x_3_param = tint_symbol.x_3_param;
+  x_2 = x_2_param;
+  x_3 = x_3_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_4};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_4_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/1.spvasm.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/1.spvasm.expected.msl
new file mode 100644
index 0000000..a72a509
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/1.spvasm.expected.msl
@@ -0,0 +1,35 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  int x_4_1;
+};
+struct tint_symbol_2 {
+  int x_3_param [[user(locn0)]];
+};
+struct tint_symbol_3 {
+  int x_4_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_6, thread int* const tint_symbol_7, thread int* const tint_symbol_8) {
+  float4 const x_16 = *(tint_symbol_6);
+  int const x_26 = *(tint_symbol_7);
+  if (((((int(x_16.x) & 1) + (int(x_16.y) & 1)) + x_26) == int(x_16.z))) {
+  }
+  *(tint_symbol_8) = 1;
+  return;
+}
+
+fragment tint_symbol_3 tint_symbol(float4 x_2_param [[position]], tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread float4 tint_symbol_9 = 0.0f;
+  thread int tint_symbol_10 = 0;
+  thread int tint_symbol_11 = 0;
+  int const x_3_param = tint_symbol_1.x_3_param;
+  tint_symbol_9 = x_2_param;
+  tint_symbol_10 = x_3_param;
+  main_1(&(tint_symbol_9), &(tint_symbol_10), &(tint_symbol_11));
+  main_out const tint_symbol_4 = {.x_4_1=tint_symbol_11};
+  tint_symbol_3 const tint_symbol_5 = {.x_4_1=tint_symbol_4.x_4_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/1.spvasm.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..99bfcd9
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/1.spvasm.expected.spvasm
@@ -0,0 +1,90 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 52
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_1 %tint_symbol_3
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_2 "x_2"
+               OpName %x_3 "x_3"
+               OpName %x_4 "x_4"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_4_1"
+               OpName %tint_symbol_4 "tint_symbol_4"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %tint_symbol_1 Flat
+               OpDecorate %tint_symbol_3 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+        %x_2 = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+          %9 = OpConstantNull %int
+        %x_3 = OpVariable %_ptr_Private_int Private %9
+        %x_4 = OpVariable %_ptr_Private_int Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Input_int = OpTypePointer Input %int
+%tint_symbol_1 = OpVariable %_ptr_Input_int Input
+%_ptr_Output_int = OpTypePointer Output %int
+%tint_symbol_3 = OpVariable %_ptr_Output_int Output %9
+       %void = OpTypeVoid
+         %17 = OpTypeFunction %void
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %int
+         %38 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %17
+         %20 = OpLabel
+         %21 = OpLoad %v4float %x_2
+         %22 = OpLoad %int %x_3
+         %24 = OpCompositeExtract %float %21 0
+         %23 = OpConvertFToS %int %24
+         %26 = OpBitwiseAnd %int %23 %int_1
+         %28 = OpCompositeExtract %float %21 1
+         %27 = OpConvertFToS %int %28
+         %29 = OpBitwiseAnd %int %27 %int_1
+         %30 = OpIAdd %int %26 %29
+         %31 = OpIAdd %int %30 %22
+         %33 = OpCompositeExtract %float %21 2
+         %32 = OpConvertFToS %int %33
+         %34 = OpIEqual %bool %31 %32
+               OpSelectionMerge %36 None
+               OpBranchConditional %34 %37 %36
+         %37 = OpLabel
+               OpBranch %36
+         %36 = OpLabel
+               OpStore %x_4 %int_1
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_4 = OpFunction %void None %38
+%tint_symbol_2 = OpFunctionParameter %main_out
+         %42 = OpLabel
+         %43 = OpCompositeExtract %int %tint_symbol_2 0
+               OpStore %tint_symbol_3 %43
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %17
+         %45 = OpLabel
+         %46 = OpLoad %v4float %tint_symbol
+               OpStore %x_2 %46
+         %47 = OpLoad %int %tint_symbol_1
+               OpStore %x_3 %47
+         %48 = OpFunctionCall %void %main_1
+         %50 = OpLoad %int %x_4
+         %51 = OpCompositeConstruct %main_out %50
+         %49 = OpFunctionCall %void %tint_symbol_4 %51
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/1.spvasm.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..affcd63
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/1.spvasm.expected.wgsl
@@ -0,0 +1,27 @@
+var<private> x_2 : vec4<f32>;
+
+var<private> x_3 : i32;
+
+var<private> x_4 : i32;
+
+fn main_1() {
+  let x_16 : vec4<f32> = x_2;
+  let x_26 : i32 = x_3;
+  if (((((i32(x_16.x) & 1) + (i32(x_16.y) & 1)) + x_26) == i32(x_16.z))) {
+  }
+  x_4 = 1;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_4_1 : i32;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] x_2_param : vec4<f32>, [[location(0)]] x_3_param : i32) -> main_out {
+  x_2 = x_2_param;
+  x_3 = x_3_param;
+  main_1();
+  return main_out(x_4);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/1.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/1.wgsl
new file mode 100644
index 0000000..affcd63
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/1.wgsl
@@ -0,0 +1,27 @@
+var<private> x_2 : vec4<f32>;
+
+var<private> x_3 : i32;
+
+var<private> x_4 : i32;
+
+fn main_1() {
+  let x_16 : vec4<f32> = x_2;
+  let x_26 : i32 = x_3;
+  if (((((i32(x_16.x) & 1) + (i32(x_16.y) & 1)) + x_26) == i32(x_16.z))) {
+  }
+  x_4 = 1;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_4_1 : i32;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] x_2_param : vec4<f32>, [[location(0)]] x_3_param : i32) -> main_out {
+  x_2 = x_2_param;
+  x_3 = x_3_param;
+  main_1();
+  return main_out(x_4);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/1.wgsl.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..a97b541
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/1.wgsl.expected.hlsl
@@ -0,0 +1,33 @@
+static float4 x_2 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static int x_3 = 0;
+static int x_4 = 0;
+
+void main_1() {
+  const float4 x_16 = x_2;
+  if (((((int(x_16.x) & 1) + (int(x_16.y) & 1)) + x_3) == int(x_16.z))) {
+  }
+  x_4 = 1;
+  return;
+}
+
+struct main_out {
+  int x_4_1;
+};
+struct tint_symbol_1 {
+  int x_3_param : TEXCOORD0;
+  float4 x_2_param : SV_Position;
+};
+struct tint_symbol_2 {
+  int x_4_1 : SV_Target0;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 x_2_param = tint_symbol.x_2_param;
+  const int x_3_param = tint_symbol.x_3_param;
+  x_2 = x_2_param;
+  x_3 = x_3_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_4};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_4_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/1.wgsl.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/1.wgsl.expected.msl
new file mode 100644
index 0000000..a72a509
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/1.wgsl.expected.msl
@@ -0,0 +1,35 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  int x_4_1;
+};
+struct tint_symbol_2 {
+  int x_3_param [[user(locn0)]];
+};
+struct tint_symbol_3 {
+  int x_4_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_6, thread int* const tint_symbol_7, thread int* const tint_symbol_8) {
+  float4 const x_16 = *(tint_symbol_6);
+  int const x_26 = *(tint_symbol_7);
+  if (((((int(x_16.x) & 1) + (int(x_16.y) & 1)) + x_26) == int(x_16.z))) {
+  }
+  *(tint_symbol_8) = 1;
+  return;
+}
+
+fragment tint_symbol_3 tint_symbol(float4 x_2_param [[position]], tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread float4 tint_symbol_9 = 0.0f;
+  thread int tint_symbol_10 = 0;
+  thread int tint_symbol_11 = 0;
+  int const x_3_param = tint_symbol_1.x_3_param;
+  tint_symbol_9 = x_2_param;
+  tint_symbol_10 = x_3_param;
+  main_1(&(tint_symbol_9), &(tint_symbol_10), &(tint_symbol_11));
+  main_out const tint_symbol_4 = {.x_4_1=tint_symbol_11};
+  tint_symbol_3 const tint_symbol_5 = {.x_4_1=tint_symbol_4.x_4_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/1.wgsl.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..99bfcd9
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/1.wgsl.expected.spvasm
@@ -0,0 +1,90 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 52
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_1 %tint_symbol_3
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_2 "x_2"
+               OpName %x_3 "x_3"
+               OpName %x_4 "x_4"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_4_1"
+               OpName %tint_symbol_4 "tint_symbol_4"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %tint_symbol_1 Flat
+               OpDecorate %tint_symbol_3 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+        %x_2 = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+          %9 = OpConstantNull %int
+        %x_3 = OpVariable %_ptr_Private_int Private %9
+        %x_4 = OpVariable %_ptr_Private_int Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Input_int = OpTypePointer Input %int
+%tint_symbol_1 = OpVariable %_ptr_Input_int Input
+%_ptr_Output_int = OpTypePointer Output %int
+%tint_symbol_3 = OpVariable %_ptr_Output_int Output %9
+       %void = OpTypeVoid
+         %17 = OpTypeFunction %void
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %int
+         %38 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %17
+         %20 = OpLabel
+         %21 = OpLoad %v4float %x_2
+         %22 = OpLoad %int %x_3
+         %24 = OpCompositeExtract %float %21 0
+         %23 = OpConvertFToS %int %24
+         %26 = OpBitwiseAnd %int %23 %int_1
+         %28 = OpCompositeExtract %float %21 1
+         %27 = OpConvertFToS %int %28
+         %29 = OpBitwiseAnd %int %27 %int_1
+         %30 = OpIAdd %int %26 %29
+         %31 = OpIAdd %int %30 %22
+         %33 = OpCompositeExtract %float %21 2
+         %32 = OpConvertFToS %int %33
+         %34 = OpIEqual %bool %31 %32
+               OpSelectionMerge %36 None
+               OpBranchConditional %34 %37 %36
+         %37 = OpLabel
+               OpBranch %36
+         %36 = OpLabel
+               OpStore %x_4 %int_1
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_4 = OpFunction %void None %38
+%tint_symbol_2 = OpFunctionParameter %main_out
+         %42 = OpLabel
+         %43 = OpCompositeExtract %int %tint_symbol_2 0
+               OpStore %tint_symbol_3 %43
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %17
+         %45 = OpLabel
+         %46 = OpLoad %v4float %tint_symbol
+               OpStore %x_2 %46
+         %47 = OpLoad %int %tint_symbol_1
+               OpStore %x_3 %47
+         %48 = OpFunctionCall %void %main_1
+         %50 = OpLoad %int %x_4
+         %51 = OpCompositeConstruct %main_out %50
+         %49 = OpFunctionCall %void %tint_symbol_4 %51
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/1.wgsl.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..affcd63
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/1.wgsl.expected.wgsl
@@ -0,0 +1,27 @@
+var<private> x_2 : vec4<f32>;
+
+var<private> x_3 : i32;
+
+var<private> x_4 : i32;
+
+fn main_1() {
+  let x_16 : vec4<f32> = x_2;
+  let x_26 : i32 = x_3;
+  if (((((i32(x_16.x) & 1) + (i32(x_16.y) & 1)) + x_26) == i32(x_16.z))) {
+  }
+  x_4 = 1;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_4_1 : i32;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] x_2_param : vec4<f32>, [[location(0)]] x_3_param : i32) -> main_out {
+  x_2 = x_2_param;
+  x_3 = x_3_param;
+  main_1();
+  return main_out(x_4);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/2-opt.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/2-opt.spvasm
new file mode 100644
index 0000000..c677499
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/2-opt.spvasm
@@ -0,0 +1,53 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %out_data
+               OpExecutionMode %main OriginUpperLeft
+               OpSource GLSL 450
+               OpName %main "main"
+               OpName %x_is_odd "x_is_odd"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %y_is_odd "y_is_odd"
+               OpName %out_data "out_data"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %out_data Location 0
+       %void = OpTypeVoid
+          %8 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+        %int = OpTypeInt 32 1
+      %int_1 = OpConstant %int 1
+     %uint_1 = OpConstant %uint 1
+%_ptr_Output_int = OpTypePointer Output %int
+   %out_data = OpVariable %_ptr_Output_int Output
+      %int_0 = OpConstant %int 0
+       %main = OpFunction %void None %8
+         %22 = OpLabel
+   %x_is_odd = OpVariable %_ptr_Function_bool Function
+   %y_is_odd = OpVariable %_ptr_Function_bool Function
+         %23 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %24 = OpLoad %float %23
+         %25 = OpConvertFToS %int %24
+         %26 = OpBitwiseAnd %int %25 %int_1
+         %27 = OpIEqual %bool %26 %int_1
+               OpStore %x_is_odd %27
+         %28 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %29 = OpLoad %float %28
+         %30 = OpConvertFToS %int %29
+         %31 = OpBitwiseAnd %int %30 %int_1
+         %32 = OpIEqual %bool %31 %int_1
+               OpStore %y_is_odd %32
+         %33 = OpLoad %bool %x_is_odd
+         %34 = OpLoad %bool %y_is_odd
+         %35 = OpLogicalOr %bool %33 %34
+         %36 = OpSelect %int %35 %int_1 %int_0
+               OpStore %out_data %36
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/2-opt.spvasm.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/2-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..1ad88d2
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/2-opt.spvasm.expected.hlsl
@@ -0,0 +1,36 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static int out_data = 0;
+
+void main_1() {
+  bool x_is_odd = false;
+  bool y_is_odd = false;
+  const float x_24 = gl_FragCoord.x;
+  x_is_odd = ((int(x_24) & 1) == 1);
+  const float x_29 = gl_FragCoord.y;
+  y_is_odd = ((int(x_29) & 1) == 1);
+  bool tint_tmp = x_is_odd;
+  if (!tint_tmp) {
+    tint_tmp = y_is_odd;
+  }
+  out_data = ((tint_tmp) ? 1 : 0);
+  return;
+}
+
+struct main_out {
+  int out_data_1;
+};
+struct tint_symbol_1 {
+  float4 gl_FragCoord_param : SV_Position;
+};
+struct tint_symbol_2 {
+  int out_data_1 : SV_Target0;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {out_data};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.out_data_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/2-opt.spvasm.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/2-opt.spvasm.expected.msl
new file mode 100644
index 0000000..a2b97bf
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/2-opt.spvasm.expected.msl
@@ -0,0 +1,33 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  int out_data_1;
+};
+struct tint_symbol_2 {
+  int out_data_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_5, thread int* const tint_symbol_6) {
+  bool x_is_odd = false;
+  bool y_is_odd = false;
+  float const x_24 = (*(tint_symbol_5)).x;
+  x_is_odd = ((int(x_24) & 1) == 1);
+  float const x_29 = (*(tint_symbol_5)).y;
+  y_is_odd = ((int(x_29) & 1) == 1);
+  bool const x_33 = x_is_odd;
+  bool const x_34 = y_is_odd;
+  *(tint_symbol_6) = select(0, 1, (x_33 || x_34));
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread int tint_symbol_8 = 0;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(&(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.out_data_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.out_data_1=tint_symbol_3.out_data_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/2-opt.spvasm.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/2-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..3488753
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/2-opt.spvasm.expected.spvasm
@@ -0,0 +1,95 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 58
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %out_data "out_data"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %x_is_odd "x_is_odd"
+               OpName %y_is_odd "y_is_odd"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "out_data_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+          %9 = OpConstantNull %int
+   %out_data = OpVariable %_ptr_Private_int Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_int = OpTypePointer Output %int
+%tint_symbol_2 = OpVariable %_ptr_Output_int Output %9
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %21 = OpConstantNull %bool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+      %int_1 = OpConstant %int 1
+     %uint_1 = OpConstant %uint 1
+      %int_0 = OpConstant %int 0
+   %main_out = OpTypeStruct %int
+         %45 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+   %x_is_odd = OpVariable %_ptr_Function_bool Function %21
+   %y_is_odd = OpVariable %_ptr_Function_bool Function %21
+         %26 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %27 = OpLoad %float %26
+         %28 = OpConvertFToS %int %27
+         %30 = OpBitwiseAnd %int %28 %int_1
+         %31 = OpIEqual %bool %30 %int_1
+               OpStore %x_is_odd %31
+         %33 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %34 = OpLoad %float %33
+         %35 = OpConvertFToS %int %34
+         %36 = OpBitwiseAnd %int %35 %int_1
+         %37 = OpIEqual %bool %36 %int_1
+               OpStore %y_is_odd %37
+         %38 = OpLoad %bool %x_is_odd
+         %39 = OpLoad %bool %y_is_odd
+               OpSelectionMerge %41 None
+               OpBranchConditional %38 %41 %42
+         %42 = OpLabel
+               OpBranch %41
+         %41 = OpLabel
+         %43 = OpPhi %bool %38 %17 %39 %42
+         %40 = OpSelect %int %43 %int_1 %int_0
+               OpStore %out_data %40
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %45
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %49 = OpLabel
+         %50 = OpCompositeExtract %int %tint_symbol_1 0
+               OpStore %tint_symbol_2 %50
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %52 = OpLabel
+         %53 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %53
+         %54 = OpFunctionCall %void %main_1
+         %56 = OpLoad %int %out_data
+         %57 = OpCompositeConstruct %main_out %56
+         %55 = OpFunctionCall %void %tint_symbol_3 %57
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/2-opt.spvasm.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/2-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..3820a70
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/2-opt.spvasm.expected.wgsl
@@ -0,0 +1,28 @@
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> out_data : i32;
+
+fn main_1() {
+  var x_is_odd : bool;
+  var y_is_odd : bool;
+  let x_24 : f32 = gl_FragCoord.x;
+  x_is_odd = ((i32(x_24) & 1) == 1);
+  let x_29 : f32 = gl_FragCoord.y;
+  y_is_odd = ((i32(x_29) & 1) == 1);
+  let x_33 : bool = x_is_odd;
+  let x_34 : bool = y_is_odd;
+  out_data = select(0, 1, (x_33 || x_34));
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  out_data_1 : i32;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(out_data);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/2-opt.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/2-opt.wgsl
new file mode 100644
index 0000000..3820a70
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/2-opt.wgsl
@@ -0,0 +1,28 @@
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> out_data : i32;
+
+fn main_1() {
+  var x_is_odd : bool;
+  var y_is_odd : bool;
+  let x_24 : f32 = gl_FragCoord.x;
+  x_is_odd = ((i32(x_24) & 1) == 1);
+  let x_29 : f32 = gl_FragCoord.y;
+  y_is_odd = ((i32(x_29) & 1) == 1);
+  let x_33 : bool = x_is_odd;
+  let x_34 : bool = y_is_odd;
+  out_data = select(0, 1, (x_33 || x_34));
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  out_data_1 : i32;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(out_data);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/2-opt.wgsl.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/2-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..1ad88d2
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/2-opt.wgsl.expected.hlsl
@@ -0,0 +1,36 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static int out_data = 0;
+
+void main_1() {
+  bool x_is_odd = false;
+  bool y_is_odd = false;
+  const float x_24 = gl_FragCoord.x;
+  x_is_odd = ((int(x_24) & 1) == 1);
+  const float x_29 = gl_FragCoord.y;
+  y_is_odd = ((int(x_29) & 1) == 1);
+  bool tint_tmp = x_is_odd;
+  if (!tint_tmp) {
+    tint_tmp = y_is_odd;
+  }
+  out_data = ((tint_tmp) ? 1 : 0);
+  return;
+}
+
+struct main_out {
+  int out_data_1;
+};
+struct tint_symbol_1 {
+  float4 gl_FragCoord_param : SV_Position;
+};
+struct tint_symbol_2 {
+  int out_data_1 : SV_Target0;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {out_data};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.out_data_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/2-opt.wgsl.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/2-opt.wgsl.expected.msl
new file mode 100644
index 0000000..a2b97bf
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/2-opt.wgsl.expected.msl
@@ -0,0 +1,33 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  int out_data_1;
+};
+struct tint_symbol_2 {
+  int out_data_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_5, thread int* const tint_symbol_6) {
+  bool x_is_odd = false;
+  bool y_is_odd = false;
+  float const x_24 = (*(tint_symbol_5)).x;
+  x_is_odd = ((int(x_24) & 1) == 1);
+  float const x_29 = (*(tint_symbol_5)).y;
+  y_is_odd = ((int(x_29) & 1) == 1);
+  bool const x_33 = x_is_odd;
+  bool const x_34 = y_is_odd;
+  *(tint_symbol_6) = select(0, 1, (x_33 || x_34));
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread int tint_symbol_8 = 0;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(&(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.out_data_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.out_data_1=tint_symbol_3.out_data_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/2-opt.wgsl.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/2-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..3488753
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/2-opt.wgsl.expected.spvasm
@@ -0,0 +1,95 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 58
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %out_data "out_data"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %x_is_odd "x_is_odd"
+               OpName %y_is_odd "y_is_odd"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "out_data_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+          %9 = OpConstantNull %int
+   %out_data = OpVariable %_ptr_Private_int Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_int = OpTypePointer Output %int
+%tint_symbol_2 = OpVariable %_ptr_Output_int Output %9
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %21 = OpConstantNull %bool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+      %int_1 = OpConstant %int 1
+     %uint_1 = OpConstant %uint 1
+      %int_0 = OpConstant %int 0
+   %main_out = OpTypeStruct %int
+         %45 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+   %x_is_odd = OpVariable %_ptr_Function_bool Function %21
+   %y_is_odd = OpVariable %_ptr_Function_bool Function %21
+         %26 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %27 = OpLoad %float %26
+         %28 = OpConvertFToS %int %27
+         %30 = OpBitwiseAnd %int %28 %int_1
+         %31 = OpIEqual %bool %30 %int_1
+               OpStore %x_is_odd %31
+         %33 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %34 = OpLoad %float %33
+         %35 = OpConvertFToS %int %34
+         %36 = OpBitwiseAnd %int %35 %int_1
+         %37 = OpIEqual %bool %36 %int_1
+               OpStore %y_is_odd %37
+         %38 = OpLoad %bool %x_is_odd
+         %39 = OpLoad %bool %y_is_odd
+               OpSelectionMerge %41 None
+               OpBranchConditional %38 %41 %42
+         %42 = OpLabel
+               OpBranch %41
+         %41 = OpLabel
+         %43 = OpPhi %bool %38 %17 %39 %42
+         %40 = OpSelect %int %43 %int_1 %int_0
+               OpStore %out_data %40
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %45
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %49 = OpLabel
+         %50 = OpCompositeExtract %int %tint_symbol_1 0
+               OpStore %tint_symbol_2 %50
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %52 = OpLabel
+         %53 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %53
+         %54 = OpFunctionCall %void %main_1
+         %56 = OpLoad %int %out_data
+         %57 = OpCompositeConstruct %main_out %56
+         %55 = OpFunctionCall %void %tint_symbol_3 %57
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/2-opt.wgsl.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/2-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..3820a70
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/2-opt.wgsl.expected.wgsl
@@ -0,0 +1,28 @@
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> out_data : i32;
+
+fn main_1() {
+  var x_is_odd : bool;
+  var y_is_odd : bool;
+  let x_24 : f32 = gl_FragCoord.x;
+  x_is_odd = ((i32(x_24) & 1) == 1);
+  let x_29 : f32 = gl_FragCoord.y;
+  y_is_odd = ((i32(x_29) & 1) == 1);
+  let x_33 : bool = x_is_odd;
+  let x_34 : bool = y_is_odd;
+  out_data = select(0, 1, (x_33 || x_34));
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  out_data_1 : i32;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(out_data);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write_before_terminate/1.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write_before_terminate/1.spvasm
new file mode 100644
index 0000000..0a6b240
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write_before_terminate/1.spvasm
@@ -0,0 +1,45 @@
+               OpCapability Shader
+               OpExtension "SPV_KHR_terminate_invocation"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %1 "main" %gl_FragCoord %3 %4
+               OpExecutionMode %1 OriginUpperLeft
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %3 Location 0
+               OpDecorate %3 Flat
+               OpDecorate %4 Location 0
+       %void = OpTypeVoid
+       %bool = OpTypeBool
+        %int = OpTypeInt 32 1
+      %int_1 = OpConstant %int 1
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_int = OpTypePointer Input %int
+%_ptr_Output_int = OpTypePointer Output %int
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+          %3 = OpVariable %_ptr_Input_int Input
+          %4 = OpVariable %_ptr_Output_int Output
+         %14 = OpTypeFunction %void
+          %1 = OpFunction %void None %14
+         %15 = OpLabel
+         %16 = OpLoad %v4float %gl_FragCoord
+         %17 = OpCompositeExtract %float %16 0
+         %18 = OpCompositeExtract %float %16 1
+         %19 = OpCompositeExtract %float %16 2
+         %20 = OpConvertFToS %int %17
+         %21 = OpConvertFToS %int %18
+         %22 = OpConvertFToS %int %19
+         %23 = OpBitwiseAnd %int %20 %int_1
+         %24 = OpBitwiseAnd %int %21 %int_1
+         %25 = OpIAdd %int %23 %24
+         %26 = OpLoad %int %3
+               OpStore %4 %int_1
+         %27 = OpIAdd %int %25 %26
+         %28 = OpIEqual %bool %27 %22
+               OpSelectionMerge %29 None
+               OpBranchConditional %28 %30 %29
+         %30 = OpLabel
+               OpTerminateInvocation
+         %29 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write_before_terminate/1.spvasm.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write_before_terminate/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..e3d1bee
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write_before_terminate/1.spvasm.expected.hlsl
@@ -0,0 +1,34 @@
+static float4 x_2 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static int x_3 = 0;
+static int x_4 = 0;
+
+void main_1() {
+  const float4 x_16 = x_2;
+  const int x_26 = x_3;
+  x_4 = 1;
+  if (((((int(x_16.x) & 1) + (int(x_16.y) & 1)) + x_26) == int(x_16.z))) {
+  }
+  return;
+}
+
+struct main_out {
+  int x_4_1;
+};
+struct tint_symbol_1 {
+  int x_3_param : TEXCOORD0;
+  float4 x_2_param : SV_Position;
+};
+struct tint_symbol_2 {
+  int x_4_1 : SV_Target0;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 x_2_param = tint_symbol.x_2_param;
+  const int x_3_param = tint_symbol.x_3_param;
+  x_2 = x_2_param;
+  x_3 = x_3_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_4};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_4_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write_before_terminate/1.spvasm.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write_before_terminate/1.spvasm.expected.msl
new file mode 100644
index 0000000..06facd9
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write_before_terminate/1.spvasm.expected.msl
@@ -0,0 +1,35 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  int x_4_1;
+};
+struct tint_symbol_2 {
+  int x_3_param [[user(locn0)]];
+};
+struct tint_symbol_3 {
+  int x_4_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_6, thread int* const tint_symbol_7, thread int* const tint_symbol_8) {
+  float4 const x_16 = *(tint_symbol_6);
+  int const x_26 = *(tint_symbol_7);
+  *(tint_symbol_8) = 1;
+  if (((((int(x_16.x) & 1) + (int(x_16.y) & 1)) + x_26) == int(x_16.z))) {
+  }
+  return;
+}
+
+fragment tint_symbol_3 tint_symbol(float4 x_2_param [[position]], tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread float4 tint_symbol_9 = 0.0f;
+  thread int tint_symbol_10 = 0;
+  thread int tint_symbol_11 = 0;
+  int const x_3_param = tint_symbol_1.x_3_param;
+  tint_symbol_9 = x_2_param;
+  tint_symbol_10 = x_3_param;
+  main_1(&(tint_symbol_9), &(tint_symbol_10), &(tint_symbol_11));
+  main_out const tint_symbol_4 = {.x_4_1=tint_symbol_11};
+  tint_symbol_3 const tint_symbol_5 = {.x_4_1=tint_symbol_4.x_4_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write_before_terminate/1.spvasm.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write_before_terminate/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..6d9599f
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write_before_terminate/1.spvasm.expected.spvasm
@@ -0,0 +1,90 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 52
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_1 %tint_symbol_3
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_2 "x_2"
+               OpName %x_3 "x_3"
+               OpName %x_4 "x_4"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_4_1"
+               OpName %tint_symbol_4 "tint_symbol_4"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %tint_symbol_1 Flat
+               OpDecorate %tint_symbol_3 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+        %x_2 = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+          %9 = OpConstantNull %int
+        %x_3 = OpVariable %_ptr_Private_int Private %9
+        %x_4 = OpVariable %_ptr_Private_int Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Input_int = OpTypePointer Input %int
+%tint_symbol_1 = OpVariable %_ptr_Input_int Input
+%_ptr_Output_int = OpTypePointer Output %int
+%tint_symbol_3 = OpVariable %_ptr_Output_int Output %9
+       %void = OpTypeVoid
+         %17 = OpTypeFunction %void
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %int
+         %38 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %17
+         %20 = OpLabel
+         %21 = OpLoad %v4float %x_2
+         %22 = OpLoad %int %x_3
+               OpStore %x_4 %int_1
+         %25 = OpCompositeExtract %float %21 0
+         %24 = OpConvertFToS %int %25
+         %26 = OpBitwiseAnd %int %24 %int_1
+         %28 = OpCompositeExtract %float %21 1
+         %27 = OpConvertFToS %int %28
+         %29 = OpBitwiseAnd %int %27 %int_1
+         %30 = OpIAdd %int %26 %29
+         %31 = OpIAdd %int %30 %22
+         %33 = OpCompositeExtract %float %21 2
+         %32 = OpConvertFToS %int %33
+         %34 = OpIEqual %bool %31 %32
+               OpSelectionMerge %36 None
+               OpBranchConditional %34 %37 %36
+         %37 = OpLabel
+               OpBranch %36
+         %36 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_4 = OpFunction %void None %38
+%tint_symbol_2 = OpFunctionParameter %main_out
+         %42 = OpLabel
+         %43 = OpCompositeExtract %int %tint_symbol_2 0
+               OpStore %tint_symbol_3 %43
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %17
+         %45 = OpLabel
+         %46 = OpLoad %v4float %tint_symbol
+               OpStore %x_2 %46
+         %47 = OpLoad %int %tint_symbol_1
+               OpStore %x_3 %47
+         %48 = OpFunctionCall %void %main_1
+         %50 = OpLoad %int %x_4
+         %51 = OpCompositeConstruct %main_out %50
+         %49 = OpFunctionCall %void %tint_symbol_4 %51
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write_before_terminate/1.spvasm.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write_before_terminate/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..e0e933a
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write_before_terminate/1.spvasm.expected.wgsl
@@ -0,0 +1,27 @@
+var<private> x_2 : vec4<f32>;
+
+var<private> x_3 : i32;
+
+var<private> x_4 : i32;
+
+fn main_1() {
+  let x_16 : vec4<f32> = x_2;
+  let x_26 : i32 = x_3;
+  x_4 = 1;
+  if (((((i32(x_16.x) & 1) + (i32(x_16.y) & 1)) + x_26) == i32(x_16.z))) {
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_4_1 : i32;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] x_2_param : vec4<f32>, [[location(0)]] x_3_param : i32) -> main_out {
+  x_2 = x_2_param;
+  x_3 = x_3_param;
+  main_1();
+  return main_out(x_4);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write_before_terminate/1.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write_before_terminate/1.wgsl
new file mode 100644
index 0000000..e0e933a
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write_before_terminate/1.wgsl
@@ -0,0 +1,27 @@
+var<private> x_2 : vec4<f32>;
+
+var<private> x_3 : i32;
+
+var<private> x_4 : i32;
+
+fn main_1() {
+  let x_16 : vec4<f32> = x_2;
+  let x_26 : i32 = x_3;
+  x_4 = 1;
+  if (((((i32(x_16.x) & 1) + (i32(x_16.y) & 1)) + x_26) == i32(x_16.z))) {
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_4_1 : i32;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] x_2_param : vec4<f32>, [[location(0)]] x_3_param : i32) -> main_out {
+  x_2 = x_2_param;
+  x_3 = x_3_param;
+  main_1();
+  return main_out(x_4);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write_before_terminate/1.wgsl.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write_before_terminate/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..e3d1bee
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write_before_terminate/1.wgsl.expected.hlsl
@@ -0,0 +1,34 @@
+static float4 x_2 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static int x_3 = 0;
+static int x_4 = 0;
+
+void main_1() {
+  const float4 x_16 = x_2;
+  const int x_26 = x_3;
+  x_4 = 1;
+  if (((((int(x_16.x) & 1) + (int(x_16.y) & 1)) + x_26) == int(x_16.z))) {
+  }
+  return;
+}
+
+struct main_out {
+  int x_4_1;
+};
+struct tint_symbol_1 {
+  int x_3_param : TEXCOORD0;
+  float4 x_2_param : SV_Position;
+};
+struct tint_symbol_2 {
+  int x_4_1 : SV_Target0;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 x_2_param = tint_symbol.x_2_param;
+  const int x_3_param = tint_symbol.x_3_param;
+  x_2 = x_2_param;
+  x_3 = x_3_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_4};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_4_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write_before_terminate/1.wgsl.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write_before_terminate/1.wgsl.expected.msl
new file mode 100644
index 0000000..06facd9
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write_before_terminate/1.wgsl.expected.msl
@@ -0,0 +1,35 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  int x_4_1;
+};
+struct tint_symbol_2 {
+  int x_3_param [[user(locn0)]];
+};
+struct tint_symbol_3 {
+  int x_4_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_6, thread int* const tint_symbol_7, thread int* const tint_symbol_8) {
+  float4 const x_16 = *(tint_symbol_6);
+  int const x_26 = *(tint_symbol_7);
+  *(tint_symbol_8) = 1;
+  if (((((int(x_16.x) & 1) + (int(x_16.y) & 1)) + x_26) == int(x_16.z))) {
+  }
+  return;
+}
+
+fragment tint_symbol_3 tint_symbol(float4 x_2_param [[position]], tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread float4 tint_symbol_9 = 0.0f;
+  thread int tint_symbol_10 = 0;
+  thread int tint_symbol_11 = 0;
+  int const x_3_param = tint_symbol_1.x_3_param;
+  tint_symbol_9 = x_2_param;
+  tint_symbol_10 = x_3_param;
+  main_1(&(tint_symbol_9), &(tint_symbol_10), &(tint_symbol_11));
+  main_out const tint_symbol_4 = {.x_4_1=tint_symbol_11};
+  tint_symbol_3 const tint_symbol_5 = {.x_4_1=tint_symbol_4.x_4_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write_before_terminate/1.wgsl.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write_before_terminate/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..6d9599f
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write_before_terminate/1.wgsl.expected.spvasm
@@ -0,0 +1,90 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 52
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_1 %tint_symbol_3
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_2 "x_2"
+               OpName %x_3 "x_3"
+               OpName %x_4 "x_4"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_4_1"
+               OpName %tint_symbol_4 "tint_symbol_4"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %tint_symbol_1 Flat
+               OpDecorate %tint_symbol_3 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+        %x_2 = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+          %9 = OpConstantNull %int
+        %x_3 = OpVariable %_ptr_Private_int Private %9
+        %x_4 = OpVariable %_ptr_Private_int Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Input_int = OpTypePointer Input %int
+%tint_symbol_1 = OpVariable %_ptr_Input_int Input
+%_ptr_Output_int = OpTypePointer Output %int
+%tint_symbol_3 = OpVariable %_ptr_Output_int Output %9
+       %void = OpTypeVoid
+         %17 = OpTypeFunction %void
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %int
+         %38 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %17
+         %20 = OpLabel
+         %21 = OpLoad %v4float %x_2
+         %22 = OpLoad %int %x_3
+               OpStore %x_4 %int_1
+         %25 = OpCompositeExtract %float %21 0
+         %24 = OpConvertFToS %int %25
+         %26 = OpBitwiseAnd %int %24 %int_1
+         %28 = OpCompositeExtract %float %21 1
+         %27 = OpConvertFToS %int %28
+         %29 = OpBitwiseAnd %int %27 %int_1
+         %30 = OpIAdd %int %26 %29
+         %31 = OpIAdd %int %30 %22
+         %33 = OpCompositeExtract %float %21 2
+         %32 = OpConvertFToS %int %33
+         %34 = OpIEqual %bool %31 %32
+               OpSelectionMerge %36 None
+               OpBranchConditional %34 %37 %36
+         %37 = OpLabel
+               OpBranch %36
+         %36 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_4 = OpFunction %void None %38
+%tint_symbol_2 = OpFunctionParameter %main_out
+         %42 = OpLabel
+         %43 = OpCompositeExtract %int %tint_symbol_2 0
+               OpStore %tint_symbol_3 %43
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %17
+         %45 = OpLabel
+         %46 = OpLoad %v4float %tint_symbol
+               OpStore %x_2 %46
+         %47 = OpLoad %int %tint_symbol_1
+               OpStore %x_3 %47
+         %48 = OpFunctionCall %void %main_1
+         %50 = OpLoad %int %x_4
+         %51 = OpCompositeConstruct %main_out %50
+         %49 = OpFunctionCall %void %tint_symbol_4 %51
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write_before_terminate/1.wgsl.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write_before_terminate/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..e0e933a
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write_before_terminate/1.wgsl.expected.wgsl
@@ -0,0 +1,27 @@
+var<private> x_2 : vec4<f32>;
+
+var<private> x_3 : i32;
+
+var<private> x_4 : i32;
+
+fn main_1() {
+  let x_16 : vec4<f32> = x_2;
+  let x_26 : i32 = x_3;
+  x_4 = 1;
+  if (((((i32(x_16.x) & 1) + (i32(x_16.y) & 1)) + x_26) == i32(x_16.z))) {
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_4_1 : i32;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] x_2_param : vec4<f32>, [[location(0)]] x_3_param : i32) -> main_out {
+  x_2 = x_2_param;
+  x_3 = x_3_param;
+  main_1();
+  return main_out(x_4);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_ssbo_store/1.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_ssbo_store/1.spvasm
new file mode 100644
index 0000000..0adb9cb
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_ssbo_store/1.spvasm
@@ -0,0 +1,62 @@
+               OpCapability Shader
+               OpExtension "SPV_KHR_terminate_invocation"
+               OpExtension "SPV_KHR_storage_buffer_storage_class"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %1 "main" %gl_FragCoord %3 %4
+               OpExecutionMode %1 OriginUpperLeft
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %3 Location 0
+               OpDecorate %3 Flat
+               OpDecorate %4 Location 0
+               OpDecorate %5 DescriptorSet 0
+               OpDecorate %5 Binding 0
+               OpDecorate %_struct_6 Block
+               OpMemberDecorate %_struct_6 0 Offset 0
+               OpDecorate %_runtimearr_int ArrayStride 4
+       %void = OpTypeVoid
+       %bool = OpTypeBool
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+      %int_8 = OpConstant %int 8
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_int = OpTypePointer Input %int
+%_ptr_Output_int = OpTypePointer Output %int
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+          %3 = OpVariable %_ptr_Input_int Input
+          %4 = OpVariable %_ptr_Output_int Output
+%_runtimearr_int = OpTypeRuntimeArray %int
+  %_struct_6 = OpTypeStruct %_runtimearr_int
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+%_ptr_StorageBuffer__struct_6 = OpTypePointer StorageBuffer %_struct_6
+          %5 = OpVariable %_ptr_StorageBuffer__struct_6 StorageBuffer
+         %21 = OpTypeFunction %void
+          %1 = OpFunction %void None %21
+         %22 = OpLabel
+               OpStore %4 %int_1
+         %23 = OpLoad %v4float %gl_FragCoord
+         %24 = OpCompositeExtract %float %23 0
+         %25 = OpCompositeExtract %float %23 1
+         %26 = OpCompositeExtract %float %23 2
+         %27 = OpConvertFToS %int %24
+         %28 = OpConvertFToS %int %25
+         %29 = OpConvertFToS %int %26
+         %30 = OpBitwiseAnd %int %27 %int_1
+         %31 = OpBitwiseAnd %int %28 %int_1
+         %32 = OpIAdd %int %30 %31
+         %33 = OpLoad %int %3
+         %34 = OpIAdd %int %32 %33
+         %35 = OpIEqual %bool %34 %29
+               OpSelectionMerge %36 None
+               OpBranchConditional %35 %37 %36
+         %37 = OpLabel
+               OpTerminateInvocation
+         %36 = OpLabel
+         %38 = OpIMul %int %28 %int_8
+         %39 = OpIAdd %int %27 %38
+         %40 = OpAccessChain %_ptr_StorageBuffer_int %5 %int_0 %39
+               OpStore %40 %27
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_ssbo_store/1.spvasm.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_ssbo_store/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..ad10f80
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_ssbo_store/1.spvasm.expected.hlsl
@@ -0,0 +1,37 @@
+static float4 x_2 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static int x_3 = 0;
+static int x_4 = 0;
+RWByteAddressBuffer x_5 : register(u0, space0);
+
+void main_1() {
+  x_4 = 1;
+  const float4 x_23 = x_2;
+  const int x_27 = int(x_23.x);
+  const int x_28 = int(x_23.y);
+  if (((((x_27 & 1) + (x_28 & 1)) + x_3) == int(x_23.z))) {
+  }
+  x_5.Store((4u * uint((x_27 + (x_28 * 8)))), asuint(x_27));
+  return;
+}
+
+struct main_out {
+  int x_4_1;
+};
+struct tint_symbol_1 {
+  int x_3_param : TEXCOORD0;
+  float4 x_2_param : SV_Position;
+};
+struct tint_symbol_2 {
+  int x_4_1 : SV_Target0;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 x_2_param = tint_symbol.x_2_param;
+  const int x_3_param = tint_symbol.x_3_param;
+  x_2 = x_2_param;
+  x_3 = x_3_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_4};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_4_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_ssbo_store/1.spvasm.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_ssbo_store/1.spvasm.expected.msl
new file mode 100644
index 0000000..bf23c88
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_ssbo_store/1.spvasm.expected.msl
@@ -0,0 +1,41 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  /* 0x0000 */ int field0[1];
+};
+struct main_out {
+  int x_4_1;
+};
+struct tint_symbol_2 {
+  int x_3_param [[user(locn0)]];
+};
+struct tint_symbol_3 {
+  int x_4_1 [[color(0)]];
+};
+
+void main_1(device S& x_5, thread int* const tint_symbol_6, thread float4* const tint_symbol_7, thread int* const tint_symbol_8) {
+  *(tint_symbol_6) = 1;
+  float4 const x_23 = *(tint_symbol_7);
+  int const x_27 = int(x_23.x);
+  int const x_28 = int(x_23.y);
+  int const x_33 = *(tint_symbol_8);
+  if (((((x_27 & 1) + (x_28 & 1)) + x_33) == int(x_23.z))) {
+  }
+  x_5.field0[(x_27 + (x_28 * 8))] = x_27;
+  return;
+}
+
+fragment tint_symbol_3 tint_symbol(float4 x_2_param [[position]], tint_symbol_2 tint_symbol_1 [[stage_in]], device S& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_9 = 0.0f;
+  thread int tint_symbol_10 = 0;
+  thread int tint_symbol_11 = 0;
+  int const x_3_param = tint_symbol_1.x_3_param;
+  tint_symbol_9 = x_2_param;
+  tint_symbol_10 = x_3_param;
+  main_1(x_5, &(tint_symbol_11), &(tint_symbol_9), &(tint_symbol_10));
+  main_out const tint_symbol_4 = {.x_4_1=tint_symbol_11};
+  tint_symbol_3 const tint_symbol_5 = {.x_4_1=tint_symbol_4.x_4_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_ssbo_store/1.spvasm.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_ssbo_store/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..fef8d54
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_ssbo_store/1.spvasm.expected.spvasm
@@ -0,0 +1,110 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 63
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_1 %tint_symbol_3
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_2 "x_2"
+               OpName %x_3 "x_3"
+               OpName %x_4 "x_4"
+               OpName %S "S"
+               OpMemberName %S 0 "field0"
+               OpName %x_5 "x_5"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_4_1"
+               OpName %tint_symbol_4 "tint_symbol_4"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main "main"
+               OpDecorate %S Block
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %_runtimearr_int ArrayStride 4
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %tint_symbol_1 Flat
+               OpDecorate %tint_symbol_3 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+        %x_2 = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+          %9 = OpConstantNull %int
+        %x_3 = OpVariable %_ptr_Private_int Private %9
+        %x_4 = OpVariable %_ptr_Private_int Private %9
+%_runtimearr_int = OpTypeRuntimeArray %int
+          %S = OpTypeStruct %_runtimearr_int
+%_ptr_StorageBuffer_S = OpTypePointer StorageBuffer %S
+        %x_5 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Input_int = OpTypePointer Input %int
+%tint_symbol_1 = OpVariable %_ptr_Input_int Input
+%_ptr_Output_int = OpTypePointer Output %int
+%tint_symbol_3 = OpVariable %_ptr_Output_int Output %9
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+      %int_8 = OpConstant %int 8
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+   %main_out = OpTypeStruct %int
+         %49 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %21
+         %24 = OpLabel
+               OpStore %x_4 %int_1
+         %26 = OpLoad %v4float %x_2
+         %28 = OpCompositeExtract %float %26 0
+         %27 = OpConvertFToS %int %28
+         %30 = OpCompositeExtract %float %26 1
+         %29 = OpConvertFToS %int %30
+         %31 = OpLoad %int %x_3
+         %32 = OpBitwiseAnd %int %27 %int_1
+         %33 = OpBitwiseAnd %int %29 %int_1
+         %34 = OpIAdd %int %32 %33
+         %35 = OpIAdd %int %34 %31
+         %37 = OpCompositeExtract %float %26 2
+         %36 = OpConvertFToS %int %37
+         %38 = OpIEqual %bool %35 %36
+               OpSelectionMerge %40 None
+               OpBranchConditional %38 %41 %40
+         %41 = OpLabel
+               OpBranch %40
+         %40 = OpLabel
+         %45 = OpIMul %int %29 %int_8
+         %46 = OpIAdd %int %27 %45
+         %48 = OpAccessChain %_ptr_StorageBuffer_int %x_5 %uint_0 %46
+               OpStore %48 %27
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_4 = OpFunction %void None %49
+%tint_symbol_2 = OpFunctionParameter %main_out
+         %53 = OpLabel
+         %54 = OpCompositeExtract %int %tint_symbol_2 0
+               OpStore %tint_symbol_3 %54
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %21
+         %56 = OpLabel
+         %57 = OpLoad %v4float %tint_symbol
+               OpStore %x_2 %57
+         %58 = OpLoad %int %tint_symbol_1
+               OpStore %x_3 %58
+         %59 = OpFunctionCall %void %main_1
+         %61 = OpLoad %int %x_4
+         %62 = OpCompositeConstruct %main_out %61
+         %60 = OpFunctionCall %void %tint_symbol_4 %62
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_ssbo_store/1.spvasm.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_ssbo_store/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..8bf85f1
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_ssbo_store/1.spvasm.expected.wgsl
@@ -0,0 +1,39 @@
+type RTArr = [[stride(4)]] array<i32>;
+
+[[block]]
+struct S {
+  field0 : RTArr;
+};
+
+var<private> x_2 : vec4<f32>;
+
+var<private> x_3 : i32;
+
+var<private> x_4 : i32;
+
+[[group(0), binding(0)]] var<storage, read_write> x_5 : S;
+
+fn main_1() {
+  x_4 = 1;
+  let x_23 : vec4<f32> = x_2;
+  let x_27 : i32 = i32(x_23.x);
+  let x_28 : i32 = i32(x_23.y);
+  let x_33 : i32 = x_3;
+  if (((((x_27 & 1) + (x_28 & 1)) + x_33) == i32(x_23.z))) {
+  }
+  x_5.field0[(x_27 + (x_28 * 8))] = x_27;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_4_1 : i32;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] x_2_param : vec4<f32>, [[location(0)]] x_3_param : i32) -> main_out {
+  x_2 = x_2_param;
+  x_3 = x_3_param;
+  main_1();
+  return main_out(x_4);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_ssbo_store/1.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_ssbo_store/1.wgsl
new file mode 100644
index 0000000..8bf85f1
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_ssbo_store/1.wgsl
@@ -0,0 +1,39 @@
+type RTArr = [[stride(4)]] array<i32>;
+
+[[block]]
+struct S {
+  field0 : RTArr;
+};
+
+var<private> x_2 : vec4<f32>;
+
+var<private> x_3 : i32;
+
+var<private> x_4 : i32;
+
+[[group(0), binding(0)]] var<storage, read_write> x_5 : S;
+
+fn main_1() {
+  x_4 = 1;
+  let x_23 : vec4<f32> = x_2;
+  let x_27 : i32 = i32(x_23.x);
+  let x_28 : i32 = i32(x_23.y);
+  let x_33 : i32 = x_3;
+  if (((((x_27 & 1) + (x_28 & 1)) + x_33) == i32(x_23.z))) {
+  }
+  x_5.field0[(x_27 + (x_28 * 8))] = x_27;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_4_1 : i32;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] x_2_param : vec4<f32>, [[location(0)]] x_3_param : i32) -> main_out {
+  x_2 = x_2_param;
+  x_3 = x_3_param;
+  main_1();
+  return main_out(x_4);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_ssbo_store/1.wgsl.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_ssbo_store/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..ad10f80
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_ssbo_store/1.wgsl.expected.hlsl
@@ -0,0 +1,37 @@
+static float4 x_2 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static int x_3 = 0;
+static int x_4 = 0;
+RWByteAddressBuffer x_5 : register(u0, space0);
+
+void main_1() {
+  x_4 = 1;
+  const float4 x_23 = x_2;
+  const int x_27 = int(x_23.x);
+  const int x_28 = int(x_23.y);
+  if (((((x_27 & 1) + (x_28 & 1)) + x_3) == int(x_23.z))) {
+  }
+  x_5.Store((4u * uint((x_27 + (x_28 * 8)))), asuint(x_27));
+  return;
+}
+
+struct main_out {
+  int x_4_1;
+};
+struct tint_symbol_1 {
+  int x_3_param : TEXCOORD0;
+  float4 x_2_param : SV_Position;
+};
+struct tint_symbol_2 {
+  int x_4_1 : SV_Target0;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 x_2_param = tint_symbol.x_2_param;
+  const int x_3_param = tint_symbol.x_3_param;
+  x_2 = x_2_param;
+  x_3 = x_3_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_4};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_4_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_ssbo_store/1.wgsl.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_ssbo_store/1.wgsl.expected.msl
new file mode 100644
index 0000000..bf23c88
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_ssbo_store/1.wgsl.expected.msl
@@ -0,0 +1,41 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  /* 0x0000 */ int field0[1];
+};
+struct main_out {
+  int x_4_1;
+};
+struct tint_symbol_2 {
+  int x_3_param [[user(locn0)]];
+};
+struct tint_symbol_3 {
+  int x_4_1 [[color(0)]];
+};
+
+void main_1(device S& x_5, thread int* const tint_symbol_6, thread float4* const tint_symbol_7, thread int* const tint_symbol_8) {
+  *(tint_symbol_6) = 1;
+  float4 const x_23 = *(tint_symbol_7);
+  int const x_27 = int(x_23.x);
+  int const x_28 = int(x_23.y);
+  int const x_33 = *(tint_symbol_8);
+  if (((((x_27 & 1) + (x_28 & 1)) + x_33) == int(x_23.z))) {
+  }
+  x_5.field0[(x_27 + (x_28 * 8))] = x_27;
+  return;
+}
+
+fragment tint_symbol_3 tint_symbol(float4 x_2_param [[position]], tint_symbol_2 tint_symbol_1 [[stage_in]], device S& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_9 = 0.0f;
+  thread int tint_symbol_10 = 0;
+  thread int tint_symbol_11 = 0;
+  int const x_3_param = tint_symbol_1.x_3_param;
+  tint_symbol_9 = x_2_param;
+  tint_symbol_10 = x_3_param;
+  main_1(x_5, &(tint_symbol_11), &(tint_symbol_9), &(tint_symbol_10));
+  main_out const tint_symbol_4 = {.x_4_1=tint_symbol_11};
+  tint_symbol_3 const tint_symbol_5 = {.x_4_1=tint_symbol_4.x_4_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_ssbo_store/1.wgsl.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_ssbo_store/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..fef8d54
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_ssbo_store/1.wgsl.expected.spvasm
@@ -0,0 +1,110 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 63
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_1 %tint_symbol_3
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_2 "x_2"
+               OpName %x_3 "x_3"
+               OpName %x_4 "x_4"
+               OpName %S "S"
+               OpMemberName %S 0 "field0"
+               OpName %x_5 "x_5"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_4_1"
+               OpName %tint_symbol_4 "tint_symbol_4"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main "main"
+               OpDecorate %S Block
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %_runtimearr_int ArrayStride 4
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %tint_symbol_1 Flat
+               OpDecorate %tint_symbol_3 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+        %x_2 = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+          %9 = OpConstantNull %int
+        %x_3 = OpVariable %_ptr_Private_int Private %9
+        %x_4 = OpVariable %_ptr_Private_int Private %9
+%_runtimearr_int = OpTypeRuntimeArray %int
+          %S = OpTypeStruct %_runtimearr_int
+%_ptr_StorageBuffer_S = OpTypePointer StorageBuffer %S
+        %x_5 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Input_int = OpTypePointer Input %int
+%tint_symbol_1 = OpVariable %_ptr_Input_int Input
+%_ptr_Output_int = OpTypePointer Output %int
+%tint_symbol_3 = OpVariable %_ptr_Output_int Output %9
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+      %int_8 = OpConstant %int 8
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+   %main_out = OpTypeStruct %int
+         %49 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %21
+         %24 = OpLabel
+               OpStore %x_4 %int_1
+         %26 = OpLoad %v4float %x_2
+         %28 = OpCompositeExtract %float %26 0
+         %27 = OpConvertFToS %int %28
+         %30 = OpCompositeExtract %float %26 1
+         %29 = OpConvertFToS %int %30
+         %31 = OpLoad %int %x_3
+         %32 = OpBitwiseAnd %int %27 %int_1
+         %33 = OpBitwiseAnd %int %29 %int_1
+         %34 = OpIAdd %int %32 %33
+         %35 = OpIAdd %int %34 %31
+         %37 = OpCompositeExtract %float %26 2
+         %36 = OpConvertFToS %int %37
+         %38 = OpIEqual %bool %35 %36
+               OpSelectionMerge %40 None
+               OpBranchConditional %38 %41 %40
+         %41 = OpLabel
+               OpBranch %40
+         %40 = OpLabel
+         %45 = OpIMul %int %29 %int_8
+         %46 = OpIAdd %int %27 %45
+         %48 = OpAccessChain %_ptr_StorageBuffer_int %x_5 %uint_0 %46
+               OpStore %48 %27
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_4 = OpFunction %void None %49
+%tint_symbol_2 = OpFunctionParameter %main_out
+         %53 = OpLabel
+         %54 = OpCompositeExtract %int %tint_symbol_2 0
+               OpStore %tint_symbol_3 %54
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %21
+         %56 = OpLabel
+         %57 = OpLoad %v4float %tint_symbol
+               OpStore %x_2 %57
+         %58 = OpLoad %int %tint_symbol_1
+               OpStore %x_3 %58
+         %59 = OpFunctionCall %void %main_1
+         %61 = OpLoad %int %x_4
+         %62 = OpCompositeConstruct %main_out %61
+         %60 = OpFunctionCall %void %tint_symbol_4 %62
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_ssbo_store/1.wgsl.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_ssbo_store/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..8bf85f1
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_ssbo_store/1.wgsl.expected.wgsl
@@ -0,0 +1,39 @@
+type RTArr = [[stride(4)]] array<i32>;
+
+[[block]]
+struct S {
+  field0 : RTArr;
+};
+
+var<private> x_2 : vec4<f32>;
+
+var<private> x_3 : i32;
+
+var<private> x_4 : i32;
+
+[[group(0), binding(0)]] var<storage, read_write> x_5 : S;
+
+fn main_1() {
+  x_4 = 1;
+  let x_23 : vec4<f32> = x_2;
+  let x_27 : i32 = i32(x_23.x);
+  let x_28 : i32 = i32(x_23.y);
+  let x_33 : i32 = x_3;
+  if (((((x_27 & 1) + (x_28 & 1)) + x_33) == i32(x_23.z))) {
+  }
+  x_5.field0[(x_27 + (x_28 * 8))] = x_27;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_4_1 : i32;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] x_2_param : vec4<f32>, [[location(0)]] x_3_param : i32) -> main_out {
+  x_2 = x_2_param;
+  x_3 = x_3_param;
+  main_1();
+  return main_out(x_4);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/ssbo_store_before_terminate/1.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/ssbo_store_before_terminate/1.spvasm
new file mode 100644
index 0000000..7ca5002
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/ssbo_store_before_terminate/1.spvasm
@@ -0,0 +1,62 @@
+               OpCapability Shader
+               OpExtension "SPV_KHR_terminate_invocation"
+               OpExtension "SPV_KHR_storage_buffer_storage_class"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %1 "main" %gl_FragCoord %3 %4
+               OpExecutionMode %1 OriginUpperLeft
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %3 Location 0
+               OpDecorate %3 Flat
+               OpDecorate %4 Location 0
+               OpDecorate %5 DescriptorSet 0
+               OpDecorate %5 Binding 0
+               OpDecorate %_struct_6 Block
+               OpMemberDecorate %_struct_6 0 Offset 0
+               OpDecorate %_runtimearr_int ArrayStride 4
+       %void = OpTypeVoid
+       %bool = OpTypeBool
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+      %int_8 = OpConstant %int 8
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_int = OpTypePointer Input %int
+%_ptr_Output_int = OpTypePointer Output %int
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+          %3 = OpVariable %_ptr_Input_int Input
+          %4 = OpVariable %_ptr_Output_int Output
+%_runtimearr_int = OpTypeRuntimeArray %int
+  %_struct_6 = OpTypeStruct %_runtimearr_int
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+%_ptr_StorageBuffer__struct_6 = OpTypePointer StorageBuffer %_struct_6
+          %5 = OpVariable %_ptr_StorageBuffer__struct_6 StorageBuffer
+         %21 = OpTypeFunction %void
+          %1 = OpFunction %void None %21
+         %22 = OpLabel
+               OpStore %4 %int_1
+         %23 = OpLoad %v4float %gl_FragCoord
+         %24 = OpCompositeExtract %float %23 0
+         %25 = OpCompositeExtract %float %23 1
+         %26 = OpCompositeExtract %float %23 2
+         %27 = OpConvertFToS %int %24
+         %28 = OpConvertFToS %int %25
+         %29 = OpConvertFToS %int %26
+         %30 = OpBitwiseAnd %int %27 %int_1
+         %31 = OpBitwiseAnd %int %28 %int_1
+         %32 = OpIAdd %int %30 %31
+         %33 = OpLoad %int %3
+         %34 = OpIAdd %int %32 %33
+         %35 = OpIMul %int %28 %int_8
+         %36 = OpIAdd %int %27 %35
+         %37 = OpAccessChain %_ptr_StorageBuffer_int %5 %int_0 %36
+               OpStore %37 %27
+         %38 = OpIEqual %bool %34 %29
+               OpSelectionMerge %39 None
+               OpBranchConditional %38 %40 %39
+         %40 = OpLabel
+               OpTerminateInvocation
+         %39 = OpLabel
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/ssbo_store_before_terminate/1.spvasm.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/ssbo_store_before_terminate/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..bb7ac26
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/ssbo_store_before_terminate/1.spvasm.expected.hlsl
@@ -0,0 +1,38 @@
+static float4 x_2 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static int x_3 = 0;
+static int x_4 = 0;
+RWByteAddressBuffer x_5 : register(u0, space0);
+
+void main_1() {
+  x_4 = 1;
+  const float4 x_23 = x_2;
+  const int x_27 = int(x_23.x);
+  const int x_28 = int(x_23.y);
+  const int x_33 = x_3;
+  x_5.Store((4u * uint((x_27 + (x_28 * 8)))), asuint(x_27));
+  if (((((x_27 & 1) + (x_28 & 1)) + x_33) == int(x_23.z))) {
+  }
+  return;
+}
+
+struct main_out {
+  int x_4_1;
+};
+struct tint_symbol_1 {
+  int x_3_param : TEXCOORD0;
+  float4 x_2_param : SV_Position;
+};
+struct tint_symbol_2 {
+  int x_4_1 : SV_Target0;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 x_2_param = tint_symbol.x_2_param;
+  const int x_3_param = tint_symbol.x_3_param;
+  x_2 = x_2_param;
+  x_3 = x_3_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_4};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_4_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/ssbo_store_before_terminate/1.spvasm.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/ssbo_store_before_terminate/1.spvasm.expected.msl
new file mode 100644
index 0000000..893315f
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/ssbo_store_before_terminate/1.spvasm.expected.msl
@@ -0,0 +1,41 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  /* 0x0000 */ int field0[1];
+};
+struct main_out {
+  int x_4_1;
+};
+struct tint_symbol_2 {
+  int x_3_param [[user(locn0)]];
+};
+struct tint_symbol_3 {
+  int x_4_1 [[color(0)]];
+};
+
+void main_1(device S& x_5, thread int* const tint_symbol_6, thread float4* const tint_symbol_7, thread int* const tint_symbol_8) {
+  *(tint_symbol_6) = 1;
+  float4 const x_23 = *(tint_symbol_7);
+  int const x_27 = int(x_23.x);
+  int const x_28 = int(x_23.y);
+  int const x_33 = *(tint_symbol_8);
+  x_5.field0[(x_27 + (x_28 * 8))] = x_27;
+  if (((((x_27 & 1) + (x_28 & 1)) + x_33) == int(x_23.z))) {
+  }
+  return;
+}
+
+fragment tint_symbol_3 tint_symbol(float4 x_2_param [[position]], tint_symbol_2 tint_symbol_1 [[stage_in]], device S& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_9 = 0.0f;
+  thread int tint_symbol_10 = 0;
+  thread int tint_symbol_11 = 0;
+  int const x_3_param = tint_symbol_1.x_3_param;
+  tint_symbol_9 = x_2_param;
+  tint_symbol_10 = x_3_param;
+  main_1(x_5, &(tint_symbol_11), &(tint_symbol_9), &(tint_symbol_10));
+  main_out const tint_symbol_4 = {.x_4_1=tint_symbol_11};
+  tint_symbol_3 const tint_symbol_5 = {.x_4_1=tint_symbol_4.x_4_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/ssbo_store_before_terminate/1.spvasm.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/ssbo_store_before_terminate/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..ef97582
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/ssbo_store_before_terminate/1.spvasm.expected.spvasm
@@ -0,0 +1,110 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 63
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_1 %tint_symbol_3
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_2 "x_2"
+               OpName %x_3 "x_3"
+               OpName %x_4 "x_4"
+               OpName %S "S"
+               OpMemberName %S 0 "field0"
+               OpName %x_5 "x_5"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_4_1"
+               OpName %tint_symbol_4 "tint_symbol_4"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main "main"
+               OpDecorate %S Block
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %_runtimearr_int ArrayStride 4
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %tint_symbol_1 Flat
+               OpDecorate %tint_symbol_3 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+        %x_2 = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+          %9 = OpConstantNull %int
+        %x_3 = OpVariable %_ptr_Private_int Private %9
+        %x_4 = OpVariable %_ptr_Private_int Private %9
+%_runtimearr_int = OpTypeRuntimeArray %int
+          %S = OpTypeStruct %_runtimearr_int
+%_ptr_StorageBuffer_S = OpTypePointer StorageBuffer %S
+        %x_5 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Input_int = OpTypePointer Input %int
+%tint_symbol_1 = OpVariable %_ptr_Input_int Input
+%_ptr_Output_int = OpTypePointer Output %int
+%tint_symbol_3 = OpVariable %_ptr_Output_int Output %9
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+      %int_1 = OpConstant %int 1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+      %int_8 = OpConstant %int 8
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %int
+         %49 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %21
+         %24 = OpLabel
+               OpStore %x_4 %int_1
+         %26 = OpLoad %v4float %x_2
+         %28 = OpCompositeExtract %float %26 0
+         %27 = OpConvertFToS %int %28
+         %30 = OpCompositeExtract %float %26 1
+         %29 = OpConvertFToS %int %30
+         %31 = OpLoad %int %x_3
+         %35 = OpIMul %int %29 %int_8
+         %36 = OpIAdd %int %27 %35
+         %38 = OpAccessChain %_ptr_StorageBuffer_int %x_5 %uint_0 %36
+               OpStore %38 %27
+         %39 = OpBitwiseAnd %int %27 %int_1
+         %40 = OpBitwiseAnd %int %29 %int_1
+         %41 = OpIAdd %int %39 %40
+         %42 = OpIAdd %int %41 %31
+         %44 = OpCompositeExtract %float %26 2
+         %43 = OpConvertFToS %int %44
+         %45 = OpIEqual %bool %42 %43
+               OpSelectionMerge %47 None
+               OpBranchConditional %45 %48 %47
+         %48 = OpLabel
+               OpBranch %47
+         %47 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_4 = OpFunction %void None %49
+%tint_symbol_2 = OpFunctionParameter %main_out
+         %53 = OpLabel
+         %54 = OpCompositeExtract %int %tint_symbol_2 0
+               OpStore %tint_symbol_3 %54
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %21
+         %56 = OpLabel
+         %57 = OpLoad %v4float %tint_symbol
+               OpStore %x_2 %57
+         %58 = OpLoad %int %tint_symbol_1
+               OpStore %x_3 %58
+         %59 = OpFunctionCall %void %main_1
+         %61 = OpLoad %int %x_4
+         %62 = OpCompositeConstruct %main_out %61
+         %60 = OpFunctionCall %void %tint_symbol_4 %62
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/ssbo_store_before_terminate/1.spvasm.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/ssbo_store_before_terminate/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..55cb745
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/ssbo_store_before_terminate/1.spvasm.expected.wgsl
@@ -0,0 +1,39 @@
+type RTArr = [[stride(4)]] array<i32>;
+
+[[block]]
+struct S {
+  field0 : RTArr;
+};
+
+var<private> x_2 : vec4<f32>;
+
+var<private> x_3 : i32;
+
+var<private> x_4 : i32;
+
+[[group(0), binding(0)]] var<storage, read_write> x_5 : S;
+
+fn main_1() {
+  x_4 = 1;
+  let x_23 : vec4<f32> = x_2;
+  let x_27 : i32 = i32(x_23.x);
+  let x_28 : i32 = i32(x_23.y);
+  let x_33 : i32 = x_3;
+  x_5.field0[(x_27 + (x_28 * 8))] = x_27;
+  if (((((x_27 & 1) + (x_28 & 1)) + x_33) == i32(x_23.z))) {
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_4_1 : i32;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] x_2_param : vec4<f32>, [[location(0)]] x_3_param : i32) -> main_out {
+  x_2 = x_2_param;
+  x_3 = x_3_param;
+  main_1();
+  return main_out(x_4);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/ssbo_store_before_terminate/1.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/ssbo_store_before_terminate/1.wgsl
new file mode 100644
index 0000000..55cb745
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/ssbo_store_before_terminate/1.wgsl
@@ -0,0 +1,39 @@
+type RTArr = [[stride(4)]] array<i32>;
+
+[[block]]
+struct S {
+  field0 : RTArr;
+};
+
+var<private> x_2 : vec4<f32>;
+
+var<private> x_3 : i32;
+
+var<private> x_4 : i32;
+
+[[group(0), binding(0)]] var<storage, read_write> x_5 : S;
+
+fn main_1() {
+  x_4 = 1;
+  let x_23 : vec4<f32> = x_2;
+  let x_27 : i32 = i32(x_23.x);
+  let x_28 : i32 = i32(x_23.y);
+  let x_33 : i32 = x_3;
+  x_5.field0[(x_27 + (x_28 * 8))] = x_27;
+  if (((((x_27 & 1) + (x_28 & 1)) + x_33) == i32(x_23.z))) {
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_4_1 : i32;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] x_2_param : vec4<f32>, [[location(0)]] x_3_param : i32) -> main_out {
+  x_2 = x_2_param;
+  x_3 = x_3_param;
+  main_1();
+  return main_out(x_4);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/ssbo_store_before_terminate/1.wgsl.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/ssbo_store_before_terminate/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..bb7ac26
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/ssbo_store_before_terminate/1.wgsl.expected.hlsl
@@ -0,0 +1,38 @@
+static float4 x_2 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static int x_3 = 0;
+static int x_4 = 0;
+RWByteAddressBuffer x_5 : register(u0, space0);
+
+void main_1() {
+  x_4 = 1;
+  const float4 x_23 = x_2;
+  const int x_27 = int(x_23.x);
+  const int x_28 = int(x_23.y);
+  const int x_33 = x_3;
+  x_5.Store((4u * uint((x_27 + (x_28 * 8)))), asuint(x_27));
+  if (((((x_27 & 1) + (x_28 & 1)) + x_33) == int(x_23.z))) {
+  }
+  return;
+}
+
+struct main_out {
+  int x_4_1;
+};
+struct tint_symbol_1 {
+  int x_3_param : TEXCOORD0;
+  float4 x_2_param : SV_Position;
+};
+struct tint_symbol_2 {
+  int x_4_1 : SV_Target0;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 x_2_param = tint_symbol.x_2_param;
+  const int x_3_param = tint_symbol.x_3_param;
+  x_2 = x_2_param;
+  x_3 = x_3_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_4};
+  const tint_symbol_2 tint_symbol_5 = {tint_symbol_3.x_4_1};
+  return tint_symbol_5;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/ssbo_store_before_terminate/1.wgsl.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/ssbo_store_before_terminate/1.wgsl.expected.msl
new file mode 100644
index 0000000..893315f
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/ssbo_store_before_terminate/1.wgsl.expected.msl
@@ -0,0 +1,41 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  /* 0x0000 */ int field0[1];
+};
+struct main_out {
+  int x_4_1;
+};
+struct tint_symbol_2 {
+  int x_3_param [[user(locn0)]];
+};
+struct tint_symbol_3 {
+  int x_4_1 [[color(0)]];
+};
+
+void main_1(device S& x_5, thread int* const tint_symbol_6, thread float4* const tint_symbol_7, thread int* const tint_symbol_8) {
+  *(tint_symbol_6) = 1;
+  float4 const x_23 = *(tint_symbol_7);
+  int const x_27 = int(x_23.x);
+  int const x_28 = int(x_23.y);
+  int const x_33 = *(tint_symbol_8);
+  x_5.field0[(x_27 + (x_28 * 8))] = x_27;
+  if (((((x_27 & 1) + (x_28 & 1)) + x_33) == int(x_23.z))) {
+  }
+  return;
+}
+
+fragment tint_symbol_3 tint_symbol(float4 x_2_param [[position]], tint_symbol_2 tint_symbol_1 [[stage_in]], device S& x_5 [[buffer(0)]]) {
+  thread float4 tint_symbol_9 = 0.0f;
+  thread int tint_symbol_10 = 0;
+  thread int tint_symbol_11 = 0;
+  int const x_3_param = tint_symbol_1.x_3_param;
+  tint_symbol_9 = x_2_param;
+  tint_symbol_10 = x_3_param;
+  main_1(x_5, &(tint_symbol_11), &(tint_symbol_9), &(tint_symbol_10));
+  main_out const tint_symbol_4 = {.x_4_1=tint_symbol_11};
+  tint_symbol_3 const tint_symbol_5 = {.x_4_1=tint_symbol_4.x_4_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/ssbo_store_before_terminate/1.wgsl.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/ssbo_store_before_terminate/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..ef97582
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/ssbo_store_before_terminate/1.wgsl.expected.spvasm
@@ -0,0 +1,110 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 63
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_1 %tint_symbol_3
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_2 "x_2"
+               OpName %x_3 "x_3"
+               OpName %x_4 "x_4"
+               OpName %S "S"
+               OpMemberName %S 0 "field0"
+               OpName %x_5 "x_5"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_4_1"
+               OpName %tint_symbol_4 "tint_symbol_4"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main "main"
+               OpDecorate %S Block
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %_runtimearr_int ArrayStride 4
+               OpDecorate %x_5 DescriptorSet 0
+               OpDecorate %x_5 Binding 0
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %tint_symbol_1 Flat
+               OpDecorate %tint_symbol_3 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+        %x_2 = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+          %9 = OpConstantNull %int
+        %x_3 = OpVariable %_ptr_Private_int Private %9
+        %x_4 = OpVariable %_ptr_Private_int Private %9
+%_runtimearr_int = OpTypeRuntimeArray %int
+          %S = OpTypeStruct %_runtimearr_int
+%_ptr_StorageBuffer_S = OpTypePointer StorageBuffer %S
+        %x_5 = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Input_int = OpTypePointer Input %int
+%tint_symbol_1 = OpVariable %_ptr_Input_int Input
+%_ptr_Output_int = OpTypePointer Output %int
+%tint_symbol_3 = OpVariable %_ptr_Output_int Output %9
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+      %int_1 = OpConstant %int 1
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+      %int_8 = OpConstant %int 8
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+       %bool = OpTypeBool
+   %main_out = OpTypeStruct %int
+         %49 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %21
+         %24 = OpLabel
+               OpStore %x_4 %int_1
+         %26 = OpLoad %v4float %x_2
+         %28 = OpCompositeExtract %float %26 0
+         %27 = OpConvertFToS %int %28
+         %30 = OpCompositeExtract %float %26 1
+         %29 = OpConvertFToS %int %30
+         %31 = OpLoad %int %x_3
+         %35 = OpIMul %int %29 %int_8
+         %36 = OpIAdd %int %27 %35
+         %38 = OpAccessChain %_ptr_StorageBuffer_int %x_5 %uint_0 %36
+               OpStore %38 %27
+         %39 = OpBitwiseAnd %int %27 %int_1
+         %40 = OpBitwiseAnd %int %29 %int_1
+         %41 = OpIAdd %int %39 %40
+         %42 = OpIAdd %int %41 %31
+         %44 = OpCompositeExtract %float %26 2
+         %43 = OpConvertFToS %int %44
+         %45 = OpIEqual %bool %42 %43
+               OpSelectionMerge %47 None
+               OpBranchConditional %45 %48 %47
+         %48 = OpLabel
+               OpBranch %47
+         %47 = OpLabel
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_4 = OpFunction %void None %49
+%tint_symbol_2 = OpFunctionParameter %main_out
+         %53 = OpLabel
+         %54 = OpCompositeExtract %int %tint_symbol_2 0
+               OpStore %tint_symbol_3 %54
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %21
+         %56 = OpLabel
+         %57 = OpLoad %v4float %tint_symbol
+               OpStore %x_2 %57
+         %58 = OpLoad %int %tint_symbol_1
+               OpStore %x_3 %58
+         %59 = OpFunctionCall %void %main_1
+         %61 = OpLoad %int %x_4
+         %62 = OpCompositeConstruct %main_out %61
+         %60 = OpFunctionCall %void %tint_symbol_4 %62
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/ssbo_store_before_terminate/1.wgsl.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/ssbo_store_before_terminate/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..55cb745
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/ssbo_store_before_terminate/1.wgsl.expected.wgsl
@@ -0,0 +1,39 @@
+type RTArr = [[stride(4)]] array<i32>;
+
+[[block]]
+struct S {
+  field0 : RTArr;
+};
+
+var<private> x_2 : vec4<f32>;
+
+var<private> x_3 : i32;
+
+var<private> x_4 : i32;
+
+[[group(0), binding(0)]] var<storage, read_write> x_5 : S;
+
+fn main_1() {
+  x_4 = 1;
+  let x_23 : vec4<f32> = x_2;
+  let x_27 : i32 = i32(x_23.x);
+  let x_28 : i32 = i32(x_23.y);
+  let x_33 : i32 = x_3;
+  x_5.field0[(x_27 + (x_28 * 8))] = x_27;
+  if (((((x_27 & 1) + (x_28 & 1)) + x_33) == i32(x_23.z))) {
+  }
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_4_1 : i32;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] x_2_param : vec4<f32>, [[location(0)]] x_3_param : i32) -> main_out {
+  x_2 = x_2_param;
+  x_3 = x_3_param;
+  main_1();
+  return main_out(x_4);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/terminate_loop/1.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/terminate_loop/1.spvasm
new file mode 100644
index 0000000..4fd14af
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/terminate_loop/1.spvasm
@@ -0,0 +1,57 @@
+               OpCapability Shader
+               OpExtension "SPV_KHR_terminate_invocation"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %1 "main" %gl_FragCoord %3 %4
+               OpExecutionMode %1 OriginUpperLeft
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %3 Location 0
+               OpDecorate %3 Flat
+               OpDecorate %4 Location 0
+       %void = OpTypeVoid
+       %bool = OpTypeBool
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+     %int_10 = OpConstant %int 10
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_int = OpTypePointer Input %int
+%_ptr_Output_int = OpTypePointer Output %int
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+          %3 = OpVariable %_ptr_Input_int Input
+          %4 = OpVariable %_ptr_Output_int Output
+         %16 = OpTypeFunction %void
+          %1 = OpFunction %void None %16
+         %17 = OpLabel
+         %18 = OpLoad %v4float %gl_FragCoord
+         %19 = OpCompositeExtract %float %18 0
+         %20 = OpCompositeExtract %float %18 1
+         %21 = OpCompositeExtract %float %18 2
+         %22 = OpConvertFToS %int %19
+         %23 = OpConvertFToS %int %20
+         %24 = OpConvertFToS %int %21
+         %25 = OpBitwiseAnd %int %22 %int_1
+         %26 = OpBitwiseAnd %int %23 %int_1
+         %27 = OpIAdd %int %25 %26
+         %28 = OpLoad %int %3
+         %29 = OpIAdd %int %27 %28
+         %30 = OpIEqual %bool %29 %24
+               OpSelectionMerge %31 None
+               OpBranchConditional %30 %32 %31
+         %32 = OpLabel
+         %33 = OpPhi %int %int_0 %17 %34 %35
+         %36 = OpULessThan %bool %33 %int_10
+               OpLoopMerge %37 %35 None
+               OpBranchConditional %36 %38 %37
+         %38 = OpLabel
+               OpTerminateInvocation
+         %35 = OpLabel
+         %34 = OpIAdd %int %33 %int_1
+               OpBranch %32
+         %37 = OpLabel
+               OpBranch %31
+         %31 = OpLabel
+               OpStore %4 %int_1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/terminate_loop/1.spvasm.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/terminate_loop/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..e1ac82b
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/terminate_loop/1.spvasm.expected.hlsl
@@ -0,0 +1,48 @@
+static float4 x_2 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static int x_3 = 0;
+static int x_4 = 0;
+
+void main_1() {
+  int x_33_phi = 0;
+  const float4 x_18 = x_2;
+  const int x_28 = x_3;
+  x_33_phi = 0;
+  if (((((int(x_18.x) & 1) + (int(x_18.y) & 1)) + x_28) == int(x_18.z))) {
+    while (true) {
+      int x_34 = 0;
+      const int x_33 = x_33_phi;
+      if ((asuint(x_33) < asuint(10))) {
+      } else {
+        break;
+      }
+      {
+        x_34 = (x_33 + 1);
+        x_33_phi = x_34;
+      }
+    }
+  }
+  x_4 = 1;
+  return;
+}
+
+struct main_out {
+  int x_4_1;
+};
+struct tint_symbol_1 {
+  int x_3_param : TEXCOORD0;
+  float4 x_2_param : SV_Position;
+};
+struct tint_symbol_2 {
+  int x_4_1 : SV_Target0;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 x_2_param = tint_symbol.x_2_param;
+  const int x_3_param = tint_symbol.x_3_param;
+  x_2 = x_2_param;
+  x_3 = x_3_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_4};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_4_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/terminate_loop/1.spvasm.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/terminate_loop/1.spvasm.expected.msl
new file mode 100644
index 0000000..27b481f
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/terminate_loop/1.spvasm.expected.msl
@@ -0,0 +1,49 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  int x_4_1;
+};
+struct tint_symbol_2 {
+  int x_3_param [[user(locn0)]];
+};
+struct tint_symbol_3 {
+  int x_4_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_6, thread int* const tint_symbol_7, thread int* const tint_symbol_8) {
+  int x_33_phi = 0;
+  float4 const x_18 = *(tint_symbol_6);
+  int const x_28 = *(tint_symbol_7);
+  x_33_phi = 0;
+  if (((((int(x_18.x) & 1) + (int(x_18.y) & 1)) + x_28) == int(x_18.z))) {
+    while (true) {
+      int x_34 = 0;
+      int const x_33 = x_33_phi;
+      if ((as_type<uint>(x_33) < as_type<uint>(10))) {
+      } else {
+        break;
+      }
+      {
+        x_34 = (x_33 + 1);
+        x_33_phi = x_34;
+      }
+    }
+  }
+  *(tint_symbol_8) = 1;
+  return;
+}
+
+fragment tint_symbol_3 tint_symbol(float4 x_2_param [[position]], tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread float4 tint_symbol_9 = 0.0f;
+  thread int tint_symbol_10 = 0;
+  thread int tint_symbol_11 = 0;
+  int const x_3_param = tint_symbol_1.x_3_param;
+  tint_symbol_9 = x_2_param;
+  tint_symbol_10 = x_3_param;
+  main_1(&(tint_symbol_9), &(tint_symbol_10), &(tint_symbol_11));
+  main_out const tint_symbol_4 = {.x_4_1=tint_symbol_11};
+  tint_symbol_3 const tint_symbol_5 = {.x_4_1=tint_symbol_4.x_4_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/terminate_loop/1.spvasm.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/terminate_loop/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..cdf2918
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/terminate_loop/1.spvasm.expected.spvasm
@@ -0,0 +1,123 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 71
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_1 %tint_symbol_3
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_2 "x_2"
+               OpName %x_3 "x_3"
+               OpName %x_4 "x_4"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %main_1 "main_1"
+               OpName %x_33_phi "x_33_phi"
+               OpName %x_34 "x_34"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_4_1"
+               OpName %tint_symbol_4 "tint_symbol_4"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %tint_symbol_1 Flat
+               OpDecorate %tint_symbol_3 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+        %x_2 = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+          %9 = OpConstantNull %int
+        %x_3 = OpVariable %_ptr_Private_int Private %9
+        %x_4 = OpVariable %_ptr_Private_int Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Input_int = OpTypePointer Input %int
+%tint_symbol_1 = OpVariable %_ptr_Input_int Input
+%_ptr_Output_int = OpTypePointer Output %int
+%tint_symbol_3 = OpVariable %_ptr_Output_int Output %9
+       %void = OpTypeVoid
+         %17 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+     %int_10 = OpConstant %int 10
+   %main_out = OpTypeStruct %int
+         %57 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %17
+         %20 = OpLabel
+   %x_33_phi = OpVariable %_ptr_Function_int Function %9
+       %x_34 = OpVariable %_ptr_Function_int Function %9
+         %23 = OpLoad %v4float %x_2
+         %24 = OpLoad %int %x_3
+               OpStore %x_33_phi %int_0
+         %27 = OpCompositeExtract %float %23 0
+         %26 = OpConvertFToS %int %27
+         %29 = OpBitwiseAnd %int %26 %int_1
+         %31 = OpCompositeExtract %float %23 1
+         %30 = OpConvertFToS %int %31
+         %32 = OpBitwiseAnd %int %30 %int_1
+         %33 = OpIAdd %int %29 %32
+         %34 = OpIAdd %int %33 %24
+         %36 = OpCompositeExtract %float %23 2
+         %35 = OpConvertFToS %int %36
+         %37 = OpIEqual %bool %34 %35
+               OpSelectionMerge %39 None
+               OpBranchConditional %37 %40 %39
+         %40 = OpLabel
+               OpBranch %41
+         %41 = OpLabel
+               OpLoopMerge %42 %43 None
+               OpBranch %44
+         %44 = OpLabel
+         %46 = OpLoad %int %x_33_phi
+         %47 = OpBitcast %uint %46
+         %49 = OpBitcast %uint %int_10
+         %51 = OpULessThan %bool %47 %49
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %54
+         %53 = OpLabel
+               OpBranch %52
+         %54 = OpLabel
+               OpBranch %42
+         %52 = OpLabel
+               OpBranch %43
+         %43 = OpLabel
+         %55 = OpIAdd %int %46 %int_1
+               OpStore %x_34 %55
+         %56 = OpLoad %int %x_34
+               OpStore %x_33_phi %56
+               OpBranch %41
+         %42 = OpLabel
+               OpBranch %39
+         %39 = OpLabel
+               OpStore %x_4 %int_1
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_4 = OpFunction %void None %57
+%tint_symbol_2 = OpFunctionParameter %main_out
+         %61 = OpLabel
+         %62 = OpCompositeExtract %int %tint_symbol_2 0
+               OpStore %tint_symbol_3 %62
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %17
+         %64 = OpLabel
+         %65 = OpLoad %v4float %tint_symbol
+               OpStore %x_2 %65
+         %66 = OpLoad %int %tint_symbol_1
+               OpStore %x_3 %66
+         %67 = OpFunctionCall %void %main_1
+         %69 = OpLoad %int %x_4
+         %70 = OpCompositeConstruct %main_out %69
+         %68 = OpFunctionCall %void %tint_symbol_4 %70
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/terminate_loop/1.spvasm.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/terminate_loop/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..5142f3d
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/terminate_loop/1.spvasm.expected.wgsl
@@ -0,0 +1,42 @@
+var<private> x_2 : vec4<f32>;
+
+var<private> x_3 : i32;
+
+var<private> x_4 : i32;
+
+fn main_1() {
+  var x_33_phi : i32;
+  let x_18 : vec4<f32> = x_2;
+  let x_28 : i32 = x_3;
+  x_33_phi = 0;
+  if (((((i32(x_18.x) & 1) + (i32(x_18.y) & 1)) + x_28) == i32(x_18.z))) {
+    loop {
+      var x_34 : i32;
+      let x_33 : i32 = x_33_phi;
+      if ((bitcast<u32>(x_33) < bitcast<u32>(10))) {
+      } else {
+        break;
+      }
+
+      continuing {
+        x_34 = (x_33 + 1);
+        x_33_phi = x_34;
+      }
+    }
+  }
+  x_4 = 1;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_4_1 : i32;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] x_2_param : vec4<f32>, [[location(0)]] x_3_param : i32) -> main_out {
+  x_2 = x_2_param;
+  x_3 = x_3_param;
+  main_1();
+  return main_out(x_4);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/terminate_loop/1.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/terminate_loop/1.wgsl
new file mode 100644
index 0000000..5142f3d
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/terminate_loop/1.wgsl
@@ -0,0 +1,42 @@
+var<private> x_2 : vec4<f32>;
+
+var<private> x_3 : i32;
+
+var<private> x_4 : i32;
+
+fn main_1() {
+  var x_33_phi : i32;
+  let x_18 : vec4<f32> = x_2;
+  let x_28 : i32 = x_3;
+  x_33_phi = 0;
+  if (((((i32(x_18.x) & 1) + (i32(x_18.y) & 1)) + x_28) == i32(x_18.z))) {
+    loop {
+      var x_34 : i32;
+      let x_33 : i32 = x_33_phi;
+      if ((bitcast<u32>(x_33) < bitcast<u32>(10))) {
+      } else {
+        break;
+      }
+
+      continuing {
+        x_34 = (x_33 + 1);
+        x_33_phi = x_34;
+      }
+    }
+  }
+  x_4 = 1;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_4_1 : i32;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] x_2_param : vec4<f32>, [[location(0)]] x_3_param : i32) -> main_out {
+  x_2 = x_2_param;
+  x_3 = x_3_param;
+  main_1();
+  return main_out(x_4);
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/terminate_loop/1.wgsl.expected.hlsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/terminate_loop/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..e1ac82b
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/terminate_loop/1.wgsl.expected.hlsl
@@ -0,0 +1,48 @@
+static float4 x_2 = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static int x_3 = 0;
+static int x_4 = 0;
+
+void main_1() {
+  int x_33_phi = 0;
+  const float4 x_18 = x_2;
+  const int x_28 = x_3;
+  x_33_phi = 0;
+  if (((((int(x_18.x) & 1) + (int(x_18.y) & 1)) + x_28) == int(x_18.z))) {
+    while (true) {
+      int x_34 = 0;
+      const int x_33 = x_33_phi;
+      if ((asuint(x_33) < asuint(10))) {
+      } else {
+        break;
+      }
+      {
+        x_34 = (x_33 + 1);
+        x_33_phi = x_34;
+      }
+    }
+  }
+  x_4 = 1;
+  return;
+}
+
+struct main_out {
+  int x_4_1;
+};
+struct tint_symbol_1 {
+  int x_3_param : TEXCOORD0;
+  float4 x_2_param : SV_Position;
+};
+struct tint_symbol_2 {
+  int x_4_1 : SV_Target0;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 x_2_param = tint_symbol.x_2_param;
+  const int x_3_param = tint_symbol.x_3_param;
+  x_2 = x_2_param;
+  x_3 = x_3_param;
+  main_1();
+  const main_out tint_symbol_3 = {x_4};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.x_4_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/terminate_loop/1.wgsl.expected.msl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/terminate_loop/1.wgsl.expected.msl
new file mode 100644
index 0000000..27b481f
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/terminate_loop/1.wgsl.expected.msl
@@ -0,0 +1,49 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  int x_4_1;
+};
+struct tint_symbol_2 {
+  int x_3_param [[user(locn0)]];
+};
+struct tint_symbol_3 {
+  int x_4_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_6, thread int* const tint_symbol_7, thread int* const tint_symbol_8) {
+  int x_33_phi = 0;
+  float4 const x_18 = *(tint_symbol_6);
+  int const x_28 = *(tint_symbol_7);
+  x_33_phi = 0;
+  if (((((int(x_18.x) & 1) + (int(x_18.y) & 1)) + x_28) == int(x_18.z))) {
+    while (true) {
+      int x_34 = 0;
+      int const x_33 = x_33_phi;
+      if ((as_type<uint>(x_33) < as_type<uint>(10))) {
+      } else {
+        break;
+      }
+      {
+        x_34 = (x_33 + 1);
+        x_33_phi = x_34;
+      }
+    }
+  }
+  *(tint_symbol_8) = 1;
+  return;
+}
+
+fragment tint_symbol_3 tint_symbol(float4 x_2_param [[position]], tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread float4 tint_symbol_9 = 0.0f;
+  thread int tint_symbol_10 = 0;
+  thread int tint_symbol_11 = 0;
+  int const x_3_param = tint_symbol_1.x_3_param;
+  tint_symbol_9 = x_2_param;
+  tint_symbol_10 = x_3_param;
+  main_1(&(tint_symbol_9), &(tint_symbol_10), &(tint_symbol_11));
+  main_out const tint_symbol_4 = {.x_4_1=tint_symbol_11};
+  tint_symbol_3 const tint_symbol_5 = {.x_4_1=tint_symbol_4.x_4_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/terminate_loop/1.wgsl.expected.spvasm b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/terminate_loop/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..cdf2918
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/terminate_loop/1.wgsl.expected.spvasm
@@ -0,0 +1,123 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 71
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_1 %tint_symbol_3
+               OpExecutionMode %main OriginUpperLeft
+               OpName %x_2 "x_2"
+               OpName %x_3 "x_3"
+               OpName %x_4 "x_4"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %main_1 "main_1"
+               OpName %x_33_phi "x_33_phi"
+               OpName %x_34 "x_34"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "x_4_1"
+               OpName %tint_symbol_4 "tint_symbol_4"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_1 Location 0
+               OpDecorate %tint_symbol_1 Flat
+               OpDecorate %tint_symbol_3 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+        %x_2 = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+          %9 = OpConstantNull %int
+        %x_3 = OpVariable %_ptr_Private_int Private %9
+        %x_4 = OpVariable %_ptr_Private_int Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Input_int = OpTypePointer Input %int
+%tint_symbol_1 = OpVariable %_ptr_Input_int Input
+%_ptr_Output_int = OpTypePointer Output %int
+%tint_symbol_3 = OpVariable %_ptr_Output_int Output %9
+       %void = OpTypeVoid
+         %17 = OpTypeFunction %void
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_0 = OpConstant %int 0
+      %int_1 = OpConstant %int 1
+       %bool = OpTypeBool
+       %uint = OpTypeInt 32 0
+     %int_10 = OpConstant %int 10
+   %main_out = OpTypeStruct %int
+         %57 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %17
+         %20 = OpLabel
+   %x_33_phi = OpVariable %_ptr_Function_int Function %9
+       %x_34 = OpVariable %_ptr_Function_int Function %9
+         %23 = OpLoad %v4float %x_2
+         %24 = OpLoad %int %x_3
+               OpStore %x_33_phi %int_0
+         %27 = OpCompositeExtract %float %23 0
+         %26 = OpConvertFToS %int %27
+         %29 = OpBitwiseAnd %int %26 %int_1
+         %31 = OpCompositeExtract %float %23 1
+         %30 = OpConvertFToS %int %31
+         %32 = OpBitwiseAnd %int %30 %int_1
+         %33 = OpIAdd %int %29 %32
+         %34 = OpIAdd %int %33 %24
+         %36 = OpCompositeExtract %float %23 2
+         %35 = OpConvertFToS %int %36
+         %37 = OpIEqual %bool %34 %35
+               OpSelectionMerge %39 None
+               OpBranchConditional %37 %40 %39
+         %40 = OpLabel
+               OpBranch %41
+         %41 = OpLabel
+               OpLoopMerge %42 %43 None
+               OpBranch %44
+         %44 = OpLabel
+         %46 = OpLoad %int %x_33_phi
+         %47 = OpBitcast %uint %46
+         %49 = OpBitcast %uint %int_10
+         %51 = OpULessThan %bool %47 %49
+               OpSelectionMerge %52 None
+               OpBranchConditional %51 %53 %54
+         %53 = OpLabel
+               OpBranch %52
+         %54 = OpLabel
+               OpBranch %42
+         %52 = OpLabel
+               OpBranch %43
+         %43 = OpLabel
+         %55 = OpIAdd %int %46 %int_1
+               OpStore %x_34 %55
+         %56 = OpLoad %int %x_34
+               OpStore %x_33_phi %56
+               OpBranch %41
+         %42 = OpLabel
+               OpBranch %39
+         %39 = OpLabel
+               OpStore %x_4 %int_1
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_4 = OpFunction %void None %57
+%tint_symbol_2 = OpFunctionParameter %main_out
+         %61 = OpLabel
+         %62 = OpCompositeExtract %int %tint_symbol_2 0
+               OpStore %tint_symbol_3 %62
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %17
+         %64 = OpLabel
+         %65 = OpLoad %v4float %tint_symbol
+               OpStore %x_2 %65
+         %66 = OpLoad %int %tint_symbol_1
+               OpStore %x_3 %66
+         %67 = OpFunctionCall %void %main_1
+         %69 = OpLoad %int %x_4
+         %70 = OpCompositeConstruct %main_out %69
+         %68 = OpFunctionCall %void %tint_symbol_4 %70
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/terminate_loop/1.wgsl.expected.wgsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/terminate_loop/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..5142f3d
--- /dev/null
+++ b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/terminate_loop/1.wgsl.expected.wgsl
@@ -0,0 +1,42 @@
+var<private> x_2 : vec4<f32>;
+
+var<private> x_3 : i32;
+
+var<private> x_4 : i32;
+
+fn main_1() {
+  var x_33_phi : i32;
+  let x_18 : vec4<f32> = x_2;
+  let x_28 : i32 = x_3;
+  x_33_phi = 0;
+  if (((((i32(x_18.x) & 1) + (i32(x_18.y) & 1)) + x_28) == i32(x_18.z))) {
+    loop {
+      var x_34 : i32;
+      let x_33 : i32 = x_33_phi;
+      if ((bitcast<u32>(x_33) < bitcast<u32>(10))) {
+      } else {
+        break;
+      }
+
+      continuing {
+        x_34 = (x_33 + 1);
+        x_33_phi = x_34;
+      }
+    }
+  }
+  x_4 = 1;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  x_4_1 : i32;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] x_2_param : vec4<f32>, [[location(0)]] x_3_param : i32) -> main_out {
+  x_2 = x_2_param;
+  x_3 = x_3_param;
+  main_1();
+  return main_out(x_4);
+}
diff --git a/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/0.spvasm b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/0.spvasm
new file mode 100644
index 0000000..5efeead
--- /dev/null
+++ b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/0.spvasm
@@ -0,0 +1,45 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %_ %position
+               OpSource GLSL 430
+               OpName %main "main"
+               OpName %gl_PerVertex "gl_PerVertex"
+               OpMemberName %gl_PerVertex 0 "gl_Position"
+               OpMemberName %gl_PerVertex 1 "gl_PointSize"
+               OpMemberName %gl_PerVertex 2 "gl_ClipDistance"
+               OpName %_ ""
+               OpName %position "position"
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpDecorate %gl_PerVertex Block
+               OpDecorate %position Location 0
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+    %v3float = OpTypeVector %float 3
+%_ptr_Input_v3float = OpTypePointer Input %v3float
+   %position = OpVariable %_ptr_Input_v3float Input
+    %float_1 = OpConstant %float 1
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+       %main = OpFunction %void None %7
+         %20 = OpLabel
+         %21 = OpLoad %v3float %position
+         %22 = OpCompositeExtract %float %21 0
+         %23 = OpCompositeExtract %float %21 1
+         %24 = OpCompositeExtract %float %21 2
+         %25 = OpCompositeConstruct %v4float %22 %23 %24 %float_1
+         %26 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+               OpStore %26 %25
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/0.spvasm.expected.hlsl b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/0.spvasm.expected.hlsl
new file mode 100644
index 0000000..5d7eab8
--- /dev/null
+++ b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/0.spvasm.expected.hlsl
@@ -0,0 +1,27 @@
+static float3 position = float3(0.0f, 0.0f, 0.0f);
+static float4 gl_Position = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const float3 x_21 = position;
+  gl_Position = float4(x_21.x, x_21.y, x_21.z, 1.0f);
+  return;
+}
+
+struct main_out {
+  float4 gl_Position;
+};
+struct tint_symbol_1 {
+  float3 position_param : TEXCOORD0;
+};
+struct tint_symbol_2 {
+  float4 gl_Position : SV_Position;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float3 position_param = tint_symbol.position_param;
+  position = position_param;
+  main_1();
+  const main_out tint_symbol_3 = {gl_Position};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.gl_Position};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/0.spvasm.expected.msl b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/0.spvasm.expected.msl
new file mode 100644
index 0000000..87dbf22
--- /dev/null
+++ b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/0.spvasm.expected.msl
@@ -0,0 +1,30 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 gl_Position;
+};
+struct tint_symbol_2 {
+  float3 position_param [[attribute(0)]];
+};
+struct tint_symbol_3 {
+  float4 gl_Position [[position]];
+};
+
+void main_1(thread float3* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  float3 const x_21 = *(tint_symbol_6);
+  *(tint_symbol_7) = float4(x_21.x, x_21.y, x_21.z, 1.0f);
+  return;
+}
+
+vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread float3 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  float3 const position_param = tint_symbol_1.position_param;
+  tint_symbol_8 = position_param;
+  main_1(&(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_4 = {.gl_Position=tint_symbol_9};
+  tint_symbol_3 const tint_symbol_5 = {.gl_Position=tint_symbol_4.gl_Position};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/0.spvasm.expected.spvasm b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/0.spvasm.expected.spvasm
new file mode 100644
index 0000000..3a3cd55
--- /dev/null
+++ b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/0.spvasm.expected.spvasm
@@ -0,0 +1,72 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 40
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %tint_pointsize %tint_symbol %tint_symbol_2
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %position "position"
+               OpName %gl_Position "gl_Position"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "gl_Position"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_2 BuiltIn Position
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+    %v3float = OpTypeVector %float 3
+%_ptr_Private_v3float = OpTypePointer Private %v3float
+          %8 = OpConstantNull %v3float
+   %position = OpVariable %_ptr_Private_v3float Private %8
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%gl_Position = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Input_v3float = OpTypePointer Input %v3float
+%tint_symbol = OpVariable %_ptr_Input_v3float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %17 = OpTypeFunction %void
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+         %27 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %17
+         %20 = OpLabel
+         %21 = OpLoad %v3float %position
+         %22 = OpCompositeExtract %float %21 0
+         %23 = OpCompositeExtract %float %21 1
+         %24 = OpCompositeExtract %float %21 2
+         %26 = OpCompositeConstruct %v4float %22 %23 %24 %float_1
+               OpStore %gl_Position %26
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %27
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %31 = OpLabel
+         %32 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %32
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %17
+         %34 = OpLabel
+               OpStore %tint_pointsize %float_1
+         %35 = OpLoad %v3float %tint_symbol
+               OpStore %position %35
+         %36 = OpFunctionCall %void %main_1
+         %38 = OpLoad %v4float %gl_Position
+         %39 = OpCompositeConstruct %main_out %38
+         %37 = OpFunctionCall %void %tint_symbol_3 %39
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/0.spvasm.expected.wgsl b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/0.spvasm.expected.wgsl
new file mode 100644
index 0000000..cfebf74
--- /dev/null
+++ b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/0.spvasm.expected.wgsl
@@ -0,0 +1,21 @@
+var<private> position : vec3<f32>;
+
+var<private> gl_Position : vec4<f32>;
+
+fn main_1() {
+  let x_21 : vec3<f32> = position;
+  gl_Position = vec4<f32>(x_21.x, x_21.y, x_21.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] position_param : vec3<f32>) -> main_out {
+  position = position_param;
+  main_1();
+  return main_out(gl_Position);
+}
diff --git a/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/0.wgsl b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/0.wgsl
new file mode 100644
index 0000000..cfebf74
--- /dev/null
+++ b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/0.wgsl
@@ -0,0 +1,21 @@
+var<private> position : vec3<f32>;
+
+var<private> gl_Position : vec4<f32>;
+
+fn main_1() {
+  let x_21 : vec3<f32> = position;
+  gl_Position = vec4<f32>(x_21.x, x_21.y, x_21.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] position_param : vec3<f32>) -> main_out {
+  position = position_param;
+  main_1();
+  return main_out(gl_Position);
+}
diff --git a/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/0.wgsl.expected.hlsl b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/0.wgsl.expected.hlsl
new file mode 100644
index 0000000..5d7eab8
--- /dev/null
+++ b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/0.wgsl.expected.hlsl
@@ -0,0 +1,27 @@
+static float3 position = float3(0.0f, 0.0f, 0.0f);
+static float4 gl_Position = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const float3 x_21 = position;
+  gl_Position = float4(x_21.x, x_21.y, x_21.z, 1.0f);
+  return;
+}
+
+struct main_out {
+  float4 gl_Position;
+};
+struct tint_symbol_1 {
+  float3 position_param : TEXCOORD0;
+};
+struct tint_symbol_2 {
+  float4 gl_Position : SV_Position;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float3 position_param = tint_symbol.position_param;
+  position = position_param;
+  main_1();
+  const main_out tint_symbol_3 = {gl_Position};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.gl_Position};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/0.wgsl.expected.msl b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/0.wgsl.expected.msl
new file mode 100644
index 0000000..87dbf22
--- /dev/null
+++ b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/0.wgsl.expected.msl
@@ -0,0 +1,30 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 gl_Position;
+};
+struct tint_symbol_2 {
+  float3 position_param [[attribute(0)]];
+};
+struct tint_symbol_3 {
+  float4 gl_Position [[position]];
+};
+
+void main_1(thread float3* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  float3 const x_21 = *(tint_symbol_6);
+  *(tint_symbol_7) = float4(x_21.x, x_21.y, x_21.z, 1.0f);
+  return;
+}
+
+vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread float3 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  float3 const position_param = tint_symbol_1.position_param;
+  tint_symbol_8 = position_param;
+  main_1(&(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_4 = {.gl_Position=tint_symbol_9};
+  tint_symbol_3 const tint_symbol_5 = {.gl_Position=tint_symbol_4.gl_Position};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/0.wgsl.expected.spvasm b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/0.wgsl.expected.spvasm
new file mode 100644
index 0000000..3a3cd55
--- /dev/null
+++ b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/0.wgsl.expected.spvasm
@@ -0,0 +1,72 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 40
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %tint_pointsize %tint_symbol %tint_symbol_2
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %position "position"
+               OpName %gl_Position "gl_Position"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "gl_Position"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_2 BuiltIn Position
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+    %v3float = OpTypeVector %float 3
+%_ptr_Private_v3float = OpTypePointer Private %v3float
+          %8 = OpConstantNull %v3float
+   %position = OpVariable %_ptr_Private_v3float Private %8
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+         %12 = OpConstantNull %v4float
+%gl_Position = OpVariable %_ptr_Private_v4float Private %12
+%_ptr_Input_v3float = OpTypePointer Input %v3float
+%tint_symbol = OpVariable %_ptr_Input_v3float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %12
+       %void = OpTypeVoid
+         %17 = OpTypeFunction %void
+    %float_1 = OpConstant %float 1
+   %main_out = OpTypeStruct %v4float
+         %27 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %17
+         %20 = OpLabel
+         %21 = OpLoad %v3float %position
+         %22 = OpCompositeExtract %float %21 0
+         %23 = OpCompositeExtract %float %21 1
+         %24 = OpCompositeExtract %float %21 2
+         %26 = OpCompositeConstruct %v4float %22 %23 %24 %float_1
+               OpStore %gl_Position %26
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %27
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %31 = OpLabel
+         %32 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %32
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %17
+         %34 = OpLabel
+               OpStore %tint_pointsize %float_1
+         %35 = OpLoad %v3float %tint_symbol
+               OpStore %position %35
+         %36 = OpFunctionCall %void %main_1
+         %38 = OpLoad %v4float %gl_Position
+         %39 = OpCompositeConstruct %main_out %38
+         %37 = OpFunctionCall %void %tint_symbol_3 %39
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/0.wgsl.expected.wgsl b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/0.wgsl.expected.wgsl
new file mode 100644
index 0000000..cfebf74
--- /dev/null
+++ b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/0.wgsl.expected.wgsl
@@ -0,0 +1,21 @@
+var<private> position : vec3<f32>;
+
+var<private> gl_Position : vec4<f32>;
+
+fn main_1() {
+  let x_21 : vec3<f32> = position;
+  gl_Position = vec4<f32>(x_21.x, x_21.y, x_21.z, 1.0);
+  return;
+}
+
+struct main_out {
+  [[builtin(position)]]
+  gl_Position : vec4<f32>;
+};
+
+[[stage(vertex)]]
+fn main([[location(0)]] position_param : vec3<f32>) -> main_out {
+  position = position_param;
+  main_1();
+  return main_out(gl_Position);
+}
diff --git a/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/2-opt.spvasm b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/2-opt.spvasm
new file mode 100644
index 0000000..6d8de5f
--- /dev/null
+++ b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/2-opt.spvasm
@@ -0,0 +1,55 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %gl_FragCoord %expect
+               OpExecutionMode %main OriginUpperLeft
+               OpSource GLSL 430
+               OpSourceExtension "GL_KHR_shader_subgroup_ballot"
+               OpSourceExtension "GL_KHR_shader_subgroup_basic"
+               OpSourceExtension "GL_KHR_shader_subgroup_vote"
+               OpName %main "main"
+               OpName %inbounds "inbounds"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %expect "expect"
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+               OpDecorate %expect Location 0
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+  %float_128 = OpConstant %float 128
+     %uint_1 = OpConstant %uint 1
+        %int = OpTypeInt 32 1
+%_ptr_Output_int = OpTypePointer Output %int
+     %expect = OpVariable %_ptr_Output_int Output
+      %int_1 = OpConstant %int 1
+     %int_n1 = OpConstant %int -1
+       %main = OpFunction %void None %7
+         %22 = OpLabel
+   %inbounds = OpVariable %_ptr_Function_bool Function
+         %23 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %24 = OpLoad %float %23
+         %25 = OpFOrdLessThan %bool %24 %float_128
+         %26 = OpLogicalNot %bool %25
+               OpSelectionMerge %27 None
+               OpBranchConditional %26 %28 %27
+         %28 = OpLabel
+         %29 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %30 = OpLoad %float %29
+         %31 = OpFOrdLessThan %bool %30 %float_128
+               OpBranch %27
+         %27 = OpLabel
+         %32 = OpPhi %bool %25 %22 %31 %28
+               OpStore %inbounds %32
+         %33 = OpLoad %bool %inbounds
+         %34 = OpSelect %int %33 %int_1 %int_n1
+               OpStore %expect %34
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/2-opt.spvasm.expected.hlsl b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/2-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..72a9fa8
--- /dev/null
+++ b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/2-opt.spvasm.expected.hlsl
@@ -0,0 +1,38 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static int expect = 0;
+
+void main_1() {
+  bool inbounds = false;
+  bool x_31 = false;
+  bool x_32_phi = false;
+  const float x_24 = gl_FragCoord.x;
+  const bool x_25 = (x_24 < 128.0f);
+  x_32_phi = x_25;
+  if (!(x_25)) {
+    const float x_30 = gl_FragCoord.y;
+    x_31 = (x_30 < 128.0f);
+    x_32_phi = x_31;
+  }
+  inbounds = x_32_phi;
+  expect = (inbounds ? 1 : -1);
+  return;
+}
+
+struct main_out {
+  int expect_1;
+};
+struct tint_symbol_1 {
+  float4 gl_FragCoord_param : SV_Position;
+};
+struct tint_symbol_2 {
+  int expect_1 : SV_Target0;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {expect};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.expect_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/2-opt.spvasm.expected.msl b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/2-opt.spvasm.expected.msl
new file mode 100644
index 0000000..f604d95
--- /dev/null
+++ b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/2-opt.spvasm.expected.msl
@@ -0,0 +1,39 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  int expect_1;
+};
+struct tint_symbol_2 {
+  int expect_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_5, thread int* const tint_symbol_6) {
+  bool inbounds = false;
+  bool x_31 = false;
+  bool x_32_phi = false;
+  float const x_24 = (*(tint_symbol_5)).x;
+  bool const x_25 = (x_24 < 128.0f);
+  x_32_phi = x_25;
+  if (!(x_25)) {
+    float const x_30 = (*(tint_symbol_5)).y;
+    x_31 = (x_30 < 128.0f);
+    x_32_phi = x_31;
+  }
+  bool const x_32 = x_32_phi;
+  inbounds = x_32;
+  bool const x_33 = inbounds;
+  *(tint_symbol_6) = select(-1, 1, x_33);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread int tint_symbol_8 = 0;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(&(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.expect_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.expect_1=tint_symbol_3.expect_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/2-opt.spvasm.expected.spvasm b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/2-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..08bdcac
--- /dev/null
+++ b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/2-opt.spvasm.expected.spvasm
@@ -0,0 +1,97 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 57
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %expect "expect"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %inbounds "inbounds"
+               OpName %x_31 "x_31"
+               OpName %x_32_phi "x_32_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "expect_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+          %9 = OpConstantNull %int
+     %expect = OpVariable %_ptr_Private_int Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_int = OpTypePointer Output %int
+%tint_symbol_2 = OpVariable %_ptr_Output_int Output %9
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %21 = OpConstantNull %bool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+  %float_128 = OpConstant %float 128
+     %uint_1 = OpConstant %uint 1
+      %int_1 = OpConstant %int 1
+     %int_n1 = OpConstant %int -1
+   %main_out = OpTypeStruct %int
+         %44 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+   %inbounds = OpVariable %_ptr_Function_bool Function %21
+       %x_31 = OpVariable %_ptr_Function_bool Function %21
+   %x_32_phi = OpVariable %_ptr_Function_bool Function %21
+         %27 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %28 = OpLoad %float %27
+         %30 = OpFOrdLessThan %bool %28 %float_128
+               OpStore %x_32_phi %30
+         %31 = OpLogicalNot %bool %30
+               OpSelectionMerge %32 None
+               OpBranchConditional %31 %33 %32
+         %33 = OpLabel
+         %35 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %36 = OpLoad %float %35
+         %37 = OpFOrdLessThan %bool %36 %float_128
+               OpStore %x_31 %37
+         %38 = OpLoad %bool %x_31
+               OpStore %x_32_phi %38
+               OpBranch %32
+         %32 = OpLabel
+         %39 = OpLoad %bool %x_32_phi
+               OpStore %inbounds %39
+         %40 = OpLoad %bool %inbounds
+         %41 = OpSelect %int %40 %int_1 %int_n1
+               OpStore %expect %41
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %44
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %48 = OpLabel
+         %49 = OpCompositeExtract %int %tint_symbol_1 0
+               OpStore %tint_symbol_2 %49
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %51 = OpLabel
+         %52 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %52
+         %53 = OpFunctionCall %void %main_1
+         %55 = OpLoad %int %expect
+         %56 = OpCompositeConstruct %main_out %55
+         %54 = OpFunctionCall %void %tint_symbol_3 %56
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/2-opt.spvasm.expected.wgsl b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/2-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..a3e9f61
--- /dev/null
+++ b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/2-opt.spvasm.expected.wgsl
@@ -0,0 +1,34 @@
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> expect : i32;
+
+fn main_1() {
+  var inbounds : bool;
+  var x_31 : bool;
+  var x_32_phi : bool;
+  let x_24 : f32 = gl_FragCoord.x;
+  let x_25 : bool = (x_24 < 128.0);
+  x_32_phi = x_25;
+  if (!(x_25)) {
+    let x_30 : f32 = gl_FragCoord.y;
+    x_31 = (x_30 < 128.0);
+    x_32_phi = x_31;
+  }
+  let x_32 : bool = x_32_phi;
+  inbounds = x_32;
+  let x_33 : bool = inbounds;
+  expect = select(-1, 1, x_33);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  expect_1 : i32;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(expect);
+}
diff --git a/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/2-opt.wgsl b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/2-opt.wgsl
new file mode 100644
index 0000000..a3e9f61
--- /dev/null
+++ b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/2-opt.wgsl
@@ -0,0 +1,34 @@
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> expect : i32;
+
+fn main_1() {
+  var inbounds : bool;
+  var x_31 : bool;
+  var x_32_phi : bool;
+  let x_24 : f32 = gl_FragCoord.x;
+  let x_25 : bool = (x_24 < 128.0);
+  x_32_phi = x_25;
+  if (!(x_25)) {
+    let x_30 : f32 = gl_FragCoord.y;
+    x_31 = (x_30 < 128.0);
+    x_32_phi = x_31;
+  }
+  let x_32 : bool = x_32_phi;
+  inbounds = x_32;
+  let x_33 : bool = inbounds;
+  expect = select(-1, 1, x_33);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  expect_1 : i32;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(expect);
+}
diff --git a/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/2-opt.wgsl.expected.hlsl b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/2-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..72a9fa8
--- /dev/null
+++ b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/2-opt.wgsl.expected.hlsl
@@ -0,0 +1,38 @@
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static int expect = 0;
+
+void main_1() {
+  bool inbounds = false;
+  bool x_31 = false;
+  bool x_32_phi = false;
+  const float x_24 = gl_FragCoord.x;
+  const bool x_25 = (x_24 < 128.0f);
+  x_32_phi = x_25;
+  if (!(x_25)) {
+    const float x_30 = gl_FragCoord.y;
+    x_31 = (x_30 < 128.0f);
+    x_32_phi = x_31;
+  }
+  inbounds = x_32_phi;
+  expect = (inbounds ? 1 : -1);
+  return;
+}
+
+struct main_out {
+  int expect_1;
+};
+struct tint_symbol_1 {
+  float4 gl_FragCoord_param : SV_Position;
+};
+struct tint_symbol_2 {
+  int expect_1 : SV_Target0;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {expect};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.expect_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/2-opt.wgsl.expected.msl b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/2-opt.wgsl.expected.msl
new file mode 100644
index 0000000..f604d95
--- /dev/null
+++ b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/2-opt.wgsl.expected.msl
@@ -0,0 +1,39 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  int expect_1;
+};
+struct tint_symbol_2 {
+  int expect_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_5, thread int* const tint_symbol_6) {
+  bool inbounds = false;
+  bool x_31 = false;
+  bool x_32_phi = false;
+  float const x_24 = (*(tint_symbol_5)).x;
+  bool const x_25 = (x_24 < 128.0f);
+  x_32_phi = x_25;
+  if (!(x_25)) {
+    float const x_30 = (*(tint_symbol_5)).y;
+    x_31 = (x_30 < 128.0f);
+    x_32_phi = x_31;
+  }
+  bool const x_32 = x_32_phi;
+  inbounds = x_32;
+  bool const x_33 = inbounds;
+  *(tint_symbol_6) = select(-1, 1, x_33);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread int tint_symbol_8 = 0;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(&(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.expect_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.expect_1=tint_symbol_3.expect_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/2-opt.wgsl.expected.spvasm b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/2-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..08bdcac
--- /dev/null
+++ b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/2-opt.wgsl.expected.spvasm
@@ -0,0 +1,97 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 57
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %expect "expect"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %inbounds "inbounds"
+               OpName %x_31 "x_31"
+               OpName %x_32_phi "x_32_phi"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "expect_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+        %int = OpTypeInt 32 1
+%_ptr_Private_int = OpTypePointer Private %int
+          %9 = OpConstantNull %int
+     %expect = OpVariable %_ptr_Private_int Private %9
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_int = OpTypePointer Output %int
+%tint_symbol_2 = OpVariable %_ptr_Output_int Output %9
+       %void = OpTypeVoid
+         %14 = OpTypeFunction %void
+       %bool = OpTypeBool
+%_ptr_Function_bool = OpTypePointer Function %bool
+         %21 = OpConstantNull %bool
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+  %float_128 = OpConstant %float 128
+     %uint_1 = OpConstant %uint 1
+      %int_1 = OpConstant %int 1
+     %int_n1 = OpConstant %int -1
+   %main_out = OpTypeStruct %int
+         %44 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %14
+         %17 = OpLabel
+   %inbounds = OpVariable %_ptr_Function_bool Function %21
+       %x_31 = OpVariable %_ptr_Function_bool Function %21
+   %x_32_phi = OpVariable %_ptr_Function_bool Function %21
+         %27 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %28 = OpLoad %float %27
+         %30 = OpFOrdLessThan %bool %28 %float_128
+               OpStore %x_32_phi %30
+         %31 = OpLogicalNot %bool %30
+               OpSelectionMerge %32 None
+               OpBranchConditional %31 %33 %32
+         %33 = OpLabel
+         %35 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %36 = OpLoad %float %35
+         %37 = OpFOrdLessThan %bool %36 %float_128
+               OpStore %x_31 %37
+         %38 = OpLoad %bool %x_31
+               OpStore %x_32_phi %38
+               OpBranch %32
+         %32 = OpLabel
+         %39 = OpLoad %bool %x_32_phi
+               OpStore %inbounds %39
+         %40 = OpLoad %bool %inbounds
+         %41 = OpSelect %int %40 %int_1 %int_n1
+               OpStore %expect %41
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %44
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %48 = OpLabel
+         %49 = OpCompositeExtract %int %tint_symbol_1 0
+               OpStore %tint_symbol_2 %49
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %14
+         %51 = OpLabel
+         %52 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %52
+         %53 = OpFunctionCall %void %main_1
+         %55 = OpLoad %int %expect
+         %56 = OpCompositeConstruct %main_out %55
+         %54 = OpFunctionCall %void %tint_symbol_3 %56
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/2-opt.wgsl.expected.wgsl b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/2-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..a3e9f61
--- /dev/null
+++ b/test/vk-gl-cts/subgroup_uniform_control_flow/discard/subgroup_reconverge_discard00/2-opt.wgsl.expected.wgsl
@@ -0,0 +1,34 @@
+var<private> gl_FragCoord : vec4<f32>;
+
+var<private> expect : i32;
+
+fn main_1() {
+  var inbounds : bool;
+  var x_31 : bool;
+  var x_32_phi : bool;
+  let x_24 : f32 = gl_FragCoord.x;
+  let x_25 : bool = (x_24 < 128.0);
+  x_32_phi = x_25;
+  if (!(x_25)) {
+    let x_30 : f32 = gl_FragCoord.y;
+    x_31 = (x_30 < 128.0);
+    x_32_phi = x_31;
+  }
+  let x_32 : bool = x_32_phi;
+  inbounds = x_32;
+  let x_33 : bool = inbounds;
+  expect = select(-1, 1, x_33);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  expect_1 : i32;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(expect);
+}
diff --git a/test/vk-gl-cts/texture/subgroup_lod/texel_fetch/1.spvasm b/test/vk-gl-cts/texture/subgroup_lod/texel_fetch/1.spvasm
new file mode 100644
index 0000000..a9ff549
--- /dev/null
+++ b/test/vk-gl-cts/texture/subgroup_lod/texel_fetch/1.spvasm
@@ -0,0 +1,25 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %color_out %color_in
+               OpExecutionMode %main OriginUpperLeft
+               OpSource GLSL 430
+               OpName %main "main"
+               OpName %color_out "color_out"
+               OpName %color_in "color_in"
+               OpDecorate %color_out Location 0
+               OpDecorate %color_in Location 0
+       %void = OpTypeVoid
+          %6 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+  %color_out = OpVariable %_ptr_Output_v4float Output
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+   %color_in = OpVariable %_ptr_Input_v4float Input
+       %main = OpFunction %void None %6
+         %11 = OpLabel
+         %12 = OpLoad %v4float %color_in
+               OpStore %color_out %12
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/texture/subgroup_lod/texel_fetch/1.spvasm.expected.hlsl b/test/vk-gl-cts/texture/subgroup_lod/texel_fetch/1.spvasm.expected.hlsl
new file mode 100644
index 0000000..c1e727e
--- /dev/null
+++ b/test/vk-gl-cts/texture/subgroup_lod/texel_fetch/1.spvasm.expected.hlsl
@@ -0,0 +1,26 @@
+static float4 color_out = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 color_in = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  color_out = color_in;
+  return;
+}
+
+struct main_out {
+  float4 color_out_1;
+};
+struct tint_symbol_1 {
+  float4 color_in_param : TEXCOORD0;
+};
+struct tint_symbol_2 {
+  float4 color_out_1 : SV_Target0;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 color_in_param = tint_symbol.color_in_param;
+  color_in = color_in_param;
+  main_1();
+  const main_out tint_symbol_3 = {color_out};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.color_out_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/texture/subgroup_lod/texel_fetch/1.spvasm.expected.msl b/test/vk-gl-cts/texture/subgroup_lod/texel_fetch/1.spvasm.expected.msl
new file mode 100644
index 0000000..dad0955
--- /dev/null
+++ b/test/vk-gl-cts/texture/subgroup_lod/texel_fetch/1.spvasm.expected.msl
@@ -0,0 +1,30 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 color_out_1;
+};
+struct tint_symbol_2 {
+  float4 color_in_param [[user(locn0)]];
+};
+struct tint_symbol_3 {
+  float4 color_out_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  float4 const x_12 = *(tint_symbol_6);
+  *(tint_symbol_7) = x_12;
+  return;
+}
+
+fragment tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  float4 const color_in_param = tint_symbol_1.color_in_param;
+  tint_symbol_8 = color_in_param;
+  main_1(&(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_4 = {.color_out_1=tint_symbol_9};
+  tint_symbol_3 const tint_symbol_5 = {.color_out_1=tint_symbol_4.color_out_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/texture/subgroup_lod/texel_fetch/1.spvasm.expected.spvasm b/test/vk-gl-cts/texture/subgroup_lod/texel_fetch/1.spvasm.expected.spvasm
new file mode 100644
index 0000000..2050b3e
--- /dev/null
+++ b/test/vk-gl-cts/texture/subgroup_lod/texel_fetch/1.spvasm.expected.spvasm
@@ -0,0 +1,59 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 29
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %color_out "color_out"
+               OpName %color_in "color_in"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "color_out_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+  %color_out = OpVariable %_ptr_Private_v4float Private %5
+   %color_in = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+   %main_out = OpTypeStruct %v4float
+         %16 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+         %15 = OpLoad %v4float %color_in
+               OpStore %color_out %15
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %16
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %20 = OpLabel
+         %21 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %21
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %23 = OpLabel
+         %24 = OpLoad %v4float %tint_symbol
+               OpStore %color_in %24
+         %25 = OpFunctionCall %void %main_1
+         %27 = OpLoad %v4float %color_out
+         %28 = OpCompositeConstruct %main_out %27
+         %26 = OpFunctionCall %void %tint_symbol_3 %28
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/texture/subgroup_lod/texel_fetch/1.spvasm.expected.wgsl b/test/vk-gl-cts/texture/subgroup_lod/texel_fetch/1.spvasm.expected.wgsl
new file mode 100644
index 0000000..cd7d76c
--- /dev/null
+++ b/test/vk-gl-cts/texture/subgroup_lod/texel_fetch/1.spvasm.expected.wgsl
@@ -0,0 +1,21 @@
+var<private> color_out : vec4<f32>;
+
+var<private> color_in : vec4<f32>;
+
+fn main_1() {
+  let x_12 : vec4<f32> = color_in;
+  color_out = x_12;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  color_out_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[location(0)]] color_in_param : vec4<f32>) -> main_out {
+  color_in = color_in_param;
+  main_1();
+  return main_out(color_out);
+}
diff --git a/test/vk-gl-cts/texture/subgroup_lod/texel_fetch/1.wgsl b/test/vk-gl-cts/texture/subgroup_lod/texel_fetch/1.wgsl
new file mode 100644
index 0000000..cd7d76c
--- /dev/null
+++ b/test/vk-gl-cts/texture/subgroup_lod/texel_fetch/1.wgsl
@@ -0,0 +1,21 @@
+var<private> color_out : vec4<f32>;
+
+var<private> color_in : vec4<f32>;
+
+fn main_1() {
+  let x_12 : vec4<f32> = color_in;
+  color_out = x_12;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  color_out_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[location(0)]] color_in_param : vec4<f32>) -> main_out {
+  color_in = color_in_param;
+  main_1();
+  return main_out(color_out);
+}
diff --git a/test/vk-gl-cts/texture/subgroup_lod/texel_fetch/1.wgsl.expected.hlsl b/test/vk-gl-cts/texture/subgroup_lod/texel_fetch/1.wgsl.expected.hlsl
new file mode 100644
index 0000000..c1e727e
--- /dev/null
+++ b/test/vk-gl-cts/texture/subgroup_lod/texel_fetch/1.wgsl.expected.hlsl
@@ -0,0 +1,26 @@
+static float4 color_out = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 color_in = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  color_out = color_in;
+  return;
+}
+
+struct main_out {
+  float4 color_out_1;
+};
+struct tint_symbol_1 {
+  float4 color_in_param : TEXCOORD0;
+};
+struct tint_symbol_2 {
+  float4 color_out_1 : SV_Target0;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 color_in_param = tint_symbol.color_in_param;
+  color_in = color_in_param;
+  main_1();
+  const main_out tint_symbol_3 = {color_out};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.color_out_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/texture/subgroup_lod/texel_fetch/1.wgsl.expected.msl b/test/vk-gl-cts/texture/subgroup_lod/texel_fetch/1.wgsl.expected.msl
new file mode 100644
index 0000000..dad0955
--- /dev/null
+++ b/test/vk-gl-cts/texture/subgroup_lod/texel_fetch/1.wgsl.expected.msl
@@ -0,0 +1,30 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 color_out_1;
+};
+struct tint_symbol_2 {
+  float4 color_in_param [[user(locn0)]];
+};
+struct tint_symbol_3 {
+  float4 color_out_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
+  float4 const x_12 = *(tint_symbol_6);
+  *(tint_symbol_7) = x_12;
+  return;
+}
+
+fragment tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
+  thread float4 tint_symbol_8 = 0.0f;
+  thread float4 tint_symbol_9 = 0.0f;
+  float4 const color_in_param = tint_symbol_1.color_in_param;
+  tint_symbol_8 = color_in_param;
+  main_1(&(tint_symbol_8), &(tint_symbol_9));
+  main_out const tint_symbol_4 = {.color_out_1=tint_symbol_9};
+  tint_symbol_3 const tint_symbol_5 = {.color_out_1=tint_symbol_4.color_out_1};
+  return tint_symbol_5;
+}
+
diff --git a/test/vk-gl-cts/texture/subgroup_lod/texel_fetch/1.wgsl.expected.spvasm b/test/vk-gl-cts/texture/subgroup_lod/texel_fetch/1.wgsl.expected.spvasm
new file mode 100644
index 0000000..2050b3e
--- /dev/null
+++ b/test/vk-gl-cts/texture/subgroup_lod/texel_fetch/1.wgsl.expected.spvasm
@@ -0,0 +1,59 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 29
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %color_out "color_out"
+               OpName %color_in "color_in"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "color_out_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol Location 0
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+  %color_out = OpVariable %_ptr_Private_v4float Private %5
+   %color_in = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+   %main_out = OpTypeStruct %v4float
+         %16 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+         %15 = OpLoad %v4float %color_in
+               OpStore %color_out %15
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %16
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %20 = OpLabel
+         %21 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %21
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %23 = OpLabel
+         %24 = OpLoad %v4float %tint_symbol
+               OpStore %color_in %24
+         %25 = OpFunctionCall %void %main_1
+         %27 = OpLoad %v4float %color_out
+         %28 = OpCompositeConstruct %main_out %27
+         %26 = OpFunctionCall %void %tint_symbol_3 %28
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/texture/subgroup_lod/texel_fetch/1.wgsl.expected.wgsl b/test/vk-gl-cts/texture/subgroup_lod/texel_fetch/1.wgsl.expected.wgsl
new file mode 100644
index 0000000..cd7d76c
--- /dev/null
+++ b/test/vk-gl-cts/texture/subgroup_lod/texel_fetch/1.wgsl.expected.wgsl
@@ -0,0 +1,21 @@
+var<private> color_out : vec4<f32>;
+
+var<private> color_in : vec4<f32>;
+
+fn main_1() {
+  let x_12 : vec4<f32> = color_in;
+  color_out = x_12;
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  color_out_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[location(0)]] color_in_param : vec4<f32>) -> main_out {
+  color_in = color_in_param;
+  main_1();
+  return main_out(color_out);
+}
diff --git a/test/vk-gl-cts/texture/texel_offset/texel_offset/0-opt.spvasm b/test/vk-gl-cts/texture/texel_offset/texel_offset/0-opt.spvasm
new file mode 100644
index 0000000..baa40ee
--- /dev/null
+++ b/test/vk-gl-cts/texture/texel_offset/texel_offset/0-opt.spvasm
@@ -0,0 +1,39 @@
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %result %gl_FragCoord
+               OpExecutionMode %main OriginUpperLeft
+               OpSource GLSL 430
+               OpName %main "main"
+               OpName %result "result"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpDecorate %result Location 0
+               OpDecorate %gl_FragCoord BuiltIn FragCoord
+       %void = OpTypeVoid
+          %6 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+     %result = OpVariable %_ptr_Output_v4float Output
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Input_float = OpTypePointer Input %float
+  %float_255 = OpConstant %float 255
+     %uint_1 = OpConstant %uint 1
+    %float_0 = OpConstant %float 0
+       %main = OpFunction %void None %6
+         %17 = OpLabel
+         %18 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
+         %19 = OpLoad %float %18
+         %20 = OpExtInst %float %1 Floor %19
+         %21 = OpFDiv %float %20 %float_255
+         %22 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
+         %23 = OpLoad %float %22
+         %24 = OpExtInst %float %1 Floor %23
+         %25 = OpFDiv %float %24 %float_255
+         %26 = OpCompositeConstruct %v4float %21 %25 %float_0 %float_0
+               OpStore %result %26
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/texture/texel_offset/texel_offset/0-opt.spvasm.expected.hlsl b/test/vk-gl-cts/texture/texel_offset/texel_offset/0-opt.spvasm.expected.hlsl
new file mode 100644
index 0000000..6b9138b
--- /dev/null
+++ b/test/vk-gl-cts/texture/texel_offset/texel_offset/0-opt.spvasm.expected.hlsl
@@ -0,0 +1,28 @@
+static float4 result = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const float x_19 = gl_FragCoord.x;
+  const float x_23 = gl_FragCoord.y;
+  result = float4((floor(x_19) / 255.0f), (floor(x_23) / 255.0f), 0.0f, 0.0f);
+  return;
+}
+
+struct main_out {
+  float4 result_1;
+};
+struct tint_symbol_1 {
+  float4 gl_FragCoord_param : SV_Position;
+};
+struct tint_symbol_2 {
+  float4 result_1 : SV_Target0;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {result};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.result_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/texture/texel_offset/texel_offset/0-opt.spvasm.expected.msl b/test/vk-gl-cts/texture/texel_offset/texel_offset/0-opt.spvasm.expected.msl
new file mode 100644
index 0000000..6f93315
--- /dev/null
+++ b/test/vk-gl-cts/texture/texel_offset/texel_offset/0-opt.spvasm.expected.msl
@@ -0,0 +1,27 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 result_1;
+};
+struct tint_symbol_2 {
+  float4 result_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float const x_19 = (*(tint_symbol_5)).x;
+  float const x_23 = (*(tint_symbol_5)).y;
+  *(tint_symbol_6) = float4((floor(x_19) / 255.0f), (floor(x_23) / 255.0f), 0.0f, 0.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(&(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.result_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.result_1=tint_symbol_3.result_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/texture/texel_offset/texel_offset/0-opt.spvasm.expected.spvasm b/test/vk-gl-cts/texture/texel_offset/texel_offset/0-opt.spvasm.expected.spvasm
new file mode 100644
index 0000000..9f52743
--- /dev/null
+++ b/test/vk-gl-cts/texture/texel_offset/texel_offset/0-opt.spvasm.expected.spvasm
@@ -0,0 +1,74 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 44
+; Schema: 0
+               OpCapability Shader
+         %24 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %result "result"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "result_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+     %result = OpVariable %_ptr_Private_v4float Private %5
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+     %uint_1 = OpConstant %uint 1
+  %float_255 = OpConstant %float 255
+    %float_0 = OpConstant %float 0
+   %main_out = OpTypeStruct %v4float
+         %31 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+         %18 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %19 = OpLoad %float %18
+         %21 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %22 = OpLoad %float %21
+         %23 = OpExtInst %float %24 Floor %19
+         %26 = OpFDiv %float %23 %float_255
+         %27 = OpExtInst %float %24 Floor %22
+         %28 = OpFDiv %float %27 %float_255
+         %30 = OpCompositeConstruct %v4float %26 %28 %float_0 %float_0
+               OpStore %result %30
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %31
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %35 = OpLabel
+         %36 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %36
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %38 = OpLabel
+         %39 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %39
+         %40 = OpFunctionCall %void %main_1
+         %42 = OpLoad %v4float %result
+         %43 = OpCompositeConstruct %main_out %42
+         %41 = OpFunctionCall %void %tint_symbol_3 %43
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/texture/texel_offset/texel_offset/0-opt.spvasm.expected.wgsl b/test/vk-gl-cts/texture/texel_offset/texel_offset/0-opt.spvasm.expected.wgsl
new file mode 100644
index 0000000..2130c1a
--- /dev/null
+++ b/test/vk-gl-cts/texture/texel_offset/texel_offset/0-opt.spvasm.expected.wgsl
@@ -0,0 +1,22 @@
+var<private> result : vec4<f32>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  let x_19 : f32 = gl_FragCoord.x;
+  let x_23 : f32 = gl_FragCoord.y;
+  result = vec4<f32>((floor(x_19) / 255.0), (floor(x_23) / 255.0), 0.0, 0.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  result_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(result);
+}
diff --git a/test/vk-gl-cts/texture/texel_offset/texel_offset/0-opt.wgsl b/test/vk-gl-cts/texture/texel_offset/texel_offset/0-opt.wgsl
new file mode 100644
index 0000000..2130c1a
--- /dev/null
+++ b/test/vk-gl-cts/texture/texel_offset/texel_offset/0-opt.wgsl
@@ -0,0 +1,22 @@
+var<private> result : vec4<f32>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  let x_19 : f32 = gl_FragCoord.x;
+  let x_23 : f32 = gl_FragCoord.y;
+  result = vec4<f32>((floor(x_19) / 255.0), (floor(x_23) / 255.0), 0.0, 0.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  result_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(result);
+}
diff --git a/test/vk-gl-cts/texture/texel_offset/texel_offset/0-opt.wgsl.expected.hlsl b/test/vk-gl-cts/texture/texel_offset/texel_offset/0-opt.wgsl.expected.hlsl
new file mode 100644
index 0000000..6b9138b
--- /dev/null
+++ b/test/vk-gl-cts/texture/texel_offset/texel_offset/0-opt.wgsl.expected.hlsl
@@ -0,0 +1,28 @@
+static float4 result = float4(0.0f, 0.0f, 0.0f, 0.0f);
+static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+void main_1() {
+  const float x_19 = gl_FragCoord.x;
+  const float x_23 = gl_FragCoord.y;
+  result = float4((floor(x_19) / 255.0f), (floor(x_23) / 255.0f), 0.0f, 0.0f);
+  return;
+}
+
+struct main_out {
+  float4 result_1;
+};
+struct tint_symbol_1 {
+  float4 gl_FragCoord_param : SV_Position;
+};
+struct tint_symbol_2 {
+  float4 result_1 : SV_Target0;
+};
+
+tint_symbol_2 main(tint_symbol_1 tint_symbol) {
+  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  const main_out tint_symbol_3 = {result};
+  const tint_symbol_2 tint_symbol_4 = {tint_symbol_3.result_1};
+  return tint_symbol_4;
+}
diff --git a/test/vk-gl-cts/texture/texel_offset/texel_offset/0-opt.wgsl.expected.msl b/test/vk-gl-cts/texture/texel_offset/texel_offset/0-opt.wgsl.expected.msl
new file mode 100644
index 0000000..6f93315
--- /dev/null
+++ b/test/vk-gl-cts/texture/texel_offset/texel_offset/0-opt.wgsl.expected.msl
@@ -0,0 +1,27 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct main_out {
+  float4 result_1;
+};
+struct tint_symbol_2 {
+  float4 result_1 [[color(0)]];
+};
+
+void main_1(thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
+  float const x_19 = (*(tint_symbol_5)).x;
+  float const x_23 = (*(tint_symbol_5)).y;
+  *(tint_symbol_6) = float4((floor(x_19) / 255.0f), (floor(x_23) / 255.0f), 0.0f, 0.0f);
+  return;
+}
+
+fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]]) {
+  thread float4 tint_symbol_7 = 0.0f;
+  thread float4 tint_symbol_8 = 0.0f;
+  tint_symbol_7 = gl_FragCoord_param;
+  main_1(&(tint_symbol_7), &(tint_symbol_8));
+  main_out const tint_symbol_3 = {.result_1=tint_symbol_8};
+  tint_symbol_2 const tint_symbol_4 = {.result_1=tint_symbol_3.result_1};
+  return tint_symbol_4;
+}
+
diff --git a/test/vk-gl-cts/texture/texel_offset/texel_offset/0-opt.wgsl.expected.spvasm b/test/vk-gl-cts/texture/texel_offset/texel_offset/0-opt.wgsl.expected.spvasm
new file mode 100644
index 0000000..9f52743
--- /dev/null
+++ b/test/vk-gl-cts/texture/texel_offset/texel_offset/0-opt.wgsl.expected.spvasm
@@ -0,0 +1,74 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 44
+; Schema: 0
+               OpCapability Shader
+         %24 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Fragment %main "main" %tint_symbol %tint_symbol_2
+               OpExecutionMode %main OriginUpperLeft
+               OpName %result "result"
+               OpName %gl_FragCoord "gl_FragCoord"
+               OpName %tint_symbol "tint_symbol"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %main_1 "main_1"
+               OpName %main_out "main_out"
+               OpMemberName %main_out 0 "result_1"
+               OpName %tint_symbol_3 "tint_symbol_3"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %main "main"
+               OpDecorate %tint_symbol BuiltIn FragCoord
+               OpDecorate %tint_symbol_2 Location 0
+               OpMemberDecorate %main_out 0 Offset 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%_ptr_Private_v4float = OpTypePointer Private %v4float
+          %5 = OpConstantNull %v4float
+     %result = OpVariable %_ptr_Private_v4float Private %5
+%gl_FragCoord = OpVariable %_ptr_Private_v4float Private %5
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%tint_symbol = OpVariable %_ptr_Input_v4float Input
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%tint_symbol_2 = OpVariable %_ptr_Output_v4float Output %5
+       %void = OpTypeVoid
+         %11 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_float = OpTypePointer Private %float
+     %uint_1 = OpConstant %uint 1
+  %float_255 = OpConstant %float 255
+    %float_0 = OpConstant %float 0
+   %main_out = OpTypeStruct %v4float
+         %31 = OpTypeFunction %void %main_out
+     %main_1 = OpFunction %void None %11
+         %14 = OpLabel
+         %18 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_0
+         %19 = OpLoad %float %18
+         %21 = OpAccessChain %_ptr_Private_float %gl_FragCoord %uint_1
+         %22 = OpLoad %float %21
+         %23 = OpExtInst %float %24 Floor %19
+         %26 = OpFDiv %float %23 %float_255
+         %27 = OpExtInst %float %24 Floor %22
+         %28 = OpFDiv %float %27 %float_255
+         %30 = OpCompositeConstruct %v4float %26 %28 %float_0 %float_0
+               OpStore %result %30
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_3 = OpFunction %void None %31
+%tint_symbol_1 = OpFunctionParameter %main_out
+         %35 = OpLabel
+         %36 = OpCompositeExtract %v4float %tint_symbol_1 0
+               OpStore %tint_symbol_2 %36
+               OpReturn
+               OpFunctionEnd
+       %main = OpFunction %void None %11
+         %38 = OpLabel
+         %39 = OpLoad %v4float %tint_symbol
+               OpStore %gl_FragCoord %39
+         %40 = OpFunctionCall %void %main_1
+         %42 = OpLoad %v4float %result
+         %43 = OpCompositeConstruct %main_out %42
+         %41 = OpFunctionCall %void %tint_symbol_3 %43
+               OpReturn
+               OpFunctionEnd
diff --git a/test/vk-gl-cts/texture/texel_offset/texel_offset/0-opt.wgsl.expected.wgsl b/test/vk-gl-cts/texture/texel_offset/texel_offset/0-opt.wgsl.expected.wgsl
new file mode 100644
index 0000000..2130c1a
--- /dev/null
+++ b/test/vk-gl-cts/texture/texel_offset/texel_offset/0-opt.wgsl.expected.wgsl
@@ -0,0 +1,22 @@
+var<private> result : vec4<f32>;
+
+var<private> gl_FragCoord : vec4<f32>;
+
+fn main_1() {
+  let x_19 : f32 = gl_FragCoord.x;
+  let x_23 : f32 = gl_FragCoord.y;
+  result = vec4<f32>((floor(x_19) / 255.0), (floor(x_23) / 255.0), 0.0, 0.0);
+  return;
+}
+
+struct main_out {
+  [[location(0)]]
+  result_1 : vec4<f32>;
+};
+
+[[stage(fragment)]]
+fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
+  gl_FragCoord = gl_FragCoord_param;
+  main_1();
+  return main_out(result);
+}